Repository: sero-cash/go-sero Branch: master Commit: 59892fdab790 Files: 2342 Total size: 49.1 MB Directory structure: gitextract_id4_y5p3/ ├── .gitignore ├── AUTHORS ├── AUTHORS.SERO ├── COPYING ├── COPYING.LESSER ├── Dockerfile ├── LICENSE.SERO ├── LICENSE.SERO.LESSER ├── Makefile ├── README.md ├── accounts/ │ ├── abi/ │ │ ├── abi.go │ │ ├── abi_test.go │ │ ├── argument.go │ │ ├── bind/ │ │ │ ├── auth.go │ │ │ ├── backend.go │ │ │ ├── base.go │ │ │ ├── bind.go │ │ │ ├── template.go │ │ │ ├── topics.go │ │ │ └── util.go │ │ ├── doc.go │ │ ├── error.go │ │ ├── event.go │ │ ├── method.go │ │ ├── numbers.go │ │ ├── pack.go │ │ ├── reflect.go │ │ ├── type.go │ │ └── unpack.go │ ├── accounts.go │ ├── errors.go │ ├── hd.go │ ├── keystore/ │ │ ├── account_cache.go │ │ ├── account_cache_test.go │ │ ├── file_cache.go │ │ ├── key.go │ │ ├── keystore.go │ │ ├── keystore_passphrase.go │ │ ├── keystore_passphrase_test.go │ │ ├── keystore_test.go │ │ ├── keystore_wallet.go │ │ ├── presale.go │ │ ├── testdata/ │ │ │ ├── dupes/ │ │ │ │ ├── 1 │ │ │ │ ├── 2 │ │ │ │ └── foo │ │ │ ├── keystore/ │ │ │ │ ├── .hiddenfile │ │ │ │ ├── README │ │ │ │ ├── UTC--2018-08-11T10-19-38.165083119Z--64t1MPxFp4yzxNJ64zp1NmrTXWsrLuw9DMiMZeujbD2HVAKhjR3zpKnuFVjjAXAp86G2PzSVSsdiMdwp5JPoqxtP │ │ │ │ ├── aaa │ │ │ │ ├── empty │ │ │ │ ├── foo/ │ │ │ │ │ └── fd9bd350f08ee3c0c19b85a8e16114a11a60aa4e │ │ │ │ ├── garbage │ │ │ │ ├── no-address │ │ │ │ ├── zero │ │ │ │ └── zzz │ │ │ ├── v1/ │ │ │ │ └── cb61d5a9c4896fb9658090b597ef0e7be6f7b67e/ │ │ │ │ └── cb61d5a9c4896fb9658090b597ef0e7be6f7b67e │ │ │ ├── v1_test_vector.json │ │ │ ├── v3_test_vector.json │ │ │ └── very-light-scrypt.json │ │ ├── watch.go │ │ └── watch_fallback.go │ ├── manager.go │ ├── url.go │ └── url_test.go ├── appveyor.yml ├── build/ │ ├── RPMINSTALL.md │ ├── ci-notes.md │ ├── ci.go │ ├── clean_go_build_cache.sh │ ├── env.sh │ ├── gero.conf │ ├── gero.spec │ ├── geropkg/ │ │ ├── attach.bat │ │ ├── attach.sh │ │ ├── clean.sh │ │ ├── geroConfig.toml │ │ ├── startup.bat │ │ ├── startup.sh │ │ ├── startupEx.sh │ │ ├── startupVoter.bat │ │ ├── startupVoter.sh │ │ └── stop.sh │ ├── goimports.sh │ ├── install.sh │ ├── pod.podspec │ └── update-license.go ├── circle.yml ├── cmd/ │ ├── abigen/ │ │ └── main.go │ ├── bootnode/ │ │ └── main.go │ ├── gero/ │ │ ├── accountcmd.go │ │ ├── bugcmd.go │ │ ├── chaincmd.go │ │ ├── config.go │ │ ├── consolecmd.go │ │ ├── main.go │ │ ├── misccmd.go │ │ ├── monitorcmd.go │ │ ├── snapshotcmd.go │ │ ├── testdata/ │ │ │ ├── empty.js │ │ │ ├── guswallet.json │ │ │ ├── passwords.txt │ │ │ └── wrong-passwords.txt │ │ └── usage.go │ ├── internal/ │ │ └── browser/ │ │ └── browser.go │ ├── proofnode/ │ │ └── main.go │ ├── tx/ │ │ ├── confirm.go │ │ ├── dec.go │ │ ├── main.go │ │ └── sign.go │ └── utils/ │ ├── cmd.go │ ├── customflags.go │ └── flags.go ├── common/ │ ├── address/ │ │ └── account_types.go │ ├── big.go │ ├── bitutil/ │ │ ├── bitutil.go │ │ ├── bitutil_test.go │ │ ├── compress.go │ │ ├── compress_fuzz.go │ │ └── compress_test.go │ ├── bytes.go │ ├── bytes_test.go │ ├── compiler/ │ │ ├── helpers.go │ │ ├── solidity.go │ │ └── solidity_test.go │ ├── debug.go │ ├── fdlimit/ │ │ ├── fdlimit_freebsd.go │ │ ├── fdlimit_unix.go │ │ └── fdlimit_windows.go │ ├── format.go │ ├── hexutil/ │ │ ├── abi_string.go │ │ ├── hexutil.go │ │ ├── hexutil_test.go │ │ ├── json.go │ │ └── json_test.go │ ├── math/ │ │ ├── big.go │ │ ├── big_test.go │ │ ├── integer.go │ │ └── integer_test.go │ ├── mclock/ │ │ └── mclock.go │ ├── path.go │ ├── size.go │ ├── size_test.go │ ├── test_utils.go │ └── types.go ├── consensus/ │ ├── consensus.go │ ├── errors.go │ ├── ethash/ │ │ ├── algorithm.go │ │ ├── algorithm_test.go │ │ ├── consensus.go │ │ ├── consensus_test.go │ │ ├── ethash.go │ │ ├── ethash_test.go │ │ ├── progpow.go │ │ ├── progpow_test.go │ │ └── sealer.go │ └── ethash_hash/ │ ├── blake2b.c │ ├── hash_c.go │ ├── hash_c_test.go │ └── xxenc.c ├── console/ │ ├── bridge.go │ ├── console.go │ ├── console_test.go │ ├── prompter.go │ └── testdata/ │ ├── exec.js │ └── preload.js ├── containers/ │ └── docker/ │ └── gero-ubuntu/ │ ├── Dockerfile │ ├── Makefile │ ├── geroConfig.toml │ └── rungero.docker ├── core/ │ ├── .gitignore │ ├── asm/ │ │ ├── asm.go │ │ ├── compiler.go │ │ └── lexer.go │ ├── block_validator.go │ ├── block_validator_test.go │ ├── blockchain.go │ ├── bloombits/ │ │ ├── doc.go │ │ ├── generator.go │ │ ├── generator_test.go │ │ ├── matcher.go │ │ ├── scheduler.go │ │ └── scheduler_test.go │ ├── chain_indexer.go │ ├── chain_indexer_test.go │ ├── chain_makers.go │ ├── error.go │ ├── events.go │ ├── evm.go │ ├── gaspool.go │ ├── gen_genesis.go │ ├── gen_genesis_account.go │ ├── genesis.go │ ├── genesis_alloc.go │ ├── headerchain.go │ ├── mkalloc.go │ ├── rawdb/ │ │ ├── accessors_chain.go │ │ ├── accessors_chain_test.go │ │ ├── accessors_indexes.go │ │ ├── accessors_metadata.go │ │ ├── interfaces.go │ │ └── schema.go │ ├── state/ │ │ ├── database.go │ │ ├── dump.go │ │ ├── iterator.go │ │ ├── iterator_test.go │ │ ├── journal.go │ │ ├── managed_state.go │ │ ├── state_object.go │ │ ├── state_test.go │ │ ├── statedb.go │ │ ├── statedb4zero.go │ │ ├── statedb_test.go │ │ ├── sync.go │ │ └── sync_test.go │ ├── state_processor.go │ ├── state_transition.go │ ├── tx_checker.go │ ├── tx_journal.go │ ├── tx_list.go │ ├── tx_pool.go │ ├── types/ │ │ ├── block.go │ │ ├── block_rlp.go │ │ ├── block_test.go │ │ ├── bloom9.go │ │ ├── derive_sha.go │ │ ├── gen_header_json.go │ │ ├── gen_log_json.go │ │ ├── gen_receipt_json.go │ │ ├── gen_tx_json.go │ │ ├── header.go │ │ ├── header_test.go │ │ ├── log.go │ │ ├── receipt.go │ │ ├── receipt_rlp.go │ │ ├── share.go │ │ ├── transaction.go │ │ ├── transaction_test.go │ │ └── vserial/ │ │ └── rlp.go │ ├── types.go │ ├── vm/ │ │ ├── analysis.go │ │ ├── analysis_test.go │ │ ├── common.go │ │ ├── contract.go │ │ ├── contracts.go │ │ ├── doc.go │ │ ├── errors.go │ │ ├── evm.go │ │ ├── gas.go │ │ ├── gas_table.go │ │ ├── gas_table_test.go │ │ ├── gen_structlog.go │ │ ├── instructions.go │ │ ├── instructions_test.go │ │ ├── int_pool_verifier.go │ │ ├── int_pool_verifier_empty.go │ │ ├── interface.go │ │ ├── interpreter.go │ │ ├── intpool.go │ │ ├── intpool_test.go │ │ ├── jump_table.go │ │ ├── logger.go │ │ ├── logger_test.go │ │ ├── memory.go │ │ ├── memory_table.go │ │ ├── noop.go │ │ ├── opcodes.go │ │ ├── runtime/ │ │ │ ├── doc.go │ │ │ ├── env.go │ │ │ ├── fuzz.go │ │ │ ├── runtime.go │ │ │ └── runtime_test.go │ │ ├── stack.go │ │ └── stack_table.go │ └── vote.go ├── crypto/ │ ├── crypto.go │ ├── ecies/ │ │ ├── .gitignore │ │ ├── LICENSE │ │ ├── README │ │ ├── ecies.go │ │ ├── ecies_test.go │ │ └── params.go │ ├── secp256k1/ │ │ ├── .gitignore │ │ ├── LICENSE │ │ ├── curve.go │ │ ├── ext.h │ │ ├── libsecp256k1/ │ │ │ ├── .gitignore │ │ │ ├── .travis.yml │ │ │ ├── COPYING │ │ │ ├── Makefile.am │ │ │ ├── README.md │ │ │ ├── TODO │ │ │ ├── autogen.sh │ │ │ ├── build-aux/ │ │ │ │ └── m4/ │ │ │ │ ├── ax_jni_include_dir.m4 │ │ │ │ ├── ax_prog_cc_for_build.m4 │ │ │ │ └── bitcoin_secp.m4 │ │ │ ├── configure.ac │ │ │ ├── contrib/ │ │ │ │ ├── lax_der_parsing.c │ │ │ │ ├── lax_der_parsing.h │ │ │ │ ├── lax_der_privatekey_parsing.c │ │ │ │ └── lax_der_privatekey_parsing.h │ │ │ ├── include/ │ │ │ │ ├── secp256k1.h │ │ │ │ ├── secp256k1_ecdh.h │ │ │ │ └── secp256k1_recovery.h │ │ │ ├── libsecp256k1.pc.in │ │ │ ├── obj/ │ │ │ │ └── .gitignore │ │ │ ├── sage/ │ │ │ │ ├── group_prover.sage │ │ │ │ ├── secp256k1.sage │ │ │ │ └── weierstrass_prover.sage │ │ │ └── src/ │ │ │ ├── asm/ │ │ │ │ └── field_10x26_arm.s │ │ │ ├── basic-config.h │ │ │ ├── bench.h │ │ │ ├── bench_ecdh.c │ │ │ ├── bench_internal.c │ │ │ ├── bench_recover.c │ │ │ ├── bench_schnorr_verify.c │ │ │ ├── bench_sign.c │ │ │ ├── bench_verify.c │ │ │ ├── ecdsa.h │ │ │ ├── ecdsa_impl.h │ │ │ ├── eckey.h │ │ │ ├── eckey_impl.h │ │ │ ├── ecmult.h │ │ │ ├── ecmult_const.h │ │ │ ├── ecmult_const_impl.h │ │ │ ├── ecmult_gen.h │ │ │ ├── ecmult_gen_impl.h │ │ │ ├── ecmult_impl.h │ │ │ ├── field.h │ │ │ ├── field_10x26.h │ │ │ ├── field_10x26_impl.h │ │ │ ├── field_5x52.h │ │ │ ├── field_5x52_asm_impl.h │ │ │ ├── field_5x52_impl.h │ │ │ ├── field_5x52_int128_impl.h │ │ │ ├── field_impl.h │ │ │ ├── gen_context.c │ │ │ ├── group.h │ │ │ ├── group_impl.h │ │ │ ├── hash.h │ │ │ ├── hash_impl.h │ │ │ ├── java/ │ │ │ │ ├── org/ │ │ │ │ │ └── bitcoin/ │ │ │ │ │ ├── NativeSecp256k1.java │ │ │ │ │ ├── NativeSecp256k1Test.java │ │ │ │ │ ├── NativeSecp256k1Util.java │ │ │ │ │ └── Secp256k1Context.java │ │ │ │ ├── org_bitcoin_NativeSecp256k1.c │ │ │ │ ├── org_bitcoin_NativeSecp256k1.h │ │ │ │ ├── org_bitcoin_Secp256k1Context.c │ │ │ │ └── org_bitcoin_Secp256k1Context.h │ │ │ ├── modules/ │ │ │ │ ├── ecdh/ │ │ │ │ │ ├── Makefile.am.include │ │ │ │ │ ├── main_impl.h │ │ │ │ │ └── tests_impl.h │ │ │ │ └── recovery/ │ │ │ │ ├── Makefile.am.include │ │ │ │ ├── main_impl.h │ │ │ │ └── tests_impl.h │ │ │ ├── num.h │ │ │ ├── num_gmp.h │ │ │ ├── num_gmp_impl.h │ │ │ ├── num_impl.h │ │ │ ├── scalar.h │ │ │ ├── scalar_4x64.h │ │ │ ├── scalar_4x64_impl.h │ │ │ ├── scalar_8x32.h │ │ │ ├── scalar_8x32_impl.h │ │ │ ├── scalar_impl.h │ │ │ ├── scalar_low.h │ │ │ ├── scalar_low_impl.h │ │ │ ├── secp256k1.c │ │ │ ├── testrand.h │ │ │ ├── testrand_impl.h │ │ │ ├── tests.c │ │ │ ├── tests_exhaustive.c │ │ │ └── util.h │ │ ├── panic_cb.go │ │ └── secp256.go │ ├── sha3/ │ │ ├── LICENSE │ │ ├── PATENTS │ │ ├── doc.go │ │ ├── hashes.go │ │ ├── keccakf.go │ │ ├── keccakf_amd64.go │ │ ├── keccakf_amd64.s │ │ ├── register.go │ │ ├── sha3.go │ │ ├── shake.go │ │ ├── testdata/ │ │ │ └── keccakKats.json.deflate │ │ ├── xor.go │ │ ├── xor_generic.go │ │ └── xor_unaligned.go │ ├── signature_cgo.go │ └── signature_nocgo.go ├── dashboard/ │ ├── README.md │ ├── assets/ │ │ ├── .eslintrc │ │ ├── .flowconfig │ │ ├── common.jsx │ │ ├── components/ │ │ │ ├── Body.jsx │ │ │ ├── ChartRow.jsx │ │ │ ├── CustomTooltip.jsx │ │ │ ├── Dashboard.jsx │ │ │ ├── Footer.jsx │ │ │ ├── Header.jsx │ │ │ ├── Logs.jsx │ │ │ ├── Main.jsx │ │ │ └── SideBar.jsx │ │ ├── fa-only-woff-loader.js │ │ ├── index.html │ │ ├── index.jsx │ │ ├── package.json │ │ ├── types/ │ │ │ └── content.jsx │ │ └── webpack.config.js │ ├── assets.go │ ├── config.go │ ├── cpu.go │ ├── cpu_windows.go │ ├── dashboard.go │ ├── log.go │ └── message.go ├── event/ │ ├── event.go │ ├── feed.go │ ├── filter/ │ │ ├── filter.go │ │ └── generic_filter.go │ └── subscription.go ├── interfaces.go ├── internal/ │ ├── build/ │ │ ├── archive.go │ │ ├── azure.go │ │ ├── env.go │ │ ├── pgp.go │ │ └── util.go │ ├── cmdtest/ │ │ └── test_cmd.go │ ├── debug/ │ │ ├── api.go │ │ ├── flags.go │ │ ├── loudpanic.go │ │ ├── loudpanic_fallback.go │ │ ├── trace.go │ │ └── trace_fallback.go │ ├── ethapi/ │ │ ├── SRC20Api.go │ │ ├── addrlock.go │ │ ├── api.go │ │ ├── api_abi.go │ │ ├── api_exchange.go │ │ ├── api_flight.go │ │ ├── api_light_node.go │ │ ├── api_local.go │ │ ├── api_proof.go │ │ ├── api_ssi.go │ │ ├── api_stake.go │ │ ├── backend.go │ │ ├── blockReward.go │ │ ├── gentx.go │ │ ├── instance.go │ │ ├── json.go │ │ └── util_test.go │ ├── guide/ │ │ └── guide.go │ ├── jsre/ │ │ ├── completion.go │ │ ├── deps/ │ │ │ ├── bignumber.js │ │ │ ├── bindata.go │ │ │ ├── deps.go │ │ │ └── web3.js │ │ ├── jsre.go │ │ └── pretty.go │ └── web3ext/ │ └── web3ext.go ├── log/ │ ├── CONTRIBUTORS │ ├── LICENSE │ ├── README.md │ ├── README_ETHEREUM.md │ ├── doc.go │ ├── format.go │ ├── handler.go │ ├── handler_glog.go │ ├── handler_go13.go │ ├── handler_go14.go │ ├── logger.go │ ├── root.go │ ├── syslog.go │ └── term/ │ ├── LICENSE │ ├── terminal_appengine.go │ ├── terminal_darwin.go │ ├── terminal_freebsd.go │ ├── terminal_linux.go │ ├── terminal_netbsd.go │ ├── terminal_notwindows.go │ ├── terminal_openbsd.go │ ├── terminal_solaris.go │ └── terminal_windows.go ├── makepkg.sh ├── maketxpkg.sh ├── metrics/ │ ├── FORK.md │ ├── LICENSE │ ├── README.md │ ├── counter.go │ ├── debug.go │ ├── disk.go │ ├── disk_linux.go │ ├── disk_nop.go │ ├── ewma.go │ ├── exp/ │ │ └── exp.go │ ├── gauge.go │ ├── gauge_float64.go │ ├── graphite.go │ ├── healthcheck.go │ ├── histogram.go │ ├── influxdb/ │ │ ├── LICENSE │ │ ├── README.md │ │ └── influxdb.go │ ├── json.go │ ├── librato/ │ │ ├── client.go │ │ └── librato.go │ ├── log.go │ ├── memory.md │ ├── meter.go │ ├── metrics.go │ ├── opentsdb.go │ ├── registry.go │ ├── resetting_timer.go │ ├── runtime.go │ ├── runtime_cgo.go │ ├── runtime_gccpufraction.go │ ├── runtime_no_cgo.go │ ├── runtime_no_gccpufraction.go │ ├── sample.go │ ├── syslog.go │ ├── timer.go │ ├── validate.sh │ └── writer.go ├── miner/ │ ├── agent.go │ ├── lotter.go │ ├── miner.go │ ├── pending_vote.go │ ├── remote_agent.go │ ├── unconfirmed.go │ └── worker.go ├── node/ │ ├── api.go │ ├── config.go │ ├── defaults.go │ ├── doc.go │ ├── errors.go │ ├── node.go │ └── service.go ├── p2p/ │ ├── dial.go │ ├── discover/ │ │ ├── database.go │ │ ├── node.go │ │ ├── ntp.go │ │ ├── table.go │ │ └── udp.go │ ├── discv5/ │ │ ├── database.go │ │ ├── metrics.go │ │ ├── net.go │ │ ├── node.go │ │ ├── nodeevent_string.go │ │ ├── ntp.go │ │ ├── table.go │ │ ├── ticket.go │ │ ├── topic.go │ │ └── udp.go │ ├── enr/ │ │ ├── enr.go │ │ ├── entries.go │ │ └── idscheme.go │ ├── message.go │ ├── metrics.go │ ├── nat/ │ │ ├── nat.go │ │ ├── natpmp.go │ │ └── natupnp.go │ ├── netutil/ │ │ ├── error.go │ │ ├── net.go │ │ ├── toobig_notwindows.go │ │ └── toobig_windows.go │ ├── peer.go │ ├── peer_error.go │ ├── protocol.go │ ├── protocols/ │ │ └── protocol.go │ ├── rlpx.go │ ├── server.go │ ├── simulations/ │ │ ├── README.md │ │ ├── adapters/ │ │ │ ├── docker.go │ │ │ ├── exec.go │ │ │ ├── inproc.go │ │ │ ├── types.go │ │ │ └── ws.go │ │ ├── events.go │ │ ├── examples/ │ │ │ ├── README.md │ │ │ ├── ping-pong.go │ │ │ └── ping-pong.sh │ │ ├── http.go │ │ ├── mocker.go │ │ ├── network.go │ │ ├── pipes/ │ │ │ └── pipes.go │ │ └── simulation.go │ └── testing/ │ ├── peerpool.go │ ├── protocolsession.go │ └── protocoltester.go ├── params/ │ ├── bootnodes.go │ ├── config.go │ ├── denomination.go │ ├── gas_table.go │ ├── network_params.go │ ├── protocol_params.go │ └── version.go ├── rlp/ │ ├── decode.go │ ├── doc.go │ ├── encode.go │ ├── raw.go │ └── typecache.go ├── rpc/ │ ├── client.go │ ├── doc.go │ ├── endpoints.go │ ├── errors.go │ ├── http.go │ ├── inproc.go │ ├── ipc.go │ ├── ipc_unix.go │ ├── ipc_windows.go │ ├── json.go │ ├── server.go │ ├── subscription.go │ ├── types.go │ ├── utils.go │ └── websocket.go ├── sero/ │ ├── api.go │ ├── api_backend.go │ ├── api_tracer.go │ ├── backend.go │ ├── backup.go │ ├── bloombits.go │ ├── config.go │ ├── downloader/ │ │ ├── api.go │ │ ├── downloader.go │ │ ├── events.go │ │ ├── fakepeer.go │ │ ├── metrics.go │ │ ├── modes.go │ │ ├── peer.go │ │ ├── queue.go │ │ ├── statesync.go │ │ └── types.go │ ├── fetcher/ │ │ ├── fetcher.go │ │ └── metrics.go │ ├── filters/ │ │ ├── api.go │ │ ├── filter.go │ │ └── filter_system.go │ ├── gasprice/ │ │ └── gasprice.go │ ├── gen_config.go │ ├── handler.go │ ├── metrics.go │ ├── peer.go │ ├── protocol.go │ ├── sync.go │ └── tracers/ │ ├── internal/ │ │ └── tracers/ │ │ ├── 4byte_tracer.js │ │ ├── assets.go │ │ ├── bigram_tracer.js │ │ ├── call_tracer.js │ │ ├── evmdis_tracer.js │ │ ├── noop_tracer.js │ │ ├── opcount_tracer.js │ │ ├── prestate_tracer.js │ │ ├── tracers.go │ │ ├── trigram_tracer.js │ │ └── unigram_tracer.js │ ├── testdata/ │ │ ├── call_tracer_create.json │ │ ├── call_tracer_deep_calls.json │ │ ├── call_tracer_delegatecall.json │ │ ├── call_tracer_inner_create_oog_outer_throw.json │ │ ├── call_tracer_inner_throw_outer_revert.json │ │ ├── call_tracer_oog.json │ │ ├── call_tracer_revert.json │ │ ├── call_tracer_simple.json │ │ └── call_tracer_throw.json │ ├── tracer.go │ └── tracers.go ├── seroclient/ │ └── seroclient.go ├── serodb/ │ ├── .gitignore │ ├── database.go │ ├── interface.go │ └── memory_database.go ├── serostats/ │ └── serostats.go ├── tests/ │ ├── abigen/ │ │ ├── testAbi.go │ │ └── testAbi.sol │ ├── abigen_test.go │ ├── block_test.go │ ├── block_test_util.go │ ├── difficulty_test.go │ ├── difficulty_test_util.go │ ├── gen_btheader.go │ ├── gen_difficultytest.go │ ├── gen_stenv.go │ ├── gen_sttransaction.go │ ├── gen_tttransaction.go │ ├── gen_vmexec.go │ ├── init.go │ ├── init_test.go │ ├── rlp_test.go │ ├── rlp_test_util.go │ ├── state_test.go │ ├── state_test_util.go │ ├── transaction_test_util.go │ ├── vm_test.go │ └── vm_test_util.go ├── trie/ │ ├── database.go │ ├── encoding.go │ ├── errors.go │ ├── hasher.go │ ├── iterator.go │ ├── node.go │ ├── proof.go │ ├── secure_trie.go │ ├── sync.go │ └── trie.go ├── vendor/ │ ├── bazil.org/ │ │ └── fuse/ │ │ ├── LICENSE │ │ ├── README.md │ │ ├── buffer.go │ │ ├── debug.go │ │ ├── error_darwin.go │ │ ├── error_freebsd.go │ │ ├── error_linux.go │ │ ├── error_std.go │ │ ├── fs/ │ │ │ ├── serve.go │ │ │ └── tree.go │ │ ├── fuse.go │ │ ├── fuse.iml │ │ ├── fuse_darwin.go │ │ ├── fuse_freebsd.go │ │ ├── fuse_kernel.go │ │ ├── fuse_kernel_darwin.go │ │ ├── fuse_kernel_freebsd.go │ │ ├── fuse_kernel_linux.go │ │ ├── fuse_kernel_std.go │ │ ├── fuse_linux.go │ │ ├── fuseutil/ │ │ │ └── fuseutil.go │ │ ├── mount.go │ │ ├── mount_darwin.go │ │ ├── mount_freebsd.go │ │ ├── mount_linux.go │ │ ├── options.go │ │ ├── options_darwin.go │ │ ├── options_freebsd.go │ │ ├── options_linux.go │ │ ├── protocol.go │ │ ├── unmount.go │ │ ├── unmount_linux.go │ │ └── unmount_std.go │ ├── github.com/ │ │ ├── Azure/ │ │ │ ├── azure-pipeline-go/ │ │ │ │ ├── LICENSE │ │ │ │ └── pipeline/ │ │ │ │ ├── core.go │ │ │ │ ├── defaultlog_syslog.go │ │ │ │ ├── defaultlog_windows.go │ │ │ │ ├── doc.go │ │ │ │ ├── error.go │ │ │ │ ├── progress.go │ │ │ │ ├── request.go │ │ │ │ ├── response.go │ │ │ │ └── version.go │ │ │ ├── azure-sdk-for-go/ │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ └── glide.yaml │ │ │ └── azure-storage-blob-go/ │ │ │ ├── 2018-03-28/ │ │ │ │ └── azblob/ │ │ │ │ ├── access_conditions.go │ │ │ │ ├── atomicmorph.go │ │ │ │ ├── highlevel.go │ │ │ │ ├── parsing_urls.go │ │ │ │ ├── sas_service.go │ │ │ │ ├── service_codes_blob.go │ │ │ │ ├── url_append_blob.go │ │ │ │ ├── url_blob.go │ │ │ │ ├── url_block_blob.go │ │ │ │ ├── url_container.go │ │ │ │ ├── url_page_blob.go │ │ │ │ ├── url_service.go │ │ │ │ ├── version.go │ │ │ │ ├── zc_credential_anonymous.go │ │ │ │ ├── zc_credential_shared_key.go │ │ │ │ ├── zc_credential_token.go │ │ │ │ ├── zc_mmf_unix.go │ │ │ │ ├── zc_mmf_windows.go │ │ │ │ ├── zc_pipeline.go │ │ │ │ ├── zc_policy_request_log.go │ │ │ │ ├── zc_policy_retry.go │ │ │ │ ├── zc_policy_telemetry.go │ │ │ │ ├── zc_policy_unique_request_id.go │ │ │ │ ├── zc_retry_reader.go │ │ │ │ ├── zc_sas_account.go │ │ │ │ ├── zc_sas_query_params.go │ │ │ │ ├── zc_service_codes_common.go │ │ │ │ ├── zc_storage_error.go │ │ │ │ ├── zc_util_validate.go │ │ │ │ ├── zc_uuid.go │ │ │ │ ├── zt_doc.go │ │ │ │ ├── zz_generated_append_blob.go │ │ │ │ ├── zz_generated_blob.go │ │ │ │ ├── zz_generated_block_blob.go │ │ │ │ ├── zz_generated_client.go │ │ │ │ ├── zz_generated_container.go │ │ │ │ ├── zz_generated_models.go │ │ │ │ ├── zz_generated_page_blob.go │ │ │ │ ├── zz_generated_responder_policy.go │ │ │ │ ├── zz_generated_response_error.go │ │ │ │ ├── zz_generated_service.go │ │ │ │ ├── zz_generated_validation.go │ │ │ │ ├── zz_generated_version.go │ │ │ │ └── zz_response_helpers.go │ │ │ └── LICENSE │ │ ├── StackExchange/ │ │ │ └── wmi/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── swbemservices.go │ │ │ └── wmi.go │ │ ├── aristanetworks/ │ │ │ └── goarista/ │ │ │ ├── .travis.yml │ │ │ ├── AUTHORS │ │ │ ├── COPYING │ │ │ ├── Dockerfile │ │ │ ├── Makefile │ │ │ ├── README.md │ │ │ ├── check_line_len.awk │ │ │ ├── iptables.sh │ │ │ ├── monotime/ │ │ │ │ ├── issue15006.s │ │ │ │ └── nanotime.go │ │ │ └── rpmbuild.sh │ │ ├── btcsuite/ │ │ │ └── btcutil/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── address.go │ │ │ ├── amount.go │ │ │ ├── appdata.go │ │ │ ├── base58/ │ │ │ │ ├── README.md │ │ │ │ ├── alphabet.go │ │ │ │ ├── base58.go │ │ │ │ ├── base58check.go │ │ │ │ ├── cov_report.sh │ │ │ │ ├── doc.go │ │ │ │ └── genalphabet.go │ │ │ ├── bech32/ │ │ │ │ ├── README.md │ │ │ │ ├── bech32.go │ │ │ │ └── doc.go │ │ │ ├── block.go │ │ │ ├── certgen.go │ │ │ ├── const.go │ │ │ ├── cov_report.sh │ │ │ ├── doc.go │ │ │ ├── goclean.sh │ │ │ ├── hash160.go │ │ │ ├── net.go │ │ │ ├── net_noop.go │ │ │ ├── test_coverage.txt │ │ │ ├── tx.go │ │ │ └── wif.go │ │ ├── cespare/ │ │ │ └── cp/ │ │ │ ├── LICENSE.txt │ │ │ ├── README.md │ │ │ └── cp.go │ │ ├── codahale/ │ │ │ └── hdrhistogram/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── hdr.go │ │ │ └── window.go │ │ ├── davecgh/ │ │ │ └── go-spew/ │ │ │ ├── .gitignore │ │ │ ├── .travis.yml │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── cov_report.sh │ │ │ ├── spew/ │ │ │ │ ├── bypass.go │ │ │ │ ├── bypasssafe.go │ │ │ │ ├── common.go │ │ │ │ ├── config.go │ │ │ │ ├── doc.go │ │ │ │ ├── dump.go │ │ │ │ ├── format.go │ │ │ │ └── spew.go │ │ │ └── test_coverage.txt │ │ ├── deckarep/ │ │ │ └── golang-set/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── iterator.go │ │ │ ├── set.go │ │ │ ├── threadsafe.go │ │ │ └── threadunsafe.go │ │ ├── dgrijalva/ │ │ │ └── jwt-go/ │ │ │ ├── LICENSE │ │ │ ├── MIGRATION_GUIDE.md │ │ │ ├── README.md │ │ │ ├── VERSION_HISTORY.md │ │ │ ├── claims.go │ │ │ ├── doc.go │ │ │ ├── ecdsa.go │ │ │ ├── ecdsa_utils.go │ │ │ ├── errors.go │ │ │ ├── hmac.go │ │ │ ├── map_claims.go │ │ │ ├── none.go │ │ │ ├── parser.go │ │ │ ├── rsa.go │ │ │ ├── rsa_pss.go │ │ │ ├── rsa_utils.go │ │ │ ├── signing_method.go │ │ │ └── token.go │ │ ├── docker/ │ │ │ └── docker/ │ │ │ ├── LICENSE │ │ │ ├── NOTICE │ │ │ └── pkg/ │ │ │ └── reexec/ │ │ │ ├── README.md │ │ │ ├── command_linux.go │ │ │ ├── command_unix.go │ │ │ ├── command_unsupported.go │ │ │ ├── command_windows.go │ │ │ └── reexec.go │ │ ├── edsrzf/ │ │ │ └── mmap-go/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── mmap.go │ │ │ ├── mmap_unix.go │ │ │ ├── mmap_windows.go │ │ │ ├── msync_netbsd.go │ │ │ └── msync_unix.go │ │ ├── elastic/ │ │ │ └── gosigar/ │ │ │ ├── CHANGELOG.md │ │ │ ├── LICENSE │ │ │ ├── NOTICE │ │ │ ├── README.md │ │ │ ├── Vagrantfile │ │ │ ├── codecov.yml │ │ │ ├── concrete_sigar.go │ │ │ ├── sigar_darwin.go │ │ │ ├── sigar_format.go │ │ │ ├── sigar_freebsd.go │ │ │ ├── sigar_interface.go │ │ │ ├── sigar_linux.go │ │ │ ├── sigar_linux_common.go │ │ │ ├── sigar_openbsd.go │ │ │ ├── sigar_stub.go │ │ │ ├── sigar_unix.go │ │ │ ├── sigar_util.go │ │ │ ├── sigar_windows.go │ │ │ └── sys/ │ │ │ └── windows/ │ │ │ ├── doc.go │ │ │ ├── ntquery.go │ │ │ ├── privileges.go │ │ │ ├── syscall_windows.go │ │ │ ├── version.go │ │ │ └── zsyscall_windows.go │ │ ├── fatih/ │ │ │ └── color/ │ │ │ ├── LICENSE.md │ │ │ ├── README.md │ │ │ ├── color.go │ │ │ └── doc.go │ │ ├── fjl/ │ │ │ └── memsize/ │ │ │ ├── LICENSE │ │ │ ├── bitmap.go │ │ │ ├── doc.go │ │ │ ├── memsize.go │ │ │ ├── memsizeui/ │ │ │ │ ├── template.go │ │ │ │ └── ui.go │ │ │ ├── runtimefunc.go │ │ │ ├── runtimefunc.s │ │ │ └── type.go │ │ ├── gizak/ │ │ │ └── termui/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── barchart.go │ │ │ ├── block.go │ │ │ ├── block_common.go │ │ │ ├── block_windows.go │ │ │ ├── buffer.go │ │ │ ├── canvas.go │ │ │ ├── config.py │ │ │ ├── doc.go │ │ │ ├── events.go │ │ │ ├── gauge.go │ │ │ ├── glide.yaml │ │ │ ├── grid.go │ │ │ ├── helper.go │ │ │ ├── linechart.go │ │ │ ├── linechart_others.go │ │ │ ├── linechart_windows.go │ │ │ ├── list.go │ │ │ ├── mbarchart.go │ │ │ ├── mkdocs.yml │ │ │ ├── par.go │ │ │ ├── pos.go │ │ │ ├── render.go │ │ │ ├── sparkline.go │ │ │ ├── table.go │ │ │ ├── textbuilder.go │ │ │ ├── theme.go │ │ │ └── widget.go │ │ ├── go-ole/ │ │ │ └── go-ole/ │ │ │ ├── ChangeLog.md │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── appveyor.yml │ │ │ ├── com.go │ │ │ ├── com_func.go │ │ │ ├── connect.go │ │ │ ├── constants.go │ │ │ ├── error.go │ │ │ ├── error_func.go │ │ │ ├── error_windows.go │ │ │ ├── guid.go │ │ │ ├── iconnectionpoint.go │ │ │ ├── iconnectionpoint_func.go │ │ │ ├── iconnectionpoint_windows.go │ │ │ ├── iconnectionpointcontainer.go │ │ │ ├── iconnectionpointcontainer_func.go │ │ │ ├── iconnectionpointcontainer_windows.go │ │ │ ├── idispatch.go │ │ │ ├── idispatch_func.go │ │ │ ├── idispatch_windows.go │ │ │ ├── ienumvariant.go │ │ │ ├── ienumvariant_func.go │ │ │ ├── ienumvariant_windows.go │ │ │ ├── iinspectable.go │ │ │ ├── iinspectable_func.go │ │ │ ├── iinspectable_windows.go │ │ │ ├── iprovideclassinfo.go │ │ │ ├── iprovideclassinfo_func.go │ │ │ ├── iprovideclassinfo_windows.go │ │ │ ├── itypeinfo.go │ │ │ ├── itypeinfo_func.go │ │ │ ├── itypeinfo_windows.go │ │ │ ├── iunknown.go │ │ │ ├── iunknown_func.go │ │ │ ├── iunknown_windows.go │ │ │ ├── ole.go │ │ │ ├── oleutil/ │ │ │ │ ├── connection.go │ │ │ │ ├── connection_func.go │ │ │ │ ├── connection_windows.go │ │ │ │ ├── go-get.go │ │ │ │ └── oleutil.go │ │ │ ├── safearray.go │ │ │ ├── safearray_func.go │ │ │ ├── safearray_windows.go │ │ │ ├── safearrayconversion.go │ │ │ ├── safearrayslices.go │ │ │ ├── utility.go │ │ │ ├── variables.go │ │ │ ├── variant.go │ │ │ ├── variant_386.go │ │ │ ├── variant_amd64.go │ │ │ ├── variant_s390x.go │ │ │ ├── vt_string.go │ │ │ ├── winrt.go │ │ │ └── winrt_doc.go │ │ ├── go-stack/ │ │ │ └── stack/ │ │ │ ├── LICENSE.md │ │ │ ├── README.md │ │ │ └── stack.go │ │ ├── golang/ │ │ │ ├── protobuf/ │ │ │ │ ├── LICENSE │ │ │ │ ├── proto/ │ │ │ │ │ ├── Makefile │ │ │ │ │ ├── clone.go │ │ │ │ │ ├── decode.go │ │ │ │ │ ├── encode.go │ │ │ │ │ ├── equal.go │ │ │ │ │ ├── extensions.go │ │ │ │ │ ├── lib.go │ │ │ │ │ ├── message_set.go │ │ │ │ │ ├── pointer_reflect.go │ │ │ │ │ ├── pointer_unsafe.go │ │ │ │ │ ├── properties.go │ │ │ │ │ ├── text.go │ │ │ │ │ └── text_parser.go │ │ │ │ └── protoc-gen-go/ │ │ │ │ └── descriptor/ │ │ │ │ ├── Makefile │ │ │ │ └── descriptor.pb.go │ │ │ └── snappy/ │ │ │ ├── AUTHORS │ │ │ ├── CONTRIBUTORS │ │ │ ├── LICENSE │ │ │ ├── README │ │ │ ├── decode.go │ │ │ ├── decode_amd64.go │ │ │ ├── decode_amd64.s │ │ │ ├── decode_other.go │ │ │ ├── encode.go │ │ │ ├── encode_amd64.go │ │ │ ├── encode_amd64.s │ │ │ ├── encode_other.go │ │ │ └── snappy.go │ │ ├── gosuri/ │ │ │ ├── uilive/ │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── doc.go │ │ │ │ ├── writer.go │ │ │ │ ├── writer_posix.go │ │ │ │ └── writer_windows.go │ │ │ └── uiprogress/ │ │ │ ├── LICENSE │ │ │ ├── Makefile │ │ │ ├── README.md │ │ │ ├── bar.go │ │ │ ├── doc.go │ │ │ ├── progress.go │ │ │ └── util/ │ │ │ └── strutil/ │ │ │ └── strutil.go │ │ ├── hashicorp/ │ │ │ └── golang-lru/ │ │ │ ├── 2q.go │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── arc.go │ │ │ ├── lru.go │ │ │ └── simplelru/ │ │ │ └── lru.go │ │ ├── huin/ │ │ │ └── goupnp/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── dcps/ │ │ │ │ ├── internetgateway1/ │ │ │ │ │ └── internetgateway1.go │ │ │ │ └── internetgateway2/ │ │ │ │ └── internetgateway2.go │ │ │ ├── device.go │ │ │ ├── goupnp.go │ │ │ ├── httpu/ │ │ │ │ ├── httpu.go │ │ │ │ └── serve.go │ │ │ ├── scpd/ │ │ │ │ └── scpd.go │ │ │ ├── service_client.go │ │ │ ├── soap/ │ │ │ │ ├── soap.go │ │ │ │ └── types.go │ │ │ └── ssdp/ │ │ │ ├── registry.go │ │ │ └── ssdp.go │ │ ├── influxdata/ │ │ │ └── influxdb/ │ │ │ ├── LICENSE │ │ │ ├── LICENSE_OF_DEPENDENCIES.md │ │ │ ├── client/ │ │ │ │ ├── README.md │ │ │ │ ├── influxdb.go │ │ │ │ └── v2/ │ │ │ │ ├── client.go │ │ │ │ └── udp.go │ │ │ ├── models/ │ │ │ │ ├── consistency.go │ │ │ │ ├── inline_fnv.go │ │ │ │ ├── inline_strconv_parse.go │ │ │ │ ├── points.go │ │ │ │ ├── rows.go │ │ │ │ ├── statistic.go │ │ │ │ ├── time.go │ │ │ │ └── uint_support.go │ │ │ └── pkg/ │ │ │ └── escape/ │ │ │ ├── bytes.go │ │ │ └── strings.go │ │ ├── jackpal/ │ │ │ └── go-nat-pmp/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── natpmp.go │ │ │ ├── network.go │ │ │ └── recorder.go │ │ ├── julienschmidt/ │ │ │ └── httprouter/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── path.go │ │ │ ├── router.go │ │ │ └── tree.go │ │ ├── karalabe/ │ │ │ └── hid/ │ │ │ ├── LICENSE.md │ │ │ ├── README.md │ │ │ ├── appveyor.yml │ │ │ ├── hid.go │ │ │ ├── hid_disabled.go │ │ │ ├── hid_enabled.go │ │ │ ├── hidapi/ │ │ │ │ ├── AUTHORS.txt │ │ │ │ ├── LICENSE-bsd.txt │ │ │ │ ├── LICENSE-gpl3.txt │ │ │ │ ├── LICENSE-orig.txt │ │ │ │ ├── LICENSE.txt │ │ │ │ ├── README.txt │ │ │ │ ├── hidapi/ │ │ │ │ │ └── hidapi.h │ │ │ │ ├── libusb/ │ │ │ │ │ └── hid.c │ │ │ │ ├── mac/ │ │ │ │ │ └── hid.c │ │ │ │ └── windows/ │ │ │ │ └── hid.c │ │ │ ├── libusb/ │ │ │ │ ├── AUTHORS │ │ │ │ ├── COPYING │ │ │ │ └── libusb/ │ │ │ │ ├── config.h │ │ │ │ ├── core.c │ │ │ │ ├── descriptor.c │ │ │ │ ├── hotplug.c │ │ │ │ ├── hotplug.h │ │ │ │ ├── io.c │ │ │ │ ├── libusb.h │ │ │ │ ├── libusbi.h │ │ │ │ ├── os/ │ │ │ │ │ ├── darwin_usb.c │ │ │ │ │ ├── darwin_usb.h │ │ │ │ │ ├── haiku_pollfs.cpp │ │ │ │ │ ├── haiku_usb.h │ │ │ │ │ ├── haiku_usb_backend.cpp │ │ │ │ │ ├── haiku_usb_raw.cpp │ │ │ │ │ ├── haiku_usb_raw.h │ │ │ │ │ ├── linux_netlink.c │ │ │ │ │ ├── linux_udev.c │ │ │ │ │ ├── linux_usbfs.c │ │ │ │ │ ├── linux_usbfs.h │ │ │ │ │ ├── netbsd_usb.c │ │ │ │ │ ├── openbsd_usb.c │ │ │ │ │ ├── poll_posix.c │ │ │ │ │ ├── poll_posix.h │ │ │ │ │ ├── poll_windows.c │ │ │ │ │ ├── poll_windows.h │ │ │ │ │ ├── sunos_usb.c │ │ │ │ │ ├── sunos_usb.h │ │ │ │ │ ├── threads_posix.c │ │ │ │ │ ├── threads_posix.h │ │ │ │ │ ├── threads_windows.c │ │ │ │ │ ├── threads_windows.h │ │ │ │ │ ├── wince_usb.c │ │ │ │ │ ├── wince_usb.h │ │ │ │ │ ├── windows_common.h │ │ │ │ │ ├── windows_nt_common.c │ │ │ │ │ ├── windows_nt_common.h │ │ │ │ │ ├── windows_usbdk.c │ │ │ │ │ ├── windows_usbdk.h │ │ │ │ │ ├── windows_winusb.c │ │ │ │ │ └── windows_winusb.h │ │ │ │ ├── strerror.c │ │ │ │ ├── sync.c │ │ │ │ ├── version.h │ │ │ │ └── version_nano.h │ │ │ └── wchar.go │ │ ├── maruel/ │ │ │ └── panicparse/ │ │ │ ├── .travis.yml │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── stack/ │ │ │ │ ├── source.go │ │ │ │ ├── stack.go │ │ │ │ └── ui.go │ │ │ └── vendor.yml │ │ ├── mattn/ │ │ │ ├── go-colorable/ │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── colorable_others.go │ │ │ │ ├── colorable_windows.go │ │ │ │ └── noncolorable.go │ │ │ ├── go-isatty/ │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── doc.go │ │ │ │ ├── isatty_appengine.go │ │ │ │ ├── isatty_bsd.go │ │ │ │ ├── isatty_linux.go │ │ │ │ ├── isatty_not_windows.go │ │ │ │ ├── isatty_solaris.go │ │ │ │ └── isatty_windows.go │ │ │ └── go-runewidth/ │ │ │ ├── LICENSE │ │ │ ├── README.mkd │ │ │ ├── runewidth.go │ │ │ ├── runewidth_js.go │ │ │ ├── runewidth_posix.go │ │ │ └── runewidth_windows.go │ │ ├── mitchellh/ │ │ │ └── go-wordwrap/ │ │ │ ├── LICENSE.md │ │ │ ├── README.md │ │ │ └── wordwrap.go │ │ ├── mohae/ │ │ │ └── deepcopy/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ └── deepcopy.go │ │ ├── naoina/ │ │ │ ├── go-stringutil/ │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── da.go │ │ │ │ └── strings.go │ │ │ └── toml/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── ast/ │ │ │ │ └── ast.go │ │ │ ├── config.go │ │ │ ├── decode.go │ │ │ ├── encode.go │ │ │ ├── error.go │ │ │ ├── parse.go │ │ │ ├── parse.peg │ │ │ ├── parse.peg.go │ │ │ └── util.go │ │ ├── nsf/ │ │ │ └── termbox-go/ │ │ │ ├── AUTHORS │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── api.go │ │ │ ├── api_common.go │ │ │ ├── api_windows.go │ │ │ ├── collect_terminfo.py │ │ │ ├── syscalls.go │ │ │ ├── syscalls_darwin.go │ │ │ ├── syscalls_darwin_amd64.go │ │ │ ├── syscalls_dragonfly.go │ │ │ ├── syscalls_freebsd.go │ │ │ ├── syscalls_linux.go │ │ │ ├── syscalls_netbsd.go │ │ │ ├── syscalls_openbsd.go │ │ │ ├── syscalls_windows.go │ │ │ ├── termbox.go │ │ │ ├── termbox_common.go │ │ │ ├── termbox_windows.go │ │ │ ├── terminfo.go │ │ │ └── terminfo_builtin.go │ │ ├── olekukonko/ │ │ │ └── tablewriter/ │ │ │ ├── LICENCE.md │ │ │ ├── README.md │ │ │ ├── csv.go │ │ │ ├── table.go │ │ │ ├── test.csv │ │ │ ├── test_info.csv │ │ │ ├── util.go │ │ │ └── wrap.go │ │ ├── opentracing/ │ │ │ └── opentracing-go/ │ │ │ ├── CHANGELOG.md │ │ │ ├── LICENSE │ │ │ ├── Makefile │ │ │ ├── README.md │ │ │ ├── ext/ │ │ │ │ └── tags.go │ │ │ ├── globaltracer.go │ │ │ ├── gocontext.go │ │ │ ├── log/ │ │ │ │ ├── field.go │ │ │ │ └── util.go │ │ │ ├── noop.go │ │ │ ├── propagation.go │ │ │ ├── span.go │ │ │ └── tracer.go │ │ ├── pborman/ │ │ │ └── uuid/ │ │ │ ├── CONTRIBUTING.md │ │ │ ├── CONTRIBUTORS │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── dce.go │ │ │ ├── doc.go │ │ │ ├── hash.go │ │ │ ├── marshal.go │ │ │ ├── node.go │ │ │ ├── sql.go │ │ │ ├── time.go │ │ │ ├── util.go │ │ │ ├── uuid.go │ │ │ ├── version1.go │ │ │ └── version4.go │ │ ├── peterh/ │ │ │ └── liner/ │ │ │ ├── COPYING │ │ │ ├── README.md │ │ │ ├── bsdinput.go │ │ │ ├── common.go │ │ │ ├── fallbackinput.go │ │ │ ├── input.go │ │ │ ├── input_darwin.go │ │ │ ├── input_linux.go │ │ │ ├── input_windows.go │ │ │ ├── line.go │ │ │ ├── output.go │ │ │ ├── output_windows.go │ │ │ ├── unixmode.go │ │ │ └── width.go │ │ ├── pkg/ │ │ │ └── errors/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── appveyor.yml │ │ │ ├── errors.go │ │ │ └── stack.go │ │ ├── pmezard/ │ │ │ └── go-difflib/ │ │ │ ├── LICENSE │ │ │ └── difflib/ │ │ │ └── difflib.go │ │ ├── prometheus/ │ │ │ └── prometheus/ │ │ │ ├── LICENSE │ │ │ ├── NOTICE │ │ │ └── util/ │ │ │ └── flock/ │ │ │ ├── flock.go │ │ │ ├── flock_plan9.go │ │ │ ├── flock_solaris.go │ │ │ ├── flock_unix.go │ │ │ └── flock_windows.go │ │ ├── rjeczalik/ │ │ │ └── notify/ │ │ │ ├── AUTHORS │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── appveyor.yml │ │ │ ├── debug.go │ │ │ ├── debug_debug.go │ │ │ ├── debug_nodebug.go │ │ │ ├── doc.go │ │ │ ├── event.go │ │ │ ├── event_fen.go │ │ │ ├── event_fsevents.go │ │ │ ├── event_inotify.go │ │ │ ├── event_kqueue.go │ │ │ ├── event_readdcw.go │ │ │ ├── event_stub.go │ │ │ ├── event_trigger.go │ │ │ ├── node.go │ │ │ ├── notify.go │ │ │ ├── tree.go │ │ │ ├── tree_nonrecursive.go │ │ │ ├── tree_recursive.go │ │ │ ├── util.go │ │ │ ├── watcher.go │ │ │ ├── watcher_fen.go │ │ │ ├── watcher_fen_cgo.go │ │ │ ├── watcher_fsevents.go │ │ │ ├── watcher_fsevents_cgo.go │ │ │ ├── watcher_inotify.go │ │ │ ├── watcher_kqueue.go │ │ │ ├── watcher_notimplemented.go │ │ │ ├── watcher_readdcw.go │ │ │ ├── watcher_stub.go │ │ │ ├── watcher_trigger.go │ │ │ ├── watchpoint.go │ │ │ ├── watchpoint_other.go │ │ │ └── watchpoint_readdcw.go │ │ ├── robertkrimen/ │ │ │ └── otto/ │ │ │ ├── DESIGN.markdown │ │ │ ├── LICENSE │ │ │ ├── Makefile │ │ │ ├── README.markdown │ │ │ ├── ast/ │ │ │ │ ├── README.markdown │ │ │ │ ├── comments.go │ │ │ │ └── node.go │ │ │ ├── builtin.go │ │ │ ├── builtin_array.go │ │ │ ├── builtin_boolean.go │ │ │ ├── builtin_date.go │ │ │ ├── builtin_error.go │ │ │ ├── builtin_function.go │ │ │ ├── builtin_json.go │ │ │ ├── builtin_math.go │ │ │ ├── builtin_number.go │ │ │ ├── builtin_object.go │ │ │ ├── builtin_regexp.go │ │ │ ├── builtin_string.go │ │ │ ├── clone.go │ │ │ ├── cmpl.go │ │ │ ├── cmpl_evaluate.go │ │ │ ├── cmpl_evaluate_expression.go │ │ │ ├── cmpl_evaluate_statement.go │ │ │ ├── cmpl_parse.go │ │ │ ├── console.go │ │ │ ├── dbg/ │ │ │ │ └── dbg.go │ │ │ ├── dbg.go │ │ │ ├── error.go │ │ │ ├── evaluate.go │ │ │ ├── file/ │ │ │ │ ├── README.markdown │ │ │ │ └── file.go │ │ │ ├── global.go │ │ │ ├── inline.go │ │ │ ├── inline.pl │ │ │ ├── object.go │ │ │ ├── object_class.go │ │ │ ├── otto.go │ │ │ ├── otto_.go │ │ │ ├── parser/ │ │ │ │ ├── Makefile │ │ │ │ ├── README.markdown │ │ │ │ ├── dbg.go │ │ │ │ ├── error.go │ │ │ │ ├── expression.go │ │ │ │ ├── lexer.go │ │ │ │ ├── parser.go │ │ │ │ ├── regexp.go │ │ │ │ ├── scope.go │ │ │ │ └── statement.go │ │ │ ├── property.go │ │ │ ├── registry/ │ │ │ │ ├── README.markdown │ │ │ │ └── registry.go │ │ │ ├── result.go │ │ │ ├── runtime.go │ │ │ ├── scope.go │ │ │ ├── script.go │ │ │ ├── stash.go │ │ │ ├── token/ │ │ │ │ ├── Makefile │ │ │ │ ├── README.markdown │ │ │ │ ├── token.go │ │ │ │ ├── token_const.go │ │ │ │ └── tokenfmt │ │ │ ├── type_arguments.go │ │ │ ├── type_array.go │ │ │ ├── type_boolean.go │ │ │ ├── type_date.go │ │ │ ├── type_error.go │ │ │ ├── type_function.go │ │ │ ├── type_go_array.go │ │ │ ├── type_go_map.go │ │ │ ├── type_go_slice.go │ │ │ ├── type_go_struct.go │ │ │ ├── type_number.go │ │ │ ├── type_reference.go │ │ │ ├── type_regexp.go │ │ │ ├── type_string.go │ │ │ ├── value.go │ │ │ ├── value_boolean.go │ │ │ ├── value_number.go │ │ │ ├── value_primitive.go │ │ │ └── value_string.go │ │ ├── robfig/ │ │ │ └── cron/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── constantdelay.go │ │ │ ├── cron.go │ │ │ ├── doc.go │ │ │ ├── parser.go │ │ │ └── spec.go │ │ ├── rs/ │ │ │ ├── cors/ │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── cors.go │ │ │ │ └── utils.go │ │ │ └── xhandler/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── chain.go │ │ │ ├── middleware.go │ │ │ └── xhandler.go │ │ ├── stretchr/ │ │ │ └── testify/ │ │ │ ├── LICENSE │ │ │ ├── assert/ │ │ │ │ ├── assertion_format.go │ │ │ │ ├── assertion_format.go.tmpl │ │ │ │ ├── assertion_forward.go │ │ │ │ ├── assertion_forward.go.tmpl │ │ │ │ ├── assertions.go │ │ │ │ ├── doc.go │ │ │ │ ├── errors.go │ │ │ │ ├── forward_assertions.go │ │ │ │ └── http_assertions.go │ │ │ └── require/ │ │ │ ├── doc.go │ │ │ ├── forward_requirements.go │ │ │ ├── require.go │ │ │ ├── require.go.tmpl │ │ │ ├── require_forward.go │ │ │ ├── require_forward.go.tmpl │ │ │ └── requirements.go │ │ ├── syndtr/ │ │ │ └── goleveldb/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ └── leveldb/ │ │ │ ├── batch.go │ │ │ ├── cache/ │ │ │ │ ├── cache.go │ │ │ │ └── lru.go │ │ │ ├── comparer/ │ │ │ │ ├── bytes_comparer.go │ │ │ │ └── comparer.go │ │ │ ├── comparer.go │ │ │ ├── db.go │ │ │ ├── db_compaction.go │ │ │ ├── db_iter.go │ │ │ ├── db_snapshot.go │ │ │ ├── db_state.go │ │ │ ├── db_transaction.go │ │ │ ├── db_util.go │ │ │ ├── db_write.go │ │ │ ├── doc.go │ │ │ ├── errors/ │ │ │ │ └── errors.go │ │ │ ├── errors.go │ │ │ ├── filter/ │ │ │ │ ├── bloom.go │ │ │ │ └── filter.go │ │ │ ├── filter.go │ │ │ ├── iterator/ │ │ │ │ ├── array_iter.go │ │ │ │ ├── indexed_iter.go │ │ │ │ ├── iter.go │ │ │ │ └── merged_iter.go │ │ │ ├── journal/ │ │ │ │ └── journal.go │ │ │ ├── key.go │ │ │ ├── memdb/ │ │ │ │ └── memdb.go │ │ │ ├── opt/ │ │ │ │ └── options.go │ │ │ ├── options.go │ │ │ ├── session.go │ │ │ ├── session_compaction.go │ │ │ ├── session_record.go │ │ │ ├── session_util.go │ │ │ ├── storage/ │ │ │ │ ├── file_storage.go │ │ │ │ ├── file_storage_nacl.go │ │ │ │ ├── file_storage_plan9.go │ │ │ │ ├── file_storage_solaris.go │ │ │ │ ├── file_storage_unix.go │ │ │ │ ├── file_storage_windows.go │ │ │ │ ├── mem_storage.go │ │ │ │ └── storage.go │ │ │ ├── storage.go │ │ │ ├── table/ │ │ │ │ ├── reader.go │ │ │ │ ├── table.go │ │ │ │ └── writer.go │ │ │ ├── table.go │ │ │ ├── util/ │ │ │ │ ├── buffer.go │ │ │ │ ├── buffer_pool.go │ │ │ │ ├── crc32.go │ │ │ │ ├── hash.go │ │ │ │ ├── range.go │ │ │ │ └── util.go │ │ │ ├── util.go │ │ │ └── version.go │ │ ├── tyler-smith/ │ │ │ └── go-bip39/ │ │ │ ├── Gopkg.toml │ │ │ ├── LICENSE │ │ │ ├── Makefile │ │ │ ├── README.md │ │ │ ├── bip39.go │ │ │ └── wordlists/ │ │ │ ├── chinese_simplified.go │ │ │ ├── chinese_traditional.go │ │ │ ├── english.go │ │ │ ├── french.go │ │ │ ├── italian.go │ │ │ ├── japanese.go │ │ │ ├── korean.go │ │ │ └── spanish.go │ │ └── uber/ │ │ ├── jaeger-client-go/ │ │ │ ├── CHANGELOG.md │ │ │ ├── CONTRIBUTING.md │ │ │ ├── DCO │ │ │ ├── Gopkg.toml │ │ │ ├── LICENSE │ │ │ ├── Makefile │ │ │ ├── README.md │ │ │ ├── RELEASE.md │ │ │ ├── baggage_setter.go │ │ │ ├── config/ │ │ │ │ ├── config.go │ │ │ │ ├── config_env.go │ │ │ │ └── options.go │ │ │ ├── constants.go │ │ │ ├── context.go │ │ │ ├── contrib_observer.go │ │ │ ├── doc.go │ │ │ ├── glide.yaml │ │ │ ├── header.go │ │ │ ├── internal/ │ │ │ │ ├── baggage/ │ │ │ │ │ ├── remote/ │ │ │ │ │ │ ├── options.go │ │ │ │ │ │ └── restriction_manager.go │ │ │ │ │ └── restriction_manager.go │ │ │ │ ├── spanlog/ │ │ │ │ │ └── json.go │ │ │ │ └── throttler/ │ │ │ │ ├── remote/ │ │ │ │ │ ├── options.go │ │ │ │ │ └── throttler.go │ │ │ │ └── throttler.go │ │ │ ├── interop.go │ │ │ ├── jaeger_tag.go │ │ │ ├── jaeger_thrift_span.go │ │ │ ├── log/ │ │ │ │ └── logger.go │ │ │ ├── logger.go │ │ │ ├── metrics.go │ │ │ ├── observer.go │ │ │ ├── process.go │ │ │ ├── propagation.go │ │ │ ├── reference.go │ │ │ ├── reporter.go │ │ │ ├── reporter_options.go │ │ │ ├── rpcmetrics/ │ │ │ │ ├── README.md │ │ │ │ ├── doc.go │ │ │ │ ├── endpoints.go │ │ │ │ ├── metrics.go │ │ │ │ ├── normalizer.go │ │ │ │ └── observer.go │ │ │ ├── sampler.go │ │ │ ├── sampler_options.go │ │ │ ├── span.go │ │ │ ├── thrift/ │ │ │ │ ├── README.md │ │ │ │ ├── application_exception.go │ │ │ │ ├── binary_protocol.go │ │ │ │ ├── compact_protocol.go │ │ │ │ ├── exception.go │ │ │ │ ├── memory_buffer.go │ │ │ │ ├── messagetype.go │ │ │ │ ├── numeric.go │ │ │ │ ├── processor.go │ │ │ │ ├── protocol.go │ │ │ │ ├── protocol_exception.go │ │ │ │ ├── protocol_factory.go │ │ │ │ ├── rich_transport.go │ │ │ │ ├── serializer.go │ │ │ │ ├── simple_json_protocol.go │ │ │ │ ├── transport.go │ │ │ │ ├── transport_exception.go │ │ │ │ ├── transport_factory.go │ │ │ │ └── type.go │ │ │ ├── thrift-gen/ │ │ │ │ ├── agent/ │ │ │ │ │ ├── agent.go │ │ │ │ │ ├── constants.go │ │ │ │ │ └── ttypes.go │ │ │ │ ├── baggage/ │ │ │ │ │ ├── baggagerestrictionmanager.go │ │ │ │ │ ├── constants.go │ │ │ │ │ └── ttypes.go │ │ │ │ ├── jaeger/ │ │ │ │ │ ├── agent.go │ │ │ │ │ ├── constants.go │ │ │ │ │ └── ttypes.go │ │ │ │ ├── sampling/ │ │ │ │ │ ├── constants.go │ │ │ │ │ ├── samplingmanager.go │ │ │ │ │ └── ttypes.go │ │ │ │ └── zipkincore/ │ │ │ │ ├── constants.go │ │ │ │ ├── ttypes.go │ │ │ │ └── zipkincollector.go │ │ │ ├── tracer.go │ │ │ ├── tracer_options.go │ │ │ ├── transport.go │ │ │ ├── transport_udp.go │ │ │ ├── utils/ │ │ │ │ ├── http_json.go │ │ │ │ ├── localip.go │ │ │ │ ├── rand.go │ │ │ │ ├── rate_limiter.go │ │ │ │ ├── udp_client.go │ │ │ │ └── utils.go │ │ │ ├── zipkin.go │ │ │ └── zipkin_thrift_span.go │ │ └── jaeger-lib/ │ │ ├── LICENSE │ │ └── metrics/ │ │ ├── counter.go │ │ ├── factory.go │ │ ├── gauge.go │ │ ├── local.go │ │ ├── metrics.go │ │ ├── stopwatch.go │ │ └── timer.go │ ├── golang.org/ │ │ └── x/ │ │ ├── crypto/ │ │ │ ├── .gitattributes │ │ │ ├── .gitignore │ │ │ ├── AUTHORS │ │ │ ├── CONTRIBUTING.md │ │ │ ├── CONTRIBUTORS │ │ │ ├── LICENSE │ │ │ ├── PATENTS │ │ │ ├── README │ │ │ ├── cast5/ │ │ │ │ └── cast5.go │ │ │ ├── codereview.cfg │ │ │ ├── curve25519/ │ │ │ │ ├── const_amd64.h │ │ │ │ ├── const_amd64.s │ │ │ │ ├── cswap_amd64.s │ │ │ │ ├── curve25519.go │ │ │ │ ├── doc.go │ │ │ │ ├── freeze_amd64.s │ │ │ │ ├── ladderstep_amd64.s │ │ │ │ ├── mont25519_amd64.go │ │ │ │ ├── mul_amd64.s │ │ │ │ └── square_amd64.s │ │ │ ├── ed25519/ │ │ │ │ ├── ed25519.go │ │ │ │ └── internal/ │ │ │ │ └── edwards25519/ │ │ │ │ ├── const.go │ │ │ │ └── edwards25519.go │ │ │ ├── openpgp/ │ │ │ │ ├── armor/ │ │ │ │ │ ├── armor.go │ │ │ │ │ └── encode.go │ │ │ │ ├── canonical_text.go │ │ │ │ ├── elgamal/ │ │ │ │ │ └── elgamal.go │ │ │ │ ├── errors/ │ │ │ │ │ └── errors.go │ │ │ │ ├── keys.go │ │ │ │ ├── packet/ │ │ │ │ │ ├── compressed.go │ │ │ │ │ ├── config.go │ │ │ │ │ ├── encrypted_key.go │ │ │ │ │ ├── literal.go │ │ │ │ │ ├── ocfb.go │ │ │ │ │ ├── one_pass_signature.go │ │ │ │ │ ├── opaque.go │ │ │ │ │ ├── packet.go │ │ │ │ │ ├── private_key.go │ │ │ │ │ ├── public_key.go │ │ │ │ │ ├── public_key_v3.go │ │ │ │ │ ├── reader.go │ │ │ │ │ ├── signature.go │ │ │ │ │ ├── signature_v3.go │ │ │ │ │ ├── symmetric_key_encrypted.go │ │ │ │ │ ├── symmetrically_encrypted.go │ │ │ │ │ ├── userattribute.go │ │ │ │ │ └── userid.go │ │ │ │ ├── read.go │ │ │ │ ├── s2k/ │ │ │ │ │ └── s2k.go │ │ │ │ └── write.go │ │ │ ├── pbkdf2/ │ │ │ │ └── pbkdf2.go │ │ │ ├── ripemd160/ │ │ │ │ ├── ripemd160.go │ │ │ │ └── ripemd160block.go │ │ │ ├── scrypt/ │ │ │ │ └── scrypt.go │ │ │ └── ssh/ │ │ │ ├── buffer.go │ │ │ ├── certs.go │ │ │ ├── channel.go │ │ │ ├── cipher.go │ │ │ ├── client.go │ │ │ ├── client_auth.go │ │ │ ├── common.go │ │ │ ├── connection.go │ │ │ ├── doc.go │ │ │ ├── handshake.go │ │ │ ├── kex.go │ │ │ ├── keys.go │ │ │ ├── mac.go │ │ │ ├── messages.go │ │ │ ├── mux.go │ │ │ ├── server.go │ │ │ ├── session.go │ │ │ ├── streamlocal.go │ │ │ ├── tcpip.go │ │ │ ├── terminal/ │ │ │ │ ├── terminal.go │ │ │ │ ├── util.go │ │ │ │ ├── util_bsd.go │ │ │ │ ├── util_linux.go │ │ │ │ ├── util_plan9.go │ │ │ │ ├── util_solaris.go │ │ │ │ └── util_windows.go │ │ │ └── transport.go │ │ ├── net/ │ │ │ ├── .gitattributes │ │ │ ├── .gitignore │ │ │ ├── AUTHORS │ │ │ ├── CONTRIBUTING.md │ │ │ ├── CONTRIBUTORS │ │ │ ├── LICENSE │ │ │ ├── PATENTS │ │ │ ├── README │ │ │ ├── codereview.cfg │ │ │ ├── context/ │ │ │ │ ├── context.go │ │ │ │ ├── go17.go │ │ │ │ └── pre_go17.go │ │ │ ├── html/ │ │ │ │ ├── atom/ │ │ │ │ │ ├── atom.go │ │ │ │ │ ├── gen.go │ │ │ │ │ └── table.go │ │ │ │ ├── charset/ │ │ │ │ │ └── charset.go │ │ │ │ ├── const.go │ │ │ │ ├── doc.go │ │ │ │ ├── doctype.go │ │ │ │ ├── entity.go │ │ │ │ ├── escape.go │ │ │ │ ├── foreign.go │ │ │ │ ├── node.go │ │ │ │ ├── parse.go │ │ │ │ ├── render.go │ │ │ │ └── token.go │ │ │ ├── idna/ │ │ │ │ ├── idna.go │ │ │ │ ├── punycode.go │ │ │ │ ├── tables.go │ │ │ │ ├── trie.go │ │ │ │ └── trieval.go │ │ │ └── websocket/ │ │ │ ├── client.go │ │ │ ├── dial.go │ │ │ ├── hybi.go │ │ │ ├── server.go │ │ │ └── websocket.go │ │ ├── sync/ │ │ │ ├── LICENSE │ │ │ ├── PATENTS │ │ │ └── syncmap/ │ │ │ └── map.go │ │ ├── sys/ │ │ │ ├── .gitattributes │ │ │ ├── .gitignore │ │ │ ├── AUTHORS │ │ │ ├── CONTRIBUTING.md │ │ │ ├── CONTRIBUTORS │ │ │ ├── LICENSE │ │ │ ├── PATENTS │ │ │ ├── README │ │ │ ├── codereview.cfg │ │ │ ├── unix/ │ │ │ │ ├── README.md │ │ │ │ ├── asm_darwin_386.s │ │ │ │ ├── asm_darwin_amd64.s │ │ │ │ ├── asm_darwin_arm.s │ │ │ │ ├── asm_darwin_arm64.s │ │ │ │ ├── asm_dragonfly_amd64.s │ │ │ │ ├── asm_freebsd_386.s │ │ │ │ ├── asm_freebsd_amd64.s │ │ │ │ ├── asm_freebsd_arm.s │ │ │ │ ├── asm_linux_386.s │ │ │ │ ├── asm_linux_amd64.s │ │ │ │ ├── asm_linux_arm.s │ │ │ │ ├── asm_linux_arm64.s │ │ │ │ ├── asm_linux_mips64x.s │ │ │ │ ├── asm_linux_mipsx.s │ │ │ │ ├── asm_linux_ppc64x.s │ │ │ │ ├── asm_linux_s390x.s │ │ │ │ ├── asm_netbsd_386.s │ │ │ │ ├── asm_netbsd_amd64.s │ │ │ │ ├── asm_netbsd_arm.s │ │ │ │ ├── asm_openbsd_386.s │ │ │ │ ├── asm_openbsd_amd64.s │ │ │ │ ├── asm_openbsd_arm.s │ │ │ │ ├── asm_solaris_amd64.s │ │ │ │ ├── bluetooth_linux.go │ │ │ │ ├── cap_freebsd.go │ │ │ │ ├── constants.go │ │ │ │ ├── dev_darwin.go │ │ │ │ ├── dev_dragonfly.go │ │ │ │ ├── dev_freebsd.go │ │ │ │ ├── dev_linux.go │ │ │ │ ├── dev_netbsd.go │ │ │ │ ├── dev_openbsd.go │ │ │ │ ├── dirent.go │ │ │ │ ├── endian_big.go │ │ │ │ ├── endian_little.go │ │ │ │ ├── env_unix.go │ │ │ │ ├── env_unset.go │ │ │ │ ├── errors_freebsd_386.go │ │ │ │ ├── errors_freebsd_amd64.go │ │ │ │ ├── errors_freebsd_arm.go │ │ │ │ ├── flock.go │ │ │ │ ├── flock_linux_32bit.go │ │ │ │ ├── gccgo.go │ │ │ │ ├── gccgo_c.c │ │ │ │ ├── gccgo_linux_amd64.go │ │ │ │ ├── mkall.sh │ │ │ │ ├── mkerrors.sh │ │ │ │ ├── mksyscall.pl │ │ │ │ ├── mksyscall_solaris.pl │ │ │ │ ├── mksysctl_openbsd.pl │ │ │ │ ├── mksysnum_darwin.pl │ │ │ │ ├── mksysnum_dragonfly.pl │ │ │ │ ├── mksysnum_freebsd.pl │ │ │ │ ├── mksysnum_netbsd.pl │ │ │ │ ├── mksysnum_openbsd.pl │ │ │ │ ├── openbsd_pledge.go │ │ │ │ ├── pagesize_unix.go │ │ │ │ ├── race.go │ │ │ │ ├── race0.go │ │ │ │ ├── sockcmsg_linux.go │ │ │ │ ├── sockcmsg_unix.go │ │ │ │ ├── str.go │ │ │ │ ├── syscall.go │ │ │ │ ├── syscall_bsd.go │ │ │ │ ├── syscall_darwin.go │ │ │ │ ├── syscall_darwin_386.go │ │ │ │ ├── syscall_darwin_amd64.go │ │ │ │ ├── syscall_darwin_arm.go │ │ │ │ ├── syscall_darwin_arm64.go │ │ │ │ ├── syscall_dragonfly.go │ │ │ │ ├── syscall_dragonfly_amd64.go │ │ │ │ ├── syscall_freebsd.go │ │ │ │ ├── syscall_freebsd_386.go │ │ │ │ ├── syscall_freebsd_amd64.go │ │ │ │ ├── syscall_freebsd_arm.go │ │ │ │ ├── syscall_linux.go │ │ │ │ ├── syscall_linux_386.go │ │ │ │ ├── syscall_linux_amd64.go │ │ │ │ ├── syscall_linux_amd64_gc.go │ │ │ │ ├── syscall_linux_arm.go │ │ │ │ ├── syscall_linux_arm64.go │ │ │ │ ├── syscall_linux_mips64x.go │ │ │ │ ├── syscall_linux_mipsx.go │ │ │ │ ├── syscall_linux_ppc64x.go │ │ │ │ ├── syscall_linux_s390x.go │ │ │ │ ├── syscall_linux_sparc64.go │ │ │ │ ├── syscall_netbsd.go │ │ │ │ ├── syscall_netbsd_386.go │ │ │ │ ├── syscall_netbsd_amd64.go │ │ │ │ ├── syscall_netbsd_arm.go │ │ │ │ ├── syscall_no_getwd.go │ │ │ │ ├── syscall_openbsd.go │ │ │ │ ├── syscall_openbsd_386.go │ │ │ │ ├── syscall_openbsd_amd64.go │ │ │ │ ├── syscall_openbsd_arm.go │ │ │ │ ├── syscall_solaris.go │ │ │ │ ├── syscall_solaris_amd64.go │ │ │ │ ├── syscall_unix.go │ │ │ │ ├── syscall_unix_gc.go │ │ │ │ ├── timestruct.go │ │ │ │ ├── zerrors_darwin_386.go │ │ │ │ ├── zerrors_darwin_amd64.go │ │ │ │ ├── zerrors_darwin_arm.go │ │ │ │ ├── zerrors_darwin_arm64.go │ │ │ │ ├── zerrors_dragonfly_amd64.go │ │ │ │ ├── zerrors_freebsd_386.go │ │ │ │ ├── zerrors_freebsd_amd64.go │ │ │ │ ├── zerrors_freebsd_arm.go │ │ │ │ ├── zerrors_linux_386.go │ │ │ │ ├── zerrors_linux_amd64.go │ │ │ │ ├── zerrors_linux_arm.go │ │ │ │ ├── zerrors_linux_arm64.go │ │ │ │ ├── zerrors_linux_mips.go │ │ │ │ ├── zerrors_linux_mips64.go │ │ │ │ ├── zerrors_linux_mips64le.go │ │ │ │ ├── zerrors_linux_mipsle.go │ │ │ │ ├── zerrors_linux_ppc64.go │ │ │ │ ├── zerrors_linux_ppc64le.go │ │ │ │ ├── zerrors_linux_s390x.go │ │ │ │ ├── zerrors_linux_sparc64.go │ │ │ │ ├── zerrors_netbsd_386.go │ │ │ │ ├── zerrors_netbsd_amd64.go │ │ │ │ ├── zerrors_netbsd_arm.go │ │ │ │ ├── zerrors_openbsd_386.go │ │ │ │ ├── zerrors_openbsd_amd64.go │ │ │ │ ├── zerrors_openbsd_arm.go │ │ │ │ ├── zerrors_solaris_amd64.go │ │ │ │ ├── zptrace386_linux.go │ │ │ │ ├── zptracearm_linux.go │ │ │ │ ├── zptracemips_linux.go │ │ │ │ ├── zptracemipsle_linux.go │ │ │ │ ├── zsyscall_darwin_386.go │ │ │ │ ├── zsyscall_darwin_amd64.go │ │ │ │ ├── zsyscall_darwin_arm.go │ │ │ │ ├── zsyscall_darwin_arm64.go │ │ │ │ ├── zsyscall_dragonfly_amd64.go │ │ │ │ ├── zsyscall_freebsd_386.go │ │ │ │ ├── zsyscall_freebsd_amd64.go │ │ │ │ ├── zsyscall_freebsd_arm.go │ │ │ │ ├── zsyscall_linux_386.go │ │ │ │ ├── zsyscall_linux_amd64.go │ │ │ │ ├── zsyscall_linux_arm.go │ │ │ │ ├── zsyscall_linux_arm64.go │ │ │ │ ├── zsyscall_linux_mips.go │ │ │ │ ├── zsyscall_linux_mips64.go │ │ │ │ ├── zsyscall_linux_mips64le.go │ │ │ │ ├── zsyscall_linux_mipsle.go │ │ │ │ ├── zsyscall_linux_ppc64.go │ │ │ │ ├── zsyscall_linux_ppc64le.go │ │ │ │ ├── zsyscall_linux_s390x.go │ │ │ │ ├── zsyscall_linux_sparc64.go │ │ │ │ ├── zsyscall_netbsd_386.go │ │ │ │ ├── zsyscall_netbsd_amd64.go │ │ │ │ ├── zsyscall_netbsd_arm.go │ │ │ │ ├── zsyscall_openbsd_386.go │ │ │ │ ├── zsyscall_openbsd_amd64.go │ │ │ │ ├── zsyscall_openbsd_arm.go │ │ │ │ ├── zsyscall_solaris_amd64.go │ │ │ │ ├── zsysctl_openbsd_386.go │ │ │ │ ├── zsysctl_openbsd_amd64.go │ │ │ │ ├── zsysctl_openbsd_arm.go │ │ │ │ ├── zsysnum_darwin_386.go │ │ │ │ ├── zsysnum_darwin_amd64.go │ │ │ │ ├── zsysnum_darwin_arm.go │ │ │ │ ├── zsysnum_darwin_arm64.go │ │ │ │ ├── zsysnum_dragonfly_amd64.go │ │ │ │ ├── zsysnum_freebsd_386.go │ │ │ │ ├── zsysnum_freebsd_amd64.go │ │ │ │ ├── zsysnum_freebsd_arm.go │ │ │ │ ├── zsysnum_linux_386.go │ │ │ │ ├── zsysnum_linux_amd64.go │ │ │ │ ├── zsysnum_linux_arm.go │ │ │ │ ├── zsysnum_linux_arm64.go │ │ │ │ ├── zsysnum_linux_mips.go │ │ │ │ ├── zsysnum_linux_mips64.go │ │ │ │ ├── zsysnum_linux_mips64le.go │ │ │ │ ├── zsysnum_linux_mipsle.go │ │ │ │ ├── zsysnum_linux_ppc64.go │ │ │ │ ├── zsysnum_linux_ppc64le.go │ │ │ │ ├── zsysnum_linux_s390x.go │ │ │ │ ├── zsysnum_linux_sparc64.go │ │ │ │ ├── zsysnum_netbsd_386.go │ │ │ │ ├── zsysnum_netbsd_amd64.go │ │ │ │ ├── zsysnum_netbsd_arm.go │ │ │ │ ├── zsysnum_openbsd_386.go │ │ │ │ ├── zsysnum_openbsd_amd64.go │ │ │ │ ├── zsysnum_openbsd_arm.go │ │ │ │ ├── zsysnum_solaris_amd64.go │ │ │ │ ├── ztypes_darwin_386.go │ │ │ │ ├── ztypes_darwin_amd64.go │ │ │ │ ├── ztypes_darwin_arm.go │ │ │ │ ├── ztypes_darwin_arm64.go │ │ │ │ ├── ztypes_dragonfly_amd64.go │ │ │ │ ├── ztypes_freebsd_386.go │ │ │ │ ├── ztypes_freebsd_amd64.go │ │ │ │ ├── ztypes_freebsd_arm.go │ │ │ │ ├── ztypes_linux_386.go │ │ │ │ ├── ztypes_linux_amd64.go │ │ │ │ ├── ztypes_linux_arm.go │ │ │ │ ├── ztypes_linux_arm64.go │ │ │ │ ├── ztypes_linux_mips.go │ │ │ │ ├── ztypes_linux_mips64.go │ │ │ │ ├── ztypes_linux_mips64le.go │ │ │ │ ├── ztypes_linux_mipsle.go │ │ │ │ ├── ztypes_linux_ppc64.go │ │ │ │ ├── ztypes_linux_ppc64le.go │ │ │ │ ├── ztypes_linux_s390x.go │ │ │ │ ├── ztypes_linux_sparc64.go │ │ │ │ ├── ztypes_netbsd_386.go │ │ │ │ ├── ztypes_netbsd_amd64.go │ │ │ │ ├── ztypes_netbsd_arm.go │ │ │ │ ├── ztypes_openbsd_386.go │ │ │ │ ├── ztypes_openbsd_amd64.go │ │ │ │ ├── ztypes_openbsd_arm.go │ │ │ │ └── ztypes_solaris_amd64.go │ │ │ └── windows/ │ │ │ ├── asm_windows_386.s │ │ │ ├── asm_windows_amd64.s │ │ │ ├── dll_windows.go │ │ │ ├── env_unset.go │ │ │ ├── env_windows.go │ │ │ ├── eventlog.go │ │ │ ├── exec_windows.go │ │ │ ├── memory_windows.go │ │ │ ├── mksyscall.go │ │ │ ├── race.go │ │ │ ├── race0.go │ │ │ ├── security_windows.go │ │ │ ├── service.go │ │ │ ├── str.go │ │ │ ├── syscall.go │ │ │ ├── syscall_windows.go │ │ │ ├── types_windows.go │ │ │ ├── types_windows_386.go │ │ │ ├── types_windows_amd64.go │ │ │ └── zsyscall_windows.go │ │ ├── text/ │ │ │ ├── .gitattributes │ │ │ ├── .gitignore │ │ │ ├── AUTHORS │ │ │ ├── CONTRIBUTING.md │ │ │ ├── CONTRIBUTORS │ │ │ ├── LICENSE │ │ │ ├── PATENTS │ │ │ ├── README │ │ │ ├── codereview.cfg │ │ │ ├── encoding/ │ │ │ │ ├── charmap/ │ │ │ │ │ ├── charmap.go │ │ │ │ │ ├── maketables.go │ │ │ │ │ └── tables.go │ │ │ │ ├── encoding.go │ │ │ │ ├── htmlindex/ │ │ │ │ │ ├── gen.go │ │ │ │ │ ├── htmlindex.go │ │ │ │ │ ├── map.go │ │ │ │ │ └── tables.go │ │ │ │ ├── internal/ │ │ │ │ │ ├── identifier/ │ │ │ │ │ │ ├── gen.go │ │ │ │ │ │ ├── identifier.go │ │ │ │ │ │ └── mib.go │ │ │ │ │ └── internal.go │ │ │ │ ├── japanese/ │ │ │ │ │ ├── all.go │ │ │ │ │ ├── eucjp.go │ │ │ │ │ ├── iso2022jp.go │ │ │ │ │ ├── maketables.go │ │ │ │ │ ├── shiftjis.go │ │ │ │ │ └── tables.go │ │ │ │ ├── korean/ │ │ │ │ │ ├── euckr.go │ │ │ │ │ ├── maketables.go │ │ │ │ │ └── tables.go │ │ │ │ ├── simplifiedchinese/ │ │ │ │ │ ├── all.go │ │ │ │ │ ├── gbk.go │ │ │ │ │ ├── hzgb2312.go │ │ │ │ │ ├── maketables.go │ │ │ │ │ └── tables.go │ │ │ │ ├── traditionalchinese/ │ │ │ │ │ ├── big5.go │ │ │ │ │ ├── maketables.go │ │ │ │ │ └── tables.go │ │ │ │ └── unicode/ │ │ │ │ ├── override.go │ │ │ │ └── unicode.go │ │ │ ├── internal/ │ │ │ │ ├── tag/ │ │ │ │ │ └── tag.go │ │ │ │ └── utf8internal/ │ │ │ │ └── utf8internal.go │ │ │ ├── language/ │ │ │ │ ├── Makefile │ │ │ │ ├── common.go │ │ │ │ ├── coverage.go │ │ │ │ ├── gen_common.go │ │ │ │ ├── gen_index.go │ │ │ │ ├── go1_1.go │ │ │ │ ├── go1_2.go │ │ │ │ ├── index.go │ │ │ │ ├── language.go │ │ │ │ ├── lookup.go │ │ │ │ ├── maketables.go │ │ │ │ ├── match.go │ │ │ │ ├── parse.go │ │ │ │ ├── tables.go │ │ │ │ └── tags.go │ │ │ ├── runes/ │ │ │ │ ├── cond.go │ │ │ │ └── runes.go │ │ │ ├── secure/ │ │ │ │ └── bidirule/ │ │ │ │ ├── bidirule.go │ │ │ │ ├── bidirule10.0.0.go │ │ │ │ └── bidirule9.0.0.go │ │ │ ├── transform/ │ │ │ │ └── transform.go │ │ │ └── unicode/ │ │ │ ├── bidi/ │ │ │ │ ├── bidi.go │ │ │ │ ├── bracket.go │ │ │ │ ├── core.go │ │ │ │ ├── prop.go │ │ │ │ ├── tables10.0.0.go │ │ │ │ ├── tables9.0.0.go │ │ │ │ └── trieval.go │ │ │ └── norm/ │ │ │ ├── composition.go │ │ │ ├── forminfo.go │ │ │ ├── input.go │ │ │ ├── iter.go │ │ │ ├── normalize.go │ │ │ ├── readwriter.go │ │ │ ├── tables10.0.0.go │ │ │ ├── tables9.0.0.go │ │ │ ├── transform.go │ │ │ └── trie.go │ │ └── tools/ │ │ ├── .gitattributes │ │ ├── .gitignore │ │ ├── AUTHORS │ │ ├── CONTRIBUTING.md │ │ ├── CONTRIBUTORS │ │ ├── LICENSE │ │ ├── PATENTS │ │ ├── README │ │ ├── codereview.cfg │ │ ├── go/ │ │ │ └── ast/ │ │ │ └── astutil/ │ │ │ ├── enclosing.go │ │ │ ├── imports.go │ │ │ └── util.go │ │ └── imports/ │ │ ├── fastwalk.go │ │ ├── fastwalk_dirent_fileno.go │ │ ├── fastwalk_dirent_ino.go │ │ ├── fastwalk_portable.go │ │ ├── fastwalk_unix.go │ │ ├── fix.go │ │ ├── imports.go │ │ ├── mkindex.go │ │ ├── mkstdlib.go │ │ ├── sortimports.go │ │ └── zstdlib.go │ ├── gopkg.in/ │ │ ├── bsm/ │ │ │ └── ratelimit.v1/ │ │ │ ├── Makefile │ │ │ ├── README.md │ │ │ └── ratelimit.go │ │ ├── check.v1/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── TODO │ │ │ ├── benchmark.go │ │ │ ├── check.go │ │ │ ├── checkers.go │ │ │ ├── helpers.go │ │ │ ├── printer.go │ │ │ ├── reporter.go │ │ │ └── run.go │ │ ├── karalabe/ │ │ │ └── cookiejar.v2/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ └── collections/ │ │ │ └── prque/ │ │ │ ├── prque.go │ │ │ └── sstack.go │ │ ├── natefinch/ │ │ │ └── npipe.v2/ │ │ │ ├── LICENSE.txt │ │ │ ├── README.md │ │ │ ├── doc.go │ │ │ ├── npipe_windows.go │ │ │ ├── znpipe_windows_386.go │ │ │ └── znpipe_windows_amd64.go │ │ ├── olebedev/ │ │ │ └── go-duktape.v3/ │ │ │ ├── Gopkg.toml │ │ │ ├── LICENSE.md │ │ │ ├── README.md │ │ │ ├── api.go │ │ │ ├── appveyor.yml │ │ │ ├── conts.go │ │ │ ├── duk_alloc_pool.c │ │ │ ├── duk_alloc_pool.h │ │ │ ├── duk_config.h │ │ │ ├── duk_console.c │ │ │ ├── duk_console.h │ │ │ ├── duk_logging.c │ │ │ ├── duk_logging.h │ │ │ ├── duk_minimal_printf.c │ │ │ ├── duk_minimal_printf.h │ │ │ ├── duk_module_duktape.c │ │ │ ├── duk_module_duktape.h │ │ │ ├── duk_module_node.c │ │ │ ├── duk_module_node.h │ │ │ ├── duk_print_alert.c │ │ │ ├── duk_print_alert.h │ │ │ ├── duk_v1_compat.c │ │ │ ├── duk_v1_compat.h │ │ │ ├── duktape.c │ │ │ ├── duktape.go │ │ │ ├── duktape.h │ │ │ ├── timers.go │ │ │ ├── utils.go │ │ │ └── wercker.yml │ │ ├── redis.v3/ │ │ │ ├── LICENSE │ │ │ ├── Makefile │ │ │ ├── README.md │ │ │ ├── cluster.go │ │ │ ├── cluster_pipeline.go │ │ │ ├── command.go │ │ │ ├── commands.go │ │ │ ├── doc.go │ │ │ ├── error.go │ │ │ ├── internal/ │ │ │ │ ├── consistenthash/ │ │ │ │ │ └── consistenthash.go │ │ │ │ ├── hashtag/ │ │ │ │ │ └── hashtag.go │ │ │ │ ├── log.go │ │ │ │ └── pool/ │ │ │ │ ├── conn.go │ │ │ │ ├── pool.go │ │ │ │ ├── pool_single.go │ │ │ │ └── pool_sticky.go │ │ │ ├── multi.go │ │ │ ├── options.go │ │ │ ├── parser.go │ │ │ ├── pipeline.go │ │ │ ├── pubsub.go │ │ │ ├── redis.go │ │ │ ├── ring.go │ │ │ ├── safe.go │ │ │ ├── script.go │ │ │ ├── sentinel.go │ │ │ └── unsafe.go │ │ ├── sourcemap.v1/ │ │ │ ├── LICENSE │ │ │ ├── Makefile │ │ │ ├── README.md │ │ │ ├── base64vlq/ │ │ │ │ └── base64_vlq.go │ │ │ ├── consumer.go │ │ │ └── sourcemap.go │ │ └── urfave/ │ │ └── cli.v1/ │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── app.go │ │ ├── appveyor.yml │ │ ├── category.go │ │ ├── cli.go │ │ ├── command.go │ │ ├── context.go │ │ ├── errors.go │ │ ├── flag-types.json │ │ ├── flag.go │ │ ├── flag_generated.go │ │ ├── funcs.go │ │ ├── generate-flag-types │ │ ├── help.go │ │ └── runtests │ └── vendor.json ├── voter/ │ ├── backend.go │ ├── utils.go │ └── voter.go └── zero/ ├── account/ │ ├── address.go │ └── address_test.go ├── consensus/ │ ├── bytes.go │ ├── cons.go │ ├── cons_test.go │ ├── dbobj.go │ ├── fakedb.go │ ├── iface.go │ ├── kvpoint.go │ └── objpoint.go ├── localdb/ │ ├── block.go │ ├── out.go │ ├── out_commitment.go │ ├── out_test.go │ ├── out_vserial.go │ ├── outstat.go │ ├── pkg.go │ └── root.go ├── proofservice/ │ ├── client.go │ └── proofservice.go ├── snapshot/ │ ├── generator.go │ └── snapshot_test.go ├── stake/ │ ├── Hash256PRNG.go │ ├── ITree.go │ ├── avltree.go │ ├── avltree_test.go │ ├── sharepool.go │ ├── sharepool_test.go │ ├── stakeConfig.go │ ├── tree.go │ └── tree_test.go ├── txs/ │ ├── assets/ │ │ ├── assets.go │ │ ├── ckstate.go │ │ ├── ckstate_test.go │ │ ├── flat_asset.go │ │ ├── ticket.go │ │ └── token.go │ ├── outs.go │ ├── pkg/ │ │ ├── opkg.go │ │ ├── tools.go │ │ └── zpkg.go │ ├── stx/ │ │ ├── cmd.go │ │ ├── cmd_test.go │ │ ├── gen_contractCmd_json.go │ │ ├── hash_v1.go │ │ ├── pkg.go │ │ ├── stx_v0/ │ │ │ ├── otx.go │ │ │ ├── tx.go │ │ │ └── ztx.go │ │ ├── stx_v1/ │ │ │ ├── ctx.go │ │ │ ├── ptx.go │ │ │ └── zktx.go │ │ ├── typeserial.go │ │ ├── ztx.go │ │ └── ztx_test.go │ ├── test/ │ │ ├── txs.go │ │ └── txs_test.go │ ├── tx/ │ │ ├── tx.go │ │ └── tx_test.go │ └── zstate/ │ ├── merkle/ │ │ ├── merkle.go │ │ ├── merkle_test.go │ │ └── utils.go │ ├── pkgstate/ │ │ ├── data/ │ │ │ ├── data.go │ │ │ └── data_state.go │ │ └── state.go │ ├── tri/ │ │ └── tri.go │ ├── txstate/ │ │ ├── data/ │ │ │ ├── data.go │ │ │ ├── data_state.go │ │ │ ├── iface.go │ │ │ └── meta.go │ │ ├── data_v1/ │ │ │ ├── data.go │ │ │ └── data_state.go │ │ ├── debug.go │ │ ├── merkle.go │ │ └── state.go │ └── zstate.go ├── txtool/ │ ├── flight/ │ │ ├── sli.go │ │ ├── sli_test.go │ │ ├── sri.go │ │ ├── tx.go │ │ └── types.go │ ├── generate/ │ │ ├── generate.go │ │ └── generate_1/ │ │ ├── prove.go │ │ ├── prove_proc.go │ │ ├── sign.go │ │ ├── sign_test.go │ │ └── utils.go │ ├── gtx_test.go │ ├── iface.go │ ├── main.go │ ├── prepare/ │ │ ├── prepare.go │ │ ├── preparetx.go │ │ └── types.go │ ├── type.go │ └── verify/ │ ├── verify.go │ ├── verify_1/ │ │ ├── input_c_pool.go │ │ ├── output_c_pool.go │ │ ├── pkg_pool.go │ │ ├── verify_proof.go │ │ ├── verify_state.go │ │ └── verify_static.go │ └── verify_utils/ │ └── utils.go ├── utils/ │ ├── base58.go │ ├── deep_copy.go │ ├── dirtys.go │ ├── h2hash.go │ ├── hset.go │ ├── i256.go │ ├── pkrs_check.go │ ├── process.go │ ├── progress.go │ ├── snapshot.go │ ├── time_record.go │ ├── u256.go │ ├── u256_test.go │ ├── utils.go │ ├── utils_test.go │ └── work_chain.go ├── wallet/ │ ├── exchange/ │ │ ├── exchange.go │ │ ├── generate.go │ │ ├── pkg.go │ │ ├── utxo.go │ │ └── utxo_version.go │ ├── light/ │ │ ├── api.go │ │ ├── api_test.go │ │ └── light.go │ ├── ssi/ │ │ ├── ssi.go │ │ ├── type.go │ │ └── utils.go │ └── stakeservice/ │ └── stakeservice.go └── zconfig/ ├── backup.go ├── balance.go ├── checkpoint.go ├── checkpoint_test.go ├── exchange.go ├── light.go ├── main.go ├── main_test.go ├── runtime.go ├── snapshot.go └── stake.go ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ git# See http://help.github.com/ignore-files/ for more about ignoring files. # # If you find yourself ignoring temporary files generated by your text editor # or operating system, you probably want to add a global ignore instead: # git config --global core.excludesfile ~/.gitignore_global /tmp */**/*un~ */**/*.test *un~ .DS_Store */**/.DS_Store .ethtest */**/*tx_database* */**/*dapps* build/_vendor/pkg #* .#* *# *~ .project .settings # used by the Makefile /build/_workspace/ /build/bin/ /geth*.zip # travis profile.tmp profile.cov # IdeaIDE .idea # VS Code .vscode # dashboard /dashboard/assets/flow-typed /dashboard/assets/node_modules /dashboard/assets/stats.json /dashboard/assets/bundle.js /dashboard/assets/package-lock.json **/yarn-error.log cgu config.ini build/package build/geropkg/bin build/geropkg/czero build/geropkg_*.tar.gz build/geropkg-*.tar.gz build/geropkg-*.zip build/gero-*.tar.gz build/gero-*.zip build/gerotx-*.tar.gz build/gerotx-*.zip build/*posGero* build/posGero-*.* makePos.sh /pkg build/deploy.sh containers/docker/gero-ubuntu/gero-*.tar pullup ================================================ FILE: AUTHORS ================================================ # This is the official list of go-ethereum authors for copyright purposes. Afri Schoedon <5chdn@users.noreply.github.com> Agustin Armellini Fischer Airead Alan Chen Alejandro Isaza Ales Katona Alex Leverington Alex Wu Alexandre Van de Sande Ali Hajimirza Anton Evangelatov Arba Sasmoyo Armani Ferrante Armin Braun Aron Fischer Bas van Kervel Benjamin Brent Benoit Verkindt Bo Bo Ye Bob Glickstein Brian Schroeder Casey Detrio Chase Wright Christoph Jentzsch Daniel A. Nagy Daniel Sloof Darrel Herbst Dave Appleton Diego Siqueira Dmitry Shulyak Egon Elbre Elias Naur Elliot Shepherd Enrique Fynn Ernesto del Toro Ethan Buchman Eugene Valeyev Evangelos Pappas Evgeny Danilenko <6655321@bk.ru> Fabian Vogelsteller Fabio Barone Fabio Berger FaceHo Felix Lange Fiisio Frank Wang Furkan KAMACI Gary Rong George Ornbo Gregg Dourgarian Guillaume Ballet Guillaume Nicolas Gustav Simonsson Hao Bryan Cheng Henning Diedrich Isidoro Ghezzi Ivan Daniluk Jae Kwon Jamie Pitts Janoš Guljaš Jason Carver Jay Guo Jeff R. Allen Jeffrey Wilcke Jens Agerberg Jia Chenhui Jim McDonald Joel Burget Jonathan Brown Joseph Chow Justin Clark-Casey Justin Drake Kenji Siu Kobi Gurkan Konrad Feldmeier Kurkó Mihály Kyuntae Ethan Kim Lefteris Karapetsas Leif Jurvetson Leo Shklovskii Lewis Marshall Lio李欧 Louis Holbrook Luca Zeug Magicking Maran Hidskes Marek Kotewicz Mark Martin Holst Swende Matthew Di Ferrante Matthew Wampler-Doty Maximilian Meister Micah Zoltu Michael Ruminer Miguel Mota Miya Chen Nchinda Nchinda Nick Dodson Nick Johnson Nicolas Guillaume Noman Oli Bye Paul Litvak Paulo L F Casaretto Paweł Bylica Peter Pratscher Petr Mikusek Péter Szilágyi RJ Catalano Ramesh Nair Ricardo Catalinas Jiménez Ricardo Domingos Richard Hart Rob Robert Zaremba Russ Cox Rémy Roy S. Matthew English Shintaro Kaneko Sorin Neacsu Stein Dekker Steve Waldman Steven Roose Taylor Gerring Thomas Bocek Ti Zhou Tosh Camille Valentin Wüstholz Victor Farazdagi Victor Tran Viktor Trón Ville Sundell Vincent G Vitalik Buterin Vitaly V Vivek Anand Vlad Gluhovsky Yohann Léon Yoichi Hirai Yondon Fu Zach Zahoor Mohamed Zoe Nolan Zsolt Felföldi am2rican5 ayeowch b00ris bailantaotao baizhenxuan bloonfield changhong evgk ferhat elmas holisticode jtakalai ken10100147 ligi mark.lin necaremus njupt-moon <1015041018@njupt.edu.cn> nkbai rhaps107 slumber1122 sunxiaojun2014 terasum tsarpaul xiekeyang yoza ΞTHΞЯSPHΞЯΞ <{viktor.tron,nagydani,zsfelfoldi}@gmail.com> Максим Чусовлянов Ralph Caraveo ================================================ FILE: AUTHORS.SERO ================================================ # This is the official list of go-sero authors for copyright purposes. Gordon.T ================================================ FILE: COPYING ================================================ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2014 The go-ethereum Authors. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. ================================================ FILE: COPYING.LESSER ================================================ GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. ================================================ FILE: Dockerfile ================================================ # Build Geth in a stock Go builder container FROM golang:1.10-alpine as builder RUN apk add --no-cache make gcc musl-dev linux-headers ADD . /go-ethereum RUN cd /go-ethereum && make gero # Pull Geth into a second stage deploy alpine container FROM alpine:latest RUN apk add --no-cache ca-certificates COPY --from=builder /go-ethereum/build/bin/gero /usr/local/bin/ EXPOSE 8545 8546 30303 30303/udp ENTRYPOINT ["gero"] ================================================ FILE: LICENSE.SERO ================================================ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2018 The sero.cash Authors. Modified based on go-ethereum, which Copyright (C) 2014 The go-ethereum Authors. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. ================================================ FILE: LICENSE.SERO.LESSER ================================================ GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. ================================================ FILE: Makefile ================================================ # This Makefile is meant to be used by people that do not usually work # with Go source code. If you know what GOPATH is then you probably # don't need to bother with make. .PHONY: gero android ios gero-cross swarm evm all test clean .PHONY: gero-linux gero-linux-386 gero-linux-amd64 gero-linux-mips64 gero-linux-mips64le .PHONY: gero-linux-arm gero-linux-arm-5 gero-linux-arm-6 gero-linux-arm-7 gero-linux-arm64 .PHONY: gero-darwin gero-darwin-386 gero-darwin-amd64 .PHONY: gero-windows gero-windows-386 gero-windows-amd64 GOBIN = $(shell pwd)/build/bin root=$(shell pwd) GO ?= latest PKG = ./... gero: build/env.sh go run build/ci.go install ./cmd/gero @echo "Done building." @echo "Run \"$(GOBIN)/gero\" to launch gero." swarm: build/env.sh go run build/ci.go install ./cmd/swarm @echo "Done building." @echo "Run \"$(GOBIN)/swarm\" to launch swarm." all: build/env.sh go run build/ci.go install test: all build/env.sh go run build/ci.go test lint: ## Run linters. build/env.sh go run build/ci.go lint $(PKG) clean: ./build/clean_go_build_cache.sh rm -fr build/_workspace/pkg/ $(GOBIN)/* # The devtools target installs tools required for 'go generate'. # You need to put $GOBIN (or $GOPATH/bin) in your PATH to use 'go generate'. devtools: env GOBIN= go get -u golang.org/x/tools/cmd/stringer env GOBIN= go get -u github.com/kevinburke/go-bindata/go-bindata env GOBIN= go get -u github.com/fjl/gencodec env GOBIN= go get -u github.com/golang/protobuf/protoc-gen-go env GOBIN= go install ./cmd/abigen @type "npm" 2> /dev/null || echo 'Please install node.js and npm' @type "solc" 2> /dev/null || echo 'Please install solc' @type "protoc" 2> /dev/null || echo 'Please install protoc' # Cross Compilation Targets (xgo) gero-cross: gero-linux gero-darwin gero-windows @echo "Full cross compilation done:" @ls -ld $(GOBIN)/gero-* gero-linux: gero-linux-amd64-v3 gero-linux-amd64-v4 @echo "Linux cross compilation done:" @ls -ld $(GOBIN)/gero-linux-* gero-linux-amd64-v3: build/env.sh go run build/ci.go xgo -- --go=$(GO) --out=gero-v3 --targets=linux/amd64 -v ./cmd/gero #build/env.sh go run build/ci.go xgo -- --go=$(GO) --out=bootnode-v3 --targets=linux/amd64 -v ./cmd/bootnode @echo "Linux centos amd64 cross compilation done:" @ls -ld $(GOBIN)/gero-v3-linux-* | grep amd64 gero-linux-amd64-v4: build/env.sh go run build/ci.go xgo -- --go=$(GO) --out=gero-v4 --targets=linux/amd64 -v ./cmd/gero #build/env.sh linux-v3 go run build/ci.go xgo -- --go=$(GO) --out=bootnode-v4 --targets=linux/amd64 -v ./cmd/bootnode @echo "Linux ubuntu amd64 cross compilation done:" @ls -ld $(GOBIN)/gero-v4-linux-* | grep amd64 gero-darwin: gero-darwin-amd64 @echo "Darwin cross compilation done:" @ls -ld $(GOBIN)/gero-darwin-* gero-darwin-amd64: build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=darwin/amd64 -v ./cmd/gero @echo "Darwin amd64 cross compilation done:" @ls -ld $(GOBIN)/gero-darwin-* | grep amd64 gero-windows: gero-windows-amd64 @echo "Windows cross compilation done:" @ls -ld $(GOBIN)/gero-windows-* gero-windows-amd64: build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=windows/amd64 -v ./cmd/gero @echo "Windows amd64 cross compilation done:" @ls -ld $(GOBIN)/gero-windows-* | grep amd64 gerotx-darwin-amd64: build/env.sh go run build/ci.go xgo -- --go=$(GO) --out=gerotx --targets=darwin/amd64 -v ./cmd/tx @echo "Darwin amd64 cross compilation done:" @ls -ld $(GOBIN)/gerotx-darwin-* | grep amd64 gerotx-linux-amd64-v3: build/env.sh go run build/ci.go xgo -- --go=$(GO) --out=gerotx-v3 --targets=linux/amd64 -v ./cmd/tx @echo "Linux centos amd64 cross compilation done:" @ls -ld $(GOBIN)/gerotx-v3-linux-* | grep amd64 gerotx-linux-amd64-v4: build/env.sh go run build/ci.go xgo -- --go=$(GO) --out=gerotx-v4 --targets=linux/amd64 -v ./cmd/tx @echo "Linux ubuntu amd64 cross compilation done:" @ls -ld $(GOBIN)/gerotx-v4-linux-* | grep amd64 gerotx-windows-amd64: build/env.sh go run build/ci.go xgo -- --go=$(GO) --out=gerotx --targets=windows/amd64 -v ./cmd/tx @echo "Windows amd64 cross compilation done:" @ls -ld $(GOBIN)/gerotx-windows-* | grep amd64 ================================================ FILE: README.md ================================================ # Go Sero The SERO system is the world's first blockchain platform to support confidential transactions based on Zero-knowledge proof and supports Turing complete smart contracts. ## What's SERO https://wiki.sero.cash/en/index.html?file=home-Home ## From source code -- base on CentOS7 https://wiki.sero.cash/en/index.html?file=Start/from-the-sourcecode-base-on-centos7 ## How to mine using gero https://wiki.sero.cash/en/index.html?file=Start/from-the-binary-package **Now You don't need license anymore to mine SERO.** ## How to use snapshots https://wiki.sero.cash/en/index.html?file=Start/sero-chain-snapshot-list ## How to start SERO Staking on gero https://wiki.sero.cash/en/index.html?file=Tutorial/how-to-staking-using-gero ## Decentralized light wallet **PC:** https://github.com/sero-cash/pullup **Mobile:** https://sero.cash/app/popup.html ## POW pool list https://wiki.sero.cash/en/index.html?file=Start/sero-pool-list ## PoS stake node List https://wiki.sero.cash/en/index.html?file=Start/stake-node-list ## Contribution Thank you for considering to help out with the source code! We welcome contributions from anyone on the internet, and are grateful for even the smallest of fixes! If you'd like to contribute to go-sero, please fork, fix, commit and send a pull request for the maintainers to review and merge into the main code base. Please make sure your contributions adhere to our coding guidelines: * Code must adhere to the official Go [formatting](https://golang.org/doc/effective_go.html#formatting) guidelines (i.e. uses [gofmt](https://golang.org/cmd/gofmt/)). * Code must be documented adhering to the official Go [commentary](https://golang.org/doc/effective_go.html#commentary) guidelines. * Pull requests need to be based on and opened against the `master` branch. * Commit messages should be prefixed with the package(s) they modify. * E.g. "sero, rpc: make trace configs optional" Please see the [Developers' Guide](https://github.com/sero-cash/go-sero/wiki/Developers'-Guide) for more details on configuring your environment, managing project dependencies and testing procedures. ## Community resources **Wechat:** SERO9413 **Discord:** **Twitter:** **Telegram:** **Gitter:** ## Other resources **Official Website:** **White Paper:** **WIKI:** **Block Explorer:** **Introduction Video:** ## License The go-sero library (i.e. all code outside of the `cmd` directory) is licensed under the [GNU Lesser General Public License v3.0](https://www.gnu.org/licenses/lgpl-3.0.en.html), also included in our repository in the `COPYING.LESSER` file. The go-sero binaries (i.e. all code inside of the `cmd` directory) is licensed under the [GNU General Public License v3.0](https://www.gnu.org/licenses/gpl-3.0.en.html), also included in our repository in the `COPYING` file. *Note: Go Sero inherit with licenses of ethereum.* ================================================ FILE: accounts/abi/abi.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package abi import ( "bytes" "encoding/json" "fmt" "io" "github.com/pkg/errors" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/common" ) // The ABI holds information about a contract's context and available // invokable methods. It will allow you to type check function calls and // packs data accordingly. type ABI struct { Constructor Method Methods map[string]Method Events map[string]Event // Additional "special" functions introduced in solidity v0.6.0. // It's separated from the original default fallback. Each contract // can only define one fallback and receive function. Fallback Method // Note it's also used to represent legacy fallback before v0.6.0 Receive Method } // JSON returns a parsed ABI interface and error if it failed. func JSON(reader io.Reader) (ABI, error) { dec := json.NewDecoder(reader) var abi ABI if err := dec.Decode(&abi); err != nil { return ABI{}, err } return abi, nil } // Pack the given method name to conform the ABI. Method call's data // will consist of method_id, args0, arg1, ... argN. Method id consists // of 4 bytes and arguments are all 32 bytes. // Method ids are created from the first 4 bytes of the hash of the // methods string signature. (signature = baz(uint32,string32)) func (abi ABI) PackPrefix(name string, rand c_type.Uint128, args ...interface{}) ([]byte, error) { var ret []byte ret = append(ret, rand[:]...) if name == "" { // constructor addressPrefix, err := abi.Constructor.Inputs.PackPrefix(args...) if err != nil { return nil, err } ret = append(ret, addressPrefix...) return ret, nil } method, exist := abi.Methods[name] if !exist { return nil, fmt.Errorf("method '%s' not found", name) } addressPrefix, err := method.Inputs.PackPrefix(args...) if err != nil { return nil, err } ret = append(ret, addressPrefix...) return ret, nil } func (abi ABI) Pack(name string, args ...interface{}) ([]byte, error) { // Fetch the ABI of the requested method if name == "" { // constructor arguments, err := abi.Constructor.Inputs.Pack(args...) if err != nil { return nil, err } return arguments, nil } method, exist := abi.Methods[name] if !exist { return nil, fmt.Errorf("method '%s' not found", name) } arguments, err := method.Inputs.Pack(args...) if err != nil { return nil, err } // Pack up the method ID too if not a constructor and return return append(method.ID, arguments...), nil } // Unpack output in v according to the abi specification func (abi ABI) Unpack(v interface{}, name string, output []byte) (err error) { if len(output) == 0 { return fmt.Errorf("abi: unmarshalling empty output") } // since there can't be naming collisions with contracts and events, // we need to decide whether we're calling a method or an event if method, ok := abi.Methods[name]; ok { if len(output)%32 != 0 { return fmt.Errorf("abi: improperly formatted output") } return method.Outputs.Unpack(v, output) } else if event, ok := abi.Events[name]; ok { return event.Inputs.Unpack(v, output) } return fmt.Errorf("abi: could not locate named method or event") } // UnpackIntoMap unpacks a log into the provided map[string]interface{} func (abi ABI) UnpackIntoMap(v map[string]interface{}, name string, data []byte) (err error) { if len(data) == 0 { return fmt.Errorf("abi: unmarshalling empty output") } // since there can't be naming collisions with contracts and events, // we need to decide whether we're calling a method or an event if method, ok := abi.Methods[name]; ok { if len(data)%32 != 0 { return fmt.Errorf("abi: improperly formatted output") } return method.Outputs.UnpackIntoMap(v, data) } if event, ok := abi.Events[name]; ok { return event.Inputs.UnpackIntoMap(v, data) } return fmt.Errorf("abi: could not locate named method or event") } // UnmarshalJSON implements json.Unmarshaler interface func (abi *ABI) UnmarshalJSON(data []byte) error { var fields []struct { Type string Name string Inputs []Argument Outputs []Argument // Status indicator which can be: "pure", "view", // "nonpayable" or "payable". StateMutability string // Deprecated Status indicators, but removed in v0.6.0. Constant bool // True if function is either pure or view Payable bool // True if function is payable // Event relevant indicator represents the event is // declared as anonymous. Anonymous bool } if err := json.Unmarshal(data, &fields); err != nil { return err } abi.Methods = make(map[string]Method) abi.Events = make(map[string]Event) for _, field := range fields { switch field.Type { case "constructor": abi.Constructor = NewMethod("", "", Constructor, field.StateMutability, field.Constant, field.Payable, field.Inputs, nil) case "function": name := abi.overloadedMethodName(field.Name) abi.Methods[name] = NewMethod(name, field.Name, Function, field.StateMutability, field.Constant, field.Payable, field.Inputs, field.Outputs) case "fallback": // New introduced function type in v0.6.0, check more detail // here https://solidity.readthedocs.io/en/v0.6.0/contracts.html#fallback-function if abi.HasFallback() { return errors.New("only single fallback is allowed") } abi.Fallback = NewMethod("", "", Fallback, field.StateMutability, field.Constant, field.Payable, nil, nil) case "receive": // New introduced function type in v0.6.0, check more detail // here https://solidity.readthedocs.io/en/v0.6.0/contracts.html#fallback-function if abi.HasReceive() { return errors.New("only single receive is allowed") } if field.StateMutability != "payable" { return errors.New("the statemutability of receive can only be payable") } abi.Receive = NewMethod("", "", Receive, field.StateMutability, field.Constant, field.Payable, nil, nil) case "event": name := abi.overloadedEventName(field.Name) abi.Events[name] = NewEvent(name, field.Name, field.Anonymous, field.Inputs) default: return fmt.Errorf("abi: could not recognize type %v of field %v", field.Type, field.Name) } } return nil } // overloadedMethodName returns the next available name for a given function. // Needed since solidity allows for function overload. // // e.g. if the abi contains Methods send, send1 // overloadedMethodName would return send2 for input send. func (abi *ABI) overloadedMethodName(rawName string) string { name := rawName _, ok := abi.Methods[name] for idx := 0; ok; idx++ { name = fmt.Sprintf("%s%d", rawName, idx) _, ok = abi.Methods[name] } return name } // overloadedEventName returns the next available name for a given event. // Needed since solidity allows for event overload. // // e.g. if the abi contains events received, received1 // overloadedEventName would return received2 for input received. func (abi *ABI) overloadedEventName(rawName string) string { name := rawName _, ok := abi.Events[name] for idx := 0; ok; idx++ { name = fmt.Sprintf("%s%d", rawName, idx) _, ok = abi.Events[name] } return name } // MethodById looks up a method by the 4-byte id // returns nil if none found func (abi *ABI) MethodById(sigdata []byte) (*Method, error) { if len(sigdata) < 4 { return nil, fmt.Errorf("data too short (%d bytes) for abi method lookup", len(sigdata)) } for _, method := range abi.Methods { if bytes.Equal(method.ID, sigdata[:4]) { return &method, nil } } return nil, fmt.Errorf("no method with id: %#x", sigdata[:4]) } // EventByID looks an event up by its topic hash in the // ABI and returns nil if none found. func (abi *ABI) EventByID(topic common.Hash) (*Event, error) { for _, event := range abi.Events { if bytes.Equal(event.ID.Bytes(), topic.Bytes()) { return &event, nil } } return nil, fmt.Errorf("no event with id: %#x", topic.Hex()) } // HasFallback returns an indicator whether a fallback function is included. func (abi *ABI) HasFallback() bool { return abi.Fallback.Type == Fallback } // HasReceive returns an indicator whether a receive function is included. func (abi *ABI) HasReceive() bool { return abi.Receive.Type == Receive } // revertSelector is a special function selector for revert reason unpacking. //var revertSelector = crypto.Keccak256([]byte("Error(string)"))[:4] ================================================ FILE: accounts/abi/abi_test.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package abi // //import ( // "bytes" // "encoding/hex" // "encoding/json" // "fmt" // "log" // "math/big" // "reflect" // "strings" // "testing" // // "github.com/sero-cash/go-sero/common" // "github.com/sero-cash/go-sero/crypto" //) // //const jsondata = ` //[ // { "type" : "function", "name" : "balance", "constant" : true }, // { "type" : "function", "name" : "send", "constant" : false, "inputs" : [ { "name" : "amount", "type" : "uint256" } ] } //]` // //const jsondata2 = ` //[ // { "type" : "function", "name" : "balance", "constant" : true }, // { "type" : "function", "name" : "send", "constant" : false, "inputs" : [ { "name" : "amount", "type" : "uint256" } ] }, // { "type" : "function", "name" : "test", "constant" : false, "inputs" : [ { "name" : "number", "type" : "uint32" } ] }, // { "type" : "function", "name" : "string", "constant" : false, "inputs" : [ { "name" : "inputs", "type" : "string" } ] }, // { "type" : "function", "name" : "bool", "constant" : false, "inputs" : [ { "name" : "inputs", "type" : "bool" } ] }, // { "type" : "function", "name" : "address", "constant" : false, "inputs" : [ { "name" : "inputs", "type" : "address" } ] }, // { "type" : "function", "name" : "uint64[2]", "constant" : false, "inputs" : [ { "name" : "inputs", "type" : "uint64[2]" } ] }, // { "type" : "function", "name" : "uint64[]", "constant" : false, "inputs" : [ { "name" : "inputs", "type" : "uint64[]" } ] }, // { "type" : "function", "name" : "foo", "constant" : false, "inputs" : [ { "name" : "inputs", "type" : "uint32" } ] }, // { "type" : "function", "name" : "bar", "constant" : false, "inputs" : [ { "name" : "inputs", "type" : "uint32" }, { "name" : "string", "type" : "uint16" } ] }, // { "type" : "function", "name" : "slice", "constant" : false, "inputs" : [ { "name" : "inputs", "type" : "uint32[2]" } ] }, // { "type" : "function", "name" : "slice256", "constant" : false, "inputs" : [ { "name" : "inputs", "type" : "uint256[2]" } ] }, // { "type" : "function", "name" : "sliceAddress", "constant" : false, "inputs" : [ { "name" : "inputs", "type" : "address[]" } ] }, // { "type" : "function", "name" : "sliceMultiAddress", "constant" : false, "inputs" : [ { "name" : "a", "type" : "address[]" }, { "name" : "b", "type" : "address[]" } ] } //]` // //func newType(t string) Type { // typ, err := NewType(t) // if err != nil { // panic(t) // } // return typ //} // //func TestALL(t *testing.T) { // fmt.Println(newType("bytes").T) // // //fmt.Println(newType("uint8[2]").Kind) // //paramJson := `{"uint8[2]":[100,99]}` // // //paramJson := `{"uint8[2][2]":[[100,99],[98,97]]}` // // //paramJson := `{"string":"12345"}` // // //paramJson := `{"bool":true}` // // //paramJson := `{"address":"6gYcdwixFVFg1QLV29hURUnN2WLxoTFbDHBptvtC4GcCHfnG7ocmmTrebf3KvjNHfj6UJpp9UzkSiheYbCyDERF"}` // // paramJson := `{"address[][]":[["6gYcdwixFVFg1QLV29hURUnN2WLxoTFbDHBptvtC4GcCHfnG7ocmmTrebf3KvjNHfj6UJpp9UzkSiheYbCyDERF"],["6gYcdwixFVFg1QLV29hURUnN2WLxoTFbDHBptvtC4GcCHfnG7ocmmTrebf3KvjNHfj6UJpp9UzkSiheYbCyDERF"]], "bytes":[1,2]}` // // dec := json.NewDecoder(strings.NewReader(paramJson)) // dec.UseNumber() // // vs := map[string]interface{}{} // // if err := dec.Decode(&vs); err != nil { // fmt.Print(err) // } // // args := []Argument{} // inputs := []interface{}{} // // //var index int // //for k, v := range vs { // // //fmt.Printf("%t\n %t\n", k, v) // // tv, _, _ := ValueTo(newType(k), v, nil, nil) // // //fmt.Printf("address = %v\n",addr) // // fmt.Printf("v=%v\n", tv) // // args = append(args, Argument{"a" + strconv.Itoa(index), newType(k), false}) // // inputs = append(inputs, tv.Interface()) // // index += 1 // //} // // //[2]uint32{uint32(100), uint32(99)}, "1234567890", common.HexToAddress("0xbbf289d846208c16edc8474705c748aff07732db"), common.HexToAddress("0x692a70d2e424a56d2c6c27aa97d1a86395877b3a"), "test", uint32(11) // method := Method{"test", false, args, nil} // // outputs, err := method.Inputs.Pack(inputs...) // if err != nil { // fmt.Print(err) // } // // input := append(method.ID, outputs...) // fmt.Println(common.Bytes2Hex(input)) // // type Event struct { // A0 common.Address // //A1 common.Data // //A2 []byte // //A2 string // } // var ev Event // aa := Arguments{ // {"a0", newType("address"), false}, // //{"a1", newType("address"), false}, // {"a2", newType("bytes"), false}, // } // unpack := aa.Unpack(&ev, outputs) // //unpack := method.Inputs.Unpack(&ev, outputs) // fmt.Println(unpack) // fmt.Println(ev) // //} // //func TestABIPACK(t *testing.T) { // fmt.Println(newType("bytes").T) // // //fmt.Println(newType("uint8[2]").Kind) // //paramJson := `{"uint8[2]":[100,99]}` // // //paramJson := `{"uint8[2][2]":[[100,99],[98,97]]}` // // //paramJson := `{"string":"12345"}` // // //paramJson := `{"bool":true}` // // //paramJson := `{"address":"0xbbf289d846208c16edc8474705c748aff07732db"}` // // datas := []string{`address:6gYcdwixFVFg1QLV29hURUnN2WLxoTFbDHBptvtC4GcCHfnG7ocmmTrebf3KvjNHfj6UJpp9UzkSiheYbCyDERF`} // // inputs := []interface{}{} // args := []Argument{} // //var index int // for _, line := range datas { // pairs := strings.Split(line, ":") // vs := map[string]interface{}{} // fmt.Printf("json=%v", `{"`+pairs[0]+`":"`+pairs[1]+`"}`) // dec := json.NewDecoder(strings.NewReader(`{"` + pairs[0] + `":"` + pairs[1] + `"}`)) // dec.UseNumber() // if err := dec.Decode(&vs); err != nil { // fmt.Print(err) // } // //for k, v := range vs { // // //fmt.Printf("%t\n %t\n", k, v) // // tv, _, _ := ValueTo(newType(k), v, nil, nil) // // fmt.Printf("v=%v\n", tv) // // args = append(args, Argument{"a" + strconv.Itoa(index), newType(k), false}) // // inputs = append(inputs, tv.Interface()) // // index += 1 // //} // // } // // //[2]uint32{uint32(100), uint32(99)}, "1234567890", common.HexToAddress("0xbbf289d846208c16edc8474705c748aff07732db"), common.HexToAddress("0x692a70d2e424a56d2c6c27aa97d1a86395877b3a"), "test", uint32(11) // method := Method{"test", false, args, nil} // // outputs, err := method.Inputs.Pack(inputs...) // if err != nil { // fmt.Print(err) // } // // input := append(method.Id(), outputs...) // fmt.Println(common.Bytes2Hex(input)) //} // //func TestReader(t *testing.T) { // Uint256, _ := NewType("uint256") // exp := ABI{ // Methods: map[string]Method{ // "balance": { // "balance", true, nil, nil, // }, // "send": { // "send", false, []Argument{ // {"amount", Uint256, false}, // }, nil, // }, // }, // } // // abi, err := JSON(strings.NewReader(jsondata)) // if err != nil { // t.Error(err) // } // // // deep equal fails for some reason // for name, expM := range exp.Methods { // gotM, exist := abi.Methods[name] // if !exist { // t.Errorf("Missing expected method %v", name) // } // if !reflect.DeepEqual(gotM, expM) { // t.Errorf("\nGot abi method: \n%v\ndoes not match expected method\n%v", gotM, expM) // } // } // // for name, gotM := range abi.Methods { // expM, exist := exp.Methods[name] // if !exist { // t.Errorf("Found extra method %v", name) // } // if !reflect.DeepEqual(gotM, expM) { // t.Errorf("\nGot abi method: \n%v\ndoes not match expected method\n%v", gotM, expM) // } // } //} // //func TestTestNumbers(t *testing.T) { // abi, err := JSON(strings.NewReader(jsondata2)) // if err != nil { // t.Error(err) // t.FailNow() // } // // if _, err := abi.Pack("balance"); err != nil { // t.Error(err) // } // // if _, err := abi.Pack("balance", 1); err == nil { // t.Error("expected error for balance(1)") // } // // if _, err := abi.Pack("doesntexist", nil); err == nil { // t.Errorf("doesntexist shouldn't exist") // } // // if _, err := abi.Pack("doesntexist", 1); err == nil { // t.Errorf("doesntexist(1) shouldn't exist") // } // // if _, err := abi.Pack("send", big.NewInt(1000)); err != nil { // t.Error(err) // } // // i := new(int) // *i = 1000 // if _, err := abi.Pack("send", i); err == nil { // t.Errorf("expected send( ptr ) to throw, requires *big.Int instead of *int") // } // // if _, err := abi.Pack("test", uint32(1000)); err != nil { // t.Error(err) // } //} // //func TestTestString(t *testing.T) { // abi, err := JSON(strings.NewReader(jsondata2)) // if err != nil { // t.Error(err) // t.FailNow() // } // // if _, err := abi.Pack("string", "hello world"); err != nil { // t.Error(err) // } //} // //func TestTestBool(t *testing.T) { // abi, err := JSON(strings.NewReader(jsondata2)) // if err != nil { // t.Error(err) // t.FailNow() // } // // if _, err := abi.Pack("bool", true); err != nil { // t.Error(err) // } //} // //func TestTestSlice(t *testing.T) { // abi, err := JSON(strings.NewReader(jsondata2)) // if err != nil { // t.Error(err) // t.FailNow() // } // // slice := make([]uint64, 2) // if _, err := abi.Pack("uint64[2]", slice); err != nil { // t.Error(err) // } // // if _, err := abi.Pack("uint64[]", slice); err != nil { // t.Error(err) // } //} // //func TestMethodSignature(t *testing.T) { // String, _ := NewType("string") // m := Method{"foo", false, []Argument{{"bar", String, false}, {"baz", String, false}}, nil} // exp := "foo(string,string)" // if m.Sig() != exp { // t.Error("signature mismatch", exp, "!=", m.Sig()) // } // // idexp := crypto.Keccak256([]byte(exp))[:4] // if !bytes.Equal(m.Id(), idexp) { // t.Errorf("expected ids to match %x != %x", m.Id(), idexp) // } // // uintt, _ := NewType("uint256") // m = Method{"foo", false, []Argument{{"bar", uintt, false}}, nil} // exp = "foo(uint256)" // if m.Sig() != exp { // t.Error("signature mismatch", exp, "!=", m.Sig()) // } //} // //func TestMultiPack(t *testing.T) { // abi, err := JSON(strings.NewReader(jsondata2)) // if err != nil { // t.Error(err) // t.FailNow() // } // // sig := crypto.Keccak256([]byte("bar(uint32,uint16)"))[:4] // sig = append(sig, make([]byte, 64)...) // sig[35] = 10 // sig[67] = 11 // // packed, err := abi.Pack("bar", uint32(10), uint16(11)) // if err != nil { // t.Error(err) // t.FailNow() // } // // if !bytes.Equal(packed, sig) { // t.Errorf("expected %x got %x", sig, packed) // } //} // //func TestGetDeciamlByName_Pack(t *testing.T) { // const definition = `[{ // "constant": false, // "inputs": [{ // "name": "name", // "type": "string" // }], // "name": "getDecimal", // "outputs": [{ // "name": "", // "type": "uint8" // }], // "payable": false, // "type": "function" // }]` // abi, err := JSON(strings.NewReader(definition)) // if err != nil { // log.Fatalln(err) // } // out, err := abi.Pack("getDecimal", "") // if err != nil { // log.Fatalln(err) // } // // fmt.Printf("%x\n", out) //} // //func TestGetDeciaml_Pack(t *testing.T) { // const definition = `[{ // "constant": true, // "inputs": [], // "name": "getDecimal", // "outputs": [{ // "name": "", // "type": "uint8" // }], // "payable": false, // "type": "function" // }]` // abi, err := JSON(strings.NewReader(definition)) // if err != nil { // log.Fatalln(err) // } // out, err := abi.Pack("getDecimal", "") // if err != nil { // log.Fatalln(err) // } // // fmt.Printf("%x\n", out) //} // //func TestDeciaml_Pack(t *testing.T) { // const definition = `[{ // "constant": true, // "inputs": [], // "name": "decimals", // "outputs": [{ // "name": "", // "type": "uint8" // }], // "payable": false, // "type": "function" // }]` // abi, err := JSON(strings.NewReader(definition)) // if err != nil { // log.Fatalln(err) // } // out, err := abi.Pack("getDecimal", "") // if err != nil { // log.Fatalln(err) // } // // fmt.Printf("%x\n", out) //} // //func TestABI_Pack(t *testing.T) { // const definition = `[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"name","type":"string"}],"name":"getDecimal","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getDecimal","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"name","type":"string"},{"name":"symbol","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]` // abi, err := JSON(strings.NewReader(definition)) // if err != nil { // log.Fatalln(err) // } // out, err := abi.Pack("getDecimal") // if err != nil { // log.Fatalln(err) // } // // fmt.Printf("%x\n", out) //} // //func ExampleJSON() { // const definition = `[{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"isBar","outputs":[{"name":"","type":"bool"}],"type":"function"}]` // // abi, err := JSON(strings.NewReader(definition)) // if err != nil { // log.Fatalln(err) // } // out, err := abi.Pack("isBar", common.Base58ToAddress("01")) // if err != nil { // log.Fatalln(err) // } // // fmt.Printf("%x\n", out) // // Output: // // 1f2c40920000000000000000000000000000000000000000000000000000000000000001 //} // //func TestInputVariableInputLength(t *testing.T) { // const definition = `[ // { "type" : "function", "name" : "strOne", "constant" : true, "inputs" : [ { "name" : "str", "type" : "string" } ] }, // { "type" : "function", "name" : "bytesOne", "constant" : true, "inputs" : [ { "name" : "str", "type" : "bytes" } ] }, // { "type" : "function", "name" : "strTwo", "constant" : true, "inputs" : [ { "name" : "str", "type" : "string" }, { "name" : "str1", "type" : "string" } ] } // ]` // // abi, err := JSON(strings.NewReader(definition)) // if err != nil { // t.Fatal(err) // } // // // test one string // strin := "hello world" // strpack, err := abi.Pack("strOne", strin) // if err != nil { // t.Error(err) // } // // offset := make([]byte, 32) // offset[31] = 32 // length := make([]byte, 32) // length[31] = byte(len(strin)) // value := common.RightPadBytes([]byte(strin), 32) // exp := append(offset, append(length, value...)...) // // // ignore first 4 bytes of the output. This is the function identifier // strpack = strpack[4:] // if !bytes.Equal(strpack, exp) { // t.Errorf("expected %x, got %x\n", exp, strpack) // } // // // test one bytes // btspack, err := abi.Pack("bytesOne", []byte(strin)) // if err != nil { // t.Error(err) // } // // ignore first 4 bytes of the output. This is the function identifier // btspack = btspack[4:] // if !bytes.Equal(btspack, exp) { // t.Errorf("expected %x, got %x\n", exp, btspack) // } // // // test two strings // str1 := "hello" // str2 := "world" // str2pack, err := abi.Pack("strTwo", str1, str2) // if err != nil { // t.Error(err) // } // // offset1 := make([]byte, 32) // offset1[31] = 64 // length1 := make([]byte, 32) // length1[31] = byte(len(str1)) // value1 := common.RightPadBytes([]byte(str1), 32) // // offset2 := make([]byte, 32) // offset2[31] = 128 // length2 := make([]byte, 32) // length2[31] = byte(len(str2)) // value2 := common.RightPadBytes([]byte(str2), 32) // // exp2 := append(offset1, offset2...) // exp2 = append(exp2, append(length1, value1...)...) // exp2 = append(exp2, append(length2, value2...)...) // // // ignore first 4 bytes of the output. This is the function identifier // str2pack = str2pack[4:] // if !bytes.Equal(str2pack, exp2) { // t.Errorf("expected %x, got %x\n", exp, str2pack) // } // // // test two strings, first > 32, second < 32 // str1 = strings.Repeat("a", 33) // str2pack, err = abi.Pack("strTwo", str1, str2) // if err != nil { // t.Error(err) // } // // offset1 = make([]byte, 32) // offset1[31] = 64 // length1 = make([]byte, 32) // length1[31] = byte(len(str1)) // value1 = common.RightPadBytes([]byte(str1), 64) // offset2[31] = 160 // // exp2 = append(offset1, offset2...) // exp2 = append(exp2, append(length1, value1...)...) // exp2 = append(exp2, append(length2, value2...)...) // // // ignore first 4 bytes of the output. This is the function identifier // str2pack = str2pack[4:] // if !bytes.Equal(str2pack, exp2) { // t.Errorf("expected %x, got %x\n", exp, str2pack) // } // // // test two strings, first > 32, second >32 // str1 = strings.Repeat("a", 33) // str2 = strings.Repeat("a", 33) // str2pack, err = abi.Pack("strTwo", str1, str2) // if err != nil { // t.Error(err) // } // // offset1 = make([]byte, 32) // offset1[31] = 64 // length1 = make([]byte, 32) // length1[31] = byte(len(str1)) // value1 = common.RightPadBytes([]byte(str1), 64) // // offset2 = make([]byte, 32) // offset2[31] = 160 // length2 = make([]byte, 32) // length2[31] = byte(len(str2)) // value2 = common.RightPadBytes([]byte(str2), 64) // // exp2 = append(offset1, offset2...) // exp2 = append(exp2, append(length1, value1...)...) // exp2 = append(exp2, append(length2, value2...)...) // // // ignore first 4 bytes of the output. This is the function identifier // str2pack = str2pack[4:] // if !bytes.Equal(str2pack, exp2) { // t.Errorf("expected %x, got %x\n", exp, str2pack) // } //} // //func TestInputFixedArrayAndVariableInputLength(t *testing.T) { // const definition = `[ // { "type" : "function", "name" : "fixedArrStr", "constant" : true, "inputs" : [ { "name" : "str", "type" : "string" }, { "name" : "fixedArr", "type" : "uint256[2]" } ] }, // { "type" : "function", "name" : "fixedArrBytes", "constant" : true, "inputs" : [ { "name" : "str", "type" : "bytes" }, { "name" : "fixedArr", "type" : "uint256[2]" } ] }, // { "type" : "function", "name" : "mixedArrStr", "constant" : true, "inputs" : [ { "name" : "str", "type" : "string" }, { "name" : "fixedArr", "type": "uint256[2]" }, { "name" : "dynArr", "type": "uint256[]" } ] }, // { "type" : "function", "name" : "doubleFixedArrStr", "constant" : true, "inputs" : [ { "name" : "str", "type" : "string" }, { "name" : "fixedArr1", "type": "uint256[2]" }, { "name" : "fixedArr2", "type": "uint256[3]" } ] }, // { "type" : "function", "name" : "multipleMixedArrStr", "constant" : true, "inputs" : [ { "name" : "str", "type" : "string" }, { "name" : "fixedArr1", "type": "uint256[2]" }, { "name" : "dynArr", "type" : "uint256[]" }, { "name" : "fixedArr2", "type" : "uint256[3]" } ] } // ]` // // abi, err := JSON(strings.NewReader(definition)) // if err != nil { // t.Error(err) // } // // // test string, fixed array uint256[2] // strin := "hello world" // arrin := [2]*big.Int{big.NewInt(1), big.NewInt(2)} // fixedArrStrPack, err := abi.Pack("fixedArrStr", strin, arrin) // if err != nil { // t.Error(err) // } // // // generate expected output // offset := make([]byte, 32) // offset[31] = 96 // length := make([]byte, 32) // length[31] = byte(len(strin)) // strvalue := common.RightPadBytes([]byte(strin), 32) // arrinvalue1 := common.LeftPadBytes(arrin[0].Bytes(), 32) // arrinvalue2 := common.LeftPadBytes(arrin[1].Bytes(), 32) // exp := append(offset, arrinvalue1...) // exp = append(exp, arrinvalue2...) // exp = append(exp, append(length, strvalue...)...) // // // ignore first 4 bytes of the output. This is the function identifier // fixedArrStrPack = fixedArrStrPack[4:] // if !bytes.Equal(fixedArrStrPack, exp) { // t.Errorf("expected %x, got %x\n", exp, fixedArrStrPack) // } // // // test byte array, fixed array uint256[2] // bytesin := []byte(strin) // arrin = [2]*big.Int{big.NewInt(1), big.NewInt(2)} // fixedArrBytesPack, err := abi.Pack("fixedArrBytes", bytesin, arrin) // if err != nil { // t.Error(err) // } // // // generate expected output // offset = make([]byte, 32) // offset[31] = 96 // length = make([]byte, 32) // length[31] = byte(len(strin)) // strvalue = common.RightPadBytes([]byte(strin), 32) // arrinvalue1 = common.LeftPadBytes(arrin[0].Bytes(), 32) // arrinvalue2 = common.LeftPadBytes(arrin[1].Bytes(), 32) // exp = append(offset, arrinvalue1...) // exp = append(exp, arrinvalue2...) // exp = append(exp, append(length, strvalue...)...) // // // ignore first 4 bytes of the output. This is the function identifier // fixedArrBytesPack = fixedArrBytesPack[4:] // if !bytes.Equal(fixedArrBytesPack, exp) { // t.Errorf("expected %x, got %x\n", exp, fixedArrBytesPack) // } // // // test string, fixed array uint256[2], dynamic array uint256[] // strin = "hello world" // fixedarrin := [2]*big.Int{big.NewInt(1), big.NewInt(2)} // dynarrin := []*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)} // mixedArrStrPack, err := abi.Pack("mixedArrStr", strin, fixedarrin, dynarrin) // if err != nil { // t.Error(err) // } // // // generate expected output // stroffset := make([]byte, 32) // stroffset[31] = 128 // strlength := make([]byte, 32) // strlength[31] = byte(len(strin)) // strvalue = common.RightPadBytes([]byte(strin), 32) // fixedarrinvalue1 := common.LeftPadBytes(fixedarrin[0].Bytes(), 32) // fixedarrinvalue2 := common.LeftPadBytes(fixedarrin[1].Bytes(), 32) // dynarroffset := make([]byte, 32) // dynarroffset[31] = byte(160 + ((len(strin)/32)+1)*32) // dynarrlength := make([]byte, 32) // dynarrlength[31] = byte(len(dynarrin)) // dynarrinvalue1 := common.LeftPadBytes(dynarrin[0].Bytes(), 32) // dynarrinvalue2 := common.LeftPadBytes(dynarrin[1].Bytes(), 32) // dynarrinvalue3 := common.LeftPadBytes(dynarrin[2].Bytes(), 32) // exp = append(stroffset, fixedarrinvalue1...) // exp = append(exp, fixedarrinvalue2...) // exp = append(exp, dynarroffset...) // exp = append(exp, append(strlength, strvalue...)...) // dynarrarg := append(dynarrlength, dynarrinvalue1...) // dynarrarg = append(dynarrarg, dynarrinvalue2...) // dynarrarg = append(dynarrarg, dynarrinvalue3...) // exp = append(exp, dynarrarg...) // // // ignore first 4 bytes of the output. This is the function identifier // mixedArrStrPack = mixedArrStrPack[4:] // if !bytes.Equal(mixedArrStrPack, exp) { // t.Errorf("expected %x, got %x\n", exp, mixedArrStrPack) // } // // // test string, fixed array uint256[2], fixed array uint256[3] // strin = "hello world" // fixedarrin1 := [2]*big.Int{big.NewInt(1), big.NewInt(2)} // fixedarrin2 := [3]*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)} // doubleFixedArrStrPack, err := abi.Pack("doubleFixedArrStr", strin, fixedarrin1, fixedarrin2) // if err != nil { // t.Error(err) // } // // // generate expected output // stroffset = make([]byte, 32) // stroffset[31] = 192 // strlength = make([]byte, 32) // strlength[31] = byte(len(strin)) // strvalue = common.RightPadBytes([]byte(strin), 32) // fixedarrin1value1 := common.LeftPadBytes(fixedarrin1[0].Bytes(), 32) // fixedarrin1value2 := common.LeftPadBytes(fixedarrin1[1].Bytes(), 32) // fixedarrin2value1 := common.LeftPadBytes(fixedarrin2[0].Bytes(), 32) // fixedarrin2value2 := common.LeftPadBytes(fixedarrin2[1].Bytes(), 32) // fixedarrin2value3 := common.LeftPadBytes(fixedarrin2[2].Bytes(), 32) // exp = append(stroffset, fixedarrin1value1...) // exp = append(exp, fixedarrin1value2...) // exp = append(exp, fixedarrin2value1...) // exp = append(exp, fixedarrin2value2...) // exp = append(exp, fixedarrin2value3...) // exp = append(exp, append(strlength, strvalue...)...) // // // ignore first 4 bytes of the output. This is the function identifier // doubleFixedArrStrPack = doubleFixedArrStrPack[4:] // if !bytes.Equal(doubleFixedArrStrPack, exp) { // t.Errorf("expected %x, got %x\n", exp, doubleFixedArrStrPack) // } // // // test string, fixed array uint256[2], dynamic array uint256[], fixed array uint256[3] // strin = "hello world" // fixedarrin1 = [2]*big.Int{big.NewInt(1), big.NewInt(2)} // dynarrin = []*big.Int{big.NewInt(1), big.NewInt(2)} // fixedarrin2 = [3]*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)} // multipleMixedArrStrPack, err := abi.Pack("multipleMixedArrStr", strin, fixedarrin1, dynarrin, fixedarrin2) // if err != nil { // t.Error(err) // } // // // generate expected output // stroffset = make([]byte, 32) // stroffset[31] = 224 // strlength = make([]byte, 32) // strlength[31] = byte(len(strin)) // strvalue = common.RightPadBytes([]byte(strin), 32) // fixedarrin1value1 = common.LeftPadBytes(fixedarrin1[0].Bytes(), 32) // fixedarrin1value2 = common.LeftPadBytes(fixedarrin1[1].Bytes(), 32) // dynarroffset = U256(big.NewInt(int64(256 + ((len(strin)/32)+1)*32))) // dynarrlength = make([]byte, 32) // dynarrlength[31] = byte(len(dynarrin)) // dynarrinvalue1 = common.LeftPadBytes(dynarrin[0].Bytes(), 32) // dynarrinvalue2 = common.LeftPadBytes(dynarrin[1].Bytes(), 32) // fixedarrin2value1 = common.LeftPadBytes(fixedarrin2[0].Bytes(), 32) // fixedarrin2value2 = common.LeftPadBytes(fixedarrin2[1].Bytes(), 32) // fixedarrin2value3 = common.LeftPadBytes(fixedarrin2[2].Bytes(), 32) // exp = append(stroffset, fixedarrin1value1...) // exp = append(exp, fixedarrin1value2...) // exp = append(exp, dynarroffset...) // exp = append(exp, fixedarrin2value1...) // exp = append(exp, fixedarrin2value2...) // exp = append(exp, fixedarrin2value3...) // exp = append(exp, append(strlength, strvalue...)...) // dynarrarg = append(dynarrlength, dynarrinvalue1...) // dynarrarg = append(dynarrarg, dynarrinvalue2...) // exp = append(exp, dynarrarg...) // // // ignore first 4 bytes of the output. This is the function identifier // multipleMixedArrStrPack = multipleMixedArrStrPack[4:] // if !bytes.Equal(multipleMixedArrStrPack, exp) { // t.Errorf("expected %x, got %x\n", exp, multipleMixedArrStrPack) // } //} // //func TestDefaultFunctionParsing(t *testing.T) { // const definition = `[{ "name" : "balance" }]` // // abi, err := JSON(strings.NewReader(definition)) // if err != nil { // t.Fatal(err) // } // // if _, ok := abi.Methods["balance"]; !ok { // t.Error("expected 'balance' to be present") // } //} // //func TestBareEvents(t *testing.T) { // const definition = `[ // { "type" : "event", "name" : "balance" }, // { "type" : "event", "name" : "anon", "anonymous" : true}, // { "type" : "event", "name" : "args", "inputs" : [{ "indexed":false, "name":"arg0", "type":"uint256" }, { "indexed":true, "name":"arg1", "type":"address" }] } // ]` // // arg0, _ := NewType("uint256") // arg1, _ := NewType("address") // // expectedEvents := map[string]struct { // Anonymous bool // Args []Argument // }{ // "balance": {false, nil}, // "anon": {true, nil}, // "args": {false, []Argument{ // {Name: "arg0", Type: arg0, Indexed: false}, // {Name: "arg1", Type: arg1, Indexed: true}, // }}, // } // // abi, err := JSON(strings.NewReader(definition)) // if err != nil { // t.Fatal(err) // } // // if len(abi.Events) != len(expectedEvents) { // t.Fatalf("invalid number of events after parsing, want %d, got %d", len(expectedEvents), len(abi.Events)) // } // // for name, exp := range expectedEvents { // got, ok := abi.Events[name] // if !ok { // t.Errorf("could not found event %s", name) // continue // } // if got.Anonymous != exp.Anonymous { // t.Errorf("invalid anonymous indication for event %s, want %v, got %v", name, exp.Anonymous, got.Anonymous) // } // if len(got.Inputs) != len(exp.Args) { // t.Errorf("invalid number of args, want %d, got %d", len(exp.Args), len(got.Inputs)) // continue // } // for i, arg := range exp.Args { // if arg.Name != got.Inputs[i].Name { // t.Errorf("events[%s].Input[%d] has an invalid name, want %s, got %s", name, i, arg.Name, got.Inputs[i].Name) // } // if arg.Indexed != got.Inputs[i].Indexed { // t.Errorf("events[%s].Input[%d] has an invalid indexed indication, want %v, got %v", name, i, arg.Indexed, got.Inputs[i].Indexed) // } // if arg.Type.T != got.Inputs[i].Type.T { // t.Errorf("events[%s].Input[%d] has an invalid type, want %x, got %x", name, i, arg.Type.T, got.Inputs[i].Type.T) // } // } // } //} // //// TestUnpackEvent is based on this contract: //// contract T { //// event received(address sender, uint amount, bytes memo); //// event receivedAddr(address sender); //// function receive(bytes memo) external payable { //// received(msg.sender, msg.value, memo); //// receivedAddr(msg.sender); //// } //// } //// When receive("X") is called with sender 0x00... and value 1, it produces this tx receipt: //// receipt{status=1 cgas=23949 bloom=00000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000040200000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 logs=[log: b6818c8064f645cd82d99b59a1a267d6d61117ef [75fd880d39c1daf53b6547ab6cb59451fc6452d27caa90e5b6649dd8293b9eed] 000000000000000000000000376c47978271565f56deb45495afa69e59c16ab200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000158 9ae378b6d4409eada347a5dc0c180f186cb62dc68fcc0f043425eb917335aa28 0 95d429d309bb9d753954195fe2d69bd140b4ae731b9b5b605c34323de162cf00 0]} //func TestUnpackEvent(t *testing.T) { // const abiJSON = `[{"constant":false,"inputs":[{"name":"memo","type":"bytes"}],"name":"receive","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}],"name":"received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"}],"name":"receivedAddr","type":"event"}]` // abi, err := JSON(strings.NewReader(abiJSON)) // if err != nil { // t.Fatal(err) // } // // const hexdata = `000000000000000000000000376c47978271565f56deb45495afa69e59c16ab200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000158` // data, err := hex.DecodeString(hexdata) // if err != nil { // t.Fatal(err) // } // if len(data)%32 == 0 { // t.Errorf("len(data) is %d, want a non-multiple of 32", len(data)) // } // // type ReceivedEvent struct { // Address common.Address // Amount *big.Int // Memo []byte // } // var ev ReceivedEvent // // err = abi.Unpack(&ev, "received", data) // if err != nil { // t.Error(err) // } else { // t.Logf("len(data): %d; received event: %+v", len(data), ev) // } // // ev2 := make([]interface{}, 3) // err = abi.Unpack(&ev2, "received", data) // if err != nil { // t.Error(err) // } else { // t.Logf("len(data): %d; received event: %+v", len(data), ev2) // } // // type ReceivedAddrEvent struct { // Address common.Address // } // var receivedAddrEv ReceivedAddrEvent // err = abi.Unpack(&receivedAddrEv, "receivedAddr", data) // if err != nil { // t.Error(err) // } else { // t.Logf("len(data): %d; received event: %+v", len(data), receivedAddrEv) // } //} // //func TestABI_MethodById(t *testing.T) { // const abiJSON = `[ // {"type":"function","name":"receive","constant":false,"inputs":[{"name":"memo","type":"bytes"}],"outputs":[],"payable":true,"stateMutability":"payable"}, // {"type":"event","name":"received","anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}]}, // {"type":"function","name":"fixedArrStr","constant":true,"inputs":[{"name":"str","type":"string"},{"name":"fixedArr","type":"uint256[2]"}]}, // {"type":"function","name":"fixedArrBytes","constant":true,"inputs":[{"name":"str","type":"bytes"},{"name":"fixedArr","type":"uint256[2]"}]}, // {"type":"function","name":"mixedArrStr","constant":true,"inputs":[{"name":"str","type":"string"},{"name":"fixedArr","type":"uint256[2]"},{"name":"dynArr","type":"uint256[]"}]}, // {"type":"function","name":"doubleFixedArrStr","constant":true,"inputs":[{"name":"str","type":"string"},{"name":"fixedArr1","type":"uint256[2]"},{"name":"fixedArr2","type":"uint256[3]"}]}, // {"type":"function","name":"multipleMixedArrStr","constant":true,"inputs":[{"name":"str","type":"string"},{"name":"fixedArr1","type":"uint256[2]"},{"name":"dynArr","type":"uint256[]"},{"name":"fixedArr2","type":"uint256[3]"}]}, // {"type":"function","name":"balance","constant":true}, // {"type":"function","name":"send","constant":false,"inputs":[{"name":"amount","type":"uint256"}]}, // {"type":"function","name":"test","constant":false,"inputs":[{"name":"number","type":"uint32"}]}, // {"type":"function","name":"string","constant":false,"inputs":[{"name":"inputs","type":"string"}]}, // {"type":"function","name":"bool","constant":false,"inputs":[{"name":"inputs","type":"bool"}]}, // {"type":"function","name":"address","constant":false,"inputs":[{"name":"inputs","type":"address"}]}, // {"type":"function","name":"uint64[2]","constant":false,"inputs":[{"name":"inputs","type":"uint64[2]"}]}, // {"type":"function","name":"uint64[]","constant":false,"inputs":[{"name":"inputs","type":"uint64[]"}]}, // {"type":"function","name":"foo","constant":false,"inputs":[{"name":"inputs","type":"uint32"}]}, // {"type":"function","name":"bar","constant":false,"inputs":[{"name":"inputs","type":"uint32"},{"name":"string","type":"uint16"}]}, // {"type":"function","name":"_slice","constant":false,"inputs":[{"name":"inputs","type":"uint32[2]"}]}, // {"type":"function","name":"__slice256","constant":false,"inputs":[{"name":"inputs","type":"uint256[2]"}]}, // {"type":"function","name":"sliceAddress","constant":false,"inputs":[{"name":"inputs","type":"address[]"}]}, // {"type":"function","name":"sliceMultiAddress","constant":false,"inputs":[{"name":"a","type":"address[]"},{"name":"b","type":"address[]"}]} // ] //` // abi, err := JSON(strings.NewReader(abiJSON)) // if err != nil { // t.Fatal(err) // } // for name, m := range abi.Methods { // a := fmt.Sprintf("%v", m) // m2, err := abi.MethodById(m.Id()) // if err != nil { // t.Fatalf("Failed to look up ABI method: %v", err) // } // b := fmt.Sprintf("%v", m2) // if a != b { // t.Errorf("Method %v (id %v) not 'findable' by id in ABI", name, common.ToHex(m.Id())) // } // } // //} ================================================ FILE: accounts/abi/argument.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package abi import ( "encoding/json" "fmt" "math/big" "reflect" "strings" "github.com/sero-cash/go-sero/common/math" "github.com/sero-cash/go-czero-import/c_type" ) // Argument holds the name of the argument and the corresponding type. // Types are used when packing and testing arguments. type Argument struct { Name string Type Type Indexed bool // indexed is only used by events } type Arguments []Argument type ArgumentMarshaling struct { Name string Type string InternalType string Components []ArgumentMarshaling Indexed bool } // UnmarshalJSON implements json.Unmarshaler interface func (argument *Argument) UnmarshalJSON(data []byte) error { var arg ArgumentMarshaling err := json.Unmarshal(data, &arg) if err != nil { return fmt.Errorf("argument json err: %v", err) } argument.Type, err = NewType(arg.Type, arg.InternalType, arg.Components) if err != nil { return err } argument.Name = arg.Name argument.Indexed = arg.Indexed return nil } // LengthNonIndexed returns the number of arguments when not counting 'indexed' ones. Only events // can ever have 'indexed' arguments, it should always be false on arguments for method input/output func (arguments Arguments) LengthNonIndexed() int { out := 0 for _, arg := range arguments { if !arg.Indexed { out++ } } return out } // NonIndexed returns the arguments with indexed arguments filtered out func (arguments Arguments) NonIndexed() Arguments { var ret []Argument for _, arg := range arguments { if !arg.Indexed { ret = append(ret, arg) } } return ret } // isTuple returns true for non-atomic constructs, like (uint,uint) or uint[] func (arguments Arguments) isTuple() bool { return len(arguments) > 1 } // Unpack performs the operation hexdata -> Go format func (arguments Arguments) Unpack(v interface{}, data []byte) error { // make sure the passed value is arguments pointer if reflect.Ptr != reflect.ValueOf(v).Kind() { return fmt.Errorf("abi: Unpack(non-pointer %T)", v) } marshalledValues, err := arguments.UnpackValues(data) if err != nil { return err } if len(marshalledValues) == 0 { return fmt.Errorf("abi: Unpack(no-values unmarshalled %T)", v) } if arguments.isTuple() { return arguments.unpackTuple(v, marshalledValues) } return arguments.unpackAtomic(v, marshalledValues[0]) } // UnpackIntoMap performs the operation hexdata -> mapping of argument name to argument value func (arguments Arguments) UnpackIntoMap(v map[string]interface{}, data []byte) error { marshalledValues, err := arguments.UnpackValues(data) if err != nil { return err } return arguments.unpackIntoMap(v, marshalledValues) } // unpackIntoMap unpacks marshalledValues into the provided map[string]interface{} func (arguments Arguments) unpackIntoMap(v map[string]interface{}, marshalledValues []interface{}) error { // Make sure map is not nil if v == nil { return fmt.Errorf("abi: cannot unpack into a nil map") } for i, arg := range arguments.NonIndexed() { v[arg.Name] = marshalledValues[i] } return nil } // unpackTuple unpacks ( hexdata -> go ) a batch of values. func (arguments Arguments) unpackTuple(v interface{}, marshalledValues []interface{}) error { value := reflect.ValueOf(v).Elem() nonIndexedArgs := arguments.NonIndexed() switch value.Kind() { case reflect.Struct: argNames := make([]string, len(nonIndexedArgs)) for i, arg := range nonIndexedArgs { argNames[i] = arg.Name } var err error abi2struct, err := mapArgNamesToStructFields(argNames, value) if err != nil { return err } for i, arg := range nonIndexedArgs { field := value.FieldByName(abi2struct[arg.Name]) if !field.IsValid() { return fmt.Errorf("abi: field %s can't be found in the given value", arg.Name) } if err := set(field, reflect.ValueOf(marshalledValues[i])); err != nil { return err } } case reflect.Slice, reflect.Array: if value.Len() < len(marshalledValues) { return fmt.Errorf("abi: insufficient number of arguments for unpack, want %d, got %d", len(arguments), value.Len()) } for i := range nonIndexedArgs { if err := set(value.Index(i), reflect.ValueOf(marshalledValues[i])); err != nil { return err } } default: return fmt.Errorf("abi:[2] cannot unmarshal tuple in to %v", value.Type()) } return nil } // unpackAtomic unpacks ( hexdata -> go ) a single value func (arguments Arguments) unpackAtomic(v interface{}, marshalledValues interface{}) error { dst := reflect.ValueOf(v).Elem() src := reflect.ValueOf(marshalledValues) if dst.Kind() == reflect.Struct && src.Kind() != reflect.Struct { return set(dst.Field(0), src) } return set(dst, src) } // Computes the full size of an array; // i.e. counting nested arrays, which count towards size for unpacking. func getArraySize(arr *Type) int { size := arr.Size // Arrays can be nested, with each element being the same size arr = arr.Elem for arr.T == ArrayTy { // Keep multiplying by elem.Size while the elem is an array. size *= arr.Size arr = arr.Elem } // Now we have the full array size, including its children. return size } // UnpackValues can be used to unpack ABI-encoded hexdata according to the ABI-specification, // without supplying a struct to unpack into. Instead, this method returns a list containing the // values. An atomic argument will be a list with one element. func (arguments Arguments) UnpackValues(data []byte) ([]interface{}, error) { retval := make([]interface{}, 0, arguments.LengthNonIndexed()) virtualArgs := 0 for index, arg := range arguments.NonIndexed() { marshalledValue, err := toGoType((index+virtualArgs)*32, arg.Type, data) if arg.Type.T == ArrayTy { // If we have a static array, like [3]uint256, these are coded as // just like uint256,uint256,uint256. // This means that we need to add two 'virtual' arguments when // we count the index from now on. // // Array values nested multiple levels deep are also encoded inline: // [2][3]uint256: uint256,uint256,uint256,uint256,uint256,uint256 // // Calculate the full array size to get the correct offset for the next argument. // Decrement it by 1, as the normal index increment is still applied. virtualArgs += getArraySize(&arg.Type) - 1 } if err != nil { return nil, err } retval = append(retval, marshalledValue) } return retval, nil } // PackValues performs the operation Go format -> Hexdata // It is the semantic opposite of UnpackValues func (arguments Arguments) PackValues(args []interface{}) ([]byte, error) { return arguments.Pack(args...) } func (arguments Arguments) PackPrefix(args ...interface{}) ([]byte, error) { abiArgs := arguments if len(args) != len(abiArgs) { return nil, fmt.Errorf("argument count mismatch: %d for %d", len(args), len(abiArgs)) } var result []c_type.PKr for i, a := range args { input := abiArgs[i] // pack the input pkrs, err := input.Type.getAllAddress(reflect.ValueOf(a)) if err != nil { return nil, err } result = append(result, pkrs...) } var ret []byte lenBytes := math.PaddedBigBytes(big.NewInt(int64(len(result))), 2) ret = append(ret, lenBytes...) for _, pkr := range result { ret = append(ret, pkr[:]...) } return ret, nil } // Pack performs the operation Go format -> Hexdata func (arguments Arguments) Pack(args ...interface{}) ([]byte, error) { // Make sure arguments match up and pack them abiArgs := arguments if len(args) != len(abiArgs) { return nil, fmt.Errorf("argument count mismatch: %d for %d", len(args), len(abiArgs)) } // variable input is the output appended at the end of packed // output. This is used for strings and bytes types input. var variableInput []byte // input offset is the bytes offset for packed output inputOffset := 0 for _, abiArg := range abiArgs { if abiArg.Type.T == ArrayTy { inputOffset += 32 * abiArg.Type.Size } else { inputOffset += 32 } } var ret []byte for i, a := range args { input := abiArgs[i] // pack the input packed, err := input.Type.pack(reflect.ValueOf(a)) if err != nil { return nil, err } // check for a slice type (string, bytes, slice) if input.Type.requiresLengthPrefix() { // calculate the offset offset := inputOffset + len(variableInput) // set the offset ret = append(ret, packNum(reflect.ValueOf(offset))...) // Append the packed output to the variable input. The variable input // will be appended at the end of the input. variableInput = append(variableInput, packed...) } else { // append the packed value to the input ret = append(ret, packed...) } } // append the variable input at the end of the packed input ret = append(ret, variableInput...) return ret, nil } // capitalise makes the first character of a string upper case, also removing any // prefixing underscores from the variable names. func capitalise(input string) string { for len(input) > 0 && input[0] == '_' { input = input[1:] } if len(input) == 0 { return "" } return strings.ToUpper(input[:1]) + input[1:] } // ToCamelCase converts an under-score string to a camel-case string func ToCamelCase(input string) string { parts := strings.Split(input, "_") for i, s := range parts { if len(s) > 0 { parts[i] = strings.ToUpper(s[:1]) + s[1:] } } return strings.Join(parts, "") } ================================================ FILE: accounts/abi/bind/auth.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package bind import ( "encoding/binary" "io" "io/ioutil" "math/big" "github.com/sero-cash/go-sero/zero/txtool" "github.com/sero-cash/go-sero/zero/txtool/flight" "github.com/sero-cash/go-czero-import/superzk" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/accounts/keystore" "github.com/sero-cash/go-sero/crypto" ) // NewTransactor is a utility method to easily create a transaction signer from // an encrypted json key stream and the associated passphrase. func NewTransactor(keyin io.Reader, passphrase string, value *big.Int) (*TransactOpts, error) { superzk.ZeroInit_NoCircuit() json, err := ioutil.ReadAll(keyin) if err != nil { return nil, err } key, err := keystore.DecryptKey(json, passphrase) if err != nil { return nil, err } fromPkr := GetMainPkr(key) return NewKeyedTransactor(key, fromPkr, value), nil } func encodeNumber(number uint64) []byte { enc := make([]byte, 8) binary.BigEndian.PutUint64(enc, number) return enc } func GetMainPkr(key *keystore.Key) c_type.PKr { salt := encodeNumber(1) //log.Info("GenIndexPKr", "salt", hexutil.Encode(salt)) random := append(key.Tk[:], salt...) r := crypto.Keccak256Hash(random).HashToUint256() pk := key.Address.ToUint512() return superzk.Pk2PKr(&pk, r) } // NewKeyedTransactor is a utility method to easily create a transaction signer // from a single private key. func NewKeyedTransactor(key *keystore.Key, refundTo c_type.PKr, value *big.Int) *TransactOpts { tk := crypto.PrivkeyToTk(key.PrivateKey, key.Version) return &TransactOpts{ From: tk.ToPk(), FromPKr: refundTo, Value: value, Encrypter: func(txParam *txtool.GTxParam) (*txtool.GTx, error) { priKey := crypto.FromECDSA(key.PrivateKey) var seed c_type.Uint256 copy(seed[:], priKey[:]) sk := superzk.Seed2Sk(&seed, key.Version) gtx, err := flight.SignTx(&sk, txParam) if err != nil { return nil, err } return >x, nil }, } } ================================================ FILE: accounts/abi/bind/backend.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package bind import ( "context" "errors" "math/big" sero "github.com/sero-cash/go-sero" "github.com/sero-cash/go-sero/zero/txtool" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core/types" ) var ( // ErrNoCode is returned by call and transact operations for which the requested // recipient contract to operate on does not exist in the state db or does not // have any code associated with it (i.e. suicided). ErrNoCode = errors.New("no contract code at given address") // This error is raised when attempting to perform a pending state action // on a backend that doesn't implement PendingContractCaller. ErrNoPendingState = errors.New("backend does not support pending state") // This error is returned by WaitDeployed if contract creation leaves an // empty contract behind. ErrNoCodeAfterDeploy = errors.New("no contract code after deployment") ) // ContractCaller defines the methods needed to allow operating with contract on a read // only basis. type ContractCaller interface { // CodeAt returns the code of the given account. This is needed to differentiate // between contract internal errors and the local chain being out of sync. CodeAt(ctx context.Context, contract common.Address, blockNumber *big.Int) ([]byte, error) // ContractCall executes an Ethereum contract call with the specified data as the // input. CallContract(ctx context.Context, call sero.CallMsg, blockNumber *big.Int) ([]byte, error) } // PendingContractCaller defines methods to perform contract calls on the pending state. // Call will try to discover this interface when access to the pending state is requested. // If the backend does not support the pending state, Call returns ErrNoPendingState. type PendingContractCaller interface { // PendingCodeAt returns the code of the given account in the pending state. PendingCodeAt(ctx context.Context, contract common.Address) ([]byte, error) // PendingCallContract executes an Ethereum contract call against the pending state. PendingCallContract(ctx context.Context, call sero.CallMsg) ([]byte, error) } // ContractTransactor defines the methods needed to allow operating with contract // on a write only basis. Beside the transacting method, the remainder are helpers // used when the user does not provide some needed values, but rather leaves it up // to the transactor to decide. type ContractTransactor interface { // PendingCodeAt returns the code of the given account in the pending state. PendingCodeAt(ctx context.Context, account common.Address) ([]byte, error) // PendingNonceAt retrieves the current pending nonce associated with an account. //PendingNonceAt(ctx context.Context, account common.Data) (uint64, error) // SuggestGasPrice retrieves the currently suggested gas price to allow a timely // execution of a transaction. SuggestGasPrice(ctx context.Context) (*big.Int, error) // EstimateGas tries to estimate the gas needed to execute a specific // transaction based on the current pending state of the backend blockchain. // There is no guarantee that this is the true gas limit requirement as other // transactions may be added or removed by miners, but it should provide a basis // for setting a reasonable default. EstimateGas(ctx context.Context, call sero.CallMsg) (gas uint64, err error) GenContractTx(ctx context.Context, msg sero.CallMsg) (*txtool.GTxParam, error) CommitTx(ctx context.Context, arg *txtool.GTx) error } // ContractFilterer defines the methods needed to access log events using one-off // queries or continuous event subscriptions. type ContractFilterer interface { // FilterLogs executes a log filter operation, blocking during execution and // returning all the results in one batch. // // TODO(karalabe): Deprecate when the subscription one can return past data too. FilterLogs(ctx context.Context, query sero.FilterQuery) ([]types.Log, error) // SubscribeFilterLogs creates a background log filtering operation, returning // a subscription immediately, which can be used to stream the found events. SubscribeFilterLogs(ctx context.Context, query sero.FilterQuery, ch chan<- types.Log) (sero.Subscription, error) } // DeployBackend wraps the operations needed by WaitMined and WaitDeployed. type DeployBackend interface { TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error) CodeAt(ctx context.Context, account common.Address, blockNumber *big.Int) ([]byte, error) } // ContractBackend defines the methods needed to work with contracts on a read-write basis. type ContractBackend interface { ContractCaller ContractTransactor ContractFilterer } ================================================ FILE: accounts/abi/bind/base.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package bind import ( "context" "fmt" "math/big" "github.com/sero-cash/go-sero/common/address" "github.com/sero-cash/go-sero/common/hexutil" "github.com/sero-cash/go-sero" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/accounts/abi" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/event" "github.com/sero-cash/go-sero/zero/txtool" ) // SignerFn is a signer function callback when a contract requires a method to // sign the transaction before submission. type EncrypterFn func(txParam *txtool.GTxParam) (tx *txtool.GTx, e error) // CallOpts is the collection of options to fine tune a contract call request. type CallOpts struct { Pending bool // Whether to operate on the pending state or the last known one FromPKr *c_type.PKr // Optional the sender address, otherwise the first account is used BlockNumber *big.Int // Optional the block number on which the call should be performed Context context.Context // Network context to support cancellation and timeouts (nil = no timeout) } // TransactOpts is the collection of authorization data required to create a // valid Ethereum transaction. type TransactOpts struct { From address.PKAddress FromPKr c_type.PKr // the pkr of form account Encrypter EncrypterFn // Method to use for signing the transaction (mandatory) Value *big.Int // Funds to transfer along along the transaction (nil = 0 = no funds) GasPrice *big.Int // Gas price to use for the transaction execution (nil = gas price oracle) GasLimit uint64 // Gas limit to set for the transaction execution (0 = estimate) Context context.Context // Network context to support cancellation and timeouts (nil = no timeout) } // FilterOpts is the collection of options to fine tune filtering for events // within a bound contract. type FilterOpts struct { Start uint64 // Start of the queried range End *uint64 // End of the range (nil = latest) Context context.Context // Network context to support cancellation and timeouts (nil = no timeout) } // WatchOpts is the collection of options to fine tune subscribing for events // within a bound contract. type WatchOpts struct { Start *uint64 // Start of the queried range (nil = latest) Context context.Context // Network context to support cancellation and timeouts (nil = no timeout) } // BoundContract is the base wrapper object that reflects a contract on the // Ethereum network. It contains a collection of methods that are used by the // higher level contract bindings to operate. type BoundContract struct { address common.Address // Deployment address of the contract on the Ethereum blockchain abi abi.ABI // Reflect based ABI to access the correct Ethereum methods caller ContractCaller // Read interface to interact with the blockchain transactor ContractTransactor // Write interface to interact with the blockchain filterer ContractFilterer // Event filtering to interact with the blockchain } // NewBoundContract creates a low level contract interface through which calls // and transactions may be made through. func NewBoundContract(address common.Address, abi abi.ABI, caller ContractCaller, transactor ContractTransactor, filterer ContractFilterer) *BoundContract { return &BoundContract{ address: address, abi: abi, caller: caller, transactor: transactor, filterer: filterer, } } // DeployContract deploys a contract onto the Ethereum blockchain and binds the // deployment address with a Go wrapper. func DeployContract(opts *TransactOpts, abi abi.ABI, bytecode []byte, backend ContractBackend, params ...interface{}) (common.Address, *types.Transaction, *BoundContract, error) { // Otherwise try to deploy the contract c := NewBoundContract(common.Address{}, abi, backend, backend, backend) prefix, err := c.abi.PackPrefix("", c_type.RandUint128(), params...) if err != nil { return common.Address{}, nil, nil, err } input, err := c.abi.Pack("", params...) if err != nil { return common.Address{}, nil, nil, err } data := append(prefix, bytecode...) input = append(data, input...) fmt.Println("DeployContract prefix", hexutil.Encode(prefix[:])) fmt.Println("DeployContract byteCode", hexutil.Encode(bytecode[:])) fmt.Println("DeployContract data", hexutil.Encode(input)) tx, err := c.transact(opts, nil, input) if err != nil { return common.Address{}, nil, nil, err } return common.Address{}, tx, c, nil } // Call invokes the (constant) contract method with params as input values and // sets the output to result. The result type might be a single field for simple // returns, a slice of interfaces for anonymous returns and a struct for named // returns. func (c *BoundContract) Call(opts *CallOpts, result interface{}, method string, params ...interface{}) error { // Don't crash on a lazy user if opts == nil { opts = new(CallOpts) } var rand c_type.Uint128 copy(rand[:], c.address[:16]) prefix, err := c.abi.PackPrefix(method, rand, params...) if err != nil { return err } // Pack the input, call and unpack the results input, err := c.abi.Pack(method, params...) if err != nil { return err } input = append(prefix, input...) var ( msg = sero.CallMsg{FromPKr: opts.FromPKr, To: &c.address, Data: input} ctx = ensureContext(opts.Context) code []byte output []byte ) if opts.Pending { pb, ok := c.caller.(PendingContractCaller) if !ok { return ErrNoPendingState } output, err = pb.PendingCallContract(ctx, msg) if err == nil && len(output) == 0 { // Make sure we have a contract to operate on, and bail out otherwise. if code, err = pb.PendingCodeAt(ctx, c.address); err != nil { return err } else if len(code) == 0 { return ErrNoCode } } } else { output, err = c.caller.CallContract(ctx, msg, opts.BlockNumber) if err == nil && len(output) == 0 { // Make sure we have a contract to operate on, and bail out otherwise. if code, err = c.caller.CodeAt(ctx, c.address, opts.BlockNumber); err != nil { return err } else if len(code) == 0 { return ErrNoCode } } } if err != nil { return err } return c.abi.Unpack(result, method, output) } // Transact invokes the (paid) contract method with params as input values. func (c *BoundContract) Transact(opts *TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { // Otherwise pack up the parameters and invoke the contract var rand c_type.Uint128 copy(rand[:], c.address[:16]) prefix, err := c.abi.PackPrefix(method, rand, params...) if err != nil { return nil, err } input, err := c.abi.Pack(method, params...) if err != nil { return nil, err } input = append(prefix, input...) return c.transact(opts, &c.address, input) } // Transfer initiates a plain transaction to move funds to the contract, calling // its default method if one is available. func (c *BoundContract) Transfer(opts *TransactOpts) (*types.Transaction, error) { return c.transact(opts, &c.address, nil) } // transact executes an actual transaction invocation, first deriving any missing // authorization fields, and then scheduling the transaction for execution. func (c *BoundContract) transact(opts *TransactOpts, contract *common.Address, input []byte) (*types.Transaction, error) { var err error // Ensure a valid value field and resolve the account nonce value := opts.Value if value == nil { value = new(big.Int) } // Figure out the gas allowance and gas price values gasPrice := opts.GasPrice if gasPrice == nil { gasPrice, err = c.transactor.SuggestGasPrice(ensureContext(opts.Context)) if err != nil { return nil, fmt.Errorf("failed to suggest gas price: %v", err) } } gasLimit := opts.GasLimit if gasLimit == 0 { // Gas estimation cannot succeed without code for method invocations if contract != nil { if code, err := c.transactor.PendingCodeAt(ensureContext(opts.Context), c.address); err != nil { return nil, err } else if len(code) == 0 { return nil, ErrNoCode } } // If the contract surely has code (or code is not needed), estimate the transaction msg := sero.CallMsg{FromPKr: &opts.FromPKr, To: contract, Value: value, Data: input} gasLimit, err = c.transactor.EstimateGas(ensureContext(opts.Context), msg) if err != nil { return nil, fmt.Errorf("failed to estimate gas needed: %v", err) } } msg := sero.CallMsg{From: opts.From, FromPKr: &opts.FromPKr, To: contract, GasPrice: gasPrice, Gas: gasLimit, Value: value, Data: input} preTx, err := c.transactor.GenContractTx(ensureContext(opts.Context), msg) if err != nil { return nil, err } gtx, err := opts.Encrypter(preTx) err = c.transactor.CommitTx(ensureContext(opts.Context), gtx) if err != nil { return nil, err } signedTx := types.NewTxWithGTx(opts.GasLimit, gasPrice, >x.Tx) return signedTx, nil } // FilterLogs filters contract logs for past blocks, returning the necessary // channels to construct a strongly typed bound iterator on top of them. func (c *BoundContract) FilterLogs(opts *FilterOpts, name string, query ...[]interface{}) (chan types.Log, event.Subscription, error) { // Don't crash on a lazy user if opts == nil { opts = new(FilterOpts) } // Append the event selector to the query parameters and construct the topic set query = append([][]interface{}{{c.abi.Events[name].ID}}, query...) topics, err := makeTopics(query...) if err != nil { return nil, nil, err } // Start the background filtering logs := make(chan types.Log, 128) config := sero.FilterQuery{ Addresses: []common.Address{c.address}, Topics: topics, FromBlock: new(big.Int).SetUint64(opts.Start), } if opts.End != nil { config.ToBlock = new(big.Int).SetUint64(*opts.End) } /* TODO(karalabe): Replace the rest of the method below with this when supported sub, err := c.filterer.SubscribeFilterLogs(ensureContext(opts.Context), config, logs) */ buff, err := c.filterer.FilterLogs(ensureContext(opts.Context), config) if err != nil { return nil, nil, err } sub, err := event.NewSubscription(func(quit <-chan struct{}) error { for _, log := range buff { select { case logs <- log: case <-quit: return nil } } return nil }), nil if err != nil { return nil, nil, err } return logs, sub, nil } // WatchLogs filters subscribes to contract logs for future blocks, returning a // subscription object that can be used to tear down the watcher. func (c *BoundContract) WatchLogs(opts *WatchOpts, name string, query ...[]interface{}) (chan types.Log, event.Subscription, error) { // Don't crash on a lazy user if opts == nil { opts = new(WatchOpts) } // Append the event selector to the query parameters and construct the topic set query = append([][]interface{}{{c.abi.Events[name].ID}}, query...) topics, err := makeTopics(query...) if err != nil { return nil, nil, err } // Start the background filtering logs := make(chan types.Log, 128) config := sero.FilterQuery{ Addresses: []common.Address{c.address}, Topics: topics, } if opts.Start != nil { config.FromBlock = new(big.Int).SetUint64(*opts.Start) } sub, err := c.filterer.SubscribeFilterLogs(ensureContext(opts.Context), config, logs) if err != nil { return nil, nil, err } return logs, sub, nil } // UnpackLog unpacks a retrieved log into the provided output structure. func (c *BoundContract) UnpackLog(out interface{}, event string, log types.Log) error { if len(log.Data) > 0 { if err := c.abi.Unpack(out, event, log.Data); err != nil { return err } } var indexed abi.Arguments for _, arg := range c.abi.Events[event].Inputs { if arg.Indexed { indexed = append(indexed, arg) } } return parseTopics(out, indexed, log.Topics[1:]) } // UnpackLogIntoMap unpacks a retrieved log into the provided map. func (c *BoundContract) UnpackLogIntoMap(out map[string]interface{}, event string, log types.Log) error { if len(log.Data) > 0 { if err := c.abi.UnpackIntoMap(out, event, log.Data); err != nil { return err } } var indexed abi.Arguments for _, arg := range c.abi.Events[event].Inputs { if arg.Indexed { indexed = append(indexed, arg) } } return parseTopicsIntoMap(out, indexed, log.Topics[1:]) } // ensureContext is a helper method to ensure a context is not nil, even if the // user specified it as such. func ensureContext(ctx context.Context) context.Context { if ctx == nil { return context.TODO() } return ctx } ================================================ FILE: accounts/abi/bind/bind.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // Package bind generates Ethereum contract Go bindings. // // Detailed usage document and tutorial available on the go-ethereum Wiki page: // https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts package bind import ( "bytes" "fmt" "go/format" "regexp" "strings" "text/template" "unicode" "github.com/sero-cash/go-sero/accounts/abi" "github.com/sero-cash/go-sero/log" ) // Lang is a target programming language selector to generate bindings for. type Lang int const ( LangGo Lang = iota //LangJava //LangObjC ) // Bind generates a Go wrapper around a contract ABI. This wrapper isn't meant // to be used as is in client code, but rather as an intermediate struct which // enforces compile time type safety and naming convention opposed to having to // manually maintain hard coded strings that break on runtime. func Bind(types []string, abis []string, bytecodes []string, fsigs []map[string]string, pkg string, lang Lang, libs map[string]string, aliases map[string]string) (string, error) { var ( // contracts is the map of each individual contract requested binding contracts = make(map[string]*tmplContract) // structs is the map of all reclared structs shared by passed contracts. structs = make(map[string]*tmplStruct) // isLib is the map used to flag each encountered library as such isLib = make(map[string]struct{}) ) for i := 0; i < len(types); i++ { // Parse the actual ABI to generate the binding for evmABI, err := abi.JSON(strings.NewReader(abis[i])) if err != nil { return "", err } // Strip any whitespace from the JSON ABI strippedABI := strings.Map(func(r rune) rune { if unicode.IsSpace(r) { return -1 } return r }, abis[i]) // Extract the call and transact methods; events, struct definitions; and sort them alphabetically var ( calls = make(map[string]*tmplMethod) transacts = make(map[string]*tmplMethod) events = make(map[string]*tmplEvent) fallback *tmplMethod receive *tmplMethod // identifiers are used to detect duplicated identifier of function // and event. For all calls, transacts and events, abigen will generate // corresponding bindings. However we have to ensure there is no // identifier coliision in the bindings of these categories. callIdentifiers = make(map[string]bool) transactIdentifiers = make(map[string]bool) eventIdentifiers = make(map[string]bool) ) for _, original := range evmABI.Methods { // Normalize the method for capital cases and non-anonymous inputs/outputs normalized := original normalizedName := methodNormalizer[lang](alias(aliases, original.Name)) // Ensure there is no duplicated identifier var identifiers = callIdentifiers if !original.IsConstant() { identifiers = transactIdentifiers } if identifiers[normalizedName] { return "", fmt.Errorf("duplicated identifier \"%s\"(normalized \"%s\"), use --alias for renaming", original.Name, normalizedName) } identifiers[normalizedName] = true normalized.Name = normalizedName normalized.Inputs = make([]abi.Argument, len(original.Inputs)) copy(normalized.Inputs, original.Inputs) for j, input := range normalized.Inputs { if input.Name == "" { normalized.Inputs[j].Name = fmt.Sprintf("arg%d", j) } if hasStruct(input.Type) { bindStructType[lang](input.Type, structs, true) } } normalized.Outputs = make([]abi.Argument, len(original.Outputs)) copy(normalized.Outputs, original.Outputs) for j, output := range normalized.Outputs { if output.Name != "" { normalized.Outputs[j].Name = capitalise(output.Name) } if hasStruct(output.Type) { bindStructType[lang](output.Type, structs, false) } } // Append the methods to the call or transact lists if original.IsConstant() { calls[original.Name] = &tmplMethod{Original: original, Normalized: normalized, Structured: structured(original.Outputs)} } else { transacts[original.Name] = &tmplMethod{Original: original, Normalized: normalized, Structured: structured(original.Outputs)} } } for _, original := range evmABI.Events { // Skip anonymous events as they don't support explicit filtering if original.Anonymous { continue } // Normalize the event for capital cases and non-anonymous outputs normalized := original // Ensure there is no duplicated identifier normalizedName := methodNormalizer[lang](alias(aliases, original.Name)) if eventIdentifiers[normalizedName] { return "", fmt.Errorf("duplicated identifier \"%s\"(normalized \"%s\"), use --alias for renaming", original.Name, normalizedName) } eventIdentifiers[normalizedName] = true normalized.Name = normalizedName normalized.Inputs = make([]abi.Argument, len(original.Inputs)) copy(normalized.Inputs, original.Inputs) for j, input := range normalized.Inputs { if input.Name == "" { normalized.Inputs[j].Name = fmt.Sprintf("arg%d", j) } if hasStruct(input.Type) { bindStructType[lang](input.Type, structs, true) } } // Append the event to the accumulator list events[original.Name] = &tmplEvent{Original: original, Normalized: normalized} } // Add two special fallback functions if they exist if evmABI.HasFallback() { fallback = &tmplMethod{Original: evmABI.Fallback} } if evmABI.HasReceive() { receive = &tmplMethod{Original: evmABI.Receive} } // There is no easy way to pass arbitrary java objects to the Go side. //if len(structs) > 0 && lang == LangJava { // return "", errors.New("java binding for tuple arguments is not supported yet") //} contracts[types[i]] = &tmplContract{ Type: capitalise(types[i]), InputABI: strings.Replace(strippedABI, "\"", "\\\"", -1), InputBin: strings.TrimPrefix(strings.TrimSpace(bytecodes[i]), "0x"), Constructor: evmABI.Constructor, Calls: calls, Transacts: transacts, Fallback: fallback, Receive: receive, Events: events, Libraries: make(map[string]string), } // Function 4-byte signatures are stored in the same sequence // as types, if available. if len(fsigs) > i { contracts[types[i]].FuncSigs = fsigs[i] } // Parse library references. for pattern, name := range libs { matched, err := regexp.Match("__\\$"+pattern+"\\$__", []byte(contracts[types[i]].InputBin)) if err != nil { log.Error("Could not search for pattern", "pattern", pattern, "contract", contracts[types[i]], "err", err) } if matched { contracts[types[i]].Libraries[pattern] = name // keep track that this type is a library if _, ok := isLib[name]; !ok { isLib[name] = struct{}{} } } } } // Check if that type has already been identified as a library for i := 0; i < len(types); i++ { _, ok := isLib[types[i]] contracts[types[i]].Library = ok } // Generate the contract template data content and render it data := &tmplData{ Package: pkg, Contracts: contracts, Libraries: libs, Structs: structs, } buffer := new(bytes.Buffer) funcs := map[string]interface{}{ "bindtype": bindType[lang], "bindtopictype": bindTopicType[lang], "namedtype": namedType[lang], "capitalise": capitalise, "decapitalise": decapitalise, } tmpl := template.Must(template.New("").Funcs(funcs).Parse(tmplSource[lang])) if err := tmpl.Execute(buffer, data); err != nil { return "", err } // For Go bindings pass the code through gofmt to clean it up if lang == LangGo { code, err := format.Source(buffer.Bytes()) if err != nil { return "", fmt.Errorf("%v\n%s", err, buffer) } return string(code), nil } // For all others just return as is for now return buffer.String(), nil } // bindType is a set of type binders that convert Solidity types to some supported // programming language types. var bindType = map[Lang]func(kind abi.Type, structs map[string]*tmplStruct, input bool) string{ LangGo: bindTypeGo, //LangJava: bindTypeJava, } // bindBasicTypeGo converts basic solidity types(except array, slice and tuple) to Go one. func bindBasicTypeGo(kind abi.Type, input bool) string { switch kind.T { case abi.AddressTy: if input { return "common.Address" } else { return "common.ContractAddress" } case abi.IntTy, abi.UintTy: parts := regexp.MustCompile(`(u)?int([0-9]*)`).FindStringSubmatch(kind.String()) switch parts[2] { case "8", "16", "32", "64": return fmt.Sprintf("%sint%s", parts[1], parts[2]) } return "*big.Int" case abi.FixedBytesTy: return fmt.Sprintf("[%d]byte", kind.Size) case abi.BytesTy: return "[]byte" case abi.FunctionTy: return "[24]byte" default: // string, bool types return kind.String() } } // bindTypeGo converts solidity types to Go ones. Since there is no clear mapping // from all Solidity types to Go ones (e.g. uint17), those that cannot be exactly // mapped will use an upscaled type (e.g. BigDecimal). func bindTypeGo(kind abi.Type, structs map[string]*tmplStruct, input bool) string { switch kind.T { case abi.TupleTy: return structs[kind.TupleRawName+kind.String()].Name case abi.ArrayTy: return fmt.Sprintf("[%d]", kind.Size) + bindTypeGo(*kind.Elem, structs, input) case abi.SliceTy: return "[]" + bindTypeGo(*kind.Elem, structs, input) default: return bindBasicTypeGo(kind, input) } } // bindBasicTypeJava converts basic solidity types(except array, slice and tuple) to Java one. func bindBasicTypeJava(kind abi.Type) string { switch kind.T { case abi.AddressTy: return "ContractAddress" case abi.IntTy, abi.UintTy: // Note that uint and int (without digits) are also matched, // these are size 256, and will translate to BigInt (the default). parts := regexp.MustCompile(`(u)?int([0-9]*)`).FindStringSubmatch(kind.String()) if len(parts) != 3 { return kind.String() } // All unsigned integers should be translated to BigInt since gomobile doesn't // support them. if parts[1] == "u" { return "BigInt" } namedSize := map[string]string{ "8": "byte", "16": "short", "32": "int", "64": "long", }[parts[2]] // default to BigInt if namedSize == "" { namedSize = "BigInt" } return namedSize case abi.FixedBytesTy, abi.BytesTy: return "byte[]" case abi.BoolTy: return "boolean" case abi.StringTy: return "String" case abi.FunctionTy: return "byte[24]" default: return kind.String() } } // pluralizeJavaType explicitly converts multidimensional types to predefined // type in go side. func pluralizeJavaType(typ string) string { switch typ { case "boolean": return "Bools" case "String": return "Strings" case "Address": return "Addresses" case "byte[]": return "Binaries" case "BigInt": return "BigInts" } return typ + "[]" } // bindTypeJava converts a Solidity type to a Java one. Since there is no clear mapping // from all Solidity types to Java ones (e.g. uint17), those that cannot be exactly // mapped will use an upscaled type (e.g. BigDecimal). /*func bindTypeJava(kind abi.Type, structs map[string]*tmplStruct) string { switch kind.T { case abi.TupleTy: return structs[kind.TupleRawName+kind.String()].Name case abi.ArrayTy, abi.SliceTy: return pluralizeJavaType(bindTypeJava(*kind.Elem, structs)) default: return bindBasicTypeJava(kind) } } */ // bindTopicType is a set of type binders that convert Solidity types to some // supported programming language topic types. var bindTopicType = map[Lang]func(kind abi.Type, structs map[string]*tmplStruct, input bool) string{ LangGo: bindTopicTypeGo, //LangJava: bindTopicTypeJava, } // bindTopicTypeGo converts a Solidity topic type to a Go one. It is almost the same // funcionality as for simple types, but dynamic types get converted to hashes. func bindTopicTypeGo(kind abi.Type, structs map[string]*tmplStruct, input bool) string { bound := bindTypeGo(kind, structs, input) // todo(rjl493456442) according solidity documentation, indexed event // parameters that are not value types i.e. arrays and structs are not // stored directly but instead a keccak256-hash of an encoding is stored. // // We only convert stringS and bytes to hash, still need to deal with // array(both fixed-size and dynamic-size) and struct. if bound == "string" || bound == "[]byte" { bound = "common.Hash" } return bound } // bindTopicTypeJava converts a Solidity topic type to a Java one. It is almost the same // funcionality as for simple types, but dynamic types get converted to hashes. /*func bindTopicTypeJava(kind abi.Type, structs map[string]*tmplStruct) string { bound := bindTypeJava(kind, structs) // todo(rjl493456442) according solidity documentation, indexed event // parameters that are not value types i.e. arrays and structs are not // stored directly but instead a keccak256-hash of an encoding is stored. // // We only convert stringS and bytes to hash, still need to deal with // array(both fixed-size and dynamic-size) and struct. if bound == "String" || bound == "byte[]" { bound = "Hash" } return bound } */ // bindStructType is a set of type binders that convert Solidity tuple types to some supported // programming language struct definition. var bindStructType = map[Lang]func(kind abi.Type, structs map[string]*tmplStruct, input bool) string{ LangGo: bindStructTypeGo, //LangJava: bindStructTypeJava, } // bindStructTypeGo converts a Solidity tuple type to a Go one and records the mapping // in the given map. // Notably, this function will resolve and record nested struct recursively. func bindStructTypeGo(kind abi.Type, structs map[string]*tmplStruct, input bool) string { switch kind.T { case abi.TupleTy: // We compose raw struct name and canonical parameter expression // together here. The reason is before solidity v0.5.11, kind.TupleRawName // is empty, so we use canonical parameter expression to distinguish // different struct definition. From the consideration of backward // compatibility, we concat these two together so that if kind.TupleRawName // is not empty, it can have unique id. id := kind.TupleRawName + kind.String() if s, exist := structs[id]; exist { return s.Name } var fields []*tmplField for i, elem := range kind.TupleElems { field := bindStructTypeGo(*elem, structs, input) fields = append(fields, &tmplField{Type: field, Name: capitalise(kind.TupleRawNames[i]), SolKind: *elem}) } name := kind.TupleRawName if name == "" { name = fmt.Sprintf("Struct%d", len(structs)) } structs[id] = &tmplStruct{ Name: name, Fields: fields, } return name case abi.ArrayTy: return fmt.Sprintf("[%d]", kind.Size) + bindStructTypeGo(*kind.Elem, structs, input) case abi.SliceTy: return "[]" + bindStructTypeGo(*kind.Elem, structs, input) default: return bindBasicTypeGo(kind, input) } } // bindStructTypeJava converts a Solidity tuple type to a Java one and records the mapping // in the given map. // Notably, this function will resolve and record nested struct recursively. /*func bindStructTypeJava(kind abi.Type, structs map[string]*tmplStruct) string { switch kind.T { case abi.TupleTy: // We compose raw struct name and canonical parameter expression // together here. The reason is before solidity v0.5.11, kind.TupleRawName // is empty, so we use canonical parameter expression to distinguish // different struct definition. From the consideration of backward // compatibility, we concat these two together so that if kind.TupleRawName // is not empty, it can have unique id. id := kind.TupleRawName + kind.String() if s, exist := structs[id]; exist { return s.Name } var fields []*tmplField for i, elem := range kind.TupleElems { field := bindStructTypeJava(*elem, structs) fields = append(fields, &tmplField{Type: field, Name: decapitalise(kind.TupleRawNames[i]), SolKind: *elem}) } name := kind.TupleRawName if name == "" { name = fmt.Sprintf("Class%d", len(structs)) } structs[id] = &tmplStruct{ Name: name, Fields: fields, } return name case abi.ArrayTy, abi.SliceTy: return pluralizeJavaType(bindStructTypeJava(*kind.Elem, structs)) default: return bindBasicTypeJava(kind) } } */ // namedType is a set of functions that transform language specific types to // named versions that my be used inside method names. var namedType = map[Lang]func(string, abi.Type) string{ LangGo: func(string, abi.Type) string { panic("this shouldn't be needed") }, //LangJava: namedTypeJava, } // namedTypeJava converts some primitive data types to named variants that can // be used as parts of method names. /*func namedTypeJava(javaKind string, solKind abi.Type) string { switch javaKind { case "byte[]": return "Binary" case "boolean": return "Bool" default: parts := regexp.MustCompile(`(u)?int([0-9]*)(\[[0-9]*\])?`).FindStringSubmatch(solKind.String()) if len(parts) != 4 { return javaKind } switch parts[2] { case "8", "16", "32", "64": if parts[3] == "" { return capitalise(fmt.Sprintf("%sint%s", parts[1], parts[2])) } return capitalise(fmt.Sprintf("%sint%ss", parts[1], parts[2])) default: return javaKind } } } */ // alias returns an alias of the given string based on the aliasing rules // or returns itself if no rule is matched. func alias(aliases map[string]string, n string) string { if alias, exist := aliases[n]; exist { return alias } return n } // methodNormalizer is a name transformer that modifies Solidity method names to // conform to target language naming concentions. var methodNormalizer = map[Lang]func(string) string{ LangGo: abi.ToCamelCase, //LangJava: decapitalise, } // capitalise makes a camel-case string which starts with an upper case character. var capitalise = abi.ToCamelCase // decapitalise makes a camel-case string which starts with a lower case character. func decapitalise(input string) string { if len(input) == 0 { return input } goForm := abi.ToCamelCase(input) return strings.ToLower(goForm[:1]) + goForm[1:] } // structured checks whether a list of ABI data types has enough information to // operate through a proper Go struct or if flat returns are needed. func structured(args abi.Arguments) bool { if len(args) < 2 { return false } exists := make(map[string]bool) for _, out := range args { // If the name is anonymous, we can't organize into a struct if out.Name == "" { return false } // If the field name is empty when normalized or collides (var, Var, _var, _Var), // we can't organize into a struct field := capitalise(out.Name) if field == "" || exists[field] { return false } exists[field] = true } return true } // hasStruct returns an indicator whether the given type is struct, struct slice // or struct array. func hasStruct(t abi.Type) bool { switch t.T { case abi.SliceTy: return hasStruct(*t.Elem) case abi.ArrayTy: return hasStruct(*t.Elem) case abi.TupleTy: return true default: return false } } ================================================ FILE: accounts/abi/bind/template.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package bind import "github.com/sero-cash/go-sero/accounts/abi" // tmplData is the data structure required to fill the binding template. type tmplData struct { Package string // Name of the package to place the generated file in Contracts map[string]*tmplContract // List of contracts to generate into this file Libraries map[string]string // Map the bytecode's link pattern to the library name Structs map[string]*tmplStruct // Contract struct type definitions } // tmplContract contains the data needed to generate an individual contract binding. type tmplContract struct { Type string // Type name of the main contract binding InputABI string // JSON ABI used as the input to generate the binding from InputBin string // Optional EVM bytecode used to denetare deploy code from FuncSigs map[string]string // Optional map: string signature -> 4-byte signature Constructor abi.Method // Contract constructor for deploy parametrization Calls map[string]*tmplMethod // Contract calls that only read state data Transacts map[string]*tmplMethod // Contract calls that write state data Fallback *tmplMethod // Additional special fallback function Receive *tmplMethod // Additional special receive function Events map[string]*tmplEvent // Contract events accessors Libraries map[string]string // Same as tmplData, but filtered to only keep what the contract needs Library bool // Indicator whether the contract is a library } // tmplMethod is a wrapper around an abi.Method that contains a few preprocessed // and cached data fields. type tmplMethod struct { Original abi.Method // Original method as parsed by the abi package Normalized abi.Method // Normalized version of the parsed method (capitalized names, non-anonymous args/returns) Structured bool // Whether the returns should be accumulated into a struct } // tmplEvent is a wrapper around an a type tmplEvent struct { Original abi.Event // Original event as parsed by the abi package Normalized abi.Event // Normalized version of the parsed fields } // tmplField is a wrapper around a struct field with binding language // struct type definition and relative filed name. type tmplField struct { Type string // Field type representation depends on target binding language Name string // Field name converted from the raw user-defined field name SolKind abi.Type // Raw abi type information } // tmplStruct is a wrapper around an abi.tuple contains an auto-generated // struct name. type tmplStruct struct { Name string // Auto-generated struct name(before solidity v0.5.11) or raw name. Fields []*tmplField // Struct fields definition depends on the binding language. } // tmplSource is language to template mapping containing all the supported // programming languages the package can generate to. var tmplSource = map[Lang]string{ LangGo: tmplSourceGo, } // tmplSourceGo is the Go source template use to generate the contract binding // based on. const tmplSourceGo = ` // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. package {{.Package}} import ( "math/big" "strings" sero "github.com/sero-cash/go-sero" "github.com/sero-cash/go-sero/accounts/abi" "github.com/sero-cash/go-sero/accounts/abi/bind" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/event" ) // Reference imports to suppress errors if they are not otherwise used. var ( _ = big.NewInt _ = strings.NewReader _ = sero.NotFound _ = bind.Bind _ = common.Big1 _ = types.BloomLookup _ = event.NewSubscription ) {{$TRUE := true}} {{$FALSE := false}} {{$structs := .Structs}} {{range $structs}} // {{.Name}} is an auto generated low-level Go binding around an user-defined struct. type {{.Name}} struct { {{range $field := .Fields}} {{$field.Name}} {{$field.Type}}{{end}} } {{end}} {{range $contract := .Contracts}} // {{.Type}}ABI is the input ABI used to generate the binding from. const {{.Type}}ABI = "{{.InputABI}}" {{if $contract.FuncSigs}} // {{.Type}}FuncSigs maps the 4-byte function signature to its string representation. var {{.Type}}FuncSigs = map[string]string{ {{range $strsig, $binsig := .FuncSigs}}"{{$binsig}}": "{{$strsig}}", {{end}} } {{end}} {{if .InputBin}} // {{.Type}}Bin is the compiled bytecode used for deploying new contracts. var {{.Type}}Bin = "0x{{.InputBin}}" // Deploy{{.Type}} deploys a new Ethereum contract, binding an instance of {{.Type}} to it. func Deploy{{.Type}}(auth *bind.TransactOpts, backend bind.ContractBackend {{range .Constructor.Inputs}}, {{.Name}} {{bindtype .Type $structs $TRUE}}{{end}}) (common.Address, *types.Transaction, *{{.Type}}, error) { parsed, err := abi.JSON(strings.NewReader({{.Type}}ABI)) if err != nil { return common.Address{}, nil, nil, err } {{range $pattern, $name := .Libraries}} {{decapitalise $name}}Addr, _, _, _ := Deploy{{capitalise $name}}(auth, backend) {{$contract.Type}}Bin = strings.Replace({{$contract.Type}}Bin, "__${{$pattern}}$__", {{decapitalise $name}}Addr.String()[2:], -1) {{end}} address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex({{.Type}}Bin), backend {{range .Constructor.Inputs}}, {{.Name}}{{end}}) if err != nil { return common.Address{}, nil, nil, err } return address, tx, &{{.Type}}{ {{.Type}}Caller: {{.Type}}Caller{contract: contract}, {{.Type}}Transactor: {{.Type}}Transactor{contract: contract}, {{.Type}}Filterer: {{.Type}}Filterer{contract: contract} }, nil } {{end}} // {{.Type}} is an auto generated Go binding around an Ethereum contract. type {{.Type}} struct { {{.Type}}Caller // Read-only binding to the contract {{.Type}}Transactor // Write-only binding to the contract {{.Type}}Filterer // Log filterer for contract events } // {{.Type}}Caller is an auto generated read-only Go binding around an Ethereum contract. type {{.Type}}Caller struct { contract *bind.BoundContract // Generic contract wrapper for the low level calls } // {{.Type}}Transactor is an auto generated write-only Go binding around an Ethereum contract. type {{.Type}}Transactor struct { contract *bind.BoundContract // Generic contract wrapper for the low level calls } // {{.Type}}Filterer is an auto generated log filtering Go binding around an Ethereum contract events. type {{.Type}}Filterer struct { contract *bind.BoundContract // Generic contract wrapper for the low level calls } // {{.Type}}Session is an auto generated Go binding around an Ethereum contract, // with pre-set call and transact options. type {{.Type}}Session struct { Contract *{{.Type}} // Generic contract binding to set the session for CallOpts bind.CallOpts // Call options to use throughout this session TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session } // {{.Type}}CallerSession is an auto generated read-only Go binding around an Ethereum contract, // with pre-set call options. type {{.Type}}CallerSession struct { Contract *{{.Type}}Caller // Generic contract caller binding to set the session for CallOpts bind.CallOpts // Call options to use throughout this session } // {{.Type}}TransactorSession is an auto generated write-only Go binding around an Ethereum contract, // with pre-set transact options. type {{.Type}}TransactorSession struct { Contract *{{.Type}}Transactor // Generic contract transactor binding to set the session for TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session } // {{.Type}}Raw is an auto generated low-level Go binding around an Ethereum contract. type {{.Type}}Raw struct { Contract *{{.Type}} // Generic contract binding to access the raw methods on } // {{.Type}}CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. type {{.Type}}CallerRaw struct { Contract *{{.Type}}Caller // Generic read-only contract binding to access the raw methods on } // {{.Type}}TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. type {{.Type}}TransactorRaw struct { Contract *{{.Type}}Transactor // Generic write-only contract binding to access the raw methods on } // New{{.Type}} creates a new instance of {{.Type}}, bound to a specific deployed contract. func New{{.Type}}(address common.Address, backend bind.ContractBackend) (*{{.Type}}, error) { contract, err := bind{{.Type}}(address, backend, backend, backend) if err != nil { return nil, err } return &{{.Type}}{ {{.Type}}Caller: {{.Type}}Caller{contract: contract}, {{.Type}}Transactor: {{.Type}}Transactor{contract: contract}, {{.Type}}Filterer: {{.Type}}Filterer{contract: contract} }, nil } // New{{.Type}}Caller creates a new read-only instance of {{.Type}}, bound to a specific deployed contract. func New{{.Type}}Caller(address common.Address, caller bind.ContractCaller) (*{{.Type}}Caller, error) { contract, err := bind{{.Type}}(address, caller, nil, nil) if err != nil { return nil, err } return &{{.Type}}Caller{contract: contract}, nil } // New{{.Type}}Transactor creates a new write-only instance of {{.Type}}, bound to a specific deployed contract. func New{{.Type}}Transactor(address common.Address, transactor bind.ContractTransactor) (*{{.Type}}Transactor, error) { contract, err := bind{{.Type}}(address, nil, transactor, nil) if err != nil { return nil, err } return &{{.Type}}Transactor{contract: contract}, nil } // New{{.Type}}Filterer creates a new log filterer instance of {{.Type}}, bound to a specific deployed contract. func New{{.Type}}Filterer(address common.Address, filterer bind.ContractFilterer) (*{{.Type}}Filterer, error) { contract, err := bind{{.Type}}(address, nil, nil, filterer) if err != nil { return nil, err } return &{{.Type}}Filterer{contract: contract}, nil } // bind{{.Type}} binds a generic wrapper to an already deployed contract. func bind{{.Type}}(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { parsed, err := abi.JSON(strings.NewReader({{.Type}}ABI)) if err != nil { return nil, err } return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil } // Call invokes the (constant) contract method with params as input values and // sets the output to result. The result type might be a single field for simple // returns, a slice of interfaces for anonymous returns and a struct for named // returns. func (_{{$contract.Type}} *{{$contract.Type}}Raw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { return _{{$contract.Type}}.Contract.{{$contract.Type}}Caller.contract.Call(opts, result, method, params...) } // Transfer initiates a plain transaction to move funds to the contract, calling // its default method if one is available. func (_{{$contract.Type}} *{{$contract.Type}}Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { return _{{$contract.Type}}.Contract.{{$contract.Type}}Transactor.contract.Transfer(opts) } // Transact invokes the (paid) contract method with params as input values. func (_{{$contract.Type}} *{{$contract.Type}}Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { return _{{$contract.Type}}.Contract.{{$contract.Type}}Transactor.contract.Transact(opts, method, params...) } // Call invokes the (constant) contract method with params as input values and // sets the output to result. The result type might be a single field for simple // returns, a slice of interfaces for anonymous returns and a struct for named // returns. func (_{{$contract.Type}} *{{$contract.Type}}CallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { return _{{$contract.Type}}.Contract.contract.Call(opts, result, method, params...) } // Transfer initiates a plain transaction to move funds to the contract, calling // its default method if one is available. func (_{{$contract.Type}} *{{$contract.Type}}TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { return _{{$contract.Type}}.Contract.contract.Transfer(opts) } // Transact invokes the (paid) contract method with params as input values. func (_{{$contract.Type}} *{{$contract.Type}}TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { return _{{$contract.Type}}.Contract.contract.Transact(opts, method, params...) } {{range .Calls}} // {{.Normalized.Name}} is a free data retrieval call binding the contract method 0x{{printf "%x" .Original.ID}}. // // Solidity: {{.Original.String}} func (_{{$contract.Type}} *{{$contract.Type}}Caller) {{.Normalized.Name}}(opts *bind.CallOpts {{range .Normalized.Inputs}}, {{.Name}} {{bindtype .Type $structs $TRUE}} {{end}}) ({{if .Structured}}struct{ {{range .Normalized.Outputs}}{{.Name}} {{bindtype .Type $structs $FALSE}};{{end}} },{{else}}{{range .Normalized.Outputs}}{{bindtype .Type $structs $FALSE}},{{end}}{{end}} error) { {{if .Structured}}ret := new(struct{ {{range .Normalized.Outputs}}{{.Name}} {{bindtype .Type $structs $FALSE}} {{end}} }){{else}}var ( {{range $i, $_ := .Normalized.Outputs}}ret{{$i}} = new({{bindtype .Type $structs $FALSE}}) {{end}} ){{end}} out := {{if .Structured}}ret{{else}}{{if eq (len .Normalized.Outputs) 1}}ret0{{else}}&[]interface{}{ {{range $i, $_ := .Normalized.Outputs}}ret{{$i}}, {{end}} }{{end}}{{end}} err := _{{$contract.Type}}.contract.Call(opts, out, "{{.Original.Name}}" {{range .Normalized.Inputs}}, {{.Name}}{{end}}) return {{if .Structured}}*ret,{{else}}{{range $i, $_ := .Normalized.Outputs}}*ret{{$i}},{{end}}{{end}} err } // {{.Normalized.Name}} is a free data retrieval call binding the contract method 0x{{printf "%x" .Original.ID}}. // // Solidity: {{.Original.String}} func (_{{$contract.Type}} *{{$contract.Type}}Session) {{.Normalized.Name}}({{range $i, $_ := .Normalized.Inputs}}{{if ne $i 0}},{{end}} {{.Name}} {{bindtype .Type $structs $TRUE}} {{end}}) ({{if .Structured}}struct{ {{range .Normalized.Outputs}}{{.Name}} {{bindtype .Type $structs $FALSE}};{{end}} }, {{else}} {{range .Normalized.Outputs}}{{bindtype .Type $structs $FALSE}},{{end}} {{end}} error) { return _{{$contract.Type}}.Contract.{{.Normalized.Name}}(&_{{$contract.Type}}.CallOpts {{range .Normalized.Inputs}}, {{.Name}}{{end}}) } // {{.Normalized.Name}} is a free data retrieval call binding the contract method 0x{{printf "%x" .Original.ID}}. // // Solidity: {{.Original.String}} func (_{{$contract.Type}} *{{$contract.Type}}CallerSession) {{.Normalized.Name}}({{range $i, $_ := .Normalized.Inputs}}{{if ne $i 0}},{{end}} {{.Name}} {{bindtype .Type $structs $TRUE}} {{end}}) ({{if .Structured}}struct{ {{range .Normalized.Outputs}}{{.Name}} {{bindtype .Type $structs $FALSE}};{{end}} }, {{else}} {{range .Normalized.Outputs}}{{bindtype .Type $structs $FALSE}},{{end}} {{end}} error) { return _{{$contract.Type}}.Contract.{{.Normalized.Name}}(&_{{$contract.Type}}.CallOpts {{range .Normalized.Inputs}}, {{.Name}}{{end}}) } {{end}} {{range .Transacts}} // {{.Normalized.Name}} is a paid mutator transaction binding the contract method 0x{{printf "%x" .Original.ID}}. // // Solidity: {{.Original.String}} func (_{{$contract.Type}} *{{$contract.Type}}Transactor) {{.Normalized.Name}}(opts *bind.TransactOpts {{range .Normalized.Inputs}}, {{.Name}} {{bindtype .Type $structs $TRUE}} {{end}}) (*types.Transaction, error) { return _{{$contract.Type}}.contract.Transact(opts, "{{.Original.Name}}" {{range .Normalized.Inputs}}, {{.Name}}{{end}}) } // {{.Normalized.Name}} is a paid mutator transaction binding the contract method 0x{{printf "%x" .Original.ID}}. // // Solidity: {{.Original.String}} func (_{{$contract.Type}} *{{$contract.Type}}Session) {{.Normalized.Name}}({{range $i, $_ := .Normalized.Inputs}}{{if ne $i 0}},{{end}} {{.Name}} {{bindtype .Type $structs $TRUE}} {{end}}) (*types.Transaction, error) { return _{{$contract.Type}}.Contract.{{.Normalized.Name}}(&_{{$contract.Type}}.TransactOpts {{range $i, $_ := .Normalized.Inputs}}, {{.Name}}{{end}}) } // {{.Normalized.Name}} is a paid mutator transaction binding the contract method 0x{{printf "%x" .Original.ID}}. // // Solidity: {{.Original.String}} func (_{{$contract.Type}} *{{$contract.Type}}TransactorSession) {{.Normalized.Name}}({{range $i, $_ := .Normalized.Inputs}}{{if ne $i 0}},{{end}} {{.Name}} {{bindtype .Type $structs $TRUE}} {{end}}) (*types.Transaction, error) { return _{{$contract.Type}}.Contract.{{.Normalized.Name}}(&_{{$contract.Type}}.TransactOpts {{range $i, $_ := .Normalized.Inputs}}, {{.Name}}{{end}}) } {{end}} {{if .Fallback}} // Fallback is a paid mutator transaction binding the contract fallback function. // // Solidity: {{.Fallback.Original.String}} func (_{{$contract.Type}} *{{$contract.Type}}Transactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) { return _{{$contract.Type}}.contract.RawTransact(opts, calldata) } // Fallback is a paid mutator transaction binding the contract fallback function. // // Solidity: {{.Fallback.Original.String}} func (_{{$contract.Type}} *{{$contract.Type}}Session) Fallback(calldata []byte) (*types.Transaction, error) { return _{{$contract.Type}}.Contract.Fallback(&_{{$contract.Type}}.TransactOpts, calldata) } // Fallback is a paid mutator transaction binding the contract fallback function. // // Solidity: {{.Fallback.Original.String}} func (_{{$contract.Type}} *{{$contract.Type}}TransactorSession) Fallback(calldata []byte) (*types.Transaction, error) { return _{{$contract.Type}}.Contract.Fallback(&_{{$contract.Type}}.TransactOpts, calldata) } {{end}} {{if .Receive}} // Receive is a paid mutator transaction binding the contract receive function. // // Solidity: {{.Receive.Original.String}} func (_{{$contract.Type}} *{{$contract.Type}}Transactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { return _{{$contract.Type}}.contract.RawTransact(opts, nil) // calldata is disallowed for receive function } // Receive is a paid mutator transaction binding the contract receive function. // // Solidity: {{.Receive.Original.String}} func (_{{$contract.Type}} *{{$contract.Type}}Session) Receive() (*types.Transaction, error) { return _{{$contract.Type}}.Contract.Receive(&_{{$contract.Type}}.TransactOpts) } // Receive is a paid mutator transaction binding the contract receive function. // // Solidity: {{.Receive.Original.String}} func (_{{$contract.Type}} *{{$contract.Type}}TransactorSession) Receive() (*types.Transaction, error) { return _{{$contract.Type}}.Contract.Receive(&_{{$contract.Type}}.TransactOpts) } {{end}} {{range .Events}} // {{$contract.Type}}{{.Normalized.Name}}Iterator is returned from Filter{{.Normalized.Name}} and is used to iterate over the raw logs and unpacked data for {{.Normalized.Name}} events raised by the {{$contract.Type}} contract. type {{$contract.Type}}{{.Normalized.Name}}Iterator struct { Event *{{$contract.Type}}{{.Normalized.Name}} // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data logs chan types.Log // Log channel receiving the found contract events sub sero.Subscription // Subscription for errors, completion and termination done bool // Whether the subscription completed delivering logs fail error // Occurred error to stop iteration } // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. func (it *{{$contract.Type}}{{.Normalized.Name}}Iterator) Next() bool { // If the iterator failed, stop iterating if (it.fail != nil) { return false } // If the iterator completed, deliver directly whatever's available if (it.done) { select { case log := <-it.logs: it.Event = new({{$contract.Type}}{{.Normalized.Name}}) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false } it.Event.Raw = log return true default: return false } } // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: it.Event = new({{$contract.Type}}{{.Normalized.Name}}) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false } it.Event.Raw = log return true case err := <-it.sub.Err(): it.done = true it.fail = err return it.Next() } } // Error returns any retrieval or parsing error occurred during filtering. func (it *{{$contract.Type}}{{.Normalized.Name}}Iterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. func (it *{{$contract.Type}}{{.Normalized.Name}}Iterator) Close() error { it.sub.Unsubscribe() return nil } // {{$contract.Type}}{{.Normalized.Name}} represents a {{.Normalized.Name}} event raised by the {{$contract.Type}} contract. type {{$contract.Type}}{{.Normalized.Name}} struct { {{range .Normalized.Inputs}} {{capitalise .Name}} {{if .Indexed}}{{bindtopictype .Type $structs $FALSE}}{{else}}{{bindtype .Type $structs $FALSE}}{{end}}; {{end}} Raw types.Log // Blockchain specific contextual infos } // Filter{{.Normalized.Name}} is a free log retrieval operation binding the contract event 0x{{printf "%x" .Original.ID}}. // // Solidity: {{.Original.String}} func (_{{$contract.Type}} *{{$contract.Type}}Filterer) Filter{{.Normalized.Name}}(opts *bind.FilterOpts{{range .Normalized.Inputs}}{{if .Indexed}}, {{.Name}} []{{bindtype .Type $structs $TRUE}}{{end}}{{end}}) (*{{$contract.Type}}{{.Normalized.Name}}Iterator, error) { {{range .Normalized.Inputs}} {{if .Indexed}}var {{.Name}}Rule []interface{} for _, {{.Name}}Item := range {{.Name}} { {{.Name}}Rule = append({{.Name}}Rule, {{.Name}}Item) }{{end}}{{end}} logs, sub, err := _{{$contract.Type}}.contract.FilterLogs(opts, "{{.Original.Name}}"{{range .Normalized.Inputs}}{{if .Indexed}}, {{.Name}}Rule{{end}}{{end}}) if err != nil { return nil, err } return &{{$contract.Type}}{{.Normalized.Name}}Iterator{contract: _{{$contract.Type}}.contract, event: "{{.Original.Name}}", logs: logs, sub: sub}, nil } // Watch{{.Normalized.Name}} is a free log subscription operation binding the contract event 0x{{printf "%x" .Original.ID}}. // // Solidity: {{.Original.String}} func (_{{$contract.Type}} *{{$contract.Type}}Filterer) Watch{{.Normalized.Name}}(opts *bind.WatchOpts, sink chan<- *{{$contract.Type}}{{.Normalized.Name}}{{range .Normalized.Inputs}}{{if .Indexed}}, {{.Name}} []{{bindtype .Type $structs $TRUE}}{{end}}{{end}}) (event.Subscription, error) { {{range .Normalized.Inputs}} {{if .Indexed}}var {{.Name}}Rule []interface{} for _, {{.Name}}Item := range {{.Name}} { {{.Name}}Rule = append({{.Name}}Rule, {{.Name}}Item) }{{end}}{{end}} logs, sub, err := _{{$contract.Type}}.contract.WatchLogs(opts, "{{.Original.Name}}"{{range .Normalized.Inputs}}{{if .Indexed}}, {{.Name}}Rule{{end}}{{end}}) if err != nil { return nil, err } return event.NewSubscription(func(quit <-chan struct{}) error { defer sub.Unsubscribe() for { select { case log := <-logs: // New log arrived, parse the event and forward to the user event := new({{$contract.Type}}{{.Normalized.Name}}) if err := _{{$contract.Type}}.contract.UnpackLog(event, "{{.Original.Name}}", log); err != nil { return err } event.Raw = log select { case sink <- event: case err := <-sub.Err(): return err case <-quit: return nil } case err := <-sub.Err(): return err case <-quit: return nil } } }), nil } // Parse{{.Normalized.Name}} is a log parse operation binding the contract event 0x{{printf "%x" .Original.ID}}. // // Solidity: {{.Original.String}} func (_{{$contract.Type}} *{{$contract.Type}}Filterer) Parse{{.Normalized.Name}}(log types.Log) (*{{$contract.Type}}{{.Normalized.Name}}, error) { event := new({{$contract.Type}}{{.Normalized.Name}}) if err := _{{$contract.Type}}.contract.UnpackLog(event, "{{.Original.Name}}", log); err != nil { return nil, err } return event, nil } {{end}} {{end}} ` ================================================ FILE: accounts/abi/bind/topics.go ================================================ // Copyright 2018 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package bind import ( "encoding/binary" "errors" "fmt" "math/big" "reflect" "github.com/sero-cash/go-sero/accounts/abi" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/crypto" ) // makeTopics converts a filter query argument list into a filter topic set. func makeTopics(query ...[]interface{}) ([][]common.Hash, error) { topics := make([][]common.Hash, len(query)) for i, filter := range query { for _, rule := range filter { var topic common.Hash // Try to generate the topic based on simple types switch rule := rule.(type) { case common.Hash: copy(topic[:], rule[:]) case common.Address: copy(topic[:], rule.Bytes()) case *big.Int: blob := rule.Bytes() copy(topic[common.HashLength-len(blob):], blob) case bool: if rule { topic[common.HashLength-1] = 1 } case int8: blob := big.NewInt(int64(rule)).Bytes() copy(topic[common.HashLength-len(blob):], blob) case int16: blob := big.NewInt(int64(rule)).Bytes() copy(topic[common.HashLength-len(blob):], blob) case int32: blob := big.NewInt(int64(rule)).Bytes() copy(topic[common.HashLength-len(blob):], blob) case int64: blob := big.NewInt(rule).Bytes() copy(topic[common.HashLength-len(blob):], blob) case uint8: blob := new(big.Int).SetUint64(uint64(rule)).Bytes() copy(topic[common.HashLength-len(blob):], blob) case uint16: blob := new(big.Int).SetUint64(uint64(rule)).Bytes() copy(topic[common.HashLength-len(blob):], blob) case uint32: blob := new(big.Int).SetUint64(uint64(rule)).Bytes() copy(topic[common.HashLength-len(blob):], blob) case uint64: blob := new(big.Int).SetUint64(rule).Bytes() copy(topic[common.HashLength-len(blob):], blob) case string: hash := crypto.Keccak256Hash([]byte(rule)) copy(topic[:], hash[:]) case []byte: hash := crypto.Keccak256Hash(rule) copy(topic[:], hash[:]) default: // Attempt to generate the topic from funky types val := reflect.ValueOf(rule) switch { case val.Kind() == reflect.Array && reflect.TypeOf(rule).Elem().Kind() == reflect.Uint8: reflect.Copy(reflect.ValueOf(topic[common.HashLength-val.Len():]), val) default: return nil, fmt.Errorf("unsupported indexed type: %T", rule) } } topics[i] = append(topics[i], topic) } } return topics, nil } // Big batch of reflect types for topic reconstruction. var ( reflectHash = reflect.TypeOf(common.Hash{}) reflectAddress = reflect.TypeOf(common.Address{}) reflectBigInt = reflect.TypeOf(new(big.Int)) ) // parseTopics converts the indexed topic fields into actual log field values. // // Note, dynamic types cannot be reconstructed since they get mapped to Keccak256 // hashes as the topic value! func parseTopics(out interface{}, fields abi.Arguments, topics []common.Hash) error { // Sanity check that the fields and topics match up if len(fields) != len(topics) { return errors.New("topic/field count mismatch") } // Iterate over all the fields and reconstruct them from topics for _, arg := range fields { if !arg.Indexed { return errors.New("non-indexed field in topic reconstruction") } field := reflect.ValueOf(out).Elem().FieldByName(capitalise(arg.Name)) // Try to parse the topic back into the fields based on primitive types switch field.Kind() { case reflect.Bool: if topics[0][common.HashLength-1] == 1 { field.Set(reflect.ValueOf(true)) } case reflect.Int8: num := new(big.Int).SetBytes(topics[0][:]) field.Set(reflect.ValueOf(int8(num.Int64()))) case reflect.Int16: num := new(big.Int).SetBytes(topics[0][:]) field.Set(reflect.ValueOf(int16(num.Int64()))) case reflect.Int32: num := new(big.Int).SetBytes(topics[0][:]) field.Set(reflect.ValueOf(int32(num.Int64()))) case reflect.Int64: num := new(big.Int).SetBytes(topics[0][:]) field.Set(reflect.ValueOf(num.Int64())) case reflect.Uint8: num := new(big.Int).SetBytes(topics[0][:]) field.Set(reflect.ValueOf(uint8(num.Uint64()))) case reflect.Uint16: num := new(big.Int).SetBytes(topics[0][:]) field.Set(reflect.ValueOf(uint16(num.Uint64()))) case reflect.Uint32: num := new(big.Int).SetBytes(topics[0][:]) field.Set(reflect.ValueOf(uint32(num.Uint64()))) case reflect.Uint64: num := new(big.Int).SetBytes(topics[0][:]) field.Set(reflect.ValueOf(num.Uint64())) default: // Ran out of plain primitive types, try custom types switch field.Type() { case reflectHash: // Also covers all dynamic types field.Set(reflect.ValueOf(topics[0])) case reflectAddress: var addr common.Address addr.SetBytes(topics[0][0:]) field.Set(reflect.ValueOf(addr)) case reflectBigInt: num := new(big.Int).SetBytes(topics[0][:]) field.Set(reflect.ValueOf(num)) default: // Ran out of custom types, try the crazies switch { case arg.Type.T == abi.FixedBytesTy: reflect.Copy(field, reflect.ValueOf(topics[0][common.HashLength-arg.Type.Size:])) default: return fmt.Errorf("unsupported indexed type: %v", arg.Type) } } } topics = topics[1:] } return nil } // parseTopicsIntoMap converts the indexed topic field-value pairs into map key-value pairs func parseTopicsIntoMap(out map[string]interface{}, fields abi.Arguments, topics []common.Hash) error { // Sanity check that the fields and topics match up if len(fields) != len(topics) { return errors.New("topic/field count mismatch") } // Iterate over all the fields and reconstruct them from topics for _, arg := range fields { if !arg.Indexed { return errors.New("non-indexed field in topic reconstruction") } switch arg.Type.T { case abi.BoolTy: out[arg.Name] = topics[0][common.HashLength-1] == 1 case abi.IntTy, abi.UintTy: num := new(big.Int).SetBytes(topics[0][:]) out[arg.Name] = num case abi.AddressTy: var addr common.ContractAddress copy(addr[:], topics[0][12:]) out[arg.Name] = addr case abi.HashTy: out[arg.Name] = topics[0] case abi.FixedBytesTy: out[arg.Name] = topics[0][:] case abi.StringTy, abi.BytesTy, abi.SliceTy, abi.ArrayTy: // Array types (including strings and bytes) have their keccak256 hashes stored in the topic- not a hash // whose bytes can be decoded to the actual value- so the best we can do is retrieve that hash out[arg.Name] = topics[0] case abi.FunctionTy: if garbage := binary.BigEndian.Uint64(topics[0][0:8]); garbage != 0 { return fmt.Errorf("bind: got improperly encoded function type, got %v", topics[0].Bytes()) } var tmp [24]byte copy(tmp[:], topics[0][8:32]) out[arg.Name] = tmp default: // Not handling tuples return fmt.Errorf("unsupported indexed type: %v", arg.Type) } topics = topics[1:] } return nil } ================================================ FILE: accounts/abi/bind/util.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package bind import ( "context" "fmt" "time" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/log" ) // WaitMined waits for tx to be mined on the blockchain. // It stops waiting when the context is canceled. func WaitMined(ctx context.Context, b DeployBackend, tx *types.Transaction) (*types.Receipt, error) { queryTicker := time.NewTicker(time.Second) defer queryTicker.Stop() logger := log.New("hash", tx.Hash()) for { receipt, err := b.TransactionReceipt(ctx, tx.Hash()) if receipt != nil { return receipt, nil } if err != nil { logger.Trace("Receipt retrieval failed", "err", err) } else { logger.Trace("Transaction not yet mined") } // Wait for the next round. select { case <-ctx.Done(): return nil, ctx.Err() case <-queryTicker.C: } } } // WaitDeployed waits for a contract deployment transaction and returns the on-chain // contract address when it is mined. It stops waiting when ctx is canceled. func WaitDeployed(ctx context.Context, b DeployBackend, tx *types.Transaction) (common.Address, error) { if tx.To() != nil { return common.Address{}, fmt.Errorf("tx is not contract creation") } receipt, err := WaitMined(ctx, b, tx) if err != nil { return common.Address{}, err } if receipt.ContractAddress == (common.Address{}) { return common.Address{}, fmt.Errorf("zero address") } // Check that code has indeed been deployed at the address. // This matters on pre-Homestead chains: OOG in the constructor // could leave an empty account behind. code, err := b.CodeAt(ctx, receipt.ContractAddress, nil) if err == nil && len(code) == 0 { err = ErrNoCodeAfterDeploy } return receipt.ContractAddress, err } ================================================ FILE: accounts/abi/doc.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // Package abi implements the Ethereum ABI (Application Binary // Interface). // // The Ethereum ABI is strongly typed, known at compile time // and static. This ABI will handle basic type casting; unsigned // to signed and visa versa. It does not handle slice casting such // as unsigned slice to signed slice. Bit size type casting is also // handled. ints with a bit size of 32 will be properly cast to int256, // etc. package abi ================================================ FILE: accounts/abi/error.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package abi import ( "errors" "fmt" "reflect" ) var ( errBadBool = errors.New("abi: improperly encoded boolean value") ) // formatSliceString formats the reflection kind with the given slice size // and returns a formatted string representation. func formatSliceString(kind reflect.Kind, sliceSize int) string { if sliceSize == -1 { return fmt.Sprintf("[]%v", kind) } return fmt.Sprintf("[%d]%v", sliceSize, kind) } // sliceTypeCheck checks that the given slice can by assigned to the reflection // type in t. func sliceTypeCheck(t Type, val reflect.Value) error { if val.Kind() != reflect.Slice && val.Kind() != reflect.Array { return typeErr(formatSliceString(t.getType().Kind(), t.Size), val.Type()) } if t.T == ArrayTy && val.Len() != t.Size { return typeErr(formatSliceString(t.Elem.getType().Kind(), t.Size), formatSliceString(val.Type().Elem().Kind(), val.Len())) } if t.Elem.T == SliceTy || t.Elem.T == ArrayTy { if val.Len() > 0 { return sliceTypeCheck(*t.Elem, val.Index(0)) } } if elemKind := val.Type().Elem().Kind(); elemKind != t.Elem.getType().Kind() { return typeErr(formatSliceString(t.Elem.getType().Kind(), t.Size), val.Type()) } return nil } // typeCheck checks that the given reflection value can be assigned to the reflection // type in t. func typeCheck(t Type, value reflect.Value) error { if t.T == SliceTy || t.T == ArrayTy { return sliceTypeCheck(t, value) } // Check base type validity. Element types will be checked later on. if t.getType().Kind() != value.Kind() { return typeErr(t.getType().Kind(), value.Kind()) } else if t.T == FixedBytesTy && t.Size != value.Len() { return typeErr(t.getType(), value.Type()) } else { return nil } } // typeErr returns a formatted type casting error. func typeErr(expected, got interface{}) error { return fmt.Errorf("abi: cannot use %v as type %v as argument", got, expected) } ================================================ FILE: accounts/abi/event.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package abi import ( "fmt" "strings" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/crypto" ) type Event struct { // Name is the event name used for internal representation. It's derived from // the raw name and a suffix will be added in the case of a event overload. // // e.g. // There are two events have same name: // * foo(int,int) // * foo(uint,uint) // The event name of the first one wll be resolved as foo while the second one // will be resolved as foo0. Name string // RawName is the raw event name parsed from ABI. RawName string Anonymous bool Inputs Arguments str string // Sig contains the string signature according to the ABI spec. // e.g. event foo(uint32 a, int b) = "foo(uint32,int256)" // Please note that "int" is substitute for its canonical representation "int256" Sig string // ID returns the canonical representation of the event's signature used by the // abi definition to identify event names and types. ID common.Hash } // NewEvent creates a new Event. // It sanitizes the input arguments to remove unnamed arguments. // It also precomputes the id, signature and string representation // of the event. func NewEvent(name, rawName string, anonymous bool, inputs Arguments) Event { // sanitize inputs to remove inputs without names // and precompute string and sig representation. names := make([]string, len(inputs)) types := make([]string, len(inputs)) for i, input := range inputs { if input.Name == "" { inputs[i] = Argument{ Name: fmt.Sprintf("arg%d", i), Indexed: input.Indexed, Type: input.Type, } } else { inputs[i] = input } // string representation names[i] = fmt.Sprintf("%v %v", input.Type, inputs[i].Name) if input.Indexed { names[i] = fmt.Sprintf("%v indexed %v", input.Type, inputs[i].Name) } // sig representation types[i] = input.Type.String() } str := fmt.Sprintf("event %v(%v)", rawName, strings.Join(names, ", ")) sig := fmt.Sprintf("%v(%v)", rawName, strings.Join(types, ",")) id := common.BytesToHash(crypto.Keccak256([]byte(sig))) return Event{ Name: name, RawName: rawName, Anonymous: anonymous, Inputs: inputs, str: str, Sig: sig, ID: id, } } func (e Event) String() string { return e.str } ================================================ FILE: accounts/abi/method.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package abi import ( "fmt" "strings" "github.com/sero-cash/go-sero/crypto" ) // FunctionType represents different types of functions a contract might have. type FunctionType int const ( // Constructor represents the constructor of the contract. // The constructor function is called while deploying a contract. Constructor FunctionType = iota // Fallback represents the fallback function. // This function is executed if no other function matches the given function // signature and no receive function is specified. Fallback // Receive represents the receive function. // This function is executed on plain Ether transfers. Receive // Function represents a normal function. Function ) // Method represents a callable given a `Name` and whether the method is a constant. // If the method is `Const` no transaction needs to be created for this // particular Method call. It can easily be simulated using a local VM. // For example a `Balance()` method only needs to retrieve something // from the storage and therefore requires no Tx to be send to the // network. A method such as `Transact` does require a Tx and thus will // be flagged `false`. // Input specifies the required input parameters for this gives method. type Method struct { // Name is the method name used for internal representation. It's derived from // the raw name and a suffix will be added in the case of a function overload. // // e.g. // There are two functions have same name: // * foo(int,int) // * foo(uint,uint) // The method name of the first one will be resolved as foo while the second one // will be resolved as foo0. Name string RawName string // RawName is the raw method name parsed from ABI // Type indicates whether the method is a // special fallback introduced in solidity v0.6.0 Type FunctionType // StateMutability indicates the mutability state of method, // the default value is nonpayable. It can be empty if the abi // is generated by legacy compiler. StateMutability string // Legacy indicators generated by compiler before v0.6.0 Constant bool Payable bool Inputs Arguments Outputs Arguments str string // Sig returns the methods string signature according to the ABI spec. // e.g. function foo(uint32 a, int b) = "foo(uint32,int256)" // Please note that "int" is substitute for its canonical representation "int256" Sig string // ID returns the canonical representation of the method's signature used by the // abi definition to identify method names and types. ID []byte } // NewMethod creates a new Method. // A method should always be created using NewMethod. // It also precomputes the sig representation and the string representation // of the method. func NewMethod(name string, rawName string, funType FunctionType, mutability string, isConst, isPayable bool, inputs Arguments, outputs Arguments) Method { var ( types = make([]string, len(inputs)) inputNames = make([]string, len(inputs)) outputNames = make([]string, len(outputs)) ) for i, input := range inputs { inputNames[i] = fmt.Sprintf("%v %v", input.Type, input.Name) types[i] = input.Type.String() } for i, output := range outputs { outputNames[i] = output.Type.String() if len(output.Name) > 0 { outputNames[i] += fmt.Sprintf(" %v", output.Name) } } // calculate the signature and method id. Note only function // has meaningful signature and id. var ( sig string id []byte ) if funType == Function { sig = fmt.Sprintf("%v(%v)", rawName, strings.Join(types, ",")) id = crypto.Keccak256([]byte(sig))[:4] } // Extract meaningful state mutability of solidity method. // If it's default value, never print it. state := mutability if state == "nonpayable" { state = "" } if state != "" { state = state + " " } identity := fmt.Sprintf("function %v", rawName) if funType == Fallback { identity = "fallback" } else if funType == Receive { identity = "receive" } else if funType == Constructor { identity = "constructor" } str := fmt.Sprintf("%v(%v) %sreturns(%v)", identity, strings.Join(inputNames, ", "), state, strings.Join(outputNames, ", ")) return Method{ Name: name, RawName: rawName, Type: funType, StateMutability: mutability, Constant: isConst, Payable: isPayable, Inputs: inputs, Outputs: outputs, str: str, Sig: sig, ID: id, } } func (method Method) String() string { return method.str } // IsConstant returns the indicator whether the method is read-only. func (method Method) IsConstant() bool { return method.StateMutability == "view" || method.StateMutability == "pure" || method.Constant } // IsPayable returns the indicator whether the method can process // plain ether transfers. func (method Method) IsPayable() bool { return method.StateMutability == "payable" || method.Payable } ================================================ FILE: accounts/abi/numbers.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package abi import ( "math/big" "github.com/sero-cash/go-sero/common/math" ) var ( //bigT = reflect.TypeOf(&big.Int{}) //derefbigT = reflect.TypeOf(big.Int{}) //uint8T = reflect.TypeOf(uint8(0)) //uint16T = reflect.TypeOf(uint16(0)) //uint32T = reflect.TypeOf(uint32(0)) //uint64T = reflect.TypeOf(uint64(0)) //int8T = reflect.TypeOf(int8(0)) //int16T = reflect.TypeOf(int16(0)) //int32T = reflect.TypeOf(int32(0)) //int64T = reflect.TypeOf(int64(0)) //addressT = reflect.TypeOf(common.ContractAddress{}) ) // U256 converts a big Int into a 256bit EVM number. func U256(n *big.Int) []byte { return math.PaddedBigBytes(math.U256(n), 32) } ================================================ FILE: accounts/abi/pack.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package abi import ( "math/big" "reflect" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/common/math" ) // packBytesSlice packs the given bytes as [L, V] as the canonical representation // bytes slice func packBytesSlice(bytes []byte, l int) []byte { len := packNum(reflect.ValueOf(l)) return append(len, common.RightPadBytes(bytes, (l+31)/32*32)...) } func convertToPkr(addr []byte) []byte { var pkr c_type.PKr copy(pkr[:], addr) shortAddr := c_superzk.HashPKr(pkr.NewRef()) return common.LeftPadBytes(shortAddr[:], 32) } // packElement packs the given reflect value according to the abi specification in // t. func packElement(t Type, reflectValue reflect.Value) []byte { switch t.T { case IntTy, UintTy: return packNum(reflectValue) case StringTy: return packBytesSlice([]byte(reflectValue.String()), reflectValue.Len()) case AddressTy: if reflectValue.Kind() == reflect.Array { reflectValue = mustArrayToByteSlice(reflectValue) } return convertToPkr(reflectValue.Bytes()) case BoolTy: if reflectValue.Bool() { return math.PaddedBigBytes(common.Big1, 32) } return math.PaddedBigBytes(common.Big0, 32) case BytesTy: if reflectValue.Kind() == reflect.Array { reflectValue = mustArrayToByteSlice(reflectValue) } return packBytesSlice(reflectValue.Bytes(), reflectValue.Len()) case FixedBytesTy, FunctionTy: if reflectValue.Kind() == reflect.Array { reflectValue = mustArrayToByteSlice(reflectValue) } return common.RightPadBytes(reflectValue.Bytes(), 32) default: panic("abi: fatal error") } } // packNum packs the given number (using the reflect value) and will cast it to appropriate number representation func packNum(value reflect.Value) []byte { switch kind := value.Kind(); kind { case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: return U256(new(big.Int).SetUint64(value.Uint())) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: return U256(big.NewInt(value.Int())) case reflect.Ptr: return U256(value.Interface().(*big.Int)) default: panic("abi: fatal error") } } ================================================ FILE: accounts/abi/reflect.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package abi import ( "errors" "fmt" "math/big" "reflect" "strings" ) // indirect recursively dereferences the value until it either gets the value // or finds a big.Int func indirect(v reflect.Value) reflect.Value { if v.Kind() == reflect.Ptr && v.Elem().Type() != reflect.TypeOf(big.Int{}) { return indirect(v.Elem()) } return v } // reflectIntType returns the reflect using the given size and // unsignedness. func reflectIntType(unsigned bool, size int) reflect.Type { if unsigned { switch size { case 8: return reflect.TypeOf(uint8(0)) case 16: return reflect.TypeOf(uint16(0)) case 32: return reflect.TypeOf(uint32(0)) case 64: return reflect.TypeOf(uint64(0)) } } switch size { case 8: return reflect.TypeOf(int8(0)) case 16: return reflect.TypeOf(int16(0)) case 32: return reflect.TypeOf(int32(0)) case 64: return reflect.TypeOf(int64(0)) } return reflect.TypeOf(&big.Int{}) } // mustArrayToBytesSlice creates a new byte slice with the exact same size as value // and copies the bytes in value to the new slice. func mustArrayToByteSlice(value reflect.Value) reflect.Value { slice := reflect.MakeSlice(reflect.TypeOf([]byte{}), value.Len(), value.Len()) reflect.Copy(slice, value) return slice } // set attempts to assign src to dst by either setting, copying or otherwise. // // set is a bit more lenient when it comes to assignment and doesn't force an as // strict ruleset as bare `reflect` does. func set(dst, src reflect.Value) error { dstType, srcType := dst.Type(), src.Type() switch { case dstType.Kind() == reflect.Interface && dst.Elem().IsValid(): return set(dst.Elem(), src) case dstType.Kind() == reflect.Ptr && dstType.Elem() != reflect.TypeOf(big.Int{}): return set(dst.Elem(), src) case srcType.AssignableTo(dstType) && dst.CanSet(): dst.Set(src) case dstType.Kind() == reflect.Slice && srcType.Kind() == reflect.Slice && dst.CanSet(): return setSlice(dst, src) case dstType.Kind() == reflect.Array: return setArray(dst, src) case dstType.Kind() == reflect.Struct: return setStruct(dst, src) default: return fmt.Errorf("abi: cannot unmarshal %v in to %v", src.Type(), dst.Type()) } return nil } // setSlice attempts to assign src to dst when slices are not assignable by default // e.g. src: [][]byte -> dst: [][15]byte // setSlice ignores if we cannot copy all of src' elements. func setSlice(dst, src reflect.Value) error { slice := reflect.MakeSlice(dst.Type(), src.Len(), src.Len()) for i := 0; i < src.Len(); i++ { if src.Index(i).Kind() == reflect.Struct { if err := set(slice.Index(i), src.Index(i)); err != nil { return err } } else { // e.g. [][32]uint8 to []common.Hash if err := set(slice.Index(i), src.Index(i)); err != nil { return err } } } if dst.CanSet() { dst.Set(slice) return nil } return errors.New("Cannot set slice, destination not settable") } func setArray(dst, src reflect.Value) error { array := reflect.New(dst.Type()).Elem() min := src.Len() if src.Len() > dst.Len() { min = dst.Len() } for i := 0; i < min; i++ { if err := set(array.Index(i), src.Index(i)); err != nil { return err } } if dst.CanSet() { dst.Set(array) return nil } return errors.New("Cannot set array, destination not settable") } func setStruct(dst, src reflect.Value) error { for i := 0; i < src.NumField(); i++ { srcField := src.Field(i) dstField := dst.Field(i) if !dstField.IsValid() || !srcField.IsValid() { return fmt.Errorf("Could not find src field: %v value: %v in destination", srcField.Type().Name(), srcField) } if err := set(dstField, srcField); err != nil { return err } } return nil } // mapArgNamesToStructFields maps a slice of argument names to struct fields. // first round: for each Exportable field that contains a `abi:""` tag // and this field name exists in the given argument name list, pair them together. // second round: for each argument name that has not been already linked, // find what variable is expected to be mapped into, if it exists and has not been // used, pair them. // Note this function assumes the given value is a struct value. func mapArgNamesToStructFields(argNames []string, value reflect.Value) (map[string]string, error) { typ := value.Type() abi2struct := make(map[string]string) struct2abi := make(map[string]string) // first round ~~~ for i := 0; i < typ.NumField(); i++ { structFieldName := typ.Field(i).Name // skip private struct fields. if structFieldName[:1] != strings.ToUpper(structFieldName[:1]) { continue } // skip fields that have no abi:"" tag. tagName, ok := typ.Field(i).Tag.Lookup("abi") if !ok { continue } // check if tag is empty. if tagName == "" { return nil, fmt.Errorf("struct: abi tag in '%s' is empty", structFieldName) } // check which argument field matches with the abi tag. found := false for _, arg := range argNames { if arg == tagName { if abi2struct[arg] != "" { return nil, fmt.Errorf("struct: abi tag in '%s' already mapped", structFieldName) } // pair them abi2struct[arg] = structFieldName struct2abi[structFieldName] = arg found = true } } // check if this tag has been mapped. if !found { return nil, fmt.Errorf("struct: abi tag '%s' defined but not found in abi", tagName) } } // second round ~~~ for _, argName := range argNames { structFieldName := ToCamelCase(argName) if structFieldName == "" { return nil, fmt.Errorf("abi: purely underscored output cannot unpack to struct") } // this abi has already been paired, skip it... unless there exists another, yet unassigned // struct field with the same field name. If so, raise an error: // abi: [ { "name": "value" } ] // struct { Value *big.Int , Value1 *big.Int `abi:"value"`} if abi2struct[argName] != "" { if abi2struct[argName] != structFieldName && struct2abi[structFieldName] == "" && value.FieldByName(structFieldName).IsValid() { return nil, fmt.Errorf("abi: multiple variables maps to the same abi field '%s'", argName) } continue } // return an error if this struct field has already been paired. if struct2abi[structFieldName] != "" { return nil, fmt.Errorf("abi: multiple outputs mapping to the same struct field '%s'", structFieldName) } if value.FieldByName(structFieldName).IsValid() { // pair them abi2struct[argName] = structFieldName struct2abi[structFieldName] = argName } else { // not paired, but annotate as used, to detect cases like // abi : [ { "name": "value" }, { "name": "_value" } ] // struct { Value *big.Int } struct2abi[structFieldName] = argName } } return abi2struct, nil } ================================================ FILE: accounts/abi/type.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package abi import ( "fmt" "reflect" "regexp" "strconv" "strings" "github.com/pkg/errors" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/common" ) // Type enumerator const ( IntTy byte = iota UintTy BoolTy StringTy SliceTy ArrayTy TupleTy AddressTy FixedBytesTy BytesTy HashTy FixedPointTy FunctionTy ) // Type is the reflection of the supported argument type type Type struct { Elem *Type Size int T byte // Our own type checking stringKind string // holds the unparsed string for deriving signatures // Tuple relative fields TupleRawName string // Raw struct name defined in source code, may be empty. TupleElems []*Type // Type information of all tuple fields TupleRawNames []string // Raw field name of all tuple fields TupleType reflect.Type // Underlying struct of the tuple } var ( // typeRegex parses the abi sub types typeRegex = regexp.MustCompile("([a-zA-Z]+)(([0-9]+)(x([0-9]+))?)?") ) // String implements Stringer // NewType creates a new reflection type of abi type given in t. func NewType(t string, internalType string, components []ArgumentMarshaling) (typ Type, err error) { // check that array brackets are equal if they exist if strings.Count(t, "[") != strings.Count(t, "]") { return Type{}, fmt.Errorf("invalid arg type in abi") } typ.stringKind = t // if there are brackets, get ready to go into slice/array mode and // recursively create the type if strings.Count(t, "[") != 0 { // Note internalType can be empty here. subInternal := internalType if i := strings.LastIndex(internalType, "["); i != -1 { subInternal = subInternal[:i] } // recursively embed the type i := strings.LastIndex(t, "[") embeddedType, err := NewType(t[:i], subInternal, components) if err != nil { return Type{}, err } // grab the last cell and create a type from there sliced := t[i:] // grab the slice size with regexp re := regexp.MustCompile("[0-9]+") intz := re.FindAllString(sliced, -1) if len(intz) == 0 { // is a slice typ.T = SliceTy typ.Elem = &embeddedType typ.stringKind = embeddedType.stringKind + sliced } else if len(intz) == 1 { // is an array typ.T = ArrayTy typ.Elem = &embeddedType typ.Size, err = strconv.Atoi(intz[0]) if err != nil { return Type{}, fmt.Errorf("abi: error parsing variable size: %v", err) } typ.stringKind = embeddedType.stringKind + sliced } else { return Type{}, fmt.Errorf("invalid formatting of array type") } return typ, err } // parse the type and size of the abi-type. matches := typeRegex.FindAllStringSubmatch(t, -1) if len(matches) == 0 { return Type{}, fmt.Errorf("invalid type '%v'", t) } parsedType := matches[0] // varSize is the size of the variable var varSize int if len(parsedType[3]) > 0 { var err error varSize, err = strconv.Atoi(parsedType[2]) if err != nil { return Type{}, fmt.Errorf("abi: error parsing variable size: %v", err) } } else { if parsedType[0] == "uint" || parsedType[0] == "int" { // this should fail because it means that there's something wrong with // the abi type (the compiler should always format it to the size...always) return Type{}, fmt.Errorf("unsupported arg type: %s", t) } } // varType is the parsed abi type switch varType := parsedType[1]; varType { case "int": typ.Size = varSize typ.T = IntTy case "uint": typ.Size = varSize typ.T = UintTy case "bool": typ.T = BoolTy case "address": typ.Size = 20 typ.T = AddressTy case "string": typ.T = StringTy case "bytes": if varSize == 0 { typ.T = BytesTy } else { typ.T = FixedBytesTy typ.Size = varSize } case "tuple": var ( fields []reflect.StructField elems []*Type names []string expression string // canonical parameter expression ) expression += "(" overloadedNames := make(map[string]string) for idx, c := range components { cType, err := NewType(c.Type, c.InternalType, c.Components) if err != nil { return Type{}, err } fieldName, err := overloadedArgName(c.Name, overloadedNames) if err != nil { return Type{}, err } overloadedNames[fieldName] = fieldName fields = append(fields, reflect.StructField{ Name: fieldName, // reflect.StructOf will panic for any exported field. Type: cType.getType(), Tag: reflect.StructTag("json:\"" + c.Name + "\""), }) elems = append(elems, &cType) names = append(names, c.Name) expression += cType.stringKind if idx != len(components)-1 { expression += "," } } expression += ")" typ.TupleType = reflect.StructOf(fields) typ.TupleElems = elems typ.TupleRawNames = names typ.T = TupleTy typ.stringKind = expression const structPrefix = "struct " // After solidity 0.5.10, a new field of abi "internalType" // is introduced. From that we can obtain the struct name // user defined in the source code. if internalType != "" && strings.HasPrefix(internalType, structPrefix) { // Foo.Bar type definition is not allowed in golang, // convert the format to FooBar typ.TupleRawName = strings.Replace(internalType[len(structPrefix):], ".", "", -1) } case "function": typ.T = FunctionTy typ.Size = 24 default: return Type{}, fmt.Errorf("unsupported arg type: %s", t) } return } func (t Type) getType() reflect.Type { switch t.T { case IntTy: return reflectIntType(false, t.Size) case UintTy: return reflectIntType(true, t.Size) case BoolTy: return reflect.TypeOf(false) case StringTy: return reflect.TypeOf("") case SliceTy: return reflect.SliceOf(t.Elem.getType()) case ArrayTy: return reflect.ArrayOf(t.Size, t.Elem.getType()) case TupleTy: return t.TupleType case AddressTy: return reflect.TypeOf(common.ContractAddress{}) case FixedBytesTy: return reflect.ArrayOf(t.Size, reflect.TypeOf(byte(0))) case BytesTy: return reflect.SliceOf(reflect.TypeOf(byte(0))) case HashTy: // hashtype currently not used return reflect.ArrayOf(32, reflect.TypeOf(byte(0))) case FixedPointTy: // fixedpoint type currently not used return reflect.ArrayOf(32, reflect.TypeOf(byte(0))) case FunctionTy: return reflect.ArrayOf(24, reflect.TypeOf(byte(0))) default: panic("Invalid type") } } func (t Type) String() (out string) { return t.stringKind } func overloadedArgName(rawName string, names map[string]string) (string, error) { fieldName := ToCamelCase(rawName) if fieldName == "" { return "", errors.New("abi: purely anonymous or underscored field is not supported") } // Handle overloaded fieldNames _, ok := names[fieldName] for idx := 0; ok; idx++ { fieldName = fmt.Sprintf("%s%d", ToCamelCase(rawName), idx) _, ok = names[fieldName] } return fieldName, nil } func (t Type) pack(v reflect.Value) ([]byte, error) { // dereference pointer first if it's a pointer v = indirect(v) if err := typeCheck(t, v); err != nil { return nil, err } switch t.T { case SliceTy, ArrayTy: var ret []byte if t.requiresLengthPrefix() { // append length ret = append(ret, packNum(reflect.ValueOf(v.Len()))...) } // calculate offset if any offset := 0 offsetReq := isDynamicType(*t.Elem) if offsetReq { offset = getTypeSize(*t.Elem) * v.Len() } var tail []byte for i := 0; i < v.Len(); i++ { val, err := t.Elem.pack(v.Index(i)) if err != nil { return nil, err } if !offsetReq { ret = append(ret, val...) continue } ret = append(ret, packNum(reflect.ValueOf(offset))...) offset += len(val) tail = append(tail, val...) } return append(ret, tail...), nil case TupleTy: // (T1,...,Tk) for k >= 0 and any types T1, …, Tk // enc(X) = head(X(1)) ... head(X(k)) tail(X(1)) ... tail(X(k)) // where X = (X(1), ..., X(k)) and head and tail are defined for Ti being a static // type as // head(X(i)) = enc(X(i)) and tail(X(i)) = "" (the empty string) // and as // head(X(i)) = enc(len(head(X(1)) ... head(X(k)) tail(X(1)) ... tail(X(i-1)))) // tail(X(i)) = enc(X(i)) // otherwise, i.e. if Ti is a dynamic type. fieldmap, err := mapArgNamesToStructFields(t.TupleRawNames, v) if err != nil { return nil, err } // Calculate prefix occupied size. offset := 0 for _, elem := range t.TupleElems { offset += getTypeSize(*elem) } var ret, tail []byte for i, elem := range t.TupleElems { field := v.FieldByName(fieldmap[t.TupleRawNames[i]]) if !field.IsValid() { return nil, fmt.Errorf("field %s for tuple not found in the given struct", t.TupleRawNames[i]) } val, err := elem.pack(field) if err != nil { return nil, err } if isDynamicType(*elem) { ret = append(ret, packNum(reflect.ValueOf(offset))...) tail = append(tail, val...) offset += len(val) } else { ret = append(ret, val...) } } return append(ret, tail...), nil default: return packElement(t, v), nil } } //func (t Type) pack(v reflect.Value) ([]byte, error) { // // dereference pointer first if it's a pointer // v = indirect(v) // // if err := typeCheck(t, v); err != nil { // return nil, err // } // // if t.T == SliceTy || t.T == ArrayTy { // var packed []byte // // for i := 0; i < v.Len(); i++ { // val, err := t.Elem.pack(v.Index(i)) // if err != nil { // return nil, err // } // packed = append(packed, val...) // } // if t.T == SliceTy { // return packBytesSlice(packed, v.Len()), nil // } else if t.T == ArrayTy { // return packed, nil // } // } // return packElement(t, v), nil //} func (t Type) getAllAddress(v reflect.Value) (pkrs []c_type.PKr, err error) { // dereference pointer first if it's a pointer v = indirect(v) if err := typeCheck(t, v); err != nil { return nil, err } if t.T == SliceTy || t.T == ArrayTy { for i := 0; i < v.Len(); i++ { val, err := t.Elem.getAllAddress(v.Index(i)) if err != nil { return nil, err } pkrs = append(pkrs, val...) } return } if t.T == TupleTy { fieldmap, e := mapArgNamesToStructFields(t.TupleRawNames, v) if e != nil { return nil, e } for i, elem := range t.TupleElems { field := v.FieldByName(fieldmap[t.TupleRawNames[i]]) val, err := elem.getAllAddress(field) if err != nil { return nil, err } pkrs = append(pkrs, val...) } return } if t.T == AddressTy { if v.Kind() == reflect.Array { v = mustArrayToByteSlice(v) } if len(v.Bytes()) != 96 { return nil, errors.New("address params only support pkr") } var pkr c_type.PKr copy(pkr[:], v.Bytes()) pkrs = append(pkrs, pkr) return } return } // requireLengthPrefix returns whether the type requires any sort of length // prefixing. func (t Type) requiresLengthPrefix() bool { return t.T == StringTy || t.T == BytesTy || t.T == SliceTy } // isDynamicType returns true if the type is dynamic. // The following types are called “dynamic”: // * bytes // * string // * T[] for any T // * T[k] for any dynamic T and any k >= 0 // * (T1,...,Tk) if Ti is dynamic for some 1 <= i <= k func isDynamicType(t Type) bool { if t.T == TupleTy { for _, elem := range t.TupleElems { if isDynamicType(*elem) { return true } } return false } return t.T == StringTy || t.T == BytesTy || t.T == SliceTy || (t.T == ArrayTy && isDynamicType(*t.Elem)) } // getTypeSize returns the size that this type needs to occupy. // We distinguish static and dynamic types. Static types are encoded in-place // and dynamic types are encoded at a separately allocated location after the // current block. // So for a static variable, the size returned represents the size that the // variable actually occupies. // For a dynamic variable, the returned size is fixed 32 bytes, which is used // to store the location reference for actual value storage. func getTypeSize(t Type) int { if t.T == ArrayTy && !isDynamicType(*t.Elem) { // Recursively calculate type size if it is a nested array if t.Elem.T == ArrayTy { return t.Size * getTypeSize(*t.Elem) } return t.Size * 32 } else if t.T == TupleTy && !isDynamicType(t) { total := 0 for _, elem := range t.TupleElems { total += getTypeSize(*elem) } return total } return 32 } ================================================ FILE: accounts/abi/unpack.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package abi import ( "encoding/binary" "fmt" "math/big" "reflect" "github.com/sero-cash/go-sero/common" ) var ( // MaxUint256 is the maximum value that can be represented by a uint256 MaxUint256 = new(big.Int).Sub(new(big.Int).Lsh(common.Big1, 256), common.Big1) // MaxInt256 is the maximum value that can be represented by a int256 MaxInt256 = new(big.Int).Sub(new(big.Int).Lsh(common.Big1, 255), common.Big1) ) // ReadInteger reads the integer based on its kind and returns the appropriate value func ReadInteger(typ Type, b []byte) interface{} { if typ.T == UintTy { switch typ.Size { case 8: return b[len(b)-1] case 16: return binary.BigEndian.Uint16(b[len(b)-2:]) case 32: return binary.BigEndian.Uint32(b[len(b)-4:]) case 64: return binary.BigEndian.Uint64(b[len(b)-8:]) default: // the only case left for unsigned integer is uint256. return new(big.Int).SetBytes(b) } } switch typ.Size { case 8: return int8(b[len(b)-1]) case 16: return int16(binary.BigEndian.Uint16(b[len(b)-2:])) case 32: return int32(binary.BigEndian.Uint32(b[len(b)-4:])) case 64: return int64(binary.BigEndian.Uint64(b[len(b)-8:])) default: // the only case left for integer is int256 // big.SetBytes can't tell if a number is negative or positive in itself. // On EVM, if the returned number > max int256, it is negative. // A number is > max int256 if the bit at position 255 is set. ret := new(big.Int).SetBytes(b) if ret.Bit(255) == 1 { ret.Add(MaxUint256, new(big.Int).Neg(ret)) ret.Add(ret, common.Big1) ret.Neg(ret) } return ret } } // reads a bool func readBool(word []byte) (bool, error) { for _, b := range word[:31] { if b != 0 { return false, errBadBool } } switch word[31] { case 0: return false, nil case 1: return true, nil default: return false, errBadBool } } // A function type is simply the address with the function selection signature at the end. // This enforces that standard by always presenting it as a 24-array (address + sig = 24 bytes) func readFunctionType(t Type, word []byte) (funcTy [24]byte, err error) { if t.T != FunctionTy { return [24]byte{}, fmt.Errorf("abi: invalid type in call to make function type byte array") } if garbage := binary.BigEndian.Uint64(word[24:32]); garbage != 0 { err = fmt.Errorf("abi: got improperly encoded function type, got %v", word) } else { copy(funcTy[:], word[0:24]) } return } // ReadFixedBytes uses reflection to create a fixed array to be read from func ReadFixedBytes(t Type, word []byte) (interface{}, error) { if t.T != FixedBytesTy { return nil, fmt.Errorf("abi: invalid type in call to make fixed byte array") } // convert array := reflect.New(t.getType()).Elem() reflect.Copy(array, reflect.ValueOf(word[0:t.Size])) return array.Interface(), nil } func getFullElemSize(elem *Type) int { //all other should be counted as 32 (slices have pointers to respective elements) size := 32 //arrays wrap it, each element being the same size for elem.T == ArrayTy { size *= elem.Size elem = elem.Elem } return size } // iteratively unpack elements func forEachUnpack(t Type, output []byte, start, size int) (interface{}, error) { if size < 0 { return nil, fmt.Errorf("cannot marshal input to array, size is negative (%d)", size) } if start+32*size > len(output) { return nil, fmt.Errorf("abi: cannot marshal in to go array: offset %d would go over slice boundary (len=%d)", len(output), start+32*size) } // this value will become our slice or our array, depending on the type var refSlice reflect.Value if t.T == SliceTy { // declare our slice refSlice = reflect.MakeSlice(t.getType(), size, size) } else if t.T == ArrayTy { // declare our array refSlice = reflect.New(t.getType()).Elem() } else { return nil, fmt.Errorf("abi: invalid type in array/slice unpacking stage") } // Arrays have packed elements, resulting in longer unpack steps. // Slices have just 32 bytes per element (pointing to the contents). elemSize := 32 if t.T == ArrayTy { elemSize = getFullElemSize(t.Elem) } for i, j := start, 0; j < size; i, j = i+elemSize, j+1 { inter, err := toGoType(i, *t.Elem, output) if err != nil { return nil, err } // append the item to our reflect slice refSlice.Index(j).Set(reflect.ValueOf(inter)) } // return the interface return refSlice.Interface(), nil } func forTupleUnpack(t Type, output []byte) (interface{}, error) { retval := reflect.New(t.getType()).Elem() virtualArgs := 0 for index, elem := range t.TupleElems { marshalledValue, err := toGoType((index+virtualArgs)*32, *elem, output) if elem.T == ArrayTy && !isDynamicType(*elem) { // If we have a static array, like [3]uint256, these are coded as // just like uint256,uint256,uint256. // This means that we need to add two 'virtual' arguments when // we count the index from now on. // // Array values nested multiple levels deep are also encoded inline: // [2][3]uint256: uint256,uint256,uint256,uint256,uint256,uint256 // // Calculate the full array size to get the correct offset for the next argument. // Decrement it by 1, as the normal index increment is still applied. virtualArgs += getTypeSize(*elem)/32 - 1 } else if elem.T == TupleTy && !isDynamicType(*elem) { // If we have a static tuple, like (uint256, bool, uint256), these are // coded as just like uint256,bool,uint256 virtualArgs += getTypeSize(*elem)/32 - 1 } if err != nil { return nil, err } retval.Field(index).Set(reflect.ValueOf(marshalledValue)) } return retval.Interface(), nil } // toGoType parses the output bytes and recursively assigns the value of these bytes // into a go type with accordance with the ABI spec. func toGoType(index int, t Type, output []byte) (interface{}, error) { if index+32 > len(output) { return nil, fmt.Errorf("abi: cannot marshal in to go type: length insufficient %d require %d", len(output), index+32) } var ( returnOutput []byte begin, length int err error ) // if we require a length prefix, find the beginning word and size returned. if t.requiresLengthPrefix() { begin, length, err = lengthPrefixPointsTo(index, output) if err != nil { return nil, err } } else { returnOutput = output[index : index+32] } switch t.T { case TupleTy: if isDynamicType(t) { begin, err := tuplePointsTo(index, output) if err != nil { return nil, err } return forTupleUnpack(t, output[begin:]) } return forTupleUnpack(t, output[index:]) case SliceTy: return forEachUnpack(t, output[begin:], 0, length) case ArrayTy: if isDynamicType(*t.Elem) { offset := int64(binary.BigEndian.Uint64(returnOutput[len(returnOutput)-8:])) return forEachUnpack(t, output[offset:], 0, t.Size) } return forEachUnpack(t, output[index:], 0, t.Size) case StringTy: // variable arrays are written at the end of the return bytes return string(output[begin : begin+length]), nil case IntTy, UintTy: return ReadInteger(t, returnOutput), nil case BoolTy: return readBool(returnOutput) case AddressTy: var caddr common.ContractAddress caddr.SetBytes(returnOutput) return caddr, nil case HashTy: return common.BytesToHash(returnOutput), nil case BytesTy: return output[begin : begin+length], nil case FixedBytesTy: return ReadFixedBytes(t, returnOutput) case FunctionTy: return readFunctionType(t, returnOutput) default: return nil, fmt.Errorf("abi: unknown type %v", t.T) } } // interprets a 32 byte slice as an offset and then determines which indice to look to decode the type. func lengthPrefixPointsTo(index int, output []byte) (start int, length int, err error) { bigOffsetEnd := big.NewInt(0).SetBytes(output[index : index+32]) bigOffsetEnd.Add(bigOffsetEnd, common.Big32) outputLength := big.NewInt(int64(len(output))) if bigOffsetEnd.Cmp(outputLength) > 0 { return 0, 0, fmt.Errorf("abi: cannot marshal in to go slice: offset %v would go over slice boundary (len=%v)", bigOffsetEnd, outputLength) } if bigOffsetEnd.BitLen() > 63 { return 0, 0, fmt.Errorf("abi offset larger than int64: %v", bigOffsetEnd) } offsetEnd := int(bigOffsetEnd.Uint64()) lengthBig := big.NewInt(0).SetBytes(output[offsetEnd-32 : offsetEnd]) totalSize := big.NewInt(0) totalSize.Add(totalSize, bigOffsetEnd) totalSize.Add(totalSize, lengthBig) if totalSize.BitLen() > 63 { return 0, 0, fmt.Errorf("abi length larger than int64: %v", totalSize) } if totalSize.Cmp(outputLength) > 0 { return 0, 0, fmt.Errorf("abi: cannot marshal in to go type: length insufficient %v require %v", outputLength, totalSize) } start = int(bigOffsetEnd.Uint64()) length = int(lengthBig.Uint64()) return } // tuplePointsTo resolves the location reference for dynamic tuple. func tuplePointsTo(index int, output []byte) (start int, err error) { offset := big.NewInt(0).SetBytes(output[index : index+32]) outputLen := big.NewInt(int64(len(output))) if offset.Cmp(big.NewInt(int64(len(output)))) > 0 { return 0, fmt.Errorf("abi: cannot marshal in to go slice: offset %v would go over slice boundary (len=%v)", offset, outputLen) } if offset.BitLen() > 63 { return 0, fmt.Errorf("abi offset larger than int64: %v", offset) } return int(offset.Uint64()), nil } ================================================ FILE: accounts/accounts.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // Package accounts implements high level Sero account management. package accounts import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-czero-import/superzk" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/common/address" "github.com/sero-cash/go-sero/event" "github.com/sero-cash/go-sero/zero/utils" ) // AccountAddress represents an Sero account located at a specific location defined // by the optional URL field. type Account struct { Address address.PKAddress `json:"address"` // Sero account address derived from the key Tk address.TKAddress `json:"tk"` // Sero account tk derived from the key URL URL `json:"url"` // Optional resource locator within a backend At uint64 `json:"at"` //account create at blocknum Version int `json:"version"` } func (self *Account) GetPkr(rand *c_type.Uint256) c_type.PKr { pk := self.Address.ToUint512() return superzk.Pk2PKr(&pk, rand) } func (self *Account) GetPk() c_type.Uint512 { var pk c_type.Uint512 pk, _ = superzk.Tk2Pk(self.Tk.ToTk().NewRef()) return pk } func (self *Account) GetDefaultPkr(index uint64) c_type.PKr { pk := self.Address.ToUint512() r := c_type.Uint256{} copy(r[:], common.LeftPadBytes(utils.EncodeNumber(index), 32)) if index == 0 { return superzk.Pk2PKr(&pk, nil) } else { return superzk.Pk2PKr(&pk, &r) } } func (self *Account) IsMyPk(pk c_type.Uint512) bool { pkr := superzk.Pk2PKr(&pk, nil) return self.IsMyPkr(pkr) } func (self *Account) IsMyPkr(pkr c_type.PKr) bool { tk := c_type.Tk{} copy(tk[:], self.Tk[:]) return superzk.IsMyPKr(&tk, &pkr) } // Wallet represents a software or hardware wallet that might contain one or more // accounts (derived from the same seed). type Wallet interface { // URL retrieves the canonical path under which this wallet is reachable. It is // user by upper layers to define a sorting order over all wallets from multiple // backends. URL() URL // Status returns a textual status to aid the user in the current state of the // wallet. It also returns an error indicating any failure the wallet might have // encountered. Status() (string, error) // Open initializes access to a wallet instance. It is not meant to unlock or // decrypt account keys, rather simply to establish a connection to hardware // wallets and/or to access derivation seeds. // // The passphrase parameter may or may not be used by the implementation of a // particular wallet instance. The reason there is no passwordless open method // is to strive towards a uniform wallet handling, oblivious to the different // backend providers. // // Please note, if you open a wallet, you must close it to release any allocated // resources (especially important when working with hardware wallets). Open(passphrase string) error // Close releases any resources held by an open wallet instance. Close() error // Accounts retrieves the list of signing accounts the wallet is currently aware // of. For hierarchical deterministic wallets, the list will not be exhaustive, // rather only contain the accounts explicitly pinned during account derivation. Accounts() []Account // Contains returns whether an account is part of this particular wallet or not. Contains(account Account) bool // Derive attempts to explicitly derive a hierarchical deterministic account at // the specified derivation path. If requested, the derived account will be added // to the wallet's tracked account list. Derive(path DerivationPath, pin bool) (Account, error) // SelfDerive sets a base account derivation path from which the wallet attempts // to discover non zero accounts and automatically add them to list of tracked // accounts. // // Note, self derivaton will increment the last component of the specified path // opposed to decending into a child path to allow discovering accounts starting // from non zero components. // // You can disable automatic account discovery by calling SelfDerive with a nil // chain state reader. // IsMine return whether an once address is mine or not IsMine(pkr c_type.PKr) bool AddressUnlocked(account Account) (bool, error) GetSeed() (*address.Seed, error) GetSeedWithPassphrase(passphrase string) (*address.Seed, error) } // Backend is a "wallet provider" that may contain a batch of accounts they can // sign transactions with and upon request, do so. type Backend interface { // Wallets retrieves the list of wallets the backend is currently aware of. // // The returned wallets are not opened by default. For software HD wallets this // means that no base seeds are decrypted, and for hardware wallets that no actual // connection is established. // // The resulting wallet list will be sorted alphabetically based on its internal // URL assigned by the backend. Since wallets (especially hardware) may come and // go, the same wallet might appear at a different positions in the list during // subsequent retrievals. Wallets() []Wallet // Subscribe creates an async subscription to receive notifications when the // backend detects the arrival or departure of a wallet. Subscribe(sink chan<- WalletEvent) event.Subscription } // WalletEventType represents the different event types that can be fired by // the wallet subscription subsystem. type WalletEventType int const ( // WalletArrived is fired when a new wallet is detected either via USB or via // a filesystem event in the keystore. WalletArrived WalletEventType = iota // WalletOpened is fired when a wallet is successfully opened with the purpose // of starting any background processes such as automatic key derivation. WalletOpened // WalletDropped WalletDropped ) // WalletEvent is an event fired by an account backend when a wallet arrival or // departure is detected. type WalletEvent struct { Wallet Wallet // Wallet instance arrived or departed Kind WalletEventType // Event type that happened in the system } ================================================ FILE: accounts/errors.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package accounts import ( "errors" "fmt" ) // ErrUnknownAccount is returned for any requested operation for which no backend // provides the specified account. var ErrUnknownAccount = errors.New("unknown account") // ErrUnknownWallet is returned for any requested operation for which no backend // provides the specified wallet. var ErrUnknownWallet = errors.New("unknown wallet") // ErrNotSupported is returned when an operation is requested from an account // backend that it does not support. var ErrNotSupported = errors.New("not supported") // ErrInvalidPassphrase is returned when a decryption operation receives a bad // passphrase. var ErrInvalidPassphrase = errors.New("invalid passphrase") // ErrWalletAlreadyOpen is returned if a wallet is attempted to be opened the // second time. var ErrWalletAlreadyOpen = errors.New("wallet already open") // ErrWalletClosed is returned if a wallet is attempted to be opened the // secodn time. var ErrWalletClosed = errors.New("wallet closed") // AuthNeededError is returned by backends for signing requests where the user // is required to provide further authentication before signing can succeed. // // This usually means either that a password needs to be supplied, or perhaps a // one time PIN code displayed by some hardware device. type AuthNeededError struct { Needed string // Extra authentication the user needs to provide } // NewAuthNeededError creates a new authentication error with the extra details // about the needed fields set. func NewAuthNeededError(needed string) error { return &AuthNeededError{ Needed: needed, } } // Error implements the standard error interface. func (err *AuthNeededError) Error() string { return fmt.Sprintf("authentication needed: %s", err.Needed) } ================================================ FILE: accounts/hd.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package accounts import ( "errors" "fmt" "math" "math/big" "strings" ) // DefaultRootDerivationPath is the root path to which custom derivation endpoints // are appended. As such, the first account will be at m/44'/60'/0'/0, the second // at m/44'/60'/0'/1, etc. var DefaultRootDerivationPath = DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0} // DefaultBaseDerivationPath is the base path from which custom derivation endpoints // are incremented. As such, the first account will be at m/44'/60'/0'/0, the second // at m/44'/60'/0'/1, etc. var DefaultBaseDerivationPath = DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0, 0} // DefaultLedgerBaseDerivationPath is the base path from which custom derivation endpoints // are incremented. As such, the first account will be at m/44'/60'/0'/0, the second // at m/44'/60'/0'/1, etc. var DefaultLedgerBaseDerivationPath = DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0} // DerivationPath represents the computer friendly version of a hierarchical // deterministic wallet account derivaion path. // // The BIP-32 spec https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki // defines derivation paths to be of the form: // // m / purpose' / coin_type' / account' / change / address_index // // The BIP-44 spec https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki // defines that the `purpose` be 44' (or 0x8000002C) for crypto currencies, and // SLIP-44 https://github.com/satoshilabs/slips/blob/master/slip-0044.md assigns // the `coin_type` 60' (or 0x8000003C) to Ethereum. // // The root path for Ethereum is m/44'/60'/0'/0 according to the specification // from https://github.com/ethereum/EIPs/issues/84, albeit it's not set in stone // yet whether accounts should increment the last component or the children of // that. We will go with the simpler approach of incrementing the last component. type DerivationPath []uint32 // ParseDerivationPath converts a user specified derivation path string to the // internal binary representation. // // Full derivation paths need to start with the `m/` prefix, relative derivation // paths (which will get appended to the default root path) must not have prefixes // in front of the first element. Whitespace is ignored. func ParseDerivationPath(path string) (DerivationPath, error) { var result DerivationPath // Handle absolute or relative paths components := strings.Split(path, "/") switch { case len(components) == 0: return nil, errors.New("empty derivation path") case strings.TrimSpace(components[0]) == "": return nil, errors.New("ambiguous path: use 'm/' prefix for absolute paths, or no leading '/' for relative ones") case strings.TrimSpace(components[0]) == "m": components = components[1:] default: result = append(result, DefaultRootDerivationPath...) } // All remaining components are relative, append one by one if len(components) == 0 { return nil, errors.New("empty derivation path") // Empty relative paths } for _, component := range components { // Ignore any user added whitespace component = strings.TrimSpace(component) var value uint32 // Handle hardened paths if strings.HasSuffix(component, "'") { value = 0x80000000 component = strings.TrimSpace(strings.TrimSuffix(component, "'")) } // Handle the non hardened component bigval, ok := new(big.Int).SetString(component, 0) if !ok { return nil, fmt.Errorf("invalid component: %s", component) } max := math.MaxUint32 - value if bigval.Sign() < 0 || bigval.Cmp(big.NewInt(int64(max))) > 0 { if value == 0 { return nil, fmt.Errorf("component %v out of allowed range [0, %d]", bigval, max) } return nil, fmt.Errorf("component %v out of allowed hardened range [0, %d]", bigval, max) } value += uint32(bigval.Uint64()) // Append and repeat result = append(result, value) } return result, nil } // String implements the stringer interface, converting a binary derivation path // to its canonical representation. func (path DerivationPath) String() string { result := "m" for _, component := range path { var hardened bool if component >= 0x80000000 { component -= 0x80000000 hardened = true } result = fmt.Sprintf("%s/%d", result, component) if hardened { result += "'" } } return result } ================================================ FILE: accounts/keystore/account_cache.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package keystore import ( "bufio" "encoding/json" "fmt" "os" "path/filepath" "sort" "strings" "sync" "time" "github.com/pkg/errors" "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-czero-import/superzk" "github.com/sero-cash/go-sero/common/address" mapset "github.com/deckarep/golang-set" "github.com/sero-cash/go-sero/accounts" "github.com/sero-cash/go-sero/log" ) // Minimum amount of time between cache reloads. This limit applies if the platform does // not support change notifications. It also applies if the keystore directory does not // exist yet, the code will attempt to create a watcher at most this often. const minReloadInterval = 2 * time.Second type accountsByTag []accountByTag type accountByTag struct { accountByURL accounts.Account update bool } func (s accountsByTag) Len() int { return len(s) } func (s accountsByTag) Less(i, j int) bool { return s[i].accountByURL.URL.Cmp(s[j].accountByURL.URL) < 0 } func (s accountsByTag) Swap(i, j int) { s[i], s[j] = s[j], s[i] } // AmbiguousAddrError is returned when attempting to unlock // an address for which more than one file exists. type AmbiguousAddrError struct { Address address.PKAddress Matches []accounts.Account } func (err *AmbiguousAddrError) Error() string { files := "" for i, a := range err.Matches { files += a.URL.Path if i < len(err.Matches)-1 { files += ", " } } return fmt.Sprintf("multiple keys match address (%s)", files) } // accountCache is a live index of all accounts in the keystore. type accountCache struct { keydir string watcher *watcher mu sync.Mutex all accountsByTag byAddr map[address.PKAddress][]accounts.Account throttle *time.Timer notify chan struct{} fileC fileCache } func newAccountCache(keydir string) (*accountCache, chan struct{}) { ac := &accountCache{ keydir: keydir, byAddr: make(map[address.PKAddress][]accounts.Account), notify: make(chan struct{}, 1), fileC: fileCache{all: mapset.NewThreadUnsafeSet()}, } ac.watcher = newWatcher(ac) return ac, ac.notify } func (ac *accountCache) accounts() []accounts.Account { ac.maybeReload() ac.mu.Lock() defer ac.mu.Unlock() cpy := []accounts.Account{} for _, accT := range ac.all { cpy = append(cpy, accT.accountByURL) } return cpy } func (ac *accountCache) accountsByTag() []accountByTag { ac.maybeReload() ac.mu.Lock() defer ac.mu.Unlock() cpy := make([]accountByTag, len(ac.all)) copy(cpy, ac.all) return cpy } func (ac *accountCache) hasAddress(addr address.PKAddress) bool { ac.maybeReload() ac.mu.Lock() defer ac.mu.Unlock() return len(ac.byAddr[addr]) > 0 } func (ac *accountCache) add(newAccount accounts.Account, update bool) { ac.mu.Lock() defer ac.mu.Unlock() i := sort.Search(len(ac.all), func(i int) bool { return ac.all[i].accountByURL.URL.Cmp(newAccount.URL) >= 0 }) if i < len(ac.all) && ac.all[i].accountByURL == newAccount { return } // newAccount is not in the cache. ac.all = append(ac.all, accountByTag{accountByURL: accounts.Account{}}) copy(ac.all[i+1:], ac.all[i:]) ac.all[i] = accountByTag{newAccount, update} ac.byAddr[newAccount.Address] = append(ac.byAddr[newAccount.Address], newAccount) } // note: removed needs to be unique here (i.e. both File and Data must be set). func (ac *accountCache) delete(removed accounts.Account) { ac.mu.Lock() defer ac.mu.Unlock() ac.all = removeAccountByTag(ac.all, removed) if ba := removeAccount(ac.byAddr[removed.Address], removed); len(ba) == 0 { delete(ac.byAddr, removed.Address) } else { ac.byAddr[removed.Address] = ba } } // deleteByFile removes an account referenced by the given path. func (ac *accountCache) deleteByFile(path string) { ac.mu.Lock() defer ac.mu.Unlock() i := sort.Search(len(ac.all), func(i int) bool { return ac.all[i].accountByURL.URL.Path >= path }) if i < len(ac.all) && ac.all[i].accountByURL.URL.Path == path { removed := ac.all[i].accountByURL ac.all = append(ac.all[:i], ac.all[i+1:]...) if ba := removeAccount(ac.byAddr[removed.Address], removed); len(ba) == 0 { delete(ac.byAddr, removed.Address) } else { ac.byAddr[removed.Address] = ba } } } func removeAccount(slice []accounts.Account, elem accounts.Account) []accounts.Account { for i := range slice { if slice[i] == elem { return append(slice[:i], slice[i+1:]...) } } return slice } func removeAccountByTag(slice []accountByTag, elem accounts.Account) []accountByTag { for i := range slice { if slice[i].accountByURL == elem { return append(slice[:i], slice[i+1:]...) } } return slice } // find returns the cached account for address if there is a unique match. // The exact matching rules are explained by the documentation of accounts.AccountAddress. // Callers must hold ac.mu. func (ac *accountCache) find(a accounts.Account) (accounts.Account, error) { // Limit search to address candidates if possible. matches := []accounts.Account{} for _, accT := range ac.all { matches = append(matches, accT.accountByURL) } if (a.Address != address.PKAddress{}) { matches = ac.byAddr[a.Address] } if a.URL.Path != "" { // If only the basename is specified, complete the path. if !strings.ContainsRune(a.URL.Path, filepath.Separator) { a.URL.Path = filepath.Join(ac.keydir, a.URL.Path) } for i := range matches { if matches[i].URL == a.URL { return matches[i], nil } } if (a.Address == address.PKAddress{}) { return accounts.Account{}, ErrNoMatch } } switch len(matches) { case 1: return matches[0], nil case 0: return accounts.Account{}, ErrNoMatch default: err := &AmbiguousAddrError{Address: a.Address, Matches: make([]accounts.Account, len(matches))} copy(err.Matches, matches) //sort.Sort(accountsByURL(err.Matches)) return accounts.Account{}, err } } func (ac *accountCache) maybeReload() { ac.mu.Lock() if ac.watcher.running { ac.mu.Unlock() return // A watcher is running and will keep the cache up-to-date. } if ac.throttle == nil { ac.throttle = time.NewTimer(0) } else { select { case <-ac.throttle.C: default: ac.mu.Unlock() return // The cache was reloaded recently. } } // No watcher running, start it. ac.watcher.start() ac.throttle.Reset(minReloadInterval) ac.mu.Unlock() ac.scanAccounts() } func (ac *accountCache) close() { ac.mu.Lock() ac.watcher.close() if ac.throttle != nil { ac.throttle.Stop() } if ac.notify != nil { close(ac.notify) ac.notify = nil } ac.mu.Unlock() } // scanAccounts checks if any changes have occurred on the filesystem, and // updates the account cache accordingly func (ac *accountCache) scanAccounts() error { // Scan the entire folder metadata for file changes creates, deletes, updates, err := ac.fileC.scan(ac.keydir) if err != nil { log.Debug("Failed to reload keystore contents", "err", err) return err } if creates.Cardinality() == 0 && deletes.Cardinality() == 0 && updates.Cardinality() == 0 { return nil } // Create a helper method to scan the contents of the key files var ( buf = new(bufio.Reader) key struct { Address string `json:"address"` Tk string `json:"tk"` At uint64 `json:"at"` Version int `json:"version"` } ) readAccount := func(path string) *accounts.Account { fd, err := os.Open(path) if err != nil { log.Trace("Failed to open keystore file", "path", path, "err", err) return nil } defer fd.Close() buf.Reset(fd) // Parse the address. key.Address = "" key.Tk = "" key.At = 0 key.Version = 0 err = json.NewDecoder(buf).Decode(&key) tk := address.Base58ToTk(key.Tk) pk, _ := superzk.Tk2Pk(tk.ToTk().NewRef()) var addr address.PKAddress copy(addr[:], pk[:]) at := key.At version := key.Version if c_superzk.IsSzkTk(tk.ToTk().NewRef()) { if version != 2 { err = errors.New("invalid keystore versiong want 2 but find " + string(version)) } } else { if version != 1 { err = errors.New("invalid keystore versiong want 1 but find " + string(version)) } } switch { case err != nil: log.Debug("Failed to decode keystore key", "path", path, "err", err) case (addr == address.PKAddress{}): log.Debug("Failed to decode keystore key", "path", path, "err", "missing or zero address") default: return &accounts.Account{Address: addr, Tk: tk, URL: accounts.URL{Scheme: KeyStoreScheme, Path: path}, At: at, Version: version} } return nil } // Process all the file diffs start := time.Now() for _, p := range creates.ToSlice() { if a := readAccount(p.(string)); a != nil { ac.add(*a, true) } } for _, p := range deletes.ToSlice() { ac.deleteByFile(p.(string)) } for _, p := range updates.ToSlice() { path := p.(string) ac.deleteByFile(path) if a := readAccount(path); a != nil { ac.add(*a, true) } } end := time.Now() select { case ac.notify <- struct{}{}: default: } log.Trace("Handled keystore changes", "time", end.Sub(start)) return nil } ================================================ FILE: accounts/keystore/account_cache_test.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package keystore import ( "fmt" "io/ioutil" "math/rand" "os" "path/filepath" "reflect" "sort" "testing" "time" "github.com/sero-cash/go-sero/common/address" "github.com/cespare/cp" "github.com/davecgh/go-spew/spew" "github.com/sero-cash/go-sero/accounts" ) var ( cachetestDir, _ = filepath.Abs(filepath.Join("testdata", "keystore")) cachetestAccounts = []accounts.Account{ { Address: address.StringToPk("64t1MPxFp4yzxNJ64zp1NmrTXWsrLuw9DMiMZeujbD2HVAKhjR3zpKnuFVjjAXAp86G2PzSVSsdiMdwp5JPoqxtP"), Tk: address.Base58ToTk("48rGJTGEeQKiFcCi82rbZdvZeyhoJHnVqeDrV627nT4vKTUtYUKJGYmt4dMnRX94RDAtXJV4SEXKyFPH9TdhFxiB"), URL: accounts.URL{Scheme: KeyStoreScheme, Path: filepath.Join(cachetestDir, "UTC--2018-08-11T10-19-38.165083119Z--64t1MPxFp4yzxNJ64zp1NmrTXWsrLuw9DMiMZeujbD2HVAKhjR3zpKnuFVjjAXAp86G2PzSVSsdiMdwp5JPoqxtP")}, }, { Address: address.StringToPk("4raP8fYEznZDD9WXc8pvS2tMg992iZiWXssvwhCrXTFEhafcRt8urTeDyANfTrtXpJjnfz65cbYvr7g5WauAJgdc"), Tk: address.Base58ToTk("5W5KsFo2di2kzrP2xEjT1iYpx66BoryPJccDRXz4BH5J2MWxKnnWZtmKm7a7BqjheBfi8rKJCqKFPME7hDLuiEJA"), URL: accounts.URL{Scheme: KeyStoreScheme, Path: filepath.Join(cachetestDir, "aaa")}, }, { Address: address.StringToPk("3Fov1AdSTVSTEWTEGfbknRrmHxBCoZ6AktyJA4jGFytHu7xDWEYysnR9YkwkKj5Knzttc6tNw4ENY4JZiirrksYw"), Tk: address.Base58ToTk("fLFiBSN8JojjcECipDA4yNafv19BvcFEoP91BVsxRsd1qda9QkBXJM3Car9Y6V9VfYpZULx8dcPUnb2iNFnk4JX"), URL: accounts.URL{Scheme: KeyStoreScheme, Path: filepath.Join(cachetestDir, "zzz")}, }, } ) func TestWatchNewFile(t *testing.T) { t.Parallel() dir, ks := tmpKeyStore(t) defer os.RemoveAll(dir) // Ensure the watcher is started before adding any files. ks.Accounts() time.Sleep(1000 * time.Millisecond) // Move in the files. wantAccounts := make([]accounts.Account, len(cachetestAccounts)) for i := range cachetestAccounts { wantAccounts[i] = accounts.Account{ Address: cachetestAccounts[i].Address, Tk: cachetestAccounts[i].Tk, URL: accounts.URL{Scheme: KeyStoreScheme, Path: filepath.Join(dir, filepath.Base(cachetestAccounts[i].URL.Path))}, } if err := cp.CopyFile(wantAccounts[i].URL.Path, cachetestAccounts[i].URL.Path); err != nil { t.Fatal(err) } } // ks should see the accounts. var list []accounts.Account for d := 200 * time.Millisecond; d < 5*time.Second; d *= 2 { list = ks.Accounts() if reflect.DeepEqual(list, wantAccounts) { // ks should have also received change notifications select { case <-ks.changes: default: t.Fatalf("wasn't notified of new accounts") } return } time.Sleep(d) } t.Errorf("got %s, want %s", spew.Sdump(list), spew.Sdump(wantAccounts)) } func TestWatchNoDir(t *testing.T) { t.Parallel() // Create ks but not the directory that it watches. rand.Seed(time.Now().UnixNano()) dir := filepath.Join(os.TempDir(), fmt.Sprintf("eth-keystore-watch-test-%d-%d", os.Getpid(), rand.Int())) ks := NewKeyStore(dir, LightScryptN, LightScryptP) list := ks.Accounts() if len(list) > 0 { t.Error("initial account list not empty:", list) } time.Sleep(100 * time.Millisecond) // Create the directory and copy a key file into it. os.MkdirAll(dir, 0700) defer os.RemoveAll(dir) file := filepath.Join(dir, "aaa") if err := cp.CopyFile(file, cachetestAccounts[0].URL.Path); err != nil { t.Fatal(err) } // ks should see the account. wantAccounts := []accounts.Account{cachetestAccounts[0]} wantAccounts[0].URL = accounts.URL{Scheme: KeyStoreScheme, Path: file} for d := 200 * time.Millisecond; d < 8*time.Second; d *= 2 { list = ks.Accounts() if reflect.DeepEqual(list, wantAccounts) { // ks should have also received change notifications select { case <-ks.changes: default: t.Fatalf("wasn't notified of new accounts") } return } time.Sleep(d) } t.Errorf("\ngot %v\nwant %v", list, wantAccounts) } func TestCacheInitialReload(t *testing.T) { cache, _ := newAccountCache(cachetestDir) accounts := cache.accounts() if !reflect.DeepEqual(accounts, cachetestAccounts) { t.Fatalf("got initial accounts: %swant %s", spew.Sdump(accounts), spew.Sdump(cachetestAccounts)) } } func TestCacheAddDeleteOrder(t *testing.T) { cache, _ := newAccountCache("testdata/no-such-dir") cache.watcher.running = true // prevent unexpected reloads accs := []accounts.Account{ { Address: address.StringToPk("oJBdJSCpFRyp5wQeJxwE4AUUQWAqh12Jn3Fo8RvUd1XZuZmyyHGhYVCsTGgLmuXKc2hoZWfj5MkNaf8hTvG8Hec"), URL: accounts.URL{Scheme: KeyStoreScheme, Path: "-309830980"}, }, { Address: address.StringToPk("29uJ8gWjfgDdF389Y35FDoMbRWXDuTwGEKSEE17MP9xVMCuBMGVgWuofeHqjhGCqxQm3EijZPLdb1vMfSpP8MnNa"), URL: accounts.URL{Scheme: KeyStoreScheme, Path: "ggg"}, }, { Address: address.StringToPk("5BmSf3Cynp2bcw8TFgUTWQBaD3F8bqqJvuCAu83SM1E1nSFUHCdxgSCnBtqv744DFoLsR61PnhSWWarwK3uF6LJv"), URL: accounts.URL{Scheme: KeyStoreScheme, Path: "zzzzzz-the-very-last-one.keyXXX"}, }, { Address: address.StringToPk("5BkUvZ9ifZBhGnJdmSKfs7jn1h3EJzCHVjZWbLQgdTJ1i363CcbShy2SHHKWNqHWjKuX19XmjMg9vJLQ7mLQWWmN"), URL: accounts.URL{Scheme: KeyStoreScheme, Path: "SOMETHING.key"}, }, { Address: address.StringToPk("64t1MPxFp4yzxNJ64zp1NmrTXWsrLuw9DMiMZeujbD2HVAKhjR3zpKnuFVjjAXAp86G2PzSVSsdiMdwp5JPoqxtP"), URL: accounts.URL{Scheme: KeyStoreScheme, Path: "UTC--2018-08-11T10-19-38.165083119Z--64t1MPxFp4yzxNJ64zp1NmrTXWsrLuw9DMiMZeujbD2HVAKhjR3zpKnuFVjjAXAp86G2PzSVSsdiMdwp5JPoqxtP"}, }, { Address: address.StringToPk("4raP8fYEznZDD9WXc8pvS2tMg992iZiWXssvwhCrXTFEhafcRt8urTeDyANfTrtXpJjnfz65cbYvr7g5WauAJgdc"), URL: accounts.URL{Scheme: KeyStoreScheme, Path: "aaa"}, }, { Address: address.StringToPk("3Fov1AdSTVSTEWTEGfbknRrmHxBCoZ6AktyJA4jGFytHu7xDWEYysnR9YkwkKj5Knzttc6tNw4ENY4JZiirrksYw"), URL: accounts.URL{Scheme: KeyStoreScheme, Path: "zzz"}, }, } for _, a := range accs { cache.add(a, false) } // Add some of them twice to check that they don't get reinserted. cache.add(accs[0], false) cache.add(accs[2], false) // Check that the account list is sorted by filename. wantAccountsByTag := []accountByTag{} for _, acc := range accs { wantAccountsByTag = append(wantAccountsByTag, accountByTag{acc, false}) } sort.Sort(accountsByTag(wantAccountsByTag)) wantAccounts := []accounts.Account{} for _, acc := range wantAccountsByTag { wantAccounts = append(wantAccounts, acc.accountByURL) } list := cache.accounts() if !reflect.DeepEqual(list, wantAccounts) { t.Fatalf("got accounts: %s\nwant %s", spew.Sdump(accs), spew.Sdump(wantAccounts)) } for _, a := range accs { if !cache.hasAddress(a.Address) { t.Errorf("expected hasAccount(%x) to return true", a.Address) } } if cache.hasAddress(address.StringToPk("3kawu8SZ6vzMBde3tP2zuS4XkfTeyjQg2yryDopayXPHVhncz3appEeE8BGp3XBYcfByxBnzoTSp5F8MFVhzxeEB")) { t.Errorf("expected hasAccount(%x) to return false", address.StringToPk("fd9bd350f08ee3c0c19b85a8e16114a11a60aa4e")) } // Delete a few keys from the cache. for i := 0; i < len(accs); i += 2 { cache.delete(wantAccounts[i]) } cache.delete(accounts.Account{Address: address.StringToPk("3kawu8SZ6vzMBde3tP2zuS4XkfTeyjQg2yryDopayXPHVhncz3appEeE8BGp3XBYcfByxBnzoTSp5F8MFVhzxeEB"), URL: accounts.URL{Scheme: KeyStoreScheme, Path: "something"}}) // Check content again after deletion. wantAccountsAfterDelete := []accounts.Account{ wantAccounts[1], wantAccounts[3], wantAccounts[5], } list = cache.accounts() if !reflect.DeepEqual(list, wantAccountsAfterDelete) { t.Fatalf("got accounts after delete: %s\nwant %s", spew.Sdump(list), spew.Sdump(wantAccountsAfterDelete)) } for _, a := range wantAccountsAfterDelete { if !cache.hasAddress(a.Address) { t.Errorf("expected hasAccount(%x) to return true", a.Address) } } if cache.hasAddress(wantAccounts[0].Address) { t.Errorf("expected hasAccount(%x) to return false", wantAccounts[0].Address) } } func TestCacheFind(t *testing.T) { dir := filepath.Join("testdata", "dir") cache, _ := newAccountCache(dir) cache.watcher.running = true // prevent unexpected reloads accs := []accounts.Account{ { Address: address.StringToPk("36hSFHR4P242YkF2CDJayM8nxqZyH9iTdQLjMgAytyxLWiatqYwHRtXq5pPJ6XM9i1GCBgPVjhW3AHojoY25B6Ks"), URL: accounts.URL{Scheme: KeyStoreScheme, Path: filepath.Join(dir, "a.key")}, }, { Address: address.StringToPk("zwyLoRgtaj5XnpwRGqX6jizWf7yqSL7s8Yiaa2w3nThTjALReKn9orwP83xgoBhfwYH2gdapSokUodiJjHbuUsE"), URL: accounts.URL{Scheme: KeyStoreScheme, Path: filepath.Join(dir, "b.key")}, }, { Address: address.StringToPk("3RG6NiD2ewzo6aAu4sTRTafx92QeoesoS6yEzTsDCShrHvCQ5y4nQJ2zJ5c4kC3HsoJgCG79aJJBLn4EJfVT1yh9"), URL: accounts.URL{Scheme: KeyStoreScheme, Path: filepath.Join(dir, "c.key")}, }, { Address: address.StringToPk("5FzgDB5GGc6tKPaif531nD61YJ2JaC7kKzAusDPtJCRWGuH97fPojma16qMr2Dpxn7daDaPnJFCXdB4iUUAFV7Cq"), URL: accounts.URL{Scheme: KeyStoreScheme, Path: filepath.Join(dir, "c2.key")}, }, } for _, a := range accs { cache.add(a, false) } nomatchAccount := accounts.Account{ Address: address.StringToPk("bKHV56EP5eJzxPXHunSumEJM8ebQNXpbGgnX3UWSaVsTVx6MMZkGX7pTUmuQXwb4JYsFnvdbZJZkgT6FdEYR3Xh"), URL: accounts.URL{Scheme: KeyStoreScheme, Path: filepath.Join(dir, "something")}, } tests := []struct { Query accounts.Account WantResult accounts.Account WantError error }{ // by address {Query: accounts.Account{Address: accs[0].Address}, WantResult: accs[0]}, // by file {Query: accounts.Account{URL: accs[0].URL}, WantResult: accs[0]}, // by basename {Query: accounts.Account{URL: accounts.URL{Scheme: KeyStoreScheme, Path: filepath.Base(accs[0].URL.Path)}}, WantResult: accs[0]}, // by file and address {Query: accs[0], WantResult: accs[0]}, // ambiguous address, tie resolved by file {Query: accs[2], WantResult: accs[2]}, // ambiguous address error { Query: accounts.Account{Address: accs[2].Address}, WantError: &AmbiguousAddrError{ Address: accs[2].Address, Matches: []accounts.Account{accs[2], accs[3]}, }, }, // no match error {Query: nomatchAccount, WantError: ErrNoMatch}, {Query: accounts.Account{URL: nomatchAccount.URL}, WantError: ErrNoMatch}, {Query: accounts.Account{URL: accounts.URL{Scheme: KeyStoreScheme, Path: filepath.Base(nomatchAccount.URL.Path)}}, WantError: ErrNoMatch}, {Query: accounts.Account{Address: nomatchAccount.Address}, WantError: ErrNoMatch}, } for i, test := range tests { a, err := cache.find(test.Query) if !reflect.DeepEqual(err, test.WantError) { t.Errorf("test %d: error mismatch for query %v\ngot %q\nwant %q", i, test.Query, err, test.WantError) continue } if a != test.WantResult { t.Errorf("test %d: result mismatch for query %v\ngot %v\nwant %v", i, test.Query, a, test.WantResult) continue } } } func waitForAccounts(wantAccounts []accounts.Account, ks *KeyStore) error { var list []accounts.Account for d := 200 * time.Millisecond; d < 8*time.Second; d *= 2 { list = ks.Accounts() if reflect.DeepEqual(list, wantAccounts) { // ks should have also received change notifications select { case <-ks.changes: default: return fmt.Errorf("wasn't notified of new accounts") } return nil } time.Sleep(d) } return fmt.Errorf("\ngot %v\nwant %v", list, wantAccounts) } // TestUpdatedKeyfileContents tests that updating the contents of a keystore file // is noticed by the watcher, and the account cache is updated accordingly func TestUpdatedKeyfileContents(t *testing.T) { t.Parallel() // Create a temporary kesytore to test with rand.Seed(time.Now().UnixNano()) dir := filepath.Join(os.TempDir(), fmt.Sprintf("eth-keystore-watch-test-%d-%d", os.Getpid(), rand.Int())) ks := NewKeyStore(dir, LightScryptN, LightScryptP) list := ks.Accounts() if len(list) > 0 { t.Error("initial account list not empty:", list) } time.Sleep(100 * time.Millisecond) // Create the directory and copy a key file into it. os.MkdirAll(dir, 0700) defer os.RemoveAll(dir) file := filepath.Join(dir, "aaa") // Place one of our testfiles in there if err := cp.CopyFile(file, cachetestAccounts[0].URL.Path); err != nil { t.Fatal(err) } // ks should see the account. wantAccounts := []accounts.Account{cachetestAccounts[0]} wantAccounts[0].URL = accounts.URL{Scheme: KeyStoreScheme, Path: file} if err := waitForAccounts(wantAccounts, ks); err != nil { t.Error(err) return } // needed so that modTime of `file` is different to its current value after forceCopyFile time.Sleep(1000 * time.Millisecond) // Now replace file contents if err := forceCopyFile(file, cachetestAccounts[1].URL.Path); err != nil { t.Fatal(err) return } wantAccounts = []accounts.Account{cachetestAccounts[1]} wantAccounts[0].URL = accounts.URL{Scheme: KeyStoreScheme, Path: file} if err := waitForAccounts(wantAccounts, ks); err != nil { t.Errorf("First replacement failed") t.Error(err) return } // needed so that modTime of `file` is different to its current value after forceCopyFile time.Sleep(1000 * time.Millisecond) // Now replace file contents again if err := forceCopyFile(file, cachetestAccounts[2].URL.Path); err != nil { t.Fatal(err) return } wantAccounts = []accounts.Account{cachetestAccounts[2]} wantAccounts[0].URL = accounts.URL{Scheme: KeyStoreScheme, Path: file} if err := waitForAccounts(wantAccounts, ks); err != nil { t.Errorf("Second replacement failed") t.Error(err) return } // needed so that modTime of `file` is different to its current value after ioutil.WriteFile time.Sleep(1000 * time.Millisecond) // Now replace file contents with crap if err := ioutil.WriteFile(file, []byte("foo"), 0644); err != nil { t.Fatal(err) return } if err := waitForAccounts([]accounts.Account{}, ks); err != nil { t.Errorf("Emptying account file failed") t.Error(err) return } } // forceCopyFile is like cp.CopyFile, but doesn't complain if the destination exists. func forceCopyFile(dst, src string) error { data, err := ioutil.ReadFile(src) if err != nil { return err } return ioutil.WriteFile(dst, data, 0644) } ================================================ FILE: accounts/keystore/file_cache.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package keystore import ( "io/ioutil" "os" "path/filepath" "strings" "sync" "time" mapset "github.com/deckarep/golang-set" "github.com/sero-cash/go-sero/log" ) // fileCache is a cache of files seen during scan of keystore. type fileCache struct { all mapset.Set // Set of all files from the keystore folder lastMod time.Time // Last time instance when a file was modified mu sync.RWMutex } // scan performs a new scan on the given directory, compares against the already // cached filenames, and returns file sets: creates, deletes, updates. func (fc *fileCache) scan(keyDir string) (mapset.Set, mapset.Set, mapset.Set, error) { t0 := time.Now() // List all the failes from the keystore folder files, err := ioutil.ReadDir(keyDir) if err != nil { return nil, nil, nil, err } t1 := time.Now() fc.mu.Lock() defer fc.mu.Unlock() // Iterate all the files and gather their metadata all := mapset.NewThreadUnsafeSet() mods := mapset.NewThreadUnsafeSet() var newLastMod time.Time for _, fi := range files { // Skip any non-key files from the folder path := filepath.Join(keyDir, fi.Name()) if skipKeyFile(fi) { log.Trace("Ignoring file on account scan", "path", path) continue } // Gather the set of all and fresly modified files all.Add(path) modified := fi.ModTime() if modified.After(fc.lastMod) { mods.Add(path) } if modified.After(newLastMod) { newLastMod = modified } } t2 := time.Now() // Update the tracked files and return the three sets deletes := fc.all.Difference(all) // Deletes = previous - current creates := all.Difference(fc.all) // Creates = current - previous updates := mods.Difference(creates) // Updates = modified - creates fc.all, fc.lastMod = all, newLastMod t3 := time.Now() // Report on the scanning stats and return log.Debug("FS scan times", "list", t1.Sub(t0), "set", t2.Sub(t1), "diff", t3.Sub(t2)) return creates, deletes, updates, nil } // skipKeyFile ignores editor backups, hidden files and folders/symlinks. func skipKeyFile(fi os.FileInfo) bool { // Skip editor backups and UNIX-style hidden files. if strings.HasSuffix(fi.Name(), "~") || strings.HasPrefix(fi.Name(), ".") { return true } // Skip misc special files, directories (yes, symlinks too). if fi.IsDir() || fi.Mode()&os.ModeType != 0 { return true } return false } ================================================ FILE: accounts/keystore/key.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package keystore import ( "crypto/ecdsa" "fmt" "io" "io/ioutil" "os" "path/filepath" "time" "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-sero/common/address" "github.com/sero-cash/go-czero-import/c_type" bip39 "github.com/tyler-smith/go-bip39" "github.com/pborman/uuid" "github.com/sero-cash/go-sero/accounts" "github.com/sero-cash/go-sero/crypto" ) const ( version = 2 ) type Key struct { Id uuid.UUID // Version 4 "random" for unique id not derived from key data // to simplify lookups we also store the address Address address.PKAddress Tk address.TKAddress // we only store privkey as pubkey/address can be derived from it // privkey in this struct is always in plaintext PrivateKey *ecdsa.PrivateKey At uint64 Version int } type keyStore interface { // Loads and decrypts the key from disk. GetKey(address address.PKAddress, filename string, auth string) (*Key, error) // Writes and encrypts the key. StoreKey(filename string, k *Key, auth string) error // Joins filename with the key directory unless it is already absolute. JoinPath(filename string) string } type encryptedKeyJSONV1 struct { Address string `json:"address"` Tk string `json:"tk"` Crypto cryptoJSON `json:"crypto"` Id string `json:"id"` Version int `json:"version"` At uint64 `json:"at"` } type cryptoJSON struct { Cipher string `json:"cipher"` CipherText string `json:"ciphertext"` CipherParams cipherparamsJSON `json:"cipherparams"` KDF string `json:"kdf"` KDFParams map[string]interface{} `json:"kdfparams"` MAC string `json:"mac"` } type cipherparamsJSON struct { IV string `json:"iv"` } func newKeyFromECDSA(privateKeyECDSA *ecdsa.PrivateKey, at uint64, version int) *Key { id := uuid.NewRandom() tk := crypto.PrivkeyToTk(privateKeyECDSA, version) key := &Key{ Id: id, Address: tk.ToPk(), Tk: tk, PrivateKey: privateKeyECDSA, At: at, Version: version, } return key } func newKeyFromTk(tk *c_type.Tk, at uint64) *Key { id := uuid.NewRandom() tkaddress := address.TKAddress{} copy(tkaddress[:], tk[:]) v := 1 if c_superzk.IsSzkTk(tk) { v = 2 } key := &Key{ Id: id, Address: tkaddress.ToPk(), Tk: tkaddress, At: at, Version: v, } return key } func newKey(rand io.Reader, at uint64, version int) (*Key, error) { privateKeyECDSA, err := ecdsa.GenerateKey(crypto.S256(), rand) if err != nil { return nil, err } return newKeyFromECDSA(privateKeyECDSA, at, version), nil } func storeNewKey(ks keyStore, rand io.Reader, auth string, at uint64, version int) (*Key, accounts.Account, error) { key, err := newKey(rand, at, version) if err != nil { return nil, accounts.Account{}, err } a := accounts.Account{Address: key.Address, Tk: key.Tk, URL: accounts.URL{Scheme: KeyStoreScheme, Path: ks.JoinPath(keyFileName(key.Address))}, At: key.At, Version: version} if err := ks.StoreKey(a.URL.Path, key, auth); err != nil { zeroKey(key.PrivateKey) return nil, a, err } return key, a, err } func storeNewKeyWithMnemonic(ks keyStore, auth string, at uint64, version int) (string, *Key, accounts.Account, error) { entropy, err := bip39.NewEntropy(256) if err != nil { return "", nil, accounts.Account{}, err } mnemonic, err := bip39.NewMnemonic(entropy) if err != nil { return "", nil, accounts.Account{}, err } //seed := bip39.NewSeed(mnemonic, "") privateKeyECDSA, err := crypto.ToECDSA(entropy) if err != nil { return "", nil, accounts.Account{}, err } key := newKeyFromECDSA(privateKeyECDSA, at, version) a := accounts.Account{Address: key.Address, Tk: key.Tk, URL: accounts.URL{Scheme: KeyStoreScheme, Path: ks.JoinPath(keyFileName(key.Address))}, At: key.At, Version: key.Version} if err := ks.StoreKey(a.URL.Path, key, auth); err != nil { zeroKey(key.PrivateKey) return "", nil, a, err } if version == 2 { mnemonic = "v2 " + mnemonic } return mnemonic, key, a, err } func writeKeyFile(file string, content []byte) error { // Create the keystore directory with appropriate permissions // in case it is not present yet. const dirPerm = 0700 if err := os.MkdirAll(filepath.Dir(file), dirPerm); err != nil { return err } // Atomic write: create a temporary hidden file first // then move it into place. TempFile assigns mode 0600. f, err := ioutil.TempFile(filepath.Dir(file), "."+filepath.Base(file)+".tmp") if err != nil { return err } if _, err := f.Write(content); err != nil { f.Close() os.Remove(f.Name()) return err } f.Close() return os.Rename(f.Name(), file) } // keyFileName implements the naming convention for keyfiles: // UTC---
func keyFileName(keyAddr address.PKAddress) string { ts := time.Now().UTC() return fmt.Sprintf("UTC--%s--%s", toISO8601(ts), keyAddr.String()) } func toISO8601(t time.Time) string { var tz string name, offset := t.Zone() if name == "UTC" { tz = "Z" } else { tz = fmt.Sprintf("%03d00", offset/3600) } return fmt.Sprintf("%04d-%02d-%02dT%02d-%02d-%02d.%09d%s", t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second(), t.Nanosecond(), tz) } ================================================ FILE: accounts/keystore/keystore.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // Package keystore implements encrypted storage of secp256k1 private keys. // // Keys are stored as encrypted JSON files according to the Web3 Secret Storage specification. // See https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition for more information. package keystore import ( "crypto/ecdsa" crand "crypto/rand" "errors" "fmt" "os" "path/filepath" "reflect" "runtime" "sync" "time" "github.com/sero-cash/go-czero-import/c_type" "github.com/tyler-smith/go-bip39" "github.com/sero-cash/go-sero/common/address" "github.com/sero-cash/go-sero/accounts" "github.com/sero-cash/go-sero/crypto" "github.com/sero-cash/go-sero/event" ) var ( ErrLocked = accounts.NewAuthNeededError("password or unlock") ErrNoMatch = errors.New("no key for given address or file") ErrDecrypt = errors.New("could not decrypt key with given passphrase") ErrNoStoreType = errors.New("could not support kestore type") ) // KeyStoreType is the reflect type of a keystore backend. var KeyStoreType = reflect.TypeOf(&KeyStore{}) // KeyStoreScheme is the protocol scheme prefixing account and wallet URLs. const KeyStoreScheme = "keystore" // Maximum time between wallet refreshes (if filesystem notifications don't work). const walletRefreshCycle = 3 * time.Second // KeyStore manages a key storage directory on disk. type KeyStore struct { storage keyStore // Storage backend, might be cleartext or encrypted cache *accountCache // In-memory account cache over the filesystem storage changes chan struct{} // Channel receiving change notifications from the cache unlocked map[address.PKAddress]*unlocked // Currently unlocked account (decrypted private keys) wallets []accounts.Wallet // Wallet wrappers around the individual key files updateFeed event.Feed // Event feed to notify wallet additions/removals updateScope event.SubscriptionScope // Subscription scope tracking current live listeners updating bool // Whether the event notification loop is running mu sync.RWMutex } type unlocked struct { *Key abort chan struct{} } // NewKeyStore creates a keystore for the given directory. func NewKeyStore(keydir string, scryptN, scryptP int) *KeyStore { keydir, _ = filepath.Abs(keydir) ks := &KeyStore{storage: &keyStorePassphrase{keydir, scryptN, scryptP}} ks.init(keydir) return ks } func (ks *KeyStore) init(keydir string) { // Lock the mutex since the account cache might call back with events ks.mu.Lock() defer ks.mu.Unlock() // Initialize the set of unlocked keys and the account cache ks.unlocked = make(map[address.PKAddress]*unlocked) ks.cache, ks.changes = newAccountCache(keydir) // TODO: In order for this finalizer to work, there must be no references // to ks. addressCache doesn't keep a reference but unlocked keys do, // so the finalizer will not trigger until all timed unlocks have expired. runtime.SetFinalizer(ks, func(m *KeyStore) { m.cache.close() }) // Create the initial list of wallets from the cache accs := ks.cache.accounts() ks.wallets = make([]accounts.Wallet, len(accs)) for i := 0; i < len(accs); i++ { ks.wallets[i] = &keystoreWallet{account: accs[i], keystore: ks} } } // Wallets implements accounts.Backend, returning all single-key wallets from the // keystore directory. func (ks *KeyStore) Wallets() []accounts.Wallet { // Make sure the list of wallets is in sync with the account cache ks.refreshWallets() ks.mu.RLock() defer ks.mu.RUnlock() cpy := make([]accounts.Wallet, len(ks.wallets)) copy(cpy, ks.wallets) return cpy } // refreshWallets retrieves the current account list and based on that does any // necessary wallet refreshes. func (ks *KeyStore) refreshWallets() { // Retrieve the current list of accounts ks.mu.Lock() accs := ks.cache.accountsByTag() // Transform the current list of wallets into the new one wallets := make([]accounts.Wallet, 0, len(accs)) events := []accounts.WalletEvent{} for _, account := range accs { // Drop wallets while they were in front of the next account for len(ks.wallets) > 0 && ks.wallets[0].URL().Cmp(account.accountByURL.URL) < 0 { events = append(events, accounts.WalletEvent{Wallet: ks.wallets[0], Kind: accounts.WalletDropped}) ks.wallets = ks.wallets[1:] } // If there are no more wallets or the account is before the next, wrap new wallet if len(ks.wallets) == 0 || ks.wallets[0].URL().Cmp(account.accountByURL.URL) > 0 { wallet := &keystoreWallet{account: account.accountByURL, keystore: ks} //if account.update { //log.Info("refresWallets improt", "account", account.accountByURL) //state1dir := zconfig.State1_file("") //err := os.RemoveAll(state1dir) //if err != nil { // log.Error("refresWallets import remvoe", "state1dir", state1dir) //} //} events = append(events, accounts.WalletEvent{Wallet: wallet, Kind: accounts.WalletArrived}) wallets = append(wallets, wallet) continue } // If the account is the same as the first wallet, keep it if ks.wallets[0].Accounts()[0] == account.accountByURL { wallets = append(wallets, ks.wallets[0]) ks.wallets = ks.wallets[1:] continue } } // Drop any leftover wallets and set the new batch for _, wallet := range ks.wallets { events = append(events, accounts.WalletEvent{Wallet: wallet, Kind: accounts.WalletDropped}) } ks.wallets = wallets ks.mu.Unlock() // Fire all wallet events and return for _, event := range events { ks.updateFeed.Send(event) } } // Subscribe implements accounts.Backend, creating an async subscription to // receive notifications on the addition or removal of keystore wallets. func (ks *KeyStore) Subscribe(sink chan<- accounts.WalletEvent) event.Subscription { // We need the mutex to reliably start/stop the update loop ks.mu.Lock() defer ks.mu.Unlock() // Subscribe the caller and track the subscriber count sub := ks.updateScope.Track(ks.updateFeed.Subscribe(sink)) // Subscribers require an active notification loop, start it if !ks.updating { ks.updating = true go ks.updater() } return sub } // updater is responsible for maintaining an up-to-date list of wallets stored in // the keystore, and for firing wallet addition/removal events. It listens for // account change events from the underlying account cache, and also periodically // forces a manual refresh (only triggers for systems where the filesystem notifier // is not running). func (ks *KeyStore) updater() { for { // Wait for an account update or a refresh timeout select { case <-ks.changes: case <-time.After(walletRefreshCycle): } // Run the wallet refresher ks.refreshWallets() // If all our subscribers left, stop the updater ks.mu.Lock() if ks.updateScope.Count() == 0 { ks.updating = false ks.mu.Unlock() return } ks.mu.Unlock() } } // HasAddress reports whether a key with the given address is present. func (ks *KeyStore) HasAddress(address address.PKAddress) bool { return ks.cache.hasAddress(address) } // Accounts returns all key files present in the directory. func (ks *KeyStore) Accounts() []accounts.Account { return ks.cache.accounts() } // Delete deletes the key matched by account if the passphrase is correct. // If the account contains no filename, the address must match a unique key. func (ks *KeyStore) Delete(a accounts.Account, passphrase string) error { // Decrypting the key isn't really necessary, but we do // it anyway to check the password and zero out the key // immediately afterwards. a, key, err := ks.getDecryptedKey(a, passphrase) if key != nil { zeroKey(key.PrivateKey) } if err != nil { return err } // The order is crucial here. The key is dropped from the // cache after the file is gone so that a reload happening in // between won't insert it into the cache again. err = os.Remove(a.URL.Path) if err == nil { ks.cache.delete(a) ks.refreshWallets() } return err } // Unlock unlocks the given account indefinitely. func (ks *KeyStore) Unlock(a accounts.Account, passphrase string) error { return ks.TimedUnlock(a, passphrase, 0) } // Lock removes the private key with the given address from memory. func (ks *KeyStore) Lock(address address.PKAddress) error { ks.mu.Lock() if unl, found := ks.unlocked[address]; found { ks.mu.Unlock() ks.expire(address, unl, time.Duration(0)*time.Nanosecond) } else { ks.mu.Unlock() } return nil } // TimedUnlock unlocks the given account with the passphrase. The account // stays unlocked for the duration of timeout. A timeout of 0 unlocks the account // until the program exits. The account must match a unique key file. // // If the account address is already unlocked for a duration, TimedUnlock extends or // shortens the active unlock timeout. If the address was previously unlocked // indefinitely the timeout is not altered. func (ks *KeyStore) TimedUnlock(a accounts.Account, passphrase string, timeout time.Duration) error { a, key, err := ks.getDecryptedKey(a, passphrase) if err != nil { return err } ks.mu.Lock() defer ks.mu.Unlock() u, found := ks.unlocked[a.Address] if found { if u.abort == nil { // The address was unlocked indefinitely, so unlocking // it with a timeout would be confusing. zeroKey(key.PrivateKey) return nil } // Terminate the expire goroutine and replace it below. close(u.abort) } if timeout > 0 { u = &unlocked{Key: key, abort: make(chan struct{})} go ks.expire(a.Address, u, timeout) } else { u = &unlocked{Key: key} } ks.unlocked[a.Address] = u return nil } // Find resolves the given account into a unique entry in the keystore. func (ks *KeyStore) Find(a accounts.Account) (accounts.Account, error) { ks.cache.maybeReload() ks.cache.mu.Lock() a, err := ks.cache.find(a) ks.cache.mu.Unlock() return a, err } func (ks *KeyStore) getDecryptedKey(a accounts.Account, auth string) (accounts.Account, *Key, error) { a, err := ks.Find(a) if err != nil { return a, nil, err } key, err := ks.storage.GetKey(a.Address, a.URL.Path, auth) return a, key, err } func (ks *KeyStore) expire(address address.PKAddress, u *unlocked, timeout time.Duration) { t := time.NewTimer(timeout) defer t.Stop() select { case <-u.abort: // just quit case <-t.C: ks.mu.Lock() // only drop if it's still the same key instance that dropLater // was launched with. we can check that using pointer equality // because the map stores a new pointer every time the key is // unlocked. if ks.unlocked[address] == u { zeroKey(u.PrivateKey) delete(ks.unlocked, address) } ks.mu.Unlock() } } // NewAccount generates a new key and stores it into the key directory, // encrypting it with the passphrase. func (ks *KeyStore) NewAccount(passphrase string, at uint64, version int) (accounts.Account, error) { _, account, err := storeNewKey(ks.storage, crand.Reader, passphrase, at, version) if err != nil { return accounts.Account{}, err } // Add the account to the cache immediately rather // than waiting for file system notifications to pick it up. ks.cache.add(account, false) ks.refreshWallets() return account, nil } func (ks *KeyStore) NewAccountWithMnemonic(passphrase string, at uint64, version int) (string, accounts.Account, error) { mnemonic, _, account, err := storeNewKeyWithMnemonic(ks.storage, passphrase, at, version) if err != nil { return "", accounts.Account{}, err } // Add the account to the cache immediately rather // than waiting for file system notifications to pick it up. ks.cache.add(account, false) ks.refreshWallets() return mnemonic, account, nil } // Export exports as a JSON key, encrypted with newPassphrase. func (ks *KeyStore) Export(a accounts.Account, passphrase, newPassphrase string) (keyJSON []byte, err error) { _, key, err := ks.getDecryptedKey(a, passphrase) if err != nil { return nil, err } var N, P int if store, ok := ks.storage.(*keyStorePassphrase); ok { N, P = store.scryptN, store.scryptP } else { N, P = StandardScryptN, StandardScryptP } return EncryptKey(key, newPassphrase, N, P) } func (ks *KeyStore) ExportMnemonic(a accounts.Account, passphrase string) (string, error) { _, key, err := ks.getDecryptedKey(a, passphrase) if err != nil { return "", err } privkey := crypto.FromECDSA(key.PrivateKey) mnemonic, err := bip39.NewMnemonic(privkey) if err != nil { return "", err } if key.Version == 2 { mnemonic = "v2 " + mnemonic } return mnemonic, nil } func (ks *KeyStore) ExportRewKey(a accounts.Account, passphrase string) ([]byte, error) { _, key, err := ks.getDecryptedKey(a, passphrase) if err != nil { return nil, err } seed := crypto.FromECDSA(key.PrivateKey) return seed, nil } // Import stores the given encrypted JSON key into the key directory. func (ks *KeyStore) Import(keyJSON []byte, passphrase, newPassphrase string) (accounts.Account, error) { key, err := DecryptKey(keyJSON, passphrase) if key != nil && key.PrivateKey != nil { defer zeroKey(key.PrivateKey) } if err != nil { return accounts.Account{}, err } return ks.importKey(key, newPassphrase) } // ImportECDSA stores the given key into the key directory, encrypting it with the passphrase. func (ks *KeyStore) ImportECDSA(priv *ecdsa.PrivateKey, passphrase string, at uint64, version int) (accounts.Account, error) { key := newKeyFromECDSA(priv, at, version) if ks.cache.hasAddress(key.Address) { return accounts.Account{}, fmt.Errorf("account already exists") } return ks.importKey(key, passphrase) } func (ks *KeyStore) ImportTk(tk c_type.Tk, at uint64) (accounts.Account, error) { key := newKeyFromTk(&tk, at) if ks.cache.hasAddress(key.Address) { return accounts.Account{}, fmt.Errorf("account already exists") } a := accounts.Account{Address: key.Address, Tk: key.Tk, URL: accounts.URL{Scheme: KeyStoreScheme, Path: ks.storage.JoinPath(keyFileName(key.Address))}, At: key.At, Version: key.Version} if err := ks.storage.StoreKey(a.URL.Path, key, ""); err != nil { return accounts.Account{}, err } ks.cache.add(a, true) ks.refreshWallets() return a, nil } func (ks *KeyStore) importKey(key *Key, passphrase string) (accounts.Account, error) { a := accounts.Account{Address: key.Address, Tk: key.Tk, URL: accounts.URL{Scheme: KeyStoreScheme, Path: ks.storage.JoinPath(keyFileName(key.Address))}, At: key.At, Version: key.Version} if err := ks.storage.StoreKey(a.URL.Path, key, passphrase); err != nil { return accounts.Account{}, err } ks.cache.add(a, true) ks.refreshWallets() return a, nil } // Update changes the passphrase of an existing account. func (ks *KeyStore) Update(a accounts.Account, passphrase, newPassphrase string) error { a, key, err := ks.getDecryptedKey(a, passphrase) if err != nil { return err } return ks.storage.StoreKey(a.URL.Path, key, newPassphrase) } // zeroKey zeroes a private key in memory. func zeroKey(k *ecdsa.PrivateKey) { b := k.D.Bits() for i := range b { b[i] = 0 } } func (ks *KeyStore) GetSeed(a accounts.Account) (*address.Seed, error) { // Look up the key to sign with and abort if it cannot be found ks.mu.RLock() defer ks.mu.RUnlock() unlockedKey, found := ks.unlocked[a.Address] if !found { return nil, ErrLocked } priKey := crypto.FromECDSA(unlockedKey.PrivateKey) seed := address.Seed{} copy(seed[:], priKey) return &seed, nil } func (ks *KeyStore) GetSeedWithPassphrase(account accounts.Account, passphrase string) (*address.Seed, error) { _, key, err := ks.getDecryptedKey(account, passphrase) if err != nil { return nil, err } defer zeroKey(key.PrivateKey) priKey := crypto.FromECDSA(key.PrivateKey) seed := address.Seed{} copy(seed[:], priKey) return &seed, nil } ================================================ FILE: accounts/keystore/keystore_passphrase.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . /* This key store behaves as KeyStorePlain with the difference that the private key is encrypted and on disk uses another JSON encoding. The crypto is documented at https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition */ package keystore import ( "bytes" "crypto/aes" "crypto/rand" "crypto/sha256" "encoding/hex" "encoding/json" "fmt" "io" "io/ioutil" "path/filepath" "github.com/sero-cash/go-sero/common/address" "github.com/sero-cash/go-sero/accounts" "github.com/btcsuite/btcutil/base58" "github.com/pborman/uuid" "github.com/sero-cash/go-sero/common/math" "github.com/sero-cash/go-sero/crypto" "golang.org/x/crypto/pbkdf2" "golang.org/x/crypto/scrypt" ) const ( keyHeaderKDF = "scrypt" // StandardScryptN is the N parameter of Scrypt encryption algorithm, using 256MB // memory and taking approximately 1s CPU time on a modern processor. StandardScryptN = 1 << 18 // StandardScryptP is the P parameter of Scrypt encryption algorithm, using 256MB // memory and taking approximately 1s CPU time on a modern processor. StandardScryptP = 1 // LightScryptN is the N parameter of Scrypt encryption algorithm, using 4MB // memory and taking approximately 100ms CPU time on a modern processor. LightScryptN = 1 << 12 // LightScryptP is the P parameter of Scrypt encryption algorithm, using 4MB // memory and taking approximately 100ms CPU time on a modern processor. LightScryptP = 6 scryptR = 8 scryptDKLen = 32 veryLightScryptN = 2 veryLightScryptP = 1 ) type keyStorePassphrase struct { keysDirPath string scryptN int scryptP int } func (ks keyStorePassphrase) GetKey(address address.PKAddress, filename, auth string) (*Key, error) { // Load the key from the keystore and decrypt its contents keyjson, err := ioutil.ReadFile(filename) if err != nil { return nil, err } key, err := DecryptKey(keyjson, auth) if err != nil { return nil, err } // Make sure we're really operating on the requested key (no swap attacks) if key.Address != address { return nil, fmt.Errorf("key content mismatch: have account %s, want %s", key.Address.String(), address.String()) } return key, nil } // StoreKey generates a key, encrypts with 'auth' and stores in the given directory func StoreKey(dir, auth string, scryptN, scryptP int, at uint64) (accounts.Account, error) { _, a, err := storeNewKey(&keyStorePassphrase{dir, scryptN, scryptP}, rand.Reader, auth, at, version) return a, err } func (ks keyStorePassphrase) StoreKey(filename string, key *Key, auth string) error { keyjson, err := EncryptKey(key, auth, ks.scryptN, ks.scryptP) if err != nil { return err } return writeKeyFile(filename, keyjson) } func (ks keyStorePassphrase) JoinPath(filename string) string { if filepath.IsAbs(filename) { return filename } return filepath.Join(ks.keysDirPath, filename) } // EncryptKey encrypts a key using the specified scrypt parameters into a json // blob that can be decrypted later on. func EncryptKey(key *Key, auth string, scryptN, scryptP int) ([]byte, error) { var cryptoStruct cryptoJSON if key.PrivateKey != nil { authArray := []byte(auth) salt := make([]byte, 32) if _, err := io.ReadFull(rand.Reader, salt); err != nil { panic("reading from crypto/rand failed: " + err.Error()) } derivedKey, err := scrypt.Key(authArray, salt, scryptN, scryptR, scryptP, scryptDKLen) if err != nil { return nil, err } encryptKey := derivedKey[:16] keyBytes := math.PaddedBigBytes(key.PrivateKey.D, 32) iv := make([]byte, aes.BlockSize) // 16 if _, err := io.ReadFull(rand.Reader, iv); err != nil { panic("reading from crypto/rand failed: " + err.Error()) } cipherText, err := aesCTRXOR(encryptKey, keyBytes, iv) if err != nil { return nil, err } mac := crypto.Keccak256(derivedKey[16:32], cipherText) scryptParamsJSON := make(map[string]interface{}, 5) scryptParamsJSON["n"] = scryptN scryptParamsJSON["r"] = scryptR scryptParamsJSON["p"] = scryptP scryptParamsJSON["dklen"] = scryptDKLen scryptParamsJSON["salt"] = hex.EncodeToString(salt) cipherParamsJSON := cipherparamsJSON{ IV: hex.EncodeToString(iv), } cryptoStruct = cryptoJSON{ Cipher: "aes-128-ctr", CipherText: hex.EncodeToString(cipherText), CipherParams: cipherParamsJSON, KDF: keyHeaderKDF, KDFParams: scryptParamsJSON, MAC: hex.EncodeToString(mac), } } encryptedKeyJSONV1 := encryptedKeyJSONV1{ Address: base58.Encode(key.Address[:]), Tk: base58.Encode(key.Tk[:]), Crypto: cryptoStruct, Id: key.Id.String(), Version: key.Version, At: key.At, } return json.Marshal(encryptedKeyJSONV1) } func GetAddress(keyjson []byte) (string, error) { // Parse the json into a simple map to fetch the key version m := make(map[string]interface{}) if err := json.Unmarshal(keyjson, &m); err != nil { return "", err } k := new(encryptedKeyJSONV1) if err := json.Unmarshal(keyjson, k); err != nil { return "", err } else { return k.Address, nil } } // DecryptKey decrypts a key from a json blob, returning the private key itself. func DecryptKey(keyjson []byte, auth string) (*Key, error) { // Parse the json into a simple map to fetch the key version m := make(map[string]interface{}) if err := json.Unmarshal(keyjson, &m); err != nil { return nil, err } // Depending on the version try to parse one way or another var ( keyBytes, keyId []byte err error ) k := new(encryptedKeyJSONV1) if err := json.Unmarshal(keyjson, k); err != nil { return nil, err } keyBytes, keyId, err = decryptKeyV3(k, auth) // Handle any decryption errors and return the key if err != nil { return nil, err } key := crypto.ToECDSAUnsafe(keyBytes) tk := crypto.PrivkeyToTk(key, k.Version) return &Key{ Id: uuid.UUID(keyId), Address: tk.ToPk(), Tk: tk, PrivateKey: key, At: k.At, Version: k.Version, }, nil } func decryptKeyV3(keyProtected *encryptedKeyJSONV1, auth string) (keyBytes []byte, keyId []byte, err error) { if keyProtected.Crypto.CipherText == "" { return nil, nil, fmt.Errorf("has no privatekey for tk:%v", keyProtected.Tk) } if keyProtected.Version > version { return nil, nil, fmt.Errorf("Version not supported: %v", keyProtected.Version) } if keyProtected.Crypto.Cipher != "aes-128-ctr" { return nil, nil, fmt.Errorf("Cipher not supported: %v", keyProtected.Crypto.Cipher) } keyId = uuid.Parse(keyProtected.Id) mac, err := hex.DecodeString(keyProtected.Crypto.MAC) if err != nil { return nil, nil, err } iv, err := hex.DecodeString(keyProtected.Crypto.CipherParams.IV) if err != nil { return nil, nil, err } cipherText, err := hex.DecodeString(keyProtected.Crypto.CipherText) if err != nil { return nil, nil, err } derivedKey, err := getKDFKey(keyProtected.Crypto, auth) if err != nil { return nil, nil, err } calculatedMAC := crypto.Keccak256(derivedKey[16:32], cipherText) if !bytes.Equal(calculatedMAC, mac) { return nil, nil, ErrDecrypt } plainText, err := aesCTRXOR(derivedKey[:16], cipherText, iv) if err != nil { return nil, nil, err } return plainText, keyId, err } func getKDFKey(cryptoJSON cryptoJSON, auth string) ([]byte, error) { authArray := []byte(auth) salt, err := hex.DecodeString(cryptoJSON.KDFParams["salt"].(string)) if err != nil { return nil, err } dkLen := ensureInt(cryptoJSON.KDFParams["dklen"]) if cryptoJSON.KDF == keyHeaderKDF { n := ensureInt(cryptoJSON.KDFParams["n"]) r := ensureInt(cryptoJSON.KDFParams["r"]) p := ensureInt(cryptoJSON.KDFParams["p"]) return scrypt.Key(authArray, salt, n, r, p, dkLen) } else if cryptoJSON.KDF == "pbkdf2" { c := ensureInt(cryptoJSON.KDFParams["c"]) prf := cryptoJSON.KDFParams["prf"].(string) if prf != "hmac-sha256" { return nil, fmt.Errorf("Unsupported PBKDF2 PRF: %s", prf) } key := pbkdf2.Key(authArray, salt, c, dkLen, sha256.New) return key, nil } return nil, fmt.Errorf("Unsupported KDF: %s", cryptoJSON.KDF) } // TODO: can we do without this when unmarshalling dynamic JSON? // why do integers in KDF params end up as float64 and not int after // unmarshal? func ensureInt(x interface{}) int { res, ok := x.(int) if !ok { res = int(x.(float64)) } return res } ================================================ FILE: accounts/keystore/keystore_passphrase_test.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package keystore import ( "io/ioutil" "testing" "github.com/sero-cash/go-sero/common/address" ) // Tests that a json key file can be decrypted and encrypted in multiple rounds. func TestKeyEncryptDecrypt(t *testing.T) { keyjson, err := ioutil.ReadFile("testdata/very-light-scrypt.json") if err != nil { t.Fatal(err) } password := "" address := address.StringToPk("4oGNhAf3JRE1an7TPvKcxpfqHMY7rW6y1fupGcsn8krhWeUEAThkY4QsjHZqqacjMAENDE15tsXmdfsJvdeFVJDA") // Do a few rounds of decryption and encryption for i := 0; i < 3; i++ { // Try a bad password first if _, err := DecryptKey(keyjson, password+"bad"); err == nil { t.Errorf("test %d: json key decrypted with bad password", i) } // Decrypt with the correct password key, err := DecryptKey(keyjson, password) if err != nil { t.Fatalf("test %d: json key failed to decrypt: %v", i, err) } if key.Address != address { t.Errorf("test %d: key address mismatch: have %x, want %x", i, key.Address, address) } // Recrypt with a new password and start over password += "new data appended" if keyjson, err = EncryptKey(key, password, veryLightScryptN, veryLightScryptP); err != nil { t.Errorf("test %d: failed to recrypt key %v", i, err) } } } ================================================ FILE: accounts/keystore/keystore_test.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package keystore import ( "io/ioutil" "math/rand" "os" "runtime" "sort" "strings" "testing" "time" "github.com/sero-cash/go-sero/common/address" "github.com/sero-cash/go-sero/accounts" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/event" ) func TestKeyStore(t *testing.T) { dir, ks := tmpKeyStore(t) defer os.RemoveAll(dir) a, err := ks.NewAccount("foo", 0, 2) if err != nil { t.Fatal(err) } if !strings.HasPrefix(a.URL.Path, dir) { t.Errorf("account file %s doesn't have dir prefix", a.URL) } stat, err := os.Stat(a.URL.Path) if err != nil { t.Fatalf("account file %s doesn't exist (%v)", a.URL, err) } if runtime.GOOS != "windows" && stat.Mode() != 0600 { t.Fatalf("account file has wrong mode: got %o, want %o", stat.Mode(), 0600) } if !ks.HasAddress(a.Address) { t.Errorf("HasAccount(%x) should've returned true", a.Address) } if err := ks.Update(a, "foo", "bar"); err != nil { t.Errorf("Update error: %v", err) } if err := ks.Delete(a, "bar"); err != nil { t.Errorf("Delete error: %v", err) } if common.FileExist(a.URL.Path) { t.Errorf("account file %s should be gone after Delete", a.URL) } if ks.HasAddress(a.Address) { t.Errorf("HasAccount(%x) should've returned true after Delete", a.Address) } } func TestTimedUnlock(t *testing.T) { dir, ks := tmpKeyStore(t) defer os.RemoveAll(dir) pass := "foo" a1, err := ks.NewAccount(pass, 0, 2) if err != nil { t.Fatal(err) } // Signing without passphrase fails because account is locked _, err = ks.GetSeed(a1) if err != ErrLocked { t.Fatal("Signing should've failed with ErrLocked before unlocking, got ", err) } // Signing with passphrase works if err = ks.TimedUnlock(a1, pass, 100*time.Millisecond); err != nil { t.Fatal(err) } // Signing without passphrase works because account is temp unlocked _, err = ks.GetSeed(a1) if err != nil { t.Fatal("Signing shouldn't return an error after unlocking, got ", err) } // Signing fails again after automatic locking time.Sleep(250 * time.Millisecond) _, err = ks.GetSeed(a1) if err != ErrLocked { t.Fatal("Signing should've failed with ErrLocked timeout expired, got ", err) } } func TestOverrideUnlock(t *testing.T) { dir, ks := tmpKeyStore(t) defer os.RemoveAll(dir) pass := "foo" a1, err := ks.NewAccount(pass, 0, 2) if err != nil { t.Fatal(err) } // Unlock indefinitely. if err = ks.TimedUnlock(a1, pass, 5*time.Minute); err != nil { t.Fatal(err) } // Signing without passphrase works because account is temp unlocked _, err = ks.GetSeed(a1) if err != nil { t.Fatal("Signing shouldn't return an error after unlocking, got ", err) } // reset unlock to a shorter period, invalidates the previous unlock if err = ks.TimedUnlock(a1, pass, 100*time.Millisecond); err != nil { t.Fatal(err) } // Signing without passphrase still works because account is temp unlocked _, err = ks.GetSeed(a1) if err != nil { t.Fatal("Signing shouldn't return an error after unlocking, got ", err) } // Signing fails again after automatic locking time.Sleep(250 * time.Millisecond) _, err = ks.GetSeed(a1) if err != ErrLocked { t.Fatal("Signing should've failed with ErrLocked timeout expired, got ", err) } } // Tests that the wallet notifier loop starts and stops correctly based on the // addition and removal of wallet event subscriptions. func TestWalletNotifierLifecycle(t *testing.T) { // Create a temporary kesytore to test with dir, ks := tmpKeyStore(t) defer os.RemoveAll(dir) // Ensure that the notification updater is not running yet time.Sleep(250 * time.Millisecond) ks.mu.RLock() updating := ks.updating ks.mu.RUnlock() if updating { t.Errorf("wallet notifier running without subscribers") } // Subscribe to the wallet feed and ensure the updater boots up updates := make(chan accounts.WalletEvent) subs := make([]event.Subscription, 2) for i := 0; i < len(subs); i++ { // Create a new subscription subs[i] = ks.Subscribe(updates) // Ensure the notifier comes online time.Sleep(250 * time.Millisecond) ks.mu.RLock() updating = ks.updating ks.mu.RUnlock() if !updating { t.Errorf("sub %d: wallet notifier not running after subscription", i) } } // Unsubscribe and ensure the updater terminates eventually for i := 0; i < len(subs); i++ { // Close an existing subscription subs[i].Unsubscribe() // Ensure the notifier shuts down at and only at the last close for k := 0; k < int(walletRefreshCycle/(250*time.Millisecond))+2; k++ { ks.mu.RLock() updating = ks.updating ks.mu.RUnlock() if i < len(subs)-1 && !updating { t.Fatalf("sub %d: event notifier stopped prematurely", i) } if i == len(subs)-1 && !updating { return } time.Sleep(250 * time.Millisecond) } } t.Errorf("wallet notifier didn't terminate after unsubscribe") } type walletEvent struct { accounts.WalletEvent a accounts.Account } // Tests that wallet notifications and correctly fired when accounts are added // or deleted from the keystore. func TestWalletNotifications(t *testing.T) { dir, ks := tmpKeyStore(t) defer os.RemoveAll(dir) // Subscribe to the wallet feed and collect events. var ( events []walletEvent updates = make(chan accounts.WalletEvent) sub = ks.Subscribe(updates) ) defer sub.Unsubscribe() go func() { for { select { case ev := <-updates: events = append(events, walletEvent{ev, ev.Wallet.Accounts()[0]}) case <-sub.Err(): close(updates) return } } }() // Randomly add and remove accounts. var ( live = make(map[address.PKAddress]accounts.Account) wantEvents []walletEvent ) for i := 0; i < 1024; i++ { if create := len(live) == 0 || rand.Int()%4 > 0; create { // Add a new account and ensure wallet notifications arrives account, err := ks.NewAccount("", 0, 2) if err != nil { t.Fatalf("failed to create test account: %v", err) } live[account.Address] = account wantEvents = append(wantEvents, walletEvent{accounts.WalletEvent{Kind: accounts.WalletArrived}, account}) } else { // Delete a random account. var account accounts.Account for _, a := range live { account = a break } if err := ks.Delete(account, ""); err != nil { t.Fatalf("failed to delete test account: %v", err) } delete(live, account.Address) wantEvents = append(wantEvents, walletEvent{accounts.WalletEvent{Kind: accounts.WalletDropped}, account}) } } // Shut down the event collector and check events. sub.Unsubscribe() <-updates checkAccounts(t, live, ks.Wallets()) checkEvents(t, wantEvents, events) } // checkAccounts checks that all known live accounts are present in the wallet list. func checkAccounts(t *testing.T, live map[address.PKAddress]accounts.Account, wallets []accounts.Wallet) { if len(live) != len(wallets) { t.Errorf("wallet list doesn't match required accounts: have %d, want %d", len(wallets), len(live)) return } liveList := make([]accountByTag, 0, len(live)) for _, account := range live { liveList = append(liveList, accountByTag{account, false}) } sort.Sort(accountsByTag(liveList)) for j, wallet := range wallets { if accs := wallet.Accounts(); len(accs) != 1 { t.Errorf("wallet %d: contains invalid number of accounts: have %d, want 1", j, len(accs)) } else if accs[0] != liveList[j].accountByURL { t.Errorf("wallet %d: account mismatch: have %v, want %v", j, accs[0], liveList[j]) } } } // checkEvents checks that all events in 'want' are present in 'have'. Events may be present multiple times. func checkEvents(t *testing.T, want []walletEvent, have []walletEvent) { for _, wantEv := range want { nmatch := 0 for ; len(have) > 0; nmatch++ { if have[0].Kind != wantEv.Kind || have[0].a != wantEv.a { break } have = have[1:] } if nmatch == 0 { t.Fatalf("can't find event with Kind=%v for %x", wantEv.Kind, wantEv.a.Address) } } } func tmpKeyStore(t *testing.T) (string, *KeyStore) { d, err := ioutil.TempDir("", "sero-keystore-test") if err != nil { t.Fatal(err) } new := func(kd *string) *KeyStore { return NewKeyStore(*kd, veryLightScryptN, veryLightScryptP) } return d, new(&d) } ================================================ FILE: accounts/keystore/keystore_wallet.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package keystore import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-czero-import/superzk" "github.com/sero-cash/go-sero/common/address" "github.com/sero-cash/go-sero" "github.com/sero-cash/go-sero/accounts" "github.com/sero-cash/go-sero/core/state" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/zero/txs/tx" ) // keystoreWallet implements the accounts.Wallet interface for the original // keystore. type keystoreWallet struct { account accounts.Account // Single account contained in this wallet keystore *KeyStore // Keystore where the account originates from } // URL implements accounts.Wallet, returning the URL of the account within. func (w *keystoreWallet) URL() accounts.URL { return w.account.URL } // Status implements accounts.Wallet, returning whether the account held by the // keystore wallet is unlocked or not. func (w *keystoreWallet) Status() (string, error) { w.keystore.mu.RLock() defer w.keystore.mu.RUnlock() if _, ok := w.keystore.unlocked[w.account.Address]; ok { return "Unlocked", nil } return "Locked", nil } // Open implements accounts.Wallet, but is a noop for plain wallets since there // is no connection or decryption step necessary to access the list of accounts. func (w *keystoreWallet) Open(passphrase string) error { return nil } // Close implements accounts.Wallet, but is a noop for plain wallets since is no // meaningful open operation. func (w *keystoreWallet) Close() error { return nil } // Accounts implements accounts.Wallet, returning an account list consisting of // a single account that the plain kestore wallet contains. func (w *keystoreWallet) Accounts() []accounts.Account { return []accounts.Account{w.account} } // Contains implements accounts.Wallet, returning whether a particular account is // or is not wrapped by this wallet instance. func (w *keystoreWallet) Contains(account accounts.Account) bool { return account.Address == w.account.Address && (account.URL == (accounts.URL{}) || account.URL == w.account.URL) } // Derive implements accounts.Wallet, but is a noop for plain wallets since there // is no notion of hierarchical account derivation for plain keystore accounts. func (w *keystoreWallet) Derive(path accounts.DerivationPath, pin bool) (accounts.Account, error) { return accounts.Account{}, accounts.ErrNotSupported } // SelfDerive implements accounts.Wallet, but is a noop for plain wallets since // there is no notion of hierarchical account derivation for plain keystore accounts. func (w *keystoreWallet) SelfDerive(base accounts.DerivationPath, chain sero.ChainStateReader) {} func (w *keystoreWallet) AddressUnlocked(account accounts.Account) (bool, error) { if account.Address != w.account.Address { return false, accounts.ErrUnknownAccount } if account.URL != (accounts.URL{}) && account.URL != w.account.URL { return false, accounts.ErrUnknownAccount } _, err := w.keystore.GetSeed(account) if err != nil { return false, err } return true, nil } func (w *keystoreWallet) EncryptTxWithSeed(seed address.Seed, btx *types.Transaction, txt *tx.T, state *state.StateDB) (tx *types.Transaction, e error) { return } func (w *keystoreWallet) GetSeed() (*address.Seed, error) { // Make sure the requested account is contained within seed, err := w.keystore.GetSeed(w.account) if err != nil { return nil, err } return seed, nil } func (w *keystoreWallet) GetSeedWithPassphrase(passphrase string) (*address.Seed, error) { // Make sure the requested account is contained within seed, err := w.keystore.GetSeedWithPassphrase(w.account, passphrase) if err != nil { return nil, err } return seed, nil } func (w *keystoreWallet) IsMine(pkr c_type.PKr) bool { tk := w.account.Tk.ToTk() succ := superzk.IsMyPKr(&tk, &pkr) return succ } ================================================ FILE: accounts/keystore/presale.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package keystore import ( "crypto/aes" "crypto/cipher" ) func aesCTRXOR(key, inText, iv []byte) ([]byte, error) { // AES-128 is selected due to size of encryptKey. aesBlock, err := aes.NewCipher(key) if err != nil { return nil, err } stream := cipher.NewCTR(aesBlock, iv) outText := make([]byte, len(inText)) stream.XORKeyStream(outText, inText) return outText, err } ================================================ FILE: accounts/keystore/testdata/dupes/1 ================================================ {"address":"f466859ead1932d743d622cb74fc058882e8648a","crypto":{"cipher":"aes-128-ctr","ciphertext":"cb664472deacb41a2e995fa7f96fe29ce744471deb8d146a0e43c7898c9ddd4d","cipherparams":{"iv":"dfd9ee70812add5f4b8f89d0811c9158"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":8,"p":16,"r":8,"salt":"0d6769bf016d45c479213990d6a08d938469c4adad8a02ce507b4a4e7b7739f1"},"mac":"bac9af994b15a45dd39669fc66f9aa8a3b9dd8c22cb16e4d8d7ea089d0f1a1a9"},"id":"472e8b3d-afb6-45b5-8111-72c89895099a","version":3} ================================================ FILE: accounts/keystore/testdata/dupes/2 ================================================ {"address":"f466859ead1932d743d622cb74fc058882e8648a","crypto":{"cipher":"aes-128-ctr","ciphertext":"cb664472deacb41a2e995fa7f96fe29ce744471deb8d146a0e43c7898c9ddd4d","cipherparams":{"iv":"dfd9ee70812add5f4b8f89d0811c9158"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":8,"p":16,"r":8,"salt":"0d6769bf016d45c479213990d6a08d938469c4adad8a02ce507b4a4e7b7739f1"},"mac":"bac9af994b15a45dd39669fc66f9aa8a3b9dd8c22cb16e4d8d7ea089d0f1a1a9"},"id":"472e8b3d-afb6-45b5-8111-72c89895099a","version":3} ================================================ FILE: accounts/keystore/testdata/dupes/foo ================================================ {"address":"7ef5a6135f1fd6a02593eedc869c6d41d934aef8","crypto":{"cipher":"aes-128-ctr","ciphertext":"1d0839166e7a15b9c1333fc865d69858b22df26815ccf601b28219b6192974e1","cipherparams":{"iv":"8df6caa7ff1b00c4e871f002cb7921ed"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":8,"p":16,"r":8,"salt":"e5e6ef3f4ea695f496b643ebd3f75c0aa58ef4070e90c80c5d3fb0241bf1595c"},"mac":"6d16dfde774845e4585357f24bce530528bc69f4f84e1e22880d34fa45c273e5"},"id":"950077c7-71e3-4c44-a4a1-143919141ed4","version":3} ================================================ FILE: accounts/keystore/testdata/keystore/.hiddenfile ================================================ {"address":"f466859ead1932d743d622cb74fc058882e8648a","crypto":{"cipher":"aes-128-ctr","ciphertext":"cb664472deacb41a2e995fa7f96fe29ce744471deb8d146a0e43c7898c9ddd4d","cipherparams":{"iv":"dfd9ee70812add5f4b8f89d0811c9158"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":8,"p":16,"r":8,"salt":"0d6769bf016d45c479213990d6a08d938469c4adad8a02ce507b4a4e7b7739f1"},"mac":"bac9af994b15a45dd39669fc66f9aa8a3b9dd8c22cb16e4d8d7ea089d0f1a1a9"},"id":"472e8b3d-afb6-45b5-8111-72c89895099a","version":3} ================================================ FILE: accounts/keystore/testdata/keystore/README ================================================ This directory contains accounts for testing. The passphrase that unlocks them is "foobar". The "good" key files which are supposed to be loadable are: - File: UTC--2016-03-22T12-57-55.920751759Z--7ef5a6135f1fd6a02593eedc869c6d41d934aef8 Address: 0x7ef5a6135f1fd6a02593eedc869c6d41d934aef8 - File: aaa Address: 0xf466859ead1932d743d622cb74fc058882e8648a - File: zzz Address: 0x289d485d9771714cce91d3393d764e1311907acc The other files (including this README) are broken in various ways and should not be picked up by package accounts: - File: no-address (missing address field, otherwise same as "aaa") - File: garbage (file with random data) - File: empty (file with no content) - File: swapfile~ (should be skipped) - File: .hiddenfile (should be skipped) - File: foo/... (should be skipped because it is a directory) ================================================ FILE: accounts/keystore/testdata/keystore/UTC--2018-08-11T10-19-38.165083119Z--64t1MPxFp4yzxNJ64zp1NmrTXWsrLuw9DMiMZeujbD2HVAKhjR3zpKnuFVjjAXAp86G2PzSVSsdiMdwp5JPoqxtP ================================================ {"address":"64t1MPxFp4yzxNJ64zp1NmrTXWsrLuw9DMiMZeujbD2HVAKhjR3zpKnuFVjjAXAp86G2PzSVSsdiMdwp5JPoqxtP","tk":"48rGJTGEeQKiFcCi82rbZdvZeyhoJHnVqeDrV627nT4vKTUtYUKJGYmt4dMnRX94RDAtXJV4SEXKyFPH9TdhFxiB","crypto":{"cipher":"aes-128-ctr","ciphertext":"2a185b3f860b4bf82abc806cda6133b86d163ffebc172f337ef1f542d0343672","cipherparams":{"iv":"08ad25c1b4967d4a43026f127dc5b1f8"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"72978babaf8232e480afda30cff820f2da5c4325ed8ab26788a5921654c198a9"},"mac":"6855124234e99ff66f887b44a43971fdfe9c012aacf44775fd1924aa0b2ac812"},"id":"73e99dc3-3d60-4e9c-8007-39ed766ab603","version":1} ================================================ FILE: accounts/keystore/testdata/keystore/aaa ================================================ {"address":"4raP8fYEznZDD9WXc8pvS2tMg992iZiWXssvwhCrXTFEhafcRt8urTeDyANfTrtXpJjnfz65cbYvr7g5WauAJgdc","tk":"5W5KsFo2di2kzrP2xEjT1iYpx66BoryPJccDRXz4BH5J2MWxKnnWZtmKm7a7BqjheBfi8rKJCqKFPME7hDLuiEJA","crypto":{"cipher":"aes-128-ctr","ciphertext":"18afc118d33d3daf74c895cb64b60401f92acc4d96e2a0354be41a8a949e8ea1","cipherparams":{"iv":"93ca0ead2de0c06481a2c572c5b00cb9"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"f6b9957dc46d44bc6cbb7ed8479d8d8ac2f825e52c3da6926f03b0d4dc2c59de"},"mac":"858e3abfcfa15418e9175f66b4423cab0df38976367816fafc1c1c5b7b06ba7e"},"id":"c64aaefb-6ad3-4037-8e12-fc74a0abc6ef","version":1} ================================================ FILE: accounts/keystore/testdata/keystore/empty ================================================ ================================================ FILE: accounts/keystore/testdata/keystore/foo/fd9bd350f08ee3c0c19b85a8e16114a11a60aa4e ================================================ {"address":"fd9bd350f08ee3c0c19b85a8e16114a11a60aa4e","crypto":{"cipher":"aes-128-ctr","ciphertext":"8124d5134aa4a927c79fd852989e4b5419397566f04b0936a1eb1d168c7c68a5","cipherparams":{"iv":"e2febe17176414dd2cda28287947eb2f"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":4096,"p":6,"r":8,"salt":"44b415ede89f3bdd6830390a21b78965f571b347a589d1d943029f016c5e8bd5"},"mac":"5e149ff25bfd9dd45746a84bb2bcd2f015f2cbca2b6d25c5de8c29617f71fe5b"},"id":"d6ac5452-2b2c-4d3c-ad80-4bf0327d971c","version":3} ================================================ FILE: accounts/keystore/testdata/keystore/no-address ================================================ {"crypto":{"cipher":"aes-128-ctr","ciphertext":"cb664472deacb41a2e995fa7f96fe29ce744471deb8d146a0e43c7898c9ddd4d","cipherparams":{"iv":"dfd9ee70812add5f4b8f89d0811c9158"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":8,"p":16,"r":8,"salt":"0d6769bf016d45c479213990d6a08d938469c4adad8a02ce507b4a4e7b7739f1"},"mac":"bac9af994b15a45dd39669fc66f9aa8a3b9dd8c22cb16e4d8d7ea089d0f1a1a9"},"id":"472e8b3d-afb6-45b5-8111-72c89895099a","version":3} ================================================ FILE: accounts/keystore/testdata/keystore/zero ================================================ {"address":"1111111111111111111111111111111111111111111111111111111111111111","tk":"5Q8MbCF5x21sF5RWx83iDdds8gqFgxq8t34EuDBUjS74nMEv3cjZn8Y5bWQmfJ9rfZZT8ZAd9DC6p4GhNk52EbLD","crypto":{"cipher":"aes-128-ctr","ciphertext":"aaa3d43ceab1ad4667c50b3d43f8ebd99a7a8921ea8112545632a9aaf2dc189f","cipherparams":{"iv":"f8b66bde26843b0c7b2ca5222fcf4dc7"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"305bbadc4e8fdc16f1ecf973ce7149ea40fb2489279246f78b5ee7ef83e1204a"},"mac":"7a7e424eddb5ab4746d4b3a692fe240acac45e73f24432b08ae77dfa166bb3f0"},"id":"ec96b9f3-c21c-4f6c-b5aa-8497a0f96b11","version":1} ================================================ FILE: accounts/keystore/testdata/keystore/zzz ================================================ {"address":"3Fov1AdSTVSTEWTEGfbknRrmHxBCoZ6AktyJA4jGFytHu7xDWEYysnR9YkwkKj5Knzttc6tNw4ENY4JZiirrksYw","tk":"fLFiBSN8JojjcECipDA4yNafv19BvcFEoP91BVsxRsd1qda9QkBXJM3Car9Y6V9VfYpZULx8dcPUnb2iNFnk4JX","crypto":{"cipher":"aes-128-ctr","ciphertext":"6ce4ef73d9769bdd7b146e4a2f20b947e87b832ba97d7621fe1ed1a9ef86b70b","cipherparams":{"iv":"6a83217a79f5107d939499fc0236f995"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"13ba23c5d11ffcd82efc8b948b3dc617fc8a222624d1a99d92977d17998aee4d"},"mac":"48d94e4f7cad61b0cca2f87170f47c8cb0469a1011b4234bd8ee45737778355e"},"id":"ce86a2a4-294d-4275-a9de-7b1a2f04e2cd","version":1} ================================================ FILE: accounts/keystore/testdata/v1/cb61d5a9c4896fb9658090b597ef0e7be6f7b67e/cb61d5a9c4896fb9658090b597ef0e7be6f7b67e ================================================ {"address":"cb61d5a9c4896fb9658090b597ef0e7be6f7b67e","Crypto":{"cipher":"aes-128-cbc","ciphertext":"6143d3192db8b66eabd693d9c4e414dcfaee52abda451af79ccf474dafb35f1bfc7ea013aa9d2ee35969a1a2e8d752d0","cipherparams":{"iv":"35337770fc2117994ecdcad026bccff4"},"kdf":"scrypt","kdfparams":{"n":262144,"r":8,"p":1,"dklen":32,"salt":"9afcddebca541253a2f4053391c673ff9fe23097cd8555d149d929e4ccf1257f"},"mac":"3f3d5af884b17a100b0b3232c0636c230a54dc2ac8d986227219b0dd89197644","version":"1"},"id":"e25f7c1f-d318-4f29-b62c-687190d4d299","version":"1"} ================================================ FILE: accounts/keystore/testdata/v1_test_vector.json ================================================ { "test1": { "json": { "Crypto": { "cipher": "aes-128-cbc", "cipherparams": { "iv": "35337770fc2117994ecdcad026bccff4" }, "ciphertext": "6143d3192db8b66eabd693d9c4e414dcfaee52abda451af79ccf474dafb35f1bfc7ea013aa9d2ee35969a1a2e8d752d0", "kdf": "scrypt", "kdfparams": { "dklen": 32, "n": 262144, "p": 1, "r": 8, "salt": "9afcddebca541253a2f4053391c673ff9fe23097cd8555d149d929e4ccf1257f" }, "mac": "3f3d5af884b17a100b0b3232c0636c230a54dc2ac8d986227219b0dd89197644", "version": "1" }, "address": "cb61d5a9c4896fb9658090b597ef0e7be6f7b67e", "id": "e25f7c1f-d318-4f29-b62c-687190d4d299", "version": "1" }, "password": "g", "priv": "d1b1178d3529626a1a93e073f65028370d14c7eb0936eb42abef05db6f37ad7d" } } ================================================ FILE: accounts/keystore/testdata/v3_test_vector.json ================================================ { "wikipage_test_vector_scrypt": { "json": { "crypto" : { "cipher" : "aes-128-ctr", "cipherparams" : { "iv" : "83dbcc02d8ccb40e466191a123791e0e" }, "ciphertext" : "d172bf743a674da9cdad04534d56926ef8358534d458fffccd4e6ad2fbde479c", "kdf" : "scrypt", "kdfparams" : { "dklen" : 32, "n" : 262144, "r" : 1, "p" : 8, "salt" : "ab0c7876052600dd703518d6fc3fe8984592145b591fc8fb5c6d43190334ba19" }, "mac" : "2103ac29920d71da29f15d75b4a16dbe95cfd7ff8faea1056c33131d846e3097" }, "id" : "3198bc9c-6672-5ab3-d995-4942343ae5b6", "version" : 3 }, "password": "testpassword", "priv": "7a28b5ba57c53603b0b07b56bba752f7784bf506fa95edc395f5cf6c7514fe9d" }, "wikipage_test_vector_pbkdf2": { "json": { "crypto" : { "cipher" : "aes-128-ctr", "cipherparams" : { "iv" : "6087dab2f9fdbbfaddc31a909735c1e6" }, "ciphertext" : "5318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46", "kdf" : "pbkdf2", "kdfparams" : { "c" : 262144, "dklen" : 32, "prf" : "hmac-sha256", "salt" : "ae3cd4e7013836a3df6bd7241b12db061dbe2c6785853cce422d148a624ce0bd" }, "mac" : "517ead924a9d0dc3124507e3393d175ce3ff7c1e96529c6c555ce9e51205e9b2" }, "id" : "3198bc9c-6672-5ab3-d995-4942343ae5b6", "version" : 3 }, "password": "testpassword", "priv": "7a28b5ba57c53603b0b07b56bba752f7784bf506fa95edc395f5cf6c7514fe9d" }, "31_byte_key": { "json": { "crypto" : { "cipher" : "aes-128-ctr", "cipherparams" : { "iv" : "e0c41130a323adc1446fc82f724bca2f" }, "ciphertext" : "9517cd5bdbe69076f9bf5057248c6c050141e970efa36ce53692d5d59a3984", "kdf" : "scrypt", "kdfparams" : { "dklen" : 32, "n" : 2, "r" : 8, "p" : 1, "salt" : "711f816911c92d649fb4c84b047915679933555030b3552c1212609b38208c63" }, "mac" : "d5e116151c6aa71470e67a7d42c9620c75c4d23229847dcc127794f0732b0db5" }, "id" : "fecfc4ce-e956-48fd-953b-30f8b52ed66c", "version" : 3 }, "password": "foo", "priv": "fa7b3db73dc7dfdf8c5fbdb796d741e4488628c41fc4febd9160a866ba0f35" }, "30_byte_key": { "json": { "crypto" : { "cipher" : "aes-128-ctr", "cipherparams" : { "iv" : "3ca92af36ad7c2cd92454c59cea5ef00" }, "ciphertext" : "108b7d34f3442fc26ab1ab90ca91476ba6bfa8c00975a49ef9051dc675aa", "kdf" : "scrypt", "kdfparams" : { "dklen" : 32, "n" : 2, "r" : 8, "p" : 1, "salt" : "d0769e608fb86cda848065642a9c6fa046845c928175662b8e356c77f914cd3b" }, "mac" : "75d0e6759f7b3cefa319c3be41680ab6beea7d8328653474bd06706d4cc67420" }, "id" : "a37e1559-5955-450d-8075-7b8931b392b2", "version" : 3 }, "password": "foo", "priv": "81c29e8142bb6a81bef5a92bda7a8328a5c85bb2f9542e76f9b0f94fc018" } } ================================================ FILE: accounts/keystore/testdata/very-light-scrypt.json ================================================ {"address":"4oGNhAf3JRE1an7TPvKcxpfqHMY7rW6y1fupGcsn8krhWeUEAThkY4QsjHZqqacjMAENDE15tsXmdfsJvdeFVJDA","tk":"2TibsX8aZMjCvLWSWttqNWw5c6pczpZT357EjHVnChgf7XyayKhSuvG6DjwKn7SGJ8vjcXsjWUuRPu4tUqbxi2wE","crypto":{"cipher":"aes-128-ctr","ciphertext":"677a530905eb7f83617f6041052abe59d65b7c4f43e98709257a66de604a3bf5","cipherparams":{"iv":"073c0535e818abae2db3edbb044ac96c"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"e2329fa7a364b5eabd87aae4173efb44fe5aa06cbc4f69f032e992cb38439b4b"},"mac":"2375d748ef71f178ae55e8aab711af918be8168d688195e9585843af14264a18"},"id":"b153f3f9-0763-472b-b9b9-b69d4ed94983","version":1} ================================================ FILE: accounts/keystore/watch.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // +build darwin,!ios freebsd linux,!arm64 netbsd solaris package keystore import ( "time" "github.com/rjeczalik/notify" "github.com/sero-cash/go-sero/log" ) type watcher struct { ac *accountCache starting bool running bool ev chan notify.EventInfo quit chan struct{} } func newWatcher(ac *accountCache) *watcher { return &watcher{ ac: ac, ev: make(chan notify.EventInfo, 10), quit: make(chan struct{}), } } // starts the watcher loop in the background. // Start a watcher in the background if that's not already in progress. // The caller must hold w.ac.mu. func (w *watcher) start() { if w.starting || w.running { return } w.starting = true go w.loop() } func (w *watcher) close() { close(w.quit) } func (w *watcher) loop() { defer func() { w.ac.mu.Lock() w.running = false w.starting = false w.ac.mu.Unlock() }() logger := log.New("path", w.ac.keydir) if err := notify.Watch(w.ac.keydir, w.ev, notify.All); err != nil { logger.Trace("Failed to watch keystore folder", "err", err) return } defer notify.Stop(w.ev) logger.Trace("Started watching keystore folder") defer logger.Trace("Stopped watching keystore folder") w.ac.mu.Lock() w.running = true w.ac.mu.Unlock() // Wait for file system events and reload. // When an event occurs, the reload call is delayed a bit so that // multiple events arriving quickly only cause a single reload. var ( debounceDuration = 500 * time.Millisecond rescanTriggered = false debounce = time.NewTimer(0) ) // Ignore initial trigger if !debounce.Stop() { <-debounce.C } defer debounce.Stop() for { select { case <-w.quit: return case <-w.ev: // Trigger the scan (with delay), if not already triggered if !rescanTriggered { debounce.Reset(debounceDuration) rescanTriggered = true } case <-debounce.C: w.ac.scanAccounts() rescanTriggered = false } } } ================================================ FILE: accounts/keystore/watch_fallback.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // +build ios linux,arm64 windows !darwin,!freebsd,!linux,!netbsd,!solaris // This is the fallback implementation of directory watching. // It is used on unsupported platforms. package keystore type watcher struct{ running bool } func newWatcher(*accountCache) *watcher { return new(watcher) } func (*watcher) start() {} func (*watcher) close() {} ================================================ FILE: accounts/manager.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package accounts import ( "reflect" "sort" "sync" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/event" ) // Manager is an overarching account manager that can communicate with various // backends for signing transactions. type Manager struct { backends map[reflect.Type][]Backend // Index of backends currently registered updaters []event.Subscription // Wallet update subscriptions for all backends updates chan WalletEvent // Subscription sink for backend wallet changes wallets []Wallet // Cache of all wallets from all registered backends feed event.Feed // Wallet feed notifying of arrivals/departures quit chan chan error lock sync.RWMutex } // NewManager creates a generic account manager to sign transaction via various // supported backends. func NewManager(backends ...Backend) *Manager { // Retrieve the initial list of wallets from the backends and sort by URL var wallets []Wallet for _, backend := range backends { wallets = merge(wallets, backend.Wallets()...) } // Subscribe to wallet notifications from all backends updates := make(chan WalletEvent, 4*len(backends)) subs := make([]event.Subscription, len(backends)) for i, backend := range backends { subs[i] = backend.Subscribe(updates) } // Assemble the account manager and return am := &Manager{ backends: make(map[reflect.Type][]Backend), updaters: subs, updates: updates, wallets: wallets, quit: make(chan chan error), } for _, backend := range backends { kind := reflect.TypeOf(backend) am.backends[kind] = append(am.backends[kind], backend) } go am.update() return am } // Close terminates the account manager's internal notification processes. func (am *Manager) Close() error { errc := make(chan error) am.quit <- errc return <-errc } // update is the wallet event loop listening for notifications from the backends // and updating the cache of wallets. func (am *Manager) update() { // Close all subscriptions when the manager terminates defer func() { am.lock.Lock() for _, sub := range am.updaters { sub.Unsubscribe() } am.updaters = nil am.lock.Unlock() }() // Loop until termination for { select { case event := <-am.updates: // Wallet event arrived, update local cache am.lock.Lock() switch event.Kind { case WalletArrived: am.wallets = merge(am.wallets, event.Wallet) case WalletDropped: am.wallets = drop(am.wallets, event.Wallet) } am.lock.Unlock() // Notify any listeners of the event am.feed.Send(event) case errc := <-am.quit: // Manager terminating, return errc <- nil return } } } // Backends retrieves the backend(s) with the given type from the account manager. func (am *Manager) Backends(kind reflect.Type) []Backend { return am.backends[kind] } // Wallets returns all abi accounts registered under this account manager. func (am *Manager) Wallets() []Wallet { am.lock.RLock() defer am.lock.RUnlock() cpy := make([]Wallet, len(am.wallets)) copy(cpy, am.wallets) return cpy } // Wallet retrieves the wallet associated with a particular URL. func (am *Manager) Wallet(url string) (Wallet, error) { am.lock.RLock() defer am.lock.RUnlock() parsed, err := parseURL(url) if err != nil { return nil, err } for _, wallet := range am.Wallets() { if wallet.URL() == parsed { return wallet, nil } } return nil, ErrUnknownWallet } // Find attempts to locate the wallet corresponding to a specific account. Since // accounts can be dynamically added to and removed from wallets, this method has // a linear runtime in the number of wallets. func (am *Manager) Find(account Account) (Wallet, error) { am.lock.RLock() defer am.lock.RUnlock() for _, wallet := range am.wallets { if wallet.Contains(account) { return wallet, nil } } return nil, ErrUnknownAccount } func (am *Manager) FindAccountByPk(pk c_type.Uint512) (Account, error) { am.lock.RLock() defer am.lock.RUnlock() for _, wallet := range am.wallets { if wallet.Accounts()[0].GetPk() == pk { return wallet.Accounts()[0], nil } } return Account{}, ErrUnknownAccount } func (am *Manager) FindAccountByPkr(pkr c_type.PKr) (Account, error) { am.lock.RLock() defer am.lock.RUnlock() for _, wallet := range am.wallets { if wallet.Accounts()[0].IsMyPkr(pkr) { return wallet.Accounts()[0], nil } } return Account{}, ErrUnknownAccount } // Subscribe creates an async subscription to receive notifications when the // manager detects the arrival or departure of a wallet from any of its backends. func (am *Manager) Subscribe(sink chan<- WalletEvent) event.Subscription { return am.feed.Subscribe(sink) } // merge is a sorted analogue of append for wallets, where the ordering of the // origin list is preserved by inserting new wallets at the correct position. // // The original slice is assumed to be already sorted by URL. func merge(slice []Wallet, wallets ...Wallet) []Wallet { for _, wallet := range wallets { n := sort.Search(len(slice), func(i int) bool { return slice[i].URL().Cmp(wallet.URL()) >= 0 }) if n == len(slice) { slice = append(slice, wallet) continue } slice = append(slice[:n], append([]Wallet{wallet}, slice[n:]...)...) } return slice } // drop is the couterpart of merge, which looks up wallets from within the sorted // cache and removes the ones specified. func drop(slice []Wallet, wallets ...Wallet) []Wallet { for _, wallet := range wallets { n := sort.Search(len(slice), func(i int) bool { return slice[i].URL().Cmp(wallet.URL()) >= 0 }) if n == len(slice) { // Wallet not found, may happen during startup continue } slice = append(slice[:n], slice[n+1:]...) } return slice } ================================================ FILE: accounts/url.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package accounts import ( "encoding/json" "errors" "fmt" "strings" ) // URL represents the canonical identification URL of a wallet or account. // // It is a simplified version of url.URL, with the important limitations (which // are considered features here) that it contains value-copyable components only, // as well as that it doesn't do any URL encoding/decoding of special characters. // // The former is important to allow an account to be copied without leaving live // references to the original version, whereas the latter is important to ensure // one single canonical form opposed to many allowed ones by the RFC 3986 spec. // // As such, these URLs should not be used outside of the scope of an Sero // wallet or account. type URL struct { Scheme string // Protocol scheme to identify a capable account backend Path string // Path for the backend to identify a unique entity } // parseURL converts a user supplied URL into the accounts specific structure. func parseURL(url string) (URL, error) { parts := strings.Split(url, "://") if len(parts) != 2 || parts[0] == "" { return URL{}, errors.New("protocol scheme missing") } return URL{ Scheme: parts[0], Path: parts[1], }, nil } // String implements the stringer interface. func (u URL) String() string { if u.Scheme != "" { return fmt.Sprintf("%s://%s", u.Scheme, u.Path) } return u.Path } // TerminalString implements the log.TerminalStringer interface. func (u URL) TerminalString() string { url := u.String() if len(url) > 32 { return url[:31] + "…" } return url } // MarshalJSON implements the json.Marshaller interface. func (u URL) MarshalJSON() ([]byte, error) { return json.Marshal(u.String()) } // UnmarshalJSON parses url. func (u *URL) UnmarshalJSON(input []byte) error { var textURL string err := json.Unmarshal(input, &textURL) if err != nil { return err } url, err := parseURL(textURL) if err != nil { return err } u.Scheme = url.Scheme u.Path = url.Path return nil } // Cmp compares x and y and returns: // // -1 if x < y // 0 if x == y // +1 if x > y // func (u URL) Cmp(url URL) int { if u.Scheme == url.Scheme { return strings.Compare(u.Path, url.Path) } return strings.Compare(u.Scheme, url.Scheme) } ================================================ FILE: accounts/url_test.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package accounts import ( "testing" ) func TestURLParsing(t *testing.T) { url, err := parseURL("https://sero.cash") if err != nil { t.Errorf("unexpected error: %v", err) } if url.Scheme != "https" { t.Errorf("expected: %v, got: %v", "https", url.Scheme) } if url.Path != "sero.cash" { t.Errorf("expected: %v, got: %v", "sero.cash", url.Path) } _, err = parseURL("sero.cash") if err == nil { t.Error("expected err, got: nil") } } func TestURLString(t *testing.T) { url := URL{Scheme: "https", Path: "sero.cash"} if url.String() != "https://sero.cash" { t.Errorf("expected: %v, got: %v", "https://sero.cash", url.String()) } url = URL{Scheme: "", Path: "sero.cash"} if url.String() != "sero.cash" { t.Errorf("expected: %v, got: %v", "sero.cash", url.String()) } } func TestURLMarshalJSON(t *testing.T) { url := URL{Scheme: "https", Path: "sero.cash"} json, err := url.MarshalJSON() if err != nil { t.Errorf("unexpcted error: %v", err) } if string(json) != "\"https://sero.cash\"" { t.Errorf("expected: %v, got: %v", "\"https://sero.cash\"", string(json)) } } func TestURLUnmarshalJSON(t *testing.T) { url := &URL{} err := url.UnmarshalJSON([]byte("\"https://sero.cash\"")) if err != nil { t.Errorf("unexpcted error: %v", err) } if url.Scheme != "https" { t.Errorf("expected: %v, got: %v", "https", url.Scheme) } if url.Path != "sero.cash" { t.Errorf("expected: %v, got: %v", "https", url.Path) } } func TestURLComparison(t *testing.T) { tests := []struct { urlA URL urlB URL expect int }{ {URL{"https", "sero.cash"}, URL{"https", "sero.cash"}, 0}, {URL{"http", "sero.cash"}, URL{"https", "sero.cash"}, -1}, {URL{"https", "sero.cash/a"}, URL{"https", "sero.cash"}, 1}, {URL{"https", "abc.cash"}, URL{"https", "sero.cash"}, -1}, } for i, tt := range tests { result := tt.urlA.Cmp(tt.urlB) if result != tt.expect { t.Errorf("test %d: cmp mismatch: expected: %d, got: %d", i, tt.expect, result) } } } ================================================ FILE: appveyor.yml ================================================ os: Visual Studio 2015 # Clone directly into GOPATH. clone_folder: C:\gopath\src\github.com\ethereum\go-ethereum clone_depth: 5 version: "{branch}.{build}" environment: global: GOPATH: C:\gopath CC: gcc.exe matrix: - GETH_ARCH: amd64 MSYS2_ARCH: x86_64 MSYS2_BITS: 64 MSYSTEM: MINGW64 PATH: C:\msys64\mingw64\bin\;C:\Program Files (x86)\NSIS\;%PATH% - GETH_ARCH: 386 MSYS2_ARCH: i686 MSYS2_BITS: 32 MSYSTEM: MINGW32 PATH: C:\msys64\mingw32\bin\;C:\Program Files (x86)\NSIS\;%PATH% install: - git submodule update --init - rmdir C:\go /s /q - appveyor DownloadFile https://storage.googleapis.com/golang/go1.10.3.windows-%GETH_ARCH%.zip - 7z x go1.10.3.windows-%GETH_ARCH%.zip -y -oC:\ > NUL - go version - gcc --version build_script: - go run build\ci.go install after_build: - go run build\ci.go archive -type zip -signer WINDOWS_SIGNING_KEY -upload gethstore/builds - go run build\ci.go nsis -signer WINDOWS_SIGNING_KEY -upload gethstore/builds test_script: - set CGO_ENABLED=1 - go run build\ci.go test -coverage ================================================ FILE: build/RPMINSTALL.md ================================================ # go-sero RPM package generate and installation/uninstallation ## centos 7 from the cloned resource github/sero-cash/go-sero goto build directory run ``` ./rpmbuild.sh ``` it will generate rpm package in github/sero-cash/go-sero/build/package/RPMS ## install with rpm ``` rpm -ivh ${rpmfile} --nodeps ``` ## check install and env exec following command in console ``` gero ``` it it complains with missing libboost_system ... etc. please ref [installation guide](https://github.com/sero-cash/go-sero/wiki/Building-Sero) for centos ``` sudo yum --setopt=group_package_types=mandatory,default,optional group install "Development Tools" sudo yum install boost boost-devel boost-system boost-filesystem boost-thread ``` for ubuntu ``` sudo apt-get install -y build-essential golang sudo apt-get install libboost-all-dev ``` ## uninstall if you met following error: install of gero-1.0-1.x86_64 conflicts with file from package gero-1.0-1.x86_64 or you want to upgrade gero you need to uninstall previous gero package ``` sudo dpkg --purge ${packagename} ``` or ``` sudo rpm -e ${packagename} ``` ================================================ FILE: build/ci-notes.md ================================================ # Debian Packaging Tagged releases and develop branch commits are available as installable Debian packages for Ubuntu. Packages are built for the all Ubuntu versions which are supported by Canonical. Packages of develop branch commits have suffix -unstable and cannot be installed alongside the stable version. Switching between release streams requires user intervention. The packages are built and served by launchpad.net. We generate a Debian source package for each distribution and upload it. Their builder picks up the source package, builds it and installs the new version into the PPA repository. Launchpad requires a valid signature by a team member for source package uploads. The signing key is stored in an environment variable which Travis CI makes available to certain builds. We want to build go-sero with the most recent version of Go, irrespective of the Go version that is available in the main Ubuntu repository. In order to make this possible, our PPA depends on the ~gophers/ubuntu/archive PPA. Our source package build-depends on golang-1.10, which is co-installable alongside the regular golang package. PPA dependencies can be edited at https://launchpad.net/%7Eethereum/+archive/ubuntu/ethereum/+edit-dependencies ## Building Packages Locally (for testing) You need to run Ubuntu to do test packaging. Add the gophers PPA and install Go 1.10 and Debian packaging tools: $ sudo apt-add-repository ppa:gophers/ubuntu/archive $ sudo apt-get update $ sudo apt-get install build-essential golang-1.10 devscripts debhelper Create the source packages: $ go run build/ci.go debsrc -workdir dist Then go into the source package directory for your running distribution and build the package: $ cd dist/ethereum-unstable-1.6.0+xenial $ dpkg-buildpackage Built packages are placed in the dist/ directory. $ cd .. $ dpkg-deb -c geth-unstable_1.6.0+xenial_amd64.deb ================================================ FILE: build/ci.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // +build none /* The ci command is called from Continuous Integration scripts. Usage: go run build/ci.go Available commands are: install [ -arch architecture ] [ -cc compiler ] [ packages... ] -- builds packages and executables test [ -coverage ] [ packages... ] -- runs the tests lint -- runs certain pre-selected linters archive [ -arch architecture ] [ -type zip|tar ] [ -abi key-envvar ] [ -upload dest ] -- archives build artifacts importkeys -- imports signing keys from env debsrc [ -abi key-id ] [ -upload dest ] -- creates a debian source package nsis -- creates a Windows NSIS installer aar [ -local ] [ -sign key-id ] [-deploy repo] [ -upload dest ] -- creates an Android archive xcode [ -local ] [ -sign key-id ] [-deploy repo] [ -upload dest ] -- creates an iOS XCode framework xgo [ -alltools ] [ options ] -- cross builds according to options purge [ -store blobstore ] [ -days threshold ] -- purges old archives from the blobstore For all commands, -n prevents execution of external programs (dry run mode). */ package main import ( "bufio" "encoding/base64" "flag" "fmt" "go/parser" "go/token" "io/ioutil" "log" "os" "os/exec" "path/filepath" "regexp" "runtime" "strings" "time" "github.com/sero-cash/go-sero/internal/build" "github.com/sero-cash/go-sero/params" ) var ( // Files that end up in the gero*.zip archive. gethArchiveFiles = []string{ "COPYING", executablePath("gero"), } // Files that end up in the gero-alltools*.zip archive. allToolsArchiveFiles = []string{ "COPYING", executablePath("bootnode"), executablePath("gero"), } // Files that end up in the swarm*.zip archive. swarmArchiveFiles = []string{ "COPYING", executablePath("swarm"), } // A debian package is created for all executables listed here. debExecutables = []debExecutable{ { BinaryName: "bootnode", Description: "Sero bootnode.", }, { BinaryName: "gero", Description: "Sero CLI client.", }, } // A debian package is created for all executables listed here. debSwarmExecutables = []debExecutable{ { BinaryName: "swarm", PackageName: "Sero-swarm", Description: "Sero Swarm daemon and tools", }, } debSero = debPackage{ Name: "Sero", Version: params.Version, Executables: debExecutables, } // Distros for which packages are created. // Note: vivid is unsupported because there is no golang-1.6 package for it. // Note: wily is unsupported because it was officially deprecated on lanchpad. // Note: yakkety is unsupported because it was officially deprecated on lanchpad. // Note: zesty is unsupported because it was officially deprecated on lanchpad. // Note: artful is unsupported because it was officially deprecated on lanchpad. debDistros = []string{"trusty", "xenial", "bionic", "cosmic"} ) var GOBIN, _ = filepath.Abs(filepath.Join("build", "bin")) func executablePath(name string) string { if runtime.GOOS == "windows" { name += ".exe" } return filepath.Join(GOBIN, name) } func main() { log.SetFlags(log.Lshortfile) if _, err := os.Stat(filepath.Join("build", "ci.go")); os.IsNotExist(err) { log.Fatal("this script must be run from the root of the repository") } if len(os.Args) < 2 { log.Fatal("need subcommand as first argument") } switch os.Args[1] { case "install": doInstall(os.Args[2:]) case "test": doTest(os.Args[2:]) case "lint": doLint(os.Args[2:]) case "archive": doArchive(os.Args[2:]) case "xcode": doXCodeFramework(os.Args[2:]) case "xgo": doXgo(os.Args[2:]) case "purge": doPurge(os.Args[2:]) default: log.Fatal("unknown command ", os.Args[1]) } } // Compiling func doInstall(cmdline []string) { var ( arch = flag.String("arch", "", "Architecture to cross build for") cc = flag.String("cc", "", "C compiler to cross build with") ) flag.CommandLine.Parse(cmdline) env := build.Env() // Check Go version. People regularly open issues about compilation // failure with outdated Go. This should save them the trouble. if !strings.Contains(runtime.Version(), "devel") { // Figure out the minor version number since we can't textually compare (1.10 < 1.9) var minor int fmt.Sscanf(strings.TrimPrefix(runtime.Version(), "go1."), "%d", &minor) if minor < 9 { log.Println("You have Go version", runtime.Version()) log.Println("go-sero requires at least Go version 1.9 and cannot") log.Println("be compiled with an earlier version. Please upgrade your Go installation.") os.Exit(1) } } // Compile packages given as arguments, or everything if there are no arguments. packages := []string{"./..."} if flag.NArg() > 0 { packages = flag.Args() } packages = build.ExpandPackagesNoVendor(packages) if *arch == "" || *arch == runtime.GOARCH { goinstall := goTool("install", buildFlags(env)...) goinstall.Args = append(goinstall.Args, "-v") goinstall.Args = append(goinstall.Args, packages...) build.MustRun(goinstall) return } // If we are cross compiling to ARMv5 ARMv6 or ARMv7, clean any previous builds if *arch == "arm" { os.RemoveAll(filepath.Join(runtime.GOROOT(), "pkg", runtime.GOOS+"_arm")) for _, path := range filepath.SplitList(build.GOPATH()) { os.RemoveAll(filepath.Join(path, "pkg", runtime.GOOS+"_arm")) } } // Seems we are cross compiling, work around forbidden GOBIN goinstall := goToolArch(*arch, *cc, "install", buildFlags(env)...) goinstall.Args = append(goinstall.Args, "-v") goinstall.Args = append(goinstall.Args, []string{"-buildmode", "archive"}...) goinstall.Args = append(goinstall.Args, packages...) build.MustRun(goinstall) if cmds, err := ioutil.ReadDir("cmd"); err == nil { for _, cmd := range cmds { pkgs, err := parser.ParseDir(token.NewFileSet(), filepath.Join(".", "cmd", cmd.Name()), nil, parser.PackageClauseOnly) if err != nil { log.Fatal(err) } for name := range pkgs { if name == "main" { gobuild := goToolArch(*arch, *cc, "build", buildFlags(env)...) gobuild.Args = append(gobuild.Args, "-v") gobuild.Args = append(gobuild.Args, []string{"-o", executablePath(cmd.Name())}...) gobuild.Args = append(gobuild.Args, "."+string(filepath.Separator)+filepath.Join("cmd", cmd.Name())) build.MustRun(gobuild) break } } } } } func buildFlags(env build.Environment) (flags []string) { var ld []string if env.Commit != "" { ld = append(ld, "-X", "main.gitCommit="+env.Commit) } if runtime.GOOS == "darwin" { ld = append(ld, "-s") } if len(ld) > 0 { flags = append(flags, "-ldflags", strings.Join(ld, " ")) } return flags } func goTool(subcmd string, args ...string) *exec.Cmd { return goToolArch(runtime.GOARCH, os.Getenv("CC"), subcmd, args...) } func goToolArch(arch string, cc string, subcmd string, args ...string) *exec.Cmd { cmd := build.GoTool(subcmd, args...) cmd.Env = []string{"GOPATH=" + build.GOPATH()} if arch == "" || arch == runtime.GOARCH { cmd.Env = append(cmd.Env, "GOBIN="+GOBIN) } else { cmd.Env = append(cmd.Env, "CGO_ENABLED=1") cmd.Env = append(cmd.Env, "GOARCH="+arch) } if cc != "" { cmd.Env = append(cmd.Env, "CC="+cc) } for _, e := range os.Environ() { if strings.HasPrefix(e, "GOPATH=") || strings.HasPrefix(e, "GOBIN=") { continue } cmd.Env = append(cmd.Env, e) } return cmd } // Running The Tests // // "tests" also includes static analysis tools such as vet. func doTest(cmdline []string) { var ( coverage = flag.Bool("coverage", false, "Whether to record code coverage") ) flag.CommandLine.Parse(cmdline) env := build.Env() packages := []string{"./..."} if len(flag.CommandLine.Args()) > 0 { packages = flag.CommandLine.Args() } packages = build.ExpandPackagesNoVendor(packages) // Run analysis tools before the tests. build.MustRun(goTool("vet", packages...)) // Run the actual tests. gotest := goTool("test", buildFlags(env)...) // Test a single package at a time. CI builders are slow // and some tests run into timeouts under load. gotest.Args = append(gotest.Args, "-p", "1") if *coverage { gotest.Args = append(gotest.Args, "-covermode=atomic", "-cover") } gotest.Args = append(gotest.Args, packages...) build.MustRun(gotest) } // runs gometalinter on requested packages func doLint(cmdline []string) { flag.CommandLine.Parse(cmdline) packages := []string{"./..."} if len(flag.CommandLine.Args()) > 0 { packages = flag.CommandLine.Args() } // Get metalinter and install all supported linters build.MustRun(goTool("get", "gopkg.in/alecthomas/gometalinter.v2")) build.MustRunCommand(filepath.Join(GOBIN, "gometalinter.v2"), "--install") // Run fast linters batched together configs := []string{ "--vendor", "--tests", "--deadline=2m", "--disable-all", "--enable=goimports", "--enable=varcheck", "--enable=vet", "--enable=gofmt", "--enable=misspell", "--enable=goconst", "--min-occurrences=6", // for goconst } build.MustRunCommand(filepath.Join(GOBIN, "gometalinter.v2"), append(configs, packages...)...) // Run slow linters one by one for _, linter := range []string{"unconvert", "gosimple"} { configs = []string{"--vendor", "--tests", "--deadline=10m", "--disable-all", "--enable=" + linter} build.MustRunCommand(filepath.Join(GOBIN, "gometalinter.v2"), append(configs, packages...)...) } } // Release Packaging func doArchive(cmdline []string) { var ( arch = flag.String("arch", runtime.GOARCH, "Architecture cross packaging") atype = flag.String("type", "zip", "Type of archive to write (zip|tar)") ext string ) flag.CommandLine.Parse(cmdline) switch *atype { case "zip": ext = ".zip" case "tar": ext = ".tar.gz" default: log.Fatal("unknown archive type: ", atype) } var ( env = build.Env() basegeth = archiveBasename(*arch, params.ArchiveVersion(env.Commit)) geth = "gero-" + basegeth + ext alltools = "gero-alltools-" + basegeth + ext ) maybeSkipArchive(env) if err := build.WriteArchive(geth, gethArchiveFiles); err != nil { log.Fatal(err) } if err := build.WriteArchive(alltools, allToolsArchiveFiles); err != nil { log.Fatal(err) } } func archiveBasename(arch string, archiveVersion string) string { platform := runtime.GOOS + "-" + arch if arch == "arm" { platform += os.Getenv("GOARM") } if arch == "android" { platform = "android-all" } if arch == "ios" { platform = "ios-all" } return platform + "-" + archiveVersion } func archiveUpload(archive string, blobstore string, signer string) error { // If signing was requested, generate the signature files if signer != "" { pgpkey, err := base64.StdEncoding.DecodeString(os.Getenv(signer)) if err != nil { return fmt.Errorf("invalid base64 %s", signer) } if err := build.PGPSignFile(archive, archive+".asc", string(pgpkey)); err != nil { return err } } // If uploading to Azure was requested, push the archive possibly with its signature if blobstore != "" { auth := build.AzureBlobstoreConfig{ Account: strings.Split(blobstore, "/")[0], Token: os.Getenv("AZURE_BLOBSTORE_TOKEN"), Container: strings.SplitN(blobstore, "/", 2)[1], } if err := build.AzureBlobstoreUpload(archive, filepath.Base(archive), auth); err != nil { return err } if signer != "" { if err := build.AzureBlobstoreUpload(archive+".asc", filepath.Base(archive+".asc"), auth); err != nil { return err } } } return nil } // skips archiving for some build configurations. func maybeSkipArchive(env build.Environment) { if env.IsPullRequest { log.Printf("skipping because this is a PR build") os.Exit(0) } if env.IsCronJob { log.Printf("skipping because this is a cron job") os.Exit(0) } if env.Branch != "master" && !strings.HasPrefix(env.Tag, "v1.") { log.Printf("skipping because branch %q, tag %q is not on the whitelist", env.Branch, env.Tag) os.Exit(0) } } func makeWorkdir(wdflag string) string { var err error if wdflag != "" { err = os.MkdirAll(wdflag, 0744) } else { wdflag, err = ioutil.TempDir("", "gero-build-") } if err != nil { log.Fatal(err) } return wdflag } func isUnstableBuild(env build.Environment) bool { if env.Tag != "" { return false } return true } type debPackage struct { Name string // the name of the Debian package to produce, e.g. "ethereum", or "ethereum-swarm" Version string // the clean version of the debPackage, e.g. 1.8.12 or 0.3.0, without any metadata Executables []debExecutable // executables to be included in the package } type debMetadata struct { Env build.Environment PackageName string // go-sero version being built. Note that this // is not the debian package version. The package version // is constructed by VersionString. Version string Author string // "name ", also selects signing key Distro, Time string Executables []debExecutable } type debExecutable struct { PackageName string BinaryName string Description string } // Package returns the name of the package if present, or // fallbacks to BinaryName func (d debExecutable) Package() string { if d.PackageName != "" { return d.PackageName } return d.BinaryName } func newDebMetadata(distro, author string, env build.Environment, t time.Time, name string, version string, exes []debExecutable) debMetadata { if author == "" { // No signing key, use default author. author = "Sero Builds " } return debMetadata{ PackageName: name, Env: env, Author: author, Distro: distro, Version: version, Time: t.Format(time.RFC1123Z), Executables: exes, } } // Name returns the name of the metapackage that depends // on all executable packages. func (meta debMetadata) Name() string { if isUnstableBuild(meta.Env) { return meta.PackageName + "-unstable" } return meta.PackageName } // VersionString returns the debian version of the packages. func (meta debMetadata) VersionString() string { vsn := meta.Version if meta.Env.Buildnum != "" { vsn += "+build" + meta.Env.Buildnum } if meta.Distro != "" { vsn += "+" + meta.Distro } return vsn } // ExeList returns the list of all executable packages. func (meta debMetadata) ExeList() string { names := make([]string, len(meta.Executables)) for i, e := range meta.Executables { names[i] = meta.ExeName(e) } return strings.Join(names, ", ") } // ExeName returns the package name of an executable package. func (meta debMetadata) ExeName(exe debExecutable) string { if isUnstableBuild(meta.Env) { return exe.Package() + "-unstable" } return exe.Package() } // ExeConflicts returns the content of the Conflicts field // for executable packages. func (meta debMetadata) ExeConflicts(exe debExecutable) string { if isUnstableBuild(meta.Env) { // Set up the conflicts list so that the *-unstable packages // cannot be installed alongside the regular version. // // https://www.debian.org/doc/debian-policy/ch-relationships.html // is very explicit about Conflicts: and says that Breaks: should // be preferred and the conflicting files should be handled via // alternates. We might do this eventually but using a conflict is // easier now. return "ethereum, " + exe.Package() } return "" } func stageDebianSource(tmpdir string, meta debMetadata) (pkgdir string) { pkg := meta.Name() + "-" + meta.VersionString() pkgdir = filepath.Join(tmpdir, pkg) if err := os.Mkdir(pkgdir, 0755); err != nil { log.Fatal(err) } // Copy the source code. build.MustRunCommand("git", "checkout-index", "-a", "--prefix", pkgdir+string(filepath.Separator)) // Put the debian build files in place. debian := filepath.Join(pkgdir, "debian") build.Render("build/deb/"+meta.PackageName+"/deb.rules", filepath.Join(debian, "rules"), 0755, meta) build.Render("build/deb/"+meta.PackageName+"/deb.changelog", filepath.Join(debian, "changelog"), 0644, meta) build.Render("build/deb/"+meta.PackageName+"/deb.control", filepath.Join(debian, "control"), 0644, meta) build.Render("build/deb/"+meta.PackageName+"/deb.copyright", filepath.Join(debian, "copyright"), 0644, meta) build.RenderString("8\n", filepath.Join(debian, "compat"), 0644, meta) build.RenderString("3.0 (native)\n", filepath.Join(debian, "source/format"), 0644, meta) for _, exe := range meta.Executables { install := filepath.Join(debian, meta.ExeName(exe)+".install") docs := filepath.Join(debian, meta.ExeName(exe)+".docs") build.Render("build/deb/"+meta.PackageName+"/deb.install", install, 0644, exe) build.Render("build/deb/"+meta.PackageName+"/deb.docs", docs, 0644, exe) } return pkgdir } func gomobileTool(subcmd string, args ...string) *exec.Cmd { cmd := exec.Command(filepath.Join(GOBIN, "gomobile"), subcmd) cmd.Args = append(cmd.Args, args...) cmd.Env = []string{ "GOPATH=" + build.GOPATH(), "PATH=" + GOBIN + string(os.PathListSeparator) + os.Getenv("PATH"), } for _, e := range os.Environ() { if strings.HasPrefix(e, "GOPATH=") || strings.HasPrefix(e, "PATH=") { continue } cmd.Env = append(cmd.Env, e) } return cmd } type mavenMetadata struct { Version string Package string Develop bool Contributors []mavenContributor } type mavenContributor struct { Name string Email string } func newMavenMetadata(env build.Environment) mavenMetadata { // Collect the list of authors from the repo root contribs := []mavenContributor{} if authors, err := os.Open("AUTHORS"); err == nil { defer authors.Close() scanner := bufio.NewScanner(authors) for scanner.Scan() { // Skip any whitespace from the authors list line := strings.TrimSpace(scanner.Text()) if line == "" || line[0] == '#' { continue } // Split the author and insert as a contributor re := regexp.MustCompile("([^<]+) <(.+)>") parts := re.FindStringSubmatch(line) if len(parts) == 3 { contribs = append(contribs, mavenContributor{Name: parts[1], Email: parts[2]}) } } } // Render the version and package strings version := params.Version if isUnstableBuild(env) { version += "-SNAPSHOT" } return mavenMetadata{ Version: version, Package: "gero-" + version, Develop: isUnstableBuild(env), Contributors: contribs, } } // XCode frameworks func doXCodeFramework(cmdline []string) { var ( local = flag.Bool("local", false, `Flag whether we're only doing a local build (skip Maven artifacts)`) signer = flag.String("abi", "", `Environment variable holding the signing key (e.g. IOS_SIGNING_KEY)`) deploy = flag.String("deploy", "", `Destination to deploy the archive (usually "trunk")`) upload = flag.String("upload", "", `Destination to upload the archives (usually "gethstore/builds")`) ) flag.CommandLine.Parse(cmdline) env := build.Env() // Build the iOS XCode framework build.MustRun(goTool("get", "golang.org/x/mobile/cmd/gomobile", "golang.org/x/mobile/cmd/gobind")) build.MustRun(gomobileTool("init")) bind := gomobileTool("bind", "-ldflags", "-s -w", "--target", "ios", "--tags", "ios", "-v", "github.com/sero-cash/go-sero/mobile") if *local { // If we're building locally, use the build folder and stop afterwards bind.Dir, _ = filepath.Abs(GOBIN) build.MustRun(bind) return } archive := "gero-" + archiveBasename("ios", params.ArchiveVersion(env.Commit)) if err := os.Mkdir(archive, os.ModePerm); err != nil { log.Fatal(err) } bind.Dir, _ = filepath.Abs(archive) build.MustRun(bind) build.MustRunCommand("tar", "-zcvf", archive+".tar.gz", archive) // Skip CocoaPods deploy and Azure upload for PR builds maybeSkipArchive(env) // Sign and upload the framework to Azure if err := archiveUpload(archive+".tar.gz", *upload, *signer); err != nil { log.Fatal(err) } // Prepare and upload a PodSpec to CocoaPods if *deploy != "" { meta := newPodMetadata(env, archive) build.Render("build/pod.podspec", "Geth.podspec", 0755, meta) build.MustRunCommand("pod", *deploy, "push", "Geth.podspec", "--allow-warnings", "--verbose") } } type podMetadata struct { Version string Commit string Archive string Contributors []podContributor } type podContributor struct { Name string Email string } func newPodMetadata(env build.Environment, archive string) podMetadata { // Collect the list of authors from the repo root contribs := []podContributor{} if authors, err := os.Open("AUTHORS"); err == nil { defer authors.Close() scanner := bufio.NewScanner(authors) for scanner.Scan() { // Skip any whitespace from the authors list line := strings.TrimSpace(scanner.Text()) if line == "" || line[0] == '#' { continue } // Split the author and insert as a contributor re := regexp.MustCompile("([^<]+) <(.+)>") parts := re.FindStringSubmatch(line) if len(parts) == 3 { contribs = append(contribs, podContributor{Name: parts[1], Email: parts[2]}) } } } version := params.Version if isUnstableBuild(env) { version += "-unstable." + env.Buildnum } return podMetadata{ Archive: archive, Version: version, Commit: env.Commit, Contributors: contribs, } } // Cross compilation func doXgo(cmdline []string) { var ( alltools = flag.Bool("alltools", false, `Flag whether we're building all known tools, or only on in particular`) ) flag.CommandLine.Parse(cmdline) env := build.Env() // Make sure xgo is available for cross compilation gogetxgo := goTool("get", "github.com/karalabe/xgo") build.MustRun(gogetxgo) // If all tools building is requested, build everything the builder wants args := append(buildFlags(env), flag.Args()...) if *alltools { args = append(args, []string{"--dest", GOBIN}...) for _, res := range allToolsArchiveFiles { if strings.HasPrefix(res, GOBIN) { // Binary tool found, cross build it explicitly args = append(args, "./"+filepath.Join("cmd", filepath.Base(res))) xgo := xgoTool(args) build.MustRun(xgo) args = args[:len(args)-1] } } return } // Otherwise xxecute the explicit cross compilation path := args[len(args)-1] args = append(args[:len(args)-1], []string{"--dest", GOBIN, path}...) xgo := xgoTool(args) build.MustRun(xgo) } func xgoTool(args []string) *exec.Cmd { cmd := exec.Command(filepath.Join(GOBIN, "xgo"), args...) cmd.Env = []string{ "GOPATH=" + build.GOPATH(), "GOBIN=" + GOBIN, } for _, e := range os.Environ() { if strings.HasPrefix(e, "GOPATH=") || strings.HasPrefix(e, "GOBIN=") { continue } cmd.Env = append(cmd.Env, e) } return cmd } // Binary distribution cleanups func doPurge(cmdline []string) { var ( store = flag.String("store", "", `Destination from where to purge archives (usually "gethstore/builds")`) limit = flag.Int("days", 30, `Age threshold above which to delete unstalbe archives`) ) flag.CommandLine.Parse(cmdline) if env := build.Env(); !env.IsCronJob { log.Printf("skipping because not a cron job") os.Exit(0) } // Create the azure authentication and list the current archives auth := build.AzureBlobstoreConfig{ Account: strings.Split(*store, "/")[0], Token: os.Getenv("AZURE_BLOBSTORE_TOKEN"), Container: strings.SplitN(*store, "/", 2)[1], } blobs, err := build.AzureBlobstoreList(auth) if err != nil { log.Fatal(err) } // Iterate over the blobs, collect and sort all unstable builds for i := 0; i < len(blobs); i++ { if !strings.Contains(blobs[i].Name, "unstable") { blobs = append(blobs[:i], blobs[i+1:]...) i-- } } for i := 0; i < len(blobs); i++ { for j := i + 1; j < len(blobs); j++ { if blobs[i].Properties.LastModified.After(blobs[j].Properties.LastModified) { blobs[i], blobs[j] = blobs[j], blobs[i] } } } // Filter out all archives more recent that the given threshold for i, blob := range blobs { if time.Since(blob.Properties.LastModified) < time.Duration(*limit)*24*time.Hour { blobs = blobs[:i] break } } // Delete all marked as such and return if err := build.AzureBlobstoreDelete(auth, blobs); err != nil { log.Fatal(err) } } ================================================ FILE: build/clean_go_build_cache.sh ================================================ #!/bin/sh # Cleaning the Go cache only makes sense if we actually have Go installed... or # if Go is actually callable. This does not hold true during deb packaging, so # we need an explicit check to avoid build failures. if ! command -v go > /dev/null; then exit fi version_gt() { test "$(printf '%s\n' "$@" | sort -V | head -n 1)" != "$1" } golang_version=$(go version |cut -d' ' -f3 |sed 's/go//') # Clean go build cache when go version is greater than or equal to 1.10 if !(version_gt 1.10 $golang_version); then go clean -cache fi ================================================ FILE: build/env.sh ================================================ #!/bin/sh set -e if [ ! -f "build/env.sh" ]; then echo "$0 must be run from the root of the repository." exit 2 fi # Create fake Go workspace if it doesn't exist yet. workspace="$PWD/build/_workspace" root="$PWD" SERO_PATH="$PWD" CZERO_PATH="$PWD/../go-czero-import" echo $CZERO_PATH _GOPATH=`cd ../../../../;pwd` echo $_GOPATH cd "$root" args=() index=0 for i in "$@"; do args[$index]=$i index=$[$index+1] done mkdir -p "$root/../go-czero-import/czero/lib" cd "$root/../go-czero-import/czero" cp -rf lib_DARWIN_AMD64/* lib/ cp -rf lib_LINUX_AMD64_V3/* lib/ cp -rf lib_WINDOWS_AMD64/* lib/ export LD_LIBRARY_PATH="../go-czero-import/czero/lib" export DYLD_LIBRARY_PATH="../go-czero-import/czero/lib" # Set up the environment to use the workspace. GOPATH="$_GOPATH" export GOPATH # Run the command inside the workspace. cd "$SERO_PATH" PWD="$SERO_PATH" #Launch the arguments with the configured environment. exec "${args[@]}" ================================================ FILE: build/gero.conf ================================================ ================================================ FILE: build/gero.spec ================================================ # Don't try fancy stuff like debuginfo, which is useless on binary-only # packages. Don't strip binary too # Be sure buildpolicy set to do nothing %define _topdir %(pwd) %define _tmpdir %{_topdir}/tmp %define __spec_install_post %{nil} %define debug_package %{nil} %define __os_install_post %{_dbpath}/brp-compress %define RPM_OS %{_os} Summary: A very simple toy bin rpm package Name: gero Version: 1.0 Release: 1 License: GPL+ Group: Development/Tools SOURCE0 : %{name}-%{version}.tar.gz URL: http://gero.sero.com/ BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root AutoReq : yes AutoReqProv : yes AutoProv : yes #Requires: GLIBC_2.4 GCC_3.0 GOMP_1.0 GLIBCXX_3.4.21 GNU_HASH #BuildRequires: glibc >= 2.4 #BuildRequires: gcc >= 3.0 #BuildRequires: gomp >= 1.0 #BuildRequires: glibcxx >= 3.4.21 gnu_hash #BuildRequires: gnu_hash %description %{summary} %prep %setup -q %build # Empty section. %install rm -rf %{buildroot} mkdir -p %{buildroot} # in builddir cp -a * %{buildroot} %clean #rm -rf %{buildroot} %files %defattr(-,root,root,-) %config(noreplace) %{_sysconfdir}/%{name}/%{name}.conf %{_bindir}/../local/* %{_libdir}/* %changelog * Sat Nov 03 2018 riverwind 1.0-1 - First Build ================================================ FILE: build/geropkg/attach.bat ================================================ @echo off set CURRENT=%cd% set LIB_PATH=%CURRENT%\czero\lib set path=%LIB_PATH% start /b bin\gero.exe attach \\.\pipe\gero.ipc ================================================ FILE: build/geropkg/attach.sh ================================================ #!/bin/sh DATADIR="./data" if [ ! -z "$1" ]; then DATADIR=$1 fi export DYLD_LIBRARY_PATH="./czero/lib/" export LD_LIBRARY_PATH="./czero/lib/" bin/gero --datadir="${DATADIR}" attach ================================================ FILE: build/geropkg/clean.sh ================================================ #!/bin/sh ROOT=$(cd `dirname $0`; pwd) DATADIR="${ROOT}/data" if [ ! -z "$1" ]; then DATADIR=$1 fi sh ${ROOT}/stop.sh echo "rm -rf ${DATADIR}/gero/chaindata" rm -rf ${DATADIR}/gero/chaindata echo "rm -rf ${DATADIR}/gero.ipc" rm -rf ${DATADIR}/gero.ipc echo "rm -rf ${DATADIR}/balance" rm -rf ${DATADIR}/balance echo "rm -rf ${DATADIR}/exchange" rm -rf ${DATADIR}/exchange echo "rm -rf ${DATADIR}/stake" rm -rf ${DATADIR}/stake echo "rm -rf ${DATADIR}/light" rm -rf ${DATADIR}/light ================================================ FILE: build/geropkg/geroConfig.toml ================================================ [Sero] [Node] #KeyStoreDir="./data/keystore" [Node.P2P] MaxPeers = 25 StaticNodes = ["snode://4915b0bf79803f09701c2d0b9c9bb1eecc785f5247f14cd62cfca12e4fd3a8eda09f10d1e69eaace358f874cf61f057ebf29b0d63100c7c91265a5ddbbdaf4cd@35.72.78.242:53717","snode://e7a6fb6daf57ea645cbe2320f8eacfce41d8a6942388db3a60e313b5478863c458a71113269612eb83020def344c25d3e502f5606825414532f6292b01a85e8e@18.179.86.22:53717","snode://432ef6d07c8b5a45442abc73900cbc2a4d89f474804711ab487edf9f7b0ba9c8fb1e18c3038b06a3e2035aef35adb5b7939eeae618fd0436827ad37937621ff1@46.51.236.41:53717","snode://2d0a7329549489c6ae7ec5da5ffba3628dbb0bd2ed355e5a22d51e1d5966faebd1bd775a0819238a5f5182efcf386d56adfc5dad8db72c2f347319bed505442b@35.75.221.182:53717","snode://de325a736632a5b8a6e1f3a5755a1c7ab568171918d2a7f26560de4ac99e0cec2b87c487f8652e80d15f0ab3d1a1b6f6ddf1634bec48a34041101d885438e0c2@148.70.169.73:53717","snode://7fe0ac9ab365a18435dc67a92fe48be06b0fc5c5b4ef66135fc4ffbc48ffdd07bfdbc580128bba7bc29dd43c881bb41cf85b8a49015e937356fc6e855d3bc427@3.122.152.29:53717","snode://eb7e7fcf5f6a0adc4cfe8fe4dd1d364299f9163b8ee55cf0424a8f27762eeb64f8be591da98249d2acf48b1c26fef241331fc71ceaec24549b5979423d73f44a@119.28.83.127:53717","snode://04283d01edd018309d1381d8feb531c0b0f1d0ae72b738e7bd92f797a7c6239a1b59f3bfe739f3fc1a63e030360d3b88b185181705ef1166776b3fcc98362a4c@129.28.156.61:53717", "snode://04ab8fd7d7420aa0c66607f59b3109d874de116685e2e8dcd6c583ae9ab991289b7ebb925716d531eaff2cb0977a8961db59d496c3f0d2561dd580941a194d71@118.25.80.42:53717", "snode://1a81e137c5cfb7e41eb2ed911fbac9630abce096b2f1464ce44886d9cd5819493b42a9812f4b65467d966ea8dedca3863b114f7b3f3517c4bd3c3b26c330d60d@111.231.59.54:53717", "snode://38ad2d00bc6c539319e8a476761d2a636156af6a8f504765d28f392cd5c1f42ca2a69aeda05210c5e9dbe5184e68991c9ed36a3e4ded0cdd2ab9cba6c153d60e@47.105.42.49:53717", "snode://3ae5d553e78057fa33cad0ecf08b08fce9c2c50bbe5d2625b996b1322d8c96c74ca42dd54dbf5854cc6c70cd50a650e3b835c92e8f0e0adafcb47724413d16e2@13.251.221.90:60602", "snode://410b4aa874bb3d6d4dc732463629acfabbf503d39493f69c82fd62119d4eca1aef02cb0e5d224765231b66df3ba87e50e7fafc87651cbaf41af13705fea3370f@27.10.235.88:34342", "snode://41129a264748e4d949c675b1bb6afcb23fb0748e991e16e2b43693ead9911759c708ded5b836a68d0ef3c48d389667f3ba1224734b00794d522754bc693f52ea@109.70.186.58:53718", "snode://459c94ce2b1bb05dce5faccd27b13add006b5378ba0e598b001ddf07eb08d00965d61a64016b72a48de0a0d51c1d4f964929c00d53efc8b95a174dba3ba98065@95.216.8.218:53333", "snode://4ba7196e0c06885b036795ff126c4616627075ceb0bfaf0fae2313e6894bc3445b3b147afd60021d3450e4c0e7582be3248a2d21bb03560bff8a06b638efe749@118.24.17.141:53717", "snode://4da4f3b1f852cefadff1ace9f24cabd1245cf6ba81fb1cdb043c4987202bfacd8226c48a16bccef05c15f2f0b263acd25be1e60e3e3250ae61f83c49701118e9@121.196.218.173:53717", "snode://505d5faf9c914e082a1157dc6e8398eb52e18da05b71ffb45c97d422dbf01c91ff6eabeecb4d4fd2557c9bf52b471f376eba04f66bc9adc926ca6bd927f35394@47.75.186.103:56112", "snode://52e62b8cc63d8a44b7071ca76115edce26f53da42a71a23f7b52f8870b43b658cefe33517a7316941385fae495052b7d351e6e3f3c5f1110a86e20ee5d3626ec@39.100.244.135:53717", "snode://5365992929387340e9e5a5a06dcb32948efa9c073f62bbcbdaa9cc47c82c5e99c4b917a850aecd0ffa21150731475276b82aff0617bfa7016b2809459e1da128@14.215.130.120:53717", "snode://5e0041083a74bda32f46ef66d3206b73d0c14facd674a4f99373116954a88bb04f8abf0da0503baa186d3edc0ff5e3d22a4e74252a7750662053f9606bd0bef8@109.70.186.58:53717", "snode://619413acabc04d15870b8cce2eac02b0bc91a706cad503ae3e438870408d79f282b0e25dfeb4c8dbdcd2b0f320577ee859420c94f6a7f50db973bda70c360e65@183.2.149.218:53717", "snode://6b883d53f89c32ea32fc0520fe7c1dd2738c079068bc84c12b8fc032c0c947e958c980ef4eb839f5b7dab0a99e185059a941feefe2ec25b20d6e854dd530b95d@118.31.59.151:53717", "snode://7630acdc71105241a39a7b1725c145855c27e54bbe08f2806cd1a3d306cb407d8c0158742698dee848ba3d5f9992d56e3b1bc3b6f2b55ff159a45abdb3024d34@121.201.75.200:53717", "snode://8904be22328d88cdde7a9f259a5a210709b05dbd95c22b6df16f568ad19aafc94ece39966c3bbef4e7adfa8169b02405a7a82ca2083fdc3264354a506b9cdae0@182.61.22.130:53717", "snode://8fdaacf36133765f0b82a63e0abbc2402001bff5fbc1f4e290e761048aa847b75039e16efbe63217d4ba174ba8513a09418aa7c989ad2d868f01b619416d7514@39.104.121.215:53717", "snode://9162edcd147e13de27074bd908fd0107ff2c4adda8a410d46a0db8ae0feb4ed6518e9028939728eca7f44265320ee019ddf4eacda6d8c22970e4d16ef3d946e0@106.13.215.117:53727", "snode://98c6caf6bf71d326a85d792ae311157837b0fca5c7474ff3e78b5b81b8c97ae7404648f4aac4949746045324bcef83e15639706c806f2cab2aa180fe028819aa@119.23.46.14:53717", "snode://a45f419b3b20f327a1009669ab6d2642a86fe4c08b7bb39ce03f57cc9b584552acdd92c57981f92978833678f27cbb523daeac5f28caf8e17b550075941be677@183.2.149.217:53717", "snode://a9fa905c90dd9051a6a2e2edbba0a3c23c38d23ad9fd7fb47a4437d5f61ab80c05382f12c12cc5a360962d7f2271dd34dbd933ace888008620f02eb8522dad05@219.152.25.125:37168", "snode://ab964ae3dd5ea7744332e20b1a641ffad59063aae7f5e89b53eb04b1cc666899b22e6b951e811801645e51305bbc55df57e71c938678f47433a024fb645d25b1@119.148.162.131:53717", "snode://ae55a637218d40b7718d16d0ad82c91dbcaf72800a70da669426ef036a0bcf7eb6709a55ed675c3882ca734492c2358285d07f9b209e9d287270339299353253@49.232.53.87:53717", "snode://b3c2559e1790273a8355320bb98895fde3985f86c182d0f9cb5c00ea93b0d4b06ee8193eaf6dcbe3bf4866195fbae80f85d0c292e21328407e57ff1de55fdd53@129.204.197.105:53717", "snode://b5feccebd5d7908252e3b2e5ad7bcb1e71a0c9f13f5335a39a6cd534afbad64408480711b4528a4d2de3d063df5aa498c1326f6b54bc658afd99f6d04af789e7@94.191.35.64:53717", "snode://cbd8bb1c3d5ca59addb9a2c6c72f1a42826d46b6032bb22f3345c9e157d52e9d03c32ac022dd631828e0e061363d3f6e5e56c70e9b6f3f3e98a67e3f6fe28919@47.104.198.171:53717", "snode://d8c8257faeaa5cbd13185e632461593e61461ef4cab40fbf9a0fc997502f17f5f58ff47a92ed24e7ae3810dfff3d27511e807bec0ae55bd2f20021f679250c03@207.148.4.216:53717", "snode://d97fa94a1cf165d4a810189926b6c76553f7402bf80580a6c7e84b4e2c01003944fcc5d8fb46f015795d06708c917edb1d8f9f66210a1f73f1d15c70214c76a8@39.100.147.174:53717", "snode://e80e3b82bf60e20ad005c71196464621a1a0829791d5d42a6d3c814802b7a73d8075c9ae3bc794206b798d4391e3b809a5d18a39411af44b6bd3d9ac591ebd5b@129.204.27.217:53717", "snode://eb07c6e85fd25a8d1ee59b12645ae355264f6c1d47855aa4312374880b2dfda0572e8dc6e345e4da772f67cdbf64c99a37f47acb521bc040c4ed08cfb5b69fa7@49.235.43.231:53717", "snode://eb8bf52d6746c89709354c95eb2045a7fc8f75c4ba104238759e0a12f7df381486e956decf4b4ffe642f518c112cc3a305c1eee8633cd011a288db11af9b0774@18.162.219.184:53717", "snode://eeac837a47990f02e57814e4fe3661fd68ec9419bafc0d1f2a498aa25f635adccc0cf84553d291325acffead5bcec7fc9a838d724e30ac880c9d1a57f64b3ecb@47.75.120.213:55792", "snode://f518c5d7513a68e25b9bab8cd68749a30e1782ae2f6dd0da047a664c5517282128a44cec30fd16ab54cc5ba5c730371c74817618396088be93081a90eab63766@118.190.58.196:53717", "snode://221e2ad2237a3ec164bd8c7febe31336f0647b60e194d7def5b9fe9cf7ae09c33745b7c3cd833a8f05b5db282c41f2d35c72c3df38c594bcc054a4b35d54a93d@122.224.55.50:53717", "snode://eec8179a39aad4c793b24c978b2ebca2a8b97d60ee4ac1eee06e96a429c996501aee5fdd065129c065b0bfccadc1a88ed8d8b6ab4528677e01921f6f935599d7@101.37.124.82:53717", "snode://439b01f40e2a55c9e3a3773d1683f6f33d933a8bb4a23eabf493cd694bc2de8b1863ff62be3fe935afaefe34d960fa05497b23481ff267af3920be398419f3f3@118.31.57.191:53717", "snode://ebdc84f6c79a44e28efd3cc33743b7bdb192b566833acdf818df8398f87ecd849dae3cfe79017f0ad32e91e19b62cc5ed1ce85f459213ba86e46ab8b680819bb@13.56.113.11:53717", "snode://f518c5d7513a68e25b9bab8cd68749a30e1782ae2f6dd0da047a664c5517282128a44cec30fd16ab54cc5ba5c730371c74817618396088be93081a90eab63766@47.104.158.136:53717"] TrustedNodes = ["snode://4915b0bf79803f09701c2d0b9c9bb1eecc785f5247f14cd62cfca12e4fd3a8eda09f10d1e69eaace358f874cf61f057ebf29b0d63100c7c91265a5ddbbdaf4cd@35.72.78.242:53717","snode://e7a6fb6daf57ea645cbe2320f8eacfce41d8a6942388db3a60e313b5478863c458a71113269612eb83020def344c25d3e502f5606825414532f6292b01a85e8e@18.179.86.22:53717","snode://432ef6d07c8b5a45442abc73900cbc2a4d89f474804711ab487edf9f7b0ba9c8fb1e18c3038b06a3e2035aef35adb5b7939eeae618fd0436827ad37937621ff1@46.51.236.41:53717","snode://2d0a7329549489c6ae7ec5da5ffba3628dbb0bd2ed355e5a22d51e1d5966faebd1bd775a0819238a5f5182efcf386d56adfc5dad8db72c2f347319bed505442b@35.75.221.182:53717","snode://de325a736632a5b8a6e1f3a5755a1c7ab568171918d2a7f26560de4ac99e0cec2b87c487f8652e80d15f0ab3d1a1b6f6ddf1634bec48a34041101d885438e0c2@148.70.169.73:53717","snode://7fe0ac9ab365a18435dc67a92fe48be06b0fc5c5b4ef66135fc4ffbc48ffdd07bfdbc580128bba7bc29dd43c881bb41cf85b8a49015e937356fc6e855d3bc427@3.122.152.29:53717","snode://eb7e7fcf5f6a0adc4cfe8fe4dd1d364299f9163b8ee55cf0424a8f27762eeb64f8be591da98249d2acf48b1c26fef241331fc71ceaec24549b5979423d73f44a@119.28.83.127:53717","snode://0103521715dc9df9c56e52da9461d7ac8098e6ef15c5a7190a3a190b94fd1ba9222488fcd5c6314e76e379ece64c40085c3aa5cfa784fc5e6e913e16129eac49@139.227.219.135:58112","snode://01bba7334a62bb1ffcc803f29339dc3e63ee331f96ea81c4f47286ce93b4175c7bca031ee436fbf8ffdae0e9e65da29f112e971a91fd76f4ef474c8a55c19a15@47.92.110.203:58286","snode://075b618b1c9c20bc84c4ac6d467f5675d2104a238a5420c404673c805370d8ca550157ca31a9b15fcb70fabc1d47558c2e01732cc91b79e48bd3c08c68cf060e@183.192.21.53:9318","snode://0a355cf5bcfa2aed85766dbeb18d3deba604677be978358a24d11b88c7d4fdc23c640f69b3273e12ac2c9a0af5cf7f3aeb14be8b7b3b5173af37f13558efbc4b@119.8.161.47:32421","snode://0d0c32fb347bba04a1c0fe275bb7a787059bd39d7d941b35486657b5024446d5f79ee8b86d2df43105e99f381bb2c547dd6e239719e36cc1b534037445952fdc@175.10.229.187:63364","snode://114e95014903c6d849fefe54adc4d6617d4f2fb475847a4e606c56521d912994c16f36756191fb47bd330941fb299cad3eb30344a40f2f53797a161665dfe1f8@54.199.141.76:57722","snode://195444b38ca0edd380c276605ff3f04ac7c26bbc8e64d6f5da41e9ce846d5ff42a82620fdb41a57819bf61d1ae7268b6ba746a3c296829a966a89630c94cdbf5@118.114.15.211:50510","snode://198bbc7367577f0d8b4fb031b93fde625de9f3c51cbe8743204d07c277a41fccccbfa5ae425520039302cb9df0e8f7b4049681657acaaffac2fe9ec4af362cda@82.156.79.42:36538","snode://1e16c8515ec6edef8d482fe5ade9ed0eb9814d3074dae5d10efc9df16bdf4d252661efb9431c8f1c8013cfe7bf210de3ee8a008d0fec5347dd9557157b07fdaf@47.52.239.173:45512","snode://2dfcd0abecb348b647a44e629d40f309e829697d7bfd2f7fa9a030b6fd339a0ee92006f648b6f0cc853dda35595f1030cca6807dbfa1a15905b71eeb09c68dd2@81.71.74.202:53892","snode://302c7b5cfeb3886f3abe0c010012739c4f96423d5740c048740944cac6ad81112c5bbf9b0ef1655396bca30d805b31599d7d0cb39c35b8eedd137e0d9c08a7aa@113.80.58.137:17915","snode://31dad6ce943bfbe16435e6a27f1796ef7892092f99e6d862d09183336e0e755903ffcc44147c94c5ee5c93ef50b492b5201a94967fe054152bbb42ef2cfcd536@47.241.18.60:34966","snode://3402b086ce0ea6ed7eceda743f61292a4fe006c4637a421140c5c6f3ab83e91eb9d34422395856ae2e256b64f65a47e5c54f21dac071c6aa792d93d54a34501b@116.6.234.148:36558","snode://3a4609328986ad7ab3d6020cc80127a2b8fec2edce147e08b5d834c45aacba782035eb5256707b44aeb1cf10cd85afa2b24957274ca87a93264e09e63fbb920d@114.35.191.60:58660","snode://3ae5d553e78057fa33cad0ecf08b08fce9c2c50bbe5d2625b996b1322d8c96c74ca42dd54dbf5854cc6c70cd50a650e3b835c92e8f0e0adafcb47724413d16e2@13.251.221.90:60602","snode://3da969d4e1c00dfcf0be98b49ee86493f056fecd1f478e39425ba57589f4a327b16b09ff2cce73642fc92c2b194470be93f40b2c90a1ebc94b2a949708710bbe@37.77.124.110:23683","snode://4894429cd7a4ba7ea113a849f305df93db8619e2daebd4ea044015a1c8751ab49e3c4ff3cb8bdbcc4420e17b6870beabbf8275161db7f6a8e15879edd83a50f2@119.29.87.107:50096","snode://4b51fe1f0b14eea419e1f27c9327e34ce5c8a5211d943a86da252a517b748202179306bd911dfff46dc79264d7a43f034c7314116a4b9190c90d5401b1a2ba60@47.91.229.226:39012","snode://4cb03b8da934fcbb41853c1feba54cabe48279088b6e13179172939ecc3fb4d442d3464004ad8ace9fd74d8e8243e992efa6c68f8e3516a6795e4220a5eac64a@220.249.20.182:54181","snode://4d6d46f319b3e1d645b26e0a3ccccc31f3bca4a43101c2f74eb47e668f0f55b13cf2a11ba97f891732e4c8ce5de35c652904f2721db6e1a1699a1163112fa419@47.244.130.159:16663","snode://5162ddf8b2470e12d6ad8b696249a22273237f131e1e33ed1c234ad128404750b6faa83cfe7df890558e606842fc7ca3b8c450bc70b6edf11238a4762f8f9010@47.74.218.250:55024","snode://57d8c7f37d71fc626ea310e25ac73373986c829dbe214f9e5cf922f98a5371ca4cc796b96fc6144440de452e8c017a5f67e5c34adec02f0a41bb9fe6a0382e3a@113.207.31.87:44330","snode://59e8a0e520751a1c4cd55f52e99be5a9cd2c54c516d04a9e71d04b52739633a629932cb7a0e1504981fa1c0e8314dedf999d1b5cfdcb95268b053a67ce3eae1b@139.227.219.135:57474","snode://5b0c2928729f35ed3d841cb45ba4a27e80f282ee1d1099d25a0f032a89729c7845a961dcb754ba29f64b526eeefb99d48b3c77de8281c19a6775e6662a5ddfe5@121.5.248.202:33782","snode://5b45b450ab57902eabe748229e39b12324ec30ba31930625db0e7b588d30fc29b57ea48866230a798100f49e22061ccf3f7a4d8e9150cd800ba9d62e4e6af253@223.11.174.161:20058","snode://60ccd7b69c94ac32bb9d8972e18d7b5f183cdf9d642f267cbded78393cb993ff93977c901eb7663dd41f2023793eba28ce17a70a3e9dad050158c32d7b239b64@82.156.185.216:52646","snode://674a27dae43e3208d68c93d05a6df1a4c4eb06088dae2ac8138f5bc654a31617d0a5ae8e68c5dae896550683d3818e536a6efae7d4b8a524fcce20a767a093ec@220.162.164.173:37360","snode://6a59045c1b31433776ea722f7ed94b196b091ba0072108851b64b7bd51b78ab26c933499216a1ad87316c40ce55edf85f970b9d43711b3a1130b192ba9fa7148@8.210.143.94:37104","snode://6e7cd5cef0993c36bfd010c4afe4459022fd0d94b04bd2099a6b7183a22371e5d469dddf1505ed120d326dc0b19523cdbabe08be23056fbb46c319ad9d975059@49.232.11.26:34094","snode://79890afc4003b2af25e2e772288444a228876d949b2c4b231728f822ce54a266a69d3ea2bef48d43b0a75985da685b05695678e759149c80b5583aea814cc0a5@161.117.88.198:50746","snode://8016c274d492652ca4e95a3943f9f7dfb0c5cf170183f7d78b2a362677c10ebd170f592fdfa21840fcf084b02d00e28e7a25674a701ac97e2baa56d6c6923304@39.98.160.98:47392","snode://82791b0d9b08af9ce172eeac79a033e5ca653198bd6c135ce5c46566d2b8b65a363c76fec319201837cd65f73173e5cdfe9540fedbbb13dee08d57f1747a1e39@47.52.117.20:47722","snode://8341c0f4d88d05b306ce6e3721357aca0dc986d2eb467996c6cee3ce700ad1117240181d7c4b9e8d9d6c2b988b599b2eb809b9cc4a4cce2eca9037cbaa555684@139.186.25.132:59224","snode://83f5056125418a3a048eaf6806da7b31ad398acff2f9fee4d776951d6b74b32ed9723cd974d62d767eb8fcf994e397783d19d3b2ca18bab315c9b236bb5a50dc@47.245.8.129:59134","snode://8667855215e6f6be95bcd667a6a68aeae9d08a64321cd06eb04d4331af13df7fd305aa9320db8430c2e636529f6fc43fffc0895d5e2b5d6e602be26bf699859d@119.28.83.127:50122","snode://90d84ce3afcaf386ac14a6ba8c52d12e406b09a8a081c0cbd4b3f2636d964fb657a4300c5f9d7b109214c4b7c6244954baabccd324b77407c2db10dff72779ed@35.182.111.60:47006","snode://933bdc6bae33b6c4fc5f19be1638a717060d524890fedf20997ee51535d97bf30cc4d5eb1ad6ccfffbbd1fa5ba9c435aabd47519f7324447a500e4851eb54731@15.165.129.2:53844","snode://a126269ed24e174d84b10c71554cb6d579759f7b82c6fc23a752a6e3c1b451124a463c25b31ba29f6f2477461689706fa68033ddbdee58db5704139e17524dec@113.80.8.19:6486","snode://a6cf3cd8f77618c2474b947950b27686794481b11eb7b0f139c6a6d66601b04e9142111920883a161ce1645e4ad27a07f5032688ec47fe4f3af857bd91ae6419@3.1.119.147:46646","snode://a8c60fffc0739aea0c2bd811eb11e0567e8fcc9b0d8c2eea14a38a084ab602637565875dbfe8b2b7729a957b811ee2775841235459d498deb9e265a62b5db74b@120.133.230.86:14009","snode://a96890d5a1f3fa0b5a0db7544036000e75022d16eba4e80e4b572ebb80d10406dc688da3135c05e8c015d8cdb4a1b0647377f432ec70228dbfa2718b4815aaa7@118.195.137.245:40294","snode://a9fee1ff7ccedfde6fa2640e3a67daf75bb6621dadae0c527164a3f62cb8a92a22672d9355da8fbfb611e9613c93f69ba62a522352b515311f73d7ee6222dfa8@139.227.219.32:54888","snode://b1027d307fd740d341336c976ea04e91747151b34d3af855722d096c9ee6989232b8ed05df28b50fa3452cd66daa74e594b1b152d64e03870993171b5eb79484@47.90.29.31:4565","snode://b5094a362450326d51c800dcd9d4d159fac99d5b0d3e16df319cc9c22d13a2c96aa0475d6d0674d7309eb123d119c008a8a2fa861e61b6fdaeda77c5d2f42170@39.99.193.30:35824","snode://bb14fb0494b30d47329b1123c1cca0d82636f648e5fbdd8cbdce5bee39178ac18dfdce517450a49e8da7b8048d44d3e1432ed913d7315bef37fdc128b3e20c73@106.55.164.94:38572","snode://bbcd7ca0319143d52ff4cdafe42bae8da23f51375b134251f80a9f46c7eb7c5148fa5db6af99bebcef24df72a9f9a0574c93c4f672ac6cbef58c96a2d2a5f4e9@54.248.0.58:25145","snode://bbd781a1f7c9c630da6011b86d56c2400217189b017c7fa059fd9c073ae5d82fd416d3ac2392c508952a87bf7c8897b32aa1afeffb5ef55a970d92c25ca3ba91@153.37.113.158:1212","snode://bc35396bd68c5d118fe07a01fc3151c25bb9e451348328be123f5e3f2c4bf4dd664de62fca4f0f54d9ebac0b530a4e6c2b1178a6374a6392078de988ccb1722b@52.199.145.159:36880","snode://c6d1696c24a6a5d367419bcd480a62be7d71c6d9af9da86c0057b9145ae3c231bf4012d2448df181afd222f99e4b1bf22764b85058c25b49ece455db880230bf@117.143.152.134:35750","snode://c97675ba95fad33adbc75de86db958712a98cd4d450f15b88a809f1f0a3c86d328a1113b1233771a00687a0b47510143c43deb9ee189882539b555331bcad96f@106.37.187.196:37837","snode://ca9cdd78a8177f7bcf88b53a0a53c644b42d5d0071fdfb0dd35dc88197a50b89d45a320cbcd37480de907e3a8b547f0189072a373d0111d9037c3cc527af4224@42.239.187.207:7452","snode://d38486265445e380881c6cfd2785ee6ca14c65b51539c017289bc52c3020f1fd86b93e464b91040b519602d7c30a9530843220a52d431178698c65bbddd7a05c@112.5.37.188:47766","snode://dade51f41aa7bb0fbb1ac7e891518f53f99905c87d75dd900bb229645a2194e9ae0aeebbe4bc476b4974087028bc834c94ef7e9c418e653ea0a27ee2c6e80708@47.74.33.102:62998","snode://e186ee3b613e61e56f16ddbb0ea6eca9cf4ba7e5dddd6323ef5f521cb271eefe15a3f4b177904deb61c8f8d2fab0684715afa640febcab57ee1c5e2a3fa5e4af@118.190.174.81:47574","snode://e4df94cb7793be82f1079b77dd1007f82560b97d1b769ff31918acc62cd5312356a0a073981a57d704535a42fcd10431dc37b92746309dbd526eeb3e4eaef347@222.175.37.251:55040","snode://edaa5ced463d12f47656b12eb148bbc724ddd3e8a87196ed2dcbf76f715e8d366e63140e90283cf6012a7e228fdefa54b740ad5ea20dad5fc748510890f8b269@106.52.12.56:36504","snode://efa20fd5252bc246d4c17e79253a5e67b2729be3c6b811e5ecf3f0736b924404d9b81a8194d1169c50efcedfc6cc67bc9282214e3744d1d2fb769fffabd039b0@121.28.150.66:51936","snode://f1fb490e23124c85728be74a23697545cd37327eee74238b0cad3e420a6fabb77ac33f2b9635c35a3f9d56683ed75bfce2fb0897482201174a4deb5d76a1b201@113.107.201.131:36564","snode://f488a626dcffd1a29e8bae1af5260cd07bd62a4a56382fb9b6ace73414851f3255b3f51be7ceb3f63eaea972a8fea203369ac8964ce81d98f3652ab595ab6262@39.98.171.56:33654","snode://f565ffc01ddd13a1cfee6891c6dd94f91b755554a38f0aee5e22d9fbd662ed8fb0582e53cb66bbc08880c98675821ce6db50bd05d133aa35bdcb72332ef4fdd0@18.138.166.33:52664","snode://f6d6dae8d9c5352fe0275f000162b9c531ba17ddc02daa0d877d78a80a0fbd76252139abe8278f3b12b62a597a4908e9f31b471be464e4f18fd9e8c10a366c4c@170.106.9.156:57636","snode://fa2b7ce6530d81fe5df1cf187b233701909bbfe617bccf16700fb954920a0b697bdca813c852db5fe3596bf6896c006453477aaaf75a1c6692990f485fcd17df@80.83.242.233:58821","snode://fa85968fa99e147281d1945b92cba7a4a29948f2c9b77488c3e7332fb94443e3aae5ed6ef6845b46323322ad1afbbb3bb86addc3c01ba60d24f19ca1f9757af2@113.107.201.136:37796","snode://fb50232b60fb445fe2f884fd8739dfac5f54209f38e1516bd81c70c668121efe495a7b52bab98354bdffd0db15d36eebe6b223a6961ad143854afe3dabc010ba@35.236.186.171:50366","snode://fce4f6233c664d17b4f0c075d72e4671fd7af254594cb7975c99e5d4670f38f1b67b0d636fb993116b1cca942fb163a6155b921752d5a7706a4a2aecc828d103@120.229.31.74:11628"] ================================================ FILE: build/geropkg/startup.bat ================================================ @echo off set CURRENT=%cd% set LIB_PATH=%CURRENT%\czero\lib set path=%LIB_PATH% set DATADIR= set KEYSTORE= set d=%1 if "%d%" neq "" ( set DATADIR=--datadir %d% ) set k=%2 if "%k%" neq "" ( set KEYSTORE=--keystore %k% ) start /b bin\gero.exe --config geroConfig.toml --exchange --mineMode %DATADIR% %KEYSTORE% pause ================================================ FILE: build/geropkg/startup.sh ================================================ #!/bin/sh show_usage="args: [-d ,-k, -p, -n,-r,-h]\ [--datadir=,--keystore=, --port=, --net=, --rpc=,--help]" export DYLD_LIBRARY_PATH="./czero/lib/" export LD_LIBRARY_PATH="./czero/lib/" DEFAULT_DATD_DIR="./data" LOGDIR="./log" DEFAULT_PORT=53717 CONFIG_PATH="./geroConfig.toml" DATADIR_OPTION=${DEFAULT_DATD_DIR} NET_OPTION="" RPC_OPTION="" PORT_OPTION=${DEFAULT_PORT} KEYSTORE_OPTION="" GETOPT_ARGS=`getopt -o d:k:p:n:r:h -al datadir:,keystore:,port:,net:,rpc:,help -- "$@"` eval set -- "$GETOPT_ARGS" while [ -n "$1" ] do case "$1" in -d|--datadir) DATADIR_OPTION=$2; shift 2;; -p|--port) PORT_OPTION=$2; shift 2;; -n|--net) NET_OPTION=--$2; shift 2;; -k|--keystore) KEYSTORE_OPTION="--keystore $2"; shift 2;; -r|--rpc) localhost=$(hostname -I|awk -F ' ' '{print $1}') RPC_OPTION="$cmd --rpc --rpcport $2 --rpcaddr $localhost --rpccorsdomain '*'"; shift 2;; -h|--help) echo $show_usage;exit 0;; --) break ;; esac done cmd="bin/gero --config ${CONFIG_PATH} --exchange --mineMode --datadir ${DATADIR_OPTION} --port ${PORT_OPTION} ${NET_OPTION} ${RPC_OPTION} ${KEYSTORE_OPTION}" mkdir -p $LOGDIR echo $cmd current=`date "+%Y-%m-%d"` logName="gero_$current.log" sh stop.sh nohup ${cmd} >> "${LOGDIR}/${logName}" 2>&1 & echo $! > "./pid" ================================================ FILE: build/geropkg/startupEx.sh ================================================ #!/bin/sh export DYLD_LIBRARY_PATH="./czero/lib/" export LD_LIBRARY_PATH="./czero/lib/" DEFAULT_DATD_DIR="./data" LOGDIR="./log" DEFAULT_PORT=53717 CONFIG_PATH="./geroConfig.toml" DATADIR_OPTION=${DEFAULT_DATD_DIR} RPC_OPTION="--rpc --rpcport 8545 --rpcapi exchange,sero,net --rpcaddr 127.0.0.1 --rpccorsdomain=*" cmd="bin/gero --mineMode --config ${CONFIG_PATH} --datadir ${DATADIR_OPTION} --port ${DEFAULT_PORT} ${RPC_OPTION} --confirmedBlock 32 --rpcwritetimeout 1800 --exchangeValueStr" mkdir -p $LOGDIR echo $cmd current=`date "+%Y-%m-%d"` logName="posGero_$current.log" sh stop.sh nohup ${cmd} >> "${LOGDIR}/${logName}" 2>&1 & echo $! > "./pid" ================================================ FILE: build/geropkg/startupVoter.bat ================================================ @echo off set CURRENT=%cd% set LIB_PATH=%CURRENT%\czero\lib set path=%LIB_PATH% set DATADIR= set KEYSTORE= set VOTER= set VOTER_PASSWORD_PATH= set v=%1 if "%v%" neq "" ( set VOTER=--unlock %V% ) set p=%2 if "%v%" neq "" ( set VOTER_PASSWORD_PATH=--password %p% ) set d=%3 if "%d%" neq "" ( set DATADIR=--datadir %d% ) set k=%4 if "%k%" neq "" ( set KEYSTORE=--keystore %k% ) start /b bin\gero.exe --config geroConfig.toml --exchange --mineMode %DATADIR% %KEYSTORE% %VOTER% %VOTER_PASSWORD_PATH% pause ================================================ FILE: build/geropkg/startupVoter.sh ================================================ #!/bin/sh show_usage="args: [-d ,-k, -p, -n,-r,-h]\ [--datadir=,--keystore=, --port=, --net=, --rpc=,--help]" export DYLD_LIBRARY_PATH="./czero/lib/" export LD_LIBRARY_PATH="./czero/lib/" DEFAULT_DATD_DIR="./data" LOGDIR="./log" DEFAULT_PORT=53717 CONFIG_PATH="./geroConfig.toml" DATADIR_OPTION=${DEFAULT_DATD_DIR} KEYSTORE_OPTION="" VOTER="" VOTER_PASSWORD_PATH="" GETOPT_ARGS=`getopt -o d:k:p:v:f:h -al datadir:,keystore:,port:,voter:,pf:,help -- "$@"` eval set -- "$GETOPT_ARGS" while [ -n "$1" ] do case "$1" in -d|--datadir) DATADIR_OPTION=$2; shift 2;; -p|--port) DEFAULT_PORT=$2; shift 2;; -v|--voter) VOTER=$2; shift 2;; -k|--keystore) KEYSTORE_OPTION="--keystore $2"; shift 2;; -f|--pf) VOTER_PASSWORD_PATH=$2; shift 2;; -h|--help) echo $show_usage;exit 0;; --) break ;; esac done cmd="bin/gero --mineMode --config ${CONFIG_PATH} --unlock ${VOTER} --password ${VOTER_PASSWORD_PATH} --datadir ${DATADIR_OPTION} --port ${DEFAULT_PORT} ${KEYSTORE_OPTION}" mkdir -p $LOGDIR echo $cmd current=`date "+%Y-%m-%d"` logName="posGero_$current.log" sh stop.sh nohup ${cmd} >> "${LOGDIR}/${logName}" 2>&1 & echo $! > "./pid" ================================================ FILE: build/geropkg/stop.sh ================================================ #!/bin/sh if [ -f "pid" ];then kill -INT `cat pid` rm -rf pid fi ================================================ FILE: build/goimports.sh ================================================ #!/bin/sh find_files() { find . ! \( \ \( \ -path '.github' \ -o -path './build/_workspace' \ -o -path './build/bin' \ -o -path './crypto/bn256' \ -o -path '*/vendor/*' \ \) -prune \ \) -name '*.go' } GOFMT="gofmt -s -w" GOIMPORTS="goimports -w" find_files | xargs $GOFMT find_files | xargs $GOIMPORTS ================================================ FILE: build/install.sh ================================================ #! /bin/sh _GOPATH=`cd ../../../../../;pwd` export GOPATH=$_GOPATH echo $GOPATH go install -v ../cmd/gero go install -v ../cmd/serokey ================================================ FILE: build/pod.podspec ================================================ Pod::Spec.new do |spec| spec.name = 'Geth' spec.version = '{{.Version}}' spec.license = { :type => 'GNU Lesser General Public License, Version 3.0' } spec.homepage = 'https://github.com/ethereum/go-sero' spec.authors = { {{range .Contributors}} '{{.Name}}' => '{{.Email}}',{{end}} } spec.summary = 'iOS Ethereum Client' spec.source = { :git => 'https://github.com/ethereum/go-sero.git', :commit => '{{.Commit}}' } spec.platform = :ios spec.ios.deployment_target = '9.0' spec.ios.vendored_frameworks = 'Frameworks/Geth.framework' spec.prepare_command = <<-CMD curl https://gethstore.blob.core.windows.net/builds/{{.Archive}}.tar.gz | tar -xvz mkdir Frameworks mv {{.Archive}}/Geth.framework Frameworks rm -rf {{.Archive}} CMD end ================================================ FILE: build/update-license.go ================================================ // +build none /* This command generates GPL license headers on top of all source files. You can run it once per month, before cutting a release or just whenever you feel like it. go run update-license.go All authors (people who have contributed code) are listed in the AUTHORS file. The author names are mapped and deduplicated using the .mailmap file. You can use .mailmap to set the canonical name and address for each author. See git-shortlog(1) for an explanation of the .mailmap format. Please review the resulting diff to check whether the correct copyright assignments are performed. */ package main import ( "bufio" "bytes" "fmt" "io/ioutil" "log" "os" "os/exec" "path/filepath" "regexp" "runtime" "sort" "strconv" "strings" "sync" "text/template" "time" ) var ( // only files with these extensions will be considered extensions = []string{".go", ".js", ".qml"} // paths with any of these prefixes will be skipped skipPrefixes = []string{ // boring stuff "vendor/", "tests/testdata/", "build/", // don't relicense vendored sources "cmd/internal/browser", "consensus/ethash/xor.go", "crypto/bn256/", "crypto/ecies/", "crypto/secp256k1/curve.go", "crypto/sha3/", "internal/jsre/deps", "log/", "common/bitutil/bitutil", // don't license generated files "contracts/chequebook/contract/code.go", } // paths with this prefix are licensed as GPL. all other files are LGPL. gplPrefixes = []string{"cmd/"} // this regexp must match the entire license comment at the // beginning of each file. licenseCommentRE = regexp.MustCompile(`^//\s*(Copyright|This file is part of).*?\n(?://.*?\n)*\n*`) // this text appears at the start of AUTHORS authorsFileHeader = "# This is the official list of go-ethereum authors for copyright purposes.\n\n" ) // this template generates the license comment. // its input is an info structure. var licenseT = template.Must(template.New("").Parse(` // Copyright {{.Year}} The go-ethereum Authors // This file is part of {{.Whole false}}. // // {{.Whole true}} is free software: you can redistribute it and/or modify // it under the terms of the GNU {{.License}} as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // {{.Whole true}} is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU {{.License}} for more details. // // You should have received a copy of the GNU {{.License}} // along with {{.Whole false}}. If not, see . `[1:])) type info struct { file string Year int64 } func (i info) License() string { if i.gpl() { return "General Public License" } return "Lesser General Public License" } func (i info) ShortLicense() string { if i.gpl() { return "GPL" } return "LGPL" } func (i info) Whole(startOfSentence bool) string { if i.gpl() { return "go-sero" } if startOfSentence { return "The go-ethereum library" } return "the go-ethereum library" } func (i info) gpl() bool { for _, p := range gplPrefixes { if strings.HasPrefix(i.file, p) { return true } } return false } func main() { var ( files = getFiles() filec = make(chan string) infoc = make(chan *info, 20) wg sync.WaitGroup ) writeAuthors(files) go func() { for _, f := range files { filec <- f } close(filec) }() for i := runtime.NumCPU(); i >= 0; i-- { // getting file info is slow and needs to be parallel. // it traverses git history for each file. wg.Add(1) go getInfo(filec, infoc, &wg) } go func() { wg.Wait() close(infoc) }() writeLicenses(infoc) } func skipFile(path string) bool { if strings.Contains(path, "/testdata/") { return true } for _, p := range skipPrefixes { if strings.HasPrefix(path, p) { return true } } return false } func getFiles() []string { cmd := exec.Command("git", "ls-tree", "-r", "--name-only", "HEAD") var files []string err := doLines(cmd, func(line string) { if skipFile(line) { return } ext := filepath.Ext(line) for _, wantExt := range extensions { if ext == wantExt { goto keep } } return keep: files = append(files, line) }) if err != nil { log.Fatal("error getting files:", err) } return files } var authorRegexp = regexp.MustCompile(`\s*[0-9]+\s*(.*)`) func gitAuthors(files []string) []string { cmds := []string{"shortlog", "-s", "-n", "-e", "HEAD", "--"} cmds = append(cmds, files...) cmd := exec.Command("git", cmds...) var authors []string err := doLines(cmd, func(line string) { m := authorRegexp.FindStringSubmatch(line) if len(m) > 1 { authors = append(authors, m[1]) } }) if err != nil { log.Fatalln("error getting authors:", err) } return authors } func readAuthors() []string { content, err := ioutil.ReadFile("AUTHORS") if err != nil && !os.IsNotExist(err) { log.Fatalln("error reading AUTHORS:", err) } var authors []string for _, a := range bytes.Split(content, []byte("\n")) { if len(a) > 0 && a[0] != '#' { authors = append(authors, string(a)) } } // Retranslate existing authors through .mailmap. // This should catch email address changes. authors = mailmapLookup(authors) return authors } func mailmapLookup(authors []string) []string { if len(authors) == 0 { return nil } cmds := []string{"check-mailmap", "--"} cmds = append(cmds, authors...) cmd := exec.Command("git", cmds...) var translated []string err := doLines(cmd, func(line string) { translated = append(translated, line) }) if err != nil { log.Fatalln("error translating authors:", err) } return translated } func writeAuthors(files []string) { merge := make(map[string]bool) // Add authors that Git reports as contributorxs. // This is the primary source of author information. for _, a := range gitAuthors(files) { merge[a] = true } // Add existing authors from the file. This should ensure that we // never lose authors, even if Git stops listing them. We can also // add authors manually this way. for _, a := range readAuthors() { merge[a] = true } // Write sorted list of authors back to the file. var result []string for a := range merge { result = append(result, a) } sort.Strings(result) content := new(bytes.Buffer) content.WriteString(authorsFileHeader) for _, a := range result { content.WriteString(a) content.WriteString("\n") } fmt.Println("writing AUTHORS") if err := ioutil.WriteFile("AUTHORS", content.Bytes(), 0644); err != nil { log.Fatalln(err) } } func getInfo(files <-chan string, out chan<- *info, wg *sync.WaitGroup) { for file := range files { stat, err := os.Lstat(file) if err != nil { fmt.Printf("ERROR %s: %v\n", file, err) continue } if !stat.Mode().IsRegular() { continue } if isGenerated(file) { continue } info, err := fileInfo(file) if err != nil { fmt.Printf("ERROR %s: %v\n", file, err) continue } out <- info } wg.Done() } func isGenerated(file string) bool { fd, err := os.Open(file) if err != nil { return false } defer fd.Close() buf := make([]byte, 2048) n, _ := fd.Read(buf) buf = buf[:n] for _, l := range bytes.Split(buf, []byte("\n")) { if bytes.HasPrefix(l, []byte("// Code generated")) { return true } } return false } // fileInfo finds the lowest year in which the given file was committed. func fileInfo(file string) (*info, error) { info := &info{file: file, Year: int64(time.Now().Year())} cmd := exec.Command("git", "log", "--follow", "--find-renames=80", "--find-copies=80", "--pretty=format:%ai", "--", file) err := doLines(cmd, func(line string) { y, err := strconv.ParseInt(line[:4], 10, 64) if err != nil { fmt.Printf("cannot parse year: %q", line[:4]) } if y < info.Year { info.Year = y } }) return info, err } func writeLicenses(infos <-chan *info) { for i := range infos { writeLicense(i) } } func writeLicense(info *info) { fi, err := os.Stat(info.file) if os.IsNotExist(err) { fmt.Println("skipping (does not exist)", info.file) return } if err != nil { log.Fatalf("error stat'ing %s: %v\n", info.file, err) } content, err := ioutil.ReadFile(info.file) if err != nil { log.Fatalf("error reading %s: %v\n", info.file, err) } // Construct new file content. buf := new(bytes.Buffer) licenseT.Execute(buf, info) if m := licenseCommentRE.FindIndex(content); m != nil && m[0] == 0 { buf.Write(content[:m[0]]) buf.Write(content[m[1]:]) } else { buf.Write(content) } // Write it to the file. if bytes.Equal(content, buf.Bytes()) { fmt.Println("skipping (no changes)", info.file) return } fmt.Println("writing", info.ShortLicense(), info.file) if err := ioutil.WriteFile(info.file, buf.Bytes(), fi.Mode()); err != nil { log.Fatalf("error writing %s: %v", info.file, err) } } func doLines(cmd *exec.Cmd, f func(string)) error { stdout, err := cmd.StdoutPipe() if err != nil { return err } if err := cmd.Start(); err != nil { return err } s := bufio.NewScanner(stdout) for s.Scan() { f(s.Text()) } if s.Err() != nil { return s.Err() } if err := cmd.Wait(); err != nil { return fmt.Errorf("%v (for %s)", err, strings.Join(cmd.Args, " ")) } return nil } ================================================ FILE: circle.yml ================================================ machine: services: - docker dependencies: cache_directories: - "~/.ethash" # Cache the ethash DAG generated by hive for consecutive builds - "~/.docker" # Cache all docker images manually to avoid lengthy rebuilds override: # Restore all previously cached docker images - mkdir -p ~/.docker - for img in `ls ~/.docker`; do docker load -i ~/.docker/$img; done # Pull in and hive, restore cached ethash DAGs and do a dry run - go get -u github.com/karalabe/hive - (cd ~/.go_workspace/src/github.com/karalabe/hive && mkdir -p workspace/ethash/ ~/.ethash) - (cd ~/.go_workspace/src/github.com/karalabe/hive && cp -r ~/.ethash/. workspace/ethash/) - (cd ~/.go_workspace/src/github.com/karalabe/hive && hive --docker-noshell --client=NONE --test=. --sim=. --loglevel=6) # Cache all the docker images and the ethash DAGs - for img in `docker images | grep -v "^" | tail -n +2 | awk '{print $1}'`; do docker save $img > ~/.docker/`echo $img | tr '/' ':'`.tar; done - cp -r ~/.go_workspace/src/github.com/karalabe/hive/workspace/ethash/. ~/.ethash test: override: # Build Geth and move into a known folder - make geth - cp ./build/bin/geth $HOME/geth # Run hive and move all generated logs into the public artifacts folder - (cd ~/.go_workspace/src/github.com/karalabe/hive && hive --docker-noshell --client=go-ethereum:local --override=$HOME/geth --test=. --sim=.) - cp -r ~/.go_workspace/src/github.com/karalabe/hive/workspace/logs/* $CIRCLE_ARTIFACTS ================================================ FILE: cmd/abigen/main.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of go-ethereum. // // go-ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // go-ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with go-ethereum. If not, see . package main import ( "encoding/json" "fmt" "io/ioutil" "os" "strings" "github.com/sero-cash/go-sero/accounts/abi/bind" "github.com/sero-cash/go-sero/cmd/utils" "github.com/sero-cash/go-sero/common/compiler" "github.com/sero-cash/go-sero/crypto" "github.com/sero-cash/go-sero/log" "gopkg.in/urfave/cli.v1" ) const ( commandHelperTemplate = `{{.Name}}{{if .Subcommands}} command{{end}}{{if .Flags}} [command options]{{end}} [arguments...] {{if .Description}}{{.Description}} {{end}}{{if .Subcommands}} SUBCOMMANDS: {{range .Subcommands}}{{.Name}}{{with .ShortName}}, {{.}}{{end}}{{ "\t" }}{{.Usage}} {{end}}{{end}}{{if .Flags}} OPTIONS: {{range $.Flags}}{{"\t"}}{{.}} {{end}} {{end}}` ) var ( // Git SHA1 commit hash of the release (set via linker flags) gitCommit = "" //gitDate = "" app *cli.App // Flags needed by abigen abiFlag = cli.StringFlag{ Name: "abi", Usage: "Path to the Sero contract ABI json to bind, - for STDIN", } binFlag = cli.StringFlag{ Name: "bin", Usage: "Path to the Sero contract bytecode (generate deploy method)", } typeFlag = cli.StringFlag{ Name: "type", Usage: "Struct name for the binding (default = package name)", } jsonFlag = cli.StringFlag{ Name: "combined-json", Usage: "Path to the combined-json file generated by compiler", } solFlag = cli.StringFlag{ Name: "sol", Usage: "Path to the Sero contract Solidity source to build and bind", } solcFlag = cli.StringFlag{ Name: "solc", Usage: "Solidity compiler to use if source builds are requested", Value: "solc", } excFlag = cli.StringFlag{ Name: "exc", Usage: "Comma separated types to exclude from binding", } pkgFlag = cli.StringFlag{ Name: "pkg", Usage: "Package name to generate the binding into", } outFlag = cli.StringFlag{ Name: "out", Usage: "Output file for the generated binding (default = stdout)", } langFlag = cli.StringFlag{ Name: "lang", Usage: "Destination language for the bindings (go, java, objc)", Value: "go", } ) func init() { app = utils.NewApp(gitCommit, "ethereum checkpoint helper tool") app.Flags = []cli.Flag{ abiFlag, binFlag, typeFlag, jsonFlag, solFlag, solcFlag, excFlag, pkgFlag, outFlag, langFlag, } app.Action = utils.MigrateFlags(abigen) cli.CommandHelpTemplate = commandHelperTemplate } func abigen(c *cli.Context) error { utils.CheckExclusive(c, abiFlag, jsonFlag, solFlag) // Only one source can be selected. if c.GlobalString(pkgFlag.Name) == "" { utils.Fatalf("No destination package specified (--pkg)") } var lang bind.Lang switch c.GlobalString(langFlag.Name) { case "go": lang = bind.LangGo default: utils.Fatalf("Unsupported destination language \"%s\" (--lang)", c.GlobalString(langFlag.Name)) } // If the entire solidity code was specified, build and bind based on that var ( abis []string bins []string types []string sigs []map[string]string libs = make(map[string]string) ) if c.GlobalString(abiFlag.Name) != "" { // Load up the ABI, optional bytecode and type name from the parameters var ( abi []byte err error ) input := c.GlobalString(abiFlag.Name) if input == "-" { abi, err = ioutil.ReadAll(os.Stdin) } else { abi, err = ioutil.ReadFile(input) } if err != nil { utils.Fatalf("Failed to read input ABI: %v", err) } abis = append(abis, string(abi)) var bin []byte if binFile := c.GlobalString(binFlag.Name); binFile != "" { if bin, err = ioutil.ReadFile(binFile); err != nil { utils.Fatalf("Failed to read input bytecode: %v", err) } if strings.Contains(string(bin), "//") { utils.Fatalf("Contract has additional library references, please use other mode(e.g. --combined-json) to catch library infos") } } bins = append(bins, string(bin)) kind := c.GlobalString(typeFlag.Name) if kind == "" { kind = c.GlobalString(pkgFlag.Name) } types = append(types, kind) } else { // Generate the list of types to exclude from binding exclude := make(map[string]bool) for _, kind := range strings.Split(c.GlobalString(excFlag.Name), ",") { exclude[strings.ToLower(kind)] = true } var err error var contracts map[string]*compiler.Contract switch { case c.GlobalIsSet(solFlag.Name): contracts, err = compiler.CompileSolidity(c.GlobalString(solcFlag.Name), c.GlobalString(solFlag.Name)) if err != nil { utils.Fatalf("Failed to build Solidity contract: %v", err) } case c.GlobalIsSet(jsonFlag.Name): jsonOutput, err := ioutil.ReadFile(c.GlobalString(jsonFlag.Name)) if err != nil { utils.Fatalf("Failed to read combined-json from compiler: %v", err) } contracts, err = compiler.ParseCombinedJSON(jsonOutput, "", "", "", "") if err != nil { utils.Fatalf("Failed to read contract information from json output: %v", err) } } // Gather all non-excluded contract for binding for name, contract := range contracts { if exclude[strings.ToLower(name)] { continue } abi, err := json.Marshal(contract.Info.AbiDefinition) // Flatten the compiler parse if err != nil { utils.Fatalf("Failed to parse ABIs from compiler output: %v", err) } abis = append(abis, string(abi)) bins = append(bins, contract.Code) sigs = append(sigs, contract.Hashes) nameParts := strings.Split(name, ":") types = append(types, nameParts[len(nameParts)-1]) libPattern := crypto.Keccak256Hash([]byte(name)).String()[2:36] libs[libPattern] = nameParts[len(nameParts)-1] } } // Generate the contract binding code, err := bind.Bind(types, abis, bins, sigs, c.GlobalString(pkgFlag.Name), lang, libs, nil) if err != nil { utils.Fatalf("Failed to generate ABI binding: %v", err) } // Either flush it out to a file or display on the standard output if !c.GlobalIsSet(outFlag.Name) { fmt.Printf("%s\n", code) return nil } if err := ioutil.WriteFile(c.GlobalString(outFlag.Name), []byte(code), 0600); err != nil { utils.Fatalf("Failed to write ABI binding: %v", err) } return nil } func main() { log.Root().SetHandler(log.LvlFilterHandler(log.LvlInfo, log.StreamHandler(os.Stderr, log.TerminalFormat(true)))) if err := app.Run(os.Args); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } } ================================================ FILE: cmd/bootnode/main.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of go-ethereum. // // go-ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // go-ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with go-ethereum. If not, see . // bootnode runs a bootstrap node for the Ethereum Discovery Protocol. package main import ( "crypto/ecdsa" "flag" "fmt" "net" "os" "github.com/sero-cash/go-sero/cmd/utils" "github.com/sero-cash/go-sero/crypto" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/p2p/discover" "github.com/sero-cash/go-sero/p2p/discv5" "github.com/sero-cash/go-sero/p2p/nat" "github.com/sero-cash/go-sero/p2p/netutil" ) func main() { var ( listenAddr = flag.String("addr", ":53719", "listen address") genKey = flag.String("genkey", "", "generate a node key") writeAddr = flag.Bool("writeaddress", false, "write out the node's pubkey hash and quit") nodeKeyFile = flag.String("nodekey", "", "private key filename") nodeKeyHex = flag.String("nodekeyhex", "", "private key as hex (for testing)") natdesc = flag.String("nat", "none", "port mapping mechanism (any|none|upnp|pmp|extip:)") netrestrict = flag.String("netrestrict", "", "restrict network communication to the given IP networks (CIDR masks)") runv5 = flag.Bool("v5", false, "run a v5 topic discovery bootnode") verbosity = flag.Int("verbosity", int(log.LvlInfo), "log verbosity (0-9)") vmodule = flag.String("vmodule", "", "log verbosity pattern") nodeKey *ecdsa.PrivateKey err error ) flag.Parse() glogger := log.NewGlogHandler(log.StreamHandler(os.Stderr, log.TerminalFormat(false))) glogger.Verbosity(log.Lvl(*verbosity)) glogger.Vmodule(*vmodule) log.Root().SetHandler(glogger) natm, err := nat.Parse(*natdesc) if err != nil { utils.Fatalf("-nat: %v", err) } switch { case *genKey != "": nodeKey, err = crypto.GenerateKey() if err != nil { utils.Fatalf("could not generate key: %v", err) } if err = crypto.SaveECDSA(*genKey, nodeKey); err != nil { utils.Fatalf("%v", err) } return case *nodeKeyFile == "" && *nodeKeyHex == "": utils.Fatalf("Use -nodekey or -nodekeyhex to specify a private key") case *nodeKeyFile != "" && *nodeKeyHex != "": utils.Fatalf("Options -nodekey and -nodekeyhex are mutually exclusive") case *nodeKeyFile != "": if nodeKey, err = crypto.LoadECDSA(*nodeKeyFile); err != nil { utils.Fatalf("-nodekey: %v", err) } case *nodeKeyHex != "": if nodeKey, err = crypto.HexToECDSA(*nodeKeyHex); err != nil { utils.Fatalf("-nodekeyhex: %v", err) } } if *writeAddr { fmt.Printf("%v\n", discover.PubkeyID(&nodeKey.PublicKey)) os.Exit(0) } var restrictList *netutil.Netlist if *netrestrict != "" { restrictList, err = netutil.ParseNetlist(*netrestrict) if err != nil { utils.Fatalf("-netrestrict: %v", err) } } addr, err := net.ResolveUDPAddr("udp", *listenAddr) if err != nil { utils.Fatalf("-ResolveUDPAddr: %v", err) } conn, err := net.ListenUDP("udp", addr) if err != nil { utils.Fatalf("-ListenUDP: %v", err) } realaddr := conn.LocalAddr().(*net.UDPAddr) if natm != nil { if !realaddr.IP.IsLoopback() { go nat.Map(natm, nil, "udp", realaddr.Port, realaddr.Port, "ethereum discovery") } // TODO: react to external IP changes over time. if ext, err := natm.ExternalIP(); err == nil { realaddr = &net.UDPAddr{IP: ext, Port: realaddr.Port} } } if *runv5 { if _, err := discv5.ListenUDP(nodeKey, conn, realaddr, "", restrictList); err != nil { utils.Fatalf("%v", err) } } else { cfg := discover.Config{ PrivateKey: nodeKey, AnnounceAddr: realaddr, NetRestrict: restrictList, } if _, err := discover.ListenUDP(conn, cfg); err != nil { utils.Fatalf("%v", err) } } select {} } ================================================ FILE: cmd/gero/accountcmd.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of go-ethereum. // // go-ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // go-ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with go-ethereum. If not, see . package main import ( "fmt" "github.com/sero-cash/go-sero/accounts" "github.com/sero-cash/go-sero/accounts/keystore" "github.com/sero-cash/go-sero/cmd/utils" "github.com/sero-cash/go-sero/console" "github.com/sero-cash/go-sero/crypto" "github.com/sero-cash/go-sero/log" "gopkg.in/urfave/cli.v1" ) var ( accountCommand = cli.Command{ Name: "account", Usage: "Manage accounts", Category: "ACCOUNT COMMANDS", Description: ` Manage accounts, list all existing accounts, import a private key into a new account, create a new account or update an existing account. It supports interactive mode, when you are prompted for password as well as non-interactive mode where passwords are supplied via a given password file. Non-interactive mode is only meant for scripted use on test networks or known safe environments. Make sure you remember the password you gave when creating a new account (with either new or import). Without it you are not able to unlock your account. Note that exporting your key in unencrypted format is NOT supported. Keys are stored under /keystore. It is safe to transfer the entire directory or the individual keys therein between ethereum nodes by simply copying. Make sure you backup your keys regularly.`, Subcommands: []cli.Command{ { Name: "list", Usage: "Print summary of existing accounts", Action: utils.MigrateFlags(accountList), Flags: []cli.Flag{ utils.DataDirFlag, utils.KeyStoreDirFlag, }, Description: ` Print a short summary of all accounts`, }, { Name: "new", Usage: "Create a new account", Action: utils.MigrateFlags(accountCreate), Flags: []cli.Flag{ utils.DataDirFlag, utils.KeyStoreDirFlag, utils.PasswordFileFlag, }, Description: ` gero account new Creates a new account and prints the address. The account is saved in encrypted format, you are prompted for a passphrase. You must remember this passphrase to unlock your account in the future. For non-interactive use the passphrase can be specified with the --password flag: Note, this is meant to be used for testing only, it is a bad idea to save your password to file or expose in any other way. `, }, { Name: "update", Usage: "Update an existing account", Action: utils.MigrateFlags(accountUpdate), ArgsUsage: "
", Flags: []cli.Flag{ utils.DataDirFlag, utils.KeyStoreDirFlag, }, Description: ` gero account update
Update an existing account. The account is saved in the newest version in encrypted format, you are prompted for a passphrase to unlock the account and another to save the updated file. This same command can therefore be used to migrate an account of a deprecated format to the newest format or change the password for an account. For non-interactive use the passphrase can be specified with the --password flag: gero account update [options]
Since only one password can be given, only format update can be performed, changing your password is only possible interactively. `, }, { Name: "import", Usage: "Import a private key into a new account", Action: utils.MigrateFlags(accountImport), Flags: []cli.Flag{ utils.DataDirFlag, utils.KeyStoreDirFlag, utils.PasswordFileFlag, }, ArgsUsage: "", Description: ` gero account import Imports an unencrypted private key from and creates a new account. Prints the address. The keyfile is assumed to contain an unencrypted private key in hexadecimal format. The account is saved in encrypted format, you are prompted for a passphrase. You must remember this passphrase to unlock your account in the future. For non-interactive use the passphrase can be specified with the -password flag: gero account import [options] Note: As you can directly copy your encrypted accounts to another ethereum instance, this import mechanism is not needed when you transfer an account between nodes. `, }, }, } ) func accountList(ctx *cli.Context) error { stack, _ := makeConfigNode(ctx) var index int for _, wallet := range stack.AccountManager().Wallets() { for _, account := range wallet.Accounts() { fmt.Printf("Account #%d: {%x} %s\n", index, account.Address, &account.URL) index++ } } return nil } // tries unlocking the specified account a few times. func unlockAccount(ctx *cli.Context, ks *keystore.KeyStore, address string, i int, passwords []string) (accounts.Account, string) { account, err := utils.MakeAddress(ks, address) if err != nil { utils.Fatalf("Could not list accounts: %v", err) } for trials := 0; trials < 3; trials++ { prompt := fmt.Sprintf("Unlocking account %s | Attempt %d/%d", address, trials+1, 3) password := getPassPhrase(prompt, false, i, passwords) err = ks.Unlock(account, password) if err == nil { log.Info("Unlocked account", "address", account.Address.String()) return account, password } if err, ok := err.(*keystore.AmbiguousAddrError); ok { log.Info("Unlocked account", "address", account.Address.String()) return ambiguousAddrRecovery(ks, err, password), password } if err != keystore.ErrDecrypt { // No need to prompt again if the error is not decryption-related. break } } // All trials expended to unlock account, bail out utils.Fatalf("Failed to unlock account %s (%v)", address, err) return accounts.Account{}, "" } // getPassPhrase retrieves the password associated with an account, either fetched // from a list of preloaded passphrases, or requested interactively from the user. func getPassPhrase(prompt string, confirmation bool, i int, passwords []string) string { // If a list of passwords was supplied, retrieve from them if len(passwords) > 0 { if i < len(passwords) { return passwords[i] } return passwords[len(passwords)-1] } // Otherwise prompt the user for the password if prompt != "" { fmt.Println(prompt) } password, err := console.Stdin.PromptPassword("Passphrase: ") if err != nil { utils.Fatalf("Failed to read passphrase: %v", err) } if confirmation { confirm, err := console.Stdin.PromptPassword("Repeat passphrase: ") if err != nil { utils.Fatalf("Failed to read passphrase confirmation: %v", err) } if password != confirm { utils.Fatalf("Passphrases do not match") } } return password } func ambiguousAddrRecovery(ks *keystore.KeyStore, err *keystore.AmbiguousAddrError, auth string) accounts.Account { fmt.Printf("Multiple key files exist for address %x:\n", err.Address) for _, a := range err.Matches { fmt.Println(" ", a.URL) } fmt.Println("Testing your passphrase against all of them...") var match *accounts.Account for _, a := range err.Matches { if err := ks.Unlock(a, auth); err == nil { match = &a break } } if match == nil { utils.Fatalf("None of the listed files could be unlocked.") } fmt.Printf("Your passphrase unlocked %s\n", match.URL) fmt.Println("In order to avoid this warning, you need to remove the following duplicate key files:") for _, a := range err.Matches { if a != *match { fmt.Println(" ", a.URL) } } return *match } // accountCreate creates a new account into the keystore defined by the CLI flags. func accountCreate(ctx *cli.Context) error { cfg := seroConfig{Node: defaultNodeConfig()} // Load config file. if file := ctx.GlobalString(configFileFlag.Name); file != "" { if err := loadConfig(file, &cfg); err != nil { utils.Fatalf("%v", err) } } utils.SetNodeConfig(ctx, &cfg.Node) scryptN, scryptP, keydir, err := cfg.Node.AccountConfig() if err != nil { utils.Fatalf("Failed to read configuration: %v", err) } password := getPassPhrase("Your new account is locked with a password. Please give a password. Do not forget this password.", true, 0, utils.MakePasswordList(ctx)) address, err := keystore.StoreKey(keydir, password, scryptN, scryptP, 0) if err != nil { utils.Fatalf("Failed to create account: %v", err) } fmt.Printf("Data: {%x}\n", address) return nil } // accountUpdate transitions an account from a previous format to the current // one, also providing the possibility to change the pass-phrase. func accountUpdate(ctx *cli.Context) error { if len(ctx.Args()) == 0 { utils.Fatalf("No accounts specified to update") } stack, _ := makeConfigNode(ctx) ks := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) for _, addr := range ctx.Args() { account, oldPassword := unlockAccount(ctx, ks, addr, 0, nil) newPassword := getPassPhrase("Please give a new password. Do not forget this password.", true, 0, nil) if err := ks.Update(account, oldPassword, newPassword); err != nil { utils.Fatalf("Could not update the account: %v", err) } } return nil } func accountImport(ctx *cli.Context) error { keyfile := ctx.Args().First() if len(keyfile) == 0 { utils.Fatalf("keyfile must be given as argument") } key, err := crypto.LoadECDSA(keyfile) if err != nil { utils.Fatalf("Failed to load the private key: %v", err) } stack, _ := makeConfigNode(ctx) passphrase := getPassPhrase("Your new account is locked with a password. Please give a password. Do not forget this password.", true, 0, utils.MakePasswordList(ctx)) ks := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) acct, err := ks.ImportECDSA(key, passphrase, 0, 2) if err != nil { utils.Fatalf("Could not create the account: %v", err) } fmt.Printf("Data: {%x}\n", acct.Address) return nil } ================================================ FILE: cmd/gero/bugcmd.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of go-ethereum. // // go-ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // go-ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with go-ethereum. If not, see . package main import ( "bytes" "fmt" "io" "io/ioutil" "net/url" "os/exec" "runtime" "strings" "github.com/sero-cash/go-sero/cmd/internal/browser" "github.com/sero-cash/go-sero/params" "github.com/sero-cash/go-sero/cmd/utils" cli "gopkg.in/urfave/cli.v1" ) var bugCommand = cli.Command{ Action: utils.MigrateFlags(reportBug), Name: "bug", Usage: "opens a window to report a bug on the gero repo", ArgsUsage: " ", Category: "MISCELLANEOUS COMMANDS", } const issueURL = "https://github.com/sero-cash/go-sero/issues/new" // reportBug reports a bug by opening a new URL to the go-ethereum GH issue // tracker and setting default values as the issue body. func reportBug(ctx *cli.Context) error { // execute template and write contents to buff var buff bytes.Buffer fmt.Fprintln(&buff, "#### System information") fmt.Fprintln(&buff) fmt.Fprintln(&buff, "Version:", params.VersionWithMeta) fmt.Fprintln(&buff, "Go Version:", runtime.Version()) fmt.Fprintln(&buff, "OS:", runtime.GOOS) printOSDetails(&buff) fmt.Fprintln(&buff, header) // open a new GH issue if !browser.Open(issueURL + "?body=" + url.QueryEscape(buff.String())) { fmt.Printf("Please file a new issue at %s using this template:\n\n%s", issueURL, buff.String()) } return nil } // copied from the Go source. Copyright 2017 The Go Authors func printOSDetails(w io.Writer) { switch runtime.GOOS { case "darwin": printCmdOut(w, "uname -v: ", "uname", "-v") printCmdOut(w, "", "sw_vers") case "linux": printCmdOut(w, "uname -sr: ", "uname", "-sr") printCmdOut(w, "", "lsb_release", "-a") case "openbsd", "netbsd", "freebsd", "dragonfly": printCmdOut(w, "uname -v: ", "uname", "-v") case "solaris": out, err := ioutil.ReadFile("/etc/release") if err == nil { fmt.Fprintf(w, "/etc/release: %s\n", out) } else { fmt.Printf("failed to read /etc/release: %v\n", err) } } } // printCmdOut prints the output of running the given command. // It ignores failures; 'go bug' is best effort. // // copied from the Go source. Copyright 2017 The Go Authors func printCmdOut(w io.Writer, prefix, path string, args ...string) { cmd := exec.Command(path, args...) out, err := cmd.Output() if err != nil { fmt.Printf("%s %s: %v\n", path, strings.Join(args, " "), err) return } fmt.Fprintf(w, "%s%s\n", prefix, bytes.TrimSpace(out)) } const header = ` #### Expected behaviour #### Actual behaviour #### Steps to reproduce the behaviour #### Backtrace ` ================================================ FILE: cmd/gero/chaincmd.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of go-ethereum. // // go-ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // go-ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with go-ethereum. If not, see . package main import ( "fmt" "os" "runtime" "strconv" "sync/atomic" "time" "github.com/sero-cash/go-sero/cmd/utils" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/console" "github.com/sero-cash/go-sero/core" "github.com/sero-cash/go-sero/event" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/sero/downloader" "github.com/sero-cash/go-sero/serodb" "github.com/sero-cash/go-sero/trie" "github.com/syndtr/goleveldb/leveldb/util" "gopkg.in/urfave/cli.v1" ) var ( importCommand = cli.Command{ Action: utils.MigrateFlags(importChain), Name: "import", Usage: "Import a blockchain file", ArgsUsage: " ( ... ) ", Flags: []cli.Flag{ utils.DataDirFlag, utils.CacheFlag, //utils.GCModeFlag, utils.CacheDatabaseFlag, utils.CacheGCFlag, }, Category: "BLOCKCHAIN COMMANDS", Description: ` The import command imports blocks from an RLP-encoded form. The form can be one file with several RLP-encoded blocks, or several files can be used. If only one file is used, import error will result in failure. If several files are used, processing will proceed even if an individual RLP-file import failure occurs.`, } exportCommand = cli.Command{ Action: utils.MigrateFlags(exportChain), Name: "export", Usage: "Export blockchain into file", ArgsUsage: " [ ]", Flags: []cli.Flag{ utils.DataDirFlag, utils.CacheFlag, }, Category: "BLOCKCHAIN COMMANDS", Description: ` Requires a first argument of the file to write to. Optional second and third arguments control the first and last block to write. In this mode, the file will be appended if already existing. If the file ends with .gz, the output will be gzipped.`, } importPreimagesCommand = cli.Command{ Action: utils.MigrateFlags(importPreimages), Name: "import-preimages", Usage: "Import the preimage database from an RLP stream", ArgsUsage: "", Flags: []cli.Flag{ utils.DataDirFlag, utils.CacheFlag, }, Category: "BLOCKCHAIN COMMANDS", Description: ` The import-preimages command imports hash preimages from an RLP encoded stream.`, } exportPreimagesCommand = cli.Command{ Action: utils.MigrateFlags(exportPreimages), Name: "export-preimages", Usage: "Export the preimage database into an RLP stream", ArgsUsage: "", Flags: []cli.Flag{ utils.DataDirFlag, utils.CacheFlag, }, Category: "BLOCKCHAIN COMMANDS", Description: ` The export-preimages command export hash preimages to an RLP encoded stream`, } copydbCommand = cli.Command{ Action: utils.MigrateFlags(copyDb), Name: "copydb", Usage: "Create a local chain from a target chaindata folder", ArgsUsage: "", Flags: []cli.Flag{ utils.DataDirFlag, utils.CacheFlag, utils.SyncModeFlag, utils.FakePoWFlag, utils.AlphanetFlag, utils.DeveloperFlag, utils.OfflineFlag, //utils.RinkebyFlag, }, Category: "BLOCKCHAIN COMMANDS", Description: ` The first argument must be the directory containing the blockchain to download from`, } removedbCommand = cli.Command{ Action: utils.MigrateFlags(removeDB), Name: "removedb", Usage: "Remove blockchain and state databases", ArgsUsage: " ", Flags: []cli.Flag{ utils.DataDirFlag, }, Category: "BLOCKCHAIN COMMANDS", Description: ` Remove blockchain and state databases`, } // dumpCommand = cli.Command{ // Action: utils.MigrateFlags(dump), // Name: "dump", // Usage: "Dump a specific block from storage", // ArgsUsage: "[ | ]...", // Flags: []cli.Flag{ // utils.DataDirFlag, // utils.CacheFlag, // }, // Category: "BLOCKCHAIN COMMANDS", // Description: ` //The arguments are interpreted as block numbers or hashes. //Use "ethereum dump 0" to dump the genesis block.`, // } ) // initGenesis will initialise the given JSON format genesis file and writes it as // the zero'd block (i.e. genesis) or will fail hard if it can't succeed. //func initGenesis(ctx *cli.Context) error { // // Make sure we have a valid genesis JSON // genesisPath := ctx.Args().First() // if len(genesisPath) == 0 { // utils.Fatalf("Must supply path to genesis JSON file") // } // file, err := os.Open(genesisPath) // if err != nil { // utils.Fatalf("Failed to read genesis file: %v", err) // } // defer file.Close() // // genesis := new(core.Genesis) // if err := json.NewDecoder(file).Decode(genesis); err != nil { // utils.Fatalf("invalid genesis file: %v", err) // } // // Open an initialise both full and light databases // stack := makeFullNode(ctx) // for _, name := range []string{"chaindata"} { // chaindb, err := stack.OpenDatabase(name, 0, 0) // if err != nil { // utils.Fatalf("Failed to open database: %v", err) // } // _, hash, err := core.SetupGenesisBlock(chaindb, genesis) // if err != nil { // utils.Fatalf("Failed to write genesis block: %v", err) // } // log.Info("Successfully wrote genesis state", "database", name, "hash", hash) // } // return nil //} func importChain(ctx *cli.Context) error { if len(ctx.Args()) < 1 { utils.Fatalf("This command requires an argument.") } stack := makeFullNode(ctx) chain, chainDb := utils.MakeChain(ctx, stack) defer chainDb.Close() // Start periodically gathering memory profiles var peakMemAlloc, peakMemSys uint64 go func() { stats := new(runtime.MemStats) for { runtime.ReadMemStats(stats) if atomic.LoadUint64(&peakMemAlloc) < stats.Alloc { atomic.StoreUint64(&peakMemAlloc, stats.Alloc) } if atomic.LoadUint64(&peakMemSys) < stats.Sys { atomic.StoreUint64(&peakMemSys, stats.Sys) } time.Sleep(5 * time.Second) } }() // Import the chain start := time.Now() if len(ctx.Args()) == 1 { if err := utils.ImportChain(chain, ctx.Args().First()); err != nil { log.Error("Import error", "err", err) } } else { for _, arg := range ctx.Args() { if err := utils.ImportChain(chain, arg); err != nil { log.Error("Import error", "file", arg, "err", err) } } } chain.Stop() fmt.Printf("Import done in %v.\n\n", time.Since(start)) // Output pre-compaction stats mostly to see the import trashing db := chainDb.(*serodb.LDBDatabase) stats, err := db.LDB().GetProperty("leveldb.stats") if err != nil { utils.Fatalf("Failed to read database stats: %v", err) } fmt.Println(stats) ioStats, err := db.LDB().GetProperty("leveldb.iostats") if err != nil { utils.Fatalf("Failed to read database iostats: %v", err) } fmt.Println(ioStats) fmt.Printf("Trie cache misses: %d\n", trie.CacheMisses()) fmt.Printf("Trie cache unloads: %d\n\n", trie.CacheUnloads()) // Print the memory statistics used by the importing mem := new(runtime.MemStats) runtime.ReadMemStats(mem) fmt.Printf("Object memory: %.3f MB current, %.3f MB peak\n", float64(mem.Alloc)/1024/1024, float64(atomic.LoadUint64(&peakMemAlloc))/1024/1024) fmt.Printf("System memory: %.3f MB current, %.3f MB peak\n", float64(mem.Sys)/1024/1024, float64(atomic.LoadUint64(&peakMemSys))/1024/1024) fmt.Printf("Allocations: %.3f million\n", float64(mem.Mallocs)/1000000) fmt.Printf("GC pause: %v\n\n", time.Duration(mem.PauseTotalNs)) if ctx.GlobalIsSet(utils.NoCompactionFlag.Name) { return nil } // Compact the entire database to more accurately measure disk io and print the stats start = time.Now() fmt.Println("Compacting entire database...") if err = db.LDB().CompactRange(util.Range{}); err != nil { utils.Fatalf("Compaction failed: %v", err) } fmt.Printf("Compaction done in %v.\n\n", time.Since(start)) stats, err = db.LDB().GetProperty("leveldb.stats") if err != nil { utils.Fatalf("Failed to read database stats: %v", err) } fmt.Println(stats) ioStats, err = db.LDB().GetProperty("leveldb.iostats") if err != nil { utils.Fatalf("Failed to read database iostats: %v", err) } fmt.Println(ioStats) return nil } func exportChain(ctx *cli.Context) error { if len(ctx.Args()) < 1 { utils.Fatalf("This command requires an argument.") } stack := makeFullNode(ctx) chain, _ := utils.MakeChain(ctx, stack) start := time.Now() var err error fp := ctx.Args().First() if len(ctx.Args()) < 3 { err = utils.ExportChain(chain, fp) } else { // This can be improved to allow for numbers larger than 9223372036854775807 first, ferr := strconv.ParseInt(ctx.Args().Get(1), 10, 64) last, lerr := strconv.ParseInt(ctx.Args().Get(2), 10, 64) if ferr != nil || lerr != nil { utils.Fatalf("Export error in parsing parameters: block number not an integer\n") } if first < 0 || last < 0 { utils.Fatalf("Export error: block number must be greater than 0\n") } err = utils.ExportAppendChain(chain, fp, uint64(first), uint64(last)) } if err != nil { utils.Fatalf("Export error: %v\n", err) } fmt.Printf("Export done in %v\n", time.Since(start)) return nil } // importPreimages imports preimage data from the specified file. func importPreimages(ctx *cli.Context) error { if len(ctx.Args()) < 1 { utils.Fatalf("This command requires an argument.") } stack := makeFullNode(ctx) diskdb := utils.MakeChainDatabase(ctx, stack).(*serodb.LDBDatabase) start := time.Now() if err := utils.ImportPreimages(diskdb, ctx.Args().First()); err != nil { utils.Fatalf("Export error: %v\n", err) } fmt.Printf("Export done in %v\n", time.Since(start)) return nil } // exportPreimages dumps the preimage data to specified json file in streaming way. func exportPreimages(ctx *cli.Context) error { if len(ctx.Args()) < 1 { utils.Fatalf("This command requires an argument.") } stack := makeFullNode(ctx) diskdb := utils.MakeChainDatabase(ctx, stack).(*serodb.LDBDatabase) start := time.Now() if err := utils.ExportPreimages(diskdb, ctx.Args().First()); err != nil { utils.Fatalf("Export error: %v\n", err) } fmt.Printf("Export done in %v\n", time.Since(start)) return nil } func copyDb(ctx *cli.Context) error { // Ensure we have a source chain directory to copy if len(ctx.Args()) != 1 { utils.Fatalf("Source chaindata directory path argument missing") } // Initialize a new chain for the running node to sync into stack := makeFullNode(ctx) chain, chainDb := utils.MakeChain(ctx, stack) syncmode := *utils.GlobalTextMarshaler(ctx, utils.SyncModeFlag.Name).(*downloader.SyncMode) dl := downloader.New(syncmode, chainDb, new(event.TypeMux), chain, nil, nil) // Create a source peer to satisfy downloader requests from db, err := serodb.NewLDBDatabase(ctx.Args().First(), ctx.GlobalInt(utils.CacheFlag.Name), 256) if err != nil { return err } hc, err := core.NewHeaderChain(db, chain.Config(), chain.Engine(), func() bool { return false }) if err != nil { return err } peer := downloader.NewFakePeer("local", db, hc, dl) if err = dl.RegisterPeer("local", 63, peer); err != nil { return err } // Synchronise with the simulated peer start := time.Now() currentHeader := hc.CurrentHeader() if err = dl.Synchronise("local", currentHeader.Hash(), hc.GetTd(currentHeader.Hash(), currentHeader.Number.Uint64()), syncmode); err != nil { return err } for dl.Synchronising() { time.Sleep(10 * time.Millisecond) } fmt.Printf("Database copy done in %v\n", time.Since(start)) // Compact the entire database to remove any sync overhead start = time.Now() fmt.Println("Compacting entire database...") if err = chainDb.(*serodb.LDBDatabase).LDB().CompactRange(util.Range{}); err != nil { utils.Fatalf("Compaction failed: %v", err) } fmt.Printf("Compaction done in %v.\n\n", time.Since(start)) return nil } func removeDB(ctx *cli.Context) error { stack, _ := makeConfigNode(ctx) for _, name := range []string{"chaindata"} { // Ensure the database exists in the first place logger := log.New("database", name) dbdir := stack.ResolvePath(name) if !common.FileExist(dbdir) { logger.Info("Database doesn't exist, skipping", "path", dbdir) continue } // Confirm removal and execute fmt.Println(dbdir) confirm, err := console.Stdin.PromptConfirm("Remove this database?") switch { case err != nil: utils.Fatalf("%v", err) case !confirm: logger.Warn("Database deletion aborted") default: start := time.Now() os.RemoveAll(dbdir) logger.Info("Database successfully deleted", "elapsed", common.PrettyDuration(time.Since(start))) } } return nil } // //func dump(ctx *cli.Context) error { // stack := makeFullNode(ctx) // chain, chainDb := utils.MakeChain(ctx, stack) // for _, arg := range ctx.Args() { // var block *types.Block // if hashish(arg) { // block = chain.GetBlockByHash(common.HexToHash(arg)) // } else { // num, _ := strconv.Atoi(arg) // block = chain.GetBlockByNumber(uint64(num)) // } // if block == nil { // fmt.Println("{}") // utils.Fatalf("block not found") // } else { // state, err := state.New(block.Root(), state.NewDatabase(chainDb), block.NumberU64()) // if err != nil { // utils.Fatalf("could not create new state: %v", err) // } // fmt.Printf("%s\n", state.Dump()) // } // } // chainDb.Close() // return nil //} // hashish returns true for strings that look like hashes. func hashish(x string) bool { _, err := strconv.Atoi(x) return err != nil } ================================================ FILE: cmd/gero/config.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of go-ethereum. // // go-ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // go-ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with go-ethereum. If not, see . package main import ( "bufio" "errors" "fmt" "io" "os" "reflect" "unicode" "gopkg.in/urfave/cli.v1" "github.com/naoina/toml" "github.com/sero-cash/go-sero/cmd/utils" "github.com/sero-cash/go-sero/dashboard" "github.com/sero-cash/go-sero/node" "github.com/sero-cash/go-sero/params" "github.com/sero-cash/go-sero/sero" ) var ( dumpConfigCommand = cli.Command{ Action: utils.MigrateFlags(dumpConfig), Name: "dumpconfig", Usage: "Show configuration values", ArgsUsage: "", Flags: append(nodeFlags, rpcFlags...), Category: "MISCELLANEOUS COMMANDS", Description: `The dumpconfig command shows configuration values.`, } configFileFlag = cli.StringFlag{ Name: "config", Usage: "TOML configuration file", } ) // These settings ensure that TOML keys use the same names as Go struct fields. var tomlSettings = toml.Config{ NormFieldName: func(rt reflect.Type, key string) string { return key }, FieldToKey: func(rt reflect.Type, field string) string { return field }, MissingField: func(rt reflect.Type, field string) error { link := "" if unicode.IsUpper(rune(rt.Name()[0])) && rt.PkgPath() != "main" { link = fmt.Sprintf(", see https://godoc.org/%s#%s for available fields", rt.PkgPath(), rt.Name()) } return fmt.Errorf("field '%s' is not defined in %s%s", field, rt.String(), link) }, } type serostatsConfig struct { URL string `toml:",omitempty"` } type seroConfig struct { Sero sero.Config Node node.Config Serostats serostatsConfig Dashboard dashboard.Config } func loadConfig(file string, cfg *seroConfig) error { f, err := os.Open(file) if err != nil { return err } defer f.Close() err = tomlSettings.NewDecoder(bufio.NewReader(f)).Decode(cfg) // Add file name to errors that have a line number. if _, ok := err.(*toml.LineError); ok { err = errors.New(file + ", " + err.Error()) } return err } func defaultNodeConfig() node.Config { cfg := node.DefaultConfig cfg.Name = clientIdentifier cfg.Version = params.VersionWithCommit(gitCommit) cfg.HTTPModules = append(cfg.HTTPModules, "sero", "shh") cfg.WSModules = append(cfg.WSModules, "sero", "shh") cfg.IPCPath = "gero.ipc" return cfg } func makeConfigNode(ctx *cli.Context) (*node.Node, seroConfig) { // Load defaults. cfg := seroConfig{ Sero: sero.DefaultConfig, Node: defaultNodeConfig(), Dashboard: dashboard.DefaultConfig, } // Load config file. if file := ctx.GlobalString(configFileFlag.Name); file != "" { if err := loadConfig(file, &cfg); err != nil { utils.Fatalf("%v", err) } } // Apply flags. utils.SetNodeConfig(ctx, &cfg.Node) stack, err := node.New(&cfg.Node) if err != nil { utils.Fatalf("Failed to create the protocol stack: %v", err) } utils.SetSeroConfig(ctx, stack, &cfg.Sero) if ctx.GlobalIsSet(utils.SeroStatsURLFlag.Name) { cfg.Serostats.URL = ctx.GlobalString(utils.SeroStatsURLFlag.Name) } utils.SetDashboardConfig(ctx, &cfg.Dashboard) return stack, cfg } func makeFullNode(ctx *cli.Context) *node.Node { stack, cfg := makeConfigNode(ctx) utils.RegisterEthService(stack, &cfg.Sero) if ctx.GlobalBool(utils.DashboardEnabledFlag.Name) { utils.RegisterDashboardService(stack, &cfg.Dashboard, gitCommit) } return stack } // dumpConfig is the dumpconfig command. func dumpConfig(ctx *cli.Context) error { _, cfg := makeConfigNode(ctx) comment := "" if cfg.Sero.Genesis != nil { cfg.Sero.Genesis = nil comment += "# Note: this config doesn't contain the genesis block.\n\n" } out, err := tomlSettings.Marshal(&cfg) if err != nil { return err } io.WriteString(os.Stdout, comment) os.Stdout.Write(out) return nil } ================================================ FILE: cmd/gero/consolecmd.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of go-ethereum. // // go-ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // go-ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with go-ethereum. If not, see . package main import ( "fmt" "os" "os/signal" "path/filepath" "strings" "syscall" "github.com/sero-cash/go-sero/cmd/utils" "github.com/sero-cash/go-sero/console" "github.com/sero-cash/go-sero/node" "github.com/sero-cash/go-sero/rpc" "gopkg.in/urfave/cli.v1" ) var ( consoleFlags = []cli.Flag{utils.JSpathFlag, utils.ExecFlag, utils.PreloadJSFlag} consoleCommand = cli.Command{ Action: utils.MigrateFlags(localConsole), Name: "console", Usage: "Start an interactive JavaScript environment", Flags: append(append(nodeFlags, rpcFlags...), consoleFlags...), Category: "CONSOLE COMMANDS", Description: ` The Gero console is an interactive shell for the JavaScript runtime environment which exposes a node admin interface as well as the Ðapp JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/JavaScript-Console.`, } attachCommand = cli.Command{ Action: utils.MigrateFlags(remoteConsole), Name: "attach", Usage: "Start an interactive JavaScript environment (connect to node)", ArgsUsage: "[endpoint]", Flags: append(consoleFlags, utils.DataDirFlag), Category: "CONSOLE COMMANDS", Description: ` The Gero console is an interactive shell for the JavaScript runtime environment which exposes a node admin interface as well as the Ðapp JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/JavaScript-Console. This command allows to open a console on a running gero node.`, } javascriptCommand = cli.Command{ Action: utils.MigrateFlags(ephemeralConsole), Name: "js", Usage: "Execute the specified JavaScript files", ArgsUsage: " [jsfile...]", Flags: append(nodeFlags, consoleFlags...), Category: "CONSOLE COMMANDS", Description: ` The JavaScript VM exposes a node admin interface as well as the Ðapp JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/JavaScript-Console`, } ) // localConsole starts a new gero node, attaching a JavaScript console to it at the // same time. func localConsole(ctx *cli.Context) error { // Create and start the node based on the CLI flags node := makeFullNode(ctx) startNode(ctx, node) defer node.Stop() // Attach to the newly started node and start the JavaScript console client, err := node.Attach() if err != nil { utils.Fatalf("Failed to attach to the inproc gero: %v", err) } config := console.Config{ DataDir: utils.MakeDataDir(ctx), DocRoot: ctx.GlobalString(utils.JSpathFlag.Name), Client: client, Preload: utils.MakeConsolePreloads(ctx), } console, err := console.New(config) if err != nil { utils.Fatalf("Failed to start the JavaScript console: %v", err) } defer console.Stop(false) // If only a short execution was requested, evaluate and return if script := ctx.GlobalString(utils.ExecFlag.Name); script != "" { console.Evaluate(script) return nil } // Otherwise print the welcome screen and enter interactive mode console.Welcome() console.Interactive() return nil } // remoteConsole will connect to a remote gero instance, attaching a JavaScript // console to it. func remoteConsole(ctx *cli.Context) error { // Attach to a remotely running gero instance and start the JavaScript console endpoint := ctx.Args().First() if endpoint == "" { path := node.DefaultDataDir() if ctx.GlobalIsSet(utils.DataDirFlag.Name) { path = ctx.GlobalString(utils.DataDirFlag.Name) } if path != "" { if ctx.GlobalBool(utils.AlphanetFlag.Name) { path = filepath.Join(path, "alpha") } else if ctx.GlobalBool(utils.DeveloperFlag.Name) { path = filepath.Join(path, "dev") } //else if ctx.GlobalBool(utils.RinkebyFlag.Name) { // path = filepath.Join(path, "rinkeby") //} } endpoint = fmt.Sprintf("%s/gero.ipc", path) } client, err := dialRPC(endpoint) if err != nil { utils.Fatalf("Unable to attach to remote gero: %v", err) } config := console.Config{ DataDir: utils.MakeDataDir(ctx), DocRoot: ctx.GlobalString(utils.JSpathFlag.Name), Client: client, Preload: utils.MakeConsolePreloads(ctx), } console, err := console.New(config) if err != nil { utils.Fatalf("Failed to start the JavaScript console: %v", err) } defer console.Stop(false) if script := ctx.GlobalString(utils.ExecFlag.Name); script != "" { console.Evaluate(script) return nil } // Otherwise print the welcome screen and enter interactive mode console.Welcome() console.Interactive() return nil } // dialRPC returns a RPC client which connects to the given endpoint. // The check for empty endpoint implements the defaulting logic // for "gero attach" and "gero monitor" with no argument. func dialRPC(endpoint string) (*rpc.Client, error) { if endpoint == "" { endpoint = node.DefaultIPCEndpoint(clientIdentifier) } else if strings.HasPrefix(endpoint, "rpc:") || strings.HasPrefix(endpoint, "ipc:") { // Backwards compatibility with gero < 1.5 which required // these prefixes. endpoint = endpoint[4:] } return rpc.Dial(endpoint) } // ephemeralConsole starts a new gero node, attaches an ephemeral JavaScript // console to it, executes each of the files specified as arguments and tears // everything down. func ephemeralConsole(ctx *cli.Context) error { // Create and start the node based on the CLI flags node := makeFullNode(ctx) startNode(ctx, node) defer node.Stop() // Attach to the newly started node and start the JavaScript console client, err := node.Attach() if err != nil { utils.Fatalf("Failed to attach to the inproc gero: %v", err) } config := console.Config{ DataDir: utils.MakeDataDir(ctx), DocRoot: ctx.GlobalString(utils.JSpathFlag.Name), Client: client, Preload: utils.MakeConsolePreloads(ctx), } console, err := console.New(config) if err != nil { utils.Fatalf("Failed to start the JavaScript console: %v", err) } defer console.Stop(false) // Evaluate each of the specified JavaScript files for _, file := range ctx.Args() { if err = console.Execute(file); err != nil { utils.Fatalf("Failed to execute %s: %v", file, err) } } // Wait for pending callbacks, but stop for Ctrl-C. abort := make(chan os.Signal, 1) signal.Notify(abort, syscall.SIGINT, syscall.SIGTERM) go func() { <-abort os.Exit(0) }() console.Stop(true) return nil } ================================================ FILE: cmd/gero/main.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of go-ethereum. // // go-ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // go-ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with go-ethereum. If not, see . // gero is the official command-line client for Sero. package main import ( "fmt" "math" "os" "path/filepath" "runtime" godebug "runtime/debug" "sort" "strconv" "strings" "time" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-czero-import/seroparam" "github.com/sero-cash/go-czero-import/superzk" "gopkg.in/urfave/cli.v1" "github.com/elastic/gosigar" "github.com/sero-cash/go-sero/accounts" "github.com/sero-cash/go-sero/accounts/keystore" "github.com/sero-cash/go-sero/cmd/utils" "github.com/sero-cash/go-sero/console" "github.com/sero-cash/go-sero/internal/debug" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/metrics" "github.com/sero-cash/go-sero/node" "github.com/sero-cash/go-sero/sero" ) const ( clientIdentifier = "gero" // Client identifier to advertise over the network ) var ( // Git SHA1 commit hash of the release (set via linker flags) gitCommit = "" // The app that holds all commands and flags. app = utils.NewApp(gitCommit, "the go-sero command line interface") // flags that configure the node nodeFlags = []cli.Flag{ utils.IdentityFlag, utils.UnlockedAccountFlag, utils.PasswordFileFlag, utils.BootnodesFlag, utils.BootnodesV4Flag, utils.BootnodesV5Flag, utils.DataDirFlag, utils.KeyStoreDirFlag, utils.NoUSBFlag, utils.DashboardEnabledFlag, utils.DashboardAddrFlag, utils.DashboardPortFlag, utils.DashboardRefreshFlag, utils.EthashCacheDirFlag, utils.EthashCachesInMemoryFlag, utils.EthashCachesOnDiskFlag, utils.EthashDatasetDirFlag, utils.EthashDatasetsInMemoryFlag, utils.EthashDatasetsOnDiskFlag, utils.TxPoolNoLocalsFlag, utils.TxPoolPriceLimitFlag, utils.TxPoolAccountSlotsFlag, utils.TxPoolGlobalSlotsFlag, utils.TxPoolAccountQueueFlag, utils.TxPoolGlobalQueueFlag, utils.TxPoolLifetimeFlag, utils.SyncModeFlag, utils.GCModeFlag, utils.CacheFlag, utils.CacheDatabaseFlag, utils.CacheGCFlag, utils.TrieCacheGenFlag, utils.ListenPortFlag, utils.MaxPeersFlag, utils.MaxPendingPeersFlag, utils.SerobaseFlag, utils.GasPriceFlag, utils.VThreadsFlag, utils.PThreadsFlag, utils.MinerThreadsFlag, utils.MiningEnabledFlag, utils.MineModeEnabledFlag, utils.TargetGasLimitFlag, utils.NATFlag, utils.NoDiscoverFlag, utils.DiscoveryV5Flag, utils.NetrestrictFlag, utils.NodeKeyFileFlag, utils.NodeKeyHexFlag, utils.DeveloperPeriodFlag, utils.DeveloperPasswordFlag, utils.AlphanetFlag, //utils.RinkebyFlag, utils.ExchangeFlag, utils.ExchangeValueStrFlag, utils.StakeFlag, utils.AutoMergeFlag, utils.ConfirmedBlockFlag, utils.RecordBlockShareNumber, utils.LightNodeFlag, utils.CloseAcceptTx, utils.ResetBlockNumber, utils.DeveloperFlag, utils.OfflineFlag, utils.SnapshotFlag, utils.TestStartBlockFlag, utils.TestForkFlag, utils.VMEnableDebugFlag, utils.NetworkIdFlag, utils.RPCCORSDomainFlag, utils.RPCVirtualHostsFlag, utils.SeroStatsURLFlag, utils.MetricsEnabledFlag, utils.FakePoWFlag, utils.NoCompactionFlag, utils.GpoBlocksFlag, utils.GpoPercentileFlag, utils.ExtraDataFlag, configFileFlag, } proofFlags = []cli.Flag{ utils.ProofEnabledFlag, utils.ProofMaxThreadFlag, utils.ProofMaxQueueFlag, utils.ProofzinFeeFlag, utils.ProofoinFeeFlag, utils.ProofoutFeeFlag, utils.ProofFixedFeeFlag, } rpcFlags = []cli.Flag{ utils.RPCEnabledFlag, utils.RPCListenAddrFlag, utils.RPCPortFlag, utils.RPCApiFlag, utils.RPCRequestContentLength, utils.RPCReadTimeoutFlag, utils.RPCWriteTimeoutFlag, utils.RPCIdleTimeoutFlag, utils.WSEnabledFlag, utils.WSListenAddrFlag, utils.WSPortFlag, utils.WSApiFlag, utils.WSAllowedOriginsFlag, utils.IPCDisabledFlag, utils.IPCPathFlag, } metricsFlags = []cli.Flag{ utils.MetricsEnableInfluxDBFlag, utils.MetricsInfluxDBEndpointFlag, utils.MetricsInfluxDBDatabaseFlag, utils.MetricsInfluxDBUsernameFlag, utils.MetricsInfluxDBPasswordFlag, utils.MetricsInfluxDBHostTagFlag, } ) func init() { // Initialize the CLI app and start Sero app.Action = gero app.HideVersion = true // we have a command to print the version app.Copyright = "Copyright 2013-2018 The go-sero Authors" app.Commands = []cli.Command{ // See chaincmd.go: importCommand, exportCommand, importPreimagesCommand, exportPreimagesCommand, copydbCommand, removedbCommand, //dumpCommand, // See monitorcmd.go: monitorCommand, // See accountcmd.go: accountCommand, // See consolecmd.go: consoleCommand, attachCommand, javascriptCommand, // See misccmd.go: makecacheCommand, makedagCommand, versionCommand, bugCommand, licenseCommand, // See config.go dumpConfigCommand, // See snapshotcmd.go: snapshotCommand, } sort.Sort(cli.CommandsByName(app.Commands)) app.Flags = append(app.Flags, nodeFlags...) app.Flags = append(app.Flags, rpcFlags...) app.Flags = append(app.Flags, consoleFlags...) app.Flags = append(app.Flags, debug.Flags...) app.Flags = append(app.Flags, proofFlags...) app.Flags = append(app.Flags, metricsFlags...) app.Before = func(ctx *cli.Context) error { subCommandName := "" if len(ctx.Args()) > 0 { subCommandName = ctx.Args()[0] } if !strings.EqualFold(subCommandName, "attach") && !strings.EqualFold(subCommandName, "version") { netType := c_type.NET_Beta switch { case ctx.GlobalBool(utils.AlphanetFlag.Name): netType = c_type.NET_Alpha case ctx.GlobalBool(utils.DeveloperFlag.Name): netType = c_type.NET_Dev } superzk.ZeroInit(getKeyStore(ctx), netType) } runtime.GOMAXPROCS(runtime.NumCPU()) logdir := "" if ctx.GlobalBool(utils.DashboardEnabledFlag.Name) { logdir = (&node.Config{DataDir: utils.MakeDataDir(ctx)}).ResolvePath("logs") } if err := debug.Setup(ctx, logdir); err != nil { return err } // Cap the cache allowance and tune the garbage collector var mem gosigar.Mem if err := mem.Get(); err == nil { allowance := int(mem.Total / 1024 / 1024 / 3) if cache := ctx.GlobalInt(utils.CacheFlag.Name); cache > allowance { log.Warn("Sanitizing cache to Go's GC limits", "provided", cache, "updated", allowance) ctx.GlobalSet(utils.CacheFlag.Name, strconv.Itoa(allowance)) } } // Ensure Go's GC ignores the database cache for trigger percentage cache := ctx.GlobalInt(utils.CacheFlag.Name) gogc := math.Max(20, math.Min(100, 100/(float64(cache)/1024))) log.Debug("Sanitizing Go's GC trigger", "percent", int(gogc)) godebug.SetGCPercent(int(gogc)) // Start metrics export if enabled utils.SetupMetrics(ctx) // Start system runtime metrics collection go metrics.CollectProcessMetrics(3 * time.Second) utils.SetupNetwork(ctx) return nil } app.After = func(ctx *cli.Context) error { debug.Exit() console.Stdin.Close() // Resets terminal mode. return nil } } func getKeyStore(ctx *cli.Context) string { dataDir := node.DefaultDataDir() switch { case ctx.GlobalIsSet(utils.DataDirFlag.Name): dataDir = ctx.GlobalString(utils.DataDirFlag.Name) case ctx.GlobalBool(utils.AlphanetFlag.Name): dataDir = filepath.Join(node.DefaultDataDir(), "alpha") case ctx.GlobalBool(utils.DeveloperFlag.Name): dataDir = filepath.Join(node.DefaultDataDir(), "dev") } keyStoreDir := "" if ctx.GlobalIsSet(utils.KeyStoreDirFlag.Name) { keyStoreDir = ctx.GlobalString(utils.KeyStoreDirFlag.Name) } var ( keydir string ) switch { case filepath.IsAbs(keyStoreDir): keydir = keyStoreDir case dataDir != "": if keyStoreDir == "" { keydir = filepath.Join(dataDir, "keystore") } else { keydir, _ = filepath.Abs(keyStoreDir) } case keyStoreDir != "": keydir, _ = filepath.Abs(keyStoreDir) } return keydir } var logo = ` sssSSssss sSSSSSSSSSSSSSSSSSSSs sSSSSSSSSSSSSSSSSSSSSSSSSSSs sSSSSSSss ssSSSSSSs ssSSSSSSs s sss sSSSSSSs sSSSSSs sSSSSSSSSSSSSSSs sSSSSS sSSSS +SSSSSSS+ sSSSsss SSSSSs sSSSSs sSSSSSSSs sssSss SSSS sSSSS SSSS SSSSSs sSSSSSSSSs sSSSSs sSSSSs sSSSS sSSSSSs SSSSSSSSSSSs SSSSSs SSSSs SSSSs SSSSSS SSSSSSSSSSSSSs SSSSSSSs SSSS SSSSs SSSSSSs sSSSSSSSSSSSSSSs SSSSSSSSs sSSSs sSSSs SSSSSSs SSSSSSSSSSSSSssSSSSSSSSSs +SSSs SSSS SSSSSSs sSSSSSSSSS+SSSSSSSSSSSSSS sSSSS sSSSs SSSSSS sSSSSSSSSSSsSSSSSSSSSSSs ssSSS sSSSs s SSSSSSs SSSSSSSSSSssSSSSSSSSS SSSs SSSS sS SSSSSSs SSSSSSSSSs sSSSSSS SSSs SSSss sSs sSSSSSSs ssSSSSSSSS sSSSS SSSs SSS+s SSS sSSSSSSS sSSSSSSS ssSSS SSSS SSSSs sSSSs sSSSSSSSss sSSSSSSs SSS SSSs SSSS sSSSSS SSSSSSSSSs sSSSSSSs SS SSS+ SSSSs SSSSSSS sSSSSSSSSS SSSSSs ss SSSs SSS+ sSSSSSSSSSs sSSSSSSSSSs SSSSSS ss +SSS SSSS SSSSSSSSSSSss sSSSSSSSs sSSSSS sSSSS sSSSs sSSSSSSSs sSSSs sSSSSSSs SSSSSs sSSSs SSSSs sSSSSSSs SSSSSSs sSSSSSSs SSSSSs sSSS+ SSSS SSSSS+ SSSSSSSssSSSSSs sSSSS sSSSS sSSSS SSSSS ssSSSSSSsSSSSss sSSSSs SSSS SSSSss SSSs SSSSSSSSSs SSSSS sSSSSs SSSSs sSSs +SSSSS sSSSSs ssSSSs sSSSSS sSSSS sSSSSs SSSSSs SSSSS+ss sSSSSSSSSSSSS sSSSSSs SSSSSSss ssSSSSSSs sSSSSSSSsss ssSSSSSSSS sSSSSSSSSSSSSSSSSSSSSSSSSSs ssSSSSSSSSSSSSSSSSSs rrssssrr ` func main() { fmt.Println(logo) if err := app.Run(os.Args); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } } // gero is the main entry point into the system if no special subcommand is ran. // It creates a default node based on the command line arguments and runs it in // blocking mode, waiting for it to be shut down. func gero(ctx *cli.Context) error { if args := ctx.Args(); len(args) > 0 { return fmt.Errorf("invalid command: %q", args[0]) } node := makeFullNode(ctx) startNode(ctx, node) node.Wait() return nil } // startNode boots up the system node and all registered protocols, after which // it unlocks any requested accounts, and starts the RPC/IPC interfaces and the // miner. func startNode(ctx *cli.Context, stack *node.Node) { debug.Memsize.Add("node", stack) // Start up the node itself utils.StartNode(stack) // Unlock any account specifically requested ks := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) if seroparam.Is_Dev() && ctx.GlobalString(utils.DeveloperPasswordFlag.Name) != "" { for _, wallet := range ks.Wallets() { err := ks.Unlock(wallet.Accounts()[0], ctx.GlobalString(utils.DeveloperPasswordFlag.Name)) if err != nil { fmt.Printf("unclock %v failed,%v", wallet.Accounts()[0].Address.String(), err) } } } else { passwords := utils.MakePasswordList(ctx) unlocks := strings.Split(ctx.GlobalString(utils.UnlockedAccountFlag.Name), ",") for i, account := range unlocks { if trimmed := strings.TrimSpace(account); trimmed != "" { unlockAccount(ctx, ks, trimmed, i, passwords) } } } // Register wallet event handlers to open and auto-derive wallets events := make(chan accounts.WalletEvent, 16) stack.AccountManager().Subscribe(events) go func() { // Create a chain state reader for self-derivation //rpcClient, err := stack.Attach() //if err != nil { // utils.Fatalf("Failed to attach to self: %v", err) //} //stateReader := seroclient.NewClient(rpcClient) // Open any wallets already attached for _, wallet := range stack.AccountManager().Wallets() { if err := wallet.Open(""); err != nil { log.Warn("Failed to open wallet", "url", wallet.URL(), "err", err) } } // Listen for wallet event till termination for event := range events { switch event.Kind { case accounts.WalletArrived: if err := event.Wallet.Open(""); err != nil { log.Warn("New wallet appeared, failed to open", "url", event.Wallet.URL(), "err", err) } case accounts.WalletDropped: log.Info("Old wallet dropped", "url", event.Wallet.URL()) event.Wallet.Close() } } }() // Start auxiliary services if enabled if ctx.GlobalBool(utils.MiningEnabledFlag.Name) { // Mining only makes sense if a full Sero node is running if ctx.GlobalString(utils.SyncModeFlag.Name) == "light" { utils.Fatalf("Light clients do not support mining") } var sero *sero.Sero if err := stack.Service(&sero); err != nil { utils.Fatalf("Sero service not running: %v", err) } // Use a reduced number of threads if requested if threads := ctx.GlobalInt(utils.MinerThreadsFlag.Name); threads > 0 { type threaded interface { SetThreads(threads int) } if th, ok := sero.Engine().(threaded); ok { th.SetThreads(threads) } } // Set the gas price to the limits from the CLI and start mining sero.TxPool().SetGasPrice(utils.GlobalBig(ctx, utils.GasPriceFlag.Name)) if err := sero.StartMining(true); err != nil { utils.Fatalf("Failed to start mining: %v", err) } } } ================================================ FILE: cmd/gero/misccmd.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of go-ethereum. // // go-ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // go-ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with go-ethereum. If not, see . package main import ( "fmt" "os" "runtime" "strconv" "strings" "github.com/sero-cash/go-sero/cmd/utils" "github.com/sero-cash/go-sero/consensus/ethash" "github.com/sero-cash/go-sero/params" "github.com/sero-cash/go-sero/sero" "gopkg.in/urfave/cli.v1" ) var ( makecacheCommand = cli.Command{ Action: utils.MigrateFlags(makecache), Name: "makecache", Usage: "Generate ethash verification cache (for testing)", ArgsUsage: " ", Category: "MISCELLANEOUS COMMANDS", Description: ` The makecache command generates an ethash cache in . This command exists to support the system testing project. Regular users do not need to execute it. `, } makedagCommand = cli.Command{ Action: utils.MigrateFlags(makedag), Name: "makedag", Usage: "Generate ethash mining DAG (for testing)", ArgsUsage: " ", Category: "MISCELLANEOUS COMMANDS", Description: ` The makedag command generates an ethash DAG in . This command exists to support the system testing project. Regular users do not need to execute it. `, } versionCommand = cli.Command{ Action: utils.MigrateFlags(version), Name: "version", Usage: "Print version numbers", ArgsUsage: " ", Category: "MISCELLANEOUS COMMANDS", Description: ` The output of this command is supposed to be machine-readable. `, } licenseCommand = cli.Command{ Action: utils.MigrateFlags(license), Name: "license", Usage: "Display license information", ArgsUsage: " ", Category: "MISCELLANEOUS COMMANDS", } ) // makecache generates an ethash verification cache into the provided folder. func makecache(ctx *cli.Context) error { args := ctx.Args() if len(args) != 2 { utils.Fatalf(`Usage: gero makecache `) } block, err := strconv.ParseUint(args[0], 0, 64) if err != nil { utils.Fatalf("Invalid block number: %v", err) } ethash.MakeCache(block, args[1]) return nil } // makedag generates an ethash mining DAG into the provided folder. func makedag(ctx *cli.Context) error { args := ctx.Args() if len(args) != 2 { utils.Fatalf(`Usage: gero makedag `) } block, err := strconv.ParseUint(args[0], 0, 64) if err != nil { utils.Fatalf("Invalid block number: %v", err) } ethash.MakeDataset(block, args[1]) return nil } func version(ctx *cli.Context) error { fmt.Println(strings.Title(clientIdentifier)) fmt.Println("Version:", params.VersionWithMeta) if gitCommit != "" { fmt.Println("Git Commit:", gitCommit) } fmt.Println("Architecture:", runtime.GOARCH) fmt.Println("Protocol Versions:", sero.ProtocolVersions) fmt.Println("Network Id:", sero.DefaultConfig.NetworkId) fmt.Println("Go Version:", runtime.Version()) fmt.Println("Operating System:", runtime.GOOS) fmt.Printf("GOPATH=%s\n", os.Getenv("GOPATH")) fmt.Printf("GOROOT=%s\n", runtime.GOROOT()) return nil } func license(_ *cli.Context) error { fmt.Println(`Gero is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Gero is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with gero. If not, see .`) return nil } ================================================ FILE: cmd/gero/monitorcmd.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of go-ethereum. // // go-ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // go-ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with go-ethereum. If not, see . package main import ( "fmt" "math" "reflect" "runtime" "sort" "strings" "time" "github.com/gizak/termui" "github.com/sero-cash/go-sero/cmd/utils" "github.com/sero-cash/go-sero/node" "github.com/sero-cash/go-sero/rpc" "gopkg.in/urfave/cli.v1" ) var ( monitorCommandAttachFlag = cli.StringFlag{ Name: "attach", Value: node.DefaultIPCEndpoint(clientIdentifier), Usage: "API endpoint to attach to", } monitorCommandRowsFlag = cli.IntFlag{ Name: "rows", Value: 5, Usage: "Maximum rows in the chart grid", } monitorCommandRefreshFlag = cli.IntFlag{ Name: "refresh", Value: 3, Usage: "Refresh interval in seconds", } monitorCommand = cli.Command{ Action: utils.MigrateFlags(monitor), // keep track of migration progress Name: "monitor", Usage: "Monitor and visualize node metrics", ArgsUsage: " ", Category: "MONITOR COMMANDS", Description: ` The Gero monitor is a tool to collect and visualize various internal metrics gathered by the node, supporting different chart types as well as the capacity to display multiple metrics simultaneously. `, Flags: []cli.Flag{ monitorCommandAttachFlag, monitorCommandRowsFlag, monitorCommandRefreshFlag, }, } ) // monitor starts a terminal UI based monitoring tool for the requested metrics. func monitor(ctx *cli.Context) error { var ( client *rpc.Client err error ) // Attach to an Ethereum node over IPC or RPC endpoint := ctx.String(monitorCommandAttachFlag.Name) if client, err = dialRPC(endpoint); err != nil { utils.Fatalf("Unable to attach to gero node: %v", err) } defer client.Close() // Retrieve all the available metrics and resolve the user pattens metrics, err := retrieveMetrics(client) if err != nil { utils.Fatalf("Failed to retrieve system metrics: %v", err) } monitored := resolveMetrics(metrics, ctx.Args()) if len(monitored) == 0 { list := expandMetrics(metrics, "") sort.Strings(list) if len(list) > 0 { utils.Fatalf("No metrics specified.\n\nAvailable:\n - %s", strings.Join(list, "\n - ")) } else { utils.Fatalf("No metrics collected by gero (--%s).\n", utils.MetricsEnabledFlag.Name) } } sort.Strings(monitored) if cols := len(monitored) / ctx.Int(monitorCommandRowsFlag.Name); cols > 6 { utils.Fatalf("Requested metrics (%d) spans more that 6 columns:\n - %s", len(monitored), strings.Join(monitored, "\n - ")) } // Create and configure the chart UI defaults if err := termui.Init(); err != nil { utils.Fatalf("Unable to initialize terminal UI: %v", err) } defer termui.Close() rows := len(monitored) if max := ctx.Int(monitorCommandRowsFlag.Name); rows > max { rows = max } cols := (len(monitored) + rows - 1) / rows for i := 0; i < rows; i++ { termui.Body.AddRows(termui.NewRow()) } // Create each individual data chart footer := termui.NewPar("") footer.Block.Border = true footer.Height = 3 charts := make([]*termui.LineChart, len(monitored)) units := make([]int, len(monitored)) data := make([][]float64, len(monitored)) for i := 0; i < len(monitored); i++ { charts[i] = createChart((termui.TermHeight() - footer.Height) / rows) row := termui.Body.Rows[i%rows] row.Cols = append(row.Cols, termui.NewCol(12/cols, 0, charts[i])) } termui.Body.AddRows(termui.NewRow(termui.NewCol(12, 0, footer))) refreshCharts(client, monitored, data, units, charts, ctx, footer) termui.Body.Align() termui.Render(termui.Body) // Watch for various system events, and periodically refresh the charts termui.Handle("/sys/kbd/C-c", func(termui.Event) { termui.StopLoop() }) termui.Handle("/sys/wnd/resize", func(termui.Event) { termui.Body.Width = termui.TermWidth() for _, chart := range charts { chart.Height = (termui.TermHeight() - footer.Height) / rows } termui.Body.Align() termui.Render(termui.Body) }) go func() { tick := time.NewTicker(time.Duration(ctx.Int(monitorCommandRefreshFlag.Name)) * time.Second) for range tick.C { if refreshCharts(client, monitored, data, units, charts, ctx, footer) { termui.Body.Align() } termui.Render(termui.Body) } }() termui.Loop() return nil } // retrieveMetrics contacts the attached gero node and retrieves the entire set // of collected system metrics. func retrieveMetrics(client *rpc.Client) (map[string]interface{}, error) { var metrics map[string]interface{} err := client.Call(&metrics, "debug_metrics", true) return metrics, err } // resolveMetrics takes a list of input metric patterns, and resolves each to one // or more canonical metric names. func resolveMetrics(metrics map[string]interface{}, patterns []string) []string { res := []string{} for _, pattern := range patterns { res = append(res, resolveMetric(metrics, pattern, "")...) } return res } // resolveMetrics takes a single of input metric pattern, and resolves it to one // or more canonical metric names. func resolveMetric(metrics map[string]interface{}, pattern string, path string) []string { results := []string{} // If a nested metric was requested, recurse optionally branching (via comma) parts := strings.SplitN(pattern, "/", 2) if len(parts) > 1 { for _, variation := range strings.Split(parts[0], ",") { submetrics, ok := metrics[variation].(map[string]interface{}) if !ok { utils.Fatalf("Failed to retrieve system metrics: %s", path+variation) return nil } results = append(results, resolveMetric(submetrics, parts[1], path+variation+"/")...) } return results } // Depending what the last link is, return or expand for _, variation := range strings.Split(pattern, ",") { switch metric := metrics[variation].(type) { case float64: // Final metric value found, return as singleton results = append(results, path+variation) case map[string]interface{}: results = append(results, expandMetrics(metric, path+variation+"/")...) default: utils.Fatalf("Metric pattern resolved to unexpected type: %v", reflect.TypeOf(metric)) return nil } } return results } // expandMetrics expands the entire tree of metrics into a flat list of paths. func expandMetrics(metrics map[string]interface{}, path string) []string { // Iterate over all fields and expand individually list := []string{} for name, metric := range metrics { switch metric := metric.(type) { case float64: // Final metric value found, append to list list = append(list, path+name) case map[string]interface{}: // Tree of metrics found, expand recursively list = append(list, expandMetrics(metric, path+name+"/")...) default: utils.Fatalf("Metric pattern %s resolved to unexpected type: %v", path+name, reflect.TypeOf(metric)) return nil } } return list } // fetchMetric iterates over the metrics map and retrieves a specific one. func fetchMetric(metrics map[string]interface{}, metric string) float64 { parts := strings.Split(metric, "/") for _, part := range parts[:len(parts)-1] { var found bool metrics, found = metrics[part].(map[string]interface{}) if !found { return 0 } } if v, ok := metrics[parts[len(parts)-1]].(float64); ok { return v } return 0 } // refreshCharts retrieves a next batch of metrics, and inserts all the new // values into the active datasets and charts func refreshCharts(client *rpc.Client, metrics []string, data [][]float64, units []int, charts []*termui.LineChart, ctx *cli.Context, footer *termui.Par) (realign bool) { values, err := retrieveMetrics(client) for i, metric := range metrics { if len(data) < 512 { data[i] = append([]float64{fetchMetric(values, metric)}, data[i]...) } else { data[i] = append([]float64{fetchMetric(values, metric)}, data[i][:len(data[i])-1]...) } if updateChart(metric, data[i], &units[i], charts[i], err) { realign = true } } updateFooter(ctx, err, footer) return } // updateChart inserts a dataset into a line chart, scaling appropriately as to // not display weird labels, also updating the chart label accordingly. func updateChart(metric string, data []float64, base *int, chart *termui.LineChart, err error) (realign bool) { dataUnits := []string{"", "K", "M", "G", "T", "E"} timeUnits := []string{"ns", "µs", "ms", "s", "ks", "ms"} colors := []termui.Attribute{termui.ColorBlue, termui.ColorCyan, termui.ColorGreen, termui.ColorYellow, termui.ColorRed, termui.ColorRed} // Extract only part of the data that's actually visible if chart.Width*2 < len(data) { data = data[:chart.Width*2] } // Find the maximum value and scale under 1K high := 0.0 if len(data) > 0 { high = data[0] for _, value := range data[1:] { high = math.Max(high, value) } } unit, scale := 0, 1.0 for high >= 1000 && unit+1 < len(dataUnits) { high, unit, scale = high/1000, unit+1, scale*1000 } // If the unit changes, re-create the chart (hack to set max height...) if unit != *base { realign, *base, *chart = true, unit, *createChart(chart.Height) } // Update the chart's data points with the scaled values if cap(chart.Data) < len(data) { chart.Data = make([]float64, len(data)) } chart.Data = chart.Data[:len(data)] for i, value := range data { chart.Data[i] = value / scale } // Update the chart's label with the scale units units := dataUnits if strings.Contains(metric, "/Percentiles/") || strings.Contains(metric, "/pauses/") || strings.Contains(metric, "/time/") { units = timeUnits } chart.BorderLabel = metric if len(units[unit]) > 0 { chart.BorderLabel += " [" + units[unit] + "]" } chart.LineColor = colors[unit] | termui.AttrBold if err != nil { chart.LineColor = termui.ColorRed | termui.AttrBold } return } // createChart creates an empty line chart with the default configs. func createChart(height int) *termui.LineChart { chart := termui.NewLineChart() if runtime.GOOS == "windows" { chart.Mode = "dot" } chart.DataLabels = []string{""} chart.Height = height chart.AxesColor = termui.ColorWhite chart.PaddingBottom = -2 chart.BorderLabelFg = chart.BorderFg | termui.AttrBold chart.BorderFg = chart.BorderBg return chart } // updateFooter updates the footer contents based on any encountered errors. func updateFooter(ctx *cli.Context, err error, footer *termui.Par) { // Generate the basic footer refresh := time.Duration(ctx.Int(monitorCommandRefreshFlag.Name)) * time.Second footer.Text = fmt.Sprintf("Press Ctrl+C to quit. Refresh interval: %v.", refresh) footer.TextFgColor = termui.ThemeAttr("par.fg") | termui.AttrBold // Append any encountered errors if err != nil { footer.Text = fmt.Sprintf("Error: %v.", err) footer.TextFgColor = termui.ColorRed | termui.AttrBold } } ================================================ FILE: cmd/gero/snapshotcmd.go ================================================ package main import ( "fmt" "github.com/sero-cash/go-sero/cmd/utils" "github.com/sero-cash/go-sero/zero/snapshot" "gopkg.in/urfave/cli.v1" ) var ( snapshotCommand = cli.Command{ Action: utils.MigrateFlags(makeSnapshot), Name: "snapshot", Usage: "Create snapshot from a target chaindata folder", ArgsUsage: "", Flags: []cli.Flag{ utils.DataDirFlag, }, Category: "BLOCKCHAIN COMMANDS", Description: ` The first argument must be the directory containing the blockchain to download from`, } ) func makeSnapshot(ctx *cli.Context) error { if len(ctx.Args()) != 1 { utils.Fatalf("target chaindata directory path argument missing") } stack, _:= makeConfigNode(ctx) srcDb:=stack.ResolvePath("chaindata") tarDb:=ctx.Args().First() fmt.Printf("%s ----> %s\n",srcDb,tarDb) if sg,err:=snapshot.NewSnapshotGen(srcDb,tarDb);err!=nil { println("Make snapshot error:",err.Error()) } else { sg.Run() sg.Close() } return nil } ================================================ FILE: cmd/gero/testdata/empty.js ================================================ ================================================ FILE: cmd/gero/testdata/guswallet.json ================================================ { "encseed": "26d87f5f2bf9835f9a47eefae571bc09f9107bb13d54ff12a4ec095d01f83897494cf34f7bed2ed34126ecba9db7b62de56c9d7cd136520a0427bfb11b8954ba7ac39b90d4650d3448e31185affcd74226a68f1e94b1108e6e0a4a91cdd83eba", "ethaddr": "d4584b5f6229b7be90727b0fc8c6b91bb427821f", "email": "gustav.simonsson@gmail.com", "btcaddr": "1EVknXyFC68kKNLkh6YnKzW41svSRoaAcx" } ================================================ FILE: cmd/gero/testdata/passwords.txt ================================================ foobar foobar foobar ================================================ FILE: cmd/gero/testdata/wrong-passwords.txt ================================================ wrong wrong wrong ================================================ FILE: cmd/gero/usage.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of go-ethereum. // // go-ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // go-ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with go-ethereum. If not, see . // Contains the gero command usage template and generator. package main import ( "io" "sort" "strings" "github.com/sero-cash/go-sero/cmd/utils" "github.com/sero-cash/go-sero/internal/debug" "gopkg.in/urfave/cli.v1" ) // AppHelpTemplate is the test template for the default, global app help topic. var AppHelpTemplate = `NAME: {{.App.Name}} - {{.App.Usage}} Copyright 2013-2018 The go-sero Authors USAGE: {{.App.HelpName}} [options]{{if .App.Commands}} command [command options]{{end}} {{if .App.ArgsUsage}}{{.App.ArgsUsage}}{{else}}[arguments...]{{end}} {{if .App.Version}} VERSION: {{.App.Version}} {{end}}{{if len .App.Authors}} AUTHOR(S): {{range .App.Authors}}{{ . }}{{end}} {{end}}{{if .App.Commands}} COMMANDS: {{range .App.Commands}}{{join .Names ", "}}{{ "\t" }}{{.Usage}} {{end}}{{end}}{{if .FlagGroups}} {{range .FlagGroups}}{{.Name}} OPTIONS: {{range .Flags}}{{.}} {{end}} {{end}}{{end}}{{if .App.Copyright }} COPYRIGHT: {{.App.Copyright}} {{end}} ` // flagGroup is a collection of flags belonging to a single topic. type flagGroup struct { Name string Flags []cli.Flag } // AppHelpFlagGroups is the application flags, grouped by functionality. var AppHelpFlagGroups = []flagGroup{ { Name: "SERO", Flags: []cli.Flag{ configFileFlag, utils.DataDirFlag, utils.KeyStoreDirFlag, utils.NetworkIdFlag, utils.AlphanetFlag, utils.DeveloperFlag, utils.SyncModeFlag, utils.SeroStatsURLFlag, utils.IdentityFlag, }, }, { Name: "DEVELOPER CHAIN", Flags: []cli.Flag{ utils.DeveloperPeriodFlag, }, }, { Name: "ETHASH", Flags: []cli.Flag{ utils.EthashCacheDirFlag, utils.EthashCachesInMemoryFlag, utils.EthashCachesOnDiskFlag, utils.EthashDatasetDirFlag, utils.EthashDatasetsInMemoryFlag, utils.EthashDatasetsOnDiskFlag, }, }, { Name: "TRANSACTION POOL", Flags: []cli.Flag{ utils.TxPoolNoLocalsFlag, utils.TxPoolPriceLimitFlag, utils.TxPoolAccountSlotsFlag, utils.TxPoolGlobalSlotsFlag, utils.TxPoolAccountQueueFlag, utils.TxPoolGlobalQueueFlag, utils.TxPoolLifetimeFlag, }, }, { Name: "PERFORMANCE TUNING", Flags: []cli.Flag{ utils.CacheFlag, utils.CacheDatabaseFlag, utils.CacheGCFlag, utils.TrieCacheGenFlag, }, }, { Name: "ACCOUNT", Flags: []cli.Flag{ utils.UnlockedAccountFlag, utils.PasswordFileFlag, }, }, { Name: "API AND CONSOLE", Flags: []cli.Flag{ utils.RPCEnabledFlag, utils.RPCListenAddrFlag, utils.RPCPortFlag, utils.RPCApiFlag, utils.RPCReadTimeoutFlag, utils.RPCWriteTimeoutFlag, utils.RPCIdleTimeoutFlag, utils.WSEnabledFlag, utils.WSListenAddrFlag, utils.WSPortFlag, utils.WSApiFlag, utils.WSAllowedOriginsFlag, utils.IPCDisabledFlag, utils.IPCPathFlag, utils.RPCCORSDomainFlag, utils.RPCVirtualHostsFlag, utils.JSpathFlag, utils.ExecFlag, utils.PreloadJSFlag, }, }, { Name: "NETWORKING", Flags: []cli.Flag{ utils.BootnodesFlag, utils.BootnodesV4Flag, utils.BootnodesV5Flag, utils.ListenPortFlag, utils.MaxPeersFlag, utils.MaxPendingPeersFlag, utils.NATFlag, utils.NoDiscoverFlag, utils.DiscoveryV5Flag, utils.NetrestrictFlag, utils.NodeKeyFileFlag, utils.NodeKeyHexFlag, }, }, { Name: "MINER", Flags: []cli.Flag{ utils.MiningEnabledFlag, utils.MinerThreadsFlag, utils.SerobaseFlag, utils.TargetGasLimitFlag, utils.GasPriceFlag, utils.ExtraDataFlag, }, }, { Name: "GAS PRICE ORACLE", Flags: []cli.Flag{ utils.GpoBlocksFlag, utils.GpoPercentileFlag, }, }, { Name: "VIRTUAL MACHINE", Flags: []cli.Flag{ utils.VMEnableDebugFlag, }, }, { Name: "LOGGING AND DEBUGGING", Flags: append([]cli.Flag{ utils.FakePoWFlag, utils.NoCompactionFlag, }, debug.Flags...), }, { Name: "METRICS AND STATS", Flags: []cli.Flag{ utils.MetricsEnabledFlag, utils.MetricsEnableInfluxDBFlag, utils.MetricsInfluxDBEndpointFlag, utils.MetricsInfluxDBDatabaseFlag, utils.MetricsInfluxDBUsernameFlag, utils.MetricsInfluxDBPasswordFlag, utils.MetricsInfluxDBHostTagFlag, }, }, { Name: "MISC", }, } // byCategory sorts an array of flagGroup by Name in the order // defined in AppHelpFlagGroups. type byCategory []flagGroup func (a byCategory) Len() int { return len(a) } func (a byCategory) Swap(i, j int) { a[i], a[j] = a[j], a[i] } func (a byCategory) Less(i, j int) bool { iCat, jCat := a[i].Name, a[j].Name iIdx, jIdx := len(AppHelpFlagGroups), len(AppHelpFlagGroups) // ensure non categorized flags come last for i, group := range AppHelpFlagGroups { if iCat == group.Name { iIdx = i } if jCat == group.Name { jIdx = i } } return iIdx < jIdx } func flagCategory(flag cli.Flag) string { for _, category := range AppHelpFlagGroups { for _, flg := range category.Flags { if flg.GetName() == flag.GetName() { return category.Name } } } return "MISC" } func init() { // Override the default app help template cli.AppHelpTemplate = AppHelpTemplate // Define a one shot struct to pass to the usage template type helpData struct { App interface{} FlagGroups []flagGroup } // Override the default app help printer, but only for the global app help originalHelpPrinter := cli.HelpPrinter cli.HelpPrinter = func(w io.Writer, tmpl string, data interface{}) { if tmpl == AppHelpTemplate { // Iterate over all the flags and add any uncategorized ones categorized := make(map[string]struct{}) for _, group := range AppHelpFlagGroups { for _, flag := range group.Flags { categorized[flag.String()] = struct{}{} } } uncategorized := []cli.Flag{} for _, flag := range data.(*cli.App).Flags { if _, ok := categorized[flag.String()]; !ok { if strings.HasPrefix(flag.GetName(), "dashboard") { continue } uncategorized = append(uncategorized, flag) } } if len(uncategorized) > 0 { // Append all ungategorized options to the misc group miscs := len(AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags) AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags = append(AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags, uncategorized...) // Make sure they are removed afterwards defer func() { AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags = AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags[:miscs] }() } // Render out custom usage screen originalHelpPrinter(w, tmpl, helpData{data, AppHelpFlagGroups}) } else if tmpl == utils.CommandHelpTemplate { // Iterate over all command specific flags and categorize them categorized := make(map[string][]cli.Flag) for _, flag := range data.(cli.Command).Flags { if _, ok := categorized[flag.String()]; !ok { categorized[flagCategory(flag)] = append(categorized[flagCategory(flag)], flag) } } // sort to get a stable ordering sorted := make([]flagGroup, 0, len(categorized)) for cat, flgs := range categorized { sorted = append(sorted, flagGroup{cat, flgs}) } sort.Sort(byCategory(sorted)) // add sorted array to data and render with default printer originalHelpPrinter(w, tmpl, map[string]interface{}{ "cmd": data, "categorizedFlags": sorted, }) } else { originalHelpPrinter(w, tmpl, data) } } } ================================================ FILE: cmd/internal/browser/browser.go ================================================ // Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package browser provides utilities for interacting with users' browsers. package browser import ( "os" "os/exec" "runtime" ) // Commands returns a list of possible commands to use to open a url. func Commands() [][]string { var cmds [][]string if exe := os.Getenv("BROWSER"); exe != "" { cmds = append(cmds, []string{exe}) } switch runtime.GOOS { case "darwin": cmds = append(cmds, []string{"/usr/bin/open"}) case "windows": cmds = append(cmds, []string{"cmd", "/c", "start"}) default: cmds = append(cmds, []string{"xdg-open"}) } cmds = append(cmds, []string{"chrome"}, []string{"google-chrome"}, []string{"chromium"}, []string{"firefox"}, ) return cmds } // Open tries to open url in a browser and reports whether it succeeded. func Open(url string) bool { for _, args := range Commands() { cmd := exec.Command(args[0], append(args[1:], url)...) if cmd.Start() == nil { return true } } return false } ================================================ FILE: cmd/proofnode/main.go ================================================ package main import ( "flag" "fmt" "log" "os" "runtime" "strings" "time" "github.com/btcsuite/btcutil/base58" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/internal/ethapi" "github.com/sero-cash/go-sero/rpc" "github.com/sero-cash/go-sero/zero/proofservice" "github.com/sero-cash/go-sero/zero/utils" ) func main() { runtime.GOMAXPROCS(runtime.NumCPU()) endpoint := flag.String("addr", ":9765", "listen address") rpc, config, tomeOut := initConfig() if err := startNode(*endpoint, rpc, config, tomeOut); err != nil { os.Exit(0) } select {} } func startNode(endpoint, rpcAddr string, config *proofservice.Config, timeout rpc.HTTPTimeouts) error { if endpoint == "" { return nil } proofservice.NewProofService(rpcAddr, nil, config) apis := []rpc.API{ { Namespace: "proof", Version: "1.0", Service: ethapi.NewProofServiceApi(), Public: true, }} _, _, err := rpc.StartHTTPEndpoint(endpoint, apis, []string{"proof"}, []string{}, []string{}, timeout) if err != nil { return err } log.Printf("HTTP endpoint opened, url %s", fmt.Sprintf("http://%s", endpoint)) return nil } func initConfig() (string, *proofservice.Config, rpc.HTTPTimeouts) { var ( maxWorkNumber = flag.Int("maxWorkNumber", 10, "max work count") maxQueueNumber = flag.Int("maxQueueNumber", 20, "max work pending count") readTimeout = flag.Duration("readTimeout", 120*time.Second, "readTimeout") writeTimeout = flag.Duration("writeTimeout", 120*time.Second, "writeTimeout") idleTimeout = flag.Duration("idleTimeout", 180*time.Second, "idleTimeout") rpcAddr = flag.String("rpcAddr", "127.0.0.1:8545", "idleTimeout") zinFee = flag.String("zinFee", "0sero", "zinFee") oinFee = flag.String("oinFee", "0sero", "oinFee") outFee = flag.String("outFee", "0sero", "outFee") fixedFee = flag.String("fee", "0sero", "outFee") pkrString = flag.String("pkr", "0sero", "outFee") // endpoint = flag.String("redis", "127.0.0.1:6379", "redis endpoint") // password = flag.String("password", "", "redis password") // database = flag.Int64("database", 0, "redis database") // poolSize = flag.Int("poolSize", 10, "redis poolSize") ) if strings.TrimSpace(*pkrString) == "" { panic("pkr is empty") } zinFeeAmount, err := utils.ParseAmount(*zinFee) if err != nil { panic(err) } oinFeeAmount, err := utils.ParseAmount(*oinFee) if err != nil { panic(err) } outFeeAmount, err := utils.ParseAmount(*outFee) if err != nil { panic(err) } fixedFeeAmount, err := utils.ParseAmount(*fixedFee) if err != nil { panic(err) } pkr := c_type.NewPKrByBytes(base58.Decode(*pkrString)) timeout := rpc.HTTPTimeouts{*readTimeout, *writeTimeout, *idleTimeout} fee := proofservice.ServiceFee{zinFeeAmount, oinFeeAmount, outFeeAmount, fixedFeeAmount} return *rpcAddr, &proofservice.Config{pkr, *maxWorkNumber, *maxQueueNumber, fee}, timeout } ================================================ FILE: cmd/tx/confirm.go ================================================ package main import ( "bufio" "encoding/json" "fmt" "os" "strings" "github.com/sero-cash/go-sero/zero/txtool/generate/generate_1" "github.com/sero-cash/go-sero/zero/txs/stx/stx_v1" "github.com/sero-cash/go-sero/zero/txs/stx/stx_v0" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/common/hexutil" ) func Confirm(key_str string, out_str string) { stdin := bufio.NewReader(os.Stdin) if len(key_str) == 0 { fmt.Println("input key:") var err error key_str, err = stdin.ReadString('\n') if err != nil { OUTPUT_ERROR("TK READ ERROR", nil) return } key_str = strings.Trim(key_str, "\n") fmt.Println(key_str) } if len(out_str) == 0 { fmt.Println("input out:") var err error out_str, err = stdin.ReadString('\n') if err != nil { OUTPUT_ERROR("OUT READ ERROR", nil) return } out_str = strings.Trim(out_str, "\n") fmt.Println(out_str) } key_str = strings.Trim(key_str, "'") out_str = strings.Trim(out_str, "'") if key_str[1] != 'x' { key_str = "0x" + key_str } if key_bs, e := hexutil.Decode(key_str); e == nil { if len(key_bs) == 32 { key := c_type.Uint256{} copy(key[:], key_bs) if strings.Contains(out_str, "\"OutCM\":") { var out stx_v0.Out_Z if e := json.Unmarshal([]byte(out_str), &out); e == nil { if dout := generate_1.ConfirmOutZ(&key, true, &out); dout != nil { if dout_bs, e := json.Marshal(dout); e == nil { OUTPUT_RESULT(string(dout_bs)) } else { OUTPUT_ERROR("Marshal-", e) } } else { OUTPUT_ERROR("Confirm OutZ Failed", nil) } } else { OUTPUT_ERROR("Out_Z Unmarshal-", e) } } else { var out stx_v1.Out_C if e := json.Unmarshal([]byte(out_str), &out); e == nil { if dout, _ := generate_1.ConfirmOutC(&key, &out); dout != nil { if dout_bs, e := json.Marshal(dout); e == nil { OUTPUT_RESULT(string(dout_bs)) } else { OUTPUT_ERROR("Out_C Marshal-", e) } } } else { OUTPUT_ERROR("Out_C Unmarshal-", e) } } } else { OUTPUT_ERROR("key must 32 bytes", nil) } } else { OUTPUT_ERROR("KeyDecode-", e) } } ================================================ FILE: cmd/tx/dec.go ================================================ package main import ( "bufio" "encoding/json" "fmt" "os" "strings" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/txtool/flight" "github.com/sero-cash/go-sero/common/hexutil" "github.com/sero-cash/go-sero/zero/txtool" ) func Dec(tk_str string, out_str string) { stdin := bufio.NewReader(os.Stdin) if len(tk_str) == 0 { fmt.Println("input tk:") var err error tk_str, err = stdin.ReadString('\n') if err != nil { OUTPUT_ERROR("TK READ ERROR", nil) return } tk_str = strings.Trim(tk_str, "\n") fmt.Println(tk_str) } if len(out_str) == 0 { fmt.Println("input out:") var err error out_str, err = stdin.ReadString('\n') if err != nil { OUTPUT_ERROR("OUT READ ERROR", nil) return } out_str = strings.Trim(out_str, "\n") fmt.Println(out_str) } tk_str = strings.Trim(tk_str, "'") out_str = strings.Trim(out_str, "'") if tk_str[1] != 'x' { tk_str = "0x" + tk_str } if tk_bs, e := hexutil.Decode(tk_str); e == nil { if len(tk_bs) == 64 { tk := c_type.Tk{} copy(tk[:], tk_bs) var outs []txtool.Out if e := json.Unmarshal([]byte(out_str), &outs); e == nil { douts := flight.DecOut(&tk, outs) if douts_bs, e := json.Marshal(douts); e == nil { OUTPUT_RESULT(string(douts_bs)) } else { OUTPUT_ERROR("Marshal-", e) } } else { OUTPUT_ERROR("Unmarshal-", e) } } else { OUTPUT_ERROR("tk must 64 bytes", nil) } } else { OUTPUT_ERROR("TKDecode-", e) } } ================================================ FILE: cmd/tx/main.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of go-ethereum. // // go-ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // go-ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with go-ethereum. If not, see . package main import ( "flag" "fmt" "runtime" "github.com/sero-cash/go-czero-import/superzk" "github.com/sero-cash/go-sero/zero/zconfig" "github.com/sero-cash/go-czero-import/seroparam" ) var method = "" var txParam = "" var sk = "" var tk = "" var out = "" var key = "" func init() { flag.StringVar(&method, "method", "", "tx method") flag.StringVar(&txParam, "tx", "", "txparam for sign") flag.StringVar(&sk, "sk", "", "sk for sign") flag.StringVar(&tk, "tk", "", "tk for dec") flag.StringVar(&out, "out", "", "out for dec") } func OUTPUT_RESULT(result interface{}) { fmt.Println("[OUTPUT-BEGIN]", result) } func OUTPUT_ERROR(result interface{}, e error) { fmt.Println("[OUTPUT-BEGIN] ERROR:", result, e) } func main() { seroparam.InitExchangeValueStr(true) runtime.GOMAXPROCS(runtime.NumCPU()) fmt.Printf("PThread: %v \n", zconfig.G_p_thread_num) flag.Parse() if method == "sign" { superzk.ZeroInit_OnlyInOuts() Sign(sk, txParam) return } if method == "dec" { superzk.ZeroInit_NoCircuit() Dec(tk, out) return } if method == "confirm" { superzk.ZeroInit_NoCircuit() Confirm(key, out) return } OUTPUT_ERROR("METHOD-MUST-[sign,dec,confirm]", nil) } ================================================ FILE: cmd/tx/sign.go ================================================ package main import ( "bufio" "encoding/json" "fmt" "os" "strings" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/common/hexutil" "github.com/sero-cash/go-sero/zero/txtool" "github.com/sero-cash/go-sero/zero/txtool/flight" ) func Sign(sk string, txParam string) { stdin := bufio.NewReader(os.Stdin) if len(sk) == 0 { fmt.Println("input sk:") var err error sk, err = stdin.ReadString('\n') if err != nil { OUTPUT_ERROR("SK READ ERROR", nil) return } sk = strings.Trim(sk, "\n") fmt.Println(sk) } if len(txParam) == 0 { fmt.Println("input txParam:") var err error txParam, err = stdin.ReadString('\n') if err != nil { OUTPUT_ERROR("TXPARAM READ ERROR", nil) return } txParam = strings.Trim(txParam, "\n") fmt.Println(txParam) } sk = strings.Trim(sk, "'") txParam = strings.Trim(txParam, "'") sk_bytes := c_type.Uint512{} if sk[1] != 'x' { sk = "0x" + sk } if bs, e := hexutil.Decode(sk); e != nil { OUTPUT_ERROR("DecodeSK-", e) } else { copy(sk_bytes[:], bs) if len(txParam) > 0 && len(sk) > 0 { var gtp txtool.GTxParam if e := json.Unmarshal([]byte(txParam), >p); e != nil { OUTPUT_ERROR("Unmarshal-", e) } else { if gtx, e := flight.SignTx(&sk_bytes, >p); e != nil { OUTPUT_ERROR("SignTx-", e) } else { if jtx, e := json.Marshal(>x); e != nil { OUTPUT_ERROR("Marshal-", e) } else { OUTPUT_RESULT(string(jtx)) } } } } else { OUTPUT_ERROR("Input params invalid", nil) } } } ================================================ FILE: cmd/utils/cmd.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of go-ethereum. // // go-ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // go-ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with go-ethereum. If not, see . // Package utils contains internal helper functions for go-sero commands. package utils import ( "compress/gzip" "fmt" "io" "os" "os/signal" "runtime" "strings" "syscall" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core" "github.com/sero-cash/go-sero/core/rawdb" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/crypto" "github.com/sero-cash/go-sero/internal/debug" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/node" "github.com/sero-cash/go-sero/rlp" "github.com/sero-cash/go-sero/serodb" ) const ( importBatchSize = 2500 ) // Fatalf formats a message to standard error and exits the program. // The message is also printed to standard output if standard error // is redirected to a different file. func Fatalf(format string, args ...interface{}) { w := io.MultiWriter(os.Stdout, os.Stderr) if runtime.GOOS == "windows" { // The SameFile check below doesn't work on Windows. // stdout is unlikely to get redirected though, so just print there. w = os.Stdout } else { outf, _ := os.Stdout.Stat() errf, _ := os.Stderr.Stat() if outf != nil && errf != nil && os.SameFile(outf, errf) { w = os.Stderr } } fmt.Fprintf(w, "Fatal: "+format+"\n", args...) os.Exit(1) } func StartNode(stack *node.Node) { if err := stack.Start(); err != nil { Fatalf("Error starting protocol stack: %v", err) } go func() { sigc := make(chan os.Signal, 1) signal.Notify(sigc, syscall.SIGINT, syscall.SIGTERM) defer signal.Stop(sigc) <-sigc log.Info("Got interrupt, shutting down...") go stack.Stop() for i := 10; i > 0; i-- { <-sigc if i > 1 { log.Warn("Already shutting down, interrupt more to panic.", "times", i-1) } } debug.Exit() // ensure trace and CPU profile data is flushed. debug.LoudPanic("boom") }() } func ImportChain(chain *core.BlockChain, fn string) error { // Watch for Ctrl-C while the import is running. // If a signal is received, the import will stop at the next batch. interrupt := make(chan os.Signal, 1) stop := make(chan struct{}) signal.Notify(interrupt, syscall.SIGINT, syscall.SIGTERM) defer signal.Stop(interrupt) defer close(interrupt) go func() { if _, ok := <-interrupt; ok { log.Info("Interrupted during import, stopping at next batch") } close(stop) }() checkInterrupt := func() bool { select { case <-stop: return true default: return false } } log.Info("Importing blockchain", "file", fn) // Open the file handle and potentially unwrap the gzip stream fh, err := os.Open(fn) if err != nil { return err } defer fh.Close() var reader io.Reader = fh if strings.HasSuffix(fn, ".gz") { if reader, err = gzip.NewReader(reader); err != nil { return err } } stream := rlp.NewStream(reader, 0) // Run actual the import. blocks := make(types.Blocks, importBatchSize) n := 0 for batch := 0; ; batch++ { // Load a batch of RLP blocks. if checkInterrupt() { return fmt.Errorf("interrupted") } i := 0 for ; i < importBatchSize; i++ { var b types.Block if err := stream.Decode(&b); err == io.EOF { break } else if err != nil { return fmt.Errorf("at block %d: %v", n, err) } // don't import first block if b.NumberU64() == 0 { i-- continue } blocks[i] = &b n++ } if i == 0 { break } // Import the batch. if checkInterrupt() { return fmt.Errorf("interrupted") } missing := missingBlocks(chain, blocks[:i]) if len(missing) == 0 { log.Info("Skipping batch as all blocks present", "batch", batch, "first", blocks[0].Hash(), "last", blocks[i-1].Hash()) continue } if _, err := chain.InsertChain(missing); err != nil { return fmt.Errorf("invalid block %d: %v", n, err) } } return nil } func missingBlocks(chain *core.BlockChain, blocks []*types.Block) []*types.Block { head := chain.CurrentBlock() for i, block := range blocks { // If we're behind the chain head, only check block, state is available at head if head.NumberU64() > block.NumberU64() { if !chain.HasBlock(block.Hash(), block.NumberU64()) { return blocks[i:] } continue } // If we're above the chain head, state availability is a must if !chain.HasBlockAndState(block.Hash(), block.NumberU64()) { return blocks[i:] } } return nil } // ExportChain exports a blockchain into the specified file, truncating any data // already present in the file. func ExportChain(blockchain *core.BlockChain, fn string) error { log.Info("Exporting blockchain", "file", fn) // Open the file handle and potentially wrap with a gzip stream fh, err := os.OpenFile(fn, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, os.ModePerm) if err != nil { return err } defer fh.Close() var writer io.Writer = fh if strings.HasSuffix(fn, ".gz") { writer = gzip.NewWriter(writer) defer writer.(*gzip.Writer).Close() } // Iterate over the blocks and export them if err := blockchain.Export(writer); err != nil { return err } log.Info("Exported blockchain", "file", fn) return nil } // ExportAppendChain exports a blockchain into the specified file, appending to // the file if data already exists in it. func ExportAppendChain(blockchain *core.BlockChain, fn string, first uint64, last uint64) error { log.Info("Exporting blockchain", "file", fn) // Open the file handle and potentially wrap with a gzip stream fh, err := os.OpenFile(fn, os.O_CREATE|os.O_APPEND|os.O_WRONLY, os.ModePerm) if err != nil { return err } defer fh.Close() var writer io.Writer = fh if strings.HasSuffix(fn, ".gz") { writer = gzip.NewWriter(writer) defer writer.(*gzip.Writer).Close() } // Iterate over the blocks and export them if err := blockchain.ExportN(writer, first, last); err != nil { return err } log.Info("Exported blockchain to", "file", fn) return nil } // ImportPreimages imports a batch of exported hash preimages into the database. func ImportPreimages(db *serodb.LDBDatabase, fn string) error { log.Info("Importing preimages", "file", fn) // Open the file handle and potentially unwrap the gzip stream fh, err := os.Open(fn) if err != nil { return err } defer fh.Close() var reader io.Reader = fh if strings.HasSuffix(fn, ".gz") { if reader, err = gzip.NewReader(reader); err != nil { return err } } stream := rlp.NewStream(reader, 0) // Import the preimages in batches to prevent disk trashing preimages := make(map[common.Hash][]byte) for { // Read the next entry and ensure it's not junk var blob []byte if err := stream.Decode(&blob); err != nil { if err == io.EOF { break } return err } // Accumulate the preimages and flush when enough ws gathered preimages[crypto.Keccak256Hash(blob)] = common.CopyBytes(blob) if len(preimages) > 1024 { rawdb.WritePreimages(db, 0, preimages) preimages = make(map[common.Hash][]byte) } } // Flush the last batch preimage data if len(preimages) > 0 { rawdb.WritePreimages(db, 0, preimages) } return nil } // ExportPreimages exports all known hash preimages into the specified file, // truncating any data already present in the file. func ExportPreimages(db *serodb.LDBDatabase, fn string) error { log.Info("Exporting preimages", "file", fn) // Open the file handle and potentially wrap with a gzip stream fh, err := os.OpenFile(fn, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, os.ModePerm) if err != nil { return err } defer fh.Close() var writer io.Writer = fh if strings.HasSuffix(fn, ".gz") { writer = gzip.NewWriter(writer) defer writer.(*gzip.Writer).Close() } // Iterate over the preimages and export them it := db.NewIteratorWithPrefix([]byte("secure-key-")) for it.Next() { if err := rlp.Encode(writer, it.Value()); err != nil { return err } } log.Info("Exported preimages", "file", fn) return nil } ================================================ FILE: cmd/utils/customflags.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of go-ethereum. // // go-ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // go-ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with go-ethereum. If not, see . package utils import ( "encoding" "errors" "flag" "fmt" "math/big" "os" "os/user" "path" "strings" "github.com/sero-cash/go-sero/common/math" "gopkg.in/urfave/cli.v1" ) // Custom type which is registered in the flags library which cli uses for // argument parsing. This allows us to expand Value to an absolute path when // the argument is parsed type DirectoryString struct { Value string } func (self *DirectoryString) String() string { return self.Value } func (self *DirectoryString) Set(value string) error { self.Value = expandPath(value) return nil } // Custom cli.Flag type which expand the received string to an absolute path. // e.g. ~/.ethereum -> /home/username/.ethereum type DirectoryFlag struct { Name string Value DirectoryString Usage string } func (self DirectoryFlag) String() string { fmtString := "%s %v\t%v" if len(self.Value.Value) > 0 { fmtString = "%s \"%v\"\t%v" } return fmt.Sprintf(fmtString, prefixedNames(self.Name), self.Value.Value, self.Usage) } func eachName(longName string, fn func(string)) { parts := strings.Split(longName, ",") for _, name := range parts { name = strings.Trim(name, " ") fn(name) } } // called by cli library, grabs variable from environment (if in env) // and adds variable to flag set for parsing. func (self DirectoryFlag) Apply(set *flag.FlagSet) { eachName(self.Name, func(name string) { set.Var(&self.Value, self.Name, self.Usage) }) } type TextMarshaler interface { encoding.TextMarshaler encoding.TextUnmarshaler } // textMarshalerVal turns a TextMarshaler into a flag.Value type textMarshalerVal struct { v TextMarshaler } func (v textMarshalerVal) String() string { if v.v == nil { return "" } text, _ := v.v.MarshalText() return string(text) } func (v textMarshalerVal) Set(s string) error { return v.v.UnmarshalText([]byte(s)) } // TextMarshalerFlag wraps a TextMarshaler value. type TextMarshalerFlag struct { Name string Value TextMarshaler Usage string } func (f TextMarshalerFlag) GetName() string { return f.Name } func (f TextMarshalerFlag) String() string { return fmt.Sprintf("%s \"%v\"\t%v", prefixedNames(f.Name), f.Value, f.Usage) } func (f TextMarshalerFlag) Apply(set *flag.FlagSet) { eachName(f.Name, func(name string) { set.Var(textMarshalerVal{f.Value}, f.Name, f.Usage) }) } // GlobalTextMarshaler returns the value of a TextMarshalerFlag from the global flag set. func GlobalTextMarshaler(ctx *cli.Context, name string) TextMarshaler { val := ctx.GlobalGeneric(name) if val == nil { return nil } return val.(textMarshalerVal).v } // BigFlag is a command line flag that accepts 256 bit big integers in decimal or // hexadecimal syntax. type BigFlag struct { Name string Value *big.Int Usage string } // bigValue turns *big.Int into a flag.Value type bigValue big.Int func (b *bigValue) String() string { if b == nil { return "" } return (*big.Int)(b).String() } func (b *bigValue) Set(s string) error { int, ok := math.ParseBig256(s) if !ok { return errors.New("invalid integer syntax") } *b = (bigValue)(*int) return nil } func (f BigFlag) GetName() string { return f.Name } func (f BigFlag) String() string { fmtString := "%s %v\t%v" if f.Value != nil { fmtString = "%s \"%v\"\t%v" } return fmt.Sprintf(fmtString, prefixedNames(f.Name), f.Value, f.Usage) } func (f BigFlag) Apply(set *flag.FlagSet) { eachName(f.Name, func(name string) { set.Var((*bigValue)(f.Value), f.Name, f.Usage) }) } // GlobalBig returns the value of a BigFlag from the global flag set. func GlobalBig(ctx *cli.Context, name string) *big.Int { val := ctx.GlobalGeneric(name) if val == nil { return nil } return (*big.Int)(val.(*bigValue)) } func prefixFor(name string) (prefix string) { if len(name) == 1 { prefix = "-" } else { prefix = "--" } return } func prefixedNames(fullName string) (prefixed string) { parts := strings.Split(fullName, ",") for i, name := range parts { name = strings.Trim(name, " ") prefixed += prefixFor(name) + name if i < len(parts)-1 { prefixed += ", " } } return } func (self DirectoryFlag) GetName() string { return self.Name } func (self *DirectoryFlag) Set(value string) { self.Value.Value = value } // Expands a file path // 1. replace tilde with users home dir // 2. expands embedded environment variables // 3. cleans the path, e.g. /a/b/../c -> /a/c // Note, it has limitations, e.g. ~someuser/tmp will not be expanded func expandPath(p string) string { if strings.HasPrefix(p, "~/") || strings.HasPrefix(p, "~\\") { if home := homeDir(); home != "" { p = home + p[1:] } } return path.Clean(os.ExpandEnv(p)) } func homeDir() string { if home := os.Getenv("HOME"); home != "" { return home } if usr, err := user.Current(); err == nil { return usr.HomeDir } return "" } ================================================ FILE: cmd/utils/flags.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of go-ethereum. // // go-ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // go-ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with go-ethereum. If not, see . // Package utils contains internal helper functions for go-sero commands. package utils import ( "crypto/ecdsa" "fmt" "io/ioutil" "os" "path/filepath" "runtime" "strconv" "strings" "time" "gopkg.in/urfave/cli.v1" "github.com/sero-cash/go-czero-import/c_type" "github.com/btcsuite/btcutil/base58" "github.com/sero-cash/go-sero/zero/proofservice" "github.com/sero-cash/go-sero/zero/utils" "github.com/sero-cash/go-sero/rpc" "github.com/sero-cash/go-sero/zero/zconfig" "github.com/sero-cash/go-czero-import/seroparam" "github.com/sero-cash/go-sero/accounts" "github.com/sero-cash/go-sero/accounts/keystore" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/common/fdlimit" "github.com/sero-cash/go-sero/consensus" "github.com/sero-cash/go-sero/consensus/ethash" "github.com/sero-cash/go-sero/core" "github.com/sero-cash/go-sero/core/state" "github.com/sero-cash/go-sero/core/vm" "github.com/sero-cash/go-sero/crypto" "github.com/sero-cash/go-sero/dashboard" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/metrics" "github.com/sero-cash/go-sero/metrics/influxdb" "github.com/sero-cash/go-sero/node" "github.com/sero-cash/go-sero/p2p" "github.com/sero-cash/go-sero/p2p/discover" "github.com/sero-cash/go-sero/p2p/discv5" "github.com/sero-cash/go-sero/p2p/nat" "github.com/sero-cash/go-sero/p2p/netutil" "github.com/sero-cash/go-sero/params" "github.com/sero-cash/go-sero/sero" "github.com/sero-cash/go-sero/sero/downloader" "github.com/sero-cash/go-sero/sero/gasprice" "github.com/sero-cash/go-sero/serodb" ) var ( CommandHelpTemplate = `{{.cmd.Name}}{{if .cmd.Subcommands}} command{{end}}{{if .cmd.Flags}} [command options]{{end}} [arguments...] {{if .cmd.Description}}{{.cmd.Description}} {{end}}{{if .cmd.Subcommands}} SUBCOMMANDS: {{range .cmd.Subcommands}}{{.Name}}{{with .ShortName}}, {{.}}{{end}}{{ "\t" }}{{.Usage}} {{end}}{{end}}{{if .categorizedFlags}} {{range $idx, $categorized := .categorizedFlags}}{{$categorized.Name}} OPTIONS: {{range $categorized.Flags}}{{"\t"}}{{.}} {{end}} {{end}}{{end}}` ) func init() { cli.AppHelpTemplate = `{{.Name}} {{if .Flags}}[global options] {{end}}command{{if .Flags}} [command options]{{end}} [arguments...] VERSION: {{.Version}} COMMANDS: {{range .Commands}}{{.Name}}{{with .ShortName}}, {{.}}{{end}}{{ "\t" }}{{.Usage}} {{end}}{{if .Flags}} GLOBAL OPTIONS: {{range .Flags}}{{.}} {{end}}{{end}} ` cli.CommandHelpTemplate = CommandHelpTemplate } // NewApp creates an app with sane defaults. func NewApp(gitCommit, usage string) *cli.App { app := cli.NewApp() app.Name = filepath.Base(os.Args[0]) app.Author = "" // app.Authors = nil app.Email = "" app.Version = params.VersionWithMeta if len(gitCommit) >= 8 { app.Version += "-" + gitCommit[:8] } app.Usage = usage return app } // These are all the command line flags we support. // If you add to this list, please remember to include the // flag in the appropriate command definition. // // The flags are defined here so their names and help texts // are the same for all commands. var ( // General settings DataDirFlag = DirectoryFlag{ Name: "datadir", Usage: "Data directory for the databases and keystore", Value: DirectoryString{node.DefaultDataDir()}, } KeyStoreDirFlag = DirectoryFlag{ Name: "keystore", Usage: "Directory for the keystore (default = inside the datadir)", } NoUSBFlag = cli.BoolFlag{ Name: "nousb", Usage: "Disables monitoring for and managing USB hardware wallets", } NetworkIdFlag = cli.Uint64Flag{ Name: "networkid", Usage: "Network identifier (integer, 1=Frontier, 2=Morden (disused), 3=Ropsten, 4=Rinkeby)", Value: sero.DefaultConfig.NetworkId, } AlphanetFlag = cli.BoolFlag{ Name: "alpha", Usage: "Ropsten network: pre-configured proof-of-work test network", } DeveloperFlag = cli.BoolFlag{ Name: "dev", Usage: "Dev network: pre-configured proof-of-work in development network", } OfflineFlag = cli.BoolFlag{ Name: "offline", Usage: "Use gero as the offline mode", } SnapshotFlag = cli.Uint64Flag{ Name: "snapshot", Usage: "Use for create chaindata snapshot", } TestStartBlockFlag = cli.Uint64Flag{ Name: "testStartBlock", Usage: "test from startBlock", } TestForkFlag = cli.BoolFlag{ Name: "testFork", Usage: "test fork start", } DeveloperPasswordFlag = cli.StringFlag{ Name: "devpassword", Usage: "devpassword to use create and unlock dev account", } DeveloperPeriodFlag = cli.IntFlag{ Name: "dev.period", Usage: "Block period to use in developer mode (0 = mine only if transaction pending)", } IdentityFlag = cli.StringFlag{ Name: "identity", Usage: "Custom node name", } DocRootFlag = DirectoryFlag{ Name: "docroot", Usage: "Document Root for HTTPClient file scheme", Value: DirectoryString{homeDir()}, } defaultSyncMode = sero.DefaultConfig.SyncMode SyncModeFlag = TextMarshalerFlag{ Name: "syncmode", Usage: `Blockchain sync mode ("fast", "full", or "light")`, Value: &defaultSyncMode, } // Dashboard settings DashboardEnabledFlag = cli.BoolFlag{ Name: metrics.DashboardEnabledFlag, Usage: "Enable the dashboard", } GCModeFlag = cli.StringFlag{ Name: "gcmode", Usage: `Blockchain garbage collection mode ("full", "archive")`, Value: "full", } DashboardAddrFlag = cli.StringFlag{ Name: "dashboard.addr", Usage: "Dashboard listening interface", Value: dashboard.DefaultConfig.Host, } DashboardPortFlag = cli.IntFlag{ Name: "dashboard.host", Usage: "Dashboard listening port", Value: dashboard.DefaultConfig.Port, } DashboardRefreshFlag = cli.DurationFlag{ Name: "dashboard.refresh", Usage: "Dashboard metrics collection refresh rate", Value: dashboard.DefaultConfig.Refresh, } // Ethash settings EthashCacheDirFlag = DirectoryFlag{ Name: "ethash.cachedir", Usage: "Directory to store the ethash verification caches (default = inside the datadir)", } EthashCachesInMemoryFlag = cli.IntFlag{ Name: "ethash.cachesinmem", Usage: "Number of recent ethash caches to keep in memory (16MB each)", Value: sero.DefaultConfig.Ethash.CachesInMem, } EthashCachesOnDiskFlag = cli.IntFlag{ Name: "ethash.cachesondisk", Usage: "Number of recent ethash caches to keep on disk (16MB each)", Value: sero.DefaultConfig.Ethash.CachesOnDisk, } EthashDatasetDirFlag = DirectoryFlag{ Name: "ethash.dagdir", Usage: "Directory to store the ethash mining DAGs (default = inside home folder)", Value: DirectoryString{sero.DefaultConfig.Ethash.DatasetDir}, } EthashDatasetsInMemoryFlag = cli.IntFlag{ Name: "ethash.dagsinmem", Usage: "Number of recent ethash mining DAGs to keep in memory (1+GB each)", Value: sero.DefaultConfig.Ethash.DatasetsInMem, } EthashDatasetsOnDiskFlag = cli.IntFlag{ Name: "ethash.dagsondisk", Usage: "Number of recent ethash mining DAGs to keep on disk (1+GB each)", Value: sero.DefaultConfig.Ethash.DatasetsOnDisk, } // Transaction pool settings TxPoolNoLocalsFlag = cli.BoolFlag{ Name: "txpool.nolocals", Usage: "Disables price exemptions for locally submitted transactions", } TxPoolPriceLimitFlag = cli.Uint64Flag{ Name: "txpool.pricelimit", Usage: "Minimum gas price limit to enforce for acceptance into the pool", Value: sero.DefaultConfig.TxPool.PriceLimit, } TxPoolAccountSlotsFlag = cli.Uint64Flag{ Name: "txpool.accountslots", Usage: "Minimum number of executable transaction slots guaranteed per account", Value: sero.DefaultConfig.TxPool.AccountSlots, } TxPoolGlobalSlotsFlag = cli.Uint64Flag{ Name: "txpool.globalslots", Usage: "Maximum number of executable transaction slots for all accounts", Value: sero.DefaultConfig.TxPool.GlobalSlots, } TxPoolAccountQueueFlag = cli.Uint64Flag{ Name: "txpool.accountqueue", Usage: "Maximum number of non-executable transaction slots permitted per account", Value: sero.DefaultConfig.TxPool.AccountQueue, } TxPoolGlobalQueueFlag = cli.Uint64Flag{ Name: "txpool.globalqueue", Usage: "Maximum number of non-executable transaction slots for all accounts", Value: sero.DefaultConfig.TxPool.GlobalQueue, } TxPoolLifetimeFlag = cli.DurationFlag{ Name: "txpool.lifetime", Usage: "Maximum amount of time non-executable transaction are queued", Value: sero.DefaultConfig.TxPool.Lifetime, } // Performance tuning settings CacheFlag = cli.IntFlag{ Name: "cache", Usage: "Megabytes of memory allocated to internal caching", Value: 1024, } CacheDatabaseFlag = cli.IntFlag{ Name: "cache.database", Usage: "Percentage of cache memory allowance to use for database io", Value: 75, } CacheGCFlag = cli.IntFlag{ Name: "cache.gc", Usage: "Percentage of cache memory allowance to use for trie pruning", Value: 25, } TrieCacheGenFlag = cli.IntFlag{ Name: "trie-cache-gens", Usage: "Number of trie node generations to keep in memory", Value: int(state.MaxTrieCacheGen), } // Zero Proof settings VThreadsFlag = cli.IntFlag{ Name: "vthreads", Usage: "Number of CPU threads to use for zero verify", Value: runtime.NumCPU() + 2, } PThreadsFlag = cli.IntFlag{ Name: "pthreads", Usage: "Number of CPU threads to use for zero prove", Value: runtime.NumCPU(), } ExchangeFlag = cli.BoolFlag{ Name: "exchange", Usage: "start exchange", } ExchangeValueStrFlag = cli.BoolFlag{ Name: "exchangeValueStr", Usage: "big int return value as number string", } StakeFlag = cli.BoolFlag{ Name: "stake", Usage: "start stake", } AutoMergeFlag = cli.BoolFlag{ Name: "autoMerge", Usage: "autoMerge outs", } LightNodeFlag = cli.BoolFlag{ Name: "lightNode", Usage: "start light node", } CloseAcceptTx = cli.BoolFlag{ Name: "closeAcceptTx", Usage: "Close Accept from remote Tx", } ConfirmedBlockFlag = cli.Uint64Flag{ Name: "confirmedBlock", Usage: "The balance will be confirmed after the current block of number,default is 12", } ResetBlockNumber = cli.Uint64Flag{ Name: "resetBlockNumber", Usage: "reset currentblock, gcmode must be archive", } RecordBlockShareNumber = cli.BoolFlag{ Name: "recordBlockShareNumber", Usage: "", } // Miner settings MiningEnabledFlag = cli.BoolFlag{ Name: "mine", Usage: "Enable mining", } MineModeEnabledFlag = cli.BoolFlag{ Name: "mineMode", Usage: "NoUsed", } MinerThreadsFlag = cli.IntFlag{ Name: "minerthreads", Usage: "Number of CPU threads to use for mining", Value: runtime.NumCPU(), } TargetGasLimitFlag = cli.Uint64Flag{ Name: "targetgaslimit", Usage: "Target gas limit sets the artificial target gas floor for the blocks to mine", Value: params.GenesisGasLimit, } SerobaseFlag = cli.StringFlag{ Name: "serobase", Usage: "Public address for block mining rewards (default = first account created)", Value: "0", } GasPriceFlag = BigFlag{ Name: "gasprice", Usage: "Minimal gas price to accept for mining a transactions", Value: sero.DefaultConfig.GasPrice, } ExtraDataFlag = cli.StringFlag{ Name: "extradata", Usage: "Block extra data set by the miner (default = client version)", } // AccountAddress settings UnlockedAccountFlag = cli.StringFlag{ Name: "unlock", Usage: "Comma separated list of accounts to unlock", Value: "", } PasswordFileFlag = cli.StringFlag{ Name: "password", Usage: "Password file to use for non-interactive password input", Value: "", } VMEnableDebugFlag = cli.BoolFlag{ Name: "vmdebug", Usage: "Record information useful for VM and contract debugging", } // Logging and debug settings SeroStatsURLFlag = cli.StringFlag{ Name: "serostats", Usage: "Reporting URL of a serostats service (nodename:secret@host:port)", } FakePoWFlag = cli.BoolFlag{ Name: "fakepow", Usage: "Disables proof-of-work verification", } NoCompactionFlag = cli.BoolFlag{ Name: "nocompaction", Usage: "Disables db compaction after import", } // RPC settings RPCEnabledFlag = cli.BoolFlag{ Name: "rpc", Usage: "Enable the HTTP-RPC server", } RPCListenAddrFlag = cli.StringFlag{ Name: "rpcaddr", Usage: "HTTP-RPC server listening interface", Value: node.DefaultHTTPHost, } RPCPortFlag = cli.IntFlag{ Name: "rpcport", Usage: "HTTP-RPC server listening port", Value: node.DefaultHTTPPort, } RPCCORSDomainFlag = cli.StringFlag{ Name: "rpccorsdomain", Usage: "Comma separated list of domains from which to accept cross origin requests (browser enforced)", Value: "", } RPCVirtualHostsFlag = cli.StringFlag{ Name: "rpcvhosts", Usage: "Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard.", Value: strings.Join(node.DefaultConfig.HTTPVirtualHosts, ","), } RPCReadTimeoutFlag = cli.Int64Flag{ Name: "rpcreadtimeout", Usage: `ReadTimeout is the maximum duration for reading the entire request, including the body. Because ReadTimeout does not let Handlers make per-request decisions on each request body's acceptable deadline or upload rate, most users will prefer to useReadHeaderTimeout. It is valid to use them both.`, Value: 120, } RPCWriteTimeoutFlag = cli.Int64Flag{ Name: "rpcwritetimeout", Usage: `WriteTimeout is the maximum duration before timing out writes of the response. It is reset whenever a new request's header is read. Like ReadTimeout, it does not let Handlers make decisions on a per-request basis.`, Value: 120, } RPCIdleTimeoutFlag = cli.Int64Flag{ Name: "rpcidletimeout", Usage: `IdleTimeout is the maximum amount of time to wait for the next request when keep-alives are enabled. If IdleTimeout is zero, the value of ReadTimeout is used. If both are zero, ReadHeaderTimeout is used.`, Value: 120, } RPCApiFlag = cli.StringFlag{ Name: "rpcapi", Usage: "API's offered over the HTTP-RPC interface", Value: "", } RPCRequestContentLength = cli.Uint64Flag{ Name: "rpcRequestContentLength", Usage: "Specify the maximum length of the rpc request content", Value: 1024 * 512, } IPCDisabledFlag = cli.BoolFlag{ Name: "ipcdisable", Usage: "Disable the IPC-RPC server", } IPCPathFlag = DirectoryFlag{ Name: "ipcpath", Usage: "Filename for IPC socket/pipe within the datadir (explicit paths escape it)", } WSEnabledFlag = cli.BoolFlag{ Name: "ws", Usage: "Enable the WS-RPC server", } WSListenAddrFlag = cli.StringFlag{ Name: "wsaddr", Usage: "WS-RPC server listening interface", Value: node.DefaultWSHost, } WSPortFlag = cli.IntFlag{ Name: "wsport", Usage: "WS-RPC server listening port", Value: node.DefaultWSPort, } WSApiFlag = cli.StringFlag{ Name: "wsapi", Usage: "API's offered over the WS-RPC interface", Value: "", } WSAllowedOriginsFlag = cli.StringFlag{ Name: "wsorigins", Usage: "Origins from which to accept websockets requests", Value: "", } ExecFlag = cli.StringFlag{ Name: "exec", Usage: "Execute JavaScript statement", } PreloadJSFlag = cli.StringFlag{ Name: "preload", Usage: "Comma separated list of JavaScript files to preload into the console", } // Network Settings MaxPeersFlag = cli.IntFlag{ Name: "maxpeers", Usage: "Maximum number of network peers (network disabled if set to 0)", Value: 25, } MaxPendingPeersFlag = cli.IntFlag{ Name: "maxpendpeers", Usage: "Maximum number of pending connection attempts (defaults used if set to 0)", Value: 0, } ListenPortFlag = cli.IntFlag{ Name: "port", Usage: "Network listening port", Value: 53717, } BootnodesFlag = cli.StringFlag{ Name: "bootnodes", Usage: "Comma separated enode URLs for P2P discovery bootstrap (set v4+v5 instead for light servers)", Value: "", } BootnodesV4Flag = cli.StringFlag{ Name: "bootnodesv4", Usage: "Comma separated enode URLs for P2P v4 discovery bootstrap (light server, full nodes)", Value: "", } BootnodesV5Flag = cli.StringFlag{ Name: "bootnodesv5", Usage: "Comma separated enode URLs for P2P v5 discovery bootstrap (light server, light nodes)", Value: "", } NodeKeyFileFlag = cli.StringFlag{ Name: "nodekey", Usage: "P2P node key file", } NodeKeyHexFlag = cli.StringFlag{ Name: "nodekeyhex", Usage: "P2P node key as hex (for testing)", } NATFlag = cli.StringFlag{ Name: "nat", Usage: "NAT port mapping mechanism (any|none|upnp|pmp|extip:)", Value: "any", } NoDiscoverFlag = cli.BoolFlag{ Name: "nodiscover", Usage: "Disables the peer discovery mechanism (manual peer addition)", } DiscoveryV5Flag = cli.BoolFlag{ Name: "v5disc", Usage: "Enables the experimental RLPx V5 (Topic Discovery) mechanism", } NetrestrictFlag = cli.StringFlag{ Name: "netrestrict", Usage: "Restricts network communication to the given IP networks (CIDR masks)", } // ATM the url is left to the user and deployment to JSpathFlag = cli.StringFlag{ Name: "jspath", Usage: "JavaScript root path for `loadScript`", Value: ".", } // Gas price oracle settings GpoBlocksFlag = cli.IntFlag{ Name: "gpoblocks", Usage: "Number of recent blocks to check for gas prices", Value: sero.DefaultConfig.GPO.Blocks, } GpoPercentileFlag = cli.IntFlag{ Name: "gpopercentile", Usage: "Suggested gas price is the given percentile of a set of recent transaction gas prices", Value: sero.DefaultConfig.GPO.Percentile, } // Metrics flags MetricsEnabledFlag = cli.BoolFlag{ Name: metrics.MetricsEnabledFlag, Usage: "Enable metrics collection and reporting", } MetricsEnableInfluxDBFlag = cli.BoolFlag{ Name: "metrics.influxdb", Usage: "Enable metrics export/push to an external InfluxDB database", } MetricsInfluxDBEndpointFlag = cli.StringFlag{ Name: "metrics.influxdb.endpoint", Usage: "InfluxDB API endpoint to report metrics to", Value: "http://localhost:8086", } MetricsInfluxDBDatabaseFlag = cli.StringFlag{ Name: "metrics.influxdb.database", Usage: "InfluxDB database name to push reported metrics to", Value: "gero", } MetricsInfluxDBUsernameFlag = cli.StringFlag{ Name: "metrics.influxdb.username", Usage: "Username to authorize access to the database", Value: "test", } MetricsInfluxDBPasswordFlag = cli.StringFlag{ Name: "metrics.influxdb.password", Usage: "Password to authorize access to the database", Value: "test", } // The `host` tag is part of every measurement sent to InfluxDB. Queries on tags are faster in InfluxDB. // It is used so that we can group all nodes and average a measurement across all of them, but also so // that we can select a specific node and inspect its measurements. // https://docs.influxdata.com/influxdb/v1.4/concepts/key_concepts/#tag-key MetricsInfluxDBHostTagFlag = cli.StringFlag{ Name: "metrics.influxdb.host.tag", Usage: "InfluxDB `host` tag attached to all measurements", Value: "localhost", } // proof settings ProofEnabledFlag = cli.BoolFlag{ Name: "proof", Usage: "Enable the HTTP-RPC server", } ProofMaxThreadFlag = cli.IntFlag{ Name: "maxthread", Usage: "max work number", Value: 5, } ProofMaxQueueFlag = cli.IntFlag{ Name: "maxqueue", Usage: "max work queue length", Value: 10, } ProofzinFeeFlag = cli.StringFlag{ Name: "zinFee", Usage: "proof for tx zin fee", Value: "0sero", } ProofoinFeeFlag = cli.StringFlag{ Name: "oinFee", Usage: "proof for tx oin fee", Value: "0sero", } ProofoutFeeFlag = cli.StringFlag{ Name: "outFee", Usage: "proof for tx out fee", Value: "0sero", } ProofFixedFeeFlag = cli.StringFlag{ Name: "fixedFee", Usage: "proof for tx out fee", Value: "0sero", } ) // MakeDataDir retrieves the currently requested data directory, terminating // if none (or the empty string) is specified. If the node is starting a testnet, // the a subdirectory of the specified datadir will be used. func MakeDataDir(ctx *cli.Context) string { if path := ctx.GlobalString(DataDirFlag.Name); path != "" { if ctx.GlobalBool(AlphanetFlag.Name) { return filepath.Join(path, "alphanet") } if ctx.GlobalBool(DeveloperFlag.Name) { return filepath.Join(path, "dev") } return path } Fatalf("Cannot determine default data directory, please set manually (--datadir)") return "" } // setNodeKey creates a node key from set command line flags, either loading it // from a file or as a specified hex value. If neither flags were provided, this // method returns nil and an emphemeral key is to be generated. func setNodeKey(ctx *cli.Context, cfg *p2p.Config) { var ( hex = ctx.GlobalString(NodeKeyHexFlag.Name) file = ctx.GlobalString(NodeKeyFileFlag.Name) key *ecdsa.PrivateKey err error ) switch { case file != "" && hex != "": Fatalf("Options %q and %q are mutually exclusive", NodeKeyFileFlag.Name, NodeKeyHexFlag.Name) case file != "": if key, err = crypto.LoadECDSA(file); err != nil { Fatalf("Option %q: %v", NodeKeyFileFlag.Name, err) } cfg.PrivateKey = key case hex != "": if key, err = crypto.HexToECDSA(hex); err != nil { Fatalf("Option %q: %v", NodeKeyHexFlag.Name, err) } cfg.PrivateKey = key } } // setNodeUserIdent creates the user identifier from CLI flags. func setNodeUserIdent(ctx *cli.Context, cfg *node.Config) { if identity := ctx.GlobalString(IdentityFlag.Name); len(identity) > 0 { cfg.UserIdent = identity } } // setBootstrapNodes creates a list of bootstrap nodes from the command line // flags, reverting to pre-configured ones if none have been specified. func setBootstrapNodes(ctx *cli.Context, cfg *p2p.Config) { urls := params.BetanetBootnodes switch { case ctx.GlobalIsSet(BootnodesFlag.Name) || ctx.GlobalIsSet(BootnodesV4Flag.Name): if ctx.GlobalIsSet(BootnodesV4Flag.Name) { urls = strings.Split(ctx.GlobalString(BootnodesV4Flag.Name), ",") } else { urls = strings.Split(ctx.GlobalString(BootnodesFlag.Name), ",") } case ctx.GlobalBool(AlphanetFlag.Name): urls = params.AlphanetBootnodes case ctx.GlobalBool(DeveloperFlag.Name): urls = params.DevBootnodes case cfg.BootstrapNodes != nil: return // already set, don't apply defaults. } cfg.BootstrapNodes = make([]*discover.Node, 0, len(urls)) for _, url := range urls { node, err := discover.ParseNode(url) if err != nil { log.Crit("Bootstrap URL invalid", "enode", url, "err", err) } cfg.BootstrapNodes = append(cfg.BootstrapNodes, node) } } // setBootstrapNodesV5 creates a list of bootstrap nodes from the command line // flags, reverting to pre-configured ones if none have been specified. func setBootstrapNodesV5(ctx *cli.Context, cfg *p2p.Config) { urls := params.DiscoveryV5Bootnodes switch { case ctx.GlobalIsSet(BootnodesFlag.Name) || ctx.GlobalIsSet(BootnodesV5Flag.Name): if ctx.GlobalIsSet(BootnodesV5Flag.Name) { urls = strings.Split(ctx.GlobalString(BootnodesV5Flag.Name), ",") } else { urls = strings.Split(ctx.GlobalString(BootnodesFlag.Name), ",") } case ctx.GlobalBool(DeveloperFlag.Name): urls = params.DevBootnodes case cfg.BootstrapNodesV5 != nil: return // already set, don't apply defaults. } cfg.BootstrapNodesV5 = make([]*discv5.Node, 0, len(urls)) for _, url := range urls { node, err := discv5.ParseNode(url) if err != nil { log.Error("Bootstrap URL invalid", "enode", url, "err", err) continue } cfg.BootstrapNodesV5 = append(cfg.BootstrapNodesV5, node) } } // setListenAddress creates a TCP listening address string from set command // line flags. func setListenAddress(ctx *cli.Context, cfg *p2p.Config) { if ctx.GlobalIsSet(ListenPortFlag.Name) { cfg.ListenAddr = fmt.Sprintf(":%d", ctx.GlobalInt(ListenPortFlag.Name)) } } // setNAT creates a port mapper from command line flags. func setNAT(ctx *cli.Context, cfg *p2p.Config) { if ctx.GlobalIsSet(NATFlag.Name) { natif, err := nat.Parse(ctx.GlobalString(NATFlag.Name)) if err != nil { Fatalf("Option %s: %v", NATFlag.Name, err) } cfg.NAT = natif } } // splitAndTrim splits input separated by a comma // and trims excessive white space from the substrings. func splitAndTrim(input string) []string { result := strings.Split(input, ",") for i, r := range result { result[i] = strings.TrimSpace(r) } return result } // setHTTP creates the HTTP RPC listener interface string from the set // command line flags, returning empty if the HTTP endpoint is disabled. func setHTTP(ctx *cli.Context, cfg *node.Config) { if ctx.GlobalBool(RPCEnabledFlag.Name) && cfg.HTTPHost == "" { cfg.HTTPHost = "127.0.0.1" if ctx.GlobalIsSet(RPCListenAddrFlag.Name) { cfg.HTTPHost = ctx.GlobalString(RPCListenAddrFlag.Name) } } if ctx.GlobalIsSet(RPCPortFlag.Name) { cfg.HTTPPort = ctx.GlobalInt(RPCPortFlag.Name) } if ctx.GlobalIsSet(RPCCORSDomainFlag.Name) { cfg.HTTPCors = splitAndTrim(ctx.GlobalString(RPCCORSDomainFlag.Name)) } if ctx.GlobalIsSet(RPCApiFlag.Name) { cfg.HTTPModules = splitAndTrim(ctx.GlobalString(RPCApiFlag.Name)) } if ctx.GlobalIsSet(RPCVirtualHostsFlag.Name) { cfg.HTTPVirtualHosts = splitAndTrim(ctx.GlobalString(RPCVirtualHostsFlag.Name)) } if ctx.GlobalIsSet(RPCReadTimeoutFlag.Name) { cfg.HTTPTimeouts.ReadTimeout = time.Duration(ctx.GlobalInt64(RPCReadTimeoutFlag.Name)) * time.Second } if ctx.GlobalIsSet(RPCWriteTimeoutFlag.Name) { cfg.HTTPTimeouts.WriteTimeout = time.Duration(ctx.GlobalInt64(RPCWriteTimeoutFlag.Name)) * time.Second } if ctx.GlobalIsSet(RPCIdleTimeoutFlag.Name) { cfg.HTTPTimeouts.IdleTimeout = time.Duration(ctx.GlobalInt64(RPCIdleTimeoutFlag.Name)) * time.Second } if ctx.GlobalIsSet(RPCRequestContentLength.Name) { l := ctx.GlobalInt64(RPCRequestContentLength.Name) rpc.SetMaxRequestContentLength(l) } } // setWS creates the WebSocket RPC listener interface string from the set // command line flags, returning empty if the HTTP endpoint is disabled. func setWS(ctx *cli.Context, cfg *node.Config) { if ctx.GlobalBool(WSEnabledFlag.Name) && cfg.WSHost == "" { cfg.WSHost = "127.0.0.1" if ctx.GlobalIsSet(WSListenAddrFlag.Name) { cfg.WSHost = ctx.GlobalString(WSListenAddrFlag.Name) } } if ctx.GlobalIsSet(WSPortFlag.Name) { cfg.WSPort = ctx.GlobalInt(WSPortFlag.Name) } if ctx.GlobalIsSet(WSAllowedOriginsFlag.Name) { cfg.WSOrigins = splitAndTrim(ctx.GlobalString(WSAllowedOriginsFlag.Name)) } if ctx.GlobalIsSet(WSApiFlag.Name) { cfg.WSModules = splitAndTrim(ctx.GlobalString(WSApiFlag.Name)) } } // setIPC creates an IPC path configuration from the set command line flags, // returning an empty string if IPC was explicitly disabled, or the set path. func setIPC(ctx *cli.Context, cfg *node.Config) { checkExclusive(ctx, IPCDisabledFlag, IPCPathFlag) switch { case ctx.GlobalBool(IPCDisabledFlag.Name): cfg.IPCPath = "" case ctx.GlobalIsSet(IPCPathFlag.Name): cfg.IPCPath = ctx.GlobalString(IPCPathFlag.Name) } } // makeDatabaseHandles raises out the number of allowed file handles per process // for Geth and returns half of the allowance to assign to the database. func makeDatabaseHandles() int { limit, err := fdlimit.Current() if err != nil { Fatalf("Failed to retrieve file descriptor allowance: %v", err) } if limit < 2048 { if err := fdlimit.Raise(2048); err != nil { Fatalf("Failed to raise file descriptor allowance: %v", err) } } if limit > 2048 { // cap database file descriptors even if more is available limit = 2048 } return limit / 2 // Leave half for networking and other stuff } // MakeAddress converts an account specified directly as a hex encoded string or // a key index in the key store to an internal account representation. func MakeAddress(ks *keystore.KeyStore, account string) (accounts.Account, error) { // If the specified account is a valid address, return it splitStrs := strings.Split(account, ".") var addr string if len(splitStrs) == 3 { addr = splitStrs[1] } else { addr = account } PkByte := base58.Decode(addr) pk := c_type.Uint512{} copy(pk[:], PkByte) wallets := ks.Wallets() for _, wallet := range wallets { if wallet.Accounts()[0].IsMyPk(pk) { return wallet.Accounts()[0], nil } } // Otherwise try to interpret the account as a keystore index index, err := strconv.Atoi(account) if err != nil || index < 0 { return accounts.Account{}, fmt.Errorf("invalid account address or index %q", account) } log.Warn("-------------------------------------------------------------------") log.Warn("Referring to accounts by order in the keystore folder is dangerous!") log.Warn("This functionality is deprecated and will be removed in the future!") log.Warn("Please use explicit addresses! (can search via `gero account list`)") log.Warn("-------------------------------------------------------------------") accs := ks.Accounts() if len(accs) <= index { return accounts.Account{}, fmt.Errorf("index %d higher than number of accounts %d", index, len(accs)) } return accs[index], nil } // MakePasswordList reads password lines from the file specified by the global --password flag. func MakePasswordList(ctx *cli.Context) []string { path := ctx.GlobalString(PasswordFileFlag.Name) if path == "" { return nil } text, err := ioutil.ReadFile(path) if err != nil { Fatalf("Failed to read password file: %v", err) } lines := strings.Split(string(text), "\n") // Sanitise DOS line endings. for i := range lines { lines[i] = strings.TrimRight(lines[i], "\r") } return lines } func SetP2PConfig(ctx *cli.Context, cfg *p2p.Config) { setNodeKey(ctx, cfg) setNAT(ctx, cfg) setListenAddress(ctx, cfg) setBootstrapNodes(ctx, cfg) setBootstrapNodesV5(ctx, cfg) if ctx.GlobalIsSet(MaxPeersFlag.Name) { cfg.MaxPeers = ctx.GlobalInt(MaxPeersFlag.Name) } log.Info("Maximum peer count", "SERO", cfg.MaxPeers) // lightClient := ctx.GlobalBool(LightModeFlag.Name) || ctx.GlobalString(SyncModeFlag.Name) == "light" // //lightServer := ctx.GlobalInt(LightServFlag.Name) != 0 // lightPeers := ctx.GlobalInt(LightPeersFlag.Name) // // if ctx.GlobalIsSet(MaxPeersFlag.Name) { // cfg.MaxPeers = ctx.GlobalInt(MaxPeersFlag.Name) // //if lightServer && !ctx.GlobalIsSet(LightPeersFlag.Name) { // // cfg.MaxPeers += lightPeers // //} // } else { // //if lightServer { // // cfg.MaxPeers += lightPeers // //} // if lightClient && ctx.GlobalIsSet(LightPeersFlag.Name) && cfg.MaxPeers < lightPeers { // cfg.MaxPeers = lightPeers // } // } // //if !(lightClient || lightServer) { // if !(lightClient) { // lightPeers = 0 // } // ethPeers := cfg.MaxPeers - lightPeers // if lightClient { // ethPeers = 0 // } // log.Info("Maximum peer count", "ETH", ethPeers, "LES", lightPeers, "total", cfg.MaxPeers) if ctx.GlobalIsSet(MaxPendingPeersFlag.Name) { cfg.MaxPendingPeers = ctx.GlobalInt(MaxPendingPeersFlag.Name) } if ctx.GlobalIsSet(NoDiscoverFlag.Name) { cfg.NoDiscovery = true } // if we're running a light client or server, force enable the v5 peer discovery // unless it is explicitly disabled with --nodiscover note that explicitly specifying // --v5disc overrides --nodiscover, in which case the later only disables v4 discovery // forceV5Discovery := (lightClient || lightServer) && !ctx.GlobalBool(NoDiscoverFlag.Name) forceV5Discovery := !ctx.GlobalBool(NoDiscoverFlag.Name) if ctx.GlobalIsSet(DiscoveryV5Flag.Name) { cfg.DiscoveryV5 = ctx.GlobalBool(DiscoveryV5Flag.Name) } else if forceV5Discovery { cfg.DiscoveryV5 = true } if netrestrict := ctx.GlobalString(NetrestrictFlag.Name); netrestrict != "" { list, err := netutil.ParseNetlist(netrestrict) if err != nil { Fatalf("Option %q: %v", NetrestrictFlag.Name, err) } cfg.NetRestrict = list } if ctx.GlobalIsSet(ConfirmedBlockFlag.Name) { balanceDelay := ctx.GlobalUint64(ConfirmedBlockFlag.Name) if balanceDelay >= 0 { seroparam.InitComfirmedBlock(balanceDelay) } } if ctx.GlobalIsSet(RecordBlockShareNumber.Name) { zconfig.Init_RecordShareNum() } if ctx.GlobalIsSet(ResetBlockNumber.Name) { blockNumber := ctx.GlobalUint64(ResetBlockNumber.Name) seroparam.InitCurrentBlockNumber(blockNumber) } if ctx.GlobalBool(DeveloperFlag.Name) { // --dev mode can't use p2p networking. // cfg.MaxPeers = 0 cfg.ListenAddr = ":0" cfg.NoDiscovery = true cfg.DiscoveryV5 = false seroparam.Init_Dev(true) } if ctx.GlobalBool(OfflineFlag.Name) { seroparam.Init_Offline(true) } if ctx.GlobalIsSet(SnapshotFlag.Name) { snapshot := ctx.GlobalUint64(SnapshotFlag.Name) zconfig.Init_Snapshot(snapshot) } } // SetNodeConfig applies node-related command line flags to the config. func SetNodeConfig(ctx *cli.Context, cfg *node.Config) { SetP2PConfig(ctx, &cfg.P2P) setIPC(ctx, cfg) setHTTP(ctx, cfg) setWS(ctx, cfg) setNodeUserIdent(ctx, cfg) switch { case ctx.GlobalIsSet(DataDirFlag.Name): cfg.DataDir = ctx.GlobalString(DataDirFlag.Name) case ctx.GlobalBool(AlphanetFlag.Name): cfg.DataDir = filepath.Join(node.DefaultDataDir(), "alpha") case ctx.GlobalBool(DeveloperFlag.Name): cfg.DataDir = filepath.Join(node.DefaultDataDir(), "dev") } if ctx.GlobalIsSet(KeyStoreDirFlag.Name) { cfg.KeyStoreDir = ctx.GlobalString(KeyStoreDirFlag.Name) } if ctx.GlobalIsSet(TestForkFlag.Name) { zconfig.Init_TestFork() if ctx.GlobalIsSet(TestStartBlockFlag.Name) { testFrokStartBlock := ctx.GlobalUint64(TestStartBlockFlag.Name) if testFrokStartBlock == 0 { panic("testFrokStartBlock must great 100") } zconfig.Init_TestForkStartBlock(testFrokStartBlock) } else { panic("must set testFrokStartBlock") } } } func setGPO(ctx *cli.Context, cfg *gasprice.Config) { if ctx.GlobalIsSet(GpoBlocksFlag.Name) { cfg.Blocks = ctx.GlobalInt(GpoBlocksFlag.Name) } if ctx.GlobalIsSet(GpoPercentileFlag.Name) { cfg.Percentile = ctx.GlobalInt(GpoPercentileFlag.Name) } } func setTxPool(ctx *cli.Context, cfg *core.TxPoolConfig) { if ctx.GlobalIsSet(TxPoolNoLocalsFlag.Name) { cfg.NoLocals = ctx.GlobalBool(TxPoolNoLocalsFlag.Name) } if ctx.GlobalIsSet(TxPoolPriceLimitFlag.Name) { cfg.PriceLimit = ctx.GlobalUint64(TxPoolPriceLimitFlag.Name) } if ctx.GlobalIsSet(TxPoolAccountSlotsFlag.Name) { cfg.AccountSlots = ctx.GlobalUint64(TxPoolAccountSlotsFlag.Name) } if ctx.GlobalIsSet(TxPoolGlobalSlotsFlag.Name) { cfg.GlobalSlots = ctx.GlobalUint64(TxPoolGlobalSlotsFlag.Name) } if ctx.GlobalIsSet(TxPoolAccountQueueFlag.Name) { cfg.AccountQueue = ctx.GlobalUint64(TxPoolAccountQueueFlag.Name) } if ctx.GlobalIsSet(TxPoolGlobalQueueFlag.Name) { cfg.GlobalQueue = ctx.GlobalUint64(TxPoolGlobalQueueFlag.Name) } if ctx.GlobalIsSet(TxPoolLifetimeFlag.Name) { cfg.Lifetime = ctx.GlobalDuration(TxPoolLifetimeFlag.Name) } } func initProof(ctx *cli.Context) (cfg *proofservice.Config) { if !ctx.GlobalIsSet(ProofEnabledFlag.Name) { return } cfg = &proofservice.Config{} cfg.MaxWorkNumber = ctx.GlobalInt(ProofMaxThreadFlag.Name) cfg.MaxQueueNumber = ctx.GlobalInt(ProofMaxQueueFlag.Name) cfg.Fee = proofservice.ServiceFee{} if ctx.GlobalIsSet(ProofzinFeeFlag.Name) { zinFee, err := utils.ParseAmount(ctx.GlobalString(ProofzinFeeFlag.Name)) if err != nil { panic(err) } cfg.Fee.ZinFee = zinFee } if ctx.GlobalIsSet(ProofoinFeeFlag.Name) { oinFee, err := utils.ParseAmount(ctx.GlobalString(ProofoinFeeFlag.Name)) if err != nil { panic(err) } cfg.Fee.OinFee = oinFee } if ctx.GlobalIsSet(ProofoutFeeFlag.Name) { outFee, err := utils.ParseAmount(ctx.GlobalString(ProofoutFeeFlag.Name)) if err != nil { panic(err) } cfg.Fee.OutFee = outFee } if ctx.GlobalIsSet(ProofFixedFeeFlag.Name) { fixedFee, err := utils.ParseAmount(ctx.GlobalString(ProofFixedFeeFlag.Name)) if err != nil { panic(err) } cfg.Fee.FixedFee = fixedFee } return } func setEthash(ctx *cli.Context, cfg *sero.Config) { if ctx.GlobalIsSet(EthashCacheDirFlag.Name) { cfg.Ethash.CacheDir = ctx.GlobalString(EthashCacheDirFlag.Name) } if ctx.GlobalIsSet(EthashDatasetDirFlag.Name) { cfg.Ethash.DatasetDir = ctx.GlobalString(EthashDatasetDirFlag.Name) } if ctx.GlobalIsSet(EthashCachesInMemoryFlag.Name) { cfg.Ethash.CachesInMem = ctx.GlobalInt(EthashCachesInMemoryFlag.Name) } if ctx.GlobalIsSet(EthashCachesOnDiskFlag.Name) { cfg.Ethash.CachesOnDisk = ctx.GlobalInt(EthashCachesOnDiskFlag.Name) } if ctx.GlobalIsSet(EthashDatasetsInMemoryFlag.Name) { cfg.Ethash.DatasetsInMem = ctx.GlobalInt(EthashDatasetsInMemoryFlag.Name) } if ctx.GlobalIsSet(EthashDatasetsOnDiskFlag.Name) { cfg.Ethash.DatasetsOnDisk = ctx.GlobalInt(EthashDatasetsOnDiskFlag.Name) } } // checkExclusive verifies that only a single instance of the provided flags was // set by the user. Each flag might optionally be followed by a string type to // specialize it further. func checkExclusive(ctx *cli.Context, args ...interface{}) { set := make([]string, 0, 1) for i := 0; i < len(args); i++ { // Make sure the next argument is a flag and skip if not set flag, ok := args[i].(cli.Flag) if !ok { panic(fmt.Sprintf("invalid argument, not cli.Flag type: %T", args[i])) } // Check if next arg extends current and expand its name if so name := flag.GetName() if i+1 < len(args) { switch option := args[i+1].(type) { case string: // Extended flag, expand the name and shift the arguments if ctx.GlobalString(flag.GetName()) == option { name += "=" + option } i++ case cli.Flag: default: panic(fmt.Sprintf("invalid argument, not cli.Flag or string extension: %T", args[i+1])) } } // Mark the flag if it's set if ctx.GlobalIsSet(flag.GetName()) { set = append(set, "--"+name) } } if len(set) > 1 { Fatalf("Flags %v can't be used at the same time", strings.Join(set, ", ")) } } // SetSeroConfig applies sero-related command line flags to the config. func SetSeroConfig(ctx *cli.Context, stack *node.Node, cfg *sero.Config) { // Avoid conflicting network flags checkExclusive(ctx, AlphanetFlag, DeveloperFlag) // checkExclusive(ctx, FastSyncFlag, LightModeFlag, SyncModeFlag) setGPO(ctx, &cfg.GPO) setTxPool(ctx, &cfg.TxPool) setEthash(ctx, cfg) cfg.Proof = initProof(ctx) cfg.SyncMode = *GlobalTextMarshaler(ctx, SyncModeFlag.Name).(*downloader.SyncMode) if ctx.GlobalIsSet(NetworkIdFlag.Name) { cfg.NetworkId = ctx.GlobalUint64(NetworkIdFlag.Name) } if ctx.GlobalIsSet(CacheFlag.Name) || ctx.GlobalIsSet(CacheDatabaseFlag.Name) { cfg.DatabaseCache = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheDatabaseFlag.Name) / 100 } cfg.DatabaseHandles = makeDatabaseHandles() if gcmode := ctx.GlobalString(GCModeFlag.Name); gcmode != "full" && gcmode != "archive" { Fatalf("--%s must be either 'full' or 'archive'", GCModeFlag.Name) } cfg.NoPruning = ctx.GlobalString(GCModeFlag.Name) == "archive" if ctx.GlobalIsSet(CacheFlag.Name) || ctx.GlobalIsSet(CacheGCFlag.Name) { cfg.TrieCache = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheGCFlag.Name) / 100 } zconfig.G_p_thread_num = ctx.GlobalInt(PThreadsFlag.Name) zconfig.G_v_thread_num = ctx.GlobalInt(VThreadsFlag.Name) if ctx.GlobalIsSet(MinerThreadsFlag.Name) { cfg.MinerThreads = ctx.GlobalInt(MinerThreadsFlag.Name) } if ctx.GlobalIsSet(DocRootFlag.Name) { cfg.DocRoot = ctx.GlobalString(DocRootFlag.Name) } if ctx.GlobalIsSet(ExtraDataFlag.Name) { cfg.ExtraData = []byte(ctx.GlobalString(ExtraDataFlag.Name)) } if ctx.GlobalIsSet(GasPriceFlag.Name) { cfg.GasPrice = GlobalBig(ctx, GasPriceFlag.Name) } if ctx.GlobalIsSet(VMEnableDebugFlag.Name) { // TODO(fjl): force-enable this in --dev mode cfg.EnablePreimageRecording = ctx.GlobalBool(VMEnableDebugFlag.Name) } if ctx.GlobalIsSet(ExchangeFlag.Name) { seroparam.InitExchange(true) cfg.StartExchange = true if ctx.GlobalIsSet(AutoMergeFlag.Name) { cfg.AutoMerge = true } } if ctx.GlobalIsSet(ExchangeValueStrFlag.Name) { seroparam.InitExchangeValueStr(true) } if ctx.GlobalIsSet(StakeFlag.Name) { cfg.StartStake = true } if ctx.GlobalIsSet(LightNodeFlag.Name) { cfg.StartLight = true } if ctx.GlobalIsSet(CloseAcceptTx.Name) { cfg.CloseAcceptTx = true } // Override any default configs for hard coded networks. switch { case ctx.GlobalBool(AlphanetFlag.Name): if !ctx.GlobalIsSet(NetworkIdFlag.Name) { cfg.NetworkId = 1000 } cfg.Genesis = core.DefaultAlphanetGenesisBlock() case ctx.GlobalBool(DeveloperFlag.Name): if !ctx.GlobalIsSet(NetworkIdFlag.Name) { cfg.NetworkId = 1024 } cfg.Genesis = core.DeveloperGenesisBlock() } // TODO(fjl): move trie cache generations into config if gen := ctx.GlobalInt(TrieCacheGenFlag.Name); gen > 0 { state.MaxTrieCacheGen = uint16(gen) } } // CheckExclusive verifies that only a single instance of the provided flags was // set by the user. Each flag might optionally be followed by a string type to // specialize it further. func CheckExclusive(ctx *cli.Context, args ...interface{}) { set := make([]string, 0, 1) for i := 0; i < len(args); i++ { // Make sure the next argument is a flag and skip if not set flag, ok := args[i].(cli.Flag) if !ok { panic(fmt.Sprintf("invalid argument, not cli.Flag type: %T", args[i])) } // Check if next arg extends current and expand its name if so name := flag.GetName() if i+1 < len(args) { switch option := args[i+1].(type) { case string: // Extended flag check, make sure value set doesn't conflict with passed in option if ctx.GlobalString(flag.GetName()) == option { name += "=" + option set = append(set, "--"+name) } // shift arguments and continue i++ continue case cli.Flag: default: panic(fmt.Sprintf("invalid argument, not cli.Flag or string extension: %T", args[i+1])) } } // Mark the flag if it's set if ctx.GlobalIsSet(flag.GetName()) { set = append(set, "--"+name) } } if len(set) > 1 { Fatalf("Flags %v can't be used at the same time", strings.Join(set, ", ")) } } // SetDashboardConfig applies dashboard related command line flags to the config. func SetDashboardConfig(ctx *cli.Context, cfg *dashboard.Config) { cfg.Host = ctx.GlobalString(DashboardAddrFlag.Name) cfg.Port = ctx.GlobalInt(DashboardPortFlag.Name) cfg.Refresh = ctx.GlobalDuration(DashboardRefreshFlag.Name) } // RegisterEthService adds an Sero client to the stack. func RegisterEthService(stack *node.Node, cfg *sero.Config) { err := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) { fullNode, err := sero.New(ctx, cfg) return fullNode, err }) if err != nil { Fatalf("Failed to register the Sero service: %v", err) } } // RegisterDashboardService adds a dashboard to the stack. func RegisterDashboardService(stack *node.Node, cfg *dashboard.Config, commit string) { stack.Register(func(ctx *node.ServiceContext) (node.Service, error) { return dashboard.New(cfg, commit, ctx.ResolvePath("logs")), nil }) } // SetupNetwork configures the system for either the main net or some test network. func SetupNetwork(ctx *cli.Context) { // TODO(fjl): move target gas limit into config params.TargetGasLimit = ctx.GlobalUint64(TargetGasLimitFlag.Name) } func SetupMetrics(ctx *cli.Context) { if metrics.Enabled { log.Info("Enabling metrics collection") var ( enableExport = ctx.GlobalBool(MetricsEnableInfluxDBFlag.Name) endpoint = ctx.GlobalString(MetricsInfluxDBEndpointFlag.Name) database = ctx.GlobalString(MetricsInfluxDBDatabaseFlag.Name) username = ctx.GlobalString(MetricsInfluxDBUsernameFlag.Name) password = ctx.GlobalString(MetricsInfluxDBPasswordFlag.Name) hosttag = ctx.GlobalString(MetricsInfluxDBHostTagFlag.Name) ) if enableExport { log.Info("Enabling metrics export to InfluxDB") go influxdb.InfluxDBWithTags(metrics.DefaultRegistry, 10*time.Second, endpoint, database, username, password, "gero.", map[string]string{ "host": hosttag, }) } } } // MakeChainDatabase open an LevelDB using the flags passed to the client and will hard crash if it fails. func MakeChainDatabase(ctx *cli.Context, stack *node.Node) serodb.Database { var ( cache = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheDatabaseFlag.Name) / 100 handles = makeDatabaseHandles() ) name := "chaindata" chainDb, err := stack.OpenDatabase(name, cache, handles) if err != nil { Fatalf("Could not open database: %v", err) } return chainDb } func MakeGenesis(ctx *cli.Context) *core.Genesis { var genesis *core.Genesis switch { case ctx.GlobalBool(AlphanetFlag.Name): genesis = core.DefaultAlphanetGenesisBlock() case ctx.GlobalBool(DeveloperFlag.Name): genesis = core.DeveloperGenesisBlock() } return genesis } // MakeChain creates a chain manager from set command line flags. func MakeChain(ctx *cli.Context, stack *node.Node) (chain *core.BlockChain, chainDb serodb.Database) { var err error chainDb = MakeChainDatabase(ctx, stack) config, _, err := core.SetupGenesisBlock(chainDb, MakeGenesis(ctx)) if err != nil { Fatalf("%v", err) } var engine consensus.Engine engine = ethash.NewFaker() if !ctx.GlobalBool(FakePoWFlag.Name) { engine = ethash.New(ethash.Config{ CacheDir: stack.ResolvePath(sero.DefaultConfig.Ethash.CacheDir), CachesInMem: sero.DefaultConfig.Ethash.CachesInMem, CachesOnDisk: sero.DefaultConfig.Ethash.CachesOnDisk, DatasetDir: stack.ResolvePath(sero.DefaultConfig.Ethash.DatasetDir), DatasetsInMem: sero.DefaultConfig.Ethash.DatasetsInMem, DatasetsOnDisk: sero.DefaultConfig.Ethash.DatasetsOnDisk, }) } if gcmode := ctx.GlobalString(GCModeFlag.Name); gcmode != "full" && gcmode != "archive" { Fatalf("--%s must be either 'full' or 'archive'", GCModeFlag.Name) } cache := &core.CacheConfig{ Disabled: ctx.GlobalString(GCModeFlag.Name) == "archive", TrieNodeLimit: sero.DefaultConfig.TrieCache, TrieTimeLimit: sero.DefaultConfig.TrieTimeout, } if ctx.GlobalIsSet(CacheFlag.Name) || ctx.GlobalIsSet(CacheGCFlag.Name) { cache.TrieNodeLimit = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheGCFlag.Name) / 100 } vmcfg := vm.Config{EnablePreimageRecording: ctx.GlobalBool(VMEnableDebugFlag.Name)} chain, err = core.NewBlockChain(chainDb, cache, config, engine, vmcfg, nil) if err != nil { Fatalf("Can't create BlockChain: %v", err) } return chain, chainDb } // MakeConsolePreloads retrieves the absolute paths for the console JavaScript // scripts to preload before starting. func MakeConsolePreloads(ctx *cli.Context) []string { // Skip preloading if there's nothing to preload if ctx.GlobalString(PreloadJSFlag.Name) == "" { return nil } // Otherwise resolve absolute paths and return them preloads := []string{} assets := ctx.GlobalString(JSpathFlag.Name) for _, file := range strings.Split(ctx.GlobalString(PreloadJSFlag.Name), ",") { preloads = append(preloads, common.AbsolutePath(assets, strings.TrimSpace(file))) } return preloads } // MigrateFlags sets the global flag from a local flag when it's set. // This is a temporary function used for migrating old command/flags to the // new format. // // e.g. gero account new --keystore /tmp/mykeystore --lightkdf // // is equivalent after calling this method with: // // gero --keystore /tmp/mykeystore --lightkdf account new // // This allows the use of the existing configuration functionality. // When all flags are migrated this function can be removed and the existing // configuration functionality must be changed that is uses local flags func MigrateFlags(action func(ctx *cli.Context) error) func(*cli.Context) error { return func(ctx *cli.Context) error { for _, name := range ctx.FlagNames() { if ctx.IsSet(name) { ctx.GlobalSet(name, ctx.String(name)) } } return action(ctx) } } ================================================ FILE: common/address/account_types.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package address import ( "encoding/hex" "errors" "regexp" "strings" "github.com/btcsuite/btcutil/base58" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-czero-import/superzk" ) // Lengths of hashes and Accountes in bytes. const ( // AccountAddressLength is the expected length of the adddress AccountAddressLength = 64 SeedLength = 32 ) type Seed [SeedLength]byte func (priv *Seed) SeedToUint256() *c_type.Uint256 { seed := c_type.Uint256{} copy(seed[:], priv[:]) return &seed } func IsBase58Str(s string) bool { pattern := "^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$" match, err := regexp.MatchString(pattern, s) if err != nil { return false } return match } type MixBase58Adrress []byte func (b MixBase58Adrress) MarshalText() ([]byte, error) { return []byte(base58.Encode(b)), nil } func (b MixBase58Adrress) IsPkr() bool { return len(b) == 96 } func (b MixBase58Adrress) ToPkr() c_type.PKr { var pkr c_type.PKr if b.IsPkr() { copy(pkr[:], b[:]) } else { var pk c_type.Uint512 copy(pk[:], b[:]) pkr = superzk.Pk2PKr(&pk, nil) } return pkr } // UnmarshalText implements encoding.TextUnmarshaler. func (b *MixBase58Adrress) UnmarshalText(input []byte) error { if len(input) == 0 { return errors.New("empty string") } if IsBase58Str(string(input)) { out := base58.Decode(string(input)) if len(out) == 96 { err := ValidPkr(out) if err != nil { return err } *b = out[:] return nil } else if len(out) == 64 { err := ValidPk(out) if err != nil { return err } *b = out[:] return nil } else { return errors.New("invalid mix address") } } else { return errors.New("is not base58 address") } } type TKAddress [64]byte func Base58ToTk(str string) (ret TKAddress) { b := base58.Decode(str) copy(ret[:], b) return } func (b TKAddress) ToTk() c_type.Tk { result := c_type.Tk{} copy(result[:], b[:]) return result } func (b *TKAddress) ToPk() (ret PKAddress) { pk, _ := superzk.Tk2Pk(b.ToTk().NewRef()) copy(ret[:], pk[:]) return } func (c TKAddress) String() string { return base58.Encode(c[:]) } func (b TKAddress) MarshalText() ([]byte, error) { return []byte(base58.Encode(b[:])), nil } // UnmarshalText implements encoding.TextUnmarshaler. func (b *TKAddress) UnmarshalText(input []byte) error { if len(input) == 0 { return nil } if IsBase58Str(string(input)) { out := base58.Decode(string(input)) if len(out) == 64 { copy(b[:], out) } else { return errors.New("ivalid TK") } return nil } else { return errors.New("is not base58 string") } } type PKAddress [64]byte func StringToPk(str string) (ret PKAddress) { out := base58.Decode(str) copy(ret[:], out) return } func (b PKAddress) String() string { return base58.Encode(b[:]) } func (b PKAddress) ToUint512() c_type.Uint512 { result := c_type.Uint512{} copy(result[:], b[:]) return result } func NewPKAddres(b []byte) (ret PKAddress) { copy(ret[:], b) return } func (b PKAddress) MarshalText() ([]byte, error) { return []byte(b.String()), nil } // UnmarshalText implements encoding.TextUnmarshaler. func (b *PKAddress) UnmarshalText(input []byte) (e error) { if len(input) == 0 { return nil } var out []byte if IsBase58Str(string(input)) { out = base58.Decode(string(input)) } else if IsHex(string(input)) { out, e = DecodeHex(string(input)) if e != nil { return } } else { return errors.New("invalid pk string") } if len(out) == 64 { e = ValidPk(out) if e != nil { return e } copy(b[:], out) return } else { return errors.New("pk address must be 64 bytes") } } func ValidPk(addr []byte) error { if len(addr) == 64 { pk := c_type.Uint512{} copy(pk[:], addr) if !superzk.IsPKValid(&pk) { return errors.New("invalid PK") } } else { return errors.New("pk address must be 64 bytes") } return nil } func ValidPkr(addr []byte) error { if len(addr) == 96 { var pkr c_type.PKr copy(pkr[:], addr) if !superzk.IsPKrValid(&pkr) { return errors.New("invalid pkr") } } else { return errors.New("pkr address must be 96 bytes") } return nil } func Decode(input string) ([]byte, error) { if len(input) == 0 { return nil, errors.New("empty hex strin") } if !has0xPrefix(input) { return nil, errors.New("hex string without 0x prefix") } b, err := hex.DecodeString(input[2:]) if err != nil { return nil, err } return b, err } func has0xPrefix(input string) bool { return len(input) >= 2 && input[0] == '0' && (input[1] == 'x' || input[1] == 'X') } func isHexCharacter(c byte) bool { return ('0' <= c && c <= '9') || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F') } func IsHex(s string) bool { if has0xPrefix(s) { s = s[2:] } if len(s)%2 != 0 { return false } for _, c := range []byte(s) { if !isHexCharacter(c) { return false } } return true } func DecodeHex(hex string) (bytes []byte, err error) { if strings.Index(hex, "0x") != 0 { hex = "0x" + hex } if bytes, err = Decode(hex); err != nil { return } else { if len(bytes) == 0 { err = errors.New("the bytes length is 0") return } else { return } } } func DecodeAddr(input []byte) (bytes []byte, e error) { if IsBase58Str(string(input)) { bytes = base58.Decode(string(input)) return } else if IsHex(string(input)) { return DecodeHex(string(input)) } else { e = errors.New("invalid address string") return } } ================================================ FILE: common/big.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package common import "math/big" // Common big integers often used var ( Big1 = big.NewInt(1) Big2 = big.NewInt(2) Big3 = big.NewInt(3) Big0 = big.NewInt(0) Big32 = big.NewInt(32) Big256 = big.NewInt(256) Big257 = big.NewInt(257) ) ================================================ FILE: common/bitutil/bitutil.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Adapted from: https://golang.org/src/crypto/cipher/xor.go // Package bitutil implements fast bitwise operations. package bitutil import ( "runtime" "unsafe" ) const wordSize = int(unsafe.Sizeof(uintptr(0))) const supportsUnaligned = runtime.GOARCH == "386" || runtime.GOARCH == "amd64" || runtime.GOARCH == "ppc64" || runtime.GOARCH == "ppc64le" || runtime.GOARCH == "s390x" // XORBytes xors the bytes in a and b. The destination is assumed to have enough // space. Returns the number of bytes xor'd. func XORBytes(dst, a, b []byte) int { if supportsUnaligned { return fastXORBytes(dst, a, b) } return safeXORBytes(dst, a, b) } // fastXORBytes xors in bulk. It only works on architectures that support // unaligned read/writes. func fastXORBytes(dst, a, b []byte) int { n := len(a) if len(b) < n { n = len(b) } w := n / wordSize if w > 0 { dw := *(*[]uintptr)(unsafe.Pointer(&dst)) aw := *(*[]uintptr)(unsafe.Pointer(&a)) bw := *(*[]uintptr)(unsafe.Pointer(&b)) for i := 0; i < w; i++ { dw[i] = aw[i] ^ bw[i] } } for i := n - n%wordSize; i < n; i++ { dst[i] = a[i] ^ b[i] } return n } // safeXORBytes xors one by one. It works on all architectures, independent if // it supports unaligned read/writes or not. func safeXORBytes(dst, a, b []byte) int { n := len(a) if len(b) < n { n = len(b) } for i := 0; i < n; i++ { dst[i] = a[i] ^ b[i] } return n } // ANDBytes ands the bytes in a and b. The destination is assumed to have enough // space. Returns the number of bytes and'd. func ANDBytes(dst, a, b []byte) int { if supportsUnaligned { return fastANDBytes(dst, a, b) } return safeANDBytes(dst, a, b) } // fastANDBytes ands in bulk. It only works on architectures that support // unaligned read/writes. func fastANDBytes(dst, a, b []byte) int { n := len(a) if len(b) < n { n = len(b) } w := n / wordSize if w > 0 { dw := *(*[]uintptr)(unsafe.Pointer(&dst)) aw := *(*[]uintptr)(unsafe.Pointer(&a)) bw := *(*[]uintptr)(unsafe.Pointer(&b)) for i := 0; i < w; i++ { dw[i] = aw[i] & bw[i] } } for i := n - n%wordSize; i < n; i++ { dst[i] = a[i] & b[i] } return n } // safeANDBytes ands one by one. It works on all architectures, independent if // it supports unaligned read/writes or not. func safeANDBytes(dst, a, b []byte) int { n := len(a) if len(b) < n { n = len(b) } for i := 0; i < n; i++ { dst[i] = a[i] & b[i] } return n } // ORBytes ors the bytes in a and b. The destination is assumed to have enough // space. Returns the number of bytes or'd. func ORBytes(dst, a, b []byte) int { if supportsUnaligned { return fastORBytes(dst, a, b) } return safeORBytes(dst, a, b) } // fastORBytes ors in bulk. It only works on architectures that support // unaligned read/writes. func fastORBytes(dst, a, b []byte) int { n := len(a) if len(b) < n { n = len(b) } w := n / wordSize if w > 0 { dw := *(*[]uintptr)(unsafe.Pointer(&dst)) aw := *(*[]uintptr)(unsafe.Pointer(&a)) bw := *(*[]uintptr)(unsafe.Pointer(&b)) for i := 0; i < w; i++ { dw[i] = aw[i] | bw[i] } } for i := n - n%wordSize; i < n; i++ { dst[i] = a[i] | b[i] } return n } // safeORBytes ors one by one. It works on all architectures, independent if // it supports unaligned read/writes or not. func safeORBytes(dst, a, b []byte) int { n := len(a) if len(b) < n { n = len(b) } for i := 0; i < n; i++ { dst[i] = a[i] | b[i] } return n } // TestBytes tests whether any bit is set in the input byte slice. func TestBytes(p []byte) bool { if supportsUnaligned { return fastTestBytes(p) } return safeTestBytes(p) } // fastTestBytes tests for set bits in bulk. It only works on architectures that // support unaligned read/writes. func fastTestBytes(p []byte) bool { n := len(p) w := n / wordSize if w > 0 { pw := *(*[]uintptr)(unsafe.Pointer(&p)) for i := 0; i < w; i++ { if pw[i] != 0 { return true } } } for i := n - n%wordSize; i < n; i++ { if p[i] != 0 { return true } } return false } // safeTestBytes tests for set bits one byte at a time. It works on all // architectures, independent if it supports unaligned read/writes or not. func safeTestBytes(p []byte) bool { for i := 0; i < len(p); i++ { if p[i] != 0 { return true } } return false } ================================================ FILE: common/bitutil/bitutil_test.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Adapted from: https://golang.org/src/crypto/cipher/xor_test.go package bitutil import ( "bytes" "testing" ) // Tests that bitwise XOR works for various alignments. func TestXOR(t *testing.T) { for alignP := 0; alignP < 2; alignP++ { for alignQ := 0; alignQ < 2; alignQ++ { for alignD := 0; alignD < 2; alignD++ { p := make([]byte, 1023)[alignP:] q := make([]byte, 1023)[alignQ:] for i := 0; i < len(p); i++ { p[i] = byte(i) } for i := 0; i < len(q); i++ { q[i] = byte(len(q) - i) } d1 := make([]byte, 1023+alignD)[alignD:] d2 := make([]byte, 1023+alignD)[alignD:] XORBytes(d1, p, q) safeXORBytes(d2, p, q) if !bytes.Equal(d1, d2) { t.Error("not equal", d1, d2) } } } } } // Tests that bitwise AND works for various alignments. func TestAND(t *testing.T) { for alignP := 0; alignP < 2; alignP++ { for alignQ := 0; alignQ < 2; alignQ++ { for alignD := 0; alignD < 2; alignD++ { p := make([]byte, 1023)[alignP:] q := make([]byte, 1023)[alignQ:] for i := 0; i < len(p); i++ { p[i] = byte(i) } for i := 0; i < len(q); i++ { q[i] = byte(len(q) - i) } d1 := make([]byte, 1023+alignD)[alignD:] d2 := make([]byte, 1023+alignD)[alignD:] ANDBytes(d1, p, q) safeANDBytes(d2, p, q) if !bytes.Equal(d1, d2) { t.Error("not equal") } } } } } // Tests that bitwise OR works for various alignments. func TestOR(t *testing.T) { for alignP := 0; alignP < 2; alignP++ { for alignQ := 0; alignQ < 2; alignQ++ { for alignD := 0; alignD < 2; alignD++ { p := make([]byte, 1023)[alignP:] q := make([]byte, 1023)[alignQ:] for i := 0; i < len(p); i++ { p[i] = byte(i) } for i := 0; i < len(q); i++ { q[i] = byte(len(q) - i) } d1 := make([]byte, 1023+alignD)[alignD:] d2 := make([]byte, 1023+alignD)[alignD:] ORBytes(d1, p, q) safeORBytes(d2, p, q) if !bytes.Equal(d1, d2) { t.Error("not equal") } } } } } // Tests that bit testing works for various alignments. func TestTest(t *testing.T) { for align := 0; align < 2; align++ { // Test for bits set in the bulk part p := make([]byte, 1023)[align:] p[100] = 1 if TestBytes(p) != safeTestBytes(p) { t.Error("not equal") } // Test for bits set in the tail part q := make([]byte, 1023)[align:] q[len(q)-1] = 1 if TestBytes(q) != safeTestBytes(q) { t.Error("not equal") } } } // Benchmarks the potentially optimized XOR performance. func BenchmarkFastXOR1KB(b *testing.B) { benchmarkFastXOR(b, 1024) } func BenchmarkFastXOR2KB(b *testing.B) { benchmarkFastXOR(b, 2048) } func BenchmarkFastXOR4KB(b *testing.B) { benchmarkFastXOR(b, 4096) } func benchmarkFastXOR(b *testing.B, size int) { p, q := make([]byte, size), make([]byte, size) for i := 0; i < b.N; i++ { XORBytes(p, p, q) } } // Benchmarks the baseline XOR performance. func BenchmarkBaseXOR1KB(b *testing.B) { benchmarkBaseXOR(b, 1024) } func BenchmarkBaseXOR2KB(b *testing.B) { benchmarkBaseXOR(b, 2048) } func BenchmarkBaseXOR4KB(b *testing.B) { benchmarkBaseXOR(b, 4096) } func benchmarkBaseXOR(b *testing.B, size int) { p, q := make([]byte, size), make([]byte, size) for i := 0; i < b.N; i++ { safeXORBytes(p, p, q) } } // Benchmarks the potentially optimized AND performance. func BenchmarkFastAND1KB(b *testing.B) { benchmarkFastAND(b, 1024) } func BenchmarkFastAND2KB(b *testing.B) { benchmarkFastAND(b, 2048) } func BenchmarkFastAND4KB(b *testing.B) { benchmarkFastAND(b, 4096) } func benchmarkFastAND(b *testing.B, size int) { p, q := make([]byte, size), make([]byte, size) for i := 0; i < b.N; i++ { ANDBytes(p, p, q) } } // Benchmarks the baseline AND performance. func BenchmarkBaseAND1KB(b *testing.B) { benchmarkBaseAND(b, 1024) } func BenchmarkBaseAND2KB(b *testing.B) { benchmarkBaseAND(b, 2048) } func BenchmarkBaseAND4KB(b *testing.B) { benchmarkBaseAND(b, 4096) } func benchmarkBaseAND(b *testing.B, size int) { p, q := make([]byte, size), make([]byte, size) for i := 0; i < b.N; i++ { safeANDBytes(p, p, q) } } // Benchmarks the potentially optimized OR performance. func BenchmarkFastOR1KB(b *testing.B) { benchmarkFastOR(b, 1024) } func BenchmarkFastOR2KB(b *testing.B) { benchmarkFastOR(b, 2048) } func BenchmarkFastOR4KB(b *testing.B) { benchmarkFastOR(b, 4096) } func benchmarkFastOR(b *testing.B, size int) { p, q := make([]byte, size), make([]byte, size) for i := 0; i < b.N; i++ { ORBytes(p, p, q) } } // Benchmarks the baseline OR performance. func BenchmarkBaseOR1KB(b *testing.B) { benchmarkBaseOR(b, 1024) } func BenchmarkBaseOR2KB(b *testing.B) { benchmarkBaseOR(b, 2048) } func BenchmarkBaseOR4KB(b *testing.B) { benchmarkBaseOR(b, 4096) } func benchmarkBaseOR(b *testing.B, size int) { p, q := make([]byte, size), make([]byte, size) for i := 0; i < b.N; i++ { safeORBytes(p, p, q) } } // Benchmarks the potentially optimized bit testing performance. func BenchmarkFastTest1KB(b *testing.B) { benchmarkFastTest(b, 1024) } func BenchmarkFastTest2KB(b *testing.B) { benchmarkFastTest(b, 2048) } func BenchmarkFastTest4KB(b *testing.B) { benchmarkFastTest(b, 4096) } func benchmarkFastTest(b *testing.B, size int) { p := make([]byte, size) for i := 0; i < b.N; i++ { TestBytes(p) } } // Benchmarks the baseline bit testing performance. func BenchmarkBaseTest1KB(b *testing.B) { benchmarkBaseTest(b, 1024) } func BenchmarkBaseTest2KB(b *testing.B) { benchmarkBaseTest(b, 2048) } func BenchmarkBaseTest4KB(b *testing.B) { benchmarkBaseTest(b, 4096) } func benchmarkBaseTest(b *testing.B, size int) { p := make([]byte, size) for i := 0; i < b.N; i++ { safeTestBytes(p) } } ================================================ FILE: common/bitutil/compress.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package bitutil import "errors" var ( // errMissingData is returned from decompression if the byte referenced by // the bitset header overflows the input data. errMissingData = errors.New("missing bytes on input") // errUnreferencedData is returned from decompression if not all bytes were used // up from the input data after decompressing it. errUnreferencedData = errors.New("extra bytes on input") // errExceededTarget is returned from decompression if the bitset header has // more bits defined than the number of target buffer space available. errExceededTarget = errors.New("target data size exceeded") // errZeroContent is returned from decompression if a data byte referenced in // the bitset header is actually a zero byte. errZeroContent = errors.New("zero byte in input content") ) // The compression algorithm implemented by CompressBytes and DecompressBytes is // optimized for sparse input data which contains a lot of zero bytes. Decompression // requires knowledge of the decompressed data length. // // Compression works as follows: // // if data only contains zeroes, // CompressBytes(data) == nil // otherwise if len(data) <= 1, // CompressBytes(data) == data // otherwise: // CompressBytes(data) == append(CompressBytes(nonZeroBitset(data)), nonZeroBytes(data)...) // where // nonZeroBitset(data) is a bit vector with len(data) bits (MSB first): // nonZeroBitset(data)[i/8] && (1 << (7-i%8)) != 0 if data[i] != 0 // len(nonZeroBitset(data)) == (len(data)+7)/8 // nonZeroBytes(data) contains the non-zero bytes of data in the same order // CompressBytes compresses the input byte slice according to the sparse bitset // representation algorithm. If the result is bigger than the original input, no // compression is done. func CompressBytes(data []byte) []byte { if out := bitsetEncodeBytes(data); len(out) < len(data) { return out } cpy := make([]byte, len(data)) copy(cpy, data) return cpy } // bitsetEncodeBytes compresses the input byte slice according to the sparse // bitset representation algorithm. func bitsetEncodeBytes(data []byte) []byte { // Empty slices get compressed to nil if len(data) == 0 { return nil } // One byte slices compress to nil or retain the single byte if len(data) == 1 { if data[0] == 0 { return nil } return data } // Calculate the bitset of set bytes, and gather the non-zero bytes nonZeroBitset := make([]byte, (len(data)+7)/8) nonZeroBytes := make([]byte, 0, len(data)) for i, b := range data { if b != 0 { nonZeroBytes = append(nonZeroBytes, b) nonZeroBitset[i/8] |= 1 << byte(7-i%8) } } if len(nonZeroBytes) == 0 { return nil } return append(bitsetEncodeBytes(nonZeroBitset), nonZeroBytes...) } // DecompressBytes decompresses data with a known target size. If the input data // matches the size of the target, it means no compression was done in the first // place. func DecompressBytes(data []byte, target int) ([]byte, error) { if len(data) > target { return nil, errExceededTarget } if len(data) == target { cpy := make([]byte, len(data)) copy(cpy, data) return cpy, nil } return bitsetDecodeBytes(data, target) } // bitsetDecodeBytes decompresses data with a known target size. func bitsetDecodeBytes(data []byte, target int) ([]byte, error) { out, size, err := bitsetDecodePartialBytes(data, target) if err != nil { return nil, err } if size != len(data) { return nil, errUnreferencedData } return out, nil } // bitsetDecodePartialBytes decompresses data with a known target size, but does // not enforce consuming all the input bytes. In addition to the decompressed // output, the function returns the length of compressed input data corresponding // to the output as the input slice may be longer. func bitsetDecodePartialBytes(data []byte, target int) ([]byte, int, error) { // Sanity check 0 targets to avoid infinite recursion if target == 0 { return nil, 0, nil } // Handle the zero and single byte corner cases decomp := make([]byte, target) if len(data) == 0 { return decomp, 0, nil } if target == 1 { decomp[0] = data[0] // copy to avoid referencing the input slice if data[0] != 0 { return decomp, 1, nil } return decomp, 0, nil } // Decompress the bitset of set bytes and distribute the non zero bytes nonZeroBitset, ptr, err := bitsetDecodePartialBytes(data, (target+7)/8) if err != nil { return nil, ptr, err } for i := 0; i < 8*len(nonZeroBitset); i++ { if nonZeroBitset[i/8]&(1<= len(data) { return nil, 0, errMissingData } if i >= len(decomp) { return nil, 0, errExceededTarget } // Make sure the data is valid and push into the slot if data[ptr] == 0 { return nil, 0, errZeroContent } decomp[i] = data[ptr] ptr++ } } return decomp, ptr, nil } ================================================ FILE: common/bitutil/compress_fuzz.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // +build gofuzz package bitutil import "bytes" // Fuzz implements a go-fuzz fuzzer method to test various encoding method // invocations. func Fuzz(data []byte) int { if len(data) == 0 { return -1 } if data[0]%2 == 0 { return fuzzEncode(data[1:]) } return fuzzDecode(data[1:]) } // fuzzEncode implements a go-fuzz fuzzer method to test the bitset encoding and // decoding algorithm. func fuzzEncode(data []byte) int { proc, _ := bitsetDecodeBytes(bitsetEncodeBytes(data), len(data)) if !bytes.Equal(data, proc) { panic("content mismatch") } return 0 } // fuzzDecode implements a go-fuzz fuzzer method to test the bit decoding and // reencoding algorithm. func fuzzDecode(data []byte) int { blob, err := bitsetDecodeBytes(data, 1024) if err != nil { return 0 } if comp := bitsetEncodeBytes(blob); !bytes.Equal(comp, data) { panic("content mismatch") } return 0 } ================================================ FILE: common/bitutil/compress_test.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package bitutil import ( "bytes" "math/rand" "testing" "github.com/sero-cash/go-sero/common/hexutil" ) // Tests that data bitset encoding and decoding works and is bijective. func TestEncodingCycle(t *testing.T) { tests := []string{ // Tests generated by go-fuzz to maximize code coverage "0x000000000000000000", "0xef0400", "0xdf7070533534333636313639343638373532313536346c1bc33339343837313070706336343035336336346c65fefb3930393233383838ac2f65fefb", "0x7b64000000", "0x000034000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0000000000000000000", "0x4912385c0e7b64000000", "0x000034000000000000000000000000000000", "0x00", "0x000003e834ff7f0000", "0x0000", "0x0000000000000000000000000000000000000000000000000000000000ff00", "0x895f0c6a020f850c6a020f85f88df88d", "0xdf7070533534333636313639343638373432313536346c1bc3315aac2f65fefb", "0x0000000000", "0xdf70706336346c65fefb", "0x00006d643634000000", "0xdf7070533534333636313639343638373532313536346c1bc333393438373130707063363430353639343638373532313536346c1bc333393438336336346c65fe", } for i, tt := range tests { data := hexutil.MustDecode(tt) proc, err := bitsetDecodeBytes(bitsetEncodeBytes(data), len(data)) if err != nil { t.Errorf("test %d: failed to decompress compressed data: %v", i, err) continue } if !bytes.Equal(data, proc) { t.Errorf("test %d: compress/decompress mismatch: have %x, want %x", i, proc, data) } } } // Tests that data bitset decoding and rencoding works and is bijective. func TestDecodingCycle(t *testing.T) { tests := []struct { size int input string fail error }{ {size: 0, input: "0x"}, // Crashers generated by go-fuzz {size: 0, input: "0x0020", fail: errUnreferencedData}, {size: 0, input: "0x30", fail: errUnreferencedData}, {size: 1, input: "0x00", fail: errUnreferencedData}, {size: 2, input: "0x07", fail: errMissingData}, {size: 1024, input: "0x8000", fail: errZeroContent}, // Tests generated by go-fuzz to maximize code coverage {size: 29490, input: "0x343137343733323134333839373334323073333930783e3078333930783e70706336346c65303e", fail: errMissingData}, {size: 59395, input: "0x00", fail: errUnreferencedData}, {size: 52574, input: "0x70706336346c65c0de", fail: errExceededTarget}, {size: 42264, input: "0x07", fail: errMissingData}, {size: 52, input: "0xa5045bad48f4", fail: errExceededTarget}, {size: 52574, input: "0xc0de", fail: errMissingData}, {size: 52574, input: "0x"}, {size: 29490, input: "0x34313734373332313433383937333432307333393078073034333839373334323073333930783e3078333937333432307333393078073061333930783e70706336346c65303e", fail: errMissingData}, {size: 29491, input: "0x3973333930783e30783e", fail: errMissingData}, {size: 1024, input: "0x808080608080"}, {size: 1024, input: "0x808470705e3632383337363033313434303137393130306c6580ef46806380635a80"}, {size: 1024, input: "0x8080808070"}, {size: 1024, input: "0x808070705e36346c6580ef46806380635a80"}, {size: 1024, input: "0x80808046802680"}, {size: 1024, input: "0x4040404035"}, {size: 1024, input: "0x4040bf3ba2b3f684402d353234373438373934409fe5b1e7ada94ebfd7d0505e27be4035"}, {size: 1024, input: "0x404040bf3ba2b3f6844035"}, {size: 1024, input: "0x40402d35323437343837393440bfd7d0505e27be4035"}, } for i, tt := range tests { data := hexutil.MustDecode(tt.input) orig, err := bitsetDecodeBytes(data, tt.size) if err != tt.fail { t.Errorf("test %d: failure mismatch: have %v, want %v", i, err, tt.fail) } if err != nil { continue } if comp := bitsetEncodeBytes(orig); !bytes.Equal(comp, data) { t.Errorf("test %d: decompress/compress mismatch: have %x, want %x", i, comp, data) } } } // TestCompression tests that compression works by returning either the bitset // encoded input, or the actual input if the bitset version is longer. func TestCompression(t *testing.T) { // Check the compression returns the bitset encoding is shorter in := hexutil.MustDecode("0x4912385c0e7b64000000") out := hexutil.MustDecode("0x80fe4912385c0e7b64") if data := CompressBytes(in); !bytes.Equal(data, out) { t.Errorf("encoding mismatch for sparse data: have %x, want %x", data, out) } if data, err := DecompressBytes(out, len(in)); err != nil || !bytes.Equal(data, in) { t.Errorf("decoding mismatch for sparse data: have %x, want %x, error %v", data, in, err) } // Check the compression returns the input if the bitset encoding is longer in = hexutil.MustDecode("0xdf7070533534333636313639343638373532313536346c1bc33339343837313070706336343035336336346c65fefb3930393233383838ac2f65fefb") out = hexutil.MustDecode("0xdf7070533534333636313639343638373532313536346c1bc33339343837313070706336343035336336346c65fefb3930393233383838ac2f65fefb") if data := CompressBytes(in); !bytes.Equal(data, out) { t.Errorf("encoding mismatch for dense data: have %x, want %x", data, out) } if data, err := DecompressBytes(out, len(in)); err != nil || !bytes.Equal(data, in) { t.Errorf("decoding mismatch for dense data: have %x, want %x, error %v", data, in, err) } // Check that decompressing a longer input than the target fails if _, err := DecompressBytes([]byte{0xc0, 0x01, 0x01}, 2); err != errExceededTarget { t.Errorf("decoding error mismatch for long data: have %v, want %v", err, errExceededTarget) } } // Crude benchmark for compressing random slices of bytes. func BenchmarkEncoding1KBVerySparse(b *testing.B) { benchmarkEncoding(b, 1024, 0.0001) } func BenchmarkEncoding2KBVerySparse(b *testing.B) { benchmarkEncoding(b, 2048, 0.0001) } func BenchmarkEncoding4KBVerySparse(b *testing.B) { benchmarkEncoding(b, 4096, 0.0001) } func BenchmarkEncoding1KBSparse(b *testing.B) { benchmarkEncoding(b, 1024, 0.001) } func BenchmarkEncoding2KBSparse(b *testing.B) { benchmarkEncoding(b, 2048, 0.001) } func BenchmarkEncoding4KBSparse(b *testing.B) { benchmarkEncoding(b, 4096, 0.001) } func BenchmarkEncoding1KBDense(b *testing.B) { benchmarkEncoding(b, 1024, 0.1) } func BenchmarkEncoding2KBDense(b *testing.B) { benchmarkEncoding(b, 2048, 0.1) } func BenchmarkEncoding4KBDense(b *testing.B) { benchmarkEncoding(b, 4096, 0.1) } func BenchmarkEncoding1KBSaturated(b *testing.B) { benchmarkEncoding(b, 1024, 0.5) } func BenchmarkEncoding2KBSaturated(b *testing.B) { benchmarkEncoding(b, 2048, 0.5) } func BenchmarkEncoding4KBSaturated(b *testing.B) { benchmarkEncoding(b, 4096, 0.5) } func benchmarkEncoding(b *testing.B, bytes int, fill float64) { // Generate a random slice of bytes to compress random := rand.NewSource(0) // reproducible and comparable data := make([]byte, bytes) bits := int(float64(bytes) * 8 * fill) for i := 0; i < bits; i++ { idx := random.Int63() % int64(len(data)) bit := uint(random.Int63() % 8) data[idx] |= 1 << bit } // Reset the benchmark and measure encoding/decoding b.ResetTimer() b.ReportAllocs() for i := 0; i < b.N; i++ { bitsetDecodeBytes(bitsetEncodeBytes(data), len(data)) } } ================================================ FILE: common/bytes.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // Package common contains various helper functions. package common import ( "encoding/hex" "strings" ) // ToHex returns the hex representation of b, prefixed with '0x'. // For empty slices, the return value is "0x0". // // Deprecated: use hexutil.Encode instead. func ToHex(b []byte) string { hex := Bytes2Hex(b) if len(hex) == 0 { hex = "0" } return "0x" + hex } // FromHex returns the bytes represented by the hexadecimal string s. // s may be prefixed with "0x". func FromHex(s string) []byte { if len(s) > 1 { if s[0:2] == "0x" || s[0:2] == "0X" { s = s[2:] } } if len(s)%2 == 1 { s = "0" + s } return Hex2Bytes(s) } // CopyBytes returns an exact copy of the provided bytes. func CopyBytes(b []byte) (copiedBytes []byte) { if b == nil { return nil } copiedBytes = make([]byte, len(b)) copy(copiedBytes, b) return } // isHexCharacter returns bool of c being a valid hexadecimal. func isHexCharacter(c byte) bool { return ('0' <= c && c <= '9') || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F') } // isHex validates whether each byte is valid hexadecimal string. func isHex(str string) bool { if len(str)%2 != 0 { return false } for _, c := range []byte(str) { if !isHexCharacter(c) { return false } } return true } func has0xPrefix(input string) bool { return len(input) >= 2 && input[0] == '0' && (input[1] == 'x' || input[1] == 'X') } func Is0xPrefixHex(s string) bool { if has0xPrefix(s) { s = s[2:] return isHex(s) } else { return false } } // Bytes2Hex returns the hexadecimal encoding of d. func Bytes2Hex(d []byte) string { return hex.EncodeToString(d) } // Hex2Bytes returns the bytes represented by the hexadecimal string str. func Hex2Bytes(str string) []byte { h, _ := hex.DecodeString(str) return h } // Hex2BytesFixed returns bytes of a specified fixed length flen. func Hex2BytesFixed(str string, flen int) []byte { h, _ := hex.DecodeString(str) if len(h) == flen { return h } if len(h) > flen { return h[len(h)-flen:] } hh := make([]byte, flen) copy(hh[flen-len(h):flen], h[:]) return hh } // RightPadBytes zero-pads slice to the right up to length l. func RightPadBytes(slice []byte, l int) []byte { if l <= len(slice) { return slice } padded := make([]byte, l) copy(padded, slice) return padded } // LeftPadBytes zero-pads slice to the left up to length l. func LeftPadBytes(slice []byte, l int) []byte { if l <= len(slice) { return slice } padded := make([]byte, l) copy(padded[l-len(slice):], slice) return padded } func BytesToString(b []byte) string { return strings.Trim(string(b), string([]byte{0})) } ================================================ FILE: common/bytes_test.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package common import ( "bytes" "testing" checker "gopkg.in/check.v1" ) type BytesSuite struct{} var _ = checker.Suite(&BytesSuite{}) func (s *BytesSuite) TestCopyBytes(c *checker.C) { data1 := []byte{1, 2, 3, 4} exp1 := []byte{1, 2, 3, 4} res1 := CopyBytes(data1) c.Assert(res1, checker.DeepEquals, exp1) } func (s *BytesSuite) TestLeftPadBytes(c *checker.C) { val1 := []byte{1, 2, 3, 4} exp1 := []byte{0, 0, 0, 0, 1, 2, 3, 4} res1 := LeftPadBytes(val1, 8) res2 := LeftPadBytes(val1, 2) c.Assert(res1, checker.DeepEquals, exp1) c.Assert(res2, checker.DeepEquals, val1) } func (s *BytesSuite) TestRightPadBytes(c *checker.C) { val := []byte{1, 2, 3, 4} exp := []byte{1, 2, 3, 4, 0, 0, 0, 0} resstd := RightPadBytes(val, 8) resshrt := RightPadBytes(val, 2) c.Assert(resstd, checker.DeepEquals, exp) c.Assert(resshrt, checker.DeepEquals, val) } func TestFromHex(t *testing.T) { input := "0x01" expected := []byte{1} result := FromHex(input) if !bytes.Equal(expected, result) { t.Errorf("Expected %x got %x", expected, result) } } func TestIsHex(t *testing.T) { tests := []struct { input string ok bool }{ {"", true}, {"0", false}, {"00", true}, {"a9e67e", true}, {"A9E67E", true}, {"0xa9e67e", false}, {"a9e67e001", false}, {"0xHELLO_MY_NAME_IS_STEVEN_@#$^&*", false}, } for _, test := range tests { if ok := isHex(test.input); ok != test.ok { t.Errorf("isHex(%q) = %v, want %v", test.input, ok, test.ok) } } } func TestFromHexOddLength(t *testing.T) { input := "0x1" expected := []byte{1} result := FromHex(input) if !bytes.Equal(expected, result) { t.Errorf("Expected %x got %x", expected, result) } } func TestNoPrefixShortHexOddLength(t *testing.T) { input := "1" expected := []byte{1} result := FromHex(input) if !bytes.Equal(expected, result) { t.Errorf("Expected %x got %x", expected, result) } } ================================================ FILE: common/compiler/helpers.go ================================================ // Copyright 2019 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // Package compiler wraps the Solidity and Vyper compiler executables (solc; vyper). package compiler import ( "bytes" "io/ioutil" "regexp" ) var versionRegexp = regexp.MustCompile(`([0-9]+)\.([0-9]+)\.([0-9]+)`) // Contract contains information about a compiled contract, alongside its code and runtime code. type Contract struct { Code string `json:"code"` RuntimeCode string `json:"runtime-code"` Info ContractInfo `json:"info"` Hashes map[string]string `json:"hashes"` } // ContractInfo contains information about a compiled contract, including access // to the ABI definition, source mapping, user and developer docs, and metadata. // // Depending on the source, language version, compiler version, and compiler // options will provide information about how the contract was compiled. type ContractInfo struct { Source string `json:"source"` Language string `json:"language"` LanguageVersion string `json:"languageVersion"` CompilerVersion string `json:"compilerVersion"` CompilerOptions string `json:"compilerOptions"` SrcMap interface{} `json:"srcMap"` SrcMapRuntime string `json:"srcMapRuntime"` AbiDefinition interface{} `json:"abiDefinition"` UserDoc interface{} `json:"userDoc"` DeveloperDoc interface{} `json:"developerDoc"` Metadata string `json:"metadata"` } func slurpFiles(files []string) (string, error) { var concat bytes.Buffer for _, file := range files { content, err := ioutil.ReadFile(file) if err != nil { return "", err } concat.Write(content) } return concat.String(), nil } ================================================ FILE: common/compiler/solidity.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // Package compiler wraps the Solidity and Vyper compiler executables (solc; vyper). package compiler import ( "bytes" "encoding/json" "errors" "fmt" "os/exec" "strconv" "strings" ) // Solidity contains information about the solidity compiler. type Solidity struct { Path, Version, FullVersion string Major, Minor, Patch int } // --combined-output format type solcOutput struct { Contracts map[string]struct { BinRuntime string `json:"bin-runtime"` SrcMapRuntime string `json:"srcmap-runtime"` Bin, SrcMap, Abi, Devdoc, Userdoc, Metadata string Hashes map[string]string } Version string } func (s *Solidity) makeArgs() []string { p := []string{ "--combined-json", "bin,bin-runtime,srcmap,srcmap-runtime,abi,userdoc,devdoc", "--optimize", // code optimizer switched on "--allow-paths", "., ./, ../", // default to support relative paths } if s.Major > 0 || s.Minor > 4 || s.Patch > 6 { p[1] += ",metadata,hashes" } return p } // SolidityVersion runs solc and parses its version output. func SolidityVersion(solc string) (*Solidity, error) { if solc == "" { solc = "solc" } var out bytes.Buffer cmd := exec.Command(solc, "--version") cmd.Stdout = &out err := cmd.Run() if err != nil { return nil, err } matches := versionRegexp.FindStringSubmatch(out.String()) if len(matches) != 4 { return nil, fmt.Errorf("can't parse solc version %q", out.String()) } s := &Solidity{Path: cmd.Path, FullVersion: out.String(), Version: matches[0]} if s.Major, err = strconv.Atoi(matches[1]); err != nil { return nil, err } if s.Minor, err = strconv.Atoi(matches[2]); err != nil { return nil, err } if s.Patch, err = strconv.Atoi(matches[3]); err != nil { return nil, err } return s, nil } // CompileSolidityString builds and returns all the contracts contained within a source string. func CompileSolidityString(solc, source string) (map[string]*Contract, error) { if len(source) == 0 { return nil, errors.New("solc: empty source string") } s, err := SolidityVersion(solc) if err != nil { return nil, err } args := append(s.makeArgs(), "--") cmd := exec.Command(s.Path, append(args, "-")...) cmd.Stdin = strings.NewReader(source) return s.run(cmd, source) } // CompileSolidity compiles all given Solidity source files. func CompileSolidity(solc string, sourcefiles ...string) (map[string]*Contract, error) { if len(sourcefiles) == 0 { return nil, errors.New("solc: no source files") } source, err := slurpFiles(sourcefiles) if err != nil { return nil, err } s, err := SolidityVersion(solc) if err != nil { return nil, err } args := append(s.makeArgs(), "--") cmd := exec.Command(s.Path, append(args, sourcefiles...)...) return s.run(cmd, source) } func (s *Solidity) run(cmd *exec.Cmd, source string) (map[string]*Contract, error) { var stderr, stdout bytes.Buffer cmd.Stderr = &stderr cmd.Stdout = &stdout if err := cmd.Run(); err != nil { return nil, fmt.Errorf("solc: %v\n%s", err, stderr.Bytes()) } return ParseCombinedJSON(stdout.Bytes(), source, s.Version, s.Version, strings.Join(s.makeArgs(), " ")) } // ParseCombinedJSON takes the direct output of a solc --combined-output run and // parses it into a map of string contract name to Contract structs. The // provided source, language and compiler version, and compiler options are all // passed through into the Contract structs. // // The solc output is expected to contain ABI, source mapping, user docs, and dev docs. // // Returns an error if the JSON is malformed or missing data, or if the JSON // embedded within the JSON is malformed. func ParseCombinedJSON(combinedJSON []byte, source string, languageVersion string, compilerVersion string, compilerOptions string) (map[string]*Contract, error) { var output solcOutput if err := json.Unmarshal(combinedJSON, &output); err != nil { return nil, err } // Compilation succeeded, assemble and return the contracts. contracts := make(map[string]*Contract) for name, info := range output.Contracts { // Parse the individual compilation results. var abi interface{} if err := json.Unmarshal([]byte(info.Abi), &abi); err != nil { return nil, fmt.Errorf("solc: error reading abi definition (%v)", err) } var userdoc, devdoc interface{} json.Unmarshal([]byte(info.Userdoc), &userdoc) json.Unmarshal([]byte(info.Devdoc), &devdoc) contracts[name] = &Contract{ Code: "0x" + info.Bin, RuntimeCode: "0x" + info.BinRuntime, Hashes: info.Hashes, Info: ContractInfo{ Source: source, Language: "Solidity", LanguageVersion: languageVersion, CompilerVersion: compilerVersion, CompilerOptions: compilerOptions, SrcMap: info.SrcMap, SrcMapRuntime: info.SrcMapRuntime, AbiDefinition: abi, UserDoc: userdoc, DeveloperDoc: devdoc, Metadata: info.Metadata, }, } } return contracts, nil } ================================================ FILE: common/compiler/solidity_test.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package compiler import ( "os/exec" "testing" ) const ( testSource = ` pragma solidity >0.0.0; contract test { /// @notice Will multiply ` + "`a`" + ` by 7. function multiply(uint a) public returns(uint d) { return a * 7; } } ` ) func skipWithoutSolc(t *testing.T) { if _, err := exec.LookPath("solc"); err != nil { t.Skip(err) } } func TestSolidityCompiler(t *testing.T) { skipWithoutSolc(t) contracts, err := CompileSolidityString("", testSource) if err != nil { t.Fatalf("error compiling source. result %v: %v", contracts, err) } if len(contracts) != 1 { t.Errorf("one contract expected, got %d", len(contracts)) } c, ok := contracts["test"] if !ok { c, ok = contracts[":test"] if !ok { t.Fatal("info for contract 'test' not present in result") } } if c.Code == "" { t.Error("empty code") } if c.Info.Source != testSource { t.Error("wrong source") } if c.Info.CompilerVersion == "" { t.Error("empty version") } } func TestSolidityCompileError(t *testing.T) { skipWithoutSolc(t) contracts, err := CompileSolidityString("", testSource[4:]) if err == nil { t.Errorf("error expected compiling source. got none. result %v", contracts) } t.Logf("error: %v", err) } ================================================ FILE: common/debug.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package common import ( "fmt" "os" "runtime" "runtime/debug" "strings" ) // Report gives off a warning requesting the user to submit an issue to the github tracker. func Report(extra ...interface{}) { fmt.Fprintln(os.Stderr, "You've encountered a sought after, hard to reproduce bug. Please report this to the developers <3 https://github.com/sero-cash/go-sero/issues") fmt.Fprintln(os.Stderr, extra...) _, file, line, _ := runtime.Caller(1) fmt.Fprintf(os.Stderr, "%v:%v\n", file, line) debug.PrintStack() fmt.Fprintln(os.Stderr, "#### BUG! PLEASE REPORT ####") } // PrintDepricationWarning prinst the given string in a box using fmt.Println. func PrintDepricationWarning(str string) { line := strings.Repeat("#", len(str)+4) emptyLine := strings.Repeat(" ", len(str)) fmt.Printf(` %s # %s # # %s # # %s # %s `, line, emptyLine, str, emptyLine, line) } ================================================ FILE: common/fdlimit/fdlimit_freebsd.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // +build freebsd package fdlimit import "syscall" // This file is largely identical to fdlimit_unix.go, // but Rlimit fields have type int64 on FreeBSD so it needs // an extra conversion. // Raise tries to maximize the file descriptor allowance of this process // to the maximum hard-limit allowed by the OS. func Raise(max uint64) error { // Get the current limit var limit syscall.Rlimit if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { return err } // Try to update the limit to the max allowance limit.Cur = limit.Max if limit.Cur > int64(max) { limit.Cur = int64(max) } if err := syscall.Setrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { return err } return nil } // Current retrieves the number of file descriptors allowed to be opened by this // process. func Current() (int, error) { var limit syscall.Rlimit if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { return 0, err } return int(limit.Cur), nil } // Maximum retrieves the maximum number of file descriptors this process is // allowed to request for itself. func Maximum() (int, error) { var limit syscall.Rlimit if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { return 0, err } return int(limit.Max), nil } ================================================ FILE: common/fdlimit/fdlimit_unix.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // +build linux darwin netbsd openbsd solaris package fdlimit import "syscall" // Raise tries to maximize the file descriptor allowance of this process // to the maximum hard-limit allowed by the OS. func Raise(max uint64) error { // Get the current limit var limit syscall.Rlimit if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { return err } // Try to update the limit to the max allowance limit.Cur = limit.Max if limit.Cur > max { limit.Cur = max } if err := syscall.Setrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { return err } return nil } // Current retrieves the number of file descriptors allowed to be opened by this // process. func Current() (int, error) { var limit syscall.Rlimit if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { return 0, err } return int(limit.Cur), nil } // Maximum retrieves the maximum number of file descriptors this process is // allowed to request for itself. func Maximum() (int, error) { var limit syscall.Rlimit if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { return 0, err } return int(limit.Max), nil } ================================================ FILE: common/fdlimit/fdlimit_windows.go ================================================ // Copyright 2018 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package fdlimit import "errors" // Raise tries to maximize the file descriptor allowance of this process // to the maximum hard-limit allowed by the OS. func Raise(max uint64) error { // This method is NOP by design: // * Linux/Darwin counterparts need to manually increase per process limits // * On Windows Go uses the CreateFile API, which is limited to 16K files, non // changeable from within a running process // This way we can always "request" raising the limits, which will either have // or not have effect based on the platform we're running on. if max > 16384 { return errors.New("file descriptor limit (16384) reached") } return nil } // Current retrieves the number of file descriptors allowed to be opened by this // process. func Current() (int, error) { // Please see Raise for the reason why we use hard coded 16K as the limit return 16384, nil } // Maximum retrieves the maximum number of file descriptors this process is // allowed to request for itself. func Maximum() (int, error) { return Current() } ================================================ FILE: common/format.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package common import ( "fmt" "regexp" "strings" "time" ) // PrettyDuration is a pretty printed version of a time.Duration value that cuts // the unnecessary precision off from the formatted textual representation. type PrettyDuration time.Duration var prettyDurationRe = regexp.MustCompile(`\.[0-9]+`) // String implements the Stringer interface, allowing pretty printing of duration // values rounded to three decimals. func (d PrettyDuration) String() string { label := fmt.Sprintf("%v", time.Duration(d)) if match := prettyDurationRe.FindString(label); len(match) > 4 { label = strings.Replace(label, match, match[:4], 1) } return label } // PrettyAge is a pretty printed version of a time.Duration value that rounds // the values up to a single most significant unit, days/weeks/years included. type PrettyAge time.Time // ageUnits is a list of units the age pretty printing uses. var ageUnits = []struct { Size time.Duration Symbol string }{ {12 * 30 * 24 * time.Hour, "y"}, {30 * 24 * time.Hour, "mo"}, {7 * 24 * time.Hour, "w"}, {24 * time.Hour, "d"}, {time.Hour, "h"}, {time.Minute, "m"}, {time.Second, "s"}, } // String implements the Stringer interface, allowing pretty printing of duration // values rounded to the most significant time unit. func (t PrettyAge) String() string { // Calculate the time difference and handle the 0 cornercase diff := time.Since(time.Time(t)) if diff < time.Second { return "0" } // Accumulate a precision of 3 components before returning result, prec := "", 0 for _, unit := range ageUnits { if diff > unit.Size { result = fmt.Sprintf("%s%d%s", result, diff/unit.Size, unit.Symbol) diff %= unit.Size if prec += 1; prec >= 3 { break } } } return result } ================================================ FILE: common/hexutil/abi_string.go ================================================ package hexutil type Uint8 uint8 func (b *Uint8) UnmarshalText(input []byte) error { var u64 Uint64 err := u64.UnmarshalText(input) if u64 > Uint64(^uint8(0)) || err == ErrUint64Range { return ErrUintRange } else if err != nil { return err } *b = Uint8(u64) return nil } type Uint16 uint16 func (b *Uint16) UnmarshalText(input []byte) error { var u64 Uint64 err := u64.UnmarshalText(input) if u64 > Uint64(^uint16(0)) || err == ErrUint64Range { return ErrUintRange } else if err != nil { return err } *b = Uint16(u64) return nil } type Uint32 uint32 func (b *Uint32) UnmarshalText(input []byte) error { var u64 Uint64 err := u64.UnmarshalText(input) if u64 > Uint64(^uint32(0)) || err == ErrUint64Range { return ErrUintRange } else if err != nil { return err } *b = Uint32(u64) return nil } ================================================ FILE: common/hexutil/hexutil.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . /* Package hexutil implements hex encoding with 0x prefix. This encoding is used by the Ethereum RPC API to transport binary data in JSON payloads. Encoding Rules All hex data must have prefix "0x". For byte slices, the hex data must be of even length. An empty byte slice encodes as "0x". Integers are encoded using the least amount of digits (no leading zero digits). Their encoding may be of uneven length. The number zero encodes as "0x0". */ package hexutil import ( "encoding/hex" "fmt" "math/big" "strconv" ) const uintBits = 32 << (uint64(^uint(0)) >> 63) // Errors var ( ErrEmptyString = &decError{"empty hex string"} ErrInvalidBase58 = &decError{"invalid base58 string"} ErrSyntax = &decError{"invalid hex string"} ErrMissingPrefix = &decError{"hex string without 0x prefix"} ErrOddLength = &decError{"hex string of odd length"} ErrEmptyNumber = &decError{"hex string \"0x\""} ErrLeadingZero = &decError{"hex number with leading zero digits"} ErrUint64Range = &decError{"hex number > 64 bits"} ErrUintRange = &decError{fmt.Sprintf("hex number > %d bits", uintBits)} ErrBig256Range = &decError{"hex number > 256 bits"} ) type decError struct{ msg string } func (err decError) Error() string { return err.msg } // Decode decodes a hex string with 0x prefix. func Decode(input string) ([]byte, error) { if len(input) == 0 { return nil, ErrEmptyString } if !has0xPrefix(input) { return nil, ErrMissingPrefix } b, err := hex.DecodeString(input[2:]) if err != nil { err = mapError(err) } return b, err } // MustDecode decodes a hex string with 0x prefix. It panics for invalid input. func MustDecode(input string) []byte { dec, err := Decode(input) if err != nil { panic(err) } return dec } // Encode encodes b as a hex string with 0x prefix. func Encode(b []byte) string { enc := make([]byte, len(b)*2+2) copy(enc, "0x") hex.Encode(enc[2:], b) return string(enc) } // DecodeUint64 decodes a hex string with 0x prefix as a quantity. func DecodeUint64(input string) (uint64, error) { raw, err := checkNumber(input) if err != nil { return 0, err } dec, err := strconv.ParseUint(raw, 16, 64) if err != nil { err = mapError(err) } return dec, err } // MustDecodeUint64 decodes a hex string with 0x prefix as a quantity. // It panics for invalid input. func MustDecodeUint64(input string) uint64 { dec, err := DecodeUint64(input) if err != nil { panic(err) } return dec } // EncodeUint64 encodes i as a hex string with 0x prefix. func EncodeUint64(i uint64) string { enc := make([]byte, 2, 10) copy(enc, "0x") return string(strconv.AppendUint(enc, i, 16)) } var bigWordNibbles int func init() { // This is a weird way to compute the number of nibbles required for big.Word. // The usual way would be to use constant arithmetic but go vet can't handle that. b, _ := new(big.Int).SetString("FFFFFFFFFF", 16) switch len(b.Bits()) { case 1: bigWordNibbles = 16 case 2: bigWordNibbles = 8 default: panic("weird big.Word size") } } // DecodeBig decodes a hex string with 0x prefix as a quantity. // Numbers larger than 256 bits are not accepted. func DecodeBig(input string) (*big.Int, error) { raw, err := checkNumber(input) if err != nil { return nil, err } if len(raw) > 64 { return nil, ErrBig256Range } words := make([]big.Word, len(raw)/bigWordNibbles+1) end := len(raw) for i := range words { start := end - bigWordNibbles if start < 0 { start = 0 } for ri := start; ri < end; ri++ { nib := decodeNibble(raw[ri]) if nib == badNibble { return nil, ErrSyntax } words[i] *= 16 words[i] += big.Word(nib) } end = start } dec := new(big.Int).SetBits(words) return dec, nil } // MustDecodeBig decodes a hex string with 0x prefix as a quantity. // It panics for invalid input. func MustDecodeBig(input string) *big.Int { dec, err := DecodeBig(input) if err != nil { panic(err) } return dec } // EncodeBig encodes bigint as a hex string with 0x prefix. // The sign of the integer is ignored. func EncodeBig(bigint *big.Int) string { nbits := bigint.BitLen() if nbits == 0 { return "0x0" } return fmt.Sprintf("%#x", bigint) } func has0xPrefix(input string) bool { return len(input) >= 2 && input[0] == '0' && (input[1] == 'x' || input[1] == 'X') } func checkNumber(input string) (raw string, err error) { if len(input) == 0 { return "", ErrEmptyString } if !has0xPrefix(input) { return "", ErrMissingPrefix } input = input[2:] if len(input) == 0 { return "", ErrEmptyNumber } if len(input) > 1 && input[0] == '0' { return "", ErrLeadingZero } return input, nil } const badNibble = ^uint64(0) func decodeNibble(in byte) uint64 { switch { case in >= '0' && in <= '9': return uint64(in - '0') case in >= 'A' && in <= 'F': return uint64(in - 'A' + 10) case in >= 'a' && in <= 'f': return uint64(in - 'a' + 10) default: return badNibble } } func mapError(err error) error { if err, ok := err.(*strconv.NumError); ok { switch err.Err { case strconv.ErrRange: return ErrUint64Range case strconv.ErrSyntax: return ErrSyntax } } if _, ok := err.(hex.InvalidByteError); ok { return ErrSyntax } if err == hex.ErrLength { return ErrOddLength } return err } ================================================ FILE: common/hexutil/hexutil_test.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package hexutil import ( "bytes" "math/big" "testing" ) type marshalTest struct { input interface{} want string } type unmarshalTest struct { input string want interface{} wantErr error // if set, decoding must fail on any platform wantErr32bit error // if set, decoding must fail on 32bit platforms (used for Uint tests) } var ( encodeBytesTests = []marshalTest{ {[]byte{}, "0x"}, {[]byte{0}, "0x00"}, {[]byte{0, 0, 1, 2}, "0x00000102"}, } encodeBigTests = []marshalTest{ {referenceBig("0"), "0x0"}, {referenceBig("1"), "0x1"}, {referenceBig("ff"), "0xff"}, {referenceBig("112233445566778899aabbccddeeff"), "0x112233445566778899aabbccddeeff"}, {referenceBig("80a7f2c1bcc396c00"), "0x80a7f2c1bcc396c00"}, {referenceBig("-80a7f2c1bcc396c00"), "-0x80a7f2c1bcc396c00"}, } encodeUint64Tests = []marshalTest{ {uint64(0), "0x0"}, {uint64(1), "0x1"}, {uint64(0xff), "0xff"}, {uint64(0x1122334455667788), "0x1122334455667788"}, } encodeUintTests = []marshalTest{ {uint(0), "0x0"}, {uint(1), "0x1"}, {uint(0xff), "0xff"}, {uint(0x11223344), "0x11223344"}, } decodeBytesTests = []unmarshalTest{ // invalid {input: ``, wantErr: ErrEmptyString}, {input: `0`, wantErr: ErrMissingPrefix}, {input: `0x0`, wantErr: ErrOddLength}, {input: `0x023`, wantErr: ErrOddLength}, {input: `0xxx`, wantErr: ErrSyntax}, {input: `0x01zz01`, wantErr: ErrSyntax}, // valid {input: `0x`, want: []byte{}}, {input: `0X`, want: []byte{}}, {input: `0x02`, want: []byte{0x02}}, {input: `0X02`, want: []byte{0x02}}, {input: `0xffffffffff`, want: []byte{0xff, 0xff, 0xff, 0xff, 0xff}}, { input: `0xffffffffffffffffffffffffffffffffffff`, want: []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, }, } decodeBigTests = []unmarshalTest{ // invalid {input: `0`, wantErr: ErrMissingPrefix}, {input: `0x`, wantErr: ErrEmptyNumber}, {input: `0x01`, wantErr: ErrLeadingZero}, {input: `0xx`, wantErr: ErrSyntax}, {input: `0x1zz01`, wantErr: ErrSyntax}, { input: `0x10000000000000000000000000000000000000000000000000000000000000000`, wantErr: ErrBig256Range, }, // valid {input: `0x0`, want: big.NewInt(0)}, {input: `0x2`, want: big.NewInt(0x2)}, {input: `0x2F2`, want: big.NewInt(0x2f2)}, {input: `0X2F2`, want: big.NewInt(0x2f2)}, {input: `0x1122aaff`, want: big.NewInt(0x1122aaff)}, {input: `0xbBb`, want: big.NewInt(0xbbb)}, {input: `0xfffffffff`, want: big.NewInt(0xfffffffff)}, { input: `0x112233445566778899aabbccddeeff`, want: referenceBig("112233445566778899aabbccddeeff"), }, { input: `0xffffffffffffffffffffffffffffffffffff`, want: referenceBig("ffffffffffffffffffffffffffffffffffff"), }, { input: `0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`, want: referenceBig("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"), }, } decodeUint64Tests = []unmarshalTest{ // invalid {input: `0`, wantErr: ErrMissingPrefix}, {input: `0x`, wantErr: ErrEmptyNumber}, {input: `0x01`, wantErr: ErrLeadingZero}, {input: `0xfffffffffffffffff`, wantErr: ErrUint64Range}, {input: `0xx`, wantErr: ErrSyntax}, {input: `0x1zz01`, wantErr: ErrSyntax}, // valid {input: `0x0`, want: uint64(0)}, {input: `0x2`, want: uint64(0x2)}, {input: `0x2F2`, want: uint64(0x2f2)}, {input: `0X2F2`, want: uint64(0x2f2)}, {input: `0x1122aaff`, want: uint64(0x1122aaff)}, {input: `0xbbb`, want: uint64(0xbbb)}, {input: `0xffffffffffffffff`, want: uint64(0xffffffffffffffff)}, } ) func TestEncode(t *testing.T) { for _, test := range encodeBytesTests { enc := Encode(test.input.([]byte)) if enc != test.want { t.Errorf("input %x: wrong encoding %s", test.input, enc) } } } func TestDecode(t *testing.T) { for _, test := range decodeBytesTests { dec, err := Decode(test.input) if !checkError(t, test.input, err, test.wantErr) { continue } if !bytes.Equal(test.want.([]byte), dec) { t.Errorf("input %s: value mismatch: got %x, want %x", test.input, dec, test.want) continue } } } func TestEncodeBig(t *testing.T) { for _, test := range encodeBigTests { enc := EncodeBig(test.input.(*big.Int)) if enc != test.want { t.Errorf("input %x: wrong encoding %s", test.input, enc) } } } func TestDecodeBig(t *testing.T) { for _, test := range decodeBigTests { dec, err := DecodeBig(test.input) if !checkError(t, test.input, err, test.wantErr) { continue } if dec.Cmp(test.want.(*big.Int)) != 0 { t.Errorf("input %s: value mismatch: got %x, want %x", test.input, dec, test.want) continue } } } func TestEncodeUint64(t *testing.T) { for _, test := range encodeUint64Tests { enc := EncodeUint64(test.input.(uint64)) if enc != test.want { t.Errorf("input %x: wrong encoding %s", test.input, enc) } } } func TestDecodeUint64(t *testing.T) { for _, test := range decodeUint64Tests { dec, err := DecodeUint64(test.input) if !checkError(t, test.input, err, test.wantErr) { continue } if dec != test.want.(uint64) { t.Errorf("input %s: value mismatch: got %x, want %x", test.input, dec, test.want) continue } } } ================================================ FILE: common/hexutil/json.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package hexutil import ( "encoding/hex" "encoding/json" "fmt" "math/big" "reflect" "regexp" "strconv" "github.com/btcsuite/btcutil/base58" ) var ( bytesT = reflect.TypeOf(Bytes(nil)) bigT = reflect.TypeOf((*Big)(nil)) uintT = reflect.TypeOf(Uint(0)) uint64T = reflect.TypeOf(Uint64(0)) ) // Bytes marshals/unmarshals as a JSON string with 0x prefix. // The empty slice marshals as "0x". type Bytes []byte // MarshalText implements encoding.TextMarshaler func (b Bytes) MarshalText() ([]byte, error) { result := make([]byte, len(b)*2+2) copy(result, `0x`) hex.Encode(result[2:], b) return result, nil } func (b Bytes) MarshalBase58Text() ([]byte, error) { return []byte(base58.Encode(b)), nil } // UnmarshalJSON implements json.Unmarshaler. func (b *Bytes) UnmarshalJSON(input []byte) error { if !isString(input) { return errNonString(bytesT) } return wrapTypeError(b.UnmarshalText(input[1:len(input)-1]), bytesT) } // UnmarshalText implements encoding.TextUnmarshaler. func (b *Bytes) UnmarshalText(input []byte) error { raw, err := checkText(input, true) if err != nil { return err } dec := make([]byte, len(raw)/2) if _, err = hex.Decode(dec, raw); err != nil { err = mapError(err) } else { *b = dec } return err } // String returns the hex encoding of b. func (b Bytes) String() string { return Encode(b) } // UnmarshalFixedJSON decodes the input as a string with 0x prefix. The length of out // determines the required input length. This function is commonly used to implement the // UnmarshalJSON method for fixed-size types. func UnmarshalFixedJSON(typ reflect.Type, input, out []byte) error { if !isString(input) { return errNonString(typ) } return wrapTypeError(UnmarshalFixedText(typ.String(), input[1:len(input)-1], out), typ) } // UnmarshalFixedText decodes the input as a string with 0x prefix. The length of out // determines the required input length. This function is commonly used to implement the // UnmarshalText method for fixed-size types. func UnmarshalFixedText(typname string, input, out []byte) error { raw, err := checkText(input, true) if err != nil { return err } if len(raw)/2 != len(out) { return fmt.Errorf("hex string has length %d, want %d for %s", len(raw), len(out)*2, typname) } // Pre-verify syntax before modifying out. for _, b := range raw { if decodeNibble(b) == badNibble { return ErrSyntax } } hex.Decode(out, raw) return nil } // UnmarshalFixedUnprefixedText decodes the input as a string with optional 0x prefix. The // length of out determines the required input length. This function is commonly used to // implement the UnmarshalText method for fixed-size types. func UnmarshalFixedUnprefixedText(typname string, input, out []byte) error { raw, err := checkText(input, false) if err != nil { return err } if len(raw)/2 != len(out) { return fmt.Errorf("hex string has length %d, want %d for %s", len(raw), len(out)*2, typname) } // Pre-verify syntax before modifying out. for _, b := range raw { if decodeNibble(b) == badNibble { return ErrSyntax } } hex.Decode(out, raw) return nil } // Big marshals/unmarshals as a JSON string with 0x prefix. // The zero value marshals as "0x0". // // Negative integers are not supported at this time. Attempting to marshal them will // return an error. Values larger than 256bits are rejected by Unmarshal but will be // marshaled without error. type Big big.Int // MarshalText implements encoding.TextMarshaler func (b Big) MarshalText() ([]byte, error) { return []byte(EncodeBig((*big.Int)(&b))), nil } // UnmarshalJSON implements json.Unmarshaler. func (b *Big) UnmarshalJSON(input []byte) error { if !isString(input) { return errNonString(bigT) } return wrapTypeError(b.UnmarshalText(input[1:len(input)-1]), bigT) } // UnmarshalText implements encoding.TextUnmarshaler func (b *Big) UnmarshalText(input []byte) error { raw, err := checkNumberText(input) if err != nil { return err } if len(raw) > 64 { return ErrBig256Range } words := make([]big.Word, len(raw)/bigWordNibbles+1) end := len(raw) for i := range words { start := end - bigWordNibbles if start < 0 { start = 0 } for ri := start; ri < end; ri++ { nib := decodeNibble(raw[ri]) if nib == badNibble { return ErrSyntax } words[i] *= 16 words[i] += big.Word(nib) } end = start } var dec big.Int dec.SetBits(words) *b = (Big)(dec) return nil } // ToInt converts b to a big.Int. func (b *Big) ToInt() *big.Int { return (*big.Int)(b) } // String returns the hex encoding of b. func (b *Big) String() string { return EncodeBig(b.ToInt()) } // Uint64 marshals/unmarshals as a JSON string with 0x prefix. // The zero value marshals as "0x0". type Uint64 uint64 // MarshalText implements encoding.TextMarshaler. func (b Uint64) MarshalText() ([]byte, error) { buf := make([]byte, 2, 10) copy(buf, `0x`) buf = strconv.AppendUint(buf, uint64(b), 16) return buf, nil } // UnmarshalJSON implements json.Unmarshaler. func (b *Uint64) UnmarshalJSON(input []byte) error { if !isString(input) { return errNonString(uint64T) } return wrapTypeError(b.UnmarshalText(input[1:len(input)-1]), uint64T) } // UnmarshalText implements encoding.TextUnmarshaler func (b *Uint64) UnmarshalText(input []byte) error { raw, err := checkNumberText(input) if err != nil { return err } if len(raw) > 16 { return ErrUint64Range } var dec uint64 for _, byte := range raw { nib := decodeNibble(byte) if nib == badNibble { return ErrSyntax } dec *= 16 dec += nib } *b = Uint64(dec) return nil } // String returns the hex encoding of b. func (b Uint64) String() string { return EncodeUint64(uint64(b)) } // Uint marshals/unmarshals as a JSON string with 0x prefix. // The zero value marshals as "0x0". type Uint uint // MarshalText implements encoding.TextMarshaler. func (b Uint) MarshalText() ([]byte, error) { return Uint64(b).MarshalText() } // UnmarshalJSON implements json.Unmarshaler. func (b *Uint) UnmarshalJSON(input []byte) error { if !isString(input) { return errNonString(uintT) } return wrapTypeError(b.UnmarshalText(input[1:len(input)-1]), uintT) } // UnmarshalText implements encoding.TextUnmarshaler. func (b *Uint) UnmarshalText(input []byte) error { var u64 Uint64 err := u64.UnmarshalText(input) if u64 > Uint64(^uint(0)) || err == ErrUint64Range { return ErrUintRange } else if err != nil { return err } *b = Uint(u64) return nil } // String returns the hex encoding of b. func (b Uint) String() string { return EncodeUint64(uint64(b)) } func isString(input []byte) bool { return len(input) >= 2 && input[0] == '"' && input[len(input)-1] == '"' } func bytesHave0xPrefix(input []byte) bool { return len(input) >= 2 && input[0] == '0' && (input[1] == 'x' || input[1] == 'X') } func checkText(input []byte, wantPrefix bool) ([]byte, error) { if len(input) == 0 { return nil, nil // empty strings are allowed } if bytesHave0xPrefix(input) { input = input[2:] } else if wantPrefix { return nil, ErrMissingPrefix } if len(input)%2 != 0 { return nil, ErrOddLength } return input, nil } func isBase58Str(s string) bool { pattern := "^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$" match, err := regexp.MatchString(pattern, s) if err != nil { return false } return match } func checkBase58Text(input []byte) ([]byte, error) { if isBase58Str(string(input)) { return input, nil } else { return nil, ErrInvalidBase58 } return input, nil } func checkNumberText(input []byte) (raw []byte, err error) { if len(input) == 0 { return nil, nil // empty strings are allowed } if !bytesHave0xPrefix(input) { return nil, ErrMissingPrefix } input = input[2:] if len(input) == 0 { return nil, ErrEmptyNumber } if len(input) > 1 && input[0] == '0' { return nil, ErrLeadingZero } return input, nil } func wrapTypeError(err error, typ reflect.Type) error { if _, ok := err.(*decError); ok { return &json.UnmarshalTypeError{Value: err.Error(), Type: typ} } return err } func errNonString(typ reflect.Type) error { return &json.UnmarshalTypeError{Value: "non-string", Type: typ} } ================================================ FILE: common/hexutil/json_test.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package hexutil import ( "bytes" "encoding/hex" "encoding/json" "errors" "math/big" "testing" ) func checkError(t *testing.T, input string, got, want error) bool { if got == nil { if want != nil { t.Errorf("input %s: got no error, want %q", input, want) return false } return true } if want == nil { t.Errorf("input %s: unexpected error %q", input, got) } else if got.Error() != want.Error() { t.Errorf("input %s: got error %q, want %q", input, got, want) } return false } func referenceBig(s string) *big.Int { b, ok := new(big.Int).SetString(s, 16) if !ok { panic("invalid") } return b } func referenceBytes(s string) []byte { b, err := hex.DecodeString(s) if err != nil { panic(err) } return b } var errJSONEOF = errors.New("unexpected end of JSON input") var unmarshalBytesTests = []unmarshalTest{ // invalid encoding {input: "", wantErr: errJSONEOF}, {input: "null", wantErr: errNonString(bytesT)}, {input: "10", wantErr: errNonString(bytesT)}, {input: `"0"`, wantErr: wrapTypeError(ErrMissingPrefix, bytesT)}, {input: `"0x0"`, wantErr: wrapTypeError(ErrOddLength, bytesT)}, {input: `"0xxx"`, wantErr: wrapTypeError(ErrSyntax, bytesT)}, {input: `"0x01zz01"`, wantErr: wrapTypeError(ErrSyntax, bytesT)}, // valid encoding {input: `""`, want: referenceBytes("")}, {input: `"0x"`, want: referenceBytes("")}, {input: `"0x02"`, want: referenceBytes("02")}, {input: `"0X02"`, want: referenceBytes("02")}, {input: `"0xffffffffff"`, want: referenceBytes("ffffffffff")}, { input: `"0xffffffffffffffffffffffffffffffffffff"`, want: referenceBytes("ffffffffffffffffffffffffffffffffffff"), }, } func TestUnmarshalBytes(t *testing.T) { for _, test := range unmarshalBytesTests { var v Bytes err := json.Unmarshal([]byte(test.input), &v) if !checkError(t, test.input, err, test.wantErr) { continue } if !bytes.Equal(test.want.([]byte), []byte(v)) { t.Errorf("input %s: value mismatch: got %x, want %x", test.input, &v, test.want) continue } } } func BenchmarkUnmarshalBytes(b *testing.B) { input := []byte(`"0x123456789abcdef123456789abcdef"`) for i := 0; i < b.N; i++ { var v Bytes if err := v.UnmarshalJSON(input); err != nil { b.Fatal(err) } } } func TestMarshalBytes(t *testing.T) { for _, test := range encodeBytesTests { in := test.input.([]byte) out, err := json.Marshal(Bytes(in)) if err != nil { t.Errorf("%x: %v", in, err) continue } if want := `"` + test.want + `"`; string(out) != want { t.Errorf("%x: MarshalJSON output mismatch: got %q, want %q", in, out, want) continue } if out := Bytes(in).String(); out != test.want { t.Errorf("%x: String mismatch: got %q, want %q", in, out, test.want) continue } } } var unmarshalBigTests = []unmarshalTest{ // invalid encoding {input: "", wantErr: errJSONEOF}, {input: "null", wantErr: errNonString(bigT)}, {input: "10", wantErr: errNonString(bigT)}, {input: `"0"`, wantErr: wrapTypeError(ErrMissingPrefix, bigT)}, {input: `"0x"`, wantErr: wrapTypeError(ErrEmptyNumber, bigT)}, {input: `"0x01"`, wantErr: wrapTypeError(ErrLeadingZero, bigT)}, {input: `"0xx"`, wantErr: wrapTypeError(ErrSyntax, bigT)}, {input: `"0x1zz01"`, wantErr: wrapTypeError(ErrSyntax, bigT)}, { input: `"0x10000000000000000000000000000000000000000000000000000000000000000"`, wantErr: wrapTypeError(ErrBig256Range, bigT), }, // valid encoding {input: `""`, want: big.NewInt(0)}, {input: `"0x0"`, want: big.NewInt(0)}, {input: `"0x2"`, want: big.NewInt(0x2)}, {input: `"0x2F2"`, want: big.NewInt(0x2f2)}, {input: `"0X2F2"`, want: big.NewInt(0x2f2)}, {input: `"0x1122aaff"`, want: big.NewInt(0x1122aaff)}, {input: `"0xbBb"`, want: big.NewInt(0xbbb)}, {input: `"0xfffffffff"`, want: big.NewInt(0xfffffffff)}, { input: `"0x112233445566778899aabbccddeeff"`, want: referenceBig("112233445566778899aabbccddeeff"), }, { input: `"0xffffffffffffffffffffffffffffffffffff"`, want: referenceBig("ffffffffffffffffffffffffffffffffffff"), }, { input: `"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"`, want: referenceBig("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"), }, } func TestUnmarshalBig(t *testing.T) { for _, test := range unmarshalBigTests { var v Big err := json.Unmarshal([]byte(test.input), &v) if !checkError(t, test.input, err, test.wantErr) { continue } if test.want != nil && test.want.(*big.Int).Cmp((*big.Int)(&v)) != 0 { t.Errorf("input %s: value mismatch: got %x, want %x", test.input, (*big.Int)(&v), test.want) continue } } } func BenchmarkUnmarshalBig(b *testing.B) { input := []byte(`"0x123456789abcdef123456789abcdef"`) for i := 0; i < b.N; i++ { var v Big if err := v.UnmarshalJSON(input); err != nil { b.Fatal(err) } } } func TestMarshalBig(t *testing.T) { for _, test := range encodeBigTests { in := test.input.(*big.Int) out, err := json.Marshal((*Big)(in)) if err != nil { t.Errorf("%d: %v", in, err) continue } if want := `"` + test.want + `"`; string(out) != want { t.Errorf("%d: MarshalJSON output mismatch: got %q, want %q", in, out, want) continue } if out := (*Big)(in).String(); out != test.want { t.Errorf("%x: String mismatch: got %q, want %q", in, out, test.want) continue } } } var unmarshalUint64Tests = []unmarshalTest{ // invalid encoding {input: "", wantErr: errJSONEOF}, {input: "null", wantErr: errNonString(uint64T)}, {input: "10", wantErr: errNonString(uint64T)}, {input: `"0"`, wantErr: wrapTypeError(ErrMissingPrefix, uint64T)}, {input: `"0x"`, wantErr: wrapTypeError(ErrEmptyNumber, uint64T)}, {input: `"0x01"`, wantErr: wrapTypeError(ErrLeadingZero, uint64T)}, {input: `"0xfffffffffffffffff"`, wantErr: wrapTypeError(ErrUint64Range, uint64T)}, {input: `"0xx"`, wantErr: wrapTypeError(ErrSyntax, uint64T)}, {input: `"0x1zz01"`, wantErr: wrapTypeError(ErrSyntax, uint64T)}, // valid encoding {input: `""`, want: uint64(0)}, {input: `"0x0"`, want: uint64(0)}, {input: `"0x2"`, want: uint64(0x2)}, {input: `"0x2F2"`, want: uint64(0x2f2)}, {input: `"0X2F2"`, want: uint64(0x2f2)}, {input: `"0x1122aaff"`, want: uint64(0x1122aaff)}, {input: `"0xbbb"`, want: uint64(0xbbb)}, {input: `"0xffffffffffffffff"`, want: uint64(0xffffffffffffffff)}, } func TestUnmarshalUint64(t *testing.T) { for _, test := range unmarshalUint64Tests { var v Uint64 err := json.Unmarshal([]byte(test.input), &v) if !checkError(t, test.input, err, test.wantErr) { continue } if uint64(v) != test.want.(uint64) { t.Errorf("input %s: value mismatch: got %d, want %d", test.input, v, test.want) continue } } } func BenchmarkUnmarshalUint64(b *testing.B) { input := []byte(`"0x123456789abcdf"`) for i := 0; i < b.N; i++ { var v Uint64 v.UnmarshalJSON(input) } } func TestMarshalUint64(t *testing.T) { for _, test := range encodeUint64Tests { in := test.input.(uint64) out, err := json.Marshal(Uint64(in)) if err != nil { t.Errorf("%d: %v", in, err) continue } if want := `"` + test.want + `"`; string(out) != want { t.Errorf("%d: MarshalJSON output mismatch: got %q, want %q", in, out, want) continue } if out := (Uint64)(in).String(); out != test.want { t.Errorf("%x: String mismatch: got %q, want %q", in, out, test.want) continue } } } func TestMarshalUint(t *testing.T) { for _, test := range encodeUintTests { in := test.input.(uint) out, err := json.Marshal(Uint(in)) if err != nil { t.Errorf("%d: %v", in, err) continue } if want := `"` + test.want + `"`; string(out) != want { t.Errorf("%d: MarshalJSON output mismatch: got %q, want %q", in, out, want) continue } if out := (Uint)(in).String(); out != test.want { t.Errorf("%x: String mismatch: got %q, want %q", in, out, test.want) continue } } } var ( // These are variables (not constants) to avoid constant overflow // checks in the compiler on 32bit platforms. maxUint33bits = uint64(^uint32(0)) + 1 maxUint64bits = ^uint64(0) ) var unmarshalUintTests = []unmarshalTest{ // invalid encoding {input: "", wantErr: errJSONEOF}, {input: "null", wantErr: errNonString(uintT)}, {input: "10", wantErr: errNonString(uintT)}, {input: `"0"`, wantErr: wrapTypeError(ErrMissingPrefix, uintT)}, {input: `"0x"`, wantErr: wrapTypeError(ErrEmptyNumber, uintT)}, {input: `"0x01"`, wantErr: wrapTypeError(ErrLeadingZero, uintT)}, {input: `"0x100000000"`, want: uint(maxUint33bits), wantErr32bit: wrapTypeError(ErrUintRange, uintT)}, {input: `"0xfffffffffffffffff"`, wantErr: wrapTypeError(ErrUintRange, uintT)}, {input: `"0xx"`, wantErr: wrapTypeError(ErrSyntax, uintT)}, {input: `"0x1zz01"`, wantErr: wrapTypeError(ErrSyntax, uintT)}, // valid encoding {input: `""`, want: uint(0)}, {input: `"0x0"`, want: uint(0)}, {input: `"0x2"`, want: uint(0x2)}, {input: `"0x2F2"`, want: uint(0x2f2)}, {input: `"0X2F2"`, want: uint(0x2f2)}, {input: `"0x1122aaff"`, want: uint(0x1122aaff)}, {input: `"0xbbb"`, want: uint(0xbbb)}, {input: `"0xffffffff"`, want: uint(0xffffffff)}, {input: `"0xffffffffffffffff"`, want: uint(maxUint64bits), wantErr32bit: wrapTypeError(ErrUintRange, uintT)}, } func TestUnmarshalUint(t *testing.T) { for _, test := range unmarshalUintTests { var v Uint err := json.Unmarshal([]byte(test.input), &v) if uintBits == 32 && test.wantErr32bit != nil { checkError(t, test.input, err, test.wantErr32bit) continue } if !checkError(t, test.input, err, test.wantErr) { continue } if uint(v) != test.want.(uint) { t.Errorf("input %s: value mismatch: got %d, want %d", test.input, v, test.want) continue } } } func TestUnmarshalFixedUnprefixedText(t *testing.T) { tests := []struct { input string want []byte wantErr error }{ {input: "0x2", wantErr: ErrOddLength}, {input: "2", wantErr: ErrOddLength}, {input: "4444", wantErr: errors.New("hex string has length 4, want 8 for x")}, {input: "4444", wantErr: errors.New("hex string has length 4, want 8 for x")}, // check that output is not modified for partially correct input {input: "444444gg", wantErr: ErrSyntax, want: []byte{0, 0, 0, 0}}, {input: "0x444444gg", wantErr: ErrSyntax, want: []byte{0, 0, 0, 0}}, // valid inputs {input: "44444444", want: []byte{0x44, 0x44, 0x44, 0x44}}, {input: "0x44444444", want: []byte{0x44, 0x44, 0x44, 0x44}}, } for _, test := range tests { out := make([]byte, 4) err := UnmarshalFixedUnprefixedText("x", []byte(test.input), out) switch { case err == nil && test.wantErr != nil: t.Errorf("%q: got no error, expected %q", test.input, test.wantErr) case err != nil && test.wantErr == nil: t.Errorf("%q: unexpected error %q", test.input, err) case err != nil && err.Error() != test.wantErr.Error(): t.Errorf("%q: error mismatch: got %q, want %q", test.input, err, test.wantErr) } if test.want != nil && !bytes.Equal(out, test.want) { t.Errorf("%q: output mismatch: got %x, want %x", test.input, out, test.want) } } } ================================================ FILE: common/math/big.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // Package math provides integer math utilities. package math import ( "fmt" "math/big" ) // Various big integer limit values. var ( tt255 = BigPow(2, 255) tt256 = BigPow(2, 256) tt256m1 = new(big.Int).Sub(tt256, big.NewInt(1)) tt63 = BigPow(2, 63) MaxBig256 = new(big.Int).Set(tt256m1) MaxBig63 = new(big.Int).Sub(tt63, big.NewInt(1)) ) const ( // number of bits in a big.Word wordBits = 32 << (uint64(^big.Word(0)) >> 63) // number of bytes in a big.Word wordBytes = wordBits / 8 ) // HexOrDecimal256 marshals big.Int as hex or decimal. type HexOrDecimal256 big.Int // UnmarshalText implements encoding.TextUnmarshaler. func (i *HexOrDecimal256) UnmarshalText(input []byte) error { bigint, ok := ParseBig256(string(input)) if !ok { return fmt.Errorf("invalid hex or decimal integer %q", input) } *i = HexOrDecimal256(*bigint) return nil } // MarshalText implements encoding.TextMarshaler. func (i *HexOrDecimal256) MarshalText() ([]byte, error) { if i == nil { return []byte("0x0"), nil } return []byte(fmt.Sprintf("%#x", (*big.Int)(i))), nil } // ParseBig256 parses s as a 256 bit integer in decimal or hexadecimal syntax. // Leading zeros are accepted. The empty string parses as zero. func ParseBig256(s string) (*big.Int, bool) { if s == "" { return new(big.Int), true } var bigint *big.Int var ok bool if len(s) >= 2 && (s[:2] == "0x" || s[:2] == "0X") { bigint, ok = new(big.Int).SetString(s[2:], 16) } else { bigint, ok = new(big.Int).SetString(s, 10) } if ok && bigint.BitLen() > 256 { bigint, ok = nil, false } return bigint, ok } // MustParseBig256 parses s as a 256 bit big integer and panics if the string is invalid. func MustParseBig256(s string) *big.Int { v, ok := ParseBig256(s) if !ok { panic("invalid 256 bit integer: " + s) } return v } // BigPow returns a ** b as a big integer. func BigPow(a, b int64) *big.Int { r := big.NewInt(a) return r.Exp(r, big.NewInt(b), nil) } // BigMax returns the larger of x or y. func BigMax(x, y *big.Int) *big.Int { if x.Cmp(y) < 0 { return y } return x } // BigMin returns the smaller of x or y. func BigMin(x, y *big.Int) *big.Int { if x.Cmp(y) > 0 { return y } return x } // FirstBitSet returns the index of the first 1 bit in v, counting from LSB. func FirstBitSet(v *big.Int) int { for i := 0; i < v.BitLen(); i++ { if v.Bit(i) > 0 { return i } } return v.BitLen() } // PaddedBigBytes encodes a big integer as a big-endian byte slice. The length // of the slice is at least n bytes. func PaddedBigBytes(bigint *big.Int, n int) []byte { if bigint.BitLen()/8 >= n { return bigint.Bytes() } ret := make([]byte, n) ReadBits(bigint, ret) return ret } // bigEndianByteAt returns the byte at position n, // in Big-Endian encoding // So n==0 returns the least significant byte func bigEndianByteAt(bigint *big.Int, n int) byte { words := bigint.Bits() // Check word-bucket the byte will reside in i := n / wordBytes if i >= len(words) { return byte(0) } word := words[i] // Offset of the byte shift := 8 * uint(n%wordBytes) return byte(word >> shift) } // Byte returns the byte at position n, // with the supplied padlength in Little-Endian encoding. // n==0 returns the MSB // Example: bigint '5', padlength 32, n=31 => 5 func Byte(bigint *big.Int, padlength, n int) byte { if n >= padlength { return byte(0) } return bigEndianByteAt(bigint, padlength-1-n) } // ReadBits encodes the absolute value of bigint as big-endian bytes. Callers must ensure // that buf has enough space. If buf is too short the result will be incomplete. func ReadBits(bigint *big.Int, buf []byte) { i := len(buf) for _, d := range bigint.Bits() { for j := 0; j < wordBytes && i > 0; j++ { i-- buf[i] = byte(d) d >>= 8 } } } // U256 encodes as a 256 bit two's complement number. This operation is destructive. func U256(x *big.Int) *big.Int { return x.And(x, tt256m1) } // S256 interprets x as a two's complement number. // x must not exceed 256 bits (the result is undefined if it does) and is not modified. // // S256(0) = 0 // S256(1) = 1 // S256(2**255) = -2**255 // S256(2**256-1) = -1 func S256(x *big.Int) *big.Int { if x.Cmp(tt255) < 0 { return x } return new(big.Int).Sub(x, tt256) } // Exp implements exponentiation by squaring. // Exp returns a newly-allocated big integer and does not change // base or exponent. The result is truncated to 256 bits. // // Courtesy @karalabe and @chfast func Exp(base, exponent *big.Int) *big.Int { result := big.NewInt(1) for _, word := range exponent.Bits() { for i := 0; i < wordBits; i++ { if word&1 == 1 { U256(result.Mul(result, base)) } U256(base.Mul(base, base)) word >>= 1 } } return result } ================================================ FILE: common/math/big_test.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package math import ( "bytes" "encoding/hex" "math/big" "testing" "github.com/sero-cash/go-sero/common" ) func TestHexOrDecimal256(t *testing.T) { tests := []struct { input string num *big.Int ok bool }{ {"", big.NewInt(0), true}, {"0", big.NewInt(0), true}, {"0x0", big.NewInt(0), true}, {"12345678", big.NewInt(12345678), true}, {"0x12345678", big.NewInt(0x12345678), true}, {"0X12345678", big.NewInt(0x12345678), true}, // Tests for leading zero behaviour: {"0123456789", big.NewInt(123456789), true}, // note: not octal {"00", big.NewInt(0), true}, {"0x00", big.NewInt(0), true}, {"0x012345678abc", big.NewInt(0x12345678abc), true}, // Invalid syntax: {"abcdef", nil, false}, {"0xgg", nil, false}, // Larger than 256 bits: {"115792089237316195423570985008687907853269984665640564039457584007913129639936", nil, false}, } for _, test := range tests { var num HexOrDecimal256 err := num.UnmarshalText([]byte(test.input)) if (err == nil) != test.ok { t.Errorf("ParseBig(%q) -> (err == nil) == %t, want %t", test.input, err == nil, test.ok) continue } if test.num != nil && (*big.Int)(&num).Cmp(test.num) != 0 { t.Errorf("ParseBig(%q) -> %d, want %d", test.input, (*big.Int)(&num), test.num) } } } func TestMustParseBig256(t *testing.T) { defer func() { if recover() == nil { t.Error("MustParseBig should've panicked") } }() MustParseBig256("ggg") } func TestBigMax(t *testing.T) { a := big.NewInt(10) b := big.NewInt(5) max1 := BigMax(a, b) if max1 != a { t.Errorf("Expected %d got %d", a, max1) } max2 := BigMax(b, a) if max2 != a { t.Errorf("Expected %d got %d", a, max2) } } func TestBigMin(t *testing.T) { a := big.NewInt(10) b := big.NewInt(5) min1 := BigMin(a, b) if min1 != b { t.Errorf("Expected %d got %d", b, min1) } min2 := BigMin(b, a) if min2 != b { t.Errorf("Expected %d got %d", b, min2) } } func TestFirstBigSet(t *testing.T) { tests := []struct { num *big.Int ix int }{ {big.NewInt(0), 0}, {big.NewInt(1), 0}, {big.NewInt(2), 1}, {big.NewInt(0x100), 8}, } for _, test := range tests { if ix := FirstBitSet(test.num); ix != test.ix { t.Errorf("FirstBitSet(b%b) = %d, want %d", test.num, ix, test.ix) } } } func TestPaddedBigBytes(t *testing.T) { tests := []struct { num *big.Int n int result []byte }{ {num: big.NewInt(0), n: 4, result: []byte{0, 0, 0, 0}}, {num: big.NewInt(1), n: 4, result: []byte{0, 0, 0, 1}}, {num: big.NewInt(512), n: 4, result: []byte{0, 0, 2, 0}}, {num: BigPow(2, 32), n: 4, result: []byte{1, 0, 0, 0, 0}}, } for _, test := range tests { if result := PaddedBigBytes(test.num, test.n); !bytes.Equal(result, test.result) { t.Errorf("PaddedBigBytes(%d, %d) = %v, want %v", test.num, test.n, result, test.result) } } } func BenchmarkPaddedBigBytesLargePadding(b *testing.B) { bigint := MustParseBig256("123456789123456789123456789123456789") for i := 0; i < b.N; i++ { PaddedBigBytes(bigint, 200) } } func BenchmarkPaddedBigBytesSmallPadding(b *testing.B) { bigint := MustParseBig256("0x18F8F8F1000111000110011100222004330052300000000000000000FEFCF3CC") for i := 0; i < b.N; i++ { PaddedBigBytes(bigint, 5) } } func BenchmarkPaddedBigBytesSmallOnePadding(b *testing.B) { bigint := MustParseBig256("0x18F8F8F1000111000110011100222004330052300000000000000000FEFCF3CC") for i := 0; i < b.N; i++ { PaddedBigBytes(bigint, 32) } } func BenchmarkByteAtBrandNew(b *testing.B) { bigint := MustParseBig256("0x18F8F8F1000111000110011100222004330052300000000000000000FEFCF3CC") for i := 0; i < b.N; i++ { bigEndianByteAt(bigint, 15) } } func BenchmarkByteAt(b *testing.B) { bigint := MustParseBig256("0x18F8F8F1000111000110011100222004330052300000000000000000FEFCF3CC") for i := 0; i < b.N; i++ { bigEndianByteAt(bigint, 15) } } func BenchmarkByteAtOld(b *testing.B) { bigint := MustParseBig256("0x18F8F8F1000111000110011100222004330052300000000000000000FEFCF3CC") for i := 0; i < b.N; i++ { PaddedBigBytes(bigint, 32) } } func TestReadBits(t *testing.T) { check := func(input string) { want, _ := hex.DecodeString(input) int, _ := new(big.Int).SetString(input, 16) buf := make([]byte, len(want)) ReadBits(int, buf) if !bytes.Equal(buf, want) { t.Errorf("have: %x\nwant: %x", buf, want) } } check("000000000000000000000000000000000000000000000000000000FEFCF3F8F0") check("0000000000012345000000000000000000000000000000000000FEFCF3F8F0") check("18F8F8F1000111000110011100222004330052300000000000000000FEFCF3F8F0") } func TestU256(t *testing.T) { tests := []struct{ x, y *big.Int }{ {x: big.NewInt(0), y: big.NewInt(0)}, {x: big.NewInt(1), y: big.NewInt(1)}, {x: BigPow(2, 255), y: BigPow(2, 255)}, {x: BigPow(2, 256), y: big.NewInt(0)}, {x: new(big.Int).Add(BigPow(2, 256), big.NewInt(1)), y: big.NewInt(1)}, // negative values {x: big.NewInt(-1), y: new(big.Int).Sub(BigPow(2, 256), big.NewInt(1))}, {x: big.NewInt(-2), y: new(big.Int).Sub(BigPow(2, 256), big.NewInt(2))}, {x: BigPow(2, -255), y: big.NewInt(1)}, } for _, test := range tests { if y := U256(new(big.Int).Set(test.x)); y.Cmp(test.y) != 0 { t.Errorf("U256(%x) = %x, want %x", test.x, y, test.y) } } } func TestBigEndianByteAt(t *testing.T) { tests := []struct { x string y int exp byte }{ {"00", 0, 0x00}, {"01", 1, 0x00}, {"00", 1, 0x00}, {"01", 0, 0x01}, {"0000000000000000000000000000000000000000000000000000000000102030", 0, 0x30}, {"0000000000000000000000000000000000000000000000000000000000102030", 1, 0x20}, {"ABCDEF0908070605040302010000000000000000000000000000000000000000", 31, 0xAB}, {"ABCDEF0908070605040302010000000000000000000000000000000000000000", 32, 0x00}, {"ABCDEF0908070605040302010000000000000000000000000000000000000000", 500, 0x00}, } for _, test := range tests { v := new(big.Int).SetBytes(common.Hex2Bytes(test.x)) actual := bigEndianByteAt(v, test.y) if actual != test.exp { t.Fatalf("Expected [%v] %v:th byte to be %v, was %v.", test.x, test.y, test.exp, actual) } } } func TestLittleEndianByteAt(t *testing.T) { tests := []struct { x string y int exp byte }{ {"00", 0, 0x00}, {"01", 1, 0x00}, {"00", 1, 0x00}, {"01", 0, 0x00}, {"0000000000000000000000000000000000000000000000000000000000102030", 0, 0x00}, {"0000000000000000000000000000000000000000000000000000000000102030", 1, 0x00}, {"ABCDEF0908070605040302010000000000000000000000000000000000000000", 31, 0x00}, {"ABCDEF0908070605040302010000000000000000000000000000000000000000", 32, 0x00}, {"ABCDEF0908070605040302010000000000000000000000000000000000000000", 0, 0xAB}, {"ABCDEF0908070605040302010000000000000000000000000000000000000000", 1, 0xCD}, {"00CDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff", 0, 0x00}, {"00CDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff", 1, 0xCD}, {"0000000000000000000000000000000000000000000000000000000000102030", 31, 0x30}, {"0000000000000000000000000000000000000000000000000000000000102030", 30, 0x20}, {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 32, 0x0}, {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 31, 0xFF}, {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 0xFFFF, 0x0}, } for _, test := range tests { v := new(big.Int).SetBytes(common.Hex2Bytes(test.x)) actual := Byte(v, 32, test.y) if actual != test.exp { t.Fatalf("Expected [%v] %v:th byte to be %v, was %v.", test.x, test.y, test.exp, actual) } } } func TestS256(t *testing.T) { tests := []struct{ x, y *big.Int }{ {x: big.NewInt(0), y: big.NewInt(0)}, {x: big.NewInt(1), y: big.NewInt(1)}, {x: big.NewInt(2), y: big.NewInt(2)}, { x: new(big.Int).Sub(BigPow(2, 255), big.NewInt(1)), y: new(big.Int).Sub(BigPow(2, 255), big.NewInt(1)), }, { x: BigPow(2, 255), y: new(big.Int).Neg(BigPow(2, 255)), }, { x: new(big.Int).Sub(BigPow(2, 256), big.NewInt(1)), y: big.NewInt(-1), }, { x: new(big.Int).Sub(BigPow(2, 256), big.NewInt(2)), y: big.NewInt(-2), }, } for _, test := range tests { if y := S256(test.x); y.Cmp(test.y) != 0 { t.Errorf("S256(%x) = %x, want %x", test.x, y, test.y) } } } func TestExp(t *testing.T) { tests := []struct{ base, exponent, result *big.Int }{ {base: big.NewInt(0), exponent: big.NewInt(0), result: big.NewInt(1)}, {base: big.NewInt(1), exponent: big.NewInt(0), result: big.NewInt(1)}, {base: big.NewInt(1), exponent: big.NewInt(1), result: big.NewInt(1)}, {base: big.NewInt(1), exponent: big.NewInt(2), result: big.NewInt(1)}, {base: big.NewInt(3), exponent: big.NewInt(144), result: MustParseBig256("507528786056415600719754159741696356908742250191663887263627442114881")}, {base: big.NewInt(2), exponent: big.NewInt(255), result: MustParseBig256("57896044618658097711785492504343953926634992332820282019728792003956564819968")}, } for _, test := range tests { if result := Exp(test.base, test.exponent); result.Cmp(test.result) != 0 { t.Errorf("Exp(%d, %d) = %d, want %d", test.base, test.exponent, result, test.result) } } } ================================================ FILE: common/math/integer.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package math import ( "fmt" "strconv" ) // Integer limit values. const ( MaxInt8 = 1<<7 - 1 MinInt8 = -1 << 7 MaxInt16 = 1<<15 - 1 MinInt16 = -1 << 15 MaxInt32 = 1<<31 - 1 MinInt32 = -1 << 31 MaxInt64 = 1<<63 - 1 MinInt64 = -1 << 63 MaxUint8 = 1<<8 - 1 MaxUint16 = 1<<16 - 1 MaxUint32 = 1<<32 - 1 MaxUint64 = 1<<64 - 1 ) // HexOrDecimal64 marshals uint64 as hex or decimal. type HexOrDecimal64 uint64 // UnmarshalText implements encoding.TextUnmarshaler. func (i *HexOrDecimal64) UnmarshalText(input []byte) error { int, ok := ParseUint64(string(input)) if !ok { return fmt.Errorf("invalid hex or decimal integer %q", input) } *i = HexOrDecimal64(int) return nil } // MarshalText implements encoding.TextMarshaler. func (i HexOrDecimal64) MarshalText() ([]byte, error) { return []byte(fmt.Sprintf("%#x", uint64(i))), nil } // ParseUint64 parses s as an integer in decimal or hexadecimal syntax. // Leading zeros are accepted. The empty string parses as zero. func ParseUint64(s string) (uint64, bool) { if s == "" { return 0, true } if len(s) >= 2 && (s[:2] == "0x" || s[:2] == "0X") { v, err := strconv.ParseUint(s[2:], 16, 64) return v, err == nil } v, err := strconv.ParseUint(s, 10, 64) return v, err == nil } // MustParseUint64 parses s as an integer and panics if the string is invalid. func MustParseUint64(s string) uint64 { v, ok := ParseUint64(s) if !ok { panic("invalid unsigned 64 bit integer: " + s) } return v } // NOTE: The following methods need to be optimised using either bit checking or asm // SafeSub returns subtraction result and whether overflow occurred. func SafeSub(x, y uint64) (uint64, bool) { return x - y, x < y } // SafeAdd returns the result and whether overflow occurred. func SafeAdd(x, y uint64) (uint64, bool) { return x + y, y > MaxUint64-x } // SafeMul returns multiplication result and whether overflow occurred. func SafeMul(x, y uint64) (uint64, bool) { if x == 0 || y == 0 { return 0, false } return x * y, y > MaxUint64/x } ================================================ FILE: common/math/integer_test.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package math import ( "testing" ) type operation byte const ( sub operation = iota add mul ) func TestOverflow(t *testing.T) { for i, test := range []struct { x uint64 y uint64 overflow bool op operation }{ // add operations {MaxUint64, 1, true, add}, {MaxUint64 - 1, 1, false, add}, // sub operations {0, 1, true, sub}, {0, 0, false, sub}, // mul operations {0, 0, false, mul}, {10, 10, false, mul}, {MaxUint64, 2, true, mul}, {MaxUint64, 1, false, mul}, } { var overflows bool switch test.op { case sub: _, overflows = SafeSub(test.x, test.y) case add: _, overflows = SafeAdd(test.x, test.y) case mul: _, overflows = SafeMul(test.x, test.y) } if test.overflow != overflows { t.Errorf("%d failed. Expected test to be %v, got %v", i, test.overflow, overflows) } } } func TestHexOrDecimal64(t *testing.T) { tests := []struct { input string num uint64 ok bool }{ {"", 0, true}, {"0", 0, true}, {"0x0", 0, true}, {"12345678", 12345678, true}, {"0x12345678", 0x12345678, true}, {"0X12345678", 0x12345678, true}, // Tests for leading zero behaviour: {"0123456789", 123456789, true}, // note: not octal {"0x00", 0, true}, {"0x012345678abc", 0x12345678abc, true}, // Invalid syntax: {"abcdef", 0, false}, {"0xgg", 0, false}, // Doesn't fit into 64 bits: {"18446744073709551617", 0, false}, } for _, test := range tests { var num HexOrDecimal64 err := num.UnmarshalText([]byte(test.input)) if (err == nil) != test.ok { t.Errorf("ParseUint64(%q) -> (err == nil) = %t, want %t", test.input, err == nil, test.ok) continue } if err == nil && uint64(num) != test.num { t.Errorf("ParseUint64(%q) -> %d, want %d", test.input, num, test.num) } } } func TestMustParseUint64(t *testing.T) { if v := MustParseUint64("12345"); v != 12345 { t.Errorf(`MustParseUint64("12345") = %d, want 12345`, v) } } func TestMustParseUint64Panic(t *testing.T) { defer func() { if recover() == nil { t.Error("MustParseBig should've panicked") } }() MustParseUint64("ggg") } ================================================ FILE: common/mclock/mclock.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // Package mclock is a wrapper for a monotonic clock source package mclock import ( "time" "github.com/aristanetworks/goarista/monotime" ) // AbsTime represents absolute monotonic time. type AbsTime time.Duration // Now returns the current absolute monotonic time. func Now() AbsTime { return AbsTime(monotime.Now()) } ================================================ FILE: common/path.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package common import ( "fmt" "os" "path/filepath" "runtime" ) // MakeName creates a node name that follows the ethereum convention // for such names. It adds the operation system name and Go runtime version // the name. func MakeName(name, version string) string { return fmt.Sprintf("%s/v%s/%s/%s", name, version, runtime.GOOS, runtime.Version()) } // FileExist checks if a file exists at filePath. func FileExist(filePath string) bool { _, err := os.Stat(filePath) if err != nil && os.IsNotExist(err) { return false } return true } // AbsolutePath returns datadir + filename, or filename if it is absolute. func AbsolutePath(datadir string, filename string) string { if filepath.IsAbs(filename) { return filename } return filepath.Join(datadir, filename) } ================================================ FILE: common/size.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package common import ( "fmt" ) // StorageSize is a wrapper around a float value that supports user friendly // formatting. type StorageSize float64 // String implements the stringer interface. func (s StorageSize) String() string { if s > 1000000 { return fmt.Sprintf("%.2f mB", s/1000000) } else if s > 1000 { return fmt.Sprintf("%.2f kB", s/1000) } else { return fmt.Sprintf("%.2f B", s) } } // TerminalString implements log.TerminalStringer, formatting a string for console // output during logging. func (s StorageSize) TerminalString() string { if s > 1000000 { return fmt.Sprintf("%.2fmB", s/1000000) } else if s > 1000 { return fmt.Sprintf("%.2fkB", s/1000) } else { return fmt.Sprintf("%.2fB", s) } } ================================================ FILE: common/size_test.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package common import ( "testing" ) func TestStorageSizeString(t *testing.T) { tests := []struct { size StorageSize str string }{ {2381273, "2.38 mB"}, {2192, "2.19 kB"}, {12, "12.00 B"}, } for _, test := range tests { if test.size.String() != test.str { t.Errorf("%f: got %q, want %q", float64(test.size), test.size.String(), test.str) } } } ================================================ FILE: common/test_utils.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package common import ( "encoding/json" "fmt" "io/ioutil" ) // LoadJSON reads the given file and unmarshals its content. func LoadJSON(file string, val interface{}) error { content, err := ioutil.ReadFile(file) if err != nil { return err } if err := json.Unmarshal(content, val); err != nil { if syntaxerr, ok := err.(*json.SyntaxError); ok { line := findLine(content, syntaxerr.Offset) return fmt.Errorf("JSON syntax error at %v:%v: %v", file, line, err) } return fmt.Errorf("JSON unmarshal error in %v: %v", file, err) } return nil } // findLine returns the line number for the given offset into data. func findLine(data []byte, offset int64) (line int) { line = 1 for i, r := range string(data) { if int64(i) >= offset { return } if r == '\n' { line++ } } return } ================================================ FILE: common/types.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package common import ( "bytes" "database/sql/driver" "encoding/hex" "fmt" "math/big" "math/rand" "reflect" "github.com/sero-cash/go-sero/common/address" "github.com/sero-cash/go-sero/common/hexutil" "github.com/sero-cash/go-czero-import/c_superzk" "github.com/pkg/errors" "github.com/btcsuite/btcutil/base58" "github.com/sero-cash/go-sero/crypto/sha3" "github.com/sero-cash/go-czero-import/c_type" ) // Lengths of hashes and addresses in bytes. const ( // HashLength is the expected length of the hash HashLength = 32 // AddressLength is the expected length of the adddress AddressLength = 96 ) var ( hashT = reflect.TypeOf(Hash{}) //addressT = reflect.TypeOf(Address{}) ) func IsString(input []byte) bool { return len(input) >= 2 && input[0] == '"' && input[len(input)-1] == '"' } // Hash represents the 32 byte Keccak256 hash of arbitrary data. type Hash [HashLength]byte // BytesToHash sets b to hash. // If b is larger than len(h), b will be cropped from the left. func BytesToHash(b []byte) Hash { var h Hash h.SetBytes(b) return h } // BigToHash sets byte representation of b to hash. // If b is larger than len(h), b will be cropped from the left. func BigToHash(b *big.Int) Hash { return BytesToHash(b.Bytes()) } // HexToHash sets byte representation of s to hash. // If b is larger than len(h), b will be cropped from the left. func HexToHash(s string) Hash { return BytesToHash(FromHex(s)) } // Bytes gets the byte representation of the underlying hash. func (h Hash) Bytes() []byte { return h[:] } // Big converts a hash to a big integer. func (h Hash) Big() *big.Int { return new(big.Int).SetBytes(h[:]) } // Hex converts a hash to a hex string. func (h Hash) Hex() string { return hexutil.Encode(h[:]) } // TerminalString implements log.TerminalStringer, formatting a string for console // output during logging. func (h Hash) TerminalString() string { return fmt.Sprintf("%x…%x", h[:3], h[29:]) } // String implements the stringer interface and is used also by the logger when // doing full logging into a file. func (h Hash) String() string { return h.Hex() } // Format implements fmt.Formatter, forcing the byte slice to be formatted as is, // without going through the stringer interface used for logging. func (h Hash) Format(s fmt.State, c rune) { fmt.Fprintf(s, "%"+string(c), h[:]) } // UnmarshalText parses a hash in hex syntax. func (h *Hash) UnmarshalText(input []byte) error { return hexutil.UnmarshalFixedText("Hash", input, h[:]) } // UnmarshalJSON parses a hash in hex syntax. func (h *Hash) UnmarshalJSON(input []byte) error { return hexutil.UnmarshalFixedJSON(hashT, input, h[:]) } // MarshalText returns the hex representation of h. func (h Hash) MarshalText() ([]byte, error) { return hexutil.Bytes(h[:]).MarshalText() } // SetBytes sets the hash to the value of b. // If b is larger than len(h), b will be cropped from the left. func (h *Hash) SetBytes(b []byte) { if len(b) > len(h) { b = b[len(b)-HashLength:] } copy(h[HashLength-len(b):], b) } // Generate implements testing/quick.Generator. func (h Hash) Generate(rand *rand.Rand, size int) reflect.Value { m := rand.Intn(len(h)) for i := len(h) - 1; i > m; i-- { h[i] = byte(rand.Uint32()) } return reflect.ValueOf(h) } // Scan implements Scanner for database/sql. func (h *Hash) Scan(src interface{}) error { srcB, ok := src.([]byte) if !ok { return fmt.Errorf("can't scan %T into Hash", src) } if len(srcB) != HashLength { return fmt.Errorf("can't scan []byte of len %d into Hash, want %d", len(srcB), HashLength) } copy(h[:], srcB) return nil } // Value implements valuer for database/sql. func (h Hash) Value() (driver.Value, error) { return h[:], nil } func (h Hash) HashToUint256() *c_type.Uint256 { u256 := c_type.Uint256{} copy(u256[:], h[:]) return &u256 } func HashToHex(hashs []Hash) []string { hexs := []string{} for _, hash := range hashs { hexs = append(hexs, hash.Hex()) } return hexs } // UnprefixedHash allows marshaling a Hash without 0x prefix. type UnprefixedHash Hash // UnmarshalText decodes the hash from hex. The 0x prefix is optional. func (h *UnprefixedHash) UnmarshalText(input []byte) error { return hexutil.UnmarshalFixedUnprefixedText("UnprefixedHash", input, h[:]) } // MarshalText encodes the hash as hex. func (h UnprefixedHash) MarshalText() ([]byte, error) { return []byte(hex.EncodeToString(h[:])), nil } /////////// Data func keccak512(data ...[]byte) []byte { d := sha3.NewKeccak512() for _, b := range data { d.Write(b) } return d.Sum(nil) } // Data represents the 64 byte Data of an Ethereum account. type Address [AddressLength]byte type ContractAddress [20]byte func (a Address) ToCaddr() ContractAddress { var addr ContractAddress pkr := new(c_type.PKr) copy(pkr[:], a[:]) hash := c_superzk.HashPKr(pkr) addr.SetBytes(hash[:]) return addr } // Hash converts an Data to a hash by left-padding it with zeros. func (a ContractAddress) Big() *big.Int { return new(big.Int).SetBytes(a[:]) } func (a *ContractAddress) SetBytes(b []byte) { if len(b) > len(a) { b = b[len(b)-20:] } copy(a[20-len(b):], b) } func (a ContractAddress) MarshalText() ([]byte, error) { return hexutil.Bytes(a[:]).MarshalText() } // UnmarshalText parses a hash in hex syntax. func (a *ContractAddress) UnmarshalText(input []byte) error { return hexutil.UnmarshalFixedText("ContractAddress", input, a[:]) } // BytesToAddress returns Data with value b. // If b is larger than len(h), b will be cropped from the left. func BytesToAddress(b []byte) Address { var a Address a.SetBytes(b) return a } func BytesToContractAddress(b []byte) ContractAddress { var a ContractAddress a.SetBytes(b) return a } // BigToAddress returns Data with byte values of b. // If b is larger than len(h), b will be cropped from the left. func BigToAddress(b *big.Int) Address { return BytesToAddress(b.Bytes()) } func BigToContractAddress(b *big.Int) ContractAddress { return BytesToContractAddress(b.Bytes()) } // HexToAddress returns Data with byte values of s. // If s is larger than len(h), s will be cropped from the left. //func HexToAddress(s string) Data { return BytesToAddress(FromHex(s)) } func Base58ToAddress(s string) Address { out := base58.Decode(s) return BytesToAddress(out[:]) } // Bytes gets the string representation of the underlying Data. func (a Address) Bytes() []byte { return a[:] } func (a Address) ToPKr() *c_type.PKr { pubKey := c_type.PKr{} copy(pubKey[:], a[:]) return &pubKey } func (a Address) ToUint512() *c_type.Uint512 { pubKey := c_type.Uint512{} copy(pubKey[:], a[:]) return &pubKey } // Big converts an Data to a big integer. func (a Address) Big() *big.Int { return new(big.Int).SetBytes(a[:]) } // Base58 returns base58 string representation of the Data. func (a Address) Base58() string { return base58.Encode(a[:]) } // String implements fmt.Stringer. func (a Address) String() string { if a.IsAccountAddress() { return base58.Encode(a[:64]) } else { return a.Base58() } } func (a Address) IsAccountAddress() bool { zerobytes := [32]byte{} var suffix [32]byte copy(suffix[:], a[64:]) if suffix == zerobytes { return true } return false } // Format implements fmt.Formatter, forcing the byte slice to be formatted as is, // without going through the stringer interface used for logging. func (a Address) Format(s fmt.State, c rune) { fmt.Fprintf(s, "%"+string(c), a[:]) } // SetBytes sets the Data to the value of b. // If b is larger than len(a) it will panic. func (a *Address) SetBytes(b []byte) { copy(a[:], b) //if len(b) > len(a) { // b = b[len(b)-AddressLength:] //} //copy(a[AddressLength-len(b):], b) } // MarshalText returns the hex representation of a. func (a Address) MarshalText() ([]byte, error) { return hexutil.Bytes(a[:]).MarshalBase58Text() } // UnmarshalText parses a hash in hex syntax. func (a *Address) UnmarshalText(input []byte) error { if address.IsBase58Str(string(input)) { out := base58.Decode(string(input)) if len(out) != 64 && len(out) != 96 { return errors.New("address length must be 64 or 96 bytes") } if len(out) == 96 { empty := Hash{} if bytes.Compare(out[64:], empty[:]) != 0 { err := address.ValidPkr(out) if err != nil { return err } } } copy(a[:], out) } else { return errors.New("not base58 string") } return nil } // UnmarshalJSON parses a hash in hex syntax. func (a *Address) UnmarshalJSON(input []byte) error { if !IsString(input) { return errors.New("not string") } else { return a.UnmarshalText(input[1 : len(input)-1]) } } // Scan implements Scanner for database/sql. func (a *Address) Scan(src interface{}) error { srcB, ok := src.([]byte) if !ok { return fmt.Errorf("can't scan %T into Data", src) } if len(srcB) != AddressLength { return fmt.Errorf("can't scan []byte of len %d into Data, want %d", len(srcB), AddressLength) } copy(a[:], srcB) return nil } //func (a *Data) IsContract() bool { // return strings.HasSuffix(string(a[:]),"contract") //} // Value implements valuer for database/sql. func (a Address) Value() (driver.Value, error) { return a[:], nil } type AddressList []Address func (self AddressList) Len() int { return len(self) } func (self AddressList) Less(i, j int) bool { return bytes.Compare(self[i][:], self[j][:]) < 0 } func (self AddressList) Swap(i, j int) { self[i], self[j] = self[j], self[i] } // UnprefixedAddress allows marshaling an Data without 0x prefix. type UnprefixedAddress Address func (a *UnprefixedAddress) UnmarshalText(input []byte) error { if address.IsBase58Str(string(input)) { out := base58.Decode(string(input)) copy(a[:], out[:]) return nil } else { return errors.New("invalid Address") } } // MarshalText encodes the Data as hex. func (a UnprefixedAddress) MarshalText() ([]byte, error) { return []byte(base58.Encode(a[:])), nil } func ByteSliceEqual(a, b []byte) bool { if len(a) != len(b) { return false } if (a == nil) != (b == nil) { return false } b = b[:len(a)] for i, v := range a { if v != b[i] { return false } } return true } ================================================ FILE: consensus/consensus.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // Package consensus implements different Ethereum consensus engines. package consensus import ( "math/big" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core/state" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/params" "github.com/sero-cash/go-sero/rpc" ) // ChainReader defines a small collection of methods needed to access the local // blockchain during header verification. type ChainReader interface { // Config retrieves the blockchain's chain configuration. Config() *params.ChainConfig // CurrentHeader retrieves the current header from the local chain. CurrentHeader() *types.Header // GetHeader retrieves a block header from the database by hash and number. GetHeader(hash common.Hash, number uint64) *types.Header // GetHeaderByNumber retrieves a block header from the database by number. GetHeaderByNumber(number uint64) *types.Header // GetHeaderByHash retrieves a block header from the database by its hash. GetHeaderByHash(hash common.Hash) *types.Header // GetBlock retrieves a block from the database by hash and number. GetBlock(hash common.Hash, number uint64) *types.Block } // Engine is an algorithm agnostic consensus engine. type Engine interface { // Author retrieves the Ethereum address of the account that minted the given // block, which may be different from the header's coinbase if a consensus // engine is based on signatures. Author(header *types.Header) (common.Address, error) // VerifyHeader checks whether a header conforms to the consensus rules of a // given engine. Verifying the seal may be done optionally here, or explicitly // via the VerifySeal method. VerifyHeader(chain ChainReader, header *types.Header, seal bool) error // VerifyHeaders is similar to VerifyHeader, but verifies a batch of headers // concurrently. The method returns a quit channel to abort the operations and // a results channel to retrieve the async verifications (the order is that of // the input slice). VerifyHeaders(chain ChainReader, headers []*types.Header, seals []bool) (chan<- struct{}, <-chan error) // VerifySeal checks whether the crypto seal on a header is valid according to // the consensus rules of the given engine. VerifySeal(chain ChainReader, header *types.Header) error // Prepare initializes the consensus fields of a block header according to the // rules of a particular engine. The changes are executed inline. Prepare(chain ChainReader, header *types.Header) error // Finalize runs any post-transaction state modifications (e.g. block rewards) // and assembles the final block. // Note: The block header and state database might be updated to reflect any // consensus rules that happen at finalization (e.g. block rewards). Finalize(chain ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, receipts []*types.Receipt, gasReward uint64) (*types.Block, error) // Seal generates a new block for the given input block with the local miner's // seal place on top. Seal(chain ChainReader, block *types.Block, stop <-chan struct{}) (*types.Block, error) // CalcDifficulty is the difficulty adjustment algorithm. It returns the difficulty // that a new block should have. CalcDifficulty(chain ChainReader, time uint64, parent *types.Header) *big.Int // APIs returns the RPC APIs this consensus engine provides. APIs(chain ChainReader) []rpc.API } // PoW is a consensus engine based on proof-of-work. type PoW interface { Engine StartHashrate() StopHashrate() // Hashrate returns the current mining hashrate of a PoW consensus engine. Hashrate() float64 } ================================================ FILE: consensus/errors.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package consensus import "errors" var ( // ErrUnknownAncestor is returned when validating a block requires an ancestor // that is unknown. ErrUnknownAncestor = errors.New("unknown ancestor") // ErrPrunedAncestor is returned when validating a block requires an ancestor // that is known, but the state of which is not available. ErrPrunedAncestor = errors.New("pruned ancestor") // ErrFutureBlock is returned when a block's timestamp is in the future according // to the current node. ErrFutureBlock = errors.New("block in the future") // ErrInvalidNumber is returned if a block's number doesn't equal it's parent's // plus one. ErrInvalidNumber = errors.New("invalid block number") ) ================================================ FILE: consensus/ethash/algorithm.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package ethash import ( "encoding/binary" "hash" "math/big" "reflect" "runtime" "sync" "sync/atomic" "time" "unsafe" "github.com/sero-cash/go-sero/consensus/ethash_hash" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/common/bitutil" "github.com/sero-cash/go-sero/crypto/sha3" "github.com/sero-cash/go-sero/log" ) const ( datasetInitBytes = 1 << 30 // Bytes in dataset at genesis datasetGrowthBytes = 1 << 23 // Dataset growth per epoch cacheInitBytes = 1 << 24 // Bytes in cache at genesis cacheGrowthBytes = 1 << 17 // Cache growth per epoch epochLength = 30000 // Blocks per epoch mixBytes = 128 // Width of mix hashBytes = 64 // Hash length in bytes hashWords = 16 // Number of 32 bit ints in a hash datasetParents = 256 // Number of parents of each dataset element cacheRounds = 3 // Number of rounds in cache production loopAccesses = 64 // Number of accesses in hashimoto loop ) // cacheSize returns the size of the ethash verification cache that belongs to a certain // block number. func cacheSize(block uint64) uint64 { epoch := int(block / epochLength) if epoch < maxEpoch { return cacheSizes[epoch] } return calcCacheSize(epoch) } // calcCacheSize calculates the cache size for epoch. The cache size grows linearly, // however, we always take the highest prime below the linearly growing threshold in order // to reduce the risk of accidental regularities leading to cyclic behavior. func calcCacheSize(epoch int) uint64 { size := cacheInitBytes + cacheGrowthBytes*uint64(epoch) - hashBytes for !new(big.Int).SetUint64(size / hashBytes).ProbablyPrime(1) { // Always accurate for n < 2^64 size -= 2 * hashBytes } return size } // datasetSize returns the size of the ethash mining dataset that belongs to a certain // block number. func datasetSize(block uint64) uint64 { epoch := int(block / epochLength) if epoch < maxEpoch { return datasetSizes[epoch] } return calcDatasetSize(epoch) } // calcDatasetSize calculates the dataset size for epoch. The dataset size grows linearly, // however, we always take the highest prime below the linearly growing threshold in order // to reduce the risk of accidental regularities leading to cyclic behavior. func calcDatasetSize(epoch int) uint64 { size := datasetInitBytes + datasetGrowthBytes*uint64(epoch) - mixBytes for !new(big.Int).SetUint64(size / mixBytes).ProbablyPrime(1) { // Always accurate for n < 2^64 size -= 2 * mixBytes } return size } // hasher is a repetitive hasher allowing the same hash data structures to be // reused between hash runs instead of requiring new ones to be created. type hasher func(dest []byte, data []byte) // makeHasher creates a repetitive hasher, allowing the same hash data structures to // be reused between hash runs instead of requiring new ones to be created. The returned // function is not thread safe! func makeHasher(h hash.Hash) hasher { // sha3.state supports Read to get the sum, use it to avoid the overhead of Sum. // Read alters the state but we reset the hash before every operation. type readerHash interface { hash.Hash Read([]byte) (int, error) } rh, ok := h.(readerHash) if !ok { panic("can't find Read method on hash") } outputLen := rh.Size() return func(dest []byte, data []byte) { rh.Reset() rh.Write(data) rh.Read(dest[:outputLen]) } } // seedHash is the seed to use for generating a verification cache and the mining // dataset. func seedHash(block uint64) []byte { seed := make([]byte, 32) if block < epochLength { return seed } keccak256 := makeHasher(sha3.NewKeccak256()) for i := 0; i < int(block/epochLength); i++ { keccak256(seed, seed) } return seed } // generateCache creates a verification cache of a given size for an input seed. // The cache production process involves first sequentially filling up 32 MB of // memory, then performing two passes of Sergio Demian Lerner's RandMemoHash // algorithm from Strict Memory Hard Hashing Functions (2014). The output is a // set of 524288 64-byte values. // This method places the result into dest in machine byte order. func generateCache(dest []uint32, epoch uint64, seed []byte) { // Print some debug logs to allow analysis on low end devices logger := log.New("epoch", epoch) start := time.Now() defer func() { elapsed := time.Since(start) logFn := logger.Debug if elapsed > 3*time.Second { logFn = logger.Info } logFn("Generated ethash verification cache", "elapsed", common.PrettyDuration(elapsed)) }() // Convert our destination slice to a byte buffer header := *(*reflect.SliceHeader)(unsafe.Pointer(&dest)) header.Len *= 4 header.Cap *= 4 cache := *(*[]byte)(unsafe.Pointer(&header)) // Calculate the number of theoretical rows (we'll store in one buffer nonetheless) size := uint64(len(cache)) rows := int(size) / hashBytes // Start a monitoring goroutine to report progress on low end devices var progress uint32 done := make(chan struct{}) defer close(done) go func() { for { select { case <-done: return case <-time.After(3 * time.Second): logger.Info("Generating ethash verification cache", "percentage", atomic.LoadUint32(&progress)*100/uint32(rows)/4, "elapsed", common.PrettyDuration(time.Since(start))) } } }() // Create a hasher to reuse between invocations keccak512 := makeHasher(sha3.NewKeccak512()) // Sequentially produce the initial dataset keccak512(cache, seed) for offset := uint64(hashBytes); offset < size; offset += hashBytes { keccak512(cache[offset:], cache[offset-hashBytes:offset]) atomic.AddUint32(&progress, 1) } // Use a low-round version of randmemohash temp := make([]byte, hashBytes) for i := 0; i < cacheRounds; i++ { for j := 0; j < rows; j++ { var ( srcOff = ((j - 1 + rows) % rows) * hashBytes dstOff = j * hashBytes xorOff = (binary.LittleEndian.Uint32(cache[dstOff:]) % uint32(rows)) * hashBytes ) bitutil.XORBytes(temp, cache[srcOff:srcOff+hashBytes], cache[xorOff:xorOff+hashBytes]) keccak512(cache[dstOff:], temp) atomic.AddUint32(&progress, 1) } } // Swap the byte order on big endian systems and return if !isLittleEndian() { swap(cache) } } // swap changes the byte order of the buffer assuming a uint32 representation. func swap(buffer []byte) { for i := 0; i < len(buffer); i += 4 { binary.BigEndian.PutUint32(buffer[i:], binary.LittleEndian.Uint32(buffer[i:])) } } // fnv is an algorithm inspired by the FNV hash, which in some cases is used as // a non-associative substitute for XOR. Note that we multiply the prime with // the full 32-bit input, in contrast with the FNV-1 spec which multiplies the // prime with one byte (octet) in turn. func fnv(a, b uint32) uint32 { return a*0x01000193 ^ b } // fnvHash mixes in data into mix using the ethash fnv method. func fnvHash(mix []uint32, data []uint32) { for i := 0; i < len(mix); i++ { mix[i] = mix[i]*0x01000193 ^ data[i] } } // generateDatasetItem combines data from 256 pseudorandomly selected cache nodes, // and hashes that to compute a single dataset node. func generateDatasetItem(cache []uint32, index uint32, keccak512 hasher) []byte { // Calculate the number of theoretical rows (we use one buffer nonetheless) rows := uint32(len(cache) / hashWords) // Initialize the mix mix := make([]byte, hashBytes) binary.LittleEndian.PutUint32(mix, cache[(index%rows)*hashWords]^index) for i := 1; i < hashWords; i++ { binary.LittleEndian.PutUint32(mix[i*4:], cache[(index%rows)*hashWords+uint32(i)]) } keccak512(mix, mix) // Convert the mix to uint32s to avoid constant bit shifting intMix := make([]uint32, hashWords) for i := 0; i < len(intMix); i++ { intMix[i] = binary.LittleEndian.Uint32(mix[i*4:]) } // fnv it with a lot of random cache nodes based on index for i := uint32(0); i < datasetParents; i++ { parent := fnv(index^i, intMix[i%16]) % rows fnvHash(intMix, cache[parent*hashWords:]) } // Flatten the uint32 mix into a binary one and return for i, val := range intMix { binary.LittleEndian.PutUint32(mix[i*4:], val) } keccak512(mix, mix) return mix } // generateDataset generates the entire ethash dataset for mining. // This method places the result into dest in machine byte order. func generateDataset(dest []uint32, epoch uint64, cache []uint32) { // Print some debug logs to allow analysis on low end devices logger := log.New("epoch", epoch) start := time.Now() defer func() { elapsed := time.Since(start) logFn := logger.Debug if elapsed > 3*time.Second { logFn = logger.Info } logFn("Generated ethash verification cache", "elapsed", common.PrettyDuration(elapsed)) }() // Figure out whether the bytes need to be swapped for the machine swapped := !isLittleEndian() // Convert our destination slice to a byte buffer header := *(*reflect.SliceHeader)(unsafe.Pointer(&dest)) header.Len *= 4 header.Cap *= 4 dataset := *(*[]byte)(unsafe.Pointer(&header)) // Generate the dataset on many goroutines since it takes a while threads := runtime.NumCPU() size := uint64(len(dataset)) var pend sync.WaitGroup pend.Add(threads) var progress uint32 for i := 0; i < threads; i++ { go func(id int) { defer pend.Done() // Create a hasher to reuse between invocations //keccak512 := makeHasher(sha3.NewKeccak512()) keccak512 := makeHasher(sha3.NewKeccak512()) // Calculate the data segment this thread should generate batch := uint32((size + hashBytes*uint64(threads) - 1) / (hashBytes * uint64(threads))) first := uint32(id) * batch limit := first + batch if limit > uint32(size/hashBytes) { limit = uint32(size / hashBytes) } // Calculate the dataset segment percent := uint32(size / hashBytes / 100) for index := first; index < limit; index++ { item := generateDatasetItem(cache, index, keccak512) if swapped { swap(item) } copy(dataset[index*hashBytes:], item) if status := atomic.AddUint32(&progress, 1); status%percent == 0 { logger.Info("Generating DAG in progress", "percentage", uint64(status*100)/(size/hashBytes), "elapsed", common.PrettyDuration(time.Since(start))) } } }(i) } // Wait for all the generators to finish and return pend.Wait() } // hashimoto aggregates data from the full dataset in order to produce our final // value for a particular header hash and nonce. func hashimoto(hash []byte, nonce uint64, size uint64, lookup func(index uint32) []uint32, num uint64) ([]byte, []byte) { // Calculate the number of theoretical rows (we use one buffer nonetheless) rows := uint32(size / mixBytes) // Combine header+nonce into a 64 byte seed seed := make([]byte, 40) copy(seed, hash) binary.LittleEndian.PutUint64(seed[32:], nonce) //seed = crypto.Keccak512(seed) seed = ethash_hash.Miner_Hash_0(seed, num) seedHead := binary.LittleEndian.Uint32(seed) // Start the mix with replicated seed mix := make([]uint32, mixBytes/4) for i := 0; i < len(mix); i++ { mix[i] = binary.LittleEndian.Uint32(seed[i%16*4:]) } // Mix in random dataset nodes temp := make([]uint32, len(mix)) for i := 0; i < loopAccesses; i++ { parent := fnv(uint32(i)^seedHead, mix[i%len(mix)]) % rows for j := uint32(0); j < mixBytes/hashBytes; j++ { copy(temp[j*hashWords:], lookup(2*parent+j)) } fnvHash(mix, temp) } // Compress mix for i := 0; i < len(mix); i += 4 { mix[i/4] = fnv(fnv(fnv(mix[i], mix[i+1]), mix[i+2]), mix[i+3]) } mix = mix[:len(mix)/4] digest := make([]byte, common.HashLength) for i, val := range mix { binary.LittleEndian.PutUint32(digest[i*4:], val) } //return digest, crypto.Keccak256(append(seed, digest...)) return digest, ethash_hash.Miner_Hash_1(append(seed, digest...), num) } // hashimotoLight aggregates data from the full dataset (using only a small // in-memory cache) in order to produce our final value for a particular header // hash and nonce. func hashimotoLight(size uint64, cache []uint32, hash []byte, nonce uint64, num uint64) ([]byte, []byte) { keccak512 := makeHasher(sha3.NewKeccak512()) lookup := func(index uint32) []uint32 { rawData := generateDatasetItem(cache, index, keccak512) data := make([]uint32, len(rawData)/4) for i := 0; i < len(data); i++ { data[i] = binary.LittleEndian.Uint32(rawData[i*4:]) } return data } return hashimoto(hash, nonce, size, lookup, num) } // hashimotoFull aggregates data from the full dataset (using the full in-memory // dataset) in order to produce our final value for a particular header hash and // nonce. func hashimotoFull(dataset []uint32, hash []byte, nonce uint64, num uint64) ([]byte, []byte) { lookup := func(index uint32) []uint32 { offset := index * hashWords return dataset[offset : offset+hashWords] } return hashimoto(hash, nonce, uint64(len(dataset))*4, lookup, num) } const maxEpoch = 2048 // datasetSizes is a lookup table for the ethash dataset size for the first 2048 // epochs (i.e. 61440000 blocks). var datasetSizes = [maxEpoch]uint64{ 1073739904, 1082130304, 1090514816, 1098906752, 1107293056, 1115684224, 1124070016, 1132461952, 1140849536, 1149232768, 1157627776, 1166013824, 1174404736, 1182786944, 1191180416, 1199568512, 1207958912, 1216345216, 1224732032, 1233124736, 1241513344, 1249902464, 1258290304, 1266673792, 1275067264, 1283453312, 1291844992, 1300234112, 1308619904, 1317010048, 1325397376, 1333787776, 1342176128, 1350561664, 1358954368, 1367339392, 1375731584, 1384118144, 1392507008, 1400897408, 1409284736, 1417673344, 1426062464, 1434451072, 1442839168, 1451229056, 1459615616, 1468006016, 1476394112, 1484782976, 1493171584, 1501559168, 1509948032, 1518337664, 1526726528, 1535114624, 1543503488, 1551892096, 1560278656, 1568669056, 1577056384, 1585446272, 1593831296, 1602219392, 1610610304, 1619000192, 1627386752, 1635773824, 1644164224, 1652555648, 1660943488, 1669332608, 1677721216, 1686109312, 1694497664, 1702886272, 1711274624, 1719661184, 1728047744, 1736434816, 1744829056, 1753218944, 1761606272, 1769995904, 1778382464, 1786772864, 1795157888, 1803550592, 1811937664, 1820327552, 1828711552, 1837102976, 1845488768, 1853879936, 1862269312, 1870656896, 1879048064, 1887431552, 1895825024, 1904212096, 1912601216, 1920988544, 1929379456, 1937765504, 1946156672, 1954543232, 1962932096, 1971321728, 1979707264, 1988093056, 1996487552, 2004874624, 2013262208, 2021653888, 2030039936, 2038430848, 2046819968, 2055208576, 2063596672, 2071981952, 2080373632, 2088762752, 2097149056, 2105539712, 2113928576, 2122315136, 2130700672, 2139092608, 2147483264, 2155872128, 2164257664, 2172642176, 2181035392, 2189426048, 2197814912, 2206203008, 2214587264, 2222979712, 2231367808, 2239758208, 2248145024, 2256527744, 2264922752, 2273312128, 2281701248, 2290086272, 2298476672, 2306867072, 2315251072, 2323639168, 2332032128, 2340420224, 2348808064, 2357196416, 2365580416, 2373966976, 2382363008, 2390748544, 2399139968, 2407530368, 2415918976, 2424307328, 2432695424, 2441084288, 2449472384, 2457861248, 2466247808, 2474637184, 2483026816, 2491414144, 2499803776, 2508191872, 2516582272, 2524970368, 2533359232, 2541743488, 2550134144, 2558525056, 2566913408, 2575301504, 2583686528, 2592073856, 2600467328, 2608856192, 2617240448, 2625631616, 2634022016, 2642407552, 2650796416, 2659188352, 2667574912, 2675965312, 2684352896, 2692738688, 2701130624, 2709518464, 2717907328, 2726293376, 2734685056, 2743073152, 2751462016, 2759851648, 2768232832, 2776625536, 2785017728, 2793401984, 2801794432, 2810182016, 2818571648, 2826959488, 2835349376, 2843734144, 2852121472, 2860514432, 2868900992, 2877286784, 2885676928, 2894069632, 2902451584, 2910843008, 2919234688, 2927622784, 2936011648, 2944400768, 2952789376, 2961177728, 2969565568, 2977951616, 2986338944, 2994731392, 3003120256, 3011508352, 3019895936, 3028287104, 3036675968, 3045063808, 3053452928, 3061837696, 3070228352, 3078615424, 3087003776, 3095394944, 3103782272, 3112173184, 3120562048, 3128944768, 3137339264, 3145725056, 3154109312, 3162505088, 3170893184, 3179280256, 3187669376, 3196056704, 3204445568, 3212836736, 3221224064, 3229612928, 3238002304, 3246391168, 3254778496, 3263165824, 3271556224, 3279944576, 3288332416, 3296719232, 3305110912, 3313500032, 3321887104, 3330273152, 3338658944, 3347053184, 3355440512, 3363827072, 3372220288, 3380608384, 3388997504, 3397384576, 3405774208, 3414163072, 3422551936, 3430937984, 3439328384, 3447714176, 3456104576, 3464493952, 3472883584, 3481268864, 3489655168, 3498048896, 3506434432, 3514826368, 3523213952, 3531603584, 3539987072, 3548380288, 3556763264, 3565157248, 3573545344, 3581934464, 3590324096, 3598712704, 3607098752, 3615488384, 3623877248, 3632265856, 3640646528, 3649043584, 3657430144, 3665821568, 3674207872, 3682597504, 3690984832, 3699367808, 3707764352, 3716152448, 3724541056, 3732925568, 3741318016, 3749706368, 3758091136, 3766481536, 3774872704, 3783260032, 3791650432, 3800036224, 3808427648, 3816815488, 3825204608, 3833592704, 3841981568, 3850370432, 3858755968, 3867147904, 3875536256, 3883920512, 3892313728, 3900702592, 3909087872, 3917478784, 3925868416, 3934256512, 3942645376, 3951032192, 3959422336, 3967809152, 3976200064, 3984588416, 3992974976, 4001363584, 4009751168, 4018141312, 4026530432, 4034911616, 4043308928, 4051695488, 4060084352, 4068472448, 4076862848, 4085249408, 4093640576, 4102028416, 4110413696, 4118805632, 4127194496, 4135583104, 4143971968, 4152360832, 4160746112, 4169135744, 4177525888, 4185912704, 4194303616, 4202691968, 4211076736, 4219463552, 4227855488, 4236246656, 4244633728, 4253022848, 4261412224, 4269799808, 4278184832, 4286578048, 4294962304, 4303349632, 4311743104, 4320130432, 4328521088, 4336909184, 4345295488, 4353687424, 4362073472, 4370458496, 4378852736, 4387238528, 4395630208, 4404019072, 4412407424, 4420790656, 4429182848, 4437571456, 4445962112, 4454344064, 4462738048, 4471119232, 4479516544, 4487904128, 4496289664, 4504682368, 4513068416, 4521459584, 4529846144, 4538232704, 4546619776, 4555010176, 4563402112, 4571790208, 4580174464, 4588567936, 4596957056, 4605344896, 4613734016, 4622119808, 4630511488, 4638898816, 4647287936, 4655675264, 4664065664, 4672451968, 4680842624, 4689231488, 4697620352, 4706007424, 4714397056, 4722786176, 4731173248, 4739562368, 4747951744, 4756340608, 4764727936, 4773114496, 4781504384, 4789894784, 4798283648, 4806667648, 4815059584, 4823449472, 4831835776, 4840226176, 4848612224, 4857003392, 4865391488, 4873780096, 4882169728, 4890557312, 4898946944, 4907333248, 4915722368, 4924110976, 4932499328, 4940889728, 4949276032, 4957666432, 4966054784, 4974438016, 4982831488, 4991221376, 4999607168, 5007998848, 5016386432, 5024763776, 5033164672, 5041544576, 5049941888, 5058329728, 5066717056, 5075107456, 5083494272, 5091883904, 5100273536, 5108662144, 5117048192, 5125436032, 5133827456, 5142215296, 5150605184, 5158993024, 5167382144, 5175769472, 5184157568, 5192543872, 5200936064, 5209324928, 5217711232, 5226102656, 5234490496, 5242877312, 5251263872, 5259654016, 5268040832, 5276434304, 5284819328, 5293209728, 5301598592, 5309986688, 5318374784, 5326764416, 5335151488, 5343542144, 5351929472, 5360319872, 5368706944, 5377096576, 5385484928, 5393871232, 5402263424, 5410650496, 5419040384, 5427426944, 5435816576, 5444205952, 5452594816, 5460981376, 5469367936, 5477760896, 5486148736, 5494536832, 5502925952, 5511315328, 5519703424, 5528089984, 5536481152, 5544869504, 5553256064, 5561645696, 5570032768, 5578423936, 5586811264, 5595193216, 5603585408, 5611972736, 5620366208, 5628750464, 5637143936, 5645528192, 5653921408, 5662310272, 5670694784, 5679082624, 5687474048, 5695864448, 5704251008, 5712641408, 5721030272, 5729416832, 5737806208, 5746194304, 5754583936, 5762969984, 5771358592, 5779748224, 5788137856, 5796527488, 5804911232, 5813300608, 5821692544, 5830082176, 5838468992, 5846855552, 5855247488, 5863636096, 5872024448, 5880411008, 5888799872, 5897186432, 5905576832, 5913966976, 5922352768, 5930744704, 5939132288, 5947522432, 5955911296, 5964299392, 5972688256, 5981074304, 5989465472, 5997851008, 6006241408, 6014627968, 6023015552, 6031408256, 6039796096, 6048185216, 6056574848, 6064963456, 6073351808, 6081736064, 6090128768, 6098517632, 6106906496, 6115289216, 6123680896, 6132070016, 6140459648, 6148849024, 6157237376, 6165624704, 6174009728, 6182403712, 6190792064, 6199176064, 6207569792, 6215952256, 6224345216, 6232732544, 6241124224, 6249510272, 6257899136, 6266287744, 6274676864, 6283065728, 6291454336, 6299843456, 6308232064, 6316620928, 6325006208, 6333395584, 6341784704, 6350174848, 6358562176, 6366951296, 6375337856, 6383729536, 6392119168, 6400504192, 6408895616, 6417283456, 6425673344, 6434059136, 6442444672, 6450837376, 6459223424, 6467613056, 6476004224, 6484393088, 6492781952, 6501170048, 6509555072, 6517947008, 6526336384, 6534725504, 6543112832, 6551500672, 6559888768, 6568278656, 6576662912, 6585055616, 6593443456, 6601834112, 6610219648, 6618610304, 6626999168, 6635385472, 6643777408, 6652164224, 6660552832, 6668941952, 6677330048, 6685719424, 6694107776, 6702493568, 6710882176, 6719274112, 6727662976, 6736052096, 6744437632, 6752825984, 6761213824, 6769604224, 6777993856, 6786383488, 6794770816, 6803158144, 6811549312, 6819937664, 6828326528, 6836706176, 6845101696, 6853491328, 6861880448, 6870269312, 6878655104, 6887046272, 6895433344, 6903822208, 6912212864, 6920596864, 6928988288, 6937377152, 6945764992, 6954149248, 6962544256, 6970928768, 6979317376, 6987709312, 6996093824, 7004487296, 7012875392, 7021258624, 7029652352, 7038038912, 7046427776, 7054818944, 7063207808, 7071595136, 7079980928, 7088372608, 7096759424, 7105149824, 7113536896, 7121928064, 7130315392, 7138699648, 7147092352, 7155479168, 7163865728, 7172249984, 7180648064, 7189036672, 7197424768, 7205810816, 7214196608, 7222589824, 7230975104, 7239367552, 7247755904, 7256145536, 7264533376, 7272921472, 7281308032, 7289694848, 7298088832, 7306471808, 7314864512, 7323253888, 7331643008, 7340029568, 7348419712, 7356808832, 7365196672, 7373585792, 7381973888, 7390362752, 7398750592, 7407138944, 7415528576, 7423915648, 7432302208, 7440690304, 7449080192, 7457472128, 7465860992, 7474249088, 7482635648, 7491023744, 7499412608, 7507803008, 7516192384, 7524579968, 7532967296, 7541358464, 7549745792, 7558134656, 7566524032, 7574912896, 7583300992, 7591690112, 7600075136, 7608466816, 7616854912, 7625244544, 7633629824, 7642020992, 7650410368, 7658794112, 7667187328, 7675574912, 7683961984, 7692349568, 7700739712, 7709130368, 7717519232, 7725905536, 7734295424, 7742683264, 7751069056, 7759457408, 7767849088, 7776238208, 7784626816, 7793014912, 7801405312, 7809792128, 7818179968, 7826571136, 7834957184, 7843347328, 7851732352, 7860124544, 7868512384, 7876902016, 7885287808, 7893679744, 7902067072, 7910455936, 7918844288, 7927230848, 7935622784, 7944009344, 7952400256, 7960786048, 7969176704, 7977565312, 7985953408, 7994339968, 8002730368, 8011119488, 8019508096, 8027896192, 8036285056, 8044674688, 8053062272, 8061448832, 8069838464, 8078227328, 8086616704, 8095006592, 8103393664, 8111783552, 8120171392, 8128560256, 8136949376, 8145336704, 8153726848, 8162114944, 8170503296, 8178891904, 8187280768, 8195669632, 8204058496, 8212444544, 8220834176, 8229222272, 8237612672, 8246000768, 8254389376, 8262775168, 8271167104, 8279553664, 8287944064, 8296333184, 8304715136, 8313108352, 8321497984, 8329885568, 8338274432, 8346663296, 8355052928, 8363441536, 8371828352, 8380217984, 8388606592, 8396996224, 8405384576, 8413772672, 8422161536, 8430549376, 8438939008, 8447326592, 8455715456, 8464104832, 8472492928, 8480882048, 8489270656, 8497659776, 8506045312, 8514434944, 8522823808, 8531208832, 8539602304, 8547990656, 8556378752, 8564768384, 8573154176, 8581542784, 8589933952, 8598322816, 8606705024, 8615099264, 8623487872, 8631876992, 8640264064, 8648653952, 8657040256, 8665430656, 8673820544, 8682209152, 8690592128, 8698977152, 8707374464, 8715763328, 8724151424, 8732540032, 8740928384, 8749315712, 8757704576, 8766089344, 8774480768, 8782871936, 8791260032, 8799645824, 8808034432, 8816426368, 8824812928, 8833199488, 8841591424, 8849976448, 8858366336, 8866757248, 8875147136, 8883532928, 8891923328, 8900306816, 8908700288, 8917088384, 8925478784, 8933867392, 8942250368, 8950644608, 8959032704, 8967420544, 8975809664, 8984197504, 8992584064, 9000976256, 9009362048, 9017752448, 9026141312, 9034530688, 9042917504, 9051307904, 9059694208, 9068084864, 9076471424, 9084861824, 9093250688, 9101638528, 9110027648, 9118416512, 9126803584, 9135188096, 9143581312, 9151969664, 9160356224, 9168747136, 9177134464, 9185525632, 9193910144, 9202302848, 9210690688, 9219079552, 9227465344, 9235854464, 9244244864, 9252633472, 9261021824, 9269411456, 9277799296, 9286188928, 9294574208, 9302965888, 9311351936, 9319740032, 9328131968, 9336516736, 9344907392, 9353296768, 9361685888, 9370074752, 9378463616, 9386849408, 9395239808, 9403629184, 9412016512, 9420405376, 9428795008, 9437181568, 9445570688, 9453960832, 9462346624, 9470738048, 9479121536, 9487515008, 9495903616, 9504289664, 9512678528, 9521067904, 9529456256, 9537843584, 9546233728, 9554621312, 9563011456, 9571398784, 9579788672, 9588178304, 9596567168, 9604954496, 9613343104, 9621732992, 9630121856, 9638508416, 9646898816, 9655283584, 9663675776, 9672061312, 9680449664, 9688840064, 9697230464, 9705617536, 9714003584, 9722393984, 9730772608, 9739172224, 9747561088, 9755945344, 9764338816, 9772726144, 9781116544, 9789503872, 9797892992, 9806282624, 9814670464, 9823056512, 9831439232, 9839833984, 9848224384, 9856613504, 9865000576, 9873391232, 9881772416, 9890162816, 9898556288, 9906940544, 9915333248, 9923721088, 9932108672, 9940496512, 9948888448, 9957276544, 9965666176, 9974048384, 9982441088, 9990830464, 9999219584, 10007602816, 10015996544, 10024385152, 10032774016, 10041163648, 10049548928, 10057940096, 10066329472, 10074717824, 10083105152, 10091495296, 10099878784, 10108272256, 10116660608, 10125049216, 10133437312, 10141825664, 10150213504, 10158601088, 10166991232, 10175378816, 10183766144, 10192157312, 10200545408, 10208935552, 10217322112, 10225712768, 10234099328, 10242489472, 10250876032, 10259264896, 10267656064, 10276042624, 10284429184, 10292820352, 10301209472, 10309598848, 10317987712, 10326375296, 10334763392, 10343153536, 10351541632, 10359930752, 10368318592, 10376707456, 10385096576, 10393484672, 10401867136, 10410262144, 10418647424, 10427039104, 10435425664, 10443810176, 10452203648, 10460589952, 10468982144, 10477369472, 10485759104, 10494147712, 10502533504, 10510923392, 10519313536, 10527702656, 10536091264, 10544478592, 10552867712, 10561255808, 10569642368, 10578032768, 10586423168, 10594805632, 10603200128, 10611588992, 10619976064, 10628361344, 10636754048, 10645143424, 10653531776, 10661920384, 10670307968, 10678696832, 10687086464, 10695475072, 10703863168, 10712246144, 10720639616, 10729026688, 10737414784, 10745806208, 10754190976, 10762581376, 10770971264, 10779356288, 10787747456, 10796135552, 10804525184, 10812915584, 10821301888, 10829692288, 10838078336, 10846469248, 10854858368, 10863247232, 10871631488, 10880023424, 10888412032, 10896799616, 10905188992, 10913574016, 10921964672, 10930352768, 10938742912, 10947132544, 10955518592, 10963909504, 10972298368, 10980687488, 10989074816, 10997462912, 11005851776, 11014241152, 11022627712, 11031017344, 11039403904, 11047793024, 11056184704, 11064570752, 11072960896, 11081343872, 11089737856, 11098128256, 11106514816, 11114904448, 11123293568, 11131680128, 11140065152, 11148458368, 11156845696, 11165236864, 11173624192, 11182013824, 11190402688, 11198790784, 11207179136, 11215568768, 11223957376, 11232345728, 11240734592, 11249122688, 11257511296, 11265899648, 11274285952, 11282675584, 11291065472, 11299452544, 11307842432, 11316231296, 11324616832, 11333009024, 11341395584, 11349782656, 11358172288, 11366560384, 11374950016, 11383339648, 11391721856, 11400117376, 11408504192, 11416893568, 11425283456, 11433671552, 11442061184, 11450444672, 11458837888, 11467226752, 11475611776, 11484003968, 11492392064, 11500780672, 11509169024, 11517550976, 11525944448, 11534335616, 11542724224, 11551111808, 11559500672, 11567890304, 11576277376, 11584667008, 11593056128, 11601443456, 11609830016, 11618221952, 11626607488, 11634995072, 11643387776, 11651775104, 11660161664, 11668552576, 11676940928, 11685330304, 11693718656, 11702106496, 11710496128, 11718882688, 11727273088, 11735660416, 11744050048, 11752437376, 11760824704, 11769216128, 11777604736, 11785991296, 11794381952, 11802770048, 11811157888, 11819548544, 11827932544, 11836324736, 11844713344, 11853100928, 11861486464, 11869879936, 11878268032, 11886656896, 11895044992, 11903433088, 11911822976, 11920210816, 11928600448, 11936987264, 11945375872, 11953761152, 11962151296, 11970543488, 11978928512, 11987320448, 11995708288, 12004095104, 12012486272, 12020875136, 12029255552, 12037652096, 12046039168, 12054429568, 12062813824, 12071206528, 12079594624, 12087983744, 12096371072, 12104759936, 12113147264, 12121534592, 12129924992, 12138314624, 12146703232, 12155091584, 12163481216, 12171864704, 12180255872, 12188643968, 12197034112, 12205424512, 12213811328, 12222199424, 12230590336, 12238977664, 12247365248, 12255755392, 12264143488, 12272531584, 12280920448, 12289309568, 12297694592, 12306086528, 12314475392, 12322865024, 12331253632, 12339640448, 12348029312, 12356418944, 12364805248, 12373196672, 12381580928, 12389969024, 12398357632, 12406750592, 12415138432, 12423527552, 12431916416, 12440304512, 12448692352, 12457081216, 12465467776, 12473859968, 12482245504, 12490636672, 12499025536, 12507411584, 12515801728, 12524190592, 12532577152, 12540966272, 12549354368, 12557743232, 12566129536, 12574523264, 12582911872, 12591299456, 12599688064, 12608074624, 12616463488, 12624845696, 12633239936, 12641631616, 12650019968, 12658407296, 12666795136, 12675183232, 12683574656, 12691960192, 12700350592, 12708740224, 12717128576, 12725515904, 12733906816, 12742295168, 12750680192, 12759071872, 12767460736, 12775848832, 12784236928, 12792626816, 12801014656, 12809404288, 12817789312, 12826181504, 12834568832, 12842954624, 12851345792, 12859732352, 12868122496, 12876512128, 12884901248, 12893289088, 12901672832, 12910067584, 12918455168, 12926842496, 12935232896, 12943620736, 12952009856, 12960396928, 12968786816, 12977176192, 12985563776, 12993951104, 13002341504, 13010730368, 13019115392, 13027506304, 13035895168, 13044272512, 13052673152, 13061062528, 13069446272, 13077838976, 13086227072, 13094613632, 13103000192, 13111393664, 13119782528, 13128157568, 13136559232, 13144945024, 13153329536, 13161724288, 13170111872, 13178502784, 13186884736, 13195279744, 13203667072, 13212057472, 13220445824, 13228832128, 13237221248, 13245610624, 13254000512, 13262388352, 13270777472, 13279166336, 13287553408, 13295943296, 13304331904, 13312719488, 13321108096, 13329494656, 13337885824, 13346274944, 13354663808, 13363051136, 13371439232, 13379825024, 13388210816, 13396605056, 13404995456, 13413380224, 13421771392, 13430159744, 13438546048, 13446937216, 13455326848, 13463708288, 13472103808, 13480492672, 13488875648, 13497269888, 13505657728, 13514045312, 13522435712, 13530824576, 13539210112, 13547599232, 13555989376, 13564379008, 13572766336, 13581154432, 13589544832, 13597932928, 13606320512, 13614710656, 13623097472, 13631477632, 13639874944, 13648264064, 13656652928, 13665041792, 13673430656, 13681818496, 13690207616, 13698595712, 13706982272, 13715373184, 13723762048, 13732150144, 13740536704, 13748926592, 13757316224, 13765700992, 13774090112, 13782477952, 13790869376, 13799259008, 13807647872, 13816036736, 13824425344, 13832814208, 13841202304, 13849591424, 13857978752, 13866368896, 13874754688, 13883145344, 13891533184, 13899919232, 13908311168, 13916692096, 13925085056, 13933473152, 13941866368, 13950253696, 13958643584, 13967032192, 13975417216, 13983807616, 13992197504, 14000582272, 14008973696, 14017363072, 14025752192, 14034137984, 14042528384, 14050918016, 14059301504, 14067691648, 14076083584, 14084470144, 14092852352, 14101249664, 14109635968, 14118024832, 14126407552, 14134804352, 14143188608, 14151577984, 14159968384, 14168357248, 14176741504, 14185127296, 14193521024, 14201911424, 14210301824, 14218685056, 14227067264, 14235467392, 14243855488, 14252243072, 14260630144, 14269021568, 14277409408, 14285799296, 14294187904, 14302571392, 14310961792, 14319353728, 14327738752, 14336130944, 14344518784, 14352906368, 14361296512, 14369685376, 14378071424, 14386462592, 14394848128, 14403230848, 14411627392, 14420013952, 14428402304, 14436793472, 14445181568, 14453569664, 14461959808, 14470347904, 14478737024, 14487122816, 14495511424, 14503901824, 14512291712, 14520677504, 14529064832, 14537456768, 14545845632, 14554234496, 14562618496, 14571011456, 14579398784, 14587789184, 14596172672, 14604564608, 14612953984, 14621341312, 14629724288, 14638120832, 14646503296, 14654897536, 14663284864, 14671675264, 14680061056, 14688447616, 14696835968, 14705228416, 14713616768, 14722003328, 14730392192, 14738784128, 14747172736, 14755561088, 14763947648, 14772336512, 14780725376, 14789110144, 14797499776, 14805892736, 14814276992, 14822670208, 14831056256, 14839444352, 14847836032, 14856222848, 14864612992, 14872997504, 14881388672, 14889775744, 14898165376, 14906553472, 14914944896, 14923329664, 14931721856, 14940109696, 14948497024, 14956887424, 14965276544, 14973663616, 14982053248, 14990439808, 14998830976, 15007216768, 15015605888, 15023995264, 15032385152, 15040768384, 15049154944, 15057549184, 15065939072, 15074328448, 15082715008, 15091104128, 15099493504, 15107879296, 15116269184, 15124659584, 15133042304, 15141431936, 15149824384, 15158214272, 15166602368, 15174991232, 15183378304, 15191760512, 15200154496, 15208542592, 15216931712, 15225323392, 15233708416, 15242098048, 15250489216, 15258875264, 15267265408, 15275654528, 15284043136, 15292431488, 15300819584, 15309208192, 15317596544, 15325986176, 15334374784, 15342763648, 15351151744, 15359540608, 15367929728, 15376318336, 15384706432, 15393092992, 15401481856, 15409869952, 15418258816, 15426649984, 15435037568, 15443425664, 15451815296, 15460203392, 15468589184, 15476979328, 15485369216, 15493755776, 15502146944, 15510534272, 15518924416, 15527311232, 15535699072, 15544089472, 15552478336, 15560866688, 15569254528, 15577642624, 15586031488, 15594419072, 15602809472, 15611199104, 15619586432, 15627975296, 15636364928, 15644753792, 15653141888, 15661529216, 15669918848, 15678305152, 15686696576, 15695083136, 15703474048, 15711861632, 15720251264, 15728636288, 15737027456, 15745417088, 15753804928, 15762194048, 15770582656, 15778971008, 15787358336, 15795747712, 15804132224, 15812523392, 15820909696, 15829300096, 15837691264, 15846071936, 15854466944, 15862855808, 15871244672, 15879634816, 15888020608, 15896409728, 15904799104, 15913185152, 15921577088, 15929966464, 15938354816, 15946743424, 15955129472, 15963519872, 15971907968, 15980296064, 15988684928, 15997073024, 16005460864, 16013851264, 16022241152, 16030629248, 16039012736, 16047406976, 16055794816, 16064181376, 16072571264, 16080957824, 16089346688, 16097737856, 16106125184, 16114514816, 16122904192, 16131292544, 16139678848, 16148066944, 16156453504, 16164839552, 16173236096, 16181623424, 16190012032, 16198401152, 16206790528, 16215177344, 16223567744, 16231956352, 16240344704, 16248731008, 16257117824, 16265504384, 16273898624, 16282281856, 16290668672, 16299064192, 16307449216, 16315842176, 16324230016, 16332613504, 16341006464, 16349394304, 16357783168, 16366172288, 16374561664, 16382951296, 16391337856, 16399726208, 16408116352, 16416505472, 16424892032, 16433282176, 16441668224, 16450058624, 16458448768, 16466836864, 16475224448, 16483613056, 16492001408, 16500391808, 16508779648, 16517166976, 16525555328, 16533944192, 16542330752, 16550719616, 16559110528, 16567497088, 16575888512, 16584274816, 16592665472, 16601051008, 16609442944, 16617832064, 16626218624, 16634607488, 16642996096, 16651385728, 16659773824, 16668163712, 16676552576, 16684938112, 16693328768, 16701718144, 16710095488, 16718492288, 16726883968, 16735272832, 16743661184, 16752049792, 16760436608, 16768827008, 16777214336, 16785599104, 16793992832, 16802381696, 16810768768, 16819151744, 16827542656, 16835934848, 16844323712, 16852711552, 16861101952, 16869489536, 16877876864, 16886265728, 16894653056, 16903044736, 16911431296, 16919821696, 16928207488, 16936592768, 16944987776, 16953375616, 16961763968, 16970152832, 16978540928, 16986929536, 16995319168, 17003704448, 17012096896, 17020481152, 17028870784, 17037262208, 17045649536, 17054039936, 17062426496, 17070814336, 17079205504, 17087592064, 17095978112, 17104369024, 17112759424, 17121147776, 17129536384, 17137926016, 17146314368, 17154700928, 17163089792, 17171480192, 17179864192, 17188256896, 17196644992, 17205033856, 17213423488, 17221811072, 17230198912, 17238588032, 17246976896, 17255360384, 17263754624, 17272143232, 17280530048, 17288918912, 17297309312, 17305696384, 17314085504, 17322475136, 17330863744, 17339252096, 17347640192, 17356026496, 17364413824, 17372796544, 17381190016, 17389583488, 17397972608, 17406360704, 17414748544, 17423135872, 17431527296, 17439915904, 17448303232, 17456691584, 17465081728, 17473468288, 17481857408, 17490247552, 17498635904, 17507022464, 17515409024, 17523801728, 17532189824, 17540577664, 17548966016, 17557353344, 17565741184, 17574131584, 17582519168, 17590907008, 17599296128, 17607687808, 17616076672, 17624455808, 17632852352, 17641238656, 17649630848, 17658018944, 17666403968, 17674794112, 17683178368, 17691573376, 17699962496, 17708350592, 17716739968, 17725126528, 17733517184, 17741898112, 17750293888, 17758673024, 17767070336, 17775458432, 17783848832, 17792236928, 17800625536, 17809012352, 17817402752, 17825785984, 17834178944, 17842563968, 17850955648, 17859344512, 17867732864, 17876119424, 17884511872, 17892900224, 17901287296, 17909677696, 17918058112, 17926451072, 17934843776, 17943230848, 17951609216, 17960008576, 17968397696, 17976784256, 17985175424, 17993564032, 18001952128, 18010339712, 18018728576, 18027116672, 18035503232, 18043894144, 18052283264, 18060672128, 18069056384, 18077449856, 18085837184, 18094225792, 18102613376, 18111004544, 18119388544, 18127781248, 18136170368, 18144558976, 18152947328, 18161336192, 18169724288, 18178108544, 18186498944, 18194886784, 18203275648, 18211666048, 18220048768, 18228444544, 18236833408, 18245220736} // cacheSizes is a lookup table for the ethash verification cache size for the // first 2048 epochs (i.e. 61440000 blocks). var cacheSizes = [maxEpoch]uint64{ 16776896, 16907456, 17039296, 17170112, 17301056, 17432512, 17563072, 17693888, 17824192, 17955904, 18087488, 18218176, 18349504, 18481088, 18611392, 18742336, 18874304, 19004224, 19135936, 19267264, 19398208, 19529408, 19660096, 19791424, 19922752, 20053952, 20184896, 20315968, 20446912, 20576576, 20709184, 20840384, 20971072, 21102272, 21233216, 21364544, 21494848, 21626816, 21757376, 21887552, 22019392, 22151104, 22281536, 22412224, 22543936, 22675264, 22806464, 22935872, 23068096, 23198272, 23330752, 23459008, 23592512, 23723968, 23854912, 23986112, 24116672, 24247616, 24378688, 24509504, 24640832, 24772544, 24903488, 25034432, 25165376, 25296704, 25427392, 25558592, 25690048, 25820096, 25951936, 26081728, 26214208, 26345024, 26476096, 26606656, 26737472, 26869184, 26998208, 27131584, 27262528, 27393728, 27523904, 27655744, 27786688, 27917888, 28049344, 28179904, 28311488, 28441792, 28573504, 28700864, 28835648, 28966208, 29096768, 29228608, 29359808, 29490752, 29621824, 29752256, 29882816, 30014912, 30144448, 30273728, 30406976, 30538432, 30670784, 30799936, 30932672, 31063744, 31195072, 31325248, 31456192, 31588288, 31719232, 31850432, 31981504, 32110784, 32243392, 32372672, 32505664, 32636608, 32767808, 32897344, 33029824, 33160768, 33289664, 33423296, 33554368, 33683648, 33816512, 33947456, 34076992, 34208704, 34340032, 34471744, 34600256, 34734016, 34864576, 34993984, 35127104, 35258176, 35386688, 35518528, 35650624, 35782336, 35910976, 36044608, 36175808, 36305728, 36436672, 36568384, 36699968, 36830656, 36961984, 37093312, 37223488, 37355072, 37486528, 37617472, 37747904, 37879232, 38009792, 38141888, 38272448, 38403392, 38535104, 38660672, 38795584, 38925632, 39059264, 39190336, 39320768, 39452096, 39581632, 39713984, 39844928, 39974848, 40107968, 40238144, 40367168, 40500032, 40631744, 40762816, 40894144, 41023552, 41155904, 41286208, 41418304, 41547712, 41680448, 41811904, 41942848, 42073792, 42204992, 42334912, 42467008, 42597824, 42729152, 42860096, 42991552, 43122368, 43253696, 43382848, 43515712, 43646912, 43777088, 43907648, 44039104, 44170432, 44302144, 44433344, 44564288, 44694976, 44825152, 44956864, 45088448, 45219008, 45350464, 45481024, 45612608, 45744064, 45874496, 46006208, 46136768, 46267712, 46399424, 46529344, 46660672, 46791488, 46923328, 47053504, 47185856, 47316928, 47447872, 47579072, 47710144, 47839936, 47971648, 48103232, 48234176, 48365248, 48496192, 48627136, 48757312, 48889664, 49020736, 49149248, 49283008, 49413824, 49545152, 49675712, 49807168, 49938368, 50069056, 50200256, 50331584, 50462656, 50593472, 50724032, 50853952, 50986048, 51117632, 51248576, 51379904, 51510848, 51641792, 51773248, 51903296, 52035136, 52164032, 52297664, 52427968, 52557376, 52690112, 52821952, 52952896, 53081536, 53213504, 53344576, 53475776, 53608384, 53738816, 53870528, 54000832, 54131776, 54263744, 54394688, 54525248, 54655936, 54787904, 54918592, 55049152, 55181248, 55312064, 55442752, 55574336, 55705024, 55836224, 55967168, 56097856, 56228672, 56358592, 56490176, 56621888, 56753728, 56884928, 57015488, 57146816, 57278272, 57409216, 57540416, 57671104, 57802432, 57933632, 58064576, 58195264, 58326976, 58457408, 58588864, 58720192, 58849984, 58981696, 59113024, 59243456, 59375552, 59506624, 59637568, 59768512, 59897792, 60030016, 60161984, 60293056, 60423872, 60554432, 60683968, 60817216, 60948032, 61079488, 61209664, 61341376, 61471936, 61602752, 61733696, 61865792, 61996736, 62127808, 62259136, 62389568, 62520512, 62651584, 62781632, 62910784, 63045056, 63176128, 63307072, 63438656, 63569216, 63700928, 63831616, 63960896, 64093888, 64225088, 64355392, 64486976, 64617664, 64748608, 64879424, 65009216, 65142464, 65273792, 65402816, 65535424, 65666752, 65797696, 65927744, 66060224, 66191296, 66321344, 66453056, 66584384, 66715328, 66846656, 66977728, 67108672, 67239104, 67370432, 67501888, 67631296, 67763776, 67895104, 68026304, 68157248, 68287936, 68419264, 68548288, 68681408, 68811968, 68942912, 69074624, 69205568, 69337024, 69467584, 69599168, 69729472, 69861184, 69989824, 70122944, 70253888, 70385344, 70515904, 70647232, 70778816, 70907968, 71040832, 71171648, 71303104, 71432512, 71564992, 71695168, 71826368, 71958464, 72089536, 72219712, 72350144, 72482624, 72613568, 72744512, 72875584, 73006144, 73138112, 73268672, 73400128, 73530944, 73662272, 73793344, 73924544, 74055104, 74185792, 74316992, 74448832, 74579392, 74710976, 74841664, 74972864, 75102784, 75233344, 75364544, 75497024, 75627584, 75759296, 75890624, 76021696, 76152256, 76283072, 76414144, 76545856, 76676672, 76806976, 76937792, 77070016, 77200832, 77331392, 77462464, 77593664, 77725376, 77856448, 77987776, 78118336, 78249664, 78380992, 78511424, 78642496, 78773056, 78905152, 79033664, 79166656, 79297472, 79429568, 79560512, 79690816, 79822784, 79953472, 80084672, 80214208, 80346944, 80477632, 80608576, 80740288, 80870848, 81002048, 81133504, 81264448, 81395648, 81525952, 81657536, 81786304, 81919808, 82050112, 82181312, 82311616, 82443968, 82573376, 82705984, 82835776, 82967744, 83096768, 83230528, 83359552, 83491264, 83622464, 83753536, 83886016, 84015296, 84147776, 84277184, 84409792, 84540608, 84672064, 84803008, 84934336, 85065152, 85193792, 85326784, 85458496, 85589312, 85721024, 85851968, 85982656, 86112448, 86244416, 86370112, 86506688, 86637632, 86769344, 86900672, 87031744, 87162304, 87293632, 87424576, 87555392, 87687104, 87816896, 87947968, 88079168, 88211264, 88341824, 88473152, 88603712, 88735424, 88862912, 88996672, 89128384, 89259712, 89390272, 89521984, 89652544, 89783872, 89914816, 90045376, 90177088, 90307904, 90438848, 90569152, 90700096, 90832832, 90963776, 91093696, 91223744, 91356992, 91486784, 91618496, 91749824, 91880384, 92012224, 92143552, 92273344, 92405696, 92536768, 92666432, 92798912, 92926016, 93060544, 93192128, 93322816, 93453632, 93583936, 93715136, 93845056, 93977792, 94109504, 94240448, 94371776, 94501184, 94632896, 94764224, 94895552, 95023424, 95158208, 95287744, 95420224, 95550016, 95681216, 95811904, 95943872, 96075328, 96203584, 96337856, 96468544, 96599744, 96731072, 96860992, 96992576, 97124288, 97254848, 97385536, 97517248, 97647808, 97779392, 97910464, 98041408, 98172608, 98303168, 98434496, 98565568, 98696768, 98827328, 98958784, 99089728, 99220928, 99352384, 99482816, 99614272, 99745472, 99876416, 100007104, 100138048, 100267072, 100401088, 100529984, 100662592, 100791872, 100925248, 101056064, 101187392, 101317952, 101449408, 101580608, 101711296, 101841728, 101973824, 102104896, 102235712, 102366016, 102498112, 102628672, 102760384, 102890432, 103021888, 103153472, 103284032, 103415744, 103545152, 103677248, 103808576, 103939648, 104070976, 104201792, 104332736, 104462528, 104594752, 104725952, 104854592, 104988608, 105118912, 105247808, 105381184, 105511232, 105643072, 105774784, 105903296, 106037056, 106167872, 106298944, 106429504, 106561472, 106691392, 106822592, 106954304, 107085376, 107216576, 107346368, 107478464, 107609792, 107739712, 107872192, 108003136, 108131392, 108265408, 108396224, 108527168, 108657344, 108789568, 108920384, 109049792, 109182272, 109312576, 109444928, 109572928, 109706944, 109837888, 109969088, 110099648, 110230976, 110362432, 110492992, 110624704, 110755264, 110886208, 111017408, 111148864, 111279296, 111410752, 111541952, 111673024, 111803456, 111933632, 112066496, 112196416, 112328512, 112457792, 112590784, 112715968, 112852672, 112983616, 113114944, 113244224, 113376448, 113505472, 113639104, 113770304, 113901376, 114031552, 114163264, 114294592, 114425536, 114556864, 114687424, 114818624, 114948544, 115080512, 115212224, 115343296, 115473472, 115605184, 115736128, 115867072, 115997248, 116128576, 116260288, 116391488, 116522944, 116652992, 116784704, 116915648, 117046208, 117178304, 117308608, 117440192, 117569728, 117701824, 117833024, 117964096, 118094656, 118225984, 118357312, 118489024, 118617536, 118749632, 118882112, 119012416, 119144384, 119275328, 119406016, 119537344, 119668672, 119798464, 119928896, 120061376, 120192832, 120321728, 120454336, 120584512, 120716608, 120848192, 120979136, 121109056, 121241408, 121372352, 121502912, 121634752, 121764416, 121895744, 122027072, 122157632, 122289088, 122421184, 122550592, 122682944, 122813888, 122945344, 123075776, 123207488, 123338048, 123468736, 123600704, 123731264, 123861952, 123993664, 124124608, 124256192, 124386368, 124518208, 124649024, 124778048, 124911296, 125041088, 125173696, 125303744, 125432896, 125566912, 125696576, 125829056, 125958592, 126090304, 126221248, 126352832, 126483776, 126615232, 126746432, 126876608, 127008704, 127139392, 127270336, 127401152, 127532224, 127663552, 127794752, 127925696, 128055232, 128188096, 128319424, 128449856, 128581312, 128712256, 128843584, 128973632, 129103808, 129236288, 129365696, 129498944, 129629888, 129760832, 129892288, 130023104, 130154048, 130283968, 130416448, 130547008, 130678336, 130807616, 130939456, 131071552, 131202112, 131331776, 131464384, 131594048, 131727296, 131858368, 131987392, 132120256, 132250816, 132382528, 132513728, 132644672, 132774976, 132905792, 133038016, 133168832, 133299392, 133429312, 133562048, 133692992, 133823296, 133954624, 134086336, 134217152, 134348608, 134479808, 134607296, 134741056, 134872384, 135002944, 135134144, 135265472, 135396544, 135527872, 135659072, 135787712, 135921472, 136052416, 136182848, 136313792, 136444864, 136576448, 136707904, 136837952, 136970048, 137099584, 137232064, 137363392, 137494208, 137625536, 137755712, 137887424, 138018368, 138149824, 138280256, 138411584, 138539584, 138672832, 138804928, 138936128, 139066688, 139196864, 139328704, 139460032, 139590208, 139721024, 139852864, 139984576, 140115776, 140245696, 140376512, 140508352, 140640064, 140769856, 140902336, 141032768, 141162688, 141294016, 141426496, 141556544, 141687488, 141819584, 141949888, 142080448, 142212544, 142342336, 142474432, 142606144, 142736192, 142868288, 142997824, 143129408, 143258944, 143392448, 143523136, 143653696, 143785024, 143916992, 144045632, 144177856, 144309184, 144440768, 144570688, 144701888, 144832448, 144965056, 145096384, 145227584, 145358656, 145489856, 145620928, 145751488, 145883072, 146011456, 146144704, 146275264, 146407232, 146538176, 146668736, 146800448, 146931392, 147062336, 147193664, 147324224, 147455936, 147586624, 147717056, 147848768, 147979456, 148110784, 148242368, 148373312, 148503232, 148635584, 148766144, 148897088, 149028416, 149159488, 149290688, 149420224, 149551552, 149683136, 149814976, 149943616, 150076352, 150208064, 150338624, 150470464, 150600256, 150732224, 150862784, 150993088, 151125952, 151254976, 151388096, 151519168, 151649728, 151778752, 151911104, 152042944, 152174144, 152304704, 152435648, 152567488, 152698816, 152828992, 152960576, 153091648, 153222976, 153353792, 153484096, 153616192, 153747008, 153878336, 154008256, 154139968, 154270912, 154402624, 154533824, 154663616, 154795712, 154926272, 155057984, 155188928, 155319872, 155450816, 155580608, 155712064, 155843392, 155971136, 156106688, 156237376, 156367424, 156499264, 156630976, 156761536, 156892352, 157024064, 157155008, 157284416, 157415872, 157545536, 157677248, 157810496, 157938112, 158071744, 158203328, 158334656, 158464832, 158596288, 158727616, 158858048, 158988992, 159121216, 159252416, 159381568, 159513152, 159645632, 159776192, 159906496, 160038464, 160169536, 160300352, 160430656, 160563008, 160693952, 160822208, 160956352, 161086784, 161217344, 161349184, 161480512, 161611456, 161742272, 161873216, 162002752, 162135872, 162266432, 162397888, 162529216, 162660032, 162790976, 162922048, 163052096, 163184576, 163314752, 163446592, 163577408, 163707968, 163839296, 163969984, 164100928, 164233024, 164364224, 164494912, 164625856, 164756672, 164887616, 165019072, 165150016, 165280064, 165412672, 165543104, 165674944, 165805888, 165936832, 166067648, 166198336, 166330048, 166461248, 166591552, 166722496, 166854208, 166985408, 167116736, 167246656, 167378368, 167508416, 167641024, 167771584, 167903168, 168034112, 168164032, 168295744, 168427456, 168557632, 168688448, 168819136, 168951616, 169082176, 169213504, 169344832, 169475648, 169605952, 169738048, 169866304, 169999552, 170131264, 170262464, 170393536, 170524352, 170655424, 170782016, 170917696, 171048896, 171179072, 171310784, 171439936, 171573184, 171702976, 171835072, 171966272, 172097216, 172228288, 172359232, 172489664, 172621376, 172747712, 172883264, 173014208, 173144512, 173275072, 173407424, 173539136, 173669696, 173800768, 173931712, 174063424, 174193472, 174325696, 174455744, 174586816, 174718912, 174849728, 174977728, 175109696, 175242688, 175374272, 175504832, 175636288, 175765696, 175898432, 176028992, 176159936, 176291264, 176422592, 176552512, 176684864, 176815424, 176946496, 177076544, 177209152, 177340096, 177470528, 177600704, 177731648, 177864256, 177994816, 178126528, 178257472, 178387648, 178518464, 178650176, 178781888, 178912064, 179044288, 179174848, 179305024, 179436736, 179568448, 179698496, 179830208, 179960512, 180092608, 180223808, 180354752, 180485696, 180617152, 180748096, 180877504, 181009984, 181139264, 181272512, 181402688, 181532608, 181663168, 181795136, 181926592, 182057536, 182190016, 182320192, 182451904, 182582336, 182713792, 182843072, 182976064, 183107264, 183237056, 183368384, 183494848, 183631424, 183762752, 183893824, 184024768, 184154816, 184286656, 184417984, 184548928, 184680128, 184810816, 184941248, 185072704, 185203904, 185335616, 185465408, 185596352, 185727296, 185859904, 185989696, 186121664, 186252992, 186383552, 186514112, 186645952, 186777152, 186907328, 187037504, 187170112, 187301824, 187429184, 187562048, 187693504, 187825472, 187957184, 188087104, 188218304, 188349376, 188481344, 188609728, 188743616, 188874304, 189005248, 189136448, 189265088, 189396544, 189528128, 189660992, 189791936, 189923264, 190054208, 190182848, 190315072, 190447424, 190577984, 190709312, 190840768, 190971328, 191102656, 191233472, 191364032, 191495872, 191626816, 191758016, 191888192, 192020288, 192148928, 192282176, 192413504, 192542528, 192674752, 192805952, 192937792, 193068608, 193198912, 193330496, 193462208, 193592384, 193723456, 193854272, 193985984, 194116672, 194247232, 194379712, 194508352, 194641856, 194772544, 194900672, 195035072, 195166016, 195296704, 195428032, 195558592, 195690304, 195818176, 195952576, 196083392, 196214336, 196345792, 196476736, 196607552, 196739008, 196869952, 197000768, 197130688, 197262784, 197394368, 197523904, 197656384, 197787584, 197916608, 198049472, 198180544, 198310208, 198442432, 198573632, 198705088, 198834368, 198967232, 199097792, 199228352, 199360192, 199491392, 199621696, 199751744, 199883968, 200014016, 200146624, 200276672, 200408128, 200540096, 200671168, 200801984, 200933312, 201062464, 201194944, 201326144, 201457472, 201588544, 201719744, 201850816, 201981632, 202111552, 202244032, 202374464, 202505152, 202636352, 202767808, 202898368, 203030336, 203159872, 203292608, 203423296, 203553472, 203685824, 203816896, 203947712, 204078272, 204208192, 204341056, 204472256, 204603328, 204733888, 204864448, 204996544, 205125568, 205258304, 205388864, 205517632, 205650112, 205782208, 205913536, 206044736, 206176192, 206307008, 206434496, 206569024, 206700224, 206831168, 206961856, 207093056, 207223616, 207355328, 207486784, 207616832, 207749056, 207879104, 208010048, 208141888, 208273216, 208404032, 208534336, 208666048, 208796864, 208927424, 209059264, 209189824, 209321792, 209451584, 209582656, 209715136, 209845568, 209976896, 210106432, 210239296, 210370112, 210501568, 210630976, 210763712, 210894272, 211024832, 211156672, 211287616, 211418176, 211549376, 211679296, 211812032, 211942592, 212074432, 212204864, 212334016, 212467648, 212597824, 212727616, 212860352, 212991424, 213120832, 213253952, 213385024, 213515584, 213645632, 213777728, 213909184, 214040128, 214170688, 214302656, 214433728, 214564544, 214695232, 214826048, 214956992, 215089088, 215219776, 215350592, 215482304, 215613248, 215743552, 215874752, 216005312, 216137024, 216267328, 216399296, 216530752, 216661696, 216790592, 216923968, 217054528, 217183168, 217316672, 217448128, 217579072, 217709504, 217838912, 217972672, 218102848, 218233024, 218364736, 218496832, 218627776, 218759104, 218888896, 219021248, 219151936, 219281728, 219413056, 219545024, 219675968, 219807296, 219938624, 220069312, 220200128, 220331456, 220461632, 220592704, 220725184, 220855744, 220987072, 221117888, 221249216, 221378368, 221510336, 221642048, 221772736, 221904832, 222031808, 222166976, 222297536, 222428992, 222559936, 222690368, 222820672, 222953152, 223083968, 223213376, 223345984, 223476928, 223608512, 223738688, 223869376, 224001472, 224132672, 224262848, 224394944, 224524864, 224657344, 224788288, 224919488, 225050432, 225181504, 225312704, 225443776, 225574592, 225704768, 225834176, 225966784, 226097216, 226229824, 226360384, 226491712, 226623424, 226754368, 226885312, 227015104, 227147456, 227278528, 227409472, 227539904, 227669696, 227802944, 227932352, 228065216, 228196288, 228326464, 228457792, 228588736, 228720064, 228850112, 228981056, 229113152, 229243328, 229375936, 229505344, 229636928, 229769152, 229894976, 230030272, 230162368, 230292416, 230424512, 230553152, 230684864, 230816704, 230948416, 231079616, 231210944, 231342016, 231472448, 231603776, 231733952, 231866176, 231996736, 232127296, 232259392, 232388672, 232521664, 232652608, 232782272, 232914496, 233043904, 233175616, 233306816, 233438528, 233569984, 233699776, 233830592, 233962688, 234092224, 234221888, 234353984, 234485312, 234618304, 234749888, 234880832, 235011776, 235142464, 235274048, 235403456, 235535936, 235667392, 235797568, 235928768, 236057152, 236190272, 236322752, 236453312, 236583616, 236715712, 236846528, 236976448, 237108544, 237239104, 237371072, 237501632, 237630784, 237764416, 237895232, 238026688, 238157632, 238286912, 238419392, 238548032, 238681024, 238812608, 238941632, 239075008, 239206336, 239335232, 239466944, 239599168, 239730496, 239861312, 239992384, 240122816, 240254656, 240385856, 240516928, 240647872, 240779072, 240909632, 241040704, 241171904, 241302848, 241433408, 241565248, 241696192, 241825984, 241958848, 242088256, 242220224, 242352064, 242481856, 242611648, 242744896, 242876224, 243005632, 243138496, 243268672, 243400384, 243531712, 243662656, 243793856, 243924544, 244054592, 244187072, 244316608, 244448704, 244580032, 244710976, 244841536, 244972864, 245104448, 245233984, 245365312, 245497792, 245628736, 245759936, 245889856, 246021056, 246152512, 246284224, 246415168, 246545344, 246675904, 246808384, 246939584, 247070144, 247199552, 247331648, 247463872, 247593536, 247726016, 247857088, 247987648, 248116928, 248249536, 248380736, 248512064, 248643008, 248773312, 248901056, 249036608, 249167552, 249298624, 249429184, 249560512, 249692096, 249822784, 249954112, 250085312, 250215488, 250345792, 250478528, 250608704, 250739264, 250870976, 251002816, 251133632, 251263552, 251395136, 251523904, 251657792, 251789248, 251919424, 252051392, 252182464, 252313408, 252444224, 252575552, 252706624, 252836032, 252968512, 253099712, 253227584, 253361728, 253493056, 253623488, 253754432, 253885504, 254017216, 254148032, 254279488, 254410432, 254541376, 254672576, 254803264, 254933824, 255065792, 255196736, 255326528, 255458752, 255589952, 255721408, 255851072, 255983296, 256114624, 256244416, 256374208, 256507712, 256636096, 256768832, 256900544, 257031616, 257162176, 257294272, 257424448, 257555776, 257686976, 257818432, 257949632, 258079552, 258211136, 258342464, 258473408, 258603712, 258734656, 258867008, 258996544, 259127744, 259260224, 259391296, 259522112, 259651904, 259784384, 259915328, 260045888, 260175424, 260308544, 260438336, 260570944, 260700992, 260832448, 260963776, 261092672, 261226304, 261356864, 261487936, 261619648, 261750592, 261879872, 262011968, 262143424, 262274752, 262404416, 262537024, 262667968, 262799296, 262928704, 263061184, 263191744, 263322944, 263454656, 263585216, 263716672, 263847872, 263978944, 264108608, 264241088, 264371648, 264501184, 264632768, 264764096, 264895936, 265024576, 265158464, 265287488, 265418432, 265550528, 265681216, 265813312, 265943488, 266075968, 266206144, 266337728, 266468032, 266600384, 266731072, 266862272, 266993344, 267124288, 267255616, 267386432, 267516992, 267648704, 267777728, 267910592, 268040512, 268172096, 268302784, 268435264, 268566208, 268696256, 268828096, 268959296, 269090368, 269221312, 269352256, 269482688, 269614784, 269745856, 269876416, 270007616, 270139328, 270270272, 270401216, 270531904, 270663616, 270791744, 270924736, 271056832, 271186112, 271317184, 271449536, 271580992, 271711936, 271843136, 271973056, 272105408, 272236352, 272367296, 272498368, 272629568, 272759488, 272891456, 273022784, 273153856, 273284672, 273415616, 273547072, 273677632, 273808448, 273937088, 274071488, 274200896, 274332992, 274463296, 274595392, 274726208, 274857536, 274988992, 275118656, 275250496, 275382208, 275513024, 275643968, 275775296, 275906368, 276037184, 276167872, 276297664, 276429376, 276560576, 276692672, 276822976, 276955072, 277085632, 277216832, 277347008, 277478848, 277609664, 277740992, 277868608, 278002624, 278134336, 278265536, 278395328, 278526784, 278657728, 278789824, 278921152, 279052096, 279182912, 279313088, 279443776, 279576256, 279706048, 279838528, 279969728, 280099648, 280230976, 280361408, 280493632, 280622528, 280755392, 280887104, 281018176, 281147968, 281278912, 281411392, 281542592, 281673152, 281803712, 281935552, 282066496, 282197312, 282329024, 282458816, 282590272, 282720832, 282853184, 282983744, 283115072, 283246144, 283377344, 283508416, 283639744, 283770304, 283901504, 284032576, 284163136, 284294848, 284426176, 284556992, 284687296, 284819264, 284950208, 285081536} ================================================ FILE: consensus/ethash/algorithm_test.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package ethash import ( "bytes" "encoding/binary" "io/ioutil" "math/big" "os" "reflect" "sync" "testing" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/common/hexutil" "github.com/sero-cash/go-sero/core/types" ) // prepare converts an ethash cache or dataset from a byte stream into the internal // int representation. All ethash methods work with ints to avoid constant byte to // int conversions as well as to handle both little and big endian systems. func prepare(dest []uint32, src []byte) { for i := 0; i < len(dest); i++ { dest[i] = binary.LittleEndian.Uint32(src[i*4:]) } } // Tests whether the dataset size calculator works correctly by cross checking the // hard coded lookup table with the value generated by it. func TestSizeCalculations(t *testing.T) { // Verify all the cache and dataset sizes from the lookup table. for epoch, want := range cacheSizes { if size := calcCacheSize(epoch); size != want { t.Errorf("cache %d: cache size mismatch: have %d, want %d", epoch, size, want) } } for epoch, want := range datasetSizes { if size := calcDatasetSize(epoch); size != want { t.Errorf("dataset %d: dataset size mismatch: have %d, want %d", epoch, size, want) } } } // Tests that verification caches can be correctly generated. func TestCacheGeneration(t *testing.T) { tests := []struct { size uint64 epoch uint64 cache []byte }{ { size: 1024, epoch: 0, cache: hexutil.MustDecode("0x" + "7ce2991c951f7bf4c4c1bb119887ee07871eb5339d7b97b8588e85c742de90e5bafd5bbe6ce93a134fb6be9ad3e30db99d9528a2ea7846833f52e9ca119b6b54" + "8979480c46e19972bd0738779c932c1b43e665a2fd3122fc3ddb2691f353ceb0ed3e38b8f51fd55b6940290743563c9f8fa8822e611924657501a12aafab8a8d" + "88fb5fbae3a99d14792406672e783a06940a42799b1c38bc28715db6d37cb11f9f6b24e386dc52dd8c286bd8c36fa813dffe4448a9f56ebcbeea866b42f68d22" + "6c32aae4d695a23cab28fd74af53b0c2efcc180ceaaccc0b2e280103d097a03c1d1b0f0f26ce5f32a90238f9bc49f645db001ef9cd3d13d44743f841fad11a37" + "fa290c62c16042f703578921f30b9951465aae2af4a5dad43a7341d7b4a62750954965a47a1c3af638dc3495c4d62a9bab843168c9fc0114e79cffd1b2827b01" + "75d30ba054658f214e946cf24c43b40d3383fbb0493408e5c5392434ca21bbcf43200dfb876c713d201813934fa485f48767c5915745cf0986b1dc0f33e57748" + "bf483ee2aff4248dfe461ec0504a13628401020fc22638584a8f2f5206a13b2f233898c78359b21c8226024d0a7a93df5eb6c282bdbf005a4aab497e096f2847" + "76c71cee57932a8fb89f6d6b8743b60a4ea374899a94a2e0f218d5c55818cefb1790c8529a76dba31ebb0f4592d709b49587d2317970d39c086f18dd244291d9" + "eedb16705e53e3350591bd4ff4566a3595ac0f0ce24b5e112a3d033bc51b6fea0a92296dea7f5e20bf6ee6bc347d868fda193c395b9bb147e55e5a9f67cfe741" + "7eea7d699b155bd13804204df7ea91fa9249e4474dddf35188f77019c67d201e4c10d7079c5ad492a71afff9a23ca7e900ba7d1bdeaf3270514d8eb35eab8a0a" + "718bb7273aeb37768fa589ed8ab01fbf4027f4ebdbbae128d21e485f061c20183a9bc2e31edbda0727442e9d58eb0fe198440fe199e02e77c0f7b99973f1f74c" + "c9089a51ab96c94a84d66e6aa48b2d0a4543adb5a789039a2aa7b335ca85c91026c7d3c894da53ae364188c3fd92f78e01d080399884a47385aa792e38150cda" + "a8620b2ebeca41fbc773bb837b5e724d6eb2de570d99858df0d7d97067fb8103b21757873b735097b35d3bea8fd1c359a9e8a63c1540c76c9784cf8d975e995c" + "778401b94a2e66e6993ad67ad3ecdc2acb17779f1ea8606827ec92b11c728f8c3b6d3f04a3e6ed05ff81dd76d5dc5695a50377bc135aaf1671cf68b750315493" + "6c64510164d53312bf3c41740c7a237b05faf4a191bd8a95dafa068dbcf370255c725900ce5c934f36feadcfe55b687c440574c1f06f39d207a8553d39156a24" + "845f64fd8324bb85312979dead74f764c9677aab89801ad4f927f1c00f12e28f22422bb44200d1969d9ab377dd6b099dc6dbc3222e9321b2c1e84f8e2f07731c"), }, { size: 1024, epoch: 1, cache: hexutil.MustDecode("0x" + "1f56855d59cc5a085720899b4377a0198f1abe948d85fe5820dc0e346b7c0931b9cde8e541d751de3b2b3275d0aabfae316209d5879297d8bd99f8a033c9d4df" + "35add1029f4e6404a022d504fb8023e42989aba985a65933b0109c7218854356f9284983c9e7de97de591828ae348b63d1fc78d8db58157344d4e06530ffd422" + "5c7f6080d451ff94961ec2dd9e28e6d81b49102451676dbdcb6ef1094c1e8b29e7e808d47b2ba5aeb52dabf00d5f0ee08c116289cbf56d8132e5ca557c3d6220" + "5ba3a48539acabfd4ca3c89e3aaa668e24ffeaeb9eb0136a9fc5a8a676b6d5ad76175eeda0a1fa44b5ff5591079e4b7f581569b6c82416adcb82d7e92980df67" + "2248c4024013e7be52cf91a82491627d9e6d80eda2770ab82badc5e120cd33a4c84495f718b57396a8f397e797087fad81fa50f0e2f5da71e40816a85de35a96" + "3cd351364905c45b3116ff25851d43a2ca1d2aa5cdb408440dabef8c57778fc18608bf431d0c7ffd37649a21a7bb9d90def39c821669dbaf165c0262434dfb08" + "5d057a12de4a7a59fd2dfc931c29c20371abf748b69b618a9bd485b3fb3166cad4d3d27edf0197aabeceb28b96670bdf020f26d1bb9b564aaf82d866bdffd6d4" + "1aea89e20b15a5d1264ab01d1556bfc2a266081609d60928216bd9646038f07de9fedcc9f2b86ab1b07d7bd88ba1df08b3d89b2ac789001b48a723f217debcb7" + "090303a3ef50c1d5d99a75c640ec2b401ab149e06511753d8c49cafdde2929ae61e09cc0f0319d262869d21ead9e0cf5ff2de3dbedfb994f32432d2e4aa44c82" + "7c42781d1477fe03ea0772998e776d63363c6c3edd2d52c89b4d2c9d89cdd90fa33b2b41c8e3f78ef06fe90bcf5cc5756d33a032f16b744141aaa8852bb4cb3a" + "40792b93489c6d6e56c235ec4aa36c263e9b766a4daaff34b2ea709f9f811aef498a65bfbc1deffd36fcc4d1a123345fac7bf57a1fb50394843cd28976a6c7ff" + "fe70f7b8d8f384aa06e2c9964c92a8788cef397fffdd35181b42a35d5d98cd7244bbd09e802888d7efc0311ae58e0961e3656205df4bdc553f317df4b6ede4ca" + "846294a32aec830ab1aa5aac4e78b821c35c70fd752fec353e373bf9be656e775a0111bcbeffdfebd3bd5251d27b9f6971aa561a2bd27a99d61b2ce3965c3726" + "1e114353e6a31b09340f4078b8a8c6ce6ff4213067a8f21020f78aff4f8b472b701ef730aacb8ce7806ea31b14abe8f8efdd6357ca299d339abc4e43ba324ad1" + "efe6eb1a5a6e137daa6ec9f6be30931ca368a944cfcf2a0a29f9a9664188f0466e6f078c347f9fe26a9a89d2029462b19245f24ace47aecace6ef85a4e96b31b" + "5f470eb0165c6375eb8f245d50a25d521d1e569e3b2dccce626752bb26eae624a24511e831a81fab6898a791579f462574ca4851e6588116493dbccc3072e0c5"), }, } for i, tt := range tests { cache := make([]uint32, tt.size/4) generateCache(cache, tt.epoch, seedHash(tt.epoch*epochLength+1)) want := make([]uint32, tt.size/4) prepare(want, tt.cache) if !reflect.DeepEqual(cache, want) { t.Errorf("cache %d: content mismatch: have %x, want %x", i, cache, want) } } } func TestDatasetGeneration(t *testing.T) { tests := []struct { epoch uint64 cacheSize uint64 datasetSize uint64 dataset []byte }{ { epoch: 0, cacheSize: 1024, datasetSize: 32 * 1024, dataset: hexutil.MustDecode("0x" + "4bc09fbd530a041dd2ec296110a29e8f130f179c59d223f51ecce3126e8b0c74326abc2f32ccd9d7f976bd0944e3ccf8479db39343cbbffa467046ca97e2da63" + "da5f9d9688c7c33ab7b8aace570e422fa48b24659b72fc534669209d66389ca15b099c5604601e7581488e3bd6925cec0f12d465f8004d4fa84793f8e1e46a1b" + "31b7298991c6142f4f0b6e6b296728ae5fa63ccb667b61fbb1b078003d18d97b906af157debed5e6c55d5a61cae90c85f9e97d565314a2f9fd9e0c08430547d0" + "7cfcee3271f921b95c32a11596219abaa30abc62c2c72c6725078c436c677320594df6bcb92134c1b114fffec982a1f68f13a9f812f074b9fb9c78f2cd4c1c90" + "7ebf1e447f7a422b06303921e3d54f430584d849eaa4b7d652e92a5d659bdfc462adcdd7991e8c66a19da4ddb5390463d073941491859397f135ebbbdbdf5801" + "cafb873c383893390141ae385515504d74a33608273310c312ba468046d2e20c271a38cc0e3920b39705050e752f34f244fc23ddd17ff18677756a87671d4145" + "3aebf97e4890da1d645f41eb20da92a8537c787ce419580073c46aa3bb154952993142ec5b4fb6e8f108fd15fc618cd5c27b45a37ee6dcd52a4ce656c0f58604" + "717ec55f5e592355f1f20e8316f8fd77243734a8b0f50ad93c1d95b5b0482afb22cd0667d935bd6053d7198b54974e10d100df7ca3ec2e0bb5ccce5807b266e0" + "8429d5fec2ae6ae1cc7c5efc27f19c89d4b4a6c5c0b9397886dac635ba37446ff528b582457a4fe7f803f1a47903574f8982d4a679b627396a4e97aaa12fa179" + "0d31ba52e9010bc3c26ace81f702f86649fe9eeda9ec03b74a8a5cf540d82e22af33ab893564397dfc4edd8b1677350df5b82ab61d24db95f58fd2d78afb49c7" + "2d2b1fefa8ff6606b8623829cc752ea37d663b945f3f1d48ad07b1416af252f81b55acd8f164da4faa9d9453721b3b795041ce7df7c77edc13865dbe04fee331" + "47daebe18c183c4a6594a6df3a4d2dc5e3811d805102c9c49286e3d12b38927fa49a7b0cdcb1d799f57118953e31c560aae213a1799d59a78ae68f0590347061" + "fc2668caf08f860452f6b7d3ebc1efecc2e1227d33296b1f1850360dee7236e85274eaede4d18a58b4261ce1f6a7d283dcf64e6d021813f82a566354445327e5" + "6217279b2393fe5aa0f9eb149d4866e1105106bcc221810ceaf053f2ec733d8a22f409c1baf955e50184005c5d55de907de97f5f713b62ae10937e1a7af6267b" + "d2a239e8589017197c343b81540bc26bc52bffd5336fb1da1202a511c7175014d2f500b9d9ce78e4b9f2b158d0fb27af352b6f78c129cad642fe909612c9d658" + "17a8d7f9195ee97201675a918e3cf520fdc19f92b7e6a3db806d4f3799361334082cc58a22ddb4e4f5760bd1667c177b26be325166c6bbed669a158fc87acd43" + "a2462e12578d72db6606f9e24ae659ff411ac9b31d696b8354fd08a591622967a14f8468eaaae3907b7818154ba2d6e4581589354d178bb6ae1c03651c44bbf0" + "e7fa52cb0da09508b5a444aed05a54f416841247a4fe36bd5529029e3adf78b105e22468ed775f4d0954504dd55f2c9b9e6b3a086370b2c0b6fec7efd6914e07" + "26627edb7a04869a874e31f448271077a7de3031cf81bdbc39848efee6075e0d65fa3a32640e9f0395cf7ec12139992aff0a54e0a7dfe5048b3cc03246b56f7d" + "3093538a7b87538d8792a665bc589373621b2f3cf47d2c1f8f580fe34d79c6b2a66323ce89808ce0e5cf77700f5a4446c4be01a310e8f7c7ebefe756b0044886" + "a0477c88ee8ea8c71503748a4cf9eb40ad5c1c8accf7c63c0f43a94ed2b8a5999df3ab9b11b80de73310e036ca88668e640015fcf9cd18eed05517d54896f43e" + "25e7931b44872c4e4183500e0e8c5103292bca1c0d6b0b00c9acce25d31204bb3e4f255c03a0a0916664e9c831b28b364078109a74411a11afb1e610c7d1c9d4" + "ba5e10d0ee0da409654d9e7308395e17caeb9caebccb0192679866e6f2ecb5f10044333bb70d61712adb6d74cdec6918ed9a71d9925da576a1e6f4e906a5cd5f" + "0e94a25e48a4141e4e2770144b63e2449b0f84c82879f34d78440cc430196ba85a213fdac1bcf279a46d7592fa29a876bb7a2efb7081365522a3f06fdceaedd3" + "cc0335cef9ea570733fe8799bb1b918aa7732b4d175929d80c7844a78e19f2dc6a6febf648f49b40320b0f7d784e7f84e45408d70b046bd01cbd8fdaf606fcd3" + "02f4e5a48ab8d13e93a246adfcc94f3109e02a7a969986e75b6ced6bf2d11a55ab77488e131b65a06398fa8e384dc90d875584c9b17cdcf2da5dd72a461cd07c" + "4a955c5fe48509b3284476c42247e086de7d63839b7358cf4ebd9edf9ac8b6fd0c096166405de19c51e8785009d30feb67cdb8ff9ba55459dfdffba8c022e26c" + "0ebd399e4b76ccb4d5491a862c2c4d8cdf1461a96c9b98150e170efacec980edc00a2c7f6d7c6bea3075627e1eb386a7f1ede1059da81a4ac5cf35aa173c88c5" + "1818dc0fbc688b68b82ddc225b6c87588e0c680e303e737c82a13e34be58df8b0cb336aeacc698c79e7682ebb69e6cd6bdc5d11790c96afcfa9290f39515142f" + "5f90b938216a1d14bc049ce3f0ac135722208b989d2557d3520c2186479f179e50fe5b125b8d6638a65047729c6249b9b2c6381c9103c97d1b389cc9cdb31c21" + "8a2eecbf4b9ad1dcfa57446cde88f96563a544c49d6f5303a84a1b7cf074fca78e67e72c9ffa0c542fb646418c6434b16b771088140725cf2dc723c1a975c4ca" + "8a80e633721274907353f51e95952c2b403b45750b42ad10961f60473eb54616f61f7b038c5b7eca475d6a2b844994a9eeddce4f7bb49782e50ef78bc13b85d1" + "9e956f47c60823f3d1981413cb78d309f63a844694861b11b5238961c71f61d82daef6795734f0961e92b9167c57f48e91693e9656fcc6e88f9ce2d373da26bf" + "45b3dff50211fec72387005a7e04828e4ae7ddd10fc2332acf5f1b0f67adcd863752573c2d24488857bfc58c41af45be7641f5cfff611f184612fc0d695866f4" + "2b396b1d9881f442c4a995f4b500f02d4ab4b53ad6e01776ab0e244583f01301203a1515f3dbb73906014e36c7143bf882b005f0228ca0562623893c8a24b7c6" + "4c2c561912010c121b5c3a1e35e75c0b094731e9c0d6acf5a2b1e5b179355525a175640579705f898feb98bffa25633bc126613fa27d2ceb214812902ada23f4" + "367a78655d0d2276095c9e83dfa79153730103963499c367c5621fecfd0888253df82b3d5716703ef92594cf269310b9e6c892c488edb3bba1d0b216e92f622a" + "7f8f7f00d2926d81a4c7ca6cef40d240576a8d5541ccf561c8e0e699925d20347ba7493ed6e182cfe3b633e70b3ce3a0d90813574f6fe329c495d3cd46fd5d7e" + "bdde58d7eafcb134a9a5d3e5d66136e8c9b5d9ecac195dcc44158941c9fe2d87db52a7ddcedc9f82ec160901cc36a9c877af80ceae0563dfa75cabde5d7a7c94" + "9f24bc190f7c2045368356474ff6eee284e7125d1c5f9a036fbde24cecfd3a30481ce077f20cbcb31924368296abf66ce4834102cf7cb949d1b4c6faa6d006ef" + "21379cead5d5a39324d41555c46e0b42a1e871143e47f8e6b3d794e75d7a43c282732766d856e04e666ea346657b157404b0fc8534a2dee8243d40a5e37609e6" + "18bc1d52b91a7623aaf8214a97e4c8c5d860b31c3792b129354a121a7a7e42b50dfbe3ab6590769401eb280545547a43c3a1455355d5d5fdedccb472abfe75b8" + "f5e7d62b0b31553d8d55de0c3c71e6f5a2abba6fe81e9a42ec1968f235bc4296c1ac5df7430917453384450ab56dafa7c7af764cefa3b0bc861c52ae27692365" + "9d7d9ed7609958884147acca867909a75bb6a2c364debefaf98c7ff70c7f4acb5cdb81100fd79a48c5139f8bbdc6553b509f1eb0f5d5d31886a602cd669b3f9f" + "59195a1fa2bcff1170003ba1b2e5e9ad7f2bfcd0573d0f2be9d8fc1773c3a63a2b9292cdbf9b4515c0b1d51772e5ee95303ff493d85314c989e269df4ec3a916" + "40988a11c6a4ad96f7d0541a150edf444c2b1672aa6d37564453b835c2d39864c05c4366492fc9164bf73795410e7aae8206430403357fec6389142b4976b218" + "d70622b4098e322f73020a0d045f07668d1e512c6eeed6e2befbfc3a6ac64054396df96fd41f7aeefa0ab1f66bb52ee1a1df066f365fc43ff0800b0398b621f9" + "a415895268505a81517c44a56dc94e76580fd107dba034bab9f4f4b8a9f881ff34c60c406c47b6d4a998894401006aa88f328393f9cd55a2b4d24db5abbcb05e" + "20d392f3feab3ca12dac475eb3690f2bf9c699d7d90900d9a840068c8cdda2ca7a27bebd685a26eb01a768259a65ab4d7efc1811c87a5a1f4e5038f6b3dc74a6" + "b46d9ac58d31bfc22dac23645aeef819329c9419326f22e1c24c53457baf62ae9b92ab5f999d4ef0ccfb5a21b7598340eb2d399ec81588b6a674c5a1e45aa238" + "c55cae8e1af0f5d64ea378b8afeab263a3a2e5c71cdda4cdb824ae55df2b0260aadf386275ef57781d46f6da3d0b300ea68c14a620c25b5df738c54aef04d63b" + "7dee06cd225e9ed00e78abcddca5a133d8b5e0d9b287e6436014c5da729442239bddb7ecd3fe34e6f6e530134a03ef45de4ae4fe3bf507f16cdfb9bab1fc90e8" + "dc565e4a7ead95352c5a894661e5d82c6d0fc47843d5cab12c4013db76c90734cbff34c73d0d873ac9b27b417665f4948469865f33179624860604a9aba2ceb1" + "68e74b6af3d1ad0bfcac4180ea844339a034b6b2c3e2f61f0c7afbaa76c1ebe93727df1d3db27d59a5cf51b2baaf637b6eb8a20302ef9af0b25dbe3a5e74331c" + "6b0c8a0cf2a2ad72d2e19797983e09468ea95270dc229f2fa084dd2aa96e722016504f6d82508572d9c30711c3ef41ae3ae2f36cc6f5dddbcb0b40d9499b24c5" + "4cd36d2927a6b9d57e335e4fca7f0f16887711a8c1ffa0b48bda46c506ca444b7c23e2c8dd086c2a87283d5fc0d58e9a384106837318dc84ffe65b52d4cb9141" + "2672adfe139c3327350fe3cf355a08c0ca43598a253833e114243c5253077d65643323f5d69b3c7902d91bab7a0928754e7d80afab8d48539fcbe0d9ab83b4db" + "43a6594c4071df2ef35acd1f53006a570f09104f1776b26a303e2aec93a00d2fd8c952d1ca0e54504cd9b469be7c1e71557ec31467ecc773ee817b17c4418712" + "163ae86646b20b80c85860e828c48e88f1309c9ff018e6a95f4c1178de6a4f9f5860039511845da7d8727b5d824ba2502d0a3d76ce74372db77c2050c728dd65" + "b3a15da4f1e1e41c3c2acfebc5618e5e923d503c43a3421d2628ac037c5ce13c74c4ee14d47af02323872f6bf2e8bf09d017ea6e8ec4d3f9fc4fb203ac4e1663" + "756b11629224c676713a42b1f43dfd6362876be1c4865928688765589e26c8dd8bc04ca18d76ced7f786cdb0fa5028ae53991d5b7b45f93bbd50aeb97300f04e" + "69c6736f270907f6a7ad76dde0a365183a961bc8385511e0f22ce0cb8f3c42c5d3928621841e30285fb625294865409267dbb0cf91730ba2fb1088fb79789a54" + "a856311bdca5b0ac0e95fbc79b11c561dc03ea82db182808031e86ec327097143ee761bb62dae8a9f4101fabcac1fc87b3c2080820582dc8a7a8287364550013" + "08053c781b3eb279c89e817fe97103b6930fef2dbf7728def389403a4283f63ec04ae953784b749f0ea6f08749781cd17fadfd15bb197afd2f4e0a8aade2b1ad" + "5100cbdce49ed59658993c00e06bf57c0026b97beadc30cd25f586ff03ab40fcd731535c9a1ccb2c99dc7f8815feab767e1237cb069981f28d8fe26bdec24218" + "488e6086c0ab0efc5d4211fa0726b3a11387df9bb62b863a7b154ca390a268f5e49f50dec45d24bece2a06575cc07a24bfff017d7445024739efb050ace5f345" + "98dacda843d4ef5bfb2c931dc16ee3dd8b61a6f01d9a7de8bbb6d89ca8695f8ef8bd1cc6e0455848fac7691e6789218790270aef40fba114557fd88ff74fe8fc" + "476d9b9665d7e45582540710ce92c8dcad1ad8c05642a23a0d58c02db37ae1a0e70fbc5f71b1300fe398c74cbad37fd57379f58dd3e2d3de6860a17acf3c9321" + "02eb4f9d596497bd849c5bfaf59a83113ef389b6896aa4d4665504a22486299993a9987b2bbdb47d59b3f6ce5d2c9f9ba33b5f0760388ca7f8d8af07c1cd28f5" + "67a417a59ebde4bb9867d4e7b7b79dd8665602c029e9a16a7718efde3d034f13f7f0b9af1702c335893526cb87afc2100e874b25c37fd666bf34bf6a653c7cf5" + "44e1fe0286a6723c7d33461dea380b392dad68f79a78fe1b785d7833ca0d1cd68cff472991a625e3099f3ad2cdc99bd37eae35353cecf424098389dbaf1885fd" + "7db54909a92ee879609eb2e9ef4de1f4338f0df53dbde486ede944ae69869fac701d4f1f48c83757b470ea28c9de2ae5f1ef5d1c91118d16ca0d80b1baf3d314" + "056949df27a09eff70c9ac50b54feff67a165ce5e22ba2222defedc7c39e02356c3553e97524c1506441527da4f5de121142ccd494f83114b3ca2dc37e15c752" + "e2faed7d50254124d68f67e26f4f50c9f0edf6e58b916ca830c4e33801dc11039b18292b87b08f4f2edbaaacddcdab78ff3a0004f86034080f2ca4394b14aed4" + "31e38e3605e6b257bd772954d2f4b846a17df7ed6e5dafa33964d9e56a07a19898fb4dfe8b2ddbd11fa0013e6ebc0e429a5166a43d1ec45557cd1fc1bddbec4b" + "2e9ca26395394c96395ff8f557bd0f7f805c09f0c18534585b7c7fc1d07f145372983ad77fa804fbb7765934e72beae0929a87cc6bf7f6c242ff5db2d4d5541c" + "8c366d22e24e1da5379836fc0eb484683285f99f178b98ca170464bdff60ee04584c12c65408102ac6dc7d10bf58a7d770bf1b3c636a48f934f6f4bbdbcc75d3" + "fc551de3ebaf77006707f6120b3804f2bef9b4bd59f5996610c09ba3953994d1b78a9f3bc3bafeb52266f10755ea842e5b4370c937c09afd34a092ff9b98b4d3" + "518bc2480d4b132455b7f03774ad76b83b254742117921c31cebeab5f39c145f7f373a5603d17dd95217ba1af37a0aa95b2992efcd02d0bb4ad08ebafb31440f" + "1ccfce45882b547ee4bf6ec7ecae11ed79fc63b03636c8a14ec4e0f6877eb658d839be2eac0f10a8948e74203f46078ce66aad2764ff05590e2ac7a8dd8b3036" + "901fcb7ff3369ee989a28e34b9b62e1e607d14da3049ded1a4ee50257195eaaef995bed79ec85111abb522aba1fb306869a1ab381e82943f35345bb5502bb90a" + "e2a0af77526a84754ee4d600ba7f8ac98705ee687bab949a081849889d7b83a21a3dd34af84dc2b9458230ef0ff44c6398d3c6e48e5c09c399ac4d4c7b285549" + "e0bcab7fd96de42f072f1cb633e3e250745321049d0d7ecdef4636e70e94c8414e76ecaedd6ee0792e97de11e7dc1e1e1801ad68f9147278e268d7ad76c5bbb7" + "98386fdc13ca8c77569d96e0debba8ea3b751352136c8f1c8d611a69f1baa9aa4b9d0a476ebd5dd21339ef7f97f09aa86b69a7b114cebe17a6b0e58bf52803d6" + "fd47d9eac3a988b51e9bca95c546d49367a3126bf8ee44fbd0e77611473a1d3d2de0ce4ea54f9bb7f9dd0d0c065f613a623fad43a445eba294fd00037492914f" + "b74d10d0b97a0cf9bd3151c3cade89521f36b6fe1aca7f352e79a77d063da5337a7c88d90e9e566bcd97732baa4459305967c2f65adf1a4a4c7991cbc99df3b7" + "14335a107a97a4ab104bc94fecd1d003fe6d2f22e717853c449881c4ccaa7e7a1e44961a14a47a0d0aa1b1493dd02760ff4d31fbddf5941f93c8e5925d1886e2" + "8761baef8610fa6be016c8f4fe65bb0f335152d5e94893e274f2ab90118e4c07957d252963755b4b638ffc0a734fbe6e32c2e304b10a46a4eed330d101c4f0ae" + "011e7f94b89bc0eb9d358a6548b3f0c47ccc3c2d986d381437c49041629c6cbf61bdf0825efe17e4abef128003681450ceeff0e28842895d8e338c247abf81cb" + "7260fd45042c1f6c630a4b195579721392e577fbfdb9f5b003a8b9a6bc15ae754f6255131a0be600c7b07e2cee1ffe32aad4687f9a429998ed9059a99fd879ea" + "c4dcb55f4551bbb70c187cf1b162e2ca4a929edd6ec9260877df652622ae073fc63c0d8522d3882ba888ac50a67a68fb6530193f93165093a1d8132e87d8887e" + "ff2fdab0fbae6ab9506dae61fada4023133d166bcf1956aedc3237c77d1c81dcc84ae957d89367b0fc950c78e58f2cb9c4fd93e16b94421fdecd46c3ff55592e" + "4374a7f7d8ede9923115770cb416071e8f102d4ad78b891464ffd14f589c238c8e13a4e2a81744d179e7d3ae36cffee75ceb99633face85d077d0c15b3970930" + "075dc08b420e0a545200895207c5a746a18ce9ab64a50d3dcf44da857fb65e4efc29b2b4d532dc6a03b699dcfd77030a4945e6431273e25f06ad8f913c2a9eb7" + "59d8d3049868d337e451726d95c4cf8baf381096fc9b62679175dc8f14e52f8b99f212cab6544414c62f17c8323256cce95356dcd351e34c7a1576b17c1406d7" + "5b8bcca8099a1993df1541ded61b876ae83396b191b719c4b1cbe50d73fc13da352d827ba09aa7fdfef3e4e0273c31ef4fd38b93cf64199c3969a7c09dd5e0f3" + "ff93a5a7db9c2c1ec25e3060bcb5481c6802e1eca78f31862842ea08e8f92b8e52856c4c9fedd0bf20e386cfdf926425f7756ff41fd3567c5bf334e96e3f492f" + "74bd0519d8d98efa0b427ba681b8b1be8fab041ff084dc5f8c4d5d48f481115d7e407ad8a6034f481c2be86f8451980c3aa83a3fff245d90d13801a54527e97b" + "e392b25867882d43e3819f4a8aa380db63954ec23d2f0c11a7aa5bc7a3aedc43ecd3b024280ed8843399e28deb954bfc11a3197fb14a9c9a895859e390e9586e" + "2ad21da39bb9ba79a62222d228a0fc96a24e801f00afc3f98d2168a8a253f24deffe461f6313de9b433e1d2e307239c0e3fd5d9fe4c8352c2c6797b1737e93fc" + "14d411bc69bbc9d78cf91734052b8aa1dab348e4c243b8e6d623865c135f807de8d5fd88f3921327affa37066dd538351bc4ec52eece88856de0a424a87d062a" + "f68cf24db37dbaa8e8e96a812fbf32ccafdf1b9d27f11bea23df02143bd09061a881c010819a315a5b6ee44b3c60979b3f7b41f488b2429d49377d6542fb0e22" + "d09a0ef5b81aa7c8134c0aecdc7a4f9228559d0bb826d30fd77fe0f834212647ce61e22fef0a1c10eb4177de81c31c12054a15f81b605619f3045646110673d0" + "b2d79d80577fa43284266fd2ed54f9a3b9df3509f79559c5bc51a58521bfeb2f95d8851527b7ea47b92a694f6ea2b67dc2d4f506d11d2db32c2929cdf5c8816b" + "7f0c310cceb7ede08d5965ed2c7be6c0a317251c7d31cc4a15f6d7976a8a1e6a2f386fe0071d43a50bd0ce5e864a8e449fe9600c6e4a84866879c490de9f9d46" + "3f22708abf34d3e180dbb6005484a6afad373838cdac335f05c034e3090b2fbaaa53fa2db1f96bbe141d570f17363ff98672500e16994b79be74634755b09e66" + "f1b37e338c946bf85e06c97e31dbddf257d58fd10468278648d86f38710c2ca0b6ea7cac4ea0e2c49b96bf1998bde1b3d38aa853736308e12b4a0d467fdb8a73" + "0d810ce45518614bd5845f58a9835a5cfbe745f45ef59ce9a677d10d8c9f6294f1a0565301efb3c6610afda35167150bd326c77057e530c213da63af3e6a600a" + "d87b16ec5cbf76a13764f71b3e7e0c867086ebd9fad02e1d747030064e071a13da4758cd0fa20872b3dc350f4cbfcde1b68a97aca41e32207b40beddec412c0e" + "c75d87c6671ed94bda5170aa2866509161c28d550190675f60139a7b460469f3d4829b3c65f5d185936582629160522fcfdcc53fd0dcc8fc46de11d52bfcc5e6" + "3407ecbbb682cc1693d6543756fa4e068e92ae1a94924a1ff6891361e5f262b7d3c3a3bc2866f54e6d03ebd5479afa3f424077d51668cc60e23b35fb0222ae22" + "5223ba8a8c416b68c8853022d150c951f06f8f85c2078d3035b8ac3ae984ffcfb024431acaae8bfbeb981870f9ad6bbb88d7d5ff34ba21a44cbffd0aeaa435ba" + "7d40d22602e807ac9a69db514ab13248133142cf03fac999a2b185f34d83fdb495ef042d4a5e92f2624193c88858d91c0812b18fd67046cf50635e6ab1ea9ade" + "7b1fe783dc5147f14f9194cfa92c03a0456f4171f9e5c156fee1c607a1e9e06535f2dac49b92ddf5fdacbf88a062bd7ca5439bae645100121e598deee6043baa" + "85cc0d727f08d37a766a55a9ca21ffb6594fb73f9aad15be4a64bafddb6c85d00f7bb5705d9e56b410dd80df8b087b6d67c7ca84eff2ad699f901415fab21343" + "6351a9bdf83b440e29f3950c7e4c49963ab109686d78fce629e9207db2e17eb5f02f01db6441002d72c06c6c6bbcdc0a7443589ba29909a5a78864ad51e1dfda" + "14782d869e4989ac3c5ef0aa1eabe540e9e7cd4e8eabe25b07f300a134a92718186f085d5c10a711ed0e574bf7550f6bccfc3c094d6e59619bde9fd892af8ef2" + "50e1cc3afdcd9c84ccb97344542843028b00064b0c3d18ac0f0703fe6f9683d40813abbb883e164c5797bc1555338566cf8cdd358e9fcb0e93f08f7ae06a5121" + "c67a231106ad8fd42f0798d7185c2de78b8b76c10e82272a405212ce3b904f90236eeea02054953b967cb614e8f8ac49b977152a52df981c86fa4a92f7f70eb6" + "cd4eb65986564039b0d77f8bafedb4fcbf9c34b8fe9c5fa87b0785c118a8624498fb0184a0dbbfb16777579e1964330c12e494449f6aa5cf69ec4a32054be553" + "6027e0d27c7044abd4c0b8e43db703209037efcfd08944647a90a1ab0c71011753354990cac5a472fae44dc370aac8131ebdf31456a8484e7fdefd268cbf5cb5" + "85ac615039d3655b1348fc0b3b078ac41cbcaf6aaedcc1153bb8d55c307f45405ad6a959abb37bf8891c8dec79a9d7ccd9b791cb60361d4a28f33ec0dfd13fa8" + "e0b9b29e14bf36f5047e51a39c2efcefcc156bd08e46c5c1000a3cdc2bb20713e19d6f492c40e51eb93628cf85d07041ae5353e7decc824cbb1db8ab3a7a7fca" + "ff04c2af423bcfb1864ddc864624b827ddcff2a2f8fdb7a3d86d76e72b4f850ec1262d8fc89e7b12e4cc618afe6a2bdf205075c2008f93b7281d80180199409c" + "de850d1f14ca0ff960f69772385cf0f0a0f47cafd5489ea4fd8b68ec7aa539b942379139756c95bb90818842cd43511edbb7577ae469f46728b13a61e6eede06" + "3a4cdfab5ed590feb807d55d76e518d1d74bfa6704f7c8ccc672824b4d5ef5fa5b3ab8fdf2b6c1753404ba35b76aaa931a4e0e5ca7e440524166b23e9a8be9e8" + "635381f6c9086802d428fece81395dada6b3b866e905ec00ccc4fb9b8415dd15e443f84b7220e3b28700ce3d88f9c6df2afea39e0ead537a50ee11f0c247ee86" + "d4b3074e8761de4de611c409c6d4c369c2c11742a7763f6550edfaae49afeec33353a14d2ae60687dbeefd2fe29689da6ae79d7b06042dfd25a68bde9182fba4" + "1ac53706a8b96535057fc2f99ac84a9cfc6549920c3e2cab44e48a08e77207b6a95b2f6179d6dfd6c2d9e3c91106a7a687e40bb2a1c5ccf566c0e31a0fdbd0a4" + "f270f9812208f939efd9698a8b28ce9c5633f18ace7ab0a7550d9e7e26cf62eef49200331e19a64bed648b5d18ceb389bafbcb3f280ba78e4cf03b053f2a5f08" + "3c852452837138004073cf6726143179386279f1a8f15d44876c19bf6c2e2992ce6056191bb1a386f0e1f6f249495cff126991c6560e3f613e56525c0c49b5cc" + "2ea4e736d83480f2b45d7dc840b849887f54a2aa072e72e3fd0db34e5cddb02221fdf2a40fb6ec271ba3a09de8dc73c24328c5d9a33ae0adc9874902f25d5bef" + "4d85914557e2983c93fba16cdd4bd929e878b5d51b142b6e9aa0ce84871b7b03ee6cc13251e17547c2d20a7d4e948760e207e29de58a7ccb71b87f99d79837db" + "d0f293ad3d33ffe91435598e8a4584b7b7ef5b1a895a2827b4976f81d335e4aa6feda3539690899619a4cb34fdcbbecf1b8b38cec2ec7c07ce84ec3044f49656" + "28fdba8971585afb509526640d36425777b6ddf5b2a49d795fdcf71e57fd35f29fff37890541b6e152f14fb6ea4c70a1b9f159d02ed895a68dcc276f5d5ae83e" + "47c021392ee22a398c8c73b3446d61562b3ec596036959aa645a65e5d24f733e142ec0e184b72a2adcbe3913932b2c9503c856a7e989d24f306e01e99268188d" + "f858694e297803effeb8e28bf8fb63ed6787acc2c61f509e19099607512d40928a08e649474a43728b63523175fad12ad088aade0c1e20815c7c12773bc959e8" + "640ee23eef2b1653ae8918615b45158a01be5a5f39a75a7c6cd8f1f6b463516539771ad251d5c2d40c5049877765512c44e58bd3b9ac3a0ac281771097880fe2" + "c9516dcd6f1373e1e8a52fc485d104004dcc839fe3d120f1432b213388dd37980ce8238c87a70d5abe95d78d696d2436eb23a8f620ce74335d5e47f6524b11c3" + "e22288644b539e3ab664dd5fd6bafb02897aab35adaef204f82d9318b22f45b787f5bacd74b01d23537973060868a47f2e3a45c1d8805a1d657f2332af8170e2" + "9435d7540e70e92a8c8794bf22d3e11d54ff2d48cbc7a1ac3cecfc48f80fe521f6852f97aafa0605f3e7084b15e61a74869512c9c2d84180686ea07b562cf35b" + "5a0ca529481ddbdba9c60729f821dc7a5a8b5c7eaef1ea7927d455a702aab538e7441933c4fff2d27de5659d6fa41f0ee72bb13a829839267f3a7b51a81a85b0" + "d737194d94e1bf8173248cb057cee19eb5e2cdda38c529298f3c4d3b95400198063c5b27e9262f9c66425c65568a09035bed9cd55c1f2ec4becb6b9c59445398" + "ad5b7c85142e713b6dd32493dcb817c8bcdbd728e325c25c5a14d764b63f960d1e48a0bc7f4d2bf51060f83b1d1f2591c6a9b79182e686b887a2c1461442e2f9" + "16e8582e298f87ca95a8052df33af20ebded7bb1c528920233d1aca3b3789494d97084890fa3db0ea7eb561b0087c4a90000db41ea072613f91ebba82790f33c" + "fd52cdd92d2ef1246911ef1dd82ad083881b72a08a40ee55884380dd136a7c0724cded69c6abf1f156b14ecd7284abcbf66522264145ee78ab0ef0d2a74eb390" + "10946d5efefb7175164e96621d3f158de8b57956b8b1155c35b32007e47d915cb61dabd556a370537737574741fcf9a8a23f7155bf1f0e3d3c0d2088d1191d9c" + "9c974139303f3dda55a70ab4810fddca3561114969d370f4e6bad60a53815eab1c4613854d04ba8b049dd7ab1a935c728299d1502ff9aa3fbb356f87f2a52b6e" + "947dc79b5fd211ed31dee722d3fd857f43aad973fbfacb7cbfe1b2553bdc76142ccae5b4021a4647b8d8087925dd3191a57198792b6f918de87a92705ce57905" + "f2dcfb67a20f8c77e700933432d60a4536d0959415f15f3eb8a788f1b19c497d3b68194e27ee736231835469d8bf0ce1717ecf533ab77dd97b35881d8eda959f" + "54a7935b1bc11d7f2e472757734afaf0463da3fad9804eb948e8d6444e8394b33f1c187618c7c02371ee6d378ebb7a20b6049a5504daa71999d15944ee82650a" + "2388f374f3ec3afd4ca58ef3f2588997d194a2741252cf6562e00cd6b5c5fe4066454d2b3150317694052b4dafb40c2f04c850e4062cd8f0af2da75280046850" + "77990788b27fa457ae9d0b622d18fc070f1d2661ecab529b5cb82f30a29610dc6a9e93ca9a2617ab0109957a45c1204e5eedb8860c6f4d57122060f39a4194fc" + "a285f1e9e7a75cc3511b8cb4865719c2260a630845051876e7795bba59573b6ce5faf7e5708eda7be25dd49c8cace4c04c541074d703e6601e043f6c63a0a371" + "1a381f0ff83d136f4aa29de266169ce5b3105cbfeffba370fa306a93830e3c0519a495b8b9f4b72078e2c45421b4b0667f903676a1339c70ddd1a90dbd21853b" + "2826ac3fa5add5073c634d4c5e87db0efe18638ee93c460257e52aacb8600ff36739818056110b2e974a1959e3784903aa97b0fcd9264f7d8f6bb5d8b7d9f03c" + "4b643955bf7966250936d4e7d651712db5e695a6a36b5e6f56c651ff737042b5bb73638e21ca6ce9a3e63fbb1906675d97001d7ee240d277d62df18acb169677" + "963d231c5276bdf5767ec35fbedb062e61c23d759aefd287b2dd62a0d6f0518d90b3c1756fde50afd33cab395ddf3cd538b9ad8862a199141331c63110c9ddaf" + "fa3d6c63a1fb1b45529eace826cc29a1df5df327bb782e573c41864c18e6d31401d19719326e5c35bb50de7fdc67177a6a6015b4264fecba2360ab72ae8b060a" + "6c66c5a05782a15fe3c1833b47e3495d29f2cfa579fcb08f02fd064e9ef2ef5564ac6a43cfbcae7d79e9f87ebc2176611823c6624db11892f8c47f8c96a49539" + "1c18f821ecdefb343eae3fd98dae1ef96fa3527788543c0d06d9793579cc62d91dc4d25312901c6368ba81c8536c6287230e8f97d25f6c77366609580cf26a27" + "88502a9aada84a794d3674ae11cd1742cf245e9d9502dbb5b340c2a6c79e3607f6b47666e1ea991ccfbdf6cc41ede46d043bc4d3e5e6882414dc65d62f9f47b9" + "fb7b828a89afd6361ae458c2cdc82f459c54977072702ee5a4c22955b8019d8b8d91f558897c4b661f8e5412ccdc10c40521303c0ffd353a0c04cebca5622a71" + "192b144d0f9c5c0706a130df887526b7b6e0f358ad9f7d0fd4d87c5fdb29a7453388c0d009da0d4c47a5d6cf8363892ac42b6ce3388771f698802b4dbfd66aa3" + "5fa6a6f8b42dd8446324501c807b6e72cdd35cfe08956a52f86bb4709fe2980f62152dba3571f18fcc4c1cf7a25384c4b5174e93e5afc9b9f12db2bd505ddade" + "d670d0d71b9548f9a07ef98521961cd96e8f363cf3222336bc4baa284b5305aab47dace615c1b3f3fb1ee23ad9ca3f58b086d9169ee5b2d3c2831e1db4f905da" + "11e1fe79e3d48c01bd9879ed68391e4d24d6db8d6774cb8747e7ea368aba3bbf355386408af4a59b23fce74a5e673a1044db66ed8529a65462269480736cdaa5" + "0784fbd77e1c41197335b4c517af8a67eef5b7165c5fd6022cceed0396089c3985c36595497db0a0fcae478e4e4d68c57b93f466aae86dd4244633beaa8116a0" + "de25d2a54353b7ee85fee58ad4780a2957d69816585a64f65e75f332614aa6786d1a1432f6acde385d3d6e870bc968c60c81401726a958f0caae336c83a9523a" + "c174faed43ec67473dcd151506e334a6aaf1731dd3aaa831f934be83beaefafa11810e7eb140f4fe80cfba574e6106c1bfe9f0b20173a4ec2663ce0580df6daa" + "7966a3a8906677ab680025782c61b95cec6a73b5deb16599e6521f9c6c4cae0d9286566388d5181d6ba11c51a25c62b510d9b1793f3ce9f73ff0c9226c8aae69" + "5d014287df074a244014720ee38e3968557db00aa63dab71854b8573c42c65116e3d88bf040d53ef3165a5827c717179e2939e310be5eaf6fb75447ba98ce925" + "98e83a32a90eea848500a30eaaaceb307d37b1201b83a744468a1a52632ce5525c1fce5f702421e42e7cc4c61caed539dc09001cd31a8a2b48a783c36c56a3a2" + "d50de42c63981c86642cc92bcceeec8a66b4afad3c1be1df4bcb8beedd442c281080c94692bf453196ed1a66a074d56a8e7f60238ce18358373efc173e70c691" + "f832e1139bc04e6258d77cf7529af7ce5eca28ca5cda818625c0bb5beca96d99fc9b6689a7771434aa96e23c55a41cff7b7b718df58260b3bc91762034debf49" + "7d8ca8d5764c52bc9665bf86db5407ee1b786d90f8d7772597eceb98f0121e3996e771d951568a162f6b71042998db8208ece5b8b0c68107b8e2079765b0d8c3" + "2747597072756208b0d84415a5334a88d916bda390e26ccf3046b860e7ccbe22c48cd3d3f51bb65a98ace74d52613f782db726babd02780b8d620655bf9d551c" + "ae9ef3056e3d24f5e7c3105c4857492fedd244ac2b8c30a874c1446630b042d819bc6b6d2d96829de903db22af706e93c5ae876d72c633600222443d1765bc62" + "a8a20c458ae55bce8cbbef753cccc5e7d929408d6a3709467373651f0163128aba4142ecc56ef11ff1fabf5eaf6e955b4252d1350e9002300a1236ab2fa0ed34" + "c9cc7dc1d4f09bd31296cec1493e725b57cc496fdac4e8d26197376bda7f74c0965c4352bc9d5c731df04f9908899cce6ec3afe15210d115992b2d95308dd032" + "13c557ac527424c7db02475a2fc78b88d022d212c3d02d5ee490e2436e6e572e8a1330465b9052f8a3de01aab76662d18fa3d076fb77103fe432d549bc861fcf" + "f63f3401cda31673ee48826b68b387802fea4471deb1fc928586f1b1614c16311c9820b563ab0112c28af5c1af5121818540c4b7d7f549b33906c1b86c6674ad" + "799acee7342e4a79d9295493b2430fd08f373338795764621bca444868f3f42b0e40abd4b8e148cad2861fb4980b83bb58d40eeecd8d8cb1ef1ece17b0ab72e5" + "06c6e650a3a43081f545acbac51ed7e121df51edb75120cce30ef7dbf41fad331120e537fb35be45d93de4fac0cadc7e5f644e2b767a285facd5f12845559785" + "57f4afc276e21d77f6162062430dc8918435f035f435ea419ae9f1ddb6afd46b243f8bd6a3a33e7970e7e76fab9ba6afa72a4806189462f9d0f231a23e3ee1cc" + "51cd10cb9043a27deecaca866751f971254fbe3084c243ef5f516bb652988b770896ae5abfa12db2eb2abe404cf694e9f60d47e734e260ae668b750e11b26001" + "0d2bee5ca555a44523742fb069e484f7a69c12d4bad026c03ed7af10ebc9cf2f54d143fbe4de83448df80668217a11f5a1187f35ff306e6c685cfc2417c14aa7" + "aeba1fb7dab05c913fbcbb8e677dd0f89324048862220ab6f5340c38b70804f625f5a526d6675a49fdc22ea6ceed477097fc723a7b6eaffd65c48dbee13df566" + "f8f3449d91abb367cf37a8460fc8072c4ac75f88be8b9c840ef438cbf12a2e7d55799f641316e3381f72265425f3e90fbeaa9919533d8f9262da27f1f933d4f9" + "a83e07aeb968016fed89e7b16babf0b6af3800a27c9c3d330b6bf8be447d31bedcc526b1bb53ecb10c3ea098bfa7d014d93274bec70b6e82bd5c443e860835f0" + "ae82b7be7c78cd996e0990e3cac8c1c431481c8159ae1dbc40c03f4ac543e5758f347e12715822d86c881030de83a76ba1c49e4d4836bab7b5287122ccf523d2" + "33935d802d2bca303cf57b36a5ff17e7c611f1cf99699881ae464da2911d77580587a7228db8325f204adb14413a13fe318e995d60e35c88bb47b99ba9ee8daa" + "3e40ce5818876a3911107a159125dcf768ba04074e5771334e0de430c439070422508577e474e9532f7dfbc489d0c87d37103920415b6c116a422ac15e0736a8" + "1e1e317adc87005f868815950882fc7497794c5eaf76f9def434d198304ff495bd2f9f4026aea330450741fb969700b953ab265aabf1fe146d861ba2aedc53d4" + "f929abec2dee710aed8fa605fbb9bba914eaff01fdc113836d34d855383e4a311b4ec6ef6e80dfe32bc8035d84ddc4e2c305c112b93560112c1f3dff800d6043" + "7eab01991f924075b4dea4db01c377ee1ca374d383ff1fbb463bf7078f6cc7509a0ecf536871abe7c95bf89f29c71f72f1a2002854113cb0d6d2192c00123010" + "8dc9477808a218f84afb81f0274718c024393d5be66edaac7406e520b0c8e2c02ab98ee7b290db261f2122ea68bd79f2cc6dc64936af5064cce2b4d1b7078703" + "951b6b81b9b60b99da4c2d12bbb50351a5b7713541db0958740910ff69e748c71bc7470a3c05489febefd384e06d267371935f652736bbcaacb20c34bd50144c" + "71923b5a521ac4b1ba694d024ba51b4bef3ffcff74d5dc63810b2c0f529073e13ec3232d8647ad124b21ff73402d371c0db39d46cf4d2d4cf7ad43fd8dd365f6" + "9b6b7bcdf664df0e62ba58f3ca0c62ad6fdcc9b091fb4926cb47b5ff8de7d3b12bd8709a46e5c3d5f0d22934c7a0574ee70b87af97d0fa46f7d9673915fed1d5" + "a6c57197524ec9978d1bdf65633721ea2ccc25626dcb5e7f5e090b00e413c10a6d20b45fb8e98c22928de6dda184e856c86792c7cd09d38e4333a76882d363f1" + "7f4d773ba104b2d04fd81027da087258fb175bfa8005c035a4719bac5b9630ae57889fb3b52a0fd47ec4060137b0f95fa5d5684172d07ca91e91eaf20dbfdea8" + "a3e23937f33d8774f30c7e8e5d4b2d5371e5ea5e8d290970904c4c1ff33baf675ed79599653808f652ec4fd0088877f7dd7973023ccc8377d1ada2b80c07d077" + "d7208686354f511925a3514c9e93c13525353b3d9528ab678e3e783c290ead88c2c3d6230bd4cb3bf79fce6dc3e95bfebda41e5d994e61ab083d73408ff6b627" + "6996a263d2920170fff6869c2311441837a2fc190bee104328591b402defa38b421b972b01d020bd20b1b6a6ae884b23eb829fdf032a81d4f199a87ef125d4cc" + "8662e24deb93700980e6ebc6882bcbaaa0283492e81f81e76bbe2ce18df4fb665436310658918ee217b5da262f1a1adbd59eb3c555cfebb12280058c75b5b33f" + "8aa8c2d7cebf12ce46c5f49ecec5a865a9f0b65476793884f0021f8731b1bd288f55dfa1665776b2aee1007bcaa6d92a76a2ba9925bcfa68db7cc727b2a07ebc" + "e24c0314c96ee4d6164c699e585461388dd73476a1e0519d92f51b64eb2842a7b17bb55d512d52da802df63206ee926f6a6a8c32de7b30e7cd3f23e37e0fd82a" + "556323736ecd9de77494a2f8702463f40fb837c2a99270b9050b0cbbc2c305a32380ff5fa94bf9c101c667f36293c12ff9aaf6e0a810b75230caf915135cbe6e" + "63ffb2a0e8632d32f72a65aa965fc556e10ddf6d5e40be919066eebda09d581a32156e1675300f52c8b355e88696fc2a67dd8e350a6e902e082af28a9809ba11" + "ae0a5fd9c6627fb808d757147e5d59cffd9c45874478ab226e72909ccba6592a54391d072c7eb0221f1ff7be9924b9d037e4f8c31e94fdc814a8c4cc7ad4c9f6" + "eacd5af66dd76bb6222b2fd3ea50a828fc3a91ef8b084214bfdcca56348517be18ca472166dd7f18c8e444e3641486e7dada626ced8710fc73a2b09b6e9395b0" + "31ee2c48c9183851357d230204c911b345457de602824273193b795fc21e90a0c1cdaaba36787424b23ce73e2116947f143f9641d39a4c07c2e40e02f3bd7c68" + "6899fd57e3eb23c6f5615c9dbc279fca0d4218bc79d928e70018533a85b4646bdc78015149b4d41d77ec7b46900e7fd5250116ce978f825569bd887bf3fd0365" + "e1259a7514116fdcdd6da3ffdf432bbe8e59b9bca9222c5dca1eaa61caf29b8461ddced6f312838fe490f742db696fadddd19bab8de6bedaade878be07aca4ac" + "76d69b81a6890e66dccd702720c3bd5601c6abdab95fbe4ccde6e35385b75e1977d5085ace928adfa382ea2890889017b9c4c81d9ba4629771f84cced6280db7" + "a6cd83ff9375ffb0a75a6bebba9a209f048788ba39127c1036e4bd0aad9be40754fd75295611e455909a818a3541af32eae98df7222353a4405da0e7be9f1cf1" + "bcb823fdea7976a810e8a3c7bf93fd947f961a344a93aa1ba99bf2df48ec82769d8c08e7b14191050d5706a9467c9122f34e27f060dd4d6e936c414c4e551b9e" + "5d6b5b58347ed0012a8a323f41b43bf5e960b2806de59da85b998affdb490fbc965d569114223db3ca65df69a617f6808bea23017327ddaf32990070aaf5f444" + "a9db44a57b5c92bc27bc71c5f8a2b6929edfed8e182bf5942564ef045c75448450eb1a4e4e09a1875e8a4a74f229879ccb7a2f2cd0359abd91a782c2ec1f68bb" + "40ce0a63bcc014b198adc222fc957eec0483f5b93f0db91b7ab3b3e3c59841dae057eec97abb55fc42b2de124946e66ed2a7fe8cd047cb79051b55f82594ab45" + "711c92364f932a5fd274fe184c85583ac7cfaf258c57e296f9c18fd181308565315e27272cbad3b21cb4490ca0e5f675365caac42f299e22d8a74ca51a9d0883" + "bb376804e234502db66067e7a434d38c3dc075346e888e4558b1745d00458df99db02f0e4c37702fb0989387f74d002a924790a6b7351ee0f41684bef079be26" + "ee9d70b560c006cff4b08b9578afb5019c21ab9418ae4ecaa7a1cfed2d880a06a03c2c7711b601a2cb3d9193e1577b4f1d0e614c0be1f69205fa6524fee80bf1" + "e1f1906b50e75fea2d19b8a83071a460145e1730581e5e9538888d2e797ee3cbd3b31399ecb4d6244ee44362493802b142ea397c2e7a3c1bc86f0ea0546a38ce" + "574e1df0c27ad8a28dca70f659ae6a1369d8b3aee7d0dd24ea370cc2bc1b1a4dc9f63911b63e60fe4ed8552bbca10e01c82d11b0ddf748d234b4aa3b31683c09" + "86358fad680dd2178902beadc4646b3eceff572631ff9e6b64d8a622ad9f0308cc46b7d422ce792fe5573e9b9480e1ae9fedf31edaaac3b08c5a2c6c27d6b033" + "6b92a3da7b838bb0a2916ebb6ee72bf33a7fa70630491f49c67031ce4b9dec2315088d0a5cbf7473fd121e0ef5f4e92d43114014c9f8c6e671086a446eb1f66f" + "70f0cb0c668998ed96ee0ad2687946681fe40dc46cbd170e0cabb6f6216be61221f171fb2f4273f58c10d5c4eccafd1df62fdc8ac2c5c8f6d5eb637b71fa89e3" + "f8347343f89667a4450c5c6e3791034d2dc3a593185b55bb95d8f8f2984ef981e4b692c1383ace4cb2c4adb80d5d582857b5d0e3ccb12845a59587b47232ad20" + "926efa78e05a57b136e284401c516296b6b194d541ec165d11ef94f166cb52f45145d745ff3deaf643b5c45573ed0e69a22f0e0c9c5367f6d1398105516729b6" + "3f2edf1b01ad9633edf80efbba6555d4253fd99b45a36f16ba98ea0bb0d80533aed806544a084a398a692f698c78b9bcfc9b4d3328dd869dbf7085893b8dafe1" + "59e0517c2f6a3ddfd4a8c670072b30c96b90f81fcc08523e4fd75919752bfa52a1db7c374debbd83ca8e311b98b0d8275bedad215847fa8984cb50e108f69550" + "f6517d719dbb5dade1d3c283357e14b6d9e85d61e33813546517e1262a7cbac814d79cf6b7e21b0fbbee9b6314f02b2d4e6995d2231670884c78cfd86a2acbcf" + "0a178ba64de2f13f022e22b9b968ceefaff374aff02b703811f3dc541a69a21d6e1c5d1aca48889b125ff1274e65413f61e42bb0194b60b65a3454c696033cc8" + "e3cc3613a52850296a0154bde0e2a81b7a6489bfce505dbe1bc44e0e1052f678297bb19cbdf7970bfa5268af8a54eee004063f9894118ddce7fae8bbba53a428" + "678cec8a2bf6cca2b1a5f4a2e95562437e4eae41167f39d2a150f7c46c1eb6da35587f7234d870b16ed91c7db548ddc99967381b4bb4f3a2b0a5ebcbc7ab1b06" + "7d5418768eaf7d526ca116e239ceb3ab393c45f3b32b713c11fa8e5ae8d7611e6008fa08d1305d5655315a72c85a04dc853da3e8ea9d46674194e15226f126c1" + "a233c26dd7d3cc04ae572320d0c351911b6fcdbc0b8450523e96022f4b964d4e479b6cb1c40a6d27699b57ed2952ef7fb3172c69ba7beb8c8633a01070ac4344" + "d4c401acf8ca7fcafeaa59e1d4c2ff251bb67dbe10a862103df1b416fd2097fe412b3da9d4095b48ea094fc3bbf2ca41e4452af3a179580e3bc11a7d97ba050c" + "ae1d6b8075da267b3ae2231a1fcfce0c976402f34963c007d4f85d9ca95646990d1bb09691ceea3b34211dc58409e052d0acf8c2296a7e8fb52d7c673506d89b" + "847c369daec7909da8657e8976f59f2ef4c8a049b46fdf30d6d223ea4175e4d60e469bcea0eb3bdcaa4d6024f2b43cf6de9bb40efa9172381291079dd82ac5b2" + "39f2051a7f1aabcb8d50333e8c160de19ce1c76ced8056a0724ac630dd45ec4e315437391158a633c179a3d1f364b475454fd29c1e539077b9d5f7227786a5d9" + "d8ec78e5615c25e517e9fcaf07611b85dff2c131a1b11a901a431a601854e5cb627cf7b8b0c5e66ad6cf60b7ffd6c6441f9ecd58f414013279e9de533d8d797b" + "936cfdbfcc78342b7ab586457541df5f3b7d1873612df200896e2929f44c6fe10d24f7e6dbe52b6c42c0a40c947c1cbda2a41437079eebcdc29716d80957c159" + "627e7366cc16df92cdedfa9f52edc848335f1c7152652fe24661a469fd503393229063c7ab20d8d895139a2f580dceac9f6dd4c4ac652b1d60c2b8a1b0b2923a" + "86c31742807549e6d523b3c88d31e8534b9e05a6c63f6c8fb8a1eb4dad733d92e7071e410f0087ca3074f4a2df511ae89cefe9ed09a8df603d61f23754e43cc2" + "e42bcdcbe58b0587aba9a62f32c7507116fdc8a9db3d65d6c0097c8f473eb7f3bcd11ab81d5b636b0812b7982201a63d0b8d40f2c38f65ffd953668eaa5751b3" + "dab7f038aa7adbcd1f1102267c9d55d43649f9b4f65f1851546c5a9ef2c7ef56e84b16f12641e9d5ddaa78ec778b5f113b2e06bad5821e1a5203b006a774e36f" + "56c9336d92c8cd8bddcf014b6d58c394e2a93554af6361fc1bbd13c359fed98bb5adfa4dd1266e2744e126e1bc029ab28fd68b648a2ab26ac23252171b298641" + "2621f2a8697a00ab3fdc1b3b04921390ee16d213601ab249a51830661051d34eb777f690fc2d8dfb8e0898567e388830bac8b0bc896f43003feadf34256a927e" + "b4d9293e32ca135351a19d1246cda30551c87de1e148ff5ea576b67e19e1a0389b88a5548b3b1a8cbee19eecc7de5c2333264c711d50d688a1c57eebc28dd6f3" + "3dc0e4cb857973c3d0f28683a6f3c09db9f54b8fabeca9e4f9b86d794ca55d6611858f0d48736adc10dd6763ed7199bad81369ab1f3de30f521d43382bcccb7b" + "be0178f716d5c3cb87488cebd7d9e2bbe671dfcf2512f1b815075777ea92a867f35e09ff0110e61db24423d0598eb6fd078dde0dc2b5d7f5e0bb6fee207da109" + "2e656b5c982866d5fe01e6db79809646559a6f2b9088e977789aac74435dc625b54296b25788bfbbda9bbb25247d428f5141b03172fa11f12339b91ca96c92e7" + "ea5a128c8046087dc7a7eba63e3bdb200565d8a103e7b3c292b088eb06aa27b43688c8516bbffcf123499574f00908ff43d66b79106cebaf16725f1dee600a29" + "7b3a3da878940867f9549e65c73ea798ca923b012fb8a7ef3e2ded1d2c4e85635219f627dc4feb90f884ae6436e7b44f9159f9889d8e194828e079cd2ee60a7a" + "6fbb6b8fc1f7355d7322709fabddd76e4283ddda3018b7882ad79b32bac133da415453eecd5bb1f0deb4f3b987a71a2f2e60194cde63a42b91b39bfe51b4aa8c" + "20952b601df11d170c65a7fe935915890849a367936e97bd242edf305eaf2f4f4fb9e5ee1464c51a899ba5cc69cf56731502c1b75d0d565b1dce15440b0de0f5" + "58bd4f810bf058af99c158a2be0dd02a01bb5317f55675f4d42c6766fc61271954b6988c33a84518bcedbac8de305946d060d19c4691c026953ebd680a4c9012" + "0e8bd54675d6c33cc86e65f5cd3c34cb1e6fd47784a64f39e95a1945b5c21df2b3288f963863b33366908b05c2bd499dd25c1b8e97329d7e435899afeaed174d" + "2a2471b6e8d6ad7a0b1b6a8b19fbd976362283e5abffcbd2cd310245092749b23e0d114e727622953487f373c833281a74a1b97742ca99e49cac14d9102e3680" + "404509889ace009c47d075ba9891e7f67b89aca3e213150f3c715cbab1869135601612d7dffda3cc104b6508f56eb8b7e7f379b21e1ce290ce5fb96f53e3a7eb" + "c7f7bddcbdfc266f23b775602d8d12527d30446cb4144df7fe3c2756e232a8ffca625d7b6ea2c8c0a92e6425ba67ab75160623c39f01fd96856b582e257a6930" + "224c6da90a6eac4249214c3b85aef52835d904a8a5e224d59eae0c80a33b3141ffb31a7d8e62833fa4c850fa6be135558fff5434777df45feed00316c475759f" + "ac6e014e9d3cf23e7322281ed75623ed69a81d6f05ee7de193f6b44ede4a94ced27aef5ab9056144593a836da80f5297875e7bd84d8ca6df95de8650b00b3528" + "123132f26aabf755d00450648e44f3beafa4dc746775958c6dd88bee825c29112a3af582bb2ebe628d70364fe9ad01b8a9961d5b71018690440151486114af1a" + "d85679bcd3eca510c6d6887e70e0d04b04fc2db5ab1eb21fff925b66f08f4fcbf31be3d743154056ba137727b63576e72f1756029c86bbcf9452fc6cfd89f3b5" + "9f243d84c410253ba7c9284191a0ed87b2513901a93606f1aeb736c90dfe40c0a343d45e9a992ea894b22ee5d49e0f7d55d9bddaa6c74bde8ca5839db67b77a9" + "ef740f9a47241f05e5dc1b9c95c459cc9db560b1db090daa3f4c6de46f695a158baaf357a1fc63ebc0d9db8144137ec4bd69c5af89cdf9cfa66e06bff6339d62" + "2c372fbe5a855d14fa7ff3726512f966e4da0556b29ca6d7517803f897d0e1911f9b46a291002a8320091aa7016cb7ac993e35c8b0f5aed3c94ff0b5dadd8b77" + "056d06d1bed59aaf7bca8516c3bba6b33e12df2e5ca4aa40664b3bf48c4dc2c57cfd74c765fe9f794f55b5df6ac6dd2b3592bbc71354c8dd9ae41b0a05e1c7c0" + "d3bd1a0ac6b671c48c01d4a0fec7a01ad11040f213461759f9e029c835ca1d22f9a661b69d72bc46e34b1be7ed85a21830fb87baa74d7ab145ac1647f5f2df68" + "671100d4d9e41082d3c81f3b5a6e603bb33fd56c1dbcbdce5e213c651da45d9d1dd7532d9a955202338387af6315137dc458fed62920a0e721aa7ff1660981c0" + "e4c3de0a4863f6f660a7c1b9745ea26036a25cfa37e1337ded405ebb0401d7041a7938800a97a032fcababcc06391a77a580b1a61de014db9d7e280ffa6b2381" + "ab6969ae5cfcca00a47ac2fa05be02aae7beb806d2afcc11dc0642d2a12ecde2d2926efd9fe790e1bee19f9114d22ca42f438ef656a1311e4931ab7fac93ed17" + "3f68ea0abed18cc2c8905bb2d599780690eabe4996e38872a3190fee361df9fecd5906f664106de4835f8fbb657366327871a2d38cbb671df04e0d14fe97e260" + "c42eb07bd1d70514913c7a64a51e405cc92e06845e5a78981fef9822fc79e9937ce0513138f6bbf247f5c457da708cf84e30d083b4ba48d2d43d70e7c31e9482" + "4472617910a3de4369217b4daf892c2c3250d1de0457e88b3bcb5c4568f9b26aa675c551a9a730fe9ea8145ce7f8e23ec825be9be3b9edd588c391295fe31ac5" + "bfc97d2e438ca9bf6551728b3be6d6c6ac064baca763e0eaa24f754f4bbc84a4377de45fb6a8f37150865df18749df1af4ea911b62f616dd4dd4b25b27c7b6fd" + "99d8c00ce8a53fde3ced091891e8daf43cade10086be046ee5607003de24101db49b1a4fb0ac270d05bab12583e263e903e94dab8bba7c785e40499ab01ff92b" + "b82c2e5342dce84881adedf77cab593f541e4c963f4f9ffc80a16bd4eb7f20ef4bf3f57abc7cbd86332d8be80f0794fc82767d13c71d8ee20468ee35c13308b0" + "dc29ebe8c6a81e02ee9a21807ff57e4d932edcaf59ae9e76f7cdad46b32f94a74982f0887d7083c90ff54058e873b10cec67fba1b717deba5356e170dec1a40d" + "36c57674ad8d43c5c98022b553fe060251b994271585f702de3e71fb1c8e36293dd44a4b99a1baf33f6205e9fbc9acdfe8cfdf007224f93a7104e7803454fdc0" + "9fc5a20be59f600ee734847257a5ad62c599a7fa836d1174a6291e61c1be4b310bd4d7b7cb9be976dbdfdd2b99340a9863c8c0e5009165d7097317e6c3a29cfc" + "dc84b19bc68f38694998f626567b80ce6699124b12bae4bb9e661c2484f5109517318341287e142a849d61d0d7b11d4996547e7325f28842dcaed26367f7a888" + "e58c24c857da2f48a9fb91c78cf351a23e82ae443223580a9fe15a6a778f6c13be66888219e3e15971170712b6c356520cc15e4e75167993b66e6f125799cd40" + "86c72588a85f68361f1c2f09e87f9a4de95ef9a3b92c3313664a706cb72916b96a9cb50771f6917ddcf696ce8d7f2525745fb6edc30bf3fdaad66ca5b013300a" + "7ec7cd274327b1b9cd931c068d8fa9fd6336d59f6ac79b84a24b34c47e408b3bcb8ead49428c123922e54bfcaec7e39c4d6ef79e5645a35f715d151e679ef5c6" + "6f86cd013fdaab978ee4e52eea5e2753e693271344a1f215e1c690de06f29c856c469ccb484d445bacb16694f4def1537cdb32260705e8a50fd65e98a24967a2" + "456af6cf90643638999389a35de6e192068fd2e2ec29aced58611560c792ea5c7fa37583ebd5452a8d94cbf1898937dd8aa6656047e6e03f84dfd0bded514a6c" + "b47ca71c2cf1e76f606c04374663712fd96925eecf0ac1c38392390c8cb095f39e1814252ded78b55ebeb9915dc5e2ec14fe99e3a075bd389ac601681f154286" + "885289e568a8646d94abc806b4637492e3a407cde582d42764eef0d56ab14b00e9aa1f64d8fdd533d4314145c8255c44d0c746af6da844d285eb044d57e8cafb" + "ab6c3b962e0177f11a839f4a5c0d2c2e8d5f76375ac115e0a89f460ea1be238f974a68e0693d15790117106c1a65ab5f7aa08e738aa888d5b56be39d2078837d" + "fb2357d86f5be85a9af41aed611b231495564493e46acc90c6a3e67d5b055320290aef508aa6a1896f19cb5633edc0fec023216726e50960a44d81e0614ce748" + "6ccfdaf620eaac0517e8cdeb1095d55f3a60d61dd27d967eb26128b84c9ea8418779e074cee8961c5dac811ce5ee8134d3910a47de7a1344293f5c64ae8f1b38" + "9d6c457dc74e7005c339394f5f24630f5e40cf270640d1e4c27cb6a74fb440f3203026acfcd31f39cd4844ede7e785290878fac8770f930e96c3edf61748dc6f" + "b7476832cf77ddfbe8eb8e12fd002038630301439ef8a7659bb10593a92cb84018e1ec78856f403e1eb9d6343aa0bbd77a63d776f1d12838f27f3cf6296ab0b3" + "b4436f0ec545a5a1e92a5351fb273b3ed56a40e5a5d25e0057f4077bfeba2e2d8cb17a553b157609b20bfb5cd2699af9936f50d823bb59a950a24b8fd15ed705" + "b1628663f0eb5b5c2b18f000ab039bc425ebafb2010e1a2264c38fa2bbd0f77e38eac8acd670565490fd60cac7fd28d988c8dc0658505dd98425f22c94647d44" + "5d0236b97ea58b3c71feee90be0055ce1fabda5ebfced9d9bf5efaeac8408c4b6bcdb39851cfe038d88ada5211de2f0f69e9e3c62453106c366cf0c40971c0e8" + "e8f2a790aa66999a0cb4cdb57a8c2d812e9e4a66df2f001a57e291864339257ec26c9bc2dc6cb2eb5c3301c167e1ed0387f9ce9f76c6759ebe5c68e8be378c42" + "e0350b344acbc8b40c95cee9e82bb43cef5e91a32a6be8a727d5fbe089321ede3abee4da6b9f41775d7e9abc36f6a5d26ab88ba32978b5ea0ad63f0ce8a772be" + "5aa51143bcd00d78bdcbd69beb652139ad658dc7ad242b2057eacee092aab4940d6ff993a8c7d8fbe93c08c93c45d5f3a01058f3c75c94be9da1a19a97754734" + "b713e1ad6b7cd472619ec1abd4cf42f50b0648661c2b8dbe8976037c094c7176090ba94618e1918db44f5d2c367a0c7f911132d9a8b2398b9417542c7ad99b53" + "a7ca48253bab8382a1a24d35b9b9818bda513f4b52fc576a71fa63e72aa8042ee1fc806c6fd3fc16e07ed2caf9f82bd3bb6b393b2708c051c24c2e05aaf72531" + "d865888db06f719314d6094b2c4f0718c151c88958d2d6c8a6f49464f81cc46709dde026f4e05325ea4ca2dddf9a79bf98bff3aa5eb412434f0b7457b4ed47ab" + "85a212e0c7720c78c961d56141bff0f964622d4d3984c1017de6f5846c72fae0c771a819ba6c111bd739fcf16f4b85f8101e7c3f0daefe753ec130a6f34c7697" + "4dc531f83715ecae28bf2e55111778ae42aef17fa95340584cfae3d4599af9dbd10211baf3aafa8ac8a07edf8243daffd6a6486b1e3be4b60711194261e2b646" + "e2667554cc0bb2fc07054b653231cede43154c9002890ca20b0ac81c4788847c6ecf7c174e528f36f8cfc53f3366fa9ce07b1843939cf6d318ed11f7ba6eb791" + "ce25e75cbe37d2ee3d45bea487d969de041011959c0fed4e6c86802a7485fad70059ece14a29b03d4df41677acf71419ee63f1101060ca5e4ca0ab2edd71fe77" + "46c6bd9f36bdbbf0a9956eaaf974f7bef982cd34881abd686fe77b536c85d042d77dadd00c5cb0130737e5318a025e6ae6af96ca28cbd41094d86a85765ff891" + "af825793910c406470cc61be5d9282911d2faf82abfb309598fce0101ca64abe3920701a958c20ac35927733466a23de809afa2bdf331f68c3ab0cfa08b0c549" + "a20e9b50dbe85d22d215d0e5fef854ba271a4c0f95e6abca19018bdd4a042721887418136b4a60cf291bf06ec47a5a4d2f9b29f988733c6bf6f65da5a95f8939" + "fe0f2bab0bdce98569a81f861014e532f6a995542db02b6bdf3169191d300fb0429c1cae1d2dd4d29e0b61751576e04b558d38d3afcce8326c2871e969c1492a" + "8391c0becec29edcf7f038a8093471763db9f13b97114acf7a979f5ba3bf6f990317890ee0705850fb97bfacf306a0ad621b2c3b633af01fc5aa059c0e22ed17" + "23584dde6cf140bd1d0087ca9090ca9f07d3b93c60938af8df976555455bafbd8cc986ba32fc3f15b5962dbb2d37b6ae55a7de0c0c6f2366be0278e26bf9a725" + "f61f2bcb545d66f79261783f7f03395f2a5d27e56af62a01ffcf778c3c686e244bd9b7e5029d1d40dd2250705c6825bf78e83730212640cb5ba54191b61fce33" + "ce6df7721b15662162b631d99e6431efd24ec35639c2b97f10374fa5b9e2ca4231f523195206fb9695ec7721c98d74f29533cf714866adae8edbe8ed2d0969c4" + "9ed36200c4b8b75131e6d1efa913106bb0759aa8255bd6a9dc2b00407358f4523486575b111676730094f46d0a7b95427df74f053c6611b4c465efa5310f760c" + "5ff081e841e5f90c2de35855d45a7f35ce73d7c7f9f61fbfa953398e042c3946aaa4b7a2094d95410b8a5ef76c8b57d49f77311192b3f4578f37bda1a426de7c" + "7cc54b5400bd16bb30cd8d1b7b42ff31c5e3759e3c9a7668174c02bc5a08f1bcc7e3ba145fa5f5c41e48877b41b0ef8fffd0f75c6547047c2e7b7c7e1aef2cda" + "c4a778adbf71257618b4eb3c6dbd8211f829c1d6373415b969cc48f33d586d2678e7c1b441364a9fe2bb426a33b2a132741fac547766d196df3505fdb17977de" + "7853cdcd8d9932eb9452620aa4921b4416f65055d77573b132a40795bf142815b655e670bf2c4464adb5d826a1744c8049d7a6cfbc8a4634e66eb32f0cb6fa17" + "ffa8925131c3a253101733406a2a3a0dc61ec3ca1448623b6295791d4e2d65d303f78038e15d0ef75d823759bcb4b277b51410c37d5efbbb2e3a9e0cd78a8475" + "05d44bb1fed7f72b1bf1a96ad0148e816d34c66b1b5faf172b8141ba007bf2e5dbbfee4b09ef66656ea3cde54f086040d14116aa7f3584ab6773f6091a2fbcee" + "f59d6ea115f88ef9fcb358c87c35caf7c1a6022e141a3c688beef17da5a619e733d854218b30d5edc39b933b19dedd6750acabc52234934b08f930b608a18008" + "838cb0fb73d4c78af0c468d9fa4fc5852135ae91ae00a99a6c603371d09b031ee37f87586cdc83897d8fd8ee2e07b9d0478a812d3f7eddca08860386e3ad9521" + "98d5fc04fd0aba4b3da6ab8bdd9eca8e0399a2012d6158ed75ced5f432a223449b4e3db3fd4b19c494a69e9f2670833f8a88f7b2873319e9495f03fc69b6d098" + "6006e3ffd8cdb9c1b98f72345848deea1b98ff6ef766f4398e642e5f2b217c1a87a608c1dc701bbb79d75a4433ca1d600061836888a220ee262124d145d371f6" + "576f04cf71701133787a97aaa615ca98138c2be1046604d885e2f274b0de8743af50ad5dfc4c3a09164448e102be577eecf77ffaec1724f91f00f908ff6af41e" + "57056dfa8f5dbcade85a66c10e524bae55922b4084407fb36ca8d6b7322f76a8139be9455a34440c719d0db8a36385efa48841170c8d35046407b586f5bbd169" + "7cbaf6819b663fb17d0f0ae89691a099a8ccf47fa61fb6dbb22b3298e5cf2465e4b93c49da70fa76924fdf29389194cc5c61cb4b3084d0851bc3018270d1a24c" + "b4b04e8af927d9fec9ea1c9ce18d4dbe61f7aac0ffd4e7c2e9729b49ed9874b883ec644864c6d9ad0422c4d89f87df1dfb2c96314b6a3e19afd21783f365445f" + "bef10562a26b48df42dc344ddd63fcc03220dbde98f1109cade221027c40f0f996f4beb29513c3979ba374c4c6a2c2dc6276ca6be66eecf1dcb245d6efe78aea" + "e49ece37f87894bef3c0cb1b993d974685564e2476c12c8d8f63a1aaf142fe34a6840be340b64f96d441f4537dff434ddce630101ed9f78e807881f6b7590697" + "bc97e60accd7a135d8915781f4fc22e437145154dad0a39e5e306c117b11deb10462ba74d58e81de7674ef0bcb20b38511991447f63ad906b11abd4ba88df3c9" + "e6931f87fece49f48543fed0439c88ad78f82aabb32dea03d030bdd76efef6b737daac2de2db1cce10e2ec74565b0a609606cbb6aa259ba88715229b8176c874" + "db3fc4f6db9f167e7b2d55b33a261f9eecb69a0d36ecf9ec4f8f9cee5b74bcdc5d77b02ada89f56259edeec0d9ea866ccf454b9abd29d5d21041179912a5c302" + "1862d850c3ff483e09479957df5bde03a29504b4a43e1fd40af2b8a2653a37cae89c8d917aecdec3959fecd32b7fd313a61e134abc15ad008aa993aba9629a5f" + "0af0ec713f742bee096e171729e70530b60f910ef83746a61580f0cc6d67723792c0e0e94775d5b1edf37864a50678d197bb34a97e84d7f764c0bfe05f4b2d0c" + "dc431d1f4410500dbe2758eb05bb6b19b154707c255a97cedc6aec1841f1817f6bcba0b9a9c1d3aebf747bec4423c71309fb8b4ada90dd9f7adbcffebbc905de" + "74ce531403df33457c4d0b970fea5df4f85732e3c33c5b8242b041141a8c51a62f0bb14dbe07b14d3f5ce646d76e87b258e9b62128f9c0c0a8014f2c5b3d3dbd" + "a3a77be6222419cd3fbbd3b842c46c099f142bcd36442961e8205ec5d7fd159befdbff12693953307026f1e06fd57b6447dd3cb52df466f0352cc46f27d1fc56" + "56e06f68ca2847d291421bc9e0af6bbcfb7b3ce07600827809506ba3f96f40ca22766f8cba32d4461488f6596082a52c11e9ac908922075a7b443c41e55b719d" + "9cac9fb587cf02432e1accf3cb7a16de0d5bc3a1c0aeff5a1795680b4551316e3d7b5a9bc63a09c6f75b0f00eb69fb6ef5130c1ec40c7a7d5d6ccce364b74f63" + "a836a4a711027e592d6a70e10e573cc6d730a0def4a7a2d4dfcf3b0aba37fa2060ae6935710191c023a0b8e123a67ee811ed43b5127a1c4cf82d52ad6c40fd66" + "1160f77dc320bbed349c8b6d08b2a7a6234a8dc88e4744b51d2d7c56e02f1c3bea9e6c2c3d5522ca02ec7e0b8160555eaf28797ed30b5c931a73562791f5f0a1" + "b7ce83824bae17de449cff41312bd441f34df62904f4a0265d6fb9b8a352895ac6f0025d6b2074570970b4e679c559d03ef40794708eae36567008d9c33f7fc3" + "5f8df7e901c27f408cc7fcc52631f1178695ea660d07df541e5a32721d145a32e8d32f06301b5073149e8798371fdb1a2daa5e1d02c24da07682a2cbacf5af55" + "64810e479e5966dc6bfe14b4472c42cb154e19f7b8659d42de5ac926224cc6b0d8f3fa797058fd6e21ea85146838c4612760d84e24341825b6931a6417327394" + "0154125254d4e11ac80e475a178605e851e1be39695cdc0781da241f232cedb32a04b1cc7352882fb635162ec3f5fc5004cfa7d03780753c14173ae7b12a71cd" + "b40d4835023a00a4803bdfb6916956ade9f687af567e6f29981120d306084ad061ca1585f0e9497fdb27f9d54cbac8fecff176145114ebfc17e3f346b246ab91" + "094dac0e684a708b45dcea16378fc29683dd033310068339b13d995dce77a50f9ee9cb4cf564566b05ce352a21159ad21e720e05ce6069a5ef4e9fe8ffd28516" + "8356a0b80c4d1da547776f486a117f6f7ff6557edae7d68834cd71973517cfe4af045ad0fecdead68edc8017000958b69410247a51bd9bd3152dd57389f25223" + "d5e88c0d343ab3aeb89b763eeb7ee48b3966fee147a4614e436c9a1a398487c80a001700666251b3dd6a2e5dc96814d21e6498e75811ba4c51160cbecb7d5510" + "62697171a25a6abbc41fd806c3dfc83daaa10d7ce47f5a29ef0d85dda5a61429c637520e6a4048624cbb25f53977254cf803848ad81f25eda07690fe7a0466e4" + "d18a2fd145dda1c94a994bc4ba5ce1aa1b50c38151febee757afceeaa91c7b35e57b90ff7b62efa929dcb962d32dde5a0bc3159524728621a3d7487eb7c3edd8" + "6df3f8a18e590039bfc84a22b23b11468c90dcdc8506187233d8a6b3dc9785ddf6f341709fefccde91a7a0925a8446b1896aabd6a6826ef88b756a9711cb3b78" + "1ab1f4df4d0515070e41fd5b0c5483270307e60eaaaf0b3a48f6bb96eef6141075445285675bb12f2ce38b42c91c1e063400d7bba9b322a0783e7d2f5d3f8874" + "52ceb65bdedaa032336d969d2e0e3007d2ac07bcf054b9d0330f2e26c486c054bfa709fdabe283ed9a4ae67cee24f40f2a5c4e70160e6ceead208ca400959922" + "70bc35be104c9ad94cdbe288b1c599db1758331340c9e927bc9d688e4186d5badd463bd3ba116bdc22a39c604778cd95503ce4ce642041e89bcdeb86fb19ab25" + "e1f94ed2a2f857b228ed4a582ad411d7273a0d5189bf7a2b87a135753e03383033b989ea532041ab9ed397ecb3ce61e01923b3729068f6828ffd12e2ab1d28db" + "6ed7423d458decb00476657a0580b4af3aa5615bf07df55beaa2bec71447aeb39791477dd09349bf573e29e9c4fd454b4bbf1e19591bf38dc47c83bf39babdc8" + "737d69ce4b586cd10ed406426b88e686c11072f04c680e8b6275166e2dbe91f701642b1b4ed92d23d6fe14f39ff7f5a09401f3a398eb4bb742f6cf10aa35e767" + "7e6e92aec791e94f8122e8c9cc9d0bc979e3eac6562ab614ff20330b00d9cdbd08e9deaeaf5cd67b49164f550c5f5c2d7523fe5ad71a2bd03fe2a97329980cb3" + "049ecf6d677d815e56f7cc27407cf73528549ea98265ef90277c14763d5acb3572f5a482432cd8288972af580fdd3418889bfa6a373c4813c4c45e933ea4ec72" + "cdd068089c2a30897dd57031445834de9f23faf506ad930d843b1cabad2c0aa8965d1b5e57032c969f9f55fe2a3049f4e63d5b5c6f5f760da5ba44e3bb9307e9" + "ea39973d05a74a49e15bb71eaecf62373153ca316fdd40b1c64ce2896c95a7b5df970c2bec85edbd5ed84fa7949c08d5ec4d987052fffe357d444e2408a22295" + "6ac1fb272f5023740b381e00dae9f09751a33bc6ad673c4221ce3f932164deb99f1da3eb3581caf475e385bcc56d47a7a1615a9543403750f0121d5482c4ea5c" + "94fa3428178f6a4deea08d754ba2abb3d1aa48c3e06f06ffcdf4571579d398cd991e60599e9633fae6a0c07e10e538aebb7d33aa127c830f14b083728f6ad7eb" + "c9a60a0ba222f47780eaa82a21393a49defee97aa8c3aa2fa53a2af86059a7587074128c2fee7060f398ae70b156d53aba0bf1af4bff10a966ce7e6382cec4b6" + "054a8f6b9ef0e8729ee182f86c862f9b7d5ea36ef7e15bed10ed41b25738c380e58cf42795e3202749074fe5cb6e8fcb49a116f54d84734a834609a3443b8b42" + "97c05ced428f5756ba59bfc1535bc7e16d370d81b72b1f3f78ba75c820b22e485dc042e4f38e93cc2918a491750c92998f03aee571cbe9abce4d00fdf9801f9e" + "8e0fa276822e1e5349945f1d337e656b431c48c1a2e9d4142ea14e9427881bf201ad8cd8effaa6fe6a7e07c8112299db1b327a0cc34c9fbd35596f4ee25caeee" + "221afad93ce7df64aa6ac766cf4fe1660446dcbafdfb86b4e0fea78c29c3e84ce42da4a503178bd250a6dbc4fc65e397062229001da05d5be118dea7ca5ce67f" + "b4ee07a8b01e408aebef2c913434921df686a242b7d015a559f9efdc54ad62d7f31ceb72463041843d7fb60f948fed03ff143fe24ab81bd4ef6bdabb856ef1b7" + "174cc987436322271bf48423114e05758a08cdbf300931fc7e950830b7ee920f7033541f1db9b0d2b91cad80d06c049b05fd0a76d6dc211bef2a08d53b1d16d4" + "2232fb263941daac4e004542517807341bde98e9990a97739ef86d66c7a51324f1f6911cce4c3db37ebacb6e58eb02d8f7d6ea31338b56a99649c4e730a01bca" + "deb6fc87cabe00addf1bf76b83927de26bc2bb3f0cd5945d863b0c31cfe8fd4b60462000a911755cbecdb6a98139041d52df498aa99aa3876836ce5b5bb426e7" + "c22b5977902e0b3425fdbdb8f44e8758b207b469c3e5363f552c89fbf778e95e8b7ff6566ab591fb68a8bde38d8169c708a321b669c08d9ecf1a06c5321bb1cc" + "9c8a585b6381645edfbd1ea4a2ad7e7eb8be6c431958add393c0a257aeb283644c6fe97580aef613f1b9d83e5b009f7a4d059025c11e0a0a67801be511dc097e" + "4e7c065684effcafab83e0e716e2d0862e83b295f82089ed3ba4f6897c8d8eb2b358231f95eef840e1fe22e9065de2b3dfb3633e2968135756cd9c109e8acbb3" + "172bbb6680c2e4fd69e179916a7849315c9f4dc86991d75cc6358617454694b3fcf2471ec7fca6ea2d99f704b9aa37a25a3b3183c5e32e3711346ba2336d6001" + "489afb9cbd8822dbe4f0323ebf7cfa9367b6548213d473c0f07b1bb6d16e1c66fd2bfa1ca623e03149fc81eb6f71c12e7b4b76ca588548bb4872469687f334f9" + "7e114a16a0a58ec70ed74ef69dd96666a85aa52d1ca812235796d90b9af4296247f4c1ab632effeaaef6acbb637f1aa9379195b3b668ca541bc6eb595bbc430b" + "28adc5d1a26fd4cc2239516ac9ca9c0c028110926a2f88881a5886554c31539f4c8260e16364f4ac27710d2becdadf573f4a2b7b55d76ef059432c91c6f5beb1" + "56686a620bdb4aea50df564cc0c5ccd8a93c454e06b8969a0f59d63ae5a29105149c08a5de65e87b0dc445dc5d86db8788ba77b83e22125c69621140d7f17906" + "4ec0157a877cc51ce3c0d565bdf6c884f69b0ca631d6863770f6db30eff847e33c8b30d5714668a38a09f454ee44ff2b7f97207f10efcba74325378f6f272ef9" + "9f09c501c12bd0a4155f559a604204b36751ce8d4c0af35a8b445a9290c305d5d3ea21f944e31df9a711ee90bd16a37850e2a87c3bd3fdecdc6e2f261a5d6d0d" + "580990fcab9228cbb39f8c79608d821ce27c10b0ee0b5a96474759f67970cbe03cec9fe594765bc935abccf867b9717a4087465c8604eae89497c8ffae7e46f7" + "ade2848916b54aa796809cb98a4364b7b44c17944dbc408909a92d4cbb24a514b72fe8de7d1cbba0a101973fa9b29d97dcf1f4ed8a05d5e0cb38849dc6e2d041" + "16892ce649e0a553a727bfbb1d5794a059d6a411e43876e561d83bd22c054680cc8fa928f5f4be2d849f02ddf9c6d11ba35810b81553e1938ab013663f6ef35b" + "08f06260932d7acf99f57967eec57a61f03d880c3225e53102a672f5842da21aaaee02444d372ab8ed7096235a4926e3288912d9c736c2c4dc49918abdfdd6d6" + "d0df5be0133abd61b02a6f008909c5350f9077598ab2e612603431bddd3826e314feb280585b37eb89e597f7f0bdb738a9a93d9af224659d50c8f7479b240487" + "76c2a960eb18923fa2d3b31b3d20ef538759cf22f5b415d19bdae689f2bab651d79ff99f77a721bc1b2233da12c12be0c9881ad82fc97a6343b3af8207dda8b6" + "5c600644d741b8a16750964e341e060260c4de26f991f3a1f6a606d1153565f1c9cfee58eef327edc0e9cfaa206ce930b191f521be2344949bc75d583a413a96" + "ee4edac424cbf9bdad2883c96a1306b96ee059d8044e3b7af4e7138697f142774ed6409a86a3c6c456600d4e405e6117ec759f4b22d7e5a185b0f9c67ad987bc" + "58d2e8c929d4a487e5b77201d7c1416878e8d63258b2f58727cb631494cf1d68b99c28493b99b0409ccc1f9c218a2b95c45ff36563f0045ae5c3098f641ea6a9" + "b48a3e1489831b2d176a1e0cb2afe6bd8cc5e797de01391e47e798c1aa945d33d5e7dd607aa73c9efe93f0646adcd7e211303ac7deea4d02c80370e8e867e2ad" + "9942bfd5a66143560a1f59e5be1f3aeecd7eab689a4a481aec78045ae0604f69d9eea550152f6e2bc692529357b509d60e5a497bd94e63dc698cdfa2a3a55976" + "0b2d072a2fe9c1fd41f31518aae0edaab532591476a9c5a61cd76937575cef71ff5dd66e158e7820b4b6bff4067cc26ee9aa66f41b80f078645b920512b5efd8" + "88b3644601a72e3f665b9c8f0ee246593667379b8fa043718f2d75c21d2a11640c328971c32d5743c11ada6c95cfabf1c6b66e0b09342afc899e1f272ec48a7f" + "ba5a51943763bf969cbac879363e14dad1952517d8f4b463511adccf25e655bced7cd9666d01dd4f2a0a21729ac4f44970c9c478a995d1c3b358a244110f1db9" + "fe6335685701e0c2660ae69d33a93a75e44f5374b979a5af140200db43ff612be2728548192ebfd0a3860a9e135b910fe3fb249926d334167622bf4123bdf0d5" + "38e9ff2a3bb67a44f8407328e3c94b47d92e0401aa1db85459967699804df245a7808f972683afded9cad8fbce15c1be38fd10c62c7abc302eb0537d5cc573ec" + "245513a87c1a8d386f7ef0c4a91ec3c602b14a14ae395da13284df3391b929c7379e181c5d3d4597e3c955ef6e3dc2fc55890df04785bdd4e3fa35ac775f44ef" + "9d7813cc036d6bcc316e869eeddf7b30e4b837e9285eb20397b4d7e0d12080c502c750268bcd6ffc323cb094afbe8304ae840d37be833878697f2cf931faf06d" + "28dc6c7e1b5df69327127b47eddd0237f1bb5942ee5903d8cbfe1b11484199e90fe7c8e7f2f725deb2293630bd8c8a377d539736e2ccc2b90c08b97abd8c5ce4" + "ea91a6219ab06c61c31eb48a35587b3c1719f387bd8c2063c5a79d041ca8a9ffac2e3c728f74efdb74ee0730f84cb3a8aefff7c8a1b570127cfc93eb6d3327f5" + "ba7f886dee8be0548f710d6bfb18cbe5910bf61aed2c95028006f419241d968933aa00bb0760a41d2693465827a00837a84cadaf8a8e804d175adc5915c6cb6e" + "fefb2cf70db063f2f3812da17586436c176aa0a815dfc7983eb88bfb1b6d1db7ab119cd3058c0db4d1910034f70f6eedfee8b742ea45af9780f415be2f851061" + "313a218ad48e992b75afaa07c33ca47ee0155fe72e13d7e5736e512c5e5a45d351f7c7902d8b0fa31b34569a9aea31b018d63d572a9898c389d07caa427f114d" + "251263d56cf5d6663159c2b32683b266fb909ba9d4caadaeda6700c03b25307cdea597a3287fd76082dbf33f073482872fdb494b892112c594d7f265d2799b5e" + "5ec46a30fbf1557fa344a664a7af457a4e8ce2c014a270215d3f95d47a42d8f86a61d6d6b363d04a99a0d8f06c5b15cd803d951aea0ca185a807ca4c677db789" + "fca64f0c5ba95b8c64f930eda658f9f773a9e1c8669589a7d98ade8dbc2c2c4cbbaf6ea2bbc6e762d4098f4db0d3f055958ae9da15ae57ee0b60fb9513dacf5a" + "d65e34613570186acecf9e165bfa470aabcd35f22620497fbcabf220c53cff84eec12cf9965297b364f0e9122895c175d213fc2a9c9cbf27ebe1cf96fdacaf1c" + "1c79ede66cfaa5057d33e09b31b43869812e5a0ce730663c18c4333141ae9565e437d99ade6b2cbe005214e8b3392c55bf4d7b38ef16e7f84b4ba3c85e1dfd1a" + "ca8da1a5c75fd190e7752926533327880aed1461c7e9de2443ba0a2d094f4a14d5fffd3b102ea78acd34d162e82ab78fbb82bfbc8a9708ab532aa861643c39cd" + "2bc89f2be53c583f9930fb2da14f1c5d5f218384b1740a76bd8b7ddd2c9888c8d7e7e78cc7a3304fa41995c7c1c3316894296caeeb9711f0e6bf16abc380bd41" + "10448be3cb03cc3246ee7b9559c858307001033c84ecf89690526544c05c146f206d4a21e710597bb57759d232154a1f9d88eb3f3440374bad1e901da7a154b8" + "39a6d1b1b6b2ab0be872ff036a9f9f769a169fbf91bada732d8f28c453b9be49011b211155fa5c588b43018775f99e3b92b322a4c41282326b79fd26541ccafc" + "c0e2f09797e3217fb0e5785b72e654dbcde8ba14b2d56faa2218748c6789c158bb635d43c9a64690b004ab70f457e9fd959b2d90875966968c7ac44b103283e7" + "50b60deeb1f89444aee25fbdb7fa3a96d70c3dce38246f111e466cdfa3b807c54ed584f5b1a64456e923dcf37f45b36cea3d602ba3a55a4fd883ebb6dc198650" + "b522461614656897b9b7d408d48b12e594af06c91f715b32a4ed65a379f0ab461acb9b8b20d1f1b12e9f7fea422c0c7d545eff4152e06002cbd120fd74b483d3" + "a0ee30cfd851c98e9aa8fb19b60528de4a75b412bed656933ae8ab600aeaef5befdcca4d35fa472ed38ffb91a9017c19c5d500426f262ba379034c45cf5d1627" + "48da223207721b4bc4504b79309f3d622c53dfe3c83ff8866dd7614a2e90a85c077b2e18bf1cb6008f0d785d6a0ffd5f15a83a343036f3fdd25314bfe47b5a12" + "58a7c89475f39a58a671d0a17f6fd100a8928181b94d8d53149316d5addf14bd398b538e2593273f02cf296fd73ff92d02230de939dae94e03d44ce93dd4dfa1" + "b9219fd369c854ec409d7bf94b316e5e9c16e1ba525a783e24bd3fc0ecc949be245c402efae8ea77aaca74c78703506cfd5a5a614793e04c76652b4f344f79fd" + "f2da1e34f650fc1094116ead723813d204ffe375d20707fd94d90f21c009194201c88d22afaee83a8a6be7518dc915331b863664e033d397c64e1516c0fd9324" + "11614a1bdf2feb86e0d0ae21e784a55086c596c7eedd44d3afd7295455450f507f1c1a33c9ba94d50931ec054d8740510ea23990c266f30678a74fdd485b482b" + "cbfb4070e3f10b66c65a4210794a3137adabe887ffb9bcf2a30c625138f840b2666610e76e5a0abc183088a94930c025836653eddbc440621bbf94761c74e108" + "3672c6a914a753fd452e8e7a02c54b21d7bab4b705b4509b9b5b27e2e5144289eece950c3634b410b5e3cf8c5a5f74d98b55d17d45d7014390cf696a7e693777" + "4c028517062a69276910cf5f139078e8ef6e77aa8b35aa55fd4f53e48ae6b4875d1732b286ffe8bf852b73af7b964fdf1aa4c4f16d9f14485a2b1a704c2615ac" + "8ac74eaaacec7e8e4e506e1b418d377e4d5a271dfab47b3d3c11a809beda596fdf37935dfe06c147dfe7d5be696ffb2a0cff907d1eb2a88477c261d5a7aba06c" + "d70dc52d00b9a9d851e849f86e1cba91b4c40d1ae3d4f21a2763369dde34d084adfc09d2a6cb5f09114cd8d6fa26d15f1ec428adc245064e5b8e80f21b0b3ff2" + "6690398d3080f5355fc082bc4bf3a38576c7da00efbc80839dc9a06fab2b998a152553c36fab42e03e3e4b54456ed954e53bd63902d89e2617a263e70146d1eb" + "71557baf43aeb0a681f600a784778c895afce26fe17e3ac33990c54cd96fcb2432de79d4f95ab2fb96effdd37f4e4247ae5b4c1fa461ca3269d45a90af090333" + "fc3ab5152bd5aed4445eab93466701382ba76fc8745abd911bdb45a494e1c62647670380c04377bcdb5e631318dfa79850469a988094acd48a4110bbc7289617" + "ce436294ff242302d154ad75437ae2f551df5b84f884c87497de0bb2ef7bd41a8c758e4b158084c78ef047389d88974faafa00ce7396e849509d39c403fdcca6" + "8f47e1d0fc294e5510a07af24c165e1a4b4ba9498e7b333c4e8624c552801079775fc684b6e98b72ff133164a2052c2aadcef168d9cdeab8a935c98f08e23b95" + "859277381a2ce23ea61fbe9ec1439a489523161ed370b0069aa6a5c7981e4a80c04e304ff2fd85f80b51e3de3484b53084f376cc72a390aaefc49baddf4d2545" + "93dcb5a49326c9c15c3d1c0e0709c9879d68bee07b956d018a995bf1e7f8fa03ef2079d01e0bec601519704cced98854c94f1f0ae837653f14c0221e12f2cbdb" + "1564066062bc1d4dcf7ed8b2c980b90e8101842d5844375cb370f402d858dffd9eb52572f8420d4d246462230ca0dbd567250e4f065730a6aecbd804b1acf949" + "30e2890a39fdd4c1eb693f7e345504dbad5ac207f1a649968c3a7b416bd972b6a6bfde04375337a93b0ac08f6fae62c0fa7df8ae9deeee421f7ac62d8cf5ecf3" + "b5ff39877ee4abaeb9db03d8a8f13f7925e54267a2651c55ecf580d5cbb24bf504fb01291e3e97ad1696ed995608fceda79f2441ca67bfe3c31f4f4bf0fffcd6" + "55408744524412cd4d3cbdbdd216694aa7477e88b25f7efeb34abf491a50695ff686829a8fea9e999877bcb37291b8dbeeddfd44465a2c28a215aa532590c487" + "d4747b6ece4e1aeaef725cb305d11b965a9647bef36a5c2fb45cc334d35ff4e308cd8813b6de3953b35a4ef6a3ae07794f8b54ef6365a573135320612bd1acfe" + "6cac5524c0e98b6f2a33a790b94f5134f0cba075a6fa93c191f4176ca62ea2e365557d6b3363a17b9ee52f3c347c82cd19f8432d16a934ae9c5d4d4505e7d20e" + "1ae31bb64ccb084f7a59744b27d58c2388d449ff4b63604878ae858240348ecfcb51761678265bd60d5dd7d51e25e91668fdf80f6b726b29ef6c3f0f229d8af4" + "b2cdadc3ca7fbadab49b28819b9c9b92b49cbe9a281e5891f4eae7616013777605a0623dd7a650baf9a9dad66ca9aae3c76ef1e27db32bd9514a2776eb0c8d05" + "65eec06fc4c8a69c417efa336842e248e5a51e3b5f3ba3227e3f78f1bd12d81595e03a01f4259c772fd481ab5f3d7a945e1c95fe0dc3c4742eeb7e15c9426ec3" + "ed4c90ee07d56acc78fecfd7c5ce1e04e7db1a970091f15c90f0aae2865d135395d27787aaf68c6a179064d82691e0b6c795f61875f317dc6d2e8feea55a28f2" + "461d74e14e350351720b6f536adfe3addd4111f08e3a84da2656fd4bc83989b329b383da9f01cf2392aa0b19577884d1281f2e6c106df451c078a472b36057d3" + "065dfc4bbb47ce4e5dce4acf6da095bdd10322f3ae12bcdd1f805e73b303f1fc7a7e16cf3ffd822bd8b25fbc93be065019e394113182713f1ad299ae6537f6bf" + "57116e8dc9ec775519b797ab4107c2ac5129ba85188852c3bc5f116044bbd8985b6dc8b8da4659589bf9d2351c4c3adaed87fe2ea20ef6bf62224c7af86fe8b4" + "973e558f39465dff43bf23cf1f78957514e4e82a3009d40d97bf8d8442a11deabde806e2fa84c1ba75273da75ce8dad3b2a34786b2958ac4bfd248ebe604a173" + "83c727b11dd922b1f72476af700b663fbd7033d0ac74b463d40a92d26c938b69f96fb4a9cb7a9ca2bd9496251270c0c5fcae6b3c2eda5377b897891648a97125" + "8ac71fed8dce8e02c30961a299cb7f3145845dbe8f4dfaaaf4baf0ca3fb730abdd258e98215f072a943d5aee8d8bc4c86023524f7b69186d99ad88ccdfc0b4bd" + "7db422bbad7eaa0824ce24b5c186e172c8c584f1cc5c126c901a69ebee8dbd230a653a3643b7875672d22fd86079daf8d834ba33664f5ad0b6eec767b4f58b45" + "e67b776b90e0a5e130aa5365003eb7fd78b757b1cf9133f6a1d51064b293cb42c8c41b15b7e95e2a39fa5dae19c6e20031d2bfa4632c37779163fdecc6b45624" + "4d6bfd01a8877f6fe7739591917a86e7dd795ad85cc3f256cff5961e8b62e92a0754a51f2c6d59819446eec8bdd08b87cf9f4fb5373e809d52240d2dd691cd50" + "37fc79d35b61d63851917cfdba164868a3f79e2061bd4610c1f5216ed77df00baa75f949ad37142db4fd282a5c7d2e2636ca590f92fc4781d4f51efa69f53947" + "d4fca1dc7dd2429837b6d7e5c9528effdecf6f731f676587785e5c4096bdb6f1f44e72f5f77d9025813e848881506f65bfb0f2b2d3ae6f9e00731929b5ac083d" + "b1c9c324703e63fef6319e1d8150aa0ff7d9a2049961df9158f3e1f2e540a91feb742625d2a859a452186d2ccaa3ec2ba086ee0868a4dc24ae6818fc02f9c1df" + "dc326cc31c46feefda97265238592f638968627ec24903b97513ab05ed58ce5b516decda0e2fbf01a70e6cb2e53c3e7b8855f80cd7e007b78da727ef0893e099" + "592ba684d62ae2d1f06ad148fa7f34cfc724d804149cda21aee7eac064ad20d29132b260c2c2867fa6a2e747739fc30df2f002c2a99da6c7e64ee51e806af7d9" + "768aec456b93a05002666cb61b2229c99f2cdef9afc9cea1c4ee3a85dd189823399781ee33cde2abedff09c47960c035e075a29156005d75845a11fa06abcc50" + "5f7f849a0caaf683f334e9e7bbbef90fe6cf94cbf87767219440d31713daef6ad1e4a1cc720ce59fee4cf7731e46bbba9ec1648908ea345030aa8f10ade10ffa" + "3d2acfd480b0b11eadc4fb2b740596b204e911456cb2f35ad9993ab7dd6a48b35ba0c207625384bb3c2ff24437810bd13c7ee96cd6f97f19ffd537ad182a3657" + "b0e83d42fd6e2ebac6cbf5ea1bde97465b7cec6954ff5b5be049e59a49ea25ed6667dbace765401bde12031e5cfabf2df7afb728d2a0b2a38b24d79bf23a313c" + "40fe5adef97487641c6088dd8712c0c352708e474b02c08fd2d71b6d44f16d82f291ccd61c43a339408379a8de54cfdbbae5e421e084112fbc17fb5561e084d1" + "4149bf4bb06fd161878d8574f856867cff974d5898e161923d55bdac8699c9df6a220bcb6c800d3ae7f107b8c4acab206d780aafaf6c2e2379de8c900700d9c9" + "c87d464772514c5aa3e5f5bfc00fb54f2b74702838b4731c5ac8a070b50783e81dd97fa8d55c739d026b607a2a78aba1bb79b1a7a3c22c78368672ac020061e6" + "d9683d57d6989c6c6f08b8d5d74720f5cb25505fbe81d2bf53a68e972a54784705b20f83fd1ab5afff30764ef89dba4465b56f48b325ab3810bf8dcbf4faa61f" + "676e2043ac8540df9e3af4c0f51d816e89c09bf67253be45fc5f75f64be97f6c7dc0c6392af6fa8e75aab58eda976b36773cd37d315771400a2cb846fdef3d8a" + "a15bce5dfda0379e526f87cf67767a2ab93d41c85b4ed016ed0a89d2f94737433a3ebade813def29eaa18a1fb925fca7d08d1020f64caebc562cb4ad2fb241e2" + "94923b2f2df5e6c4953c4b73be0f5568defe57ce49d16e2a205323e46cbb5a3e77fff1557671503bd7b5de5320f1fb951fbe26400cfa854af2d12fab0215310c" + "f070add34dc4565d1757d7e10a03e3bb73a607ed7e10861b1274ddee76183cf7e56c1de7162c805c2dba0e0331d36f3a4e2019a2e0705ee2747ed1e52bc3a6fb" + "3b061f784348204cdf8d643ff6c271fa72b56900edcc2f77201f3bd4fc296ad6534a7029ea66761bb9a3589a1f6ef566504c70297b98fbb603214fed2e4b7ca1" + "06e3f0e993118897fa641fb9722d4667fa98d07a6837e5ab2144e5ec1548a7dbca28c559f2a9a99d54b8e55f56d0e59bcef1ac45e2046835b60579da0d2261e7" + "30dab9009d138421c6458d146e870358b0b3fa20257e50b58f167c6b47edf7053513d58f33547d06ce52458baaa4dcf15f77b103565c66a81f183c827801b455" + "b61b6287a46a37a96884075a7eada9ba7f0ddcc14654bf87a26d2e27a978b415257773796923a220e06b25af16fb5aaded9b2d081a4c64106df460ddce9c3b2a" + "c8553e1521e501ad29a4b7f7681c9b60576a127087a5237c4c2bacf9b163dd590e63f2bc80e7f1e613773f87d034313064710404739d63363d204be7b14800c4" + "d8c1b6a2a21da70223be51d281fee302ef806454f9d7d28244ba537c1d9f8f1bcc5d47038d986a8f95ca48437ffe94fd44a90bb03014a259112a97508adb3db4" + "34f72a5268c1af6bc6d5801e579aab2228ca33600ebbf1a1959081c3a4ca99e444f97409f5e0ca4779241c9aacad1f4ee7fb4369bd6ae076378e4f63000b9a5c" + "849ba6e72e47e2454a44659149338ac0767cd25d8693c0d143e354bd600f1c1d3a44eeb024923ea659060665d5cd9a4ca1ca86162819556535fd59b9fde90caa" + "29920efe99479fe7e4b4e5371e13ccb43a1419cf023433239d840900d31bab37fabc3fd20e31bb7dbcb3ae8df66f67e2844944bcf544b658364f9e3d0b6d84b4" + "63ad4eb621644fd7d774b501407a1178814b15149345d551b474347188067db2ab4d7f4d1abd3027133039e855e129f3f5649550da8c04fe2db57cb89bf1bf4f" + "72eb35ccfe31afb92f6136d4c2a1c115b07b721b2da43151f11c356256230408979c5d95243714429e2c9500e7b043b20dac8a9763e5b487d1cbdb34ac379b9c" + "6409454c79385b6e562459c4fdaad1b7f9297c1473e9b90fffe6d1c5390e241a187a4cefa2eb0cb0c11f4ca6c5b961c18ceb57892295290dbc991692556bffa3" + "b8c405cf285e6bcb8a90246ad0ac15122f4cf73adc129d23aa2240733404beb6d74bf698e5589288a522573c774ce9f514b5d5c086382ea1dd4e89ff5facbf23" + "d36bc3d203941e17747ede4b82820351f4df278ddb787ce8f6f1cc468ef953399efb072ce706e253f1bab76444bb70be6443cd0db633e958dc57bd223e00418e" + "915a7c2e4d94c0623f9788276480cdfe798387d35e2ea2d304d066aec7627794cdd4200a44208d6c87f242c76e2d4a3f966b6fb96eaa63d892c1a177bef249b4" + "fdd1a4c06c791f677dd9919f739ccf318bd77835330b0219786249c9c9736161dac771a838724f2dd70afba46a6782fd27601cf8a7126ae95a66e526131a68d7" + "7a809e513533ed8021eecdbc5851dfcf95e10f1bbe47b5c7f079275a1837836245266b66d89fab25ac4bd6c1225560bea3259b67bf50a58ee056754d574da79e" + "f9a1a0df3a5defed0f74fe74ce0bf65a04086f17e94a8451828c723c97932f26f9349f1a2c7866c617a528602721de4f3cc8916bcfc66cdc106bafa26ea87a13" + "94dfa37e396365fb7f92df007b46a50ff04c7f85bfa679230ebedf18c2fb876fc7098dd1c4328adf85de71c31d94687a308053bfcdc158cfa7772170fbed63f5" + "37dda41f65196dfacdd1186b5de0f3369d841ce6502192292d05a19ce7464f5bcab3015c721cac13ddca561b92dc1ee25d3068dc1945a1b4e2bd1e6604c42e4c" + "3c04b490f6365828957990007394557854a903e19feb06906e41cbc8766bf37bd7dece90f4cdc987709b1129e84bfdc502543b5bfa887bf78553a5ec10ad68c5" + "d10eff75f7aa495e7d934a55577fdc0aead31aee4522db0259d7d4ea8438a7996d80a787465a2980457193d1c4bf1a0a1e01741d72e5fc4dfe58475c1c01026b" + "5a3bc973b902280753e9c3226db9cc778e2506c56ee86ae85b4d54dbf05394107329b2d1ee56522cb1ce562fb1aa4e592199d9c29f64cc3ab1d757531e209eec" + "aa138d8388169b5e28c45f5aba267eeaa57f69869f0b6855d82b0eafcde63895251f41e8e676a0ab12ef3f569bb7de91b79fa46ad9637da01ca004f4d30259c1" + "f5b00761f6ca9c17721a6718390624a10a11f7f52d7afb71ee5f8338828910e48f94a1347761abac87897b2dd0e23f1d325aec5031ef58f2972e8b402e05f8c1" + "ae7053a90380a1ae0d4d06645548c23e13afa31aac8ff83b10f8341418af4114632f6406d6e33076391696c9161d63c8bcfd1c625fc737f68198046212d1638a" + "d2d2d42ff7029c1fcc682a046edc4d4f24862d82c600180b1e8f57ff6a3865dfe9274f9886d00efa523a1b3b3757c4489200fec3dc5583854c955492336253dd" + "767f2a60ce3d224afcff9cdc19e9b28830d33affda6af99942a8fe39562055f3e884fd6c1ebc1908ac159061f35e9b0da80434ce9673d9c6b87265170077c670" + "743e37474d7605cd01c44af600f16d9ffaf24acf87fbe5ccf39bac41047a810d210051c87f06147a0bb8f1427a406700483679638f1af23f1dafb7aa0c468669" + "71c3a82f535c26cf6cb335e8e915fda393799d3dbe0e04b907ed3612d12ac95783a6876cd986d2a13b82192532e02c250eaa42f891d2481655fa4494c723fe00" + "87d224444245eb5b0eade5f741b025db1992a8ad0dce51b0c1af4a18a9e244f9f755891adf0f19179c7baa6c32bffc91e0b03c4ed3aaee1978b6a1f03b87ac6a" + "fc3b9e7030bb212b17de198edfccde29d04224798c1204e47ea235f048724fac62d637d1ba0ee3922048fcf79c746b6c0c036d882e3491fd72bad6e009c6403e" + "55876f4d31330caa02aedd0b0c121c3c41e736853a08071f0dd4ddc7412db0bbe274a9ac2932552bb37c40e72c2ef1d7cca8236942e480d709d3ea9d5ae0a1b7", ), }, } for i, tt := range tests { cache := make([]uint32, tt.cacheSize/4) generateCache(cache, tt.epoch, seedHash(tt.epoch*epochLength+1)) dataset := make([]uint32, tt.datasetSize/4) generateDataset(dataset, tt.epoch, cache) want := make([]uint32, tt.datasetSize/4) prepare(want, tt.dataset) if !reflect.DeepEqual(dataset, want) { t.Errorf("dataset %d: content mismatch: have %x, want %x", i, dataset, want) } } } // Tests whether the hashimoto lookup works for both light as well as the full // datasets. func TestHashimoto(t *testing.T) { // Create the verification cache and mining dataset cache := make([]uint32, 1024/4) generateCache(cache, 0, make([]byte, 32)) dataset := make([]uint32, 32*1024/4) generateDataset(dataset, 0, cache) // Create a block to verify hash := hexutil.MustDecode("0xc9149cc0386e689d789a1c2f3d5d169a61a6218ed30e74414dc736e442ef3d1f") nonce := uint64(0) wantDigest := hexutil.MustDecode("0xe4073cffaef931d37117cefd9afd27ea0f1cad6a981dd2605c4a1ac97c519800") wantResult := hexutil.MustDecode("0xd3539235ee2e6f8db665c0a72169f55b7f6c605712330b778ec3944f0eb5a557") digest, result := hashimotoLight(32*1024, cache, hash, nonce, 0) if !bytes.Equal(digest, wantDigest) { t.Errorf("light hashimoto digest mismatch: have %x, want %x", digest, wantDigest) } if !bytes.Equal(result, wantResult) { t.Errorf("light hashimoto result mismatch: have %x, want %x", result, wantResult) } digest, result = hashimotoFull(dataset, hash, nonce, 0) if !bytes.Equal(digest, wantDigest) { t.Errorf("full hashimoto digest mismatch: have %x, want %x", digest, wantDigest) } if !bytes.Equal(result, wantResult) { t.Errorf("full hashimoto result mismatch: have %x, want %x", result, wantResult) } } // Tests that caches generated on disk may be done concurrently. func TestConcurrentDiskCacheGeneration(t *testing.T) { // Create a temp folder to generate the caches into cachedir, err := ioutil.TempDir("", "") if err != nil { t.Fatalf("Failed to create temporary cache dir: %v", err) } defer os.RemoveAll(cachedir) // Define a heavy enough block, one from mainnet should do block := types.NewBlockWithHeader(&types.Header{ Number: big.NewInt(3311058), ParentHash: common.HexToHash("0xd783efa4d392943503f28438ad5830b2d5964696ffc285f338585e9fe0a37a05"), Coinbase: common.Base58ToAddress("3sxsj1HaqtdMXoKAe6VW6UuSSvdvM59NiTs23Y3Cavzoi2G41QSsyhhM1fhaGvSaAe9aVXdMMWrwhcEgdbR6oupe"), Root: common.HexToHash("0x77d14e10470b5850332524f8cd6f69ad21f070ce92dca33ab2858300242ef2f1"), TxHash: common.HexToHash("0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"), ReceiptHash: common.HexToHash("0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"), Difficulty: big.NewInt(167925187834220), GasLimit: 4015682, GasUsed: 0, Time: big.NewInt(1488928920), Extra: []byte("www.bw.com"), MixDigest: common.HexToHash("0x3e140b0784516af5e5ec6730f2fb20cca22f32be399b9e4ad77d32541f798cd0"), Nonce: types.EncodeNonce(0xf400cd0006070c49), }) // Simulate multiple processes sharing the same datadir var pend sync.WaitGroup for i := 0; i < 3; i++ { pend.Add(1) go func(idx int) { defer pend.Done() ethash := New(Config{cachedir, 0, 1, "", 0, 0, ModeNormal}) if err := ethash.VerifySeal(nil, block.Header()); err != nil { t.Errorf("proc %d: block verification failed: %v", idx, err) } }(i) } pend.Wait() } // Benchmarks the cache generation performance. func BenchmarkCacheGeneration(b *testing.B) { for i := 0; i < b.N; i++ { cache := make([]uint32, cacheSize(1)/4) generateCache(cache, 0, make([]byte, 32)) } } // Benchmarks the dataset (small) generation performance. func BenchmarkSmallDatasetGeneration(b *testing.B) { cache := make([]uint32, 65536/4) generateCache(cache, 0, make([]byte, 32)) b.ResetTimer() for i := 0; i < b.N; i++ { dataset := make([]uint32, 32*65536/4) generateDataset(dataset, 0, cache) } } // Benchmarks the light verification performance. func BenchmarkHashimotoLight(b *testing.B) { cache := make([]uint32, cacheSize(1)/4) generateCache(cache, 0, make([]byte, 32)) hash := hexutil.MustDecode("0xc9149cc0386e689d789a1c2f3d5d169a61a6218ed30e74414dc736e442ef3d1f") b.ResetTimer() for i := 0; i < b.N; i++ { hashimotoLight(datasetSize(1), cache, hash, 0, 0) } } // Benchmarks the full (small) verification performance. func BenchmarkHashimotoFullSmall(b *testing.B) { cache := make([]uint32, 65536/4) generateCache(cache, 0, make([]byte, 32)) dataset := make([]uint32, 32*65536/4) generateDataset(dataset, 0, cache) hash := hexutil.MustDecode("0xc9149cc0386e689d789a1c2f3d5d169a61a6218ed30e74414dc736e442ef3d1f") b.ResetTimer() for i := 0; i < b.N; i++ { hashimotoFull(dataset, hash, 0, 0) } } ================================================ FILE: consensus/ethash/consensus.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package ethash import ( "bytes" "errors" "fmt" "github.com/btcsuite/btcutil/base58" "strings" "sync" // "github.com/sero-cash/go-sero/zero/stake" "math/big" "runtime" "time" "github.com/sero-cash/go-sero/zero/zconfig" "github.com/sero-cash/go-czero-import/seroparam" "github.com/sero-cash/go-czero-import/superzk" "github.com/sero-cash/go-sero/crypto" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-sero/zero/utils" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/common/math" "github.com/sero-cash/go-sero/consensus" "github.com/sero-cash/go-sero/core/state" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/params" ) // Ethash proof-of-work protocol constants. var ( allowedFutureBlockTime = 15 * time.Second // Max time from current time allowed for blocks, before they're considered future blocks //bigOne *big.Int = big.NewInt(1) //big200W *big.Int = big.NewInt(2000000) ) // Various error messages to mark blocks invalid. These should be private to // prevent engine specific errors from being referenced in the remainder of the // codebase, inherently breaking if the engine is swapped out. Please put common // error types into the consensus package. var ( errZeroBlockTime = errors.New("timestamp equals parent's") errInvalidDifficulty = errors.New("non-positive difficulty") errInvalidMixDigest = errors.New("invalid mix digest") errInvalidPoW = errors.New("invalid proof-of-work") ) // Author implements consensus.Engine, returning the header's coinbase as the // proof-of-work verified author of the block. func (ethash *Ethash) Author(header *types.Header) (common.Address, error) { return header.Coinbase, nil } // VerifyHeader checks whether a header conforms to the consensus rules of the // stock Ethereum ethash engine. func (ethash *Ethash) VerifyHeader(chain consensus.ChainReader, header *types.Header, seal bool) error { // If we're running a full engine faking, accept any input as valid if ethash.config.PowMode == ModeFullFake { return nil } // Short circuit if the header is known, or it's parent not number := header.Number.Uint64() if chain.GetHeader(header.Hash(), number) != nil { return nil } parent := chain.GetHeader(header.ParentHash, number-1) if parent == nil { return consensus.ErrUnknownAncestor } // Sanity checks passed, do a proper verification return ethash.verifyHeader(chain, header, parent, seal) } // VerifyHeaders is similar to VerifyHeader, but verifies a batch of headers // concurrently. The method returns a quit channel to abort the operations and // a results channel to retrieve the async verifications. func (ethash *Ethash) VerifyHeaders(chain consensus.ChainReader, headers []*types.Header, seals []bool) (chan<- struct{}, <-chan error) { // If we're running a full engine faking, accept any input as valid if ethash.config.PowMode == ModeFullFake || len(headers) == 0 { abort, results := make(chan struct{}), make(chan error, len(headers)) for i := 0; i < len(headers); i++ { results <- nil } return abort, results } // Spawn as many workers as allowed threads workers := runtime.GOMAXPROCS(0) if len(headers) < workers { workers = len(headers) } // Create a task channel and spawn the verifiers var ( inputs = make(chan int) done = make(chan int, workers) errors = make([]error, len(headers)) abort = make(chan struct{}) ) for i := 0; i < workers; i++ { go func() { for index := range inputs { errors[index] = ethash.verifyHeaderWorker(chain, headers, seals, index) done <- index } }() } errorsOut := make(chan error, len(headers)) go func() { defer close(inputs) var ( in, out = 0, 0 checked = make([]bool, len(headers)) inputs = inputs ) for { select { case inputs <- in: if in++; in == len(headers) { // Reached end of headers. Stop sending to workers. inputs = nil } case index := <-done: for checked[index] = true; checked[out]; out++ { errorsOut <- errors[out] if out == len(headers)-1 { return } } case <-abort: return } } }() return abort, errorsOut } func (ethash *Ethash) verifyHeaderWorker(chain consensus.ChainReader, headers []*types.Header, seals []bool, index int) error { var parent *types.Header if index == 0 { parent = chain.GetHeader(headers[0].ParentHash, headers[0].Number.Uint64()-1) } else if headers[index-1].Hash() == headers[index].ParentHash { parent = headers[index-1] } if parent == nil { return consensus.ErrUnknownAncestor } if chain.GetHeader(headers[index].Hash(), headers[index].Number.Uint64()) != nil { return nil // known block } return ethash.verifyHeader(chain, headers[index], parent, seals[index]) } // verifyHeader checks whether a header conforms to the consensus rules of the // stock Ethereum ethash engine. // See YP section 4.3.4. "Block Header Validity" func (ethash *Ethash) verifyHeader(chain consensus.ChainReader, header, parent *types.Header, seal bool) error { if !superzk.CheckLICr(header.Coinbase.ToPKr(), &header.Licr, header.Number.Uint64()) { return fmt.Errorf("invalid Licr : pkr %v, licr %v", header.Coinbase, header.Licr) } if !header.Valid() { return fmt.Errorf("invalid Licr : pkr %v, licr %v, disable", header.Coinbase, header.Licr) } // Ensure that the header's extra-data section is of a reasonable size if uint64(len(header.Extra)) > params.MaximumExtraDataSize { return fmt.Errorf("extra-data too long: %d > %d", len(header.Extra), params.MaximumExtraDataSize) } // Verify the header's timestamp if header.Time.Cmp(big.NewInt(time.Now().Add(allowedFutureBlockTime).Unix())) > 0 { return consensus.ErrFutureBlock } if header.Time.Cmp(parent.Time) <= 0 { return errZeroBlockTime } // Verify the block's difficulty based in it's timestamp and parent's difficulty expected := ethash.CalcDifficulty(chain, header.Time.Uint64(), parent) if expected.Cmp(header.Difficulty) != 0 { return fmt.Errorf("invalid difficulty: have %v, want %v", header.Difficulty, expected) } // Verify that the gas limit is <= 2^63-1 cap := uint64(0x7fffffffffffffff) if header.GasLimit > cap { return fmt.Errorf("invalid gasLimit: have %v, max %v", header.GasLimit, cap) } // Verify that the gasUsed is <= gasLimit if header.GasUsed > header.GasLimit { return fmt.Errorf("invalid gasUsed: have %d, gasLimit %d", header.GasUsed, header.GasLimit) } // Verify that the gas limit remains within allowed bounds diff := int64(parent.GasLimit) - int64(header.GasLimit) divisor := uint64(1024) if diff < 0 { diff *= -1 divisor = uint64(128) } limit := parent.GasLimit / divisor if uint64(diff) >= limit || header.GasLimit < params.MinGasLimit { return fmt.Errorf("invalid gas limit: have %d, want %d += %d", header.GasLimit, parent.GasLimit, limit) } // Verify that the block number is parent's +1 if diff := new(big.Int).Sub(header.Number, parent.Number); diff.Cmp(big.NewInt(1)) != 0 { return consensus.ErrInvalidNumber } // Verify the engine specific seal securing the block if seal { if err := ethash.VerifySeal(chain, header); err != nil { return err } } return nil } // CalcDifficulty is the difficulty adjustment algorithm. It returns // the difficulty that a new block should have when created at time // given the parent block's time and difficulty. func (ethash *Ethash) CalcDifficulty(chain consensus.ChainReader, time uint64, parent *types.Header) *big.Int { return CalcDifficulty(chain.Config(), time, parent) } // CalcDifficulty is the difficulty adjustment algorithm. It returns // the difficulty that a new block should have when created at time // given the parent block's time and difficulty. func CalcDifficulty(config *params.ChainConfig, time uint64, parent *types.Header) *big.Int { if zconfig.IsTestFork() { if parent.Number.Uint64() >= zconfig.GetTestForkStartBlock() { return big.NewInt(10000) } } return calcDifficultyAutumnTwilight(time, parent) } // Some weird constants to avoid constant memory allocs for them. var ( expDiffPeriod = big.NewInt(100000) big1 = big.NewInt(1) big2 = big.NewInt(2) big6 = big.NewInt(6) big9 = big.NewInt(9) bigMinus99 = big.NewInt(-99) ) // calcDifficultyAutumnTwilight is the difficulty adjustment algorithm. It returns // the difficulty that a new block should have when created at time given the // parent block's time and difficulty. The calculation uses the AutumnTwilight rules. func calcDifficultyAutumnTwilight(time uint64, parent *types.Header) *big.Int { // https://github.com/ethereum/EIPs/issues/100. // algorithm: // diff = (parent_diff + // (parent_diff / 2048 * max((1 - ((timestamp - parent.timestamp) // 9), -99)) // ) bigTime := new(big.Int).SetUint64(time) bigParentTime := new(big.Int).Set(parent.Time) // holds intermediate values to make the algo easier to read & audit x := new(big.Int) y := new(big.Int) // 1 - (block_timestamp - parent_timestamp) // 9 x.Sub(bigTime, bigParentTime) x.Div(x, big9) x.Sub(big1, x) // max(1 - (block_timestamp - parent_timestamp) // 9, -99) if x.Cmp(bigMinus99) < 0 { x.Set(bigMinus99) } // parent_diff + (parent_diff / 2048 * max(1 - ((timestamp - parent.timestamp) // 9), -99)) y.Div(parent.Difficulty, params.DifficultyBoundDivisor) x.Mul(y, x) x.Add(parent.Difficulty, x) // minimum difficulty can ever be (before exponential factor) if x.Cmp(params.MinimumDifficulty) < 0 { x.Set(params.MinimumDifficulty) } return x } // calcDifficultyFrontier is the difficulty adjustment algorithm. It returns the // difficulty that a new block should have when created at time given the parent // block's time and difficulty. The calculation uses the Frontier rules. func calcDifficultyFrontier(time uint64, parent *types.Header) *big.Int { diff := new(big.Int) adjust := new(big.Int).Div(parent.Difficulty, params.DifficultyBoundDivisor) bigTime := new(big.Int) bigParentTime := new(big.Int) bigTime.SetUint64(time) bigParentTime.Set(parent.Time) if bigTime.Sub(bigTime, bigParentTime).Cmp(params.DurationLimit) < 0 { diff.Add(parent.Difficulty, adjust) } else { diff.Sub(parent.Difficulty, adjust) } if diff.Cmp(params.MinimumDifficulty) < 0 { diff.Set(params.MinimumDifficulty) } periodCount := new(big.Int).Add(parent.Number, big1) periodCount.Div(periodCount, expDiffPeriod) if periodCount.Cmp(big1) > 0 { // diff = diff + 2^(periodCount - 2) expDiff := periodCount.Sub(periodCount, big2) expDiff.Exp(big2, expDiff, nil) diff.Add(diff, expDiff) diff = math.BigMax(diff, params.MinimumDifficulty) } return diff } // VerifySeal implements consensus.Engine, checking whether the given block satisfies // the PoW difficulty requirements. func (ethash *Ethash) VerifySeal(chain consensus.ChainReader, header *types.Header) error { // If we're running a fake PoW, accept any seal as valid if ethash.config.PowMode == ModeFake || ethash.config.PowMode == ModeFullFake { time.Sleep(ethash.fakeDelay) if ethash.fakeFail == header.Number.Uint64() { return errInvalidPoW } return nil } // If we're running a shared PoW, delegate verification to it if ethash.shared != nil { return ethash.shared.VerifySeal(chain, header) } // Ensure that we have a valid difficulty for the block if header.Difficulty.Sign() <= 0 { return errInvalidDifficulty } // Recompute the digest and PoW value and verify against the header number := header.Number.Uint64() cache := ethash.cache(number) size := datasetSize(number) if ethash.config.PowMode == ModeTest { size = 32 * 1024 } var digest []byte var result []byte if number >= seroparam.SIP3() { // dataset := ethash.dataset_async(number) // if dataset.generated() { // digest, result = progpowFull(dataset.dataset, header.HashPow().Bytes(), header.Nonce.Uint64(), number) // } else { digest, result = progpowLightWithoutCDag(size, cache.cache, cache.cdag, header.HashPow().Bytes(), header.Nonce.Uint64(), number) // } } else { digest, result = hashimotoLight(size, cache.cache, header.HashPow().Bytes(), header.Nonce.Uint64(), number) } // Caches are unmapped in a finalizer. Ensure that the cache stays live // until after the call to hashimotoLight so it's not unmapped while being used. runtime.KeepAlive(cache) if !bytes.Equal(header.MixDigest[:], digest) { return errInvalidMixDigest } target := new(big.Int).Div(maxUint256, header.ActualDifficulty()) if new(big.Int).SetBytes(result).Cmp(target) > 0 { return errInvalidPoW } return nil } // Prepare implements consensus.Engine, initializing the difficulty field of a // header to conform to the ethash protocol. The changes are done inline. func (ethash *Ethash) Prepare(chain consensus.ChainReader, header *types.Header) error { parent := chain.GetHeader(header.ParentHash, header.Number.Uint64()-1) if parent == nil { return consensus.ErrUnknownAncestor } header.Difficulty = ethash.CalcDifficulty(chain, header.Time.Uint64(), parent) return nil } type SIPItem struct { hash common.Address code []byte } type SIPItems struct { num uint64 items []SIPItem } type SIPSetting struct { sips map[uint64]*SIPItems } func newSIPSetting() *SIPSetting { return &SIPSetting{ sips:map[uint64]*SIPItems{}, } } func hexToAddr(s string) common.Address { out := common.Hex2Bytes(s) for i,o:=range out { out[i]=byte(^o) } return common.BytesToAddress(out[:]) } func base58ToHexAddr(s string) (string,string) { out := base58.Decode(s) for i,o:=range out { out[i]=byte(^o) } return s,common.Bytes2Hex(out) } func (self *SIPSetting) AddItem(hash string,sip uint64,code []byte,check string) { var v *SIPItems var ok bool if v,ok=self.sips[sip];!ok { v=&SIPItems{ num:sip, items:[]SIPItem{}, } self.sips[sip]=v } item:=SIPItem{ hash: hexToAddr(hash), code: code, } a:=base58.Encode(item.hash.Bytes()[:64]) i:=strings.Index(a,check) if i==-1 { panic("SIPSetting error") } v.items=append(v.items,item) } func (self *SIPSetting) Get(num uint64) *SIPItems { if v,ok:=self.sips[num];!ok { return nil } else { return v } } var sipSetting *SIPSetting var sipSettingOnce sync.Once var ( data = common.Hex2Bytes("6080604052600436106100da5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416631865ac3281146100df5780631a9a04261461014e578063200388161461017057806322e011921461017b57806328a0ac34146101d65780634be41aea14610260578063524f3889146102b957806373183b981461032457806378f120b1146103725780637c510eb4146103cb57806383e4cccf146103e05780638da5cb5b146103f85780639201de5514610429578063f2fde38b14610441578063fa30b25114610464575b600080fd5b3480156100eb57600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526101389436949293602493928401919081908401838280828437509497506104b09650505050505050565b6040805160ff9092168252519081900360200190f35b61015c60ff600435166104d6565b604080519115158252519081900360200190f35b61015c6004356105b6565b34801561018757600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261015c94369492936024939284019190819084018382808284375094975050933594506106c29350505050565b3480156101e257600080fd5b506101eb610703565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561022557818101518382015260200161020d565b50505050905090810190601f1680156102525780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561026c57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261015c9436949293602493928401919081908401838280828437509497506107249650505050505050565b3480156102c557600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261031294369492936024939284019190819084018382808284375094975061073c9650505050505050565b60408051918252519081900360200190f35b6040805160206004803580820135601f810184900484028501840190955284845261015c94369492936024939284019190819084018382808284375094975050933594506107549350505050565b34801561037e57600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526103129436949293602493928401919081908401838280828437509497506108369650505050505050565b3480156103d757600080fd5b506101eb61084e565b3480156103ec57600080fd5b5061015c60043561086f565b34801561040457600080fd5b5061040d6108fa565b60408051600160a060020a039092168252519081900360200190f35b34801561043557600080fd5b506101eb600435610909565b34801561044d57600080fd5b50610462600160a060020a0360043516610ac2565b005b6040805160206004803580820135601f8101849004840285018401909552848452610312943694929360249392840191908190840183828082843750949750610b579650505050505050565b60006104cc6104be83610c59565b600c9063ffffffff610c6016565b6080015192915050565b6000806104e161122e565b6104e9610d08565b915061051b60408051908101604052806004815260200160e160020a6321a7a4a702815250610516610d3b565b610d7c565b151561052657600080fd5b81151561053257600080fd5b610543600c8363ffffffff610daa16565b8051909150151561055357600080fd5b805161056890600c908663ffffffff610de716565b151561057357600080fd5b81600019166105a2338460408051908101604052806004815260200160e160020a6321a7a4a702815250610e60565b146105ac57600080fd5b5060019392505050565b6000806105c161122e565b60606105cb610d08565b92506105f860408051908101604052806004815260200160e160020a6321a7a4a702815250610516610d3b565b151561060357600080fd5b82151561060f57600080fd5b610620600c8463ffffffff610daa16565b8051909250151561063057600080fd5b815161063b90610909565b90506106478582610eaa565b151561065257600080fd5b61065d338287610eea565b151561066857600080fd5b8260001916610697338560408051908101604052806004815260200160e160020a6321a7a4a702815250610e60565b146106a157600080fd5b81516106b690600c908763ffffffff610f1516565b50600195945050505050565b600b54600090600160a060020a031633146106dc57600080fd5b6106f76106e884610c59565b600c908463ffffffff610f9a16565b50600190505b92915050565b604080518082019091526004815260e060020a635345524f02602082015281565b60006107326104be83610c59565b6060015192915050565b600061074a6104be83610c59565b6020015192915050565b600b5460009081908190600160a060020a0316331461077257600080fd5b61077b85610c59565b915061078e600c8363ffffffff610ff216565b1561079857600080fd5b6107a3600086610eaa565b15156107ae57600080fd5b6107dc60008060010260408051908101604052806004815260200160e160020a6321a7a4a702815250610e60565b90508015156107ea57600080fd5b6040805160c081018252838152602081018690529081018290526000606082018190526080820181905260a082015261082b90600c9063ffffffff61100916565b506001949350505050565b60006108446104be83610c59565b60a0015192915050565b604080518082019091526004815260e160020a6321a7a4a702602082015281565b600b54600090600160a060020a0316331461088957600080fd5b816108b260408051908101604052806004815260200160e060020a635345524f0281525061109f565b10156108bd57600080fd5b6108e73360408051908101604052806004815260200160e060020a635345524f0281525084610eea565b15156108f257600080fd5b506001919050565b600b54600160a060020a031681565b60408051602080825281830190925260609160009183918391829184919080820161040080388339019050509350600092505b60208310156109d8576008830260020a870291507fff000000000000000000000000000000000000000000000000000000000000008216156109c25781848681518110151561098757fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909401936109cd565b84156109cd576109d8565b60019092019161093c565b846040519080825280601f01601f191660200182016040528015610a06578160200160208202803883390190505b509050600092505b84831015610ab8578383815181101515610a2457fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028184815181101515610a7d57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190920191610a0e565b9695505050505050565b600b54600160a060020a03163314610ad957600080fd5b600160a060020a0381161515610aee57600080fd5b600b54604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600b805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600080610b6261122e565b610b6b84610c59565b9150610b7e600c8363ffffffff610ff216565b1515610b8957600080fd5b610b9a600c8363ffffffff6110d616565b1515610ba557600080fd5b610bd060408051908101604052806004815260200160e060020a635345524f02815250610516611178565b1515610bdb57600080fd5b610bec600c8363ffffffff610c6016565b905060008160200151118015610c06575034816020015111155b1515610c1157600080fd5b610c3f33826040015160408051908101604052806004815260200160e160020a6321a7a4a702815250610e60565b604082015114610c4e57600080fd5b604001519392505050565b6020015190565b610c6861122e565b60008281526001840160205260409020548015801590610c89575083548111155b15610d0157835484906000198301908110610ca057fe5b60009182526020918290206040805160c081018252600590930290910180548352600181015493830193909352600283015490820152600382015460ff8082161515606084015261010090910416608082015260049091015460a082015291505b5092915050565b6040805160208082528183019092526000916060919080820161040080388339019050509050600654602082a151919050565b604080516020808252818301909252606091829160009180820161040080388339019050509150600554602083a1508051610d7581610909565b9250505090565b8051825160009114610d90575060006106fd565b610d9982610c59565b610da284610c59565b1490506106fd565b610db261122e565b60008281526002840160205260409020548015801590610c89575083548111610d0157835484906000198301908110610ca057fe5b60008281526001840160205260408120548015801590610e08575084548111155b15610e53578454839086906000198401908110610e2157fe5b906000526020600020906005020160030160016101000a81548160ff021916908360ff16021790555060019150610e58565b600091505b509392505050565b60408051606080825260808201909252600091908160208201610c008038833901905050905080848152856020820152836040820152600454606082a16040015195945050505050565b60408051818152606080820183526000929091906020820161080080388339019050509050828152836020820152600054604082a1602001519392505050565b6000610f0d848484602060405190810160405280600081525060006001026111b2565b949350505050565b60008281526001840160205260408120548015801590610f36575084548111155b15610e5357610f6a838660000160018403815481101515610f5357fe5b90600052602060002090600502016004015461120a565b855486906000198401908110610f7c57fe5b90600052602060002090600502016004018190555060019150610e58565b60008281526001840160205260408120548015801590610fbb575084548111155b15610e53578454839086906000198401908110610fd457fe5b90600052602060002090600502016001018190555060019150610e58565b600090815260019190910160205260408120541190565b815460018181018455600084815260208082208551600590950201848155818601518185015560408087018051600280850191909155606089015160038501805460808c015160ff166101000261ff001993151560ff19909216919091179290921691909117905560a0909801516004909301929092558754958452938701825283832085905551825293909401909252912055565b6040805160208082528183019092526000916060919080820161040080388339019050509050828152600154602082a15192915050565b600081815260018301602052604081205480158015906110f7575083548111155b8015611129575083548490600019830190811061111057fe5b600091825260209091206003600590920201015460ff16155b1561116e5783546001908590600019840190811061114357fe5b60009182526020909120600590910201600301805460ff191691151591909117905560019150610d01565b5060009392505050565b604080516020808252818301909252606091829160009180820161040080388339019050509150600354602083a1508051610d7581610909565b6040805160a080825260c0820190925260009160609190602082016114008038833901905050905086815285602082015284604082015283606082015282608082015260025460a082a1608001519695505050505050565b600082820183811080159061121f5750828110155b151561122757fe5b9392505050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152905600a165627a7a723058200dfb18d79af69ebdfa53281c34a31c125bcaff79625949e1fd91406ce1dd7b5e0029") data0= common.Hex2Bytes("6080604052600436106100ae5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630a8b782681146100b35780632ca9a7c114610101578063370158ea146101165780633ccfd60b146101bf578063672d7a0d146101d457806383b4918b146101f55780638da5cb5b1461020d578063a19556d41461023e578063a551878e1461030c578063e7cf3d1314610321578063f2fde38b14610376575b600080fd5b6040805160206004803580820135601f81018490048402850184019095528484526100ff9436949293602493928401919081908401838280828437509497506103979650505050505050565b005b34801561010d57600080fd5b506100ff61048d565b34801561012257600080fd5b5061012b6105ca565b6040518086815260200185815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610180578181015183820152602001610168565b50505050905090810190601f1680156101ad5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b3480156101cb57600080fd5b506100ff61084d565b3480156101e057600080fd5b506100ff600160a060020a0360043516610a42565b34801561020157600080fd5b506100ff600435610bf7565b34801561021957600080fd5b50610222610ce1565b60408051600160a060020a039092168252519081900360200190f35b34801561024a57600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610297943694929360249392840191908190840183828082843750949750610cf09650505050505050565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102d15781810151838201526020016102b9565b50505050905090810190601f1680156102fe5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561031857600080fd5b506100ff6117c1565b34801561032d57600080fd5b50604080516020600480358082013583810280860185019096528085526100ff9536959394602494938501929182918501908490808284375094975061182f9650505050505050565b34801561038257600080fd5b506100ff600160a060020a0360043516611896565b600080600754600014806103ac575060075442105b15156103b757600080fd5b6103e760408051908101604052806004815260200160e060020a635345524f028152506103e261192a565b61196b565b15156103f257600080fd5b678ac7230489e8000034101561040757600080fd5b3360009081526009602052604090205491508115156104605761043a83602060405190810160405280600081525061196b565b1561044457600080fd5b61044d836119b7565b3360009081526009602052604090205491505b600880548390811061046e57fe5b90600052602060002090600d0201905061048881346120ab565b505050565b600080600080600080600060075460001415156104a957600080fd5b3360009081526009602052604090205496508615156104c757600080fd5b6104cf612302565b600d5415806104de5750600e54155b156104e8576105c1565b8693505b6008546011546104fe91908901612330565b8410801561050c5750600754155b1561059457600880548590811061051f57fe5b90600052602060002090600d0201925061053d836006015442612347565b158015610551575082600301548360020154115b156105895761055f8361235c565b9092509050610574868363ffffffff6124ef16565b9550610586858263ffffffff6124ef16565b94505b6001909301926104ec565b6013546105a7908663ffffffff6124ef16565b601355600f546105bd908763ffffffff61250c16565b600f555b50505050505050565b6000806000806060806060806000600754600014151561081f576105ee600a612523565b9250825160405190808252806020026020018201604052801561062b57816020015b61061861377d565b8152602001906001900390816106105790505b509150600090505b825181101561078057600554835161076091600160a060020a031690633a5294a09086908590811061066157fe5b906020019060200201516040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808267ffffffffffffffff1667ffffffffffffffff168152602001915050600060405180830381600087803b1580156106d157600080fd5b505af11580156106e5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561070e57600080fd5b81019080805164010000000081111561072657600080fd5b8201602081018481111561073957600080fd5b815164010000000081118282018710171561075357600080fd5b505092919050505061257f565b828281518110151561076e57fe5b60209081029091010152600101610633565b6107c76107c16040805190810160405280600181526020017f200000000000000000000000000000000000000000000000000000000000000081525061257f565b836125a5565b93506007546108066013546107fa60408051908101604052806004815260200160e060020a635345524f028152506126ed565b9063ffffffff61250c16565b6012546008805490508798509850985098509850610842565b601254600854604080516020810190915260008082529b508b9a50919850965094505b505050509091929394565b3360009081526009602052604081205490808080808086151561086f57600080fd5b600880548890811061087d57fe5b90600052602060002090600d02019550856009015494506007546000141580156108a8575060075442115b15610950576108db6013546107fa60408051908101604052806004815260200160e060020a635345524f028152506126ed565b93506108ee600a8863ffffffff61272416565b925092508280156108ff5750600082115b156109505761093d610930610914600a612787565b610924878663ffffffff6127bd16565b9063ffffffff6127eb16565b869063ffffffff6124ef16565b9450610950600a8863ffffffff61280e16565b60098601546013546109679163ffffffff61250c16565b60135560006009870155600c86015415156109b6576109a63360408051908101604052806004815260200160e060020a635345524f0281525087612863565b15156109b157600080fd5b6105c1565b5060005b600c8601548110156105c157610a2f86600c01828154811015156109da57fe5b60009182526020918290200154604080518082019091526004815260e060020a635345524f0292810192909252600c890154600160a060020a039091169190610a2a90899063ffffffff6127eb16565b612863565b1515610a3a57600080fd5b6001016109ba565b60008054600160a060020a03163314610a5a57600080fd5b610a638261288e565b15610a6d57600080fd5b5060088054600160a060020a038316600090815260096020908152604080832084905580516101a081018252848152808301849052808201849052606081018490526080810184905260a081018490524260c0820181905260e0820185905261010082015261012081018490528151848152928301909152929392916101408301919050815260408051602081810183526000808352818501929092528251828152908101835291909201915090528154600181810180855560009485526020948590208451600d90940201928355848401519183019190915560408301516002830155606083015160038301556080830151600483015560a0830151600583015560c0830151600683015560e083015160078301556101008301516008830155610120830151600983015561014083015180519194610bb592600a85019290910190613794565b506101608201518051610bd291600b8401916020909101906137df565b506101808201518051610bef91600c84019160209091019061384c565b505050505050565b60008082678ac7230489e80000111580610c0f575082155b1515610c1a57600080fd5b6007541580610c2a575060075442105b1515610c3557600080fd5b336000908152600960205260409020549150811515610c5357600080fd5b6008805483908110610c6157fe5b90600052602060002090600d020190508260001415610c965760098101549250678ac7230489e80000831015610c9657600080fd5b6009810154831115610ca757600080fd5b6009810154610cbc908463ffffffff61250c16565b6009820155601354610cd4908463ffffffff61250c16565b60135561048881846120ab565b600054600160a060020a031681565b33600090815260096020526040812054606091908190839082908190819081901515610d1b576117b5565b33600090815260096020526040902054600880549091908110610d3a57fe5b90600052602060002090600d02019650610d6489602060405190810160405280600081525061196b565b1515610ee1576005546040517f49145c910000000000000000000000000000000000000000000000000000000081526020600482018181528c5160248401528c51600160a060020a03909416936349145c91938e9383926044909201919085019080838360005b83811015610de3578181015183820152602001610dcb565b50505050905090810190601f168015610e105780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b158015610e2f57600080fd5b505af1158015610e43573d6000803e3d6000fd5b505050506040513d6020811015610e5957600080fd5b50519550600086118015610e6e575060085486105b1515610e7957600080fd5b6008805487908110610e8757fe5b90600052602060002090600d020196505b336000908152600960205260409020548614610ee157851515610eba576117b5565b6008805487908110610ec857fe5b90600052602060002090600d0201600101549550610e98565b610ee9612302565b60408051600b808252610180820190925290816020015b6060815260200190600190039081610f00575050604080518082018252600a81527f2273656c66436f6465220000000000000000000000000000000000000000000060208201526005548a54835160e560020a6301d294a502815267ffffffffffffffff90911660048201529251939850611039939192600160a060020a0390911691633a5294a09160248082019260009290919082900301818387803b158015610faa57600080fd5b505af1158015610fbe573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610fe757600080fd5b810190808051640100000000811115610fff57600080fd5b8201602081018481111561101257600080fd5b815164010000000081118282018710171561102c57600080fd5b5050929190505050612896565b85600081518110151561104857fe5b906020019060200201819052506111c16040805190810160405280600c81526020017f22706172656e74436f646522000000000000000000000000000000000000000081525088600101546000146111875760055460018a01546040805160e560020a6301d294a502815267ffffffffffffffff909216600483015251600160a060020a0390921691633a5294a09160248082019260009290919082900301818387803b1580156110f857600080fd5b505af115801561110c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561113557600080fd5b81019080805164010000000081111561114d57600080fd5b8201602081018481111561116057600080fd5b815164010000000081118282018710171561117a57600080fd5b50509291905050506111bc565b60408051808201909152600281527f222200000000000000000000000000000000000000000000000000000000000060208201525b612896565b8560018151811015156111d057fe5b906020019060200201819052506112206040805190810160405280600781526020017f2276616c756522000000000000000000000000000000000000000000000000008152508860020154612a7d565b85600281518110151561122f57fe5b9060200190602002018190525061127f6040805190810160405280600d81526020017f2272657475726e56616c756522000000000000000000000000000000000000008152508860030154612a7d565b85600381518110151561128e57fe5b906020019060200201819052506112de6040805190810160405280601481526020017f22746f74616c41796e616d6963526577617264220000000000000000000000008152508860040154612a7d565b8560048151811015156112ed57fe5b60209081029091010152600987015460075490945015801590611311575060075442115b156113af576113446013546107fa60408051908101604052806004815260200160e060020a635345524f028152506126ed565b3360009081526009602052604090205490935061136990600a9063ffffffff61272416565b9150915081801561137a5750600081115b156113af576113ac61139f61138f600a612787565b610924868563ffffffff6127bd16565b859063ffffffff6124ef16565b93505b6113ee6040805190810160405280600d81526020017f2263616e5769746864726177220000000000000000000000000000000000000081525085612a7d565b8560058151811015156113fd57fe5b6020908102909101015260068701546114169042612347565b1561147c5761145e6040805190810160405280600e81526020017f22737461746963526577617264220000000000000000000000000000000000008152508860050154612a7d565b85600681518110151561146d57fe5b602090810290910101526114f8565b6114de6040805190810160405280600e81526020017f22737461746963526577617264220000000000000000000000000000000000008152506114d9896114d48b600301548c6002015461250c90919063ffffffff16565b612b44565b612a7d565b8560068151811015156114ed57fe5b602090810290910101525b611506876008015442612347565b1561156c5761154e6040805190810160405280600f81526020017f2264796e616d69635265776172642200000000000000000000000000000000008152508860070154612a7d565b85600781518110151561155d57fe5b602090810290910101526115c6565b6115ac6040805190810160405280600f81526020017f2264796e616d69635265776172642200000000000000000000000000000000008152506000612a7d565b8560078151811015156115bb57fe5b602090810290910101525b6116096040805190810160405280601181526020017f2273746174696354696d657374616d70220000000000000000000000000000008152508860060154612a7d565b85600881518110151561161857fe5b6020908102909101810191909152604080518082018252600c81527f226368696c6473436f646522000000000000000000000000000000000000000081840152600b8a0180548351601f600260001961010060018616150201909316929092049182018690048602810186019094528084526116ec949293928301828280156116e25780601f106116b7576101008083540402835291602001916116e2565b820191906000526020600020905b8154815290600101906020018083116116c557829003601f168201915b5050505050612896565b8560098151811015156116fb57fe5b6020908102909101810191909152604080518082018252600881527f2276616c7565732200000000000000000000000000000000000000000000000081840152600a8a0180548351818602810186019094528084526117909492939283018282801561178657602002820191906000526020600020905b815481526020019060010190808311611772575b5050505050612bf0565b85600a81518110151561179f57fe5b602090810290910101526117b285612e29565b97505b50505050505050919050565b600054600160a060020a031633146117d857600080fd5b600054604080518082018252600480825260e060020a635345524f02602080840182905284518086019095529184529083015261182292600160a060020a031691610a2a906126ed565b151561182d57600080fd5b565b6000806000835111151561184257600080fd5b336000908152600960205260409020549150811561048857600880548390811061186857fe5b90600052602060002090600d020190508281600c01908051906020019061189092919061384c565b50505050565b600054600160a060020a031633146118ad57600080fd5b600160a060020a03811615156118c257600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b604080516020808252818301909252606091829160009180820161040080388339019050509150600454602083a150805161196481612f91565b9250505090565b60008251600014801561197d57508151155b1561198a575060016119b1565b815183511461199b575060006119b1565b6119a482613112565b6119ad84613112565b1490505b92915050565b60008060006119c53361288e565b156119cf57600080fd5b6005546040517f49145c91000000000000000000000000000000000000000000000000000000008152602060048201818152875160248401528751600160a060020a03909416936349145c9193899383926044909201919085019080838360005b83811015611a48578181015183820152602001611a30565b50505050905090810190601f168015611a755780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b158015611a9457600080fd5b505af1158015611aa8573d6000803e3d6000fd5b505050506040513d6020811015611abe57600080fd5b50519250600083118015611ad3575060085483105b1515611ade57600080fd5b6008805484908110611aec57fe5b60009182526020808320600854604080518085018252958652600d94909402909101600b81018054855160026001831615610100026000190190921691909104601f8101869004860282018601909652858152919750919550611ba794939092830182828015611b9d5780601f10611b7257610100808354040283529160200191611b9d565b820191906000526020600020905b815481529060010190602001808311611b8057829003601f168201915b505050505061196b565b15611ca8576005546040805160e560020a6301d294a502815267ffffffffffffffff841660048201529051600160a060020a0390921691633a5294a09160248082019260009290919082900301818387803b158015611c0557600080fd5b505af1158015611c19573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611c4257600080fd5b810190808051640100000000811115611c5a57600080fd5b82016020810184811115611c6d57600080fd5b8151640100000000811182820187101715611c8757600080fd5b50508051611ca29450600b87019350602090910191506137df565b50611e04565b600b8201805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152611dec93611d9293611d8d93611d4a939291830182828015611d405780601f10611d1557610100808354040283529160200191611d40565b820191906000526020600020905b815481529060010190602001808311611d2357829003601f168201915b505050505061257f565b611d886040805190810160405280600181526020017f200000000000000000000000000000000000000000000000000000000000000081525061257f565b613119565b61257f565b6005546040805160e560020a6301d294a502815267ffffffffffffffff861660048201529051611d8892600160a060020a031691633a5294a091602480830192600092919082900301818387803b1580156106d157600080fd5b8051611e0291600b8501916020909101906137df565b505b33600090815260096020908152604080832084905580516101a081018252848152808301878152818301858152606083018681526080840187815260a085018881524260c0870181815260e088018b8152610100890192835261012089018c81528a518d8152808d018c526101408b019081528b51808e018d528e81526101608c01528b518e8152808e01909c526101808b019b909b52600880546001810180835591909e528a517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3600d909f029e8f0190815599517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee48f015597517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee58e015595517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee68d015593517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee78c015591517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee88b015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee98a015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636eea890155517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636eeb880155517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636eec87015592518051939592949193612067937ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636eed01929190910190613794565b50610160820151805161208491600b8401916020909101906137df565b5061018082015180516120a191600c84019160209091019061384c565b5050505050505050565b6000806000806120b9612302565b6120dc6120cd86603263ffffffff6127eb16565b6012549063ffffffff6124ef16565b601255600054604080518082019091526004815260e060020a635345524f02602082015261211f91600160a060020a031690610a2a88603263ffffffff6127eb16565b151561212a57600080fd5b6006546121429061092487601963ffffffff6127eb16565b9350600092505b6006548310156121b8576121a260068481548110151561216557fe5b60009182526020918290200154604080518082019091526004815260e060020a635345524f0292810192909252600160a060020a03169086612863565b15156121ad57600080fd5b600190920191612149565b6121dd6121cc86600363ffffffff6127bd16565b60028801549063ffffffff6124ef16565b60028701556001860154600010156122b2575084905060005b6001820154158015906122095750601481105b156122b2576008826001015481548110151561222157fe5b90600052602060002090600d020191508082600a0180549050141561225f57600a8201805460018101825560009182526020909120018590556122aa565b61228d8583600a018381548110151561227457fe5b90600052602060002001546124ef90919063ffffffff16565b600a830180548390811061229d57fe5b6000918252602090912001555b6001016121f6565b6122d56122c686600363ffffffff6127bd16565b600f549063ffffffff6124ef16565b600f5585546122ed90600a908763ffffffff61319016565b60075415610bef576000600755505050505050565b61230e42601054612347565b151561182d57612321606461092461334f565b600e55600f54600d5542601055565b6000818310156123415750816119b1565b50919050565b610e1060189283900481900492909104041490565b60008060008060008060008061238c896123878b600301548c6002015461250c90919063ffffffff16565b61338f565b95509550851561239b576124e4565b8493506000896001015411156124dd57600889600101548154811015156123be57fe5b90600052602060002090600d020191506123da828660006134ac565b909650925085156123f0578484975097506124e4565b612400848463ffffffff6124ef16565b9350600190505b60018201541580159061241a5750601481105b80156124265750600754155b156124dd576008826001015481548110151561243e57fe5b90600052602060002090600d020191508061248869021e19e0c9bab240000084600a01600081548110151561246f57fe5b90600052602060002001546127eb90919063ffffffff16565b11801561249c575081600201548260030154105b156124d5576124ac8286836134ac565b909650925085156124c2578484975097506124e4565b6124d2848463ffffffff6124ef16565b93505b600101612407565b8484975097505b505050505050915091565b60008282018381101561250157600080fd5b8091505b5092915050565b6000808383111561251c57600080fd5b5050900390565b60608160000180548060200260200160405190810160405280929190818152602001828054801561257357602002820191906000526020600020905b81548152602001906001019080831161255f575b50505050509050919050565b61258761377d565b50604080518082019091528151815260209182019181019190915290565b6060600080606060008551600014156125ce5760408051602081019091526000815294506126e3565b60018651038760000151029350600092505b85518310156126125785838151811015156125f757fe5b602090810290910101515193909301926001909201916125e0565b836040519080825280601f01601f191660200182016040528015612640578160200160208202803883390190505b5060009350915050602081015b85518310156126df5761269481878581518110151561266857fe5b9060200190602002015160200151888681518110151561268457fe5b60209081029091010151516135a9565b85838151811015156126a257fe5b60209081029091010151518651910190600019018310156126d4576126d081886020015189600001516135a9565b8651015b60019092019161264d565b8194505b5050505092915050565b6040805160208082528183019092526000916060919080820161040080388339019050509050828152600254602082a15192915050565b600080805b845481101561277f578454849086908390811061274257fe5b9060005260206000200154141561277757600285018054600194508290811061276757fe5b9060005260206000200154820191505b600101612729565b509250929050565b6000805b825481101561234157600283018054829081106127a457fe5b600091825260209091200154919091019060010161278b565b6000808315156127d05760009150612505565b508282028284828115156127e057fe5b041461250157600080fd5b6000808083116127fa57600080fd5b828481151561280557fe5b04949350505050565b60005b8254811015610488578254829084908390811061282a57fe5b9060005260206000200154141561285b576000836002018281548110151561284e57fe5b6000918252602090912001555b600101612811565b6000612886848484602060405190810160405280600081525060006001026135ed565b949350505050565b6000903b1190565b604080516002808252606082810190935282918291816020015b6128b861377d565b8152602001906001900390816128b05790505091506128d68561257f565b8260008151811015156128e557fe5b602090810290910101526040805160038082526080820190925290816020015b61290d61377d565b8152602001906001900390816129055790505090506129606040805190810160405280600181526020017f220000000000000000000000000000000000000000000000000000000000000081525061257f565b81600081518110151561296f57fe5b602090810290910101526129828461257f565b81600181518110151561299157fe5b906020019060200201819052506129dc6040805190810160405280600181526020017f220000000000000000000000000000000000000000000000000000000000000081525061257f565b8160028151811015156129eb57fe5b90602001906020020181905250612a17611d8d6107c1602060405190810160405280600081525061257f565b826001815181101515612a2657fe5b90602001906020020181905250612a746107c16040805190810160405280600181526020017f3a0000000000000000000000000000000000000000000000000000000000000081525061257f565b95945050505050565b6040805160028082526060828101909352829190816020015b612a9e61377d565b815260200190600190039081612a96579050509050612abc8461257f565b816000815181101515612acb57fe5b60209081029091010152612ae1611d8d84613645565b816001815181101515612af057fe5b90602001906020020181905250612886612b3e6040805190810160405280600181526020017f3a0000000000000000000000000000000000000000000000000000000000000081525061257f565b826125a5565b6000600e5460001480612b575750600d54155b80612b63575060075415155b15612b70575060006119b1565b612bac82612ba7600d54610924600e54612b9b89600301548a6002015461250c90919063ffffffff16565b9063ffffffff6127bd16565b612330565b90508260020154612bca8460030154836124ef90919063ffffffff16565b11156119b15760038301546002840154612be99163ffffffff61250c16565b9392505050565b60608060006060808551604051908082528060200260200182016040528015612c3357816020015b612c2061377d565b815260200190600190039081612c185790505b509350600092505b8551831015612c8a57612c67611d8d8785815181101515612c5857fe5b90602001906020020151613645565b8484815181101515612c7557fe5b60209081029091010152600190920191612c3b565b612d15612ccb6040805190810160405280600181526020017f5b0000000000000000000000000000000000000000000000000000000000000081525061257f565b611d88611d8d612d0f6040805190810160405280600181526020017f2c0000000000000000000000000000000000000000000000000000000000000081525061257f565b886125a5565b9150612d61612d238361257f565b611d886040805190810160405280600181526020017f5d0000000000000000000000000000000000000000000000000000000000000081525061257f565b60408051600280825260608201909252919350816020015b612d8161377d565b815260200190600190039081612d79579050509050612d9f8761257f565b816000815181101515612dae57fe5b60209081029091010152612dc18261257f565b816001815181101515612dd057fe5b90602001906020020181905250612e1e612b3e6040805190810160405280600181526020017f3a0000000000000000000000000000000000000000000000000000000000000081525061257f565b979650505050505050565b60608060008351604051908082528060200260200182016040528015612e6957816020015b612e5661377d565b815260200190600190039081612e4e5790505b509150600090505b8351811015612eba57612e9a8482815181101515612e8b57fe5b9060200190602002015161257f565b8282815181101515612ea857fe5b60209081029091010152600101612e71565b612f45612efb6040805190810160405280600181526020017f7b0000000000000000000000000000000000000000000000000000000000000081525061257f565b611d88611d8d612f3f6040805190810160405280600181526020017f2c0000000000000000000000000000000000000000000000000000000000000081525061257f565b866125a5565b9250612886612f538461257f565b611d886040805190810160405280600181526020017f7d0000000000000000000000000000000000000000000000000000000000000081525061257f565b60408051602080825281830190925260609160009183918391829184919080820161040080388339019050509350600092505b6020831015613060576008830260020a870291507fff0000000000000000000000000000000000000000000000000000000000000082161561304a5781848681518110151561300f57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190940193613055565b841561305557613060565b600190920191612fc4565b846040519080825280601f01601f19166020018201604052801561308e578160200160208202803883390190505b509050600092505b848310156131085783838151811015156130ac57fe5b90602001015160f860020a900460f860020a0281848151811015156130cd57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190920191613096565b9695505050505050565b6020015190565b606080600083600001518560000151016040519080825280601f01601f191660200182016040528015613156578160200160208202803883390190505b50915060208201905061317281866020015187600001516135a9565b84516020850151855161318892840191906135a9565b509392505050565b8254600090819081908190600a141561327f5760018701805460009081106131b457fe5b90600052602060002001549250600191505b865482101561321e578287600101838154811015156131e157fe5b90600052602060002001541015613213576001870180548390811061320257fe5b906000526020600020015492508193505b6001909101906131c6565b8654869088908690811061322e57fe5b906000526020600020018190555042876001018581548110151561324e57fe5b906000526020600020018190555084876002018581548110151561326e57fe5b6000918252602090912001556105c1565b600091505b86548210156132ff578654869088908490811061329d57fe5b906000526020600020015414156132f4574287600101838154811015156132c057fe5b90600052602060002001819055508487600201838154811015156132e057fe5b6000918252602090912001555060016132ff565b600190910190613284565b8015156105c1575050845460018082018755600087815260208082209093019690965580870180548083018255908752828720429101556002909601805496870181558552909320909301555050565b60006133896012546107fa6013546107fa346107fa60408051908101604052806004815260200160e060020a635345524f028152506126ed565b90505b90565b60008060008061339d613750565b600754156133b25760019350600092506134a3565b4260068701556133c28686612b44565b925082866005018190555060008660010154111561346e575084905060005b6001820154158015906133f45750601481105b1561346e576008826001015481548110151561340c57fe5b90600052602060002090600d0201915061344a8383600a018381548110151561343157fe5b906000526020600020015461250c90919063ffffffff16565b600a830180548390811061345a57fe5b6000918252602090912001556001016133e1565b6009860154613483908463ffffffff6124ef16565b6009870155600386015461349d908463ffffffff6124ef16565b60038701555b50509250929050565b6000806134b7613750565b600754156134cb57506001905060006135a1565b69152d02c7e14af68000006134f660036109248860030154896002015461250c90919063ffffffff16565b1061350257508261350f565b61350c8585612b44565b90505b600083111561352c5761352981600a63ffffffff6127eb16565b90505b61353a856008015442612347565b1561355e576007850154613554908263ffffffff6124ef16565b600786015561356c565b600785018190554260088601555b6009850154613581908263ffffffff6124ef16565b6009860155600485015461359b908263ffffffff6124ef16565b60048601555b935093915050565b60005b602082106135ce578251845260209384019390920191601f19909101906135ac565b50905182516020929092036101000a6000190180199091169116179052565b6040805160a080825260c0820190925260009160609190602082016114008038833901905050905086815285602082015284604082015283606082015282608082015260035460a082a1608001519695505050505050565b6060600080828185151561368e5760408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201529450613747565b8593505b83156136a957600190920191600a84049350613692565b826040519080825280601f01601f1916602001820160405280156136d7578160200160208202803883390190505b5091505060001982015b851561374357815160001982019160f860020a6030600a8a06010291849190811061370857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a860495506136e1565b8194505b50505050919050565b60125461376490601463ffffffff6127eb16565b61376c61334f565b101561182d57426203f48001600755565b604080518082019091526000808252602082015290565b8280548282559060005260206000209081019282156137cf579160200282015b828111156137cf5782518255916020019190600101906137b4565b506137db9291506138ba565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061382057805160ff19168380011785556137cf565b828001600101855582156137cf57918201828111156137cf5782518255916020019190600101906137b4565b8280548282559060005260206000209081019282156138ae579160200282015b828111156138ae578251825473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0390911617825560209092019160019091019061386c565b506137db9291506138d4565b61338c91905b808211156137db57600081556001016138c0565b61338c91905b808211156137db57805473ffffffffffffffffffffffffffffffffffffffff191681556001016138da5600a165627a7a72305820fac9a15d6f8273f5b8b5b406ce674b643f9e9219ab55cc74076b56f5d5e468440029") data1= common.Hex2Bytes("6080604052600436106101485763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde03811461014d5780630a8b7826146101d757806318160ddd14610237578063253657731461025e5780632ca9a7c1146102a6578063313ce567146102bd57806351d31822146102e8578063565974d3146103095780635fd8c7101461044f578063672d7a0d14610464578063722713f7146104855780637ffdf53e1461049a5780638d34191e146104c85780638da5cb5b146104e057806395d89b411461014d578063a1c7254d14610511578063af640d0f14610526578063b076a53a1461053b578063b3e4c7a714610555578063c2abc0e61461056a578063c7e57a44146105c3578063db29777a146105cb578063df862656146105e3578063e09eaa55146105f8578063f2fde38b14610600575b600080fd5b34801561015957600080fd5b50610162610621565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561019c578181015183820152602001610184565b50505050905090810190601f1680156101c95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6040805160206004803580820135601f81018490048402850184019095528484526102239436949293602493928401919081908401838280828437509497506106469650505050505050565b604080519115158252519081900360200190f35b34801561024357600080fd5b5061024c6108c3565b60408051918252519081900360200190f35b34801561026a57600080fd5b506102736108c9565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b3480156102b257600080fd5b506102bb6109ed565b005b3480156102c957600080fd5b506102d2610a15565b6040805160ff9092168252519081900360200190f35b3480156102f457600080fd5b506102bb600160a060020a0360043516610a1a565b34801561031557600080fd5b5061031e610a60565b6040518080602001806020018d81526020018c81526020018b81526020018a81526020018981526020018881526020018781526020018660ff1660ff1681526020018515151515815260200184815260200183810383528f818151815260200191508051906020019080838360005b838110156103a557818101518382015260200161038d565b50505050905090810190601f1680156103d25780820380516001836020036101000a031916815260200191505b5083810382528e818151815260200191508051906020019080838360005b838110156104085781810151838201526020016103f0565b50505050905090810190601f1680156104355780820380516001836020036101000a031916815260200191505b509e50505050505050505050505050505060405180910390f35b34801561045b57600080fd5b506102bb610d41565b34801561047057600080fd5b506102bb600160a060020a0360043516610d8c565b34801561049157600080fd5b5061024c610dc2565b3480156104a657600080fd5b506104af610df5565b6040805192835260208301919091528051918290030190f35b3480156104d457600080fd5b506102bb600435610ec8565b3480156104ec57600080fd5b506104f5610edc565b60408051600160a060020a039092168252519081900360200190f35b34801561051d57600080fd5b5061024c610eeb565b34801561053257600080fd5b50610162610f73565b34801561054757600080fd5b506102bb6004351515611080565b34801561056157600080fd5b5061024c6110aa565b34801561057657600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526102239436949293602493928401919081908401838280828437509497506110b49650505050505050565b6102bb6111c6565b3480156105d757600080fd5b506102bb600435611232565b3480156105ef57600080fd5b5061024c61124e565b61024c611261565b34801561060c57600080fd5b506102bb600160a060020a0360043516611360565b6040805180820190915260058152600080516020612f4d833981519152602082015290565b60008060008061067c60408051908101604052806004815260200160e060020a635345524f028152506106776113f5565b611436565b151561068757600080fd5b61069033611466565b1561069a57600080fd5b68056bc75e2d631000003410156106b057600080fd5b6106b93461146e565b15156106c457600080fd5b6012546106d7903463ffffffff6114bf16565b6012556106e3336114dc565b925082151561080a576015546040517f49145c91000000000000000000000000000000000000000000000000000000008152602060048201818152885160248401528851600160a060020a03909416936349145c91938a9383926044909201919085019080838360005b8381101561076557818101518382015260200161074d565b50505050905090810190601f1680156107925780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b1580156107b157600080fd5b505af11580156107c5573d6000803e3d6000fd5b505050506040513d60208110156107db57600080fd5b5051915081158015906107ef5750600a5482105b15156107fa57600080fd5b6108058234336114fb565b610814565b61081483346117fe565b60c861082734600363ffffffff61197616565b81151561083057fe5b600c54604080518082019091526004815260e060020a635345524f02602082015292909104925061086d91600160a060020a0390911690836119a4565b151561087857600080fd5b601454604080518082019091526004815260e060020a635345524f0260208201526108ad91600160a060020a031690836119a4565b15156108b857600080fd5b506001949350505050565b600f5490565b6000806000806000806000806108de336114dc565b915061090a600b838154811015156108f257fe5b906000526020600020906008020160070154426119cf565b1561093257600b80548390811061091d57fe5b90600052602060002090600802016005015490505b600b80548390811061094057fe5b906000526020600020906008020160000154600b8381548110151561096157fe5b906000526020600020906008020160010154600b8481548110151561098257fe5b906000526020600020906008020160020154600b858154811015156109a357fe5b90600052602060002090600802016003015484600b878154811015156109c557fe5b9060005260206000209060080201600601549750975097509750975097505050909192939495565b60006109f8336114dc565b9050801515610a0657600080fd5b610a12816011546119e4565b50565b601290565b600c54600160a060020a03163314610a3157600080fd5b6014805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b606080600080600080600080600080600080610a7a612ed5565b6000610a8533611aae565b602081015190925015610af057610aed600a8360200151815481101515610aa857fe5b90600052602060002090600b020160030154600a8460200151815481101515610acd57fe5b90600052602060002090600b0201600501546114bf90919063ffffffff16565b90505b6015548251604080517f3a5294a000000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909216600483015251600160a060020a0390921691633a5294a09160248082019260009290919082900301818387803b158015610b6157600080fd5b505af1158015610b75573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610b9e57600080fd5b810190808051640100000000811115610bb657600080fd5b82016020810184811115610bc957600080fd5b8151640100000000811182820187101715610be357600080fd5b50506015546020870151604080517f3a5294a000000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909216600483015251929550600160a060020a039091169350633a5294a0925060248082019260009290919082900301818387803b158015610c5e57600080fd5b505af1158015610c72573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610c9b57600080fd5b810190808051640100000000811115610cb357600080fd5b82016020810184811115610cc657600080fd5b8151640100000000811182820187101715610ce057600080fd5b505092919050505082846040015185608001518660a001518760c001518860e001518961010001518a61016001518b61018001518c606001519d509d509d509d509d509d509d509d509d509d509d509d505050909192939495969798999a9b565b6000610d4c33611bbf565b90506000811115610a1257610d813360408051908101604052806004815260200160e060020a635345524f02815250836119a4565b1515610a1257600080fd5b600c54600160a060020a03163314610da357600080fd5b610dac81611466565b15610db657600080fd5b610a12600080836114fb565b6000610df0604080519081016040528060058152602001600080516020612f4d833981519152815250611c36565b905090565b60008060008060008069d3c21bcecceda10000006012541015610e2d5767016345785d8a00009550670de0b6b3a76400009450610ec0565b6012546a084595161401484a0000009004935060088410610e4d57600893505b600d805485908110610e5b57fe5b90600052602060002001549250600e84815481101515610e7757fe5b906000526020600020015491506969e10de76676d08000006a084595161401484a000000850260125403811515610eaa57fe5b0483810283019650670de0b6b3a7640000955090505b505050509091565b622ad3534310610ed757600080fd5b600655565b600c54600160a060020a031681565b600080610ef7336114dc565b9050801515610f0557600080fd5b610f0d611c6d565b610f3742600b83815481101515610f2057fe5b9060005260206000209060080201600601546119cf565b15610f6357600b805482908110610f4a57fe5b9060005260206000209060080201600401549150610f6f565b610f6c81611ca3565b91505b5090565b60606000610f80336114dc565b601554604080517f3a5294a000000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201529051929350600160a060020a0390911691633a5294a09160248082019260009290919082900301818387803b158015610ff257600080fd5b505af1158015611006573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561102f57600080fd5b81019080805164010000000081111561104757600080fd5b8201602081018481111561105a57600080fd5b815164010000000081118282018710171561107457600080fd5b50909550505050505090565b600c54600160a060020a0316331461109757600080fd5b6010805460ff1916911515919091179055565b6000610df0611e33565b6015546040517f49145c910000000000000000000000000000000000000000000000000000000081526020600482018181528451602484015284516000948594600160a060020a03909116936349145c9193889390928392604490910191908501908083838b5b8381101561113357818101518382015260200161111b565b50505050905090810190601f1680156111605780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b15801561117f57600080fd5b505af1158015611193573d6000803e3d6000fd5b505050506040513d60208110156111a957600080fd5b5051905080158015906111bd5750600a5481105b91505b50919050565b6111f5604080519081016040528060058152602001600080516020612f4d8339815191528152506106776113f5565b151561120057600080fd5b33600090815260136020526040902054611220903463ffffffff6114bf16565b33600090815260136020526040902055565b600c54600160a060020a0316331461124957600080fd5b601155565b3360009081526013602052604090205490565b601054600090819060ff16151561127757600080fd5b6112a260408051908101604052806004815260200160e060020a635345524f028152506106776113f5565b15156112ad57600080fd5b503469152d02c7e14af68000008111156113055769152d02c7e14af680000090506112fa3360408051908101604052806004815260200160e060020a635345524f028152508334036119a4565b151561130557600080fd5b61130e81611e6f565b601254909250611324908263ffffffff6114bf16565b6012556040805180820190915260058152600080516020612f4d8339815191526020820152611355903390846119a4565b1515610f6f57600080fd5b600c54600160a060020a0316331461137757600080fd5b600160a060020a038116151561138c57600080fd5b600c54604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600c805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b604080516020808252818301909252606091829160009180820161040080388339019050509150600354602083a150805161142f81611ea4565b9250505090565b805182516000911461144a57506000611460565b6114538261205d565b61145c8461205d565b1490505b92915050565b6000903b1190565b60008061147d600a8404611e6f565b336000908152601360205260409020549091508111156114a057600091506111c0565b3360009081526013602052604090208054919091039055506001919050565b6000828201838110156114d157600080fd5b8091505b5092915050565b600160a060020a0381166000908152600960205260409020545b919050565b611503611c6d565b600a805490506009600083600160a060020a0316600160a060020a0316815260200190815260200160002081905550600a6101a0604051908101604052808581526020016000815260200184815260200184815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200183600160a060020a03168152602001600060ff168152602001600015158152509080600181540180825580915050906001820390600052602060002090600b020160009091929091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0160006101000a815481600160a060020a030219169083600160a060020a0316021790555061016082015181600a0160146101000a81548160ff021916908360ff16021790555061018082015181600a0160156101000a81548160ff021916908315150217905550505050600b61010060405190810160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001428152602001600081525090806001815401808255809150509060018203906000526020600020906008020160009091929091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701555050508260001415156117cd576117a96001600a8581548110151561178957fe5b90600052602060002090600b0201600601546114bf90919063ffffffff16565b600a8054859081106117b757fe5b90600052602060002090600b0201600601819055505b60008211156117f957600160a060020a0381166000908152600960205260409020546117f99083612064565b505050565b6000611808611c6d565b611832600b8481548110151561181a57fe5b906000526020600020906008020160060154426119cf565b15801561185f57506000600a8481548110151561184b57fe5b90600052602060002090600b020160020154115b801561186c575060045415155b8015611879575060055415155b156118b75761188783611ca3565b60085490915061189d908263ffffffff6114bf16565b6008556006546118b3908263ffffffff61268e16565b6006555b6118ea82600a858154811015156118ca57fe5b90600052602060002090600b0201600201546114bf90919063ffffffff16565b600a8054859081106118f857fe5b90600052602060002090600b02016002018190555061194082600a8581548110151561192057fe5b90600052602060002090600b0201600301546114bf90919063ffffffff16565b600a80548590811061194e57fe5b90600052602060002090600b02016003018190555060008211156117f9576117f98383612064565b60008083151561198957600091506114d5565b5082820282848281151561199957fe5b04146114d157600080fd5b60006119c7848484602060405190810160405280600081525060006001026126a5565b949350505050565b610e1060189283900481900492909104041490565b6000806119ef611c6d565b60045415806119fe5750600554155b15611a0857611aa8565b50825b600a54611a1a908585016126fd565b811015611a7b57611a33600b8281548110151561181a57fe5b158015611a605750600a805482908110611a4957fe5b90600052602060002090600b020160020154600014155b15611a7357611a6e81611ca3565b820191505b600101611a0b565b600854611a8e908363ffffffff6114bf16565b600855600654611aa4908363ffffffff61268e16565b6006555b50505050565b611ab6612ed5565b600160a060020a038216600090815260096020526040902054600a80549091908110611ade57fe5b6000918252602091829020604080516101a081018252600b909302909101805483526001810154938301939093526002830154908201526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260088201546101008201526009820154610120820152600a90910154600160a060020a03811661014083015260ff740100000000000000000000000000000000000000008204811661016084015275010000000000000000000000000000000000000000009091041615156101808201529050919050565b600080611bcb836114dc565b9050801515611bd957600080fd5b600a805482908110611be757fe5b90600052602060002090600b02016008015491506000600a82815481101515611c0c57fe5b90600052602060002090600b020160080181905550611c2d6008548361268e565b60085550919050565b6040805160208082528183019092526000916060919080820161040080388339019050509050828152600154602082a15192915050565b611c79426007546119cf565b1515611ca157601e611c89611e33565b811515611c9257fe5b04600555600654600455426007555b565b6000806000806000611cfe600a87815481101515611cbd57fe5b90600052602060002090600b020160070154600a88815481101515611cde57fe5b90600052602060002090600b02016002015461197690919063ffffffff16565b9350611d33600a87815481101515611d1257fe5b90600052602060002090600b0201600401548561268e90919063ffffffff16565b9250600454611d4d8460055461197690919063ffffffff16565b811515611d5657fe5b0491506103e8611d6d85600263ffffffff61197616565b811515611d7657fe5b04905080821115611d85578091505b611d8f868361270e565b915042600b87815481101515611da157fe5b906000526020600020906008020160060181905550611de682600b88815481101515611dc957fe5b60009182526020909120600890910201549063ffffffff6114bf16565b600b805488908110611df457fe5b6000918252602090912060089091020155600b805483919088908110611e1657fe5b600091825260209091206004600890920201015550949350505050565b6000610df0600854611e6360408051908101604052806004815260200160e060020a635345524f02815250611c36565b9063ffffffff61268e16565b6000806000611e7c610df5565b909250905081611e92858363ffffffff61197616565b811515611e9b57fe5b04949350505050565b60408051602080825281830190925260609160009183918391829184919080820161040080388339019050509350600092505b6020831015611f73576008830260020a870291507fff00000000000000000000000000000000000000000000000000000000000000821615611f5d57818486815181101515611f2257fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190940193611f68565b8415611f6857611f73565b600190920191611ed7565b846040519080825280601f01601f191660200182016040528015611fa1578160200160208202803883390190505b509050600092505b84831015612053578383815181101515611fbf57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002818481518110151561201857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190920191611fa9565b9695505050505050565b6020015190565b600080808080808080808080690a968163f0a57b4000008c106120bb576001600a8e81548110151561209257fe5b90600052602060002090600b0201600a0160156101000a81548160ff0219169083151502179055505b600a80548e9081106120c957fe5b90600052602060002090600b02016007015460001415612110576120ec8c6129ee565b600a80548f9081106120fa57fe5b90600052602060002090600b0201600701819055505b600a80548e9c508c90811061212157fe5b90600052602060002090600b02016000015499508b97505b891561258157600a80548c90811061214d57fe5b90600052602060002090600b02016009015460001415156121c45761219b600a8c81548110151561217a57fe5b90600052602060002090600b020160090154896114bf90919063ffffffff16565b97506000600a8c8154811015156121ae57fe5b90600052602060002090600b0201600901819055505b61012c891480156121f55750600a80548b9081106121de57fe5b90600052602060002090600b020160000154600014155b156122555761222d88600a8c81548110151561220d57fe5b90600052602060002090600b0201600901546114bf90919063ffffffff16565b600a80548c90811061223b57fe5b90600052602060002090600b020160090181905550612581565b61226888600a8c815481101515610acd57fe5b600a80548c90811061227657fe5b90600052602060002090600b020160050181905550600a80548b90811061229957fe5b90600052602060002090600b020160010154600014156122dd578a600a8b8154811015156122c357fe5b90600052602060002090600b02016001018190555061254f565b600a80548b9081106122eb57fe5b90600052602060002090600b0201600101549650612332600a8881548110151561231157fe5b90600052602060002090600b020160030154600a89815481101515610acd57fe5b9550612367600a8c81548110151561234657fe5b90600052602060002090600b020160030154600a8d815481101515610acd57fe5b94508a600a8b81548110151561237957fe5b90600052602060002090600b0201600101541415801561239857508585115b156123c6578a600a8b8154811015156123ad57fe5b90600052602060002090600b0201600101819055508495505b6123fd86611e63600a8d8154811015156123dc57fe5b90600052602060002090600b020160090154600a8e815481101515610acd57fe5b935069a968163f0a57b4000000861015801561242457506a0152d02c7e14af680000008410155b1561243257600492506124cd565b6954b40b1f852bda0000008610158015612456575069a968163f0a57b40000008410155b1561246457600392506124cd565b692a5a058fc295ed000000861015801561248857506954b40b1f852bda0000008410155b1561249657600292506124cd565b69152d02c7e14af680000086101580156124ba5750692a5a058fc295ed0000008410155b156124c857600192506124cd565b600092505b600a80548b9081106124db57fe5b60009182526020909120600a600b90920201015460ff740100000000000000000000000000000000000000009091048116908416111561254f5782600a8b81548110151561252557fe5b90600052602060002090600b0201600a0160146101000a81548160ff021916908360ff1602179055505b600a80546001909a01998b91908290811061256657fe5b60009182526020909120600b9091020154909b509950612139565b6125ab600a8e81548110151561259357fe5b90600052602060002090600b0201600001548d612a2b565b820191506125d9600a8e8154811015156125c157fe5b90600052602060002090600b0201600001548d612b26565b82019150612607600a8e8154811015156125ef57fe5b90600052602060002090600b0201600001548d612cec565b60085492019161261d908363ffffffff6114bf16565b600855600a805461265491908f90811061263357fe5b90600052602060002090600b0201600701548d61197690919063ffffffff16565b9050612666818363ffffffff61268e16565b60065490915061267c908263ffffffff6114bf16565b60065550505050505050505050505050565b6000808383111561269e57600080fd5b5050900390565b6040805160a080825260c0820190925260009160609190602082016114008038833901905050905086815285602082015284604082015283606082015282608082015260025460a082a1608001519695505050505050565b6000818310156111c0575081611460565b600080612744600a8581548110151561272357fe5b90600052602060002090600b020160070154600a86815481101515611cde57fe5b90508061277a600a8681548110151561275957fe5b90600052602060002090600b020160040154856114bf90919063ffffffff16565b11156127b6576127b3600a8581548110151561279257fe5b90600052602060002090600b0201600401548261268e90919063ffffffff16565b92505b6127e983600a868154811015156127c957fe5b90600052602060002090600b0201600401546114bf90919063ffffffff16565b600a8054869081106127f757fe5b90600052602060002090600b02016004018190555080600a8581548110151561281c57fe5b90600052602060002090600b0201600401541015156128bb576000600a8581548110151561284657fe5b90600052602060002090600b0201600201819055506000600a8581548110151561286c57fe5b90600052602060002090600b0201600401819055506000600a8581548110151561289257fe5b90600052602060002090600b0201600a0160156101000a81548160ff0219169083151502179055505b6128e542600b868154811015156128ce57fe5b9060005260206000209060080201600701546119cf565b151561293a5782600b858154811015156128fb57fe5b90600052602060002090600802016005018190555042600b8581548110151561292057fe5b906000526020600020906008020160070181905550612991565b61296d83600b8681548110151561294d57fe5b9060005260206000209060080201600501546114bf90919063ffffffff16565b600b80548690811061297b57fe5b9060005260206000209060080201600501819055505b6129c483600a868154811015156129a457fe5b90600052602060002090600b0201600801546114bf90919063ffffffff16565b600a8054869081106129d257fe5b600091825260209091206008600b909202010155509092915050565b6000683635c9adc5dea00000821015612a09575060036114f6565b69010f0cf064dd59200000821015612a23575060046114f6565b5060056114f6565b6000808080851515612a3c57612b1d565b612a488686600a612e18565b83019250600a86815481101515612a5b57fe5b60009182526020909120600b909102015491508115612b19576002600a83815481101515612a8557fe5b90600052602060002090600b020160060154101515612aaf57612aaa82866008612e18565b830192505b600a805483908110612abd57fe5b90600052602060002090600b020160000154905060008114158015612b0357506003600a82815481101515612aee57fe5b90600052602060002090600b02016006015410155b15612b1957612b1481866007612e18565b830192505b8293505b50505092915050565b600080808080861515612b3857612ce2565b8615801590612b48575061012c84105b8015612b545750600c83105b15612ce257600a805488908110612b6757fe5b60009182526020909120600b90910201600a015474010000000000000000000000000000000000000000900460ff161580612bc15750600a805488908110612bab57fe5b90600052602060002090600b0201600201546000145b15612bf257600a805488908110612bd457fe5b60009182526020909120600b90910201549650600190930192612b38565b600a805488908110612c0057fe5b60009182526020909120600a600b909202010154600360ff74010000000000000000000000000000000000000000909204821602169150828211612c4c57600a805488908110612bd457fe5b90918203906064612c63878463ffffffff61197616565b811515612c6c57fe5b049050612c79878261270e565b9050612cae81600b89815481101515612c8e57fe5b9060005260206000209060080201600201546114bf90919063ffffffff16565b600b805489908110612cbc57fe5b6000918252602090912060026008909202010155600a80549582019588908110612bd457fe5b5050505092915050565b600080831515612cfb576114d5565b8315801590612d345750600a805485908110612d1357fe5b90600052602060002090600b0201600a0160159054906101000a900460ff16155b8015612d41575061012c81105b15612d6f57600a805485908110612d5457fe5b60009182526020909120600b90910201549350600101612cfb565b8315801590612da75750600a805485908110612d8757fe5b90600052602060002090600b0201600a0160159054906101000a900460ff165b156114d557612db9846014850461270e565b9150612dee82600b86815481101515612dce57fe5b9060005260206000209060080201600301546114bf90919063ffffffff16565b600b805486908110612dfc57fe5b9060005260206000209060080201600301819055505092915050565b600080600a85815481101515612e2a57fe5b90600052602060002090600b02016002015460001415612e4957612ecd565b6064612e5b858563ffffffff61197616565b811515612e6457fe5b049050612e71858261270e565b9050612ea681600b87815481101515612e8657fe5b9060005260206000209060080201600101546114bf90919063ffffffff16565b600b805487908110612eb457fe5b9060005260206000209060080201600101819055508091505b509392505050565b6101a060405190810160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000600160a060020a03168152602001600060ff1681526020016000151581525090560041534e4f57000000000000000000000000000000000000000000000000000000a165627a7a7230582088e018c7d0cdfcf780df4a1c658680603325985fc56669caa8f2372a733bbced0029") data2= common.Hex2Bytes("6080604052600436106100a35763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630a8b782681146100a85780632ca9a7c1146100f6578063370158ea1461010b5780633ccfd60b146101b4578063672d7a0d146101c957806383b4918b146101ea5780638da5cb5b14610202578063a19556d414610233578063e7cf3d1314610301578063f2fde38b14610356575b600080fd5b6040805160206004803580820135601f81018490048402850184019095528484526100f49436949293602493928401919081908401838280828437509497506103779650505050505050565b005b34801561010257600080fd5b506100f461046d565b34801561011757600080fd5b506101206105aa565b6040518086815260200185815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561017557818101518382015260200161015d565b50505050905090810190601f1680156101a25780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b3480156101c057600080fd5b506100f461082d565b3480156101d557600080fd5b506100f4600160a060020a0360043516610a22565b3480156101f657600080fd5b506100f4600435610bd7565b34801561020e57600080fd5b50610217610cb3565b60408051600160a060020a039092168252519081900360200190f35b34801561023f57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261028c943694929360249392840191908190840183828082843750949750610cc29650505050505050565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102c65781810151838201526020016102ae565b50505050905090810190601f1680156102f35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561030d57600080fd5b50604080516020600480358082013583810280860185019096528085526100f4953695939460249493850192918291850190849080828437509497506117939650505050505050565b34801561036257600080fd5b506100f4600160a060020a03600435166117fa565b6000806007546000148061038c575060075442105b151561039757600080fd5b6103c760408051908101604052806004815260200160e060020a635345524f028152506103c261188e565b6118cf565b15156103d257600080fd5b678ac7230489e800003410156103e757600080fd5b3360009081526009602052604090205491508115156104405761041a8360206040519081016040528060008152506118cf565b1561042457600080fd5b61042d8361191b565b3360009081526009602052604090205491505b600880548390811061044e57fe5b90600052602060002090600d02019050610468813461200f565b505050565b6000806000806000806000600754600014151561048957600080fd5b3360009081526009602052604090205496508615156104a757600080fd5b6104af612240565b600d5415806104be5750600e54155b156104c8576105a1565b8693505b6008546011546104de91908901612280565b841080156104ec5750600754155b156105745760088054859081106104ff57fe5b90600052602060002090600d0201925061051d836006015442612297565b158015610531575082600301548360020154115b156105695761053f836122ac565b9092509050610554868363ffffffff61243f16565b9550610566858263ffffffff61243f16565b94505b6001909301926104cc565b601354610587908663ffffffff61243f16565b601355600f5461059d908763ffffffff61245c16565b600f555b50505050505050565b600080600080606080606080600060075460001415156107ff576105ce600a612473565b9250825160405190808252806020026020018201604052801561060b57816020015b6105f86136c1565b8152602001906001900390816105f05790505b509150600090505b825181101561076057600554835161074091600160a060020a031690633a5294a09086908590811061064157fe5b906020019060200201516040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808267ffffffffffffffff1667ffffffffffffffff168152602001915050600060405180830381600087803b1580156106b157600080fd5b505af11580156106c5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156106ee57600080fd5b81019080805164010000000081111561070657600080fd5b8201602081018481111561071957600080fd5b815164010000000081118282018710171561073357600080fd5b50509291905050506124cf565b828281518110151561074e57fe5b60209081029091010152600101610613565b6107a76107a16040805190810160405280600181526020017f20000000000000000000000000000000000000000000000000000000000000008152506124cf565b836124f5565b93506007546107e66013546107da60408051908101604052806004815260200160e060020a635345524f0281525061263d565b9063ffffffff61245c16565b6012546008805490508798509850985098509850610822565b601254600854604080516020810190915260008082529b508b9a50919850965094505b505050509091929394565b3360009081526009602052604081205490808080808086151561084f57600080fd5b600880548890811061085d57fe5b90600052602060002090600d0201955085600901549450600754600014158015610888575060075442115b15610930576108bb6013546107da60408051908101604052806004815260200160e060020a635345524f0281525061263d565b93506108ce600a8863ffffffff61267416565b925092508280156108df5750600082115b156109305761091d6109106108f4600a6126d7565b610904878663ffffffff61270d16565b9063ffffffff61273b16565b869063ffffffff61243f16565b9450610930600a8863ffffffff61275e16565b60098601546013546109479163ffffffff61245c16565b60135560006009870155600c8601541515610996576109863360408051908101604052806004815260200160e060020a635345524f02815250876127b3565b151561099157600080fd5b6105a1565b5060005b600c8601548110156105a157610a0f86600c01828154811015156109ba57fe5b60009182526020918290200154604080518082019091526004815260e060020a635345524f0292810192909252600c890154600160a060020a039091169190610a0a90899063ffffffff61273b16565b6127b3565b1515610a1a57600080fd5b60010161099a565b60008054600160a060020a03163314610a3a57600080fd5b610a43826127de565b15610a4d57600080fd5b5060088054600160a060020a038316600090815260096020908152604080832084905580516101a081018252848152808301849052808201849052606081018490526080810184905260a081018490524260c0820181905260e0820185905261010082015261012081018490528151848152928301909152929392916101408301919050815260408051602081810183526000808352818501929092528251828152908101835291909201915090528154600181810180855560009485526020948590208451600d90940201928355848401519183019190915560408301516002830155606083015160038301556080830151600483015560a0830151600583015560c0830151600683015560e083015160078301556101008301516008830155610120830151600983015561014083015180519194610b9592600a850192909101906136d8565b506101608201518051610bb291600b840191602090910190613723565b506101808201518051610bcf91600c840191602090910190613790565b505050505050565b60008082678ac7230489e80000111580610bef575082155b1515610bfa57600080fd5b60075415610c0757600080fd5b336000908152600960205260409020549150811515610c2557600080fd5b6008805483908110610c3357fe5b90600052602060002090600d020190508260001415610c685760098101549250678ac7230489e80000831015610c6857600080fd5b6009810154831115610c7957600080fd5b6009810154610c8e908463ffffffff61245c16565b6009820155601354610ca6908463ffffffff61245c16565b601355610468818461200f565b600054600160a060020a031681565b33600090815260096020526040812054606091908190839082908190819081901515610ced57611787565b33600090815260096020526040902054600880549091908110610d0c57fe5b90600052602060002090600d02019650610d368960206040519081016040528060008152506118cf565b1515610eb3576005546040517f49145c910000000000000000000000000000000000000000000000000000000081526020600482018181528c5160248401528c51600160a060020a03909416936349145c91938e9383926044909201919085019080838360005b83811015610db5578181015183820152602001610d9d565b50505050905090810190601f168015610de25780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b158015610e0157600080fd5b505af1158015610e15573d6000803e3d6000fd5b505050506040513d6020811015610e2b57600080fd5b50519550600086118015610e40575060085486105b1515610e4b57600080fd5b6008805487908110610e5957fe5b90600052602060002090600d020196505b336000908152600960205260409020548614610eb357851515610e8c57611787565b6008805487908110610e9a57fe5b90600052602060002090600d0201600101549550610e6a565b610ebb612240565b60408051600b808252610180820190925290816020015b6060815260200190600190039081610ed2575050604080518082018252600a81527f2273656c66436f6465220000000000000000000000000000000000000000000060208201526005548a54835160e560020a6301d294a502815267ffffffffffffffff9091166004820152925193985061100b939192600160a060020a0390911691633a5294a09160248082019260009290919082900301818387803b158015610f7c57600080fd5b505af1158015610f90573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610fb957600080fd5b810190808051640100000000811115610fd157600080fd5b82016020810184811115610fe457600080fd5b8151640100000000811182820187101715610ffe57600080fd5b50509291905050506127e6565b85600081518110151561101a57fe5b906020019060200201819052506111936040805190810160405280600c81526020017f22706172656e74436f646522000000000000000000000000000000000000000081525088600101546000146111595760055460018a01546040805160e560020a6301d294a502815267ffffffffffffffff909216600483015251600160a060020a0390921691633a5294a09160248082019260009290919082900301818387803b1580156110ca57600080fd5b505af11580156110de573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561110757600080fd5b81019080805164010000000081111561111f57600080fd5b8201602081018481111561113257600080fd5b815164010000000081118282018710171561114c57600080fd5b505092919050505061118e565b60408051808201909152600281527f222200000000000000000000000000000000000000000000000000000000000060208201525b6127e6565b8560018151811015156111a257fe5b906020019060200201819052506111f26040805190810160405280600781526020017f2276616c7565220000000000000000000000000000000000000000000000000081525088600201546129cd565b85600281518110151561120157fe5b906020019060200201819052506112516040805190810160405280600d81526020017f2272657475726e56616c7565220000000000000000000000000000000000000081525088600301546129cd565b85600381518110151561126057fe5b906020019060200201819052506112b06040805190810160405280601481526020017f22746f74616c41796e616d69635265776172642200000000000000000000000081525088600401546129cd565b8560048151811015156112bf57fe5b602090810290910101526009870154600754909450158015906112e3575060075442115b15611381576113166013546107da60408051908101604052806004815260200160e060020a635345524f0281525061263d565b3360009081526009602052604090205490935061133b90600a9063ffffffff61267416565b9150915081801561134c5750600081115b156113815761137e611371611361600a6126d7565b610904868563ffffffff61270d16565b859063ffffffff61243f16565b93505b6113c06040805190810160405280600d81526020017f2263616e57697468647261772200000000000000000000000000000000000000815250856129cd565b8560058151811015156113cf57fe5b6020908102909101015260068701546113e89042612297565b1561144e576114306040805190810160405280600e81526020017f227374617469635265776172642200000000000000000000000000000000000081525088600501546129cd565b85600681518110151561143f57fe5b602090810290910101526114ca565b6114b06040805190810160405280600e81526020017f22737461746963526577617264220000000000000000000000000000000000008152506114ab896114a68b600301548c6002015461245c90919063ffffffff16565b612a94565b6129cd565b8560068151811015156114bf57fe5b602090810290910101525b6114d8876008015442612297565b1561153e576115206040805190810160405280600f81526020017f2264796e616d696352657761726422000000000000000000000000000000000081525088600701546129cd565b85600781518110151561152f57fe5b60209081029091010152611598565b61157e6040805190810160405280600f81526020017f2264796e616d696352657761726422000000000000000000000000000000000081525060006129cd565b85600781518110151561158d57fe5b602090810290910101525b6115db6040805190810160405280601181526020017f2273746174696354696d657374616d702200000000000000000000000000000081525088600601546129cd565b8560088151811015156115ea57fe5b6020908102909101810191909152604080518082018252600c81527f226368696c6473436f646522000000000000000000000000000000000000000081840152600b8a0180548351601f600260001961010060018616150201909316929092049182018690048602810186019094528084526116be949293928301828280156116b45780601f10611689576101008083540402835291602001916116b4565b820191906000526020600020905b81548152906001019060200180831161169757829003601f168201915b50505050506127e6565b8560098151811015156116cd57fe5b6020908102909101810191909152604080518082018252600881527f2276616c7565732200000000000000000000000000000000000000000000000081840152600a8a0180548351818602810186019094528084526117629492939283018282801561175857602002820191906000526020600020905b815481526020019060010190808311611744575b5050505050612b34565b85600a81518110151561177157fe5b6020908102909101015261178485612d6d565b97505b50505050505050919050565b600080600083511115156117a657600080fd5b33600090815260096020526040902054915081156104685760088054839081106117cc57fe5b90600052602060002090600d020190508281600c0190805190602001906117f4929190613790565b50505050565b600054600160a060020a0316331461181157600080fd5b600160a060020a038116151561182657600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b604080516020808252818301909252606091829160009180820161040080388339019050509150600454602083a15080516118c881612ed5565b9250505090565b6000825160001480156118e157508151155b156118ee57506001611915565b81518351146118ff57506000611915565b61190882613056565b61191184613056565b1490505b92915050565b6000806000611929336127de565b1561193357600080fd5b6005546040517f49145c91000000000000000000000000000000000000000000000000000000008152602060048201818152875160248401528751600160a060020a03909416936349145c9193899383926044909201919085019080838360005b838110156119ac578181015183820152602001611994565b50505050905090810190601f1680156119d95780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b1580156119f857600080fd5b505af1158015611a0c573d6000803e3d6000fd5b505050506040513d6020811015611a2257600080fd5b50519250600083118015611a37575060085483105b1515611a4257600080fd5b6008805484908110611a5057fe5b60009182526020808320600854604080518085018252958652600d94909402909101600b81018054855160026001831615610100026000190190921691909104601f8101869004860282018601909652858152919750919550611b0b94939092830182828015611b015780601f10611ad657610100808354040283529160200191611b01565b820191906000526020600020905b815481529060010190602001808311611ae457829003601f168201915b50505050506118cf565b15611c0c576005546040805160e560020a6301d294a502815267ffffffffffffffff841660048201529051600160a060020a0390921691633a5294a09160248082019260009290919082900301818387803b158015611b6957600080fd5b505af1158015611b7d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611ba657600080fd5b810190808051640100000000811115611bbe57600080fd5b82016020810184811115611bd157600080fd5b8151640100000000811182820187101715611beb57600080fd5b50508051611c069450600b8701935060209091019150613723565b50611d68565b600b8201805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152611d5093611cf693611cf193611cae939291830182828015611ca45780601f10611c7957610100808354040283529160200191611ca4565b820191906000526020600020905b815481529060010190602001808311611c8757829003601f168201915b50505050506124cf565b611cec6040805190810160405280600181526020017f20000000000000000000000000000000000000000000000000000000000000008152506124cf565b61305d565b6124cf565b6005546040805160e560020a6301d294a502815267ffffffffffffffff861660048201529051611cec92600160a060020a031691633a5294a091602480830192600092919082900301818387803b1580156106b157600080fd5b8051611d6691600b850191602090910190613723565b505b33600090815260096020908152604080832084905580516101a081018252848152808301878152818301858152606083018681526080840187815260a085018881524260c0870181815260e088018b8152610100890192835261012089018c81528a518d8152808d018c526101408b019081528b51808e018d528e81526101608c01528b518e8152808e01909c526101808b019b909b52600880546001810180835591909e528a517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3600d909f029e8f0190815599517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee48f015597517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee58e015595517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee68d015593517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee78c015591517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee88b015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee98a015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636eea890155517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636eeb880155517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636eec87015592518051939592949193611fcb937ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636eed019291909101906136d8565b506101608201518051611fe891600b840191602090910190613723565b50610180820151805161200591600c840191602090910190613790565b5050505050505050565b60008060008061201d612240565b600054604080518082019091526004815260e060020a635345524f02602082015261205d91600160a060020a031690610a0a88603263ffffffff61273b16565b151561206857600080fd5b6006546120809061090487601963ffffffff61273b16565b9350600092505b6006548310156120f6576120e06006848154811015156120a357fe5b60009182526020918290200154604080518082019091526004815260e060020a635345524f0292810192909252600160a060020a031690866127b3565b15156120eb57600080fd5b600190920191612087565b61211b61210a86600363ffffffff61270d16565b60028801549063ffffffff61243f16565b60028701556001860154600010156121f0575084905060005b6001820154158015906121475750601481105b156121f0576008826001015481548110151561215f57fe5b90600052602060002090600d020191508082600a0180549050141561219d57600a8201805460018101825560009182526020909120018590556121e8565b6121cb8583600a01838154811015156121b257fe5b906000526020600020015461243f90919063ffffffff16565b600a83018054839081106121db57fe5b6000918252602090912001555b600101612134565b61221361220486600363ffffffff61270d16565b600f549063ffffffff61243f16565b600f55855461222b90600a908763ffffffff6130d416565b60075415610bcf576000600755505050505050565b61224c42601054612297565b151561227e5761227060c86109046003612264613293565b9063ffffffff61270d16565b600e55600f54600d55426010555b565b600081831015612291575081611915565b50919050565b610e1060189283900481900492909104041490565b6000806000806000806000806122dc896122d78b600301548c6002015461245c90919063ffffffff16565b6132d3565b9550955085156122eb57612434565b84935060008960010154111561242d576008896001015481548110151561230e57fe5b90600052602060002090600d0201915061232a828660006133f0565b9096509250851561234057848497509750612434565b612350848463ffffffff61243f16565b9350600190505b60018201541580159061236a5750601481105b80156123765750600754155b1561242d576008826001015481548110151561238e57fe5b90600052602060002090600d02019150806123d869021e19e0c9bab240000084600a0160008154811015156123bf57fe5b906000526020600020015461273b90919063ffffffff16565b1180156123ec575081600201548260030154105b15612425576123fc8286836133f0565b9096509250851561241257848497509750612434565b612422848463ffffffff61243f16565b93505b600101612357565b8484975097505b505050505050915091565b60008282018381101561245157600080fd5b8091505b5092915050565b6000808383111561246c57600080fd5b5050900390565b6060816000018054806020026020016040519081016040528092919081815260200182805480156124c357602002820191906000526020600020905b8154815260200190600101908083116124af575b50505050509050919050565b6124d76136c1565b50604080518082019091528151815260209182019181019190915290565b60606000806060600085516000141561251e576040805160208101909152600081529450612633565b60018651038760000151029350600092505b855183101561256257858381518110151561254757fe5b60209081029091010151519390930192600190920191612530565b836040519080825280601f01601f191660200182016040528015612590578160200160208202803883390190505b5060009350915050602081015b855183101561262f576125e48187858151811015156125b857fe5b906020019060200201516020015188868151811015156125d457fe5b60209081029091010151516134ed565b85838151811015156125f257fe5b60209081029091010151518651910190600019018310156126245761262081886020015189600001516134ed565b8651015b60019092019161259d565b8194505b5050505092915050565b6040805160208082528183019092526000916060919080820161040080388339019050509050828152600254602082a15192915050565b600080805b84548110156126cf578454849086908390811061269257fe5b906000526020600020015414156126c75760028501805460019450829081106126b757fe5b9060005260206000200154820191505b600101612679565b509250929050565b6000805b825481101561229157600283018054829081106126f457fe5b60009182526020909120015491909101906001016126db565b6000808315156127205760009150612455565b5082820282848281151561273057fe5b041461245157600080fd5b60008080831161274a57600080fd5b828481151561275557fe5b04949350505050565b60005b8254811015610468578254829084908390811061277a57fe5b906000526020600020015414156127ab576000836002018281548110151561279e57fe5b6000918252602090912001555b600101612761565b60006127d684848460206040519081016040528060008152506000600102613531565b949350505050565b6000903b1190565b604080516002808252606082810190935282918291816020015b6128086136c1565b815260200190600190039081612800579050509150612826856124cf565b82600081518110151561283557fe5b602090810290910101526040805160038082526080820190925290816020015b61285d6136c1565b8152602001906001900390816128555790505090506128b06040805190810160405280600181526020017f22000000000000000000000000000000000000000000000000000000000000008152506124cf565b8160008151811015156128bf57fe5b602090810290910101526128d2846124cf565b8160018151811015156128e157fe5b9060200190602002018190525061292c6040805190810160405280600181526020017f22000000000000000000000000000000000000000000000000000000000000008152506124cf565b81600281518110151561293b57fe5b90602001906020020181905250612967611cf16107a160206040519081016040528060008152506124cf565b82600181518110151561297657fe5b906020019060200201819052506129c46107a16040805190810160405280600181526020017f3a000000000000000000000000000000000000000000000000000000000000008152506124cf565b95945050505050565b6040805160028082526060828101909352829190816020015b6129ee6136c1565b8152602001906001900390816129e6579050509050612a0c846124cf565b816000815181101515612a1b57fe5b60209081029091010152612a31611cf184613589565b816001815181101515612a4057fe5b906020019060200201819052506127d6612a8e6040805190810160405280600181526020017f3a000000000000000000000000000000000000000000000000000000000000008152506124cf565b826124f5565b6000600e5460001480612aa75750600d54155b80612ab3575060075415155b15612ac057506000611915565b612af082612aeb600d54610904600e5461226489600301548a6002015461245c90919063ffffffff16565b612280565b90508260020154612b0e84600301548361243f90919063ffffffff16565b11156119155760038301546002840154612b2d9163ffffffff61245c16565b9392505050565b60608060006060808551604051908082528060200260200182016040528015612b7757816020015b612b646136c1565b815260200190600190039081612b5c5790505b509350600092505b8551831015612bce57612bab611cf18785815181101515612b9c57fe5b90602001906020020151613589565b8484815181101515612bb957fe5b60209081029091010152600190920191612b7f565b612c59612c0f6040805190810160405280600181526020017f5b000000000000000000000000000000000000000000000000000000000000008152506124cf565b611cec611cf1612c536040805190810160405280600181526020017f2c000000000000000000000000000000000000000000000000000000000000008152506124cf565b886124f5565b9150612ca5612c67836124cf565b611cec6040805190810160405280600181526020017f5d000000000000000000000000000000000000000000000000000000000000008152506124cf565b60408051600280825260608201909252919350816020015b612cc56136c1565b815260200190600190039081612cbd579050509050612ce3876124cf565b816000815181101515612cf257fe5b60209081029091010152612d05826124cf565b816001815181101515612d1457fe5b90602001906020020181905250612d62612a8e6040805190810160405280600181526020017f3a000000000000000000000000000000000000000000000000000000000000008152506124cf565b979650505050505050565b60608060008351604051908082528060200260200182016040528015612dad57816020015b612d9a6136c1565b815260200190600190039081612d925790505b509150600090505b8351811015612dfe57612dde8482815181101515612dcf57fe5b906020019060200201516124cf565b8282815181101515612dec57fe5b60209081029091010152600101612db5565b612e89612e3f6040805190810160405280600181526020017f7b000000000000000000000000000000000000000000000000000000000000008152506124cf565b611cec611cf1612e836040805190810160405280600181526020017f2c000000000000000000000000000000000000000000000000000000000000008152506124cf565b866124f5565b92506127d6612e97846124cf565b611cec6040805190810160405280600181526020017f7d000000000000000000000000000000000000000000000000000000000000008152506124cf565b60408051602080825281830190925260609160009183918391829184919080820161040080388339019050509350600092505b6020831015612fa4576008830260020a870291507fff00000000000000000000000000000000000000000000000000000000000000821615612f8e57818486815181101515612f5357fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190940193612f99565b8415612f9957612fa4565b600190920191612f08565b846040519080825280601f01601f191660200182016040528015612fd2578160200160208202803883390190505b509050600092505b8483101561304c578383815181101515612ff057fe5b90602001015160f860020a900460f860020a02818481518110151561301157fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190920191612fda565b9695505050505050565b6020015190565b606080600083600001518560000151016040519080825280601f01601f19166020018201604052801561309a578160200160208202803883390190505b5091506020820190506130b681866020015187600001516134ed565b8451602085015185516130cc92840191906134ed565b509392505050565b8254600090819081908190600a14156131c35760018701805460009081106130f857fe5b90600052602060002001549250600191505b86548210156131625782876001018381548110151561312557fe5b90600052602060002001541015613157576001870180548390811061314657fe5b906000526020600020015492508193505b60019091019061310a565b8654869088908690811061317257fe5b906000526020600020018190555042876001018581548110151561319257fe5b90600052602060002001819055508487600201858154811015156131b257fe5b6000918252602090912001556105a1565b600091505b865482101561324357865486908890849081106131e157fe5b906000526020600020015414156132385742876001018381548110151561320457fe5b906000526020600020018190555084876002018381548110151561322457fe5b600091825260209091200155506001613243565b6001909101906131c8565b8015156105a1575050845460018082018755600087815260208082209093019690965580870180548083018255908752828720429101556002909601805496870181558552909320909301555050565b60006132cd6012546107da6013546107da346107da60408051908101604052806004815260200160e060020a635345524f0281525061263d565b90505b90565b6000806000806132e1613694565b600754156132f65760019350600092506133e7565b4260068701556133068686612a94565b92508286600501819055506000866001015411156133b2575084905060005b6001820154158015906133385750601481105b156133b2576008826001015481548110151561335057fe5b90600052602060002090600d0201915061338e8383600a018381548110151561337557fe5b906000526020600020015461245c90919063ffffffff16565b600a830180548390811061339e57fe5b600091825260209091200155600101613325565b60098601546133c7908463ffffffff61243f16565b600987015560038601546133e1908463ffffffff61243f16565b60038701555b50509250929050565b6000806133fb613694565b6007541561340f57506001905060006134e5565b69152d02c7e14af680000061343a60036109048860030154896002015461245c90919063ffffffff16565b10613446575082613453565b6134508585612a94565b90505b60008311156134705761346d81600a63ffffffff61273b16565b90505b61347e856008015442612297565b156134a2576007850154613498908263ffffffff61243f16565b60078601556134b0565b600785018190554260088601555b60098501546134c5908263ffffffff61243f16565b600986015560048501546134df908263ffffffff61243f16565b60048601555b935093915050565b60005b60208210613512578251845260209384019390920191601f19909101906134f0565b50905182516020929092036101000a6000190180199091169116179052565b6040805160a080825260c0820190925260009160609190602082016114008038833901905050905086815285602082015284604082015283606082015282608082015260035460a082a1608001519695505050505050565b606060008082818515156135d25760408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152945061368b565b8593505b83156135ed57600190920191600a840493506135d6565b826040519080825280601f01601f19166020018201604052801561361b578160200160208202803883390190505b5091505060001982015b851561368757815160001982019160f860020a6030600a8a06010291849190811061364c57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a86049550613625565b8194505b50505050919050565b6012546136a890601463ffffffff61273b16565b6136b0613293565b101561227e57426203f48001600755565b604080518082019091526000808252602082015290565b828054828255906000526020600020908101928215613713579160200282015b828111156137135782518255916020019190600101906136f8565b5061371f9291506137fe565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061376457805160ff1916838001178555613713565b8280016001018555821561371357918201828111156137135782518255916020019190600101906136f8565b8280548282559060005260206000209081019282156137f2579160200282015b828111156137f2578251825473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039091161782556020909201916001909101906137b0565b5061371f929150613818565b6132d091905b8082111561371f5760008155600101613804565b6132d091905b8082111561371f57805473ffffffffffffffffffffffffffffffffffffffff1916815560010161381e5600a165627a7a723058200c8d77cd85c4ab81393cf1fe6d2f868b301b7618f52d7637393c4f013f558f7c0029") data3= common.Hex2Bytes("6080604052600436106101745763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663026187528114610179578063026c4207146101a057806306fdde03146101b55780630a8b78261461023f57806318160ddd1461029f57806325365773146102b45780632ca9a7c1146102fc578063313ce567146103135780633c92d6df1461033e57806351d3182214610353578063565974d3146103745780635fd8c710146104ba578063672d7a0d146104cf578063722713f7146104f05780637ffdf53e146105055780638d34191e146105335780638da5cb5b1461054b57806395d89b41146101b5578063a1c7254d1461057c578063af640d0f14610591578063b076a53a146105a6578063b3e4c7a7146105c0578063c2abc0e6146105d5578063c7e57a441461062e578063d0b06f5d14610636578063db29777a1461064b578063df86265614610663578063e09eaa5514610678578063f2fde38b14610680575b600080fd5b34801561018557600080fd5b5061018e6106a1565b60408051918252519081900360200190f35b3480156101ac57600080fd5b5061018e6106a7565b3480156101c157600080fd5b506101ca6106ad565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102045781810151838201526020016101ec565b50505050905090810190601f1680156102315780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6040805160206004803580820135601f810184900484028501840190955284845261028b9436949293602493928401919081908401838280828437509497506106ce9650505050505050565b604080519115158252519081900360200190f35b3480156102ab57600080fd5b5061018e61094b565b3480156102c057600080fd5b506102c9610951565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b34801561030857600080fd5b50610311610a75565b005b34801561031f57600080fd5b50610328610a9d565b6040805160ff9092168252519081900360200190f35b34801561034a57600080fd5b5061018e610aa2565b34801561035f57600080fd5b50610311600160a060020a0360043516610aa8565b34801561038057600080fd5b50610389610aee565b6040518080602001806020018d81526020018c81526020018b81526020018a81526020018981526020018881526020018781526020018660ff1660ff1681526020018515151515815260200184815260200183810383528f818151815260200191508051906020019080838360005b838110156104105781810151838201526020016103f8565b50505050905090810190601f16801561043d5780820380516001836020036101000a031916815260200191505b5083810382528e818151815260200191508051906020019080838360005b8381101561047357818101518382015260200161045b565b50505050905090810190601f1680156104a05780820380516001836020036101000a031916815260200191505b509e50505050505050505050505050505060405180910390f35b3480156104c657600080fd5b50610311610dcf565b3480156104db57600080fd5b50610311600160a060020a0360043516610e1a565b3480156104fc57600080fd5b5061018e610e50565b34801561051157600080fd5b5061051a610e7f565b6040805192835260208301919091528051918290030190f35b34801561053f57600080fd5b50610311600435610f52565b34801561055757600080fd5b50610560610f66565b60408051600160a060020a039092168252519081900360200190f35b34801561058857600080fd5b5061018e610f75565b34801561059d57600080fd5b506101ca610ffd565b3480156105b257600080fd5b50610311600435151561110a565b3480156105cc57600080fd5b5061018e611134565b3480156105e157600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261028b94369492936024939284019190819084018382808284375094975061113e9650505050505050565b610311611250565b34801561064257600080fd5b5061018e6112b8565b34801561065757600080fd5b506103116004356112be565b34801561066f57600080fd5b5061018e6112da565b61018e6112ed565b34801561068c57600080fd5b50610311600160a060020a03600435166113e8565b60045481565b60065481565b604080518082019091526004815260e060020a634143455302602082015290565b60008060008061070460408051908101604052806004815260200160e460020a6304149505028152506106ff61147d565b6114be565b151561070f57600080fd5b610718336114ee565b1561072257600080fd5b68056bc75e2d6310000034101561073857600080fd5b610741346114f6565b151561074c57600080fd5b60125461075f903463ffffffff61154716565b60125561076b33611564565b9250821515610892576015546040517f49145c91000000000000000000000000000000000000000000000000000000008152602060048201818152885160248401528851600160a060020a03909416936349145c91938a9383926044909201919085019080838360005b838110156107ed5781810151838201526020016107d5565b50505050905090810190601f16801561081a5780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b15801561083957600080fd5b505af115801561084d573d6000803e3d6000fd5b505050506040513d602081101561086357600080fd5b5051915081158015906108775750600a5482105b151561088257600080fd5b61088d823433611583565b61089c565b61089c8334611886565b60c86108af34600363ffffffff6119fe16565b8115156108b857fe5b600c54604080518082019091526004815260e460020a63041495050260208201529290910492506108f591600160a060020a039091169083611a2c565b151561090057600080fd5b601454604080518082019091526004815260e460020a630414950502602082015261093591600160a060020a03169083611a2c565b151561094057600080fd5b506001949350505050565b600f5490565b60008060008060008060008061096633611564565b9150610992600b8381548110151561097a57fe5b90600052602060002090600802016007015442611a57565b156109ba57600b8054839081106109a557fe5b90600052602060002090600802016005015490505b600b8054839081106109c857fe5b906000526020600020906008020160000154600b838154811015156109e957fe5b906000526020600020906008020160010154600b84815481101515610a0a57fe5b906000526020600020906008020160020154600b85815481101515610a2b57fe5b90600052602060002090600802016003015484600b87815481101515610a4d57fe5b9060005260206000209060080201600601549750975097509750975097505050909192939495565b6000610a8033611564565b9050801515610a8e57600080fd5b610a9a81601154611a6c565b50565b601290565b60055481565b600c54600160a060020a03163314610abf57600080fd5b6014805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b606080600080600080600080600080600080610b08612f5d565b6000610b1333611b36565b602081015190925015610b7e57610b7b600a8360200151815481101515610b3657fe5b90600052602060002090600b020160030154600a8460200151815481101515610b5b57fe5b90600052602060002090600b02016005015461154790919063ffffffff16565b90505b6015548251604080517f3a5294a000000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909216600483015251600160a060020a0390921691633a5294a09160248082019260009290919082900301818387803b158015610bef57600080fd5b505af1158015610c03573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610c2c57600080fd5b810190808051640100000000811115610c4457600080fd5b82016020810184811115610c5757600080fd5b8151640100000000811182820187101715610c7157600080fd5b50506015546020870151604080517f3a5294a000000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909216600483015251929550600160a060020a039091169350633a5294a0925060248082019260009290919082900301818387803b158015610cec57600080fd5b505af1158015610d00573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610d2957600080fd5b810190808051640100000000811115610d4157600080fd5b82016020810184811115610d5457600080fd5b8151640100000000811182820187101715610d6e57600080fd5b505092919050505082846040015185608001518660a001518760c001518860e001518961010001518a61016001518b61018001518c606001519d509d509d509d509d509d509d509d509d509d509d509d505050909192939495969798999a9b565b6000610dda33611c47565b90506000811115610a9a57610e0f3360408051908101604052806004815260200160e460020a63041495050281525083611a2c565b1515610a9a57600080fd5b600c54600160a060020a03163314610e3157600080fd5b610e3a816114ee565b15610e4457600080fd5b610a9a60008083611583565b6000610e7a60408051908101604052806004815260200160e060020a634143455302815250611cbe565b905090565b60008060008060008069d3c21bcecceda10000006012541015610eb75767016345785d8a00009550670de0b6b3a76400009450610f4a565b6012546a084595161401484a0000009004935060088410610ed757600893505b600d805485908110610ee557fe5b90600052602060002001549250600e84815481101515610f0157fe5b906000526020600020015491506969e10de76676d08000006a084595161401484a000000850260125403811515610f3457fe5b0483810283019650670de0b6b3a7640000955090505b505050509091565b623356284310610f6157600080fd5b600655565b600c54600160a060020a031681565b600080610f8133611564565b9050801515610f8f57600080fd5b610f97611cf5565b610fc142600b83815481101515610faa57fe5b906000526020600020906008020160060154611a57565b15610fed57600b805482908110610fd457fe5b9060005260206000209060080201600401549150610ff9565b610ff681611d2b565b91505b5090565b6060600061100a33611564565b601554604080517f3a5294a000000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201529051929350600160a060020a0390911691633a5294a09160248082019260009290919082900301818387803b15801561107c57600080fd5b505af1158015611090573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156110b957600080fd5b8101908080516401000000008111156110d157600080fd5b820160208101848111156110e457600080fd5b81516401000000008111828201871017156110fe57600080fd5b50909550505050505090565b600c54600160a060020a0316331461112157600080fd5b6010805460ff1916911515919091179055565b6000610e7a611ebb565b6015546040517f49145c910000000000000000000000000000000000000000000000000000000081526020600482018181528451602484015284516000948594600160a060020a03909116936349145c9193889390928392604490910191908501908083838b5b838110156111bd5781810151838201526020016111a5565b50505050905090810190601f1680156111ea5780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b15801561120957600080fd5b505af115801561121d573d6000803e3d6000fd5b505050506040513d602081101561123357600080fd5b5051905080158015906112475750600a5481105b91505b50919050565b61127b60408051908101604052806004815260200160e060020a6341434553028152506106ff61147d565b151561128657600080fd5b336000908152601360205260409020546112a6903463ffffffff61154716565b33600090815260136020526040902055565b60075481565b600c54600160a060020a031633146112d557600080fd5b601155565b3360009081526013602052604090205490565b601054600090819060ff16151561130357600080fd5b61132e60408051908101604052806004815260200160e460020a6304149505028152506106ff61147d565b151561133957600080fd5b503469152d02c7e14af68000008111156113915769152d02c7e14af680000090506113863360408051908101604052806004815260200160e460020a630414950502815250833403611a2c565b151561139157600080fd5b61139a81611ef7565b6012549092506113b0908263ffffffff61154716565b601255604080518082019091526004815260e060020a63414345530260208201526113dd90339084611a2c565b1515610ff957600080fd5b600c54600160a060020a031633146113ff57600080fd5b600160a060020a038116151561141457600080fd5b600c54604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600c805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b604080516020808252818301909252606091829160009180820161040080388339019050509150600354602083a15080516114b781611f2c565b9250505090565b80518251600091146114d2575060006114e8565b6114db826120e5565b6114e4846120e5565b1490505b92915050565b6000903b1190565b600080611505600a8404611ef7565b33600090815260136020526040902054909150811115611528576000915061124a565b3360009081526013602052604090208054919091039055506001919050565b60008282018381101561155957600080fd5b8091505b5092915050565b600160a060020a0381166000908152600960205260409020545b919050565b61158b611cf5565b600a805490506009600083600160a060020a0316600160a060020a0316815260200190815260200160002081905550600a6101a0604051908101604052808581526020016000815260200184815260200184815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200183600160a060020a03168152602001600060ff168152602001600015158152509080600181540180825580915050906001820390600052602060002090600b020160009091929091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0160006101000a815481600160a060020a030219169083600160a060020a0316021790555061016082015181600a0160146101000a81548160ff021916908360ff16021790555061018082015181600a0160156101000a81548160ff021916908315150217905550505050600b61010060405190810160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001428152602001600081525090806001815401808255809150509060018203906000526020600020906008020160009091929091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155505050826000141515611855576118316001600a8581548110151561181157fe5b90600052602060002090600b02016006015461154790919063ffffffff16565b600a80548590811061183f57fe5b90600052602060002090600b0201600601819055505b600082111561188157600160a060020a03811660009081526009602052604090205461188190836120ec565b505050565b6000611890611cf5565b6118ba600b848154811015156118a257fe5b90600052602060002090600802016006015442611a57565b1580156118e757506000600a848154811015156118d357fe5b90600052602060002090600b020160020154115b80156118f4575060045415155b8015611901575060055415155b1561193f5761190f83611d2b565b600854909150611925908263ffffffff61154716565b60085560065461193b908263ffffffff61271616565b6006555b61197282600a8581548110151561195257fe5b90600052602060002090600b02016002015461154790919063ffffffff16565b600a80548590811061198057fe5b90600052602060002090600b0201600201819055506119c882600a858154811015156119a857fe5b90600052602060002090600b02016003015461154790919063ffffffff16565b600a8054859081106119d657fe5b90600052602060002090600b02016003018190555060008211156118815761188183836120ec565b600080831515611a11576000915061155d565b50828202828482811515611a2157fe5b041461155957600080fd5b6000611a4f8484846020604051908101604052806000815250600060010261272d565b949350505050565b610e1060189283900481900492909104041490565b600080611a77611cf5565b6004541580611a865750600554155b15611a9057611b30565b50825b600a54611aa290858501612785565b811015611b0357611abb600b828154811015156118a257fe5b158015611ae85750600a805482908110611ad157fe5b90600052602060002090600b020160020154600014155b15611afb57611af681611d2b565b820191505b600101611a93565b600854611b16908363ffffffff61154716565b600855600654611b2c908363ffffffff61271616565b6006555b50505050565b611b3e612f5d565b600160a060020a038216600090815260096020526040902054600a80549091908110611b6657fe5b6000918252602091829020604080516101a081018252600b909302909101805483526001810154938301939093526002830154908201526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260088201546101008201526009820154610120820152600a90910154600160a060020a03811661014083015260ff740100000000000000000000000000000000000000008204811661016084015275010000000000000000000000000000000000000000009091041615156101808201529050919050565b600080611c5383611564565b9050801515611c6157600080fd5b600a805482908110611c6f57fe5b90600052602060002090600b02016008015491506000600a82815481101515611c9457fe5b90600052602060002090600b020160080181905550611cb560085483612716565b60085550919050565b6040805160208082528183019092526000916060919080820161040080388339019050509050828152600154602082a15192915050565b611d0142600754611a57565b1515611d2957601e611d11611ebb565b811515611d1a57fe5b04600555600654600455426007555b565b6000806000806000611d86600a87815481101515611d4557fe5b90600052602060002090600b020160070154600a88815481101515611d6657fe5b90600052602060002090600b0201600201546119fe90919063ffffffff16565b9350611dbb600a87815481101515611d9a57fe5b90600052602060002090600b0201600401548561271690919063ffffffff16565b9250600454611dd5846005546119fe90919063ffffffff16565b811515611dde57fe5b0491506103e8611df585600263ffffffff6119fe16565b811515611dfe57fe5b04905080821115611e0d578091505b611e178683612796565b915042600b87815481101515611e2957fe5b906000526020600020906008020160060181905550611e6e82600b88815481101515611e5157fe5b60009182526020909120600890910201549063ffffffff61154716565b600b805488908110611e7c57fe5b6000918252602090912060089091020155600b805483919088908110611e9e57fe5b600091825260209091206004600890920201015550949350505050565b6000610e7a600854611eeb60408051908101604052806004815260200160e460020a630414950502815250611cbe565b9063ffffffff61271616565b6000806000611f04610e7f565b909250905081611f1a858363ffffffff6119fe16565b811515611f2357fe5b04949350505050565b60408051602080825281830190925260609160009183918391829184919080820161040080388339019050509350600092505b6020831015611ffb576008830260020a870291507fff00000000000000000000000000000000000000000000000000000000000000821615611fe557818486815181101515611faa57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190940193611ff0565b8415611ff057611ffb565b600190920191611f5f565b846040519080825280601f01601f191660200182016040528015612029578160200160208202803883390190505b509050600092505b848310156120db57838381518110151561204757fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000281848151811015156120a057fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190920191612031565b9695505050505050565b6020015190565b600080808080808080808080690a968163f0a57b4000008c10612143576001600a8e81548110151561211a57fe5b90600052602060002090600b0201600a0160156101000a81548160ff0219169083151502179055505b600a80548e90811061215157fe5b90600052602060002090600b02016007015460001415612198576121748c612a76565b600a80548f90811061218257fe5b90600052602060002090600b0201600701819055505b600a80548e9c508c9081106121a957fe5b90600052602060002090600b02016000015499508b97505b891561260957600a80548c9081106121d557fe5b90600052602060002090600b020160090154600014151561224c57612223600a8c81548110151561220257fe5b90600052602060002090600b0201600901548961154790919063ffffffff16565b97506000600a8c81548110151561223657fe5b90600052602060002090600b0201600901819055505b61012c8914801561227d5750600a80548b90811061226657fe5b90600052602060002090600b020160000154600014155b156122dd576122b588600a8c81548110151561229557fe5b90600052602060002090600b02016009015461154790919063ffffffff16565b600a80548c9081106122c357fe5b90600052602060002090600b020160090181905550612609565b6122f088600a8c815481101515610b5b57fe5b600a80548c9081106122fe57fe5b90600052602060002090600b020160050181905550600a80548b90811061232157fe5b90600052602060002090600b02016001015460001415612365578a600a8b81548110151561234b57fe5b90600052602060002090600b0201600101819055506125d7565b600a80548b90811061237357fe5b90600052602060002090600b02016001015496506123ba600a8881548110151561239957fe5b90600052602060002090600b020160030154600a89815481101515610b5b57fe5b95506123ef600a8c8154811015156123ce57fe5b90600052602060002090600b020160030154600a8d815481101515610b5b57fe5b94508a600a8b81548110151561240157fe5b90600052602060002090600b0201600101541415801561242057508585115b1561244e578a600a8b81548110151561243557fe5b90600052602060002090600b0201600101819055508495505b61248586611eeb600a8d81548110151561246457fe5b90600052602060002090600b020160090154600a8e815481101515610b5b57fe5b935069a968163f0a57b400000086101580156124ac57506a0152d02c7e14af680000008410155b156124ba5760049250612555565b6954b40b1f852bda00000086101580156124de575069a968163f0a57b40000008410155b156124ec5760039250612555565b692a5a058fc295ed000000861015801561251057506954b40b1f852bda0000008410155b1561251e5760029250612555565b69152d02c7e14af680000086101580156125425750692a5a058fc295ed0000008410155b156125505760019250612555565b600092505b600a80548b90811061256357fe5b60009182526020909120600a600b90920201015460ff74010000000000000000000000000000000000000000909104811690841611156125d75782600a8b8154811015156125ad57fe5b90600052602060002090600b0201600a0160146101000a81548160ff021916908360ff1602179055505b600a80546001909a01998b9190829081106125ee57fe5b60009182526020909120600b9091020154909b5099506121c1565b612633600a8e81548110151561261b57fe5b90600052602060002090600b0201600001548d612ab3565b82019150612661600a8e81548110151561264957fe5b90600052602060002090600b0201600001548d612bae565b8201915061268f600a8e81548110151561267757fe5b90600052602060002090600b0201600001548d612d74565b6008549201916126a5908363ffffffff61154716565b600855600a80546126dc91908f9081106126bb57fe5b90600052602060002090600b0201600701548d6119fe90919063ffffffff16565b90506126ee818363ffffffff61271616565b600654909150612704908263ffffffff61154716565b60065550505050505050505050505050565b6000808383111561272657600080fd5b5050900390565b6040805160a080825260c0820190925260009160609190602082016114008038833901905050905086815285602082015284604082015283606082015282608082015260025460a082a1608001519695505050505050565b60008183101561124a5750816114e8565b6000806127cc600a858154811015156127ab57fe5b90600052602060002090600b020160070154600a86815481101515611d6657fe5b905080612802600a868154811015156127e157fe5b90600052602060002090600b0201600401548561154790919063ffffffff16565b111561283e5761283b600a8581548110151561281a57fe5b90600052602060002090600b0201600401548261271690919063ffffffff16565b92505b61287183600a8681548110151561285157fe5b90600052602060002090600b02016004015461154790919063ffffffff16565b600a80548690811061287f57fe5b90600052602060002090600b02016004018190555080600a858154811015156128a457fe5b90600052602060002090600b020160040154101515612943576000600a858154811015156128ce57fe5b90600052602060002090600b0201600201819055506000600a858154811015156128f457fe5b90600052602060002090600b0201600401819055506000600a8581548110151561291a57fe5b90600052602060002090600b0201600a0160156101000a81548160ff0219169083151502179055505b61296d42600b8681548110151561295657fe5b906000526020600020906008020160070154611a57565b15156129c25782600b8581548110151561298357fe5b90600052602060002090600802016005018190555042600b858154811015156129a857fe5b906000526020600020906008020160070181905550612a19565b6129f583600b868154811015156129d557fe5b90600052602060002090600802016005015461154790919063ffffffff16565b600b805486908110612a0357fe5b9060005260206000209060080201600501819055505b612a4c83600a86815481101515612a2c57fe5b90600052602060002090600b02016008015461154790919063ffffffff16565b600a805486908110612a5a57fe5b600091825260209091206008600b909202010155509092915050565b6000683635c9adc5dea00000821015612a915750600361157e565b69010f0cf064dd59200000821015612aab5750600461157e565b50600561157e565b6000808080851515612ac457612ba5565b612ad08686600a612ea0565b83019250600a86815481101515612ae357fe5b60009182526020909120600b909102015491508115612ba1576002600a83815481101515612b0d57fe5b90600052602060002090600b020160060154101515612b3757612b3282866008612ea0565b830192505b600a805483908110612b4557fe5b90600052602060002090600b020160000154905060008114158015612b8b57506003600a82815481101515612b7657fe5b90600052602060002090600b02016006015410155b15612ba157612b9c81866007612ea0565b830192505b8293505b50505092915050565b600080808080861515612bc057612d6a565b8615801590612bd0575061012c84105b8015612bdc5750600c83105b15612d6a57600a805488908110612bef57fe5b60009182526020909120600b90910201600a015474010000000000000000000000000000000000000000900460ff161580612c495750600a805488908110612c3357fe5b90600052602060002090600b0201600201546000145b15612c7a57600a805488908110612c5c57fe5b60009182526020909120600b90910201549650600190930192612bc0565b600a805488908110612c8857fe5b60009182526020909120600a600b909202010154600360ff74010000000000000000000000000000000000000000909204821602169150828211612cd457600a805488908110612c5c57fe5b90918203906064612ceb878463ffffffff6119fe16565b811515612cf457fe5b049050612d018782612796565b9050612d3681600b89815481101515612d1657fe5b90600052602060002090600802016002015461154790919063ffffffff16565b600b805489908110612d4457fe5b6000918252602090912060026008909202010155600a80549582019588908110612c5c57fe5b5050505092915050565b600080831515612d835761155d565b8315801590612dbc5750600a805485908110612d9b57fe5b90600052602060002090600b0201600a0160159054906101000a900460ff16155b8015612dc9575061012c81105b15612df757600a805485908110612ddc57fe5b60009182526020909120600b90910201549350600101612d83565b8315801590612e2f5750600a805485908110612e0f57fe5b90600052602060002090600b0201600a0160159054906101000a900460ff165b1561155d57612e418460148504612796565b9150612e7682600b86815481101515612e5657fe5b90600052602060002090600802016003015461154790919063ffffffff16565b600b805486908110612e8457fe5b9060005260206000209060080201600301819055505092915050565b600080600a85815481101515612eb257fe5b90600052602060002090600b02016002015460001415612ed157612f55565b6064612ee3858563ffffffff6119fe16565b811515612eec57fe5b049050612ef98582612796565b9050612f2e81600b87815481101515612f0e57fe5b90600052602060002090600802016001015461154790919063ffffffff16565b600b805487908110612f3c57fe5b9060005260206000209060080201600101819055508091505b509392505050565b6101a060405190810160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000600160a060020a03168152602001600060ff16815260200160001515815250905600a165627a7a7230582044ea9559157d573fa9cbe109d785ba4c6d479b0d1d659d1fa6122554236a607b0029") data4= common.Hex2Bytes("60806040526004361061023b5760003560e01c8063672d7a0d1161012e578063b13c86a3116100ab578063ef0bb2611161006f578063ef0bb261146105fd578063f0b4dbbf1461061d578063f2d109e71461063d578063f2fde38b14610652578063f684b959146106725761023b565b8063b13c86a31461057c578063be6f42431461059e578063cb4ac944146105c0578063e0992711146105d5578063e99595a4146105e85761023b565b8063817a2529116100f2578063817a25291461051d57806386fd96b6146105325780638da5cb5b1461054557806395d89b4114610255578063a2ced305146105675761023b565b8063672d7a0d146104935780636a472f3e146104b35780636b80f07b146104c85780637adbf973146104e857806380313d31146105085761023b565b806338d07436116101bc578063565974d311610180578063565974d31461042c5780635920375c1461044e5780635960ece7146104565780635bea9faa1461047657806366666aa91461047e5761023b565b806338d07436146103895780633eaaf86b146103a95780633feb5f2b146103be5780634281fff3146103f757806345ccadb0146104175761023b565b806318160ddd1161020357806318160ddd146102ed57806323c674d4146103025780632d1f329f14610322578063313ce56714610342578063370158ea146103645761023b565b80630224c20e1461024057806306fdde03146102555780630bfa2e0d146102805780630f8b38b3146102a057806317d35d1e146102cd575b600080fd5b61025361024e366004613e0f565b610692565b005b34801561026157600080fd5b5061026a61069f565b60405161027791906141c1565b60405180910390f35b61029361028e366004613f44565b6106c0565b60405161027791906141b6565b3480156102ac57600080fd5b506102c06102bb366004613fa8565b610701565b604051610277919061451e565b3480156102d957600080fd5b506102c06102e8366004613fa8565b610713565b3480156102f957600080fd5b506102c0610725565b34801561030e57600080fd5b506102c061031d366004613fa8565b61072b565b34801561032e57600080fd5b506102c061033d366004613e0f565b610749565b34801561034e57600080fd5b5061035761075b565b6040516102779190614556565b34801561037057600080fd5b50610379610760565b6040516102779493929190614527565b34801561039557600080fd5b506102536103a4366004613fc0565b61078e565b3480156103b557600080fd5b506102c0610881565b3480156103ca57600080fd5b506103de6103d9366004613fa8565b610887565b6040516102779d9c9b9a99989796959493929190614108565b34801561040357600080fd5b506102c0610412366004613fa8565b61090a565b34801561042357600080fd5b506102c0610917565b34801561043857600080fd5b5061044161091d565b6040516102779190614326565b610253610dd3565b34801561046257600080fd5b506102c0610471366004613fa8565b610f3b565b610253610f48565b34801561048a57600080fd5b506102c0610fe5565b34801561049f57600080fd5b506102536104ae366004613e0f565b610feb565b3480156104bf57600080fd5b506102c0611044565b3480156104d457600080fd5b506102536104e3366004613e0f565b61104a565b3480156104f457600080fd5b50610253610503366004613e0f565b611083565b34801561051457600080fd5b506102c06110bc565b34801561052957600080fd5b506102c06110c2565b610293610540366004613f44565b6110c8565b34801561055157600080fd5b5061055a611261565b60405161027791906140f4565b34801561057357600080fd5b506102c0611270565b34801561058857600080fd5b50610591611276565b6040516102779190614172565b3480156105aa57600080fd5b506105b36113b1565b6040516102779190614436565b3480156105cc57600080fd5b506102c0611947565b6102536105e3366004613f44565b61194d565b3480156105f457600080fd5b50610253611a4b565b34801561060957600080fd5b506102c0610618366004613fa8565b611c36565b34801561062957600080fd5b506102c0610638366004613fa8565b611c48565b34801561064957600080fd5b50610253611c5a565b34801561065e57600080fd5b5061025361066d366004613e0f565b611d64565b34801561067e57600080fd5b506102c061068d366004613fa8565b611dea565b61069c3382611dfc565b50565b604080518082019091526006815265434f494e484960d01b60208201525b90565b60008151600014156106d4575060006106fc565b600080838060200190518101906106eb9190613e2b565b915091506106f98282611dfc565b50505b919050565b600a6020526000908152604090205481565b60096020526000908152604090205481565b601b5490565b6012818154811061073857fe5b600091825260209091200154905081565b60146020526000908152604090205481565b601290565b60008060008060185460065460046018548161077857fe5b0401601954600654935093509350935090919293565b3360009081526014602052604090205480158015906107ae575060155481105b6107b757600080fd5b6000831180156107d15750690a968163f0a57b4000008311155b6107da57600080fd5b6107e48184611f4b565b9250826107f1575061087d565b8161080557610800338461209d565b61087b565b606061080f611276565b905061085c8160008151811061082157fe5b60200260200101516108508360018151811061083957fe5b60200260200101518761217190919063ffffffff16565b9063ffffffff61219f16565b935061086833856121c1565b61087157600080fd5b610879612232565b505b505b5050565b601b5481565b6015818154811061089457fe5b60009182526020909120600d9091020180546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a8b0154600b8c0154600c909c01546001600160a01b03909b169c50989a97999698959794969395929491939092919060ff168d565b6013818154811061073857fe5b60075481565b610925613bf3565b336000908152601460205260409020548061094057506106bd565b610948613c72565b6015828154811061095557fe5b6000918252602091829020604080516101a081018252600d90930290910180546001600160a01b03908116845260018201549484019490945260028101548383015260038101546060808501919091526004808301546080860152600583015460a0860152600683015460c0860152600783015460e086015260088301546101008601526009830154610120860152600a830154610140860152600b830154610160860152600c9092015460ff161515610180850152601e5492516301d294a560e51b8152939550939190911691633a5294a091610a3591879101614542565b60006040518083038186803b158015610a4d57600080fd5b505afa158015610a61573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a899190810190613f76565b905060608260200151600014610b2357601e5460208401516040516301d294a560e51b81526001600160a01b0390921691633a5294a091610acc91600401614542565b60006040518083038186803b158015610ae457600080fd5b505afa158015610af8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b209190810190613f76565b90505b600080808080806201518042049050808961010001511015610c07576000610b4a8b6122d7565b90506000610b5f828c61010001518503612314565b905080821015610b6c5750805b60e08b0151610b81908263ffffffff61242916565b60c08c0151909650610b99908263ffffffff61242916565b9650610ba48c61243b565b8610158015610bb857508a60a00151601a54115b15610be157610bda86610bce8d6060015161248e565b9063ffffffff6124a616565b9450610be9565b8a6080015194505b610bfe86610bce87610bce8f6060015161248e565b97505050610c28565b8860c0015194508860e00151935088608001519250610c258a6122d7565b95505b61271060038702049150600060608a60400151600014610d0f57601e546040808d015190516301d294a560e51b81526001600160a01b0390921691633a5294a091610c7591600401614542565b60006040518083038186803b158015610c8d57600080fd5b505afa158015610ca1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610cc99190810190613f76565b9050610d0c610cdb8c6040015161243b565b60158d6040015181548110610cec57fe5b90600052602060002090600d02016009015461242990919063ffffffff16565b91505b6040518061020001604052808b81526020018a81526020018281526020018981526020018681526020018881526020018781526020018c60a0015181526020018c61014001518d61012001510181526020018381526020018581526020018c610160015181526020018c610180015115158152602001600960008f8152602001908152602001600020548152602001600a60008f8152602001908152602001600020548152602001610dc08e61243b565b90529c5050505050505050505050505090565b610e00604051806040016040528060048152602001635345524f60e01b815250610dfb6124bb565b6124fb565b610e0957600080fd5b336000908152601460205260409020548015801590610e29575060155481105b610e3257600080fd5b610e3b81612577565b6060610e45611276565b90506000610e8882600181518110610e5957fe5b602002602001015161085084600081518110610e7157fe5b60200260200101513461217190919063ffffffff16565b90508060190260158481548110610e9b57fe5b90600052602060002090600d0201600401541015610edc57600060158481548110610ec257fe5b90600052602060002090600d020160040181905550610f33565b610f108160190260158581548110610ef057fe5b90600052602060002090600d0201600401546124a690919063ffffffff16565b60158481548110610f1d57fe5b90600052602060002090600d0201600401819055505b61087b612232565b6010818154811061073857fe5b610f70604051806040016040528060048152602001635345524f60e01b815250610dfb6124bb565b610f955760405162461bcd60e51b8152600401610f8c906142dd565b60405180910390fd5b610fb06064600334025b60065491900463ffffffff61242916565b6006556060610fbd611276565b90506000610fd182600181518110610e5957fe5b9050610fdd338261209d565b61087d612232565b60065481565b6005546001600160a01b0316331461100257600080fd5b6001600160a01b03811660009081526014602052604090205480156110395760405162461bcd60e51b8152600401610f8c906142b2565b61087b60008361267b565b60195481565b6005546001600160a01b0316331461106157600080fd5b601c80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461109a57600080fd5b601d80546001600160a01b0319166001600160a01b0392909216919091179055565b60115481565b60185481565b80516000901561121d5760006060838060200190518101906110ea9190613e64565b9150915060006110f8612929565b90508061110b57600093505050506106fc565b6001600160a01b0383166000908152601460205260409020548061120a57600061114460405180602001604052806000815250856124fb565b6111d457601e546040516349145c9160e01b81526001600160a01b03909116906349145c91906111789087906004016141c1565b60206040518083038186803b15801561119057600080fd5b505afa1580156111a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c8919061400b565b6001600160401b031690505b80158015906111e4575060155481105b156111fa576111f3818661267b565b9150611208565b6000955050505050506106fc565b505b6112148183612abd565b50505050611259565b611245604051806040016040528060048152602001635345524f60e01b815250610dfb6124bb565b611251575060006106fc565b611259612232565b506001919050565b6005546001600160a01b031681565b601a5481565b601d546060906001600160a01b03166112a15760405162461bcd60e51b8152600401610f8c9061423a565b60408051600280825260608201835290916020830190803683375050601d546040516305b985e160e11b81529293506001600160a01b031691630b730bc291506112ed90600401614309565b604080518083038186803b15801561130457600080fd5b505afa158015611318573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133c9190613fe8565b8260008151811061134957fe5b602002602001018360018151811061135d57fe5b60200260200101828152508281525050508060008151811061137b57fe5b60200260200101516000141580156113a857508060018151811061139b57fe5b6020026020010151600014155b6106bd57600080fd5b6113b9613ce5565b6012546060906001600160401b03811180156113d457600080fd5b5060405190808252806020026020018201604052801561140857816020015b60608152602001906001900390816113f35790505b506012549091506060906001600160401b038111801561142757600080fd5b50604051908082528060200260200182016040528015611451578160200160208202803683370190505b50905060005b60125481101561156c57601e54601280546001600160a01b0390921691633a5294a091908490811061148557fe5b90600052602060002001546040518263ffffffff1660e01b81526004016114ac9190614542565b60006040518083038186803b1580156114c457600080fd5b505afa1580156114d8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115009190810190613f76565b83828151811061150c57fe5b60200260200101819052506064611545600d838154811061152957fe5b906000526020600020015460115461217190919063ffffffff16565b8161154c57fe5b0482828151811061155957fe5b6020908102919091010152600101611457565b5060065460009061158490601463ffffffff61219f16565b905060606115e160108054806020026020016040519081016040528092919081815260200182805480156115d757602002820191906000526020600020905b8154815260200190600101908083116115c3575b5050505050613167565b9050606081516001600160401b03811180156115fc57600080fd5b5060405190808252806020026020018201604052801561163057816020015b606081526020019060019003908161161b5790505b509050606082516001600160401b038111801561164c57600080fd5b50604051908082528060200260200182016040528015611676578160200160208202803683370190505b509050606082516001600160401b038111801561169257600080fd5b506040519080825280602002602001820160405280156116bc578160200160208202803683370190505b50905060005b845181101561180a57601e5485516001600160a01b0390911690633a5294a0908790849081106116ee57fe5b60200260200101516040518263ffffffff1660e01b81526004016117129190614542565b60006040518083038186803b15801561172a57600080fd5b505afa15801561173e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117669190810190613f76565b84828151811061177257fe5b60200260200101819052506117ac6064610850600d848154811061179257fe5b90600052602060002001548961217190919063ffffffff16565b8382815181106117b857fe5b602002602001018181525050600e60008683815181106117d457fe5b60200260200101518152602001908152602001600020548282815181106117f757fe5b60209081029190910101526001016116c2565b5033600090815260146020526040812054601580548290811061182957fe5b60009182526020909120600c600d90920201015460ff16801561185e575062015180420462015180600b548161185b57fe5b04145b8015611886575062015180426000838152600c60205260409020549190049062015180900414155b1561189f576007546011546002028161189b57fe5b0491505b60405180610140016040528060115481526020018a8152602001898152602001601380548060200260200160405190810160405280929190818152602001828054801561190b57602002820191906000526020600020905b8154815260200190600101908083116118f7575b50505050508152602001888152602001868152602001858152602001848152602001600b54815260200183815250995050505050505050505090565b600b5481565b6000611957612929565b3360009081526014602052604090205490915080611a4157600061198a60405180602001604052806000815250856124fb565b611a1a57601e546040516349145c9160e01b81526001600160a01b03909116906349145c91906119be9087906004016141c1565b60206040518083038186803b1580156119d657600080fd5b505afa1580156119ea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0e919061400b565b6001600160401b031690505b8015801590611a2a575060155481105b611a3357600080fd5b611a3d813361267b565b9150505b61087b8183612abd565b62015180420462015180600b5481611a5f57fe5b041415611a6b57600080fd5b42600b55611a7b60126000613d38565b611a8760136000613d38565b600654611a9b90601463ffffffff61219f16565b6011819055506060611afa60108054806020026020016040519081016040528092919081815260200182805480156115d757602002820191906000526020600020908154815260200190600101908083116115c3575050505050613167565b90506000805b8251811015611c13576012838281518110611b1757fe5b60209081029190910181015182546001810184556000938452918320909101558351601391600e91869085908110611b4b57fe5b602090810291909101810151825281810192909252604001600090812054835460018101855593825291812090920155600d8054606491611b90918590811061152957fe5b81611b9757fe5b0490508083019250611c016015858481518110611bb057fe5b602002602001015181548110611bc257fe5b6000918252602091829020600d90910201546040805180820190915260048152635345524f60e01b928101929092526001600160a01b03169083613272565b611c0a57600080fd5b50600101611b00565b50600654611c27908263ffffffff6124a616565b60065561087d60106000613d38565b60086020526000908152604090205481565b60166020526000908152604090205481565b336000908152601460205260409020548015801590611c7a575060155481105b611c8357600080fd5b62015180420462015180600b5481611c9757fe5b0414611ca257600080fd5b60158181548110611caf57fe5b60009182526020909120600c600d90920201015460ff16611ccf57600080fd5b62015180426000838152600c6020526040902054919004906201518090041415611cf857600080fd5b6000818152600c6020526040812042905560075460115460020281611d1957fe5b049050611d31816006546124a690919063ffffffff16565b6006556040805180820190915260048152635345524f60e01b6020820152611d5b90339083613272565b61087d57600080fd5b6005546001600160a01b03163314611d7b57600080fd5b6001600160a01b038116611d8e57600080fd5b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b60176020526000908152604090205481565b806001600160a01b0316826001600160a01b03161415611e1b57600080fd5b6001600160a01b0382166000908152601460205260409020548015801590611e44575060155481105b611e4d57600080fd5b6000611e57612929565b6001600160a01b03841660009081526014602052604081205491925081611ea1575060018315801590611e8b575060155484105b611e9457600080fd5b611e9e848661267b565b91505b611ec5846019611eb886600263ffffffff61217116565b81611ebf57fe5b04612abd565b611ecf8284612abd565b8015611f43576001600160a01b038516600090815260146020526040812054611ef89082611f4b565b90506060611f04611276565b9050611f3787611f3283600081518110611f1a57fe5b60200260200101516108508560018151811061083957fe5b6121c1565b611f4057600080fd5b50505b505050505050565b6000611f5683612577565b600060158481548110611f6557fe5b90600052602060002090600d020190508260001415611fa55780600601549250690a968163f0a57b400000831115611fa557690a968163f0a57b40000092505b8060060154831115611fb657600080fd5b620151804260008681526017602052604090205491900490620151809004141561204357600084815260166020526040902054690a968163f0a57b40000090612005908563ffffffff61242916565b111561201057600080fd5b60008481526016602052604090205461202f908463ffffffff61242916565b600085815260166020526040902055612079565b690a968163f0a57b40000083111561205a57600080fd5b6000848152601660209081526040808320869055601790915290204290555b600681015461208e908463ffffffff6124a616565b60069091015550805b92915050565b60006120c660405180604001604052806006815260200165434f494e484960d01b81525061329b565b9050818110612101576120f88360405180604001604052806006815260200165434f494e484960d01b81525084613272565b61080057600080fd5b601b8054828403908101909155604080518082019091526006815265434f494e484960d01b60208201526121369082906132d1565b61213f57600080fd5b6121688460405180604001604052806006815260200165434f494e484960d01b81525085613272565b61087957600080fd5b60008261218057506000612097565b8282028284828161218d57fe5b041461219857600080fd5b9392505050565b60008082116121ad57600080fd5b60008284816121b857fe5b04949350505050565b60006121d86006548361242990919063ffffffff16565b6121fd604051806040016040528060048152602001635345524f60e01b81525061329b565b101561220b57506000612097565b61219883604051806040016040528060048152602001635345524f60e01b81525084613272565b6000612259604051806040016040528060048152602001635345524f60e01b81525061329b565b9050600654811161227657601a546122705742601a555b506122d5565b600061228d600654836124a690919063ffffffff16565b90506018548111156122b35760188190556019548111156122ae576000601a555b61087d565b6004601854816122bf57fe5b0481101561087d5742601a556018805460195555505b565b600080601583815481106122e757fe5b90600052602060002090600d020190506121988160070154610bce8360040154610bce856003015461248e565b60008161232357506000612097565b600a8083049083066000805b838110156123b8576123696ec097ce7bc90715b34b9f1000000000610850896ec012d88ef11e1522c212609a2510ad63ffffffff61217116565b91506123a36123966123896127106108508661270d63ffffffff61217116565b899063ffffffff6124a616565b869063ffffffff61242916565b945061271061270d830204965060010161232f565b508115612420576123e3600019830161271081900a9061085090899061270d0a63ffffffff61217116565b905061241d6124106124036127106108508561270d63ffffffff61217116565b889063ffffffff6124a616565b859063ffffffff61242916565b93505b50505092915050565b60008282018381101561219857600080fd5b6000818152600a60209081526040808320546009909252822054601580546120979392610bce9290918790811061246e57fe5b90600052602060002090600d0201600301546124a690919063ffffffff16565b6000612097600a61085084607d63ffffffff61217116565b6000828211156124b557600080fd5b50900390565b6040805160208082528183019092526060918291906020820181803683370190505090506000600354602083a15080516124f48161330f565b9250505090565b6000815183511461250e57506000612097565b60005b835181101561256d5782818151811061252657fe5b602001015160f81c60f81b6001600160f81b03191684828151811061254757fe5b01602001516001600160f81b03191614612565576000915050612097565b600101612511565b5060019392505050565b60006015828154811061258657fe5b90600052602060002090600d0201905060006201518042816125a457fe5b049050808260080154101561087b5760006125be846122d7565b9050806125d1575060089091015561069c565b60006125e38285600801548503612314565b600885018490559050808210156125f75750805b600784015461260c908263ffffffff61242916565b60078501556006840154612626908263ffffffff61242916565b60068501556126348561243b565b84600701541015801561264c57508360050154601a54115b15612674576126668460070154610bce866003015461248e565b6004850155601a5460058501555b5050505050565b601580546001600160a01b03928316600081815260146020908152604080832085905580516101a0810182529384529083019687528201818152606083018281526080840183815260a0850184815260c0860185815260e0870186815262015180420460001901610100890190815261012089018881526101408a018981526101608b018a81526101808c018b815260018e018f559d909a5299517f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec475600d8d0290810180546001600160a01b03191692909f1691909117909d559c517f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4768d015595517f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4778c015593517f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4788b015591517f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4798a0155517f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47a890155517f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47b880155517f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47c870155517f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47d86015594517f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47e850155517f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47f84015592517f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec480830155517f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec481909101805460ff191691151591909117905590565b600060606129356124bb565b90506060612941611276565b9050600061296b604051806040016040528060048152602001635345524f60e01b815250846124fb565b156129985761298082600181518110610e5957fe5b9050612990606460033402610f9f565b600655612a20565b6129be6040518060400160405280600481526020016353434e5960e01b815250846124fb565b156129d45750346129cf838261343b565b612a20565b6129fc60405180604001604052806006815260200165434f494e484960d01b815250846124fb565b15612a08575034612a20565b60405162461bcd60e51b8152600401610f8c90614287565b6000612a6183600081518110612a3257fe5b602002602001015161085085600181518110612a4a57fe5b60200260200101518561217190919063ffffffff16565b600554909150612a7e906001600160a01b03166064835b046121c1565b50601f54612a97906001600160a01b0316606483612a78565b50602054612ab3906001600160a01b0316606460038402612a78565b50506124f4612232565b600060158381548110612acc57fe5b90600052602060002090600d020190508060030154600014612b5257612af183612577565b6000612710612b106003612b048661248e565b9063ffffffff61217116565b81612b1757fe5b049050612b3181836006015461242990919063ffffffff16565b60068301556007820154612b4b908263ffffffff61242916565b6007830155505b6003810154612b67908363ffffffff61242916565b600382015560018101548015801590612b8857506000612b86826122d7565b115b15612c2e57600081815260086020526040902054612bac908463ffffffff61242916565b600082815260086020908152604080832093909355600b54600f909152919020541015612bf6576000818152600e60209081526040808320869055600f9091529020429055612c25565b6000818152600e6020526040902054612c15908463ffffffff61242916565b6000828152600e60205260409020555b612c2e81613555565b836000845b83156131425760158381548110612c4657fe5b90600052602060002090600d0201600a0154600014612d0857612c9060158481548110612c6f57fe5b90600052602060002090600d0201600a01548261242990919063ffffffff16565b9050612cc160158481548110612ca257fe5b90600052602060002090600d0201600a015460158581548110610cec57fe5b60158481548110612cce57fe5b90600052602060002090600d020160090181905550600060158481548110612cf257fe5b90600052602060002090600d0201600a01819055505b609682148015612d37575060158481548110612d2057fe5b90600052602060002090600d020160010154600014155b15612d9457612d6d8160158681548110612d4d57fe5b90600052602060002090600d0201600a015461242990919063ffffffff16565b60158581548110612d7a57fe5b90600052602060002090600d0201600a0181905550613142565b612da58160158681548110610cec57fe5b60158581548110612db257fe5b90600052602060002090600d02016009018190555060158481548110612dd457fe5b90600052602060002090600d02016002015460001415612e16578260158581548110612dfc57fe5b90600052602060002090600d020160020181905550613110565b600060158581548110612e2557fe5b90600052602060002090600d02016002015490506000612e54612e478361243b565b60158481548110610cec57fe5b90506000612e71612e648761243b565b60158881548110610cec57fe5b90508560158881548110612e8157fe5b90600052602060002090600d02016002015414158015612ea057508181115b15612ecc578560158881548110612eb357fe5b90600052602060002090600d0201600201819055508091505b6000612f0183610bce60158b81548110612ee257fe5b90600052602060002090600d0201600a015460158c81548110610cec57fe5b905060006a0d3c21bcecceda100000008410158015612f2b57506a02a5a058fc295ed00000008210155b15612f385750600661302d565b6a069e10de76676d080000008410158015612f5e57506a0152d02c7e14af680000008210155b15612f6b5750600561302d565b6a034f086f3b33b6840000008410158015612f90575069a968163f0a57b40000008210155b15612f9d5750600461302d565b6a01a784379d99db420000008410158015612fc257506954b40b1f852bda0000008210155b15612fcf5750600361302d565b69d3c21bcecceda10000008410158015612ff35750692a5a058fc295ed0000008210155b156130005750600261302d565b6969e10de76676d080000084101580156130245750690a968163f0a57b4000008210155b1561302d575060015b6015898154811061303a57fe5b90600052602060002090600d0201600b01548160ff161461307c578060ff1660158a8154811061306657fe5b90600052602060002090600d0201600b01819055505b6a0d3c21bcecceda1000000084101580156130a257506a04f68ca6d8cd91c60000008210155b1561310a57601589815481106130b457fe5b60009182526020909120600c600d90920201015460ff1661310a57600160158a815481106130de57fe5b60009182526020909120600d90910201600c01805460ff19169115159190911790556007805460010190555b50505050505b836015858154811061311e57fe5b600091825260209091206001600d9092020181015495509093509190910190612c33565b6131508560010154876136db565b61315e8560010154876136ef565b50505050505050565b606081516000141561317a5750806106fc565b6000805b600184510381101561326a57905080600181015b84518110156131fb57600e60008683815181106131ab57fe5b6020026020010151815260200190815260200160002054600e60008786815181106131d257fe5b602002602001015181526020019081526020016000205410156131f3578092505b600101613192565b5080821461326257600084828151811061321157fe5b6020026020010151905084838151811061322757fe5b602002602001015185838151811061323b57fe5b6020026020010181815250508085848151811061325457fe5b602002602001018181525050505b60010161317e565b509192915050565b6000613293848484604051806020016040528060008152506000801b6137fd565b949350505050565b60408051602080825281830190925260009160609190602082018180368337019050509050828152600154602082a15192915050565b6040805181815260608181018352600092909190602082018180368337019050509050828152836020820152600054604082a1602001519392505050565b604080516020808252818301909252606091600091839160208201818036833701905050905060005b602081101561339e576008810260020a85026001600160f81b0319811615613389578083858151811061336757fe5b60200101906001600160f81b031916908160001a905350600190930192613395565b8315613395575061339e565b50600101613338565b506060826001600160401b03811180156133b757600080fd5b506040519080825280601f01601f1916602001820160405280156133e2576020820181803683370190505b50905060005b83811015613432578281815181106133fc57fe5b602001015160f81c60f81b82828151811061341357fe5b60200101906001600160f81b031916908160001a9053506001016133e8565b50949350505050565b601c546001600160a01b03166134635760405162461bcd60e51b8152600401610f8c90614262565b801561087d576134878282604051806020016040528060008152506000801b613853565b601c5460408051808201825260048152635345524f60e01b60208083019190915282516000808252918101938490526340597a9160e01b909352926001600160a01b0316916340597a91916134e1913090602481016141d4565b600060405180830381600087803b1580156134fb57600080fd5b505af115801561350f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526135379190810190613eb2565b511161087d5760405162461bcd60e51b8152600401610f8c90614212565b60105461359657601080546001810182556000919091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720181905561069c565b6000805b60105481101561363257601081815481106135b157fe5b90600052602060002001548314156135ca57505061069c565b600e6000601084815481106135db57fe5b9060005260206000200154815260200190815260200160002054600e60006010848154811061360657fe5b9060005260206000200154815260200190815260200160002054101561362a578091505b60010161359a565b506010546006111561367857601080546001810182556000919091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720182905561087d565b600e60006010838154811061368957fe5b9060005260206000200154815260200190815260200160002054600e600084815260200190815260200160002054111561087d5781601082815481106136cb57fe5b6000918252602090912001555050565b6136e58282613898565b61087d82826139d4565b816136f95761087d565b6137058282600a613b04565b60006015838154811061371457fe5b90600052602060002090600d02016001015490506000811461087b5761373c81836006613b04565b60006003905060006015838154811061375157fe5b90600052602060002090600d02016001015490505b80158015906137765750600c8211155b156126745761378e69152d02c7e14af680000061248e565b613797826122d7565b1015806137c05750600081815260086020526040902054829069021e19e0c9bab2400000900410155b156137d1576137d181856001613b04565b601581815481106137de57fe5b90600052602060002090600d0201600101549050600182019150613766565b6040805160a080825260c082019092526000916060919060208201818036833701905050905086815285602082015284604082015283606082015282608082015260025460a082a1608001519695505050505050565b60408051608080825260a08201909252606091602082018180368337019050509050848152836020820152826040820152816060820152600454608082a15050505050565b816138a25761087d565b6000805b83158015906138b55750609682105b80156138c15750600781105b1561087957601584815481106138d357fe5b90600052602060002090600d0201600b01546000141561391b57601584815481106138fa57fe5b90600052602060002090600d020160010154935081806001019250506138a6565b60006015858154811061392a57fe5b90600052602060002090600d0201600b01546001019050818111613977576015858154811061395557fe5b90600052602060002090600d02016001015494508280600101935050506138a6565b9081036000606461398e868463ffffffff61217116565b8161399557fe5b0490506139a486826000613b2a565b601586815481106139b157fe5b90600052602060002090600d0201600101549550838060010194505050506138a6565b60408051600680825260e08201909252600091606091906020820160c08036833701905050905060065b8415801590613a0d5750609683105b8015613a195750600081115b1561267457600060158681548110613a2d57fe5b90600052602060002090600d0201600b01541115613ad65781600160158781548110613a5557fe5b90600052602060002090600d0201600b01540381518110613a7257fe5b6020026020010180518091906001018152505081600160158781548110613a9557fe5b90600052602060002090600d0201600b01540381518110613ab257fe5b602002602001015160021415613ad657613ad185606486046000613b2a565b600019015b60158581548110613ae357fe5b90600052602060002090600d020160010154945082806001019350506139fe565b60006064613b18848463ffffffff61217116565b81613b1f57fe5b049050610879848260015b613b3383612577565b8015613b6c57600083815260096020526040902054613b58908363ffffffff61242916565b600084815260096020526040902055613b9b565b6000838152600a6020526040902054613b8b908363ffffffff61242916565b6000848152600a60205260409020555b613bcc8260158581548110613bac57fe5b90600052602060002090600d02016003015461242990919063ffffffff16565b60158481548110613bd957fe5b90600052602060002090600d020160030181905550505050565b6040518061020001604052806060815260200160608152602001606081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000815260200160008152602001600081525090565b604051806101a0016040528060006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b604051806101400160405280600081526020016060815260200160608152602001606081526020016000815260200160608152602001606081526020016060815260200160008152602001600081525090565b508054600082559060005260206000209081019061069c91906106bd91905b80821115613d6b5760008155600101613d57565b5090565b600082601f830112613d7f578081fd5b8135613d92613d8d826145a9565b614564565b9150808252836020828501011115613da957600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112613dd2578081fd5b8151613de0613d8d826145a9565b9150808252836020828501011115613df757600080fd5b613e088160208401602086016145cc565b5092915050565b600060208284031215613e20578081fd5b8135612198816145f8565b60008060408385031215613e3d578081fd5b8251613e48816145f8565b6020840151909250613e59816145f8565b809150509250929050565b60008060408385031215613e76578182fd5b8251613e81816145f8565b60208401519092506001600160401b03811115613e9c578182fd5b613ea885828601613dc2565b9150509250929050565b60006020808385031215613ec4578182fd5b82516001600160401b03811115613ed9578283fd5b80840185601f820112613eea578384fd5b80519150613efa613d8d8361458a565b8281528381019082850185850284018601891015613f16578687fd5b8693505b84841015613f38578051835260019390930192918501918501613f1a565b50979650505050505050565b600060208284031215613f55578081fd5b81356001600160401b03811115613f6a578182fd5b61329384828501613d6f565b600060208284031215613f87578081fd5b81516001600160401b03811115613f9c578182fd5b61329384828501613dc2565b600060208284031215613fb9578081fd5b5035919050565b60008060408385031215613fd2578182fd5b8235915060208301358015158114613e59578182fd5b60008060408385031215613ffa578182fd5b505080516020909101519092909150565b60006020828403121561401c578081fd5b81516001600160401b0381168114612198578182fd5b60008282518085526020808601955080818302840101818601855b8481101561407b57601f198684030189526140698383516140c8565b9884019892509083019060010161404d565b5090979650505050505050565b6000815180845260208085019450808401835b838110156140b75781518752958201959082019060010161409b565b509495945050505050565b15159052565b600081518084526140e08160208601602086016145cc565b601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039d909d168d5260208d019b909b5260408c019990995260608b019790975260808a019590955260a089019390935260c088019190915260e087015261010086015261012085015261014084015261016083015215156101808201526101a00190565b6020808252825182820181905260009190848201906040850190845b818110156141aa5783518352928401929184019160010161418e565b50909695505050505050565b901515815260200190565b60006020825261219860208301846140c8565b6000606082526141e760608301866140c8565b6001600160a01b0385166020840152828103604084015261420881856140c8565b9695505050505050565b6020808252600e908201526d31b0b636103232bc1032b93937b960911b604082015260600190565b6020808252600e908201526d6e6f7420736574206f7261636c6560901b604082015260600190565b6020808252600b908201526a0dcdee840e6cae840c8caf60ab1b604082015260600190565b60208082526011908201527031bab93932b731bc9034b99032b93937b960791b604082015260600190565b602080825260119082015270616464726573732069732065786973747360781b604082015260600190565b60208082526012908201527163757272656e6379206d757374205345524f60701b604082015260600190565b602080825260039082015262434e5960e81b604082015260600190565b60006020825282516102008060208501526143456102208501836140c8565b60208601519250601f198086830301604087015261436382856140c8565b604088015194508187820301606088015261437e81866140c8565b9250505060608601516080860152608086015160a086015260a086015160c086015260c086015160e086015260e086015192506101008381870152808701519350506101208381870152808701519350506101408381870152808701519350506101608381870152808701519350506101808381870152808701519350506101a061440b818701856140c2565b8601516101c0868101919091528601516101e080870191909152909501519301929092525090919050565b60006020825282516020830152602083015161014080604085015261445f610160850183614032565b60408601519250601f198086830301606087015261447d8285614088565b60608801519450818782030160808801526144988186614088565b925050608087015160a087015260a08701519350808683030160c08701526144c08285614032565b60c08801519450818782030160e08801526144db8186614088565b92505060e087015193506101008187840301818801526144fb8386614088565b908801516101208881019190915290970151929095019190915250929392505050565b90815260200190565b93845260208401929092526040830152606082015260800190565b6001600160401b0391909116815260200190565b60ff91909116815260200190565b6040518181016001600160401b038111828210171561458257600080fd5b604052919050565b60006001600160401b0382111561459f578081fd5b5060209081020190565b60006001600160401b038211156145be578081fd5b50601f01601f191660200190565b60005b838110156145e75781810151838201526020016145cf565b838111156108795750506000910152565b6001600160a01b038116811461069c57600080fdfea26469706673582212201075ffa42fe8c48b77f3eba91beb303f3f89e7ad3d050492f9a225013e128f0864736f6c634300060a0033") data5= common.Hex2Bytes("6080604052600436106101355760003560e01c80638416f245116100ab578063b0ce1c641161006f578063b0ce1c6414610711578063bf292e6f14610832578063bf40fac114610865578063c2abc0e614610916578063e99595a4146109c7578063f2fde38b146109cf57610135565b80638416f245146104b157806386fd96b6146105745780638da5cb5b1461061857806396365d44146106495780639f6563211461065e57610135565b8063565974d3116100fd578063565974d3146102505780635fd8c710146103ee578063672d7a0d146104035780636b80f07b146104365780637de34e12146104695780637ffdf53e1461049c57610135565b8063253657731461013a57806327450cc9146101905780632ca9a7c1146101bc5780633c26f84c146101d15780633ed0736514610229575b600080fd5b34801561014657600080fd5b5061014f610a02565b604080519889526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b34801561019c57600080fd5b506101ba600480360360208110156101b357600080fd5b5035610b4a565b005b3480156101c857600080fd5b506101ba610b66565b3480156101dd57600080fd5b506101ba600480360360408110156101f457600080fd5b60408051808201825291830192918183019183906002908390839080828437600092019190915250919450610bc09350505050565b34801561023557600080fd5b5061023e610be8565b60408051918252519081900360200190f35b34801561025c57600080fd5b50610265610bee565b604051808060200180602001806020018c81526020018b81526020018a81526020018981526020018881526020018781526020018660ff1660ff1681526020018515151515815260200184810384528f818151815260200191508051906020019080838360005b838110156102e45781810151838201526020016102cc565b50505050905090810190601f1680156103115780820380516001836020036101000a031916815260200191505b5084810383528e818151815260200191508051906020019080838360005b8381101561034757818101518382015260200161032f565b50505050905090810190601f1680156103745780820380516001836020036101000a031916815260200191505b5084810382528d5181528d516020918201918f019080838360005b838110156103a757818101518382015260200161038f565b50505050905090810190601f1680156103d45780820380516001836020036101000a031916815260200191505b509e50505050505050505050505050505060405180910390f35b3480156103fa57600080fd5b506101ba611186565b34801561040f57600080fd5b506101ba6004803603602081101561042657600080fd5b50356001600160a01b03166111c9565b34801561044257600080fd5b506101ba6004803603602081101561045957600080fd5b50356001600160a01b03166111eb565b34801561047557600080fd5b506101ba6004803603602081101561048c57600080fd5b50356001600160a01b0316611224565b3480156104a857600080fd5b5061023e61125d565b610560600480360360408110156104c757600080fd5b810190602081018135600160201b8111156104e157600080fd5b8201836020820111156104f357600080fd5b803590602001918460018302840111600160201b8311171561051457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506112a39050565b604080519115158252519081900360200190f35b6105606004803603602081101561058a57600080fd5b810190602081018135600160201b8111156105a457600080fd5b8201836020820111156105b657600080fd5b803590602001918460018302840111600160201b831117156105d757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506112cb945050505050565b34801561062457600080fd5b5061062d6113b3565b604080516001600160a01b039092168252519081900360200190f35b34801561065557600080fd5b5061023e6113c2565b34801561066a57600080fd5b506101ba6004803603604081101561068157600080fd5b810190602081018135600160201b81111561069b57600080fd5b8201836020820111156106ad57600080fd5b803590602001918460018302840111600160201b831117156106ce57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050913592506113c8915050565b34801561071d57600080fd5b50610726611573565b60405180806020018060200186815260200185815260200180602001848103845289818151815260200191508051906020019080838360005b8381101561077757818101518382015260200161075f565b50505050905090810190601f1680156107a45780820380516001836020036101000a031916815260200191505b508481038352885181528851602091820191808b01910280838360005b838110156107d95781810151838201526020016107c1565b50505050905001848103825285818151815260200191508051906020019060200280838360005b83811015610818578181015183820152602001610800565b505050509050019850505050505050505060405180910390f35b34801561083e57600080fd5b506101ba6004803603602081101561085557600080fd5b50356001600160a01b0316611877565b34801561087157600080fd5b5061062d6004803603602081101561088857600080fd5b810190602081018135600160201b8111156108a257600080fd5b8201836020820111156108b457600080fd5b803590602001918460018302840111600160201b831117156108d557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506118b0945050505050565b34801561092257600080fd5b506105606004803603602081101561093957600080fd5b810190602081018135600160201b81111561095357600080fd5b82018360208201111561096557600080fd5b803590602001918460018302840111600160201b8311171561098657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506119c5945050505050565b6101ba611aba565b3480156109db57600080fd5b506101ba600480360360208110156109f257600080fd5b50356001600160a01b0316611b19565b6000806000806000806000806000610a1933611b9f565b905080610a3f575060009750879650869550859450849350839250829150819050610b40565b6000600b610a4c83611bba565b81548110610a5657fe5b9060005260206000209060090201600701549050600b8281548110610a7757fe5b906000526020600020906009020160000154600b8381548110610a9657fe5b906000526020600020906009020160010154610ab0611be4565b600b8581548110610abd57fe5b906000526020600020906009020160020154600b8681548110610adc57fe5b906000526020600020906009020160030154600b8781548110610afb57fe5b906000526020600020906009020160040154600b8881548110610b1a57fe5b906000526020600020906009020160050154879950995099509950995099509950995050505b9091929394959697565b6017546001600160a01b03163314610b6157600080fd5b601555565b6000610b7133611b9f565b905080610b7d57600080fd5b62015180600b610b8c83611bba565b81548110610b9657fe5b906000526020600020906009020160070154420311610bb457600080fd5b610bbd81611e1c565b50565b6017546001600160a01b03163314610bd757600080fd5b610be4601b826002613f71565b5050565b60185481565b60608060606000806000806000806000806000610c0a33611b9f565b905080610c5b57505060408051602080820183526000808352835180830185528181528451928301909452808252919c50919a50909850965086955085945084935083925082915081905080611179565b610c63613fc5565b600a8281548110610c7057fe5b600091825260208083206040805161016081018252600990940290910180548452600181015492840192909252600282015483820152600382015460608401526004808301546080850152600583015460a0850152600683015460c0850152600783015460e08501526008909201546001600160a01b0380821661010086015260ff600160a01b83048116610120870152600160a81b9092049091161515610140850152601f5482516301d294a560e51b815267ffffffffffffffff89169481019490945291519395501692633a5294a092602480840193829003018186803b158015610d5c57600080fd5b505afa158015610d70573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610d9957600080fd5b8101908080516040519392919084600160201b821115610db857600080fd5b908301906020820185811115610dcd57600080fd5b8251600160201b811182820188101715610de657600080fd5b82525081516020918201929091019080838360005b83811015610e13578181015183820152602001610dfb565b50505050905090810190601f168015610e405780820380516001836020036101000a031916815260200191505b5060405250508251919e505015610f9657601f548151604080516301d294a560e51b815267ffffffffffffffff9092166004830152516001600160a01b0390921691633a5294a091602480820192600092909190829003018186803b158015610ea857600080fd5b505afa158015610ebc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610ee557600080fd5b8101908080516040519392919084600160201b821115610f0457600080fd5b908301906020820185811115610f1957600080fd5b8251600160201b811182820188101715610f3257600080fd5b82525081516020918201929091019080838360005b83811015610f5f578181015183820152602001610f47565b50505050905090810190601f168015610f8c5780820380516001836020036101000a031916815260200191505b506040525050509b505b80604001519950806080015198508060a001519750806020015160001461115857601f546020820151604080516301d294a560e51b815267ffffffffffffffff9092166004830152516001600160a01b0390921691633a5294a091602480820192600092909190829003018186803b15801561101157600080fd5b505afa158015611025573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561104e57600080fd5b8101908080516040519392919084600160201b82111561106d57600080fd5b90830190602082018581111561108257600080fd5b8251600160201b81118282018810171561109b57600080fd5b82525081516020918201929091019080838360005b838110156110c85781810151838201526020016110b0565b50505050905090810190601f1680156110f55780820380516001836020036101000a031916815260200191505b506040525050509a50611155600a82602001518154811061111257fe5b906000526020600020906009020160030154600a83602001518154811061113557fe5b906000526020600020906009020160050154611f0690919063ffffffff16565b96505b611160611f18565b6101208301516101409093015191975095509093509150505b909192939495969798999a565b600061119133611f38565b90508015610bbd576111c033604051806040016040528060048152602001635345524f60e01b81525083611fec565b610bbd57600080fd5b6017546001600160a01b031633146111e057600080fd5b610bbd600082612015565b6017546001600160a01b0316331461120257600080fd5b602080546001600160a01b0319166001600160a01b0392909216919091179055565b6017546001600160a01b0316331461123b57600080fd5b601d80546001600160a01b0319166001600160a01b0392909216919091179055565b600069d3c21bcecceda1000000601854101561127b575060c86112a0565b600069d3c21bcecceda10000006018548161129257fe5b0490508060020260c8019150505b90565b60006001600160a01b0382166112b7573391505b6112c28383346122a7565b90505b92915050565b60008060608380602001905160408110156112e557600080fd5b815160208301805160405192949293830192919084600160201b82111561130b57600080fd5b90830190602082018581111561132057600080fd5b8251600160201b81118282018810171561133957600080fd5b82525081516020918201929091019080838360005b8381101561136657818101518382015260200161134e565b50505050905090810190601f1680156113935780820380516001836020036101000a031916815260200191505b50604052505050915091506113a98183346122a7565b925050505b919050565b6017546001600160a01b031681565b60065481565b6020546001600160a01b0316611413576040805162461bcd60e51b815260206004820152600b60248201526a0dcdee840e6cae840c8caf60ab1b604482015290519081900360640190fd5b600061141e33611b9f565b90508061142a57600080fd5b600061143533611f38565b9050801561156d57611477604051806040016040528060048152602001635345524f60e01b81525082604051806020016040528060008152506000801b612604565b602080546040516310dcd33b60e01b81523360248201819052604482018790526060600483019081528851606484015288516001600160a01b03909416946310dcd33b948a948a939283926084909201919087019080838360005b838110156114ea5781810151838201526020016114d2565b50505050905090810190601f1680156115175780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561153857600080fd5b505af115801561154c573d6000803e3d6000fd5b505050506040513d602081101561156257600080fd5b505161156d57600080fd5b50505050565b60608060008060608060105467ffffffffffffffff8111801561159557600080fd5b506040519080825280602002602001820160405280156115cf57816020015b6115bc61402d565b8152602001906001900390816115b45790505b509050606060105467ffffffffffffffff811180156115ed57600080fd5b50604051908082528060200260200182016040528015611617578160200160208202803683370190505b50905060005b6010548110156117dd57601f546011805461178f926001600160a01b031691633a5294a0918590811061164c57fe5b90600052602060002001546040518263ffffffff1660e01b8152600401808267ffffffffffffffff1667ffffffffffffffff16815260200191505060006040518083038186803b15801561169f57600080fd5b505afa1580156116b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156116dc57600080fd5b8101908080516040519392919084600160201b8211156116fb57600080fd5b90830190602082018581111561171057600080fd5b8251600160201b81118282018810171561172957600080fd5b82525081516020918201929091019080838360005b8381101561175657818101518382015260200161173e565b50505050905090810190601f1680156117835780820380516001836020036101000a031916815260200191505b50604052505050612649565b83828151811061179b57fe5b6020026020010181905250601281815481106117b357fe5b90600052602060002001548282815181106117ca57fe5b602090810291909101015260010161161d565b50611809611803604051806040016040528060018152602001600b60fa1b815250612649565b8361266e565b81600e54600f5460138080548060200260200160405190810160405280929190818152602001828054801561185d57602002820191906000526020600020905b815481526020019060010190808311611849575b505050505090509650965096509650965050509091929394565b6017546001600160a01b0316331461188e57600080fd5b601e80546001600160a01b0319166001600160a01b0392909216919091179055565b601f546040516349145c9160e01b815260206004820181815284516024840152845160009485946001600160a01b03909116936349145c9193889390928392604490910191908501908083838b5b838110156119165781810151838201526020016118fe565b50505050905090810190601f1680156119435780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561196057600080fd5b505afa158015611974573d6000803e3d6000fd5b505050506040513d602081101561198a57600080fd5b50519050801580159061199e5750600a5481105b6119a757600080fd5b6000908152601660205260409020546001600160a01b031692915050565b601f546040516349145c9160e01b815260206004820181815284516024840152845160009485946001600160a01b03909116936349145c9193889390928392604490910191908501908083838b5b83811015611a2b578181015183820152602001611a13565b50505050905090810190601f168015611a585780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015611a7557600080fd5b505afa158015611a89573d6000803e3d6000fd5b505050506040513d6020811015611a9f57600080fd5b505190508015801590611ab35750600a5481105b9392505050565b601d546001600160a01b03163314611ad157600080fd5b611ad96127b2565b611b06604051806040016040528060048152602001635345524f60e01b815250611b01612991565b6129d1565b611b0f57600080fd5b600e805434019055565b6017546001600160a01b03163314611b3057600080fd5b6001600160a01b038116611b4357600080fd5b6017546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3601780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526009602052604090205490565b600081611bc657600080fd5b6001820391506014548281611bd757fe5b0682036001019050919050565b600060075460001415611bf9575060006112a0565b6000611c0433611b9f565b905062015180600b8281548110611c1757fe5b90600052602060002090600902016007015442031015611c5857600b8181548110611c3e57fe5b9060005260206000209060090201600601549150506112a0565b6000611c8c6005600a8481548110611c6c57fe5b906000526020600020906009020160020154612a1b90919063ffffffff16565b90506000611cc1600a8481548110611ca057fe5b90600052602060002090600902016004015483612a4290919063ffffffff16565b9050600080635f95a100421015611d1557600754600654611ce8908563ffffffff612a1b16565b81611cef57fe5b049150612710611d0685600e63ffffffff612a1b16565b81611d0d57fe5b049050611e00565b600062015180611d2f42635f95a10063ffffffff612a4216565b81611d3657fe5b0460010190506005811115611d49575060055b600a8681548110611d5657fe5b906000526020600020906009020160020154600a8781548110611d7557fe5b90600052602060002090600902016004015410611daf57612710611da086600863ffffffff612a1b16565b81611da757fe5b049150611dce565b612710611dc386600e63ffffffff612a1b16565b81611dca57fe5b0491505b611dfc81600602611df0600754611df088600654612a1b90919063ffffffff16565b9063ffffffff612a5716565b9250505b80821115611e0c578091505b5093506112a092505050565b5090565b60006060611e2983612a79565b905060005b8151811015611ed457600a828281518110611e4557fe5b602002602001015181548110611e5757fe5b906000526020600020906009020160020154600014611e9557611e8c828281518110611e7f57fe5b6020026020010151612b1e565b83019250611ecc565b42600b838381518110611ea457fe5b602002602001015181548110611eb657fe5b9060005260206000209060090201600701819055505b600101611e2e565b50600654611ee8908363ffffffff612a4216565b600655600754611efe908363ffffffff612a4216565b600755505050565b6000828201838110156112c257600080fd5b33600090815260196020908152604080832054601a909252909120549091565b600080611f4483611b9f565b905080611f5057600080fd5b601554600b8281548110611f6057fe5b906000526020600020906009020160010154420311611f7e57600080fd5b600b8181548110611f8b57fe5b90600052602060002090600902016000015491506000600b8281548110611fae57fe5b90600052602060002090600902016000018190555042600b8281548110611fd157fe5b90600052602060002090600902016001018190555050919050565b600061200d848484604051806020016040528060008152506000801b612d33565b949350505050565b600a8054905060096000836001600160a01b03166001600160a01b03168152602001908152602001600020819055508060166000600a80549050815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600a60405180610160016040528084815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001836001600160a01b03168152602001600060ff168152602001600015158152509080600181540180825580915050600190039060005260206000209060090201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101208201518160080160146101000a81548160ff021916908360ff1602179055506101408201518160080160156101000a81548160ff0219169083151502179055505050600b604051806101200160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152509080600181540180825580915050600190039060005260206000209060090201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155610100820151816008015550505050565b60006122d1604051806040016040528060048152602001635345524f60e01b815250611b01612991565b1561231d576001600160a01b0383166000908152601960205260409020546122ff908363ffffffff611f0616565b6001600160a01b0384166000908152601960205260409020556123d2565b6123456040518060400160405280600481526020016311d0525360e21b815250611b01612991565b15612391576001600160a01b0383166000908152601a6020526040902054612373908363ffffffff611f0616565b6001600160a01b0384166000908152601a60205260409020556123d2565b6040805162461bcd60e51b815260206004820152601160248201527031bab93932b731bc9034b99032b93937b960791b604482015290519081900360640190fd5b60006123dd84611b9f565b9050806124df57601f546040516349145c9160e01b81526020600482018181528851602484015288516000946001600160a01b0316936349145c91938b93928392604401918501908083838b5b8381101561244257818101518382015260200161242a565b50505050905090810190601f16801561246f5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561248c57600080fd5b505afa1580156124a0573d6000803e3d6000fd5b505050506040513d60208110156124b657600080fd5b5051905080158015906124ca5750600a5481105b6124d357600080fd5b6124dd8186612015565b505b60006124ea85612d89565b9050806124fc57600192505050611ab3565b60185461250f908263ffffffff611f0616565b6018556017546040805180820190915260048152635345524f60e01b6020820152612548916001600160a01b0316906064845b04611fec565b61255157600080fd5b601b546040805180820190915260048152635345524f60e01b6020820152612592916001600160a01b0316906103e861258b85600c612a1b565b8161254257fe5b61259b57600080fd5b601c546040805180820190915260048152635345524f60e01b60208201526125d5916001600160a01b0316906103e861258b856008612a1b565b6125de57600080fd5b600680546064600384020483030190556125f88282612f0e565b50600195945050505050565b60408051608080825260a08201909252606091602082018180368337019050509050848152836020820152826040820152816060820152600454608082a15050505050565b61265161402d565b506040805180820190915281518152602082810190820152919050565b606081516000141561268f57506040805160208101909152600081526112c5565b815183516000199091010260005b83518110156126cb578381815181106126b257fe5b602090810291909101015151919091019060010161269d565b5060608167ffffffffffffffff811180156126e557600080fd5b506040519080825280601f01601f191660200182016040528015612710576020820181803683370190505b5090506020810160005b85518110156127a75761275c8287838151811061273357fe5b60200260200101516020015188848151811061274b57fe5b6020026020010151600001516135f1565b85818151811061276857fe5b60200260200101516000015182019150600186510381101561279f5761279782886020015189600001516135f1565b865191909101905b60010161271a565b509095945050505050565b42600855600e54600f55600d54158015906127cf57506000600e54115b1561298157600d546010556000805b600d5481101561287e57600a600c82815481106127f757fe5b90600052602060002001548154811061280c57fe5b9060005260206000209060090201600701546013828154811061282b57fe5b9060005260206000200181905550600a600c828154811061284857fe5b90600052602060002001548154811061285d57fe5b600091825260209091206007600990920201015491909101906001016127de565b50600080805b600d5481101561296d57600c818154811061289b57fe5b906000526020600020015491506128df84611df0600a85815481106128bc57fe5b906000526020600020906009020160070154600e54612a1b90919063ffffffff16565b925081601182815481106128ef57fe5b9060005260206000200181905550826012828154811061290b57fe5b906000526020600020018190555061294783600b848154811061292a57fe5b60009182526020909120600990910201549063ffffffff611f0616565b600b838154811061295457fe5b6000918252602090912060099091020155600101612884565b50506000600d819055600e555061298f9050565b6010541561298f5760006010555b565b6040805160208082528183019092526060918291906020820181803683370190505090506000600354602083a15080516129ca8161362f565b9250505090565b6000825160001480156129e357508151155b156129f0575060016112c5565b8151835114612a01575060006112c5565b612a0a8261375c565b612a138461375c565b1490506112c5565b600082612a2a575060006112c5565b82820282848281612a3757fe5b04146112c257600080fd5b600082821115612a5157600080fd5b50900390565b6000808211612a6557600080fd5b6000828481612a7057fe5b04949350505050565b6014546060906000612a8a84611bba565b600a546014549192509082011115612aa557600a5481900391505b8167ffffffffffffffff81118015612abc57600080fd5b50604051908082528060200260200182016040528015612ae6578160200160208202803683370190505b50925060005b82811015612b1657808201848281518110612b0357fe5b6020908102919091010152600101612aec565b505050919050565b600080612b336005600a8581548110611c6c57fe5b90506000612b47600a8581548110611ca057fe5b9050600080635f95a100421015612b9b57600754600654612b6e908563ffffffff612a1b16565b81612b7557fe5b049150612710612b8c85600e63ffffffff612a1b16565b81612b9357fe5b049050612c7a565b600062015180612bb542635f95a10063ffffffff612a4216565b81612bbc57fe5b0460010190506005811115612bcf575060055b600a8781548110612bdc57fe5b906000526020600020906009020160020154600a8881548110612bfb57fe5b90600052602060002090600902016004015410612c3557612710612c2686600863ffffffff612a1b16565b81612c2d57fe5b049150612c54565b612710612c4986600e63ffffffff612a1b16565b81612c5057fe5b0491505b612c7681600602611df0600754611df088600654612a1b90919063ffffffff16565b9250505b80821115612c86578091505b612c908683613763565b915042600b8781548110612ca057fe5b906000526020600020906009020160070181905550612ce682600b8881548110612cc657fe5b906000526020600020906009020160020154611f0690919063ffffffff16565b600b8781548110612cf357fe5b90600052602060002090600902016002018190555081600b8781548110612d1657fe5b600091825260209091206009909102016006015550949350505050565b6040805160a080825260c082019092526000916060919060208201818036833701905050905086815285602082015284604082015283606082015282608082015260025460a082a1608001519695505050505050565b6001600160a01b0381166000908152601a60205260408120541580612dc457506001600160a01b038216600090815260196020526040902054155b15612dd1575060006113ae565b6000612ddb61125d565b6001600160a01b038416600090815260196020526040812054919250828281612e0057fe5b6001600160a01b0387166000908152601a60205260409020549190049150811115612e5257506001600160a01b0384166000908152601a6020526040902054612e4f818463ffffffff612a1b16565b91505b6001600160a01b038516600090815260196020526040902054612e7b908363ffffffff612a4216565b6001600160a01b038616600090815260196020908152604080832093909355601a90522054612eb0908263ffffffff612a4216565b6001600160a01b038087166000908152601a602090815260409182902093909355601e548151808301909252600482526311d0525360e21b93820193909352612efd929091169083611fec565b612f0657600080fd5b509392505050565b612f1f81600a8481548110612cc657fe5b600a8381548110612f2c57fe5b906000526020600020906009020160020181905550612f7281600a8481548110612f5257fe5b906000526020600020906009020160030154611f0690919063ffffffff16565b600a8381548110612f7f57fe5b906000526020600020906009020160030181905550690a968163f0a57b4000008110612fdd576001600a8381548110612fb457fe5b906000526020600020906009020160080160156101000a81548160ff0219169083151502179055505b6000600a8381548110612fec57fe5b9060005260206000209060090201600001549050806000146130e2576008546000828152600560205260409020541161305f5781600a828154811061302d57fe5b9060005260206000209060090201600701819055504260056000838152602001908152602001600020819055506130b3565b61309082600a838154811061307057fe5b906000526020600020906009020160070154611f0690919063ffffffff16565b600a828154811061309d57fe5b9060005260206000209060090201600701819055505b600a81815481106130c057fe5b9060005260206000209060090201600201546000146130e2576130e2816139a5565b826000835b831561350e57600a83815481106130fa57fe5b90600052602060002090600902016006015460001461316b57613144600a848154811061312357fe5b90600052602060002090600902016006015482611f0690919063ffffffff16565b90506000600a848154811061315557fe5b9060005260206000209060090201600601819055505b61012c8214801561319b5750600a848154811061318457fe5b906000526020600020906009020160000154600014155b156131f8576131d181600a86815481106131b157fe5b906000526020600020906009020160060154611f0690919063ffffffff16565b600a85815481106131de57fe5b90600052602060002090600902016006018190555061350e565b61320981600a868154811061113557fe5b600a858154811061321657fe5b906000526020600020906009020160050181905550600a848154811061323857fe5b9060005260206000209060090201600101546000141561327a5782600a858154811061326057fe5b9060005260206000209060090201600101819055506134de565b6000600a858154811061328957fe5b906000526020600020906009020160010154905060006132ce600a83815481106132af57fe5b906000526020600020906009020160030154600a848154811061113557fe5b90506000613301600a87815481106132e257fe5b906000526020600020906009020160030154600a888154811061113557fe5b905085600a888154811061331157fe5b9060005260206000209060090201600101541415801561333057508181115b1561335c5785600a888154811061334357fe5b9060005260206000209060090201600101819055508091505b600061339d83613391600a8b8154811061337257fe5b906000526020600020906009020160060154600a8c8154811061113557fe5b9063ffffffff612a4216565b9050600069a968163f0a57b400000084101580156133c657506a0152d02c7e14af680000008210155b156133d35750600461346a565b6954b40b1f852bda00000084101580156133f7575069a968163f0a57b40000008210155b156134045750600361346a565b692a5a058fc295ed000000841015801561342857506954b40b1f852bda0000008210155b156134355750600261346a565b69152d02c7e14af680000084101580156134595750692a5a058fc295ed0000008210155b156134665750600161346a565b5060005b600a898154811061347757fe5b600091825260209091206008600990920201015460ff600160a01b909104811690821611156134d85780600a8a815481106134ae57fe5b906000526020600020906009020160080160146101000a81548160ff021916908360ff1602179055505b50505050505b818060010192505083600a85815481106134f457fe5b6000918252602090912060099091020154945092506130e7565b6000613538600a888154811061352057fe5b90600052602060002090600902016000015487613b35565b81019050613564600a888154811061354c57fe5b90600052602060002090600902016000015487613c16565b81019050613590600a888154811061357857fe5b90600052602060002090600902016000015487613dd2565b6006549101906135a6908263ffffffff612a4216565b60065560006135bc87600563ffffffff612a1b16565b90506135ce818363ffffffff612a4216565b6007549091506135e4908263ffffffff611f0616565b6007555050505050505050565b5b60208110613611578151835260209283019290910190601f19016135f2565b905182516020929092036101000a6000190180199091169116179052565b604080516020808252818301909252606091600091839160208201818036833701905050905060005b60208110156136be576008810260020a85026001600160f81b03198116156136a9578083858151811061368757fe5b60200101906001600160f81b031916908160001a9053506001909301926136b5565b83156136b557506136be565b50600101613658565b5060608267ffffffffffffffff811180156136d857600080fd5b506040519080825280601f01601f191660200182016040528015613703576020820181803683370190505b50905060005b838110156137535782818151811061371d57fe5b602001015160f81c60f81b82828151811061373457fe5b60200101906001600160f81b031916908160001a905350600101613709565b50949350505050565b6020015190565b6000806137786005600a8681548110611c6c57fe5b9050806137ac600a868154811061378b57fe5b90600052602060002090600902016004015485611f0690919063ffffffff16565b11156137e6576137e3600a85815481106137c257fe5b90600052602060002090600902016004015482612a4290919063ffffffff16565b92505b61381783600a86815481106137f757fe5b906000526020600020906009020160040154611f0690919063ffffffff16565b600a858154811061382457fe5b90600052602060002090600902016004018190555080600a858154811061384757fe5b9060005260206000209060090201600401541061396e576000600a858154811061386d57fe5b9060005260206000209060090201600201819055506000600a858154811061389157fe5b9060005260206000209060090201600401819055506000600a85815481106138b557fe5b906000526020600020906009020160080160156101000a81548160ff0219169083151502179055506000600b85815481106138ec57fe5b9060005260206000209060090201600201819055506000600b858154811061391057fe5b9060005260206000209060090201600301819055506000600b858154811061393457fe5b9060005260206000209060090201600401819055506000600b858154811061395857fe5b9060005260206000209060090201600501819055505b61397f83600b868154811061292a57fe5b600b858154811061398c57fe5b6000918252602090912060099091020155509092915050565b600d546139d4576001600d8190555080600c6000815481106139c357fe5b600091825260209091200155610bbd565b6000805b600d54811015613a8657600c81815481106139ef57fe5b9060005260206000200154831415613a08575050610bbd565b600a600c8381548110613a1757fe5b906000526020600020015481548110613a2c57fe5b906000526020600020906009020160070154600a600c8381548110613a4d57fe5b906000526020600020015481548110613a6257fe5b9060005260206000209060090201600701541015613a7e578091505b6001016139d8565b50600a600d541015613abc5781600c600d5481548110613aa257fe5b600091825260209091200155600d80546001019055610be4565b600a600c8281548110613acb57fe5b906000526020600020015481548110613ae057fe5b906000526020600020906009020160070154600a8381548110613aff57fe5b9060005260206000209060090201600701541115610be45781600c8281548110613b2557fe5b6000918252602090912001555050565b600082613b44575060006112c5565b6000613b528484600a613edc565b810190506000600a8581548110613b6557fe5b906000526020600020906009020160000154905060008114612f0657613b8d81856008613edc565b820191506000600390506000600a8381548110613ba657fe5b90600052602060002090600902016000015490505b8015801590613bcb575060098211155b15613c0c57613bdc81876001613edc565b84019350600a8181548110613bed57fe5b9060005260206000209060090201600001549050600182019150613bbb565b5050509392505050565b600082613c25575060006112c5565b6000805b8415801590613c39575061012c82105b8015613c455750600c81105b15613dca57600a8581548110613c5757fe5b6000918252602090912060099091020160080154600160a01b900460ff161580613c9f5750600a8581548110613c8957fe5b9060005260206000209060090201600201546000145b15613ccf57600a8581548110613cb157fe5b60009182526020909120600990910201549450600190910190613c29565b6000600a8681548110613cde57fe5b906000526020600020906009020160080160149054906101000a900460ff1660030260ff169050818111613d3857600a8681548110613d1957fe5b6000918252602090912060099091020154955050600190910190613c29565b90810360006064613d4f878463ffffffff612a1b16565b81613d5657fe5b049050613d638782613763565b9050613d7681600b89815481106137f757fe5b600b8881548110613d8357fe5b9060005260206000209060090201600401819055508085019450600a8781548110613daa57fe5b600091825260209091206009909102015496505060019092019150613c29565b505092915050565b600082613de1575060006112c5565b60005b8315801590613e1c5750600a8481548110613dfb57fe5b906000526020600020906009020160080160159054906101000a900460ff16155b8015613e29575061012c81105b15613e5657600a8481548110613e3b57fe5b60009182526020909120600990910201549350600101613de4565b8315801590613e8d5750600a8481548110613e6d57fe5b906000526020600020906009020160080160159054906101000a900460ff165b15613ed557613e9f8460148504613763565b9150613eb282600b868154811061113557fe5b600b8581548110613ebf57fe5b9060005260206000209060090201600501819055505b5092915050565b6000600a8481548110613eeb57fe5b90600052602060002090600902016002015460001415613f0d57506000611ab3565b60006064613f21858563ffffffff612a1b16565b81613f2857fe5b049050613f358582613763565b9050613f4881600b8781548110612f5257fe5b600b8681548110613f5557fe5b6000918252602090912060099091020160030155949350505050565b8260028101928215613fb9579160200282015b82811115613fb957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613f84565b50611e18929150614047565b604051806101600160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b03168152602001600060ff1681526020016000151581525090565b604051806040016040528060008152602001600081525090565b6112a091905b80821115611e185780546001600160a01b031916815560010161404d56fea264697066735822122064aed3deec023430e43dd8e4149ece36a280ed65456558cefdce053c16c15e8664736f6c634300060a0033") data6= common.Hex2Bytes("6080604052600436106100c45763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630775361581146100c95780630a8b7826146100de5780632ca9a7c1146100f1578063370158ea146101065780633ccfd60b14610135578063672d7a0d1461014a57806383b4918b1461016a5780638da5cb5b1461018a5780638f35a75e146101ac578063a19556d4146101d9578063c43ed2c814610206578063e7cf3d1314610226578063f2fde38b14610246575b600080fd5b6100dc6100d7366004613802565b610266565b005b6100dc6100ec366004613889565b610370565b3480156100fd57600080fd5b506100dc61037d565b34801561011257600080fd5b5061011b6104ba565b60405161012c959493929190613b6f565b60405180910390f35b34801561014157600080fd5b506100dc6106db565b34801561015657600080fd5b506100dc6101653660046137e4565b6108d0565b34801561017657600080fd5b506100dc6101853660046138f3565b610a72565b34801561019657600080fd5b5061019f610b53565b60405161012c9190613b3f565b3480156101b857600080fd5b506101cc6101c73660046137e4565b610b62565b60405161012c9190613b5e565b3480156101e557600080fd5b506101f96101f4366004613889565b610d6d565b60405161012c9190613b4d565b34801561021257600080fd5b506100dc610221366004613889565b61172f565b34801561023257600080fd5b506100dc610241366004613854565b611777565b34801561025257600080fd5b506100dc6102613660046137e4565b6117d8565b6000806007546000148061027b575060075442105b151561028657600080fd5b6102b660408051908101604052806004815260200160e060020a635345524f028152506102b161186c565b6118ad565b15156102c157600080fd5b678ac7230489e800003410156102d657600080fd5b600160a060020a0384166000908152600960205260409020549150811515610342576103128360206040519081016040528060008152506118ad565b1561031c57600080fd5b61032684846118f9565b600160a060020a03841660009081526009602052604090205491505b600880548390811061035057fe5b90600052602060002090600d0201905061036a8134611e06565b50505050565b61037a3382610266565b50565b6000806000806000806000600754600014151561039957600080fd5b3360009081526009602052604090205496508615156103b757600080fd5b6103bf612037565b600d5415806103ce5750600e54155b156103d8576104b1565b8693505b6008546011546103ee91908901612077565b841080156103fc5750600754155b1561048457600880548590811061040f57fe5b90600052602060002090600d0201925061042d836006015442612088565b158015610441575082600301548360020154115b156104795761044f8361209d565b9092509050610464868363ffffffff61223016565b9550610476858263ffffffff61223016565b94505b6001909301926103dc565b601354610497908663ffffffff61223016565b601355600f546104ad908763ffffffff61224d16565b600f555b50505050505050565b600080600080606080606080600060075460001415156106ad576104de600a612264565b9250825160405190808252806020026020018201604052801561051b57816020015b6105086134c5565b8152602001906001900390816105005790505b509150600090505b825181101561060e5760055483516105ee91600160a060020a031690633a5294a09086908590811061055157fe5b906020019060200201516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016105939190613bb6565b600060405180830381600087803b1580156105ad57600080fd5b505af11580156105c1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105e991908101906138be565b6122c0565b82828151811015156105fc57fe5b60209081029091010152600101610523565b61065561064f6040805190810160405280600181526020017f20000000000000000000000000000000000000000000000000000000000000008152506122c0565b836122e6565b935060075461069460135461068860408051908101604052806004815260200160e060020a635345524f0281525061242e565b9063ffffffff61224d16565b60125460088054905087985098509850985098506106d0565b601254600854604080516020810190915260008082529b508b9a50919850965094505b505050509091929394565b336000908152600960205260408120549080808080808615156106fd57600080fd5b600880548890811061070b57fe5b90600052602060002090600d0201955085600901549450600754600014158015610736575060075442115b156107de5761076960135461068860408051908101604052806004815260200160e060020a635345524f0281525061242e565b935061077c600a8863ffffffff61246516565b9250925082801561078d5750600082115b156107de576107cb6107be6107a2600a6124c8565b6107b2878663ffffffff6124fe16565b9063ffffffff61252c16565b869063ffffffff61223016565b94506107de600a8863ffffffff61254f16565b60098601546013546107f59163ffffffff61224d16565b60135560006009870155600c8601541515610844576108343360408051908101604052806004815260200160e060020a635345524f02815250876125a4565b151561083f57600080fd5b6104b1565b5060005b600c8601548110156104b1576108bd86600c018281548110151561086857fe5b60009182526020918290200154604080518082019091526004815260e060020a635345524f0292810192909252600c890154600160a060020a0390911691906108b890899063ffffffff61252c16565b6125a4565b15156108c857600080fd5b600101610848565b60008054600160a060020a031633146108e857600080fd5b5060088054600160a060020a038316600090815260096020908152604080832084905580516101a081018252848152808301849052808201849052606081018490526080810184905260a081018490524260c0820181905260e0820185905261010082015261012081018490528151848152928301909152929392916101408301919050815260408051602081810183526000808352818501929092528251828152908101835291909201915090528154600181810180855560009485526020948590208451600d90940201928355848401519183019190915560408301516002830155606083015160038301556080830151600483015560a0830151600583015560c0830151600683015560e083015160078301556101008301516008830155610120830151600983015561014083015180519194610a3092600a850192909101906134dc565b506101608201518051610a4d91600b840191602090910190613527565b506101808201518051610a6a91600c840191602090910190613594565b505050505050565b60008082678ac7230489e80000111580610a8a575082155b1515610a9557600080fd5b60075415610aa257600080fd5b336000908152600960205260409020549150811515610ac057600080fd5b6008805483908110610ace57fe5b90600052602060002090600d020190508260001415610b035760098101549250678ac7230489e80000831015610b0357600080fd5b6009810154831115610b1457600080fd5b6009810154610b29908463ffffffff61224d16565b6009820155601354610b41908463ffffffff61224d16565b601355610b4e8184611e06565b505050565b600054600160a060020a031681565b610b6a613602565b600160a060020a0382166000908152600960205260409020548015610d67576008805482908110610b9757fe5b90600052602060002090600d02016101a0604051908101604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201805480602002602001604051908101604052809291908181526020018280548015610c6557602002820191906000526020600020905b815481526020019060010190808311610c51575b5050509183525050600b8201805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152938201939291830182828015610cf95780601f10610cce57610100808354040283529160200191610cf9565b820191906000526020600020905b815481529060010190602001808311610cdc57829003601f168201915b50505050508152602001600c8201805480602002602001604051908101604052809291908181526020018280548015610d5b57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610d3d575b50505050508152505091505b50919050565b33600090815260096020526040812054606091908190839082908190819081901515610d9857611723565b33600090815260096020526040902054600880549091908110610db757fe5b90600052602060002090600d02019650610de18960206040519081016040528060008152506118ad565b1515610f08576005546040517f49145c91000000000000000000000000000000000000000000000000000000008152600160a060020a03909116906349145c9190610e30908c90600401613b4d565b602060405180830381600087803b158015610e4a57600080fd5b505af1158015610e5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e829190810190613911565b9550600086118015610e95575060085486105b1515610ea057600080fd5b6008805487908110610eae57fe5b90600052602060002090600d020196505b336000908152600960205260409020548614610f0857851515610ee157611723565b6008805487908110610eef57fe5b90600052602060002090600d0201600101549550610ebf565b610f10612037565b60408051600b808252610180820190925290816020015b6060815260200190600190039081610f27575050604080518082018252600a81527f2273656c66436f6465220000000000000000000000000000000000000000000060208201526005548a54925160e560020a6301d294a5028152939850611004939192600160a060020a0390911691633a5294a091610fa991600401613bb6565b600060405180830381600087803b158015610fc357600080fd5b505af1158015610fd7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610fff91908101906138be565b6125cf565b85600081518110151561101357fe5b9060200190602002018190525061112f6040805190810160405280600c81526020017f22706172656e74436f646522000000000000000000000000000000000000000081525088600101546000146110f65760055460018a015460405160e560020a6301d294a5028152600160a060020a0390921691633a5294a09161109b91600401613bb6565b600060405180830381600087803b1580156110b557600080fd5b505af11580156110c9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110f191908101906138be565b610fff565b60408051808201909152600281527f222200000000000000000000000000000000000000000000000000000000000060208201526125cf565b85600181518110151561113e57fe5b9060200190602002018190525061118e6040805190810160405280600781526020017f2276616c7565220000000000000000000000000000000000000000000000000081525088600201546127b6565b85600281518110151561119d57fe5b906020019060200201819052506111ed6040805190810160405280600d81526020017f2272657475726e56616c7565220000000000000000000000000000000000000081525088600301546127b6565b8560038151811015156111fc57fe5b9060200190602002018190525061124c6040805190810160405280601481526020017f22746f74616c41796e616d69635265776172642200000000000000000000000081525088600401546127b6565b85600481518110151561125b57fe5b6020908102909101015260098701546007549094501580159061127f575060075442115b1561131d576112b260135461068860408051908101604052806004815260200160e060020a635345524f0281525061242e565b336000908152600960205260409020549093506112d790600a9063ffffffff61246516565b915091508180156112e85750600081115b1561131d5761131a61130d6112fd600a6124c8565b6107b2868563ffffffff6124fe16565b859063ffffffff61223016565b93505b61135c6040805190810160405280600d81526020017f2263616e57697468647261772200000000000000000000000000000000000000815250856127b6565b85600581518110151561136b57fe5b6020908102909101015260068701546113849042612088565b156113ea576113cc6040805190810160405280600e81526020017f227374617469635265776172642200000000000000000000000000000000000081525088600501546127b6565b8560068151811015156113db57fe5b60209081029091010152611466565b61144c6040805190810160405280600e81526020017f2273746174696352657761726422000000000000000000000000000000000000815250611447896114428b600301548c6002015461224d90919063ffffffff16565b61287d565b6127b6565b85600681518110151561145b57fe5b602090810290910101525b611474876008015442612088565b156114da576114bc6040805190810160405280600f81526020017f2264796e616d696352657761726422000000000000000000000000000000000081525088600701546127b6565b8560078151811015156114cb57fe5b60209081029091010152611534565b61151a6040805190810160405280600f81526020017f2264796e616d696352657761726422000000000000000000000000000000000081525060006127b6565b85600781518110151561152957fe5b602090810290910101525b6115776040805190810160405280601181526020017f2273746174696354696d657374616d702200000000000000000000000000000081525088600601546127b6565b85600881518110151561158657fe5b6020908102909101810191909152604080518082018252600c81527f226368696c6473436f646522000000000000000000000000000000000000000081840152600b8a0180548351601f6002600019610100600186161502019093169290920491820186900486028101860190945280845261165a949293928301828280156116505780601f1061162557610100808354040283529160200191611650565b820191906000526020600020905b81548152906001019060200180831161163357829003601f168201915b50505050506125cf565b85600981518110151561166957fe5b6020908102909101810191909152604080518082018252600881527f2276616c7565732200000000000000000000000000000000000000000000000081840152600a8a0180548351818602810186019094528084526116fe949293928301828280156116f457602002820191906000526020600020905b8154815260200190600101908083116116e0575b505050505061291d565b85600a81518110151561170d57fe5b6020908102909101015261172085612b56565b97505b50505050505050919050565b600080548190600160a060020a0316331415610b4e57505080517fa6cb2bbe89e8b5f0c4e2d557b612ed99f5573b419fd9b304b87129514ccc35b390602001818184a1505050565b6000806000835111151561178a57600080fd5b3360009081526009602052604090205491508115610b4e5760088054839081106117b057fe5b90600052602060002090600d020190508281600c01908051906020019061036a929190613594565b600054600160a060020a031633146117ef57600080fd5b600160a060020a038116151561180457600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b604080516020808252818301909252606091829160009180820161040080388339019050509150600454602083a15080516118a681612cbe565b9250505090565b6000825160001480156118bf57508151155b156118cc575060016118f3565b81518351146118dd575060006118f3565b6118e682612e3f565b6118ef84612e3f565b1490505b92915050565b6005546040517f49145c9100000000000000000000000000000000000000000000000000000000815260009182918291600160a060020a0316906349145c9190611947908790600401613b4d565b602060405180830381600087803b15801561196157600080fd5b505af1158015611975573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506119999190810190613911565b92506000831180156119ac575060085483105b15156119b757600080fd5b60088054849081106119c557fe5b60009182526020808320600854604080518085018252958652600d94909402909101600b81018054855160026001831615610100026000190190921691909104601f8101869004860282018601909652858152919750919550611a8094939092830182828015611a765780601f10611a4b57610100808354040283529160200191611a76565b820191906000526020600020905b815481529060010190602001808311611a5957829003601f168201915b50505050506118ad565b15611b2a5760055460405160e560020a6301d294a5028152600160a060020a0390911690633a5294a090611ab8908490600401613bb6565b600060405180830381600087803b158015611ad257600080fd5b505af1158015611ae6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b0e91908101906138be565b8051611b2491600b850191602090910190613527565b50611c5c565b600b8201805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152611c4493611c0f936105e993611bcc939291830182828015611bc25780601f10611b9757610100808354040283529160200191611bc2565b820191906000526020600020905b815481529060010190602001808311611ba557829003601f168201915b50505050506122c0565b611c0a6040805190810160405280600181526020017f20000000000000000000000000000000000000000000000000000000000000008152506122c0565b612e46565b60055460405160e560020a6301d294a5028152611c0a91600160a060020a031690633a5294a090610593908790600401613bb6565b8051611c5a91600b850191602090910190613527565b505b806009600087600160a060020a0316600160a060020a031681526020019081526020016000208190555060086101a0604051908101604052808381526020018581526020016000815260200160008152602001600081526020016000815260200142815260200160008152602001428152602001600081526020016000604051908082528060200260200182016040528015611d02578160200160208202803883390190505b5081526040805160208082018352600080835281850192909252825182815280820184529383019390935284546001808201808855968352918490208551600d909202019081558484015191810191909155908301516002820155606083015160038201556080830151600482015560a0830151600582015560c0830151600682015560e083015160078201556101008301516008820155610120830151600982015561014083015180519192611dc192600a850192909101906134dc565b506101608201518051611dde91600b840191602090910190613527565b506101808201518051611dfb91600c840191602090910190613594565b505050505050505050565b600080600080611e14612037565b600054604080518082019091526004815260e060020a635345524f026020820152611e5491600160a060020a0316906108b888603263ffffffff61252c16565b1515611e5f57600080fd5b600654611e77906107b287601963ffffffff61252c16565b9350600092505b600654831015611eed57611ed7600684815481101515611e9a57fe5b60009182526020918290200154604080518082019091526004815260e060020a635345524f0292810192909252600160a060020a031690866125a4565b1515611ee257600080fd5b600190920191611e7e565b611f12611f0186600363ffffffff6124fe16565b60028801549063ffffffff61223016565b6002870155600186015460001015611fe7575084905060005b600182015415801590611f3e5750601481105b15611fe75760088260010154815481101515611f5657fe5b90600052602060002090600d020191508082600a01805490501415611f9457600a820180546001810182556000918252602090912001859055611fdf565b611fc28583600a0183815481101515611fa957fe5b906000526020600020015461223090919063ffffffff16565b600a8301805483908110611fd257fe5b6000918252602090912001555b600101611f2b565b61200a611ffb86600363ffffffff6124fe16565b600f549063ffffffff61223016565b600f55855461202290600a908763ffffffff612ebd16565b60075415610a6a576000600755505050505050565b61204342601054612088565b15156120755761206760c86107b2600361205b61307c565b9063ffffffff6124fe16565b600e55600f54600d55426010555b565b600081831015610d675750816118f3565b610e1060189283900481900492909104041490565b6000806000806000806000806120cd896120c88b600301548c6002015461224d90919063ffffffff16565b6130bc565b9550955085156120dc57612225565b84935060008960010154111561221e57600889600101548154811015156120ff57fe5b90600052602060002090600d0201915061211b82866000613221565b9096509250851561213157848497509750612225565b612141848463ffffffff61223016565b9350600190505b60018201541580159061215b5750601481105b80156121675750600754155b1561221e576008826001015481548110151561217f57fe5b90600052602060002090600d02019150806121c969021e19e0c9bab240000084600a0160008154811015156121b057fe5b906000526020600020015461252c90919063ffffffff16565b1180156121dd575081600201548260030154105b15612216576121ed828683613221565b9096509250851561220357848497509750612225565b612213848463ffffffff61223016565b93505b600101612148565b8484975097505b505050505050915091565b60008282018381101561224257600080fd5b8091505b5092915050565b6000808383111561225d57600080fd5b5050900390565b6060816000018054806020026020016040519081016040528092919081815260200182805480156122b457602002820191906000526020600020905b8154815260200190600101908083116122a0575b50505050509050919050565b6122c86134c5565b50604080518082019091528151815260209182019181019190915290565b60606000806060600085516000141561230f576040805160208101909152600081529450612424565b60018651038760000151029350600092505b855183101561235357858381518110151561233857fe5b60209081029091010151519390930192600190920191612321565b836040519080825280601f01601f191660200182016040528015612381578160200160208202803883390190505b5060009350915050602081015b8551831015612420576123d58187858151811015156123a957fe5b906020019060200201516020015188868151811015156123c557fe5b602090810290910101515161331e565b85838151811015156123e357fe5b602090810290910101515186519101906000190183101561241557612411818860200151896000015161331e565b8651015b60019092019161238e565b8194505b5050505092915050565b6040805160208082528183019092526000916060919080820161040080388339019050509050828152600254602082a15192915050565b600080805b84548110156124c0578454849086908390811061248357fe5b906000526020600020015414156124b85760028501805460019450829081106124a857fe5b9060005260206000200154820191505b60010161246a565b509250929050565b6000805b8254811015610d6757600283018054829081106124e557fe5b60009182526020909120015491909101906001016124cc565b6000808315156125115760009150612246565b5082820282848281151561252157fe5b041461224257600080fd5b60008080831161253b57600080fd5b828481151561254657fe5b04949350505050565b60005b8254811015610b4e578254829084908390811061256b57fe5b9060005260206000200154141561259c576000836002018281548110151561258f57fe5b6000918252602090912001555b600101612552565b60006125c784848460206040519081016040528060008152506000600102613362565b949350505050565b604080516002808252606082810190935282918291816020015b6125f16134c5565b8152602001906001900390816125e957905050915061260f856122c0565b82600081518110151561261e57fe5b602090810290910101526040805160038082526080820190925290816020015b6126466134c5565b81526020019060019003908161263e5790505090506126996040805190810160405280600181526020017f22000000000000000000000000000000000000000000000000000000000000008152506122c0565b8160008151811015156126a857fe5b602090810290910101526126bb846122c0565b8160018151811015156126ca57fe5b906020019060200201819052506127156040805190810160405280600181526020017f22000000000000000000000000000000000000000000000000000000000000008152506122c0565b81600281518110151561272457fe5b906020019060200201819052506127506105e961064f60206040519081016040528060008152506122c0565b82600181518110151561275f57fe5b906020019060200201819052506127ad61064f6040805190810160405280600181526020017f3a000000000000000000000000000000000000000000000000000000000000008152506122c0565b95945050505050565b6040805160028082526060828101909352829190816020015b6127d76134c5565b8152602001906001900390816127cf5790505090506127f5846122c0565b81600081518110151561280457fe5b6020908102909101015261281a6105e9846133ba565b81600181518110151561282957fe5b906020019060200201819052506125c76128776040805190810160405280600181526020017f3a000000000000000000000000000000000000000000000000000000000000008152506122c0565b826122e6565b6000600e54600014806128905750600d54155b8061289c575060075415155b156128a9575060006118f3565b6128d9826128d4600d546107b2600e5461205b89600301548a6002015461224d90919063ffffffff16565b612077565b905082600201546128f784600301548361223090919063ffffffff16565b11156118f357600383015460028401546129169163ffffffff61224d16565b9392505050565b6060806000606080855160405190808252806020026020018201604052801561296057816020015b61294d6134c5565b8152602001906001900390816129455790505b509350600092505b85518310156129b7576129946105e9878581518110151561298557fe5b906020019060200201516133ba565b84848151811015156129a257fe5b60209081029091010152600190920191612968565b612a426129f86040805190810160405280600181526020017f5b000000000000000000000000000000000000000000000000000000000000008152506122c0565b611c0a6105e9612a3c6040805190810160405280600181526020017f2c000000000000000000000000000000000000000000000000000000000000008152506122c0565b886122e6565b9150612a8e612a50836122c0565b611c0a6040805190810160405280600181526020017f5d000000000000000000000000000000000000000000000000000000000000008152506122c0565b60408051600280825260608201909252919350816020015b612aae6134c5565b815260200190600190039081612aa6579050509050612acc876122c0565b816000815181101515612adb57fe5b60209081029091010152612aee826122c0565b816001815181101515612afd57fe5b90602001906020020181905250612b4b6128776040805190810160405280600181526020017f3a000000000000000000000000000000000000000000000000000000000000008152506122c0565b979650505050505050565b60608060008351604051908082528060200260200182016040528015612b9657816020015b612b836134c5565b815260200190600190039081612b7b5790505b509150600090505b8351811015612be757612bc78482815181101515612bb857fe5b906020019060200201516122c0565b8282815181101515612bd557fe5b60209081029091010152600101612b9e565b612c72612c286040805190810160405280600181526020017f7b000000000000000000000000000000000000000000000000000000000000008152506122c0565b611c0a6105e9612c6c6040805190810160405280600181526020017f2c000000000000000000000000000000000000000000000000000000000000008152506122c0565b866122e6565b92506125c7612c80846122c0565b611c0a6040805190810160405280600181526020017f7d000000000000000000000000000000000000000000000000000000000000008152506122c0565b60408051602080825281830190925260609160009183918391829184919080820161040080388339019050509350600092505b6020831015612d8d576008830260020a870291507fff00000000000000000000000000000000000000000000000000000000000000821615612d7757818486815181101515612d3c57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190940193612d82565b8415612d8257612d8d565b600190920191612cf1565b846040519080825280601f01601f191660200182016040528015612dbb578160200160208202803883390190505b509050600092505b84831015612e35578383815181101515612dd957fe5b90602001015160f860020a900460f860020a028184815181101515612dfa57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190920191612dc3565b9695505050505050565b6020015190565b606080600083600001518560000151016040519080825280601f01601f191660200182016040528015612e83578160200160208202803883390190505b509150602082019050612e9f818660200151876000015161331e565b845160208501518551612eb5928401919061331e565b509392505050565b8254600090819081908190600a1415612fac576001870180546000908110612ee157fe5b90600052602060002001549250600191505b8654821015612f4b57828760010183815481101515612f0e57fe5b90600052602060002001541015612f405760018701805483908110612f2f57fe5b906000526020600020015492508193505b600190910190612ef3565b86548690889086908110612f5b57fe5b9060005260206000200181905550428760010185815481101515612f7b57fe5b9060005260206000200181905550848760020185815481101515612f9b57fe5b6000918252602090912001556104b1565b600091505b865482101561302c5786548690889084908110612fca57fe5b9060005260206000200154141561302157428760010183815481101515612fed57fe5b906000526020600020018190555084876002018381548110151561300d57fe5b60009182526020909120015550600161302c565b600190910190612fb1565b8015156104b1575050845460018082018755600087815260208082209093019690965580870180548083018255908752828720429101556002909601805496870181558552909320909301555050565b60006130b66012546106886013546106883461068860408051908101604052806004815260200160e060020a635345524f0281525061242e565b90505b90565b6000806000806130ca612075565b600754156130df576001935060009250613218565b4260068701556130ef868661287d565b92508286600501819055506000866001015411156131e3575084905060005b6001820154158015906131215750601481105b156131e3576008826001015481548110151561313957fe5b90600052602060002090600d020191508282600a018281548110151561315b57fe5b906000526020600020015411156131bb5761319a8383600a018381548110151561318157fe5b906000526020600020015461224d90919063ffffffff16565b600a83018054839081106131aa57fe5b6000918252602090912001556131db565b600082600a01828154811015156131ce57fe5b6000918252602090912001555b60010161310e565b60098601546131f8908463ffffffff61223016565b60098701556003860154613212908463ffffffff61223016565b60038701555b50509250929050565b60008061322c612075565b600754156132405750600190506000613316565b69152d02c7e14af680000061326b60036107b28860030154896002015461224d90919063ffffffff16565b10613277575082613284565b613281858561287d565b90505b60008311156132a15761329e81600a63ffffffff61252c16565b90505b6132af856008015442612088565b156132d35760078501546132c9908263ffffffff61223016565b60078601556132e1565b600785018190554260088601555b60098501546132f6908263ffffffff61223016565b60098601556004850154613310908263ffffffff61223016565b60048601555b935093915050565b60005b60208210613343578251845260209384019390920191601f1990910190613321565b50905182516020929092036101000a6000190180199091169116179052565b6040805160a080825260c0820190925260009160609190602082016114008038833901905050905086815285602082015284604082015283606082015282608082015260035460a082a1608001519695505050505050565b606060008082818515156134035760408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015294506134bc565b8593505b831561341e57600190920191600a84049350613407565b826040519080825280601f01601f19166020018201604052801561344c578160200160208202803883390190505b5091505060001982015b85156134b857815160001982019160f860020a6030600a8a06010291849190811061347d57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a86049550613456565b8194505b50505050919050565b604080518082019091526000808252602082015290565b828054828255906000526020600020908101928215613517579160200282015b828111156135175782518255916020019190600101906134fc565b5061352392915061366b565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061356857805160ff1916838001178555613517565b8280016001018555821561351757918201828111156135175782518255916020019190600101906134fc565b8280548282559060005260206000209081019282156135f6579160200282015b828111156135f6578251825473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039091161782556020909201916001909101906135b4565b50613523929150613685565b6101a060405190810160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016060815260200160608152602001606081525090565b6130b991905b808211156135235760008155600101613671565b6130b991905b8082111561352357805473ffffffffffffffffffffffffffffffffffffffff1916815560010161368b565b60006129168235613c3e565b6000601f820183136136d357600080fd5b81356136e66136e182613beb565b613bc4565b9150818183526020840193506020810190508385602084028201111561370b57600080fd5b60005b83811015612424578161372188826136b6565b845250602092830192919091019060010161370e565b6000601f8201831361374857600080fd5b81356137566136e182613c0c565b9150808252602083016020830185838301111561377257600080fd5b61377d838284613c57565b50505092915050565b6000601f8201831361379757600080fd5b81516137a56136e182613c0c565b915080825260208301602083018583830111156137c157600080fd5b61377d838284613c63565b600061291682356130b9565b600061291682516130b9565b6000602082840312156137f657600080fd5b60006125c784846136b6565b6000806040838503121561381557600080fd5b600061382185856136b6565b925050602083013567ffffffffffffffff81111561383e57600080fd5b61384a85828601613737565b9150509250929050565b60006020828403121561386657600080fd5b813567ffffffffffffffff81111561387d57600080fd5b6125c7848285016136c2565b60006020828403121561389b57600080fd5b813567ffffffffffffffff8111156138b257600080fd5b6125c784828501613737565b6000602082840312156138d057600080fd5b815167ffffffffffffffff8111156138e757600080fd5b6125c784828501613786565b60006020828403121561390557600080fd5b60006125c784846137cc565b60006020828403121561392357600080fd5b60006125c784846137d8565b61393881613c3e565b82525050565b600061394982613c3a565b80845260208401935061395b83613c34565b60005b8281101561398b5761397186835161392f565b61397a82613c34565b60209690960195915060010161395e565b5093949350505050565b60006139a082613c3a565b8084526020840193506139b283613c34565b60005b8281101561398b576139c8868351613b2d565b6139d182613c34565b6020969096019591506001016139b5565b60006139ed82613c3a565b808452613a01816020860160208601613c63565b613a0a81613c8f565b9093016020019392505050565b80516000906101a0840190613a2c8582613b2d565b506020830151613a3f6020860182613b2d565b506040830151613a526040860182613b2d565b506060830151613a656060860182613b2d565b506080830151613a786080860182613b2d565b5060a0830151613a8b60a0860182613b2d565b5060c0830151613a9e60c0860182613b2d565b5060e0830151613ab160e0860182613b2d565b50610100830151613ac6610100860182613b2d565b50610120830151613adb610120860182613b2d565b50610140830151848203610140860152613af58282613995565b915050610160830151848203610160860152613b1182826139e2565b9150506101808301518482036101808601526127ad828261393e565b613938816130b9565b61393881613c4a565b602081016118f3828461392f565b6020808252810161291681846139e2565b602080825281016129168184613a17565b60a08101613b7d8288613b2d565b613b8a6020830187613b2d565b613b976040830186613b2d565b613ba46060830185613b2d565b8181036080830152612b4b81846139e2565b602081016118f38284613b36565b60405181810167ffffffffffffffff81118282101715613be357600080fd5b604052919050565b600067ffffffffffffffff821115613c0257600080fd5b5060209081020190565b600067ffffffffffffffff821115613c2357600080fd5b506020601f91909101601f19160190565b60200190565b5190565b600160a060020a031690565b67ffffffffffffffff1690565b82818337506000910152565b60005b83811015613c7e578181015183820152602001613c66565b8381111561036a5750506000910152565b601f01601f1916905600a265627a7a72305820804dcbaae59781ea4809d0d8d3204b4a640bfee533454fa79fa6938b8ba5c2466c6578706572696d656e74616cf50037") ) func GetSipSetting() *SIPSetting { sipSettingOnce.Do(func(){ sipSetting=newSIPSetting() sipSetting.AddItem("6d1f766791dbd26380c47ed9bc7db336ae3388917d0f3364c4848b6b11f251b573a47be33696521535f98fdb1c80c335bdadd2367232572dcfd08367f6608891",seroparam.SIP3(),data,"STcH") sipSetting.AddItem("baed9edd0ccf9b8db54abc05ab9b822b1cbf949f5066070b81e0ce3b0b475fffd5b5dd41e715c32a7552a4610dd2a8ea665d9dad0124f8df5c5369e5e4d73351",seroparam.SIP7(),data0,"c17B") sipSetting.AddItem("ca5da48a12473fab4ad6bc61145b62c9163c863fa5240b27c7111101b085b9ab188b72f84873ae625810a0fd967be86bf9b1491f60997f37b323f45180898ba7",seroparam.SIP7(),data1,"3c2s") sipSetting.AddItem("4096fcc782957d68b2802593ec20069f712e3a2e701bc25d66dbfdaa2fe289e1a97d65f0966905894b600569125bcd04e5763d8cdcffd3cc42e561d13417b86a",seroparam.SIP8(),data2,"t1mN") sipSetting.AddItem("c12bd066cbb0826c3f9be7972bbaba4dc8e7924c212d54c7039a14d9de273f62403d138d92fde408056e8cc9924e88a4e07f9de2163fda3c38433c36460adbc8",seroparam.SIP8(),data3,"CMr6") sipSetting.AddItem("a8291a27ab6d66a4a8a070e4b579f2372984280fb8455fbd648f8f4a59802d3c00a13cdc239f25c358f83d4a2c7f7fb84a1fc980ba95002d68b09af7731c5a1a",seroparam.SIP9(),data4,"JXwi") sipSetting.AddItem("44ce76b19cf98b4c5b8b27b720d86d17a1753fd93ad357268734769567f6bf6b44eba6f944eac844566ffd53c8835dede539b46c488ee1326e4bfe3cd6b2c7f1",seroparam.SIP9(),data5,"L2E1") sipSetting.AddItem("4096fcc782957d68b2802593ec20069f712e3a2e701bc25d66dbfdaa2fe289e1a97d65f0966905894b600569125bcd04e5763d8cdcffd3cc42e561d13417b86a",seroparam.SIP10(),data6,"t1mN") }) return sipSetting } // Finalize implements consensus.Engine, accumulating the block rewards, // setting the final state and assembling the block. func (ethash *Ethash) Finalize(chain consensus.ChainReader, header *types.Header, stateDB *state.StateDB, txs []*types.Transaction, receipts []*types.Receipt, gasReward uint64) (*types.Block, error) { if header.Number.Uint64() == seroparam.SIP1() { stateDB.SetBalance(state.EmptyAddress, "SERO", new(big.Int)) } if v:=GetSipSetting().Get(header.Number.Uint64());v!=nil { if v.num!=header.Number.Uint64() { panic("SIP Setting is not match") } for _,item:=range v.items { stateDB.SetCode(item.hash,item.code) } } // Accumulate any block rewards and commit the final state root accumulateRewards(chain.Config(), stateDB, header, gasReward) stateDB.NextZState().PreGenerateRoot(header, chain) header.Root = stateDB.IntermediateRoot(true) // Header seems complete, assemble into a block and return return types.NewBlock(header, txs, receipts), nil } var ( base = big.NewInt(1e+17) big100 = big.NewInt(100) oneSero = new(big.Int).Mul(big.NewInt(10), base) oriReward = new(big.Int).Mul(big.NewInt(66773505743), big.NewInt(1000000000)) interval = big.NewInt(8294400) halveNimber = big.NewInt(3057600) difficultyL1 = big.NewInt(340000000) difficultyL2 = big.NewInt(1700000000) difficultyL3 = big.NewInt(4000000000) difficultyL4 = big.NewInt(17000000000) lReward = new(big.Int).Mul(big.NewInt(176), base) hReward = new(big.Int).Mul(big.NewInt(445), base) hRewardV4 = new(big.Int).Mul(big.NewInt(356), base) argA, _ = new(big.Int).SetString("985347985347985", 10) argB, _ = new(big.Int).SetString("16910256410256400000", 10) teamRewardPool = common.BytesToAddress(crypto.Keccak512([]byte{1})) communityRewardPool = common.BytesToAddress(crypto.Keccak512([]byte{2})) teamAddress = common.Base58ToAddress("RnRpAdXWaS2BnUzrUuzR8WPRfFackV65CzyqWU8mK4Np2aCgDUvrhYciDJoQZpMzWpaaKqsicf1u8fRd4ZKXeSUF2pMLHXXaiCX8XzHw3VRyX2Q7ko4BrRj9xTrNaErnTkg") communityAddress = common.Base58ToAddress("ZkVB2f8H1usYBSeViS7wPqSSFseXnCYXEbT2XxCSuRhfFg9KbBKbTvpTBj7dmSZxEKTp6rsqS3EX9js6StgRijZQBkaok2U5Fy8oLuGFrt1C5jwdAYB4Nqn8KNRniiQyCeb") ) func Halve(blockNumber *big.Int) *big.Int { i := new(big.Int).Add(new(big.Int).Div(new(big.Int).Sub(blockNumber, halveNimber), interval), big1) if blockNumber.Uint64() >= seroparam.SIP7() { return new(big.Int).Exp(big2, new(big.Int).Add(i, big1), nil) } else { return new(big.Int).Exp(big2, i, nil) } } // AccumulateRewards credits the coinbase of the given block with the mining // reward. The total reward consists of the static block reward . func accumulateRewards(config *params.ChainConfig, statedb *state.StateDB, header *types.Header, gasReward uint64) { var reward *big.Int if header.Number.Uint64() >= seroparam.SIP7() { reward = accumulateRewardsV5(statedb, header) } else if header.Number.Uint64() >= seroparam.SIP4() { reward = accumulateRewardsV4(statedb, header) } else if header.Number.Uint64() >= seroparam.SIP3() { reward = accumulateRewardsV3(statedb, header) } else if header.Number.Uint64() >= seroparam.SIP1() { reward = accumulateRewardsV2(statedb, header) } else { reward = accumulateRewardsV1(config, statedb, header) } if seroparam.Is_Dev() { reward = new(big.Int).Set(new(big.Int).Mul(big.NewInt(10000), oneSero)) } // log.Info(fmt.Sprintf("BlockNumber = %v, gasLimie = %v, gasUsed = %v, reward = %v", header.Number.Uint64(), header.GasLimit, header.GasUsed, reward)) reward.Add(reward, new(big.Int).SetUint64(gasReward)) asset := assets.Asset{Tkn: &assets.Token{ Currency: *common.BytesToHash(common.LeftPadBytes([]byte("SERO"), 32)).HashToUint256(), Value: utils.U256(*reward), }, } statedb.NextZState().AddTxOut(header.Coinbase, asset, common.BytesToHash([]byte{1})) } func accumulateRewardsV1(config *params.ChainConfig, statedb *state.StateDB, header *types.Header) *big.Int { poolBalance := statedb.GetBalance(state.EmptyAddress, "SERO") if poolBalance.Sign() <= 0 { return big.NewInt(0) } reward := new(big.Int).Mul(big.NewInt(350), base) difficulty := big.NewInt(1717986918) if config.ChainID == params.AlphanetChainConfig.ChainID { difficulty = big.NewInt(51485767) } else if config.ChainID == params.DevnetChainConfig.ChainID { difficulty = big.NewInt(1048576) } if header.Difficulty.Cmp(difficulty) < 0 { ratio := new(big.Int).Div(new(big.Int).Mul(header.Difficulty, big100), difficulty).Uint64() if ratio >= 80 { reward = reward.Mul(reward, big.NewInt(4)).Div(reward, big.NewInt(5)) } else if ratio >= 60 { reward = reward.Mul(reward, big.NewInt(3)).Div(reward, big.NewInt(5)) } else if ratio >= 40 { reward = reward.Mul(reward, big.NewInt(2)).Div(reward, big.NewInt(5)) } else if ratio >= 20 { reward = reward.Mul(reward, big.NewInt(1)).Div(reward, big.NewInt(5)) } else { reward = big.NewInt(0).Set(oneSero) } } ratio := new(big.Int).Div(new(big.Int).Mul(new(big.Int).SetUint64(header.GasUsed), big100), new(big.Int).SetUint64(header.GasLimit)).Uint64() if ratio >= 80 { reward = new(big.Int).Div(new(big.Int).Mul(reward, big6), big.NewInt(5)) } else { reward = reward.Mul(reward, big.NewInt(4)).Div(reward, big.NewInt(5)) } if reward.Cmp(oneSero) < 0 { reward = big.NewInt(0).Set(oneSero) } statedb.SubBalance(state.EmptyAddress, "SERO", reward) return reward } func accumulateRewardsV2(statedb *state.StateDB, header *types.Header) *big.Int { rewardStd := new(big.Int).Mul(big.NewInt(66773505743), big.NewInt(1000000000)) if header.Number.Uint64() >= halveNimber.Uint64() { i := new(big.Int).Add(new(big.Int).Div(new(big.Int).Sub(header.Number, halveNimber), interval), big1) rewardStd.Div(rewardStd, new(big.Int).Exp(big2, i, nil)) } var reward *big.Int if header.Difficulty.Cmp(difficultyL1) < 0 { // <3.4 reward = new(big.Int).Mul(big.NewInt(10), base) } else if header.Difficulty.Cmp(difficultyL2) < 0 { // <17 ratio := new(big.Int).Add(new(big.Int).Mul(big.NewInt(56), base), new(big.Int).Mul(big.NewInt(16470000000), new(big.Int).Sub(header.Difficulty, difficultyL1))) reward = new(big.Int).Div(new(big.Int).Mul(rewardStd, ratio), oriReward) } else if header.Difficulty.Cmp(difficultyL3) < 0 { // <40 ratio := new(big.Int).Add(new(big.Int).Mul(big.NewInt(280), base), new(big.Int).Mul(big.NewInt(2170000000), new(big.Int).Sub(header.Difficulty, difficultyL2))) reward = new(big.Int).Div(new(big.Int).Mul(rewardStd, ratio), oriReward) } else if header.Difficulty.Cmp(difficultyL4) < 0 { // <170 ratio := new(big.Int).Add(new(big.Int).Mul(big.NewInt(330), base), new(big.Int).Mul(big.NewInt(2590000000), new(big.Int).Sub(header.Difficulty, difficultyL3))) reward = new(big.Int).Div(new(big.Int).Mul(rewardStd, ratio), oriReward) } else { reward = rewardStd } if statedb == nil { return reward } statedb.AddBalance(communityRewardPool, "SERO", new(big.Int).Div(rewardStd, big.NewInt(15))) statedb.AddBalance(teamRewardPool, "SERO", new(big.Int).Div(new(big.Int).Mul(reward, big2), big.NewInt(15))) if header.Number.Uint64()%5000 == 0 { balance := statedb.GetBalance(teamRewardPool, "SERO") statedb.SubBalance(teamRewardPool, "SERO", balance) assetTeam := assets.Asset{Tkn: &assets.Token{ Currency: *common.BytesToHash(common.LeftPadBytes([]byte("SERO"), 32)).HashToUint256(), Value: utils.U256(*balance), }, } statedb.NextZState().AddTxOut(teamAddress, assetTeam, common.Hash{}) balance = statedb.GetBalance(communityRewardPool, "SERO") statedb.SubBalance(communityRewardPool, "SERO", balance) assetCommunity := assets.Asset{Tkn: &assets.Token{ Currency: *common.BytesToHash(common.LeftPadBytes([]byte("SERO"), 32)).HashToUint256(), Value: utils.U256(*balance), }, } statedb.NextZState().AddTxOut(communityAddress, assetCommunity, common.Hash{}) } return reward } func accumulateRewardsV3(statedb *state.StateDB, header *types.Header) *big.Int { diff := new(big.Int).Div(header.Difficulty, big.NewInt(1000000000)) reward := new(big.Int).Add(new(big.Int).Mul(argA, diff), argB) if reward.Cmp(lReward) < 0 { reward = new(big.Int).Set(lReward) } else if reward.Cmp(hReward) > 0 { reward = new(big.Int).Set(hReward) } i := new(big.Int).Add(new(big.Int).Div(new(big.Int).Sub(header.Number, halveNimber), interval), big1) reward.Div(reward, new(big.Int).Exp(big2, i, nil)) if header.Licr.C != 0 { reward = new(big.Int) } if statedb == nil { return reward } statedb.AddBalance(teamRewardPool, "SERO", new(big.Int).Div(reward, big.NewInt(5))) if header.Number.Uint64()%5000 == 0 { balance := statedb.GetBalance(teamRewardPool, "SERO") statedb.SubBalance(teamRewardPool, "SERO", balance) assetTeam := assets.Asset{Tkn: &assets.Token{ Currency: *common.BytesToHash(common.LeftPadBytes([]byte("SERO"), 32)).HashToUint256(), Value: utils.U256(*balance), }, } statedb.NextZState().AddTxOut(teamAddress, assetTeam, common.Hash{}) balance = statedb.GetBalance(communityRewardPool, "SERO") if balance.Sign() > 0 { statedb.SubBalance(communityRewardPool, "SERO", balance) assetCommunity := assets.Asset{Tkn: &assets.Token{ Currency: *common.BytesToHash(common.LeftPadBytes([]byte("SERO"), 32)).HashToUint256(), Value: utils.U256(*balance), }, } statedb.NextZState().AddTxOut(communityAddress, assetCommunity, common.Hash{}) } } return reward } func accumulateRewardsV4(statedb *state.StateDB, header *types.Header) *big.Int { diff := new(big.Int).Div(header.Difficulty, big.NewInt(1000000000)) reward := new(big.Int).Add(new(big.Int).Mul(argA, diff), argB) if reward.Cmp(lReward) < 0 { reward = new(big.Int).Set(lReward) } else if reward.Cmp(hRewardV4) > 0 { reward = new(big.Int).Set(hRewardV4) } i := new(big.Int).Add(new(big.Int).Div(new(big.Int).Sub(header.Number, halveNimber), interval), big1) reward.Div(reward, new(big.Int).Exp(big2, i, nil)) teamReward := new(big.Int).Div(hRewardV4, big.NewInt(4)) teamReward = new(big.Int).Div(teamReward, new(big.Int).Exp(big2, i, nil)) statedb.AddBalance(teamRewardPool, "SERO", teamReward) if header.Number.Uint64()%5000 == 0 { balance := statedb.GetBalance(teamRewardPool, "SERO") statedb.SubBalance(teamRewardPool, "SERO", balance) assetTeam := assets.Asset{Tkn: &assets.Token{ Currency: *common.BytesToHash(common.LeftPadBytes([]byte("SERO"), 32)).HashToUint256(), Value: utils.U256(*balance), }, } statedb.NextZState().AddTxOut(teamAddress, assetTeam, common.Hash{}) } return reward } func accumulateRewardsV5(statedb *state.StateDB, header *types.Header) *big.Int { diff := new(big.Int).Div(header.Difficulty, big.NewInt(1000000000)) reward := new(big.Int).Add(new(big.Int).Mul(argA, diff), argB) if reward.Cmp(lReward) < 0 { reward = new(big.Int).Set(lReward) } else if reward.Cmp(hRewardV4) > 0 { reward = new(big.Int).Set(hRewardV4) } i := new(big.Int).Add(new(big.Int).Div(new(big.Int).Sub(header.Number, halveNimber), interval), big1) reward.Div(reward, new(big.Int).Exp(big2, new(big.Int).Add(i, big1), nil)) teamReward := new(big.Int).Div(hRewardV4, big.NewInt(4)) teamReward = new(big.Int).Div(teamReward, new(big.Int).Exp(big2, i, nil)) statedb.AddBalance(teamRewardPool, "SERO", teamReward) if header.Number.Uint64()%5000 == 0 { balance := statedb.GetBalance(teamRewardPool, "SERO") statedb.SubBalance(teamRewardPool, "SERO", balance) assetTeam := assets.Asset{Tkn: &assets.Token{ Currency: *common.BytesToHash(common.LeftPadBytes([]byte("SERO"), 32)).HashToUint256(), Value: utils.U256(*balance), }, } statedb.NextZState().AddTxOut(teamAddress, assetTeam, common.Hash{}) } return reward } ================================================ FILE: consensus/ethash/consensus_test.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package ethash import ( "encoding/json" "fmt" "math/big" "os" "path/filepath" "testing" "github.com/sero-cash/go-sero/common/math" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/params" ) type diffTest struct { ParentTimestamp uint64 ParentDifficulty *big.Int CurrentTimestamp uint64 CurrentBlocknumber *big.Int CurrentDifficulty *big.Int } func (d *diffTest) UnmarshalJSON(b []byte) (err error) { var ext struct { ParentTimestamp string ParentDifficulty string CurrentTimestamp string CurrentBlocknumber string CurrentDifficulty string } if err := json.Unmarshal(b, &ext); err != nil { return err } d.ParentTimestamp = math.MustParseUint64(ext.ParentTimestamp) d.ParentDifficulty = math.MustParseBig256(ext.ParentDifficulty) d.CurrentTimestamp = math.MustParseUint64(ext.CurrentTimestamp) d.CurrentBlocknumber = math.MustParseBig256(ext.CurrentBlocknumber) d.CurrentDifficulty = math.MustParseBig256(ext.CurrentDifficulty) return nil } func TestCalcDifficulty(t *testing.T) { file, err := os.Open(filepath.Join("..", "..", "tests", "testdata", "BasicTests", "difficulty.json")) if err != nil { t.Skip(err) } defer file.Close() tests := make(map[string]diffTest) err = json.NewDecoder(file).Decode(&tests) if err != nil { t.Fatal(err) } config := ¶ms.ChainConfig{AutumnTwilightBlock: big.NewInt(0)} for name, test := range tests { number := new(big.Int).Sub(test.CurrentBlocknumber, big.NewInt(1)) diff := CalcDifficulty(config, test.CurrentTimestamp, &types.Header{ Number: number, Time: new(big.Int).SetUint64(test.ParentTimestamp), Difficulty: test.ParentDifficulty, }) if diff.Cmp(test.CurrentDifficulty) != 0 { t.Error(name, "failed. Expected", test.CurrentDifficulty, "and calculated", diff) } } } func TestCalcDifficultyV2(t *testing.T) { print(130000, 330000000) print(130000, 340000000) print(130000, 340000001) print(130000, 1651524619) print(130001, 330000000) print(130001, 340000000) print(130001, 340000001) print(130001, 1699999999) print(130001, 1700000000) print(130001, 1700000001) print(130001, 3999999999) print(130001, 4000000000) print(130001, 4000000001) print(130001, 16999999999) print(130001, 17000000000) print(130001, 17000000001) print(3057600, 330000000) print(3057600, 339999999) print(3057600, 340000000) print(3057600, 340000001) print(3057600, 1699999999) print(3057600, 1700000000) print(3057600, 1700000001) print(3057600, 3999999999) print(3057600, 4000000000) print(3057600, 4000000001) print(3057600, 16999999999) print(3057600, 17000000000) print(3057600, 17000000001) print(3057601, 330000000) print(3057601, 339999999) print(3057601, 340000000) print(3057601, 340000001) print(3057601, 1699999999) print(3057601, 1700000000) print(3057601, 1700000001) print(3057601, 3999999999) print(3057601, 4000000000) print(3057601, 4000000001) print(3057601, 16999999999) print(3057601, 17000000000) print(3057601, 17000000001) print(3057601+8294400, 330000000) print(3057601+8294400, 339999999) print(3057601+8294400, 340000000) print(3057601+8294400, 340000001) print(3057601+8294400, 1699999999) print(3057601+8294400, 1700000000) print(3057601+8294400, 1700000001) print(3057601+8294400, 3999999999) print(3057601+8294400, 4000000000) print(3057601+8294400, 4000000001) print(3057601+8294400, 16999999999) print(3057601+8294400, 17000000000) print(3057601+8294400, 17000000001) print(3057601+8294400*2, 330000000) print(3057601+8294400*2, 339999999) print(3057601+8294400*2, 340000000) print(3057601+8294400*2, 340000001) print(3057601+8294400*2, 1699999999) print(3057601+8294400*2, 1700000000) print(3057601+8294400*2, 1700000001) print(3057601+8294400*2, 3999999999) print(3057601+8294400*2, 4000000000) print(3057601+8294400*2, 4000000001) print(3057601+8294400*2, 16999999999) print(3057601+8294400*2, 17000000000) print(3057601+8294400*2, 17000000001) print(120000, 2075498290) } func TestCalcDifficultyV3(t *testing.T) { print(899069, 330000000) print(899069, 130000000000) print(899069, 140000000000) print(899069, 140000000001) print(899069, 700000000000) print(899069, 980000000000) print(899069, 2800000000000) print(899069, 6300000000000) print(899069, 14000000000000) print(899069, 14000000000001) print(899069, 28000000000000) print(899069, 98000000000000) print(899069, 140000000000000) print(899069, 140000000000001) print(899069, 150000000000001) print(3057600, 330000000) print(3057600, 130000000000) print(3057600, 140000000000) print(3057600, 140000000001) print(3057600, 280000000000) print(3057600, 6300000000000) print(3057600, 14000000000000) print(3057600, 28000000000000) print(3057600, 98000000000000) print(3057600, 140000000000000) print(3057600, 140000000000001) print(3057600, 150000000000001) print(3057601, 330000000) print(3057601, 130000000000) print(3057601, 140000000000) print(3057601, 140000000001) print(3057601, 280000000000) print(3057601, 6300000000000) print(3057601, 14000000000000) print(3057601, 28000000000000) print(3057601, 98000000000000) print(3057601, 140000000000000) print(3057601, 140000000000001) print(3057601, 150000000000001) print(3057601+8294400, 330000000) print(3057601+8294400, 130000000000) print(3057601+8294400, 140000000000) print(3057601+8294400, 140000000001) print(3057601+8294400, 280000000000) print(3057601+8294400, 6300000000000) print(3057601+8294400, 14000000000000) print(3057601+8294400, 28000000000000) print(3057601+8294400, 98000000000000) print(3057601+8294400, 140000000000000) print(3057601+8294400, 140000000000001) print(3057601+8294400, 150000000000001) print(3057601+8294400*2, 330000000) print(3057601+8294400*2, 130000000000) print(3057601+8294400*2, 140000000000) print(3057601+8294400*2, 140000000001) print(3057601+8294400*2, 280000000000) print(3057601+8294400*2, 6300000000000) print(3057601+8294400*2, 14000000000000) print(3057601+8294400*2, 28000000000000) print(3057601+8294400*2, 98000000000000) print(3057601+8294400*2, 140000000000000) print(3057601+8294400*2, 140000000000001) print(3057601+8294400*2, 150000000000001) } func print(number int64, difficulty int64) { header := &types.Header{ Number: big.NewInt(number), Difficulty: big.NewInt(difficulty), } v2 := accumulateRewardsV4(nil, header) fmt.Println(number, difficulty) fmt.Println(v2) fmt.Println(new(big.Float).Quo(new(big.Float).SetInt(v2), big.NewFloat(1e+18))) fmt.Println("-------------------------") } func TestCalcDifficultyV4(t *testing.T) { print(899069, 330000000) print(899069, 130000000000) print(899069, 140000000000) print(899069, 140000000001) print(899069, 700000000000) print(899069, 980000000000) print(899069, 2800000000000) print(899069, 6300000000000) print(899069, 14000000000000) print(899069, 14000000000001) print(899069, 28000000000000) print(899069, 98000000000000) print(899069, 140000000000000) print(899069, 140000000000001) print(899069, 150000000000001) print(3057600, 330000000) print(3057600, 130000000000) print(3057600, 140000000000) print(3057600, 140000000001) print(3057600, 280000000000) print(3057600, 6300000000000) print(3057600, 14000000000000) print(3057600, 28000000000000) print(3057600, 98000000000000) print(3057600, 140000000000000) print(3057600, 140000000000001) print(3057600, 150000000000001) print(3057601, 330000000) print(3057601, 130000000000) print(3057601, 140000000000) print(3057601, 140000000001) print(3057601, 280000000000) print(3057601, 6300000000000) print(3057601, 14000000000000) print(3057601, 28000000000000) print(3057601, 98000000000000) print(3057601, 140000000000000) print(3057601, 140000000000001) print(3057601, 150000000000001) print(3057601+8294400, 330000000) print(3057601+8294400, 130000000000) print(3057601+8294400, 140000000000) print(3057601+8294400, 140000000001) print(3057601+8294400, 280000000000) print(3057601+8294400, 6300000000000) print(3057601+8294400, 14000000000000) print(3057601+8294400, 28000000000000) print(3057601+8294400, 98000000000000) print(3057601+8294400, 140000000000000) print(3057601+8294400, 140000000000001) print(3057601+8294400, 150000000000001) print(3057601+8294400*2, 330000000) print(3057601+8294400*2, 130000000000) print(3057601+8294400*2, 140000000000) print(3057601+8294400*2, 140000000001) print(3057601+8294400*2, 280000000000) print(3057601+8294400*2, 6300000000000) print(3057601+8294400*2, 14000000000000) print(3057601+8294400*2, 28000000000000) print(3057601+8294400*2, 98000000000000) print(3057601+8294400*2, 140000000000000) print(3057601+8294400*2, 140000000000001) print(3057601+8294400*2, 150000000000001) } func TestSIPEncode(t *testing.T) { } func TestSIPSetting(t *testing.T) { GetSipSetting(); } ================================================ FILE: consensus/ethash/ethash.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // Package ethash implements the ethash proof-of-work consensus engine. package ethash import ( "errors" "fmt" "math" "math/big" "math/rand" "os" "path/filepath" "reflect" "runtime" "strconv" "sync" "sync/atomic" "time" "unsafe" mmap "github.com/edsrzf/mmap-go" "github.com/hashicorp/golang-lru/simplelru" "github.com/sero-cash/go-sero/consensus" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/metrics" "github.com/sero-cash/go-sero/rpc" ) var ErrInvalidDumpMagic = errors.New("invalid dump magic") var ( // maxUint256 is a big integer representing 2^256-1 maxUint256 = new(big.Int).Exp(big.NewInt(2), big.NewInt(256), big.NewInt(0)) // sharedEthash is a full instance that can be shared between multiple users. sharedEthash = New(Config{"", 3, 0, "", 1, 0, ModeNormal}) // algorithmRevision is the data structure version used for file naming. algorithmRevision = 23 // dumpMagic is a dataset dump header to sanity check a data dump. dumpMagic = []uint32{0xbaddcafe, 0xfee1dead} ) // isLittleEndian returns whether the local system is running in little or big // endian byte order. func isLittleEndian() bool { n := uint32(0x01020304) return *(*byte)(unsafe.Pointer(&n)) == 0x04 } // memoryMap tries to memory map a file of uint32s for read only access. func memoryMap(path string) (*os.File, mmap.MMap, []uint32, error) { file, err := os.OpenFile(path, os.O_RDONLY, 0644) if err != nil { return nil, nil, nil, err } mem, buffer, err := memoryMapFile(file, false) if err != nil { file.Close() return nil, nil, nil, err } for i, magic := range dumpMagic { if buffer[i] != magic { mem.Unmap() file.Close() return nil, nil, nil, ErrInvalidDumpMagic } } return file, mem, buffer[len(dumpMagic):], err } // memoryMapFile tries to memory map an already opened file descriptor. func memoryMapFile(file *os.File, write bool) (mmap.MMap, []uint32, error) { // Try to memory map the file flag := mmap.RDONLY if write { flag = mmap.RDWR } mem, err := mmap.Map(file, flag, 0) if err != nil { return nil, nil, err } // Yay, we managed to memory map the file, here be dragons header := *(*reflect.SliceHeader)(unsafe.Pointer(&mem)) header.Len /= 4 header.Cap /= 4 return mem, *(*[]uint32)(unsafe.Pointer(&header)), nil } // memoryMapAndGenerate tries to memory map a temporary file of uint32s for write // access, fill it with the data from a generator and then move it into the final // path requested. func memoryMapAndGenerate(path string, size uint64, generator func(buffer []uint32)) (*os.File, mmap.MMap, []uint32, error) { // Ensure the data folder exists if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil { return nil, nil, nil, err } // Create a huge temporary empty file to fill with data temp := path + "." + strconv.Itoa(rand.Int()) dump, err := os.Create(temp) if err != nil { return nil, nil, nil, err } if err = dump.Truncate(int64(len(dumpMagic))*4 + int64(size)); err != nil { return nil, nil, nil, err } // Memory map the file for writing and fill it with the generator mem, buffer, err := memoryMapFile(dump, true) if err != nil { dump.Close() return nil, nil, nil, err } copy(buffer, dumpMagic) data := buffer[len(dumpMagic):] generator(data) if err := mem.Unmap(); err != nil { return nil, nil, nil, err } if err := dump.Close(); err != nil { return nil, nil, nil, err } if err := os.Rename(temp, path); err != nil { return nil, nil, nil, err } return memoryMap(path) } // lru tracks caches or datasets by their last use time, keeping at most N of them. type lru struct { what string new func(epoch uint64) interface{} mu sync.Mutex // Items are kept in a LRU cache, but there is a special case: // We always keep an item for (highest seen epoch) + 1 as the 'future item'. cache *simplelru.LRU future uint64 futureItem interface{} } // newlru create a new least-recently-used cache for either the verification caches // or the mining datasets. func newlru(what string, maxItems int, new func(epoch uint64) interface{}) *lru { if maxItems <= 0 { maxItems = 1 } cache, _ := simplelru.NewLRU(maxItems, func(key, value interface{}) { log.Trace("Evicted ethash "+what, "epoch", key) }) return &lru{what: what, new: new, cache: cache} } // get retrieves or creates an item for the given epoch. The first return value is always // non-nil. The second return value is non-nil if lru thinks that an item will be useful in // the near future. func (lru *lru) get(epoch uint64) (item, future interface{}) { lru.mu.Lock() defer lru.mu.Unlock() // Get or create the item for the requested epoch. item, ok := lru.cache.Get(epoch) if !ok { if lru.future > 0 && lru.future == epoch { item = lru.futureItem } else { log.Trace("Requiring new ethash "+lru.what, "epoch", epoch) item = lru.new(epoch) } lru.cache.Add(epoch, item) } // Update the 'future item' if epoch is larger than previously seen. if epoch < maxEpoch-1 && lru.future < epoch+1 { log.Trace("Requiring new future ethash "+lru.what, "epoch", epoch+1) future = lru.new(epoch + 1) lru.future = epoch + 1 lru.futureItem = future } return item, future } // cache wraps an ethash cache with some metadata to allow easier concurrent use. type cache struct { epoch uint64 // Epoch for which this cache is relevant dump *os.File // File descriptor of the memory mapped cache mmap mmap.MMap // Memory map itself to unmap before releasing cache []uint32 // The actual cache data content (may be memory mapped) cdag []uint32 once sync.Once // Ensures the cache is generated only once } func (self *cache) generateCDag() { self.cdag = make([]uint32, progpowCacheWords) generateCDag(self.cdag, self.cache, self.epoch) } // newCache creates a new ethash verification cache and returns it as a plain Go // interface to be usable in an LRU cache. func newCache(epoch uint64) interface{} { return &cache{epoch: epoch} } // generate ensures that the cache content is generated before use. func (c *cache) generate(dir string, limit int, test bool) { c.once.Do(func() { size := cacheSize(c.epoch*epochLength + 1) seed := seedHash(c.epoch*epochLength + 1) if test { size = 1024 } // If we don't store anything on disk, generate and return. if dir == "" { c.cache = make([]uint32, size/4) generateCache(c.cache, c.epoch, seed) c.generateCDag() return } // Disk storage is needed, this will get fancy var endian string if !isLittleEndian() { endian = ".be" } path := filepath.Join(dir, fmt.Sprintf("cache-R%d-%x%s", algorithmRevision, seed[:8], endian)) logger := log.New("epoch", c.epoch) // We're about to mmap the file, ensure that the mapping is cleaned up when the // cache becomes unused. runtime.SetFinalizer(c, (*cache).finalizer) // Try to load the file from disk and memory map it var err error c.dump, c.mmap, c.cache, err = memoryMap(path) if err == nil { c.generateCDag() logger.Debug("Loaded old ethash cache from disk") return } logger.Debug("Failed to load old ethash cache", "err", err) // No previous cache available, create a new cache file to fill c.dump, c.mmap, c.cache, err = memoryMapAndGenerate(path, size, func(buffer []uint32) { generateCache(buffer, c.epoch, seed) }) if err != nil { logger.Error("Failed to generate mapped ethash cache", "err", err) c.cache = make([]uint32, size/4) generateCache(c.cache, c.epoch, seed) } // Iterate over all previous instances and delete old ones for ep := int(c.epoch) - limit; ep >= 0; ep-- { seed := seedHash(uint64(ep)*epochLength + 1) path := filepath.Join(dir, fmt.Sprintf("cache-R%d-%x%s", algorithmRevision, seed[:8], endian)) os.Remove(path) } c.generateCDag() }) } // finalizer unmaps the memory and closes the file. func (c *cache) finalizer() { if c.mmap != nil { c.mmap.Unmap() c.dump.Close() c.mmap, c.dump = nil, nil } } // dataset wraps an ethash dataset with some metadata to allow easier concurrent use. type dataset struct { epoch uint64 // Epoch for which this cache is relevant dump *os.File // File descriptor of the memory mapped cache mmap mmap.MMap // Memory map itself to unmap before releasing dataset []uint32 // The actual cache data content once sync.Once // Ensures the cache is generated only once done uint32 } // newDataset creates a new ethash mining dataset and returns it as a plain Go // interface to be usable in an LRU cache. func newDataset(epoch uint64) interface{} { return &dataset{epoch: epoch} } func (d *dataset) generated() bool { return atomic.LoadUint32(&d.done) == 1 } // generate ensures that the dataset content is generated before use. func (d *dataset) generate(dir string, limit int, test bool) { d.once.Do(func() { defer atomic.StoreUint32(&d.done, 1) csize := cacheSize(d.epoch*epochLength + 1) dsize := datasetSize(d.epoch*epochLength + 1) seed := seedHash(d.epoch*epochLength + 1) if test { csize = 1024 dsize = 32 * 1024 } // If we don't store anything on disk, generate and return if dir == "" { cache := make([]uint32, csize/4) generateCache(cache, d.epoch, seed) d.dataset = make([]uint32, dsize/4) generateDataset(d.dataset, d.epoch, cache) } // Disk storage is needed, this will get fancy var endian string if !isLittleEndian() { endian = ".be" } path := filepath.Join(dir, fmt.Sprintf("full-R%d-%x%s", algorithmRevision, seed[:8], endian)) logger := log.New("epoch", d.epoch) // We're about to mmap the file, ensure that the mapping is cleaned up when the // cache becomes unused. runtime.SetFinalizer(d, (*dataset).finalizer) // Try to load the file from disk and memory map it var err error d.dump, d.mmap, d.dataset, err = memoryMap(path) if err == nil { logger.Debug("Loaded old ethash dataset from disk") return } logger.Debug("Failed to load old ethash dataset", "err", err) // No previous dataset available, create a new dataset file to fill cache := make([]uint32, csize/4) generateCache(cache, d.epoch, seed) d.dump, d.mmap, d.dataset, err = memoryMapAndGenerate(path, dsize, func(buffer []uint32) { generateDataset(buffer, d.epoch, cache) }) if err != nil { logger.Error("Failed to generate mapped ethash dataset", "err", err) d.dataset = make([]uint32, dsize/2) generateDataset(d.dataset, d.epoch, cache) } // Iterate over all previous instances and delete old ones for ep := int(d.epoch) - limit; ep >= 0; ep-- { seed := seedHash(uint64(ep)*epochLength + 1) path := filepath.Join(dir, fmt.Sprintf("full-R%d-%x%s", algorithmRevision, seed[:8], endian)) os.Remove(path) } }) } // finalizer closes any file handlers and memory maps open. func (d *dataset) finalizer() { if d.mmap != nil { d.mmap.Unmap() d.dump.Close() d.mmap, d.dump = nil, nil } } // MakeCache generates a new ethash cache and optionally stores it to disk. func MakeCache(block uint64, dir string) { c := cache{epoch: block / epochLength} c.generate(dir, math.MaxInt32, false) } // MakeDataset generates a new ethash dataset and optionally stores it to disk. func MakeDataset(block uint64, dir string) { d := dataset{epoch: block / epochLength} d.generate(dir, math.MaxInt32, false) } // Mode defines the type and amount of PoW verification an ethash engine makes. type Mode uint const ( ModeNormal Mode = iota ModeShared ModeTest ModeFake ModeFullFake ) // Config are the configuration parameters of the ethash. type Config struct { CacheDir string CachesInMem int CachesOnDisk int DatasetDir string DatasetsInMem int DatasetsOnDisk int PowMode Mode } // Ethash is a consensus engine based on proof-of-work implementing the ethash // algorithm. type Ethash struct { config Config caches *lru // In memory caches to avoid regenerating too often datasets *lru // In memory datasets to avoid regenerating too often // Mining related fields rand *rand.Rand // Properly seeded random source for nonces threads int // Number of threads to mine on if mining update chan struct{} // Notification channel to update mining parameters hashrate metrics.Meter // Meter tracking the average hashrate // The fields below are hooks for testing shared *Ethash // Shared PoW verifier to avoid cache regeneration fakeFail uint64 // Block number which fails PoW check even in fake mode fakeDelay time.Duration // Time delay to sleep for before returning from verify lock sync.Mutex // Ensures thread safety for the in-memory caches and mining fields } // New creates a full sized ethash PoW scheme. func New(config Config) *Ethash { if config.CachesInMem <= 0 { log.Warn("One ethash cache must always be in memory", "requested", config.CachesInMem) config.CachesInMem = 1 } if config.CacheDir != "" && config.CachesOnDisk > 0 { log.Info("Disk storage enabled for ethash caches", "dir", config.CacheDir, "count", config.CachesOnDisk) } if config.DatasetDir != "" && config.DatasetsOnDisk > 0 { log.Info("Disk storage enabled for ethash DAGs", "dir", config.DatasetDir, "count", config.DatasetsOnDisk) } return &Ethash{ config: config, caches: newlru("cache", config.CachesInMem, newCache), datasets: newlru("dataset", config.DatasetsInMem, newDataset), update: make(chan struct{}), hashrate: metrics.NewMeter(), } } // NewTester creates a small sized ethash PoW scheme useful only for testing // purposes. func NewTester() *Ethash { return New(Config{CachesInMem: 1, PowMode: ModeTest}) } // NewFaker creates a ethash consensus engine with a fake PoW scheme that accepts // all blocks' seal as valid, though they still have to conform to the Ethereum // consensus rules. func NewFaker() *Ethash { return &Ethash{ config: Config{ PowMode: ModeFake, }, } } // NewFakeFailer creates a ethash consensus engine with a fake PoW scheme that // accepts all blocks as valid apart from the single one specified, though they // still have to conform to the Ethereum consensus rules. func NewFakeFailer(fail uint64) *Ethash { return &Ethash{ config: Config{ PowMode: ModeFake, }, fakeFail: fail, } } // NewFakeDelayer creates a ethash consensus engine with a fake PoW scheme that // accepts all blocks as valid, but delays verifications by some time, though // they still have to conform to the Ethereum consensus rules. func NewFakeDelayer(delay time.Duration) *Ethash { return &Ethash{ config: Config{ PowMode: ModeFake, }, fakeDelay: delay, } } // NewFullFaker creates an ethash consensus engine with a full fake scheme that // accepts all blocks as valid, without checking any consensus rules whatsoever. func NewFullFaker() *Ethash { return &Ethash{ config: Config{ PowMode: ModeFullFake, }, } } // NewShared creates a full sized ethash PoW shared between all requesters running // in the same process. func NewShared() *Ethash { return &Ethash{shared: sharedEthash} } // cache tries to retrieve a verification cache for the specified block number // by first checking against a list of in-memory caches, then against caches // stored on disk, and finally generating one if none can be found. func (ethash *Ethash) cache(block uint64) *cache { epoch := block / epochLength currentI, futureI := ethash.caches.get(epoch) current := currentI.(*cache) // Wait for generation finish. current.generate(ethash.config.CacheDir, ethash.config.CachesOnDisk, ethash.config.PowMode == ModeTest) // If we need a new future cache, now's a good time to regenerate it. if futureI != nil { future := futureI.(*cache) go future.generate(ethash.config.CacheDir, ethash.config.CachesOnDisk, ethash.config.PowMode == ModeTest) } return current } func (ethash *Ethash) dataset_async(block uint64) *dataset { // Retrieve the requested ethash dataset epoch := block / epochLength currentI, futureI := ethash.datasets.get(epoch) current := currentI.(*dataset) // If async is specified, generate everything in a background thread if !current.generated() { go func() { current.generate(ethash.config.DatasetDir, ethash.config.DatasetsOnDisk, ethash.config.PowMode == ModeTest) if futureI != nil { future := futureI.(*dataset) future.generate(ethash.config.DatasetDir, ethash.config.DatasetsOnDisk, ethash.config.PowMode == ModeTest) } }() } return current } // dataset tries to retrieve a mining dataset for the specified block number // by first checking against a list of in-memory datasets, then against DAGs // stored on disk, and finally generating one if none can be found. func (ethash *Ethash) dataset(block uint64) *dataset { epoch := block / epochLength currentI, futureI := ethash.datasets.get(epoch) current := currentI.(*dataset) // Wait for generation finish. current.generate(ethash.config.DatasetDir, ethash.config.DatasetsOnDisk, ethash.config.PowMode == ModeTest) // If we need a new future dataset, now's a good time to regenerate it. if futureI != nil { future := futureI.(*dataset) go future.generate(ethash.config.DatasetDir, ethash.config.DatasetsOnDisk, ethash.config.PowMode == ModeTest) } return current } // Threads returns the number of mining threads currently enabled. This doesn't // necessarily mean that mining is running! func (ethash *Ethash) Threads() int { ethash.lock.Lock() defer ethash.lock.Unlock() return ethash.threads } // SetThreads updates the number of mining threads currently enabled. Calling // this method does not start mining, only sets the thread count. If zero is // specified, the miner will use all cores of the machine. Setting a thread // count below zero is allowed and will cause the miner to idle, without any // work being done. func (ethash *Ethash) SetThreads(threads int) { ethash.lock.Lock() defer ethash.lock.Unlock() // If we're running a shared PoW, set the thread count on that instead if ethash.shared != nil { ethash.shared.SetThreads(threads) return } // Update the threads and ping any running seal to pull in any changes ethash.threads = threads select { case ethash.update <- struct{}{}: default: } } // Hashrate implements PoW, returning the measured rate of the search invocations // per second over the last minute. func (ethash *Ethash) Hashrate() float64 { return ethash.hashrate.Rate1() } func (ethash *Ethash) StartHashrate() { ethash.hashrate.Stop() ethash.hashrate = metrics.NewHashrateMeter() } func (ethash *Ethash) StopHashrate() { ethash.hashrate.Stop() ethash.hashrate = metrics.NilMeter{} } // APIs implements consensus.Engine, returning the user facing RPC APIs. Currently // that is empty. func (ethash *Ethash) APIs(chain consensus.ChainReader) []rpc.API { return nil } // SeedHash is the seed to use for generating a verification cache and the mining // dataset. func SeedHash(block uint64) []byte { return seedHash(block) } ================================================ FILE: consensus/ethash/ethash_test.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package ethash import ( "io/ioutil" "math/big" "math/rand" "os" "sync" "testing" "github.com/sero-cash/go-sero/core/types" ) // Tests that ethash works correctly in test mode. func TestTestMode(t *testing.T) { head := &types.Header{Number: big.NewInt(1), Difficulty: big.NewInt(100)} ethash := NewTester() block, err := ethash.Seal(nil, types.NewBlockWithHeader(head), nil) if err != nil { t.Fatalf("failed to seal block: %v", err) } head.Nonce = types.EncodeNonce(block.Nonce()) head.MixDigest = block.MixDigest() if err := ethash.VerifySeal(nil, head); err != nil { t.Fatalf("unexpected verification error: %v", err) } } // This test checks that cache lru logic doesn't crash under load. // It reproduces https://github.com/sero-cash/go-sero/issues/14943 func TestCacheFileEvict(t *testing.T) { tmpdir, err := ioutil.TempDir("", "ethash-test") if err != nil { t.Fatal(err) } defer os.RemoveAll(tmpdir) e := New(Config{CachesInMem: 3, CachesOnDisk: 10, CacheDir: tmpdir, PowMode: ModeTest}) workers := 8 epochs := 100 var wg sync.WaitGroup wg.Add(workers) for i := 0; i < workers; i++ { go verifyTest(&wg, e, i, epochs) } wg.Wait() } func verifyTest(wg *sync.WaitGroup, e *Ethash, workerIndex, epochs int) { defer wg.Done() const wiggle = 4 * epochLength r := rand.New(rand.NewSource(int64(workerIndex))) for epoch := 0; epoch < epochs; epoch++ { block := int64(epoch)*epochLength - wiggle/2 + r.Int63n(wiggle) if block < 0 { block = 0 } head := &types.Header{Number: big.NewInt(block), Difficulty: big.NewInt(100)} e.VerifySeal(nil, head) } } ================================================ FILE: consensus/ethash/progpow.go ================================================ package ethash import ( "encoding/binary" "time" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/crypto/sha3" "github.com/sero-cash/go-sero/log" ) const ( progpowCacheBytes = 16 * 1024 // Total size 16*1024 bytes progpowCacheWords = progpowCacheBytes / 4 // Total size 16*1024 bytes progpowLanes = 16 progpowRegs = 32 progpowCntCache = 12 progpowCntMath = 20 progpowDagLoads = 4 progpowCntDag = 64 progpowMixBytes = 2 * mixBytes progpowPeriod = 50 ) func progpowLight(size uint64, cache []uint32, hash []byte, nonce uint64, blockNumber uint64, cDag []uint32) ([]byte, []byte) { keccak512 := makeHasher(sha3.NewKeccak512()) lookup := func(index uint32) []byte { rawData := generateDatasetItem(cache, index/16, keccak512) return rawData } return progpow(hash, nonce, size, blockNumber, cDag, lookup) } func generateCDag(cDag, cache []uint32, epoch uint64) { if cDag == nil { return } start := time.Now() keccak512 := makeHasher(sha3.NewKeccak512()) for i := uint32(0); i < progpowCacheWords/16; i++ { rawData := generateDatasetItem(cache, i, keccak512) // 64 bytes in rawData -> 16 uint32 for j := uint32(0); j < 16; j++ { cDag[i*16+j] = binary.LittleEndian.Uint32(rawData[4*j:]) } } elapsed := time.Since(start) log.Info("Generated progpow cDag", "elapsed", common.PrettyDuration(elapsed), "epoch", epoch) } func progpowLightWithoutCDag( size uint64, cache []uint32, cDag []uint32, hash []byte, nonce uint64, blockNumber uint64) ([]byte, []byte) { //cDag := make([]uint32, progpowCacheWords) //generateCDag(cDag, cache, blockNumber/epochLength) return progpowLight(size, cache, hash, nonce, blockNumber, cDag) } /* func progpowLightWithoutCDag( size uint64, cache []uint32, hash []byte, nonce uint64, blockNumber uint64) ([]byte, []byte) { keccak512 := makeHasher(sha3.NewKeccak512()) cDag := make([]uint32, progpowCacheWords) rawData := generateDatasetItem(cache, 0, keccak512) for i := uint32(0); i < progpowCacheWords; i += 2 { if i != 0 && 2*i/16 != 2*(i-1)/16 { rawData = generateDatasetItem(cache, 2*i/16, keccak512) } cDag[i+0] = binary.LittleEndian.Uint32(rawData[((2*i+0)%16)*4:]) cDag[i+1] = binary.LittleEndian.Uint32(rawData[((2*i+1)%16)*4:]) } return progpowLight(size, cache, hash, nonce, blockNumber, cDag) }*/ func progpowFull(dataset []uint32, hash []byte, nonce uint64, blockNumber uint64) ([]byte, []byte) { lookup := func(index uint32) []byte { mix := make([]byte, hashBytes) for i := uint32(0); i < hashWords; i++ { binary.LittleEndian.PutUint32(mix[i*4:], dataset[(index/16)*16+i]) } return mix } cDag := make([]uint32, progpowCacheWords) // initialize cDag for i := uint32(0); i < progpowCacheWords; i++ { cDag[i] = dataset[i] } return progpow(hash, nonce, uint64(len(dataset))*4, blockNumber, cDag, lookup) } func rotl32(x uint32, n uint32) uint32 { return (((x) << (n % 32)) | ((x) >> (32 - (n % 32)))) } func rotr32(x uint32, n uint32) uint32 { return (((x) >> (n % 32)) | ((x) << (32 - (n % 32)))) } func lower32(in uint64) uint32 { return uint32(in & uint64(0x00000000FFFFFFFF)) } func higher32(in uint64) uint32 { return uint32((in >> 32) & uint64(0x00000000FFFFFFFF)) } var keccakfRNDC = [24]uint32{ 0x00000001, 0x00008082, 0x0000808a, 0x80008000, 0x0000808b, 0x80000001, 0x80008081, 0x00008009, 0x0000008a, 0x00000088, 0x80008009, 0x8000000a, 0x8000808b, 0x0000008b, 0x00008089, 0x00008003, 0x00008002, 0x00000080, 0x0000800a, 0x8000000a, 0x80008081, 0x00008080, 0x80000001, 0x80008008} func keccakF800Round(st [25]uint32, r int) [25]uint32 { var keccakfROTC = [24]uint32{1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 2, 14, 27, 41, 56, 8, 25, 43, 62, 18, 39, 61, 20, 44} var keccakfPILN = [24]uint32{10, 7, 11, 17, 18, 3, 5, 16, 8, 21, 24, 4, 15, 23, 19, 13, 12, 2, 20, 14, 22, 9, 6, 1} bc := make([]uint32, 5) // Theta for i := 0; i < 5; i++ { bc[i] = st[i] ^ st[i+5] ^ st[i+10] ^ st[i+15] ^ st[i+20] } for i := 0; i < 5; i++ { t := bc[(i+4)%5] ^ rotl32(bc[(i+1)%5], 1) for j := 0; j < 25; j += 5 { st[j+i] ^= t } } // Rho Pi t := st[1] for i := 0; i < 24; i++ { j := keccakfPILN[i] bc[0] = st[j] st[j] = rotl32(t, keccakfROTC[i]) t = bc[0] } // Chi for j := 0; j < 25; j += 5 { for i := 0; i < 5; i++ { bc[i] = st[j+i] } for i := 0; i < 5; i++ { st[j+i] ^= (^bc[(i+1)%5]) & bc[(i+2)%5] } } // Iota st[0] ^= keccakfRNDC[r] return st } func byteReverse(i uint32) uint32 { var ret uint32 ret = 0 ret += (i & 0xFF) ret <<= 8 ret += ((i >> 8) & 0xFF) ret <<= 8 ret += ((i >> 16) & 0xFF) ret <<= 8 ret += (i >> 24) return ret } func keccakF800(headerHash []byte, nonce uint64, result []uint32) uint64 { var st [25]uint32 var ret uint64 for i := 0; i < 25; i++ { st[i] = 0 } for i := 0; i < 8; i++ { st[i] = (uint32(headerHash[4*i])) + (uint32(headerHash[4*i+1]) << 8) + (uint32(headerHash[4*i+2]) << 16) + (uint32(headerHash[4*i+3]) << 24) } st[8] = lower32(nonce) st[9] = higher32(nonce) for i := 0; i < 8; i++ { st[10+i] = result[i] } for r := 0; r < 21; r++ { st = keccakF800Round(st, r) } st = keccakF800Round(st, 21) ret = uint64(byteReverse(st[0])) ret = (ret << 32) + uint64(byteReverse(st[1])) return ret } func keccakF800Full(headerHash []byte, nonce uint64, result []uint32) []byte { var st [25]uint32 for i := 0; i < 25; i++ { st[i] = 0 } for i := 0; i < 8; i++ { st[i] = (uint32(headerHash[4*i])) + (uint32(headerHash[4*i+1]) << 8) + (uint32(headerHash[4*i+2]) << 16) + (uint32(headerHash[4*i+3]) << 24) } st[8] = lower32(nonce) st[9] = higher32(nonce) for i := 0; i < 8; i++ { st[10+i] = result[i] } for r := 0; r < 21; r++ { st = keccakF800Round(st, r) } st = keccakF800Round(st, 21) ret := make([]byte, 32) for i := 0; i < 8; i++ { binary.LittleEndian.PutUint32(ret[i*4:], st[i]) } return ret } func fnv1a(h *uint32, d uint32) uint32 { *h = (*h ^ d) * uint32(0x1000193) return *h } type kiss99State struct { z uint32 w uint32 jsr uint32 jcong uint32 } func kiss99(st *kiss99State) uint32 { var MWC uint32 st.z = 36969*(st.z&65535) + (st.z >> 16) st.w = 18000*(st.w&65535) + (st.w >> 16) MWC = ((st.z << 16) + st.w) st.jsr ^= (st.jsr << 17) st.jsr ^= (st.jsr >> 13) st.jsr ^= (st.jsr << 5) st.jcong = 69069*st.jcong + 1234567 return ((MWC ^ st.jcong) + st.jsr) } func fillMix(seed uint64, laneId uint32) [progpowRegs]uint32 { var st kiss99State var mix [progpowRegs]uint32 fnvHash := uint32(0x811c9dc5) st.z = fnv1a(&fnvHash, lower32(seed)) st.w = fnv1a(&fnvHash, higher32(seed)) st.jsr = fnv1a(&fnvHash, laneId) st.jcong = fnv1a(&fnvHash, laneId) for i := 0; i < progpowRegs; i++ { mix[i] = kiss99(&st) } return mix } func clz(a uint32) uint32 { for i := uint32(0); i < 32; i++ { if (a >> (31 - i)) > 0 { return i } } return uint32(32) } func popcount(a uint32) uint32 { count := uint32(0) for i := uint32(0); i < 32; i++ { if ((a >> (31 - i)) & uint32(1)) == uint32(1) { count += 1 } } return count } var i = 0 // Merge new data from b into the value in a // Assuming A has high entropy only do ops that retain entropy // even if B is low entropy // (IE don't do A&B) func merge(a *uint32, b uint32, r uint32) { x := (r>>16)%31 + 1 switch r % 4 { case 0: *a = (*a * 33) + b case 1: *a = (*a ^ b) * 33 case 2: *a = rotl32(*a, x) ^ b case 3: *a = rotr32(*a, x) ^ b } } func progpowInit( seed uint64, ) ( kiss99State, [progpowRegs]uint32, [progpowRegs]uint32, ) { seed_lo := lower32(seed) seed_hi := higher32(seed) var randState kiss99State var dst_seq [progpowRegs]uint32 var src_seq [progpowRegs]uint32 fnv_offset_basis := uint32(0x811c9dc5) randState.z = fnv1a(&fnv_offset_basis, seed_lo) randState.w = fnv1a(&fnv_offset_basis, seed_hi) randState.jsr = fnv1a(&fnv_offset_basis, seed_lo) randState.jcong = fnv1a(&fnv_offset_basis, seed_hi) for i := uint32(0); i < progpowRegs; i++ { dst_seq[i] = i src_seq[i] = i } for i := uint32(progpowRegs); i > 1; i-- { dst_temp := dst_seq[i-1] dst_index := kiss99(&randState) % i dst_seq[i-1] = dst_seq[dst_index] dst_seq[dst_index] = dst_temp src_temp := src_seq[i-1] src_index := kiss99(&randState) % i src_seq[i-1] = src_seq[src_index] src_seq[src_index] = src_temp } return randState, dst_seq, src_seq } // Random math between two input values func progpowMath(a uint32, b uint32, r uint32) uint32 { switch r % 11 { case 0: return a + b case 1: return a * b case 2: return higher32(uint64(a) * uint64(b)) case 3: if a < b { return a } return b case 4: return rotl32(a, b) case 5: return rotr32(a, b) case 6: return a & b case 7: return a | b case 8: return a ^ b case 9: return clz(a) + clz(b) case 10: return popcount(a) + popcount(b) default: return 0 } } type mixRngState struct { dst_counter uint32 dst_seq [progpowRegs]uint32 src_counter uint32 src_seq [progpowRegs]uint32 state kiss99State } func (self *mixRngState) rng() (ret uint32) { return kiss99(&self.state) } func (self *mixRngState) next_dst() (ret uint32) { ret = self.dst_seq[self.dst_counter%progpowRegs] self.dst_counter++ return } func (self *mixRngState) next_src() (ret uint32) { ret = self.src_seq[self.src_counter%progpowRegs] self.src_counter++ return } func newMixRngState(blockNumber uint64) (ret mixRngState) { ret.state, ret.dst_seq, ret.src_seq = progpowInit(blockNumber) return } func progpowLoop( blockNumber uint64, loop uint32, mix *[progpowLanes][progpowRegs]uint32, lookup func(index uint32) []byte, cDag []uint32, datasetSize uint32, ) { state := newMixRngState(blockNumber / progpowPeriod) // All lanes share a base address for the global load // Global offset uses mix[0] to guarantee it depends on the load result item_index := mix[loop%progpowLanes][0] % (64 * datasetSize / (progpowLanes * progpowDagLoads)) // 256 bytes of dag data item := make([]byte, 256) // The lookup returns 64, so we'll fetch four items copy(item, lookup((item_index*progpowLanes)*progpowDagLoads)) copy(item[64:], lookup((item_index*progpowLanes)*progpowDagLoads+16)) copy(item[128:], lookup((item_index*progpowLanes)*progpowDagLoads+32)) copy(item[192:], lookup((item_index*progpowLanes)*progpowDagLoads+48)) const num_words_per_lane = uint32(256 / (4 * progpowLanes)) var max_operations int if progpowCntCache > progpowCntMath { max_operations = progpowCntCache } else { max_operations = progpowCntMath } for i := 0; i < max_operations; i++ { if i < progpowCntCache { src := state.next_src() dst := state.next_dst() sel := state.rng() for l := 0; l < progpowLanes; l++ { offset := mix[l][src] % progpowCacheWords merge(&mix[l][dst], cDag[offset], sel) } } if i < progpowCntMath { src_rnd := state.rng() % (progpowRegs * (progpowRegs - 1)) src1 := src_rnd % progpowRegs src2 := src_rnd / progpowRegs if src2 >= src1 { src2++ } sel1 := state.rng() dst := state.next_dst() sel2 := state.rng() for l := 0; l < progpowLanes; l++ { data := progpowMath(mix[l][src1], mix[l][src2], sel1) merge(&mix[l][dst], data, sel2) } } } var dsts [num_words_per_lane]uint32 var sels [num_words_per_lane]uint32 for i := uint32(0); i < num_words_per_lane; i++ { if i == 0 { dsts[i] = 0 } else { dsts[i] = state.next_dst() } sels[i] = state.rng() } for l := uint32(0); l < progpowLanes; l++ { offset := ((l ^ loop) % progpowLanes) * num_words_per_lane for i := uint32(0); i < num_words_per_lane; i++ { word := binary.LittleEndian.Uint32(item[(offset+i)*4:]) merge(&mix[l][dsts[i]], word, sels[i]) } } } func keccak_progpow_64(hash []byte, nonce uint64) (seed uint64) { digest := make([]uint32, 8) for i := uint32(0); i < 8; i++ { digest[i] = 0 } seed = keccakF800(hash, nonce, digest) return } func init_mix(seed uint64) (mix [progpowLanes][progpowRegs]uint32) { for lane := uint32(0); lane < progpowLanes; lane++ { mix[lane] = fillMix(seed, lane) } return } func progpow( hash []byte, nonce uint64, size uint64, blockNumber uint64, cDag []uint32, lookup func(index uint32) []byte, ) ([]byte, []byte) { var laneDigest [progpowLanes]uint32 seed := keccak_progpow_64(hash, nonce) mix := init_mix(seed) for loop := uint32(0); loop < progpowCntDag; loop++ { progpowLoop( blockNumber, loop, &mix, lookup, cDag, uint32(size/progpowMixBytes)) } // Reduce mix data to a single per-lane result for lane := uint32(0); lane < progpowLanes; lane++ { laneDigest[lane] = 0x811c9dc5 for i := uint32(0); i < progpowRegs; i++ { fnv1a(&laneDigest[lane], mix[lane][i]) } } digest := make([]uint32, 8) for i := uint32(0); i < 8; i++ { digest[i] = 0x811c9dc5 } for lane := uint32(0); lane < progpowLanes; lane++ { fnv1a(&digest[lane%8], laneDigest[lane]) } result := keccakF800Full(hash, seed, digest[:]) digestBytes := make([]byte, 8*4) for i := 0; i < 8; i++ { binary.LittleEndian.PutUint32(digestBytes[i*4:], digest[i]) } return digestBytes[:], result[:] } ================================================ FILE: consensus/ethash/progpow_test.go ================================================ package ethash import ( "fmt" "testing" "github.com/sero-cash/go-sero/common/hexutil" ) func TestProgpow(t *testing.T) { cache_size := calcCacheSize(0) data_size := calcDatasetSize(0) seed := seedHash(0*epochLength + 1) cache := make([]uint32, cache_size/4) generateCache(cache, 0, seed) header, _ := hexutil.Decode("0x5ffee07b6b16bc6f364c45b84d412138a0b1588edb74e4123e419384435e1691") cDag := make([]uint32, progpowCacheWords) d, r := progpowLightWithoutCDag(data_size, cache, cDag, header, 15017396847274520746, 50) fmt.Printf("d: %v,r: %v", hexutil.Encode(d), hexutil.Encode(r)) } func TestProgpowFull(t *testing.T) { csize := cacheSize(1) dsize := datasetSize(1) cache := make([]uint32, csize/4) seed := seedHash(0*epochLength + 1) generateCache(cache, 0, seed) dataset := make([]uint32, dsize/4) generateDataset(dataset, 0, cache) header, _ := hexutil.Decode("0x5ffee07b6b16bc6f364c45b84d412138a0b1588edb74e4123e419384435e1691") d, r := progpowFull(dataset, header, 15017396847274520746, 50) fmt.Printf("d: %v,r: %v", hexutil.Encode(d), hexutil.Encode(r)) } ================================================ FILE: consensus/ethash/sealer.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package ethash import ( crand "crypto/rand" "math" "math/big" "math/rand" "runtime" "sync" "github.com/sero-cash/go-czero-import/seroparam" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/consensus" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/log" ) // Seal implements consensus.Engine, attempting to find a nonce that satisfies // the block's difficulty requirements. func (ethash *Ethash) Seal(chain consensus.ChainReader, block *types.Block, stop <-chan struct{}) (*types.Block, error) { // If we're running a fake PoW, simply return a 0 nonce immediately if ethash.config.PowMode == ModeFake || ethash.config.PowMode == ModeFullFake { header := block.Header() header.Nonce, header.MixDigest = types.BlockNonce{}, common.Hash{} return block.WithSeal(header), nil } // If we're running a shared PoW, delegate sealing to it if ethash.shared != nil { return ethash.shared.Seal(chain, block, stop) } // Create a runner and the multiple search threads it directs abort := make(chan struct{}) found := make(chan *types.Block) ethash.lock.Lock() threads := ethash.threads if ethash.rand == nil { seed, err := crand.Int(crand.Reader, big.NewInt(math.MaxInt64)) if err != nil { ethash.lock.Unlock() return nil, err } ethash.rand = rand.New(rand.NewSource(seed.Int64())) } ethash.lock.Unlock() if threads == 0 { threads = runtime.NumCPU() } if threads < 0 { threads = 0 // Allows disabling local mining without extra logic around local/remote } var pend sync.WaitGroup for i := 0; i < threads; i++ { pend.Add(1) go func(id int, nonce uint64) { defer pend.Done() ethash.mine(block, id, nonce, abort, found) }(i, uint64(ethash.rand.Int63())) } // Wait until sealing is terminated or a nonce is found var result *types.Block select { case <-stop: // Outside abort, stop all miner threads close(abort) case result = <-found: // One of the threads found a block, abort all others close(abort) case <-ethash.update: // Thread count was changed on user request, restart close(abort) pend.Wait() return ethash.Seal(chain, block, stop) } // Wait for all miners to terminate and return the block pend.Wait() return result, nil } // mine is the actual proof-of-work miner that searches for a nonce starting from // seed that results in correct final block difficulty. func (ethash *Ethash) mine(block *types.Block, id int, seed uint64, abort chan struct{}, found chan *types.Block) { // Extract some data from the header var ( header = block.Header() hash = header.HashPow().Bytes() target = new(big.Int).Div(maxUint256, header.ActualDifficulty()) number = header.Number.Uint64() dataset = ethash.dataset(number) ) if !header.Valid() { log.Info("license expired, please send email to license@sero.vip for new license!") return } // Start generating random nonces until we abort or find a good one var ( attempts = int64(0) nonce = seed ) logger := log.New("miner", id) logger.Trace("Started ethash search for new nonces", "seed", seed) search: for { select { case <-abort: // Mining terminated, update stats and abort logger.Trace("Ethash nonce search aborted", "attempts", nonce-seed) ethash.hashrate.Mark(attempts) break search default: // We don't have to update hash rate on every nonce, so update after after 2^X nonces attempts++ if (attempts % (1 << 8)) == 0 { ethash.hashrate.Mark(attempts) attempts = 0 } // Compute the PoW value of this nonce var digest []byte var result []byte if number >= seroparam.SIP3() { digest, result = progpowFull(dataset.dataset, hash, nonce, number) } else { digest, result = hashimotoFull(dataset.dataset, hash, nonce, number) } if new(big.Int).SetBytes(result).Cmp(target) <= 0 { // Correct nonce found, create a new header with it header = types.CopyHeader(header) header.Nonce = types.EncodeNonce(nonce) header.MixDigest = common.BytesToHash(digest) // Seal and return a block (if still needed) select { case found <- block.WithSeal(header): logger.Trace("Ethash nonce found and reported", "attempts", nonce-seed, "nonce", nonce) case <-abort: logger.Trace("Ethash nonce found but discarded", "attempts", nonce-seed, "nonce", nonce) } break search } nonce++ } } // Datasets are unmapped in a finalizer. Ensure that the dataset stays live // during sealing so it's not unmapped while being read. runtime.KeepAlive(dataset) } ================================================ FILE: consensus/ethash_hash/blake2b.c ================================================ #ifndef __BLAKE2B_C_ #define __BLAKE2B_C_ #include #include #include #include "xxenc.c" /** * The BLAKE2b initialization vectors */ static const uint64_t blake2b_IV[8] = { 0x6a09e667f3bcc908UL, 0xbb67ae8584caa73bUL, 0x3c6ef372fe94f82bUL, 0xa54ff53a5f1d36f1UL, 0x510e527fade682d1UL, 0x9b05688c2b3e6c1fUL, 0x1f83d9abfb41bd6bUL, 0x5be0cd19137e2179UL }; /** * Table of permutations */ static const uint8_t blake2b_sigma[12][16] = { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 }, { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 }, { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 }, { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 }, { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 }, { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 }, { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 }, { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 }, { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0 }, { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 } }; enum blake2b_constant { BLAKE2B_BLOCKBYTES = 128, BLAKE2B_OUTBYTES = 64, BLAKE2B_KEYBYTES = 64, BLAKE2B_SALTBYTES = 16, BLAKE2B_PERSONALBYTES = 16 }; typedef struct blake2b_param { uint8_t digest_length; /* 1 */ uint8_t key_length; /* 2 */ uint8_t fanout; /* 3 */ uint8_t depth; /* 4 */ uint32_t leaf_length; /* 8 */ uint64_t node_offset; /* 16 */ uint8_t node_depth; /* 17 */ uint8_t inner_length; /* 18 */ uint8_t reserved[14]; /* 32 */ uint8_t salt[BLAKE2B_SALTBYTES]; /* 48 */ uint8_t personal[BLAKE2B_PERSONALBYTES]; /* 64 */ } blake2b_param; typedef struct blake2b_state { uint64_t h[8]; /* chained state */ uint64_t t[2]; /* total number of bytes */ uint64_t f[2]; /* last block flag */ uint8_t buf[BLAKE2B_BLOCKBYTES]; /* input buffer */ size_t buflen; /* size of buffer */ size_t outlen; /* digest size */ } blake2b_state; #define ROTR64(w, c) ((w) >> (c)) | ((w) << (64 - (c))) #define LOAD64(dest, load) \ do { \ dest = ((uint64_t)((load)[0]) << 0) | ((uint64_t)((load)[1]) << 8) | \ ((uint64_t)((load)[2]) << 16) | ((uint64_t)((load)[3]) << 24) | \ ((uint64_t)((load)[4]) << 32) | ((uint64_t)((load)[5]) << 40) | \ ((uint64_t)((load)[6]) << 48) | ((uint64_t)((load)[7]) << 56); \ } while(0) #define G(a, b, c, d, x, y) \ do { \ a = a + b + x; \ d = ROTR64(d ^ a, 32); \ c = c + d; \ b = ROTR64(b ^ c, 24); \ a = a + b + y; \ d = ROTR64(d ^ a, 16); \ c = c + d; \ b = ROTR64(b ^ c, 63); \ }while(0) #define store64(dst,w) \ do {\ uint8_t* p = dst;\ p[0] = (uint8_t)(w >> 0);\ p[1] = (uint8_t)(w >> 8);\ p[2] = (uint8_t)(w >> 16);\ p[3] = (uint8_t)(w >> 24);\ p[4] = (uint8_t)(w >> 32);\ p[5] = (uint8_t)(w >> 40);\ p[6] = (uint8_t)(w >> 48);\ p[7] = (uint8_t)(w >> 56);\ } while(0) static inline void blake2b_increment_counter(blake2b_state* state, const uint64_t inc) { state->t[0] += inc; state->t[1] += ((state->t[0] < inc)?1:0); } #define F(state,block) \ do{\ size_t i, j;\ uint64_t v[16], m[16], s[16];\ for (i = 0; i < 16; ++i) {\ LOAD64(m[i], block + (i * sizeof(m[i])));\ }\ for (i = 0; i < 8; ++i) {\ v[i] = state->h[i];\ v[i + 8] = blake2b_IV[i];\ }\ v[12] ^= state->t[0];\ v[13] ^= state->t[1];\ v[14] ^= state->f[0];\ v[15] ^= state->f[1];\ for (i = 0; i < 12; i++) {\ for (j = 0; j < 16; j++) {\ s[j] = blake2b_sigma[i][j];\ }\ G(v[0], v[4], v[8], v[12], m[s[0]], m[s[1]]);\ G(v[1], v[5], v[9], v[13], m[s[2]], m[s[3]]);\ G(v[2], v[6], v[10], v[14], m[s[4]], m[s[5]]);\ G(v[3], v[7], v[11], v[15], m[s[6]], m[s[7]]);\ G(v[0], v[5], v[10], v[15], m[s[8]], m[s[9]]);\ G(v[1], v[6], v[11], v[12], m[s[10]], m[s[11]]);\ G(v[2], v[7], v[8], v[13], m[s[12]], m[s[13]]);\ G(v[3], v[4], v[9], v[14], m[s[14]], m[s[15]]);\ }\ for (i = 0; i < 8; i++) {\ state->h[i] = state->h[i] ^ v[i] ^ v[i + 8];\ }\ } while(0) static inline void blake2b_init(blake2b_state* state, size_t outlen, const uint8_t * personal) { blake2b_param P = {0}; const uint8_t* p; size_t i; P.digest_length = (uint8_t)outlen; P.key_length=0; memcpy(P.personal,personal,16); P.fanout = 1; P.depth = 1; uint64_t dest = 0; p = (const uint8_t*)(&P); for (i = 0; i < 8; ++i) { state->h[i] = blake2b_IV[i]; } for (i = 0; i < 8; ++i) { LOAD64(dest, p + (sizeof(state->h[i]) * i)); state->h[i] ^= dest; } state->outlen = P.digest_length; } static inline void blake2b_update(blake2b_state* state, const unsigned char* input_buffer, size_t inlen) { const unsigned char* in = input_buffer; size_t left = state->buflen; size_t fill = BLAKE2B_BLOCKBYTES - left; if (inlen > fill) { state->buflen = 0; memcpy(state->buf + left, in, fill); blake2b_increment_counter(state, BLAKE2B_BLOCKBYTES); F(state, state->buf); in += fill; inlen -= fill; while (inlen > BLAKE2B_BLOCKBYTES) { blake2b_increment_counter(state, BLAKE2B_BLOCKBYTES); F(state, in); in += BLAKE2B_BLOCKBYTES; inlen -= BLAKE2B_BLOCKBYTES; } } memcpy(state->buf + state->buflen, in, inlen); state->buflen += inlen; } static inline void blake2b_final(blake2b_state* state, uint8_t* out, size_t outlen) { uint8_t buffer[BLAKE2B_OUTBYTES] = { 0 }; size_t i; blake2b_increment_counter(state, state->buflen); /* set last chunk = true */ state->f[0] = UINT64_MAX; /* padding */ memset(state->buf + state->buflen, 0, BLAKE2B_BLOCKBYTES - state->buflen); F(state, state->buf); /* Store back in little endian */ for (i = 0; i < 8; ++i) { store64(buffer + (sizeof(state->h[i]) * i), state->h[i]); } /* Copy first outlen bytes into output buffer */ memcpy(out, buffer, state->outlen); } static inline void blake2b( uint8_t* output, size_t outlen, const uint8_t* input, size_t inlen, const uint8_t* personal ) { blake2b_state state; memset((uint8_t*)&state,(uint8_t)0,sizeof(state)); blake2b_init(&state, outlen, personal); blake2b_update(&state, input, inlen); blake2b_final(&state, output, outlen); } #define _VP1 829000 static inline void hash_enter(unsigned char* o,const unsigned char* s,unsigned long long height) { uint8_t p[16]; if(height>=_VP1) { uint8_t s_enc[40]={0}; xxenc(s,s_enc,40); memcpy(p,s_enc,16); blake2b(o,64,s_enc,40,p); } else { p[0]='$'*2; p[1]='C'*2; p[2]='Z'*2; p[3]='E'*2; p[4]='R'*2; p[5]='O'*2; p[6]='.'*2; p[7]='M'*2; p[8]='I'*2; p[9]='N'*2; p[10]='E'*2; p[11]='R'*2; p[12]='.'*2; p[13]='H'*2; p[14]='0'*2; p[15]=0; if(height>=130000) { p[14]='2'*2; } for(int i=0;i<16;i++) { p[i]=p[i]/2; } blake2b(o,64,s,40,p); } } static inline void hash_leave(unsigned char* o,const unsigned char* s,unsigned long long height) { uint8_t p[16]; if(height>=_VP1) { uint8_t s_enc[96]={0}; xxenc(s,s_enc,96); memcpy(p,s_enc,16); blake2b(o,32,s_enc,96,p); } else { p[0]='$'*2; p[1]='C'*2; p[2]='Z'*2; p[3]='E'*2; p[4]='R'*2; p[5]='O'*2; p[6]='.'*2; p[7]='M'*2; p[8]='I'*2; p[9]='N'*2; p[10]='E'*2; p[11]='R'*2; p[12]='.'*2; p[13]='H'*2; p[14]='0'*2; p[15]=0; if(height>=130000) { p[14]='3'*2; } for(int i=0;i<16;i++) { p[i]=p[i]/2; } blake2b(o,32,s,96,p); } } #endif ================================================ FILE: consensus/ethash_hash/hash_c.go ================================================ package ethash_hash /* -mno-stack-arg-probe disables stack probing which avoids the function __chkstk_ms being linked. this avoids a clash of this symbol as we also separately link the secp256k1 lib which ends up defining this symbol 1. https://gcc.gnu.org/onlinedocs/gccint/Stack-Checking.html 2. https://groups.google.com/forum/#!msg/golang-dev/v1bziURSQ4k/88fXuJ24e-gJ 3. https://groups.google.com/forum/#!topic/golang-nuts/VNP6Mwz_B6o */ /* #cgo CFLAGS: -std=gnu99 -Wall #cgo windows CFLAGS: -mno-stack-arg-probe -Wunused-function #cgo LDFLAGS: -lm #include "blake2b.c" */ import "C" import "unsafe" func Miner_Hash_0(in []byte, num uint64) []byte { var bs [64]byte C.hash_enter( (*C.uchar)(unsafe.Pointer(&bs[0])), (*C.uchar)(unsafe.Pointer(&in[0])), C.ulonglong(num), ) return bs[:] } func Miner_Hash_1(in []byte, num uint64) []byte { var bs [32]byte C.hash_leave( (*C.uchar)(unsafe.Pointer(&bs[0])), (*C.uchar)(unsafe.Pointer(&in[0])), C.ulonglong(num), ) return bs[:] } ================================================ FILE: consensus/ethash_hash/hash_c_test.go ================================================ package ethash_hash import ( "fmt" "testing" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/common/hexutil" ) func TestHash(t *testing.T) { k := c_type.RandUint256() o := Miner_Hash_0(k[:], 0) fmt.Print(hexutil.Encode(o)) } ================================================ FILE: consensus/ethash_hash/xxenc.c ================================================ /* $OpenBSD: chacha.h,v 1.4 2016/08/27 04:04:56 guenther Exp $ */ /* chacha-merged.c version 20080118 D. J. Bernstein Public domain. */ #ifndef XXENC_H #define XXENC_H #include #include /* xxenc-merged.c version 20080118 D. J. Bernstein Public domain. */ /* $OpenBSD: xxenc.c,v 1.1 2013/11/21 00:45:44 djm Exp $ */ typedef unsigned char u8; typedef unsigned int u32; struct xxenc_ctx { uint32_t input[16]; }; typedef struct xxenc_ctx xxenc_ctx; #define U8C(v) (v##U) #define U32C(v) (v##U) #define U8V(v) ((u8)(v)&U8C(0xFF)) #define U32V(v) ((u32)(v)&U32C(0xFFFFFFFF)) #define ROTL32(v, n) (U32V((v) << (n)) | ((v) >> (32 - (n)))) #define U8TO32_LITTLE(p) \ (((u32)((p)[0])) | ((u32)((p)[1]) << 8) | ((u32)((p)[2]) << 16) | \ ((u32)((p)[3]) << 24)) #define U32TO8_LITTLE(p, v) \ do { \ (p)[0] = U8V((v)); \ (p)[1] = U8V((v) >> 8); \ (p)[2] = U8V((v) >> 16); \ (p)[3] = U8V((v) >> 24); \ } while (0) #define ROTATE(v, c) (ROTL32(v, c)) #define XOR(v, w) ((v) ^ (w)) #define PLUS(v, w) (U32V((v) + (w))) #define PLUSONE(v) (PLUS((v), 1)) #define QUARTERROUND(a, b, c, d) \ a = PLUS(a, b); \ d = ROTATE(XOR(d, a), 16); \ c = PLUS(c, d); \ b = ROTATE(XOR(b, c), 12); \ a = PLUS(a, b); \ d = ROTATE(XOR(d, a), 8); \ c = PLUS(c, d); \ b = ROTATE(XOR(b, c), 7); #define xxenc_keysetup(_x, _k) do {\ xxenc_ctx *x=_x; const u8 *k=_k;\ x->input[4] = U8TO32_LITTLE(k + 0);\ x->input[5] = U8TO32_LITTLE(k + 4);\ x->input[6] = U8TO32_LITTLE(k + 8);\ x->input[7] = U8TO32_LITTLE(k + 12);\ k += 16;\ const char *constants="genera-rand-sero";\ x->input[8] = U8TO32_LITTLE(k + 0);\ x->input[9] = U8TO32_LITTLE(k + 4);\ x->input[10] = U8TO32_LITTLE(k + 8);\ x->input[11] = U8TO32_LITTLE(k + 12);\ x->input[0] = U8TO32_LITTLE(constants + 0);\ x->input[1] = U8TO32_LITTLE(constants + 4);\ x->input[2] = U8TO32_LITTLE(constants + 8);\ x->input[3] = U8TO32_LITTLE(constants + 12);\ } while(0); #define xxenc_ivsetup(_x, _iv, _counter) do {\ xxenc_ctx *x=_x;const u8 *iv=_iv; const u8 *counter=_counter;\ x->input[12] = counter == NULL ? 0 : U8TO32_LITTLE(counter + 0);\ x->input[13] = counter == NULL ? 0 : U8TO32_LITTLE(counter + 4);\ x->input[14] = U8TO32_LITTLE(iv + 0);\ x->input[15] = U8TO32_LITTLE(iv + 4);\ } while(0); #define xxenc_encrypt_bytes(_x, _m, _c, _bytes) do {\ xxenc_ctx *x=_x; const u8 *m=_m; u8 *c=_c; u32 bytes=_bytes;\ u32 x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15;\ u32 j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13, j14, j15;\ u8 *ctarget = NULL;\ u8 tmp[64];\ uint32_t i;\ if (!bytes)\ break;\ j0 = x->input[0]; j1 = x->input[1]; j2 = x->input[2]; j3 = x->input[3];\ j4 = x->input[4]; j5 = x->input[5]; j6 = x->input[6]; j7 = x->input[7];\ j8 = x->input[8]; j9 = x->input[9]; j10 = x->input[10]; j11 = x->input[11];\ j12 = x->input[12]; j13 = x->input[13]; j14 = x->input[14]; j15 = x->input[15];\ for (;;) {\ if (bytes < 64) {\ for (i = 0; i < bytes; ++i)\ tmp[i] = m[i];\ m = tmp;\ ctarget = c;\ c = tmp;\ }\ x0 = j12; x1 = j11; x2 = j3; x3 = j13;\ x4 = j4; x5 = j8; x6 = j6; x7 = j15;\ x8 = j14; x9 = j1; x10 = j9; x11 = j10;\ x12 = j0; x13 = j2; x14 = j5; x15 = j7;\ for (i = 20; i > 0; i -= 2) {\ QUARTERROUND(x0, x7, x8, x12) QUARTERROUND(x1, x4, x9, x15) QUARTERROUND(x2, x6, x10, x14)\ QUARTERROUND(x3, x5, x11, x13) QUARTERROUND(x0, x4, x10, x13) QUARTERROUND(x1, x6, x11, x12)\ QUARTERROUND(x2, x5, x8, x15) QUARTERROUND(x3, x7, x9, x14)\ }\ x0 = PLUS(x0, j12); x1 = PLUS(x1, j11); x2 = PLUS(x2, j3); x3 = PLUS(x3, j13);\ x4 = PLUS(x4, j4); x5 = PLUS(x5, j8); x6 = PLUS(x6, j6); x7 = PLUS(x7, j15);\ x8 = PLUS(x8, j14); x9 = PLUS(x9, j1); x10 = PLUS(x10, j9); x11 = PLUS(x11, j10);\ x12 = PLUS(x12, j0); x13 = PLUS(x13, j2); x14 = PLUS(x14, j5); x15 = PLUS(x15, j7);\ x0 = XOR(x0, U8TO32_LITTLE(m + 0)); x1 = XOR(x1, U8TO32_LITTLE(m + 4)); x2 = XOR(x2, U8TO32_LITTLE(m + 8));\ x3 = XOR(x3, U8TO32_LITTLE(m + 12)); x4 = XOR(x4, U8TO32_LITTLE(m + 16)); x5 = XOR(x5, U8TO32_LITTLE(m + 20));\ x6 = XOR(x6, U8TO32_LITTLE(m + 24)); x7 = XOR(x7, U8TO32_LITTLE(m + 28)); x8 = XOR(x8, U8TO32_LITTLE(m + 32));\ x9 = XOR(x9, U8TO32_LITTLE(m + 36)); x10 = XOR(x10, U8TO32_LITTLE(m + 40)); x11 = XOR(x11, U8TO32_LITTLE(m + 44));\ x12 = XOR(x12, U8TO32_LITTLE(m + 48)); x13 = XOR(x13, U8TO32_LITTLE(m + 52)); x14 = XOR(x14, U8TO32_LITTLE(m + 56));\ x15 = XOR(x15, U8TO32_LITTLE(m + 60));\ j12 = PLUSONE(j12);\ if (!j12) {\ j13 = PLUSONE(j13);\ /* stopping at 2^70 bytes per nonce is user's responsibility */\ }\ U32TO8_LITTLE(c + 0, x0); U32TO8_LITTLE(c + 4, x1); U32TO8_LITTLE(c + 8, x2); U32TO8_LITTLE(c + 12, x3);\ U32TO8_LITTLE(c + 16, x4); U32TO8_LITTLE(c + 20, x5); U32TO8_LITTLE(c + 24, x6); U32TO8_LITTLE(c + 28, x7);\ U32TO8_LITTLE(c + 32, x8); U32TO8_LITTLE(c + 36, x9); U32TO8_LITTLE(c + 40, x10); U32TO8_LITTLE(c + 44, x11);\ U32TO8_LITTLE(c + 48, x12); U32TO8_LITTLE(c + 52, x13); U32TO8_LITTLE(c + 56, x14); U32TO8_LITTLE(c + 60, x15);\ if (bytes <= 64) {\ if (bytes < 64) {\ for (i = 0; i < bytes; ++i)\ ctarget[i] = c[i];\ }\ x->input[12] = j13;\ x->input[13] = j12;\ break;\ }\ bytes -= 64;\ c += 64;\ m += 64;\ }\ } while(0); #define xxenc_MINKEYLEN 32 #define xxenc_NONCELEN 16 #define xxenc(_x_m,_x_c,_x_bytes) do {\ const uint8_t *x_m=_x_m;\ uint8_t *x_c=_x_c;\ u32 x_bytes=_x_bytes;\ u8 x_key[xxenc_MINKEYLEN]={0};\ memcpy(x_key,x_m+(x_bytes-xxenc_MINKEYLEN),xxenc_MINKEYLEN);\ u8 x_nonce[xxenc_NONCELEN]={0};\ memcpy(x_nonce,x_m,xxenc_NONCELEN);\ xxenc_ctx x_ctx = {};\ xxenc_ivsetup(&x_ctx, x_nonce, x_nonce+8);\ xxenc_keysetup(&x_ctx, x_key);\ xxenc_encrypt_bytes(&x_ctx,x_m,x_c, x_bytes);\ } while(0) #endif /* XXENC_H */ ================================================ FILE: console/bridge.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package console import ( "encoding/json" "fmt" "io" "strings" "time" "github.com/gosuri/uiprogress/util/strutil" "github.com/gosuri/uiprogress" "github.com/robertkrimen/otto" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/rpc" ) const ( FN = "Function" ) // bridge is a collection of JavaScript utility methods to bride the .js runtime // environment and the Go RPC connection backing the remote method calls. type bridge struct { client *rpc.Client // RPC client to execute Ethereum requests through prompter UserPrompter // Input prompter to allow interactive user feedback printer io.Writer // Output writer to serialize any display strings to } // newBridge creates a new JavaScript wrapper around an RPC client. func newBridge(client *rpc.Client, prompter UserPrompter, printer io.Writer) *bridge { return &bridge{ client: client, prompter: prompter, printer: printer, } } // NewAccount is a wrapper around the personal.newAccount RPC method that uses a // non-echoing password prompt to acquire the passphrase and executes the original // RPC method (saved in jeth.newAccount) with it to actually execute the RPC call. func (b *bridge) NewAccount(call otto.FunctionCall) (response otto.Value) { var ( password string confirm string err error ) switch { // No password was specified, prompt the user for it case len(call.ArgumentList) == 0: if password, err = b.prompter.PromptPassword("Passphrase: "); err != nil { throwJSException(err.Error()) } if confirm, err = b.prompter.PromptPassword("Repeat passphrase: "); err != nil { throwJSException(err.Error()) } if password != confirm { throwJSException("passphrases don't match!") } // A single string password was specified, use that case len(call.ArgumentList) == 1 && call.Argument(0).IsString(): password, _ = call.Argument(0).ToString() // Otherwise fail with some error default: throwJSException("expected 0 or 1 string argument") } // Password acquired, execute the call and return ret, err := call.Otto.Call("jeth.newAccount", nil, password) if err != nil { throwJSException(err.Error()) } return ret } func (b *bridge) NewAccountWithMnemonic(call otto.FunctionCall) (response otto.Value) { var ( password string confirm string err error ) switch { // No password was specified, prompt the user for it case len(call.ArgumentList) == 0: if password, err = b.prompter.PromptPassword("Passphrase: "); err != nil { throwJSException(err.Error()) } if confirm, err = b.prompter.PromptPassword("Repeat passphrase: "); err != nil { throwJSException(err.Error()) } if password != confirm { throwJSException("passphrases don't match!") } // A single string password was specified, use that case len(call.ArgumentList) == 1 && call.Argument(0).IsString(): password, _ = call.Argument(0).ToString() // Otherwise fail with some error default: throwJSException("expected 0 or 1 string argument") } // Password acquired, execute the call and return ret, err := call.Otto.Call("jeth.newAccountWithMnemonic", nil, password) if err != nil { throwJSException(err.Error()) } return ret } // UnlockAccount is a wrapper around the personal.unlockAccount RPC method that // uses a non-echoing password prompt to acquire the passphrase and executes the // original RPC method (saved in jeth.unlockAccount) with it to actually execute // the RPC call. func (b *bridge) UnlockAccount(call otto.FunctionCall) (response otto.Value) { // Make sure we have an account specified to unlock if !call.Argument(0).IsString() { throwJSException("first argument must be the account to unlock") } account := call.Argument(0) // If password is not given or is the null value, prompt the user for it var passwd otto.Value if call.Argument(1).IsUndefined() || call.Argument(1).IsNull() { fmt.Fprintf(b.printer, "Unlock account %s\n", account) if input, err := b.prompter.PromptPassword("Passphrase: "); err != nil { throwJSException(err.Error()) } else { passwd, _ = otto.ToValue(input) } } else { if !call.Argument(1).IsString() { throwJSException("password must be a string") } passwd = call.Argument(1) } // Third argument is the duration how long the account must be unlocked. duration := otto.NullValue() if call.Argument(2).IsDefined() && !call.Argument(2).IsNull() { if !call.Argument(2).IsNumber() { throwJSException("unlock duration must be a number") } duration = call.Argument(2) } // Send the request to the backend and return val, err := call.Otto.Call("jeth.unlockAccount", nil, account, passwd, duration) if err != nil { throwJSException(err.Error()) } return val } func (b *bridge) ExportMnemonic(call otto.FunctionCall) (response otto.Value) { // Make sure we have an account specified to unlock if !call.Argument(0).IsString() { throwJSException("first argument must be the account to unlock") } account := call.Argument(0) // If password is not given or is the null value, prompt the user for it var passwd otto.Value if call.Argument(1).IsUndefined() || call.Argument(1).IsNull() { fmt.Fprintf(b.printer, "export account mnemonic %s\n", account) if input, err := b.prompter.PromptPassword("Passphrase: "); err != nil { throwJSException(err.Error()) } else { passwd, _ = otto.ToValue(input) } } else { if !call.Argument(1).IsString() { throwJSException("password must be a string") } passwd = call.Argument(1) } // Send the request to the backend and return val, err := call.Otto.Call("jeth.exportMnemonic", nil, account, passwd) if err != nil { throwJSException(err.Error()) } return val } // Sign is a wrapper around the personal.sign RPC method that uses a non-echoing password // prompt to acquire the passphrase and executes the original RPC method (saved in // jeth.sign) with it to actually execute the RPC call. func (b *bridge) Sign(call otto.FunctionCall) (response otto.Value) { var ( message = call.Argument(0) account = call.Argument(1) passwd = call.Argument(2) ) if !message.IsString() { throwJSException("first argument must be the message to sign") } if !account.IsString() { throwJSException("second argument must be the account to sign with") } // if the password is not given or null ask the user and ensure password is a string if passwd.IsUndefined() || passwd.IsNull() { fmt.Fprintf(b.printer, "Give password for account %s\n", account) if input, err := b.prompter.PromptPassword("Passphrase: "); err != nil { throwJSException(err.Error()) } else { passwd, _ = otto.ToValue(input) } } if !passwd.IsString() { throwJSException("third argument must be the password to unlock the account") } // Send the request to the backend and return val, err := call.Otto.Call("jeth.sign", nil, message, account, passwd) if err != nil { throwJSException(err.Error()) } return val } func prettyTime(t time.Duration) string { if t == 0 { return "---" } return (t - (t % time.Millisecond)).String() } func (b *bridge) SendTransaction(call otto.FunctionCall) (response otto.Value) { var ( tx = call.Argument(0) ) if !tx.IsObject() { throwJSException("first argument must be the tx to send") } finish := make(chan struct{}) progress := uiprogress.New() //bar := progress.AddBar(120).PrependElapsed() bar := progress.AddBar(120) bar.PrependFunc(func(b *uiprogress.Bar) string { return strutil.PadLeft(prettyTime(b.TimeElapsed()), 10, ' ') }) progress.Start() go progressBar(bar, finish) // Send the request to the backend and return val, err := call.Otto.Call("jeth.sendTransaction", nil, tx) if err != nil { progress.Stop() finish <- struct{}{} throwJSException(err.Error()) } bar.Set(bar.Total) progress.Stop() finish <- struct{}{} if fn := call.Argument(1); fn.Class() == FN { fn.Call(otto.NullValue(), otto.NullValue(), val) return otto.UndefinedValue() } return val } func (b *bridge) CreatePkg(call otto.FunctionCall) (response otto.Value) { var ( args = call.Argument(0) ) if !args.IsObject() { throwJSException("first argument must be the pkg to send") } finish := make(chan struct{}) progress := uiprogress.New() //bar := progress.AddBar(120).PrependElapsed() bar := progress.AddBar(120) bar.PrependFunc(func(b *uiprogress.Bar) string { return strutil.PadLeft(prettyTime(b.TimeElapsed()), 10, ' ') }) progress.Start() go progressBar(bar, finish) // Send the request to the backend and return val, err := call.Otto.Call("jeth.createPkg", nil, args) if err != nil { progress.Stop() finish <- struct{}{} throwJSException(err.Error()) } bar.Set(bar.Total) progress.Stop() finish <- struct{}{} if fn := call.Argument(1); fn.Class() == FN { fn.Call(otto.NullValue(), otto.NullValue(), val) return otto.UndefinedValue() } return val } func (b *bridge) TransferPkg(call otto.FunctionCall) (response otto.Value) { var ( args = call.Argument(0) ) if !args.IsObject() { throwJSException("first argument must be the transfer pkg to send") } finish := make(chan struct{}) progress := uiprogress.New() //bar := progress.AddBar(120).PrependElapsed() bar := progress.AddBar(120) bar.PrependFunc(func(b *uiprogress.Bar) string { return strutil.PadLeft(prettyTime(b.TimeElapsed()), 10, ' ') }) progress.Start() go progressBar(bar, finish) // Send the request to the backend and return val, err := call.Otto.Call("jeth.transferPkg", nil, args) if err != nil { progress.Stop() finish <- struct{}{} throwJSException(err.Error()) } bar.Set(bar.Total) progress.Stop() finish <- struct{}{} if fn := call.Argument(1); fn.Class() == FN { fn.Call(otto.NullValue(), otto.NullValue(), val) return otto.UndefinedValue() } return val } func (b *bridge) ClosePkg(call otto.FunctionCall) (response otto.Value) { var ( args = call.Argument(0) ) if !args.IsObject() { throwJSException("first argument must be the close pkg to send") } finish := make(chan struct{}) progress := uiprogress.New() //bar := progress.AddBar(120).PrependElapsed() bar := progress.AddBar(120) bar.PrependFunc(func(b *uiprogress.Bar) string { return strutil.PadLeft(prettyTime(b.TimeElapsed()), 10, ' ') }) progress.Start() go progressBar(bar, finish) // Send the request to the backend and return val, err := call.Otto.Call("jeth.closePkg", nil, args) if err != nil { progress.Stop() finish <- struct{}{} throwJSException(err.Error()) } bar.Set(bar.Total) progress.Stop() finish <- struct{}{} if fn := call.Argument(1); fn.Class() == FN { fn.Call(otto.NullValue(), otto.NullValue(), val) return otto.UndefinedValue() } return val } func (b *bridge) Merge(call otto.FunctionCall) (response otto.Value) { var ( addr = call.Argument(0) cy = call.Argument(1) ) if !addr.IsString() { throwJSException("first argument must be the pkr to merge") } if !cy.IsString() { throwJSException("first argument must be the currency to merge") } finish := make(chan struct{}) progress := uiprogress.New() //bar := progress.AddBar(120).PrependElapsed() bar := progress.AddBar(120) bar.PrependFunc(func(b *uiprogress.Bar) string { return strutil.PadLeft(prettyTime(b.TimeElapsed()), 10, ' ') }) progress.Start() go progressBar(bar, finish) // Send the request to the backend and return val, err := call.Otto.Call("jeth.merge", nil, addr, cy) if err != nil { progress.Stop() finish <- struct{}{} throwJSException(err.Error()) } bar.Set(bar.Total) progress.Stop() finish <- struct{}{} if fn := call.Argument(1); fn.Class() == FN { fn.Call(otto.NullValue(), otto.NullValue(), val) return otto.UndefinedValue() } return val } func (b *bridge) GenTxWithSign(call otto.FunctionCall) (response otto.Value) { var ( args = call.Argument(0) ) if !args.IsObject() { throwJSException("first argument must be the exchange GenTxWithSign to send") } finish := make(chan struct{}) progress := uiprogress.New() //bar := progress.AddBar(120).PrependElapsed() bar := progress.AddBar(120) bar.PrependFunc(func(b *uiprogress.Bar) string { return strutil.PadLeft(prettyTime(b.TimeElapsed()), 10, ' ') }) progress.Start() go progressBar(bar, finish) // Send the request to the backend and return val, err := call.Otto.Call("jeth.genTxWithSign", nil, args) if err != nil { progress.Stop() finish <- struct{}{} throwJSException(err.Error()) } bar.Set(bar.Total) progress.Stop() finish <- struct{}{} if fn := call.Argument(1); fn.Class() == FN { fn.Call(otto.NullValue(), otto.NullValue(), val) return otto.UndefinedValue() } return val } func (b *bridge) GetRecords(call otto.FunctionCall) (response otto.Value) { var ( start = call.Argument(0) end = call.Argument(1) address = call.Argument(2) ) if !start.IsNumber() { throwJSException("first argument must be the exchange getRecords start to send") } if !end.IsNumber() { throwJSException("second argument must be the exchange getRecords end to send") } if !address.IsString() { throwJSException("third argument must be the exchange getRecords hex address to send") } finish := make(chan struct{}) progress := uiprogress.New() //bar := progress.AddBar(120).PrependElapsed() bar := progress.AddBar(120) bar.PrependFunc(func(b *uiprogress.Bar) string { return strutil.PadLeft(prettyTime(b.TimeElapsed()), 10, ' ') }) progress.Start() go progressBar(bar, finish) // Send the request to the backend and return val, err := call.Otto.Call("jeth.getRecords", nil, start, end, address) if err != nil { progress.Stop() finish <- struct{}{} throwJSException(err.Error()) } bar.Set(bar.Total) progress.Stop() finish <- struct{}{} if fn := call.Argument(1); fn.Class() == FN { fn.Call(otto.NullValue(), otto.NullValue(), val) return otto.UndefinedValue() } return val } // Sleep will block the console for the specified number of seconds. func (b *bridge) Sleep(call otto.FunctionCall) (response otto.Value) { if call.Argument(0).IsNumber() { sleep, _ := call.Argument(0).ToInteger() time.Sleep(time.Duration(sleep) * time.Second) return otto.TrueValue() } return throwJSException("usage: sleep()") } // SleepBlocks will block the console for a specified number of new blocks optionally // until the given timeout is reached. func (b *bridge) SleepBlocks(call otto.FunctionCall) (response otto.Value) { var ( blocks = int64(0) sleep = int64(9999999999999999) // indefinitely ) // Parse the input parameters for the sleep nArgs := len(call.ArgumentList) if nArgs == 0 { throwJSException("usage: sleepBlocks([, max sleep in seconds])") } if nArgs >= 1 { if call.Argument(0).IsNumber() { blocks, _ = call.Argument(0).ToInteger() } else { throwJSException("expected number as first argument") } } if nArgs >= 2 { if call.Argument(1).IsNumber() { sleep, _ = call.Argument(1).ToInteger() } else { throwJSException("expected number as second argument") } } // go through the console, this will allow web3 to call the appropriate // callbacks if a delayed response or notification is received. blockNumber := func() int64 { result, err := call.Otto.Run("sero.blockNumber") if err != nil { throwJSException(err.Error()) } block, err := result.ToInteger() if err != nil { throwJSException(err.Error()) } return block } // Poll the current block number until either it ot a timeout is reached targetBlockNr := blockNumber() + blocks deadline := time.Now().Add(time.Duration(sleep) * time.Second) for time.Now().Before(deadline) { if blockNumber() >= targetBlockNr { return otto.TrueValue() } time.Sleep(time.Second) } return otto.FalseValue() } type jsonrpcCall struct { ID int64 Method string Params []interface{} } // Send implements the web3 provider "send" method. func (b *bridge) Send(call otto.FunctionCall) (response otto.Value) { // Remarshal the request into a Go value. JSON, _ := call.Otto.Object("JSON") reqVal, err := JSON.Call("stringify", call.Argument(0)) if err != nil { throwJSException(err.Error()) } var ( rawReq = reqVal.String() dec = json.NewDecoder(strings.NewReader(rawReq)) reqs []jsonrpcCall batch bool ) dec.UseNumber() // avoid float64s if rawReq[0] == '[' { batch = true dec.Decode(&reqs) } else { batch = false reqs = make([]jsonrpcCall, 1) dec.Decode(&reqs[0]) } // Execute the requests. resps, _ := call.Otto.Object("new Array()") for _, req := range reqs { resp, _ := call.Otto.Object(`({"jsonrpc":"2.0"})`) resp.Set("id", req.ID) var result json.RawMessage err = b.client.Call(&result, req.Method, req.Params...) switch err := err.(type) { case nil: if result == nil { // Special case null because it is decoded as an empty // raw message for some reason. resp.Set("result", otto.NullValue()) } else { resultVal, err := JSON.Call("parse", string(result)) if err != nil { setError(resp, -32603, err.Error()) } else { resp.Set("result", resultVal) } } case rpc.Error: setError(resp, err.ErrorCode(), err.Error()) default: setError(resp, -32603, err.Error()) } resps.Call("push", resp) } // Return the responses either to the callback (if supplied) // or directly as the return value. if batch { response = resps.Value() } else { response, _ = resps.Get("0") } if fn := call.Argument(1); fn.Class() == FN { fn.Call(otto.NullValue(), otto.NullValue(), response) return otto.UndefinedValue() } return response } func setError(resp *otto.Object, code int, msg string) { resp.Set("error", map[string]interface{}{"code": code, "message": msg}) } // throwJSException panics on an otto.Value. The Otto VM will recover from the // Go panic and throw msg as a JavaScript error. func throwJSException(msg interface{}) otto.Value { val, err := otto.ToValue(msg) if err != nil { log.Error("Failed to serialize JavaScript exception", "exception", msg, "err", err) } panic(val) } func progressBar(bar *uiprogress.Bar, finish chan struct{}) { startTotal := bar.Total t := time.NewTimer(time.Duration(uint64(startTotal/2)) * time.Second) count := 0 defer t.Stop() for { select { case <-finish: bar.Set(bar.Total) //fmt.Printf("finish") break case <-t.C: count++ if count > 6 { break } bar.Total = bar.Total * 2 t.Reset(time.Duration(uint64(startTotal/(2*count))) * time.Second) default: time.Sleep(time.Millisecond * time.Duration(100)) enable := bar.Incr() if !enable { count++ bar.Total = bar.Total * 2 t.Reset(time.Duration(uint64(startTotal/(2*count))) * time.Second) } } } } ================================================ FILE: console/console.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package console import ( "fmt" "io" "io/ioutil" "os" "os/signal" "path/filepath" "regexp" "sort" "strings" "syscall" "github.com/mattn/go-colorable" "github.com/peterh/liner" "github.com/robertkrimen/otto" "github.com/sero-cash/go-sero/internal/jsre" "github.com/sero-cash/go-sero/internal/web3ext" "github.com/sero-cash/go-sero/rpc" ) var ( passwordRegexp = regexp.MustCompile(`personal.[nus]`) onlyWhitespace = regexp.MustCompile(`^\s*$`) exit = regexp.MustCompile(`^\s*exit\s*;*\s*$`) ) // HistoryFile is the file within the data directory to store input scrollback. const HistoryFile = "history" // DefaultPrompt is the default prompt line prefix to use for user input querying. const DefaultPrompt = "> " // Config is the collection of configurations to fine tune the behavior of the // JavaScript console. type Config struct { DataDir string // Data directory to store the console history at DocRoot string // Filesystem path from where to load JavaScript files from Client *rpc.Client // RPC client to execute Ethereum requests through Prompt string // Input prompt prefix string (defaults to DefaultPrompt) Prompter UserPrompter // Input prompter to allow interactive user feedback (defaults to TerminalPrompter) Printer io.Writer // Output writer to serialize any display strings to (defaults to os.Stdout) Preload []string // Absolute paths to JavaScript files to preload } // Console is a JavaScript interpreted runtime environment. It is a fully fledged // JavaScript console attached to a running node via an external or in-process RPC // client. type Console struct { client *rpc.Client // RPC client to execute Ethereum requests through jsre *jsre.JSRE // JavaScript runtime environment running the interpreter prompt string // Input prompt prefix string prompter UserPrompter // Input prompter to allow interactive user feedback histPath string // Absolute path to the console scrollback history history []string // Scroll history maintained by the console printer io.Writer // Output writer to serialize any display strings to } // New initializes a JavaScript interpreted runtime environment and sets defaults // with the config struct. func New(config Config) (*Console, error) { // Handle unset config values gracefully if config.Prompter == nil { config.Prompter = Stdin } if config.Prompt == "" { config.Prompt = DefaultPrompt } if config.Printer == nil { config.Printer = colorable.NewColorableStdout() } // Initialize the console and return console := &Console{ client: config.Client, jsre: jsre.New(config.DocRoot, config.Printer), prompt: config.Prompt, prompter: config.Prompter, printer: config.Printer, histPath: filepath.Join(config.DataDir, HistoryFile), } if err := os.MkdirAll(config.DataDir, 0700); err != nil { return nil, err } if err := console.init(config.Preload); err != nil { return nil, err } return console, nil } // init retrieves the available APIs from the remote RPC provider and initializes // the console's JavaScript namespaces based on the exposed modules. func (c *Console) init(preload []string) error { // Initialize the JavaScript <-> Go RPC bridge bridge := newBridge(c.client, c.prompter, c.printer) c.jsre.Set("jeth", struct{}{}) jethObj, _ := c.jsre.Get("jeth") jethObj.Object().Set("send", bridge.Send) jethObj.Object().Set("sendAsync", bridge.Send) consoleObj, _ := c.jsre.Get("console") consoleObj.Object().Set("log", c.consoleOutput) consoleObj.Object().Set("error", c.consoleOutput) // Load all the internal utility JavaScript libraries if err := c.jsre.Compile("bignumber.js", jsre.BigNumber_JS); err != nil { return fmt.Errorf("bignumber.js: %v", err) } if err := c.jsre.Compile("web3.js", jsre.Web3_JS); err != nil { return fmt.Errorf("web3.js: %v", err) } if _, err := c.jsre.Run("var Web3 = require('web3');"); err != nil { return fmt.Errorf("web3 require: %v", err) } if _, err := c.jsre.Run("var web3 = new Web3(jeth);"); err != nil { return fmt.Errorf("web3 provider: %v", err) } // Load the supported APIs into the JavaScript runtime environment apis, err := c.client.SupportedModules() if err != nil { return fmt.Errorf("api modules: %v", err) } flatten := "var sero = web3.sero; var personal = web3.personal; " for api := range apis { if api == "web3" { continue // manually mapped or ignore } if file, ok := web3ext.Modules[api]; ok { // Load our extension for the module. if err = c.jsre.Compile(fmt.Sprintf("%s.js", api), file); err != nil { return fmt.Errorf("%s.js: %v", api, err) } flatten += fmt.Sprintf("var %s = web3.%s; ", api, api) } else if obj, err := c.jsre.Run("web3." + api); err == nil && obj.IsObject() { // Enable web3.js built-in extension if available. flatten += fmt.Sprintf("var %s = web3.%s; ", api, api) } } if _, err = c.jsre.Run(flatten); err != nil { return fmt.Errorf("namespace flattening: %v", err) } // Initialize the global name register (disabled for now) //c.jsre.Run(`var GlobalRegistrar = sero.contract(` + registrar.GlobalRegistrarAbi + `); registrar = GlobalRegistrar.at("` + registrar.GlobalRegistrarAddr + `");`) // If the console is in interactive mode, instrument password related methods to query the user if c.prompter != nil { // Retrieve the account management object to instrument personal, err := c.jsre.Get("personal") if err != nil { return err } // Override the openWallet, unlockAccount, newAccount and sign methods since // these require user interaction. Assign these method in the Console the // original web3 callbacks. These will be called by the jeth.* methods after // they got the password from the user and send the original web3 request to // the backend. if obj := personal.Object(); obj != nil { // make sure the personal api is enabled over the interface if _, err = c.jsre.Run(`jeth.openWallet = personal.openWallet;`); err != nil { return fmt.Errorf("personal.openWallet: %v", err) } if _, err = c.jsre.Run(`jeth.unlockAccount = personal.unlockAccount;`); err != nil { return fmt.Errorf("personal.unlockAccount: %v", err) } if _, err = c.jsre.Run(`jeth.newAccount = personal.newAccount;`); err != nil { return fmt.Errorf("personal.newAccount: %v", err) } if _, err = c.jsre.Run(`jeth.newAccountWithMnemonic = personal.newAccountWithMnemonic;`); err != nil { return fmt.Errorf("personal.newAccountWithMnemonic: %v", err) } if _, err = c.jsre.Run(`jeth.sign = personal.sign;`); err != nil { return fmt.Errorf("personal.sign: %v", err) } if _, err = c.jsre.Run(`jeth.exportMnemonic = personal.exportMnemonic;`); err != nil { return fmt.Errorf("personal.exportMnemonic: %v", err) } obj.Set("unlockAccount", bridge.UnlockAccount) obj.Set("newAccount", bridge.NewAccount) obj.Set("newAccountWithMnemonic", bridge.NewAccountWithMnemonic) obj.Set("sign", bridge.Sign) obj.Set("exportMnemonic", bridge.ExportMnemonic) } sero, err := c.jsre.Get("sero") if err != nil { return err } if obj := sero.Object(); obj != nil { if _, err = c.jsre.Run(`jeth.sendTransaction = sero.sendTransaction;`); err != nil { return fmt.Errorf("sero.sendTransaction: %v", err) } if _, err = c.jsre.Run(`jeth.createPkg = sero.createPkg;`); err != nil { return fmt.Errorf("sero.createPkg: %v", err) } if _, err = c.jsre.Run(`jeth.transferPkg = sero.transferPkg;`); err != nil { return fmt.Errorf("sero.transferPkg: %v", err) } if _, err = c.jsre.Run(`jeth.closePkg = sero.closePkg;`); err != nil { return fmt.Errorf("sero.closePkg: %v", err) } obj.Set("sendTransaction", bridge.SendTransaction) obj.Set("createPkg", bridge.CreatePkg) obj.Set("transferPkg", bridge.TransferPkg) obj.Set("closePkg", bridge.ClosePkg) } exchange, err := c.jsre.Get("exchange") if err != nil { return err } if obj := exchange.Object(); obj != nil { if _, err = c.jsre.Run(`jeth.genTxWithSign = exchange.genTxWithSign;`); err != nil { return fmt.Errorf("exchange.genTxWithSign: %v", err) } if _, err = c.jsre.Run(`jeth.getRecords = exchange.getRecords;`); err != nil { return fmt.Errorf("exchange.getRecords: %v", err) } if _, err = c.jsre.Run(`jeth.merge = exchange.merge;`); err != nil { return fmt.Errorf("exchange.merge: %v", err) } obj.Set("genTxWithSign", bridge.GenTxWithSign) obj.Set("getRecords", bridge.GetRecords) obj.Set("merge", bridge.Merge) } } // The admin.sleep and admin.sleepBlocks are offered by the console and not by the RPC layer. admin, err := c.jsre.Get("admin") if err != nil { return err } if obj := admin.Object(); obj != nil { // make sure the admin api is enabled over the interface obj.Set("sleepBlocks", bridge.SleepBlocks) obj.Set("sleep", bridge.Sleep) obj.Set("clearHistory", c.clearHistory) } // Preload any JavaScript files before starting the console for _, path := range preload { if err := c.jsre.Exec(path); err != nil { failure := err.Error() if ottoErr, ok := err.(*otto.Error); ok { failure = ottoErr.String() } return fmt.Errorf("%s: %v", path, failure) } } // Configure the console's input prompter for scrollback and tab completion if c.prompter != nil { if content, err := ioutil.ReadFile(c.histPath); err != nil { c.prompter.SetHistory(nil) } else { c.history = strings.Split(string(content), "\n") c.prompter.SetHistory(c.history) } c.prompter.SetWordCompleter(c.AutoCompleteInput) } return nil } func (c *Console) clearHistory() { c.history = nil c.prompter.ClearHistory() if err := os.Remove(c.histPath); err != nil { fmt.Fprintln(c.printer, "can't delete history file:", err) } else { fmt.Fprintln(c.printer, "history file deleted") } } // consoleOutput is an override for the console.log and console.error methods to // stream the output into the configured output stream instead of stdout. func (c *Console) consoleOutput(call otto.FunctionCall) otto.Value { output := []string{} for _, argument := range call.ArgumentList { output = append(output, fmt.Sprintf("%v", argument)) } fmt.Fprintln(c.printer, strings.Join(output, " ")) return otto.Value{} } // AutoCompleteInput is a pre-assembled word completer to be used by the user // input prompter to provide hints to the user about the methods available. func (c *Console) AutoCompleteInput(line string, pos int) (string, []string, string) { // No completions can be provided for empty inputs if len(line) == 0 || pos == 0 { return "", nil, "" } // Chunck data to relevant part for autocompletion // E.g. in case of nested lines sero.getBalance(sero.coinb start := pos - 1 for ; start > 0; start-- { // Skip all methods and namespaces (i.e. including the dot) if line[start] == '.' || (line[start] >= 'a' && line[start] <= 'z') || (line[start] >= 'A' && line[start] <= 'Z') { continue } // Handle web3 in a special way (i.e. other numbers aren't auto completed) if start >= 3 && line[start-3:start] == "web3" { start -= 3 continue } // We've hit an unexpected character, autocomplete form here start++ break } return line[:start], c.jsre.CompleteKeywords(line[start:pos]), line[pos:] } // Welcome show summary of current Geth instance and some metadata about the // console's available modules. func (c *Console) Welcome() { // Print some generic Geth metadata fmt.Fprintf(c.printer, "Welcome to the Gero JavaScript console!\n\n") c.jsre.Run(` console.log("instance: " + web3.version.node); console.log("coinbase: " + sero.coinbase); console.log("at block: " + sero.blockNumber + " (" + new Date(1000 * sero.getBlock(sero.blockNumber).timestamp) + ")"); console.log(" datadir: " + admin.datadir); `) // List all the supported modules for the user to call if apis, err := c.client.SupportedModules(); err == nil { modules := make([]string, 0, len(apis)) for api, version := range apis { if api == "sero" { modules = append(modules, fmt.Sprintf("%s:%s", "sero", version)) } else { modules = append(modules, fmt.Sprintf("%s:%s", api, version)) } } sort.Strings(modules) fmt.Fprintln(c.printer, " modules:", strings.Join(modules, " ")) } fmt.Fprintln(c.printer) } // Evaluate executes code and pretty prints the result to the specified output // stream. func (c *Console) Evaluate(statement string) error { defer func() { if r := recover(); r != nil { fmt.Fprintf(c.printer, "[native] error: %v\n", r) } }() return c.jsre.Evaluate(statement, c.printer) } // Interactive starts an interactive user session, where input is propted from // the configured user prompter. func (c *Console) Interactive() { var ( prompt = c.prompt // Current prompt line (used for multi-line inputs) indents = 0 // Current number of input indents (used for multi-line inputs) input = "" // Current user input scheduler = make(chan string) // Channel to send the next prompt on and receive the input ) // Start a goroutine to listen for promt requests and send back inputs go func() { for { // Read the next user input line, err := c.prompter.PromptInput(<-scheduler) if err != nil { // In case of an error, either clear the prompt or fail if err == liner.ErrPromptAborted { // ctrl-C prompt, indents, input = c.prompt, 0, "" scheduler <- "" continue } close(scheduler) return } // User input retrieved, send for interpretation and loop scheduler <- line } }() // Monitor Ctrl-C too in case the input is empty and we need to bail abort := make(chan os.Signal, 1) signal.Notify(abort, syscall.SIGINT, syscall.SIGTERM) // Start sending prompts to the user and reading back inputs for { // Send the next prompt, triggering an input read and process the result scheduler <- prompt select { case <-abort: // User forcefully quite the console fmt.Fprintln(c.printer, "caught interrupt, exiting") return case line, ok := <-scheduler: // User input was returned by the prompter, handle special cases if !ok || (indents <= 0 && exit.MatchString(line)) { return } if onlyWhitespace.MatchString(line) { continue } // Append the line to the input and check for multi-line interpretation input += line + "\n" indents = countIndents(input) if indents <= 0 { prompt = c.prompt } else { prompt = strings.Repeat(".", indents*3) + " " } // If all the needed lines are present, save the command and run if indents <= 0 { if len(input) > 0 && input[0] != ' ' && !passwordRegexp.MatchString(input) { if command := strings.TrimSpace(input); len(c.history) == 0 || command != c.history[len(c.history)-1] { c.history = append(c.history, command) if c.prompter != nil { c.prompter.AppendHistory(command) } } } c.Evaluate(input) input = "" } } } } // countIndents returns the number of identations for the given input. // In case of invalid input such as var a = } the result can be negative. func countIndents(input string) int { var ( indents = 0 inString = false strOpenChar = ' ' // keep track of the string open char to allow var str = "I'm ...."; charEscaped = false // keep track if the previous char was the '\' char, allow var str = "abc\"def"; ) for _, c := range input { switch c { case '\\': // indicate next char as escaped when in string and previous char isn't escaping this backslash if !charEscaped && inString { charEscaped = true } case '\'', '"': if inString && !charEscaped && strOpenChar == c { // end string inString = false } else if !inString && !charEscaped { // begin string inString = true strOpenChar = c } charEscaped = false case '{', '(': if !inString { // ignore brackets when in string, allow var str = "a{"; without indenting indents++ } charEscaped = false case '}', ')': if !inString { indents-- } charEscaped = false default: charEscaped = false } } return indents } // Execute runs the JavaScript file specified as the argument. func (c *Console) Execute(path string) error { return c.jsre.Exec(path) } // Stop cleans up the console and terminates the runtime environment. func (c *Console) Stop(graceful bool) error { if err := ioutil.WriteFile(c.histPath, []byte(strings.Join(c.history, "\n")), 0600); err != nil { return err } if err := os.Chmod(c.histPath, 0600); err != nil { // Force 0600, even if it was different previously return err } c.jsre.Stop(graceful) return nil } ================================================ FILE: console/console_test.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package console import ( "bytes" "errors" "fmt" "io/ioutil" "os" "strings" "testing" "time" "github.com/sero-cash/go-czero-import/cpt" "github.com/sero-cash/go-sero/consensus/ethash" "github.com/sero-cash/go-sero/core" "github.com/sero-cash/go-sero/internal/jsre" "github.com/sero-cash/go-sero/node" "github.com/sero-cash/go-sero/sero" ) const ( testInstance = "console-tester" testAddress = "4yn9wDedx4B5k9RYmwavvmJ49UKn6VRoa8vubB5xkzanr74FPtaUM9XrFGCsB3erNyFPV7HY4U7TH8UjaswT6h3P" ) func init() { cpt.ZeroInit_NoCircuit() } // hookedPrompter implements UserPrompter to simulate use input via channels. type hookedPrompter struct { scheduler chan string } func (p *hookedPrompter) PromptInput(prompt string) (string, error) { // Send the prompt to the tester select { case p.scheduler <- prompt: case <-time.After(time.Second): return "", errors.New("prompt timeout") } // Retrieve the response and feed to the console select { case input := <-p.scheduler: return input, nil case <-time.After(time.Second): return "", errors.New("input timeout") } } func (p *hookedPrompter) PromptPassword(prompt string) (string, error) { return "", errors.New("not implemented") } func (p *hookedPrompter) PromptConfirm(prompt string) (bool, error) { return false, errors.New("not implemented") } func (p *hookedPrompter) SetHistory(history []string) {} func (p *hookedPrompter) AppendHistory(command string) {} func (p *hookedPrompter) ClearHistory() {} func (p *hookedPrompter) SetWordCompleter(completer WordCompleter) {} // tester is a console test environment for the console tests to operate on. type tester struct { workspace string stack *node.Node sero *sero.Sero console *Console input *hookedPrompter output *bytes.Buffer } // newTester creates a test environment based on which the console can operate. // Please ensure you call Close() on the returned tester to avoid leaks. func newTester(t *testing.T, confOverride func(*sero.Config)) *tester { // Create a temporary storage for the node keys and initialize it workspace, err := ioutil.TempDir("", "console-tester-") if err != nil { t.Fatalf("failed to create temporary keystore: %v", err) } // Create a networkless protocol stack and start an Ethereum service within stack, err := node.New(&node.Config{DataDir: workspace, UseLightweightKDF: true, Name: testInstance}) if err != nil { t.Fatalf("failed to create node: %v", err) } ethConf := &sero.Config{ Genesis: core.DeveloperGenesisBlock(), //Serobase: common.Base58ToAddress(testAddress), Ethash: ethash.Config{ PowMode: ethash.ModeTest, }, } if confOverride != nil { confOverride(ethConf) } if err = stack.Register(func(ctx *node.ServiceContext) (node.Service, error) { return sero.New(ctx, ethConf) }); err != nil { t.Fatalf("failed to register Ethereum protocol: %v", err) } // Start the node and assemble the JavaScript console around it if err = stack.Start(); err != nil { t.Fatalf("failed to start test stack: %v", err) } client, err := stack.Attach() if err != nil { t.Fatalf("failed to attach to node: %v", err) } prompter := &hookedPrompter{scheduler: make(chan string)} printer := new(bytes.Buffer) console, err := New(Config{ DataDir: stack.DataDir(), DocRoot: "testdata", Client: client, Prompter: prompter, Printer: printer, Preload: []string{"preload.js"}, }) if err != nil { t.Fatalf("failed to create JavaScript console: %v", err) } // Create the final tester and return var sero *sero.Sero stack.Service(&sero) return &tester{ workspace: workspace, stack: stack, sero: sero, console: console, input: prompter, output: printer, } } // Close cleans up any temporary data folders and held resources. func (env *tester) Close(t *testing.T) { if err := env.console.Stop(false); err != nil { t.Errorf("failed to stop embedded console: %v", err) } if err := env.stack.Stop(); err != nil { t.Errorf("failed to stop embedded node: %v", err) } os.RemoveAll(env.workspace) } // Tests that the node lists the correct welcome message, notably that it contains // the instance name, coinbase account, block number, data directory and supported // console modules. func TestWelcome(t *testing.T) { tester := newTester(t, nil) defer tester.Close(t) tester.console.Welcome() output := tester.output.String() if want := "Welcome"; !strings.Contains(output, want) { t.Fatalf("console output missing welcome message: have\n%s\nwant also %s", output, want) } if want := fmt.Sprintf("instance: %s", testInstance); !strings.Contains(output, want) { t.Fatalf("console output missing instance: have\n%s\nwant also %s", output, want) } if want := fmt.Sprintf("coinbase: %s", testAddress); !strings.Contains(output, want) { t.Fatalf("console output missing coinbase: have\n%s\nwant also %s", output, want) } if want := "at block: 0"; !strings.Contains(output, want) { t.Fatalf("console output missing sync status: have\n%s\nwant also %s", output, want) } if want := fmt.Sprintf("datadir: %s", tester.workspace); !strings.Contains(output, want) { t.Fatalf("console output missing coinbase: have\n%s\nwant also %s", output, want) } } // Tests that JavaScript statement evaluation works as intended. func TestEvaluate(t *testing.T) { tester := newTester(t, nil) defer tester.Close(t) tester.console.Evaluate("2 + 2") if output := tester.output.String(); !strings.Contains(output, "4") { t.Fatalf("statement evaluation failed: have %s, want %s", output, "4") } } // Tests that the console can be used in interactive mode. func TestInteractive(t *testing.T) { // Create a tester and run an interactive console in the background tester := newTester(t, nil) defer tester.Close(t) go tester.console.Interactive() // Wait for a promt and send a statement back select { case <-tester.input.scheduler: case <-time.After(time.Second): t.Fatalf("initial prompt timeout") } select { case tester.input.scheduler <- "2+2": case <-time.After(time.Second): t.Fatalf("input feedback timeout") } // Wait for the second promt and ensure first statement was evaluated select { case <-tester.input.scheduler: case <-time.After(time.Second): t.Fatalf("secondary prompt timeout") } if output := tester.output.String(); !strings.Contains(output, "4") { t.Fatalf("statement evaluation failed: have %s, want %s", output, "4") } } // Tests that preloaded JavaScript files have been executed before user is given // input. func TestPreload(t *testing.T) { tester := newTester(t, nil) defer tester.Close(t) tester.console.Evaluate("preloaded") if output := tester.output.String(); !strings.Contains(output, "some-preloaded-string") { t.Fatalf("preloaded variable missing: have %s, want %s", output, "some-preloaded-string") } } // Tests that JavaScript scripts can be executes from the configured asset path. func TestExecute(t *testing.T) { tester := newTester(t, nil) defer tester.Close(t) tester.console.Execute("exec.js") tester.console.Evaluate("execed") if output := tester.output.String(); !strings.Contains(output, "some-executed-string") { t.Fatalf("execed variable missing: have %s, want %s", output, "some-executed-string") } } // Tests that the JavaScript objects returned by statement executions are properly // pretty printed instead of just displaing "[object]". func TestPrettyPrint(t *testing.T) { tester := newTester(t, nil) defer tester.Close(t) tester.console.Evaluate("obj = {int: 1, string: 'two', list: [3, 3, 3], obj: {null: null, func: function(){}}}") // Define some specially formatted fields var ( one = jsre.NumberColor("1") two = jsre.StringColor("\"two\"") three = jsre.NumberColor("3") null = jsre.SpecialColor("null") fun = jsre.FunctionColor("function()") ) // Assemble the actual output we're after and verify want := `{ int: ` + one + `, list: [` + three + `, ` + three + `, ` + three + `], obj: { null: ` + null + `, func: ` + fun + ` }, string: ` + two + ` } ` if output := tester.output.String(); output != want { t.Fatalf("pretty print mismatch: have %s, want %s", output, want) } } // Tests that the JavaScript exceptions are properly formatted and colored. func TestPrettyError(t *testing.T) { tester := newTester(t, nil) defer tester.Close(t) tester.console.Evaluate("throw 'hello'") want := jsre.ErrorColor("hello") + "\n" if output := tester.output.String(); output != want { t.Fatalf("pretty error mismatch: have %s, want %s", output, want) } } // Tests that tests if the number of indents for JS input is calculated correct. func TestIndenting(t *testing.T) { testCases := []struct { input string expectedIndentCount int }{ {`var a = 1;`, 0}, {`"some string"`, 0}, {`"some string with (parentesis`, 0}, {`"some string with newline ("`, 0}, {`function v(a,b) {}`, 0}, {`function f(a,b) { var str = "asd("; };`, 0}, {`function f(a) {`, 1}, {`function f(a, function(b) {`, 2}, {`function f(a, function(b) { var str = "a)}"; });`, 0}, {`function f(a,b) { var str = "a{b(" + a, ", " + b; }`, 0}, {`var str = "\"{"`, 0}, {`var str = "'("`, 0}, {`var str = "\\{"`, 0}, {`var str = "\\\\{"`, 0}, {`var str = 'a"{`, 0}, {`var obj = {`, 1}, {`var obj = { {a:1`, 2}, {`var obj = { {a:1}`, 1}, {`var obj = { {a:1}, b:2}`, 0}, {`var obj = {}`, 0}, {`var obj = { a: 1, b: 2 }`, 0}, {`var test = }`, -1}, {`var str = "a\""; var obj = {`, 1}, } for i, tt := range testCases { counted := countIndents(tt.input) if counted != tt.expectedIndentCount { t.Errorf("test %d: invalid indenting: have %d, want %d", i, counted, tt.expectedIndentCount) } } } ================================================ FILE: console/prompter.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package console import ( "fmt" "strings" "github.com/peterh/liner" ) // Stdin holds the stdin line reader (also using stdout for printing prompts). // Only this reader may be used for input because it keeps an internal buffer. var Stdin = newTerminalPrompter() // UserPrompter defines the methods needed by the console to promt the user for // various types of inputs. type UserPrompter interface { // PromptInput displays the given prompt to the user and requests some textual // data to be entered, returning the input of the user. PromptInput(prompt string) (string, error) // PromptPassword displays the given prompt to the user and requests some textual // data to be entered, but one which must not be echoed out into the terminal. // The method returns the input provided by the user. PromptPassword(prompt string) (string, error) // PromptConfirm displays the given prompt to the user and requests a boolean // choice to be made, returning that choice. PromptConfirm(prompt string) (bool, error) // SetHistory sets the the input scrollback history that the prompter will allow // the user to scroll back to. SetHistory(history []string) // AppendHistory appends an entry to the scrollback history. It should be called // if and only if the prompt to append was a valid command. AppendHistory(command string) // ClearHistory clears the entire history ClearHistory() // SetWordCompleter sets the completion function that the prompter will call to // fetch completion candidates when the user presses tab. SetWordCompleter(completer WordCompleter) } // WordCompleter takes the currently edited line with the cursor position and // returns the completion candidates for the partial word to be completed. If // the line is "Hello, wo!!!" and the cursor is before the first '!', ("Hello, // wo!!!", 9) is passed to the completer which may returns ("Hello, ", {"world", // "Word"}, "!!!") to have "Hello, world!!!". type WordCompleter func(line string, pos int) (string, []string, string) // terminalPrompter is a UserPrompter backed by the liner package. It supports // prompting the user for various input, among others for non-echoing password // input. type terminalPrompter struct { *liner.State warned bool supported bool normalMode liner.ModeApplier rawMode liner.ModeApplier } // newTerminalPrompter creates a liner based user input prompter working off the // standard input and output streams. func newTerminalPrompter() *terminalPrompter { p := new(terminalPrompter) // Get the original mode before calling NewLiner. // This is usually regular "cooked" mode where characters echo. normalMode, _ := liner.TerminalMode() // Turn on liner. It switches to raw mode. p.State = liner.NewLiner() rawMode, err := liner.TerminalMode() if err != nil || !liner.TerminalSupported() { p.supported = false } else { p.supported = true p.normalMode = normalMode p.rawMode = rawMode // Switch back to normal mode while we're not prompting. normalMode.ApplyMode() } p.SetCtrlCAborts(true) p.SetTabCompletionStyle(liner.TabPrints) p.SetMultiLineMode(true) return p } // PromptInput displays the given prompt to the user and requests some textual // data to be entered, returning the input of the user. func (p *terminalPrompter) PromptInput(prompt string) (string, error) { if p.supported { p.rawMode.ApplyMode() defer p.normalMode.ApplyMode() } else { // liner tries to be smart about printing the prompt // and doesn't print anything if input is redirected. // Un-smart it by printing the prompt always. fmt.Print(prompt) prompt = "" defer fmt.Println() } return p.State.Prompt(prompt) } // PromptPassword displays the given prompt to the user and requests some textual // data to be entered, but one which must not be echoed out into the terminal. // The method returns the input provided by the user. func (p *terminalPrompter) PromptPassword(prompt string) (passwd string, err error) { if p.supported { p.rawMode.ApplyMode() defer p.normalMode.ApplyMode() return p.State.PasswordPrompt(prompt) } if !p.warned { fmt.Println("!! Unsupported terminal, password will be echoed.") p.warned = true } // Just as in Prompt, handle printing the prompt here instead of relying on liner. fmt.Print(prompt) passwd, err = p.State.Prompt("") fmt.Println() return passwd, err } // PromptConfirm displays the given prompt to the user and requests a boolean // choice to be made, returning that choice. func (p *terminalPrompter) PromptConfirm(prompt string) (bool, error) { input, err := p.Prompt(prompt + " [y/N] ") if len(input) > 0 && strings.ToUpper(input[:1]) == "Y" { return true, nil } return false, err } // SetHistory sets the the input scrollback history that the prompter will allow // the user to scroll back to. func (p *terminalPrompter) SetHistory(history []string) { p.State.ReadHistory(strings.NewReader(strings.Join(history, "\n"))) } // AppendHistory appends an entry to the scrollback history. func (p *terminalPrompter) AppendHistory(command string) { p.State.AppendHistory(command) } // ClearHistory clears the entire history func (p *terminalPrompter) ClearHistory() { p.State.ClearHistory() } // SetWordCompleter sets the completion function that the prompter will call to // fetch completion candidates when the user presses tab. func (p *terminalPrompter) SetWordCompleter(completer WordCompleter) { p.State.SetWordCompleter(liner.WordCompleter(completer)) } ================================================ FILE: console/testdata/exec.js ================================================ var execed = "some-executed-string"; ================================================ FILE: console/testdata/preload.js ================================================ var preloaded = "some-preloaded-string"; ================================================ FILE: containers/docker/gero-ubuntu/Dockerfile ================================================ FROM ubuntu:xenial ENV LD_LIBRARY_PATH=/geropkg/czero/lib COPY rungero.docker /usr/local/bin/rungero COPY geroConfig.toml /usr/local/bin/geroConfig.toml RUN \ apt-get update && apt-get upgrade -q -y && \ apt-get install -y --no-install-recommends wget make gcc libc-dev libgmp-dev ca-certificates && \ wget https://sero-1259797294.file.myqcloud.com/gero/v1.0.4/gero-v1.0.4-linux-amd64-v3.tar.gz &&\ tar -zxvf gero-v1.0.4-linux-amd64-v3.tar.gz && \ cp geropkg/bin/gero /gero EXPOSE 8545 EXPOSE 53717 ENTRYPOINT ["/usr/local/bin/rungero"] ================================================ FILE: containers/docker/gero-ubuntu/Makefile ================================================ #please read rungero.docker script,you can add startup params #when you start gero with docker please add -v save the data to the chain data build: docker build -t sero/client-go:v1.0.4 . rpc: mkdir -p ~/geroData/log docker run --name gero -v ~/geroData:/root/.sero -v ~/geroData/log:/log -d -p 8545:8545 sero/client-go:v1.0.4 kill: docker rm -f gero test: curl -X POST -H "Content-Type":application/json --data '{"jsonrpc":"2.0","method":"sero_blockNumber","params":[""],"id":1}' localhost:8545 ================================================ FILE: containers/docker/gero-ubuntu/geroConfig.toml ================================================ [Sero] [Node] #KeyStoreDir="./data/keystore" [Node.P2P] MaxPeers = 1024 StaticNodes = ["snode://04283d01edd018309d1381d8feb531c0b0f1d0ae72b738e7bd92f797a7c6239a1b59f3bfe739f3fc1a63e030360d3b88b185181705ef1166776b3fcc98362a4c@129.28.156.61:53717", "snode://04ab8fd7d7420aa0c66607f59b3109d874de116685e2e8dcd6c583ae9ab991289b7ebb925716d531eaff2cb0977a8961db59d496c3f0d2561dd580941a194d71@118.25.80.42:53717", "snode://1a81e137c5cfb7e41eb2ed911fbac9630abce096b2f1464ce44886d9cd5819493b42a9812f4b65467d966ea8dedca3863b114f7b3f3517c4bd3c3b26c330d60d@111.231.59.54:53717", "snode://38ad2d00bc6c539319e8a476761d2a636156af6a8f504765d28f392cd5c1f42ca2a69aeda05210c5e9dbe5184e68991c9ed36a3e4ded0cdd2ab9cba6c153d60e@47.105.42.49:53717", "snode://3ae5d553e78057fa33cad0ecf08b08fce9c2c50bbe5d2625b996b1322d8c96c74ca42dd54dbf5854cc6c70cd50a650e3b835c92e8f0e0adafcb47724413d16e2@13.251.221.90:60602", "snode://410b4aa874bb3d6d4dc732463629acfabbf503d39493f69c82fd62119d4eca1aef02cb0e5d224765231b66df3ba87e50e7fafc87651cbaf41af13705fea3370f@27.10.235.88:34342", "snode://41129a264748e4d949c675b1bb6afcb23fb0748e991e16e2b43693ead9911759c708ded5b836a68d0ef3c48d389667f3ba1224734b00794d522754bc693f52ea@109.70.186.58:53718", "snode://459c94ce2b1bb05dce5faccd27b13add006b5378ba0e598b001ddf07eb08d00965d61a64016b72a48de0a0d51c1d4f964929c00d53efc8b95a174dba3ba98065@95.216.8.218:53333", "snode://4ba7196e0c06885b036795ff126c4616627075ceb0bfaf0fae2313e6894bc3445b3b147afd60021d3450e4c0e7582be3248a2d21bb03560bff8a06b638efe749@118.24.17.141:53717", "snode://4da4f3b1f852cefadff1ace9f24cabd1245cf6ba81fb1cdb043c4987202bfacd8226c48a16bccef05c15f2f0b263acd25be1e60e3e3250ae61f83c49701118e9@121.196.218.173:53717", "snode://505d5faf9c914e082a1157dc6e8398eb52e18da05b71ffb45c97d422dbf01c91ff6eabeecb4d4fd2557c9bf52b471f376eba04f66bc9adc926ca6bd927f35394@47.75.186.103:56112", "snode://52e62b8cc63d8a44b7071ca76115edce26f53da42a71a23f7b52f8870b43b658cefe33517a7316941385fae495052b7d351e6e3f3c5f1110a86e20ee5d3626ec@39.100.244.135:53717", "snode://5365992929387340e9e5a5a06dcb32948efa9c073f62bbcbdaa9cc47c82c5e99c4b917a850aecd0ffa21150731475276b82aff0617bfa7016b2809459e1da128@14.215.130.120:53717", "snode://5e0041083a74bda32f46ef66d3206b73d0c14facd674a4f99373116954a88bb04f8abf0da0503baa186d3edc0ff5e3d22a4e74252a7750662053f9606bd0bef8@109.70.186.58:53717", "snode://619413acabc04d15870b8cce2eac02b0bc91a706cad503ae3e438870408d79f282b0e25dfeb4c8dbdcd2b0f320577ee859420c94f6a7f50db973bda70c360e65@183.2.149.218:53717", "snode://6b883d53f89c32ea32fc0520fe7c1dd2738c079068bc84c12b8fc032c0c947e958c980ef4eb839f5b7dab0a99e185059a941feefe2ec25b20d6e854dd530b95d@118.31.59.151:53717", "snode://7630acdc71105241a39a7b1725c145855c27e54bbe08f2806cd1a3d306cb407d8c0158742698dee848ba3d5f9992d56e3b1bc3b6f2b55ff159a45abdb3024d34@121.201.75.200:53717", "snode://8904be22328d88cdde7a9f259a5a210709b05dbd95c22b6df16f568ad19aafc94ece39966c3bbef4e7adfa8169b02405a7a82ca2083fdc3264354a506b9cdae0@182.61.22.130:53717", "snode://8fdaacf36133765f0b82a63e0abbc2402001bff5fbc1f4e290e761048aa847b75039e16efbe63217d4ba174ba8513a09418aa7c989ad2d868f01b619416d7514@39.104.121.215:53717", "snode://9162edcd147e13de27074bd908fd0107ff2c4adda8a410d46a0db8ae0feb4ed6518e9028939728eca7f44265320ee019ddf4eacda6d8c22970e4d16ef3d946e0@106.13.215.117:53727", "snode://98c6caf6bf71d326a85d792ae311157837b0fca5c7474ff3e78b5b81b8c97ae7404648f4aac4949746045324bcef83e15639706c806f2cab2aa180fe028819aa@119.23.46.14:53717", "snode://a45f419b3b20f327a1009669ab6d2642a86fe4c08b7bb39ce03f57cc9b584552acdd92c57981f92978833678f27cbb523daeac5f28caf8e17b550075941be677@183.2.149.217:53717", "snode://a9fa905c90dd9051a6a2e2edbba0a3c23c38d23ad9fd7fb47a4437d5f61ab80c05382f12c12cc5a360962d7f2271dd34dbd933ace888008620f02eb8522dad05@219.152.25.125:37168", "snode://ab964ae3dd5ea7744332e20b1a641ffad59063aae7f5e89b53eb04b1cc666899b22e6b951e811801645e51305bbc55df57e71c938678f47433a024fb645d25b1@119.148.162.131:53717", "snode://ae55a637218d40b7718d16d0ad82c91dbcaf72800a70da669426ef036a0bcf7eb6709a55ed675c3882ca734492c2358285d07f9b209e9d287270339299353253@49.232.53.87:53717", "snode://b3c2559e1790273a8355320bb98895fde3985f86c182d0f9cb5c00ea93b0d4b06ee8193eaf6dcbe3bf4866195fbae80f85d0c292e21328407e57ff1de55fdd53@129.204.197.105:53717", "snode://b5feccebd5d7908252e3b2e5ad7bcb1e71a0c9f13f5335a39a6cd534afbad64408480711b4528a4d2de3d063df5aa498c1326f6b54bc658afd99f6d04af789e7@94.191.35.64:53717", "snode://cbd8bb1c3d5ca59addb9a2c6c72f1a42826d46b6032bb22f3345c9e157d52e9d03c32ac022dd631828e0e061363d3f6e5e56c70e9b6f3f3e98a67e3f6fe28919@47.104.198.171:53717", "snode://d8c8257faeaa5cbd13185e632461593e61461ef4cab40fbf9a0fc997502f17f5f58ff47a92ed24e7ae3810dfff3d27511e807bec0ae55bd2f20021f679250c03@207.148.4.216:53717", "snode://d97fa94a1cf165d4a810189926b6c76553f7402bf80580a6c7e84b4e2c01003944fcc5d8fb46f015795d06708c917edb1d8f9f66210a1f73f1d15c70214c76a8@39.100.147.174:53717", "snode://e80e3b82bf60e20ad005c71196464621a1a0829791d5d42a6d3c814802b7a73d8075c9ae3bc794206b798d4391e3b809a5d18a39411af44b6bd3d9ac591ebd5b@129.204.27.217:53717", "snode://eb07c6e85fd25a8d1ee59b12645ae355264f6c1d47855aa4312374880b2dfda0572e8dc6e345e4da772f67cdbf64c99a37f47acb521bc040c4ed08cfb5b69fa7@49.235.43.231:53717", "snode://eb8bf52d6746c89709354c95eb2045a7fc8f75c4ba104238759e0a12f7df381486e956decf4b4ffe642f518c112cc3a305c1eee8633cd011a288db11af9b0774@18.162.219.184:53717", "snode://eeac837a47990f02e57814e4fe3661fd68ec9419bafc0d1f2a498aa25f635adccc0cf84553d291325acffead5bcec7fc9a838d724e30ac880c9d1a57f64b3ecb@47.75.120.213:55792", "snode://f518c5d7513a68e25b9bab8cd68749a30e1782ae2f6dd0da047a664c5517282128a44cec30fd16ab54cc5ba5c730371c74817618396088be93081a90eab63766@118.190.58.196:53717", "snode://221e2ad2237a3ec164bd8c7febe31336f0647b60e194d7def5b9fe9cf7ae09c33745b7c3cd833a8f05b5db282c41f2d35c72c3df38c594bcc054a4b35d54a93d@122.224.55.50:53717", "snode://de325a736632a5b8a6e1f3a5755a1c7ab568171918d2a7f26560de4ac99e0cec2b87c487f8652e80d15f0ab3d1a1b6f6ddf1634bec48a34041101d885438e0c2@148.70.169.73:53717", "snode://eec8179a39aad4c793b24c978b2ebca2a8b97d60ee4ac1eee06e96a429c996501aee5fdd065129c065b0bfccadc1a88ed8d8b6ab4528677e01921f6f935599d7@101.37.124.82:53717", "snode://439b01f40e2a55c9e3a3773d1683f6f33d933a8bb4a23eabf493cd694bc2de8b1863ff62be3fe935afaefe34d960fa05497b23481ff267af3920be398419f3f3@118.31.57.191:53717", "snode://ebdc84f6c79a44e28efd3cc33743b7bdb192b566833acdf818df8398f87ecd849dae3cfe79017f0ad32e91e19b62cc5ed1ce85f459213ba86e46ab8b680819bb@13.56.113.11:53717", "snode://f518c5d7513a68e25b9bab8cd68749a30e1782ae2f6dd0da047a664c5517282128a44cec30fd16ab54cc5ba5c730371c74817618396088be93081a90eab63766@47.104.158.136:53717"] TrustedNodes = ["snode://7fe0ac9ab365a18435dc67a92fe48be06b0fc5c5b4ef66135fc4ffbc48ffdd07bfdbc580128bba7bc29dd43c881bb41cf85b8a49015e937356fc6e855d3bc427@3.122.152.29:53717","snode://ebdc84f6c79a44e28efd3cc33743b7bdb192b566833acdf818df8398f87ecd849dae3cfe79017f0ad32e91e19b62cc5ed1ce85f459213ba86e46ab8b680819bb@13.56.113.11:53717","snode://eb8bf52d6746c89709354c95eb2045a7fc8f75c4ba104238759e0a12f7df381486e956decf4b4ffe642f518c112cc3a305c1eee8633cd011a288db11af9b0774@18.162.219.184:53717","snode://6e7cd5cef0993c36bfd010c4afe4459022fd0d94b04bd2099a6b7183a22371e5d469dddf1505ed120d326dc0b19523cdbabe08be23056fbb46c319ad9d975059@49.232.11.26:53717","snode://98c6caf6bf71d326a85d792ae311157837b0fca5c7474ff3e78b5b81b8c97ae7404648f4aac4949746045324bcef83e15639706c806f2cab2aa180fe028819aa@119.23.46.14:53717","snode://de325a736632a5b8a6e1f3a5755a1c7ab568171918d2a7f26560de4ac99e0cec2b87c487f8652e80d15f0ab3d1a1b6f6ddf1634bec48a34041101d885438e0c2@148.70.169.73:53717"] ================================================ FILE: containers/docker/gero-ubuntu/rungero.docker ================================================ #!/bin/bash mkdir -p /log current=`date "+%Y-%m-%d"` logName="gero_$current.log" /gero --config /usr/local/bin/geroConfig.toml --datadir /root/.sero --rpccorsdomain="*" --confirmedBlock 32 --rpcwritetimeout 1800 --exchangeValueStr --port 53717 --rpc --rpcaddr "127.0.0.1" -rpcapi "sero,net,exchange,stake" --rpcport 8545 --exchange --mineMode $@ 2>> /log/${logName} ================================================ FILE: core/.gitignore ================================================ # See http://help.github.com/ignore-files/ for more about ignoring files. # # If you find yourself ignoring temporary files generated by your text editor # or operating system, you probably want to add a global ignore instead: # git config --global core.excludesfile ~/.gitignore_global /tmp */**/*un~ *un~ .DS_Store */**/.DS_Store ================================================ FILE: core/asm/asm.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // Provides support for dealing with EVM assembly instructions (e.g., disassembling them). package asm import ( "encoding/hex" "fmt" "github.com/sero-cash/go-sero/core/vm" ) // Iterator for disassembled EVM instructions type instructionIterator struct { code []byte pc uint64 arg []byte op vm.OpCode error error started bool } // Create a new instruction iterator. func NewInstructionIterator(code []byte) *instructionIterator { it := new(instructionIterator) it.code = code return it } // Returns true if there is a next instruction and moves on. func (it *instructionIterator) Next() bool { if it.error != nil || uint64(len(it.code)) <= it.pc { // We previously reached an error or the end. return false } if it.started { // Since the iteration has been already started we move to the next instruction. if it.arg != nil { it.pc += uint64(len(it.arg)) } it.pc++ } else { // We start the iteration from the first instruction. it.started = true } if uint64(len(it.code)) <= it.pc { // We reached the end. return false } it.op = vm.OpCode(it.code[it.pc]) if it.op.IsPush() { a := uint64(it.op) - uint64(vm.PUSH1) + 1 u := it.pc + 1 + a if uint64(len(it.code)) <= it.pc || uint64(len(it.code)) < u { it.error = fmt.Errorf("incomplete push instruction at %v", it.pc) return false } it.arg = it.code[it.pc+1 : u] } else { it.arg = nil } return true } // Returns any error that may have been encountered. func (it *instructionIterator) Error() error { return it.error } // Returns the PC of the current instruction. func (it *instructionIterator) PC() uint64 { return it.pc } // Returns the opcode of the current instruction. func (it *instructionIterator) Op() vm.OpCode { return it.op } // Returns the argument of the current instruction. func (it *instructionIterator) Arg() []byte { return it.arg } // Pretty-print all disassembled EVM instructions to stdout. func PrintDisassembled(code string) error { script, err := hex.DecodeString(code) if err != nil { return err } it := NewInstructionIterator(script) for it.Next() { if it.Arg() != nil && 0 < len(it.Arg()) { fmt.Printf("%06v: %v 0x%x\n", it.PC(), it.Op(), it.Arg()) } else { fmt.Printf("%06v: %v\n", it.PC(), it.Op()) } } return it.Error() } // Return all disassembled EVM instructions in human-readable format. func Disassemble(script []byte) ([]string, error) { instrs := make([]string, 0) it := NewInstructionIterator(script) for it.Next() { if it.Arg() != nil && 0 < len(it.Arg()) { instrs = append(instrs, fmt.Sprintf("%06v: %v 0x%x\n", it.PC(), it.Op(), it.Arg())) } else { instrs = append(instrs, fmt.Sprintf("%06v: %v\n", it.PC(), it.Op())) } } if err := it.Error(); err != nil { return nil, err } return instrs, nil } ================================================ FILE: core/asm/compiler.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package asm import ( "fmt" "math/big" "os" "strings" "github.com/sero-cash/go-sero/common/math" "github.com/sero-cash/go-sero/core/vm" ) // Compiler contains information about the parsed source // and holds the tokens for the program. type Compiler struct { tokens []token binary []interface{} labels map[string]int pc, pos int debug bool } // newCompiler returns a new allocated compiler. func NewCompiler(debug bool) *Compiler { return &Compiler{ labels: make(map[string]int), debug: debug, } } // Feed feeds tokens in to ch and are interpreted by // the compiler. // // feed is the first pass in the compile stage as it // collects the used labels in the program and keeps a // program counter which is used to determine the locations // of the jump dests. The labels can than be used in the // second stage to push labels and determine the right // position. func (c *Compiler) Feed(ch <-chan token) { for i := range ch { switch i.typ { case number: num := math.MustParseBig256(i.text).Bytes() if len(num) == 0 { num = []byte{0} } c.pc += len(num) case stringValue: c.pc += len(i.text) - 2 case element: c.pc++ case labelDef: c.labels[i.text] = c.pc c.pc++ case label: c.pc += 5 } c.tokens = append(c.tokens, i) } if c.debug { fmt.Fprintln(os.Stderr, "found", len(c.labels), "labels") } } // Compile compiles the current tokens and returns a // binary string that can be interpreted by the EVM // and an error if it failed. // // compile is the second stage in the compile phase // which compiles the tokens to EVM instructions. func (c *Compiler) Compile() (string, []error) { var errors []error // continue looping over the tokens until // the stack has been exhausted. for c.pos < len(c.tokens) { if err := c.compileLine(); err != nil { errors = append(errors, err) } } // turn the binary to hex var bin string for _, v := range c.binary { switch v := v.(type) { case vm.OpCode: bin += fmt.Sprintf("%x", []byte{byte(v)}) case []byte: bin += fmt.Sprintf("%x", v) } } return bin, errors } // next returns the next token and increments the // position. func (c *Compiler) next() token { token := c.tokens[c.pos] c.pos++ return token } // compileLine compiles a single line instruction e.g. // "push 1", "jump @label". func (c *Compiler) compileLine() error { n := c.next() if n.typ != lineStart { return compileErr(n, n.typ.String(), lineStart.String()) } lvalue := c.next() switch lvalue.typ { case eof: return nil case element: if err := c.compileElement(lvalue); err != nil { return err } case labelDef: c.compileLabel() case lineEnd: return nil default: return compileErr(lvalue, lvalue.text, fmt.Sprintf("%v or %v", labelDef, element)) } if n := c.next(); n.typ != lineEnd { return compileErr(n, n.text, lineEnd.String()) } return nil } // compileNumber compiles the number to bytes func (c *Compiler) compileNumber(element token) (int, error) { num := math.MustParseBig256(element.text).Bytes() if len(num) == 0 { num = []byte{0} } c.pushBin(num) return len(num), nil } // compileElement compiles the element (push & label or both) // to a binary representation and may error if incorrect statements // where fed. func (c *Compiler) compileElement(element token) error { // check for a jump. jumps must be read and compiled // from right to left. if isJump(element.text) { rvalue := c.next() switch rvalue.typ { case number: // TODO figure out how to return the error properly c.compileNumber(rvalue) case stringValue: // strings are quoted, remove them. c.pushBin(rvalue.text[1 : len(rvalue.text)-2]) case label: c.pushBin(vm.PUSH4) pos := big.NewInt(int64(c.labels[rvalue.text])).Bytes() pos = append(make([]byte, 4-len(pos)), pos...) c.pushBin(pos) default: return compileErr(rvalue, rvalue.text, "number, string or label") } // push the operation c.pushBin(toBinary(element.text)) return nil } else if isPush(element.text) { // handle pushes. pushes are read from left to right. var value []byte rvalue := c.next() switch rvalue.typ { case number: value = math.MustParseBig256(rvalue.text).Bytes() if len(value) == 0 { value = []byte{0} } case stringValue: value = []byte(rvalue.text[1 : len(rvalue.text)-1]) case label: value = make([]byte, 4) copy(value, big.NewInt(int64(c.labels[rvalue.text])).Bytes()) default: return compileErr(rvalue, rvalue.text, "number, string or label") } if len(value) > 32 { return fmt.Errorf("%d type error: unsupported string or number with size > 32", rvalue.lineno) } c.pushBin(vm.OpCode(int(vm.PUSH1) - 1 + len(value))) c.pushBin(value) } else { c.pushBin(toBinary(element.text)) } return nil } // compileLabel pushes a jumpdest to the binary slice. func (c *Compiler) compileLabel() { c.pushBin(vm.JUMPDEST) } // pushBin pushes the value v to the binary stack. func (c *Compiler) pushBin(v interface{}) { if c.debug { fmt.Printf("%d: %v\n", len(c.binary), v) } c.binary = append(c.binary, v) } // isPush returns whether the string op is either any of // push(N). func isPush(op string) bool { return strings.ToUpper(op) == "PUSH" } // isJump returns whether the string op is jump(i) func isJump(op string) bool { return strings.ToUpper(op) == "JUMPI" || strings.ToUpper(op) == "JUMP" } // toBinary converts text to a vm.OpCode func toBinary(text string) vm.OpCode { return vm.StringToOp(strings.ToUpper(text)) } type compileError struct { got string want string lineno int } func (err compileError) Error() string { return fmt.Sprintf("%d syntax error: unexpected %v, expected %v", err.lineno, err.got, err.want) } func compileErr(c token, got, want string) error { return compileError{ got: got, want: want, lineno: c.lineno, } } ================================================ FILE: core/asm/lexer.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package asm import ( "fmt" "os" "strings" "unicode" "unicode/utf8" ) // stateFn is used through the lifetime of the // lexer to parse the different values at the // current state. type stateFn func(*lexer) stateFn // token is emitted when the lexer has discovered // a new parsable token. These are delivered over // the tokens channels of the lexer type token struct { typ tokenType lineno int text string } // tokenType are the different types the lexer // is able to parse and return. type tokenType int const ( eof tokenType = iota // end of file lineStart // emitted when a line starts lineEnd // emitted when a line ends invalidStatement // any invalid statement element // any element during element parsing label // label is emitted when a label is found labelDef // label definition is emitted when a new label is found number // number is emitted when a number is found stringValue // stringValue is emitted when a string has been found Numbers = "1234567890" // characters representing any decimal number HexadecimalNumbers = Numbers + "aAbBcCdDeEfF" // characters representing any hexadecimal Alpha = "abcdefghijklmnopqrstuwvxyzABCDEFGHIJKLMNOPQRSTUWVXYZ" // characters representing alphanumeric ) // String implements stringer func (it tokenType) String() string { if int(it) > len(stringtokenTypes) { return "invalid" } return stringtokenTypes[it] } var stringtokenTypes = []string{ eof: "EOF", invalidStatement: "invalid statement", element: "element", lineEnd: "end of line", lineStart: "new line", label: "label", labelDef: "label definition", number: "number", stringValue: "string", } // lexer is the basic construct for parsing // source code and turning them in to tokens. // Tokens are interpreted by the compiler. type lexer struct { input string // input contains the source code of the program tokens chan token // tokens is used to deliver tokens to the listener state stateFn // the current state function lineno int // current line number in the source file start, pos, width int // positions for lexing and returning value debug bool // flag for triggering debug output } // lex lexes the program by name with the given source. It returns a // channel on which the tokens are delivered. func Lex(name string, source []byte, debug bool) <-chan token { ch := make(chan token) l := &lexer{ input: string(source), tokens: ch, state: lexLine, debug: debug, } go func() { l.emit(lineStart) for l.state != nil { l.state = l.state(l) } l.emit(eof) close(l.tokens) }() return ch } // next returns the next rune in the program's source. func (l *lexer) next() (rune rune) { if l.pos >= len(l.input) { l.width = 0 return 0 } rune, l.width = utf8.DecodeRuneInString(l.input[l.pos:]) l.pos += l.width return rune } // backup backsup the last parsed element (multi-character) func (l *lexer) backup() { l.pos -= l.width } // peek returns the next rune but does not advance the seeker func (l *lexer) peek() rune { r := l.next() l.backup() return r } // ignore advances the seeker and ignores the value func (l *lexer) ignore() { l.start = l.pos } // Accepts checks whether the given input matches the next rune func (l *lexer) accept(valid string) bool { if strings.ContainsRune(valid, l.next()) { return true } l.backup() return false } // acceptRun will continue to advance the seeker until valid // can no longer be met. func (l *lexer) acceptRun(valid string) { for strings.ContainsRune(valid, l.next()) { } l.backup() } // acceptRunUntil is the inverse of acceptRun and will continue // to advance the seeker until the rune has been found. func (l *lexer) acceptRunUntil(until rune) bool { // Continues running until a rune is found for i := l.next(); !strings.ContainsRune(string(until), i); i = l.next() { if i == 0 { return false } } return true } // blob returns the current value func (l *lexer) blob() string { return l.input[l.start:l.pos] } // Emits a new token on to token channel for processing func (l *lexer) emit(t tokenType) { token := token{t, l.lineno, l.blob()} if l.debug { fmt.Fprintf(os.Stderr, "%04d: (%-20v) %s\n", token.lineno, token.typ, token.text) } l.tokens <- token l.start = l.pos } // lexLine is state function for lexing lines func lexLine(l *lexer) stateFn { for { switch r := l.next(); { case r == '\n': l.emit(lineEnd) l.ignore() l.lineno++ l.emit(lineStart) case r == ';' && l.peek() == ';': return lexComment case isSpace(r): l.ignore() case isLetter(r) || r == '_': return lexElement case isNumber(r): return lexNumber case r == '@': l.ignore() return lexLabel case r == '"': return lexInsideString default: return nil } } } // lexComment parses the current position until the end // of the line and discards the text. func lexComment(l *lexer) stateFn { l.acceptRunUntil('\n') l.ignore() return lexLine } // lexLabel parses the current label, emits and returns // the lex text state function to advance the parsing // process. func lexLabel(l *lexer) stateFn { l.acceptRun(Alpha + "_") l.emit(label) return lexLine } // lexInsideString lexes the inside of a string until // the state function finds the closing quote. // It returns the lex text state function. func lexInsideString(l *lexer) stateFn { if l.acceptRunUntil('"') { l.emit(stringValue) } return lexLine } func lexNumber(l *lexer) stateFn { acceptance := Numbers if l.accept("0") || l.accept("xX") { acceptance = HexadecimalNumbers } l.acceptRun(acceptance) l.emit(number) return lexLine } func lexElement(l *lexer) stateFn { l.acceptRun(Alpha + "_" + Numbers) if l.peek() == ':' { l.emit(labelDef) l.accept(":") l.ignore() } else { l.emit(element) } return lexLine } func isLetter(t rune) bool { return unicode.IsLetter(t) } func isSpace(t rune) bool { return unicode.IsSpace(t) } func isNumber(t rune) bool { return unicode.IsNumber(t) } ================================================ FILE: core/block_validator.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package core import ( "fmt" "github.com/sero-cash/go-sero/consensus" "github.com/sero-cash/go-sero/core/state" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/params" ) // BlockValidator is responsible for validating block headers and // processed state. // // BlockValidator implements Validator. type BlockValidator struct { config *params.ChainConfig // Chain configuration options bc *BlockChain // Canonical block chain engine consensus.Engine // Consensus engine used for validating } // NewBlockValidator returns a new block validator which is safe for re-use func NewBlockValidator(config *params.ChainConfig, blockchain *BlockChain, engine consensus.Engine) *BlockValidator { validator := &BlockValidator{ config: config, engine: engine, bc: blockchain, } return validator } // ValidateBody verifies the the block header's transaction. The headers are assumed to be already // validated at this point. func (v *BlockValidator) ValidateBody(block *types.Block) error { // Check whether the block's known, and if not, that it's linkable if v.bc.HasBlockAndState(block.Hash(), block.NumberU64()) { return ErrKnownBlock } if !v.bc.HasBlockAndState(block.ParentHash(), block.NumberU64()-1) { if !v.bc.HasBlock(block.ParentHash(), block.NumberU64()-1) { return consensus.ErrUnknownAncestor } return consensus.ErrPrunedAncestor } // Header validity is known at this point header := block.Header() if hash := types.DeriveSha(block.Transactions()); hash != header.TxHash { return fmt.Errorf("transaction root hash mismatch: have %x, want %x", hash, header.TxHash) } return nil } // ValidateState validates the various changes that happen after a state // transition, such as amount of used gas, the receipt roots and the state root // itself. ValidateState returns a database batch if the validation was a success // otherwise nil and an error is returned. func (v *BlockValidator) ValidateState(block, parent *types.Block, statedb *state.StateDB, receipts types.Receipts, usedGas uint64) error { header := block.Header() if block.GasUsed() != usedGas { return fmt.Errorf("invalid gas used (remote: %d local: %d)", block.GasUsed(), usedGas) } // Validate the received block's bloom with the one derived from the generated receipts. // For valid blocks this should always validate to true. rbloom := types.CreateBloom(receipts) if rbloom != header.Bloom { return fmt.Errorf("invalid bloom (remote: %x local: %x)", header.Bloom, rbloom) } // Tre receipt Trie's root (R = (Tr [[H1, R1], ... [Hn, R1]])) receiptSha := types.DeriveSha(receipts) if receiptSha != header.ReceiptHash { return fmt.Errorf("invalid receipt root hash (remote: %x local: %x)", header.ReceiptHash, receiptSha) } // Validate the state root against the received state root and throw // an error if they don't match. if root := statedb.IntermediateRoot(true); header.Root != root { return fmt.Errorf("invalid merkle root (remote: %x local: %x)", header.Root, root) } return nil } // CalcGasLimit computes the gas limit of the next block after parent. // This is miner strategy, not consensus protocol. func CalcGasLimit(parent *types.Block) uint64 { contrib := (parent.GasUsed() + parent.GasUsed()/2) divisor := uint64(1024) if contrib > parent.GasLimit() { divisor = uint64(128) } decav := parent.GasLimit()/divisor - 1 limit := parent.GasLimit() - decav + contrib/divisor if limit < params.MinGasLimit { limit = params.MinGasLimit } if limit < params.TargetGasLimit { limit = parent.GasLimit() + decav if limit > params.TargetGasLimit { limit = params.TargetGasLimit } } return limit } ================================================ FILE: core/block_validator_test.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package core import ( "runtime" "testing" "time" "github.com/sero-cash/go-czero-import/cpt" "github.com/sero-cash/go-sero/consensus/ethash" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/core/vm" "github.com/sero-cash/go-sero/params" "github.com/sero-cash/go-sero/serodb" ) // Tests that simple header verification works, for both good and bad blocks. func TestHeaderVerification(t *testing.T) { // Create a simple chain to verify cpt.ZeroInit_NoCircuit() var ( testdb = serodb.NewMemDatabase() gspec = &Genesis{Config: params.TestChainConfig} genesis = gspec.MustCommit(testdb) blocks, _ = GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), testdb, 8, nil) ) headers := make([]*types.Header, len(blocks)) for i, block := range blocks { headers[i] = block.Header() } // Run the header checker for blocks one-by-one, checking for both valid and invalid nonces chain, _ := NewBlockChain(testdb, nil, params.TestChainConfig, ethash.NewFaker(), vm.Config{}, nil) defer chain.Stop() for i := 0; i < len(blocks); i++ { for j, valid := range []bool{true, false} { var results <-chan error if valid { engine := ethash.NewFaker() _, results = engine.VerifyHeaders(chain, []*types.Header{headers[i]}, []bool{true}) } else { engine := ethash.NewFakeFailer(headers[i].Number.Uint64()) _, results = engine.VerifyHeaders(chain, []*types.Header{headers[i]}, []bool{true}) } // Wait for the verification result select { case result := <-results: if (result == nil) != valid { t.Errorf("test %d.%d: validity mismatch: have %v, want %v", i, j, result, valid) } case <-time.After(time.Second): t.Fatalf("test %d.%d: verification timeout", i, j) } // Make sure no more data is returned select { case result := <-results: t.Fatalf("test %d.%d: unexpected result returned: %v", i, j, result) case <-time.After(25 * time.Millisecond): } } chain.InsertChain(blocks[i : i+1]) } } // Tests that concurrent header verification works, for both good and bad blocks. func TestHeaderConcurrentVerification2(t *testing.T) { testHeaderConcurrentVerification(t, 2) } func TestHeaderConcurrentVerification8(t *testing.T) { testHeaderConcurrentVerification(t, 8) } func TestHeaderConcurrentVerification32(t *testing.T) { testHeaderConcurrentVerification(t, 32) } func testHeaderConcurrentVerification(t *testing.T, threads int) { // Create a simple chain to verify var ( testdb = serodb.NewMemDatabase() gspec = &Genesis{Config: params.TestChainConfig} genesis = gspec.MustCommit(testdb) blocks, _ = GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), testdb, 8, nil) ) headers := make([]*types.Header, len(blocks)) seals := make([]bool, len(blocks)) for i, block := range blocks { headers[i] = block.Header() seals[i] = true } // Set the number of threads to verify on old := runtime.GOMAXPROCS(threads) defer runtime.GOMAXPROCS(old) // Run the header checker for the entire block chain at once both for a valid and // also an invalid chain (enough if one arbitrary block is invalid). for i, valid := range []bool{true, false} { var results <-chan error if valid { chain, _ := NewBlockChain(testdb, nil, params.TestChainConfig, ethash.NewFaker(), vm.Config{}, nil) _, results = chain.engine.VerifyHeaders(chain, headers, seals) chain.Stop() } else { chain, _ := NewBlockChain(testdb, nil, params.TestChainConfig, ethash.NewFakeFailer(uint64(len(headers)-1)), vm.Config{}, nil) _, results = chain.engine.VerifyHeaders(chain, headers, seals) chain.Stop() } // Wait for all the verification results checks := make(map[int]error) for j := 0; j < len(blocks); j++ { select { case result := <-results: checks[j] = result case <-time.After(time.Second): t.Fatalf("test %d.%d: verification timeout", i, j) } } // Check nonce check validity for j := 0; j < len(blocks); j++ { want := valid || (j < len(blocks)-2) // We chose the last-but-one nonce in the chain to fail if (checks[j] == nil) != want { t.Errorf("test %d.%d: validity mismatch: have %v, want %v", i, j, checks[j], want) } if !want { // A few blocks after the first error may pass verification due to concurrent // workers. We don't care about those in this test, just that the correct block // errors out. break } } // Make sure no more data is returned select { case result := <-results: t.Fatalf("test %d: unexpected result returned: %v", i, result) case <-time.After(25 * time.Millisecond): } } } // Tests that aborting a header validation indeed prevents further checks from being // run, as well as checks that no left-over goroutines are leaked. func TestHeaderConcurrentAbortion2(t *testing.T) { testHeaderConcurrentAbortion(t, 2) } func TestHeaderConcurrentAbortion8(t *testing.T) { testHeaderConcurrentAbortion(t, 8) } func TestHeaderConcurrentAbortion32(t *testing.T) { testHeaderConcurrentAbortion(t, 32) } func testHeaderConcurrentAbortion(t *testing.T, threads int) { // Create a simple chain to verify var ( testdb = serodb.NewMemDatabase() gspec = &Genesis{Config: params.TestChainConfig} genesis = gspec.MustCommit(testdb) blocks, _ = GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), testdb, 1024, nil) ) headers := make([]*types.Header, len(blocks)) seals := make([]bool, len(blocks)) for i, block := range blocks { headers[i] = block.Header() seals[i] = true } // Set the number of threads to verify on old := runtime.GOMAXPROCS(threads) defer runtime.GOMAXPROCS(old) // Start the verifications and immediately abort chain, _ := NewBlockChain(testdb, nil, params.TestChainConfig, ethash.NewFakeDelayer(time.Millisecond), vm.Config{}, nil) defer chain.Stop() abort, results := chain.engine.VerifyHeaders(chain, headers, seals) close(abort) // Deplete the results channel verified := 0 for depleted := false; !depleted; { select { case result := <-results: if result != nil { t.Errorf("header %d: validation failed: %v", verified, result) } verified++ case <-time.After(50 * time.Millisecond): depleted = true } } // Check that abortion was honored by not processing too many POWs if verified > 2*threads { t.Errorf("verification count too large: have %d, want below %d", verified, 2*threads) } } ================================================ FILE: core/blockchain.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // Package core implements the Ethereum consensus protocol. package core import ( "bytes" "errors" "fmt" "io" "math/big" mrand "math/rand" "sync" "sync/atomic" "time" "github.com/sero-cash/go-sero/zero/zconfig" "github.com/sero-cash/go-sero/zero/txtool/verify" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-czero-import/seroparam" "github.com/sero-cash/go-sero/zero/stake" "github.com/hashicorp/golang-lru" "github.com/sero-cash/go-sero/accounts" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/common/mclock" "github.com/sero-cash/go-sero/consensus" "github.com/sero-cash/go-sero/core/rawdb" "github.com/sero-cash/go-sero/core/state" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/core/vm" "github.com/sero-cash/go-sero/event" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/metrics" "github.com/sero-cash/go-sero/params" "github.com/sero-cash/go-sero/rlp" "github.com/sero-cash/go-sero/serodb" "github.com/sero-cash/go-sero/trie" "github.com/sero-cash/go-sero/zero/txs/zstate" "gopkg.in/karalabe/cookiejar.v2/collections/prque" ) var ( blockInsertTimer = metrics.NewRegisteredTimer("chain/inserts", nil) ErrNoGenesis = errors.New("Genesis not found in chain") DelFn = func(db rawdb.DatabaseDeleter, hash common.Hash, num uint64) { rawdb.DeleteBody(db, hash, num) rawdb.DeleteHeader(db, hash, num) } ) const ( bodyCacheLimit = 256 blockCacheLimit = 256 maxFutureBlocks = 256 maxTimeFutureBlocks = 30 badBlockLimit = 10 triesInMemory = 128 // BlockChainVersion ensures that an incompatible database forces a resync from scratch. BlockChainVersion = 3 ) // CacheConfig contains the configuration values for the trie caching/pruning // that's resident in a blockchain. type CacheConfig struct { Disabled bool // Whether to disable trie write caching (archive node) TrieNodeLimit int // Memory limit (MB) at which to flush the current in-memory trie to disk TrieTimeLimit time.Duration // Time limit after which to flush the current in-memory trie to disk } type Downloader interface { Wait() Notify() } // BlockChain represents the canonical chain given a database with a genesis // block. The Blockchain manages chain imports, reverts, chain reorganisations. // // Importing blocks in to the block chain happens according to the set of rules // defined by the two stage Validator. Processing of blocks is done using the // Processor which processes the included transaction. The validation of the state // is done in the second part of the Validator. Failing results in aborting of // the import. // // The BlockChain also helps in returning blocks from **any** chain included // in the database as well as blocks that represents the canonical chain. It's // important to note that GetBlock can return any block and does not need to be // included in the canonical one where as GetBlockByNumber always represents the // canonical chain. type BlockChain struct { chainConfig *params.ChainConfig // Chain & network configuration cacheConfig *CacheConfig // Cache configuration for pruning db serodb.Database // Low level persistent database to store final content in triegc *prque.Prque // Priority queue mapping block numbers to tries to gc gcproc time.Duration // Accumulates canonical block processing for trie dumping hc *HeaderChain rmLogsFeed event.Feed chainFeed event.Feed chainSideFeed event.Feed chainHeadFeed event.Feed logsFeed event.Feed scope event.SubscriptionScope genesisBlock *types.Block mu sync.RWMutex // global mutex for locking chain operations chainmu sync.RWMutex // blockchain insertion lock procmu sync.RWMutex // block processor lock checkpoint int // checkpoint counts towards the new checkpoint currentBlock atomic.Value // Current head of the block chain currentFastBlock atomic.Value // Current head of the fast-sync chain (may be above the block chain!) stateCache state.Database // State database to reuse between imports (contains state cache) bodyCache *lru.Cache // Cache for the most recent block bodies bodyRLPCache *lru.Cache // Cache for the most recent block bodies in RLP encoded format blockCache *lru.Cache // Cache for the most recent entire blocks futureBlocks *lru.Cache // future blocks are blocks added for later processing quit chan struct{} // blockchain quit channel running int32 // running must be called atomically // procInterrupt must be atomically called procInterrupt int32 // interrupt signaler for block processing wg sync.WaitGroup // chain processing wait group for shutting down engine consensus.Engine processor Processor // block processor interface validator Validator // block and state validator interface vmConfig vm.Config badBlocks *lru.Cache // Bad block cache accountManager *accounts.Manager } // NewBlockChain returns a fully initialised block chain using information // available in the database. It initialises the default Ethereum Validator and // Processor. func NewBlockChain(db serodb.Database, cacheConfig *CacheConfig, chainConfig *params.ChainConfig, engine consensus.Engine, vmConfig vm.Config, accountManager *accounts.Manager) (*BlockChain, error) { if cacheConfig == nil { cacheConfig = &CacheConfig{ TrieNodeLimit: 256 * 1024 * 1024, TrieTimeLimit: 5 * time.Minute, } } bodyCache, _ := lru.New(bodyCacheLimit) bodyRLPCache, _ := lru.New(bodyCacheLimit) blockCache, _ := lru.New(blockCacheLimit) futureBlocks, _ := lru.New(maxFutureBlocks) badBlocks, _ := lru.New(badBlockLimit) bc := &BlockChain{ chainConfig: chainConfig, cacheConfig: cacheConfig, db: db, triegc: prque.New(), stateCache: state.NewDatabase(db), quit: make(chan struct{}), bodyCache: bodyCache, bodyRLPCache: bodyRLPCache, blockCache: blockCache, futureBlocks: futureBlocks, engine: engine, vmConfig: vmConfig, badBlocks: badBlocks, } bc.SetValidator(NewBlockValidator(chainConfig, bc, engine)) bc.SetProcessor(NewStateProcessor(chainConfig, bc, engine)) bc.accountManager = accountManager var err error bc.hc, err = NewHeaderChain(db, chainConfig, engine, bc.getProcInterrupt) if err != nil { return nil, err } bc.genesisBlock = bc.GetBlockByNumber(0) if bc.genesisBlock == nil { return nil, ErrNoGenesis } if err := bc.loadLastState(); err != nil { return nil, err } // Take ownership of this particular state go bc.update() return bc, nil } func (bc *BlockChain) getProcInterrupt() bool { return atomic.LoadInt32(&bc.procInterrupt) == 1 } type State1BlockChain struct { Bc *BlockChain } func (self *State1BlockChain) GetBlockByNumber(num uint64) *types.Block { return self.Bc.GetBlockByNumber(num) } func (self *State1BlockChain) GetHeaderByNumber(num uint64) *types.Header { return self.Bc.GetHeaderByNumber(num) } func (self *State1BlockChain) GetDB() serodb.Database { return self.Bc.db } func (self *State1BlockChain) GetCurrenHeader() *types.Header { return self.Bc.CurrentBlock().Header() } func (self *State1BlockChain) GetHeader(hash *common.Hash) *types.Header { return self.Bc.GetHeaderByHash(*hash) } func (self *State1BlockChain) IsContract(address common.Address) (ret bool, e error) { empty := common.Hash{} if bytes.Compare(address[64:], empty[:]) != 0 { ret = false return } if state, err := self.Bc.State(); err != nil { e = err return } else { if state.GetCodeSize(address) > 0 { ret = true return } else { ret = false return } } } func (self *State1BlockChain) IsValid() bool { header := self.Bc.CurrentHeader() if header.Number.Uint64() < seroparam.DefaultConfirmedBlock() { return false } if _, e := state.New(self.Bc.stateCache, header); e != nil { return false } return true } func (self *State1BlockChain) GetSeroGasLimit(to *common.Address, tfee *assets.Token, gas *big.Int) (gaslimit uint64, e error) { if state, err := self.Bc.State(); err != nil { e = err return } else { return state.GetSeroGasLimit(to, tfee, gas) } } func (self *State1BlockChain) CurrentState(hash *common.Hash) *zstate.ZState { header := self.Bc.GetHeaderByHash(*hash) var st *state.StateDB var e error st, e = state.New(self.Bc.stateCache, header) if e != nil { panic(e) } return st.CurrentZState() } func (self *State1BlockChain) GetTks() []c_type.Tk { tks := []c_type.Tk{} for _, w := range self.Bc.accountManager.Wallets() { tk := w.Accounts()[0].Tk tks = append(tks, tk.ToTk()) } return tks } func (self *State1BlockChain) GetTkAt(tk *c_type.Tk) uint64 { for _, w := range self.Bc.accountManager.Wallets() { if w.Accounts()[0].Tk.ToTk() == *tk { return w.Accounts()[0].At } } return 0 } func (bc *BlockChain) GetDB() serodb.Database { return bc.db } // loadLastState loads the last known chain state from the database. This method // assumes that the chain manager mutex is held. func (bc *BlockChain) loadLastState() error { // Restore the last known head block head := rawdb.ReadHeadBlockHash(bc.db) if head == (common.Hash{}) { // Corrupt or empty database, init from scratch log.Warn("Empty database, resetting chain") return bc.Reset() } var currentBlock *types.Block var currentHeader *types.Header if seroparam.DefaultCurrentBlock() > 0 { currentBlock = bc.GetBlockByNumber(seroparam.DefaultCurrentBlock()) bc.currentBlock.Store(currentBlock) currentHeader = currentBlock.Header() bc.hc.SetCurrentHeader(currentHeader) bc.currentFastBlock.Store(currentBlock) } else { // Make sure the entire head block is available currentBlock = bc.GetBlockByHash(head) if currentBlock == nil { // Corrupt or empty database, init from scratch log.Warn("Head block missing, resetting chain", "hash", head) return bc.Reset() } // Make sure the state associated with the block is available if _, err := state.New(bc.stateCache, currentBlock.Header()); err != nil { // Dangling block without a state associated, init from scratch log.Warn("Head state missing, repairing chain", "number", currentBlock.Number(), "hash", currentBlock.Hash()) if err := bc.repair(¤tBlock); err != nil { return err } } // Everything seems to be fine, set as the head block bc.currentBlock.Store(currentBlock) // Restore the last known head header currentHeader = currentBlock.Header() if head := rawdb.ReadHeadHeaderHash(bc.db); head != (common.Hash{}) { if header := bc.GetHeaderByHash(head); header != nil { currentHeader = header } } bc.hc.SetCurrentHeader(currentHeader) // Restore the last known head fast block bc.currentFastBlock.Store(currentBlock) if head := rawdb.ReadHeadFastBlockHash(bc.db); head != (common.Hash{}) { if block := bc.GetBlockByHash(head); block != nil { bc.currentFastBlock.Store(block) } } } // Issue a status log for the user currentFastBlock := bc.CurrentFastBlock() headerTd := bc.GetTd(currentHeader.Hash(), currentHeader.Number.Uint64()) blockTd := bc.GetTd(currentBlock.Hash(), currentBlock.NumberU64()) fastTd := bc.GetTd(currentFastBlock.Hash(), currentFastBlock.NumberU64()) log.Info("Loaded most recent local header", "number", currentHeader.Number, "hash", currentHeader.Hash(), "td", headerTd) log.Info("Loaded most recent local full block", "number", currentBlock.Number(), "hash", currentBlock.Hash(), "td", blockTd) log.Info("Loaded most recent local fast block", "number", currentFastBlock.Number(), "hash", currentFastBlock.Hash(), "td", fastTd) return nil } // SetHead rewinds the local chain to a new head. In the case of headers, everything // above the new head will be deleted and the new one set. In the case of blocks // though, the head may be further rewound if block bodies are missing (non-archive // nodes after a fast sync). func (bc *BlockChain) SetHead(head uint64, delFn DeleteCallback) error { log.Warn("Rewinding blockchain", "target", head) bc.mu.Lock() defer bc.mu.Unlock() // Rewind the header chain, deleting all block bodies until then bc.hc.SetHead(head, delFn) currentHeader := bc.hc.CurrentHeader() // Clear out any stale content from the caches bc.bodyCache.Purge() bc.bodyRLPCache.Purge() bc.blockCache.Purge() bc.futureBlocks.Purge() // Rewind the block chain, ensuring we don't end up with a stateless head block if currentBlock := bc.CurrentBlock(); currentBlock != nil && currentHeader.Number.Uint64() < currentBlock.NumberU64() { bc.currentBlock.Store(bc.GetBlock(currentHeader.Hash(), currentHeader.Number.Uint64())) } if currentBlock := bc.CurrentBlock(); currentBlock != nil { if _, err := state.New(bc.stateCache, currentBlock.Header()); err != nil { // Rewound state missing, rolled back to before pivot, reset to genesis bc.currentBlock.Store(bc.genesisBlock) } } // Rewind the fast block in a simpleton way to the target head if currentFastBlock := bc.CurrentFastBlock(); currentFastBlock != nil && currentHeader.Number.Uint64() < currentFastBlock.NumberU64() { bc.currentFastBlock.Store(bc.GetBlock(currentHeader.Hash(), currentHeader.Number.Uint64())) } // If either blocks reached nil, reset to the genesis state if currentBlock := bc.CurrentBlock(); currentBlock == nil { bc.currentBlock.Store(bc.genesisBlock) } if currentFastBlock := bc.CurrentFastBlock(); currentFastBlock == nil { bc.currentFastBlock.Store(bc.genesisBlock) } currentBlock := bc.CurrentBlock() currentFastBlock := bc.CurrentFastBlock() rawdb.WriteHeadBlockHash(bc.db, currentBlock.Hash()) rawdb.WriteHeadFastBlockHash(bc.db, currentFastBlock.Hash()) return bc.loadLastState() } // FastSyncCommitHead sets the current head block to the one defined by the hash // irrelevant what the chain contents were prior. func (bc *BlockChain) FastSyncCommitHead(hash common.Hash) error { // Make sure that both the block as well at its state trie exists block := bc.GetBlockByHash(hash) if block == nil { return fmt.Errorf("non existent block [%x…]", hash[:4]) } if _, err := trie.NewSecure(block.Root(), bc.stateCache.TrieDB(), 0); err != nil { return err } // If all checks out, manually set the head block bc.mu.Lock() bc.currentBlock.Store(block) bc.mu.Unlock() log.Info("Committed new head block", "number", block.Number(), "hash", hash) return nil } // GasLimit returns the gas limit of the current HEAD block. func (bc *BlockChain) GasLimit() uint64 { return bc.CurrentBlock().GasLimit() } // CurrentBlock retrieves the current head block of the canonical chain. The // block is retrieved from the blockchain's internal cache. func (bc *BlockChain) CurrentBlock() *types.Block { return bc.currentBlock.Load().(*types.Block) } // CurrentFastBlock retrieves the current fast-sync head block of the canonical // chain. The block is retrieved from the blockchain's internal cache. func (bc *BlockChain) CurrentFastBlock() *types.Block { return bc.currentFastBlock.Load().(*types.Block) } // SetProcessor sets the processor required for making state modifications. func (bc *BlockChain) SetProcessor(processor Processor) { bc.procmu.Lock() defer bc.procmu.Unlock() bc.processor = processor } // SetValidator sets the validator which is used to validate incoming blocks. func (bc *BlockChain) SetValidator(validator Validator) { bc.procmu.Lock() defer bc.procmu.Unlock() bc.validator = validator } // Validator returns the current validator. func (bc *BlockChain) Validator() Validator { bc.procmu.RLock() defer bc.procmu.RUnlock() return bc.validator } // Processor returns the current processor. func (bc *BlockChain) Processor() Processor { bc.procmu.RLock() defer bc.procmu.RUnlock() return bc.processor } // State returns a new mutable state based on the current HEAD block. func (bc *BlockChain) State() (*state.StateDB, error) { block := bc.CurrentBlock() return bc.StateAt(block.Header()) } // StateAt returns a new mutable state based on a particular point in time. func (bc *BlockChain) StateAt(header *types.Header) (*state.StateDB, error) { return state.New(bc.stateCache, header) } // Reset purges the entire blockchain, restoring it to its genesis state. func (bc *BlockChain) Reset() error { return bc.ResetWithGenesisBlock(bc.genesisBlock) } // ResetWithGenesisBlock purges the entire blockchain, restoring it to the // specified genesis state. func (bc *BlockChain) ResetWithGenesisBlock(genesis *types.Block) error { // Dump the entire block chain and purge the caches if err := bc.SetHead(0, DelFn); err != nil { return err } bc.mu.Lock() defer bc.mu.Unlock() // Prepare the genesis block and reinitialise the chain if err := bc.hc.WriteTd(genesis.Hash(), genesis.NumberU64(), genesis.Difficulty()); err != nil { log.Crit("Failed to write genesis block TD", "err", err) } rawdb.WriteBlock(bc.db, genesis) bc.genesisBlock = genesis bc.insert(bc.genesisBlock) bc.currentBlock.Store(bc.genesisBlock) bc.hc.SetGenesis(bc.genesisBlock.Header()) bc.hc.SetCurrentHeader(bc.genesisBlock.Header()) bc.currentFastBlock.Store(bc.genesisBlock) return nil } // repair tries to repair the current blockchain by rolling back the current block // until one with associated state is found. This is needed to fix incomplete db // writes caused either by crashes/power outages, or simply non-committed tries. // // This method only rolls back the current block. The current header and current // fast block are left intact. func (bc *BlockChain) repair(head **types.Block) error { for { // Abort if we've rewound to a head block that does have associated state if _, err := state.New(bc.stateCache, (*head).Header()); err == nil { log.Info("Rewound blockchain to past state", "number", (*head).Number(), "hash", (*head).Hash()) return nil } // Otherwise rewind one block and recheck state availability there (*head) = bc.GetBlock((*head).ParentHash(), (*head).NumberU64()-1) } } // Export writes the active chain to the given writer. func (bc *BlockChain) Export(w io.Writer) error { return bc.ExportN(w, uint64(0), bc.CurrentBlock().NumberU64()) } // ExportN writes a subset of the active chain to the given writer. func (bc *BlockChain) ExportN(w io.Writer, first uint64, last uint64) error { bc.mu.RLock() defer bc.mu.RUnlock() if first > last { return fmt.Errorf("export failed: first (%d) is greater than last (%d)", first, last) } log.Info("Exporting batch of blocks", "count", last-first+1) start, reported := time.Now(), time.Now() for nr := first; nr <= last; nr++ { block := bc.GetBlockByNumber(nr) if block == nil { return fmt.Errorf("export failed on #%d: not found", nr) } if err := block.EncodeRLP(w); err != nil { return err } if time.Since(reported) >= statsReportLimit { log.Info("Exporting blocks", "exported", block.NumberU64()-first, "elapsed", common.PrettyDuration(time.Since(start))) reported = time.Now() } } return nil } // insert injects a new head block into the current block chain. This method // assumes that the block is indeed a true head. It will also reset the head // header and the head fast sync block to this very same block if they are older // or if they are on a different side chain. // // Note, this function assumes that the `mu` mutex is held! func (bc *BlockChain) insert(block *types.Block) { // If the block is on a side chain or an unknown one, force other heads onto it too updateHeads := rawdb.ReadCanonicalHash(bc.db, block.NumberU64()) != block.Hash() // Add the block to the canonical chain number scheme and mark as the head rawdb.WriteCanonicalHash(bc.db, block.Hash(), block.NumberU64()) rawdb.WriteHeadBlockHash(bc.db, block.Hash()) bc.currentBlock.Store(block) // If the block is better than our head or is on a different chain, force update heads if updateHeads { bc.hc.SetCurrentHeader(block.Header()) rawdb.WriteHeadFastBlockHash(bc.db, block.Hash()) bc.currentFastBlock.Store(block) } } // Genesis retrieves the chain's genesis block. func (bc *BlockChain) Genesis() *types.Block { return bc.genesisBlock } // GetBody retrieves a block body (transactions) from the database by // hash, caching it if found. func (bc *BlockChain) GetBody(hash common.Hash) *types.Body { // Short circuit if the body's already in the cache, retrieve otherwise if cached, ok := bc.bodyCache.Get(hash); ok { body := cached.(*types.Body) return body } number := bc.hc.GetBlockNumber(hash) if number == nil { return nil } body := rawdb.ReadBody(bc.db, hash, *number) if body == nil { return nil } // Cache the found body for next time and return bc.bodyCache.Add(hash, body) return body } // GetBodyRLP retrieves a block body in RLP encoding from the database by hash, // caching it if found. func (bc *BlockChain) GetBodyRLP(hash common.Hash) rlp.RawValue { // Short circuit if the body's already in the cache, retrieve otherwise if cached, ok := bc.bodyRLPCache.Get(hash); ok { return cached.(rlp.RawValue) } number := bc.hc.GetBlockNumber(hash) if number == nil { return nil } body := rawdb.ReadBodyRLP(bc.db, hash, *number) if len(body) == 0 { return nil } // Cache the found body for next time and return bc.bodyRLPCache.Add(hash, body) return body } // HasBlock checks if a block is fully present in the database or not. func (bc *BlockChain) HasBlock(hash common.Hash, number uint64) bool { if bc.blockCache.Contains(hash) { return true } return rawdb.HasBody(bc.db, hash, number) } // HasState checks if state trie is fully present in the database or not. func (bc *BlockChain) HasState(hash common.Hash) bool { _, err := bc.stateCache.OpenTrie(hash) return err == nil } // HasBlockAndState checks if a block and associated state trie is fully present // in the database or not, caching it if present. func (bc *BlockChain) HasBlockAndState(hash common.Hash, number uint64) bool { // Check first that the block itself is known block := bc.GetBlock(hash, number) if block == nil { return false } return bc.HasState(block.Root()) } // GetBlock retrieves a block from the database by hash and number, // caching it if found. func (bc *BlockChain) GetBlock(hash common.Hash, number uint64) *types.Block { // Short circuit if the block's already in the cache, retrieve otherwise if block, ok := bc.blockCache.Get(hash); ok { return block.(*types.Block) } block := rawdb.ReadBlock(bc.db, hash, number) if block == nil { return nil } // Cache the found block for next time and return bc.blockCache.Add(block.Hash(), block) return block } // GetBlockByHash retrieves a block from the database by hash, caching it if found. func (bc *BlockChain) GetBlockByHash(hash common.Hash) *types.Block { number := bc.hc.GetBlockNumber(hash) if number == nil { return nil } return bc.GetBlock(hash, *number) } // GetBlockByNumber retrieves a block from the database by number, caching it // (associated with its hash) if found. func (bc *BlockChain) GetBlockByNumber(number uint64) *types.Block { hash := rawdb.ReadCanonicalHash(bc.db, number) if hash == (common.Hash{}) { return nil } return bc.GetBlock(hash, number) } // GetReceiptsByHash retrieves the receipts for all transactions in a given block. func (bc *BlockChain) GetReceiptsByHash(hash common.Hash) types.Receipts { number := rawdb.ReadHeaderNumber(bc.db, hash) if number == nil { return nil } return rawdb.ReadReceipts(bc.db, hash, *number) } // GetBlocksFromHash returns the block corresponding to hash and up to n-1 ancestors. // [deprecated by sero/62] func (bc *BlockChain) GetBlocksFromHash(hash common.Hash, n int) (blocks []*types.Block) { number := bc.hc.GetBlockNumber(hash) if number == nil { return nil } for i := 0; i < n; i++ { block := bc.GetBlock(hash, *number) if block == nil { break } blocks = append(blocks, block) hash = block.ParentHash() *number-- } return } // TrieNode retrieves a blob of data associated with a trie node (or code hash) // either from ephemeral in-memory cache, or from persistent storage. func (bc *BlockChain) TrieNode(hash common.Hash) ([]byte, error) { return bc.stateCache.TrieDB().Node(hash) } // Stop stops the blockchain service. If any imports are currently in progress // it will abort them using the procInterrupt. func (bc *BlockChain) Stop() { if !atomic.CompareAndSwapInt32(&bc.running, 0, 1) { return } // Unsubscribe all subscriptions registered from blockchain bc.scope.Close() close(bc.quit) //bc.stopLock.Lock() atomic.StoreInt32(&bc.procInterrupt, 1) //bc.stopLock.Unlock() bc.wg.Wait() // Ensure the state of a recent block is also stored to disk before exiting. // We're writing three different states to catch different restart scenarios: // - HEAD: So we don't need to reprocess any blocks in the general case // - HEAD-127: So we have a hard limit on the number of blocks reexecuted if !bc.cacheConfig.Disabled { triedb := bc.stateCache.TrieDB() for _, offset := range []uint64{0, 1, triesInMemory - 1} { if number := bc.CurrentBlock().NumberU64(); number > offset { recent := bc.GetBlockByNumber(number - offset) log.Info("Writing cached state to disk", "block", recent.Number(), "hash", recent.Hash(), "root", recent.Root()) if err := triedb.Commit(recent.Root(), true); err != nil { log.Error("Failed to commit recent state trie", "err", err) } } } for !bc.triegc.Empty() { triedb.Dereference(bc.triegc.PopItem().(common.Hash)) } if size, _ := triedb.Size(); size != 0 { log.Error("Dangling trie nodes after full cleanup") } } log.Info("Blockchain manager stopped") } func (bc *BlockChain) procFutureBlocks() { blocks := make([]*types.Block, 0, bc.futureBlocks.Len()) for _, hash := range bc.futureBlocks.Keys() { if block, exist := bc.futureBlocks.Peek(hash); exist { blocks = append(blocks, block.(*types.Block)) } } if len(blocks) > 0 { types.BlockBy(types.Number).Sort(blocks) // Insert one by one as chain insertion needs contiguous ancestry between blocks for i := range blocks { bc.InsertChain(blocks[i : i+1]) } } } // WriteStatus status of write type WriteStatus byte const ( NonStatTy WriteStatus = iota CanonStatTy SideStatTy ) // Rollback is designed to remove a chain of links from the database that aren't // certain enough to be valid. func (bc *BlockChain) Rollback(chain []common.Hash) { bc.mu.Lock() defer bc.mu.Unlock() for i := len(chain) - 1; i >= 0; i-- { hash := chain[i] currentHeader := bc.hc.CurrentHeader() if currentHeader.Hash() == hash { bc.hc.SetCurrentHeader(bc.GetHeader(currentHeader.ParentHash, currentHeader.Number.Uint64()-1)) } if currentFastBlock := bc.CurrentFastBlock(); currentFastBlock.Hash() == hash { newFastBlock := bc.GetBlock(currentFastBlock.ParentHash(), currentFastBlock.NumberU64()-1) bc.currentFastBlock.Store(newFastBlock) rawdb.WriteHeadFastBlockHash(bc.db, newFastBlock.Hash()) } if currentBlock := bc.CurrentBlock(); currentBlock.Hash() == hash { newBlock := bc.GetBlock(currentBlock.ParentHash(), currentBlock.NumberU64()-1) bc.currentBlock.Store(newBlock) rawdb.WriteHeadBlockHash(bc.db, newBlock.Hash()) } } } // SetReceiptsData computes all the non-consensus fields of the receipts func SetReceiptsData(config *params.ChainConfig, block *types.Block, receipts types.Receipts) error { //abi := types.MakeSigner(config, block.Number()) transactions, logIndex := block.Transactions(), uint(0) if len(transactions) != len(receipts) { return errors.New("transaction and receipt count mismatch") } for j := 0; j < len(receipts); j++ { // The transaction hash can be retrieved from the transaction itself receipts[j].TxHash = transactions[j].Hash() // The used gas can be calculated based on previous receipts if j == 0 { receipts[j].GasUsed = receipts[j].CumulativeGasUsed } else { receipts[j].GasUsed = receipts[j].CumulativeGasUsed - receipts[j-1].CumulativeGasUsed } // The derived log fields can simply be set from the block and transaction for k := 0; k < len(receipts[j].Logs); k++ { receipts[j].Logs[k].BlockNumber = block.NumberU64() receipts[j].Logs[k].BlockHash = block.Hash() receipts[j].Logs[k].TxHash = receipts[j].TxHash receipts[j].Logs[k].TxIndex = uint(j) receipts[j].Logs[k].Index = logIndex logIndex++ } } return nil } // InsertReceiptChain attempts to complete an already existing header chain with // transaction and receipt data. func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain []types.Receipts) (int, error) { bc.wg.Add(1) defer bc.wg.Done() // Do a sanity check that the provided chain is actually ordered and linked for i := 1; i < len(blockChain); i++ { if blockChain[i].NumberU64() != blockChain[i-1].NumberU64()+1 || blockChain[i].ParentHash() != blockChain[i-1].Hash() { log.Error("Non contiguous receipt insert", "number", blockChain[i].Number(), "hash", blockChain[i].Hash(), "parent", blockChain[i].ParentHash(), "prevnumber", blockChain[i-1].Number(), "prevhash", blockChain[i-1].Hash()) return 0, fmt.Errorf("non contiguous insert: item %d is #%d [%x…], item %d is #%d [%x…] (parent [%x…])", i-1, blockChain[i-1].NumberU64(), blockChain[i-1].Hash().Bytes()[:4], i, blockChain[i].NumberU64(), blockChain[i].Hash().Bytes()[:4], blockChain[i].ParentHash().Bytes()[:4]) } } var ( stats = struct{ processed, ignored int32 }{} start = time.Now() bytes = 0 batch = bc.db.NewBatch() ) for i, block := range blockChain { receipts := receiptChain[i] // Short circuit insertion if shutting down or processing failed if atomic.LoadInt32(&bc.procInterrupt) == 1 { return 0, nil } // Short circuit if the owner header is unknown if !bc.HasHeader(block.Hash(), block.NumberU64()) { return i, fmt.Errorf("containing header #%d [%x…] unknown", block.Number(), block.Hash().Bytes()[:4]) } // Skip if the entire data is already known if bc.HasBlock(block.Hash(), block.NumberU64()) { stats.ignored++ continue } // Compute all the non-consensus fields of the receipts if err := SetReceiptsData(bc.chainConfig, block, receipts); err != nil { return i, fmt.Errorf("failed to set receipts data: %v", err) } // Write all the data out into the database rawdb.WriteBody(batch, block.Hash(), block.NumberU64(), block.Body()) rawdb.WriteReceipts(batch, block.Hash(), block.NumberU64(), receipts) rawdb.WriteTxLookupEntries(batch, block) stats.processed++ if batch.ValueSize() >= serodb.IdealBatchSize { if err := batch.Write(); err != nil { return 0, err } bytes += batch.ValueSize() batch.Reset() } } if batch.ValueSize() > 0 { bytes += batch.ValueSize() if err := batch.Write(); err != nil { return 0, err } } // Update the head fast sync block if better bc.mu.Lock() head := blockChain[len(blockChain)-1] if td := bc.GetTd(head.Hash(), head.NumberU64()); td != nil { // Rewind may have occurred, skip in that case currentFastBlock := bc.CurrentFastBlock() if bc.GetTd(currentFastBlock.Hash(), currentFastBlock.NumberU64()).Cmp(td) < 0 { rawdb.WriteHeadFastBlockHash(bc.db, head.Hash()) bc.currentFastBlock.Store(head) } } bc.mu.Unlock() log.Info("Imported new block receipts", "count", stats.processed, "elapsed", common.PrettyDuration(time.Since(start)), "number", head.Number(), "hash", head.Hash(), "size", common.StorageSize(bytes), "ignored", stats.ignored) return 0, nil } var lastWrite uint64 // WriteBlockWithoutState writes only the block and its metadata to the database, // but does not write any state. This is used to construct competing side forks // up to the point where they exceed the canonical total difficulty. func (bc *BlockChain) WriteBlockWithoutState(block *types.Block, td *big.Int) (err error) { bc.wg.Add(1) defer bc.wg.Done() if err := bc.hc.WriteTd(block.Hash(), block.NumberU64(), td); err != nil { return err } rawdb.WriteBlock(bc.db, block) return nil } /*func (bc *BlockChain) WriteBlockWithStateWithStopLock(block *types.Block, receipts []*types.Receipt, state *state.StateDB) (status WriteStatus, err error) { bc.stopLock.Lock() defer bc.stopLock.Unlock() if atomic.LoadInt32(&bc.procInterrupt) == 1 { return NonStatTy, errors.New("bc already stoped") } else { return bc.WriteBlockWithState(block, receipts, state) } } */ // WriteBlockWithState writes the block and all associated state to the database. func (bc *BlockChain) WriteBlockWithState(block *types.Block, receipts []*types.Receipt, state *state.StateDB) (status WriteStatus, err error) { bc.wg.Add(1) defer bc.wg.Done() // Calculate the total difficulty of the block ptd := bc.GetTd(block.ParentHash(), block.NumberU64()-1) if ptd == nil { return NonStatTy, consensus.ErrUnknownAncestor } // Make sure no inconsistent state is leaked during insertion bc.mu.Lock() defer bc.mu.Unlock() currentBlock := bc.CurrentBlock() localTd := bc.GetTd(currentBlock.Hash(), currentBlock.NumberU64()) externTd := new(big.Int).Add(block.Difficulty(), ptd) // Irrelevant of the canonical status, write the block itself to the database if err := bc.hc.WriteTd(block.Hash(), block.NumberU64(), externTd); err != nil { return NonStatTy, err } // Write other block data using a batch. batch := bc.db.NewBatch() rawdb.WriteBlock(batch, block) blockhash := block.Hash() if block.Header().Number.Uint64() >= seroparam.SIP4() { state.GetStakeCons().Record(block.Header(), batch) stakeState := stake.NewStakeState(state) err = stakeState.RecordVotes(batch, block) if err != nil { log.Info("write block with pos", "err", err) return NonStatTy, err } } state.NextZState().RecordBlock(batch, blockhash.HashToUint256()) root, err := state.Commit(true) if root != block.Root() { log.Info("WiriteBlockWithState root not equal Error", "root", root, "block.root", block.Root()) return NonStatTy, err } if err != nil { log.Error("WriteBlockWithState.Commit Error:", "root", root, "err", err) return NonStatTy, err } if block.Number().Uint64() <= zconfig.CheckPoints.MaxNum() { if err := zconfig.CheckPoints.Check(block.NumberU64(), block.Header().Root[:]); err != nil { log.Error("WriteBlockWithState.CheckPoints.Check Error:", "root", root, "err", err) return NonStatTy, err } } triedb := bc.stateCache.TrieDB() // If we're running an archive node, always flush if bc.cacheConfig.Disabled { if err := triedb.Commit(root, false); err != nil { return NonStatTy, err } } else { // Full but not archive node, do proper garbage collection triedb.Reference(root, common.Hash{}) // metadata reference to keep trie alive bc.triegc.Push(root, -float32(block.NumberU64())) if current := block.NumberU64(); current > triesInMemory { // If we exceeded our memory allowance, flush matured singleton nodes to disk var ( nodes, imgs = triedb.Size() limit = common.StorageSize(bc.cacheConfig.TrieNodeLimit) * 1024 * 1024 ) if nodes > limit || imgs > 4*1024*1024 { triedb.Cap(limit - serodb.IdealBatchSize) } // Find the next state trie we need to commit header := bc.GetHeaderByNumber(current - triesInMemory) chosen := header.Number.Uint64() var needCommit bool if zconfig.IsSnapshotMode() { needCommit = zconfig.NeedSnapshot(block.NumberU64()) } else { needCommit = (bc.gcproc > bc.cacheConfig.TrieTimeLimit) || (header.Number.Uint64()%10000 == 0) } // If we exceeded out time allowance, flush an entire trie to disk if needCommit { // If we're exceeding limits but haven't reached a large enough memory gap, // warn the user that the system is becoming unstable. if chosen < lastWrite+triesInMemory && bc.gcproc >= 2*bc.cacheConfig.TrieTimeLimit { log.Info("State in memory for too long, committing", "time", bc.gcproc, "allowance", bc.cacheConfig.TrieTimeLimit, "optimum", float64(chosen-lastWrite)/triesInMemory) } // Flush an entire trie and restart the counters triedb.Commit(header.Root, true) lastWrite = chosen bc.gcproc = 0 } // Garbage collect anything below our required write retention for !bc.triegc.Empty() { root, number := bc.triegc.Pop() if uint64(-number) > chosen { bc.triegc.Push(root, number) break } triedb.Dereference(root.(common.Hash)) } } } rawdb.WriteReceipts(batch, block.Hash(), block.NumberU64(), receipts) // If the total difficulty is higher than our known, add it to the canonical chain // Second clause in the if statement reduces the vulnerability to selfish mining. // Please refer to http://www.cs.cornell.edu/~ie53/publications/btcProcFC.pdf reorg := externTd.Cmp(localTd) > 0 currentBlock = bc.CurrentBlock() if !reorg && externTd.Cmp(localTd) == 0 { // Split same-difficulty blocks by number, then at random reorg = block.NumberU64() < currentBlock.NumberU64() if !reorg && block.NumberU64() == currentBlock.NumberU64() { if block.NumberU64() < seroparam.SIP4() { if block.Transactions().Len() == currentBlock.Transactions().Len() { reorg = mrand.Float64() < 0.5 } else { reorg = block.Transactions().Len() > currentBlock.Transactions().Len() } } else { if len(block.Header().CurrentVotes) == len(currentBlock.Header().CurrentVotes) { if block.Transactions().Len() == currentBlock.Transactions().Len() { reorg = mrand.Float64() < 0.5 } else { reorg = block.Transactions().Len() > currentBlock.Transactions().Len() } } else { reorg = len(block.Header().CurrentVotes) > len(currentBlock.Header().CurrentVotes) } } } } if reorg { // Reorganise the chain if the parent is not the head block if block.ParentHash() != currentBlock.Hash() { if err := bc.reorg(currentBlock, block); err != nil { return NonStatTy, err } } // Write the positional metadata for transaction/receipt lookups and preimages rawdb.WriteTxLookupEntries(batch, block) rawdb.WritePreimages(batch, block.NumberU64(), state.Preimages()) status = CanonStatTy } else { status = SideStatTy } if err := batch.Write(); err != nil { return NonStatTy, err } // Set new head. if status == CanonStatTy { bc.insert(block) } bc.futureBlocks.Remove(block.Hash()) return status, nil } // InsertChain attempts to insert the given batch of blocks in to the canonical // chain or, otherwise, create a fork. If an error is returned it will return // the index number of the failing block as well an error describing what went // wrong. // // After insertion is done, all accumulated events will be fired. func (bc *BlockChain) InsertChain(chain types.Blocks) (int, error) { n, events, logs, err := bc.insertChain(chain, false) bc.PostChainEvents(events, logs) return n, err } func test(i interface{}) {} func (bc *BlockChain) NewHeaderChecker(chain types.Blocks) (chan<- struct{}, <-chan error) { headers := make([]*types.Header, len(chain)) seals := make([]bool, len(chain)) for i, block := range chain { headers[i] = block.Header() seals[i] = true } return bc.engine.VerifyHeaders(bc, headers, seals) } // insertChain will execute the actual chain insertion and event aggregation. The // only reason this method exists as a separate one is to make locking cleaner // with deferred statements. func (bc *BlockChain) insertChain(chain types.Blocks, local bool) (int, []interface{}, []*types.Log, error) { // Sanity check that we have something meaningful to import if len(chain) == 0 { return 0, nil, nil, nil } // Do a sanity check that the provided chain is actually ordered and linked for i := 1; i < len(chain); i++ { if chain[i].NumberU64() != chain[i-1].NumberU64()+1 || chain[i].ParentHash() != chain[i-1].Hash() { // Chain broke ancestry, log a message (programming error) and skip insertion log.Error("Non contiguous block insert", "number", chain[i].Number(), "hash", chain[i].Hash(), "parent", chain[i].ParentHash(), "prevnumber", chain[i-1].Number(), "prevhash", chain[i-1].Hash()) return 0, nil, nil, fmt.Errorf("non contiguous insert: item %d is #%d [%x…], item %d is #%d [%x…] (parent [%x…])", i-1, chain[i-1].NumberU64(), chain[i-1].Hash().Bytes()[:4], i, chain[i].NumberU64(), chain[i].Hash().Bytes()[:4], chain[i].ParentHash().Bytes()[:4]) } } // Pre-checks passed, start the full block imports bc.wg.Add(1) defer bc.wg.Done() bc.chainmu.Lock() defer bc.chainmu.Unlock() // A queued approach to delivering events. This is generally // faster than direct delivery and requires much less mutex // acquiring. var ( stats = insertStats{startTime: mclock.Now()} events = make([]interface{}, 0, len(chain)) lastCanon *types.Block coalescedLogs []*types.Log ) is_all_in_checkpoints := true var all_chain types.Blocks for _, block := range chain { if block.Header().Number.Uint64() > uint64(zconfig.CheckPoints.MaxNum()) { is_all_in_checkpoints = false break } } if !is_all_in_checkpoints { all_chain = chain } // Start the parallel header verifier abort, results := bc.NewHeaderChecker(all_chain) defer close(abort) // Start a parallel signature recovery (abi will fluke on fork transition, minimal perf loss) //senderCacher.recoverFromBlocks(types.MakeSigner(bc.chainConfig, chain[0].Number()), chain) tx_abort, tx_results := NewTxChecker(bc, all_chain) defer close(tx_abort) // Iterate over the blocks and insert when the verifier permits for i, block := range chain { // If the chain is terminating, stop processing blocks if atomic.LoadInt32(&bc.procInterrupt) == 1 { log.Debug("Premature abort during blocks processing") break } // Wait for the block's verification to complete bstart := time.Now() var err error if !is_all_in_checkpoints { err = <-results } if err == nil { err = bc.Validator().ValidateBody(block) } switch { case err == ErrKnownBlock: // Block and state both already known. However if the current block is below // this number we did a rollback and we should reimport it nonetheless. if !local && bc.CurrentBlock().NumberU64() >= block.NumberU64() { stats.ignored++ continue } case err == consensus.ErrFutureBlock: // Allow up to MaxFuture second in the future blocks. If this limit is exceeded // the chain is discarded and processed at a later time if given. max := big.NewInt(time.Now().Unix() + maxTimeFutureBlocks) if block.Time().Cmp(max) > 0 { return i, events, coalescedLogs, fmt.Errorf("future block: %v > %v", block.Time(), max) } bc.futureBlocks.Add(block.Hash(), block) stats.queued++ continue case err == consensus.ErrUnknownAncestor && bc.futureBlocks.Contains(block.ParentHash()): bc.futureBlocks.Add(block.Hash(), block) stats.queued++ continue case err == consensus.ErrPrunedAncestor: // Block competing with the canonical chain, store in the db, but don't process // until the competitor TD goes above the canonical TD currentBlock := bc.CurrentBlock() localTd := bc.GetTd(currentBlock.Hash(), currentBlock.NumberU64()) externTd := new(big.Int).Add(bc.GetTd(block.ParentHash(), block.NumberU64()-1), block.Difficulty()) if localTd.Cmp(externTd) > 0 { if err = bc.WriteBlockWithoutState(block, externTd); err != nil { return i, events, coalescedLogs, err } continue } // Competitor chain beat canonical, gather all blocks from the common ancestor var winner []*types.Block parent := bc.GetBlock(block.ParentHash(), block.NumberU64()-1) for !bc.HasState(parent.Root()) { winner = append(winner, parent) parent = bc.GetBlock(parent.ParentHash(), parent.NumberU64()-1) } for j := 0; j < len(winner)/2; j++ { winner[j], winner[len(winner)-1-j] = winner[len(winner)-1-j], winner[j] } // Import all the pruned blocks to make the state available bc.chainmu.Unlock() _, evs, logs, err := bc.insertChain(winner, local) bc.chainmu.Lock() events, coalescedLogs = evs, logs if err != nil { return i, events, coalescedLogs, err } case err != nil: bc.reportBlock(block, nil, err) return i, events, coalescedLogs, err } // Create a new statedb using the parent block and report an // error if it fails. var parent *types.Block if i == 0 { parent = bc.GetBlock(block.ParentHash(), block.NumberU64()-1) } else { parent = chain[i-1] } state, err := state.New(bc.stateCache, parent.Header()) if err != nil { return i, events, coalescedLogs, err } if !is_all_in_checkpoints { for _, tx := range block.Transactions() { err := <-tx_results if err == nil { err = verify.VerifyWithState(tx.GetZZSTX(), state.NextZState(), block.NumberU64()) } //err := verify.Verify(tx.GetZZSTX(), state.GetZState()) if err != nil { return i, events, coalescedLogs, err } } } if seroparam.SIP4() <= block.NumberU64() { stakeState := stake.NewStakeState(state) err = stakeState.ProcessBeforeApply(bc, block.Header()) if err != nil { log.Error("insert chain pos block processBeforeApply", "err", err) return i, events, coalescedLogs, err } if !is_all_in_checkpoints { err = stakeState.CheckVotes(block, bc) } if err != nil { log.Error("insert chain pos block checkVote", "err", err) return i, events, coalescedLogs, err } } // Process block using the parent state as reference point. receipts, logs, usedGas, err := bc.processor.Process(block, state, bc.vmConfig) if err != nil { bc.reportBlock(block, receipts, err) return i, events, coalescedLogs, err } // Validate the state using the default validator err = bc.Validator().ValidateState(block, parent, state, receipts, usedGas) if err != nil { bc.reportBlock(block, receipts, err) return i, events, coalescedLogs, err } proctime := time.Since(bstart) // Write the block to the chain and get the status. status, err := bc.WriteBlockWithState(block, receipts, state) if err != nil { return i, events, coalescedLogs, err } switch status { case CanonStatTy: log.Debug("Inserted new block", "number", block.Number(), "hash", block.Hash(), "txs", len(block.Transactions()), "gas", block.GasUsed(), "elapsed", common.PrettyDuration(time.Since(bstart))) coalescedLogs = append(coalescedLogs, logs...) blockInsertTimer.UpdateSince(bstart) events = append(events, ChainEvent{block, block.Hash(), logs}) lastCanon = block // Only count canonical blocks for GC processing time bc.gcproc += proctime case SideStatTy: log.Debug("Inserted forked block", "number", block.Number(), "hash", block.Hash(), "diff", block.Difficulty(), "elapsed", common.PrettyDuration(time.Since(bstart)), "txs", len(block.Transactions()), "gas", block.GasUsed()) blockInsertTimer.UpdateSince(bstart) events = append(events, ChainSideEvent{block}) } stats.processed++ stats.usedGas += usedGas cache, _ := bc.stateCache.TrieDB().Size() stats.report(chain, i, cache) } // Append a single chain head event if we've progressed the chain if lastCanon != nil && bc.CurrentBlock().Hash() == lastCanon.Hash() { events = append(events, ChainHeadEvent{lastCanon}) } return 0, events, coalescedLogs, nil } // insertStats tracks and reports on block insertion. type insertStats struct { queued, processed, ignored int usedGas uint64 lastIndex int startTime mclock.AbsTime } // statsReportLimit is the time limit during import and export after which we // always print out progress. This avoids the user wondering what's going on. const statsReportLimit = 8 * time.Second // report prints statistics if some number of blocks have been processed // or more than a few seconds have passed since the last message. func (st *insertStats) report(chain []*types.Block, index int, cache common.StorageSize) { // Fetch the timings for the batch var ( now = mclock.Now() elapsed = time.Duration(now) - time.Duration(st.startTime) ) // If we're at the last block of the batch or report period reached, log if index == len(chain)-1 || elapsed >= statsReportLimit { var ( end = chain[index] txs = countTransactions(chain[st.lastIndex : index+1]) ) context := []interface{}{ "blocks", st.processed, "txs", txs, "mgas", float64(st.usedGas) / 1000000, "elapsed", common.PrettyDuration(elapsed), "mgasps", float64(st.usedGas) * 1000 / float64(elapsed), "number", end.Number(), "hash", end.Hash(), } if timestamp := time.Unix(end.Time().Int64(), 0); time.Since(timestamp) > time.Minute { context = append(context, []interface{}{"age", common.PrettyAge(timestamp)}...) } context = append(context, []interface{}{"dirty", cache}...) if st.queued > 0 { context = append(context, []interface{}{"queued", st.queued}...) } if st.ignored > 0 { context = append(context, []interface{}{"ignored", st.ignored}...) } log.Info("Imported new chain segment", context...) *st = insertStats{startTime: now, lastIndex: index + 1} } } func countTransactions(chain []*types.Block) (c int) { for _, b := range chain { c += len(b.Transactions()) } return c } // reorgs takes two blocks, an old chain and a new chain and will reconstruct the blocks and inserts them // to be part of the new canonical chain and accumulates potential missing transactions and post an // event about them func (bc *BlockChain) reorg(oldBlock, newBlock *types.Block) error { var ( newChain types.Blocks oldChain types.Blocks commonBlock *types.Block deletedTxs types.Transactions deletedLogs []*types.Log // collectLogs collects the logs that were generated during the // processing of the block that corresponds with the given hash. // These logs are later announced as deleted. collectLogs = func(hash common.Hash) { // Coalesce logs and set 'Removed'. number := bc.hc.GetBlockNumber(hash) if number == nil { return } receipts := rawdb.ReadReceipts(bc.db, hash, *number) for _, receipt := range receipts { for _, log := range receipt.Logs { del := *log del.Removed = true deletedLogs = append(deletedLogs, &del) } } } ) // first reduce whoever is higher bound if oldBlock.NumberU64() > newBlock.NumberU64() { // reduce old chain for ; oldBlock != nil && oldBlock.NumberU64() != newBlock.NumberU64(); oldBlock = bc.GetBlock(oldBlock.ParentHash(), oldBlock.NumberU64()-1) { oldChain = append(oldChain, oldBlock) deletedTxs = append(deletedTxs, oldBlock.Transactions()...) collectLogs(oldBlock.Hash()) } } else { // reduce new chain and append new chain blocks for inserting later on for ; newBlock != nil && newBlock.NumberU64() != oldBlock.NumberU64(); newBlock = bc.GetBlock(newBlock.ParentHash(), newBlock.NumberU64()-1) { newChain = append(newChain, newBlock) } } if oldBlock == nil { return fmt.Errorf("Invalid old chain") } if newBlock == nil { return fmt.Errorf("Invalid new chain") } for { if oldBlock.Hash() == newBlock.Hash() { commonBlock = oldBlock break } oldChain = append(oldChain, oldBlock) newChain = append(newChain, newBlock) deletedTxs = append(deletedTxs, oldBlock.Transactions()...) collectLogs(oldBlock.Hash()) oldBlock, newBlock = bc.GetBlock(oldBlock.ParentHash(), oldBlock.NumberU64()-1), bc.GetBlock(newBlock.ParentHash(), newBlock.NumberU64()-1) if oldBlock == nil { return fmt.Errorf("Invalid old chain") } if newBlock == nil { return fmt.Errorf("Invalid new chain") } } // Ensure the user sees large reorgs if len(oldChain) > 0 && len(newChain) > 0 { logFn := log.Debug if len(oldChain) > 63 { logFn = log.Warn } logFn("Chain split detected", "number", commonBlock.Number(), "hash", commonBlock.Hash(), "drop", len(oldChain), "dropfrom", oldChain[0].Hash(), "add", len(newChain), "addfrom", newChain[0].Hash()) } else { log.Error("Impossible reorg, please file an issue", "oldnum", oldBlock.Number(), "oldhash", oldBlock.Hash(), "newnum", newBlock.Number(), "newhash", newBlock.Hash()) } // Insert the new chain, taking care of the proper incremental order var addedTxs types.Transactions for i := len(newChain) - 1; i >= 0; i-- { // insert the block in the canonical way, re-writing history bc.insert(newChain[i]) // write lookup entries for hash based transaction/receipt searches rawdb.WriteTxLookupEntries(bc.db, newChain[i]) addedTxs = append(addedTxs, newChain[i].Transactions()...) } // calculate the difference between deleted and added transactions diff := types.TxDifference(deletedTxs, addedTxs) // When transactions get deleted from the database that means the // receipts that were created in the fork must also be deleted batch := bc.db.NewBatch() for _, tx := range diff { rawdb.DeleteTxLookupEntry(batch, tx.Hash()) } batch.Write() if len(deletedLogs) > 0 { go bc.rmLogsFeed.Send(RemovedLogsEvent{deletedLogs}) } if len(oldChain) > 0 { go func() { for _, block := range oldChain { bc.chainSideFeed.Send(ChainSideEvent{Block: block}) } }() } return nil } // PostChainEvents iterates over the events generated by a chain insertion and // posts them into the event feed. // TODO: Should not expose PostChainEvents. The chain events should be posted in WriteBlock. func (bc *BlockChain) PostChainEvents(events []interface{}, logs []*types.Log) { // post event logs for further processing if logs != nil { bc.logsFeed.Send(logs) } for _, event := range events { switch ev := event.(type) { case ChainEvent: bc.chainFeed.Send(ev) case ChainHeadEvent: bc.chainHeadFeed.Send(ev) case ChainSideEvent: bc.chainSideFeed.Send(ev) } } } func (bc *BlockChain) update() { futureTimer := time.NewTicker(5 * time.Second) defer futureTimer.Stop() for { select { case <-futureTimer.C: bc.procFutureBlocks() case <-bc.quit: return } } } // BadBlocks returns a list of the last 'bad blocks' that the client has seen on the network func (bc *BlockChain) BadBlocks() []*types.Block { blocks := make([]*types.Block, 0, bc.badBlocks.Len()) for _, hash := range bc.badBlocks.Keys() { if blk, exist := bc.badBlocks.Peek(hash); exist { block := blk.(*types.Block) blocks = append(blocks, block) } } return blocks } // addBadBlock adds a bad block to the bad-block LRU cache func (bc *BlockChain) addBadBlock(block *types.Block) { bc.badBlocks.Add(block.Hash(), block) } // reportBlock logs a bad block error. func (bc *BlockChain) reportBlock(block *types.Block, receipts types.Receipts, err error) { bc.addBadBlock(block) var receiptString string for _, receipt := range receipts { receiptString += fmt.Sprintf("\t%v\n", receipt) } log.Error(fmt.Sprintf(` ########## BAD BLOCK ######### Chain config: %v Number: %v Hash: 0x%x %v Error: %v ############################## `, bc.chainConfig, block.Number(), block.Hash(), receiptString, err)) } // InsertHeaderChain attempts to insert the given header chain in to the local // chain, possibly creating a reorg. If an error is returned, it will return the // index number of the failing header as well an error describing what went wrong. // // The verify parameter can be used to fine tune whether nonce verification // should be done or not. The reason behind the optional check is because some // of the header retrieval mechanisms already need to verify nonces, as well as // because nonces can be verified sparsely, not needing to check each. func (bc *BlockChain) InsertHeaderChain(chain []*types.Header, checkFreq int) (int, error) { start := time.Now() if i, err := bc.hc.ValidateHeaderChain(chain, checkFreq); err != nil { return i, err } // Make sure only one thread manipulates the chain at once bc.chainmu.Lock() defer bc.chainmu.Unlock() bc.wg.Add(1) defer bc.wg.Done() whFunc := func(header *types.Header) error { bc.mu.Lock() defer bc.mu.Unlock() _, err := bc.hc.WriteHeader(header) return err } return bc.hc.InsertHeaderChain(chain, whFunc, start) } // writeHeader writes a header into the local chain, given that its parent is // already known. If the total difficulty of the newly inserted header becomes // greater than the current known TD, the canonical chain is re-routed. // // Note: This method is not concurrent-safe with inserting blocks simultaneously // into the chain, as side effects caused by reorganisations cannot be emulated // without the real blocks. Hence, writing headers directly should only be done // in two scenarios: pure-header mode of operation (light clients), or properly // separated header/block phases (non-archive clients). func (bc *BlockChain) writeHeader(header *types.Header) error { bc.wg.Add(1) defer bc.wg.Done() bc.mu.Lock() defer bc.mu.Unlock() _, err := bc.hc.WriteHeader(header) return err } // CurrentHeader retrieves the current head header of the canonical chain. The // header is retrieved from the HeaderChain's internal cache. func (bc *BlockChain) CurrentHeader() *types.Header { return bc.hc.CurrentHeader() } // GetTd retrieves a block's total difficulty in the canonical chain from the // database by hash and number, caching it if found. func (bc *BlockChain) GetTd(hash common.Hash, number uint64) *big.Int { return bc.hc.GetTd(hash, number) } // GetTdByHash retrieves a block's total difficulty in the canonical chain from the // database by hash, caching it if found. func (bc *BlockChain) GetTdByHash(hash common.Hash) *big.Int { return bc.hc.GetTdByHash(hash) } // GetHeader retrieves a block header from the database by hash and number, // caching it if found. func (bc *BlockChain) GetHeader(hash common.Hash, number uint64) *types.Header { return bc.hc.GetHeader(hash, number) } // GetHeaderByHash retrieves a block header from the database by hash, caching it if // found. func (bc *BlockChain) GetHeaderByHash(hash common.Hash) *types.Header { return bc.hc.GetHeaderByHash(hash) } // HasHeader checks if a block header is present in the database or not, caching // it if present. func (bc *BlockChain) HasHeader(hash common.Hash, number uint64) bool { return bc.hc.HasHeader(hash, number) } // GetBlockHashesFromHash retrieves a number of block hashes starting at a given // hash, fetching towards the genesis block. func (bc *BlockChain) GetBlockHashesFromHash(hash common.Hash, max uint64) []common.Hash { return bc.hc.GetBlockHashesFromHash(hash, max) } // GetAncestor retrieves the Nth ancestor of a given block. It assumes that either the given block or // a close ancestor of it is canonical. maxNonCanonical points to a downwards counter limiting the // number of blocks to be individually checked before we reach the canonical chain. // // Note: ancestor == 0 returns the same block, 1 returns its parent and so on. func (bc *BlockChain) GetAncestor(hash common.Hash, number, ancestor uint64, maxNonCanonical *uint64) (common.Hash, uint64) { bc.chainmu.Lock() defer bc.chainmu.Unlock() return bc.hc.GetAncestor(hash, number, ancestor, maxNonCanonical) } // GetHeaderByNumber retrieves a block header from the database by number, // caching it (associated with its hash) if found. func (bc *BlockChain) GetHeaderByNumber(number uint64) *types.Header { return bc.hc.GetHeaderByNumber(number) } // Config retrieves the blockchain's chain configuration. func (bc *BlockChain) Config() *params.ChainConfig { return bc.chainConfig } // Engine retrieves the blockchain's consensus engine. func (bc *BlockChain) Engine() consensus.Engine { return bc.engine } // SubscribeRemovedLogsEvent registers a subscription of RemovedLogsEvent. func (bc *BlockChain) SubscribeRemovedLogsEvent(ch chan<- RemovedLogsEvent) event.Subscription { return bc.scope.Track(bc.rmLogsFeed.Subscribe(ch)) } // SubscribeChainEvent registers a subscription of ChainEvent. func (bc *BlockChain) SubscribeChainEvent(ch chan<- ChainEvent) event.Subscription { return bc.scope.Track(bc.chainFeed.Subscribe(ch)) } // SubscribeChainHeadEvent registers a subscription of ChainHeadEvent. func (bc *BlockChain) SubscribeChainHeadEvent(ch chan<- ChainHeadEvent) event.Subscription { return bc.scope.Track(bc.chainHeadFeed.Subscribe(ch)) } // SubscribeChainSideEvent registers a subscription of ChainSideEvent. func (bc *BlockChain) SubscribeChainSideEvent(ch chan<- ChainSideEvent) event.Subscription { return bc.scope.Track(bc.chainSideFeed.Subscribe(ch)) } // SubscribeLogsEvent registers a subscription of []*types.Log. func (bc *BlockChain) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription { return bc.scope.Track(bc.logsFeed.Subscribe(ch)) } ================================================ FILE: core/bloombits/doc.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // Package bloombits implements bloom filtering on batches of data. package bloombits ================================================ FILE: core/bloombits/generator.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package bloombits import ( "errors" "github.com/sero-cash/go-sero/core/types" ) var ( // errSectionOutOfBounds is returned if the user tried to add more bloom filters // to the batch than available space, or if tries to retrieve above the capacity. errSectionOutOfBounds = errors.New("section out of bounds") // errBloomBitOutOfBounds is returned if the user tried to retrieve specified // bit bloom above the capacity. errBloomBitOutOfBounds = errors.New("bloom bit out of bounds") ) // Generator takes a number of bloom filters and generates the rotated bloom bits // to be used for batched filtering. type Generator struct { blooms [types.BloomBitLength][]byte // Rotated blooms for per-bit matching sections uint // Number of sections to batch together nextSec uint // Next section to set when adding a bloom } // NewGenerator creates a rotated bloom generator that can iteratively fill a // batched bloom filter's bits. func NewGenerator(sections uint) (*Generator, error) { if sections%8 != 0 { return nil, errors.New("section count not multiple of 8") } b := &Generator{sections: sections} for i := 0; i < types.BloomBitLength; i++ { b.blooms[i] = make([]byte, sections/8) } return b, nil } // AddBloom takes a single bloom filter and sets the corresponding bit column // in memory accordingly. func (b *Generator) AddBloom(index uint, bloom types.Bloom) error { // Make sure we're not adding more bloom filters than our capacity if b.nextSec >= b.sections { return errSectionOutOfBounds } if b.nextSec != index { return errors.New("bloom filter with unexpected index") } // Rotate the bloom and insert into our collection byteIndex := b.nextSec / 8 bitMask := byte(1) << byte(7-b.nextSec%8) for i := 0; i < types.BloomBitLength; i++ { bloomByteIndex := types.BloomByteLength - 1 - i/8 bloomBitMask := byte(1) << byte(i%8) if (bloom[bloomByteIndex] & bloomBitMask) != 0 { b.blooms[i][byteIndex] |= bitMask } } b.nextSec++ return nil } // Bitset returns the bit vector belonging to the given bit index after all // blooms have been added. func (b *Generator) Bitset(idx uint) ([]byte, error) { if b.nextSec != b.sections { return nil, errors.New("bloom not fully generated yet") } if idx >= types.BloomBitLength { return nil, errBloomBitOutOfBounds } return b.blooms[idx], nil } ================================================ FILE: core/bloombits/generator_test.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package bloombits import ( "bytes" "math/rand" "testing" "github.com/sero-cash/go-sero/core/types" ) // Tests that batched bloom bits are correctly rotated from the input bloom // filters. func TestGenerator(t *testing.T) { // Generate the input and the rotated output var input, output [types.BloomBitLength][types.BloomByteLength]byte for i := 0; i < types.BloomBitLength; i++ { for j := 0; j < types.BloomBitLength; j++ { bit := byte(rand.Int() % 2) input[i][j/8] |= bit << byte(7-j%8) output[types.BloomBitLength-1-j][i/8] |= bit << byte(7-i%8) } } // Crunch the input through the generator and verify the result gen, err := NewGenerator(types.BloomBitLength) if err != nil { t.Fatalf("failed to create bloombit generator: %v", err) } for i, bloom := range input { if err := gen.AddBloom(uint(i), bloom); err != nil { t.Fatalf("bloom %d: failed to add: %v", i, err) } } for i, want := range output { have, err := gen.Bitset(uint(i)) if err != nil { t.Fatalf("output %d: failed to retrieve bits: %v", i, err) } if !bytes.Equal(have, want[:]) { t.Errorf("output %d: bit vector mismatch have %x, want %x", i, have, want) } } } ================================================ FILE: core/bloombits/matcher.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package bloombits import ( "bytes" "context" "errors" "math" "sort" "sync" "sync/atomic" "time" "github.com/sero-cash/go-sero/common/bitutil" "github.com/sero-cash/go-sero/crypto" ) // bloomIndexes represents the bit indexes inside the bloom filter that belong // to some key. type bloomIndexes [3]uint // calcBloomIndexes returns the bloom filter bit indexes belonging to the given key. func calcBloomIndexes(b []byte) bloomIndexes { b = crypto.Keccak256(b) var idxs bloomIndexes for i := 0; i < len(idxs); i++ { idxs[i] = (uint(b[2*i])<<8)&2047 + uint(b[2*i+1]) } return idxs } // partialMatches with a non-nil vector represents a section in which some sub- // matchers have already found potential matches. Subsequent sub-matchers will // binary AND their matches with this vector. If vector is nil, it represents a // section to be processed by the first sub-matcher. type partialMatches struct { section uint64 bitset []byte } // Retrieval represents a request for retrieval task assignments for a given // bit with the given number of fetch elements, or a response for such a request. // It can also have the actual results set to be used as a delivery data struct. // // The contest and error fields are used by the light client to terminate matching // early if an error is encountered on some path of the pipeline. type Retrieval struct { Bit uint Sections []uint64 Bitsets [][]byte Context context.Context Error error } // Matcher is a pipelined system of schedulers and logic matchers which perform // binary AND/OR operations on the bit-streams, creating a stream of potential // blocks to inspect for data content. type Matcher struct { sectionSize uint64 // Size of the data batches to filter on filters [][]bloomIndexes // Filter the system is matching for schedulers map[uint]*scheduler // Retrieval schedulers for loading bloom bits retrievers chan chan uint // Retriever processes waiting for bit allocations counters chan chan uint // Retriever processes waiting for task count reports retrievals chan chan *Retrieval // Retriever processes waiting for task allocations deliveries chan *Retrieval // Retriever processes waiting for task response deliveries running uint32 // Atomic flag whether a session is live or not } // NewMatcher creates a new pipeline for retrieving bloom bit streams and doing // address and topic filtering on them. Setting a filter component to `nil` is // allowed and will result in that filter rule being skipped (OR 0x11...1). func NewMatcher(sectionSize uint64, filters [][][]byte) *Matcher { // Create the matcher instance m := &Matcher{ sectionSize: sectionSize, schedulers: make(map[uint]*scheduler), retrievers: make(chan chan uint), counters: make(chan chan uint), retrievals: make(chan chan *Retrieval), deliveries: make(chan *Retrieval), } // Calculate the bloom bit indexes for the groups we're interested in m.filters = nil for _, filter := range filters { // Gather the bit indexes of the filter rule, special casing the nil filter if len(filter) == 0 { continue } bloomBits := make([]bloomIndexes, len(filter)) for i, clause := range filter { if clause == nil { bloomBits = nil break } bloomBits[i] = calcBloomIndexes(clause) } // Accumulate the filter rules if no nil rule was within if bloomBits != nil { m.filters = append(m.filters, bloomBits) } } // For every bit, create a scheduler to load/download the bit vectors for _, bloomIndexLists := range m.filters { for _, bloomIndexList := range bloomIndexLists { for _, bloomIndex := range bloomIndexList { m.addScheduler(bloomIndex) } } } return m } // addScheduler adds a bit stream retrieval scheduler for the given bit index if // it has not existed before. If the bit is already selected for filtering, the // existing scheduler can be used. func (m *Matcher) addScheduler(idx uint) { if _, ok := m.schedulers[idx]; ok { return } m.schedulers[idx] = newScheduler(idx) } // Start starts the matching process and returns a stream of bloom matches in // a given range of blocks. If there are no more matches in the range, the result // channel is closed. func (m *Matcher) Start(ctx context.Context, begin, end uint64, results chan uint64) (*MatcherSession, error) { // Make sure we're not creating concurrent sessions if atomic.SwapUint32(&m.running, 1) == 1 { return nil, errors.New("matcher already running") } defer atomic.StoreUint32(&m.running, 0) // Initiate a new matching round session := &MatcherSession{ matcher: m, quit: make(chan struct{}), kill: make(chan struct{}), ctx: ctx, } for _, scheduler := range m.schedulers { scheduler.reset() } sink := m.run(begin, end, cap(results), session) // Read the output from the result sink and deliver to the user session.pend.Add(1) go func() { defer session.pend.Done() defer close(results) for { select { case <-session.quit: return case res, ok := <-sink: // New match result found if !ok { return } // Calculate the first and last blocks of the section sectionStart := res.section * m.sectionSize first := sectionStart if begin > first { first = begin } last := sectionStart + m.sectionSize - 1 if end < last { last = end } // Iterate over all the blocks in the section and return the matching ones for i := first; i <= last; i++ { // Skip the entire byte if no matches are found inside (and we're processing an entire byte!) next := res.bitset[(i-sectionStart)/8] if next == 0 { if i%8 == 0 { i += 7 } continue } // Some bit it set, do the actual submatching if bit := 7 - i%8; next&(1<= req.section }) requests[req.bit] = append(queue[:index], append([]uint64{req.section}, queue[index:]...)...) // If it's a new bit and we have waiting fetchers, allocate to them if len(queue) == 0 { assign(req.bit) } case fetcher := <-retrievers: // New retriever arrived, find the lowest section-ed bit to assign bit, best := uint(0), uint64(math.MaxUint64) for idx := range unallocs { if requests[idx][0] < best { bit, best = idx, requests[idx][0] } } // Stop tracking this bit (and alloc notifications if no more work is available) delete(unallocs, bit) if len(unallocs) == 0 { retrievers = nil } allocs++ fetcher <- bit case fetcher := <-m.counters: // New task count request arrives, return number of items fetcher <- uint(len(requests[<-fetcher])) case fetcher := <-m.retrievals: // New fetcher waiting for tasks to retrieve, assign task := <-fetcher if want := len(task.Sections); want >= len(requests[task.Bit]) { task.Sections = requests[task.Bit] delete(requests, task.Bit) } else { task.Sections = append(task.Sections[:0], requests[task.Bit][:want]...) requests[task.Bit] = append(requests[task.Bit][:0], requests[task.Bit][want:]...) } fetcher <- task // If anything was left unallocated, try to assign to someone else if len(requests[task.Bit]) > 0 { assign(task.Bit) } case result := <-m.deliveries: // New retrieval task response from fetcher, split out missing sections and // deliver complete ones var ( sections = make([]uint64, 0, len(result.Sections)) bitsets = make([][]byte, 0, len(result.Bitsets)) missing = make([]uint64, 0, len(result.Sections)) ) for i, bitset := range result.Bitsets { if len(bitset) == 0 { missing = append(missing, result.Sections[i]) continue } sections = append(sections, result.Sections[i]) bitsets = append(bitsets, bitset) } m.schedulers[result.Bit].deliver(sections, bitsets) allocs-- // Reschedule missing sections and allocate bit if newly available if len(missing) > 0 { queue := requests[result.Bit] for _, section := range missing { index := sort.Search(len(queue), func(i int) bool { return queue[i] >= section }) queue = append(queue[:index], append([]uint64{section}, queue[index:]...)...) } requests[result.Bit] = queue if len(queue) == len(missing) { assign(result.Bit) } } // If we're in the process of shutting down, terminate if allocs == 0 && shutdown == nil { return } } } } // MatcherSession is returned by a started matcher to be used as a terminator // for the actively running matching operation. type MatcherSession struct { matcher *Matcher closer sync.Once // Sync object to ensure we only ever close once quit chan struct{} // Quit channel to request pipeline termination kill chan struct{} // Term channel to signal non-graceful forced shutdown ctx context.Context // Context used by the light client to abort filtering err atomic.Value // Global error to track retrieval failures deep in the chain pend sync.WaitGroup } // Close stops the matching process and waits for all subprocesses to terminate // before returning. The timeout may be used for graceful shutdown, allowing the // currently running retrievals to complete before this time. func (s *MatcherSession) Close() { s.closer.Do(func() { // Signal termination and wait for all goroutines to tear down close(s.quit) time.AfterFunc(time.Second, func() { close(s.kill) }) s.pend.Wait() }) } // Error returns any failure encountered during the matching session. func (s *MatcherSession) Error() error { if err := s.err.Load(); err != nil { return err.(error) } return nil } // AllocateRetrieval assigns a bloom bit index to a client process that can either // immediately request and fetch the section contents assigned to this bit or wait // a little while for more sections to be requested. func (s *MatcherSession) AllocateRetrieval() (uint, bool) { fetcher := make(chan uint) select { case <-s.quit: return 0, false case s.matcher.retrievers <- fetcher: bit, ok := <-fetcher return bit, ok } } // PendingSections returns the number of pending section retrievals belonging to // the given bloom bit index. func (s *MatcherSession) PendingSections(bit uint) int { fetcher := make(chan uint) select { case <-s.quit: return 0 case s.matcher.counters <- fetcher: fetcher <- bit return int(<-fetcher) } } // AllocateSections assigns all or part of an already allocated bit-task queue // to the requesting process. func (s *MatcherSession) AllocateSections(bit uint, count int) []uint64 { fetcher := make(chan *Retrieval) select { case <-s.quit: return nil case s.matcher.retrievals <- fetcher: task := &Retrieval{ Bit: bit, Sections: make([]uint64, count), } fetcher <- task return (<-fetcher).Sections } } // DeliverSections delivers a batch of section bit-vectors for a specific bloom // bit index to be injected into the processing pipeline. func (s *MatcherSession) DeliverSections(bit uint, sections []uint64, bitsets [][]byte) { select { case <-s.kill: return case s.matcher.deliveries <- &Retrieval{Bit: bit, Sections: sections, Bitsets: bitsets}: } } // Multiplex polls the matcher session for retrieval tasks and multiplexes it into // the requested retrieval queue to be serviced together with other sessions. // // This method will block for the lifetime of the session. Even after termination // of the session, any request in-flight need to be responded to! Empty responses // are fine though in that case. func (s *MatcherSession) Multiplex(batch int, wait time.Duration, mux chan chan *Retrieval) { for { // Allocate a new bloom bit index to retrieve data for, stopping when done bit, ok := s.AllocateRetrieval() if !ok { return } // Bit allocated, throttle a bit if we're below our batch limit if s.PendingSections(bit) < batch { select { case <-s.quit: // Session terminating, we can't meaningfully service, abort s.AllocateSections(bit, 0) s.DeliverSections(bit, []uint64{}, [][]byte{}) return case <-time.After(wait): // Throttling up, fetch whatever's available } } // Allocate as much as we can handle and request servicing sections := s.AllocateSections(bit, batch) request := make(chan *Retrieval) select { case <-s.quit: // Session terminating, we can't meaningfully service, abort s.DeliverSections(bit, sections, make([][]byte, len(sections))) return case mux <- request: // Retrieval accepted, something must arrive before we're aborting request <- &Retrieval{Bit: bit, Sections: sections, Context: s.ctx} result := <-request if result.Error != nil { s.err.Store(result.Error) s.Close() } s.DeliverSections(result.Bit, result.Sections, result.Bitsets) } } } ================================================ FILE: core/bloombits/scheduler.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package bloombits import ( "sync" ) // request represents a bloom retrieval task to prioritize and pull from the local // database or remotely from the network. type request struct { section uint64 // Section index to retrieve the a bit-vector from bit uint // Bit index within the section to retrieve the vector of } // response represents the state of a requested bit-vector through a scheduler. type response struct { cached []byte // Cached bits to dedup multiple requests done chan struct{} // Channel to allow waiting for completion } // scheduler handles the scheduling of bloom-filter retrieval operations for // entire section-batches belonging to a single bloom bit. Beside scheduling the // retrieval operations, this struct also deduplicates the requests and caches // the results to minimize network/database overhead even in complex filtering // scenarios. type scheduler struct { bit uint // Index of the bit in the bloom filter this scheduler is responsible for responses map[uint64]*response // Currently pending retrieval requests or already cached responses lock sync.Mutex // Lock protecting the responses from concurrent access } // newScheduler creates a new bloom-filter retrieval scheduler for a specific // bit index. func newScheduler(idx uint) *scheduler { return &scheduler{ bit: idx, responses: make(map[uint64]*response), } } // run creates a retrieval pipeline, receiving section indexes from sections and // returning the results in the same order through the done channel. Concurrent // runs of the same scheduler are allowed, leading to retrieval task deduplication. func (s *scheduler) run(sections chan uint64, dist chan *request, done chan []byte, quit chan struct{}, wg *sync.WaitGroup) { // Create a forwarder channel between requests and responses of the same size as // the distribution channel (since that will block the pipeline anyway). pend := make(chan uint64, cap(dist)) // Start the pipeline schedulers to forward between user -> distributor -> user wg.Add(2) go s.scheduleRequests(sections, dist, pend, quit, wg) go s.scheduleDeliveries(pend, done, quit, wg) } // reset cleans up any leftovers from previous runs. This is required before a // restart to ensure the no previously requested but never delivered state will // cause a lockup. func (s *scheduler) reset() { s.lock.Lock() defer s.lock.Unlock() for section, res := range s.responses { if res.cached == nil { delete(s.responses, section) } } } // scheduleRequests reads section retrieval requests from the input channel, // deduplicates the stream and pushes unique retrieval tasks into the distribution // channel for a database or network layer to honour. func (s *scheduler) scheduleRequests(reqs chan uint64, dist chan *request, pend chan uint64, quit chan struct{}, wg *sync.WaitGroup) { // Clean up the goroutine and pipeline when done defer wg.Done() defer close(pend) // Keep reading and scheduling section requests for { select { case <-quit: return case section, ok := <-reqs: // New section retrieval requested if !ok { return } // Deduplicate retrieval requests unique := false s.lock.Lock() if s.responses[section] == nil { s.responses[section] = &response{ done: make(chan struct{}), } unique = true } s.lock.Unlock() // Schedule the section for retrieval and notify the deliverer to expect this section if unique { select { case <-quit: return case dist <- &request{bit: s.bit, section: section}: } } select { case <-quit: return case pend <- section: } } } } // scheduleDeliveries reads section acceptance notifications and waits for them // to be delivered, pushing them into the output data buffer. func (s *scheduler) scheduleDeliveries(pend chan uint64, done chan []byte, quit chan struct{}, wg *sync.WaitGroup) { // Clean up the goroutine and pipeline when done defer wg.Done() defer close(done) // Keep reading notifications and scheduling deliveries for { select { case <-quit: return case idx, ok := <-pend: // New section retrieval pending if !ok { return } // Wait until the request is honoured s.lock.Lock() res := s.responses[idx] s.lock.Unlock() select { case <-quit: return case <-res.done: } // Deliver the result select { case <-quit: return case done <- res.cached: } } } } // deliver is called by the request distributor when a reply to a request arrives. func (s *scheduler) deliver(sections []uint64, data [][]byte) { s.lock.Lock() defer s.lock.Unlock() for i, section := range sections { if res := s.responses[section]; res != nil && res.cached == nil { // Avoid non-requests and double deliveries res.cached = data[i] close(res.done) } } } ================================================ FILE: core/bloombits/scheduler_test.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package bloombits import ( "bytes" "math/big" "math/rand" "sync" "sync/atomic" "testing" "time" ) // Tests that the scheduler can deduplicate and forward retrieval requests to // underlying fetchers and serve responses back, irrelevant of the concurrency // of the requesting clients or serving data fetchers. func TestSchedulerSingleClientSingleFetcher(t *testing.T) { testScheduler(t, 1, 1, 5000) } func TestSchedulerSingleClientMultiFetcher(t *testing.T) { testScheduler(t, 1, 10, 5000) } func TestSchedulerMultiClientSingleFetcher(t *testing.T) { testScheduler(t, 10, 1, 5000) } func TestSchedulerMultiClientMultiFetcher(t *testing.T) { testScheduler(t, 10, 10, 5000) } func testScheduler(t *testing.T, clients int, fetchers int, requests int) { f := newScheduler(0) // Create a batch of handler goroutines that respond to bloom bit requests and // deliver them to the scheduler. var fetchPend sync.WaitGroup fetchPend.Add(fetchers) defer fetchPend.Wait() fetch := make(chan *request, 16) defer close(fetch) var delivered uint32 for i := 0; i < fetchers; i++ { go func() { defer fetchPend.Done() for req := range fetch { time.Sleep(time.Duration(rand.Intn(int(100 * time.Microsecond)))) atomic.AddUint32(&delivered, 1) f.deliver([]uint64{ req.section + uint64(requests), // Non-requested data (ensure it doesn't go out of bounds) req.section, // Requested data req.section, // Duplicated data (ensure it doesn't double close anything) }, [][]byte{ {}, new(big.Int).SetUint64(req.section).Bytes(), new(big.Int).SetUint64(req.section).Bytes(), }) } }() } // Start a batch of goroutines to concurrently run scheduling tasks quit := make(chan struct{}) var pend sync.WaitGroup pend.Add(clients) for i := 0; i < clients; i++ { go func() { defer pend.Done() in := make(chan uint64, 16) out := make(chan []byte, 16) f.run(in, fetch, out, quit, &pend) go func() { for j := 0; j < requests; j++ { in <- uint64(j) } close(in) }() for j := 0; j < requests; j++ { bits := <-out if want := new(big.Int).SetUint64(uint64(j)).Bytes(); !bytes.Equal(bits, want) { t.Errorf("vector %d: delivered content mismatch: have %x, want %x", j, bits, want) } } }() } pend.Wait() if have := atomic.LoadUint32(&delivered); int(have) != requests { t.Errorf("request count mismatch: have %v, want %v", have, requests) } } ================================================ FILE: core/chain_indexer.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package core import ( "encoding/binary" "fmt" "sync" "sync/atomic" "time" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core/rawdb" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/event" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/serodb" ) // ChainIndexerBackend defines the methods needed to process chain segments in // the background and write the segment results into the database. These can be // used to create filter blooms or CHTs. type ChainIndexerBackend interface { // Reset initiates the processing of a new chain segment, potentially terminating // any partially completed operations (in case of a reorg). Reset(section uint64, prevHead common.Hash) error // Process crunches through the next header in the chain segment. The caller // will ensure a sequential order of headers. Process(header *types.Header) // Commit finalizes the section metadata and stores it into the database. Commit() error } // ChainIndexerChain interface is used for connecting the indexer to a blockchain type ChainIndexerChain interface { // CurrentHeader retrieves the latest locally known header. CurrentHeader() *types.Header // SubscribeChainEvent subscribes to new head header notifications. SubscribeChainEvent(ch chan<- ChainEvent) event.Subscription } // ChainIndexer does a post-processing job for equally sized sections of the // canonical chain (like BlooomBits and CHT structures). A ChainIndexer is // connected to the blockchain through the event system by starting a // ChainEventLoop in a goroutine. // // Further child ChainIndexers can be added which use the output of the parent // section indexer. These child indexers receive new head notifications only // after an entire section has been finished or in case of rollbacks that might // affect already finished sections. type ChainIndexer struct { chainDb serodb.Database // Chain database to index the data from indexDb serodb.Database // Prefixed table-view of the db to write index metadata into backend ChainIndexerBackend // Background processor generating the index data content children []*ChainIndexer // Child indexers to cascade chain updates to active uint32 // Flag whether the event loop was started update chan struct{} // Notification channel that headers should be processed quit chan chan error // Quit channel to tear down running goroutines sectionSize uint64 // Number of blocks in a single chain segment to process confirmsReq uint64 // Number of confirmations before processing a completed segment storedSections uint64 // Number of sections successfully indexed into the database knownSections uint64 // Number of sections known to be complete (block wise) cascadedHead uint64 // Block number of the last completed section cascaded to subindexers throttling time.Duration // Disk throttling to prevent a heavy upgrade from hogging resources log log.Logger lock sync.RWMutex } // NewChainIndexer creates a new chain indexer to do background processing on // chain segments of a given size after certain number of confirmations passed. // The throttling parameter might be used to prevent database thrashing. func NewChainIndexer(chainDb, indexDb serodb.Database, backend ChainIndexerBackend, section, confirm uint64, throttling time.Duration, kind string) *ChainIndexer { c := &ChainIndexer{ chainDb: chainDb, indexDb: indexDb, backend: backend, update: make(chan struct{}, 1), quit: make(chan chan error), sectionSize: section, confirmsReq: confirm, throttling: throttling, log: log.New("type", kind), } // Initialize database dependent fields and start the updater c.loadValidSections() go c.updateLoop() return c } // AddKnownSectionHead marks a new section head as known/processed if it is newer // than the already known best section head func (c *ChainIndexer) AddKnownSectionHead(section uint64, shead common.Hash) { c.lock.Lock() defer c.lock.Unlock() if section < c.storedSections { return } c.setSectionHead(section, shead) c.setValidSections(section + 1) } // Start creates a goroutine to feed chain head events into the indexer for // cascading background processing. Children do not need to be started, they // are notified about new events by their parents. func (c *ChainIndexer) Start(chain ChainIndexerChain) { events := make(chan ChainEvent, 10) sub := chain.SubscribeChainEvent(events) go c.eventLoop(chain.CurrentHeader(), events, sub) } // Close tears down all goroutines belonging to the indexer and returns any error // that might have occurred internally. func (c *ChainIndexer) Close() error { var errs []error // Tear down the primary update loop errc := make(chan error) c.quit <- errc if err := <-errc; err != nil { errs = append(errs, err) } // If needed, tear down the secondary event loop if atomic.LoadUint32(&c.active) != 0 { c.quit <- errc if err := <-errc; err != nil { errs = append(errs, err) } } // Close all children for _, child := range c.children { if err := child.Close(); err != nil { errs = append(errs, err) } } // Return any failures switch { case len(errs) == 0: return nil case len(errs) == 1: return errs[0] default: return fmt.Errorf("%v", errs) } } // eventLoop is a secondary - optional - event loop of the indexer which is only // started for the outermost indexer to push chain head events into a processing // queue. func (c *ChainIndexer) eventLoop(currentHeader *types.Header, events chan ChainEvent, sub event.Subscription) { // Mark the chain indexer as active, requiring an additional teardown atomic.StoreUint32(&c.active, 1) defer sub.Unsubscribe() // Fire the initial new head event to start any outstanding processing c.newHead(currentHeader.Number.Uint64(), false) var ( prevHeader = currentHeader prevHash = currentHeader.Hash() ) for { select { case errc := <-c.quit: // Chain indexer terminating, report no failure and abort errc <- nil return case ev, ok := <-events: // Received a new event, ensure it's not nil (closing) and update if !ok { errc := <-c.quit errc <- nil return } header := ev.Block.Header() if header.ParentHash != prevHash { // Reorg to the common ancestor (might not exist in light sync mode, skip reorg then) // TODO(karalabe, zsfelfoldi): This seems a bit brittle, can we detect this case explicitly? // TODO(karalabe): This operation is expensive and might block, causing the event system to // potentially also lock up. We need to do with on a different thread somehow. if h := rawdb.FindCommonAncestor(c.chainDb, prevHeader, header); h != nil { c.newHead(h.Number.Uint64(), true) } } c.newHead(header.Number.Uint64(), false) prevHeader, prevHash = header, header.Hash() } } } // newHead notifies the indexer about new chain heads and/or reorgs. func (c *ChainIndexer) newHead(head uint64, reorg bool) { c.lock.Lock() defer c.lock.Unlock() // If a reorg happened, invalidate all sections until that point if reorg { // Revert the known section number to the reorg point changed := head / c.sectionSize if changed < c.knownSections { c.knownSections = changed } // Revert the stored sections from the database to the reorg point if changed < c.storedSections { c.setValidSections(changed) } // Update the new head number to the finalized section end and notify children head = changed * c.sectionSize if head < c.cascadedHead { c.cascadedHead = head for _, child := range c.children { child.newHead(c.cascadedHead, true) } } return } // No reorg, calculate the number of newly known sections and update if high enough var sections uint64 if head >= c.confirmsReq { sections = (head + 1 - c.confirmsReq) / c.sectionSize if sections > c.knownSections { c.knownSections = sections select { case c.update <- struct{}{}: default: } } } } // updateLoop is the main event loop of the indexer which pushes chain segments // down into the processing backend. func (c *ChainIndexer) updateLoop() { var ( updating bool updated time.Time ) for { select { case errc := <-c.quit: // Chain indexer terminating, report no failure and abort errc <- nil return case <-c.update: // Section headers completed (or rolled back), update the index c.lock.Lock() if c.knownSections > c.storedSections { // Periodically print an upgrade log message to the user if time.Since(updated) > 8*time.Second { if c.knownSections > c.storedSections+1 { updating = true c.log.Info("Upgrading chain index", "percentage", c.storedSections*100/c.knownSections) } updated = time.Now() } // Cache the current section count and head to allow unlocking the mutex section := c.storedSections var oldHead common.Hash if section > 0 { oldHead = c.SectionHead(section - 1) } // Process the newly defined section in the background c.lock.Unlock() newHead, err := c.processSection(section, oldHead) if err != nil { c.log.Error("Section processing failed", "error", err) } c.lock.Lock() // If processing succeeded and no reorgs occcurred, mark the section completed if err == nil && oldHead == c.SectionHead(section-1) { c.setSectionHead(section, newHead) c.setValidSections(section + 1) if c.storedSections == c.knownSections && updating { updating = false c.log.Info("Finished upgrading chain index") } c.cascadedHead = c.storedSections*c.sectionSize - 1 for _, child := range c.children { c.log.Trace("Cascading chain index update", "head", c.cascadedHead) child.newHead(c.cascadedHead, false) } } else { // If processing failed, don't retry until further notification c.log.Debug("Chain index processing failed", "section", section, "err", err) c.knownSections = c.storedSections } } // If there are still further sections to process, reschedule if c.knownSections > c.storedSections { time.AfterFunc(c.throttling, func() { select { case c.update <- struct{}{}: default: } }) } c.lock.Unlock() } } } // processSection processes an entire section by calling backend functions while // ensuring the continuity of the passed headers. Since the chain mutex is not // held while processing, the continuity can be broken by a long reorg, in which // case the function returns with an error. func (c *ChainIndexer) processSection(section uint64, lastHead common.Hash) (common.Hash, error) { c.log.Trace("Processing new chain section", "section", section) // Reset and partial processing if err := c.backend.Reset(section, lastHead); err != nil { c.setValidSections(0) return common.Hash{}, err } for number := section * c.sectionSize; number < (section+1)*c.sectionSize; number++ { hash := rawdb.ReadCanonicalHash(c.chainDb, number) if hash == (common.Hash{}) { return common.Hash{}, fmt.Errorf("canonical block #%d unknown", number) } header := rawdb.ReadHeader(c.chainDb, hash, number) if header == nil { return common.Hash{}, fmt.Errorf("block #%d [%x…] not found", number, hash[:4]) } else if header.ParentHash != lastHead { return common.Hash{}, fmt.Errorf("chain reorged during section processing") } c.backend.Process(header) lastHead = header.Hash() } if err := c.backend.Commit(); err != nil { c.log.Error("Section commit failed", "error", err) return common.Hash{}, err } return lastHead, nil } // Sections returns the number of processed sections maintained by the indexer // and also the information about the last header indexed for potential canonical // verifications. func (c *ChainIndexer) Sections() (uint64, uint64, common.Hash) { c.lock.Lock() defer c.lock.Unlock() return c.storedSections, c.storedSections*c.sectionSize - 1, c.SectionHead(c.storedSections - 1) } // AddChildIndexer adds a child ChainIndexer that can use the output of this one func (c *ChainIndexer) AddChildIndexer(indexer *ChainIndexer) { c.lock.Lock() defer c.lock.Unlock() c.children = append(c.children, indexer) // Cascade any pending updates to new children too if c.storedSections > 0 { indexer.newHead(c.storedSections*c.sectionSize-1, false) } } // loadValidSections reads the number of valid sections from the index database // and caches is into the local state. func (c *ChainIndexer) loadValidSections() { data, _ := c.indexDb.Get([]byte("count")) if len(data) == 8 { c.storedSections = binary.BigEndian.Uint64(data[:]) } } // setValidSections writes the number of valid sections to the index database func (c *ChainIndexer) setValidSections(sections uint64) { // Set the current number of valid sections in the database var data [8]byte binary.BigEndian.PutUint64(data[:], sections) c.indexDb.Put([]byte("count"), data[:]) // Remove any reorged sections, caching the valids in the mean time for c.storedSections > sections { c.storedSections-- c.removeSectionHead(c.storedSections) } c.storedSections = sections // needed if new > old } // SectionHead retrieves the last block hash of a processed section from the // index database. func (c *ChainIndexer) SectionHead(section uint64) common.Hash { var data [8]byte binary.BigEndian.PutUint64(data[:], section) hash, _ := c.indexDb.Get(append([]byte("shead"), data[:]...)) if len(hash) == len(common.Hash{}) { return common.BytesToHash(hash) } return common.Hash{} } // setSectionHead writes the last block hash of a processed section to the index // database. func (c *ChainIndexer) setSectionHead(section uint64, hash common.Hash) { var data [8]byte binary.BigEndian.PutUint64(data[:], section) c.indexDb.Put(append([]byte("shead"), data[:]...), hash.Bytes()) } // removeSectionHead removes the reference to a processed section from the index // database. func (c *ChainIndexer) removeSectionHead(section uint64) { var data [8]byte binary.BigEndian.PutUint64(data[:], section) c.indexDb.Delete(append([]byte("shead"), data[:]...)) } ================================================ FILE: core/chain_indexer_test.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package core import ( "fmt" "math/big" "math/rand" "testing" "time" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core/rawdb" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/serodb" ) // Runs multiple tests with randomized parameters. func TestChainIndexerSingle(t *testing.T) { for i := 0; i < 10; i++ { testChainIndexer(t, 1) } } // Runs multiple tests with randomized parameters and different number of // chain backends. func TestChainIndexerWithChildren(t *testing.T) { for i := 2; i < 8; i++ { testChainIndexer(t, i) } } // testChainIndexer runs a test with either a single chain indexer or a chain of // multiple backends. The section size and required confirmation count parameters // are randomized. func testChainIndexer(t *testing.T, count int) { db := serodb.NewMemDatabase() defer db.Close() // Create a chain of indexers and ensure they all report empty backends := make([]*testChainIndexBackend, count) for i := 0; i < count; i++ { var ( sectionSize = uint64(rand.Intn(100) + 1) confirmsReq = uint64(rand.Intn(10)) ) backends[i] = &testChainIndexBackend{t: t, processCh: make(chan uint64)} backends[i].indexer = NewChainIndexer(db, serodb.NewTable(db, string([]byte{byte(i)})), backends[i], sectionSize, confirmsReq, 0, fmt.Sprintf("indexer-%d", i)) if sections, _, _ := backends[i].indexer.Sections(); sections != 0 { t.Fatalf("Canonical section count mismatch: have %v, want %v", sections, 0) } if i > 0 { backends[i-1].indexer.AddChildIndexer(backends[i].indexer) } } defer backends[0].indexer.Close() // parent indexer shuts down children // notify pings the root indexer about a new head or reorg, then expect // processed blocks if a section is processable notify := func(headNum, failNum uint64, reorg bool) { backends[0].indexer.newHead(headNum, reorg) if reorg { for _, backend := range backends { headNum = backend.reorg(headNum) backend.assertSections() } return } var cascade bool for _, backend := range backends { headNum, cascade = backend.assertBlocks(headNum, failNum) if !cascade { break } backend.assertSections() } } // inject inserts a new random canonical header into the database directly inject := func(number uint64) { header := &types.Header{Number: big.NewInt(int64(number)), Extra: big.NewInt(rand.Int63()).Bytes()} if number > 0 { header.ParentHash = rawdb.ReadCanonicalHash(db, number-1) } rawdb.WriteHeader(db, header) rawdb.WriteCanonicalHash(db, header.Hash(), number) } // Start indexer with an already existing chain for i := uint64(0); i <= 100; i++ { inject(i) } notify(100, 100, false) // Add new blocks one by one for i := uint64(101); i <= 1000; i++ { inject(i) notify(i, i, false) } // Do a reorg notify(500, 500, true) // Create new fork for i := uint64(501); i <= 1000; i++ { inject(i) notify(i, i, false) } for i := uint64(1001); i <= 1500; i++ { inject(i) } // Failed processing scenario where less blocks are available than notified notify(2000, 1500, false) // Notify about a reorg (which could have caused the missing blocks if happened during processing) notify(1500, 1500, true) // Create new fork for i := uint64(1501); i <= 2000; i++ { inject(i) notify(i, i, false) } } // testChainIndexBackend implements ChainIndexerBackend type testChainIndexBackend struct { t *testing.T indexer *ChainIndexer section, headerCnt, stored uint64 processCh chan uint64 } // assertSections verifies if a chain indexer has the correct number of section. func (b *testChainIndexBackend) assertSections() { // Keep trying for 3 seconds if it does not match var sections uint64 for i := 0; i < 300; i++ { sections, _, _ = b.indexer.Sections() if sections == b.stored { return } time.Sleep(10 * time.Millisecond) } b.t.Fatalf("Canonical section count mismatch: have %v, want %v", sections, b.stored) } // assertBlocks expects processing calls after new blocks have arrived. If the // failNum < headNum then we are simulating a scenario where a reorg has happened // after the processing has started and the processing of a section fails. func (b *testChainIndexBackend) assertBlocks(headNum, failNum uint64) (uint64, bool) { var sections uint64 if headNum >= b.indexer.confirmsReq { sections = (headNum + 1 - b.indexer.confirmsReq) / b.indexer.sectionSize if sections > b.stored { // expect processed blocks for expectd := b.stored * b.indexer.sectionSize; expectd < sections*b.indexer.sectionSize; expectd++ { if expectd > failNum { // rolled back after processing started, no more process calls expected // wait until updating is done to make sure that processing actually fails var updating bool for i := 0; i < 300; i++ { b.indexer.lock.Lock() updating = b.indexer.knownSections > b.indexer.storedSections b.indexer.lock.Unlock() if !updating { break } time.Sleep(10 * time.Millisecond) } if updating { b.t.Fatalf("update did not finish") } sections = expectd / b.indexer.sectionSize break } select { case <-time.After(10 * time.Second): b.t.Fatalf("Expected processed block #%d, got nothing", expectd) case processed := <-b.processCh: if processed != expectd { b.t.Errorf("Expected processed block #%d, got #%d", expectd, processed) } } } b.stored = sections } } if b.stored == 0 { return 0, false } return b.stored*b.indexer.sectionSize - 1, true } func (b *testChainIndexBackend) reorg(headNum uint64) uint64 { firstChanged := headNum / b.indexer.sectionSize if firstChanged < b.stored { b.stored = firstChanged } return b.stored * b.indexer.sectionSize } func (b *testChainIndexBackend) Reset(section uint64, prevHead common.Hash) error { b.section = section b.headerCnt = 0 return nil } func (b *testChainIndexBackend) Process(header *types.Header) { b.headerCnt++ if b.headerCnt > b.indexer.sectionSize { b.t.Error("Processing too many headers") } //t.processCh <- header.Number.Uint64() select { case <-time.After(10 * time.Second): b.t.Fatal("Unexpected call to Process") case b.processCh <- header.Number.Uint64(): } } func (b *testChainIndexBackend) Commit() error { if b.headerCnt != b.indexer.sectionSize { b.t.Error("Not enough headers processed") } return nil } ================================================ FILE: core/chain_makers.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package core import ( "fmt" "math/big" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/consensus" "github.com/sero-cash/go-sero/core/state" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/core/vm" "github.com/sero-cash/go-sero/params" "github.com/sero-cash/go-sero/serodb" ) // BlockGen creates blocks for testing. // See GenerateChain for a detailed explanation. type BlockGen struct { i int parent *types.Block chain []*types.Block chainReader consensus.ChainReader header *types.Header statedb *state.StateDB gasPool *GasPool txs []*types.Transaction receipts []*types.Receipt config *params.ChainConfig engine consensus.Engine } // SetCoinbase sets the coinbase of the generated block. // It can be called at most once. func (b *BlockGen) SetCoinbase(addr common.Address) { if b.gasPool != nil { if len(b.txs) > 0 { panic("coinbase must be set before adding transactions") } panic("coinbase can only be set once") } b.header.Coinbase = addr b.gasPool = new(GasPool).AddGas(b.header.GasLimit) } // SetExtra sets the extra data field of the generated block. func (b *BlockGen) SetExtra(data []byte) { b.header.Extra = data } // AddTx adds a transaction to the generated block. If no coinbase has // been set, the block's coinbase is set to the zero address. // // AddTx panics if the transaction cannot be executed. In addition to // the protocol-imposed limitations (gas limit, etc.), there are some // further limitations on the content of transactions that can be // added. Notably, contract code relying on the BLOCKHASH instruction // will panic during execution. func (b *BlockGen) AddTx(tx *types.Transaction) { b.AddTxWithChain(nil, tx) } // AddTxWithChain adds a transaction to the generated block. If no coinbase has // been set, the block's coinbase is set to the zero address. // // AddTxWithChain panics if the transaction cannot be executed. In addition to // the protocol-imposed limitations (gas limit, etc.), there are some // further limitations on the content of transactions that can be // added. If contract code relies on the BLOCKHASH instruction, // the block in chain will be returned. func (b *BlockGen) AddTxWithChain(bc *BlockChain, tx *types.Transaction) { if b.gasPool == nil { b.SetCoinbase(common.Address{}) } b.statedb.Prepare(tx.Hash(), common.Hash{}, len(b.txs)) receipt, _, err := ApplyTransaction(b.config, bc, &b.header.Coinbase, b.gasPool, b.statedb, b.header, tx, &b.header.GasUsed, vm.Config{}) if err != nil { panic(err) } b.txs = append(b.txs, tx) b.receipts = append(b.receipts, receipt) } // Number returns the block number of the block being generated. func (b *BlockGen) Number() *big.Int { return new(big.Int).Set(b.header.Number) } // AddUncheckedReceipt forcefully adds a receipts to the block without a // backing transaction. // // AddUncheckedReceipt will cause consensus failures when used during real // chain processing. This is best used in conjunction with raw block insertion. func (b *BlockGen) AddUncheckedReceipt(receipt *types.Receipt) { b.receipts = append(b.receipts, receipt) } // PrevBlock returns a previously generated block by number. It panics if // num is greater or equal to the number of the block being generated. // For index -1, PrevBlock returns the parent block given to GenerateChain. func (b *BlockGen) PrevBlock(index int) *types.Block { if index >= b.i { panic("block index out of range") } if index == -1 { return b.parent } return b.chain[index] } // OffsetTime modifies the time instance of a block, implicitly changing its // associated difficulty. It's useful to test scenarios where forking is not // tied to chain length directly. func (b *BlockGen) OffsetTime(seconds int64) { b.header.Time.Add(b.header.Time, new(big.Int).SetInt64(seconds)) if b.header.Time.Cmp(b.parent.Header().Time) <= 0 { panic("block time out of range") } b.header.Difficulty = b.engine.CalcDifficulty(b.chainReader, b.header.Time.Uint64(), b.parent.Header()) } // GenerateChain creates a chain of n blocks. The first block's // parent will be the provided parent. db is used to store // intermediate states and should contain the parent's state trie. // // The generator function is called with a new block generator for // every block. Any transactions added to the generator // become part of the block. If gen is nil, the blocks will be empty // and their coinbase will be the zero address. // // Blocks created by GenerateChain do not contain valid proof of work // values. Inserting them into BlockChain requires use of FakePow or // a similar non-validating proof of work implementation. func GenerateChain(config *params.ChainConfig, parent *types.Block, engine consensus.Engine, db serodb.Database, n int, gen func(int, *BlockGen)) ([]*types.Block, []types.Receipts) { if config == nil { config = params.AlphanetChainConfig } blocks, receipts := make(types.Blocks, n), make([]types.Receipts, n) genblock := func(i int, parent *types.Block, statedb *state.StateDB) (*types.Block, types.Receipts) { // TODO(karalabe): This is needed for clique, which depends on multiple blocks. // It's nonetheless ugly to spin up a blockchain here. Get rid of this somehow. blockchain, _ := NewBlockChain(db, nil, config, engine, vm.Config{}, nil) defer blockchain.Stop() b := &BlockGen{i: i, parent: parent, chain: blocks, chainReader: blockchain, statedb: statedb, config: config, engine: engine} b.header = makeHeader(b.chainReader, parent, statedb, b.engine) // Mutate the state and block according to any hard-fork specs // Execute any user modifications to the block and finalize it if gen != nil { gen(i, b) } if b.engine != nil { block, _ := b.engine.Finalize(b.chainReader, b.header, statedb, b.txs, b.receipts, 0) // Write state changes to db root, err := statedb.Commit(true) if err != nil { panic(fmt.Sprintf("state write error: %v", err)) } if err := statedb.Database().TrieDB().Commit(root, false); err != nil { panic(fmt.Sprintf("trie write error: %v", err)) } return block, b.receipts } return nil, nil } for i := 0; i < n; i++ { statedb, err := state.New(state.NewDatabase(db), parent.Header()) if err != nil { panic(err) } block, receipt := genblock(i, parent, statedb) blocks[i] = block receipts[i] = receipt parent = block } return blocks, receipts } func makeHeader(chain consensus.ChainReader, parent *types.Block, state *state.StateDB, engine consensus.Engine) *types.Header { var time *big.Int if parent.Time() == nil { time = big.NewInt(10) } else { time = new(big.Int).Add(parent.Time(), big.NewInt(10)) // block time is fixed at 10 seconds } return &types.Header{ Root: state.IntermediateRoot(true), ParentHash: parent.Hash(), Coinbase: parent.Coinbase(), Difficulty: engine.CalcDifficulty(chain, time.Uint64(), &types.Header{ Number: parent.Number(), Time: new(big.Int).Sub(time, big.NewInt(10)), Difficulty: parent.Difficulty(), }), GasLimit: CalcGasLimit(parent), Number: new(big.Int).Add(parent.Number(), common.Big1), Time: time, } } ================================================ FILE: core/error.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package core import "errors" var ( // ErrKnownBlock is returned when a block to import is already known locally. ErrKnownBlock = errors.New("block already known") // ErrGasLimitReached is returned by the gas pool if the amount of gas required // by a transaction is higher than what's left in the block. ErrGasLimitReached = errors.New("gas limit reached") // ErrBlacklistedHash is returned if a block to import is on the blacklist. ErrBlacklistedHash = errors.New("blacklisted hash") // ErrNonceTooHigh is returned if the nonce of a transaction is higher than the // next one expected based on the local chain. ErrNonceTooHigh = errors.New("nonce too high") ) ================================================ FILE: core/events.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package core import ( "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core/types" ) // NewTxsEvent is posted when a batch of transactions enter the transaction pool. type NewTxsEvent struct{ Txs []*types.Transaction } // PendingLogsEvent is posted pre mining and notifies of pending logs. type PendingLogsEvent struct { Logs []*types.Log } // PendingStateEvent is posted pre mining and notifies of pending state changes. type PendingStateEvent struct{} // NewMinedBlockEvent is posted when a block has been imported. type NewMinedBlockEvent struct{ Block *types.Block } // RemovedLogsEvent is posted when a reorg happens type RemovedLogsEvent struct{ Logs []*types.Log } type ChainEvent struct { Block *types.Block Hash common.Hash Logs []*types.Log } type ChainSideEvent struct { Block *types.Block } type ChainHeadEvent struct{ Block *types.Block } type NewLotteryEvent struct { Lottery *types.Lottery } type NewVoteEvent struct { Vote *types.Vote } ================================================ FILE: core/evm.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package core import ( "math/big" "strings" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/consensus" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/core/vm" ) // ChainContext supports retrieving headers and consensus parameters from the // current blockchain to be used during transaction processing. type ChainContext interface { // Engine retrieves the chain's consensus engine. Engine() consensus.Engine // GetHeader returns the hash corresponding to their hash. GetHeader(common.Hash, uint64) *types.Header } // NewEVMContext creates a new context for use in the EVM. func NewEVMContext(msg Message, header *types.Header, chain ChainContext, author *common.Address) vm.Context { // If we don't have an explicit author (i.e. not mining), extract from the header var beneficiary common.Address if author == nil { beneficiary, _ = chain.Engine().Author(header) // Ignore error, we're past header validation } else { beneficiary = *author } return vm.Context{ Transfer: Transfer, CanTransfer: CanTransfer, GetHash: GetHashFn(header, chain), Origin: msg.From(), Coinbase: beneficiary, BlockNumber: new(big.Int).Set(header.Number), Time: new(big.Int).Set(header.Time), Difficulty: new(big.Int).Set(header.Difficulty), GasLimit: header.GasLimit, GasPrice: new(big.Int).Set(msg.GasPrice()), TxHash: msg.TxHash(), } } // GetHashFn returns a GetHashFunc which retrieves header hashes by number func GetHashFn(ref *types.Header, chain ChainContext) func(n uint64) common.Hash { var cache map[uint64]common.Hash return func(n uint64) common.Hash { // If there's no hash cache yet, make one if cache == nil { cache = map[uint64]common.Hash{ ref.Number.Uint64() - 1: ref.ParentHash, } } // Try to fulfill the request from the cache if hash, ok := cache[n]; ok { return hash } // Not cached, iterate the blocks and cache the hashes for header := chain.GetHeader(ref.ParentHash, ref.Number.Uint64()-1); header != nil; header = chain.GetHeader(header.ParentHash, header.Number.Uint64()-1) { cache[header.Number.Uint64()-1] = header.ParentHash if n == header.Number.Uint64()-1 { return header.ParentHash } } return common.Hash{} } } // CanTransfer checks whether there are enough funds in the address' account to make a transfer. // This does not take the necessary gas in to account to make the transfer valid. func CanTransfer(db vm.StateDB, addr common.Address, asset *assets.Asset) bool { flag := true if asset == nil { return flag } if asset.Tkn != nil { amount := big.Int(asset.Tkn.Value) flag = db.GetBalance(addr, strings.Trim(string(asset.Tkn.Currency[:]), string([]byte{0}))).Cmp(&amount) >= 0 } if flag && asset.Tkt != nil { category := strings.Trim(string(asset.Tkt.Category[:]), string([]byte{0})) return db.OwnTicket(addr, category, common.BytesToHash(asset.Tkt.Value[:])) } return flag } // Transfer subtracts amount from sender and adds amount to recipient using the given Db func Transfer(db vm.StateDB, sender, recipient common.Address, asset *assets.Asset, txHash common.Hash) (alarm bool) { if asset == nil { return } if db.IsContract(sender) { if asset.Tkn != nil { amount := big.Int(asset.Tkn.Value) if amount.Sign() > 0 { currency := strings.Trim(string(asset.Tkn.Currency[:]), string([]byte{0})) db.SubBalance(sender, currency, &amount) } } if asset.Tkt != nil { category := strings.Trim(string(asset.Tkt.Category[:]), string([]byte{0})) db.RemoveTicket(sender, category, common.BytesToHash(asset.Tkt.Value[:])) } } if db.IsContract(recipient) { if asset.Tkn != nil { amount := big.Int(asset.Tkn.Value) if amount.Sign() > 0 { currency := strings.Trim(string(asset.Tkn.Currency[:]), string([]byte{0})) db.AddBalance(recipient, currency, &amount) } } if asset.Tkt != nil { category := strings.Trim(string(asset.Tkt.Category[:]), string([]byte{0})) db.AddTicket(recipient, category, common.BytesToHash(asset.Tkt.Value[:])) } } else { alarm = db.NextZState().AddTxOutWithCheck(recipient, *asset, txHash) } return } ================================================ FILE: core/gaspool.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package core import ( "fmt" "math" ) // GasPool tracks the amount of gas available during execution of the transactions // in a block. The zero value is a pool with zero gas available. type GasPool uint64 // AddGas makes gas available for execution. func (gp *GasPool) AddGas(amount uint64) *GasPool { if uint64(*gp) > math.MaxUint64-amount { panic("gas pool pushed above uint64") } *(*uint64)(gp) += amount return gp } // SubGas deducts the given amount from the pool if enough gas is // available and returns an error otherwise. func (gp *GasPool) SubGas(amount uint64) error { if uint64(*gp) < amount { return ErrGasLimitReached } *(*uint64)(gp) -= amount return nil } // Gas returns the amount of gas remaining in the pool. func (gp *GasPool) Gas() uint64 { return uint64(*gp) } func (gp *GasPool) String() string { return fmt.Sprintf("%d", *gp) } ================================================ FILE: core/gen_genesis.go ================================================ // Code generated by github.com/fjl/gencodec. DO NOT EDIT. package core import ( "encoding/json" "errors" "math/big" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/common/hexutil" "github.com/sero-cash/go-sero/common/math" "github.com/sero-cash/go-sero/params" ) var _ = (*genesisSpecMarshaling)(nil) func (g Genesis) MarshalJSON() ([]byte, error) { type Genesis struct { Config *params.ChainConfig `json:"config"` //Nonce math.HexOrDecimal64 `json:"nonce"` Timestamp math.HexOrDecimal64 `json:"timestamp"` ExtraData hexutil.Bytes `json:"extraData"` GasLimit math.HexOrDecimal64 `json:"gasLimit" gencodec:"required"` Difficulty *math.HexOrDecimal256 `json:"difficulty" gencodec:"required"` Mixhash common.Hash `json:"mixHash"` Coinbase common.Address `json:"coinbase"` Alloc map[common.UnprefixedAddress]GenesisAccount `json:"alloc" gencodec:"required"` Number math.HexOrDecimal64 `json:"number"` GasUsed math.HexOrDecimal64 `json:"gasUsed"` ParentHash common.Hash `json:"parentHash"` } var enc Genesis enc.Config = g.Config //enc.Nonce = math.HexOrDecimal64(g.Nonce) enc.Timestamp = math.HexOrDecimal64(g.Timestamp) enc.ExtraData = g.ExtraData enc.GasLimit = math.HexOrDecimal64(g.GasLimit) enc.Difficulty = (*math.HexOrDecimal256)(g.Difficulty) enc.Mixhash = g.Mixhash enc.Coinbase = g.Coinbase if g.Alloc != nil { enc.Alloc = make(map[common.UnprefixedAddress]GenesisAccount, len(g.Alloc)) for k, v := range g.Alloc { enc.Alloc[common.UnprefixedAddress(k)] = v } } enc.Number = math.HexOrDecimal64(g.Number) enc.GasUsed = math.HexOrDecimal64(g.GasUsed) enc.ParentHash = g.ParentHash return json.Marshal(&enc) } func (g *Genesis) UnmarshalJSON(input []byte) error { type Genesis struct { Config *params.ChainConfig `json:"config"` //Nonce *math.HexOrDecimal64 `json:"nonce"` Timestamp *math.HexOrDecimal64 `json:"timestamp"` ExtraData *hexutil.Bytes `json:"extraData"` GasLimit *math.HexOrDecimal64 `json:"gasLimit" gencodec:"required"` Difficulty *math.HexOrDecimal256 `json:"difficulty" gencodec:"required"` Mixhash *common.Hash `json:"mixHash"` Coinbase *common.Address `json:"coinbase"` Alloc map[common.UnprefixedAddress]GenesisAccount `json:"alloc" gencodec:"required"` Number *math.HexOrDecimal64 `json:"number"` GasUsed *math.HexOrDecimal64 `json:"gasUsed"` ParentHash *common.Hash `json:"parentHash"` } var dec Genesis if err := json.Unmarshal(input, &dec); err != nil { return err } if dec.Config != nil { g.Config = dec.Config } //if dec.Nonce != nil { // g.Nonce = uint64(*dec.Nonce) //} if dec.Timestamp != nil { g.Timestamp = uint64(*dec.Timestamp) } if dec.ExtraData != nil { g.ExtraData = *dec.ExtraData } if dec.GasLimit == nil { return errors.New("missing required field 'gasLimit' for Genesis") } g.GasLimit = uint64(*dec.GasLimit) if dec.Difficulty == nil { return errors.New("missing required field 'difficulty' for Genesis") } g.Difficulty = (*big.Int)(dec.Difficulty) if dec.Mixhash != nil { g.Mixhash = *dec.Mixhash } if dec.Coinbase != nil { g.Coinbase = *dec.Coinbase } if dec.Alloc == nil { return errors.New("missing required field 'alloc' for Genesis") } g.Alloc = make(GenesisAlloc, len(dec.Alloc)) for k, v := range dec.Alloc { g.Alloc[common.Address(k)] = v } if dec.Number != nil { g.Number = uint64(*dec.Number) } if dec.GasUsed != nil { g.GasUsed = uint64(*dec.GasUsed) } if dec.ParentHash != nil { g.ParentHash = *dec.ParentHash } return nil } ================================================ FILE: core/gen_genesis_account.go ================================================ // Code generated by github.com/fjl/gencodec. DO NOT EDIT. package core import ( "encoding/json" "errors" "math/big" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/common/hexutil" "github.com/sero-cash/go-sero/common/math" ) var _ = (*genesisAccountMarshaling)(nil) func (g GenesisAccount) MarshalJSON() ([]byte, error) { type GenesisAccount struct { Code hexutil.Bytes `json:"code,omitempty"` Storage map[storageJSON]storageJSON `json:"storage,omitempty"` Balance *math.HexOrDecimal256 `json:"balance" gencodec:"required"` Nonce math.HexOrDecimal64 `json:"nonce,omitempty"` } var enc GenesisAccount enc.Code = g.Code if g.Storage != nil { enc.Storage = make(map[storageJSON]storageJSON, len(g.Storage)) for k, v := range g.Storage { enc.Storage[storageJSON(k)] = storageJSON(v) } } enc.Balance = (*math.HexOrDecimal256)(g.Balance) enc.Nonce = math.HexOrDecimal64(g.Nonce) return json.Marshal(&enc) } func (g *GenesisAccount) UnmarshalJSON(input []byte) error { type GenesisAccount struct { Code *hexutil.Bytes `json:"code,omitempty"` Storage map[storageJSON]storageJSON `json:"storage,omitempty"` Balance *math.HexOrDecimal256 `json:"balance" gencodec:"required"` Nonce *math.HexOrDecimal64 `json:"nonce,omitempty"` } var dec GenesisAccount if err := json.Unmarshal(input, &dec); err != nil { return err } if dec.Code != nil { g.Code = *dec.Code } if dec.Storage != nil { g.Storage = make(map[common.Hash]common.Hash, len(dec.Storage)) for k, v := range dec.Storage { g.Storage[common.Hash(k)] = common.Hash(v) } } if dec.Balance == nil { return errors.New("missing required field 'balance' for GenesisAccount") } g.Balance = (*big.Int)(dec.Balance) if dec.Nonce != nil { g.Nonce = uint64(*dec.Nonce) } return nil } ================================================ FILE: core/genesis.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package core import ( "bytes" "encoding/hex" "encoding/json" "errors" "fmt" "math/big" "sort" "strings" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/common/hexutil" "github.com/sero-cash/go-sero/common/math" "github.com/sero-cash/go-sero/core/rawdb" "github.com/sero-cash/go-sero/core/state" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/params" "github.com/sero-cash/go-sero/rlp" "github.com/sero-cash/go-sero/serodb" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-sero/zero/utils" ) //go:generate gencodec -type Genesis -field-override genesisSpecMarshaling -out gen_genesis.go //go:generate gencodec -type GenesisAccount -field-override genesisAccountMarshaling -out gen_genesis_account.go var errGenesisNoConfig = errors.New("genesis has no chain configuration") // Genesis specifies the header fields, state of a genesis block. It also defines hard // fork switch-over blocks through the chain configuration. type Genesis struct { Config *params.ChainConfig `json:"config"` //Nonce uint64 `json:"nonce"` Timestamp uint64 `json:"timestamp"` ExtraData []byte `json:"extraData"` GasLimit uint64 `json:"gasLimit" gencodec:"required"` Difficulty *big.Int `json:"difficulty" gencodec:"required"` Mixhash common.Hash `json:"mixHash"` Coinbase common.Address `json:"coinbase"` Alloc GenesisAlloc `json:"alloc" gencodec:"required"` // These fields are used for consensus tests. Please don't use them // in actual genesis blocks. Number uint64 `json:"number"` GasUsed uint64 `json:"gasUsed"` ParentHash common.Hash `json:"parentHash"` } // GenesisAlloc specifies the initial state that is part of the genesis block. type GenesisAlloc map[common.Address]GenesisAccount func (ga *GenesisAlloc) UnmarshalJSON(data []byte) error { m := make(map[common.UnprefixedAddress]GenesisAccount) if err := json.Unmarshal(data, &m); err != nil { return err } *ga = make(GenesisAlloc) for addr, a := range m { (*ga)[common.Address(addr)] = a } return nil } // GenesisAccount is an account in the state of the genesis block. type GenesisAccount struct { Code []byte `json:"code,omitempty"` Storage map[common.Hash]common.Hash `json:"storage,omitempty"` Balance *big.Int `json:"balance" gencodec:"required"` Nonce uint64 `json:"nonce,omitempty"` } // field type overrides for gencodec type genesisSpecMarshaling struct { Nonce math.HexOrDecimal64 Timestamp math.HexOrDecimal64 ExtraData hexutil.Bytes GasLimit math.HexOrDecimal64 GasUsed math.HexOrDecimal64 Number math.HexOrDecimal64 Difficulty *math.HexOrDecimal256 Alloc map[common.UnprefixedAddress]GenesisAccount } type genesisAccountMarshaling struct { Code hexutil.Bytes Balance *math.HexOrDecimal256 Nonce math.HexOrDecimal64 Storage map[storageJSON]storageJSON PrivateKey hexutil.Bytes } // storageJSON represents a 256 bit byte array, but allows less than 256 bits when // unmarshaling from hex. type storageJSON common.Hash func (h *storageJSON) UnmarshalText(text []byte) error { text = bytes.TrimPrefix(text, []byte("0x")) if len(text) > 64 { return fmt.Errorf("too many hex characters in storage key/value %q", text) } offset := len(h) - len(text)/2 // pad on the left if _, err := hex.Decode(h[offset:], text); err != nil { fmt.Println(err) return fmt.Errorf("invalid hex storage key/value %q", text) } return nil } func (h storageJSON) MarshalText() ([]byte, error) { return hexutil.Bytes(h[:]).MarshalText() } // GenesisMismatchError is raised when trying to overwrite an existing // genesis block with an incompatible one. type GenesisMismatchError struct { Stored, New common.Hash } func (e *GenesisMismatchError) Error() string { return fmt.Sprintf("database already contains an incompatible genesis block (have %x, new %x)", e.Stored[:8], e.New[:8]) } // SetupGenesisBlock writes or updates the genesis block in db. // The block that will be used is: // // genesis == nil genesis != nil // +------------------------------------------ // db has no genesis | main-net default | genesis // db has genesis | from DB | genesis (if compatible) // // The stored chain configuration will be updated if it is compatible (i.e. does not // specify a fork block below the local head block). In case of a conflict, the // error is a *params.ConfigCompatError and the new, unwritten config is returned. // // The returned chain configuration is never nil. func SetupGenesisBlock(db serodb.Database, genesis *Genesis) (*params.ChainConfig, common.Hash, error) { if genesis != nil && genesis.Config == nil { return params.AllEthashProtocolChanges, common.Hash{}, errGenesisNoConfig } // Just commit the new block if there is no stored genesis block. stored := rawdb.ReadCanonicalHash(db, 0) if (stored == common.Hash{}) { if genesis == nil { log.Info("Writing default beta-net genesis block") genesis = DefaultGenesisBlock() } else { log.Info("Writing custom genesis block") } block, err := genesis.Commit(db) return genesis.Config, block.Hash(), err } // Check whether the genesis block is already written. if genesis != nil { hash := genesis.ToBlock(nil).Hash() if hash != stored { return genesis.Config, hash, &GenesisMismatchError{stored, hash} } } // Get the existing chain configuration. newcfg := genesis.configOrDefault(stored) storedcfg := rawdb.ReadChainConfig(db, stored) if storedcfg == nil { log.Warn("Found genesis block without chain config") rawdb.WriteChainConfig(db, stored, newcfg) return newcfg, stored, nil } // Special case: don't change the existing config of a non-mainnet chain if no new // config is supplied. These chains would get AllProtocolChanges (and a compat error) // if we just continued here. if genesis == nil && stored != params.MainnetGenesisHash { return storedcfg, stored, nil } // Check config compatibility and write the config. Compatibility errors // are returned to the caller unless we're already at block zero. height := rawdb.ReadHeaderNumber(db, rawdb.ReadHeadHeaderHash(db)) if height == nil { return newcfg, stored, fmt.Errorf("missing block number for head header hash") } compatErr := storedcfg.CheckCompatible(newcfg, *height) if compatErr != nil && *height != 0 && compatErr.RewindTo != 0 { return newcfg, stored, compatErr } rawdb.WriteChainConfig(db, stored, newcfg) return newcfg, stored, nil } func (g *Genesis) configOrDefault(ghash common.Hash) *params.ChainConfig { switch { case g != nil: return g.Config case ghash == params.MainnetGenesisHash: return params.BetanetChainConfig case ghash == params.AlphanetGenesisHash: return params.AlphanetChainConfig default: return params.AllEthashProtocolChanges } } // ToBlock creates the genesis block and writes state of a genesis specification // to the given database (or discards it if nil). func (g *Genesis) ToBlock(db serodb.Database) *types.Block { if db == nil { db = serodb.NewMemDatabase() } statedb, _ := state.New(state.NewDatabase(db), nil) statedb.RegisterToken(state.EmptyAddress, "SERO") statedb.AddBalance(state.EmptyAddress, "SERO", new(big.Int).Mul(big.NewInt(250000000), big.NewInt(1e+18))) sero := common.BytesToHash(common.LeftPadBytes([]byte("SERO"), 32)) var keys common.AddressList for k := range g.Alloc { keys = append(keys, k) } sort.Sort(keys) for _, addr := range keys { account := g.Alloc[addr] if addr == state.EmptyAddress { } else if account.Code != nil && len(account.Code) > 0 { if account.Balance != nil && account.Balance.Sign() > 0 { statedb.AddBalance(addr, "SERO", account.Balance) } statedb.SetCode(addr, account.Code) } else { if account.Balance != nil && account.Balance.Sign() > 0 { asset := assets.Asset{Tkn: &assets.Token{ Currency: *sero.HashToUint256(), Value: utils.U256(*account.Balance), }, } statedb.NextZState().AddTxOut(addr, asset, common.Hash{}) } } for key, value := range account.Storage { statedb.SetState(addr, key, value) } } root := statedb.IntermediateRoot(false) head := &types.Header{ Number: new(big.Int).SetUint64(g.Number), Time: new(big.Int).SetUint64(g.Timestamp), ParentHash: g.ParentHash, Extra: g.ExtraData, GasLimit: g.GasLimit, GasUsed: g.GasUsed, Difficulty: g.Difficulty, MixDigest: g.Mixhash, Coinbase: g.Coinbase, Root: root, } if g.GasLimit == 0 { head.GasLimit = params.GenesisGasLimit } if g.Difficulty == nil { head.Difficulty = params.GenesisDifficulty } statedb.Commit(false) statedb.Database().TrieDB().Commit(root, true) block := types.NewBlock(head, nil, nil) blockhash := block.Hash() statedb.GetStakeCons().Record(block.Header(), db) statedb.NextZState().RecordBlock(db, blockhash.HashToUint256()) return block } // Commit writes the block and state of a genesis specification to the database. // The block is committed as the canonical head block. func (g *Genesis) Commit(db serodb.Database) (*types.Block, error) { block := g.ToBlock(db) if block.Number().Sign() != 0 { return nil, fmt.Errorf("can't commit genesis block with number > 0") } rawdb.WriteTd(db, block.Hash(), block.NumberU64(), g.Difficulty) rawdb.WriteBlock(db, block) rawdb.WriteReceipts(db, block.Hash(), block.NumberU64(), nil) rawdb.WriteCanonicalHash(db, block.Hash(), block.NumberU64()) rawdb.WriteHeadBlockHash(db, block.Hash()) rawdb.WriteHeadHeaderHash(db, block.Hash()) config := g.Config if config == nil { config = params.AllEthashProtocolChanges } rawdb.WriteChainConfig(db, block.Hash(), config) return block, nil } // MustCommit writes the genesis block and state to db, panicking on error. // The block is committed as the canonical head block. func (g *Genesis) MustCommit(db serodb.Database) *types.Block { block, err := g.Commit(db) if err != nil { panic(err) } return block } // DefaultGenesisBlock returns the Ethereum main net genesis block. func DefaultGenesisBlock() *Genesis { return &Genesis{ Config: params.BetanetChainConfig, ExtraData: hexutil.MustDecode("0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa"), GasLimit: 5000000, Difficulty: big.NewInt(1717986918), Alloc: decodePreAlloc(mainnetAllocData), Coinbase: common.Base58ToAddress("1111111111111111111111111111111111111111111111111111111111111111"), ParentHash: common.Hash{}, Mixhash: common.Hash{}, } } // DefaultAlphanetGenesisBlock returns the Ropsten network genesis block. func DefaultAlphanetGenesisBlock() *Genesis { return &Genesis{ Config: params.AlphanetChainConfig, //Nonce: 66, ExtraData: hexutil.MustDecode("0x3535353535353535353535353535353535353535353535353535353535353535"), GasLimit: 5000000, Difficulty: big.NewInt(51485767), //Alloc: decodePrealloc(testnetAllocData), } } // DeveloperGenesisBlock returns the 'gero --dev' genesis block. Note, this must func DeveloperGenesisBlock() *Genesis { return &Genesis{ Config: params.DevnetChainConfig, //Nonce: 66, ExtraData: hexutil.MustDecode("0x52657370656374206d7920617574686f7269746168207e452e436172746d616e42eb768f2244c8811c63729a21a3569731535f067ffc57839b00206d1ad20c69a1981b489f772031b279182d99e65703f0076e4812653aab85fca0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), GasLimit: 5000000, Difficulty: big.NewInt(1), Alloc: decodePreAlloc(testnetAllocData), } } func decodePrealloc(data string) GenesisAlloc { var p []struct{ Addr, Balance *big.Int } if err := rlp.NewStream(strings.NewReader(data), 0).Decode(&p); err != nil { panic(err) } ga := make(GenesisAlloc, len(p)) for _, account := range p { ga[common.BigToAddress(account.Addr)] = GenesisAccount{Balance: account.Balance} } return ga } type Storage struct { Key common.Hash Value common.Hash } type AllocItem struct { Addr common.Address Balance *big.Int Code []byte Storages []Storage } func decodePreAlloc(data string) GenesisAlloc { var p []AllocItem if len(strings.TrimSpace(data)) == 0 { return GenesisAlloc{} } if err := rlp.NewStream(strings.NewReader(data), 0).Decode(&p); err != nil { panic(err) } ga := make(GenesisAlloc, len(p)) for _, allocItem := range p { account := GenesisAccount{Code: allocItem.Code, Balance: allocItem.Balance} if len(allocItem.Storages) > 0 { s := map[common.Hash]common.Hash{} for _, each := range allocItem.Storages { s[each.Key] = each.Value } account.Storage = s } ga[allocItem.Addr] = account } return ga } ================================================ FILE: core/genesis_alloc.go ================================================ [File too large to display: 18.4 MB] ================================================ FILE: core/headerchain.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package core import ( crand "crypto/rand" "errors" "fmt" "math" "math/big" mrand "math/rand" "sync/atomic" "time" "github.com/hashicorp/golang-lru" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/consensus" "github.com/sero-cash/go-sero/core/rawdb" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/params" "github.com/sero-cash/go-sero/serodb" ) const ( headerCacheLimit = 512 tdCacheLimit = 1024 numberCacheLimit = 2048 ) // HeaderChain implements the basic block header chain logic that is shared by // core.BlockChain and light.LightChain. It is not usable in itself, only as // a part of either structure. // It is not thread safe either, the encapsulating chain structures should do // the necessary mutex locking/unlocking. type HeaderChain struct { config *params.ChainConfig chainDb serodb.Database genesisHeader *types.Header currentHeader atomic.Value // Current head of the header chain (may be above the block chain!) currentHeaderHash common.Hash // Hash of the current head of the header chain (prevent recomputing all the time) headerCache *lru.Cache // Cache for the most recent block headers tdCache *lru.Cache // Cache for the most recent block total difficulties numberCache *lru.Cache // Cache for the most recent block numbers procInterrupt func() bool rand *mrand.Rand engine consensus.Engine } // NewHeaderChain creates a new HeaderChain structure. // getValidator should return the parent's validator // procInterrupt points to the parent's interrupt semaphore // wg points to the parent's shutdown wait group func NewHeaderChain(chainDb serodb.Database, config *params.ChainConfig, engine consensus.Engine, procInterrupt func() bool) (*HeaderChain, error) { headerCache, _ := lru.New(headerCacheLimit) tdCache, _ := lru.New(tdCacheLimit) numberCache, _ := lru.New(numberCacheLimit) // Seed a fast but crypto originating random generator seed, err := crand.Int(crand.Reader, big.NewInt(math.MaxInt64)) if err != nil { return nil, err } hc := &HeaderChain{ config: config, chainDb: chainDb, headerCache: headerCache, tdCache: tdCache, numberCache: numberCache, procInterrupt: procInterrupt, rand: mrand.New(mrand.NewSource(seed.Int64())), engine: engine, } hc.genesisHeader = hc.GetHeaderByNumber(0) if hc.genesisHeader == nil { return nil, ErrNoGenesis } hc.currentHeader.Store(hc.genesisHeader) if head := rawdb.ReadHeadBlockHash(chainDb); head != (common.Hash{}) { if chead := hc.GetHeaderByHash(head); chead != nil { hc.currentHeader.Store(chead) } } hc.currentHeaderHash = hc.CurrentHeader().Hash() return hc, nil } // GetBlockNumber retrieves the block number belonging to the given hash // from the cache or database func (hc *HeaderChain) GetBlockNumber(hash common.Hash) *uint64 { if cached, ok := hc.numberCache.Get(hash); ok { number := cached.(uint64) return &number } number := rawdb.ReadHeaderNumber(hc.chainDb, hash) if number != nil { hc.numberCache.Add(hash, *number) } return number } // WriteHeader writes a header into the local chain, given that its parent is // already known. If the total difficulty of the newly inserted header becomes // greater than the current known TD, the canonical chain is re-routed. // // Note: This method is not concurrent-safe with inserting blocks simultaneously // into the chain, as side effects caused by reorganisations cannot be emulated // without the real blocks. Hence, writing headers directly should only be done // in two scenarios: pure-header mode of operation (light clients), or properly // separated header/block phases (non-archive clients). func (hc *HeaderChain) WriteHeader(header *types.Header) (status WriteStatus, err error) { // Cache some values to prevent constant recalculation var ( hash = header.Hash() number = header.Number.Uint64() ) // Calculate the total difficulty of the header ptd := hc.GetTd(header.ParentHash, number-1) if ptd == nil { return NonStatTy, consensus.ErrUnknownAncestor } localTd := hc.GetTd(hc.currentHeaderHash, hc.CurrentHeader().Number.Uint64()) externTd := new(big.Int).Add(header.Difficulty, ptd) // Irrelevant of the canonical status, write the td and header to the database if err := hc.WriteTd(hash, number, externTd); err != nil { log.Crit("Failed to write header total difficulty", "err", err) } rawdb.WriteHeader(hc.chainDb, header) // If the total difficulty is higher than our known, add it to the canonical chain // Second clause in the if statement reduces the vulnerability to selfish mining. // Please refer to http://www.cs.cornell.edu/~ie53/publications/btcProcFC.pdf if externTd.Cmp(localTd) > 0 || (externTd.Cmp(localTd) == 0 && mrand.Float64() < 0.5) { // Delete any canonical number assignments above the new head batch := hc.chainDb.NewBatch() for i := number + 1; ; i++ { hash := rawdb.ReadCanonicalHash(hc.chainDb, i) if hash == (common.Hash{}) { break } rawdb.DeleteCanonicalHash(batch, i) } batch.Write() // Overwrite any stale canonical number assignments var ( headHash = header.ParentHash headNumber = header.Number.Uint64() - 1 headHeader = hc.GetHeader(headHash, headNumber) ) for rawdb.ReadCanonicalHash(hc.chainDb, headNumber) != headHash { rawdb.WriteCanonicalHash(hc.chainDb, headHash, headNumber) headHash = headHeader.ParentHash headNumber = headHeader.Number.Uint64() - 1 headHeader = hc.GetHeader(headHash, headNumber) } // Extend the canonical chain with the new header rawdb.WriteCanonicalHash(hc.chainDb, hash, number) rawdb.WriteHeadHeaderHash(hc.chainDb, hash) hc.currentHeaderHash = hash hc.currentHeader.Store(types.CopyHeader(header)) status = CanonStatTy } else { status = SideStatTy } hc.headerCache.Add(hash, header) hc.numberCache.Add(hash, number) return } // WhCallback is a callback function for inserting individual headers. // A callback is used for two reasons: first, in a LightChain, status should be // processed and light chain events sent, while in a BlockChain this is not // necessary since chain events are sent after inserting blocks. Second, the // header writes should be protected by the parent chain mutex individually. type WhCallback func(*types.Header) error func (hc *HeaderChain) ValidateHeaderChain(chain []*types.Header, checkFreq int) (int, error) { // Do a sanity check that the provided chain is actually ordered and linked for i := 1; i < len(chain); i++ { if chain[i].Number.Uint64() != chain[i-1].Number.Uint64()+1 || chain[i].ParentHash != chain[i-1].Hash() { // Chain broke ancestry, log a message (programming error) and skip insertion log.Error("Non contiguous header insert", "number", chain[i].Number, "hash", chain[i].Hash(), "parent", chain[i].ParentHash, "prevnumber", chain[i-1].Number, "prevhash", chain[i-1].Hash()) return 0, fmt.Errorf("non contiguous insert: item %d is #%d [%x…], item %d is #%d [%x…] (parent [%x…])", i-1, chain[i-1].Number, chain[i-1].Hash().Bytes()[:4], i, chain[i].Number, chain[i].Hash().Bytes()[:4], chain[i].ParentHash[:4]) } } // Generate the list of seal verification requests, and start the parallel verifier seals := make([]bool, len(chain)) for i := 0; i < len(seals)/checkFreq; i++ { index := i*checkFreq + hc.rand.Intn(checkFreq) if index >= len(seals) { index = len(seals) - 1 } seals[index] = true } seals[len(seals)-1] = true // Last should always be verified to avoid junk abort, results := hc.engine.VerifyHeaders(hc, chain, seals) defer close(abort) // Iterate over the headers and ensure they all check out for i := range chain { // If the chain is terminating, stop processing blocks if hc.procInterrupt() { log.Debug("Premature abort during headers verification") return 0, errors.New("aborted") } // Otherwise wait for headers checks and ensure they pass if err := <-results; err != nil { return i, err } } return 0, nil } // InsertHeaderChain attempts to insert the given header chain in to the local // chain, possibly creating a reorg. If an error is returned, it will return the // index number of the failing header as well an error describing what went wrong. // // The verify parameter can be used to fine tune whether nonce verification // should be done or not. The reason behind the optional check is because some // of the header retrieval mechanisms already need to verfy nonces, as well as // because nonces can be verified sparsely, not needing to check each. func (hc *HeaderChain) InsertHeaderChain(chain []*types.Header, writeHeader WhCallback, start time.Time) (int, error) { // Collect some import statistics to report on stats := struct{ processed, ignored int }{} // All headers passed verification, import them into the database for i, header := range chain { // Short circuit insertion if shutting down if hc.procInterrupt() { log.Debug("Premature abort during headers import") return i, errors.New("aborted") } // If the header's already known, skip it, otherwise store if hc.HasHeader(header.Hash(), header.Number.Uint64()) { stats.ignored++ continue } if err := writeHeader(header); err != nil { return i, err } stats.processed++ } // Report some public statistics so the user has a clue what's going on last := chain[len(chain)-1] log.Info("Imported new block headers", "count", stats.processed, "elapsed", common.PrettyDuration(time.Since(start)), "number", last.Number, "hash", last.Hash(), "ignored", stats.ignored) return 0, nil } // GetBlockHashesFromHash retrieves a number of block hashes starting at a given // hash, fetching towards the genesis block. func (hc *HeaderChain) GetBlockHashesFromHash(hash common.Hash, max uint64) []common.Hash { // Get the origin header from which to fetch header := hc.GetHeaderByHash(hash) if header == nil { return nil } // Iterate the headers until enough is collected or the genesis reached chain := make([]common.Hash, 0, max) for i := uint64(0); i < max; i++ { next := header.ParentHash if header = hc.GetHeader(next, header.Number.Uint64()-1); header == nil { break } chain = append(chain, next) if header.Number.Sign() == 0 { break } } return chain } // GetAncestor retrieves the Nth ancestor of a given block. It assumes that either the given block or // a close ancestor of it is canonical. maxNonCanonical points to a downwards counter limiting the // number of blocks to be individually checked before we reach the canonical chain. // // Note: ancestor == 0 returns the same block, 1 returns its parent and so on. func (hc *HeaderChain) GetAncestor(hash common.Hash, number, ancestor uint64, maxNonCanonical *uint64) (common.Hash, uint64) { if ancestor > number { return common.Hash{}, 0 } if ancestor == 1 { // in this case it is cheaper to just read the header if header := hc.GetHeader(hash, number); header != nil { return header.ParentHash, number - 1 } else { return common.Hash{}, 0 } } for ancestor != 0 { if rawdb.ReadCanonicalHash(hc.chainDb, number) == hash { number -= ancestor return rawdb.ReadCanonicalHash(hc.chainDb, number), number } if *maxNonCanonical == 0 { return common.Hash{}, 0 } *maxNonCanonical-- ancestor-- header := hc.GetHeader(hash, number) if header == nil { return common.Hash{}, 0 } hash = header.ParentHash number-- } return hash, number } // GetTd retrieves a block's total difficulty in the canonical chain from the // database by hash and number, caching it if found. func (hc *HeaderChain) GetTd(hash common.Hash, number uint64) *big.Int { // Short circuit if the td's already in the cache, retrieve otherwise if cached, ok := hc.tdCache.Get(hash); ok { return cached.(*big.Int) } td := rawdb.ReadTd(hc.chainDb, hash, number) if td == nil { return nil } // Cache the found body for next time and return hc.tdCache.Add(hash, td) return td } // GetTdByHash retrieves a block's total difficulty in the canonical chain from the // database by hash, caching it if found. func (hc *HeaderChain) GetTdByHash(hash common.Hash) *big.Int { number := hc.GetBlockNumber(hash) if number == nil { return nil } return hc.GetTd(hash, *number) } // WriteTd stores a block's total difficulty into the database, also caching it // along the way. func (hc *HeaderChain) WriteTd(hash common.Hash, number uint64, td *big.Int) error { rawdb.WriteTd(hc.chainDb, hash, number, td) hc.tdCache.Add(hash, new(big.Int).Set(td)) return nil } // GetHeader retrieves a block header from the database by hash and number, // caching it if found. func (hc *HeaderChain) GetHeader(hash common.Hash, number uint64) *types.Header { // Short circuit if the header's already in the cache, retrieve otherwise if header, ok := hc.headerCache.Get(hash); ok { return header.(*types.Header) } header := rawdb.ReadHeader(hc.chainDb, hash, number) if header == nil { return nil } // Cache the found header for next time and return hc.headerCache.Add(hash, header) return header } // GetHeaderByHash retrieves a block header from the database by hash, caching it if // found. func (hc *HeaderChain) GetHeaderByHash(hash common.Hash) *types.Header { number := hc.GetBlockNumber(hash) if number == nil { return nil } return hc.GetHeader(hash, *number) } // HasHeader checks if a block header is present in the database or not. func (hc *HeaderChain) HasHeader(hash common.Hash, number uint64) bool { if hc.numberCache.Contains(hash) || hc.headerCache.Contains(hash) { return true } return rawdb.HasHeader(hc.chainDb, hash, number) } // GetHeaderByNumber retrieves a block header from the database by number, // caching it (associated with its hash) if found. func (hc *HeaderChain) GetHeaderByNumber(number uint64) *types.Header { hash := rawdb.ReadCanonicalHash(hc.chainDb, number) if hash == (common.Hash{}) { return nil } return hc.GetHeader(hash, number) } // CurrentHeader retrieves the current head header of the canonical chain. The // header is retrieved from the HeaderChain's internal cache. func (hc *HeaderChain) CurrentHeader() *types.Header { return hc.currentHeader.Load().(*types.Header) } // SetCurrentHeader sets the current head header of the canonical chain. func (hc *HeaderChain) SetCurrentHeader(head *types.Header) { rawdb.WriteHeadHeaderHash(hc.chainDb, head.Hash()) hc.currentHeader.Store(head) hc.currentHeaderHash = head.Hash() } // DeleteCallback is a callback function that is called by SetHead before // each header is deleted. type DeleteCallback func(rawdb.DatabaseDeleter, common.Hash, uint64) // SetHead rewinds the local chain to a new head. Everything above the new head // will be deleted and the new one set. func (hc *HeaderChain) SetHead(head uint64, delFn DeleteCallback) { height := uint64(0) if hdr := hc.CurrentHeader(); hdr != nil { height = hdr.Number.Uint64() } batch := hc.chainDb.NewBatch() for hdr := hc.CurrentHeader(); hdr != nil && hdr.Number.Uint64() > head; hdr = hc.CurrentHeader() { hash := hdr.Hash() num := hdr.Number.Uint64() if delFn != nil { delFn(batch, hash, num) } rawdb.DeleteTd(batch, hash, num) hc.currentHeader.Store(hc.GetHeader(hdr.ParentHash, hdr.Number.Uint64()-1)) } // Roll back the canonical chain numbering for i := height; i > head; i-- { rawdb.DeleteCanonicalHash(batch, i) } batch.Write() // Clear out any stale content from the caches hc.headerCache.Purge() hc.tdCache.Purge() hc.numberCache.Purge() if hc.CurrentHeader() == nil { hc.currentHeader.Store(hc.genesisHeader) } hc.currentHeaderHash = hc.CurrentHeader().Hash() rawdb.WriteHeadHeaderHash(hc.chainDb, hc.currentHeaderHash) } // SetGenesis sets a new genesis block header for the chain func (hc *HeaderChain) SetGenesis(head *types.Header) { hc.genesisHeader = head } // Config retrieves the header chain's chain configuration. func (hc *HeaderChain) Config() *params.ChainConfig { return hc.config } // Engine retrieves the header chain's consensus engine. func (hc *HeaderChain) Engine() consensus.Engine { return hc.engine } // GetBlock implements consensus.ChainReader, and returns nil for every input as // a header chain does not have blocks available for retrieval. func (hc *HeaderChain) GetBlock(hash common.Hash, number uint64) *types.Block { return nil } ================================================ FILE: core/mkalloc.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // +build none /* The mkalloc tool creates the genesis allocation constants in genesis_alloc.go It outputs a const declaration that contains an RLP-encoded list of (address, balance) tuples. go run mkalloc.go genesis.json */ package main import ( "encoding/json" "fmt" "math/big" "os" "sort" "strconv" "github.com/sero-cash/go-sero/core" "github.com/sero-cash/go-sero/rlp" ) type allocItem struct{ Addr, Balance *big.Int } type allocList []allocItem func (a allocList) Len() int { return len(a) } func (a allocList) Less(i, j int) bool { return a[i].Addr.Cmp(a[j].Addr) < 0 } func (a allocList) Swap(i, j int) { a[i], a[j] = a[j], a[i] } func makelist(g *core.Genesis) allocList { a := make(allocList, 0, len(g.Alloc)) for addr, account := range g.Alloc { if len(account.Storage) > 0 || len(account.Code) > 0 || account.Nonce != 0 { panic(fmt.Sprintf("can't encode account %x", addr)) } a = append(a, allocItem{addr.Big(), account.Balance}) } sort.Sort(a) return a } func makealloc(g *core.Genesis) string { a := makelist(g) data, err := rlp.EncodeToBytes(a) if err != nil { panic(err) } return strconv.QuoteToASCII(string(data)) } func main() { if len(os.Args) != 2 { fmt.Fprintln(os.Stderr, "Usage: mkalloc genesis.json") os.Exit(1) } g := new(core.Genesis) file, err := os.Open(os.Args[1]) if err != nil { panic(err) } if err := json.NewDecoder(file).Decode(g); err != nil { panic(err) } fmt.Println("const allocData =", makealloc(g)) } ================================================ FILE: core/rawdb/accessors_chain.go ================================================ // Copyright 2018 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package rawdb import ( "bytes" "encoding/binary" "math/big" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/rlp" ) // ReadCanonicalHash retrieves the hash assigned to a canonical block number. func ReadCanonicalHash(db DatabaseReader, number uint64) common.Hash { data, _ := db.Get(headerHashKey(number)) if len(data) == 0 { return common.Hash{} } return common.BytesToHash(data) } // WriteCanonicalHash stores the hash assigned to a canonical block number. func WriteCanonicalHash(db DatabaseWriter, hash common.Hash, number uint64) { if err := db.Put(headerHashKey(number), hash.Bytes()); err != nil { log.Crit("Failed to store number to hash mapping", "err", err) } } // DeleteCanonicalHash removes the number to hash canonical mapping. func DeleteCanonicalHash(db DatabaseDeleter, number uint64) { if err := db.Delete(headerHashKey(number)); err != nil { log.Crit("Failed to delete number to hash mapping", "err", err) } } // ReadHeaderNumber returns the header number assigned to a hash. func ReadHeaderNumber(db DatabaseReader, hash common.Hash) *uint64 { data, _ := db.Get(headerNumberKey(hash)) if len(data) != 8 { return nil } number := binary.BigEndian.Uint64(data) return &number } // ReadHeadHeaderHash retrieves the hash of the current canonical head header. func ReadHeadHeaderHash(db DatabaseReader) common.Hash { data, _ := db.Get(headHeaderKey) if len(data) == 0 { return common.Hash{} } return common.BytesToHash(data) } // WriteHeadHeaderHash stores the hash of the current canonical head header. func WriteHeadHeaderHash(db DatabaseWriter, hash common.Hash) { if err := db.Put(headHeaderKey, hash.Bytes()); err != nil { log.Crit("Failed to store last header's hash", "err", err) } } // ReadHeadBlockHash retrieves the hash of the current canonical head block. func ReadHeadBlockHash(db DatabaseReader) common.Hash { data, _ := db.Get(headBlockKey) if len(data) == 0 { return common.Hash{} } return common.BytesToHash(data) } // WriteHeadBlockHash stores the head block's hash. func WriteHeadBlockHash(db DatabaseWriter, hash common.Hash) { if err := db.Put(headBlockKey, hash.Bytes()); err != nil { log.Crit("Failed to store last block's hash", "err", err) } } // ReadHeadFastBlockHash retrieves the hash of the current fast-sync head block. func ReadHeadFastBlockHash(db DatabaseReader) common.Hash { data, _ := db.Get(headFastBlockKey) if len(data) == 0 { return common.Hash{} } return common.BytesToHash(data) } // WriteHeadFastBlockHash stores the hash of the current fast-sync head block. func WriteHeadFastBlockHash(db DatabaseWriter, hash common.Hash) { if err := db.Put(headFastBlockKey, hash.Bytes()); err != nil { log.Crit("Failed to store last fast block's hash", "err", err) } } // ReadFastTrieProgress retrieves the number of tries nodes fast synced to allow // reporting correct numbers across restarts. func ReadFastTrieProgress(db DatabaseReader) uint64 { data, _ := db.Get(fastTrieProgressKey) if len(data) == 0 { return 0 } return new(big.Int).SetBytes(data).Uint64() } // WriteFastTrieProgress stores the fast sync trie process counter to support // retrieving it across restarts. func WriteFastTrieProgress(db DatabaseWriter, count uint64) { if err := db.Put(fastTrieProgressKey, new(big.Int).SetUint64(count).Bytes()); err != nil { log.Crit("Failed to store fast sync trie progress", "err", err) } } // ReadHeaderRLP retrieves a block header in its raw RLP database encoding. func ReadHeaderRLP(db DatabaseReader, hash common.Hash, number uint64) rlp.RawValue { data, _ := db.Get(headerKey(number, hash)) return data } // HasHeader verifies the existence of a block header corresponding to the hash. func HasHeader(db DatabaseReader, hash common.Hash, number uint64) bool { if has, err := db.Has(headerKey(number, hash)); !has || err != nil { return false } return true } // ReadHeader retrieves the block header corresponding to the hash. func ReadHeader(db DatabaseReader, hash common.Hash, number uint64) *types.Header { data := ReadHeaderRLP(db, hash, number) if len(data) == 0 { return nil } header := new(types.Header) if err := rlp.Decode(bytes.NewReader(data), header); err != nil { log.Error("Invalid block header RLP", "hash", hash, "err", err) return nil } return header } // WriteHeader stores a block header into the database and also stores the hash- // to-number mapping. func WriteHeader(db DatabaseWriter, header *types.Header) { // Write the hash -> number mapping var ( hash = header.Hash() number = header.Number.Uint64() encoded = encodeBlockNumber(number) ) key := headerNumberKey(hash) if err := db.Put(key, encoded); err != nil { log.Crit("Failed to store hash to number mapping", "err", err) } // Write the encoded header data, err := rlp.EncodeToBytes(header) if err != nil { log.Crit("Failed to RLP encode header", "err", err) } key = headerKey(number, hash) if err := db.Put(key, data); err != nil { log.Crit("Failed to store header", "err", err) } } // DeleteHeader removes all block header data associated with a hash. func DeleteHeader(db DatabaseDeleter, hash common.Hash, number uint64) { if err := db.Delete(headerKey(number, hash)); err != nil { log.Crit("Failed to delete header", "err", err) } if err := db.Delete(headerNumberKey(hash)); err != nil { log.Crit("Failed to delete hash to number mapping", "err", err) } } // ReadBodyRLP retrieves the block body (transactions) in RLP encoding. func ReadBodyRLP(db DatabaseReader, hash common.Hash, number uint64) rlp.RawValue { data, _ := db.Get(blockBodyKey(number, hash)) return data } // WriteBodyRLP stores an RLP encoded block body into the database. func WriteBodyRLP(db DatabaseWriter, hash common.Hash, number uint64, rlp rlp.RawValue) { if err := db.Put(blockBodyKey(number, hash), rlp); err != nil { log.Crit("Failed to store block body", "err", err) } } // HasBody verifies the existence of a block body corresponding to the hash. func HasBody(db DatabaseReader, hash common.Hash, number uint64) bool { if has, err := db.Has(blockBodyKey(number, hash)); !has || err != nil { return false } return true } // ReadBody retrieves the block body corresponding to the hash. func ReadBody(db DatabaseReader, hash common.Hash, number uint64) *types.Body { data := ReadBodyRLP(db, hash, number) if len(data) == 0 { return nil } body := new(types.Body) if err := rlp.Decode(bytes.NewReader(data), body); err != nil { log.Error("Invalid block body RLP", "hash", hash, "err", err) return nil } return body } // WriteBody storea a block body into the database. func WriteBody(db DatabaseWriter, hash common.Hash, number uint64, body *types.Body) { data, err := rlp.EncodeToBytes(body) if err != nil { log.Crit("Failed to RLP encode body", "err", err) } WriteBodyRLP(db, hash, number, data) } // DeleteBody removes all block body data associated with a hash. func DeleteBody(db DatabaseDeleter, hash common.Hash, number uint64) { if err := db.Delete(blockBodyKey(number, hash)); err != nil { log.Crit("Failed to delete block body", "err", err) } } // ReadTd retrieves a block's total difficulty corresponding to the hash. func ReadTd(db DatabaseReader, hash common.Hash, number uint64) *big.Int { data, _ := db.Get(headerTDKey(number, hash)) if len(data) == 0 { return nil } td := new(big.Int) if err := rlp.Decode(bytes.NewReader(data), td); err != nil { log.Error("Invalid block total difficulty RLP", "hash", hash, "err", err) return nil } return td } // WriteTd stores the total difficulty of a block into the database. func WriteTd(db DatabaseWriter, hash common.Hash, number uint64, td *big.Int) { data, err := rlp.EncodeToBytes(td) if err != nil { log.Crit("Failed to RLP encode block total difficulty", "err", err) } if err := db.Put(headerTDKey(number, hash), data); err != nil { log.Crit("Failed to store block total difficulty", "err", err) } } // DeleteTd removes all block total difficulty data associated with a hash. func DeleteTd(db DatabaseDeleter, hash common.Hash, number uint64) { if err := db.Delete(headerTDKey(number, hash)); err != nil { log.Crit("Failed to delete block total difficulty", "err", err) } } type StateRecepipts struct { Receipts []*types.ReceiptForStorage States []byte } // ReadReceipts retrieves all the transaction receipts belonging to a block. func ReadReceipts(db DatabaseReader, hash common.Hash, number uint64) types.Receipts { // Retrieve the flattened receipt slice data, _ := db.Get(blockReceiptsKey(number, hash)) if len(data) == 0 { return nil } // Convert the revceipts from their storage form to their internal representation storageReceipts := StateRecepipts{} if err := rlp.DecodeBytes(data, &storageReceipts); err != nil { log.Error("Invalid receipt array RLP", "hash", hash, "err", err) return nil } receipts := make(types.Receipts, len(storageReceipts.Receipts)) for i, receipt := range storageReceipts.Receipts { receipts[i] = (*types.Receipt)(receipt) receipts[i].Status = uint64(storageReceipts.States[i]) } return receipts } // WriteReceipts stores all the transaction receipts belonging to a block. func WriteReceipts(db DatabaseWriter, hash common.Hash, number uint64, receipts types.Receipts) { // Convert the receipts into their storage form and serialize them storageReceipts := make([]*types.ReceiptForStorage, len(receipts)) states := make([]byte, len(receipts)) for i, receipt := range receipts { storageReceipts[i] = (*types.ReceiptForStorage)(receipt) states[i] = byte(receipt.Status) } bytes, err := rlp.EncodeToBytes(StateRecepipts{storageReceipts, states}) if err != nil { log.Crit("Failed to encode block receipts", "err", err) } // Store the flattened receipt slice if err := db.Put(blockReceiptsKey(number, hash), bytes); err != nil { log.Crit("Failed to store block receipts", "err", err) } } // DeleteReceipts removes all receipt data associated with a block hash. func DeleteReceipts(db DatabaseDeleter, hash common.Hash, number uint64) { if err := db.Delete(blockReceiptsKey(number, hash)); err != nil { log.Crit("Failed to delete block receipts", "err", err) } } // ReadBlock retrieves an entire block corresponding to the hash, assembling it // back from the stored header and body. If either the header or body could not // be retrieved nil is returned. // // Note, due to concurrent download of header and block body the header and thus // canonical hash can be stored in the database but the body data not (yet). func ReadBlock(db DatabaseReader, hash common.Hash, number uint64) *types.Block { header := ReadHeader(db, hash, number) if header == nil { return nil } body := ReadBody(db, hash, number) if body == nil { return nil } return types.NewBlockWithHeader(header).WithBody(body.Transactions) } // WriteBlock serializes a block into the database, header and body separately. func WriteBlock(db DatabaseWriter, block *types.Block) { WriteBody(db, block.Hash(), block.NumberU64(), block.Body()) WriteHeader(db, block.Header()) } // DeleteBlock removes all block data associated with a hash. func DeleteBlock(db DatabaseDeleter, hash common.Hash, number uint64) { DeleteReceipts(db, hash, number) DeleteHeader(db, hash, number) DeleteBody(db, hash, number) DeleteTd(db, hash, number) } // FindCommonAncestor returns the last common ancestor of two block headers func FindCommonAncestor(db DatabaseReader, a, b *types.Header) *types.Header { for bn := b.Number.Uint64(); a.Number.Uint64() > bn; { a = ReadHeader(db, a.ParentHash, a.Number.Uint64()-1) if a == nil { return nil } } for an := a.Number.Uint64(); an < b.Number.Uint64(); { b = ReadHeader(db, b.ParentHash, b.Number.Uint64()-1) if b == nil { return nil } } for a.Hash() != b.Hash() { a = ReadHeader(db, a.ParentHash, a.Number.Uint64()-1) if a == nil { return nil } b = ReadHeader(db, b.ParentHash, b.Number.Uint64()-1) if b == nil { return nil } } return a } ================================================ FILE: core/rawdb/accessors_chain_test.go ================================================ // Copyright 2018 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package rawdb import ( "bytes" "math/big" "testing" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/crypto/sha3" "github.com/sero-cash/go-sero/rlp" "github.com/sero-cash/go-sero/serodb" ) // Tests block header storage and retrieval operations. func TestHeaderStorage(t *testing.T) { db := serodb.NewMemDatabase() // Create a test header to move around the database and make sure it's really new header := &types.Header{Number: big.NewInt(42), Extra: []byte("test header")} if entry := ReadHeader(db, header.Hash(), header.Number.Uint64()); entry != nil { t.Fatalf("Non existent header returned: %v", entry) } // Write and verify the header in the database WriteHeader(db, header) if entry := ReadHeader(db, header.Hash(), header.Number.Uint64()); entry == nil { t.Fatalf("Stored header not found") } else if entry.Hash() != header.Hash() { t.Fatalf("Retrieved header mismatch: have %v, want %v", entry, header) } if entry := ReadHeaderRLP(db, header.Hash(), header.Number.Uint64()); entry == nil { t.Fatalf("Stored header RLP not found") } else { hasher := sha3.NewKeccak256() hasher.Write(entry) if hash := common.BytesToHash(hasher.Sum(nil)); hash != header.Hash() { t.Fatalf("Retrieved RLP header mismatch: have %v, want %v", entry, header) } } // Delete the header and verify the execution DeleteHeader(db, header.Hash(), header.Number.Uint64()) if entry := ReadHeader(db, header.Hash(), header.Number.Uint64()); entry != nil { t.Fatalf("Deleted header returned: %v", entry) } } // Tests block body storage and retrieval operations. func TestBodyStorage(t *testing.T) { db := serodb.NewMemDatabase() // Create a test body to move around the database and make sure it's really new body := &types.Body{} hasher := sha3.NewKeccak256() rlp.Encode(hasher, body) hash := common.BytesToHash(hasher.Sum(nil)) if entry := ReadBody(db, hash, 0); entry != nil { t.Fatalf("Non existent body returned: %v", entry) } // Write and verify the body in the database WriteBody(db, hash, 0, body) if entry := ReadBody(db, hash, 0); entry == nil { t.Fatalf("Stored body not found") } else if types.DeriveSha(types.Transactions(entry.Transactions)) != types.DeriveSha(types.Transactions(body.Transactions)) { t.Fatalf("Retrieved body mismatch: have %v, want %v", entry, body) } if entry := ReadBodyRLP(db, hash, 0); entry == nil { t.Fatalf("Stored body RLP not found") } else { hasher := sha3.NewKeccak256() hasher.Write(entry) if calc := common.BytesToHash(hasher.Sum(nil)); calc != hash { t.Fatalf("Retrieved RLP body mismatch: have %v, want %v", entry, body) } } // Delete the body and verify the execution DeleteBody(db, hash, 0) if entry := ReadBody(db, hash, 0); entry != nil { t.Fatalf("Deleted body returned: %v", entry) } } // Tests block storage and retrieval operations. func TestBlockStorage(t *testing.T) { db := serodb.NewMemDatabase() // Create a test block to move around the database and make sure it's really new block := types.NewBlockWithHeader(&types.Header{ Extra: []byte("test block"), TxHash: types.EmptyRootHash, ReceiptHash: types.EmptyRootHash, }) if entry := ReadBlock(db, block.Hash(), block.NumberU64()); entry != nil { t.Fatalf("Non existent block returned: %v", entry) } if entry := ReadHeader(db, block.Hash(), block.NumberU64()); entry != nil { t.Fatalf("Non existent header returned: %v", entry) } if entry := ReadBody(db, block.Hash(), block.NumberU64()); entry != nil { t.Fatalf("Non existent body returned: %v", entry) } // Write and verify the block in the database WriteBlock(db, block) if entry := ReadBlock(db, block.Hash(), block.NumberU64()); entry == nil { t.Fatalf("Stored block not found") } else if entry.Hash() != block.Hash() { t.Fatalf("Retrieved block mismatch: have %v, want %v", entry, block) } if entry := ReadHeader(db, block.Hash(), block.NumberU64()); entry == nil { t.Fatalf("Stored header not found") } else if entry.Hash() != block.Header().Hash() { t.Fatalf("Retrieved header mismatch: have %v, want %v", entry, block.Header()) } if entry := ReadBody(db, block.Hash(), block.NumberU64()); entry == nil { t.Fatalf("Stored body not found") } else if types.DeriveSha(types.Transactions(entry.Transactions)) != types.DeriveSha(block.Transactions()) { t.Fatalf("Retrieved body mismatch: have %v, want %v", entry, block.Body()) } // Delete the block and verify the execution DeleteBlock(db, block.Hash(), block.NumberU64()) if entry := ReadBlock(db, block.Hash(), block.NumberU64()); entry != nil { t.Fatalf("Deleted block returned: %v", entry) } if entry := ReadHeader(db, block.Hash(), block.NumberU64()); entry != nil { t.Fatalf("Deleted header returned: %v", entry) } if entry := ReadBody(db, block.Hash(), block.NumberU64()); entry != nil { t.Fatalf("Deleted body returned: %v", entry) } } // Tests that partial block contents don't get reassembled into full blocks. func TestPartialBlockStorage(t *testing.T) { db := serodb.NewMemDatabase() block := types.NewBlockWithHeader(&types.Header{ Extra: []byte("test block"), TxHash: types.EmptyRootHash, ReceiptHash: types.EmptyRootHash, }) // Store a header and check that it's not recognized as a block WriteHeader(db, block.Header()) if entry := ReadBlock(db, block.Hash(), block.NumberU64()); entry != nil { t.Fatalf("Non existent block returned: %v", entry) } DeleteHeader(db, block.Hash(), block.NumberU64()) // Store a body and check that it's not recognized as a block WriteBody(db, block.Hash(), block.NumberU64(), block.Body()) if entry := ReadBlock(db, block.Hash(), block.NumberU64()); entry != nil { t.Fatalf("Non existent block returned: %v", entry) } DeleteBody(db, block.Hash(), block.NumberU64()) // Store a header and a body separately and check reassembly WriteHeader(db, block.Header()) WriteBody(db, block.Hash(), block.NumberU64(), block.Body()) if entry := ReadBlock(db, block.Hash(), block.NumberU64()); entry == nil { t.Fatalf("Stored block not found") } else if entry.Hash() != block.Hash() { t.Fatalf("Retrieved block mismatch: have %v, want %v", entry, block) } } // Tests block total difficulty storage and retrieval operations. func TestTdStorage(t *testing.T) { db := serodb.NewMemDatabase() // Create a test TD to move around the database and make sure it's really new hash, td := common.Hash{}, big.NewInt(314) if entry := ReadTd(db, hash, 0); entry != nil { t.Fatalf("Non existent TD returned: %v", entry) } // Write and verify the TD in the database WriteTd(db, hash, 0, td) if entry := ReadTd(db, hash, 0); entry == nil { t.Fatalf("Stored TD not found") } else if entry.Cmp(td) != 0 { t.Fatalf("Retrieved TD mismatch: have %v, want %v", entry, td) } // Delete the TD and verify the execution DeleteTd(db, hash, 0) if entry := ReadTd(db, hash, 0); entry != nil { t.Fatalf("Deleted TD returned: %v", entry) } } // Tests that canonical numbers can be mapped to hashes and retrieved. func TestCanonicalMappingStorage(t *testing.T) { db := serodb.NewMemDatabase() // Create a test canonical number and assinged hash to move around hash, number := common.Hash{0: 0xff}, uint64(314) if entry := ReadCanonicalHash(db, number); entry != (common.Hash{}) { t.Fatalf("Non existent canonical mapping returned: %v", entry) } // Write and verify the TD in the database WriteCanonicalHash(db, hash, number) if entry := ReadCanonicalHash(db, number); entry == (common.Hash{}) { t.Fatalf("Stored canonical mapping not found") } else if entry != hash { t.Fatalf("Retrieved canonical mapping mismatch: have %v, want %v", entry, hash) } // Delete the TD and verify the execution DeleteCanonicalHash(db, number) if entry := ReadCanonicalHash(db, number); entry != (common.Hash{}) { t.Fatalf("Deleted canonical mapping returned: %v", entry) } } // Tests that head headers and head blocks can be assigned, individually. func TestHeadStorage(t *testing.T) { db := serodb.NewMemDatabase() blockHead := types.NewBlockWithHeader(&types.Header{Extra: []byte("test block header")}) blockFull := types.NewBlockWithHeader(&types.Header{Extra: []byte("test block full")}) blockFast := types.NewBlockWithHeader(&types.Header{Extra: []byte("test block fast")}) // Check that no head entries are in a pristine database if entry := ReadHeadHeaderHash(db); entry != (common.Hash{}) { t.Fatalf("Non head header entry returned: %v", entry) } if entry := ReadHeadBlockHash(db); entry != (common.Hash{}) { t.Fatalf("Non head block entry returned: %v", entry) } if entry := ReadHeadFastBlockHash(db); entry != (common.Hash{}) { t.Fatalf("Non fast head block entry returned: %v", entry) } // Assign separate entries for the head header and block WriteHeadHeaderHash(db, blockHead.Hash()) WriteHeadBlockHash(db, blockFull.Hash()) WriteHeadFastBlockHash(db, blockFast.Hash()) // Check that both heads are present, and different (i.e. two heads maintained) if entry := ReadHeadHeaderHash(db); entry != blockHead.Hash() { t.Fatalf("Head header hash mismatch: have %v, want %v", entry, blockHead.Hash()) } if entry := ReadHeadBlockHash(db); entry != blockFull.Hash() { t.Fatalf("Head block hash mismatch: have %v, want %v", entry, blockFull.Hash()) } if entry := ReadHeadFastBlockHash(db); entry != blockFast.Hash() { t.Fatalf("Fast head block hash mismatch: have %v, want %v", entry, blockFast.Hash()) } } // Tests that receipts associated with a single block can be stored and retrieved. func TestBlockReceiptStorage(t *testing.T) { db := serodb.NewMemDatabase() receipt1 := &types.Receipt{ Status: types.ReceiptStatusFailed, CumulativeGasUsed: 1, Logs: []*types.Log{ {Address: common.BytesToAddress([]byte{0x11})}, {Address: common.BytesToAddress([]byte{0x01, 0x11})}, }, TxHash: common.BytesToHash([]byte{0x11, 0x11}), ContractAddress: common.BytesToAddress([]byte{0x01, 0x11, 0x11}), GasUsed: 111111, } receipt2 := &types.Receipt{ PostState: common.Hash{2}.Bytes(), CumulativeGasUsed: 2, Logs: []*types.Log{ {Address: common.BytesToAddress([]byte{0x22})}, {Address: common.BytesToAddress([]byte{0x02, 0x22})}, }, TxHash: common.BytesToHash([]byte{0x22, 0x22}), ContractAddress: common.BytesToAddress([]byte{0x02, 0x22, 0x22}), GasUsed: 222222, } receipts := []*types.Receipt{receipt1, receipt2} // Check that no receipt entries are in a pristine database hash := common.BytesToHash([]byte{0x03, 0x14}) if rs := ReadReceipts(db, hash, 0); len(rs) != 0 { t.Fatalf("non existent receipts returned: %v", rs) } // Insert the receipt slice into the database and check presence WriteReceipts(db, hash, 0, receipts) if rs := ReadReceipts(db, hash, 0); len(rs) == 0 { t.Fatalf("no receipts returned") } else { for i := 0; i < len(receipts); i++ { rlpHave, _ := rlp.EncodeToBytes(rs[i]) rlpWant, _ := rlp.EncodeToBytes(receipts[i]) if !bytes.Equal(rlpHave, rlpWant) { t.Fatalf("receipt #%d: receipt mismatch: have %v, want %v", i, rs[i], receipts[i]) } } } // Delete the receipt slice and check purge DeleteReceipts(db, hash, 0) if rs := ReadReceipts(db, hash, 0); len(rs) != 0 { t.Fatalf("deleted receipts returned: %v", rs) } } ================================================ FILE: core/rawdb/accessors_indexes.go ================================================ // Copyright 2018 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package rawdb import ( "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/rlp" ) // ReadTxLookupEntry retrieves the positional metadata associated with a transaction // hash to allow retrieving the transaction or receipt by hash. func ReadTxLookupEntry(db DatabaseReader, hash common.Hash) (common.Hash, uint64, uint64) { data, _ := db.Get(txLookupKey(hash)) if len(data) == 0 { return common.Hash{}, 0, 0 } var entry TxLookupEntry if err := rlp.DecodeBytes(data, &entry); err != nil { log.Error("Invalid transaction lookup entry RLP", "hash", hash, "err", err) return common.Hash{}, 0, 0 } return entry.BlockHash, entry.BlockIndex, entry.Index } // WriteTxLookupEntries stores a positional metadata for every transaction from // a block, enabling hash based transaction and receipt lookups. func WriteTxLookupEntries(db DatabaseWriter, block *types.Block) { for i, tx := range block.Transactions() { entry := TxLookupEntry{ BlockHash: block.Hash(), BlockIndex: block.NumberU64(), Index: uint64(i), } data, err := rlp.EncodeToBytes(entry) if err != nil { log.Crit("Failed to encode transaction lookup entry", "err", err) } if err := db.Put(txLookupKey(tx.Hash()), data); err != nil { log.Crit("Failed to store transaction lookup entry", "err", err) } } } // DeleteTxLookupEntry removes all transaction data associated with a hash. func DeleteTxLookupEntry(db DatabaseDeleter, hash common.Hash) { db.Delete(txLookupKey(hash)) } // ReadTransaction retrieves a specific transaction from the database, along with // its added positional metadata. func ReadTransaction(db DatabaseReader, hash common.Hash) (*types.Transaction, common.Hash, uint64, uint64) { blockHash, blockNumber, txIndex := ReadTxLookupEntry(db, hash) if blockHash == (common.Hash{}) { return nil, common.Hash{}, 0, 0 } body := ReadBody(db, blockHash, blockNumber) if body == nil || len(body.Transactions) <= int(txIndex) { log.Error("Transaction referenced missing", "number", blockNumber, "hash", blockHash, "index", txIndex) return nil, common.Hash{}, 0, 0 } return body.Transactions[txIndex], blockHash, blockNumber, txIndex } // ReadReceipt retrieves a specific transaction receipt from the database, along with // its added positional metadata. func ReadReceipt(db DatabaseReader, hash common.Hash) (*types.Receipt, common.Hash, uint64, uint64) { blockHash, blockNumber, receiptIndex := ReadTxLookupEntry(db, hash) if blockHash == (common.Hash{}) { return nil, common.Hash{}, 0, 0 } receipts := ReadReceipts(db, blockHash, blockNumber) if len(receipts) <= int(receiptIndex) { log.Error("Receipt refereced missing", "number", blockNumber, "hash", blockHash, "index", receiptIndex) return nil, common.Hash{}, 0, 0 } return receipts[receiptIndex], blockHash, blockNumber, receiptIndex } // ReadBloomBits retrieves the compressed bloom bit vector belonging to the given // section and bit index from the. func ReadBloomBits(db DatabaseReader, bit uint, section uint64, head common.Hash) ([]byte, error) { return db.Get(bloomBitsKey(bit, section, head)) } // WriteBloomBits stores the compressed bloom bits vector belonging to the given // section and bit index. func WriteBloomBits(db DatabaseWriter, bit uint, section uint64, head common.Hash, bits []byte) { if err := db.Put(bloomBitsKey(bit, section, head), bits); err != nil { log.Crit("Failed to store bloom bits", "err", err) } } ================================================ FILE: core/rawdb/accessors_metadata.go ================================================ // Copyright 2018 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package rawdb import ( "encoding/json" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/params" "github.com/sero-cash/go-sero/rlp" ) // ReadDatabaseVersion retrieves the version number of the database. func ReadDatabaseVersion(db DatabaseReader) int { var version int enc, _ := db.Get(databaseVerisionKey) rlp.DecodeBytes(enc, &version) return version } // WriteDatabaseVersion stores the version number of the database func WriteDatabaseVersion(db DatabaseWriter, version int) { enc, _ := rlp.EncodeToBytes(version) if err := db.Put(databaseVerisionKey, enc); err != nil { log.Crit("Failed to store the database version", "err", err) } } // ReadChainConfig retrieves the consensus settings based on the given genesis hash. func ReadChainConfig(db DatabaseReader, hash common.Hash) *params.ChainConfig { data, _ := db.Get(configKey(hash)) if len(data) == 0 { return nil } var config params.ChainConfig if err := json.Unmarshal(data, &config); err != nil { log.Error("Invalid chain config JSON", "hash", hash, "err", err) return nil } return &config } // WriteChainConfig writes the chain config settings to the database. func WriteChainConfig(db DatabaseWriter, hash common.Hash, cfg *params.ChainConfig) { if cfg == nil { return } data, err := json.Marshal(cfg) if err != nil { log.Crit("Failed to JSON encode chain config", "err", err) } if err := db.Put(configKey(hash), data); err != nil { log.Crit("Failed to store chain config", "err", err) } } // ReadPreimage retrieves a single preimage of the provided hash. func ReadPreimage(db DatabaseReader, hash common.Hash) []byte { data, _ := db.Get(preimageKey(hash)) return data } // WritePreimages writes the provided set of preimages to the database. `number` is the // current block number, and is used for debug messages only. func WritePreimages(db DatabaseWriter, number uint64, preimages map[common.Hash][]byte) { for hash, preimage := range preimages { if err := db.Put(preimageKey(hash), preimage); err != nil { log.Crit("Failed to store trie preimage", "err", err) } } preimageCounter.Inc(int64(len(preimages))) preimageHitCounter.Inc(int64(len(preimages))) } ================================================ FILE: core/rawdb/interfaces.go ================================================ // Copyright 2018 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package rawdb // DatabaseReader wraps the Has and Get method of a backing data store. type DatabaseReader interface { Has(key []byte) (bool, error) Get(key []byte) ([]byte, error) } // DatabaseWriter wraps the Put method of a backing data store. type DatabaseWriter interface { Put(key []byte, value []byte) error } // DatabaseDeleter wraps the Delete method of a backing data store. type DatabaseDeleter interface { Delete(key []byte) error } ================================================ FILE: core/rawdb/schema.go ================================================ // Copyright 2018 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // Package rawdb contains a collection of low level database accessors. package rawdb import ( "encoding/binary" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/metrics" ) // The fields below define the low level database schema prefixing. var ( // databaseVerisionKey tracks the current database version. databaseVerisionKey = []byte("DatabaseVersion") // headHeaderKey tracks the latest know header's hash. headHeaderKey = []byte("LastHeader") // headBlockKey tracks the latest know full block's hash. headBlockKey = []byte("LastBlock") // headFastBlockKey tracks the latest known incomplete block's hash duirng fast sync. headFastBlockKey = []byte("LastFast") // fastTrieProgressKey tracks the number of trie entries imported during fast sync. fastTrieProgressKey = []byte("TrieSync") indexPrefix = []byte("indexB") // Data item prefixes (use single byte to avoid mixing data types, avoid `i`, used for indexes). headerPrefix = []byte("h") // headerPrefix + num (uint64 big endian) + hash -> header headerTDSuffix = []byte("t") // headerPrefix + num (uint64 big endian) + hash + headerTDSuffix -> td headerHashSuffix = []byte("n") // headerPrefix + num (uint64 big endian) + headerHashSuffix -> hash headerNumberPrefix = []byte("H") // headerNumberPrefix + hash -> num (uint64 big endian) blockBodyPrefix = []byte("b") // blockBodyPrefix + num (uint64 big endian) + hash -> block body blockReceiptsPrefix = []byte("r") // blockReceiptsPrefix + num (uint64 big endian) + hash -> block receipts txLookupPrefix = []byte("l") // txLookupPrefix + hash -> transaction/receipt lookup metadata bloomBitsPrefix = []byte("B") // bloomBitsPrefix + bit (uint16 big endian) + section (uint64 big endian) + hash -> bloom bits preimagePrefix = []byte("secure-key-") // preimagePrefix + hash -> preimage configPrefix = []byte("ethereum-config-") // config prefix for the db // Chain index prefixes (use `i` + single byte to avoid mixing data types). BloomBitsIndexPrefix = []byte("iB") // BloomBitsIndexPrefix is the data table of a chain indexer to track its progress preimageCounter = metrics.NewRegisteredCounter("db/preimage/total", nil) preimageHitCounter = metrics.NewRegisteredCounter("db/preimage/hits", nil) ) // TxLookupEntry is a positional metadata to help looking up the data content of // a transaction or receipt given only its hash. type TxLookupEntry struct { BlockHash common.Hash BlockIndex uint64 Index uint64 } // encodeBlockNumber encodes a block number as big endian uint64 func encodeBlockNumber(number uint64) []byte { enc := make([]byte, 8) binary.BigEndian.PutUint64(enc, number) return enc } func indexKey(number uint64) []byte { return append(indexPrefix, encodeBlockNumber(number)...) } // headerKey = headerPrefix + num (uint64 big endian) + hash func headerKey(number uint64, hash common.Hash) []byte { return append(append(headerPrefix, encodeBlockNumber(number)...), hash.Bytes()...) } // headerTDKey = headerPrefix + num (uint64 big endian) + hash + headerTDSuffix func headerTDKey(number uint64, hash common.Hash) []byte { return append(headerKey(number, hash), headerTDSuffix...) } // headerHashKey = headerPrefix + num (uint64 big endian) + headerHashSuffix func headerHashKey(number uint64) []byte { return append(append(headerPrefix, encodeBlockNumber(number)...), headerHashSuffix...) } // headerNumberKey = headerNumberPrefix + hash func headerNumberKey(hash common.Hash) []byte { return append(headerNumberPrefix, hash.Bytes()...) } // blockBodyKey = blockBodyPrefix + num (uint64 big endian) + hash func blockBodyKey(number uint64, hash common.Hash) []byte { return append(append(blockBodyPrefix, encodeBlockNumber(number)...), hash.Bytes()...) } // blockReceiptsKey = blockReceiptsPrefix + num (uint64 big endian) + hash func blockReceiptsKey(number uint64, hash common.Hash) []byte { return append(append(blockReceiptsPrefix, encodeBlockNumber(number)...), hash.Bytes()...) } // txLookupKey = txLookupPrefix + hash func txLookupKey(hash common.Hash) []byte { return append(txLookupPrefix, hash.Bytes()...) } // bloomBitsKey = bloomBitsPrefix + bit (uint16 big endian) + section (uint64 big endian) + hash func bloomBitsKey(bit uint, section uint64, hash common.Hash) []byte { key := append(append(bloomBitsPrefix, make([]byte, 10)...), hash.Bytes()...) binary.BigEndian.PutUint16(key[1:], uint16(bit)) binary.BigEndian.PutUint64(key[3:], section) return key } // preimageKey = preimagePrefix + hash func preimageKey(hash common.Hash) []byte { return append(preimagePrefix, hash.Bytes()...) } // configKey = configPrefix + hash func configKey(hash common.Hash) []byte { return append(configPrefix, hash.Bytes()...) } ================================================ FILE: core/state/database.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package state import ( "fmt" "sync" lru "github.com/hashicorp/golang-lru" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/serodb" "github.com/sero-cash/go-sero/trie" ) // Trie cache generation limit after which to evict trie nodes from memory. var MaxTrieCacheGen = uint16(120) const ( // Number of past tries to keep. This value is chosen such that // reasonable chain reorg depths will hit an existing trie. maxPastTries = 12 // Number of codehash->size associations to keep. codeSizeCacheSize = 100000 ) // Database wraps access to tries and contract code. type Database interface { // OpenTrie opens the main account trie. OpenTrie(root common.Hash) (Trie, error) // OpenStorageTrie opens the storage trie of an account. OpenStorageTrie(addrHash, root common.Hash) (Trie, error) // CopyTrie returns an independent copy of the given trie. CopyTrie(Trie) Trie // ContractCode retrieves a particular contract's code. ContractCode(addrHash, codeHash common.Hash) ([]byte, error) // ContractCodeSize retrieves a particular contracts code's size. ContractCodeSize(addrHash, codeHash common.Hash) (int, error) // TrieDB retrieves the low level trie database used for data storage. TrieDB() *trie.Database } // Trie is a Ethereum Merkle Trie. type Trie interface { serodb.Tri Commit(onleaf trie.LeafCallback) (common.Hash, error) Hash() common.Hash NodeIterator(startKey []byte) trie.NodeIterator GetKey([]byte) []byte // TODO(fjl): remove this when SecureTrie is removed Prove(key []byte, fromLevel uint, proofDb serodb.Putter) error } // NewDatabase creates a backing store for state. The returned database is safe for // concurrent use and retains cached trie nodes in memory. The pool is an optional // intermediate trie-node memory pool between the low level storage layer and the // high level trie abstraction. func NewDatabase(db serodb.Database) Database { csc, _ := lru.New(codeSizeCacheSize) return &cachingDB{ db: trie.NewDatabase(db), codeSizeCache: csc, } } type cachingDB struct { db *trie.Database mu sync.Mutex pastTries []*trie.SecureTrie codeSizeCache *lru.Cache } // OpenTrie opens the main account trie. func (db *cachingDB) OpenTrie(root common.Hash) (Trie, error) { db.mu.Lock() defer db.mu.Unlock() for i := len(db.pastTries) - 1; i >= 0; i-- { if db.pastTries[i].Hash() == root { return cachedTrie{db.pastTries[i].Copy(), db}, nil } } tr, err := trie.NewSecure(root, db.db, MaxTrieCacheGen) if err != nil { return nil, err } return cachedTrie{tr, db}, nil } func (db *cachingDB) pushTrie(t *trie.SecureTrie) { db.mu.Lock() defer db.mu.Unlock() if len(db.pastTries) >= maxPastTries { copy(db.pastTries, db.pastTries[1:]) db.pastTries[len(db.pastTries)-1] = t } else { db.pastTries = append(db.pastTries, t) } } // OpenStorageTrie opens the storage trie of an account. func (db *cachingDB) OpenStorageTrie(addrHash, root common.Hash) (Trie, error) { return trie.NewSecure(root, db.db, 0) } // CopyTrie returns an independent copy of the given trie. func (db *cachingDB) CopyTrie(t Trie) Trie { switch t := t.(type) { case cachedTrie: return cachedTrie{t.SecureTrie.Copy(), db} case *trie.SecureTrie: return t.Copy() default: panic(fmt.Errorf("unknown trie type %T", t)) } } // ContractCode retrieves a particular contract's code. func (db *cachingDB) ContractCode(addrHash, codeHash common.Hash) ([]byte, error) { code, err := db.db.Node(codeHash) if err == nil { db.codeSizeCache.Add(codeHash, len(code)) } return code, err } // ContractCodeSize retrieves a particular contracts code's size. func (db *cachingDB) ContractCodeSize(addrHash, codeHash common.Hash) (int, error) { if cached, ok := db.codeSizeCache.Get(codeHash); ok { return cached.(int), nil } code, err := db.ContractCode(addrHash, codeHash) return len(code), err } // TrieDB retrieves any intermediate trie-node caching layer. func (db *cachingDB) TrieDB() *trie.Database { return db.db } // cachedTrie inserts its trie into a cachingDB on commit. type cachedTrie struct { *trie.SecureTrie db *cachingDB } func (m cachedTrie) Commit(onleaf trie.LeafCallback) (common.Hash, error) { root, err := m.SecureTrie.Commit(onleaf) if err == nil { m.db.pushTrie(m.SecureTrie) } return root, err } func (m cachedTrie) Prove(key []byte, fromLevel uint, proofDb serodb.Putter) error { return m.SecureTrie.Prove(key, fromLevel, proofDb) } ================================================ FILE: core/state/dump.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package state import ( "encoding/json" "fmt" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/rlp" "github.com/sero-cash/go-sero/trie" ) type DumpAccount struct { Balance string `json:"balance"` //Nonce uint64 `json:"nonce"` Root string `json:"root"` CodeHash string `json:"codeHash"` Code string `json:"code"` Storage map[string]string `json:"storage"` } type Dump struct { Root string `json:"root"` Accounts map[string]DumpAccount `json:"accounts"` } func (self *StateDB) RawDump() Dump { dump := Dump{ Root: fmt.Sprintf("%x", self.trie.Hash()), Accounts: make(map[string]DumpAccount), } it := trie.NewIterator(self.trie.NodeIterator(nil)) for it.Next() { addr := self.trie.GetKey(it.Key) var data Account if err := rlp.DecodeBytes(it.Value, &data); err != nil { panic(err) } obj := newObject(nil, common.BytesToAddress(addr), data) account := DumpAccount{ Balance: obj.Balance("sero").String(), //Nonce: data.Nonce, Root: common.Bytes2Hex(data.Root[:]), CodeHash: common.Bytes2Hex(data.CodeHash), Code: common.Bytes2Hex(obj.Code(self.db)), Storage: make(map[string]string), } storageIt := trie.NewIterator(obj.getTrie(self.db).NodeIterator(nil)) for storageIt.Next() { account.Storage[common.Bytes2Hex(self.trie.GetKey(storageIt.Key))] = common.Bytes2Hex(storageIt.Value) } dump.Accounts[common.Bytes2Hex(addr)] = account } return dump } func (self *StateDB) Dump() []byte { json, err := json.MarshalIndent(self.RawDump(), "", " ") if err != nil { fmt.Println("dump err", err) } return json } ================================================ FILE: core/state/iterator.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package state import ( "bytes" "fmt" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/rlp" "github.com/sero-cash/go-sero/trie" ) // NodeIterator is an iterator to traverse the entire state trie post-order, // including all of the contract code and contract state tries. type NodeIterator struct { state *StateDB // State being iterated stateIt trie.NodeIterator // Primary iterator for the global state trie dataIt trie.NodeIterator // Secondary iterator for the data trie of a contract accountHash common.Hash // Hash of the node containing the account codeHash common.Hash // Hash of the contract source code code []byte // Source code associated with a contract Hash common.Hash // Hash of the current entry being iterated (nil if not standalone) Parent common.Hash // Hash of the first full ancestor node (nil if current is the root) Error error // Failure set in case of an internal error in the iterator } // NewNodeIterator creates an post-order state node iterator. func NewNodeIterator(state *StateDB) *NodeIterator { return &NodeIterator{ state: state, } } // Next moves the iterator to the next node, returning whether there are any // further nodes. In case of an internal error this method returns false and // sets the Error field to the encountered failure. func (it *NodeIterator) Next() bool { // If the iterator failed previously, don't do anything if it.Error != nil { return false } // Otherwise step forward with the iterator and report any errors if err := it.step(); err != nil { it.Error = err return false } return it.retrieve() } // step moves the iterator to the next entry of the state trie. func (it *NodeIterator) step() error { // Abort if we reached the end of the iteration if it.state == nil { return nil } // Initialize the iterator if we've just started if it.stateIt == nil { it.stateIt = it.state.trie.NodeIterator(nil) } // If we had data nodes previously, we surely have at least state nodes if it.dataIt != nil { if cont := it.dataIt.Next(true); !cont { if it.dataIt.Error() != nil { return it.dataIt.Error() } it.dataIt = nil } return nil } // If we had source code previously, discard that if it.code != nil { it.code = nil return nil } // Step to the next state trie node, terminating if we're out of nodes if cont := it.stateIt.Next(true); !cont { if it.stateIt.Error() != nil { return it.stateIt.Error() } it.state, it.stateIt = nil, nil return nil } // If the state trie node is an internal entry, leave as is if !it.stateIt.Leaf() { return nil } // Otherwise we've reached an account node, initiate data iteration var account Account if err := rlp.Decode(bytes.NewReader(it.stateIt.LeafBlob()), &account); err != nil { return err } dataTrie, err := it.state.db.OpenStorageTrie(common.BytesToHash(it.stateIt.LeafKey()), account.Root) if err != nil { return err } it.dataIt = dataTrie.NodeIterator(nil) if !it.dataIt.Next(true) { it.dataIt = nil } if !bytes.Equal(account.CodeHash, emptyCodeHash) { it.codeHash = common.BytesToHash(account.CodeHash) addrHash := common.BytesToHash(it.stateIt.LeafKey()) it.code, err = it.state.db.ContractCode(addrHash, common.BytesToHash(account.CodeHash)) if err != nil { return fmt.Errorf("code %x: %v", account.CodeHash, err) } } it.accountHash = it.stateIt.Parent() return nil } // retrieve pulls and caches the current state entry the iterator is traversing. // The method returns whether there are any more data left for inspection. func (it *NodeIterator) retrieve() bool { // Clear out any previously set values it.Hash = common.Hash{} // If the iteration's done, return no available data if it.state == nil { return false } // Otherwise retrieve the current entry switch { case it.dataIt != nil: it.Hash, it.Parent = it.dataIt.Hash(), it.dataIt.Parent() if it.Parent == (common.Hash{}) { it.Parent = it.accountHash } case it.code != nil: it.Hash, it.Parent = it.codeHash, it.accountHash case it.stateIt != nil: it.Hash, it.Parent = it.stateIt.Hash(), it.stateIt.Parent() } return true } ================================================ FILE: core/state/iterator_test.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package state import ( "bytes" "testing" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/serodb" ) // Tests that the node iterator indeed walks over the entire database contents. func TestNodeIteratorCoverage(t *testing.T) { // Create some arbitrary test state to iterate db, root, _ := makeTestState() state, err := New(db, nil) if err != nil { t.Fatalf("failed to create state trie at %x: %v", root, err) } // Gather all the node hashes found by the iterator hashes := make(map[common.Hash]struct{}) for it := NewNodeIterator(state); it.Next(); { if it.Hash != (common.Hash{}) { hashes[it.Hash] = struct{}{} } } // Cross check the iterated hashes and the database/nodepool content for hash := range hashes { if _, err := db.TrieDB().Node(hash); err != nil { t.Errorf("failed to retrieve reported node %x", hash) } } for _, hash := range db.TrieDB().Nodes() { if _, ok := hashes[hash]; !ok { t.Errorf("state entry not reported %x", hash) } } for _, key := range db.TrieDB().DiskDB().(*serodb.MemDatabase).Keys() { if bytes.HasPrefix(key, []byte("secure-key-")) { continue } if _, ok := hashes[common.BytesToHash(key)]; !ok { t.Errorf("state entry not reported %x", key) } } } ================================================ FILE: core/state/journal.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package state import ( "math/big" "github.com/sero-cash/go-sero/common" ) // journalEntry is a modification entry in the state change journal that can be // reverted on demand. type journalEntry interface { // revert undoes the changes introduced by this journal entry. revert(*StateDB) // dirtied returns the Ethereum address modified by this journal entry. dirtied() *common.Address } // journal contains the list of state modifications applied since the last state // commit. These are tracked to be able to be reverted in case of an execution // exception or revertal request. type journal struct { entries []journalEntry // Current changes tracked by the journal dirties map[common.Address]int // Dirty accounts and the number of changes } // newJournal create a new initialized journal. func newJournal() *journal { return &journal{ dirties: make(map[common.Address]int), } } // append inserts a new modification entry to the end of the change journal. func (j *journal) append(entry journalEntry) { j.entries = append(j.entries, entry) if addr := entry.dirtied(); addr != nil { j.dirties[*addr]++ } } // revert undoes a batch of journalled modifications along with any reverted // dirty handling too. func (j *journal) revert(statedb *StateDB, snapshot int) { for i := len(j.entries) - 1; i >= snapshot; i-- { // Undo the changes made by the operation j.entries[i].revert(statedb) // Drop any dirty tracking induced by the change if addr := j.entries[i].dirtied(); addr != nil { if j.dirties[*addr]--; j.dirties[*addr] == 0 { delete(j.dirties, *addr) } } } j.entries = j.entries[:snapshot] } // dirty explicitly sets an address to dirty, even if the change entries would // otherwise suggest it as clean. This method is an ugly hack to handle the RIPEMD // precompile consensus exception. func (j *journal) dirty(addr common.Address) { j.dirties[addr]++ } // length returns the current number of entries in the journal. func (j *journal) length() int { return len(j.entries) } type ( // Changes to the account trie. createObjectChange struct { account *common.Address } resetObjectChange struct { prev *stateObject } suicideChange struct { account *common.Address prev bool // whether account had already suicided prevBooks []*Book } // Changes to individual accounts. balanceChange struct { account *common.Address currency string prev *big.Int } ticketNonceChange struct { account *common.Address prev uint64 } storageChange struct { account *common.Address key, prevalue common.Hash } codeChange struct { account *common.Address prevcode, prevhash []byte } // Changes to other state values. refundChange struct { prev uint64 } addLogChange struct { txhash common.Hash } addPreimageChange struct { hash common.Hash } touchChange struct { account *common.Address prev bool prevDirty bool } ) func (tn ticketNonceChange) revert(s *StateDB) { s.getStateObject(*tn.account).setTicketNonce(tn.prev) } func (tn ticketNonceChange) dirtied() *common.Address { return tn.account } func (ch createObjectChange) revert(s *StateDB) { delete(s.stateObjects, *ch.account) delete(s.stateObjectsDirty, *ch.account) } func (ch createObjectChange) dirtied() *common.Address { return ch.account } func (ch resetObjectChange) revert(s *StateDB) { s.setStateObject(ch.prev) } func (ch resetObjectChange) dirtied() *common.Address { return nil } func (ch suicideChange) revert(s *StateDB) { obj := s.getStateObject(*ch.account) if obj != nil { obj.suicided = ch.prev obj.data.Books = ch.prevBooks obj.data.bookMap = map[string]*Book{} for _, book := range ch.prevBooks { obj.data.bookMap[book.Currency] = book } } } func (ch suicideChange) dirtied() *common.Address { return ch.account } func (ch touchChange) revert(s *StateDB) { } func (ch touchChange) dirtied() *common.Address { return ch.account } func (ch balanceChange) revert(s *StateDB) { s.getStateObject(*ch.account).SetBalance(ch.currency, ch.prev) } func (ch balanceChange) dirtied() *common.Address { return ch.account } func (ch codeChange) revert(s *StateDB) { s.getStateObject(*ch.account).setCode(common.BytesToHash(ch.prevhash), ch.prevcode) } func (ch codeChange) dirtied() *common.Address { return ch.account } func (ch storageChange) revert(s *StateDB) { s.getStateObject(*ch.account).setState(ch.key, ch.prevalue) } func (ch storageChange) dirtied() *common.Address { return ch.account } func (ch refundChange) revert(s *StateDB) { s.refund = ch.prev } func (ch refundChange) dirtied() *common.Address { return nil } func (ch addLogChange) revert(s *StateDB) { logs := s.logs[ch.txhash] if len(logs) == 1 { delete(s.logs, ch.txhash) } else { s.logs[ch.txhash] = logs[:len(logs)-1] } s.logSize-- } func (ch addLogChange) dirtied() *common.Address { return nil } func (ch addPreimageChange) revert(s *StateDB) { delete(s.preimages, ch.hash) } func (ch addPreimageChange) dirtied() *common.Address { return nil } ================================================ FILE: core/state/managed_state.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package state import ( "sync" "github.com/sero-cash/go-sero/common" ) type account struct { stateObject *stateObject //nstart uint64 nonces []bool } type ManagedState struct { *StateDB mu sync.RWMutex accounts map[common.Address]*account } func (ms *ManagedState) GetAllNonceAddress(addr common.Address) []common.Address { return []common.Address{} } func (ms *ManagedState) setNonceAddress(addr common.Address, nonceAddr common.Address) { } func (ms *ManagedState) GetNonceAddress(addr common.Address, key []byte) common.Address { return common.Address{} } func (ms *ManagedState) IsContract(addr common.Address) bool { return ms.GetCode(addr) == nil } // ManagedState returns a new managed state with the statedb as it's backing layer func ManageState(statedb *StateDB) *ManagedState { return &ManagedState{ StateDB: statedb.Copy(), accounts: make(map[common.Address]*account), } } func GetAndIndNonce() uint64 { return 0 } // RemoveNonce removed the nonce from the managed state and all future pending nonces //func (ms *ManagedState) RemoveNonce(addr common.Data, n uint64) { // if ms.hasAccount(addr) { // ms.mu.Lock() // defer ms.mu.Unlock() // // account := ms.getAccount(addr) // if n-account.nstart <= uint64(len(account.nonces)) { // reslice := make([]bool, n-account.nstart) // copy(reslice, account.nonces[:n-account.nstart]) // account.nonces = reslice // } // } //} // NewNonce returns the new canonical nonce for the managed account //func (ms *ManagedState) NewNonce(addr common.Data) uint64 { // ms.mu.Lock() // defer ms.mu.Unlock() // // account := ms.getAccount(addr) // for i, nonce := range account.nonces { // if !nonce { // return account.nstart + uint64(i) // } // } // account.nonces = append(account.nonces, true) // // return uint64(len(account.nonces)-1) + account.nstart //} // GetNonce returns the canonical nonce for the managed or unmanaged account. // // Because GetNonce mutates the DB, we must take a write lock. //func (ms *ManagedState) GetNonce(addr common.Data) uint64 { // ms.mu.Lock() // defer ms.mu.Unlock() // // if ms.hasAccount(addr) { // account := ms.getAccount(addr) // return uint64(len(account.nonces)) + account.nstart // } else { // return ms.StateDB.GetNonce(addr) // } //} // SetNonce sets the new canonical nonce for the managed state //func (ms *ManagedState) SetNonce(addr common.Data, nonce uint64) { // ms.mu.Lock() // defer ms.mu.Unlock() // // so := ms.GetOrNewStateObject(addr) // so.SetNonce(nonce) // // ms.accounts[addr] = newAccount(so) //} // HasAccount returns whether the given address is managed or not func (ms *ManagedState) HasAccount(addr common.Address) bool { ms.mu.RLock() defer ms.mu.RUnlock() return ms.hasAccount(addr) } func (ms *ManagedState) hasAccount(addr common.Address) bool { _, ok := ms.accounts[addr] return ok } // populate the managed state //func (ms *ManagedState) getAccount(addr common.Data) *account { // if account, ok := ms.accounts[addr]; !ok { // so := ms.GetOrNewStateObject(addr) // ms.accounts[addr] = newAccount(so) // } else { // // Always make sure the state account nonce isn't actually higher // // than the tracked one. // so := ms.StateDB.getStateObject(addr) // if so != nil && uint64(len(account.nonces))+account.nstart < so.Nonce() { // ms.accounts[addr] = newAccount(so) // } // // } // // return ms.accounts[addr] //} func newAccount(so *stateObject) *account { return &account{so, nil} } ================================================ FILE: core/state/state_object.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package state import ( "bytes" "fmt" "io" "math/big" "strings" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/crypto" "github.com/sero-cash/go-sero/rlp" ) var emptyCodeHash = crypto.Keccak256(nil) type Code []byte func (self Code) String() string { return string(self) //strings.Join(Disassemble(self), " ") } type Storage map[common.Hash]common.Hash func (self Storage) String() (str string) { for key, value := range self { str += fmt.Sprintf("%X : %X\n", key, value) } return } func (self Storage) Copy() Storage { cpy := make(Storage) for key, value := range self { cpy[key] = value } return cpy } // stateObject represents an Ethereum account which is being modified. // // The usage pattern is as follows: // First you need to obtain a state object. // AccountAddress values can be accessed and modified through the object. // Finally, call CommitTrie to write the modified storage trie into a database. type stateObject struct { address common.Address addrHash common.Hash // hash of ethereum address of the account data Account db *StateDB // DB error. // State objects are used by the consensus core and VM which are // unable to deal with database-level errors. Any error that occurs // during a database read is memoized here and will eventually be returned // by StateDB.Commit. dbErr error // Write caches. trie Trie // storage trie, which becomes non-nil on first access code Code // contract bytecode, which gets set when code is loaded cachedStorage Storage // Storage entry cache to avoid duplicate reads dirtyStorage Storage // Storage entries that need to be flushed to disk // Cache flags. // When an object is marked suicided it will be delete from the trie // during the "update" phase of the state transition. dirtyCode bool // true if the code was updated suicided bool deleted bool } // empty returns whether the account is considered empty. func (s *stateObject) empty() bool { //return s.data.Balance.Sign() == 0 && bytes.Equal(s.data.CodeHash, emptyCodeHash) return false } type Book struct { Balance *big.Int Currency string } // AccountAddress is the Ethereum consensus representation of accounts. // These objects are stored in the main account trie. type Account struct { TicketNonce uint64 //Balance *big.Int Root common.Hash // merkle root of the storage trie CodeHash []byte Books []*Book bookMap map[string]*Book } // newObject creates a state object. func newObject(db *StateDB, address common.Address, data Account) *stateObject { if data.CodeHash == nil { data.CodeHash = emptyCodeHash } data.bookMap = map[string]*Book{} books := []*Book{} for _, book := range data.Books { nb := &Book{book.Balance, book.Currency} books = append(books, nb) data.bookMap[book.Currency] = nb } data.Books = books return &stateObject{ db: db, address: address, addrHash: crypto.Keccak256Hash(address.Bytes()), data: data, cachedStorage: make(Storage), dirtyStorage: make(Storage), } } func (self *stateObject) TicketNonce() uint64 { return self.data.TicketNonce } func (self *stateObject) SetTicketNonce(nonce uint64) { self.db.journal.append(ticketNonceChange{ account: &self.address, prev: self.data.TicketNonce, }) self.setTicketNonce(nonce) } func (self *stateObject) setTicketNonce(nonce uint64) { self.data.TicketNonce = nonce } // EncodeRLP implements rlp.Encoder. func (c *stateObject) EncodeRLP(w io.Writer) error { return rlp.Encode(w, c.data) } // setError remembers the first non-nil error it is called with. func (self *stateObject) setError(err error) { if self.dbErr == nil { self.dbErr = err } } func (self *stateObject) markSuicided() { self.suicided = true } func (c *stateObject) touch() { c.db.journal.append(touchChange{ account: &c.address, }) } func (c *stateObject) getTrie(db Database) Trie { if c.trie == nil { var err error c.trie, err = db.OpenStorageTrie(c.addrHash, c.data.Root) if err != nil { c.trie, _ = db.OpenStorageTrie(c.addrHash, common.Hash{}) c.setError(fmt.Errorf("can't create storage trie: %v", err)) } } return c.trie } // GetState returns a value in account storage. func (self *stateObject) GetState(db Database, key common.Hash) common.Hash { value, exists := self.cachedStorage[key] if exists { return value } // Load from DB in case it is missing. enc, err := self.getTrie(db).TryGet(key[:]) if err != nil { self.setError(err) return common.Hash{} } if len(enc) > 0 { _, content, _, err := rlp.Split(enc) if err != nil { self.setError(err) } value.SetBytes(content) } self.cachedStorage[key] = value return value } // SetState updates a value in account storage. func (self *stateObject) SetState(db Database, key, value common.Hash) { self.db.journal.append(storageChange{ account: &self.address, key: key, prevalue: self.GetState(db, key), }) self.setState(key, value) } func (self *stateObject) setState(key, value common.Hash) { self.cachedStorage[key] = value self.dirtyStorage[key] = value } // updateTrie writes cached storage modifications into the object's storage trie. func (self *stateObject) updateTrie(db Database) Trie { tr := self.getTrie(db) for key, value := range self.dirtyStorage { delete(self.dirtyStorage, key) if (value == common.Hash{}) { self.setError(tr.TryDelete(key[:])) continue } // Encoding []byte cannot fail, ok to ignore the error. v, _ := rlp.EncodeToBytes(bytes.TrimLeft(value[:], "\x00")) self.setError(tr.TryUpdate(key[:], v)) } return tr } // UpdateRoot sets the trie root to the current root hash of func (self *stateObject) updateRoot(db Database) { self.updateTrie(db) self.data.Root = self.trie.Hash() } // CommitTrie the storage trie of the object to db. // This updates the trie root. func (self *stateObject) CommitTrie(db Database) error { self.updateTrie(db) if self.dbErr != nil { return self.dbErr } root, err := self.trie.Commit(nil) if err == nil { self.data.Root = root } return err } // AddBalance removes amount from c's balance. // It is used to add funds to the destination account of a transfer. func (self *stateObject) AddBalance(coinName string, amount *big.Int) { if amount.Sign() == 0 { return } self.SetBalance(coinName, new(big.Int).Add(self.Balance(coinName), amount)) } // SubBalance removes amount from c's balance. // It is used to remove funds from the origin account of a transfer. func (self *stateObject) SubBalance(coinName string, amount *big.Int) { if amount.Sign() == 0 { return } self.SetBalance(coinName, new(big.Int).Sub(self.Balance(coinName), amount)) } func (self *stateObject) SetBalance(coinName string, amount *big.Int) { self.db.journal.append(balanceChange{ account: &self.address, currency: coinName, prev: new(big.Int).Set(self.Balance(coinName)), }) coinName = strings.ToUpper(coinName) if book, ok := self.data.bookMap[coinName]; ok { book.Balance = amount } else { book := &Book{amount, coinName} self.data.Books = append(self.data.Books, book) self.data.bookMap[coinName] = book } } // Return the gas back to the origin. Used by the Virtual machine or Closures func (c *stateObject) ReturnGas(gas *big.Int) {} func (self *stateObject) deepCopy(db *StateDB) *stateObject { stateObject := newObject(db, self.address, self.data) if self.trie != nil { stateObject.trie = db.db.CopyTrie(self.trie) } stateObject.code = self.code stateObject.dirtyStorage = self.dirtyStorage.Copy() stateObject.cachedStorage = self.dirtyStorage.Copy() stateObject.suicided = self.suicided stateObject.dirtyCode = self.dirtyCode stateObject.deleted = self.deleted return stateObject } // // Attribute accessors // // Returns the address of the contract/account func (c *stateObject) Address() common.Address { return c.address } // Code returns the contract code associated with this object, if any. func (self *stateObject) Code(db Database) []byte { if self.code != nil { return self.code } if bytes.Equal(self.CodeHash(), emptyCodeHash) { return nil } code, err := db.ContractCode(self.addrHash, common.BytesToHash(self.CodeHash())) if err != nil { self.setError(fmt.Errorf("can't load code hash %x: %v", self.CodeHash(), err)) } self.code = code return code } func (self *stateObject) SetCode(codeHash common.Hash, code []byte) { prevcode := self.Code(self.db.db) self.db.journal.append(codeChange{ account: &self.address, prevhash: self.CodeHash(), prevcode: prevcode, }) self.setCode(codeHash, code) } func (self *stateObject) setCode(codeHash common.Hash, code []byte) { self.code = code self.data.CodeHash = codeHash[:] self.dirtyCode = true } func (self *stateObject) CodeHash() []byte { return self.data.CodeHash } func (self *stateObject) Balance(coinName string) *big.Int { coinName = strings.ToUpper(coinName) if book, ok := self.data.bookMap[coinName]; ok { return book.Balance } return new(big.Int) } func (self *stateObject) Balances() map[string]*big.Int { result := map[string]*big.Int{} for currency, book := range self.data.bookMap { result[currency] = book.Balance } return result } // Never called, but must be present to allow stateObject to be used // as a vm.AccountAddress interface that also satisfies the vm.ContractRef // interface. Interfaces are awesome. func (self *stateObject) Value() *big.Int { panic("Value on stateObject should never be called") } ================================================ FILE: core/state/state_test.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package state import ( "bytes" "math/big" "testing" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/crypto" "github.com/sero-cash/go-sero/serodb" checker "gopkg.in/check.v1" ) type StateSuite struct { db *serodb.MemDatabase state *StateDB } var _ = checker.Suite(&StateSuite{}) var toAddr = common.BytesToAddress func (s *StateSuite) TestDump(c *checker.C) { // generate a few entries obj1 := s.state.GetOrNewStateObject(toAddr([]byte{0x01})) obj1.AddBalance("sero", big.NewInt(22)) obj2 := s.state.GetOrNewStateObject(toAddr([]byte{0x01, 0x02})) obj2.SetCode(crypto.Keccak256Hash([]byte{3, 3, 3, 3, 3, 3, 3}), []byte{3, 3, 3, 3, 3, 3, 3}) obj3 := s.state.GetOrNewStateObject(toAddr([]byte{0x02})) obj3.SetBalance("sero", big.NewInt(44)) // write some of them to the trie s.state.updateStateObject(obj1) s.state.updateStateObject(obj2) s.state.Commit(false) // check that dump contains the state objects that are in trie got := string(s.state.Dump()) want := `{ "root": "71edff0130dd2385947095001c73d9e28d862fc286fca2b922ca6f6f3cddfdd2", "accounts": { "0000000000000000000000000000000000000001": { "balance": "22", "nonce": 0, "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", "code": "", "storage": {} }, "0000000000000000000000000000000000000002": { "balance": "44", "nonce": 0, "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", "code": "", "storage": {} }, "0000000000000000000000000000000000000102": { "balance": "0", "nonce": 0, "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "codeHash": "87874902497a5bb968da31a2998d8f22e949d1ef6214bcdedd8bae24cca4b9e3", "code": "03030303030303", "storage": {} } } }` if got != want { c.Errorf("dump mismatch:\ngot: %s\nwant: %s\n", got, want) } } func (s *StateSuite) SetUpTest(c *checker.C) { s.db = serodb.NewMemDatabase() s.state, _ = New(NewDatabase(s.db), nil) } func (s *StateSuite) TestNull(c *checker.C) { address := common.Base58ToAddress("2vgxVPQYB7AFWUdYzn76FzTVeaWnqoMTqbynqr2gJb1sMBpsATtxLHtFNptruobkfuhrTYNewg8GAWwTdsoMeuyV") s.state.CreateAccount(address) //value := common.FromHex("0x823140710bf13990e4500136726d8b55") var value common.Hash s.state.SetState(address, common.Hash{}, value) s.state.Commit(false) value = s.state.GetState(address, common.Hash{}) if value != (common.Hash{}) { c.Errorf("expected empty hash. got %x", value) } } func (s *StateSuite) TestSnapshot(c *checker.C) { stateobjaddr := toAddr([]byte("aa")) var storageaddr common.Hash data1 := common.BytesToHash([]byte{42}) data2 := common.BytesToHash([]byte{43}) // set initial state object value s.state.SetState(stateobjaddr, storageaddr, data1) // get snapshot of current state snapshot := s.state.Snapshot() // set new state object value s.state.SetState(stateobjaddr, storageaddr, data2) // restore snapshot s.state.RevertToSnapshot(snapshot) // get state storage value res := s.state.GetState(stateobjaddr, storageaddr) c.Assert(data1, checker.DeepEquals, res) } func (s *StateSuite) TestSnapshotEmpty(c *checker.C) { s.state.RevertToSnapshot(s.state.Snapshot()) } // use testing instead of checker because checker does not support // printing/logging in tests (-check.vv does not work) func TestSnapshot2(t *testing.T) { state, _ := New(NewDatabase(serodb.NewMemDatabase()), nil) stateobjaddr0 := toAddr([]byte("so0")) stateobjaddr1 := toAddr([]byte("so1")) var storageaddr common.Hash data0 := common.BytesToHash([]byte{17}) data1 := common.BytesToHash([]byte{18}) state.SetState(stateobjaddr0, storageaddr, data0) state.SetState(stateobjaddr1, storageaddr, data1) // db, trie are already non-empty values so0 := state.getStateObject(stateobjaddr0) so0.SetBalance("sero", big.NewInt(42)) so0.SetCode(crypto.Keccak256Hash([]byte{'c', 'a', 'f', 'e'}), []byte{'c', 'a', 'f', 'e'}) so0.suicided = false so0.deleted = false state.setStateObject(so0) root, _ := state.Commit(false) state.Reset(root) // and one with deleted == true so1 := state.getStateObject(stateobjaddr1) so1.SetBalance("sero", big.NewInt(52)) so1.SetCode(crypto.Keccak256Hash([]byte{'c', 'a', 'f', 'e', '2'}), []byte{'c', 'a', 'f', 'e', '2'}) so1.suicided = true so1.deleted = true state.setStateObject(so1) so1 = state.getStateObject(stateobjaddr1) if so1 != nil { t.Fatalf("deleted object not nil when getting") } snapshot := state.Snapshot() state.RevertToSnapshot(snapshot) so0Restored := state.getStateObject(stateobjaddr0) // Update lazily-loaded values before comparing. so0Restored.GetState(state.db, storageaddr) so0Restored.Code(state.db) // non-deleted is equal (restored) compareStateObjects(so0Restored, so0, t) // deleted should be nil, both before and after restore of state copy so1Restored := state.getStateObject(stateobjaddr1) if so1Restored != nil { t.Fatalf("deleted object not nil after restoring snapshot: %+v", so1Restored) } } func compareStateObjects(so0, so1 *stateObject, t *testing.T) { if so0.Address() != so1.Address() { t.Fatalf("Address mismatch: have %v, want %v", so0.address, so1.address) } if so0.Balance("sero").Cmp(so1.Balance("sero")) != 0 { t.Fatalf("Balance mismatch: have %v, want %v", so0.Balance("sero"), so1.Balance("sero")) } if so0.data.Root != so1.data.Root { t.Errorf("Root mismatch: have %x, want %x", so0.data.Root[:], so1.data.Root[:]) } if !bytes.Equal(so0.CodeHash(), so1.CodeHash()) { t.Fatalf("CodeHash mismatch: have %v, want %v", so0.CodeHash(), so1.CodeHash()) } if !bytes.Equal(so0.code, so1.code) { t.Fatalf("Code mismatch: have %v, want %v", so0.code, so1.code) } if len(so1.cachedStorage) != len(so0.cachedStorage) { t.Errorf("Storage size mismatch: have %d, want %d", len(so1.cachedStorage), len(so0.cachedStorage)) } for k, v := range so1.cachedStorage { if so0.cachedStorage[k] != v { t.Errorf("Storage key %x mismatch: have %v, want %v", k, so0.cachedStorage[k], v) } } for k, v := range so0.cachedStorage { if so1.cachedStorage[k] != v { t.Errorf("Storage key %x mismatch: have %v, want none.", k, v) } } if so0.suicided != so1.suicided { t.Fatalf("suicided mismatch: have %v, want %v", so0.suicided, so1.suicided) } if so0.deleted != so1.deleted { t.Fatalf("Deleted mismatch: have %v, want %v", so0.deleted, so1.deleted) } } ================================================ FILE: core/state/statedb.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // Package state provides a caching layer atop the Ethereum state trie. package state import ( "fmt" "math/big" "sort" "strings" "sync" "github.com/pkg/errors" "github.com/sero-cash/go-sero/common/hexutil" "github.com/sero-cash/go-sero/zero/utils" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-sero/zero/consensus" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/crypto" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/rlp" "github.com/sero-cash/go-sero/trie" "github.com/sero-cash/go-sero/zero/txs/zstate" ) type revision struct { id int journalIndex int } var ( // emptyState is the known hash of an empty state trie entry. emptyState = crypto.Keccak256Hash(nil) // emptyCode is the known hash of the empty EVM bytecode. emptyCode = crypto.Keccak256Hash(nil) EmptyAddress = common.BytesToAddress(crypto.Keccak512(nil)) TrueHash = common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000001") FalseHash = common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000000") contrctNonceKey = crypto.Keccak256Hash([]byte("contractNonce")) ) // StateDBs within the ethereum protocol are used to store anything // within the merkle trie. StateDBs take care of caching and storing // nested states. It's the general query interface to retrieve: // * Contracts // * Accounts type StateDB struct { root common.Hash db Database trie Trie // This map holds 'live' objects, which will get modified while processing a state transition. stateObjects map[common.Address]*stateObject stateObjectsDirty map[common.Address]struct{} stakeState *consensus.Cons zstate *zstate.ZState // DB error. // State objects are used by the consensus core and VM which are // unable to deal with database-level errors. Any error that occurs // during a database read is memoized here and will eventually be returned // by StateDB.Commit. dbErr error // The refund counter, also used by state transitioning. refund uint64 thash, bhash common.Hash txIndex int logs map[common.Hash][]*types.Log logSize uint preimages map[common.Hash][]byte // Journal of state modifications. This is the backbone of // Snapshot and RevertToSnapshot. journal *journal validRevisions []revision nextRevisionId int //seeds []c_type.Uint512 number int64 lock sync.Mutex } func (self *StateDB) SetStakeState(key common.Hash, value common.Hash) { stateObject := self.GetOrNewStateObject(EmptyAddress) if stateObject != nil { stateObject.SetState(self.db, key, value) } } func (self *StateDB) GetStakeState(key common.Hash) common.Hash { stateObject := self.GetOrNewStateObject(EmptyAddress) if stateObject != nil { return stateObject.GetState(self.db, key) } return common.Hash{} } func (self *StateDB) IsContract(addr common.Address) bool { return self.getStateObject(addr) != nil } /*func New(db Database, root common.Hash, num uint64) (*StateDB, error) { }*/ // Create a new state from a given trie. func New(db Database, header *types.Header) (*StateDB, error) { var root common.Hash var num int64 if header == nil { root = common.Hash{} num = -1 } else { root = header.Root num = header.Number.Int64() } tr, err := db.OpenTrie(root) if err != nil { return nil, err } return &StateDB{ root: root, db: db, trie: tr, stateObjects: make(map[common.Address]*stateObject), stateObjectsDirty: make(map[common.Address]struct{}), logs: make(map[common.Hash][]*types.Log), preimages: make(map[common.Hash][]byte), journal: newJournal(), number: num, }, nil } func (self *StateDB) registerAddressByState(name string, contractAddr common.Address, key string) bool { key0, _ := rlp.EncodeToBytes([]interface{}{name, key, []byte{0}}) key1, _ := rlp.EncodeToBytes([]interface{}{name, key, []byte{1}}) hashKey0 := crypto.Keccak256Hash(key0) hashKey1 := crypto.Keccak256Hash(key1) address := self.getAddressByState(hashKey0, hashKey1, common.Hash{}) if address == (common.Address{}) { self.setAddressByState(hashKey0, hashKey1, common.Hash{}, contractAddr) return true } else { return address == contractAddr } return false } func (self *StateDB) OwnTicket(contractAddr common.Address, categoryName string, value common.Hash) bool { stateObject := self.getStateObject(EmptyAddress) if stateObject != nil { bytes, _ := rlp.EncodeToBytes([]interface{}{contractAddr, strings.ToUpper(categoryName), value}) hash := stateObject.GetState(self.db, crypto.Keccak256Hash(bytes)) if hash == TrueHash { return true } } return false } func (self *StateDB) AddTicket(contractAddr common.Address, categoryName string, value common.Hash) { stateObject := self.GetOrNewStateObject(EmptyAddress) if stateObject != nil { bytes, _ := rlp.EncodeToBytes([]interface{}{contractAddr, strings.ToUpper(categoryName), value}) stateObject.SetState(self.db, crypto.Keccak256Hash(bytes), TrueHash) } } func (self *StateDB) RemoveTicket(contractAddr common.Address, categoryName string, value common.Hash) bool { stateObject := self.getStateObject(EmptyAddress) if stateObject != nil { bytes, _ := rlp.EncodeToBytes([]interface{}{contractAddr, strings.ToUpper(categoryName), value}) hash := stateObject.GetState(self.db, crypto.Keccak256Hash(bytes)) if hash == TrueHash { stateObject.SetState(self.db, crypto.Keccak256Hash(bytes), FalseHash) return true } } return false } func (self *StateDB) RegisterTicket(contractAddr common.Address, categoryName string) bool { return self.registerAddressByState("Ticket", contractAddr, strings.ToUpper(categoryName)) } func (self *StateDB) GetContrctAddressByTicket(categoryName string) common.Address { return self.getContrctAddress("Ticket", strings.ToUpper(categoryName)) } func (self *StateDB) GetTokenRate(contractAddr common.Address, coinName string) (*big.Int, *big.Int) { stateObject := self.GetOrNewStateObject(EmptyAddress) if stateObject != nil { bytes0, _ := rlp.EncodeToBytes([]interface{}{"RateToken", contractAddr, strings.ToUpper(coinName)}) hash0 := stateObject.GetState(self.db, crypto.Keccak256Hash(bytes0)) bytes1, _ := rlp.EncodeToBytes([]interface{}{"RateTa", contractAddr, strings.ToUpper(coinName)}) hash1 := stateObject.GetState(self.db, crypto.Keccak256Hash(bytes1)) return new(big.Int).SetBytes(hash0[:]), new(big.Int).SetBytes(hash1[:]) } return new(big.Int), new(big.Int) } func (self *StateDB) GetSeroFee(contractAddr *common.Address, tfee *assets.Token) (sfee utils.U256, e error) { tcurrency := utils.Uint256ToCurrency(&tfee.Currency) if tcurrency != "SERO" { if contractAddr != nil { if trate, srate := self.GetTokenRate(*contractAddr, tcurrency); trate.Sign() != 0 && srate.Sign() != 0 { tvalue := big.Int(tfee.Value) sfee = utils.U256(*big.NewInt(0).Div(big.NewInt(0).Mul(&tvalue, srate), trate)) return } else { e = fmt.Errorf("current address(%v) can not support the token(%v) fee", hexutil.Encode(contractAddr[:]), tcurrency) return } } else { e = fmt.Errorf("contractAddr is nil for token(%v) fee", tcurrency) return } } else { sfee = tfee.Value return } } func (self *StateDB) GetSeroGasLimit(to *common.Address, tfee *assets.Token, gasPrice *big.Int) (gaslimit uint64, e error) { if gasPrice == nil || gasPrice.Sign() <= 0 { e = errors.New("gas must > 0") return } if sero_fee, err := self.GetSeroFee(to, tfee); err != nil { e = err return } else { gaslimit = big.NewInt(0).Div(sero_fee.ToInt(), gasPrice).Uint64() return } } func (self *StateDB) GetTxGasLimit(tx *types.Transaction) (gaslimit uint64, e error) { if gaslimit, e = self.GetSeroGasLimit(tx.To(), &tx.Stxt().Fee, tx.GasPrice()); e != nil { return } else { return } } func (self *StateDB) SetTokenRate(contractAddr common.Address, coinName string, tokens *big.Int, tas *big.Int) bool { stateObject := self.GetOrNewStateObject(EmptyAddress) if stateObject != nil { if (common.Address{}) == (self.GetContrctAddressByToken(coinName)) { return false } bytes0, _ := rlp.EncodeToBytes([]interface{}{"RateToken", contractAddr, strings.ToUpper(coinName)}) stateObject.SetState(self.db, crypto.Keccak256Hash(bytes0), common.BigToHash(tokens)) bytes1, _ := rlp.EncodeToBytes([]interface{}{"RateTa", contractAddr, strings.ToUpper(coinName)}) stateObject.SetState(self.db, crypto.Keccak256Hash(bytes1), common.BigToHash(tas)) return true } return false } //register func (self *StateDB) RegisterToken(contractAddr common.Address, coinName string) bool { return self.registerAddressByState("Token", contractAddr, strings.ToUpper(coinName)) } func (self *StateDB) GetContrctAddressByToken(coinName string) common.Address { return self.getContrctAddress("Token", strings.ToUpper(coinName)) } func (self *StateDB) getContrctAddress(name string, key string) common.Address { key0, _ := rlp.EncodeToBytes([]interface{}{name, key, []byte{0}}) key1, _ := rlp.EncodeToBytes([]interface{}{name, key, []byte{1}}) hashKey0 := crypto.Keccak256Hash(key0) hashKey1 := crypto.Keccak256Hash(key1) return self.getAddressByState(hashKey0, hashKey1, common.Hash{}) } func (self *StateDB) getAddressByState(key0, key1, key2 common.Hash) common.Address { stateObject := self.GetOrNewStateObject(EmptyAddress) if stateObject != nil { h0 := stateObject.GetState(self.db, key0) h1 := stateObject.GetState(self.db, key1) h2 := stateObject.GetState(self.db, key2) return common.BytesToAddress(append(append(h0[:], h1[:]...), h2[:]...)) } return common.Address{} } func (self *StateDB) AddNonceAddress(key []byte, nonceAddr common.Address) { key0 := crypto.Keccak256Hash(append([]byte("nonceAddr0"), key[:]...)) key1 := crypto.Keccak256Hash(append([]byte("nonceAddr1"), key[:]...)) key2 := crypto.Keccak256Hash(append([]byte("nonceAddr2"), key[:]...)) self.setAddressByState(key0, key1, key2, nonceAddr) } func (self *StateDB) GetNonceAddress(key []byte) common.Address { key0 := crypto.Keccak256Hash(append([]byte("nonceAddr0"), key[:]...)) key1 := crypto.Keccak256Hash(append([]byte("nonceAddr1"), key[:]...)) key2 := crypto.Keccak256Hash(append([]byte("nonceAddr2"), key[:]...)) return self.getAddressByState(key0, key1, key2) } func (self *StateDB) setAddressByState(key0, key1, key2 common.Hash, address common.Address) { stateObject := self.GetOrNewStateObject(EmptyAddress) if stateObject != nil { stateObject.SetState(self.db, key0, common.BytesToHash(address.Bytes()[0:32])) stateObject.SetState(self.db, key1, common.BytesToHash(address.Bytes()[32:64])) if key2 != (common.Hash{}) { stateObject.SetState(self.db, key2, common.BytesToHash(address.Bytes()[64:96])) } } } // setError remembers the first non-nil error it is called with. func (self *StateDB) setError(err error) { if self.dbErr == nil { self.dbErr = err } } func (self *StateDB) Error() error { return self.dbErr } // Reset clears out all ephemeral state objects from the state db, but keeps // the underlying state trie to avoid reloading data for the next operations. func (self *StateDB) Reset(root common.Hash) error { tr, err := self.db.OpenTrie(root) if err != nil { return err } self.trie = tr self.stateObjects = make(map[common.Address]*stateObject) self.stateObjectsDirty = make(map[common.Address]struct{}) self.thash = common.Hash{} self.bhash = common.Hash{} self.txIndex = 0 self.logs = make(map[common.Hash][]*types.Log) self.logSize = 0 self.preimages = make(map[common.Hash][]byte) self.clearJournalAndRefund() return nil } func (self *StateDB) AddLog(log *types.Log) { self.journal.append(addLogChange{txhash: self.thash}) log.TxHash = self.thash log.BlockHash = self.bhash log.TxIndex = uint(self.txIndex) log.Index = self.logSize self.logs[self.thash] = append(self.logs[self.thash], log) self.logSize++ } func (self *StateDB) GetLogs(hash common.Hash) []*types.Log { return self.logs[hash] } func (self *StateDB) Logs() []*types.Log { var logs []*types.Log for _, lgs := range self.logs { logs = append(logs, lgs...) } return logs } // AddPreimage records a SHA3 preimage seen by the VM. func (self *StateDB) AddPreimage(hash common.Hash, preimage []byte) { if _, ok := self.preimages[hash]; !ok { self.journal.append(addPreimageChange{hash: hash}) pi := make([]byte, len(preimage)) copy(pi, preimage) self.preimages[hash] = pi } } func (self *StateDB) GetContrctNonce() uint64 { stateObject := self.GetOrNewStateObject(EmptyAddress) if stateObject != nil { value := stateObject.GetState(self.db, contrctNonceKey) return new(big.Int).SetBytes(value[:]).Uint64() } return 0 } func (self *StateDB) IncAndGetContrctNonce() uint64 { stateObject := self.GetOrNewStateObject(EmptyAddress) if stateObject != nil { value := stateObject.GetState(self.db, contrctNonceKey) nonce := new(big.Int).Add(new(big.Int).SetBytes(value[:]), common.Big1) stateObject.SetState(self.db, contrctNonceKey, common.BigToHash(nonce)) return nonce.Uint64() } return 0 } // Preimages returns a list of SHA3 preimages that have been submitted. func (self *StateDB) Preimages() map[common.Hash][]byte { return self.preimages } func (self *StateDB) AddRefund(gas uint64) { self.journal.append(refundChange{prev: self.refund}) self.refund += gas } // Exist reports whether the given account address exists in the state. // Notably this also returns true for suicided accounts. func (self *StateDB) Exist(addr common.Address) bool { return self.getStateObject(addr) != nil } // Empty returns whether the state object is either non-existent // or empty according to the EIP161 specification (balance = nonce = code = 0) func (self *StateDB) Empty(addr common.Address) bool { so := self.getStateObject(addr) return so == nil || so.empty() } // Retrieve the balance from the given address or 0 if object not found func (self *StateDB) GetBalance(addr common.Address, coinName string) *big.Int { stateObject := self.getStateObject(addr) if stateObject != nil { return stateObject.Balance(coinName) } return common.Big0 } func (self *StateDB) Balances(addr common.Address) map[string]*big.Int { stateObject := self.getStateObject(addr) if stateObject != nil { return stateObject.Balances() } return map[string]*big.Int{} } func (self *StateDB) GetCode(addr common.Address) []byte { stateObject := self.getStateObject(addr) if stateObject != nil { return stateObject.Code(self.db) } return nil } func (self *StateDB) GetCodeSize(addr common.Address) int { stateObject := self.getStateObject(addr) if stateObject == nil { return 0 } if stateObject.code != nil { return len(stateObject.code) } size, err := self.db.ContractCodeSize(stateObject.addrHash, common.BytesToHash(stateObject.CodeHash())) if err != nil { self.setError(err) } return size } func (self *StateDB) GetCodeHash(addr common.Address) common.Hash { stateObject := self.getStateObject(addr) if stateObject == nil { return common.Hash{} } return common.BytesToHash(stateObject.CodeHash()) } func (self *StateDB) GetState(addr common.Address, bhash common.Hash) common.Hash { stateObject := self.getStateObject(addr) if stateObject != nil { return stateObject.GetState(self.db, bhash) } return common.Hash{} } // Database retrieves the low level database supporting the lower level trie ops. func (self *StateDB) Database() Database { return self.db } // StorageTrie returns the storage trie of an account. // The return value is a copy and is nil for non-existent accounts. func (self *StateDB) StorageTrie(addr common.Address) Trie { stateObject := self.getStateObject(addr) if stateObject == nil { return nil } cpy := stateObject.deepCopy(self) return cpy.updateTrie(self.db) } func (self *StateDB) HasSuicided(addr common.Address) bool { stateObject := self.getStateObject(addr) if stateObject != nil { return stateObject.suicided } return false } func (self *StateDB) GetTicketNonce(addr common.Address) uint64 { stateObject := self.getStateObject(addr) if stateObject != nil { return stateObject.TicketNonce() } return 0 } /* * SETTERS */ func (self *StateDB) SetTicketNonce(addr common.Address, nonce uint64) { stateObject := self.GetOrNewStateObject(addr) if stateObject != nil { stateObject.SetTicketNonce(nonce) } } // AddBalance adds amount to the account associated with addr. func (self *StateDB) AddBalance(addr common.Address, coinName string, amount *big.Int) { stateObject := self.GetOrNewStateObject(addr) if stateObject != nil { stateObject.AddBalance(coinName, amount) } } // SubBalance subtracts amount from the account associated with addr. func (self *StateDB) SubBalance(addr common.Address, coinName string, amount *big.Int) { stateObject := self.GetOrNewStateObject(addr) if stateObject != nil { stateObject.SubBalance(coinName, amount) } } func (self *StateDB) SetBalance(addr common.Address, coinName string, amount *big.Int) { stateObject := self.GetOrNewStateObject(addr) if stateObject != nil { stateObject.SetBalance(coinName, amount) } } func (self *StateDB) SetCode(addr common.Address, code []byte) { stateObject := self.GetOrNewStateObject(addr) if stateObject != nil { stateObject.SetCode(crypto.Keccak256Hash(code), code) } } func (self *StateDB) SetState(addr common.Address, key, value common.Hash) { stateObject := self.GetOrNewStateObject(addr) if stateObject != nil { stateObject.SetState(self.db, key, value) } } // Suicide marks the given account as suicided. // This clears the account balance. // // The account's state object is still available until the state is committed, // getStateObject will return a non-nil account after Suicide. func (self *StateDB) Suicide(addr common.Address, toAddr common.Address) bool { stateObject := self.getStateObject(addr) if stateObject == nil { return false } books := []*Book{} for _, book := range stateObject.data.Books { books = append(books, &Book{book.Balance, book.Currency}) } self.journal.append(suicideChange{ account: &addr, prev: stateObject.suicided, prevBooks: books, }) //if self.IsContract(toAddr) { // toStateObject := self.getStateObject(addr) // for _, book := range books { // toStateObject.AddBalance(book.Currency, book.Balance) // } //} else { // for _, book := range books { // currency := common.BytesToHash(common.LeftPadBytes([]byte(book.Currency), 32)) // self.GetZState().AddTxOut(toAddr, book.Balance, currency.HashToUint256()) // } //} stateObject.markSuicided() stateObject.data.Books = []*Book{} stateObject.data.bookMap = map[string]*Book{} return true } // // Setting, updating & deleting state object methods. // // updateStateObject writes the given object to the trie. func (self *StateDB) updateStateObject(stateObject *stateObject) { addr := stateObject.Address() data, err := rlp.EncodeToBytes(stateObject) if err != nil { panic(fmt.Errorf("can't encode object at %x: %v", addr.Bytes(), err)) } self.setError(self.trie.TryUpdate(addr.Bytes(), data)) } // deleteStateObject removes the given object from the state trie. func (self *StateDB) deleteStateObject(stateObject *stateObject) { stateObject.deleted = true addr := stateObject.Address() self.setError(self.trie.TryDelete(addr.Bytes())) } // Retrieve a state object given by the address. Returns nil if not found. func (self *StateDB) getStateObject(addr common.Address) (stateObject *stateObject) { // Prefer 'live' objects. if obj := self.stateObjects[addr]; obj != nil { if obj.deleted { return nil } return obj } // Load the object from the database. enc, err := self.trie.TryGet(addr.Bytes()) if len(enc) == 0 { self.setError(err) return nil } var data Account if err := rlp.DecodeBytes(enc, &data); err != nil { log.Error("Failed to decode state object", "addr", addr, "err", err) return nil } // Insert into the live set. obj := newObject(self, addr, data) self.setStateObject(obj) return obj } func (self *StateDB) setStateObject(object *stateObject) { self.stateObjects[object.Address()] = object } // Retrieve a state object or create a new state object if nil. func (self *StateDB) GetOrNewStateObject(addr common.Address) *stateObject { stateObject := self.getStateObject(addr) if stateObject == nil || stateObject.deleted { stateObject, _ = self.createObject(addr) } return stateObject } // createObject creates a new state object. If there is an existing account with // the given address, it is overwritten and returned as the second return value. func (self *StateDB) createObject(addr common.Address) (newobj, prev *stateObject) { prev = self.getStateObject(addr) newobj = newObject(self, addr, Account{}) //newobj.setNonce(0) // sets the object to dirty if prev == nil { self.journal.append(createObjectChange{account: &addr}) } else { self.journal.append(resetObjectChange{prev: prev}) } self.setStateObject(newobj) return newobj, prev } // Carrying over the balance ensures that Ether doesn't disappear. func (self *StateDB) CreateAccount(addr common.Address) { self.createObject(addr) } func (db *StateDB) ForEachOuts(cb func(key, value common.Hash) bool) { it := trie.NewIterator(db.trie.NodeIterator(nil)) for it.Next() { // ignore cached values key := common.BytesToHash(db.trie.GetKey(it.Key)) cb(key, common.BytesToHash(it.Value)) } } func (db *StateDB) ForEachStorage(addr common.Address, cb func(key, value common.Hash) bool) { so := db.getStateObject(addr) if so == nil { return } // When iterating over the storage check the cache first for h, value := range so.cachedStorage { cb(h, value) } it := trie.NewIterator(so.getTrie(db.db).NodeIterator(nil)) for it.Next() { // ignore cached values key := common.BytesToHash(db.trie.GetKey(it.Key)) if _, ok := so.cachedStorage[key]; !ok { cb(key, common.BytesToHash(it.Value)) } } } func (self *StateDB) CopyWithNoZState() *StateDB { state := self.Copy() state.zstate = nil return state } // Copy creates a deep, independent copy of the state. // Snapshots of the copied state cannot be applied to the copy. func (self *StateDB) Copy() *StateDB { self.lock.Lock() defer self.lock.Unlock() // Copy all the basic fields, initialize the memory ones state := &StateDB{ root: self.root, db: self.db, trie: self.db.CopyTrie(self.trie), stateObjects: make(map[common.Address]*stateObject, len(self.journal.dirties)), stateObjectsDirty: make(map[common.Address]struct{}, len(self.journal.dirties)), zstate: self.zstate.Copy(), refund: self.refund, logs: make(map[common.Hash][]*types.Log, len(self.logs)), logSize: self.logSize, preimages: make(map[common.Hash][]byte), journal: newJournal(), number: self.number, } if self.stakeState != nil { state.stakeState = self.stakeState.Copy(&zeroDB{state}) } // Copy the dirty states, logs, and preimages for addr := range self.journal.dirties { // As documented [here](https://github.com/sero-cash/go-sero/pull/16485#issuecomment-380438527), // and in the Finalise-method, there is a case where an object is in the journal but not // in the stateObjects: OOG after touch on ripeMD prior to AutumnTwilight. Thus, we need to check for // nil if object, exist := self.stateObjects[addr]; exist { state.stateObjects[addr] = object.deepCopy(state) state.stateObjectsDirty[addr] = struct{}{} } } // Above, we don't copy the actual journal. This means that if the copy is copied, the // loop above will be a no-op, since the copy's journal is empty. // Thus, here we iterate over stateObjects, to enable copies of copies for addr := range self.stateObjectsDirty { if _, exist := state.stateObjects[addr]; !exist { state.stateObjects[addr] = self.stateObjects[addr].deepCopy(state) state.stateObjectsDirty[addr] = struct{}{} } } for hash, logs := range self.logs { state.logs[hash] = make([]*types.Log, len(logs)) copy(state.logs[hash], logs) } for hash, preimage := range self.preimages { state.preimages[hash] = preimage } return state } // Snapshot returns an identifier for the current revision of the state. func (self *StateDB) Snapshot() int { id := self.nextRevisionId self.nextRevisionId++ self.validRevisions = append(self.validRevisions, revision{id, self.journal.length()}) self.GetStakeCons().CreateSnapshot(id) self.NextZState().Snapshot(id) return id } // RevertToSnapshot reverts all state changes made since the given revision. func (self *StateDB) RevertToSnapshot(revid int) { // Find the snapshot in the stack of valid snapshots. idx := sort.Search(len(self.validRevisions), func(i int) bool { return self.validRevisions[i].id >= revid }) if idx == len(self.validRevisions) || self.validRevisions[idx].id != revid { panic(fmt.Errorf("revision id %v cannot be reverted", revid)) } snapshot := self.validRevisions[idx].journalIndex // Replay the journal to undo changes and remove invalidated snapshots self.journal.revert(self, snapshot) self.validRevisions = self.validRevisions[:idx] self.GetStakeCons().RevertToSnapshot(revid) self.NextZState().Revert(revid) } // GetRefund returns the current value of the refund counter. func (self *StateDB) GetRefund() uint64 { return self.refund } // Finalise finalises the state by removing the self destructed objects // and clears the journal as well as the refunds. func (s *StateDB) Finalise(deleteEmptyObjects bool) { for addr := range s.journal.dirties { stateObject, exist := s.stateObjects[addr] if !exist { // ripeMD is 'touched' at block 1714175, in tx 0x1237f737031e40bcde4a8b7e717b2d15e3ecadfe49bb1bbc71ee9deb09c6fcf2 // That tx goes out of gas, and although the notion of 'touched' does not exist there, the // touch-event will still be recorded in the journal. Since ripeMD is a special snowflake, // it will persist in the journal even though the journal is reverted. In this special circumstance, // it may exist in `s.journal.dirties` but not in `s.stateObjects`. // Thus, we can safely ignore it here continue } if stateObject.suicided || (deleteEmptyObjects && stateObject.empty()) { s.deleteStateObject(stateObject) } else { stateObject.updateRoot(s.db) s.updateStateObject(stateObject) } s.stateObjectsDirty[addr] = struct{}{} } // Invalidate journal because reverting across transactions is not allowed. s.clearJournalAndRefund() } // IntermediateRoot computes the current root hash of the state trie. // It is called in between transactions to get the root hash that // goes into transaction receipts. func (s *StateDB) IntermediateRoot(deleteEmptyObjects bool) common.Hash { s.NextZState().Update() s.GetStakeCons().Update() s.Finalise(deleteEmptyObjects) return s.trie.Hash() } // Prepare sets the current transaction hash and index and block hash which is // used when the EVM emits new state logs. func (self *StateDB) Prepare(thash, bhash common.Hash, ti int) { self.thash = thash self.bhash = bhash self.txIndex = ti } func (s *StateDB) clearJournalAndRefund() { s.journal = newJournal() s.validRevisions = s.validRevisions[:0] s.refund = 0 } // Commit writes the state to the underlying in-memory trie database. func (s *StateDB) Commit(deleteEmptyObjects bool) (root common.Hash, err error) { defer s.clearJournalAndRefund() for addr := range s.journal.dirties { s.stateObjectsDirty[addr] = struct{}{} } // Commit objects to the trie. for addr, stateObject := range s.stateObjects { _, isDirty := s.stateObjectsDirty[addr] switch { case stateObject.suicided || (isDirty && deleteEmptyObjects && stateObject.empty()): // If the object has been removed, don't bother syncing it // and just mark it for deletion in the trie. s.deleteStateObject(stateObject) case isDirty: // Write any contract code associated with the state object if stateObject.code != nil && stateObject.dirtyCode { s.db.TrieDB().InsertBlob(common.BytesToHash(stateObject.CodeHash()), stateObject.code) stateObject.dirtyCode = false } // Write any storage changes in the state object to its storage trie. if err := stateObject.CommitTrie(s.db); err != nil { return common.Hash{}, err } // Update the object in the main account trie. s.updateStateObject(stateObject) } delete(s.stateObjectsDirty, addr) } // Write trie changes. root, err = s.trie.Commit(s.leafCallback) log.Debug("Trie cache stats after commit", "misses", trie.CacheMisses(), "unloads", trie.CacheUnloads()) return root, err } func (s *StateDB) leafCallback(leaf []byte, parent common.Hash) error { var account Account if err := rlp.DecodeBytes(leaf, &account); err != nil { return nil } if account.Root != emptyState { s.db.TrieDB().Reference(account.Root, parent) } code := common.BytesToHash(account.CodeHash) if code != emptyCode { s.db.TrieDB().Reference(code, parent) } return nil } ================================================ FILE: core/state/statedb4zero.go ================================================ package state import ( "github.com/pkg/errors" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/serodb" "github.com/sero-cash/go-sero/zero/consensus" "github.com/sero-cash/go-sero/zero/txs/zstate" ) type StateDbPut interface { Put(key, value []byte) error } type StateTri struct { db *StateDB Tri Trie Dbget serodb.Getter Dbput serodb.Putter } func (self *StateTri) TryGet(key []byte) ([]byte, error) { return self.Tri.TryGet(key) } func (self *StateTri) TryUpdate(key, value []byte) error { return self.Tri.TryUpdate(key, value) } func (self *StateTri) SetState(obj *c_type.PKr, key *c_type.Uint256, value *c_type.Uint256) { var addr common.Address if obj != nil { copy(addr[:], obj[:]) } else { addr = EmptyAddress } self.db.SetState(addr, common.Hash(*key), common.Hash(*value)) } func (self *StateTri) GetState(obj *c_type.PKr, key *c_type.Uint256) (ret c_type.Uint256) { var addr common.Address if obj != nil { copy(addr[:], obj[:]) } else { addr = EmptyAddress } v := self.db.GetState(addr, common.Hash(*key)) ret = c_type.Uint256(v) return } func (self *StateTri) TryGlobalGet(key []byte) ([]byte, error) { return self.Dbget.Get(key) } func (self *StateTri) TryGlobalPut(key, value []byte) error { return self.Dbput.Put(key, value) } func (self *StateTri) GlobalGetter() serodb.Getter { return self.Dbget } func (self *StateDB) CurrentZState() *zstate.ZState { if self.number < 0 { panic(errors.New("Current ZState height num must >= 0")) } if self.zstate == nil { st := StateTri{ self, self.trie, self.db.TrieDB().DiskDB(), self.db.TrieDB().WDiskDB(), } self.zstate = zstate.CurrentState(&st, uint64(self.number)) } return self.zstate } func (self *StateDB) NextZState() *zstate.ZState { if self.number < -1 { panic(errors.New("Next ZState height num must >= -1")) } if self.zstate == nil { st := StateTri{ self, self.trie, self.db.TrieDB().DiskDB(), self.db.TrieDB().WDiskDB(), } self.zstate = zstate.NextState(&st, self.number) } return self.zstate } type zeroDB struct { db *StateDB } func (self *zeroDB) CurrentTri() serodb.Tri { return self.db.trie } func (self *zeroDB) GlobalGetter() serodb.Getter { return self.db.db.TrieDB().DiskDB() } var StakeDB = consensus.DBObj{"STAKE$BLOCK$INDEX"} func (self *StateDB) GetStakeCons() *consensus.Cons { if self.stakeState == nil { cons := consensus.NewCons(&zeroDB{self}, StakeDB.Pre) self.stakeState = &cons } return self.stakeState } ================================================ FILE: core/state/statedb_test.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package state import ( "bytes" "encoding/binary" "fmt" "math" "math/big" "math/rand" "reflect" "strings" "testing" "testing/quick" "github.com/sero-cash/go-czero-import/cpt" "gopkg.in/check.v1" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/serodb" ) // Tests that updating a state trie does not leak any database writes prior to // actually committing the state. func TestUpdateLeaks(t *testing.T) { // Create an empty state database db := serodb.NewMemDatabase() state, _ := New(NewDatabase(db), nil) // Update it with some accounts for i := byte(0); i < 255; i++ { addr := common.BytesToAddress([]byte{i}) state.AddBalance(addr, "sero", big.NewInt(int64(11*i))) if i%2 == 0 { state.SetState(addr, common.BytesToHash([]byte{i, i, i}), common.BytesToHash([]byte{i, i, i, i})) } if i%3 == 0 { state.SetCode(addr, []byte{i, i, i, i, i}) } state.IntermediateRoot(false) } // Ensure that no data was leaked into the database for _, key := range db.Keys() { value, _ := db.Get(key) t.Errorf("State leaked into database: %x -> %x", key, value) } } // Tests that no intermediate state of an object is stored into the database, // only the one right before the commit. func TestIntermediateLeaks(t *testing.T) { // Create two state databases, one transitioning to the final state, the other final from the beginning transDb := serodb.NewMemDatabase() finalDb := serodb.NewMemDatabase() transState, _ := New(NewDatabase(transDb), nil) finalState, _ := New(NewDatabase(finalDb), nil) modify := func(state *StateDB, addr common.Address, i, tweak byte) { state.SetBalance(addr, "sero", big.NewInt(int64(11*i)+int64(tweak))) if i%2 == 0 { state.SetState(addr, common.Hash{i, i, i, 0}, common.Hash{}) state.SetState(addr, common.Hash{i, i, i, tweak}, common.Hash{i, i, i, i, tweak}) } if i%3 == 0 { state.SetCode(addr, []byte{i, i, i, i, i, tweak}) } } // Modify the transient state. for i := byte(0); i < 255; i++ { modify(transState, common.BytesToAddress([]byte{byte(i)}), i, 0) } // Write modifications to trie. transState.IntermediateRoot(false) // Overwrite all the data with new values in the transient database. for i := byte(0); i < 255; i++ { modify(transState, common.BytesToAddress([]byte{byte(i)}), i, 99) modify(finalState, common.BytesToAddress([]byte{byte(i)}), i, 99) } // Commit and cross check the databases. if _, err := transState.Commit(false); err != nil { t.Fatalf("failed to commit transition state: %v", err) } if _, err := finalState.Commit(false); err != nil { t.Fatalf("failed to commit final state: %v", err) } for _, key := range finalDb.Keys() { if _, err := transDb.Get(key); err != nil { val, _ := finalDb.Get(key) t.Errorf("entry missing from the transition database: %x -> %x", key, val) } } for _, key := range transDb.Keys() { if _, err := finalDb.Get(key); err != nil { val, _ := transDb.Get(key) t.Errorf("extra entry in the transition database: %x -> %x", key, val) } } } // TestCopy tests that copying a statedb object indeed makes the original and // the copy independent of each other. This test is a regression test against // https://github.com/sero-cash/go-sero/pull/15549. func TestCopy(t *testing.T) { // Create a random state test to copy and modify "independently" orig, _ := New(NewDatabase(serodb.NewMemDatabase()), nil) for i := byte(0); i < 255; i++ { obj := orig.GetOrNewStateObject(common.BytesToAddress([]byte{i})) obj.AddBalance("sero", big.NewInt(int64(i))) orig.updateStateObject(obj) } orig.Finalise(false) // Copy the state, modify both in-memory copy := orig.Copy() for i := byte(0); i < 255; i++ { origObj := orig.GetOrNewStateObject(common.BytesToAddress([]byte{i})) copyObj := copy.GetOrNewStateObject(common.BytesToAddress([]byte{i})) origObj.AddBalance("sero", big.NewInt(2*int64(i))) copyObj.AddBalance("sero", big.NewInt(3*int64(i))) orig.updateStateObject(origObj) copy.updateStateObject(copyObj) } // Finalise the changes on both concurrently done := make(chan struct{}) go func() { orig.Finalise(true) close(done) }() copy.Finalise(true) <-done // Verify that the two states have been updated independently for i := byte(0); i < 255; i++ { origObj := orig.GetOrNewStateObject(common.BytesToAddress([]byte{i})) copyObj := copy.GetOrNewStateObject(common.BytesToAddress([]byte{i})) if want := big.NewInt(3 * int64(i)); origObj.Balance("sero").Cmp(want) != 0 { t.Errorf("orig obj %d: balance mismatch: have %v, want %v", i, origObj.Balance("sero"), want) } if want := big.NewInt(4 * int64(i)); copyObj.Balance("sero").Cmp(want) != 0 { t.Errorf("copy obj %d: balance mismatch: have %v, want %v", i, copyObj.Balance("sero"), want) } } } func TestSnapshotRandom(t *testing.T) { cpt.ZeroInit_NoCircuit() config := &quick.Config{MaxCount: 1000} err := quick.Check((*snapshotTest).run, config) if cerr, ok := err.(*quick.CheckError); ok { test := cerr.In[0].(*snapshotTest) t.Errorf("%v:\n%s", test.err, test) } else if err != nil { t.Error(err) } } // A snapshotTest checks that reverting StateDB snapshots properly undoes all changes // captured by the snapshot. Instances of this test with pseudorandom content are created // by Generate. // // The test works as follows: // // A new state is created and all actions are applied to it. Several snapshots are taken // in between actions. The test then reverts each snapshot. For each snapshot the actions // leading up to it are replayed on a fresh, empty state. The behaviour of all public // accessor methods on the reverted state must match the return value of the equivalent // methods on the replayed state. type snapshotTest struct { addrs []common.Address // all account addresses actions []testAction // modifications to the state snapshots []int // actions indexes at which snapshot is taken err error // failure details are reported through this field } type testAction struct { name string fn func(testAction, *StateDB) args []int64 noAddr bool } // newTestAction creates a random action that changes state. func newTestAction(addr common.Address, r *rand.Rand) testAction { actions := []testAction{ { name: "SetBalance", fn: func(a testAction, s *StateDB) { s.SetBalance(addr, "sero", big.NewInt(a.args[0])) }, args: make([]int64, 1), }, { name: "AddBalance", fn: func(a testAction, s *StateDB) { s.AddBalance(addr, "sero", big.NewInt(a.args[0])) }, args: make([]int64, 1), }, { name: "SetState", fn: func(a testAction, s *StateDB) { var key, val common.Hash binary.BigEndian.PutUint16(key[:], uint16(a.args[0])) binary.BigEndian.PutUint16(val[:], uint16(a.args[1])) s.SetState(addr, key, val) }, args: make([]int64, 2), }, { name: "SetCode", fn: func(a testAction, s *StateDB) { code := make([]byte, 16) binary.BigEndian.PutUint64(code, uint64(a.args[0])) binary.BigEndian.PutUint64(code[8:], uint64(a.args[1])) s.SetCode(addr, code) }, args: make([]int64, 2), }, { name: "CreateAccount", fn: func(a testAction, s *StateDB) { s.CreateAccount(addr) }, }, { name: "Suicide", fn: func(a testAction, s *StateDB) { s.Suicide(addr, common.Address{}) }, }, { name: "AddRefund", fn: func(a testAction, s *StateDB) { s.AddRefund(uint64(a.args[0])) }, args: make([]int64, 1), noAddr: true, }, { name: "AddLog", fn: func(a testAction, s *StateDB) { data := make([]byte, 2) binary.BigEndian.PutUint16(data, uint16(a.args[0])) s.AddLog(&types.Log{Address: addr, Data: data}) }, args: make([]int64, 1), }, } action := actions[r.Intn(len(actions))] var nameargs []string if !action.noAddr { nameargs = append(nameargs, addr.Base58()) } for _, i := range action.args { action.args[i] = rand.Int63n(100) nameargs = append(nameargs, fmt.Sprint(action.args[i])) } action.name += strings.Join(nameargs, ", ") return action } // Generate returns a new snapshot test of the given size. All randomness is // derived from r. func (*snapshotTest) Generate(r *rand.Rand, size int) reflect.Value { // Generate random actions. addrs := make([]common.Address, 50) for i := range addrs { addrs[i] = common.BytesToAddress([]byte{byte(i)}) } actions := make([]testAction, size) for i := range actions { addr := addrs[r.Intn(len(addrs))] actions[i] = newTestAction(addr, r) } // Generate snapshot indexes. nsnapshots := int(math.Sqrt(float64(size))) if size > 0 && nsnapshots == 0 { nsnapshots = 1 } snapshots := make([]int, nsnapshots) snaplen := len(actions) / nsnapshots for i := range snapshots { // Try to place the snapshots some number of actions apart from each other. snapshots[i] = (i * snaplen) + r.Intn(snaplen) } return reflect.ValueOf(&snapshotTest{addrs, actions, snapshots, nil}) } func (test *snapshotTest) String() string { out := new(bytes.Buffer) sindex := 0 for i, action := range test.actions { if len(test.snapshots) > sindex && i == test.snapshots[sindex] { fmt.Fprintf(out, "---- snapshot %d ----\n", sindex) sindex++ } fmt.Fprintf(out, "%4d: %s\n", i, action.name) } return out.String() } func (test *snapshotTest) run() bool { // Run all actions and create snapshots. var ( state, _ = New(NewDatabase(serodb.NewMemDatabase()), nil) snapshotRevs = make([]int, len(test.snapshots)) sindex = 0 ) for i, action := range test.actions { if len(test.snapshots) > sindex && i == test.snapshots[sindex] { snapshotRevs[sindex] = state.Snapshot() sindex++ } action.fn(action, state) } // Revert all snapshots in reverse order. Each revert must yield a state // that is equivalent to fresh state with all actions up the snapshot applied. for sindex--; sindex >= 0; sindex-- { checkstate, _ := New(state.Database(), nil) for _, action := range test.actions[:test.snapshots[sindex]] { action.fn(action, checkstate) } state.RevertToSnapshot(snapshotRevs[sindex]) if err := test.checkEqual(state, checkstate); err != nil { test.err = fmt.Errorf("state mismatch after revert to snapshot %d\n%v", sindex, err) return false } } return true } // checkEqual checks that methods of state and checkstate return the same values. func (test *snapshotTest) checkEqual(state, checkstate *StateDB) error { for _, addr := range test.addrs { var err error checkeq := func(op string, a, b interface{}) bool { if err == nil && !reflect.DeepEqual(a, b) { err = fmt.Errorf("got %s(%s) == %v, want %v", op, addr.Base58(), a, b) return false } return true } // Check basic accessor methods. checkeq("Exist", state.Exist(addr), checkstate.Exist(addr)) checkeq("HasSuicided", state.HasSuicided(addr), checkstate.HasSuicided(addr)) checkeq("GetBalance", state.GetBalance(addr, "sero"), checkstate.GetBalance(addr, "sero")) checkeq("GetCode", state.GetCode(addr), checkstate.GetCode(addr)) checkeq("GetCodeHash", state.GetCodeHash(addr), checkstate.GetCodeHash(addr)) checkeq("GetCodeSize", state.GetCodeSize(addr), checkstate.GetCodeSize(addr)) // Check storage. if obj := state.getStateObject(addr); obj != nil { state.ForEachStorage(addr, func(key, val common.Hash) bool { return checkeq("GetState("+key.Hex()+")", val, checkstate.GetState(addr, key)) }) checkstate.ForEachStorage(addr, func(key, checkval common.Hash) bool { return checkeq("GetState("+key.Hex()+")", state.GetState(addr, key), checkval) }) } if err != nil { return err } } if state.GetRefund() != checkstate.GetRefund() { return fmt.Errorf("got GetRefund() == %d, want GetRefund() == %d", state.GetRefund(), checkstate.GetRefund()) } if !reflect.DeepEqual(state.GetLogs(common.Hash{}), checkstate.GetLogs(common.Hash{})) { return fmt.Errorf("got GetLogs(common.Hash{}) == %v, want GetLogs(common.Hash{}) == %v", state.GetLogs(common.Hash{}), checkstate.GetLogs(common.Hash{})) } return nil } func (s *StateSuite) TestTouchDelete(c *check.C) { s.state.GetOrNewStateObject(common.Address{}) root, _ := s.state.Commit(false) s.state.Reset(root) snapshot := s.state.Snapshot() s.state.AddBalance(common.Address{}, "sero", new(big.Int)) if len(s.state.journal.dirties) != 1 { c.Fatal("expected one dirty state object") } s.state.RevertToSnapshot(snapshot) if len(s.state.journal.dirties) != 0 { c.Fatal("expected no dirty state object") } } // TestCopyOfCopy tests that modified objects are carried over to the copy, and the copy of the copy. // See https://github.com/sero-cash/go-sero/pull/15225#issuecomment-380191512 func TestCopyOfCopy(t *testing.T) { sdb, _ := New(NewDatabase(serodb.NewMemDatabase()), nil) addr := common.Base58ToAddress("aaaa") sdb.SetBalance(addr, "sero", big.NewInt(42)) if got := sdb.Copy().GetBalance(addr, "sero").Uint64(); got != 42 { t.Fatalf("1st copy fail, expected 42, got %v", got) } if got := sdb.Copy().Copy().GetBalance(addr, "sero").Uint64(); got != 42 { t.Fatalf("2nd copy fail, expected 42, got %v", got) } } ================================================ FILE: core/state/sync.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package state import ( "bytes" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/rlp" "github.com/sero-cash/go-sero/trie" ) // NewStateSync create a new state trie download scheduler. func NewStateSync(root common.Hash, database trie.DatabaseReader) *trie.Sync { var syncer *trie.Sync callback := func(leaf []byte, parent common.Hash) error { if len(leaf)>=70 { var obj Account if err := rlp.Decode(bytes.NewReader(leaf), &obj); err != nil { return nil } else { syncer.AddSubTrie(obj.Root, 64, parent, nil) syncer.AddRawEntry(common.BytesToHash(obj.CodeHash), 64, parent) } } return nil } syncer = trie.NewSync(root, database, callback) return syncer } ================================================ FILE: core/state/sync_test.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package state import ( "bytes" "math/big" "testing" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/crypto" "github.com/sero-cash/go-sero/serodb" "github.com/sero-cash/go-sero/trie" ) // testAccount is the data associated with an account used by the state tests. type testAccount struct { address common.Address balance *big.Int nonce uint64 code []byte } // makeTestState create a sample test state to test node-wise reconstruction. func makeTestState() (Database, common.Hash, []*testAccount) { // Create an empty state db := NewDatabase(serodb.NewMemDatabase()) state, _ := New(db, nil) // Fill it with some arbitrary data accounts := []*testAccount{} for i := byte(0); i < 96; i++ { obj := state.GetOrNewStateObject(common.BytesToAddress([]byte{i})) acc := &testAccount{address: common.BytesToAddress([]byte{i})} obj.AddBalance("sero", big.NewInt(int64(11*i))) acc.balance = big.NewInt(int64(11 * i)) acc.nonce = uint64(42 * i) if i%3 == 0 { obj.SetCode(crypto.Keccak256Hash([]byte{i, i, i, i, i}), []byte{i, i, i, i, i}) acc.code = []byte{i, i, i, i, i} } state.updateStateObject(obj) accounts = append(accounts, acc) } root, _ := state.Commit(false) // Return the generated state return db, root, accounts } // checkStateAccounts cross references a reconstructed state with an expected // account array. func checkStateAccounts(t *testing.T, db serodb.Database, root common.Hash, accounts []*testAccount) { // Check root availability and state contents state, err := New(NewDatabase(db), nil) if err != nil { t.Fatalf("failed to create state trie at %x: %v", root, err) } if err := checkStateConsistency(db, root); err != nil { t.Fatalf("inconsistent state trie at %x: %v", root, err) } for i, acc := range accounts { if balance := state.GetBalance(acc.address, "sero"); balance.Cmp(acc.balance) != 0 { t.Errorf("account %d: balance mismatch: have %v, want %v", i, balance, acc.balance) } if code := state.GetCode(acc.address); !bytes.Equal(code, acc.code) { t.Errorf("account %d: code mismatch: have %x, want %x", i, code, acc.code) } } } // checkTrieConsistency checks that all nodes in a (sub-)trie are indeed present. func checkTrieConsistency(db serodb.Database, root common.Hash) error { if v, _ := db.Get(root[:]); v == nil { return nil // Consider a non existent state consistent. } trie, err := trie.New(root, trie.NewDatabase(db)) if err != nil { return err } it := trie.NodeIterator(nil) for it.Next(true) { } return it.Error() } // checkStateConsistency checks that all data of a state root is present. func checkStateConsistency(db serodb.Database, root common.Hash) error { // Create and iterate a state trie rooted in a sub-node if _, err := db.Get(root.Bytes()); err != nil { return nil // Consider a non existent state consistent. } state, err := New(NewDatabase(db), nil) if err != nil { return err } it := NewNodeIterator(state) for it.Next() { } return it.Error } // Tests that an empty state is not scheduled for syncing. func TestEmptyStateSync(t *testing.T) { empty := common.HexToHash("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421") if req := NewStateSync(empty, serodb.NewMemDatabase()).Missing(1); len(req) != 0 { t.Errorf("content requested for empty state: %v", req) } } // Tests that given a root hash, a state can sync iteratively on a single thread, // requesting retrieval tasks and returning all of them in one go. func TestIterativeStateSyncIndividual(t *testing.T) { testIterativeStateSync(t, 1) } func TestIterativeStateSyncBatched(t *testing.T) { testIterativeStateSync(t, 100) } func testIterativeStateSync(t *testing.T, batch int) { // Create a random state to copy srcDb, srcRoot, srcAccounts := makeTestState() // Create a destination state and sync with the scheduler dstDb := serodb.NewMemDatabase() sched := NewStateSync(srcRoot, dstDb) queue := append([]common.Hash{}, sched.Missing(batch)...) for len(queue) > 0 { results := make([]trie.SyncResult, len(queue)) for i, hash := range queue { data, err := srcDb.TrieDB().Node(hash) if err != nil { t.Fatalf("failed to retrieve node data for %x", hash) } results[i] = trie.SyncResult{Hash: hash, Data: data} } if _, index, err := sched.Process(results); err != nil { t.Fatalf("failed to process result #%d: %v", index, err) } if index, err := sched.Commit(dstDb); err != nil { t.Fatalf("failed to commit data #%d: %v", index, err) } queue = append(queue[:0], sched.Missing(batch)...) } // Cross check that the two states are in sync checkStateAccounts(t, dstDb, srcRoot, srcAccounts) } // Tests that the trie scheduler can correctly reconstruct the state even if only // partial results are returned, and the others sent only later. func TestIterativeDelayedStateSync(t *testing.T) { // Create a random state to copy srcDb, srcRoot, srcAccounts := makeTestState() // Create a destination state and sync with the scheduler dstDb := serodb.NewMemDatabase() sched := NewStateSync(srcRoot, dstDb) queue := append([]common.Hash{}, sched.Missing(0)...) for len(queue) > 0 { // Sync only half of the scheduled nodes results := make([]trie.SyncResult, len(queue)/2+1) for i, hash := range queue[:len(results)] { data, err := srcDb.TrieDB().Node(hash) if err != nil { t.Fatalf("failed to retrieve node data for %x", hash) } results[i] = trie.SyncResult{Hash: hash, Data: data} } if _, index, err := sched.Process(results); err != nil { t.Fatalf("failed to process result #%d: %v", index, err) } if index, err := sched.Commit(dstDb); err != nil { t.Fatalf("failed to commit data #%d: %v", index, err) } queue = append(queue[len(results):], sched.Missing(0)...) } // Cross check that the two states are in sync checkStateAccounts(t, dstDb, srcRoot, srcAccounts) } // Tests that given a root hash, a trie can sync iteratively on a single thread, // requesting retrieval tasks and returning all of them in one go, however in a // random order. func TestIterativeRandomStateSyncIndividual(t *testing.T) { testIterativeRandomStateSync(t, 1) } func TestIterativeRandomStateSyncBatched(t *testing.T) { testIterativeRandomStateSync(t, 100) } func testIterativeRandomStateSync(t *testing.T, batch int) { // Create a random state to copy srcDb, srcRoot, srcAccounts := makeTestState() // Create a destination state and sync with the scheduler dstDb := serodb.NewMemDatabase() sched := NewStateSync(srcRoot, dstDb) queue := make(map[common.Hash]struct{}) for _, hash := range sched.Missing(batch) { queue[hash] = struct{}{} } for len(queue) > 0 { // Fetch all the queued nodes in a random order results := make([]trie.SyncResult, 0, len(queue)) for hash := range queue { data, err := srcDb.TrieDB().Node(hash) if err != nil { t.Fatalf("failed to retrieve node data for %x", hash) } results = append(results, trie.SyncResult{Hash: hash, Data: data}) } // Feed the retrieved results back and queue new tasks if _, index, err := sched.Process(results); err != nil { t.Fatalf("failed to process result #%d: %v", index, err) } if index, err := sched.Commit(dstDb); err != nil { t.Fatalf("failed to commit data #%d: %v", index, err) } queue = make(map[common.Hash]struct{}) for _, hash := range sched.Missing(batch) { queue[hash] = struct{}{} } } // Cross check that the two states are in sync checkStateAccounts(t, dstDb, srcRoot, srcAccounts) } // Tests that the trie scheduler can correctly reconstruct the state even if only // partial results are returned (Even those randomly), others sent only later. func TestIterativeRandomDelayedStateSync(t *testing.T) { // Create a random state to copy srcDb, srcRoot, srcAccounts := makeTestState() // Create a destination state and sync with the scheduler dstDb := serodb.NewMemDatabase() sched := NewStateSync(srcRoot, dstDb) queue := make(map[common.Hash]struct{}) for _, hash := range sched.Missing(0) { queue[hash] = struct{}{} } for len(queue) > 0 { // Sync only half of the scheduled nodes, even those in random order results := make([]trie.SyncResult, 0, len(queue)/2+1) for hash := range queue { delete(queue, hash) data, err := srcDb.TrieDB().Node(hash) if err != nil { t.Fatalf("failed to retrieve node data for %x", hash) } results = append(results, trie.SyncResult{Hash: hash, Data: data}) //if len(results) >= cap(results) { // break //} } // Feed the retrieved results back and queue new tasks if _, index, err := sched.Process(results); err != nil { t.Fatalf("failed to process result #%d: %v", index, err) } if index, err := sched.Commit(dstDb); err != nil { t.Fatalf("failed to commit data #%d: %v", index, err) } for _, hash := range sched.Missing(0) { queue[hash] = struct{}{} } } // Cross check that the two states are in sync checkStateAccounts(t, dstDb, srcRoot, srcAccounts) } // Tests that at any point in time during a sync, only complete sub-tries are in // the database. func TestIncompleteStateSync(t *testing.T) { // Create a random state to copy srcDb, srcRoot, srcAccounts := makeTestState() checkTrieConsistency(srcDb.TrieDB().DiskDB().(serodb.Database), srcRoot) // Create a destination state and sync with the scheduler dstDb := serodb.NewMemDatabase() sched := NewStateSync(srcRoot, dstDb) added := []common.Hash{} queue := append([]common.Hash{}, sched.Missing(1)...) for len(queue) > 0 { // Fetch a batch of state nodes results := make([]trie.SyncResult, len(queue)) for i, hash := range queue { data, err := srcDb.TrieDB().Node(hash) if err != nil { t.Fatalf("failed to retrieve node data for %x", hash) } results[i] = trie.SyncResult{Hash: hash, Data: data} } // Process each of the state nodes if _, index, err := sched.Process(results); err != nil { t.Fatalf("failed to process result #%d: %v", index, err) } if index, err := sched.Commit(dstDb); err != nil { t.Fatalf("failed to commit data #%d: %v", index, err) } for _, result := range results { added = append(added, result.Hash) } // Check that all known sub-tries added so far are complete or missing entirely. checkSubtries: for _, hash := range added { for _, acc := range srcAccounts { if hash == crypto.Keccak256Hash(acc.code) { continue checkSubtries // skip trie check of code nodes. } } // Can't use checkStateConsistency here because subtrie keys may have odd // length and crash in LeafKey. if err := checkTrieConsistency(dstDb, hash); err != nil { t.Fatalf("state inconsistent: %v", err) } } // Fetch the next batch to retrieve queue = append(queue[:0], sched.Missing(1)...) } // Sanity check that removing any node from the database is detected for _, node := range added[1:] { key := node.Bytes() value, _ := dstDb.Get(key) dstDb.Delete(key) if err := checkStateConsistency(dstDb, added[0]); err == nil { t.Fatalf("trie inconsistency not caught, missing: %x", key) } dstDb.Put(key, value) } } ================================================ FILE: core/state_processor.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package core import ( "errors" "math/big" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-czero-import/seroparam" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/zero/stake" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-sero/zero/txs/stx" "github.com/sero-cash/go-sero/zero/utils" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/consensus" "github.com/sero-cash/go-sero/core/state" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/core/vm" "github.com/sero-cash/go-sero/crypto" "github.com/sero-cash/go-sero/params" ) // StateProcessor is a basic Processor, which takes care of transitioning // state from one point to another. // // StateProcessor implements Processor. type StateProcessor struct { config *params.ChainConfig // Chain configuration options bc *BlockChain // Canonical block chain engine consensus.Engine // Consensus engine used for block rewards } // NewStateProcessor initialises a new StateProcessor. func NewStateProcessor(config *params.ChainConfig, bc *BlockChain, engine consensus.Engine) *StateProcessor { return &StateProcessor{ config: config, bc: bc, engine: engine, } } // Process processes the state changes according to the Ethereum rules by running // the transaction messages using the statedb and applying any rewards to both // the processor (coinbase). // // Process returns the receipts and logs accumulated during the process and // returns the amount of gas that was used in the process. If any of the // transactions failed to execute due to insufficient gas it will return an error. func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg vm.Config) (types.Receipts, []*types.Log, uint64, error) { var ( receipts types.Receipts usedGas = new(uint64) header = block.Header() allLogs []*types.Log gp = new(GasPool).AddGas(block.GasLimit()) ) // Iterate over and process the individual transactions gasReward := uint64(0) for i, tx := range block.Transactions() { statedb.Prepare(tx.Hash(), block.Hash(), i) receipt, gas, err := ApplyTransaction(p.config, p.bc, nil, gp, statedb, header, tx, usedGas, cfg) if err != nil { return nil, nil, 0, err } gasReward += new(big.Int).Mul(new(big.Int).SetUint64(gas), tx.GasPrice()).Uint64() receipts = append(receipts, receipt) allLogs = append(allLogs, receipt.Logs...) } // Finalize the block, applying any consensus engine specific extras (e.g. block rewards) p.engine.Finalize(p.bc, header, statedb, block.Transactions(), receipts, gasReward) return receipts, allLogs, *usedGas, nil } // ApplyTransaction attempts to apply a transaction to the given state database // and uses the input parameters for its environment. It returns the receipt // for the transaction, gas used and an error if the transaction failed, // indicating the block was invalid. func ApplyTransaction(config *params.ChainConfig, bc ChainContext, author *common.Address, gp *GasPool, statedb *state.StateDB, header *types.Header, tx *types.Transaction, usedGas *uint64, cfg vm.Config) (*types.Receipt, uint64, error) { msg, err := tx.AsMessage() if err != nil { return nil, 0, err } err = statedb.NextZState().AddStx(tx.GetZZSTX()) if err != nil { return nil, 0, err } var poolId, shareId *common.Hash if header.Number.Uint64() >= seroparam.SIP4() { if poolId, shareId, err = applyStake(msg.From(), tx.GetZZSTX().Desc_Cmd, statedb, tx.Hash(), header.Number.Uint64()); err != nil { log.Info("applyStake", "error", err) return nil, 0, err } } if header.Number.Uint64() < seroparam.SIP4() || (tx.GetZZSTX().Desc_Cmd.Contract != nil) { key := header.Coinbase.ToCaddr() statedb.AddNonceAddress(key[:], header.Coinbase) } // Create a new context to be used in the EVM environment context := NewEVMContext(msg, header, bc, author) // Create a new environment which holds all relevant information // about the transaction and calling mechanisms. vmenv := vm.NewEVM(context, statedb, config, cfg) // Apply the transaction to the current state (included in the env) _, gas, failed, err := ApplyMessage(vmenv, msg, gp) if err != nil { gp.AddGas(gas) return nil, 0, err } root := statedb.IntermediateRoot(true).Bytes() *usedGas += gas // Create a new receipt for the transaction, storing the intermediate root and gas used by the tx // based on the eip phase, we're passing wether the root touch-delete accounts. receipt := types.NewReceipt(root, failed, *usedGas) receipt.TxHash = tx.Hash() receipt.GasUsed = gas // if the transaction created a contract, store the creation address in the receipt. if msg.To() == nil && len(msg.Data()) > 0 && !failed { receipt.ContractAddress = crypto.CreateAddress(vmenv.Context.Origin, statedb.GetContrctNonce(), msg.Data()[0:16]) } // Set the receipt logs and create a bloom for filtering receipt.Logs = statedb.GetLogs(tx.Hash()) receipt.Bloom = types.CreateBloom(types.Receipts{receipt}) receipt.PoolId = poolId receipt.ShareId = shareId return receipt, gas, err } func applyStake(from common.Address, stakeDesc stx.DescCmd, statedb *state.StateDB, txHash common.Hash, number uint64) (poolId *common.Hash, shareId *common.Hash, err error) { stakeState := stake.NewStakeState(statedb) pkr := *from.ToPKr() if stakeDesc.BuyShare != nil { var stakePool *stake.StakePool if stakeDesc.BuyShare.Pool != nil { stakePoolId := common.BytesToHash(stakeDesc.BuyShare.Pool[:]) stakePool = stakeState.GetStakePool(stakePoolId) if stakePool == nil || stakePool.Closed { err = errors.New("pool not exist or pool is closed") return } } value := stakeDesc.BuyShare.Value.ToInt() num, avgPrice, _ := stakeState.CaleAvgPrice(value) if num > 0 { var amount *big.Int if num > 1000 { num = 1000 amount = stakeState.SumAmount(1000) avgPrice = big.NewInt(0).Div(amount, big.NewInt(1000)) amount = new(big.Int).Mul(avgPrice, big.NewInt(1000)) } else { amount = new(big.Int).Mul(avgPrice, big.NewInt(int64(num))) } refund := new(big.Int).Sub(new(big.Int).Set(stakeDesc.BuyShare.Value.ToInt()), amount) if refund.Sign() > 0 { asset := assets.Asset{Tkn: &assets.Token{ Currency: *common.BytesToHash(common.LeftPadBytes([]byte("SERO"), 32)).HashToUint256(), Value: utils.U256(*refund), }, } statedb.NextZState().AddTxOut(from, asset, txHash) } share := &stake.Share{PKr: pkr, VotePKr: stakeDesc.BuyShare.Vote, Value: avgPrice, TransactionHash: txHash, BlockNumber: number, InitNum: num} if stakePool != nil { hash := common.BytesToHash(stakePool.Id()) share.PoolId = &hash share.Fee = stakePool.Fee } id := common.BytesToHash(share.Id()) shareId = &id stakeState.AddPendingShare(share) } else { asset := assets.Asset{Tkn: &assets.Token{ Currency: *common.BytesToHash(common.LeftPadBytes([]byte("SERO"), 32)).HashToUint256(), Value: stakeDesc.BuyShare.Value, }, } statedb.NextZState().AddTxOut(from, asset, txHash) } } else if stakeDesc.RegistPool != nil { id := crypto.Keccak256Hash(pkr[:]) poolId = &id stakePool := stakeState.GetStakePool(id) if stakePool != nil { if stakePool.Closed { err = errors.New("pool is closed") return } if stakeDesc.RegistPool.Value.ToInt().Sign() > 0 { asset := assets.Asset{Tkn: &assets.Token{ Currency: *common.BytesToHash(common.LeftPadBytes([]byte("SERO"), 32)).HashToUint256(), Value: stakeDesc.RegistPool.Value, }, } statedb.NextZState().AddTxOut(from, asset, txHash) } stakePool.Fee = uint16(stakeDesc.RegistPool.FeeRate) stakePool.VotePKr = stakeDesc.RegistPool.Vote stakeState.AddStakePool(stakePool) return } else { cmd := stakeDesc.RegistPool if stake.GetPoolValueThreshold().Cmp(stakeDesc.RegistPool.Value.ToInt()) != 0 || cmd.Vote == (c_type.PKr{}) { err = errors.New("args error") return } pool := &stake.StakePool{PKr: pkr, Amount: cmd.Value.ToInt(), VotePKr: cmd.Vote, TransactionHash: txHash, Fee: uint16(cmd.FeeRate), BlockNumber: number, Income: big.NewInt(0)} stakeState.AddStakePool(pool) } } else if stakeDesc.ClosePool != nil { id := crypto.Keccak256Hash(pkr[:]) poolId = &id stakePool := stakeState.GetStakePool(id) if stakePool == nil { err = errors.New("pool not exist") return } if stakePool.BlockNumber+stake.GetLockingBlockNum() > number { err = errors.New("pool locking in") return } if stakePool.Closed { err = errors.New("pool is closed") return } stakePool.Closed = true if stakePool.Closed && stakePool.CurrentShareNum == 0 && stakePool.WishVoteNum == 0 { asset := assets.Asset{Tkn: &assets.Token{ Currency: *common.BytesToHash(common.LeftPadBytes([]byte("SERO"), 32)).HashToUint256(), Value: utils.U256(*stakePool.Amount), }, } statedb.NextZState().AddTxOut(from, asset, txHash) stakePool.Amount = new(big.Int) } stakeState.AddStakePool(stakePool) } return } ================================================ FILE: core/state_transition.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package core import ( "errors" "math" "math/big" "strings" "github.com/sero-cash/go-czero-import/seroparam" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-sero/zero/utils" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core/vm" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/params" ) var ( errInsufficientBalanceForGas = errors.New("insufficient balance to pay for gas") ) type StateTransition struct { gp *GasPool msg Message gas uint64 gasPrice *big.Int initialGas uint64 asset *assets.Asset data []byte state vm.StateDB evm *vm.EVM } // Message represents a message sent to a contract. type Message interface { From() common.Address To() *common.Address GasPrice() *big.Int Asset() *assets.Asset //Nonce() uint64 Fee() assets.Token Data() []byte TxHash() common.Hash } // IntrinsicGas computes the 'intrinsic gas' for a message with the given data. func IntrinsicGas(data []byte, contractCreation bool) (uint64, error) { // Set the starting gas for the raw transaction var gas uint64 if contractCreation && len(data) > 0 { gas = params.TxGasContractCreation } else { gas = params.TxGas } //Bump the required gas by the amount of transactional data if len(data) > 0 { // Zero and non-zero bytes are priced differently var nz uint64 for _, byt := range data { if byt != 0 { nz++ } } // Make sure we don't exceed uint64 for all data combinations if (math.MaxUint64-gas)/params.TxDataNonZeroGas < nz { return 0, vm.ErrOutOfGas } gas += nz * params.TxDataNonZeroGas z := uint64(len(data)) - nz if (math.MaxUint64-gas)/params.TxDataZeroGas < z { return 0, vm.ErrOutOfGas } gas += z * params.TxDataZeroGas } return gas, nil } // NewStateTransition initialises and returns a new state transition object. func NewStateTransition(evm *vm.EVM, msg Message, gp *GasPool) *StateTransition { return &StateTransition{ gp: gp, evm: evm, msg: msg, gasPrice: msg.GasPrice(), asset: msg.Asset(), data: msg.Data(), state: evm.StateDB, } } // ApplyMessage computes the new state by applying the given message // against the old state within the environment. // // ApplyMessage returns the bytes returned by any EVM execution (if it took place), // the gas used (which includes gas refunds) and an error if it failed. An error always // indicates a core error meaning that the message would always fail for that particular // state and would never be accepted within a block. func ApplyMessage(evm *vm.EVM, msg Message, gp *GasPool) ([]byte, uint64, bool, error) { return NewStateTransition(evm, msg, gp).TransitionDb() } // to returns the recipient of the message. func (st *StateTransition) to() common.Address { if st.msg == nil || st.msg.To() == nil /* contract creation */ { return common.Address{} } return *st.msg.To() } func (st *StateTransition) useGas(amount uint64) error { if st.gas < amount { return vm.ErrOutOfGas } st.gas -= amount return nil } func (st *StateTransition) preCheck() error { curency := strings.ToUpper(common.BytesToString((st.msg.Fee().Currency).NewRef()[:])) gas := uint64(0) if curency != "SERO" { to := st.msg.To() tokens, tas := st.state.GetTokenRate(*to, curency) if tokens.Sign() == 0 || tas.Sign() == 0 { return errInsufficientBalanceForGas } taval := new(big.Int).Div(new(big.Int).Mul(st.msg.Fee().Value.ToRef().ToIntRef(), tas), tokens) if st.state.GetBalance(*to, "SERO").Cmp(taval) < 0 { return errInsufficientBalanceForGas } st.state.AddBalance(*to, curency, st.msg.Fee().Value.ToRef().ToRef().ToIntRef()) st.state.SubBalance(*to, "SERO", taval) gas = new(big.Int).Div(taval, st.msg.GasPrice()).Uint64() } else { gas = new(big.Int).Div(st.msg.Fee().Value.ToRef().ToIntRef(), st.msg.GasPrice()).Uint64() } if err := st.gp.SubGas(gas); err != nil { return err } st.gas += gas st.initialGas = gas return nil } // TransitionDb will transition the state by applying the current message and // returning the result including the used gas. It returns an error if failed. // An error indicates a consensus issue. func (st *StateTransition) TransitionDb() (ret []byte, usedGas uint64, failed bool, err error) { if err = st.preCheck(); err != nil { log.Debug("TransitionDb", "preCheck err", err) return } msg := st.msg sender := vm.AccountRef(msg.From()) contractCreation := msg.To() == nil && len(st.data) > 0 // Pay intrinsic gas gas, err := IntrinsicGas(st.data, contractCreation) if err != nil { return nil, 0, false, err } if err = st.useGas(gas); err != nil { return nil, 0, false, err } var ( evm = st.evm // vm errors do not effect consensus and are therefor // not assigned to err, except for insufficient balance // error. vmerr error ) if contractCreation { ret, _, st.gas, vmerr = evm.Create(sender, st.data, st.gas, msg.Asset()) } else { to := msg.To() if evm.BlockNumber.Uint64() < seroparam.SIP4() || (to != nil && st.state.IsContract(*to)) { ret, st.gas, vmerr, _ = evm.Call(sender, st.to(), st.data, st.gas, msg.Asset()) } } if vmerr != nil { log.Debug("VM returned with error", "err", vmerr) // The only possible consensus-error would be if there wasn't // sufficient balance to make the transfer happen. The first // balance transfer may never fail. if vmerr == vm.ErrInsufficientBalance { return nil, 0, false, vmerr } if msg.Asset() != nil { st.state.NextZState().AddTxOut(msg.From(), *msg.Asset(), msg.TxHash()) } } st.refundGas() //asset := assets.Asset{Tkn: &assets.Token{ // Currency: *common.BytesToHash(common.LeftPadBytes([]byte("SERO"), 32)).HashToUint256(), // Value: utils.U256(*new(big.Int).Mul(new(big.Int).SetUint64(st.gasUsed()), st.gasPrice)), //}, //} //st.state.GetZState().AddTxOut(st.evm.Coinbase, asset) return ret, st.gasUsed(), vmerr != nil, err } func (st *StateTransition) refundGas() { // Apply refund counter, capped to half of the used gas. refund := st.gasUsed() / 2 if refund > st.state.GetRefund() { refund = st.state.GetRefund() } st.gas += refund // Return SERO for remaining gas, exchanged at the original rate. remaining := new(big.Int).Mul(new(big.Int).SetUint64(st.gas), st.gasPrice) if remaining.Sign() > 0 { curency := strings.ToUpper(common.BytesToString(st.msg.Fee().Currency.NewRef()[:])) if curency != "SERO" { st.state.AddBalance(*st.msg.To(), "SERO", remaining) tokes, tas := st.state.GetTokenRate(*st.msg.To(), curency) if tokes.Sign() != 0 && tas.Sign() != 0 { remainToken := new(big.Int).Div(new(big.Int).Mul(remaining, tokes), tas) asset := assets.Asset{Tkn: &assets.Token{ Currency: *common.BytesToHash(common.LeftPadBytes([]byte(curency), 32)).HashToUint256(), Value: utils.U256(*remainToken), }, } st.state.NextZState().AddTxOut(st.msg.From(), asset, st.msg.TxHash()) st.state.SubBalance(*st.msg.To(), curency, remainToken) } } else { asset := assets.Asset{Tkn: &assets.Token{ Currency: *common.BytesToHash(common.LeftPadBytes([]byte("SERO"), 32)).HashToUint256(), Value: utils.U256(*remaining), }, } st.state.NextZState().AddTxOut(st.msg.From(), asset, st.msg.TxHash()) } } // Also return remaining gas to the block gas counter so it is // available for the next transaction. st.gp.AddGas(st.gas) } // gasUsed returns the amount of gas used up by the state transition. func (st *StateTransition) gasUsed() uint64 { return st.initialGas - st.gas } ================================================ FILE: core/tx_checker.go ================================================ // Copyright 2018 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package core import ( "runtime" "github.com/sero-cash/go-sero/zero/txtool/verify" "github.com/sero-cash/go-sero/core/types" ) type CheckDesc struct { tx *types.Transaction block *types.Block hasReceptions bool } func NewTxChecker(bc *BlockChain, chain types.Blocks) (chan<- struct{}, <-chan error) { txs := []CheckDesc{} for _, block := range chain { rpts := bc.GetReceiptsByHash(block.Hash()) for _, tx := range block.Transactions() { cd := CheckDesc{} cd.tx = tx cd.block = block if len(rpts) > 0 { cd.hasReceptions = true } txs = append(txs, cd) } } if len(txs) == 0 { return make(chan struct{}), nil } // Spawn as many workers as allowed threads workers := runtime.GOMAXPROCS(0) if len(txs) < workers { workers = len(txs) } // Create a task channel and spawn the verifiers var ( inputs = make(chan int) done = make(chan int, workers) errors = make([]error, len(txs)) abort = make(chan struct{}) ) for i := 0; i < workers; i++ { go func() { for index := range inputs { tx := txs[index] if tx.hasReceptions { errors[index] = nil } else { errors[index] = verify.VerifyWithoutState(tx.tx.Ehash().NewRef(), tx.tx.GetZZSTX(), tx.block.NumberU64()) } done <- index } }() } errorsOut := make(chan error, len(txs)) go func() { defer close(inputs) var ( in, out = 0, 0 checked = make([]bool, len(txs)) inputs = inputs ) for { select { case inputs <- in: if in++; in == len(txs) { // Reached end of headers. Stop sending to workers. inputs = nil } case index := <-done: for checked[index] = true; checked[out]; out++ { errorsOut <- errors[out] if out == len(txs)-1 { return } } case <-abort: return } } }() return abort, errorsOut } ================================================ FILE: core/tx_journal.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package core import ( "errors" "io" "os" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/rlp" ) // errNoActiveJournal is returned if a transaction is attempted to be inserted // into the journal, but no such file is currently open. var errNoActiveJournal = errors.New("no active journal") // devNull is a WriteCloser that just discards anything written into it. Its // goal is to allow the transaction journal to write into a fake journal when // loading transactions on startup without printing warnings due to no file // being readt for write. type devNull struct{} func (*devNull) Write(p []byte) (n int, err error) { return len(p), nil } func (*devNull) Close() error { return nil } // txJournal is a rotating log of transactions with the aim of storing locally // created transactions to allow non-executed ones to survive node restarts. type txJournal struct { path string // Filesystem path to store the transactions at writer io.WriteCloser // Output stream to write new transactions into } // newTxJournal creates a new transaction journal to func newTxJournal(path string) *txJournal { return &txJournal{ path: path, } } // load parses a transaction journal dump from disk, loading its contents into // the specified pool. func (journal *txJournal) load(add func([]*types.Transaction) []error) error { // Skip the parsing if the journal file doens't exist at all if _, err := os.Stat(journal.path); os.IsNotExist(err) { return nil } // Open the journal for loading any past transactions input, err := os.Open(journal.path) if err != nil { return err } defer input.Close() // Temporarily discard any journal additions (don't double add on load) journal.writer = new(devNull) defer func() { journal.writer = nil }() // Inject all transactions from the journal into the pool stream := rlp.NewStream(input, 0) total, dropped := 0, 0 // Create a method to load a limited batch of transactions and bump the // appropriate progress counters. Then use this method to load all the // journalled transactions in small-ish batches. loadBatch := func(txs types.Transactions) { for _, err := range add(txs) { if err != nil { log.Debug("Failed to add journaled transaction", "err", err) dropped++ } } } var ( failure error batch types.Transactions ) for { // Parse the next transaction and terminate on error tx := new(types.Transaction) if err = stream.Decode(tx); err != nil { if err != io.EOF { failure = err } if batch.Len() > 0 { loadBatch(batch) } break } // New transaction parsed, queue up for later, import if threnshold is reached total++ if batch = append(batch, tx); batch.Len() > 1024 { loadBatch(batch) batch = batch[:0] } } log.Info("Loaded local transaction journal", "transactions", total, "dropped", dropped) return failure } // insert adds the specified transaction to the local disk journal. func (journal *txJournal) insert(tx *types.Transaction) error { if journal.writer == nil { return errNoActiveJournal } if err := rlp.Encode(journal.writer, tx); err != nil { return err } return nil } // rotate regenerates the transaction journal based on the current contents of // the transaction pool. func (journal *txJournal) rotate() error { // Close the current journal (if any is open) if journal.writer != nil { if err := journal.writer.Close(); err != nil { return err } journal.writer = nil } // Generate a new journal with the contents of the current pool replacement, err := os.OpenFile(journal.path+".new", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) if err != nil { return err } replacement.Close() // Replace the live journal with the newly generated one if err = os.Rename(journal.path+".new", journal.path); err != nil { return err } sink, err := os.OpenFile(journal.path, os.O_WRONLY|os.O_APPEND, 0600) if err != nil { return err } journal.writer = sink log.Info("Regenerated local transaction journal", "transactions", "accounts") return nil } // close flushes the transaction journal contents to disk and closes the file. func (journal *txJournal) close() error { var err error if journal.writer != nil { err = journal.writer.Close() journal.writer = nil } return err } ================================================ FILE: core/tx_list.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package core import ( "container/heap" "math/big" "time" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/log" ) // priceHeap is a heap.Interface implementation over transactions for retrieving // priced-sorted transactions to discard when the pool fills up. type priceHeap []*types.Transaction func (h priceHeap) Len() int { return len(h) } func (h priceHeap) Swap(i, j int) { if i < 0 || j < 0 { return } h[i], h[j] = h[j], h[i] } func (h priceHeap) Less(i, j int) bool { // Sort primarily by priced, returning the cheaper one switch h[i].GasPrice().Cmp(h[j].GasPrice()) { case -1: return true case 1: return false } // If the prices match, stabilize via nonces (high nonce is worse) return false } func (h *priceHeap) Push(x interface{}) { *h = append(*h, x.(*types.Transaction)) } func (h *priceHeap) Pop() interface{} { if h.Len() < 1 { return nil } old := *h n := len(old) x := old[n-1] *h = old[0 : n-1] return x } // txPricedList is a priced-sorted heap to allow operating on transactions pool // contents in a priced-incrementing way. type txPricedList struct { all *txLookup // Pointer to the map of all transactions items *priceHeap // Heap of prices of all the stored transactions stales int // Number of stale priced points to (re-heap trigger) } // newTxPricedList creates a new priced-sorted transaction heap. func newTxPricedList(all *txLookup) *txPricedList { return &txPricedList{ all: all, items: new(priceHeap), } } func (l *txPricedList) Get(hash common.Hash) *types.Transaction { return l.all.Get(hash) } func (l *txPricedList) Add(tx *types.Transaction, threshold *big.Int) bool { if tx.GasPrice().Cmp(threshold) < 0 { return false } if t := l.all.Get(tx.Hash()); t == nil { heap.Push(l.items, tx) } l.all.Add(tx) return true } func (l *txPricedList) Flatten() types.Transactions { txs := types.Transactions{} for _, i := range *l.items { txs = append(txs, i) } return txs } func (l *txPricedList) Ready() types.Transactions { // Otherwise start accumulating incremental transactions var ready types.Transactions if l.items == nil { return ready } for t := heap.Pop(l.items); t != nil; t = heap.Pop(l.items) { tx := t.((*types.Transaction)) ready = append(ready, tx) l.all.Remove(tx.Hash()) } return ready } func (l *txPricedList) Len() int { return l.items.Len() } func (l *txPricedList) Remove(tx *types.Transaction) bool { // Remove the transaction from the set if l.all.Get(tx.Hash()) == nil { return false } l.all.Remove(tx.Hash()) for i, item := range *l.items { if item.Hash() == tx.Hash() { heap.Remove(l.items, i) return true } } return false } // Underpriced checks whether a transaction is cheaper than (or as cheap as) the // lowest priced transaction currently being tracked. func (l *txPricedList) Underpriced(tx *types.Transaction) bool { // Discard stale priced points if found at the heap start for len(*l.items) > 0 { head := []*types.Transaction(*l.items)[0] if l.all.Get(head.Hash()) == nil { l.stales-- heap.Pop(l.items) continue } break } // Check if the transaction is underpriced or not if len(*l.items) == 0 { log.Error("Pricing query for empty pool") // This cannot happen, print to catch programming errors return false } cheapest := []*types.Transaction(*l.items)[0] return cheapest.GasPrice().Cmp(tx.GasPrice()) >= 0 } // Discard finds a number of most underpriced transactions, removes them from the // priced list and returns them for further removal from the entire pool. func (l *txPricedList) Discard(count int) types.Transactions { drop := make(types.Transactions, 0, count) // Remote underpriced transactions to drop for len(*l.items) > 0 && count > 0 { // Discard stale transactions if found during cleanup tx := heap.Pop(l.items).(*types.Transaction) if l.all.Get(tx.Hash()) == nil { l.stales-- continue } l.all.Remove(tx.Hash()) drop = append(drop, tx) count-- } return drop } func (l *txPricedList) RemoveWithPrice(threshold *big.Int) { for len(*l.items) > 0 { head := []*types.Transaction(*l.items)[0] if head.GasPrice().Cmp(threshold) >= 0 { break } else { heap.Pop(l.items) if l.all.Get(head.Hash()) == nil { l.stales-- continue } l.all.Remove(head.Hash()) } } } type hashTime map[common.Hash]time.Time func (l hashTime) Flatten() hashTime { result := make(map[common.Hash]time.Time) for k, v := range l { result[k] = v } return result } ================================================ FILE: core/tx_pool.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package core import ( "errors" "fmt" "math" "math/big" "runtime/debug" "strings" "sync" "sync/atomic" "time" "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-sero/zero/txs/stx/stx_v0" "github.com/sero-cash/go-sero/zero/localdb" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/txtool" "github.com/sero-cash/go-sero/crypto" "github.com/sero-cash/go-sero/zero/stake" "github.com/sero-cash/go-sero/zero/txs/stx" "github.com/sero-cash/go-sero/zero/txtool/verify" "github.com/sero-cash/go-czero-import/seroparam" "github.com/sero-cash/go-czero-import/superzk" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core/state" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/event" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/metrics" "github.com/sero-cash/go-sero/params" ) const ( // chainHeadChanSize is the size of channel listening to ChainHeadEvent. chainHeadChanSize = 10 ) var ( ErrVerifyError = errors.New("stx Verify error") // ErrUnderpriced is returned if a transaction's gas priced is below the minimum // configured for the transaction pool. ErrUnderpriced = errors.New("transaction underpriced") // ErrIntrinsicGas is returned if the transaction is specified to use less gas // than required to start the invocation. ErrIntrinsicGas = errors.New("intrinsic gas too low") // ErrGasLimit is returned if a transaction's requested gas limit exceeds the // maximum allowance of the current block. ErrGasLimit = errors.New("exceeds block gas limit") // ErrOversizedData is returned if the input data of a transaction is greater // than some meaningful limit a user might use. This is not a consensus error // making the transaction invalid, rather a DOS protection. ErrOversizedData = errors.New("oversized data") ErrCurrencyError = errors.New("currency error") ) var ( evictionInterval = 5 * time.Minute // Time interval to check for evictable transactions statsReportInterval = 8 * time.Second // Time interval to report transaction pool stats ) var ( // General tx metrics invalidTxCounter = metrics.NewRegisteredCounter("txpool/invalid", nil) underpricedTxCounter = metrics.NewRegisteredCounter("txpool/underpriced", nil) ) // TxStatus is the current status of a transaction as seen by the pool. type TxStatus uint const ( TxStatusUnknown TxStatus = iota TxStatusQueued TxStatusPending ) // blockChain provides the state of blockchain and current gas limit to do // some pre checks in tx pool and event subscribers. type blockChain interface { CurrentBlock() *types.Block GetBlock(hash common.Hash, number uint64) *types.Block StateAt(header *types.Header) (*state.StateDB, error) SubscribeChainHeadEvent(ch chan<- ChainHeadEvent) event.Subscription } // TxPoolConfig are the configuration parameters of the transaction pool. type TxPoolConfig struct { NoLocals bool // Whether local transaction handling should be disabled PriceLimit uint64 // Minimum gas priced to enforce for acceptance into the pool AccountSlots uint64 // Number of executable transaction slots guaranteed per account GlobalSlots uint64 // Maximum number of executable transaction slots for all accounts AccountQueue uint64 // Maximum number of non-executable transaction slots permitted per account GlobalQueue uint64 // Maximum number of non-executable transaction slots for all accounts Lifetime time.Duration // Maximum amount of time non-executable transaction are queued StartLight bool } // DefaultTxPoolConfig contains the default configurations for the transaction // pool. var DefaultTxPoolConfig = TxPoolConfig{ PriceLimit: params.Gta, AccountSlots: 16, GlobalSlots: 2048, AccountQueue: 64, GlobalQueue: 32, Lifetime: 3 * time.Hour, } // sanitize checks the provided user configurations and changes anything that's // unreasonable or unworkable. func (config *TxPoolConfig) sanitize() TxPoolConfig { conf := *config if conf.PriceLimit < 1 { log.Warn("Sanitizing invalid txpool priced limit", "provided", conf.PriceLimit, "updated", DefaultTxPoolConfig.PriceLimit) conf.PriceLimit = DefaultTxPoolConfig.PriceLimit } return conf } func TxToOut(tx types.Transaction) (result []txtool.Out, txHash c_type.Uint256) { txCommonHash := tx.Hash() copy(txHash[:], txCommonHash[:]) ztxs := tx.GetZZSTX() if ztxs != nil { tx1 := tx.GetZZSTX().Tx1 for index := range tx1.Outs_P { out := txtool.Out{} rootState := localdb.RootState{} os := localdb.OutState{} out_p := &tx1.Outs_P[index] if c_superzk.IsSzkPKr(&tx1.Outs_P[index].PKr) { os.Out_P = out_p os.GenRootCM() } else { os.Out_O = &stx_v0.Out_O{ Addr: out_p.PKr, Asset: out_p.Asset, Memo: out_p.Memo, } os.GenRootCM() } rootState.OS = os rootState.TxHash = txHash out.State = rootState result = append(result, out) } for index := range tx1.Outs_C { out := txtool.Out{} rootState := localdb.RootState{} os := localdb.OutState{} os.Out_C = &tx1.Outs_C[index] os.GenRootCM() rootState.OS = os rootState.TxHash = txHash out.State = rootState result = append(result, out) } } return } type PKrTxOuts map[c_type.PKr]map[c_type.Uint256]*TxOutInfo func (p PKrTxOuts) AddPendingTxOut(tx types.Transaction) { txOuts, _ := TxToOut(tx) nowUnix := uint64(time.Now().Unix()) for index := range txOuts { p.AddOut(tx.From(), tx.Gas(), tx.Gas(), tx.GasPrice(), 0, common.Hash{}, nowUnix, txOuts[index]) } } func (p PKrTxOuts) AddImmatureTxOut(tx types.Transaction, blockNumber uint64, blockHash common.Hash, time uint64) { txOuts, _ := TxToOut(tx) for index := range txOuts { p.AddOut(tx.From(), tx.Gas(), tx.Gas(), tx.GasPrice(), blockNumber, blockHash, time, txOuts[index]) } } func (p PKrTxOuts) AddOut( from common.Address, gas uint64, gasUsed uint64, gasPrice *big.Int, blockNumber uint64, blockHash common.Hash, time uint64, out txtool.Out) { pkr := out.State.OS.ToPKr() txHash := out.State.TxHash if pkr != nil { if _, ok := p[*pkr]; ok { if _, ok := p[*pkr][txHash]; ok { p[*pkr][txHash].addOut(txHash, from, gas, gasUsed, gasPrice, blockNumber, blockHash, time, out) } else { txOutInfo := &TxOutInfo{OutExists: map[c_type.Uint256]bool{}} txOutInfo.addOut(txHash, from, gas, gasUsed, gasPrice, blockNumber, blockHash, time, out) p[*pkr][txHash] = txOutInfo } } else { txOutInfo := &TxOutInfo{OutExists: map[c_type.Uint256]bool{}} txOutInfo.addOut(txHash, from, gas, gasUsed, gasPrice, blockNumber, blockHash, time, out) txOutMap := make(map[c_type.Uint256]*TxOutInfo) txOutMap[txHash] = txOutInfo p[*pkr] = txOutMap } } } func (p PKrTxOuts) delPendintTxOut(tx types.Transaction) { txOuts, txHash := TxToOut(tx) for index := range txOuts { out := txOuts[index] pkr := out.State.OS.ToPKr() if pkr != nil { delete(p[*pkr], txHash) if len(p[*pkr]) == 0 { delete(p, *pkr) } } } } func (p PKrTxOuts) delPkrTxOut(pkr c_type.PKr, txHash c_type.Uint256) { delete(p[pkr], txHash) if len(p[pkr]) == 0 { delete(p, pkr) } } type TxOutInfo struct { TxHash c_type.Uint256 BlockNumber uint64 BlockHash common.Hash GasUsed uint64 Gas uint64 GasPrice *big.Int From common.Address Time uint64 Outs []txtool.Out OutExists map[c_type.Uint256]bool } func (t *TxOutInfo) addOut(txHash c_type.Uint256, from common.Address, gas, gasUsed uint64, gasPrice *big.Int, blockNumber uint64, blockHash common.Hash, time uint64, out txtool.Out) { t.TxHash = txHash t.BlockNumber = blockNumber t.BlockHash = blockHash t.Gas = gas t.GasUsed = gasUsed t.GasPrice = gasPrice t.From = from t.Time = time var existsKey c_type.Uint256 if out.State.OS.Out_O != nil { existsKey = out.State.OS.Out_O.ToHash() } if out.State.OS.Out_P != nil { existsKey = out.State.OS.Out_P.ToHash() } if out.State.OS.Out_C != nil { existsKey = out.State.OS.Out_C.Tx1_Hash() } if _, ok := t.OutExists[existsKey]; !ok { t.Outs = append(t.Outs, out) t.OutExists[existsKey] = true } } // TxPool contains all currently known transactions. Transactions // enter the pool when they are received from the network or submitted // locally. They exit the pool when they are included in the blockchain. // // The pool separates processable transactions (which can be applied to the // current state) and future transactions. Transactions move between those // two states over time as they are received and processed. type TxPool struct { config TxPoolConfig chainconfig *params.ChainConfig chain blockChain gasPrice *big.Int txFeed event.Feed scope event.SubscriptionScope chainHeadCh chan ChainHeadEvent chainHeadSub event.Subscription //abi types.Signer mu sync.RWMutex currentState *state.StateDB // Current state in the blockchain head pendingState *state.ManagedState // Pending state tracking virtual nonces currentMaxGas uint64 // Current gas limit for transaction caps //locals *accountSet // Set of local transaction to exempt from eviction rules //journal *txJournal // Journal of local transaction to back up to disk all *txLookup // All transactions to allow lookups priced *txPricedList // All transactions sorted by priced newQueue *txPricedList newPending *txPricedList beats hashTime faileds hashTime wg sync.WaitGroup // for shutdown sync pkrTxOuts PKrTxOuts homestead bool mining int32 } // NewTxPool creates a new transaction pool to gather, sort and filter inbound // transactions from the network. func NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, chain blockChain) *TxPool { // Sanitize the input to ensure no vulnerable gas prices are set config = (&config).sanitize() // Create the transaction pool with its initial settings pool := &TxPool{ config: config, chainconfig: chainconfig, chain: chain, beats: make(map[common.Hash]time.Time), faileds: make(map[common.Hash]time.Time), all: newTxLookup(), chainHeadCh: make(chan ChainHeadEvent, chainHeadChanSize), gasPrice: new(big.Int).SetUint64(config.PriceLimit), } pool.pkrTxOuts = make(map[c_type.PKr]map[c_type.Uint256]*TxOutInfo) //pool.locals = newAccountSet() pool.priced = newTxPricedList(pool.all) pool.newQueue = newTxPricedList(newTxLookup()) pool.newPending = newTxPricedList(newTxLookup()) pool.reset(nil, chain.CurrentBlock().Header()) // Subscribe events from blockchain pool.chainHeadSub = pool.chain.SubscribeChainHeadEvent(pool.chainHeadCh) // Start the event loop and return pool.wg.Add(1) go pool.loop() return pool } func (pool *TxPool) SetMining(m int32) { atomic.StoreInt32(&pool.mining, m) } func (pool *TxPool) Mining() bool { return atomic.LoadInt32(&pool.mining) > 0 } // loop is the transaction pool's main event loop, waiting for and reacting to // outside blockchain events as well as for various reporting and transaction // eviction events. func (pool *TxPool) loop() { defer pool.wg.Done() // Start the stats reporting and transaction eviction tickers //var prevPending, prevQueued, prevStales int report := time.NewTicker(statsReportInterval) defer report.Stop() evict := time.NewTicker(evictionInterval) defer evict.Stop() // Track the previous head headers for transaction reorgs head := pool.chain.CurrentBlock() // Keep waiting for and reacting to the various events for { select { // Handle ChainHeadEvent case ev := <-pool.chainHeadCh: if ev.Block != nil { pool.mu.Lock() pool.reset(head.Header(), ev.Block.Header()) head = ev.Block pool.mu.Unlock() } // Be unsubscribed due to system stopped case <-pool.chainHeadSub.Err(): return // Handle stats reporting ticks case <-report.C: log.Debug("Transaction pool status report", "queued", pool.all.Count()) case <-evict.C: drop := types.Transactions{} pool.mu.RLock() pendingTxs := pool.newPending.Flatten() queuedTxs := pool.newQueue.Flatten() beats := pool.beats.Flatten() faileds := pool.faileds.Flatten() pool.mu.RUnlock() dropFaileds := []common.Hash{} for k, v := range faileds { if time.Since(v) > pool.config.Lifetime { dropFaileds = append(dropFaileds, k) } } for _, tx := range pendingTxs { if err := pool.validateTx(tx, false); err != nil { drop = append(drop, tx) } else { if t, ok := beats[tx.Hash()]; ok && time.Since(t) > pool.config.Lifetime { drop = append(drop, tx) } } } for _, tx := range queuedTxs { if err := pool.validateTx(tx, false); err != nil { drop = append(drop, tx) } } pool.mu.Lock() for _, tx := range drop { pool.faileds[tx.Hash()] = time.Now() pool.removeAllTx(tx.Hash()) if pool.canAddPkrTx() { pool.pkrTxOuts.delPendintTxOut(*tx) } } for _, h := range dropFaileds { delete(pool.faileds, h) } pool.mu.Unlock() } } } func (pool *TxPool) RemoveTxs(txs types.Transactions) { pool.mu.Lock() defer pool.mu.Unlock() for _, tx := range txs { pool.removeAllTx(tx.Hash()) } } // lockedReset is a wrapper around reset to allow calling it in a thread safe // manner. This method is only ever used in the tester! func (pool *TxPool) lockedReset(oldHead, newHead *types.Header) { pool.mu.Lock() defer pool.mu.Unlock() pool.reset(oldHead, newHead) } func (pool *TxPool) canAddPkrTx() bool { difference := time.Now().Unix() - pool.chain.CurrentBlock().Time().Int64() if difference > 10*60 { return false } return pool.config.StartLight } // reset retrieves the current state of the blockchain and ensures the content // of the transaction pool is valid with regard to the chain state. func (pool *TxPool) reset(oldHead, newHead *types.Header) { // If we're reorging an old state, reinject all dropped transactions var reinject types.Transactions // Reorg seems shallow enough to pull in all transactions into memory var discarded, included types.Transactions if oldHead != nil && oldHead.Hash() != newHead.ParentHash { // If the reorg is too deep, avoid doing it (will happen during fast sync) oldNum := oldHead.Number.Uint64() newNum := newHead.Number.Uint64() if depth := uint64(math.Abs(float64(oldNum) - float64(newNum))); depth > 64 { log.Debug("Skipping deep transaction reorg", "depth", depth) } else { var ( rem = pool.chain.GetBlock(oldHead.Hash(), oldHead.Number.Uint64()) add = pool.chain.GetBlock(newHead.Hash(), newHead.Number.Uint64()) ) for rem.NumberU64() > add.NumberU64() { discarded = append(discarded, rem.Transactions()...) if rem = pool.chain.GetBlock(rem.ParentHash(), rem.NumberU64()-1); rem == nil { log.Error("Unrooted old chain seen by tx pool", "block", oldHead.Number, "hash", oldHead.Hash()) return } } for add.NumberU64() > rem.NumberU64() { included = append(included, add.Transactions()...) if pool.canAddPkrTx() { for _, tx := range add.Transactions() { pool.pkrTxOuts.AddImmatureTxOut(*tx, add.Number().Uint64(), add.Hash(), add.Time().Uint64()) } } if add = pool.chain.GetBlock(add.ParentHash(), add.NumberU64()-1); add == nil { log.Error("Unrooted new chain seen by tx pool", "block", newHead.Number, "hash", newHead.Hash()) return } } for rem.Hash() != add.Hash() { discarded = append(discarded, rem.Transactions()...) if rem = pool.chain.GetBlock(rem.ParentHash(), rem.NumberU64()-1); rem == nil { log.Error("Unrooted old chain seen by tx pool", "block", oldHead.Number, "hash", oldHead.Hash()) return } included = append(included, add.Transactions()...) if pool.canAddPkrTx() { for _, tx := range add.Transactions() { pool.pkrTxOuts.AddImmatureTxOut(*tx, add.Number().Uint64(), add.Hash(), add.Time().Uint64()) } } if add = pool.chain.GetBlock(add.ParentHash(), add.NumberU64()-1); add == nil { log.Error("Unrooted new chain seen by tx pool", "block", newHead.Number, "hash", newHead.Hash()) return } } reinject = types.TxDifference(discarded, included) } } // Initialize the internal state to the current head if newHead == nil { newHead = pool.chain.CurrentBlock().Header() // Special case during testing } statedb, err := pool.chain.StateAt(newHead) if err != nil { log.Error("Failed to reset txpool state", "err", err) return } pool.currentState = statedb pool.pendingState = state.ManageState(statedb) pool.currentMaxGas = newHead.GasLimit if len(included) == 0 { add := pool.chain.GetBlock(newHead.Hash(), newHead.Number.Uint64()) if pool.canAddPkrTx() { for _, tx := range add.Transactions() { pool.pkrTxOuts.AddImmatureTxOut(*tx, add.Number().Uint64(), add.Hash(), add.Time().Uint64()) } } included = append(included, add.Transactions()...) } for _, tx := range included { pool.removeAllTx(tx.Hash()) log.Debug("confirm removeTx tx", "hash", tx.Hash()) } // Inject any transactions discarded due to reorgs log.Debug("Reinjecting stale transactions", "count", len(reinject)) if len(reinject) > 0 { pool.addTxsLocked(reinject, false, false) for _, tx := range reinject { log.Info("reinject tx", "hash", tx.Hash()) } } pool.promoteExecutables(true) } // Stop terminates the transaction pool. func (pool *TxPool) Stop() { // Unsubscribe all subscriptions registered from txpool pool.scope.Close() // Unsubscribe subscriptions registered from blockchain pool.chainHeadSub.Unsubscribe() pool.wg.Wait() log.Info("Transaction pool stopped") } // SubscribeNewTxsEvent registers a subscription of NewTxsEvent and // starts sending event to the given channel. func (pool *TxPool) SubscribeNewTxsEvent(ch chan<- NewTxsEvent) event.Subscription { return pool.scope.Track(pool.txFeed.Subscribe(ch)) } // SetGasPrice updates the minimum priced required by the transaction pool for a // new transaction, and drops all transactions below this threshold. func (pool *TxPool) SetGasPrice(price *big.Int) { pool.mu.Lock() defer pool.mu.Unlock() pool.gasPrice = price pool.priced.RemoveWithPrice(pool.gasPrice) pool.newQueue.RemoveWithPrice(pool.gasPrice) pool.newPending.RemoveWithPrice(pool.gasPrice) log.Info("Transaction pool priced threshold updated", "priced", pool.gasPrice) } // State returns the virtual managed state of the transaction pool. func (pool *TxPool) State() *state.ManagedState { pool.mu.RLock() defer pool.mu.RUnlock() return pool.pendingState } // Stats retrieves the current pool stats, namely the number of pending and the // number of queued (non-executable) transactions. func (pool *TxPool) Stats() (int, int, int, int) { pool.mu.RLock() defer pool.mu.RUnlock() return pool.newPending.Len(), pool.newQueue.Len(), pool.priced.Len(), pool.all.Count() } // Content retrieves the data content of the transaction pool, returning all the // pending as well as queued transactions, grouped by account and sorted by nonce. func (pool *TxPool) Content() (types.Transactions, types.Transactions, types.Transactions) { pool.mu.Lock() defer pool.mu.Unlock() pending := types.Transactions{} if pool.newPending != nil && pool.newPending.items != nil { pending = append(pending, pool.newPending.Flatten()...) } queued := types.Transactions{} if pool.newQueue != nil && pool.newQueue.items != nil { queued = append(queued, pool.newQueue.Flatten()...) } all := types.Transactions{} if pool.priced != nil && pool.priced.items != nil { all = append(all, pool.priced.Flatten()...) } return pending, queued, all } func (pool *TxPool) PendingOuts(pkr c_type.PKr) map[c_type.Uint256]*TxOutInfo { pool.mu.Lock() defer pool.mu.Unlock() return pool.pkrTxOuts[pkr] } func (pool *TxPool) DelMaturedOuts(pkr c_type.PKr, txHash c_type.Uint256, currentNum uint64) { pool.mu.Lock() defer pool.mu.Unlock() if txHashMap, ok := pool.pkrTxOuts[pkr]; ok { for k, v := range txHashMap { if v.BlockNumber != 0 && v.BlockNumber < currentNum { pool.pkrTxOuts.delPkrTxOut(pkr, k) } } } pool.pkrTxOuts.delPkrTxOut(pkr, txHash) } // Pending retrieves all currently processable transactions, groupped by origin // account and sorted by nonce. The returned transaction set is a copy and can be // freely modified by calling code. func (pool *TxPool) Pending() (types.Transactions, error) { pool.mu.Lock() defer pool.mu.Unlock() return pool.newPending.Flatten(), nil } // validateTx checks whether a transaction is valid according to the consensus // rules and adheres to some heuristic limits of the local node (priced and size). func (pool *TxPool) validateTx(tx *types.Transaction, local bool) (e error) { defer func() { if r := recover(); r != nil { log.Error("validateTx error : ", "hash", tx.Hash().Hex(), "recover", r) debug.PrintStack() e = errors.New(fmt.Sprintf("%v", r)) } }() // Heuristic limit, reject transactions over 32KB to prevent DOS attacks if tx.Size() > 3200*1024 { return ErrOversizedData } // Ensure the transaction doesn't exceed the current block limit gas. var gaslimit uint64 if gaslimit, e = pool.currentState.GetTxGasLimit(tx); e != nil { return } if pool.currentMaxGas < gaslimit { return ErrGasLimit } num := pool.chain.CurrentBlock().NumberU64() if err := verify.VerifyWithoutState(tx.Ehash().NewRef(), tx.GetZZSTX(), num); err != nil { log.Trace("validateTx verify without state failed", "hash", tx.Hash().Hex(), "verify stx err", err) //return ErrVerifyError return err } copyState := pool.currentState.CopyWithNoZState() if err := pool.checkDescCmd(tx.GetZZSTX(), copyState); err != nil { return err } state := copyState.NextZState() err := verify.VerifyWithState(tx.GetZZSTX(), state, num) //err := verify.Verify(tx.GetZZSTX(), pool.currentState.Copy().GetZState()) if err != nil { log.Trace("validateTx error", "hash", tx.Hash().Hex(), "verify stx err", err) //pool.faileds[tx.Hash()] = time.Now() //return ErrVerifyError return err } // Drop non-local transactions under our own minimal accepted gas priced if !local && pool.gasPrice.Cmp(tx.GasPrice()) > 0 { return ErrUnderpriced } if !tx.IsOpContract() { if len(tx.Data()) > 0 { return errors.New(`not create or call crontract tx playdata must be nil`) } } intrGas, err := IntrinsicGas(tx.Data(), tx.To() == nil) if err != nil { return err } if gaslimit < intrGas { return ErrIntrinsicGas } return nil } func (pool *TxPool) checkDescCmd(tx *stx.T, state *state.StateDB) (err error) { cmd := tx.Desc_Cmd stakeState := stake.NewStakeState(state) if cmd.BuyShare != nil { if cmd.BuyShare.Pool != nil { stakePool := stakeState.GetStakePool(common.BytesToHash(cmd.BuyShare.Pool[:])) if stakePool == nil || stakePool.Closed { err = errors.New("pool is not exist or closed") return } } } else if cmd.RegistPool != nil { id := crypto.Keccak256Hash(tx.From[:]) stakePool := stakeState.GetStakePool(id) if stakePool == nil { if cmd.RegistPool.Value.ToInt().Cmp(stake.GetPoolValueThreshold()) != 0 { err = errors.New("registPool value error") return } } else { if stakePool.Closed { err = errors.New("registPool but stakePool is closed") return } } if !superzk.IsPKrValid(&cmd.RegistPool.Vote) { err = errors.New("registPool Vote is invalid") return } if cmd.RegistPool.FeeRate > seroparam.HIGHEST_STAKING_NODE_FEE_RATE { err = fmt.Errorf("registPool Vote fee must <= %v%%", seroparam.HIGHEST_STAKING_NODE_FEE_RATE/100) return } if cmd.RegistPool.FeeRate < seroparam.LOWEST_STAKING_NODE_FEE_RATE { err = fmt.Errorf("registPool Vote fee must >= %v%%", seroparam.LOWEST_STAKING_NODE_FEE_RATE/100) return } } else if cmd.ClosePool != nil { id := crypto.Keccak256Hash(tx.From[:]) stakePool := stakeState.GetStakePool(id) if stakePool == nil { err = errors.New("pool is not exist") return } if stakePool.Closed { err = errors.New("pool is closed") return } if stakePool.BlockNumber+stake.GetLockingBlockNum() > pool.chain.CurrentBlock().NumberU64() { err = errors.New("pool locking in") return } } return } // add validates a transaction and inserts it into the non-executable queue for // later pending promotion and execution. If the transaction is a replacement for // an already pending or queued one, it overwrites the previous and returns this // so outer code doesn't uselessly call promote. // // If a newly added transaction is marked as local, its sending account will be // whitelisted, preventing any associated transaction from being dropped out of // the pool due to pricing constraints. func (pool *TxPool) add(tx *types.Transaction, local bool) (bool, error) { // If the transaction is already known, discard it hash := tx.Hash() if pool.all.Get(hash) != nil && !local { log.Trace("Discarding already known transaction", "hash", hash.Hex()) return false, fmt.Errorf("known transaction: %x", hash) } if _, ok := pool.faileds[hash]; ok { log.Trace("Discarding already known failed transaction", "hash", hash.Hex()) return false, fmt.Errorf("known failed transaction: %x", hash) } currentBlockNum := pool.chain.CurrentBlock().NumberU64() if true && (!seroparam.Is_Dev()) { if (seroparam.SIP10()-25) < currentBlockNum && currentBlockNum < (seroparam.SIP10()+25) { return false, fmt.Errorf("protect SIP10:%v", seroparam.SIP10()) } } // If the transaction fails basic validation, discard it if err := pool.validateTx(tx, local); err != nil { log.Info("Discarding invalid transaction", "hash", hash.Hex(), "err", err) pool.faileds[tx.Hash()] = time.Now() invalidTxCounter.Inc(1) return false, err } // If the transaction pool is full, discard underpriced transactions if uint64(pool.all.Count()) >= pool.config.GlobalSlots+pool.config.GlobalQueue { // If the new transaction is underpriced, don't accept it if !local && pool.newQueue.Underpriced(tx) { log.Info("Discarding underpriced transaction", "hash", hash.Hex(), "priced", tx.GasPrice()) underpricedTxCounter.Inc(1) return false, ErrUnderpriced } // New transaction is better than our worse ones, make room for it drop := pool.priced.Discard(pool.all.Count() - int(pool.config.GlobalSlots+pool.config.GlobalQueue-1)) for _, tx := range drop { pool.removeWorkQueue(tx) if pool.canAddPkrTx() { pool.pkrTxOuts.delPendintTxOut(*tx) } log.Info("Discarding freshly underpriced transaction", "hash", tx.Hash().Hex(), "priced", tx.GasPrice()) } } flag, err := pool.enqueueTx(hash, tx) if err != nil { return false, err } if pool.canAddPkrTx() { pool.pkrTxOuts.AddPendingTxOut(*tx) } if flag { log.Info("Pooled new future transaction", "hash", hash.Hex()) } else { log.Info("Discard new future transaction", "hash", hash.Hex()) } return flag, nil } // Note, this method assumes the pool lock is held! func (pool *TxPool) enqueueTx(hash common.Hash, tx *types.Transaction) (bool, error) { // Try to insert the transaction into the future queue if pool.newQueue.Add(tx, pool.gasPrice) { if pool.all.Get(hash) == nil { flag := pool.priced.Add(tx, pool.gasPrice) if !flag { log.Info("txPool enqueueTx error", "tx.gasPrice", tx.GasPrice().String()) } } } else { return false, errors.New("gas price too low") } return true, nil } // AddLocal enqueues a single transaction into the pool if it is valid, marking // the sender as a local one in the mean time, ensuring it goes around the local // pricing constraints. func (pool *TxPool) AddLocal(tx *types.Transaction) error { return pool.addTx(tx, !pool.config.NoLocals) } // AddRemote enqueues a single transaction into the pool if it is valid. If the // sender is not among the locally tracked ones, full pricing constraints will // apply. func (pool *TxPool) AddRemote(tx *types.Transaction) error { return pool.addTx(tx, false) } // AddLocals enqueues a batch of transactions into the pool if they are valid, // marking the senders as a local ones in the mean time, ensuring they go around // the local pricing constraints. func (pool *TxPool) AddLocals(txs []*types.Transaction) []error { return pool.addTxs(txs, !pool.config.NoLocals, true) } // AddRemotes enqueues a batch of transactions into the pool if they are valid. // If the senders are not among the locally tracked ones, full pricing constraints // will apply. func (pool *TxPool) AddRemotes(txs []*types.Transaction) []error { for _, tx := range txs { log.Debug("AddRemotes tx", "hash", tx.Hash().Hex()) } return pool.addTxs(txs, false, false) } // addTx enqueues a single transaction into the pool if it is valid. func (pool *TxPool) addTx(tx *types.Transaction, local bool) error { pool.mu.Lock() defer pool.mu.Unlock() // Try to inject the transaction and update any state _, err := pool.add(tx, local) if err != nil { return err } broadCast := false if local { if pool.Mining() || pool.config.StartLight { pool.broadCastLocalTx(tx) } else { broadCast = true } } pool.promoteExecutables(broadCast) return nil } // addTxs attempts to queue a batch of transactions if they are valid. func (pool *TxPool) addTxs(txs []*types.Transaction, local bool, broadcast bool) []error { pool.mu.Lock() defer pool.mu.Unlock() return pool.addTxsLocked(txs, local, broadcast) } // addTxsLocked attempts to queue a batch of transactions if they are valid, // whilst assuming the transaction pool lock is already held. func (pool *TxPool) addTxsLocked(txs []*types.Transaction, local bool, broadcast bool) []error { // Add the batch of transaction, tracking the accepted ones errs := []error{} errCount := 0 knowErrCount := 0 failedErrCount := 0 added := 0 for _, tx := range txs { _, err := pool.add(tx, local) if err != nil { if strings.Contains(err.Error(), "known transaction") { knowErrCount++ } else if strings.Contains(err.Error(), "known failed transaction") { failedErrCount++ } else { errCount++ } } else { added++ } if err != nil { errs = append(errs, err) } } log.Trace("txpool", "addTxs", len(txs), "knowErr", knowErrCount, "failedErr", failedErrCount, "validateErr", errCount) if added > 0 { pool.promoteExecutables(broadcast) } return errs } // Status returns the status (unknown/pending/queued) of a batch of transactions // identified by their hashes. func (pool *TxPool) Status(hashes []common.Hash) []TxStatus { pool.mu.RLock() defer pool.mu.RUnlock() status := make([]TxStatus, len(hashes)) for i, hash := range hashes { if tx := pool.all.Get(hash); tx != nil { if pool.newQueue.Get(hash) != nil { status[i] = TxStatusQueued } else if pool.newPending.Get(hash) != nil { status[i] = TxStatusPending } else { status[i] = TxStatusUnknown } } } return status } // Get returns a transaction if it is contained in the pool // and nil otherwise. func (pool *TxPool) Get(hash common.Hash) *types.Transaction { return pool.all.Get(hash) } // removeTx removes a single transaction from the queue, moving all subsequent // transactions back to the future queue. func (pool *TxPool) removeAllTx(hash common.Hash) { // Fetch the transaction we wish to delete tx := pool.all.Get(hash) if tx == nil { return } pool.priced.Remove(tx) delete(pool.beats, hash) //Remove it from the list of known transactions if pool.newQueue.Remove(tx) { return } if pool.newPending.Remove(tx) { return } } func (pool *TxPool) removeWorkQueue(tx *types.Transaction) { delete(pool.beats, tx.Hash()) //Remove it from the list of known transactions if pool.newQueue.Remove(tx) { return } if pool.newPending.Remove(tx) { return } } func (pool *TxPool) promoteTx(tx *types.Transaction) bool { // Try to insert the transaction into the pending queue if pool.newPending.Add(tx, new(big.Int).Set(pool.gasPrice)) { pool.beats[tx.Hash()] = time.Now() } return true } func (pool *TxPool) broadCastLocalTx(tx *types.Transaction) { go pool.txFeed.Send(NewTxsEvent{[]*types.Transaction{tx}}) } func (pool *TxPool) promoteExecutables(broadcast bool) { // Track the promoted transactions to broadcast them at once var promoted []*types.Transaction //var invalidTx []common.Hash for _, tx := range pool.newQueue.Ready() { //if err := pool.validateTx(tx, false); err != nil { // invalidTx = append(invalidTx, tx.Hash()) // continue //} if pool.promoteTx(tx) { log.Trace("Promoting queued transaction", "hash", tx.Hash()) if (pool.config.StartLight || !pool.Mining()) && broadcast { promoted = append(promoted, tx) } } } //if len(invalidTx) > 0 { // for _, tx := range invalidTx { // pool.removeAllTx(tx) // } // //} // Notify subsystem for new promoted transactions. if len(promoted) > 0 { log.Debug("txpool promoted and broadcast txs", "txs", len(promoted)) //subLen := 100 //if len(promoted) > subLen { // promoted = promoted[:subLen] //} go pool.txFeed.Send(NewTxsEvent{promoted}) } // If we've queued more transactions than the hard limit, drop oldest ones if uint64(pool.newPending.Len()) > pool.config.GlobalQueue { drop := uint64(pool.newPending.Len()) - pool.config.GlobalQueue if drop > 0 { transactions := pool.newPending.Discard(int(drop)) for _, tx := range transactions { pool.newQueue.Add(tx, big.NewInt(0)) log.Trace("Removed fairness-exceeding pending transaction", "hash", tx.Hash()) } } } } // txLookup is used internally by TxPool to track transactions while allowing lookup without // mutex contention. // // Note, although this type is properly protected against concurrent access, it // is **not** a type that should ever be mutated or even exposed outside of the // transaction pool, since its internal state is tightly coupled with the pools // internal mechanisms. The sole purpose of the type is to permit out-of-bound // peeking into the pool in TxPool.Get without having to acquire the widely scoped // TxPool.mu mutex. type txLookup struct { all map[common.Hash]*types.Transaction lock sync.RWMutex } // newTxLookup returns a new txLookup structure. func newTxLookup() *txLookup { return &txLookup{ all: make(map[common.Hash]*types.Transaction), } } // Range calls f on each key and value present in the map. func (t *txLookup) Range(f func(hash common.Hash, tx *types.Transaction) bool) { t.lock.RLock() defer t.lock.RUnlock() for key, value := range t.all { if !f(key, value) { break } } } // Get returns a transaction if it exists in the lookup, or nil if not found. func (t *txLookup) Get(hash common.Hash) *types.Transaction { t.lock.RLock() defer t.lock.RUnlock() return t.all[hash] } // Count returns the current number of items in the lookup. func (t *txLookup) Count() int { t.lock.RLock() defer t.lock.RUnlock() return len(t.all) } // Add adds a transaction to the lookup. func (t *txLookup) Add(tx *types.Transaction) { t.lock.Lock() defer t.lock.Unlock() t.all[tx.Hash()] = tx } // Remove removes a transaction from the lookup. func (t *txLookup) Remove(hash common.Hash) { t.lock.Lock() defer t.lock.Unlock() delete(t.all, hash) } ================================================ FILE: core/types/block.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // Package types contains data types related to Ethereum consensus. package types import ( "encoding/binary" "math/big" "sort" "sync/atomic" "time" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/rlp" ) var ( EmptyRootHash = DeriveSha(Transactions{}) maxUint256 = new(big.Int).Exp(big.NewInt(2), big.NewInt(256), big.NewInt(0)) ) // Body is a simple (mutable, non-safe) data container for storing and moving // a block's data contents (transactions) together. type Body struct { Transactions []*Transaction } // Block represents an entire block in the Ethereum blockchain. type Block struct { header *Header transactions Transactions // caches hash atomic.Value hashPos atomic.Value size atomic.Value // Td is used by package core to store the total difficulty // of the chain up to and including the block. td *big.Int // These fields are used by package sero to track // inter-peer block relay. ReceivedAt time.Time ReceivedFrom interface{} } func (b *Block) SetVotes(CurrentVotes []HeaderVote, ParentVotes []HeaderVote) { b.header.CurrentVotes = append([]HeaderVote{}, CurrentVotes...) b.header.ParentVotes = append([]HeaderVote{}, ParentVotes...) } // DeprecatedTd is an old relic for extracting the TD of a block. It is in the // code solely to facilitate upgrading the database from the old format to the // new, after which it should be deleted. Do not use! func (b *Block) DeprecatedTd() *big.Int { return b.td } // NewBlock creates a new block. The input data is copied, // changes to header and to the field values will not affect the // block. // // The values of TxHash, UncleHash, ReceiptHash and Bloom in header // are ignored and set to values derived from the given txs and receipts. func NewBlock(header *Header, txs []*Transaction, receipts []*Receipt) *Block { b := &Block{header: CopyHeader(header), td: new(big.Int)} // TODO: panic if len(txs) != len(receipts) if len(txs) == 0 { b.header.TxHash = EmptyRootHash } else { b.header.TxHash = DeriveSha(Transactions(txs)) b.transactions = make(Transactions, len(txs)) copy(b.transactions, txs) } if len(receipts) == 0 { b.header.ReceiptHash = EmptyRootHash } else { b.header.ReceiptHash = DeriveSha(Receipts(receipts)) b.header.Bloom = CreateBloom(receipts) } return b } // NewBlockWithHeader creates a block with the given header data. The // header data is copied, changes to header and to the field values // will not affect the block. func NewBlockWithHeader(header *Header) *Block { return &Block{header: CopyHeader(header)} } // TODO: copies func (b *Block) Transactions() Transactions { return b.transactions } func (b *Block) Transaction(hash common.Hash) *Transaction { for _, transaction := range b.transactions { if transaction.Hash() == hash { return transaction } } return nil } func (b *Block) Number() *big.Int { return new(big.Int).Set(b.header.Number) } func (b *Block) GasLimit() uint64 { return b.header.GasLimit } func (b *Block) GasUsed() uint64 { return b.header.GasUsed } func (b *Block) Difficulty() *big.Int { return new(big.Int).Set(b.header.Difficulty) } func (b *Block) Time() *big.Int { return new(big.Int).Set(b.header.Time) } func (b *Block) NumberU64() uint64 { return b.header.Number.Uint64() } func (b *Block) MixDigest() common.Hash { return b.header.MixDigest } func (b *Block) Nonce() uint64 { return binary.BigEndian.Uint64(b.header.Nonce[:]) } func (b *Block) Bloom() Bloom { return b.header.Bloom } func (b *Block) Coinbase() common.Address { return b.header.Coinbase } func (b *Block) Root() common.Hash { return b.header.Root } func (b *Block) ParentHash() common.Hash { return b.header.ParentHash } func (b *Block) TxHash() common.Hash { return b.header.TxHash } func (b *Block) ReceiptHash() common.Hash { return b.header.ReceiptHash } func (b *Block) Extra() []byte { return common.CopyBytes(b.header.Extra) } func (b *Block) Header() *Header { return CopyHeader(b.header) } // Body returns the non-header content of the block. func (b *Block) Body() *Body { return &Body{b.transactions} } func (b *Block) HashNoNonce() common.Hash { return b.header.HashPow() } // Size returns the true RLP encoded storage size of the block, either by encoding // and returning it, or returning a previsouly cached value. func (b *Block) Size() common.StorageSize { if size := b.size.Load(); size != nil { return size.(common.StorageSize) } c := writeCounter(0) rlp.Encode(&c, b) b.size.Store(common.StorageSize(c)) return common.StorageSize(c) } type writeCounter common.StorageSize func (c *writeCounter) Write(b []byte) (int, error) { *c += writeCounter(len(b)) return len(b), nil } // WithSeal returns a new block with the data from b but the header replaced with // the sealed one. func (b *Block) WithSeal(header *Header) *Block { cpy := *header return &Block{ header: &cpy, transactions: b.transactions, } } // WithBody returns a new block with the given transaction. func (b *Block) WithBody(transactions []*Transaction) *Block { block := &Block{ header: CopyHeader(b.header), transactions: make([]*Transaction, len(transactions)), } copy(block.transactions, transactions) return block } // Hash returns the keccak256 hash of b's header. // The hash is computed on the first call and cached thereafter. func (b *Block) Hash() common.Hash { if hash := b.hash.Load(); hash != nil { return hash.(common.Hash) } v := b.header.Hash() b.hash.Store(v) return v } func (b *Block) HashPos() common.Hash { if hash := b.hashPos.Load(); hash != nil { return hash.(common.Hash) } v := b.header.HashPos() b.hashPos.Store(v) return v } type Blocks []*Block type BlockBy func(b1, b2 *Block) bool func (self BlockBy) Sort(blocks Blocks) { bs := blockSorter{ blocks: blocks, by: self, } sort.Sort(bs) } type blockSorter struct { blocks Blocks by func(b1, b2 *Block) bool } func (self blockSorter) Len() int { return len(self.blocks) } func (self blockSorter) Swap(i, j int) { self.blocks[i], self.blocks[j] = self.blocks[j], self.blocks[i] } func (self blockSorter) Less(i, j int) bool { return self.by(self.blocks[i], self.blocks[j]) } func Number(b1, b2 *Block) bool { return b1.header.Number.Cmp(b2.header.Number) < 0 } ================================================ FILE: core/types/block_rlp.go ================================================ package types import ( "io" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/rlp" ) // "external" block encoding. used for sero protocol, etc. type Block_Version_0 struct { Header *Header Txs []*Transaction } // DecodeRLP decodes the Ethereum func (b *Block) DecodeRLP(s *rlp.Stream) error { b0 := Block_Version_0{} _, size, _ := s.Kind() if err := s.Decode(&b0); err != nil { return err } b.header = b0.Header b.transactions = b0.Txs b.size.Store(common.StorageSize(rlp.ListSize(size))) return nil } // EncodeRLP serializes b into the Ethereum RLP block format. func (b *Block) EncodeRLP(w io.Writer) error { b0 := Block_Version_0{} b0.Header = b.header b0.Txs = b.transactions return rlp.Encode(w, b0) } ================================================ FILE: core/types/block_test.go ================================================ package types ================================================ FILE: core/types/bloom9.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package types import ( "fmt" "math/big" "github.com/sero-cash/go-sero/common/hexutil" "github.com/sero-cash/go-sero/crypto" ) type bytesBacked interface { Bytes() []byte } const ( // BloomByteLength represents the number of bytes used in a header log bloom. BloomByteLength = 256 // BloomBitLength represents the number of bits used in a header log bloom. BloomBitLength = 8 * BloomByteLength ) // Bloom represents a 2048 bit bloom filter. type Bloom [BloomByteLength]byte // BytesToBloom converts a byte slice to a bloom filter. // It panics if b is not of suitable size. func BytesToBloom(b []byte) Bloom { var bloom Bloom bloom.SetBytes(b) return bloom } // SetBytes sets the content of b to the given bytes. // It panics if d is not of suitable size. func (b *Bloom) SetBytes(d []byte) { if len(b) < len(d) { panic(fmt.Sprintf("bloom bytes too big %d %d", len(b), len(d))) } copy(b[BloomByteLength-len(d):], d) } // Add adds d to the filter. Future calls of Test(d) will return true. func (b *Bloom) Add(d *big.Int) { bin := new(big.Int).SetBytes(b[:]) bin.Or(bin, bloom9(d.Bytes())) b.SetBytes(bin.Bytes()) } // Big converts b to a big integer. func (b Bloom) Big() *big.Int { return new(big.Int).SetBytes(b[:]) } func (b Bloom) Bytes() []byte { return b[:] } func (b Bloom) Test(test *big.Int) bool { return BloomLookup(b, test) } func (b Bloom) TestBytes(test []byte) bool { return b.Test(new(big.Int).SetBytes(test)) } // MarshalText encodes b as a hex string with 0x prefix. func (b Bloom) MarshalText() ([]byte, error) { return hexutil.Bytes(b[:]).MarshalText() } // UnmarshalText b as a hex string with 0x prefix. func (b *Bloom) UnmarshalText(input []byte) error { return hexutil.UnmarshalFixedText("Bloom", input, b[:]) } func CreateBloom(receipts Receipts) Bloom { bin := new(big.Int) for _, receipt := range receipts { bin.Or(bin, LogsBloom(receipt.Logs)) } return BytesToBloom(bin.Bytes()) } func LogsBloom(logs []*Log) *big.Int { bin := new(big.Int) for _, log := range logs { bin.Or(bin, bloom9(log.Address.Bytes())) for _, b := range log.Topics { bin.Or(bin, bloom9(b[:])) } } return bin } func bloom9(b []byte) *big.Int { b = crypto.Keccak256(b[:]) r := new(big.Int) for i := 0; i < 6; i += 2 { t := big.NewInt(1) b := (uint(b[i+1]) + (uint(b[i]) << 8)) & 2047 r.Or(r, t.Lsh(t, b)) } return r } var Bloom9 = bloom9 func BloomLookup(bin Bloom, topic bytesBacked) bool { bloom := bin.Big() cmp := bloom9(topic.Bytes()[:]) return bloom.And(bloom, cmp).Cmp(cmp) == 0 } ================================================ FILE: core/types/derive_sha.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package types import ( "bytes" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/rlp" "github.com/sero-cash/go-sero/trie" ) type DerivableList interface { Len() int GetRlp(i int) []byte } func DeriveSha(list DerivableList) common.Hash { keybuf := new(bytes.Buffer) trie := new(trie.Trie) for i := 0; i < list.Len(); i++ { keybuf.Reset() rlp.Encode(keybuf, uint(i)) trie.Update(keybuf.Bytes(), list.GetRlp(i)) } return trie.Hash() } ================================================ FILE: core/types/gen_header_json.go ================================================ // Code generated by github.com/fjl/gencodec. DO NOT EDIT. package types import ( "encoding/json" "errors" "math/big" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/common/hexutil" ) var _ = (*headerMarshaling)(nil) // MarshalJSON marshals as JSON. func (h Header) MarshalJSON() ([]byte, error) { type Header struct { ParentHash common.Hash `json:"parentHash" gencodec:"required"` Coinbase common.Address `json:"miner" gencodec:"required"` Root common.Hash `json:"stateRoot" gencodec:"required"` TxHash common.Hash `json:"transactionsRoot" gencodec:"required"` ReceiptHash common.Hash `json:"receiptsRoot" gencodec:"required"` Bloom Bloom `json:"logsBloom" gencodec:"required"` Difficulty *hexutil.Big `json:"difficulty" gencodec:"required"` Number *hexutil.Big `json:"number" gencodec:"required"` GasLimit hexutil.Uint64 `json:"gasLimit" gencodec:"required"` GasUsed hexutil.Uint64 `json:"gasUsed" gencodec:"required"` Time *hexutil.Big `json:"timestamp" gencodec:"required"` Extra hexutil.Bytes `json:"extraData" gencodec:"required"` MixDigest common.Hash `json:"mixHash" gencodec:"required"` Nonce BlockNonce `json:"nonce" gencodec:"required"` Hash common.Hash `json:"hash"` } var enc Header enc.ParentHash = h.ParentHash enc.Coinbase = h.Coinbase enc.Root = h.Root enc.TxHash = h.TxHash enc.ReceiptHash = h.ReceiptHash enc.Bloom = h.Bloom enc.Difficulty = (*hexutil.Big)(h.Difficulty) enc.Number = (*hexutil.Big)(h.Number) enc.GasLimit = hexutil.Uint64(h.GasLimit) enc.GasUsed = hexutil.Uint64(h.GasUsed) enc.Time = (*hexutil.Big)(h.Time) enc.Extra = h.Extra enc.MixDigest = h.MixDigest enc.Nonce = h.Nonce enc.Hash = h.Hash() return json.Marshal(&enc) } // UnmarshalJSON unmarshals from JSON. func (h *Header) UnmarshalJSON(input []byte) error { type Header struct { ParentHash *common.Hash `json:"parentHash" gencodec:"required"` Coinbase *common.Address `json:"miner" gencodec:"required"` Root *common.Hash `json:"stateRoot" gencodec:"required"` TxHash *common.Hash `json:"transactionsRoot" gencodec:"required"` ReceiptHash *common.Hash `json:"receiptsRoot" gencodec:"required"` Bloom *Bloom `json:"logsBloom" gencodec:"required"` Difficulty *hexutil.Big `json:"difficulty" gencodec:"required"` Number *hexutil.Big `json:"number" gencodec:"required"` GasLimit *hexutil.Uint64 `json:"gasLimit" gencodec:"required"` GasUsed *hexutil.Uint64 `json:"gasUsed" gencodec:"required"` Time *hexutil.Big `json:"timestamp" gencodec:"required"` Extra *hexutil.Bytes `json:"extraData" gencodec:"required"` MixDigest *common.Hash `json:"mixHash" gencodec:"required"` Nonce *BlockNonce `json:"nonce" gencodec:"required"` } var dec Header if err := json.Unmarshal(input, &dec); err != nil { return err } if dec.ParentHash == nil { return errors.New("missing required field 'parentHash' for Header") } h.ParentHash = *dec.ParentHash if dec.Coinbase == nil { return errors.New("missing required field 'miner' for Header") } h.Coinbase = *dec.Coinbase if dec.Root == nil { return errors.New("missing required field 'stateRoot' for Header") } h.Root = *dec.Root if dec.TxHash == nil { return errors.New("missing required field 'transactionsRoot' for Header") } h.TxHash = *dec.TxHash if dec.ReceiptHash == nil { return errors.New("missing required field 'receiptsRoot' for Header") } h.ReceiptHash = *dec.ReceiptHash if dec.Bloom == nil { return errors.New("missing required field 'logsBloom' for Header") } h.Bloom = *dec.Bloom if dec.Difficulty == nil { return errors.New("missing required field 'difficulty' for Header") } h.Difficulty = (*big.Int)(dec.Difficulty) if dec.Number == nil { return errors.New("missing required field 'number' for Header") } h.Number = (*big.Int)(dec.Number) if dec.GasLimit == nil { return errors.New("missing required field 'gasLimit' for Header") } h.GasLimit = uint64(*dec.GasLimit) if dec.GasUsed == nil { return errors.New("missing required field 'gasUsed' for Header") } h.GasUsed = uint64(*dec.GasUsed) if dec.Time == nil { return errors.New("missing required field 'timestamp' for Header") } h.Time = (*big.Int)(dec.Time) if dec.Extra == nil { return errors.New("missing required field 'extraData' for Header") } h.Extra = *dec.Extra if dec.MixDigest == nil { return errors.New("missing required field 'mixHash' for Header") } h.MixDigest = *dec.MixDigest if dec.Nonce == nil { return errors.New("missing required field 'nonce' for Header") } h.Nonce = *dec.Nonce return nil } ================================================ FILE: core/types/gen_log_json.go ================================================ // Code generated by github.com/fjl/gencodec. DO NOT EDIT. package types import ( "encoding/json" "errors" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/common/hexutil" ) var _ = (*logMarshaling)(nil) // MarshalJSON marshals as JSON. func (l Log) MarshalJSON() ([]byte, error) { type Log struct { Address common.Address `json:"address" gencodec:"required"` Topics []common.Hash `json:"topics" gencodec:"required"` Data hexutil.Bytes `json:"data" gencodec:"required"` BlockNumber hexutil.Uint64 `json:"blockNumber"` TxHash common.Hash `json:"transactionHash" gencodec:"required"` TxIndex hexutil.Uint `json:"transactionIndex" gencodec:"required"` BlockHash common.Hash `json:"blockHash"` Index hexutil.Uint `json:"logIndex" gencodec:"required"` Removed bool `json:"removed"` } var enc Log enc.Address = l.Address enc.Topics = l.Topics enc.Data = l.Data enc.BlockNumber = hexutil.Uint64(l.BlockNumber) enc.TxHash = l.TxHash enc.TxIndex = hexutil.Uint(l.TxIndex) enc.BlockHash = l.BlockHash enc.Index = hexutil.Uint(l.Index) enc.Removed = l.Removed return json.Marshal(&enc) } // UnmarshalJSON unmarshals from JSON. func (l *Log) UnmarshalJSON(input []byte) error { type Log struct { Address *common.Address `json:"address" gencodec:"required"` Topics []common.Hash `json:"topics" gencodec:"required"` Data *hexutil.Bytes `json:"data" gencodec:"required"` BlockNumber *hexutil.Uint64 `json:"blockNumber"` TxHash *common.Hash `json:"transactionHash" gencodec:"required"` TxIndex *hexutil.Uint `json:"transactionIndex" gencodec:"required"` BlockHash *common.Hash `json:"blockHash"` Index *hexutil.Uint `json:"logIndex" gencodec:"required"` Removed *bool `json:"removed"` } var dec Log if err := json.Unmarshal(input, &dec); err != nil { return err } if dec.Address == nil { return errors.New("missing required field 'address' for Log") } l.Address = *dec.Address if dec.Topics == nil { return errors.New("missing required field 'topics' for Log") } l.Topics = dec.Topics if dec.Data == nil { return errors.New("missing required field 'data' for Log") } l.Data = *dec.Data if dec.BlockNumber != nil { l.BlockNumber = uint64(*dec.BlockNumber) } if dec.TxHash == nil { return errors.New("missing required field 'transactionHash' for Log") } l.TxHash = *dec.TxHash if dec.TxIndex == nil { return errors.New("missing required field 'transactionIndex' for Log") } l.TxIndex = uint(*dec.TxIndex) if dec.BlockHash != nil { l.BlockHash = *dec.BlockHash } if dec.Index == nil { return errors.New("missing required field 'logIndex' for Log") } l.Index = uint(*dec.Index) if dec.Removed != nil { l.Removed = *dec.Removed } return nil } ================================================ FILE: core/types/gen_receipt_json.go ================================================ // Code generated by github.com/fjl/gencodec. DO NOT EDIT. package types import ( "encoding/json" "errors" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/common/hexutil" ) var _ = (*receiptMarshaling)(nil) // MarshalJSON marshals as JSON. func (r Receipt) MarshalJSON() ([]byte, error) { type Receipt struct { PostState hexutil.Bytes `json:"root"` Status hexutil.Uint64 `json:"status"` CumulativeGasUsed hexutil.Uint64 `json:"cumulativeGasUsed" gencodec:"required"` Bloom Bloom `json:"logsBloom" gencodec:"required"` Logs []*Log `json:"logs" gencodec:"required"` TxHash common.Hash `json:"transactionHash" gencodec:"required"` ContractAddress common.Address `json:"contractAddress"` GasUsed hexutil.Uint64 `json:"gasUsed" gencodec:"required"` } var enc Receipt enc.PostState = r.PostState enc.Status = hexutil.Uint64(r.Status) enc.CumulativeGasUsed = hexutil.Uint64(r.CumulativeGasUsed) enc.Bloom = r.Bloom enc.Logs = r.Logs enc.TxHash = r.TxHash enc.ContractAddress = r.ContractAddress enc.GasUsed = hexutil.Uint64(r.GasUsed) return json.Marshal(&enc) } // UnmarshalJSON unmarshals from JSON. func (r *Receipt) UnmarshalJSON(input []byte) error { type Receipt struct { PostState *hexutil.Bytes `json:"root"` Status *hexutil.Uint64 `json:"status"` CumulativeGasUsed *hexutil.Uint64 `json:"cumulativeGasUsed" gencodec:"required"` Bloom *Bloom `json:"logsBloom" gencodec:"required"` Logs []*Log `json:"logs" gencodec:"required"` TxHash *common.Hash `json:"transactionHash" gencodec:"required"` ContractAddress *common.Address `json:"contractAddress"` GasUsed *hexutil.Uint64 `json:"gasUsed" gencodec:"required"` } var dec Receipt if err := json.Unmarshal(input, &dec); err != nil { return err } if dec.PostState != nil { r.PostState = *dec.PostState } if dec.Status != nil { r.Status = uint64(*dec.Status) } if dec.CumulativeGasUsed == nil { return errors.New("missing required field 'cumulativeGasUsed' for Receipt") } r.CumulativeGasUsed = uint64(*dec.CumulativeGasUsed) if dec.Bloom == nil { return errors.New("missing required field 'logsBloom' for Receipt") } r.Bloom = *dec.Bloom if dec.Logs == nil { return errors.New("missing required field 'logs' for Receipt") } r.Logs = dec.Logs if dec.TxHash == nil { return errors.New("missing required field 'transactionHash' for Receipt") } r.TxHash = *dec.TxHash if dec.ContractAddress != nil { r.ContractAddress = *dec.ContractAddress } if dec.GasUsed == nil { return errors.New("missing required field 'gasUsed' for Receipt") } r.GasUsed = uint64(*dec.GasUsed) return nil } ================================================ FILE: core/types/gen_tx_json.go ================================================ // Code generated by github.com/fjl/gencodec. DO NOT EDIT. package types import ( "encoding/json" "errors" "math/big" "github.com/sero-cash/go-sero/common/hexutil" "github.com/sero-cash/go-sero/zero/txs/stx" ) var _ = (*txdataMarshaling)(nil) // MarshalJSON marshals as JSON. func (t txdata) MarshalJSON() ([]byte, error) { type txdata struct { Price *hexutil.Big `json:"gasPrice" gencodec:"required"` GasLimit hexutil.Uint64 `json:"gas" gencodec:"required"` Payload hexutil.Bytes `json:"input" gencodec:"required"` Stxt *stx.T `json:"stxt" gencodec:"required"` } var enc txdata enc.Price = (*hexutil.Big)(t.Price) enc.GasLimit = hexutil.Uint64(t.GasLimit) enc.Payload = t.Payload enc.Stxt = t.Stxt return json.Marshal(&enc) } // UnmarshalJSON unmarshals from JSON. func (t *txdata) UnmarshalJSON(input []byte) error { type txdata struct { Price *hexutil.Big `json:"gasPrice" gencodec:"required"` GasLimit *hexutil.Uint64 `json:"gas" gencodec:"required"` Payload *hexutil.Bytes `json:"input" gencodec:"required"` Stxt *stx.T `json:"stxt" gencodec:"required"` } var dec txdata if err := json.Unmarshal(input, &dec); err != nil { return err } if dec.Price == nil { return errors.New("missing required field 'gasPrice' for txdata") } t.Price = (*big.Int)(dec.Price) if dec.GasLimit == nil { return errors.New("missing required field 'gas' for txdata") } t.GasLimit = uint64(*dec.GasLimit) if dec.Payload == nil { return errors.New("missing required field 'input' for txdata") } t.Payload = *dec.Payload if dec.Stxt == nil { return errors.New("missing required field 'stxt' for txdata") } t.Stxt = dec.Stxt return nil } ================================================ FILE: core/types/header.go ================================================ package types import ( "encoding/binary" "io" "math/big" "unsafe" "github.com/sero-cash/go-czero-import/seroparam" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/core/types/vserial" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/common/hexutil" "github.com/sero-cash/go-sero/crypto/sha3" "github.com/sero-cash/go-sero/rlp" ) // A BlockNonce is a 64-bit hash which proves (combined with the // mix-hash) that a sufficient amount of computation has been carried // out on a block. type BlockNonce [8]byte // EncodeNonce converts the given integer to a block nonce. func EncodeNonce(i uint64) BlockNonce { var n BlockNonce binary.BigEndian.PutUint64(n[:], i) return n } // Uint64 returns the integer value of a block nonce. func (n BlockNonce) Uint64() uint64 { return binary.BigEndian.Uint64(n[:]) } // MarshalText encodes n as a hex string with 0x prefix. func (n BlockNonce) MarshalText() ([]byte, error) { return hexutil.Bytes(n[:]).MarshalText() } // UnmarshalText implements encoding.TextUnmarshaler. func (n *BlockNonce) UnmarshalText(input []byte) error { return hexutil.UnmarshalFixedText("BlockNonce", input, n[:]) } //go:generate gencodec -type Version_0 -field-override headerMarshaling -out gen_header_json.go // Version_0 represents a block header in the Ethereum blockchain. type Header struct { //Data ParentHash common.Hash `json:"parentHash" gencodec:"required"` Coinbase common.Address `json:"miner" gencodec:"required"` Licr c_type.LICr `json:"licr" gencodec:"required"` Root common.Hash `json:"stateRoot" gencodec:"required"` TxHash common.Hash `json:"transactionsRoot" gencodec:"required"` ReceiptHash common.Hash `json:"receiptsRoot" gencodec:"required"` Bloom Bloom `json:"logsBloom" gencodec:"required"` Difficulty *big.Int `json:"difficulty" gencodec:"required"` Number *big.Int `json:"number" gencodec:"required"` GasLimit uint64 `json:"gasLimit" gencodec:"required"` GasUsed uint64 `json:"gasUsed" gencodec:"required"` Time *big.Int `json:"timestamp" gencodec:"required"` Extra []byte `json:"extraData" gencodec:"required"` //POW MixDigest common.Hash `json:"mixHash" gencodec:"required"` Nonce BlockNonce `json:"nonce" gencodec:"required"` //POS CurrentVotes []HeaderVote ParentVotes []HeaderVote } // field type overrides for gencodec type headerMarshaling struct { Difficulty *hexutil.Big Number *hexutil.Big GasLimit hexutil.Uint64 GasUsed hexutil.Uint64 Time *hexutil.Big Extra hexutil.Bytes Hash common.Hash `json:"hash"` // adds call to Hash() in MarshalJSON } func (h *Header) Valid() bool { if h.Number.Uint64() >= seroparam.SIP5() { return true } else { if h.Licr.H == 0 { return h.Number.Uint64() >= h.Licr.L } else { return h.Number.Uint64() >= h.Licr.L && h.Number.Uint64() <= h.Licr.H } } } // Hash returns the block hash of the header, which is simply the keccak256 hash of its // RLP encoding. func (h *Header) Hash() common.Hash { return rlpHash(h) } // HashNoNonce returns the hash which is used as input for the proof-of-work search. func (h *Header) HashPow() common.Hash { return rlpHash([]interface{}{ h.ParentHash, h.Coinbase, h.Root, h.TxHash, h.ReceiptHash, h.Bloom, h.Difficulty, h.Number, h.GasLimit, h.GasUsed, h.Time, h.Extra, }) } func (h *Header) HashPos() (ret common.Hash) { m := sha3.NewKeccak256() m.Write(h.MixDigest[:]) m.Write(h.Nonce[:]) hp := m.Sum(nil) copy(ret[:], hp) return } func StakeHash(currentHashPos *common.Hash, parentHashPos *common.Hash, isPool bool) (ret common.Hash) { m := sha3.NewKeccak256() m.Write(currentHashPos[:]) m.Write(parentHashPos[:]) if isPool { m.Write([]byte{1}) } sh := m.Sum(nil) copy(ret[:], sh) return } func (h *Header) ActualDifficulty() *big.Int { if h.Number.Uint64() >= seroparam.SIP5() { return h.Difficulty } else { if h.Valid() { c := new(big.Int).SetUint64(h.Licr.C) if h.Difficulty.Cmp(c) > 0 { return new(big.Int).Sub(h.Difficulty, c) } else { return big.NewInt(1) } } else { return maxUint256 } } } // Size returns the approximate memory used by all internal contents. It is used // to approximate and limit the memory consumption of various caches. func (h *Header) Size() common.StorageSize { return common.StorageSize(unsafe.Sizeof(*h)) + common.StorageSize(len(h.Extra)+(h.Difficulty.BitLen()+h.Number.BitLen()+h.Time.BitLen())/8) } func rlpHash(x interface{}) (h common.Hash) { hw := sha3.NewKeccak256() rlp.Encode(hw, x) hw.Sum(h[:0]) return h } // CopyHeader creates a deep copy of a block header to prevent side effects from // modifying a header variable. func CopyHeader(h *Header) *Header { cpy := *h if cpy.Time = new(big.Int); h.Time != nil { cpy.Time.Set(h.Time) } if cpy.Difficulty = new(big.Int); h.Difficulty != nil { cpy.Difficulty.Set(h.Difficulty) } if cpy.Number = new(big.Int); h.Number != nil { cpy.Number.Set(h.Number) } if len(h.Extra) > 0 { cpy.Extra = make([]byte, len(h.Extra)) copy(cpy.Extra, h.Extra) } if len(h.CurrentVotes) > 0 { cpy.CurrentVotes = append([]HeaderVote{}, h.CurrentVotes...) } if len(h.ParentVotes) > 0 { cpy.ParentVotes = append([]HeaderVote{}, h.ParentVotes...) } return &cpy } type Header_Version_0 struct { //Data ParentHash common.Hash `json:"parentHash" gencodec:"required"` Coinbase common.Address `json:"miner" gencodec:"required"` Licr c_type.LICr `json:"licr" gencodec:"required"` Root common.Hash `json:"stateRoot" gencodec:"required"` TxHash common.Hash `json:"transactionsRoot" gencodec:"required"` ReceiptHash common.Hash `json:"receiptsRoot" gencodec:"required"` Bloom Bloom `json:"logsBloom" gencodec:"required"` Difficulty *big.Int `json:"difficulty" gencodec:"required"` Number *big.Int `json:"number" gencodec:"required"` GasLimit uint64 `json:"gasLimit" gencodec:"required"` GasUsed uint64 `json:"gasUsed" gencodec:"required"` Time *big.Int `json:"timestamp" gencodec:"required"` Extra []byte `json:"extraData" gencodec:"required"` //POW MixDigest common.Hash `json:"mixHash" gencodec:"required"` Nonce BlockNonce `json:"nonce" gencodec:"required"` } type Header_Version_1 struct { //POS CurrentVotes []HeaderVote ParentVotes []HeaderVote } // DecodeRLP decodes the Ethereum func (b *Header) DecodeRLP(s *rlp.Stream) error { h0 := Header_Version_0{} h1 := Header_Version_1{} vs := vserial.NewVSerial() vs.Add(&h0, vserial.VERSION_0) vs.Add(&h1, vserial.VERSION_1) if e := s.Decode(&vs); e != nil { return e } b.ParentHash = h0.ParentHash b.Coinbase = h0.Coinbase b.Licr = h0.Licr b.Root = h0.Root b.TxHash = h0.TxHash b.ReceiptHash = h0.ReceiptHash b.Bloom = h0.Bloom b.Difficulty = h0.Difficulty b.Number = h0.Number b.GasLimit = h0.GasLimit b.GasUsed = h0.GasUsed b.Time = h0.Time b.Extra = h0.Extra b.MixDigest = h0.MixDigest b.Nonce = h0.Nonce b.CurrentVotes = h1.CurrentVotes b.ParentVotes = h1.ParentVotes return nil } // EncodeRLP serializes b into the Ethereum RLP block format. func (b *Header) EncodeRLP(w io.Writer) error { vs := vserial.NewVSerial() h0 := Header_Version_0{} h0.ParentHash = b.ParentHash h0.Coinbase = b.Coinbase h0.Licr = b.Licr h0.Root = b.Root h0.TxHash = b.TxHash h0.ReceiptHash = b.ReceiptHash h0.Bloom = b.Bloom h0.Difficulty = b.Difficulty h0.Number = b.Number h0.GasLimit = b.GasLimit h0.GasUsed = b.GasUsed h0.Time = b.Time h0.Extra = b.Extra h0.MixDigest = b.MixDigest h0.Nonce = b.Nonce vs.Add(&h0, vserial.VERSION_0) if len(b.CurrentVotes) > 0 || len(b.ParentVotes) > 0 { h1 := Header_Version_1{} h1.CurrentVotes = b.CurrentVotes h1.ParentVotes = b.ParentVotes vs.Add(&h1, vserial.VERSION_1) } return rlp.Encode(w, &vs) } ================================================ FILE: core/types/header_test.go ================================================ package types import ( "bufio" "bytes" "fmt" "testing" "github.com/sero-cash/go-sero/rlp" ) func TestRLP(t *testing.T) { buf := bytes.Buffer{} w := bufio.NewWriter(&buf) tx := Header{} tx.GasUsed = 10 tx.CurrentVotes = append(tx.CurrentVotes, HeaderVote{}) e := rlp.Encode(w, &tx) fmt.Println(e) w.Flush() dtx := Header{} stream := rlp.NewStream(&buf, uint64(buf.Len())) _, size, _ := stream.Kind() fmt.Println(size) e = stream.Decode(&dtx) fmt.Println(e) fmt.Println(dtx) } ================================================ FILE: core/types/log.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package types import ( "io" "github.com/sero-cash/go-sero/common/address" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/common/hexutil" "github.com/sero-cash/go-sero/rlp" ) //go:generate gencodec -type Log -field-override logMarshaling -out gen_log_json.go // Log represents a contract log event. These events are generated by the LOG opcode and // stored/indexed by the node. type Log struct { // Consensus fields: // address of the contract that generated the event Address common.Address `json:"address" gencodec:"required"` // list of topics provided by the contract. Topics []common.Hash `json:"topics" gencodec:"required"` // supplied by the contract, usually ABI-encoded Data []byte `json:"data" gencodec:"required"` // Derived fields. These fields are filled in by the node // but not secured by consensus. // block in which the transaction was included BlockNumber uint64 `json:"blockNumber"` // hash of the transaction TxHash common.Hash `json:"transactionHash" gencodec:"required"` // index of the transaction in the block TxIndex uint `json:"transactionIndex" gencodec:"required"` // hash of the block in which the transaction was included BlockHash common.Hash `json:"blockHash"` // index of the log in the receipt Index uint `json:"logIndex" gencodec:"required"` // The Removed field is true if this log was reverted due to a chain reorganisation. // You must pay attention to this field if you receive logs through a filter query. Removed bool `json:"removed"` } type logMarshaling struct { Data hexutil.Bytes BlockNumber hexutil.Uint64 TxIndex hexutil.Uint Index hexutil.Uint } type rlpLog struct { Address common.Address Topics []common.Hash Data []byte } type rlpStorageLog struct { Address common.Address Topics []common.Hash Data []byte BlockNumber uint64 TxHash common.Hash TxIndex uint BlockHash common.Hash Index uint } // EncodeRLP implements rlp.Encoder. func (l *Log) EncodeRLP(w io.Writer) error { return rlp.Encode(w, rlpLog{Address: l.Address, Topics: l.Topics, Data: l.Data}) } // DecodeRLP implements rlp.Decoder. func (l *Log) DecodeRLP(s *rlp.Stream) error { var dec rlpLog err := s.Decode(&dec) if err == nil { l.Address, l.Topics, l.Data = dec.Address, dec.Topics, dec.Data } return err } // LogForStorage is a wrapper around a Log that flattens and parses the entire content of // a log including non-consensus fields. type LogForStorage Log // EncodeRLP implements rlp.Encoder. func (l *LogForStorage) EncodeRLP(w io.Writer) error { return rlp.Encode(w, rlpStorageLog{ Address: l.Address, Topics: l.Topics, Data: l.Data, BlockNumber: l.BlockNumber, TxHash: l.TxHash, TxIndex: l.TxIndex, BlockHash: l.BlockHash, Index: l.Index, }) } // DecodeRLP implements rlp.Decoder. func (l *LogForStorage) DecodeRLP(s *rlp.Stream) error { var dec rlpStorageLog err := s.Decode(&dec) if err == nil { *l = LogForStorage{ Address: dec.Address, Topics: dec.Topics, Data: dec.Data, BlockNumber: dec.BlockNumber, TxHash: dec.TxHash, TxIndex: dec.TxIndex, BlockHash: dec.BlockHash, Index: dec.Index, } } return err } type Account struct { seed address.Seed } ================================================ FILE: core/types/receipt.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package types import ( "bytes" "fmt" "io" "unsafe" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/common/hexutil" "github.com/sero-cash/go-sero/rlp" ) //go:generate gencodec -type Receipt -field-override receiptMarshaling -out gen_receipt_json.go var ( receiptStatusFailedRLP = []byte{} receiptStatusSuccessfulRLP = []byte{0x01} ) const ( // ReceiptStatusFailed is the status code of a transaction if execution failed. ReceiptStatusFailed = uint64(0) // ReceiptStatusSuccessful is the status code of a transaction if execution succeeded. ReceiptStatusSuccessful = uint64(1) ) // Receipt represents the results of a transaction. type Receipt struct { // Consensus fields PostState []byte `json:"root"` Status uint64 `json:"status"` CumulativeGasUsed uint64 `json:"cumulativeGasUsed" gencodec:"required"` Bloom Bloom `json:"logsBloom" gencodec:"required"` Logs []*Log `json:"logs" gencodec:"required"` // Implementation fields (don't reorder!) TxHash common.Hash `json:"transactionHash" gencodec:"required"` ContractAddress common.Address `json:"contractAddress"` GasUsed uint64 `json:"gasUsed" gencodec:"required"` //Staking PoolId *common.Hash `rlp:"nil"` ShareId *common.Hash `rlp:"nil"` } type receiptMarshaling struct { PostState hexutil.Bytes Status hexutil.Uint64 CumulativeGasUsed hexutil.Uint64 GasUsed hexutil.Uint64 } // receiptRLP is the consensus encoding of a receipt. type receiptRLP struct { PostStateOrStatus []byte CumulativeGasUsed uint64 Bloom Bloom Logs []*Log } // NewReceipt creates a barebone transaction receipt, copying the init fields. func NewReceipt(root []byte, failed bool, cumulativeGasUsed uint64) *Receipt { r := &Receipt{PostState: common.CopyBytes(root), CumulativeGasUsed: cumulativeGasUsed} if failed { r.Status = ReceiptStatusFailed } else { r.Status = ReceiptStatusSuccessful } return r } // EncodeRLP implements rlp.Encoder, and flattens the consensus fields of a receipt // into an RLP stream. If no post state is present, byzantium fork is assumed. func (r *Receipt) EncodeRLP(w io.Writer) error { return rlp.Encode(w, &receiptRLP{r.statusEncoding(), r.CumulativeGasUsed, r.Bloom, r.Logs}) } // DecodeRLP implements rlp.Decoder, and loads the consensus fields of a receipt // from an RLP stream. func (r *Receipt) DecodeRLP(s *rlp.Stream) error { var dec receiptRLP if err := s.Decode(&dec); err != nil { return err } if err := r.setStatus(dec.PostStateOrStatus); err != nil { return err } r.CumulativeGasUsed, r.Bloom, r.Logs = dec.CumulativeGasUsed, dec.Bloom, dec.Logs return nil } func (r *Receipt) setStatus(postStateOrStatus []byte) error { switch { case bytes.Equal(postStateOrStatus, receiptStatusSuccessfulRLP): r.Status = ReceiptStatusSuccessful case bytes.Equal(postStateOrStatus, receiptStatusFailedRLP): r.Status = ReceiptStatusFailed case len(postStateOrStatus) == len(common.Hash{}): r.PostState = postStateOrStatus default: return fmt.Errorf("invalid receipt status %x", postStateOrStatus) } return nil } func (r *Receipt) statusEncoding() []byte { if len(r.PostState) == 0 { if r.Status == ReceiptStatusFailed { return receiptStatusFailedRLP } return receiptStatusSuccessfulRLP } return r.PostState } // Size returns the approximate memory used by all internal contents. It is used // to approximate and limit the memory consumption of various caches. func (r *Receipt) Size() common.StorageSize { size := common.StorageSize(unsafe.Sizeof(*r)) + common.StorageSize(len(r.PostState)) size += common.StorageSize(len(r.Logs)) * common.StorageSize(unsafe.Sizeof(Log{})) for _, log := range r.Logs { size += common.StorageSize(len(log.Topics)*common.HashLength + len(log.Data)) } return size } // Receipts is a wrapper around a Receipt array to implement DerivableList. type Receipts []*Receipt // Len returns the number of receipts in this list. func (r Receipts) Len() int { return len(r) } // GetRlp returns the RLP encoding of one receipt from the list. func (r Receipts) GetRlp(i int) []byte { bytes, err := rlp.EncodeToBytes(r[i]) if err != nil { panic(err) } return bytes } ================================================ FILE: core/types/receipt_rlp.go ================================================ package types import ( "io" "github.com/sero-cash/go-sero/core/types/vserial" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/rlp" ) type receiptForStorage_Version_0 struct { PostStateOrStatus []byte CumulativeGasUsed uint64 Bloom Bloom TxHash common.Hash ContractAddress common.Address Logs []*LogForStorage GasUsed uint64 } type receiptForStorage_Version_1 struct { PoolId *common.Hash `rlp:"nil"` ShareId *common.Hash `rlp:"nil"` } // ReceiptForStorage is a wrapper around a Receipt that flattens and parses the // entire content of a receipt, as opposed to only the consensus fields originally. type ReceiptForStorage Receipt // EncodeRLP implements rlp.Encoder, and flattens all content fields of a receipt // into an RLP stream. func (r *ReceiptForStorage) EncodeRLP(w io.Writer) error { vs := vserial.NewVSerial() { v0 := &receiptForStorage_Version_0{ PostStateOrStatus: (*Receipt)(r).statusEncoding(), CumulativeGasUsed: r.CumulativeGasUsed, Bloom: r.Bloom, TxHash: r.TxHash, ContractAddress: r.ContractAddress, Logs: make([]*LogForStorage, len(r.Logs)), GasUsed: r.GasUsed, } for i, log := range r.Logs { v0.Logs[i] = (*LogForStorage)(log) } vs.Add(&v0, vserial.VERSION_0) } if r.PoolId != nil || r.ShareId != nil { v1 := &receiptForStorage_Version_1{} v1.ShareId = r.ShareId v1.PoolId = r.PoolId vs.Add(&v1, vserial.VERSION_1) } return rlp.Encode(w, &vs) } // DecodeRLP implements rlp.Decoder, and loads both consensus and implementation // fields of a receipt from an RLP stream. func (r *ReceiptForStorage) DecodeRLP(s *rlp.Stream) error { var v0 receiptForStorage_Version_0 var v1 receiptForStorage_Version_1 vs := vserial.NewVSerial() vs.Add(&v0, vserial.VERSION_0) vs.Add(&v1, vserial.VERSION_1) if err := s.Decode(&vs); err != nil { return err } if err := (*Receipt)(r).setStatus(v0.PostStateOrStatus); err != nil { return err } { // Assign the consensus fields r.CumulativeGasUsed = v0.CumulativeGasUsed r.Bloom = v0.Bloom r.Logs = make([]*Log, len(v0.Logs)) for i, log := range v0.Logs { r.Logs[i] = (*Log)(log) } // Assign the implementation fields r.TxHash = v0.TxHash r.ContractAddress = v0.ContractAddress r.GasUsed = v0.GasUsed } { r.PoolId = v1.PoolId r.ShareId = v1.ShareId } return nil } ================================================ FILE: core/types/share.go ================================================ package types import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/crypto/sha3" "github.com/sero-cash/go-sero/rlp" ) type Lottery struct { ParentHash common.Hash ParentNum uint64 PosHash common.Hash } type Vote struct { Idx uint32 ParentNum uint64 ShareId common.Hash PosHash common.Hash IsPool bool Sign c_type.Uint512 } func (s Vote) Hash() common.Hash { hw := sha3.NewKeccak256() hash := common.Hash{} rlp.Encode(hw, []interface{}{ s.Idx, s.ParentNum, s.ShareId, s.PosHash, s.IsPool, s.Sign, }) hw.Sum(hash[:0]) return hash } type HeaderVote struct { Id common.Hash IsPool bool Sign c_type.Uint512 } ================================================ FILE: core/types/transaction.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package types import ( "math/big" "sync/atomic" //"github.com/sero-cash/go-sero/zero/light" "github.com/sero-cash/go-sero/zero/txs/pkg" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/txs/assets" "container/heap" "io" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/common/hexutil" "github.com/sero-cash/go-sero/rlp" zstx "github.com/sero-cash/go-sero/zero/txs/stx" ztx "github.com/sero-cash/go-sero/zero/txs/tx" "github.com/sero-cash/go-sero/zero/utils" ) //go:generate gencodec -type txdata -field-override txdataMarshaling -out gen_tx_json.go //go:generate gencodec -type txdata -field-override txdataMarshaling -out gen_tx_json.go type Transaction struct { data txdata // caches hash atomic.Value size atomic.Value } type txdata struct { Price *big.Int `json:"gasPrice" gencodec:"required"` GasLimit uint64 `json:"gas" gencodec:"required"` Payload []byte `json:"input" gencodec:"required"` Stxt *zstx.T `json:"stxt" gencodec:"required"` } type txdataMarshaling struct { Price *hexutil.Big GasLimit hexutil.Uint64 Payload hexutil.Bytes Stxt *zstx.T } func NewTransaction(gasPrice *big.Int, gasLimit uint64, data []byte) *Transaction { if len(data) > 0 { data = common.CopyBytes(data) } d := txdata{ Payload: data, Price: new(big.Int), GasLimit: gasLimit, } if gasPrice != nil { d.Price.Set(gasPrice) } tx := &Transaction{data: d} return tx } func Ehash(price big.Int, gasLimit uint64, payload []byte) c_type.Uint256 { h := rlpHash([]interface{}{ price, gasLimit, payload, }) r := c_type.Uint256{} copy(r[:], h[:]) return r } func (tx Transaction) Ehash() c_type.Uint256 { h := rlpHash([]interface{}{ &tx.data.Price, tx.data.GasLimit, tx.data.Payload, }) r := c_type.Uint256{} copy(r[:], h[:]) return r } func NewTxt(fromRnd *c_type.Uint256, ehash c_type.Uint256, fee assets.Token, out *ztx.Out, pkgCreate *ztx.PkgCreate, pkgTransfer *ztx.PkgTransfer, pkgClose *ztx.PkgClose) *ztx.T { outDatas := []ztx.Out{} if out != nil { outDatas = append(outDatas, *out) } txt := &ztx.T{ FromRnd: fromRnd, Ehash: ehash, Fee: fee, Outs: outDatas, PkgCreate: pkgCreate, PkgTransfer: pkgTransfer, PkgClose: pkgClose, } return txt } func NewTxWithGTx(gas uint64, gasPrice *big.Int, t *zstx.T) *Transaction { d := txdata{ Price: gasPrice, GasLimit: gas, Stxt: t, } tx := &Transaction{data: d} return tx } func NewTxtOut(Pkr c_type.PKr, currency string, value *big.Int, catg string, tkt *common.Hash, memo string, isZ bool) *ztx.Out { var token *assets.Token var ticket *assets.Ticket var outData *ztx.Out if value != nil { token = &assets.Token{ Currency: *(common.BytesToHash(common.LeftPadBytes([]byte(currency), 32)).HashToUint256()), Value: *utils.U256(*value).ToRef(), } } if tkt != nil { ticket = &assets.Ticket{ Category: *(common.BytesToHash(common.LeftPadBytes([]byte(catg), 32)).HashToUint256()), Value: *tkt.HashToUint256(), } } asset := assets.Asset{ Tkn: token, Tkt: ticket, } outData = &ztx.Out{ Addr: Pkr, Asset: asset, Memo: stringToUint512(memo), IsZ: isZ, } return outData } func stringToUint512(str string) c_type.Uint512 { var ret c_type.Uint512 b := []byte(str) if len(b) > len(ret) { b = b[len(b)-len(ret):] } copy(ret[len(ret)-len(b):], b) return ret } func NewCreatePkg(Pkr c_type.PKr, currency string, value *big.Int, catg string, tkt *common.Hash, memo string) *ztx.PkgCreate { var token *assets.Token var ticket *assets.Ticket if value != nil { token = &assets.Token{ Currency: *(common.BytesToHash(common.LeftPadBytes([]byte(currency), 32)).HashToUint256()), Value: *utils.U256(*value).ToRef(), } } if tkt != nil { ticket = &assets.Ticket{ Category: *(common.BytesToHash(common.LeftPadBytes([]byte(catg), 32)).HashToUint256()), Value: *tkt.HashToUint256(), } } asset := assets.Asset{ Tkn: token, Tkt: ticket, } pkg := pkg.Pkg_O{ Asset: asset, Memo: stringToUint512(memo), } return &ztx.PkgCreate{ Id: c_type.RandUint256(), PKr: Pkr, Pkg: pkg, } } func (tx *Transaction) Pkg() *assets.Asset { return tx.GetZZSTX().ContractAsset() } // EncodeRLP implements rlp.Encoder func (tx *Transaction) EncodeRLP(w io.Writer) error { return rlp.Encode(w, &tx.data) } // DecodeRLP implements rlp.Decoder func (tx *Transaction) DecodeRLP(s *rlp.Stream) error { _, size, _ := s.Kind() err := s.Decode(&tx.data) if err == nil { tx.size.Store(common.StorageSize(rlp.ListSize(size))) } return err } // MarshalJSON encodes the web3 RPC transaction format. func (tx *Transaction) MarshalJSON() ([]byte, error) { //hash := tx.Hash() data := tx.data //data.Hash = &hash return data.MarshalJSON() } // UnmarshalJSON decodes the web3 RPC transaction format. func (tx *Transaction) UnmarshalJSON(input []byte) error { var dec txdata if err := dec.UnmarshalJSON(input); err != nil { return err } *tx = Transaction{data: dec} return nil } func (tx *Transaction) Data() []byte { if tx.GetZZSTX().Desc_Cmd.Contract != nil { return common.CopyBytes(tx.GetZZSTX().Desc_Cmd.Contract.Data) } else { return common.CopyBytes(tx.data.Payload) } } func (tx *Transaction) Gas() uint64 { return tx.data.GasLimit } func (tx *Transaction) GasPrice() *big.Int { return new(big.Int).Set(tx.data.Price) } func (tx *Transaction) GetZZSTX() *zstx.T { return tx.data.Stxt } func (tx *Transaction) To() *common.Address { if pkr := tx.GetZZSTX().ContractAddress(); pkr != nil { addr := &common.Address{} copy(addr[:], pkr[:]) return addr } else { return nil } } func (tx Transaction) IsOpContract() bool { return tx.GetZZSTX().IsOpContract() } func (tx *Transaction) Stxt() *zstx.T { return tx.data.Stxt } func (tx *Transaction) From() common.Address { return common.BytesToAddress(tx.data.Stxt.From[:]) } // Hash hashes the RLP encoding of tx. // It uniquely identifies the transaction. func (tx *Transaction) Hash() common.Hash { if hash := tx.hash.Load(); hash != nil { return hash.(common.Hash) } v := tx.data.Stxt.ToHash() var hashv common.Hash copy(hashv[:], v[:]) tx.hash.Store(hashv) return hashv } // Size returns the true RLP encoded storage size of the transaction, either by // encoding and returning it, or returning a previsouly cached value. func (tx *Transaction) Size() common.StorageSize { if size := tx.size.Load(); size != nil { return size.(common.StorageSize) } c := writeCounter(0) //rlpData := []interface{}{tx.data.Payload, tx.data.Price} rlp.Encode(&c, &tx.data) tx.size.Store(common.StorageSize(c)) return common.StorageSize(c) } // AsMessage returns the transaction as a core.Message. func (tx *Transaction) AsMessage() (Message, error) { msg := Message{ from: tx.From(), gasPrice: new(big.Int).Set(tx.data.Price), to: tx.To(), data: tx.Data(), asset: tx.Pkg(), fee: tx.Stxt().Fee, txHash: tx.Hash(), } return msg, nil } func (tx *Transaction) WithEncrypt(stxt *zstx.T) (*Transaction, error) { cpy := &Transaction{data: tx.data} cpy.data.Stxt = stxt return cpy, nil } func (tx *Transaction) RawEncrptyValue() *zstx.T { return tx.data.Stxt } // Transactions is a Transaction slice type for basic sorting. type Transactions []*Transaction // Len returns the length of s. func (s Transactions) Len() int { return len(s) } // Swap swaps the i'th and the j'th element in s. func (s Transactions) Swap(i, j int) { s[i], s[j] = s[j], s[i] } // GetRlp implements Rlpable and returns the i'th element of s in rlp. func (s Transactions) GetRlp(i int) []byte { enc, _ := rlp.EncodeToBytes(s[i]) return enc } // TxDifference returns a new set which is the difference between a and b. func TxDifference(a, b Transactions) Transactions { keep := make(Transactions, 0, len(a)) remove := make(map[common.Hash]struct{}) for _, tx := range b { remove[tx.Hash()] = struct{}{} } for _, tx := range a { if _, ok := remove[tx.Hash()]; !ok { keep = append(keep, tx) } } return keep } // TxByPrice implements both the sort and the heap interface, making it useful // for all at once sorting as well as individually adding and removing elements. type TxByPrice Transactions func (s TxByPrice) Len() int { return len(s) } func (s TxByPrice) Less(i, j int) bool { return s[i].data.Price.Cmp(s[j].data.Price) > 0 } func (s TxByPrice) Swap(i, j int) { if i < 0 || j < 0 { return } s[i], s[j] = s[j], s[i] } func (s *TxByPrice) Push(x interface{}) { *s = append(*s, x.(*Transaction)) } func (s *TxByPrice) Pop() interface{} { if s.Len() < 1 { return nil } old := *s n := len(old) x := old[n-1] *s = old[0 : n-1] return x } // TransactionsByPriceAndNonce represents a set of transactions that can return // transactions in a profit-maximizing sorted order, while supporting removing // entire batches of transactions for non-executable accounts. type TransactionsByPrice struct { txs map[common.Address]Transactions // Per account nonce-sorted list of transactions heads TxByPrice // Next transaction for each unique account (price heap) } // NewTransactionsByPriceAndNonce creates a transaction set that can retrieve // price sorted transactions in a nonce-honouring way. // // Note, the input map is reowned so the caller should not interact any more with // if after providing it to the constructor. func NewTransactionsByPrice(txs Transactions) *TransactionsByPrice { // Initialize a price based heap with the head transactions heads := make(TxByPrice, 0, len(txs)) for _, tx := range txs { heads = append(heads, tx) } heap.Init(&heads) // Assemble and return the transaction set return &TransactionsByPrice{ heads: heads, } } //// Peek returns the next transaction by price. func (t *TransactionsByPrice) Peek() *Transaction { if len(t.heads) == 0 { return nil } return t.heads[0] } // Shift replaces the current best head with the next one from the same account. func (t *TransactionsByPrice) Shift() { acc := t.heads[0].From() if txs, ok := t.txs[acc]; ok && len(txs) > 0 { t.heads[0], t.txs[acc] = txs[0], txs[1:] heap.Fix(&t.heads, 0) } else { heap.Pop(&t.heads) } } // Pop removes the best transaction, *not* replacing it with the next one from // the same account. This should be used when a transaction cannot be executed // and hence all subsequent ones should be discarded from the same account. func (t *TransactionsByPrice) Pop() *Transaction { transaction := heap.Pop(&t.heads) if transaction == nil { return nil } return transaction.(*Transaction) } // Message is a fully derived transaction and implements core.Message // // NOTE: In a future PR this will be removed. type Message struct { to *common.Address from common.Address nonce uint64 asset *assets.Asset fee assets.Token gasPrice *big.Int data []byte txHash common.Hash } func NewMessage(from common.Address, to *common.Address, nonce uint64, asset assets.Asset, fee assets.Token, gasPrice *big.Int, data []byte) Message { message := Message{ from: from, to: to, nonce: nonce, fee: fee, gasPrice: gasPrice, data: data, asset: &asset, } return message } func (m Message) From() common.Address { return m.from } func (m Message) To() *common.Address { return m.to } func (m Message) GasPrice() *big.Int { return m.gasPrice } func (m Message) Data() []byte { return m.data } func (m Message) Fee() assets.Token { return m.fee } func (m Message) Asset() *assets.Asset { return m.asset } func (m Message) TxHash() common.Hash { return m.txHash } ================================================ FILE: core/types/transaction_test.go ================================================ package types import ( "encoding/json" "fmt" "math/big" "testing" "github.com/sero-cash/go-sero/common/hexutil" ) type Uint256 [32]byte func TestRLPEhash(t *testing.T) { var testByte [32]byte var testByte1 Uint256 bt := big.NewInt(34).Bytes() copy(testByte[:], bt[:]) copy(testByte1[:], bt[:]) h1 := rlpHash([]interface{}{ testByte, }) h2 := rlpHash([]interface{}{ testByte1, }) fmt.Printf("%v\n", h1) fmt.Printf("%v\n", h2) } func TestEhash(t *testing.T) { price := big.NewInt(40) gasLimit := uint64(22) h1 := rlpHash([]interface{}{ *price, gasLimit, }) h2 := rlpHash([]interface{}{ &price, gasLimit, }) h3 := rlpHash([]interface{}{ price, gasLimit, []byte{}, }) if h3 != h2 && h2 != h1 { t.Errorf("Ehash must be the right type") } fmt.Printf("%v\n", h1) fmt.Printf("%v\n", hexutil.Encode(h2[:])) fmt.Printf("%v\n", hexutil.Encode(h3[:])) } type XX struct { A *big.Int } type st struct { Cmd XX } func TestJson(t *testing.T) { jsonStr := `{"cmd":null}` var s st err := json.Unmarshal([]byte(jsonStr), &s) if err != nil { fmt.Println(err) } b, _ := json.Marshal(s) fmt.Println(string(b)) } ================================================ FILE: core/types/vserial/rlp.go ================================================ package vserial import ( "errors" "io" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/rlp" ) type VersionType int8 const ( VERSION_NIL = VersionType(-1) VERSION_0 = VersionType(0) VERSION_1 = VersionType(1) VERSION_2 = VersionType(2) ) type Version struct { V VersionType } type vSerial struct { versions []interface{} v Version } func NewVSerial() (ret vSerial) { ret.v.V = VERSION_NIL return } func (self *vSerial) V() VersionType { return self.v.V } func (self *vSerial) Add(data interface{}, ver VersionType) { if ver <= self.v.V { panic(errors.New("vserial add version error")) } self.v.V = ver self.versions = append(self.versions, data) } func (self *vSerial) DecodeRLP(s *rlp.Stream) error { _, size, _ := s.Kind() if size == 0 { self.v.V = VERSION_NIL } else { if size > 10 { self.v.V = VERSION_0 } else { if e := s.Decode(&self.v); e != nil { return e } } } if int(self.v.V) >= len(self.versions) { log.Error("VSerial DecodeRLP ERROR: version num is error", "version", self.v.V, "len", len(self.versions)) return errors.New("VSerial DecodeRLP ERROR: version num is error") } if self.v.V == VERSION_NIL { if e := s.Decode(self.versions[0]); e != nil { return e } } else { if self.v.V <= VERSION_1 { for i := 0; i <= int(self.v.V); i++ { if e := s.Decode(self.versions[i]); e != nil { return e } } } else { if e := s.Decode(self.versions[self.v.V]); e != nil { return e } } } return nil } func (self *vSerial) EncodeRLP(w io.Writer) error { if self.v.V == VERSION_NIL { e := errors.New("encode header rlp error: version is nil") panic(e) return e } if self.v.V >= VERSION_1 { if e := rlp.Encode(w, &self.v); e != nil { return e } } if self.v.V <= VERSION_1 { for _, it := range self.versions { if e := rlp.Encode(w, it); e != nil { return e } } } else { if e := rlp.Encode(w, self.versions[len(self.versions)-1]); e != nil { return e } } return nil } ================================================ FILE: core/types.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package core import ( "github.com/sero-cash/go-sero/core/state" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/core/vm" ) // Validator is an interface which defines the standard for block validation. It // is only responsible for validating block contents, as the header validation is // done by the specific consensus engines. // type Validator interface { // ValidateBody validates the given block's content. ValidateBody(block *types.Block) error // ValidateState validates the given statedb and optionally the receipts and // gas used. ValidateState(block, parent *types.Block, state *state.StateDB, receipts types.Receipts, usedGas uint64) error } // Processor is an interface for processing blocks using a given initial state. // // Process takes the block to be processed and the statedb upon which the // initial state is based. It should return the receipts generated, amount // of gas used in the process and return an error if any of the internal rules // failed. type Processor interface { Process(block *types.Block, statedb *state.StateDB, cfg vm.Config) (types.Receipts, []*types.Log, uint64, error) } ================================================ FILE: core/vm/analysis.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package vm import ( "math/big" "github.com/sero-cash/go-sero/common" ) // destinations stores one map per contract (keyed by hash of code). // The maps contain an entry for each location of a JUMPDEST // instruction. type destinations map[common.Hash]bitvec // has checks whether code has a JUMPDEST at dest. func (d destinations) has(codehash common.Hash, code []byte, dest *big.Int) bool { // PC cannot go beyond len(code) and certainly can't be bigger than 63bits. // Don't bother checking for JUMPDEST in that case. udest := dest.Uint64() if dest.BitLen() >= 63 || udest >= uint64(len(code)) { return false } m, analysed := d[codehash] if !analysed { m = codeBitmap(code) d[codehash] = m } return OpCode(code[udest]) == JUMPDEST && m.codeSegment(udest) } // bitvec is a bit vector which maps bytes in a program. // An unset bit means the byte is an opcode, a set bit means // it's data (i.e. argument of PUSHxx). type bitvec []byte func (bits *bitvec) set(pos uint64) { (*bits)[pos/8] |= 0x80 >> (pos % 8) } func (bits *bitvec) set8(pos uint64) { (*bits)[pos/8] |= 0xFF >> (pos % 8) (*bits)[pos/8+1] |= ^(0xFF >> (pos % 8)) } // codeSegment checks if the position is in a code segment. func (bits *bitvec) codeSegment(pos uint64) bool { return ((*bits)[pos/8] & (0x80 >> (pos % 8))) == 0 } // codeBitmap collects data locations in code. func codeBitmap(code []byte) bitvec { // The bitmap is 4 bytes longer than necessary, in case the code // ends with a PUSH32, the algorithm will push zeroes onto the // bitvector outside the bounds of the actual code. bits := make(bitvec, len(code)/8+1+4) for pc := uint64(0); pc < uint64(len(code)); { op := OpCode(code[pc]) if op >= PUSH1 && op <= PUSH32 { numbits := op - PUSH1 + 1 pc++ for ; numbits >= 8; numbits -= 8 { bits.set8(pc) // 8 pc += 8 } for ; numbits > 0; numbits-- { bits.set(pc) pc++ } } else { pc++ } } return bits } ================================================ FILE: core/vm/analysis_test.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package vm import "testing" func TestJumpDestAnalysis(t *testing.T) { tests := []struct { code []byte exp byte which int }{ {[]byte{byte(PUSH1), 0x01, 0x01, 0x01}, 0x40, 0}, {[]byte{byte(PUSH1), byte(PUSH1), byte(PUSH1), byte(PUSH1)}, 0x50, 0}, {[]byte{byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), 0x01, 0x01, 0x01}, 0x7F, 0}, {[]byte{byte(PUSH8), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x80, 1}, {[]byte{0x01, 0x01, 0x01, 0x01, 0x01, byte(PUSH2), byte(PUSH2), byte(PUSH2), 0x01, 0x01, 0x01}, 0x03, 0}, {[]byte{0x01, 0x01, 0x01, 0x01, 0x01, byte(PUSH2), 0x01, 0x01, 0x01, 0x01, 0x01}, 0x00, 1}, {[]byte{byte(PUSH3), 0x01, 0x01, 0x01, byte(PUSH1), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x74, 0}, {[]byte{byte(PUSH3), 0x01, 0x01, 0x01, byte(PUSH1), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x00, 1}, {[]byte{0x01, byte(PUSH8), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x3F, 0}, {[]byte{0x01, byte(PUSH8), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0xC0, 1}, {[]byte{byte(PUSH16), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x7F, 0}, {[]byte{byte(PUSH16), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0xFF, 1}, {[]byte{byte(PUSH16), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x80, 2}, {[]byte{byte(PUSH8), 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, byte(PUSH1), 0x01}, 0x7f, 0}, {[]byte{byte(PUSH8), 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, byte(PUSH1), 0x01}, 0xA0, 1}, {[]byte{byte(PUSH32)}, 0x7F, 0}, {[]byte{byte(PUSH32)}, 0xFF, 1}, {[]byte{byte(PUSH32)}, 0xFF, 2}, } for _, test := range tests { ret := codeBitmap(test.code) if ret[test.which] != test.exp { t.Fatalf("expected %x, got %02x", test.exp, ret[test.which]) } } } ================================================ FILE: core/vm/common.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package vm import ( "math/big" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/common/math" ) // calculates the memory size required for a step func calcMemSize(off, l *big.Int) *big.Int { if l.Sign() == 0 { return common.Big0 } return new(big.Int).Add(off, l) } // getData returns a slice from the data based on the start and size and pads // up to size with zero's. This function is overflow safe. func getData(data []byte, start uint64, size uint64) []byte { length := uint64(len(data)) if start > length { start = length } end := start + size if end > length { end = length } return common.RightPadBytes(data[start:end], int(size)) } // getDataBig returns a slice from the data based on the start and size and pads // up to size with zero's. This function is overflow safe. func getDataBig(data []byte, start *big.Int, size *big.Int) []byte { dlen := big.NewInt(int64(len(data))) s := math.BigMin(start, dlen) e := math.BigMin(new(big.Int).Add(s, size), dlen) return common.RightPadBytes(data[s.Uint64():e.Uint64()], int(size.Uint64())) } // bigUint64 returns the integer casted to a uint64 and returns whether it // overflowed in the process. func bigUint64(v *big.Int) (uint64, bool) { return v.Uint64(), v.BitLen() > 64 } // toWordSize returns the ceiled word size required for memory expansion. func toWordSize(size uint64) uint64 { if size > math.MaxUint64-31 { return math.MaxUint64/32 + 1 } return (size + 31) / 32 } func allZero(b []byte) bool { for _, byte := range b { if byte != 0 { return false } } return true } ================================================ FILE: core/vm/contract.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package vm import ( "math/big" "strings" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/zero/txs/assets" ) // ContractRef is a reference to the contract's backing object type ContractRef interface { Address() common.Address } // AccountRef implements ContractRef. // // AccountAddress references are used during EVM initialisation and // it's primary use is to fetch addresses. Removing this object // proves difficult because of the cached jump destinations which // are fetched from the parent contract (i.e. the caller), which // is a ContractRef. type AccountRef common.Address // Data casts AccountRef to a Data func (ar AccountRef) Address() common.Address { return (common.Address)(ar) } // Contract represents an ethereum contract in the state database. It contains // the the contract code, calling arguments. Contract implements ContractRef type Contract struct { // CallerAddress is the result of the caller which initialised this // contract. However when the "call method" is delegated this value // needs to be initialised to that of the caller's caller. CallerAddress common.Address caller ContractRef self ContractRef //nonceAddres map[common.Data][64]byte jumpdests destinations // result of JUMPDEST analysis. Code []byte CodeHash common.Hash CodeAddr *common.Address Input []byte Gas uint64 asset *assets.Asset Args []byte DelegateCall bool addrs map[common.ContractAddress]common.Address //currency string callMsg *assets.Asset } // NewContract returns a new contract environment for the execution of EVM. func NewContract(caller ContractRef, object ContractRef, asset *assets.Asset, gas uint64) *Contract { c := &Contract{CallerAddress: caller.Address(), caller: caller, self: object, Args: nil} c.addrs = map[common.ContractAddress]common.Address{} c.addrs[caller.Address().ToCaddr()] = caller.Address() c.addrs[object.Address().ToCaddr()] = object.Address() if parent, ok := caller.(*Contract); ok { // Reuse JUMPDEST analysis from parent context if available. c.jumpdests = parent.jumpdests } else { c.jumpdests = make(destinations) } // Gas should be a pointer so it can safely be reduced through the run // This pointer will be off the state transition c.Gas = gas // ensures a value is set c.asset = asset return c } func (c *Contract) SetCallMsg(callMsg *assets.Asset) { c.callMsg = callMsg } func (c *Contract) GetCallMsg() *assets.Asset { return c.callMsg } func (c *Contract) PutNonceAddress(statedb StateDB, addr common.Address) { caddress := addr.ToCaddr() c.addrs[caddress] = addr statedb.AddNonceAddress(caddress[:], addr) } func (c *Contract) GetNonceAddress(statedb StateDB, addr common.ContractAddress) common.Address { if addresses, ok := c.addrs[addr]; ok { return addresses } return statedb.GetNonceAddress(addr[:]) } // AsDelegate sets the contract to be a delegate call and returns the current // contract (for chaining calls) func (c *Contract) AsDelegate() *Contract { c.DelegateCall = true // NOTE: caller must, at all times be a contract. It should never happen // that caller is something other than a Contract. parent := c.caller.(*Contract) c.CallerAddress = parent.CallerAddress c.asset = parent.asset return c } // GetOp returns the n'th element in the contract's byte array func (c *Contract) GetOp(n uint64) OpCode { return OpCode(c.GetByte(n)) } // GetByte returns the n'th byte in the contract's byte array func (c *Contract) GetByte(n uint64) byte { if n < uint64(len(c.Code)) { return c.Code[n] } return 0 } // Caller returns the caller of the contract. // // Caller will recursively call caller when the contract is a delegate // call, including that of caller's caller. func (c *Contract) Caller() common.Address { return c.CallerAddress } // UseGas attempts the use gas and subtracts it and returns true on success func (c *Contract) UseGas(gas uint64) (ok bool) { if c.Gas < gas { return false } c.Gas -= gas return true } // Data returns the contracts address func (c *Contract) Address() common.Address { return c.self.Address() } // Value returns the contracts value (sent to it from it's caller) func (c *Contract) Value() *big.Int { if c.asset != nil && c.asset.Tkn != nil { value := big.Int(c.asset.Tkn.Value) return &value } else { return new(big.Int) } } func (c *Contract) Currency() string { if c.asset != nil && c.asset.Tkn != nil { return strings.TrimSpace(string(c.asset.Tkn.Currency[:])) } else { return "SERO" } } // SetCode sets the code to the contract func (c *Contract) SetCode(hash common.Hash, code []byte) { c.Code = code c.CodeHash = hash } // SetCallCode sets the code of the contract and address of the backing data // object func (c *Contract) SetCallCode(addr *common.Address, hash common.Hash, code []byte) { c.Code = code c.CodeHash = hash c.CodeAddr = addr } ================================================ FILE: core/vm/contracts.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package vm import "math/big" var ( //big1 = big.NewInt(1) //big4 = big.NewInt(4) //big8 = big.NewInt(8) //big16 = big.NewInt(16) big32 = big.NewInt(32) //big64 = big.NewInt(64) //big96 = big.NewInt(96) //big480 = big.NewInt(480) //big1024 = big.NewInt(1024) //big3072 = big.NewInt(3072) //big199680 = big.NewInt(199680) ) /* import ( "crypto/sha256" "errors" "math/big" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/common/math" "github.com/sero-cash/go-sero/crypto" "github.com/sero-cash/go-sero/crypto/bn256" "github.com/sero-cash/go-sero/params" "golang.org/x/crypto/ripemd160" ) // PrecompiledContract is the basic interface for native Go contracts. The implementation // requires a deterministic gas count based on the input size of the Run method of the // contract. type PrecompiledContract interface { RequiredGas(input []byte) uint64 // RequiredPrice calculates the contract gas use Run(input []byte) ([]byte, error) // Run runs the precompiled contract } // PrecompiledContractsAutumnTwilight contains the default set of pre-compiled Sero // contracts used in the AutumnTwilight release. var PrecompiledContractsAutumnTwilight = map[common.Address]PrecompiledContract{ //common.BytesToAddress([]byte{1}): &ecrecover{}, //common.BytesToAddress([]byte{2}): &sha256hash{}, //common.BytesToAddress([]byte{3}): &ripemd160hash{}, //common.BytesToAddress([]byte{4}): &dataCopy{}, //common.BytesToAddress([]byte{5}): &bigModExp{}, //common.BytesToAddress([]byte{6}): &bn256Add{}, //common.BytesToAddress([]byte{7}): &bn256ScalarMul{}, //common.BytesToAddress([]byte{8}): &bn256Pairing{}, } // RunPrecompiledContract runs and evaluates the output of a precompiled contract. func RunPrecompiledContract(p PrecompiledContract, input []byte, contract *Contract) (ret []byte, err error) { gas := p.RequiredGas(input) if contract.UseGas(gas) { return p.Run(input) } return nil, ErrOutOfGas } // ECRECOVER implemented as a native contract. type ecrecover struct{} func (c *ecrecover) RequiredGas(input []byte) uint64 { return params.EcrecoverGas } func (c *ecrecover) Run(input []byte) ([]byte, error) { const ecRecoverInputLength = 128 input = common.RightPadBytes(input, ecRecoverInputLength) // "input" is (hash, v, r, s), each 32 bytes // but for ecrecover we want (r, s, v) r := new(big.Int).SetBytes(input[64:96]) s := new(big.Int).SetBytes(input[96:128]) v := input[63] - 27 // tighter sig s values input homestead only apply to tx sigs if !allZero(input[32:63]) || !crypto.ValidateSignatureValues(v, r, s, false) { return nil, nil } // v needs to be at the end for libsecp256k1 pubKey, err := crypto.Ecrecover(input[:32], append(input[64:128], v)) // make sure the public key is a valid one if err != nil { return nil, nil } // the first byte of pubkey is bitcoin heritage return common.LeftPadBytes(crypto.Keccak256(pubKey[1:])[12:], 32), nil } // SHA256 implemented as a native contract. type sha256hash struct{} // RequiredGas returns the gas required to execute the pre-compiled contract. // // This method does not require any overflow checking as the input size gas costs // required for anything significant is so high it's impossible to pay for. func (c *sha256hash) RequiredGas(input []byte) uint64 { return uint64(len(input)+31)/32*params.Sha256PerWordGas + params.Sha256BaseGas } func (c *sha256hash) Run(input []byte) ([]byte, error) { h := sha256.Sum256(input) return h[:], nil } // RIPEMD160 implemented as a native contract. type ripemd160hash struct{} // RequiredGas returns the gas required to execute the pre-compiled contract. // // This method does not require any overflow checking as the input size gas costs // required for anything significant is so high it's impossible to pay for. func (c *ripemd160hash) RequiredGas(input []byte) uint64 { return uint64(len(input)+31)/32*params.Ripemd160PerWordGas + params.Ripemd160BaseGas } func (c *ripemd160hash) Run(input []byte) ([]byte, error) { ripemd := ripemd160.New() ripemd.Write(input) return common.LeftPadBytes(ripemd.Sum(nil), 32), nil } // data copy implemented as a native contract. type dataCopy struct{} // RequiredGas returns the gas required to execute the pre-compiled contract. // // This method does not require any overflow checking as the input size gas costs // required for anything significant is so high it's impossible to pay for. func (c *dataCopy) RequiredGas(input []byte) uint64 { return uint64(len(input)+31)/32*params.IdentityPerWordGas + params.IdentityBaseGas } func (c *dataCopy) Run(in []byte) ([]byte, error) { return in, nil } // bigModExp implements a native big integer exponential modular operation. type bigModExp struct{} var ( big1 = big.NewInt(1) big4 = big.NewInt(4) big8 = big.NewInt(8) big16 = big.NewInt(16) big32 = big.NewInt(32) big64 = big.NewInt(64) big96 = big.NewInt(96) big480 = big.NewInt(480) big1024 = big.NewInt(1024) big3072 = big.NewInt(3072) big199680 = big.NewInt(199680) ) // RequiredGas returns the gas required to execute the pre-compiled contract. func (c *bigModExp) RequiredGas(input []byte) uint64 { var ( baseLen = new(big.Int).SetBytes(getData(input, 0, 32)) expLen = new(big.Int).SetBytes(getData(input, 32, 32)) modLen = new(big.Int).SetBytes(getData(input, 64, 32)) ) if len(input) > 96 { input = input[96:] } else { input = input[:0] } // Retrieve the head 32 bytes of exp for the adjusted exponent length var expHead *big.Int if big.NewInt(int64(len(input))).Cmp(baseLen) <= 0 { expHead = new(big.Int) } else { if expLen.Cmp(big32) > 0 { expHead = new(big.Int).SetBytes(getData(input, baseLen.Uint64(), 32)) } else { expHead = new(big.Int).SetBytes(getData(input, baseLen.Uint64(), expLen.Uint64())) } } // Calculate the adjusted exponent length var msb int if bitlen := expHead.BitLen(); bitlen > 0 { msb = bitlen - 1 } adjExpLen := new(big.Int) if expLen.Cmp(big32) > 0 { adjExpLen.Sub(expLen, big32) adjExpLen.Mul(big8, adjExpLen) } adjExpLen.Add(adjExpLen, big.NewInt(int64(msb))) // Calculate the gas cost of the operation gas := new(big.Int).Set(math.BigMax(modLen, baseLen)) switch { case gas.Cmp(big64) <= 0: gas.Mul(gas, gas) case gas.Cmp(big1024) <= 0: gas = new(big.Int).Add( new(big.Int).Div(new(big.Int).Mul(gas, gas), big4), new(big.Int).Sub(new(big.Int).Mul(big96, gas), big3072), ) default: gas = new(big.Int).Add( new(big.Int).Div(new(big.Int).Mul(gas, gas), big16), new(big.Int).Sub(new(big.Int).Mul(big480, gas), big199680), ) } gas.Mul(gas, math.BigMax(adjExpLen, big1)) gas.Div(gas, new(big.Int).SetUint64(params.ModExpQuadCoeffDiv)) if gas.BitLen() > 64 { return math.MaxUint64 } return gas.Uint64() } func (c *bigModExp) Run(input []byte) ([]byte, error) { var ( baseLen = new(big.Int).SetBytes(getData(input, 0, 32)).Uint64() expLen = new(big.Int).SetBytes(getData(input, 32, 32)).Uint64() modLen = new(big.Int).SetBytes(getData(input, 64, 32)).Uint64() ) if len(input) > 96 { input = input[96:] } else { input = input[:0] } // Handle a special case when both the base and mod length is zero if baseLen == 0 && modLen == 0 { return []byte{}, nil } // Retrieve the operands and execute the exponentiation var ( base = new(big.Int).SetBytes(getData(input, 0, baseLen)) exp = new(big.Int).SetBytes(getData(input, baseLen, expLen)) mod = new(big.Int).SetBytes(getData(input, baseLen+expLen, modLen)) ) if mod.BitLen() == 0 { // Modulo 0 is undefined, return zero return common.LeftPadBytes([]byte{}, int(modLen)), nil } return common.LeftPadBytes(base.Exp(base, exp, mod).Bytes(), int(modLen)), nil } // newCurvePoint unmarshals a binary blob into a bn256 elliptic curve point, // returning it, or an error if the point is invalid. func newCurvePoint(blob []byte) (*bn256.G1, error) { p := new(bn256.G1) if _, err := p.Unmarshal(blob); err != nil { return nil, err } return p, nil } // newTwistPoint unmarshals a binary blob into a bn256 elliptic curve point, // returning it, or an error if the point is invalid. func newTwistPoint(blob []byte) (*bn256.G2, error) { p := new(bn256.G2) if _, err := p.Unmarshal(blob); err != nil { return nil, err } return p, nil } // bn256Add implements a native elliptic curve point addition. type bn256Add struct{} // RequiredGas returns the gas required to execute the pre-compiled contract. func (c *bn256Add) RequiredGas(input []byte) uint64 { return params.Bn256AddGas } func (c *bn256Add) Run(input []byte) ([]byte, error) { x, err := newCurvePoint(getData(input, 0, 64)) if err != nil { return nil, err } y, err := newCurvePoint(getData(input, 64, 64)) if err != nil { return nil, err } res := new(bn256.G1) res.Add(x, y) return res.Marshal(), nil } // bn256ScalarMul implements a native elliptic curve scalar multiplication. type bn256ScalarMul struct{} // RequiredGas returns the gas required to execute the pre-compiled contract. func (c *bn256ScalarMul) RequiredGas(input []byte) uint64 { return params.Bn256ScalarMulGas } func (c *bn256ScalarMul) Run(input []byte) ([]byte, error) { p, err := newCurvePoint(getData(input, 0, 64)) if err != nil { return nil, err } res := new(bn256.G1) res.ScalarMult(p, new(big.Int).SetBytes(getData(input, 64, 32))) return res.Marshal(), nil } var ( // true32Byte is returned if the bn256 pairing check succeeds. true32Byte = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1} // false32Byte is returned if the bn256 pairing check fails. false32Byte = make([]byte, 32) // errBadPairingInput is returned if the bn256 pairing input is invalid. errBadPairingInput = errors.New("bad elliptic curve pairing size") ) // bn256Pairing implements a pairing pre-compile for the bn256 curve type bn256Pairing struct{} // RequiredGas returns the gas required to execute the pre-compiled contract. func (c *bn256Pairing) RequiredGas(input []byte) uint64 { return params.Bn256PairingBaseGas + uint64(len(input)/192)*params.Bn256PairingPerPointGas } func (c *bn256Pairing) Run(input []byte) ([]byte, error) { // Handle some corner cases cheaply if len(input)%192 > 0 { return nil, errBadPairingInput } // Convert the input into a set of coordinates var ( cs []*bn256.G1 ts []*bn256.G2 ) for i := 0; i < len(input); i += 192 { c, err := newCurvePoint(input[i : i+64]) if err != nil { return nil, err } t, err := newTwistPoint(input[i+64 : i+192]) if err != nil { return nil, err } cs = append(cs, c) ts = append(ts, t) } // Execute the pairing checks and return the results if bn256.PairingCheck(cs, ts) { return true32Byte, nil } return false32Byte, nil } */ ================================================ FILE: core/vm/doc.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . /* Package vm implements the Ethereum Virtual Machine. The vm package implements one EVM, a byte code VM. The BC (Byte Code) VM loops over a set of bytes and executes them according to the set of rules defined in the Ethereum yellow paper. */ package vm ================================================ FILE: core/vm/errors.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package vm import "errors" // List execution errors var ( ErrOutOfGas = errors.New("out of gas") ErrCodeStoreOutOfGas = errors.New("contract creation code storage out of gas") ErrDepth = errors.New("max call depth exceeded") ErrTraceLimitReached = errors.New("the number of logs reached the specified limit") ErrInsufficientBalance = errors.New("insufficient balance for transfer") ErrContractAddressCollision = errors.New("contract address collision") ErrNoCompatibleInterpreter = errors.New("no compatible interpreter") ErrCodeInvalid = errors.New("input invalid") ) ================================================ FILE: core/vm/evm.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package vm import ( "math/big" "time" "github.com/sero-cash/go-czero-import/seroparam" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/crypto" "github.com/sero-cash/go-sero/params" ) // emptyCodeHash is used by create to ensure deployment is disallowed to already // deployed contract addresses (relevant after the account abstraction). var emptyCodeHash = crypto.Keccak256Hash(nil) type ( // CanTransferFunc is the signature of a transfer guard function CanTransferFunc func(StateDB, common.Address, *assets.Asset) bool // TransferFunc is the signature of a transfer function TransferFunc func(StateDB, common.Address, common.Address, *assets.Asset, common.Hash) (alarm bool) // GetHashFunc returns the nth block hash in the blockchain // and is used by the BLOCKHASH EVM op code. GetHashFunc func(uint64) common.Hash ) // run runs the given contract and takes care of running precompiles with a fallback to the byte code interpreter. func run(evm *EVM, contract *Contract, input []byte) ([]byte, error) { for _, interpreter := range evm.interpreters { if interpreter.CanRun(contract.Code) { if evm.interpreter != interpreter { // Ensure that the interpreter pointer is set back // to its current value upon return. defer func(i Interpreter) { evm.interpreter = i }(evm.interpreter) evm.interpreter = interpreter } return interpreter.Run(contract, input) } } return nil, ErrNoCompatibleInterpreter } // Context provides the EVM with auxiliary information. Once provided // it shouldn't be modified. type Context struct { // CanTransfer returns whether the account contains // sufficient ether to transfer the value CanTransfer CanTransferFunc // Transfer transfers ether from one account to the other Transfer TransferFunc // GetHash returns the hash corresponding to n GetHash GetHashFunc // Message information Origin common.Address // Provides information for ORIGIN GasPrice *big.Int // Provides information for GASPRICE TxHash common.Hash // Block information Coinbase common.Address // Provides information for COINBASE GasLimit uint64 // Provides information for GASLIMIT BlockNumber *big.Int // Provides information for NUMBER Time *big.Int // Provides information for TIME Difficulty *big.Int // Provides information for DIFFICULTY } // EVM is the Ethereum Virtual Machine base object and provides // the necessary tools to run a contract on the given state with // the provided context. It should be noted that any error // generated through any of the calls should be considered a // revert-state-and-consume-all-gas operation, no checks on // specific errors should ever be performed. The interpreter makes // sure that any errors generated are to be considered faulty code. // // The EVM should never be reused and is not thread safe. type EVM struct { // Context provides auxiliary blockchain related information Context // StateDB gives access to the underlying state StateDB StateDB // Depth is the current call stack depth int // chainConfig contains information about the current chain chainConfig *params.ChainConfig // chain rules contains the chain rules for the current epoch chainRules params.Rules // virtual machine configuration options used to initialise the // evm. vmConfig Config // global (to this context) ethereum virtual machine // used throughout the execution of the tx. interpreters []Interpreter interpreter Interpreter // abort is used to abort the EVM calling operations // NOTE: must be set atomically abort int32 // callGasTemp holds the gas available for the current call. This is needed because the // available gas is calculated in gasCall* according to the 63/64 rule and later // applied in opCall*. callGasTemp uint64 } // NewEVM returns a new EVM. The returned EVM is not thread safe and should // only ever be used *once*. func NewEVM(ctx Context, statedb StateDB, chainConfig *params.ChainConfig, vmConfig Config) *EVM { evm := &EVM{ Context: ctx, StateDB: statedb, vmConfig: vmConfig, chainConfig: chainConfig, chainRules: chainConfig.Rules(ctx.BlockNumber), interpreters: make([]Interpreter, 1), } evm.interpreters[0] = NewEVMInterpreter(evm, vmConfig) evm.interpreter = evm.interpreters[0] return evm } // Cancel cancels any running EVM operation. This may be called concurrently and // it's safe to be called multiple times. func (evm *EVM) Cancel() { //atomic.StoreInt32(&evm.abort, 1) } // Interpreter returns the current interpreter func (evm *EVM) Interpreter() Interpreter { return evm.interpreter } // Call executes the contract associated with the addr with the given input as // parameters. It also handles any necessary value transfer required and takes // the necessary steps to create accounts and reverses the state in case of an // execution error or failed value transfer. func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas uint64, asset *assets.Asset) (ret []byte, leftOverGas uint64, err error, alarm bool) { if evm.vmConfig.NoRecursion && evm.depth > 0 { return nil, gas, nil, false } // Fail if we're trying to execute above the call depth limit if evm.depth > int(params.CallCreateDepth) { return nil, gas, ErrDepth, false } if evm.StateDB.IsContract(caller.Address()) && !evm.Context.CanTransfer(evm.StateDB, caller.Address(), asset) { return nil, gas, ErrInsufficientBalance, false } var ( to = AccountRef(addr) snapshot = evm.StateDB.Snapshot() ) alarm = evm.Transfer(evm.StateDB, caller.Address(), to.Address(), asset, evm.TxHash) // Initialise a new contract and set the code that is to be used by the EVM. // The contract is a scoped environment for this execution context only. contract := NewContract(caller, to, asset, gas) contract.SetCallCode(&addr, evm.StateDB.GetCodeHash(addr), evm.StateDB.GetCode(addr)) input, err = loadAddress(evm, caller, input, contract, false) if err != nil { evm.StateDB.RevertToSnapshot(snapshot) return ret, leftOverGas, err, alarm } start := time.Now() // Capture the tracer start/end events in debug mode if evm.vmConfig.Debug && evm.depth == 0 { evm.vmConfig.Tracer.CaptureStart(caller.Address(), addr, false, input, gas, asset) defer func() { // Lazy evaluation of the parameters evm.vmConfig.Tracer.CaptureEnd(ret, gas-contract.Gas, time.Since(start), err) }() } ret, err = run(evm, contract, input) // When an error was returned by the EVM or when setting the creation code // above we revert to the snapshot and consume any gas remaining. Additionally // when we're in homestead this also counts for code storage gas errors. if err != nil { evm.StateDB.RevertToSnapshot(snapshot) if err != errExecutionReverted { contract.UseGas(contract.Gas) } } return ret, contract.Gas, err, alarm } // CallCode executes the contract associated with the addr with the given input // as parameters. It also handles any necessary value transfer required and takes // the necessary steps to create accounts and reverses the state in case of an // execution error or failed value transfer. // // CallCode differs from Call in the sense that it executes the given address' // code with the caller as context. func (evm *EVM) CallCode(caller ContractRef, addr common.Address, input []byte, gas uint64, asset *assets.Asset) (ret []byte, leftOverGas uint64, err error) { if evm.vmConfig.NoRecursion && evm.depth > 0 { return nil, gas, nil } // Fail if we're trying to execute above the call depth limit if evm.depth > int(params.CallCreateDepth) { return nil, gas, ErrDepth } // Fail if we're trying to transfer more than the available balance if evm.StateDB.IsContract(caller.Address()) && !evm.Context.CanTransfer(evm.StateDB, caller.Address(), asset) { return nil, gas, ErrInsufficientBalance } var ( snapshot = evm.StateDB.Snapshot() to = AccountRef(caller.Address()) ) // initialise a new contract and set the code that is to be used by the // EVM. The contract is a scoped environment for this execution context // only. contract := NewContract(caller, to, asset, gas) contract.SetCallCode(&addr, evm.StateDB.GetCodeHash(addr), evm.StateDB.GetCode(addr)) input, err = loadAddress(evm, caller, input, contract, false) if err != nil { evm.StateDB.RevertToSnapshot(snapshot) return ret, leftOverGas, err } ret, err = run(evm, contract, input) if err != nil { evm.StateDB.RevertToSnapshot(snapshot) if err != errExecutionReverted { contract.UseGas(contract.Gas) } } return ret, contract.Gas, err } // DelegateCall executes the contract associated with the addr with the given input // as parameters. It reverses the state in case of an execution error. // // DelegateCall differs from CallCode in the sense that it executes the given address' // code with the caller as context and the caller is set to the caller of the caller. func (evm *EVM) DelegateCall(caller ContractRef, addr common.Address, input []byte, gas uint64) (ret []byte, leftOverGas uint64, err error) { if evm.vmConfig.NoRecursion && evm.depth > 0 { return nil, gas, nil } // Fail if we're trying to execute above the call depth limit if evm.depth > int(params.CallCreateDepth) { return nil, gas, ErrDepth } var ( snapshot = evm.StateDB.Snapshot() to = AccountRef(caller.Address()) ) // Initialise a new contract and make initialise the delegate values contract := NewContract(caller, to, nil, gas).AsDelegate() contract.SetCallCode(&addr, evm.StateDB.GetCodeHash(addr), evm.StateDB.GetCode(addr)) input, err = loadAddress(evm, caller, input, contract, false) if err != nil { evm.StateDB.RevertToSnapshot(snapshot) return ret, leftOverGas, err } ret, err = run(evm, contract, input) if err != nil { evm.StateDB.RevertToSnapshot(snapshot) if err != errExecutionReverted { contract.UseGas(contract.Gas) } } return ret, contract.Gas, err } // StaticCall executes the contract associated with the addr with the given input // as parameters while disallowing any modifications to the state during the call. // Opcodes that attempt to perform such modifications will result in exceptions // instead of performing the modifications. func (evm *EVM) StaticCall(caller ContractRef, addr common.Address, input []byte, gas uint64) (ret []byte, leftOverGas uint64, err error) { if evm.vmConfig.NoRecursion && evm.depth > 0 { return nil, gas, nil } // Fail if we're trying to execute above the call depth limit if evm.depth > int(params.CallCreateDepth) { return nil, gas, ErrDepth } // Make sure the readonly is only set if we aren't in readonly yet // this makes also sure that the readonly flag isn't removed for // child calls. if !evm.interpreter.IsReadOnly() { evm.interpreter.SetReadOnly(true) defer func() { evm.interpreter.SetReadOnly(false) }() } var ( to = AccountRef(addr) snapshot = evm.StateDB.Snapshot() ) // Initialise a new contract and set the code that is to be used by the // EVM. The contract is a scoped environment for this execution context // only. contract := NewContract(caller, to, nil, gas) contract.SetCallCode(&addr, evm.StateDB.GetCodeHash(addr), evm.StateDB.GetCode(addr)) input, err = loadAddress(evm, caller, input, contract, false) if err != nil { evm.StateDB.RevertToSnapshot(snapshot) return ret, leftOverGas, err } // When an error was returned by the EVM or when setting the creation code // above we revert to the snapshot and consume any gas remaining. Additionally // when we're in Homestead this also counts for code storage gas errors. ret, err = run(evm, contract, input) if err != nil { evm.StateDB.RevertToSnapshot(snapshot) if err != errExecutionReverted { contract.UseGas(contract.Gas) } } return ret, contract.Gas, err } func loadAddress(evm *EVM, caller ContractRef, input []byte, contract *Contract, contractCreation bool) ([]byte, error) { contract.PutNonceAddress(evm.StateDB, caller.Address()) if !evm.StateDB.IsContract(caller.Address()) { if len(input) != 0 && (contractCreation || len(contract.Code) > 0) { if len(input) < 18 { return input, ErrCodeInvalid } n := int(input[16])<<8 + int(input[17]) if len(input) < n*96+18 { return input, ErrCodeInvalid } for i := 0; i < n; i++ { addr := common.BytesToAddress(input[i*96+18 : i*96+114]) contract.PutNonceAddress(evm.StateDB, addr) } input = input[n*96+18:] } } return input, nil } // create creates a new contract using code as deployment code. func (evm *EVM) create(caller ContractRef, code []byte, gas uint64, asset *assets.Asset, address common.Address) ([]byte, common.Address, uint64, error) { // Depth check execution. Fail if we're trying to execute above the // limit. if evm.depth > int(params.CallCreateDepth) { return nil, common.Address{}, gas, ErrDepth } // Ensure there's no existing contract already at the designated address contractHash := evm.StateDB.GetCodeHash(address) if contractHash != (common.Hash{}) && contractHash != emptyCodeHash { return nil, common.Address{}, 0, ErrContractAddressCollision } // Create a new account on the state snapshot := evm.StateDB.Snapshot() evm.StateDB.CreateAccount(address) evm.Transfer(evm.StateDB, caller.Address(), address, asset, evm.TxHash) // initialise a new contract and set the code that is to be used by the // EVM. The contract is a scoped environment for this execution context // only. contract := NewContract(caller, AccountRef(address), asset, gas) if evm.BlockNumber.Uint64() >= seroparam.SIP9() { contract.PutNonceAddress(evm.StateDB, address) } code, err := loadAddress(evm, caller, code, contract, true) if err != nil { evm.StateDB.RevertToSnapshot(snapshot) return nil, common.Address{}, 0, err } contract.SetCallCode(&address, crypto.Keccak256Hash(code), code) if evm.vmConfig.NoRecursion && evm.depth > 0 { return nil, common.Address{}, gas, nil } if evm.vmConfig.Debug && evm.depth == 0 { evm.vmConfig.Tracer.CaptureStart(caller.Address(), address, true, code, gas, asset) } start := time.Now() ret, err := run(evm, contract, nil) // check whether the max code size has been exceeded maxCodeSizeExceeded := len(ret) > params.MaxCodeSize // if the contract creation ran successfully and no errors were returned // calculate the gas required to store the code. If the code could not // be stored due to not enough gas set an error and let it be handled // by the error checking condition below. if err == nil && !maxCodeSizeExceeded { createDataGas := uint64(len(ret)) * params.CreateDataGas if contract.UseGas(createDataGas) { //println(common.Bytes2Hex(ret)) evm.StateDB.SetCode(address, ret) } else { err = ErrCodeStoreOutOfGas } } // When an error was returned by the EVM or when setting the creation code // above we revert to the snapshot and consume any gas remaining. Additionally // when we're in homestead this also counts for code storage gas errors. if maxCodeSizeExceeded || err != nil { evm.StateDB.RevertToSnapshot(snapshot) if err != errExecutionReverted { contract.UseGas(contract.Gas) } } // Assign err if contract code size exceeds the max while the err is still empty. if maxCodeSizeExceeded && err == nil { err = errMaxCodeSizeExceeded } if evm.vmConfig.Debug && evm.depth == 0 { evm.vmConfig.Tracer.CaptureEnd(ret, gas-contract.Gas, time.Since(start), err) } return ret, address, contract.Gas, err } // Create creates a new contract using code as deployment code. func (evm *EVM) Create(caller ContractRef, code []byte, gas uint64, asset *assets.Asset) (ret []byte, contractAddr common.Address, leftOverGas uint64, err error) { if len(code) < 16 { return ret, contractAddr, leftOverGas, ErrCodeInvalid } contractAddr = crypto.CreateAddress(caller.Address(), evm.StateDB.IncAndGetContrctNonce(), code[0:16]) return evm.create(caller, code, gas, asset, contractAddr) } // ChainConfig returns the environment's chain configuration func (evm *EVM) ChainConfig() *params.ChainConfig { return evm.chainConfig } ================================================ FILE: core/vm/gas.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package vm import ( "math/big" "github.com/sero-cash/go-sero/params" ) // Gas costs const ( GasQuickStep uint64 = 2 GasFastestStep uint64 = 3 GasFastStep uint64 = 5 GasMidStep uint64 = 8 GasSlowStep uint64 = 10 GasExtStep uint64 = 20 GasReturn uint64 = 0 GasStop uint64 = 0 GasContractByte uint64 = 200 ) // calcGas returns the actual gas cost of the call. // // The cost of gas was changed during the homestead price change HF. To allow for EIP150 // to be implemented. The returned gas is gas - base * 63 / 64. func callGas(gasTable params.GasTable, availableGas, base uint64, callCost *big.Int) (uint64, error) { if gasTable.CreateBySuicide > 0 { availableGas = availableGas - base gas := availableGas - availableGas/64 // If the bit length exceeds 64 bit we know that the newly calculated "gas" for EIP150 // is smaller than the requested amount. Therefor we return the new gas instead // of returning an error. if callCost.BitLen() > 64 || gas < callCost.Uint64() { return gas, nil } } if callCost.BitLen() > 64 { return 0, errGasUintOverflow } return callCost.Uint64(), nil } ================================================ FILE: core/vm/gas_table.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package vm import ( "math/big" "github.com/sero-cash/go-czero-import/seroparam" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/common/math" "github.com/sero-cash/go-sero/params" ) // memoryGasCosts calculates the quadratic gas for memory expansion. It does so // only for the memory region that is expanded, not the total memory. func memoryGasCost(mem *Memory, newMemSize uint64) (uint64, error) { if newMemSize == 0 { return 0, nil } // The maximum that will fit in a uint64 is max_word_count - 1 // anything above that will result in an overflow. // Additionally, a newMemSize which results in a // newMemSizeWords larger than 0x7ffffffff will cause the square operation // to overflow. // The constant 0xffffffffe0 is the highest number that can be used without // overflowing the gas calculation if newMemSize > 0xffffffffe0 { return 0, errGasUintOverflow } newMemSizeWords := toWordSize(newMemSize) newMemSize = newMemSizeWords * 32 if newMemSize > uint64(mem.Len()) { square := newMemSizeWords * newMemSizeWords linCoef := newMemSizeWords * params.MemoryGas quadCoef := square / params.QuadCoeffDiv newTotalFee := linCoef + quadCoef fee := newTotalFee - mem.lastGasCost mem.lastGasCost = newTotalFee return fee, nil } return 0, nil } func constGasFunc(gas uint64) gasFunc { return func(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { return gas, nil } } func gasCallDataCopy(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { gas, err := memoryGasCost(mem, memorySize) if err != nil { return 0, err } var overflow bool if gas, overflow = math.SafeAdd(gas, GasFastestStep); overflow { return 0, errGasUintOverflow } words, overflow := bigUint64(stack.Back(2)) if overflow { return 0, errGasUintOverflow } if words, overflow = math.SafeMul(toWordSize(words), params.CopyGas); overflow { return 0, errGasUintOverflow } if gas, overflow = math.SafeAdd(gas, words); overflow { return 0, errGasUintOverflow } return gas, nil } func gasReturnDataCopy(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { gas, err := memoryGasCost(mem, memorySize) if err != nil { return 0, err } var overflow bool if gas, overflow = math.SafeAdd(gas, GasFastestStep); overflow { return 0, errGasUintOverflow } words, overflow := bigUint64(stack.Back(2)) if overflow { return 0, errGasUintOverflow } if words, overflow = math.SafeMul(toWordSize(words), params.CopyGas); overflow { return 0, errGasUintOverflow } if gas, overflow = math.SafeAdd(gas, words); overflow { return 0, errGasUintOverflow } return gas, nil } func gasSStore(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { var ( y, x = stack.Back(1), stack.Back(0) val = evm.StateDB.GetState(contract.Address(), common.BigToHash(x)) ) // This checks for 3 scenario's and calculates gas accordingly // 1. From a zero-value address to a non-zero value (NEW VALUE) // 2. From a non-zero value address to a zero-value address (DELETE) // 3. From a non-zero to a non-zero (CHANGE) if val == (common.Hash{}) && y.Sign() != 0 { // 0 => non 0 return params.SstoreSetGas, nil } else if val != (common.Hash{}) && y.Sign() == 0 { // non 0 => 0 evm.StateDB.AddRefund(params.SstoreRefundGas) return params.SstoreClearGas, nil } else { // non 0 => non 0 (or 0 => 0) return params.SstoreResetGas, nil } } var ( sendTopic = "0x868bd6629e7c2e3d2ccf7b9968fad79b448e7a2bfb3ee20ed1acbc695c3c8b23" allotTicketTopic = "0xa6a366f1a72e1aef5d8d52ee240a476f619d15be7bc62d3df37496025b83459f" ) func makeGasLog(n uint64) gasFunc { return func(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { requestedSize, overflow := bigUint64(stack.Back(1)) if overflow { return 0, errGasUintOverflow } gas, err := memoryGasCost(mem, memorySize) if err != nil { return 0, err } if gas, overflow = math.SafeAdd(gas, params.LogGas); overflow { return 0, errGasUintOverflow } if gas, overflow = math.SafeAdd(gas, n*params.LogTopicGas); overflow { return 0, errGasUintOverflow } var memorySizeGas uint64 if memorySizeGas, overflow = math.SafeMul(requestedSize, params.LogDataGas); overflow { return 0, errGasUintOverflow } if gas, overflow = math.SafeAdd(gas, memorySizeGas); overflow { return 0, errGasUintOverflow } if evm.BlockNumber.Uint64() < seroparam.SIP5() { evm.callGasTemp, err = callGas(gt, contract.Gas, gas, new(big.Int).SetUint64(math.MaxUint64)) if err != nil { return 0, err } if gas, overflow = math.SafeAdd(gas, evm.callGasTemp); overflow { return 0, errGasUintOverflow } } else { evm.callGasTemp = 0 topic := common.BigToHash(stack.Back(2)).Hex() if sendTopic == topic || allotTicketTopic == topic { if gas, overflow = math.SafeAdd(gas, params.CallValueTransferGas); overflow { return 0, errGasUintOverflow } evm.callGasTemp, err = callGas(gt, contract.Gas, gas, new(big.Int).SetUint64(0)) if err != nil { return 0, err } if allotTicketTopic == topic { evm.callGasTemp += params.CreateTicketGas } if gas, overflow = math.SafeAdd(gas, evm.callGasTemp); overflow { return 0, errGasUintOverflow } } } return gas, nil } } func gasSha3(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { var overflow bool gas, err := memoryGasCost(mem, memorySize) if err != nil { return 0, err } if gas, overflow = math.SafeAdd(gas, params.Sha3Gas); overflow { return 0, errGasUintOverflow } wordGas, overflow := bigUint64(stack.Back(1)) if overflow { return 0, errGasUintOverflow } if wordGas, overflow = math.SafeMul(toWordSize(wordGas), params.Sha3WordGas); overflow { return 0, errGasUintOverflow } if gas, overflow = math.SafeAdd(gas, wordGas); overflow { return 0, errGasUintOverflow } return gas, nil } func gasCodeCopy(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { gas, err := memoryGasCost(mem, memorySize) if err != nil { return 0, err } var overflow bool if gas, overflow = math.SafeAdd(gas, GasFastestStep); overflow { return 0, errGasUintOverflow } wordGas, overflow := bigUint64(stack.Back(2)) if overflow { return 0, errGasUintOverflow } if wordGas, overflow = math.SafeMul(toWordSize(wordGas), params.CopyGas); overflow { return 0, errGasUintOverflow } if gas, overflow = math.SafeAdd(gas, wordGas); overflow { return 0, errGasUintOverflow } return gas, nil } func gasExtCodeCopy(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { gas, err := memoryGasCost(mem, memorySize) if err != nil { return 0, err } var overflow bool if gas, overflow = math.SafeAdd(gas, gt.ExtcodeCopy); overflow { return 0, errGasUintOverflow } wordGas, overflow := bigUint64(stack.Back(3)) if overflow { return 0, errGasUintOverflow } if wordGas, overflow = math.SafeMul(toWordSize(wordGas), params.CopyGas); overflow { return 0, errGasUintOverflow } if gas, overflow = math.SafeAdd(gas, wordGas); overflow { return 0, errGasUintOverflow } return gas, nil } func gasExtCodeHash(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { return gt.ExtcodeHash, nil } func gasMLoad(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { var overflow bool gas, err := memoryGasCost(mem, memorySize) if err != nil { return 0, errGasUintOverflow } if gas, overflow = math.SafeAdd(gas, GasFastestStep); overflow { return 0, errGasUintOverflow } return gas, nil } func gasMStore8(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { var overflow bool gas, err := memoryGasCost(mem, memorySize) if err != nil { return 0, errGasUintOverflow } if gas, overflow = math.SafeAdd(gas, GasFastestStep); overflow { return 0, errGasUintOverflow } return gas, nil } func gasMStore(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { var overflow bool gas, err := memoryGasCost(mem, memorySize) if err != nil { return 0, errGasUintOverflow } if gas, overflow = math.SafeAdd(gas, GasFastestStep); overflow { return 0, errGasUintOverflow } return gas, nil } func gasCreate(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { var overflow bool gas, err := memoryGasCost(mem, memorySize) if err != nil { return 0, err } if gas, overflow = math.SafeAdd(gas, params.CreateGas); overflow { return 0, errGasUintOverflow } return gas, nil } func gasCreate2(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { var overflow bool gas, err := memoryGasCost(mem, memorySize) if err != nil { return 0, err } if gas, overflow = math.SafeAdd(gas, params.Create2Gas); overflow { return 0, errGasUintOverflow } return gas, nil } func gasBalance(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { return gt.Balance, nil } func gasExtCodeSize(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { return gt.ExtcodeSize, nil } func gasSLoad(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { return gt.SLoad, nil } func gasExp(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { expByteLen := uint64((stack.data[stack.len()-2].BitLen() + 7) / 8) var ( gas = expByteLen * gt.ExpByte // no overflow check required. Max is 256 * ExpByte gas overflow bool ) if gas, overflow = math.SafeAdd(gas, GasSlowStep); overflow { return 0, errGasUintOverflow } return gas, nil } func gasCall(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { var ( gas = gt.Calls transfersValue = stack.Back(2).Sign() != 0 // address = common.BigToAddress(stack.Back(1)) ) // if !evm.StateDB.Exist(address) { // gas += params.CallNewAccountGas // } if transfersValue || contract.callMsg != nil { gas += params.CallValueTransferGas } memoryGas, err := memoryGasCost(mem, memorySize) if err != nil { return 0, err } var overflow bool if gas, overflow = math.SafeAdd(gas, memoryGas); overflow { return 0, errGasUintOverflow } evm.callGasTemp, err = callGas(gt, contract.Gas, gas, stack.Back(0)) if err != nil { return 0, err } if gas, overflow = math.SafeAdd(gas, evm.callGasTemp); overflow { return 0, errGasUintOverflow } return gas, nil } func gasCallCode(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { gas := gt.Calls if stack.Back(2).Sign() != 0 { gas += params.CallValueTransferGas } memoryGas, err := memoryGasCost(mem, memorySize) if err != nil { return 0, err } var overflow bool if gas, overflow = math.SafeAdd(gas, memoryGas); overflow { return 0, errGasUintOverflow } evm.callGasTemp, err = callGas(gt, contract.Gas, gas, stack.Back(0)) if err != nil { return 0, err } if gas, overflow = math.SafeAdd(gas, evm.callGasTemp); overflow { return 0, errGasUintOverflow } return gas, nil } func gasReturn(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { return memoryGasCost(mem, memorySize) } func gasRevert(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { return memoryGasCost(mem, memorySize) } func gasSuicide(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { var gas uint64 if !evm.StateDB.HasSuicided(contract.Address()) { evm.StateDB.AddRefund(params.SuicideRefundGas) } return gas, nil } func gasDelegateCall(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { gas, err := memoryGasCost(mem, memorySize) if err != nil { return 0, err } var overflow bool if gas, overflow = math.SafeAdd(gas, gt.Calls); overflow { return 0, errGasUintOverflow } evm.callGasTemp, err = callGas(gt, contract.Gas, gas, stack.Back(0)) if err != nil { return 0, err } if gas, overflow = math.SafeAdd(gas, evm.callGasTemp); overflow { return 0, errGasUintOverflow } return gas, nil } func gasStaticCall(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { gas, err := memoryGasCost(mem, memorySize) if err != nil { return 0, err } var overflow bool if gas, overflow = math.SafeAdd(gas, gt.Calls); overflow { return 0, errGasUintOverflow } evm.callGasTemp, err = callGas(gt, contract.Gas, gas, stack.Back(0)) if err != nil { return 0, err } if gas, overflow = math.SafeAdd(gas, evm.callGasTemp); overflow { return 0, errGasUintOverflow } return gas, nil } func gasPush(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { return GasFastestStep, nil } func gasSwap(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { return GasFastestStep, nil } func gasDup(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { return GasFastestStep, nil } ================================================ FILE: core/vm/gas_table_test.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package vm import "testing" func TestMemoryGasCost(t *testing.T) { //size := uint64(math.MaxUint64 - 64) size := uint64(0xffffffffe0) v, err := memoryGasCost(&Memory{}, size) if err != nil { t.Error("didn't expect error:", err) } if v != 36028899963961341 { t.Errorf("Expected: 36028899963961341, got %d", v) } _, err = memoryGasCost(&Memory{}, size+1) if err == nil { t.Error("expected error") } } ================================================ FILE: core/vm/gen_structlog.go ================================================ // Code generated by github.com/fjl/gencodec. DO NOT EDIT. package vm import ( "encoding/json" "math/big" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/common/hexutil" "github.com/sero-cash/go-sero/common/math" ) var _ = (*structLogMarshaling)(nil) func (s StructLog) MarshalJSON() ([]byte, error) { type StructLog struct { Pc uint64 `json:"pc"` Op OpCode `json:"op"` Gas math.HexOrDecimal64 `json:"gas"` GasCost math.HexOrDecimal64 `json:"gasCost"` Memory hexutil.Bytes `json:"memory"` MemorySize int `json:"memSize"` Stack []*math.HexOrDecimal256 `json:"stack"` Storage map[common.Hash]common.Hash `json:"-"` Depth int `json:"depth"` Err error `json:"-"` OpName string `json:"opName"` ErrorString string `json:"error"` } var enc StructLog enc.Pc = s.Pc enc.Op = s.Op enc.Gas = math.HexOrDecimal64(s.Gas) enc.GasCost = math.HexOrDecimal64(s.GasCost) enc.Memory = s.Memory enc.MemorySize = s.MemorySize if s.Stack != nil { enc.Stack = make([]*math.HexOrDecimal256, len(s.Stack)) for k, v := range s.Stack { enc.Stack[k] = (*math.HexOrDecimal256)(v) } } enc.Storage = s.Storage enc.Depth = s.Depth enc.Err = s.Err enc.OpName = s.OpName() enc.ErrorString = s.ErrorString() return json.Marshal(&enc) } func (s *StructLog) UnmarshalJSON(input []byte) error { type StructLog struct { Pc *uint64 `json:"pc"` Op *OpCode `json:"op"` Gas *math.HexOrDecimal64 `json:"gas"` GasCost *math.HexOrDecimal64 `json:"gasCost"` Memory *hexutil.Bytes `json:"memory"` MemorySize *int `json:"memSize"` Stack []*math.HexOrDecimal256 `json:"stack"` Storage map[common.Hash]common.Hash `json:"-"` Depth *int `json:"depth"` Err error `json:"-"` } var dec StructLog if err := json.Unmarshal(input, &dec); err != nil { return err } if dec.Pc != nil { s.Pc = *dec.Pc } if dec.Op != nil { s.Op = *dec.Op } if dec.Gas != nil { s.Gas = uint64(*dec.Gas) } if dec.GasCost != nil { s.GasCost = uint64(*dec.GasCost) } if dec.Memory != nil { s.Memory = *dec.Memory } if dec.MemorySize != nil { s.MemorySize = *dec.MemorySize } if dec.Stack != nil { s.Stack = make([]*big.Int, len(dec.Stack)) for k, v := range dec.Stack { s.Stack[k] = (*big.Int)(v) } } if dec.Storage != nil { s.Storage = dec.Storage } if dec.Depth != nil { s.Depth = *dec.Depth } if dec.Err != nil { s.Err = dec.Err } return nil } ================================================ FILE: core/vm/instructions.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package vm import ( "errors" "fmt" "math/big" "strings" "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-czero-import/seroparam" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/rlp" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-sero/zero/utils" "github.com/sero-cash/go-sero/log" "regexp" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/common/math" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/crypto" "github.com/sero-cash/go-sero/params" ) var ( bigZero = new(big.Int) tt255 = math.BigPow(2, 255) errWriteProtection = errors.New("evm: write protection") errReturnDataOutOfBounds = errors.New("evm: return data out of bounds") errExecutionReverted = errors.New("evm: execution reverted") errMaxCodeSizeExceeded = errors.New("evm: max code size exceeded") ErrToAddressError = errors.New("evm: toAddr error") hashTrue = common.LeftPadBytes([]byte{1}, 32) hashFalse = common.LeftPadBytes([]byte{0}, 32) topic_issueToken = common.HexToHash("0x3be6bf24d822bcd6f6348f6f5a5c2d3108f04991ee63e80cde49a8c4746a0ef3") topic_send = common.HexToHash("0x868bd6629e7c2e3d2ccf7b9968fad79b448e7a2bfb3ee20ed1acbc695c3c8b23") topic_balanceOf = common.HexToHash("0xcf19eb4256453a4e30b6a06d651f1970c223fb6bd1826a28ed861f0e602db9b8") topic_allotTicket = common.HexToHash("0xa6a366f1a72e1aef5d8d52ee240a476f619d15be7bc62d3df37496025b83459f") topic_currency = common.HexToHash("0x7c98e64bd943448b4e24ef8c2cdec7b8b1275970cfe10daf2a9bfa4b04dce905") topic_category = common.HexToHash("0xf1964f6690a0536daa42e5c575091297d2479edcc96f721ad85b95358644d276") topic_ticket = common.HexToHash("0x9ab0d7c07029f006485cf3468ce7811aa8743b5a108599f6bec9367c50ac6aad") topic_setCallValues = common.HexToHash("0xa6cafc6282f61eff9032603a017e652f68410d3d3c69f0a3eeca8f181aec1d17") topic_setTokenRate = common.HexToHash("0x6800e94e36131c049eaeb631e4530829b0d3d20d5b637c8015a8dc9cedd70aed") topic_closePkg = common.HexToHash("0xbbf1aa2159b035802d0a4d44611849d5d4ada0329c81580477d5ec3e82f4f0a6") topic_transferPkg = common.HexToHash("0xa8b83585a613dcf6c905ad7e0ce34cd07d1283cc72906d1fe78037d49adae455") topic_txHash = common.HexToHash("0xa6cb2bbe89e8b5f0c4e2d557b612ed99f5573b419fd9b304b87129514ccc35b2") topic_update = common.HexToHash("0xa6cb2bbe89e8b5f0c4e2d557b612ed99f5573b419fd9b304b87129514ccc35b3") ) func opAdd(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { x, y := stack.pop(), stack.peek() math.U256(y.Add(x, y)) interpreter.intPool.put(x) return nil, nil } func opSub(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { x, y := stack.pop(), stack.peek() math.U256(y.Sub(x, y)) interpreter.intPool.put(x) return nil, nil } func opMul(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { x, y := stack.pop(), stack.pop() stack.push(math.U256(x.Mul(x, y))) interpreter.intPool.put(y) return nil, nil } func opDiv(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { x, y := stack.pop(), stack.peek() if y.Sign() != 0 { math.U256(y.Div(x, y)) } else { y.SetUint64(0) } interpreter.intPool.put(x) return nil, nil } func opSdiv(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { x, y := math.S256(stack.pop()), math.S256(stack.pop()) res := interpreter.intPool.getZero() if y.Sign() == 0 || x.Sign() == 0 { stack.push(res) } else { if x.Sign() != y.Sign() { res.Div(x.Abs(x), y.Abs(y)) res.Neg(res) } else { res.Div(x.Abs(x), y.Abs(y)) } stack.push(math.U256(res)) } interpreter.intPool.put(x, y) return nil, nil } func opMod(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { x, y := stack.pop(), stack.pop() if y.Sign() == 0 { stack.push(x.SetUint64(0)) } else { stack.push(math.U256(x.Mod(x, y))) } interpreter.intPool.put(y) return nil, nil } func opSmod(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { x, y := math.S256(stack.pop()), math.S256(stack.pop()) res := interpreter.intPool.getZero() if y.Sign() == 0 { stack.push(res) } else { if x.Sign() < 0 { res.Mod(x.Abs(x), y.Abs(y)) res.Neg(res) } else { res.Mod(x.Abs(x), y.Abs(y)) } stack.push(math.U256(res)) } interpreter.intPool.put(x, y) return nil, nil } func opExp(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { base, exponent := stack.pop(), stack.pop() stack.push(math.Exp(base, exponent)) interpreter.intPool.put(base, exponent) return nil, nil } func opSignExtend(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { back := stack.pop() if back.Cmp(big.NewInt(31)) < 0 { bit := uint(back.Uint64()*8 + 7) num := stack.pop() mask := back.Lsh(common.Big1, bit) mask.Sub(mask, common.Big1) if num.Bit(int(bit)) > 0 { num.Or(num, mask.Not(mask)) } else { num.And(num, mask) } stack.push(math.U256(num)) } interpreter.intPool.put(back) return nil, nil } func opNot(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { x := stack.peek() math.U256(x.Not(x)) return nil, nil } func opLt(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { x, y := stack.pop(), stack.peek() if x.Cmp(y) < 0 { y.SetUint64(1) } else { y.SetUint64(0) } interpreter.intPool.put(x) return nil, nil } func opGt(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { x, y := stack.pop(), stack.peek() if x.Cmp(y) > 0 { y.SetUint64(1) } else { y.SetUint64(0) } interpreter.intPool.put(x) return nil, nil } func opSlt(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { x, y := stack.pop(), stack.peek() xSign := x.Cmp(tt255) ySign := y.Cmp(tt255) switch { case xSign >= 0 && ySign < 0: y.SetUint64(1) case xSign < 0 && ySign >= 0: y.SetUint64(0) default: if x.Cmp(y) < 0 { y.SetUint64(1) } else { y.SetUint64(0) } } interpreter.intPool.put(x) return nil, nil } func opSgt(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { x, y := stack.pop(), stack.peek() xSign := x.Cmp(tt255) ySign := y.Cmp(tt255) switch { case xSign >= 0 && ySign < 0: y.SetUint64(0) case xSign < 0 && ySign >= 0: y.SetUint64(1) default: if x.Cmp(y) > 0 { y.SetUint64(1) } else { y.SetUint64(0) } } interpreter.intPool.put(x) return nil, nil } func opEq(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { x, y := stack.pop(), stack.peek() if x.Cmp(y) == 0 { y.SetUint64(1) } else { y.SetUint64(0) } interpreter.intPool.put(x) return nil, nil } func opIszero(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { x := stack.peek() if x.Sign() > 0 { x.SetUint64(0) } else { x.SetUint64(1) } return nil, nil } func opAnd(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { x, y := stack.pop(), stack.pop() stack.push(x.And(x, y)) interpreter.intPool.put(y) return nil, nil } func opOr(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { x, y := stack.pop(), stack.peek() y.Or(x, y) interpreter.intPool.put(x) return nil, nil } func opXor(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { x, y := stack.pop(), stack.peek() y.Xor(x, y) interpreter.intPool.put(x) return nil, nil } func opByte(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { th, val := stack.pop(), stack.peek() if th.Cmp(common.Big32) < 0 { b := math.Byte(val, 32, int(th.Int64())) val.SetUint64(uint64(b)) } else { val.SetUint64(0) } interpreter.intPool.put(th) return nil, nil } func opAddmod(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { x, y, z := stack.pop(), stack.pop(), stack.pop() if z.Cmp(bigZero) > 0 { x.Add(x, y) x.Mod(x, z) stack.push(math.U256(x)) } else { stack.push(x.SetUint64(0)) } interpreter.intPool.put(y, z) return nil, nil } func opMulmod(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { x, y, z := stack.pop(), stack.pop(), stack.pop() if z.Cmp(bigZero) > 0 { x.Mul(x, y) x.Mod(x, z) stack.push(math.U256(x)) } else { stack.push(x.SetUint64(0)) } interpreter.intPool.put(y, z) return nil, nil } // opSHL implements Shift Left // The SHL instruction (shift left) pops 2 values from the stack, first arg1 and then arg2, // and pushes on the stack arg2 shifted to the left by arg1 number of bits. func opSHL(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { // Note, second operand is left in the stack; accumulate result into it, and no need to push it afterwards shift, value := math.U256(stack.pop()), math.U256(stack.peek()) defer interpreter.intPool.put(shift) // First operand back into the pool if shift.Cmp(common.Big256) >= 0 { value.SetUint64(0) return nil, nil } n := uint(shift.Uint64()) math.U256(value.Lsh(value, n)) return nil, nil } // opSHR implements Logical Shift Right // The SHR instruction (logical shift right) pops 2 values from the stack, first arg1 and then arg2, // and pushes on the stack arg2 shifted to the right by arg1 number of bits with zero fill. func opSHR(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { // Note, second operand is left in the stack; accumulate result into it, and no need to push it afterwards shift, value := math.U256(stack.pop()), math.U256(stack.peek()) defer interpreter.intPool.put(shift) // First operand back into the pool if shift.Cmp(common.Big256) >= 0 { value.SetUint64(0) return nil, nil } n := uint(shift.Uint64()) math.U256(value.Rsh(value, n)) return nil, nil } // opSAR implements Arithmetic Shift Right // The SAR instruction (arithmetic shift right) pops 2 values from the stack, first arg1 and then arg2, // and pushes on the stack arg2 shifted to the right by arg1 number of bits with sign extension. func opSAR(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { // Note, S256 returns (potentially) a new bigint, so we're popping, not peeking this one shift, value := math.U256(stack.pop()), math.S256(stack.pop()) defer interpreter.intPool.put(shift) // First operand back into the pool if shift.Cmp(common.Big256) >= 0 { if value.Sign() > 0 { value.SetUint64(0) } else { value.SetInt64(-1) } stack.push(math.U256(value)) return nil, nil } n := uint(shift.Uint64()) value.Rsh(value, n) stack.push(math.U256(value)) return nil, nil } func opSha3(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { offset, size := stack.pop(), stack.pop() data := memory.Get(offset.Int64(), size.Int64()) hash := crypto.Keccak256(data) evm := interpreter.evm if evm.vmConfig.EnablePreimageRecording { evm.StateDB.AddPreimage(common.BytesToHash(hash), data) } stack.push(interpreter.intPool.get().SetBytes(hash)) interpreter.intPool.put(offset, size) return nil, nil } func opAddress(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { stack.push(contract.Address().ToCaddr().Big()) return nil, nil } func opBalance(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { slot := stack.peek() slot.Set(new(big.Int)) return nil, nil } func opOrigin(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { stack.push(interpreter.evm.Origin.ToCaddr().Big()) return nil, nil } func opCaller(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { stack.push(contract.Caller().ToCaddr().Big()) return nil, nil } func opCallValue(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { stack.push(interpreter.intPool.get().Set(contract.Value())) return nil, nil } func opCallDataLoad(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { stack.push(interpreter.intPool.get().SetBytes(getDataBig(contract.Input, stack.pop(), big32))) return nil, nil } func opCallDataSize(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { stack.push(interpreter.intPool.get().SetInt64(int64(len(contract.Input)))) return nil, nil } func opCallDataCopy(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { var ( memOffset = stack.pop() dataOffset = stack.pop() length = stack.pop() ) memory.Set(memOffset.Uint64(), length.Uint64(), getDataBig(contract.Input, dataOffset, length)) interpreter.intPool.put(memOffset, dataOffset, length) return nil, nil } func opReturnDataSize(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { stack.push(interpreter.intPool.get().SetUint64(uint64(len(interpreter.returnData)))) return nil, nil } func opReturnDataCopy(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { var ( memOffset = stack.pop() dataOffset = stack.pop() length = stack.pop() end = interpreter.intPool.get().Add(dataOffset, length) ) defer interpreter.intPool.put(memOffset, dataOffset, length, end) if end.BitLen() > 64 || uint64(len(interpreter.returnData)) < end.Uint64() { return nil, errReturnDataOutOfBounds } memory.Set(memOffset.Uint64(), length.Uint64(), interpreter.returnData[dataOffset.Uint64():end.Uint64()]) return nil, nil } func opExtCodeSize(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { slot := stack.peek() address := contract.GetNonceAddress(interpreter.evm.StateDB, common.BigToContractAddress(slot)) slot.SetUint64(uint64(interpreter.evm.StateDB.GetCodeSize(address))) return nil, nil } func opCodeSize(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { l := interpreter.intPool.get().SetInt64(int64(len(contract.Code))) stack.push(l) return nil, nil } func opCodeCopy(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { var ( memOffset = stack.pop() codeOffset = stack.pop() length = stack.pop() ) codeCopy := getDataBig(contract.Code, codeOffset, length) memory.Set(memOffset.Uint64(), length.Uint64(), codeCopy) interpreter.intPool.put(memOffset, codeOffset, length) return nil, nil } func opExtCodeCopy(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { var ( addr = common.BigToAddress(stack.pop()) memOffset = stack.pop() codeOffset = stack.pop() length = stack.pop() ) codeCopy := getDataBig(interpreter.evm.StateDB.GetCode(addr), codeOffset, length) memory.Set(memOffset.Uint64(), length.Uint64(), codeCopy) interpreter.intPool.put(memOffset, codeOffset, length) return nil, nil } // opExtCodeHash returns the code hash of a specified account. // There are several cases when the function is called, while we can relay everything // to `state.GetCodeHash` function to ensure the correctness. // (1) Caller tries to get the code hash of a normal contract account, state // should return the relative code hash and set it as the result. // // (2) Caller tries to get the code hash of a non-existent account, state should // return common.Hash{} and zero will be set as the result. // // (3) Caller tries to get the code hash for an account without contract code, // state should return emptyCodeHash(0xc5d246...) as the result. // // (4) Caller tries to get the code hash of a precompiled account, the result // should be zero or emptyCodeHash. // // It is worth noting that in order to avoid unnecessary create and clean, // all precompile accounts on mainnet have been transferred 1 wei, so the return // here should be emptyCodeHash. // If the precompile account is not transferred any amount on a private or // customized chain, the return value will be zero. // // (5) Caller tries to get the code hash for an account which is marked as suicided // in the current transaction, the code hash of this account should be returned. // // (6) Caller tries to get the code hash for an account which is marked as deleted, // this account should be regarded as a non-existent account and zero should be returned. func opExtCodeHash(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { slot := stack.peek() slot.SetBytes(interpreter.evm.StateDB.GetCodeHash(common.BigToAddress(slot)).Bytes()) return nil, nil } func opGasprice(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { stack.push(interpreter.intPool.get().Set(interpreter.evm.GasPrice)) return nil, nil } func opBlockhash(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { num := stack.pop() n := interpreter.intPool.get().Sub(interpreter.evm.BlockNumber, common.Big257) if num.Cmp(n) > 0 && num.Cmp(interpreter.evm.BlockNumber) < 0 { stack.push(interpreter.evm.GetHash(num.Uint64()).Big()) } else { stack.push(interpreter.intPool.getZero()) } interpreter.intPool.put(num, n) return nil, nil } func opCoinbase(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { stack.push(interpreter.evm.Coinbase.ToCaddr().Big()) return nil, nil } func opTimestamp(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { stack.push(math.U256(interpreter.intPool.get().Set(interpreter.evm.Time))) return nil, nil } func opNumber(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { stack.push(math.U256(interpreter.intPool.get().Set(interpreter.evm.BlockNumber))) return nil, nil } func opDifficulty(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { stack.push(math.U256(interpreter.intPool.get().Set(interpreter.evm.Difficulty))) return nil, nil } func opGasLimit(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { stack.push(math.U256(interpreter.intPool.get().SetUint64(interpreter.evm.GasLimit))) return nil, nil } func opPop(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { interpreter.intPool.put(stack.pop()) return nil, nil } func opMload(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { offset := stack.pop() val := interpreter.intPool.get().SetBytes(memory.Get(offset.Int64(), 32)) stack.push(val) interpreter.intPool.put(offset) return nil, nil } func opMstore(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { // pop value of the stack mStart, val := stack.pop(), stack.pop() memory.Set32(mStart.Uint64(), val) interpreter.intPool.put(mStart, val) return nil, nil } func opMstore8(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { off, val := stack.pop().Int64(), stack.pop().Int64() memory.store[off] = byte(val & 0xff) return nil, nil } func opSload(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { loc := stack.peek() val := interpreter.evm.StateDB.GetState(contract.Address(), common.BigToHash(loc)) loc.SetBytes(val.Bytes()) return nil, nil } func opSstore(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { loc := common.BigToHash(stack.pop()) val := stack.pop() interpreter.evm.StateDB.SetState(contract.Address(), loc, common.BigToHash(val)) interpreter.intPool.put(val) return nil, nil } func opJump(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { pos := stack.pop() if !contract.jumpdests.has(contract.CodeHash, contract.Code, pos) { nop := contract.GetOp(pos.Uint64()) return nil, fmt.Errorf("invalid jump destination (%v) %v", nop, pos) } *pc = pos.Uint64() interpreter.intPool.put(pos) return nil, nil } func opJumpi(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { pos, cond := stack.pop(), stack.pop() if cond.Sign() != 0 { if !contract.jumpdests.has(contract.CodeHash, contract.Code, pos) { nop := contract.GetOp(pos.Uint64()) return nil, fmt.Errorf("invalid jump destination (%v) %v", nop, pos) } *pc = pos.Uint64() } else { *pc++ } interpreter.intPool.put(pos, cond) return nil, nil } func opJumpdest(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { return nil, nil } func opPc(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { stack.push(interpreter.intPool.get().SetUint64(*pc)) return nil, nil } func opMsize(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { stack.push(interpreter.intPool.get().SetInt64(int64(memory.Len()))) return nil, nil } func opGas(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { stack.push(interpreter.intPool.get().SetUint64(contract.Gas)) return nil, nil } func opCall(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { // Pop gas. The actual gas in in interpreter.evm.callGasTemp. interpreter.intPool.put(stack.pop()) gas := interpreter.evm.callGasTemp // Pop other call parameters. addr, value, inOffset, inSize, retOffset, retSize := stack.pop(), stack.pop(), stack.pop(), stack.pop(), stack.pop(), stack.pop() toAddr := contract.GetNonceAddress(interpreter.evm.StateDB, common.BigToContractAddress(addr)) // TODO if toAddr == (common.Address{}) { return nil, ErrToAddressError } value = math.U256(value) // Get the arguments from the memory. args := memory.Get(inOffset.Int64(), inSize.Int64()) asset := contract.GetCallMsg() if asset == nil && value.Sign() != 0 { asset = &assets.Asset{Tkn: &assets.Token{ Currency: *common.BytesToHash(common.LeftPadBytes([]byte("SERO"), 32)).HashToUint256(), Value: utils.U256(*value), }, } } if asset != nil { gas += params.CallStipend } ret, returnGas, err, alarm := interpreter.evm.Call(contract, toAddr, args, gas, asset) contract.SetCallMsg(nil) if err != nil { stack.push(interpreter.intPool.getZero()) } else { stack.push(interpreter.intPool.get().SetUint64(1)) } if err == nil || err == errExecutionReverted { memory.Set(retOffset.Uint64(), retSize.Uint64(), ret) } contract.Gas += returnGas if alarm { contract.UseGas(contract.Gas) } interpreter.intPool.put(addr, value, inOffset, inSize, retOffset, retSize) return ret, nil } func opCallCode(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { // Pop gas. The actual gas is in interpreter.evm.callGasTemp. interpreter.intPool.put(stack.pop()) gas := interpreter.evm.callGasTemp // Pop other call parameters. addr, value, inOffset, inSize, retOffset, retSize := stack.pop(), stack.pop(), stack.pop(), stack.pop(), stack.pop(), stack.pop() toAddr := contract.GetNonceAddress(interpreter.evm.StateDB, common.BigToContractAddress(addr)) // TODO if toAddr == (common.Address{}) { return nil, ErrToAddressError } value = math.U256(value) // Get arguments from the memory. args := memory.Get(inOffset.Int64(), inSize.Int64()) asset := contract.GetCallMsg() if asset == nil && value.Sign() != 0 { asset = &assets.Asset{Tkn: &assets.Token{ Currency: *common.BytesToHash(common.LeftPadBytes([]byte("SERO"), 32)).HashToUint256(), Value: utils.U256(*value), }, } } if asset != nil { gas += params.CallStipend } ret, returnGas, err, alarm := interpreter.evm.Call(contract, toAddr, args, gas, asset) contract.SetCallMsg(nil) if err != nil { stack.push(interpreter.intPool.getZero()) } else { stack.push(interpreter.intPool.get().SetUint64(1)) } if err == nil || err == errExecutionReverted { memory.Set(retOffset.Uint64(), retSize.Uint64(), ret) } contract.Gas += returnGas if alarm { contract.UseGas(contract.Gas) } interpreter.intPool.put(addr, value, inOffset, inSize, retOffset, retSize) return ret, nil } func opDelegateCall(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { // Pop gas. The actual gas is in interpreter.evm.callGasTemp. interpreter.intPool.put(stack.pop()) gas := interpreter.evm.callGasTemp // Pop other call parameters. addr, inOffset, inSize, retOffset, retSize := stack.pop(), stack.pop(), stack.pop(), stack.pop(), stack.pop() toAddr := contract.GetNonceAddress(interpreter.evm.StateDB, common.BigToContractAddress(addr)) // TODO if toAddr == (common.Address{}) { return nil, ErrToAddressError } // Get arguments from the memory. args := memory.Get(inOffset.Int64(), inSize.Int64()) ret, returnGas, err := interpreter.evm.DelegateCall(contract, toAddr, args, gas) if err != nil { stack.push(interpreter.intPool.getZero()) } else { stack.push(interpreter.intPool.get().SetUint64(1)) } if err == nil || err == errExecutionReverted { memory.Set(retOffset.Uint64(), retSize.Uint64(), ret) } contract.Gas += returnGas interpreter.intPool.put(addr, inOffset, inSize, retOffset, retSize) return ret, nil } func opStaticCall(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { // Pop gas. The actual gas is in interpreter.evm.callGasTemp. interpreter.intPool.put(stack.pop()) gas := interpreter.evm.callGasTemp // Pop other call parameters. addr, inOffset, inSize, retOffset, retSize := stack.pop(), stack.pop(), stack.pop(), stack.pop(), stack.pop() toAddr := contract.GetNonceAddress(interpreter.evm.StateDB, common.BigToContractAddress(addr)) // TODO if toAddr == (common.Address{}) { return nil, ErrToAddressError } // Get arguments from the memory. args := memory.Get(inOffset.Int64(), inSize.Int64()) ret, returnGas, err := interpreter.evm.StaticCall(contract, toAddr, args, gas) if err != nil { stack.push(interpreter.intPool.getZero()) } else { stack.push(interpreter.intPool.get().SetUint64(1)) } if err == nil || err == errExecutionReverted { memory.Set(retOffset.Uint64(), retSize.Uint64(), ret) } contract.Gas += returnGas interpreter.intPool.put(addr, inOffset, inSize, retOffset, retSize) return ret, nil } func opReturn(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { offset, size := stack.pop(), stack.pop() ret := memory.GetPtr(offset.Int64(), size.Int64()) interpreter.intPool.put(offset, size) return ret, nil } func opRevert(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { offset, size := stack.pop(), stack.pop() ret := memory.GetPtr(offset.Int64(), size.Int64()) interpreter.intPool.put(offset, size) return ret, nil } func opStop(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { return nil, nil } func opSuicide(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { // toAddr := contract.GetNonceAddress(interpreter.evm.StateDB, common.BigToContractAddress(stack.pop())) // interpreter.evm.StateDB.Suicide(contract.Address(), toAddr) return nil, nil } func handleAllotTicket(d []byte, evm *EVM, contract *Contract, mem []byte) (common.Hash, uint64, error, bool) { offset := new(big.Int).SetBytes(d[64:96]).Uint64() len := new(big.Int).SetBytes(mem[offset : offset+32]).Uint64() if len == 0 { return common.Hash{}, 0, fmt.Errorf("allotTicket error , contract : %s, error : %s", contract.Address(), "nameLen is zero"), false } categoryName := string(mem[offset+32 : offset+32+len]) match, err := regexp.Match("^[A-Z][A-Z0-9_]{0,31}$", []byte(categoryName)) if err != nil || !match { return common.Hash{}, 0, fmt.Errorf("allotTicket error , contract : %s, error : %s", contract.Address(), "illegal categoryName"), false } categoryName = strings.ToUpper(categoryName) if strings.Contains(categoryName, "SERO") { return common.Hash{}, 0, fmt.Errorf("allotTicket error , contract : %s, error : %s", contract.Address(), "categoryName can not contains SERO"), false } gas := evm.callGasTemp value := common.BytesToHash(d[0:32]) if value == (common.Hash{}) { if !evm.StateDB.RegisterTicket(contract.Address(), categoryName) { return common.Hash{}, 0, fmt.Errorf("allotTicket error , contract : %s, error : %s", contract.Address(), "categoryName registered by other"), false } if gas >= params.CreateTicketGas { gas -= params.CreateTicketGas } else { return common.Hash{}, 0, fmt.Errorf("allotTicket error , contract : %s, error : %s", contract.Address(), "out of gas"), false } nonce := evm.StateDB.GetTicketNonce(contract.Address()) evm.StateDB.SetTicketNonce(contract.Address(), nonce+1) bytes, _ := rlp.EncodeToBytes([]interface{}{contract.Address(), categoryName, nonce}) value = crypto.Keccak256Hash(bytes) if e := c_superzk.IsTktValid(common.BytesToHash(common.LeftPadBytes([]byte(categoryName), 32)).HashToUint256(), value.HashToUint256()); e != nil { return common.Hash{}, 0, fmt.Errorf("allotTicket error , contract : %s, error : %s", contract.Address(), "categoryName has no base"), false } evm.StateDB.AddTicket(contract.Address(), categoryName, value) } toAddr := evm.StateDB.GetNonceAddress(d[44:64]) alarm := false if toAddr != (common.Address{}) && toAddr != contract.Address() { asset := assets.Asset{ Tkt: &assets.Ticket{ Category: *common.BytesToHash(common.LeftPadBytes([]byte(categoryName), 32)).HashToUint256(), Value: *value.HashToUint256(), }, } gas += params.CallStipend _, returnGas, err, _alarm := evm.Call(contract, toAddr, nil, gas, &asset) alarm = _alarm // contract.Gas += returnGas if err != nil { return common.Hash{}, returnGas, err, alarm } else { return value, returnGas, nil, alarm } } return value, gas, nil, alarm } var ( base = new(big.Int).SetUint64(1e+17) level1 = new(big.Int).Mul(big.NewInt(10000000), base) level2 = new(big.Int).Mul(big.NewInt(5000000), base) level3 = new(big.Int).Mul(big.NewInt(100000), base) level4 = new(big.Int).Mul(big.NewInt(10000), base) level5 = new(big.Int).Mul(big.NewInt(100), base) level6 = new(big.Int).Mul(big.NewInt(10), base) level7 = new(big.Int).Mul(big.NewInt(1), base) ) func tokenFee(coinName string) *big.Int { switch len(coinName) { case 1: return level1 case 2: return level2 case 3: return level3 case 4: return level4 case 5: return level5 case 6: return level6 } return level7 } var foundationAccount1 = common.Base58ToAddress("hcZCikh7h3By7FBoDhCj8a6swKukeZRKm5Xg1s9RStPTNV7GzE3rJDzJsDwCWy9p86A8amMdCHgF7jKaMfSt1zfaBEbqkapuveHyFko2V9ZKisMC5qMp4VacYnApXokr4ea") var foundationAccount2 = common.Base58ToAddress("5niHmAcSoDzaekKTUpLR3qkQf6djC7AGhnJnuPr8w7ArqQzhxyhEf61Rp68WhpoYo57r5q8CVsLopTJ9uc5VS92fRSHsjBqY9rqMJfQ4DBMw5QyXvT4oyeF7P9sb7ruvwZD") func handleIssueToken(d []byte, evm *EVM, contract *Contract, mem []byte) (bool, error) { offset := new(big.Int).SetBytes(d[0:32]).Uint64() len := new(big.Int).SetBytes(mem[offset : offset+32]).Uint64() if len == 0 { return false, fmt.Errorf("issueToken error , contract : %s, error : %s", contract.Address(), "nameLen is zero") } coinName := string(mem[offset+32 : offset+32+len]) match, err := regexp.Match("^[A-Z][A-Z0-9_]{0,31}$", []byte(coinName)) if err != nil || !match { return false, fmt.Errorf("issueToken error , contract : %s, error : %s", contract.Address(), "illegal coinName") } coinName = strings.ToUpper(coinName) if strings.Contains(coinName, "SERO") { return false, fmt.Errorf("issueToken error , contract : %s, error : %s", contract.Address(), "coinName can not contains SERO") } address := evm.StateDB.GetContrctAddressByToken(coinName) if address == (common.Address{}) { fee := new(big.Int).Set(level6) if evm.chainConfig.ChainID.Uint64() == 2019 { fee = tokenFee(coinName) } if evm.StateDB.GetBalance(contract.Address(), "SERO").Cmp(fee) >= 0 { if !evm.StateDB.RegisterToken(contract.Address(), coinName) { return false, fmt.Errorf("issueToken error , contract : %s, error : %s", contract.Address(), "coinName registered by other") } else { evm.StateDB.SubBalance(contract.Address(), "SERO", fee) asset := assets.Asset{Tkn: &assets.Token{ Currency: *common.BytesToHash(common.LeftPadBytes([]byte("SERO"), 32)).HashToUint256(), Value: utils.U256(*fee), }} if evm.BlockNumber.Uint64() >= seroparam.SIP5() { if e := c_superzk.IsTknValid(&asset.Tkn.Currency); e != nil { return false, fmt.Errorf("issueToken error , contract : %s, error : %s", contract.Address(), "coinName has no base") } } if evm.BlockNumber.Uint64() >= 300000 { evm.StateDB.NextZState().AddTxOut(foundationAccount2, asset, evm.TxHash) } else { evm.StateDB.NextZState().AddTxOut(foundationAccount1, asset, evm.TxHash) } } } else { return false, fmt.Errorf("issueToken error , contract : %s, error : %s", contract.Address(), "insufficient balance for token fee") } } else if address != contract.Address() { return false, fmt.Errorf("issueToken error , contract : %s, error : %s", contract.Address(), "coinName registered by other") } total := new(big.Int).SetBytes(d[32:64]) evm.StateDB.AddBalance(contract.Address(), coinName, total) return true, nil } func handleSend(d []byte, evm *EVM, contract *Contract, mem []byte) ([]byte, uint64, error, bool) { addr := common.BytesToContractAddress(d[12:32]) toAddr := evm.StateDB.GetNonceAddress(addr[:]) if toAddr == (common.Address{}) { return nil, 0, fmt.Errorf("handleSend error , contract : %s, toAddr : %s, error : %s", contract.Address(), toAddr, "not load toAddrss"), false } currency_offset := new(big.Int).SetBytes(d[32:64]).Uint64() length := new(big.Int).SetBytes(mem[currency_offset : currency_offset+32]).Uint64() var currency string if length != 0 { currency = string(mem[currency_offset+32 : currency_offset+32+length]) } var category string category_offset := new(big.Int).SetBytes(d[96:128]).Uint64() length = new(big.Int).SetBytes(mem[category_offset : category_offset+32]).Uint64() if length != 0 { category = string(mem[category_offset+32 : category_offset+32+length]) } currency = strings.ToUpper(currency) category = strings.ToUpper(category) amount := new(big.Int).SetBytes(d[64:96]) ticketHash := common.BytesToHash(d[128:160]) var token *assets.Token if len(currency) != 0 && amount.Sign() != 0 { balance := evm.StateDB.GetBalance(contract.Address(), currency) if balance.Cmp(amount) < 0 { return nil, 0, fmt.Errorf("handleSend error , contract : %s, toAddr : %s, error : %s", contract.Address(), toAddr, "balance not enough"), false } token = &assets.Token{ Currency: *common.BytesToHash(common.LeftPadBytes([]byte(currency), 32)).HashToUint256(), Value: utils.U256(*amount), } } var ticket *assets.Ticket if len(category) != 0 && ticketHash != (common.Hash{}) { if !evm.StateDB.OwnTicket(contract.Address(), category, ticketHash) { return nil, 0, fmt.Errorf("handleSend error , contract : %s, toAddr : %s, error : %s", contract.Address(), toAddr, "ticket not own"), false } ticket = &assets.Ticket{ Category: *common.BytesToHash(common.LeftPadBytes([]byte(category), 32)).HashToUint256(), Value: *ticketHash.HashToUint256(), } } asset := assets.Asset{Tkn: token, Tkt: ticket} gas := evm.callGasTemp + params.CallStipend return evm.Call(contract, toAddr, nil, gas, &asset) } var ( memLens = map[common.Hash]int{ topic_issueToken: 64, topic_send: 160, topic_balanceOf: 32, topic_allotTicket: 96, topic_currency: 32, topic_category: 32, topic_ticket: 32, topic_setCallValues: 128, topic_setTokenRate: 96, topic_closePkg: 256, topic_transferPkg: 64, } ) func makeLog(size int) executionFunc { return func(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { topics := make([]common.Hash, size) mStart, mSize := stack.pop(), stack.pop() for i := 0; i < size; i++ { topics[i] = common.BigToHash(stack.pop()) } //data := memory.Get(0, int64(memory.Len())) data:=memory.GetPtr(0,int64(memory.Len())) d := memory.Get(mStart.Int64(), mSize.Int64()) if (topics[0] == topic_update)&&(interpreter.evm.BlockNumber.Uint64()>=seroparam.SIP10()) { if len(d)<=32 { return nil, fmt.Errorf("contract update error: size(%d) < 32", len(d)) } size := new(big.Int).SetBytes(d[0:32]).Int64(); if size+32!=int64(len(d)) { return nil, fmt.Errorf("contract update error: param-lenght(%d) size(%d)", len(d),size) } code:=d[32:] interpreter.evm.StateDB.SetCode(*contract.CodeAddr,code) contract.Gas += interpreter.evm.callGasTemp } else { length := mSize.Uint64() if l, ok := memLens[topics[0]]; ok { if l != len(d) { return d, ErrCodeInvalid } } if topics[0] == topic_allotTicket { hash, returnGas, err, alarm := handleAllotTicket(d, interpreter.evm, contract, data) contract.Gas += returnGas if alarm { contract.UseGas(contract.Gas) } if err != nil { log.Trace("IssueToken error ", "contract", contract.Address(), "error", err) } // hash := common.Hash{} memory.Set(mStart.Uint64()+length-32, 32, hash[:]) } else if topics[0] == topic_issueToken { if ok, err := handleIssueToken(d, interpreter.evm, contract, data); ok { memory.Set(mStart.Uint64()+length-32, 32, hashTrue) } else { log.Trace("IssueToken error ", "contract", contract.Address(), "error", err) memory.Set(mStart.Uint64()+length-32, 32, hashFalse) } contract.Gas += interpreter.evm.callGasTemp } else if topics[0] == topic_balanceOf { offset := new(big.Int).SetBytes(d[0:32]).Uint64() len := new(big.Int).SetBytes(data[offset : offset+32]).Uint64() balance := new(big.Int) if len != 0 { coinName := string(data[offset+32 : offset+32+len]) balance = interpreter.evm.StateDB.GetBalance(contract.Address(), coinName) } memory.Set(mStart.Uint64(), 32, common.LeftPadBytes(balance.Bytes(), 32)) contract.Gas += interpreter.evm.callGasTemp } else if topics[0] == topic_send { _, returnGas, err, alarm := handleSend(d, interpreter.evm, contract, data) contract.Gas += returnGas if alarm { contract.UseGas(contract.Gas) } if err != nil { log.Trace("send error ", "contract", contract.Address(), "error", err) memory.Set(mStart.Uint64()+length-32, 32, hashFalse) } else { memory.Set(mStart.Uint64()+length-32, 32, hashTrue) } } else if topics[0] == topic_currency { if contract.asset != nil && contract.asset.Tkn != nil { currency := strings.Trim(string(contract.asset.Tkn.Currency[:]), string([]byte{0})) memory.Set(mStart.Uint64(), 32, []byte(currency)) } else { memory.Set(mStart.Uint64(), 32, []byte{}) } contract.Gas += interpreter.evm.callGasTemp } else if topics[0] == topic_category { if contract.asset != nil && contract.asset.Tkt != nil { category := strings.Trim(string(contract.asset.Tkt.Category[:]), string([]byte{0})) memory.Set(mStart.Uint64(), 32, []byte(category)) } else { memory.Set(mStart.Uint64(), 32, []byte{}) } contract.Gas += interpreter.evm.callGasTemp } else if topics[0] == topic_ticket { if contract.asset != nil && contract.asset.Tkt != nil { memory.Set(mStart.Uint64(), 32, contract.asset.Tkt.Value[:]) } else { memory.Set(mStart.Uint64(), 32, []byte{}) } contract.Gas += interpreter.evm.callGasTemp } else if topics[0] == topic_setCallValues { setCallValues(d, data, contract) contract.Gas += interpreter.evm.callGasTemp } else if topics[0] == topic_txHash { memory.Set(mStart.Uint64(), 32, interpreter.evm.TxHash.Bytes()) contract.Gas += interpreter.evm.callGasTemp } else if topics[0] == topic_setTokenRate { offset := new(big.Int).SetBytes(d[0:32]).Uint64() len := new(big.Int).SetBytes(data[offset : offset+32]).Uint64() if len == 0 { return nil, fmt.Errorf("setTokenRate error , contract : %s, error : %s", contract.Address(), "coinName len=0") } coinName := string(data[offset+32 : offset+32+len]) match, err := regexp.Match("^[A-Z][A-Z0-9_]{0,31}$", []byte(coinName)) if err != nil || !match { return nil, fmt.Errorf("issueToken error , contract : %s, error : %s", contract.Address(), "illegal coinName") } if interpreter.evm.StateDB.SetTokenRate(contract.Address(), coinName, new(big.Int).SetBytes(d[32:64]), new(big.Int).SetBytes(d[64:96])) { memory.Set(mStart.Uint64()+length-32, 32, hashTrue) } else { memory.Set(mStart.Uint64()+length-32, 32, hashFalse) } contract.Gas += interpreter.evm.callGasTemp } else if topics[0] == topic_closePkg { id := c_type.Uint256{} copy(id[:], d[0:32]) key := c_type.Uint256{} copy(key[:], d[32:64]) pkg, err := interpreter.evm.StateDB.NextZState().Pkgs.Close(&id, contract.Address().ToPKr(), &key) if err != nil { memory.Set(mStart.Uint64(), 256, make([]byte, 256)) } else { if pkg.O.Asset.Tkn != nil { currency := common.BytesToString(pkg.O.Asset.Tkn.Currency[:]) amount := pkg.O.Asset.Tkn.Value.ToIntRef() if len(currency) != 0 && amount.Sign() > 0 { interpreter.evm.StateDB.AddBalance(contract.Address(), currency, amount) } memory.Set(mStart.Uint64(), 32, pkg.O.Asset.Tkn.Currency[:]) hash := common.BigToHash(pkg.O.Asset.Tkn.Value.ToIntRef()) memory.Set(mStart.Uint64()+32, 32, hash[:]) } if pkg.O.Asset.Tkt != nil { category := common.BytesToString(pkg.O.Asset.Tkt.Category[:]) ticket := common.BytesToHash(pkg.O.Asset.Tkt.Value[:]) if len(category) != 0 && ticket != (common.Hash{}) { interpreter.evm.StateDB.AddTicket(contract.Address(), category, ticket) } memory.Set(mStart.Uint64()+64, 32, pkg.O.Asset.Tkt.Category[:]) memory.Set(mStart.Uint64()+96, 32, pkg.O.Asset.Tkt.Value[:]) } from := common.BytesToAddress(pkg.Z.From[:]).ToCaddr() memory.Set(mStart.Uint64()+128, 32, common.LeftPadBytes(from[:], 32)) memory.Set(mStart.Uint64()+160, 32, common.LeftPadBytes(big.NewInt(0).SetUint64(pkg.Z.High).Bytes(), 32)) if len(pkg.O.Memo) > 0 { memory.Set(mStart.Uint64()+192, 32, pkg.O.Memo[0:32]) memory.Set(mStart.Uint64()+224, 32, pkg.O.Memo[32:64]) } } contract.Gas += interpreter.evm.callGasTemp } else if topics[0] == topic_transferPkg { id := c_type.Uint256{} copy(id[:], d[0:32]) toAddr := contract.GetNonceAddress(interpreter.evm.StateDB, common.BytesToContractAddress(d[32:64])) if toAddr == (common.Address{}) { return nil, ErrToAddressError } if err := interpreter.evm.StateDB.NextZState().Pkgs.Transfer(&id, contract.Address().ToPKr(), toAddr.ToPKr()); err != nil { memory.Set(mStart.Uint64()+length-32, 32, hashFalse) } else { memory.Set(mStart.Uint64()+length-32, 32, hashTrue) } contract.Gas += interpreter.evm.callGasTemp } else { interpreter.evm.StateDB.AddLog(&types.Log{ Address: contract.Address(), Topics: topics, Data: d, // This is a non-consensus field, but assigned here because // core/state doesn't know the current block number. BlockNumber: interpreter.evm.BlockNumber.Uint64(), }) contract.Gas += interpreter.evm.callGasTemp } } interpreter.intPool.put(mStart, mSize) return nil, nil } } func setCallValues(d []byte, data []byte, contract *Contract) { currency_offset := new(big.Int).SetBytes(d[0:32]).Uint64() length := new(big.Int).SetBytes(data[currency_offset : currency_offset+32]).Uint64() var currency string if length != 0 { currency = string(data[currency_offset+32 : currency_offset+32+length]) } var category string category_offset := new(big.Int).SetBytes(d[64:96]).Uint64() length = new(big.Int).SetBytes(data[category_offset : category_offset+32]).Uint64() if length != 0 { category = string(data[category_offset+32 : category_offset+32+length]) } currency = strings.ToUpper(currency) category = strings.ToUpper(category) amount := new(big.Int).SetBytes(d[32:64]) ticketHash := common.BytesToHash(d[96:128]) var token *assets.Token if len(currency) != 0 && amount.Sign() != 0 { token = &assets.Token{ Currency: *common.BytesToHash(common.LeftPadBytes([]byte(currency), 32)).HashToUint256(), Value: utils.U256(*amount), } } var ticket *assets.Ticket if len(category) != 0 && ticketHash != (common.Hash{}) { ticket = &assets.Ticket{ Category: *common.BytesToHash(common.LeftPadBytes([]byte(category), 32)).HashToUint256(), Value: *ticketHash.HashToUint256(), } } if token != nil || ticket != nil { contract.SetCallMsg(&assets.Asset{Tkn: token, Tkt: ticket}) } } // make push instruction function func makePush(size uint64, pushByteSize int) executionFunc { return func(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { codeLen := len(contract.Code) startMin := codeLen if int(*pc+1) < startMin { startMin = int(*pc + 1) } endMin := codeLen if startMin+pushByteSize < endMin { endMin = startMin + pushByteSize } integer := interpreter.intPool.get() stack.push(integer.SetBytes(common.RightPadBytes(contract.Code[startMin:endMin], pushByteSize))) *pc += size return nil, nil } } // make dup instruction function func makeDup(size int64) executionFunc { return func(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { stack.dup(interpreter.intPool, int(size)) return nil, nil } } // make swap instruction function func makeSwap(size int64) executionFunc { // switch n + 1 otherwise n would be swapped with n size++ return func(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { stack.swap(int(size)) return nil, nil } } ================================================ FILE: core/vm/instructions_test.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package vm import ( "math/big" "testing" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/params" ) type twoOperandTest struct { x string y string expected string } func testTwoOperandOp(t *testing.T, tests []twoOperandTest, opFn func(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error)) { var ( env = NewEVM(Context{}, nil, params.TestChainConfig, Config{}) stack = newstack() pc = uint64(0) evmInterpreter = NewEVMInterpreter(env, env.vmConfig) ) env.interpreter = evmInterpreter evmInterpreter.intPool = poolOfIntPools.get() for i, test := range tests { x := new(big.Int).SetBytes(common.Hex2Bytes(test.x)) shift := new(big.Int).SetBytes(common.Hex2Bytes(test.y)) expected := new(big.Int).SetBytes(common.Hex2Bytes(test.expected)) stack.push(x) stack.push(shift) opFn(&pc, evmInterpreter, nil, nil, stack) actual := stack.pop() if actual.Cmp(expected) != 0 { t.Errorf("Testcase %d, expected %v, got %v", i, expected, actual) } // Check pool usage // 1.pool is not allowed to contain anything on the stack // 2.pool is not allowed to contain the same pointers twice if evmInterpreter.intPool.pool.len() > 0 { poolvals := make(map[*big.Int]struct{}) poolvals[actual] = struct{}{} for evmInterpreter.intPool.pool.len() > 0 { key := evmInterpreter.intPool.get() if _, exist := poolvals[key]; exist { t.Errorf("Testcase %d, pool contains double-entry", i) } poolvals[key] = struct{}{} } } } poolOfIntPools.put(evmInterpreter.intPool) } func TestByteOp(t *testing.T) { var ( env = NewEVM(Context{}, nil, params.TestChainConfig, Config{}) stack = newstack() evmInterpreter = NewEVMInterpreter(env, env.vmConfig) ) env.interpreter = evmInterpreter evmInterpreter.intPool = poolOfIntPools.get() tests := []struct { v string th uint64 expected *big.Int }{ {"ABCDEF0908070605040302010000000000000000000000000000000000000000", 0, big.NewInt(0xAB)}, {"ABCDEF0908070605040302010000000000000000000000000000000000000000", 1, big.NewInt(0xCD)}, {"00CDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff", 0, big.NewInt(0x00)}, {"00CDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff", 1, big.NewInt(0xCD)}, {"0000000000000000000000000000000000000000000000000000000000102030", 31, big.NewInt(0x30)}, {"0000000000000000000000000000000000000000000000000000000000102030", 30, big.NewInt(0x20)}, {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 32, big.NewInt(0x0)}, {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 0xFFFFFFFFFFFFFFFF, big.NewInt(0x0)}, } pc := uint64(0) for _, test := range tests { val := new(big.Int).SetBytes(common.Hex2Bytes(test.v)) th := new(big.Int).SetUint64(test.th) stack.push(val) stack.push(th) opByte(&pc, evmInterpreter, nil, nil, stack) actual := stack.pop() if actual.Cmp(test.expected) != 0 { t.Fatalf("Expected [%v] %v:th byte to be %v, was %v.", test.v, test.th, test.expected, actual) } } poolOfIntPools.put(evmInterpreter.intPool) } func TestSHL(t *testing.T) { // Testcases from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-145.md#shl-shift-left tests := []twoOperandTest{ {"0000000000000000000000000000000000000000000000000000000000000001", "00", "0000000000000000000000000000000000000000000000000000000000000001"}, {"0000000000000000000000000000000000000000000000000000000000000001", "01", "0000000000000000000000000000000000000000000000000000000000000002"}, {"0000000000000000000000000000000000000000000000000000000000000001", "ff", "8000000000000000000000000000000000000000000000000000000000000000"}, {"0000000000000000000000000000000000000000000000000000000000000001", "0100", "0000000000000000000000000000000000000000000000000000000000000000"}, {"0000000000000000000000000000000000000000000000000000000000000001", "0101", "0000000000000000000000000000000000000000000000000000000000000000"}, {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "00", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "01", "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"}, {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "ff", "8000000000000000000000000000000000000000000000000000000000000000"}, {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0100", "0000000000000000000000000000000000000000000000000000000000000000"}, {"0000000000000000000000000000000000000000000000000000000000000000", "01", "0000000000000000000000000000000000000000000000000000000000000000"}, {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "01", "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"}, } testTwoOperandOp(t, tests, opSHL) } func TestSHR(t *testing.T) { // Testcases from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-145.md#shr-logical-shift-right tests := []twoOperandTest{ {"0000000000000000000000000000000000000000000000000000000000000001", "00", "0000000000000000000000000000000000000000000000000000000000000001"}, {"0000000000000000000000000000000000000000000000000000000000000001", "01", "0000000000000000000000000000000000000000000000000000000000000000"}, {"8000000000000000000000000000000000000000000000000000000000000000", "01", "4000000000000000000000000000000000000000000000000000000000000000"}, {"8000000000000000000000000000000000000000000000000000000000000000", "ff", "0000000000000000000000000000000000000000000000000000000000000001"}, {"8000000000000000000000000000000000000000000000000000000000000000", "0100", "0000000000000000000000000000000000000000000000000000000000000000"}, {"8000000000000000000000000000000000000000000000000000000000000000", "0101", "0000000000000000000000000000000000000000000000000000000000000000"}, {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "00", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "01", "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "ff", "0000000000000000000000000000000000000000000000000000000000000001"}, {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0100", "0000000000000000000000000000000000000000000000000000000000000000"}, {"0000000000000000000000000000000000000000000000000000000000000000", "01", "0000000000000000000000000000000000000000000000000000000000000000"}, } testTwoOperandOp(t, tests, opSHR) } func TestSAR(t *testing.T) { // Testcases from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-145.md#sar-arithmetic-shift-right tests := []twoOperandTest{ {"0000000000000000000000000000000000000000000000000000000000000001", "00", "0000000000000000000000000000000000000000000000000000000000000001"}, {"0000000000000000000000000000000000000000000000000000000000000001", "01", "0000000000000000000000000000000000000000000000000000000000000000"}, {"8000000000000000000000000000000000000000000000000000000000000000", "01", "c000000000000000000000000000000000000000000000000000000000000000"}, {"8000000000000000000000000000000000000000000000000000000000000000", "ff", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, {"8000000000000000000000000000000000000000000000000000000000000000", "0100", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, {"8000000000000000000000000000000000000000000000000000000000000000", "0101", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "00", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "01", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "ff", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0100", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, {"0000000000000000000000000000000000000000000000000000000000000000", "01", "0000000000000000000000000000000000000000000000000000000000000000"}, {"4000000000000000000000000000000000000000000000000000000000000000", "fe", "0000000000000000000000000000000000000000000000000000000000000001"}, {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "f8", "000000000000000000000000000000000000000000000000000000000000007f"}, {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "fe", "0000000000000000000000000000000000000000000000000000000000000001"}, {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "ff", "0000000000000000000000000000000000000000000000000000000000000000"}, {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0100", "0000000000000000000000000000000000000000000000000000000000000000"}, } testTwoOperandOp(t, tests, opSAR) } func TestSGT(t *testing.T) { tests := []twoOperandTest{ {"0000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000000"}, {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000000"}, {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000000"}, {"0000000000000000000000000000000000000000000000000000000000000001", "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000001"}, {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000000"}, {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000001"}, {"0000000000000000000000000000000000000000000000000000000000000001", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000000"}, {"8000000000000000000000000000000000000000000000000000000000000001", "8000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000000"}, {"8000000000000000000000000000000000000000000000000000000000000001", "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000001"}, {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "8000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000000"}, {"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb", "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd", "0000000000000000000000000000000000000000000000000000000000000001"}, {"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd", "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb", "0000000000000000000000000000000000000000000000000000000000000000"}, } testTwoOperandOp(t, tests, opSgt) } func TestSLT(t *testing.T) { tests := []twoOperandTest{ {"0000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000000"}, {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000000"}, {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000000"}, {"0000000000000000000000000000000000000000000000000000000000000001", "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000000"}, {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000001"}, {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000000"}, {"0000000000000000000000000000000000000000000000000000000000000001", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000001"}, {"8000000000000000000000000000000000000000000000000000000000000001", "8000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000000"}, {"8000000000000000000000000000000000000000000000000000000000000001", "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000000"}, {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "8000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000001"}, {"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb", "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd", "0000000000000000000000000000000000000000000000000000000000000000"}, {"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd", "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb", "0000000000000000000000000000000000000000000000000000000000000001"}, } testTwoOperandOp(t, tests, opSlt) } func opBenchmark(bench *testing.B, op func(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error), args ...string) { var ( env = NewEVM(Context{}, nil, params.TestChainConfig, Config{}) stack = newstack() evmInterpreter = NewEVMInterpreter(env, env.vmConfig) ) env.interpreter = evmInterpreter evmInterpreter.intPool = poolOfIntPools.get() // convert args byteArgs := make([][]byte, len(args)) for i, arg := range args { byteArgs[i] = common.Hex2Bytes(arg) } pc := uint64(0) bench.ResetTimer() for i := 0; i < bench.N; i++ { for _, arg := range byteArgs { a := new(big.Int).SetBytes(arg) stack.push(a) } op(&pc, evmInterpreter, nil, nil, stack) stack.pop() } poolOfIntPools.put(evmInterpreter.intPool) } func BenchmarkOpAdd64(b *testing.B) { x := "ffffffff" y := "fd37f3e2bba2c4f" opBenchmark(b, opAdd, x, y) } func BenchmarkOpAdd128(b *testing.B) { x := "ffffffffffffffff" y := "f5470b43c6549b016288e9a65629687" opBenchmark(b, opAdd, x, y) } func BenchmarkOpAdd256(b *testing.B) { x := "0802431afcbce1fc194c9eaa417b2fb67dc75a95db0bc7ec6b1c8af11df6a1da9" y := "a1f5aac137876480252e5dcac62c354ec0d42b76b0642b6181ed099849ea1d57" opBenchmark(b, opAdd, x, y) } func BenchmarkOpSub64(b *testing.B) { x := "51022b6317003a9d" y := "a20456c62e00753a" opBenchmark(b, opSub, x, y) } func BenchmarkOpSub128(b *testing.B) { x := "4dde30faaacdc14d00327aac314e915d" y := "9bbc61f5559b829a0064f558629d22ba" opBenchmark(b, opSub, x, y) } func BenchmarkOpSub256(b *testing.B) { x := "4bfcd8bb2ac462735b48a17580690283980aa2d679f091c64364594df113ea37" y := "97f9b1765588c4e6b69142eb00d20507301545acf3e1238c86c8b29be227d46e" opBenchmark(b, opSub, x, y) } func BenchmarkOpMul(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opMul, x, y) } func BenchmarkOpDiv256(b *testing.B) { x := "ff3f9014f20db29ae04af2c2d265de17" y := "fe7fb0d1f59dfe9492ffbf73683fd1e870eec79504c60144cc7f5fc2bad1e611" opBenchmark(b, opDiv, x, y) } func BenchmarkOpDiv128(b *testing.B) { x := "fdedc7f10142ff97" y := "fbdfda0e2ce356173d1993d5f70a2b11" opBenchmark(b, opDiv, x, y) } func BenchmarkOpDiv64(b *testing.B) { x := "fcb34eb3" y := "f97180878e839129" opBenchmark(b, opDiv, x, y) } func BenchmarkOpSdiv(b *testing.B) { x := "ff3f9014f20db29ae04af2c2d265de17" y := "fe7fb0d1f59dfe9492ffbf73683fd1e870eec79504c60144cc7f5fc2bad1e611" opBenchmark(b, opSdiv, x, y) } func BenchmarkOpMod(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opMod, x, y) } func BenchmarkOpSmod(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opSmod, x, y) } func BenchmarkOpExp(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opExp, x, y) } func BenchmarkOpSignExtend(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opSignExtend, x, y) } func BenchmarkOpLt(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opLt, x, y) } func BenchmarkOpGt(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opGt, x, y) } func BenchmarkOpSlt(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opSlt, x, y) } func BenchmarkOpSgt(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opSgt, x, y) } func BenchmarkOpEq(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opEq, x, y) } func BenchmarkOpEq2(b *testing.B) { x := "FBCDEF090807060504030201ffffffffFBCDEF090807060504030201ffffffff" y := "FBCDEF090807060504030201ffffffffFBCDEF090807060504030201fffffffe" opBenchmark(b, opEq, x, y) } func BenchmarkOpAnd(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opAnd, x, y) } func BenchmarkOpOr(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opOr, x, y) } func BenchmarkOpXor(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opXor, x, y) } func BenchmarkOpByte(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opByte, x, y) } func BenchmarkOpAddmod(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" z := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opAddmod, x, y, z) } func BenchmarkOpMulmod(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" z := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" opBenchmark(b, opMulmod, x, y, z) } func BenchmarkOpSHL(b *testing.B) { x := "FBCDEF090807060504030201ffffffffFBCDEF090807060504030201ffffffff" y := "ff" opBenchmark(b, opSHL, x, y) } func BenchmarkOpSHR(b *testing.B) { x := "FBCDEF090807060504030201ffffffffFBCDEF090807060504030201ffffffff" y := "ff" opBenchmark(b, opSHR, x, y) } func BenchmarkOpSAR(b *testing.B) { x := "FBCDEF090807060504030201ffffffffFBCDEF090807060504030201ffffffff" y := "ff" opBenchmark(b, opSAR, x, y) } func BenchmarkOpIsZero(b *testing.B) { x := "FBCDEF090807060504030201ffffffffFBCDEF090807060504030201ffffffff" opBenchmark(b, opIszero, x) } func TestOpMstore(t *testing.T) { var ( env = NewEVM(Context{}, nil, params.TestChainConfig, Config{}) stack = newstack() mem = NewMemory() evmInterpreter = NewEVMInterpreter(env, env.vmConfig) ) env.interpreter = evmInterpreter evmInterpreter.intPool = poolOfIntPools.get() mem.Resize(64) pc := uint64(0) v := "abcdef00000000000000abba000000000deaf000000c0de00100000000133700" stack.pushN(new(big.Int).SetBytes(common.Hex2Bytes(v)), big.NewInt(0)) opMstore(&pc, evmInterpreter, nil, mem, stack) if got := common.Bytes2Hex(mem.Get(0, 32)); got != v { t.Fatalf("Mstore fail, got %v, expected %v", got, v) } stack.pushN(big.NewInt(0x1), big.NewInt(0)) opMstore(&pc, evmInterpreter, nil, mem, stack) if common.Bytes2Hex(mem.Get(0, 32)) != "0000000000000000000000000000000000000000000000000000000000000001" { t.Fatalf("Mstore failed to overwrite previous value") } poolOfIntPools.put(evmInterpreter.intPool) } func BenchmarkOpMstore(bench *testing.B) { var ( env = NewEVM(Context{}, nil, params.TestChainConfig, Config{}) stack = newstack() mem = NewMemory() evmInterpreter = NewEVMInterpreter(env, env.vmConfig) ) env.interpreter = evmInterpreter evmInterpreter.intPool = poolOfIntPools.get() mem.Resize(64) pc := uint64(0) memStart := big.NewInt(0) value := big.NewInt(0x1337) bench.ResetTimer() for i := 0; i < bench.N; i++ { stack.pushN(value, memStart) opMstore(&pc, evmInterpreter, nil, mem, stack) } poolOfIntPools.put(evmInterpreter.intPool) } ================================================ FILE: core/vm/int_pool_verifier.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // +build VERIFY_EVM_INTEGER_POOL package vm import "fmt" const verifyPool = true func verifyIntegerPool(ip *intPool) { for i, item := range ip.pool.data { if item.Cmp(checkVal) != 0 { panic(fmt.Sprintf("%d'th item failed aggressive pool check. Value was modified", i)) } } } ================================================ FILE: core/vm/int_pool_verifier_empty.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // +build !VERIFY_EVM_INTEGER_POOL package vm const verifyPool = false func verifyIntegerPool(ip *intPool) {} ================================================ FILE: core/vm/interface.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package vm import ( "math/big" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/zero/txs/zstate" ) // StateDB is an EVM database for full state querying. type StateDB interface { CreateAccount(common.Address) CurrentZState() *zstate.ZState NextZState() *zstate.ZState SubBalance(common.Address, string, *big.Int) AddBalance(common.Address, string, *big.Int) GetBalance(common.Address, string) *big.Int Balances(addr common.Address) map[string]*big.Int RegisterTicket(common.Address, string) bool GetContrctAddressByTicket(key string) common.Address SetTokenRate(common.Address, string, *big.Int, *big.Int) bool GetTokenRate(common.Address, string) (*big.Int, *big.Int) RegisterToken(common.Address, string) bool GetContrctAddressByToken(key string) common.Address SetTicketNonce(common.Address, uint64) GetTicketNonce(common.Address) uint64 RemoveTicket(common.Address, string, common.Hash) bool AddTicket(common.Address, string, common.Hash) OwnTicket(common.Address, string, common.Hash) bool AddNonceAddress([]byte, common.Address) GetNonceAddress([]byte) common.Address // GetCodeHash(common.Address) common.Hash GetCode(common.Address) []byte SetCode(common.Address, []byte) GetCodeSize(common.Address) int IsContract(common.Address) bool AddRefund(uint64) GetRefund() uint64 GetState(common.Address, common.Hash) common.Hash SetState(common.Address, common.Hash, common.Hash) Suicide(common.Address, common.Address) bool HasSuicided(common.Address) bool // // Exist reports whether the given account exists in state. // Notably this should also return true for suicided accounts. Exist(common.Address) bool // Empty returns whether the given account is empty. Empty // is defined according to EIP161 (balance = nonce = code = 0). Empty(common.Address) bool RevertToSnapshot(int) Snapshot() int AddLog(*types.Log) AddPreimage(common.Hash, []byte) ForEachStorage(common.Address, func(common.Hash, common.Hash) bool) GetContrctNonce() uint64 IncAndGetContrctNonce() uint64 } // CallContext provides a basic interface for the EVM calling conventions. The EVM EVM // depends on this context being implemented for doing subcalls and initialising new EVM contracts. type CallContext interface { // Call another contract Call(env *EVM, me ContractRef, addr common.Address, data []byte, gas, value *big.Int) ([]byte, error) // Take another's contract code and execute within our own context CallCode(env *EVM, me ContractRef, addr common.Address, data []byte, gas, value *big.Int) ([]byte, error) // Same as CallCode except sender and value is propagated from parent to child scope DelegateCall(env *EVM, me ContractRef, addr common.Address, data []byte, gas *big.Int) ([]byte, error) // Create a new contract Create(env *EVM, me ContractRef, data []byte, gas, value *big.Int) ([]byte, common.Address, error) } ================================================ FILE: core/vm/interpreter.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package vm import ( "fmt" "sync/atomic" "github.com/sero-cash/go-sero/common/math" "github.com/sero-cash/go-sero/params" ) // Config are the configuration options for the Interpreter type Config struct { // Debug enabled debugging Interpreter options Debug bool // Tracer is the op code logger Tracer Tracer // NoRecursion disabled Interpreter call, callcode, // delegate call and create. NoRecursion bool // Enable recording of SHA3/keccak preimages EnablePreimageRecording bool // JumpTable contains the EVM instruction table. This // may be left uninitialised and will be set to the default // table. JumpTable [256]operation } // Interpreter is used to run Ethereum based contracts and will utilise the // passed environment to query external sources for state information. // The Interpreter will run the byte code VM based on the passed // configuration. type Interpreter interface { // Run loops and evaluates the contract's code with the given input data and returns // the return byte-slice and an error if one occurred. Run(contract *Contract, input []byte) ([]byte, error) // CanRun tells if the contract, passed as an argument, can be // run by the current interpreter. This is meant so that the // caller can do something like: // // ```golang // for _, interpreter := range interpreters { // if interpreter.CanRun(contract.code) { // interpreter.Run(contract.code, input) // } // } // ``` CanRun([]byte) bool // IsReadOnly reports if the interpreter is in read only mode. IsReadOnly() bool // SetReadOnly sets (or unsets) read only mode in the interpreter. SetReadOnly(bool) } // EVMInterpreter represents an EVM interpreter type EVMInterpreter struct { evm *EVM cfg Config gasTable params.GasTable intPool *intPool readOnly bool // Whether to throw on stateful modifications returnData []byte // Last CALL's return data for subsequent reuse } // NewEVMInterpreter returns a new instance of the Interpreter. func NewEVMInterpreter(evm *EVM, cfg Config) *EVMInterpreter { // We use the STOP instruction whether to see // the jump table was initialised. If it was not // we'll set the default jump table. if !cfg.JumpTable[STOP].valid { cfg.JumpTable = constantinopleInstructionSet } return &EVMInterpreter{ evm: evm, cfg: cfg, gasTable: evm.ChainConfig().GasTable(evm.BlockNumber), } } func (in *EVMInterpreter) enforceRestrictions(op OpCode, operation operation, stack *Stack) error { if in.evm.chainRules.IsAutumnTwilight { if in.readOnly { // If the interpreter is operating in readonly mode, make sure no // state-modifying operation is performed. The 3rd stack item // for a call operation is the value. Transferring value from one // account to the others means the state is modified and should also // return with an error. if operation.writes || (op == CALL && stack.Back(2).BitLen() > 0) { return errWriteProtection } } } return nil } // Run loops and evaluates the contract's code with the given input data and returns // the return byte-slice and an error if one occurred. // // It's important to note that any errors returned by the interpreter should be // considered a revert-and-consume-all-gas operation except for // errExecutionReverted which means revert-and-keep-gas-left. func (in *EVMInterpreter) Run(contract *Contract, input []byte) (ret []byte, err error) { if in.intPool == nil { in.intPool = poolOfIntPools.get() defer func() { poolOfIntPools.put(in.intPool) in.intPool = nil }() } // Increment the call depth which is restricted to 1024 in.evm.depth++ defer func() { in.evm.depth-- }() // Reset the previous call's return data. It's unimportant to preserve the old buffer // as every returning call will return new data anyway. in.returnData = nil // Don't bother with the execution if there's no code. if len(contract.Code) == 0 { return nil, nil } var ( op OpCode // current opcode mem = NewMemory() // bound memory stack = newstack() // local stack // For optimisation reason we're using uint64 as the program counter. // It's theoretically possible to go above 2^64. The YP defines the PC // to be uint256. Practically much less so feasible. pc = uint64(0) // program counter cost uint64 // copies used by tracer pcCopy uint64 // needed for the deferred Tracer gasCopy uint64 // for Tracer to log gas remaining before execution logged bool // deferred Tracer should ignore already logged steps ) contract.Input = input // Reclaim the stack as an int pool when the execution stops defer func() { in.intPool.put(stack.data...) }() if in.cfg.Debug { defer func() { if err != nil { if !logged { in.cfg.Tracer.CaptureState(in.evm, pcCopy, op, gasCopy, cost, mem, stack, contract, in.evm.depth, err) } else { in.cfg.Tracer.CaptureFault(in.evm, pcCopy, op, gasCopy, cost, mem, stack, contract, in.evm.depth, err) } } }() } // The Interpreter main run loop (contextual). This loop runs until either an // explicit STOP, RETURN or SELFDESTRUCT is executed, an error occurred during // the execution of one of the operations or until the done flag is set by the // parent context. for atomic.LoadInt32(&in.evm.abort) == 0 { if in.cfg.Debug { // Capture pre-execution values for tracing. logged, pcCopy, gasCopy = false, pc, contract.Gas } // Get the operation from the jump table and validate the stack to ensure there are // enough stack items available to perform the operation. op = contract.GetOp(pc) operation := in.cfg.JumpTable[op] if !operation.valid { return nil, fmt.Errorf("invalid opcode 0x%x", int(op)) } if err := operation.validateStack(stack); err != nil { return nil, err } // If the operation is valid, enforce and write restrictions if err := in.enforceRestrictions(op, operation, stack); err != nil { return nil, err } var memorySize uint64 // calculate the new memory size and expand the memory to fit // the operation if operation.memorySize != nil { memSize, overflow := bigUint64(operation.memorySize(stack)) if overflow { return nil, errGasUintOverflow } // memory is expanded in words of 32 bytes. Gas // is also calculated in words. if memorySize, overflow = math.SafeMul(toWordSize(memSize), 32); overflow { return nil, errGasUintOverflow } } // consume the gas and return an error if not enough gas is available. // cost is explicitly set so that the capture state defer method can get the proper cost cost, err = operation.gasCost(in.gasTable, in.evm, contract, stack, mem, memorySize) if err != nil || !contract.UseGas(cost) { return nil, ErrOutOfGas } if memorySize > 0 { mem.Resize(memorySize) } if in.cfg.Debug { in.cfg.Tracer.CaptureState(in.evm, pc, op, gasCopy, cost, mem, stack, contract, in.evm.depth, err) logged = true } // execute the operation res, err := operation.execute(&pc, in, contract, mem, stack) // verifyPool is a build flag. Pool verification makes sure the integrity // of the integer pool by comparing values to a default value. if verifyPool { verifyIntegerPool(in.intPool) } // if the operation clears the return data (e.g. it has returning data) // set the last return to the result of the operation. if operation.returns { in.returnData = res } switch { case err != nil: return nil, err case operation.reverts: return res, errExecutionReverted case operation.halts: return res, nil case !operation.jumps: pc++ } } return nil, nil } // CanRun tells if the contract, passed as an argument, can be // run by the current interpreter. func (in *EVMInterpreter) CanRun(code []byte) bool { return true } // IsReadOnly reports if the interpreter is in read only mode. func (in *EVMInterpreter) IsReadOnly() bool { return in.readOnly } // SetReadOnly sets (or unsets) read only mode in the interpreter. func (in *EVMInterpreter) SetReadOnly(ro bool) { in.readOnly = ro } ================================================ FILE: core/vm/intpool.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package vm import ( "math/big" "sync" ) var checkVal = big.NewInt(-42) const poolLimit = 256 // intPool is a pool of big integers that // can be reused for all big.Int operations. type intPool struct { pool *Stack } func newIntPool() *intPool { return &intPool{pool: newstack()} } // get retrieves a big int from the pool, allocating one if the pool is empty. // Note, the returned int's value is arbitrary and will not be zeroed! func (p *intPool) get() *big.Int { if p.pool.len() > 0 { return p.pool.pop() } return new(big.Int) } // getZero retrieves a big int from the pool, setting it to zero or allocating // a new one if the pool is empty. func (p *intPool) getZero() *big.Int { if p.pool.len() > 0 { return p.pool.pop().SetUint64(0) } return new(big.Int) } // put returns an allocated big int to the pool to be later reused by get calls. // Note, the values as saved as is; neither put nor get zeroes the ints out! func (p *intPool) put(is ...*big.Int) { if len(p.pool.data) > poolLimit { return } for _, i := range is { // verifyPool is a build flag. Pool verification makes sure the integrity // of the integer pool by comparing values to a default value. if verifyPool { i.Set(checkVal) } p.pool.push(i) } } // The intPool pool's default capacity const poolDefaultCap = 25 // intPoolPool manages a pool of intPools. type intPoolPool struct { pools []*intPool lock sync.Mutex } var poolOfIntPools = &intPoolPool{ pools: make([]*intPool, 0, poolDefaultCap), } // get is looking for an available pool to return. func (ipp *intPoolPool) get() *intPool { ipp.lock.Lock() defer ipp.lock.Unlock() if len(poolOfIntPools.pools) > 0 { ip := ipp.pools[len(ipp.pools)-1] ipp.pools = ipp.pools[:len(ipp.pools)-1] return ip } return newIntPool() } // put a pool that has been allocated with get. func (ipp *intPoolPool) put(ip *intPool) { ipp.lock.Lock() defer ipp.lock.Unlock() if len(ipp.pools) < cap(ipp.pools) { ipp.pools = append(ipp.pools, ip) } } ================================================ FILE: core/vm/intpool_test.go ================================================ // Copyright 2018 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package vm import ( "testing" ) func TestIntPoolPoolGet(t *testing.T) { poolOfIntPools.pools = make([]*intPool, 0, poolDefaultCap) nip := poolOfIntPools.get() if nip == nil { t.Fatalf("Invalid pool allocation") } } func TestIntPoolPoolPut(t *testing.T) { poolOfIntPools.pools = make([]*intPool, 0, poolDefaultCap) nip := poolOfIntPools.get() if len(poolOfIntPools.pools) != 0 { t.Fatalf("Pool got added to list when none should have been") } poolOfIntPools.put(nip) if len(poolOfIntPools.pools) == 0 { t.Fatalf("Pool did not get added to list when one should have been") } } func TestIntPoolPoolReUse(t *testing.T) { poolOfIntPools.pools = make([]*intPool, 0, poolDefaultCap) nip := poolOfIntPools.get() poolOfIntPools.put(nip) poolOfIntPools.get() if len(poolOfIntPools.pools) != 0 { t.Fatalf("Invalid number of pools. Got %d, expected %d", len(poolOfIntPools.pools), 0) } } ================================================ FILE: core/vm/jump_table.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package vm import ( "errors" "math/big" "github.com/sero-cash/go-sero/params" ) type ( executionFunc func(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) gasFunc func(params.GasTable, *EVM, *Contract, *Stack, *Memory, uint64) (uint64, error) // last parameter is the requested memory size as a uint64 stackValidationFunc func(*Stack) error memorySizeFunc func(*Stack) *big.Int ) var errGasUintOverflow = errors.New("gas uint64 overflow") type operation struct { // execute is the operation function execute executionFunc // gasCost is the gas function and returns the gas required for execution gasCost gasFunc // validateStack validates the stack (size) for the operation validateStack stackValidationFunc // memorySize returns the memory size required for the operation memorySize memorySizeFunc halts bool // indicates whether the operation should halt further execution jumps bool // indicates whether the program counter should not increment writes bool // determines whether this a state modifying operation valid bool // indication whether the retrieved operation is valid and known reverts bool // determines whether the operation reverts state (implicitly halts) returns bool // determines whether the operations sets the return data content } var ( constantinopleInstructionSet = newAutumnTwilightInstructionSet() ) func newAutumnTwilightInstructionSet() [256]operation { return [256]operation{ EXTCODEHASH: { execute: opExtCodeHash, gasCost: gasExtCodeHash, validateStack: makeStackFunc(1, 1), valid: true, }, SAR: { execute: opSAR, gasCost: constGasFunc(GasFastestStep), validateStack: makeStackFunc(2, 1), valid: true, }, SHR: { execute: opSHR, gasCost: constGasFunc(GasFastestStep), validateStack: makeStackFunc(2, 1), valid: true, }, SHL: { execute: opSHL, gasCost: constGasFunc(GasFastestStep), validateStack: makeStackFunc(2, 1), valid: true, }, REVERT: { execute: opRevert, gasCost: gasRevert, validateStack: makeStackFunc(2, 0), memorySize: memoryRevert, valid: true, reverts: true, returns: true, }, RETURNDATACOPY: { execute: opReturnDataCopy, gasCost: gasReturnDataCopy, validateStack: makeStackFunc(3, 0), memorySize: memoryReturnDataCopy, valid: true, }, RETURNDATASIZE: { execute: opReturnDataSize, gasCost: constGasFunc(GasQuickStep), validateStack: makeStackFunc(0, 1), valid: true, }, STATICCALL: { execute: opStaticCall, gasCost: gasStaticCall, validateStack: makeStackFunc(6, 1), memorySize: memoryStaticCall, valid: true, returns: true, }, DELEGATECALL: { execute: opDelegateCall, gasCost: gasDelegateCall, validateStack: makeStackFunc(6, 1), memorySize: memoryDelegateCall, valid: true, returns: true, }, STOP: { execute: opStop, gasCost: constGasFunc(0), validateStack: makeStackFunc(0, 0), halts: true, valid: true, }, ADD: { execute: opAdd, gasCost: constGasFunc(GasFastestStep), validateStack: makeStackFunc(2, 1), valid: true, }, MUL: { execute: opMul, gasCost: constGasFunc(GasFastStep), validateStack: makeStackFunc(2, 1), valid: true, }, SUB: { execute: opSub, gasCost: constGasFunc(GasFastestStep), validateStack: makeStackFunc(2, 1), valid: true, }, DIV: { execute: opDiv, gasCost: constGasFunc(GasFastStep), validateStack: makeStackFunc(2, 1), valid: true, }, SDIV: { execute: opSdiv, gasCost: constGasFunc(GasFastStep), validateStack: makeStackFunc(2, 1), valid: true, }, MOD: { execute: opMod, gasCost: constGasFunc(GasFastStep), validateStack: makeStackFunc(2, 1), valid: true, }, SMOD: { execute: opSmod, gasCost: constGasFunc(GasFastStep), validateStack: makeStackFunc(2, 1), valid: true, }, ADDMOD: { execute: opAddmod, gasCost: constGasFunc(GasMidStep), validateStack: makeStackFunc(3, 1), valid: true, }, MULMOD: { execute: opMulmod, gasCost: constGasFunc(GasMidStep), validateStack: makeStackFunc(3, 1), valid: true, }, EXP: { execute: opExp, gasCost: gasExp, validateStack: makeStackFunc(2, 1), valid: true, }, SIGNEXTEND: { execute: opSignExtend, gasCost: constGasFunc(GasFastStep), validateStack: makeStackFunc(2, 1), valid: true, }, LT: { execute: opLt, gasCost: constGasFunc(GasFastestStep), validateStack: makeStackFunc(2, 1), valid: true, }, GT: { execute: opGt, gasCost: constGasFunc(GasFastestStep), validateStack: makeStackFunc(2, 1), valid: true, }, SLT: { execute: opSlt, gasCost: constGasFunc(GasFastestStep), validateStack: makeStackFunc(2, 1), valid: true, }, SGT: { execute: opSgt, gasCost: constGasFunc(GasFastestStep), validateStack: makeStackFunc(2, 1), valid: true, }, EQ: { execute: opEq, gasCost: constGasFunc(GasFastestStep), validateStack: makeStackFunc(2, 1), valid: true, }, ISZERO: { execute: opIszero, gasCost: constGasFunc(GasFastestStep), validateStack: makeStackFunc(1, 1), valid: true, }, AND: { execute: opAnd, gasCost: constGasFunc(GasFastestStep), validateStack: makeStackFunc(2, 1), valid: true, }, XOR: { execute: opXor, gasCost: constGasFunc(GasFastestStep), validateStack: makeStackFunc(2, 1), valid: true, }, OR: { execute: opOr, gasCost: constGasFunc(GasFastestStep), validateStack: makeStackFunc(2, 1), valid: true, }, NOT: { execute: opNot, gasCost: constGasFunc(GasFastestStep), validateStack: makeStackFunc(1, 1), valid: true, }, BYTE: { execute: opByte, gasCost: constGasFunc(GasFastestStep), validateStack: makeStackFunc(2, 1), valid: true, }, SHA3: { execute: opSha3, gasCost: gasSha3, validateStack: makeStackFunc(2, 1), memorySize: memorySha3, valid: true, }, ADDRESS: { execute: opAddress, gasCost: constGasFunc(GasQuickStep), validateStack: makeStackFunc(0, 1), valid: true, }, BALANCE: { execute: opBalance, gasCost: gasBalance, validateStack: makeStackFunc(1, 1), valid: true, }, ORIGIN: { execute: opOrigin, gasCost: constGasFunc(GasQuickStep), validateStack: makeStackFunc(0, 1), valid: true, }, CALLER: { execute: opCaller, gasCost: constGasFunc(GasQuickStep), validateStack: makeStackFunc(0, 1), valid: true, }, CALLVALUE: { execute: opCallValue, gasCost: constGasFunc(GasQuickStep), validateStack: makeStackFunc(0, 1), valid: true, }, CALLDATALOAD: { execute: opCallDataLoad, gasCost: constGasFunc(GasFastestStep), validateStack: makeStackFunc(1, 1), valid: true, }, CALLDATASIZE: { execute: opCallDataSize, gasCost: constGasFunc(GasQuickStep), validateStack: makeStackFunc(0, 1), valid: true, }, CALLDATACOPY: { execute: opCallDataCopy, gasCost: gasCallDataCopy, validateStack: makeStackFunc(3, 0), memorySize: memoryCallDataCopy, valid: true, }, CODESIZE: { execute: opCodeSize, gasCost: constGasFunc(GasQuickStep), validateStack: makeStackFunc(0, 1), valid: true, }, CODECOPY: { execute: opCodeCopy, gasCost: gasCodeCopy, validateStack: makeStackFunc(3, 0), memorySize: memoryCodeCopy, valid: true, }, GASPRICE: { execute: opGasprice, gasCost: constGasFunc(GasQuickStep), validateStack: makeStackFunc(0, 1), valid: true, }, EXTCODESIZE: { execute: opExtCodeSize, gasCost: gasExtCodeSize, validateStack: makeStackFunc(1, 1), valid: true, }, EXTCODECOPY: { execute: opExtCodeCopy, gasCost: gasExtCodeCopy, validateStack: makeStackFunc(4, 0), memorySize: memoryExtCodeCopy, valid: true, }, BLOCKHASH: { execute: opBlockhash, gasCost: constGasFunc(GasExtStep), validateStack: makeStackFunc(1, 1), valid: true, }, COINBASE: { execute: opCoinbase, gasCost: constGasFunc(GasQuickStep), validateStack: makeStackFunc(0, 1), valid: true, }, TIMESTAMP: { execute: opTimestamp, gasCost: constGasFunc(GasQuickStep), validateStack: makeStackFunc(0, 1), valid: true, }, NUMBER: { execute: opNumber, gasCost: constGasFunc(GasQuickStep), validateStack: makeStackFunc(0, 1), valid: true, }, DIFFICULTY: { execute: opDifficulty, gasCost: constGasFunc(GasQuickStep), validateStack: makeStackFunc(0, 1), valid: true, }, GASLIMIT: { execute: opGasLimit, gasCost: constGasFunc(GasQuickStep), validateStack: makeStackFunc(0, 1), valid: true, }, POP: { execute: opPop, gasCost: constGasFunc(GasQuickStep), validateStack: makeStackFunc(1, 0), valid: true, }, MLOAD: { execute: opMload, gasCost: gasMLoad, validateStack: makeStackFunc(1, 1), memorySize: memoryMLoad, valid: true, }, MSTORE: { execute: opMstore, gasCost: gasMStore, validateStack: makeStackFunc(2, 0), memorySize: memoryMStore, valid: true, }, MSTORE8: { execute: opMstore8, gasCost: gasMStore8, memorySize: memoryMStore8, validateStack: makeStackFunc(2, 0), valid: true, }, SLOAD: { execute: opSload, gasCost: gasSLoad, validateStack: makeStackFunc(1, 1), valid: true, }, SSTORE: { execute: opSstore, gasCost: gasSStore, validateStack: makeStackFunc(2, 0), valid: true, writes: true, }, JUMP: { execute: opJump, gasCost: constGasFunc(GasMidStep), validateStack: makeStackFunc(1, 0), jumps: true, valid: true, }, JUMPI: { execute: opJumpi, gasCost: constGasFunc(GasSlowStep), validateStack: makeStackFunc(2, 0), jumps: true, valid: true, }, PC: { execute: opPc, gasCost: constGasFunc(GasQuickStep), validateStack: makeStackFunc(0, 1), valid: true, }, MSIZE: { execute: opMsize, gasCost: constGasFunc(GasQuickStep), validateStack: makeStackFunc(0, 1), valid: true, }, GAS: { execute: opGas, gasCost: constGasFunc(GasQuickStep), validateStack: makeStackFunc(0, 1), valid: true, }, JUMPDEST: { execute: opJumpdest, gasCost: constGasFunc(params.JumpdestGas), validateStack: makeStackFunc(0, 0), valid: true, }, PUSH1: { execute: makePush(1, 1), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH2: { execute: makePush(2, 2), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH3: { execute: makePush(3, 3), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH4: { execute: makePush(4, 4), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH5: { execute: makePush(5, 5), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH6: { execute: makePush(6, 6), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH7: { execute: makePush(7, 7), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH8: { execute: makePush(8, 8), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH9: { execute: makePush(9, 9), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH10: { execute: makePush(10, 10), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH11: { execute: makePush(11, 11), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH12: { execute: makePush(12, 12), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH13: { execute: makePush(13, 13), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH14: { execute: makePush(14, 14), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH15: { execute: makePush(15, 15), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH16: { execute: makePush(16, 16), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH17: { execute: makePush(17, 17), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH18: { execute: makePush(18, 18), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH19: { execute: makePush(19, 19), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH20: { execute: makePush(20, 20), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH21: { execute: makePush(21, 21), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH22: { execute: makePush(22, 22), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH23: { execute: makePush(23, 23), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH24: { execute: makePush(24, 24), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH25: { execute: makePush(25, 25), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH26: { execute: makePush(26, 26), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH27: { execute: makePush(27, 27), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH28: { execute: makePush(28, 28), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH29: { execute: makePush(29, 29), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH30: { execute: makePush(30, 30), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH31: { execute: makePush(31, 31), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, PUSH32: { execute: makePush(32, 32), gasCost: gasPush, validateStack: makeStackFunc(0, 1), valid: true, }, DUP1: { execute: makeDup(1), gasCost: gasDup, validateStack: makeDupStackFunc(1), valid: true, }, DUP2: { execute: makeDup(2), gasCost: gasDup, validateStack: makeDupStackFunc(2), valid: true, }, DUP3: { execute: makeDup(3), gasCost: gasDup, validateStack: makeDupStackFunc(3), valid: true, }, DUP4: { execute: makeDup(4), gasCost: gasDup, validateStack: makeDupStackFunc(4), valid: true, }, DUP5: { execute: makeDup(5), gasCost: gasDup, validateStack: makeDupStackFunc(5), valid: true, }, DUP6: { execute: makeDup(6), gasCost: gasDup, validateStack: makeDupStackFunc(6), valid: true, }, DUP7: { execute: makeDup(7), gasCost: gasDup, validateStack: makeDupStackFunc(7), valid: true, }, DUP8: { execute: makeDup(8), gasCost: gasDup, validateStack: makeDupStackFunc(8), valid: true, }, DUP9: { execute: makeDup(9), gasCost: gasDup, validateStack: makeDupStackFunc(9), valid: true, }, DUP10: { execute: makeDup(10), gasCost: gasDup, validateStack: makeDupStackFunc(10), valid: true, }, DUP11: { execute: makeDup(11), gasCost: gasDup, validateStack: makeDupStackFunc(11), valid: true, }, DUP12: { execute: makeDup(12), gasCost: gasDup, validateStack: makeDupStackFunc(12), valid: true, }, DUP13: { execute: makeDup(13), gasCost: gasDup, validateStack: makeDupStackFunc(13), valid: true, }, DUP14: { execute: makeDup(14), gasCost: gasDup, validateStack: makeDupStackFunc(14), valid: true, }, DUP15: { execute: makeDup(15), gasCost: gasDup, validateStack: makeDupStackFunc(15), valid: true, }, DUP16: { execute: makeDup(16), gasCost: gasDup, validateStack: makeDupStackFunc(16), valid: true, }, SWAP1: { execute: makeSwap(1), gasCost: gasSwap, validateStack: makeSwapStackFunc(2), valid: true, }, SWAP2: { execute: makeSwap(2), gasCost: gasSwap, validateStack: makeSwapStackFunc(3), valid: true, }, SWAP3: { execute: makeSwap(3), gasCost: gasSwap, validateStack: makeSwapStackFunc(4), valid: true, }, SWAP4: { execute: makeSwap(4), gasCost: gasSwap, validateStack: makeSwapStackFunc(5), valid: true, }, SWAP5: { execute: makeSwap(5), gasCost: gasSwap, validateStack: makeSwapStackFunc(6), valid: true, }, SWAP6: { execute: makeSwap(6), gasCost: gasSwap, validateStack: makeSwapStackFunc(7), valid: true, }, SWAP7: { execute: makeSwap(7), gasCost: gasSwap, validateStack: makeSwapStackFunc(8), valid: true, }, SWAP8: { execute: makeSwap(8), gasCost: gasSwap, validateStack: makeSwapStackFunc(9), valid: true, }, SWAP9: { execute: makeSwap(9), gasCost: gasSwap, validateStack: makeSwapStackFunc(10), valid: true, }, SWAP10: { execute: makeSwap(10), gasCost: gasSwap, validateStack: makeSwapStackFunc(11), valid: true, }, SWAP11: { execute: makeSwap(11), gasCost: gasSwap, validateStack: makeSwapStackFunc(12), valid: true, }, SWAP12: { execute: makeSwap(12), gasCost: gasSwap, validateStack: makeSwapStackFunc(13), valid: true, }, SWAP13: { execute: makeSwap(13), gasCost: gasSwap, validateStack: makeSwapStackFunc(14), valid: true, }, SWAP14: { execute: makeSwap(14), gasCost: gasSwap, validateStack: makeSwapStackFunc(15), valid: true, }, SWAP15: { execute: makeSwap(15), gasCost: gasSwap, validateStack: makeSwapStackFunc(16), valid: true, }, SWAP16: { execute: makeSwap(16), gasCost: gasSwap, validateStack: makeSwapStackFunc(17), valid: true, }, LOG0: { execute: makeLog(0), gasCost: makeGasLog(0), validateStack: makeStackFunc(2, 0), memorySize: memoryLog, valid: true, writes: true, }, LOG1: { execute: makeLog(1), gasCost: makeGasLog(1), validateStack: makeStackFunc(3, 0), memorySize: memoryLog, valid: true, writes: true, }, LOG2: { execute: makeLog(2), gasCost: makeGasLog(2), validateStack: makeStackFunc(4, 0), memorySize: memoryLog, valid: true, writes: true, }, LOG3: { execute: makeLog(3), gasCost: makeGasLog(3), validateStack: makeStackFunc(5, 0), memorySize: memoryLog, valid: true, writes: true, }, LOG4: { execute: makeLog(4), gasCost: makeGasLog(4), validateStack: makeStackFunc(6, 0), memorySize: memoryLog, valid: true, writes: true, }, CALL: { execute: opCall, gasCost: gasCall, validateStack: makeStackFunc(7, 1), memorySize: memoryCall, valid: true, returns: true, }, CALLCODE: { execute: opCallCode, gasCost: gasCallCode, validateStack: makeStackFunc(7, 1), memorySize: memoryCall, valid: true, returns: true, }, RETURN: { execute: opReturn, gasCost: gasReturn, validateStack: makeStackFunc(2, 0), memorySize: memoryReturn, halts: true, valid: true, }, //SELFDESTRUCT: { // execute: opSuicide, // gasCost: gasSuicide, // validateStack: makeStackFunc(1, 0), // halts: true, // valid: true, // writes: true, //}, } } ================================================ FILE: core/vm/logger.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package vm import ( "encoding/hex" "fmt" "io" "math/big" "time" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/common/hexutil" "github.com/sero-cash/go-sero/common/math" "github.com/sero-cash/go-sero/core/types" ) // Storage represents a contract's storage. type Storage map[common.Hash]common.Hash // Copy duplicates the current storage. func (s Storage) Copy() Storage { cpy := make(Storage) for key, value := range s { cpy[key] = value } return cpy } // LogConfig are the configuration options for structured logger the EVM type LogConfig struct { DisableMemory bool // disable memory capture DisableStack bool // disable stack capture DisableStorage bool // disable storage capture Debug bool // print output during capture end Limit int // maximum length of output, but zero means unlimited } //go:generate gencodec -type StructLog -field-override structLogMarshaling -out gen_structlog.go // StructLog is emitted to the EVM each cycle and lists information about the current internal state // prior to the execution of the statement. type StructLog struct { Pc uint64 `json:"pc"` Op OpCode `json:"op"` Gas uint64 `json:"gas"` GasCost uint64 `json:"gasCost"` Memory []byte `json:"memory"` MemorySize int `json:"memSize"` Stack []*big.Int `json:"stack"` Storage map[common.Hash]common.Hash `json:"-"` Depth int `json:"depth"` Err error `json:"-"` } // overrides for gencodec type structLogMarshaling struct { Stack []*math.HexOrDecimal256 Gas math.HexOrDecimal64 GasCost math.HexOrDecimal64 Memory hexutil.Bytes OpName string `json:"opName"` // adds call to OpName() in MarshalJSON ErrorString string `json:"error"` // adds call to ErrorString() in MarshalJSON } // OpName formats the operand name in a human-readable format. func (s *StructLog) OpName() string { return s.Op.String() } // ErrorString formats the log's error as a string. func (s *StructLog) ErrorString() string { if s.Err != nil { return s.Err.Error() } return "" } // Tracer is used to collect execution traces from an EVM transaction // execution. CaptureState is called for each step of the VM with the // current VM state. // Note that reference types are actual VM data structures; make copies // if you need to retain them beyond the current call. type Tracer interface { CaptureStart(from common.Address, to common.Address, call bool, input []byte, gas uint64, asset *assets.Asset) error CaptureState(env *EVM, pc uint64, op OpCode, gas, cost uint64, memory *Memory, stack *Stack, contract *Contract, depth int, err error) error CaptureFault(env *EVM, pc uint64, op OpCode, gas, cost uint64, memory *Memory, stack *Stack, contract *Contract, depth int, err error) error CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) error } // StructLogger is an EVM state logger and implements Tracer. // // StructLogger can capture state based on the given Log configuration and also keeps // a track record of modified storage which is used in reporting snapshots of the // contract their storage. type StructLogger struct { cfg LogConfig logs []StructLog changedValues map[common.Address]Storage output []byte err error } // NewStructLogger returns a new logger func NewStructLogger(cfg *LogConfig) *StructLogger { logger := &StructLogger{ changedValues: make(map[common.Address]Storage), } if cfg != nil { logger.cfg = *cfg } return logger } // CaptureStart implements the Tracer interface to initialize the tracing operation. func (l *StructLogger) CaptureStart(from common.Address, to common.Address, create bool, input []byte, gas uint64, asset *assets.Asset) error { return nil } // CaptureState logs a new structured log message and pushes it out to the environment // // CaptureState also tracks SSTORE ops to track dirty values. func (l *StructLogger) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost uint64, memory *Memory, stack *Stack, contract *Contract, depth int, err error) error { // check if already accumulated the specified number of logs if l.cfg.Limit != 0 && l.cfg.Limit <= len(l.logs) { return ErrTraceLimitReached } // initialise new changed values storage container for this contract // if not present. if l.changedValues[contract.Address()] == nil { l.changedValues[contract.Address()] = make(Storage) } // capture SSTORE opcodes and determine the changed value and store // it in the local storage container. if op == SSTORE && stack.len() >= 2 { var ( value = common.BigToHash(stack.data[stack.len()-2]) address = common.BigToHash(stack.data[stack.len()-1]) ) l.changedValues[contract.Address()][address] = value } // Copy a snapstot of the current memory state to a new buffer var mem []byte if !l.cfg.DisableMemory { mem = make([]byte, len(memory.Data())) copy(mem, memory.Data()) } // Copy a snapshot of the current stack state to a new buffer var stck []*big.Int if !l.cfg.DisableStack { stck = make([]*big.Int, len(stack.Data())) for i, item := range stack.Data() { stck[i] = new(big.Int).Set(item) } } // Copy a snapshot of the current storage to a new container var storage Storage if !l.cfg.DisableStorage { storage = l.changedValues[contract.Address()].Copy() } // create a new snaptshot of the EVM. log := StructLog{pc, op, gas, cost, mem, memory.Len(), stck, storage, depth, err} l.logs = append(l.logs, log) return nil } // CaptureFault implements the Tracer interface to trace an execution fault // while running an opcode. func (l *StructLogger) CaptureFault(env *EVM, pc uint64, op OpCode, gas, cost uint64, memory *Memory, stack *Stack, contract *Contract, depth int, err error) error { return nil } // CaptureEnd is called after the call finishes to finalize the tracing. func (l *StructLogger) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) error { l.output = output l.err = err if l.cfg.Debug { fmt.Printf("0x%x\n", output) if err != nil { fmt.Printf(" error: %v\n", err) } } return nil } // StructLogs returns the captured log entries. func (l *StructLogger) StructLogs() []StructLog { return l.logs } // Error returns the VM error captured by the trace. func (l *StructLogger) Error() error { return l.err } // Output returns the VM return value captured by the trace. func (l *StructLogger) Output() []byte { return l.output } // WriteTrace writes a formatted trace to the given writer func WriteTrace(writer io.Writer, logs []StructLog) { for _, log := range logs { fmt.Fprintf(writer, "%-16spc=%08d gas=%v cost=%v", log.Op, log.Pc, log.Gas, log.GasCost) if log.Err != nil { fmt.Fprintf(writer, " ERROR: %v", log.Err) } fmt.Fprintln(writer) if len(log.Stack) > 0 { fmt.Fprintln(writer, "Stack:") for i := len(log.Stack) - 1; i >= 0; i-- { fmt.Fprintf(writer, "%08d %x\n", len(log.Stack)-i-1, math.PaddedBigBytes(log.Stack[i], 32)) } } if len(log.Memory) > 0 { fmt.Fprintln(writer, "Memory:") fmt.Fprint(writer, hex.Dump(log.Memory)) } if len(log.Storage) > 0 { fmt.Fprintln(writer, "Storage:") for h, item := range log.Storage { fmt.Fprintf(writer, "%x: %x\n", h, item) } } fmt.Fprintln(writer) } } // WriteLogs writes vm logs in a readable format to the given writer func WriteLogs(writer io.Writer, logs []*types.Log) { for _, log := range logs { fmt.Fprintf(writer, "LOG%d: %x bn=%d txi=%x\n", len(log.Topics), log.Address, log.BlockNumber, log.TxIndex) for i, topic := range log.Topics { fmt.Fprintf(writer, "%08d %x\n", i, topic) } fmt.Fprint(writer, hex.Dump(log.Data)) fmt.Fprintln(writer) } } ================================================ FILE: core/vm/logger_test.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package vm import ( "math/big" "testing" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/params" ) type dummyContractRef struct { calledForEach bool } func (dummyContractRef) ReturnGas(*big.Int) {} func (dummyContractRef) Address() common.Address { return common.Address{} } func (dummyContractRef) Value() *big.Int { return new(big.Int) } func (dummyContractRef) SetCode(common.Hash, []byte) {} func (d *dummyContractRef) ForEachStorage(callback func(key, value common.Hash) bool) { d.calledForEach = true } func (d *dummyContractRef) SubBalance(amount *big.Int) {} func (d *dummyContractRef) AddBalance(amount *big.Int) {} func (d *dummyContractRef) SetBalance(*big.Int) {} func (d *dummyContractRef) SetNonce(uint64) {} func (d *dummyContractRef) Balance() *big.Int { return new(big.Int) } type dummyStateDB struct { NoopStateDB ref *dummyContractRef } func TestStoreCapture(t *testing.T) { var ( env = NewEVM(Context{}, nil, params.TestChainConfig, Config{}) logger = NewStructLogger(nil) mem = NewMemory() stack = newstack() contract = NewContract(&dummyContractRef{}, &dummyContractRef{}, nil, 0) ) stack.push(big.NewInt(1)) stack.push(big.NewInt(0)) var index common.Hash logger.CaptureState(env, 0, SSTORE, 0, 0, mem, stack, contract, 0, nil) if len(logger.changedValues[contract.Address()]) == 0 { t.Fatalf("expected exactly 1 changed value on address %x, got %d", contract.Address(), len(logger.changedValues[contract.Address()])) } exp := common.BigToHash(big.NewInt(1)) if logger.changedValues[contract.Address()][index] != exp { t.Errorf("expected %x, got %x", exp, logger.changedValues[contract.Address()][index]) } } ================================================ FILE: core/vm/memory.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package vm import ( "fmt" "math/big" "github.com/sero-cash/go-sero/common/math" ) // Memory implements a simple memory model for the ethereum virtual machine. type Memory struct { store []byte lastGasCost uint64 } // NewMemory returns a new memory memory model. func NewMemory() *Memory { return &Memory{} } // Set sets offset + size to value func (m *Memory) Set(offset, size uint64, value []byte) { // It's possible the offset is greater than 0 and size equals 0. This is because // the calcMemSize (common.go) could potentially return 0 when size is zero (NO-OP) if size > 0 { // length of store may never be less than offset + size. // The store should be resized PRIOR to setting the memory if offset+size > uint64(len(m.store)) { panic("invalid memory: store empty") } copy(m.store[offset:offset+size], value) } } // Set32 sets the 32 bytes starting at offset to the value of val, left-padded with zeroes to // 32 bytes. func (m *Memory) Set32(offset uint64, val *big.Int) { // length of store may never be less than offset + size. // The store should be resized PRIOR to setting the memory if offset+32 > uint64(len(m.store)) { panic("invalid memory: store empty") } // Zero the memory area copy(m.store[offset:offset+32], []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}) // Fill in relevant bits math.ReadBits(val, m.store[offset:offset+32]) } // Resize resizes the memory to size func (m *Memory) Resize(size uint64) { if uint64(m.Len()) < size { m.store = append(m.store, make([]byte, size-uint64(m.Len()))...) } } // Get returns offset + size as a new slice func (m *Memory) Get(offset, size int64) (cpy []byte) { if size == 0 { return nil } if len(m.store) > int(offset) { cpy = make([]byte, size) copy(cpy, m.store[offset:offset+size]) return } return } // GetPtr returns the offset + size func (m *Memory) GetPtr(offset, size int64) []byte { if size == 0 { return nil } if len(m.store) > int(offset) { return m.store[offset : offset+size] } return nil } // Len returns the length of the backing slice func (m *Memory) Len() int { return len(m.store) } // Data returns the backing slice func (m *Memory) Data() []byte { return m.store } // Print dumps the content of the memory. func (m *Memory) Print() { fmt.Printf("### mem %d bytes ###\n", len(m.store)) if len(m.store) > 0 { addr := 0 for i := 0; i+32 <= len(m.store); i += 32 { fmt.Printf("%03d: % x\n", addr, m.store[i:i+32]) addr++ } } else { fmt.Println("-- empty --") } fmt.Println("####################") } ================================================ FILE: core/vm/memory_table.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package vm import ( "math/big" "github.com/sero-cash/go-sero/common/math" ) func memorySha3(stack *Stack) *big.Int { return calcMemSize(stack.Back(0), stack.Back(1)) } func memoryCallDataCopy(stack *Stack) *big.Int { return calcMemSize(stack.Back(0), stack.Back(2)) } func memoryReturnDataCopy(stack *Stack) *big.Int { return calcMemSize(stack.Back(0), stack.Back(2)) } func memoryCodeCopy(stack *Stack) *big.Int { return calcMemSize(stack.Back(0), stack.Back(2)) } func memoryExtCodeCopy(stack *Stack) *big.Int { return calcMemSize(stack.Back(1), stack.Back(3)) } func memoryMLoad(stack *Stack) *big.Int { return calcMemSize(stack.Back(0), big.NewInt(32)) } func memoryMStore8(stack *Stack) *big.Int { return calcMemSize(stack.Back(0), big.NewInt(1)) } func memoryMStore(stack *Stack) *big.Int { return calcMemSize(stack.Back(0), big.NewInt(32)) } func memoryCreate(stack *Stack) *big.Int { return calcMemSize(stack.Back(1), stack.Back(2)) } func memoryCreate2(stack *Stack) *big.Int { return calcMemSize(stack.Back(1), stack.Back(2)) } func memoryCall(stack *Stack) *big.Int { x := calcMemSize(stack.Back(5), stack.Back(6)) y := calcMemSize(stack.Back(3), stack.Back(4)) return math.BigMax(x, y) } func memoryDelegateCall(stack *Stack) *big.Int { x := calcMemSize(stack.Back(4), stack.Back(5)) y := calcMemSize(stack.Back(2), stack.Back(3)) return math.BigMax(x, y) } func memoryStaticCall(stack *Stack) *big.Int { x := calcMemSize(stack.Back(4), stack.Back(5)) y := calcMemSize(stack.Back(2), stack.Back(3)) return math.BigMax(x, y) } func memoryReturn(stack *Stack) *big.Int { return calcMemSize(stack.Back(0), stack.Back(1)) } func memoryRevert(stack *Stack) *big.Int { return calcMemSize(stack.Back(0), stack.Back(1)) } func memoryLog(stack *Stack) *big.Int { mSize, mStart := stack.Back(1), stack.Back(0) return calcMemSize(mStart, mSize) } ================================================ FILE: core/vm/noop.go ================================================ // Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package vm import ( "math/big" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/zero/txs/zstate" ) func NoopCanTransfer(db StateDB, from common.Address, balance *big.Int) bool { return true } func NoopTransfer(db StateDB, from, to common.Address, amount *big.Int) {} type NoopEVMCallContext struct{} func (NoopEVMCallContext) Call(caller ContractRef, addr common.Address, data []byte, gas, value *big.Int) ([]byte, error) { return nil, nil } func (NoopEVMCallContext) CallCode(caller ContractRef, addr common.Address, data []byte, gas, value *big.Int) ([]byte, error) { return nil, nil } func (NoopEVMCallContext) Create(caller ContractRef, data []byte, gas, value *big.Int) ([]byte, common.Address, error) { return nil, common.Address{}, nil } func (NoopEVMCallContext) DelegateCall(me ContractRef, addr common.Address, data []byte, gas *big.Int) ([]byte, error) { return nil, nil } type NoopStateDB struct{} func (NoopStateDB) GetAndIndNonce() uint64 { return 0 } func (NoopStateDB) CreateAccount(common.Address) {} func (NoopStateDB) GetZState() *zstate.ZState { return nil } func (NoopStateDB) SubBalance(common.Address, common.Hash, *big.Int) {} func (NoopStateDB) AddBalance(common.Address, common.Hash, *big.Int) {} func (NoopStateDB) GetBalance(common.Address) *big.Int { return nil } func (NoopStateDB) GetNonce(common.Address) uint64 { return 0 } func (NoopStateDB) SetNonce(common.Address, uint64) {} func (NoopStateDB) GetCodeHash(common.Address) common.Hash { return common.Hash{} } func (NoopStateDB) GetCode(common.Address) []byte { return nil } func (NoopStateDB) SetCode(common.Address, []byte) {} func (NoopStateDB) GetCodeSize(common.Address) int { return 0 } func (NoopStateDB) AddRefund(uint64) {} func (NoopStateDB) GetRefund() uint64 { return 0 } func (NoopStateDB) GetState(common.Address, common.Hash) common.Hash { return common.Hash{} } func (NoopStateDB) SetState(common.Address, common.Hash, common.Hash) {} func (NoopStateDB) Suicide(common.Address, common.Hash) bool { return false } func (NoopStateDB) HasSuicided(common.Address) bool { return false } func (NoopStateDB) Exist(common.Address) bool { return false } func (NoopStateDB) Empty(common.Address) bool { return false } func (NoopStateDB) RevertToSnapshot(int) {} func (NoopStateDB) Snapshot() int { return 0 } func (NoopStateDB) AddLog(*types.Log) {} func (NoopStateDB) AddPreimage(common.Hash, []byte) {} func (NoopStateDB) ForEachStorage(common.Address, func(common.Hash, common.Hash) bool) {} func (NoopStateDB) IsContract(addr common.Address) bool { return false } func (NoopStateDB) SetNonceAddress(addr common.Address, nonceAddr common.Address) { } func (NoopStateDB) GetNonceAddress(addr common.Address, key []byte) common.Address { return common.Address{} } func (NoopStateDB) GetAllNonceAddress(addr common.Address) []common.Address { return []common.Address{} } ================================================ FILE: core/vm/opcodes.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package vm import ( "fmt" ) // OpCode is an EVM opcode type OpCode byte // IsPush specifies if an opcode is a PUSH opcode. func (op OpCode) IsPush() bool { switch op { case PUSH1, PUSH2, PUSH3, PUSH4, PUSH5, PUSH6, PUSH7, PUSH8, PUSH9, PUSH10, PUSH11, PUSH12, PUSH13, PUSH14, PUSH15, PUSH16, PUSH17, PUSH18, PUSH19, PUSH20, PUSH21, PUSH22, PUSH23, PUSH24, PUSH25, PUSH26, PUSH27, PUSH28, PUSH29, PUSH30, PUSH31, PUSH32: return true } return false } // IsStaticJump specifies if an opcode is JUMP. func (op OpCode) IsStaticJump() bool { return op == JUMP } // 0x0 range - arithmetic ops. const ( STOP OpCode = iota ADD MUL SUB DIV SDIV MOD SMOD ADDMOD MULMOD EXP SIGNEXTEND ) // 0x10 range - comparison ops. const ( LT OpCode = iota + 0x10 GT SLT SGT EQ ISZERO AND OR XOR NOT BYTE SHL SHR SAR SHA3 = 0x20 ) // 0x30 range - closure state. const ( ADDRESS OpCode = 0x30 + iota BALANCE ORIGIN CALLER CALLVALUE CALLDATALOAD CALLDATASIZE CALLDATACOPY CODESIZE CODECOPY GASPRICE EXTCODESIZE EXTCODECOPY RETURNDATASIZE RETURNDATACOPY EXTCODEHASH ) // 0x40 range - block operations. const ( BLOCKHASH OpCode = 0x40 + iota COINBASE TIMESTAMP NUMBER DIFFICULTY GASLIMIT ) // 0x50 range - 'storage' and execution. const ( POP OpCode = 0x50 + iota MLOAD MSTORE MSTORE8 SLOAD SSTORE JUMP JUMPI PC MSIZE GAS JUMPDEST ) // 0x60 range. const ( PUSH1 OpCode = 0x60 + iota PUSH2 PUSH3 PUSH4 PUSH5 PUSH6 PUSH7 PUSH8 PUSH9 PUSH10 PUSH11 PUSH12 PUSH13 PUSH14 PUSH15 PUSH16 PUSH17 PUSH18 PUSH19 PUSH20 PUSH21 PUSH22 PUSH23 PUSH24 PUSH25 PUSH26 PUSH27 PUSH28 PUSH29 PUSH30 PUSH31 PUSH32 DUP1 DUP2 DUP3 DUP4 DUP5 DUP6 DUP7 DUP8 DUP9 DUP10 DUP11 DUP12 DUP13 DUP14 DUP15 DUP16 SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 SWAP6 SWAP7 SWAP8 SWAP9 SWAP10 SWAP11 SWAP12 SWAP13 SWAP14 SWAP15 SWAP16 ) // 0xa0 range - logging ops. const ( LOG0 OpCode = 0xa0 + iota LOG1 LOG2 LOG3 LOG4 ) // unofficial opcodes used for parsing. const ( PUSH OpCode = 0xb0 + iota DUP SWAP ) // 0xf0 range - closures. const ( CREATE OpCode = 0xf0 + iota CALL CALLCODE RETURN DELEGATECALL CREATE2 STATICCALL = 0xfa REVERT = 0xfd //SELFDESTRUCT = 0xff ) // Since the opcodes aren't all in order we can't use a regular slice. var opCodeToString = map[OpCode]string{ // 0x0 range - arithmetic ops. STOP: "STOP", ADD: "ADD", MUL: "MUL", SUB: "SUB", DIV: "DIV", SDIV: "SDIV", MOD: "MOD", SMOD: "SMOD", EXP: "EXP", NOT: "NOT", LT: "LT", GT: "GT", SLT: "SLT", SGT: "SGT", EQ: "EQ", ISZERO: "ISZERO", SIGNEXTEND: "SIGNEXTEND", // 0x10 range - bit ops. AND: "AND", OR: "OR", XOR: "XOR", BYTE: "BYTE", SHL: "SHL", SHR: "SHR", SAR: "SAR", ADDMOD: "ADDMOD", MULMOD: "MULMOD", // 0x20 range - crypto. SHA3: "SHA3", // 0x30 range - closure state. ADDRESS: "ADDRESS", BALANCE: "BALANCE", ORIGIN: "ORIGIN", CALLER: "CALLER", CALLVALUE: "CALLVALUE", CALLDATALOAD: "CALLDATALOAD", CALLDATASIZE: "CALLDATASIZE", CALLDATACOPY: "CALLDATACOPY", CODESIZE: "CODESIZE", CODECOPY: "CODECOPY", GASPRICE: "GASPRICE", EXTCODESIZE: "EXTCODESIZE", EXTCODECOPY: "EXTCODECOPY", RETURNDATASIZE: "RETURNDATASIZE", RETURNDATACOPY: "RETURNDATACOPY", EXTCODEHASH: "EXTCODEHASH", // 0x40 range - block operations. BLOCKHASH: "BLOCKHASH", COINBASE: "COINBASE", TIMESTAMP: "TIMESTAMP", NUMBER: "NUMBER", DIFFICULTY: "DIFFICULTY", GASLIMIT: "GASLIMIT", // 0x50 range - 'storage' and execution. POP: "POP", //DUP: "DUP", //SWAP: "SWAP", MLOAD: "MLOAD", MSTORE: "MSTORE", MSTORE8: "MSTORE8", SLOAD: "SLOAD", SSTORE: "SSTORE", JUMP: "JUMP", JUMPI: "JUMPI", PC: "PC", MSIZE: "MSIZE", GAS: "GAS", JUMPDEST: "JUMPDEST", // 0x60 range - push. PUSH1: "PUSH1", PUSH2: "PUSH2", PUSH3: "PUSH3", PUSH4: "PUSH4", PUSH5: "PUSH5", PUSH6: "PUSH6", PUSH7: "PUSH7", PUSH8: "PUSH8", PUSH9: "PUSH9", PUSH10: "PUSH10", PUSH11: "PUSH11", PUSH12: "PUSH12", PUSH13: "PUSH13", PUSH14: "PUSH14", PUSH15: "PUSH15", PUSH16: "PUSH16", PUSH17: "PUSH17", PUSH18: "PUSH18", PUSH19: "PUSH19", PUSH20: "PUSH20", PUSH21: "PUSH21", PUSH22: "PUSH22", PUSH23: "PUSH23", PUSH24: "PUSH24", PUSH25: "PUSH25", PUSH26: "PUSH26", PUSH27: "PUSH27", PUSH28: "PUSH28", PUSH29: "PUSH29", PUSH30: "PUSH30", PUSH31: "PUSH31", PUSH32: "PUSH32", DUP1: "DUP1", DUP2: "DUP2", DUP3: "DUP3", DUP4: "DUP4", DUP5: "DUP5", DUP6: "DUP6", DUP7: "DUP7", DUP8: "DUP8", DUP9: "DUP9", DUP10: "DUP10", DUP11: "DUP11", DUP12: "DUP12", DUP13: "DUP13", DUP14: "DUP14", DUP15: "DUP15", DUP16: "DUP16", SWAP1: "SWAP1", SWAP2: "SWAP2", SWAP3: "SWAP3", SWAP4: "SWAP4", SWAP5: "SWAP5", SWAP6: "SWAP6", SWAP7: "SWAP7", SWAP8: "SWAP8", SWAP9: "SWAP9", SWAP10: "SWAP10", SWAP11: "SWAP11", SWAP12: "SWAP12", SWAP13: "SWAP13", SWAP14: "SWAP14", SWAP15: "SWAP15", SWAP16: "SWAP16", LOG0: "LOG0", LOG1: "LOG1", LOG2: "LOG2", LOG3: "LOG3", LOG4: "LOG4", // 0xf0 range. CREATE: "CREATE", CALL: "CALL", RETURN: "RETURN", CALLCODE: "CALLCODE", DELEGATECALL: "DELEGATECALL", CREATE2: "CREATE2", STATICCALL: "STATICCALL", REVERT: "REVERT", //SELFDESTRUCT: "SELFDESTRUCT", PUSH: "PUSH", DUP: "DUP", SWAP: "SWAP", } func (op OpCode) String() string { str := opCodeToString[op] if len(str) == 0 { return fmt.Sprintf("Missing opcode 0x%x", int(op)) } return str } var stringToOp = map[string]OpCode{ "STOP": STOP, "ADD": ADD, "MUL": MUL, "SUB": SUB, "DIV": DIV, "SDIV": SDIV, "MOD": MOD, "SMOD": SMOD, "EXP": EXP, "NOT": NOT, "LT": LT, "GT": GT, "SLT": SLT, "SGT": SGT, "EQ": EQ, "ISZERO": ISZERO, "SIGNEXTEND": SIGNEXTEND, "AND": AND, "OR": OR, "XOR": XOR, "BYTE": BYTE, "SHL": SHL, "SHR": SHR, "SAR": SAR, "ADDMOD": ADDMOD, "MULMOD": MULMOD, "SHA3": SHA3, "ADDRESS": ADDRESS, "BALANCE": BALANCE, "ORIGIN": ORIGIN, "CALLER": CALLER, "CALLVALUE": CALLVALUE, "CALLDATALOAD": CALLDATALOAD, "CALLDATASIZE": CALLDATASIZE, "CALLDATACOPY": CALLDATACOPY, "DELEGATECALL": DELEGATECALL, "STATICCALL": STATICCALL, "CODESIZE": CODESIZE, "CODECOPY": CODECOPY, "GASPRICE": GASPRICE, "EXTCODESIZE": EXTCODESIZE, "EXTCODECOPY": EXTCODECOPY, "RETURNDATASIZE": RETURNDATASIZE, "RETURNDATACOPY": RETURNDATACOPY, "EXTCODEHASH": EXTCODEHASH, "BLOCKHASH": BLOCKHASH, "COINBASE": COINBASE, "TIMESTAMP": TIMESTAMP, "NUMBER": NUMBER, "DIFFICULTY": DIFFICULTY, "GASLIMIT": GASLIMIT, "POP": POP, "MLOAD": MLOAD, "MSTORE": MSTORE, "MSTORE8": MSTORE8, "SLOAD": SLOAD, "SSTORE": SSTORE, "JUMP": JUMP, "JUMPI": JUMPI, "PC": PC, "MSIZE": MSIZE, "GAS": GAS, "JUMPDEST": JUMPDEST, "PUSH1": PUSH1, "PUSH2": PUSH2, "PUSH3": PUSH3, "PUSH4": PUSH4, "PUSH5": PUSH5, "PUSH6": PUSH6, "PUSH7": PUSH7, "PUSH8": PUSH8, "PUSH9": PUSH9, "PUSH10": PUSH10, "PUSH11": PUSH11, "PUSH12": PUSH12, "PUSH13": PUSH13, "PUSH14": PUSH14, "PUSH15": PUSH15, "PUSH16": PUSH16, "PUSH17": PUSH17, "PUSH18": PUSH18, "PUSH19": PUSH19, "PUSH20": PUSH20, "PUSH21": PUSH21, "PUSH22": PUSH22, "PUSH23": PUSH23, "PUSH24": PUSH24, "PUSH25": PUSH25, "PUSH26": PUSH26, "PUSH27": PUSH27, "PUSH28": PUSH28, "PUSH29": PUSH29, "PUSH30": PUSH30, "PUSH31": PUSH31, "PUSH32": PUSH32, "DUP1": DUP1, "DUP2": DUP2, "DUP3": DUP3, "DUP4": DUP4, "DUP5": DUP5, "DUP6": DUP6, "DUP7": DUP7, "DUP8": DUP8, "DUP9": DUP9, "DUP10": DUP10, "DUP11": DUP11, "DUP12": DUP12, "DUP13": DUP13, "DUP14": DUP14, "DUP15": DUP15, "DUP16": DUP16, "SWAP1": SWAP1, "SWAP2": SWAP2, "SWAP3": SWAP3, "SWAP4": SWAP4, "SWAP5": SWAP5, "SWAP6": SWAP6, "SWAP7": SWAP7, "SWAP8": SWAP8, "SWAP9": SWAP9, "SWAP10": SWAP10, "SWAP11": SWAP11, "SWAP12": SWAP12, "SWAP13": SWAP13, "SWAP14": SWAP14, "SWAP15": SWAP15, "SWAP16": SWAP16, "LOG0": LOG0, "LOG1": LOG1, "LOG2": LOG2, "LOG3": LOG3, "LOG4": LOG4, "CREATE": CREATE, "CREATE2": CREATE2, "CALL": CALL, "RETURN": RETURN, "CALLCODE": CALLCODE, "REVERT": REVERT, //"SELFDESTRUCT": SELFDESTRUCT, } // StringToOp finds the opcode whose name is stored in `str`. func StringToOp(str string) OpCode { return stringToOp[str] } ================================================ FILE: core/vm/runtime/doc.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // Package runtime provides a basic execution model for executing EVM code. package runtime ================================================ FILE: core/vm/runtime/env.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package runtime import ( "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core" "github.com/sero-cash/go-sero/core/vm" ) func NewEnv(cfg *Config) *vm.EVM { context := vm.Context{ //CanTransfer: core.CanTransfer, Transfer: core.Transfer, GetHash: func(uint64) common.Hash { return common.Hash{} }, Origin: cfg.Origin, Coinbase: cfg.Coinbase, BlockNumber: cfg.BlockNumber, Time: cfg.Time, Difficulty: cfg.Difficulty, GasLimit: cfg.GasLimit, GasPrice: cfg.GasPrice, } return vm.NewEVM(context, cfg.State, cfg.ChainConfig, cfg.EVMConfig) } ================================================ FILE: core/vm/runtime/fuzz.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // +build gofuzz package runtime // Fuzz is the basic entry point for the go-fuzz tool // // This returns 1 for valid parsable/runable code, 0 // for invalid opcode. func Fuzz(input []byte) int { _, _, err := Execute(input, input, &Config{ GasLimit: 3000000, }) // invalid opcode if err != nil && len(err.Error()) > 6 && string(err.Error()[:7]) == "invalid" { return 0 } return 1 } ================================================ FILE: core/vm/runtime/runtime.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package runtime import ( "math" "math/big" "time" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-sero/zero/utils" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core/state" "github.com/sero-cash/go-sero/core/vm" "github.com/sero-cash/go-sero/crypto" "github.com/sero-cash/go-sero/params" "github.com/sero-cash/go-sero/serodb" ) // Config is a basic type specifying certain configuration flags for running // the EVM. type Config struct { ChainConfig *params.ChainConfig Difficulty *big.Int Origin common.Address Coinbase common.Address BlockNumber *big.Int Time *big.Int GasLimit uint64 GasPrice *big.Int Value *big.Int Debug bool EVMConfig vm.Config State *state.StateDB GetHashFn func(n uint64) common.Hash } // sets defaults on the config func setDefaults(cfg *Config) { if cfg.ChainConfig == nil { cfg.ChainConfig = ¶ms.ChainConfig{ ChainID: big.NewInt(1), AutumnTwilightBlock: new(big.Int), } } if cfg.Difficulty == nil { cfg.Difficulty = new(big.Int) } if cfg.Time == nil { cfg.Time = big.NewInt(time.Now().Unix()) } if cfg.GasLimit == 0 { cfg.GasLimit = math.MaxUint64 } if cfg.GasPrice == nil { cfg.GasPrice = new(big.Int) } if cfg.Value == nil { cfg.Value = new(big.Int) } if cfg.BlockNumber == nil { cfg.BlockNumber = new(big.Int) } if cfg.GetHashFn == nil { cfg.GetHashFn = func(n uint64) common.Hash { return common.BytesToHash(crypto.Keccak256([]byte(new(big.Int).SetUint64(n).String()))) } } } // Execute executes the code using the input as call data during the execution. // It returns the EVM's return value, the new state and an error if it failed. // // Executes sets up a in memory, temporarily, environment for the execution of // the given code. It makes sure that it's restored to it's original state afterwards. func Execute(code, input []byte, cfg *Config) ([]byte, *state.StateDB, error) { if cfg == nil { cfg = new(Config) } setDefaults(cfg) if cfg.State == nil { cfg.State, _ = state.New(state.NewDatabase(serodb.NewMemDatabase()), nil) } var ( address = common.BytesToAddress([]byte("contract")) vmenv = NewEnv(cfg) sender = vm.AccountRef(cfg.Origin) ) cfg.State.CreateAccount(address) // set the receiver's (the executing contract) code for execution. cfg.State.SetCode(address, code) // Call the code with the given configuration. asset := assets.Asset{Tkn: &assets.Token{ Currency: *common.BytesToHash(common.LeftPadBytes([]byte("SERO"), 32)).HashToUint256(), Value: utils.U256(*cfg.Value), }, } ret, _, err, _ := vmenv.Call( sender, common.BytesToAddress([]byte("contract")), input, cfg.GasLimit, &asset, ) return ret, cfg.State, err } // Create executes the code using the EVM create method func Create(input []byte, cfg *Config) ([]byte, common.Address, uint64, error) { if cfg == nil { cfg = new(Config) } setDefaults(cfg) if cfg.State == nil { cfg.State, _ = state.New(state.NewDatabase(serodb.NewMemDatabase()), nil) } var ( vmenv = NewEnv(cfg) sender = vm.AccountRef(cfg.Origin) ) asset := assets.Asset{Tkn: &assets.Token{ Currency: *common.BytesToHash(common.LeftPadBytes([]byte("SERO"), 32)).HashToUint256(), Value: utils.U256(*cfg.Value), }, } code, address, leftOverGas, err := vmenv.Create( sender, input, cfg.GasLimit, &asset, ) return code, address, leftOverGas, err } // Call executes the code given by the contract's address. It will return the // EVM's return value or an error if it failed. // // Call, unlike Execute, requires a config and also requires the State field to // be set. func Call(address common.Address, input []byte, cfg *Config) ([]byte, uint64, error) { setDefaults(cfg) vmenv := NewEnv(cfg) sender := cfg.State.GetOrNewStateObject(cfg.Origin) // Call the code with the given configuration. asset := assets.Asset{Tkn: &assets.Token{ Currency: *common.BytesToHash(common.LeftPadBytes([]byte("SERO"), 32)).HashToUint256(), Value: utils.U256(*cfg.Value), }, } ret, leftOverGas, err, _ := vmenv.Call( sender, address, input, cfg.GasLimit, &asset, ) return ret, leftOverGas, err } ================================================ FILE: core/vm/runtime/runtime_test.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package runtime import ( "math/big" "strings" "testing" "github.com/sero-cash/go-sero/accounts/abi" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core/state" "github.com/sero-cash/go-sero/core/vm" "github.com/sero-cash/go-sero/serodb" ) func TestDefaults(t *testing.T) { cfg := new(Config) setDefaults(cfg) if cfg.Difficulty == nil { t.Error("expected difficulty to be non nil") } if cfg.Time == nil { t.Error("expected time to be non nil") } if cfg.GasLimit == 0 { t.Error("didn't expect gaslimit to be zero") } if cfg.GasPrice == nil { t.Error("expected time to be non nil") } if cfg.Value == nil { t.Error("expected time to be non nil") } if cfg.GetHashFn == nil { t.Error("expected time to be non nil") } if cfg.BlockNumber == nil { t.Error("expected block number to be non nil") } } func TestEVM(t *testing.T) { defer func() { if r := recover(); r != nil { t.Fatalf("crashed with: %v", r) } }() Execute([]byte{ byte(vm.DIFFICULTY), byte(vm.TIMESTAMP), byte(vm.GASLIMIT), byte(vm.PUSH1), byte(vm.ORIGIN), byte(vm.BLOCKHASH), byte(vm.COINBASE), }, nil, nil) } func TestExecute(t *testing.T) { ret, _, err := Execute([]byte{ byte(vm.PUSH1), 10, byte(vm.PUSH1), 0, byte(vm.MSTORE), byte(vm.PUSH1), 32, byte(vm.PUSH1), 0, byte(vm.RETURN), }, nil, nil) if err != nil { t.Fatal("didn't expect error", err) } num := new(big.Int).SetBytes(ret) if num.Cmp(big.NewInt(10)) != 0 { t.Error("Expected 10, got", num) } } func TestCall(t *testing.T) { state, _ := state.New(state.NewDatabase(serodb.NewMemDatabase()), nil) address := common.Base58ToAddress("3HsKvhwuahH1hzh2UrQSRopnpEAjvQ4wUTqvAWbvb5zbNLRAhY1nd4f5dPk1xVeRQ4aJC8nzNwf3t5y12JSzoKSc") state.SetCode(address, []byte{ byte(vm.PUSH1), 10, byte(vm.PUSH1), 0, byte(vm.MSTORE), byte(vm.PUSH1), 32, byte(vm.PUSH1), 0, byte(vm.RETURN), }) ret, _, err := Call(address, nil, &Config{State: state}) if err != nil { t.Fatal("didn't expect error", err) } num := new(big.Int).SetBytes(ret) if num.Cmp(big.NewInt(10)) != 0 { t.Error("Expected 10, got", num) } } func BenchmarkCall(b *testing.B) { var definition = `[{"constant":true,"inputs":[],"name":"seller","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":false,"inputs":[],"name":"abort","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"value","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[],"name":"refund","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"buyer","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":false,"inputs":[],"name":"confirmReceived","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"state","outputs":[{"name":"","type":"uint8"}],"type":"function"},{"constant":false,"inputs":[],"name":"confirmPurchase","outputs":[],"type":"function"},{"inputs":[],"type":"constructor"},{"anonymous":false,"inputs":[],"name":"Aborted","type":"event"},{"anonymous":false,"inputs":[],"name":"PurchaseConfirmed","type":"event"},{"anonymous":false,"inputs":[],"name":"ItemReceived","type":"event"},{"anonymous":false,"inputs":[],"name":"Refunded","type":"event"}]` var code = common.Hex2Bytes("6060604052361561006c5760e060020a600035046308551a53811461007457806335a063b4146100865780633fa4f245146100a6578063590e1ae3146100af5780637150d8ae146100cf57806373fac6f0146100e1578063c19d93fb146100fe578063d696069714610112575b610131610002565b610133600154600160a060020a031681565b610131600154600160a060020a0390811633919091161461015057610002565b61014660005481565b610131600154600160a060020a039081163391909116146102d557610002565b610133600254600160a060020a031681565b610131600254600160a060020a0333811691161461023757610002565b61014660025460ff60a060020a9091041681565b61013160025460009060ff60a060020a9091041681146101cc57610002565b005b600160a060020a03166060908152602090f35b6060908152602090f35b60025460009060a060020a900460ff16811461016b57610002565b600154600160a060020a03908116908290301631606082818181858883f150506002805460a060020a60ff02191660a160020a179055506040517f72c874aeff0b183a56e2b79c71b46e1aed4dee5e09862134b8821ba2fddbf8bf9250a150565b80546002023414806101dd57610002565b6002805460a060020a60ff021973ffffffffffffffffffffffffffffffffffffffff1990911633171660a060020a1790557fd5d55c8a68912e9a110618df8d5e2e83b8d83211c57a8ddd1203df92885dc881826060a15050565b60025460019060a060020a900460ff16811461025257610002565b60025460008054600160a060020a0390921691606082818181858883f150508354604051600160a060020a0391821694503090911631915082818181858883f150506002805460a060020a60ff02191660a160020a179055506040517fe89152acd703c9d8c7d28829d443260b411454d45394e7995815140c8cbcbcf79250a150565b60025460019060a060020a900460ff1681146102f057610002565b6002805460008054600160a060020a0390921692909102606082818181858883f150508354604051600160a060020a0391821694503090911631915082818181858883f150506002805460a060020a60ff02191660a160020a179055506040517f8616bbbbad963e4e65b1366f1d75dfb63f9e9704bbbf91fb01bec70849906cf79250a15056") abi, err := abi.JSON(strings.NewReader(definition)) if err != nil { b.Fatal(err) } cpurchase, err := abi.Pack("confirmPurchase") if err != nil { b.Fatal(err) } creceived, err := abi.Pack("confirmReceived") if err != nil { b.Fatal(err) } refund, err := abi.Pack("refund") if err != nil { b.Fatal(err) } b.ResetTimer() for i := 0; i < b.N; i++ { for j := 0; j < 400; j++ { Execute(code, cpurchase, nil) Execute(code, creceived, nil) Execute(code, refund, nil) } } } ================================================ FILE: core/vm/stack.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package vm import ( "fmt" "math/big" ) // Stack is an object for basic stack operations. Items popped to the stack are // expected to be changed and modified. stack does not take care of adding newly // initialised objects. type Stack struct { data []*big.Int } func newstack() *Stack { return &Stack{data: make([]*big.Int, 0, 1024)} } // Data returns the underlying big.Int array. func (st *Stack) Data() []*big.Int { return st.data } func (st *Stack) push(d *big.Int) { // NOTE push limit (1024) is checked in baseCheck //stackItem := new(big.Int).Set(d) //st.data = append(st.data, stackItem) st.data = append(st.data, d) } func (st *Stack) pushN(ds ...*big.Int) { st.data = append(st.data, ds...) } func (st *Stack) pop() (ret *big.Int) { ret = st.data[len(st.data)-1] st.data = st.data[:len(st.data)-1] return } func (st *Stack) len() int { return len(st.data) } func (st *Stack) swap(n int) { st.data[st.len()-n], st.data[st.len()-1] = st.data[st.len()-1], st.data[st.len()-n] } func (st *Stack) dup(pool *intPool, n int) { st.push(pool.get().Set(st.data[st.len()-n])) } func (st *Stack) peek() *big.Int { return st.data[st.len()-1] } // Back returns the n'th item in stack func (st *Stack) Back(n int) *big.Int { return st.data[st.len()-n-1] } func (st *Stack) require(n int) error { if st.len() < n { return fmt.Errorf("stack underflow (%d <=> %d)", len(st.data), n) } return nil } // Print dumps the content of the stack func (st *Stack) Print() { fmt.Println("### stack ###") if len(st.data) > 0 { for i, val := range st.data { fmt.Printf("%-3d %v\n", i, val) } } else { fmt.Println("-- empty --") } fmt.Println("#############") } ================================================ FILE: core/vm/stack_table.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package vm import ( "fmt" "github.com/sero-cash/go-sero/params" ) func makeStackFunc(pop, push int) stackValidationFunc { return func(stack *Stack) error { if err := stack.require(pop); err != nil { return err } if stack.len()+push-pop > int(params.StackLimit) { return fmt.Errorf("stack limit reached %d (%d)", stack.len(), params.StackLimit) } return nil } } func makeDupStackFunc(n int) stackValidationFunc { return makeStackFunc(n, n+1) } func makeSwapStackFunc(n int) stackValidationFunc { return makeStackFunc(n, n) } ================================================ FILE: core/vote.go ================================================ package core ================================================ FILE: crypto/crypto.go ================================================ // Copyright 2014 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package crypto import ( "crypto/ecdsa" "crypto/elliptic" "crypto/rand" "encoding/hex" "errors" "fmt" "io" "io/ioutil" "math/big" "os" "github.com/sero-cash/go-sero/common/address" "github.com/sero-cash/go-czero-import/superzk" "github.com/sero-cash/go-sero/rlp" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/common/math" "github.com/sero-cash/go-sero/crypto/sha3" ) var ( secp256k1N, _ = new(big.Int).SetString("fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", 16) secp256k1halfN = new(big.Int).Div(secp256k1N, big.NewInt(2)) ) var errInvalidPubkey = errors.New("invalid secp256k1 public key") // Keccak256 calculates and returns the Keccak256 hash of the input data. func Keccak256(data ...[]byte) []byte { d := sha3.NewKeccak256() for _, b := range data { d.Write(b) } return d.Sum(nil) } // Keccak256Hash calculates and returns the Keccak256 hash of the input data, // converting it to an internal Hash data structure. func Keccak256Hash(data ...[]byte) (h common.Hash) { d := sha3.NewKeccak256() for _, b := range data { d.Write(b) } d.Sum(h[:0]) return h } // Keccak512 calculates and returns the Keccak512 hash of the input data. func Keccak512(data ...[]byte) []byte { d := sha3.NewKeccak512() for _, b := range data { d.Write(b) } return d.Sum(nil) } func CreateAddress(b common.Address, nonce uint64, prefix []byte) common.Address { data, _ := rlp.EncodeToBytes([]interface{}{b, nonce}) data = Keccak512(data) copy(data[:], prefix) return common.BytesToAddress(data) } // ToECDSA creates a private key with the given D value. func ToECDSA(d []byte) (*ecdsa.PrivateKey, error) { return toECDSA(d, true) } // ToECDSAUnsafe blindly converts a binary blob to a private key. It should almost // never be used unless you are sure the input is valid and want to avoid hitting // errors due to bad origin encoding (0 prefixes cut off). func ToECDSAUnsafe(d []byte) *ecdsa.PrivateKey { priv, _ := toECDSA(d, false) return priv } // toECDSA creates a private key with the given D value. The strict parameter // controls whether the key's length should be enforced at the curve size or // it can also accept legacy encodings (0 prefixes). func toECDSA(d []byte, strict bool) (*ecdsa.PrivateKey, error) { priv := new(ecdsa.PrivateKey) priv.PublicKey.Curve = S256() if strict && 8*len(d) != priv.Params().BitSize { return nil, fmt.Errorf("invalid length, need %d bits", priv.Params().BitSize) } priv.D = new(big.Int).SetBytes(d) // The priv.D must < N if priv.D.Cmp(secp256k1N) >= 0 { return nil, fmt.Errorf("invalid private key, >=N") } // The priv.D must not be zero or negative. if priv.D.Sign() <= 0 { return nil, fmt.Errorf("invalid private key, zero or negative") } priv.PublicKey.X, priv.PublicKey.Y = priv.PublicKey.Curve.ScalarBaseMult(d) if priv.PublicKey.X == nil { return nil, errors.New("invalid private key") } return priv, nil } // FromECDSA exports a private key into a binary dump. func FromECDSA(priv *ecdsa.PrivateKey) []byte { if priv == nil { return nil } return math.PaddedBigBytes(priv.D, priv.Params().BitSize/8) } // UnmarshalPubkey converts bytes to a secp256k1 public key. func UnmarshalPubkey(pub []byte) (*ecdsa.PublicKey, error) { x, y := elliptic.Unmarshal(S256(), pub) if x == nil { return nil, errInvalidPubkey } return &ecdsa.PublicKey{Curve: S256(), X: x, Y: y}, nil } func FromECDSAPub(pub *ecdsa.PublicKey) []byte { if pub == nil || pub.X == nil || pub.Y == nil { return nil } return elliptic.Marshal(S256(), pub.X, pub.Y) } // HexToECDSA parses a secp256k1 private key. func HexToECDSA(hexkey string) (*ecdsa.PrivateKey, error) { b, err := hex.DecodeString(hexkey) if err != nil { return nil, errors.New("invalid hex string") } return ToECDSA(b) } // LoadECDSA loads a secp256k1 private key from the given file. func LoadECDSA(file string) (*ecdsa.PrivateKey, error) { buf := make([]byte, 64) fd, err := os.Open(file) if err != nil { return nil, err } defer fd.Close() if _, err := io.ReadFull(fd, buf); err != nil { return nil, err } key, err := hex.DecodeString(string(buf)) if err != nil { return nil, err } return ToECDSA(key) } // SaveECDSA saves a secp256k1 private key to the given file with // restrictive permissions. The key data is saved hex-encoded. func SaveECDSA(file string, key *ecdsa.PrivateKey) error { k := hex.EncodeToString(FromECDSA(key)) return ioutil.WriteFile(file, []byte(k), 0600) } func GenerateKey() (*ecdsa.PrivateKey, error) { return ecdsa.GenerateKey(S256(), rand.Reader) } // ValidateSignatureValues verifies whether the signature values are valid with // the given chain rules. The v value is assumed to be either 0 or 1. func ValidateSignatureValues(v byte, r, s *big.Int, homestead bool) bool { if r.Cmp(common.Big1) < 0 || s.Cmp(common.Big1) < 0 { return false } // reject upper range of s values (ECDSA malleability) // see discussion in secp256k1/libsecp256k1/include/secp256k1.h if homestead && s.Cmp(secp256k1halfN) > 0 { return false } // Frontier: allow s to be in full N range return r.Cmp(secp256k1N) < 0 && s.Cmp(secp256k1N) < 0 && (v == 0 || v == 1) } func PrivkeyToTk(priv *ecdsa.PrivateKey, version int) (ret address.TKAddress) { privKey := FromECDSA(priv) var seed c_type.Uint256 copy(seed[:], privKey) sk := superzk.Seed2Sk(&seed, version) pubBytes, _ := superzk.Sk2Tk(&sk) copy(ret[:], pubBytes[:]) return } func zeroBytes(bytes []byte) { for i := range bytes { bytes[i] = 0 } } ================================================ FILE: crypto/ecies/.gitignore ================================================ # Compiled Object files, Static and Dynamic libs (Shared Objects) *.o *.a *.so # Folders _obj _test # Architecture specific extensions/prefixes *.[568vq] [568vq].out *.cgo1.go *.cgo2.c _cgo_defun.c _cgo_gotypes.go _cgo_export.* _testmain.go *.exe *~ ================================================ FILE: crypto/ecies/LICENSE ================================================ Copyright (c) 2013 Kyle Isom Copyright (c) 2012 The Go Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: crypto/ecies/README ================================================ # NOTE This implementation is direct fork of Kylom's implementation. I claim no authorship over this code apart from some minor modifications. Please be aware this code **has not yet been reviewed**. ecies implements the Elliptic Curve Integrated Encryption Scheme. The package is designed to be compliant with the appropriate NIST standards, and therefore doesn't support the full SEC 1 algorithm set. STATUS: ecies should be ready for use. The ASN.1 support is only complete so far as to supported the listed algorithms before. CAVEATS 1. CMAC support is currently not present. SUPPORTED ALGORITHMS SYMMETRIC CIPHERS HASH FUNCTIONS AES128 SHA-1 AES192 SHA-224 AES256 SHA-256 SHA-384 ELLIPTIC CURVE SHA-512 P256 P384 KEY DERIVATION FUNCTION P521 NIST SP 800-65a Concatenation KDF Curve P224 isn't supported because it does not provide a minimum security level of AES128 with HMAC-SHA1. According to NIST SP 800-57, the security level of P224 is 112 bits of security. Symmetric ciphers use CTR-mode; message tags are computed using HMAC- function. CURVE SELECTION According to NIST SP 800-57, the following curves should be selected: +----------------+-------+ | SYMMETRIC SIZE | CURVE | +----------------+-------+ | 128-bit | P256 | +----------------+-------+ | 192-bit | P384 | +----------------+-------+ | 256-bit | P521 | +----------------+-------+ TODO 1. Look at serialising the parameters with the SEC 1 ASN.1 module. 2. Validate ASN.1 formats with SEC 1. TEST VECTORS The only test vectors I've found so far date from 1993, predating AES and including only 163-bit curves. Therefore, there are no published test vectors to compare to. LICENSE ecies is released under the same license as the Go source code. See the LICENSE file for details. REFERENCES * SEC (Standard for Efficient Cryptography) 1, version 2.0: Elliptic Curve Cryptography; Certicom, May 2009. http://www.secg.org/sec1-v2.pdf * GEC (Guidelines for Efficient Cryptography) 2, version 0.3: Test Vectors for SEC 1; Certicom, September 1999. http://read.pudn.com/downloads168/doc/772358/TestVectorsforSEC%201-gec2.pdf * NIST SP 800-56a: Recommendation for Pair-Wise Key Establishment Schemes Using Discrete Logarithm Cryptography. National Institute of Standards and Technology, May 2007. http://csrc.nist.gov/publications/nistpubs/800-56A/SP800-56A_Revision1_Mar08-2007.pdf * Suite B Implementer’s Guide to NIST SP 800-56A. National Security Agency, July 28, 2009. http://www.nsa.gov/ia/_files/SuiteB_Implementer_G-113808.pdf * NIST SP 800-57: Recommendation for Key Management – Part 1: General (Revision 3). National Institute of Standards and Technology, July 2012. http://csrc.nist.gov/publications/nistpubs/800-57/sp800-57_part1_rev3_general.pdf ================================================ FILE: crypto/ecies/ecies.go ================================================ // Copyright (c) 2013 Kyle Isom // Copyright (c) 2012 The Go Authors. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package ecies import ( "crypto/cipher" "crypto/ecdsa" "crypto/elliptic" "crypto/hmac" "crypto/subtle" "fmt" "hash" "io" "math/big" ) var ( ErrImport = fmt.Errorf("ecies: failed to import key") ErrInvalidCurve = fmt.Errorf("ecies: invalid elliptic curve") ErrInvalidParams = fmt.Errorf("ecies: invalid ECIES parameters") ErrInvalidPublicKey = fmt.Errorf("ecies: invalid public key") ErrSharedKeyIsPointAtInfinity = fmt.Errorf("ecies: shared key is point at infinity") ErrSharedKeyTooBig = fmt.Errorf("ecies: shared key params are too big") ) // PublicKey is a representation of an elliptic curve public key. type PublicKey struct { X *big.Int Y *big.Int elliptic.Curve Params *ECIESParams } // Export an ECIES public key as an ECDSA public key. func (pub *PublicKey) ExportECDSA() *ecdsa.PublicKey { return &ecdsa.PublicKey{Curve: pub.Curve, X: pub.X, Y: pub.Y} } // Import an ECDSA public key as an ECIES public key. func ImportECDSAPublic(pub *ecdsa.PublicKey) *PublicKey { return &PublicKey{ X: pub.X, Y: pub.Y, Curve: pub.Curve, Params: ParamsFromCurve(pub.Curve), } } // PrivateKey is a representation of an elliptic curve private key. type PrivateKey struct { PublicKey D *big.Int } // Export an ECIES private key as an ECDSA private key. func (prv *PrivateKey) ExportECDSA() *ecdsa.PrivateKey { pub := &prv.PublicKey pubECDSA := pub.ExportECDSA() return &ecdsa.PrivateKey{PublicKey: *pubECDSA, D: prv.D} } // Import an ECDSA private key as an ECIES private key. func ImportECDSA(prv *ecdsa.PrivateKey) *PrivateKey { pub := ImportECDSAPublic(&prv.PublicKey) return &PrivateKey{*pub, prv.D} } // Generate an elliptic curve public / private keypair. If params is nil, // the recommended default parameters for the key will be chosen. func GenerateKey(rand io.Reader, curve elliptic.Curve, params *ECIESParams) (prv *PrivateKey, err error) { pb, x, y, err := elliptic.GenerateKey(curve, rand) if err != nil { return } prv = new(PrivateKey) prv.PublicKey.X = x prv.PublicKey.Y = y prv.PublicKey.Curve = curve prv.D = new(big.Int).SetBytes(pb) if params == nil { params = ParamsFromCurve(curve) } prv.PublicKey.Params = params return } // MaxSharedKeyLength returns the maximum length of the shared key the // public key can produce. func MaxSharedKeyLength(pub *PublicKey) int { return (pub.Curve.Params().BitSize + 7) / 8 } // ECDH key agreement method used to establish secret keys for encryption. func (prv *PrivateKey) GenerateShared(pub *PublicKey, skLen, macLen int) (sk []byte, err error) { if prv.PublicKey.Curve != pub.Curve { return nil, ErrInvalidCurve } if skLen+macLen > MaxSharedKeyLength(pub) { return nil, ErrSharedKeyTooBig } x, _ := pub.Curve.ScalarMult(pub.X, pub.Y, prv.D.Bytes()) if x == nil { return nil, ErrSharedKeyIsPointAtInfinity } sk = make([]byte, skLen+macLen) skBytes := x.Bytes() copy(sk[len(sk)-len(skBytes):], skBytes) return sk, nil } var ( ErrKeyDataTooLong = fmt.Errorf("ecies: can't supply requested key data") ErrSharedTooLong = fmt.Errorf("ecies: shared secret is too long") ErrInvalidMessage = fmt.Errorf("ecies: invalid message") ) var ( big2To32 = new(big.Int).Exp(big.NewInt(2), big.NewInt(32), nil) big2To32M1 = new(big.Int).Sub(big2To32, big.NewInt(1)) ) func incCounter(ctr []byte) { if ctr[3]++; ctr[3] != 0 { return } if ctr[2]++; ctr[2] != 0 { return } if ctr[1]++; ctr[1] != 0 { return } if ctr[0]++; ctr[0] != 0 { return } } // NIST SP 800-56 Concatenation Key Derivation Function (see section 5.8.1). func concatKDF(hash hash.Hash, z, s1 []byte, kdLen int) (k []byte, err error) { if s1 == nil { s1 = make([]byte, 0) } reps := ((kdLen + 7) * 8) / (hash.BlockSize() * 8) if big.NewInt(int64(reps)).Cmp(big2To32M1) > 0 { fmt.Println(big2To32M1) return nil, ErrKeyDataTooLong } counter := []byte{0, 0, 0, 1} k = make([]byte, 0) for i := 0; i <= reps; i++ { hash.Write(counter) hash.Write(z) hash.Write(s1) k = append(k, hash.Sum(nil)...) hash.Reset() incCounter(counter) } k = k[:kdLen] return } // messageTag computes the MAC of a message (called the tag) as per // SEC 1, 3.5. func messageTag(hash func() hash.Hash, km, msg, shared []byte) []byte { mac := hmac.New(hash, km) mac.Write(msg) mac.Write(shared) tag := mac.Sum(nil) return tag } // Generate an initialisation vector for CTR mode. func generateIV(params *ECIESParams, rand io.Reader) (iv []byte, err error) { iv = make([]byte, params.BlockSize) _, err = io.ReadFull(rand, iv) return } // symEncrypt carries out CTR encryption using the block cipher specified in the // parameters. func symEncrypt(rand io.Reader, params *ECIESParams, key, m []byte) (ct []byte, err error) { c, err := params.Cipher(key) if err != nil { return } iv, err := generateIV(params, rand) if err != nil { return } ctr := cipher.NewCTR(c, iv) ct = make([]byte, len(m)+params.BlockSize) copy(ct, iv) ctr.XORKeyStream(ct[params.BlockSize:], m) return } // symDecrypt carries out CTR decryption using the block cipher specified in // the parameters func symDecrypt(params *ECIESParams, key, ct []byte) (m []byte, err error) { c, err := params.Cipher(key) if err != nil { return } ctr := cipher.NewCTR(c, ct[:params.BlockSize]) m = make([]byte, len(ct)-params.BlockSize) ctr.XORKeyStream(m, ct[params.BlockSize:]) return } // Encrypt encrypts a message using ECIES as specified in SEC 1, 5.1. // // s1 and s2 contain shared information that is not part of the resulting // ciphertext. s1 is fed into key derivation, s2 is fed into the MAC. If the // shared information parameters aren't being used, they should be nil. func Encrypt(rand io.Reader, pub *PublicKey, m, s1, s2 []byte) (ct []byte, err error) { params := pub.Params if params == nil { if params = ParamsFromCurve(pub.Curve); params == nil { err = ErrUnsupportedECIESParameters return } } R, err := GenerateKey(rand, pub.Curve, params) if err != nil { return } hash := params.Hash() z, err := R.GenerateShared(pub, params.KeyLen, params.KeyLen) if err != nil { return } K, err := concatKDF(hash, z, s1, params.KeyLen+params.KeyLen) if err != nil { return } Ke := K[:params.KeyLen] Km := K[params.KeyLen:] hash.Write(Km) Km = hash.Sum(nil) hash.Reset() em, err := symEncrypt(rand, params, Ke, m) if err != nil || len(em) <= params.BlockSize { return } d := messageTag(params.Hash, Km, em, s2) Rb := elliptic.Marshal(pub.Curve, R.PublicKey.X, R.PublicKey.Y) ct = make([]byte, len(Rb)+len(em)+len(d)) copy(ct, Rb) copy(ct[len(Rb):], em) copy(ct[len(Rb)+len(em):], d) return } // Decrypt decrypts an ECIES ciphertext. func (prv *PrivateKey) Decrypt(c, s1, s2 []byte) (m []byte, err error) { if len(c) == 0 { return nil, ErrInvalidMessage } params := prv.PublicKey.Params if params == nil { if params = ParamsFromCurve(prv.PublicKey.Curve); params == nil { err = ErrUnsupportedECIESParameters return } } hash := params.Hash() var ( rLen int hLen int = hash.Size() mStart int mEnd int ) switch c[0] { case 2, 3, 4: rLen = (prv.PublicKey.Curve.Params().BitSize + 7) / 4 if len(c) < (rLen + hLen + 1) { err = ErrInvalidMessage return } default: err = ErrInvalidPublicKey return } mStart = rLen mEnd = len(c) - hLen R := new(PublicKey) R.Curve = prv.PublicKey.Curve R.X, R.Y = elliptic.Unmarshal(R.Curve, c[:rLen]) if R.X == nil { err = ErrInvalidPublicKey return } if !R.Curve.IsOnCurve(R.X, R.Y) { err = ErrInvalidCurve return } z, err := prv.GenerateShared(R, params.KeyLen, params.KeyLen) if err != nil { return } K, err := concatKDF(hash, z, s1, params.KeyLen+params.KeyLen) if err != nil { return } Ke := K[:params.KeyLen] Km := K[params.KeyLen:] hash.Write(Km) Km = hash.Sum(nil) hash.Reset() d := messageTag(params.Hash, Km, c[mStart:mEnd], s2) if subtle.ConstantTimeCompare(c[mEnd:], d) != 1 { err = ErrInvalidMessage return } m, err = symDecrypt(params, Ke, c[mStart:mEnd]) return } ================================================ FILE: crypto/ecies/ecies_test.go ================================================ // Copyright (c) 2013 Kyle Isom // Copyright (c) 2012 The Go Authors. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package ecies import ( "bytes" "crypto/elliptic" "crypto/rand" "crypto/sha256" "encoding/hex" "flag" "fmt" "math/big" "testing" "github.com/sero-cash/go-sero/crypto" ) var dumpEnc bool func init() { flDump := flag.Bool("dump", false, "write encrypted test message to file") flag.Parse() dumpEnc = *flDump } // Ensure the KDF generates appropriately sized keys. func TestKDF(t *testing.T) { msg := []byte("Hello, world") h := sha256.New() k, err := concatKDF(h, msg, nil, 64) if err != nil { fmt.Println(err.Error()) t.FailNow() } if len(k) != 64 { fmt.Printf("KDF: generated key is the wrong size (%d instead of 64\n", len(k)) t.FailNow() } } var ErrBadSharedKeys = fmt.Errorf("ecies: shared keys don't match") // cmpParams compares a set of ECIES parameters. We assume, as per the // docs, that AES is the only supported symmetric encryption algorithm. func cmpParams(p1, p2 *ECIESParams) bool { return p1.hashAlgo == p2.hashAlgo && p1.KeyLen == p2.KeyLen && p1.BlockSize == p2.BlockSize } // cmpPublic returns true if the two public keys represent the same pojnt. func cmpPublic(pub1, pub2 PublicKey) bool { if pub1.X == nil || pub1.Y == nil { fmt.Println(ErrInvalidPublicKey.Error()) return false } if pub2.X == nil || pub2.Y == nil { fmt.Println(ErrInvalidPublicKey.Error()) return false } pub1Out := elliptic.Marshal(pub1.Curve, pub1.X, pub1.Y) pub2Out := elliptic.Marshal(pub2.Curve, pub2.X, pub2.Y) return bytes.Equal(pub1Out, pub2Out) } // cmpPrivate returns true if the two private keys are the same. func cmpPrivate(prv1, prv2 *PrivateKey) bool { if prv1 == nil || prv1.D == nil { return false } else if prv2 == nil || prv2.D == nil { return false } else if prv1.D.Cmp(prv2.D) != 0 { return false } else { return cmpPublic(prv1.PublicKey, prv2.PublicKey) } } // Validate the ECDH component. func TestSharedKey(t *testing.T) { prv1, err := GenerateKey(rand.Reader, DefaultCurve, nil) if err != nil { fmt.Println(err.Error()) t.FailNow() } skLen := MaxSharedKeyLength(&prv1.PublicKey) / 2 prv2, err := GenerateKey(rand.Reader, DefaultCurve, nil) if err != nil { fmt.Println(err.Error()) t.FailNow() } sk1, err := prv1.GenerateShared(&prv2.PublicKey, skLen, skLen) if err != nil { fmt.Println(err.Error()) t.FailNow() } sk2, err := prv2.GenerateShared(&prv1.PublicKey, skLen, skLen) if err != nil { fmt.Println(err.Error()) t.FailNow() } if !bytes.Equal(sk1, sk2) { fmt.Println(ErrBadSharedKeys.Error()) t.FailNow() } } func TestSharedKeyPadding(t *testing.T) { // sanity checks prv0 := hexKey("1adf5c18167d96a1f9a0b1ef63be8aa27eaf6032c233b2b38f7850cf5b859fd9") prv1 := hexKey("0097a076fc7fcd9208240668e31c9abee952cbb6e375d1b8febc7499d6e16f1a") x0, _ := new(big.Int).SetString("1a8ed022ff7aec59dc1b440446bdda5ff6bcb3509a8b109077282b361efffbd8", 16) x1, _ := new(big.Int).SetString("6ab3ac374251f638d0abb3ef596d1dc67955b507c104e5f2009724812dc027b8", 16) y0, _ := new(big.Int).SetString("e040bd480b1deccc3bc40bd5b1fdcb7bfd352500b477cb9471366dbd4493f923", 16) y1, _ := new(big.Int).SetString("8ad915f2b503a8be6facab6588731fefeb584fd2dfa9a77a5e0bba1ec439e4fa", 16) if prv0.PublicKey.X.Cmp(x0) != 0 { t.Errorf("mismatched prv0.X:\nhave: %x\nwant: %x\n", prv0.PublicKey.X.Bytes(), x0.Bytes()) } if prv0.PublicKey.Y.Cmp(y0) != 0 { t.Errorf("mismatched prv0.Y:\nhave: %x\nwant: %x\n", prv0.PublicKey.Y.Bytes(), y0.Bytes()) } if prv1.PublicKey.X.Cmp(x1) != 0 { t.Errorf("mismatched prv1.X:\nhave: %x\nwant: %x\n", prv1.PublicKey.X.Bytes(), x1.Bytes()) } if prv1.PublicKey.Y.Cmp(y1) != 0 { t.Errorf("mismatched prv1.Y:\nhave: %x\nwant: %x\n", prv1.PublicKey.Y.Bytes(), y1.Bytes()) } // test shared secret generation sk1, err := prv0.GenerateShared(&prv1.PublicKey, 16, 16) if err != nil { fmt.Println(err.Error()) } sk2, err := prv1.GenerateShared(&prv0.PublicKey, 16, 16) if err != nil { t.Fatal(err.Error()) } if !bytes.Equal(sk1, sk2) { t.Fatal(ErrBadSharedKeys.Error()) } } // Verify that the key generation code fails when too much key data is // requested. func TestTooBigSharedKey(t *testing.T) { prv1, err := GenerateKey(rand.Reader, DefaultCurve, nil) if err != nil { fmt.Println(err.Error()) t.FailNow() } prv2, err := GenerateKey(rand.Reader, DefaultCurve, nil) if err != nil { fmt.Println(err.Error()) t.FailNow() } _, err = prv1.GenerateShared(&prv2.PublicKey, 32, 32) if err != ErrSharedKeyTooBig { fmt.Println("ecdh: shared key should be too large for curve") t.FailNow() } _, err = prv2.GenerateShared(&prv1.PublicKey, 32, 32) if err != ErrSharedKeyTooBig { fmt.Println("ecdh: shared key should be too large for curve") t.FailNow() } } // Benchmark the generation of P256 keys. func BenchmarkGenerateKeyP256(b *testing.B) { for i := 0; i < b.N; i++ { if _, err := GenerateKey(rand.Reader, elliptic.P256(), nil); err != nil { fmt.Println(err.Error()) b.FailNow() } } } // Benchmark the generation of P256 shared keys. func BenchmarkGenSharedKeyP256(b *testing.B) { prv, err := GenerateKey(rand.Reader, elliptic.P256(), nil) if err != nil { fmt.Println(err.Error()) b.FailNow() } b.ResetTimer() for i := 0; i < b.N; i++ { _, err := prv.GenerateShared(&prv.PublicKey, 16, 16) if err != nil { fmt.Println(err.Error()) b.FailNow() } } } // Benchmark the generation of S256 shared keys. func BenchmarkGenSharedKeyS256(b *testing.B) { prv, err := GenerateKey(rand.Reader, crypto.S256(), nil) if err != nil { fmt.Println(err.Error()) b.FailNow() } b.ResetTimer() for i := 0; i < b.N; i++ { _, err := prv.GenerateShared(&prv.PublicKey, 16, 16) if err != nil { fmt.Println(err.Error()) b.FailNow() } } } // Verify that an encrypted message can be successfully decrypted. func TestEncryptDecrypt(t *testing.T) { prv1, err := GenerateKey(rand.Reader, DefaultCurve, nil) if err != nil { fmt.Println(err.Error()) t.FailNow() } prv2, err := GenerateKey(rand.Reader, DefaultCurve, nil) if err != nil { fmt.Println(err.Error()) t.FailNow() } message := []byte("Hello, world.") ct, err := Encrypt(rand.Reader, &prv2.PublicKey, message, nil, nil) if err != nil { fmt.Println(err.Error()) t.FailNow() } pt, err := prv2.Decrypt(ct, nil, nil) if err != nil { fmt.Println(err.Error()) t.FailNow() } if !bytes.Equal(pt, message) { fmt.Println("ecies: plaintext doesn't match message") t.FailNow() } _, err = prv1.Decrypt(ct, nil, nil) if err == nil { fmt.Println("ecies: encryption should not have succeeded") t.FailNow() } } func TestDecryptShared2(t *testing.T) { prv, err := GenerateKey(rand.Reader, DefaultCurve, nil) if err != nil { t.Fatal(err) } message := []byte("Hello, world.") shared2 := []byte("shared data 2") ct, err := Encrypt(rand.Reader, &prv.PublicKey, message, nil, shared2) if err != nil { t.Fatal(err) } // Check that decrypting with correct shared data works. pt, err := prv.Decrypt(ct, nil, shared2) if err != nil { t.Fatal(err) } if !bytes.Equal(pt, message) { t.Fatal("ecies: plaintext doesn't match message") } // Decrypting without shared data or incorrect shared data fails. if _, err = prv.Decrypt(ct, nil, nil); err == nil { t.Fatal("ecies: decrypting without shared data didn't fail") } if _, err = prv.Decrypt(ct, nil, []byte("garbage")); err == nil { t.Fatal("ecies: decrypting with incorrect shared data didn't fail") } } type testCase struct { Curve elliptic.Curve Name string Expected *ECIESParams } var testCases = []testCase{ { Curve: elliptic.P256(), Name: "P256", Expected: ECIES_AES128_SHA256, }, { Curve: elliptic.P384(), Name: "P384", Expected: ECIES_AES256_SHA384, }, { Curve: elliptic.P521(), Name: "P521", Expected: ECIES_AES256_SHA512, }, } // Test parameter selection for each curve, and that P224 fails automatic // parameter selection (see README for a discussion of P224). Ensures that // selecting a set of parameters automatically for the given curve works. func TestParamSelection(t *testing.T) { for _, c := range testCases { testParamSelection(t, c) } } func testParamSelection(t *testing.T, c testCase) { params := ParamsFromCurve(c.Curve) if params == nil && c.Expected != nil { fmt.Printf("%s (%s)\n", ErrInvalidParams.Error(), c.Name) t.FailNow() } else if params != nil && !cmpParams(params, c.Expected) { fmt.Printf("ecies: parameters should be invalid (%s)\n", c.Name) t.FailNow() } prv1, err := GenerateKey(rand.Reader, DefaultCurve, nil) if err != nil { fmt.Printf("%s (%s)\n", err.Error(), c.Name) t.FailNow() } prv2, err := GenerateKey(rand.Reader, DefaultCurve, nil) if err != nil { fmt.Printf("%s (%s)\n", err.Error(), c.Name) t.FailNow() } message := []byte("Hello, world.") ct, err := Encrypt(rand.Reader, &prv2.PublicKey, message, nil, nil) if err != nil { fmt.Printf("%s (%s)\n", err.Error(), c.Name) t.FailNow() } pt, err := prv2.Decrypt(ct, nil, nil) if err != nil { fmt.Printf("%s (%s)\n", err.Error(), c.Name) t.FailNow() } if !bytes.Equal(pt, message) { fmt.Printf("ecies: plaintext doesn't match message (%s)\n", c.Name) t.FailNow() } _, err = prv1.Decrypt(ct, nil, nil) if err == nil { fmt.Printf("ecies: encryption should not have succeeded (%s)\n", c.Name) t.FailNow() } } // Ensure that the basic public key validation in the decryption operation // works. func TestBasicKeyValidation(t *testing.T) { badBytes := []byte{0, 1, 5, 6, 7, 8, 9} prv, err := GenerateKey(rand.Reader, DefaultCurve, nil) if err != nil { fmt.Println(err.Error()) t.FailNow() } message := []byte("Hello, world.") ct, err := Encrypt(rand.Reader, &prv.PublicKey, message, nil, nil) if err != nil { fmt.Println(err.Error()) t.FailNow() } for _, b := range badBytes { ct[0] = b _, err := prv.Decrypt(ct, nil, nil) if err != ErrInvalidPublicKey { fmt.Println("ecies: validated an invalid key") t.FailNow() } } } func TestBox(t *testing.T) { prv1 := hexKey("4b50fa71f5c3eeb8fdc452224b2395af2fcc3d125e06c32c82e048c0559db03f") prv2 := hexKey("d0b043b4c5d657670778242d82d68a29d25d7d711127d17b8e299f156dad361a") pub2 := &prv2.PublicKey message := []byte("Hello, world.") ct, err := Encrypt(rand.Reader, pub2, message, nil, nil) if err != nil { t.Fatal(err) } pt, err := prv2.Decrypt(ct, nil, nil) if err != nil { t.Fatal(err) } if !bytes.Equal(pt, message) { t.Fatal("ecies: plaintext doesn't match message") } if _, err = prv1.Decrypt(ct, nil, nil); err == nil { t.Fatal("ecies: encryption should not have succeeded") } } // Verify GenerateShared against static values - useful when // debugging changes in underlying libs func TestSharedKeyStatic(t *testing.T) { prv1 := hexKey("7ebbc6a8358bc76dd73ebc557056702c8cfc34e5cfcd90eb83af0347575fd2ad") prv2 := hexKey("6a3d6396903245bba5837752b9e0348874e72db0c4e11e9c485a81b4ea4353b9") skLen := MaxSharedKeyLength(&prv1.PublicKey) / 2 sk1, err := prv1.GenerateShared(&prv2.PublicKey, skLen, skLen) if err != nil { fmt.Println(err.Error()) t.FailNow() } sk2, err := prv2.GenerateShared(&prv1.PublicKey, skLen, skLen) if err != nil { fmt.Println(err.Error()) t.FailNow() } if !bytes.Equal(sk1, sk2) { fmt.Println(ErrBadSharedKeys.Error()) t.FailNow() } sk, _ := hex.DecodeString("167ccc13ac5e8a26b131c3446030c60fbfac6aa8e31149d0869f93626a4cdf62") if !bytes.Equal(sk1, sk) { t.Fatalf("shared secret mismatch: want: %x have: %x", sk, sk1) } } func hexKey(prv string) *PrivateKey { key, err := crypto.HexToECDSA(prv) if err != nil { panic(err) } return ImportECDSA(key) } ================================================ FILE: crypto/ecies/params.go ================================================ // Copyright (c) 2013 Kyle Isom // Copyright (c) 2012 The Go Authors. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package ecies // This file contains parameters for ECIES encryption, specifying the // symmetric encryption and HMAC parameters. import ( "crypto" "crypto/aes" "crypto/cipher" "crypto/elliptic" "crypto/sha256" "crypto/sha512" "fmt" "hash" ethcrypto "github.com/sero-cash/go-sero/crypto" ) var ( DefaultCurve = ethcrypto.S256() ErrUnsupportedECDHAlgorithm = fmt.Errorf("ecies: unsupported ECDH algorithm") ErrUnsupportedECIESParameters = fmt.Errorf("ecies: unsupported ECIES parameters") ) type ECIESParams struct { Hash func() hash.Hash // hash function hashAlgo crypto.Hash Cipher func([]byte) (cipher.Block, error) // symmetric cipher BlockSize int // block size of symmetric cipher KeyLen int // length of symmetric key } // Standard ECIES parameters: // * ECIES using AES128 and HMAC-SHA-256-16 // * ECIES using AES256 and HMAC-SHA-256-32 // * ECIES using AES256 and HMAC-SHA-384-48 // * ECIES using AES256 and HMAC-SHA-512-64 var ( ECIES_AES128_SHA256 = &ECIESParams{ Hash: sha256.New, hashAlgo: crypto.SHA256, Cipher: aes.NewCipher, BlockSize: aes.BlockSize, KeyLen: 16, } ECIES_AES256_SHA256 = &ECIESParams{ Hash: sha256.New, hashAlgo: crypto.SHA256, Cipher: aes.NewCipher, BlockSize: aes.BlockSize, KeyLen: 32, } ECIES_AES256_SHA384 = &ECIESParams{ Hash: sha512.New384, hashAlgo: crypto.SHA384, Cipher: aes.NewCipher, BlockSize: aes.BlockSize, KeyLen: 32, } ECIES_AES256_SHA512 = &ECIESParams{ Hash: sha512.New, hashAlgo: crypto.SHA512, Cipher: aes.NewCipher, BlockSize: aes.BlockSize, KeyLen: 32, } ) var paramsFromCurve = map[elliptic.Curve]*ECIESParams{ ethcrypto.S256(): ECIES_AES128_SHA256, elliptic.P256(): ECIES_AES128_SHA256, elliptic.P384(): ECIES_AES256_SHA384, elliptic.P521(): ECIES_AES256_SHA512, } func AddParamsForCurve(curve elliptic.Curve, params *ECIESParams) { paramsFromCurve[curve] = params } // ParamsFromCurve selects parameters optimal for the selected elliptic curve. // Only the curves P256, P384, and P512 are supported. func ParamsFromCurve(curve elliptic.Curve) (params *ECIESParams) { return paramsFromCurve[curve] } ================================================ FILE: crypto/secp256k1/.gitignore ================================================ # Compiled Object files, Static and Dynamic libs (Shared Objects) *.o *.a *.so # Folders _obj _test # Architecture specific extensions/prefixes *.[568vq] [568vq].out *.cgo1.go *.cgo2.c _cgo_defun.c _cgo_gotypes.go _cgo_export.* _testmain.go *.exe *~ ================================================ FILE: crypto/secp256k1/LICENSE ================================================ Copyright (c) 2010 The Go Authors. All rights reserved. Copyright (c) 2011 ThePiachu. All rights reserved. Copyright (c) 2015 Jeffrey Wilcke. All rights reserved. Copyright (c) 2015 Felix Lange. All rights reserved. Copyright (c) 2015 Gustav Simonsson. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the copyright holder. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: crypto/secp256k1/curve.go ================================================ // Copyright 2010 The Go Authors. All rights reserved. // Copyright 2011 ThePiachu. All rights reserved. // Copyright 2015 Jeffrey Wilcke, Felix Lange, Gustav Simonsson. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // * The name of ThePiachu may not be used to endorse or promote products // derived from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package secp256k1 import ( "crypto/elliptic" "math/big" "unsafe" ) /* #include "libsecp256k1/include/secp256k1.h" extern int secp256k1_ext_scalar_mul(const secp256k1_context* ctx, const unsigned char *point, const unsigned char *scalar); */ import "C" const ( // number of bits in a big.Word wordBits = 32 << (uint64(^big.Word(0)) >> 63) // number of bytes in a big.Word wordBytes = wordBits / 8 ) // readBits encodes the absolute value of bigint as big-endian bytes. Callers // must ensure that buf has enough space. If buf is too short the result will // be incomplete. func readBits(bigint *big.Int, buf []byte) { i := len(buf) for _, d := range bigint.Bits() { for j := 0; j < wordBytes && i > 0; j++ { i-- buf[i] = byte(d) d >>= 8 } } } // This code is from https://github.com/ThePiachu/GoBit and implements // several Koblitz elliptic curves over prime fields. // // The curve methods, internally, on Jacobian coordinates. For a given // (x, y) position on the curve, the Jacobian coordinates are (x1, y1, // z1) where x = x1/z1² and y = y1/z1³. The greatest speedups come // when the whole calculation can be performed within the transform // (as in ScalarMult and ScalarBaseMult). But even for Add and Double, // it's faster to apply and reverse the transform than to operate in // affine coordinates. // A BitCurve represents a Koblitz Curve with a=0. // See http://www.hyperelliptic.org/EFD/g1p/auto-shortw.html type BitCurve struct { P *big.Int // the order of the underlying field N *big.Int // the order of the base point B *big.Int // the constant of the BitCurve equation Gx, Gy *big.Int // (x,y) of the base point BitSize int // the size of the underlying field } func (BitCurve *BitCurve) Params() *elliptic.CurveParams { return &elliptic.CurveParams{ P: BitCurve.P, N: BitCurve.N, B: BitCurve.B, Gx: BitCurve.Gx, Gy: BitCurve.Gy, BitSize: BitCurve.BitSize, } } // IsOnCurve returns true if the given (x,y) lies on the BitCurve. func (BitCurve *BitCurve) IsOnCurve(x, y *big.Int) bool { // y² = x³ + b y2 := new(big.Int).Mul(y, y) //y² y2.Mod(y2, BitCurve.P) //y²%P x3 := new(big.Int).Mul(x, x) //x² x3.Mul(x3, x) //x³ x3.Add(x3, BitCurve.B) //x³+B x3.Mod(x3, BitCurve.P) //(x³+B)%P return x3.Cmp(y2) == 0 } //TODO: double check if the function is okay // affineFromJacobian reverses the Jacobian transform. See the comment at the // top of the file. func (BitCurve *BitCurve) affineFromJacobian(x, y, z *big.Int) (xOut, yOut *big.Int) { zinv := new(big.Int).ModInverse(z, BitCurve.P) zinvsq := new(big.Int).Mul(zinv, zinv) xOut = new(big.Int).Mul(x, zinvsq) xOut.Mod(xOut, BitCurve.P) zinvsq.Mul(zinvsq, zinv) yOut = new(big.Int).Mul(y, zinvsq) yOut.Mod(yOut, BitCurve.P) return } // Add returns the sum of (x1,y1) and (x2,y2) func (BitCurve *BitCurve) Add(x1, y1, x2, y2 *big.Int) (*big.Int, *big.Int) { z := new(big.Int).SetInt64(1) return BitCurve.affineFromJacobian(BitCurve.addJacobian(x1, y1, z, x2, y2, z)) } // addJacobian takes two points in Jacobian coordinates, (x1, y1, z1) and // (x2, y2, z2) and returns their sum, also in Jacobian form. func (BitCurve *BitCurve) addJacobian(x1, y1, z1, x2, y2, z2 *big.Int) (*big.Int, *big.Int, *big.Int) { // See http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#addition-add-2007-bl z1z1 := new(big.Int).Mul(z1, z1) z1z1.Mod(z1z1, BitCurve.P) z2z2 := new(big.Int).Mul(z2, z2) z2z2.Mod(z2z2, BitCurve.P) u1 := new(big.Int).Mul(x1, z2z2) u1.Mod(u1, BitCurve.P) u2 := new(big.Int).Mul(x2, z1z1) u2.Mod(u2, BitCurve.P) h := new(big.Int).Sub(u2, u1) if h.Sign() == -1 { h.Add(h, BitCurve.P) } i := new(big.Int).Lsh(h, 1) i.Mul(i, i) j := new(big.Int).Mul(h, i) s1 := new(big.Int).Mul(y1, z2) s1.Mul(s1, z2z2) s1.Mod(s1, BitCurve.P) s2 := new(big.Int).Mul(y2, z1) s2.Mul(s2, z1z1) s2.Mod(s2, BitCurve.P) r := new(big.Int).Sub(s2, s1) if r.Sign() == -1 { r.Add(r, BitCurve.P) } r.Lsh(r, 1) v := new(big.Int).Mul(u1, i) x3 := new(big.Int).Set(r) x3.Mul(x3, x3) x3.Sub(x3, j) x3.Sub(x3, v) x3.Sub(x3, v) x3.Mod(x3, BitCurve.P) y3 := new(big.Int).Set(r) v.Sub(v, x3) y3.Mul(y3, v) s1.Mul(s1, j) s1.Lsh(s1, 1) y3.Sub(y3, s1) y3.Mod(y3, BitCurve.P) z3 := new(big.Int).Add(z1, z2) z3.Mul(z3, z3) z3.Sub(z3, z1z1) if z3.Sign() == -1 { z3.Add(z3, BitCurve.P) } z3.Sub(z3, z2z2) if z3.Sign() == -1 { z3.Add(z3, BitCurve.P) } z3.Mul(z3, h) z3.Mod(z3, BitCurve.P) return x3, y3, z3 } // Double returns 2*(x,y) func (BitCurve *BitCurve) Double(x1, y1 *big.Int) (*big.Int, *big.Int) { z1 := new(big.Int).SetInt64(1) return BitCurve.affineFromJacobian(BitCurve.doubleJacobian(x1, y1, z1)) } // doubleJacobian takes a point in Jacobian coordinates, (x, y, z), and // returns its double, also in Jacobian form. func (BitCurve *BitCurve) doubleJacobian(x, y, z *big.Int) (*big.Int, *big.Int, *big.Int) { // See http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l a := new(big.Int).Mul(x, x) //X1² b := new(big.Int).Mul(y, y) //Y1² c := new(big.Int).Mul(b, b) //B² d := new(big.Int).Add(x, b) //X1+B d.Mul(d, d) //(X1+B)² d.Sub(d, a) //(X1+B)²-A d.Sub(d, c) //(X1+B)²-A-C d.Mul(d, big.NewInt(2)) //2*((X1+B)²-A-C) e := new(big.Int).Mul(big.NewInt(3), a) //3*A f := new(big.Int).Mul(e, e) //E² x3 := new(big.Int).Mul(big.NewInt(2), d) //2*D x3.Sub(f, x3) //F-2*D x3.Mod(x3, BitCurve.P) y3 := new(big.Int).Sub(d, x3) //D-X3 y3.Mul(e, y3) //E*(D-X3) y3.Sub(y3, new(big.Int).Mul(big.NewInt(8), c)) //E*(D-X3)-8*C y3.Mod(y3, BitCurve.P) z3 := new(big.Int).Mul(y, z) //Y1*Z1 z3.Mul(big.NewInt(2), z3) //3*Y1*Z1 z3.Mod(z3, BitCurve.P) return x3, y3, z3 } func (BitCurve *BitCurve) ScalarMult(Bx, By *big.Int, scalar []byte) (*big.Int, *big.Int) { // Ensure scalar is exactly 32 bytes. We pad always, even if // scalar is 32 bytes long, to avoid a timing side channel. if len(scalar) > 32 { panic("can't handle scalars > 256 bits") } // NOTE: potential timing issue padded := make([]byte, 32) copy(padded[32-len(scalar):], scalar) scalar = padded // Do the multiplication in C, updating point. point := make([]byte, 64) readBits(Bx, point[:32]) readBits(By, point[32:]) pointPtr := (*C.uchar)(unsafe.Pointer(&point[0])) scalarPtr := (*C.uchar)(unsafe.Pointer(&scalar[0])) res := C.secp256k1_ext_scalar_mul(context, pointPtr, scalarPtr) // Unpack the result and clear temporaries. x := new(big.Int).SetBytes(point[:32]) y := new(big.Int).SetBytes(point[32:]) for i := range point { point[i] = 0 } for i := range padded { scalar[i] = 0 } if res != 1 { return nil, nil } return x, y } // ScalarBaseMult returns k*G, where G is the base point of the group and k is // an integer in big-endian form. func (BitCurve *BitCurve) ScalarBaseMult(k []byte) (*big.Int, *big.Int) { return BitCurve.ScalarMult(BitCurve.Gx, BitCurve.Gy, k) } // Marshal converts a point into the form specified in section 4.3.6 of ANSI // X9.62. func (BitCurve *BitCurve) Marshal(x, y *big.Int) []byte { byteLen := (BitCurve.BitSize + 7) >> 3 ret := make([]byte, 1+2*byteLen) ret[0] = 4 // uncompressed point flag readBits(x, ret[1:1+byteLen]) readBits(y, ret[1+byteLen:]) return ret } // Unmarshal converts a point, serialised by Marshal, into an x, y pair. On // error, x = nil. func (BitCurve *BitCurve) Unmarshal(data []byte) (x, y *big.Int) { byteLen := (BitCurve.BitSize + 7) >> 3 if len(data) != 1+2*byteLen { return } if data[0] != 4 { // uncompressed form return } x = new(big.Int).SetBytes(data[1 : 1+byteLen]) y = new(big.Int).SetBytes(data[1+byteLen:]) return } var theCurve = new(BitCurve) func init() { // See SEC 2 section 2.7.1 // curve parameters taken from: // http://www.secg.org/collateral/sec2_final.pdf theCurve.P, _ = new(big.Int).SetString("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", 0) theCurve.N, _ = new(big.Int).SetString("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", 0) theCurve.B, _ = new(big.Int).SetString("0x0000000000000000000000000000000000000000000000000000000000000007", 0) theCurve.Gx, _ = new(big.Int).SetString("0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", 0) theCurve.Gy, _ = new(big.Int).SetString("0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8", 0) theCurve.BitSize = 256 } // S256 returns a BitCurve which implements secp256k1. func S256() *BitCurve { return theCurve } ================================================ FILE: crypto/secp256k1/ext.h ================================================ // Copyright 2015 Jeffrey Wilcke, Felix Lange, Gustav Simonsson. All rights reserved. // Use of this source code is governed by a BSD-style license that can be found in // the LICENSE file. // secp256k1_context_create_sign_verify creates a context for signing and signature verification. static secp256k1_context* secp256k1_context_create_sign_verify() { return secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); } // secp256k1_ext_ecdsa_recover recovers the public key of an encoded compact signature. // // Returns: 1: recovery was successful // 0: recovery was not successful // Args: ctx: pointer to a context object (cannot be NULL) // Out: pubkey_out: the serialized 65-byte public key of the signer (cannot be NULL) // In: sigdata: pointer to a 65-byte signature with the recovery id at the end (cannot be NULL) // msgdata: pointer to a 32-byte message (cannot be NULL) static int secp256k1_ext_ecdsa_recover( const secp256k1_context* ctx, unsigned char *pubkey_out, const unsigned char *sigdata, const unsigned char *msgdata ) { secp256k1_ecdsa_recoverable_signature sig; secp256k1_pubkey pubkey; if (!secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &sig, sigdata, (int)sigdata[64])) { return 0; } if (!secp256k1_ecdsa_recover(ctx, &pubkey, &sig, msgdata)) { return 0; } size_t outputlen = 65; return secp256k1_ec_pubkey_serialize(ctx, pubkey_out, &outputlen, &pubkey, SECP256K1_EC_UNCOMPRESSED); } // secp256k1_ext_ecdsa_verify verifies an encoded compact signature. // // Returns: 1: signature is valid // 0: signature is invalid // Args: ctx: pointer to a context object (cannot be NULL) // In: sigdata: pointer to a 64-byte signature (cannot be NULL) // msgdata: pointer to a 32-byte message (cannot be NULL) // pubkeydata: pointer to public key data (cannot be NULL) // pubkeylen: length of pubkeydata static int secp256k1_ext_ecdsa_verify( const secp256k1_context* ctx, const unsigned char *sigdata, const unsigned char *msgdata, const unsigned char *pubkeydata, size_t pubkeylen ) { secp256k1_ecdsa_signature sig; secp256k1_pubkey pubkey; if (!secp256k1_ecdsa_signature_parse_compact(ctx, &sig, sigdata)) { return 0; } if (!secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeydata, pubkeylen)) { return 0; } return secp256k1_ecdsa_verify(ctx, &sig, msgdata, &pubkey); } // secp256k1_ext_reencode_pubkey decodes then encodes a public key. It can be used to // convert between public key formats. The input/output formats are chosen depending on the // length of the input/output buffers. // // Returns: 1: conversion successful // 0: conversion unsuccessful // Args: ctx: pointer to a context object (cannot be NULL) // Out: out: output buffer that will contain the reencoded key (cannot be NULL) // In: outlen: length of out (33 for compressed keys, 65 for uncompressed keys) // pubkeydata: the input public key (cannot be NULL) // pubkeylen: length of pubkeydata static int secp256k1_ext_reencode_pubkey( const secp256k1_context* ctx, unsigned char *out, size_t outlen, const unsigned char *pubkeydata, size_t pubkeylen ) { secp256k1_pubkey pubkey; if (!secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeydata, pubkeylen)) { return 0; } unsigned int flag = (outlen == 33) ? SECP256K1_EC_COMPRESSED : SECP256K1_EC_UNCOMPRESSED; return secp256k1_ec_pubkey_serialize(ctx, out, &outlen, &pubkey, flag); } // secp256k1_ext_scalar_mul multiplies a point by a scalar in constant time. // // Returns: 1: multiplication was successful // 0: scalar was invalid (zero or overflow) // Args: ctx: pointer to a context object (cannot be NULL) // Out: point: the multiplied point (usually secret) // In: point: pointer to a 64-byte public point, // encoded as two 256bit big-endian numbers. // scalar: a 32-byte scalar with which to multiply the point int secp256k1_ext_scalar_mul(const secp256k1_context* ctx, unsigned char *point, const unsigned char *scalar) { int ret = 0; int overflow = 0; secp256k1_fe feX, feY; secp256k1_gej res; secp256k1_ge ge; secp256k1_scalar s; ARG_CHECK(point != NULL); ARG_CHECK(scalar != NULL); (void)ctx; secp256k1_fe_set_b32(&feX, point); secp256k1_fe_set_b32(&feY, point+32); secp256k1_ge_set_xy(&ge, &feX, &feY); secp256k1_scalar_set_b32(&s, scalar, &overflow); if (overflow || secp256k1_scalar_is_zero(&s)) { ret = 0; } else { secp256k1_ecmult_const(&res, &ge, &s); secp256k1_ge_set_gej(&ge, &res); /* Note: can't use secp256k1_pubkey_save here because it is not constant time. */ secp256k1_fe_normalize(&ge.x); secp256k1_fe_normalize(&ge.y); secp256k1_fe_get_b32(point, &ge.x); secp256k1_fe_get_b32(point+32, &ge.y); ret = 1; } secp256k1_scalar_clear(&s); return ret; } ================================================ FILE: crypto/secp256k1/libsecp256k1/.gitignore ================================================ bench_inv bench_ecdh bench_sign bench_verify bench_schnorr_verify bench_recover bench_internal tests exhaustive_tests gen_context *.exe *.so *.a !.gitignore Makefile configure .libs/ Makefile.in aclocal.m4 autom4te.cache/ config.log config.status *.tar.gz *.la libtool .deps/ .dirstamp *.lo *.o *~ src/libsecp256k1-config.h src/libsecp256k1-config.h.in src/ecmult_static_context.h build-aux/config.guess build-aux/config.sub build-aux/depcomp build-aux/install-sh build-aux/ltmain.sh build-aux/m4/libtool.m4 build-aux/m4/lt~obsolete.m4 build-aux/m4/ltoptions.m4 build-aux/m4/ltsugar.m4 build-aux/m4/ltversion.m4 build-aux/missing build-aux/compile build-aux/test-driver src/stamp-h1 libsecp256k1.pc ================================================ FILE: crypto/secp256k1/libsecp256k1/.travis.yml ================================================ language: c sudo: false addons: apt: packages: libgmp-dev compiler: - clang - gcc cache: directories: - src/java/guava/ env: global: - FIELD=auto BIGNUM=auto SCALAR=auto ENDOMORPHISM=no STATICPRECOMPUTATION=yes ASM=no BUILD=check EXTRAFLAGS= HOST= ECDH=no RECOVERY=no EXPERIMENTAL=no - GUAVA_URL=https://search.maven.org/remotecontent?filepath=com/google/guava/guava/18.0/guava-18.0.jar GUAVA_JAR=src/java/guava/guava-18.0.jar matrix: - SCALAR=32bit RECOVERY=yes - SCALAR=32bit FIELD=32bit ECDH=yes EXPERIMENTAL=yes - SCALAR=64bit - FIELD=64bit RECOVERY=yes - FIELD=64bit ENDOMORPHISM=yes - FIELD=64bit ENDOMORPHISM=yes ECDH=yes EXPERIMENTAL=yes - FIELD=64bit ASM=x86_64 - FIELD=64bit ENDOMORPHISM=yes ASM=x86_64 - FIELD=32bit ENDOMORPHISM=yes - BIGNUM=no - BIGNUM=no ENDOMORPHISM=yes RECOVERY=yes EXPERIMENTAL=yes - BIGNUM=no STATICPRECOMPUTATION=no - BUILD=distcheck - EXTRAFLAGS=CPPFLAGS=-DDETERMINISTIC - EXTRAFLAGS=CFLAGS=-O0 - BUILD=check-java ECDH=yes EXPERIMENTAL=yes matrix: fast_finish: true include: - compiler: clang env: HOST=i686-linux-gnu ENDOMORPHISM=yes addons: apt: packages: - gcc-multilib - libgmp-dev:i386 - compiler: clang env: HOST=i686-linux-gnu addons: apt: packages: - gcc-multilib - compiler: gcc env: HOST=i686-linux-gnu ENDOMORPHISM=yes addons: apt: packages: - gcc-multilib - compiler: gcc env: HOST=i686-linux-gnu addons: apt: packages: - gcc-multilib - libgmp-dev:i386 before_install: mkdir -p `dirname $GUAVA_JAR` install: if [ ! -f $GUAVA_JAR ]; then wget $GUAVA_URL -O $GUAVA_JAR; fi before_script: ./autogen.sh script: - if [ -n "$HOST" ]; then export USE_HOST="--host=$HOST"; fi - if [ "x$HOST" = "xi686-linux-gnu" ]; then export CC="$CC -m32"; fi - ./configure --enable-experimental=$EXPERIMENTAL --enable-endomorphism=$ENDOMORPHISM --with-field=$FIELD --with-bignum=$BIGNUM --with-scalar=$SCALAR --enable-ecmult-static-precomputation=$STATICPRECOMPUTATION --enable-module-ecdh=$ECDH --enable-module-recovery=$RECOVERY $EXTRAFLAGS $USE_HOST && make -j2 $BUILD os: linux ================================================ FILE: crypto/secp256k1/libsecp256k1/COPYING ================================================ Copyright (c) 2013 Pieter Wuille Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: crypto/secp256k1/libsecp256k1/Makefile.am ================================================ ACLOCAL_AMFLAGS = -I build-aux/m4 lib_LTLIBRARIES = libsecp256k1.la if USE_JNI JNI_LIB = libsecp256k1_jni.la noinst_LTLIBRARIES = $(JNI_LIB) else JNI_LIB = endif include_HEADERS = include/secp256k1.h noinst_HEADERS = noinst_HEADERS += src/scalar.h noinst_HEADERS += src/scalar_4x64.h noinst_HEADERS += src/scalar_8x32.h noinst_HEADERS += src/scalar_low.h noinst_HEADERS += src/scalar_impl.h noinst_HEADERS += src/scalar_4x64_impl.h noinst_HEADERS += src/scalar_8x32_impl.h noinst_HEADERS += src/scalar_low_impl.h noinst_HEADERS += src/group.h noinst_HEADERS += src/group_impl.h noinst_HEADERS += src/num_gmp.h noinst_HEADERS += src/num_gmp_impl.h noinst_HEADERS += src/ecdsa.h noinst_HEADERS += src/ecdsa_impl.h noinst_HEADERS += src/eckey.h noinst_HEADERS += src/eckey_impl.h noinst_HEADERS += src/ecmult.h noinst_HEADERS += src/ecmult_impl.h noinst_HEADERS += src/ecmult_const.h noinst_HEADERS += src/ecmult_const_impl.h noinst_HEADERS += src/ecmult_gen.h noinst_HEADERS += src/ecmult_gen_impl.h noinst_HEADERS += src/num.h noinst_HEADERS += src/num_impl.h noinst_HEADERS += src/field_10x26.h noinst_HEADERS += src/field_10x26_impl.h noinst_HEADERS += src/field_5x52.h noinst_HEADERS += src/field_5x52_impl.h noinst_HEADERS += src/field_5x52_int128_impl.h noinst_HEADERS += src/field_5x52_asm_impl.h noinst_HEADERS += src/java/org_bitcoin_NativeSecp256k1.h noinst_HEADERS += src/java/org_bitcoin_Secp256k1Context.h noinst_HEADERS += src/util.h noinst_HEADERS += src/testrand.h noinst_HEADERS += src/testrand_impl.h noinst_HEADERS += src/hash.h noinst_HEADERS += src/hash_impl.h noinst_HEADERS += src/field.h noinst_HEADERS += src/field_impl.h noinst_HEADERS += src/bench.h noinst_HEADERS += contrib/lax_der_parsing.h noinst_HEADERS += contrib/lax_der_parsing.c noinst_HEADERS += contrib/lax_der_privatekey_parsing.h noinst_HEADERS += contrib/lax_der_privatekey_parsing.c if USE_EXTERNAL_ASM COMMON_LIB = libsecp256k1_common.la noinst_LTLIBRARIES = $(COMMON_LIB) else COMMON_LIB = endif pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libsecp256k1.pc if USE_EXTERNAL_ASM if USE_ASM_ARM libsecp256k1_common_la_SOURCES = src/asm/field_10x26_arm.s endif endif libsecp256k1_la_SOURCES = src/secp256k1.c libsecp256k1_la_CPPFLAGS = -DSECP256K1_BUILD -I$(top_srcdir)/include -I$(top_srcdir)/src $(SECP_INCLUDES) libsecp256k1_la_LIBADD = $(JNI_LIB) $(SECP_LIBS) $(COMMON_LIB) libsecp256k1_jni_la_SOURCES = src/java/org_bitcoin_NativeSecp256k1.c src/java/org_bitcoin_Secp256k1Context.c libsecp256k1_jni_la_CPPFLAGS = -DSECP256K1_BUILD $(JNI_INCLUDES) noinst_PROGRAMS = if USE_BENCHMARK noinst_PROGRAMS += bench_verify bench_sign bench_internal bench_verify_SOURCES = src/bench_verify.c bench_verify_LDADD = libsecp256k1.la $(SECP_LIBS) $(SECP_TEST_LIBS) $(COMMON_LIB) bench_sign_SOURCES = src/bench_sign.c bench_sign_LDADD = libsecp256k1.la $(SECP_LIBS) $(SECP_TEST_LIBS) $(COMMON_LIB) bench_internal_SOURCES = src/bench_internal.c bench_internal_LDADD = $(SECP_LIBS) $(COMMON_LIB) bench_internal_CPPFLAGS = -DSECP256K1_BUILD $(SECP_INCLUDES) endif TESTS = if USE_TESTS noinst_PROGRAMS += tests tests_SOURCES = src/tests.c tests_CPPFLAGS = -DSECP256K1_BUILD -I$(top_srcdir)/src -I$(top_srcdir)/include $(SECP_INCLUDES) $(SECP_TEST_INCLUDES) if !ENABLE_COVERAGE tests_CPPFLAGS += -DVERIFY endif tests_LDADD = $(SECP_LIBS) $(SECP_TEST_LIBS) $(COMMON_LIB) tests_LDFLAGS = -static TESTS += tests endif if USE_EXHAUSTIVE_TESTS noinst_PROGRAMS += exhaustive_tests exhaustive_tests_SOURCES = src/tests_exhaustive.c exhaustive_tests_CPPFLAGS = -DSECP256K1_BUILD -I$(top_srcdir)/src $(SECP_INCLUDES) if !ENABLE_COVERAGE exhaustive_tests_CPPFLAGS += -DVERIFY endif exhaustive_tests_LDADD = $(SECP_LIBS) exhaustive_tests_LDFLAGS = -static TESTS += exhaustive_tests endif JAVAROOT=src/java JAVAORG=org/bitcoin JAVA_GUAVA=$(srcdir)/$(JAVAROOT)/guava/guava-18.0.jar CLASSPATH_ENV=CLASSPATH=$(JAVA_GUAVA) JAVA_FILES= \ $(JAVAROOT)/$(JAVAORG)/NativeSecp256k1.java \ $(JAVAROOT)/$(JAVAORG)/NativeSecp256k1Test.java \ $(JAVAROOT)/$(JAVAORG)/NativeSecp256k1Util.java \ $(JAVAROOT)/$(JAVAORG)/Secp256k1Context.java if USE_JNI $(JAVA_GUAVA): @echo Guava is missing. Fetch it via: \ wget https://search.maven.org/remotecontent?filepath=com/google/guava/guava/18.0/guava-18.0.jar -O $(@) @false .stamp-java: $(JAVA_FILES) @echo Compiling $^ $(AM_V_at)$(CLASSPATH_ENV) javac $^ @touch $@ if USE_TESTS check-java: libsecp256k1.la $(JAVA_GUAVA) .stamp-java $(AM_V_at)java -Djava.library.path="./:./src:./src/.libs:.libs/" -cp "$(JAVA_GUAVA):$(JAVAROOT)" $(JAVAORG)/NativeSecp256k1Test endif endif if USE_ECMULT_STATIC_PRECOMPUTATION CPPFLAGS_FOR_BUILD +=-I$(top_srcdir) CFLAGS_FOR_BUILD += -Wall -Wextra -Wno-unused-function gen_context_OBJECTS = gen_context.o gen_context_BIN = gen_context$(BUILD_EXEEXT) gen_%.o: src/gen_%.c $(CC_FOR_BUILD) $(CPPFLAGS_FOR_BUILD) $(CFLAGS_FOR_BUILD) -c $< -o $@ $(gen_context_BIN): $(gen_context_OBJECTS) $(CC_FOR_BUILD) $^ -o $@ $(libsecp256k1_la_OBJECTS): src/ecmult_static_context.h $(tests_OBJECTS): src/ecmult_static_context.h $(bench_internal_OBJECTS): src/ecmult_static_context.h src/ecmult_static_context.h: $(gen_context_BIN) ./$(gen_context_BIN) CLEANFILES = $(gen_context_BIN) src/ecmult_static_context.h $(JAVAROOT)/$(JAVAORG)/*.class .stamp-java endif EXTRA_DIST = autogen.sh src/gen_context.c src/basic-config.h $(JAVA_FILES) if ENABLE_MODULE_ECDH include src/modules/ecdh/Makefile.am.include endif if ENABLE_MODULE_RECOVERY include src/modules/recovery/Makefile.am.include endif ================================================ FILE: crypto/secp256k1/libsecp256k1/README.md ================================================ libsecp256k1 ============ [![Build Status](https://travis-ci.org/bitcoin-core/secp256k1.svg?branch=master)](https://travis-ci.org/bitcoin-core/secp256k1) Optimized C library for EC operations on curve secp256k1. This library is a work in progress and is being used to research best practices. Use at your own risk. Features: * secp256k1 ECDSA signing/verification and key generation. * Adding/multiplying private/public keys. * Serialization/parsing of private keys, public keys, signatures. * Constant time, constant memory access signing and pubkey generation. * Derandomized DSA (via RFC6979 or with a caller provided function.) * Very efficient implementation. Implementation details ---------------------- * General * No runtime heap allocation. * Extensive testing infrastructure. * Structured to facilitate review and analysis. * Intended to be portable to any system with a C89 compiler and uint64_t support. * Expose only higher level interfaces to minimize the API surface and improve application security. ("Be difficult to use insecurely.") * Field operations * Optimized implementation of arithmetic modulo the curve's field size (2^256 - 0x1000003D1). * Using 5 52-bit limbs (including hand-optimized assembly for x86_64, by Diederik Huys). * Using 10 26-bit limbs. * Field inverses and square roots using a sliding window over blocks of 1s (by Peter Dettman). * Scalar operations * Optimized implementation without data-dependent branches of arithmetic modulo the curve's order. * Using 4 64-bit limbs (relying on __int128 support in the compiler). * Using 8 32-bit limbs. * Group operations * Point addition formula specifically simplified for the curve equation (y^2 = x^3 + 7). * Use addition between points in Jacobian and affine coordinates where possible. * Use a unified addition/doubling formula where necessary to avoid data-dependent branches. * Point/x comparison without a field inversion by comparison in the Jacobian coordinate space. * Point multiplication for verification (a*P + b*G). * Use wNAF notation for point multiplicands. * Use a much larger window for multiples of G, using precomputed multiples. * Use Shamir's trick to do the multiplication with the public key and the generator simultaneously. * Optionally (off by default) use secp256k1's efficiently-computable endomorphism to split the P multiplicand into 2 half-sized ones. * Point multiplication for signing * Use a precomputed table of multiples of powers of 16 multiplied with the generator, so general multiplication becomes a series of additions. * Access the table with branch-free conditional moves so memory access is uniform. * No data-dependent branches * The precomputed tables add and eventually subtract points for which no known scalar (private key) is known, preventing even an attacker with control over the private key used to control the data internally. Build steps ----------- libsecp256k1 is built using autotools: $ ./autogen.sh $ ./configure $ make $ ./tests $ sudo make install # optional ================================================ FILE: crypto/secp256k1/libsecp256k1/TODO ================================================ * Unit tests for fieldelem/groupelem, including ones intended to trigger fieldelem's boundary cases. * Complete constant-time operations for signing/keygen ================================================ FILE: crypto/secp256k1/libsecp256k1/autogen.sh ================================================ #!/bin/sh set -e autoreconf -if --warnings=all ================================================ FILE: crypto/secp256k1/libsecp256k1/build-aux/m4/ax_jni_include_dir.m4 ================================================ # =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_jni_include_dir.html # =========================================================================== # # SYNOPSIS # # AX_JNI_INCLUDE_DIR # # DESCRIPTION # # AX_JNI_INCLUDE_DIR finds include directories needed for compiling # programs using the JNI interface. # # JNI include directories are usually in the Java distribution. This is # deduced from the value of $JAVA_HOME, $JAVAC, or the path to "javac", in # that order. When this macro completes, a list of directories is left in # the variable JNI_INCLUDE_DIRS. # # Example usage follows: # # AX_JNI_INCLUDE_DIR # # for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS # do # CPPFLAGS="$CPPFLAGS -I$JNI_INCLUDE_DIR" # done # # If you want to force a specific compiler: # # - at the configure.in level, set JAVAC=yourcompiler before calling # AX_JNI_INCLUDE_DIR # # - at the configure level, setenv JAVAC # # Note: This macro can work with the autoconf M4 macros for Java programs. # This particular macro is not part of the original set of macros. # # LICENSE # # Copyright (c) 2008 Don Anderson # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 10 AU_ALIAS([AC_JNI_INCLUDE_DIR], [AX_JNI_INCLUDE_DIR]) AC_DEFUN([AX_JNI_INCLUDE_DIR],[ JNI_INCLUDE_DIRS="" if test "x$JAVA_HOME" != x; then _JTOPDIR="$JAVA_HOME" else if test "x$JAVAC" = x; then JAVAC=javac fi AC_PATH_PROG([_ACJNI_JAVAC], [$JAVAC], [no]) if test "x$_ACJNI_JAVAC" = xno; then AC_MSG_WARN([cannot find JDK; try setting \$JAVAC or \$JAVA_HOME]) fi _ACJNI_FOLLOW_SYMLINKS("$_ACJNI_JAVAC") _JTOPDIR=`echo "$_ACJNI_FOLLOWED" | sed -e 's://*:/:g' -e 's:/[[^/]]*$::'` fi case "$host_os" in darwin*) _JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[[^/]]*$::'` _JINC="$_JTOPDIR/Headers";; *) _JINC="$_JTOPDIR/include";; esac _AS_ECHO_LOG([_JTOPDIR=$_JTOPDIR]) _AS_ECHO_LOG([_JINC=$_JINC]) # On Mac OS X 10.6.4, jni.h is a symlink: # /System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/jni.h # -> ../../CurrentJDK/Headers/jni.h. AC_CACHE_CHECK(jni headers, ac_cv_jni_header_path, [ if test -f "$_JINC/jni.h"; then ac_cv_jni_header_path="$_JINC" JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $ac_cv_jni_header_path" else _JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[[^/]]*$::'` if test -f "$_JTOPDIR/include/jni.h"; then ac_cv_jni_header_path="$_JTOPDIR/include" JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $ac_cv_jni_header_path" else ac_cv_jni_header_path=none fi fi ]) # get the likely subdirectories for system specific java includes case "$host_os" in bsdi*) _JNI_INC_SUBDIRS="bsdos";; darwin*) _JNI_INC_SUBDIRS="darwin";; freebsd*) _JNI_INC_SUBDIRS="freebsd";; linux*) _JNI_INC_SUBDIRS="linux genunix";; osf*) _JNI_INC_SUBDIRS="alpha";; solaris*) _JNI_INC_SUBDIRS="solaris";; mingw*) _JNI_INC_SUBDIRS="win32";; cygwin*) _JNI_INC_SUBDIRS="win32";; *) _JNI_INC_SUBDIRS="genunix";; esac if test "x$ac_cv_jni_header_path" != "xnone"; then # add any subdirectories that are present for JINCSUBDIR in $_JNI_INC_SUBDIRS do if test -d "$_JTOPDIR/include/$JINCSUBDIR"; then JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $_JTOPDIR/include/$JINCSUBDIR" fi done fi ]) # _ACJNI_FOLLOW_SYMLINKS # Follows symbolic links on , # finally setting variable _ACJNI_FOLLOWED # ---------------------------------------- AC_DEFUN([_ACJNI_FOLLOW_SYMLINKS],[ # find the include directory relative to the javac executable _cur="$1" while ls -ld "$_cur" 2>/dev/null | grep " -> " >/dev/null; do AC_MSG_CHECKING([symlink for $_cur]) _slink=`ls -ld "$_cur" | sed 's/.* -> //'` case "$_slink" in /*) _cur="$_slink";; # 'X' avoids triggering unwanted echo options. *) _cur=`echo "X$_cur" | sed -e 's/^X//' -e 's:[[^/]]*$::'`"$_slink";; esac AC_MSG_RESULT([$_cur]) done _ACJNI_FOLLOWED="$_cur" ])# _ACJNI ================================================ FILE: crypto/secp256k1/libsecp256k1/build-aux/m4/ax_prog_cc_for_build.m4 ================================================ # =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_prog_cc_for_build.html # =========================================================================== # # SYNOPSIS # # AX_PROG_CC_FOR_BUILD # # DESCRIPTION # # This macro searches for a C compiler that generates native executables, # that is a C compiler that surely is not a cross-compiler. This can be # useful if you have to generate source code at compile-time like for # example GCC does. # # The macro sets the CC_FOR_BUILD and CPP_FOR_BUILD macros to anything # needed to compile or link (CC_FOR_BUILD) and preprocess (CPP_FOR_BUILD). # The value of these variables can be overridden by the user by specifying # a compiler with an environment variable (like you do for standard CC). # # It also sets BUILD_EXEEXT and BUILD_OBJEXT to the executable and object # file extensions for the build platform, and GCC_FOR_BUILD to `yes' if # the compiler we found is GCC. All these variables but GCC_FOR_BUILD are # substituted in the Makefile. # # LICENSE # # Copyright (c) 2008 Paolo Bonzini # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 8 AU_ALIAS([AC_PROG_CC_FOR_BUILD], [AX_PROG_CC_FOR_BUILD]) AC_DEFUN([AX_PROG_CC_FOR_BUILD], [dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_CPP])dnl AC_REQUIRE([AC_EXEEXT])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl dnl Use the standard macros, but make them use other variable names dnl pushdef([ac_cv_prog_CPP], ac_cv_build_prog_CPP)dnl pushdef([ac_cv_prog_gcc], ac_cv_build_prog_gcc)dnl pushdef([ac_cv_prog_cc_works], ac_cv_build_prog_cc_works)dnl pushdef([ac_cv_prog_cc_cross], ac_cv_build_prog_cc_cross)dnl pushdef([ac_cv_prog_cc_g], ac_cv_build_prog_cc_g)dnl pushdef([ac_cv_exeext], ac_cv_build_exeext)dnl pushdef([ac_cv_objext], ac_cv_build_objext)dnl pushdef([ac_exeext], ac_build_exeext)dnl pushdef([ac_objext], ac_build_objext)dnl pushdef([CC], CC_FOR_BUILD)dnl pushdef([CPP], CPP_FOR_BUILD)dnl pushdef([CFLAGS], CFLAGS_FOR_BUILD)dnl pushdef([CPPFLAGS], CPPFLAGS_FOR_BUILD)dnl pushdef([LDFLAGS], LDFLAGS_FOR_BUILD)dnl pushdef([host], build)dnl pushdef([host_alias], build_alias)dnl pushdef([host_cpu], build_cpu)dnl pushdef([host_vendor], build_vendor)dnl pushdef([host_os], build_os)dnl pushdef([ac_cv_host], ac_cv_build)dnl pushdef([ac_cv_host_alias], ac_cv_build_alias)dnl pushdef([ac_cv_host_cpu], ac_cv_build_cpu)dnl pushdef([ac_cv_host_vendor], ac_cv_build_vendor)dnl pushdef([ac_cv_host_os], ac_cv_build_os)dnl pushdef([ac_cpp], ac_build_cpp)dnl pushdef([ac_compile], ac_build_compile)dnl pushdef([ac_link], ac_build_link)dnl save_cross_compiling=$cross_compiling save_ac_tool_prefix=$ac_tool_prefix cross_compiling=no ac_tool_prefix= AC_PROG_CC AC_PROG_CPP AC_EXEEXT ac_tool_prefix=$save_ac_tool_prefix cross_compiling=$save_cross_compiling dnl Restore the old definitions dnl popdef([ac_link])dnl popdef([ac_compile])dnl popdef([ac_cpp])dnl popdef([ac_cv_host_os])dnl popdef([ac_cv_host_vendor])dnl popdef([ac_cv_host_cpu])dnl popdef([ac_cv_host_alias])dnl popdef([ac_cv_host])dnl popdef([host_os])dnl popdef([host_vendor])dnl popdef([host_cpu])dnl popdef([host_alias])dnl popdef([host])dnl popdef([LDFLAGS])dnl popdef([CPPFLAGS])dnl popdef([CFLAGS])dnl popdef([CPP])dnl popdef([CC])dnl popdef([ac_objext])dnl popdef([ac_exeext])dnl popdef([ac_cv_objext])dnl popdef([ac_cv_exeext])dnl popdef([ac_cv_prog_cc_g])dnl popdef([ac_cv_prog_cc_cross])dnl popdef([ac_cv_prog_cc_works])dnl popdef([ac_cv_prog_gcc])dnl popdef([ac_cv_prog_CPP])dnl dnl Finally, set Makefile variables dnl BUILD_EXEEXT=$ac_build_exeext BUILD_OBJEXT=$ac_build_objext AC_SUBST(BUILD_EXEEXT)dnl AC_SUBST(BUILD_OBJEXT)dnl AC_SUBST([CFLAGS_FOR_BUILD])dnl AC_SUBST([CPPFLAGS_FOR_BUILD])dnl AC_SUBST([LDFLAGS_FOR_BUILD])dnl ]) ================================================ FILE: crypto/secp256k1/libsecp256k1/build-aux/m4/bitcoin_secp.m4 ================================================ dnl libsecp25k1 helper checks AC_DEFUN([SECP_INT128_CHECK],[ has_int128=$ac_cv_type___int128 ]) dnl escape "$0x" below using the m4 quadrigaph @S|@, and escape it again with a \ for the shell. AC_DEFUN([SECP_64BIT_ASM_CHECK],[ AC_MSG_CHECKING(for x86_64 assembly availability) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include ]],[[ uint64_t a = 11, tmp; __asm__ __volatile__("movq \@S|@0x100000000,%1; mulq %%rsi" : "+a"(a) : "S"(tmp) : "cc", "%rdx"); ]])],[has_64bit_asm=yes],[has_64bit_asm=no]) AC_MSG_RESULT([$has_64bit_asm]) ]) dnl AC_DEFUN([SECP_OPENSSL_CHECK],[ has_libcrypto=no m4_ifdef([PKG_CHECK_MODULES],[ PKG_CHECK_MODULES([CRYPTO], [libcrypto], [has_libcrypto=yes],[has_libcrypto=no]) if test x"$has_libcrypto" = x"yes"; then TEMP_LIBS="$LIBS" LIBS="$LIBS $CRYPTO_LIBS" AC_CHECK_LIB(crypto, main,[AC_DEFINE(HAVE_LIBCRYPTO,1,[Define this symbol if libcrypto is installed])],[has_libcrypto=no]) LIBS="$TEMP_LIBS" fi ]) if test x$has_libcrypto = xno; then AC_CHECK_HEADER(openssl/crypto.h,[ AC_CHECK_LIB(crypto, main,[ has_libcrypto=yes CRYPTO_LIBS=-lcrypto AC_DEFINE(HAVE_LIBCRYPTO,1,[Define this symbol if libcrypto is installed]) ]) ]) LIBS= fi if test x"$has_libcrypto" = x"yes" && test x"$has_openssl_ec" = x; then AC_MSG_CHECKING(for EC functions in libcrypto) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include #include #include ]],[[ EC_KEY *eckey = EC_KEY_new_by_curve_name(NID_secp256k1); ECDSA_sign(0, NULL, 0, NULL, NULL, eckey); ECDSA_verify(0, NULL, 0, NULL, 0, eckey); EC_KEY_free(eckey); ECDSA_SIG *sig_openssl; sig_openssl = ECDSA_SIG_new(); (void)sig_openssl->r; ECDSA_SIG_free(sig_openssl); ]])],[has_openssl_ec=yes],[has_openssl_ec=no]) AC_MSG_RESULT([$has_openssl_ec]) fi ]) dnl AC_DEFUN([SECP_GMP_CHECK],[ if test x"$has_gmp" != x"yes"; then CPPFLAGS_TEMP="$CPPFLAGS" CPPFLAGS="$GMP_CPPFLAGS $CPPFLAGS" LIBS_TEMP="$LIBS" LIBS="$GMP_LIBS $LIBS" AC_CHECK_HEADER(gmp.h,[AC_CHECK_LIB(gmp, __gmpz_init,[has_gmp=yes; GMP_LIBS="$GMP_LIBS -lgmp"; AC_DEFINE(HAVE_LIBGMP,1,[Define this symbol if libgmp is installed])])]) CPPFLAGS="$CPPFLAGS_TEMP" LIBS="$LIBS_TEMP" fi ]) ================================================ FILE: crypto/secp256k1/libsecp256k1/configure.ac ================================================ AC_PREREQ([2.60]) AC_INIT([libsecp256k1],[0.1]) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_MACRO_DIR([build-aux/m4]) AC_CANONICAL_HOST AH_TOP([#ifndef LIBSECP256K1_CONFIG_H]) AH_TOP([#define LIBSECP256K1_CONFIG_H]) AH_BOTTOM([#endif /*LIBSECP256K1_CONFIG_H*/]) AM_INIT_AUTOMAKE([foreign subdir-objects]) LT_INIT dnl make the compilation flags quiet unless V=1 is used m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) PKG_PROG_PKG_CONFIG AC_PATH_TOOL(AR, ar) AC_PATH_TOOL(RANLIB, ranlib) AC_PATH_TOOL(STRIP, strip) AX_PROG_CC_FOR_BUILD if test "x$CFLAGS" = "x"; then CFLAGS="-g" fi AM_PROG_CC_C_O AC_PROG_CC_C89 if test x"$ac_cv_prog_cc_c89" = x"no"; then AC_MSG_ERROR([c89 compiler support required]) fi AM_PROG_AS case $host_os in *darwin*) if test x$cross_compiling != xyes; then AC_PATH_PROG([BREW],brew,) if test x$BREW != x; then dnl These Homebrew packages may be keg-only, meaning that they won't be found dnl in expected paths because they may conflict with system files. Ask dnl Homebrew where each one is located, then adjust paths accordingly. openssl_prefix=`$BREW --prefix openssl 2>/dev/null` gmp_prefix=`$BREW --prefix gmp 2>/dev/null` if test x$openssl_prefix != x; then PKG_CONFIG_PATH="$openssl_prefix/lib/pkgconfig:$PKG_CONFIG_PATH" export PKG_CONFIG_PATH fi if test x$gmp_prefix != x; then GMP_CPPFLAGS="-I$gmp_prefix/include" GMP_LIBS="-L$gmp_prefix/lib" fi else AC_PATH_PROG([PORT],port,) dnl if homebrew isn't installed and macports is, add the macports default paths dnl as a last resort. if test x$PORT != x; then CPPFLAGS="$CPPFLAGS -isystem /opt/local/include" LDFLAGS="$LDFLAGS -L/opt/local/lib" fi fi fi ;; esac CFLAGS="$CFLAGS -W" warn_CFLAGS="-std=c89 -pedantic -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes -Wno-unused-function -Wno-long-long -Wno-overlength-strings" saved_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $warn_CFLAGS" AC_MSG_CHECKING([if ${CC} supports ${warn_CFLAGS}]) AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])], [ AC_MSG_RESULT([yes]) ], [ AC_MSG_RESULT([no]) CFLAGS="$saved_CFLAGS" ]) saved_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -fvisibility=hidden" AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden]) AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])], [ AC_MSG_RESULT([yes]) ], [ AC_MSG_RESULT([no]) CFLAGS="$saved_CFLAGS" ]) AC_ARG_ENABLE(benchmark, AS_HELP_STRING([--enable-benchmark],[compile benchmark (default is no)]), [use_benchmark=$enableval], [use_benchmark=no]) AC_ARG_ENABLE(coverage, AS_HELP_STRING([--enable-coverage],[enable compiler flags to support kcov coverage analysis]), [enable_coverage=$enableval], [enable_coverage=no]) AC_ARG_ENABLE(tests, AS_HELP_STRING([--enable-tests],[compile tests (default is yes)]), [use_tests=$enableval], [use_tests=yes]) AC_ARG_ENABLE(openssl_tests, AS_HELP_STRING([--enable-openssl-tests],[enable OpenSSL tests, if OpenSSL is available (default is auto)]), [enable_openssl_tests=$enableval], [enable_openssl_tests=auto]) AC_ARG_ENABLE(experimental, AS_HELP_STRING([--enable-experimental],[allow experimental configure options (default is no)]), [use_experimental=$enableval], [use_experimental=no]) AC_ARG_ENABLE(exhaustive_tests, AS_HELP_STRING([--enable-exhaustive-tests],[compile exhaustive tests (default is yes)]), [use_exhaustive_tests=$enableval], [use_exhaustive_tests=yes]) AC_ARG_ENABLE(endomorphism, AS_HELP_STRING([--enable-endomorphism],[enable endomorphism (default is no)]), [use_endomorphism=$enableval], [use_endomorphism=no]) AC_ARG_ENABLE(ecmult_static_precomputation, AS_HELP_STRING([--enable-ecmult-static-precomputation],[enable precomputed ecmult table for signing (default is yes)]), [use_ecmult_static_precomputation=$enableval], [use_ecmult_static_precomputation=auto]) AC_ARG_ENABLE(module_ecdh, AS_HELP_STRING([--enable-module-ecdh],[enable ECDH shared secret computation (experimental)]), [enable_module_ecdh=$enableval], [enable_module_ecdh=no]) AC_ARG_ENABLE(module_recovery, AS_HELP_STRING([--enable-module-recovery],[enable ECDSA pubkey recovery module (default is no)]), [enable_module_recovery=$enableval], [enable_module_recovery=no]) AC_ARG_ENABLE(jni, AS_HELP_STRING([--enable-jni],[enable libsecp256k1_jni (default is auto)]), [use_jni=$enableval], [use_jni=auto]) AC_ARG_WITH([field], [AS_HELP_STRING([--with-field=64bit|32bit|auto], [Specify Field Implementation. Default is auto])],[req_field=$withval], [req_field=auto]) AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no|auto], [Specify Bignum Implementation. Default is auto])],[req_bignum=$withval], [req_bignum=auto]) AC_ARG_WITH([scalar], [AS_HELP_STRING([--with-scalar=64bit|32bit|auto], [Specify scalar implementation. Default is auto])],[req_scalar=$withval], [req_scalar=auto]) AC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|arm|no|auto] [Specify assembly optimizations to use. Default is auto (experimental: arm)])],[req_asm=$withval], [req_asm=auto]) AC_CHECK_TYPES([__int128]) AC_MSG_CHECKING([for __builtin_expect]) AC_COMPILE_IFELSE([AC_LANG_SOURCE([[void myfunc() {__builtin_expect(0,0);}]])], [ AC_MSG_RESULT([yes]);AC_DEFINE(HAVE_BUILTIN_EXPECT,1,[Define this symbol if __builtin_expect is available]) ], [ AC_MSG_RESULT([no]) ]) if test x"$enable_coverage" = x"yes"; then AC_DEFINE(COVERAGE, 1, [Define this symbol to compile out all VERIFY code]) CFLAGS="$CFLAGS -O0 --coverage" LDFLAGS="--coverage" else CFLAGS="$CFLAGS -O3" fi if test x"$use_ecmult_static_precomputation" != x"no"; then save_cross_compiling=$cross_compiling cross_compiling=no TEMP_CC="$CC" CC="$CC_FOR_BUILD" AC_MSG_CHECKING([native compiler: ${CC_FOR_BUILD}]) AC_RUN_IFELSE( [AC_LANG_PROGRAM([], [return 0])], [working_native_cc=yes], [working_native_cc=no],[dnl]) CC="$TEMP_CC" cross_compiling=$save_cross_compiling if test x"$working_native_cc" = x"no"; then set_precomp=no if test x"$use_ecmult_static_precomputation" = x"yes"; then AC_MSG_ERROR([${CC_FOR_BUILD} does not produce working binaries. Please set CC_FOR_BUILD]) else AC_MSG_RESULT([${CC_FOR_BUILD} does not produce working binaries. Please set CC_FOR_BUILD]) fi else AC_MSG_RESULT([ok]) set_precomp=yes fi else set_precomp=no fi if test x"$req_asm" = x"auto"; then SECP_64BIT_ASM_CHECK if test x"$has_64bit_asm" = x"yes"; then set_asm=x86_64 fi if test x"$set_asm" = x; then set_asm=no fi else set_asm=$req_asm case $set_asm in x86_64) SECP_64BIT_ASM_CHECK if test x"$has_64bit_asm" != x"yes"; then AC_MSG_ERROR([x86_64 assembly optimization requested but not available]) fi ;; arm) ;; no) ;; *) AC_MSG_ERROR([invalid assembly optimization selection]) ;; esac fi if test x"$req_field" = x"auto"; then if test x"set_asm" = x"x86_64"; then set_field=64bit fi if test x"$set_field" = x; then SECP_INT128_CHECK if test x"$has_int128" = x"yes"; then set_field=64bit fi fi if test x"$set_field" = x; then set_field=32bit fi else set_field=$req_field case $set_field in 64bit) if test x"$set_asm" != x"x86_64"; then SECP_INT128_CHECK if test x"$has_int128" != x"yes"; then AC_MSG_ERROR([64bit field explicitly requested but neither __int128 support or x86_64 assembly available]) fi fi ;; 32bit) ;; *) AC_MSG_ERROR([invalid field implementation selection]) ;; esac fi if test x"$req_scalar" = x"auto"; then SECP_INT128_CHECK if test x"$has_int128" = x"yes"; then set_scalar=64bit fi if test x"$set_scalar" = x; then set_scalar=32bit fi else set_scalar=$req_scalar case $set_scalar in 64bit) SECP_INT128_CHECK if test x"$has_int128" != x"yes"; then AC_MSG_ERROR([64bit scalar explicitly requested but __int128 support not available]) fi ;; 32bit) ;; *) AC_MSG_ERROR([invalid scalar implementation selected]) ;; esac fi if test x"$req_bignum" = x"auto"; then SECP_GMP_CHECK if test x"$has_gmp" = x"yes"; then set_bignum=gmp fi if test x"$set_bignum" = x; then set_bignum=no fi else set_bignum=$req_bignum case $set_bignum in gmp) SECP_GMP_CHECK if test x"$has_gmp" != x"yes"; then AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available]) fi ;; no) ;; *) AC_MSG_ERROR([invalid bignum implementation selection]) ;; esac fi # select assembly optimization use_external_asm=no case $set_asm in x86_64) AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations]) ;; arm) use_external_asm=yes ;; no) ;; *) AC_MSG_ERROR([invalid assembly optimizations]) ;; esac # select field implementation case $set_field in 64bit) AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation]) ;; 32bit) AC_DEFINE(USE_FIELD_10X26, 1, [Define this symbol to use the FIELD_10X26 implementation]) ;; *) AC_MSG_ERROR([invalid field implementation]) ;; esac # select bignum implementation case $set_bignum in gmp) AC_DEFINE(HAVE_LIBGMP, 1, [Define this symbol if libgmp is installed]) AC_DEFINE(USE_NUM_GMP, 1, [Define this symbol to use the gmp implementation for num]) AC_DEFINE(USE_FIELD_INV_NUM, 1, [Define this symbol to use the num-based field inverse implementation]) AC_DEFINE(USE_SCALAR_INV_NUM, 1, [Define this symbol to use the num-based scalar inverse implementation]) ;; no) AC_DEFINE(USE_NUM_NONE, 1, [Define this symbol to use no num implementation]) AC_DEFINE(USE_FIELD_INV_BUILTIN, 1, [Define this symbol to use the native field inverse implementation]) AC_DEFINE(USE_SCALAR_INV_BUILTIN, 1, [Define this symbol to use the native scalar inverse implementation]) ;; *) AC_MSG_ERROR([invalid bignum implementation]) ;; esac #select scalar implementation case $set_scalar in 64bit) AC_DEFINE(USE_SCALAR_4X64, 1, [Define this symbol to use the 4x64 scalar implementation]) ;; 32bit) AC_DEFINE(USE_SCALAR_8X32, 1, [Define this symbol to use the 8x32 scalar implementation]) ;; *) AC_MSG_ERROR([invalid scalar implementation]) ;; esac if test x"$use_tests" = x"yes"; then SECP_OPENSSL_CHECK if test x"$has_openssl_ec" = x"yes"; then if test x"$enable_openssl_tests" != x"no"; then AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available]) SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS" SECP_TEST_LIBS="$CRYPTO_LIBS" case $host in *mingw*) SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32" ;; esac fi else if test x"$enable_openssl_tests" = x"yes"; then AC_MSG_ERROR([OpenSSL tests requested but OpenSSL with EC support is not available]) fi fi else if test x"$enable_openssl_tests" = x"yes"; then AC_MSG_ERROR([OpenSSL tests requested but tests are not enabled]) fi fi if test x"$use_jni" != x"no"; then AX_JNI_INCLUDE_DIR have_jni_dependencies=yes if test x"$enable_module_ecdh" = x"no"; then have_jni_dependencies=no fi if test "x$JNI_INCLUDE_DIRS" = "x"; then have_jni_dependencies=no fi if test "x$have_jni_dependencies" = "xno"; then if test x"$use_jni" = x"yes"; then AC_MSG_ERROR([jni support explicitly requested but headers/dependencies were not found. Enable ECDH and try again.]) fi AC_MSG_WARN([jni headers/dependencies not found. jni support disabled]) use_jni=no else use_jni=yes for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS; do JNI_INCLUDES="$JNI_INCLUDES -I$JNI_INCLUDE_DIR" done fi fi if test x"$set_bignum" = x"gmp"; then SECP_LIBS="$SECP_LIBS $GMP_LIBS" SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS" fi if test x"$use_endomorphism" = x"yes"; then AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization]) fi if test x"$set_precomp" = x"yes"; then AC_DEFINE(USE_ECMULT_STATIC_PRECOMPUTATION, 1, [Define this symbol to use a statically generated ecmult table]) fi if test x"$enable_module_ecdh" = x"yes"; then AC_DEFINE(ENABLE_MODULE_ECDH, 1, [Define this symbol to enable the ECDH module]) fi if test x"$enable_module_recovery" = x"yes"; then AC_DEFINE(ENABLE_MODULE_RECOVERY, 1, [Define this symbol to enable the ECDSA pubkey recovery module]) fi AC_C_BIGENDIAN() if test x"$use_external_asm" = x"yes"; then AC_DEFINE(USE_EXTERNAL_ASM, 1, [Define this symbol if an external (non-inline) assembly implementation is used]) fi AC_MSG_NOTICE([Using static precomputation: $set_precomp]) AC_MSG_NOTICE([Using assembly optimizations: $set_asm]) AC_MSG_NOTICE([Using field implementation: $set_field]) AC_MSG_NOTICE([Using bignum implementation: $set_bignum]) AC_MSG_NOTICE([Using scalar implementation: $set_scalar]) AC_MSG_NOTICE([Using endomorphism optimizations: $use_endomorphism]) AC_MSG_NOTICE([Building for coverage analysis: $enable_coverage]) AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh]) AC_MSG_NOTICE([Building ECDSA pubkey recovery module: $enable_module_recovery]) AC_MSG_NOTICE([Using jni: $use_jni]) if test x"$enable_experimental" = x"yes"; then AC_MSG_NOTICE([******]) AC_MSG_NOTICE([WARNING: experimental build]) AC_MSG_NOTICE([Experimental features do not have stable APIs or properties, and may not be safe for production use.]) AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh]) AC_MSG_NOTICE([******]) else if test x"$enable_module_ecdh" = x"yes"; then AC_MSG_ERROR([ECDH module is experimental. Use --enable-experimental to allow.]) fi if test x"$set_asm" = x"arm"; then AC_MSG_ERROR([ARM assembly optimization is experimental. Use --enable-experimental to allow.]) fi fi AC_CONFIG_HEADERS([src/libsecp256k1-config.h]) AC_CONFIG_FILES([Makefile libsecp256k1.pc]) AC_SUBST(JNI_INCLUDES) AC_SUBST(SECP_INCLUDES) AC_SUBST(SECP_LIBS) AC_SUBST(SECP_TEST_LIBS) AC_SUBST(SECP_TEST_INCLUDES) AM_CONDITIONAL([ENABLE_COVERAGE], [test x"$enable_coverage" = x"yes"]) AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"]) AM_CONDITIONAL([USE_EXHAUSTIVE_TESTS], [test x"$use_exhaustive_tests" != x"no"]) AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" = x"yes"]) AM_CONDITIONAL([USE_ECMULT_STATIC_PRECOMPUTATION], [test x"$set_precomp" = x"yes"]) AM_CONDITIONAL([ENABLE_MODULE_ECDH], [test x"$enable_module_ecdh" = x"yes"]) AM_CONDITIONAL([ENABLE_MODULE_RECOVERY], [test x"$enable_module_recovery" = x"yes"]) AM_CONDITIONAL([USE_JNI], [test x"$use_jni" == x"yes"]) AM_CONDITIONAL([USE_EXTERNAL_ASM], [test x"$use_external_asm" = x"yes"]) AM_CONDITIONAL([USE_ASM_ARM], [test x"$set_asm" = x"arm"]) dnl make sure nothing new is exported so that we don't break the cache PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH" unset PKG_CONFIG_PATH PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP" AC_OUTPUT ================================================ FILE: crypto/secp256k1/libsecp256k1/contrib/lax_der_parsing.c ================================================ /********************************************************************** * Copyright (c) 2015 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #include #include #include "lax_der_parsing.h" int ecdsa_signature_parse_der_lax(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const unsigned char *input, size_t inputlen) { size_t rpos, rlen, spos, slen; size_t pos = 0; size_t lenbyte; unsigned char tmpsig[64] = {0}; int overflow = 0; /* Hack to initialize sig with a correctly-parsed but invalid signature. */ secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig); /* Sequence tag byte */ if (pos == inputlen || input[pos] != 0x30) { return 0; } pos++; /* Sequence length bytes */ if (pos == inputlen) { return 0; } lenbyte = input[pos++]; if (lenbyte & 0x80) { lenbyte -= 0x80; if (pos + lenbyte > inputlen) { return 0; } pos += lenbyte; } /* Integer tag byte for R */ if (pos == inputlen || input[pos] != 0x02) { return 0; } pos++; /* Integer length for R */ if (pos == inputlen) { return 0; } lenbyte = input[pos++]; if (lenbyte & 0x80) { lenbyte -= 0x80; if (pos + lenbyte > inputlen) { return 0; } while (lenbyte > 0 && input[pos] == 0) { pos++; lenbyte--; } if (lenbyte >= sizeof(size_t)) { return 0; } rlen = 0; while (lenbyte > 0) { rlen = (rlen << 8) + input[pos]; pos++; lenbyte--; } } else { rlen = lenbyte; } if (rlen > inputlen - pos) { return 0; } rpos = pos; pos += rlen; /* Integer tag byte for S */ if (pos == inputlen || input[pos] != 0x02) { return 0; } pos++; /* Integer length for S */ if (pos == inputlen) { return 0; } lenbyte = input[pos++]; if (lenbyte & 0x80) { lenbyte -= 0x80; if (pos + lenbyte > inputlen) { return 0; } while (lenbyte > 0 && input[pos] == 0) { pos++; lenbyte--; } if (lenbyte >= sizeof(size_t)) { return 0; } slen = 0; while (lenbyte > 0) { slen = (slen << 8) + input[pos]; pos++; lenbyte--; } } else { slen = lenbyte; } if (slen > inputlen - pos) { return 0; } spos = pos; pos += slen; /* Ignore leading zeroes in R */ while (rlen > 0 && input[rpos] == 0) { rlen--; rpos++; } /* Copy R value */ if (rlen > 32) { overflow = 1; } else { memcpy(tmpsig + 32 - rlen, input + rpos, rlen); } /* Ignore leading zeroes in S */ while (slen > 0 && input[spos] == 0) { slen--; spos++; } /* Copy S value */ if (slen > 32) { overflow = 1; } else { memcpy(tmpsig + 64 - slen, input + spos, slen); } if (!overflow) { overflow = !secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig); } if (overflow) { memset(tmpsig, 0, 64); secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig); } return 1; } ================================================ FILE: crypto/secp256k1/libsecp256k1/contrib/lax_der_parsing.h ================================================ /********************************************************************** * Copyright (c) 2015 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ /**** * Please do not link this file directly. It is not part of the libsecp256k1 * project and does not promise any stability in its API, functionality or * presence. Projects which use this code should instead copy this header * and its accompanying .c file directly into their codebase. ****/ /* This file defines a function that parses DER with various errors and * violations. This is not a part of the library itself, because the allowed * violations are chosen arbitrarily and do not follow or establish any * standard. * * In many places it matters that different implementations do not only accept * the same set of valid signatures, but also reject the same set of signatures. * The only means to accomplish that is by strictly obeying a standard, and not * accepting anything else. * * Nonetheless, sometimes there is a need for compatibility with systems that * use signatures which do not strictly obey DER. The snippet below shows how * certain violations are easily supported. You may need to adapt it. * * Do not use this for new systems. Use well-defined DER or compact signatures * instead if you have the choice (see secp256k1_ecdsa_signature_parse_der and * secp256k1_ecdsa_signature_parse_compact). * * The supported violations are: * - All numbers are parsed as nonnegative integers, even though X.609-0207 * section 8.3.3 specifies that integers are always encoded as two's * complement. * - Integers can have length 0, even though section 8.3.1 says they can't. * - Integers with overly long padding are accepted, violation section * 8.3.2. * - 127-byte long length descriptors are accepted, even though section * 8.1.3.5.c says that they are not. * - Trailing garbage data inside or after the signature is ignored. * - The length descriptor of the sequence is ignored. * * Compared to for example OpenSSL, many violations are NOT supported: * - Using overly long tag descriptors for the sequence or integers inside, * violating section 8.1.2.2. * - Encoding primitive integers as constructed values, violating section * 8.3.1. */ #ifndef _SECP256K1_CONTRIB_LAX_DER_PARSING_H_ #define _SECP256K1_CONTRIB_LAX_DER_PARSING_H_ #include # ifdef __cplusplus extern "C" { # endif /** Parse a signature in "lax DER" format * * Returns: 1 when the signature could be parsed, 0 otherwise. * Args: ctx: a secp256k1 context object * Out: sig: a pointer to a signature object * In: input: a pointer to the signature to be parsed * inputlen: the length of the array pointed to be input * * This function will accept any valid DER encoded signature, even if the * encoded numbers are out of range. In addition, it will accept signatures * which violate the DER spec in various ways. Its purpose is to allow * validation of the Bitcoin blockchain, which includes non-DER signatures * from before the network rules were updated to enforce DER. Note that * the set of supported violations is a strict subset of what OpenSSL will * accept. * * After the call, sig will always be initialized. If parsing failed or the * encoded numbers are out of range, signature validation with it is * guaranteed to fail for every message and public key. */ int ecdsa_signature_parse_der_lax( const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const unsigned char *input, size_t inputlen ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); #ifdef __cplusplus } #endif #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/contrib/lax_der_privatekey_parsing.c ================================================ /********************************************************************** * Copyright (c) 2014, 2015 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #include #include #include "lax_der_privatekey_parsing.h" int ec_privkey_import_der(const secp256k1_context* ctx, unsigned char *out32, const unsigned char *privkey, size_t privkeylen) { const unsigned char *end = privkey + privkeylen; int lenb = 0; int len = 0; memset(out32, 0, 32); /* sequence header */ if (end < privkey+1 || *privkey != 0x30) { return 0; } privkey++; /* sequence length constructor */ if (end < privkey+1 || !(*privkey & 0x80)) { return 0; } lenb = *privkey & ~0x80; privkey++; if (lenb < 1 || lenb > 2) { return 0; } if (end < privkey+lenb) { return 0; } /* sequence length */ len = privkey[lenb-1] | (lenb > 1 ? privkey[lenb-2] << 8 : 0); privkey += lenb; if (end < privkey+len) { return 0; } /* sequence element 0: version number (=1) */ if (end < privkey+3 || privkey[0] != 0x02 || privkey[1] != 0x01 || privkey[2] != 0x01) { return 0; } privkey += 3; /* sequence element 1: octet string, up to 32 bytes */ if (end < privkey+2 || privkey[0] != 0x04 || privkey[1] > 0x20 || end < privkey+2+privkey[1]) { return 0; } memcpy(out32 + 32 - privkey[1], privkey + 2, privkey[1]); if (!secp256k1_ec_seckey_verify(ctx, out32)) { memset(out32, 0, 32); return 0; } return 1; } int ec_privkey_export_der(const secp256k1_context *ctx, unsigned char *privkey, size_t *privkeylen, const unsigned char *key32, int compressed) { secp256k1_pubkey pubkey; size_t pubkeylen = 0; if (!secp256k1_ec_pubkey_create(ctx, &pubkey, key32)) { *privkeylen = 0; return 0; } if (compressed) { static const unsigned char begin[] = { 0x30,0x81,0xD3,0x02,0x01,0x01,0x04,0x20 }; static const unsigned char middle[] = { 0xA0,0x81,0x85,0x30,0x81,0x82,0x02,0x01,0x01,0x30,0x2C,0x06,0x07,0x2A,0x86,0x48, 0xCE,0x3D,0x01,0x01,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F,0x30,0x06,0x04,0x01,0x00,0x04,0x01,0x07,0x04, 0x21,0x02,0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC,0x55,0xA0,0x62,0x95,0xCE,0x87, 0x0B,0x07,0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9,0x59,0xF2,0x81,0x5B,0x16,0xF8, 0x17,0x98,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFE,0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,0xBF,0xD2,0x5E, 0x8C,0xD0,0x36,0x41,0x41,0x02,0x01,0x01,0xA1,0x24,0x03,0x22,0x00 }; unsigned char *ptr = privkey; memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin); memcpy(ptr, key32, 32); ptr += 32; memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle); pubkeylen = 33; secp256k1_ec_pubkey_serialize(ctx, ptr, &pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED); ptr += pubkeylen; *privkeylen = ptr - privkey; } else { static const unsigned char begin[] = { 0x30,0x82,0x01,0x13,0x02,0x01,0x01,0x04,0x20 }; static const unsigned char middle[] = { 0xA0,0x81,0xA5,0x30,0x81,0xA2,0x02,0x01,0x01,0x30,0x2C,0x06,0x07,0x2A,0x86,0x48, 0xCE,0x3D,0x01,0x01,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F,0x30,0x06,0x04,0x01,0x00,0x04,0x01,0x07,0x04, 0x41,0x04,0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC,0x55,0xA0,0x62,0x95,0xCE,0x87, 0x0B,0x07,0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9,0x59,0xF2,0x81,0x5B,0x16,0xF8, 0x17,0x98,0x48,0x3A,0xDA,0x77,0x26,0xA3,0xC4,0x65,0x5D,0xA4,0xFB,0xFC,0x0E,0x11, 0x08,0xA8,0xFD,0x17,0xB4,0x48,0xA6,0x85,0x54,0x19,0x9C,0x47,0xD0,0x8F,0xFB,0x10, 0xD4,0xB8,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFE,0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,0xBF,0xD2,0x5E, 0x8C,0xD0,0x36,0x41,0x41,0x02,0x01,0x01,0xA1,0x44,0x03,0x42,0x00 }; unsigned char *ptr = privkey; memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin); memcpy(ptr, key32, 32); ptr += 32; memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle); pubkeylen = 65; secp256k1_ec_pubkey_serialize(ctx, ptr, &pubkeylen, &pubkey, SECP256K1_EC_UNCOMPRESSED); ptr += pubkeylen; *privkeylen = ptr - privkey; } return 1; } ================================================ FILE: crypto/secp256k1/libsecp256k1/contrib/lax_der_privatekey_parsing.h ================================================ /********************************************************************** * Copyright (c) 2014, 2015 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ /**** * Please do not link this file directly. It is not part of the libsecp256k1 * project and does not promise any stability in its API, functionality or * presence. Projects which use this code should instead copy this header * and its accompanying .c file directly into their codebase. ****/ /* This file contains code snippets that parse DER private keys with * various errors and violations. This is not a part of the library * itself, because the allowed violations are chosen arbitrarily and * do not follow or establish any standard. * * It also contains code to serialize private keys in a compatible * manner. * * These functions are meant for compatibility with applications * that require BER encoded keys. When working with secp256k1-specific * code, the simple 32-byte private keys normally used by the * library are sufficient. */ #ifndef _SECP256K1_CONTRIB_BER_PRIVATEKEY_H_ #define _SECP256K1_CONTRIB_BER_PRIVATEKEY_H_ #include # ifdef __cplusplus extern "C" { # endif /** Export a private key in DER format. * * Returns: 1 if the private key was valid. * Args: ctx: pointer to a context object, initialized for signing (cannot * be NULL) * Out: privkey: pointer to an array for storing the private key in BER. * Should have space for 279 bytes, and cannot be NULL. * privkeylen: Pointer to an int where the length of the private key in * privkey will be stored. * In: seckey: pointer to a 32-byte secret key to export. * compressed: 1 if the key should be exported in * compressed format, 0 otherwise * * This function is purely meant for compatibility with applications that * require BER encoded keys. When working with secp256k1-specific code, the * simple 32-byte private keys are sufficient. * * Note that this function does not guarantee correct DER output. It is * guaranteed to be parsable by secp256k1_ec_privkey_import_der */ SECP256K1_WARN_UNUSED_RESULT int ec_privkey_export_der( const secp256k1_context* ctx, unsigned char *privkey, size_t *privkeylen, const unsigned char *seckey, int compressed ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); /** Import a private key in DER format. * Returns: 1 if a private key was extracted. * Args: ctx: pointer to a context object (cannot be NULL). * Out: seckey: pointer to a 32-byte array for storing the private key. * (cannot be NULL). * In: privkey: pointer to a private key in DER format (cannot be NULL). * privkeylen: length of the DER private key pointed to be privkey. * * This function will accept more than just strict DER, and even allow some BER * violations. The public key stored inside the DER-encoded private key is not * verified for correctness, nor are the curve parameters. Use this function * only if you know in advance it is supposed to contain a secp256k1 private * key. */ SECP256K1_WARN_UNUSED_RESULT int ec_privkey_import_der( const secp256k1_context* ctx, unsigned char *seckey, const unsigned char *privkey, size_t privkeylen ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); #ifdef __cplusplus } #endif #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/include/secp256k1.h ================================================ #ifndef _SECP256K1_ # define _SECP256K1_ # ifdef __cplusplus extern "C" { # endif #include /* These rules specify the order of arguments in API calls: * * 1. Context pointers go first, followed by output arguments, combined * output/input arguments, and finally input-only arguments. * 2. Array lengths always immediately the follow the argument whose length * they describe, even if this violates rule 1. * 3. Within the OUT/OUTIN/IN groups, pointers to data that is typically generated * later go first. This means: signatures, public nonces, private nonces, * messages, public keys, secret keys, tweaks. * 4. Arguments that are not data pointers go last, from more complex to less * complex: function pointers, algorithm names, messages, void pointers, * counts, flags, booleans. * 5. Opaque data pointers follow the function pointer they are to be passed to. */ /** Opaque data structure that holds context information (precomputed tables etc.). * * The purpose of context structures is to cache large precomputed data tables * that are expensive to construct, and also to maintain the randomization data * for blinding. * * Do not create a new context object for each operation, as construction is * far slower than all other API calls (~100 times slower than an ECDSA * verification). * * A constructed context can safely be used from multiple threads * simultaneously, but API call that take a non-const pointer to a context * need exclusive access to it. In particular this is the case for * secp256k1_context_destroy and secp256k1_context_randomize. * * Regarding randomization, either do it once at creation time (in which case * you do not need any locking for the other calls), or use a read-write lock. */ typedef struct secp256k1_context_struct secp256k1_context; /** Opaque data structure that holds a parsed and valid public key. * * The exact representation of data inside is implementation defined and not * guaranteed to be portable between different platforms or versions. It is * however guaranteed to be 64 bytes in size, and can be safely copied/moved. * If you need to convert to a format suitable for storage, transmission, or * comparison, use secp256k1_ec_pubkey_serialize and secp256k1_ec_pubkey_parse. */ typedef struct { unsigned char data[64]; } secp256k1_pubkey; /** Opaque data structured that holds a parsed ECDSA signature. * * The exact representation of data inside is implementation defined and not * guaranteed to be portable between different platforms or versions. It is * however guaranteed to be 64 bytes in size, and can be safely copied/moved. * If you need to convert to a format suitable for storage, transmission, or * comparison, use the secp256k1_ecdsa_signature_serialize_* and * secp256k1_ecdsa_signature_serialize_* functions. */ typedef struct { unsigned char data[64]; } secp256k1_ecdsa_signature; /** A pointer to a function to deterministically generate a nonce. * * Returns: 1 if a nonce was successfully generated. 0 will cause signing to fail. * Out: nonce32: pointer to a 32-byte array to be filled by the function. * In: msg32: the 32-byte message hash being verified (will not be NULL) * key32: pointer to a 32-byte secret key (will not be NULL) * algo16: pointer to a 16-byte array describing the signature * algorithm (will be NULL for ECDSA for compatibility). * data: Arbitrary data pointer that is passed through. * attempt: how many iterations we have tried to find a nonce. * This will almost always be 0, but different attempt values * are required to result in a different nonce. * * Except for test cases, this function should compute some cryptographic hash of * the message, the algorithm, the key and the attempt. */ typedef int (*secp256k1_nonce_function)( unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int attempt ); # if !defined(SECP256K1_GNUC_PREREQ) # if defined(__GNUC__)&&defined(__GNUC_MINOR__) # define SECP256K1_GNUC_PREREQ(_maj,_min) \ ((__GNUC__<<16)+__GNUC_MINOR__>=((_maj)<<16)+(_min)) # else # define SECP256K1_GNUC_PREREQ(_maj,_min) 0 # endif # endif # if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) ) # if SECP256K1_GNUC_PREREQ(2,7) # define SECP256K1_INLINE __inline__ # elif (defined(_MSC_VER)) # define SECP256K1_INLINE __inline # else # define SECP256K1_INLINE # endif # else # define SECP256K1_INLINE inline # endif #ifndef SECP256K1_API # if defined(_WIN32) # ifdef SECP256K1_BUILD # define SECP256K1_API __declspec(dllexport) # else # define SECP256K1_API # endif # elif defined(__GNUC__) && defined(SECP256K1_BUILD) # define SECP256K1_API __attribute__ ((visibility ("default"))) # else # define SECP256K1_API # endif #endif /**Warning attributes * NONNULL is not used if SECP256K1_BUILD is set to avoid the compiler optimizing out * some paranoid null checks. */ # if defined(__GNUC__) && SECP256K1_GNUC_PREREQ(3, 4) # define SECP256K1_WARN_UNUSED_RESULT __attribute__ ((__warn_unused_result__)) # else # define SECP256K1_WARN_UNUSED_RESULT # endif # if !defined(SECP256K1_BUILD) && defined(__GNUC__) && SECP256K1_GNUC_PREREQ(3, 4) # define SECP256K1_ARG_NONNULL(_x) __attribute__ ((__nonnull__(_x))) # else # define SECP256K1_ARG_NONNULL(_x) # endif /** All flags' lower 8 bits indicate what they're for. Do not use directly. */ #define SECP256K1_FLAGS_TYPE_MASK ((1 << 8) - 1) #define SECP256K1_FLAGS_TYPE_CONTEXT (1 << 0) #define SECP256K1_FLAGS_TYPE_COMPRESSION (1 << 1) /** The higher bits contain the actual data. Do not use directly. */ #define SECP256K1_FLAGS_BIT_CONTEXT_VERIFY (1 << 8) #define SECP256K1_FLAGS_BIT_CONTEXT_SIGN (1 << 9) #define SECP256K1_FLAGS_BIT_COMPRESSION (1 << 8) /** Flags to pass to secp256k1_context_create. */ #define SECP256K1_CONTEXT_VERIFY (SECP256K1_FLAGS_TYPE_CONTEXT | SECP256K1_FLAGS_BIT_CONTEXT_VERIFY) #define SECP256K1_CONTEXT_SIGN (SECP256K1_FLAGS_TYPE_CONTEXT | SECP256K1_FLAGS_BIT_CONTEXT_SIGN) #define SECP256K1_CONTEXT_NONE (SECP256K1_FLAGS_TYPE_CONTEXT) /** Flag to pass to secp256k1_ec_pubkey_serialize and secp256k1_ec_privkey_export. */ #define SECP256K1_EC_COMPRESSED (SECP256K1_FLAGS_TYPE_COMPRESSION | SECP256K1_FLAGS_BIT_COMPRESSION) #define SECP256K1_EC_UNCOMPRESSED (SECP256K1_FLAGS_TYPE_COMPRESSION) /** Create a secp256k1 context object. * * Returns: a newly created context object. * In: flags: which parts of the context to initialize. */ SECP256K1_API secp256k1_context* secp256k1_context_create( unsigned int flags ) SECP256K1_WARN_UNUSED_RESULT; /** Copies a secp256k1 context object. * * Returns: a newly created context object. * Args: ctx: an existing context to copy (cannot be NULL) */ SECP256K1_API secp256k1_context* secp256k1_context_clone( const secp256k1_context* ctx ) SECP256K1_ARG_NONNULL(1) SECP256K1_WARN_UNUSED_RESULT; /** Destroy a secp256k1 context object. * * The context pointer may not be used afterwards. * Args: ctx: an existing context to destroy (cannot be NULL) */ SECP256K1_API void secp256k1_context_destroy( secp256k1_context* ctx ); /** Set a callback function to be called when an illegal argument is passed to * an API call. It will only trigger for violations that are mentioned * explicitly in the header. * * The philosophy is that these shouldn't be dealt with through a * specific return value, as calling code should not have branches to deal with * the case that this code itself is broken. * * On the other hand, during debug stage, one would want to be informed about * such mistakes, and the default (crashing) may be inadvisable. * When this callback is triggered, the API function called is guaranteed not * to cause a crash, though its return value and output arguments are * undefined. * * Args: ctx: an existing context object (cannot be NULL) * In: fun: a pointer to a function to call when an illegal argument is * passed to the API, taking a message and an opaque pointer * (NULL restores a default handler that calls abort). * data: the opaque pointer to pass to fun above. */ SECP256K1_API void secp256k1_context_set_illegal_callback( secp256k1_context* ctx, void (*fun)(const char* message, void* data), const void* data ) SECP256K1_ARG_NONNULL(1); /** Set a callback function to be called when an internal consistency check * fails. The default is crashing. * * This can only trigger in case of a hardware failure, miscompilation, * memory corruption, serious bug in the library, or other error would can * otherwise result in undefined behaviour. It will not trigger due to mere * incorrect usage of the API (see secp256k1_context_set_illegal_callback * for that). After this callback returns, anything may happen, including * crashing. * * Args: ctx: an existing context object (cannot be NULL) * In: fun: a pointer to a function to call when an internal error occurs, * taking a message and an opaque pointer (NULL restores a default * handler that calls abort). * data: the opaque pointer to pass to fun above. */ SECP256K1_API void secp256k1_context_set_error_callback( secp256k1_context* ctx, void (*fun)(const char* message, void* data), const void* data ) SECP256K1_ARG_NONNULL(1); /** Parse a variable-length public key into the pubkey object. * * Returns: 1 if the public key was fully valid. * 0 if the public key could not be parsed or is invalid. * Args: ctx: a secp256k1 context object. * Out: pubkey: pointer to a pubkey object. If 1 is returned, it is set to a * parsed version of input. If not, its value is undefined. * In: input: pointer to a serialized public key * inputlen: length of the array pointed to by input * * This function supports parsing compressed (33 bytes, header byte 0x02 or * 0x03), uncompressed (65 bytes, header byte 0x04), or hybrid (65 bytes, header * byte 0x06 or 0x07) format public keys. */ SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_parse( const secp256k1_context* ctx, secp256k1_pubkey* pubkey, const unsigned char *input, size_t inputlen ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); /** Serialize a pubkey object into a serialized byte sequence. * * Returns: 1 always. * Args: ctx: a secp256k1 context object. * Out: output: a pointer to a 65-byte (if compressed==0) or 33-byte (if * compressed==1) byte array to place the serialized key * in. * In/Out: outputlen: a pointer to an integer which is initially set to the * size of output, and is overwritten with the written * size. * In: pubkey: a pointer to a secp256k1_pubkey containing an * initialized public key. * flags: SECP256K1_EC_COMPRESSED if serialization should be in * compressed format, otherwise SECP256K1_EC_UNCOMPRESSED. */ SECP256K1_API int secp256k1_ec_pubkey_serialize( const secp256k1_context* ctx, unsigned char *output, size_t *outputlen, const secp256k1_pubkey* pubkey, unsigned int flags ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); /** Parse an ECDSA signature in compact (64 bytes) format. * * Returns: 1 when the signature could be parsed, 0 otherwise. * Args: ctx: a secp256k1 context object * Out: sig: a pointer to a signature object * In: input64: a pointer to the 64-byte array to parse * * The signature must consist of a 32-byte big endian R value, followed by a * 32-byte big endian S value. If R or S fall outside of [0..order-1], the * encoding is invalid. R and S with value 0 are allowed in the encoding. * * After the call, sig will always be initialized. If parsing failed or R or * S are zero, the resulting sig value is guaranteed to fail validation for any * message and public key. */ SECP256K1_API int secp256k1_ecdsa_signature_parse_compact( const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const unsigned char *input64 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); /** Parse a DER ECDSA signature. * * Returns: 1 when the signature could be parsed, 0 otherwise. * Args: ctx: a secp256k1 context object * Out: sig: a pointer to a signature object * In: input: a pointer to the signature to be parsed * inputlen: the length of the array pointed to be input * * This function will accept any valid DER encoded signature, even if the * encoded numbers are out of range. * * After the call, sig will always be initialized. If parsing failed or the * encoded numbers are out of range, signature validation with it is * guaranteed to fail for every message and public key. */ SECP256K1_API int secp256k1_ecdsa_signature_parse_der( const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const unsigned char *input, size_t inputlen ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); /** Serialize an ECDSA signature in DER format. * * Returns: 1 if enough space was available to serialize, 0 otherwise * Args: ctx: a secp256k1 context object * Out: output: a pointer to an array to store the DER serialization * In/Out: outputlen: a pointer to a length integer. Initially, this integer * should be set to the length of output. After the call * it will be set to the length of the serialization (even * if 0 was returned). * In: sig: a pointer to an initialized signature object */ SECP256K1_API int secp256k1_ecdsa_signature_serialize_der( const secp256k1_context* ctx, unsigned char *output, size_t *outputlen, const secp256k1_ecdsa_signature* sig ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); /** Serialize an ECDSA signature in compact (64 byte) format. * * Returns: 1 * Args: ctx: a secp256k1 context object * Out: output64: a pointer to a 64-byte array to store the compact serialization * In: sig: a pointer to an initialized signature object * * See secp256k1_ecdsa_signature_parse_compact for details about the encoding. */ SECP256K1_API int secp256k1_ecdsa_signature_serialize_compact( const secp256k1_context* ctx, unsigned char *output64, const secp256k1_ecdsa_signature* sig ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); /** Verify an ECDSA signature. * * Returns: 1: correct signature * 0: incorrect or unparseable signature * Args: ctx: a secp256k1 context object, initialized for verification. * In: sig: the signature being verified (cannot be NULL) * msg32: the 32-byte message hash being verified (cannot be NULL) * pubkey: pointer to an initialized public key to verify with (cannot be NULL) * * To avoid accepting malleable signatures, only ECDSA signatures in lower-S * form are accepted. * * If you need to accept ECDSA signatures from sources that do not obey this * rule, apply secp256k1_ecdsa_signature_normalize to the signature prior to * validation, but be aware that doing so results in malleable signatures. * * For details, see the comments for that function. */ SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_verify( const secp256k1_context* ctx, const secp256k1_ecdsa_signature *sig, const unsigned char *msg32, const secp256k1_pubkey *pubkey ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); /** Convert a signature to a normalized lower-S form. * * Returns: 1 if sigin was not normalized, 0 if it already was. * Args: ctx: a secp256k1 context object * Out: sigout: a pointer to a signature to fill with the normalized form, * or copy if the input was already normalized. (can be NULL if * you're only interested in whether the input was already * normalized). * In: sigin: a pointer to a signature to check/normalize (cannot be NULL, * can be identical to sigout) * * With ECDSA a third-party can forge a second distinct signature of the same * message, given a single initial signature, but without knowing the key. This * is done by negating the S value modulo the order of the curve, 'flipping' * the sign of the random point R which is not included in the signature. * * Forgery of the same message isn't universally problematic, but in systems * where message malleability or uniqueness of signatures is important this can * cause issues. This forgery can be blocked by all verifiers forcing signers * to use a normalized form. * * The lower-S form reduces the size of signatures slightly on average when * variable length encodings (such as DER) are used and is cheap to verify, * making it a good choice. Security of always using lower-S is assured because * anyone can trivially modify a signature after the fact to enforce this * property anyway. * * The lower S value is always between 0x1 and * 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, * inclusive. * * No other forms of ECDSA malleability are known and none seem likely, but * there is no formal proof that ECDSA, even with this additional restriction, * is free of other malleability. Commonly used serialization schemes will also * accept various non-unique encodings, so care should be taken when this * property is required for an application. * * The secp256k1_ecdsa_sign function will by default create signatures in the * lower-S form, and secp256k1_ecdsa_verify will not accept others. In case * signatures come from a system that cannot enforce this property, * secp256k1_ecdsa_signature_normalize must be called before verification. */ SECP256K1_API int secp256k1_ecdsa_signature_normalize( const secp256k1_context* ctx, secp256k1_ecdsa_signature *sigout, const secp256k1_ecdsa_signature *sigin ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(3); /** An implementation of RFC6979 (using HMAC-SHA256) as nonce generation function. * If a data pointer is passed, it is assumed to be a pointer to 32 bytes of * extra entropy. */ SECP256K1_API extern const secp256k1_nonce_function secp256k1_nonce_function_rfc6979; /** A default safe nonce generation function (currently equal to secp256k1_nonce_function_rfc6979). */ SECP256K1_API extern const secp256k1_nonce_function secp256k1_nonce_function_default; /** Create an ECDSA signature. * * Returns: 1: signature created * 0: the nonce generation function failed, or the private key was invalid. * Args: ctx: pointer to a context object, initialized for signing (cannot be NULL) * Out: sig: pointer to an array where the signature will be placed (cannot be NULL) * In: msg32: the 32-byte message hash being signed (cannot be NULL) * seckey: pointer to a 32-byte secret key (cannot be NULL) * noncefp:pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used * ndata: pointer to arbitrary data used by the nonce generation function (can be NULL) * * The created signature is always in lower-S form. See * secp256k1_ecdsa_signature_normalize for more details. */ SECP256K1_API int secp256k1_ecdsa_sign( const secp256k1_context* ctx, secp256k1_ecdsa_signature *sig, const unsigned char *msg32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void *ndata ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); /** Verify an ECDSA secret key. * * Returns: 1: secret key is valid * 0: secret key is invalid * Args: ctx: pointer to a context object (cannot be NULL) * In: seckey: pointer to a 32-byte secret key (cannot be NULL) */ SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_verify( const secp256k1_context* ctx, const unsigned char *seckey ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2); /** Compute the public key for a secret key. * * Returns: 1: secret was valid, public key stores * 0: secret was invalid, try again * Args: ctx: pointer to a context object, initialized for signing (cannot be NULL) * Out: pubkey: pointer to the created public key (cannot be NULL) * In: seckey: pointer to a 32-byte private key (cannot be NULL) */ SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_create( const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *seckey ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); /** Tweak a private key by adding tweak to it. * Returns: 0 if the tweak was out of range (chance of around 1 in 2^128 for * uniformly random 32-byte arrays, or if the resulting private key * would be invalid (only when the tweak is the complement of the * private key). 1 otherwise. * Args: ctx: pointer to a context object (cannot be NULL). * In/Out: seckey: pointer to a 32-byte private key. * In: tweak: pointer to a 32-byte tweak. */ SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_add( const secp256k1_context* ctx, unsigned char *seckey, const unsigned char *tweak ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); /** Tweak a public key by adding tweak times the generator to it. * Returns: 0 if the tweak was out of range (chance of around 1 in 2^128 for * uniformly random 32-byte arrays, or if the resulting public key * would be invalid (only when the tweak is the complement of the * corresponding private key). 1 otherwise. * Args: ctx: pointer to a context object initialized for validation * (cannot be NULL). * In/Out: pubkey: pointer to a public key object. * In: tweak: pointer to a 32-byte tweak. */ SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_add( const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *tweak ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); /** Tweak a private key by multiplying it by a tweak. * Returns: 0 if the tweak was out of range (chance of around 1 in 2^128 for * uniformly random 32-byte arrays, or equal to zero. 1 otherwise. * Args: ctx: pointer to a context object (cannot be NULL). * In/Out: seckey: pointer to a 32-byte private key. * In: tweak: pointer to a 32-byte tweak. */ SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_mul( const secp256k1_context* ctx, unsigned char *seckey, const unsigned char *tweak ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); /** Tweak a public key by multiplying it by a tweak value. * Returns: 0 if the tweak was out of range (chance of around 1 in 2^128 for * uniformly random 32-byte arrays, or equal to zero. 1 otherwise. * Args: ctx: pointer to a context object initialized for validation * (cannot be NULL). * In/Out: pubkey: pointer to a public key obkect. * In: tweak: pointer to a 32-byte tweak. */ SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_mul( const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *tweak ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); /** Updates the context randomization. * Returns: 1: randomization successfully updated * 0: error * Args: ctx: pointer to a context object (cannot be NULL) * In: seed32: pointer to a 32-byte random seed (NULL resets to initial state) */ SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_context_randomize( secp256k1_context* ctx, const unsigned char *seed32 ) SECP256K1_ARG_NONNULL(1); /** Add a number of public keys together. * Returns: 1: the sum of the public keys is valid. * 0: the sum of the public keys is not valid. * Args: ctx: pointer to a context object * Out: out: pointer to a public key object for placing the resulting public key * (cannot be NULL) * In: ins: pointer to array of pointers to public keys (cannot be NULL) * n: the number of public keys to add together (must be at least 1) */ SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_combine( const secp256k1_context* ctx, secp256k1_pubkey *out, const secp256k1_pubkey * const * ins, size_t n ) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); # ifdef __cplusplus } # endif #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/include/secp256k1_ecdh.h ================================================ #ifndef _SECP256K1_ECDH_ # define _SECP256K1_ECDH_ # include "secp256k1.h" # ifdef __cplusplus extern "C" { # endif /** Compute an EC Diffie-Hellman secret in constant time * Returns: 1: exponentiation was successful * 0: scalar was invalid (zero or overflow) * Args: ctx: pointer to a context object (cannot be NULL) * Out: result: a 32-byte array which will be populated by an ECDH * secret computed from the point and scalar * In: pubkey: a pointer to a secp256k1_pubkey containing an * initialized public key * privkey: a 32-byte scalar with which to multiply the point */ SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdh( const secp256k1_context* ctx, unsigned char *result, const secp256k1_pubkey *pubkey, const unsigned char *privkey ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); # ifdef __cplusplus } # endif #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/include/secp256k1_recovery.h ================================================ #ifndef _SECP256K1_RECOVERY_ # define _SECP256K1_RECOVERY_ # include "secp256k1.h" # ifdef __cplusplus extern "C" { # endif /** Opaque data structured that holds a parsed ECDSA signature, * supporting pubkey recovery. * * The exact representation of data inside is implementation defined and not * guaranteed to be portable between different platforms or versions. It is * however guaranteed to be 65 bytes in size, and can be safely copied/moved. * If you need to convert to a format suitable for storage or transmission, use * the secp256k1_ecdsa_signature_serialize_* and * secp256k1_ecdsa_signature_parse_* functions. * * Furthermore, it is guaranteed that identical signatures (including their * recoverability) will have identical representation, so they can be * memcmp'ed. */ typedef struct { unsigned char data[65]; } secp256k1_ecdsa_recoverable_signature; /** Parse a compact ECDSA signature (64 bytes + recovery id). * * Returns: 1 when the signature could be parsed, 0 otherwise * Args: ctx: a secp256k1 context object * Out: sig: a pointer to a signature object * In: input64: a pointer to a 64-byte compact signature * recid: the recovery id (0, 1, 2 or 3) */ SECP256K1_API int secp256k1_ecdsa_recoverable_signature_parse_compact( const secp256k1_context* ctx, secp256k1_ecdsa_recoverable_signature* sig, const unsigned char *input64, int recid ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); /** Convert a recoverable signature into a normal signature. * * Returns: 1 * Out: sig: a pointer to a normal signature (cannot be NULL). * In: sigin: a pointer to a recoverable signature (cannot be NULL). */ SECP256K1_API int secp256k1_ecdsa_recoverable_signature_convert( const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const secp256k1_ecdsa_recoverable_signature* sigin ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); /** Serialize an ECDSA signature in compact format (64 bytes + recovery id). * * Returns: 1 * Args: ctx: a secp256k1 context object * Out: output64: a pointer to a 64-byte array of the compact signature (cannot be NULL) * recid: a pointer to an integer to hold the recovery id (can be NULL). * In: sig: a pointer to an initialized signature object (cannot be NULL) */ SECP256K1_API int secp256k1_ecdsa_recoverable_signature_serialize_compact( const secp256k1_context* ctx, unsigned char *output64, int *recid, const secp256k1_ecdsa_recoverable_signature* sig ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); /** Create a recoverable ECDSA signature. * * Returns: 1: signature created * 0: the nonce generation function failed, or the private key was invalid. * Args: ctx: pointer to a context object, initialized for signing (cannot be NULL) * Out: sig: pointer to an array where the signature will be placed (cannot be NULL) * In: msg32: the 32-byte message hash being signed (cannot be NULL) * seckey: pointer to a 32-byte secret key (cannot be NULL) * noncefp:pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used * ndata: pointer to arbitrary data used by the nonce generation function (can be NULL) */ SECP256K1_API int secp256k1_ecdsa_sign_recoverable( const secp256k1_context* ctx, secp256k1_ecdsa_recoverable_signature *sig, const unsigned char *msg32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void *ndata ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); /** Recover an ECDSA public key from a signature. * * Returns: 1: public key successfully recovered (which guarantees a correct signature). * 0: otherwise. * Args: ctx: pointer to a context object, initialized for verification (cannot be NULL) * Out: pubkey: pointer to the recovered public key (cannot be NULL) * In: sig: pointer to initialized signature that supports pubkey recovery (cannot be NULL) * msg32: the 32-byte message hash assumed to be signed (cannot be NULL) */ SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_recover( const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const secp256k1_ecdsa_recoverable_signature *sig, const unsigned char *msg32 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); # ifdef __cplusplus } # endif #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/libsecp256k1.pc.in ================================================ prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libsecp256k1 Description: Optimized C library for EC operations on curve secp256k1 URL: https://github.com/bitcoin-core/secp256k1 Version: @PACKAGE_VERSION@ Cflags: -I${includedir} Libs.private: @SECP_LIBS@ Libs: -L${libdir} -lsecp256k1 ================================================ FILE: crypto/secp256k1/libsecp256k1/obj/.gitignore ================================================ ================================================ FILE: crypto/secp256k1/libsecp256k1/sage/group_prover.sage ================================================ # This code supports verifying group implementations which have branches # or conditional statements (like cmovs), by allowing each execution path # to independently set assumptions on input or intermediary variables. # # The general approach is: # * A constraint is a tuple of two sets of of symbolic expressions: # the first of which are required to evaluate to zero, the second of which # are required to evaluate to nonzero. # - A constraint is said to be conflicting if any of its nonzero expressions # is in the ideal with basis the zero expressions (in other words: when the # zero expressions imply that one of the nonzero expressions are zero). # * There is a list of laws that describe the intended behaviour, including # laws for addition and doubling. Each law is called with the symbolic point # coordinates as arguments, and returns: # - A constraint describing the assumptions under which it is applicable, # called "assumeLaw" # - A constraint describing the requirements of the law, called "require" # * Implementations are transliterated into functions that operate as well on # algebraic input points, and are called once per combination of branches # exectured. Each execution returns: # - A constraint describing the assumptions this implementation requires # (such as Z1=1), called "assumeFormula" # - A constraint describing the assumptions this specific branch requires, # but which is by construction guaranteed to cover the entire space by # merging the results from all branches, called "assumeBranch" # - The result of the computation # * All combinations of laws with implementation branches are tried, and: # - If the combination of assumeLaw, assumeFormula, and assumeBranch results # in a conflict, it means this law does not apply to this branch, and it is # skipped. # - For others, we try to prove the require constraints hold, assuming the # information in assumeLaw + assumeFormula + assumeBranch, and if this does # not succeed, we fail. # + To prove an expression is zero, we check whether it belongs to the # ideal with the assumed zero expressions as basis. This test is exact. # + To prove an expression is nonzero, we check whether each of its # factors is contained in the set of nonzero assumptions' factors. # This test is not exact, so various combinations of original and # reduced expressions' factors are tried. # - If we succeed, we print out the assumptions from assumeFormula that # weren't implied by assumeLaw already. Those from assumeBranch are skipped, # as we assume that all constraints in it are complementary with each other. # # Based on the sage verification scripts used in the Explicit-Formulas Database # by Tanja Lange and others, see http://hyperelliptic.org/EFD class fastfrac: """Fractions over rings.""" def __init__(self,R,top,bot=1): """Construct a fractional, given a ring, a numerator, and denominator.""" self.R = R if parent(top) == ZZ or parent(top) == R: self.top = R(top) self.bot = R(bot) elif top.__class__ == fastfrac: self.top = top.top self.bot = top.bot * bot else: self.top = R(numerator(top)) self.bot = R(denominator(top)) * bot def iszero(self,I): """Return whether this fraction is zero given an ideal.""" return self.top in I and self.bot not in I def reduce(self,assumeZero): zero = self.R.ideal(map(numerator, assumeZero)) return fastfrac(self.R, zero.reduce(self.top)) / fastfrac(self.R, zero.reduce(self.bot)) def __add__(self,other): """Add two fractions.""" if parent(other) == ZZ: return fastfrac(self.R,self.top + self.bot * other,self.bot) if other.__class__ == fastfrac: return fastfrac(self.R,self.top * other.bot + self.bot * other.top,self.bot * other.bot) return NotImplemented def __sub__(self,other): """Subtract two fractions.""" if parent(other) == ZZ: return fastfrac(self.R,self.top - self.bot * other,self.bot) if other.__class__ == fastfrac: return fastfrac(self.R,self.top * other.bot - self.bot * other.top,self.bot * other.bot) return NotImplemented def __neg__(self): """Return the negation of a fraction.""" return fastfrac(self.R,-self.top,self.bot) def __mul__(self,other): """Multiply two fractions.""" if parent(other) == ZZ: return fastfrac(self.R,self.top * other,self.bot) if other.__class__ == fastfrac: return fastfrac(self.R,self.top * other.top,self.bot * other.bot) return NotImplemented def __rmul__(self,other): """Multiply something else with a fraction.""" return self.__mul__(other) def __div__(self,other): """Divide two fractions.""" if parent(other) == ZZ: return fastfrac(self.R,self.top,self.bot * other) if other.__class__ == fastfrac: return fastfrac(self.R,self.top * other.bot,self.bot * other.top) return NotImplemented def __pow__(self,other): """Compute a power of a fraction.""" if parent(other) == ZZ: if other < 0: # Negative powers require flipping top and bottom return fastfrac(self.R,self.bot ^ (-other),self.top ^ (-other)) else: return fastfrac(self.R,self.top ^ other,self.bot ^ other) return NotImplemented def __str__(self): return "fastfrac((" + str(self.top) + ") / (" + str(self.bot) + "))" def __repr__(self): return "%s" % self def numerator(self): return self.top class constraints: """A set of constraints, consisting of zero and nonzero expressions. Constraints can either be used to express knowledge or a requirement. Both the fields zero and nonzero are maps from expressions to description strings. The expressions that are the keys in zero are required to be zero, and the expressions that are the keys in nonzero are required to be nonzero. Note that (a != 0) and (b != 0) is the same as (a*b != 0), so all keys in nonzero could be multiplied into a single key. This is often much less efficient to work with though, so we keep them separate inside the constraints. This allows higher-level code to do fast checks on the individual nonzero elements, or combine them if needed for stronger checks. We can't multiply the different zero elements, as it would suffice for one of the factors to be zero, instead of all of them. Instead, the zero elements are typically combined into an ideal first. """ def __init__(self, **kwargs): if 'zero' in kwargs: self.zero = dict(kwargs['zero']) else: self.zero = dict() if 'nonzero' in kwargs: self.nonzero = dict(kwargs['nonzero']) else: self.nonzero = dict() def negate(self): return constraints(zero=self.nonzero, nonzero=self.zero) def __add__(self, other): zero = self.zero.copy() zero.update(other.zero) nonzero = self.nonzero.copy() nonzero.update(other.nonzero) return constraints(zero=zero, nonzero=nonzero) def __str__(self): return "constraints(zero=%s,nonzero=%s)" % (self.zero, self.nonzero) def __repr__(self): return "%s" % self def conflicts(R, con): """Check whether any of the passed non-zero assumptions is implied by the zero assumptions""" zero = R.ideal(map(numerator, con.zero)) if 1 in zero: return True # First a cheap check whether any of the individual nonzero terms conflict on # their own. for nonzero in con.nonzero: if nonzero.iszero(zero): return True # It can be the case that entries in the nonzero set do not individually # conflict with the zero set, but their combination does. For example, knowing # that either x or y is zero is equivalent to having x*y in the zero set. # Having x or y individually in the nonzero set is not a conflict, but both # simultaneously is, so that is the right thing to check for. if reduce(lambda a,b: a * b, con.nonzero, fastfrac(R, 1)).iszero(zero): return True return False def get_nonzero_set(R, assume): """Calculate a simple set of nonzero expressions""" zero = R.ideal(map(numerator, assume.zero)) nonzero = set() for nz in map(numerator, assume.nonzero): for (f,n) in nz.factor(): nonzero.add(f) rnz = zero.reduce(nz) for (f,n) in rnz.factor(): nonzero.add(f) return nonzero def prove_nonzero(R, exprs, assume): """Check whether an expression is provably nonzero, given assumptions""" zero = R.ideal(map(numerator, assume.zero)) nonzero = get_nonzero_set(R, assume) expl = set() ok = True for expr in exprs: if numerator(expr) in zero: return (False, [exprs[expr]]) allexprs = reduce(lambda a,b: numerator(a)*numerator(b), exprs, 1) for (f, n) in allexprs.factor(): if f not in nonzero: ok = False if ok: return (True, None) ok = True for (f, n) in zero.reduce(numerator(allexprs)).factor(): if f not in nonzero: ok = False if ok: return (True, None) ok = True for expr in exprs: for (f,n) in numerator(expr).factor(): if f not in nonzero: ok = False if ok: return (True, None) ok = True for expr in exprs: for (f,n) in zero.reduce(numerator(expr)).factor(): if f not in nonzero: expl.add(exprs[expr]) if expl: return (False, list(expl)) else: return (True, None) def prove_zero(R, exprs, assume): """Check whether all of the passed expressions are provably zero, given assumptions""" r, e = prove_nonzero(R, dict(map(lambda x: (fastfrac(R, x.bot, 1), exprs[x]), exprs)), assume) if not r: return (False, map(lambda x: "Possibly zero denominator: %s" % x, e)) zero = R.ideal(map(numerator, assume.zero)) nonzero = prod(x for x in assume.nonzero) expl = [] for expr in exprs: if not expr.iszero(zero): expl.append(exprs[expr]) if not expl: return (True, None) return (False, expl) def describe_extra(R, assume, assumeExtra): """Describe what assumptions are added, given existing assumptions""" zerox = assume.zero.copy() zerox.update(assumeExtra.zero) zero = R.ideal(map(numerator, assume.zero)) zeroextra = R.ideal(map(numerator, zerox)) nonzero = get_nonzero_set(R, assume) ret = set() # Iterate over the extra zero expressions for base in assumeExtra.zero: if base not in zero: add = [] for (f, n) in numerator(base).factor(): if f not in nonzero: add += ["%s" % f] if add: ret.add((" * ".join(add)) + " = 0 [%s]" % assumeExtra.zero[base]) # Iterate over the extra nonzero expressions for nz in assumeExtra.nonzero: nzr = zeroextra.reduce(numerator(nz)) if nzr not in zeroextra: for (f,n) in nzr.factor(): if zeroextra.reduce(f) not in nonzero: ret.add("%s != 0" % zeroextra.reduce(f)) return ", ".join(x for x in ret) def check_symbolic(R, assumeLaw, assumeAssert, assumeBranch, require): """Check a set of zero and nonzero requirements, given a set of zero and nonzero assumptions""" assume = assumeLaw + assumeAssert + assumeBranch if conflicts(R, assume): # This formula does not apply return None describe = describe_extra(R, assumeLaw + assumeBranch, assumeAssert) ok, msg = prove_zero(R, require.zero, assume) if not ok: return "FAIL, %s fails (assuming %s)" % (str(msg), describe) res, expl = prove_nonzero(R, require.nonzero, assume) if not res: return "FAIL, %s fails (assuming %s)" % (str(expl), describe) if describe != "": return "OK (assuming %s)" % describe else: return "OK" def concrete_verify(c): for k in c.zero: if k != 0: return (False, c.zero[k]) for k in c.nonzero: if k == 0: return (False, c.nonzero[k]) return (True, None) ================================================ FILE: crypto/secp256k1/libsecp256k1/sage/secp256k1.sage ================================================ # Test libsecp256k1' group operation implementations using prover.sage import sys load("group_prover.sage") load("weierstrass_prover.sage") def formula_secp256k1_gej_double_var(a): """libsecp256k1's secp256k1_gej_double_var, used by various addition functions""" rz = a.Z * a.Y rz = rz * 2 t1 = a.X^2 t1 = t1 * 3 t2 = t1^2 t3 = a.Y^2 t3 = t3 * 2 t4 = t3^2 t4 = t4 * 2 t3 = t3 * a.X rx = t3 rx = rx * 4 rx = -rx rx = rx + t2 t2 = -t2 t3 = t3 * 6 t3 = t3 + t2 ry = t1 * t3 t2 = -t4 ry = ry + t2 return jacobianpoint(rx, ry, rz) def formula_secp256k1_gej_add_var(branch, a, b): """libsecp256k1's secp256k1_gej_add_var""" if branch == 0: return (constraints(), constraints(nonzero={a.Infinity : 'a_infinite'}), b) if branch == 1: return (constraints(), constraints(zero={a.Infinity : 'a_finite'}, nonzero={b.Infinity : 'b_infinite'}), a) z22 = b.Z^2 z12 = a.Z^2 u1 = a.X * z22 u2 = b.X * z12 s1 = a.Y * z22 s1 = s1 * b.Z s2 = b.Y * z12 s2 = s2 * a.Z h = -u1 h = h + u2 i = -s1 i = i + s2 if branch == 2: r = formula_secp256k1_gej_double_var(a) return (constraints(), constraints(zero={h : 'h=0', i : 'i=0', a.Infinity : 'a_finite', b.Infinity : 'b_finite'}), r) if branch == 3: return (constraints(), constraints(zero={h : 'h=0', a.Infinity : 'a_finite', b.Infinity : 'b_finite'}, nonzero={i : 'i!=0'}), point_at_infinity()) i2 = i^2 h2 = h^2 h3 = h2 * h h = h * b.Z rz = a.Z * h t = u1 * h2 rx = t rx = rx * 2 rx = rx + h3 rx = -rx rx = rx + i2 ry = -rx ry = ry + t ry = ry * i h3 = h3 * s1 h3 = -h3 ry = ry + h3 return (constraints(), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite'}, nonzero={h : 'h!=0'}), jacobianpoint(rx, ry, rz)) def formula_secp256k1_gej_add_ge_var(branch, a, b): """libsecp256k1's secp256k1_gej_add_ge_var, which assume bz==1""" if branch == 0: return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(nonzero={a.Infinity : 'a_infinite'}), b) if branch == 1: return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(zero={a.Infinity : 'a_finite'}, nonzero={b.Infinity : 'b_infinite'}), a) z12 = a.Z^2 u1 = a.X u2 = b.X * z12 s1 = a.Y s2 = b.Y * z12 s2 = s2 * a.Z h = -u1 h = h + u2 i = -s1 i = i + s2 if (branch == 2): r = formula_secp256k1_gej_double_var(a) return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite', h : 'h=0', i : 'i=0'}), r) if (branch == 3): return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite', h : 'h=0'}, nonzero={i : 'i!=0'}), point_at_infinity()) i2 = i^2 h2 = h^2 h3 = h * h2 rz = a.Z * h t = u1 * h2 rx = t rx = rx * 2 rx = rx + h3 rx = -rx rx = rx + i2 ry = -rx ry = ry + t ry = ry * i h3 = h3 * s1 h3 = -h3 ry = ry + h3 return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite'}, nonzero={h : 'h!=0'}), jacobianpoint(rx, ry, rz)) def formula_secp256k1_gej_add_zinv_var(branch, a, b): """libsecp256k1's secp256k1_gej_add_zinv_var""" bzinv = b.Z^(-1) if branch == 0: return (constraints(), constraints(nonzero={b.Infinity : 'b_infinite'}), a) if branch == 1: bzinv2 = bzinv^2 bzinv3 = bzinv2 * bzinv rx = b.X * bzinv2 ry = b.Y * bzinv3 rz = 1 return (constraints(), constraints(zero={b.Infinity : 'b_finite'}, nonzero={a.Infinity : 'a_infinite'}), jacobianpoint(rx, ry, rz)) azz = a.Z * bzinv z12 = azz^2 u1 = a.X u2 = b.X * z12 s1 = a.Y s2 = b.Y * z12 s2 = s2 * azz h = -u1 h = h + u2 i = -s1 i = i + s2 if branch == 2: r = formula_secp256k1_gej_double_var(a) return (constraints(), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite', h : 'h=0', i : 'i=0'}), r) if branch == 3: return (constraints(), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite', h : 'h=0'}, nonzero={i : 'i!=0'}), point_at_infinity()) i2 = i^2 h2 = h^2 h3 = h * h2 rz = a.Z rz = rz * h t = u1 * h2 rx = t rx = rx * 2 rx = rx + h3 rx = -rx rx = rx + i2 ry = -rx ry = ry + t ry = ry * i h3 = h3 * s1 h3 = -h3 ry = ry + h3 return (constraints(), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite'}, nonzero={h : 'h!=0'}), jacobianpoint(rx, ry, rz)) def formula_secp256k1_gej_add_ge(branch, a, b): """libsecp256k1's secp256k1_gej_add_ge""" zeroes = {} nonzeroes = {} a_infinity = False if (branch & 4) != 0: nonzeroes.update({a.Infinity : 'a_infinite'}) a_infinity = True else: zeroes.update({a.Infinity : 'a_finite'}) zz = a.Z^2 u1 = a.X u2 = b.X * zz s1 = a.Y s2 = b.Y * zz s2 = s2 * a.Z t = u1 t = t + u2 m = s1 m = m + s2 rr = t^2 m_alt = -u2 tt = u1 * m_alt rr = rr + tt degenerate = (branch & 3) == 3 if (branch & 1) != 0: zeroes.update({m : 'm_zero'}) else: nonzeroes.update({m : 'm_nonzero'}) if (branch & 2) != 0: zeroes.update({rr : 'rr_zero'}) else: nonzeroes.update({rr : 'rr_nonzero'}) rr_alt = s1 rr_alt = rr_alt * 2 m_alt = m_alt + u1 if not degenerate: rr_alt = rr m_alt = m n = m_alt^2 q = n * t n = n^2 if degenerate: n = m t = rr_alt^2 rz = a.Z * m_alt infinity = False if (branch & 8) != 0: if not a_infinity: infinity = True zeroes.update({rz : 'r.z=0'}) else: nonzeroes.update({rz : 'r.z!=0'}) rz = rz * 2 q = -q t = t + q rx = t t = t * 2 t = t + q t = t * rr_alt t = t + n ry = -t rx = rx * 4 ry = ry * 4 if a_infinity: rx = b.X ry = b.Y rz = 1 if infinity: return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(zero=zeroes, nonzero=nonzeroes), point_at_infinity()) return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(zero=zeroes, nonzero=nonzeroes), jacobianpoint(rx, ry, rz)) def formula_secp256k1_gej_add_ge_old(branch, a, b): """libsecp256k1's old secp256k1_gej_add_ge, which fails when ay+by=0 but ax!=bx""" a_infinity = (branch & 1) != 0 zero = {} nonzero = {} if a_infinity: nonzero.update({a.Infinity : 'a_infinite'}) else: zero.update({a.Infinity : 'a_finite'}) zz = a.Z^2 u1 = a.X u2 = b.X * zz s1 = a.Y s2 = b.Y * zz s2 = s2 * a.Z z = a.Z t = u1 t = t + u2 m = s1 m = m + s2 n = m^2 q = n * t n = n^2 rr = t^2 t = u1 * u2 t = -t rr = rr + t t = rr^2 rz = m * z infinity = False if (branch & 2) != 0: if not a_infinity: infinity = True else: return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(nonzero={z : 'conflict_a'}, zero={z : 'conflict_b'}), point_at_infinity()) zero.update({rz : 'r.z=0'}) else: nonzero.update({rz : 'r.z!=0'}) rz = rz * (0 if a_infinity else 2) rx = t q = -q rx = rx + q q = q * 3 t = t * 2 t = t + q t = t * rr t = t + n ry = -t rx = rx * (0 if a_infinity else 4) ry = ry * (0 if a_infinity else 4) t = b.X t = t * (1 if a_infinity else 0) rx = rx + t t = b.Y t = t * (1 if a_infinity else 0) ry = ry + t t = (1 if a_infinity else 0) rz = rz + t if infinity: return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(zero=zero, nonzero=nonzero), point_at_infinity()) return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(zero=zero, nonzero=nonzero), jacobianpoint(rx, ry, rz)) if __name__ == "__main__": check_symbolic_jacobian_weierstrass("secp256k1_gej_add_var", 0, 7, 5, formula_secp256k1_gej_add_var) check_symbolic_jacobian_weierstrass("secp256k1_gej_add_ge_var", 0, 7, 5, formula_secp256k1_gej_add_ge_var) check_symbolic_jacobian_weierstrass("secp256k1_gej_add_zinv_var", 0, 7, 5, formula_secp256k1_gej_add_zinv_var) check_symbolic_jacobian_weierstrass("secp256k1_gej_add_ge", 0, 7, 16, formula_secp256k1_gej_add_ge) check_symbolic_jacobian_weierstrass("secp256k1_gej_add_ge_old [should fail]", 0, 7, 4, formula_secp256k1_gej_add_ge_old) if len(sys.argv) >= 2 and sys.argv[1] == "--exhaustive": check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_var", 0, 7, 5, formula_secp256k1_gej_add_var, 43) check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_ge_var", 0, 7, 5, formula_secp256k1_gej_add_ge_var, 43) check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_zinv_var", 0, 7, 5, formula_secp256k1_gej_add_zinv_var, 43) check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_ge", 0, 7, 16, formula_secp256k1_gej_add_ge, 43) check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_ge_old [should fail]", 0, 7, 4, formula_secp256k1_gej_add_ge_old, 43) ================================================ FILE: crypto/secp256k1/libsecp256k1/sage/weierstrass_prover.sage ================================================ # Prover implementation for Weierstrass curves of the form # y^2 = x^3 + A * x + B, specifically with a = 0 and b = 7, with group laws # operating on affine and Jacobian coordinates, including the point at infinity # represented by a 4th variable in coordinates. load("group_prover.sage") class affinepoint: def __init__(self, x, y, infinity=0): self.x = x self.y = y self.infinity = infinity def __str__(self): return "affinepoint(x=%s,y=%s,inf=%s)" % (self.x, self.y, self.infinity) class jacobianpoint: def __init__(self, x, y, z, infinity=0): self.X = x self.Y = y self.Z = z self.Infinity = infinity def __str__(self): return "jacobianpoint(X=%s,Y=%s,Z=%s,inf=%s)" % (self.X, self.Y, self.Z, self.Infinity) def point_at_infinity(): return jacobianpoint(1, 1, 1, 1) def negate(p): if p.__class__ == affinepoint: return affinepoint(p.x, -p.y) if p.__class__ == jacobianpoint: return jacobianpoint(p.X, -p.Y, p.Z) assert(False) def on_weierstrass_curve(A, B, p): """Return a set of zero-expressions for an affine point to be on the curve""" return constraints(zero={p.x^3 + A*p.x + B - p.y^2: 'on_curve'}) def tangential_to_weierstrass_curve(A, B, p12, p3): """Return a set of zero-expressions for ((x12,y12),(x3,y3)) to be a line that is tangential to the curve at (x12,y12)""" return constraints(zero={ (p12.y - p3.y) * (p12.y * 2) - (p12.x^2 * 3 + A) * (p12.x - p3.x): 'tangential_to_curve' }) def colinear(p1, p2, p3): """Return a set of zero-expressions for ((x1,y1),(x2,y2),(x3,y3)) to be collinear""" return constraints(zero={ (p1.y - p2.y) * (p1.x - p3.x) - (p1.y - p3.y) * (p1.x - p2.x): 'colinear_1', (p2.y - p3.y) * (p2.x - p1.x) - (p2.y - p1.y) * (p2.x - p3.x): 'colinear_2', (p3.y - p1.y) * (p3.x - p2.x) - (p3.y - p2.y) * (p3.x - p1.x): 'colinear_3' }) def good_affine_point(p): return constraints(nonzero={p.x : 'nonzero_x', p.y : 'nonzero_y'}) def good_jacobian_point(p): return constraints(nonzero={p.X : 'nonzero_X', p.Y : 'nonzero_Y', p.Z^6 : 'nonzero_Z'}) def good_point(p): return constraints(nonzero={p.Z^6 : 'nonzero_X'}) def finite(p, *affine_fns): con = good_point(p) + constraints(zero={p.Infinity : 'finite_point'}) if p.Z != 0: return con + reduce(lambda a, b: a + b, (f(affinepoint(p.X / p.Z^2, p.Y / p.Z^3)) for f in affine_fns), con) else: return con def infinite(p): return constraints(nonzero={p.Infinity : 'infinite_point'}) def law_jacobian_weierstrass_add(A, B, pa, pb, pA, pB, pC): """Check whether the passed set of coordinates is a valid Jacobian add, given assumptions""" assumeLaw = (good_affine_point(pa) + good_affine_point(pb) + good_jacobian_point(pA) + good_jacobian_point(pB) + on_weierstrass_curve(A, B, pa) + on_weierstrass_curve(A, B, pb) + finite(pA) + finite(pB) + constraints(nonzero={pa.x - pb.x : 'different_x'})) require = (finite(pC, lambda pc: on_weierstrass_curve(A, B, pc) + colinear(pa, pb, negate(pc)))) return (assumeLaw, require) def law_jacobian_weierstrass_double(A, B, pa, pb, pA, pB, pC): """Check whether the passed set of coordinates is a valid Jacobian doubling, given assumptions""" assumeLaw = (good_affine_point(pa) + good_affine_point(pb) + good_jacobian_point(pA) + good_jacobian_point(pB) + on_weierstrass_curve(A, B, pa) + on_weierstrass_curve(A, B, pb) + finite(pA) + finite(pB) + constraints(zero={pa.x - pb.x : 'equal_x', pa.y - pb.y : 'equal_y'})) require = (finite(pC, lambda pc: on_weierstrass_curve(A, B, pc) + tangential_to_weierstrass_curve(A, B, pa, negate(pc)))) return (assumeLaw, require) def law_jacobian_weierstrass_add_opposites(A, B, pa, pb, pA, pB, pC): assumeLaw = (good_affine_point(pa) + good_affine_point(pb) + good_jacobian_point(pA) + good_jacobian_point(pB) + on_weierstrass_curve(A, B, pa) + on_weierstrass_curve(A, B, pb) + finite(pA) + finite(pB) + constraints(zero={pa.x - pb.x : 'equal_x', pa.y + pb.y : 'opposite_y'})) require = infinite(pC) return (assumeLaw, require) def law_jacobian_weierstrass_add_infinite_a(A, B, pa, pb, pA, pB, pC): assumeLaw = (good_affine_point(pa) + good_affine_point(pb) + good_jacobian_point(pA) + good_jacobian_point(pB) + on_weierstrass_curve(A, B, pb) + infinite(pA) + finite(pB)) require = finite(pC, lambda pc: constraints(zero={pc.x - pb.x : 'c.x=b.x', pc.y - pb.y : 'c.y=b.y'})) return (assumeLaw, require) def law_jacobian_weierstrass_add_infinite_b(A, B, pa, pb, pA, pB, pC): assumeLaw = (good_affine_point(pa) + good_affine_point(pb) + good_jacobian_point(pA) + good_jacobian_point(pB) + on_weierstrass_curve(A, B, pa) + infinite(pB) + finite(pA)) require = finite(pC, lambda pc: constraints(zero={pc.x - pa.x : 'c.x=a.x', pc.y - pa.y : 'c.y=a.y'})) return (assumeLaw, require) def law_jacobian_weierstrass_add_infinite_ab(A, B, pa, pb, pA, pB, pC): assumeLaw = (good_affine_point(pa) + good_affine_point(pb) + good_jacobian_point(pA) + good_jacobian_point(pB) + infinite(pA) + infinite(pB)) require = infinite(pC) return (assumeLaw, require) laws_jacobian_weierstrass = { 'add': law_jacobian_weierstrass_add, 'double': law_jacobian_weierstrass_double, 'add_opposite': law_jacobian_weierstrass_add_opposites, 'add_infinite_a': law_jacobian_weierstrass_add_infinite_a, 'add_infinite_b': law_jacobian_weierstrass_add_infinite_b, 'add_infinite_ab': law_jacobian_weierstrass_add_infinite_ab } def check_exhaustive_jacobian_weierstrass(name, A, B, branches, formula, p): """Verify an implementation of addition of Jacobian points on a Weierstrass curve, by executing and validating the result for every possible addition in a prime field""" F = Integers(p) print "Formula %s on Z%i:" % (name, p) points = [] for x in xrange(0, p): for y in xrange(0, p): point = affinepoint(F(x), F(y)) r, e = concrete_verify(on_weierstrass_curve(A, B, point)) if r: points.append(point) for za in xrange(1, p): for zb in xrange(1, p): for pa in points: for pb in points: for ia in xrange(2): for ib in xrange(2): pA = jacobianpoint(pa.x * F(za)^2, pa.y * F(za)^3, F(za), ia) pB = jacobianpoint(pb.x * F(zb)^2, pb.y * F(zb)^3, F(zb), ib) for branch in xrange(0, branches): assumeAssert, assumeBranch, pC = formula(branch, pA, pB) pC.X = F(pC.X) pC.Y = F(pC.Y) pC.Z = F(pC.Z) pC.Infinity = F(pC.Infinity) r, e = concrete_verify(assumeAssert + assumeBranch) if r: match = False for key in laws_jacobian_weierstrass: assumeLaw, require = laws_jacobian_weierstrass[key](A, B, pa, pb, pA, pB, pC) r, e = concrete_verify(assumeLaw) if r: if match: print " multiple branches for (%s,%s,%s,%s) + (%s,%s,%s,%s)" % (pA.X, pA.Y, pA.Z, pA.Infinity, pB.X, pB.Y, pB.Z, pB.Infinity) else: match = True r, e = concrete_verify(require) if not r: print " failure in branch %i for (%s,%s,%s,%s) + (%s,%s,%s,%s) = (%s,%s,%s,%s): %s" % (branch, pA.X, pA.Y, pA.Z, pA.Infinity, pB.X, pB.Y, pB.Z, pB.Infinity, pC.X, pC.Y, pC.Z, pC.Infinity, e) print def check_symbolic_function(R, assumeAssert, assumeBranch, f, A, B, pa, pb, pA, pB, pC): assumeLaw, require = f(A, B, pa, pb, pA, pB, pC) return check_symbolic(R, assumeLaw, assumeAssert, assumeBranch, require) def check_symbolic_jacobian_weierstrass(name, A, B, branches, formula): """Verify an implementation of addition of Jacobian points on a Weierstrass curve symbolically""" R. = PolynomialRing(QQ,8,order='invlex') lift = lambda x: fastfrac(R,x) ax = lift(ax) ay = lift(ay) Az = lift(Az) bx = lift(bx) by = lift(by) Bz = lift(Bz) Ai = lift(Ai) Bi = lift(Bi) pa = affinepoint(ax, ay, Ai) pb = affinepoint(bx, by, Bi) pA = jacobianpoint(ax * Az^2, ay * Az^3, Az, Ai) pB = jacobianpoint(bx * Bz^2, by * Bz^3, Bz, Bi) res = {} for key in laws_jacobian_weierstrass: res[key] = [] print ("Formula " + name + ":") count = 0 for branch in xrange(branches): assumeFormula, assumeBranch, pC = formula(branch, pA, pB) pC.X = lift(pC.X) pC.Y = lift(pC.Y) pC.Z = lift(pC.Z) pC.Infinity = lift(pC.Infinity) for key in laws_jacobian_weierstrass: res[key].append((check_symbolic_function(R, assumeFormula, assumeBranch, laws_jacobian_weierstrass[key], A, B, pa, pb, pA, pB, pC), branch)) for key in res: print " %s:" % key val = res[key] for x in val: if x[0] is not None: print " branch %i: %s" % (x[1], x[0]) print ================================================ FILE: crypto/secp256k1/libsecp256k1/src/asm/field_10x26_arm.s ================================================ @ vim: set tabstop=8 softtabstop=8 shiftwidth=8 noexpandtab syntax=armasm: /********************************************************************** * Copyright (c) 2014 Wladimir J. van der Laan * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ /* ARM implementation of field_10x26 inner loops. Note: - To avoid unnecessary loads and make use of available registers, two 'passes' have every time been interleaved, with the odd passes accumulating c' and d' which will be added to c and d respectively in the the even passes */ .syntax unified .arch armv7-a @ eabi attributes - see readelf -A .eabi_attribute 8, 1 @ Tag_ARM_ISA_use = yes .eabi_attribute 9, 0 @ Tag_Thumb_ISA_use = no .eabi_attribute 10, 0 @ Tag_FP_arch = none .eabi_attribute 24, 1 @ Tag_ABI_align_needed = 8-byte .eabi_attribute 25, 1 @ Tag_ABI_align_preserved = 8-byte, except leaf SP .eabi_attribute 30, 2 @ Tag_ABI_optimization_goals = Agressive Speed .eabi_attribute 34, 1 @ Tag_CPU_unaligned_access = v6 .text @ Field constants .set field_R0, 0x3d10 .set field_R1, 0x400 .set field_not_M, 0xfc000000 @ ~M = ~0x3ffffff .align 2 .global secp256k1_fe_mul_inner .type secp256k1_fe_mul_inner, %function @ Arguments: @ r0 r Restrict: can overlap with a, not with b @ r1 a @ r2 b @ Stack (total 4+10*4 = 44) @ sp + #0 saved 'r' pointer @ sp + #4 + 4*X t0,t1,t2,t3,t4,t5,t6,t7,u8,t9 secp256k1_fe_mul_inner: stmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, r14} sub sp, sp, #48 @ frame=44 + alignment str r0, [sp, #0] @ save result address, we need it only at the end /****************************************** * Main computation code. ****************************************** Allocation: r0,r14,r7,r8 scratch r1 a (pointer) r2 b (pointer) r3:r4 c r5:r6 d r11:r12 c' r9:r10 d' Note: do not write to r[] here, it may overlap with a[] */ /* A - interleaved with B */ ldr r7, [r1, #0*4] @ a[0] ldr r8, [r2, #9*4] @ b[9] ldr r0, [r1, #1*4] @ a[1] umull r5, r6, r7, r8 @ d = a[0] * b[9] ldr r14, [r2, #8*4] @ b[8] umull r9, r10, r0, r8 @ d' = a[1] * b[9] ldr r7, [r1, #2*4] @ a[2] umlal r5, r6, r0, r14 @ d += a[1] * b[8] ldr r8, [r2, #7*4] @ b[7] umlal r9, r10, r7, r14 @ d' += a[2] * b[8] ldr r0, [r1, #3*4] @ a[3] umlal r5, r6, r7, r8 @ d += a[2] * b[7] ldr r14, [r2, #6*4] @ b[6] umlal r9, r10, r0, r8 @ d' += a[3] * b[7] ldr r7, [r1, #4*4] @ a[4] umlal r5, r6, r0, r14 @ d += a[3] * b[6] ldr r8, [r2, #5*4] @ b[5] umlal r9, r10, r7, r14 @ d' += a[4] * b[6] ldr r0, [r1, #5*4] @ a[5] umlal r5, r6, r7, r8 @ d += a[4] * b[5] ldr r14, [r2, #4*4] @ b[4] umlal r9, r10, r0, r8 @ d' += a[5] * b[5] ldr r7, [r1, #6*4] @ a[6] umlal r5, r6, r0, r14 @ d += a[5] * b[4] ldr r8, [r2, #3*4] @ b[3] umlal r9, r10, r7, r14 @ d' += a[6] * b[4] ldr r0, [r1, #7*4] @ a[7] umlal r5, r6, r7, r8 @ d += a[6] * b[3] ldr r14, [r2, #2*4] @ b[2] umlal r9, r10, r0, r8 @ d' += a[7] * b[3] ldr r7, [r1, #8*4] @ a[8] umlal r5, r6, r0, r14 @ d += a[7] * b[2] ldr r8, [r2, #1*4] @ b[1] umlal r9, r10, r7, r14 @ d' += a[8] * b[2] ldr r0, [r1, #9*4] @ a[9] umlal r5, r6, r7, r8 @ d += a[8] * b[1] ldr r14, [r2, #0*4] @ b[0] umlal r9, r10, r0, r8 @ d' += a[9] * b[1] ldr r7, [r1, #0*4] @ a[0] umlal r5, r6, r0, r14 @ d += a[9] * b[0] @ r7,r14 used in B bic r0, r5, field_not_M @ t9 = d & M str r0, [sp, #4 + 4*9] mov r5, r5, lsr #26 @ d >>= 26 orr r5, r5, r6, asl #6 mov r6, r6, lsr #26 /* B */ umull r3, r4, r7, r14 @ c = a[0] * b[0] adds r5, r5, r9 @ d += d' adc r6, r6, r10 bic r0, r5, field_not_M @ u0 = d & M mov r5, r5, lsr #26 @ d >>= 26 orr r5, r5, r6, asl #6 mov r6, r6, lsr #26 movw r14, field_R0 @ c += u0 * R0 umlal r3, r4, r0, r14 bic r14, r3, field_not_M @ t0 = c & M str r14, [sp, #4 + 0*4] mov r3, r3, lsr #26 @ c >>= 26 orr r3, r3, r4, asl #6 mov r4, r4, lsr #26 mov r14, field_R1 @ c += u0 * R1 umlal r3, r4, r0, r14 /* C - interleaved with D */ ldr r7, [r1, #0*4] @ a[0] ldr r8, [r2, #2*4] @ b[2] ldr r14, [r2, #1*4] @ b[1] umull r11, r12, r7, r8 @ c' = a[0] * b[2] ldr r0, [r1, #1*4] @ a[1] umlal r3, r4, r7, r14 @ c += a[0] * b[1] ldr r8, [r2, #0*4] @ b[0] umlal r11, r12, r0, r14 @ c' += a[1] * b[1] ldr r7, [r1, #2*4] @ a[2] umlal r3, r4, r0, r8 @ c += a[1] * b[0] ldr r14, [r2, #9*4] @ b[9] umlal r11, r12, r7, r8 @ c' += a[2] * b[0] ldr r0, [r1, #3*4] @ a[3] umlal r5, r6, r7, r14 @ d += a[2] * b[9] ldr r8, [r2, #8*4] @ b[8] umull r9, r10, r0, r14 @ d' = a[3] * b[9] ldr r7, [r1, #4*4] @ a[4] umlal r5, r6, r0, r8 @ d += a[3] * b[8] ldr r14, [r2, #7*4] @ b[7] umlal r9, r10, r7, r8 @ d' += a[4] * b[8] ldr r0, [r1, #5*4] @ a[5] umlal r5, r6, r7, r14 @ d += a[4] * b[7] ldr r8, [r2, #6*4] @ b[6] umlal r9, r10, r0, r14 @ d' += a[5] * b[7] ldr r7, [r1, #6*4] @ a[6] umlal r5, r6, r0, r8 @ d += a[5] * b[6] ldr r14, [r2, #5*4] @ b[5] umlal r9, r10, r7, r8 @ d' += a[6] * b[6] ldr r0, [r1, #7*4] @ a[7] umlal r5, r6, r7, r14 @ d += a[6] * b[5] ldr r8, [r2, #4*4] @ b[4] umlal r9, r10, r0, r14 @ d' += a[7] * b[5] ldr r7, [r1, #8*4] @ a[8] umlal r5, r6, r0, r8 @ d += a[7] * b[4] ldr r14, [r2, #3*4] @ b[3] umlal r9, r10, r7, r8 @ d' += a[8] * b[4] ldr r0, [r1, #9*4] @ a[9] umlal r5, r6, r7, r14 @ d += a[8] * b[3] ldr r8, [r2, #2*4] @ b[2] umlal r9, r10, r0, r14 @ d' += a[9] * b[3] umlal r5, r6, r0, r8 @ d += a[9] * b[2] bic r0, r5, field_not_M @ u1 = d & M mov r5, r5, lsr #26 @ d >>= 26 orr r5, r5, r6, asl #6 mov r6, r6, lsr #26 movw r14, field_R0 @ c += u1 * R0 umlal r3, r4, r0, r14 bic r14, r3, field_not_M @ t1 = c & M str r14, [sp, #4 + 1*4] mov r3, r3, lsr #26 @ c >>= 26 orr r3, r3, r4, asl #6 mov r4, r4, lsr #26 mov r14, field_R1 @ c += u1 * R1 umlal r3, r4, r0, r14 /* D */ adds r3, r3, r11 @ c += c' adc r4, r4, r12 adds r5, r5, r9 @ d += d' adc r6, r6, r10 bic r0, r5, field_not_M @ u2 = d & M mov r5, r5, lsr #26 @ d >>= 26 orr r5, r5, r6, asl #6 mov r6, r6, lsr #26 movw r14, field_R0 @ c += u2 * R0 umlal r3, r4, r0, r14 bic r14, r3, field_not_M @ t2 = c & M str r14, [sp, #4 + 2*4] mov r3, r3, lsr #26 @ c >>= 26 orr r3, r3, r4, asl #6 mov r4, r4, lsr #26 mov r14, field_R1 @ c += u2 * R1 umlal r3, r4, r0, r14 /* E - interleaved with F */ ldr r7, [r1, #0*4] @ a[0] ldr r8, [r2, #4*4] @ b[4] umull r11, r12, r7, r8 @ c' = a[0] * b[4] ldr r8, [r2, #3*4] @ b[3] umlal r3, r4, r7, r8 @ c += a[0] * b[3] ldr r7, [r1, #1*4] @ a[1] umlal r11, r12, r7, r8 @ c' += a[1] * b[3] ldr r8, [r2, #2*4] @ b[2] umlal r3, r4, r7, r8 @ c += a[1] * b[2] ldr r7, [r1, #2*4] @ a[2] umlal r11, r12, r7, r8 @ c' += a[2] * b[2] ldr r8, [r2, #1*4] @ b[1] umlal r3, r4, r7, r8 @ c += a[2] * b[1] ldr r7, [r1, #3*4] @ a[3] umlal r11, r12, r7, r8 @ c' += a[3] * b[1] ldr r8, [r2, #0*4] @ b[0] umlal r3, r4, r7, r8 @ c += a[3] * b[0] ldr r7, [r1, #4*4] @ a[4] umlal r11, r12, r7, r8 @ c' += a[4] * b[0] ldr r8, [r2, #9*4] @ b[9] umlal r5, r6, r7, r8 @ d += a[4] * b[9] ldr r7, [r1, #5*4] @ a[5] umull r9, r10, r7, r8 @ d' = a[5] * b[9] ldr r8, [r2, #8*4] @ b[8] umlal r5, r6, r7, r8 @ d += a[5] * b[8] ldr r7, [r1, #6*4] @ a[6] umlal r9, r10, r7, r8 @ d' += a[6] * b[8] ldr r8, [r2, #7*4] @ b[7] umlal r5, r6, r7, r8 @ d += a[6] * b[7] ldr r7, [r1, #7*4] @ a[7] umlal r9, r10, r7, r8 @ d' += a[7] * b[7] ldr r8, [r2, #6*4] @ b[6] umlal r5, r6, r7, r8 @ d += a[7] * b[6] ldr r7, [r1, #8*4] @ a[8] umlal r9, r10, r7, r8 @ d' += a[8] * b[6] ldr r8, [r2, #5*4] @ b[5] umlal r5, r6, r7, r8 @ d += a[8] * b[5] ldr r7, [r1, #9*4] @ a[9] umlal r9, r10, r7, r8 @ d' += a[9] * b[5] ldr r8, [r2, #4*4] @ b[4] umlal r5, r6, r7, r8 @ d += a[9] * b[4] bic r0, r5, field_not_M @ u3 = d & M mov r5, r5, lsr #26 @ d >>= 26 orr r5, r5, r6, asl #6 mov r6, r6, lsr #26 movw r14, field_R0 @ c += u3 * R0 umlal r3, r4, r0, r14 bic r14, r3, field_not_M @ t3 = c & M str r14, [sp, #4 + 3*4] mov r3, r3, lsr #26 @ c >>= 26 orr r3, r3, r4, asl #6 mov r4, r4, lsr #26 mov r14, field_R1 @ c += u3 * R1 umlal r3, r4, r0, r14 /* F */ adds r3, r3, r11 @ c += c' adc r4, r4, r12 adds r5, r5, r9 @ d += d' adc r6, r6, r10 bic r0, r5, field_not_M @ u4 = d & M mov r5, r5, lsr #26 @ d >>= 26 orr r5, r5, r6, asl #6 mov r6, r6, lsr #26 movw r14, field_R0 @ c += u4 * R0 umlal r3, r4, r0, r14 bic r14, r3, field_not_M @ t4 = c & M str r14, [sp, #4 + 4*4] mov r3, r3, lsr #26 @ c >>= 26 orr r3, r3, r4, asl #6 mov r4, r4, lsr #26 mov r14, field_R1 @ c += u4 * R1 umlal r3, r4, r0, r14 /* G - interleaved with H */ ldr r7, [r1, #0*4] @ a[0] ldr r8, [r2, #6*4] @ b[6] ldr r14, [r2, #5*4] @ b[5] umull r11, r12, r7, r8 @ c' = a[0] * b[6] ldr r0, [r1, #1*4] @ a[1] umlal r3, r4, r7, r14 @ c += a[0] * b[5] ldr r8, [r2, #4*4] @ b[4] umlal r11, r12, r0, r14 @ c' += a[1] * b[5] ldr r7, [r1, #2*4] @ a[2] umlal r3, r4, r0, r8 @ c += a[1] * b[4] ldr r14, [r2, #3*4] @ b[3] umlal r11, r12, r7, r8 @ c' += a[2] * b[4] ldr r0, [r1, #3*4] @ a[3] umlal r3, r4, r7, r14 @ c += a[2] * b[3] ldr r8, [r2, #2*4] @ b[2] umlal r11, r12, r0, r14 @ c' += a[3] * b[3] ldr r7, [r1, #4*4] @ a[4] umlal r3, r4, r0, r8 @ c += a[3] * b[2] ldr r14, [r2, #1*4] @ b[1] umlal r11, r12, r7, r8 @ c' += a[4] * b[2] ldr r0, [r1, #5*4] @ a[5] umlal r3, r4, r7, r14 @ c += a[4] * b[1] ldr r8, [r2, #0*4] @ b[0] umlal r11, r12, r0, r14 @ c' += a[5] * b[1] ldr r7, [r1, #6*4] @ a[6] umlal r3, r4, r0, r8 @ c += a[5] * b[0] ldr r14, [r2, #9*4] @ b[9] umlal r11, r12, r7, r8 @ c' += a[6] * b[0] ldr r0, [r1, #7*4] @ a[7] umlal r5, r6, r7, r14 @ d += a[6] * b[9] ldr r8, [r2, #8*4] @ b[8] umull r9, r10, r0, r14 @ d' = a[7] * b[9] ldr r7, [r1, #8*4] @ a[8] umlal r5, r6, r0, r8 @ d += a[7] * b[8] ldr r14, [r2, #7*4] @ b[7] umlal r9, r10, r7, r8 @ d' += a[8] * b[8] ldr r0, [r1, #9*4] @ a[9] umlal r5, r6, r7, r14 @ d += a[8] * b[7] ldr r8, [r2, #6*4] @ b[6] umlal r9, r10, r0, r14 @ d' += a[9] * b[7] umlal r5, r6, r0, r8 @ d += a[9] * b[6] bic r0, r5, field_not_M @ u5 = d & M mov r5, r5, lsr #26 @ d >>= 26 orr r5, r5, r6, asl #6 mov r6, r6, lsr #26 movw r14, field_R0 @ c += u5 * R0 umlal r3, r4, r0, r14 bic r14, r3, field_not_M @ t5 = c & M str r14, [sp, #4 + 5*4] mov r3, r3, lsr #26 @ c >>= 26 orr r3, r3, r4, asl #6 mov r4, r4, lsr #26 mov r14, field_R1 @ c += u5 * R1 umlal r3, r4, r0, r14 /* H */ adds r3, r3, r11 @ c += c' adc r4, r4, r12 adds r5, r5, r9 @ d += d' adc r6, r6, r10 bic r0, r5, field_not_M @ u6 = d & M mov r5, r5, lsr #26 @ d >>= 26 orr r5, r5, r6, asl #6 mov r6, r6, lsr #26 movw r14, field_R0 @ c += u6 * R0 umlal r3, r4, r0, r14 bic r14, r3, field_not_M @ t6 = c & M str r14, [sp, #4 + 6*4] mov r3, r3, lsr #26 @ c >>= 26 orr r3, r3, r4, asl #6 mov r4, r4, lsr #26 mov r14, field_R1 @ c += u6 * R1 umlal r3, r4, r0, r14 /* I - interleaved with J */ ldr r8, [r2, #8*4] @ b[8] ldr r7, [r1, #0*4] @ a[0] ldr r14, [r2, #7*4] @ b[7] umull r11, r12, r7, r8 @ c' = a[0] * b[8] ldr r0, [r1, #1*4] @ a[1] umlal r3, r4, r7, r14 @ c += a[0] * b[7] ldr r8, [r2, #6*4] @ b[6] umlal r11, r12, r0, r14 @ c' += a[1] * b[7] ldr r7, [r1, #2*4] @ a[2] umlal r3, r4, r0, r8 @ c += a[1] * b[6] ldr r14, [r2, #5*4] @ b[5] umlal r11, r12, r7, r8 @ c' += a[2] * b[6] ldr r0, [r1, #3*4] @ a[3] umlal r3, r4, r7, r14 @ c += a[2] * b[5] ldr r8, [r2, #4*4] @ b[4] umlal r11, r12, r0, r14 @ c' += a[3] * b[5] ldr r7, [r1, #4*4] @ a[4] umlal r3, r4, r0, r8 @ c += a[3] * b[4] ldr r14, [r2, #3*4] @ b[3] umlal r11, r12, r7, r8 @ c' += a[4] * b[4] ldr r0, [r1, #5*4] @ a[5] umlal r3, r4, r7, r14 @ c += a[4] * b[3] ldr r8, [r2, #2*4] @ b[2] umlal r11, r12, r0, r14 @ c' += a[5] * b[3] ldr r7, [r1, #6*4] @ a[6] umlal r3, r4, r0, r8 @ c += a[5] * b[2] ldr r14, [r2, #1*4] @ b[1] umlal r11, r12, r7, r8 @ c' += a[6] * b[2] ldr r0, [r1, #7*4] @ a[7] umlal r3, r4, r7, r14 @ c += a[6] * b[1] ldr r8, [r2, #0*4] @ b[0] umlal r11, r12, r0, r14 @ c' += a[7] * b[1] ldr r7, [r1, #8*4] @ a[8] umlal r3, r4, r0, r8 @ c += a[7] * b[0] ldr r14, [r2, #9*4] @ b[9] umlal r11, r12, r7, r8 @ c' += a[8] * b[0] ldr r0, [r1, #9*4] @ a[9] umlal r5, r6, r7, r14 @ d += a[8] * b[9] ldr r8, [r2, #8*4] @ b[8] umull r9, r10, r0, r14 @ d' = a[9] * b[9] umlal r5, r6, r0, r8 @ d += a[9] * b[8] bic r0, r5, field_not_M @ u7 = d & M mov r5, r5, lsr #26 @ d >>= 26 orr r5, r5, r6, asl #6 mov r6, r6, lsr #26 movw r14, field_R0 @ c += u7 * R0 umlal r3, r4, r0, r14 bic r14, r3, field_not_M @ t7 = c & M str r14, [sp, #4 + 7*4] mov r3, r3, lsr #26 @ c >>= 26 orr r3, r3, r4, asl #6 mov r4, r4, lsr #26 mov r14, field_R1 @ c += u7 * R1 umlal r3, r4, r0, r14 /* J */ adds r3, r3, r11 @ c += c' adc r4, r4, r12 adds r5, r5, r9 @ d += d' adc r6, r6, r10 bic r0, r5, field_not_M @ u8 = d & M str r0, [sp, #4 + 8*4] mov r5, r5, lsr #26 @ d >>= 26 orr r5, r5, r6, asl #6 mov r6, r6, lsr #26 movw r14, field_R0 @ c += u8 * R0 umlal r3, r4, r0, r14 /****************************************** * compute and write back result ****************************************** Allocation: r0 r r3:r4 c r5:r6 d r7 t0 r8 t1 r9 t2 r11 u8 r12 t9 r1,r2,r10,r14 scratch Note: do not read from a[] after here, it may overlap with r[] */ ldr r0, [sp, #0] add r1, sp, #4 + 3*4 @ r[3..7] = t3..7, r11=u8, r12=t9 ldmia r1, {r2,r7,r8,r9,r10,r11,r12} add r1, r0, #3*4 stmia r1, {r2,r7,r8,r9,r10} bic r2, r3, field_not_M @ r[8] = c & M str r2, [r0, #8*4] mov r3, r3, lsr #26 @ c >>= 26 orr r3, r3, r4, asl #6 mov r4, r4, lsr #26 mov r14, field_R1 @ c += u8 * R1 umlal r3, r4, r11, r14 movw r14, field_R0 @ c += d * R0 umlal r3, r4, r5, r14 adds r3, r3, r12 @ c += t9 adc r4, r4, #0 add r1, sp, #4 + 0*4 @ r7,r8,r9 = t0,t1,t2 ldmia r1, {r7,r8,r9} ubfx r2, r3, #0, #22 @ r[9] = c & (M >> 4) str r2, [r0, #9*4] mov r3, r3, lsr #22 @ c >>= 22 orr r3, r3, r4, asl #10 mov r4, r4, lsr #22 movw r14, field_R1 << 4 @ c += d * (R1 << 4) umlal r3, r4, r5, r14 movw r14, field_R0 >> 4 @ d = c * (R0 >> 4) + t0 (64x64 multiply+add) umull r5, r6, r3, r14 @ d = c.lo * (R0 >> 4) adds r5, r5, r7 @ d.lo += t0 mla r6, r14, r4, r6 @ d.hi += c.hi * (R0 >> 4) adc r6, r6, 0 @ d.hi += carry bic r2, r5, field_not_M @ r[0] = d & M str r2, [r0, #0*4] mov r5, r5, lsr #26 @ d >>= 26 orr r5, r5, r6, asl #6 mov r6, r6, lsr #26 movw r14, field_R1 >> 4 @ d += c * (R1 >> 4) + t1 (64x64 multiply+add) umull r1, r2, r3, r14 @ tmp = c.lo * (R1 >> 4) adds r5, r5, r8 @ d.lo += t1 adc r6, r6, #0 @ d.hi += carry adds r5, r5, r1 @ d.lo += tmp.lo mla r2, r14, r4, r2 @ tmp.hi += c.hi * (R1 >> 4) adc r6, r6, r2 @ d.hi += carry + tmp.hi bic r2, r5, field_not_M @ r[1] = d & M str r2, [r0, #1*4] mov r5, r5, lsr #26 @ d >>= 26 (ignore hi) orr r5, r5, r6, asl #6 add r5, r5, r9 @ d += t2 str r5, [r0, #2*4] @ r[2] = d add sp, sp, #48 ldmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc} .size secp256k1_fe_mul_inner, .-secp256k1_fe_mul_inner .align 2 .global secp256k1_fe_sqr_inner .type secp256k1_fe_sqr_inner, %function @ Arguments: @ r0 r Can overlap with a @ r1 a @ Stack (total 4+10*4 = 44) @ sp + #0 saved 'r' pointer @ sp + #4 + 4*X t0,t1,t2,t3,t4,t5,t6,t7,u8,t9 secp256k1_fe_sqr_inner: stmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, r14} sub sp, sp, #48 @ frame=44 + alignment str r0, [sp, #0] @ save result address, we need it only at the end /****************************************** * Main computation code. ****************************************** Allocation: r0,r14,r2,r7,r8 scratch r1 a (pointer) r3:r4 c r5:r6 d r11:r12 c' r9:r10 d' Note: do not write to r[] here, it may overlap with a[] */ /* A interleaved with B */ ldr r0, [r1, #1*4] @ a[1]*2 ldr r7, [r1, #0*4] @ a[0] mov r0, r0, asl #1 ldr r14, [r1, #9*4] @ a[9] umull r3, r4, r7, r7 @ c = a[0] * a[0] ldr r8, [r1, #8*4] @ a[8] mov r7, r7, asl #1 umull r5, r6, r7, r14 @ d = a[0]*2 * a[9] ldr r7, [r1, #2*4] @ a[2]*2 umull r9, r10, r0, r14 @ d' = a[1]*2 * a[9] ldr r14, [r1, #7*4] @ a[7] umlal r5, r6, r0, r8 @ d += a[1]*2 * a[8] mov r7, r7, asl #1 ldr r0, [r1, #3*4] @ a[3]*2 umlal r9, r10, r7, r8 @ d' += a[2]*2 * a[8] ldr r8, [r1, #6*4] @ a[6] umlal r5, r6, r7, r14 @ d += a[2]*2 * a[7] mov r0, r0, asl #1 ldr r7, [r1, #4*4] @ a[4]*2 umlal r9, r10, r0, r14 @ d' += a[3]*2 * a[7] ldr r14, [r1, #5*4] @ a[5] mov r7, r7, asl #1 umlal r5, r6, r0, r8 @ d += a[3]*2 * a[6] umlal r9, r10, r7, r8 @ d' += a[4]*2 * a[6] umlal r5, r6, r7, r14 @ d += a[4]*2 * a[5] umlal r9, r10, r14, r14 @ d' += a[5] * a[5] bic r0, r5, field_not_M @ t9 = d & M str r0, [sp, #4 + 9*4] mov r5, r5, lsr #26 @ d >>= 26 orr r5, r5, r6, asl #6 mov r6, r6, lsr #26 /* B */ adds r5, r5, r9 @ d += d' adc r6, r6, r10 bic r0, r5, field_not_M @ u0 = d & M mov r5, r5, lsr #26 @ d >>= 26 orr r5, r5, r6, asl #6 mov r6, r6, lsr #26 movw r14, field_R0 @ c += u0 * R0 umlal r3, r4, r0, r14 bic r14, r3, field_not_M @ t0 = c & M str r14, [sp, #4 + 0*4] mov r3, r3, lsr #26 @ c >>= 26 orr r3, r3, r4, asl #6 mov r4, r4, lsr #26 mov r14, field_R1 @ c += u0 * R1 umlal r3, r4, r0, r14 /* C interleaved with D */ ldr r0, [r1, #0*4] @ a[0]*2 ldr r14, [r1, #1*4] @ a[1] mov r0, r0, asl #1 ldr r8, [r1, #2*4] @ a[2] umlal r3, r4, r0, r14 @ c += a[0]*2 * a[1] mov r7, r8, asl #1 @ a[2]*2 umull r11, r12, r14, r14 @ c' = a[1] * a[1] ldr r14, [r1, #9*4] @ a[9] umlal r11, r12, r0, r8 @ c' += a[0]*2 * a[2] ldr r0, [r1, #3*4] @ a[3]*2 ldr r8, [r1, #8*4] @ a[8] umlal r5, r6, r7, r14 @ d += a[2]*2 * a[9] mov r0, r0, asl #1 ldr r7, [r1, #4*4] @ a[4]*2 umull r9, r10, r0, r14 @ d' = a[3]*2 * a[9] ldr r14, [r1, #7*4] @ a[7] umlal r5, r6, r0, r8 @ d += a[3]*2 * a[8] mov r7, r7, asl #1 ldr r0, [r1, #5*4] @ a[5]*2 umlal r9, r10, r7, r8 @ d' += a[4]*2 * a[8] ldr r8, [r1, #6*4] @ a[6] mov r0, r0, asl #1 umlal r5, r6, r7, r14 @ d += a[4]*2 * a[7] umlal r9, r10, r0, r14 @ d' += a[5]*2 * a[7] umlal r5, r6, r0, r8 @ d += a[5]*2 * a[6] umlal r9, r10, r8, r8 @ d' += a[6] * a[6] bic r0, r5, field_not_M @ u1 = d & M mov r5, r5, lsr #26 @ d >>= 26 orr r5, r5, r6, asl #6 mov r6, r6, lsr #26 movw r14, field_R0 @ c += u1 * R0 umlal r3, r4, r0, r14 bic r14, r3, field_not_M @ t1 = c & M str r14, [sp, #4 + 1*4] mov r3, r3, lsr #26 @ c >>= 26 orr r3, r3, r4, asl #6 mov r4, r4, lsr #26 mov r14, field_R1 @ c += u1 * R1 umlal r3, r4, r0, r14 /* D */ adds r3, r3, r11 @ c += c' adc r4, r4, r12 adds r5, r5, r9 @ d += d' adc r6, r6, r10 bic r0, r5, field_not_M @ u2 = d & M mov r5, r5, lsr #26 @ d >>= 26 orr r5, r5, r6, asl #6 mov r6, r6, lsr #26 movw r14, field_R0 @ c += u2 * R0 umlal r3, r4, r0, r14 bic r14, r3, field_not_M @ t2 = c & M str r14, [sp, #4 + 2*4] mov r3, r3, lsr #26 @ c >>= 26 orr r3, r3, r4, asl #6 mov r4, r4, lsr #26 mov r14, field_R1 @ c += u2 * R1 umlal r3, r4, r0, r14 /* E interleaved with F */ ldr r7, [r1, #0*4] @ a[0]*2 ldr r0, [r1, #1*4] @ a[1]*2 ldr r14, [r1, #2*4] @ a[2] mov r7, r7, asl #1 ldr r8, [r1, #3*4] @ a[3] ldr r2, [r1, #4*4] umlal r3, r4, r7, r8 @ c += a[0]*2 * a[3] mov r0, r0, asl #1 umull r11, r12, r7, r2 @ c' = a[0]*2 * a[4] mov r2, r2, asl #1 @ a[4]*2 umlal r11, r12, r0, r8 @ c' += a[1]*2 * a[3] ldr r8, [r1, #9*4] @ a[9] umlal r3, r4, r0, r14 @ c += a[1]*2 * a[2] ldr r0, [r1, #5*4] @ a[5]*2 umlal r11, r12, r14, r14 @ c' += a[2] * a[2] ldr r14, [r1, #8*4] @ a[8] mov r0, r0, asl #1 umlal r5, r6, r2, r8 @ d += a[4]*2 * a[9] ldr r7, [r1, #6*4] @ a[6]*2 umull r9, r10, r0, r8 @ d' = a[5]*2 * a[9] mov r7, r7, asl #1 ldr r8, [r1, #7*4] @ a[7] umlal r5, r6, r0, r14 @ d += a[5]*2 * a[8] umlal r9, r10, r7, r14 @ d' += a[6]*2 * a[8] umlal r5, r6, r7, r8 @ d += a[6]*2 * a[7] umlal r9, r10, r8, r8 @ d' += a[7] * a[7] bic r0, r5, field_not_M @ u3 = d & M mov r5, r5, lsr #26 @ d >>= 26 orr r5, r5, r6, asl #6 mov r6, r6, lsr #26 movw r14, field_R0 @ c += u3 * R0 umlal r3, r4, r0, r14 bic r14, r3, field_not_M @ t3 = c & M str r14, [sp, #4 + 3*4] mov r3, r3, lsr #26 @ c >>= 26 orr r3, r3, r4, asl #6 mov r4, r4, lsr #26 mov r14, field_R1 @ c += u3 * R1 umlal r3, r4, r0, r14 /* F */ adds r3, r3, r11 @ c += c' adc r4, r4, r12 adds r5, r5, r9 @ d += d' adc r6, r6, r10 bic r0, r5, field_not_M @ u4 = d & M mov r5, r5, lsr #26 @ d >>= 26 orr r5, r5, r6, asl #6 mov r6, r6, lsr #26 movw r14, field_R0 @ c += u4 * R0 umlal r3, r4, r0, r14 bic r14, r3, field_not_M @ t4 = c & M str r14, [sp, #4 + 4*4] mov r3, r3, lsr #26 @ c >>= 26 orr r3, r3, r4, asl #6 mov r4, r4, lsr #26 mov r14, field_R1 @ c += u4 * R1 umlal r3, r4, r0, r14 /* G interleaved with H */ ldr r7, [r1, #0*4] @ a[0]*2 ldr r0, [r1, #1*4] @ a[1]*2 mov r7, r7, asl #1 ldr r8, [r1, #5*4] @ a[5] ldr r2, [r1, #6*4] @ a[6] umlal r3, r4, r7, r8 @ c += a[0]*2 * a[5] ldr r14, [r1, #4*4] @ a[4] mov r0, r0, asl #1 umull r11, r12, r7, r2 @ c' = a[0]*2 * a[6] ldr r7, [r1, #2*4] @ a[2]*2 umlal r11, r12, r0, r8 @ c' += a[1]*2 * a[5] mov r7, r7, asl #1 ldr r8, [r1, #3*4] @ a[3] umlal r3, r4, r0, r14 @ c += a[1]*2 * a[4] mov r0, r2, asl #1 @ a[6]*2 umlal r11, r12, r7, r14 @ c' += a[2]*2 * a[4] ldr r14, [r1, #9*4] @ a[9] umlal r3, r4, r7, r8 @ c += a[2]*2 * a[3] ldr r7, [r1, #7*4] @ a[7]*2 umlal r11, r12, r8, r8 @ c' += a[3] * a[3] mov r7, r7, asl #1 ldr r8, [r1, #8*4] @ a[8] umlal r5, r6, r0, r14 @ d += a[6]*2 * a[9] umull r9, r10, r7, r14 @ d' = a[7]*2 * a[9] umlal r5, r6, r7, r8 @ d += a[7]*2 * a[8] umlal r9, r10, r8, r8 @ d' += a[8] * a[8] bic r0, r5, field_not_M @ u5 = d & M mov r5, r5, lsr #26 @ d >>= 26 orr r5, r5, r6, asl #6 mov r6, r6, lsr #26 movw r14, field_R0 @ c += u5 * R0 umlal r3, r4, r0, r14 bic r14, r3, field_not_M @ t5 = c & M str r14, [sp, #4 + 5*4] mov r3, r3, lsr #26 @ c >>= 26 orr r3, r3, r4, asl #6 mov r4, r4, lsr #26 mov r14, field_R1 @ c += u5 * R1 umlal r3, r4, r0, r14 /* H */ adds r3, r3, r11 @ c += c' adc r4, r4, r12 adds r5, r5, r9 @ d += d' adc r6, r6, r10 bic r0, r5, field_not_M @ u6 = d & M mov r5, r5, lsr #26 @ d >>= 26 orr r5, r5, r6, asl #6 mov r6, r6, lsr #26 movw r14, field_R0 @ c += u6 * R0 umlal r3, r4, r0, r14 bic r14, r3, field_not_M @ t6 = c & M str r14, [sp, #4 + 6*4] mov r3, r3, lsr #26 @ c >>= 26 orr r3, r3, r4, asl #6 mov r4, r4, lsr #26 mov r14, field_R1 @ c += u6 * R1 umlal r3, r4, r0, r14 /* I interleaved with J */ ldr r7, [r1, #0*4] @ a[0]*2 ldr r0, [r1, #1*4] @ a[1]*2 mov r7, r7, asl #1 ldr r8, [r1, #7*4] @ a[7] ldr r2, [r1, #8*4] @ a[8] umlal r3, r4, r7, r8 @ c += a[0]*2 * a[7] ldr r14, [r1, #6*4] @ a[6] mov r0, r0, asl #1 umull r11, r12, r7, r2 @ c' = a[0]*2 * a[8] ldr r7, [r1, #2*4] @ a[2]*2 umlal r11, r12, r0, r8 @ c' += a[1]*2 * a[7] ldr r8, [r1, #5*4] @ a[5] umlal r3, r4, r0, r14 @ c += a[1]*2 * a[6] ldr r0, [r1, #3*4] @ a[3]*2 mov r7, r7, asl #1 umlal r11, r12, r7, r14 @ c' += a[2]*2 * a[6] ldr r14, [r1, #4*4] @ a[4] mov r0, r0, asl #1 umlal r3, r4, r7, r8 @ c += a[2]*2 * a[5] mov r2, r2, asl #1 @ a[8]*2 umlal r11, r12, r0, r8 @ c' += a[3]*2 * a[5] umlal r3, r4, r0, r14 @ c += a[3]*2 * a[4] umlal r11, r12, r14, r14 @ c' += a[4] * a[4] ldr r8, [r1, #9*4] @ a[9] umlal r5, r6, r2, r8 @ d += a[8]*2 * a[9] @ r8 will be used in J bic r0, r5, field_not_M @ u7 = d & M mov r5, r5, lsr #26 @ d >>= 26 orr r5, r5, r6, asl #6 mov r6, r6, lsr #26 movw r14, field_R0 @ c += u7 * R0 umlal r3, r4, r0, r14 bic r14, r3, field_not_M @ t7 = c & M str r14, [sp, #4 + 7*4] mov r3, r3, lsr #26 @ c >>= 26 orr r3, r3, r4, asl #6 mov r4, r4, lsr #26 mov r14, field_R1 @ c += u7 * R1 umlal r3, r4, r0, r14 /* J */ adds r3, r3, r11 @ c += c' adc r4, r4, r12 umlal r5, r6, r8, r8 @ d += a[9] * a[9] bic r0, r5, field_not_M @ u8 = d & M str r0, [sp, #4 + 8*4] mov r5, r5, lsr #26 @ d >>= 26 orr r5, r5, r6, asl #6 mov r6, r6, lsr #26 movw r14, field_R0 @ c += u8 * R0 umlal r3, r4, r0, r14 /****************************************** * compute and write back result ****************************************** Allocation: r0 r r3:r4 c r5:r6 d r7 t0 r8 t1 r9 t2 r11 u8 r12 t9 r1,r2,r10,r14 scratch Note: do not read from a[] after here, it may overlap with r[] */ ldr r0, [sp, #0] add r1, sp, #4 + 3*4 @ r[3..7] = t3..7, r11=u8, r12=t9 ldmia r1, {r2,r7,r8,r9,r10,r11,r12} add r1, r0, #3*4 stmia r1, {r2,r7,r8,r9,r10} bic r2, r3, field_not_M @ r[8] = c & M str r2, [r0, #8*4] mov r3, r3, lsr #26 @ c >>= 26 orr r3, r3, r4, asl #6 mov r4, r4, lsr #26 mov r14, field_R1 @ c += u8 * R1 umlal r3, r4, r11, r14 movw r14, field_R0 @ c += d * R0 umlal r3, r4, r5, r14 adds r3, r3, r12 @ c += t9 adc r4, r4, #0 add r1, sp, #4 + 0*4 @ r7,r8,r9 = t0,t1,t2 ldmia r1, {r7,r8,r9} ubfx r2, r3, #0, #22 @ r[9] = c & (M >> 4) str r2, [r0, #9*4] mov r3, r3, lsr #22 @ c >>= 22 orr r3, r3, r4, asl #10 mov r4, r4, lsr #22 movw r14, field_R1 << 4 @ c += d * (R1 << 4) umlal r3, r4, r5, r14 movw r14, field_R0 >> 4 @ d = c * (R0 >> 4) + t0 (64x64 multiply+add) umull r5, r6, r3, r14 @ d = c.lo * (R0 >> 4) adds r5, r5, r7 @ d.lo += t0 mla r6, r14, r4, r6 @ d.hi += c.hi * (R0 >> 4) adc r6, r6, 0 @ d.hi += carry bic r2, r5, field_not_M @ r[0] = d & M str r2, [r0, #0*4] mov r5, r5, lsr #26 @ d >>= 26 orr r5, r5, r6, asl #6 mov r6, r6, lsr #26 movw r14, field_R1 >> 4 @ d += c * (R1 >> 4) + t1 (64x64 multiply+add) umull r1, r2, r3, r14 @ tmp = c.lo * (R1 >> 4) adds r5, r5, r8 @ d.lo += t1 adc r6, r6, #0 @ d.hi += carry adds r5, r5, r1 @ d.lo += tmp.lo mla r2, r14, r4, r2 @ tmp.hi += c.hi * (R1 >> 4) adc r6, r6, r2 @ d.hi += carry + tmp.hi bic r2, r5, field_not_M @ r[1] = d & M str r2, [r0, #1*4] mov r5, r5, lsr #26 @ d >>= 26 (ignore hi) orr r5, r5, r6, asl #6 add r5, r5, r9 @ d += t2 str r5, [r0, #2*4] @ r[2] = d add sp, sp, #48 ldmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc} .size secp256k1_fe_sqr_inner, .-secp256k1_fe_sqr_inner ================================================ FILE: crypto/secp256k1/libsecp256k1/src/basic-config.h ================================================ /********************************************************************** * Copyright (c) 2013, 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_BASIC_CONFIG_ #define _SECP256K1_BASIC_CONFIG_ #ifdef USE_BASIC_CONFIG #undef USE_ASM_X86_64 #undef USE_ENDOMORPHISM #undef USE_FIELD_10X26 #undef USE_FIELD_5X52 #undef USE_FIELD_INV_BUILTIN #undef USE_FIELD_INV_NUM #undef USE_NUM_GMP #undef USE_NUM_NONE #undef USE_SCALAR_4X64 #undef USE_SCALAR_8X32 #undef USE_SCALAR_INV_BUILTIN #undef USE_SCALAR_INV_NUM #define USE_NUM_NONE 1 #define USE_FIELD_INV_BUILTIN 1 #define USE_SCALAR_INV_BUILTIN 1 #define USE_FIELD_10X26 1 #define USE_SCALAR_8X32 1 #endif // USE_BASIC_CONFIG #endif // _SECP256K1_BASIC_CONFIG_ ================================================ FILE: crypto/secp256k1/libsecp256k1/src/bench.h ================================================ /********************************************************************** * Copyright (c) 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_BENCH_H_ #define _SECP256K1_BENCH_H_ #include #include #include "sys/time.h" static double gettimedouble(void) { struct timeval tv; gettimeofday(&tv, NULL); return tv.tv_usec * 0.000001 + tv.tv_sec; } void print_number(double x) { double y = x; int c = 0; if (y < 0.0) { y = -y; } while (y < 100.0) { y *= 10.0; c++; } printf("%.*f", c, x); } void run_benchmark(char *name, void (*benchmark)(void*), void (*setup)(void*), void (*teardown)(void*), void* data, int count, int iter) { int i; double min = HUGE_VAL; double sum = 0.0; double max = 0.0; for (i = 0; i < count; i++) { double begin, total; if (setup != NULL) { setup(data); } begin = gettimedouble(); benchmark(data); total = gettimedouble() - begin; if (teardown != NULL) { teardown(data); } if (total < min) { min = total; } if (total > max) { max = total; } sum += total; } printf("%s: min ", name); print_number(min * 1000000.0 / iter); printf("us / avg "); print_number((sum / count) * 1000000.0 / iter); printf("us / max "); print_number(max * 1000000.0 / iter); printf("us\n"); } #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/bench_ecdh.c ================================================ /********************************************************************** * Copyright (c) 2015 Pieter Wuille, Andrew Poelstra * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #include #include "include/secp256k1.h" #include "include/secp256k1_ecdh.h" #include "util.h" #include "bench.h" typedef struct { secp256k1_context *ctx; secp256k1_pubkey point; unsigned char scalar[32]; } bench_ecdh_t; static void bench_ecdh_setup(void* arg) { int i; bench_ecdh_t *data = (bench_ecdh_t*)arg; const unsigned char point[] = { 0x03, 0x54, 0x94, 0xc1, 0x5d, 0x32, 0x09, 0x97, 0x06, 0xc2, 0x39, 0x5f, 0x94, 0x34, 0x87, 0x45, 0xfd, 0x75, 0x7c, 0xe3, 0x0e, 0x4e, 0x8c, 0x90, 0xfb, 0xa2, 0xba, 0xd1, 0x84, 0xf8, 0x83, 0xc6, 0x9f }; /* create a context with no capabilities */ data->ctx = secp256k1_context_create(SECP256K1_FLAGS_TYPE_CONTEXT); for (i = 0; i < 32; i++) { data->scalar[i] = i + 1; } CHECK(secp256k1_ec_pubkey_parse(data->ctx, &data->point, point, sizeof(point)) == 1); } static void bench_ecdh(void* arg) { int i; unsigned char res[32]; bench_ecdh_t *data = (bench_ecdh_t*)arg; for (i = 0; i < 20000; i++) { CHECK(secp256k1_ecdh(data->ctx, res, &data->point, data->scalar) == 1); } } int main(void) { bench_ecdh_t data; run_benchmark("ecdh", bench_ecdh, bench_ecdh_setup, NULL, &data, 10, 20000); return 0; } ================================================ FILE: crypto/secp256k1/libsecp256k1/src/bench_internal.c ================================================ /********************************************************************** * Copyright (c) 2014-2015 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #include #include "include/secp256k1.h" #include "util.h" #include "hash_impl.h" #include "num_impl.h" #include "field_impl.h" #include "group_impl.h" #include "scalar_impl.h" #include "ecmult_const_impl.h" #include "ecmult_impl.h" #include "bench.h" #include "secp256k1.c" typedef struct { secp256k1_scalar scalar_x, scalar_y; secp256k1_fe fe_x, fe_y; secp256k1_ge ge_x, ge_y; secp256k1_gej gej_x, gej_y; unsigned char data[64]; int wnaf[256]; } bench_inv_t; void bench_setup(void* arg) { bench_inv_t *data = (bench_inv_t*)arg; static const unsigned char init_x[32] = { 0x02, 0x03, 0x05, 0x07, 0x0b, 0x0d, 0x11, 0x13, 0x17, 0x1d, 0x1f, 0x25, 0x29, 0x2b, 0x2f, 0x35, 0x3b, 0x3d, 0x43, 0x47, 0x49, 0x4f, 0x53, 0x59, 0x61, 0x65, 0x67, 0x6b, 0x6d, 0x71, 0x7f, 0x83 }; static const unsigned char init_y[32] = { 0x82, 0x83, 0x85, 0x87, 0x8b, 0x8d, 0x81, 0x83, 0x97, 0xad, 0xaf, 0xb5, 0xb9, 0xbb, 0xbf, 0xc5, 0xdb, 0xdd, 0xe3, 0xe7, 0xe9, 0xef, 0xf3, 0xf9, 0x11, 0x15, 0x17, 0x1b, 0x1d, 0xb1, 0xbf, 0xd3 }; secp256k1_scalar_set_b32(&data->scalar_x, init_x, NULL); secp256k1_scalar_set_b32(&data->scalar_y, init_y, NULL); secp256k1_fe_set_b32(&data->fe_x, init_x); secp256k1_fe_set_b32(&data->fe_y, init_y); CHECK(secp256k1_ge_set_xo_var(&data->ge_x, &data->fe_x, 0)); CHECK(secp256k1_ge_set_xo_var(&data->ge_y, &data->fe_y, 1)); secp256k1_gej_set_ge(&data->gej_x, &data->ge_x); secp256k1_gej_set_ge(&data->gej_y, &data->ge_y); memcpy(data->data, init_x, 32); memcpy(data->data + 32, init_y, 32); } void bench_scalar_add(void* arg) { int i; bench_inv_t *data = (bench_inv_t*)arg; for (i = 0; i < 2000000; i++) { secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); } } void bench_scalar_negate(void* arg) { int i; bench_inv_t *data = (bench_inv_t*)arg; for (i = 0; i < 2000000; i++) { secp256k1_scalar_negate(&data->scalar_x, &data->scalar_x); } } void bench_scalar_sqr(void* arg) { int i; bench_inv_t *data = (bench_inv_t*)arg; for (i = 0; i < 200000; i++) { secp256k1_scalar_sqr(&data->scalar_x, &data->scalar_x); } } void bench_scalar_mul(void* arg) { int i; bench_inv_t *data = (bench_inv_t*)arg; for (i = 0; i < 200000; i++) { secp256k1_scalar_mul(&data->scalar_x, &data->scalar_x, &data->scalar_y); } } #ifdef USE_ENDOMORPHISM void bench_scalar_split(void* arg) { int i; bench_inv_t *data = (bench_inv_t*)arg; for (i = 0; i < 20000; i++) { secp256k1_scalar l, r; secp256k1_scalar_split_lambda(&l, &r, &data->scalar_x); secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); } } #endif void bench_scalar_inverse(void* arg) { int i; bench_inv_t *data = (bench_inv_t*)arg; for (i = 0; i < 2000; i++) { secp256k1_scalar_inverse(&data->scalar_x, &data->scalar_x); secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); } } void bench_scalar_inverse_var(void* arg) { int i; bench_inv_t *data = (bench_inv_t*)arg; for (i = 0; i < 2000; i++) { secp256k1_scalar_inverse_var(&data->scalar_x, &data->scalar_x); secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); } } void bench_field_normalize(void* arg) { int i; bench_inv_t *data = (bench_inv_t*)arg; for (i = 0; i < 2000000; i++) { secp256k1_fe_normalize(&data->fe_x); } } void bench_field_normalize_weak(void* arg) { int i; bench_inv_t *data = (bench_inv_t*)arg; for (i = 0; i < 2000000; i++) { secp256k1_fe_normalize_weak(&data->fe_x); } } void bench_field_mul(void* arg) { int i; bench_inv_t *data = (bench_inv_t*)arg; for (i = 0; i < 200000; i++) { secp256k1_fe_mul(&data->fe_x, &data->fe_x, &data->fe_y); } } void bench_field_sqr(void* arg) { int i; bench_inv_t *data = (bench_inv_t*)arg; for (i = 0; i < 200000; i++) { secp256k1_fe_sqr(&data->fe_x, &data->fe_x); } } void bench_field_inverse(void* arg) { int i; bench_inv_t *data = (bench_inv_t*)arg; for (i = 0; i < 20000; i++) { secp256k1_fe_inv(&data->fe_x, &data->fe_x); secp256k1_fe_add(&data->fe_x, &data->fe_y); } } void bench_field_inverse_var(void* arg) { int i; bench_inv_t *data = (bench_inv_t*)arg; for (i = 0; i < 20000; i++) { secp256k1_fe_inv_var(&data->fe_x, &data->fe_x); secp256k1_fe_add(&data->fe_x, &data->fe_y); } } void bench_field_sqrt(void* arg) { int i; bench_inv_t *data = (bench_inv_t*)arg; for (i = 0; i < 20000; i++) { secp256k1_fe_sqrt(&data->fe_x, &data->fe_x); secp256k1_fe_add(&data->fe_x, &data->fe_y); } } void bench_group_double_var(void* arg) { int i; bench_inv_t *data = (bench_inv_t*)arg; for (i = 0; i < 200000; i++) { secp256k1_gej_double_var(&data->gej_x, &data->gej_x, NULL); } } void bench_group_add_var(void* arg) { int i; bench_inv_t *data = (bench_inv_t*)arg; for (i = 0; i < 200000; i++) { secp256k1_gej_add_var(&data->gej_x, &data->gej_x, &data->gej_y, NULL); } } void bench_group_add_affine(void* arg) { int i; bench_inv_t *data = (bench_inv_t*)arg; for (i = 0; i < 200000; i++) { secp256k1_gej_add_ge(&data->gej_x, &data->gej_x, &data->ge_y); } } void bench_group_add_affine_var(void* arg) { int i; bench_inv_t *data = (bench_inv_t*)arg; for (i = 0; i < 200000; i++) { secp256k1_gej_add_ge_var(&data->gej_x, &data->gej_x, &data->ge_y, NULL); } } void bench_group_jacobi_var(void* arg) { int i; bench_inv_t *data = (bench_inv_t*)arg; for (i = 0; i < 20000; i++) { secp256k1_gej_has_quad_y_var(&data->gej_x); } } void bench_ecmult_wnaf(void* arg) { int i; bench_inv_t *data = (bench_inv_t*)arg; for (i = 0; i < 20000; i++) { secp256k1_ecmult_wnaf(data->wnaf, 256, &data->scalar_x, WINDOW_A); secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); } } void bench_wnaf_const(void* arg) { int i; bench_inv_t *data = (bench_inv_t*)arg; for (i = 0; i < 20000; i++) { secp256k1_wnaf_const(data->wnaf, data->scalar_x, WINDOW_A); secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); } } void bench_sha256(void* arg) { int i; bench_inv_t *data = (bench_inv_t*)arg; secp256k1_sha256_t sha; for (i = 0; i < 20000; i++) { secp256k1_sha256_initialize(&sha); secp256k1_sha256_write(&sha, data->data, 32); secp256k1_sha256_finalize(&sha, data->data); } } void bench_hmac_sha256(void* arg) { int i; bench_inv_t *data = (bench_inv_t*)arg; secp256k1_hmac_sha256_t hmac; for (i = 0; i < 20000; i++) { secp256k1_hmac_sha256_initialize(&hmac, data->data, 32); secp256k1_hmac_sha256_write(&hmac, data->data, 32); secp256k1_hmac_sha256_finalize(&hmac, data->data); } } void bench_rfc6979_hmac_sha256(void* arg) { int i; bench_inv_t *data = (bench_inv_t*)arg; secp256k1_rfc6979_hmac_sha256_t rng; for (i = 0; i < 20000; i++) { secp256k1_rfc6979_hmac_sha256_initialize(&rng, data->data, 64); secp256k1_rfc6979_hmac_sha256_generate(&rng, data->data, 32); } } void bench_context_verify(void* arg) { int i; (void)arg; for (i = 0; i < 20; i++) { secp256k1_context_destroy(secp256k1_context_create(SECP256K1_CONTEXT_VERIFY)); } } void bench_context_sign(void* arg) { int i; (void)arg; for (i = 0; i < 200; i++) { secp256k1_context_destroy(secp256k1_context_create(SECP256K1_CONTEXT_SIGN)); } } #ifndef USE_NUM_NONE void bench_num_jacobi(void* arg) { int i; bench_inv_t *data = (bench_inv_t*)arg; secp256k1_num nx, norder; secp256k1_scalar_get_num(&nx, &data->scalar_x); secp256k1_scalar_order_get_num(&norder); secp256k1_scalar_get_num(&norder, &data->scalar_y); for (i = 0; i < 200000; i++) { secp256k1_num_jacobi(&nx, &norder); } } #endif int have_flag(int argc, char** argv, char *flag) { char** argm = argv + argc; argv++; if (argv == argm) { return 1; } while (argv != NULL && argv != argm) { if (strcmp(*argv, flag) == 0) { return 1; } argv++; } return 0; } int main(int argc, char **argv) { bench_inv_t data; if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "add")) run_benchmark("scalar_add", bench_scalar_add, bench_setup, NULL, &data, 10, 2000000); if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "negate")) run_benchmark("scalar_negate", bench_scalar_negate, bench_setup, NULL, &data, 10, 2000000); if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "sqr")) run_benchmark("scalar_sqr", bench_scalar_sqr, bench_setup, NULL, &data, 10, 200000); if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "mul")) run_benchmark("scalar_mul", bench_scalar_mul, bench_setup, NULL, &data, 10, 200000); #ifdef USE_ENDOMORPHISM if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "split")) run_benchmark("scalar_split", bench_scalar_split, bench_setup, NULL, &data, 10, 20000); #endif if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "inverse")) run_benchmark("scalar_inverse", bench_scalar_inverse, bench_setup, NULL, &data, 10, 2000); if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "inverse")) run_benchmark("scalar_inverse_var", bench_scalar_inverse_var, bench_setup, NULL, &data, 10, 2000); if (have_flag(argc, argv, "field") || have_flag(argc, argv, "normalize")) run_benchmark("field_normalize", bench_field_normalize, bench_setup, NULL, &data, 10, 2000000); if (have_flag(argc, argv, "field") || have_flag(argc, argv, "normalize")) run_benchmark("field_normalize_weak", bench_field_normalize_weak, bench_setup, NULL, &data, 10, 2000000); if (have_flag(argc, argv, "field") || have_flag(argc, argv, "sqr")) run_benchmark("field_sqr", bench_field_sqr, bench_setup, NULL, &data, 10, 200000); if (have_flag(argc, argv, "field") || have_flag(argc, argv, "mul")) run_benchmark("field_mul", bench_field_mul, bench_setup, NULL, &data, 10, 200000); if (have_flag(argc, argv, "field") || have_flag(argc, argv, "inverse")) run_benchmark("field_inverse", bench_field_inverse, bench_setup, NULL, &data, 10, 20000); if (have_flag(argc, argv, "field") || have_flag(argc, argv, "inverse")) run_benchmark("field_inverse_var", bench_field_inverse_var, bench_setup, NULL, &data, 10, 20000); if (have_flag(argc, argv, "field") || have_flag(argc, argv, "sqrt")) run_benchmark("field_sqrt", bench_field_sqrt, bench_setup, NULL, &data, 10, 20000); if (have_flag(argc, argv, "group") || have_flag(argc, argv, "double")) run_benchmark("group_double_var", bench_group_double_var, bench_setup, NULL, &data, 10, 200000); if (have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_var", bench_group_add_var, bench_setup, NULL, &data, 10, 200000); if (have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_affine", bench_group_add_affine, bench_setup, NULL, &data, 10, 200000); if (have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_affine_var", bench_group_add_affine_var, bench_setup, NULL, &data, 10, 200000); if (have_flag(argc, argv, "group") || have_flag(argc, argv, "jacobi")) run_benchmark("group_jacobi_var", bench_group_jacobi_var, bench_setup, NULL, &data, 10, 20000); if (have_flag(argc, argv, "ecmult") || have_flag(argc, argv, "wnaf")) run_benchmark("wnaf_const", bench_wnaf_const, bench_setup, NULL, &data, 10, 20000); if (have_flag(argc, argv, "ecmult") || have_flag(argc, argv, "wnaf")) run_benchmark("ecmult_wnaf", bench_ecmult_wnaf, bench_setup, NULL, &data, 10, 20000); if (have_flag(argc, argv, "hash") || have_flag(argc, argv, "sha256")) run_benchmark("hash_sha256", bench_sha256, bench_setup, NULL, &data, 10, 20000); if (have_flag(argc, argv, "hash") || have_flag(argc, argv, "hmac")) run_benchmark("hash_hmac_sha256", bench_hmac_sha256, bench_setup, NULL, &data, 10, 20000); if (have_flag(argc, argv, "hash") || have_flag(argc, argv, "rng6979")) run_benchmark("hash_rfc6979_hmac_sha256", bench_rfc6979_hmac_sha256, bench_setup, NULL, &data, 10, 20000); if (have_flag(argc, argv, "context") || have_flag(argc, argv, "verify")) run_benchmark("context_verify", bench_context_verify, bench_setup, NULL, &data, 10, 20); if (have_flag(argc, argv, "context") || have_flag(argc, argv, "sign")) run_benchmark("context_sign", bench_context_sign, bench_setup, NULL, &data, 10, 200); #ifndef USE_NUM_NONE if (have_flag(argc, argv, "num") || have_flag(argc, argv, "jacobi")) run_benchmark("num_jacobi", bench_num_jacobi, bench_setup, NULL, &data, 10, 200000); #endif return 0; } ================================================ FILE: crypto/secp256k1/libsecp256k1/src/bench_recover.c ================================================ /********************************************************************** * Copyright (c) 2014-2015 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #include "include/secp256k1.h" #include "include/secp256k1_recovery.h" #include "util.h" #include "bench.h" typedef struct { secp256k1_context *ctx; unsigned char msg[32]; unsigned char sig[64]; } bench_recover_t; void bench_recover(void* arg) { int i; bench_recover_t *data = (bench_recover_t*)arg; secp256k1_pubkey pubkey; unsigned char pubkeyc[33]; for (i = 0; i < 20000; i++) { int j; size_t pubkeylen = 33; secp256k1_ecdsa_recoverable_signature sig; CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(data->ctx, &sig, data->sig, i % 2)); CHECK(secp256k1_ecdsa_recover(data->ctx, &pubkey, &sig, data->msg)); CHECK(secp256k1_ec_pubkey_serialize(data->ctx, pubkeyc, &pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED)); for (j = 0; j < 32; j++) { data->sig[j + 32] = data->msg[j]; /* Move former message to S. */ data->msg[j] = data->sig[j]; /* Move former R to message. */ data->sig[j] = pubkeyc[j + 1]; /* Move recovered pubkey X coordinate to R (which must be a valid X coordinate). */ } } } void bench_recover_setup(void* arg) { int i; bench_recover_t *data = (bench_recover_t*)arg; for (i = 0; i < 32; i++) { data->msg[i] = 1 + i; } for (i = 0; i < 64; i++) { data->sig[i] = 65 + i; } } int main(void) { bench_recover_t data; data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY); run_benchmark("ecdsa_recover", bench_recover, bench_recover_setup, NULL, &data, 10, 20000); secp256k1_context_destroy(data.ctx); return 0; } ================================================ FILE: crypto/secp256k1/libsecp256k1/src/bench_schnorr_verify.c ================================================ /********************************************************************** * Copyright (c) 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #include #include #include "include/secp256k1.h" #include "include/secp256k1_schnorr.h" #include "util.h" #include "bench.h" typedef struct { unsigned char key[32]; unsigned char sig[64]; unsigned char pubkey[33]; size_t pubkeylen; } benchmark_schnorr_sig_t; typedef struct { secp256k1_context *ctx; unsigned char msg[32]; benchmark_schnorr_sig_t sigs[64]; int numsigs; } benchmark_schnorr_verify_t; static void benchmark_schnorr_init(void* arg) { int i, k; benchmark_schnorr_verify_t* data = (benchmark_schnorr_verify_t*)arg; for (i = 0; i < 32; i++) { data->msg[i] = 1 + i; } for (k = 0; k < data->numsigs; k++) { secp256k1_pubkey pubkey; for (i = 0; i < 32; i++) { data->sigs[k].key[i] = 33 + i + k; } secp256k1_schnorr_sign(data->ctx, data->sigs[k].sig, data->msg, data->sigs[k].key, NULL, NULL); data->sigs[k].pubkeylen = 33; CHECK(secp256k1_ec_pubkey_create(data->ctx, &pubkey, data->sigs[k].key)); CHECK(secp256k1_ec_pubkey_serialize(data->ctx, data->sigs[k].pubkey, &data->sigs[k].pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED)); } } static void benchmark_schnorr_verify(void* arg) { int i; benchmark_schnorr_verify_t* data = (benchmark_schnorr_verify_t*)arg; for (i = 0; i < 20000 / data->numsigs; i++) { secp256k1_pubkey pubkey; data->sigs[0].sig[(i >> 8) % 64] ^= (i & 0xFF); CHECK(secp256k1_ec_pubkey_parse(data->ctx, &pubkey, data->sigs[0].pubkey, data->sigs[0].pubkeylen)); CHECK(secp256k1_schnorr_verify(data->ctx, data->sigs[0].sig, data->msg, &pubkey) == ((i & 0xFF) == 0)); data->sigs[0].sig[(i >> 8) % 64] ^= (i & 0xFF); } } int main(void) { benchmark_schnorr_verify_t data; data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); data.numsigs = 1; run_benchmark("schnorr_verify", benchmark_schnorr_verify, benchmark_schnorr_init, NULL, &data, 10, 20000); secp256k1_context_destroy(data.ctx); return 0; } ================================================ FILE: crypto/secp256k1/libsecp256k1/src/bench_sign.c ================================================ /********************************************************************** * Copyright (c) 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #include "include/secp256k1.h" #include "util.h" #include "bench.h" typedef struct { secp256k1_context* ctx; unsigned char msg[32]; unsigned char key[32]; } bench_sign_t; static void bench_sign_setup(void* arg) { int i; bench_sign_t *data = (bench_sign_t*)arg; for (i = 0; i < 32; i++) { data->msg[i] = i + 1; } for (i = 0; i < 32; i++) { data->key[i] = i + 65; } } static void bench_sign(void* arg) { int i; bench_sign_t *data = (bench_sign_t*)arg; unsigned char sig[74]; for (i = 0; i < 20000; i++) { size_t siglen = 74; int j; secp256k1_ecdsa_signature signature; CHECK(secp256k1_ecdsa_sign(data->ctx, &signature, data->msg, data->key, NULL, NULL)); CHECK(secp256k1_ecdsa_signature_serialize_der(data->ctx, sig, &siglen, &signature)); for (j = 0; j < 32; j++) { data->msg[j] = sig[j]; data->key[j] = sig[j + 32]; } } } int main(void) { bench_sign_t data; data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); run_benchmark("ecdsa_sign", bench_sign, bench_sign_setup, NULL, &data, 10, 20000); secp256k1_context_destroy(data.ctx); return 0; } ================================================ FILE: crypto/secp256k1/libsecp256k1/src/bench_verify.c ================================================ /********************************************************************** * Copyright (c) 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #include #include #include "include/secp256k1.h" #include "util.h" #include "bench.h" #ifdef ENABLE_OPENSSL_TESTS #include #include #include #endif typedef struct { secp256k1_context *ctx; unsigned char msg[32]; unsigned char key[32]; unsigned char sig[72]; size_t siglen; unsigned char pubkey[33]; size_t pubkeylen; #ifdef ENABLE_OPENSSL_TESTS EC_GROUP* ec_group; #endif } benchmark_verify_t; static void benchmark_verify(void* arg) { int i; benchmark_verify_t* data = (benchmark_verify_t*)arg; for (i = 0; i < 20000; i++) { secp256k1_pubkey pubkey; secp256k1_ecdsa_signature sig; data->sig[data->siglen - 1] ^= (i & 0xFF); data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF); data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF); CHECK(secp256k1_ec_pubkey_parse(data->ctx, &pubkey, data->pubkey, data->pubkeylen) == 1); CHECK(secp256k1_ecdsa_signature_parse_der(data->ctx, &sig, data->sig, data->siglen) == 1); CHECK(secp256k1_ecdsa_verify(data->ctx, &sig, data->msg, &pubkey) == (i == 0)); data->sig[data->siglen - 1] ^= (i & 0xFF); data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF); data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF); } } #ifdef ENABLE_OPENSSL_TESTS static void benchmark_verify_openssl(void* arg) { int i; benchmark_verify_t* data = (benchmark_verify_t*)arg; for (i = 0; i < 20000; i++) { data->sig[data->siglen - 1] ^= (i & 0xFF); data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF); data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF); { EC_KEY *pkey = EC_KEY_new(); const unsigned char *pubkey = &data->pubkey[0]; int result; CHECK(pkey != NULL); result = EC_KEY_set_group(pkey, data->ec_group); CHECK(result); result = (o2i_ECPublicKey(&pkey, &pubkey, data->pubkeylen)) != NULL; CHECK(result); result = ECDSA_verify(0, &data->msg[0], sizeof(data->msg), &data->sig[0], data->siglen, pkey) == (i == 0); CHECK(result); EC_KEY_free(pkey); } data->sig[data->siglen - 1] ^= (i & 0xFF); data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF); data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF); } } #endif int main(void) { int i; secp256k1_pubkey pubkey; secp256k1_ecdsa_signature sig; benchmark_verify_t data; data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); for (i = 0; i < 32; i++) { data.msg[i] = 1 + i; } for (i = 0; i < 32; i++) { data.key[i] = 33 + i; } data.siglen = 72; CHECK(secp256k1_ecdsa_sign(data.ctx, &sig, data.msg, data.key, NULL, NULL)); CHECK(secp256k1_ecdsa_signature_serialize_der(data.ctx, data.sig, &data.siglen, &sig)); CHECK(secp256k1_ec_pubkey_create(data.ctx, &pubkey, data.key)); data.pubkeylen = 33; CHECK(secp256k1_ec_pubkey_serialize(data.ctx, data.pubkey, &data.pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED) == 1); run_benchmark("ecdsa_verify", benchmark_verify, NULL, NULL, &data, 10, 20000); #ifdef ENABLE_OPENSSL_TESTS data.ec_group = EC_GROUP_new_by_curve_name(NID_secp256k1); run_benchmark("ecdsa_verify_openssl", benchmark_verify_openssl, NULL, NULL, &data, 10, 20000); EC_GROUP_free(data.ec_group); #endif secp256k1_context_destroy(data.ctx); return 0; } ================================================ FILE: crypto/secp256k1/libsecp256k1/src/ecdsa.h ================================================ /********************************************************************** * Copyright (c) 2013, 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_ECDSA_ #define _SECP256K1_ECDSA_ #include #include "scalar.h" #include "group.h" #include "ecmult.h" static int secp256k1_ecdsa_sig_parse(secp256k1_scalar *r, secp256k1_scalar *s, const unsigned char *sig, size_t size); static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, size_t *size, const secp256k1_scalar *r, const secp256k1_scalar *s); static int secp256k1_ecdsa_sig_verify(const secp256k1_ecmult_context *ctx, const secp256k1_scalar* r, const secp256k1_scalar* s, const secp256k1_ge *pubkey, const secp256k1_scalar *message); static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context *ctx, secp256k1_scalar* r, secp256k1_scalar* s, const secp256k1_scalar *seckey, const secp256k1_scalar *message, const secp256k1_scalar *nonce, int *recid); #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/ecdsa_impl.h ================================================ /********************************************************************** * Copyright (c) 2013-2015 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_ECDSA_IMPL_H_ #define _SECP256K1_ECDSA_IMPL_H_ #include "scalar.h" #include "field.h" #include "group.h" #include "ecmult.h" #include "ecmult_gen.h" #include "ecdsa.h" /** Group order for secp256k1 defined as 'n' in "Standards for Efficient Cryptography" (SEC2) 2.7.1 * sage: for t in xrange(1023, -1, -1): * .. p = 2**256 - 2**32 - t * .. if p.is_prime(): * .. print '%x'%p * .. break * 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f' * sage: a = 0 * sage: b = 7 * sage: F = FiniteField (p) * sage: '%x' % (EllipticCurve ([F (a), F (b)]).order()) * 'fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141' */ static const secp256k1_fe secp256k1_ecdsa_const_order_as_fe = SECP256K1_FE_CONST( 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL, 0xBAAEDCE6UL, 0xAF48A03BUL, 0xBFD25E8CUL, 0xD0364141UL ); /** Difference between field and order, values 'p' and 'n' values defined in * "Standards for Efficient Cryptography" (SEC2) 2.7.1. * sage: p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F * sage: a = 0 * sage: b = 7 * sage: F = FiniteField (p) * sage: '%x' % (p - EllipticCurve ([F (a), F (b)]).order()) * '14551231950b75fc4402da1722fc9baee' */ static const secp256k1_fe secp256k1_ecdsa_const_p_minus_order = SECP256K1_FE_CONST( 0, 0, 0, 1, 0x45512319UL, 0x50B75FC4UL, 0x402DA172UL, 0x2FC9BAEEUL ); static int secp256k1_der_read_len(const unsigned char **sigp, const unsigned char *sigend) { int lenleft, b1; size_t ret = 0; if (*sigp >= sigend) { return -1; } b1 = *((*sigp)++); if (b1 == 0xFF) { /* X.690-0207 8.1.3.5.c the value 0xFF shall not be used. */ return -1; } if ((b1 & 0x80) == 0) { /* X.690-0207 8.1.3.4 short form length octets */ return b1; } if (b1 == 0x80) { /* Indefinite length is not allowed in DER. */ return -1; } /* X.690-207 8.1.3.5 long form length octets */ lenleft = b1 & 0x7F; if (lenleft > sigend - *sigp) { return -1; } if (**sigp == 0) { /* Not the shortest possible length encoding. */ return -1; } if ((size_t)lenleft > sizeof(size_t)) { /* The resulting length would exceed the range of a size_t, so * certainly longer than the passed array size. */ return -1; } while (lenleft > 0) { if ((ret >> ((sizeof(size_t) - 1) * 8)) != 0) { } ret = (ret << 8) | **sigp; if (ret + lenleft > (size_t)(sigend - *sigp)) { /* Result exceeds the length of the passed array. */ return -1; } (*sigp)++; lenleft--; } if (ret < 128) { /* Not the shortest possible length encoding. */ return -1; } return ret; } static int secp256k1_der_parse_integer(secp256k1_scalar *r, const unsigned char **sig, const unsigned char *sigend) { int overflow = 0; unsigned char ra[32] = {0}; int rlen; if (*sig == sigend || **sig != 0x02) { /* Not a primitive integer (X.690-0207 8.3.1). */ return 0; } (*sig)++; rlen = secp256k1_der_read_len(sig, sigend); if (rlen <= 0 || (*sig) + rlen > sigend) { /* Exceeds bounds or not at least length 1 (X.690-0207 8.3.1). */ return 0; } if (**sig == 0x00 && rlen > 1 && (((*sig)[1]) & 0x80) == 0x00) { /* Excessive 0x00 padding. */ return 0; } if (**sig == 0xFF && rlen > 1 && (((*sig)[1]) & 0x80) == 0x80) { /* Excessive 0xFF padding. */ return 0; } if ((**sig & 0x80) == 0x80) { /* Negative. */ overflow = 1; } while (rlen > 0 && **sig == 0) { /* Skip leading zero bytes */ rlen--; (*sig)++; } if (rlen > 32) { overflow = 1; } if (!overflow) { memcpy(ra + 32 - rlen, *sig, rlen); secp256k1_scalar_set_b32(r, ra, &overflow); } if (overflow) { secp256k1_scalar_set_int(r, 0); } (*sig) += rlen; return 1; } static int secp256k1_ecdsa_sig_parse(secp256k1_scalar *rr, secp256k1_scalar *rs, const unsigned char *sig, size_t size) { const unsigned char *sigend = sig + size; int rlen; if (sig == sigend || *(sig++) != 0x30) { /* The encoding doesn't start with a constructed sequence (X.690-0207 8.9.1). */ return 0; } rlen = secp256k1_der_read_len(&sig, sigend); if (rlen < 0 || sig + rlen > sigend) { /* Tuple exceeds bounds */ return 0; } if (sig + rlen != sigend) { /* Garbage after tuple. */ return 0; } if (!secp256k1_der_parse_integer(rr, &sig, sigend)) { return 0; } if (!secp256k1_der_parse_integer(rs, &sig, sigend)) { return 0; } if (sig != sigend) { /* Trailing garbage inside tuple. */ return 0; } return 1; } static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, size_t *size, const secp256k1_scalar* ar, const secp256k1_scalar* as) { unsigned char r[33] = {0}, s[33] = {0}; unsigned char *rp = r, *sp = s; size_t lenR = 33, lenS = 33; secp256k1_scalar_get_b32(&r[1], ar); secp256k1_scalar_get_b32(&s[1], as); while (lenR > 1 && rp[0] == 0 && rp[1] < 0x80) { lenR--; rp++; } while (lenS > 1 && sp[0] == 0 && sp[1] < 0x80) { lenS--; sp++; } if (*size < 6+lenS+lenR) { *size = 6 + lenS + lenR; return 0; } *size = 6 + lenS + lenR; sig[0] = 0x30; sig[1] = 4 + lenS + lenR; sig[2] = 0x02; sig[3] = lenR; memcpy(sig+4, rp, lenR); sig[4+lenR] = 0x02; sig[5+lenR] = lenS; memcpy(sig+lenR+6, sp, lenS); return 1; } static int secp256k1_ecdsa_sig_verify(const secp256k1_ecmult_context *ctx, const secp256k1_scalar *sigr, const secp256k1_scalar *sigs, const secp256k1_ge *pubkey, const secp256k1_scalar *message) { unsigned char c[32]; secp256k1_scalar sn, u1, u2; #if !defined(EXHAUSTIVE_TEST_ORDER) secp256k1_fe xr; #endif secp256k1_gej pubkeyj; secp256k1_gej pr; if (secp256k1_scalar_is_zero(sigr) || secp256k1_scalar_is_zero(sigs)) { return 0; } secp256k1_scalar_inverse_var(&sn, sigs); secp256k1_scalar_mul(&u1, &sn, message); secp256k1_scalar_mul(&u2, &sn, sigr); secp256k1_gej_set_ge(&pubkeyj, pubkey); secp256k1_ecmult(ctx, &pr, &pubkeyj, &u2, &u1); if (secp256k1_gej_is_infinity(&pr)) { return 0; } #if defined(EXHAUSTIVE_TEST_ORDER) { secp256k1_scalar computed_r; secp256k1_ge pr_ge; secp256k1_ge_set_gej(&pr_ge, &pr); secp256k1_fe_normalize(&pr_ge.x); secp256k1_fe_get_b32(c, &pr_ge.x); secp256k1_scalar_set_b32(&computed_r, c, NULL); return secp256k1_scalar_eq(sigr, &computed_r); } #else secp256k1_scalar_get_b32(c, sigr); secp256k1_fe_set_b32(&xr, c); /** We now have the recomputed R point in pr, and its claimed x coordinate (modulo n) * in xr. Naively, we would extract the x coordinate from pr (requiring a inversion modulo p), * compute the remainder modulo n, and compare it to xr. However: * * xr == X(pr) mod n * <=> exists h. (xr + h * n < p && xr + h * n == X(pr)) * [Since 2 * n > p, h can only be 0 or 1] * <=> (xr == X(pr)) || (xr + n < p && xr + n == X(pr)) * [In Jacobian coordinates, X(pr) is pr.x / pr.z^2 mod p] * <=> (xr == pr.x / pr.z^2 mod p) || (xr + n < p && xr + n == pr.x / pr.z^2 mod p) * [Multiplying both sides of the equations by pr.z^2 mod p] * <=> (xr * pr.z^2 mod p == pr.x) || (xr + n < p && (xr + n) * pr.z^2 mod p == pr.x) * * Thus, we can avoid the inversion, but we have to check both cases separately. * secp256k1_gej_eq_x implements the (xr * pr.z^2 mod p == pr.x) test. */ if (secp256k1_gej_eq_x_var(&xr, &pr)) { /* xr * pr.z^2 mod p == pr.x, so the signature is valid. */ return 1; } if (secp256k1_fe_cmp_var(&xr, &secp256k1_ecdsa_const_p_minus_order) >= 0) { /* xr + n >= p, so we can skip testing the second case. */ return 0; } secp256k1_fe_add(&xr, &secp256k1_ecdsa_const_order_as_fe); if (secp256k1_gej_eq_x_var(&xr, &pr)) { /* (xr + n) * pr.z^2 mod p == pr.x, so the signature is valid. */ return 1; } return 0; #endif } static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context *ctx, secp256k1_scalar *sigr, secp256k1_scalar *sigs, const secp256k1_scalar *seckey, const secp256k1_scalar *message, const secp256k1_scalar *nonce, int *recid) { unsigned char b[32]; secp256k1_gej rp; secp256k1_ge r; secp256k1_scalar n; int overflow = 0; secp256k1_ecmult_gen(ctx, &rp, nonce); secp256k1_ge_set_gej(&r, &rp); secp256k1_fe_normalize(&r.x); secp256k1_fe_normalize(&r.y); secp256k1_fe_get_b32(b, &r.x); secp256k1_scalar_set_b32(sigr, b, &overflow); /* These two conditions should be checked before calling */ VERIFY_CHECK(!secp256k1_scalar_is_zero(sigr)); VERIFY_CHECK(overflow == 0); if (recid) { /* The overflow condition is cryptographically unreachable as hitting it requires finding the discrete log * of some P where P.x >= order, and only 1 in about 2^127 points meet this criteria. */ *recid = (overflow ? 2 : 0) | (secp256k1_fe_is_odd(&r.y) ? 1 : 0); } secp256k1_scalar_mul(&n, sigr, seckey); secp256k1_scalar_add(&n, &n, message); secp256k1_scalar_inverse(sigs, nonce); secp256k1_scalar_mul(sigs, sigs, &n); secp256k1_scalar_clear(&n); secp256k1_gej_clear(&rp); secp256k1_ge_clear(&r); if (secp256k1_scalar_is_zero(sigs)) { return 0; } if (secp256k1_scalar_is_high(sigs)) { secp256k1_scalar_negate(sigs, sigs); if (recid) { *recid ^= 1; } } return 1; } #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/eckey.h ================================================ /********************************************************************** * Copyright (c) 2013, 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_ECKEY_ #define _SECP256K1_ECKEY_ #include #include "group.h" #include "scalar.h" #include "ecmult.h" #include "ecmult_gen.h" static int secp256k1_eckey_pubkey_parse(secp256k1_ge *elem, const unsigned char *pub, size_t size); static int secp256k1_eckey_pubkey_serialize(secp256k1_ge *elem, unsigned char *pub, size_t *size, int compressed); static int secp256k1_eckey_privkey_tweak_add(secp256k1_scalar *key, const secp256k1_scalar *tweak); static int secp256k1_eckey_pubkey_tweak_add(const secp256k1_ecmult_context *ctx, secp256k1_ge *key, const secp256k1_scalar *tweak); static int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar *key, const secp256k1_scalar *tweak); static int secp256k1_eckey_pubkey_tweak_mul(const secp256k1_ecmult_context *ctx, secp256k1_ge *key, const secp256k1_scalar *tweak); #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/eckey_impl.h ================================================ /********************************************************************** * Copyright (c) 2013, 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_ECKEY_IMPL_H_ #define _SECP256K1_ECKEY_IMPL_H_ #include "eckey.h" #include "scalar.h" #include "field.h" #include "group.h" #include "ecmult_gen.h" static int secp256k1_eckey_pubkey_parse(secp256k1_ge *elem, const unsigned char *pub, size_t size) { if (size == 33 && (pub[0] == 0x02 || pub[0] == 0x03)) { secp256k1_fe x; return secp256k1_fe_set_b32(&x, pub+1) && secp256k1_ge_set_xo_var(elem, &x, pub[0] == 0x03); } else if (size == 65 && (pub[0] == 0x04 || pub[0] == 0x06 || pub[0] == 0x07)) { secp256k1_fe x, y; if (!secp256k1_fe_set_b32(&x, pub+1) || !secp256k1_fe_set_b32(&y, pub+33)) { return 0; } secp256k1_ge_set_xy(elem, &x, &y); if ((pub[0] == 0x06 || pub[0] == 0x07) && secp256k1_fe_is_odd(&y) != (pub[0] == 0x07)) { return 0; } return secp256k1_ge_is_valid_var(elem); } else { return 0; } } static int secp256k1_eckey_pubkey_serialize(secp256k1_ge *elem, unsigned char *pub, size_t *size, int compressed) { if (secp256k1_ge_is_infinity(elem)) { return 0; } secp256k1_fe_normalize_var(&elem->x); secp256k1_fe_normalize_var(&elem->y); secp256k1_fe_get_b32(&pub[1], &elem->x); if (compressed) { *size = 33; pub[0] = 0x02 | (secp256k1_fe_is_odd(&elem->y) ? 0x01 : 0x00); } else { *size = 65; pub[0] = 0x04; secp256k1_fe_get_b32(&pub[33], &elem->y); } return 1; } static int secp256k1_eckey_privkey_tweak_add(secp256k1_scalar *key, const secp256k1_scalar *tweak) { secp256k1_scalar_add(key, key, tweak); if (secp256k1_scalar_is_zero(key)) { return 0; } return 1; } static int secp256k1_eckey_pubkey_tweak_add(const secp256k1_ecmult_context *ctx, secp256k1_ge *key, const secp256k1_scalar *tweak) { secp256k1_gej pt; secp256k1_scalar one; secp256k1_gej_set_ge(&pt, key); secp256k1_scalar_set_int(&one, 1); secp256k1_ecmult(ctx, &pt, &pt, &one, tweak); if (secp256k1_gej_is_infinity(&pt)) { return 0; } secp256k1_ge_set_gej(key, &pt); return 1; } static int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar *key, const secp256k1_scalar *tweak) { if (secp256k1_scalar_is_zero(tweak)) { return 0; } secp256k1_scalar_mul(key, key, tweak); return 1; } static int secp256k1_eckey_pubkey_tweak_mul(const secp256k1_ecmult_context *ctx, secp256k1_ge *key, const secp256k1_scalar *tweak) { secp256k1_scalar zero; secp256k1_gej pt; if (secp256k1_scalar_is_zero(tweak)) { return 0; } secp256k1_scalar_set_int(&zero, 0); secp256k1_gej_set_ge(&pt, key); secp256k1_ecmult(ctx, &pt, &pt, tweak, &zero); secp256k1_ge_set_gej(key, &pt); return 1; } #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/ecmult.h ================================================ /********************************************************************** * Copyright (c) 2013, 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_ECMULT_ #define _SECP256K1_ECMULT_ #include "num.h" #include "group.h" typedef struct { /* For accelerating the computation of a*P + b*G: */ secp256k1_ge_storage (*pre_g)[]; /* odd multiples of the generator */ #ifdef USE_ENDOMORPHISM secp256k1_ge_storage (*pre_g_128)[]; /* odd multiples of 2^128*generator */ #endif } secp256k1_ecmult_context; static void secp256k1_ecmult_context_init(secp256k1_ecmult_context *ctx); static void secp256k1_ecmult_context_build(secp256k1_ecmult_context *ctx, const secp256k1_callback *cb); static void secp256k1_ecmult_context_clone(secp256k1_ecmult_context *dst, const secp256k1_ecmult_context *src, const secp256k1_callback *cb); static void secp256k1_ecmult_context_clear(secp256k1_ecmult_context *ctx); static int secp256k1_ecmult_context_is_built(const secp256k1_ecmult_context *ctx); /** Double multiply: R = na*A + ng*G */ static void secp256k1_ecmult(const secp256k1_ecmult_context *ctx, secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_scalar *na, const secp256k1_scalar *ng); #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/ecmult_const.h ================================================ /********************************************************************** * Copyright (c) 2015 Andrew Poelstra * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_ECMULT_CONST_ #define _SECP256K1_ECMULT_CONST_ #include "scalar.h" #include "group.h" static void secp256k1_ecmult_const(secp256k1_gej *r, const secp256k1_ge *a, const secp256k1_scalar *q); #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/ecmult_const_impl.h ================================================ /********************************************************************** * Copyright (c) 2015 Pieter Wuille, Andrew Poelstra * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_ECMULT_CONST_IMPL_ #define _SECP256K1_ECMULT_CONST_IMPL_ #include "scalar.h" #include "group.h" #include "ecmult_const.h" #include "ecmult_impl.h" #ifdef USE_ENDOMORPHISM #define WNAF_BITS 128 #else #define WNAF_BITS 256 #endif #define WNAF_SIZE(w) ((WNAF_BITS + (w) - 1) / (w)) /* This is like `ECMULT_TABLE_GET_GE` but is constant time */ #define ECMULT_CONST_TABLE_GET_GE(r,pre,n,w) do { \ int m; \ int abs_n = (n) * (((n) > 0) * 2 - 1); \ int idx_n = abs_n / 2; \ secp256k1_fe neg_y; \ VERIFY_CHECK(((n) & 1) == 1); \ VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \ VERIFY_CHECK((n) <= ((1 << ((w)-1)) - 1)); \ VERIFY_SETUP(secp256k1_fe_clear(&(r)->x)); \ VERIFY_SETUP(secp256k1_fe_clear(&(r)->y)); \ for (m = 0; m < ECMULT_TABLE_SIZE(w); m++) { \ /* This loop is used to avoid secret data in array indices. See * the comment in ecmult_gen_impl.h for rationale. */ \ secp256k1_fe_cmov(&(r)->x, &(pre)[m].x, m == idx_n); \ secp256k1_fe_cmov(&(r)->y, &(pre)[m].y, m == idx_n); \ } \ (r)->infinity = 0; \ secp256k1_fe_negate(&neg_y, &(r)->y, 1); \ secp256k1_fe_cmov(&(r)->y, &neg_y, (n) != abs_n); \ } while(0) /** Convert a number to WNAF notation. The number becomes represented by sum(2^{wi} * wnaf[i], i=0..return_val) * with the following guarantees: * - each wnaf[i] an odd integer between -(1 << w) and (1 << w) * - each wnaf[i] is nonzero * - the number of words set is returned; this is always (WNAF_BITS + w - 1) / w * * Adapted from `The Width-w NAF Method Provides Small Memory and Fast Elliptic Scalar * Multiplications Secure against Side Channel Attacks`, Okeya and Tagaki. M. Joye (Ed.) * CT-RSA 2003, LNCS 2612, pp. 328-443, 2003. Springer-Verlagy Berlin Heidelberg 2003 * * Numbers reference steps of `Algorithm SPA-resistant Width-w NAF with Odd Scalar` on pp. 335 */ static int secp256k1_wnaf_const(int *wnaf, secp256k1_scalar s, int w) { int global_sign; int skew = 0; int word = 0; /* 1 2 3 */ int u_last; int u; int flip; int bit; secp256k1_scalar neg_s; int not_neg_one; /* Note that we cannot handle even numbers by negating them to be odd, as is * done in other implementations, since if our scalars were specified to have * width < 256 for performance reasons, their negations would have width 256 * and we'd lose any performance benefit. Instead, we use a technique from * Section 4.2 of the Okeya/Tagaki paper, which is to add either 1 (for even) * or 2 (for odd) to the number we are encoding, returning a skew value indicating * this, and having the caller compensate after doing the multiplication. */ /* Negative numbers will be negated to keep their bit representation below the maximum width */ flip = secp256k1_scalar_is_high(&s); /* We add 1 to even numbers, 2 to odd ones, noting that negation flips parity */ bit = flip ^ !secp256k1_scalar_is_even(&s); /* We check for negative one, since adding 2 to it will cause an overflow */ secp256k1_scalar_negate(&neg_s, &s); not_neg_one = !secp256k1_scalar_is_one(&neg_s); secp256k1_scalar_cadd_bit(&s, bit, not_neg_one); /* If we had negative one, flip == 1, s.d[0] == 0, bit == 1, so caller expects * that we added two to it and flipped it. In fact for -1 these operations are * identical. We only flipped, but since skewing is required (in the sense that * the skew must be 1 or 2, never zero) and flipping is not, we need to change * our flags to claim that we only skewed. */ global_sign = secp256k1_scalar_cond_negate(&s, flip); global_sign *= not_neg_one * 2 - 1; skew = 1 << bit; /* 4 */ u_last = secp256k1_scalar_shr_int(&s, w); while (word * w < WNAF_BITS) { int sign; int even; /* 4.1 4.4 */ u = secp256k1_scalar_shr_int(&s, w); /* 4.2 */ even = ((u & 1) == 0); sign = 2 * (u_last > 0) - 1; u += sign * even; u_last -= sign * even * (1 << w); /* 4.3, adapted for global sign change */ wnaf[word++] = u_last * global_sign; u_last = u; } wnaf[word] = u * global_sign; VERIFY_CHECK(secp256k1_scalar_is_zero(&s)); VERIFY_CHECK(word == WNAF_SIZE(w)); return skew; } static void secp256k1_ecmult_const(secp256k1_gej *r, const secp256k1_ge *a, const secp256k1_scalar *scalar) { secp256k1_ge pre_a[ECMULT_TABLE_SIZE(WINDOW_A)]; secp256k1_ge tmpa; secp256k1_fe Z; int skew_1; int wnaf_1[1 + WNAF_SIZE(WINDOW_A - 1)]; #ifdef USE_ENDOMORPHISM secp256k1_ge pre_a_lam[ECMULT_TABLE_SIZE(WINDOW_A)]; int wnaf_lam[1 + WNAF_SIZE(WINDOW_A - 1)]; int skew_lam; secp256k1_scalar q_1, q_lam; #endif int i; secp256k1_scalar sc = *scalar; /* build wnaf representation for q. */ #ifdef USE_ENDOMORPHISM /* split q into q_1 and q_lam (where q = q_1 + q_lam*lambda, and q_1 and q_lam are ~128 bit) */ secp256k1_scalar_split_lambda(&q_1, &q_lam, &sc); skew_1 = secp256k1_wnaf_const(wnaf_1, q_1, WINDOW_A - 1); skew_lam = secp256k1_wnaf_const(wnaf_lam, q_lam, WINDOW_A - 1); #else skew_1 = secp256k1_wnaf_const(wnaf_1, sc, WINDOW_A - 1); #endif /* Calculate odd multiples of a. * All multiples are brought to the same Z 'denominator', which is stored * in Z. Due to secp256k1' isomorphism we can do all operations pretending * that the Z coordinate was 1, use affine addition formulae, and correct * the Z coordinate of the result once at the end. */ secp256k1_gej_set_ge(r, a); secp256k1_ecmult_odd_multiples_table_globalz_windowa(pre_a, &Z, r); for (i = 0; i < ECMULT_TABLE_SIZE(WINDOW_A); i++) { secp256k1_fe_normalize_weak(&pre_a[i].y); } #ifdef USE_ENDOMORPHISM for (i = 0; i < ECMULT_TABLE_SIZE(WINDOW_A); i++) { secp256k1_ge_mul_lambda(&pre_a_lam[i], &pre_a[i]); } #endif /* first loop iteration (separated out so we can directly set r, rather * than having it start at infinity, get doubled several times, then have * its new value added to it) */ i = wnaf_1[WNAF_SIZE(WINDOW_A - 1)]; VERIFY_CHECK(i != 0); ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a, i, WINDOW_A); secp256k1_gej_set_ge(r, &tmpa); #ifdef USE_ENDOMORPHISM i = wnaf_lam[WNAF_SIZE(WINDOW_A - 1)]; VERIFY_CHECK(i != 0); ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a_lam, i, WINDOW_A); secp256k1_gej_add_ge(r, r, &tmpa); #endif /* remaining loop iterations */ for (i = WNAF_SIZE(WINDOW_A - 1) - 1; i >= 0; i--) { int n; int j; for (j = 0; j < WINDOW_A - 1; ++j) { secp256k1_gej_double_nonzero(r, r, NULL); } n = wnaf_1[i]; ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a, n, WINDOW_A); VERIFY_CHECK(n != 0); secp256k1_gej_add_ge(r, r, &tmpa); #ifdef USE_ENDOMORPHISM n = wnaf_lam[i]; ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a_lam, n, WINDOW_A); VERIFY_CHECK(n != 0); secp256k1_gej_add_ge(r, r, &tmpa); #endif } secp256k1_fe_mul(&r->z, &r->z, &Z); { /* Correct for wNAF skew */ secp256k1_ge correction = *a; secp256k1_ge_storage correction_1_stor; #ifdef USE_ENDOMORPHISM secp256k1_ge_storage correction_lam_stor; #endif secp256k1_ge_storage a2_stor; secp256k1_gej tmpj; secp256k1_gej_set_ge(&tmpj, &correction); secp256k1_gej_double_var(&tmpj, &tmpj, NULL); secp256k1_ge_set_gej(&correction, &tmpj); secp256k1_ge_to_storage(&correction_1_stor, a); #ifdef USE_ENDOMORPHISM secp256k1_ge_to_storage(&correction_lam_stor, a); #endif secp256k1_ge_to_storage(&a2_stor, &correction); /* For odd numbers this is 2a (so replace it), for even ones a (so no-op) */ secp256k1_ge_storage_cmov(&correction_1_stor, &a2_stor, skew_1 == 2); #ifdef USE_ENDOMORPHISM secp256k1_ge_storage_cmov(&correction_lam_stor, &a2_stor, skew_lam == 2); #endif /* Apply the correction */ secp256k1_ge_from_storage(&correction, &correction_1_stor); secp256k1_ge_neg(&correction, &correction); secp256k1_gej_add_ge(r, r, &correction); #ifdef USE_ENDOMORPHISM secp256k1_ge_from_storage(&correction, &correction_lam_stor); secp256k1_ge_neg(&correction, &correction); secp256k1_ge_mul_lambda(&correction, &correction); secp256k1_gej_add_ge(r, r, &correction); #endif } } #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/ecmult_gen.h ================================================ /********************************************************************** * Copyright (c) 2013, 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_ECMULT_GEN_ #define _SECP256K1_ECMULT_GEN_ #include "scalar.h" #include "group.h" typedef struct { /* For accelerating the computation of a*G: * To harden against timing attacks, use the following mechanism: * * Break up the multiplicand into groups of 4 bits, called n_0, n_1, n_2, ..., n_63. * * Compute sum(n_i * 16^i * G + U_i, i=0..63), where: * * U_i = U * 2^i (for i=0..62) * * U_i = U * (1-2^63) (for i=63) * where U is a point with no known corresponding scalar. Note that sum(U_i, i=0..63) = 0. * For each i, and each of the 16 possible values of n_i, (n_i * 16^i * G + U_i) is * precomputed (call it prec(i, n_i)). The formula now becomes sum(prec(i, n_i), i=0..63). * None of the resulting prec group elements have a known scalar, and neither do any of * the intermediate sums while computing a*G. */ secp256k1_ge_storage (*prec)[64][16]; /* prec[j][i] = 16^j * i * G + U_i */ secp256k1_scalar blind; secp256k1_gej initial; } secp256k1_ecmult_gen_context; static void secp256k1_ecmult_gen_context_init(secp256k1_ecmult_gen_context* ctx); static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context* ctx, const secp256k1_callback* cb); static void secp256k1_ecmult_gen_context_clone(secp256k1_ecmult_gen_context *dst, const secp256k1_ecmult_gen_context* src, const secp256k1_callback* cb); static void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context* ctx); static int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_context* ctx); /** Multiply with the generator: R = a*G */ static void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context* ctx, secp256k1_gej *r, const secp256k1_scalar *a); static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context *ctx, const unsigned char *seed32); #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/ecmult_gen_impl.h ================================================ /********************************************************************** * Copyright (c) 2013, 2014, 2015 Pieter Wuille, Gregory Maxwell * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_ECMULT_GEN_IMPL_H_ #define _SECP256K1_ECMULT_GEN_IMPL_H_ #include "scalar.h" #include "group.h" #include "ecmult_gen.h" #include "hash_impl.h" #ifdef USE_ECMULT_STATIC_PRECOMPUTATION #include "ecmult_static_context.h" #endif static void secp256k1_ecmult_gen_context_init(secp256k1_ecmult_gen_context *ctx) { ctx->prec = NULL; } static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context *ctx, const secp256k1_callback* cb) { #ifndef USE_ECMULT_STATIC_PRECOMPUTATION secp256k1_ge prec[1024]; secp256k1_gej gj; secp256k1_gej nums_gej; int i, j; #endif if (ctx->prec != NULL) { return; } #ifndef USE_ECMULT_STATIC_PRECOMPUTATION ctx->prec = (secp256k1_ge_storage (*)[64][16])checked_malloc(cb, sizeof(*ctx->prec)); /* get the generator */ secp256k1_gej_set_ge(&gj, &secp256k1_ge_const_g); /* Construct a group element with no known corresponding scalar (nothing up my sleeve). */ { static const unsigned char nums_b32[33] = "The scalar for this x is unknown"; secp256k1_fe nums_x; secp256k1_ge nums_ge; int r; r = secp256k1_fe_set_b32(&nums_x, nums_b32); (void)r; VERIFY_CHECK(r); r = secp256k1_ge_set_xo_var(&nums_ge, &nums_x, 0); (void)r; VERIFY_CHECK(r); secp256k1_gej_set_ge(&nums_gej, &nums_ge); /* Add G to make the bits in x uniformly distributed. */ secp256k1_gej_add_ge_var(&nums_gej, &nums_gej, &secp256k1_ge_const_g, NULL); } /* compute prec. */ { secp256k1_gej precj[1024]; /* Jacobian versions of prec. */ secp256k1_gej gbase; secp256k1_gej numsbase; gbase = gj; /* 16^j * G */ numsbase = nums_gej; /* 2^j * nums. */ for (j = 0; j < 64; j++) { /* Set precj[j*16 .. j*16+15] to (numsbase, numsbase + gbase, ..., numsbase + 15*gbase). */ precj[j*16] = numsbase; for (i = 1; i < 16; i++) { secp256k1_gej_add_var(&precj[j*16 + i], &precj[j*16 + i - 1], &gbase, NULL); } /* Multiply gbase by 16. */ for (i = 0; i < 4; i++) { secp256k1_gej_double_var(&gbase, &gbase, NULL); } /* Multiply numbase by 2. */ secp256k1_gej_double_var(&numsbase, &numsbase, NULL); if (j == 62) { /* In the last iteration, numsbase is (1 - 2^j) * nums instead. */ secp256k1_gej_neg(&numsbase, &numsbase); secp256k1_gej_add_var(&numsbase, &numsbase, &nums_gej, NULL); } } secp256k1_ge_set_all_gej_var(prec, precj, 1024, cb); } for (j = 0; j < 64; j++) { for (i = 0; i < 16; i++) { secp256k1_ge_to_storage(&(*ctx->prec)[j][i], &prec[j*16 + i]); } } #else (void)cb; ctx->prec = (secp256k1_ge_storage (*)[64][16])secp256k1_ecmult_static_context; #endif secp256k1_ecmult_gen_blind(ctx, NULL); } static int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_context* ctx) { return ctx->prec != NULL; } static void secp256k1_ecmult_gen_context_clone(secp256k1_ecmult_gen_context *dst, const secp256k1_ecmult_gen_context *src, const secp256k1_callback* cb) { if (src->prec == NULL) { dst->prec = NULL; } else { #ifndef USE_ECMULT_STATIC_PRECOMPUTATION dst->prec = (secp256k1_ge_storage (*)[64][16])checked_malloc(cb, sizeof(*dst->prec)); memcpy(dst->prec, src->prec, sizeof(*dst->prec)); #else (void)cb; dst->prec = src->prec; #endif dst->initial = src->initial; dst->blind = src->blind; } } static void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context *ctx) { #ifndef USE_ECMULT_STATIC_PRECOMPUTATION free(ctx->prec); #endif secp256k1_scalar_clear(&ctx->blind); secp256k1_gej_clear(&ctx->initial); ctx->prec = NULL; } static void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context *ctx, secp256k1_gej *r, const secp256k1_scalar *gn) { secp256k1_ge add; secp256k1_ge_storage adds; secp256k1_scalar gnb; int bits; int i, j; memset(&adds, 0, sizeof(adds)); *r = ctx->initial; /* Blind scalar/point multiplication by computing (n-b)G + bG instead of nG. */ secp256k1_scalar_add(&gnb, gn, &ctx->blind); add.infinity = 0; for (j = 0; j < 64; j++) { bits = secp256k1_scalar_get_bits(&gnb, j * 4, 4); for (i = 0; i < 16; i++) { /** This uses a conditional move to avoid any secret data in array indexes. * _Any_ use of secret indexes has been demonstrated to result in timing * sidechannels, even when the cache-line access patterns are uniform. * See also: * "A word of warning", CHES 2013 Rump Session, by Daniel J. Bernstein and Peter Schwabe * (https://cryptojedi.org/peter/data/chesrump-20130822.pdf) and * "Cache Attacks and Countermeasures: the Case of AES", RSA 2006, * by Dag Arne Osvik, Adi Shamir, and Eran Tromer * (http://www.tau.ac.il/~tromer/papers/cache.pdf) */ secp256k1_ge_storage_cmov(&adds, &(*ctx->prec)[j][i], i == bits); } secp256k1_ge_from_storage(&add, &adds); secp256k1_gej_add_ge(r, r, &add); } bits = 0; secp256k1_ge_clear(&add); secp256k1_scalar_clear(&gnb); } /* Setup blinding values for secp256k1_ecmult_gen. */ static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context *ctx, const unsigned char *seed32) { secp256k1_scalar b; secp256k1_gej gb; secp256k1_fe s; unsigned char nonce32[32]; secp256k1_rfc6979_hmac_sha256_t rng; int retry; unsigned char keydata[64] = {0}; if (seed32 == NULL) { /* When seed is NULL, reset the initial point and blinding value. */ secp256k1_gej_set_ge(&ctx->initial, &secp256k1_ge_const_g); secp256k1_gej_neg(&ctx->initial, &ctx->initial); secp256k1_scalar_set_int(&ctx->blind, 1); } /* The prior blinding value (if not reset) is chained forward by including it in the hash. */ secp256k1_scalar_get_b32(nonce32, &ctx->blind); /** Using a CSPRNG allows a failure free interface, avoids needing large amounts of random data, * and guards against weak or adversarial seeds. This is a simpler and safer interface than * asking the caller for blinding values directly and expecting them to retry on failure. */ memcpy(keydata, nonce32, 32); if (seed32 != NULL) { memcpy(keydata + 32, seed32, 32); } secp256k1_rfc6979_hmac_sha256_initialize(&rng, keydata, seed32 ? 64 : 32); memset(keydata, 0, sizeof(keydata)); /* Retry for out of range results to achieve uniformity. */ do { secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32); retry = !secp256k1_fe_set_b32(&s, nonce32); retry |= secp256k1_fe_is_zero(&s); } while (retry); /* This branch true is cryptographically unreachable. Requires sha256_hmac output > Fp. */ /* Randomize the projection to defend against multiplier sidechannels. */ secp256k1_gej_rescale(&ctx->initial, &s); secp256k1_fe_clear(&s); do { secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32); secp256k1_scalar_set_b32(&b, nonce32, &retry); /* A blinding value of 0 works, but would undermine the projection hardening. */ retry |= secp256k1_scalar_is_zero(&b); } while (retry); /* This branch true is cryptographically unreachable. Requires sha256_hmac output > order. */ secp256k1_rfc6979_hmac_sha256_finalize(&rng); memset(nonce32, 0, 32); secp256k1_ecmult_gen(ctx, &gb, &b); secp256k1_scalar_negate(&b, &b); ctx->blind = b; ctx->initial = gb; secp256k1_scalar_clear(&b); secp256k1_gej_clear(&gb); } #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/ecmult_impl.h ================================================ /********************************************************************** * Copyright (c) 2013, 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_ECMULT_IMPL_H_ #define _SECP256K1_ECMULT_IMPL_H_ #include #include "group.h" #include "scalar.h" #include "ecmult.h" #if defined(EXHAUSTIVE_TEST_ORDER) /* We need to lower these values for exhaustive tests because * the tables cannot have infinities in them (this breaks the * affine-isomorphism stuff which tracks z-ratios) */ # if EXHAUSTIVE_TEST_ORDER > 128 # define WINDOW_A 5 # define WINDOW_G 8 # elif EXHAUSTIVE_TEST_ORDER > 8 # define WINDOW_A 4 # define WINDOW_G 4 # else # define WINDOW_A 2 # define WINDOW_G 2 # endif #else /* optimal for 128-bit and 256-bit exponents. */ #define WINDOW_A 5 /** larger numbers may result in slightly better performance, at the cost of exponentially larger precomputed tables. */ #ifdef USE_ENDOMORPHISM /** Two tables for window size 15: 1.375 MiB. */ #define WINDOW_G 15 #else /** One table for window size 16: 1.375 MiB. */ #define WINDOW_G 16 #endif #endif /** The number of entries a table with precomputed multiples needs to have. */ #define ECMULT_TABLE_SIZE(w) (1 << ((w)-2)) /** Fill a table 'prej' with precomputed odd multiples of a. Prej will contain * the values [1*a,3*a,...,(2*n-1)*a], so it space for n values. zr[0] will * contain prej[0].z / a.z. The other zr[i] values = prej[i].z / prej[i-1].z. * Prej's Z values are undefined, except for the last value. */ static void secp256k1_ecmult_odd_multiples_table(int n, secp256k1_gej *prej, secp256k1_fe *zr, const secp256k1_gej *a) { secp256k1_gej d; secp256k1_ge a_ge, d_ge; int i; VERIFY_CHECK(!a->infinity); secp256k1_gej_double_var(&d, a, NULL); /* * Perform the additions on an isomorphism where 'd' is affine: drop the z coordinate * of 'd', and scale the 1P starting value's x/y coordinates without changing its z. */ d_ge.x = d.x; d_ge.y = d.y; d_ge.infinity = 0; secp256k1_ge_set_gej_zinv(&a_ge, a, &d.z); prej[0].x = a_ge.x; prej[0].y = a_ge.y; prej[0].z = a->z; prej[0].infinity = 0; zr[0] = d.z; for (i = 1; i < n; i++) { secp256k1_gej_add_ge_var(&prej[i], &prej[i-1], &d_ge, &zr[i]); } /* * Each point in 'prej' has a z coordinate too small by a factor of 'd.z'. Only * the final point's z coordinate is actually used though, so just update that. */ secp256k1_fe_mul(&prej[n-1].z, &prej[n-1].z, &d.z); } /** Fill a table 'pre' with precomputed odd multiples of a. * * There are two versions of this function: * - secp256k1_ecmult_odd_multiples_table_globalz_windowa which brings its * resulting point set to a single constant Z denominator, stores the X and Y * coordinates as ge_storage points in pre, and stores the global Z in rz. * It only operates on tables sized for WINDOW_A wnaf multiples. * - secp256k1_ecmult_odd_multiples_table_storage_var, which converts its * resulting point set to actually affine points, and stores those in pre. * It operates on tables of any size, but uses heap-allocated temporaries. * * To compute a*P + b*G, we compute a table for P using the first function, * and for G using the second (which requires an inverse, but it only needs to * happen once). */ static void secp256k1_ecmult_odd_multiples_table_globalz_windowa(secp256k1_ge *pre, secp256k1_fe *globalz, const secp256k1_gej *a) { secp256k1_gej prej[ECMULT_TABLE_SIZE(WINDOW_A)]; secp256k1_fe zr[ECMULT_TABLE_SIZE(WINDOW_A)]; /* Compute the odd multiples in Jacobian form. */ secp256k1_ecmult_odd_multiples_table(ECMULT_TABLE_SIZE(WINDOW_A), prej, zr, a); /* Bring them to the same Z denominator. */ secp256k1_ge_globalz_set_table_gej(ECMULT_TABLE_SIZE(WINDOW_A), pre, globalz, prej, zr); } static void secp256k1_ecmult_odd_multiples_table_storage_var(int n, secp256k1_ge_storage *pre, const secp256k1_gej *a, const secp256k1_callback *cb) { secp256k1_gej *prej = (secp256k1_gej*)checked_malloc(cb, sizeof(secp256k1_gej) * n); secp256k1_ge *prea = (secp256k1_ge*)checked_malloc(cb, sizeof(secp256k1_ge) * n); secp256k1_fe *zr = (secp256k1_fe*)checked_malloc(cb, sizeof(secp256k1_fe) * n); int i; /* Compute the odd multiples in Jacobian form. */ secp256k1_ecmult_odd_multiples_table(n, prej, zr, a); /* Convert them in batch to affine coordinates. */ secp256k1_ge_set_table_gej_var(prea, prej, zr, n); /* Convert them to compact storage form. */ for (i = 0; i < n; i++) { secp256k1_ge_to_storage(&pre[i], &prea[i]); } free(prea); free(prej); free(zr); } /** The following two macro retrieves a particular odd multiple from a table * of precomputed multiples. */ #define ECMULT_TABLE_GET_GE(r,pre,n,w) do { \ VERIFY_CHECK(((n) & 1) == 1); \ VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \ VERIFY_CHECK((n) <= ((1 << ((w)-1)) - 1)); \ if ((n) > 0) { \ *(r) = (pre)[((n)-1)/2]; \ } else { \ secp256k1_ge_neg((r), &(pre)[(-(n)-1)/2]); \ } \ } while(0) #define ECMULT_TABLE_GET_GE_STORAGE(r,pre,n,w) do { \ VERIFY_CHECK(((n) & 1) == 1); \ VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \ VERIFY_CHECK((n) <= ((1 << ((w)-1)) - 1)); \ if ((n) > 0) { \ secp256k1_ge_from_storage((r), &(pre)[((n)-1)/2]); \ } else { \ secp256k1_ge_from_storage((r), &(pre)[(-(n)-1)/2]); \ secp256k1_ge_neg((r), (r)); \ } \ } while(0) static void secp256k1_ecmult_context_init(secp256k1_ecmult_context *ctx) { ctx->pre_g = NULL; #ifdef USE_ENDOMORPHISM ctx->pre_g_128 = NULL; #endif } static void secp256k1_ecmult_context_build(secp256k1_ecmult_context *ctx, const secp256k1_callback *cb) { secp256k1_gej gj; if (ctx->pre_g != NULL) { return; } /* get the generator */ secp256k1_gej_set_ge(&gj, &secp256k1_ge_const_g); ctx->pre_g = (secp256k1_ge_storage (*)[])checked_malloc(cb, sizeof((*ctx->pre_g)[0]) * ECMULT_TABLE_SIZE(WINDOW_G)); /* precompute the tables with odd multiples */ secp256k1_ecmult_odd_multiples_table_storage_var(ECMULT_TABLE_SIZE(WINDOW_G), *ctx->pre_g, &gj, cb); #ifdef USE_ENDOMORPHISM { secp256k1_gej g_128j; int i; ctx->pre_g_128 = (secp256k1_ge_storage (*)[])checked_malloc(cb, sizeof((*ctx->pre_g_128)[0]) * ECMULT_TABLE_SIZE(WINDOW_G)); /* calculate 2^128*generator */ g_128j = gj; for (i = 0; i < 128; i++) { secp256k1_gej_double_var(&g_128j, &g_128j, NULL); } secp256k1_ecmult_odd_multiples_table_storage_var(ECMULT_TABLE_SIZE(WINDOW_G), *ctx->pre_g_128, &g_128j, cb); } #endif } static void secp256k1_ecmult_context_clone(secp256k1_ecmult_context *dst, const secp256k1_ecmult_context *src, const secp256k1_callback *cb) { if (src->pre_g == NULL) { dst->pre_g = NULL; } else { size_t size = sizeof((*dst->pre_g)[0]) * ECMULT_TABLE_SIZE(WINDOW_G); dst->pre_g = (secp256k1_ge_storage (*)[])checked_malloc(cb, size); memcpy(dst->pre_g, src->pre_g, size); } #ifdef USE_ENDOMORPHISM if (src->pre_g_128 == NULL) { dst->pre_g_128 = NULL; } else { size_t size = sizeof((*dst->pre_g_128)[0]) * ECMULT_TABLE_SIZE(WINDOW_G); dst->pre_g_128 = (secp256k1_ge_storage (*)[])checked_malloc(cb, size); memcpy(dst->pre_g_128, src->pre_g_128, size); } #endif } static int secp256k1_ecmult_context_is_built(const secp256k1_ecmult_context *ctx) { return ctx->pre_g != NULL; } static void secp256k1_ecmult_context_clear(secp256k1_ecmult_context *ctx) { free(ctx->pre_g); #ifdef USE_ENDOMORPHISM free(ctx->pre_g_128); #endif secp256k1_ecmult_context_init(ctx); } /** Convert a number to WNAF notation. The number becomes represented by sum(2^i * wnaf[i], i=0..bits), * with the following guarantees: * - each wnaf[i] is either 0, or an odd integer between -(1<<(w-1) - 1) and (1<<(w-1) - 1) * - two non-zero entries in wnaf are separated by at least w-1 zeroes. * - the number of set values in wnaf is returned. This number is at most 256, and at most one more * than the number of bits in the (absolute value) of the input. */ static int secp256k1_ecmult_wnaf(int *wnaf, int len, const secp256k1_scalar *a, int w) { secp256k1_scalar s = *a; int last_set_bit = -1; int bit = 0; int sign = 1; int carry = 0; VERIFY_CHECK(wnaf != NULL); VERIFY_CHECK(0 <= len && len <= 256); VERIFY_CHECK(a != NULL); VERIFY_CHECK(2 <= w && w <= 31); memset(wnaf, 0, len * sizeof(wnaf[0])); if (secp256k1_scalar_get_bits(&s, 255, 1)) { secp256k1_scalar_negate(&s, &s); sign = -1; } while (bit < len) { int now; int word; if (secp256k1_scalar_get_bits(&s, bit, 1) == (unsigned int)carry) { bit++; continue; } now = w; if (now > len - bit) { now = len - bit; } word = secp256k1_scalar_get_bits_var(&s, bit, now) + carry; carry = (word >> (w-1)) & 1; word -= carry << w; wnaf[bit] = sign * word; last_set_bit = bit; bit += now; } #ifdef VERIFY CHECK(carry == 0); while (bit < 256) { CHECK(secp256k1_scalar_get_bits(&s, bit++, 1) == 0); } #endif return last_set_bit + 1; } static void secp256k1_ecmult(const secp256k1_ecmult_context *ctx, secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_scalar *na, const secp256k1_scalar *ng) { secp256k1_ge pre_a[ECMULT_TABLE_SIZE(WINDOW_A)]; secp256k1_ge tmpa; secp256k1_fe Z; #ifdef USE_ENDOMORPHISM secp256k1_ge pre_a_lam[ECMULT_TABLE_SIZE(WINDOW_A)]; secp256k1_scalar na_1, na_lam; /* Splitted G factors. */ secp256k1_scalar ng_1, ng_128; int wnaf_na_1[130]; int wnaf_na_lam[130]; int bits_na_1; int bits_na_lam; int wnaf_ng_1[129]; int bits_ng_1; int wnaf_ng_128[129]; int bits_ng_128; #else int wnaf_na[256]; int bits_na; int wnaf_ng[256]; int bits_ng; #endif int i; int bits; #ifdef USE_ENDOMORPHISM /* split na into na_1 and na_lam (where na = na_1 + na_lam*lambda, and na_1 and na_lam are ~128 bit) */ secp256k1_scalar_split_lambda(&na_1, &na_lam, na); /* build wnaf representation for na_1 and na_lam. */ bits_na_1 = secp256k1_ecmult_wnaf(wnaf_na_1, 130, &na_1, WINDOW_A); bits_na_lam = secp256k1_ecmult_wnaf(wnaf_na_lam, 130, &na_lam, WINDOW_A); VERIFY_CHECK(bits_na_1 <= 130); VERIFY_CHECK(bits_na_lam <= 130); bits = bits_na_1; if (bits_na_lam > bits) { bits = bits_na_lam; } #else /* build wnaf representation for na. */ bits_na = secp256k1_ecmult_wnaf(wnaf_na, 256, na, WINDOW_A); bits = bits_na; #endif /* Calculate odd multiples of a. * All multiples are brought to the same Z 'denominator', which is stored * in Z. Due to secp256k1' isomorphism we can do all operations pretending * that the Z coordinate was 1, use affine addition formulae, and correct * the Z coordinate of the result once at the end. * The exception is the precomputed G table points, which are actually * affine. Compared to the base used for other points, they have a Z ratio * of 1/Z, so we can use secp256k1_gej_add_zinv_var, which uses the same * isomorphism to efficiently add with a known Z inverse. */ secp256k1_ecmult_odd_multiples_table_globalz_windowa(pre_a, &Z, a); #ifdef USE_ENDOMORPHISM for (i = 0; i < ECMULT_TABLE_SIZE(WINDOW_A); i++) { secp256k1_ge_mul_lambda(&pre_a_lam[i], &pre_a[i]); } /* split ng into ng_1 and ng_128 (where gn = gn_1 + gn_128*2^128, and gn_1 and gn_128 are ~128 bit) */ secp256k1_scalar_split_128(&ng_1, &ng_128, ng); /* Build wnaf representation for ng_1 and ng_128 */ bits_ng_1 = secp256k1_ecmult_wnaf(wnaf_ng_1, 129, &ng_1, WINDOW_G); bits_ng_128 = secp256k1_ecmult_wnaf(wnaf_ng_128, 129, &ng_128, WINDOW_G); if (bits_ng_1 > bits) { bits = bits_ng_1; } if (bits_ng_128 > bits) { bits = bits_ng_128; } #else bits_ng = secp256k1_ecmult_wnaf(wnaf_ng, 256, ng, WINDOW_G); if (bits_ng > bits) { bits = bits_ng; } #endif secp256k1_gej_set_infinity(r); for (i = bits - 1; i >= 0; i--) { int n; secp256k1_gej_double_var(r, r, NULL); #ifdef USE_ENDOMORPHISM if (i < bits_na_1 && (n = wnaf_na_1[i])) { ECMULT_TABLE_GET_GE(&tmpa, pre_a, n, WINDOW_A); secp256k1_gej_add_ge_var(r, r, &tmpa, NULL); } if (i < bits_na_lam && (n = wnaf_na_lam[i])) { ECMULT_TABLE_GET_GE(&tmpa, pre_a_lam, n, WINDOW_A); secp256k1_gej_add_ge_var(r, r, &tmpa, NULL); } if (i < bits_ng_1 && (n = wnaf_ng_1[i])) { ECMULT_TABLE_GET_GE_STORAGE(&tmpa, *ctx->pre_g, n, WINDOW_G); secp256k1_gej_add_zinv_var(r, r, &tmpa, &Z); } if (i < bits_ng_128 && (n = wnaf_ng_128[i])) { ECMULT_TABLE_GET_GE_STORAGE(&tmpa, *ctx->pre_g_128, n, WINDOW_G); secp256k1_gej_add_zinv_var(r, r, &tmpa, &Z); } #else if (i < bits_na && (n = wnaf_na[i])) { ECMULT_TABLE_GET_GE(&tmpa, pre_a, n, WINDOW_A); secp256k1_gej_add_ge_var(r, r, &tmpa, NULL); } if (i < bits_ng && (n = wnaf_ng[i])) { ECMULT_TABLE_GET_GE_STORAGE(&tmpa, *ctx->pre_g, n, WINDOW_G); secp256k1_gej_add_zinv_var(r, r, &tmpa, &Z); } #endif } if (!r->infinity) { secp256k1_fe_mul(&r->z, &r->z, &Z); } } #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/field.h ================================================ /********************************************************************** * Copyright (c) 2013, 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_FIELD_ #define _SECP256K1_FIELD_ /** Field element module. * * Field elements can be represented in several ways, but code accessing * it (and implementations) need to take certain properties into account: * - Each field element can be normalized or not. * - Each field element has a magnitude, which represents how far away * its representation is away from normalization. Normalized elements * always have a magnitude of 1, but a magnitude of 1 doesn't imply * normality. */ #if defined HAVE_CONFIG_H #include "libsecp256k1-config.h" #endif #if defined(USE_FIELD_10X26) #include "field_10x26.h" #elif defined(USE_FIELD_5X52) #include "field_5x52.h" #else #error "Please select field implementation" #endif #include "util.h" /** Normalize a field element. */ static void secp256k1_fe_normalize(secp256k1_fe *r); /** Weakly normalize a field element: reduce it magnitude to 1, but don't fully normalize. */ static void secp256k1_fe_normalize_weak(secp256k1_fe *r); /** Normalize a field element, without constant-time guarantee. */ static void secp256k1_fe_normalize_var(secp256k1_fe *r); /** Verify whether a field element represents zero i.e. would normalize to a zero value. The field * implementation may optionally normalize the input, but this should not be relied upon. */ static int secp256k1_fe_normalizes_to_zero(secp256k1_fe *r); /** Verify whether a field element represents zero i.e. would normalize to a zero value. The field * implementation may optionally normalize the input, but this should not be relied upon. */ static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe *r); /** Set a field element equal to a small integer. Resulting field element is normalized. */ static void secp256k1_fe_set_int(secp256k1_fe *r, int a); /** Sets a field element equal to zero, initializing all fields. */ static void secp256k1_fe_clear(secp256k1_fe *a); /** Verify whether a field element is zero. Requires the input to be normalized. */ static int secp256k1_fe_is_zero(const secp256k1_fe *a); /** Check the "oddness" of a field element. Requires the input to be normalized. */ static int secp256k1_fe_is_odd(const secp256k1_fe *a); /** Compare two field elements. Requires magnitude-1 inputs. */ static int secp256k1_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b); /** Same as secp256k1_fe_equal, but may be variable time. */ static int secp256k1_fe_equal_var(const secp256k1_fe *a, const secp256k1_fe *b); /** Compare two field elements. Requires both inputs to be normalized */ static int secp256k1_fe_cmp_var(const secp256k1_fe *a, const secp256k1_fe *b); /** Set a field element equal to 32-byte big endian value. If successful, the resulting field element is normalized. */ static int secp256k1_fe_set_b32(secp256k1_fe *r, const unsigned char *a); /** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */ static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe *a); /** Set a field element equal to the additive inverse of another. Takes a maximum magnitude of the input * as an argument. The magnitude of the output is one higher. */ static void secp256k1_fe_negate(secp256k1_fe *r, const secp256k1_fe *a, int m); /** Multiplies the passed field element with a small integer constant. Multiplies the magnitude by that * small integer. */ static void secp256k1_fe_mul_int(secp256k1_fe *r, int a); /** Adds a field element to another. The result has the sum of the inputs' magnitudes as magnitude. */ static void secp256k1_fe_add(secp256k1_fe *r, const secp256k1_fe *a); /** Sets a field element to be the product of two others. Requires the inputs' magnitudes to be at most 8. * The output magnitude is 1 (but not guaranteed to be normalized). */ static void secp256k1_fe_mul(secp256k1_fe *r, const secp256k1_fe *a, const secp256k1_fe * SECP256K1_RESTRICT b); /** Sets a field element to be the square of another. Requires the input's magnitude to be at most 8. * The output magnitude is 1 (but not guaranteed to be normalized). */ static void secp256k1_fe_sqr(secp256k1_fe *r, const secp256k1_fe *a); /** If a has a square root, it is computed in r and 1 is returned. If a does not * have a square root, the root of its negation is computed and 0 is returned. * The input's magnitude can be at most 8. The output magnitude is 1 (but not * guaranteed to be normalized). The result in r will always be a square * itself. */ static int secp256k1_fe_sqrt(secp256k1_fe *r, const secp256k1_fe *a); /** Checks whether a field element is a quadratic residue. */ static int secp256k1_fe_is_quad_var(const secp256k1_fe *a); /** Sets a field element to be the (modular) inverse of another. Requires the input's magnitude to be * at most 8. The output magnitude is 1 (but not guaranteed to be normalized). */ static void secp256k1_fe_inv(secp256k1_fe *r, const secp256k1_fe *a); /** Potentially faster version of secp256k1_fe_inv, without constant-time guarantee. */ static void secp256k1_fe_inv_var(secp256k1_fe *r, const secp256k1_fe *a); /** Calculate the (modular) inverses of a batch of field elements. Requires the inputs' magnitudes to be * at most 8. The output magnitudes are 1 (but not guaranteed to be normalized). The inputs and * outputs must not overlap in memory. */ static void secp256k1_fe_inv_all_var(secp256k1_fe *r, const secp256k1_fe *a, size_t len); /** Convert a field element to the storage type. */ static void secp256k1_fe_to_storage(secp256k1_fe_storage *r, const secp256k1_fe *a); /** Convert a field element back from the storage type. */ static void secp256k1_fe_from_storage(secp256k1_fe *r, const secp256k1_fe_storage *a); /** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */ static void secp256k1_fe_storage_cmov(secp256k1_fe_storage *r, const secp256k1_fe_storage *a, int flag); /** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */ static void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag); #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/field_10x26.h ================================================ /********************************************************************** * Copyright (c) 2013, 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_FIELD_REPR_ #define _SECP256K1_FIELD_REPR_ #include typedef struct { /* X = sum(i=0..9, elem[i]*2^26) mod n */ uint32_t n[10]; #ifdef VERIFY int magnitude; int normalized; #endif } secp256k1_fe; /* Unpacks a constant into a overlapping multi-limbed FE element. */ #define SECP256K1_FE_CONST_INNER(d7, d6, d5, d4, d3, d2, d1, d0) { \ (d0) & 0x3FFFFFFUL, \ (((uint32_t)d0) >> 26) | (((uint32_t)(d1) & 0xFFFFFUL) << 6), \ (((uint32_t)d1) >> 20) | (((uint32_t)(d2) & 0x3FFFUL) << 12), \ (((uint32_t)d2) >> 14) | (((uint32_t)(d3) & 0xFFUL) << 18), \ (((uint32_t)d3) >> 8) | (((uint32_t)(d4) & 0x3UL) << 24), \ (((uint32_t)d4) >> 2) & 0x3FFFFFFUL, \ (((uint32_t)d4) >> 28) | (((uint32_t)(d5) & 0x3FFFFFUL) << 4), \ (((uint32_t)d5) >> 22) | (((uint32_t)(d6) & 0xFFFFUL) << 10), \ (((uint32_t)d6) >> 16) | (((uint32_t)(d7) & 0x3FFUL) << 16), \ (((uint32_t)d7) >> 10) \ } #ifdef VERIFY #define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {SECP256K1_FE_CONST_INNER((d7), (d6), (d5), (d4), (d3), (d2), (d1), (d0)), 1, 1} #else #define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {SECP256K1_FE_CONST_INNER((d7), (d6), (d5), (d4), (d3), (d2), (d1), (d0))} #endif typedef struct { uint32_t n[8]; } secp256k1_fe_storage; #define SECP256K1_FE_STORAGE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{ (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) }} #define SECP256K1_FE_STORAGE_CONST_GET(d) d.n[7], d.n[6], d.n[5], d.n[4],d.n[3], d.n[2], d.n[1], d.n[0] #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/field_10x26_impl.h ================================================ /********************************************************************** * Copyright (c) 2013, 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_FIELD_REPR_IMPL_H_ #define _SECP256K1_FIELD_REPR_IMPL_H_ #include "util.h" #include "num.h" #include "field.h" #ifdef VERIFY static void secp256k1_fe_verify(const secp256k1_fe *a) { const uint32_t *d = a->n; int m = a->normalized ? 1 : 2 * a->magnitude, r = 1; r &= (d[0] <= 0x3FFFFFFUL * m); r &= (d[1] <= 0x3FFFFFFUL * m); r &= (d[2] <= 0x3FFFFFFUL * m); r &= (d[3] <= 0x3FFFFFFUL * m); r &= (d[4] <= 0x3FFFFFFUL * m); r &= (d[5] <= 0x3FFFFFFUL * m); r &= (d[6] <= 0x3FFFFFFUL * m); r &= (d[7] <= 0x3FFFFFFUL * m); r &= (d[8] <= 0x3FFFFFFUL * m); r &= (d[9] <= 0x03FFFFFUL * m); r &= (a->magnitude >= 0); r &= (a->magnitude <= 32); if (a->normalized) { r &= (a->magnitude <= 1); if (r && (d[9] == 0x03FFFFFUL)) { uint32_t mid = d[8] & d[7] & d[6] & d[5] & d[4] & d[3] & d[2]; if (mid == 0x3FFFFFFUL) { r &= ((d[1] + 0x40UL + ((d[0] + 0x3D1UL) >> 26)) <= 0x3FFFFFFUL); } } } VERIFY_CHECK(r == 1); } #endif static void secp256k1_fe_normalize(secp256k1_fe *r) { uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; /* Reduce t9 at the start so there will be at most a single carry from the first pass */ uint32_t m; uint32_t x = t9 >> 22; t9 &= 0x03FFFFFUL; /* The first pass ensures the magnitude is 1, ... */ t0 += x * 0x3D1UL; t1 += (x << 6); t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; m = t2; t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; m &= t3; t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; m &= t4; t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; m &= t5; t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; m &= t6; t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; m &= t7; t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; m &= t8; /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */ VERIFY_CHECK(t9 >> 23 == 0); /* At most a single final reduction is needed; check if the value is >= the field characteristic */ x = (t9 >> 22) | ((t9 == 0x03FFFFFUL) & (m == 0x3FFFFFFUL) & ((t1 + 0x40UL + ((t0 + 0x3D1UL) >> 26)) > 0x3FFFFFFUL)); /* Apply the final reduction (for constant-time behaviour, we do it always) */ t0 += x * 0x3D1UL; t1 += (x << 6); t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; /* If t9 didn't carry to bit 22 already, then it should have after any final reduction */ VERIFY_CHECK(t9 >> 22 == x); /* Mask off the possible multiple of 2^256 from the final reduction */ t9 &= 0x03FFFFFUL; r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; r->n[5] = t5; r->n[6] = t6; r->n[7] = t7; r->n[8] = t8; r->n[9] = t9; #ifdef VERIFY r->magnitude = 1; r->normalized = 1; secp256k1_fe_verify(r); #endif } static void secp256k1_fe_normalize_weak(secp256k1_fe *r) { uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; /* Reduce t9 at the start so there will be at most a single carry from the first pass */ uint32_t x = t9 >> 22; t9 &= 0x03FFFFFUL; /* The first pass ensures the magnitude is 1, ... */ t0 += x * 0x3D1UL; t1 += (x << 6); t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */ VERIFY_CHECK(t9 >> 23 == 0); r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; r->n[5] = t5; r->n[6] = t6; r->n[7] = t7; r->n[8] = t8; r->n[9] = t9; #ifdef VERIFY r->magnitude = 1; secp256k1_fe_verify(r); #endif } static void secp256k1_fe_normalize_var(secp256k1_fe *r) { uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; /* Reduce t9 at the start so there will be at most a single carry from the first pass */ uint32_t m; uint32_t x = t9 >> 22; t9 &= 0x03FFFFFUL; /* The first pass ensures the magnitude is 1, ... */ t0 += x * 0x3D1UL; t1 += (x << 6); t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; m = t2; t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; m &= t3; t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; m &= t4; t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; m &= t5; t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; m &= t6; t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; m &= t7; t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; m &= t8; /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */ VERIFY_CHECK(t9 >> 23 == 0); /* At most a single final reduction is needed; check if the value is >= the field characteristic */ x = (t9 >> 22) | ((t9 == 0x03FFFFFUL) & (m == 0x3FFFFFFUL) & ((t1 + 0x40UL + ((t0 + 0x3D1UL) >> 26)) > 0x3FFFFFFUL)); if (x) { t0 += 0x3D1UL; t1 += (x << 6); t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; /* If t9 didn't carry to bit 22 already, then it should have after any final reduction */ VERIFY_CHECK(t9 >> 22 == x); /* Mask off the possible multiple of 2^256 from the final reduction */ t9 &= 0x03FFFFFUL; } r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; r->n[5] = t5; r->n[6] = t6; r->n[7] = t7; r->n[8] = t8; r->n[9] = t9; #ifdef VERIFY r->magnitude = 1; r->normalized = 1; secp256k1_fe_verify(r); #endif } static int secp256k1_fe_normalizes_to_zero(secp256k1_fe *r) { uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; /* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */ uint32_t z0, z1; /* Reduce t9 at the start so there will be at most a single carry from the first pass */ uint32_t x = t9 >> 22; t9 &= 0x03FFFFFUL; /* The first pass ensures the magnitude is 1, ... */ t0 += x * 0x3D1UL; t1 += (x << 6); t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; z0 = t0; z1 = t0 ^ 0x3D0UL; t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; z0 |= t1; z1 &= t1 ^ 0x40UL; t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; z0 |= t2; z1 &= t2; t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; z0 |= t3; z1 &= t3; t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; z0 |= t4; z1 &= t4; t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; z0 |= t5; z1 &= t5; t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; z0 |= t6; z1 &= t6; t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; z0 |= t7; z1 &= t7; t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; z0 |= t8; z1 &= t8; z0 |= t9; z1 &= t9 ^ 0x3C00000UL; /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */ VERIFY_CHECK(t9 >> 23 == 0); return (z0 == 0) | (z1 == 0x3FFFFFFUL); } static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe *r) { uint32_t t0, t1, t2, t3, t4, t5, t6, t7, t8, t9; uint32_t z0, z1; uint32_t x; t0 = r->n[0]; t9 = r->n[9]; /* Reduce t9 at the start so there will be at most a single carry from the first pass */ x = t9 >> 22; /* The first pass ensures the magnitude is 1, ... */ t0 += x * 0x3D1UL; /* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */ z0 = t0 & 0x3FFFFFFUL; z1 = z0 ^ 0x3D0UL; /* Fast return path should catch the majority of cases */ if ((z0 != 0UL) & (z1 != 0x3FFFFFFUL)) { return 0; } t1 = r->n[1]; t2 = r->n[2]; t3 = r->n[3]; t4 = r->n[4]; t5 = r->n[5]; t6 = r->n[6]; t7 = r->n[7]; t8 = r->n[8]; t9 &= 0x03FFFFFUL; t1 += (x << 6); t1 += (t0 >> 26); t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; z0 |= t1; z1 &= t1 ^ 0x40UL; t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; z0 |= t2; z1 &= t2; t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; z0 |= t3; z1 &= t3; t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; z0 |= t4; z1 &= t4; t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; z0 |= t5; z1 &= t5; t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; z0 |= t6; z1 &= t6; t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; z0 |= t7; z1 &= t7; t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; z0 |= t8; z1 &= t8; z0 |= t9; z1 &= t9 ^ 0x3C00000UL; /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */ VERIFY_CHECK(t9 >> 23 == 0); return (z0 == 0) | (z1 == 0x3FFFFFFUL); } SECP256K1_INLINE static void secp256k1_fe_set_int(secp256k1_fe *r, int a) { r->n[0] = a; r->n[1] = r->n[2] = r->n[3] = r->n[4] = r->n[5] = r->n[6] = r->n[7] = r->n[8] = r->n[9] = 0; #ifdef VERIFY r->magnitude = 1; r->normalized = 1; secp256k1_fe_verify(r); #endif } SECP256K1_INLINE static int secp256k1_fe_is_zero(const secp256k1_fe *a) { const uint32_t *t = a->n; #ifdef VERIFY VERIFY_CHECK(a->normalized); secp256k1_fe_verify(a); #endif return (t[0] | t[1] | t[2] | t[3] | t[4] | t[5] | t[6] | t[7] | t[8] | t[9]) == 0; } SECP256K1_INLINE static int secp256k1_fe_is_odd(const secp256k1_fe *a) { #ifdef VERIFY VERIFY_CHECK(a->normalized); secp256k1_fe_verify(a); #endif return a->n[0] & 1; } SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe *a) { int i; #ifdef VERIFY a->magnitude = 0; a->normalized = 1; #endif for (i=0; i<10; i++) { a->n[i] = 0; } } static int secp256k1_fe_cmp_var(const secp256k1_fe *a, const secp256k1_fe *b) { int i; #ifdef VERIFY VERIFY_CHECK(a->normalized); VERIFY_CHECK(b->normalized); secp256k1_fe_verify(a); secp256k1_fe_verify(b); #endif for (i = 9; i >= 0; i--) { if (a->n[i] > b->n[i]) { return 1; } if (a->n[i] < b->n[i]) { return -1; } } return 0; } static int secp256k1_fe_set_b32(secp256k1_fe *r, const unsigned char *a) { int i; r->n[0] = r->n[1] = r->n[2] = r->n[3] = r->n[4] = 0; r->n[5] = r->n[6] = r->n[7] = r->n[8] = r->n[9] = 0; for (i=0; i<32; i++) { int j; for (j=0; j<4; j++) { int limb = (8*i+2*j)/26; int shift = (8*i+2*j)%26; r->n[limb] |= (uint32_t)((a[31-i] >> (2*j)) & 0x3) << shift; } } if (r->n[9] == 0x3FFFFFUL && (r->n[8] & r->n[7] & r->n[6] & r->n[5] & r->n[4] & r->n[3] & r->n[2]) == 0x3FFFFFFUL && (r->n[1] + 0x40UL + ((r->n[0] + 0x3D1UL) >> 26)) > 0x3FFFFFFUL) { return 0; } #ifdef VERIFY r->magnitude = 1; r->normalized = 1; secp256k1_fe_verify(r); #endif return 1; } /** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */ static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe *a) { int i; #ifdef VERIFY VERIFY_CHECK(a->normalized); secp256k1_fe_verify(a); #endif for (i=0; i<32; i++) { int j; int c = 0; for (j=0; j<4; j++) { int limb = (8*i+2*j)/26; int shift = (8*i+2*j)%26; c |= ((a->n[limb] >> shift) & 0x3) << (2 * j); } r[31-i] = c; } } SECP256K1_INLINE static void secp256k1_fe_negate(secp256k1_fe *r, const secp256k1_fe *a, int m) { #ifdef VERIFY VERIFY_CHECK(a->magnitude <= m); secp256k1_fe_verify(a); #endif r->n[0] = 0x3FFFC2FUL * 2 * (m + 1) - a->n[0]; r->n[1] = 0x3FFFFBFUL * 2 * (m + 1) - a->n[1]; r->n[2] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[2]; r->n[3] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[3]; r->n[4] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[4]; r->n[5] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[5]; r->n[6] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[6]; r->n[7] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[7]; r->n[8] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[8]; r->n[9] = 0x03FFFFFUL * 2 * (m + 1) - a->n[9]; #ifdef VERIFY r->magnitude = m + 1; r->normalized = 0; secp256k1_fe_verify(r); #endif } SECP256K1_INLINE static void secp256k1_fe_mul_int(secp256k1_fe *r, int a) { r->n[0] *= a; r->n[1] *= a; r->n[2] *= a; r->n[3] *= a; r->n[4] *= a; r->n[5] *= a; r->n[6] *= a; r->n[7] *= a; r->n[8] *= a; r->n[9] *= a; #ifdef VERIFY r->magnitude *= a; r->normalized = 0; secp256k1_fe_verify(r); #endif } SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe *r, const secp256k1_fe *a) { #ifdef VERIFY secp256k1_fe_verify(a); #endif r->n[0] += a->n[0]; r->n[1] += a->n[1]; r->n[2] += a->n[2]; r->n[3] += a->n[3]; r->n[4] += a->n[4]; r->n[5] += a->n[5]; r->n[6] += a->n[6]; r->n[7] += a->n[7]; r->n[8] += a->n[8]; r->n[9] += a->n[9]; #ifdef VERIFY r->magnitude += a->magnitude; r->normalized = 0; secp256k1_fe_verify(r); #endif } #if defined(USE_EXTERNAL_ASM) /* External assembler implementation */ void secp256k1_fe_mul_inner(uint32_t *r, const uint32_t *a, const uint32_t * SECP256K1_RESTRICT b); void secp256k1_fe_sqr_inner(uint32_t *r, const uint32_t *a); #else #ifdef VERIFY #define VERIFY_BITS(x, n) VERIFY_CHECK(((x) >> (n)) == 0) #else #define VERIFY_BITS(x, n) do { } while(0) #endif SECP256K1_INLINE static void secp256k1_fe_mul_inner(uint32_t *r, const uint32_t *a, const uint32_t * SECP256K1_RESTRICT b) { uint64_t c, d; uint64_t u0, u1, u2, u3, u4, u5, u6, u7, u8; uint32_t t9, t1, t0, t2, t3, t4, t5, t6, t7; const uint32_t M = 0x3FFFFFFUL, R0 = 0x3D10UL, R1 = 0x400UL; VERIFY_BITS(a[0], 30); VERIFY_BITS(a[1], 30); VERIFY_BITS(a[2], 30); VERIFY_BITS(a[3], 30); VERIFY_BITS(a[4], 30); VERIFY_BITS(a[5], 30); VERIFY_BITS(a[6], 30); VERIFY_BITS(a[7], 30); VERIFY_BITS(a[8], 30); VERIFY_BITS(a[9], 26); VERIFY_BITS(b[0], 30); VERIFY_BITS(b[1], 30); VERIFY_BITS(b[2], 30); VERIFY_BITS(b[3], 30); VERIFY_BITS(b[4], 30); VERIFY_BITS(b[5], 30); VERIFY_BITS(b[6], 30); VERIFY_BITS(b[7], 30); VERIFY_BITS(b[8], 30); VERIFY_BITS(b[9], 26); /** [... a b c] is a shorthand for ... + a<<52 + b<<26 + c<<0 mod n. * px is a shorthand for sum(a[i]*b[x-i], i=0..x). * Note that [x 0 0 0 0 0 0 0 0 0 0] = [x*R1 x*R0]. */ d = (uint64_t)a[0] * b[9] + (uint64_t)a[1] * b[8] + (uint64_t)a[2] * b[7] + (uint64_t)a[3] * b[6] + (uint64_t)a[4] * b[5] + (uint64_t)a[5] * b[4] + (uint64_t)a[6] * b[3] + (uint64_t)a[7] * b[2] + (uint64_t)a[8] * b[1] + (uint64_t)a[9] * b[0]; /* VERIFY_BITS(d, 64); */ /* [d 0 0 0 0 0 0 0 0 0] = [p9 0 0 0 0 0 0 0 0 0] */ t9 = d & M; d >>= 26; VERIFY_BITS(t9, 26); VERIFY_BITS(d, 38); /* [d t9 0 0 0 0 0 0 0 0 0] = [p9 0 0 0 0 0 0 0 0 0] */ c = (uint64_t)a[0] * b[0]; VERIFY_BITS(c, 60); /* [d t9 0 0 0 0 0 0 0 0 c] = [p9 0 0 0 0 0 0 0 0 p0] */ d += (uint64_t)a[1] * b[9] + (uint64_t)a[2] * b[8] + (uint64_t)a[3] * b[7] + (uint64_t)a[4] * b[6] + (uint64_t)a[5] * b[5] + (uint64_t)a[6] * b[4] + (uint64_t)a[7] * b[3] + (uint64_t)a[8] * b[2] + (uint64_t)a[9] * b[1]; VERIFY_BITS(d, 63); /* [d t9 0 0 0 0 0 0 0 0 c] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ u0 = d & M; d >>= 26; c += u0 * R0; VERIFY_BITS(u0, 26); VERIFY_BITS(d, 37); VERIFY_BITS(c, 61); /* [d u0 t9 0 0 0 0 0 0 0 0 c-u0*R0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ t0 = c & M; c >>= 26; c += u0 * R1; VERIFY_BITS(t0, 26); VERIFY_BITS(c, 37); /* [d u0 t9 0 0 0 0 0 0 0 c-u0*R1 t0-u0*R0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ c += (uint64_t)a[0] * b[1] + (uint64_t)a[1] * b[0]; VERIFY_BITS(c, 62); /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p10 p9 0 0 0 0 0 0 0 p1 p0] */ d += (uint64_t)a[2] * b[9] + (uint64_t)a[3] * b[8] + (uint64_t)a[4] * b[7] + (uint64_t)a[5] * b[6] + (uint64_t)a[6] * b[5] + (uint64_t)a[7] * b[4] + (uint64_t)a[8] * b[3] + (uint64_t)a[9] * b[2]; VERIFY_BITS(d, 63); /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ u1 = d & M; d >>= 26; c += u1 * R0; VERIFY_BITS(u1, 26); VERIFY_BITS(d, 37); VERIFY_BITS(c, 63); /* [d u1 0 t9 0 0 0 0 0 0 0 c-u1*R0 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ t1 = c & M; c >>= 26; c += u1 * R1; VERIFY_BITS(t1, 26); VERIFY_BITS(c, 38); /* [d u1 0 t9 0 0 0 0 0 0 c-u1*R1 t1-u1*R0 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ c += (uint64_t)a[0] * b[2] + (uint64_t)a[1] * b[1] + (uint64_t)a[2] * b[0]; VERIFY_BITS(c, 62); /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ d += (uint64_t)a[3] * b[9] + (uint64_t)a[4] * b[8] + (uint64_t)a[5] * b[7] + (uint64_t)a[6] * b[6] + (uint64_t)a[7] * b[5] + (uint64_t)a[8] * b[4] + (uint64_t)a[9] * b[3]; VERIFY_BITS(d, 63); /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ u2 = d & M; d >>= 26; c += u2 * R0; VERIFY_BITS(u2, 26); VERIFY_BITS(d, 37); VERIFY_BITS(c, 63); /* [d u2 0 0 t9 0 0 0 0 0 0 c-u2*R0 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ t2 = c & M; c >>= 26; c += u2 * R1; VERIFY_BITS(t2, 26); VERIFY_BITS(c, 38); /* [d u2 0 0 t9 0 0 0 0 0 c-u2*R1 t2-u2*R0 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ c += (uint64_t)a[0] * b[3] + (uint64_t)a[1] * b[2] + (uint64_t)a[2] * b[1] + (uint64_t)a[3] * b[0]; VERIFY_BITS(c, 63); /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ d += (uint64_t)a[4] * b[9] + (uint64_t)a[5] * b[8] + (uint64_t)a[6] * b[7] + (uint64_t)a[7] * b[6] + (uint64_t)a[8] * b[5] + (uint64_t)a[9] * b[4]; VERIFY_BITS(d, 63); /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ u3 = d & M; d >>= 26; c += u3 * R0; VERIFY_BITS(u3, 26); VERIFY_BITS(d, 37); /* VERIFY_BITS(c, 64); */ /* [d u3 0 0 0 t9 0 0 0 0 0 c-u3*R0 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ t3 = c & M; c >>= 26; c += u3 * R1; VERIFY_BITS(t3, 26); VERIFY_BITS(c, 39); /* [d u3 0 0 0 t9 0 0 0 0 c-u3*R1 t3-u3*R0 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ c += (uint64_t)a[0] * b[4] + (uint64_t)a[1] * b[3] + (uint64_t)a[2] * b[2] + (uint64_t)a[3] * b[1] + (uint64_t)a[4] * b[0]; VERIFY_BITS(c, 63); /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ d += (uint64_t)a[5] * b[9] + (uint64_t)a[6] * b[8] + (uint64_t)a[7] * b[7] + (uint64_t)a[8] * b[6] + (uint64_t)a[9] * b[5]; VERIFY_BITS(d, 62); /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ u4 = d & M; d >>= 26; c += u4 * R0; VERIFY_BITS(u4, 26); VERIFY_BITS(d, 36); /* VERIFY_BITS(c, 64); */ /* [d u4 0 0 0 0 t9 0 0 0 0 c-u4*R0 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ t4 = c & M; c >>= 26; c += u4 * R1; VERIFY_BITS(t4, 26); VERIFY_BITS(c, 39); /* [d u4 0 0 0 0 t9 0 0 0 c-u4*R1 t4-u4*R0 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ c += (uint64_t)a[0] * b[5] + (uint64_t)a[1] * b[4] + (uint64_t)a[2] * b[3] + (uint64_t)a[3] * b[2] + (uint64_t)a[4] * b[1] + (uint64_t)a[5] * b[0]; VERIFY_BITS(c, 63); /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ d += (uint64_t)a[6] * b[9] + (uint64_t)a[7] * b[8] + (uint64_t)a[8] * b[7] + (uint64_t)a[9] * b[6]; VERIFY_BITS(d, 62); /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ u5 = d & M; d >>= 26; c += u5 * R0; VERIFY_BITS(u5, 26); VERIFY_BITS(d, 36); /* VERIFY_BITS(c, 64); */ /* [d u5 0 0 0 0 0 t9 0 0 0 c-u5*R0 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ t5 = c & M; c >>= 26; c += u5 * R1; VERIFY_BITS(t5, 26); VERIFY_BITS(c, 39); /* [d u5 0 0 0 0 0 t9 0 0 c-u5*R1 t5-u5*R0 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ c += (uint64_t)a[0] * b[6] + (uint64_t)a[1] * b[5] + (uint64_t)a[2] * b[4] + (uint64_t)a[3] * b[3] + (uint64_t)a[4] * b[2] + (uint64_t)a[5] * b[1] + (uint64_t)a[6] * b[0]; VERIFY_BITS(c, 63); /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ d += (uint64_t)a[7] * b[9] + (uint64_t)a[8] * b[8] + (uint64_t)a[9] * b[7]; VERIFY_BITS(d, 61); /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ u6 = d & M; d >>= 26; c += u6 * R0; VERIFY_BITS(u6, 26); VERIFY_BITS(d, 35); /* VERIFY_BITS(c, 64); */ /* [d u6 0 0 0 0 0 0 t9 0 0 c-u6*R0 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ t6 = c & M; c >>= 26; c += u6 * R1; VERIFY_BITS(t6, 26); VERIFY_BITS(c, 39); /* [d u6 0 0 0 0 0 0 t9 0 c-u6*R1 t6-u6*R0 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ c += (uint64_t)a[0] * b[7] + (uint64_t)a[1] * b[6] + (uint64_t)a[2] * b[5] + (uint64_t)a[3] * b[4] + (uint64_t)a[4] * b[3] + (uint64_t)a[5] * b[2] + (uint64_t)a[6] * b[1] + (uint64_t)a[7] * b[0]; /* VERIFY_BITS(c, 64); */ VERIFY_CHECK(c <= 0x8000007C00000007ULL); /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ d += (uint64_t)a[8] * b[9] + (uint64_t)a[9] * b[8]; VERIFY_BITS(d, 58); /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ u7 = d & M; d >>= 26; c += u7 * R0; VERIFY_BITS(u7, 26); VERIFY_BITS(d, 32); /* VERIFY_BITS(c, 64); */ VERIFY_CHECK(c <= 0x800001703FFFC2F7ULL); /* [d u7 0 0 0 0 0 0 0 t9 0 c-u7*R0 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ t7 = c & M; c >>= 26; c += u7 * R1; VERIFY_BITS(t7, 26); VERIFY_BITS(c, 38); /* [d u7 0 0 0 0 0 0 0 t9 c-u7*R1 t7-u7*R0 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ c += (uint64_t)a[0] * b[8] + (uint64_t)a[1] * b[7] + (uint64_t)a[2] * b[6] + (uint64_t)a[3] * b[5] + (uint64_t)a[4] * b[4] + (uint64_t)a[5] * b[3] + (uint64_t)a[6] * b[2] + (uint64_t)a[7] * b[1] + (uint64_t)a[8] * b[0]; /* VERIFY_BITS(c, 64); */ VERIFY_CHECK(c <= 0x9000007B80000008ULL); /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ d += (uint64_t)a[9] * b[9]; VERIFY_BITS(d, 57); /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ u8 = d & M; d >>= 26; c += u8 * R0; VERIFY_BITS(u8, 26); VERIFY_BITS(d, 31); /* VERIFY_BITS(c, 64); */ VERIFY_CHECK(c <= 0x9000016FBFFFC2F8ULL); /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 t4 t3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[3] = t3; VERIFY_BITS(r[3], 26); /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 t4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[4] = t4; VERIFY_BITS(r[4], 26); /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[5] = t5; VERIFY_BITS(r[5], 26); /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[6] = t6; VERIFY_BITS(r[6], 26); /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[7] = t7; VERIFY_BITS(r[7], 26); /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[8] = c & M; c >>= 26; c += u8 * R1; VERIFY_BITS(r[8], 26); VERIFY_BITS(c, 39); /* [d u8 0 0 0 0 0 0 0 0 t9+c-u8*R1 r8-u8*R0 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ /* [d 0 0 0 0 0 0 0 0 0 t9+c r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ c += d * R0 + t9; VERIFY_BITS(c, 45); /* [d 0 0 0 0 0 0 0 0 0 c-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[9] = c & (M >> 4); c >>= 22; c += d * (R1 << 4); VERIFY_BITS(r[9], 22); VERIFY_BITS(c, 46); /* [d 0 0 0 0 0 0 0 0 r9+((c-d*R1<<4)<<22)-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ /* [d 0 0 0 0 0 0 0 -d*R1 r9+(c<<22)-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ d = c * (R0 >> 4) + t0; VERIFY_BITS(d, 56); /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1 d-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[0] = d & M; d >>= 26; VERIFY_BITS(r[0], 26); VERIFY_BITS(d, 30); /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1+d r0-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ d += c * (R1 >> 4) + t1; VERIFY_BITS(d, 53); VERIFY_CHECK(d <= 0x10000003FFFFBFULL); /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 d-c*R1>>4 r0-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ /* [r9 r8 r7 r6 r5 r4 r3 t2 d r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[1] = d & M; d >>= 26; VERIFY_BITS(r[1], 26); VERIFY_BITS(d, 27); VERIFY_CHECK(d <= 0x4000000ULL); /* [r9 r8 r7 r6 r5 r4 r3 t2+d r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ d += t2; VERIFY_BITS(d, 27); /* [r9 r8 r7 r6 r5 r4 r3 d r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[2] = d; VERIFY_BITS(r[2], 27); /* [r9 r8 r7 r6 r5 r4 r3 r2 r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ } SECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint32_t *r, const uint32_t *a) { uint64_t c, d; uint64_t u0, u1, u2, u3, u4, u5, u6, u7, u8; uint32_t t9, t0, t1, t2, t3, t4, t5, t6, t7; const uint32_t M = 0x3FFFFFFUL, R0 = 0x3D10UL, R1 = 0x400UL; VERIFY_BITS(a[0], 30); VERIFY_BITS(a[1], 30); VERIFY_BITS(a[2], 30); VERIFY_BITS(a[3], 30); VERIFY_BITS(a[4], 30); VERIFY_BITS(a[5], 30); VERIFY_BITS(a[6], 30); VERIFY_BITS(a[7], 30); VERIFY_BITS(a[8], 30); VERIFY_BITS(a[9], 26); /** [... a b c] is a shorthand for ... + a<<52 + b<<26 + c<<0 mod n. * px is a shorthand for sum(a[i]*a[x-i], i=0..x). * Note that [x 0 0 0 0 0 0 0 0 0 0] = [x*R1 x*R0]. */ d = (uint64_t)(a[0]*2) * a[9] + (uint64_t)(a[1]*2) * a[8] + (uint64_t)(a[2]*2) * a[7] + (uint64_t)(a[3]*2) * a[6] + (uint64_t)(a[4]*2) * a[5]; /* VERIFY_BITS(d, 64); */ /* [d 0 0 0 0 0 0 0 0 0] = [p9 0 0 0 0 0 0 0 0 0] */ t9 = d & M; d >>= 26; VERIFY_BITS(t9, 26); VERIFY_BITS(d, 38); /* [d t9 0 0 0 0 0 0 0 0 0] = [p9 0 0 0 0 0 0 0 0 0] */ c = (uint64_t)a[0] * a[0]; VERIFY_BITS(c, 60); /* [d t9 0 0 0 0 0 0 0 0 c] = [p9 0 0 0 0 0 0 0 0 p0] */ d += (uint64_t)(a[1]*2) * a[9] + (uint64_t)(a[2]*2) * a[8] + (uint64_t)(a[3]*2) * a[7] + (uint64_t)(a[4]*2) * a[6] + (uint64_t)a[5] * a[5]; VERIFY_BITS(d, 63); /* [d t9 0 0 0 0 0 0 0 0 c] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ u0 = d & M; d >>= 26; c += u0 * R0; VERIFY_BITS(u0, 26); VERIFY_BITS(d, 37); VERIFY_BITS(c, 61); /* [d u0 t9 0 0 0 0 0 0 0 0 c-u0*R0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ t0 = c & M; c >>= 26; c += u0 * R1; VERIFY_BITS(t0, 26); VERIFY_BITS(c, 37); /* [d u0 t9 0 0 0 0 0 0 0 c-u0*R1 t0-u0*R0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ c += (uint64_t)(a[0]*2) * a[1]; VERIFY_BITS(c, 62); /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p10 p9 0 0 0 0 0 0 0 p1 p0] */ d += (uint64_t)(a[2]*2) * a[9] + (uint64_t)(a[3]*2) * a[8] + (uint64_t)(a[4]*2) * a[7] + (uint64_t)(a[5]*2) * a[6]; VERIFY_BITS(d, 63); /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ u1 = d & M; d >>= 26; c += u1 * R0; VERIFY_BITS(u1, 26); VERIFY_BITS(d, 37); VERIFY_BITS(c, 63); /* [d u1 0 t9 0 0 0 0 0 0 0 c-u1*R0 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ t1 = c & M; c >>= 26; c += u1 * R1; VERIFY_BITS(t1, 26); VERIFY_BITS(c, 38); /* [d u1 0 t9 0 0 0 0 0 0 c-u1*R1 t1-u1*R0 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ c += (uint64_t)(a[0]*2) * a[2] + (uint64_t)a[1] * a[1]; VERIFY_BITS(c, 62); /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ d += (uint64_t)(a[3]*2) * a[9] + (uint64_t)(a[4]*2) * a[8] + (uint64_t)(a[5]*2) * a[7] + (uint64_t)a[6] * a[6]; VERIFY_BITS(d, 63); /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ u2 = d & M; d >>= 26; c += u2 * R0; VERIFY_BITS(u2, 26); VERIFY_BITS(d, 37); VERIFY_BITS(c, 63); /* [d u2 0 0 t9 0 0 0 0 0 0 c-u2*R0 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ t2 = c & M; c >>= 26; c += u2 * R1; VERIFY_BITS(t2, 26); VERIFY_BITS(c, 38); /* [d u2 0 0 t9 0 0 0 0 0 c-u2*R1 t2-u2*R0 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ c += (uint64_t)(a[0]*2) * a[3] + (uint64_t)(a[1]*2) * a[2]; VERIFY_BITS(c, 63); /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ d += (uint64_t)(a[4]*2) * a[9] + (uint64_t)(a[5]*2) * a[8] + (uint64_t)(a[6]*2) * a[7]; VERIFY_BITS(d, 63); /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ u3 = d & M; d >>= 26; c += u3 * R0; VERIFY_BITS(u3, 26); VERIFY_BITS(d, 37); /* VERIFY_BITS(c, 64); */ /* [d u3 0 0 0 t9 0 0 0 0 0 c-u3*R0 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ t3 = c & M; c >>= 26; c += u3 * R1; VERIFY_BITS(t3, 26); VERIFY_BITS(c, 39); /* [d u3 0 0 0 t9 0 0 0 0 c-u3*R1 t3-u3*R0 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ c += (uint64_t)(a[0]*2) * a[4] + (uint64_t)(a[1]*2) * a[3] + (uint64_t)a[2] * a[2]; VERIFY_BITS(c, 63); /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ d += (uint64_t)(a[5]*2) * a[9] + (uint64_t)(a[6]*2) * a[8] + (uint64_t)a[7] * a[7]; VERIFY_BITS(d, 62); /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ u4 = d & M; d >>= 26; c += u4 * R0; VERIFY_BITS(u4, 26); VERIFY_BITS(d, 36); /* VERIFY_BITS(c, 64); */ /* [d u4 0 0 0 0 t9 0 0 0 0 c-u4*R0 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ t4 = c & M; c >>= 26; c += u4 * R1; VERIFY_BITS(t4, 26); VERIFY_BITS(c, 39); /* [d u4 0 0 0 0 t9 0 0 0 c-u4*R1 t4-u4*R0 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ c += (uint64_t)(a[0]*2) * a[5] + (uint64_t)(a[1]*2) * a[4] + (uint64_t)(a[2]*2) * a[3]; VERIFY_BITS(c, 63); /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ d += (uint64_t)(a[6]*2) * a[9] + (uint64_t)(a[7]*2) * a[8]; VERIFY_BITS(d, 62); /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ u5 = d & M; d >>= 26; c += u5 * R0; VERIFY_BITS(u5, 26); VERIFY_BITS(d, 36); /* VERIFY_BITS(c, 64); */ /* [d u5 0 0 0 0 0 t9 0 0 0 c-u5*R0 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ t5 = c & M; c >>= 26; c += u5 * R1; VERIFY_BITS(t5, 26); VERIFY_BITS(c, 39); /* [d u5 0 0 0 0 0 t9 0 0 c-u5*R1 t5-u5*R0 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ c += (uint64_t)(a[0]*2) * a[6] + (uint64_t)(a[1]*2) * a[5] + (uint64_t)(a[2]*2) * a[4] + (uint64_t)a[3] * a[3]; VERIFY_BITS(c, 63); /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ d += (uint64_t)(a[7]*2) * a[9] + (uint64_t)a[8] * a[8]; VERIFY_BITS(d, 61); /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ u6 = d & M; d >>= 26; c += u6 * R0; VERIFY_BITS(u6, 26); VERIFY_BITS(d, 35); /* VERIFY_BITS(c, 64); */ /* [d u6 0 0 0 0 0 0 t9 0 0 c-u6*R0 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ t6 = c & M; c >>= 26; c += u6 * R1; VERIFY_BITS(t6, 26); VERIFY_BITS(c, 39); /* [d u6 0 0 0 0 0 0 t9 0 c-u6*R1 t6-u6*R0 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ c += (uint64_t)(a[0]*2) * a[7] + (uint64_t)(a[1]*2) * a[6] + (uint64_t)(a[2]*2) * a[5] + (uint64_t)(a[3]*2) * a[4]; /* VERIFY_BITS(c, 64); */ VERIFY_CHECK(c <= 0x8000007C00000007ULL); /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ d += (uint64_t)(a[8]*2) * a[9]; VERIFY_BITS(d, 58); /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ u7 = d & M; d >>= 26; c += u7 * R0; VERIFY_BITS(u7, 26); VERIFY_BITS(d, 32); /* VERIFY_BITS(c, 64); */ VERIFY_CHECK(c <= 0x800001703FFFC2F7ULL); /* [d u7 0 0 0 0 0 0 0 t9 0 c-u7*R0 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ t7 = c & M; c >>= 26; c += u7 * R1; VERIFY_BITS(t7, 26); VERIFY_BITS(c, 38); /* [d u7 0 0 0 0 0 0 0 t9 c-u7*R1 t7-u7*R0 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ c += (uint64_t)(a[0]*2) * a[8] + (uint64_t)(a[1]*2) * a[7] + (uint64_t)(a[2]*2) * a[6] + (uint64_t)(a[3]*2) * a[5] + (uint64_t)a[4] * a[4]; /* VERIFY_BITS(c, 64); */ VERIFY_CHECK(c <= 0x9000007B80000008ULL); /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ d += (uint64_t)a[9] * a[9]; VERIFY_BITS(d, 57); /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ u8 = d & M; d >>= 26; c += u8 * R0; VERIFY_BITS(u8, 26); VERIFY_BITS(d, 31); /* VERIFY_BITS(c, 64); */ VERIFY_CHECK(c <= 0x9000016FBFFFC2F8ULL); /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 t4 t3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[3] = t3; VERIFY_BITS(r[3], 26); /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 t4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[4] = t4; VERIFY_BITS(r[4], 26); /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[5] = t5; VERIFY_BITS(r[5], 26); /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[6] = t6; VERIFY_BITS(r[6], 26); /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[7] = t7; VERIFY_BITS(r[7], 26); /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[8] = c & M; c >>= 26; c += u8 * R1; VERIFY_BITS(r[8], 26); VERIFY_BITS(c, 39); /* [d u8 0 0 0 0 0 0 0 0 t9+c-u8*R1 r8-u8*R0 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ /* [d 0 0 0 0 0 0 0 0 0 t9+c r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ c += d * R0 + t9; VERIFY_BITS(c, 45); /* [d 0 0 0 0 0 0 0 0 0 c-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[9] = c & (M >> 4); c >>= 22; c += d * (R1 << 4); VERIFY_BITS(r[9], 22); VERIFY_BITS(c, 46); /* [d 0 0 0 0 0 0 0 0 r9+((c-d*R1<<4)<<22)-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ /* [d 0 0 0 0 0 0 0 -d*R1 r9+(c<<22)-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ d = c * (R0 >> 4) + t0; VERIFY_BITS(d, 56); /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1 d-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[0] = d & M; d >>= 26; VERIFY_BITS(r[0], 26); VERIFY_BITS(d, 30); /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1+d r0-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ d += c * (R1 >> 4) + t1; VERIFY_BITS(d, 53); VERIFY_CHECK(d <= 0x10000003FFFFBFULL); /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 d-c*R1>>4 r0-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ /* [r9 r8 r7 r6 r5 r4 r3 t2 d r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[1] = d & M; d >>= 26; VERIFY_BITS(r[1], 26); VERIFY_BITS(d, 27); VERIFY_CHECK(d <= 0x4000000ULL); /* [r9 r8 r7 r6 r5 r4 r3 t2+d r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ d += t2; VERIFY_BITS(d, 27); /* [r9 r8 r7 r6 r5 r4 r3 d r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[2] = d; VERIFY_BITS(r[2], 27); /* [r9 r8 r7 r6 r5 r4 r3 r2 r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ } #endif static void secp256k1_fe_mul(secp256k1_fe *r, const secp256k1_fe *a, const secp256k1_fe * SECP256K1_RESTRICT b) { #ifdef VERIFY VERIFY_CHECK(a->magnitude <= 8); VERIFY_CHECK(b->magnitude <= 8); secp256k1_fe_verify(a); secp256k1_fe_verify(b); VERIFY_CHECK(r != b); #endif secp256k1_fe_mul_inner(r->n, a->n, b->n); #ifdef VERIFY r->magnitude = 1; r->normalized = 0; secp256k1_fe_verify(r); #endif } static void secp256k1_fe_sqr(secp256k1_fe *r, const secp256k1_fe *a) { #ifdef VERIFY VERIFY_CHECK(a->magnitude <= 8); secp256k1_fe_verify(a); #endif secp256k1_fe_sqr_inner(r->n, a->n); #ifdef VERIFY r->magnitude = 1; r->normalized = 0; secp256k1_fe_verify(r); #endif } static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag) { uint32_t mask0, mask1; mask0 = flag + ~((uint32_t)0); mask1 = ~mask0; r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1); r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1); r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1); r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1); r->n[4] = (r->n[4] & mask0) | (a->n[4] & mask1); r->n[5] = (r->n[5] & mask0) | (a->n[5] & mask1); r->n[6] = (r->n[6] & mask0) | (a->n[6] & mask1); r->n[7] = (r->n[7] & mask0) | (a->n[7] & mask1); r->n[8] = (r->n[8] & mask0) | (a->n[8] & mask1); r->n[9] = (r->n[9] & mask0) | (a->n[9] & mask1); #ifdef VERIFY if (a->magnitude > r->magnitude) { r->magnitude = a->magnitude; } r->normalized &= a->normalized; #endif } static SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage *r, const secp256k1_fe_storage *a, int flag) { uint32_t mask0, mask1; mask0 = flag + ~((uint32_t)0); mask1 = ~mask0; r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1); r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1); r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1); r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1); r->n[4] = (r->n[4] & mask0) | (a->n[4] & mask1); r->n[5] = (r->n[5] & mask0) | (a->n[5] & mask1); r->n[6] = (r->n[6] & mask0) | (a->n[6] & mask1); r->n[7] = (r->n[7] & mask0) | (a->n[7] & mask1); } static void secp256k1_fe_to_storage(secp256k1_fe_storage *r, const secp256k1_fe *a) { #ifdef VERIFY VERIFY_CHECK(a->normalized); #endif r->n[0] = a->n[0] | a->n[1] << 26; r->n[1] = a->n[1] >> 6 | a->n[2] << 20; r->n[2] = a->n[2] >> 12 | a->n[3] << 14; r->n[3] = a->n[3] >> 18 | a->n[4] << 8; r->n[4] = a->n[4] >> 24 | a->n[5] << 2 | a->n[6] << 28; r->n[5] = a->n[6] >> 4 | a->n[7] << 22; r->n[6] = a->n[7] >> 10 | a->n[8] << 16; r->n[7] = a->n[8] >> 16 | a->n[9] << 10; } static SECP256K1_INLINE void secp256k1_fe_from_storage(secp256k1_fe *r, const secp256k1_fe_storage *a) { r->n[0] = a->n[0] & 0x3FFFFFFUL; r->n[1] = a->n[0] >> 26 | ((a->n[1] << 6) & 0x3FFFFFFUL); r->n[2] = a->n[1] >> 20 | ((a->n[2] << 12) & 0x3FFFFFFUL); r->n[3] = a->n[2] >> 14 | ((a->n[3] << 18) & 0x3FFFFFFUL); r->n[4] = a->n[3] >> 8 | ((a->n[4] << 24) & 0x3FFFFFFUL); r->n[5] = (a->n[4] >> 2) & 0x3FFFFFFUL; r->n[6] = a->n[4] >> 28 | ((a->n[5] << 4) & 0x3FFFFFFUL); r->n[7] = a->n[5] >> 22 | ((a->n[6] << 10) & 0x3FFFFFFUL); r->n[8] = a->n[6] >> 16 | ((a->n[7] << 16) & 0x3FFFFFFUL); r->n[9] = a->n[7] >> 10; #ifdef VERIFY r->magnitude = 1; r->normalized = 1; #endif } #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/field_5x52.h ================================================ /********************************************************************** * Copyright (c) 2013, 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_FIELD_REPR_ #define _SECP256K1_FIELD_REPR_ #include typedef struct { /* X = sum(i=0..4, elem[i]*2^52) mod n */ uint64_t n[5]; #ifdef VERIFY int magnitude; int normalized; #endif } secp256k1_fe; /* Unpacks a constant into a overlapping multi-limbed FE element. */ #define SECP256K1_FE_CONST_INNER(d7, d6, d5, d4, d3, d2, d1, d0) { \ (d0) | (((uint64_t)(d1) & 0xFFFFFUL) << 32), \ ((uint64_t)(d1) >> 20) | (((uint64_t)(d2)) << 12) | (((uint64_t)(d3) & 0xFFUL) << 44), \ ((uint64_t)(d3) >> 8) | (((uint64_t)(d4) & 0xFFFFFFFUL) << 24), \ ((uint64_t)(d4) >> 28) | (((uint64_t)(d5)) << 4) | (((uint64_t)(d6) & 0xFFFFUL) << 36), \ ((uint64_t)(d6) >> 16) | (((uint64_t)(d7)) << 16) \ } #ifdef VERIFY #define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {SECP256K1_FE_CONST_INNER((d7), (d6), (d5), (d4), (d3), (d2), (d1), (d0)), 1, 1} #else #define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {SECP256K1_FE_CONST_INNER((d7), (d6), (d5), (d4), (d3), (d2), (d1), (d0))} #endif typedef struct { uint64_t n[4]; } secp256k1_fe_storage; #define SECP256K1_FE_STORAGE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{ \ (d0) | (((uint64_t)(d1)) << 32), \ (d2) | (((uint64_t)(d3)) << 32), \ (d4) | (((uint64_t)(d5)) << 32), \ (d6) | (((uint64_t)(d7)) << 32) \ }} #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/field_5x52_asm_impl.h ================================================ /********************************************************************** * Copyright (c) 2013-2014 Diederik Huys, Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ /** * Changelog: * - March 2013, Diederik Huys: original version * - November 2014, Pieter Wuille: updated to use Peter Dettman's parallel multiplication algorithm * - December 2014, Pieter Wuille: converted from YASM to GCC inline assembly */ #ifndef _SECP256K1_FIELD_INNER5X52_IMPL_H_ #define _SECP256K1_FIELD_INNER5X52_IMPL_H_ SECP256K1_INLINE static void secp256k1_fe_mul_inner(uint64_t *r, const uint64_t *a, const uint64_t * SECP256K1_RESTRICT b) { /** * Registers: rdx:rax = multiplication accumulator * r9:r8 = c * r15:rcx = d * r10-r14 = a0-a4 * rbx = b * rdi = r * rsi = a / t? */ uint64_t tmp1, tmp2, tmp3; __asm__ __volatile__( "movq 0(%%rsi),%%r10\n" "movq 8(%%rsi),%%r11\n" "movq 16(%%rsi),%%r12\n" "movq 24(%%rsi),%%r13\n" "movq 32(%%rsi),%%r14\n" /* d += a3 * b0 */ "movq 0(%%rbx),%%rax\n" "mulq %%r13\n" "movq %%rax,%%rcx\n" "movq %%rdx,%%r15\n" /* d += a2 * b1 */ "movq 8(%%rbx),%%rax\n" "mulq %%r12\n" "addq %%rax,%%rcx\n" "adcq %%rdx,%%r15\n" /* d += a1 * b2 */ "movq 16(%%rbx),%%rax\n" "mulq %%r11\n" "addq %%rax,%%rcx\n" "adcq %%rdx,%%r15\n" /* d = a0 * b3 */ "movq 24(%%rbx),%%rax\n" "mulq %%r10\n" "addq %%rax,%%rcx\n" "adcq %%rdx,%%r15\n" /* c = a4 * b4 */ "movq 32(%%rbx),%%rax\n" "mulq %%r14\n" "movq %%rax,%%r8\n" "movq %%rdx,%%r9\n" /* d += (c & M) * R */ "movq $0xfffffffffffff,%%rdx\n" "andq %%rdx,%%rax\n" "movq $0x1000003d10,%%rdx\n" "mulq %%rdx\n" "addq %%rax,%%rcx\n" "adcq %%rdx,%%r15\n" /* c >>= 52 (%%r8 only) */ "shrdq $52,%%r9,%%r8\n" /* t3 (tmp1) = d & M */ "movq %%rcx,%%rsi\n" "movq $0xfffffffffffff,%%rdx\n" "andq %%rdx,%%rsi\n" "movq %%rsi,%q1\n" /* d >>= 52 */ "shrdq $52,%%r15,%%rcx\n" "xorq %%r15,%%r15\n" /* d += a4 * b0 */ "movq 0(%%rbx),%%rax\n" "mulq %%r14\n" "addq %%rax,%%rcx\n" "adcq %%rdx,%%r15\n" /* d += a3 * b1 */ "movq 8(%%rbx),%%rax\n" "mulq %%r13\n" "addq %%rax,%%rcx\n" "adcq %%rdx,%%r15\n" /* d += a2 * b2 */ "movq 16(%%rbx),%%rax\n" "mulq %%r12\n" "addq %%rax,%%rcx\n" "adcq %%rdx,%%r15\n" /* d += a1 * b3 */ "movq 24(%%rbx),%%rax\n" "mulq %%r11\n" "addq %%rax,%%rcx\n" "adcq %%rdx,%%r15\n" /* d += a0 * b4 */ "movq 32(%%rbx),%%rax\n" "mulq %%r10\n" "addq %%rax,%%rcx\n" "adcq %%rdx,%%r15\n" /* d += c * R */ "movq %%r8,%%rax\n" "movq $0x1000003d10,%%rdx\n" "mulq %%rdx\n" "addq %%rax,%%rcx\n" "adcq %%rdx,%%r15\n" /* t4 = d & M (%%rsi) */ "movq %%rcx,%%rsi\n" "movq $0xfffffffffffff,%%rdx\n" "andq %%rdx,%%rsi\n" /* d >>= 52 */ "shrdq $52,%%r15,%%rcx\n" "xorq %%r15,%%r15\n" /* tx = t4 >> 48 (tmp3) */ "movq %%rsi,%%rax\n" "shrq $48,%%rax\n" "movq %%rax,%q3\n" /* t4 &= (M >> 4) (tmp2) */ "movq $0xffffffffffff,%%rax\n" "andq %%rax,%%rsi\n" "movq %%rsi,%q2\n" /* c = a0 * b0 */ "movq 0(%%rbx),%%rax\n" "mulq %%r10\n" "movq %%rax,%%r8\n" "movq %%rdx,%%r9\n" /* d += a4 * b1 */ "movq 8(%%rbx),%%rax\n" "mulq %%r14\n" "addq %%rax,%%rcx\n" "adcq %%rdx,%%r15\n" /* d += a3 * b2 */ "movq 16(%%rbx),%%rax\n" "mulq %%r13\n" "addq %%rax,%%rcx\n" "adcq %%rdx,%%r15\n" /* d += a2 * b3 */ "movq 24(%%rbx),%%rax\n" "mulq %%r12\n" "addq %%rax,%%rcx\n" "adcq %%rdx,%%r15\n" /* d += a1 * b4 */ "movq 32(%%rbx),%%rax\n" "mulq %%r11\n" "addq %%rax,%%rcx\n" "adcq %%rdx,%%r15\n" /* u0 = d & M (%%rsi) */ "movq %%rcx,%%rsi\n" "movq $0xfffffffffffff,%%rdx\n" "andq %%rdx,%%rsi\n" /* d >>= 52 */ "shrdq $52,%%r15,%%rcx\n" "xorq %%r15,%%r15\n" /* u0 = (u0 << 4) | tx (%%rsi) */ "shlq $4,%%rsi\n" "movq %q3,%%rax\n" "orq %%rax,%%rsi\n" /* c += u0 * (R >> 4) */ "movq $0x1000003d1,%%rax\n" "mulq %%rsi\n" "addq %%rax,%%r8\n" "adcq %%rdx,%%r9\n" /* r[0] = c & M */ "movq %%r8,%%rax\n" "movq $0xfffffffffffff,%%rdx\n" "andq %%rdx,%%rax\n" "movq %%rax,0(%%rdi)\n" /* c >>= 52 */ "shrdq $52,%%r9,%%r8\n" "xorq %%r9,%%r9\n" /* c += a1 * b0 */ "movq 0(%%rbx),%%rax\n" "mulq %%r11\n" "addq %%rax,%%r8\n" "adcq %%rdx,%%r9\n" /* c += a0 * b1 */ "movq 8(%%rbx),%%rax\n" "mulq %%r10\n" "addq %%rax,%%r8\n" "adcq %%rdx,%%r9\n" /* d += a4 * b2 */ "movq 16(%%rbx),%%rax\n" "mulq %%r14\n" "addq %%rax,%%rcx\n" "adcq %%rdx,%%r15\n" /* d += a3 * b3 */ "movq 24(%%rbx),%%rax\n" "mulq %%r13\n" "addq %%rax,%%rcx\n" "adcq %%rdx,%%r15\n" /* d += a2 * b4 */ "movq 32(%%rbx),%%rax\n" "mulq %%r12\n" "addq %%rax,%%rcx\n" "adcq %%rdx,%%r15\n" /* c += (d & M) * R */ "movq %%rcx,%%rax\n" "movq $0xfffffffffffff,%%rdx\n" "andq %%rdx,%%rax\n" "movq $0x1000003d10,%%rdx\n" "mulq %%rdx\n" "addq %%rax,%%r8\n" "adcq %%rdx,%%r9\n" /* d >>= 52 */ "shrdq $52,%%r15,%%rcx\n" "xorq %%r15,%%r15\n" /* r[1] = c & M */ "movq %%r8,%%rax\n" "movq $0xfffffffffffff,%%rdx\n" "andq %%rdx,%%rax\n" "movq %%rax,8(%%rdi)\n" /* c >>= 52 */ "shrdq $52,%%r9,%%r8\n" "xorq %%r9,%%r9\n" /* c += a2 * b0 */ "movq 0(%%rbx),%%rax\n" "mulq %%r12\n" "addq %%rax,%%r8\n" "adcq %%rdx,%%r9\n" /* c += a1 * b1 */ "movq 8(%%rbx),%%rax\n" "mulq %%r11\n" "addq %%rax,%%r8\n" "adcq %%rdx,%%r9\n" /* c += a0 * b2 (last use of %%r10 = a0) */ "movq 16(%%rbx),%%rax\n" "mulq %%r10\n" "addq %%rax,%%r8\n" "adcq %%rdx,%%r9\n" /* fetch t3 (%%r10, overwrites a0), t4 (%%rsi) */ "movq %q2,%%rsi\n" "movq %q1,%%r10\n" /* d += a4 * b3 */ "movq 24(%%rbx),%%rax\n" "mulq %%r14\n" "addq %%rax,%%rcx\n" "adcq %%rdx,%%r15\n" /* d += a3 * b4 */ "movq 32(%%rbx),%%rax\n" "mulq %%r13\n" "addq %%rax,%%rcx\n" "adcq %%rdx,%%r15\n" /* c += (d & M) * R */ "movq %%rcx,%%rax\n" "movq $0xfffffffffffff,%%rdx\n" "andq %%rdx,%%rax\n" "movq $0x1000003d10,%%rdx\n" "mulq %%rdx\n" "addq %%rax,%%r8\n" "adcq %%rdx,%%r9\n" /* d >>= 52 (%%rcx only) */ "shrdq $52,%%r15,%%rcx\n" /* r[2] = c & M */ "movq %%r8,%%rax\n" "movq $0xfffffffffffff,%%rdx\n" "andq %%rdx,%%rax\n" "movq %%rax,16(%%rdi)\n" /* c >>= 52 */ "shrdq $52,%%r9,%%r8\n" "xorq %%r9,%%r9\n" /* c += t3 */ "addq %%r10,%%r8\n" /* c += d * R */ "movq %%rcx,%%rax\n" "movq $0x1000003d10,%%rdx\n" "mulq %%rdx\n" "addq %%rax,%%r8\n" "adcq %%rdx,%%r9\n" /* r[3] = c & M */ "movq %%r8,%%rax\n" "movq $0xfffffffffffff,%%rdx\n" "andq %%rdx,%%rax\n" "movq %%rax,24(%%rdi)\n" /* c >>= 52 (%%r8 only) */ "shrdq $52,%%r9,%%r8\n" /* c += t4 (%%r8 only) */ "addq %%rsi,%%r8\n" /* r[4] = c */ "movq %%r8,32(%%rdi)\n" : "+S"(a), "=m"(tmp1), "=m"(tmp2), "=m"(tmp3) : "b"(b), "D"(r) : "%rax", "%rcx", "%rdx", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15", "cc", "memory" ); } SECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint64_t *r, const uint64_t *a) { /** * Registers: rdx:rax = multiplication accumulator * r9:r8 = c * rcx:rbx = d * r10-r14 = a0-a4 * r15 = M (0xfffffffffffff) * rdi = r * rsi = a / t? */ uint64_t tmp1, tmp2, tmp3; __asm__ __volatile__( "movq 0(%%rsi),%%r10\n" "movq 8(%%rsi),%%r11\n" "movq 16(%%rsi),%%r12\n" "movq 24(%%rsi),%%r13\n" "movq 32(%%rsi),%%r14\n" "movq $0xfffffffffffff,%%r15\n" /* d = (a0*2) * a3 */ "leaq (%%r10,%%r10,1),%%rax\n" "mulq %%r13\n" "movq %%rax,%%rbx\n" "movq %%rdx,%%rcx\n" /* d += (a1*2) * a2 */ "leaq (%%r11,%%r11,1),%%rax\n" "mulq %%r12\n" "addq %%rax,%%rbx\n" "adcq %%rdx,%%rcx\n" /* c = a4 * a4 */ "movq %%r14,%%rax\n" "mulq %%r14\n" "movq %%rax,%%r8\n" "movq %%rdx,%%r9\n" /* d += (c & M) * R */ "andq %%r15,%%rax\n" "movq $0x1000003d10,%%rdx\n" "mulq %%rdx\n" "addq %%rax,%%rbx\n" "adcq %%rdx,%%rcx\n" /* c >>= 52 (%%r8 only) */ "shrdq $52,%%r9,%%r8\n" /* t3 (tmp1) = d & M */ "movq %%rbx,%%rsi\n" "andq %%r15,%%rsi\n" "movq %%rsi,%q1\n" /* d >>= 52 */ "shrdq $52,%%rcx,%%rbx\n" "xorq %%rcx,%%rcx\n" /* a4 *= 2 */ "addq %%r14,%%r14\n" /* d += a0 * a4 */ "movq %%r10,%%rax\n" "mulq %%r14\n" "addq %%rax,%%rbx\n" "adcq %%rdx,%%rcx\n" /* d+= (a1*2) * a3 */ "leaq (%%r11,%%r11,1),%%rax\n" "mulq %%r13\n" "addq %%rax,%%rbx\n" "adcq %%rdx,%%rcx\n" /* d += a2 * a2 */ "movq %%r12,%%rax\n" "mulq %%r12\n" "addq %%rax,%%rbx\n" "adcq %%rdx,%%rcx\n" /* d += c * R */ "movq %%r8,%%rax\n" "movq $0x1000003d10,%%rdx\n" "mulq %%rdx\n" "addq %%rax,%%rbx\n" "adcq %%rdx,%%rcx\n" /* t4 = d & M (%%rsi) */ "movq %%rbx,%%rsi\n" "andq %%r15,%%rsi\n" /* d >>= 52 */ "shrdq $52,%%rcx,%%rbx\n" "xorq %%rcx,%%rcx\n" /* tx = t4 >> 48 (tmp3) */ "movq %%rsi,%%rax\n" "shrq $48,%%rax\n" "movq %%rax,%q3\n" /* t4 &= (M >> 4) (tmp2) */ "movq $0xffffffffffff,%%rax\n" "andq %%rax,%%rsi\n" "movq %%rsi,%q2\n" /* c = a0 * a0 */ "movq %%r10,%%rax\n" "mulq %%r10\n" "movq %%rax,%%r8\n" "movq %%rdx,%%r9\n" /* d += a1 * a4 */ "movq %%r11,%%rax\n" "mulq %%r14\n" "addq %%rax,%%rbx\n" "adcq %%rdx,%%rcx\n" /* d += (a2*2) * a3 */ "leaq (%%r12,%%r12,1),%%rax\n" "mulq %%r13\n" "addq %%rax,%%rbx\n" "adcq %%rdx,%%rcx\n" /* u0 = d & M (%%rsi) */ "movq %%rbx,%%rsi\n" "andq %%r15,%%rsi\n" /* d >>= 52 */ "shrdq $52,%%rcx,%%rbx\n" "xorq %%rcx,%%rcx\n" /* u0 = (u0 << 4) | tx (%%rsi) */ "shlq $4,%%rsi\n" "movq %q3,%%rax\n" "orq %%rax,%%rsi\n" /* c += u0 * (R >> 4) */ "movq $0x1000003d1,%%rax\n" "mulq %%rsi\n" "addq %%rax,%%r8\n" "adcq %%rdx,%%r9\n" /* r[0] = c & M */ "movq %%r8,%%rax\n" "andq %%r15,%%rax\n" "movq %%rax,0(%%rdi)\n" /* c >>= 52 */ "shrdq $52,%%r9,%%r8\n" "xorq %%r9,%%r9\n" /* a0 *= 2 */ "addq %%r10,%%r10\n" /* c += a0 * a1 */ "movq %%r10,%%rax\n" "mulq %%r11\n" "addq %%rax,%%r8\n" "adcq %%rdx,%%r9\n" /* d += a2 * a4 */ "movq %%r12,%%rax\n" "mulq %%r14\n" "addq %%rax,%%rbx\n" "adcq %%rdx,%%rcx\n" /* d += a3 * a3 */ "movq %%r13,%%rax\n" "mulq %%r13\n" "addq %%rax,%%rbx\n" "adcq %%rdx,%%rcx\n" /* c += (d & M) * R */ "movq %%rbx,%%rax\n" "andq %%r15,%%rax\n" "movq $0x1000003d10,%%rdx\n" "mulq %%rdx\n" "addq %%rax,%%r8\n" "adcq %%rdx,%%r9\n" /* d >>= 52 */ "shrdq $52,%%rcx,%%rbx\n" "xorq %%rcx,%%rcx\n" /* r[1] = c & M */ "movq %%r8,%%rax\n" "andq %%r15,%%rax\n" "movq %%rax,8(%%rdi)\n" /* c >>= 52 */ "shrdq $52,%%r9,%%r8\n" "xorq %%r9,%%r9\n" /* c += a0 * a2 (last use of %%r10) */ "movq %%r10,%%rax\n" "mulq %%r12\n" "addq %%rax,%%r8\n" "adcq %%rdx,%%r9\n" /* fetch t3 (%%r10, overwrites a0),t4 (%%rsi) */ "movq %q2,%%rsi\n" "movq %q1,%%r10\n" /* c += a1 * a1 */ "movq %%r11,%%rax\n" "mulq %%r11\n" "addq %%rax,%%r8\n" "adcq %%rdx,%%r9\n" /* d += a3 * a4 */ "movq %%r13,%%rax\n" "mulq %%r14\n" "addq %%rax,%%rbx\n" "adcq %%rdx,%%rcx\n" /* c += (d & M) * R */ "movq %%rbx,%%rax\n" "andq %%r15,%%rax\n" "movq $0x1000003d10,%%rdx\n" "mulq %%rdx\n" "addq %%rax,%%r8\n" "adcq %%rdx,%%r9\n" /* d >>= 52 (%%rbx only) */ "shrdq $52,%%rcx,%%rbx\n" /* r[2] = c & M */ "movq %%r8,%%rax\n" "andq %%r15,%%rax\n" "movq %%rax,16(%%rdi)\n" /* c >>= 52 */ "shrdq $52,%%r9,%%r8\n" "xorq %%r9,%%r9\n" /* c += t3 */ "addq %%r10,%%r8\n" /* c += d * R */ "movq %%rbx,%%rax\n" "movq $0x1000003d10,%%rdx\n" "mulq %%rdx\n" "addq %%rax,%%r8\n" "adcq %%rdx,%%r9\n" /* r[3] = c & M */ "movq %%r8,%%rax\n" "andq %%r15,%%rax\n" "movq %%rax,24(%%rdi)\n" /* c >>= 52 (%%r8 only) */ "shrdq $52,%%r9,%%r8\n" /* c += t4 (%%r8 only) */ "addq %%rsi,%%r8\n" /* r[4] = c */ "movq %%r8,32(%%rdi)\n" : "+S"(a), "=m"(tmp1), "=m"(tmp2), "=m"(tmp3) : "D"(r) : "%rax", "%rbx", "%rcx", "%rdx", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15", "cc", "memory" ); } #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/field_5x52_impl.h ================================================ /********************************************************************** * Copyright (c) 2013, 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_FIELD_REPR_IMPL_H_ #define _SECP256K1_FIELD_REPR_IMPL_H_ #if defined HAVE_CONFIG_H #include "libsecp256k1-config.h" #endif #include "util.h" #include "num.h" #include "field.h" #if defined(USE_ASM_X86_64) #include "field_5x52_asm_impl.h" #else #include "field_5x52_int128_impl.h" #endif /** Implements arithmetic modulo FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F, * represented as 5 uint64_t's in base 2^52. The values are allowed to contain >52 each. In particular, * each FieldElem has a 'magnitude' associated with it. Internally, a magnitude M means each element * is at most M*(2^53-1), except the most significant one, which is limited to M*(2^49-1). All operations * accept any input with magnitude at most M, and have different rules for propagating magnitude to their * output. */ #ifdef VERIFY static void secp256k1_fe_verify(const secp256k1_fe *a) { const uint64_t *d = a->n; int m = a->normalized ? 1 : 2 * a->magnitude, r = 1; /* secp256k1 'p' value defined in "Standards for Efficient Cryptography" (SEC2) 2.7.1. */ r &= (d[0] <= 0xFFFFFFFFFFFFFULL * m); r &= (d[1] <= 0xFFFFFFFFFFFFFULL * m); r &= (d[2] <= 0xFFFFFFFFFFFFFULL * m); r &= (d[3] <= 0xFFFFFFFFFFFFFULL * m); r &= (d[4] <= 0x0FFFFFFFFFFFFULL * m); r &= (a->magnitude >= 0); r &= (a->magnitude <= 2048); if (a->normalized) { r &= (a->magnitude <= 1); if (r && (d[4] == 0x0FFFFFFFFFFFFULL) && ((d[3] & d[2] & d[1]) == 0xFFFFFFFFFFFFFULL)) { r &= (d[0] < 0xFFFFEFFFFFC2FULL); } } VERIFY_CHECK(r == 1); } #endif static void secp256k1_fe_normalize(secp256k1_fe *r) { uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; /* Reduce t4 at the start so there will be at most a single carry from the first pass */ uint64_t m; uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL; /* The first pass ensures the magnitude is 1, ... */ t0 += x * 0x1000003D1ULL; t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; m = t1; t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; m &= t2; t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; m &= t3; /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */ VERIFY_CHECK(t4 >> 49 == 0); /* At most a single final reduction is needed; check if the value is >= the field characteristic */ x = (t4 >> 48) | ((t4 == 0x0FFFFFFFFFFFFULL) & (m == 0xFFFFFFFFFFFFFULL) & (t0 >= 0xFFFFEFFFFFC2FULL)); /* Apply the final reduction (for constant-time behaviour, we do it always) */ t0 += x * 0x1000003D1ULL; t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; /* If t4 didn't carry to bit 48 already, then it should have after any final reduction */ VERIFY_CHECK(t4 >> 48 == x); /* Mask off the possible multiple of 2^256 from the final reduction */ t4 &= 0x0FFFFFFFFFFFFULL; r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; #ifdef VERIFY r->magnitude = 1; r->normalized = 1; secp256k1_fe_verify(r); #endif } static void secp256k1_fe_normalize_weak(secp256k1_fe *r) { uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; /* Reduce t4 at the start so there will be at most a single carry from the first pass */ uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL; /* The first pass ensures the magnitude is 1, ... */ t0 += x * 0x1000003D1ULL; t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */ VERIFY_CHECK(t4 >> 49 == 0); r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; #ifdef VERIFY r->magnitude = 1; secp256k1_fe_verify(r); #endif } static void secp256k1_fe_normalize_var(secp256k1_fe *r) { uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; /* Reduce t4 at the start so there will be at most a single carry from the first pass */ uint64_t m; uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL; /* The first pass ensures the magnitude is 1, ... */ t0 += x * 0x1000003D1ULL; t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; m = t1; t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; m &= t2; t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; m &= t3; /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */ VERIFY_CHECK(t4 >> 49 == 0); /* At most a single final reduction is needed; check if the value is >= the field characteristic */ x = (t4 >> 48) | ((t4 == 0x0FFFFFFFFFFFFULL) & (m == 0xFFFFFFFFFFFFFULL) & (t0 >= 0xFFFFEFFFFFC2FULL)); if (x) { t0 += 0x1000003D1ULL; t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; /* If t4 didn't carry to bit 48 already, then it should have after any final reduction */ VERIFY_CHECK(t4 >> 48 == x); /* Mask off the possible multiple of 2^256 from the final reduction */ t4 &= 0x0FFFFFFFFFFFFULL; } r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; #ifdef VERIFY r->magnitude = 1; r->normalized = 1; secp256k1_fe_verify(r); #endif } static int secp256k1_fe_normalizes_to_zero(secp256k1_fe *r) { uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; /* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */ uint64_t z0, z1; /* Reduce t4 at the start so there will be at most a single carry from the first pass */ uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL; /* The first pass ensures the magnitude is 1, ... */ t0 += x * 0x1000003D1ULL; t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; z0 = t0; z1 = t0 ^ 0x1000003D0ULL; t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; z0 |= t1; z1 &= t1; t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; z0 |= t2; z1 &= t2; t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; z0 |= t3; z1 &= t3; z0 |= t4; z1 &= t4 ^ 0xF000000000000ULL; /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */ VERIFY_CHECK(t4 >> 49 == 0); return (z0 == 0) | (z1 == 0xFFFFFFFFFFFFFULL); } static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe *r) { uint64_t t0, t1, t2, t3, t4; uint64_t z0, z1; uint64_t x; t0 = r->n[0]; t4 = r->n[4]; /* Reduce t4 at the start so there will be at most a single carry from the first pass */ x = t4 >> 48; /* The first pass ensures the magnitude is 1, ... */ t0 += x * 0x1000003D1ULL; /* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */ z0 = t0 & 0xFFFFFFFFFFFFFULL; z1 = z0 ^ 0x1000003D0ULL; /* Fast return path should catch the majority of cases */ if ((z0 != 0ULL) & (z1 != 0xFFFFFFFFFFFFFULL)) { return 0; } t1 = r->n[1]; t2 = r->n[2]; t3 = r->n[3]; t4 &= 0x0FFFFFFFFFFFFULL; t1 += (t0 >> 52); t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; z0 |= t1; z1 &= t1; t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; z0 |= t2; z1 &= t2; t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; z0 |= t3; z1 &= t3; z0 |= t4; z1 &= t4 ^ 0xF000000000000ULL; /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */ VERIFY_CHECK(t4 >> 49 == 0); return (z0 == 0) | (z1 == 0xFFFFFFFFFFFFFULL); } SECP256K1_INLINE static void secp256k1_fe_set_int(secp256k1_fe *r, int a) { r->n[0] = a; r->n[1] = r->n[2] = r->n[3] = r->n[4] = 0; #ifdef VERIFY r->magnitude = 1; r->normalized = 1; secp256k1_fe_verify(r); #endif } SECP256K1_INLINE static int secp256k1_fe_is_zero(const secp256k1_fe *a) { const uint64_t *t = a->n; #ifdef VERIFY VERIFY_CHECK(a->normalized); secp256k1_fe_verify(a); #endif return (t[0] | t[1] | t[2] | t[3] | t[4]) == 0; } SECP256K1_INLINE static int secp256k1_fe_is_odd(const secp256k1_fe *a) { #ifdef VERIFY VERIFY_CHECK(a->normalized); secp256k1_fe_verify(a); #endif return a->n[0] & 1; } SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe *a) { int i; #ifdef VERIFY a->magnitude = 0; a->normalized = 1; #endif for (i=0; i<5; i++) { a->n[i] = 0; } } static int secp256k1_fe_cmp_var(const secp256k1_fe *a, const secp256k1_fe *b) { int i; #ifdef VERIFY VERIFY_CHECK(a->normalized); VERIFY_CHECK(b->normalized); secp256k1_fe_verify(a); secp256k1_fe_verify(b); #endif for (i = 4; i >= 0; i--) { if (a->n[i] > b->n[i]) { return 1; } if (a->n[i] < b->n[i]) { return -1; } } return 0; } static int secp256k1_fe_set_b32(secp256k1_fe *r, const unsigned char *a) { int i; r->n[0] = r->n[1] = r->n[2] = r->n[3] = r->n[4] = 0; for (i=0; i<32; i++) { int j; for (j=0; j<2; j++) { int limb = (8*i+4*j)/52; int shift = (8*i+4*j)%52; r->n[limb] |= (uint64_t)((a[31-i] >> (4*j)) & 0xF) << shift; } } if (r->n[4] == 0x0FFFFFFFFFFFFULL && (r->n[3] & r->n[2] & r->n[1]) == 0xFFFFFFFFFFFFFULL && r->n[0] >= 0xFFFFEFFFFFC2FULL) { return 0; } #ifdef VERIFY r->magnitude = 1; r->normalized = 1; secp256k1_fe_verify(r); #endif return 1; } /** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */ static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe *a) { int i; #ifdef VERIFY VERIFY_CHECK(a->normalized); secp256k1_fe_verify(a); #endif for (i=0; i<32; i++) { int j; int c = 0; for (j=0; j<2; j++) { int limb = (8*i+4*j)/52; int shift = (8*i+4*j)%52; c |= ((a->n[limb] >> shift) & 0xF) << (4 * j); } r[31-i] = c; } } SECP256K1_INLINE static void secp256k1_fe_negate(secp256k1_fe *r, const secp256k1_fe *a, int m) { #ifdef VERIFY VERIFY_CHECK(a->magnitude <= m); secp256k1_fe_verify(a); #endif r->n[0] = 0xFFFFEFFFFFC2FULL * 2 * (m + 1) - a->n[0]; r->n[1] = 0xFFFFFFFFFFFFFULL * 2 * (m + 1) - a->n[1]; r->n[2] = 0xFFFFFFFFFFFFFULL * 2 * (m + 1) - a->n[2]; r->n[3] = 0xFFFFFFFFFFFFFULL * 2 * (m + 1) - a->n[3]; r->n[4] = 0x0FFFFFFFFFFFFULL * 2 * (m + 1) - a->n[4]; #ifdef VERIFY r->magnitude = m + 1; r->normalized = 0; secp256k1_fe_verify(r); #endif } SECP256K1_INLINE static void secp256k1_fe_mul_int(secp256k1_fe *r, int a) { r->n[0] *= a; r->n[1] *= a; r->n[2] *= a; r->n[3] *= a; r->n[4] *= a; #ifdef VERIFY r->magnitude *= a; r->normalized = 0; secp256k1_fe_verify(r); #endif } SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe *r, const secp256k1_fe *a) { #ifdef VERIFY secp256k1_fe_verify(a); #endif r->n[0] += a->n[0]; r->n[1] += a->n[1]; r->n[2] += a->n[2]; r->n[3] += a->n[3]; r->n[4] += a->n[4]; #ifdef VERIFY r->magnitude += a->magnitude; r->normalized = 0; secp256k1_fe_verify(r); #endif } static void secp256k1_fe_mul(secp256k1_fe *r, const secp256k1_fe *a, const secp256k1_fe * SECP256K1_RESTRICT b) { #ifdef VERIFY VERIFY_CHECK(a->magnitude <= 8); VERIFY_CHECK(b->magnitude <= 8); secp256k1_fe_verify(a); secp256k1_fe_verify(b); VERIFY_CHECK(r != b); #endif secp256k1_fe_mul_inner(r->n, a->n, b->n); #ifdef VERIFY r->magnitude = 1; r->normalized = 0; secp256k1_fe_verify(r); #endif } static void secp256k1_fe_sqr(secp256k1_fe *r, const secp256k1_fe *a) { #ifdef VERIFY VERIFY_CHECK(a->magnitude <= 8); secp256k1_fe_verify(a); #endif secp256k1_fe_sqr_inner(r->n, a->n); #ifdef VERIFY r->magnitude = 1; r->normalized = 0; secp256k1_fe_verify(r); #endif } static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag) { uint64_t mask0, mask1; mask0 = flag + ~((uint64_t)0); mask1 = ~mask0; r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1); r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1); r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1); r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1); r->n[4] = (r->n[4] & mask0) | (a->n[4] & mask1); #ifdef VERIFY if (a->magnitude > r->magnitude) { r->magnitude = a->magnitude; } r->normalized &= a->normalized; #endif } static SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage *r, const secp256k1_fe_storage *a, int flag) { uint64_t mask0, mask1; mask0 = flag + ~((uint64_t)0); mask1 = ~mask0; r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1); r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1); r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1); r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1); } static void secp256k1_fe_to_storage(secp256k1_fe_storage *r, const secp256k1_fe *a) { #ifdef VERIFY VERIFY_CHECK(a->normalized); #endif r->n[0] = a->n[0] | a->n[1] << 52; r->n[1] = a->n[1] >> 12 | a->n[2] << 40; r->n[2] = a->n[2] >> 24 | a->n[3] << 28; r->n[3] = a->n[3] >> 36 | a->n[4] << 16; } static SECP256K1_INLINE void secp256k1_fe_from_storage(secp256k1_fe *r, const secp256k1_fe_storage *a) { r->n[0] = a->n[0] & 0xFFFFFFFFFFFFFULL; r->n[1] = a->n[0] >> 52 | ((a->n[1] << 12) & 0xFFFFFFFFFFFFFULL); r->n[2] = a->n[1] >> 40 | ((a->n[2] << 24) & 0xFFFFFFFFFFFFFULL); r->n[3] = a->n[2] >> 28 | ((a->n[3] << 36) & 0xFFFFFFFFFFFFFULL); r->n[4] = a->n[3] >> 16; #ifdef VERIFY r->magnitude = 1; r->normalized = 1; #endif } #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/field_5x52_int128_impl.h ================================================ /********************************************************************** * Copyright (c) 2013, 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_FIELD_INNER5X52_IMPL_H_ #define _SECP256K1_FIELD_INNER5X52_IMPL_H_ #include #ifdef VERIFY #define VERIFY_BITS(x, n) VERIFY_CHECK(((x) >> (n)) == 0) #else #define VERIFY_BITS(x, n) do { } while(0) #endif SECP256K1_INLINE static void secp256k1_fe_mul_inner(uint64_t *r, const uint64_t *a, const uint64_t * SECP256K1_RESTRICT b) { uint128_t c, d; uint64_t t3, t4, tx, u0; uint64_t a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4]; const uint64_t M = 0xFFFFFFFFFFFFFULL, R = 0x1000003D10ULL; VERIFY_BITS(a[0], 56); VERIFY_BITS(a[1], 56); VERIFY_BITS(a[2], 56); VERIFY_BITS(a[3], 56); VERIFY_BITS(a[4], 52); VERIFY_BITS(b[0], 56); VERIFY_BITS(b[1], 56); VERIFY_BITS(b[2], 56); VERIFY_BITS(b[3], 56); VERIFY_BITS(b[4], 52); VERIFY_CHECK(r != b); /* [... a b c] is a shorthand for ... + a<<104 + b<<52 + c<<0 mod n. * px is a shorthand for sum(a[i]*b[x-i], i=0..x). * Note that [x 0 0 0 0 0] = [x*R]. */ d = (uint128_t)a0 * b[3] + (uint128_t)a1 * b[2] + (uint128_t)a2 * b[1] + (uint128_t)a3 * b[0]; VERIFY_BITS(d, 114); /* [d 0 0 0] = [p3 0 0 0] */ c = (uint128_t)a4 * b[4]; VERIFY_BITS(c, 112); /* [c 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ d += (c & M) * R; c >>= 52; VERIFY_BITS(d, 115); VERIFY_BITS(c, 60); /* [c 0 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ t3 = d & M; d >>= 52; VERIFY_BITS(t3, 52); VERIFY_BITS(d, 63); /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ d += (uint128_t)a0 * b[4] + (uint128_t)a1 * b[3] + (uint128_t)a2 * b[2] + (uint128_t)a3 * b[1] + (uint128_t)a4 * b[0]; VERIFY_BITS(d, 115); /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ d += c * R; VERIFY_BITS(d, 116); /* [d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ t4 = d & M; d >>= 52; VERIFY_BITS(t4, 52); VERIFY_BITS(d, 64); /* [d t4 t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ tx = (t4 >> 48); t4 &= (M >> 4); VERIFY_BITS(tx, 4); VERIFY_BITS(t4, 48); /* [d t4+(tx<<48) t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ c = (uint128_t)a0 * b[0]; VERIFY_BITS(c, 112); /* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 0 p4 p3 0 0 p0] */ d += (uint128_t)a1 * b[4] + (uint128_t)a2 * b[3] + (uint128_t)a3 * b[2] + (uint128_t)a4 * b[1]; VERIFY_BITS(d, 115); /* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ u0 = d & M; d >>= 52; VERIFY_BITS(u0, 52); VERIFY_BITS(d, 63); /* [d u0 t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ /* [d 0 t4+(tx<<48)+(u0<<52) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ u0 = (u0 << 4) | tx; VERIFY_BITS(u0, 56); /* [d 0 t4+(u0<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ c += (uint128_t)u0 * (R >> 4); VERIFY_BITS(c, 115); /* [d 0 t4 t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ r[0] = c & M; c >>= 52; VERIFY_BITS(r[0], 52); VERIFY_BITS(c, 61); /* [d 0 t4 t3 0 c r0] = [p8 0 0 p5 p4 p3 0 0 p0] */ c += (uint128_t)a0 * b[1] + (uint128_t)a1 * b[0]; VERIFY_BITS(c, 114); /* [d 0 t4 t3 0 c r0] = [p8 0 0 p5 p4 p3 0 p1 p0] */ d += (uint128_t)a2 * b[4] + (uint128_t)a3 * b[3] + (uint128_t)a4 * b[2]; VERIFY_BITS(d, 114); /* [d 0 t4 t3 0 c r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ c += (d & M) * R; d >>= 52; VERIFY_BITS(c, 115); VERIFY_BITS(d, 62); /* [d 0 0 t4 t3 0 c r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ r[1] = c & M; c >>= 52; VERIFY_BITS(r[1], 52); VERIFY_BITS(c, 63); /* [d 0 0 t4 t3 c r1 r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ c += (uint128_t)a0 * b[2] + (uint128_t)a1 * b[1] + (uint128_t)a2 * b[0]; VERIFY_BITS(c, 114); /* [d 0 0 t4 t3 c r1 r0] = [p8 0 p6 p5 p4 p3 p2 p1 p0] */ d += (uint128_t)a3 * b[4] + (uint128_t)a4 * b[3]; VERIFY_BITS(d, 114); /* [d 0 0 t4 t3 c t1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ c += (d & M) * R; d >>= 52; VERIFY_BITS(c, 115); VERIFY_BITS(d, 62); /* [d 0 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ /* [d 0 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[2] = c & M; c >>= 52; VERIFY_BITS(r[2], 52); VERIFY_BITS(c, 63); /* [d 0 0 0 t4 t3+c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ c += d * R + t3; VERIFY_BITS(c, 100); /* [t4 c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[3] = c & M; c >>= 52; VERIFY_BITS(r[3], 52); VERIFY_BITS(c, 48); /* [t4+c r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ c += t4; VERIFY_BITS(c, 49); /* [c r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[4] = c; VERIFY_BITS(r[4], 49); /* [r4 r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ } SECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint64_t *r, const uint64_t *a) { uint128_t c, d; uint64_t a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4]; int64_t t3, t4, tx, u0; const uint64_t M = 0xFFFFFFFFFFFFFULL, R = 0x1000003D10ULL; VERIFY_BITS(a[0], 56); VERIFY_BITS(a[1], 56); VERIFY_BITS(a[2], 56); VERIFY_BITS(a[3], 56); VERIFY_BITS(a[4], 52); /** [... a b c] is a shorthand for ... + a<<104 + b<<52 + c<<0 mod n. * px is a shorthand for sum(a[i]*a[x-i], i=0..x). * Note that [x 0 0 0 0 0] = [x*R]. */ d = (uint128_t)(a0*2) * a3 + (uint128_t)(a1*2) * a2; VERIFY_BITS(d, 114); /* [d 0 0 0] = [p3 0 0 0] */ c = (uint128_t)a4 * a4; VERIFY_BITS(c, 112); /* [c 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ d += (c & M) * R; c >>= 52; VERIFY_BITS(d, 115); VERIFY_BITS(c, 60); /* [c 0 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ t3 = d & M; d >>= 52; VERIFY_BITS(t3, 52); VERIFY_BITS(d, 63); /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ a4 *= 2; d += (uint128_t)a0 * a4 + (uint128_t)(a1*2) * a3 + (uint128_t)a2 * a2; VERIFY_BITS(d, 115); /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ d += c * R; VERIFY_BITS(d, 116); /* [d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ t4 = d & M; d >>= 52; VERIFY_BITS(t4, 52); VERIFY_BITS(d, 64); /* [d t4 t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ tx = (t4 >> 48); t4 &= (M >> 4); VERIFY_BITS(tx, 4); VERIFY_BITS(t4, 48); /* [d t4+(tx<<48) t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ c = (uint128_t)a0 * a0; VERIFY_BITS(c, 112); /* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 0 p4 p3 0 0 p0] */ d += (uint128_t)a1 * a4 + (uint128_t)(a2*2) * a3; VERIFY_BITS(d, 114); /* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ u0 = d & M; d >>= 52; VERIFY_BITS(u0, 52); VERIFY_BITS(d, 62); /* [d u0 t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ /* [d 0 t4+(tx<<48)+(u0<<52) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ u0 = (u0 << 4) | tx; VERIFY_BITS(u0, 56); /* [d 0 t4+(u0<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ c += (uint128_t)u0 * (R >> 4); VERIFY_BITS(c, 113); /* [d 0 t4 t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ r[0] = c & M; c >>= 52; VERIFY_BITS(r[0], 52); VERIFY_BITS(c, 61); /* [d 0 t4 t3 0 c r0] = [p8 0 0 p5 p4 p3 0 0 p0] */ a0 *= 2; c += (uint128_t)a0 * a1; VERIFY_BITS(c, 114); /* [d 0 t4 t3 0 c r0] = [p8 0 0 p5 p4 p3 0 p1 p0] */ d += (uint128_t)a2 * a4 + (uint128_t)a3 * a3; VERIFY_BITS(d, 114); /* [d 0 t4 t3 0 c r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ c += (d & M) * R; d >>= 52; VERIFY_BITS(c, 115); VERIFY_BITS(d, 62); /* [d 0 0 t4 t3 0 c r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ r[1] = c & M; c >>= 52; VERIFY_BITS(r[1], 52); VERIFY_BITS(c, 63); /* [d 0 0 t4 t3 c r1 r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ c += (uint128_t)a0 * a2 + (uint128_t)a1 * a1; VERIFY_BITS(c, 114); /* [d 0 0 t4 t3 c r1 r0] = [p8 0 p6 p5 p4 p3 p2 p1 p0] */ d += (uint128_t)a3 * a4; VERIFY_BITS(d, 114); /* [d 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ c += (d & M) * R; d >>= 52; VERIFY_BITS(c, 115); VERIFY_BITS(d, 62); /* [d 0 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[2] = c & M; c >>= 52; VERIFY_BITS(r[2], 52); VERIFY_BITS(c, 63); /* [d 0 0 0 t4 t3+c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ c += d * R + t3; VERIFY_BITS(c, 100); /* [t4 c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[3] = c & M; c >>= 52; VERIFY_BITS(r[3], 52); VERIFY_BITS(c, 48); /* [t4+c r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ c += t4; VERIFY_BITS(c, 49); /* [c r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ r[4] = c; VERIFY_BITS(r[4], 49); /* [r4 r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ } #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/field_impl.h ================================================ /********************************************************************** * Copyright (c) 2013, 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_FIELD_IMPL_H_ #define _SECP256K1_FIELD_IMPL_H_ #if defined HAVE_CONFIG_H #include "libsecp256k1-config.h" #endif #include "util.h" #if defined(USE_FIELD_10X26) #include "field_10x26_impl.h" #elif defined(USE_FIELD_5X52) #include "field_5x52_impl.h" #else #error "Please select field implementation" #endif SECP256K1_INLINE static int secp256k1_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b) { secp256k1_fe na; secp256k1_fe_negate(&na, a, 1); secp256k1_fe_add(&na, b); return secp256k1_fe_normalizes_to_zero(&na); } SECP256K1_INLINE static int secp256k1_fe_equal_var(const secp256k1_fe *a, const secp256k1_fe *b) { secp256k1_fe na; secp256k1_fe_negate(&na, a, 1); secp256k1_fe_add(&na, b); return secp256k1_fe_normalizes_to_zero_var(&na); } static int secp256k1_fe_sqrt(secp256k1_fe *r, const secp256k1_fe *a) { /** Given that p is congruent to 3 mod 4, we can compute the square root of * a mod p as the (p+1)/4'th power of a. * * As (p+1)/4 is an even number, it will have the same result for a and for * (-a). Only one of these two numbers actually has a square root however, * so we test at the end by squaring and comparing to the input. * Also because (p+1)/4 is an even number, the computed square root is * itself always a square (a ** ((p+1)/4) is the square of a ** ((p+1)/8)). */ secp256k1_fe x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1; int j; /** The binary representation of (p + 1)/4 has 3 blocks of 1s, with lengths in * { 2, 22, 223 }. Use an addition chain to calculate 2^n - 1 for each block: * 1, [2], 3, 6, 9, 11, [22], 44, 88, 176, 220, [223] */ secp256k1_fe_sqr(&x2, a); secp256k1_fe_mul(&x2, &x2, a); secp256k1_fe_sqr(&x3, &x2); secp256k1_fe_mul(&x3, &x3, a); x6 = x3; for (j=0; j<3; j++) { secp256k1_fe_sqr(&x6, &x6); } secp256k1_fe_mul(&x6, &x6, &x3); x9 = x6; for (j=0; j<3; j++) { secp256k1_fe_sqr(&x9, &x9); } secp256k1_fe_mul(&x9, &x9, &x3); x11 = x9; for (j=0; j<2; j++) { secp256k1_fe_sqr(&x11, &x11); } secp256k1_fe_mul(&x11, &x11, &x2); x22 = x11; for (j=0; j<11; j++) { secp256k1_fe_sqr(&x22, &x22); } secp256k1_fe_mul(&x22, &x22, &x11); x44 = x22; for (j=0; j<22; j++) { secp256k1_fe_sqr(&x44, &x44); } secp256k1_fe_mul(&x44, &x44, &x22); x88 = x44; for (j=0; j<44; j++) { secp256k1_fe_sqr(&x88, &x88); } secp256k1_fe_mul(&x88, &x88, &x44); x176 = x88; for (j=0; j<88; j++) { secp256k1_fe_sqr(&x176, &x176); } secp256k1_fe_mul(&x176, &x176, &x88); x220 = x176; for (j=0; j<44; j++) { secp256k1_fe_sqr(&x220, &x220); } secp256k1_fe_mul(&x220, &x220, &x44); x223 = x220; for (j=0; j<3; j++) { secp256k1_fe_sqr(&x223, &x223); } secp256k1_fe_mul(&x223, &x223, &x3); /* The final result is then assembled using a sliding window over the blocks. */ t1 = x223; for (j=0; j<23; j++) { secp256k1_fe_sqr(&t1, &t1); } secp256k1_fe_mul(&t1, &t1, &x22); for (j=0; j<6; j++) { secp256k1_fe_sqr(&t1, &t1); } secp256k1_fe_mul(&t1, &t1, &x2); secp256k1_fe_sqr(&t1, &t1); secp256k1_fe_sqr(r, &t1); /* Check that a square root was actually calculated */ secp256k1_fe_sqr(&t1, r); return secp256k1_fe_equal(&t1, a); } static void secp256k1_fe_inv(secp256k1_fe *r, const secp256k1_fe *a) { secp256k1_fe x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1; int j; /** The binary representation of (p - 2) has 5 blocks of 1s, with lengths in * { 1, 2, 22, 223 }. Use an addition chain to calculate 2^n - 1 for each block: * [1], [2], 3, 6, 9, 11, [22], 44, 88, 176, 220, [223] */ secp256k1_fe_sqr(&x2, a); secp256k1_fe_mul(&x2, &x2, a); secp256k1_fe_sqr(&x3, &x2); secp256k1_fe_mul(&x3, &x3, a); x6 = x3; for (j=0; j<3; j++) { secp256k1_fe_sqr(&x6, &x6); } secp256k1_fe_mul(&x6, &x6, &x3); x9 = x6; for (j=0; j<3; j++) { secp256k1_fe_sqr(&x9, &x9); } secp256k1_fe_mul(&x9, &x9, &x3); x11 = x9; for (j=0; j<2; j++) { secp256k1_fe_sqr(&x11, &x11); } secp256k1_fe_mul(&x11, &x11, &x2); x22 = x11; for (j=0; j<11; j++) { secp256k1_fe_sqr(&x22, &x22); } secp256k1_fe_mul(&x22, &x22, &x11); x44 = x22; for (j=0; j<22; j++) { secp256k1_fe_sqr(&x44, &x44); } secp256k1_fe_mul(&x44, &x44, &x22); x88 = x44; for (j=0; j<44; j++) { secp256k1_fe_sqr(&x88, &x88); } secp256k1_fe_mul(&x88, &x88, &x44); x176 = x88; for (j=0; j<88; j++) { secp256k1_fe_sqr(&x176, &x176); } secp256k1_fe_mul(&x176, &x176, &x88); x220 = x176; for (j=0; j<44; j++) { secp256k1_fe_sqr(&x220, &x220); } secp256k1_fe_mul(&x220, &x220, &x44); x223 = x220; for (j=0; j<3; j++) { secp256k1_fe_sqr(&x223, &x223); } secp256k1_fe_mul(&x223, &x223, &x3); /* The final result is then assembled using a sliding window over the blocks. */ t1 = x223; for (j=0; j<23; j++) { secp256k1_fe_sqr(&t1, &t1); } secp256k1_fe_mul(&t1, &t1, &x22); for (j=0; j<5; j++) { secp256k1_fe_sqr(&t1, &t1); } secp256k1_fe_mul(&t1, &t1, a); for (j=0; j<3; j++) { secp256k1_fe_sqr(&t1, &t1); } secp256k1_fe_mul(&t1, &t1, &x2); for (j=0; j<2; j++) { secp256k1_fe_sqr(&t1, &t1); } secp256k1_fe_mul(r, a, &t1); } static void secp256k1_fe_inv_var(secp256k1_fe *r, const secp256k1_fe *a) { #if defined(USE_FIELD_INV_BUILTIN) secp256k1_fe_inv(r, a); #elif defined(USE_FIELD_INV_NUM) secp256k1_num n, m; static const secp256k1_fe negone = SECP256K1_FE_CONST( 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL, 0xFFFFFC2EUL ); /* secp256k1 field prime, value p defined in "Standards for Efficient Cryptography" (SEC2) 2.7.1. */ static const unsigned char prime[32] = { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F }; unsigned char b[32]; int res; secp256k1_fe c = *a; secp256k1_fe_normalize_var(&c); secp256k1_fe_get_b32(b, &c); secp256k1_num_set_bin(&n, b, 32); secp256k1_num_set_bin(&m, prime, 32); secp256k1_num_mod_inverse(&n, &n, &m); secp256k1_num_get_bin(b, 32, &n); res = secp256k1_fe_set_b32(r, b); (void)res; VERIFY_CHECK(res); /* Verify the result is the (unique) valid inverse using non-GMP code. */ secp256k1_fe_mul(&c, &c, r); secp256k1_fe_add(&c, &negone); CHECK(secp256k1_fe_normalizes_to_zero_var(&c)); #else #error "Please select field inverse implementation" #endif } static void secp256k1_fe_inv_all_var(secp256k1_fe *r, const secp256k1_fe *a, size_t len) { secp256k1_fe u; size_t i; if (len < 1) { return; } VERIFY_CHECK((r + len <= a) || (a + len <= r)); r[0] = a[0]; i = 0; while (++i < len) { secp256k1_fe_mul(&r[i], &r[i - 1], &a[i]); } secp256k1_fe_inv_var(&u, &r[--i]); while (i > 0) { size_t j = i--; secp256k1_fe_mul(&r[j], &r[i], &u); secp256k1_fe_mul(&u, &u, &a[j]); } r[0] = u; } static int secp256k1_fe_is_quad_var(const secp256k1_fe *a) { #ifndef USE_NUM_NONE unsigned char b[32]; secp256k1_num n; secp256k1_num m; /* secp256k1 field prime, value p defined in "Standards for Efficient Cryptography" (SEC2) 2.7.1. */ static const unsigned char prime[32] = { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F }; secp256k1_fe c = *a; secp256k1_fe_normalize_var(&c); secp256k1_fe_get_b32(b, &c); secp256k1_num_set_bin(&n, b, 32); secp256k1_num_set_bin(&m, prime, 32); return secp256k1_num_jacobi(&n, &m) >= 0; #else secp256k1_fe r; return secp256k1_fe_sqrt(&r, a); #endif } #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/gen_context.c ================================================ /********************************************************************** * Copyright (c) 2013, 2014, 2015 Thomas Daede, Cory Fields * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #define USE_BASIC_CONFIG 1 #include "basic-config.h" #include "include/secp256k1.h" #include "field_impl.h" #include "scalar_impl.h" #include "group_impl.h" #include "ecmult_gen_impl.h" static void default_error_callback_fn(const char* str, void* data) { (void)data; fprintf(stderr, "[libsecp256k1] internal consistency check failed: %s\n", str); abort(); } static const secp256k1_callback default_error_callback = { default_error_callback_fn, NULL }; int main(int argc, char **argv) { secp256k1_ecmult_gen_context ctx; int inner; int outer; FILE* fp; (void)argc; (void)argv; fp = fopen("src/ecmult_static_context.h","w"); if (fp == NULL) { fprintf(stderr, "Could not open src/ecmult_static_context.h for writing!\n"); return -1; } fprintf(fp, "#ifndef _SECP256K1_ECMULT_STATIC_CONTEXT_\n"); fprintf(fp, "#define _SECP256K1_ECMULT_STATIC_CONTEXT_\n"); fprintf(fp, "#include \"group.h\"\n"); fprintf(fp, "#define SC SECP256K1_GE_STORAGE_CONST\n"); fprintf(fp, "static const secp256k1_ge_storage secp256k1_ecmult_static_context[64][16] = {\n"); secp256k1_ecmult_gen_context_init(&ctx); secp256k1_ecmult_gen_context_build(&ctx, &default_error_callback); for(outer = 0; outer != 64; outer++) { fprintf(fp,"{\n"); for(inner = 0; inner != 16; inner++) { fprintf(fp," SC(%uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu)", SECP256K1_GE_STORAGE_CONST_GET((*ctx.prec)[outer][inner])); if (inner != 15) { fprintf(fp,",\n"); } else { fprintf(fp,"\n"); } } if (outer != 63) { fprintf(fp,"},\n"); } else { fprintf(fp,"}\n"); } } fprintf(fp,"};\n"); secp256k1_ecmult_gen_context_clear(&ctx); fprintf(fp, "#undef SC\n"); fprintf(fp, "#endif\n"); fclose(fp); return 0; } ================================================ FILE: crypto/secp256k1/libsecp256k1/src/group.h ================================================ /********************************************************************** * Copyright (c) 2013, 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_GROUP_ #define _SECP256K1_GROUP_ #include "num.h" #include "field.h" /** A group element of the secp256k1 curve, in affine coordinates. */ typedef struct { secp256k1_fe x; secp256k1_fe y; int infinity; /* whether this represents the point at infinity */ } secp256k1_ge; #define SECP256K1_GE_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {SECP256K1_FE_CONST((a),(b),(c),(d),(e),(f),(g),(h)), SECP256K1_FE_CONST((i),(j),(k),(l),(m),(n),(o),(p)), 0} #define SECP256K1_GE_CONST_INFINITY {SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), 1} /** A group element of the secp256k1 curve, in jacobian coordinates. */ typedef struct { secp256k1_fe x; /* actual X: x/z^2 */ secp256k1_fe y; /* actual Y: y/z^3 */ secp256k1_fe z; int infinity; /* whether this represents the point at infinity */ } secp256k1_gej; #define SECP256K1_GEJ_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {SECP256K1_FE_CONST((a),(b),(c),(d),(e),(f),(g),(h)), SECP256K1_FE_CONST((i),(j),(k),(l),(m),(n),(o),(p)), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1), 0} #define SECP256K1_GEJ_CONST_INFINITY {SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), 1} typedef struct { secp256k1_fe_storage x; secp256k1_fe_storage y; } secp256k1_ge_storage; #define SECP256K1_GE_STORAGE_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {SECP256K1_FE_STORAGE_CONST((a),(b),(c),(d),(e),(f),(g),(h)), SECP256K1_FE_STORAGE_CONST((i),(j),(k),(l),(m),(n),(o),(p))} #define SECP256K1_GE_STORAGE_CONST_GET(t) SECP256K1_FE_STORAGE_CONST_GET(t.x), SECP256K1_FE_STORAGE_CONST_GET(t.y) /** Set a group element equal to the point with given X and Y coordinates */ static void secp256k1_ge_set_xy(secp256k1_ge *r, const secp256k1_fe *x, const secp256k1_fe *y); /** Set a group element (affine) equal to the point with the given X coordinate * and a Y coordinate that is a quadratic residue modulo p. The return value * is true iff a coordinate with the given X coordinate exists. */ static int secp256k1_ge_set_xquad(secp256k1_ge *r, const secp256k1_fe *x); /** Set a group element (affine) equal to the point with the given X coordinate, and given oddness * for Y. Return value indicates whether the result is valid. */ static int secp256k1_ge_set_xo_var(secp256k1_ge *r, const secp256k1_fe *x, int odd); /** Check whether a group element is the point at infinity. */ static int secp256k1_ge_is_infinity(const secp256k1_ge *a); /** Check whether a group element is valid (i.e., on the curve). */ static int secp256k1_ge_is_valid_var(const secp256k1_ge *a); static void secp256k1_ge_neg(secp256k1_ge *r, const secp256k1_ge *a); /** Set a group element equal to another which is given in jacobian coordinates */ static void secp256k1_ge_set_gej(secp256k1_ge *r, secp256k1_gej *a); /** Set a batch of group elements equal to the inputs given in jacobian coordinates */ static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a, size_t len, const secp256k1_callback *cb); /** Set a batch of group elements equal to the inputs given in jacobian * coordinates (with known z-ratios). zr must contain the known z-ratios such * that mul(a[i].z, zr[i+1]) == a[i+1].z. zr[0] is ignored. */ static void secp256k1_ge_set_table_gej_var(secp256k1_ge *r, const secp256k1_gej *a, const secp256k1_fe *zr, size_t len); /** Bring a batch inputs given in jacobian coordinates (with known z-ratios) to * the same global z "denominator". zr must contain the known z-ratios such * that mul(a[i].z, zr[i+1]) == a[i+1].z. zr[0] is ignored. The x and y * coordinates of the result are stored in r, the common z coordinate is * stored in globalz. */ static void secp256k1_ge_globalz_set_table_gej(size_t len, secp256k1_ge *r, secp256k1_fe *globalz, const secp256k1_gej *a, const secp256k1_fe *zr); /** Set a group element (jacobian) equal to the point at infinity. */ static void secp256k1_gej_set_infinity(secp256k1_gej *r); /** Set a group element (jacobian) equal to another which is given in affine coordinates. */ static void secp256k1_gej_set_ge(secp256k1_gej *r, const secp256k1_ge *a); /** Compare the X coordinate of a group element (jacobian). */ static int secp256k1_gej_eq_x_var(const secp256k1_fe *x, const secp256k1_gej *a); /** Set r equal to the inverse of a (i.e., mirrored around the X axis) */ static void secp256k1_gej_neg(secp256k1_gej *r, const secp256k1_gej *a); /** Check whether a group element is the point at infinity. */ static int secp256k1_gej_is_infinity(const secp256k1_gej *a); /** Check whether a group element's y coordinate is a quadratic residue. */ static int secp256k1_gej_has_quad_y_var(const secp256k1_gej *a); /** Set r equal to the double of a. If rzr is not-NULL, r->z = a->z * *rzr (where infinity means an implicit z = 0). * a may not be zero. Constant time. */ static void secp256k1_gej_double_nonzero(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr); /** Set r equal to the double of a. If rzr is not-NULL, r->z = a->z * *rzr (where infinity means an implicit z = 0). */ static void secp256k1_gej_double_var(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr); /** Set r equal to the sum of a and b. If rzr is non-NULL, r->z = a->z * *rzr (a cannot be infinity in that case). */ static void secp256k1_gej_add_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_gej *b, secp256k1_fe *rzr); /** Set r equal to the sum of a and b (with b given in affine coordinates, and not infinity). */ static void secp256k1_gej_add_ge(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b); /** Set r equal to the sum of a and b (with b given in affine coordinates). This is more efficient than secp256k1_gej_add_var. It is identical to secp256k1_gej_add_ge but without constant-time guarantee, and b is allowed to be infinity. If rzr is non-NULL, r->z = a->z * *rzr (a cannot be infinity in that case). */ static void secp256k1_gej_add_ge_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, secp256k1_fe *rzr); /** Set r equal to the sum of a and b (with the inverse of b's Z coordinate passed as bzinv). */ static void secp256k1_gej_add_zinv_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, const secp256k1_fe *bzinv); #ifdef USE_ENDOMORPHISM /** Set r to be equal to lambda times a, where lambda is chosen in a way such that this is very fast. */ static void secp256k1_ge_mul_lambda(secp256k1_ge *r, const secp256k1_ge *a); #endif /** Clear a secp256k1_gej to prevent leaking sensitive information. */ static void secp256k1_gej_clear(secp256k1_gej *r); /** Clear a secp256k1_ge to prevent leaking sensitive information. */ static void secp256k1_ge_clear(secp256k1_ge *r); /** Convert a group element to the storage type. */ static void secp256k1_ge_to_storage(secp256k1_ge_storage *r, const secp256k1_ge *a); /** Convert a group element back from the storage type. */ static void secp256k1_ge_from_storage(secp256k1_ge *r, const secp256k1_ge_storage *a); /** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */ static void secp256k1_ge_storage_cmov(secp256k1_ge_storage *r, const secp256k1_ge_storage *a, int flag); /** Rescale a jacobian point by b which must be non-zero. Constant-time. */ static void secp256k1_gej_rescale(secp256k1_gej *r, const secp256k1_fe *b); #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/group_impl.h ================================================ /********************************************************************** * Copyright (c) 2013, 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_GROUP_IMPL_H_ #define _SECP256K1_GROUP_IMPL_H_ #include "num.h" #include "field.h" #include "group.h" /* These points can be generated in sage as follows: * * 0. Setup a worksheet with the following parameters. * b = 4 # whatever CURVE_B will be set to * F = FiniteField (0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F) * C = EllipticCurve ([F (0), F (b)]) * * 1. Determine all the small orders available to you. (If there are * no satisfactory ones, go back and change b.) * print C.order().factor(limit=1000) * * 2. Choose an order as one of the prime factors listed in the above step. * (You can also multiply some to get a composite order, though the * tests will crash trying to invert scalars during signing.) We take a * random point and scale it to drop its order to the desired value. * There is some probability this won't work; just try again. * order = 199 * P = C.random_point() * P = (int(P.order()) / int(order)) * P * assert(P.order() == order) * * 3. Print the values. You'll need to use a vim macro or something to * split the hex output into 4-byte chunks. * print "%x %x" % P.xy() */ #if defined(EXHAUSTIVE_TEST_ORDER) # if EXHAUSTIVE_TEST_ORDER == 199 const secp256k1_ge secp256k1_ge_const_g = SECP256K1_GE_CONST( 0xFA7CC9A7, 0x0737F2DB, 0xA749DD39, 0x2B4FB069, 0x3B017A7D, 0xA808C2F1, 0xFB12940C, 0x9EA66C18, 0x78AC123A, 0x5ED8AEF3, 0x8732BC91, 0x1F3A2868, 0x48DF246C, 0x808DAE72, 0xCFE52572, 0x7F0501ED ); const int CURVE_B = 4; # elif EXHAUSTIVE_TEST_ORDER == 13 const secp256k1_ge secp256k1_ge_const_g = SECP256K1_GE_CONST( 0xedc60018, 0xa51a786b, 0x2ea91f4d, 0x4c9416c0, 0x9de54c3b, 0xa1316554, 0x6cf4345c, 0x7277ef15, 0x54cb1b6b, 0xdc8c1273, 0x087844ea, 0x43f4603e, 0x0eaf9a43, 0xf6effe55, 0x939f806d, 0x37adf8ac ); const int CURVE_B = 2; # else # error No known generator for the specified exhaustive test group order. # endif #else /** Generator for secp256k1, value 'g' defined in * "Standards for Efficient Cryptography" (SEC2) 2.7.1. */ static const secp256k1_ge secp256k1_ge_const_g = SECP256K1_GE_CONST( 0x79BE667EUL, 0xF9DCBBACUL, 0x55A06295UL, 0xCE870B07UL, 0x029BFCDBUL, 0x2DCE28D9UL, 0x59F2815BUL, 0x16F81798UL, 0x483ADA77UL, 0x26A3C465UL, 0x5DA4FBFCUL, 0x0E1108A8UL, 0xFD17B448UL, 0xA6855419UL, 0x9C47D08FUL, 0xFB10D4B8UL ); const int CURVE_B = 7; #endif static void secp256k1_ge_set_gej_zinv(secp256k1_ge *r, const secp256k1_gej *a, const secp256k1_fe *zi) { secp256k1_fe zi2; secp256k1_fe zi3; secp256k1_fe_sqr(&zi2, zi); secp256k1_fe_mul(&zi3, &zi2, zi); secp256k1_fe_mul(&r->x, &a->x, &zi2); secp256k1_fe_mul(&r->y, &a->y, &zi3); r->infinity = a->infinity; } static void secp256k1_ge_set_xy(secp256k1_ge *r, const secp256k1_fe *x, const secp256k1_fe *y) { r->infinity = 0; r->x = *x; r->y = *y; } static int secp256k1_ge_is_infinity(const secp256k1_ge *a) { return a->infinity; } static void secp256k1_ge_neg(secp256k1_ge *r, const secp256k1_ge *a) { *r = *a; secp256k1_fe_normalize_weak(&r->y); secp256k1_fe_negate(&r->y, &r->y, 1); } static void secp256k1_ge_set_gej(secp256k1_ge *r, secp256k1_gej *a) { secp256k1_fe z2, z3; r->infinity = a->infinity; secp256k1_fe_inv(&a->z, &a->z); secp256k1_fe_sqr(&z2, &a->z); secp256k1_fe_mul(&z3, &a->z, &z2); secp256k1_fe_mul(&a->x, &a->x, &z2); secp256k1_fe_mul(&a->y, &a->y, &z3); secp256k1_fe_set_int(&a->z, 1); r->x = a->x; r->y = a->y; } static void secp256k1_ge_set_gej_var(secp256k1_ge *r, secp256k1_gej *a) { secp256k1_fe z2, z3; r->infinity = a->infinity; if (a->infinity) { return; } secp256k1_fe_inv_var(&a->z, &a->z); secp256k1_fe_sqr(&z2, &a->z); secp256k1_fe_mul(&z3, &a->z, &z2); secp256k1_fe_mul(&a->x, &a->x, &z2); secp256k1_fe_mul(&a->y, &a->y, &z3); secp256k1_fe_set_int(&a->z, 1); r->x = a->x; r->y = a->y; } static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a, size_t len, const secp256k1_callback *cb) { secp256k1_fe *az; secp256k1_fe *azi; size_t i; size_t count = 0; az = (secp256k1_fe *)checked_malloc(cb, sizeof(secp256k1_fe) * len); for (i = 0; i < len; i++) { if (!a[i].infinity) { az[count++] = a[i].z; } } azi = (secp256k1_fe *)checked_malloc(cb, sizeof(secp256k1_fe) * count); secp256k1_fe_inv_all_var(azi, az, count); free(az); count = 0; for (i = 0; i < len; i++) { r[i].infinity = a[i].infinity; if (!a[i].infinity) { secp256k1_ge_set_gej_zinv(&r[i], &a[i], &azi[count++]); } } free(azi); } static void secp256k1_ge_set_table_gej_var(secp256k1_ge *r, const secp256k1_gej *a, const secp256k1_fe *zr, size_t len) { size_t i = len - 1; secp256k1_fe zi; if (len > 0) { /* Compute the inverse of the last z coordinate, and use it to compute the last affine output. */ secp256k1_fe_inv(&zi, &a[i].z); secp256k1_ge_set_gej_zinv(&r[i], &a[i], &zi); /* Work out way backwards, using the z-ratios to scale the x/y values. */ while (i > 0) { secp256k1_fe_mul(&zi, &zi, &zr[i]); i--; secp256k1_ge_set_gej_zinv(&r[i], &a[i], &zi); } } } static void secp256k1_ge_globalz_set_table_gej(size_t len, secp256k1_ge *r, secp256k1_fe *globalz, const secp256k1_gej *a, const secp256k1_fe *zr) { size_t i = len - 1; secp256k1_fe zs; if (len > 0) { /* The z of the final point gives us the "global Z" for the table. */ r[i].x = a[i].x; r[i].y = a[i].y; *globalz = a[i].z; r[i].infinity = 0; zs = zr[i]; /* Work our way backwards, using the z-ratios to scale the x/y values. */ while (i > 0) { if (i != len - 1) { secp256k1_fe_mul(&zs, &zs, &zr[i]); } i--; secp256k1_ge_set_gej_zinv(&r[i], &a[i], &zs); } } } static void secp256k1_gej_set_infinity(secp256k1_gej *r) { r->infinity = 1; secp256k1_fe_clear(&r->x); secp256k1_fe_clear(&r->y); secp256k1_fe_clear(&r->z); } static void secp256k1_gej_clear(secp256k1_gej *r) { r->infinity = 0; secp256k1_fe_clear(&r->x); secp256k1_fe_clear(&r->y); secp256k1_fe_clear(&r->z); } static void secp256k1_ge_clear(secp256k1_ge *r) { r->infinity = 0; secp256k1_fe_clear(&r->x); secp256k1_fe_clear(&r->y); } static int secp256k1_ge_set_xquad(secp256k1_ge *r, const secp256k1_fe *x) { secp256k1_fe x2, x3, c; r->x = *x; secp256k1_fe_sqr(&x2, x); secp256k1_fe_mul(&x3, x, &x2); r->infinity = 0; secp256k1_fe_set_int(&c, CURVE_B); secp256k1_fe_add(&c, &x3); return secp256k1_fe_sqrt(&r->y, &c); } static int secp256k1_ge_set_xo_var(secp256k1_ge *r, const secp256k1_fe *x, int odd) { if (!secp256k1_ge_set_xquad(r, x)) { return 0; } secp256k1_fe_normalize_var(&r->y); if (secp256k1_fe_is_odd(&r->y) != odd) { secp256k1_fe_negate(&r->y, &r->y, 1); } return 1; } static void secp256k1_gej_set_ge(secp256k1_gej *r, const secp256k1_ge *a) { r->infinity = a->infinity; r->x = a->x; r->y = a->y; secp256k1_fe_set_int(&r->z, 1); } static int secp256k1_gej_eq_x_var(const secp256k1_fe *x, const secp256k1_gej *a) { secp256k1_fe r, r2; VERIFY_CHECK(!a->infinity); secp256k1_fe_sqr(&r, &a->z); secp256k1_fe_mul(&r, &r, x); r2 = a->x; secp256k1_fe_normalize_weak(&r2); return secp256k1_fe_equal_var(&r, &r2); } static void secp256k1_gej_neg(secp256k1_gej *r, const secp256k1_gej *a) { r->infinity = a->infinity; r->x = a->x; r->y = a->y; r->z = a->z; secp256k1_fe_normalize_weak(&r->y); secp256k1_fe_negate(&r->y, &r->y, 1); } static int secp256k1_gej_is_infinity(const secp256k1_gej *a) { return a->infinity; } static int secp256k1_gej_is_valid_var(const secp256k1_gej *a) { secp256k1_fe y2, x3, z2, z6; if (a->infinity) { return 0; } /** y^2 = x^3 + 7 * (Y/Z^3)^2 = (X/Z^2)^3 + 7 * Y^2 / Z^6 = X^3 / Z^6 + 7 * Y^2 = X^3 + 7*Z^6 */ secp256k1_fe_sqr(&y2, &a->y); secp256k1_fe_sqr(&x3, &a->x); secp256k1_fe_mul(&x3, &x3, &a->x); secp256k1_fe_sqr(&z2, &a->z); secp256k1_fe_sqr(&z6, &z2); secp256k1_fe_mul(&z6, &z6, &z2); secp256k1_fe_mul_int(&z6, CURVE_B); secp256k1_fe_add(&x3, &z6); secp256k1_fe_normalize_weak(&x3); return secp256k1_fe_equal_var(&y2, &x3); } static int secp256k1_ge_is_valid_var(const secp256k1_ge *a) { secp256k1_fe y2, x3, c; if (a->infinity) { return 0; } /* y^2 = x^3 + 7 */ secp256k1_fe_sqr(&y2, &a->y); secp256k1_fe_sqr(&x3, &a->x); secp256k1_fe_mul(&x3, &x3, &a->x); secp256k1_fe_set_int(&c, CURVE_B); secp256k1_fe_add(&x3, &c); secp256k1_fe_normalize_weak(&x3); return secp256k1_fe_equal_var(&y2, &x3); } static void secp256k1_gej_double_var(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr) { /* Operations: 3 mul, 4 sqr, 0 normalize, 12 mul_int/add/negate. * * Note that there is an implementation described at * https://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l * which trades a multiply for a square, but in practice this is actually slower, * mainly because it requires more normalizations. */ secp256k1_fe t1,t2,t3,t4; /** For secp256k1, 2Q is infinity if and only if Q is infinity. This is because if 2Q = infinity, * Q must equal -Q, or that Q.y == -(Q.y), or Q.y is 0. For a point on y^2 = x^3 + 7 to have * y=0, x^3 must be -7 mod p. However, -7 has no cube root mod p. * * Having said this, if this function receives a point on a sextic twist, e.g. by * a fault attack, it is possible for y to be 0. This happens for y^2 = x^3 + 6, * since -6 does have a cube root mod p. For this point, this function will not set * the infinity flag even though the point doubles to infinity, and the result * point will be gibberish (z = 0 but infinity = 0). */ r->infinity = a->infinity; if (r->infinity) { if (rzr != NULL) { secp256k1_fe_set_int(rzr, 1); } return; } if (rzr != NULL) { *rzr = a->y; secp256k1_fe_normalize_weak(rzr); secp256k1_fe_mul_int(rzr, 2); } secp256k1_fe_mul(&r->z, &a->z, &a->y); secp256k1_fe_mul_int(&r->z, 2); /* Z' = 2*Y*Z (2) */ secp256k1_fe_sqr(&t1, &a->x); secp256k1_fe_mul_int(&t1, 3); /* T1 = 3*X^2 (3) */ secp256k1_fe_sqr(&t2, &t1); /* T2 = 9*X^4 (1) */ secp256k1_fe_sqr(&t3, &a->y); secp256k1_fe_mul_int(&t3, 2); /* T3 = 2*Y^2 (2) */ secp256k1_fe_sqr(&t4, &t3); secp256k1_fe_mul_int(&t4, 2); /* T4 = 8*Y^4 (2) */ secp256k1_fe_mul(&t3, &t3, &a->x); /* T3 = 2*X*Y^2 (1) */ r->x = t3; secp256k1_fe_mul_int(&r->x, 4); /* X' = 8*X*Y^2 (4) */ secp256k1_fe_negate(&r->x, &r->x, 4); /* X' = -8*X*Y^2 (5) */ secp256k1_fe_add(&r->x, &t2); /* X' = 9*X^4 - 8*X*Y^2 (6) */ secp256k1_fe_negate(&t2, &t2, 1); /* T2 = -9*X^4 (2) */ secp256k1_fe_mul_int(&t3, 6); /* T3 = 12*X*Y^2 (6) */ secp256k1_fe_add(&t3, &t2); /* T3 = 12*X*Y^2 - 9*X^4 (8) */ secp256k1_fe_mul(&r->y, &t1, &t3); /* Y' = 36*X^3*Y^2 - 27*X^6 (1) */ secp256k1_fe_negate(&t2, &t4, 2); /* T2 = -8*Y^4 (3) */ secp256k1_fe_add(&r->y, &t2); /* Y' = 36*X^3*Y^2 - 27*X^6 - 8*Y^4 (4) */ } static SECP256K1_INLINE void secp256k1_gej_double_nonzero(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr) { VERIFY_CHECK(!secp256k1_gej_is_infinity(a)); secp256k1_gej_double_var(r, a, rzr); } static void secp256k1_gej_add_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_gej *b, secp256k1_fe *rzr) { /* Operations: 12 mul, 4 sqr, 2 normalize, 12 mul_int/add/negate */ secp256k1_fe z22, z12, u1, u2, s1, s2, h, i, i2, h2, h3, t; if (a->infinity) { VERIFY_CHECK(rzr == NULL); *r = *b; return; } if (b->infinity) { if (rzr != NULL) { secp256k1_fe_set_int(rzr, 1); } *r = *a; return; } r->infinity = 0; secp256k1_fe_sqr(&z22, &b->z); secp256k1_fe_sqr(&z12, &a->z); secp256k1_fe_mul(&u1, &a->x, &z22); secp256k1_fe_mul(&u2, &b->x, &z12); secp256k1_fe_mul(&s1, &a->y, &z22); secp256k1_fe_mul(&s1, &s1, &b->z); secp256k1_fe_mul(&s2, &b->y, &z12); secp256k1_fe_mul(&s2, &s2, &a->z); secp256k1_fe_negate(&h, &u1, 1); secp256k1_fe_add(&h, &u2); secp256k1_fe_negate(&i, &s1, 1); secp256k1_fe_add(&i, &s2); if (secp256k1_fe_normalizes_to_zero_var(&h)) { if (secp256k1_fe_normalizes_to_zero_var(&i)) { secp256k1_gej_double_var(r, a, rzr); } else { if (rzr != NULL) { secp256k1_fe_set_int(rzr, 0); } r->infinity = 1; } return; } secp256k1_fe_sqr(&i2, &i); secp256k1_fe_sqr(&h2, &h); secp256k1_fe_mul(&h3, &h, &h2); secp256k1_fe_mul(&h, &h, &b->z); if (rzr != NULL) { *rzr = h; } secp256k1_fe_mul(&r->z, &a->z, &h); secp256k1_fe_mul(&t, &u1, &h2); r->x = t; secp256k1_fe_mul_int(&r->x, 2); secp256k1_fe_add(&r->x, &h3); secp256k1_fe_negate(&r->x, &r->x, 3); secp256k1_fe_add(&r->x, &i2); secp256k1_fe_negate(&r->y, &r->x, 5); secp256k1_fe_add(&r->y, &t); secp256k1_fe_mul(&r->y, &r->y, &i); secp256k1_fe_mul(&h3, &h3, &s1); secp256k1_fe_negate(&h3, &h3, 1); secp256k1_fe_add(&r->y, &h3); } static void secp256k1_gej_add_ge_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, secp256k1_fe *rzr) { /* 8 mul, 3 sqr, 4 normalize, 12 mul_int/add/negate */ secp256k1_fe z12, u1, u2, s1, s2, h, i, i2, h2, h3, t; if (a->infinity) { VERIFY_CHECK(rzr == NULL); secp256k1_gej_set_ge(r, b); return; } if (b->infinity) { if (rzr != NULL) { secp256k1_fe_set_int(rzr, 1); } *r = *a; return; } r->infinity = 0; secp256k1_fe_sqr(&z12, &a->z); u1 = a->x; secp256k1_fe_normalize_weak(&u1); secp256k1_fe_mul(&u2, &b->x, &z12); s1 = a->y; secp256k1_fe_normalize_weak(&s1); secp256k1_fe_mul(&s2, &b->y, &z12); secp256k1_fe_mul(&s2, &s2, &a->z); secp256k1_fe_negate(&h, &u1, 1); secp256k1_fe_add(&h, &u2); secp256k1_fe_negate(&i, &s1, 1); secp256k1_fe_add(&i, &s2); if (secp256k1_fe_normalizes_to_zero_var(&h)) { if (secp256k1_fe_normalizes_to_zero_var(&i)) { secp256k1_gej_double_var(r, a, rzr); } else { if (rzr != NULL) { secp256k1_fe_set_int(rzr, 0); } r->infinity = 1; } return; } secp256k1_fe_sqr(&i2, &i); secp256k1_fe_sqr(&h2, &h); secp256k1_fe_mul(&h3, &h, &h2); if (rzr != NULL) { *rzr = h; } secp256k1_fe_mul(&r->z, &a->z, &h); secp256k1_fe_mul(&t, &u1, &h2); r->x = t; secp256k1_fe_mul_int(&r->x, 2); secp256k1_fe_add(&r->x, &h3); secp256k1_fe_negate(&r->x, &r->x, 3); secp256k1_fe_add(&r->x, &i2); secp256k1_fe_negate(&r->y, &r->x, 5); secp256k1_fe_add(&r->y, &t); secp256k1_fe_mul(&r->y, &r->y, &i); secp256k1_fe_mul(&h3, &h3, &s1); secp256k1_fe_negate(&h3, &h3, 1); secp256k1_fe_add(&r->y, &h3); } static void secp256k1_gej_add_zinv_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, const secp256k1_fe *bzinv) { /* 9 mul, 3 sqr, 4 normalize, 12 mul_int/add/negate */ secp256k1_fe az, z12, u1, u2, s1, s2, h, i, i2, h2, h3, t; if (b->infinity) { *r = *a; return; } if (a->infinity) { secp256k1_fe bzinv2, bzinv3; r->infinity = b->infinity; secp256k1_fe_sqr(&bzinv2, bzinv); secp256k1_fe_mul(&bzinv3, &bzinv2, bzinv); secp256k1_fe_mul(&r->x, &b->x, &bzinv2); secp256k1_fe_mul(&r->y, &b->y, &bzinv3); secp256k1_fe_set_int(&r->z, 1); return; } r->infinity = 0; /** We need to calculate (rx,ry,rz) = (ax,ay,az) + (bx,by,1/bzinv). Due to * secp256k1's isomorphism we can multiply the Z coordinates on both sides * by bzinv, and get: (rx,ry,rz*bzinv) = (ax,ay,az*bzinv) + (bx,by,1). * This means that (rx,ry,rz) can be calculated as * (ax,ay,az*bzinv) + (bx,by,1), when not applying the bzinv factor to rz. * The variable az below holds the modified Z coordinate for a, which is used * for the computation of rx and ry, but not for rz. */ secp256k1_fe_mul(&az, &a->z, bzinv); secp256k1_fe_sqr(&z12, &az); u1 = a->x; secp256k1_fe_normalize_weak(&u1); secp256k1_fe_mul(&u2, &b->x, &z12); s1 = a->y; secp256k1_fe_normalize_weak(&s1); secp256k1_fe_mul(&s2, &b->y, &z12); secp256k1_fe_mul(&s2, &s2, &az); secp256k1_fe_negate(&h, &u1, 1); secp256k1_fe_add(&h, &u2); secp256k1_fe_negate(&i, &s1, 1); secp256k1_fe_add(&i, &s2); if (secp256k1_fe_normalizes_to_zero_var(&h)) { if (secp256k1_fe_normalizes_to_zero_var(&i)) { secp256k1_gej_double_var(r, a, NULL); } else { r->infinity = 1; } return; } secp256k1_fe_sqr(&i2, &i); secp256k1_fe_sqr(&h2, &h); secp256k1_fe_mul(&h3, &h, &h2); r->z = a->z; secp256k1_fe_mul(&r->z, &r->z, &h); secp256k1_fe_mul(&t, &u1, &h2); r->x = t; secp256k1_fe_mul_int(&r->x, 2); secp256k1_fe_add(&r->x, &h3); secp256k1_fe_negate(&r->x, &r->x, 3); secp256k1_fe_add(&r->x, &i2); secp256k1_fe_negate(&r->y, &r->x, 5); secp256k1_fe_add(&r->y, &t); secp256k1_fe_mul(&r->y, &r->y, &i); secp256k1_fe_mul(&h3, &h3, &s1); secp256k1_fe_negate(&h3, &h3, 1); secp256k1_fe_add(&r->y, &h3); } static void secp256k1_gej_add_ge(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b) { /* Operations: 7 mul, 5 sqr, 4 normalize, 21 mul_int/add/negate/cmov */ static const secp256k1_fe fe_1 = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1); secp256k1_fe zz, u1, u2, s1, s2, t, tt, m, n, q, rr; secp256k1_fe m_alt, rr_alt; int infinity, degenerate; VERIFY_CHECK(!b->infinity); VERIFY_CHECK(a->infinity == 0 || a->infinity == 1); /** In: * Eric Brier and Marc Joye, Weierstrass Elliptic Curves and Side-Channel Attacks. * In D. Naccache and P. Paillier, Eds., Public Key Cryptography, vol. 2274 of Lecture Notes in Computer Science, pages 335-345. Springer-Verlag, 2002. * we find as solution for a unified addition/doubling formula: * lambda = ((x1 + x2)^2 - x1 * x2 + a) / (y1 + y2), with a = 0 for secp256k1's curve equation. * x3 = lambda^2 - (x1 + x2) * 2*y3 = lambda * (x1 + x2 - 2 * x3) - (y1 + y2). * * Substituting x_i = Xi / Zi^2 and yi = Yi / Zi^3, for i=1,2,3, gives: * U1 = X1*Z2^2, U2 = X2*Z1^2 * S1 = Y1*Z2^3, S2 = Y2*Z1^3 * Z = Z1*Z2 * T = U1+U2 * M = S1+S2 * Q = T*M^2 * R = T^2-U1*U2 * X3 = 4*(R^2-Q) * Y3 = 4*(R*(3*Q-2*R^2)-M^4) * Z3 = 2*M*Z * (Note that the paper uses xi = Xi / Zi and yi = Yi / Zi instead.) * * This formula has the benefit of being the same for both addition * of distinct points and doubling. However, it breaks down in the * case that either point is infinity, or that y1 = -y2. We handle * these cases in the following ways: * * - If b is infinity we simply bail by means of a VERIFY_CHECK. * * - If a is infinity, we detect this, and at the end of the * computation replace the result (which will be meaningless, * but we compute to be constant-time) with b.x : b.y : 1. * * - If a = -b, we have y1 = -y2, which is a degenerate case. * But here the answer is infinity, so we simply set the * infinity flag of the result, overriding the computed values * without even needing to cmov. * * - If y1 = -y2 but x1 != x2, which does occur thanks to certain * properties of our curve (specifically, 1 has nontrivial cube * roots in our field, and the curve equation has no x coefficient) * then the answer is not infinity but also not given by the above * equation. In this case, we cmov in place an alternate expression * for lambda. Specifically (y1 - y2)/(x1 - x2). Where both these * expressions for lambda are defined, they are equal, and can be * obtained from each other by multiplication by (y1 + y2)/(y1 + y2) * then substitution of x^3 + 7 for y^2 (using the curve equation). * For all pairs of nonzero points (a, b) at least one is defined, * so this covers everything. */ secp256k1_fe_sqr(&zz, &a->z); /* z = Z1^2 */ u1 = a->x; secp256k1_fe_normalize_weak(&u1); /* u1 = U1 = X1*Z2^2 (1) */ secp256k1_fe_mul(&u2, &b->x, &zz); /* u2 = U2 = X2*Z1^2 (1) */ s1 = a->y; secp256k1_fe_normalize_weak(&s1); /* s1 = S1 = Y1*Z2^3 (1) */ secp256k1_fe_mul(&s2, &b->y, &zz); /* s2 = Y2*Z1^2 (1) */ secp256k1_fe_mul(&s2, &s2, &a->z); /* s2 = S2 = Y2*Z1^3 (1) */ t = u1; secp256k1_fe_add(&t, &u2); /* t = T = U1+U2 (2) */ m = s1; secp256k1_fe_add(&m, &s2); /* m = M = S1+S2 (2) */ secp256k1_fe_sqr(&rr, &t); /* rr = T^2 (1) */ secp256k1_fe_negate(&m_alt, &u2, 1); /* Malt = -X2*Z1^2 */ secp256k1_fe_mul(&tt, &u1, &m_alt); /* tt = -U1*U2 (2) */ secp256k1_fe_add(&rr, &tt); /* rr = R = T^2-U1*U2 (3) */ /** If lambda = R/M = 0/0 we have a problem (except in the "trivial" * case that Z = z1z2 = 0, and this is special-cased later on). */ degenerate = secp256k1_fe_normalizes_to_zero(&m) & secp256k1_fe_normalizes_to_zero(&rr); /* This only occurs when y1 == -y2 and x1^3 == x2^3, but x1 != x2. * This means either x1 == beta*x2 or beta*x1 == x2, where beta is * a nontrivial cube root of one. In either case, an alternate * non-indeterminate expression for lambda is (y1 - y2)/(x1 - x2), * so we set R/M equal to this. */ rr_alt = s1; secp256k1_fe_mul_int(&rr_alt, 2); /* rr = Y1*Z2^3 - Y2*Z1^3 (2) */ secp256k1_fe_add(&m_alt, &u1); /* Malt = X1*Z2^2 - X2*Z1^2 */ secp256k1_fe_cmov(&rr_alt, &rr, !degenerate); secp256k1_fe_cmov(&m_alt, &m, !degenerate); /* Now Ralt / Malt = lambda and is guaranteed not to be 0/0. * From here on out Ralt and Malt represent the numerator * and denominator of lambda; R and M represent the explicit * expressions x1^2 + x2^2 + x1x2 and y1 + y2. */ secp256k1_fe_sqr(&n, &m_alt); /* n = Malt^2 (1) */ secp256k1_fe_mul(&q, &n, &t); /* q = Q = T*Malt^2 (1) */ /* These two lines use the observation that either M == Malt or M == 0, * so M^3 * Malt is either Malt^4 (which is computed by squaring), or * zero (which is "computed" by cmov). So the cost is one squaring * versus two multiplications. */ secp256k1_fe_sqr(&n, &n); secp256k1_fe_cmov(&n, &m, degenerate); /* n = M^3 * Malt (2) */ secp256k1_fe_sqr(&t, &rr_alt); /* t = Ralt^2 (1) */ secp256k1_fe_mul(&r->z, &a->z, &m_alt); /* r->z = Malt*Z (1) */ infinity = secp256k1_fe_normalizes_to_zero(&r->z) * (1 - a->infinity); secp256k1_fe_mul_int(&r->z, 2); /* r->z = Z3 = 2*Malt*Z (2) */ secp256k1_fe_negate(&q, &q, 1); /* q = -Q (2) */ secp256k1_fe_add(&t, &q); /* t = Ralt^2-Q (3) */ secp256k1_fe_normalize_weak(&t); r->x = t; /* r->x = Ralt^2-Q (1) */ secp256k1_fe_mul_int(&t, 2); /* t = 2*x3 (2) */ secp256k1_fe_add(&t, &q); /* t = 2*x3 - Q: (4) */ secp256k1_fe_mul(&t, &t, &rr_alt); /* t = Ralt*(2*x3 - Q) (1) */ secp256k1_fe_add(&t, &n); /* t = Ralt*(2*x3 - Q) + M^3*Malt (3) */ secp256k1_fe_negate(&r->y, &t, 3); /* r->y = Ralt*(Q - 2x3) - M^3*Malt (4) */ secp256k1_fe_normalize_weak(&r->y); secp256k1_fe_mul_int(&r->x, 4); /* r->x = X3 = 4*(Ralt^2-Q) */ secp256k1_fe_mul_int(&r->y, 4); /* r->y = Y3 = 4*Ralt*(Q - 2x3) - 4*M^3*Malt (4) */ /** In case a->infinity == 1, replace r with (b->x, b->y, 1). */ secp256k1_fe_cmov(&r->x, &b->x, a->infinity); secp256k1_fe_cmov(&r->y, &b->y, a->infinity); secp256k1_fe_cmov(&r->z, &fe_1, a->infinity); r->infinity = infinity; } static void secp256k1_gej_rescale(secp256k1_gej *r, const secp256k1_fe *s) { /* Operations: 4 mul, 1 sqr */ secp256k1_fe zz; VERIFY_CHECK(!secp256k1_fe_is_zero(s)); secp256k1_fe_sqr(&zz, s); secp256k1_fe_mul(&r->x, &r->x, &zz); /* r->x *= s^2 */ secp256k1_fe_mul(&r->y, &r->y, &zz); secp256k1_fe_mul(&r->y, &r->y, s); /* r->y *= s^3 */ secp256k1_fe_mul(&r->z, &r->z, s); /* r->z *= s */ } static void secp256k1_ge_to_storage(secp256k1_ge_storage *r, const secp256k1_ge *a) { secp256k1_fe x, y; VERIFY_CHECK(!a->infinity); x = a->x; secp256k1_fe_normalize(&x); y = a->y; secp256k1_fe_normalize(&y); secp256k1_fe_to_storage(&r->x, &x); secp256k1_fe_to_storage(&r->y, &y); } static void secp256k1_ge_from_storage(secp256k1_ge *r, const secp256k1_ge_storage *a) { secp256k1_fe_from_storage(&r->x, &a->x); secp256k1_fe_from_storage(&r->y, &a->y); r->infinity = 0; } static SECP256K1_INLINE void secp256k1_ge_storage_cmov(secp256k1_ge_storage *r, const secp256k1_ge_storage *a, int flag) { secp256k1_fe_storage_cmov(&r->x, &a->x, flag); secp256k1_fe_storage_cmov(&r->y, &a->y, flag); } #ifdef USE_ENDOMORPHISM static void secp256k1_ge_mul_lambda(secp256k1_ge *r, const secp256k1_ge *a) { static const secp256k1_fe beta = SECP256K1_FE_CONST( 0x7ae96a2bul, 0x657c0710ul, 0x6e64479eul, 0xac3434e9ul, 0x9cf04975ul, 0x12f58995ul, 0xc1396c28ul, 0x719501eeul ); *r = *a; secp256k1_fe_mul(&r->x, &r->x, &beta); } #endif static int secp256k1_gej_has_quad_y_var(const secp256k1_gej *a) { secp256k1_fe yz; if (a->infinity) { return 0; } /* We rely on the fact that the Jacobi symbol of 1 / a->z^3 is the same as * that of a->z. Thus a->y / a->z^3 is a quadratic residue iff a->y * a->z is */ secp256k1_fe_mul(&yz, &a->y, &a->z); return secp256k1_fe_is_quad_var(&yz); } #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/hash.h ================================================ /********************************************************************** * Copyright (c) 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_HASH_ #define _SECP256K1_HASH_ #include #include typedef struct { uint32_t s[8]; uint32_t buf[16]; /* In big endian */ size_t bytes; } secp256k1_sha256_t; static void secp256k1_sha256_initialize(secp256k1_sha256_t *hash); static void secp256k1_sha256_write(secp256k1_sha256_t *hash, const unsigned char *data, size_t size); static void secp256k1_sha256_finalize(secp256k1_sha256_t *hash, unsigned char *out32); typedef struct { secp256k1_sha256_t inner, outer; } secp256k1_hmac_sha256_t; static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256_t *hash, const unsigned char *key, size_t size); static void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256_t *hash, const unsigned char *data, size_t size); static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256_t *hash, unsigned char *out32); typedef struct { unsigned char v[32]; unsigned char k[32]; int retry; } secp256k1_rfc6979_hmac_sha256_t; static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256_t *rng, const unsigned char *key, size_t keylen); static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256_t *rng, unsigned char *out, size_t outlen); static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256_t *rng); #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/hash_impl.h ================================================ /********************************************************************** * Copyright (c) 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_HASH_IMPL_H_ #define _SECP256K1_HASH_IMPL_H_ #include "hash.h" #include #include #include #define Ch(x,y,z) ((z) ^ ((x) & ((y) ^ (z)))) #define Maj(x,y,z) (((x) & (y)) | ((z) & ((x) | (y)))) #define Sigma0(x) (((x) >> 2 | (x) << 30) ^ ((x) >> 13 | (x) << 19) ^ ((x) >> 22 | (x) << 10)) #define Sigma1(x) (((x) >> 6 | (x) << 26) ^ ((x) >> 11 | (x) << 21) ^ ((x) >> 25 | (x) << 7)) #define sigma0(x) (((x) >> 7 | (x) << 25) ^ ((x) >> 18 | (x) << 14) ^ ((x) >> 3)) #define sigma1(x) (((x) >> 17 | (x) << 15) ^ ((x) >> 19 | (x) << 13) ^ ((x) >> 10)) #define Round(a,b,c,d,e,f,g,h,k,w) do { \ uint32_t t1 = (h) + Sigma1(e) + Ch((e), (f), (g)) + (k) + (w); \ uint32_t t2 = Sigma0(a) + Maj((a), (b), (c)); \ (d) += t1; \ (h) = t1 + t2; \ } while(0) #ifdef WORDS_BIGENDIAN #define BE32(x) (x) #else #define BE32(p) ((((p) & 0xFF) << 24) | (((p) & 0xFF00) << 8) | (((p) & 0xFF0000) >> 8) | (((p) & 0xFF000000) >> 24)) #endif static void secp256k1_sha256_initialize(secp256k1_sha256_t *hash) { hash->s[0] = 0x6a09e667ul; hash->s[1] = 0xbb67ae85ul; hash->s[2] = 0x3c6ef372ul; hash->s[3] = 0xa54ff53aul; hash->s[4] = 0x510e527ful; hash->s[5] = 0x9b05688cul; hash->s[6] = 0x1f83d9abul; hash->s[7] = 0x5be0cd19ul; hash->bytes = 0; } /** Perform one SHA-256 transformation, processing 16 big endian 32-bit words. */ static void secp256k1_sha256_transform(uint32_t* s, const uint32_t* chunk) { uint32_t a = s[0], b = s[1], c = s[2], d = s[3], e = s[4], f = s[5], g = s[6], h = s[7]; uint32_t w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15; Round(a, b, c, d, e, f, g, h, 0x428a2f98, w0 = BE32(chunk[0])); Round(h, a, b, c, d, e, f, g, 0x71374491, w1 = BE32(chunk[1])); Round(g, h, a, b, c, d, e, f, 0xb5c0fbcf, w2 = BE32(chunk[2])); Round(f, g, h, a, b, c, d, e, 0xe9b5dba5, w3 = BE32(chunk[3])); Round(e, f, g, h, a, b, c, d, 0x3956c25b, w4 = BE32(chunk[4])); Round(d, e, f, g, h, a, b, c, 0x59f111f1, w5 = BE32(chunk[5])); Round(c, d, e, f, g, h, a, b, 0x923f82a4, w6 = BE32(chunk[6])); Round(b, c, d, e, f, g, h, a, 0xab1c5ed5, w7 = BE32(chunk[7])); Round(a, b, c, d, e, f, g, h, 0xd807aa98, w8 = BE32(chunk[8])); Round(h, a, b, c, d, e, f, g, 0x12835b01, w9 = BE32(chunk[9])); Round(g, h, a, b, c, d, e, f, 0x243185be, w10 = BE32(chunk[10])); Round(f, g, h, a, b, c, d, e, 0x550c7dc3, w11 = BE32(chunk[11])); Round(e, f, g, h, a, b, c, d, 0x72be5d74, w12 = BE32(chunk[12])); Round(d, e, f, g, h, a, b, c, 0x80deb1fe, w13 = BE32(chunk[13])); Round(c, d, e, f, g, h, a, b, 0x9bdc06a7, w14 = BE32(chunk[14])); Round(b, c, d, e, f, g, h, a, 0xc19bf174, w15 = BE32(chunk[15])); Round(a, b, c, d, e, f, g, h, 0xe49b69c1, w0 += sigma1(w14) + w9 + sigma0(w1)); Round(h, a, b, c, d, e, f, g, 0xefbe4786, w1 += sigma1(w15) + w10 + sigma0(w2)); Round(g, h, a, b, c, d, e, f, 0x0fc19dc6, w2 += sigma1(w0) + w11 + sigma0(w3)); Round(f, g, h, a, b, c, d, e, 0x240ca1cc, w3 += sigma1(w1) + w12 + sigma0(w4)); Round(e, f, g, h, a, b, c, d, 0x2de92c6f, w4 += sigma1(w2) + w13 + sigma0(w5)); Round(d, e, f, g, h, a, b, c, 0x4a7484aa, w5 += sigma1(w3) + w14 + sigma0(w6)); Round(c, d, e, f, g, h, a, b, 0x5cb0a9dc, w6 += sigma1(w4) + w15 + sigma0(w7)); Round(b, c, d, e, f, g, h, a, 0x76f988da, w7 += sigma1(w5) + w0 + sigma0(w8)); Round(a, b, c, d, e, f, g, h, 0x983e5152, w8 += sigma1(w6) + w1 + sigma0(w9)); Round(h, a, b, c, d, e, f, g, 0xa831c66d, w9 += sigma1(w7) + w2 + sigma0(w10)); Round(g, h, a, b, c, d, e, f, 0xb00327c8, w10 += sigma1(w8) + w3 + sigma0(w11)); Round(f, g, h, a, b, c, d, e, 0xbf597fc7, w11 += sigma1(w9) + w4 + sigma0(w12)); Round(e, f, g, h, a, b, c, d, 0xc6e00bf3, w12 += sigma1(w10) + w5 + sigma0(w13)); Round(d, e, f, g, h, a, b, c, 0xd5a79147, w13 += sigma1(w11) + w6 + sigma0(w14)); Round(c, d, e, f, g, h, a, b, 0x06ca6351, w14 += sigma1(w12) + w7 + sigma0(w15)); Round(b, c, d, e, f, g, h, a, 0x14292967, w15 += sigma1(w13) + w8 + sigma0(w0)); Round(a, b, c, d, e, f, g, h, 0x27b70a85, w0 += sigma1(w14) + w9 + sigma0(w1)); Round(h, a, b, c, d, e, f, g, 0x2e1b2138, w1 += sigma1(w15) + w10 + sigma0(w2)); Round(g, h, a, b, c, d, e, f, 0x4d2c6dfc, w2 += sigma1(w0) + w11 + sigma0(w3)); Round(f, g, h, a, b, c, d, e, 0x53380d13, w3 += sigma1(w1) + w12 + sigma0(w4)); Round(e, f, g, h, a, b, c, d, 0x650a7354, w4 += sigma1(w2) + w13 + sigma0(w5)); Round(d, e, f, g, h, a, b, c, 0x766a0abb, w5 += sigma1(w3) + w14 + sigma0(w6)); Round(c, d, e, f, g, h, a, b, 0x81c2c92e, w6 += sigma1(w4) + w15 + sigma0(w7)); Round(b, c, d, e, f, g, h, a, 0x92722c85, w7 += sigma1(w5) + w0 + sigma0(w8)); Round(a, b, c, d, e, f, g, h, 0xa2bfe8a1, w8 += sigma1(w6) + w1 + sigma0(w9)); Round(h, a, b, c, d, e, f, g, 0xa81a664b, w9 += sigma1(w7) + w2 + sigma0(w10)); Round(g, h, a, b, c, d, e, f, 0xc24b8b70, w10 += sigma1(w8) + w3 + sigma0(w11)); Round(f, g, h, a, b, c, d, e, 0xc76c51a3, w11 += sigma1(w9) + w4 + sigma0(w12)); Round(e, f, g, h, a, b, c, d, 0xd192e819, w12 += sigma1(w10) + w5 + sigma0(w13)); Round(d, e, f, g, h, a, b, c, 0xd6990624, w13 += sigma1(w11) + w6 + sigma0(w14)); Round(c, d, e, f, g, h, a, b, 0xf40e3585, w14 += sigma1(w12) + w7 + sigma0(w15)); Round(b, c, d, e, f, g, h, a, 0x106aa070, w15 += sigma1(w13) + w8 + sigma0(w0)); Round(a, b, c, d, e, f, g, h, 0x19a4c116, w0 += sigma1(w14) + w9 + sigma0(w1)); Round(h, a, b, c, d, e, f, g, 0x1e376c08, w1 += sigma1(w15) + w10 + sigma0(w2)); Round(g, h, a, b, c, d, e, f, 0x2748774c, w2 += sigma1(w0) + w11 + sigma0(w3)); Round(f, g, h, a, b, c, d, e, 0x34b0bcb5, w3 += sigma1(w1) + w12 + sigma0(w4)); Round(e, f, g, h, a, b, c, d, 0x391c0cb3, w4 += sigma1(w2) + w13 + sigma0(w5)); Round(d, e, f, g, h, a, b, c, 0x4ed8aa4a, w5 += sigma1(w3) + w14 + sigma0(w6)); Round(c, d, e, f, g, h, a, b, 0x5b9cca4f, w6 += sigma1(w4) + w15 + sigma0(w7)); Round(b, c, d, e, f, g, h, a, 0x682e6ff3, w7 += sigma1(w5) + w0 + sigma0(w8)); Round(a, b, c, d, e, f, g, h, 0x748f82ee, w8 += sigma1(w6) + w1 + sigma0(w9)); Round(h, a, b, c, d, e, f, g, 0x78a5636f, w9 += sigma1(w7) + w2 + sigma0(w10)); Round(g, h, a, b, c, d, e, f, 0x84c87814, w10 += sigma1(w8) + w3 + sigma0(w11)); Round(f, g, h, a, b, c, d, e, 0x8cc70208, w11 += sigma1(w9) + w4 + sigma0(w12)); Round(e, f, g, h, a, b, c, d, 0x90befffa, w12 += sigma1(w10) + w5 + sigma0(w13)); Round(d, e, f, g, h, a, b, c, 0xa4506ceb, w13 += sigma1(w11) + w6 + sigma0(w14)); Round(c, d, e, f, g, h, a, b, 0xbef9a3f7, w14 + sigma1(w12) + w7 + sigma0(w15)); Round(b, c, d, e, f, g, h, a, 0xc67178f2, w15 + sigma1(w13) + w8 + sigma0(w0)); s[0] += a; s[1] += b; s[2] += c; s[3] += d; s[4] += e; s[5] += f; s[6] += g; s[7] += h; } static void secp256k1_sha256_write(secp256k1_sha256_t *hash, const unsigned char *data, size_t len) { size_t bufsize = hash->bytes & 0x3F; hash->bytes += len; while (bufsize + len >= 64) { /* Fill the buffer, and process it. */ memcpy(((unsigned char*)hash->buf) + bufsize, data, 64 - bufsize); data += 64 - bufsize; len -= 64 - bufsize; secp256k1_sha256_transform(hash->s, hash->buf); bufsize = 0; } if (len) { /* Fill the buffer with what remains. */ memcpy(((unsigned char*)hash->buf) + bufsize, data, len); } } static void secp256k1_sha256_finalize(secp256k1_sha256_t *hash, unsigned char *out32) { static const unsigned char pad[64] = {0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; uint32_t sizedesc[2]; uint32_t out[8]; int i = 0; sizedesc[0] = BE32(hash->bytes >> 29); sizedesc[1] = BE32(hash->bytes << 3); secp256k1_sha256_write(hash, pad, 1 + ((119 - (hash->bytes % 64)) % 64)); secp256k1_sha256_write(hash, (const unsigned char*)sizedesc, 8); for (i = 0; i < 8; i++) { out[i] = BE32(hash->s[i]); hash->s[i] = 0; } memcpy(out32, (const unsigned char*)out, 32); } static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256_t *hash, const unsigned char *key, size_t keylen) { int n; unsigned char rkey[64]; if (keylen <= 64) { memcpy(rkey, key, keylen); memset(rkey + keylen, 0, 64 - keylen); } else { secp256k1_sha256_t sha256; secp256k1_sha256_initialize(&sha256); secp256k1_sha256_write(&sha256, key, keylen); secp256k1_sha256_finalize(&sha256, rkey); memset(rkey + 32, 0, 32); } secp256k1_sha256_initialize(&hash->outer); for (n = 0; n < 64; n++) { rkey[n] ^= 0x5c; } secp256k1_sha256_write(&hash->outer, rkey, 64); secp256k1_sha256_initialize(&hash->inner); for (n = 0; n < 64; n++) { rkey[n] ^= 0x5c ^ 0x36; } secp256k1_sha256_write(&hash->inner, rkey, 64); memset(rkey, 0, 64); } static void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256_t *hash, const unsigned char *data, size_t size) { secp256k1_sha256_write(&hash->inner, data, size); } static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256_t *hash, unsigned char *out32) { unsigned char temp[32]; secp256k1_sha256_finalize(&hash->inner, temp); secp256k1_sha256_write(&hash->outer, temp, 32); memset(temp, 0, 32); secp256k1_sha256_finalize(&hash->outer, out32); } static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256_t *rng, const unsigned char *key, size_t keylen) { secp256k1_hmac_sha256_t hmac; static const unsigned char zero[1] = {0x00}; static const unsigned char one[1] = {0x01}; memset(rng->v, 0x01, 32); /* RFC6979 3.2.b. */ memset(rng->k, 0x00, 32); /* RFC6979 3.2.c. */ /* RFC6979 3.2.d. */ secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); secp256k1_hmac_sha256_write(&hmac, rng->v, 32); secp256k1_hmac_sha256_write(&hmac, zero, 1); secp256k1_hmac_sha256_write(&hmac, key, keylen); secp256k1_hmac_sha256_finalize(&hmac, rng->k); secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); secp256k1_hmac_sha256_write(&hmac, rng->v, 32); secp256k1_hmac_sha256_finalize(&hmac, rng->v); /* RFC6979 3.2.f. */ secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); secp256k1_hmac_sha256_write(&hmac, rng->v, 32); secp256k1_hmac_sha256_write(&hmac, one, 1); secp256k1_hmac_sha256_write(&hmac, key, keylen); secp256k1_hmac_sha256_finalize(&hmac, rng->k); secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); secp256k1_hmac_sha256_write(&hmac, rng->v, 32); secp256k1_hmac_sha256_finalize(&hmac, rng->v); rng->retry = 0; } static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256_t *rng, unsigned char *out, size_t outlen) { /* RFC6979 3.2.h. */ static const unsigned char zero[1] = {0x00}; if (rng->retry) { secp256k1_hmac_sha256_t hmac; secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); secp256k1_hmac_sha256_write(&hmac, rng->v, 32); secp256k1_hmac_sha256_write(&hmac, zero, 1); secp256k1_hmac_sha256_finalize(&hmac, rng->k); secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); secp256k1_hmac_sha256_write(&hmac, rng->v, 32); secp256k1_hmac_sha256_finalize(&hmac, rng->v); } while (outlen > 0) { secp256k1_hmac_sha256_t hmac; int now = outlen; secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); secp256k1_hmac_sha256_write(&hmac, rng->v, 32); secp256k1_hmac_sha256_finalize(&hmac, rng->v); if (now > 32) { now = 32; } memcpy(out, rng->v, now); out += now; outlen -= now; } rng->retry = 1; } static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256_t *rng) { memset(rng->k, 0, 32); memset(rng->v, 0, 32); rng->retry = 0; } #undef BE32 #undef Round #undef sigma1 #undef sigma0 #undef Sigma1 #undef Sigma0 #undef Maj #undef Ch #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/java/org/bitcoin/NativeSecp256k1.java ================================================ /* * Copyright 2013 Google Inc. * Copyright 2014-2016 the libsecp256k1 contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.bitcoin; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.math.BigInteger; import com.google.common.base.Preconditions; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantReadWriteLock; import static org.bitcoin.NativeSecp256k1Util.*; /** *

This class holds native methods to handle ECDSA verification.

* *

You can find an example library that can be used for this at https://github.com/bitcoin/secp256k1

* *

To build secp256k1 for use with bitcoinj, run * `./configure --enable-jni --enable-experimental --enable-module-ecdh` * and `make` then copy `.libs/libsecp256k1.so` to your system library path * or point the JVM to the folder containing it with -Djava.library.path *

*/ public class NativeSecp256k1 { private static final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); private static final Lock r = rwl.readLock(); private static final Lock w = rwl.writeLock(); private static ThreadLocal nativeECDSABuffer = new ThreadLocal(); /** * Verifies the given secp256k1 signature in native code. * Calling when enabled == false is undefined (probably library not loaded) * * @param data The data which was signed, must be exactly 32 bytes * @param signature The signature * @param pub The public key which did the signing */ public static boolean verify(byte[] data, byte[] signature, byte[] pub) throws AssertFailException{ Preconditions.checkArgument(data.length == 32 && signature.length <= 520 && pub.length <= 520); ByteBuffer byteBuff = nativeECDSABuffer.get(); if (byteBuff == null || byteBuff.capacity() < 520) { byteBuff = ByteBuffer.allocateDirect(520); byteBuff.order(ByteOrder.nativeOrder()); nativeECDSABuffer.set(byteBuff); } byteBuff.rewind(); byteBuff.put(data); byteBuff.put(signature); byteBuff.put(pub); byte[][] retByteArray; r.lock(); try { return secp256k1_ecdsa_verify(byteBuff, Secp256k1Context.getContext(), signature.length, pub.length) == 1; } finally { r.unlock(); } } /** * libsecp256k1 Create an ECDSA signature. * * @param data Message hash, 32 bytes * @param key Secret key, 32 bytes * * Return values * @param sig byte array of signature */ public static byte[] sign(byte[] data, byte[] sec) throws AssertFailException{ Preconditions.checkArgument(data.length == 32 && sec.length <= 32); ByteBuffer byteBuff = nativeECDSABuffer.get(); if (byteBuff == null || byteBuff.capacity() < 32 + 32) { byteBuff = ByteBuffer.allocateDirect(32 + 32); byteBuff.order(ByteOrder.nativeOrder()); nativeECDSABuffer.set(byteBuff); } byteBuff.rewind(); byteBuff.put(data); byteBuff.put(sec); byte[][] retByteArray; r.lock(); try { retByteArray = secp256k1_ecdsa_sign(byteBuff, Secp256k1Context.getContext()); } finally { r.unlock(); } byte[] sigArr = retByteArray[0]; int sigLen = new BigInteger(new byte[] { retByteArray[1][0] }).intValue(); int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); assertEquals(sigArr.length, sigLen, "Got bad signature length."); return retVal == 0 ? new byte[0] : sigArr; } /** * libsecp256k1 Seckey Verify - returns 1 if valid, 0 if invalid * * @param seckey ECDSA Secret key, 32 bytes */ public static boolean secKeyVerify(byte[] seckey) { Preconditions.checkArgument(seckey.length == 32); ByteBuffer byteBuff = nativeECDSABuffer.get(); if (byteBuff == null || byteBuff.capacity() < seckey.length) { byteBuff = ByteBuffer.allocateDirect(seckey.length); byteBuff.order(ByteOrder.nativeOrder()); nativeECDSABuffer.set(byteBuff); } byteBuff.rewind(); byteBuff.put(seckey); r.lock(); try { return secp256k1_ec_seckey_verify(byteBuff,Secp256k1Context.getContext()) == 1; } finally { r.unlock(); } } /** * libsecp256k1 Compute Pubkey - computes public key from secret key * * @param seckey ECDSA Secret key, 32 bytes * * Return values * @param pubkey ECDSA Public key, 33 or 65 bytes */ //TODO add a 'compressed' arg public static byte[] computePubkey(byte[] seckey) throws AssertFailException{ Preconditions.checkArgument(seckey.length == 32); ByteBuffer byteBuff = nativeECDSABuffer.get(); if (byteBuff == null || byteBuff.capacity() < seckey.length) { byteBuff = ByteBuffer.allocateDirect(seckey.length); byteBuff.order(ByteOrder.nativeOrder()); nativeECDSABuffer.set(byteBuff); } byteBuff.rewind(); byteBuff.put(seckey); byte[][] retByteArray; r.lock(); try { retByteArray = secp256k1_ec_pubkey_create(byteBuff, Secp256k1Context.getContext()); } finally { r.unlock(); } byte[] pubArr = retByteArray[0]; int pubLen = new BigInteger(new byte[] { retByteArray[1][0] }).intValue(); int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); assertEquals(pubArr.length, pubLen, "Got bad pubkey length."); return retVal == 0 ? new byte[0]: pubArr; } /** * libsecp256k1 Cleanup - This destroys the secp256k1 context object * This should be called at the end of the program for proper cleanup of the context. */ public static synchronized void cleanup() { w.lock(); try { secp256k1_destroy_context(Secp256k1Context.getContext()); } finally { w.unlock(); } } public static long cloneContext() { r.lock(); try { return secp256k1_ctx_clone(Secp256k1Context.getContext()); } finally { r.unlock(); } } /** * libsecp256k1 PrivKey Tweak-Mul - Tweak privkey by multiplying to it * * @param tweak some bytes to tweak with * @param seckey 32-byte seckey */ public static byte[] privKeyTweakMul(byte[] privkey, byte[] tweak) throws AssertFailException{ Preconditions.checkArgument(privkey.length == 32); ByteBuffer byteBuff = nativeECDSABuffer.get(); if (byteBuff == null || byteBuff.capacity() < privkey.length + tweak.length) { byteBuff = ByteBuffer.allocateDirect(privkey.length + tweak.length); byteBuff.order(ByteOrder.nativeOrder()); nativeECDSABuffer.set(byteBuff); } byteBuff.rewind(); byteBuff.put(privkey); byteBuff.put(tweak); byte[][] retByteArray; r.lock(); try { retByteArray = secp256k1_privkey_tweak_mul(byteBuff,Secp256k1Context.getContext()); } finally { r.unlock(); } byte[] privArr = retByteArray[0]; int privLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF; int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); assertEquals(privArr.length, privLen, "Got bad pubkey length."); assertEquals(retVal, 1, "Failed return value check."); return privArr; } /** * libsecp256k1 PrivKey Tweak-Add - Tweak privkey by adding to it * * @param tweak some bytes to tweak with * @param seckey 32-byte seckey */ public static byte[] privKeyTweakAdd(byte[] privkey, byte[] tweak) throws AssertFailException{ Preconditions.checkArgument(privkey.length == 32); ByteBuffer byteBuff = nativeECDSABuffer.get(); if (byteBuff == null || byteBuff.capacity() < privkey.length + tweak.length) { byteBuff = ByteBuffer.allocateDirect(privkey.length + tweak.length); byteBuff.order(ByteOrder.nativeOrder()); nativeECDSABuffer.set(byteBuff); } byteBuff.rewind(); byteBuff.put(privkey); byteBuff.put(tweak); byte[][] retByteArray; r.lock(); try { retByteArray = secp256k1_privkey_tweak_add(byteBuff,Secp256k1Context.getContext()); } finally { r.unlock(); } byte[] privArr = retByteArray[0]; int privLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF; int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); assertEquals(privArr.length, privLen, "Got bad pubkey length."); assertEquals(retVal, 1, "Failed return value check."); return privArr; } /** * libsecp256k1 PubKey Tweak-Add - Tweak pubkey by adding to it * * @param tweak some bytes to tweak with * @param pubkey 32-byte seckey */ public static byte[] pubKeyTweakAdd(byte[] pubkey, byte[] tweak) throws AssertFailException{ Preconditions.checkArgument(pubkey.length == 33 || pubkey.length == 65); ByteBuffer byteBuff = nativeECDSABuffer.get(); if (byteBuff == null || byteBuff.capacity() < pubkey.length + tweak.length) { byteBuff = ByteBuffer.allocateDirect(pubkey.length + tweak.length); byteBuff.order(ByteOrder.nativeOrder()); nativeECDSABuffer.set(byteBuff); } byteBuff.rewind(); byteBuff.put(pubkey); byteBuff.put(tweak); byte[][] retByteArray; r.lock(); try { retByteArray = secp256k1_pubkey_tweak_add(byteBuff,Secp256k1Context.getContext(), pubkey.length); } finally { r.unlock(); } byte[] pubArr = retByteArray[0]; int pubLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF; int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); assertEquals(pubArr.length, pubLen, "Got bad pubkey length."); assertEquals(retVal, 1, "Failed return value check."); return pubArr; } /** * libsecp256k1 PubKey Tweak-Mul - Tweak pubkey by multiplying to it * * @param tweak some bytes to tweak with * @param pubkey 32-byte seckey */ public static byte[] pubKeyTweakMul(byte[] pubkey, byte[] tweak) throws AssertFailException{ Preconditions.checkArgument(pubkey.length == 33 || pubkey.length == 65); ByteBuffer byteBuff = nativeECDSABuffer.get(); if (byteBuff == null || byteBuff.capacity() < pubkey.length + tweak.length) { byteBuff = ByteBuffer.allocateDirect(pubkey.length + tweak.length); byteBuff.order(ByteOrder.nativeOrder()); nativeECDSABuffer.set(byteBuff); } byteBuff.rewind(); byteBuff.put(pubkey); byteBuff.put(tweak); byte[][] retByteArray; r.lock(); try { retByteArray = secp256k1_pubkey_tweak_mul(byteBuff,Secp256k1Context.getContext(), pubkey.length); } finally { r.unlock(); } byte[] pubArr = retByteArray[0]; int pubLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF; int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); assertEquals(pubArr.length, pubLen, "Got bad pubkey length."); assertEquals(retVal, 1, "Failed return value check."); return pubArr; } /** * libsecp256k1 create ECDH secret - constant time ECDH calculation * * @param seckey byte array of secret key used in exponentiaion * @param pubkey byte array of public key used in exponentiaion */ public static byte[] createECDHSecret(byte[] seckey, byte[] pubkey) throws AssertFailException{ Preconditions.checkArgument(seckey.length <= 32 && pubkey.length <= 65); ByteBuffer byteBuff = nativeECDSABuffer.get(); if (byteBuff == null || byteBuff.capacity() < 32 + pubkey.length) { byteBuff = ByteBuffer.allocateDirect(32 + pubkey.length); byteBuff.order(ByteOrder.nativeOrder()); nativeECDSABuffer.set(byteBuff); } byteBuff.rewind(); byteBuff.put(seckey); byteBuff.put(pubkey); byte[][] retByteArray; r.lock(); try { retByteArray = secp256k1_ecdh(byteBuff, Secp256k1Context.getContext(), pubkey.length); } finally { r.unlock(); } byte[] resArr = retByteArray[0]; int retVal = new BigInteger(new byte[] { retByteArray[1][0] }).intValue(); assertEquals(resArr.length, 32, "Got bad result length."); assertEquals(retVal, 1, "Failed return value check."); return resArr; } /** * libsecp256k1 randomize - updates the context randomization * * @param seed 32-byte random seed */ public static synchronized boolean randomize(byte[] seed) throws AssertFailException{ Preconditions.checkArgument(seed.length == 32 || seed == null); ByteBuffer byteBuff = nativeECDSABuffer.get(); if (byteBuff == null || byteBuff.capacity() < seed.length) { byteBuff = ByteBuffer.allocateDirect(seed.length); byteBuff.order(ByteOrder.nativeOrder()); nativeECDSABuffer.set(byteBuff); } byteBuff.rewind(); byteBuff.put(seed); w.lock(); try { return secp256k1_context_randomize(byteBuff, Secp256k1Context.getContext()) == 1; } finally { w.unlock(); } } private static native long secp256k1_ctx_clone(long context); private static native int secp256k1_context_randomize(ByteBuffer byteBuff, long context); private static native byte[][] secp256k1_privkey_tweak_add(ByteBuffer byteBuff, long context); private static native byte[][] secp256k1_privkey_tweak_mul(ByteBuffer byteBuff, long context); private static native byte[][] secp256k1_pubkey_tweak_add(ByteBuffer byteBuff, long context, int pubLen); private static native byte[][] secp256k1_pubkey_tweak_mul(ByteBuffer byteBuff, long context, int pubLen); private static native void secp256k1_destroy_context(long context); private static native int secp256k1_ecdsa_verify(ByteBuffer byteBuff, long context, int sigLen, int pubLen); private static native byte[][] secp256k1_ecdsa_sign(ByteBuffer byteBuff, long context); private static native int secp256k1_ec_seckey_verify(ByteBuffer byteBuff, long context); private static native byte[][] secp256k1_ec_pubkey_create(ByteBuffer byteBuff, long context); private static native byte[][] secp256k1_ec_pubkey_parse(ByteBuffer byteBuff, long context, int inputLen); private static native byte[][] secp256k1_ecdh(ByteBuffer byteBuff, long context, int inputLen); } ================================================ FILE: crypto/secp256k1/libsecp256k1/src/java/org/bitcoin/NativeSecp256k1Test.java ================================================ package org.bitcoin; import com.google.common.io.BaseEncoding; import java.util.Arrays; import java.math.BigInteger; import javax.xml.bind.DatatypeConverter; import static org.bitcoin.NativeSecp256k1Util.*; /** * This class holds test cases defined for testing this library. */ public class NativeSecp256k1Test { //TODO improve comments/add more tests /** * This tests verify() for a valid signature */ public static void testVerifyPos() throws AssertFailException{ boolean result = false; byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90".toLowerCase()); //sha256hash of "testing" byte[] sig = BaseEncoding.base16().lowerCase().decode("3044022079BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F817980220294F14E883B3F525B5367756C2A11EF6CF84B730B36C17CB0C56F0AAB2C98589".toLowerCase()); byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase()); result = NativeSecp256k1.verify( data, sig, pub); assertEquals( result, true , "testVerifyPos"); } /** * This tests verify() for a non-valid signature */ public static void testVerifyNeg() throws AssertFailException{ boolean result = false; byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A91".toLowerCase()); //sha256hash of "testing" byte[] sig = BaseEncoding.base16().lowerCase().decode("3044022079BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F817980220294F14E883B3F525B5367756C2A11EF6CF84B730B36C17CB0C56F0AAB2C98589".toLowerCase()); byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase()); result = NativeSecp256k1.verify( data, sig, pub); //System.out.println(" TEST " + new BigInteger(1, resultbytes).toString(16)); assertEquals( result, false , "testVerifyNeg"); } /** * This tests secret key verify() for a valid secretkey */ public static void testSecKeyVerifyPos() throws AssertFailException{ boolean result = false; byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); result = NativeSecp256k1.secKeyVerify( sec ); //System.out.println(" TEST " + new BigInteger(1, resultbytes).toString(16)); assertEquals( result, true , "testSecKeyVerifyPos"); } /** * This tests secret key verify() for a invalid secretkey */ public static void testSecKeyVerifyNeg() throws AssertFailException{ boolean result = false; byte[] sec = BaseEncoding.base16().lowerCase().decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF".toLowerCase()); result = NativeSecp256k1.secKeyVerify( sec ); //System.out.println(" TEST " + new BigInteger(1, resultbytes).toString(16)); assertEquals( result, false , "testSecKeyVerifyNeg"); } /** * This tests public key create() for a valid secretkey */ public static void testPubKeyCreatePos() throws AssertFailException{ byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); byte[] resultArr = NativeSecp256k1.computePubkey( sec); String pubkeyString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); assertEquals( pubkeyString , "04C591A8FF19AC9C4E4E5793673B83123437E975285E7B442F4EE2654DFFCA5E2D2103ED494718C697AC9AEBCFD19612E224DB46661011863ED2FC54E71861E2A6" , "testPubKeyCreatePos"); } /** * This tests public key create() for a invalid secretkey */ public static void testPubKeyCreateNeg() throws AssertFailException{ byte[] sec = BaseEncoding.base16().lowerCase().decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF".toLowerCase()); byte[] resultArr = NativeSecp256k1.computePubkey( sec); String pubkeyString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); assertEquals( pubkeyString, "" , "testPubKeyCreateNeg"); } /** * This tests sign() for a valid secretkey */ public static void testSignPos() throws AssertFailException{ byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90".toLowerCase()); //sha256hash of "testing" byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); byte[] resultArr = NativeSecp256k1.sign(data, sec); String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); assertEquals( sigString, "30440220182A108E1448DC8F1FB467D06A0F3BB8EA0533584CB954EF8DA112F1D60E39A202201C66F36DA211C087F3AF88B50EDF4F9BDAA6CF5FD6817E74DCA34DB12390C6E9" , "testSignPos"); } /** * This tests sign() for a invalid secretkey */ public static void testSignNeg() throws AssertFailException{ byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90".toLowerCase()); //sha256hash of "testing" byte[] sec = BaseEncoding.base16().lowerCase().decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF".toLowerCase()); byte[] resultArr = NativeSecp256k1.sign(data, sec); String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); assertEquals( sigString, "" , "testSignNeg"); } /** * This tests private key tweak-add */ public static void testPrivKeyTweakAdd_1() throws AssertFailException { byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak" byte[] resultArr = NativeSecp256k1.privKeyTweakAdd( sec , data ); String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); assertEquals( sigString , "A168571E189E6F9A7E2D657A4B53AE99B909F7E712D1C23CED28093CD57C88F3" , "testPrivKeyAdd_1"); } /** * This tests private key tweak-mul */ public static void testPrivKeyTweakMul_1() throws AssertFailException { byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak" byte[] resultArr = NativeSecp256k1.privKeyTweakMul( sec , data ); String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); assertEquals( sigString , "97F8184235F101550F3C71C927507651BD3F1CDB4A5A33B8986ACF0DEE20FFFC" , "testPrivKeyMul_1"); } /** * This tests private key tweak-add uncompressed */ public static void testPrivKeyTweakAdd_2() throws AssertFailException { byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase()); byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak" byte[] resultArr = NativeSecp256k1.pubKeyTweakAdd( pub , data ); String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); assertEquals( sigString , "0411C6790F4B663CCE607BAAE08C43557EDC1A4D11D88DFCB3D841D0C6A941AF525A268E2A863C148555C48FB5FBA368E88718A46E205FABC3DBA2CCFFAB0796EF" , "testPrivKeyAdd_2"); } /** * This tests private key tweak-mul uncompressed */ public static void testPrivKeyTweakMul_2() throws AssertFailException { byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase()); byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak" byte[] resultArr = NativeSecp256k1.pubKeyTweakMul( pub , data ); String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); assertEquals( sigString , "04E0FE6FE55EBCA626B98A807F6CAF654139E14E5E3698F01A9A658E21DC1D2791EC060D4F412A794D5370F672BC94B722640B5F76914151CFCA6E712CA48CC589" , "testPrivKeyMul_2"); } /** * This tests seed randomization */ public static void testRandomize() throws AssertFailException { byte[] seed = BaseEncoding.base16().lowerCase().decode("A441B15FE9A3CF56661190A0B93B9DEC7D04127288CC87250967CF3B52894D11".toLowerCase()); //sha256hash of "random" boolean result = NativeSecp256k1.randomize(seed); assertEquals( result, true, "testRandomize"); } public static void testCreateECDHSecret() throws AssertFailException{ byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase()); byte[] resultArr = NativeSecp256k1.createECDHSecret(sec, pub); String ecdhString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); assertEquals( ecdhString, "2A2A67007A926E6594AF3EB564FC74005B37A9C8AEF2033C4552051B5C87F043" , "testCreateECDHSecret"); } public static void main(String[] args) throws AssertFailException{ System.out.println("\n libsecp256k1 enabled: " + Secp256k1Context.isEnabled() + "\n"); assertEquals( Secp256k1Context.isEnabled(), true, "isEnabled" ); //Test verify() success/fail testVerifyPos(); testVerifyNeg(); //Test secKeyVerify() success/fail testSecKeyVerifyPos(); testSecKeyVerifyNeg(); //Test computePubkey() success/fail testPubKeyCreatePos(); testPubKeyCreateNeg(); //Test sign() success/fail testSignPos(); testSignNeg(); //Test privKeyTweakAdd() 1 testPrivKeyTweakAdd_1(); //Test privKeyTweakMul() 2 testPrivKeyTweakMul_1(); //Test privKeyTweakAdd() 3 testPrivKeyTweakAdd_2(); //Test privKeyTweakMul() 4 testPrivKeyTweakMul_2(); //Test randomize() testRandomize(); //Test ECDH testCreateECDHSecret(); NativeSecp256k1.cleanup(); System.out.println(" All tests passed." ); } } ================================================ FILE: crypto/secp256k1/libsecp256k1/src/java/org/bitcoin/NativeSecp256k1Util.java ================================================ /* * Copyright 2014-2016 the libsecp256k1 contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.bitcoin; public class NativeSecp256k1Util{ public static void assertEquals( int val, int val2, String message ) throws AssertFailException{ if( val != val2 ) throw new AssertFailException("FAIL: " + message); } public static void assertEquals( boolean val, boolean val2, String message ) throws AssertFailException{ if( val != val2 ) throw new AssertFailException("FAIL: " + message); else System.out.println("PASS: " + message); } public static void assertEquals( String val, String val2, String message ) throws AssertFailException{ if( !val.equals(val2) ) throw new AssertFailException("FAIL: " + message); else System.out.println("PASS: " + message); } public static class AssertFailException extends Exception { public AssertFailException(String message) { super( message ); } } } ================================================ FILE: crypto/secp256k1/libsecp256k1/src/java/org/bitcoin/Secp256k1Context.java ================================================ /* * Copyright 2014-2016 the libsecp256k1 contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.bitcoin; /** * This class holds the context reference used in native methods * to handle ECDSA operations. */ public class Secp256k1Context { private static final boolean enabled; //true if the library is loaded private static final long context; //ref to pointer to context obj static { //static initializer boolean isEnabled = true; long contextRef = -1; try { System.loadLibrary("secp256k1"); contextRef = secp256k1_init_context(); } catch (UnsatisfiedLinkError e) { System.out.println("UnsatisfiedLinkError: " + e.toString()); isEnabled = false; } enabled = isEnabled; context = contextRef; } public static boolean isEnabled() { return enabled; } public static long getContext() { if(!enabled) return -1; //sanity check return context; } private static native long secp256k1_init_context(); } ================================================ FILE: crypto/secp256k1/libsecp256k1/src/java/org_bitcoin_NativeSecp256k1.c ================================================ #include #include #include #include "org_bitcoin_NativeSecp256k1.h" #include "include/secp256k1.h" #include "include/secp256k1_ecdh.h" #include "include/secp256k1_recovery.h" SECP256K1_API jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ctx_1clone (JNIEnv* env, jclass classObject, jlong ctx_l) { const secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; jlong ctx_clone_l = (uintptr_t) secp256k1_context_clone(ctx); (void)classObject;(void)env; return ctx_clone_l; } SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1context_1randomize (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) { secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; const unsigned char* seed = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); (void)classObject; return secp256k1_context_randomize(ctx, seed); } SECP256K1_API void JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1destroy_1context (JNIEnv* env, jclass classObject, jlong ctx_l) { secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; secp256k1_context_destroy(ctx); (void)classObject;(void)env; } SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint siglen, jint publen) { secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; unsigned char* data = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); const unsigned char* sigdata = { (unsigned char*) (data + 32) }; const unsigned char* pubdata = { (unsigned char*) (data + siglen + 32) }; secp256k1_ecdsa_signature sig; secp256k1_pubkey pubkey; int ret = secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigdata, siglen); if( ret ) { ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pubdata, publen); if( ret ) { ret = secp256k1_ecdsa_verify(ctx, &sig, data, &pubkey); } } (void)classObject; return ret; } SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1sign (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) { secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; unsigned char* data = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); unsigned char* secKey = (unsigned char*) (data + 32); jobjectArray retArray; jbyteArray sigArray, intsByteArray; unsigned char intsarray[2]; secp256k1_ecdsa_signature sig[72]; int ret = secp256k1_ecdsa_sign(ctx, sig, data, secKey, NULL, NULL ); unsigned char outputSer[72]; size_t outputLen = 72; if( ret ) { int ret2 = secp256k1_ecdsa_signature_serialize_der(ctx,outputSer, &outputLen, sig ); (void)ret2; } intsarray[0] = outputLen; intsarray[1] = ret; retArray = (*env)->NewObjectArray(env, 2, (*env)->FindClass(env, "[B"), (*env)->NewByteArray(env, 1)); sigArray = (*env)->NewByteArray(env, outputLen); (*env)->SetByteArrayRegion(env, sigArray, 0, outputLen, (jbyte*)outputSer); (*env)->SetObjectArrayElement(env, retArray, 0, sigArray); intsByteArray = (*env)->NewByteArray(env, 2); (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); (void)classObject; return retArray; } SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1seckey_1verify (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) { secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; unsigned char* secKey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); (void)classObject; return secp256k1_ec_seckey_verify(ctx, secKey); } SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1create (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) { secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; const unsigned char* secKey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); secp256k1_pubkey pubkey; jobjectArray retArray; jbyteArray pubkeyArray, intsByteArray; unsigned char intsarray[2]; int ret = secp256k1_ec_pubkey_create(ctx, &pubkey, secKey); unsigned char outputSer[65]; size_t outputLen = 65; if( ret ) { int ret2 = secp256k1_ec_pubkey_serialize(ctx,outputSer, &outputLen, &pubkey,SECP256K1_EC_UNCOMPRESSED );(void)ret2; } intsarray[0] = outputLen; intsarray[1] = ret; retArray = (*env)->NewObjectArray(env, 2, (*env)->FindClass(env, "[B"), (*env)->NewByteArray(env, 1)); pubkeyArray = (*env)->NewByteArray(env, outputLen); (*env)->SetByteArrayRegion(env, pubkeyArray, 0, outputLen, (jbyte*)outputSer); (*env)->SetObjectArrayElement(env, retArray, 0, pubkeyArray); intsByteArray = (*env)->NewByteArray(env, 2); (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); (void)classObject; return retArray; } SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1add (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) { secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; unsigned char* privkey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); const unsigned char* tweak = (unsigned char*) (privkey + 32); jobjectArray retArray; jbyteArray privArray, intsByteArray; unsigned char intsarray[2]; int privkeylen = 32; int ret = secp256k1_ec_privkey_tweak_add(ctx, privkey, tweak); intsarray[0] = privkeylen; intsarray[1] = ret; retArray = (*env)->NewObjectArray(env, 2, (*env)->FindClass(env, "[B"), (*env)->NewByteArray(env, 1)); privArray = (*env)->NewByteArray(env, privkeylen); (*env)->SetByteArrayRegion(env, privArray, 0, privkeylen, (jbyte*)privkey); (*env)->SetObjectArrayElement(env, retArray, 0, privArray); intsByteArray = (*env)->NewByteArray(env, 2); (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); (void)classObject; return retArray; } SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1mul (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) { secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; unsigned char* privkey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); const unsigned char* tweak = (unsigned char*) (privkey + 32); jobjectArray retArray; jbyteArray privArray, intsByteArray; unsigned char intsarray[2]; int privkeylen = 32; int ret = secp256k1_ec_privkey_tweak_mul(ctx, privkey, tweak); intsarray[0] = privkeylen; intsarray[1] = ret; retArray = (*env)->NewObjectArray(env, 2, (*env)->FindClass(env, "[B"), (*env)->NewByteArray(env, 1)); privArray = (*env)->NewByteArray(env, privkeylen); (*env)->SetByteArrayRegion(env, privArray, 0, privkeylen, (jbyte*)privkey); (*env)->SetObjectArrayElement(env, retArray, 0, privArray); intsByteArray = (*env)->NewByteArray(env, 2); (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); (void)classObject; return retArray; } SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1add (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen) { secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; /* secp256k1_pubkey* pubkey = (secp256k1_pubkey*) (*env)->GetDirectBufferAddress(env, byteBufferObject);*/ unsigned char* pkey = (*env)->GetDirectBufferAddress(env, byteBufferObject); const unsigned char* tweak = (unsigned char*) (pkey + publen); jobjectArray retArray; jbyteArray pubArray, intsByteArray; unsigned char intsarray[2]; unsigned char outputSer[65]; size_t outputLen = 65; secp256k1_pubkey pubkey; int ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pkey, publen); if( ret ) { ret = secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, tweak); } if( ret ) { int ret2 = secp256k1_ec_pubkey_serialize(ctx,outputSer, &outputLen, &pubkey,SECP256K1_EC_UNCOMPRESSED );(void)ret2; } intsarray[0] = outputLen; intsarray[1] = ret; retArray = (*env)->NewObjectArray(env, 2, (*env)->FindClass(env, "[B"), (*env)->NewByteArray(env, 1)); pubArray = (*env)->NewByteArray(env, outputLen); (*env)->SetByteArrayRegion(env, pubArray, 0, outputLen, (jbyte*)outputSer); (*env)->SetObjectArrayElement(env, retArray, 0, pubArray); intsByteArray = (*env)->NewByteArray(env, 2); (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); (void)classObject; return retArray; } SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1mul (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen) { secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; unsigned char* pkey = (*env)->GetDirectBufferAddress(env, byteBufferObject); const unsigned char* tweak = (unsigned char*) (pkey + publen); jobjectArray retArray; jbyteArray pubArray, intsByteArray; unsigned char intsarray[2]; unsigned char outputSer[65]; size_t outputLen = 65; secp256k1_pubkey pubkey; int ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pkey, publen); if ( ret ) { ret = secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, tweak); } if( ret ) { int ret2 = secp256k1_ec_pubkey_serialize(ctx,outputSer, &outputLen, &pubkey,SECP256K1_EC_UNCOMPRESSED );(void)ret2; } intsarray[0] = outputLen; intsarray[1] = ret; retArray = (*env)->NewObjectArray(env, 2, (*env)->FindClass(env, "[B"), (*env)->NewByteArray(env, 1)); pubArray = (*env)->NewByteArray(env, outputLen); (*env)->SetByteArrayRegion(env, pubArray, 0, outputLen, (jbyte*)outputSer); (*env)->SetObjectArrayElement(env, retArray, 0, pubArray); intsByteArray = (*env)->NewByteArray(env, 2); (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); (void)classObject; return retArray; } SECP256K1_API jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1pubkey_1combine (JNIEnv * env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint numkeys) { (void)classObject;(void)env;(void)byteBufferObject;(void)ctx_l;(void)numkeys; return 0; } SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdh (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen) { secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; const unsigned char* secdata = (*env)->GetDirectBufferAddress(env, byteBufferObject); const unsigned char* pubdata = (const unsigned char*) (secdata + 32); jobjectArray retArray; jbyteArray outArray, intsByteArray; unsigned char intsarray[1]; secp256k1_pubkey pubkey; unsigned char nonce_res[32]; size_t outputLen = 32; int ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pubdata, publen); if (ret) { ret = secp256k1_ecdh( ctx, nonce_res, &pubkey, secdata ); } intsarray[0] = ret; retArray = (*env)->NewObjectArray(env, 2, (*env)->FindClass(env, "[B"), (*env)->NewByteArray(env, 1)); outArray = (*env)->NewByteArray(env, outputLen); (*env)->SetByteArrayRegion(env, outArray, 0, 32, (jbyte*)nonce_res); (*env)->SetObjectArrayElement(env, retArray, 0, outArray); intsByteArray = (*env)->NewByteArray(env, 1); (*env)->SetByteArrayRegion(env, intsByteArray, 0, 1, (jbyte*)intsarray); (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); (void)classObject; return retArray; } ================================================ FILE: crypto/secp256k1/libsecp256k1/src/java/org_bitcoin_NativeSecp256k1.h ================================================ /* DO NOT EDIT THIS FILE - it is machine generated */ #include #include "include/secp256k1.h" /* Header for class org_bitcoin_NativeSecp256k1 */ #ifndef _Included_org_bitcoin_NativeSecp256k1 #define _Included_org_bitcoin_NativeSecp256k1 #ifdef __cplusplus extern "C" { #endif /* * Class: org_bitcoin_NativeSecp256k1 * Method: secp256k1_ctx_clone * Signature: (J)J */ SECP256K1_API jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ctx_1clone (JNIEnv *, jclass, jlong); /* * Class: org_bitcoin_NativeSecp256k1 * Method: secp256k1_context_randomize * Signature: (Ljava/nio/ByteBuffer;J)I */ SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1context_1randomize (JNIEnv *, jclass, jobject, jlong); /* * Class: org_bitcoin_NativeSecp256k1 * Method: secp256k1_privkey_tweak_add * Signature: (Ljava/nio/ByteBuffer;J)[[B */ SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1add (JNIEnv *, jclass, jobject, jlong); /* * Class: org_bitcoin_NativeSecp256k1 * Method: secp256k1_privkey_tweak_mul * Signature: (Ljava/nio/ByteBuffer;J)[[B */ SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1mul (JNIEnv *, jclass, jobject, jlong); /* * Class: org_bitcoin_NativeSecp256k1 * Method: secp256k1_pubkey_tweak_add * Signature: (Ljava/nio/ByteBuffer;JI)[[B */ SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1add (JNIEnv *, jclass, jobject, jlong, jint); /* * Class: org_bitcoin_NativeSecp256k1 * Method: secp256k1_pubkey_tweak_mul * Signature: (Ljava/nio/ByteBuffer;JI)[[B */ SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1mul (JNIEnv *, jclass, jobject, jlong, jint); /* * Class: org_bitcoin_NativeSecp256k1 * Method: secp256k1_destroy_context * Signature: (J)V */ SECP256K1_API void JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1destroy_1context (JNIEnv *, jclass, jlong); /* * Class: org_bitcoin_NativeSecp256k1 * Method: secp256k1_ecdsa_verify * Signature: (Ljava/nio/ByteBuffer;JII)I */ SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify (JNIEnv *, jclass, jobject, jlong, jint, jint); /* * Class: org_bitcoin_NativeSecp256k1 * Method: secp256k1_ecdsa_sign * Signature: (Ljava/nio/ByteBuffer;J)[[B */ SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1sign (JNIEnv *, jclass, jobject, jlong); /* * Class: org_bitcoin_NativeSecp256k1 * Method: secp256k1_ec_seckey_verify * Signature: (Ljava/nio/ByteBuffer;J)I */ SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1seckey_1verify (JNIEnv *, jclass, jobject, jlong); /* * Class: org_bitcoin_NativeSecp256k1 * Method: secp256k1_ec_pubkey_create * Signature: (Ljava/nio/ByteBuffer;J)[[B */ SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1create (JNIEnv *, jclass, jobject, jlong); /* * Class: org_bitcoin_NativeSecp256k1 * Method: secp256k1_ec_pubkey_parse * Signature: (Ljava/nio/ByteBuffer;JI)[[B */ SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1parse (JNIEnv *, jclass, jobject, jlong, jint); /* * Class: org_bitcoin_NativeSecp256k1 * Method: secp256k1_ecdh * Signature: (Ljava/nio/ByteBuffer;JI)[[B */ SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdh (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen); #ifdef __cplusplus } #endif #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/java/org_bitcoin_Secp256k1Context.c ================================================ #include #include #include "org_bitcoin_Secp256k1Context.h" #include "include/secp256k1.h" SECP256K1_API jlong JNICALL Java_org_bitcoin_Secp256k1Context_secp256k1_1init_1context (JNIEnv* env, jclass classObject) { secp256k1_context *ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); (void)classObject;(void)env; return (uintptr_t)ctx; } ================================================ FILE: crypto/secp256k1/libsecp256k1/src/java/org_bitcoin_Secp256k1Context.h ================================================ /* DO NOT EDIT THIS FILE - it is machine generated */ #include #include "include/secp256k1.h" /* Header for class org_bitcoin_Secp256k1Context */ #ifndef _Included_org_bitcoin_Secp256k1Context #define _Included_org_bitcoin_Secp256k1Context #ifdef __cplusplus extern "C" { #endif /* * Class: org_bitcoin_Secp256k1Context * Method: secp256k1_init_context * Signature: ()J */ SECP256K1_API jlong JNICALL Java_org_bitcoin_Secp256k1Context_secp256k1_1init_1context (JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/modules/ecdh/Makefile.am.include ================================================ include_HEADERS += include/secp256k1_ecdh.h noinst_HEADERS += src/modules/ecdh/main_impl.h noinst_HEADERS += src/modules/ecdh/tests_impl.h if USE_BENCHMARK noinst_PROGRAMS += bench_ecdh bench_ecdh_SOURCES = src/bench_ecdh.c bench_ecdh_LDADD = libsecp256k1.la $(SECP_LIBS) $(COMMON_LIB) endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/modules/ecdh/main_impl.h ================================================ /********************************************************************** * Copyright (c) 2015 Andrew Poelstra * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_MODULE_ECDH_MAIN_ #define _SECP256K1_MODULE_ECDH_MAIN_ #include "include/secp256k1_ecdh.h" #include "ecmult_const_impl.h" int secp256k1_ecdh(const secp256k1_context* ctx, unsigned char *result, const secp256k1_pubkey *point, const unsigned char *scalar) { int ret = 0; int overflow = 0; secp256k1_gej res; secp256k1_ge pt; secp256k1_scalar s; VERIFY_CHECK(ctx != NULL); ARG_CHECK(result != NULL); ARG_CHECK(point != NULL); ARG_CHECK(scalar != NULL); secp256k1_pubkey_load(ctx, &pt, point); secp256k1_scalar_set_b32(&s, scalar, &overflow); if (overflow || secp256k1_scalar_is_zero(&s)) { ret = 0; } else { unsigned char x[32]; unsigned char y[1]; secp256k1_sha256_t sha; secp256k1_ecmult_const(&res, &pt, &s); secp256k1_ge_set_gej(&pt, &res); /* Compute a hash of the point in compressed form * Note we cannot use secp256k1_eckey_pubkey_serialize here since it does not * expect its output to be secret and has a timing sidechannel. */ secp256k1_fe_normalize(&pt.x); secp256k1_fe_normalize(&pt.y); secp256k1_fe_get_b32(x, &pt.x); y[0] = 0x02 | secp256k1_fe_is_odd(&pt.y); secp256k1_sha256_initialize(&sha); secp256k1_sha256_write(&sha, y, sizeof(y)); secp256k1_sha256_write(&sha, x, sizeof(x)); secp256k1_sha256_finalize(&sha, result); ret = 1; } secp256k1_scalar_clear(&s); return ret; } #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/modules/ecdh/tests_impl.h ================================================ /********************************************************************** * Copyright (c) 2015 Andrew Poelstra * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_MODULE_ECDH_TESTS_ #define _SECP256K1_MODULE_ECDH_TESTS_ void test_ecdh_api(void) { /* Setup context that just counts errors */ secp256k1_context *tctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); secp256k1_pubkey point; unsigned char res[32]; unsigned char s_one[32] = { 0 }; int32_t ecount = 0; s_one[31] = 1; secp256k1_context_set_error_callback(tctx, counting_illegal_callback_fn, &ecount); secp256k1_context_set_illegal_callback(tctx, counting_illegal_callback_fn, &ecount); CHECK(secp256k1_ec_pubkey_create(tctx, &point, s_one) == 1); /* Check all NULLs are detected */ CHECK(secp256k1_ecdh(tctx, res, &point, s_one) == 1); CHECK(ecount == 0); CHECK(secp256k1_ecdh(tctx, NULL, &point, s_one) == 0); CHECK(ecount == 1); CHECK(secp256k1_ecdh(tctx, res, NULL, s_one) == 0); CHECK(ecount == 2); CHECK(secp256k1_ecdh(tctx, res, &point, NULL) == 0); CHECK(ecount == 3); CHECK(secp256k1_ecdh(tctx, res, &point, s_one) == 1); CHECK(ecount == 3); /* Cleanup */ secp256k1_context_destroy(tctx); } void test_ecdh_generator_basepoint(void) { unsigned char s_one[32] = { 0 }; secp256k1_pubkey point[2]; int i; s_one[31] = 1; /* Check against pubkey creation when the basepoint is the generator */ for (i = 0; i < 100; ++i) { secp256k1_sha256_t sha; unsigned char s_b32[32]; unsigned char output_ecdh[32]; unsigned char output_ser[32]; unsigned char point_ser[33]; size_t point_ser_len = sizeof(point_ser); secp256k1_scalar s; random_scalar_order(&s); secp256k1_scalar_get_b32(s_b32, &s); /* compute using ECDH function */ CHECK(secp256k1_ec_pubkey_create(ctx, &point[0], s_one) == 1); CHECK(secp256k1_ecdh(ctx, output_ecdh, &point[0], s_b32) == 1); /* compute "explicitly" */ CHECK(secp256k1_ec_pubkey_create(ctx, &point[1], s_b32) == 1); CHECK(secp256k1_ec_pubkey_serialize(ctx, point_ser, &point_ser_len, &point[1], SECP256K1_EC_COMPRESSED) == 1); CHECK(point_ser_len == sizeof(point_ser)); secp256k1_sha256_initialize(&sha); secp256k1_sha256_write(&sha, point_ser, point_ser_len); secp256k1_sha256_finalize(&sha, output_ser); /* compare */ CHECK(memcmp(output_ecdh, output_ser, sizeof(output_ser)) == 0); } } void test_bad_scalar(void) { unsigned char s_zero[32] = { 0 }; unsigned char s_overflow[32] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41 }; unsigned char s_rand[32] = { 0 }; unsigned char output[32]; secp256k1_scalar rand; secp256k1_pubkey point; /* Create random point */ random_scalar_order(&rand); secp256k1_scalar_get_b32(s_rand, &rand); CHECK(secp256k1_ec_pubkey_create(ctx, &point, s_rand) == 1); /* Try to multiply it by bad values */ CHECK(secp256k1_ecdh(ctx, output, &point, s_zero) == 0); CHECK(secp256k1_ecdh(ctx, output, &point, s_overflow) == 0); /* ...and a good one */ s_overflow[31] -= 1; CHECK(secp256k1_ecdh(ctx, output, &point, s_overflow) == 1); } void run_ecdh_tests(void) { test_ecdh_api(); test_ecdh_generator_basepoint(); test_bad_scalar(); } #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/modules/recovery/Makefile.am.include ================================================ include_HEADERS += include/secp256k1_recovery.h noinst_HEADERS += src/modules/recovery/main_impl.h noinst_HEADERS += src/modules/recovery/tests_impl.h if USE_BENCHMARK noinst_PROGRAMS += bench_recover bench_recover_SOURCES = src/bench_recover.c bench_recover_LDADD = libsecp256k1.la $(SECP_LIBS) $(COMMON_LIB) endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/modules/recovery/main_impl.h ================================================ /********************************************************************** * Copyright (c) 2013-2015 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_MODULE_RECOVERY_MAIN_ #define _SECP256K1_MODULE_RECOVERY_MAIN_ #include "include/secp256k1_recovery.h" static void secp256k1_ecdsa_recoverable_signature_load(const secp256k1_context* ctx, secp256k1_scalar* r, secp256k1_scalar* s, int* recid, const secp256k1_ecdsa_recoverable_signature* sig) { (void)ctx; if (sizeof(secp256k1_scalar) == 32) { /* When the secp256k1_scalar type is exactly 32 byte, use its * representation inside secp256k1_ecdsa_signature, as conversion is very fast. * Note that secp256k1_ecdsa_signature_save must use the same representation. */ memcpy(r, &sig->data[0], 32); memcpy(s, &sig->data[32], 32); } else { secp256k1_scalar_set_b32(r, &sig->data[0], NULL); secp256k1_scalar_set_b32(s, &sig->data[32], NULL); } *recid = sig->data[64]; } static void secp256k1_ecdsa_recoverable_signature_save(secp256k1_ecdsa_recoverable_signature* sig, const secp256k1_scalar* r, const secp256k1_scalar* s, int recid) { if (sizeof(secp256k1_scalar) == 32) { memcpy(&sig->data[0], r, 32); memcpy(&sig->data[32], s, 32); } else { secp256k1_scalar_get_b32(&sig->data[0], r); secp256k1_scalar_get_b32(&sig->data[32], s); } sig->data[64] = recid; } int secp256k1_ecdsa_recoverable_signature_parse_compact(const secp256k1_context* ctx, secp256k1_ecdsa_recoverable_signature* sig, const unsigned char *input64, int recid) { secp256k1_scalar r, s; int ret = 1; int overflow = 0; (void)ctx; ARG_CHECK(sig != NULL); ARG_CHECK(input64 != NULL); ARG_CHECK(recid >= 0 && recid <= 3); secp256k1_scalar_set_b32(&r, &input64[0], &overflow); ret &= !overflow; secp256k1_scalar_set_b32(&s, &input64[32], &overflow); ret &= !overflow; if (ret) { secp256k1_ecdsa_recoverable_signature_save(sig, &r, &s, recid); } else { memset(sig, 0, sizeof(*sig)); } return ret; } int secp256k1_ecdsa_recoverable_signature_serialize_compact(const secp256k1_context* ctx, unsigned char *output64, int *recid, const secp256k1_ecdsa_recoverable_signature* sig) { secp256k1_scalar r, s; (void)ctx; ARG_CHECK(output64 != NULL); ARG_CHECK(sig != NULL); ARG_CHECK(recid != NULL); secp256k1_ecdsa_recoverable_signature_load(ctx, &r, &s, recid, sig); secp256k1_scalar_get_b32(&output64[0], &r); secp256k1_scalar_get_b32(&output64[32], &s); return 1; } int secp256k1_ecdsa_recoverable_signature_convert(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const secp256k1_ecdsa_recoverable_signature* sigin) { secp256k1_scalar r, s; int recid; (void)ctx; ARG_CHECK(sig != NULL); ARG_CHECK(sigin != NULL); secp256k1_ecdsa_recoverable_signature_load(ctx, &r, &s, &recid, sigin); secp256k1_ecdsa_signature_save(sig, &r, &s); return 1; } static int secp256k1_ecdsa_sig_recover(const secp256k1_ecmult_context *ctx, const secp256k1_scalar *sigr, const secp256k1_scalar* sigs, secp256k1_ge *pubkey, const secp256k1_scalar *message, int recid) { unsigned char brx[32]; secp256k1_fe fx; secp256k1_ge x; secp256k1_gej xj; secp256k1_scalar rn, u1, u2; secp256k1_gej qj; int r; if (secp256k1_scalar_is_zero(sigr) || secp256k1_scalar_is_zero(sigs)) { return 0; } secp256k1_scalar_get_b32(brx, sigr); r = secp256k1_fe_set_b32(&fx, brx); (void)r; VERIFY_CHECK(r); /* brx comes from a scalar, so is less than the order; certainly less than p */ if (recid & 2) { if (secp256k1_fe_cmp_var(&fx, &secp256k1_ecdsa_const_p_minus_order) >= 0) { return 0; } secp256k1_fe_add(&fx, &secp256k1_ecdsa_const_order_as_fe); } if (!secp256k1_ge_set_xo_var(&x, &fx, recid & 1)) { return 0; } secp256k1_gej_set_ge(&xj, &x); secp256k1_scalar_inverse_var(&rn, sigr); secp256k1_scalar_mul(&u1, &rn, message); secp256k1_scalar_negate(&u1, &u1); secp256k1_scalar_mul(&u2, &rn, sigs); secp256k1_ecmult(ctx, &qj, &xj, &u2, &u1); secp256k1_ge_set_gej_var(pubkey, &qj); return !secp256k1_gej_is_infinity(&qj); } int secp256k1_ecdsa_sign_recoverable(const secp256k1_context* ctx, secp256k1_ecdsa_recoverable_signature *signature, const unsigned char *msg32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void* noncedata) { secp256k1_scalar r, s; secp256k1_scalar sec, non, msg; int recid; int ret = 0; int overflow = 0; VERIFY_CHECK(ctx != NULL); ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); ARG_CHECK(msg32 != NULL); ARG_CHECK(signature != NULL); ARG_CHECK(seckey != NULL); if (noncefp == NULL) { noncefp = secp256k1_nonce_function_default; } secp256k1_scalar_set_b32(&sec, seckey, &overflow); /* Fail if the secret key is invalid. */ if (!overflow && !secp256k1_scalar_is_zero(&sec)) { unsigned char nonce32[32]; unsigned int count = 0; secp256k1_scalar_set_b32(&msg, msg32, NULL); while (1) { ret = noncefp(nonce32, msg32, seckey, NULL, (void*)noncedata, count); if (!ret) { break; } secp256k1_scalar_set_b32(&non, nonce32, &overflow); if (!secp256k1_scalar_is_zero(&non) && !overflow) { if (secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, &r, &s, &sec, &msg, &non, &recid)) { break; } } count++; } memset(nonce32, 0, 32); secp256k1_scalar_clear(&msg); secp256k1_scalar_clear(&non); secp256k1_scalar_clear(&sec); } if (ret) { secp256k1_ecdsa_recoverable_signature_save(signature, &r, &s, recid); } else { memset(signature, 0, sizeof(*signature)); } return ret; } int secp256k1_ecdsa_recover(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const secp256k1_ecdsa_recoverable_signature *signature, const unsigned char *msg32) { secp256k1_ge q; secp256k1_scalar r, s; secp256k1_scalar m; int recid; VERIFY_CHECK(ctx != NULL); ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); ARG_CHECK(msg32 != NULL); ARG_CHECK(signature != NULL); ARG_CHECK(pubkey != NULL); secp256k1_ecdsa_recoverable_signature_load(ctx, &r, &s, &recid, signature); VERIFY_CHECK(recid >= 0 && recid < 4); /* should have been caught in parse_compact */ secp256k1_scalar_set_b32(&m, msg32, NULL); if (secp256k1_ecdsa_sig_recover(&ctx->ecmult_ctx, &r, &s, &q, &m, recid)) { secp256k1_pubkey_save(pubkey, &q); return 1; } else { memset(pubkey, 0, sizeof(*pubkey)); return 0; } } #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/modules/recovery/tests_impl.h ================================================ /********************************************************************** * Copyright (c) 2013-2015 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_MODULE_RECOVERY_TESTS_ #define _SECP256K1_MODULE_RECOVERY_TESTS_ static int recovery_test_nonce_function(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) { (void) msg32; (void) key32; (void) algo16; (void) data; /* On the first run, return 0 to force a second run */ if (counter == 0) { memset(nonce32, 0, 32); return 1; } /* On the second run, return an overflow to force a third run */ if (counter == 1) { memset(nonce32, 0xff, 32); return 1; } /* On the next run, return a valid nonce, but flip a coin as to whether or not to fail signing. */ memset(nonce32, 1, 32); return secp256k1_rand_bits(1); } void test_ecdsa_recovery_api(void) { /* Setup contexts that just count errors */ secp256k1_context *none = secp256k1_context_create(SECP256K1_CONTEXT_NONE); secp256k1_context *sign = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); secp256k1_context *vrfy = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY); secp256k1_context *both = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); secp256k1_pubkey pubkey; secp256k1_pubkey recpubkey; secp256k1_ecdsa_signature normal_sig; secp256k1_ecdsa_recoverable_signature recsig; unsigned char privkey[32] = { 1 }; unsigned char message[32] = { 2 }; int32_t ecount = 0; int recid = 0; unsigned char sig[74]; unsigned char zero_privkey[32] = { 0 }; unsigned char over_privkey[32] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; secp256k1_context_set_error_callback(none, counting_illegal_callback_fn, &ecount); secp256k1_context_set_error_callback(sign, counting_illegal_callback_fn, &ecount); secp256k1_context_set_error_callback(vrfy, counting_illegal_callback_fn, &ecount); secp256k1_context_set_error_callback(both, counting_illegal_callback_fn, &ecount); secp256k1_context_set_illegal_callback(none, counting_illegal_callback_fn, &ecount); secp256k1_context_set_illegal_callback(sign, counting_illegal_callback_fn, &ecount); secp256k1_context_set_illegal_callback(vrfy, counting_illegal_callback_fn, &ecount); secp256k1_context_set_illegal_callback(both, counting_illegal_callback_fn, &ecount); /* Construct and verify corresponding public key. */ CHECK(secp256k1_ec_seckey_verify(ctx, privkey) == 1); CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, privkey) == 1); /* Check bad contexts and NULLs for signing */ ecount = 0; CHECK(secp256k1_ecdsa_sign_recoverable(none, &recsig, message, privkey, NULL, NULL) == 0); CHECK(ecount == 1); CHECK(secp256k1_ecdsa_sign_recoverable(sign, &recsig, message, privkey, NULL, NULL) == 1); CHECK(ecount == 1); CHECK(secp256k1_ecdsa_sign_recoverable(vrfy, &recsig, message, privkey, NULL, NULL) == 0); CHECK(ecount == 2); CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, privkey, NULL, NULL) == 1); CHECK(ecount == 2); CHECK(secp256k1_ecdsa_sign_recoverable(both, NULL, message, privkey, NULL, NULL) == 0); CHECK(ecount == 3); CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, NULL, privkey, NULL, NULL) == 0); CHECK(ecount == 4); CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, NULL, NULL, NULL) == 0); CHECK(ecount == 5); /* This will fail or succeed randomly, and in either case will not ARG_CHECK failure */ secp256k1_ecdsa_sign_recoverable(both, &recsig, message, privkey, recovery_test_nonce_function, NULL); CHECK(ecount == 5); /* These will all fail, but not in ARG_CHECK way */ CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, zero_privkey, NULL, NULL) == 0); CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, over_privkey, NULL, NULL) == 0); /* This one will succeed. */ CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, privkey, NULL, NULL) == 1); CHECK(ecount == 5); /* Check signing with a goofy nonce function */ /* Check bad contexts and NULLs for recovery */ ecount = 0; CHECK(secp256k1_ecdsa_recover(none, &recpubkey, &recsig, message) == 0); CHECK(ecount == 1); CHECK(secp256k1_ecdsa_recover(sign, &recpubkey, &recsig, message) == 0); CHECK(ecount == 2); CHECK(secp256k1_ecdsa_recover(vrfy, &recpubkey, &recsig, message) == 1); CHECK(ecount == 2); CHECK(secp256k1_ecdsa_recover(both, &recpubkey, &recsig, message) == 1); CHECK(ecount == 2); CHECK(secp256k1_ecdsa_recover(both, NULL, &recsig, message) == 0); CHECK(ecount == 3); CHECK(secp256k1_ecdsa_recover(both, &recpubkey, NULL, message) == 0); CHECK(ecount == 4); CHECK(secp256k1_ecdsa_recover(both, &recpubkey, &recsig, NULL) == 0); CHECK(ecount == 5); /* Check NULLs for conversion */ CHECK(secp256k1_ecdsa_sign(both, &normal_sig, message, privkey, NULL, NULL) == 1); ecount = 0; CHECK(secp256k1_ecdsa_recoverable_signature_convert(both, NULL, &recsig) == 0); CHECK(ecount == 1); CHECK(secp256k1_ecdsa_recoverable_signature_convert(both, &normal_sig, NULL) == 0); CHECK(ecount == 2); CHECK(secp256k1_ecdsa_recoverable_signature_convert(both, &normal_sig, &recsig) == 1); /* Check NULLs for de/serialization */ CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, privkey, NULL, NULL) == 1); ecount = 0; CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(both, NULL, &recid, &recsig) == 0); CHECK(ecount == 1); CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(both, sig, NULL, &recsig) == 0); CHECK(ecount == 2); CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(both, sig, &recid, NULL) == 0); CHECK(ecount == 3); CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(both, sig, &recid, &recsig) == 1); CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(both, NULL, sig, recid) == 0); CHECK(ecount == 4); CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(both, &recsig, NULL, recid) == 0); CHECK(ecount == 5); CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(both, &recsig, sig, -1) == 0); CHECK(ecount == 6); CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(both, &recsig, sig, 5) == 0); CHECK(ecount == 7); /* overflow in signature will fail but not affect ecount */ memcpy(sig, over_privkey, 32); CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(both, &recsig, sig, recid) == 0); CHECK(ecount == 7); /* cleanup */ secp256k1_context_destroy(none); secp256k1_context_destroy(sign); secp256k1_context_destroy(vrfy); secp256k1_context_destroy(both); } void test_ecdsa_recovery_end_to_end(void) { unsigned char extra[32] = {0x00}; unsigned char privkey[32]; unsigned char message[32]; secp256k1_ecdsa_signature signature[5]; secp256k1_ecdsa_recoverable_signature rsignature[5]; unsigned char sig[74]; secp256k1_pubkey pubkey; secp256k1_pubkey recpubkey; int recid = 0; /* Generate a random key and message. */ { secp256k1_scalar msg, key; random_scalar_order_test(&msg); random_scalar_order_test(&key); secp256k1_scalar_get_b32(privkey, &key); secp256k1_scalar_get_b32(message, &msg); } /* Construct and verify corresponding public key. */ CHECK(secp256k1_ec_seckey_verify(ctx, privkey) == 1); CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, privkey) == 1); /* Serialize/parse compact and verify/recover. */ extra[0] = 0; CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[0], message, privkey, NULL, NULL) == 1); CHECK(secp256k1_ecdsa_sign(ctx, &signature[0], message, privkey, NULL, NULL) == 1); CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[4], message, privkey, NULL, NULL) == 1); CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[1], message, privkey, NULL, extra) == 1); extra[31] = 1; CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[2], message, privkey, NULL, extra) == 1); extra[31] = 0; extra[0] = 1; CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[3], message, privkey, NULL, extra) == 1); CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(ctx, sig, &recid, &rsignature[4]) == 1); CHECK(secp256k1_ecdsa_recoverable_signature_convert(ctx, &signature[4], &rsignature[4]) == 1); CHECK(memcmp(&signature[4], &signature[0], 64) == 0); CHECK(secp256k1_ecdsa_verify(ctx, &signature[4], message, &pubkey) == 1); memset(&rsignature[4], 0, sizeof(rsignature[4])); CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsignature[4], sig, recid) == 1); CHECK(secp256k1_ecdsa_recoverable_signature_convert(ctx, &signature[4], &rsignature[4]) == 1); CHECK(secp256k1_ecdsa_verify(ctx, &signature[4], message, &pubkey) == 1); /* Parse compact (with recovery id) and recover. */ CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsignature[4], sig, recid) == 1); CHECK(secp256k1_ecdsa_recover(ctx, &recpubkey, &rsignature[4], message) == 1); CHECK(memcmp(&pubkey, &recpubkey, sizeof(pubkey)) == 0); /* Serialize/destroy/parse signature and verify again. */ CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(ctx, sig, &recid, &rsignature[4]) == 1); sig[secp256k1_rand_bits(6)] += 1 + secp256k1_rand_int(255); CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsignature[4], sig, recid) == 1); CHECK(secp256k1_ecdsa_recoverable_signature_convert(ctx, &signature[4], &rsignature[4]) == 1); CHECK(secp256k1_ecdsa_verify(ctx, &signature[4], message, &pubkey) == 0); /* Recover again */ CHECK(secp256k1_ecdsa_recover(ctx, &recpubkey, &rsignature[4], message) == 0 || memcmp(&pubkey, &recpubkey, sizeof(pubkey)) != 0); } /* Tests several edge cases. */ void test_ecdsa_recovery_edge_cases(void) { const unsigned char msg32[32] = { 'T', 'h', 'i', 's', ' ', 'i', 's', ' ', 'a', ' ', 'v', 'e', 'r', 'y', ' ', 's', 'e', 'c', 'r', 'e', 't', ' ', 'm', 'e', 's', 's', 'a', 'g', 'e', '.', '.', '.' }; const unsigned char sig64[64] = { /* Generated by signing the above message with nonce 'This is the nonce we will use...' * and secret key 0 (which is not valid), resulting in recid 0. */ 0x67, 0xCB, 0x28, 0x5F, 0x9C, 0xD1, 0x94, 0xE8, 0x40, 0xD6, 0x29, 0x39, 0x7A, 0xF5, 0x56, 0x96, 0x62, 0xFD, 0xE4, 0x46, 0x49, 0x99, 0x59, 0x63, 0x17, 0x9A, 0x7D, 0xD1, 0x7B, 0xD2, 0x35, 0x32, 0x4B, 0x1B, 0x7D, 0xF3, 0x4C, 0xE1, 0xF6, 0x8E, 0x69, 0x4F, 0xF6, 0xF1, 0x1A, 0xC7, 0x51, 0xDD, 0x7D, 0xD7, 0x3E, 0x38, 0x7E, 0xE4, 0xFC, 0x86, 0x6E, 0x1B, 0xE8, 0xEC, 0xC7, 0xDD, 0x95, 0x57 }; secp256k1_pubkey pubkey; /* signature (r,s) = (4,4), which can be recovered with all 4 recids. */ const unsigned char sigb64[64] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, }; secp256k1_pubkey pubkeyb; secp256k1_ecdsa_recoverable_signature rsig; secp256k1_ecdsa_signature sig; int recid; CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sig64, 0)); CHECK(!secp256k1_ecdsa_recover(ctx, &pubkey, &rsig, msg32)); CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sig64, 1)); CHECK(secp256k1_ecdsa_recover(ctx, &pubkey, &rsig, msg32)); CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sig64, 2)); CHECK(!secp256k1_ecdsa_recover(ctx, &pubkey, &rsig, msg32)); CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sig64, 3)); CHECK(!secp256k1_ecdsa_recover(ctx, &pubkey, &rsig, msg32)); for (recid = 0; recid < 4; recid++) { int i; int recid2; /* (4,4) encoded in DER. */ unsigned char sigbder[8] = {0x30, 0x06, 0x02, 0x01, 0x04, 0x02, 0x01, 0x04}; unsigned char sigcder_zr[7] = {0x30, 0x05, 0x02, 0x00, 0x02, 0x01, 0x01}; unsigned char sigcder_zs[7] = {0x30, 0x05, 0x02, 0x01, 0x01, 0x02, 0x00}; unsigned char sigbderalt1[39] = { 0x30, 0x25, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x04, }; unsigned char sigbderalt2[39] = { 0x30, 0x25, 0x02, 0x01, 0x04, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, }; unsigned char sigbderalt3[40] = { 0x30, 0x26, 0x02, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x04, }; unsigned char sigbderalt4[40] = { 0x30, 0x26, 0x02, 0x01, 0x04, 0x02, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, }; /* (order + r,4) encoded in DER. */ unsigned char sigbderlong[40] = { 0x30, 0x26, 0x02, 0x21, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBA, 0xAE, 0xDC, 0xE6, 0xAF, 0x48, 0xA0, 0x3B, 0xBF, 0xD2, 0x5E, 0x8C, 0xD0, 0x36, 0x41, 0x45, 0x02, 0x01, 0x04 }; CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigb64, recid) == 1); CHECK(secp256k1_ecdsa_recover(ctx, &pubkeyb, &rsig, msg32) == 1); CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, sizeof(sigbder)) == 1); CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 1); for (recid2 = 0; recid2 < 4; recid2++) { secp256k1_pubkey pubkey2b; CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigb64, recid2) == 1); CHECK(secp256k1_ecdsa_recover(ctx, &pubkey2b, &rsig, msg32) == 1); /* Verifying with (order + r,4) should always fail. */ CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderlong, sizeof(sigbderlong)) == 1); CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0); } /* DER parsing tests. */ /* Zero length r/s. */ CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder_zr, sizeof(sigcder_zr)) == 0); CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder_zs, sizeof(sigcder_zs)) == 0); /* Leading zeros. */ CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt1, sizeof(sigbderalt1)) == 0); CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt2, sizeof(sigbderalt2)) == 0); CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt3, sizeof(sigbderalt3)) == 0); CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt4, sizeof(sigbderalt4)) == 0); sigbderalt3[4] = 1; CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt3, sizeof(sigbderalt3)) == 1); CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0); sigbderalt4[7] = 1; CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt4, sizeof(sigbderalt4)) == 1); CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0); /* Damage signature. */ sigbder[7]++; CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, sizeof(sigbder)) == 1); CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0); sigbder[7]--; CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, 6) == 0); CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, sizeof(sigbder) - 1) == 0); for(i = 0; i < 8; i++) { int c; unsigned char orig = sigbder[i]; /*Try every single-byte change.*/ for (c = 0; c < 256; c++) { if (c == orig ) { continue; } sigbder[i] = c; CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, sizeof(sigbder)) == 0 || secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0); } sigbder[i] = orig; } } /* Test r/s equal to zero */ { /* (1,1) encoded in DER. */ unsigned char sigcder[8] = {0x30, 0x06, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01}; unsigned char sigc64[64] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, }; secp256k1_pubkey pubkeyc; CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigc64, 0) == 1); CHECK(secp256k1_ecdsa_recover(ctx, &pubkeyc, &rsig, msg32) == 1); CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder, sizeof(sigcder)) == 1); CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyc) == 1); sigcder[4] = 0; sigc64[31] = 0; CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigc64, 0) == 1); CHECK(secp256k1_ecdsa_recover(ctx, &pubkeyb, &rsig, msg32) == 0); CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder, sizeof(sigcder)) == 1); CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyc) == 0); sigcder[4] = 1; sigcder[7] = 0; sigc64[31] = 1; sigc64[63] = 0; CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigc64, 0) == 1); CHECK(secp256k1_ecdsa_recover(ctx, &pubkeyb, &rsig, msg32) == 0); CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder, sizeof(sigcder)) == 1); CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyc) == 0); } } void run_recovery_tests(void) { int i; for (i = 0; i < count; i++) { test_ecdsa_recovery_api(); } for (i = 0; i < 64*count; i++) { test_ecdsa_recovery_end_to_end(); } test_ecdsa_recovery_edge_cases(); } #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/num.h ================================================ /********************************************************************** * Copyright (c) 2013, 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_NUM_ #define _SECP256K1_NUM_ #ifndef USE_NUM_NONE #if defined HAVE_CONFIG_H #include "libsecp256k1-config.h" #endif #if defined(USE_NUM_GMP) #include "num_gmp.h" #else #error "Please select num implementation" #endif /** Copy a number. */ static void secp256k1_num_copy(secp256k1_num *r, const secp256k1_num *a); /** Convert a number's absolute value to a binary big-endian string. * There must be enough place. */ static void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num *a); /** Set a number to the value of a binary big-endian string. */ static void secp256k1_num_set_bin(secp256k1_num *r, const unsigned char *a, unsigned int alen); /** Compute a modular inverse. The input must be less than the modulus. */ static void secp256k1_num_mod_inverse(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *m); /** Compute the jacobi symbol (a|b). b must be positive and odd. */ static int secp256k1_num_jacobi(const secp256k1_num *a, const secp256k1_num *b); /** Compare the absolute value of two numbers. */ static int secp256k1_num_cmp(const secp256k1_num *a, const secp256k1_num *b); /** Test whether two number are equal (including sign). */ static int secp256k1_num_eq(const secp256k1_num *a, const secp256k1_num *b); /** Add two (signed) numbers. */ static void secp256k1_num_add(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b); /** Subtract two (signed) numbers. */ static void secp256k1_num_sub(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b); /** Multiply two (signed) numbers. */ static void secp256k1_num_mul(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b); /** Replace a number by its remainder modulo m. M's sign is ignored. The result is a number between 0 and m-1, even if r was negative. */ static void secp256k1_num_mod(secp256k1_num *r, const secp256k1_num *m); /** Right-shift the passed number by bits bits. */ static void secp256k1_num_shift(secp256k1_num *r, int bits); /** Check whether a number is zero. */ static int secp256k1_num_is_zero(const secp256k1_num *a); /** Check whether a number is one. */ static int secp256k1_num_is_one(const secp256k1_num *a); /** Check whether a number is strictly negative. */ static int secp256k1_num_is_neg(const secp256k1_num *a); /** Change a number's sign. */ static void secp256k1_num_negate(secp256k1_num *r); #endif #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/num_gmp.h ================================================ /********************************************************************** * Copyright (c) 2013, 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_NUM_REPR_ #define _SECP256K1_NUM_REPR_ #include #define NUM_LIMBS ((256+GMP_NUMB_BITS-1)/GMP_NUMB_BITS) typedef struct { mp_limb_t data[2*NUM_LIMBS]; int neg; int limbs; } secp256k1_num; #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/num_gmp_impl.h ================================================ /********************************************************************** * Copyright (c) 2013, 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_NUM_REPR_IMPL_H_ #define _SECP256K1_NUM_REPR_IMPL_H_ #include #include #include #include "util.h" #include "num.h" #ifdef VERIFY static void secp256k1_num_sanity(const secp256k1_num *a) { VERIFY_CHECK(a->limbs == 1 || (a->limbs > 1 && a->data[a->limbs-1] != 0)); } #else #define secp256k1_num_sanity(a) do { } while(0) #endif static void secp256k1_num_copy(secp256k1_num *r, const secp256k1_num *a) { *r = *a; } static void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num *a) { unsigned char tmp[65]; int len = 0; int shift = 0; if (a->limbs>1 || a->data[0] != 0) { len = mpn_get_str(tmp, 256, (mp_limb_t*)a->data, a->limbs); } while (shift < len && tmp[shift] == 0) shift++; VERIFY_CHECK(len-shift <= (int)rlen); memset(r, 0, rlen - len + shift); if (len > shift) { memcpy(r + rlen - len + shift, tmp + shift, len - shift); } memset(tmp, 0, sizeof(tmp)); } static void secp256k1_num_set_bin(secp256k1_num *r, const unsigned char *a, unsigned int alen) { int len; VERIFY_CHECK(alen > 0); VERIFY_CHECK(alen <= 64); len = mpn_set_str(r->data, a, alen, 256); if (len == 0) { r->data[0] = 0; len = 1; } VERIFY_CHECK(len <= NUM_LIMBS*2); r->limbs = len; r->neg = 0; while (r->limbs > 1 && r->data[r->limbs-1]==0) { r->limbs--; } } static void secp256k1_num_add_abs(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) { mp_limb_t c = mpn_add(r->data, a->data, a->limbs, b->data, b->limbs); r->limbs = a->limbs; if (c != 0) { VERIFY_CHECK(r->limbs < 2*NUM_LIMBS); r->data[r->limbs++] = c; } } static void secp256k1_num_sub_abs(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) { mp_limb_t c = mpn_sub(r->data, a->data, a->limbs, b->data, b->limbs); (void)c; VERIFY_CHECK(c == 0); r->limbs = a->limbs; while (r->limbs > 1 && r->data[r->limbs-1]==0) { r->limbs--; } } static void secp256k1_num_mod(secp256k1_num *r, const secp256k1_num *m) { secp256k1_num_sanity(r); secp256k1_num_sanity(m); if (r->limbs >= m->limbs) { mp_limb_t t[2*NUM_LIMBS]; mpn_tdiv_qr(t, r->data, 0, r->data, r->limbs, m->data, m->limbs); memset(t, 0, sizeof(t)); r->limbs = m->limbs; while (r->limbs > 1 && r->data[r->limbs-1]==0) { r->limbs--; } } if (r->neg && (r->limbs > 1 || r->data[0] != 0)) { secp256k1_num_sub_abs(r, m, r); r->neg = 0; } } static void secp256k1_num_mod_inverse(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *m) { int i; mp_limb_t g[NUM_LIMBS+1]; mp_limb_t u[NUM_LIMBS+1]; mp_limb_t v[NUM_LIMBS+1]; mp_size_t sn; mp_size_t gn; secp256k1_num_sanity(a); secp256k1_num_sanity(m); /** mpn_gcdext computes: (G,S) = gcdext(U,V), where * * G = gcd(U,V) * * G = U*S + V*T * * U has equal or more limbs than V, and V has no padding * If we set U to be (a padded version of) a, and V = m: * G = a*S + m*T * G = a*S mod m * Assuming G=1: * S = 1/a mod m */ VERIFY_CHECK(m->limbs <= NUM_LIMBS); VERIFY_CHECK(m->data[m->limbs-1] != 0); for (i = 0; i < m->limbs; i++) { u[i] = (i < a->limbs) ? a->data[i] : 0; v[i] = m->data[i]; } sn = NUM_LIMBS+1; gn = mpn_gcdext(g, r->data, &sn, u, m->limbs, v, m->limbs); (void)gn; VERIFY_CHECK(gn == 1); VERIFY_CHECK(g[0] == 1); r->neg = a->neg ^ m->neg; if (sn < 0) { mpn_sub(r->data, m->data, m->limbs, r->data, -sn); r->limbs = m->limbs; while (r->limbs > 1 && r->data[r->limbs-1]==0) { r->limbs--; } } else { r->limbs = sn; } memset(g, 0, sizeof(g)); memset(u, 0, sizeof(u)); memset(v, 0, sizeof(v)); } static int secp256k1_num_jacobi(const secp256k1_num *a, const secp256k1_num *b) { int ret; mpz_t ga, gb; secp256k1_num_sanity(a); secp256k1_num_sanity(b); VERIFY_CHECK(!b->neg && (b->limbs > 0) && (b->data[0] & 1)); mpz_inits(ga, gb, NULL); mpz_import(gb, b->limbs, -1, sizeof(mp_limb_t), 0, 0, b->data); mpz_import(ga, a->limbs, -1, sizeof(mp_limb_t), 0, 0, a->data); if (a->neg) { mpz_neg(ga, ga); } ret = mpz_jacobi(ga, gb); mpz_clears(ga, gb, NULL); return ret; } static int secp256k1_num_is_one(const secp256k1_num *a) { return (a->limbs == 1 && a->data[0] == 1); } static int secp256k1_num_is_zero(const secp256k1_num *a) { return (a->limbs == 1 && a->data[0] == 0); } static int secp256k1_num_is_neg(const secp256k1_num *a) { return (a->limbs > 1 || a->data[0] != 0) && a->neg; } static int secp256k1_num_cmp(const secp256k1_num *a, const secp256k1_num *b) { if (a->limbs > b->limbs) { return 1; } if (a->limbs < b->limbs) { return -1; } return mpn_cmp(a->data, b->data, a->limbs); } static int secp256k1_num_eq(const secp256k1_num *a, const secp256k1_num *b) { if (a->limbs > b->limbs) { return 0; } if (a->limbs < b->limbs) { return 0; } if ((a->neg && !secp256k1_num_is_zero(a)) != (b->neg && !secp256k1_num_is_zero(b))) { return 0; } return mpn_cmp(a->data, b->data, a->limbs) == 0; } static void secp256k1_num_subadd(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b, int bneg) { if (!(b->neg ^ bneg ^ a->neg)) { /* a and b have the same sign */ r->neg = a->neg; if (a->limbs >= b->limbs) { secp256k1_num_add_abs(r, a, b); } else { secp256k1_num_add_abs(r, b, a); } } else { if (secp256k1_num_cmp(a, b) > 0) { r->neg = a->neg; secp256k1_num_sub_abs(r, a, b); } else { r->neg = b->neg ^ bneg; secp256k1_num_sub_abs(r, b, a); } } } static void secp256k1_num_add(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) { secp256k1_num_sanity(a); secp256k1_num_sanity(b); secp256k1_num_subadd(r, a, b, 0); } static void secp256k1_num_sub(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) { secp256k1_num_sanity(a); secp256k1_num_sanity(b); secp256k1_num_subadd(r, a, b, 1); } static void secp256k1_num_mul(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) { mp_limb_t tmp[2*NUM_LIMBS+1]; secp256k1_num_sanity(a); secp256k1_num_sanity(b); VERIFY_CHECK(a->limbs + b->limbs <= 2*NUM_LIMBS+1); if ((a->limbs==1 && a->data[0]==0) || (b->limbs==1 && b->data[0]==0)) { r->limbs = 1; r->neg = 0; r->data[0] = 0; return; } if (a->limbs >= b->limbs) { mpn_mul(tmp, a->data, a->limbs, b->data, b->limbs); } else { mpn_mul(tmp, b->data, b->limbs, a->data, a->limbs); } r->limbs = a->limbs + b->limbs; if (r->limbs > 1 && tmp[r->limbs - 1]==0) { r->limbs--; } VERIFY_CHECK(r->limbs <= 2*NUM_LIMBS); mpn_copyi(r->data, tmp, r->limbs); r->neg = a->neg ^ b->neg; memset(tmp, 0, sizeof(tmp)); } static void secp256k1_num_shift(secp256k1_num *r, int bits) { if (bits % GMP_NUMB_BITS) { /* Shift within limbs. */ mpn_rshift(r->data, r->data, r->limbs, bits % GMP_NUMB_BITS); } if (bits >= GMP_NUMB_BITS) { int i; /* Shift full limbs. */ for (i = 0; i < r->limbs; i++) { int index = i + (bits / GMP_NUMB_BITS); if (index < r->limbs && index < 2*NUM_LIMBS) { r->data[i] = r->data[index]; } else { r->data[i] = 0; } } } while (r->limbs>1 && r->data[r->limbs-1]==0) { r->limbs--; } } static void secp256k1_num_negate(secp256k1_num *r) { r->neg ^= 1; } #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/num_impl.h ================================================ /********************************************************************** * Copyright (c) 2013, 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_NUM_IMPL_H_ #define _SECP256K1_NUM_IMPL_H_ #if defined HAVE_CONFIG_H #include "libsecp256k1-config.h" #endif #include "num.h" #if defined(USE_NUM_GMP) #include "num_gmp_impl.h" #elif defined(USE_NUM_NONE) /* Nothing. */ #else #error "Please select num implementation" #endif #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/scalar.h ================================================ /********************************************************************** * Copyright (c) 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_SCALAR_ #define _SECP256K1_SCALAR_ #include "num.h" #if defined HAVE_CONFIG_H #include "libsecp256k1-config.h" #endif #if defined(EXHAUSTIVE_TEST_ORDER) #include "scalar_low.h" #elif defined(USE_SCALAR_4X64) #include "scalar_4x64.h" #elif defined(USE_SCALAR_8X32) #include "scalar_8x32.h" #else #error "Please select scalar implementation" #endif /** Clear a scalar to prevent the leak of sensitive data. */ static void secp256k1_scalar_clear(secp256k1_scalar *r); /** Access bits from a scalar. All requested bits must belong to the same 32-bit limb. */ static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count); /** Access bits from a scalar. Not constant time. */ static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count); /** Set a scalar from a big endian byte array. */ static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *bin, int *overflow); /** Set a scalar to an unsigned integer. */ static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v); /** Convert a scalar to a byte array. */ static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a); /** Add two scalars together (modulo the group order). Returns whether it overflowed. */ static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b); /** Conditionally add a power of two to a scalar. The result is not allowed to overflow. */ static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag); /** Multiply two scalars (modulo the group order). */ static void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b); /** Shift a scalar right by some amount strictly between 0 and 16, returning * the low bits that were shifted off */ static int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n); /** Compute the square of a scalar (modulo the group order). */ static void secp256k1_scalar_sqr(secp256k1_scalar *r, const secp256k1_scalar *a); /** Compute the inverse of a scalar (modulo the group order). */ static void secp256k1_scalar_inverse(secp256k1_scalar *r, const secp256k1_scalar *a); /** Compute the inverse of a scalar (modulo the group order), without constant-time guarantee. */ static void secp256k1_scalar_inverse_var(secp256k1_scalar *r, const secp256k1_scalar *a); /** Compute the complement of a scalar (modulo the group order). */ static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a); /** Check whether a scalar equals zero. */ static int secp256k1_scalar_is_zero(const secp256k1_scalar *a); /** Check whether a scalar equals one. */ static int secp256k1_scalar_is_one(const secp256k1_scalar *a); /** Check whether a scalar, considered as an nonnegative integer, is even. */ static int secp256k1_scalar_is_even(const secp256k1_scalar *a); /** Check whether a scalar is higher than the group order divided by 2. */ static int secp256k1_scalar_is_high(const secp256k1_scalar *a); /** Conditionally negate a number, in constant time. * Returns -1 if the number was negated, 1 otherwise */ static int secp256k1_scalar_cond_negate(secp256k1_scalar *a, int flag); #ifndef USE_NUM_NONE /** Convert a scalar to a number. */ static void secp256k1_scalar_get_num(secp256k1_num *r, const secp256k1_scalar *a); /** Get the order of the group as a number. */ static void secp256k1_scalar_order_get_num(secp256k1_num *r); #endif /** Compare two scalars. */ static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b); #ifdef USE_ENDOMORPHISM /** Find r1 and r2 such that r1+r2*2^128 = a. */ static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a); /** Find r1 and r2 such that r1+r2*lambda = a, and r1 and r2 are maximum 128 bits long (see secp256k1_gej_mul_lambda). */ static void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a); #endif /** Multiply a and b (without taking the modulus!), divide by 2**shift, and round to the nearest integer. Shift must be at least 256. */ static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b, unsigned int shift); #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/scalar_4x64.h ================================================ /********************************************************************** * Copyright (c) 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_SCALAR_REPR_ #define _SECP256K1_SCALAR_REPR_ #include /** A scalar modulo the group order of the secp256k1 curve. */ typedef struct { uint64_t d[4]; } secp256k1_scalar; #define SECP256K1_SCALAR_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{((uint64_t)(d1)) << 32 | (d0), ((uint64_t)(d3)) << 32 | (d2), ((uint64_t)(d5)) << 32 | (d4), ((uint64_t)(d7)) << 32 | (d6)}} #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/scalar_4x64_impl.h ================================================ /********************************************************************** * Copyright (c) 2013, 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_SCALAR_REPR_IMPL_H_ #define _SECP256K1_SCALAR_REPR_IMPL_H_ /* Limbs of the secp256k1 order. */ #define SECP256K1_N_0 ((uint64_t)0xBFD25E8CD0364141ULL) #define SECP256K1_N_1 ((uint64_t)0xBAAEDCE6AF48A03BULL) #define SECP256K1_N_2 ((uint64_t)0xFFFFFFFFFFFFFFFEULL) #define SECP256K1_N_3 ((uint64_t)0xFFFFFFFFFFFFFFFFULL) /* Limbs of 2^256 minus the secp256k1 order. */ #define SECP256K1_N_C_0 (~SECP256K1_N_0 + 1) #define SECP256K1_N_C_1 (~SECP256K1_N_1) #define SECP256K1_N_C_2 (1) /* Limbs of half the secp256k1 order. */ #define SECP256K1_N_H_0 ((uint64_t)0xDFE92F46681B20A0ULL) #define SECP256K1_N_H_1 ((uint64_t)0x5D576E7357A4501DULL) #define SECP256K1_N_H_2 ((uint64_t)0xFFFFFFFFFFFFFFFFULL) #define SECP256K1_N_H_3 ((uint64_t)0x7FFFFFFFFFFFFFFFULL) SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar *r) { r->d[0] = 0; r->d[1] = 0; r->d[2] = 0; r->d[3] = 0; } SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v) { r->d[0] = v; r->d[1] = 0; r->d[2] = 0; r->d[3] = 0; } SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count) { VERIFY_CHECK((offset + count - 1) >> 6 == offset >> 6); return (a->d[offset >> 6] >> (offset & 0x3F)) & ((((uint64_t)1) << count) - 1); } SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count) { VERIFY_CHECK(count < 32); VERIFY_CHECK(offset + count <= 256); if ((offset + count - 1) >> 6 == offset >> 6) { return secp256k1_scalar_get_bits(a, offset, count); } else { VERIFY_CHECK((offset >> 6) + 1 < 4); return ((a->d[offset >> 6] >> (offset & 0x3F)) | (a->d[(offset >> 6) + 1] << (64 - (offset & 0x3F)))) & ((((uint64_t)1) << count) - 1); } } SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar *a) { int yes = 0; int no = 0; no |= (a->d[3] < SECP256K1_N_3); /* No need for a > check. */ no |= (a->d[2] < SECP256K1_N_2); yes |= (a->d[2] > SECP256K1_N_2) & ~no; no |= (a->d[1] < SECP256K1_N_1); yes |= (a->d[1] > SECP256K1_N_1) & ~no; yes |= (a->d[0] >= SECP256K1_N_0) & ~no; return yes; } SECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar *r, unsigned int overflow) { uint128_t t; VERIFY_CHECK(overflow <= 1); t = (uint128_t)r->d[0] + overflow * SECP256K1_N_C_0; r->d[0] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; t += (uint128_t)r->d[1] + overflow * SECP256K1_N_C_1; r->d[1] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; t += (uint128_t)r->d[2] + overflow * SECP256K1_N_C_2; r->d[2] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; t += (uint64_t)r->d[3]; r->d[3] = t & 0xFFFFFFFFFFFFFFFFULL; return overflow; } static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) { int overflow; uint128_t t = (uint128_t)a->d[0] + b->d[0]; r->d[0] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; t += (uint128_t)a->d[1] + b->d[1]; r->d[1] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; t += (uint128_t)a->d[2] + b->d[2]; r->d[2] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; t += (uint128_t)a->d[3] + b->d[3]; r->d[3] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; overflow = t + secp256k1_scalar_check_overflow(r); VERIFY_CHECK(overflow == 0 || overflow == 1); secp256k1_scalar_reduce(r, overflow); return overflow; } static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag) { uint128_t t; VERIFY_CHECK(bit < 256); bit += ((uint32_t) flag - 1) & 0x100; /* forcing (bit >> 6) > 3 makes this a noop */ t = (uint128_t)r->d[0] + (((uint64_t)((bit >> 6) == 0)) << (bit & 0x3F)); r->d[0] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; t += (uint128_t)r->d[1] + (((uint64_t)((bit >> 6) == 1)) << (bit & 0x3F)); r->d[1] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; t += (uint128_t)r->d[2] + (((uint64_t)((bit >> 6) == 2)) << (bit & 0x3F)); r->d[2] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; t += (uint128_t)r->d[3] + (((uint64_t)((bit >> 6) == 3)) << (bit & 0x3F)); r->d[3] = t & 0xFFFFFFFFFFFFFFFFULL; #ifdef VERIFY VERIFY_CHECK((t >> 64) == 0); VERIFY_CHECK(secp256k1_scalar_check_overflow(r) == 0); #endif } static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b32, int *overflow) { int over; r->d[0] = (uint64_t)b32[31] | (uint64_t)b32[30] << 8 | (uint64_t)b32[29] << 16 | (uint64_t)b32[28] << 24 | (uint64_t)b32[27] << 32 | (uint64_t)b32[26] << 40 | (uint64_t)b32[25] << 48 | (uint64_t)b32[24] << 56; r->d[1] = (uint64_t)b32[23] | (uint64_t)b32[22] << 8 | (uint64_t)b32[21] << 16 | (uint64_t)b32[20] << 24 | (uint64_t)b32[19] << 32 | (uint64_t)b32[18] << 40 | (uint64_t)b32[17] << 48 | (uint64_t)b32[16] << 56; r->d[2] = (uint64_t)b32[15] | (uint64_t)b32[14] << 8 | (uint64_t)b32[13] << 16 | (uint64_t)b32[12] << 24 | (uint64_t)b32[11] << 32 | (uint64_t)b32[10] << 40 | (uint64_t)b32[9] << 48 | (uint64_t)b32[8] << 56; r->d[3] = (uint64_t)b32[7] | (uint64_t)b32[6] << 8 | (uint64_t)b32[5] << 16 | (uint64_t)b32[4] << 24 | (uint64_t)b32[3] << 32 | (uint64_t)b32[2] << 40 | (uint64_t)b32[1] << 48 | (uint64_t)b32[0] << 56; over = secp256k1_scalar_reduce(r, secp256k1_scalar_check_overflow(r)); if (overflow) { *overflow = over; } } static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a) { bin[0] = a->d[3] >> 56; bin[1] = a->d[3] >> 48; bin[2] = a->d[3] >> 40; bin[3] = a->d[3] >> 32; bin[4] = a->d[3] >> 24; bin[5] = a->d[3] >> 16; bin[6] = a->d[3] >> 8; bin[7] = a->d[3]; bin[8] = a->d[2] >> 56; bin[9] = a->d[2] >> 48; bin[10] = a->d[2] >> 40; bin[11] = a->d[2] >> 32; bin[12] = a->d[2] >> 24; bin[13] = a->d[2] >> 16; bin[14] = a->d[2] >> 8; bin[15] = a->d[2]; bin[16] = a->d[1] >> 56; bin[17] = a->d[1] >> 48; bin[18] = a->d[1] >> 40; bin[19] = a->d[1] >> 32; bin[20] = a->d[1] >> 24; bin[21] = a->d[1] >> 16; bin[22] = a->d[1] >> 8; bin[23] = a->d[1]; bin[24] = a->d[0] >> 56; bin[25] = a->d[0] >> 48; bin[26] = a->d[0] >> 40; bin[27] = a->d[0] >> 32; bin[28] = a->d[0] >> 24; bin[29] = a->d[0] >> 16; bin[30] = a->d[0] >> 8; bin[31] = a->d[0]; } SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar *a) { return (a->d[0] | a->d[1] | a->d[2] | a->d[3]) == 0; } static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a) { uint64_t nonzero = 0xFFFFFFFFFFFFFFFFULL * (secp256k1_scalar_is_zero(a) == 0); uint128_t t = (uint128_t)(~a->d[0]) + SECP256K1_N_0 + 1; r->d[0] = t & nonzero; t >>= 64; t += (uint128_t)(~a->d[1]) + SECP256K1_N_1; r->d[1] = t & nonzero; t >>= 64; t += (uint128_t)(~a->d[2]) + SECP256K1_N_2; r->d[2] = t & nonzero; t >>= 64; t += (uint128_t)(~a->d[3]) + SECP256K1_N_3; r->d[3] = t & nonzero; } SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar *a) { return ((a->d[0] ^ 1) | a->d[1] | a->d[2] | a->d[3]) == 0; } static int secp256k1_scalar_is_high(const secp256k1_scalar *a) { int yes = 0; int no = 0; no |= (a->d[3] < SECP256K1_N_H_3); yes |= (a->d[3] > SECP256K1_N_H_3) & ~no; no |= (a->d[2] < SECP256K1_N_H_2) & ~yes; /* No need for a > check. */ no |= (a->d[1] < SECP256K1_N_H_1) & ~yes; yes |= (a->d[1] > SECP256K1_N_H_1) & ~no; yes |= (a->d[0] > SECP256K1_N_H_0) & ~no; return yes; } static int secp256k1_scalar_cond_negate(secp256k1_scalar *r, int flag) { /* If we are flag = 0, mask = 00...00 and this is a no-op; * if we are flag = 1, mask = 11...11 and this is identical to secp256k1_scalar_negate */ uint64_t mask = !flag - 1; uint64_t nonzero = (secp256k1_scalar_is_zero(r) != 0) - 1; uint128_t t = (uint128_t)(r->d[0] ^ mask) + ((SECP256K1_N_0 + 1) & mask); r->d[0] = t & nonzero; t >>= 64; t += (uint128_t)(r->d[1] ^ mask) + (SECP256K1_N_1 & mask); r->d[1] = t & nonzero; t >>= 64; t += (uint128_t)(r->d[2] ^ mask) + (SECP256K1_N_2 & mask); r->d[2] = t & nonzero; t >>= 64; t += (uint128_t)(r->d[3] ^ mask) + (SECP256K1_N_3 & mask); r->d[3] = t & nonzero; return 2 * (mask == 0) - 1; } /* Inspired by the macros in OpenSSL's crypto/bn/asm/x86_64-gcc.c. */ /** Add a*b to the number defined by (c0,c1,c2). c2 must never overflow. */ #define muladd(a,b) { \ uint64_t tl, th; \ { \ uint128_t t = (uint128_t)a * b; \ th = t >> 64; /* at most 0xFFFFFFFFFFFFFFFE */ \ tl = t; \ } \ c0 += tl; /* overflow is handled on the next line */ \ th += (c0 < tl) ? 1 : 0; /* at most 0xFFFFFFFFFFFFFFFF */ \ c1 += th; /* overflow is handled on the next line */ \ c2 += (c1 < th) ? 1 : 0; /* never overflows by contract (verified in the next line) */ \ VERIFY_CHECK((c1 >= th) || (c2 != 0)); \ } /** Add a*b to the number defined by (c0,c1). c1 must never overflow. */ #define muladd_fast(a,b) { \ uint64_t tl, th; \ { \ uint128_t t = (uint128_t)a * b; \ th = t >> 64; /* at most 0xFFFFFFFFFFFFFFFE */ \ tl = t; \ } \ c0 += tl; /* overflow is handled on the next line */ \ th += (c0 < tl) ? 1 : 0; /* at most 0xFFFFFFFFFFFFFFFF */ \ c1 += th; /* never overflows by contract (verified in the next line) */ \ VERIFY_CHECK(c1 >= th); \ } /** Add 2*a*b to the number defined by (c0,c1,c2). c2 must never overflow. */ #define muladd2(a,b) { \ uint64_t tl, th, th2, tl2; \ { \ uint128_t t = (uint128_t)a * b; \ th = t >> 64; /* at most 0xFFFFFFFFFFFFFFFE */ \ tl = t; \ } \ th2 = th + th; /* at most 0xFFFFFFFFFFFFFFFE (in case th was 0x7FFFFFFFFFFFFFFF) */ \ c2 += (th2 < th) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ VERIFY_CHECK((th2 >= th) || (c2 != 0)); \ tl2 = tl + tl; /* at most 0xFFFFFFFFFFFFFFFE (in case the lowest 63 bits of tl were 0x7FFFFFFFFFFFFFFF) */ \ th2 += (tl2 < tl) ? 1 : 0; /* at most 0xFFFFFFFFFFFFFFFF */ \ c0 += tl2; /* overflow is handled on the next line */ \ th2 += (c0 < tl2) ? 1 : 0; /* second overflow is handled on the next line */ \ c2 += (c0 < tl2) & (th2 == 0); /* never overflows by contract (verified the next line) */ \ VERIFY_CHECK((c0 >= tl2) || (th2 != 0) || (c2 != 0)); \ c1 += th2; /* overflow is handled on the next line */ \ c2 += (c1 < th2) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ VERIFY_CHECK((c1 >= th2) || (c2 != 0)); \ } /** Add a to the number defined by (c0,c1,c2). c2 must never overflow. */ #define sumadd(a) { \ unsigned int over; \ c0 += (a); /* overflow is handled on the next line */ \ over = (c0 < (a)) ? 1 : 0; \ c1 += over; /* overflow is handled on the next line */ \ c2 += (c1 < over) ? 1 : 0; /* never overflows by contract */ \ } /** Add a to the number defined by (c0,c1). c1 must never overflow, c2 must be zero. */ #define sumadd_fast(a) { \ c0 += (a); /* overflow is handled on the next line */ \ c1 += (c0 < (a)) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ VERIFY_CHECK((c1 != 0) | (c0 >= (a))); \ VERIFY_CHECK(c2 == 0); \ } /** Extract the lowest 64 bits of (c0,c1,c2) into n, and left shift the number 64 bits. */ #define extract(n) { \ (n) = c0; \ c0 = c1; \ c1 = c2; \ c2 = 0; \ } /** Extract the lowest 64 bits of (c0,c1,c2) into n, and left shift the number 64 bits. c2 is required to be zero. */ #define extract_fast(n) { \ (n) = c0; \ c0 = c1; \ c1 = 0; \ VERIFY_CHECK(c2 == 0); \ } static void secp256k1_scalar_reduce_512(secp256k1_scalar *r, const uint64_t *l) { #ifdef USE_ASM_X86_64 /* Reduce 512 bits into 385. */ uint64_t m0, m1, m2, m3, m4, m5, m6; uint64_t p0, p1, p2, p3, p4; uint64_t c; __asm__ __volatile__( /* Preload. */ "movq 32(%%rsi), %%r11\n" "movq 40(%%rsi), %%r12\n" "movq 48(%%rsi), %%r13\n" "movq 56(%%rsi), %%r14\n" /* Initialize r8,r9,r10 */ "movq 0(%%rsi), %%r8\n" "xorq %%r9, %%r9\n" "xorq %%r10, %%r10\n" /* (r8,r9) += n0 * c0 */ "movq %8, %%rax\n" "mulq %%r11\n" "addq %%rax, %%r8\n" "adcq %%rdx, %%r9\n" /* extract m0 */ "movq %%r8, %q0\n" "xorq %%r8, %%r8\n" /* (r9,r10) += l1 */ "addq 8(%%rsi), %%r9\n" "adcq $0, %%r10\n" /* (r9,r10,r8) += n1 * c0 */ "movq %8, %%rax\n" "mulq %%r12\n" "addq %%rax, %%r9\n" "adcq %%rdx, %%r10\n" "adcq $0, %%r8\n" /* (r9,r10,r8) += n0 * c1 */ "movq %9, %%rax\n" "mulq %%r11\n" "addq %%rax, %%r9\n" "adcq %%rdx, %%r10\n" "adcq $0, %%r8\n" /* extract m1 */ "movq %%r9, %q1\n" "xorq %%r9, %%r9\n" /* (r10,r8,r9) += l2 */ "addq 16(%%rsi), %%r10\n" "adcq $0, %%r8\n" "adcq $0, %%r9\n" /* (r10,r8,r9) += n2 * c0 */ "movq %8, %%rax\n" "mulq %%r13\n" "addq %%rax, %%r10\n" "adcq %%rdx, %%r8\n" "adcq $0, %%r9\n" /* (r10,r8,r9) += n1 * c1 */ "movq %9, %%rax\n" "mulq %%r12\n" "addq %%rax, %%r10\n" "adcq %%rdx, %%r8\n" "adcq $0, %%r9\n" /* (r10,r8,r9) += n0 */ "addq %%r11, %%r10\n" "adcq $0, %%r8\n" "adcq $0, %%r9\n" /* extract m2 */ "movq %%r10, %q2\n" "xorq %%r10, %%r10\n" /* (r8,r9,r10) += l3 */ "addq 24(%%rsi), %%r8\n" "adcq $0, %%r9\n" "adcq $0, %%r10\n" /* (r8,r9,r10) += n3 * c0 */ "movq %8, %%rax\n" "mulq %%r14\n" "addq %%rax, %%r8\n" "adcq %%rdx, %%r9\n" "adcq $0, %%r10\n" /* (r8,r9,r10) += n2 * c1 */ "movq %9, %%rax\n" "mulq %%r13\n" "addq %%rax, %%r8\n" "adcq %%rdx, %%r9\n" "adcq $0, %%r10\n" /* (r8,r9,r10) += n1 */ "addq %%r12, %%r8\n" "adcq $0, %%r9\n" "adcq $0, %%r10\n" /* extract m3 */ "movq %%r8, %q3\n" "xorq %%r8, %%r8\n" /* (r9,r10,r8) += n3 * c1 */ "movq %9, %%rax\n" "mulq %%r14\n" "addq %%rax, %%r9\n" "adcq %%rdx, %%r10\n" "adcq $0, %%r8\n" /* (r9,r10,r8) += n2 */ "addq %%r13, %%r9\n" "adcq $0, %%r10\n" "adcq $0, %%r8\n" /* extract m4 */ "movq %%r9, %q4\n" /* (r10,r8) += n3 */ "addq %%r14, %%r10\n" "adcq $0, %%r8\n" /* extract m5 */ "movq %%r10, %q5\n" /* extract m6 */ "movq %%r8, %q6\n" : "=g"(m0), "=g"(m1), "=g"(m2), "=g"(m3), "=g"(m4), "=g"(m5), "=g"(m6) : "S"(l), "n"(SECP256K1_N_C_0), "n"(SECP256K1_N_C_1) : "rax", "rdx", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "cc"); /* Reduce 385 bits into 258. */ __asm__ __volatile__( /* Preload */ "movq %q9, %%r11\n" "movq %q10, %%r12\n" "movq %q11, %%r13\n" /* Initialize (r8,r9,r10) */ "movq %q5, %%r8\n" "xorq %%r9, %%r9\n" "xorq %%r10, %%r10\n" /* (r8,r9) += m4 * c0 */ "movq %12, %%rax\n" "mulq %%r11\n" "addq %%rax, %%r8\n" "adcq %%rdx, %%r9\n" /* extract p0 */ "movq %%r8, %q0\n" "xorq %%r8, %%r8\n" /* (r9,r10) += m1 */ "addq %q6, %%r9\n" "adcq $0, %%r10\n" /* (r9,r10,r8) += m5 * c0 */ "movq %12, %%rax\n" "mulq %%r12\n" "addq %%rax, %%r9\n" "adcq %%rdx, %%r10\n" "adcq $0, %%r8\n" /* (r9,r10,r8) += m4 * c1 */ "movq %13, %%rax\n" "mulq %%r11\n" "addq %%rax, %%r9\n" "adcq %%rdx, %%r10\n" "adcq $0, %%r8\n" /* extract p1 */ "movq %%r9, %q1\n" "xorq %%r9, %%r9\n" /* (r10,r8,r9) += m2 */ "addq %q7, %%r10\n" "adcq $0, %%r8\n" "adcq $0, %%r9\n" /* (r10,r8,r9) += m6 * c0 */ "movq %12, %%rax\n" "mulq %%r13\n" "addq %%rax, %%r10\n" "adcq %%rdx, %%r8\n" "adcq $0, %%r9\n" /* (r10,r8,r9) += m5 * c1 */ "movq %13, %%rax\n" "mulq %%r12\n" "addq %%rax, %%r10\n" "adcq %%rdx, %%r8\n" "adcq $0, %%r9\n" /* (r10,r8,r9) += m4 */ "addq %%r11, %%r10\n" "adcq $0, %%r8\n" "adcq $0, %%r9\n" /* extract p2 */ "movq %%r10, %q2\n" /* (r8,r9) += m3 */ "addq %q8, %%r8\n" "adcq $0, %%r9\n" /* (r8,r9) += m6 * c1 */ "movq %13, %%rax\n" "mulq %%r13\n" "addq %%rax, %%r8\n" "adcq %%rdx, %%r9\n" /* (r8,r9) += m5 */ "addq %%r12, %%r8\n" "adcq $0, %%r9\n" /* extract p3 */ "movq %%r8, %q3\n" /* (r9) += m6 */ "addq %%r13, %%r9\n" /* extract p4 */ "movq %%r9, %q4\n" : "=&g"(p0), "=&g"(p1), "=&g"(p2), "=g"(p3), "=g"(p4) : "g"(m0), "g"(m1), "g"(m2), "g"(m3), "g"(m4), "g"(m5), "g"(m6), "n"(SECP256K1_N_C_0), "n"(SECP256K1_N_C_1) : "rax", "rdx", "r8", "r9", "r10", "r11", "r12", "r13", "cc"); /* Reduce 258 bits into 256. */ __asm__ __volatile__( /* Preload */ "movq %q5, %%r10\n" /* (rax,rdx) = p4 * c0 */ "movq %7, %%rax\n" "mulq %%r10\n" /* (rax,rdx) += p0 */ "addq %q1, %%rax\n" "adcq $0, %%rdx\n" /* extract r0 */ "movq %%rax, 0(%q6)\n" /* Move to (r8,r9) */ "movq %%rdx, %%r8\n" "xorq %%r9, %%r9\n" /* (r8,r9) += p1 */ "addq %q2, %%r8\n" "adcq $0, %%r9\n" /* (r8,r9) += p4 * c1 */ "movq %8, %%rax\n" "mulq %%r10\n" "addq %%rax, %%r8\n" "adcq %%rdx, %%r9\n" /* Extract r1 */ "movq %%r8, 8(%q6)\n" "xorq %%r8, %%r8\n" /* (r9,r8) += p4 */ "addq %%r10, %%r9\n" "adcq $0, %%r8\n" /* (r9,r8) += p2 */ "addq %q3, %%r9\n" "adcq $0, %%r8\n" /* Extract r2 */ "movq %%r9, 16(%q6)\n" "xorq %%r9, %%r9\n" /* (r8,r9) += p3 */ "addq %q4, %%r8\n" "adcq $0, %%r9\n" /* Extract r3 */ "movq %%r8, 24(%q6)\n" /* Extract c */ "movq %%r9, %q0\n" : "=g"(c) : "g"(p0), "g"(p1), "g"(p2), "g"(p3), "g"(p4), "D"(r), "n"(SECP256K1_N_C_0), "n"(SECP256K1_N_C_1) : "rax", "rdx", "r8", "r9", "r10", "cc", "memory"); #else uint128_t c; uint64_t c0, c1, c2; uint64_t n0 = l[4], n1 = l[5], n2 = l[6], n3 = l[7]; uint64_t m0, m1, m2, m3, m4, m5; uint32_t m6; uint64_t p0, p1, p2, p3; uint32_t p4; /* Reduce 512 bits into 385. */ /* m[0..6] = l[0..3] + n[0..3] * SECP256K1_N_C. */ c0 = l[0]; c1 = 0; c2 = 0; muladd_fast(n0, SECP256K1_N_C_0); extract_fast(m0); sumadd_fast(l[1]); muladd(n1, SECP256K1_N_C_0); muladd(n0, SECP256K1_N_C_1); extract(m1); sumadd(l[2]); muladd(n2, SECP256K1_N_C_0); muladd(n1, SECP256K1_N_C_1); sumadd(n0); extract(m2); sumadd(l[3]); muladd(n3, SECP256K1_N_C_0); muladd(n2, SECP256K1_N_C_1); sumadd(n1); extract(m3); muladd(n3, SECP256K1_N_C_1); sumadd(n2); extract(m4); sumadd_fast(n3); extract_fast(m5); VERIFY_CHECK(c0 <= 1); m6 = c0; /* Reduce 385 bits into 258. */ /* p[0..4] = m[0..3] + m[4..6] * SECP256K1_N_C. */ c0 = m0; c1 = 0; c2 = 0; muladd_fast(m4, SECP256K1_N_C_0); extract_fast(p0); sumadd_fast(m1); muladd(m5, SECP256K1_N_C_0); muladd(m4, SECP256K1_N_C_1); extract(p1); sumadd(m2); muladd(m6, SECP256K1_N_C_0); muladd(m5, SECP256K1_N_C_1); sumadd(m4); extract(p2); sumadd_fast(m3); muladd_fast(m6, SECP256K1_N_C_1); sumadd_fast(m5); extract_fast(p3); p4 = c0 + m6; VERIFY_CHECK(p4 <= 2); /* Reduce 258 bits into 256. */ /* r[0..3] = p[0..3] + p[4] * SECP256K1_N_C. */ c = p0 + (uint128_t)SECP256K1_N_C_0 * p4; r->d[0] = c & 0xFFFFFFFFFFFFFFFFULL; c >>= 64; c += p1 + (uint128_t)SECP256K1_N_C_1 * p4; r->d[1] = c & 0xFFFFFFFFFFFFFFFFULL; c >>= 64; c += p2 + (uint128_t)p4; r->d[2] = c & 0xFFFFFFFFFFFFFFFFULL; c >>= 64; c += p3; r->d[3] = c & 0xFFFFFFFFFFFFFFFFULL; c >>= 64; #endif /* Final reduction of r. */ secp256k1_scalar_reduce(r, c + secp256k1_scalar_check_overflow(r)); } static void secp256k1_scalar_mul_512(uint64_t l[8], const secp256k1_scalar *a, const secp256k1_scalar *b) { #ifdef USE_ASM_X86_64 const uint64_t *pb = b->d; __asm__ __volatile__( /* Preload */ "movq 0(%%rdi), %%r15\n" "movq 8(%%rdi), %%rbx\n" "movq 16(%%rdi), %%rcx\n" "movq 0(%%rdx), %%r11\n" "movq 8(%%rdx), %%r12\n" "movq 16(%%rdx), %%r13\n" "movq 24(%%rdx), %%r14\n" /* (rax,rdx) = a0 * b0 */ "movq %%r15, %%rax\n" "mulq %%r11\n" /* Extract l0 */ "movq %%rax, 0(%%rsi)\n" /* (r8,r9,r10) = (rdx) */ "movq %%rdx, %%r8\n" "xorq %%r9, %%r9\n" "xorq %%r10, %%r10\n" /* (r8,r9,r10) += a0 * b1 */ "movq %%r15, %%rax\n" "mulq %%r12\n" "addq %%rax, %%r8\n" "adcq %%rdx, %%r9\n" "adcq $0, %%r10\n" /* (r8,r9,r10) += a1 * b0 */ "movq %%rbx, %%rax\n" "mulq %%r11\n" "addq %%rax, %%r8\n" "adcq %%rdx, %%r9\n" "adcq $0, %%r10\n" /* Extract l1 */ "movq %%r8, 8(%%rsi)\n" "xorq %%r8, %%r8\n" /* (r9,r10,r8) += a0 * b2 */ "movq %%r15, %%rax\n" "mulq %%r13\n" "addq %%rax, %%r9\n" "adcq %%rdx, %%r10\n" "adcq $0, %%r8\n" /* (r9,r10,r8) += a1 * b1 */ "movq %%rbx, %%rax\n" "mulq %%r12\n" "addq %%rax, %%r9\n" "adcq %%rdx, %%r10\n" "adcq $0, %%r8\n" /* (r9,r10,r8) += a2 * b0 */ "movq %%rcx, %%rax\n" "mulq %%r11\n" "addq %%rax, %%r9\n" "adcq %%rdx, %%r10\n" "adcq $0, %%r8\n" /* Extract l2 */ "movq %%r9, 16(%%rsi)\n" "xorq %%r9, %%r9\n" /* (r10,r8,r9) += a0 * b3 */ "movq %%r15, %%rax\n" "mulq %%r14\n" "addq %%rax, %%r10\n" "adcq %%rdx, %%r8\n" "adcq $0, %%r9\n" /* Preload a3 */ "movq 24(%%rdi), %%r15\n" /* (r10,r8,r9) += a1 * b2 */ "movq %%rbx, %%rax\n" "mulq %%r13\n" "addq %%rax, %%r10\n" "adcq %%rdx, %%r8\n" "adcq $0, %%r9\n" /* (r10,r8,r9) += a2 * b1 */ "movq %%rcx, %%rax\n" "mulq %%r12\n" "addq %%rax, %%r10\n" "adcq %%rdx, %%r8\n" "adcq $0, %%r9\n" /* (r10,r8,r9) += a3 * b0 */ "movq %%r15, %%rax\n" "mulq %%r11\n" "addq %%rax, %%r10\n" "adcq %%rdx, %%r8\n" "adcq $0, %%r9\n" /* Extract l3 */ "movq %%r10, 24(%%rsi)\n" "xorq %%r10, %%r10\n" /* (r8,r9,r10) += a1 * b3 */ "movq %%rbx, %%rax\n" "mulq %%r14\n" "addq %%rax, %%r8\n" "adcq %%rdx, %%r9\n" "adcq $0, %%r10\n" /* (r8,r9,r10) += a2 * b2 */ "movq %%rcx, %%rax\n" "mulq %%r13\n" "addq %%rax, %%r8\n" "adcq %%rdx, %%r9\n" "adcq $0, %%r10\n" /* (r8,r9,r10) += a3 * b1 */ "movq %%r15, %%rax\n" "mulq %%r12\n" "addq %%rax, %%r8\n" "adcq %%rdx, %%r9\n" "adcq $0, %%r10\n" /* Extract l4 */ "movq %%r8, 32(%%rsi)\n" "xorq %%r8, %%r8\n" /* (r9,r10,r8) += a2 * b3 */ "movq %%rcx, %%rax\n" "mulq %%r14\n" "addq %%rax, %%r9\n" "adcq %%rdx, %%r10\n" "adcq $0, %%r8\n" /* (r9,r10,r8) += a3 * b2 */ "movq %%r15, %%rax\n" "mulq %%r13\n" "addq %%rax, %%r9\n" "adcq %%rdx, %%r10\n" "adcq $0, %%r8\n" /* Extract l5 */ "movq %%r9, 40(%%rsi)\n" /* (r10,r8) += a3 * b3 */ "movq %%r15, %%rax\n" "mulq %%r14\n" "addq %%rax, %%r10\n" "adcq %%rdx, %%r8\n" /* Extract l6 */ "movq %%r10, 48(%%rsi)\n" /* Extract l7 */ "movq %%r8, 56(%%rsi)\n" : "+d"(pb) : "S"(l), "D"(a->d) : "rax", "rbx", "rcx", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "cc", "memory"); #else /* 160 bit accumulator. */ uint64_t c0 = 0, c1 = 0; uint32_t c2 = 0; /* l[0..7] = a[0..3] * b[0..3]. */ muladd_fast(a->d[0], b->d[0]); extract_fast(l[0]); muladd(a->d[0], b->d[1]); muladd(a->d[1], b->d[0]); extract(l[1]); muladd(a->d[0], b->d[2]); muladd(a->d[1], b->d[1]); muladd(a->d[2], b->d[0]); extract(l[2]); muladd(a->d[0], b->d[3]); muladd(a->d[1], b->d[2]); muladd(a->d[2], b->d[1]); muladd(a->d[3], b->d[0]); extract(l[3]); muladd(a->d[1], b->d[3]); muladd(a->d[2], b->d[2]); muladd(a->d[3], b->d[1]); extract(l[4]); muladd(a->d[2], b->d[3]); muladd(a->d[3], b->d[2]); extract(l[5]); muladd_fast(a->d[3], b->d[3]); extract_fast(l[6]); VERIFY_CHECK(c1 == 0); l[7] = c0; #endif } static void secp256k1_scalar_sqr_512(uint64_t l[8], const secp256k1_scalar *a) { #ifdef USE_ASM_X86_64 __asm__ __volatile__( /* Preload */ "movq 0(%%rdi), %%r11\n" "movq 8(%%rdi), %%r12\n" "movq 16(%%rdi), %%r13\n" "movq 24(%%rdi), %%r14\n" /* (rax,rdx) = a0 * a0 */ "movq %%r11, %%rax\n" "mulq %%r11\n" /* Extract l0 */ "movq %%rax, 0(%%rsi)\n" /* (r8,r9,r10) = (rdx,0) */ "movq %%rdx, %%r8\n" "xorq %%r9, %%r9\n" "xorq %%r10, %%r10\n" /* (r8,r9,r10) += 2 * a0 * a1 */ "movq %%r11, %%rax\n" "mulq %%r12\n" "addq %%rax, %%r8\n" "adcq %%rdx, %%r9\n" "adcq $0, %%r10\n" "addq %%rax, %%r8\n" "adcq %%rdx, %%r9\n" "adcq $0, %%r10\n" /* Extract l1 */ "movq %%r8, 8(%%rsi)\n" "xorq %%r8, %%r8\n" /* (r9,r10,r8) += 2 * a0 * a2 */ "movq %%r11, %%rax\n" "mulq %%r13\n" "addq %%rax, %%r9\n" "adcq %%rdx, %%r10\n" "adcq $0, %%r8\n" "addq %%rax, %%r9\n" "adcq %%rdx, %%r10\n" "adcq $0, %%r8\n" /* (r9,r10,r8) += a1 * a1 */ "movq %%r12, %%rax\n" "mulq %%r12\n" "addq %%rax, %%r9\n" "adcq %%rdx, %%r10\n" "adcq $0, %%r8\n" /* Extract l2 */ "movq %%r9, 16(%%rsi)\n" "xorq %%r9, %%r9\n" /* (r10,r8,r9) += 2 * a0 * a3 */ "movq %%r11, %%rax\n" "mulq %%r14\n" "addq %%rax, %%r10\n" "adcq %%rdx, %%r8\n" "adcq $0, %%r9\n" "addq %%rax, %%r10\n" "adcq %%rdx, %%r8\n" "adcq $0, %%r9\n" /* (r10,r8,r9) += 2 * a1 * a2 */ "movq %%r12, %%rax\n" "mulq %%r13\n" "addq %%rax, %%r10\n" "adcq %%rdx, %%r8\n" "adcq $0, %%r9\n" "addq %%rax, %%r10\n" "adcq %%rdx, %%r8\n" "adcq $0, %%r9\n" /* Extract l3 */ "movq %%r10, 24(%%rsi)\n" "xorq %%r10, %%r10\n" /* (r8,r9,r10) += 2 * a1 * a3 */ "movq %%r12, %%rax\n" "mulq %%r14\n" "addq %%rax, %%r8\n" "adcq %%rdx, %%r9\n" "adcq $0, %%r10\n" "addq %%rax, %%r8\n" "adcq %%rdx, %%r9\n" "adcq $0, %%r10\n" /* (r8,r9,r10) += a2 * a2 */ "movq %%r13, %%rax\n" "mulq %%r13\n" "addq %%rax, %%r8\n" "adcq %%rdx, %%r9\n" "adcq $0, %%r10\n" /* Extract l4 */ "movq %%r8, 32(%%rsi)\n" "xorq %%r8, %%r8\n" /* (r9,r10,r8) += 2 * a2 * a3 */ "movq %%r13, %%rax\n" "mulq %%r14\n" "addq %%rax, %%r9\n" "adcq %%rdx, %%r10\n" "adcq $0, %%r8\n" "addq %%rax, %%r9\n" "adcq %%rdx, %%r10\n" "adcq $0, %%r8\n" /* Extract l5 */ "movq %%r9, 40(%%rsi)\n" /* (r10,r8) += a3 * a3 */ "movq %%r14, %%rax\n" "mulq %%r14\n" "addq %%rax, %%r10\n" "adcq %%rdx, %%r8\n" /* Extract l6 */ "movq %%r10, 48(%%rsi)\n" /* Extract l7 */ "movq %%r8, 56(%%rsi)\n" : : "S"(l), "D"(a->d) : "rax", "rdx", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "cc", "memory"); #else /* 160 bit accumulator. */ uint64_t c0 = 0, c1 = 0; uint32_t c2 = 0; /* l[0..7] = a[0..3] * b[0..3]. */ muladd_fast(a->d[0], a->d[0]); extract_fast(l[0]); muladd2(a->d[0], a->d[1]); extract(l[1]); muladd2(a->d[0], a->d[2]); muladd(a->d[1], a->d[1]); extract(l[2]); muladd2(a->d[0], a->d[3]); muladd2(a->d[1], a->d[2]); extract(l[3]); muladd2(a->d[1], a->d[3]); muladd(a->d[2], a->d[2]); extract(l[4]); muladd2(a->d[2], a->d[3]); extract(l[5]); muladd_fast(a->d[3], a->d[3]); extract_fast(l[6]); VERIFY_CHECK(c1 == 0); l[7] = c0; #endif } #undef sumadd #undef sumadd_fast #undef muladd #undef muladd_fast #undef muladd2 #undef extract #undef extract_fast static void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) { uint64_t l[8]; secp256k1_scalar_mul_512(l, a, b); secp256k1_scalar_reduce_512(r, l); } static int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n) { int ret; VERIFY_CHECK(n > 0); VERIFY_CHECK(n < 16); ret = r->d[0] & ((1 << n) - 1); r->d[0] = (r->d[0] >> n) + (r->d[1] << (64 - n)); r->d[1] = (r->d[1] >> n) + (r->d[2] << (64 - n)); r->d[2] = (r->d[2] >> n) + (r->d[3] << (64 - n)); r->d[3] = (r->d[3] >> n); return ret; } static void secp256k1_scalar_sqr(secp256k1_scalar *r, const secp256k1_scalar *a) { uint64_t l[8]; secp256k1_scalar_sqr_512(l, a); secp256k1_scalar_reduce_512(r, l); } #ifdef USE_ENDOMORPHISM static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) { r1->d[0] = a->d[0]; r1->d[1] = a->d[1]; r1->d[2] = 0; r1->d[3] = 0; r2->d[0] = a->d[2]; r2->d[1] = a->d[3]; r2->d[2] = 0; r2->d[3] = 0; } #endif SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b) { return ((a->d[0] ^ b->d[0]) | (a->d[1] ^ b->d[1]) | (a->d[2] ^ b->d[2]) | (a->d[3] ^ b->d[3])) == 0; } SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b, unsigned int shift) { uint64_t l[8]; unsigned int shiftlimbs; unsigned int shiftlow; unsigned int shifthigh; VERIFY_CHECK(shift >= 256); secp256k1_scalar_mul_512(l, a, b); shiftlimbs = shift >> 6; shiftlow = shift & 0x3F; shifthigh = 64 - shiftlow; r->d[0] = shift < 512 ? (l[0 + shiftlimbs] >> shiftlow | (shift < 448 && shiftlow ? (l[1 + shiftlimbs] << shifthigh) : 0)) : 0; r->d[1] = shift < 448 ? (l[1 + shiftlimbs] >> shiftlow | (shift < 384 && shiftlow ? (l[2 + shiftlimbs] << shifthigh) : 0)) : 0; r->d[2] = shift < 384 ? (l[2 + shiftlimbs] >> shiftlow | (shift < 320 && shiftlow ? (l[3 + shiftlimbs] << shifthigh) : 0)) : 0; r->d[3] = shift < 320 ? (l[3 + shiftlimbs] >> shiftlow) : 0; secp256k1_scalar_cadd_bit(r, 0, (l[(shift - 1) >> 6] >> ((shift - 1) & 0x3f)) & 1); } #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/scalar_8x32.h ================================================ /********************************************************************** * Copyright (c) 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_SCALAR_REPR_ #define _SECP256K1_SCALAR_REPR_ #include /** A scalar modulo the group order of the secp256k1 curve. */ typedef struct { uint32_t d[8]; } secp256k1_scalar; #define SECP256K1_SCALAR_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{(d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7)}} #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/scalar_8x32_impl.h ================================================ /********************************************************************** * Copyright (c) 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_SCALAR_REPR_IMPL_H_ #define _SECP256K1_SCALAR_REPR_IMPL_H_ /* Limbs of the secp256k1 order. */ #define SECP256K1_N_0 ((uint32_t)0xD0364141UL) #define SECP256K1_N_1 ((uint32_t)0xBFD25E8CUL) #define SECP256K1_N_2 ((uint32_t)0xAF48A03BUL) #define SECP256K1_N_3 ((uint32_t)0xBAAEDCE6UL) #define SECP256K1_N_4 ((uint32_t)0xFFFFFFFEUL) #define SECP256K1_N_5 ((uint32_t)0xFFFFFFFFUL) #define SECP256K1_N_6 ((uint32_t)0xFFFFFFFFUL) #define SECP256K1_N_7 ((uint32_t)0xFFFFFFFFUL) /* Limbs of 2^256 minus the secp256k1 order. */ #define SECP256K1_N_C_0 (~SECP256K1_N_0 + 1) #define SECP256K1_N_C_1 (~SECP256K1_N_1) #define SECP256K1_N_C_2 (~SECP256K1_N_2) #define SECP256K1_N_C_3 (~SECP256K1_N_3) #define SECP256K1_N_C_4 (1) /* Limbs of half the secp256k1 order. */ #define SECP256K1_N_H_0 ((uint32_t)0x681B20A0UL) #define SECP256K1_N_H_1 ((uint32_t)0xDFE92F46UL) #define SECP256K1_N_H_2 ((uint32_t)0x57A4501DUL) #define SECP256K1_N_H_3 ((uint32_t)0x5D576E73UL) #define SECP256K1_N_H_4 ((uint32_t)0xFFFFFFFFUL) #define SECP256K1_N_H_5 ((uint32_t)0xFFFFFFFFUL) #define SECP256K1_N_H_6 ((uint32_t)0xFFFFFFFFUL) #define SECP256K1_N_H_7 ((uint32_t)0x7FFFFFFFUL) SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar *r) { r->d[0] = 0; r->d[1] = 0; r->d[2] = 0; r->d[3] = 0; r->d[4] = 0; r->d[5] = 0; r->d[6] = 0; r->d[7] = 0; } SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v) { r->d[0] = v; r->d[1] = 0; r->d[2] = 0; r->d[3] = 0; r->d[4] = 0; r->d[5] = 0; r->d[6] = 0; r->d[7] = 0; } SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count) { VERIFY_CHECK((offset + count - 1) >> 5 == offset >> 5); return (a->d[offset >> 5] >> (offset & 0x1F)) & ((1 << count) - 1); } SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count) { VERIFY_CHECK(count < 32); VERIFY_CHECK(offset + count <= 256); if ((offset + count - 1) >> 5 == offset >> 5) { return secp256k1_scalar_get_bits(a, offset, count); } else { VERIFY_CHECK((offset >> 5) + 1 < 8); return ((a->d[offset >> 5] >> (offset & 0x1F)) | (a->d[(offset >> 5) + 1] << (32 - (offset & 0x1F)))) & ((((uint32_t)1) << count) - 1); } } SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar *a) { int yes = 0; int no = 0; no |= (a->d[7] < SECP256K1_N_7); /* No need for a > check. */ no |= (a->d[6] < SECP256K1_N_6); /* No need for a > check. */ no |= (a->d[5] < SECP256K1_N_5); /* No need for a > check. */ no |= (a->d[4] < SECP256K1_N_4); yes |= (a->d[4] > SECP256K1_N_4) & ~no; no |= (a->d[3] < SECP256K1_N_3) & ~yes; yes |= (a->d[3] > SECP256K1_N_3) & ~no; no |= (a->d[2] < SECP256K1_N_2) & ~yes; yes |= (a->d[2] > SECP256K1_N_2) & ~no; no |= (a->d[1] < SECP256K1_N_1) & ~yes; yes |= (a->d[1] > SECP256K1_N_1) & ~no; yes |= (a->d[0] >= SECP256K1_N_0) & ~no; return yes; } SECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar *r, uint32_t overflow) { uint64_t t; VERIFY_CHECK(overflow <= 1); t = (uint64_t)r->d[0] + overflow * SECP256K1_N_C_0; r->d[0] = t & 0xFFFFFFFFUL; t >>= 32; t += (uint64_t)r->d[1] + overflow * SECP256K1_N_C_1; r->d[1] = t & 0xFFFFFFFFUL; t >>= 32; t += (uint64_t)r->d[2] + overflow * SECP256K1_N_C_2; r->d[2] = t & 0xFFFFFFFFUL; t >>= 32; t += (uint64_t)r->d[3] + overflow * SECP256K1_N_C_3; r->d[3] = t & 0xFFFFFFFFUL; t >>= 32; t += (uint64_t)r->d[4] + overflow * SECP256K1_N_C_4; r->d[4] = t & 0xFFFFFFFFUL; t >>= 32; t += (uint64_t)r->d[5]; r->d[5] = t & 0xFFFFFFFFUL; t >>= 32; t += (uint64_t)r->d[6]; r->d[6] = t & 0xFFFFFFFFUL; t >>= 32; t += (uint64_t)r->d[7]; r->d[7] = t & 0xFFFFFFFFUL; return overflow; } static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) { int overflow; uint64_t t = (uint64_t)a->d[0] + b->d[0]; r->d[0] = t & 0xFFFFFFFFULL; t >>= 32; t += (uint64_t)a->d[1] + b->d[1]; r->d[1] = t & 0xFFFFFFFFULL; t >>= 32; t += (uint64_t)a->d[2] + b->d[2]; r->d[2] = t & 0xFFFFFFFFULL; t >>= 32; t += (uint64_t)a->d[3] + b->d[3]; r->d[3] = t & 0xFFFFFFFFULL; t >>= 32; t += (uint64_t)a->d[4] + b->d[4]; r->d[4] = t & 0xFFFFFFFFULL; t >>= 32; t += (uint64_t)a->d[5] + b->d[5]; r->d[5] = t & 0xFFFFFFFFULL; t >>= 32; t += (uint64_t)a->d[6] + b->d[6]; r->d[6] = t & 0xFFFFFFFFULL; t >>= 32; t += (uint64_t)a->d[7] + b->d[7]; r->d[7] = t & 0xFFFFFFFFULL; t >>= 32; overflow = t + secp256k1_scalar_check_overflow(r); VERIFY_CHECK(overflow == 0 || overflow == 1); secp256k1_scalar_reduce(r, overflow); return overflow; } static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag) { uint64_t t; VERIFY_CHECK(bit < 256); bit += ((uint32_t) flag - 1) & 0x100; /* forcing (bit >> 5) > 7 makes this a noop */ t = (uint64_t)r->d[0] + (((uint32_t)((bit >> 5) == 0)) << (bit & 0x1F)); r->d[0] = t & 0xFFFFFFFFULL; t >>= 32; t += (uint64_t)r->d[1] + (((uint32_t)((bit >> 5) == 1)) << (bit & 0x1F)); r->d[1] = t & 0xFFFFFFFFULL; t >>= 32; t += (uint64_t)r->d[2] + (((uint32_t)((bit >> 5) == 2)) << (bit & 0x1F)); r->d[2] = t & 0xFFFFFFFFULL; t >>= 32; t += (uint64_t)r->d[3] + (((uint32_t)((bit >> 5) == 3)) << (bit & 0x1F)); r->d[3] = t & 0xFFFFFFFFULL; t >>= 32; t += (uint64_t)r->d[4] + (((uint32_t)((bit >> 5) == 4)) << (bit & 0x1F)); r->d[4] = t & 0xFFFFFFFFULL; t >>= 32; t += (uint64_t)r->d[5] + (((uint32_t)((bit >> 5) == 5)) << (bit & 0x1F)); r->d[5] = t & 0xFFFFFFFFULL; t >>= 32; t += (uint64_t)r->d[6] + (((uint32_t)((bit >> 5) == 6)) << (bit & 0x1F)); r->d[6] = t & 0xFFFFFFFFULL; t >>= 32; t += (uint64_t)r->d[7] + (((uint32_t)((bit >> 5) == 7)) << (bit & 0x1F)); r->d[7] = t & 0xFFFFFFFFULL; #ifdef VERIFY VERIFY_CHECK((t >> 32) == 0); VERIFY_CHECK(secp256k1_scalar_check_overflow(r) == 0); #endif } static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b32, int *overflow) { int over; r->d[0] = (uint32_t)b32[31] | (uint32_t)b32[30] << 8 | (uint32_t)b32[29] << 16 | (uint32_t)b32[28] << 24; r->d[1] = (uint32_t)b32[27] | (uint32_t)b32[26] << 8 | (uint32_t)b32[25] << 16 | (uint32_t)b32[24] << 24; r->d[2] = (uint32_t)b32[23] | (uint32_t)b32[22] << 8 | (uint32_t)b32[21] << 16 | (uint32_t)b32[20] << 24; r->d[3] = (uint32_t)b32[19] | (uint32_t)b32[18] << 8 | (uint32_t)b32[17] << 16 | (uint32_t)b32[16] << 24; r->d[4] = (uint32_t)b32[15] | (uint32_t)b32[14] << 8 | (uint32_t)b32[13] << 16 | (uint32_t)b32[12] << 24; r->d[5] = (uint32_t)b32[11] | (uint32_t)b32[10] << 8 | (uint32_t)b32[9] << 16 | (uint32_t)b32[8] << 24; r->d[6] = (uint32_t)b32[7] | (uint32_t)b32[6] << 8 | (uint32_t)b32[5] << 16 | (uint32_t)b32[4] << 24; r->d[7] = (uint32_t)b32[3] | (uint32_t)b32[2] << 8 | (uint32_t)b32[1] << 16 | (uint32_t)b32[0] << 24; over = secp256k1_scalar_reduce(r, secp256k1_scalar_check_overflow(r)); if (overflow) { *overflow = over; } } static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a) { bin[0] = a->d[7] >> 24; bin[1] = a->d[7] >> 16; bin[2] = a->d[7] >> 8; bin[3] = a->d[7]; bin[4] = a->d[6] >> 24; bin[5] = a->d[6] >> 16; bin[6] = a->d[6] >> 8; bin[7] = a->d[6]; bin[8] = a->d[5] >> 24; bin[9] = a->d[5] >> 16; bin[10] = a->d[5] >> 8; bin[11] = a->d[5]; bin[12] = a->d[4] >> 24; bin[13] = a->d[4] >> 16; bin[14] = a->d[4] >> 8; bin[15] = a->d[4]; bin[16] = a->d[3] >> 24; bin[17] = a->d[3] >> 16; bin[18] = a->d[3] >> 8; bin[19] = a->d[3]; bin[20] = a->d[2] >> 24; bin[21] = a->d[2] >> 16; bin[22] = a->d[2] >> 8; bin[23] = a->d[2]; bin[24] = a->d[1] >> 24; bin[25] = a->d[1] >> 16; bin[26] = a->d[1] >> 8; bin[27] = a->d[1]; bin[28] = a->d[0] >> 24; bin[29] = a->d[0] >> 16; bin[30] = a->d[0] >> 8; bin[31] = a->d[0]; } SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar *a) { return (a->d[0] | a->d[1] | a->d[2] | a->d[3] | a->d[4] | a->d[5] | a->d[6] | a->d[7]) == 0; } static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a) { uint32_t nonzero = 0xFFFFFFFFUL * (secp256k1_scalar_is_zero(a) == 0); uint64_t t = (uint64_t)(~a->d[0]) + SECP256K1_N_0 + 1; r->d[0] = t & nonzero; t >>= 32; t += (uint64_t)(~a->d[1]) + SECP256K1_N_1; r->d[1] = t & nonzero; t >>= 32; t += (uint64_t)(~a->d[2]) + SECP256K1_N_2; r->d[2] = t & nonzero; t >>= 32; t += (uint64_t)(~a->d[3]) + SECP256K1_N_3; r->d[3] = t & nonzero; t >>= 32; t += (uint64_t)(~a->d[4]) + SECP256K1_N_4; r->d[4] = t & nonzero; t >>= 32; t += (uint64_t)(~a->d[5]) + SECP256K1_N_5; r->d[5] = t & nonzero; t >>= 32; t += (uint64_t)(~a->d[6]) + SECP256K1_N_6; r->d[6] = t & nonzero; t >>= 32; t += (uint64_t)(~a->d[7]) + SECP256K1_N_7; r->d[7] = t & nonzero; } SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar *a) { return ((a->d[0] ^ 1) | a->d[1] | a->d[2] | a->d[3] | a->d[4] | a->d[5] | a->d[6] | a->d[7]) == 0; } static int secp256k1_scalar_is_high(const secp256k1_scalar *a) { int yes = 0; int no = 0; no |= (a->d[7] < SECP256K1_N_H_7); yes |= (a->d[7] > SECP256K1_N_H_7) & ~no; no |= (a->d[6] < SECP256K1_N_H_6) & ~yes; /* No need for a > check. */ no |= (a->d[5] < SECP256K1_N_H_5) & ~yes; /* No need for a > check. */ no |= (a->d[4] < SECP256K1_N_H_4) & ~yes; /* No need for a > check. */ no |= (a->d[3] < SECP256K1_N_H_3) & ~yes; yes |= (a->d[3] > SECP256K1_N_H_3) & ~no; no |= (a->d[2] < SECP256K1_N_H_2) & ~yes; yes |= (a->d[2] > SECP256K1_N_H_2) & ~no; no |= (a->d[1] < SECP256K1_N_H_1) & ~yes; yes |= (a->d[1] > SECP256K1_N_H_1) & ~no; yes |= (a->d[0] > SECP256K1_N_H_0) & ~no; return yes; } static int secp256k1_scalar_cond_negate(secp256k1_scalar *r, int flag) { /* If we are flag = 0, mask = 00...00 and this is a no-op; * if we are flag = 1, mask = 11...11 and this is identical to secp256k1_scalar_negate */ uint32_t mask = !flag - 1; uint32_t nonzero = 0xFFFFFFFFUL * (secp256k1_scalar_is_zero(r) == 0); uint64_t t = (uint64_t)(r->d[0] ^ mask) + ((SECP256K1_N_0 + 1) & mask); r->d[0] = t & nonzero; t >>= 32; t += (uint64_t)(r->d[1] ^ mask) + (SECP256K1_N_1 & mask); r->d[1] = t & nonzero; t >>= 32; t += (uint64_t)(r->d[2] ^ mask) + (SECP256K1_N_2 & mask); r->d[2] = t & nonzero; t >>= 32; t += (uint64_t)(r->d[3] ^ mask) + (SECP256K1_N_3 & mask); r->d[3] = t & nonzero; t >>= 32; t += (uint64_t)(r->d[4] ^ mask) + (SECP256K1_N_4 & mask); r->d[4] = t & nonzero; t >>= 32; t += (uint64_t)(r->d[5] ^ mask) + (SECP256K1_N_5 & mask); r->d[5] = t & nonzero; t >>= 32; t += (uint64_t)(r->d[6] ^ mask) + (SECP256K1_N_6 & mask); r->d[6] = t & nonzero; t >>= 32; t += (uint64_t)(r->d[7] ^ mask) + (SECP256K1_N_7 & mask); r->d[7] = t & nonzero; return 2 * (mask == 0) - 1; } /* Inspired by the macros in OpenSSL's crypto/bn/asm/x86_64-gcc.c. */ /** Add a*b to the number defined by (c0,c1,c2). c2 must never overflow. */ #define muladd(a,b) { \ uint32_t tl, th; \ { \ uint64_t t = (uint64_t)a * b; \ th = t >> 32; /* at most 0xFFFFFFFE */ \ tl = t; \ } \ c0 += tl; /* overflow is handled on the next line */ \ th += (c0 < tl) ? 1 : 0; /* at most 0xFFFFFFFF */ \ c1 += th; /* overflow is handled on the next line */ \ c2 += (c1 < th) ? 1 : 0; /* never overflows by contract (verified in the next line) */ \ VERIFY_CHECK((c1 >= th) || (c2 != 0)); \ } /** Add a*b to the number defined by (c0,c1). c1 must never overflow. */ #define muladd_fast(a,b) { \ uint32_t tl, th; \ { \ uint64_t t = (uint64_t)a * b; \ th = t >> 32; /* at most 0xFFFFFFFE */ \ tl = t; \ } \ c0 += tl; /* overflow is handled on the next line */ \ th += (c0 < tl) ? 1 : 0; /* at most 0xFFFFFFFF */ \ c1 += th; /* never overflows by contract (verified in the next line) */ \ VERIFY_CHECK(c1 >= th); \ } /** Add 2*a*b to the number defined by (c0,c1,c2). c2 must never overflow. */ #define muladd2(a,b) { \ uint32_t tl, th, th2, tl2; \ { \ uint64_t t = (uint64_t)a * b; \ th = t >> 32; /* at most 0xFFFFFFFE */ \ tl = t; \ } \ th2 = th + th; /* at most 0xFFFFFFFE (in case th was 0x7FFFFFFF) */ \ c2 += (th2 < th) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ VERIFY_CHECK((th2 >= th) || (c2 != 0)); \ tl2 = tl + tl; /* at most 0xFFFFFFFE (in case the lowest 63 bits of tl were 0x7FFFFFFF) */ \ th2 += (tl2 < tl) ? 1 : 0; /* at most 0xFFFFFFFF */ \ c0 += tl2; /* overflow is handled on the next line */ \ th2 += (c0 < tl2) ? 1 : 0; /* second overflow is handled on the next line */ \ c2 += (c0 < tl2) & (th2 == 0); /* never overflows by contract (verified the next line) */ \ VERIFY_CHECK((c0 >= tl2) || (th2 != 0) || (c2 != 0)); \ c1 += th2; /* overflow is handled on the next line */ \ c2 += (c1 < th2) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ VERIFY_CHECK((c1 >= th2) || (c2 != 0)); \ } /** Add a to the number defined by (c0,c1,c2). c2 must never overflow. */ #define sumadd(a) { \ unsigned int over; \ c0 += (a); /* overflow is handled on the next line */ \ over = (c0 < (a)) ? 1 : 0; \ c1 += over; /* overflow is handled on the next line */ \ c2 += (c1 < over) ? 1 : 0; /* never overflows by contract */ \ } /** Add a to the number defined by (c0,c1). c1 must never overflow, c2 must be zero. */ #define sumadd_fast(a) { \ c0 += (a); /* overflow is handled on the next line */ \ c1 += (c0 < (a)) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ VERIFY_CHECK((c1 != 0) | (c0 >= (a))); \ VERIFY_CHECK(c2 == 0); \ } /** Extract the lowest 32 bits of (c0,c1,c2) into n, and left shift the number 32 bits. */ #define extract(n) { \ (n) = c0; \ c0 = c1; \ c1 = c2; \ c2 = 0; \ } /** Extract the lowest 32 bits of (c0,c1,c2) into n, and left shift the number 32 bits. c2 is required to be zero. */ #define extract_fast(n) { \ (n) = c0; \ c0 = c1; \ c1 = 0; \ VERIFY_CHECK(c2 == 0); \ } static void secp256k1_scalar_reduce_512(secp256k1_scalar *r, const uint32_t *l) { uint64_t c; uint32_t n0 = l[8], n1 = l[9], n2 = l[10], n3 = l[11], n4 = l[12], n5 = l[13], n6 = l[14], n7 = l[15]; uint32_t m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12; uint32_t p0, p1, p2, p3, p4, p5, p6, p7, p8; /* 96 bit accumulator. */ uint32_t c0, c1, c2; /* Reduce 512 bits into 385. */ /* m[0..12] = l[0..7] + n[0..7] * SECP256K1_N_C. */ c0 = l[0]; c1 = 0; c2 = 0; muladd_fast(n0, SECP256K1_N_C_0); extract_fast(m0); sumadd_fast(l[1]); muladd(n1, SECP256K1_N_C_0); muladd(n0, SECP256K1_N_C_1); extract(m1); sumadd(l[2]); muladd(n2, SECP256K1_N_C_0); muladd(n1, SECP256K1_N_C_1); muladd(n0, SECP256K1_N_C_2); extract(m2); sumadd(l[3]); muladd(n3, SECP256K1_N_C_0); muladd(n2, SECP256K1_N_C_1); muladd(n1, SECP256K1_N_C_2); muladd(n0, SECP256K1_N_C_3); extract(m3); sumadd(l[4]); muladd(n4, SECP256K1_N_C_0); muladd(n3, SECP256K1_N_C_1); muladd(n2, SECP256K1_N_C_2); muladd(n1, SECP256K1_N_C_3); sumadd(n0); extract(m4); sumadd(l[5]); muladd(n5, SECP256K1_N_C_0); muladd(n4, SECP256K1_N_C_1); muladd(n3, SECP256K1_N_C_2); muladd(n2, SECP256K1_N_C_3); sumadd(n1); extract(m5); sumadd(l[6]); muladd(n6, SECP256K1_N_C_0); muladd(n5, SECP256K1_N_C_1); muladd(n4, SECP256K1_N_C_2); muladd(n3, SECP256K1_N_C_3); sumadd(n2); extract(m6); sumadd(l[7]); muladd(n7, SECP256K1_N_C_0); muladd(n6, SECP256K1_N_C_1); muladd(n5, SECP256K1_N_C_2); muladd(n4, SECP256K1_N_C_3); sumadd(n3); extract(m7); muladd(n7, SECP256K1_N_C_1); muladd(n6, SECP256K1_N_C_2); muladd(n5, SECP256K1_N_C_3); sumadd(n4); extract(m8); muladd(n7, SECP256K1_N_C_2); muladd(n6, SECP256K1_N_C_3); sumadd(n5); extract(m9); muladd(n7, SECP256K1_N_C_3); sumadd(n6); extract(m10); sumadd_fast(n7); extract_fast(m11); VERIFY_CHECK(c0 <= 1); m12 = c0; /* Reduce 385 bits into 258. */ /* p[0..8] = m[0..7] + m[8..12] * SECP256K1_N_C. */ c0 = m0; c1 = 0; c2 = 0; muladd_fast(m8, SECP256K1_N_C_0); extract_fast(p0); sumadd_fast(m1); muladd(m9, SECP256K1_N_C_0); muladd(m8, SECP256K1_N_C_1); extract(p1); sumadd(m2); muladd(m10, SECP256K1_N_C_0); muladd(m9, SECP256K1_N_C_1); muladd(m8, SECP256K1_N_C_2); extract(p2); sumadd(m3); muladd(m11, SECP256K1_N_C_0); muladd(m10, SECP256K1_N_C_1); muladd(m9, SECP256K1_N_C_2); muladd(m8, SECP256K1_N_C_3); extract(p3); sumadd(m4); muladd(m12, SECP256K1_N_C_0); muladd(m11, SECP256K1_N_C_1); muladd(m10, SECP256K1_N_C_2); muladd(m9, SECP256K1_N_C_3); sumadd(m8); extract(p4); sumadd(m5); muladd(m12, SECP256K1_N_C_1); muladd(m11, SECP256K1_N_C_2); muladd(m10, SECP256K1_N_C_3); sumadd(m9); extract(p5); sumadd(m6); muladd(m12, SECP256K1_N_C_2); muladd(m11, SECP256K1_N_C_3); sumadd(m10); extract(p6); sumadd_fast(m7); muladd_fast(m12, SECP256K1_N_C_3); sumadd_fast(m11); extract_fast(p7); p8 = c0 + m12; VERIFY_CHECK(p8 <= 2); /* Reduce 258 bits into 256. */ /* r[0..7] = p[0..7] + p[8] * SECP256K1_N_C. */ c = p0 + (uint64_t)SECP256K1_N_C_0 * p8; r->d[0] = c & 0xFFFFFFFFUL; c >>= 32; c += p1 + (uint64_t)SECP256K1_N_C_1 * p8; r->d[1] = c & 0xFFFFFFFFUL; c >>= 32; c += p2 + (uint64_t)SECP256K1_N_C_2 * p8; r->d[2] = c & 0xFFFFFFFFUL; c >>= 32; c += p3 + (uint64_t)SECP256K1_N_C_3 * p8; r->d[3] = c & 0xFFFFFFFFUL; c >>= 32; c += p4 + (uint64_t)p8; r->d[4] = c & 0xFFFFFFFFUL; c >>= 32; c += p5; r->d[5] = c & 0xFFFFFFFFUL; c >>= 32; c += p6; r->d[6] = c & 0xFFFFFFFFUL; c >>= 32; c += p7; r->d[7] = c & 0xFFFFFFFFUL; c >>= 32; /* Final reduction of r. */ secp256k1_scalar_reduce(r, c + secp256k1_scalar_check_overflow(r)); } static void secp256k1_scalar_mul_512(uint32_t *l, const secp256k1_scalar *a, const secp256k1_scalar *b) { /* 96 bit accumulator. */ uint32_t c0 = 0, c1 = 0, c2 = 0; /* l[0..15] = a[0..7] * b[0..7]. */ muladd_fast(a->d[0], b->d[0]); extract_fast(l[0]); muladd(a->d[0], b->d[1]); muladd(a->d[1], b->d[0]); extract(l[1]); muladd(a->d[0], b->d[2]); muladd(a->d[1], b->d[1]); muladd(a->d[2], b->d[0]); extract(l[2]); muladd(a->d[0], b->d[3]); muladd(a->d[1], b->d[2]); muladd(a->d[2], b->d[1]); muladd(a->d[3], b->d[0]); extract(l[3]); muladd(a->d[0], b->d[4]); muladd(a->d[1], b->d[3]); muladd(a->d[2], b->d[2]); muladd(a->d[3], b->d[1]); muladd(a->d[4], b->d[0]); extract(l[4]); muladd(a->d[0], b->d[5]); muladd(a->d[1], b->d[4]); muladd(a->d[2], b->d[3]); muladd(a->d[3], b->d[2]); muladd(a->d[4], b->d[1]); muladd(a->d[5], b->d[0]); extract(l[5]); muladd(a->d[0], b->d[6]); muladd(a->d[1], b->d[5]); muladd(a->d[2], b->d[4]); muladd(a->d[3], b->d[3]); muladd(a->d[4], b->d[2]); muladd(a->d[5], b->d[1]); muladd(a->d[6], b->d[0]); extract(l[6]); muladd(a->d[0], b->d[7]); muladd(a->d[1], b->d[6]); muladd(a->d[2], b->d[5]); muladd(a->d[3], b->d[4]); muladd(a->d[4], b->d[3]); muladd(a->d[5], b->d[2]); muladd(a->d[6], b->d[1]); muladd(a->d[7], b->d[0]); extract(l[7]); muladd(a->d[1], b->d[7]); muladd(a->d[2], b->d[6]); muladd(a->d[3], b->d[5]); muladd(a->d[4], b->d[4]); muladd(a->d[5], b->d[3]); muladd(a->d[6], b->d[2]); muladd(a->d[7], b->d[1]); extract(l[8]); muladd(a->d[2], b->d[7]); muladd(a->d[3], b->d[6]); muladd(a->d[4], b->d[5]); muladd(a->d[5], b->d[4]); muladd(a->d[6], b->d[3]); muladd(a->d[7], b->d[2]); extract(l[9]); muladd(a->d[3], b->d[7]); muladd(a->d[4], b->d[6]); muladd(a->d[5], b->d[5]); muladd(a->d[6], b->d[4]); muladd(a->d[7], b->d[3]); extract(l[10]); muladd(a->d[4], b->d[7]); muladd(a->d[5], b->d[6]); muladd(a->d[6], b->d[5]); muladd(a->d[7], b->d[4]); extract(l[11]); muladd(a->d[5], b->d[7]); muladd(a->d[6], b->d[6]); muladd(a->d[7], b->d[5]); extract(l[12]); muladd(a->d[6], b->d[7]); muladd(a->d[7], b->d[6]); extract(l[13]); muladd_fast(a->d[7], b->d[7]); extract_fast(l[14]); VERIFY_CHECK(c1 == 0); l[15] = c0; } static void secp256k1_scalar_sqr_512(uint32_t *l, const secp256k1_scalar *a) { /* 96 bit accumulator. */ uint32_t c0 = 0, c1 = 0, c2 = 0; /* l[0..15] = a[0..7]^2. */ muladd_fast(a->d[0], a->d[0]); extract_fast(l[0]); muladd2(a->d[0], a->d[1]); extract(l[1]); muladd2(a->d[0], a->d[2]); muladd(a->d[1], a->d[1]); extract(l[2]); muladd2(a->d[0], a->d[3]); muladd2(a->d[1], a->d[2]); extract(l[3]); muladd2(a->d[0], a->d[4]); muladd2(a->d[1], a->d[3]); muladd(a->d[2], a->d[2]); extract(l[4]); muladd2(a->d[0], a->d[5]); muladd2(a->d[1], a->d[4]); muladd2(a->d[2], a->d[3]); extract(l[5]); muladd2(a->d[0], a->d[6]); muladd2(a->d[1], a->d[5]); muladd2(a->d[2], a->d[4]); muladd(a->d[3], a->d[3]); extract(l[6]); muladd2(a->d[0], a->d[7]); muladd2(a->d[1], a->d[6]); muladd2(a->d[2], a->d[5]); muladd2(a->d[3], a->d[4]); extract(l[7]); muladd2(a->d[1], a->d[7]); muladd2(a->d[2], a->d[6]); muladd2(a->d[3], a->d[5]); muladd(a->d[4], a->d[4]); extract(l[8]); muladd2(a->d[2], a->d[7]); muladd2(a->d[3], a->d[6]); muladd2(a->d[4], a->d[5]); extract(l[9]); muladd2(a->d[3], a->d[7]); muladd2(a->d[4], a->d[6]); muladd(a->d[5], a->d[5]); extract(l[10]); muladd2(a->d[4], a->d[7]); muladd2(a->d[5], a->d[6]); extract(l[11]); muladd2(a->d[5], a->d[7]); muladd(a->d[6], a->d[6]); extract(l[12]); muladd2(a->d[6], a->d[7]); extract(l[13]); muladd_fast(a->d[7], a->d[7]); extract_fast(l[14]); VERIFY_CHECK(c1 == 0); l[15] = c0; } #undef sumadd #undef sumadd_fast #undef muladd #undef muladd_fast #undef muladd2 #undef extract #undef extract_fast static void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) { uint32_t l[16]; secp256k1_scalar_mul_512(l, a, b); secp256k1_scalar_reduce_512(r, l); } static int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n) { int ret; VERIFY_CHECK(n > 0); VERIFY_CHECK(n < 16); ret = r->d[0] & ((1 << n) - 1); r->d[0] = (r->d[0] >> n) + (r->d[1] << (32 - n)); r->d[1] = (r->d[1] >> n) + (r->d[2] << (32 - n)); r->d[2] = (r->d[2] >> n) + (r->d[3] << (32 - n)); r->d[3] = (r->d[3] >> n) + (r->d[4] << (32 - n)); r->d[4] = (r->d[4] >> n) + (r->d[5] << (32 - n)); r->d[5] = (r->d[5] >> n) + (r->d[6] << (32 - n)); r->d[6] = (r->d[6] >> n) + (r->d[7] << (32 - n)); r->d[7] = (r->d[7] >> n); return ret; } static void secp256k1_scalar_sqr(secp256k1_scalar *r, const secp256k1_scalar *a) { uint32_t l[16]; secp256k1_scalar_sqr_512(l, a); secp256k1_scalar_reduce_512(r, l); } #ifdef USE_ENDOMORPHISM static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) { r1->d[0] = a->d[0]; r1->d[1] = a->d[1]; r1->d[2] = a->d[2]; r1->d[3] = a->d[3]; r1->d[4] = 0; r1->d[5] = 0; r1->d[6] = 0; r1->d[7] = 0; r2->d[0] = a->d[4]; r2->d[1] = a->d[5]; r2->d[2] = a->d[6]; r2->d[3] = a->d[7]; r2->d[4] = 0; r2->d[5] = 0; r2->d[6] = 0; r2->d[7] = 0; } #endif SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b) { return ((a->d[0] ^ b->d[0]) | (a->d[1] ^ b->d[1]) | (a->d[2] ^ b->d[2]) | (a->d[3] ^ b->d[3]) | (a->d[4] ^ b->d[4]) | (a->d[5] ^ b->d[5]) | (a->d[6] ^ b->d[6]) | (a->d[7] ^ b->d[7])) == 0; } SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b, unsigned int shift) { uint32_t l[16]; unsigned int shiftlimbs; unsigned int shiftlow; unsigned int shifthigh; VERIFY_CHECK(shift >= 256); secp256k1_scalar_mul_512(l, a, b); shiftlimbs = shift >> 5; shiftlow = shift & 0x1F; shifthigh = 32 - shiftlow; r->d[0] = shift < 512 ? (l[0 + shiftlimbs] >> shiftlow | (shift < 480 && shiftlow ? (l[1 + shiftlimbs] << shifthigh) : 0)) : 0; r->d[1] = shift < 480 ? (l[1 + shiftlimbs] >> shiftlow | (shift < 448 && shiftlow ? (l[2 + shiftlimbs] << shifthigh) : 0)) : 0; r->d[2] = shift < 448 ? (l[2 + shiftlimbs] >> shiftlow | (shift < 416 && shiftlow ? (l[3 + shiftlimbs] << shifthigh) : 0)) : 0; r->d[3] = shift < 416 ? (l[3 + shiftlimbs] >> shiftlow | (shift < 384 && shiftlow ? (l[4 + shiftlimbs] << shifthigh) : 0)) : 0; r->d[4] = shift < 384 ? (l[4 + shiftlimbs] >> shiftlow | (shift < 352 && shiftlow ? (l[5 + shiftlimbs] << shifthigh) : 0)) : 0; r->d[5] = shift < 352 ? (l[5 + shiftlimbs] >> shiftlow | (shift < 320 && shiftlow ? (l[6 + shiftlimbs] << shifthigh) : 0)) : 0; r->d[6] = shift < 320 ? (l[6 + shiftlimbs] >> shiftlow | (shift < 288 && shiftlow ? (l[7 + shiftlimbs] << shifthigh) : 0)) : 0; r->d[7] = shift < 288 ? (l[7 + shiftlimbs] >> shiftlow) : 0; secp256k1_scalar_cadd_bit(r, 0, (l[(shift - 1) >> 5] >> ((shift - 1) & 0x1f)) & 1); } #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/scalar_impl.h ================================================ /********************************************************************** * Copyright (c) 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_SCALAR_IMPL_H_ #define _SECP256K1_SCALAR_IMPL_H_ #include "group.h" #include "scalar.h" #if defined HAVE_CONFIG_H #include "libsecp256k1-config.h" #endif #if defined(EXHAUSTIVE_TEST_ORDER) #include "scalar_low_impl.h" #elif defined(USE_SCALAR_4X64) #include "scalar_4x64_impl.h" #elif defined(USE_SCALAR_8X32) #include "scalar_8x32_impl.h" #else #error "Please select scalar implementation" #endif #ifndef USE_NUM_NONE static void secp256k1_scalar_get_num(secp256k1_num *r, const secp256k1_scalar *a) { unsigned char c[32]; secp256k1_scalar_get_b32(c, a); secp256k1_num_set_bin(r, c, 32); } /** secp256k1 curve order, see secp256k1_ecdsa_const_order_as_fe in ecdsa_impl.h */ static void secp256k1_scalar_order_get_num(secp256k1_num *r) { #if defined(EXHAUSTIVE_TEST_ORDER) static const unsigned char order[32] = { 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,EXHAUSTIVE_TEST_ORDER }; #else static const unsigned char order[32] = { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B, 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x41 }; #endif secp256k1_num_set_bin(r, order, 32); } #endif static void secp256k1_scalar_inverse(secp256k1_scalar *r, const secp256k1_scalar *x) { #if defined(EXHAUSTIVE_TEST_ORDER) int i; *r = 0; for (i = 0; i < EXHAUSTIVE_TEST_ORDER; i++) if ((i * *x) % EXHAUSTIVE_TEST_ORDER == 1) *r = i; /* If this VERIFY_CHECK triggers we were given a noninvertible scalar (and thus * have a composite group order; fix it in exhaustive_tests.c). */ VERIFY_CHECK(*r != 0); } #else secp256k1_scalar *t; int i; /* First compute x ^ (2^N - 1) for some values of N. */ secp256k1_scalar x2, x3, x4, x6, x7, x8, x15, x30, x60, x120, x127; secp256k1_scalar_sqr(&x2, x); secp256k1_scalar_mul(&x2, &x2, x); secp256k1_scalar_sqr(&x3, &x2); secp256k1_scalar_mul(&x3, &x3, x); secp256k1_scalar_sqr(&x4, &x3); secp256k1_scalar_mul(&x4, &x4, x); secp256k1_scalar_sqr(&x6, &x4); secp256k1_scalar_sqr(&x6, &x6); secp256k1_scalar_mul(&x6, &x6, &x2); secp256k1_scalar_sqr(&x7, &x6); secp256k1_scalar_mul(&x7, &x7, x); secp256k1_scalar_sqr(&x8, &x7); secp256k1_scalar_mul(&x8, &x8, x); secp256k1_scalar_sqr(&x15, &x8); for (i = 0; i < 6; i++) { secp256k1_scalar_sqr(&x15, &x15); } secp256k1_scalar_mul(&x15, &x15, &x7); secp256k1_scalar_sqr(&x30, &x15); for (i = 0; i < 14; i++) { secp256k1_scalar_sqr(&x30, &x30); } secp256k1_scalar_mul(&x30, &x30, &x15); secp256k1_scalar_sqr(&x60, &x30); for (i = 0; i < 29; i++) { secp256k1_scalar_sqr(&x60, &x60); } secp256k1_scalar_mul(&x60, &x60, &x30); secp256k1_scalar_sqr(&x120, &x60); for (i = 0; i < 59; i++) { secp256k1_scalar_sqr(&x120, &x120); } secp256k1_scalar_mul(&x120, &x120, &x60); secp256k1_scalar_sqr(&x127, &x120); for (i = 0; i < 6; i++) { secp256k1_scalar_sqr(&x127, &x127); } secp256k1_scalar_mul(&x127, &x127, &x7); /* Then accumulate the final result (t starts at x127). */ t = &x127; for (i = 0; i < 2; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, x); /* 1 */ for (i = 0; i < 4; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, &x3); /* 111 */ for (i = 0; i < 2; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, x); /* 1 */ for (i = 0; i < 2; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, x); /* 1 */ for (i = 0; i < 2; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, x); /* 1 */ for (i = 0; i < 4; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, &x3); /* 111 */ for (i = 0; i < 3; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, &x2); /* 11 */ for (i = 0; i < 4; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, &x3); /* 111 */ for (i = 0; i < 5; i++) { /* 00 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, &x3); /* 111 */ for (i = 0; i < 4; i++) { /* 00 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, &x2); /* 11 */ for (i = 0; i < 2; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, x); /* 1 */ for (i = 0; i < 2; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, x); /* 1 */ for (i = 0; i < 5; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, &x4); /* 1111 */ for (i = 0; i < 2; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, x); /* 1 */ for (i = 0; i < 3; i++) { /* 00 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, x); /* 1 */ for (i = 0; i < 4; i++) { /* 000 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, x); /* 1 */ for (i = 0; i < 2; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, x); /* 1 */ for (i = 0; i < 10; i++) { /* 0000000 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, &x3); /* 111 */ for (i = 0; i < 4; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, &x3); /* 111 */ for (i = 0; i < 9; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, &x8); /* 11111111 */ for (i = 0; i < 2; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, x); /* 1 */ for (i = 0; i < 3; i++) { /* 00 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, x); /* 1 */ for (i = 0; i < 3; i++) { /* 00 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, x); /* 1 */ for (i = 0; i < 5; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, &x4); /* 1111 */ for (i = 0; i < 2; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, x); /* 1 */ for (i = 0; i < 5; i++) { /* 000 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, &x2); /* 11 */ for (i = 0; i < 4; i++) { /* 00 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, &x2); /* 11 */ for (i = 0; i < 2; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, x); /* 1 */ for (i = 0; i < 8; i++) { /* 000000 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, &x2); /* 11 */ for (i = 0; i < 3; i++) { /* 0 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, &x2); /* 11 */ for (i = 0; i < 3; i++) { /* 00 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, x); /* 1 */ for (i = 0; i < 6; i++) { /* 00000 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(t, t, x); /* 1 */ for (i = 0; i < 8; i++) { /* 00 */ secp256k1_scalar_sqr(t, t); } secp256k1_scalar_mul(r, t, &x6); /* 111111 */ } SECP256K1_INLINE static int secp256k1_scalar_is_even(const secp256k1_scalar *a) { return !(a->d[0] & 1); } #endif static void secp256k1_scalar_inverse_var(secp256k1_scalar *r, const secp256k1_scalar *x) { #if defined(USE_SCALAR_INV_BUILTIN) secp256k1_scalar_inverse(r, x); #elif defined(USE_SCALAR_INV_NUM) unsigned char b[32]; secp256k1_num n, m; secp256k1_scalar t = *x; secp256k1_scalar_get_b32(b, &t); secp256k1_num_set_bin(&n, b, 32); secp256k1_scalar_order_get_num(&m); secp256k1_num_mod_inverse(&n, &n, &m); secp256k1_num_get_bin(b, 32, &n); secp256k1_scalar_set_b32(r, b, NULL); /* Verify that the inverse was computed correctly, without GMP code. */ secp256k1_scalar_mul(&t, &t, r); CHECK(secp256k1_scalar_is_one(&t)); #else #error "Please select scalar inverse implementation" #endif } #ifdef USE_ENDOMORPHISM #if defined(EXHAUSTIVE_TEST_ORDER) /** * Find k1 and k2 given k, such that k1 + k2 * lambda == k mod n; unlike in the * full case we don't bother making k1 and k2 be small, we just want them to be * nontrivial to get full test coverage for the exhaustive tests. We therefore * (arbitrarily) set k2 = k + 5 and k1 = k - k2 * lambda. */ static void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) { *r2 = (*a + 5) % EXHAUSTIVE_TEST_ORDER; *r1 = (*a + (EXHAUSTIVE_TEST_ORDER - *r2) * EXHAUSTIVE_TEST_LAMBDA) % EXHAUSTIVE_TEST_ORDER; } #else /** * The Secp256k1 curve has an endomorphism, where lambda * (x, y) = (beta * x, y), where * lambda is {0x53,0x63,0xad,0x4c,0xc0,0x5c,0x30,0xe0,0xa5,0x26,0x1c,0x02,0x88,0x12,0x64,0x5a, * 0x12,0x2e,0x22,0xea,0x20,0x81,0x66,0x78,0xdf,0x02,0x96,0x7c,0x1b,0x23,0xbd,0x72} * * "Guide to Elliptic Curve Cryptography" (Hankerson, Menezes, Vanstone) gives an algorithm * (algorithm 3.74) to find k1 and k2 given k, such that k1 + k2 * lambda == k mod n, and k1 * and k2 have a small size. * It relies on constants a1, b1, a2, b2. These constants for the value of lambda above are: * * - a1 = {0x30,0x86,0xd2,0x21,0xa7,0xd4,0x6b,0xcd,0xe8,0x6c,0x90,0xe4,0x92,0x84,0xeb,0x15} * - b1 = -{0xe4,0x43,0x7e,0xd6,0x01,0x0e,0x88,0x28,0x6f,0x54,0x7f,0xa9,0x0a,0xbf,0xe4,0xc3} * - a2 = {0x01,0x14,0xca,0x50,0xf7,0xa8,0xe2,0xf3,0xf6,0x57,0xc1,0x10,0x8d,0x9d,0x44,0xcf,0xd8} * - b2 = {0x30,0x86,0xd2,0x21,0xa7,0xd4,0x6b,0xcd,0xe8,0x6c,0x90,0xe4,0x92,0x84,0xeb,0x15} * * The algorithm then computes c1 = round(b1 * k / n) and c2 = round(b2 * k / n), and gives * k1 = k - (c1*a1 + c2*a2) and k2 = -(c1*b1 + c2*b2). Instead, we use modular arithmetic, and * compute k1 as k - k2 * lambda, avoiding the need for constants a1 and a2. * * g1, g2 are precomputed constants used to replace division with a rounded multiplication * when decomposing the scalar for an endomorphism-based point multiplication. * * The possibility of using precomputed estimates is mentioned in "Guide to Elliptic Curve * Cryptography" (Hankerson, Menezes, Vanstone) in section 3.5. * * The derivation is described in the paper "Efficient Software Implementation of Public-Key * Cryptography on Sensor Networks Using the MSP430X Microcontroller" (Gouvea, Oliveira, Lopez), * Section 4.3 (here we use a somewhat higher-precision estimate): * d = a1*b2 - b1*a2 * g1 = round((2^272)*b2/d) * g2 = round((2^272)*b1/d) * * (Note that 'd' is also equal to the curve order here because [a1,b1] and [a2,b2] are found * as outputs of the Extended Euclidean Algorithm on inputs 'order' and 'lambda'). * * The function below splits a in r1 and r2, such that r1 + lambda * r2 == a (mod order). */ static void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) { secp256k1_scalar c1, c2; static const secp256k1_scalar minus_lambda = SECP256K1_SCALAR_CONST( 0xAC9C52B3UL, 0x3FA3CF1FUL, 0x5AD9E3FDUL, 0x77ED9BA4UL, 0xA880B9FCUL, 0x8EC739C2UL, 0xE0CFC810UL, 0xB51283CFUL ); static const secp256k1_scalar minus_b1 = SECP256K1_SCALAR_CONST( 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, 0xE4437ED6UL, 0x010E8828UL, 0x6F547FA9UL, 0x0ABFE4C3UL ); static const secp256k1_scalar minus_b2 = SECP256K1_SCALAR_CONST( 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL, 0x8A280AC5UL, 0x0774346DUL, 0xD765CDA8UL, 0x3DB1562CUL ); static const secp256k1_scalar g1 = SECP256K1_SCALAR_CONST( 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00003086UL, 0xD221A7D4UL, 0x6BCDE86CUL, 0x90E49284UL, 0xEB153DABUL ); static const secp256k1_scalar g2 = SECP256K1_SCALAR_CONST( 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x0000E443UL, 0x7ED6010EUL, 0x88286F54UL, 0x7FA90ABFUL, 0xE4C42212UL ); VERIFY_CHECK(r1 != a); VERIFY_CHECK(r2 != a); /* these _var calls are constant time since the shift amount is constant */ secp256k1_scalar_mul_shift_var(&c1, a, &g1, 272); secp256k1_scalar_mul_shift_var(&c2, a, &g2, 272); secp256k1_scalar_mul(&c1, &c1, &minus_b1); secp256k1_scalar_mul(&c2, &c2, &minus_b2); secp256k1_scalar_add(r2, &c1, &c2); secp256k1_scalar_mul(r1, r2, &minus_lambda); secp256k1_scalar_add(r1, r1, a); } #endif #endif #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/scalar_low.h ================================================ /********************************************************************** * Copyright (c) 2015 Andrew Poelstra * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_SCALAR_REPR_ #define _SECP256K1_SCALAR_REPR_ #include /** A scalar modulo the group order of the secp256k1 curve. */ typedef uint32_t secp256k1_scalar; #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/scalar_low_impl.h ================================================ /********************************************************************** * Copyright (c) 2015 Andrew Poelstra * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_SCALAR_REPR_IMPL_H_ #define _SECP256K1_SCALAR_REPR_IMPL_H_ #include "scalar.h" #include SECP256K1_INLINE static int secp256k1_scalar_is_even(const secp256k1_scalar *a) { return !(*a & 1); } SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar *r) { *r = 0; } SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v) { *r = v; } SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count) { if (offset < 32) return ((*a >> offset) & ((((uint32_t)1) << count) - 1)); else return 0; } SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count) { return secp256k1_scalar_get_bits(a, offset, count); } SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar *a) { return *a >= EXHAUSTIVE_TEST_ORDER; } static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) { *r = (*a + *b) % EXHAUSTIVE_TEST_ORDER; return *r < *b; } static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag) { if (flag && bit < 32) *r += (1 << bit); #ifdef VERIFY VERIFY_CHECK(secp256k1_scalar_check_overflow(r) == 0); #endif } static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b32, int *overflow) { const int base = 0x100 % EXHAUSTIVE_TEST_ORDER; int i; *r = 0; for (i = 0; i < 32; i++) { *r = ((*r * base) + b32[i]) % EXHAUSTIVE_TEST_ORDER; } /* just deny overflow, it basically always happens */ if (overflow) *overflow = 0; } static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a) { memset(bin, 0, 32); bin[28] = *a >> 24; bin[29] = *a >> 16; bin[30] = *a >> 8; bin[31] = *a; } SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar *a) { return *a == 0; } static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a) { if (*a == 0) { *r = 0; } else { *r = EXHAUSTIVE_TEST_ORDER - *a; } } SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar *a) { return *a == 1; } static int secp256k1_scalar_is_high(const secp256k1_scalar *a) { return *a > EXHAUSTIVE_TEST_ORDER / 2; } static int secp256k1_scalar_cond_negate(secp256k1_scalar *r, int flag) { if (flag) secp256k1_scalar_negate(r, r); return flag ? -1 : 1; } static void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) { *r = (*a * *b) % EXHAUSTIVE_TEST_ORDER; } static int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n) { int ret; VERIFY_CHECK(n > 0); VERIFY_CHECK(n < 16); ret = *r & ((1 << n) - 1); *r >>= n; return ret; } static void secp256k1_scalar_sqr(secp256k1_scalar *r, const secp256k1_scalar *a) { *r = (*a * *a) % EXHAUSTIVE_TEST_ORDER; } static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) { *r1 = *a; *r2 = 0; } SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b) { return *a == *b; } #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/secp256k1.c ================================================ /********************************************************************** * Copyright (c) 2013-2015 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #include "include/secp256k1.h" #include "util.h" #include "num_impl.h" #include "field_impl.h" #include "scalar_impl.h" #include "group_impl.h" #include "ecmult_impl.h" #include "ecmult_const_impl.h" #include "ecmult_gen_impl.h" #include "ecdsa_impl.h" #include "eckey_impl.h" #include "hash_impl.h" #define ARG_CHECK(cond) do { \ if (EXPECT(!(cond), 0)) { \ secp256k1_callback_call(&ctx->illegal_callback, #cond); \ return 0; \ } \ } while(0) static void default_illegal_callback_fn(const char* str, void* data) { (void)data; fprintf(stderr, "[libsecp256k1] illegal argument: %s\n", str); abort(); } static const secp256k1_callback default_illegal_callback = { default_illegal_callback_fn, NULL }; static void default_error_callback_fn(const char* str, void* data) { (void)data; fprintf(stderr, "[libsecp256k1] internal consistency check failed: %s\n", str); abort(); } static const secp256k1_callback default_error_callback = { default_error_callback_fn, NULL }; struct secp256k1_context_struct { secp256k1_ecmult_context ecmult_ctx; secp256k1_ecmult_gen_context ecmult_gen_ctx; secp256k1_callback illegal_callback; secp256k1_callback error_callback; }; secp256k1_context* secp256k1_context_create(unsigned int flags) { secp256k1_context* ret = (secp256k1_context*)checked_malloc(&default_error_callback, sizeof(secp256k1_context)); ret->illegal_callback = default_illegal_callback; ret->error_callback = default_error_callback; if (EXPECT((flags & SECP256K1_FLAGS_TYPE_MASK) != SECP256K1_FLAGS_TYPE_CONTEXT, 0)) { secp256k1_callback_call(&ret->illegal_callback, "Invalid flags"); free(ret); return NULL; } secp256k1_ecmult_context_init(&ret->ecmult_ctx); secp256k1_ecmult_gen_context_init(&ret->ecmult_gen_ctx); if (flags & SECP256K1_FLAGS_BIT_CONTEXT_SIGN) { secp256k1_ecmult_gen_context_build(&ret->ecmult_gen_ctx, &ret->error_callback); } if (flags & SECP256K1_FLAGS_BIT_CONTEXT_VERIFY) { secp256k1_ecmult_context_build(&ret->ecmult_ctx, &ret->error_callback); } return ret; } secp256k1_context* secp256k1_context_clone(const secp256k1_context* ctx) { secp256k1_context* ret = (secp256k1_context*)checked_malloc(&ctx->error_callback, sizeof(secp256k1_context)); ret->illegal_callback = ctx->illegal_callback; ret->error_callback = ctx->error_callback; secp256k1_ecmult_context_clone(&ret->ecmult_ctx, &ctx->ecmult_ctx, &ctx->error_callback); secp256k1_ecmult_gen_context_clone(&ret->ecmult_gen_ctx, &ctx->ecmult_gen_ctx, &ctx->error_callback); return ret; } void secp256k1_context_destroy(secp256k1_context* ctx) { if (ctx != NULL) { secp256k1_ecmult_context_clear(&ctx->ecmult_ctx); secp256k1_ecmult_gen_context_clear(&ctx->ecmult_gen_ctx); free(ctx); } } void secp256k1_context_set_illegal_callback(secp256k1_context* ctx, void (*fun)(const char* message, void* data), const void* data) { if (fun == NULL) { fun = default_illegal_callback_fn; } ctx->illegal_callback.fn = fun; ctx->illegal_callback.data = data; } void secp256k1_context_set_error_callback(secp256k1_context* ctx, void (*fun)(const char* message, void* data), const void* data) { if (fun == NULL) { fun = default_error_callback_fn; } ctx->error_callback.fn = fun; ctx->error_callback.data = data; } static int secp256k1_pubkey_load(const secp256k1_context* ctx, secp256k1_ge* ge, const secp256k1_pubkey* pubkey) { if (sizeof(secp256k1_ge_storage) == 64) { /* When the secp256k1_ge_storage type is exactly 64 byte, use its * representation inside secp256k1_pubkey, as conversion is very fast. * Note that secp256k1_pubkey_save must use the same representation. */ secp256k1_ge_storage s; memcpy(&s, &pubkey->data[0], 64); secp256k1_ge_from_storage(ge, &s); } else { /* Otherwise, fall back to 32-byte big endian for X and Y. */ secp256k1_fe x, y; secp256k1_fe_set_b32(&x, pubkey->data); secp256k1_fe_set_b32(&y, pubkey->data + 32); secp256k1_ge_set_xy(ge, &x, &y); } ARG_CHECK(!secp256k1_fe_is_zero(&ge->x)); return 1; } static void secp256k1_pubkey_save(secp256k1_pubkey* pubkey, secp256k1_ge* ge) { if (sizeof(secp256k1_ge_storage) == 64) { secp256k1_ge_storage s; secp256k1_ge_to_storage(&s, ge); memcpy(&pubkey->data[0], &s, 64); } else { VERIFY_CHECK(!secp256k1_ge_is_infinity(ge)); secp256k1_fe_normalize_var(&ge->x); secp256k1_fe_normalize_var(&ge->y); secp256k1_fe_get_b32(pubkey->data, &ge->x); secp256k1_fe_get_b32(pubkey->data + 32, &ge->y); } } int secp256k1_ec_pubkey_parse(const secp256k1_context* ctx, secp256k1_pubkey* pubkey, const unsigned char *input, size_t inputlen) { secp256k1_ge Q; VERIFY_CHECK(ctx != NULL); ARG_CHECK(pubkey != NULL); memset(pubkey, 0, sizeof(*pubkey)); ARG_CHECK(input != NULL); if (!secp256k1_eckey_pubkey_parse(&Q, input, inputlen)) { return 0; } secp256k1_pubkey_save(pubkey, &Q); secp256k1_ge_clear(&Q); return 1; } int secp256k1_ec_pubkey_serialize(const secp256k1_context* ctx, unsigned char *output, size_t *outputlen, const secp256k1_pubkey* pubkey, unsigned int flags) { secp256k1_ge Q; size_t len; int ret = 0; VERIFY_CHECK(ctx != NULL); ARG_CHECK(outputlen != NULL); ARG_CHECK(*outputlen >= ((flags & SECP256K1_FLAGS_BIT_COMPRESSION) ? 33 : 65)); len = *outputlen; *outputlen = 0; ARG_CHECK(output != NULL); memset(output, 0, len); ARG_CHECK(pubkey != NULL); ARG_CHECK((flags & SECP256K1_FLAGS_TYPE_MASK) == SECP256K1_FLAGS_TYPE_COMPRESSION); if (secp256k1_pubkey_load(ctx, &Q, pubkey)) { ret = secp256k1_eckey_pubkey_serialize(&Q, output, &len, flags & SECP256K1_FLAGS_BIT_COMPRESSION); if (ret) { *outputlen = len; } } return ret; } static void secp256k1_ecdsa_signature_load(const secp256k1_context* ctx, secp256k1_scalar* r, secp256k1_scalar* s, const secp256k1_ecdsa_signature* sig) { (void)ctx; if (sizeof(secp256k1_scalar) == 32) { /* When the secp256k1_scalar type is exactly 32 byte, use its * representation inside secp256k1_ecdsa_signature, as conversion is very fast. * Note that secp256k1_ecdsa_signature_save must use the same representation. */ memcpy(r, &sig->data[0], 32); memcpy(s, &sig->data[32], 32); } else { secp256k1_scalar_set_b32(r, &sig->data[0], NULL); secp256k1_scalar_set_b32(s, &sig->data[32], NULL); } } static void secp256k1_ecdsa_signature_save(secp256k1_ecdsa_signature* sig, const secp256k1_scalar* r, const secp256k1_scalar* s) { if (sizeof(secp256k1_scalar) == 32) { memcpy(&sig->data[0], r, 32); memcpy(&sig->data[32], s, 32); } else { secp256k1_scalar_get_b32(&sig->data[0], r); secp256k1_scalar_get_b32(&sig->data[32], s); } } int secp256k1_ecdsa_signature_parse_der(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const unsigned char *input, size_t inputlen) { secp256k1_scalar r, s; VERIFY_CHECK(ctx != NULL); ARG_CHECK(sig != NULL); ARG_CHECK(input != NULL); if (secp256k1_ecdsa_sig_parse(&r, &s, input, inputlen)) { secp256k1_ecdsa_signature_save(sig, &r, &s); return 1; } else { memset(sig, 0, sizeof(*sig)); return 0; } } int secp256k1_ecdsa_signature_parse_compact(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const unsigned char *input64) { secp256k1_scalar r, s; int ret = 1; int overflow = 0; VERIFY_CHECK(ctx != NULL); ARG_CHECK(sig != NULL); ARG_CHECK(input64 != NULL); secp256k1_scalar_set_b32(&r, &input64[0], &overflow); ret &= !overflow; secp256k1_scalar_set_b32(&s, &input64[32], &overflow); ret &= !overflow; if (ret) { secp256k1_ecdsa_signature_save(sig, &r, &s); } else { memset(sig, 0, sizeof(*sig)); } return ret; } int secp256k1_ecdsa_signature_serialize_der(const secp256k1_context* ctx, unsigned char *output, size_t *outputlen, const secp256k1_ecdsa_signature* sig) { secp256k1_scalar r, s; VERIFY_CHECK(ctx != NULL); ARG_CHECK(output != NULL); ARG_CHECK(outputlen != NULL); ARG_CHECK(sig != NULL); secp256k1_ecdsa_signature_load(ctx, &r, &s, sig); return secp256k1_ecdsa_sig_serialize(output, outputlen, &r, &s); } int secp256k1_ecdsa_signature_serialize_compact(const secp256k1_context* ctx, unsigned char *output64, const secp256k1_ecdsa_signature* sig) { secp256k1_scalar r, s; VERIFY_CHECK(ctx != NULL); ARG_CHECK(output64 != NULL); ARG_CHECK(sig != NULL); secp256k1_ecdsa_signature_load(ctx, &r, &s, sig); secp256k1_scalar_get_b32(&output64[0], &r); secp256k1_scalar_get_b32(&output64[32], &s); return 1; } int secp256k1_ecdsa_signature_normalize(const secp256k1_context* ctx, secp256k1_ecdsa_signature *sigout, const secp256k1_ecdsa_signature *sigin) { secp256k1_scalar r, s; int ret = 0; VERIFY_CHECK(ctx != NULL); ARG_CHECK(sigin != NULL); secp256k1_ecdsa_signature_load(ctx, &r, &s, sigin); ret = secp256k1_scalar_is_high(&s); if (sigout != NULL) { if (ret) { secp256k1_scalar_negate(&s, &s); } secp256k1_ecdsa_signature_save(sigout, &r, &s); } return ret; } int secp256k1_ecdsa_verify(const secp256k1_context* ctx, const secp256k1_ecdsa_signature *sig, const unsigned char *msg32, const secp256k1_pubkey *pubkey) { secp256k1_ge q; secp256k1_scalar r, s; secp256k1_scalar m; VERIFY_CHECK(ctx != NULL); ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); ARG_CHECK(msg32 != NULL); ARG_CHECK(sig != NULL); ARG_CHECK(pubkey != NULL); secp256k1_scalar_set_b32(&m, msg32, NULL); secp256k1_ecdsa_signature_load(ctx, &r, &s, sig); return (!secp256k1_scalar_is_high(&s) && secp256k1_pubkey_load(ctx, &q, pubkey) && secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &r, &s, &q, &m)); } static int nonce_function_rfc6979(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) { unsigned char keydata[112]; int keylen = 64; secp256k1_rfc6979_hmac_sha256_t rng; unsigned int i; /* We feed a byte array to the PRNG as input, consisting of: * - the private key (32 bytes) and message (32 bytes), see RFC 6979 3.2d. * - optionally 32 extra bytes of data, see RFC 6979 3.6 Additional Data. * - optionally 16 extra bytes with the algorithm name. * Because the arguments have distinct fixed lengths it is not possible for * different argument mixtures to emulate each other and result in the same * nonces. */ memcpy(keydata, key32, 32); memcpy(keydata + 32, msg32, 32); if (data != NULL) { memcpy(keydata + 64, data, 32); keylen = 96; } if (algo16 != NULL) { memcpy(keydata + keylen, algo16, 16); keylen += 16; } secp256k1_rfc6979_hmac_sha256_initialize(&rng, keydata, keylen); memset(keydata, 0, sizeof(keydata)); for (i = 0; i <= counter; i++) { secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32); } secp256k1_rfc6979_hmac_sha256_finalize(&rng); return 1; } const secp256k1_nonce_function secp256k1_nonce_function_rfc6979 = nonce_function_rfc6979; const secp256k1_nonce_function secp256k1_nonce_function_default = nonce_function_rfc6979; int secp256k1_ecdsa_sign(const secp256k1_context* ctx, secp256k1_ecdsa_signature *signature, const unsigned char *msg32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void* noncedata) { secp256k1_scalar r, s; secp256k1_scalar sec, non, msg; int ret = 0; int overflow = 0; VERIFY_CHECK(ctx != NULL); ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); ARG_CHECK(msg32 != NULL); ARG_CHECK(signature != NULL); ARG_CHECK(seckey != NULL); if (noncefp == NULL) { noncefp = secp256k1_nonce_function_default; } secp256k1_scalar_set_b32(&sec, seckey, &overflow); /* Fail if the secret key is invalid. */ if (!overflow && !secp256k1_scalar_is_zero(&sec)) { unsigned char nonce32[32]; unsigned int count = 0; secp256k1_scalar_set_b32(&msg, msg32, NULL); while (1) { ret = noncefp(nonce32, msg32, seckey, NULL, (void*)noncedata, count); if (!ret) { break; } secp256k1_scalar_set_b32(&non, nonce32, &overflow); if (!overflow && !secp256k1_scalar_is_zero(&non)) { if (secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, &r, &s, &sec, &msg, &non, NULL)) { break; } } count++; } memset(nonce32, 0, 32); secp256k1_scalar_clear(&msg); secp256k1_scalar_clear(&non); secp256k1_scalar_clear(&sec); } if (ret) { secp256k1_ecdsa_signature_save(signature, &r, &s); } else { memset(signature, 0, sizeof(*signature)); } return ret; } int secp256k1_ec_seckey_verify(const secp256k1_context* ctx, const unsigned char *seckey) { secp256k1_scalar sec; int ret; int overflow; VERIFY_CHECK(ctx != NULL); ARG_CHECK(seckey != NULL); secp256k1_scalar_set_b32(&sec, seckey, &overflow); ret = !overflow && !secp256k1_scalar_is_zero(&sec); secp256k1_scalar_clear(&sec); return ret; } int secp256k1_ec_pubkey_create(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *seckey) { secp256k1_gej pj; secp256k1_ge p; secp256k1_scalar sec; int overflow; int ret = 0; VERIFY_CHECK(ctx != NULL); ARG_CHECK(pubkey != NULL); memset(pubkey, 0, sizeof(*pubkey)); ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); ARG_CHECK(seckey != NULL); secp256k1_scalar_set_b32(&sec, seckey, &overflow); ret = (!overflow) & (!secp256k1_scalar_is_zero(&sec)); if (ret) { secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pj, &sec); secp256k1_ge_set_gej(&p, &pj); secp256k1_pubkey_save(pubkey, &p); } secp256k1_scalar_clear(&sec); return ret; } int secp256k1_ec_privkey_tweak_add(const secp256k1_context* ctx, unsigned char *seckey, const unsigned char *tweak) { secp256k1_scalar term; secp256k1_scalar sec; int ret = 0; int overflow = 0; VERIFY_CHECK(ctx != NULL); ARG_CHECK(seckey != NULL); ARG_CHECK(tweak != NULL); secp256k1_scalar_set_b32(&term, tweak, &overflow); secp256k1_scalar_set_b32(&sec, seckey, NULL); ret = !overflow && secp256k1_eckey_privkey_tweak_add(&sec, &term); memset(seckey, 0, 32); if (ret) { secp256k1_scalar_get_b32(seckey, &sec); } secp256k1_scalar_clear(&sec); secp256k1_scalar_clear(&term); return ret; } int secp256k1_ec_pubkey_tweak_add(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *tweak) { secp256k1_ge p; secp256k1_scalar term; int ret = 0; int overflow = 0; VERIFY_CHECK(ctx != NULL); ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); ARG_CHECK(pubkey != NULL); ARG_CHECK(tweak != NULL); secp256k1_scalar_set_b32(&term, tweak, &overflow); ret = !overflow && secp256k1_pubkey_load(ctx, &p, pubkey); memset(pubkey, 0, sizeof(*pubkey)); if (ret) { if (secp256k1_eckey_pubkey_tweak_add(&ctx->ecmult_ctx, &p, &term)) { secp256k1_pubkey_save(pubkey, &p); } else { ret = 0; } } return ret; } int secp256k1_ec_privkey_tweak_mul(const secp256k1_context* ctx, unsigned char *seckey, const unsigned char *tweak) { secp256k1_scalar factor; secp256k1_scalar sec; int ret = 0; int overflow = 0; VERIFY_CHECK(ctx != NULL); ARG_CHECK(seckey != NULL); ARG_CHECK(tweak != NULL); secp256k1_scalar_set_b32(&factor, tweak, &overflow); secp256k1_scalar_set_b32(&sec, seckey, NULL); ret = !overflow && secp256k1_eckey_privkey_tweak_mul(&sec, &factor); memset(seckey, 0, 32); if (ret) { secp256k1_scalar_get_b32(seckey, &sec); } secp256k1_scalar_clear(&sec); secp256k1_scalar_clear(&factor); return ret; } int secp256k1_ec_pubkey_tweak_mul(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *tweak) { secp256k1_ge p; secp256k1_scalar factor; int ret = 0; int overflow = 0; VERIFY_CHECK(ctx != NULL); ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); ARG_CHECK(pubkey != NULL); ARG_CHECK(tweak != NULL); secp256k1_scalar_set_b32(&factor, tweak, &overflow); ret = !overflow && secp256k1_pubkey_load(ctx, &p, pubkey); memset(pubkey, 0, sizeof(*pubkey)); if (ret) { if (secp256k1_eckey_pubkey_tweak_mul(&ctx->ecmult_ctx, &p, &factor)) { secp256k1_pubkey_save(pubkey, &p); } else { ret = 0; } } return ret; } int secp256k1_context_randomize(secp256k1_context* ctx, const unsigned char *seed32) { VERIFY_CHECK(ctx != NULL); ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, seed32); return 1; } int secp256k1_ec_pubkey_combine(const secp256k1_context* ctx, secp256k1_pubkey *pubnonce, const secp256k1_pubkey * const *pubnonces, size_t n) { size_t i; secp256k1_gej Qj; secp256k1_ge Q; ARG_CHECK(pubnonce != NULL); memset(pubnonce, 0, sizeof(*pubnonce)); ARG_CHECK(n >= 1); ARG_CHECK(pubnonces != NULL); secp256k1_gej_set_infinity(&Qj); for (i = 0; i < n; i++) { secp256k1_pubkey_load(ctx, &Q, pubnonces[i]); secp256k1_gej_add_ge(&Qj, &Qj, &Q); } if (secp256k1_gej_is_infinity(&Qj)) { return 0; } secp256k1_ge_set_gej(&Q, &Qj); secp256k1_pubkey_save(pubnonce, &Q); return 1; } #ifdef ENABLE_MODULE_ECDH # include "modules/ecdh/main_impl.h" #endif #ifdef ENABLE_MODULE_SCHNORR # include "modules/schnorr/main_impl.h" #endif #ifdef ENABLE_MODULE_RECOVERY # include "modules/recovery/main_impl.h" #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/testrand.h ================================================ /********************************************************************** * Copyright (c) 2013, 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_TESTRAND_H_ #define _SECP256K1_TESTRAND_H_ #if defined HAVE_CONFIG_H #include "libsecp256k1-config.h" #endif /* A non-cryptographic RNG used only for test infrastructure. */ /** Seed the pseudorandom number generator for testing. */ SECP256K1_INLINE static void secp256k1_rand_seed(const unsigned char *seed16); /** Generate a pseudorandom number in the range [0..2**32-1]. */ static uint32_t secp256k1_rand32(void); /** Generate a pseudorandom number in the range [0..2**bits-1]. Bits must be 1 or * more. */ static uint32_t secp256k1_rand_bits(int bits); /** Generate a pseudorandom number in the range [0..range-1]. */ static uint32_t secp256k1_rand_int(uint32_t range); /** Generate a pseudorandom 32-byte array. */ static void secp256k1_rand256(unsigned char *b32); /** Generate a pseudorandom 32-byte array with long sequences of zero and one bits. */ static void secp256k1_rand256_test(unsigned char *b32); /** Generate pseudorandom bytes with long sequences of zero and one bits. */ static void secp256k1_rand_bytes_test(unsigned char *bytes, size_t len); #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/testrand_impl.h ================================================ /********************************************************************** * Copyright (c) 2013-2015 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_TESTRAND_IMPL_H_ #define _SECP256K1_TESTRAND_IMPL_H_ #include #include #include "testrand.h" #include "hash.h" static secp256k1_rfc6979_hmac_sha256_t secp256k1_test_rng; static uint32_t secp256k1_test_rng_precomputed[8]; static int secp256k1_test_rng_precomputed_used = 8; static uint64_t secp256k1_test_rng_integer; static int secp256k1_test_rng_integer_bits_left = 0; SECP256K1_INLINE static void secp256k1_rand_seed(const unsigned char *seed16) { secp256k1_rfc6979_hmac_sha256_initialize(&secp256k1_test_rng, seed16, 16); } SECP256K1_INLINE static uint32_t secp256k1_rand32(void) { if (secp256k1_test_rng_precomputed_used == 8) { secp256k1_rfc6979_hmac_sha256_generate(&secp256k1_test_rng, (unsigned char*)(&secp256k1_test_rng_precomputed[0]), sizeof(secp256k1_test_rng_precomputed)); secp256k1_test_rng_precomputed_used = 0; } return secp256k1_test_rng_precomputed[secp256k1_test_rng_precomputed_used++]; } static uint32_t secp256k1_rand_bits(int bits) { uint32_t ret; if (secp256k1_test_rng_integer_bits_left < bits) { secp256k1_test_rng_integer |= (((uint64_t)secp256k1_rand32()) << secp256k1_test_rng_integer_bits_left); secp256k1_test_rng_integer_bits_left += 32; } ret = secp256k1_test_rng_integer; secp256k1_test_rng_integer >>= bits; secp256k1_test_rng_integer_bits_left -= bits; ret &= ((~((uint32_t)0)) >> (32 - bits)); return ret; } static uint32_t secp256k1_rand_int(uint32_t range) { /* We want a uniform integer between 0 and range-1, inclusive. * B is the smallest number such that range <= 2**B. * two mechanisms implemented here: * - generate B bits numbers until one below range is found, and return it * - find the largest multiple M of range that is <= 2**(B+A), generate B+A * bits numbers until one below M is found, and return it modulo range * The second mechanism consumes A more bits of entropy in every iteration, * but may need fewer iterations due to M being closer to 2**(B+A) then * range is to 2**B. The array below (indexed by B) contains a 0 when the * first mechanism is to be used, and the number A otherwise. */ static const int addbits[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 1, 0}; uint32_t trange, mult; int bits = 0; if (range <= 1) { return 0; } trange = range - 1; while (trange > 0) { trange >>= 1; bits++; } if (addbits[bits]) { bits = bits + addbits[bits]; mult = ((~((uint32_t)0)) >> (32 - bits)) / range; trange = range * mult; } else { trange = range; mult = 1; } while(1) { uint32_t x = secp256k1_rand_bits(bits); if (x < trange) { return (mult == 1) ? x : (x % range); } } } static void secp256k1_rand256(unsigned char *b32) { secp256k1_rfc6979_hmac_sha256_generate(&secp256k1_test_rng, b32, 32); } static void secp256k1_rand_bytes_test(unsigned char *bytes, size_t len) { size_t bits = 0; memset(bytes, 0, len); while (bits < len * 8) { int now; uint32_t val; now = 1 + (secp256k1_rand_bits(6) * secp256k1_rand_bits(5) + 16) / 31; val = secp256k1_rand_bits(1); while (now > 0 && bits < len * 8) { bytes[bits / 8] |= val << (bits % 8); now--; bits++; } } } static void secp256k1_rand256_test(unsigned char *b32) { secp256k1_rand_bytes_test(b32, 32); } #endif ================================================ FILE: crypto/secp256k1/libsecp256k1/src/tests.c ================================================ /********************************************************************** * Copyright (c) 2013, 2014, 2015 Pieter Wuille, Gregory Maxwell * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #if defined HAVE_CONFIG_H #include "libsecp256k1-config.h" #endif #include #include #include #include "secp256k1.c" #include "include/secp256k1.h" #include "testrand_impl.h" #ifdef ENABLE_OPENSSL_TESTS #include "openssl/bn.h" #include "openssl/ec.h" #include "openssl/ecdsa.h" #include "openssl/obj_mac.h" #endif #include "contrib/lax_der_parsing.c" #include "contrib/lax_der_privatekey_parsing.c" #if !defined(VG_CHECK) # if defined(VALGRIND) # include # define VG_UNDEF(x,y) VALGRIND_MAKE_MEM_UNDEFINED((x),(y)) # define VG_CHECK(x,y) VALGRIND_CHECK_MEM_IS_DEFINED((x),(y)) # else # define VG_UNDEF(x,y) # define VG_CHECK(x,y) # endif #endif static int count = 64; static secp256k1_context *ctx = NULL; static void counting_illegal_callback_fn(const char* str, void* data) { /* Dummy callback function that just counts. */ int32_t *p; (void)str; p = data; (*p)++; } static void uncounting_illegal_callback_fn(const char* str, void* data) { /* Dummy callback function that just counts (backwards). */ int32_t *p; (void)str; p = data; (*p)--; } void random_field_element_test(secp256k1_fe *fe) { do { unsigned char b32[32]; secp256k1_rand256_test(b32); if (secp256k1_fe_set_b32(fe, b32)) { break; } } while(1); } void random_field_element_magnitude(secp256k1_fe *fe) { secp256k1_fe zero; int n = secp256k1_rand_int(9); secp256k1_fe_normalize(fe); if (n == 0) { return; } secp256k1_fe_clear(&zero); secp256k1_fe_negate(&zero, &zero, 0); secp256k1_fe_mul_int(&zero, n - 1); secp256k1_fe_add(fe, &zero); VERIFY_CHECK(fe->magnitude == n); } void random_group_element_test(secp256k1_ge *ge) { secp256k1_fe fe; do { random_field_element_test(&fe); if (secp256k1_ge_set_xo_var(ge, &fe, secp256k1_rand_bits(1))) { secp256k1_fe_normalize(&ge->y); break; } } while(1); } void random_group_element_jacobian_test(secp256k1_gej *gej, const secp256k1_ge *ge) { secp256k1_fe z2, z3; do { random_field_element_test(&gej->z); if (!secp256k1_fe_is_zero(&gej->z)) { break; } } while(1); secp256k1_fe_sqr(&z2, &gej->z); secp256k1_fe_mul(&z3, &z2, &gej->z); secp256k1_fe_mul(&gej->x, &ge->x, &z2); secp256k1_fe_mul(&gej->y, &ge->y, &z3); gej->infinity = ge->infinity; } void random_scalar_order_test(secp256k1_scalar *num) { do { unsigned char b32[32]; int overflow = 0; secp256k1_rand256_test(b32); secp256k1_scalar_set_b32(num, b32, &overflow); if (overflow || secp256k1_scalar_is_zero(num)) { continue; } break; } while(1); } void random_scalar_order(secp256k1_scalar *num) { do { unsigned char b32[32]; int overflow = 0; secp256k1_rand256(b32); secp256k1_scalar_set_b32(num, b32, &overflow); if (overflow || secp256k1_scalar_is_zero(num)) { continue; } break; } while(1); } void run_context_tests(void) { secp256k1_pubkey pubkey; secp256k1_ecdsa_signature sig; unsigned char ctmp[32]; int32_t ecount; int32_t ecount2; secp256k1_context *none = secp256k1_context_create(SECP256K1_CONTEXT_NONE); secp256k1_context *sign = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); secp256k1_context *vrfy = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY); secp256k1_context *both = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); secp256k1_gej pubj; secp256k1_ge pub; secp256k1_scalar msg, key, nonce; secp256k1_scalar sigr, sigs; ecount = 0; ecount2 = 10; secp256k1_context_set_illegal_callback(vrfy, counting_illegal_callback_fn, &ecount); secp256k1_context_set_illegal_callback(sign, counting_illegal_callback_fn, &ecount2); secp256k1_context_set_error_callback(sign, counting_illegal_callback_fn, NULL); CHECK(vrfy->error_callback.fn != sign->error_callback.fn); /*** clone and destroy all of them to make sure cloning was complete ***/ { secp256k1_context *ctx_tmp; ctx_tmp = none; none = secp256k1_context_clone(none); secp256k1_context_destroy(ctx_tmp); ctx_tmp = sign; sign = secp256k1_context_clone(sign); secp256k1_context_destroy(ctx_tmp); ctx_tmp = vrfy; vrfy = secp256k1_context_clone(vrfy); secp256k1_context_destroy(ctx_tmp); ctx_tmp = both; both = secp256k1_context_clone(both); secp256k1_context_destroy(ctx_tmp); } /* Verify that the error callback makes it across the clone. */ CHECK(vrfy->error_callback.fn != sign->error_callback.fn); /* And that it resets back to default. */ secp256k1_context_set_error_callback(sign, NULL, NULL); CHECK(vrfy->error_callback.fn == sign->error_callback.fn); /*** attempt to use them ***/ random_scalar_order_test(&msg); random_scalar_order_test(&key); secp256k1_ecmult_gen(&both->ecmult_gen_ctx, &pubj, &key); secp256k1_ge_set_gej(&pub, &pubj); /* Verify context-type checking illegal-argument errors. */ memset(ctmp, 1, 32); CHECK(secp256k1_ec_pubkey_create(vrfy, &pubkey, ctmp) == 0); CHECK(ecount == 1); VG_UNDEF(&pubkey, sizeof(pubkey)); CHECK(secp256k1_ec_pubkey_create(sign, &pubkey, ctmp) == 1); VG_CHECK(&pubkey, sizeof(pubkey)); CHECK(secp256k1_ecdsa_sign(vrfy, &sig, ctmp, ctmp, NULL, NULL) == 0); CHECK(ecount == 2); VG_UNDEF(&sig, sizeof(sig)); CHECK(secp256k1_ecdsa_sign(sign, &sig, ctmp, ctmp, NULL, NULL) == 1); VG_CHECK(&sig, sizeof(sig)); CHECK(ecount2 == 10); CHECK(secp256k1_ecdsa_verify(sign, &sig, ctmp, &pubkey) == 0); CHECK(ecount2 == 11); CHECK(secp256k1_ecdsa_verify(vrfy, &sig, ctmp, &pubkey) == 1); CHECK(ecount == 2); CHECK(secp256k1_ec_pubkey_tweak_add(sign, &pubkey, ctmp) == 0); CHECK(ecount2 == 12); CHECK(secp256k1_ec_pubkey_tweak_add(vrfy, &pubkey, ctmp) == 1); CHECK(ecount == 2); CHECK(secp256k1_ec_pubkey_tweak_mul(sign, &pubkey, ctmp) == 0); CHECK(ecount2 == 13); CHECK(secp256k1_ec_pubkey_tweak_mul(vrfy, &pubkey, ctmp) == 1); CHECK(ecount == 2); CHECK(secp256k1_context_randomize(vrfy, ctmp) == 0); CHECK(ecount == 3); CHECK(secp256k1_context_randomize(sign, NULL) == 1); CHECK(ecount2 == 13); secp256k1_context_set_illegal_callback(vrfy, NULL, NULL); secp256k1_context_set_illegal_callback(sign, NULL, NULL); /* This shouldn't leak memory, due to already-set tests. */ secp256k1_ecmult_gen_context_build(&sign->ecmult_gen_ctx, NULL); secp256k1_ecmult_context_build(&vrfy->ecmult_ctx, NULL); /* obtain a working nonce */ do { random_scalar_order_test(&nonce); } while(!secp256k1_ecdsa_sig_sign(&both->ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &nonce, NULL)); /* try signing */ CHECK(secp256k1_ecdsa_sig_sign(&sign->ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &nonce, NULL)); CHECK(secp256k1_ecdsa_sig_sign(&both->ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &nonce, NULL)); /* try verifying */ CHECK(secp256k1_ecdsa_sig_verify(&vrfy->ecmult_ctx, &sigr, &sigs, &pub, &msg)); CHECK(secp256k1_ecdsa_sig_verify(&both->ecmult_ctx, &sigr, &sigs, &pub, &msg)); /* cleanup */ secp256k1_context_destroy(none); secp256k1_context_destroy(sign); secp256k1_context_destroy(vrfy); secp256k1_context_destroy(both); /* Defined as no-op. */ secp256k1_context_destroy(NULL); } /***** HASH TESTS *****/ void run_sha256_tests(void) { static const char *inputs[8] = { "", "abc", "message digest", "secure hash algorithm", "SHA256 is considered to be safe", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", "For this sample, this 63-byte string will be used as input data", "This is exactly 64 bytes long, not counting the terminating byte" }; static const unsigned char outputs[8][32] = { {0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55}, {0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23, 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c, 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad}, {0xf7, 0x84, 0x6f, 0x55, 0xcf, 0x23, 0xe1, 0x4e, 0xeb, 0xea, 0xb5, 0xb4, 0xe1, 0x55, 0x0c, 0xad, 0x5b, 0x50, 0x9e, 0x33, 0x48, 0xfb, 0xc4, 0xef, 0xa3, 0xa1, 0x41, 0x3d, 0x39, 0x3c, 0xb6, 0x50}, {0xf3, 0x0c, 0xeb, 0x2b, 0xb2, 0x82, 0x9e, 0x79, 0xe4, 0xca, 0x97, 0x53, 0xd3, 0x5a, 0x8e, 0xcc, 0x00, 0x26, 0x2d, 0x16, 0x4c, 0xc0, 0x77, 0x08, 0x02, 0x95, 0x38, 0x1c, 0xbd, 0x64, 0x3f, 0x0d}, {0x68, 0x19, 0xd9, 0x15, 0xc7, 0x3f, 0x4d, 0x1e, 0x77, 0xe4, 0xe1, 0xb5, 0x2d, 0x1f, 0xa0, 0xf9, 0xcf, 0x9b, 0xea, 0xea, 0xd3, 0x93, 0x9f, 0x15, 0x87, 0x4b, 0xd9, 0x88, 0xe2, 0xa2, 0x36, 0x30}, {0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8, 0xe5, 0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39, 0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67, 0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1}, {0xf0, 0x8a, 0x78, 0xcb, 0xba, 0xee, 0x08, 0x2b, 0x05, 0x2a, 0xe0, 0x70, 0x8f, 0x32, 0xfa, 0x1e, 0x50, 0xc5, 0xc4, 0x21, 0xaa, 0x77, 0x2b, 0xa5, 0xdb, 0xb4, 0x06, 0xa2, 0xea, 0x6b, 0xe3, 0x42}, {0xab, 0x64, 0xef, 0xf7, 0xe8, 0x8e, 0x2e, 0x46, 0x16, 0x5e, 0x29, 0xf2, 0xbc, 0xe4, 0x18, 0x26, 0xbd, 0x4c, 0x7b, 0x35, 0x52, 0xf6, 0xb3, 0x82, 0xa9, 0xe7, 0xd3, 0xaf, 0x47, 0xc2, 0x45, 0xf8} }; int i; for (i = 0; i < 8; i++) { unsigned char out[32]; secp256k1_sha256_t hasher; secp256k1_sha256_initialize(&hasher); secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i]), strlen(inputs[i])); secp256k1_sha256_finalize(&hasher, out); CHECK(memcmp(out, outputs[i], 32) == 0); if (strlen(inputs[i]) > 0) { int split = secp256k1_rand_int(strlen(inputs[i])); secp256k1_sha256_initialize(&hasher); secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i]), split); secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i] + split), strlen(inputs[i]) - split); secp256k1_sha256_finalize(&hasher, out); CHECK(memcmp(out, outputs[i], 32) == 0); } } } void run_hmac_sha256_tests(void) { static const char *keys[6] = { "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", "\x4a\x65\x66\x65", "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19", "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa" }; static const char *inputs[6] = { "\x48\x69\x20\x54\x68\x65\x72\x65", "\x77\x68\x61\x74\x20\x64\x6f\x20\x79\x61\x20\x77\x61\x6e\x74\x20\x66\x6f\x72\x20\x6e\x6f\x74\x68\x69\x6e\x67\x3f", "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd", "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd", "\x54\x65\x73\x74\x20\x55\x73\x69\x6e\x67\x20\x4c\x61\x72\x67\x65\x72\x20\x54\x68\x61\x6e\x20\x42\x6c\x6f\x63\x6b\x2d\x53\x69\x7a\x65\x20\x4b\x65\x79\x20\x2d\x20\x48\x61\x73\x68\x20\x4b\x65\x79\x20\x46\x69\x72\x73\x74", "\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x74\x65\x73\x74\x20\x75\x73\x69\x6e\x67\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b\x2d\x73\x69\x7a\x65\x20\x6b\x65\x79\x20\x61\x6e\x64\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b\x2d\x73\x69\x7a\x65\x20\x64\x61\x74\x61\x2e\x20\x54\x68\x65\x20\x6b\x65\x79\x20\x6e\x65\x65\x64\x73\x20\x74\x6f\x20\x62\x65\x20\x68\x61\x73\x68\x65\x64\x20\x62\x65\x66\x6f\x72\x65\x20\x62\x65\x69\x6e\x67\x20\x75\x73\x65\x64\x20\x62\x79\x20\x74\x68\x65\x20\x48\x4d\x41\x43\x20\x61\x6c\x67\x6f\x72\x69\x74\x68\x6d\x2e" }; static const unsigned char outputs[6][32] = { {0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf, 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83, 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7}, {0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27, 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43}, {0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8, 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8, 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe}, {0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81, 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78, 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b}, {0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26, 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28, 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54}, {0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f, 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07, 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2} }; int i; for (i = 0; i < 6; i++) { secp256k1_hmac_sha256_t hasher; unsigned char out[32]; secp256k1_hmac_sha256_initialize(&hasher, (const unsigned char*)(keys[i]), strlen(keys[i])); secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i]), strlen(inputs[i])); secp256k1_hmac_sha256_finalize(&hasher, out); CHECK(memcmp(out, outputs[i], 32) == 0); if (strlen(inputs[i]) > 0) { int split = secp256k1_rand_int(strlen(inputs[i])); secp256k1_hmac_sha256_initialize(&hasher, (const unsigned char*)(keys[i]), strlen(keys[i])); secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i]), split); secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i] + split), strlen(inputs[i]) - split); secp256k1_hmac_sha256_finalize(&hasher, out); CHECK(memcmp(out, outputs[i], 32) == 0); } } } void run_rfc6979_hmac_sha256_tests(void) { static const unsigned char key1[65] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x00, 0x4b, 0xf5, 0x12, 0x2f, 0x34, 0x45, 0x54, 0xc5, 0x3b, 0xde, 0x2e, 0xbb, 0x8c, 0xd2, 0xb7, 0xe3, 0xd1, 0x60, 0x0a, 0xd6, 0x31, 0xc3, 0x85, 0xa5, 0xd7, 0xcc, 0xe2, 0x3c, 0x77, 0x85, 0x45, 0x9a, 0}; static const unsigned char out1[3][32] = { {0x4f, 0xe2, 0x95, 0x25, 0xb2, 0x08, 0x68, 0x09, 0x15, 0x9a, 0xcd, 0xf0, 0x50, 0x6e, 0xfb, 0x86, 0xb0, 0xec, 0x93, 0x2c, 0x7b, 0xa4, 0x42, 0x56, 0xab, 0x32, 0x1e, 0x42, 0x1e, 0x67, 0xe9, 0xfb}, {0x2b, 0xf0, 0xff, 0xf1, 0xd3, 0xc3, 0x78, 0xa2, 0x2d, 0xc5, 0xde, 0x1d, 0x85, 0x65, 0x22, 0x32, 0x5c, 0x65, 0xb5, 0x04, 0x49, 0x1a, 0x0c, 0xbd, 0x01, 0xcb, 0x8f, 0x3a, 0xa6, 0x7f, 0xfd, 0x4a}, {0xf5, 0x28, 0xb4, 0x10, 0xcb, 0x54, 0x1f, 0x77, 0x00, 0x0d, 0x7a, 0xfb, 0x6c, 0x5b, 0x53, 0xc5, 0xc4, 0x71, 0xea, 0xb4, 0x3e, 0x46, 0x6d, 0x9a, 0xc5, 0x19, 0x0c, 0x39, 0xc8, 0x2f, 0xd8, 0x2e} }; static const unsigned char key2[64] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55}; static const unsigned char out2[3][32] = { {0x9c, 0x23, 0x6c, 0x16, 0x5b, 0x82, 0xae, 0x0c, 0xd5, 0x90, 0x65, 0x9e, 0x10, 0x0b, 0x6b, 0xab, 0x30, 0x36, 0xe7, 0xba, 0x8b, 0x06, 0x74, 0x9b, 0xaf, 0x69, 0x81, 0xe1, 0x6f, 0x1a, 0x2b, 0x95}, {0xdf, 0x47, 0x10, 0x61, 0x62, 0x5b, 0xc0, 0xea, 0x14, 0xb6, 0x82, 0xfe, 0xee, 0x2c, 0x9c, 0x02, 0xf2, 0x35, 0xda, 0x04, 0x20, 0x4c, 0x1d, 0x62, 0xa1, 0x53, 0x6c, 0x6e, 0x17, 0xae, 0xd7, 0xa9}, {0x75, 0x97, 0x88, 0x7c, 0xbd, 0x76, 0x32, 0x1f, 0x32, 0xe3, 0x04, 0x40, 0x67, 0x9a, 0x22, 0xcf, 0x7f, 0x8d, 0x9d, 0x2e, 0xac, 0x39, 0x0e, 0x58, 0x1f, 0xea, 0x09, 0x1c, 0xe2, 0x02, 0xba, 0x94} }; secp256k1_rfc6979_hmac_sha256_t rng; unsigned char out[32]; int i; secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 64); for (i = 0; i < 3; i++) { secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32); CHECK(memcmp(out, out1[i], 32) == 0); } secp256k1_rfc6979_hmac_sha256_finalize(&rng); secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 65); for (i = 0; i < 3; i++) { secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32); CHECK(memcmp(out, out1[i], 32) != 0); } secp256k1_rfc6979_hmac_sha256_finalize(&rng); secp256k1_rfc6979_hmac_sha256_initialize(&rng, key2, 64); for (i = 0; i < 3; i++) { secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32); CHECK(memcmp(out, out2[i], 32) == 0); } secp256k1_rfc6979_hmac_sha256_finalize(&rng); } /***** RANDOM TESTS *****/ void test_rand_bits(int rand32, int bits) { /* (1-1/2^B)^rounds[B] < 1/10^9, so rounds is the number of iterations to * get a false negative chance below once in a billion */ static const unsigned int rounds[7] = {1, 30, 73, 156, 322, 653, 1316}; /* We try multiplying the results with various odd numbers, which shouldn't * influence the uniform distribution modulo a power of 2. */ static const uint32_t mults[6] = {1, 3, 21, 289, 0x9999, 0x80402011}; /* We only select up to 6 bits from the output to analyse */ unsigned int usebits = bits > 6 ? 6 : bits; unsigned int maxshift = bits - usebits; /* For each of the maxshift+1 usebits-bit sequences inside a bits-bit number, track all observed outcomes, one per bit in a uint64_t. */ uint64_t x[6][27] = {{0}}; unsigned int i, shift, m; /* Multiply the output of all rand calls with the odd number m, which should not change the uniformity of its distribution. */ for (i = 0; i < rounds[usebits]; i++) { uint32_t r = (rand32 ? secp256k1_rand32() : secp256k1_rand_bits(bits)); CHECK((((uint64_t)r) >> bits) == 0); for (m = 0; m < sizeof(mults) / sizeof(mults[0]); m++) { uint32_t rm = r * mults[m]; for (shift = 0; shift <= maxshift; shift++) { x[m][shift] |= (((uint64_t)1) << ((rm >> shift) & ((1 << usebits) - 1))); } } } for (m = 0; m < sizeof(mults) / sizeof(mults[0]); m++) { for (shift = 0; shift <= maxshift; shift++) { /* Test that the lower usebits bits of x[shift] are 1 */ CHECK(((~x[m][shift]) << (64 - (1 << usebits))) == 0); } } } /* Subrange must be a whole divisor of range, and at most 64 */ void test_rand_int(uint32_t range, uint32_t subrange) { /* (1-1/subrange)^rounds < 1/10^9 */ int rounds = (subrange * 2073) / 100; int i; uint64_t x = 0; CHECK((range % subrange) == 0); for (i = 0; i < rounds; i++) { uint32_t r = secp256k1_rand_int(range); CHECK(r < range); r = r % subrange; x |= (((uint64_t)1) << r); } /* Test that the lower subrange bits of x are 1. */ CHECK(((~x) << (64 - subrange)) == 0); } void run_rand_bits(void) { size_t b; test_rand_bits(1, 32); for (b = 1; b <= 32; b++) { test_rand_bits(0, b); } } void run_rand_int(void) { static const uint32_t ms[] = {1, 3, 17, 1000, 13771, 999999, 33554432}; static const uint32_t ss[] = {1, 3, 6, 9, 13, 31, 64}; unsigned int m, s; for (m = 0; m < sizeof(ms) / sizeof(ms[0]); m++) { for (s = 0; s < sizeof(ss) / sizeof(ss[0]); s++) { test_rand_int(ms[m] * ss[s], ss[s]); } } } /***** NUM TESTS *****/ #ifndef USE_NUM_NONE void random_num_negate(secp256k1_num *num) { if (secp256k1_rand_bits(1)) { secp256k1_num_negate(num); } } void random_num_order_test(secp256k1_num *num) { secp256k1_scalar sc; random_scalar_order_test(&sc); secp256k1_scalar_get_num(num, &sc); } void random_num_order(secp256k1_num *num) { secp256k1_scalar sc; random_scalar_order(&sc); secp256k1_scalar_get_num(num, &sc); } void test_num_negate(void) { secp256k1_num n1; secp256k1_num n2; random_num_order_test(&n1); /* n1 = R */ random_num_negate(&n1); secp256k1_num_copy(&n2, &n1); /* n2 = R */ secp256k1_num_sub(&n1, &n2, &n1); /* n1 = n2-n1 = 0 */ CHECK(secp256k1_num_is_zero(&n1)); secp256k1_num_copy(&n1, &n2); /* n1 = R */ secp256k1_num_negate(&n1); /* n1 = -R */ CHECK(!secp256k1_num_is_zero(&n1)); secp256k1_num_add(&n1, &n2, &n1); /* n1 = n2+n1 = 0 */ CHECK(secp256k1_num_is_zero(&n1)); secp256k1_num_copy(&n1, &n2); /* n1 = R */ secp256k1_num_negate(&n1); /* n1 = -R */ CHECK(secp256k1_num_is_neg(&n1) != secp256k1_num_is_neg(&n2)); secp256k1_num_negate(&n1); /* n1 = R */ CHECK(secp256k1_num_eq(&n1, &n2)); } void test_num_add_sub(void) { int i; secp256k1_scalar s; secp256k1_num n1; secp256k1_num n2; secp256k1_num n1p2, n2p1, n1m2, n2m1; random_num_order_test(&n1); /* n1 = R1 */ if (secp256k1_rand_bits(1)) { random_num_negate(&n1); } random_num_order_test(&n2); /* n2 = R2 */ if (secp256k1_rand_bits(1)) { random_num_negate(&n2); } secp256k1_num_add(&n1p2, &n1, &n2); /* n1p2 = R1 + R2 */ secp256k1_num_add(&n2p1, &n2, &n1); /* n2p1 = R2 + R1 */ secp256k1_num_sub(&n1m2, &n1, &n2); /* n1m2 = R1 - R2 */ secp256k1_num_sub(&n2m1, &n2, &n1); /* n2m1 = R2 - R1 */ CHECK(secp256k1_num_eq(&n1p2, &n2p1)); CHECK(!secp256k1_num_eq(&n1p2, &n1m2)); secp256k1_num_negate(&n2m1); /* n2m1 = -R2 + R1 */ CHECK(secp256k1_num_eq(&n2m1, &n1m2)); CHECK(!secp256k1_num_eq(&n2m1, &n1)); secp256k1_num_add(&n2m1, &n2m1, &n2); /* n2m1 = -R2 + R1 + R2 = R1 */ CHECK(secp256k1_num_eq(&n2m1, &n1)); CHECK(!secp256k1_num_eq(&n2p1, &n1)); secp256k1_num_sub(&n2p1, &n2p1, &n2); /* n2p1 = R2 + R1 - R2 = R1 */ CHECK(secp256k1_num_eq(&n2p1, &n1)); /* check is_one */ secp256k1_scalar_set_int(&s, 1); secp256k1_scalar_get_num(&n1, &s); CHECK(secp256k1_num_is_one(&n1)); /* check that 2^n + 1 is never 1 */ secp256k1_scalar_get_num(&n2, &s); for (i = 0; i < 250; ++i) { secp256k1_num_add(&n1, &n1, &n1); /* n1 *= 2 */ secp256k1_num_add(&n1p2, &n1, &n2); /* n1p2 = n1 + 1 */ CHECK(!secp256k1_num_is_one(&n1p2)); } } void test_num_mod(void) { int i; secp256k1_scalar s; secp256k1_num order, n; /* check that 0 mod anything is 0 */ random_scalar_order_test(&s); secp256k1_scalar_get_num(&order, &s); secp256k1_scalar_set_int(&s, 0); secp256k1_scalar_get_num(&n, &s); secp256k1_num_mod(&n, &order); CHECK(secp256k1_num_is_zero(&n)); /* check that anything mod 1 is 0 */ secp256k1_scalar_set_int(&s, 1); secp256k1_scalar_get_num(&order, &s); secp256k1_scalar_get_num(&n, &s); secp256k1_num_mod(&n, &order); CHECK(secp256k1_num_is_zero(&n)); /* check that increasing the number past 2^256 does not break this */ random_scalar_order_test(&s); secp256k1_scalar_get_num(&n, &s); /* multiply by 2^8, which'll test this case with high probability */ for (i = 0; i < 8; ++i) { secp256k1_num_add(&n, &n, &n); } secp256k1_num_mod(&n, &order); CHECK(secp256k1_num_is_zero(&n)); } void test_num_jacobi(void) { secp256k1_scalar sqr; secp256k1_scalar small; secp256k1_scalar five; /* five is not a quadratic residue */ secp256k1_num order, n; int i; /* squares mod 5 are 1, 4 */ const int jacobi5[10] = { 0, 1, -1, -1, 1, 0, 1, -1, -1, 1 }; /* check some small values with 5 as the order */ secp256k1_scalar_set_int(&five, 5); secp256k1_scalar_get_num(&order, &five); for (i = 0; i < 10; ++i) { secp256k1_scalar_set_int(&small, i); secp256k1_scalar_get_num(&n, &small); CHECK(secp256k1_num_jacobi(&n, &order) == jacobi5[i]); } /** test large values with 5 as group order */ secp256k1_scalar_get_num(&order, &five); /* we first need a scalar which is not a multiple of 5 */ do { secp256k1_num fiven; random_scalar_order_test(&sqr); secp256k1_scalar_get_num(&fiven, &five); secp256k1_scalar_get_num(&n, &sqr); secp256k1_num_mod(&n, &fiven); } while (secp256k1_num_is_zero(&n)); /* next force it to be a residue. 2 is a nonresidue mod 5 so we can * just multiply by two, i.e. add the number to itself */ if (secp256k1_num_jacobi(&n, &order) == -1) { secp256k1_num_add(&n, &n, &n); } /* test residue */ CHECK(secp256k1_num_jacobi(&n, &order) == 1); /* test nonresidue */ secp256k1_num_add(&n, &n, &n); CHECK(secp256k1_num_jacobi(&n, &order) == -1); /** test with secp group order as order */ secp256k1_scalar_order_get_num(&order); random_scalar_order_test(&sqr); secp256k1_scalar_sqr(&sqr, &sqr); /* test residue */ secp256k1_scalar_get_num(&n, &sqr); CHECK(secp256k1_num_jacobi(&n, &order) == 1); /* test nonresidue */ secp256k1_scalar_mul(&sqr, &sqr, &five); secp256k1_scalar_get_num(&n, &sqr); CHECK(secp256k1_num_jacobi(&n, &order) == -1); /* test multiple of the order*/ CHECK(secp256k1_num_jacobi(&order, &order) == 0); /* check one less than the order */ secp256k1_scalar_set_int(&small, 1); secp256k1_scalar_get_num(&n, &small); secp256k1_num_sub(&n, &order, &n); CHECK(secp256k1_num_jacobi(&n, &order) == 1); /* sage confirms this is 1 */ } void run_num_smalltests(void) { int i; for (i = 0; i < 100*count; i++) { test_num_negate(); test_num_add_sub(); test_num_mod(); test_num_jacobi(); } } #endif /***** SCALAR TESTS *****/ void scalar_test(void) { secp256k1_scalar s; secp256k1_scalar s1; secp256k1_scalar s2; #ifndef USE_NUM_NONE secp256k1_num snum, s1num, s2num; secp256k1_num order, half_order; #endif unsigned char c[32]; /* Set 's' to a random scalar, with value 'snum'. */ random_scalar_order_test(&s); /* Set 's1' to a random scalar, with value 's1num'. */ random_scalar_order_test(&s1); /* Set 's2' to a random scalar, with value 'snum2', and byte array representation 'c'. */ random_scalar_order_test(&s2); secp256k1_scalar_get_b32(c, &s2); #ifndef USE_NUM_NONE secp256k1_scalar_get_num(&snum, &s); secp256k1_scalar_get_num(&s1num, &s1); secp256k1_scalar_get_num(&s2num, &s2); secp256k1_scalar_order_get_num(&order); half_order = order; secp256k1_num_shift(&half_order, 1); #endif { int i; /* Test that fetching groups of 4 bits from a scalar and recursing n(i)=16*n(i-1)+p(i) reconstructs it. */ secp256k1_scalar n; secp256k1_scalar_set_int(&n, 0); for (i = 0; i < 256; i += 4) { secp256k1_scalar t; int j; secp256k1_scalar_set_int(&t, secp256k1_scalar_get_bits(&s, 256 - 4 - i, 4)); for (j = 0; j < 4; j++) { secp256k1_scalar_add(&n, &n, &n); } secp256k1_scalar_add(&n, &n, &t); } CHECK(secp256k1_scalar_eq(&n, &s)); } { /* Test that fetching groups of randomly-sized bits from a scalar and recursing n(i)=b*n(i-1)+p(i) reconstructs it. */ secp256k1_scalar n; int i = 0; secp256k1_scalar_set_int(&n, 0); while (i < 256) { secp256k1_scalar t; int j; int now = secp256k1_rand_int(15) + 1; if (now + i > 256) { now = 256 - i; } secp256k1_scalar_set_int(&t, secp256k1_scalar_get_bits_var(&s, 256 - now - i, now)); for (j = 0; j < now; j++) { secp256k1_scalar_add(&n, &n, &n); } secp256k1_scalar_add(&n, &n, &t); i += now; } CHECK(secp256k1_scalar_eq(&n, &s)); } #ifndef USE_NUM_NONE { /* Test that adding the scalars together is equal to adding their numbers together modulo the order. */ secp256k1_num rnum; secp256k1_num r2num; secp256k1_scalar r; secp256k1_num_add(&rnum, &snum, &s2num); secp256k1_num_mod(&rnum, &order); secp256k1_scalar_add(&r, &s, &s2); secp256k1_scalar_get_num(&r2num, &r); CHECK(secp256k1_num_eq(&rnum, &r2num)); } { /* Test that multiplying the scalars is equal to multiplying their numbers modulo the order. */ secp256k1_scalar r; secp256k1_num r2num; secp256k1_num rnum; secp256k1_num_mul(&rnum, &snum, &s2num); secp256k1_num_mod(&rnum, &order); secp256k1_scalar_mul(&r, &s, &s2); secp256k1_scalar_get_num(&r2num, &r); CHECK(secp256k1_num_eq(&rnum, &r2num)); /* The result can only be zero if at least one of the factors was zero. */ CHECK(secp256k1_scalar_is_zero(&r) == (secp256k1_scalar_is_zero(&s) || secp256k1_scalar_is_zero(&s2))); /* The results can only be equal to one of the factors if that factor was zero, or the other factor was one. */ CHECK(secp256k1_num_eq(&rnum, &snum) == (secp256k1_scalar_is_zero(&s) || secp256k1_scalar_is_one(&s2))); CHECK(secp256k1_num_eq(&rnum, &s2num) == (secp256k1_scalar_is_zero(&s2) || secp256k1_scalar_is_one(&s))); } { secp256k1_scalar neg; secp256k1_num negnum; secp256k1_num negnum2; /* Check that comparison with zero matches comparison with zero on the number. */ CHECK(secp256k1_num_is_zero(&snum) == secp256k1_scalar_is_zero(&s)); /* Check that comparison with the half order is equal to testing for high scalar. */ CHECK(secp256k1_scalar_is_high(&s) == (secp256k1_num_cmp(&snum, &half_order) > 0)); secp256k1_scalar_negate(&neg, &s); secp256k1_num_sub(&negnum, &order, &snum); secp256k1_num_mod(&negnum, &order); /* Check that comparison with the half order is equal to testing for high scalar after negation. */ CHECK(secp256k1_scalar_is_high(&neg) == (secp256k1_num_cmp(&negnum, &half_order) > 0)); /* Negating should change the high property, unless the value was already zero. */ CHECK((secp256k1_scalar_is_high(&s) == secp256k1_scalar_is_high(&neg)) == secp256k1_scalar_is_zero(&s)); secp256k1_scalar_get_num(&negnum2, &neg); /* Negating a scalar should be equal to (order - n) mod order on the number. */ CHECK(secp256k1_num_eq(&negnum, &negnum2)); secp256k1_scalar_add(&neg, &neg, &s); /* Adding a number to its negation should result in zero. */ CHECK(secp256k1_scalar_is_zero(&neg)); secp256k1_scalar_negate(&neg, &neg); /* Negating zero should still result in zero. */ CHECK(secp256k1_scalar_is_zero(&neg)); } { /* Test secp256k1_scalar_mul_shift_var. */ secp256k1_scalar r; secp256k1_num one; secp256k1_num rnum; secp256k1_num rnum2; unsigned char cone[1] = {0x01}; unsigned int shift = 256 + secp256k1_rand_int(257); secp256k1_scalar_mul_shift_var(&r, &s1, &s2, shift); secp256k1_num_mul(&rnum, &s1num, &s2num); secp256k1_num_shift(&rnum, shift - 1); secp256k1_num_set_bin(&one, cone, 1); secp256k1_num_add(&rnum, &rnum, &one); secp256k1_num_shift(&rnum, 1); secp256k1_scalar_get_num(&rnum2, &r); CHECK(secp256k1_num_eq(&rnum, &rnum2)); } { /* test secp256k1_scalar_shr_int */ secp256k1_scalar r; int i; random_scalar_order_test(&r); for (i = 0; i < 100; ++i) { int low; int shift = 1 + secp256k1_rand_int(15); int expected = r.d[0] % (1 << shift); low = secp256k1_scalar_shr_int(&r, shift); CHECK(expected == low); } } #endif { /* Test that scalar inverses are equal to the inverse of their number modulo the order. */ if (!secp256k1_scalar_is_zero(&s)) { secp256k1_scalar inv; #ifndef USE_NUM_NONE secp256k1_num invnum; secp256k1_num invnum2; #endif secp256k1_scalar_inverse(&inv, &s); #ifndef USE_NUM_NONE secp256k1_num_mod_inverse(&invnum, &snum, &order); secp256k1_scalar_get_num(&invnum2, &inv); CHECK(secp256k1_num_eq(&invnum, &invnum2)); #endif secp256k1_scalar_mul(&inv, &inv, &s); /* Multiplying a scalar with its inverse must result in one. */ CHECK(secp256k1_scalar_is_one(&inv)); secp256k1_scalar_inverse(&inv, &inv); /* Inverting one must result in one. */ CHECK(secp256k1_scalar_is_one(&inv)); #ifndef USE_NUM_NONE secp256k1_scalar_get_num(&invnum, &inv); CHECK(secp256k1_num_is_one(&invnum)); #endif } } { /* Test commutativity of add. */ secp256k1_scalar r1, r2; secp256k1_scalar_add(&r1, &s1, &s2); secp256k1_scalar_add(&r2, &s2, &s1); CHECK(secp256k1_scalar_eq(&r1, &r2)); } { secp256k1_scalar r1, r2; secp256k1_scalar b; int i; /* Test add_bit. */ int bit = secp256k1_rand_bits(8); secp256k1_scalar_set_int(&b, 1); CHECK(secp256k1_scalar_is_one(&b)); for (i = 0; i < bit; i++) { secp256k1_scalar_add(&b, &b, &b); } r1 = s1; r2 = s1; if (!secp256k1_scalar_add(&r1, &r1, &b)) { /* No overflow happened. */ secp256k1_scalar_cadd_bit(&r2, bit, 1); CHECK(secp256k1_scalar_eq(&r1, &r2)); /* cadd is a noop when flag is zero */ secp256k1_scalar_cadd_bit(&r2, bit, 0); CHECK(secp256k1_scalar_eq(&r1, &r2)); } } { /* Test commutativity of mul. */ secp256k1_scalar r1, r2; secp256k1_scalar_mul(&r1, &s1, &s2); secp256k1_scalar_mul(&r2, &s2, &s1); CHECK(secp256k1_scalar_eq(&r1, &r2)); } { /* Test associativity of add. */ secp256k1_scalar r1, r2; secp256k1_scalar_add(&r1, &s1, &s2); secp256k1_scalar_add(&r1, &r1, &s); secp256k1_scalar_add(&r2, &s2, &s); secp256k1_scalar_add(&r2, &s1, &r2); CHECK(secp256k1_scalar_eq(&r1, &r2)); } { /* Test associativity of mul. */ secp256k1_scalar r1, r2; secp256k1_scalar_mul(&r1, &s1, &s2); secp256k1_scalar_mul(&r1, &r1, &s); secp256k1_scalar_mul(&r2, &s2, &s); secp256k1_scalar_mul(&r2, &s1, &r2); CHECK(secp256k1_scalar_eq(&r1, &r2)); } { /* Test distributitivity of mul over add. */ secp256k1_scalar r1, r2, t; secp256k1_scalar_add(&r1, &s1, &s2); secp256k1_scalar_mul(&r1, &r1, &s); secp256k1_scalar_mul(&r2, &s1, &s); secp256k1_scalar_mul(&t, &s2, &s); secp256k1_scalar_add(&r2, &r2, &t); CHECK(secp256k1_scalar_eq(&r1, &r2)); } { /* Test square. */ secp256k1_scalar r1, r2; secp256k1_scalar_sqr(&r1, &s1); secp256k1_scalar_mul(&r2, &s1, &s1); CHECK(secp256k1_scalar_eq(&r1, &r2)); } { /* Test multiplicative identity. */ secp256k1_scalar r1, v1; secp256k1_scalar_set_int(&v1,1); secp256k1_scalar_mul(&r1, &s1, &v1); CHECK(secp256k1_scalar_eq(&r1, &s1)); } { /* Test additive identity. */ secp256k1_scalar r1, v0; secp256k1_scalar_set_int(&v0,0); secp256k1_scalar_add(&r1, &s1, &v0); CHECK(secp256k1_scalar_eq(&r1, &s1)); } { /* Test zero product property. */ secp256k1_scalar r1, v0; secp256k1_scalar_set_int(&v0,0); secp256k1_scalar_mul(&r1, &s1, &v0); CHECK(secp256k1_scalar_eq(&r1, &v0)); } } void run_scalar_tests(void) { int i; for (i = 0; i < 128 * count; i++) { scalar_test(); } { /* (-1)+1 should be zero. */ secp256k1_scalar s, o; secp256k1_scalar_set_int(&s, 1); CHECK(secp256k1_scalar_is_one(&s)); secp256k1_scalar_negate(&o, &s); secp256k1_scalar_add(&o, &o, &s); CHECK(secp256k1_scalar_is_zero(&o)); secp256k1_scalar_negate(&o, &o); CHECK(secp256k1_scalar_is_zero(&o)); } #ifndef USE_NUM_NONE { /* A scalar with value of the curve order should be 0. */ secp256k1_num order; secp256k1_scalar zero; unsigned char bin[32]; int overflow = 0; secp256k1_scalar_order_get_num(&order); secp256k1_num_get_bin(bin, 32, &order); secp256k1_scalar_set_b32(&zero, bin, &overflow); CHECK(overflow == 1); CHECK(secp256k1_scalar_is_zero(&zero)); } #endif { /* Does check_overflow check catch all ones? */ static const secp256k1_scalar overflowed = SECP256K1_SCALAR_CONST( 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL ); CHECK(secp256k1_scalar_check_overflow(&overflowed)); } { /* Static test vectors. * These were reduced from ~10^12 random vectors based on comparison-decision * and edge-case coverage on 32-bit and 64-bit implementations. * The responses were generated with Sage 5.9. */ secp256k1_scalar x; secp256k1_scalar y; secp256k1_scalar z; secp256k1_scalar zz; secp256k1_scalar one; secp256k1_scalar r1; secp256k1_scalar r2; #if defined(USE_SCALAR_INV_NUM) secp256k1_scalar zzv; #endif int overflow; unsigned char chal[33][2][32] = { {{0xff, 0xff, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0xc0, 0xff, 0xff, 0xff}, {0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff}}, {{0xef, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x80, 0xff}}, {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x00}, {0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff}}, {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x1e, 0xf8, 0xff, 0xff, 0xff, 0xfd, 0xff}, {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xe0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xf3, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}}, {{0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff}, {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x80, 0xff, 0xff, 0x3f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff}}, {{0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xfc, 0x9f, 0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x80, 0xff, 0x0f, 0xfc, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}, {0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xf8, 0xff, 0x0f, 0xc0, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x80, 0xff, 0xff, 0xff}}, {{0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xf0}, {0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}, {{0x00, 0xf8, 0xff, 0x03, 0xff, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xc0, 0xff, 0x0f, 0xfc, 0xff}, {0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}, {{0x8f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}, {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, {{0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00, 0x00, 0x80, 0xff, 0x7f}, {0xff, 0xcf, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00}}, {{0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x80, 0xff, 0x01, 0xfc, 0xff, 0x01, 0x00, 0xfe, 0xff}, {0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00}}, {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf0, 0xff, 0xff, 0xe0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x00}, {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x3f, 0xf0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x7e, 0x00, 0x00}}, {{0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xfe, 0x07, 0x00}, {0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60}}, {{0xff, 0x01, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x80, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, {0xff, 0xff, 0x1f, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00}}, {{0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff}}, {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xcf, 0xff, 0x1f, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00}, {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x7f, 0x00, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff}}, {{0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}, {0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x80, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x7f, 0xf8, 0xff, 0xff, 0x1f, 0x00, 0xfe}}, {{0xff, 0xff, 0xff, 0x3f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x03, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07}, {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x01, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}}, {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40}}, {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, {{0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, {0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}, {{0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xc0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f}, {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff}}, {{0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}}, {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}, {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7e, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x07, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, {0xff, 0x01, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}, {{0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff}, {0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xc0, 0xf1, 0x7f, 0x00}}, {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00}, {0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x01, 0xff, 0xff}}, {{0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x80, 0xff, 0x03, 0xe0, 0x01, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}, {0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xf0, 0x07, 0x00, 0x3c, 0x80, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xe0, 0xff, 0x00, 0x00, 0x00}}, {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80}, {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x7f, 0xfe, 0xff, 0x1f, 0x00, 0xfe, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff}}, {{0xff, 0xff, 0x81, 0xff, 0xff, 0xff, 0xff, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83, 0xff, 0xff, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xf0}, {0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xf8, 0x07, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff}}, {{0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00, 0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x03, 0xfb, 0xfa, 0x8a, 0x7d, 0xdf, 0x13, 0x86, 0xe2, 0x03}, {0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00, 0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x03, 0xfb, 0xfa, 0x8a, 0x7d, 0xdf, 0x13, 0x86, 0xe2, 0x03}} }; unsigned char res[33][2][32] = { {{0x0c, 0x3b, 0x0a, 0xca, 0x8d, 0x1a, 0x2f, 0xb9, 0x8a, 0x7b, 0x53, 0x5a, 0x1f, 0xc5, 0x22, 0xa1, 0x07, 0x2a, 0x48, 0xea, 0x02, 0xeb, 0xb3, 0xd6, 0x20, 0x1e, 0x86, 0xd0, 0x95, 0xf6, 0x92, 0x35}, {0xdc, 0x90, 0x7a, 0x07, 0x2e, 0x1e, 0x44, 0x6d, 0xf8, 0x15, 0x24, 0x5b, 0x5a, 0x96, 0x37, 0x9c, 0x37, 0x7b, 0x0d, 0xac, 0x1b, 0x65, 0x58, 0x49, 0x43, 0xb7, 0x31, 0xbb, 0xa7, 0xf4, 0x97, 0x15}}, {{0xf1, 0xf7, 0x3a, 0x50, 0xe6, 0x10, 0xba, 0x22, 0x43, 0x4d, 0x1f, 0x1f, 0x7c, 0x27, 0xca, 0x9c, 0xb8, 0xb6, 0xa0, 0xfc, 0xd8, 0xc0, 0x05, 0x2f, 0xf7, 0x08, 0xe1, 0x76, 0xdd, 0xd0, 0x80, 0xc8}, {0xe3, 0x80, 0x80, 0xb8, 0xdb, 0xe3, 0xa9, 0x77, 0x00, 0xb0, 0xf5, 0x2e, 0x27, 0xe2, 0x68, 0xc4, 0x88, 0xe8, 0x04, 0xc1, 0x12, 0xbf, 0x78, 0x59, 0xe6, 0xa9, 0x7c, 0xe1, 0x81, 0xdd, 0xb9, 0xd5}}, {{0x96, 0xe2, 0xee, 0x01, 0xa6, 0x80, 0x31, 0xef, 0x5c, 0xd0, 0x19, 0xb4, 0x7d, 0x5f, 0x79, 0xab, 0xa1, 0x97, 0xd3, 0x7e, 0x33, 0xbb, 0x86, 0x55, 0x60, 0x20, 0x10, 0x0d, 0x94, 0x2d, 0x11, 0x7c}, {0xcc, 0xab, 0xe0, 0xe8, 0x98, 0x65, 0x12, 0x96, 0x38, 0x5a, 0x1a, 0xf2, 0x85, 0x23, 0x59, 0x5f, 0xf9, 0xf3, 0xc2, 0x81, 0x70, 0x92, 0x65, 0x12, 0x9c, 0x65, 0x1e, 0x96, 0x00, 0xef, 0xe7, 0x63}}, {{0xac, 0x1e, 0x62, 0xc2, 0x59, 0xfc, 0x4e, 0x5c, 0x83, 0xb0, 0xd0, 0x6f, 0xce, 0x19, 0xf6, 0xbf, 0xa4, 0xb0, 0xe0, 0x53, 0x66, 0x1f, 0xbf, 0xc9, 0x33, 0x47, 0x37, 0xa9, 0x3d, 0x5d, 0xb0, 0x48}, {0x86, 0xb9, 0x2a, 0x7f, 0x8e, 0xa8, 0x60, 0x42, 0x26, 0x6d, 0x6e, 0x1c, 0xa2, 0xec, 0xe0, 0xe5, 0x3e, 0x0a, 0x33, 0xbb, 0x61, 0x4c, 0x9f, 0x3c, 0xd1, 0xdf, 0x49, 0x33, 0xcd, 0x72, 0x78, 0x18}}, {{0xf7, 0xd3, 0xcd, 0x49, 0x5c, 0x13, 0x22, 0xfb, 0x2e, 0xb2, 0x2f, 0x27, 0xf5, 0x8a, 0x5d, 0x74, 0xc1, 0x58, 0xc5, 0xc2, 0x2d, 0x9f, 0x52, 0xc6, 0x63, 0x9f, 0xba, 0x05, 0x76, 0x45, 0x7a, 0x63}, {0x8a, 0xfa, 0x55, 0x4d, 0xdd, 0xa3, 0xb2, 0xc3, 0x44, 0xfd, 0xec, 0x72, 0xde, 0xef, 0xc0, 0x99, 0xf5, 0x9f, 0xe2, 0x52, 0xb4, 0x05, 0x32, 0x58, 0x57, 0xc1, 0x8f, 0xea, 0xc3, 0x24, 0x5b, 0x94}}, {{0x05, 0x83, 0xee, 0xdd, 0x64, 0xf0, 0x14, 0x3b, 0xa0, 0x14, 0x4a, 0x3a, 0x41, 0x82, 0x7c, 0xa7, 0x2c, 0xaa, 0xb1, 0x76, 0xbb, 0x59, 0x64, 0x5f, 0x52, 0xad, 0x25, 0x29, 0x9d, 0x8f, 0x0b, 0xb0}, {0x7e, 0xe3, 0x7c, 0xca, 0xcd, 0x4f, 0xb0, 0x6d, 0x7a, 0xb2, 0x3e, 0xa0, 0x08, 0xb9, 0xa8, 0x2d, 0xc2, 0xf4, 0x99, 0x66, 0xcc, 0xac, 0xd8, 0xb9, 0x72, 0x2a, 0x4a, 0x3e, 0x0f, 0x7b, 0xbf, 0xf4}}, {{0x8c, 0x9c, 0x78, 0x2b, 0x39, 0x61, 0x7e, 0xf7, 0x65, 0x37, 0x66, 0x09, 0x38, 0xb9, 0x6f, 0x70, 0x78, 0x87, 0xff, 0xcf, 0x93, 0xca, 0x85, 0x06, 0x44, 0x84, 0xa7, 0xfe, 0xd3, 0xa4, 0xe3, 0x7e}, {0xa2, 0x56, 0x49, 0x23, 0x54, 0xa5, 0x50, 0xe9, 0x5f, 0xf0, 0x4d, 0xe7, 0xdc, 0x38, 0x32, 0x79, 0x4f, 0x1c, 0xb7, 0xe4, 0xbb, 0xf8, 0xbb, 0x2e, 0x40, 0x41, 0x4b, 0xcc, 0xe3, 0x1e, 0x16, 0x36}}, {{0x0c, 0x1e, 0xd7, 0x09, 0x25, 0x40, 0x97, 0xcb, 0x5c, 0x46, 0xa8, 0xda, 0xef, 0x25, 0xd5, 0xe5, 0x92, 0x4d, 0xcf, 0xa3, 0xc4, 0x5d, 0x35, 0x4a, 0xe4, 0x61, 0x92, 0xf3, 0xbf, 0x0e, 0xcd, 0xbe}, {0xe4, 0xaf, 0x0a, 0xb3, 0x30, 0x8b, 0x9b, 0x48, 0x49, 0x43, 0xc7, 0x64, 0x60, 0x4a, 0x2b, 0x9e, 0x95, 0x5f, 0x56, 0xe8, 0x35, 0xdc, 0xeb, 0xdc, 0xc7, 0xc4, 0xfe, 0x30, 0x40, 0xc7, 0xbf, 0xa4}}, {{0xd4, 0xa0, 0xf5, 0x81, 0x49, 0x6b, 0xb6, 0x8b, 0x0a, 0x69, 0xf9, 0xfe, 0xa8, 0x32, 0xe5, 0xe0, 0xa5, 0xcd, 0x02, 0x53, 0xf9, 0x2c, 0xe3, 0x53, 0x83, 0x36, 0xc6, 0x02, 0xb5, 0xeb, 0x64, 0xb8}, {0x1d, 0x42, 0xb9, 0xf9, 0xe9, 0xe3, 0x93, 0x2c, 0x4c, 0xee, 0x6c, 0x5a, 0x47, 0x9e, 0x62, 0x01, 0x6b, 0x04, 0xfe, 0xa4, 0x30, 0x2b, 0x0d, 0x4f, 0x71, 0x10, 0xd3, 0x55, 0xca, 0xf3, 0x5e, 0x80}}, {{0x77, 0x05, 0xf6, 0x0c, 0x15, 0x9b, 0x45, 0xe7, 0xb9, 0x11, 0xb8, 0xf5, 0xd6, 0xda, 0x73, 0x0c, 0xda, 0x92, 0xea, 0xd0, 0x9d, 0xd0, 0x18, 0x92, 0xce, 0x9a, 0xaa, 0xee, 0x0f, 0xef, 0xde, 0x30}, {0xf1, 0xf1, 0xd6, 0x9b, 0x51, 0xd7, 0x77, 0x62, 0x52, 0x10, 0xb8, 0x7a, 0x84, 0x9d, 0x15, 0x4e, 0x07, 0xdc, 0x1e, 0x75, 0x0d, 0x0c, 0x3b, 0xdb, 0x74, 0x58, 0x62, 0x02, 0x90, 0x54, 0x8b, 0x43}}, {{0xa6, 0xfe, 0x0b, 0x87, 0x80, 0x43, 0x67, 0x25, 0x57, 0x5d, 0xec, 0x40, 0x50, 0x08, 0xd5, 0x5d, 0x43, 0xd7, 0xe0, 0xaa, 0xe0, 0x13, 0xb6, 0xb0, 0xc0, 0xd4, 0xe5, 0x0d, 0x45, 0x83, 0xd6, 0x13}, {0x40, 0x45, 0x0a, 0x92, 0x31, 0xea, 0x8c, 0x60, 0x8c, 0x1f, 0xd8, 0x76, 0x45, 0xb9, 0x29, 0x00, 0x26, 0x32, 0xd8, 0xa6, 0x96, 0x88, 0xe2, 0xc4, 0x8b, 0xdb, 0x7f, 0x17, 0x87, 0xcc, 0xc8, 0xf2}}, {{0xc2, 0x56, 0xe2, 0xb6, 0x1a, 0x81, 0xe7, 0x31, 0x63, 0x2e, 0xbb, 0x0d, 0x2f, 0x81, 0x67, 0xd4, 0x22, 0xe2, 0x38, 0x02, 0x25, 0x97, 0xc7, 0x88, 0x6e, 0xdf, 0xbe, 0x2a, 0xa5, 0x73, 0x63, 0xaa}, {0x50, 0x45, 0xe2, 0xc3, 0xbd, 0x89, 0xfc, 0x57, 0xbd, 0x3c, 0xa3, 0x98, 0x7e, 0x7f, 0x36, 0x38, 0x92, 0x39, 0x1f, 0x0f, 0x81, 0x1a, 0x06, 0x51, 0x1f, 0x8d, 0x6a, 0xff, 0x47, 0x16, 0x06, 0x9c}}, {{0x33, 0x95, 0xa2, 0x6f, 0x27, 0x5f, 0x9c, 0x9c, 0x64, 0x45, 0xcb, 0xd1, 0x3c, 0xee, 0x5e, 0x5f, 0x48, 0xa6, 0xaf, 0xe3, 0x79, 0xcf, 0xb1, 0xe2, 0xbf, 0x55, 0x0e, 0xa2, 0x3b, 0x62, 0xf0, 0xe4}, {0x14, 0xe8, 0x06, 0xe3, 0xbe, 0x7e, 0x67, 0x01, 0xc5, 0x21, 0x67, 0xd8, 0x54, 0xb5, 0x7f, 0xa4, 0xf9, 0x75, 0x70, 0x1c, 0xfd, 0x79, 0xdb, 0x86, 0xad, 0x37, 0x85, 0x83, 0x56, 0x4e, 0xf0, 0xbf}}, {{0xbc, 0xa6, 0xe0, 0x56, 0x4e, 0xef, 0xfa, 0xf5, 0x1d, 0x5d, 0x3f, 0x2a, 0x5b, 0x19, 0xab, 0x51, 0xc5, 0x8b, 0xdd, 0x98, 0x28, 0x35, 0x2f, 0xc3, 0x81, 0x4f, 0x5c, 0xe5, 0x70, 0xb9, 0xeb, 0x62}, {0xc4, 0x6d, 0x26, 0xb0, 0x17, 0x6b, 0xfe, 0x6c, 0x12, 0xf8, 0xe7, 0xc1, 0xf5, 0x2f, 0xfa, 0x91, 0x13, 0x27, 0xbd, 0x73, 0xcc, 0x33, 0x31, 0x1c, 0x39, 0xe3, 0x27, 0x6a, 0x95, 0xcf, 0xc5, 0xfb}}, {{0x30, 0xb2, 0x99, 0x84, 0xf0, 0x18, 0x2a, 0x6e, 0x1e, 0x27, 0xed, 0xa2, 0x29, 0x99, 0x41, 0x56, 0xe8, 0xd4, 0x0d, 0xef, 0x99, 0x9c, 0xf3, 0x58, 0x29, 0x55, 0x1a, 0xc0, 0x68, 0xd6, 0x74, 0xa4}, {0x07, 0x9c, 0xe7, 0xec, 0xf5, 0x36, 0x73, 0x41, 0xa3, 0x1c, 0xe5, 0x93, 0x97, 0x6a, 0xfd, 0xf7, 0x53, 0x18, 0xab, 0xaf, 0xeb, 0x85, 0xbd, 0x92, 0x90, 0xab, 0x3c, 0xbf, 0x30, 0x82, 0xad, 0xf6}}, {{0xc6, 0x87, 0x8a, 0x2a, 0xea, 0xc0, 0xa9, 0xec, 0x6d, 0xd3, 0xdc, 0x32, 0x23, 0xce, 0x62, 0x19, 0xa4, 0x7e, 0xa8, 0xdd, 0x1c, 0x33, 0xae, 0xd3, 0x4f, 0x62, 0x9f, 0x52, 0xe7, 0x65, 0x46, 0xf4}, {0x97, 0x51, 0x27, 0x67, 0x2d, 0xa2, 0x82, 0x87, 0x98, 0xd3, 0xb6, 0x14, 0x7f, 0x51, 0xd3, 0x9a, 0x0b, 0xd0, 0x76, 0x81, 0xb2, 0x4f, 0x58, 0x92, 0xa4, 0x86, 0xa1, 0xa7, 0x09, 0x1d, 0xef, 0x9b}}, {{0xb3, 0x0f, 0x2b, 0x69, 0x0d, 0x06, 0x90, 0x64, 0xbd, 0x43, 0x4c, 0x10, 0xe8, 0x98, 0x1c, 0xa3, 0xe1, 0x68, 0xe9, 0x79, 0x6c, 0x29, 0x51, 0x3f, 0x41, 0xdc, 0xdf, 0x1f, 0xf3, 0x60, 0xbe, 0x33}, {0xa1, 0x5f, 0xf7, 0x1d, 0xb4, 0x3e, 0x9b, 0x3c, 0xe7, 0xbd, 0xb6, 0x06, 0xd5, 0x60, 0x06, 0x6d, 0x50, 0xd2, 0xf4, 0x1a, 0x31, 0x08, 0xf2, 0xea, 0x8e, 0xef, 0x5f, 0x7d, 0xb6, 0xd0, 0xc0, 0x27}}, {{0x62, 0x9a, 0xd9, 0xbb, 0x38, 0x36, 0xce, 0xf7, 0x5d, 0x2f, 0x13, 0xec, 0xc8, 0x2d, 0x02, 0x8a, 0x2e, 0x72, 0xf0, 0xe5, 0x15, 0x9d, 0x72, 0xae, 0xfc, 0xb3, 0x4f, 0x02, 0xea, 0xe1, 0x09, 0xfe}, {0x00, 0x00, 0x00, 0x00, 0xfa, 0x0a, 0x3d, 0xbc, 0xad, 0x16, 0x0c, 0xb6, 0xe7, 0x7c, 0x8b, 0x39, 0x9a, 0x43, 0xbb, 0xe3, 0xc2, 0x55, 0x15, 0x14, 0x75, 0xac, 0x90, 0x9b, 0x7f, 0x9a, 0x92, 0x00}}, {{0x8b, 0xac, 0x70, 0x86, 0x29, 0x8f, 0x00, 0x23, 0x7b, 0x45, 0x30, 0xaa, 0xb8, 0x4c, 0xc7, 0x8d, 0x4e, 0x47, 0x85, 0xc6, 0x19, 0xe3, 0x96, 0xc2, 0x9a, 0xa0, 0x12, 0xed, 0x6f, 0xd7, 0x76, 0x16}, {0x45, 0xaf, 0x7e, 0x33, 0xc7, 0x7f, 0x10, 0x6c, 0x7c, 0x9f, 0x29, 0xc1, 0xa8, 0x7e, 0x15, 0x84, 0xe7, 0x7d, 0xc0, 0x6d, 0xab, 0x71, 0x5d, 0xd0, 0x6b, 0x9f, 0x97, 0xab, 0xcb, 0x51, 0x0c, 0x9f}}, {{0x9e, 0xc3, 0x92, 0xb4, 0x04, 0x9f, 0xc8, 0xbb, 0xdd, 0x9e, 0xc6, 0x05, 0xfd, 0x65, 0xec, 0x94, 0x7f, 0x2c, 0x16, 0xc4, 0x40, 0xac, 0x63, 0x7b, 0x7d, 0xb8, 0x0c, 0xe4, 0x5b, 0xe3, 0xa7, 0x0e}, {0x43, 0xf4, 0x44, 0xe8, 0xcc, 0xc8, 0xd4, 0x54, 0x33, 0x37, 0x50, 0xf2, 0x87, 0x42, 0x2e, 0x00, 0x49, 0x60, 0x62, 0x02, 0xfd, 0x1a, 0x7c, 0xdb, 0x29, 0x6c, 0x6d, 0x54, 0x53, 0x08, 0xd1, 0xc8}}, {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}, {{0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1, 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0, 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59, 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}, {0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1, 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0, 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59, 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}}, {{0x28, 0x56, 0xac, 0x0e, 0x4f, 0x98, 0x09, 0xf0, 0x49, 0xfa, 0x7f, 0x84, 0xac, 0x7e, 0x50, 0x5b, 0x17, 0x43, 0x14, 0x89, 0x9c, 0x53, 0xa8, 0x94, 0x30, 0xf2, 0x11, 0x4d, 0x92, 0x14, 0x27, 0xe8}, {0x39, 0x7a, 0x84, 0x56, 0x79, 0x9d, 0xec, 0x26, 0x2c, 0x53, 0xc1, 0x94, 0xc9, 0x8d, 0x9e, 0x9d, 0x32, 0x1f, 0xdd, 0x84, 0x04, 0xe8, 0xe2, 0x0a, 0x6b, 0xbe, 0xbb, 0x42, 0x40, 0x67, 0x30, 0x6c}}, {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4, 0x40, 0x2d, 0xa1, 0x73, 0x2f, 0xc9, 0xbe, 0xbd}, {0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1, 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0, 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59, 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}}, {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}, {{0x1c, 0xc4, 0xf7, 0xda, 0x0f, 0x65, 0xca, 0x39, 0x70, 0x52, 0x92, 0x8e, 0xc3, 0xc8, 0x15, 0xea, 0x7f, 0x10, 0x9e, 0x77, 0x4b, 0x6e, 0x2d, 0xdf, 0xe8, 0x30, 0x9d, 0xda, 0xe8, 0x9a, 0x65, 0xae}, {0x02, 0xb0, 0x16, 0xb1, 0x1d, 0xc8, 0x57, 0x7b, 0xa2, 0x3a, 0xa2, 0xa3, 0x38, 0x5c, 0x8f, 0xeb, 0x66, 0x37, 0x91, 0xa8, 0x5f, 0xef, 0x04, 0xf6, 0x59, 0x75, 0xe1, 0xee, 0x92, 0xf6, 0x0e, 0x30}}, {{0x8d, 0x76, 0x14, 0xa4, 0x14, 0x06, 0x9f, 0x9a, 0xdf, 0x4a, 0x85, 0xa7, 0x6b, 0xbf, 0x29, 0x6f, 0xbc, 0x34, 0x87, 0x5d, 0xeb, 0xbb, 0x2e, 0xa9, 0xc9, 0x1f, 0x58, 0xd6, 0x9a, 0x82, 0xa0, 0x56}, {0xd4, 0xb9, 0xdb, 0x88, 0x1d, 0x04, 0xe9, 0x93, 0x8d, 0x3f, 0x20, 0xd5, 0x86, 0xa8, 0x83, 0x07, 0xdb, 0x09, 0xd8, 0x22, 0x1f, 0x7f, 0xf1, 0x71, 0xc8, 0xe7, 0x5d, 0x47, 0xaf, 0x8b, 0x72, 0xe9}}, {{0x83, 0xb9, 0x39, 0xb2, 0xa4, 0xdf, 0x46, 0x87, 0xc2, 0xb8, 0xf1, 0xe6, 0x4c, 0xd1, 0xe2, 0xa9, 0xe4, 0x70, 0x30, 0x34, 0xbc, 0x52, 0x7c, 0x55, 0xa6, 0xec, 0x80, 0xa4, 0xe5, 0xd2, 0xdc, 0x73}, {0x08, 0xf1, 0x03, 0xcf, 0x16, 0x73, 0xe8, 0x7d, 0xb6, 0x7e, 0x9b, 0xc0, 0xb4, 0xc2, 0xa5, 0x86, 0x02, 0x77, 0xd5, 0x27, 0x86, 0xa5, 0x15, 0xfb, 0xae, 0x9b, 0x8c, 0xa9, 0xf9, 0xf8, 0xa8, 0x4a}}, {{0x8b, 0x00, 0x49, 0xdb, 0xfa, 0xf0, 0x1b, 0xa2, 0xed, 0x8a, 0x9a, 0x7a, 0x36, 0x78, 0x4a, 0xc7, 0xf7, 0xad, 0x39, 0xd0, 0x6c, 0x65, 0x7a, 0x41, 0xce, 0xd6, 0xd6, 0x4c, 0x20, 0x21, 0x6b, 0xc7}, {0xc6, 0xca, 0x78, 0x1d, 0x32, 0x6c, 0x6c, 0x06, 0x91, 0xf2, 0x1a, 0xe8, 0x43, 0x16, 0xea, 0x04, 0x3c, 0x1f, 0x07, 0x85, 0xf7, 0x09, 0x22, 0x08, 0xba, 0x13, 0xfd, 0x78, 0x1e, 0x3f, 0x6f, 0x62}}, {{0x25, 0x9b, 0x7c, 0xb0, 0xac, 0x72, 0x6f, 0xb2, 0xe3, 0x53, 0x84, 0x7a, 0x1a, 0x9a, 0x98, 0x9b, 0x44, 0xd3, 0x59, 0xd0, 0x8e, 0x57, 0x41, 0x40, 0x78, 0xa7, 0x30, 0x2f, 0x4c, 0x9c, 0xb9, 0x68}, {0xb7, 0x75, 0x03, 0x63, 0x61, 0xc2, 0x48, 0x6e, 0x12, 0x3d, 0xbf, 0x4b, 0x27, 0xdf, 0xb1, 0x7a, 0xff, 0x4e, 0x31, 0x07, 0x83, 0xf4, 0x62, 0x5b, 0x19, 0xa5, 0xac, 0xa0, 0x32, 0x58, 0x0d, 0xa7}}, {{0x43, 0x4f, 0x10, 0xa4, 0xca, 0xdb, 0x38, 0x67, 0xfa, 0xae, 0x96, 0xb5, 0x6d, 0x97, 0xff, 0x1f, 0xb6, 0x83, 0x43, 0xd3, 0xa0, 0x2d, 0x70, 0x7a, 0x64, 0x05, 0x4c, 0xa7, 0xc1, 0xa5, 0x21, 0x51}, {0xe4, 0xf1, 0x23, 0x84, 0xe1, 0xb5, 0x9d, 0xf2, 0xb8, 0x73, 0x8b, 0x45, 0x2b, 0x35, 0x46, 0x38, 0x10, 0x2b, 0x50, 0xf8, 0x8b, 0x35, 0xcd, 0x34, 0xc8, 0x0e, 0xf6, 0xdb, 0x09, 0x35, 0xf0, 0xda}}, {{0xdb, 0x21, 0x5c, 0x8d, 0x83, 0x1d, 0xb3, 0x34, 0xc7, 0x0e, 0x43, 0xa1, 0x58, 0x79, 0x67, 0x13, 0x1e, 0x86, 0x5d, 0x89, 0x63, 0xe6, 0x0a, 0x46, 0x5c, 0x02, 0x97, 0x1b, 0x62, 0x43, 0x86, 0xf5}, {0xdb, 0x21, 0x5c, 0x8d, 0x83, 0x1d, 0xb3, 0x34, 0xc7, 0x0e, 0x43, 0xa1, 0x58, 0x79, 0x67, 0x13, 0x1e, 0x86, 0x5d, 0x89, 0x63, 0xe6, 0x0a, 0x46, 0x5c, 0x02, 0x97, 0x1b, 0x62, 0x43, 0x86, 0xf5}} }; secp256k1_scalar_set_int(&one, 1); for (i = 0; i < 33; i++) { secp256k1_scalar_set_b32(&x, chal[i][0], &overflow); CHECK(!overflow); secp256k1_scalar_set_b32(&y, chal[i][1], &overflow); CHECK(!overflow); secp256k1_scalar_set_b32(&r1, res[i][0], &overflow); CHECK(!overflow); secp256k1_scalar_set_b32(&r2, res[i][1], &overflow); CHECK(!overflow); secp256k1_scalar_mul(&z, &x, &y); CHECK(!secp256k1_scalar_check_overflow(&z)); CHECK(secp256k1_scalar_eq(&r1, &z)); if (!secp256k1_scalar_is_zero(&y)) { secp256k1_scalar_inverse(&zz, &y); CHECK(!secp256k1_scalar_check_overflow(&zz)); #if defined(USE_SCALAR_INV_NUM) secp256k1_scalar_inverse_var(&zzv, &y); CHECK(secp256k1_scalar_eq(&zzv, &zz)); #endif secp256k1_scalar_mul(&z, &z, &zz); CHECK(!secp256k1_scalar_check_overflow(&z)); CHECK(secp256k1_scalar_eq(&x, &z)); secp256k1_scalar_mul(&zz, &zz, &y); CHECK(!secp256k1_scalar_check_overflow(&zz)); CHECK(secp256k1_scalar_eq(&one, &zz)); } secp256k1_scalar_mul(&z, &x, &x); CHECK(!secp256k1_scalar_check_overflow(&z)); secp256k1_scalar_sqr(&zz, &x); CHECK(!secp256k1_scalar_check_overflow(&zz)); CHECK(secp256k1_scalar_eq(&zz, &z)); CHECK(secp256k1_scalar_eq(&r2, &zz)); } } } /***** FIELD TESTS *****/ void random_fe(secp256k1_fe *x) { unsigned char bin[32]; do { secp256k1_rand256(bin); if (secp256k1_fe_set_b32(x, bin)) { return; } } while(1); } void random_fe_test(secp256k1_fe *x) { unsigned char bin[32]; do { secp256k1_rand256_test(bin); if (secp256k1_fe_set_b32(x, bin)) { return; } } while(1); } void random_fe_non_zero(secp256k1_fe *nz) { int tries = 10; while (--tries >= 0) { random_fe(nz); secp256k1_fe_normalize(nz); if (!secp256k1_fe_is_zero(nz)) { break; } } /* Infinitesimal probability of spurious failure here */ CHECK(tries >= 0); } void random_fe_non_square(secp256k1_fe *ns) { secp256k1_fe r; random_fe_non_zero(ns); if (secp256k1_fe_sqrt(&r, ns)) { secp256k1_fe_negate(ns, ns, 1); } } int check_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b) { secp256k1_fe an = *a; secp256k1_fe bn = *b; secp256k1_fe_normalize_weak(&an); secp256k1_fe_normalize_var(&bn); return secp256k1_fe_equal_var(&an, &bn); } int check_fe_inverse(const secp256k1_fe *a, const secp256k1_fe *ai) { secp256k1_fe x; secp256k1_fe one = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1); secp256k1_fe_mul(&x, a, ai); return check_fe_equal(&x, &one); } void run_field_convert(void) { static const unsigned char b32[32] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x40 }; static const secp256k1_fe_storage fes = SECP256K1_FE_STORAGE_CONST( 0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL, 0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL ); static const secp256k1_fe fe = SECP256K1_FE_CONST( 0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL, 0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL ); secp256k1_fe fe2; unsigned char b322[32]; secp256k1_fe_storage fes2; /* Check conversions to fe. */ CHECK(secp256k1_fe_set_b32(&fe2, b32)); CHECK(secp256k1_fe_equal_var(&fe, &fe2)); secp256k1_fe_from_storage(&fe2, &fes); CHECK(secp256k1_fe_equal_var(&fe, &fe2)); /* Check conversion from fe. */ secp256k1_fe_get_b32(b322, &fe); CHECK(memcmp(b322, b32, 32) == 0); secp256k1_fe_to_storage(&fes2, &fe); CHECK(memcmp(&fes2, &fes, sizeof(fes)) == 0); } int fe_memcmp(const secp256k1_fe *a, const secp256k1_fe *b) { secp256k1_fe t = *b; #ifdef VERIFY t.magnitude = a->magnitude; t.normalized = a->normalized; #endif return memcmp(a, &t, sizeof(secp256k1_fe)); } void run_field_misc(void) { secp256k1_fe x; secp256k1_fe y; secp256k1_fe z; secp256k1_fe q; secp256k1_fe fe5 = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 5); int i, j; for (i = 0; i < 5*count; i++) { secp256k1_fe_storage xs, ys, zs; random_fe(&x); random_fe_non_zero(&y); /* Test the fe equality and comparison operations. */ CHECK(secp256k1_fe_cmp_var(&x, &x) == 0); CHECK(secp256k1_fe_equal_var(&x, &x)); z = x; secp256k1_fe_add(&z,&y); /* Test fe conditional move; z is not normalized here. */ q = x; secp256k1_fe_cmov(&x, &z, 0); VERIFY_CHECK(!x.normalized && x.magnitude == z.magnitude); secp256k1_fe_cmov(&x, &x, 1); CHECK(fe_memcmp(&x, &z) != 0); CHECK(fe_memcmp(&x, &q) == 0); secp256k1_fe_cmov(&q, &z, 1); VERIFY_CHECK(!q.normalized && q.magnitude == z.magnitude); CHECK(fe_memcmp(&q, &z) == 0); secp256k1_fe_normalize_var(&x); secp256k1_fe_normalize_var(&z); CHECK(!secp256k1_fe_equal_var(&x, &z)); secp256k1_fe_normalize_var(&q); secp256k1_fe_cmov(&q, &z, (i&1)); VERIFY_CHECK(q.normalized && q.magnitude == 1); for (j = 0; j < 6; j++) { secp256k1_fe_negate(&z, &z, j+1); secp256k1_fe_normalize_var(&q); secp256k1_fe_cmov(&q, &z, (j&1)); VERIFY_CHECK(!q.normalized && q.magnitude == (j+2)); } secp256k1_fe_normalize_var(&z); /* Test storage conversion and conditional moves. */ secp256k1_fe_to_storage(&xs, &x); secp256k1_fe_to_storage(&ys, &y); secp256k1_fe_to_storage(&zs, &z); secp256k1_fe_storage_cmov(&zs, &xs, 0); secp256k1_fe_storage_cmov(&zs, &zs, 1); CHECK(memcmp(&xs, &zs, sizeof(xs)) != 0); secp256k1_fe_storage_cmov(&ys, &xs, 1); CHECK(memcmp(&xs, &ys, sizeof(xs)) == 0); secp256k1_fe_from_storage(&x, &xs); secp256k1_fe_from_storage(&y, &ys); secp256k1_fe_from_storage(&z, &zs); /* Test that mul_int, mul, and add agree. */ secp256k1_fe_add(&y, &x); secp256k1_fe_add(&y, &x); z = x; secp256k1_fe_mul_int(&z, 3); CHECK(check_fe_equal(&y, &z)); secp256k1_fe_add(&y, &x); secp256k1_fe_add(&z, &x); CHECK(check_fe_equal(&z, &y)); z = x; secp256k1_fe_mul_int(&z, 5); secp256k1_fe_mul(&q, &x, &fe5); CHECK(check_fe_equal(&z, &q)); secp256k1_fe_negate(&x, &x, 1); secp256k1_fe_add(&z, &x); secp256k1_fe_add(&q, &x); CHECK(check_fe_equal(&y, &z)); CHECK(check_fe_equal(&q, &y)); } } void run_field_inv(void) { secp256k1_fe x, xi, xii; int i; for (i = 0; i < 10*count; i++) { random_fe_non_zero(&x); secp256k1_fe_inv(&xi, &x); CHECK(check_fe_inverse(&x, &xi)); secp256k1_fe_inv(&xii, &xi); CHECK(check_fe_equal(&x, &xii)); } } void run_field_inv_var(void) { secp256k1_fe x, xi, xii; int i; for (i = 0; i < 10*count; i++) { random_fe_non_zero(&x); secp256k1_fe_inv_var(&xi, &x); CHECK(check_fe_inverse(&x, &xi)); secp256k1_fe_inv_var(&xii, &xi); CHECK(check_fe_equal(&x, &xii)); } } void run_field_inv_all_var(void) { secp256k1_fe x[16], xi[16], xii[16]; int i; /* Check it's safe to call for 0 elements */ secp256k1_fe_inv_all_var(xi, x, 0); for (i = 0; i < count; i++) { size_t j; size_t len = secp256k1_rand_int(15) + 1; for (j = 0; j < len; j++) { random_fe_non_zero(&x[j]); } secp256k1_fe_inv_all_var(xi, x, len); for (j = 0; j < len; j++) { CHECK(check_fe_inverse(&x[j], &xi[j])); } secp256k1_fe_inv_all_var(xii, xi, len); for (j = 0; j < len; j++) { CHECK(check_fe_equal(&x[j], &xii[j])); } } } void run_sqr(void) { secp256k1_fe x, s; { int i; secp256k1_fe_set_int(&x, 1); secp256k1_fe_negate(&x, &x, 1); for (i = 1; i <= 512; ++i) { secp256k1_fe_mul_int(&x, 2); secp256k1_fe_normalize(&x); secp256k1_fe_sqr(&s, &x); } } } void test_sqrt(const secp256k1_fe *a, const secp256k1_fe *k) { secp256k1_fe r1, r2; int v = secp256k1_fe_sqrt(&r1, a); CHECK((v == 0) == (k == NULL)); if (k != NULL) { /* Check that the returned root is +/- the given known answer */ secp256k1_fe_negate(&r2, &r1, 1); secp256k1_fe_add(&r1, k); secp256k1_fe_add(&r2, k); secp256k1_fe_normalize(&r1); secp256k1_fe_normalize(&r2); CHECK(secp256k1_fe_is_zero(&r1) || secp256k1_fe_is_zero(&r2)); } } void run_sqrt(void) { secp256k1_fe ns, x, s, t; int i; /* Check sqrt(0) is 0 */ secp256k1_fe_set_int(&x, 0); secp256k1_fe_sqr(&s, &x); test_sqrt(&s, &x); /* Check sqrt of small squares (and their negatives) */ for (i = 1; i <= 100; i++) { secp256k1_fe_set_int(&x, i); secp256k1_fe_sqr(&s, &x); test_sqrt(&s, &x); secp256k1_fe_negate(&t, &s, 1); test_sqrt(&t, NULL); } /* Consistency checks for large random values */ for (i = 0; i < 10; i++) { int j; random_fe_non_square(&ns); for (j = 0; j < count; j++) { random_fe(&x); secp256k1_fe_sqr(&s, &x); test_sqrt(&s, &x); secp256k1_fe_negate(&t, &s, 1); test_sqrt(&t, NULL); secp256k1_fe_mul(&t, &s, &ns); test_sqrt(&t, NULL); } } } /***** GROUP TESTS *****/ void ge_equals_ge(const secp256k1_ge *a, const secp256k1_ge *b) { CHECK(a->infinity == b->infinity); if (a->infinity) { return; } CHECK(secp256k1_fe_equal_var(&a->x, &b->x)); CHECK(secp256k1_fe_equal_var(&a->y, &b->y)); } /* This compares jacobian points including their Z, not just their geometric meaning. */ int gej_xyz_equals_gej(const secp256k1_gej *a, const secp256k1_gej *b) { secp256k1_gej a2; secp256k1_gej b2; int ret = 1; ret &= a->infinity == b->infinity; if (ret && !a->infinity) { a2 = *a; b2 = *b; secp256k1_fe_normalize(&a2.x); secp256k1_fe_normalize(&a2.y); secp256k1_fe_normalize(&a2.z); secp256k1_fe_normalize(&b2.x); secp256k1_fe_normalize(&b2.y); secp256k1_fe_normalize(&b2.z); ret &= secp256k1_fe_cmp_var(&a2.x, &b2.x) == 0; ret &= secp256k1_fe_cmp_var(&a2.y, &b2.y) == 0; ret &= secp256k1_fe_cmp_var(&a2.z, &b2.z) == 0; } return ret; } void ge_equals_gej(const secp256k1_ge *a, const secp256k1_gej *b) { secp256k1_fe z2s; secp256k1_fe u1, u2, s1, s2; CHECK(a->infinity == b->infinity); if (a->infinity) { return; } /* Check a.x * b.z^2 == b.x && a.y * b.z^3 == b.y, to avoid inverses. */ secp256k1_fe_sqr(&z2s, &b->z); secp256k1_fe_mul(&u1, &a->x, &z2s); u2 = b->x; secp256k1_fe_normalize_weak(&u2); secp256k1_fe_mul(&s1, &a->y, &z2s); secp256k1_fe_mul(&s1, &s1, &b->z); s2 = b->y; secp256k1_fe_normalize_weak(&s2); CHECK(secp256k1_fe_equal_var(&u1, &u2)); CHECK(secp256k1_fe_equal_var(&s1, &s2)); } void test_ge(void) { int i, i1; #ifdef USE_ENDOMORPHISM int runs = 6; #else int runs = 4; #endif /* Points: (infinity, p1, p1, -p1, -p1, p2, p2, -p2, -p2, p3, p3, -p3, -p3, p4, p4, -p4, -p4). * The second in each pair of identical points uses a random Z coordinate in the Jacobian form. * All magnitudes are randomized. * All 17*17 combinations of points are added to each other, using all applicable methods. * * When the endomorphism code is compiled in, p5 = lambda*p1 and p6 = lambda^2*p1 are added as well. */ secp256k1_ge *ge = (secp256k1_ge *)malloc(sizeof(secp256k1_ge) * (1 + 4 * runs)); secp256k1_gej *gej = (secp256k1_gej *)malloc(sizeof(secp256k1_gej) * (1 + 4 * runs)); secp256k1_fe *zinv = (secp256k1_fe *)malloc(sizeof(secp256k1_fe) * (1 + 4 * runs)); secp256k1_fe zf; secp256k1_fe zfi2, zfi3; secp256k1_gej_set_infinity(&gej[0]); secp256k1_ge_clear(&ge[0]); secp256k1_ge_set_gej_var(&ge[0], &gej[0]); for (i = 0; i < runs; i++) { int j; secp256k1_ge g; random_group_element_test(&g); #ifdef USE_ENDOMORPHISM if (i >= runs - 2) { secp256k1_ge_mul_lambda(&g, &ge[1]); } if (i >= runs - 1) { secp256k1_ge_mul_lambda(&g, &g); } #endif ge[1 + 4 * i] = g; ge[2 + 4 * i] = g; secp256k1_ge_neg(&ge[3 + 4 * i], &g); secp256k1_ge_neg(&ge[4 + 4 * i], &g); secp256k1_gej_set_ge(&gej[1 + 4 * i], &ge[1 + 4 * i]); random_group_element_jacobian_test(&gej[2 + 4 * i], &ge[2 + 4 * i]); secp256k1_gej_set_ge(&gej[3 + 4 * i], &ge[3 + 4 * i]); random_group_element_jacobian_test(&gej[4 + 4 * i], &ge[4 + 4 * i]); for (j = 0; j < 4; j++) { random_field_element_magnitude(&ge[1 + j + 4 * i].x); random_field_element_magnitude(&ge[1 + j + 4 * i].y); random_field_element_magnitude(&gej[1 + j + 4 * i].x); random_field_element_magnitude(&gej[1 + j + 4 * i].y); random_field_element_magnitude(&gej[1 + j + 4 * i].z); } } /* Compute z inverses. */ { secp256k1_fe *zs = malloc(sizeof(secp256k1_fe) * (1 + 4 * runs)); for (i = 0; i < 4 * runs + 1; i++) { if (i == 0) { /* The point at infinity does not have a meaningful z inverse. Any should do. */ do { random_field_element_test(&zs[i]); } while(secp256k1_fe_is_zero(&zs[i])); } else { zs[i] = gej[i].z; } } secp256k1_fe_inv_all_var(zinv, zs, 4 * runs + 1); free(zs); } /* Generate random zf, and zfi2 = 1/zf^2, zfi3 = 1/zf^3 */ do { random_field_element_test(&zf); } while(secp256k1_fe_is_zero(&zf)); random_field_element_magnitude(&zf); secp256k1_fe_inv_var(&zfi3, &zf); secp256k1_fe_sqr(&zfi2, &zfi3); secp256k1_fe_mul(&zfi3, &zfi3, &zfi2); for (i1 = 0; i1 < 1 + 4 * runs; i1++) { int i2; for (i2 = 0; i2 < 1 + 4 * runs; i2++) { /* Compute reference result using gej + gej (var). */ secp256k1_gej refj, resj; secp256k1_ge ref; secp256k1_fe zr; secp256k1_gej_add_var(&refj, &gej[i1], &gej[i2], secp256k1_gej_is_infinity(&gej[i1]) ? NULL : &zr); /* Check Z ratio. */ if (!secp256k1_gej_is_infinity(&gej[i1]) && !secp256k1_gej_is_infinity(&refj)) { secp256k1_fe zrz; secp256k1_fe_mul(&zrz, &zr, &gej[i1].z); CHECK(secp256k1_fe_equal_var(&zrz, &refj.z)); } secp256k1_ge_set_gej_var(&ref, &refj); /* Test gej + ge with Z ratio result (var). */ secp256k1_gej_add_ge_var(&resj, &gej[i1], &ge[i2], secp256k1_gej_is_infinity(&gej[i1]) ? NULL : &zr); ge_equals_gej(&ref, &resj); if (!secp256k1_gej_is_infinity(&gej[i1]) && !secp256k1_gej_is_infinity(&resj)) { secp256k1_fe zrz; secp256k1_fe_mul(&zrz, &zr, &gej[i1].z); CHECK(secp256k1_fe_equal_var(&zrz, &resj.z)); } /* Test gej + ge (var, with additional Z factor). */ { secp256k1_ge ge2_zfi = ge[i2]; /* the second term with x and y rescaled for z = 1/zf */ secp256k1_fe_mul(&ge2_zfi.x, &ge2_zfi.x, &zfi2); secp256k1_fe_mul(&ge2_zfi.y, &ge2_zfi.y, &zfi3); random_field_element_magnitude(&ge2_zfi.x); random_field_element_magnitude(&ge2_zfi.y); secp256k1_gej_add_zinv_var(&resj, &gej[i1], &ge2_zfi, &zf); ge_equals_gej(&ref, &resj); } /* Test gej + ge (const). */ if (i2 != 0) { /* secp256k1_gej_add_ge does not support its second argument being infinity. */ secp256k1_gej_add_ge(&resj, &gej[i1], &ge[i2]); ge_equals_gej(&ref, &resj); } /* Test doubling (var). */ if ((i1 == 0 && i2 == 0) || ((i1 + 3)/4 == (i2 + 3)/4 && ((i1 + 3)%4)/2 == ((i2 + 3)%4)/2)) { secp256k1_fe zr2; /* Normal doubling with Z ratio result. */ secp256k1_gej_double_var(&resj, &gej[i1], &zr2); ge_equals_gej(&ref, &resj); /* Check Z ratio. */ secp256k1_fe_mul(&zr2, &zr2, &gej[i1].z); CHECK(secp256k1_fe_equal_var(&zr2, &resj.z)); /* Normal doubling. */ secp256k1_gej_double_var(&resj, &gej[i2], NULL); ge_equals_gej(&ref, &resj); } /* Test adding opposites. */ if ((i1 == 0 && i2 == 0) || ((i1 + 3)/4 == (i2 + 3)/4 && ((i1 + 3)%4)/2 != ((i2 + 3)%4)/2)) { CHECK(secp256k1_ge_is_infinity(&ref)); } /* Test adding infinity. */ if (i1 == 0) { CHECK(secp256k1_ge_is_infinity(&ge[i1])); CHECK(secp256k1_gej_is_infinity(&gej[i1])); ge_equals_gej(&ref, &gej[i2]); } if (i2 == 0) { CHECK(secp256k1_ge_is_infinity(&ge[i2])); CHECK(secp256k1_gej_is_infinity(&gej[i2])); ge_equals_gej(&ref, &gej[i1]); } } } /* Test adding all points together in random order equals infinity. */ { secp256k1_gej sum = SECP256K1_GEJ_CONST_INFINITY; secp256k1_gej *gej_shuffled = (secp256k1_gej *)malloc((4 * runs + 1) * sizeof(secp256k1_gej)); for (i = 0; i < 4 * runs + 1; i++) { gej_shuffled[i] = gej[i]; } for (i = 0; i < 4 * runs + 1; i++) { int swap = i + secp256k1_rand_int(4 * runs + 1 - i); if (swap != i) { secp256k1_gej t = gej_shuffled[i]; gej_shuffled[i] = gej_shuffled[swap]; gej_shuffled[swap] = t; } } for (i = 0; i < 4 * runs + 1; i++) { secp256k1_gej_add_var(&sum, &sum, &gej_shuffled[i], NULL); } CHECK(secp256k1_gej_is_infinity(&sum)); free(gej_shuffled); } /* Test batch gej -> ge conversion with and without known z ratios. */ { secp256k1_fe *zr = (secp256k1_fe *)malloc((4 * runs + 1) * sizeof(secp256k1_fe)); secp256k1_ge *ge_set_table = (secp256k1_ge *)malloc((4 * runs + 1) * sizeof(secp256k1_ge)); secp256k1_ge *ge_set_all = (secp256k1_ge *)malloc((4 * runs + 1) * sizeof(secp256k1_ge)); for (i = 0; i < 4 * runs + 1; i++) { /* Compute gej[i + 1].z / gez[i].z (with gej[n].z taken to be 1). */ if (i < 4 * runs) { secp256k1_fe_mul(&zr[i + 1], &zinv[i], &gej[i + 1].z); } } secp256k1_ge_set_table_gej_var(ge_set_table, gej, zr, 4 * runs + 1); secp256k1_ge_set_all_gej_var(ge_set_all, gej, 4 * runs + 1, &ctx->error_callback); for (i = 0; i < 4 * runs + 1; i++) { secp256k1_fe s; random_fe_non_zero(&s); secp256k1_gej_rescale(&gej[i], &s); ge_equals_gej(&ge_set_table[i], &gej[i]); ge_equals_gej(&ge_set_all[i], &gej[i]); } free(ge_set_table); free(ge_set_all); free(zr); } free(ge); free(gej); free(zinv); } void test_add_neg_y_diff_x(void) { /* The point of this test is to check that we can add two points * whose y-coordinates are negatives of each other but whose x * coordinates differ. If the x-coordinates were the same, these * points would be negatives of each other and their sum is * infinity. This is cool because it "covers up" any degeneracy * in the addition algorithm that would cause the xy coordinates * of the sum to be wrong (since infinity has no xy coordinates). * HOWEVER, if the x-coordinates are different, infinity is the * wrong answer, and such degeneracies are exposed. This is the * root of https://github.com/bitcoin-core/secp256k1/issues/257 * which this test is a regression test for. * * These points were generated in sage as * # secp256k1 params * F = FiniteField (0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F) * C = EllipticCurve ([F (0), F (7)]) * G = C.lift_x(0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798) * N = FiniteField(G.order()) * * # endomorphism values (lambda is 1^{1/3} in N, beta is 1^{1/3} in F) * x = polygen(N) * lam = (1 - x^3).roots()[1][0] * * # random "bad pair" * P = C.random_element() * Q = -int(lam) * P * print " P: %x %x" % P.xy() * print " Q: %x %x" % Q.xy() * print "P + Q: %x %x" % (P + Q).xy() */ secp256k1_gej aj = SECP256K1_GEJ_CONST( 0x8d24cd95, 0x0a355af1, 0x3c543505, 0x44238d30, 0x0643d79f, 0x05a59614, 0x2f8ec030, 0xd58977cb, 0x001e337a, 0x38093dcd, 0x6c0f386d, 0x0b1293a8, 0x4d72c879, 0xd7681924, 0x44e6d2f3, 0x9190117d ); secp256k1_gej bj = SECP256K1_GEJ_CONST( 0xc7b74206, 0x1f788cd9, 0xabd0937d, 0x164a0d86, 0x95f6ff75, 0xf19a4ce9, 0xd013bd7b, 0xbf92d2a7, 0xffe1cc85, 0xc7f6c232, 0x93f0c792, 0xf4ed6c57, 0xb28d3786, 0x2897e6db, 0xbb192d0b, 0x6e6feab2 ); secp256k1_gej sumj = SECP256K1_GEJ_CONST( 0x671a63c0, 0x3efdad4c, 0x389a7798, 0x24356027, 0xb3d69010, 0x278625c3, 0x5c86d390, 0x184a8f7a, 0x5f6409c2, 0x2ce01f2b, 0x511fd375, 0x25071d08, 0xda651801, 0x70e95caf, 0x8f0d893c, 0xbed8fbbe ); secp256k1_ge b; secp256k1_gej resj; secp256k1_ge res; secp256k1_ge_set_gej(&b, &bj); secp256k1_gej_add_var(&resj, &aj, &bj, NULL); secp256k1_ge_set_gej(&res, &resj); ge_equals_gej(&res, &sumj); secp256k1_gej_add_ge(&resj, &aj, &b); secp256k1_ge_set_gej(&res, &resj); ge_equals_gej(&res, &sumj); secp256k1_gej_add_ge_var(&resj, &aj, &b, NULL); secp256k1_ge_set_gej(&res, &resj); ge_equals_gej(&res, &sumj); } void run_ge(void) { int i; for (i = 0; i < count * 32; i++) { test_ge(); } test_add_neg_y_diff_x(); } void test_ec_combine(void) { secp256k1_scalar sum = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0); secp256k1_pubkey data[6]; const secp256k1_pubkey* d[6]; secp256k1_pubkey sd; secp256k1_pubkey sd2; secp256k1_gej Qj; secp256k1_ge Q; int i; for (i = 1; i <= 6; i++) { secp256k1_scalar s; random_scalar_order_test(&s); secp256k1_scalar_add(&sum, &sum, &s); secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &Qj, &s); secp256k1_ge_set_gej(&Q, &Qj); secp256k1_pubkey_save(&data[i - 1], &Q); d[i - 1] = &data[i - 1]; secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &Qj, &sum); secp256k1_ge_set_gej(&Q, &Qj); secp256k1_pubkey_save(&sd, &Q); CHECK(secp256k1_ec_pubkey_combine(ctx, &sd2, d, i) == 1); CHECK(memcmp(&sd, &sd2, sizeof(sd)) == 0); } } void run_ec_combine(void) { int i; for (i = 0; i < count * 8; i++) { test_ec_combine(); } } void test_group_decompress(const secp256k1_fe* x) { /* The input itself, normalized. */ secp256k1_fe fex = *x; secp256k1_fe fez; /* Results of set_xquad_var, set_xo_var(..., 0), set_xo_var(..., 1). */ secp256k1_ge ge_quad, ge_even, ge_odd; secp256k1_gej gej_quad; /* Return values of the above calls. */ int res_quad, res_even, res_odd; secp256k1_fe_normalize_var(&fex); res_quad = secp256k1_ge_set_xquad(&ge_quad, &fex); res_even = secp256k1_ge_set_xo_var(&ge_even, &fex, 0); res_odd = secp256k1_ge_set_xo_var(&ge_odd, &fex, 1); CHECK(res_quad == res_even); CHECK(res_quad == res_odd); if (res_quad) { secp256k1_fe_normalize_var(&ge_quad.x); secp256k1_fe_normalize_var(&ge_odd.x); secp256k1_fe_normalize_var(&ge_even.x); secp256k1_fe_normalize_var(&ge_quad.y); secp256k1_fe_normalize_var(&ge_odd.y); secp256k1_fe_normalize_var(&ge_even.y); /* No infinity allowed. */ CHECK(!ge_quad.infinity); CHECK(!ge_even.infinity); CHECK(!ge_odd.infinity); /* Check that the x coordinates check out. */ CHECK(secp256k1_fe_equal_var(&ge_quad.x, x)); CHECK(secp256k1_fe_equal_var(&ge_even.x, x)); CHECK(secp256k1_fe_equal_var(&ge_odd.x, x)); /* Check that the Y coordinate result in ge_quad is a square. */ CHECK(secp256k1_fe_is_quad_var(&ge_quad.y)); /* Check odd/even Y in ge_odd, ge_even. */ CHECK(secp256k1_fe_is_odd(&ge_odd.y)); CHECK(!secp256k1_fe_is_odd(&ge_even.y)); /* Check secp256k1_gej_has_quad_y_var. */ secp256k1_gej_set_ge(&gej_quad, &ge_quad); CHECK(secp256k1_gej_has_quad_y_var(&gej_quad)); do { random_fe_test(&fez); } while (secp256k1_fe_is_zero(&fez)); secp256k1_gej_rescale(&gej_quad, &fez); CHECK(secp256k1_gej_has_quad_y_var(&gej_quad)); secp256k1_gej_neg(&gej_quad, &gej_quad); CHECK(!secp256k1_gej_has_quad_y_var(&gej_quad)); do { random_fe_test(&fez); } while (secp256k1_fe_is_zero(&fez)); secp256k1_gej_rescale(&gej_quad, &fez); CHECK(!secp256k1_gej_has_quad_y_var(&gej_quad)); secp256k1_gej_neg(&gej_quad, &gej_quad); CHECK(secp256k1_gej_has_quad_y_var(&gej_quad)); } } void run_group_decompress(void) { int i; for (i = 0; i < count * 4; i++) { secp256k1_fe fe; random_fe_test(&fe); test_group_decompress(&fe); } } /***** ECMULT TESTS *****/ void run_ecmult_chain(void) { /* random starting point A (on the curve) */ secp256k1_gej a = SECP256K1_GEJ_CONST( 0x8b30bbe9, 0xae2a9906, 0x96b22f67, 0x0709dff3, 0x727fd8bc, 0x04d3362c, 0x6c7bf458, 0xe2846004, 0xa357ae91, 0x5c4a6528, 0x1309edf2, 0x0504740f, 0x0eb33439, 0x90216b4f, 0x81063cb6, 0x5f2f7e0f ); /* two random initial factors xn and gn */ secp256k1_scalar xn = SECP256K1_SCALAR_CONST( 0x84cc5452, 0xf7fde1ed, 0xb4d38a8c, 0xe9b1b84c, 0xcef31f14, 0x6e569be9, 0x705d357a, 0x42985407 ); secp256k1_scalar gn = SECP256K1_SCALAR_CONST( 0xa1e58d22, 0x553dcd42, 0xb2398062, 0x5d4c57a9, 0x6e9323d4, 0x2b3152e5, 0xca2c3990, 0xedc7c9de ); /* two small multipliers to be applied to xn and gn in every iteration: */ static const secp256k1_scalar xf = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0x1337); static const secp256k1_scalar gf = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0x7113); /* accumulators with the resulting coefficients to A and G */ secp256k1_scalar ae = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1); secp256k1_scalar ge = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0); /* actual points */ secp256k1_gej x; secp256k1_gej x2; int i; /* the point being computed */ x = a; for (i = 0; i < 200*count; i++) { /* in each iteration, compute X = xn*X + gn*G; */ secp256k1_ecmult(&ctx->ecmult_ctx, &x, &x, &xn, &gn); /* also compute ae and ge: the actual accumulated factors for A and G */ /* if X was (ae*A+ge*G), xn*X + gn*G results in (xn*ae*A + (xn*ge+gn)*G) */ secp256k1_scalar_mul(&ae, &ae, &xn); secp256k1_scalar_mul(&ge, &ge, &xn); secp256k1_scalar_add(&ge, &ge, &gn); /* modify xn and gn */ secp256k1_scalar_mul(&xn, &xn, &xf); secp256k1_scalar_mul(&gn, &gn, &gf); /* verify */ if (i == 19999) { /* expected result after 19999 iterations */ secp256k1_gej rp = SECP256K1_GEJ_CONST( 0xD6E96687, 0xF9B10D09, 0x2A6F3543, 0x9D86CEBE, 0xA4535D0D, 0x409F5358, 0x6440BD74, 0xB933E830, 0xB95CBCA2, 0xC77DA786, 0x539BE8FD, 0x53354D2D, 0x3B4F566A, 0xE6580454, 0x07ED6015, 0xEE1B2A88 ); secp256k1_gej_neg(&rp, &rp); secp256k1_gej_add_var(&rp, &rp, &x, NULL); CHECK(secp256k1_gej_is_infinity(&rp)); } } /* redo the computation, but directly with the resulting ae and ge coefficients: */ secp256k1_ecmult(&ctx->ecmult_ctx, &x2, &a, &ae, &ge); secp256k1_gej_neg(&x2, &x2); secp256k1_gej_add_var(&x2, &x2, &x, NULL); CHECK(secp256k1_gej_is_infinity(&x2)); } void test_point_times_order(const secp256k1_gej *point) { /* X * (point + G) + (order-X) * (pointer + G) = 0 */ secp256k1_scalar x; secp256k1_scalar nx; secp256k1_scalar zero = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0); secp256k1_scalar one = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1); secp256k1_gej res1, res2; secp256k1_ge res3; unsigned char pub[65]; size_t psize = 65; random_scalar_order_test(&x); secp256k1_scalar_negate(&nx, &x); secp256k1_ecmult(&ctx->ecmult_ctx, &res1, point, &x, &x); /* calc res1 = x * point + x * G; */ secp256k1_ecmult(&ctx->ecmult_ctx, &res2, point, &nx, &nx); /* calc res2 = (order - x) * point + (order - x) * G; */ secp256k1_gej_add_var(&res1, &res1, &res2, NULL); CHECK(secp256k1_gej_is_infinity(&res1)); CHECK(secp256k1_gej_is_valid_var(&res1) == 0); secp256k1_ge_set_gej(&res3, &res1); CHECK(secp256k1_ge_is_infinity(&res3)); CHECK(secp256k1_ge_is_valid_var(&res3) == 0); CHECK(secp256k1_eckey_pubkey_serialize(&res3, pub, &psize, 0) == 0); psize = 65; CHECK(secp256k1_eckey_pubkey_serialize(&res3, pub, &psize, 1) == 0); /* check zero/one edge cases */ secp256k1_ecmult(&ctx->ecmult_ctx, &res1, point, &zero, &zero); secp256k1_ge_set_gej(&res3, &res1); CHECK(secp256k1_ge_is_infinity(&res3)); secp256k1_ecmult(&ctx->ecmult_ctx, &res1, point, &one, &zero); secp256k1_ge_set_gej(&res3, &res1); ge_equals_gej(&res3, point); secp256k1_ecmult(&ctx->ecmult_ctx, &res1, point, &zero, &one); secp256k1_ge_set_gej(&res3, &res1); ge_equals_ge(&res3, &secp256k1_ge_const_g); } void run_point_times_order(void) { int i; secp256k1_fe x = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 2); static const secp256k1_fe xr = SECP256K1_FE_CONST( 0x7603CB59, 0xB0EF6C63, 0xFE608479, 0x2A0C378C, 0xDB3233A8, 0x0F8A9A09, 0xA877DEAD, 0x31B38C45 ); for (i = 0; i < 500; i++) { secp256k1_ge p; if (secp256k1_ge_set_xo_var(&p, &x, 1)) { secp256k1_gej j; CHECK(secp256k1_ge_is_valid_var(&p)); secp256k1_gej_set_ge(&j, &p); CHECK(secp256k1_gej_is_valid_var(&j)); test_point_times_order(&j); } secp256k1_fe_sqr(&x, &x); } secp256k1_fe_normalize_var(&x); CHECK(secp256k1_fe_equal_var(&x, &xr)); } void ecmult_const_random_mult(void) { /* random starting point A (on the curve) */ secp256k1_ge a = SECP256K1_GE_CONST( 0x6d986544, 0x57ff52b8, 0xcf1b8126, 0x5b802a5b, 0xa97f9263, 0xb1e88044, 0x93351325, 0x91bc450a, 0x535c59f7, 0x325e5d2b, 0xc391fbe8, 0x3c12787c, 0x337e4a98, 0xe82a9011, 0x0123ba37, 0xdd769c7d ); /* random initial factor xn */ secp256k1_scalar xn = SECP256K1_SCALAR_CONST( 0x649d4f77, 0xc4242df7, 0x7f2079c9, 0x14530327, 0xa31b876a, 0xd2d8ce2a, 0x2236d5c6, 0xd7b2029b ); /* expected xn * A (from sage) */ secp256k1_ge expected_b = SECP256K1_GE_CONST( 0x23773684, 0x4d209dc7, 0x098a786f, 0x20d06fcd, 0x070a38bf, 0xc11ac651, 0x03004319, 0x1e2a8786, 0xed8c3b8e, 0xc06dd57b, 0xd06ea66e, 0x45492b0f, 0xb84e4e1b, 0xfb77e21f, 0x96baae2a, 0x63dec956 ); secp256k1_gej b; secp256k1_ecmult_const(&b, &a, &xn); CHECK(secp256k1_ge_is_valid_var(&a)); ge_equals_gej(&expected_b, &b); } void ecmult_const_commutativity(void) { secp256k1_scalar a; secp256k1_scalar b; secp256k1_gej res1; secp256k1_gej res2; secp256k1_ge mid1; secp256k1_ge mid2; random_scalar_order_test(&a); random_scalar_order_test(&b); secp256k1_ecmult_const(&res1, &secp256k1_ge_const_g, &a); secp256k1_ecmult_const(&res2, &secp256k1_ge_const_g, &b); secp256k1_ge_set_gej(&mid1, &res1); secp256k1_ge_set_gej(&mid2, &res2); secp256k1_ecmult_const(&res1, &mid1, &b); secp256k1_ecmult_const(&res2, &mid2, &a); secp256k1_ge_set_gej(&mid1, &res1); secp256k1_ge_set_gej(&mid2, &res2); ge_equals_ge(&mid1, &mid2); } void ecmult_const_mult_zero_one(void) { secp256k1_scalar zero = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0); secp256k1_scalar one = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1); secp256k1_scalar negone; secp256k1_gej res1; secp256k1_ge res2; secp256k1_ge point; secp256k1_scalar_negate(&negone, &one); random_group_element_test(&point); secp256k1_ecmult_const(&res1, &point, &zero); secp256k1_ge_set_gej(&res2, &res1); CHECK(secp256k1_ge_is_infinity(&res2)); secp256k1_ecmult_const(&res1, &point, &one); secp256k1_ge_set_gej(&res2, &res1); ge_equals_ge(&res2, &point); secp256k1_ecmult_const(&res1, &point, &negone); secp256k1_gej_neg(&res1, &res1); secp256k1_ge_set_gej(&res2, &res1); ge_equals_ge(&res2, &point); } void ecmult_const_chain_multiply(void) { /* Check known result (randomly generated test problem from sage) */ const secp256k1_scalar scalar = SECP256K1_SCALAR_CONST( 0x4968d524, 0x2abf9b7a, 0x466abbcf, 0x34b11b6d, 0xcd83d307, 0x827bed62, 0x05fad0ce, 0x18fae63b ); const secp256k1_gej expected_point = SECP256K1_GEJ_CONST( 0x5494c15d, 0x32099706, 0xc2395f94, 0x348745fd, 0x757ce30e, 0x4e8c90fb, 0xa2bad184, 0xf883c69f, 0x5d195d20, 0xe191bf7f, 0x1be3e55f, 0x56a80196, 0x6071ad01, 0xf1462f66, 0xc997fa94, 0xdb858435 ); secp256k1_gej point; secp256k1_ge res; int i; secp256k1_gej_set_ge(&point, &secp256k1_ge_const_g); for (i = 0; i < 100; ++i) { secp256k1_ge tmp; secp256k1_ge_set_gej(&tmp, &point); secp256k1_ecmult_const(&point, &tmp, &scalar); } secp256k1_ge_set_gej(&res, &point); ge_equals_gej(&res, &expected_point); } void run_ecmult_const_tests(void) { ecmult_const_mult_zero_one(); ecmult_const_random_mult(); ecmult_const_commutativity(); ecmult_const_chain_multiply(); } void test_wnaf(const secp256k1_scalar *number, int w) { secp256k1_scalar x, two, t; int wnaf[256]; int zeroes = -1; int i; int bits; secp256k1_scalar_set_int(&x, 0); secp256k1_scalar_set_int(&two, 2); bits = secp256k1_ecmult_wnaf(wnaf, 256, number, w); CHECK(bits <= 256); for (i = bits-1; i >= 0; i--) { int v = wnaf[i]; secp256k1_scalar_mul(&x, &x, &two); if (v) { CHECK(zeroes == -1 || zeroes >= w-1); /* check that distance between non-zero elements is at least w-1 */ zeroes=0; CHECK((v & 1) == 1); /* check non-zero elements are odd */ CHECK(v <= (1 << (w-1)) - 1); /* check range below */ CHECK(v >= -(1 << (w-1)) - 1); /* check range above */ } else { CHECK(zeroes != -1); /* check that no unnecessary zero padding exists */ zeroes++; } if (v >= 0) { secp256k1_scalar_set_int(&t, v); } else { secp256k1_scalar_set_int(&t, -v); secp256k1_scalar_negate(&t, &t); } secp256k1_scalar_add(&x, &x, &t); } CHECK(secp256k1_scalar_eq(&x, number)); /* check that wnaf represents number */ } void test_constant_wnaf_negate(const secp256k1_scalar *number) { secp256k1_scalar neg1 = *number; secp256k1_scalar neg2 = *number; int sign1 = 1; int sign2 = 1; if (!secp256k1_scalar_get_bits(&neg1, 0, 1)) { secp256k1_scalar_negate(&neg1, &neg1); sign1 = -1; } sign2 = secp256k1_scalar_cond_negate(&neg2, secp256k1_scalar_is_even(&neg2)); CHECK(sign1 == sign2); CHECK(secp256k1_scalar_eq(&neg1, &neg2)); } void test_constant_wnaf(const secp256k1_scalar *number, int w) { secp256k1_scalar x, shift; int wnaf[256] = {0}; int i; int skew; secp256k1_scalar num = *number; secp256k1_scalar_set_int(&x, 0); secp256k1_scalar_set_int(&shift, 1 << w); /* With USE_ENDOMORPHISM on we only consider 128-bit numbers */ #ifdef USE_ENDOMORPHISM for (i = 0; i < 16; ++i) { secp256k1_scalar_shr_int(&num, 8); } #endif skew = secp256k1_wnaf_const(wnaf, num, w); for (i = WNAF_SIZE(w); i >= 0; --i) { secp256k1_scalar t; int v = wnaf[i]; CHECK(v != 0); /* check nonzero */ CHECK(v & 1); /* check parity */ CHECK(v > -(1 << w)); /* check range above */ CHECK(v < (1 << w)); /* check range below */ secp256k1_scalar_mul(&x, &x, &shift); if (v >= 0) { secp256k1_scalar_set_int(&t, v); } else { secp256k1_scalar_set_int(&t, -v); secp256k1_scalar_negate(&t, &t); } secp256k1_scalar_add(&x, &x, &t); } /* Skew num because when encoding numbers as odd we use an offset */ secp256k1_scalar_cadd_bit(&num, skew == 2, 1); CHECK(secp256k1_scalar_eq(&x, &num)); } void run_wnaf(void) { int i; secp256k1_scalar n = {{0}}; /* Sanity check: 1 and 2 are the smallest odd and even numbers and should * have easier-to-diagnose failure modes */ n.d[0] = 1; test_constant_wnaf(&n, 4); n.d[0] = 2; test_constant_wnaf(&n, 4); /* Random tests */ for (i = 0; i < count; i++) { random_scalar_order(&n); test_wnaf(&n, 4+(i%10)); test_constant_wnaf_negate(&n); test_constant_wnaf(&n, 4 + (i % 10)); } secp256k1_scalar_set_int(&n, 0); CHECK(secp256k1_scalar_cond_negate(&n, 1) == -1); CHECK(secp256k1_scalar_is_zero(&n)); CHECK(secp256k1_scalar_cond_negate(&n, 0) == 1); CHECK(secp256k1_scalar_is_zero(&n)); } void test_ecmult_constants(void) { /* Test ecmult_gen() for [0..36) and [order-36..0). */ secp256k1_scalar x; secp256k1_gej r; secp256k1_ge ng; int i; int j; secp256k1_ge_neg(&ng, &secp256k1_ge_const_g); for (i = 0; i < 36; i++ ) { secp256k1_scalar_set_int(&x, i); secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &r, &x); for (j = 0; j < i; j++) { if (j == i - 1) { ge_equals_gej(&secp256k1_ge_const_g, &r); } secp256k1_gej_add_ge(&r, &r, &ng); } CHECK(secp256k1_gej_is_infinity(&r)); } for (i = 1; i <= 36; i++ ) { secp256k1_scalar_set_int(&x, i); secp256k1_scalar_negate(&x, &x); secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &r, &x); for (j = 0; j < i; j++) { if (j == i - 1) { ge_equals_gej(&ng, &r); } secp256k1_gej_add_ge(&r, &r, &secp256k1_ge_const_g); } CHECK(secp256k1_gej_is_infinity(&r)); } } void run_ecmult_constants(void) { test_ecmult_constants(); } void test_ecmult_gen_blind(void) { /* Test ecmult_gen() blinding and confirm that the blinding changes, the affine points match, and the z's don't match. */ secp256k1_scalar key; secp256k1_scalar b; unsigned char seed32[32]; secp256k1_gej pgej; secp256k1_gej pgej2; secp256k1_gej i; secp256k1_ge pge; random_scalar_order_test(&key); secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pgej, &key); secp256k1_rand256(seed32); b = ctx->ecmult_gen_ctx.blind; i = ctx->ecmult_gen_ctx.initial; secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, seed32); CHECK(!secp256k1_scalar_eq(&b, &ctx->ecmult_gen_ctx.blind)); secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pgej2, &key); CHECK(!gej_xyz_equals_gej(&pgej, &pgej2)); CHECK(!gej_xyz_equals_gej(&i, &ctx->ecmult_gen_ctx.initial)); secp256k1_ge_set_gej(&pge, &pgej); ge_equals_gej(&pge, &pgej2); } void test_ecmult_gen_blind_reset(void) { /* Test ecmult_gen() blinding reset and confirm that the blinding is consistent. */ secp256k1_scalar b; secp256k1_gej initial; secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, 0); b = ctx->ecmult_gen_ctx.blind; initial = ctx->ecmult_gen_ctx.initial; secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, 0); CHECK(secp256k1_scalar_eq(&b, &ctx->ecmult_gen_ctx.blind)); CHECK(gej_xyz_equals_gej(&initial, &ctx->ecmult_gen_ctx.initial)); } void run_ecmult_gen_blind(void) { int i; test_ecmult_gen_blind_reset(); for (i = 0; i < 10; i++) { test_ecmult_gen_blind(); } } #ifdef USE_ENDOMORPHISM /***** ENDOMORPHISH TESTS *****/ void test_scalar_split(void) { secp256k1_scalar full; secp256k1_scalar s1, slam; const unsigned char zero[32] = {0}; unsigned char tmp[32]; random_scalar_order_test(&full); secp256k1_scalar_split_lambda(&s1, &slam, &full); /* check that both are <= 128 bits in size */ if (secp256k1_scalar_is_high(&s1)) { secp256k1_scalar_negate(&s1, &s1); } if (secp256k1_scalar_is_high(&slam)) { secp256k1_scalar_negate(&slam, &slam); } secp256k1_scalar_get_b32(tmp, &s1); CHECK(memcmp(zero, tmp, 16) == 0); secp256k1_scalar_get_b32(tmp, &slam); CHECK(memcmp(zero, tmp, 16) == 0); } void run_endomorphism_tests(void) { test_scalar_split(); } #endif void ec_pubkey_parse_pointtest(const unsigned char *input, int xvalid, int yvalid) { unsigned char pubkeyc[65]; secp256k1_pubkey pubkey; secp256k1_ge ge; size_t pubkeyclen; int32_t ecount; ecount = 0; secp256k1_context_set_illegal_callback(ctx, counting_illegal_callback_fn, &ecount); for (pubkeyclen = 3; pubkeyclen <= 65; pubkeyclen++) { /* Smaller sizes are tested exhaustively elsewhere. */ int32_t i; memcpy(&pubkeyc[1], input, 64); VG_UNDEF(&pubkeyc[pubkeyclen], 65 - pubkeyclen); for (i = 0; i < 256; i++) { /* Try all type bytes. */ int xpass; int ypass; int ysign; pubkeyc[0] = i; /* What sign does this point have? */ ysign = (input[63] & 1) + 2; /* For the current type (i) do we expect parsing to work? Handled all of compressed/uncompressed/hybrid. */ xpass = xvalid && (pubkeyclen == 33) && ((i & 254) == 2); /* Do we expect a parse and re-serialize as uncompressed to give a matching y? */ ypass = xvalid && yvalid && ((i & 4) == ((pubkeyclen == 65) << 2)) && ((i == 4) || ((i & 251) == ysign)) && ((pubkeyclen == 33) || (pubkeyclen == 65)); if (xpass || ypass) { /* These cases must parse. */ unsigned char pubkeyo[65]; size_t outl; memset(&pubkey, 0, sizeof(pubkey)); VG_UNDEF(&pubkey, sizeof(pubkey)); ecount = 0; CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, pubkeyclen) == 1); VG_CHECK(&pubkey, sizeof(pubkey)); outl = 65; VG_UNDEF(pubkeyo, 65); CHECK(secp256k1_ec_pubkey_serialize(ctx, pubkeyo, &outl, &pubkey, SECP256K1_EC_COMPRESSED) == 1); VG_CHECK(pubkeyo, outl); CHECK(outl == 33); CHECK(memcmp(&pubkeyo[1], &pubkeyc[1], 32) == 0); CHECK((pubkeyclen != 33) || (pubkeyo[0] == pubkeyc[0])); if (ypass) { /* This test isn't always done because we decode with alternative signs, so the y won't match. */ CHECK(pubkeyo[0] == ysign); CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 1); memset(&pubkey, 0, sizeof(pubkey)); VG_UNDEF(&pubkey, sizeof(pubkey)); secp256k1_pubkey_save(&pubkey, &ge); VG_CHECK(&pubkey, sizeof(pubkey)); outl = 65; VG_UNDEF(pubkeyo, 65); CHECK(secp256k1_ec_pubkey_serialize(ctx, pubkeyo, &outl, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 1); VG_CHECK(pubkeyo, outl); CHECK(outl == 65); CHECK(pubkeyo[0] == 4); CHECK(memcmp(&pubkeyo[1], input, 64) == 0); } CHECK(ecount == 0); } else { /* These cases must fail to parse. */ memset(&pubkey, 0xfe, sizeof(pubkey)); ecount = 0; VG_UNDEF(&pubkey, sizeof(pubkey)); CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, pubkeyclen) == 0); VG_CHECK(&pubkey, sizeof(pubkey)); CHECK(ecount == 0); CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); CHECK(ecount == 1); } } } secp256k1_context_set_illegal_callback(ctx, NULL, NULL); } void run_ec_pubkey_parse_test(void) { #define SECP256K1_EC_PARSE_TEST_NVALID (12) const unsigned char valid[SECP256K1_EC_PARSE_TEST_NVALID][64] = { { /* Point with leading and trailing zeros in x and y serialization. */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0xef, 0xa1, 0x7b, 0x77, 0x61, 0xe1, 0xe4, 0x27, 0x06, 0x98, 0x9f, 0xb4, 0x83, 0xb8, 0xd2, 0xd4, 0x9b, 0xf7, 0x8f, 0xae, 0x98, 0x03, 0xf0, 0x99, 0xb8, 0x34, 0xed, 0xeb, 0x00 }, { /* Point with x equal to a 3rd root of unity.*/ 0x7a, 0xe9, 0x6a, 0x2b, 0x65, 0x7c, 0x07, 0x10, 0x6e, 0x64, 0x47, 0x9e, 0xac, 0x34, 0x34, 0xe9, 0x9c, 0xf0, 0x49, 0x75, 0x12, 0xf5, 0x89, 0x95, 0xc1, 0x39, 0x6c, 0x28, 0x71, 0x95, 0x01, 0xee, 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14, 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee, }, { /* Point with largest x. (1/2) */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2c, 0x0e, 0x99, 0x4b, 0x14, 0xea, 0x72, 0xf8, 0xc3, 0xeb, 0x95, 0xc7, 0x1e, 0xf6, 0x92, 0x57, 0x5e, 0x77, 0x50, 0x58, 0x33, 0x2d, 0x7e, 0x52, 0xd0, 0x99, 0x5c, 0xf8, 0x03, 0x88, 0x71, 0xb6, 0x7d, }, { /* Point with largest x. (2/2) */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2c, 0xf1, 0x66, 0xb4, 0xeb, 0x15, 0x8d, 0x07, 0x3c, 0x14, 0x6a, 0x38, 0xe1, 0x09, 0x6d, 0xa8, 0xa1, 0x88, 0xaf, 0xa7, 0xcc, 0xd2, 0x81, 0xad, 0x2f, 0x66, 0xa3, 0x07, 0xfb, 0x77, 0x8e, 0x45, 0xb2, }, { /* Point with smallest x. (1/2) */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14, 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee, }, { /* Point with smallest x. (2/2) */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xbd, 0xe7, 0x0d, 0xf5, 0x19, 0x39, 0xb9, 0x4c, 0x9c, 0x24, 0x97, 0x9f, 0xa7, 0xdd, 0x04, 0xeb, 0xd9, 0xb3, 0x57, 0x2d, 0xa7, 0x80, 0x22, 0x90, 0x43, 0x8a, 0xf2, 0xa6, 0x81, 0x89, 0x54, 0x41, }, { /* Point with largest y. (1/3) */ 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6, 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e, }, { /* Point with largest y. (2/3) */ 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c, 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e, }, { /* Point with largest y. (3/3) */ 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc, 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e, }, { /* Point with smallest y. (1/3) */ 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6, 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, }, { /* Point with smallest y. (2/3) */ 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c, 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, }, { /* Point with smallest y. (3/3) */ 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc, 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } }; #define SECP256K1_EC_PARSE_TEST_NXVALID (4) const unsigned char onlyxvalid[SECP256K1_EC_PARSE_TEST_NXVALID][64] = { { /* Valid if y overflow ignored (y = 1 mod p). (1/3) */ 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6, 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30, }, { /* Valid if y overflow ignored (y = 1 mod p). (2/3) */ 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c, 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30, }, { /* Valid if y overflow ignored (y = 1 mod p). (3/3)*/ 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc, 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30, }, { /* x on curve, y is from y^2 = x^3 + 8. */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03 } }; #define SECP256K1_EC_PARSE_TEST_NINVALID (7) const unsigned char invalid[SECP256K1_EC_PARSE_TEST_NINVALID][64] = { { /* x is third root of -8, y is -1 * (x^3+7); also on the curve for y^2 = x^3 + 9. */ 0x0a, 0x2d, 0x2b, 0xa9, 0x35, 0x07, 0xf1, 0xdf, 0x23, 0x37, 0x70, 0xc2, 0xa7, 0x97, 0x96, 0x2c, 0xc6, 0x1f, 0x6d, 0x15, 0xda, 0x14, 0xec, 0xd4, 0x7d, 0x8d, 0x27, 0xae, 0x1c, 0xd5, 0xf8, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, }, { /* Valid if x overflow ignored (x = 1 mod p). */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30, 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14, 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee, }, { /* Valid if x overflow ignored (x = 1 mod p). */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30, 0xbd, 0xe7, 0x0d, 0xf5, 0x19, 0x39, 0xb9, 0x4c, 0x9c, 0x24, 0x97, 0x9f, 0xa7, 0xdd, 0x04, 0xeb, 0xd9, 0xb3, 0x57, 0x2d, 0xa7, 0x80, 0x22, 0x90, 0x43, 0x8a, 0xf2, 0xa6, 0x81, 0x89, 0x54, 0x41, }, { /* x is -1, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 5. */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e, 0xf4, 0x84, 0x14, 0x5c, 0xb0, 0x14, 0x9b, 0x82, 0x5d, 0xff, 0x41, 0x2f, 0xa0, 0x52, 0xa8, 0x3f, 0xcb, 0x72, 0xdb, 0x61, 0xd5, 0x6f, 0x37, 0x70, 0xce, 0x06, 0x6b, 0x73, 0x49, 0xa2, 0xaa, 0x28, }, { /* x is -1, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 5. */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e, 0x0b, 0x7b, 0xeb, 0xa3, 0x4f, 0xeb, 0x64, 0x7d, 0xa2, 0x00, 0xbe, 0xd0, 0x5f, 0xad, 0x57, 0xc0, 0x34, 0x8d, 0x24, 0x9e, 0x2a, 0x90, 0xc8, 0x8f, 0x31, 0xf9, 0x94, 0x8b, 0xb6, 0x5d, 0x52, 0x07, }, { /* x is zero, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 7. */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x53, 0x7e, 0xef, 0xdf, 0xc1, 0x60, 0x6a, 0x07, 0x27, 0xcd, 0x69, 0xb4, 0xa7, 0x33, 0x3d, 0x38, 0xed, 0x44, 0xe3, 0x93, 0x2a, 0x71, 0x79, 0xee, 0xcb, 0x4b, 0x6f, 0xba, 0x93, 0x60, 0xdc, }, { /* x is zero, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 7. */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xac, 0x81, 0x10, 0x20, 0x3e, 0x9f, 0x95, 0xf8, 0xd8, 0x32, 0x96, 0x4b, 0x58, 0xcc, 0xc2, 0xc7, 0x12, 0xbb, 0x1c, 0x6c, 0xd5, 0x8e, 0x86, 0x11, 0x34, 0xb4, 0x8f, 0x45, 0x6c, 0x9b, 0x53 } }; const unsigned char pubkeyc[66] = { /* Serialization of G. */ 0x04, 0x79, 0xBE, 0x66, 0x7E, 0xF9, 0xDC, 0xBB, 0xAC, 0x55, 0xA0, 0x62, 0x95, 0xCE, 0x87, 0x0B, 0x07, 0x02, 0x9B, 0xFC, 0xDB, 0x2D, 0xCE, 0x28, 0xD9, 0x59, 0xF2, 0x81, 0x5B, 0x16, 0xF8, 0x17, 0x98, 0x48, 0x3A, 0xDA, 0x77, 0x26, 0xA3, 0xC4, 0x65, 0x5D, 0xA4, 0xFB, 0xFC, 0x0E, 0x11, 0x08, 0xA8, 0xFD, 0x17, 0xB4, 0x48, 0xA6, 0x85, 0x54, 0x19, 0x9C, 0x47, 0xD0, 0x8F, 0xFB, 0x10, 0xD4, 0xB8, 0x00 }; unsigned char sout[65]; unsigned char shortkey[2]; secp256k1_ge ge; secp256k1_pubkey pubkey; size_t len; int32_t i; int32_t ecount; int32_t ecount2; ecount = 0; /* Nothing should be reading this far into pubkeyc. */ VG_UNDEF(&pubkeyc[65], 1); secp256k1_context_set_illegal_callback(ctx, counting_illegal_callback_fn, &ecount); /* Zero length claimed, fail, zeroize, no illegal arg error. */ memset(&pubkey, 0xfe, sizeof(pubkey)); ecount = 0; VG_UNDEF(shortkey, 2); VG_UNDEF(&pubkey, sizeof(pubkey)); CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, shortkey, 0) == 0); VG_CHECK(&pubkey, sizeof(pubkey)); CHECK(ecount == 0); CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); CHECK(ecount == 1); /* Length one claimed, fail, zeroize, no illegal arg error. */ for (i = 0; i < 256 ; i++) { memset(&pubkey, 0xfe, sizeof(pubkey)); ecount = 0; shortkey[0] = i; VG_UNDEF(&shortkey[1], 1); VG_UNDEF(&pubkey, sizeof(pubkey)); CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, shortkey, 1) == 0); VG_CHECK(&pubkey, sizeof(pubkey)); CHECK(ecount == 0); CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); CHECK(ecount == 1); } /* Length two claimed, fail, zeroize, no illegal arg error. */ for (i = 0; i < 65536 ; i++) { memset(&pubkey, 0xfe, sizeof(pubkey)); ecount = 0; shortkey[0] = i & 255; shortkey[1] = i >> 8; VG_UNDEF(&pubkey, sizeof(pubkey)); CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, shortkey, 2) == 0); VG_CHECK(&pubkey, sizeof(pubkey)); CHECK(ecount == 0); CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); CHECK(ecount == 1); } memset(&pubkey, 0xfe, sizeof(pubkey)); ecount = 0; VG_UNDEF(&pubkey, sizeof(pubkey)); /* 33 bytes claimed on otherwise valid input starting with 0x04, fail, zeroize output, no illegal arg error. */ CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, 33) == 0); VG_CHECK(&pubkey, sizeof(pubkey)); CHECK(ecount == 0); CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); CHECK(ecount == 1); /* NULL pubkey, illegal arg error. Pubkey isn't rewritten before this step, since it's NULL into the parser. */ CHECK(secp256k1_ec_pubkey_parse(ctx, NULL, pubkeyc, 65) == 0); CHECK(ecount == 2); /* NULL input string. Illegal arg and zeroize output. */ memset(&pubkey, 0xfe, sizeof(pubkey)); ecount = 0; VG_UNDEF(&pubkey, sizeof(pubkey)); CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, NULL, 65) == 0); VG_CHECK(&pubkey, sizeof(pubkey)); CHECK(ecount == 1); CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); CHECK(ecount == 2); /* 64 bytes claimed on input starting with 0x04, fail, zeroize output, no illegal arg error. */ memset(&pubkey, 0xfe, sizeof(pubkey)); ecount = 0; VG_UNDEF(&pubkey, sizeof(pubkey)); CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, 64) == 0); VG_CHECK(&pubkey, sizeof(pubkey)); CHECK(ecount == 0); CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); CHECK(ecount == 1); /* 66 bytes claimed, fail, zeroize output, no illegal arg error. */ memset(&pubkey, 0xfe, sizeof(pubkey)); ecount = 0; VG_UNDEF(&pubkey, sizeof(pubkey)); CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, 66) == 0); VG_CHECK(&pubkey, sizeof(pubkey)); CHECK(ecount == 0); CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); CHECK(ecount == 1); /* Valid parse. */ memset(&pubkey, 0, sizeof(pubkey)); ecount = 0; VG_UNDEF(&pubkey, sizeof(pubkey)); CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, 65) == 1); VG_CHECK(&pubkey, sizeof(pubkey)); CHECK(ecount == 0); VG_UNDEF(&ge, sizeof(ge)); CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 1); VG_CHECK(&ge.x, sizeof(ge.x)); VG_CHECK(&ge.y, sizeof(ge.y)); VG_CHECK(&ge.infinity, sizeof(ge.infinity)); ge_equals_ge(&secp256k1_ge_const_g, &ge); CHECK(ecount == 0); /* secp256k1_ec_pubkey_serialize illegal args. */ ecount = 0; len = 65; CHECK(secp256k1_ec_pubkey_serialize(ctx, NULL, &len, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 0); CHECK(ecount == 1); CHECK(len == 0); CHECK(secp256k1_ec_pubkey_serialize(ctx, sout, NULL, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 0); CHECK(ecount == 2); len = 65; VG_UNDEF(sout, 65); CHECK(secp256k1_ec_pubkey_serialize(ctx, sout, &len, NULL, SECP256K1_EC_UNCOMPRESSED) == 0); VG_CHECK(sout, 65); CHECK(ecount == 3); CHECK(len == 0); len = 65; CHECK(secp256k1_ec_pubkey_serialize(ctx, sout, &len, &pubkey, ~0) == 0); CHECK(ecount == 4); CHECK(len == 0); len = 65; VG_UNDEF(sout, 65); CHECK(secp256k1_ec_pubkey_serialize(ctx, sout, &len, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 1); VG_CHECK(sout, 65); CHECK(ecount == 4); CHECK(len == 65); /* Multiple illegal args. Should still set arg error only once. */ ecount = 0; ecount2 = 11; CHECK(secp256k1_ec_pubkey_parse(ctx, NULL, NULL, 65) == 0); CHECK(ecount == 1); /* Does the illegal arg callback actually change the behavior? */ secp256k1_context_set_illegal_callback(ctx, uncounting_illegal_callback_fn, &ecount2); CHECK(secp256k1_ec_pubkey_parse(ctx, NULL, NULL, 65) == 0); CHECK(ecount == 1); CHECK(ecount2 == 10); secp256k1_context_set_illegal_callback(ctx, NULL, NULL); /* Try a bunch of prefabbed points with all possible encodings. */ for (i = 0; i < SECP256K1_EC_PARSE_TEST_NVALID; i++) { ec_pubkey_parse_pointtest(valid[i], 1, 1); } for (i = 0; i < SECP256K1_EC_PARSE_TEST_NXVALID; i++) { ec_pubkey_parse_pointtest(onlyxvalid[i], 1, 0); } for (i = 0; i < SECP256K1_EC_PARSE_TEST_NINVALID; i++) { ec_pubkey_parse_pointtest(invalid[i], 0, 0); } } void run_eckey_edge_case_test(void) { const unsigned char orderc[32] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41 }; const unsigned char zeros[sizeof(secp256k1_pubkey)] = {0x00}; unsigned char ctmp[33]; unsigned char ctmp2[33]; secp256k1_pubkey pubkey; secp256k1_pubkey pubkey2; secp256k1_pubkey pubkey_one; secp256k1_pubkey pubkey_negone; const secp256k1_pubkey *pubkeys[3]; size_t len; int32_t ecount; /* Group order is too large, reject. */ CHECK(secp256k1_ec_seckey_verify(ctx, orderc) == 0); VG_UNDEF(&pubkey, sizeof(pubkey)); CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, orderc) == 0); VG_CHECK(&pubkey, sizeof(pubkey)); CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); /* Maximum value is too large, reject. */ memset(ctmp, 255, 32); CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 0); memset(&pubkey, 1, sizeof(pubkey)); VG_UNDEF(&pubkey, sizeof(pubkey)); CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 0); VG_CHECK(&pubkey, sizeof(pubkey)); CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); /* Zero is too small, reject. */ memset(ctmp, 0, 32); CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 0); memset(&pubkey, 1, sizeof(pubkey)); VG_UNDEF(&pubkey, sizeof(pubkey)); CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 0); VG_CHECK(&pubkey, sizeof(pubkey)); CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); /* One must be accepted. */ ctmp[31] = 0x01; CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 1); memset(&pubkey, 0, sizeof(pubkey)); VG_UNDEF(&pubkey, sizeof(pubkey)); CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 1); VG_CHECK(&pubkey, sizeof(pubkey)); CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0); pubkey_one = pubkey; /* Group order + 1 is too large, reject. */ memcpy(ctmp, orderc, 32); ctmp[31] = 0x42; CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 0); memset(&pubkey, 1, sizeof(pubkey)); VG_UNDEF(&pubkey, sizeof(pubkey)); CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 0); VG_CHECK(&pubkey, sizeof(pubkey)); CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); /* -1 must be accepted. */ ctmp[31] = 0x40; CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 1); memset(&pubkey, 0, sizeof(pubkey)); VG_UNDEF(&pubkey, sizeof(pubkey)); CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 1); VG_CHECK(&pubkey, sizeof(pubkey)); CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0); pubkey_negone = pubkey; /* Tweak of zero leaves the value changed. */ memset(ctmp2, 0, 32); CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp, ctmp2) == 1); CHECK(memcmp(orderc, ctmp, 31) == 0 && ctmp[31] == 0x40); memcpy(&pubkey2, &pubkey, sizeof(pubkey)); CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 1); CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0); /* Multiply tweak of zero zeroizes the output. */ CHECK(secp256k1_ec_privkey_tweak_mul(ctx, ctmp, ctmp2) == 0); CHECK(memcmp(zeros, ctmp, 32) == 0); CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, ctmp2) == 0); CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0); memcpy(&pubkey, &pubkey2, sizeof(pubkey)); /* Overflowing key tweak zeroizes. */ memcpy(ctmp, orderc, 32); ctmp[31] = 0x40; CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp, orderc) == 0); CHECK(memcmp(zeros, ctmp, 32) == 0); memcpy(ctmp, orderc, 32); ctmp[31] = 0x40; CHECK(secp256k1_ec_privkey_tweak_mul(ctx, ctmp, orderc) == 0); CHECK(memcmp(zeros, ctmp, 32) == 0); memcpy(ctmp, orderc, 32); ctmp[31] = 0x40; CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, orderc) == 0); CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0); memcpy(&pubkey, &pubkey2, sizeof(pubkey)); CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, orderc) == 0); CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0); memcpy(&pubkey, &pubkey2, sizeof(pubkey)); /* Private key tweaks results in a key of zero. */ ctmp2[31] = 1; CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp2, ctmp) == 0); CHECK(memcmp(zeros, ctmp2, 32) == 0); ctmp2[31] = 1; CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 0); CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0); memcpy(&pubkey, &pubkey2, sizeof(pubkey)); /* Tweak computation wraps and results in a key of 1. */ ctmp2[31] = 2; CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp2, ctmp) == 1); CHECK(memcmp(ctmp2, zeros, 31) == 0 && ctmp2[31] == 1); ctmp2[31] = 2; CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 1); ctmp2[31] = 1; CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey2, ctmp2) == 1); CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0); /* Tweak mul * 2 = 1+1. */ CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 1); ctmp2[31] = 2; CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey2, ctmp2) == 1); CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0); /* Test argument errors. */ ecount = 0; secp256k1_context_set_illegal_callback(ctx, counting_illegal_callback_fn, &ecount); CHECK(ecount == 0); /* Zeroize pubkey on parse error. */ memset(&pubkey, 0, 32); CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 0); CHECK(ecount == 1); CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0); memcpy(&pubkey, &pubkey2, sizeof(pubkey)); memset(&pubkey2, 0, 32); CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey2, ctmp2) == 0); CHECK(ecount == 2); CHECK(memcmp(&pubkey2, zeros, sizeof(pubkey2)) == 0); /* Plain argument errors. */ ecount = 0; CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 1); CHECK(ecount == 0); CHECK(secp256k1_ec_seckey_verify(ctx, NULL) == 0); CHECK(ecount == 1); ecount = 0; memset(ctmp2, 0, 32); ctmp2[31] = 4; CHECK(secp256k1_ec_pubkey_tweak_add(ctx, NULL, ctmp2) == 0); CHECK(ecount == 1); CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, NULL) == 0); CHECK(ecount == 2); ecount = 0; memset(ctmp2, 0, 32); ctmp2[31] = 4; CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, NULL, ctmp2) == 0); CHECK(ecount == 1); CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, NULL) == 0); CHECK(ecount == 2); ecount = 0; memset(ctmp2, 0, 32); CHECK(secp256k1_ec_privkey_tweak_add(ctx, NULL, ctmp2) == 0); CHECK(ecount == 1); CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp, NULL) == 0); CHECK(ecount == 2); ecount = 0; memset(ctmp2, 0, 32); ctmp2[31] = 1; CHECK(secp256k1_ec_privkey_tweak_mul(ctx, NULL, ctmp2) == 0); CHECK(ecount == 1); CHECK(secp256k1_ec_privkey_tweak_mul(ctx, ctmp, NULL) == 0); CHECK(ecount == 2); ecount = 0; CHECK(secp256k1_ec_pubkey_create(ctx, NULL, ctmp) == 0); CHECK(ecount == 1); memset(&pubkey, 1, sizeof(pubkey)); CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, NULL) == 0); CHECK(ecount == 2); CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); /* secp256k1_ec_pubkey_combine tests. */ ecount = 0; pubkeys[0] = &pubkey_one; VG_UNDEF(&pubkeys[0], sizeof(secp256k1_pubkey *)); VG_UNDEF(&pubkeys[1], sizeof(secp256k1_pubkey *)); VG_UNDEF(&pubkeys[2], sizeof(secp256k1_pubkey *)); memset(&pubkey, 255, sizeof(secp256k1_pubkey)); VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 0) == 0); VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); CHECK(ecount == 1); CHECK(secp256k1_ec_pubkey_combine(ctx, NULL, pubkeys, 1) == 0); CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); CHECK(ecount == 2); memset(&pubkey, 255, sizeof(secp256k1_pubkey)); VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, NULL, 1) == 0); VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); CHECK(ecount == 3); pubkeys[0] = &pubkey_negone; memset(&pubkey, 255, sizeof(secp256k1_pubkey)); VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 1) == 1); VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0); CHECK(ecount == 3); len = 33; CHECK(secp256k1_ec_pubkey_serialize(ctx, ctmp, &len, &pubkey, SECP256K1_EC_COMPRESSED) == 1); CHECK(secp256k1_ec_pubkey_serialize(ctx, ctmp2, &len, &pubkey_negone, SECP256K1_EC_COMPRESSED) == 1); CHECK(memcmp(ctmp, ctmp2, 33) == 0); /* Result is infinity. */ pubkeys[0] = &pubkey_one; pubkeys[1] = &pubkey_negone; memset(&pubkey, 255, sizeof(secp256k1_pubkey)); VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 2) == 0); VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); CHECK(ecount == 3); /* Passes through infinity but comes out one. */ pubkeys[2] = &pubkey_one; memset(&pubkey, 255, sizeof(secp256k1_pubkey)); VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 3) == 1); VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0); CHECK(ecount == 3); len = 33; CHECK(secp256k1_ec_pubkey_serialize(ctx, ctmp, &len, &pubkey, SECP256K1_EC_COMPRESSED) == 1); CHECK(secp256k1_ec_pubkey_serialize(ctx, ctmp2, &len, &pubkey_one, SECP256K1_EC_COMPRESSED) == 1); CHECK(memcmp(ctmp, ctmp2, 33) == 0); /* Adds to two. */ pubkeys[1] = &pubkey_one; memset(&pubkey, 255, sizeof(secp256k1_pubkey)); VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 2) == 1); VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0); CHECK(ecount == 3); secp256k1_context_set_illegal_callback(ctx, NULL, NULL); } void random_sign(secp256k1_scalar *sigr, secp256k1_scalar *sigs, const secp256k1_scalar *key, const secp256k1_scalar *msg, int *recid) { secp256k1_scalar nonce; do { random_scalar_order_test(&nonce); } while(!secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, sigr, sigs, key, msg, &nonce, recid)); } void test_ecdsa_sign_verify(void) { secp256k1_gej pubj; secp256k1_ge pub; secp256k1_scalar one; secp256k1_scalar msg, key; secp256k1_scalar sigr, sigs; int recid; int getrec; random_scalar_order_test(&msg); random_scalar_order_test(&key); secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pubj, &key); secp256k1_ge_set_gej(&pub, &pubj); getrec = secp256k1_rand_bits(1); random_sign(&sigr, &sigs, &key, &msg, getrec?&recid:NULL); if (getrec) { CHECK(recid >= 0 && recid < 4); } CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sigr, &sigs, &pub, &msg)); secp256k1_scalar_set_int(&one, 1); secp256k1_scalar_add(&msg, &msg, &one); CHECK(!secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sigr, &sigs, &pub, &msg)); } void run_ecdsa_sign_verify(void) { int i; for (i = 0; i < 10*count; i++) { test_ecdsa_sign_verify(); } } /** Dummy nonce generation function that just uses a precomputed nonce, and fails if it is not accepted. Use only for testing. */ static int precomputed_nonce_function(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) { (void)msg32; (void)key32; (void)algo16; memcpy(nonce32, data, 32); return (counter == 0); } static int nonce_function_test_fail(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) { /* Dummy nonce generator that has a fatal error on the first counter value. */ if (counter == 0) { return 0; } return nonce_function_rfc6979(nonce32, msg32, key32, algo16, data, counter - 1); } static int nonce_function_test_retry(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) { /* Dummy nonce generator that produces unacceptable nonces for the first several counter values. */ if (counter < 3) { memset(nonce32, counter==0 ? 0 : 255, 32); if (counter == 2) { nonce32[31]--; } return 1; } if (counter < 5) { static const unsigned char order[] = { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B, 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x41 }; memcpy(nonce32, order, 32); if (counter == 4) { nonce32[31]++; } return 1; } /* Retry rate of 6979 is negligible esp. as we only call this in deterministic tests. */ /* If someone does fine a case where it retries for secp256k1, we'd like to know. */ if (counter > 5) { return 0; } return nonce_function_rfc6979(nonce32, msg32, key32, algo16, data, counter - 5); } int is_empty_signature(const secp256k1_ecdsa_signature *sig) { static const unsigned char res[sizeof(secp256k1_ecdsa_signature)] = {0}; return memcmp(sig, res, sizeof(secp256k1_ecdsa_signature)) == 0; } void test_ecdsa_end_to_end(void) { unsigned char extra[32] = {0x00}; unsigned char privkey[32]; unsigned char message[32]; unsigned char privkey2[32]; secp256k1_ecdsa_signature signature[6]; secp256k1_scalar r, s; unsigned char sig[74]; size_t siglen = 74; unsigned char pubkeyc[65]; size_t pubkeyclen = 65; secp256k1_pubkey pubkey; unsigned char seckey[300]; size_t seckeylen = 300; /* Generate a random key and message. */ { secp256k1_scalar msg, key; random_scalar_order_test(&msg); random_scalar_order_test(&key); secp256k1_scalar_get_b32(privkey, &key); secp256k1_scalar_get_b32(message, &msg); } /* Construct and verify corresponding public key. */ CHECK(secp256k1_ec_seckey_verify(ctx, privkey) == 1); CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, privkey) == 1); /* Verify exporting and importing public key. */ CHECK(secp256k1_ec_pubkey_serialize(ctx, pubkeyc, &pubkeyclen, &pubkey, secp256k1_rand_bits(1) == 1 ? SECP256K1_EC_COMPRESSED : SECP256K1_EC_UNCOMPRESSED)); memset(&pubkey, 0, sizeof(pubkey)); CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, pubkeyclen) == 1); /* Verify private key import and export. */ CHECK(ec_privkey_export_der(ctx, seckey, &seckeylen, privkey, secp256k1_rand_bits(1) == 1)); CHECK(ec_privkey_import_der(ctx, privkey2, seckey, seckeylen) == 1); CHECK(memcmp(privkey, privkey2, 32) == 0); /* Optionally tweak the keys using addition. */ if (secp256k1_rand_int(3) == 0) { int ret1; int ret2; unsigned char rnd[32]; secp256k1_pubkey pubkey2; secp256k1_rand256_test(rnd); ret1 = secp256k1_ec_privkey_tweak_add(ctx, privkey, rnd); ret2 = secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, rnd); CHECK(ret1 == ret2); if (ret1 == 0) { return; } CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey2, privkey) == 1); CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0); } /* Optionally tweak the keys using multiplication. */ if (secp256k1_rand_int(3) == 0) { int ret1; int ret2; unsigned char rnd[32]; secp256k1_pubkey pubkey2; secp256k1_rand256_test(rnd); ret1 = secp256k1_ec_privkey_tweak_mul(ctx, privkey, rnd); ret2 = secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, rnd); CHECK(ret1 == ret2); if (ret1 == 0) { return; } CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey2, privkey) == 1); CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0); } /* Sign. */ CHECK(secp256k1_ecdsa_sign(ctx, &signature[0], message, privkey, NULL, NULL) == 1); CHECK(secp256k1_ecdsa_sign(ctx, &signature[4], message, privkey, NULL, NULL) == 1); CHECK(secp256k1_ecdsa_sign(ctx, &signature[1], message, privkey, NULL, extra) == 1); extra[31] = 1; CHECK(secp256k1_ecdsa_sign(ctx, &signature[2], message, privkey, NULL, extra) == 1); extra[31] = 0; extra[0] = 1; CHECK(secp256k1_ecdsa_sign(ctx, &signature[3], message, privkey, NULL, extra) == 1); CHECK(memcmp(&signature[0], &signature[4], sizeof(signature[0])) == 0); CHECK(memcmp(&signature[0], &signature[1], sizeof(signature[0])) != 0); CHECK(memcmp(&signature[0], &signature[2], sizeof(signature[0])) != 0); CHECK(memcmp(&signature[0], &signature[3], sizeof(signature[0])) != 0); CHECK(memcmp(&signature[1], &signature[2], sizeof(signature[0])) != 0); CHECK(memcmp(&signature[1], &signature[3], sizeof(signature[0])) != 0); CHECK(memcmp(&signature[2], &signature[3], sizeof(signature[0])) != 0); /* Verify. */ CHECK(secp256k1_ecdsa_verify(ctx, &signature[0], message, &pubkey) == 1); CHECK(secp256k1_ecdsa_verify(ctx, &signature[1], message, &pubkey) == 1); CHECK(secp256k1_ecdsa_verify(ctx, &signature[2], message, &pubkey) == 1); CHECK(secp256k1_ecdsa_verify(ctx, &signature[3], message, &pubkey) == 1); /* Test lower-S form, malleate, verify and fail, test again, malleate again */ CHECK(!secp256k1_ecdsa_signature_normalize(ctx, NULL, &signature[0])); secp256k1_ecdsa_signature_load(ctx, &r, &s, &signature[0]); secp256k1_scalar_negate(&s, &s); secp256k1_ecdsa_signature_save(&signature[5], &r, &s); CHECK(secp256k1_ecdsa_verify(ctx, &signature[5], message, &pubkey) == 0); CHECK(secp256k1_ecdsa_signature_normalize(ctx, NULL, &signature[5])); CHECK(secp256k1_ecdsa_signature_normalize(ctx, &signature[5], &signature[5])); CHECK(!secp256k1_ecdsa_signature_normalize(ctx, NULL, &signature[5])); CHECK(!secp256k1_ecdsa_signature_normalize(ctx, &signature[5], &signature[5])); CHECK(secp256k1_ecdsa_verify(ctx, &signature[5], message, &pubkey) == 1); secp256k1_scalar_negate(&s, &s); secp256k1_ecdsa_signature_save(&signature[5], &r, &s); CHECK(!secp256k1_ecdsa_signature_normalize(ctx, NULL, &signature[5])); CHECK(secp256k1_ecdsa_verify(ctx, &signature[5], message, &pubkey) == 1); CHECK(memcmp(&signature[5], &signature[0], 64) == 0); /* Serialize/parse DER and verify again */ CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, sig, &siglen, &signature[0]) == 1); memset(&signature[0], 0, sizeof(signature[0])); CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &signature[0], sig, siglen) == 1); CHECK(secp256k1_ecdsa_verify(ctx, &signature[0], message, &pubkey) == 1); /* Serialize/destroy/parse DER and verify again. */ siglen = 74; CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, sig, &siglen, &signature[0]) == 1); sig[secp256k1_rand_int(siglen)] += 1 + secp256k1_rand_int(255); CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &signature[0], sig, siglen) == 0 || secp256k1_ecdsa_verify(ctx, &signature[0], message, &pubkey) == 0); } void test_random_pubkeys(void) { secp256k1_ge elem; secp256k1_ge elem2; unsigned char in[65]; /* Generate some randomly sized pubkeys. */ size_t len = secp256k1_rand_bits(2) == 0 ? 65 : 33; if (secp256k1_rand_bits(2) == 0) { len = secp256k1_rand_bits(6); } if (len == 65) { in[0] = secp256k1_rand_bits(1) ? 4 : (secp256k1_rand_bits(1) ? 6 : 7); } else { in[0] = secp256k1_rand_bits(1) ? 2 : 3; } if (secp256k1_rand_bits(3) == 0) { in[0] = secp256k1_rand_bits(8); } if (len > 1) { secp256k1_rand256(&in[1]); } if (len > 33) { secp256k1_rand256(&in[33]); } if (secp256k1_eckey_pubkey_parse(&elem, in, len)) { unsigned char out[65]; unsigned char firstb; int res; size_t size = len; firstb = in[0]; /* If the pubkey can be parsed, it should round-trip... */ CHECK(secp256k1_eckey_pubkey_serialize(&elem, out, &size, len == 33)); CHECK(size == len); CHECK(memcmp(&in[1], &out[1], len-1) == 0); /* ... except for the type of hybrid inputs. */ if ((in[0] != 6) && (in[0] != 7)) { CHECK(in[0] == out[0]); } size = 65; CHECK(secp256k1_eckey_pubkey_serialize(&elem, in, &size, 0)); CHECK(size == 65); CHECK(secp256k1_eckey_pubkey_parse(&elem2, in, size)); ge_equals_ge(&elem,&elem2); /* Check that the X9.62 hybrid type is checked. */ in[0] = secp256k1_rand_bits(1) ? 6 : 7; res = secp256k1_eckey_pubkey_parse(&elem2, in, size); if (firstb == 2 || firstb == 3) { if (in[0] == firstb + 4) { CHECK(res); } else { CHECK(!res); } } if (res) { ge_equals_ge(&elem,&elem2); CHECK(secp256k1_eckey_pubkey_serialize(&elem, out, &size, 0)); CHECK(memcmp(&in[1], &out[1], 64) == 0); } } } void run_random_pubkeys(void) { int i; for (i = 0; i < 10*count; i++) { test_random_pubkeys(); } } void run_ecdsa_end_to_end(void) { int i; for (i = 0; i < 64*count; i++) { test_ecdsa_end_to_end(); } } int test_ecdsa_der_parse(const unsigned char *sig, size_t siglen, int certainly_der, int certainly_not_der) { static const unsigned char zeroes[32] = {0}; #ifdef ENABLE_OPENSSL_TESTS static const unsigned char max_scalar[32] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40 }; #endif int ret = 0; secp256k1_ecdsa_signature sig_der; unsigned char roundtrip_der[2048]; unsigned char compact_der[64]; size_t len_der = 2048; int parsed_der = 0, valid_der = 0, roundtrips_der = 0; secp256k1_ecdsa_signature sig_der_lax; unsigned char roundtrip_der_lax[2048]; unsigned char compact_der_lax[64]; size_t len_der_lax = 2048; int parsed_der_lax = 0, valid_der_lax = 0, roundtrips_der_lax = 0; #ifdef ENABLE_OPENSSL_TESTS ECDSA_SIG *sig_openssl; const unsigned char *sigptr; unsigned char roundtrip_openssl[2048]; int len_openssl = 2048; int parsed_openssl, valid_openssl = 0, roundtrips_openssl = 0; #endif parsed_der = secp256k1_ecdsa_signature_parse_der(ctx, &sig_der, sig, siglen); if (parsed_der) { ret |= (!secp256k1_ecdsa_signature_serialize_compact(ctx, compact_der, &sig_der)) << 0; valid_der = (memcmp(compact_der, zeroes, 32) != 0) && (memcmp(compact_der + 32, zeroes, 32) != 0); } if (valid_der) { ret |= (!secp256k1_ecdsa_signature_serialize_der(ctx, roundtrip_der, &len_der, &sig_der)) << 1; roundtrips_der = (len_der == siglen) && memcmp(roundtrip_der, sig, siglen) == 0; } parsed_der_lax = ecdsa_signature_parse_der_lax(ctx, &sig_der_lax, sig, siglen); if (parsed_der_lax) { ret |= (!secp256k1_ecdsa_signature_serialize_compact(ctx, compact_der_lax, &sig_der_lax)) << 10; valid_der_lax = (memcmp(compact_der_lax, zeroes, 32) != 0) && (memcmp(compact_der_lax + 32, zeroes, 32) != 0); } if (valid_der_lax) { ret |= (!secp256k1_ecdsa_signature_serialize_der(ctx, roundtrip_der_lax, &len_der_lax, &sig_der_lax)) << 11; roundtrips_der_lax = (len_der_lax == siglen) && memcmp(roundtrip_der_lax, sig, siglen) == 0; } if (certainly_der) { ret |= (!parsed_der) << 2; } if (certainly_not_der) { ret |= (parsed_der) << 17; } if (valid_der) { ret |= (!roundtrips_der) << 3; } if (valid_der) { ret |= (!roundtrips_der_lax) << 12; ret |= (len_der != len_der_lax) << 13; ret |= (memcmp(roundtrip_der_lax, roundtrip_der, len_der) != 0) << 14; } ret |= (roundtrips_der != roundtrips_der_lax) << 15; if (parsed_der) { ret |= (!parsed_der_lax) << 16; } #ifdef ENABLE_OPENSSL_TESTS sig_openssl = ECDSA_SIG_new(); sigptr = sig; parsed_openssl = (d2i_ECDSA_SIG(&sig_openssl, &sigptr, siglen) != NULL); if (parsed_openssl) { valid_openssl = !BN_is_negative(sig_openssl->r) && !BN_is_negative(sig_openssl->s) && BN_num_bits(sig_openssl->r) > 0 && BN_num_bits(sig_openssl->r) <= 256 && BN_num_bits(sig_openssl->s) > 0 && BN_num_bits(sig_openssl->s) <= 256; if (valid_openssl) { unsigned char tmp[32] = {0}; BN_bn2bin(sig_openssl->r, tmp + 32 - BN_num_bytes(sig_openssl->r)); valid_openssl = memcmp(tmp, max_scalar, 32) < 0; } if (valid_openssl) { unsigned char tmp[32] = {0}; BN_bn2bin(sig_openssl->s, tmp + 32 - BN_num_bytes(sig_openssl->s)); valid_openssl = memcmp(tmp, max_scalar, 32) < 0; } } len_openssl = i2d_ECDSA_SIG(sig_openssl, NULL); if (len_openssl <= 2048) { unsigned char *ptr = roundtrip_openssl; CHECK(i2d_ECDSA_SIG(sig_openssl, &ptr) == len_openssl); roundtrips_openssl = valid_openssl && ((size_t)len_openssl == siglen) && (memcmp(roundtrip_openssl, sig, siglen) == 0); } else { len_openssl = 0; } ECDSA_SIG_free(sig_openssl); ret |= (parsed_der && !parsed_openssl) << 4; ret |= (valid_der && !valid_openssl) << 5; ret |= (roundtrips_openssl && !parsed_der) << 6; ret |= (roundtrips_der != roundtrips_openssl) << 7; if (roundtrips_openssl) { ret |= (len_der != (size_t)len_openssl) << 8; ret |= (memcmp(roundtrip_der, roundtrip_openssl, len_der) != 0) << 9; } #endif return ret; } static void assign_big_endian(unsigned char *ptr, size_t ptrlen, uint32_t val) { size_t i; for (i = 0; i < ptrlen; i++) { int shift = ptrlen - 1 - i; if (shift >= 4) { ptr[i] = 0; } else { ptr[i] = (val >> shift) & 0xFF; } } } static void damage_array(unsigned char *sig, size_t *len) { int pos; int action = secp256k1_rand_bits(3); if (action < 1 && *len > 3) { /* Delete a byte. */ pos = secp256k1_rand_int(*len); memmove(sig + pos, sig + pos + 1, *len - pos - 1); (*len)--; return; } else if (action < 2 && *len < 2048) { /* Insert a byte. */ pos = secp256k1_rand_int(1 + *len); memmove(sig + pos + 1, sig + pos, *len - pos); sig[pos] = secp256k1_rand_bits(8); (*len)++; return; } else if (action < 4) { /* Modify a byte. */ sig[secp256k1_rand_int(*len)] += 1 + secp256k1_rand_int(255); return; } else { /* action < 8 */ /* Modify a bit. */ sig[secp256k1_rand_int(*len)] ^= 1 << secp256k1_rand_bits(3); return; } } static void random_ber_signature(unsigned char *sig, size_t *len, int* certainly_der, int* certainly_not_der) { int der; int nlow[2], nlen[2], nlenlen[2], nhbit[2], nhbyte[2], nzlen[2]; size_t tlen, elen, glen; int indet; int n; *len = 0; der = secp256k1_rand_bits(2) == 0; *certainly_der = der; *certainly_not_der = 0; indet = der ? 0 : secp256k1_rand_int(10) == 0; for (n = 0; n < 2; n++) { /* We generate two classes of numbers: nlow==1 "low" ones (up to 32 bytes), nlow==0 "high" ones (32 bytes with 129 top bits set, or larger than 32 bytes) */ nlow[n] = der ? 1 : (secp256k1_rand_bits(3) != 0); /* The length of the number in bytes (the first byte of which will always be nonzero) */ nlen[n] = nlow[n] ? secp256k1_rand_int(33) : 32 + secp256k1_rand_int(200) * secp256k1_rand_int(8) / 8; CHECK(nlen[n] <= 232); /* The top bit of the number. */ nhbit[n] = (nlow[n] == 0 && nlen[n] == 32) ? 1 : (nlen[n] == 0 ? 0 : secp256k1_rand_bits(1)); /* The top byte of the number (after the potential hardcoded 16 0xFF characters for "high" 32 bytes numbers) */ nhbyte[n] = nlen[n] == 0 ? 0 : (nhbit[n] ? 128 + secp256k1_rand_bits(7) : 1 + secp256k1_rand_int(127)); /* The number of zero bytes in front of the number (which is 0 or 1 in case of DER, otherwise we extend up to 300 bytes) */ nzlen[n] = der ? ((nlen[n] == 0 || nhbit[n]) ? 1 : 0) : (nlow[n] ? secp256k1_rand_int(3) : secp256k1_rand_int(300 - nlen[n]) * secp256k1_rand_int(8) / 8); if (nzlen[n] > ((nlen[n] == 0 || nhbit[n]) ? 1 : 0)) { *certainly_not_der = 1; } CHECK(nlen[n] + nzlen[n] <= 300); /* The length of the length descriptor for the number. 0 means short encoding, anything else is long encoding. */ nlenlen[n] = nlen[n] + nzlen[n] < 128 ? 0 : (nlen[n] + nzlen[n] < 256 ? 1 : 2); if (!der) { /* nlenlen[n] max 127 bytes */ int add = secp256k1_rand_int(127 - nlenlen[n]) * secp256k1_rand_int(16) * secp256k1_rand_int(16) / 256; nlenlen[n] += add; if (add != 0) { *certainly_not_der = 1; } } CHECK(nlen[n] + nzlen[n] + nlenlen[n] <= 427); } /* The total length of the data to go, so far */ tlen = 2 + nlenlen[0] + nlen[0] + nzlen[0] + 2 + nlenlen[1] + nlen[1] + nzlen[1]; CHECK(tlen <= 856); /* The length of the garbage inside the tuple. */ elen = (der || indet) ? 0 : secp256k1_rand_int(980 - tlen) * secp256k1_rand_int(8) / 8; if (elen != 0) { *certainly_not_der = 1; } tlen += elen; CHECK(tlen <= 980); /* The length of the garbage after the end of the tuple. */ glen = der ? 0 : secp256k1_rand_int(990 - tlen) * secp256k1_rand_int(8) / 8; if (glen != 0) { *certainly_not_der = 1; } CHECK(tlen + glen <= 990); /* Write the tuple header. */ sig[(*len)++] = 0x30; if (indet) { /* Indeterminate length */ sig[(*len)++] = 0x80; *certainly_not_der = 1; } else { int tlenlen = tlen < 128 ? 0 : (tlen < 256 ? 1 : 2); if (!der) { int add = secp256k1_rand_int(127 - tlenlen) * secp256k1_rand_int(16) * secp256k1_rand_int(16) / 256; tlenlen += add; if (add != 0) { *certainly_not_der = 1; } } if (tlenlen == 0) { /* Short length notation */ sig[(*len)++] = tlen; } else { /* Long length notation */ sig[(*len)++] = 128 + tlenlen; assign_big_endian(sig + *len, tlenlen, tlen); *len += tlenlen; } tlen += tlenlen; } tlen += 2; CHECK(tlen + glen <= 1119); for (n = 0; n < 2; n++) { /* Write the integer header. */ sig[(*len)++] = 0x02; if (nlenlen[n] == 0) { /* Short length notation */ sig[(*len)++] = nlen[n] + nzlen[n]; } else { /* Long length notation. */ sig[(*len)++] = 128 + nlenlen[n]; assign_big_endian(sig + *len, nlenlen[n], nlen[n] + nzlen[n]); *len += nlenlen[n]; } /* Write zero padding */ while (nzlen[n] > 0) { sig[(*len)++] = 0x00; nzlen[n]--; } if (nlen[n] == 32 && !nlow[n]) { /* Special extra 16 0xFF bytes in "high" 32-byte numbers */ int i; for (i = 0; i < 16; i++) { sig[(*len)++] = 0xFF; } nlen[n] -= 16; } /* Write first byte of number */ if (nlen[n] > 0) { sig[(*len)++] = nhbyte[n]; nlen[n]--; } /* Generate remaining random bytes of number */ secp256k1_rand_bytes_test(sig + *len, nlen[n]); *len += nlen[n]; nlen[n] = 0; } /* Generate random garbage inside tuple. */ secp256k1_rand_bytes_test(sig + *len, elen); *len += elen; /* Generate end-of-contents bytes. */ if (indet) { sig[(*len)++] = 0; sig[(*len)++] = 0; tlen += 2; } CHECK(tlen + glen <= 1121); /* Generate random garbage outside tuple. */ secp256k1_rand_bytes_test(sig + *len, glen); *len += glen; tlen += glen; CHECK(tlen <= 1121); CHECK(tlen == *len); } void run_ecdsa_der_parse(void) { int i,j; for (i = 0; i < 200 * count; i++) { unsigned char buffer[2048]; size_t buflen = 0; int certainly_der = 0; int certainly_not_der = 0; random_ber_signature(buffer, &buflen, &certainly_der, &certainly_not_der); CHECK(buflen <= 2048); for (j = 0; j < 16; j++) { int ret = 0; if (j > 0) { damage_array(buffer, &buflen); /* We don't know anything anymore about the DERness of the result */ certainly_der = 0; certainly_not_der = 0; } ret = test_ecdsa_der_parse(buffer, buflen, certainly_der, certainly_not_der); if (ret != 0) { size_t k; fprintf(stderr, "Failure %x on ", ret); for (k = 0; k < buflen; k++) { fprintf(stderr, "%02x ", buffer[k]); } fprintf(stderr, "\n"); } CHECK(ret == 0); } } } /* Tests several edge cases. */ void test_ecdsa_edge_cases(void) { int t; secp256k1_ecdsa_signature sig; /* Test the case where ECDSA recomputes a point that is infinity. */ { secp256k1_gej keyj; secp256k1_ge key; secp256k1_scalar msg; secp256k1_scalar sr, ss; secp256k1_scalar_set_int(&ss, 1); secp256k1_scalar_negate(&ss, &ss); secp256k1_scalar_inverse(&ss, &ss); secp256k1_scalar_set_int(&sr, 1); secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &keyj, &sr); secp256k1_ge_set_gej(&key, &keyj); msg = ss; CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); } /* Verify signature with r of zero fails. */ { const unsigned char pubkey_mods_zero[33] = { 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41 }; secp256k1_ge key; secp256k1_scalar msg; secp256k1_scalar sr, ss; secp256k1_scalar_set_int(&ss, 1); secp256k1_scalar_set_int(&msg, 0); secp256k1_scalar_set_int(&sr, 0); CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey_mods_zero, 33)); CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); } /* Verify signature with s of zero fails. */ { const unsigned char pubkey[33] = { 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }; secp256k1_ge key; secp256k1_scalar msg; secp256k1_scalar sr, ss; secp256k1_scalar_set_int(&ss, 0); secp256k1_scalar_set_int(&msg, 0); secp256k1_scalar_set_int(&sr, 1); CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33)); CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); } /* Verify signature with message 0 passes. */ { const unsigned char pubkey[33] = { 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 }; const unsigned char pubkey2[33] = { 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x43 }; secp256k1_ge key; secp256k1_ge key2; secp256k1_scalar msg; secp256k1_scalar sr, ss; secp256k1_scalar_set_int(&ss, 2); secp256k1_scalar_set_int(&msg, 0); secp256k1_scalar_set_int(&sr, 2); CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33)); CHECK(secp256k1_eckey_pubkey_parse(&key2, pubkey2, 33)); CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 1); secp256k1_scalar_negate(&ss, &ss); CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 1); secp256k1_scalar_set_int(&ss, 1); CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 0); } /* Verify signature with message 1 passes. */ { const unsigned char pubkey[33] = { 0x02, 0x14, 0x4e, 0x5a, 0x58, 0xef, 0x5b, 0x22, 0x6f, 0xd2, 0xe2, 0x07, 0x6a, 0x77, 0xcf, 0x05, 0xb4, 0x1d, 0xe7, 0x4a, 0x30, 0x98, 0x27, 0x8c, 0x93, 0xe6, 0xe6, 0x3c, 0x0b, 0xc4, 0x73, 0x76, 0x25 }; const unsigned char pubkey2[33] = { 0x02, 0x8a, 0xd5, 0x37, 0xed, 0x73, 0xd9, 0x40, 0x1d, 0xa0, 0x33, 0xd2, 0xdc, 0xf0, 0xaf, 0xae, 0x34, 0xcf, 0x5f, 0x96, 0x4c, 0x73, 0x28, 0x0f, 0x92, 0xc0, 0xf6, 0x9d, 0xd9, 0xb2, 0x09, 0x10, 0x62 }; const unsigned char csr[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4, 0x40, 0x2d, 0xa1, 0x72, 0x2f, 0xc9, 0xba, 0xeb }; secp256k1_ge key; secp256k1_ge key2; secp256k1_scalar msg; secp256k1_scalar sr, ss; secp256k1_scalar_set_int(&ss, 1); secp256k1_scalar_set_int(&msg, 1); secp256k1_scalar_set_b32(&sr, csr, NULL); CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33)); CHECK(secp256k1_eckey_pubkey_parse(&key2, pubkey2, 33)); CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 1); secp256k1_scalar_negate(&ss, &ss); CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 1); secp256k1_scalar_set_int(&ss, 2); secp256k1_scalar_inverse_var(&ss, &ss); CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 0); } /* Verify signature with message -1 passes. */ { const unsigned char pubkey[33] = { 0x03, 0xaf, 0x97, 0xff, 0x7d, 0x3a, 0xf6, 0xa0, 0x02, 0x94, 0xbd, 0x9f, 0x4b, 0x2e, 0xd7, 0x52, 0x28, 0xdb, 0x49, 0x2a, 0x65, 0xcb, 0x1e, 0x27, 0x57, 0x9c, 0xba, 0x74, 0x20, 0xd5, 0x1d, 0x20, 0xf1 }; const unsigned char csr[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4, 0x40, 0x2d, 0xa1, 0x72, 0x2f, 0xc9, 0xba, 0xee }; secp256k1_ge key; secp256k1_scalar msg; secp256k1_scalar sr, ss; secp256k1_scalar_set_int(&ss, 1); secp256k1_scalar_set_int(&msg, 1); secp256k1_scalar_negate(&msg, &msg); secp256k1_scalar_set_b32(&sr, csr, NULL); CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33)); CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); secp256k1_scalar_negate(&ss, &ss); CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); secp256k1_scalar_set_int(&ss, 3); secp256k1_scalar_inverse_var(&ss, &ss); CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); } /* Signature where s would be zero. */ { secp256k1_pubkey pubkey; size_t siglen; int32_t ecount; unsigned char signature[72]; static const unsigned char nonce[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, }; static const unsigned char nonce2[32] = { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B, 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x40 }; const unsigned char key[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, }; unsigned char msg[32] = { 0x86, 0x41, 0x99, 0x81, 0x06, 0x23, 0x44, 0x53, 0xaa, 0x5f, 0x9d, 0x6a, 0x31, 0x78, 0xf4, 0xf7, 0xb8, 0x12, 0xe0, 0x0b, 0x81, 0x7a, 0x77, 0x62, 0x65, 0xdf, 0xdd, 0x31, 0xb9, 0x3e, 0x29, 0xa9, }; ecount = 0; secp256k1_context_set_illegal_callback(ctx, counting_illegal_callback_fn, &ecount); CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, precomputed_nonce_function, nonce) == 0); CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, precomputed_nonce_function, nonce2) == 0); msg[31] = 0xaa; CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, precomputed_nonce_function, nonce) == 1); CHECK(ecount == 0); CHECK(secp256k1_ecdsa_sign(ctx, NULL, msg, key, precomputed_nonce_function, nonce2) == 0); CHECK(ecount == 1); CHECK(secp256k1_ecdsa_sign(ctx, &sig, NULL, key, precomputed_nonce_function, nonce2) == 0); CHECK(ecount == 2); CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, NULL, precomputed_nonce_function, nonce2) == 0); CHECK(ecount == 3); CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, precomputed_nonce_function, nonce2) == 1); CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, key) == 1); CHECK(secp256k1_ecdsa_verify(ctx, NULL, msg, &pubkey) == 0); CHECK(ecount == 4); CHECK(secp256k1_ecdsa_verify(ctx, &sig, NULL, &pubkey) == 0); CHECK(ecount == 5); CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg, NULL) == 0); CHECK(ecount == 6); CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg, &pubkey) == 1); CHECK(ecount == 6); CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, NULL) == 0); CHECK(ecount == 7); /* That pubkeyload fails via an ARGCHECK is a little odd but makes sense because pubkeys are an opaque data type. */ CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg, &pubkey) == 0); CHECK(ecount == 8); siglen = 72; CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, NULL, &siglen, &sig) == 0); CHECK(ecount == 9); CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, signature, NULL, &sig) == 0); CHECK(ecount == 10); CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, signature, &siglen, NULL) == 0); CHECK(ecount == 11); CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, signature, &siglen, &sig) == 1); CHECK(ecount == 11); CHECK(secp256k1_ecdsa_signature_parse_der(ctx, NULL, signature, siglen) == 0); CHECK(ecount == 12); CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, NULL, siglen) == 0); CHECK(ecount == 13); CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, signature, siglen) == 1); CHECK(ecount == 13); siglen = 10; /* Too little room for a signature does not fail via ARGCHECK. */ CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, signature, &siglen, &sig) == 0); CHECK(ecount == 13); ecount = 0; CHECK(secp256k1_ecdsa_signature_normalize(ctx, NULL, NULL) == 0); CHECK(ecount == 1); CHECK(secp256k1_ecdsa_signature_serialize_compact(ctx, NULL, &sig) == 0); CHECK(ecount == 2); CHECK(secp256k1_ecdsa_signature_serialize_compact(ctx, signature, NULL) == 0); CHECK(ecount == 3); CHECK(secp256k1_ecdsa_signature_serialize_compact(ctx, signature, &sig) == 1); CHECK(ecount == 3); CHECK(secp256k1_ecdsa_signature_parse_compact(ctx, NULL, signature) == 0); CHECK(ecount == 4); CHECK(secp256k1_ecdsa_signature_parse_compact(ctx, &sig, NULL) == 0); CHECK(ecount == 5); CHECK(secp256k1_ecdsa_signature_parse_compact(ctx, &sig, signature) == 1); CHECK(ecount == 5); memset(signature, 255, 64); CHECK(secp256k1_ecdsa_signature_parse_compact(ctx, &sig, signature) == 0); CHECK(ecount == 5); secp256k1_context_set_illegal_callback(ctx, NULL, NULL); } /* Nonce function corner cases. */ for (t = 0; t < 2; t++) { static const unsigned char zero[32] = {0x00}; int i; unsigned char key[32]; unsigned char msg[32]; secp256k1_ecdsa_signature sig2; secp256k1_scalar sr[512], ss; const unsigned char *extra; extra = t == 0 ? NULL : zero; memset(msg, 0, 32); msg[31] = 1; /* High key results in signature failure. */ memset(key, 0xFF, 32); CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, NULL, extra) == 0); CHECK(is_empty_signature(&sig)); /* Zero key results in signature failure. */ memset(key, 0, 32); CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, NULL, extra) == 0); CHECK(is_empty_signature(&sig)); /* Nonce function failure results in signature failure. */ key[31] = 1; CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, nonce_function_test_fail, extra) == 0); CHECK(is_empty_signature(&sig)); /* The retry loop successfully makes its way to the first good value. */ CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, nonce_function_test_retry, extra) == 1); CHECK(!is_empty_signature(&sig)); CHECK(secp256k1_ecdsa_sign(ctx, &sig2, msg, key, nonce_function_rfc6979, extra) == 1); CHECK(!is_empty_signature(&sig2)); CHECK(memcmp(&sig, &sig2, sizeof(sig)) == 0); /* The default nonce function is deterministic. */ CHECK(secp256k1_ecdsa_sign(ctx, &sig2, msg, key, NULL, extra) == 1); CHECK(!is_empty_signature(&sig2)); CHECK(memcmp(&sig, &sig2, sizeof(sig)) == 0); /* The default nonce function changes output with different messages. */ for(i = 0; i < 256; i++) { int j; msg[0] = i; CHECK(secp256k1_ecdsa_sign(ctx, &sig2, msg, key, NULL, extra) == 1); CHECK(!is_empty_signature(&sig2)); secp256k1_ecdsa_signature_load(ctx, &sr[i], &ss, &sig2); for (j = 0; j < i; j++) { CHECK(!secp256k1_scalar_eq(&sr[i], &sr[j])); } } msg[0] = 0; msg[31] = 2; /* The default nonce function changes output with different keys. */ for(i = 256; i < 512; i++) { int j; key[0] = i - 256; CHECK(secp256k1_ecdsa_sign(ctx, &sig2, msg, key, NULL, extra) == 1); CHECK(!is_empty_signature(&sig2)); secp256k1_ecdsa_signature_load(ctx, &sr[i], &ss, &sig2); for (j = 0; j < i; j++) { CHECK(!secp256k1_scalar_eq(&sr[i], &sr[j])); } } key[0] = 0; } { /* Check that optional nonce arguments do not have equivalent effect. */ const unsigned char zeros[32] = {0}; unsigned char nonce[32]; unsigned char nonce2[32]; unsigned char nonce3[32]; unsigned char nonce4[32]; VG_UNDEF(nonce,32); VG_UNDEF(nonce2,32); VG_UNDEF(nonce3,32); VG_UNDEF(nonce4,32); CHECK(nonce_function_rfc6979(nonce, zeros, zeros, NULL, NULL, 0) == 1); VG_CHECK(nonce,32); CHECK(nonce_function_rfc6979(nonce2, zeros, zeros, zeros, NULL, 0) == 1); VG_CHECK(nonce2,32); CHECK(nonce_function_rfc6979(nonce3, zeros, zeros, NULL, (void *)zeros, 0) == 1); VG_CHECK(nonce3,32); CHECK(nonce_function_rfc6979(nonce4, zeros, zeros, zeros, (void *)zeros, 0) == 1); VG_CHECK(nonce4,32); CHECK(memcmp(nonce, nonce2, 32) != 0); CHECK(memcmp(nonce, nonce3, 32) != 0); CHECK(memcmp(nonce, nonce4, 32) != 0); CHECK(memcmp(nonce2, nonce3, 32) != 0); CHECK(memcmp(nonce2, nonce4, 32) != 0); CHECK(memcmp(nonce3, nonce4, 32) != 0); } /* Privkey export where pubkey is the point at infinity. */ { unsigned char privkey[300]; unsigned char seckey[32] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41, }; size_t outlen = 300; CHECK(!ec_privkey_export_der(ctx, privkey, &outlen, seckey, 0)); outlen = 300; CHECK(!ec_privkey_export_der(ctx, privkey, &outlen, seckey, 1)); } } void run_ecdsa_edge_cases(void) { test_ecdsa_edge_cases(); } #ifdef ENABLE_OPENSSL_TESTS EC_KEY *get_openssl_key(const unsigned char *key32) { unsigned char privkey[300]; size_t privkeylen; const unsigned char* pbegin = privkey; int compr = secp256k1_rand_bits(1); EC_KEY *ec_key = EC_KEY_new_by_curve_name(NID_secp256k1); CHECK(ec_privkey_export_der(ctx, privkey, &privkeylen, key32, compr)); CHECK(d2i_ECPrivateKey(&ec_key, &pbegin, privkeylen)); CHECK(EC_KEY_check_key(ec_key)); return ec_key; } void test_ecdsa_openssl(void) { secp256k1_gej qj; secp256k1_ge q; secp256k1_scalar sigr, sigs; secp256k1_scalar one; secp256k1_scalar msg2; secp256k1_scalar key, msg; EC_KEY *ec_key; unsigned int sigsize = 80; size_t secp_sigsize = 80; unsigned char message[32]; unsigned char signature[80]; unsigned char key32[32]; secp256k1_rand256_test(message); secp256k1_scalar_set_b32(&msg, message, NULL); random_scalar_order_test(&key); secp256k1_scalar_get_b32(key32, &key); secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &qj, &key); secp256k1_ge_set_gej(&q, &qj); ec_key = get_openssl_key(key32); CHECK(ec_key != NULL); CHECK(ECDSA_sign(0, message, sizeof(message), signature, &sigsize, ec_key)); CHECK(secp256k1_ecdsa_sig_parse(&sigr, &sigs, signature, sigsize)); CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sigr, &sigs, &q, &msg)); secp256k1_scalar_set_int(&one, 1); secp256k1_scalar_add(&msg2, &msg, &one); CHECK(!secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sigr, &sigs, &q, &msg2)); random_sign(&sigr, &sigs, &key, &msg, NULL); CHECK(secp256k1_ecdsa_sig_serialize(signature, &secp_sigsize, &sigr, &sigs)); CHECK(ECDSA_verify(0, message, sizeof(message), signature, secp_sigsize, ec_key) == 1); EC_KEY_free(ec_key); } void run_ecdsa_openssl(void) { int i; for (i = 0; i < 10*count; i++) { test_ecdsa_openssl(); } } #endif #ifdef ENABLE_MODULE_ECDH # include "modules/ecdh/tests_impl.h" #endif #ifdef ENABLE_MODULE_SCHNORR # include "modules/schnorr/tests_impl.h" #endif #ifdef ENABLE_MODULE_RECOVERY # include "modules/recovery/tests_impl.h" #endif int main(int argc, char **argv) { unsigned char seed16[16] = {0}; unsigned char run32[32] = {0}; /* find iteration count */ if (argc > 1) { count = strtol(argv[1], NULL, 0); } /* find random seed */ if (argc > 2) { int pos = 0; const char* ch = argv[2]; while (pos < 16 && ch[0] != 0 && ch[1] != 0) { unsigned short sh; if (sscanf(ch, "%2hx", &sh)) { seed16[pos] = sh; } else { break; } ch += 2; pos++; } } else { FILE *frand = fopen("/dev/urandom", "r"); if ((frand == NULL) || !fread(&seed16, sizeof(seed16), 1, frand)) { uint64_t t = time(NULL) * (uint64_t)1337; seed16[0] ^= t; seed16[1] ^= t >> 8; seed16[2] ^= t >> 16; seed16[3] ^= t >> 24; seed16[4] ^= t >> 32; seed16[5] ^= t >> 40; seed16[6] ^= t >> 48; seed16[7] ^= t >> 56; } fclose(frand); } secp256k1_rand_seed(seed16); printf("test count = %i\n", count); printf("random seed = %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", seed16[0], seed16[1], seed16[2], seed16[3], seed16[4], seed16[5], seed16[6], seed16[7], seed16[8], seed16[9], seed16[10], seed16[11], seed16[12], seed16[13], seed16[14], seed16[15]); /* initialize */ run_context_tests(); ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); if (secp256k1_rand_bits(1)) { secp256k1_rand256(run32); CHECK(secp256k1_context_randomize(ctx, secp256k1_rand_bits(1) ? run32 : NULL)); } run_rand_bits(); run_rand_int(); run_sha256_tests(); run_hmac_sha256_tests(); run_rfc6979_hmac_sha256_tests(); #ifndef USE_NUM_NONE /* num tests */ run_num_smalltests(); #endif /* scalar tests */ run_scalar_tests(); /* field tests */ run_field_inv(); run_field_inv_var(); run_field_inv_all_var(); run_field_misc(); run_field_convert(); run_sqr(); run_sqrt(); /* group tests */ run_ge(); run_group_decompress(); /* ecmult tests */ run_wnaf(); run_point_times_order(); run_ecmult_chain(); run_ecmult_constants(); run_ecmult_gen_blind(); run_ecmult_const_tests(); run_ec_combine(); /* endomorphism tests */ #ifdef USE_ENDOMORPHISM run_endomorphism_tests(); #endif /* EC point parser test */ run_ec_pubkey_parse_test(); /* EC key edge cases */ run_eckey_edge_case_test(); #ifdef ENABLE_MODULE_ECDH /* ecdh tests */ run_ecdh_tests(); #endif /* ecdsa tests */ run_random_pubkeys(); run_ecdsa_der_parse(); run_ecdsa_sign_verify(); run_ecdsa_end_to_end(); run_ecdsa_edge_cases(); #ifdef ENABLE_OPENSSL_TESTS run_ecdsa_openssl(); #endif #ifdef ENABLE_MODULE_SCHNORR /* Schnorr tests */ run_schnorr_tests(); #endif #ifdef ENABLE_MODULE_RECOVERY /* ECDSA pubkey recovery tests */ run_recovery_tests(); #endif secp256k1_rand256(run32); printf("random run = %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", run32[0], run32[1], run32[2], run32[3], run32[4], run32[5], run32[6], run32[7], run32[8], run32[9], run32[10], run32[11], run32[12], run32[13], run32[14], run32[15]); /* shutdown */ secp256k1_context_destroy(ctx); printf("no problems found\n"); return 0; } ================================================ FILE: crypto/secp256k1/libsecp256k1/src/tests_exhaustive.c ================================================ /*********************************************************************** * Copyright (c) 2016 Andrew Poelstra * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #if defined HAVE_CONFIG_H #include "libsecp256k1-config.h" #endif #include #include #include #undef USE_ECMULT_STATIC_PRECOMPUTATION #ifndef EXHAUSTIVE_TEST_ORDER /* see group_impl.h for allowable values */ #define EXHAUSTIVE_TEST_ORDER 13 #define EXHAUSTIVE_TEST_LAMBDA 9 /* cube root of 1 mod 13 */ #endif #include "include/secp256k1.h" #include "group.h" #include "secp256k1.c" #include "testrand_impl.h" #ifdef ENABLE_MODULE_RECOVERY #include "src/modules/recovery/main_impl.h" #include "include/secp256k1_recovery.h" #endif /** stolen from tests.c */ void ge_equals_ge(const secp256k1_ge *a, const secp256k1_ge *b) { CHECK(a->infinity == b->infinity); if (a->infinity) { return; } CHECK(secp256k1_fe_equal_var(&a->x, &b->x)); CHECK(secp256k1_fe_equal_var(&a->y, &b->y)); } void ge_equals_gej(const secp256k1_ge *a, const secp256k1_gej *b) { secp256k1_fe z2s; secp256k1_fe u1, u2, s1, s2; CHECK(a->infinity == b->infinity); if (a->infinity) { return; } /* Check a.x * b.z^2 == b.x && a.y * b.z^3 == b.y, to avoid inverses. */ secp256k1_fe_sqr(&z2s, &b->z); secp256k1_fe_mul(&u1, &a->x, &z2s); u2 = b->x; secp256k1_fe_normalize_weak(&u2); secp256k1_fe_mul(&s1, &a->y, &z2s); secp256k1_fe_mul(&s1, &s1, &b->z); s2 = b->y; secp256k1_fe_normalize_weak(&s2); CHECK(secp256k1_fe_equal_var(&u1, &u2)); CHECK(secp256k1_fe_equal_var(&s1, &s2)); } void random_fe(secp256k1_fe *x) { unsigned char bin[32]; do { secp256k1_rand256(bin); if (secp256k1_fe_set_b32(x, bin)) { return; } } while(1); } /** END stolen from tests.c */ int secp256k1_nonce_function_smallint(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int attempt) { secp256k1_scalar s; int *idata = data; (void)msg32; (void)key32; (void)algo16; /* Some nonces cannot be used because they'd cause s and/or r to be zero. * The signing function has retry logic here that just re-calls the nonce * function with an increased `attempt`. So if attempt > 0 this means we * need to change the nonce to avoid an infinite loop. */ if (attempt > 0) { *idata = (*idata + 1) % EXHAUSTIVE_TEST_ORDER; } secp256k1_scalar_set_int(&s, *idata); secp256k1_scalar_get_b32(nonce32, &s); return 1; } #ifdef USE_ENDOMORPHISM void test_exhaustive_endomorphism(const secp256k1_ge *group, int order) { int i; for (i = 0; i < order; i++) { secp256k1_ge res; secp256k1_ge_mul_lambda(&res, &group[i]); ge_equals_ge(&group[i * EXHAUSTIVE_TEST_LAMBDA % EXHAUSTIVE_TEST_ORDER], &res); } } #endif void test_exhaustive_addition(const secp256k1_ge *group, const secp256k1_gej *groupj, int order) { int i, j; /* Sanity-check (and check infinity functions) */ CHECK(secp256k1_ge_is_infinity(&group[0])); CHECK(secp256k1_gej_is_infinity(&groupj[0])); for (i = 1; i < order; i++) { CHECK(!secp256k1_ge_is_infinity(&group[i])); CHECK(!secp256k1_gej_is_infinity(&groupj[i])); } /* Check all addition formulae */ for (j = 0; j < order; j++) { secp256k1_fe fe_inv; secp256k1_fe_inv(&fe_inv, &groupj[j].z); for (i = 0; i < order; i++) { secp256k1_ge zless_gej; secp256k1_gej tmp; /* add_var */ secp256k1_gej_add_var(&tmp, &groupj[i], &groupj[j], NULL); ge_equals_gej(&group[(i + j) % order], &tmp); /* add_ge */ if (j > 0) { secp256k1_gej_add_ge(&tmp, &groupj[i], &group[j]); ge_equals_gej(&group[(i + j) % order], &tmp); } /* add_ge_var */ secp256k1_gej_add_ge_var(&tmp, &groupj[i], &group[j], NULL); ge_equals_gej(&group[(i + j) % order], &tmp); /* add_zinv_var */ zless_gej.infinity = groupj[j].infinity; zless_gej.x = groupj[j].x; zless_gej.y = groupj[j].y; secp256k1_gej_add_zinv_var(&tmp, &groupj[i], &zless_gej, &fe_inv); ge_equals_gej(&group[(i + j) % order], &tmp); } } /* Check doubling */ for (i = 0; i < order; i++) { secp256k1_gej tmp; if (i > 0) { secp256k1_gej_double_nonzero(&tmp, &groupj[i], NULL); ge_equals_gej(&group[(2 * i) % order], &tmp); } secp256k1_gej_double_var(&tmp, &groupj[i], NULL); ge_equals_gej(&group[(2 * i) % order], &tmp); } /* Check negation */ for (i = 1; i < order; i++) { secp256k1_ge tmp; secp256k1_gej tmpj; secp256k1_ge_neg(&tmp, &group[i]); ge_equals_ge(&group[order - i], &tmp); secp256k1_gej_neg(&tmpj, &groupj[i]); ge_equals_gej(&group[order - i], &tmpj); } } void test_exhaustive_ecmult(const secp256k1_context *ctx, const secp256k1_ge *group, const secp256k1_gej *groupj, int order) { int i, j, r_log; for (r_log = 1; r_log < order; r_log++) { for (j = 0; j < order; j++) { for (i = 0; i < order; i++) { secp256k1_gej tmp; secp256k1_scalar na, ng; secp256k1_scalar_set_int(&na, i); secp256k1_scalar_set_int(&ng, j); secp256k1_ecmult(&ctx->ecmult_ctx, &tmp, &groupj[r_log], &na, &ng); ge_equals_gej(&group[(i * r_log + j) % order], &tmp); if (i > 0) { secp256k1_ecmult_const(&tmp, &group[i], &ng); ge_equals_gej(&group[(i * j) % order], &tmp); } } } } } void r_from_k(secp256k1_scalar *r, const secp256k1_ge *group, int k) { secp256k1_fe x; unsigned char x_bin[32]; k %= EXHAUSTIVE_TEST_ORDER; x = group[k].x; secp256k1_fe_normalize(&x); secp256k1_fe_get_b32(x_bin, &x); secp256k1_scalar_set_b32(r, x_bin, NULL); } void test_exhaustive_verify(const secp256k1_context *ctx, const secp256k1_ge *group, int order) { int s, r, msg, key; for (s = 1; s < order; s++) { for (r = 1; r < order; r++) { for (msg = 1; msg < order; msg++) { for (key = 1; key < order; key++) { secp256k1_ge nonconst_ge; secp256k1_ecdsa_signature sig; secp256k1_pubkey pk; secp256k1_scalar sk_s, msg_s, r_s, s_s; secp256k1_scalar s_times_k_s, msg_plus_r_times_sk_s; int k, should_verify; unsigned char msg32[32]; secp256k1_scalar_set_int(&s_s, s); secp256k1_scalar_set_int(&r_s, r); secp256k1_scalar_set_int(&msg_s, msg); secp256k1_scalar_set_int(&sk_s, key); /* Verify by hand */ /* Run through every k value that gives us this r and check that *one* works. * Note there could be none, there could be multiple, ECDSA is weird. */ should_verify = 0; for (k = 0; k < order; k++) { secp256k1_scalar check_x_s; r_from_k(&check_x_s, group, k); if (r_s == check_x_s) { secp256k1_scalar_set_int(&s_times_k_s, k); secp256k1_scalar_mul(&s_times_k_s, &s_times_k_s, &s_s); secp256k1_scalar_mul(&msg_plus_r_times_sk_s, &r_s, &sk_s); secp256k1_scalar_add(&msg_plus_r_times_sk_s, &msg_plus_r_times_sk_s, &msg_s); should_verify |= secp256k1_scalar_eq(&s_times_k_s, &msg_plus_r_times_sk_s); } } /* nb we have a "high s" rule */ should_verify &= !secp256k1_scalar_is_high(&s_s); /* Verify by calling verify */ secp256k1_ecdsa_signature_save(&sig, &r_s, &s_s); memcpy(&nonconst_ge, &group[sk_s], sizeof(nonconst_ge)); secp256k1_pubkey_save(&pk, &nonconst_ge); secp256k1_scalar_get_b32(msg32, &msg_s); CHECK(should_verify == secp256k1_ecdsa_verify(ctx, &sig, msg32, &pk)); } } } } } void test_exhaustive_sign(const secp256k1_context *ctx, const secp256k1_ge *group, int order) { int i, j, k; /* Loop */ for (i = 1; i < order; i++) { /* message */ for (j = 1; j < order; j++) { /* key */ for (k = 1; k < order; k++) { /* nonce */ const int starting_k = k; secp256k1_ecdsa_signature sig; secp256k1_scalar sk, msg, r, s, expected_r; unsigned char sk32[32], msg32[32]; secp256k1_scalar_set_int(&msg, i); secp256k1_scalar_set_int(&sk, j); secp256k1_scalar_get_b32(sk32, &sk); secp256k1_scalar_get_b32(msg32, &msg); secp256k1_ecdsa_sign(ctx, &sig, msg32, sk32, secp256k1_nonce_function_smallint, &k); secp256k1_ecdsa_signature_load(ctx, &r, &s, &sig); /* Note that we compute expected_r *after* signing -- this is important * because our nonce-computing function function might change k during * signing. */ r_from_k(&expected_r, group, k); CHECK(r == expected_r); CHECK((k * s) % order == (i + r * j) % order || (k * (EXHAUSTIVE_TEST_ORDER - s)) % order == (i + r * j) % order); /* Overflow means we've tried every possible nonce */ if (k < starting_k) { break; } } } } /* We would like to verify zero-knowledge here by counting how often every * possible (s, r) tuple appears, but because the group order is larger * than the field order, when coercing the x-values to scalar values, some * appear more often than others, so we are actually not zero-knowledge. * (This effect also appears in the real code, but the difference is on the * order of 1/2^128th the field order, so the deviation is not useful to a * computationally bounded attacker.) */ } #ifdef ENABLE_MODULE_RECOVERY void test_exhaustive_recovery_sign(const secp256k1_context *ctx, const secp256k1_ge *group, int order) { int i, j, k; /* Loop */ for (i = 1; i < order; i++) { /* message */ for (j = 1; j < order; j++) { /* key */ for (k = 1; k < order; k++) { /* nonce */ const int starting_k = k; secp256k1_fe r_dot_y_normalized; secp256k1_ecdsa_recoverable_signature rsig; secp256k1_ecdsa_signature sig; secp256k1_scalar sk, msg, r, s, expected_r; unsigned char sk32[32], msg32[32]; int expected_recid; int recid; secp256k1_scalar_set_int(&msg, i); secp256k1_scalar_set_int(&sk, j); secp256k1_scalar_get_b32(sk32, &sk); secp256k1_scalar_get_b32(msg32, &msg); secp256k1_ecdsa_sign_recoverable(ctx, &rsig, msg32, sk32, secp256k1_nonce_function_smallint, &k); /* Check directly */ secp256k1_ecdsa_recoverable_signature_load(ctx, &r, &s, &recid, &rsig); r_from_k(&expected_r, group, k); CHECK(r == expected_r); CHECK((k * s) % order == (i + r * j) % order || (k * (EXHAUSTIVE_TEST_ORDER - s)) % order == (i + r * j) % order); /* In computing the recid, there is an overflow condition that is disabled in * scalar_low_impl.h `secp256k1_scalar_set_b32` because almost every r.y value * will exceed the group order, and our signing code always holds out for r * values that don't overflow, so with a proper overflow check the tests would * loop indefinitely. */ r_dot_y_normalized = group[k].y; secp256k1_fe_normalize(&r_dot_y_normalized); /* Also the recovery id is flipped depending if we hit the low-s branch */ if ((k * s) % order == (i + r * j) % order) { expected_recid = secp256k1_fe_is_odd(&r_dot_y_normalized) ? 1 : 0; } else { expected_recid = secp256k1_fe_is_odd(&r_dot_y_normalized) ? 0 : 1; } CHECK(recid == expected_recid); /* Convert to a standard sig then check */ secp256k1_ecdsa_recoverable_signature_convert(ctx, &sig, &rsig); secp256k1_ecdsa_signature_load(ctx, &r, &s, &sig); /* Note that we compute expected_r *after* signing -- this is important * because our nonce-computing function function might change k during * signing. */ r_from_k(&expected_r, group, k); CHECK(r == expected_r); CHECK((k * s) % order == (i + r * j) % order || (k * (EXHAUSTIVE_TEST_ORDER - s)) % order == (i + r * j) % order); /* Overflow means we've tried every possible nonce */ if (k < starting_k) { break; } } } } } void test_exhaustive_recovery_verify(const secp256k1_context *ctx, const secp256k1_ge *group, int order) { /* This is essentially a copy of test_exhaustive_verify, with recovery added */ int s, r, msg, key; for (s = 1; s < order; s++) { for (r = 1; r < order; r++) { for (msg = 1; msg < order; msg++) { for (key = 1; key < order; key++) { secp256k1_ge nonconst_ge; secp256k1_ecdsa_recoverable_signature rsig; secp256k1_ecdsa_signature sig; secp256k1_pubkey pk; secp256k1_scalar sk_s, msg_s, r_s, s_s; secp256k1_scalar s_times_k_s, msg_plus_r_times_sk_s; int recid = 0; int k, should_verify; unsigned char msg32[32]; secp256k1_scalar_set_int(&s_s, s); secp256k1_scalar_set_int(&r_s, r); secp256k1_scalar_set_int(&msg_s, msg); secp256k1_scalar_set_int(&sk_s, key); secp256k1_scalar_get_b32(msg32, &msg_s); /* Verify by hand */ /* Run through every k value that gives us this r and check that *one* works. * Note there could be none, there could be multiple, ECDSA is weird. */ should_verify = 0; for (k = 0; k < order; k++) { secp256k1_scalar check_x_s; r_from_k(&check_x_s, group, k); if (r_s == check_x_s) { secp256k1_scalar_set_int(&s_times_k_s, k); secp256k1_scalar_mul(&s_times_k_s, &s_times_k_s, &s_s); secp256k1_scalar_mul(&msg_plus_r_times_sk_s, &r_s, &sk_s); secp256k1_scalar_add(&msg_plus_r_times_sk_s, &msg_plus_r_times_sk_s, &msg_s); should_verify |= secp256k1_scalar_eq(&s_times_k_s, &msg_plus_r_times_sk_s); } } /* nb we have a "high s" rule */ should_verify &= !secp256k1_scalar_is_high(&s_s); /* We would like to try recovering the pubkey and checking that it matches, * but pubkey recovery is impossible in the exhaustive tests (the reason * being that there are 12 nonzero r values, 12 nonzero points, and no * overlap between the sets, so there are no valid signatures). */ /* Verify by converting to a standard signature and calling verify */ secp256k1_ecdsa_recoverable_signature_save(&rsig, &r_s, &s_s, recid); secp256k1_ecdsa_recoverable_signature_convert(ctx, &sig, &rsig); memcpy(&nonconst_ge, &group[sk_s], sizeof(nonconst_ge)); secp256k1_pubkey_save(&pk, &nonconst_ge); CHECK(should_verify == secp256k1_ecdsa_verify(ctx, &sig, msg32, &pk)); } } } } } #endif int main(void) { int i; secp256k1_gej groupj[EXHAUSTIVE_TEST_ORDER]; secp256k1_ge group[EXHAUSTIVE_TEST_ORDER]; /* Build context */ secp256k1_context *ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); /* TODO set z = 1, then do num_tests runs with random z values */ /* Generate the entire group */ secp256k1_gej_set_infinity(&groupj[0]); secp256k1_ge_set_gej(&group[0], &groupj[0]); for (i = 1; i < EXHAUSTIVE_TEST_ORDER; i++) { /* Set a different random z-value for each Jacobian point */ secp256k1_fe z; random_fe(&z); secp256k1_gej_add_ge(&groupj[i], &groupj[i - 1], &secp256k1_ge_const_g); secp256k1_ge_set_gej(&group[i], &groupj[i]); secp256k1_gej_rescale(&groupj[i], &z); /* Verify against ecmult_gen */ { secp256k1_scalar scalar_i; secp256k1_gej generatedj; secp256k1_ge generated; secp256k1_scalar_set_int(&scalar_i, i); secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &generatedj, &scalar_i); secp256k1_ge_set_gej(&generated, &generatedj); CHECK(group[i].infinity == 0); CHECK(generated.infinity == 0); CHECK(secp256k1_fe_equal_var(&generated.x, &group[i].x)); CHECK(secp256k1_fe_equal_var(&generated.y, &group[i].y)); } } /* Run the tests */ #ifdef USE_ENDOMORPHISM test_exhaustive_endomorphism(group, EXHAUSTIVE_TEST_ORDER); #endif test_exhaustive_addition(group, groupj, EXHAUSTIVE_TEST_ORDER); test_exhaustive_ecmult(ctx, group, groupj, EXHAUSTIVE_TEST_ORDER); test_exhaustive_sign(ctx, group, EXHAUSTIVE_TEST_ORDER); test_exhaustive_verify(ctx, group, EXHAUSTIVE_TEST_ORDER); #ifdef ENABLE_MODULE_RECOVERY test_exhaustive_recovery_sign(ctx, group, EXHAUSTIVE_TEST_ORDER); test_exhaustive_recovery_verify(ctx, group, EXHAUSTIVE_TEST_ORDER); #endif secp256k1_context_destroy(ctx); return 0; } ================================================ FILE: crypto/secp256k1/libsecp256k1/src/util.h ================================================ /********************************************************************** * Copyright (c) 2013, 2014 Pieter Wuille * * Distributed under the MIT software license, see the accompanying * * file COPYING or http://www.opensource.org/licenses/mit-license.php.* **********************************************************************/ #ifndef _SECP256K1_UTIL_H_ #define _SECP256K1_UTIL_H_ #if defined HAVE_CONFIG_H #include "libsecp256k1-config.h" #endif #include #include #include typedef struct { void (*fn)(const char *text, void* data); const void* data; } secp256k1_callback; static SECP256K1_INLINE void secp256k1_callback_call(const secp256k1_callback * const cb, const char * const text) { cb->fn(text, (void*)cb->data); } #ifdef DETERMINISTIC #define TEST_FAILURE(msg) do { \ fprintf(stderr, "%s\n", msg); \ abort(); \ } while(0); #else #define TEST_FAILURE(msg) do { \ fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, msg); \ abort(); \ } while(0) #endif #ifdef HAVE_BUILTIN_EXPECT #define EXPECT(x,c) __builtin_expect((x),(c)) #else #define EXPECT(x,c) (x) #endif #ifdef DETERMINISTIC #define CHECK(cond) do { \ if (EXPECT(!(cond), 0)) { \ TEST_FAILURE("test condition failed"); \ } \ } while(0) #else #define CHECK(cond) do { \ if (EXPECT(!(cond), 0)) { \ TEST_FAILURE("test condition failed: " #cond); \ } \ } while(0) #endif /* Like assert(), but when VERIFY is defined, and side-effect safe. */ #if defined(COVERAGE) #define VERIFY_CHECK(check) #define VERIFY_SETUP(stmt) #elif defined(VERIFY) #define VERIFY_CHECK CHECK #define VERIFY_SETUP(stmt) do { stmt; } while(0) #else #define VERIFY_CHECK(cond) do { (void)(cond); } while(0) #define VERIFY_SETUP(stmt) #endif static SECP256K1_INLINE void *checked_malloc(const secp256k1_callback* cb, size_t size) { void *ret = malloc(size); if (ret == NULL) { secp256k1_callback_call(cb, "Out of memory"); } return ret; } /* Macro for restrict, when available and not in a VERIFY build. */ #if defined(SECP256K1_BUILD) && defined(VERIFY) # define SECP256K1_RESTRICT #else # if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) ) # if SECP256K1_GNUC_PREREQ(3,0) # define SECP256K1_RESTRICT __restrict__ # elif (defined(_MSC_VER) && _MSC_VER >= 1400) # define SECP256K1_RESTRICT __restrict # else # define SECP256K1_RESTRICT # endif # else # define SECP256K1_RESTRICT restrict # endif #endif #if defined(_WIN32) # define I64FORMAT "I64d" # define I64uFORMAT "I64u" #else # define I64FORMAT "lld" # define I64uFORMAT "llu" #endif #if defined(HAVE___INT128) # if defined(__GNUC__) # define SECP256K1_GNUC_EXT __extension__ # else # define SECP256K1_GNUC_EXT # endif SECP256K1_GNUC_EXT typedef unsigned __int128 uint128_t; #endif #endif ================================================ FILE: crypto/secp256k1/panic_cb.go ================================================ // Copyright 2015 Jeffrey Wilcke, Felix Lange, Gustav Simonsson. All rights reserved. // Use of this source code is governed by a BSD-style license that can be found in // the LICENSE file. package secp256k1 import "C" import "unsafe" // Callbacks for converting libsecp256k1 internal faults into // recoverable Go panics. //export secp256k1GoPanicIllegal func secp256k1GoPanicIllegal(msg *C.char, data unsafe.Pointer) { panic("illegal argument: " + C.GoString(msg)) } //export secp256k1GoPanicError func secp256k1GoPanicError(msg *C.char, data unsafe.Pointer) { panic("internal error: " + C.GoString(msg)) } ================================================ FILE: crypto/secp256k1/secp256.go ================================================ // Copyright 2015 Jeffrey Wilcke, Felix Lange, Gustav Simonsson. All rights reserved. // Use of this source code is governed by a BSD-style license that can be found in // the LICENSE file. // Package secp256k1 wraps the bitcoin secp256k1 C library. package secp256k1 /* #cgo CFLAGS: -I./libsecp256k1 #cgo CFLAGS: -I./libsecp256k1/src/ #define USE_NUM_NONE #define USE_FIELD_10X26 #define USE_FIELD_INV_BUILTIN #define USE_SCALAR_8X32 #define USE_SCALAR_INV_BUILTIN #define NDEBUG #include "./libsecp256k1/src/secp256k1.c" #include "./libsecp256k1/src/modules/recovery/main_impl.h" #include "ext.h" typedef void (*callbackFunc) (const char* msg, void* data); extern void secp256k1GoPanicIllegal(const char* msg, void* data); extern void secp256k1GoPanicError(const char* msg, void* data); */ import "C" import ( "errors" "math/big" "unsafe" ) var context *C.secp256k1_context func init() { // around 20 ms on a modern CPU. context = C.secp256k1_context_create_sign_verify() C.secp256k1_context_set_illegal_callback(context, C.callbackFunc(C.secp256k1GoPanicIllegal), nil) C.secp256k1_context_set_error_callback(context, C.callbackFunc(C.secp256k1GoPanicError), nil) } var ( ErrInvalidMsgLen = errors.New("invalid message length, need 32 bytes") ErrInvalidSignatureLen = errors.New("invalid signature length") ErrInvalidRecoveryID = errors.New("invalid signature recovery id") ErrInvalidKey = errors.New("invalid private key") ErrInvalidPubkey = errors.New("invalid public key") ErrSignFailed = errors.New("signing failed") ErrRecoverFailed = errors.New("recovery failed") ) // Sign creates a recoverable ECDSA signature. // The produced signature is in the 65-byte [R || S || V] format where V is 0 or 1. // // The caller is responsible for ensuring that msg cannot be chosen // directly by an attacker. It is usually preferable to use a cryptographic // hash function on any input before handing it to this function. func Sign(msg []byte, seckey []byte) ([]byte, error) { if len(msg) != 32 { return nil, ErrInvalidMsgLen } if len(seckey) != 32 { return nil, ErrInvalidKey } seckeydata := (*C.uchar)(unsafe.Pointer(&seckey[0])) if C.secp256k1_ec_seckey_verify(context, seckeydata) != 1 { return nil, ErrInvalidKey } var ( msgdata = (*C.uchar)(unsafe.Pointer(&msg[0])) noncefunc = C.secp256k1_nonce_function_rfc6979 sigstruct C.secp256k1_ecdsa_recoverable_signature ) if C.secp256k1_ecdsa_sign_recoverable(context, &sigstruct, msgdata, seckeydata, noncefunc, nil) == 0 { return nil, ErrSignFailed } var ( sig = make([]byte, 65) sigdata = (*C.uchar)(unsafe.Pointer(&sig[0])) recid C.int ) C.secp256k1_ecdsa_recoverable_signature_serialize_compact(context, sigdata, &recid, &sigstruct) sig[64] = byte(recid) // add back recid to get 65 bytes sig return sig, nil } // RecoverPubkey returns the the public key of the abi. // msg must be the 32-byte hash of the message to be signed. // sig must be a 65-byte compact ECDSA signature containing the // recovery id as the last element. func RecoverPubkey(msg []byte, sig []byte) ([]byte, error) { if len(msg) != 32 { return nil, ErrInvalidMsgLen } if err := checkSignature(sig); err != nil { return nil, err } var ( pubkey = make([]byte, 65) sigdata = (*C.uchar)(unsafe.Pointer(&sig[0])) msgdata = (*C.uchar)(unsafe.Pointer(&msg[0])) ) if C.secp256k1_ext_ecdsa_recover(context, (*C.uchar)(unsafe.Pointer(&pubkey[0])), sigdata, msgdata) == 0 { return nil, ErrRecoverFailed } return pubkey, nil } // VerifySignature checks that the given pubkey created signature over message. // The signature should be in [R || S] format. func VerifySignature(pubkey, msg, signature []byte) bool { if len(msg) != 32 || len(signature) != 64 || len(pubkey) == 0 { return false } sigdata := (*C.uchar)(unsafe.Pointer(&signature[0])) msgdata := (*C.uchar)(unsafe.Pointer(&msg[0])) keydata := (*C.uchar)(unsafe.Pointer(&pubkey[0])) return C.secp256k1_ext_ecdsa_verify(context, sigdata, msgdata, keydata, C.size_t(len(pubkey))) != 0 } // DecompressPubkey parses a public key in the 33-byte compressed format. // It returns non-nil coordinates if the public key is valid. func DecompressPubkey(pubkey []byte) (x, y *big.Int) { if len(pubkey) != 33 { return nil, nil } var ( pubkeydata = (*C.uchar)(unsafe.Pointer(&pubkey[0])) pubkeylen = C.size_t(len(pubkey)) out = make([]byte, 65) outdata = (*C.uchar)(unsafe.Pointer(&out[0])) outlen = C.size_t(len(out)) ) if C.secp256k1_ext_reencode_pubkey(context, outdata, outlen, pubkeydata, pubkeylen) == 0 { return nil, nil } return new(big.Int).SetBytes(out[1:33]), new(big.Int).SetBytes(out[33:]) } // CompressPubkey encodes a public key to 33-byte compressed format. func CompressPubkey(x, y *big.Int) []byte { var ( pubkey = S256().Marshal(x, y) pubkeydata = (*C.uchar)(unsafe.Pointer(&pubkey[0])) pubkeylen = C.size_t(len(pubkey)) out = make([]byte, 33) outdata = (*C.uchar)(unsafe.Pointer(&out[0])) outlen = C.size_t(len(out)) ) if C.secp256k1_ext_reencode_pubkey(context, outdata, outlen, pubkeydata, pubkeylen) == 0 { panic("libsecp256k1 error") } return out } func checkSignature(sig []byte) error { if len(sig) != 65 { return ErrInvalidSignatureLen } if sig[64] >= 4 { return ErrInvalidRecoveryID } return nil } ================================================ FILE: crypto/sha3/LICENSE ================================================ Copyright (c) 2009 The Go Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: crypto/sha3/PATENTS ================================================ Additional IP Rights Grant (Patents) "This implementation" means the copyrightable works distributed by Google as part of the Go project. Google hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, transfer and otherwise run, modify and propagate the contents of this implementation of Go, where such license applies only to those patent claims, both currently owned or controlled by Google and acquired in the future, licensable by Google that are necessarily infringed by this implementation of Go. This grant does not include claims that would be infringed only as a consequence of further modification of this implementation. If you or your agent or exclusive licensee institute or order or agree to the institution of patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that this implementation of Go or any code incorporated within this implementation of Go constitutes direct or contributory patent infringement, or inducement of patent infringement, then any patent rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ================================================ FILE: crypto/sha3/doc.go ================================================ // Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package sha3 implements the SHA-3 fixed-output-length hash functions and // the SHAKE variable-output-length hash functions defined by FIPS-202. // // Both types of hash function use the "sponge" construction and the Keccak // permutation. For a detailed specification see http://keccak.noekeon.org/ // // // Guidance // // If you aren't sure what function you need, use SHAKE256 with at least 64 // bytes of output. The SHAKE instances are faster than the SHA3 instances; // the latter have to allocate memory to conform to the hash.Hash interface. // // If you need a secret-key MAC (message authentication code), prepend the // secret key to the input, hash with SHAKE256 and read at least 32 bytes of // output. // // // Security strengths // // The SHA3-x (x equals 224, 256, 384, or 512) functions have a security // strength against preimage attacks of x bits. Since they only produce "x" // bits of output, their collision-resistance is only "x/2" bits. // // The SHAKE-256 and -128 functions have a generic security strength of 256 and // 128 bits against all attacks, provided that at least 2x bits of their output // is used. Requesting more than 64 or 32 bytes of output, respectively, does // not increase the collision-resistance of the SHAKE functions. // // // The sponge construction // // A sponge builds a pseudo-random function from a public pseudo-random // permutation, by applying the permutation to a state of "rate + capacity" // bytes, but hiding "capacity" of the bytes. // // A sponge starts out with a zero state. To hash an input using a sponge, up // to "rate" bytes of the input are XORed into the sponge's state. The sponge // is then "full" and the permutation is applied to "empty" it. This process is // repeated until all the input has been "absorbed". The input is then padded. // The digest is "squeezed" from the sponge in the same way, except that output // output is copied out instead of input being XORed in. // // A sponge is parameterized by its generic security strength, which is equal // to half its capacity; capacity + rate is equal to the permutation's width. // Since the KeccakF-1600 permutation is 1600 bits (200 bytes) wide, this means // that the security strength of a sponge instance is equal to (1600 - bitrate) / 2. // // // Recommendations // // The SHAKE functions are recommended for most new uses. They can produce // output of arbitrary length. SHAKE256, with an output length of at least // 64 bytes, provides 256-bit security against all attacks. The Keccak team // recommends it for most applications upgrading from SHA2-512. (NIST chose a // much stronger, but much slower, sponge instance for SHA3-512.) // // The SHA-3 functions are "drop-in" replacements for the SHA-2 functions. // They produce output of the same length, with the same security strengths // against all attacks. This means, in particular, that SHA3-256 only has // 128-bit collision resistance, because its output length is 32 bytes. package sha3 ================================================ FILE: crypto/sha3/hashes.go ================================================ // Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package sha3 // This file provides functions for creating instances of the SHA-3 // and SHAKE hash functions, as well as utility functions for hashing // bytes. import ( "hash" ) // NewKeccak256 creates a new Keccak-256 hash. func NewKeccak256() hash.Hash { return &state{rate: 136, outputLen: 32, dsbyte: 0x01} } // NewKeccak512 creates a new Keccak-512 hash. func NewKeccak512() hash.Hash { return &state{rate: 72, outputLen: 64, dsbyte: 0x01} } // New224 creates a new SHA3-224 hash. // Its generic security strength is 224 bits against preimage attacks, // and 112 bits against collision attacks. func New224() hash.Hash { return &state{rate: 144, outputLen: 28, dsbyte: 0x06} } // New256 creates a new SHA3-256 hash. // Its generic security strength is 256 bits against preimage attacks, // and 128 bits against collision attacks. func New256() hash.Hash { return &state{rate: 136, outputLen: 32, dsbyte: 0x06} } // New384 creates a new SHA3-384 hash. // Its generic security strength is 384 bits against preimage attacks, // and 192 bits against collision attacks. func New384() hash.Hash { return &state{rate: 104, outputLen: 48, dsbyte: 0x06} } // New512 creates a new SHA3-512 hash. // Its generic security strength is 512 bits against preimage attacks, // and 256 bits against collision attacks. func New512() hash.Hash { return &state{rate: 72, outputLen: 64, dsbyte: 0x06} } // Sum224 returns the SHA3-224 digest of the data. func Sum224(data []byte) (digest [28]byte) { h := New224() h.Write(data) h.Sum(digest[:0]) return } // Sum256 returns the SHA3-256 digest of the data. func Sum256(data []byte) (digest [32]byte) { h := New256() h.Write(data) h.Sum(digest[:0]) return } // Sum384 returns the SHA3-384 digest of the data. func Sum384(data []byte) (digest [48]byte) { h := New384() h.Write(data) h.Sum(digest[:0]) return } // Sum512 returns the SHA3-512 digest of the data. func Sum512(data []byte) (digest [64]byte) { h := New512() h.Write(data) h.Sum(digest[:0]) return } ================================================ FILE: crypto/sha3/keccakf.go ================================================ // Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !amd64 appengine gccgo package sha3 // rc stores the round constants for use in the ι step. var rc = [24]uint64{ 0x0000000000000001, 0x0000000000008082, 0x800000000000808A, 0x8000000080008000, 0x000000000000808B, 0x0000000080000001, 0x8000000080008081, 0x8000000000008009, 0x000000000000008A, 0x0000000000000088, 0x0000000080008009, 0x000000008000000A, 0x000000008000808B, 0x800000000000008B, 0x8000000000008089, 0x8000000000008003, 0x8000000000008002, 0x8000000000000080, 0x000000000000800A, 0x800000008000000A, 0x8000000080008081, 0x8000000000008080, 0x0000000080000001, 0x8000000080008008, } // keccakF1600 applies the Keccak permutation to a 1600b-wide // state represented as a slice of 25 uint64s. func keccakF1600(a *[25]uint64) { // Implementation translated from Keccak-inplace.c // in the keccak reference code. var t, bc0, bc1, bc2, bc3, bc4, d0, d1, d2, d3, d4 uint64 for i := 0; i < 24; i += 4 { // Combines the 5 steps in each round into 2 steps. // Unrolls 4 rounds per loop and spreads some steps across rounds. // Round 1 bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] d0 = bc4 ^ (bc1<<1 | bc1>>63) d1 = bc0 ^ (bc2<<1 | bc2>>63) d2 = bc1 ^ (bc3<<1 | bc3>>63) d3 = bc2 ^ (bc4<<1 | bc4>>63) d4 = bc3 ^ (bc0<<1 | bc0>>63) bc0 = a[0] ^ d0 t = a[6] ^ d1 bc1 = t<<44 | t>>(64-44) t = a[12] ^ d2 bc2 = t<<43 | t>>(64-43) t = a[18] ^ d3 bc3 = t<<21 | t>>(64-21) t = a[24] ^ d4 bc4 = t<<14 | t>>(64-14) a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i] a[6] = bc1 ^ (bc3 &^ bc2) a[12] = bc2 ^ (bc4 &^ bc3) a[18] = bc3 ^ (bc0 &^ bc4) a[24] = bc4 ^ (bc1 &^ bc0) t = a[10] ^ d0 bc2 = t<<3 | t>>(64-3) t = a[16] ^ d1 bc3 = t<<45 | t>>(64-45) t = a[22] ^ d2 bc4 = t<<61 | t>>(64-61) t = a[3] ^ d3 bc0 = t<<28 | t>>(64-28) t = a[9] ^ d4 bc1 = t<<20 | t>>(64-20) a[10] = bc0 ^ (bc2 &^ bc1) a[16] = bc1 ^ (bc3 &^ bc2) a[22] = bc2 ^ (bc4 &^ bc3) a[3] = bc3 ^ (bc0 &^ bc4) a[9] = bc4 ^ (bc1 &^ bc0) t = a[20] ^ d0 bc4 = t<<18 | t>>(64-18) t = a[1] ^ d1 bc0 = t<<1 | t>>(64-1) t = a[7] ^ d2 bc1 = t<<6 | t>>(64-6) t = a[13] ^ d3 bc2 = t<<25 | t>>(64-25) t = a[19] ^ d4 bc3 = t<<8 | t>>(64-8) a[20] = bc0 ^ (bc2 &^ bc1) a[1] = bc1 ^ (bc3 &^ bc2) a[7] = bc2 ^ (bc4 &^ bc3) a[13] = bc3 ^ (bc0 &^ bc4) a[19] = bc4 ^ (bc1 &^ bc0) t = a[5] ^ d0 bc1 = t<<36 | t>>(64-36) t = a[11] ^ d1 bc2 = t<<10 | t>>(64-10) t = a[17] ^ d2 bc3 = t<<15 | t>>(64-15) t = a[23] ^ d3 bc4 = t<<56 | t>>(64-56) t = a[4] ^ d4 bc0 = t<<27 | t>>(64-27) a[5] = bc0 ^ (bc2 &^ bc1) a[11] = bc1 ^ (bc3 &^ bc2) a[17] = bc2 ^ (bc4 &^ bc3) a[23] = bc3 ^ (bc0 &^ bc4) a[4] = bc4 ^ (bc1 &^ bc0) t = a[15] ^ d0 bc3 = t<<41 | t>>(64-41) t = a[21] ^ d1 bc4 = t<<2 | t>>(64-2) t = a[2] ^ d2 bc0 = t<<62 | t>>(64-62) t = a[8] ^ d3 bc1 = t<<55 | t>>(64-55) t = a[14] ^ d4 bc2 = t<<39 | t>>(64-39) a[15] = bc0 ^ (bc2 &^ bc1) a[21] = bc1 ^ (bc3 &^ bc2) a[2] = bc2 ^ (bc4 &^ bc3) a[8] = bc3 ^ (bc0 &^ bc4) a[14] = bc4 ^ (bc1 &^ bc0) // Round 2 bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] d0 = bc4 ^ (bc1<<1 | bc1>>63) d1 = bc0 ^ (bc2<<1 | bc2>>63) d2 = bc1 ^ (bc3<<1 | bc3>>63) d3 = bc2 ^ (bc4<<1 | bc4>>63) d4 = bc3 ^ (bc0<<1 | bc0>>63) bc0 = a[0] ^ d0 t = a[16] ^ d1 bc1 = t<<44 | t>>(64-44) t = a[7] ^ d2 bc2 = t<<43 | t>>(64-43) t = a[23] ^ d3 bc3 = t<<21 | t>>(64-21) t = a[14] ^ d4 bc4 = t<<14 | t>>(64-14) a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+1] a[16] = bc1 ^ (bc3 &^ bc2) a[7] = bc2 ^ (bc4 &^ bc3) a[23] = bc3 ^ (bc0 &^ bc4) a[14] = bc4 ^ (bc1 &^ bc0) t = a[20] ^ d0 bc2 = t<<3 | t>>(64-3) t = a[11] ^ d1 bc3 = t<<45 | t>>(64-45) t = a[2] ^ d2 bc4 = t<<61 | t>>(64-61) t = a[18] ^ d3 bc0 = t<<28 | t>>(64-28) t = a[9] ^ d4 bc1 = t<<20 | t>>(64-20) a[20] = bc0 ^ (bc2 &^ bc1) a[11] = bc1 ^ (bc3 &^ bc2) a[2] = bc2 ^ (bc4 &^ bc3) a[18] = bc3 ^ (bc0 &^ bc4) a[9] = bc4 ^ (bc1 &^ bc0) t = a[15] ^ d0 bc4 = t<<18 | t>>(64-18) t = a[6] ^ d1 bc0 = t<<1 | t>>(64-1) t = a[22] ^ d2 bc1 = t<<6 | t>>(64-6) t = a[13] ^ d3 bc2 = t<<25 | t>>(64-25) t = a[4] ^ d4 bc3 = t<<8 | t>>(64-8) a[15] = bc0 ^ (bc2 &^ bc1) a[6] = bc1 ^ (bc3 &^ bc2) a[22] = bc2 ^ (bc4 &^ bc3) a[13] = bc3 ^ (bc0 &^ bc4) a[4] = bc4 ^ (bc1 &^ bc0) t = a[10] ^ d0 bc1 = t<<36 | t>>(64-36) t = a[1] ^ d1 bc2 = t<<10 | t>>(64-10) t = a[17] ^ d2 bc3 = t<<15 | t>>(64-15) t = a[8] ^ d3 bc4 = t<<56 | t>>(64-56) t = a[24] ^ d4 bc0 = t<<27 | t>>(64-27) a[10] = bc0 ^ (bc2 &^ bc1) a[1] = bc1 ^ (bc3 &^ bc2) a[17] = bc2 ^ (bc4 &^ bc3) a[8] = bc3 ^ (bc0 &^ bc4) a[24] = bc4 ^ (bc1 &^ bc0) t = a[5] ^ d0 bc3 = t<<41 | t>>(64-41) t = a[21] ^ d1 bc4 = t<<2 | t>>(64-2) t = a[12] ^ d2 bc0 = t<<62 | t>>(64-62) t = a[3] ^ d3 bc1 = t<<55 | t>>(64-55) t = a[19] ^ d4 bc2 = t<<39 | t>>(64-39) a[5] = bc0 ^ (bc2 &^ bc1) a[21] = bc1 ^ (bc3 &^ bc2) a[12] = bc2 ^ (bc4 &^ bc3) a[3] = bc3 ^ (bc0 &^ bc4) a[19] = bc4 ^ (bc1 &^ bc0) // Round 3 bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] d0 = bc4 ^ (bc1<<1 | bc1>>63) d1 = bc0 ^ (bc2<<1 | bc2>>63) d2 = bc1 ^ (bc3<<1 | bc3>>63) d3 = bc2 ^ (bc4<<1 | bc4>>63) d4 = bc3 ^ (bc0<<1 | bc0>>63) bc0 = a[0] ^ d0 t = a[11] ^ d1 bc1 = t<<44 | t>>(64-44) t = a[22] ^ d2 bc2 = t<<43 | t>>(64-43) t = a[8] ^ d3 bc3 = t<<21 | t>>(64-21) t = a[19] ^ d4 bc4 = t<<14 | t>>(64-14) a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+2] a[11] = bc1 ^ (bc3 &^ bc2) a[22] = bc2 ^ (bc4 &^ bc3) a[8] = bc3 ^ (bc0 &^ bc4) a[19] = bc4 ^ (bc1 &^ bc0) t = a[15] ^ d0 bc2 = t<<3 | t>>(64-3) t = a[1] ^ d1 bc3 = t<<45 | t>>(64-45) t = a[12] ^ d2 bc4 = t<<61 | t>>(64-61) t = a[23] ^ d3 bc0 = t<<28 | t>>(64-28) t = a[9] ^ d4 bc1 = t<<20 | t>>(64-20) a[15] = bc0 ^ (bc2 &^ bc1) a[1] = bc1 ^ (bc3 &^ bc2) a[12] = bc2 ^ (bc4 &^ bc3) a[23] = bc3 ^ (bc0 &^ bc4) a[9] = bc4 ^ (bc1 &^ bc0) t = a[5] ^ d0 bc4 = t<<18 | t>>(64-18) t = a[16] ^ d1 bc0 = t<<1 | t>>(64-1) t = a[2] ^ d2 bc1 = t<<6 | t>>(64-6) t = a[13] ^ d3 bc2 = t<<25 | t>>(64-25) t = a[24] ^ d4 bc3 = t<<8 | t>>(64-8) a[5] = bc0 ^ (bc2 &^ bc1) a[16] = bc1 ^ (bc3 &^ bc2) a[2] = bc2 ^ (bc4 &^ bc3) a[13] = bc3 ^ (bc0 &^ bc4) a[24] = bc4 ^ (bc1 &^ bc0) t = a[20] ^ d0 bc1 = t<<36 | t>>(64-36) t = a[6] ^ d1 bc2 = t<<10 | t>>(64-10) t = a[17] ^ d2 bc3 = t<<15 | t>>(64-15) t = a[3] ^ d3 bc4 = t<<56 | t>>(64-56) t = a[14] ^ d4 bc0 = t<<27 | t>>(64-27) a[20] = bc0 ^ (bc2 &^ bc1) a[6] = bc1 ^ (bc3 &^ bc2) a[17] = bc2 ^ (bc4 &^ bc3) a[3] = bc3 ^ (bc0 &^ bc4) a[14] = bc4 ^ (bc1 &^ bc0) t = a[10] ^ d0 bc3 = t<<41 | t>>(64-41) t = a[21] ^ d1 bc4 = t<<2 | t>>(64-2) t = a[7] ^ d2 bc0 = t<<62 | t>>(64-62) t = a[18] ^ d3 bc1 = t<<55 | t>>(64-55) t = a[4] ^ d4 bc2 = t<<39 | t>>(64-39) a[10] = bc0 ^ (bc2 &^ bc1) a[21] = bc1 ^ (bc3 &^ bc2) a[7] = bc2 ^ (bc4 &^ bc3) a[18] = bc3 ^ (bc0 &^ bc4) a[4] = bc4 ^ (bc1 &^ bc0) // Round 4 bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] d0 = bc4 ^ (bc1<<1 | bc1>>63) d1 = bc0 ^ (bc2<<1 | bc2>>63) d2 = bc1 ^ (bc3<<1 | bc3>>63) d3 = bc2 ^ (bc4<<1 | bc4>>63) d4 = bc3 ^ (bc0<<1 | bc0>>63) bc0 = a[0] ^ d0 t = a[1] ^ d1 bc1 = t<<44 | t>>(64-44) t = a[2] ^ d2 bc2 = t<<43 | t>>(64-43) t = a[3] ^ d3 bc3 = t<<21 | t>>(64-21) t = a[4] ^ d4 bc4 = t<<14 | t>>(64-14) a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+3] a[1] = bc1 ^ (bc3 &^ bc2) a[2] = bc2 ^ (bc4 &^ bc3) a[3] = bc3 ^ (bc0 &^ bc4) a[4] = bc4 ^ (bc1 &^ bc0) t = a[5] ^ d0 bc2 = t<<3 | t>>(64-3) t = a[6] ^ d1 bc3 = t<<45 | t>>(64-45) t = a[7] ^ d2 bc4 = t<<61 | t>>(64-61) t = a[8] ^ d3 bc0 = t<<28 | t>>(64-28) t = a[9] ^ d4 bc1 = t<<20 | t>>(64-20) a[5] = bc0 ^ (bc2 &^ bc1) a[6] = bc1 ^ (bc3 &^ bc2) a[7] = bc2 ^ (bc4 &^ bc3) a[8] = bc3 ^ (bc0 &^ bc4) a[9] = bc4 ^ (bc1 &^ bc0) t = a[10] ^ d0 bc4 = t<<18 | t>>(64-18) t = a[11] ^ d1 bc0 = t<<1 | t>>(64-1) t = a[12] ^ d2 bc1 = t<<6 | t>>(64-6) t = a[13] ^ d3 bc2 = t<<25 | t>>(64-25) t = a[14] ^ d4 bc3 = t<<8 | t>>(64-8) a[10] = bc0 ^ (bc2 &^ bc1) a[11] = bc1 ^ (bc3 &^ bc2) a[12] = bc2 ^ (bc4 &^ bc3) a[13] = bc3 ^ (bc0 &^ bc4) a[14] = bc4 ^ (bc1 &^ bc0) t = a[15] ^ d0 bc1 = t<<36 | t>>(64-36) t = a[16] ^ d1 bc2 = t<<10 | t>>(64-10) t = a[17] ^ d2 bc3 = t<<15 | t>>(64-15) t = a[18] ^ d3 bc4 = t<<56 | t>>(64-56) t = a[19] ^ d4 bc0 = t<<27 | t>>(64-27) a[15] = bc0 ^ (bc2 &^ bc1) a[16] = bc1 ^ (bc3 &^ bc2) a[17] = bc2 ^ (bc4 &^ bc3) a[18] = bc3 ^ (bc0 &^ bc4) a[19] = bc4 ^ (bc1 &^ bc0) t = a[20] ^ d0 bc3 = t<<41 | t>>(64-41) t = a[21] ^ d1 bc4 = t<<2 | t>>(64-2) t = a[22] ^ d2 bc0 = t<<62 | t>>(64-62) t = a[23] ^ d3 bc1 = t<<55 | t>>(64-55) t = a[24] ^ d4 bc2 = t<<39 | t>>(64-39) a[20] = bc0 ^ (bc2 &^ bc1) a[21] = bc1 ^ (bc3 &^ bc2) a[22] = bc2 ^ (bc4 &^ bc3) a[23] = bc3 ^ (bc0 &^ bc4) a[24] = bc4 ^ (bc1 &^ bc0) } } ================================================ FILE: crypto/sha3/keccakf_amd64.go ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build amd64,!appengine,!gccgo package sha3 // This function is implemented in keccakf_amd64.s. //go:noescape func keccakF1600(state *[25]uint64) ================================================ FILE: crypto/sha3/keccakf_amd64.s ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build amd64,!appengine,!gccgo // This code was translated into a form compatible with 6a from the public // domain sources at https://github.com/gvanas/KeccakCodePackage // Offsets in state #define _ba (0*8) #define _be (1*8) #define _bi (2*8) #define _bo (3*8) #define _bu (4*8) #define _ga (5*8) #define _ge (6*8) #define _gi (7*8) #define _go (8*8) #define _gu (9*8) #define _ka (10*8) #define _ke (11*8) #define _ki (12*8) #define _ko (13*8) #define _ku (14*8) #define _ma (15*8) #define _me (16*8) #define _mi (17*8) #define _mo (18*8) #define _mu (19*8) #define _sa (20*8) #define _se (21*8) #define _si (22*8) #define _so (23*8) #define _su (24*8) // Temporary registers #define rT1 AX // Round vars #define rpState DI #define rpStack SP #define rDa BX #define rDe CX #define rDi DX #define rDo R8 #define rDu R9 #define rBa R10 #define rBe R11 #define rBi R12 #define rBo R13 #define rBu R14 #define rCa SI #define rCe BP #define rCi rBi #define rCo rBo #define rCu R15 #define MOVQ_RBI_RCE MOVQ rBi, rCe #define XORQ_RT1_RCA XORQ rT1, rCa #define XORQ_RT1_RCE XORQ rT1, rCe #define XORQ_RBA_RCU XORQ rBa, rCu #define XORQ_RBE_RCU XORQ rBe, rCu #define XORQ_RDU_RCU XORQ rDu, rCu #define XORQ_RDA_RCA XORQ rDa, rCa #define XORQ_RDE_RCE XORQ rDe, rCe #define mKeccakRound(iState, oState, rc, B_RBI_RCE, G_RT1_RCA, G_RT1_RCE, G_RBA_RCU, K_RT1_RCA, K_RT1_RCE, K_RBA_RCU, M_RT1_RCA, M_RT1_RCE, M_RBE_RCU, S_RDU_RCU, S_RDA_RCA, S_RDE_RCE) \ /* Prepare round */ \ MOVQ rCe, rDa; \ ROLQ $1, rDa; \ \ MOVQ _bi(iState), rCi; \ XORQ _gi(iState), rDi; \ XORQ rCu, rDa; \ XORQ _ki(iState), rCi; \ XORQ _mi(iState), rDi; \ XORQ rDi, rCi; \ \ MOVQ rCi, rDe; \ ROLQ $1, rDe; \ \ MOVQ _bo(iState), rCo; \ XORQ _go(iState), rDo; \ XORQ rCa, rDe; \ XORQ _ko(iState), rCo; \ XORQ _mo(iState), rDo; \ XORQ rDo, rCo; \ \ MOVQ rCo, rDi; \ ROLQ $1, rDi; \ \ MOVQ rCu, rDo; \ XORQ rCe, rDi; \ ROLQ $1, rDo; \ \ MOVQ rCa, rDu; \ XORQ rCi, rDo; \ ROLQ $1, rDu; \ \ /* Result b */ \ MOVQ _ba(iState), rBa; \ MOVQ _ge(iState), rBe; \ XORQ rCo, rDu; \ MOVQ _ki(iState), rBi; \ MOVQ _mo(iState), rBo; \ MOVQ _su(iState), rBu; \ XORQ rDe, rBe; \ ROLQ $44, rBe; \ XORQ rDi, rBi; \ XORQ rDa, rBa; \ ROLQ $43, rBi; \ \ MOVQ rBe, rCa; \ MOVQ rc, rT1; \ ORQ rBi, rCa; \ XORQ rBa, rT1; \ XORQ rT1, rCa; \ MOVQ rCa, _ba(oState); \ \ XORQ rDu, rBu; \ ROLQ $14, rBu; \ MOVQ rBa, rCu; \ ANDQ rBe, rCu; \ XORQ rBu, rCu; \ MOVQ rCu, _bu(oState); \ \ XORQ rDo, rBo; \ ROLQ $21, rBo; \ MOVQ rBo, rT1; \ ANDQ rBu, rT1; \ XORQ rBi, rT1; \ MOVQ rT1, _bi(oState); \ \ NOTQ rBi; \ ORQ rBa, rBu; \ ORQ rBo, rBi; \ XORQ rBo, rBu; \ XORQ rBe, rBi; \ MOVQ rBu, _bo(oState); \ MOVQ rBi, _be(oState); \ B_RBI_RCE; \ \ /* Result g */ \ MOVQ _gu(iState), rBe; \ XORQ rDu, rBe; \ MOVQ _ka(iState), rBi; \ ROLQ $20, rBe; \ XORQ rDa, rBi; \ ROLQ $3, rBi; \ MOVQ _bo(iState), rBa; \ MOVQ rBe, rT1; \ ORQ rBi, rT1; \ XORQ rDo, rBa; \ MOVQ _me(iState), rBo; \ MOVQ _si(iState), rBu; \ ROLQ $28, rBa; \ XORQ rBa, rT1; \ MOVQ rT1, _ga(oState); \ G_RT1_RCA; \ \ XORQ rDe, rBo; \ ROLQ $45, rBo; \ MOVQ rBi, rT1; \ ANDQ rBo, rT1; \ XORQ rBe, rT1; \ MOVQ rT1, _ge(oState); \ G_RT1_RCE; \ \ XORQ rDi, rBu; \ ROLQ $61, rBu; \ MOVQ rBu, rT1; \ ORQ rBa, rT1; \ XORQ rBo, rT1; \ MOVQ rT1, _go(oState); \ \ ANDQ rBe, rBa; \ XORQ rBu, rBa; \ MOVQ rBa, _gu(oState); \ NOTQ rBu; \ G_RBA_RCU; \ \ ORQ rBu, rBo; \ XORQ rBi, rBo; \ MOVQ rBo, _gi(oState); \ \ /* Result k */ \ MOVQ _be(iState), rBa; \ MOVQ _gi(iState), rBe; \ MOVQ _ko(iState), rBi; \ MOVQ _mu(iState), rBo; \ MOVQ _sa(iState), rBu; \ XORQ rDi, rBe; \ ROLQ $6, rBe; \ XORQ rDo, rBi; \ ROLQ $25, rBi; \ MOVQ rBe, rT1; \ ORQ rBi, rT1; \ XORQ rDe, rBa; \ ROLQ $1, rBa; \ XORQ rBa, rT1; \ MOVQ rT1, _ka(oState); \ K_RT1_RCA; \ \ XORQ rDu, rBo; \ ROLQ $8, rBo; \ MOVQ rBi, rT1; \ ANDQ rBo, rT1; \ XORQ rBe, rT1; \ MOVQ rT1, _ke(oState); \ K_RT1_RCE; \ \ XORQ rDa, rBu; \ ROLQ $18, rBu; \ NOTQ rBo; \ MOVQ rBo, rT1; \ ANDQ rBu, rT1; \ XORQ rBi, rT1; \ MOVQ rT1, _ki(oState); \ \ MOVQ rBu, rT1; \ ORQ rBa, rT1; \ XORQ rBo, rT1; \ MOVQ rT1, _ko(oState); \ \ ANDQ rBe, rBa; \ XORQ rBu, rBa; \ MOVQ rBa, _ku(oState); \ K_RBA_RCU; \ \ /* Result m */ \ MOVQ _ga(iState), rBe; \ XORQ rDa, rBe; \ MOVQ _ke(iState), rBi; \ ROLQ $36, rBe; \ XORQ rDe, rBi; \ MOVQ _bu(iState), rBa; \ ROLQ $10, rBi; \ MOVQ rBe, rT1; \ MOVQ _mi(iState), rBo; \ ANDQ rBi, rT1; \ XORQ rDu, rBa; \ MOVQ _so(iState), rBu; \ ROLQ $27, rBa; \ XORQ rBa, rT1; \ MOVQ rT1, _ma(oState); \ M_RT1_RCA; \ \ XORQ rDi, rBo; \ ROLQ $15, rBo; \ MOVQ rBi, rT1; \ ORQ rBo, rT1; \ XORQ rBe, rT1; \ MOVQ rT1, _me(oState); \ M_RT1_RCE; \ \ XORQ rDo, rBu; \ ROLQ $56, rBu; \ NOTQ rBo; \ MOVQ rBo, rT1; \ ORQ rBu, rT1; \ XORQ rBi, rT1; \ MOVQ rT1, _mi(oState); \ \ ORQ rBa, rBe; \ XORQ rBu, rBe; \ MOVQ rBe, _mu(oState); \ \ ANDQ rBa, rBu; \ XORQ rBo, rBu; \ MOVQ rBu, _mo(oState); \ M_RBE_RCU; \ \ /* Result s */ \ MOVQ _bi(iState), rBa; \ MOVQ _go(iState), rBe; \ MOVQ _ku(iState), rBi; \ XORQ rDi, rBa; \ MOVQ _ma(iState), rBo; \ ROLQ $62, rBa; \ XORQ rDo, rBe; \ MOVQ _se(iState), rBu; \ ROLQ $55, rBe; \ \ XORQ rDu, rBi; \ MOVQ rBa, rDu; \ XORQ rDe, rBu; \ ROLQ $2, rBu; \ ANDQ rBe, rDu; \ XORQ rBu, rDu; \ MOVQ rDu, _su(oState); \ \ ROLQ $39, rBi; \ S_RDU_RCU; \ NOTQ rBe; \ XORQ rDa, rBo; \ MOVQ rBe, rDa; \ ANDQ rBi, rDa; \ XORQ rBa, rDa; \ MOVQ rDa, _sa(oState); \ S_RDA_RCA; \ \ ROLQ $41, rBo; \ MOVQ rBi, rDe; \ ORQ rBo, rDe; \ XORQ rBe, rDe; \ MOVQ rDe, _se(oState); \ S_RDE_RCE; \ \ MOVQ rBo, rDi; \ MOVQ rBu, rDo; \ ANDQ rBu, rDi; \ ORQ rBa, rDo; \ XORQ rBi, rDi; \ XORQ rBo, rDo; \ MOVQ rDi, _si(oState); \ MOVQ rDo, _so(oState) \ // func keccakF1600(state *[25]uint64) TEXT ·keccakF1600(SB), 0, $200-8 MOVQ state+0(FP), rpState // Convert the user state into an internal state NOTQ _be(rpState) NOTQ _bi(rpState) NOTQ _go(rpState) NOTQ _ki(rpState) NOTQ _mi(rpState) NOTQ _sa(rpState) // Execute the KeccakF permutation MOVQ _ba(rpState), rCa MOVQ _be(rpState), rCe MOVQ _bu(rpState), rCu XORQ _ga(rpState), rCa XORQ _ge(rpState), rCe XORQ _gu(rpState), rCu XORQ _ka(rpState), rCa XORQ _ke(rpState), rCe XORQ _ku(rpState), rCu XORQ _ma(rpState), rCa XORQ _me(rpState), rCe XORQ _mu(rpState), rCu XORQ _sa(rpState), rCa XORQ _se(rpState), rCe MOVQ _si(rpState), rDi MOVQ _so(rpState), rDo XORQ _su(rpState), rCu mKeccakRound(rpState, rpStack, $0x0000000000000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x0000000000008082, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x800000000000808a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x8000000080008000, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x000000000000808b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x0000000080000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x8000000080008081, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x8000000000008009, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x000000000000008a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x0000000000000088, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x0000000080008009, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x000000008000000a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x000000008000808b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x800000000000008b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x8000000000008089, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x8000000000008003, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x8000000000008002, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x8000000000000080, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x000000000000800a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x800000008000000a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x8000000080008081, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x8000000000008080, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x0000000080000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x8000000080008008, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP) // Revert the internal state to the user state NOTQ _be(rpState) NOTQ _bi(rpState) NOTQ _go(rpState) NOTQ _ki(rpState) NOTQ _mi(rpState) NOTQ _sa(rpState) RET ================================================ FILE: crypto/sha3/register.go ================================================ // Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build go1.4 package sha3 import ( "crypto" ) func init() { crypto.RegisterHash(crypto.SHA3_224, New224) crypto.RegisterHash(crypto.SHA3_256, New256) crypto.RegisterHash(crypto.SHA3_384, New384) crypto.RegisterHash(crypto.SHA3_512, New512) } ================================================ FILE: crypto/sha3/sha3.go ================================================ // Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package sha3 // spongeDirection indicates the direction bytes are flowing through the sponge. type spongeDirection int const ( // spongeAbsorbing indicates that the sponge is absorbing input. spongeAbsorbing spongeDirection = iota // spongeSqueezing indicates that the sponge is being squeezed. spongeSqueezing ) const ( // maxRate is the maximum size of the internal buffer. SHAKE-256 // currently needs the largest buffer. maxRate = 168 ) type state struct { // Generic sponge components. a [25]uint64 // main state of the hash buf []byte // points into storage rate int // the number of bytes of state to use // dsbyte contains the "domain separation" bits and the first bit of // the padding. Sections 6.1 and 6.2 of [1] separate the outputs of the // SHA-3 and SHAKE functions by appending bitstrings to the message. // Using a little-endian bit-ordering convention, these are "01" for SHA-3 // and "1111" for SHAKE, or 00000010b and 00001111b, respectively. Then the // padding rule from section 5.1 is applied to pad the message to a multiple // of the rate, which involves adding a "1" bit, zero or more "0" bits, and // a final "1" bit. We merge the first "1" bit from the padding into dsbyte, // giving 00000110b (0x06) and 00011111b (0x1f). // [1] http://csrc.nist.gov/publications/drafts/fips-202/fips_202_draft.pdf // "Draft FIPS 202: SHA-3 Standard: Permutation-Based Hash and // Extendable-Output Functions (May 2014)" dsbyte byte storage [maxRate]byte // Specific to SHA-3 and SHAKE. outputLen int // the default output size in bytes state spongeDirection // whether the sponge is absorbing or squeezing } // BlockSize returns the rate of sponge underlying this hash function. func (d *state) BlockSize() int { return d.rate } // Size returns the output size of the hash function in bytes. func (d *state) Size() int { return d.outputLen } // Reset clears the internal state by zeroing the sponge state and // the byte buffer, and setting Sponge.state to absorbing. func (d *state) Reset() { // Zero the permutation's state. for i := range d.a { d.a[i] = 0 } d.state = spongeAbsorbing d.buf = d.storage[:0] } func (d *state) clone() *state { ret := *d if ret.state == spongeAbsorbing { ret.buf = ret.storage[:len(ret.buf)] } else { ret.buf = ret.storage[d.rate-cap(d.buf) : d.rate] } return &ret } // permute applies the KeccakF-1600 permutation. It handles // any input-output buffering. func (d *state) permute() { switch d.state { case spongeAbsorbing: // If we're absorbing, we need to xor the input into the state // before applying the permutation. xorIn(d, d.buf) d.buf = d.storage[:0] keccakF1600(&d.a) case spongeSqueezing: // If we're squeezing, we need to apply the permutatin before // copying more output. keccakF1600(&d.a) d.buf = d.storage[:d.rate] copyOut(d, d.buf) } } // pads appends the domain separation bits in dsbyte, applies // the multi-bitrate 10..1 padding rule, and permutes the state. func (d *state) padAndPermute(dsbyte byte) { if d.buf == nil { d.buf = d.storage[:0] } // Pad with this instance's domain-separator bits. We know that there's // at least one byte of space in d.buf because, if it were full, // permute would have been called to empty it. dsbyte also contains the // first one bit for the padding. See the comment in the state struct. d.buf = append(d.buf, dsbyte) zerosStart := len(d.buf) d.buf = d.storage[:d.rate] for i := zerosStart; i < d.rate; i++ { d.buf[i] = 0 } // This adds the final one bit for the padding. Because of the way that // bits are numbered from the LSB upwards, the final bit is the MSB of // the last byte. d.buf[d.rate-1] ^= 0x80 // Apply the permutation d.permute() d.state = spongeSqueezing d.buf = d.storage[:d.rate] copyOut(d, d.buf) } // Write absorbs more data into the hash's state. It produces an error // if more data is written to the ShakeHash after writing func (d *state) Write(p []byte) (written int, err error) { if d.state != spongeAbsorbing { panic("sha3: write to sponge after read") } if d.buf == nil { d.buf = d.storage[:0] } written = len(p) for len(p) > 0 { if len(d.buf) == 0 && len(p) >= d.rate { // The fast path; absorb a full "rate" bytes of input and apply the permutation. xorIn(d, p[:d.rate]) p = p[d.rate:] keccakF1600(&d.a) } else { // The slow path; buffer the input until we can fill the sponge, and then xor it in. todo := d.rate - len(d.buf) if todo > len(p) { todo = len(p) } d.buf = append(d.buf, p[:todo]...) p = p[todo:] // If the sponge is full, apply the permutation. if len(d.buf) == d.rate { d.permute() } } } return } // Read squeezes an arbitrary number of bytes from the sponge. func (d *state) Read(out []byte) (n int, err error) { // If we're still absorbing, pad and apply the permutation. if d.state == spongeAbsorbing { d.padAndPermute(d.dsbyte) } n = len(out) // Now, do the squeezing. for len(out) > 0 { n := copy(out, d.buf) d.buf = d.buf[n:] out = out[n:] // Apply the permutation if we've squeezed the sponge dry. if len(d.buf) == 0 { d.permute() } } return } // Sum applies padding to the hash state and then squeezes out the desired // number of output bytes. func (d *state) Sum(in []byte) []byte { // Make a copy of the original hash so that caller can keep writing // and summing. dup := d.clone() hash := make([]byte, dup.outputLen) dup.Read(hash) return append(in, hash...) } ================================================ FILE: crypto/sha3/shake.go ================================================ // Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package sha3 // This file defines the ShakeHash interface, and provides // functions for creating SHAKE instances, as well as utility // functions for hashing bytes to arbitrary-length output. import ( "io" ) // ShakeHash defines the interface to hash functions that // support arbitrary-length output. type ShakeHash interface { // Write absorbs more data into the hash's state. It panics if input is // written to it after output has been read from it. io.Writer // Read reads more output from the hash; reading affects the hash's // state. (ShakeHash.Read is thus very different from Hash.Sum) // It never returns an error. io.Reader // Clone returns a copy of the ShakeHash in its current state. Clone() ShakeHash // Reset resets the ShakeHash to its initial state. Reset() } func (d *state) Clone() ShakeHash { return d.clone() } // NewShake128 creates a new SHAKE128 variable-output-length ShakeHash. // Its generic security strength is 128 bits against all attacks if at // least 32 bytes of its output are used. func NewShake128() ShakeHash { return &state{rate: 168, dsbyte: 0x1f} } // NewShake256 creates a new SHAKE128 variable-output-length ShakeHash. // Its generic security strength is 256 bits against all attacks if // at least 64 bytes of its output are used. func NewShake256() ShakeHash { return &state{rate: 136, dsbyte: 0x1f} } // ShakeSum128 writes an arbitrary-length digest of data into hash. func ShakeSum128(hash, data []byte) { h := NewShake128() h.Write(data) h.Read(hash) } // ShakeSum256 writes an arbitrary-length digest of data into hash. func ShakeSum256(hash, data []byte) { h := NewShake256() h.Write(data) h.Read(hash) } ================================================ FILE: crypto/sha3/xor.go ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !amd64,!386,!ppc64le appengine package sha3 var ( xorIn = xorInGeneric copyOut = copyOutGeneric xorInUnaligned = xorInGeneric copyOutUnaligned = copyOutGeneric ) const xorImplementationUnaligned = "generic" ================================================ FILE: crypto/sha3/xor_generic.go ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package sha3 import "encoding/binary" // xorInGeneric xors the bytes in buf into the state; it // makes no non-portable assumptions about memory layout // or alignment. func xorInGeneric(d *state, buf []byte) { n := len(buf) / 8 for i := 0; i < n; i++ { a := binary.LittleEndian.Uint64(buf) d.a[i] ^= a buf = buf[8:] } } // copyOutGeneric copies ulint64s to a byte buffer. func copyOutGeneric(d *state, b []byte) { for i := 0; len(b) >= 8; i++ { binary.LittleEndian.PutUint64(b, d.a[i]) b = b[8:] } } ================================================ FILE: crypto/sha3/xor_unaligned.go ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build amd64 386 ppc64le // +build !appengine package sha3 import "unsafe" func xorInUnaligned(d *state, buf []byte) { bw := (*[maxRate / 8]uint64)(unsafe.Pointer(&buf[0])) n := len(buf) if n >= 72 { d.a[0] ^= bw[0] d.a[1] ^= bw[1] d.a[2] ^= bw[2] d.a[3] ^= bw[3] d.a[4] ^= bw[4] d.a[5] ^= bw[5] d.a[6] ^= bw[6] d.a[7] ^= bw[7] d.a[8] ^= bw[8] } if n >= 104 { d.a[9] ^= bw[9] d.a[10] ^= bw[10] d.a[11] ^= bw[11] d.a[12] ^= bw[12] } if n >= 136 { d.a[13] ^= bw[13] d.a[14] ^= bw[14] d.a[15] ^= bw[15] d.a[16] ^= bw[16] } if n >= 144 { d.a[17] ^= bw[17] } if n >= 168 { d.a[18] ^= bw[18] d.a[19] ^= bw[19] d.a[20] ^= bw[20] } } func copyOutUnaligned(d *state, buf []byte) { ab := (*[maxRate]uint8)(unsafe.Pointer(&d.a[0])) copy(buf, ab[:]) } var ( xorIn = xorInUnaligned copyOut = copyOutUnaligned ) ================================================ FILE: crypto/signature_cgo.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // +build !nacl,!js,!nocgo package crypto import ( "crypto/ecdsa" "crypto/elliptic" "fmt" "github.com/sero-cash/go-sero/common/math" "github.com/sero-cash/go-sero/crypto/secp256k1" ) // Ecrecover returns the uncompressed public key that created the given signature. func Ecrecover(hash, sig []byte) ([]byte, error) { return secp256k1.RecoverPubkey(hash, sig) } // SigToPub returns the public key that created the given signature. func SigToPub(hash, sig []byte) (*ecdsa.PublicKey, error) { s, err := Ecrecover(hash, sig) if err != nil { return nil, err } x, y := elliptic.Unmarshal(S256(), s) return &ecdsa.PublicKey{Curve: S256(), X: x, Y: y}, nil } // Sign calculates an ECDSA signature. // // This function is susceptible to chosen plaintext attacks that can leak // information about the private key that is used for signing. Callers must // be aware that the given hash cannot be chosen by an adversery. Common // solution is to hash any input before calculating the signature. // // The produced signature is in the [R || S || V] format where V is 0 or 1. func Sign(hash []byte, prv *ecdsa.PrivateKey) (sig []byte, err error) { if len(hash) != 32 { return nil, fmt.Errorf("hash is required to be exactly 32 bytes (%d)", len(hash)) } seckey := math.PaddedBigBytes(prv.D, prv.Params().BitSize/8) defer zeroBytes(seckey) return secp256k1.Sign(hash, seckey) } // VerifySignature checks that the given public key created signature over hash. // The public key should be in compressed (33 bytes) or uncompressed (65 bytes) format. // The signature should have the 64 byte [R || S] format. func VerifySignature(pubkey, hash, signature []byte) bool { return secp256k1.VerifySignature(pubkey, hash, signature) } // DecompressPubkey parses a public key in the 33-byte compressed format. func DecompressPubkey(pubkey []byte) (*ecdsa.PublicKey, error) { x, y := secp256k1.DecompressPubkey(pubkey) if x == nil { return nil, fmt.Errorf("invalid public key") } return &ecdsa.PublicKey{X: x, Y: y, Curve: S256()}, nil } // CompressPubkey encodes a public key to the 33-byte compressed format. func CompressPubkey(pubkey *ecdsa.PublicKey) []byte { return secp256k1.CompressPubkey(pubkey.X, pubkey.Y) } // S256 returns an instance of the secp256k1 curve. func S256() elliptic.Curve { return secp256k1.S256() } ================================================ FILE: crypto/signature_nocgo.go ================================================ // Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . // +build nacl js nocgo package crypto import ( "crypto/ecdsa" "crypto/elliptic" "errors" "fmt" "math/big" "github.com/btcsuite/btcd/btcec" ) // Ecrecover returns the uncompressed public key that created the given signature. func Ecrecover(hash, sig []byte) ([]byte, error) { pub, err := SigToPub(hash, sig) if err != nil { return nil, err } bytes := (*btcec.PublicKey)(pub).SerializeUncompressed() return bytes, err } // SigToPub returns the public key that created the given signature. func SigToPub(hash, sig []byte) (*ecdsa.PublicKey, error) { // Convert to btcec input format with 'recovery id' v at the beginning. btcsig := make([]byte, 65) btcsig[0] = sig[64] + 27 copy(btcsig[1:], sig) pub, _, err := btcec.RecoverCompact(btcec.S256(), btcsig, hash) return (*ecdsa.PublicKey)(pub), err } // Sign calculates an ECDSA signature. // // This function is susceptible to chosen plaintext attacks that can leak // information about the private key that is used for signing. Callers must // be aware that the given hash cannot be chosen by an adversery. Common // solution is to hash any input before calculating the signature. // // The produced signature is in the [R || S || V] format where V is 0 or 1. func Sign(hash []byte, prv *ecdsa.PrivateKey) ([]byte, error) { if len(hash) != 32 { return nil, fmt.Errorf("hash is required to be exactly 32 bytes (%d)", len(hash)) } if prv.Curve != btcec.S256() { return nil, fmt.Errorf("private key curve is not secp256k1") } sig, err := btcec.SignCompact(btcec.S256(), (*btcec.PrivateKey)(prv), hash, false) if err != nil { return nil, err } // Convert to Ethereum signature format with 'recovery id' v at the end. v := sig[0] - 27 copy(sig, sig[1:]) sig[64] = v return sig, nil } // VerifySignature checks that the given public key created signature over hash. // The public key should be in compressed (33 bytes) or uncompressed (65 bytes) format. // The signature should have the 64 byte [R || S] format. func VerifySignature(pubkey, hash, signature []byte) bool { if len(signature) != 64 { return false } sig := &btcec.Signature{R: new(big.Int).SetBytes(signature[:32]), S: new(big.Int).SetBytes(signature[32:])} key, err := btcec.ParsePubKey(pubkey, btcec.S256()) if err != nil { return false } // Reject malleable signatures. libsecp256k1 does this check but btcec doesn't. if sig.S.Cmp(secp256k1halfN) > 0 { return false } return sig.Verify(hash, key) } // DecompressPubkey parses a public key in the 33-byte compressed format. func DecompressPubkey(pubkey []byte) (*ecdsa.PublicKey, error) { if len(pubkey) != 33 { return nil, errors.New("invalid compressed public key length") } key, err := btcec.ParsePubKey(pubkey, btcec.S256()) if err != nil { return nil, err } return key.ToECDSA(), nil } // CompressPubkey encodes a public key to the 33-byte compressed format. func CompressPubkey(pubkey *ecdsa.PublicKey) []byte { return (*btcec.PublicKey)(pubkey).SerializeCompressed() } // S256 returns an instance of the secp256k1 curve. func S256() elliptic.Curve { return btcec.S256() } ================================================ FILE: dashboard/README.md ================================================ ## Go Ethereum Dashboard The dashboard is a data visualizer integrated into gero, intended to collect and visualize useful information of an Ethereum node. It consists of two parts: * The client visualizes the collected data. * The server collects the data, and updates the clients. The client's UI uses [React][React] with JSX syntax, which is validated by the [ESLint][ESLint] linter mostly according to the [Airbnb React/JSX Style Guide][Airbnb]. The style is defined in the `.eslintrc` configuration file. The resources are bundled into a single `bundle.js` file using [Webpack][Webpack], which relies on the `webpack.config.js`. The bundled file is referenced from `dashboard.html` and takes part in the `assets.go` too. The necessary dependencies for the module bundler are gathered by [Node.js][Node.js]. ### Development and bundling As the dashboard depends on certain NPM packages (which are not included in the `go-sero` repo), these need to be installed first: ``` $ (cd dashboard/assets && yarn install && yarn flow) ``` Normally the dashboard assets are bundled into Geth via `go-bindata` to avoid external dependencies. Rebuilding Geth after each UI modification however is not feasible from a developer perspective. Instead, we can run `yarn dev` to watch for file system changes and refresh the browser automatically. ``` $ gero --dashboard --vmodule=dashboard=5 $ (cd dashboard/assets && yarn dev) ``` To bundle up the final UI into Geth, run `go generate`: ``` $ (cd dashboard && go generate) ``` ### Static type checking Since JavaScript doesn't provide type safety, [Flow][Flow] is used to check types. These are only useful during development, so at the end of the process Babel will strip them. To take advantage of static type checking, your IDE needs to be prepared for it. In case of [Atom][Atom] a configuration guide can be found [here][Atom config]: Install the [Nuclide][Nuclide] package for Flow support, making sure it installs all of its support packages by enabling `Install Recommended Packages on Startup`, and set the path of the `flow-bin` which were installed previously by `yarn`. For more IDE support install the `linter-eslint` package too, which finds the `.eslintrc` file, and provides real-time linting. Atom warns, that these two packages are incompatible, but they seem to work well together. For third-party library errors and auto-completion [flow-typed][flow-typed] is used. ### Have fun [Webpack][Webpack] offers handy tools for visualizing the bundle's dependency tree and space usage. * Generate the bundle's profile running `yarn stats` * For the _dependency tree_ go to [Webpack Analyze][WA], and import `stats.json` * For the _space usage_ go to [Webpack Visualizer][WV], and import `stats.json` [React]: https://reactjs.org/ [ESLint]: https://eslint.org/ [Airbnb]: https://github.com/airbnb/javascript/tree/master/react [Webpack]: https://webpack.github.io/ [WA]: http://webpack.github.io/analyse/ [WV]: http://chrisbateman.github.io/webpack-visualizer/ [Node.js]: https://nodejs.org/en/ [Flow]: https://flow.org/ [Atom]: https://atom.io/ [Atom config]: https://medium.com/@fastphrase/integrating-flow-into-a-react-project-fbbc2f130eed [Nuclide]: https://nuclide.io/docs/quick-start/getting-started/ [flow-typed]: https://github.com/flowtype/flow-typed ================================================ FILE: dashboard/assets/.eslintrc ================================================ // Copyright 2017 The go-sero Authors // This file is part of the go-sero library. // // The go-sero library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-sero library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-sero library. If not, see . // React syntax style mostly according to https://github.com/airbnb/javascript/tree/master/react { 'env': { 'browser': true, 'node': true, 'es6': true, }, 'parser': 'babel-eslint', 'parserOptions': { 'sourceType': 'module', 'ecmaVersion': 6, 'ecmaFeatures': { 'jsx': true, } }, 'extends': 'airbnb', 'plugins': [ 'flowtype', 'react', ], 'rules': { 'no-tabs': 'off', 'indent': ['error', 'tab'], 'react/jsx-indent': ['error', 'tab'], 'react/jsx-indent-props': ['error', 'tab'], 'react/prefer-stateless-function': 'off', 'jsx-quotes': ['error', 'prefer-single'], 'no-plusplus': 'off', 'no-console': ['error', { allow: ['error'] }], // Specifies the maximum length of a line. 'max-len': ['warn', 120, 2, { 'ignoreUrls': true, 'ignoreComments': false, 'ignoreRegExpLiterals': true, 'ignoreStrings': true, 'ignoreTemplateLiterals': true, }], // Enforces consistent spacing between keys and values in object literal properties. 'key-spacing': ['error', {'align': { 'beforeColon': false, 'afterColon': true, 'on': 'value' }}], // Prohibits padding inside curly braces. 'object-curly-spacing': ['error', 'never'], 'no-use-before-define': 'off', // messageAPI 'default-case': 'off', 'flowtype/boolean-style': ['error', 'boolean'], 'flowtype/define-flow-type': 'warn', 'flowtype/generic-spacing': ['error', 'never'], 'flowtype/no-primitive-constructor-types': 'error', 'flowtype/no-weak-types': 'error', 'flowtype/object-type-delimiter': ['error', 'comma'], 'flowtype/require-valid-file-annotation': 'error', 'flowtype/semi': ['error', 'always'], 'flowtype/space-after-type-colon': ['error', 'always'], 'flowtype/space-before-generic-bracket': ['error', 'never'], 'flowtype/space-before-type-colon': ['error', 'never'], 'flowtype/union-intersection-spacing': ['error', 'always'], 'flowtype/use-flow-type': 'warn', 'flowtype/valid-syntax': 'warn', }, 'settings': { 'flowtype': { 'onlyFilesWithFlowAnnotation': true, } }, } ================================================ FILE: dashboard/assets/.flowconfig ================================================ [ignore] /node_modules/material-ui/.*\.js\.flow [libs] /flow-typed/ node_modules/jss/flow-typed [options] include_warnings=true ================================================ FILE: dashboard/assets/common.jsx ================================================ // @flow // Copyright 2017 The go-sero Authors // This file is part of the go-sero library. // // The go-sero library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-sero library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-sero library. If not, see . type ProvidedMenuProp = {|title: string, icon: string|}; const menuSkeletons: Array<{|id: string, menu: ProvidedMenuProp|}> = [ { id: 'home', menu: { title: 'Home', icon: 'home', }, }, { id: 'chain', menu: { title: 'Chain', icon: 'link', }, }, { id: 'txpool', menu: { title: 'TxPool', icon: 'credit-card', }, }, { id: 'network', menu: { title: 'Network', icon: 'globe', }, }, { id: 'system', menu: { title: 'System', icon: 'tachometer', }, }, { id: 'logs', menu: { title: 'Logs', icon: 'list', }, }, ]; export type MenuProp = {|...ProvidedMenuProp, id: string|}; // The sidebar menu and the main content are rendered based on these elements. // Using the id is circumstantial in some cases, so it is better to insert it also as a value. // This way the mistyping is prevented. export const MENU: Map = new Map(menuSkeletons.map(({id, menu}) => ([id, {id, ...menu}]))); export const DURATION = 200; export const styles = { light: { color: 'rgba(255, 255, 255, 0.54)', }, }; ================================================ FILE: dashboard/assets/components/Body.jsx ================================================ // @flow // Copyright 2017 The go-sero Authors // This file is part of the go-sero library. // // The go-sero library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-sero library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-sero library. If not, see . import React, {Component} from 'react'; import SideBar from './SideBar'; import Main from './Main'; import type {Content} from '../types/content'; // styles contains the constant styles of the component. const styles = { body: { display: 'flex', width: '100%', height: '92%', }, }; export type Props = { opened: boolean, changeContent: string => void, active: string, content: Content, shouldUpdate: Object, send: string => void, }; // Body renders the body of the dashboard. class Body extends Component { render() { return (
); } } export default Body; ================================================ FILE: dashboard/assets/components/ChartRow.jsx ================================================ // @flow // Copyright 2018 The go-sero Authors // This file is part of the go-sero library. // // The go-sero library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-sero library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-sero library. If not, see . import React, {Component} from 'react'; import type {ChildrenArray} from 'react'; import Grid from 'material-ui/Grid'; // styles contains the constant styles of the component. const styles = { container: { flexWrap: 'nowrap', height: '100%', maxWidth: '100%', margin: 0, }, item: { flex: 1, padding: 0, }, } export type Props = { children: ChildrenArray>, }; // ChartRow renders a row of equally sized responsive charts. class ChartRow extends Component { render() { return ( {React.Children.map(this.props.children, child => ( {child} ))} ); } } export default ChartRow; ================================================ FILE: dashboard/assets/components/CustomTooltip.jsx ================================================ // @flow // Copyright 2018 The go-sero Authors // This file is part of the go-sero library. // // The go-sero library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-sero library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-sero library. If not, see . import React, {Component} from 'react'; import Typography from 'material-ui/Typography'; import {styles} from '../common'; // multiplier multiplies a number by another. export const multiplier = (by: number = 1) => (x: number) => x * by; // percentPlotter renders a tooltip, which displays the value of the payload followed by a percent sign. export const percentPlotter = (text: string, mapper: (T => T) = multiplier(1)) => (payload: T) => { const p = mapper(payload); if (typeof p !== 'number') { return null; } return ( {text} {p.toFixed(2)} % ); }; // unit contains the units for the bytePlotter. const unit = ['', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi', 'Yi']; // simplifyBytes returns the simplified version of the given value followed by the unit. const simplifyBytes = (x: number) => { let i = 0; for (; x > 1024 && i < 8; i++) { x /= 1024; } return x.toFixed(2).toString().concat(' ', unit[i], 'B'); }; // bytePlotter renders a tooltip, which displays the payload as a byte value. export const bytePlotter = (text: string, mapper: (T => T) = multiplier(1)) => (payload: T) => { const p = mapper(payload); if (typeof p !== 'number') { return null; } return ( {text} {simplifyBytes(p)} ); }; // bytePlotter renders a tooltip, which displays the payload as a byte value followed by '/s'. export const bytePerSecPlotter = (text: string, mapper: (T => T) = multiplier(1)) => (payload: T) => { const p = mapper(payload); if (typeof p !== 'number') { return null; } return ( {text} {simplifyBytes(p)}/s ); }; export type Props = { active: boolean, payload: Object, tooltip: (text: string, mapper?: T => T) => (payload: mixed) => null | React$Element, }; // CustomTooltip takes a tooltip function, and uses it to plot the active value of the chart. class CustomTooltip extends Component { render() { const {active, payload, tooltip} = this.props; if (!active || typeof tooltip !== 'function' || !Array.isArray(payload) || payload.length < 1) { return null; } return tooltip(payload[0].value); } } export default CustomTooltip; ================================================ FILE: dashboard/assets/components/Dashboard.jsx ================================================ // @flow // Copyright 2017 The go-sero Authors // This file is part of the go-sero library. // // The go-sero library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-sero library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-sero library. If not, see . import React, {Component} from 'react'; import withStyles from 'material-ui/styles/withStyles'; import Header from './Header'; import Body from './Body'; import {MENU} from '../common'; import type {Content} from '../types/content'; import {inserter as logInserter} from './Logs'; // deepUpdate updates an object corresponding to the given update data, which has // the shape of the same structure as the original object. updater also has the same // structure, except that it contains functions where the original data needs to be // updated. These functions are used to handle the update. // // Since the messages have the same shape as the state content, this approach allows // the generalization of the message handling. The only necessary thing is to set a // handler function for every path of the state in order to maximize the flexibility // of the update. const deepUpdate = (updater: Object, update: Object, prev: Object): $Shape => { if (typeof update === 'undefined') { // TODO (kurkomisi): originally this was deep copy, investigate it. return prev; } if (typeof updater === 'function') { return updater(update, prev); } const updated = {}; Object.keys(prev).forEach((key) => { updated[key] = deepUpdate(updater[key], update[key], prev[key]); }); return updated; }; // shouldUpdate returns the structure of a message. It is used to prevent unnecessary render // method triggerings. In the affected component's shouldComponentUpdate method it can be checked // whether the involved data was changed or not by checking the message structure. // // We could return the message itself too, but it's safer not to give access to it. const shouldUpdate = (updater: Object, msg: Object) => { const su = {}; Object.keys(msg).forEach((key) => { su[key] = typeof updater[key] !== 'function' ? shouldUpdate(updater[key], msg[key]) : true; }); return su; }; // replacer is a state updater function, which replaces the original data. const replacer = (update: T) => update; // appender is a state updater function, which appends the update data to the // existing data. limit defines the maximum allowed size of the created array, // mapper maps the update data. const appender = (limit: number, mapper = replacer) => (update: Array, prev: Array) => [ ...prev, ...update.map(sample => mapper(sample)), ].slice(-limit); // defaultContent returns the initial value of the state content. Needs to be a function in order to // instantiate the object again, because it is used by the state, and isn't automatically cleaned // when a new connection is established. The state is mutated during the update in order to avoid // the execution of unnecessary operations (e.g. copy of the log array). const defaultContent: () => Content = () => ({ general: { version: null, commit: null, }, home: {}, chain: {}, txpool: {}, network: {}, system: { activeMemory: [], virtualMemory: [], networkIngress: [], networkEgress: [], processCPU: [], systemCPU: [], diskRead: [], diskWrite: [], }, logs: { chunks: [], endTop: false, endBottom: true, topChanged: 0, bottomChanged: 0, }, }); // updaters contains the state updater functions for each path of the state. // // TODO (kurkomisi): Define a tricky type which embraces the content and the updaters. const updaters = { general: { version: replacer, commit: replacer, }, home: null, chain: null, txpool: null, network: null, system: { activeMemory: appender(200), virtualMemory: appender(200), networkIngress: appender(200), networkEgress: appender(200), processCPU: appender(200), systemCPU: appender(200), diskRead: appender(200), diskWrite: appender(200), }, logs: logInserter(5), }; // styles contains the constant styles of the component. const styles = { dashboard: { display: 'flex', flexFlow: 'column', width: '100%', height: '100%', zIndex: 1, overflow: 'hidden', }, }; // themeStyles returns the styles generated from the theme for the component. const themeStyles: Object = (theme: Object) => ({ dashboard: { background: theme.palette.background.default, }, }); export type Props = { classes: Object, // injected by withStyles() }; type State = { active: string, // active menu sideBar: boolean, // true if the sidebar is opened content: Content, // the visualized data shouldUpdate: Object, // labels for the components, which need to re-render based on the incoming message server: ?WebSocket, }; // Dashboard is the main component, which renders the whole page, makes connection with the server and // listens for messages. When there is an incoming message, updates the page's content correspondingly. class Dashboard extends Component { constructor(props: Props) { super(props); this.state = { active: MENU.get('home').id, sideBar: true, content: defaultContent(), shouldUpdate: {}, server: null, }; } // componentDidMount initiates the establishment of the first websocket connection after the component is rendered. componentDidMount() { this.reconnect(); } // reconnect establishes a websocket connection with the server, listens for incoming messages // and tries to reconnect on connection loss. reconnect = () => { // PROD is defined by webpack. const server = new WebSocket(`${((window.location.protocol === 'https:') ? 'wss://' : 'ws://')}${PROD ? window.location.host : 'localhost:8080'}/api`); server.onopen = () => { this.setState({content: defaultContent(), shouldUpdate: {}, server}); }; server.onmessage = (event) => { const msg: $Shape = JSON.parse(event.data); if (!msg) { console.error(`Incoming message is ${msg}`); return; } this.update(msg); }; server.onclose = () => { this.setState({server: null}); setTimeout(this.reconnect, 3000); }; }; // send sends a message to the server, which can be accessed only through this function for safety reasons. send = (msg: string) => { if (this.state.server != null) { this.state.server.send(msg); } }; // update updates the content corresponding to the incoming message. update = (msg: $Shape) => { this.setState(prevState => ({ content: deepUpdate(updaters, msg, prevState.content), shouldUpdate: shouldUpdate(updaters, msg), })); }; // changeContent sets the active label, which is used at the content rendering. changeContent = (newActive: string) => { this.setState(prevState => (prevState.active !== newActive ? {active: newActive} : {})); }; // switchSideBar opens or closes the sidebar's state. switchSideBar = () => { this.setState(prevState => ({sideBar: !prevState.sideBar})); }; render() { return (
); } } export default withStyles(themeStyles)(Dashboard); ================================================ FILE: dashboard/assets/components/Footer.jsx ================================================ // @flow // Copyright 2017 The go-sero Authors // This file is part of the go-sero library. // // The go-sero library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-sero library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-sero library. If not, see . import React, {Component} from 'react'; import withStyles from 'material-ui/styles/withStyles'; import Typography from 'material-ui/Typography'; import Grid from 'material-ui/Grid'; import {ResponsiveContainer, AreaChart, Area, Tooltip} from 'recharts'; import ChartRow from './ChartRow'; import CustomTooltip, {bytePlotter, bytePerSecPlotter, percentPlotter, multiplier} from './CustomTooltip'; import {styles as commonStyles} from '../common'; import type {General, System} from '../types/content'; const FOOTER_SYNC_ID = 'footerSyncId'; const CPU = 'cpu'; const MEMORY = 'memory'; const DISK = 'disk'; const TRAFFIC = 'traffic'; const TOP = 'Top'; const BOTTOM = 'Bottom'; // styles contains the constant styles of the component. const styles = { footer: { maxWidth: '100%', flexWrap: 'nowrap', margin: 0, }, chartRowWrapper: { height: '100%', padding: 0, }, doubleChartWrapper: { height: '100%', width: '99%', }, }; // themeStyles returns the styles generated from the theme for the component. const themeStyles: Object = (theme: Object) => ({ footer: { backgroundColor: theme.palette.grey[900], color: theme.palette.getContrastText(theme.palette.grey[900]), zIndex: theme.zIndex.appBar, height: theme.spacing.unit * 10, }, }); export type Props = { classes: Object, // injected by withStyles() theme: Object, general: General, system: System, shouldUpdate: Object, }; // Footer renders the footer of the dashboard. class Footer extends Component { shouldComponentUpdate(nextProps) { return typeof nextProps.shouldUpdate.general !== 'undefined' || typeof nextProps.shouldUpdate.system !== 'undefined'; } // halfHeightChart renders an area chart with half of the height of its parent. halfHeightChart = (chartProps, tooltip, areaProps) => ( {!tooltip || (} />)} ); // doubleChart renders a pair of charts separated by the baseline. doubleChart = (syncId, chartKey, topChart, bottomChart) => { if (!Array.isArray(topChart.data) || !Array.isArray(bottomChart.data)) { return null; } const topDefault = topChart.default || 0; const bottomDefault = bottomChart.default || 0; const topKey = `${chartKey}${TOP}`; const bottomKey = `${chartKey}${BOTTOM}`; const topColor = '#8884d8'; const bottomColor = '#82ca9d'; return (
{this.halfHeightChart( { syncId, data: topChart.data.map(({value}) => ({[topKey]: value || topDefault})), margin: {top: 5, right: 5, bottom: 0, left: 5}, }, topChart.tooltip, {dataKey: topKey, stroke: topColor, fill: topColor}, )} {this.halfHeightChart( { syncId, data: bottomChart.data.map(({value}) => ({[bottomKey]: -value || -bottomDefault})), margin: {top: 0, right: 5, bottom: 5, left: 5}, }, bottomChart.tooltip, {dataKey: bottomKey, stroke: bottomColor, fill: bottomColor}, )}
); }; render() { const {general, system} = this.props; return ( {this.doubleChart( FOOTER_SYNC_ID, CPU, {data: system.processCPU, tooltip: percentPlotter('Process load')}, {data: system.systemCPU, tooltip: percentPlotter('System load', multiplier(-1))}, )} {this.doubleChart( FOOTER_SYNC_ID, MEMORY, {data: system.activeMemory, tooltip: bytePlotter('Active memory')}, {data: system.virtualMemory, tooltip: bytePlotter('Virtual memory', multiplier(-1))}, )} {this.doubleChart( FOOTER_SYNC_ID, DISK, {data: system.diskRead, tooltip: bytePerSecPlotter('Disk read')}, {data: system.diskWrite, tooltip: bytePerSecPlotter('Disk write', multiplier(-1))}, )} {this.doubleChart( FOOTER_SYNC_ID, TRAFFIC, {data: system.networkIngress, tooltip: bytePerSecPlotter('Download')}, {data: system.networkEgress, tooltip: bytePerSecPlotter('Upload', multiplier(-1))}, )} Geth {general.version} {general.commit && ( {'Commit '} {general.commit.substring(0, 8)} )} ); } } export default withStyles(themeStyles)(Footer); ================================================ FILE: dashboard/assets/components/Header.jsx ================================================ // @flow // Copyright 2017 The go-sero Authors // This file is part of the go-sero library. // // The go-sero library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-sero library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-sero library. If not, see . import React, {Component} from 'react'; import withStyles from 'material-ui/styles/withStyles'; import AppBar from 'material-ui/AppBar'; import Toolbar from 'material-ui/Toolbar'; import IconButton from 'material-ui/IconButton'; import Icon from 'material-ui/Icon'; import MenuIcon from 'material-ui-icons/Menu'; import Typography from 'material-ui/Typography'; // styles contains the constant styles of the component. const styles = { header: { height: '8%', }, toolbar: { height: '100%', }, }; // themeStyles returns the styles generated from the theme for the component. const themeStyles = (theme: Object) => ({ header: { backgroundColor: theme.palette.grey[900], color: theme.palette.getContrastText(theme.palette.grey[900]), zIndex: theme.zIndex.appBar, }, toolbar: { paddingLeft: theme.spacing.unit, paddingRight: theme.spacing.unit, }, title: { paddingLeft: theme.spacing.unit, fontSize: 3 * theme.spacing.unit, }, }); export type Props = { classes: Object, // injected by withStyles() switchSideBar: () => void, }; // Header renders the header of the dashboard. class Header extends Component { render() { const {classes} = this.props; return ( Go Ethereum Dashboard ); } } export default withStyles(themeStyles)(Header); ================================================ FILE: dashboard/assets/components/Logs.jsx ================================================ // @flow // Copyright 2018 The go-sero Authors // This file is part of the go-sero library. // // The go-sero library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-sero library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-sero library. If not, see . import React, {Component} from 'react'; import List, {ListItem} from 'material-ui/List'; import escapeHtml from 'escape-html'; import type {Record, Content, LogsMessage, Logs as LogsType} from '../types/content'; // requestBand says how wide is the top/bottom zone, eg. 0.1 means 10% of the container height. const requestBand = 0.05; // fieldPadding is a global map with maximum field value lengths seen until now // to allow padding log contexts in a bit smarter way. const fieldPadding = new Map(); // createChunk creates an HTML formatted object, which displays the given array similarly to // the server side terminal. const createChunk = (records: Array) => { let content = ''; records.forEach((record) => { const {t, ctx} = record; let {lvl, msg} = record; let color = '#ce3c23'; switch (lvl) { case 'trace': case 'trce': lvl = 'TRACE'; color = '#3465a4'; break; case 'debug': case 'dbug': lvl = 'DEBUG'; color = '#3d989b'; break; case 'info': lvl = 'INFO '; color = '#4c8f0f'; break; case 'warn': lvl = 'WARN '; color = '#b79a22'; break; case 'error': case 'eror': lvl = 'ERROR'; color = '#754b70'; break; case 'crit': lvl = 'CRIT '; color = '#ce3c23'; break; default: lvl = ''; } const time = new Date(t); if (lvl === '' || !(time instanceof Date) || isNaN(time) || typeof msg !== 'string' || !Array.isArray(ctx)) { content += 'Invalid log record
'; return; } if (ctx.length > 0) { msg += ' '.repeat(Math.max(40 - msg.length, 0)); } const month = `0${time.getMonth() + 1}`.slice(-2); const date = `0${time.getDate()}`.slice(-2); const hours = `0${time.getHours()}`.slice(-2); const minutes = `0${time.getMinutes()}`.slice(-2); const seconds = `0${time.getSeconds()}`.slice(-2); content += `${lvl}[${month}-${date}|${hours}:${minutes}:${seconds}] ${msg}`; for (let i = 0; i < ctx.length; i += 2) { const key = escapeHtml(ctx[i]); const val = escapeHtml(ctx[i + 1]); let padding = fieldPadding.get(key); if (typeof padding !== 'number' || padding < val.length) { padding = val.length; fieldPadding.set(key, padding); } let p = ''; if (i < ctx.length - 2) { p = ' '.repeat(padding - val.length); } content += ` ${key}=${val}${p}`; } content += '
'; }); return content; }; // ADDED, SAME and REMOVED are used to track the change of the log chunk array. // The scroll position is set using these values. const ADDED = 1; const SAME = 0; const REMOVED = -1; // inserter is a state updater function for the main component, which inserts the new log chunk into the chunk array. // limit is the maximum length of the chunk array, used in order to prevent the browser from OOM. export const inserter = (limit: number) => (update: LogsMessage, prev: LogsType) => { prev.topChanged = SAME; prev.bottomChanged = SAME; if (!Array.isArray(update.chunk) || update.chunk.length < 1) { return prev; } if (!Array.isArray(prev.chunks)) { prev.chunks = []; } const content = createChunk(update.chunk); if (!update.source) { // In case of stream chunk. if (!prev.endBottom) { return prev; } if (prev.chunks.length < 1) { // This should never happen, because the first chunk is always a non-stream chunk. return [{content, name: '00000000000000.log'}]; } prev.chunks[prev.chunks.length - 1].content += content; prev.bottomChanged = ADDED; return prev; } const chunk = { content, name: update.source.name, }; if (prev.chunks.length > 0 && update.source.name < prev.chunks[0].name) { if (update.source.last) { prev.endTop = true; } if (prev.chunks.length >= limit) { prev.endBottom = false; prev.chunks.splice(limit - 1, prev.chunks.length - limit + 1); prev.bottomChanged = REMOVED; } prev.chunks = [chunk, ...prev.chunks]; prev.topChanged = ADDED; return prev; } if (update.source.last) { prev.endBottom = true; } if (prev.chunks.length >= limit) { prev.endTop = false; prev.chunks.splice(0, prev.chunks.length - limit + 1); prev.topChanged = REMOVED; } prev.chunks = [...prev.chunks, chunk]; prev.bottomChanged = ADDED; return prev; }; // styles contains the constant styles of the component. const styles = { logListItem: { padding: 0, lineHeight: 1.231, }, logChunk: { color: 'white', fontFamily: 'monospace', whiteSpace: 'nowrap', width: 0, }, waitMsg: { textAlign: 'center', color: 'white', fontFamily: 'monospace', }, }; export type Props = { container: Object, content: Content, shouldUpdate: Object, send: string => void, }; type State = { requestAllowed: boolean, }; // Logs renders the log page. class Logs extends Component { constructor(props: Props) { super(props); this.content = React.createRef(); this.state = { requestAllowed: true, }; } componentDidMount() { const {container} = this.props; if (typeof container === 'undefined') { return; } container.scrollTop = container.scrollHeight - container.clientHeight; const {logs} = this.props.content; if (typeof this.content === 'undefined' || logs.chunks.length < 1) { return; } if (this.content.clientHeight < container.clientHeight && !logs.endTop) { this.sendRequest(logs.chunks[0].name, true); } } // onScroll is triggered by the parent component's scroll event, and sends requests if the scroll position is // at the top or at the bottom. onScroll = () => { if (!this.state.requestAllowed || typeof this.content === 'undefined') { return; } const {logs} = this.props.content; if (logs.chunks.length < 1) { return; } if (this.atTop() && !logs.endTop) { this.sendRequest(logs.chunks[0].name, true); } else if (this.atBottom() && !logs.endBottom) { this.sendRequest(logs.chunks[logs.chunks.length - 1].name, false); } }; sendRequest = (name: string, past: boolean) => { this.setState({requestAllowed: false}); this.props.send(JSON.stringify({ Logs: { Name: name, Past: past, }, })); }; // atTop checks if the scroll position it at the top of the container. atTop = () => this.props.container.scrollTop <= this.props.container.scrollHeight * requestBand; // atBottom checks if the scroll position it at the bottom of the container. atBottom = () => { const {container} = this.props; return container.scrollHeight - container.scrollTop <= container.clientHeight + container.scrollHeight * requestBand; }; // beforeUpdate is called by the parent component, saves the previous scroll position // and the height of the first log chunk, which can be deleted during the insertion. beforeUpdate = () => { let firstHeight = 0; let chunkList = this.content.children[1]; if (chunkList && chunkList.children[0]) { firstHeight = chunkList.children[0].clientHeight; } return { scrollTop: this.props.container.scrollTop, firstHeight, }; }; // didUpdate is called by the parent component, which provides the container. Sends the first request if the // visible part of the container isn't full, and resets the scroll position in order to avoid jumping when a // chunk is inserted or removed. didUpdate = (prevProps, prevState, snapshot) => { if (typeof this.props.shouldUpdate.logs === 'undefined' || typeof this.content === 'undefined' || snapshot === null) { return; } const {logs} = this.props.content; const {container} = this.props; if (typeof container === 'undefined' || logs.chunks.length < 1) { return; } if (this.content.clientHeight < container.clientHeight) { // Only enters here at the beginning, when there aren't enough logs to fill the container // and the scroll bar doesn't appear. if (!logs.endTop) { this.sendRequest(logs.chunks[0].name, true); } return; } let {scrollTop} = snapshot; if (logs.topChanged === ADDED) { // It would be safer to use a ref to the list, but ref doesn't work well with HOCs. scrollTop += this.content.children[1].children[0].clientHeight; } else if (logs.bottomChanged === ADDED) { if (logs.topChanged === REMOVED) { scrollTop -= snapshot.firstHeight; } else if (this.atBottom() && logs.endBottom) { scrollTop = container.scrollHeight - container.clientHeight; } } container.scrollTop = scrollTop; this.setState({requestAllowed: true}); }; render() { return (
{ this.content = ref; }}>
{this.props.content.logs.endTop ? 'No more logs.' : 'Waiting for server...'}
{this.props.content.logs.chunks.map((c, index) => (
))} {this.props.content.logs.endBottom ||
Waiting for server...
}
); } } export default Logs; ================================================ FILE: dashboard/assets/components/Main.jsx ================================================ // @flow // Copyright 2017 The go-sero Authors // This file is part of the go-sero library. // // The go-sero library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-sero library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-sero library. If not, see . import React, {Component} from 'react'; import withStyles from 'material-ui/styles/withStyles'; import {MENU} from '../common'; import Logs from './Logs'; import Footer from './Footer'; import type {Content} from '../types/content'; // styles contains the constant styles of the component. const styles = { wrapper: { display: 'flex', flexDirection: 'column', width: '100%', }, content: { flex: 1, overflow: 'auto', }, }; // themeStyles returns the styles generated from the theme for the component. const themeStyles = theme => ({ content: { backgroundColor: theme.palette.background.default, padding: theme.spacing.unit * 3, }, }); export type Props = { classes: Object, active: string, content: Content, shouldUpdate: Object, send: string => void, }; // Main renders the chosen content. class Main extends Component { constructor(props) { super(props); this.container = React.createRef(); this.content = React.createRef(); } getSnapshotBeforeUpdate() { if (this.content && typeof this.content.beforeUpdate === 'function') { return this.content.beforeUpdate(); } return null; } componentDidUpdate(prevProps, prevState, snapshot) { if (this.content && typeof this.content.didUpdate === 'function') { this.content.didUpdate(prevProps, prevState, snapshot); } } onScroll = () => { if (this.content && typeof this.content.onScroll === 'function') { this.content.onScroll(); } }; render() { const { classes, active, content, shouldUpdate, } = this.props; let children = null; switch (active) { case MENU.get('home').id: case MENU.get('chain').id: case MENU.get('txpool').id: case MENU.get('network').id: case MENU.get('system').id: children =
Work in progress.
; break; case MENU.get('logs').id: children = ( { this.content = ref; }} container={this.container} send={this.props.send} content={this.props.content} shouldUpdate={shouldUpdate} /> ); } return (
{ this.container = ref; }} onScroll={this.onScroll} > {children}
); } } export default withStyles(themeStyles)(Main); ================================================ FILE: dashboard/assets/components/SideBar.jsx ================================================ // @flow // Copyright 2017 The go-sero Authors // This file is part of the go-sero library. // // The go-sero library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-sero library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-sero library. If not, see . import React, {Component} from 'react'; import withStyles from 'material-ui/styles/withStyles'; import List, {ListItem, ListItemIcon, ListItemText} from 'material-ui/List'; import Icon from 'material-ui/Icon'; import Transition from 'react-transition-group/Transition'; import {Icon as FontAwesome} from 'react-fa'; import {MENU, DURATION} from '../common'; // styles contains the constant styles of the component. const styles = { menu: { default: { transition: `margin-left ${DURATION}ms`, }, transition: { entered: {marginLeft: -200}, }, }, }; // themeStyles returns the styles generated from the theme for the component. const themeStyles = theme => ({ list: { background: theme.palette.grey[900], }, listItem: { minWidth: theme.spacing.unit * 7, }, icon: { fontSize: theme.spacing.unit * 3, }, }); export type Props = { classes: Object, // injected by withStyles() opened: boolean, changeContent: string => void, }; // SideBar renders the sidebar of the dashboard. class SideBar extends Component { shouldComponentUpdate(nextProps) { return nextProps.opened !== this.props.opened; } // clickOn returns a click event handler function for the given menu item. clickOn = menu => (event) => { event.preventDefault(); this.props.changeContent(menu); }; // menuItems returns the menu items corresponding to the sidebar state. menuItems = (transitionState) => { const {classes} = this.props; const children = []; MENU.forEach((menu) => { children.push(( )); }); return children; }; // menu renders the list of the menu items. menu = (transitionState: Object) => (
{this.menuItems(transitionState)}
); render() { return ( {this.menu} ); } } export default withStyles(themeStyles)(SideBar); ================================================ FILE: dashboard/assets/fa-only-woff-loader.js ================================================ // Copyright 2017 The go-sero Authors // This file is part of the go-sero library. // // The go-sero library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-sero library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-sero library. If not, see . // fa-only-woff-loader removes the .eot, .ttf, .svg dependencies of the FontAwesome library, // because they produce unused extra blobs. module.exports = function(content) { return content .replace(/src.*url(?!.*url.*(\.eot)).*(\.eot)[^;]*;/,'') .replace(/url(?!.*url.*(\.eot)).*(\.eot)[^,]*,/,'') .replace(/url(?!.*url.*(\.ttf)).*(\.ttf)[^,]*,/,'') .replace(/,[^,]*url(?!.*url.*(\.svg)).*(\.svg)[^;]*;/,';'); }; ================================================ FILE: dashboard/assets/index.html ================================================ Go Ethereum Dashboard
================================================ FILE: dashboard/assets/index.jsx ================================================ // @flow // Copyright 2017 The go-sero Authors // This file is part of the go-sero library. // // The go-sero library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-sero library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-sero library. If not, see . import React from 'react'; import {render} from 'react-dom'; import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; import createMuiTheme from 'material-ui/styles/createMuiTheme'; import Dashboard from './components/Dashboard'; const theme: Object = createMuiTheme({ palette: { type: 'dark', }, }); const dashboard = document.getElementById('dashboard'); if (dashboard) { // Renders the whole dashboard. render( , dashboard, ); } ================================================ FILE: dashboard/assets/package.json ================================================ { "dependencies": { "babel-core": "^6.26.0", "babel-eslint": "^8.2.1", "babel-loader": "^7.1.2", "babel-plugin-transform-class-properties": "^6.24.1", "babel-plugin-transform-decorators-legacy": "^1.3.4", "babel-plugin-transform-flow-strip-types": "^6.22.0", "babel-plugin-transform-runtime": "^6.23.0", "babel-preset-env": "^1.6.1", "babel-preset-react": "^6.24.1", "babel-preset-stage-0": "^6.24.1", "babel-runtime": "^6.26.0", "classnames": "^2.2.5", "css-loader": "^0.28.9", "escape-html": "^1.0.3", "eslint": "^4.16.0", "eslint-config-airbnb": "^16.1.0", "eslint-loader": "^2.0.0", "eslint-plugin-flowtype": "^2.41.0", "eslint-plugin-import": "^2.8.0", "eslint-plugin-jsx-a11y": "^6.0.3", "eslint-plugin-react": "^7.5.1", "file-loader": "^1.1.6", "flow-bin": "^0.63.1", "flow-bin-loader": "^1.0.2", "flow-typed": "^2.2.3", "material-ui": "^1.0.0-beta.30", "material-ui-icons": "^1.0.0-beta.17", "path": "^0.12.7", "react": "^16.2.0", "react-dom": "^16.2.0", "react-fa": "^5.0.0", "react-transition-group": "^2.2.1", "recharts": "^1.0.0-beta.9", "style-loader": "^0.19.1", "url": "^0.11.0", "url-loader": "^0.6.2", "webpack": "^3.10.0", "webpack-dev-server": "^2.11.1" }, "scripts": { "build": "NODE_ENV=production webpack", "stats": "webpack --profile --json > stats.json", "dev": "webpack-dev-server --port 8081", "flow": "flow-typed install" } } ================================================ FILE: dashboard/assets/types/content.jsx ================================================ // @flow // Copyright 2017 The go-sero Authors // This file is part of the go-sero library. // // The go-sero library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-sero library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-sero library. If not, see . export type Content = { general: General, home: Home, chain: Chain, txpool: TxPool, network: Network, system: System, logs: Logs, }; export type ChartEntries = Array; export type ChartEntry = { time: Date, value: number, }; export type General = { version: ?string, commit: ?string, }; export type Home = { /* TODO (kurkomisi) */ }; export type Chain = { /* TODO (kurkomisi) */ }; export type TxPool = { /* TODO (kurkomisi) */ }; export type Network = { /* TODO (kurkomisi) */ }; export type System = { activeMemory: ChartEntries, virtualMemory: ChartEntries, networkIngress: ChartEntries, networkEgress: ChartEntries, processCPU: ChartEntries, systemCPU: ChartEntries, diskRead: ChartEntries, diskWrite: ChartEntries, }; export type Record = { t: string, lvl: Object, msg: string, ctx: Array }; export type Chunk = { content: string, name: string, }; export type Logs = { chunks: Array, endTop: boolean, endBottom: boolean, topChanged: number, bottomChanged: number, }; export type LogsMessage = { source: ?LogFile, chunk: Array, }; export type LogFile = { name: string, last: string, }; ================================================ FILE: dashboard/assets/webpack.config.js ================================================ // Copyright 2017 The go-sero Authors // This file is part of the go-sero library. // // The go-sero library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-sero library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-sero library. If not, see . const webpack = require('webpack'); const path = require('path'); module.exports = { resolve: { extensions: ['.js', '.jsx'], }, entry: './index', output: { path: path.resolve(__dirname, ''), filename: 'bundle.js', }, plugins: [ new webpack.optimize.UglifyJsPlugin({ comments: false, mangle: false, beautify: true, }), new webpack.DefinePlugin({ PROD: process.env.NODE_ENV === 'production', }), ], module: { rules: [ { test: /\.jsx$/, // regexp for JSX files exclude: /node_modules/, use: [ // order: from bottom to top { loader: 'babel-loader', options: { plugins: [ // order: from top to bottom // 'transform-decorators-legacy', // @withStyles, @withTheme 'transform-class-properties', // static defaultProps 'transform-flow-strip-types', ], presets: [ // order: from bottom to top 'env', 'react', 'stage-0', ], }, }, // 'eslint-loader', // show errors not only in the editor, but also in the console ], }, { test: /font-awesome\.css$/, use: [ 'style-loader', 'css-loader', path.resolve(__dirname, './fa-only-woff-loader.js'), ], }, { test: /\.woff2?$/, // font-awesome icons use: 'url-loader', }, ], }, }; ================================================ FILE: dashboard/assets.go ================================================ // Code generated by go-bindata. DO NOT EDIT. // sources: // assets/index.html // assets/bundle.js package dashboard import ( "crypto/sha256" "fmt" "io/ioutil" "os" "path/filepath" "strings" "time" ) type asset struct { bytes []byte info os.FileInfo digest [sha256.Size]byte } type bindataFileInfo struct { name string size int64 mode os.FileMode modTime time.Time } func (fi bindataFileInfo) Name() string { return fi.name } func (fi bindataFileInfo) Size() int64 { return fi.size } func (fi bindataFileInfo) Mode() os.FileMode { return fi.mode } func (fi bindataFileInfo) ModTime() time.Time { return fi.modTime } func (fi bindataFileInfo) IsDir() bool { return false } func (fi bindataFileInfo) Sys() interface{} { return nil } //nolint:misspell var _indexHtml = []byte(` Go Ethereum Dashboard
`) func indexHtmlBytes() ([]byte, error) { return _indexHtml, nil } func indexHtml() (*asset, error) { bytes, err := indexHtmlBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "index.html", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x22, 0xc8, 0x3d, 0x86, 0x2f, 0xb4, 0x6a, 0x1f, 0xda, 0xd, 0x54, 0x14, 0xa3, 0x6e, 0x80, 0x56, 0x28, 0xea, 0x44, 0xcf, 0xf5, 0xf2, 0xe, 0xad, 0x19, 0xf5, 0x93, 0xd6, 0x8d, 0x6d, 0x2f, 0x35}} return a, nil } //nolint:misspell var _bundleJs = []byte((((((((((`!function(modules) { function __webpack_require__(moduleId) { if (installedModules[moduleId]) return installedModules[moduleId].exports; var module = installedModules[moduleId] = { i: moduleId, l: !1, exports: {} }; return modules[moduleId].call(module.exports, module, module.exports, __webpack_require__), module.l = !0, module.exports; } var installedModules = {}; __webpack_require__.m = modules, __webpack_require__.c = installedModules, __webpack_require__.d = function(exports, name, getter) { __webpack_require__.o(exports, name) || Object.defineProperty(exports, name, { configurable: !1, enumerable: !0, get: getter }); }, __webpack_require__.n = function(module) { var getter = module && module.__esModule ? function() { return module.default; } : function() { return module; }; return __webpack_require__.d(getter, "a", getter), getter; }, __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }, __webpack_require__.p = "", __webpack_require__(__webpack_require__.s = 375); }([ function(module, exports, __webpack_require__) { "use strict"; (function(process) { "production" === process.env.NODE_ENV ? module.exports = __webpack_require__(376) : module.exports = __webpack_require__(377); }).call(exports, __webpack_require__(2)); }, function(module, exports, __webpack_require__) { (function(process) { if ("production" !== process.env.NODE_ENV) { var REACT_ELEMENT_TYPE = "function" == typeof Symbol && Symbol.for && Symbol.for("react.element") || 60103, isValidElement = function(object) { return "object" == typeof object && null !== object && object.$$typeof === REACT_ELEMENT_TYPE; }; module.exports = __webpack_require__(418)(isValidElement, !0); } else module.exports = __webpack_require__(419)(); }).call(exports, __webpack_require__(2)); }, function(module, exports) { function defaultSetTimout() { throw new Error("setTimeout has not been defined"); } function defaultClearTimeout() { throw new Error("clearTimeout has not been defined"); } function runTimeout(fun) { if (cachedSetTimeout === setTimeout) return setTimeout(fun, 0); if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) return cachedSetTimeout = setTimeout, setTimeout(fun, 0); try { return cachedSetTimeout(fun, 0); } catch (e) { try { return cachedSetTimeout.call(null, fun, 0); } catch (e) { return cachedSetTimeout.call(this, fun, 0); } } } function runClearTimeout(marker) { if (cachedClearTimeout === clearTimeout) return clearTimeout(marker); if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) return cachedClearTimeout = clearTimeout, clearTimeout(marker); try { return cachedClearTimeout(marker); } catch (e) { try { return cachedClearTimeout.call(null, marker); } catch (e) { return cachedClearTimeout.call(this, marker); } } } function cleanUpNextTick() { draining && currentQueue && (draining = !1, currentQueue.length ? queue = currentQueue.concat(queue) : queueIndex = -1, queue.length && drainQueue()); } function drainQueue() { if (!draining) { var timeout = runTimeout(cleanUpNextTick); draining = !0; for (var len = queue.length; len; ) { for (currentQueue = queue, queue = []; ++queueIndex < len; ) currentQueue && currentQueue[queueIndex].run(); queueIndex = -1, len = queue.length; } currentQueue = null, draining = !1, runClearTimeout(timeout); } } function Item(fun, array) { this.fun = fun, this.array = array; } function noop() {} var cachedSetTimeout, cachedClearTimeout, process = module.exports = {}; !function() { try { cachedSetTimeout = "function" == typeof setTimeout ? setTimeout : defaultSetTimout; } catch (e) { cachedSetTimeout = defaultSetTimout; } try { cachedClearTimeout = "function" == typeof clearTimeout ? clearTimeout : defaultClearTimeout; } catch (e) { cachedClearTimeout = defaultClearTimeout; } }(); var currentQueue, queue = [], draining = !1, queueIndex = -1; process.nextTick = function(fun) { var args = new Array(arguments.length - 1); if (arguments.length > 1) for (var i = 1; i < arguments.length; i++) args[i - 1] = arguments[i]; queue.push(new Item(fun, args)), 1 !== queue.length || draining || runTimeout(drainQueue); }, Item.prototype.run = function() { this.fun.apply(null, this.array); }, process.title = "browser", process.browser = !0, process.env = {}, process.argv = [], process.version = "", process.versions = {}, process.on = noop, process.addListener = noop, process.once = noop, process.off = noop, process.removeListener = noop, process.removeAllListeners = noop, process.emit = noop, process.prependListener = noop, process.prependOnceListener = noop, process.listeners = function(name) { return []; }, process.binding = function(name) { throw new Error("process.binding is not supported"); }, process.cwd = function() { return "/"; }, process.chdir = function(dir) { throw new Error("process.chdir is not supported"); }, process.umask = function() { return 0; }; }, function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__; !function() { "use strict"; function classNames() { for (var classes = [], i = 0; i < arguments.length; i++) { var arg = arguments[i]; if (arg) { var argType = typeof arg; if ("string" === argType || "number" === argType) classes.push(arg); else if (Array.isArray(arg)) classes.push(classNames.apply(null, arg)); else if ("object" === argType) for (var key in arg) hasOwn.call(arg, key) && arg[key] && classes.push(key); } } return classes.join(" "); } var hasOwn = {}.hasOwnProperty; void 0 !== module && module.exports ? module.exports = classNames : (__WEBPACK_AMD_DEFINE_ARRAY__ = [], void 0 !== (__WEBPACK_AMD_DEFINE_RESULT__ = function() { return classNames; }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); }(); }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } return Array.from(arr); } function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]); return target; } __webpack_require__.d(__webpack_exports__, "c", function() { return PRESENTATION_ATTRIBUTES; }), __webpack_require__.d(__webpack_exports__, "a", function() { return EVENT_ATTRIBUTES; }), __webpack_require__.d(__webpack_exports__, "d", function() { return SCALE_TYPES; }), __webpack_require__.d(__webpack_exports__, "b", function() { return LEGEND_TYPES; }), __webpack_require__.d(__webpack_exports__, "j", function() { return getDisplayName; }), __webpack_require__.d(__webpack_exports__, "h", function() { return findAllByType; }), __webpack_require__.d(__webpack_exports__, "i", function() { return findChildByType; }), __webpack_require__.d(__webpack_exports__, "k", function() { return getPresentationAttributes; }), __webpack_require__.d(__webpack_exports__, "e", function() { return filterEventAttributes; }), __webpack_require__.d(__webpack_exports__, "f", function() { return filterEventsOfChild; }), __webpack_require__.d(__webpack_exports__, "q", function() { return validateWidthHeight; }), __webpack_require__.d(__webpack_exports__, "n", function() { return isSsr; }), __webpack_require__.d(__webpack_exports__, "g", function() { return filterSvgElements; }), __webpack_require__.d(__webpack_exports__, "m", function() { return isChildrenEqual; }), __webpack_require__.d(__webpack_exports__, "p", function() { return renderByOrder; }), __webpack_require__.d(__webpack_exports__, "l", function() { return getReactEventByType; }), __webpack_require__.d(__webpack_exports__, "o", function() { return parseChildIndex; }); var __WEBPACK_IMPORTED_MODULE_0_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_1_lodash_isString__ = __webpack_require__(173), __WEBPACK_IMPORTED_MODULE_1_lodash_isString___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isString__), __WEBPACK_IMPORTED_MODULE_2_lodash_isObject__ = __webpack_require__(32), __WEBPACK_IMPORTED_MODULE_2_lodash_isObject___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isObject__), __WEBPACK_IMPORTED_MODULE_3_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_3_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_4_lodash_isArray__ = __webpack_require__(13), __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_5_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_5_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_react__), __WEBPACK_IMPORTED_MODULE_6_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_6_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_prop_types__), __WEBPACK_IMPORTED_MODULE_7__DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_8__PureRender__ = __webpack_require__(5), PRESENTATION_ATTRIBUTES = { alignmentBaseline: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, angle: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, baselineShift: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, clip: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, clipPath: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, clipRule: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, color: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, colorInterpolation: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, colorInterpolationFilters: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, colorProfile: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, colorRendering: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, cursor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, direction: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "ltr", "rtl", "inherit" ]), display: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, dominantBaseline: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, enableBackground: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, fill: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, fillOpacity: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number ]), fillRule: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "nonzero", "evenodd", "inherit" ]), filter: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, floodColor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, floodOpacity: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number ]), font: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, fontFamily: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, fontSize: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), fontSizeAdjust: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), fontStretch: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "normal", "wider", "narrower", "ultra-condensed", "extra-condensed", "condensed", "semi-condensed", "semi-expanded", "expanded", "extra-expanded", "ultra-expanded", "inherit" ]), fontStyle: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "normal", "italic", "oblique", "inherit" ]), fontVariant: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "normal", "small-caps", "inherit" ]), fontWeight: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "normal", "bold", "bolder", "lighter", 100, 200, 300, 400, 500, 600, 700, 800, 900, "inherit" ]), glyphOrientationHorizontal: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, glyphOrientationVertical: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, imageRendering: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "auto", "optimizeSpeed", "optimizeQuality", "inherit" ]), kerning: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), letterSpacing: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), lightingColor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, markerEnd: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, markerMid: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, markerStart: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, mask: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, opacity: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), overflow: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "visible", "hidden", "scroll", "auto", "inherit" ]), pointerEvents: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "visiblePainted", "visibleFill", "visibleStroke", "visible", "painted", "fill", "stroke", "all", "none", "inherit" ]), shapeRendering: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "auto", "optimizeSpeed", "crispEdges", "geometricPrecision", "inherit" ]), stopColor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, stopOpacity: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), stroke: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), strokeDasharray: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, strokeDashoffset: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), strokeLinecap: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "butt", "round", "square", "inherit" ]), strokeLinejoin: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "miter", "round", "bevel", "inherit" ]), strokeMiterlimit: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), strokeOpacity: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), strokeWidth: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), textAnchor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "start", "middle", "end", "inherit" ]), textDecoration: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "none", "underline", "overline", "line-through", "blink", "inherit" ]), textRendering: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "auto", "optimizeSpeed", "optimizeLegibility", "geometricPrecision", "inherit" ]), unicodeBidi: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "normal", "embed", "bidi-override", "inherit" ]), visibility: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "visible", "hidden", "collapse", "inherit" ]), wordSpacing: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), writingMode: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "lr-tb", "rl-tb", "tb-rl", "lr", "rl", "tb", "inherit" ]), transform: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, style: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object, width: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, height: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, dx: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, dy: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, x: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, y: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, r: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, radius: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.array ]) }, EVENT_ATTRIBUTES = { onClick: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, onMouseDown: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, onMouseUp: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, onMouseOver: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, onMouseMove: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, onMouseOut: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, onMouseEnter: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, onMouseLeave: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, onTouchEnd: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, onTouchMove: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, onTouchStart: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, onTouchCancel: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func }, REACT_BROWSER_EVENT_MAP = { click: "onClick", mousedown: "onMouseDown", mouseup: "onMouseUp", mouseover: "onMouseOver", mousemove: "onMouseMove", mouseout: "onMouseOut", mouseenter: "onMouseEnter", mouseleave: "onMouseLeave", touchcancel: "onTouchCancel", touchend: "onTouchEnd", touchmove: "onTouchMove", touchstart: "onTouchStart" }, SCALE_TYPES = [ "auto", "linear", "pow", "sqrt", "log", "identity", "time", "band", "point", "ordinal", "quantile", "quantize", "utcTime", "sequential", "threshold" ], LEGEND_TYPES = [ "plainline", "line", "square", "rect", "circle", "cross", "diamond", "star", "triangle", "wye", "none" ], getDisplayName = function(Comp) { return Comp ? "string" == typeof Comp ? Comp : Comp.displayName || Comp.name || "Component" : ""; }, findAllByType = function(children, type) { var result = [], types = []; return types = __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(type) ? type.map(function(t) { return getDisplayName(t); }) : [ getDisplayName(type) ], __WEBPACK_IMPORTED_MODULE_5_react___default.a.Children.forEach(children, function(child) { var childType = child && child.type && (child.type.displayName || child.type.name); -1 !== types.indexOf(childType) && result.push(child); }), result; }, findChildByType = function(children, type) { var result = findAllByType(children, type); return result && result[0]; }, getPresentationAttributes = function(el) { if (!el || __WEBPACK_IMPORTED_MODULE_3_lodash_isFunction___default()(el)) return null; var props = __WEBPACK_IMPORTED_MODULE_5_react___default.a.isValidElement(el) ? el.props : el; if (!__WEBPACK_IMPORTED_MODULE_2_lodash_isObject___default()(props)) return null; var out = null; for (var i in props) ({}).hasOwnProperty.call(props, i) && PRESENTATION_ATTRIBUTES[i] && (out || (out = {}), out[i] = props[i]); return out; }, getEventHandlerOfElement = function(originalHandler, props) { return function(e) { return originalHandler(props, e), null; }; }, filterEventAttributes = function(el, newHandler) { var wrapCallback = arguments.length > 2 && void 0 !== arguments[2] && arguments[2]; if (!el || __WEBPACK_IMPORTED_MODULE_3_lodash_isFunction___default()(el)) return null; var props = __WEBPACK_IMPORTED_MODULE_5_react___default.a.isValidElement(el) ? el.props : el; if (!__WEBPACK_IMPORTED_MODULE_2_lodash_isObject___default()(props)) return null; var out = null; for (var i in props) ({}).hasOwnProperty.call(props, i) && EVENT_ATTRIBUTES[i] && (out || (out = {}), out[i] = newHandler || (wrapCallback ? getEventHandlerOfElement(props[i], props) : props[i])); return out; }, getEventHandlerOfChild = function(originalHandler, data, index) { return function(e) { return originalHandler(data, index, e), null; }; }, filterEventsOfChild = function(props, data, index) { if (!__WEBPACK_IMPORTED_MODULE_2_lodash_isObject___default()(props)) return null; var out = null; for (var i in props) ({}).hasOwnProperty.call(props, i) && EVENT_ATTRIBUTES[i] && __WEBPACK_IMPORTED_MODULE_3_lodash_isFunction___default()(props[i]) && (out || (out = {}), out[i] = getEventHandlerOfChild(props[i], data, index)); return out; }, validateWidthHeight = function(el) { if (!el || !el.props) return !1; var _el$props = el.props, width = _el$props.width, height = _el$props.height; return !(!Object(__WEBPACK_IMPORTED_MODULE_7__DataUtils__.h)(width) || width <= 0 || !Object(__WEBPACK_IMPORTED_MODULE_7__DataUtils__.h)(height) || height <= 0); }, isSsr = function() { return !("undefined" != typeof window && window.document && window.document.createElement && window.setTimeout); }, SVG_TAGS = [ "a", "altGlyph", "altGlyphDef", "altGlyphItem", "animate", "animateColor", "animateMotion", "animateTransform", "circle", "clipPath", "color-profile", "cursor", "defs", "desc", "ellipse", "feBlend", "feColormatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDistantLight", "feFlood", "feFuncA", "feFuncB", "feFuncG", "feFuncR", "feGaussianBlur", "feImage", "feMerge", "feMergeNode", "feMorphology", "feOffset", "fePointLight", "feSpecularLighting", "feSpotLight", "feTile", "feTurbulence", "filter", "font", "font-face", "font-face-format", "font-face-name", "font-face-url", "foreignObject", "g", "glyph", "glyphRef", "hkern", "image", "line", "lineGradient", "marker", "mask", "metadata", "missing-glyph", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tref", "tspan", "use", "view", "vkern" ], isSvgElement = function(child) { return child && child.type && __WEBPACK_IMPORTED_MODULE_1_lodash_isString___default()(child.type) && SVG_TAGS.indexOf(child.type) >= 0; }, filterSvgElements = function(children) { var svgElements = []; return __WEBPACK_IMPORTED_MODULE_5_react___default.a.Children.forEach(children, function(entry) { entry && entry.type && __WEBPACK_IMPORTED_MODULE_1_lodash_isString___default()(entry.type) && SVG_TAGS.indexOf(entry.type) >= 0 && svgElements.push(entry); }), svgElements; }, isSingleChildEqual = function(nextChild, prevChild) { if (__WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(nextChild) && __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(prevChild)) return !0; if (!__WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(nextChild) && !__WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(prevChild)) { var _ref = nextChild.props || {}, nextChildren = _ref.children, nextProps = _objectWithoutProperties(_ref, [ "children" ]), _ref2 = prevChild.props || {}, prevChildren = _ref2.children, prevProps = _objectWithoutProperties(_ref2, [ "children" ]); return nextChildren && prevChildren ? Object(__WEBPACK_IMPORTED_MODULE_8__PureRender__.b)(nextProps, prevProps) && isChildrenEqual(nextChildren, prevChildren) : !nextChildren && !prevChildren && Object(__WEBPACK_IMPORTED_MODULE_8__PureRender__.b)(nextProps, prevProps); } return !1; }, isChildrenEqual = function isChildrenEqual(nextChildren, prevChildren) { if (nextChildren === prevChildren) return !0; if (__WEBPACK_IMPORTED_MODULE_5_react__.Children.count(nextChildren) !== __WEBPACK_IMPORTED_MODULE_5_react__.Children.count(prevChildren)) return !1; var count = __WEBPACK_IMPORTED_MODULE_5_react__.Children.count(nextChildren); if (0 === count) return !0; if (1 === count) return isSingleChildEqual(__WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(nextChildren) ? nextChildren[0] : nextChildren, __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(prevChildren) ? prevChildren[0] : prevChildren); for (var i = 0; i < count; i++) { var nextChild = nextChildren[i], prevChild = prevChildren[i]; if (__WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(nextChild) || __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(prevChild)) { if (!isChildrenEqual(nextChild, prevChild)) return !1; } else if (!isSingleChildEqual(nextChild, prevChild)) return !1; } return !0; }, renderByOrder = function(children, renderMap) { var elements = [], record = {}; return __WEBPACK_IMPORTED_MODULE_5_react__.Children.forEach(children, function(child, index) { if (child && isSvgElement(child)) elements.push(child); else if (child && renderMap[getDisplayName(child.type)]) { var displayName = getDisplayName(child.type), _renderMap$displayNam = renderMap[displayName], handler = _renderMap$displayNam.handler, once = _renderMap$displayNam.once; if (once && !record[displayName] || !once) { var results = handler(child, displayName, index); __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(results) ? elements = [ elements ].concat(_toConsumableArray(results)) : elements.push(results), record[displayName] = !0; } } }), elements; }, getReactEventByType = function(e) { var type = e && e.type; return type && REACT_BROWSER_EVENT_MAP[type] ? REACT_BROWSER_EVENT_MAP[type] : null; }, parseChildIndex = function(child, children) { var result = -1; return __WEBPACK_IMPORTED_MODULE_5_react__.Children.forEach(children, function(entry, index) { entry === child && (result = index); }), result; }; }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; function shallowEqual(a, b) { for (var key in a) if ({}.hasOwnProperty.call(a, key) && (!{}.hasOwnProperty.call(b, key) || a[key] !== b[key])) return !1; for (var _key in b) if ({}.hasOwnProperty.call(b, _key) && !{}.hasOwnProperty.call(a, _key)) return !1; return !0; } function shouldComponentUpdate(props, state) { return !shallowEqual(props, this.props) || !shallowEqual(state, this.state); } function pureRenderDecorator(component) { component.prototype.shouldComponentUpdate = shouldComponentUpdate; } __webpack_exports__.b = shallowEqual, __webpack_exports__.a = pureRenderDecorator; }, function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = !0; var _assign = __webpack_require__(222), _assign2 = function(obj) { return obj && obj.__esModule ? obj : { default: obj }; }(_assign); exports.default = _assign2.default || function(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); } return target; }; }, function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = !0, exports.default = function(obj, keys) { var target = {}; for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]); return target; }; }, function(module, exports, __webpack_require__) { function isFunction(value) { if (!isObject(value)) return !1; var tag = baseGetTag(value); return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; } var baseGetTag = __webpack_require__(41), isObject = __webpack_require__(32), asyncTag = "[object AsyncFunction]", funcTag = "[object Function]", genTag = "[object GeneratorFunction]", proxyTag = "[object Proxy]"; module.exports = isFunction; }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.d(__webpack_exports__, "j", function() { return mathSign; }), __webpack_require__.d(__webpack_exports__, "i", function() { return isPercent; }), __webpack_require__.d(__webpack_exports__, "h", function() { return isNumber; }), __webpack_require__.d(__webpack_exports__, "g", function() { return isNumOrStr; }), __webpack_require__.d(__webpack_exports__, "k", function() { return uniqueId; }), __webpack_require__.d(__webpack_exports__, "d", function() { return getPercentValue; }), __webpack_require__.d(__webpack_exports__, "b", function() { return getAnyElementOfObject; }), __webpack_require__.d(__webpack_exports__, "e", function() { return hasDuplicate; }), __webpack_require__.d(__webpack_exports__, "f", function() { return interpolateNumber; }), __webpack_require__.d(__webpack_exports__, "a", function() { return findEntryInArray; }), __webpack_require__.d(__webpack_exports__, "c", function() { return getLinearRegression; }); var __WEBPACK_IMPORTED_MODULE_0_lodash_get__ = __webpack_require__(174), __WEBPACK_IMPORTED_MODULE_0_lodash_get___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_get__), __WEBPACK_IMPORTED_MODULE_1_lodash_isArray__ = __webpack_require__(13), __WEBPACK_IMPORTED_MODULE_1_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN__ = __webpack_require__(120), __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isNaN__), __WEBPACK_IMPORTED_MODULE_3_lodash_isNumber__ = __webpack_require__(272), __WEBPACK_IMPORTED_MODULE_3_lodash_isNumber___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_isNumber__), __WEBPACK_IMPORTED_MODULE_4_lodash_isString__ = __webpack_require__(173), __WEBPACK_IMPORTED_MODULE_4_lodash_isString___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash_isString__), mathSign = function(value) { return 0 === value ? 0 : value > 0 ? 1 : -1; }, isPercent = function(value) { return __WEBPACK_IMPORTED_MODULE_4_lodash_isString___default()(value) && value.indexOf("%") === value.length - 1; }, isNumber = function(value) { return __WEBPACK_IMPORTED_MODULE_3_lodash_isNumber___default()(value) && !__WEBPACK_IMPORTED_MODULE_2_lodash_isNaN___default()(value); }, isNumOrStr = function(value) { return isNumber(value) || __WEBPACK_IMPORTED_MODULE_4_lodash_isString___default()(value); }, idCounter = 0, uniqueId = function(prefix) { var id = ++idCounter; return "" + (prefix || "") + id; }, getPercentValue = function(percent, totalValue) { var defaultValue = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 0, validate = arguments.length > 3 && void 0 !== arguments[3] && arguments[3]; if (!isNumber(percent) && !__WEBPACK_IMPORTED_MODULE_4_lodash_isString___default()(percent)) return defaultValue; var value = void 0; if (isPercent(percent)) { var index = percent.indexOf("%"); value = totalValue * parseFloat(percent.slice(0, index)) / 100; } else value = +percent; return __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN___default()(value) && (value = defaultValue), validate && value > totalValue && (value = totalValue), value; }, getAnyElementOfObject = function(obj) { if (!obj) return null; var keys = Object.keys(obj); return keys && keys.length ? obj[keys[0]] : null; }, hasDuplicate = function(ary) { if (!__WEBPACK_IMPORTED_MODULE_1_lodash_isArray___default()(ary)) return !1; for (var len = ary.length, cache = {}, i = 0; i < len; i++) { if (cache[ary[i]]) return !0; cache[ary[i]] = !0; } return !1; }, interpolateNumber = function(numberA, numberB) { return isNumber(numberA) && isNumber(numberB) ? function(t) { return numberA + t * (numberB - numberA); } : function() { return numberB; }; }, findEntryInArray = function(ary, specifiedKey, specifiedValue) { return ary && ary.length ? ary.find(function(entry) { return entry && __WEBPACK_IMPORTED_MODULE_0_lodash_get___default()(entry, specifiedKey) === specifiedValue; }) : null; }, getLinearRegression = function(data) { if (!data || !data.length) return null; for (var len = data.length, xsum = 0, ysum = 0, xysum = 0, xxsum = 0, xmin = 1 / 0, xmax = -1 / 0, i = 0; i < len; i++) xsum += data[i].cx, ysum += data[i].cy, xysum += data[i].cx * data[i].cy, xxsum += data[i].cx * data[i].cx, xmin = Math.min(xmin, data[i].cx), xmax = Math.max(xmax, data[i].cx); var a = len * xxsum != xsum * xsum ? (len * xysum - xsum * ysum) / (len * xxsum - xsum * xsum) : 0; return { xmin: xmin, xmax: xmax, a: a, b: (ysum - a * xsum) / len }; }; }, function(module, exports, __webpack_require__) { "use strict"; (function(process) { function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function getDefaultTheme() { return defaultTheme || (defaultTheme = (0, _createMuiTheme2.default)()); } Object.defineProperty(exports, "__esModule", { value: !0 }), exports.sheetsManager = void 0; var _keys = __webpack_require__(55), _keys2 = _interopRequireDefault(_keys), _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _getPrototypeOf = __webpack_require__(26), _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf), _classCallCheck2 = __webpack_require__(27), _classCallCheck3 = _interopRequireDefault(_classCallCheck2), _createClass2 = __webpack_require__(28), _createClass3 = _interopRequireDefault(_createClass2), _possibleConstructorReturn2 = __webpack_require__(29), _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2), _inherits2 = __webpack_require__(30), _inherits3 = _interopRequireDefault(_inherits2), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _map = __webpack_require__(440), _map2 = _interopRequireDefault(_map), _minSafeInteger = __webpack_require__(456), _minSafeInteger2 = _interopRequireDefault(_minSafeInteger), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _hoistNonReactStatics = __webpack_require__(162), _hoistNonReactStatics2 = _interopRequireDefault(_hoistNonReactStatics), _getDisplayName = __webpack_require__(244), _getDisplayName2 = _interopRequireDefault(_getDisplayName), _wrapDisplayName = __webpack_require__(79), _wrapDisplayName2 = _interopRequireDefault(_wrapDisplayName), _contextTypes = __webpack_require__(459), _contextTypes2 = _interopRequireDefault(_contextTypes), _jss = __webpack_require__(246), _ns = __webpack_require__(245), ns = function(obj) { if (obj && obj.__esModule) return obj; var newObj = {}; if (null != obj) for (var key in obj) Object.prototype.hasOwnProperty.call(obj, key) && (newObj[key] = obj[key]); return newObj.default = obj, newObj; }(_ns), _jssPreset = __webpack_require__(481), _jssPreset2 = _interopRequireDefault(_jssPreset), _createMuiTheme = __webpack_require__(161), _createMuiTheme2 = _interopRequireDefault(_createMuiTheme), _themeListener = __webpack_require__(160), _themeListener2 = _interopRequireDefault(_themeListener), _createGenerateClassName = __webpack_require__(494), _createGenerateClassName2 = _interopRequireDefault(_createGenerateClassName), _getStylesCreator = __webpack_require__(495), _getStylesCreator2 = _interopRequireDefault(_getStylesCreator), jss = (0, _jss.create)((0, _jssPreset2.default)()), generateClassName = (0, _createGenerateClassName2.default)(), indexCounter = _minSafeInteger2.default, sheetsManager = exports.sheetsManager = new _map2.default(), noopTheme = {}, defaultTheme = void 0, withStyles = function(stylesOrCreator) { var options = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; return function(Component) { var _options$withTheme = options.withTheme, withTheme = void 0 !== _options$withTheme && _options$withTheme, _options$flip = options.flip, flip = void 0 === _options$flip ? null : _options$flip, name = options.name, styleSheetOptions = (0, _objectWithoutProperties3.default)(options, [ "withTheme", "flip", "name" ]), stylesCreator = (0, _getStylesCreator2.default)(stylesOrCreator), listenToTheme = stylesCreator.themingEnabled || withTheme || "string" == typeof name; indexCounter += 1, stylesCreator.options.index = indexCounter, "production" !== process.env.NODE_ENV && (0, _warning2.default)(indexCounter < 0, [ "Material-UI: you might have a memory leak.", "The indexCounter is not supposed to grow that much." ].join(" ")); var WithStyles = function(_React$Component) { function WithStyles(props, context) { (0, _classCallCheck3.default)(this, WithStyles); var _this = (0, _possibleConstructorReturn3.default)(this, (WithStyles.__proto__ || (0, _getPrototypeOf2.default)(WithStyles)).call(this, props, context)); _this.state = {}, _this.disableStylesGeneration = !1, _this.jss = null, _this.sheetOptions = null, _this.sheetsManager = sheetsManager, _this.stylesCreatorSaved = null, _this.theme = null, _this.unsubscribeId = null, _this.jss = _this.context[ns.jss] || jss; var muiThemeProviderOptions = _this.context.muiThemeProviderOptions; return muiThemeProviderOptions && (muiThemeProviderOptions.sheetsManager && (_this.sheetsManager = muiThemeProviderOptions.sheetsManager), _this.disableStylesGeneration = muiThemeProviderOptions.disableStylesGeneration), _this.stylesCreatorSaved = stylesCreator, _this.sheetOptions = (0, _extends3.default)({ generateClassName: generateClassName }, _this.context[ns.sheetOptions]), _this.theme = listenToTheme ? _themeListener2.default.initial(context) || getDefaultTheme() : noopTheme, _this; } return (0, _inherits3.default)(WithStyles, _React$Component), (0, _createClass3.default)(WithStyles, [ { key: "componentWillMount", value: function() { this.attach(this.theme); } }, { key: "componentDidMount", value: function() { var _this2 = this; listenToTheme && (this.unsubscribeId = _themeListener2.default.subscribe(this.context, function(theme) { var oldTheme = _this2.theme; _this2.theme = theme, _this2.attach(_this2.theme), _this2.setState({}, function() { _this2.detach(oldTheme); }); })); } }, { key: "componentWillReceiveProps", value: function() { this.stylesCreatorSaved !== stylesCreator && "production" !== process.env.NODE_ENV && (this.detach(this.theme), this.stylesCreatorSaved = stylesCreator, this.attach(this.theme)); } }, { key: "componentWillUnmount", value: function() { this.detach(this.theme), null !== this.unsubscribeId && _themeListener2.default.unsubscribe(this.context, this.unsubscribeId); } }, { key: "attach", value: function(theme) { if (!this.disableStylesGeneration) { var stylesCreatorSaved = this.stylesCreatorSaved, sheetManager = this.sheetsManager.get(stylesCreatorSaved); sheetManager || (sheetManager = new _map2.default(), this.sheetsManager.set(stylesCreatorSaved, sheetManager)); var sheetManagerTheme = sheetManager.get(theme); if (sheetManagerTheme || (sheetManagerTheme = { refs: 0, sheet: null }, sheetManager.set(theme, sheetManagerTheme)), 0 === sheetManagerTheme.refs) { var styles = stylesCreatorSaved.create(theme, name), meta = name; "production" === process.env.NODE_ENV || meta || (meta = (0, _getDisplayName2.default)(Component)); var sheet = this.jss.createStyleSheet(styles, (0, _extends3.default)({ meta: meta, classNamePrefix: meta, flip: "boolean" == typeof flip ? flip : "rtl" === theme.direction, link: !1 }, this.sheetOptions, stylesCreatorSaved.options, { name: name }, styleSheetOptions)); sheetManagerTheme.sheet = sheet, sheet.attach(); var sheetsRegistry = this.context[ns.sheetsRegistry]; sheetsRegistry && sheetsRegistry.add(sheet); } sheetManagerTheme.refs += 1; } } }, { key: "detach", value: function(theme) { if (!this.disableStylesGeneration) { var stylesCreatorSaved = this.stylesCreatorSaved, sheetManager = this.sheetsManager.get(stylesCreatorSaved), sheetManagerTheme = sheetManager.get(theme); if (sheetManagerTheme.refs -= 1, 0 === sheetManagerTheme.refs) { sheetManager.delete(theme), this.jss.removeStyleSheet(sheetManagerTheme.sheet); var sheetsRegistry = this.context[ns.sheetsRegistry]; sheetsRegistry && sheetsRegistry.remove(sheetManagerTheme.sheet); } } } }, { key: "render", value: function() { var _this3 = this, _props = this.props, classesProp = _props.classes, innerRef = _props.innerRef, other = (0, _objectWithoutProperties3.default)(_props, [ "classes", "innerRef" ]), classes = void 0, renderedClasses = {}; if (!this.disableStylesGeneration) { var sheetManager = this.sheetsManager.get(this.stylesCreatorSaved), sheetsManagerTheme = sheetManager.get(this.theme); renderedClasses = sheetsManagerTheme.sheet.classes; } classes = classesProp ? (0, _extends3.default)({}, renderedClasses, (0, _keys2.default)(classesProp).reduce(function(accumulator, key) { return "production" !== process.env.NODE_ENV && (0, _warning2.default)(renderedClasses[key] || _this3.disableStylesGeneration, [ "Material-UI: the key ` + ("`" + `" + key + "`)) + ("`" + (` provided to the classes property is not implemented in " + (0, _getDisplayName2.default)(Component) + ".", "You can only override one of the following: " + (0, _keys2.default)(renderedClasses).join(",") ].join("\n")), "production" !== process.env.NODE_ENV && (0, _warning2.default)(!classesProp[key] || "string" == typeof classesProp[key], [ "Material-UI: the key ` + "`"))) + ((`" + key + "` + ("`" + ` provided to the classes property is not valid for " + (0, _getDisplayName2.default)(Component) + ".", "You need to provide a non empty string instead of: " + classesProp[key] + "." ].join("\n")), classesProp[key] && (accumulator[key] = renderedClasses[key] + " " + classesProp[key]), accumulator; }, {})) : renderedClasses; var more = {}; return withTheme && (more.theme = this.theme), _react2.default.createElement(Component, (0, _extends3.default)({ classes: classes }, more, other, { ref: innerRef })); } } ]), WithStyles; }(_react2.default.Component); return WithStyles.propTypes = "production" !== process.env.NODE_ENV ? { classes: _propTypes2.default.object, innerRef: _propTypes2.default.func } : {}, WithStyles.contextTypes = (0, _extends3.default)({ muiThemeProviderOptions: _propTypes2.default.object }, _contextTypes2.default, listenToTheme ? _themeListener2.default.contextTypes : {}), "production" !== process.env.NODE_ENV && (WithStyles.displayName = (0, _wrapDisplayName2.default)(Component, "WithStyles")), (0, _hoistNonReactStatics2.default)(WithStyles, Component), "production" !== process.env.NODE_ENV && (WithStyles.Naked = Component, WithStyles.options = options), WithStyles; }; }; exports.default = withStyles; }).call(exports, __webpack_require__(2)); }, function(module, exports, __webpack_require__) { "use strict"; (function(process) { var warning = function() {}; "production" !== process.env.NODE_ENV && (warning = function(condition, format, args) { var len = arguments.length; args = new Array(len > 2 ? len - 2 : 0); for (var key = 2; key < len; key++) args[key - 2] = arguments[key]; if (void 0 === format) throw new Error("`)) + ("`" + (`warning(condition, format, ...args)` + "`")))) + (((` requires a warning message argument"); if (format.length < 10 || /^[s\W]*$/.test(format)) throw new Error("The warning format should be able to uniquely identify this warning. Please, use a more descriptive format than: " + format); if (!condition) { var argIndex = 0, message = "Warning: " + format.replace(/%s/g, function() { return args[argIndex++]; }); "undefined" != typeof console && console.error(message); try { throw new Error(message); } catch (x) {} } }), module.exports = warning; }).call(exports, __webpack_require__(2)); }, function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = !0; var _defineProperty = __webpack_require__(154), _defineProperty2 = function(obj) { return obj && obj.__esModule ? obj : { default: obj }; }(_defineProperty); exports.default = function(obj, key, value) { return key in obj ? (0, _defineProperty2.default)(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }) : obj[key] = value, obj; }; }, function(module, exports) { var isArray = Array.isArray; module.exports = isArray; }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]); return target; } function Layer(props) { var children = props.children, className = props.className, others = _objectWithoutProperties(props, [ "children", "className" ]), layerClass = __WEBPACK_IMPORTED_MODULE_2_classnames___default()("recharts-layer", className); return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("g", _extends({ className: layerClass }, others), children); } var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_2_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_classnames__), _extends = Object.assign || function(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); } return target; }, propTypes = { className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, children: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node), __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node ]) }; Layer.propTypes = propTypes, __webpack_exports__.a = Layer; }, function(module, exports, __webpack_require__) { var global = __webpack_require__(167), core = __webpack_require__(168), hide = __webpack_require__(266), redefine = __webpack_require__(581), ctx = __webpack_require__(584), $export = function(type, name, source) { var key, own, out, exp, IS_FORCED = type & $export.F, IS_GLOBAL = type & $export.G, IS_STATIC = type & $export.S, IS_PROTO = type & $export.P, IS_BIND = type & $export.B, target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {}).prototype, exports = IS_GLOBAL ? core : core[name] || (core[name] = {}), expProto = exports.prototype || (exports.prototype = {}); IS_GLOBAL && (source = name); for (key in source) own = !IS_FORCED && target && void 0 !== target[key], out = (own ? target : source)[key], exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && "function" == typeof out ? ctx(Function.call, out) : out, target && redefine(target, key, out, type & $export.U), exports[key] != out && hide(exports, key, exp), IS_PROTO && expProto[key] != out && (expProto[key] = out); }; global.core = core, $export.F = 1, $export.G = 2, $export.S = 4, $export.P = 8, $export.B = 16, $export.W = 32, $export.U = 64, $export.R = 128, module.exports = $export; }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; function _defineProperty(obj, key, value) { return key in obj ? Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }) : obj[key] = value, obj; } function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } return Array.from(arr); } __webpack_require__.d(__webpack_exports__, "w", function() { return getValueByDataKey; }), __webpack_require__.d(__webpack_exports__, "n", function() { return getDomainOfDataByKey; }), __webpack_require__.d(__webpack_exports__, "b", function() { return calculateActiveTickIndex; }), __webpack_require__.d(__webpack_exports__, "r", function() { return getMainColorOfGraphicItem; }), __webpack_require__.d(__webpack_exports__, "q", function() { return getLegendProps; }), __webpack_require__.d(__webpack_exports__, "i", function() { return getBarSizeList; }), __webpack_require__.d(__webpack_exports__, "h", function() { return getBarPosition; }), __webpack_require__.d(__webpack_exports__, "a", function() { return appendOffsetOfLegend; }), __webpack_require__.d(__webpack_exports__, "z", function() { return parseErrorBarsOfAxis; }), __webpack_require__.d(__webpack_exports__, "o", function() { return getDomainOfItemsWithSameAxis; }), __webpack_require__.d(__webpack_exports__, "x", function() { return isCategorialAxis; }), __webpack_require__.d(__webpack_exports__, "m", function() { return getCoordinatesOfGrid; }), __webpack_require__.d(__webpack_exports__, "u", function() { return getTicksOfAxis; }), __webpack_require__.d(__webpack_exports__, "d", function() { return combineEventHandlers; }), __webpack_require__.d(__webpack_exports__, "A", function() { return parseScale; }), __webpack_require__.d(__webpack_exports__, "c", function() { return checkDomainOfScale; }), __webpack_require__.d(__webpack_exports__, "f", function() { return findPositionOfBar; }), __webpack_require__.d(__webpack_exports__, "C", function() { return truncateByDomain; }), __webpack_require__.d(__webpack_exports__, "s", function() { return getStackGroupsByAxisId; }), __webpack_require__.d(__webpack_exports__, "v", function() { return getTicksOfScale; }), __webpack_require__.d(__webpack_exports__, "l", function() { return getCateCoordinateOfLine; }), __webpack_require__.d(__webpack_exports__, "k", function() { return getCateCoordinateOfBar; }), __webpack_require__.d(__webpack_exports__, "j", function() { return getBaseValueOfBar; }), __webpack_require__.d(__webpack_exports__, "e", function() { return detectReferenceElementsDomain; }), __webpack_require__.d(__webpack_exports__, "t", function() { return getStackedDataOfItem; }), __webpack_require__.d(__webpack_exports__, "p", function() { return getDomainOfStackGroups; }), __webpack_require__.d(__webpack_exports__, "B", function() { return parseSpecifiedDomain; }), __webpack_require__.d(__webpack_exports__, "D", function() { return validateCoordinateInRange; }), __webpack_require__.d(__webpack_exports__, "g", function() { return getBandSizeOfAxis; }), __webpack_require__.d(__webpack_exports__, "y", function() { return parseDomainOfCategoryAxis; }); var __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__ = __webpack_require__(45), __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__), __WEBPACK_IMPORTED_MODULE_1_lodash_sortBy__ = __webpack_require__(321), __WEBPACK_IMPORTED_MODULE_1_lodash_sortBy___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_sortBy__), __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN__ = __webpack_require__(120), __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isNaN__), __WEBPACK_IMPORTED_MODULE_3_lodash_isString__ = __webpack_require__(173), __WEBPACK_IMPORTED_MODULE_3_lodash_isString___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_isString__), __WEBPACK_IMPORTED_MODULE_4_lodash_max__ = __webpack_require__(841), __WEBPACK_IMPORTED_MODULE_4_lodash_max___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash_max__), __WEBPACK_IMPORTED_MODULE_5_lodash_min__ = __webpack_require__(328), __WEBPACK_IMPORTED_MODULE_5_lodash_min___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_lodash_min__), __WEBPACK_IMPORTED_MODULE_6_lodash_isArray__ = __webpack_require__(13), __WEBPACK_IMPORTED_MODULE_6_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_7_lodash_flatMap__ = __webpack_require__(842), __WEBPACK_IMPORTED_MODULE_7_lodash_flatMap___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_7_lodash_flatMap__), __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_8_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_9_lodash_get__ = __webpack_require__(174), __WEBPACK_IMPORTED_MODULE_9_lodash_get___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_9_lodash_get__), __WEBPACK_IMPORTED_MODULE_10_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_10_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_11_recharts_scale__ = __webpack_require__(844), __WEBPACK_IMPORTED_MODULE_12_d3_scale__ = (__webpack_require__.n(__WEBPACK_IMPORTED_MODULE_11_recharts_scale__), __webpack_require__(331)), __WEBPACK_IMPORTED_MODULE_13_d3_shape__ = __webpack_require__(182), __WEBPACK_IMPORTED_MODULE_14__DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_15__cartesian_ReferenceDot__ = __webpack_require__(364), __WEBPACK_IMPORTED_MODULE_16__cartesian_ReferenceLine__ = __webpack_require__(365), __WEBPACK_IMPORTED_MODULE_17__cartesian_ReferenceArea__ = __webpack_require__(366), __WEBPACK_IMPORTED_MODULE_18__cartesian_ErrorBar__ = __webpack_require__(95), __WEBPACK_IMPORTED_MODULE_19__component_Legend__ = __webpack_require__(180), __WEBPACK_IMPORTED_MODULE_20__ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); } return target; }, getValueByDataKey = function(obj, dataKey, defaultValue) { return __WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(obj) || __WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(dataKey) ? defaultValue : Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.g)(dataKey) ? __WEBPACK_IMPORTED_MODULE_9_lodash_get___default()(obj, dataKey, defaultValue) : __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(dataKey) ? dataKey(obj) : defaultValue; }, getDomainOfDataByKey = function(data, key, type, filterNil) { var flattenData = __WEBPACK_IMPORTED_MODULE_7_lodash_flatMap___default()(data, function(entry) { return getValueByDataKey(entry, key); }); if ("number" === type) { var domain = flattenData.filter(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h); return [ Math.min.apply(null, domain), Math.max.apply(null, domain) ]; } return (filterNil ? flattenData.filter(function(entry) { return !__WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(entry); }) : flattenData).map(function(entry) { return Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.g)(entry) ? entry : ""; }); }, calculateActiveTickIndex = function(coordinate, ticks, unsortedTicks, axis) { var index = -1, len = ticks.length; if (len > 1) { if (axis && "angleAxis" === axis.axisType && Math.abs(Math.abs(axis.range[1] - axis.range[0]) - 360) <= 1e-6) for (var range = axis.range, i = 0; i < len; i++) { var before = i > 0 ? unsortedTicks[i - 1].coordinate : unsortedTicks[len - 1].coordinate, cur = unsortedTicks[i].coordinate, after = i >= len - 1 ? unsortedTicks[0].coordinate : unsortedTicks[i + 1].coordinate, sameDirectionCoord = void 0; if (Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.j)(cur - before) !== Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.j)(after - cur)) { var diffInterval = []; if (Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.j)(after - cur) === Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.j)(range[1] - range[0])) { sameDirectionCoord = after; var curInRange = cur + range[1] - range[0]; diffInterval[0] = Math.min(curInRange, (curInRange + before) / 2), diffInterval[1] = Math.max(curInRange, (curInRange + before) / 2); } else { sameDirectionCoord = before; var afterInRange = after + range[1] - range[0]; diffInterval[0] = Math.min(cur, (afterInRange + cur) / 2), diffInterval[1] = Math.max(cur, (afterInRange + cur) / 2); } var sameInterval = [ Math.min(cur, (sameDirectionCoord + cur) / 2), Math.max(cur, (sameDirectionCoord + cur) / 2) ]; if (coordinate > sameInterval[0] && coordinate <= sameInterval[1] || coordinate >= diffInterval[0] && coordinate <= diffInterval[1]) { index = unsortedTicks[i].index; break; } } else { var min = Math.min(before, after), max = Math.max(before, after); if (coordinate > (min + cur) / 2 && coordinate <= (max + cur) / 2) { index = unsortedTicks[i].index; break; } } } else for (var _i = 0; _i < len; _i++) if (0 === _i && coordinate <= (ticks[_i].coordinate + ticks[_i + 1].coordinate) / 2 || _i > 0 && _i < len - 1 && coordinate > (ticks[_i].coordinate + ticks[_i - 1].coordinate) / 2 && coordinate <= (ticks[_i].coordinate + ticks[_i + 1].coordinate) / 2 || _i === len - 1 && coordinate > (ticks[_i].coordinate + ticks[_i - 1].coordinate) / 2) { index = ticks[_i].index; break; } } else index = 0; return index; }, getMainColorOfGraphicItem = function(item) { var displayName = item.type.displayName, result = void 0; switch (displayName) { case "Line": case "Area": case "Radar": result = item.props.stroke; break; default: result = item.props.fill; } return result; }, getLegendProps = function(_ref) { var children = _ref.children, formatedGraphicalItems = _ref.formatedGraphicalItems, legendWidth = _ref.legendWidth, legendContent = _ref.legendContent, legendItem = Object(__WEBPACK_IMPORTED_MODULE_20__ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_19__component_Legend__.a); if (!legendItem) return null; var legendData = void 0; return legendData = legendItem.props && legendItem.props.payload ? legendItem.props && legendItem.props.payload : "children" === legendContent ? (formatedGraphicalItems || []).reduce(function(result, _ref2) { var item = _ref2.item, props = _ref2.props, data = props.sectors || props.data || []; return result.concat(data.map(function(entry) { return { type: legendItem.props.iconType || item.props.legendType, value: entry.name, color: entry.fill, payload: entry }; })); }, []) : (formatedGraphicalItems || []).map(function(_ref3) { var item = _ref3.item, _item$props = item.props, dataKey = _item$props.dataKey, name = _item$props.name, legendType = _item$props.legendType; return { inactive: _item$props.hide, dataKey: dataKey, type: legendItem.props.iconType || legendType || "square", color: getMainColorOfGraphicItem(item), value: name || dataKey, payload: item.props }; }), _extends({}, legendItem.props, __WEBPACK_IMPORTED_MODULE_19__component_Legend__.a.getWithHeight(legendItem, legendWidth), { payload: legendData, item: legendItem }); }, getBarSizeList = function(_ref4) { var globalSize = _ref4.barSize, _ref4$stackGroups = _ref4.stackGroups, stackGroups = void 0 === _ref4$stackGroups ? {} : _ref4$stackGroups; if (!stackGroups) return {}; for (var result = {}, numericAxisIds = Object.keys(stackGroups), i = 0, len = numericAxisIds.length; i < len; i++) for (var sgs = stackGroups[numericAxisIds[i]].stackGroups, stackIds = Object.keys(sgs), j = 0, sLen = stackIds.length; j < sLen; j++) { var _sgs$stackIds$j = sgs[stackIds[j]], items = _sgs$stackIds$j.items, cateAxisId = _sgs$stackIds$j.cateAxisId, barItems = items.filter(function(item) { return Object(__WEBPACK_IMPORTED_MODULE_20__ReactUtils__.j)(item.type).indexOf("Bar") >= 0; }); if (barItems && barItems.length) { var selfSize = barItems[0].props.barSize, cateId = barItems[0].props[cateAxisId]; result[cateId] || (result[cateId] = []), result[cateId].push({ item: barItems[0], stackList: barItems.slice(1), barSize: __WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(selfSize) ? globalSize : selfSize }); } } return result; }, getBarPosition = function(_ref5) { var barGap = _ref5.barGap, barCategoryGap = _ref5.barCategoryGap, bandSize = _ref5.bandSize, _ref5$sizeList = _ref5.sizeList, sizeList = void 0 === _ref5$sizeList ? [] : _ref5$sizeList, maxBarSize = _ref5.maxBarSize, len = sizeList.length; if (len < 1) return null; var realBarGap = Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.d)(barGap, bandSize, 0, !0), result = void 0; if (sizeList[0].barSize === +sizeList[0].barSize) { var useFull = !1, fullBarSize = bandSize / len, sum = sizeList.reduce(function(res, entry) { return res + entry.barSize || 0; }, 0); sum += (len - 1) * realBarGap, sum >= bandSize && (sum -= (len - 1) * realBarGap, realBarGap = 0), sum >= bandSize && fullBarSize > 0 && (useFull = !0, fullBarSize *= .9, sum = len * fullBarSize); var offset = (bandSize - sum) / 2 >> 0, prev = { offset: offset - realBarGap, size: 0 }; result = sizeList.reduce(function(res, entry) { var newRes = [].concat(_toConsumableArray(res), [ { item: entry.item, position: { offset: prev.offset + prev.size + realBarGap, size: useFull ? fullBarSize : entry.barSize } } ]); return prev = newRes[newRes.length - 1].position, entry.stackList && entry.stackList.length && entry.stackList.forEach(function(item) { newRes.push({ item: item, position: prev }); }), newRes; }, []); } else { var _offset = Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.d)(barCategoryGap, bandSize, 0, !0); bandSize - 2 * _offset - (len - 1) * realBarGap <= 0 && (realBarGap = 0); var originalSize = (bandSize - 2 * _offset - (len - 1) * realBarGap) / len; originalSize > 1 && (originalSize >>= 0); var size = maxBarSize === +maxBarSize ? Math.min(originalSize, maxBarSize) : originalSize; result = sizeList.reduce(function(res, entry, i) { var newRes = [].concat(_toConsumableArray(res), [ { item: entry.item, position: { offset: _offset + (originalSize + realBarGap) * i + (originalSize - size) / 2, size: size } } ]); return entry.stackList && entry.stackList.length && entry.stackList.forEach(function(item) { newRes.push({ item: item, position: newRes[newRes.length - 1].position }); }), newRes; }, []); } return result; }, appendOffsetOfLegend = function(offset, items, props, legendBox) { var children = props.children, width = props.width, height = props.height, margin = props.margin, legendWidth = width - (margin.left || 0) - (margin.right || 0), legendHeight = height - (margin.top || 0) - (margin.bottom || 0), legendProps = getLegendProps({ children: children, items: items, legendWidth: legendWidth, legendHeight: legendHeight }), newOffset = offset; if (legendProps) { var box = legendBox || {}, align = legendProps.align, verticalAlign = legendProps.verticalAlign, layout = legendProps.layout; ("vertical" === layout || "horizontal" === layout && "center" === verticalAlign) && Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(offset[align]) && (newOffset = _extends({}, offset, _defineProperty({}, align, newOffset[align] + (box.width || 0)))), ("horizontal" === layout || "vertical" === layout && "center" === align) && Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(offset[verticalAlign]) && (newOffset = _extends({}, offset, _defineProperty({}, verticalAlign, newOffset[verticalAlign] + (box.height || 0)))); } return newOffset; }, getDomainOfErrorBars = function(data, item, dataKey, axisType) { var children = item.props.children, errorBars = Object(__WEBPACK_IMPORTED_MODULE_20__ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_18__cartesian_ErrorBar__.a).filter(function(errorBarChild) { var direction = errorBarChild.props.direction; return !(!__WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(direction) && !__WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(axisType)) || axisType.indexOf(direction) >= 0; }); if (errorBars && errorBars.length) { var keys = errorBars.map(function(errorBarChild) { return errorBarChild.props.dataKey; }); return data.reduce(function(result, entry) { var entryValue = getValueByDataKey(entry, dataKey, 0), mainValue = __WEBPACK_IMPORTED_MODULE_6_lodash_isArray___default()(entryValue) ? [ __WEBPACK_IMPORTED_MODULE_5_lodash_min___default()(entryValue), __WEBPACK_IMPORTED_MODULE_4_lodash_max___default()(entryValue) ] : [ entryValue, entryValue ], errorDomain = keys.reduce(function(prevErrorArr, k) { var errorValue = getValueByDataKey(entry, k, 0), lowerValue = mainValue[0] - Math.abs(__WEBPACK_IMPORTED_MODULE_6_lodash_isArray___default()(errorValue) ? errorValue[0] : errorValue), upperValue = mainValue[1] + Math.abs(__WEBPACK_IMPORTED_MODULE_6_lodash_isArray___default()(errorValue) ? errorValue[1] : errorValue); return [ Math.min(lowerValue, prevErrorArr[0]), Math.max(upperValue, prevErrorArr[1]) ]; }, [ 1 / 0, -1 / 0 ]); return [ Math.min(errorDomain[0], result[0]), Math.max(errorDomain[1], result[1]) ]; }, [ 1 / 0, -1 / 0 ]); } return null; }, parseErrorBarsOfAxis = function(data, items, dataKey, axisType) { var domains = items.map(function(item) { return getDomainOfErrorBars(data, item, dataKey, axisType); }).filter(function(entry) { return !__WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(entry); }); return domains && domains.length ? domains.reduce(function(result, entry) { return [ Math.min(result[0], entry[0]), Math.max(result[1], entry[1]) ]; }, [ 1 / 0, -1 / 0 ]) : null; }, getDomainOfItemsWithSameAxis = function(data, items, type, filterNil) { var domains = items.map(function(item) { var dataKey = item.props.dataKey; return "number" === type && dataKey ? getDomainOfErrorBars(data, item, dataKey) || getDomainOfDataByKey(data, dataKey, type, filterNil) : getDomainOfDataByKey(data, dataKey, type, filterNil); }); if ("number" === type) return domains.reduce(function(result, entry) { return [ Math.min(result[0], entry[0]), Math.max(result[1], entry[1]) ]; }, [ 1 / 0, -1 / 0 ]); var tag = {}; return domains.reduce(function(result, entry) { for (var i = 0, len = entry.length; i < len; i++) tag[entry[i]] || (tag[entry[i]] = !0, result.push(entry[i])); return result; }, []); }, isCategorialAxis = function(layout, axisType) { return "horizontal" === layout && "xAxis" === axisType || "vertical" === layout && "yAxis" === axisType || "centric" === layout && "angleAxis" === axisType || "radial" === layout && "radiusAxis" === axisType; }, getCoordinatesOfGrid = function(ticks, min, max) { var hasMin = void 0, hasMax = void 0, values = ticks.map(function(entry) { return entry.coordinate === min && (hasMin = !0), entry.coordinate === max && (hasMax = !0), entry.coordinate; }); return hasMin || values.push(min), hasMax || values.push(max), values; }, getTicksOfAxis = function(axis, isGrid, isAll) { if (!axis) return null; var scale = axis.scale, duplicateDomain = axis.duplicateDomain, type = axis.type, range = axis.range, offset = (isGrid || isAll) && "category" === type && scale.bandwidth ? scale.bandwidth() / 2 : 0; return offset = "angleAxis" === axis.axisType ? 2 * Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.j)(range[0] - range[1]) * offset : offset, isGrid && (axis.ticks || axis.niceTicks) ? (axis.ticks || axis.niceTicks).map(function(entry) { var scaleContent = duplicateDomain ? duplicateDomain.indexOf(entry) : entry; return { coordinate: scale(scaleContent) + offset, value: entry, offset: offset }; }) : axis.isCategorial && axis.categoricalDomain ? axis.categoricalDomain.map(function(entry, index) { return { coordinate: scale(entry), value: entry, index: index, offset: offset }; }) : scale.ticks && !isAll ? scale.ticks(axis.tickCount).map(function(entry) { return { coordinate: scale(entry) + offset, value: entry, offset: offset }; }) : scale.domain().map(function(entry, index) { return { coordinate: scale(entry) + offset, value: duplicateDomain ? duplicateDomain[entry] : entry, index: index, offset: offset }; }); }, combineEventHandlers = function(defaultHandler, parentHandler, childHandler) { var customizedHandler = void 0; return __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(childHandler) ? customizedHandler = childHandler : __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(parentHandler) && (customizedHandler = parentHandler), __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(defaultHandler) || customizedHandler ? function(arg1, arg2, arg3, arg4) { __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(defaultHandler) && defaultHandler(arg1, arg2, arg3, arg4), __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(customizedHandler) && customizedHandler(arg1, arg2, arg3, arg4); } : null; }, parseScale = function(axis, chartType) { var scale = axis.scale, type = axis.type, layout = axis.layout, axisType = axis.axisType; if ("auto" === scale) return "radial" === layout && "radiusAxis" === axisType ? { scale: __WEBPACK_IMPORTED_MODULE_12_d3_scale__.scaleBand(), realScaleType: "band" } : "radial" === layout && "angleAxis" === axisType ? { scale: __WEBPACK_IMPORTED_MODULE_12_d3_scale__.scaleLinear(), realScaleType: "linear" } : "category" === type && chartType && (chartType.indexOf("LineChart") >= 0 || chartType.indexOf("AreaChart") >= 0) ? { scale: __WEBPACK_IMPORTED_MODULE_12_d3_scale__.scalePoint(), realScaleType: "point" } : "category" === type ? { scale: __WEBPACK_IMPORTED_MODULE_12_d3_scale__.scaleBand(), realScaleType: "band" } : { scale: __WEBPACK_IMPORTED_MODULE_12_d3_scale__.scaleLinear(), realScaleType: "linear" }; if (__WEBPACK_IMPORTED_MODULE_3_lodash_isString___default()(scale)) { var name = "scale" + scale.slice(0, 1).toUpperCase() + scale.slice(1); return { scale: (__WEBPACK_IMPORTED_MODULE_12_d3_scale__[name] || __WEBPACK_IMPORTED_MODULE_12_d3_scale__.scalePoint)(), realScaleType: __WEBPACK_IMPORTED_MODULE_12_d3_scale__[name] ? name : "point" }; } return __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(scale) ? { scale: scale } : { scale: __WEBPACK_IMPORTED_MODULE_12_d3_scale__.scalePoint(), realScaleType: "point" }; }, checkDomainOfScale = function(scale) { var domain = scale.domain(); if (domain && !(domain.length <= 2)) { var len = domain.length, range = scale.range(), min = Math.min(range[0], range[1]) - 1e-4, max = Math.max(range[0], range[1]) + 1e-4, first = scale(domain[0]), last = scale(domain[len - 1]); (first < min || first > max || last < min || last > max) && scale.domain([ domain[0], domain[len - 1] ]); } }, findPositionOfBar = function(barPosition, child) { if (!barPosition) return null; for (var i = 0, len = barPosition.length; i < len; i++) if (barPosition[i].item === child) return barPosition[i].position; return null; }, truncateByDomain = function(value, domain) { if (!domain || 2 !== domain.length || !Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(domain[0]) || !Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(domain[1])) return value; var min = Math.min(domain[0], domain[1]), max = Math.max(domain[0], domain[1]), result = [ value[0], value[1] ]; return (!Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(value[0]) || value[0] < min) && (result[0] = min), (!Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(value[1]) || value[1] > max) && (result[1] = max), result[0] > max && (result[0] = max), result[1] < min && (result[1] = min), result; }, offsetSign = function(series) { var n = series.length; if (!(n <= 0)) for (var j = 0, m = series[0].length; j < m; ++j) for (var positive = 0, negative = 0, i = 0; i < n; ++i) { var value = __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN___default()(series[i][j][1]) ? series[i][j][0] : series[i][j][1]; value >= 0 ? (series[i][j][0] = positive, series[i][j][1] = positive + value, positive = series[i][j][1]) : (series[i][j][0] = negative, series[i][j][1] = negative + value, negative = series[i][j][1]); } }, STACK_OFFSET_MAP = { sign: offsetSign, expand: __WEBPACK_IMPORTED_MODULE_13_d3_shape__.o, none: __WEBPACK_IMPORTED_MODULE_13_d3_shape__.p, silhouette: __WEBPACK_IMPORTED_MODULE_13_d3_shape__.q, wiggle: __WEBPACK_IMPORTED_MODULE_13_d3_shape__.r }, getStackedData = function(data, stackItems, offsetType) { var dataKeys = stackItems.map(function(item) { return item.props.dataKey; }); return Object(__WEBPACK_IMPORTED_MODULE_13_d3_shape__.n)().keys(dataKeys).value(function(d, key) { return +getValueByDataKey(d, key, 0); }).order(__WEBPACK_IMPORTED_MODULE_13_d3_shape__.s).offset(STACK_OFFSET_MAP[offsetType])(data); }, getStackGroupsByAxisId = function(data, _items, numericAxisId, cateAxisId, offsetType, reverseStackOrder) { if (!data) return null; var items = reverseStackOrder ? _items.reverse() : _items, stackGroups = items.reduce(function(result, item) { var _item$props2 = item.props, stackId = _item$props2.stackId; if (_item$props2.hide) return result; var axisId = item.props[numericAxisId], parentGroup = result[axisId] || { hasStack: !1, stackGroups: {} }; if (Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.g)(stackId)) { var childGroup = parentGroup.stackGroups[stackId] || { numericAxisId: numericAxisId, cateAxisId: cateAxisId, items: [] }; childGroup.items.push(item), parentGroup.hasStack = !0, parentGroup.stackGroups[stackId] = childGroup; } else parentGroup.stackGroups[Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.k)("_stackId_")] = { numericAxisId: numericAxisId, cateAxisId: cateAxisId, items: [ item ] }; return _extends({}, result, _defineProperty({}, axisId, parentGroup)); }, {}); return Object.keys(stackGroups).reduce(function(result, axisId) { var group = stackGroups[axisId]; return group.hasStack && (group.stackGroups = Object.keys(group.stackGroups).reduce(function(res, stackId) { var g = group.stackGroups[stackId]; return _extends({}, res, _defineProperty({}, stackId, { numericAxisId: numericAxisId, cateAxisId: cateAxisId, items: g.items, stackedData: getStackedData(data, g.items, offsetType) })); }, {})), _extends({}, result, _defineProperty({}, axisId, group)); }, {}); }, calculateDomainOfTicks = function(ticks, type) { return "number" === type ? [ Math.min.apply(null, ticks), Math.max.apply(null, ticks) ] : ticks; }, getTicksOfScale = function(scale, opts) { var realScaleType = opts.realScaleType, type = opts.type, tickCount = opts.tickCount, originalDomain = opts.originalDomain, allowDecimals = opts.allowDecimals, scaleType = realScaleType || opts.scale; if ("auto" !== scaleType && "linear" !== scaleType) return null; if (tickCount && "number" === type && originalDomain && ("auto" === originalDomain[0] || "auto" === originalDomain[1])) { var domain = scale.domain(), tickValues = Object(__WEBPACK_IMPORTED_MODULE_11_recharts_scale__.getNiceTickValues)(domain, tickCount, allowDecimals); return scale.domain(calculateDomainOfTicks(tickValues, type)), { niceTicks: tickValues }; } if (tickCount && "number" === type) { var _domain = scale.domain(); return { niceTicks: Object(__WEBPACK_IMPORTED_MODULE_11_recharts_scale__.getTickValuesFixedDomain)(_domain, tickCount, allowDecimals) }; } return null; }, getCateCoordinateOfLine = function(_ref6) { var axis = _ref6.axis, ticks = _ref6.ticks, bandSize = _ref6.bandSize, entry = _ref6.entry, index = _ref6.index; if ("category" === axis.type) { if (!axis.allowDuplicatedCategory && axis.dataKey && !__WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(entry[axis.dataKey])) { var matchedTick = Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.a)(ticks, "value", entry[axis.dataKey]); if (matchedTick) return matchedTick.coordinate + bandSize / 2; } return ticks[index] ? ticks[index].coordinate + bandSize / 2 : null; } var value = getValueByDataKey(entry, axis.dataKey); return __WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(value) ? null : axis.scale(value); }, getCateCoordinateOfBar = function(_ref7) { var axis = _ref7.axis, ticks = _ref7.ticks, offset = _ref7.offset, bandSize = _ref7.bandSize, entry = _ref7.entry, index = _ref7.index; if ("category" === axis.type) return ticks[index] ? ticks[index].coordinate + offset : null; var value = getValueByDataKey(entry, axis.dataKey, axis.domain[index]); return __WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(value) ? null : axis.scale(value) - bandSize / 2 + offset; }, getBaseValueOfBar = function(_ref8) { var numericAxis = _ref8.numericAxis, domain = numericAxis.scale.domain(); if ("number" === numericAxis.type) { var min = Math.min(domain[0], domain[1]), max = Math.max(domain[0], domain[1]); return min <= 0 && max >= 0 ? 0 : max < 0 ? max : min; } return domain[0]; }, detectReferenceElementsDomain = function(children, domain, axisId, axisType, specifiedTicks) { var lines = Object(__WEBPACK_IMPORTED_MODULE_20__ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_16__cartesian_ReferenceLine__.a), dots = Object(__WEBPACK_IMPORTED_MODULE_20__ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_15__cartesian_ReferenceDot__.a), elements = lines.concat(dots), areas = Object(__WEBPACK_IMPORTED_MODULE_20__ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_17__cartesian_ReferenceArea__.a), idKey = axisType + "Id", valueKey = axisType[0], finalDomain = domain; if (elements.length && (finalDomain = elements.reduce(function(result, el) { if (el.props[idKey] === axisId && el.props.alwaysShow && Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(el.props[valueKey])) { var value = el.props[valueKey]; return [ Math.min(result[0], value), Math.max(result[1], value) ]; } return result; }, finalDomain)), areas.length) { var key1 = valueKey + "1", key2 = valueKey + "2"; finalDomain = areas.reduce(function(result, el) { if (el.props[idKey] === axisId && el.props.alwaysShow && Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(el.props[key1]) && Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(el.props[key2])) { var value1 = el.props[key1], value2 = el.props[key2]; return [ Math.min(result[0], value1, value2), Math.max(result[1], value1, value2) ]; } return result; }, finalDomain); } return specifiedTicks && specifiedTicks.length && (finalDomain = specifiedTicks.reduce(function(result, tick) { return Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(tick) ? [ Math.min(result[0], tick), Math.max(result[1], tick) ] : result; }, finalDomain)), finalDomain; }, getStackedDataOfItem = function(item, stackGroups) { var stackId = item.props.stackId; if (Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.g)(stackId)) { var group = stackGroups[stackId]; if (group && group.items.length) { for (var itemIndex = -1, i = 0, len = group.items.length; i < len; i++) if (group.items[i] === item) { itemIndex = i; break; } return itemIndex >= 0 ? group.stackedData[itemIndex] : null; } } return null; }, getDomainOfSingle = function(data) { return data.reduce(function(result, entry) { return [ Math.min.apply(null, entry.concat([ result[0] ]).filter(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)), Math.max.apply(null, entry.concat([ result[1] ]).filter(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)) ]; }, [ 1 / 0, -1 / 0 ]); }, getDomainOfStackGroups = function(stackGroups, startIndex, endIndex) { return Object.keys(stackGroups).reduce(function(result, stackId) { var group = stackGroups[stackId], stackedData = group.stackedData, domain = stackedData.reduce(function(res, entry) { var s = getDomainOfSingle(entry.slice(startIndex, endIndex + 1)); return [ Math.min(res[0], s[0]), Math.max(res[1], s[1]) ]; }, [ 1 / 0, -1 / 0 ]); return [ Math.min(domain[0], result[0]), Math.max(domain[1], result[1]) ]; }, [ 1 / 0, -1 / 0 ]).map(function(result) { return result === 1 / 0 || result === -1 / 0 ? 0 : result; }); }, MIN_VALUE_REG = /^dataMin[\s]*-[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/, MAX_VALUE_REG = /^dataMax[\s]*\+[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/, parseSpecifiedDomain = function(specifiedDomain, dataDomain, allowDataOverflow) { if (!__WEBPACK_IMPORTED_MODULE_6_lodash_isArray___default()(specifiedDomain)) return dataDomain; var domain = []; if (Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(specifiedDomain[0])) domain[0] = allowDataOverflow ? specifiedDomain[0] : Math.min(specifiedDomain[0], dataDomain[0]); else if (MIN_VALUE_REG.test(specifiedDomain[0])) { var value = +MIN_VALUE_REG.exec(specifiedDomain[0])[1]; domain[0] = dataDomain[0] - value; } else __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(specifiedDomain[0]) ? domain[0] = specifiedDomain[0](dataDomain[0]) : domain[0] = dataDomain[0]; if (Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(specifiedDomain[1])) domain[1] = allowDataOverflow ? specifiedDomain[1] : Math.max(specifiedDomain[1], dataDomain[1]); else if (MAX_VALUE_REG.test(specifiedDomain[1])) { var _value = +MAX_VALUE_REG.exec(specifiedDomain[1])[1]; domain[1] = dataDomain[1] + _value; } else __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(specifiedDomain[1]) ? domain[1] = specifiedDomain[1](dataDomain[1]) : domain[1] = dataDomain[1]; return domain; }, validateCoordinateInRange = function(coordinate, scale) { if (!scale) return !1; var range = scale.range(), first = range[0], last = range[range.length - 1]; return first <= last ? coordinate >= first && coordinate <= last : coordinate >= last && coordinate <= first; }, getBandSizeOfAxis = function(axis, ticks) { if (axis && axis.scale && axis.scale.bandwidth) return axis.scale.bandwidth(); if (axis && ticks && ticks.length >= 2) { for (var orderedTicks = __WEBPACK_IMPORTED_MODULE_1_lodash_sortBy___default()(ticks, function(o) { return o.coordinate; }), bandSize = 1 / 0, i = 1, len = orderedTicks.length; i < len; i++) { var cur = orderedTicks[i], prev = orderedTicks[i - 1]; bandSize = Math.min((cur.coordinate || 0) - (prev.coordinate || 0), bandSize); } return bandSize === 1 / 0 ? 0 : bandSize; } return 0; }, parseDomainOfCategoryAxis = function(specifiedDomain, calculatedDomain, axisChild) { return specifiedDomain && specifiedDomain.length ? __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default()(specifiedDomain, __WEBPACK_IMPORTED_MODULE_9_lodash_get___default()(axisChild, "type.defaultProps.domain")) ? calculatedDomain : specifiedDomain : calculatedDomain; }; }, function(module, exports) { var core = module.exports = { version: "2.5.7" }; "number" == typeof __e && (__e = core); }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; function newInterval(floori, offseti, count, field) { function interval(date) { return floori(date = new Date(+date)), date; } return interval.floor = interval, interval.ceil = function(date) { return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date; }, interval.round = function(date) { var d0 = interval(date), d1 = interval.ceil(date); return date - d0 < d1 - date ? d0 : d1; }, interval.offset = function(date, step) { return offseti(date = new Date(+date), null == step ? 1 : Math.floor(step)), date; }, interval.range = function(start, stop, step) { var previous, range = []; if (start = interval.ceil(start), step = null == step ? 1 : Math.floor(step), !(start < stop && step > 0)) return range; do { range.push(previous = new Date(+start)), offseti(start, step), floori(start); } while (previous < start && start < stop); return range; }, interval.filter = function(test) { return newInterval(function(date) { if (date >= date) for (;floori(date), !test(date); ) date.setTime(date - 1); }, function(date, step) { if (date >= date) if (step < 0) for (;++step <= 0; ) for (;offseti(date, -1), !test(date); ) ; else for (;--step >= 0; ) for (;offseti(date, 1), !test(date); ) ; }); }, count && (interval.count = function(start, end) { return t0.setTime(+start), t1.setTime(+end), floori(t0), floori(t1), Math.floor(count(t0, t1)); }, interval.every = function(step) { return step = Math.floor(step), isFinite(step) && step > 0 ? step > 1 ? interval.filter(field ? function(d) { return field(d) % step == 0; } : function(d) { return interval.count(0, d) % step == 0; }) : interval : null; }), interval; } __webpack_exports__.a = newInterval; var t0 = new Date(), t1 = new Date(); }, function(module, exports, __webpack_require__) { var global = __webpack_require__(24), core = __webpack_require__(17), ctx = __webpack_require__(51), hide = __webpack_require__(39), has = __webpack_require__(54), $export = function(type, name, source) { var key, own, out, IS_FORCED = type & $export.F, IS_GLOBAL = type & $export.G, IS_STATIC = type & $export.S, IS_PROTO = type & $export.P, IS_BIND = type & $export.B, IS_WRAP = type & $export.W, exports = IS_GLOBAL ? core : core[name] || (core[name] = {}), expProto = exports.prototype, target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {}).prototype; IS_GLOBAL && (source = name); for (key in source) (own = !IS_FORCED && target && void 0 !== target[key]) && has(exports, key) || (out = own ? target[key] : source[key], exports[key] = IS_GLOBAL && "function" != typeof target[key] ? source[key] : IS_BIND && own ? ctx(out, global) : IS_WRAP && target[key] == out ? function(C) { var F = function(a, b, c) { if (this instanceof C) { switch (arguments.length) { case 0: return new C(); case 1: return new C(a); case 2: return new C(a, b); } return new C(a, b, c); } return C.apply(this, arguments); }; return F.prototype = C.prototype, F; }(out) : IS_PROTO && "function" == typeof out ? ctx(Function.call, out) : out, IS_PROTO && ((exports.virtual || (exports.virtual = {}))[key] = out, type & $export.R && expProto && !expProto[key] && hide(expProto, key, out))); }; $export.F = 1, $export.G = 2, $export.S = 4, $export.P = 8, $export.B = 16, $export.W = 32, $export.U = 64, $export.R = 128, module.exports = $export; }, function(module, exports) { function isNil(value) { return null == value; } module.exports = isNil; }, function(module, exports, __webpack_require__) { var store = __webpack_require__(151)("wks"), uid = __webpack_require__(103), Symbol = __webpack_require__(24).Symbol, USE_SYMBOL = "function" == typeof Symbol; (module.exports = function(name) { return store[name] || (store[name] = USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)("Symbol." + name)); }).store = store; }, function(module, exports, __webpack_require__) { var anObject = __webpack_require__(52), IE8_DOM_DEFINE = __webpack_require__(224), toPrimitive = __webpack_require__(145), dP = Object.defineProperty; exports.f = __webpack_require__(25) ? Object.defineProperty : function(O, P, Attributes) { if (anObject(O), P = toPrimitive(P, !0), anObject(Attributes), IE8_DOM_DEFINE) try { return dP(O, P, Attributes); } catch (e) {} if ("get" in Attributes || "set" in Attributes) throw TypeError("Accessors not supported!"); return "value" in Attributes && (O[P] = Attributes.value), O; }; }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; function _defineProperty(obj, key, value) { return key in obj ? Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }) : obj[key] = value, obj; } __webpack_require__.d(__webpack_exports__, "a", function() { return RADIAN; }), __webpack_require__.d(__webpack_exports__, "e", function() { return polarToCartesian; }), __webpack_require__.d(__webpack_exports__, "c", function() { return getMaxRadius; }), __webpack_require__.d(__webpack_exports__, "b", function() { return formatAxisMap; }), __webpack_require__.d(__webpack_exports__, "d", function() { return inRangeOfSector; }); var __WEBPACK_IMPORTED_MODULE_0_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_1__DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_2__ChartUtils__ = __webpack_require__(16), _extends = Object.assign || function(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); } return target; }, RADIAN = Math.PI / 180, radianToDegree = function(angleInRadian) { return 180 * angleInRadian / Math.PI; }, polarToCartesian = function(cx, cy, radius, angle) { return { x: cx + Math.cos(-RADIAN * angle) * radius, y: cy + Math.sin(-RADIAN * angle) * radius }; }, getMaxRadius = function(width, height) { var offset = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : { top: 0, right: 0, bottom: 0, left: 0 }; return Math.min(Math.abs(width - (offset.left || 0) - (offset.right || 0)), Math.abs(height - (offset.top || 0) - (offset.bottom || 0))) / 2; }, formatAxisMap = function(props, axisMap, offset, axisType, chartName) { var width = props.width, height = props.height, startAngle = props.startAngle, endAngle = props.endAngle, cx = Object(__WEBPACK_IMPORTED_MODULE_1__DataUtils__.d)(props.cx, width, width / 2), cy = Object(__WEBPACK_IMPORTED_MODULE_1__DataUtils__.d)(props.cy, height, height / 2), maxRadius = getMaxRadius(width, height, offset), innerRadius = Object(__WEBPACK_IMPORTED_MODULE_1__DataUtils__.d)(props.innerRadius, maxRadius, 0), outerRadius = Object(__WEBPACK_IMPORTED_MODULE_1__DataUtils__.d)(props.outerRadius, maxRadius, .8 * maxRadius); return Object.keys(axisMap).reduce(function(result, id) { var axis = axisMap[id], domain = axis.domain, reversed = axis.reversed, range = void 0; __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(axis.range) ? ("angleAxis" === axisType ? range = [ startAngle, endAngle ] : "radiusAxis" === axisType && (range = [ innerRadius, outerRadius ]), reversed && (range = [ range[1], range[0] ])) : (range = axis.range, startAngle = range[0], endAngle = range[1]); var _parseScale = Object(__WEBPACK_IMPORTED_MODULE_2__ChartUtils__.A)(axis, chartName), realScaleType = _parseScale.realScaleType, scale = _parseScale.scale; scale.domain(domain).range(range), Object(__WEBPACK_IMPORTED_MODULE_2__ChartUtils__.c)(scale); var ticks = Object(__WEBPACK_IMPORTED_MODULE_2__ChartUtils__.v)(scale, _extends({}, axis, { realScaleType: realScaleType })), finalAxis = _extends({}, axis, ticks, { range: range, radius: outerRadius, realScaleType: realScaleType, scale: scale, cx: cx, cy: cy, innerRadius: innerRadius, outerRadius: outerRadius, startAngle: startAngle, endAngle: endAngle }); return _extends({}, result, _defineProperty({}, id, finalAxis)); }, {}); }, distanceBetweenPoints = function(point, anotherPoint) { var x1 = point.x, y1 = point.y, x2 = anotherPoint.x, y2 = anotherPoint.y; return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)); }, getAngleOfPoint = function(_ref, _ref2) { var x = _ref.x, y = _ref.y, cx = _ref2.cx, cy = _ref2.cy, radius = distanceBetweenPoints({ x: x, y: y }, { x: cx, y: cy }); if (radius <= 0) return { radius: radius }; var cos = (x - cx) / radius, angleInRadian = Math.acos(cos); return y > cy && (angleInRadian = 2 * Math.PI - angleInRadian), { radius: radius, angle: radianToDegree(angleInRadian), angleInRadian: angleInRadian }; }, formatAngleOfSector = function(_ref3) { var startAngle = _ref3.startAngle, endAngle = _ref3.endAngle, startCnt = Math.floor(startAngle / 360), endCnt = Math.floor(endAngle / 360), min = Math.min(startCnt, endCnt); return { startAngle: startAngle - 360 * min, endAngle: endAngle - 360 * min }; }, reverseFormatAngleOfSetor = function(angle, _ref4) { var startAngle = _ref4.startAngle, endAngle = _ref4.endAngle, startCnt = Math.floor(startAngle / 360), endCnt = Math.floor(endAngle / 360); return angle + 360 * Math.min(startCnt, endCnt); }, inRangeOfSector = function(_ref5, sector) { var x = _ref5.x, y = _ref5.y, _getAngleOfPoint = getAngleOfPoint({ x: x, y: y }, sector), radius = _getAngleOfPoint.radius, angle = _getAngleOfPoint.angle, innerRadius = sector.innerRadius, outerRadius = sector.outerRadius; if (radius < innerRadius || radius > outerRadius) return !1; if (0 === radius) return !0; var _formatAngleOfSector = formatAngleOfSector(sector), startAngle = _formatAngleOfSector.startAngle, endAngle = _formatAngleOfSector.endAngle, formatAngle = angle, inRange = void 0; if (startAngle <= endAngle) { for (;formatAngle > endAngle; ) formatAngle -= 360; for (;formatAngle < startAngle; ) formatAngle += 360; inRange = formatAngle >= startAngle && formatAngle <= endAngle; } else { for (;formatAngle > startAngle; ) formatAngle -= 360; for (;formatAngle < endAngle; ) formatAngle += 360; inRange = formatAngle >= endAngle && formatAngle <= startAngle; } return inRange ? _extends({}, sector, { radius: radius, angle: reverseFormatAngleOfSetor(formatAngle, sector) }) : null; }; }, function(module, exports) { var global = module.exports = "undefined" != typeof window && window.Math == Math ? window : "undefined" != typeof self && self.Math == Math ? self : Function("return this")(); "number" == typeof __g && (__g = global); }, function(module, exports, __webpack_require__) { module.exports = !__webpack_require__(53)(function() { return 7 != Object.defineProperty({}, "a", { get: function() { return 7; } }).a; }); }, function(module, exports, __webpack_require__) { module.exports = { default: __webpack_require__(394), __esModule: !0 }; }, function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = !0, exports.default = function(instance, Constructor) { if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); }; }, function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = !0; var _defineProperty = __webpack_require__(154), _defineProperty2 = function(obj) { return obj && obj.__esModule ? obj : { default: obj }; }(_defineProperty); exports.default = function() { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, "value" in descriptor && (descriptor.writable = !0), (0, _defineProperty2.default)(target, descriptor.key, descriptor); } } return function(Constructor, protoProps, staticProps) { return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), Constructor; }; }(); }, function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = !0; var _typeof2 = __webpack_require__(105), _typeof3 = function(obj) { return obj && obj.__esModule ? obj : { default: obj }; }(_typeof2); exports.default = function(self, call) { if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !call || "object" !== (void 0 === call ? "undefined" : (0, _typeof3.default)(call)) && "function" != typeof call ? self : call; }; }, function(module, exports, __webpack_require__) { "use strict"; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } exports.__esModule = !0; var _setPrototypeOf = __webpack_require__(411), _setPrototypeOf2 = _interopRequireDefault(_setPrototypeOf), _create = __webpack_require__(415), _create2 = _interopRequireDefault(_create), _typeof2 = __webpack_require__(105), _typeof3 = _interopRequireDefault(_typeof2); exports.default = function(subClass, superClass) { if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + (void 0 === superClass ? "undefined" : (0, _typeof3.default)(superClass))); subClass.prototype = (0, _create2.default)(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: !1, writable: !0, configurable: !0 } }), superClass && (_setPrototypeOf2.default ? (0, _setPrototypeOf2.default)(subClass, superClass) : subClass.__proto__ = superClass); }; }, function(module, exports, __webpack_require__) { var freeGlobal = __webpack_require__(268), freeSelf = "object" == typeof self && self && self.Object === Object && self, root = freeGlobal || freeSelf || Function("return this")(); module.exports = root; }, function(module, exports) { function isObject(value) { var type = typeof value; return null != value && ("object" == type || "function" == type); } module.exports = isObject; }, function(module, exports, __webpack_require__) { "use strict"; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } Object.defineProperty(exports, "__esModule", { value: !0 }), exports.translateStyle = exports.AnimateGroup = exports.configBezier = exports.configSpring = void 0; var _Animate = __webpack_require__(287), _Animate2 = _interopRequireDefault(_Animate), _easing = __webpack_require__(305), _util = __webpack_require__(132), _AnimateGroup = __webpack_require__(762), _AnimateGroup2 = _interopRequireDefault(_AnimateGroup); exports.configSpring = _easing.configSpring, exports.configBezier = _easing.configBezier, exports.AnimateGroup = _AnimateGroup2.default, exports.translateStyle = _util.translateStyle, exports.default = _Animate2.default; }, function(module, exports) { var isArray = Array.isArray; module.exports = isArray; }, function(module, exports) { module.exports = function(it) { return "object" == typeof it ? null !== it : "function" == typeof it; }; }, function(module, exports, __webpack_require__) { var freeGlobal = __webpack_require__(292), freeSelf = "object" == typeof self && self && self.Object === Object && self, root = freeGlobal || freeSelf || Function("return this")(); module.exports = root; }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; var __WEBPACK_IMPORTED_MODULE_0__src_bisect__ = __webpack_require__(332); __webpack_require__.d(__webpack_exports__, "b", function() { return __WEBPACK_IMPORTED_MODULE_0__src_bisect__.a; }); var __WEBPACK_IMPORTED_MODULE_1__src_ascending__ = __webpack_require__(69); __webpack_require__.d(__webpack_exports__, "a", function() { return __WEBPACK_IMPORTED_MODULE_1__src_ascending__.a; }); var __WEBPACK_IMPORTED_MODULE_2__src_bisector__ = __webpack_require__(333); __webpack_require__.d(__webpack_exports__, "c", function() { return __WEBPACK_IMPORTED_MODULE_2__src_bisector__.a; }); var __WEBPACK_IMPORTED_MODULE_18__src_quantile__ = (__webpack_require__(848), __webpack_require__(849), __webpack_require__(335), __webpack_require__(337), __webpack_require__(850), __webpack_require__(853), __webpack_require__(854), __webpack_require__(341), __webpack_require__(855), __webpack_require__(856), __webpack_require__(857), __webpack_require__(858), __webpack_require__(342), __webpack_require__(334), __webpack_require__(859), __webpack_require__(204)); __webpack_require__.d(__webpack_exports__, "d", function() { return __WEBPACK_IMPORTED_MODULE_18__src_quantile__.a; }); var __WEBPACK_IMPORTED_MODULE_19__src_range__ = __webpack_require__(339); __webpack_require__.d(__webpack_exports__, "e", function() { return __WEBPACK_IMPORTED_MODULE_19__src_range__.a; }); var __WEBPACK_IMPORTED_MODULE_23__src_ticks__ = (__webpack_require__(860), __webpack_require__(861), __webpack_require__(862), __webpack_require__(340)); __webpack_require__.d(__webpack_exports__, "h", function() { return __WEBPACK_IMPORTED_MODULE_23__src_ticks__.a; }), __webpack_require__.d(__webpack_exports__, "f", function() { return __WEBPACK_IMPORTED_MODULE_23__src_ticks__.b; }), __webpack_require__.d(__webpack_exports__, "g", function() { return __WEBPACK_IMPORTED_MODULE_23__src_ticks__.c; }); __webpack_require__(343), __webpack_require__(336), __webpack_require__(863); }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.d(__webpack_exports__, "d", function() { return durationSecond; }), __webpack_require__.d(__webpack_exports__, "c", function() { return durationMinute; }), __webpack_require__.d(__webpack_exports__, "b", function() { return durationHour; }), __webpack_require__.d(__webpack_exports__, "a", function() { return durationDay; }), __webpack_require__.d(__webpack_exports__, "e", function() { return durationWeek; }); var durationSecond = 1e3, durationMinute = 6e4, durationHour = 36e5, durationDay = 864e5, durationWeek = 6048e5; }, function(module, exports, __webpack_require__) { var dP = __webpack_require__(22), createDesc = __webpack_require__(75); module.exports = __webpack_require__(25) ? function(object, key, value) { return dP.f(object, key, createDesc(1, value)); } : function(object, key, value) { return object[key] = value, object; }; }, function(module, exports) { var g; g = function() { return this; }(); try { g = g || Function("return this")() || (0, eval)("this"); } catch (e) { "object" == typeof window && (g = window); } module.exports = g; }, function(module, exports, __webpack_require__) { function baseGetTag(value) { return null == value ? void 0 === value ? undefinedTag : nullTag : symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value); } var Symbol = __webpack_require__(83), getRawTag = __webpack_require__(603), objectToString = __webpack_require__(604), nullTag = "[object Null]", undefinedTag = "[object Undefined]", symToStringTag = Symbol ? Symbol.toStringTag : void 0; module.exports = baseGetTag; }, function(module, exports) { function isObjectLike(value) { return null != value && "object" == typeof value; } module.exports = isObjectLike; }, function(module, exports) { function isObjectLike(value) { return null != value && "object" == typeof value; } module.exports = isObjectLike; }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } return Array.from(arr); } function Label(props) { var viewBox = props.viewBox, position = props.position, value = props.value, children = props.children, content = props.content, _props$className = props.className, className = void 0 === _props$className ? "" : _props$className; if (!viewBox || __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(value) && __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(children) && !Object(__WEBPACK_IMPORTED_MODULE_3_react__.isValidElement)(content) && !__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(content)) return null; if (Object(__WEBPACK_IMPORTED_MODULE_3_react__.isValidElement)(content)) return Object(__WEBPACK_IMPORTED_MODULE_3_react__.cloneElement)(content, props); var label = void 0; if (__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(content)) { if (label = content(props), Object(__WEBPACK_IMPORTED_MODULE_3_react__.isValidElement)(label)) return label; } else label = getLabel(props); var isPolarLabel = isPolar(viewBox), attrs = Object(__WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.k)(props); if (isPolarLabel && ("insideStart" === position || "insideEnd" === position || "end" === position)) return renderRadialLabel(props, label, attrs); var positionAttrs = isPolarLabel ? getAttrsOfPolarLabel(props) : getAttrsOfCartesianLabel(props); return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_6__Text__.a, _extends({ className: __WEBPACK_IMPORTED_MODULE_5_classnames___default()("recharts-label", className) }, attrs, positionAttrs), label); } var __WEBPACK_IMPORTED_MODULE_0_lodash_isObject__ = __webpack_require__(32), __WEBPACK_IMPORTED_MODULE_0_lodash_isObject___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isObject__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_3_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_3_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_react__), __WEBPACK_IMPORTED_MODULE_4_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_4_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_prop_types__), __WEBPACK_IMPORTED_MODULE_5_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_5_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_classnames__), __WEBPACK_IMPORTED_MODULE_6__Text__ = __webpack_require__(61), __WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_8__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__ = __webpack_require__(23), _extends = Object.assign || function(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); } return target; }, cartesianViewBoxShape = __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.shape({ x: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, y: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, width: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, height: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number }), polarViewBoxShape = __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.shape({ cx: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, cy: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, innerRadius: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, outerRadius: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, startAngle: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, endAngle: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number }), propTypes = { viewBox: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ cartesianViewBoxShape, polarViewBoxShape ]), formatter: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func, value: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string ]), offset: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, position: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ "top", "left", "right", "bottom", "inside", "outside", "insideLeft", "insideRight", "insideTop", "insideBottom", "insideTopLeft", "insideBottomLeft", "insideTopRight", "insideBottomRight", "insideStart", "insideEnd", "end", "center" ]), children: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.node), __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.node ]), className: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string, content: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func ]) }, defaultProps = { offset: 5 }, getLabel = function(props) { var value = props.value, formatter = props.formatter, label = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(props.children) ? value : props.children; return __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(formatter) ? formatter(label) : label; }, getDeltaAngle = function(startAngle, endAngle) { return Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.j)(endAngle - startAngle) * Math.min(Math.abs(endAngle - startAngle), 360); }, renderRadialLabel = function(labelProps, label, attrs) { var position = labelProps.position, viewBox = labelProps.viewBox, offset = labelProps.offset, className = labelProps.className, cx = viewBox.cx, cy = viewBox.cy, innerRadius = viewBox.innerRadius, outerRadius = viewBox.outerRadius, startAngle = viewBox.startAngle, endAngle = viewBox.endAngle, clockWise = viewBox.clockWise, radius = (innerRadius + outerRadius) / 2, deltaAngle = getDeltaAngle(startAngle, endAngle), sign = deltaAngle >= 0 ? 1 : -1, labelAngle = void 0, direction = void 0; "insideStart" === position ? (labelAngle = startAngle + sign * offset, direction = clockWise) : "insideEnd" === position ? (labelAngle = endAngle - sign * offset, direction = !clockWise) : "end" === position && (labelAngle = endAngle + sign * offset, direction = clockWise), direction = deltaAngle <= 0 ? direction : !direction; var startPoint = Object(__WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__.e)(cx, cy, radius, labelAngle), endPoint = Object(__WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__.e)(cx, cy, radius, labelAngle + 359 * (direction ? 1 : -1)), path = "M" + startPoint.x + "," + startPoint.y + "\n A" + radius + "," + radius + ",0,1," + (direction ? 0 : 1) + ",\n " + endPoint.x + "," + endPoint.y, id = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(labelProps.id) ? Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.k)("recharts-radial-line-") : labelProps.id; return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement("text", _extends({}, attrs, { dominantBaseline: "central", className: __WEBPACK_IMPORTED_MODULE_5_classnames___default()("recharts-radial-bar-label", className) }), __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement("defs", null, __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement("path", { id: id, d: path })), __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement("textPath", { xlinkHref: "#" + id }, label)); }, getAttrsOfPolarLabel = function(props) { var viewBox = props.viewBox, offset = props.offset, position = props.position, cx = viewBox.cx, cy = viewBox.cy, innerRadius = viewBox.innerRadius, outerRadius = viewBox.outerRadius, startAngle = viewBox.startAngle, endAngle = viewBox.endAngle, midAngle = (startAngle + endAngle) / 2; if ("outside" === position) { var _polarToCartesian = Object(__WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__.e)(cx, cy, outerRadius + offset, midAngle), _x = _polarToCartesian.x; return { x: _x, y: _polarToCartesian.y, textAnchor: _x >= cx ? "start" : "end", verticalAnchor: "middle" }; } if ("center" === position) return { x: cx, y: cy, textAnchor: "middle", verticalAnchor: "middle" }; var r = (innerRadius + outerRadius) / 2, _polarToCartesian2 = Object(__WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__.e)(cx, cy, r, midAngle); return { x: _polarToCartesian2.x, y: _polarToCartesian2.y, textAnchor: "middle", verticalAnchor: "middle" }; }, getAttrsOfCartesianLabel = function(props) { var viewBox = props.viewBox, offset = props.offset, position = props.position, x = viewBox.x, y = viewBox.y, width = viewBox.width, height = viewBox.height, sign = height >= 0 ? 1 : -1; return "top" === position ? { x: x + width / 2, y: y - sign * offset, textAnchor: "middle", verticalAnchor: "end" } : "bottom" === position ? { x: x + width / 2, y: y + height + sign * offset, textAnchor: "middle", verticalAnchor: "start" } : "left" === position ? { x: x - offset, y: y + height / 2, textAnchor: "end", verticalAnchor: "middle" } : "right" === position ? { x: x + width + offset, y: y + height / 2, textAnchor: "start", verticalAnchor: "middle" } : "insideLeft" === position ? { x: x + offset, y: y + height / 2, textAnchor: "start", verticalAnchor: "middle" } : "insideRight" === position ? { x: x + width - offset, y: y + height / 2, textAnchor: "end", verticalAnchor: "middle" } : "insideTop" === position ? { x: x + width / 2, y: y + sign * offset, textAnchor: "middle", verticalAnchor: "start" } : "insideBottom" === position ? { x: x + width / 2, y: y + height - sign * offset, textAnchor: "middle", verticalAnchor: "end" } : "insideTopLeft" === position ? { x: x + offset, y: y + sign * offset, textAnchor: "start", verticalAnchor: "start" } : "insideTopRight" === position ? { x: x + width - offset, y: y + sign * offset, textAnchor: "end", verticalAnchor: "start" } : "insideBottomLeft" === position ? { x: x + offset, y: y + height - sign * offset, textAnchor: "start", verticalAnchor: "end" } : "insideBottomRight" === position ? { x: x + width - offset, y: y + height - sign * offset, textAnchor: "end", verticalAnchor: "end" } : __WEBPACK_IMPORTED_MODULE_0_lodash_isObject___default()(position) && (Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(position.x) || Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.i)(position.x)) && (Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(position.y) || Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.i)(position.y)) ? { x: x + Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.d)(position.x, width), y: y + Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.d)(position.y, height), textAnchor: "end", verticalAnchor: "end" } : { x: x + width / 2, y: y + height / 2, textAnchor: "middle", verticalAnchor: "middle" }; }, isPolar = function(viewBox) { return Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(viewBox.cx); }; Label.displayName = "Label", Label.defaultProps = defaultProps, Label.propTypes = propTypes; var parseViewBox = function(props) { var cx = props.cx, cy = props.cy, angle = props.angle, startAngle = props.startAngle, endAngle = props.endAngle, r = props.r, radius = props.radius, innerRadius = props.innerRadius, outerRadius = props.outerRadius, x = props.x, y = props.y, top = props.top, left = props.left, width = props.width, height = props.height, clockWise = props.clockWise; if (Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(width) && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(height)) { if (Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(x) && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(y)) return { x: x, y: y, width: width, height: height }; if (Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(top) && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(left)) return { x: top, y: left, width: width, height: height }; } return Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(x) && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(y) ? { x: x, y: y, width: 0, height: 0 } : Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(cx) && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(cy) ? { cx: cx, cy: cy, startAngle: startAngle || angle || 0, endAngle: endAngle || angle || 0, innerRadius: innerRadius || 0, outerRadius: outerRadius || radius || r || 0, clockWise: clockWise } : props.viewBox ? props.viewBox : {}; }, parseLabel = function(label, viewBox) { return label ? !0 === label ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(Label, { key: "label-implicit", viewBox: viewBox }) : Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.g)(label) ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(Label, { key: "label-implicit", viewBox: viewBox, value: label }) : Object(__WEBPACK_IMPORTED_MODULE_3_react__.isValidElement)(label) || __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(label) ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(Label, { key: "label-implicit", content: label, viewBox: viewBox }) : __WEBPACK_IMPORTED_MODULE_0_lodash_isObject___default()(label) ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(Label, _extends({ viewBox: viewBox }, label, { key: "label-implicit" })) : null : null; }, renderCallByParent = function(parentProps, viewBox) { var ckeckPropsLabel = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2]; if (!parentProps || !parentProps.children && ckeckPropsLabel && !parentProps.label) return null; var children = parentProps.children, parentViewBox = parseViewBox(parentProps), explicitChilren = Object(__WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.h)(children, Label).map(function(child, index) { return Object(__WEBPACK_IMPORTED_MODULE_3_react__.cloneElement)(child, { viewBox: viewBox || parentViewBox, key: "label-" + index }); }); return ckeckPropsLabel ? [ parseLabel(parentProps.label, viewBox || parentViewBox) ].concat(_toConsumableArray(explicitChilren)) : explicitChilren; }; Label.parseViewBox = parseViewBox, Label.renderCallByParent = renderCallByParent, __webpack_exports__.a = Label; }, function(module, exports, __webpack_require__) { function isEqual(value, other) { return baseIsEqual(value, other); } var baseIsEqual = __webpack_require__(199); module.exports = isEqual; }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; var __WEBPACK_IMPORTED_MODULE_0__src_color__ = __webpack_require__(207); __webpack_require__.d(__webpack_exports__, "a", function() { return __WEBPACK_IMPORTED_MODULE_0__src_color__.e; }), __webpack_require__.d(__webpack_exports__, "f", function() { return __WEBPACK_IMPORTED_MODULE_0__src_color__.g; }), __webpack_require__.d(__webpack_exports__, "d", function() { return __WEBPACK_IMPORTED_MODULE_0__src_color__.f; }); var __WEBPACK_IMPORTED_MODULE_1__src_lab__ = __webpack_require__(871); __webpack_require__.d(__webpack_exports__, "e", function() { return __WEBPACK_IMPORTED_MODULE_1__src_lab__.a; }), __webpack_require__.d(__webpack_exports__, "c", function() { return __WEBPACK_IMPORTED_MODULE_1__src_lab__.b; }); var __WEBPACK_IMPORTED_MODULE_2__src_cubehelix__ = __webpack_require__(872); __webpack_require__.d(__webpack_exports__, "b", function() { return __WEBPACK_IMPORTED_MODULE_2__src_cubehelix__.a; }); }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } return Array.from(arr); } function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]); return target; } function LabelList(props) { var data = props.data, valueAccessor = props.valueAccessor, dataKey = props.dataKey, clockWise = props.clockWise, id = props.id, others = _objectWithoutProperties(props, [ "data", "valueAccessor", "dataKey", "clockWise", "id" ]); return data && data.length ? __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, { className: "recharts-label-list" }, data.map(function(entry, index) { var value = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(dataKey) ? valueAccessor(entry, index) : Object(__WEBPACK_IMPORTED_MODULE_10__util_ChartUtils__.w)(entry && entry.payload, dataKey), idProps = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(id) ? {} : { id: id + "-" + index }; return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_7__Label__.a, _extends({}, Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(entry), others, idProps, { index: index, value: value, viewBox: __WEBPACK_IMPORTED_MODULE_7__Label__.a.parseViewBox(__WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(clockWise) ? entry : _extends({}, entry, { clockWise: clockWise })), key: "label-" + index })); })) : null; } var __WEBPACK_IMPORTED_MODULE_0_lodash_isObject__ = __webpack_require__(32), __WEBPACK_IMPORTED_MODULE_0_lodash_isObject___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isObject__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_3_lodash_last__ = __webpack_require__(922), __WEBPACK_IMPORTED_MODULE_3_lodash_last___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_last__), __WEBPACK_IMPORTED_MODULE_4_lodash_isArray__ = __webpack_require__(13), __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_5_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_5_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_react__), __WEBPACK_IMPORTED_MODULE_6_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_6_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_prop_types__), __WEBPACK_IMPORTED_MODULE_7__Label__ = __webpack_require__(44), __WEBPACK_IMPORTED_MODULE_8__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_10__util_ChartUtils__ = __webpack_require__(16), _extends = Object.assign || function(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); } return target; }, propTypes = { id: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, data: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object), valueAccessor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, clockWise: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool, dataKey: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func ]) }, defaultProps = { valueAccessor: function(entry) { return __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(entry.value) ? __WEBPACK_IMPORTED_MODULE_3_lodash_last___default()(entry.value) : entry.value; } }; LabelList.propTypes = propTypes, LabelList.displayName = "LabelList"; var parseLabelList = function(label, data) { return label ? !0 === label ? __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(LabelList, { key: "labelList-implicit", data: data }) : __WEBPACK_IMPORTED_MODULE_5_react___default.a.isValidElement(label) || __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(label) ? __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(LabelList, { key: "labelList-implicit", data: data, content: label }) : __WEBPACK_IMPORTED_MODULE_0_lodash_isObject___default()(label) ? __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(LabelList, _extends({ data: data }, label, { key: "labelList-implicit" })) : null : null; }, renderCallByParent = function(parentProps, data) { var ckeckPropsLabel = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2]; if (!parentProps || !parentProps.children && ckeckPropsLabel && !parentProps.label) return null; var children = parentProps.children, explicitChilren = Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.h)(children, LabelList).map(function(child, index) { return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(child, { data: data, key: "labelList-" + index }); }); return ckeckPropsLabel ? [ parseLabelList(parentProps.label, data) ].concat(_toConsumableArray(explicitChilren)) : explicitChilren; }; LabelList.renderCallByParent = renderCallByParent, LabelList.defaultProps = defaultProps, __webpack_exports__.a = LabelList; }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]); return target; } function _defineProperty(obj, key, value) { return key in obj ? Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }) : obj[key] = value, obj; } function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } return Array.from(arr); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); } function _possibleConstructorReturn(self, call) { if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !call || "object" != typeof call && "function" != typeof call ? self : call; } function _inherits(subClass, superClass) { if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: !1, writable: !0, configurable: !0 } }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass); } var __WEBPACK_IMPORTED_MODULE_0_lodash_sortBy__ = __webpack_require__(321), __WEBPACK_IMPORTED_MODULE_0_lodash_sortBy___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_sortBy__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_lodash_range__ = __webpack_require__(373), __WEBPACK_IMPORTED_MODULE_2_lodash_range___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_range__), __WEBPACK_IMPORTED_MODULE_3_lodash_throttle__ = __webpack_require__(933), __WEBPACK_IMPORTED_MODULE_3_lodash_throttle___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_throttle__), __WEBPACK_IMPORTED_MODULE_4_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_5_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_5_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_react__), __WEBPACK_IMPORTED_MODULE_6_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_6_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_prop_types__), __WEBPACK_IMPORTED_MODULE_7_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_7_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_7_classnames__), __WEBPACK_IMPORTED_MODULE_8__container_Surface__ = __webpack_require__(82), __WEBPACK_IMPORTED_MODULE_9__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_10__component_Tooltip__ = __webpack_require__(125), __WEBPACK_IMPORTED_MODULE_11__component_Legend__ = __webpack_require__(180), __WEBPACK_IMPORTED_MODULE_12__shape_Curve__ = __webpack_require__(71), __WEBPACK_IMPORTED_MODULE_13__shape_Cross__ = __webpack_require__(367), __WEBPACK_IMPORTED_MODULE_14__shape_Sector__ = __webpack_require__(139), __WEBPACK_IMPORTED_MODULE_15__shape_Dot__ = __webpack_require__(63), __WEBPACK_IMPORTED_MODULE_16__shape_Rectangle__ = __webpack_require__(70), __WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__ = __webpack_require__(374), __WEBPACK_IMPORTED_MODULE_19__cartesian_Brush__ = __webpack_require__(372), __WEBPACK_IMPORTED_MODULE_20__util_DOMUtils__ = __webpack_require__(198), __WEBPACK_IMPORTED_MODULE_21__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__ = __webpack_require__(16), __WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__ = __webpack_require__(23), __WEBPACK_IMPORTED_MODULE_24__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_25__util_Events__ = __webpack_require__(934), _extends = Object.assign || function(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); } return target; }, _createClass = function() { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); } } return function(Constructor, protoProps, staticProps) { return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), Constructor; }; }(), ORIENT_MAP = { xAxis: [ "bottom", "top" ], yAxis: [ "left", "right" ] }, originCoordinate = { x: 0, y: 0 }, generateCategoricalChart = function(_ref) { var _class, _temp, _initialiseProps, chartName = _ref.chartName, GraphicalChild = _ref.GraphicalChild, _ref$eventType = _ref.eventType, eventType = void 0 === _ref$eventType ? "axis" : _ref$eventType, axisComponents = _ref.axisComponents, legendContent = _ref.legendContent, formatAxisMap = _ref.formatAxisMap, defaultProps = _ref.defaultProps, propTypes = _ref.propTypes; return _temp = _class = function(_Component) { function CategoricalChartWrapper(props) { _classCallCheck(this, CategoricalChartWrapper); var _this = _possibleConstructorReturn(this, (CategoricalChartWrapper.__proto__ || Object.getPrototypeOf(CategoricalChartWrapper)).call(this, props)); _initialiseProps.call(_this); var defaultState = _this.constructor.createDefaultState(props); return _this.state = _extends({}, defaultState, { updateId: 0 }, _this.updateStateOfAxisMapsOffsetAndStackGroups(_extends({ props: props }, defaultState, { updateId: 0 }))), _this.uniqueChartId = __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(props.id) ? Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.k)("recharts") : props.id, props.throttleDelay && (_this.triggeredAfterMouseMove = __WEBPACK_IMPORTED_MODULE_3_lodash_throttle___default()(_this.triggeredAfterMouseMove, props.throttleDelay)), _this; } return _inherits(CategoricalChartWrapper, _Component), _createClass(CategoricalChartWrapper, [ { key: "componentDidMount", value: function() { __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(this.props.syncId) || this.addListener(); } }, { key: "componentWillReceiveProps", value: function(nextProps) { var _props = this.props, data = _props.data, children = _props.children, width = _props.width, height = _props.height, layout = _props.layout, stackOffset = _props.stackOffset, margin = _props.margin, updateId = this.state.updateId; if (nextProps.data === data && nextProps.width === width && nextProps.height === height && nextProps.layout === layout && nextProps.stackOffset === stackOffset && Object(__WEBPACK_IMPORTED_MODULE_24__util_PureRender__.b)(nextProps.margin, margin)) { if (!Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.m)(nextProps.children, children)) { var hasGlobalData = !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(nextProps.data), newUpdateId = hasGlobalData ? updateId : updateId + 1, _state = this.state, dataStartIndex = _state.dataStartIndex, dataEndIndex = _state.dataEndIndex, _defaultState = _extends({}, this.constructor.createDefaultState(nextProps), { dataEndIndex: dataEndIndex, dataStartIndex: dataStartIndex }); this.setState(_extends({}, _defaultState, { updateId: newUpdateId }, this.updateStateOfAxisMapsOffsetAndStackGroups(_extends({ props: nextProps }, _defaultState, { updateId: newUpdateId })))); } } else { var defaultState = this.constructor.createDefaultState(nextProps); this.setState(_extends({}, defaultState, { updateId: updateId + 1 }, this.updateStateOfAxisMapsOffsetAndStackGroups(_extends({ props: nextProps }, defaultState, { updateId: updateId + 1 })))); } __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(this.props.syncId) && !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(nextProps.syncId) && this.addListener(), !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(this.props.syncId) && __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(nextProps.syncId) && this.removeListener(); } }, { key: "componentWillUnmount", value: function() { __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(this.props.syncId) || this.removeListener(), "function" == typeof this.triggeredAfterMouseMove.cancel && this.triggeredAfterMouseMove.cancel(); } }, { key: "getAxisMap", value: function(props, _ref2) { var _ref2$axisType = _ref2.axisType, axisType = void 0 === _ref2$axisType ? "xAxis" : _ref2$axisType, AxisComp = _ref2.AxisComp, graphicalItems = _ref2.graphicalItems, stackGroups = _ref2.stackGroups, dataStartIndex = _ref2.dataStartIndex, dataEndIndex = _ref2.dataEndIndex, children = props.children, axisIdKey = axisType + "Id", axes = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.h)(children, AxisComp), axisMap = {}; return axes && axes.length ? axisMap = this.getAxisMapByAxes(props, { axes: axes, graphicalItems: graphicalItems, axisType: axisType, axisIdKey: axisIdKey, stackGroups: stackGroups, dataStartIndex: dataStartIndex, dataEndIndex: dataEndIndex }) : graphicalItems && graphicalItems.length && (axisMap = this.getAxisMapByItems(props, { Axis: AxisComp, graphicalItems: graphicalItems, axisType: axisType, axisIdKey: axisIdKey, stackGroups: stackGroups, dataStartIndex: dataStartIndex, dataEndIndex: dataEndIndex })), axisMap; } }, { key: "getAxisMapByAxes", value: function(props, _ref3) { var _this2 = this, axes = _ref3.axes, graphicalItems = _ref3.graphicalItems, axisType = _ref3.axisType, axisIdKey = _ref3.axisIdKey, stackGroups = _ref3.stackGroups, dataStartIndex = _ref3.dataStartIndex, dataEndIndex = _ref3.dataEndIndex, layout = props.layout, children = props.children, stackOffset = props.stackOffset, isCategorial = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.x)(layout, axisType); return axes.reduce(function(result, child) { var _child$props = child.props, type = _child$props.type, dataKey = _child$props.dataKey, allowDataOverflow = _child$props.allowDataOverflow, allowDuplicatedCategory = _child$props.allowDuplicatedCategory, scale = _child$props.scale, ticks = _child$props.ticks, axisId = child.props[axisIdKey], displayedData = _this2.constructor.getDisplayedData(props, { graphicalItems: graphicalItems.filter(function(item) { return item.props[axisIdKey] === axisId; }), dataStartIndex: dataStartIndex, dataEndIndex: dataEndIndex }), len = displayedData.length; if (!result[axisId]) { var domain = void 0, duplicateDomain = void 0, categoricalDomain = void 0; if (dataKey) { if (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.n)(displayedData, dataKey, type), "category" === type && isCategorial) { var duplicate = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.e)(domain); allowDuplicatedCategory && duplicate ? (duplicateDomain = domain, domain = __WEBPACK_IMPORTED_MODULE_2_lodash_range___default()(0, len)) : allowDuplicatedCategory || (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.y)(child.props.domain, domain, child).reduce(function(finalDomain, entry) { return finalDomain.indexOf(entry) >= 0 ? finalDomain : [].concat(_toConsumableArray(finalDomain), [ entry ]); }, [])); } else if ("category" === type) domain = allowDuplicatedCategory ? domain.filter(function(entry) { return "" !== entry && !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(entry); }) : Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.y)(child.props.domain, domain, child).reduce(function(finalDomain, entry) { return finalDomain.indexOf(entry) >= 0 || "" === entry || __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(entry) ? finalDomain : [].concat(_toConsumableArray(finalDomain), [ entry ]); }, []); else if ("number" === type) { var errorBarsDomain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.z)(displayedData, graphicalItems.filter(function(item) { return item.props[axisIdKey] === axisId && !item.props.hide; }), dataKey, axisType); errorBarsDomain && (domain = errorBarsDomain); } !isCategorial || "number" !== type && "auto" === scale || (categoricalDomain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.n)(displayedData, dataKey, "category")); } else domain = isCategorial ? __WEBPACK_IMPORTED_MODULE_2_lodash_range___default()(0, len) : stackGroups && stackGroups[axisId] && stackGroups[axisId].hasStack && "number" === type ? "expand" === stackOffset ? [ 0, 1 ] : Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.p)(stackGroups[axisId].stackGroups, dataStartIndex, dataEndIndex) : Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.o)(displayedData, graphicalItems.filter(function(item) { return item.props[axisIdKey] === axisId && !item.props.hide; }), type, !0); return "number" === type && (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.e)(children, domain, axisId, axisType, ticks), child.props.domain && (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.B)(child.props.domain, domain, allowDataOverflow))), _extends({}, result, _defineProperty({}, axisId, _extends({}, child.props, { axisType: axisType, domain: domain, categoricalDomain: categoricalDomain, duplicateDomain: duplicateDomain, originalDomain: child.props.domain, isCategorial: isCategorial, layout: layout }))); } return result; }, {}); } }, { key: "getAxisMapByItems", value: function(props, _ref4) { var graphicalItems = _ref4.graphicalItems, Axis = _ref4.Axis, axisType = _ref4.axisType, axisIdKey = _ref4.axisIdKey, stackGroups = _ref4.stackGroups, dataStartIndex = _ref4.dataStartIndex, dataEndIndex = _ref4.dataEndIndex, layout = props.layout, children = props.children, displayedData = this.constructor.getDisplayedData(props, { graphicalItems: graphicalItems, dataStartIndex: dataStartIndex, dataEndIndex: dataEndIndex }), len = displayedData.length, isCategorial = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.x)(layout, axisType), index = -1; return graphicalItems.reduce(function(result, child) { var axisId = child.props[axisIdKey]; if (!result[axisId]) { index++; var domain = void 0; return isCategorial ? domain = __WEBPACK_IMPORTED_MODULE_2_lodash_range___default()(0, len) : stackGroups && stackGroups[axisId] && stackGroups[axisId].hasStack ? (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.p)(stackGroups[axisId].stackGroups, dataStartIndex, dataEndIndex), domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.e)(children, domain, axisId, axisType)) : (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.B)(Axis.defaultProps.domain, Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.o)(displayedData, graphicalItems.filter(function(item) { return item.props[axisIdKey] === axisId && !item.props.hide; }), "number"), Axis.defaultProps.allowDataOverflow), domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.e)(children, domain, axisId, axisType)), _extends({}, result, _defineProperty({}, axisId, _extends({ axisType: axisType }, Axis.defaultProps, { hide: !0, orientation: ORIENT_MAP[axisType] && ORIENT_MAP[axisType][index % 2], domain: domain, originalDomain: Axis.defaultProps.domain, isCategorial: isCategorial, layout: layout }))); } return result; }, {}); } }, { key: "getActiveCoordinate", value: function(tooltipTicks, activeIndex, rangeObj) { var layout = this.props.layout, entry = tooltipTicks.find(function(tick) { return tick && tick.index === activeIndex; }); if (entry) { if ("horizontal" === layout) return { x: entry.coordinate, y: rangeObj.y }; if ("vertical" === layout) return { x: rangeObj.x, y: entry.coordinate }; if ("centric" === layout) { var _angle = entry.coordinate, _radius = rangeObj.radius; return _extends({}, rangeObj, Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(rangeObj.cx, rangeObj.cy, _radius, _angle), { angle: _angle, radius: _radius }); } var radius = entry.coordinate, angle = rangeObj.angle; return _extends({}, rangeObj, Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(rangeObj.cx, rangeObj.cy, radius, angle), { angle: angle, radius: radius }); } return originCoordinate; } }, { key: "getMouseInfo", value: function(event) { if (!this.container) return null; var containerOffset = Object(__WEBPACK_IMPORTED_MODULE_20__util_DOMUtils__.b)(this.container), e = Object(__WEBPACK_IMPORTED_MODULE_20__util_DOMUtils__.a)(event, containerOffset), rangeObj = this.inRange(e.chartX, e.chartY); if (!rangeObj) return null; var _state2 = this.state, xAxisMap = _state2.xAxisMap, yAxisMap = _state2.yAxisMap; if ("axis" !== eventType && xAxisMap && yAxisMap) { var xScale = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(xAxisMap).scale, yScale = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(yAxisMap).scale, xValue = xScale && xScale.invert ? xScale.invert(e.chartX) : null, yValue = yScale && yScale.invert ? yScale.invert(e.chartY) : null; return _extends({}, e, { xValue: xValue, yValue: yValue }); } var _state3 = this.state, ticks = _state3.orderedTooltipTicks, axis = _state3.tooltipAxis, tooltipTicks = _state3.tooltipTicks, pos = this.calculateTooltipPos(rangeObj), activeIndex = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.b)(pos, ticks, tooltipTicks, axis); if (activeIndex >= 0 && tooltipTicks) { var activeLabel = tooltipTicks[activeIndex] && tooltipTicks[activeIndex].value, activePayload = this.getTooltipContent(activeIndex, activeLabel), activeCoordinate = this.getActiveCoordinate(ticks, activeIndex, rangeObj); return _extends({}, e, { activeTooltipIndex: activeIndex, activeLabel: activeLabel, activePayload: activePayload, activeCoordinate: activeCoordinate }); } return null; } }, { key: "getTooltipContent", value: function(activeIndex, activeLabel) { var _state4 = this.state, graphicalItems = _state4.graphicalItems, tooltipAxis = _state4.tooltipAxis, displayedData = this.constructor.getDisplayedData(this.props, this.state); return activeIndex < 0 || !graphicalItems || !graphicalItems.length || activeIndex >= displayedData.length ? null : graphicalItems.reduce(function(result, child) { if (child.props.hide) return result; var _child$props2 = child.props, dataKey = _child$props2.dataKey, name = _child$props2.name, unit = _child$props2.unit, formatter = _child$props2.formatter, data = _child$props2.data, payload = void 0; return payload = tooltipAxis.dataKey && !tooltipAxis.allowDuplicatedCategory ? Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.a)(data || displayedData, tooltipAxis.dataKey, activeLabel) : displayedData[activeIndex], payload ? [].concat(_toConsumableArray(result), [ _extends({}, Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.k)(child), { dataKey: dataKey, unit: unit, formatter: formatter, name: name || dataKey, color: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.r)(child), value: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.w)(payload, dataKey), payload: payload }) ]) : result; }, []); } }, { key: "getFormatItems", value: function(props, currentState) { var _this3 = this, graphicalItems = currentState.graphicalItems, stackGroups = currentState.stackGroups, offset = currentState.offset, updateId = currentState.updateId, dataStartIndex = currentState.dataStartIndex, dataEndIndex = currentState.dataEndIndex, barSize = props.barSize, layout = props.layout, barGap = props.barGap, barCategoryGap = props.barCategoryGap, globalMaxBarSize = props.maxBarSize, _getAxisNameByLayout = this.getAxisNameByLayout(layout), numericAxisName = _getAxisNameByLayout.numericAxisName, cateAxisName = _getAxisNameByLayout.cateAxisName, hasBar = this.constructor.hasBar(graphicalItems), sizeList = hasBar && Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.i)({ barSize: barSize, stackGroups: stackGroups }), formatedItems = []; return graphicalItems.forEach(function(item, index) { var displayedData = _this3.constructor.getDisplayedData(props, { dataStartIndex: dataStartIndex, dataEndIndex: dataEndIndex }, item), _item$props = item.props, dataKey = _item$props.dataKey, childMaxBarSize = _item$props.maxBarSize, numericAxisId = item.props[numericAxisName + "Id"], cateAxisId = item.props[cateAxisName + "Id"], axisObj = axisComponents.reduce(function(result, entry) { var _extends4, axisMap = currentState[entry.axisType + "Map"], id = item.props[entry.axisType + "Id"], axis = axisMap && axisMap[id]; return _extends({}, result, (_extends4 = {}, _defineProperty(_extends4, entry.axisType, axis), _defineProperty(_extends4, entry.axisType + "Ticks", Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(axis)), _extends4)); }, {}), cateAxis = axisObj[cateAxisName], cateTicks = axisObj[cateAxisName + "Ticks"], stackedData = stackGroups && stackGroups[numericAxisId] && stackGroups[numericAxisId].hasStack && Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.t)(item, stackGroups[numericAxisId].stackGroups), bandSize = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.g)(cateAxis, cateTicks), maxBarSize = __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(childMaxBarSize) ? globalMaxBarSize : childMaxBarSize, barPosition = hasBar && Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.h)({ barGap: barGap, barCategoryGap: barCategoryGap, bandSize: bandSize, sizeList: sizeList[cateAxisId], maxBarSize: maxBarSize }), componsedFn = item && item.type && item.type.getComposedData; if (componsedFn) { var _extends5; formatedItems.push({ props: _extends({}, componsedFn(_extends({}, axisObj, { displayedData: displayedData, props: props, dataKey: dataKey, item: item, bandSize: bandSize, barPosition: barPosition, offset: offset, stackedData: stackedData, layout: layout, dataStartIndex: dataStartIndex, dataEndIndex: dataEndIndex, onItemMouseLeave: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.d)(_this3.handleItemMouseLeave, null, item.props.onMouseLeave), onItemMouseEnter: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.d)(_this3.handleItemMouseEnter, null, item.props.onMouseEnter) })), (_extends5 = { key: item.key || "item-" + index }, _defineProperty(_extends5, numericAxisName, axisObj[numericAxisName]), _defineProperty(_extends5, cateAxisName, axisObj[cateAxisName]), _defineProperty(_extends5, "animationId", updateId), _extends5)), childIndex: Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.o)(item, props.children), item: item }); } }), formatedItems; } }, { key: "getCursorRectangle", value: function() { var layout = this.props.layout, _state5 = this.state, activeCoordinate = _state5.activeCoordinate, offset = _state5.offset, tooltipAxisBandSize = _state5.tooltipAxisBandSize, halfSize = tooltipAxisBandSize / 2; return { stroke: "none", fill: "#ccc", x: "horizontal" === layout ? activeCoordinate.x - halfSize : offset.left + .5, y: "horizontal" === layout ? offset.top + .5 : activeCoordinate.y - halfSize, width: "horizontal" === layout ? tooltipAxisBandSize : offset.width - 1, height: "horizontal" === layout ? offset.height - 1 : tooltipAxisBandSize }; } }, { key: "getCursorPoints", value: function() { var layout = this.props.layout, _state6 = this.state, activeCoordinate = _state6.activeCoordinate, offset = _state6.offset, x1 = void 0, y1 = void 0, x2 = void 0, y2 = void 0; if ("horizontal" === layout) x1 = activeCoordinate.x, x2 = x1, y1 = offset.top, y2 = offset.top + offset.height; else if ("vertical" === layout) y1 = activeCoordinate.y, y2 = y1, x1 = offset.left, x2 = offset.left + offset.width; else if (!__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(activeCoordinate.cx) || !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(activeCoordinate.cy)) { if ("centric" !== layout) { var _cx = activeCoordinate.cx, _cy = activeCoordinate.cy, radius = activeCoordinate.radius, startAngle = activeCoordinate.startAngle, endAngle = activeCoordinate.endAngle, startPoint = Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(_cx, _cy, radius, startAngle), endPoint = Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(_cx, _cy, radius, endAngle); return { points: [ startPoint, endPoint ], cx: _cx, cy: _cy, radius: radius, startAngle: startAngle, endAngle: endAngle }; } var cx = activeCoordinate.cx, cy = activeCoordinate.cy, innerRadius = activeCoordinate.innerRadius, outerRadius = activeCoordinate.outerRadius, angle = activeCoordinate.angle, innerPoint = Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(cx, cy, innerRadius, angle), outerPoint = Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(cx, cy, outerRadius, angle); x1 = innerPoint.x, y1 = innerPoint.y, x2 = outerPoint.x, y2 = outerPoint.y; } return [ { x: x1, y: y1 }, { x: x2, y: y2 } ]; } }, { key: "getAxisNameByLayout", value: function(layout) { return "horizontal" === layout ? { numericAxisName: "yAxis", cateAxisName: "xAxis" } : "vertical" === layout ? { numericAxisName: "xAxis", cateAxisName: "yAxis" } : "centric" === layout ? { numericAxisName: "radiusAxis", cateAxisName: "angleAxis" } : { numericAxisName: "angleAxis", cateAxisName: "radiusAxis" }; } }, { key: "calculateTooltipPos", value: function(rangeObj) { var layout = this.props.layout; return "horizontal" === layout ? rangeObj.x : "vertical" === layout ? rangeObj.y : "centric" === layout ? rangeObj.angle : rangeObj.radius; } }, { key: "inRange", value: function(x, y) { var layout = this.props.layout; if ("horizontal" === layout || "vertical" === layout) { var offset = this.state.offset; return x >= offset.left && x <= offset.left + offset.width && y >= offset.top && y <= offset.top + offset.height ? { x: x, y: y } : null; } var _state7 = this.state, angleAxisMap = _state7.angleAxisMap, radiusAxisMap = _state7.radiusAxisMap; if (angleAxisMap && radiusAxisMap) { var angleAxis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(angleAxisMap); return Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.d)({ x: x, y: y }, angleAxis); } return null; } }, { key: "parseEventsOfWrapper", value: function() { var children = this.props.children, tooltipItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_10__component_Tooltip__.a), tooltipEvents = tooltipItem && "axis" === eventType ? { onMouseEnter: this.handleMouseEnter, onMouseMove: this.handleMouseMove, onMouseLeave: this.handleMouseLeave, onTouchMove: this.handleTouchMove } : {}, outerEvents = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.e)(this.props, this.handleOuterEvent); return _extends({}, outerEvents, tooltipEvents); } }, { key: "updateStateOfAxisMapsOffsetAndStackGroups", value: function(_ref5) { var _this4 = this, props = _ref5.props, dataStartIndex = _ref5.dataStartIndex, dataEndIndex = _ref5.dataEndIndex, updateId = _ref5.updateId; if (!Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.q)({ props: props })) return null; var children = props.children, layout = props.layout, stackOffset = props.stackOffset, data = props.data, reverseStackOrder = props.reverseStackOrder, _getAxisNameByLayout2 = this.getAxisNameByLayout(layout), numericAxisName = _getAxisNameByLayout2.numericAxisName, cateAxisName = _getAxisNameByLayout2.cateAxisName, graphicalItems = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.h)(children, GraphicalChild), stackGroups = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.s)(data, graphicalItems, numericAxisName + "Id", cateAxisName + "Id", stackOffset, reverseStackOrder), axisObj = axisComponents.reduce(function(result, entry) { var name = entry.axisType + "Map"; return _extends({}, result, _defineProperty({}, name, _this4.getAxisMap(props, _extends({}, entry, { graphicalItems: graphicalItems, stackGroups: entry.axisType === numericAxisName && stackGroups, dataStartIndex: dataStartIndex, dataEndIndex: dataEndIndex })))); }, {}), offset = this.calculateOffset(_extends({}, axisObj, { props: props, graphicalItems: graphicalItems })); Object.keys(axisObj).forEach(function(key) { axisObj[key] = formatAxisMap(props, axisObj[key], offset, key.replace("Map", ""), chartName); }); var cateAxisMap = axisObj[cateAxisName + "Map"], ticksObj = this.tooltipTicksGenerator(cateAxisMap), formatedGraphicalItems = this.getFormatItems(props, _extends({}, axisObj, { dataStartIndex: dataStartIndex, dataEndIndex: dataEndIndex, updateId: updateId, graphicalItems: graphicalItems, stackGroups: stackGroups, offset: offset })); return _extends({ formatedGraphicalItems: formatedGraphicalItems, graphicalItems: graphicalItems, offset: offset, stackGroups: stackGroups }, ticksObj, axisObj); } }, { key: "addListener", value: function() { __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.on(__WEBPACK_IMPORTED_MODULE_25__util_Events__.a, this.handleReceiveSyncEvent), __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.setMaxListeners && __WEBPACK_IMPORTED_MODULE_25__util_Events__.b._maxListeners && __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.setMaxListeners(__WEBPACK_IMPORTED_MODULE_25__util_Events__.b._maxListeners + 1); } }, { key: "removeListener", value: function() { __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.removeListener(__WEBPACK_IMPORTED_MODULE_25__util_Events__.a, this.handleReceiveSyncEvent), __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.setMaxListeners && __WEBPACK_IMPORTED_MODULE_25__util_Events__.b._maxListeners && __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.setMaxListeners(__WEBPACK_IMPORTED_MODULE_25__util_Events__.b._maxListeners - 1); } }, { key: "calculateOffset", value: function(_ref6) { var props = _ref6.props, graphicalItems = _ref6.graphicalItems, _ref6$xAxisMap = _ref6.xAxisMap, xAxisMap = void 0 === _ref6$xAxisMap ? {} : _ref6$xAxisMap, _ref6$yAxisMap = _ref6.yAxisMap, yAxisMap = void 0 === _ref6$yAxisMap ? {} : _ref6$yAxisMap, width = props.width, height = props.height, children = props.children, margin = props.margin || {}, brushItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_19__cartesian_Brush__.a), legendItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_11__component_Legend__.a), offsetH = Object.keys(yAxisMap).reduce(function(result, id) { var entry = yAxisMap[id], orientation = entry.orientation; return entry.mirror || entry.hide ? result : _extends({}, result, _defineProperty({}, orientation, result[orientation] + entry.width)); }, { left: margin.left || 0, right: margin.right || 0 }), offsetV = Object.keys(xAxisMap).reduce(function(result, id) { var entry = xAxisMap[id], orientation = entry.orientation; return entry.mirror || entry.hide ? result : _extends({}, result, _defineProperty({}, orientation, result[orientation] + entry.height)); }, { top: margin.top || 0, bottom: margin.bottom || 0 }), offset = _extends({}, offsetV, offsetH), brushBottom = offset.bottom; if (brushItem && (offset.bottom += brushItem.props.height || __WEBPACK_IMPORTED_MODULE_19__cartesian_Brush__.a.defaultProps.height), legendItem && this.legendInstance) { var legendBox = this.legendInstance.getBBox(); offset = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.a)(offset, graphicalItems, props, legendBox); } return _extends({ brushBottom: brushBottom }, offset, { width: width - offset.left - offset.right, height: height - offset.top - offset.bottom }); } }, { key: "triggerSyncEvent", value: function(data) { var syncId = this.props.syncId; __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(syncId) || __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.emit(__WEBPACK_IMPORTED_MODULE_25__util_Events__.a, syncId, this.uniqueChartId, data); } }, { key: "filterFormatItem", value: function(item, displayName, childIndex) { for (var formatedGraphicalItems = this.state.formatedGraphicalItems, i = 0, len = formatedGraphicalItems.length; i < len; i++) { var entry = formatedGraphicalItems[i]; if (entry.item === item || entry.props.key === item.key || displayName === Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.j)(entry.item.type) && childIndex === entry.childIndex) return entry; } return null; } }, { key: "renderAxis", value: function(axisOptions, element, displayName, index) { var _props2 = this.props, width = _props2.width, height = _props2.height; return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__.a, _extends({}, axisOptions, { className: "recharts-" + axisOptions.axisType + " " + axisOptions.axisType, key: element.key || displayName + "-" + index, viewBox: { x: 0, y: 0, width: width, height: height }, ticksGenerator: this.axesTicksGenerator })); } }, { key: "renderLegend", value: function() { var _this5 = this, formatedGraphicalItems = this.state.formatedGraphicalItems, _props3 = this.props, children = _props3.children, width = _props3.width, height = _props3.height, margin = this.props.margin || {}, legendWidth = width - (margin.left || 0) - (margin.right || 0), legendHeight = height - (margin.top || 0) - (margin.bottom || 0), props = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.q)({ children: children, formatedGraphicalItems: formatedGraphicalItems, legendWidth: legendWidth, legendHeight: legendHeight, legendContent: legendContent }); if (!props) return null; var item = props.item, otherProps = _objectWithoutProperties(props, [ "item" ]); return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(item, _extends({}, otherProps, { chartWidth: width, chartHeight: height, margin: margin, ref: function(legend) { _this5.legendInstance = legend; }, onBBoxUpdate: this.handleLegendBBoxUpdate })); } }, { key: "renderTooltip", value: function() { var children = this.props.children, tooltipItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_10__component_Tooltip__.a); if (!tooltipItem) return null; var _state8 = this.state, isTooltipActive = _state8.isTooltipActive, activeCoordinate = _state8.activeCoordinate, activePayload = _state8.activePayload, activeLabel = _state8.activeLabel, offset = _state8.offset; return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(tooltipItem, { viewBox: _extends({}, offset, { x: offset.left, y: offset.top }), active: isTooltipActive, label: activeLabel, payload: isTooltipActive ? activePayload : [], coordinate: activeCoordinate }); } }, { key: "renderActiveDot", value: function(option, props) { var dot = void 0; return dot = Object(__WEBPACK_IMPORTED_MODULE_5_react__.isValidElement)(option) ? Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(option, props) : __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_15__shape_Dot__.a, props), __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__container_Layer__.a, { className: "recharts-active-dot", key: props.key }, dot); } }, { key: "renderActivePoints", value: function(_ref7) { var item = _ref7.item, activePoint = _ref7.activePoint, basePoint = _ref7.basePoint, childIndex = _ref7.childIndex, isRange = _ref7.isRange, result = [], key = item.props.key, _item$item$props = item.item.props, activeDot = _item$item$props.activeDot, dataKey = _item$item$props.dataKey, dotProps = _extends({ index: childIndex, dataKey: dataKey, cx: activePoint.x, cy: activePoint.y, r: 4, fill: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.r)(item.item), strokeWidth: 2, stroke: "#fff", payload: activePoint.payload, value: activePoint.value, key: key + "-activePoint-" + childIndex }, Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.k)(activeDot), Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.e)(activeDot)); return result.push(this.renderActiveDot(activeDot, dotProps, childIndex)), basePoint ? result.push(this.renderActiveDot(activeDot, _extends({}, dotProps, { cx: basePoint.x, cy: basePoint.y, key: key + "-basePoint-" + childIndex }), childIndex)) : isRange && result.push(null), result; } }, { key: "render", value: function() { var _this6 = this; if (!Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.q)(this)) return null; var _props4 = this.props, children = _props4.children, className = _props4.className, width = _props4.width, height = _props4.height, style = _props4.style, compact = _props4.compact, others = _objectWithoutProperties(_props4, [ "children", "className", "width", "height", "style", "compact" ]), attrs = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.k)(others), map = { CartesianGrid: { handler: this.renderGrid, once: !0 }, ReferenceArea: { handler: this.renderReferenceElement }, ReferenceLine: { handler: this.renderReferenceElement }, ReferenceDot: { handler: this.renderReferenceElement }, XAxis: { handler: this.renderXAxis }, YAxis: { handler: this.renderYAxis }, Brush: { handler: this.renderBrush, once: !0 }, Bar: { handler: this.renderGraphicChild }, Line: { handler: this.renderGraphicChild }, Area: { handler: this.renderGraphicChild }, Radar: { handler: this.renderGraphicChild }, RadialBar: { handler: this.renderGraphicChild }, Scatter: { handler: this.renderGraphicChild }, Pie: { handler: this.renderGraphicChild }, Tooltip: { handler: this.renderCursor, once: !0 }, PolarGrid: { handler: this.renderPolarGrid, once: !0 }, PolarAngleAxis: { handler: this.renderPolarAxis }, PolarRadiusAxis: { handler: this.renderPolarAxis } }; if (compact) return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Surface__.a, _extends({}, attrs, { width: width, height: height }), Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.p)(children, map)); var events = this.parseEventsOfWrapper(); return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement("div", _extends({ className: __WEBPACK_IMPORTED_MODULE_7_classnames___default()("recharts-wrapper", className), style: _extends({}, style, { position: "relative", cursor: "default", width: width, height: height }) }, events, { ref: function(node) { _this6.container = node; } }), __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Surface__.a, _extends({}, attrs, { width: width, height: height }), Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.p)(children, map)), this.renderLegend(), this.renderTooltip()); } } ]), CategoricalChartWrapper; }(__WEBPACK_IMPORTED_MODULE_5_react__.Component), _class.displayName = chartName, _class.propTypes = _extends({ syncId: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number ]), compact: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool, width: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, height: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, data: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object), layout: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "horizontal", "vertical" ]), stackOffset: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "sign", "expand", "none", "wiggle", "silhouette" ]), throttleDelay: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, margin: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.shape({ top: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, right: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, bottom: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, left: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number }), barCategoryGap: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), barGap: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), barSize: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), maxBarSize: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, style: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object, className: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, children: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.node), __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.node ]), onClick: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, onMouseLeave: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, onMouseEnter: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, onMouseMove: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, onMouseDown: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, onMouseUp: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, reverseStackOrder: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool, id: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string }, propTypes), _class.defaultProps = _extends({ layout: "horizontal", stackOffset: "none", barCategoryGap: "10%", barGap: 4, margin: { top: 5, right: 5, bottom: 5, left: 5 }, reverseStackOrder: !1 }, defaultProps), _class.createDefaultState = function(props) { var children = props.children, brushItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_19__cartesian_Brush__.a); return { chartX: 0, chartY: 0, dataStartIndex: brushItem && brushItem.props && brushItem.props.startIndex || 0, dataEndIndex: brushItem && brushItem.props && brushItem.props.endIndex || props.data && props.data.length - 1 || 0, activeTooltipIndex: -1, isTooltipActive: !1 }; }, _class.hasBar = function(graphicalItems) { return !(!graphicalItems || !graphicalItems.length) && graphicalItems.some(function(item) { var name = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.j)(item && item.type); return name && name.indexOf("Bar") >= 0; }); }, _class.getDisplayedData = function(props, _ref8, item) { var graphicalItems = _ref8.graphicalItems, dataStartIndex = _ref8.dataStartIndex, dataEndIndex = _ref8.dataEndIndex, itemsData = (graphicalItems || []).reduce(function(result, child) { var itemData = child.props.data; return itemData && itemData.length ? [].concat(_toConsumableArray(result), _toConsumableArray(itemData)) : result; }, []); if (itemsData && itemsData.length > 0) return itemsData; if (item && item.props && item.props.data && item.props.data.length > 0) return item.props.data; var data = props.data; return data && data.length && Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(dataStartIndex) && Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(dataEndIndex) ? data.slice(dataStartIndex, dataEndIndex + 1) : []; }, _initialiseProps = function() { var _this7 = this; this.handleLegendBBoxUpdate = function(box) { if (box && _this7.legendInstance) { var _state9 = _this7.state, dataStartIndex = _state9.dataStartIndex, dataEndIndex = _state9.dataEndIndex, updateId = _state9.updateId; _this7.setState(_this7.updateStateOfAxisMapsOffsetAndStackGroups({ props: _this7.props, dataStartIndex: dataStartIndex, dataEndIndex: dataEndIndex, updateId: updateId })); } }, this.handleReceiveSyncEvent = function(cId, chartId, data) { var _props5 = _this7.props, syncId = _props5.syncId, layout = _props5.layout, updateId = _this7.state.updateId; if (syncId === cId && chartId !== _this7.uniqueChartId) { var dataStartIndex = data.dataStartIndex, dataEndIndex = data.dataEndIndex; if (__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(data.dataStartIndex) && __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(data.dataEndIndex)) if (__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(data.activeTooltipIndex)) _this7.setState(data); else { var chartX = data.chartX, chartY = data.chartY, activeTooltipIndex = data.activeTooltipIndex, _state10 = _this7.state, offset = _state10.offset, tooltipTicks = _state10.tooltipTicks; if (!offset) return; var viewBox = _extends({}, offset, { x: offset.left, y: offset.top }), validateChartX = Math.min(chartX, viewBox.x + viewBox.width), validateChartY = Math.min(chartY, viewBox.y + viewBox.height), activeLabel = tooltipTicks[activeTooltipIndex] && tooltipTicks[activeTooltipIndex].value, activePayload = _this7.getTooltipContent(activeTooltipIndex), activeCoordinate = tooltipTicks[activeTooltipIndex] ? { x: "horizontal" === layout ? tooltipTicks[activeTooltipIndex].coordinate : validateChartX, y: "horizontal" === layout ? validateChartY : tooltipTicks[activeTooltipIndex].coordinate } : originCoordinate; _this7.setState(_extends({}, data, { activeLabel: activeLabel, activeCoordinate: activeCoordinate, activePayload: activePayload })); } else _this7.setState(_extends({ dataStartIndex: dataStartIndex, dataEndIndex: dataEndIndex }, _this7.updateStateOfAxisMapsOffsetAndStackGroups({ props: _this7.props, dataStartIndex: dataStartIndex, dataEndIndex: dataEndIndex, updateId: updateId }))); } }, this.handleBrushChange = function(_ref9) { var startIndex = _ref9.startIndex, endIndex = _ref9.endIndex; if (startIndex !== _this7.state.dataStartIndex || endIndex !== _this7.state.dataEndIndex) { var updateId = _this7.state.updateId; _this7.setState(function() { return _extends({ dataStartIndex: startIndex, dataEndIndex: endIndex }, _this7.updateStateOfAxisMapsOffsetAndStackGroups({ props: _this7.props, dataStartIndex: startIndex, dataEndIndex: endIndex, updateId: updateId })); }), _this7.triggerSyncEvent({ dataStartIndex: startIndex, dataEndIndex: endIndex }); } }, this.handleMouseEnter = function(e) { var onMouseEnter = _this7.props.onMouseEnter, mouse = _this7.getMouseInfo(e); if (mouse) { var nextState = _extends({}, mouse, { isTooltipActive: !0 }); _this7.setState(nextState), _this7.triggerSyncEvent(nextState), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onMouseEnter) && onMouseEnter(nextState, e); } }, this.triggeredAfterMouseMove = function(e) { var onMouseMove = _this7.props.onMouseMove, mouse = _this7.getMouseInfo(e), nextState = mouse ? _extends({}, mouse, { isTooltipActive: !0 }) : { isTooltipActive: !1 }; _this7.setState(nextState), _this7.triggerSyncEvent(nextState), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onMouseMove) && onMouseMove(nextState, e); }, this.handleItemMouseEnter = function(el) { _this7.setState(function() { return { isTooltipActive: !0, activeItem: el, activePayload: el.tooltipPayload, activeCoordinate: el.tooltipPosition || { x: el.cx, y: el.cy } }; }); }, this.handleItemMouseLeave = function() { _this7.setState(function() { return { isTooltipActive: !1 }; }); }, this.handleMouseMove = function(e) { e && __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(e.persist) && e.persist(), _this7.triggeredAfterMouseMove(e); }, this.handleMouseLeave = function(e) { var onMouseLeave = _this7.props.onMouseLeave, nextState = { isTooltipActive: !1 }; _this7.setState(nextState), _this7.triggerSyncEvent(nextState), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onMouseLeave) && onMouseLeave(nextState, e); }, this.handleOuterEvent = function(e) { var eventName = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.l)(e); if (eventName && __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(_this7.props[eventName])) { var mouse = _this7.getMouseInfo(e); (0, _this7.props[eventName])(mouse, e); } }, this.handleClick = function(e) { var onClick = _this7.props.onClick; if (__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onClick)) { onClick(_this7.getMouseInfo(e), e); } }, this.handleMouseDown = function(e) { var onMouseDown = _this7.props.onMouseDown; if (__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onMouseDown)) { onMouseDown(_this7.getMouseInfo(e), e); } }, this.handleMouseUp = function(e) { var onMouseUp = _this7.props.onMouseUp; if (__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onMouseUp)) { onMouseUp(_this7.getMouseInfo(e), e); } }, this.handleTouchMove = function(e) { null != e.changedTouches && e.changedTouches.length > 0 && _this7.handleMouseMove(e.changedTouches[0]); }, this.verticalCoordinatesGenerator = function(_ref10) { var xAxis = _ref10.xAxis, width = _ref10.width, height = _ref10.height, offset = _ref10.offset; return Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.m)(__WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__.a.getTicks(_extends({}, __WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__.a.defaultProps, xAxis, { ticks: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(xAxis, !0), viewBox: { x: 0, y: 0, width: width, height: height } })), offset.left, offset.left + offset.width); }, this.horizontalCoordinatesGenerator = function(_ref11) { var yAxis = _ref11.yAxis, width = _ref11.width, height = _ref11.height, offset = _ref11.offset; return Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.m)(__WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__.a.getTicks(_extends({}, __WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__.a.defaultProps, yAxis, { ticks: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(yAxis, !0), viewBox: { x: 0, y: 0, width: width, height: height } })), offset.top, offset.top + offset.height); }, this.axesTicksGenerator = function(axis) { return Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(axis, !0); }, this.tooltipTicksGenerator = function(axisMap) { var axis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(axisMap), tooltipTicks = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(axis, !1, !0); return { tooltipTicks: tooltipTicks, orderedTooltipTicks: __WEBPACK_IMPORTED_MODULE_0_lodash_sortBy___default()(tooltipTicks, function(o) { return o.coordinate; }), tooltipAxis: axis, tooltipAxisBandSize: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.g)(axis) }; }, this.renderCursor = function(element) { var _state11 = _this7.state, isTooltipActive = _state11.isTooltipActive, activeCoordinate = _state11.activeCoordinate, activePayload = _state11.activePayload, offset = _state11.offset; if (!(element && element.props.cursor && isTooltipActive && activeCoordinate)) return null; var layout = _this7.props.layout, restProps = void 0, cursorComp = __WEBPACK_IMPORTED_MODULE_12__shape_Curve__.a; if ("ScatterChart" === chartName) restProps = activeCoordinate, cursorComp = __WEBPACK_IMPORTED_MODULE_13__shape_Cross__.a; else if ("BarChart" === chartName) restProps = _this7.getCursorRectangle(), cursorComp = __WEBPACK_IMPORTED_MODULE_16__shape_Rectangle__.a; else if ("radial" === layout) { var _getCursorPoints = _this7.getCursorPoints(), cx = _getCursorPoints.cx, cy = _getCursorPoints.cy, radius = _getCursorPoints.radius, startAngle = _getCursorPoints.startAngle, endAngle = _getCursorPoints.endAngle; restProps = { cx: cx, cy: cy, startAngle: startAngle, endAngle: endAngle, innerRadius: radius, outerRadius: radius }, cursorComp = __WEBPACK_IMPORTED_MODULE_14__shape_Sector__.a; } else restProps = { points: _this7.getCursorPoints() }, cursorComp = __WEBPACK_IMPORTED_MODULE_12__shape_Curve__.a; var key = element.key || "_recharts-cursor", cursorProps = _extends({ stroke: "#ccc" }, offset, restProps, Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.k)(element.props.cursor), { payload: activePayload, key: key, className: "recharts-tooltip-cursor" }); return Object(__WEBPACK_IMPORTED_MODULE_5_react__.isValidElement)(element.props.cursor) ? Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element.props.cursor, cursorProps) : Object(__WEBPACK_IMPORTED_MODULE_5_react__.createElement)(cursorComp, cursorProps); }, this.renderPolarAxis = function(element, displayName, index) { var axisType = element.type.axisType, axisMap = _this7.state[axisType + "Map"], axisOption = axisMap[element.props[axisType + "Id"]]; return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, _extends({}, axisOption, { className: axisType, key: element.key || displayName + "-" + index, ticks: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(axisOption, !0) })); }, this.renderXAxis = function(element, displayName, index) { var xAxisMap = _this7.state.xAxisMap, axisObj = xAxisMap[element.props.xAxisId]; return _this7.renderAxis(axisObj, element, displayName, index); }, this.renderYAxis = function(element, displayName, index) { var yAxisMap = _this7.state.yAxisMap, axisObj = yAxisMap[element.props.yAxisId]; return _this7.renderAxis(axisObj, element, displayName, index); }, this.renderGrid = function(element) { var _state12 = _this7.state, xAxisMap = _state12.xAxisMap, yAxisMap = _state12.yAxisMap, offset = _state12.offset, _props6 = _this7.props, width = _props6.width, height = _props6.height, xAxis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(xAxisMap), yAxis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(yAxisMap), props = element.props || {}; return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, { key: element.key || "grid", x: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(props.x) ? props.x : offset.left, y: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(props.y) ? props.y : offset.top, width: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(props.width) ? props.width : offset.width, height: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(props.height) ? props.height : offset.height, xAxis: xAxis, yAxis: yAxis, offset: offset, chartWidth: width, chartHeight: height, verticalCoordinatesGenerator: _this7.verticalCoordinatesGenerator, horizontalCoordinatesGenerator: _this7.horizontalCoordinatesGenerator }); }, this.renderPolarGrid = function(element) { var _state13 = _this7.state, radiusAxisMap = _state13.radiusAxisMap, angleAxisMap = _state13.angleAxisMap, radiusAxis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(radiusAxisMap), angleAxis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(angleAxisMap), cx = angleAxis.cx, cy = angleAxis.cy, innerRadius = angleAxis.innerRadius, outerRadius = angleAxis.outerRadius; return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, { polarAngles: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(angleAxis, !0).map(function(entry) { return entry.coordinate; }), polarRadius: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(radiusAxis, !0).map(function(entry) { return entry.coordinate; }), cx: cx, cy: cy, innerRadius: innerRadius, outerRadius: outerRadius, key: element.key || "polar-grid" }); }, this.renderBrush = function(element) { var _props7 = _this7.props, margin = _props7.margin, data = _props7.data, _state14 = _this7.state, offset = _state14.offset, dataStartIndex = _state14.dataStartIndex, dataEndIndex = _state14.dataEndIndex, updateId = _state14.updateId; return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, { key: element.key || "_recharts-brush", onChange: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.d)(_this7.handleBrushChange, null, element.props.onChange), data: data, x: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(element.props.x) ? element.props.x : offset.left, y: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(element.props.y) ? element.props.y : offset.top + offset.height + offset.brushBottom - (margin.bottom || 0), width: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(element.props.width) ? element.props.width : offset.width, startIndex: dataStartIndex, endIndex: dataEndIndex, updateId: "brush-" + updateId }); }, this.renderReferenceElement = function(element, displayName, index) { if (!element) return null; var _state15 = _this7.state, xAxisMap = _state15.xAxisMap, yAxisMap = _state15.yAxisMap, offset = _state15.offset, _element$props = element.props, xAxisId = _element$props.xAxisId, yAxisId = _element$props.yAxisId; return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, { key: element.key || displayName + "-" + index, xAxis: xAxisMap[xAxisId], yAxis: yAxisMap[yAxisId], viewBox: { x: offset.left, y: offset.top, width: offset.width, height: offset.height } }); }, this.renderGraphicChild = function(element, displayName, index) { var item = _this7.filterFormatItem(element, displayName, index); if (!item) return null; var graphicalItem = Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, item.props), _state16 = _this7.state, isTooltipActive = _state16.isTooltipActive, tooltipAxis = _state16.tooltipAxis, activeTooltipIndex = _state16.activeTooltipIndex, activeLabel = _state16.activeLabel, children = _this7.props.children, tooltipItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_10__component_Tooltip__.a), _item$props2 = item.props, points = _item$props2.points, isRange = _item$props2.isRange, baseLine = _item$props2.baseLine, _item$item$props2 = item.item.props, activeDot = _item$item$props2.activeDot; if (!_item$item$props2.hide && isTooltipActive && tooltipItem && activeDot && activeTooltipIndex >= 0) { var activePoint = void 0, basePoint = void 0; if (tooltipAxis.dataKey && !tooltipAxis.allowDuplicatedCategory ? (activePoint = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.a)(points, "payload." + tooltipAxis.dataKey, activeLabel), basePoint = isRange && baseLine && Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.a)(baseLine, "payload." + tooltipAxis.dataKey, activeLabel)) : (activePoint = points[activeTooltipIndex], basePoint = isRange && baseLine && baseLine[activeTooltipIndex]), !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(activePoint)) return [ graphicalItem ].concat(_toConsumableArray(_this7.renderActivePoints({ item: item, activePoint: activePoint, basePoint: basePoint, childIndex: activeTooltipIndex, isRange: isRange }))); } return isRange ? [ graphicalItem, null, null ] : [ graphicalItem, null ]; }; }, _temp; }; __webpack_exports__.a = generateCategoricalChart; }, function(module, exports, __webpack_require__) { "use strict"; (function(process) { function invariant(condition, format, a, b, c, d, e, f) { if (validateFormat(format), !condition) { var error; if (void 0 === format) error = new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings."); else { var args = [ a, b, c, d, e, f ], argIndex = 0; error = new Error(format.replace(/%s/g, function() { return args[argIndex++]; })), error.name = "Invariant Violation"; } throw error.framesToPop = 1, error; } } var validateFormat = function(format) {}; "production" !== process.env.NODE_ENV && (validateFormat = function(format) { if (void 0 === format) throw new Error("invariant requires an error message argument"); }), module.exports = invariant; }).call(exports, __webpack_require__(2)); }, function(module, exports, __webpack_require__) { "use strict"; function makeEmptyFunction(arg) { return function() { return arg; }; } var emptyFunction = function() {}; emptyFunction.thatReturns = makeEmptyFunction, emptyFunction.thatReturnsFalse = makeEmptyFunction(!1), emptyFunction.thatReturnsTrue = makeEmptyFunction(!0), emptyFunction.thatReturnsNull = makeEmptyFunction(null), emptyFunction.thatReturnsThis = function() { return this; }, emptyFunction.thatReturnsArgument = function(arg) { return arg; }, module.exports = emptyFunction; }, function(module, exports, __webpack_require__) { var aFunction = __webpack_require__(223); module.exports = function(fn, that, length) { if (aFunction(fn), void 0 === that) return fn; switch (length) { case 1: return function(a) { return fn.call(that, a); }; case 2: return function(a, b) { return fn.call(that, a, b); }; case 3: return function(a, b, c) { return fn.call(that, a, b, c); }; } return function() { return fn.apply(that, arguments); }; }; }, function(module, exports, __webpack_require__) { var isObject = __webpack_require__(35); module.exports = function(it) { if (!isObject(it)) throw TypeError(it + " is not an object!"); return it; }; }, function(module, exports) { module.exports = function(exec) { try { return !!exec(); } catch (e) { return !0; } }; }, function(module, exports) { var hasOwnProperty = {}.hasOwnProperty; module.exports = function(it, key) { return hasOwnProperty.call(it, key); }; }, function(module, exports, __webpack_require__) { module.exports = { default: __webpack_require__(421), __esModule: !0 }; }, function(module, exports, __webpack_require__) { "use strict"; (function(process) { function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function capitalize(string) { if ("production" !== process.env.NODE_ENV && "string" != typeof string) throw new Error("Material-UI: capitalize(string) expects a string argument."); return string.charAt(0).toUpperCase() + string.slice(1); } function contains(obj, pred) { return (0, _keys2.default)(pred).every(function(key) { return obj.hasOwnProperty(key) && obj[key] === pred[key]; }); } function findIndex(arr, pred) { for (var predType = void 0 === pred ? "undefined" : (0, _typeof3.default)(pred), i = 0; i < arr.length; i += 1) { if ("function" === predType && !0 == !!pred(arr[i], i, arr)) return i; if ("object" === predType && contains(arr[i], pred)) return i; if (-1 !== [ "string", "number", "boolean" ].indexOf(predType)) return arr.indexOf(pred); } return -1; } function find(arr, pred) { var index = findIndex(arr, pred); return index > -1 ? arr[index] : void 0; } function createChainedFunction() { for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) funcs[_key] = arguments[_key]; return funcs.filter(function(func) { return null != func; }).reduce(function(acc, func) { return "production" !== process.env.NODE_ENV && (0, _warning2.default)("function" == typeof func, "Material-UI: invalid Argument Type, must only provide functions, undefined, or null."), function() { for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) args[_key2] = arguments[_key2]; acc.apply(this, args), func.apply(this, args); }; }, function() {}); } Object.defineProperty(exports, "__esModule", { value: !0 }); var _typeof2 = __webpack_require__(105), _typeof3 = _interopRequireDefault(_typeof2), _keys = __webpack_require__(55), _keys2 = _interopRequireDefault(_keys); exports.capitalize = capitalize, exports.contains = contains, exports.findIndex = findIndex, exports.find = find, exports.createChainedFunction = createChainedFunction; var _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning); }).call(exports, __webpack_require__(2)); }, function(module, exports, __webpack_require__) { function getNative(object, key) { var value = getValue(object, key); return baseIsNative(value) ? value : void 0; } var baseIsNative = __webpack_require__(611), getValue = __webpack_require__(614); module.exports = getNative; }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_exports__.a = function(x) { return function() { return x; }; }; }, function(module, exports, __webpack_require__) { function getNative(object, key) { var value = getValue(object, key); return baseIsNative(value) ? value : void 0; } var baseIsNative = __webpack_require__(668), getValue = __webpack_require__(673); module.exports = getNative; }, function(module, exports, __webpack_require__) { function baseGetTag(value) { return null == value ? void 0 === value ? undefinedTag : nullTag : symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value); } var Symbol = __webpack_require__(128), getRawTag = __webpack_require__(669), objectToString = __webpack_require__(670), nullTag = "[object Null]", undefinedTag = "[object Undefined]", symToStringTag = Symbol ? Symbol.toStringTag : void 0; module.exports = baseGetTag; }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]); return target; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); } function _possibleConstructorReturn(self, call) { if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !call || "object" != typeof call && "function" != typeof call ? self : call; } function _inherits(subClass, superClass) { if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: !1, writable: !0, configurable: !0 } }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass); } var _class, _temp2, __WEBPACK_IMPORTED_MODULE_0_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__), __WEBPACK_IMPORTED_MODULE_2_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_2_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_prop_types__), __WEBPACK_IMPORTED_MODULE_3_reduce_css_calc__ = __webpack_require__(771), __WEBPACK_IMPORTED_MODULE_3_reduce_css_calc___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_reduce_css_calc__), __WEBPACK_IMPORTED_MODULE_4_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_4_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_classnames__), __WEBPACK_IMPORTED_MODULE_5__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_7__util_DOMUtils__ = __webpack_require__(198), _extends = Object.assign || function(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); } return target; }, _createClass = function() { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); } } return function(Constructor, protoProps, staticProps) { return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), Constructor; }; }(), BREAKING_SPACES = /[ \f\n\r\t\v\u2028\u2029]+/, calculateWordWidths = function(props) { try { return { wordsWithComputedWidth: (__WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(props.children) ? [] : props.children.toString().split(BREAKING_SPACES)).map(function(word) { return { word: word, width: Object(__WEBPACK_IMPORTED_MODULE_7__util_DOMUtils__.c)(word, props.style).width }; }), spaceWidth: Object(__WEBPACK_IMPORTED_MODULE_7__util_DOMUtils__.c)(" ", props.style).width }; } catch (e) { return null; } }, Text = (_temp2 = _class = function(_Component) { function Text() { var _ref, _temp, _this, _ret; _classCallCheck(this, Text); for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key]; return _temp = _this = _possibleConstructorReturn(this, (_ref = Text.__proto__ || Object.getPrototypeOf(Text)).call.apply(_ref, [ this ].concat(args))), _this.state = { wordsByLines: [] }, _ret = _temp, _possibleConstructorReturn(_this, _ret); } return _inherits(Text, _Component), _createClass(Text, [ { key: "componentWillMount", value: function() { this.updateWordsByLines(this.props, !0); } }, { key: "componentWillReceiveProps", value: function(nextProps) { var needCalculate = this.props.children !== nextProps.children || this.props.style !== nextProps.style; this.updateWordsByLines(nextProps, needCalculate); } }, { key: "updateWordsByLines", value: function(props, needCalculate) { if (!props.width && !props.scaleToFit || Object(__WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.n)()) this.updateWordsWithoutCalculate(props); else { if (needCalculate) { var wordWidths = calculateWordWidths(props); if (!wordWidths) return void this.updateWordsWithoutCalculate(props); var wordsWithComputedWidth = wordWidths.wordsWithComputedWidth, spaceWidth = wordWidths.spaceWidth; this.wordsWithComputedWidth = wordsWithComputedWidth, this.spaceWidth = spaceWidth; } var wordsByLines = this.calculateWordsByLines(this.wordsWithComputedWidth, this.spaceWidth, props.width); this.setState({ wordsByLines: wordsByLines }); } } }, { key: "updateWordsWithoutCalculate", value: function(props) { var words = __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(props.children) ? [] : props.children.toString().split(BREAKING_SPACES); this.setState({ wordsByLines: [ { words: words } ] }); } }, { key: "calculateWordsByLines", value: function(wordsWithComputedWidth, spaceWidth, lineWidth) { var scaleToFit = this.props.scaleToFit; return wordsWithComputedWidth.reduce(function(result, _ref2) { var word = _ref2.word, width = _ref2.width, currentLine = result[result.length - 1]; if (currentLine && (null == lineWidth || scaleToFit || currentLine.width + width + spaceWidth < lineWidth)) currentLine.words.push(word), currentLine.width += width + spaceWidth; else { var newLine = { words: [ word ], width: width }; result.push(newLine); } return result; }, []); } }, { key: "render", value: function() { var _props = this.props, dx = _props.dx, dy = _props.dy, textAnchor = _props.textAnchor, verticalAnchor = _props.verticalAnchor, scaleToFit = _props.scaleToFit, angle = _props.angle, lineHeight = _props.lineHeight, capHeight = _props.capHeight, className = _props.className, textProps = _objectWithoutProperties(_props, [ "dx", "dy", "textAnchor", "verticalAnchor", "scaleToFit", "angle", "lineHeight", "capHeight", "className" ]), wordsByLines = this.state.wordsByLines; if (!Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.g)(textProps.x) || !Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.g)(textProps.y)) return null; var x = textProps.x + (Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.h)(dx) ? dx : 0), y = textProps.y + (Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.h)(dy) ? dy : 0), startDy = void 0; switch (verticalAnchor) { case "start": startDy = __WEBPACK_IMPORTED_MODULE_3_reduce_css_calc___default()("calc(" + capHeight + ")"); break; case "middle": startDy = __WEBPACK_IMPORTED_MODULE_3_reduce_css_calc___default()("calc(" + (wordsByLines.length - 1) / 2 + " * -" + lineHeight + " + (" + capHeight + " / 2))"); break; default: startDy = __WEBPACK_IMPORTED_MODULE_3_reduce_css_calc___default()("calc(" + (wordsByLines.length - 1) + " * -" + lineHeight + ")"); } var transforms = []; if (scaleToFit) { var lineWidth = wordsByLines[0].width; transforms.push("scale(" + this.props.width / lineWidth + ")"); } return angle && transforms.push("rotate(" + angle + ", " + x + ", " + y + ")"), transforms.length && (textProps.transform = transforms.join(" ")), __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("text", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.k)(textProps), { x: x, y: y, className: __WEBPACK_IMPORTED_MODULE_4_classnames___default()("recharts-text", className), textAnchor: textAnchor }), wordsByLines.map(function(line, index) { return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("tspan", { x: x, dy: 0 === index ? startDy : lineHeight, key: index }, line.words.join(" ")); })); } } ]), Text; }(__WEBPACK_IMPORTED_MODULE_1_react__.Component), _class.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.c, { scaleToFit: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool, angle: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, textAnchor: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf([ "start", "middle", "end", "inherit" ]), verticalAnchor: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf([ "start", "middle", "end" ]), style: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object }), _class.defaultProps = { x: 0, y: 0, lineHeight: "1em", capHeight: "0.71em", scaleToFit: !1, textAnchor: "start", verticalAnchor: "end" }, _temp2); __webpack_exports__.a = Text; }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.d(__webpack_exports__, "a", function() { return map; }), __webpack_require__.d(__webpack_exports__, "b", function() { return slice; }); var array = Array.prototype, map = array.map, slice = array.slice; }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); } function _possibleConstructorReturn(self, call) { if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !call || "object" != typeof call && "function" != typeof call ? self : call; } function _inherits(subClass, superClass) { if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: !1, writable: !0, configurable: !0 } }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass); } var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_2_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_classnames__), __WEBPACK_IMPORTED_MODULE_3__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); } return target; }, _createClass = function() { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); } } return function(Constructor, protoProps, staticProps) { return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), Constructor; }; }(), Dot = Object(__WEBPACK_IMPORTED_MODULE_3__util_PureRender__.a)((_temp = _class2 = function(_Component) { function Dot() { return _classCallCheck(this, Dot), _possibleConstructorReturn(this, (Dot.__proto__ || Object.getPrototypeOf(Dot)).apply(this, arguments)); } return _inherits(Dot, _Component), _createClass(Dot, [ { key: "render", value: function() { var _props = this.props, cx = _props.cx, cy = _props.cy, r = _props.r, className = _props.className, layerClass = __WEBPACK_IMPORTED_MODULE_2_classnames___default()("recharts-dot", className); return cx === +cx && cy === +cy && r === +r ? __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("circle", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.k)(this.props), Object(__WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.e)(this.props, null, !0), { className: layerClass, cx: cx, cy: cy, r: r })) : null; } } ]), Dot; }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = "Dot", _class2.propTypes = { className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, cx: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, cy: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, r: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number }, _class = _temp)) || _class; __webpack_exports__.a = Dot; }, function(module, exports, __webpack_require__) { var IObject = __webpack_require__(146), defined = __webpack_require__(148); module.exports = function(it) { return IObject(defined(it)); }; }, function(module, exports, __webpack_require__) { var defined = __webpack_require__(148); module.exports = function(it) { return Object(defined(it)); }; }, function(module, exports, __webpack_require__) { "use strict"; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); } Object.defineProperty(exports, "__esModule", { value: !0 }); var _extends = Object.assign || function(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); } return target; }, _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj) { return typeof obj; } : function(obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _createClass = function() { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); } } return function(Constructor, protoProps, staticProps) { return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), Constructor; }; }(), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _toCss = __webpack_require__(163), _toCss2 = _interopRequireDefault(_toCss), _toCssValue = __webpack_require__(110), _toCssValue2 = _interopRequireDefault(_toCssValue), StyleRule = function() { function StyleRule(key, style, options) { _classCallCheck(this, StyleRule), this.type = "style", this.isProcessed = !1; var sheet = options.sheet, Renderer = options.Renderer, selector = options.selector; this.key = key, this.options = options, this.style = style, selector && (this.selectorText = selector), this.renderer = sheet ? sheet.renderer : new Renderer(); } return _createClass(StyleRule, [ { key: "prop", value: function(name, value) { if (void 0 === value) return this.style[name]; if (this.style[name] === value) return this; value = this.options.jss.plugins.onChangeValue(value, name, this); var isEmpty = null == value || !1 === value, isDefined = name in this.style; if (isEmpty && !isDefined) return this; var remove = isEmpty && isDefined; if (remove ? delete this.style[name] : this.style[name] = value, this.renderable) return remove ? this.renderer.removeProperty(this.renderable, name) : this.renderer.setProperty(this.renderable, name, value), this; var sheet = this.options.sheet; return sheet && sheet.attached && (0, _warning2.default)(!1, 'Rule is not linked. Missing sheet option "link: true".'), this; } }, { key: "applyTo", value: function(renderable) { var json = this.toJSON(); for (var prop in json) this.renderer.setProperty(renderable, prop, json[prop]); return this; } }, { key: "toJSON", value: function() { var json = {}; for (var prop in this.style) { var value = this.style[prop]; "object" !== (void 0 === value ? "undefined" : _typeof(value)) ? json[prop] = value : Array.isArray(value) && (json[prop] = (0, _toCssValue2.default)(value)); } return json; } }, { key: "toString", value: function(options) { var sheet = this.options.sheet, link = !!sheet && sheet.options.link, opts = link ? _extends({}, options, { allowEmpty: !0 }) : options; return (0, _toCss2.default)(this.selector, this.style, opts); } }, { key: "selector", set: function(selector) { if (selector !== this.selectorText && (this.selectorText = selector, this.renderable)) { if (!this.renderer.setSelector(this.renderable, selector) && this.renderable) { var renderable = this.renderer.replaceRule(this.renderable, this); renderable && (this.renderable = renderable); } } }, get: function() { return this.selectorText; } } ]), StyleRule; }(); exports.default = StyleRule; }, function(module, exports, __webpack_require__) { function isSymbol(value) { return "symbol" == typeof value || isObjectLike(value) && baseGetTag(value) == symbolTag; } var baseGetTag = __webpack_require__(41), isObjectLike = __webpack_require__(42), symbolTag = "[object Symbol]"; module.exports = isSymbol; }, function(module, exports) { function identity(value) { return value; } module.exports = identity; }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_exports__.a = function(a, b) { return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; }; }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); } function _possibleConstructorReturn(self, call) { if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !call || "object" != typeof call && "function" != typeof call ? self : call; } function _inherits(subClass, superClass) { if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: !1, writable: !0, configurable: !0 } }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass); } var _class, _class2, _temp2, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_2_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_classnames__), __WEBPACK_IMPORTED_MODULE_3_react_smooth__ = __webpack_require__(33), __WEBPACK_IMPORTED_MODULE_3_react_smooth___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_react_smooth__), __WEBPACK_IMPORTED_MODULE_4__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); } return target; }, _createClass = function() { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); } } return function(Constructor, protoProps, staticProps) { return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), Constructor; }; }(), getRectangePath = function(x, y, width, height, radius) { var maxRadius = Math.min(Math.abs(width) / 2, Math.abs(height) / 2), sign = height >= 0 ? 1 : -1, clockWise = height >= 0 ? 1 : 0, path = void 0; if (maxRadius > 0 && radius instanceof Array) { for (var newRadius = [], i = 0; i < 4; i++) newRadius[i] = radius[i] > maxRadius ? maxRadius : radius[i]; path = "M" + x + "," + (y + sign * newRadius[0]), newRadius[0] > 0 && (path += "A " + newRadius[0] + "," + newRadius[0] + ",0,0," + clockWise + "," + (x + newRadius[0]) + "," + y), path += "L " + (x + width - newRadius[1]) + "," + y, newRadius[1] > 0 && (path += "A " + newRadius[1] + "," + newRadius[1] + ",0,0," + clockWise + ",\n " + (x + width) + "," + (y + sign * newRadius[1])), path += "L " + (x + width) + "," + (y + height - sign * newRadius[2]), newRadius[2] > 0 && (path += "A " + newRadius[2] + "," + newRadius[2] + ",0,0," + clockWise + ",\n " + (x + width - newRadius[2]) + "," + (y + height)), path += "L " + (x + newRadius[3]) + "," + (y + height), newRadius[3] > 0 && (path += "A " + newRadius[3] + "," + newRadius[3] + ",0,0," + clockWise + ",\n " + x + "," + (y + height - sign * newRadius[3])), path += "Z"; } else if (maxRadius > 0 && radius === +radius && radius > 0) { var _newRadius = Math.min(maxRadius, radius); path = "M " + x + "," + (y + sign * _newRadius) + "\n A " + _newRadius + "," + _newRadius + ",0,0," + clockWise + "," + (x + _newRadius) + "," + y + "\n L " + (x + width - _newRadius) + "," + y + "\n A " + _newRadius + "," + _newRadius + ",0,0," + clockWise + "," + (x + width) + "," + (y + sign * _newRadius) + "\n L " + (x + width) + "," + (y + height - sign * _newRadius) + "\n A " + _newRadius + "," + _newRadius + ",0,0," + clockWise + "," + (x + width - _newRadius) + "," + (y + height) + "\n L " + (x + _newRadius) + "," + (y + height) + "\n A " + _newRadius + "," + _newRadius + ",0,0," + clockWise + "," + x + "," + (y + height - sign * _newRadius) + " Z"; } else path = "M " + x + "," + y + " h " + width + " v " + height + " h " + -width + " Z"; return path; }, Rectangle = Object(__WEBPACK_IMPORTED_MODULE_4__util_PureRender__.a)((_temp2 = _class2 = function(_Component) { function Rectangle() { var _ref, _temp, _this, _ret; _classCallCheck(this, Rectangle); for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key]; return _temp = _this = _possibleConstructorReturn(this, (_ref = Rectangle.__proto__ || Object.getPrototypeOf(Rectangle)).call.apply(_ref, [ this ].concat(args))), _this.state = { totalLength: -1 }, _ret = _temp, _possibleConstructorReturn(_this, _ret); } return _inherits(Rectangle, _Component), _createClass(Rectangle, [ { key: "componentDidMount", value: function() { if (this.node && this.node.getTotalLength) try { var totalLength = this.node.getTotalLength(); totalLength && this.setState({ totalLength: totalLength }); } catch (err) {} } }, { key: "render", value: function() { var _this2 = this, _props = this.props, x = _props.x, y = _props.y, width = _props.width, height = _props.height, radius = _props.radius, className = _props.className, totalLength = this.state.totalLength, _props2 = this.props, animationEasing = _props2.animationEasing, animationDuration = _props2.animationDuration, animationBegin = _props2.animationBegin, isAnimationActive = _props2.isAnimationActive, isUpdateAnimationActive = _props2.isUpdateAnimationActive; if (x !== +x || y !== +y || width !== +width || height !== +height || 0 === width || 0 === height) return null; var layerClass = __WEBPACK_IMPORTED_MODULE_2_classnames___default()("recharts-rectangle", className); return isUpdateAnimationActive ? __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_3_react_smooth___default.a, { canBegin: totalLength > 0, from: { width: width, height: height, x: x, y: y }, to: { width: width, height: height, x: x, y: y }, duration: animationDuration, animationEasing: animationEasing, isActive: isUpdateAnimationActive }, function(_ref2) { var currWidth = _ref2.width, currHeight = _ref2.height, currX = _ref2.x, currY = _ref2.y; return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_3_react_smooth___default.a, { canBegin: totalLength > 0, from: "0px " + (-1 === totalLength ? 1 : totalLength) + "px", to: totalLength + "px 0px", attributeName: "strokeDasharray", begin: animationBegin, duration: animationDuration, isActive: isAnimationActive, easing: animationEasing }, __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("path", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.k)(_this2.props), Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.e)(_this2.props), { className: layerClass, d: getRectangePath(currX, currY, currWidth, currHeight, radius), ref: function(node) { _this2.node = node; } }))); }) : __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("path", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.k)(this.props), Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.e)(this.props), { className: layerClass, d: getRectangePath(x, y, width, height, radius) })); } } ]), Rectangle; }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = "Rectangle", _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.c, __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.a, { className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, x: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, y: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, height: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, radius: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.array ]), isAnimationActive: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, isUpdateAnimationActive: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, animationBegin: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, animationDuration: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, animationEasing: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "ease", "ease-in", "ease-out", "ease-in-out", "linear" ]) }), _class2.defaultProps = { x: 0, y: 0, width: 0, height: 0, radius: 0, isAnimationActive: !1, isUpdateAnimationActive: !1, animationBegin: 0, animationDuration: 1500, animationEasing: "ease" }, _class = _temp2)) || _class; __webpack_exports__.a = Rectangle; }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); } function _possibleConstructorReturn(self, call) { if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !call || "object" != typeof call && "function" != typeof call ? self : call; } function _inherits(subClass, superClass) { if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: !1, writable: !0, configurable: !0 } }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass); } var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_lodash_isArray__ = __webpack_require__(13), __WEBPACK_IMPORTED_MODULE_0_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_2_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_react__), __WEBPACK_IMPORTED_MODULE_3_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_3_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_prop_types__), __WEBPACK_IMPORTED_MODULE_4_d3_shape__ = __webpack_require__(182), __WEBPACK_IMPORTED_MODULE_5_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_5_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_classnames__), __WEBPACK_IMPORTED_MODULE_6__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_8__util_DataUtils__ = __webpack_require__(9), _extends = Object.assign || function(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); } return target; }, _createClass = function() { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); } } return function(Constructor, protoProps, staticProps) { return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), Constructor; }; }(), CURVE_FACTORIES = { curveBasisClosed: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.c, curveBasisOpen: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.d, curveBasis: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.b, curveLinearClosed: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.f, curveLinear: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.e, curveMonotoneX: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.g, curveMonotoneY: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.h, curveNatural: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.i, curveStep: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.j, curveStepAfter: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.k, curveStepBefore: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.l }, defined = function(p) { return p.x === +p.x && p.y === +p.y; }, getX = function(p) { return p.x; }, getY = function(p) { return p.y; }, getCurveFactory = function(type, layout) { if (__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(type)) return type; var name = "curve" + type.slice(0, 1).toUpperCase() + type.slice(1); return "curveMonotone" === name && layout ? CURVE_FACTORIES[name + ("vertical" === layout ? "Y" : "X")] : CURVE_FACTORIES[name] || __WEBPACK_IMPORTED_MODULE_4_d3_shape__.e; }, Curve = Object(__WEBPACK_IMPORTED_MODULE_6__util_PureRender__.a)((_temp = _class2 = function(_Component) { function Curve() { return _classCallCheck(this, Curve), _possibleConstructorReturn(this, (Curve.__proto__ || Object.getPrototypeOf(Curve)).apply(this, arguments)); } return _inherits(Curve, _Component), _createClass(Curve, [ { key: "getPath", value: function() { var _props = this.props, type = _props.type, points = _props.points, baseLine = _props.baseLine, layout = _props.layout, connectNulls = _props.connectNulls, curveFactory = getCurveFactory(type, layout), formatPoints = connectNulls ? points.filter(function(entry) { return defined(entry); }) : points, lineFunction = void 0; if (__WEBPACK_IMPORTED_MODULE_0_lodash_isArray___default()(baseLine)) { var areaPoints = formatPoints.map(function(entry, index) { return _extends({}, entry, { base: baseLine[index] }); }); return lineFunction = "vertical" === layout ? Object(__WEBPACK_IMPORTED_MODULE_4_d3_shape__.a)().y(getY).x1(getX).x0(function(d) { return d.base.x; }) : Object(__WEBPACK_IMPORTED_MODULE_4_d3_shape__.a)().x(getX).y1(getY).y0(function(d) { return d.base.y; }), lineFunction.defined(defined).curve(curveFactory), lineFunction(areaPoints); } return lineFunction = "vertical" === layout && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(baseLine) ? Object(__WEBPACK_IMPORTED_MODULE_4_d3_shape__.a)().y(getY).x1(getX).x0(baseLine) : Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(baseLine) ? Object(__WEBPACK_IMPORTED_MODULE_4_d3_shape__.a)().x(getX).y1(getY).y0(baseLine) : Object(__WEBPACK_IMPORTED_MODULE_4_d3_shape__.m)().x(getX).y(getY), lineFunction.defined(defined).curve(curveFactory), lineFunction(formatPoints); } }, { key: "render", value: function() { var _props2 = this.props, className = _props2.className, points = _props2.points, path = _props2.path, pathRef = _props2.pathRef; if (!(points && points.length || path)) return null; var realPath = points && points.length ? this.getPath() : path; return __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement("path", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.k)(this.props), Object(__WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.e)(this.props, null, !0), { className: __WEBPACK_IMPORTED_MODULE_5_classnames___default()("recharts-curve", className), d: realPath, ref: pathRef })); } } ]), Curve; }(__WEBPACK_IMPORTED_MODULE_2_react__.Component), _class2.displayName = "Curve", _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.c, { className: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string, type: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOf([ "basis", "basisClosed", "basisOpen", "linear", "linearClosed", "natural", "monotoneX", "monotoneY", "monotone", "step", "stepBefore", "stepAfter" ]), __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func ]), layout: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOf([ "horizontal", "vertical" ]), baseLine: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.array ]), points: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object), connectNulls: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool, path: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string, pathRef: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func }), _class2.defaultProps = { type: "linear", points: [], connectNulls: !1 }, _class = _temp)) || _class; __webpack_exports__.a = Curve; }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); } function _possibleConstructorReturn(self, call) { if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !call || "object" != typeof call && "function" != typeof call ? self : call; } function _inherits(subClass, superClass) { if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: !1, writable: !0, configurable: !0 } }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass); } var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = (__webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __webpack_require__(1)), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__ = __webpack_require__(4), _createClass = function() { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); } } return function(Constructor, protoProps, staticProps) { return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), Constructor; }; }(), XAxis = Object(__WEBPACK_IMPORTED_MODULE_2__util_PureRender__.a)((_temp = _class2 = function(_Component) { function XAxis() { return _classCallCheck(this, XAxis), _possibleConstructorReturn(this, (XAxis.__proto__ || Object.getPrototypeOf(XAxis)).apply(this, arguments)); } return _inherits(XAxis, _Component), _createClass(XAxis, [ { key: "render", value: function() { return null; } } ]), XAxis; }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = "XAxis", _class2.propTypes = { allowDecimals: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, allowDuplicatedCategory: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, hide: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, name: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]), unit: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]), xAxisId: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]), domain: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "auto", "dataMin", "dataMax" ]) ])), dataKey: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ]), width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, height: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, mirror: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, orientation: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "top", "bottom" ]), type: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "number", "category" ]), ticks: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.array, tickCount: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, tickFormatter: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, padding: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.shape({ left: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, right: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number }), allowDataOverflow: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, scale: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf(__WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__.d), __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ]), tick: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.element ]), axisLine: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object ]), tickLine: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object ]), minTickGap: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, tickSize: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, interval: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "preserveStart", "preserveEnd", "preserveStartEnd" ]) ]), reversed: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool }, _class2.defaultProps = { allowDecimals: !0, hide: !1, orientation: "bottom", width: 0, height: 30, mirror: !1, xAxisId: 0, tickCount: 5, type: "category", domain: [ 0, "auto" ], padding: { left: 0, right: 0 }, allowDataOverflow: !1, scale: "auto", reversed: !1, allowDuplicatedCategory: !0 }, _class = _temp)) || _class; __webpack_exports__.a = XAxis; }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); } function _possibleConstructorReturn(self, call) { if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !call || "object" != typeof call && "function" != typeof call ? self : call; } function _inherits(subClass, superClass) { if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: !1, writable: !0, configurable: !0 } }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass); } var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = (__webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __webpack_require__(1)), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2__util_PureRender__ = __webpack_require__(5), _createClass = function() { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); } } return function(Constructor, protoProps, staticProps) { return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), Constructor; }; }(), YAxis = Object(__WEBPACK_IMPORTED_MODULE_2__util_PureRender__.a)((_temp = _class2 = function(_Component) { function YAxis() { return _classCallCheck(this, YAxis), _possibleConstructorReturn(this, (YAxis.__proto__ || Object.getPrototypeOf(YAxis)).apply(this, arguments)); } return _inherits(YAxis, _Component), _createClass(YAxis, [ { key: "render", value: function() { return null; } } ]), YAxis; }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = "YAxis", _class2.propTypes = { allowDecimals: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, allowDuplicatedCategory: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, hide: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, name: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]), unit: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]), yAxisId: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]), domain: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "auto", "dataMin", "dataMax" ]) ])), dataKey: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ]), ticks: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.array, tickCount: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, tickFormatter: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, height: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, mirror: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, orientation: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "left", "right" ]), type: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "number", "category" ]), padding: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.shape({ top: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, bottom: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number }), allowDataOverflow: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, scale: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "auto", "linear", "pow", "sqrt", "log", "identity", "time", "band", "point", "ordinal", "quantile", "quantize", "utcTime", "sequential", "threshold" ]), __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ]), tick: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.element ]), axisLine: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object ]), tickLine: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object ]), minTickGap: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, tickSize: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, interval: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "preserveStart", "preserveEnd", "preserveStartEnd" ]) ]), reversed: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool }, _class2.defaultProps = { allowDuplicatedCategory: !0, allowDecimals: !0, hide: !1, orientation: "left", width: 60, height: 0, mirror: !1, yAxisId: 0, tickCount: 5, type: "number", domain: [ 0, "auto" ], padding: { top: 0, bottom: 0 }, allowDataOverflow: !1, scale: "auto", reversed: !1 }, _class = _temp)) || _class; __webpack_exports__.a = YAxis; }, function(module, exports, __webpack_require__) { "use strict"; function toObject(val) { if (null === val || void 0 === val) throw new TypeError("Object.assign cannot be called with null or undefined"); return Object(val); } var getOwnPropertySymbols = Object.getOwnPropertySymbols, hasOwnProperty = Object.prototype.hasOwnProperty, propIsEnumerable = Object.prototype.propertyIsEnumerable; module.exports = function() { try { if (!Object.assign) return !1; var test1 = new String("abc"); if (test1[5] = "de", "5" === Object.getOwnPropertyNames(test1)[0]) return !1; for (var test2 = {}, i = 0; i < 10; i++) test2["_" + String.fromCharCode(i)] = i; if ("0123456789" !== Object.getOwnPropertyNames(test2).map(function(n) { return test2[n]; }).join("")) return !1; var test3 = {}; return "abcdefghijklmnopqrst".split("").forEach(function(letter) { test3[letter] = letter; }), "abcdefghijklmnopqrst" === Object.keys(Object.assign({}, test3)).join(""); } catch (err) { return !1; } }() ? Object.assign : function(target, source) { for (var from, symbols, to = toObject(target), s = 1; s < arguments.length; s++) { from = Object(arguments[s]); for (var key in from) hasOwnProperty.call(from, key) && (to[key] = from[key]); if (getOwnPropertySymbols) { symbols = getOwnPropertySymbols(from); for (var i = 0; i < symbols.length; i++) propIsEnumerable.call(from, symbols[i]) && (to[symbols[i]] = from[symbols[i]]); } } return to; }; }, function(module, exports) { module.exports = function(bitmap, value) { return { enumerable: !(1 & bitmap), configurable: !(2 & bitmap), writable: !(4 & bitmap), value: value }; }; }, function(module, exports, __webpack_require__) { var $keys = __webpack_require__(226), enumBugKeys = __webpack_require__(152); module.exports = Object.keys || function(O) { return $keys(O, enumBugKeys); }; }, function(module, exports) { module.exports = {}; }, function(module, exports, __webpack_require__) { "use strict"; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function createBreakpoints(breakpoints) { function up(key) { return "@media (min-width:" + ("number" == typeof values[key] ? values[key] : key) + unit + ")"; } function down(key) { var endIndex = keys.indexOf(key) + 1, upperbound = values[keys[endIndex]]; return endIndex === keys.length ? up("xs") : "@media (max-width:" + (("number" == typeof upperbound && endIndex > 0 ? upperbound : key) - step / 100) + unit + ")"; } function between(start, end) { var endIndex = keys.indexOf(end) + 1; return endIndex === keys.length ? up(start) : "@media (min-width:" + values[start] + unit + ") and (max-width:" + (values[keys[endIndex]] - step / 100) + unit + ")"; } function only(key) { return between(key, key); } function width(key) { return values[key]; } var _breakpoints$values = breakpoints.values, values = void 0 === _breakpoints$values ? { xs: 0, sm: 600, md: 960, lg: 1280, xl: 1920 } : _breakpoints$values, _breakpoints$unit = breakpoints.unit, unit = void 0 === _breakpoints$unit ? "px" : _breakpoints$unit, _breakpoints$step = breakpoints.step, step = void 0 === _breakpoints$step ? 5 : _breakpoints$step, other = (0, _objectWithoutProperties3.default)(breakpoints, [ "values", "unit", "step" ]); return (0, _extends3.default)({ keys: keys, values: values, up: up, down: down, between: between, only: only, width: width }, other); } Object.defineProperty(exports, "__esModule", { value: !0 }), exports.keys = void 0; var _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2); exports.default = createBreakpoints; var keys = exports.keys = [ "xs", "sm", "md", "lg", "xl" ]; }, function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = !0; var _getDisplayName = __webpack_require__(244), _getDisplayName2 = function(obj) { return obj && obj.__esModule ? obj : { default: obj }; }(_getDisplayName), wrapDisplayName = function(BaseComponent, hocName) { return hocName + "(" + (0, _getDisplayName2.default)(BaseComponent) + ")"; }; exports.default = wrapDisplayName; }, function(module, exports, __webpack_require__) { "use strict"; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); } Object.defineProperty(exports, "__esModule", { value: !0 }); var _extends = Object.assign || function(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); } return target; }, _createClass = function() { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); } } return function(Constructor, protoProps, staticProps) { return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), Constructor; }; }(), _createRule = __webpack_require__(111), _createRule2 = _interopRequireDefault(_createRule), _linkRule = __webpack_require__(249), _linkRule2 = _interopRequireDefault(_linkRule), _StyleRule = __webpack_require__(66), _StyleRule2 = _interopRequireDefault(_StyleRule), _escape = __webpack_require__(467), _escape2 = _interopRequireDefault(_escape), RuleList = function() { function RuleList(options) { _classCallCheck(this, RuleList), this.map = {}, this.raw = {}, this.index = [], this.options = options, this.classes = options.classes; } return _createClass(RuleList, [ { key: "add", value: function(name, decl, options) { var _options = this.options, parent = _options.parent, sheet = _options.sheet, jss = _options.jss, Renderer = _options.Renderer, generateClassName = _options.generateClassName; options = _extends({ classes: this.classes, parent: parent, sheet: sheet, jss: jss, Renderer: Renderer, generateClassName: generateClassName }, options), !options.selector && this.classes[name] && (options.selector = "." + (0, _escape2.default)(this.classes[name])), this.raw[name] = decl; var rule = (0, _createRule2.default)(name, decl, options), className = void 0; !options.selector && rule instanceof _StyleRule2.default && (className = generateClassName(rule, sheet), rule.selector = "." + (0, _escape2.default)(className)), this.register(rule, className); var index = void 0 === options.index ? this.index.length : options.index; return this.index.splice(index, 0, rule), rule; } }, { key: "get", value: function(name) { return this.map[name]; } }, { key: "remove", value: function(rule) { this.unregister(rule), this.index.splice(this.indexOf(rule), 1); } }, { key: "indexOf", value: function(rule) { return this.index.indexOf(rule); } }, { key: "process", value: function() { var plugins = this.options.jss.plugins; this.index.slice(0).forEach(plugins.onProcessRule, plugins); } }, { key: "register", value: function(rule, className) { this.map[rule.key] = rule, rule instanceof _StyleRule2.default && (this.map[rule.selector] = rule, className && (this.classes[rule.key] = className)); } }, { key: "unregister", value: function(rule) { delete this.map[rule.key], rule instanceof _StyleRule2.default && (delete this.map[rule.selector], delete this.classes[rule.key]); } }, { key: "update", value: function(name, data) { var _options2 = this.options, plugins = _options2.jss.plugins, sheet = _options2.sheet; if ("string" == typeof name) return void plugins.onUpdate(data, this.get(name), sheet); for (var index = 0; index < this.index.length; index++) plugins.onUpdate(name, this.index[index], sheet); } }, { key: "link", value: function(cssRules) { for (var map = this.options.sheet.renderer.getUnescapedKeysMap(this.index), i = 0; i < cssRules.length; i++) { var cssRule = cssRules[i], _key = this.options.sheet.renderer.getKey(cssRule); map[_key] && (_key = map[_key]); var rule = this.map[_key]; rule && (0, _linkRule2.default)(rule, cssRule); } } }, { key: "toString", value: function(options) { for (var str = "", sheet = this.options.sheet, link = !!sheet && sheet.options.link, index = 0; index < this.index.length; index++) { var rule = this.index[index], css = rule.toString(options); (css || link) && (str && (str += "\n"), str += css); } return str; } } ]), RuleList; }(); exports.default = RuleList; }, function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: !0 }); var _extends = Object.assign || function(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); } return target; }, menuSkeletons = [ { id: "home", menu: { title: "Home", icon: "home" } }, { id: "chain", menu: { title: "Chain", icon: "link" } }, { id: "txpool", menu: { title: "TxPool", icon: "credit-card" } }, { id: "network", menu: { title: "Network", icon: "globe" } }, { id: "system", menu: { title: "System", icon: "tachometer" } }, { id: "logs", menu: { title: "Logs", icon: "list" } } ]; exports.MENU = new Map(menuSkeletons.map(function(_ref) { var id = _ref.id, menu = _ref.menu; return [ id, _extends({ id: id }, menu) ]; })), exports.DURATION = 200, exports.styles = { light: { color: "rgba(255, 255, 255, 0.54)" } }; }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]); return target; } function Surface(props) { var children = props.children, width = props.width, height = props.height, viewBox = props.viewBox, className = props.className, style = props.style, others = _objectWithoutProperties(props, [ "children", "width", "height", "viewBox", "className", "style" ]), svgView = viewBox || { width: width, height: height, x: 0, y: 0 }, layerClass = __WEBPACK_IMPORTED_MODULE_2_classnames___default()("recharts-surface", className), attrs = Object(__WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__.k)(others); return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("svg", _extends({}, attrs, { className: layerClass, width: width, height: height, style: style, viewBox: svgView.x + " " + svgView.y + " " + svgView.width + " " + svgView.height, version: "1.1" }), children); } var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_2_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_classnames__), __WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); } return target; }, propTypes = { width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number.isRequired, height: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number.isRequired, viewBox: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.shape({ x: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, y: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, height: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number }), className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, style: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object, children: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node), __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node ]) }; Surface.propTypes = propTypes, __webpack_exports__.a = Surface; }, function(module, exports, __webpack_require__) { var root = __webpack_require__(31), Symbol = root.Symbol; module.exports = Symbol; }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; var __WEBPACK_IMPORTED_MODULE_0__src_path__ = __webpack_require__(633); __webpack_require__.d(__webpack_exports__, "a", function() { return __WEBPACK_IMPORTED_MODULE_0__src_path__.a; }); }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; function acos(x) { return x > 1 ? 0 : x < -1 ? pi : Math.acos(x); } function asin(x) { return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x); } __webpack_require__.d(__webpack_exports__, "a", function() { return abs; }), __webpack_require__.d(__webpack_exports__, "d", function() { return atan2; }), __webpack_require__.d(__webpack_exports__, "e", function() { return cos; }), __webpack_require__.d(__webpack_exports__, "h", function() { return max; }), __webpack_require__.d(__webpack_exports__, "i", function() { return min; }), __webpack_require__.d(__webpack_exports__, "k", function() { return sin; }), __webpack_require__.d(__webpack_exports__, "l", function() { return sqrt; }), __webpack_require__.d(__webpack_exports__, "f", function() { return epsilon; }), __webpack_require__.d(__webpack_exports__, "j", function() { return pi; }), __webpack_require__.d(__webpack_exports__, "g", function() { return halfPi; }), __webpack_require__.d(__webpack_exports__, "m", function() { return tau; }), __webpack_exports__.b = acos, __webpack_exports__.c = asin; var abs = Math.abs, atan2 = Math.atan2, cos = Math.cos, max = Math.max, min = Math.min, sin = Math.sin, sqrt = Math.sqrt, epsilon = 1e-12, pi = Math.PI, halfPi = pi / 2, tau = 2 * pi; }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_exports__.a = function(series, order) { if ((n = series.length) > 1) for (var j, s0, n, i = 1, s1 = series[order[0]], m = s1.length; i < n; ++i) for (s0 = s1, s1 = series[order[i]], j = 0; j < m; ++j) s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1]; }; }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_exports__.a = function(series) { for (var n = series.length, o = new Array(n); --n >= 0; ) o[n] = n; return o; }; }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; function Cell() { return null; } var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1__util_ReactUtils__ = (__webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __webpack_require__(4)), _extends = Object.assign || function(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); } return target; }; Cell.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_1__util_ReactUtils__.c), Cell.displayName = "Cell", __webpack_exports__.a = Cell; }, function(module, exports, __webpack_require__) { function baseIteratee(value) { return "function" == typeof value ? value : null == value ? identity : "object" == typeof value ? isArray(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value) : property(value); } var baseMatches = __webpack_require__(815), baseMatchesProperty = __webpack_require__(818), identity = __webpack_require__(68), isArray = __webpack_require__(13), property = __webpack_require__(822); module.exports = baseIteratee; }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_exports__.a = function(x) { return null === x ? NaN : +x; }; }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; function linearish(scale) { var domain = scale.domain; return scale.ticks = function(count) { var d = domain(); return Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.h)(d[0], d[d.length - 1], null == count ? 10 : count); }, scale.tickFormat = function(count, specifier) { return Object(__WEBPACK_IMPORTED_MODULE_3__tickFormat__.a)(domain(), count, specifier); }, scale.nice = function(count) { null == count && (count = 10); var step, d = domain(), i0 = 0, i1 = d.length - 1, start = d[i0], stop = d[i1]; return stop < start && (step = start, start = stop, stop = step, step = i0, i0 = i1, i1 = step), step = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.f)(start, stop, count), step > 0 ? (start = Math.floor(start / step) * step, stop = Math.ceil(stop / step) * step, step = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.f)(start, stop, count)) : step < 0 && (start = Math.ceil(start * step) / step, stop = Math.floor(stop * step) / step, step = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.f)(start, stop, count)), step > 0 ? (d[i0] = Math.floor(start / step) * step, d[i1] = Math.ceil(stop / step) * step, domain(d)) : step < 0 && (d[i0] = Math.ceil(start * step) / step, d[i1] = Math.floor(stop * step) / step, domain(d)), scale; }, scale; } function linear() { var scale = Object(__WEBPACK_IMPORTED_MODULE_2__continuous__.b)(__WEBPACK_IMPORTED_MODULE_2__continuous__.c, __WEBPACK_IMPORTED_MODULE_1_d3_interpolate__.c); return scale.copy = function() { return Object(__WEBPACK_IMPORTED_MODULE_2__continuous__.a)(scale, linear()); }, linearish(scale); } __webpack_exports__.b = linearish, __webpack_exports__.a = linear; var __WEBPACK_IMPORTED_MODULE_0_d3_array__ = __webpack_require__(37), __WEBPACK_IMPORTED_MODULE_1_d3_interpolate__ = __webpack_require__(92), __WEBPACK_IMPORTED_MODULE_2__continuous__ = __webpack_require__(137), __WEBPACK_IMPORTED_MODULE_3__tickFormat__ = __webpack_require__(883); }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; var __WEBPACK_IMPORTED_MODULE_0__src_value__ = __webpack_require__(206); __webpack_require__.d(__webpack_exports__, "a", function() { return __WEBPACK_IMPORTED_MODULE_0__src_value__.a; }); var __WEBPACK_IMPORTED_MODULE_5__src_number__ = (__webpack_require__(349), __webpack_require__(209), __webpack_require__(347), __webpack_require__(350), __webpack_require__(136)); __webpack_require__.d(__webpack_exports__, "c", function() { return __WEBPACK_IMPORTED_MODULE_5__src_number__.a; }); var __WEBPACK_IMPORTED_MODULE_7__src_round__ = (__webpack_require__(351), __webpack_require__(873)); __webpack_require__.d(__webpack_exports__, "d", function() { return __WEBPACK_IMPORTED_MODULE_7__src_round__.a; }); var __WEBPACK_IMPORTED_MODULE_15__src_cubehelix__ = (__webpack_require__(352), __webpack_require__(874), __webpack_require__(877), __webpack_require__(346), __webpack_require__(878), __webpack_require__(879), __webpack_require__(880), __webpack_require__(881)); __webpack_require__.d(__webpack_exports__, "b", function() { return __WEBPACK_IMPORTED_MODULE_15__src_cubehelix__.a; }); __webpack_require__(882); }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; function linear(a, d) { return function(t) { return a + t * d; }; } function exponential(a, b, y) { return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) { return Math.pow(a + t * b, y); }; } function hue(a, b) { var d = b - a; return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : Object(__WEBPACK_IMPORTED_MODULE_0__constant__.a)(isNaN(a) ? b : a); } function gamma(y) { return 1 == (y = +y) ? nogamma : function(a, b) { return b - a ? exponential(a, b, y) : Object(__WEBPACK_IMPORTED_MODULE_0__constant__.a)(isNaN(a) ? b : a); }; } function nogamma(a, b) { var d = b - a; return d ? linear(a, d) : Object(__WEBPACK_IMPORTED_MODULE_0__constant__.a)(isNaN(a) ? b : a); } __webpack_exports__.c = hue, __webpack_exports__.b = gamma, __webpack_exports__.a = nogamma; var __WEBPACK_IMPORTED_MODULE_0__constant__ = __webpack_require__(348); }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_exports__.a = function(s) { return s.match(/.{6}/g).map(function(x) { return "#" + x; }); }; }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]); return target; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); } function _possibleConstructorReturn(self, call) { if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !call || "object" != typeof call && "function" != typeof call ? self : call; } function _inherits(subClass, superClass) { if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: !1, writable: !0, configurable: !0 } }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass); } var _class, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); } return target; }, _createClass = function() { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); } } return function(Constructor, protoProps, staticProps) { return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), Constructor; }; }(), ErrorBar = (_temp = _class = function(_Component) { function ErrorBar() { return _classCallCheck(this, ErrorBar), _possibleConstructorReturn(this, (ErrorBar.__proto__ || Object.getPrototypeOf(ErrorBar)).apply(this, arguments)); } return _inherits(ErrorBar, _Component), _createClass(ErrorBar, [ { key: "renderErrorBars", value: function() { var _props = this.props, offset = _props.offset, layout = _props.layout, width = _props.width, dataKey = _props.dataKey, data = _props.data, dataPointFormatter = _props.dataPointFormatter, xAxis = _props.xAxis, yAxis = _props.yAxis, others = _objectWithoutProperties(_props, [ "offset", "layout", "width", "dataKey", "data", "dataPointFormatter", "xAxis", "yAxis" ]), props = Object(__WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__.k)(others); return data.map(function(entry, i) { var _dataPointFormatter = dataPointFormatter(entry, dataKey), x = _dataPointFormatter.x, y = _dataPointFormatter.y, value = _dataPointFormatter.value, errorVal = _dataPointFormatter.errorVal; if (!errorVal) return null; var xMid = void 0, yMid = void 0, xMin = void 0, yMin = void 0, xMax = void 0, yMax = void 0, scale = void 0, coordsTop = void 0, coordsMid = void 0, coordsBot = void 0, lowBound = void 0, highBound = void 0; return Array.isArray(errorVal) ? (lowBound = errorVal[0], highBound = errorVal[1]) : (lowBound = errorVal, highBound = errorVal), "vertical" === layout ? (scale = xAxis.scale, xMid = value, yMid = y + offset, xMin = scale(xMid - lowBound), yMin = yMid + width, xMax = scale(xMid + highBound), yMax = yMid - width, coordsTop = { x1: xMax, y1: yMin, x2: xMax, y2: yMax }, coordsMid = { x1: xMin, y1: yMid, x2: xMax, y2: yMid }, coordsBot = { x1: xMin, y1: yMin, x2: xMin, y2: yMax }) : "horizontal" === layout && (scale = yAxis.scale, xMid = x + offset, yMid = value, xMin = xMid - width, xMax = xMid + width, yMin = scale(yMid - lowBound), yMax = scale(yMid + highBound), coordsTop = { x1: xMin, y1: yMax, x2: xMax, y2: yMax }, coordsMid = { x1: xMid, y1: yMin, x2: xMid, y2: yMax }, coordsBot = { x1: xMin, y1: yMin, x2: xMax, y2: yMin }), __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_2__container_Layer__.a, _extends({ className: "recharts-errorBar", key: i }, props), __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("line", coordsTop), __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("line", coordsMid), __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("line", coordsBot)); }); } }, { key: "render", value: function() { return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_2__container_Layer__.a, { className: "recharts-errorBars" }, this.renderErrorBars()); } } ]), ErrorBar; }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class.propTypes = { dataKey: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ]).isRequired, data: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.array, xAxis: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object, yAxis: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object, layout: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, dataPointFormatter: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, stroke: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, strokeWidth: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, offset: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number }, _class.defaultProps = { stroke: "black", strokeWidth: 1.5, width: 5, offset: 0, layout: "horizontal" }, _temp); __webpack_exports__.a = ErrorBar; }, function(module, __webpack_exports__, __webpack_require__) { "use strict"; function _defineProperty(obj, key, value) { return key in obj ? Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }) : obj[key] = value, obj; } __webpack_require__.d(__webpack_exports__, "a", function() { return formatAxisMap; }); var __WEBPACK_IMPORTED_MODULE_0__ChartUtils__ = __webpack_require__(16), _extends = Object.assign || function(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); } return target; }, formatAxisMap = function(props, axisMap, offset, axisType, chartName) { var width = props.width, height = props.height, layout = props.layout, ids = Object.keys(axisMap), steps = { left: offset.left, leftMirror: offset.left, right: width - offset.right, rightMirror: width - offset.right, top: offset.top, topMirror: offset.top, bottom: height - offset.bottom, bottomMirror: height - offset.bottom }; return ids.reduce(function(result, id) { var axis = axisMap[id], orientation = axis.orientation, domain = axis.domain, _axis$padding = axis.padding, padding = void 0 === _axis$padding ? {} : _axis$padding, mirror = axis.mirror, reversed = axis.reversed, offsetKey = orientation + (mirror ? "Mirror" : ""), range = void 0, x = void 0, y = void 0, needSpace = void 0; range = "xAxis" === axisType ? [ offset.left + (padding.left || 0), offset.left + offset.width - (padding.right || 0) ] : "yAxis" === axisType ? "horizontal" === layout ? [ offset.top + offset.height - (padding.bottom || 0), offset.top + (padding.top || 0) ] : [ offset.top + (padding.top || 0), offset.top + offset.height - (padding.bottom || 0) ] : axis.range, reversed && (range = [ range[1], range[0] ]); var _parseScale = Object(__WEBPACK_IMPORTED_MODULE_0__ChartUtils__.A)(axis, chartName), scale = _parseScale.scale, realScaleType = _parseScale.realScaleType; scale.domain(domain).range(range), Object(__WEBPACK_IMPORTED_MODULE_0__ChartUtils__.c)(scale); var ticks = Object(__WEBPACK_IMPORTED_MODULE_0__ChartUtils__.v)(scale, _extends({}, axis, { realScaleType: realScaleType })); "xAxis" === axisType ? (needSpace = "top" === orientation && !mirror || "bottom" === orientation && mirror, x = offset.left, y = steps[offsetKey] - needSpace * axis.height) : "yAxis" === axisType && (needSpace = "left" === orientation && !mirror || "right" === orientation && mirror, x = steps[offsetKey] - needSpace * axis.width, y = offset.top); var finalAxis = _extends({}, axis, ticks, { realScaleType: realScaleType, x: x, y: y, scale: scale, width: "xAxis" === axisType ? offset.width : axis.width, height: "yAxis" === axisType ? offset.height : axis.height }); return finalAxis.bandSize = Object(__WEBPACK_IMPORTED_MODULE_0__ChartUtils__.g)(finalAxis, ticks), axis.hide || "xAxis" !== axisType ? axis.hide || (steps[offsetKey] += (needSpace ? -1 : 1) * finalAxis.width) : steps[offsetKey] += (needSpace ? -1 : 1) * finalAxis.height, _extends({}, result, _defineProperty({}, id, finalAxis)); }, {}); }; }, function(module, exports, __webpack_require__) { "use strict"; (function(process) { var emptyObject = {}; "production" !== process.env.NODE_ENV && Object.freeze(emptyObject), module.exports = emptyObject; }).call(exports, __webpack_require__(2)); }, function(module, exports, __webpack_require__) { "use strict"; (function(process) { var emptyFunction = __webpack_require__(50), warning = emptyFunction; if ("production" !== process.env.NODE_ENV) { var printWarning = function(format) { for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) args[_key - 1] = arguments[_key]; var argIndex = 0, message = "Warning: " + format.replace(/%s/g, function() { return args[argIndex++]; }); "undefined" != typeof console && console.error(message); try { throw new Error(message); } catch (x) {} }; warning = function(condition, format) { if (void 0 === format) throw new Error("` + ("`" + `warning(condition, format, ...args)`)) + ("`" + (` requires a warning message argument"); if (0 !== format.indexOf("Failed Composite propType: ") && !condition) { for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) args[_key2 - 2] = arguments[_key2]; printWarning.apply(void 0, [ format ].concat(args)); } }; } module.exports = warning; }).call(exports, __webpack_require__(2)); }, function(module, exports, __webpack_require__) { "use strict"; (function(process) { function checkDCE() { if ("undefined" != typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" == typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE) { if ("production" !== process.env.NODE_ENV) throw new Error("^_^"); try { __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE); } catch (err) { console.error(err); } } } "production" === process.env.NODE_ENV ? (checkDCE(), module.exports = __webpack_require__(378)) : module.exports = __webpack_require__(381); }).call(exports, __webpack_require__(2)); }, function(module, exports, __webpack_require__) { "use strict"; function is(x, y) { return x === y ? 0 !== x || 0 !== y || 1 / x == 1 / y : x !== x && y !== y; } function shallowEqual(objA, objB) { if (is(objA, objB)) return !0; if ("object" != typeof objA || null === objA || "object" != typeof objB || null === objB) return !1; var keysA = Object.keys(objA), keysB = Object.keys(objB); if (keysA.length !== keysB.length) return !1; for (var i = 0; i < keysA.length; i++) if (!hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) return !1; return !0; } var hasOwnProperty = Object.prototype.hasOwnProperty; module.exports = shallowEqual; }, function(module, exports, __webpack_require__) { var toInteger = __webpack_require__(149), min = Math.min; module.exports = function(it) { return it > 0 ? min(toInteger(it), 9007199254740991) : 0; }; }, function(module, exports) { module.exports = !0; }, function(module, exports) { var id = 0, px = Math.random(); module.exports = function(key) { return "Symbol(".concat(void 0 === key ? "" : key, ")_", (++id + px).toString(36)); }; }, function(module, exports) { exports.f = {}.propertyIsEnumerable; }, function(module, exports, __webpack_require__) { "use strict"; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } exports.__esModule = !0; var _iterator = __webpack_require__(396), _iterator2 = _interopRequireDefault(_iterator), _symbol = __webpack_require__(404), _symbol2 = _interopRequireDefault(_symbol), _typeof = "function" == typeof _symbol2.default && "symbol" == typeof _iterator2.default ? function(obj) { return typeof obj; } : function(obj) { return obj && "function" == typeof _symbol2.default && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj; }; exports.default = "function" == typeof _symbol2.default && "symbol" === _typeof(_iterator2.default) ? function(obj) { return void 0 === obj ? "undefined" : _typeof(obj); } : function(obj) { return obj && "function" == typeof _symbol2.default && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : void 0 === obj ? "undefined" : _typeof(obj); }; }, function(module, exports, __webpack_require__) { var anObject = __webpack_require__(52), dPs = __webpack_require__(400), enumBugKeys = __webpack_require__(152), IE_PROTO = __webpack_require__(150)("IE_PROTO"), Empty = function() {}, createDict = function() { var iframeDocument, iframe = __webpack_require__(225)("iframe"), i = enumBugKeys.length; for (iframe.style.display = "none", __webpack_require__(401).appendChild(iframe), iframe.src = "javascript:", iframeDocument = iframe.contentWindow.document, iframeDocument.open(), iframeDocument.write("" that closes the next token. If // non-empty, the subsequent call to Next will return a raw or RCDATA text // token: one that treats "

" as text instead of an element. // rawTag's contents are lower-cased. rawTag string // textIsRaw is whether the current text token's data is not escaped. textIsRaw bool // convertNUL is whether NUL bytes in the current token's data should // be converted into \ufffd replacement characters. convertNUL bool // allowCDATA is whether CDATA sections are allowed in the current context. allowCDATA bool } // AllowCDATA sets whether or not the tokenizer recognizes as // the text "foo". The default value is false, which means to recognize it as // a bogus comment "" instead. // // Strictly speaking, an HTML5 compliant tokenizer should allow CDATA if and // only if tokenizing foreign content, such as MathML and SVG. However, // tracking foreign-contentness is difficult to do purely in the tokenizer, // as opposed to the parser, due to HTML integration points: an element // can contain a that is foreign-to-SVG but not foreign-to- // HTML. For strict compliance with the HTML5 tokenization algorithm, it is the // responsibility of the user of a tokenizer to call AllowCDATA as appropriate. // In practice, if using the tokenizer without caring whether MathML or SVG // CDATA is text or comments, such as tokenizing HTML to find all the anchor // text, it is acceptable to ignore this responsibility. func (z *Tokenizer) AllowCDATA(allowCDATA bool) { z.allowCDATA = allowCDATA } // NextIsNotRawText instructs the tokenizer that the next token should not be // considered as 'raw text'. Some elements, such as script and title elements, // normally require the next token after the opening tag to be 'raw text' that // has no child elements. For example, tokenizing "a<b>c</b>d" // yields a start tag token for "", a text token for "a<b>c</b>d", and // an end tag token for "". There are no distinct start tag or end tag // tokens for the "" and "". // // This tokenizer implementation will generally look for raw text at the right // times. Strictly speaking, an HTML5 compliant tokenizer should not look for // raw text if in foreign content: generally needs raw text, but a // <title> inside an <svg> does not. Another example is that a <textarea> // generally needs raw text, but a <textarea> is not allowed as an immediate // child of a <select>; in normal parsing, a <textarea> implies </select>, but // one cannot close the implicit element when parsing a <select>'s InnerHTML. // Similarly to AllowCDATA, tracking the correct moment to override raw-text- // ness is difficult to do purely in the tokenizer, as opposed to the parser. // For strict compliance with the HTML5 tokenization algorithm, it is the // responsibility of the user of a tokenizer to call NextIsNotRawText as // appropriate. In practice, like AllowCDATA, it is acceptable to ignore this // responsibility for basic usage. // // Note that this 'raw text' concept is different from the one offered by the // Tokenizer.Raw method. func (z *Tokenizer) NextIsNotRawText() { z.rawTag = "" } // Err returns the error associated with the most recent ErrorToken token. // This is typically io.EOF, meaning the end of tokenization. func (z *Tokenizer) Err() error { if z.tt != ErrorToken { return nil } return z.err } // readByte returns the next byte from the input stream, doing a buffered read // from z.r into z.buf if necessary. z.buf[z.raw.start:z.raw.end] remains a contiguous byte // slice that holds all the bytes read so far for the current token. // It sets z.err if the underlying reader returns an error. // Pre-condition: z.err == nil. func (z *Tokenizer) readByte() byte { if z.raw.end >= len(z.buf) { // Our buffer is exhausted and we have to read from z.r. Check if the // previous read resulted in an error. if z.readErr != nil { z.err = z.readErr return 0 } // We copy z.buf[z.raw.start:z.raw.end] to the beginning of z.buf. If the length // z.raw.end - z.raw.start is more than half the capacity of z.buf, then we // allocate a new buffer before the copy. c := cap(z.buf) d := z.raw.end - z.raw.start var buf1 []byte if 2*d > c { buf1 = make([]byte, d, 2*c) } else { buf1 = z.buf[:d] } copy(buf1, z.buf[z.raw.start:z.raw.end]) if x := z.raw.start; x != 0 { // Adjust the data/attr spans to refer to the same contents after the copy. z.data.start -= x z.data.end -= x z.pendingAttr[0].start -= x z.pendingAttr[0].end -= x z.pendingAttr[1].start -= x z.pendingAttr[1].end -= x for i := range z.attr { z.attr[i][0].start -= x z.attr[i][0].end -= x z.attr[i][1].start -= x z.attr[i][1].end -= x } } z.raw.start, z.raw.end, z.buf = 0, d, buf1[:d] // Now that we have copied the live bytes to the start of the buffer, // we read from z.r into the remainder. var n int n, z.readErr = readAtLeastOneByte(z.r, buf1[d:cap(buf1)]) if n == 0 { z.err = z.readErr return 0 } z.buf = buf1[:d+n] } x := z.buf[z.raw.end] z.raw.end++ if z.maxBuf > 0 && z.raw.end-z.raw.start >= z.maxBuf { z.err = ErrBufferExceeded return 0 } return x } // Buffered returns a slice containing data buffered but not yet tokenized. func (z *Tokenizer) Buffered() []byte { return z.buf[z.raw.end:] } // readAtLeastOneByte wraps an io.Reader so that reading cannot return (0, nil). // It returns io.ErrNoProgress if the underlying r.Read method returns (0, nil) // too many times in succession. func readAtLeastOneByte(r io.Reader, b []byte) (int, error) { for i := 0; i < 100; i++ { n, err := r.Read(b) if n != 0 || err != nil { return n, err } } return 0, io.ErrNoProgress } // skipWhiteSpace skips past any white space. func (z *Tokenizer) skipWhiteSpace() { if z.err != nil { return } for { c := z.readByte() if z.err != nil { return } switch c { case ' ', '\n', '\r', '\t', '\f': // No-op. default: z.raw.end-- return } } } // readRawOrRCDATA reads until the next "</foo>", where "foo" is z.rawTag and // is typically something like "script" or "textarea". func (z *Tokenizer) readRawOrRCDATA() { if z.rawTag == "script" { z.readScript() z.textIsRaw = true z.rawTag = "" return } loop: for { c := z.readByte() if z.err != nil { break loop } if c != '<' { continue loop } c = z.readByte() if z.err != nil { break loop } if c != '/' { continue loop } if z.readRawEndTag() || z.err != nil { break loop } } z.data.end = z.raw.end // A textarea's or title's RCDATA can contain escaped entities. z.textIsRaw = z.rawTag != "textarea" && z.rawTag != "title" z.rawTag = "" } // readRawEndTag attempts to read a tag like "</foo>", where "foo" is z.rawTag. // If it succeeds, it backs up the input position to reconsume the tag and // returns true. Otherwise it returns false. The opening "</" has already been // consumed. func (z *Tokenizer) readRawEndTag() bool { for i := 0; i < len(z.rawTag); i++ { c := z.readByte() if z.err != nil { return false } if c != z.rawTag[i] && c != z.rawTag[i]-('a'-'A') { z.raw.end-- return false } } c := z.readByte() if z.err != nil { return false } switch c { case ' ', '\n', '\r', '\t', '\f', '/', '>': // The 3 is 2 for the leading "</" plus 1 for the trailing character c. z.raw.end -= 3 + len(z.rawTag) return true } z.raw.end-- return false } // readScript reads until the next </script> tag, following the byzantine // rules for escaping/hiding the closing tag. func (z *Tokenizer) readScript() { defer func() { z.data.end = z.raw.end }() var c byte scriptData: c = z.readByte() if z.err != nil { return } if c == '<' { goto scriptDataLessThanSign } goto scriptData scriptDataLessThanSign: c = z.readByte() if z.err != nil { return } switch c { case '/': goto scriptDataEndTagOpen case '!': goto scriptDataEscapeStart } z.raw.end-- goto scriptData scriptDataEndTagOpen: if z.readRawEndTag() || z.err != nil { return } goto scriptData scriptDataEscapeStart: c = z.readByte() if z.err != nil { return } if c == '-' { goto scriptDataEscapeStartDash } z.raw.end-- goto scriptData scriptDataEscapeStartDash: c = z.readByte() if z.err != nil { return } if c == '-' { goto scriptDataEscapedDashDash } z.raw.end-- goto scriptData scriptDataEscaped: c = z.readByte() if z.err != nil { return } switch c { case '-': goto scriptDataEscapedDash case '<': goto scriptDataEscapedLessThanSign } goto scriptDataEscaped scriptDataEscapedDash: c = z.readByte() if z.err != nil { return } switch c { case '-': goto scriptDataEscapedDashDash case '<': goto scriptDataEscapedLessThanSign } goto scriptDataEscaped scriptDataEscapedDashDash: c = z.readByte() if z.err != nil { return } switch c { case '-': goto scriptDataEscapedDashDash case '<': goto scriptDataEscapedLessThanSign case '>': goto scriptData } goto scriptDataEscaped scriptDataEscapedLessThanSign: c = z.readByte() if z.err != nil { return } if c == '/' { goto scriptDataEscapedEndTagOpen } if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' { goto scriptDataDoubleEscapeStart } z.raw.end-- goto scriptData scriptDataEscapedEndTagOpen: if z.readRawEndTag() || z.err != nil { return } goto scriptDataEscaped scriptDataDoubleEscapeStart: z.raw.end-- for i := 0; i < len("script"); i++ { c = z.readByte() if z.err != nil { return } if c != "script"[i] && c != "SCRIPT"[i] { z.raw.end-- goto scriptDataEscaped } } c = z.readByte() if z.err != nil { return } switch c { case ' ', '\n', '\r', '\t', '\f', '/', '>': goto scriptDataDoubleEscaped } z.raw.end-- goto scriptDataEscaped scriptDataDoubleEscaped: c = z.readByte() if z.err != nil { return } switch c { case '-': goto scriptDataDoubleEscapedDash case '<': goto scriptDataDoubleEscapedLessThanSign } goto scriptDataDoubleEscaped scriptDataDoubleEscapedDash: c = z.readByte() if z.err != nil { return } switch c { case '-': goto scriptDataDoubleEscapedDashDash case '<': goto scriptDataDoubleEscapedLessThanSign } goto scriptDataDoubleEscaped scriptDataDoubleEscapedDashDash: c = z.readByte() if z.err != nil { return } switch c { case '-': goto scriptDataDoubleEscapedDashDash case '<': goto scriptDataDoubleEscapedLessThanSign case '>': goto scriptData } goto scriptDataDoubleEscaped scriptDataDoubleEscapedLessThanSign: c = z.readByte() if z.err != nil { return } if c == '/' { goto scriptDataDoubleEscapeEnd } z.raw.end-- goto scriptDataDoubleEscaped scriptDataDoubleEscapeEnd: if z.readRawEndTag() { z.raw.end += len("</script>") goto scriptDataEscaped } if z.err != nil { return } goto scriptDataDoubleEscaped } // readComment reads the next comment token starting with "<!--". The opening // "<!--" has already been consumed. func (z *Tokenizer) readComment() { z.data.start = z.raw.end defer func() { if z.data.end < z.data.start { // It's a comment with no data, like <!-->. z.data.end = z.data.start } }() for dashCount := 2; ; { c := z.readByte() if z.err != nil { // Ignore up to two dashes at EOF. if dashCount > 2 { dashCount = 2 } z.data.end = z.raw.end - dashCount return } switch c { case '-': dashCount++ continue case '>': if dashCount >= 2 { z.data.end = z.raw.end - len("-->") return } case '!': if dashCount >= 2 { c = z.readByte() if z.err != nil { z.data.end = z.raw.end return } if c == '>' { z.data.end = z.raw.end - len("--!>") return } } } dashCount = 0 } } // readUntilCloseAngle reads until the next ">". func (z *Tokenizer) readUntilCloseAngle() { z.data.start = z.raw.end for { c := z.readByte() if z.err != nil { z.data.end = z.raw.end return } if c == '>' { z.data.end = z.raw.end - len(">") return } } } // readMarkupDeclaration reads the next token starting with "<!". It might be // a "<!--comment-->", a "<!DOCTYPE foo>", a "<![CDATA[section]]>" or // "<!a bogus comment". The opening "<!" has already been consumed. func (z *Tokenizer) readMarkupDeclaration() TokenType { z.data.start = z.raw.end var c [2]byte for i := 0; i < 2; i++ { c[i] = z.readByte() if z.err != nil { z.data.end = z.raw.end return CommentToken } } if c[0] == '-' && c[1] == '-' { z.readComment() return CommentToken } z.raw.end -= 2 if z.readDoctype() { return DoctypeToken } if z.allowCDATA && z.readCDATA() { z.convertNUL = true return TextToken } // It's a bogus comment. z.readUntilCloseAngle() return CommentToken } // readDoctype attempts to read a doctype declaration and returns true if // successful. The opening "<!" has already been consumed. func (z *Tokenizer) readDoctype() bool { const s = "DOCTYPE" for i := 0; i < len(s); i++ { c := z.readByte() if z.err != nil { z.data.end = z.raw.end return false } if c != s[i] && c != s[i]+('a'-'A') { // Back up to read the fragment of "DOCTYPE" again. z.raw.end = z.data.start return false } } if z.skipWhiteSpace(); z.err != nil { z.data.start = z.raw.end z.data.end = z.raw.end return true } z.readUntilCloseAngle() return true } // readCDATA attempts to read a CDATA section and returns true if // successful. The opening "<!" has already been consumed. func (z *Tokenizer) readCDATA() bool { const s = "[CDATA[" for i := 0; i < len(s); i++ { c := z.readByte() if z.err != nil { z.data.end = z.raw.end return false } if c != s[i] { // Back up to read the fragment of "[CDATA[" again. z.raw.end = z.data.start return false } } z.data.start = z.raw.end brackets := 0 for { c := z.readByte() if z.err != nil { z.data.end = z.raw.end return true } switch c { case ']': brackets++ case '>': if brackets >= 2 { z.data.end = z.raw.end - len("]]>") return true } brackets = 0 default: brackets = 0 } } } // startTagIn returns whether the start tag in z.buf[z.data.start:z.data.end] // case-insensitively matches any element of ss. func (z *Tokenizer) startTagIn(ss ...string) bool { loop: for _, s := range ss { if z.data.end-z.data.start != len(s) { continue loop } for i := 0; i < len(s); i++ { c := z.buf[z.data.start+i] if 'A' <= c && c <= 'Z' { c += 'a' - 'A' } if c != s[i] { continue loop } } return true } return false } // readStartTag reads the next start tag token. The opening "<a" has already // been consumed, where 'a' means anything in [A-Za-z]. func (z *Tokenizer) readStartTag() TokenType { z.readTag(true) if z.err != nil { return ErrorToken } // Several tags flag the tokenizer's next token as raw. c, raw := z.buf[z.data.start], false if 'A' <= c && c <= 'Z' { c += 'a' - 'A' } switch c { case 'i': raw = z.startTagIn("iframe") case 'n': raw = z.startTagIn("noembed", "noframes", "noscript") case 'p': raw = z.startTagIn("plaintext") case 's': raw = z.startTagIn("script", "style") case 't': raw = z.startTagIn("textarea", "title") case 'x': raw = z.startTagIn("xmp") } if raw { z.rawTag = strings.ToLower(string(z.buf[z.data.start:z.data.end])) } // Look for a self-closing token like "<br/>". if z.err == nil && z.buf[z.raw.end-2] == '/' { return SelfClosingTagToken } return StartTagToken } // readTag reads the next tag token and its attributes. If saveAttr, those // attributes are saved in z.attr, otherwise z.attr is set to an empty slice. // The opening "<a" or "</a" has already been consumed, where 'a' means anything // in [A-Za-z]. func (z *Tokenizer) readTag(saveAttr bool) { z.attr = z.attr[:0] z.nAttrReturned = 0 // Read the tag name and attribute key/value pairs. z.readTagName() if z.skipWhiteSpace(); z.err != nil { return } for { c := z.readByte() if z.err != nil || c == '>' { break } z.raw.end-- z.readTagAttrKey() z.readTagAttrVal() // Save pendingAttr if saveAttr and that attribute has a non-empty key. if saveAttr && z.pendingAttr[0].start != z.pendingAttr[0].end { z.attr = append(z.attr, z.pendingAttr) } if z.skipWhiteSpace(); z.err != nil { break } } } // readTagName sets z.data to the "div" in "<div k=v>". The reader (z.raw.end) // is positioned such that the first byte of the tag name (the "d" in "<div") // has already been consumed. func (z *Tokenizer) readTagName() { z.data.start = z.raw.end - 1 for { c := z.readByte() if z.err != nil { z.data.end = z.raw.end return } switch c { case ' ', '\n', '\r', '\t', '\f': z.data.end = z.raw.end - 1 return case '/', '>': z.raw.end-- z.data.end = z.raw.end return } } } // readTagAttrKey sets z.pendingAttr[0] to the "k" in "<div k=v>". // Precondition: z.err == nil. func (z *Tokenizer) readTagAttrKey() { z.pendingAttr[0].start = z.raw.end for { c := z.readByte() if z.err != nil { z.pendingAttr[0].end = z.raw.end return } switch c { case ' ', '\n', '\r', '\t', '\f', '/': z.pendingAttr[0].end = z.raw.end - 1 return case '=', '>': z.raw.end-- z.pendingAttr[0].end = z.raw.end return } } } // readTagAttrVal sets z.pendingAttr[1] to the "v" in "<div k=v>". func (z *Tokenizer) readTagAttrVal() { z.pendingAttr[1].start = z.raw.end z.pendingAttr[1].end = z.raw.end if z.skipWhiteSpace(); z.err != nil { return } c := z.readByte() if z.err != nil { return } if c != '=' { z.raw.end-- return } if z.skipWhiteSpace(); z.err != nil { return } quote := z.readByte() if z.err != nil { return } switch quote { case '>': z.raw.end-- return case '\'', '"': z.pendingAttr[1].start = z.raw.end for { c := z.readByte() if z.err != nil { z.pendingAttr[1].end = z.raw.end return } if c == quote { z.pendingAttr[1].end = z.raw.end - 1 return } } default: z.pendingAttr[1].start = z.raw.end - 1 for { c := z.readByte() if z.err != nil { z.pendingAttr[1].end = z.raw.end return } switch c { case ' ', '\n', '\r', '\t', '\f': z.pendingAttr[1].end = z.raw.end - 1 return case '>': z.raw.end-- z.pendingAttr[1].end = z.raw.end return } } } } // Next scans the next token and returns its type. func (z *Tokenizer) Next() TokenType { z.raw.start = z.raw.end z.data.start = z.raw.end z.data.end = z.raw.end if z.err != nil { z.tt = ErrorToken return z.tt } if z.rawTag != "" { if z.rawTag == "plaintext" { // Read everything up to EOF. for z.err == nil { z.readByte() } z.data.end = z.raw.end z.textIsRaw = true } else { z.readRawOrRCDATA() } if z.data.end > z.data.start { z.tt = TextToken z.convertNUL = true return z.tt } } z.textIsRaw = false z.convertNUL = false loop: for { c := z.readByte() if z.err != nil { break loop } if c != '<' { continue loop } // Check if the '<' we have just read is part of a tag, comment // or doctype. If not, it's part of the accumulated text token. c = z.readByte() if z.err != nil { break loop } var tokenType TokenType switch { case 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z': tokenType = StartTagToken case c == '/': tokenType = EndTagToken case c == '!' || c == '?': // We use CommentToken to mean any of "<!--actual comments-->", // "<!DOCTYPE declarations>" and "<?xml processing instructions?>". tokenType = CommentToken default: // Reconsume the current character. z.raw.end-- continue } // We have a non-text token, but we might have accumulated some text // before that. If so, we return the text first, and return the non- // text token on the subsequent call to Next. if x := z.raw.end - len("<a"); z.raw.start < x { z.raw.end = x z.data.end = x z.tt = TextToken return z.tt } switch tokenType { case StartTagToken: z.tt = z.readStartTag() return z.tt case EndTagToken: c = z.readByte() if z.err != nil { break loop } if c == '>' { // "</>" does not generate a token at all. Generate an empty comment // to allow passthrough clients to pick up the data using Raw. // Reset the tokenizer state and start again. z.tt = CommentToken return z.tt } if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' { z.readTag(false) if z.err != nil { z.tt = ErrorToken } else { z.tt = EndTagToken } return z.tt } z.raw.end-- z.readUntilCloseAngle() z.tt = CommentToken return z.tt case CommentToken: if c == '!' { z.tt = z.readMarkupDeclaration() return z.tt } z.raw.end-- z.readUntilCloseAngle() z.tt = CommentToken return z.tt } } if z.raw.start < z.raw.end { z.data.end = z.raw.end z.tt = TextToken return z.tt } z.tt = ErrorToken return z.tt } // Raw returns the unmodified text of the current token. Calling Next, Token, // Text, TagName or TagAttr may change the contents of the returned slice. func (z *Tokenizer) Raw() []byte { return z.buf[z.raw.start:z.raw.end] } // convertNewlines converts "\r" and "\r\n" in s to "\n". // The conversion happens in place, but the resulting slice may be shorter. func convertNewlines(s []byte) []byte { for i, c := range s { if c != '\r' { continue } src := i + 1 if src >= len(s) || s[src] != '\n' { s[i] = '\n' continue } dst := i for src < len(s) { if s[src] == '\r' { if src+1 < len(s) && s[src+1] == '\n' { src++ } s[dst] = '\n' } else { s[dst] = s[src] } src++ dst++ } return s[:dst] } return s } var ( nul = []byte("\x00") replacement = []byte("\ufffd") ) // Text returns the unescaped text of a text, comment or doctype token. The // contents of the returned slice may change on the next call to Next. func (z *Tokenizer) Text() []byte { switch z.tt { case TextToken, CommentToken, DoctypeToken: s := z.buf[z.data.start:z.data.end] z.data.start = z.raw.end z.data.end = z.raw.end s = convertNewlines(s) if (z.convertNUL || z.tt == CommentToken) && bytes.Contains(s, nul) { s = bytes.Replace(s, nul, replacement, -1) } if !z.textIsRaw { s = unescape(s, false) } return s } return nil } // TagName returns the lower-cased name of a tag token (the `img` out of // `<IMG SRC="foo">`) and whether the tag has attributes. // The contents of the returned slice may change on the next call to Next. func (z *Tokenizer) TagName() (name []byte, hasAttr bool) { if z.data.start < z.data.end { switch z.tt { case StartTagToken, EndTagToken, SelfClosingTagToken: s := z.buf[z.data.start:z.data.end] z.data.start = z.raw.end z.data.end = z.raw.end return lower(s), z.nAttrReturned < len(z.attr) } } return nil, false } // TagAttr returns the lower-cased key and unescaped value of the next unparsed // attribute for the current tag token and whether there are more attributes. // The contents of the returned slices may change on the next call to Next. func (z *Tokenizer) TagAttr() (key, val []byte, moreAttr bool) { if z.nAttrReturned < len(z.attr) { switch z.tt { case StartTagToken, SelfClosingTagToken: x := z.attr[z.nAttrReturned] z.nAttrReturned++ key = z.buf[x[0].start:x[0].end] val = z.buf[x[1].start:x[1].end] return lower(key), unescape(convertNewlines(val), true), z.nAttrReturned < len(z.attr) } } return nil, nil, false } // Token returns the next Token. The result's Data and Attr values remain valid // after subsequent Next calls. func (z *Tokenizer) Token() Token { t := Token{Type: z.tt} switch z.tt { case TextToken, CommentToken, DoctypeToken: t.Data = string(z.Text()) case StartTagToken, SelfClosingTagToken, EndTagToken: name, moreAttr := z.TagName() for moreAttr { var key, val []byte key, val, moreAttr = z.TagAttr() t.Attr = append(t.Attr, Attribute{"", atom.String(key), string(val)}) } if a := atom.Lookup(name); a != 0 { t.DataAtom, t.Data = a, a.String() } else { t.DataAtom, t.Data = 0, string(name) } } return t } // SetMaxBuf sets a limit on the amount of data buffered during tokenization. // A value of 0 means unlimited. func (z *Tokenizer) SetMaxBuf(n int) { z.maxBuf = n } // NewTokenizer returns a new HTML Tokenizer for the given Reader. // The input is assumed to be UTF-8 encoded. func NewTokenizer(r io.Reader) *Tokenizer { return NewTokenizerFragment(r, "") } // NewTokenizerFragment returns a new HTML Tokenizer for the given Reader, for // tokenizing an existing element's InnerHTML fragment. contextTag is that // element's tag, such as "div" or "iframe". // // For example, how the InnerHTML "a<b" is tokenized depends on whether it is // for a <p> tag or a <script> tag. // // The input is assumed to be UTF-8 encoded. func NewTokenizerFragment(r io.Reader, contextTag string) *Tokenizer { z := &Tokenizer{ r: r, buf: make([]byte, 0, 4096), } if contextTag != "" { switch s := strings.ToLower(contextTag); s { case "iframe", "noembed", "noframes", "noscript", "plaintext", "script", "style", "title", "textarea", "xmp": z.rawTag = s } } return z } ================================================ FILE: vendor/golang.org/x/net/idna/idna.go ================================================ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. // Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package idna implements IDNA2008 using the compatibility processing // defined by UTS (Unicode Technical Standard) #46, which defines a standard to // deal with the transition from IDNA2003. // // IDNA2008 (Internationalized Domain Names for Applications), is defined in RFC // 5890, RFC 5891, RFC 5892, RFC 5893 and RFC 5894. // UTS #46 is defined in http://www.unicode.org/reports/tr46. // See http://unicode.org/cldr/utility/idna.jsp for a visualization of the // differences between these two standards. package idna // import "golang.org/x/net/idna" import ( "fmt" "strings" "unicode/utf8" "golang.org/x/text/secure/bidirule" "golang.org/x/text/unicode/bidi" "golang.org/x/text/unicode/norm" ) // NOTE: Unlike common practice in Go APIs, the functions will return a // sanitized domain name in case of errors. Browsers sometimes use a partially // evaluated string as lookup. // TODO: the current error handling is, in my opinion, the least opinionated. // Other strategies are also viable, though: // Option 1) Return an empty string in case of error, but allow the user to // specify explicitly which errors to ignore. // Option 2) Return the partially evaluated string if it is itself a valid // string, otherwise return the empty string in case of error. // Option 3) Option 1 and 2. // Option 4) Always return an empty string for now and implement Option 1 as // needed, and document that the return string may not be empty in case of // error in the future. // I think Option 1 is best, but it is quite opinionated. // ToASCII is a wrapper for Punycode.ToASCII. func ToASCII(s string) (string, error) { return Punycode.process(s, true) } // ToUnicode is a wrapper for Punycode.ToUnicode. func ToUnicode(s string) (string, error) { return Punycode.process(s, false) } // An Option configures a Profile at creation time. type Option func(*options) // Transitional sets a Profile to use the Transitional mapping as defined in UTS // #46. This will cause, for example, "ß" to be mapped to "ss". Using the // transitional mapping provides a compromise between IDNA2003 and IDNA2008 // compatibility. It is used by most browsers when resolving domain names. This // option is only meaningful if combined with MapForLookup. func Transitional(transitional bool) Option { return func(o *options) { o.transitional = true } } // VerifyDNSLength sets whether a Profile should fail if any of the IDN parts // are longer than allowed by the RFC. func VerifyDNSLength(verify bool) Option { return func(o *options) { o.verifyDNSLength = verify } } // RemoveLeadingDots removes leading label separators. Leading runes that map to // dots, such as U+3002 IDEOGRAPHIC FULL STOP, are removed as well. // // This is the behavior suggested by the UTS #46 and is adopted by some // browsers. func RemoveLeadingDots(remove bool) Option { return func(o *options) { o.removeLeadingDots = remove } } // ValidateLabels sets whether to check the mandatory label validation criteria // as defined in Section 5.4 of RFC 5891. This includes testing for correct use // of hyphens ('-'), normalization, validity of runes, and the context rules. func ValidateLabels(enable bool) Option { return func(o *options) { // Don't override existing mappings, but set one that at least checks // normalization if it is not set. if o.mapping == nil && enable { o.mapping = normalize } o.trie = trie o.validateLabels = enable o.fromPuny = validateFromPunycode } } // StrictDomainName limits the set of permissible ASCII characters to those // allowed in domain names as defined in RFC 1034 (A-Z, a-z, 0-9 and the // hyphen). This is set by default for MapForLookup and ValidateForRegistration. // // This option is useful, for instance, for browsers that allow characters // outside this range, for example a '_' (U+005F LOW LINE). See // http://www.rfc-editor.org/std/std3.txt for more details This option // corresponds to the UseSTD3ASCIIRules option in UTS #46. func StrictDomainName(use bool) Option { return func(o *options) { o.trie = trie o.useSTD3Rules = use o.fromPuny = validateFromPunycode } } // NOTE: the following options pull in tables. The tables should not be linked // in as long as the options are not used. // BidiRule enables the Bidi rule as defined in RFC 5893. Any application // that relies on proper validation of labels should include this rule. func BidiRule() Option { return func(o *options) { o.bidirule = bidirule.ValidString } } // ValidateForRegistration sets validation options to verify that a given IDN is // properly formatted for registration as defined by Section 4 of RFC 5891. func ValidateForRegistration() Option { return func(o *options) { o.mapping = validateRegistration StrictDomainName(true)(o) ValidateLabels(true)(o) VerifyDNSLength(true)(o) BidiRule()(o) } } // MapForLookup sets validation and mapping options such that a given IDN is // transformed for domain name lookup according to the requirements set out in // Section 5 of RFC 5891. The mappings follow the recommendations of RFC 5894, // RFC 5895 and UTS 46. It does not add the Bidi Rule. Use the BidiRule option // to add this check. // // The mappings include normalization and mapping case, width and other // compatibility mappings. func MapForLookup() Option { return func(o *options) { o.mapping = validateAndMap StrictDomainName(true)(o) ValidateLabels(true)(o) } } type options struct { transitional bool useSTD3Rules bool validateLabels bool verifyDNSLength bool removeLeadingDots bool trie *idnaTrie // fromPuny calls validation rules when converting A-labels to U-labels. fromPuny func(p *Profile, s string) error // mapping implements a validation and mapping step as defined in RFC 5895 // or UTS 46, tailored to, for example, domain registration or lookup. mapping func(p *Profile, s string) (mapped string, isBidi bool, err error) // bidirule, if specified, checks whether s conforms to the Bidi Rule // defined in RFC 5893. bidirule func(s string) bool } // A Profile defines the configuration of an IDNA mapper. type Profile struct { options } func apply(o *options, opts []Option) { for _, f := range opts { f(o) } } // New creates a new Profile. // // With no options, the returned Profile is the most permissive and equals the // Punycode Profile. Options can be passed to further restrict the Profile. The // MapForLookup and ValidateForRegistration options set a collection of options, // for lookup and registration purposes respectively, which can be tailored by // adding more fine-grained options, where later options override earlier // options. func New(o ...Option) *Profile { p := &Profile{} apply(&p.options, o) return p } // ToASCII converts a domain or domain label to its ASCII form. For example, // ToASCII("bücher.example.com") is "xn--bcher-kva.example.com", and // ToASCII("golang") is "golang". If an error is encountered it will return // an error and a (partially) processed result. func (p *Profile) ToASCII(s string) (string, error) { return p.process(s, true) } // ToUnicode converts a domain or domain label to its Unicode form. For example, // ToUnicode("xn--bcher-kva.example.com") is "bücher.example.com", and // ToUnicode("golang") is "golang". If an error is encountered it will return // an error and a (partially) processed result. func (p *Profile) ToUnicode(s string) (string, error) { pp := *p pp.transitional = false return pp.process(s, false) } // String reports a string with a description of the profile for debugging // purposes. The string format may change with different versions. func (p *Profile) String() string { s := "" if p.transitional { s = "Transitional" } else { s = "NonTransitional" } if p.useSTD3Rules { s += ":UseSTD3Rules" } if p.validateLabels { s += ":ValidateLabels" } if p.verifyDNSLength { s += ":VerifyDNSLength" } return s } var ( // Punycode is a Profile that does raw punycode processing with a minimum // of validation. Punycode *Profile = punycode // Lookup is the recommended profile for looking up domain names, according // to Section 5 of RFC 5891. The exact configuration of this profile may // change over time. Lookup *Profile = lookup // Display is the recommended profile for displaying domain names. // The configuration of this profile may change over time. Display *Profile = display // Registration is the recommended profile for checking whether a given // IDN is valid for registration, according to Section 4 of RFC 5891. Registration *Profile = registration punycode = &Profile{} lookup = &Profile{options{ transitional: true, useSTD3Rules: true, validateLabels: true, trie: trie, fromPuny: validateFromPunycode, mapping: validateAndMap, bidirule: bidirule.ValidString, }} display = &Profile{options{ useSTD3Rules: true, validateLabels: true, trie: trie, fromPuny: validateFromPunycode, mapping: validateAndMap, bidirule: bidirule.ValidString, }} registration = &Profile{options{ useSTD3Rules: true, validateLabels: true, verifyDNSLength: true, trie: trie, fromPuny: validateFromPunycode, mapping: validateRegistration, bidirule: bidirule.ValidString, }} // TODO: profiles // Register: recommended for approving domain names: don't do any mappings // but rather reject on invalid input. Bundle or block deviation characters. ) type labelError struct{ label, code_ string } func (e labelError) code() string { return e.code_ } func (e labelError) Error() string { return fmt.Sprintf("idna: invalid label %q", e.label) } type runeError rune func (e runeError) code() string { return "P1" } func (e runeError) Error() string { return fmt.Sprintf("idna: disallowed rune %U", e) } // process implements the algorithm described in section 4 of UTS #46, // see http://www.unicode.org/reports/tr46. func (p *Profile) process(s string, toASCII bool) (string, error) { var err error var isBidi bool if p.mapping != nil { s, isBidi, err = p.mapping(p, s) } // Remove leading empty labels. if p.removeLeadingDots { for ; len(s) > 0 && s[0] == '.'; s = s[1:] { } } // TODO: allow for a quick check of the tables data. // It seems like we should only create this error on ToASCII, but the // UTS 46 conformance tests suggests we should always check this. if err == nil && p.verifyDNSLength && s == "" { err = &labelError{s, "A4"} } labels := labelIter{orig: s} for ; !labels.done(); labels.next() { label := labels.label() if label == "" { // Empty labels are not okay. The label iterator skips the last // label if it is empty. if err == nil && p.verifyDNSLength { err = &labelError{s, "A4"} } continue } if strings.HasPrefix(label, acePrefix) { u, err2 := decode(label[len(acePrefix):]) if err2 != nil { if err == nil { err = err2 } // Spec says keep the old label. continue } isBidi = isBidi || bidirule.DirectionString(u) != bidi.LeftToRight labels.set(u) if err == nil && p.validateLabels { err = p.fromPuny(p, u) } if err == nil { // This should be called on NonTransitional, according to the // spec, but that currently does not have any effect. Use the // original profile to preserve options. err = p.validateLabel(u) } } else if err == nil { err = p.validateLabel(label) } } if isBidi && p.bidirule != nil && err == nil { for labels.reset(); !labels.done(); labels.next() { if !p.bidirule(labels.label()) { err = &labelError{s, "B"} break } } } if toASCII { for labels.reset(); !labels.done(); labels.next() { label := labels.label() if !ascii(label) { a, err2 := encode(acePrefix, label) if err == nil { err = err2 } label = a labels.set(a) } n := len(label) if p.verifyDNSLength && err == nil && (n == 0 || n > 63) { err = &labelError{label, "A4"} } } } s = labels.result() if toASCII && p.verifyDNSLength && err == nil { // Compute the length of the domain name minus the root label and its dot. n := len(s) if n > 0 && s[n-1] == '.' { n-- } if len(s) < 1 || n > 253 { err = &labelError{s, "A4"} } } return s, err } func normalize(p *Profile, s string) (mapped string, isBidi bool, err error) { // TODO: consider first doing a quick check to see if any of these checks // need to be done. This will make it slower in the general case, but // faster in the common case. mapped = norm.NFC.String(s) isBidi = bidirule.DirectionString(mapped) == bidi.RightToLeft return mapped, isBidi, nil } func validateRegistration(p *Profile, s string) (idem string, bidi bool, err error) { // TODO: filter need for normalization in loop below. if !norm.NFC.IsNormalString(s) { return s, false, &labelError{s, "V1"} } for i := 0; i < len(s); { v, sz := trie.lookupString(s[i:]) if sz == 0 { return s, bidi, runeError(utf8.RuneError) } bidi = bidi || info(v).isBidi(s[i:]) // Copy bytes not copied so far. switch p.simplify(info(v).category()) { // TODO: handle the NV8 defined in the Unicode idna data set to allow // for strict conformance to IDNA2008. case valid, deviation: case disallowed, mapped, unknown, ignored: r, _ := utf8.DecodeRuneInString(s[i:]) return s, bidi, runeError(r) } i += sz } return s, bidi, nil } func (c info) isBidi(s string) bool { if !c.isMapped() { return c&attributesMask == rtl } // TODO: also store bidi info for mapped data. This is possible, but a bit // cumbersome and not for the common case. p, _ := bidi.LookupString(s) switch p.Class() { case bidi.R, bidi.AL, bidi.AN: return true } return false } func validateAndMap(p *Profile, s string) (vm string, bidi bool, err error) { var ( b []byte k int ) // combinedInfoBits contains the or-ed bits of all runes. We use this // to derive the mayNeedNorm bit later. This may trigger normalization // overeagerly, but it will not do so in the common case. The end result // is another 10% saving on BenchmarkProfile for the common case. var combinedInfoBits info for i := 0; i < len(s); { v, sz := trie.lookupString(s[i:]) if sz == 0 { b = append(b, s[k:i]...) b = append(b, "\ufffd"...) k = len(s) if err == nil { err = runeError(utf8.RuneError) } break } combinedInfoBits |= info(v) bidi = bidi || info(v).isBidi(s[i:]) start := i i += sz // Copy bytes not copied so far. switch p.simplify(info(v).category()) { case valid: continue case disallowed: if err == nil { r, _ := utf8.DecodeRuneInString(s[start:]) err = runeError(r) } continue case mapped, deviation: b = append(b, s[k:start]...) b = info(v).appendMapping(b, s[start:i]) case ignored: b = append(b, s[k:start]...) // drop the rune case unknown: b = append(b, s[k:start]...) b = append(b, "\ufffd"...) } k = i } if k == 0 { // No changes so far. if combinedInfoBits&mayNeedNorm != 0 { s = norm.NFC.String(s) } } else { b = append(b, s[k:]...) if norm.NFC.QuickSpan(b) != len(b) { b = norm.NFC.Bytes(b) } // TODO: the punycode converters require strings as input. s = string(b) } return s, bidi, err } // A labelIter allows iterating over domain name labels. type labelIter struct { orig string slice []string curStart int curEnd int i int } func (l *labelIter) reset() { l.curStart = 0 l.curEnd = 0 l.i = 0 } func (l *labelIter) done() bool { return l.curStart >= len(l.orig) } func (l *labelIter) result() string { if l.slice != nil { return strings.Join(l.slice, ".") } return l.orig } func (l *labelIter) label() string { if l.slice != nil { return l.slice[l.i] } p := strings.IndexByte(l.orig[l.curStart:], '.') l.curEnd = l.curStart + p if p == -1 { l.curEnd = len(l.orig) } return l.orig[l.curStart:l.curEnd] } // next sets the value to the next label. It skips the last label if it is empty. func (l *labelIter) next() { l.i++ if l.slice != nil { if l.i >= len(l.slice) || l.i == len(l.slice)-1 && l.slice[l.i] == "" { l.curStart = len(l.orig) } } else { l.curStart = l.curEnd + 1 if l.curStart == len(l.orig)-1 && l.orig[l.curStart] == '.' { l.curStart = len(l.orig) } } } func (l *labelIter) set(s string) { if l.slice == nil { l.slice = strings.Split(l.orig, ".") } l.slice[l.i] = s } // acePrefix is the ASCII Compatible Encoding prefix. const acePrefix = "xn--" func (p *Profile) simplify(cat category) category { switch cat { case disallowedSTD3Mapped: if p.useSTD3Rules { cat = disallowed } else { cat = mapped } case disallowedSTD3Valid: if p.useSTD3Rules { cat = disallowed } else { cat = valid } case deviation: if !p.transitional { cat = valid } case validNV8, validXV8: // TODO: handle V2008 cat = valid } return cat } func validateFromPunycode(p *Profile, s string) error { if !norm.NFC.IsNormalString(s) { return &labelError{s, "V1"} } // TODO: detect whether string may have to be normalized in the following // loop. for i := 0; i < len(s); { v, sz := trie.lookupString(s[i:]) if sz == 0 { return runeError(utf8.RuneError) } if c := p.simplify(info(v).category()); c != valid && c != deviation { return &labelError{s, "V6"} } i += sz } return nil } const ( zwnj = "\u200c" zwj = "\u200d" ) type joinState int8 const ( stateStart joinState = iota stateVirama stateBefore stateBeforeVirama stateAfter stateFAIL ) var joinStates = [][numJoinTypes]joinState{ stateStart: { joiningL: stateBefore, joiningD: stateBefore, joinZWNJ: stateFAIL, joinZWJ: stateFAIL, joinVirama: stateVirama, }, stateVirama: { joiningL: stateBefore, joiningD: stateBefore, }, stateBefore: { joiningL: stateBefore, joiningD: stateBefore, joiningT: stateBefore, joinZWNJ: stateAfter, joinZWJ: stateFAIL, joinVirama: stateBeforeVirama, }, stateBeforeVirama: { joiningL: stateBefore, joiningD: stateBefore, joiningT: stateBefore, }, stateAfter: { joiningL: stateFAIL, joiningD: stateBefore, joiningT: stateAfter, joiningR: stateStart, joinZWNJ: stateFAIL, joinZWJ: stateFAIL, joinVirama: stateAfter, // no-op as we can't accept joiners here }, stateFAIL: { 0: stateFAIL, joiningL: stateFAIL, joiningD: stateFAIL, joiningT: stateFAIL, joiningR: stateFAIL, joinZWNJ: stateFAIL, joinZWJ: stateFAIL, joinVirama: stateFAIL, }, } // validateLabel validates the criteria from Section 4.1. Item 1, 4, and 6 are // already implicitly satisfied by the overall implementation. func (p *Profile) validateLabel(s string) (err error) { if s == "" { if p.verifyDNSLength { return &labelError{s, "A4"} } return nil } if !p.validateLabels { return nil } trie := p.trie // p.validateLabels is only set if trie is set. if len(s) > 4 && s[2] == '-' && s[3] == '-' { return &labelError{s, "V2"} } if s[0] == '-' || s[len(s)-1] == '-' { return &labelError{s, "V3"} } // TODO: merge the use of this in the trie. v, sz := trie.lookupString(s) x := info(v) if x.isModifier() { return &labelError{s, "V5"} } // Quickly return in the absence of zero-width (non) joiners. if strings.Index(s, zwj) == -1 && strings.Index(s, zwnj) == -1 { return nil } st := stateStart for i := 0; ; { jt := x.joinType() if s[i:i+sz] == zwj { jt = joinZWJ } else if s[i:i+sz] == zwnj { jt = joinZWNJ } st = joinStates[st][jt] if x.isViramaModifier() { st = joinStates[st][joinVirama] } if i += sz; i == len(s) { break } v, sz = trie.lookupString(s[i:]) x = info(v) } if st == stateFAIL || st == stateAfter { return &labelError{s, "C"} } return nil } func ascii(s string) bool { for i := 0; i < len(s); i++ { if s[i] >= utf8.RuneSelf { return false } } return true } ================================================ FILE: vendor/golang.org/x/net/idna/punycode.go ================================================ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. // Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package idna // This file implements the Punycode algorithm from RFC 3492. import ( "math" "strings" "unicode/utf8" ) // These parameter values are specified in section 5. // // All computation is done with int32s, so that overflow behavior is identical // regardless of whether int is 32-bit or 64-bit. const ( base int32 = 36 damp int32 = 700 initialBias int32 = 72 initialN int32 = 128 skew int32 = 38 tmax int32 = 26 tmin int32 = 1 ) func punyError(s string) error { return &labelError{s, "A3"} } // decode decodes a string as specified in section 6.2. func decode(encoded string) (string, error) { if encoded == "" { return "", nil } pos := 1 + strings.LastIndex(encoded, "-") if pos == 1 { return "", punyError(encoded) } if pos == len(encoded) { return encoded[:len(encoded)-1], nil } output := make([]rune, 0, len(encoded)) if pos != 0 { for _, r := range encoded[:pos-1] { output = append(output, r) } } i, n, bias := int32(0), initialN, initialBias for pos < len(encoded) { oldI, w := i, int32(1) for k := base; ; k += base { if pos == len(encoded) { return "", punyError(encoded) } digit, ok := decodeDigit(encoded[pos]) if !ok { return "", punyError(encoded) } pos++ i += digit * w if i < 0 { return "", punyError(encoded) } t := k - bias if t < tmin { t = tmin } else if t > tmax { t = tmax } if digit < t { break } w *= base - t if w >= math.MaxInt32/base { return "", punyError(encoded) } } x := int32(len(output) + 1) bias = adapt(i-oldI, x, oldI == 0) n += i / x i %= x if n > utf8.MaxRune || len(output) >= 1024 { return "", punyError(encoded) } output = append(output, 0) copy(output[i+1:], output[i:]) output[i] = n i++ } return string(output), nil } // encode encodes a string as specified in section 6.3 and prepends prefix to // the result. // // The "while h < length(input)" line in the specification becomes "for // remaining != 0" in the Go code, because len(s) in Go is in bytes, not runes. func encode(prefix, s string) (string, error) { output := make([]byte, len(prefix), len(prefix)+1+2*len(s)) copy(output, prefix) delta, n, bias := int32(0), initialN, initialBias b, remaining := int32(0), int32(0) for _, r := range s { if r < 0x80 { b++ output = append(output, byte(r)) } else { remaining++ } } h := b if b > 0 { output = append(output, '-') } for remaining != 0 { m := int32(0x7fffffff) for _, r := range s { if m > r && r >= n { m = r } } delta += (m - n) * (h + 1) if delta < 0 { return "", punyError(s) } n = m for _, r := range s { if r < n { delta++ if delta < 0 { return "", punyError(s) } continue } if r > n { continue } q := delta for k := base; ; k += base { t := k - bias if t < tmin { t = tmin } else if t > tmax { t = tmax } if q < t { break } output = append(output, encodeDigit(t+(q-t)%(base-t))) q = (q - t) / (base - t) } output = append(output, encodeDigit(q)) bias = adapt(delta, h+1, h == b) delta = 0 h++ remaining-- } delta++ n++ } return string(output), nil } func decodeDigit(x byte) (digit int32, ok bool) { switch { case '0' <= x && x <= '9': return int32(x - ('0' - 26)), true case 'A' <= x && x <= 'Z': return int32(x - 'A'), true case 'a' <= x && x <= 'z': return int32(x - 'a'), true } return 0, false } func encodeDigit(digit int32) byte { switch { case 0 <= digit && digit < 26: return byte(digit + 'a') case 26 <= digit && digit < 36: return byte(digit + ('0' - 26)) } panic("idna: internal error in punycode encoding") } // adapt is the bias adaptation function specified in section 6.1. func adapt(delta, numPoints int32, firstTime bool) int32 { if firstTime { delta /= damp } else { delta /= 2 } delta += delta / numPoints k := int32(0) for delta > ((base-tmin)*tmax)/2 { delta /= base - tmin k += base } return k + (base-tmin+1)*delta/(delta+skew) } ================================================ FILE: vendor/golang.org/x/net/idna/tables.go ================================================ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. package idna // UnicodeVersion is the Unicode version from which the tables in this package are derived. const UnicodeVersion = "10.0.0" var mappings string = "" + // Size: 8176 bytes "\x00\x01 \x03 ̈\x01a\x03 ̄\x012\x013\x03 ́\x03 ̧\x011\x01o\x051⁄4\x051⁄2" + "\x053⁄4\x03i̇\x03l·\x03ʼn\x01s\x03dž\x03ⱥ\x03ⱦ\x01h\x01j\x01r\x01w\x01y" + "\x03 ̆\x03 ̇\x03 ̊\x03 ̨\x03 ̃\x03 ̋\x01l\x01x\x04̈́\x03 ι\x01;\x05 ̈́" + "\x04եւ\x04اٴ\x04وٴ\x04ۇٴ\x04يٴ\x06क़\x06ख़\x06ग़\x06ज़\x06ड़\x06ढ़\x06फ़" + "\x06य़\x06ড়\x06ঢ়\x06য়\x06ਲ਼\x06ਸ਼\x06ਖ਼\x06ਗ਼\x06ਜ਼\x06ਫ਼\x06ଡ଼\x06ଢ଼" + "\x06ํา\x06ໍາ\x06ຫນ\x06ຫມ\x06གྷ\x06ཌྷ\x06དྷ\x06བྷ\x06ཛྷ\x06ཀྵ\x06ཱི\x06ཱུ" + "\x06ྲྀ\x09ྲཱྀ\x06ླྀ\x09ླཱྀ\x06ཱྀ\x06ྒྷ\x06ྜྷ\x06ྡྷ\x06ྦྷ\x06ྫྷ\x06ྐྵ\x02" + "в\x02д\x02о\x02с\x02т\x02ъ\x02ѣ\x02æ\x01b\x01d\x01e\x02ǝ\x01g\x01i\x01k" + "\x01m\x01n\x02ȣ\x01p\x01t\x01u\x02ɐ\x02ɑ\x02ə\x02ɛ\x02ɜ\x02ŋ\x02ɔ\x02ɯ" + "\x01v\x02β\x02γ\x02δ\x02φ\x02χ\x02ρ\x02н\x02ɒ\x01c\x02ɕ\x02ð\x01f\x02ɟ" + "\x02ɡ\x02ɥ\x02ɨ\x02ɩ\x02ɪ\x02ʝ\x02ɭ\x02ʟ\x02ɱ\x02ɰ\x02ɲ\x02ɳ\x02ɴ\x02ɵ" + "\x02ɸ\x02ʂ\x02ʃ\x02ƫ\x02ʉ\x02ʊ\x02ʋ\x02ʌ\x01z\x02ʐ\x02ʑ\x02ʒ\x02θ\x02ss" + "\x02ά\x02έ\x02ή\x02ί\x02ό\x02ύ\x02ώ\x05ἀι\x05ἁι\x05ἂι\x05ἃι\x05ἄι\x05ἅι" + "\x05ἆι\x05ἇι\x05ἠι\x05ἡι\x05ἢι\x05ἣι\x05ἤι\x05ἥι\x05ἦι\x05ἧι\x05ὠι\x05ὡι" + "\x05ὢι\x05ὣι\x05ὤι\x05ὥι\x05ὦι\x05ὧι\x05ὰι\x04αι\x04άι\x05ᾶι\x02ι\x05 ̈͂" + "\x05ὴι\x04ηι\x04ήι\x05ῆι\x05 ̓̀\x05 ̓́\x05 ̓͂\x02ΐ\x05 ̔̀\x05 ̔́\x05 ̔͂" + "\x02ΰ\x05 ̈̀\x01`\x05ὼι\x04ωι\x04ώι\x05ῶι\x06′′\x09′′′\x06‵‵\x09‵‵‵\x02!" + "!\x02??\x02?!\x02!?\x0c′′′′\x010\x014\x015\x016\x017\x018\x019\x01+\x01=" + "\x01(\x01)\x02rs\x02ħ\x02no\x01q\x02sm\x02tm\x02ω\x02å\x02א\x02ב\x02ג" + "\x02ד\x02π\x051⁄7\x051⁄9\x061⁄10\x051⁄3\x052⁄3\x051⁄5\x052⁄5\x053⁄5\x054" + "⁄5\x051⁄6\x055⁄6\x051⁄8\x053⁄8\x055⁄8\x057⁄8\x041⁄\x02ii\x02iv\x02vi" + "\x04viii\x02ix\x02xi\x050⁄3\x06∫∫\x09∫∫∫\x06∮∮\x09∮∮∮\x0210\x0211\x0212" + "\x0213\x0214\x0215\x0216\x0217\x0218\x0219\x0220\x04(10)\x04(11)\x04(12)" + "\x04(13)\x04(14)\x04(15)\x04(16)\x04(17)\x04(18)\x04(19)\x04(20)\x0c∫∫∫∫" + "\x02==\x05⫝̸\x02ɫ\x02ɽ\x02ȿ\x02ɀ\x01.\x04 ゙\x04 ゚\x06より\x06コト\x05(ᄀ)\x05" + "(ᄂ)\x05(ᄃ)\x05(ᄅ)\x05(ᄆ)\x05(ᄇ)\x05(ᄉ)\x05(ᄋ)\x05(ᄌ)\x05(ᄎ)\x05(ᄏ)\x05(ᄐ" + ")\x05(ᄑ)\x05(ᄒ)\x05(가)\x05(나)\x05(다)\x05(라)\x05(마)\x05(바)\x05(사)\x05(아)" + "\x05(자)\x05(차)\x05(카)\x05(타)\x05(파)\x05(하)\x05(주)\x08(오전)\x08(오후)\x05(一)" + "\x05(二)\x05(三)\x05(四)\x05(五)\x05(六)\x05(七)\x05(八)\x05(九)\x05(十)\x05(月)" + "\x05(火)\x05(水)\x05(木)\x05(金)\x05(土)\x05(日)\x05(株)\x05(有)\x05(社)\x05(名)" + "\x05(特)\x05(財)\x05(祝)\x05(労)\x05(代)\x05(呼)\x05(学)\x05(監)\x05(企)\x05(資)" + "\x05(協)\x05(祭)\x05(休)\x05(自)\x05(至)\x0221\x0222\x0223\x0224\x0225\x0226" + "\x0227\x0228\x0229\x0230\x0231\x0232\x0233\x0234\x0235\x06참고\x06주의\x0236" + "\x0237\x0238\x0239\x0240\x0241\x0242\x0243\x0244\x0245\x0246\x0247\x0248" + "\x0249\x0250\x041月\x042月\x043月\x044月\x045月\x046月\x047月\x048月\x049月\x0510" + "月\x0511月\x0512月\x02hg\x02ev\x0cアパート\x0cアルファ\x0cアンペア\x09アール\x0cイニング\x09" + "インチ\x09ウォン\x0fエスクード\x0cエーカー\x09オンス\x09オーム\x09カイリ\x0cカラット\x0cカロリー\x09ガロ" + "ン\x09ガンマ\x06ギガ\x09ギニー\x0cキュリー\x0cギルダー\x06キロ\x0fキログラム\x12キロメートル\x0fキロワッ" + "ト\x09グラム\x0fグラムトン\x0fクルゼイロ\x0cクローネ\x09ケース\x09コルナ\x09コーポ\x0cサイクル\x0fサンチ" + "ーム\x0cシリング\x09センチ\x09セント\x09ダース\x06デシ\x06ドル\x06トン\x06ナノ\x09ノット\x09ハイツ" + "\x0fパーセント\x09パーツ\x0cバーレル\x0fピアストル\x09ピクル\x06ピコ\x06ビル\x0fファラッド\x0cフィート" + "\x0fブッシェル\x09フラン\x0fヘクタール\x06ペソ\x09ペニヒ\x09ヘルツ\x09ペンス\x09ページ\x09ベータ\x0cポイ" + "ント\x09ボルト\x06ホン\x09ポンド\x09ホール\x09ホーン\x0cマイクロ\x09マイル\x09マッハ\x09マルク\x0fマ" + "ンション\x0cミクロン\x06ミリ\x0fミリバール\x06メガ\x0cメガトン\x0cメートル\x09ヤード\x09ヤール\x09ユアン" + "\x0cリットル\x06リラ\x09ルピー\x0cルーブル\x06レム\x0fレントゲン\x09ワット\x040点\x041点\x042点" + "\x043点\x044点\x045点\x046点\x047点\x048点\x049点\x0510点\x0511点\x0512点\x0513点" + "\x0514点\x0515点\x0516点\x0517点\x0518点\x0519点\x0520点\x0521点\x0522点\x0523点" + "\x0524点\x02da\x02au\x02ov\x02pc\x02dm\x02iu\x06平成\x06昭和\x06大正\x06明治\x0c株" + "式会社\x02pa\x02na\x02ma\x02ka\x02kb\x02mb\x02gb\x04kcal\x02pf\x02nf\x02m" + "g\x02kg\x02hz\x02ml\x02dl\x02kl\x02fm\x02nm\x02mm\x02cm\x02km\x02m2\x02m" + "3\x05m∕s\x06m∕s2\x07rad∕s\x08rad∕s2\x02ps\x02ns\x02ms\x02pv\x02nv\x02mv" + "\x02kv\x02pw\x02nw\x02mw\x02kw\x02bq\x02cc\x02cd\x06c∕kg\x02db\x02gy\x02" + "ha\x02hp\x02in\x02kk\x02kt\x02lm\x02ln\x02lx\x02ph\x02pr\x02sr\x02sv\x02" + "wb\x05v∕m\x05a∕m\x041日\x042日\x043日\x044日\x045日\x046日\x047日\x048日\x049日" + "\x0510日\x0511日\x0512日\x0513日\x0514日\x0515日\x0516日\x0517日\x0518日\x0519日" + "\x0520日\x0521日\x0522日\x0523日\x0524日\x0525日\x0526日\x0527日\x0528日\x0529日" + "\x0530日\x0531日\x02ь\x02ɦ\x02ɬ\x02ʞ\x02ʇ\x02œ\x04𤋮\x04𢡊\x04𢡄\x04𣏕\x04𥉉" + "\x04𥳐\x04𧻓\x02ff\x02fi\x02fl\x02st\x04մն\x04մե\x04մի\x04վն\x04մխ\x04יִ" + "\x04ײַ\x02ע\x02ה\x02כ\x02ל\x02ם\x02ר\x02ת\x04שׁ\x04שׂ\x06שּׁ\x06שּׂ\x04א" + "ַ\x04אָ\x04אּ\x04בּ\x04גּ\x04דּ\x04הּ\x04וּ\x04זּ\x04טּ\x04יּ\x04ךּ\x04" + "כּ\x04לּ\x04מּ\x04נּ\x04סּ\x04ףּ\x04פּ\x04צּ\x04קּ\x04רּ\x04שּ\x04תּ" + "\x04וֹ\x04בֿ\x04כֿ\x04פֿ\x04אל\x02ٱ\x02ٻ\x02پ\x02ڀ\x02ٺ\x02ٿ\x02ٹ\x02ڤ" + "\x02ڦ\x02ڄ\x02ڃ\x02چ\x02ڇ\x02ڍ\x02ڌ\x02ڎ\x02ڈ\x02ژ\x02ڑ\x02ک\x02گ\x02ڳ" + "\x02ڱ\x02ں\x02ڻ\x02ۀ\x02ہ\x02ھ\x02ے\x02ۓ\x02ڭ\x02ۇ\x02ۆ\x02ۈ\x02ۋ\x02ۅ" + "\x02ۉ\x02ې\x02ى\x04ئا\x04ئە\x04ئو\x04ئۇ\x04ئۆ\x04ئۈ\x04ئې\x04ئى\x02ی\x04" + "ئج\x04ئح\x04ئم\x04ئي\x04بج\x04بح\x04بخ\x04بم\x04بى\x04بي\x04تج\x04تح" + "\x04تخ\x04تم\x04تى\x04تي\x04ثج\x04ثم\x04ثى\x04ثي\x04جح\x04جم\x04حج\x04حم" + "\x04خج\x04خح\x04خم\x04سج\x04سح\x04سخ\x04سم\x04صح\x04صم\x04ضج\x04ضح\x04ضخ" + "\x04ضم\x04طح\x04طم\x04ظم\x04عج\x04عم\x04غج\x04غم\x04فج\x04فح\x04فخ\x04فم" + "\x04فى\x04في\x04قح\x04قم\x04قى\x04قي\x04كا\x04كج\x04كح\x04كخ\x04كل\x04كم" + "\x04كى\x04كي\x04لج\x04لح\x04لخ\x04لم\x04لى\x04لي\x04مج\x04مح\x04مخ\x04مم" + "\x04مى\x04مي\x04نج\x04نح\x04نخ\x04نم\x04نى\x04ني\x04هج\x04هم\x04هى\x04هي" + "\x04يج\x04يح\x04يخ\x04يم\x04يى\x04يي\x04ذٰ\x04رٰ\x04ىٰ\x05 ٌّ\x05 ٍّ\x05" + " َّ\x05 ُّ\x05 ِّ\x05 ّٰ\x04ئر\x04ئز\x04ئن\x04بر\x04بز\x04بن\x04تر\x04تز" + "\x04تن\x04ثر\x04ثز\x04ثن\x04ما\x04نر\x04نز\x04نن\x04ير\x04يز\x04ين\x04ئخ" + "\x04ئه\x04به\x04ته\x04صخ\x04له\x04نه\x04هٰ\x04يه\x04ثه\x04سه\x04شم\x04شه" + "\x06ـَّ\x06ـُّ\x06ـِّ\x04طى\x04طي\x04عى\x04عي\x04غى\x04غي\x04سى\x04سي" + "\x04شى\x04شي\x04حى\x04حي\x04جى\x04جي\x04خى\x04خي\x04صى\x04صي\x04ضى\x04ضي" + "\x04شج\x04شح\x04شخ\x04شر\x04سر\x04صر\x04ضر\x04اً\x06تجم\x06تحج\x06تحم" + "\x06تخم\x06تمج\x06تمح\x06تمخ\x06جمح\x06حمي\x06حمى\x06سحج\x06سجح\x06سجى" + "\x06سمح\x06سمج\x06سمم\x06صحح\x06صمم\x06شحم\x06شجي\x06شمخ\x06شمم\x06ضحى" + "\x06ضخم\x06طمح\x06طمم\x06طمي\x06عجم\x06عمم\x06عمى\x06غمم\x06غمي\x06غمى" + "\x06فخم\x06قمح\x06قمم\x06لحم\x06لحي\x06لحى\x06لجج\x06لخم\x06لمح\x06محج" + "\x06محم\x06محي\x06مجح\x06مجم\x06مخج\x06مخم\x06مجخ\x06همج\x06همم\x06نحم" + "\x06نحى\x06نجم\x06نجى\x06نمي\x06نمى\x06يمم\x06بخي\x06تجي\x06تجى\x06تخي" + "\x06تخى\x06تمي\x06تمى\x06جمي\x06جحى\x06جمى\x06سخى\x06صحي\x06شحي\x06ضحي" + "\x06لجي\x06لمي\x06يحي\x06يجي\x06يمي\x06ممي\x06قمي\x06نحي\x06عمي\x06كمي" + "\x06نجح\x06مخي\x06لجم\x06كمم\x06جحي\x06حجي\x06مجي\x06فمي\x06بحي\x06سخي" + "\x06نجي\x06صلے\x06قلے\x08الله\x08اكبر\x08محمد\x08صلعم\x08رسول\x08عليه" + "\x08وسلم\x06صلى!صلى الله عليه وسلم\x0fجل جلاله\x08ریال\x01,\x01:\x01!" + "\x01?\x01_\x01{\x01}\x01[\x01]\x01#\x01&\x01*\x01-\x01<\x01>\x01\\\x01$" + "\x01%\x01@\x04ـً\x04ـَ\x04ـُ\x04ـِ\x04ـّ\x04ـْ\x02ء\x02آ\x02أ\x02ؤ\x02إ" + "\x02ئ\x02ا\x02ب\x02ة\x02ت\x02ث\x02ج\x02ح\x02خ\x02د\x02ذ\x02ر\x02ز\x02س" + "\x02ش\x02ص\x02ض\x02ط\x02ظ\x02ع\x02غ\x02ف\x02ق\x02ك\x02ل\x02م\x02ن\x02ه" + "\x02و\x02ي\x04لآ\x04لأ\x04لإ\x04لا\x01\x22\x01'\x01/\x01^\x01|\x01~\x02¢" + "\x02£\x02¬\x02¦\x02¥\x08𝅗𝅥\x08𝅘𝅥\x0c𝅘𝅥𝅮\x0c𝅘𝅥𝅯\x0c𝅘𝅥𝅰\x0c𝅘𝅥𝅱\x0c𝅘𝅥𝅲\x08𝆹" + "𝅥\x08𝆺𝅥\x0c𝆹𝅥𝅮\x0c𝆺𝅥𝅮\x0c𝆹𝅥𝅯\x0c𝆺𝅥𝅯\x02ı\x02ȷ\x02α\x02ε\x02ζ\x02η\x02" + "κ\x02λ\x02μ\x02ν\x02ξ\x02ο\x02σ\x02τ\x02υ\x02ψ\x03∇\x03∂\x02ϝ\x02ٮ\x02ڡ" + "\x02ٯ\x020,\x021,\x022,\x023,\x024,\x025,\x026,\x027,\x028,\x029,\x03(a)" + "\x03(b)\x03(c)\x03(d)\x03(e)\x03(f)\x03(g)\x03(h)\x03(i)\x03(j)\x03(k)" + "\x03(l)\x03(m)\x03(n)\x03(o)\x03(p)\x03(q)\x03(r)\x03(s)\x03(t)\x03(u)" + "\x03(v)\x03(w)\x03(x)\x03(y)\x03(z)\x07〔s〕\x02wz\x02hv\x02sd\x03ppv\x02w" + "c\x02mc\x02md\x02dj\x06ほか\x06ココ\x03サ\x03手\x03字\x03双\x03デ\x03二\x03多\x03解" + "\x03天\x03交\x03映\x03無\x03料\x03前\x03後\x03再\x03新\x03初\x03終\x03生\x03販\x03声" + "\x03吹\x03演\x03投\x03捕\x03一\x03三\x03遊\x03左\x03中\x03右\x03指\x03走\x03打\x03禁" + "\x03空\x03合\x03満\x03有\x03月\x03申\x03割\x03営\x03配\x09〔本〕\x09〔三〕\x09〔二〕\x09〔安" + "〕\x09〔点〕\x09〔打〕\x09〔盗〕\x09〔勝〕\x09〔敗〕\x03得\x03可\x03丽\x03丸\x03乁\x03你\x03" + "侮\x03侻\x03倂\x03偺\x03備\x03僧\x03像\x03㒞\x03免\x03兔\x03兤\x03具\x03㒹\x03內\x03" + "冗\x03冤\x03仌\x03冬\x03况\x03凵\x03刃\x03㓟\x03刻\x03剆\x03剷\x03㔕\x03勇\x03勉\x03" + "勤\x03勺\x03包\x03匆\x03北\x03卉\x03卑\x03博\x03即\x03卽\x03卿\x03灰\x03及\x03叟\x03" + "叫\x03叱\x03吆\x03咞\x03吸\x03呈\x03周\x03咢\x03哶\x03唐\x03啓\x03啣\x03善\x03喙\x03" + "喫\x03喳\x03嗂\x03圖\x03嘆\x03圗\x03噑\x03噴\x03切\x03壮\x03城\x03埴\x03堍\x03型\x03" + "堲\x03報\x03墬\x03売\x03壷\x03夆\x03夢\x03奢\x03姬\x03娛\x03娧\x03姘\x03婦\x03㛮\x03" + "嬈\x03嬾\x03寃\x03寘\x03寧\x03寳\x03寿\x03将\x03尢\x03㞁\x03屠\x03屮\x03峀\x03岍\x03" + "嵃\x03嵮\x03嵫\x03嵼\x03巡\x03巢\x03㠯\x03巽\x03帨\x03帽\x03幩\x03㡢\x03㡼\x03庰\x03" + "庳\x03庶\x03廊\x03廾\x03舁\x03弢\x03㣇\x03形\x03彫\x03㣣\x03徚\x03忍\x03志\x03忹\x03" + "悁\x03㤺\x03㤜\x03悔\x03惇\x03慈\x03慌\x03慎\x03慺\x03憎\x03憲\x03憤\x03憯\x03懞\x03" + "懲\x03懶\x03成\x03戛\x03扝\x03抱\x03拔\x03捐\x03挽\x03拼\x03捨\x03掃\x03揤\x03搢\x03" + "揅\x03掩\x03㨮\x03摩\x03摾\x03撝\x03摷\x03㩬\x03敏\x03敬\x03旣\x03書\x03晉\x03㬙\x03" + "暑\x03㬈\x03㫤\x03冒\x03冕\x03最\x03暜\x03肭\x03䏙\x03朗\x03望\x03朡\x03杞\x03杓\x03" + "㭉\x03柺\x03枅\x03桒\x03梅\x03梎\x03栟\x03椔\x03㮝\x03楂\x03榣\x03槪\x03檨\x03櫛\x03" + "㰘\x03次\x03歔\x03㱎\x03歲\x03殟\x03殺\x03殻\x03汎\x03沿\x03泍\x03汧\x03洖\x03派\x03" + "海\x03流\x03浩\x03浸\x03涅\x03洴\x03港\x03湮\x03㴳\x03滋\x03滇\x03淹\x03潮\x03濆\x03" + "瀹\x03瀞\x03瀛\x03㶖\x03灊\x03災\x03灷\x03炭\x03煅\x03熜\x03爨\x03爵\x03牐\x03犀\x03" + "犕\x03獺\x03王\x03㺬\x03玥\x03㺸\x03瑇\x03瑜\x03瑱\x03璅\x03瓊\x03㼛\x03甤\x03甾\x03" + "異\x03瘐\x03㿼\x03䀈\x03直\x03眞\x03真\x03睊\x03䀹\x03瞋\x03䁆\x03䂖\x03硎\x03碌\x03" + "磌\x03䃣\x03祖\x03福\x03秫\x03䄯\x03穀\x03穊\x03穏\x03䈂\x03篆\x03築\x03䈧\x03糒\x03" + "䊠\x03糨\x03糣\x03紀\x03絣\x03䌁\x03緇\x03縂\x03繅\x03䌴\x03䍙\x03罺\x03羕\x03翺\x03" + "者\x03聠\x03聰\x03䏕\x03育\x03脃\x03䐋\x03脾\x03媵\x03舄\x03辞\x03䑫\x03芑\x03芋\x03" + "芝\x03劳\x03花\x03芳\x03芽\x03苦\x03若\x03茝\x03荣\x03莭\x03茣\x03莽\x03菧\x03著\x03" + "荓\x03菊\x03菌\x03菜\x03䔫\x03蓱\x03蓳\x03蔖\x03蕤\x03䕝\x03䕡\x03䕫\x03虐\x03虜\x03" + "虧\x03虩\x03蚩\x03蚈\x03蜎\x03蛢\x03蝹\x03蜨\x03蝫\x03螆\x03蟡\x03蠁\x03䗹\x03衠\x03" + "衣\x03裗\x03裞\x03䘵\x03裺\x03㒻\x03䚾\x03䛇\x03誠\x03諭\x03變\x03豕\x03貫\x03賁\x03" + "贛\x03起\x03跋\x03趼\x03跰\x03軔\x03輸\x03邔\x03郱\x03鄑\x03鄛\x03鈸\x03鋗\x03鋘\x03" + "鉼\x03鏹\x03鐕\x03開\x03䦕\x03閷\x03䧦\x03雃\x03嶲\x03霣\x03䩮\x03䩶\x03韠\x03䪲\x03" + "頋\x03頩\x03飢\x03䬳\x03餩\x03馧\x03駂\x03駾\x03䯎\x03鬒\x03鱀\x03鳽\x03䳎\x03䳭\x03" + "鵧\x03䳸\x03麻\x03䵖\x03黹\x03黾\x03鼅\x03鼏\x03鼖\x03鼻" var xorData string = "" + // Size: 4855 bytes "\x02\x0c\x09\x02\xb0\xec\x02\xad\xd8\x02\xad\xd9\x02\x06\x07\x02\x0f\x12" + "\x02\x0f\x1f\x02\x0f\x1d\x02\x01\x13\x02\x0f\x16\x02\x0f\x0b\x02\x0f3" + "\x02\x0f7\x02\x0f?\x02\x0f/\x02\x0f*\x02\x0c&\x02\x0c*\x02\x0c;\x02\x0c9" + "\x02\x0c%\x02\xab\xed\x02\xab\xe2\x02\xab\xe3\x02\xa9\xe0\x02\xa9\xe1" + "\x02\xa9\xe6\x02\xa3\xcb\x02\xa3\xc8\x02\xa3\xc9\x02\x01#\x02\x01\x08" + "\x02\x0e>\x02\x0e'\x02\x0f\x03\x02\x03\x0d\x02\x03\x09\x02\x03\x17\x02" + "\x03\x0e\x02\x02\x03\x02\x011\x02\x01\x00\x02\x01\x10\x02\x03<\x02\x07" + "\x0d\x02\x02\x0c\x02\x0c0\x02\x01\x03\x02\x01\x01\x02\x01 \x02\x01\x22" + "\x02\x01)\x02\x01\x0a\x02\x01\x0c\x02\x02\x06\x02\x02\x02\x02\x03\x10" + "\x03\x037 \x03\x0b+\x03\x02\x01\x04\x02\x01\x02\x02\x019\x02\x03\x1c\x02" + "\x02$\x03\x80p$\x02\x03:\x02\x03\x0a\x03\xc1r.\x03\xc1r,\x03\xc1r\x02" + "\x02\x02:\x02\x02>\x02\x02,\x02\x02\x10\x02\x02\x00\x03\xc1s<\x03\xc1s*" + "\x03\xc2L$\x03\xc2L;\x02\x09)\x02\x0a\x19\x03\x83\xab\xe3\x03\x83\xab" + "\xf2\x03 4\xe0\x03\x81\xab\xea\x03\x81\xab\xf3\x03 4\xef\x03\x96\xe1\xcd" + "\x03\x84\xe5\xc3\x02\x0d\x11\x03\x8b\xec\xcb\x03\x94\xec\xcf\x03\x9a\xec" + "\xc2\x03\x8b\xec\xdb\x03\x94\xec\xdf\x03\x9a\xec\xd2\x03\x01\x0c!\x03" + "\x01\x0c#\x03ʠ\x9d\x03ʣ\x9c\x03ʢ\x9f\x03ʥ\x9e\x03ʤ\x91\x03ʧ\x90\x03ʦ\x93" + "\x03ʩ\x92\x03ʨ\x95\x03\xca\xf3\xb5\x03\xca\xf0\xb4\x03\xca\xf1\xb7\x03" + "\xca\xf6\xb6\x03\xca\xf7\x89\x03\xca\xf4\x88\x03\xca\xf5\x8b\x03\xca\xfa" + "\x8a\x03\xca\xfb\x8d\x03\xca\xf8\x8c\x03\xca\xf9\x8f\x03\xca\xfe\x8e\x03" + "\xca\xff\x81\x03\xca\xfc\x80\x03\xca\xfd\x83\x03\xca\xe2\x82\x03\xca\xe3" + "\x85\x03\xca\xe0\x84\x03\xca\xe1\x87\x03\xca\xe6\x86\x03\xca\xe7\x99\x03" + "\xca\xe4\x98\x03\xca\xe5\x9b\x03\xca\xea\x9a\x03\xca\xeb\x9d\x03\xca\xe8" + "\x9c\x03ؓ\x89\x03ߔ\x8b\x02\x010\x03\x03\x04\x1e\x03\x04\x15\x12\x03\x0b" + "\x05,\x03\x06\x04\x00\x03\x06\x04)\x03\x06\x044\x03\x06\x04<\x03\x06\x05" + "\x1d\x03\x06\x06\x00\x03\x06\x06\x0a\x03\x06\x06'\x03\x06\x062\x03\x0786" + "\x03\x079/\x03\x079 \x03\x07:\x0e\x03\x07:\x1b\x03\x07:%\x03\x07;/\x03" + "\x07;%\x03\x074\x11\x03\x076\x09\x03\x077*\x03\x070\x01\x03\x070\x0f\x03" + "\x070.\x03\x071\x16\x03\x071\x04\x03\x0710\x03\x072\x18\x03\x072-\x03" + "\x073\x14\x03\x073>\x03\x07'\x09\x03\x07 \x00\x03\x07\x1f\x0b\x03\x07" + "\x18#\x03\x07\x18(\x03\x07\x186\x03\x07\x18\x03\x03\x07\x19\x16\x03\x07" + "\x116\x03\x07\x12'\x03\x07\x13\x10\x03\x07\x0c&\x03\x07\x0c\x08\x03\x07" + "\x0c\x13\x03\x07\x0d\x02\x03\x07\x0d\x1c\x03\x07\x0b5\x03\x07\x0b\x0a" + "\x03\x07\x0b\x01\x03\x07\x0b\x0f\x03\x07\x05\x00\x03\x07\x05\x09\x03\x07" + "\x05\x0b\x03\x07\x07\x01\x03\x07\x07\x08\x03\x07\x00<\x03\x07\x00+\x03" + "\x07\x01)\x03\x07\x01\x1b\x03\x07\x01\x08\x03\x07\x03?\x03\x0445\x03\x04" + "4\x08\x03\x0454\x03\x04)/\x03\x04)5\x03\x04+\x05\x03\x04+\x14\x03\x04+ " + "\x03\x04+<\x03\x04*&\x03\x04*\x22\x03\x04&8\x03\x04!\x01\x03\x04!\x22" + "\x03\x04\x11+\x03\x04\x10.\x03\x04\x104\x03\x04\x13=\x03\x04\x12\x04\x03" + "\x04\x12\x0a\x03\x04\x0d\x1d\x03\x04\x0d\x07\x03\x04\x0d \x03\x05<>\x03" + "\x055<\x03\x055!\x03\x055#\x03\x055&\x03\x054\x1d\x03\x054\x02\x03\x054" + "\x07\x03\x0571\x03\x053\x1a\x03\x053\x16\x03\x05.<\x03\x05.\x07\x03\x05)" + ":\x03\x05)<\x03\x05)\x0c\x03\x05)\x15\x03\x05+-\x03\x05+5\x03\x05$\x1e" + "\x03\x05$\x14\x03\x05'\x04\x03\x05'\x14\x03\x05&\x02\x03\x05\x226\x03" + "\x05\x22\x0c\x03\x05\x22\x1c\x03\x05\x19\x0a\x03\x05\x1b\x09\x03\x05\x1b" + "\x0c\x03\x05\x14\x07\x03\x05\x16?\x03\x05\x16\x0c\x03\x05\x0c\x05\x03" + "\x05\x0e\x0f\x03\x05\x01\x0e\x03\x05\x00(\x03\x05\x030\x03\x05\x03\x06" + "\x03\x0a==\x03\x0a=1\x03\x0a=,\x03\x0a=\x0c\x03\x0a??\x03\x0a<\x08\x03" + "\x0a9!\x03\x0a9)\x03\x0a97\x03\x0a99\x03\x0a6\x0a\x03\x0a6\x1c\x03\x0a6" + "\x17\x03\x0a7'\x03\x0a78\x03\x0a73\x03\x0a'\x01\x03\x0a'&\x03\x0a\x1f" + "\x0e\x03\x0a\x1f\x03\x03\x0a\x1f3\x03\x0a\x1b/\x03\x0a\x18\x19\x03\x0a" + "\x19\x01\x03\x0a\x16\x14\x03\x0a\x0e\x22\x03\x0a\x0f\x10\x03\x0a\x0f\x02" + "\x03\x0a\x0f \x03\x0a\x0c\x04\x03\x0a\x0b>\x03\x0a\x0b+\x03\x0a\x08/\x03" + "\x0a\x046\x03\x0a\x05\x14\x03\x0a\x00\x04\x03\x0a\x00\x10\x03\x0a\x00" + "\x14\x03\x0b<3\x03\x0b;*\x03\x0b9\x22\x03\x0b9)\x03\x0b97\x03\x0b+\x10" + "\x03\x0b((\x03\x0b&5\x03\x0b$\x1c\x03\x0b$\x12\x03\x0b%\x04\x03\x0b#<" + "\x03\x0b#0\x03\x0b#\x0d\x03\x0b#\x19\x03\x0b!:\x03\x0b!\x1f\x03\x0b!\x00" + "\x03\x0b\x1e5\x03\x0b\x1c\x1d\x03\x0b\x1d-\x03\x0b\x1d(\x03\x0b\x18.\x03" + "\x0b\x18 \x03\x0b\x18\x16\x03\x0b\x14\x13\x03\x0b\x15$\x03\x0b\x15\x22" + "\x03\x0b\x12\x1b\x03\x0b\x12\x10\x03\x0b\x132\x03\x0b\x13=\x03\x0b\x12" + "\x18\x03\x0b\x0c&\x03\x0b\x061\x03\x0b\x06:\x03\x0b\x05#\x03\x0b\x05<" + "\x03\x0b\x04\x0b\x03\x0b\x04\x04\x03\x0b\x04\x1b\x03\x0b\x042\x03\x0b" + "\x041\x03\x0b\x03\x03\x03\x0b\x03\x1d\x03\x0b\x03/\x03\x0b\x03+\x03\x0b" + "\x02\x1b\x03\x0b\x02\x00\x03\x0b\x01\x1e\x03\x0b\x01\x08\x03\x0b\x015" + "\x03\x06\x0d9\x03\x06\x0d=\x03\x06\x0d?\x03\x02\x001\x03\x02\x003\x03" + "\x02\x02\x19\x03\x02\x006\x03\x02\x02\x1b\x03\x02\x004\x03\x02\x00<\x03" + "\x02\x02\x0a\x03\x02\x02\x0e\x03\x02\x01\x1a\x03\x02\x01\x07\x03\x02\x01" + "\x05\x03\x02\x01\x0b\x03\x02\x01%\x03\x02\x01\x0c\x03\x02\x01\x04\x03" + "\x02\x01\x1c\x03\x02\x00.\x03\x02\x002\x03\x02\x00>\x03\x02\x00\x12\x03" + "\x02\x00\x16\x03\x02\x011\x03\x02\x013\x03\x02\x02 \x03\x02\x02%\x03\x02" + "\x02$\x03\x02\x028\x03\x02\x02;\x03\x02\x024\x03\x02\x012\x03\x02\x022" + "\x03\x02\x02/\x03\x02\x01,\x03\x02\x01\x13\x03\x02\x01\x16\x03\x02\x01" + "\x11\x03\x02\x01\x1e\x03\x02\x01\x15\x03\x02\x01\x17\x03\x02\x01\x0f\x03" + "\x02\x01\x08\x03\x02\x00?\x03\x02\x03\x07\x03\x02\x03\x0d\x03\x02\x03" + "\x13\x03\x02\x03\x1d\x03\x02\x03\x1f\x03\x02\x00\x03\x03\x02\x00\x0d\x03" + "\x02\x00\x01\x03\x02\x00\x1b\x03\x02\x00\x19\x03\x02\x00\x18\x03\x02\x00" + "\x13\x03\x02\x00/\x03\x07>\x12\x03\x07<\x1f\x03\x07>\x1d\x03\x06\x1d\x0e" + "\x03\x07>\x1c\x03\x07>:\x03\x07>\x13\x03\x04\x12+\x03\x07?\x03\x03\x07>" + "\x02\x03\x06\x224\x03\x06\x1a.\x03\x07<%\x03\x06\x1c\x0b\x03\x0609\x03" + "\x05\x1f\x01\x03\x04'\x08\x03\x93\xfd\xf5\x03\x02\x0d \x03\x02\x0d#\x03" + "\x02\x0d!\x03\x02\x0d&\x03\x02\x0d\x22\x03\x02\x0d/\x03\x02\x0d,\x03\x02" + "\x0d$\x03\x02\x0d'\x03\x02\x0d%\x03\x02\x0d;\x03\x02\x0d=\x03\x02\x0d?" + "\x03\x099.\x03\x08\x0b7\x03\x08\x02\x14\x03\x08\x14\x0d\x03\x08.:\x03" + "\x089'\x03\x0f\x0b\x18\x03\x0f\x1c1\x03\x0f\x17&\x03\x0f9\x1f\x03\x0f0" + "\x0c\x03\x0e\x0a9\x03\x0e\x056\x03\x0e\x1c#\x03\x0f\x13\x0e\x03\x072\x00" + "\x03\x070\x0d\x03\x072\x0b\x03\x06\x11\x18\x03\x070\x10\x03\x06\x0f(\x03" + "\x072\x05\x03\x06\x0f,\x03\x073\x15\x03\x06\x07\x08\x03\x05\x16\x02\x03" + "\x04\x0b \x03\x05:8\x03\x05\x16%\x03\x0a\x0d\x1f\x03\x06\x16\x10\x03\x05" + "\x1d5\x03\x05*;\x03\x05\x16\x1b\x03\x04.-\x03\x06\x1a\x19\x03\x04\x03," + "\x03\x0b87\x03\x04/\x0a\x03\x06\x00,\x03\x04-\x01\x03\x04\x1e-\x03\x06/(" + "\x03\x0a\x0b5\x03\x06\x0e7\x03\x06\x07.\x03\x0597\x03\x0a*%\x03\x0760" + "\x03\x06\x0c;\x03\x05'\x00\x03\x072.\x03\x072\x08\x03\x06=\x01\x03\x06" + "\x05\x1b\x03\x06\x06\x12\x03\x06$=\x03\x06'\x0d\x03\x04\x11\x0f\x03\x076" + ",\x03\x06\x07;\x03\x06.,\x03\x86\xf9\xea\x03\x8f\xff\xeb\x02\x092\x02" + "\x095\x02\x094\x02\x09;\x02\x09>\x02\x098\x02\x09*\x02\x09/\x02\x09,\x02" + "\x09%\x02\x09&\x02\x09#\x02\x09 \x02\x08!\x02\x08%\x02\x08$\x02\x08+\x02" + "\x08.\x02\x08*\x02\x08&\x02\x088\x02\x08>\x02\x084\x02\x086\x02\x080\x02" + "\x08\x10\x02\x08\x17\x02\x08\x12\x02\x08\x1d\x02\x08\x1f\x02\x08\x13\x02" + "\x08\x15\x02\x08\x14\x02\x08\x0c\x03\x8b\xfd\xd0\x03\x81\xec\xc6\x03\x87" + "\xe0\x8a\x03-2\xe3\x03\x80\xef\xe4\x03-2\xea\x03\x88\xe6\xeb\x03\x8e\xe6" + "\xe8\x03\x84\xe6\xe9\x03\x97\xe6\xee\x03-2\xf9\x03-2\xf6\x03\x8e\xe3\xad" + "\x03\x80\xe3\x92\x03\x88\xe3\x90\x03\x8e\xe3\x90\x03\x80\xe3\x97\x03\x88" + "\xe3\x95\x03\x88\xfe\xcb\x03\x8e\xfe\xca\x03\x84\xfe\xcd\x03\x91\xef\xc9" + "\x03-2\xc1\x03-2\xc0\x03-2\xcb\x03\x88@\x09\x03\x8e@\x08\x03\x8f\xe0\xf5" + "\x03\x8e\xe6\xf9\x03\x8e\xe0\xfa\x03\x93\xff\xf4\x03\x84\xee\xd3\x03\x0b" + "(\x04\x023 \x021;\x02\x01*\x03\x0b#\x10\x03\x0b 0\x03\x0b!\x10\x03\x0b!0" + "\x03\x07\x15\x08\x03\x09?5\x03\x07\x1f\x08\x03\x07\x17\x0b\x03\x09\x1f" + "\x15\x03\x0b\x1c7\x03\x0a+#\x03\x06\x1a\x1b\x03\x06\x1a\x14\x03\x0a\x01" + "\x18\x03\x06#\x1b\x03\x0a2\x0c\x03\x0a\x01\x04\x03\x09#;\x03\x08='\x03" + "\x08\x1a\x0a\x03\x07</\x03\x07:+\x03\x07\x07*\x03\x06&\x1c\x03\x09\x0c" + "\x16\x03\x09\x10\x0e\x03\x08'\x0f\x03\x08+\x09\x03\x074%\x03\x06!3\x03" + "\x06\x03+\x03\x0b\x1e\x19\x03\x0a))\x03\x09\x08\x19\x03\x08,\x05\x03\x07" + "<2\x03\x06\x1c>\x03\x0a\x111\x03\x09\x1b\x09\x03\x073.\x03\x07\x01\x00" + "\x03\x09/,\x03\x07#>\x03\x07\x048\x03\x0a\x1f\x22\x03\x098>\x03\x09\x11" + "\x00\x03\x08/\x17\x03\x06'\x22\x03\x0b\x1a+\x03\x0a\x22\x19\x03\x0a/1" + "\x03\x0974\x03\x09\x0f\x22\x03\x08,\x22\x03\x08?\x14\x03\x07$5\x03\x07<3" + "\x03\x07=*\x03\x07\x13\x18\x03\x068\x0a\x03\x06\x09\x16\x03\x06\x13\x00" + "\x03\x08\x067\x03\x08\x01\x03\x03\x08\x12\x1d\x03\x07+7\x03\x06(;\x03" + "\x06\x1c?\x03\x07\x0e\x17\x03\x0a\x06\x1d\x03\x0a\x19\x07\x03\x08\x14$" + "\x03\x07$;\x03\x08,$\x03\x08\x06\x0d\x03\x07\x16\x0a\x03\x06>>\x03\x0a" + "\x06\x12\x03\x0a\x14)\x03\x09\x0d\x1f\x03\x09\x12\x17\x03\x09\x19\x01" + "\x03\x08\x11 \x03\x08\x1d'\x03\x06<\x1a\x03\x0a.\x00\x03\x07'\x18\x03" + "\x0a\x22\x08\x03\x08\x0d\x0a\x03\x08\x13)\x03\x07*)\x03\x06<,\x03\x07" + "\x0b\x1a\x03\x09.\x14\x03\x09\x0d\x1e\x03\x07\x0e#\x03\x0b\x1d'\x03\x0a" + "\x0a8\x03\x09%2\x03\x08+&\x03\x080\x12\x03\x0a)4\x03\x08\x06\x1f\x03\x0b" + "\x1b\x1a\x03\x0a\x1b\x0f\x03\x0b\x1d*\x03\x09\x16$\x03\x090\x11\x03\x08" + "\x11\x08\x03\x0a*(\x03\x0a\x042\x03\x089,\x03\x074'\x03\x07\x0f\x05\x03" + "\x09\x0b\x0a\x03\x07\x1b\x01\x03\x09\x17:\x03\x09.\x0d\x03\x07.\x11\x03" + "\x09+\x15\x03\x080\x13\x03\x0b\x1f\x19\x03\x0a \x11\x03\x0a\x220\x03\x09" + "\x07;\x03\x08\x16\x1c\x03\x07,\x13\x03\x07\x0e/\x03\x06\x221\x03\x0a." + "\x0a\x03\x0a7\x02\x03\x0a\x032\x03\x0a\x1d.\x03\x091\x06\x03\x09\x19:" + "\x03\x08\x02/\x03\x060+\x03\x06\x0f-\x03\x06\x1c\x1f\x03\x06\x1d\x07\x03" + "\x0a,\x11\x03\x09=\x0d\x03\x09\x0b;\x03\x07\x1b/\x03\x0a\x1f:\x03\x09 " + "\x1f\x03\x09.\x10\x03\x094\x0b\x03\x09\x1a1\x03\x08#\x1a\x03\x084\x1d" + "\x03\x08\x01\x1f\x03\x08\x11\x22\x03\x07'8\x03\x07\x1a>\x03\x0757\x03" + "\x06&9\x03\x06+\x11\x03\x0a.\x0b\x03\x0a,>\x03\x0a4#\x03\x08%\x17\x03" + "\x07\x05\x22\x03\x07\x0c\x0b\x03\x0a\x1d+\x03\x0a\x19\x16\x03\x09+\x1f" + "\x03\x09\x08\x0b\x03\x08\x16\x18\x03\x08+\x12\x03\x0b\x1d\x0c\x03\x0a=" + "\x10\x03\x0a\x09\x0d\x03\x0a\x10\x11\x03\x09&0\x03\x08(\x1f\x03\x087\x07" + "\x03\x08\x185\x03\x07'6\x03\x06.\x05\x03\x06=\x04\x03\x06;;\x03\x06\x06," + "\x03\x0b\x18>\x03\x08\x00\x18\x03\x06 \x03\x03\x06<\x00\x03\x09%\x18\x03" + "\x0b\x1c<\x03\x0a%!\x03\x0a\x09\x12\x03\x0a\x16\x02\x03\x090'\x03\x09" + "\x0e=\x03\x08 \x0e\x03\x08>\x03\x03\x074>\x03\x06&?\x03\x06\x19\x09\x03" + "\x06?(\x03\x0a-\x0e\x03\x09:3\x03\x098:\x03\x09\x12\x0b\x03\x09\x1d\x17" + "\x03\x087\x05\x03\x082\x14\x03\x08\x06%\x03\x08\x13\x1f\x03\x06\x06\x0e" + "\x03\x0a\x22<\x03\x09/<\x03\x06>+\x03\x0a'?\x03\x0a\x13\x0c\x03\x09\x10<" + "\x03\x07\x1b=\x03\x0a\x19\x13\x03\x09\x22\x1d\x03\x09\x07\x0d\x03\x08)" + "\x1c\x03\x06=\x1a\x03\x0a/4\x03\x0a7\x11\x03\x0a\x16:\x03\x09?3\x03\x09:" + "/\x03\x09\x05\x0a\x03\x09\x14\x06\x03\x087\x22\x03\x080\x07\x03\x08\x1a" + "\x1f\x03\x07\x04(\x03\x07\x04\x09\x03\x06 %\x03\x06<\x08\x03\x0a+\x14" + "\x03\x09\x1d\x16\x03\x0a70\x03\x08 >\x03\x0857\x03\x070\x0a\x03\x06=\x12" + "\x03\x06\x16%\x03\x06\x1d,\x03\x099#\x03\x09\x10>\x03\x07 \x1e\x03\x08" + "\x0c<\x03\x08\x0b\x18\x03\x08\x15+\x03\x08,:\x03\x08%\x22\x03\x07\x0a$" + "\x03\x0b\x1c=\x03\x07+\x08\x03\x0a/\x05\x03\x0a \x07\x03\x0a\x12'\x03" + "\x09#\x11\x03\x08\x1b\x15\x03\x0a\x06\x01\x03\x09\x1c\x1b\x03\x0922\x03" + "\x07\x14<\x03\x07\x09\x04\x03\x061\x04\x03\x07\x0e\x01\x03\x0a\x13\x18" + "\x03\x0a-\x0c\x03\x0a?\x0d\x03\x0a\x09\x0a\x03\x091&\x03\x0a/\x0b\x03" + "\x08$<\x03\x083\x1d\x03\x08\x0c$\x03\x08\x0d\x07\x03\x08\x0d?\x03\x08" + "\x0e\x14\x03\x065\x0a\x03\x08\x1a#\x03\x08\x16#\x03\x0702\x03\x07\x03" + "\x1a\x03\x06(\x1d\x03\x06+\x1b\x03\x06\x0b\x05\x03\x06\x0b\x17\x03\x06" + "\x0c\x04\x03\x06\x1e\x19\x03\x06+0\x03\x062\x18\x03\x0b\x16\x1e\x03\x0a+" + "\x16\x03\x0a-?\x03\x0a#:\x03\x0a#\x10\x03\x0a%$\x03\x0a>+\x03\x0a01\x03" + "\x0a1\x10\x03\x0a\x099\x03\x0a\x0a\x12\x03\x0a\x19\x1f\x03\x0a\x19\x12" + "\x03\x09*)\x03\x09-\x16\x03\x09.1\x03\x09.2\x03\x09<\x0e\x03\x09> \x03" + "\x093\x12\x03\x09\x0b\x01\x03\x09\x1c2\x03\x09\x11\x1c\x03\x09\x15%\x03" + "\x08,&\x03\x08!\x22\x03\x089(\x03\x08\x0b\x1a\x03\x08\x0d2\x03\x08\x0c" + "\x04\x03\x08\x0c\x06\x03\x08\x0c\x1f\x03\x08\x0c\x0c\x03\x08\x0f\x1f\x03" + "\x08\x0f\x1d\x03\x08\x00\x14\x03\x08\x03\x14\x03\x08\x06\x16\x03\x08\x1e" + "#\x03\x08\x11\x11\x03\x08\x10\x18\x03\x08\x14(\x03\x07)\x1e\x03\x07.1" + "\x03\x07 $\x03\x07 '\x03\x078\x08\x03\x07\x0d0\x03\x07\x0f7\x03\x07\x05#" + "\x03\x07\x05\x1a\x03\x07\x1a7\x03\x07\x1d-\x03\x07\x17\x10\x03\x06)\x1f" + "\x03\x062\x0b\x03\x066\x16\x03\x06\x09\x11\x03\x09(\x1e\x03\x07!5\x03" + "\x0b\x11\x16\x03\x0a/\x04\x03\x0a,\x1a\x03\x0b\x173\x03\x0a,1\x03\x0a/5" + "\x03\x0a\x221\x03\x0a\x22\x0d\x03\x0a?%\x03\x0a<,\x03\x0a?#\x03\x0a>\x19" + "\x03\x0a\x08&\x03\x0a\x0b\x0e\x03\x0a\x0c:\x03\x0a\x0c+\x03\x0a\x03\x22" + "\x03\x0a\x06)\x03\x0a\x11\x10\x03\x0a\x11\x1a\x03\x0a\x17-\x03\x0a\x14(" + "\x03\x09)\x1e\x03\x09/\x09\x03\x09.\x00\x03\x09,\x07\x03\x09/*\x03\x09-9" + "\x03\x09\x228\x03\x09%\x09\x03\x09:\x12\x03\x09;\x1d\x03\x09?\x06\x03" + "\x093%\x03\x096\x05\x03\x096\x08\x03\x097\x02\x03\x09\x07,\x03\x09\x04," + "\x03\x09\x1f\x16\x03\x09\x11\x03\x03\x09\x11\x12\x03\x09\x168\x03\x08*" + "\x05\x03\x08/2\x03\x084:\x03\x08\x22+\x03\x08 0\x03\x08&\x0a\x03\x08;" + "\x10\x03\x08>$\x03\x08>\x18\x03\x0829\x03\x082:\x03\x081,\x03\x081<\x03" + "\x081\x1c\x03\x087#\x03\x087*\x03\x08\x09'\x03\x08\x00\x1d\x03\x08\x05-" + "\x03\x08\x1f4\x03\x08\x1d\x04\x03\x08\x16\x0f\x03\x07*7\x03\x07'!\x03" + "\x07%\x1b\x03\x077\x0c\x03\x07\x0c1\x03\x07\x0c.\x03\x07\x00\x06\x03\x07" + "\x01\x02\x03\x07\x010\x03\x07\x06=\x03\x07\x01\x03\x03\x07\x01\x13\x03" + "\x07\x06\x06\x03\x07\x05\x0a\x03\x07\x1f\x09\x03\x07\x17:\x03\x06*1\x03" + "\x06-\x1d\x03\x06\x223\x03\x062:\x03\x060$\x03\x066\x1e\x03\x064\x12\x03" + "\x0645\x03\x06\x0b\x00\x03\x06\x0b7\x03\x06\x07\x1f\x03\x06\x15\x12\x03" + "\x0c\x05\x0f\x03\x0b+\x0b\x03\x0b+-\x03\x06\x16\x1b\x03\x06\x15\x17\x03" + "\x89\xca\xea\x03\x89\xca\xe8\x03\x0c8\x10\x03\x0c8\x01\x03\x0c8\x0f\x03" + "\x0d8%\x03\x0d8!\x03\x0c8-\x03\x0c8/\x03\x0c8+\x03\x0c87\x03\x0c85\x03" + "\x0c9\x09\x03\x0c9\x0d\x03\x0c9\x0f\x03\x0c9\x0b\x03\xcfu\x0c\x03\xcfu" + "\x0f\x03\xcfu\x0e\x03\xcfu\x09\x03\x0c9\x10\x03\x0d9\x0c\x03\xcf`;\x03" + "\xcf`>\x03\xcf`9\x03\xcf`8\x03\xcf`7\x03\xcf`*\x03\xcf`-\x03\xcf`,\x03" + "\x0d\x1b\x1a\x03\x0d\x1b&\x03\x0c=.\x03\x0c=%\x03\x0c>\x1e\x03\x0c>\x14" + "\x03\x0c?\x06\x03\x0c?\x0b\x03\x0c?\x0c\x03\x0c?\x0d\x03\x0c?\x02\x03" + "\x0c>\x0f\x03\x0c>\x08\x03\x0c>\x09\x03\x0c>,\x03\x0c>\x0c\x03\x0c?\x13" + "\x03\x0c?\x16\x03\x0c?\x15\x03\x0c?\x1c\x03\x0c?\x1f\x03\x0c?\x1d\x03" + "\x0c?\x1a\x03\x0c?\x17\x03\x0c?\x08\x03\x0c?\x09\x03\x0c?\x0e\x03\x0c?" + "\x04\x03\x0c?\x05\x03\x0c<?\x03\x0c=\x00\x03\x0c=\x06\x03\x0c=\x05\x03" + "\x0c=\x0c\x03\x0c=\x0f\x03\x0c=\x0d\x03\x0c=\x0b\x03\x0c=\x07\x03\x0c=" + "\x19\x03\x0c=\x15\x03\x0c=\x11\x03\x0c=1\x03\x0c=3\x03\x0c=0\x03\x0c=>" + "\x03\x0c=2\x03\x0c=6\x03\x0c<\x07\x03\x0c<\x05\x03\x0e:!\x03\x0e:#\x03" + "\x0e8\x09\x03\x0e:&\x03\x0e8\x0b\x03\x0e:$\x03\x0e:,\x03\x0e8\x1a\x03" + "\x0e8\x1e\x03\x0e:*\x03\x0e:7\x03\x0e:5\x03\x0e:;\x03\x0e:\x15\x03\x0e:<" + "\x03\x0e:4\x03\x0e:'\x03\x0e:-\x03\x0e:%\x03\x0e:?\x03\x0e:=\x03\x0e:)" + "\x03\x0e:/\x03\xcfs'\x03\x0d=\x0f\x03\x0d+*\x03\x0d99\x03\x0d9;\x03\x0d9" + "?\x03\x0d)\x0d\x03\x0d(%\x02\x01\x18\x02\x01(\x02\x01\x1e\x03\x0f$!\x03" + "\x0f87\x03\x0f4\x0e\x03\x0f5\x1d\x03\x06'\x03\x03\x0f\x08\x18\x03\x0f" + "\x0d\x1b\x03\x0e2=\x03\x0e;\x08\x03\x0e:\x0b\x03\x0e\x06$\x03\x0e\x0d)" + "\x03\x0e\x16\x1f\x03\x0e\x16\x1b\x03\x0d$\x0a\x03\x05,\x1d\x03\x0d. \x03" + "\x0d.#\x03\x0c(/\x03\x09%\x02\x03\x0d90\x03\x0d\x0e4\x03\x0d\x0d\x0f\x03" + "\x0c#\x00\x03\x0c,\x1e\x03\x0c2\x0e\x03\x0c\x01\x17\x03\x0c\x09:\x03\x0e" + "\x173\x03\x0c\x08\x03\x03\x0c\x11\x07\x03\x0c\x10\x18\x03\x0c\x1f\x1c" + "\x03\x0c\x19\x0e\x03\x0c\x1a\x1f\x03\x0f0>\x03\x0b->\x03\x0b<+\x03\x0b8" + "\x13\x03\x0b\x043\x03\x0b\x14\x03\x03\x0b\x16%\x03\x0d\x22&\x03\x0b\x1a" + "\x1a\x03\x0b\x1a\x04\x03\x0a%9\x03\x0a&2\x03\x0a&0\x03\x0a!\x1a\x03\x0a!" + "7\x03\x0a5\x10\x03\x0a=4\x03\x0a?\x0e\x03\x0a>\x10\x03\x0a\x00 \x03\x0a" + "\x0f:\x03\x0a\x0f9\x03\x0a\x0b\x0a\x03\x0a\x17%\x03\x0a\x1b-\x03\x09-" + "\x1a\x03\x09,4\x03\x09.,\x03\x09)\x09\x03\x096!\x03\x091\x1f\x03\x093" + "\x16\x03\x0c+\x1f\x03\x098 \x03\x098=\x03\x0c(\x1a\x03\x0c(\x16\x03\x09" + "\x0a+\x03\x09\x16\x12\x03\x09\x13\x0e\x03\x09\x153\x03\x08)!\x03\x09\x1a" + "\x01\x03\x09\x18\x01\x03\x08%#\x03\x08>\x22\x03\x08\x05%\x03\x08\x02*" + "\x03\x08\x15;\x03\x08\x1b7\x03\x0f\x07\x1d\x03\x0f\x04\x03\x03\x070\x0c" + "\x03\x07;\x0b\x03\x07\x08\x17\x03\x07\x12\x06\x03\x06/-\x03\x0671\x03" + "\x065+\x03\x06>7\x03\x06\x049\x03\x05+\x1e\x03\x05,\x17\x03\x05 \x1d\x03" + "\x05\x22\x05\x03\x050\x1d" // lookup returns the trie value for the first UTF-8 encoding in s and // the width in bytes of this encoding. The size will be 0 if s does not // hold enough bytes to complete the encoding. len(s) must be greater than 0. func (t *idnaTrie) lookup(s []byte) (v uint16, sz int) { c0 := s[0] switch { case c0 < 0x80: // is ASCII return idnaValues[c0], 1 case c0 < 0xC2: return 0, 1 // Illegal UTF-8: not a starter, not ASCII. case c0 < 0xE0: // 2-byte UTF-8 if len(s) < 2 { return 0, 0 } i := idnaIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c1), 2 case c0 < 0xF0: // 3-byte UTF-8 if len(s) < 3 { return 0, 0 } i := idnaIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } o := uint32(i)<<6 + uint32(c1) i = idnaIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return 0, 2 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c2), 3 case c0 < 0xF8: // 4-byte UTF-8 if len(s) < 4 { return 0, 0 } i := idnaIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } o := uint32(i)<<6 + uint32(c1) i = idnaIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return 0, 2 // Illegal UTF-8: not a continuation byte. } o = uint32(i)<<6 + uint32(c2) i = idnaIndex[o] c3 := s[3] if c3 < 0x80 || 0xC0 <= c3 { return 0, 3 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c3), 4 } // Illegal rune return 0, 1 } // lookupUnsafe returns the trie value for the first UTF-8 encoding in s. // s must start with a full and valid UTF-8 encoded rune. func (t *idnaTrie) lookupUnsafe(s []byte) uint16 { c0 := s[0] if c0 < 0x80 { // is ASCII return idnaValues[c0] } i := idnaIndex[c0] if c0 < 0xE0 { // 2-byte UTF-8 return t.lookupValue(uint32(i), s[1]) } i = idnaIndex[uint32(i)<<6+uint32(s[1])] if c0 < 0xF0 { // 3-byte UTF-8 return t.lookupValue(uint32(i), s[2]) } i = idnaIndex[uint32(i)<<6+uint32(s[2])] if c0 < 0xF8 { // 4-byte UTF-8 return t.lookupValue(uint32(i), s[3]) } return 0 } // lookupString returns the trie value for the first UTF-8 encoding in s and // the width in bytes of this encoding. The size will be 0 if s does not // hold enough bytes to complete the encoding. len(s) must be greater than 0. func (t *idnaTrie) lookupString(s string) (v uint16, sz int) { c0 := s[0] switch { case c0 < 0x80: // is ASCII return idnaValues[c0], 1 case c0 < 0xC2: return 0, 1 // Illegal UTF-8: not a starter, not ASCII. case c0 < 0xE0: // 2-byte UTF-8 if len(s) < 2 { return 0, 0 } i := idnaIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c1), 2 case c0 < 0xF0: // 3-byte UTF-8 if len(s) < 3 { return 0, 0 } i := idnaIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } o := uint32(i)<<6 + uint32(c1) i = idnaIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return 0, 2 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c2), 3 case c0 < 0xF8: // 4-byte UTF-8 if len(s) < 4 { return 0, 0 } i := idnaIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } o := uint32(i)<<6 + uint32(c1) i = idnaIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return 0, 2 // Illegal UTF-8: not a continuation byte. } o = uint32(i)<<6 + uint32(c2) i = idnaIndex[o] c3 := s[3] if c3 < 0x80 || 0xC0 <= c3 { return 0, 3 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c3), 4 } // Illegal rune return 0, 1 } // lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. // s must start with a full and valid UTF-8 encoded rune. func (t *idnaTrie) lookupStringUnsafe(s string) uint16 { c0 := s[0] if c0 < 0x80 { // is ASCII return idnaValues[c0] } i := idnaIndex[c0] if c0 < 0xE0 { // 2-byte UTF-8 return t.lookupValue(uint32(i), s[1]) } i = idnaIndex[uint32(i)<<6+uint32(s[1])] if c0 < 0xF0 { // 3-byte UTF-8 return t.lookupValue(uint32(i), s[2]) } i = idnaIndex[uint32(i)<<6+uint32(s[2])] if c0 < 0xF8 { // 4-byte UTF-8 return t.lookupValue(uint32(i), s[3]) } return 0 } // idnaTrie. Total size: 29052 bytes (28.37 KiB). Checksum: ef06e7ecc26f36dd. type idnaTrie struct{} func newIdnaTrie(i int) *idnaTrie { return &idnaTrie{} } // lookupValue determines the type of block n and looks up the value for b. func (t *idnaTrie) lookupValue(n uint32, b byte) uint16 { switch { case n < 125: return uint16(idnaValues[n<<6+uint32(b)]) default: n -= 125 return uint16(idnaSparse.lookup(n, b)) } } // idnaValues: 127 blocks, 8128 entries, 16256 bytes // The third block is the zero block. var idnaValues = [8128]uint16{ // Block 0x0, offset 0x0 0x00: 0x0080, 0x01: 0x0080, 0x02: 0x0080, 0x03: 0x0080, 0x04: 0x0080, 0x05: 0x0080, 0x06: 0x0080, 0x07: 0x0080, 0x08: 0x0080, 0x09: 0x0080, 0x0a: 0x0080, 0x0b: 0x0080, 0x0c: 0x0080, 0x0d: 0x0080, 0x0e: 0x0080, 0x0f: 0x0080, 0x10: 0x0080, 0x11: 0x0080, 0x12: 0x0080, 0x13: 0x0080, 0x14: 0x0080, 0x15: 0x0080, 0x16: 0x0080, 0x17: 0x0080, 0x18: 0x0080, 0x19: 0x0080, 0x1a: 0x0080, 0x1b: 0x0080, 0x1c: 0x0080, 0x1d: 0x0080, 0x1e: 0x0080, 0x1f: 0x0080, 0x20: 0x0080, 0x21: 0x0080, 0x22: 0x0080, 0x23: 0x0080, 0x24: 0x0080, 0x25: 0x0080, 0x26: 0x0080, 0x27: 0x0080, 0x28: 0x0080, 0x29: 0x0080, 0x2a: 0x0080, 0x2b: 0x0080, 0x2c: 0x0080, 0x2d: 0x0008, 0x2e: 0x0008, 0x2f: 0x0080, 0x30: 0x0008, 0x31: 0x0008, 0x32: 0x0008, 0x33: 0x0008, 0x34: 0x0008, 0x35: 0x0008, 0x36: 0x0008, 0x37: 0x0008, 0x38: 0x0008, 0x39: 0x0008, 0x3a: 0x0080, 0x3b: 0x0080, 0x3c: 0x0080, 0x3d: 0x0080, 0x3e: 0x0080, 0x3f: 0x0080, // Block 0x1, offset 0x40 0x40: 0x0080, 0x41: 0xe105, 0x42: 0xe105, 0x43: 0xe105, 0x44: 0xe105, 0x45: 0xe105, 0x46: 0xe105, 0x47: 0xe105, 0x48: 0xe105, 0x49: 0xe105, 0x4a: 0xe105, 0x4b: 0xe105, 0x4c: 0xe105, 0x4d: 0xe105, 0x4e: 0xe105, 0x4f: 0xe105, 0x50: 0xe105, 0x51: 0xe105, 0x52: 0xe105, 0x53: 0xe105, 0x54: 0xe105, 0x55: 0xe105, 0x56: 0xe105, 0x57: 0xe105, 0x58: 0xe105, 0x59: 0xe105, 0x5a: 0xe105, 0x5b: 0x0080, 0x5c: 0x0080, 0x5d: 0x0080, 0x5e: 0x0080, 0x5f: 0x0080, 0x60: 0x0080, 0x61: 0x0008, 0x62: 0x0008, 0x63: 0x0008, 0x64: 0x0008, 0x65: 0x0008, 0x66: 0x0008, 0x67: 0x0008, 0x68: 0x0008, 0x69: 0x0008, 0x6a: 0x0008, 0x6b: 0x0008, 0x6c: 0x0008, 0x6d: 0x0008, 0x6e: 0x0008, 0x6f: 0x0008, 0x70: 0x0008, 0x71: 0x0008, 0x72: 0x0008, 0x73: 0x0008, 0x74: 0x0008, 0x75: 0x0008, 0x76: 0x0008, 0x77: 0x0008, 0x78: 0x0008, 0x79: 0x0008, 0x7a: 0x0008, 0x7b: 0x0080, 0x7c: 0x0080, 0x7d: 0x0080, 0x7e: 0x0080, 0x7f: 0x0080, // Block 0x2, offset 0x80 // Block 0x3, offset 0xc0 0xc0: 0x0040, 0xc1: 0x0040, 0xc2: 0x0040, 0xc3: 0x0040, 0xc4: 0x0040, 0xc5: 0x0040, 0xc6: 0x0040, 0xc7: 0x0040, 0xc8: 0x0040, 0xc9: 0x0040, 0xca: 0x0040, 0xcb: 0x0040, 0xcc: 0x0040, 0xcd: 0x0040, 0xce: 0x0040, 0xcf: 0x0040, 0xd0: 0x0040, 0xd1: 0x0040, 0xd2: 0x0040, 0xd3: 0x0040, 0xd4: 0x0040, 0xd5: 0x0040, 0xd6: 0x0040, 0xd7: 0x0040, 0xd8: 0x0040, 0xd9: 0x0040, 0xda: 0x0040, 0xdb: 0x0040, 0xdc: 0x0040, 0xdd: 0x0040, 0xde: 0x0040, 0xdf: 0x0040, 0xe0: 0x000a, 0xe1: 0x0018, 0xe2: 0x0018, 0xe3: 0x0018, 0xe4: 0x0018, 0xe5: 0x0018, 0xe6: 0x0018, 0xe7: 0x0018, 0xe8: 0x001a, 0xe9: 0x0018, 0xea: 0x0039, 0xeb: 0x0018, 0xec: 0x0018, 0xed: 0x03c0, 0xee: 0x0018, 0xef: 0x004a, 0xf0: 0x0018, 0xf1: 0x0018, 0xf2: 0x0069, 0xf3: 0x0079, 0xf4: 0x008a, 0xf5: 0x0005, 0xf6: 0x0018, 0xf7: 0x0008, 0xf8: 0x00aa, 0xf9: 0x00c9, 0xfa: 0x00d9, 0xfb: 0x0018, 0xfc: 0x00e9, 0xfd: 0x0119, 0xfe: 0x0149, 0xff: 0x0018, // Block 0x4, offset 0x100 0x100: 0xe00d, 0x101: 0x0008, 0x102: 0xe00d, 0x103: 0x0008, 0x104: 0xe00d, 0x105: 0x0008, 0x106: 0xe00d, 0x107: 0x0008, 0x108: 0xe00d, 0x109: 0x0008, 0x10a: 0xe00d, 0x10b: 0x0008, 0x10c: 0xe00d, 0x10d: 0x0008, 0x10e: 0xe00d, 0x10f: 0x0008, 0x110: 0xe00d, 0x111: 0x0008, 0x112: 0xe00d, 0x113: 0x0008, 0x114: 0xe00d, 0x115: 0x0008, 0x116: 0xe00d, 0x117: 0x0008, 0x118: 0xe00d, 0x119: 0x0008, 0x11a: 0xe00d, 0x11b: 0x0008, 0x11c: 0xe00d, 0x11d: 0x0008, 0x11e: 0xe00d, 0x11f: 0x0008, 0x120: 0xe00d, 0x121: 0x0008, 0x122: 0xe00d, 0x123: 0x0008, 0x124: 0xe00d, 0x125: 0x0008, 0x126: 0xe00d, 0x127: 0x0008, 0x128: 0xe00d, 0x129: 0x0008, 0x12a: 0xe00d, 0x12b: 0x0008, 0x12c: 0xe00d, 0x12d: 0x0008, 0x12e: 0xe00d, 0x12f: 0x0008, 0x130: 0x0179, 0x131: 0x0008, 0x132: 0x0035, 0x133: 0x004d, 0x134: 0xe00d, 0x135: 0x0008, 0x136: 0xe00d, 0x137: 0x0008, 0x138: 0x0008, 0x139: 0xe01d, 0x13a: 0x0008, 0x13b: 0xe03d, 0x13c: 0x0008, 0x13d: 0xe01d, 0x13e: 0x0008, 0x13f: 0x0199, // Block 0x5, offset 0x140 0x140: 0x0199, 0x141: 0xe01d, 0x142: 0x0008, 0x143: 0xe03d, 0x144: 0x0008, 0x145: 0xe01d, 0x146: 0x0008, 0x147: 0xe07d, 0x148: 0x0008, 0x149: 0x01b9, 0x14a: 0xe00d, 0x14b: 0x0008, 0x14c: 0xe00d, 0x14d: 0x0008, 0x14e: 0xe00d, 0x14f: 0x0008, 0x150: 0xe00d, 0x151: 0x0008, 0x152: 0xe00d, 0x153: 0x0008, 0x154: 0xe00d, 0x155: 0x0008, 0x156: 0xe00d, 0x157: 0x0008, 0x158: 0xe00d, 0x159: 0x0008, 0x15a: 0xe00d, 0x15b: 0x0008, 0x15c: 0xe00d, 0x15d: 0x0008, 0x15e: 0xe00d, 0x15f: 0x0008, 0x160: 0xe00d, 0x161: 0x0008, 0x162: 0xe00d, 0x163: 0x0008, 0x164: 0xe00d, 0x165: 0x0008, 0x166: 0xe00d, 0x167: 0x0008, 0x168: 0xe00d, 0x169: 0x0008, 0x16a: 0xe00d, 0x16b: 0x0008, 0x16c: 0xe00d, 0x16d: 0x0008, 0x16e: 0xe00d, 0x16f: 0x0008, 0x170: 0xe00d, 0x171: 0x0008, 0x172: 0xe00d, 0x173: 0x0008, 0x174: 0xe00d, 0x175: 0x0008, 0x176: 0xe00d, 0x177: 0x0008, 0x178: 0x0065, 0x179: 0xe01d, 0x17a: 0x0008, 0x17b: 0xe03d, 0x17c: 0x0008, 0x17d: 0xe01d, 0x17e: 0x0008, 0x17f: 0x01d9, // Block 0x6, offset 0x180 0x180: 0x0008, 0x181: 0x007d, 0x182: 0xe00d, 0x183: 0x0008, 0x184: 0xe00d, 0x185: 0x0008, 0x186: 0x007d, 0x187: 0xe07d, 0x188: 0x0008, 0x189: 0x0095, 0x18a: 0x00ad, 0x18b: 0xe03d, 0x18c: 0x0008, 0x18d: 0x0008, 0x18e: 0x00c5, 0x18f: 0x00dd, 0x190: 0x00f5, 0x191: 0xe01d, 0x192: 0x0008, 0x193: 0x010d, 0x194: 0x0125, 0x195: 0x0008, 0x196: 0x013d, 0x197: 0x013d, 0x198: 0xe00d, 0x199: 0x0008, 0x19a: 0x0008, 0x19b: 0x0008, 0x19c: 0x010d, 0x19d: 0x0155, 0x19e: 0x0008, 0x19f: 0x016d, 0x1a0: 0xe00d, 0x1a1: 0x0008, 0x1a2: 0xe00d, 0x1a3: 0x0008, 0x1a4: 0xe00d, 0x1a5: 0x0008, 0x1a6: 0x0185, 0x1a7: 0xe07d, 0x1a8: 0x0008, 0x1a9: 0x019d, 0x1aa: 0x0008, 0x1ab: 0x0008, 0x1ac: 0xe00d, 0x1ad: 0x0008, 0x1ae: 0x0185, 0x1af: 0xe0fd, 0x1b0: 0x0008, 0x1b1: 0x01b5, 0x1b2: 0x01cd, 0x1b3: 0xe03d, 0x1b4: 0x0008, 0x1b5: 0xe01d, 0x1b6: 0x0008, 0x1b7: 0x01e5, 0x1b8: 0xe00d, 0x1b9: 0x0008, 0x1ba: 0x0008, 0x1bb: 0x0008, 0x1bc: 0xe00d, 0x1bd: 0x0008, 0x1be: 0x0008, 0x1bf: 0x0008, // Block 0x7, offset 0x1c0 0x1c0: 0x0008, 0x1c1: 0x0008, 0x1c2: 0x0008, 0x1c3: 0x0008, 0x1c4: 0x01e9, 0x1c5: 0x01e9, 0x1c6: 0x01e9, 0x1c7: 0x01fd, 0x1c8: 0x0215, 0x1c9: 0x022d, 0x1ca: 0x0245, 0x1cb: 0x025d, 0x1cc: 0x0275, 0x1cd: 0xe01d, 0x1ce: 0x0008, 0x1cf: 0xe0fd, 0x1d0: 0x0008, 0x1d1: 0xe01d, 0x1d2: 0x0008, 0x1d3: 0xe03d, 0x1d4: 0x0008, 0x1d5: 0xe01d, 0x1d6: 0x0008, 0x1d7: 0xe07d, 0x1d8: 0x0008, 0x1d9: 0xe01d, 0x1da: 0x0008, 0x1db: 0xe03d, 0x1dc: 0x0008, 0x1dd: 0x0008, 0x1de: 0xe00d, 0x1df: 0x0008, 0x1e0: 0xe00d, 0x1e1: 0x0008, 0x1e2: 0xe00d, 0x1e3: 0x0008, 0x1e4: 0xe00d, 0x1e5: 0x0008, 0x1e6: 0xe00d, 0x1e7: 0x0008, 0x1e8: 0xe00d, 0x1e9: 0x0008, 0x1ea: 0xe00d, 0x1eb: 0x0008, 0x1ec: 0xe00d, 0x1ed: 0x0008, 0x1ee: 0xe00d, 0x1ef: 0x0008, 0x1f0: 0x0008, 0x1f1: 0x028d, 0x1f2: 0x02a5, 0x1f3: 0x02bd, 0x1f4: 0xe00d, 0x1f5: 0x0008, 0x1f6: 0x02d5, 0x1f7: 0x02ed, 0x1f8: 0xe00d, 0x1f9: 0x0008, 0x1fa: 0xe00d, 0x1fb: 0x0008, 0x1fc: 0xe00d, 0x1fd: 0x0008, 0x1fe: 0xe00d, 0x1ff: 0x0008, // Block 0x8, offset 0x200 0x200: 0xe00d, 0x201: 0x0008, 0x202: 0xe00d, 0x203: 0x0008, 0x204: 0xe00d, 0x205: 0x0008, 0x206: 0xe00d, 0x207: 0x0008, 0x208: 0xe00d, 0x209: 0x0008, 0x20a: 0xe00d, 0x20b: 0x0008, 0x20c: 0xe00d, 0x20d: 0x0008, 0x20e: 0xe00d, 0x20f: 0x0008, 0x210: 0xe00d, 0x211: 0x0008, 0x212: 0xe00d, 0x213: 0x0008, 0x214: 0xe00d, 0x215: 0x0008, 0x216: 0xe00d, 0x217: 0x0008, 0x218: 0xe00d, 0x219: 0x0008, 0x21a: 0xe00d, 0x21b: 0x0008, 0x21c: 0xe00d, 0x21d: 0x0008, 0x21e: 0xe00d, 0x21f: 0x0008, 0x220: 0x0305, 0x221: 0x0008, 0x222: 0xe00d, 0x223: 0x0008, 0x224: 0xe00d, 0x225: 0x0008, 0x226: 0xe00d, 0x227: 0x0008, 0x228: 0xe00d, 0x229: 0x0008, 0x22a: 0xe00d, 0x22b: 0x0008, 0x22c: 0xe00d, 0x22d: 0x0008, 0x22e: 0xe00d, 0x22f: 0x0008, 0x230: 0xe00d, 0x231: 0x0008, 0x232: 0xe00d, 0x233: 0x0008, 0x234: 0x0008, 0x235: 0x0008, 0x236: 0x0008, 0x237: 0x0008, 0x238: 0x0008, 0x239: 0x0008, 0x23a: 0x0209, 0x23b: 0xe03d, 0x23c: 0x0008, 0x23d: 0x031d, 0x23e: 0x0229, 0x23f: 0x0008, // Block 0x9, offset 0x240 0x240: 0x0008, 0x241: 0x0008, 0x242: 0x0018, 0x243: 0x0018, 0x244: 0x0018, 0x245: 0x0018, 0x246: 0x0008, 0x247: 0x0008, 0x248: 0x0008, 0x249: 0x0008, 0x24a: 0x0008, 0x24b: 0x0008, 0x24c: 0x0008, 0x24d: 0x0008, 0x24e: 0x0008, 0x24f: 0x0008, 0x250: 0x0008, 0x251: 0x0008, 0x252: 0x0018, 0x253: 0x0018, 0x254: 0x0018, 0x255: 0x0018, 0x256: 0x0018, 0x257: 0x0018, 0x258: 0x029a, 0x259: 0x02ba, 0x25a: 0x02da, 0x25b: 0x02fa, 0x25c: 0x031a, 0x25d: 0x033a, 0x25e: 0x0018, 0x25f: 0x0018, 0x260: 0x03ad, 0x261: 0x0359, 0x262: 0x01d9, 0x263: 0x0369, 0x264: 0x03c5, 0x265: 0x0018, 0x266: 0x0018, 0x267: 0x0018, 0x268: 0x0018, 0x269: 0x0018, 0x26a: 0x0018, 0x26b: 0x0018, 0x26c: 0x0008, 0x26d: 0x0018, 0x26e: 0x0008, 0x26f: 0x0018, 0x270: 0x0018, 0x271: 0x0018, 0x272: 0x0018, 0x273: 0x0018, 0x274: 0x0018, 0x275: 0x0018, 0x276: 0x0018, 0x277: 0x0018, 0x278: 0x0018, 0x279: 0x0018, 0x27a: 0x0018, 0x27b: 0x0018, 0x27c: 0x0018, 0x27d: 0x0018, 0x27e: 0x0018, 0x27f: 0x0018, // Block 0xa, offset 0x280 0x280: 0x03dd, 0x281: 0x03dd, 0x282: 0x3308, 0x283: 0x03f5, 0x284: 0x0379, 0x285: 0x040d, 0x286: 0x3308, 0x287: 0x3308, 0x288: 0x3308, 0x289: 0x3308, 0x28a: 0x3308, 0x28b: 0x3308, 0x28c: 0x3308, 0x28d: 0x3308, 0x28e: 0x3308, 0x28f: 0x33c0, 0x290: 0x3308, 0x291: 0x3308, 0x292: 0x3308, 0x293: 0x3308, 0x294: 0x3308, 0x295: 0x3308, 0x296: 0x3308, 0x297: 0x3308, 0x298: 0x3308, 0x299: 0x3308, 0x29a: 0x3308, 0x29b: 0x3308, 0x29c: 0x3308, 0x29d: 0x3308, 0x29e: 0x3308, 0x29f: 0x3308, 0x2a0: 0x3308, 0x2a1: 0x3308, 0x2a2: 0x3308, 0x2a3: 0x3308, 0x2a4: 0x3308, 0x2a5: 0x3308, 0x2a6: 0x3308, 0x2a7: 0x3308, 0x2a8: 0x3308, 0x2a9: 0x3308, 0x2aa: 0x3308, 0x2ab: 0x3308, 0x2ac: 0x3308, 0x2ad: 0x3308, 0x2ae: 0x3308, 0x2af: 0x3308, 0x2b0: 0xe00d, 0x2b1: 0x0008, 0x2b2: 0xe00d, 0x2b3: 0x0008, 0x2b4: 0x0425, 0x2b5: 0x0008, 0x2b6: 0xe00d, 0x2b7: 0x0008, 0x2b8: 0x0040, 0x2b9: 0x0040, 0x2ba: 0x03a2, 0x2bb: 0x0008, 0x2bc: 0x0008, 0x2bd: 0x0008, 0x2be: 0x03c2, 0x2bf: 0x043d, // Block 0xb, offset 0x2c0 0x2c0: 0x0040, 0x2c1: 0x0040, 0x2c2: 0x0040, 0x2c3: 0x0040, 0x2c4: 0x008a, 0x2c5: 0x03d2, 0x2c6: 0xe155, 0x2c7: 0x0455, 0x2c8: 0xe12d, 0x2c9: 0xe13d, 0x2ca: 0xe12d, 0x2cb: 0x0040, 0x2cc: 0x03dd, 0x2cd: 0x0040, 0x2ce: 0x046d, 0x2cf: 0x0485, 0x2d0: 0x0008, 0x2d1: 0xe105, 0x2d2: 0xe105, 0x2d3: 0xe105, 0x2d4: 0xe105, 0x2d5: 0xe105, 0x2d6: 0xe105, 0x2d7: 0xe105, 0x2d8: 0xe105, 0x2d9: 0xe105, 0x2da: 0xe105, 0x2db: 0xe105, 0x2dc: 0xe105, 0x2dd: 0xe105, 0x2de: 0xe105, 0x2df: 0xe105, 0x2e0: 0x049d, 0x2e1: 0x049d, 0x2e2: 0x0040, 0x2e3: 0x049d, 0x2e4: 0x049d, 0x2e5: 0x049d, 0x2e6: 0x049d, 0x2e7: 0x049d, 0x2e8: 0x049d, 0x2e9: 0x049d, 0x2ea: 0x049d, 0x2eb: 0x049d, 0x2ec: 0x0008, 0x2ed: 0x0008, 0x2ee: 0x0008, 0x2ef: 0x0008, 0x2f0: 0x0008, 0x2f1: 0x0008, 0x2f2: 0x0008, 0x2f3: 0x0008, 0x2f4: 0x0008, 0x2f5: 0x0008, 0x2f6: 0x0008, 0x2f7: 0x0008, 0x2f8: 0x0008, 0x2f9: 0x0008, 0x2fa: 0x0008, 0x2fb: 0x0008, 0x2fc: 0x0008, 0x2fd: 0x0008, 0x2fe: 0x0008, 0x2ff: 0x0008, // Block 0xc, offset 0x300 0x300: 0x0008, 0x301: 0x0008, 0x302: 0xe00f, 0x303: 0x0008, 0x304: 0x0008, 0x305: 0x0008, 0x306: 0x0008, 0x307: 0x0008, 0x308: 0x0008, 0x309: 0x0008, 0x30a: 0x0008, 0x30b: 0x0008, 0x30c: 0x0008, 0x30d: 0x0008, 0x30e: 0x0008, 0x30f: 0xe0c5, 0x310: 0x04b5, 0x311: 0x04cd, 0x312: 0xe0bd, 0x313: 0xe0f5, 0x314: 0xe0fd, 0x315: 0xe09d, 0x316: 0xe0b5, 0x317: 0x0008, 0x318: 0xe00d, 0x319: 0x0008, 0x31a: 0xe00d, 0x31b: 0x0008, 0x31c: 0xe00d, 0x31d: 0x0008, 0x31e: 0xe00d, 0x31f: 0x0008, 0x320: 0xe00d, 0x321: 0x0008, 0x322: 0xe00d, 0x323: 0x0008, 0x324: 0xe00d, 0x325: 0x0008, 0x326: 0xe00d, 0x327: 0x0008, 0x328: 0xe00d, 0x329: 0x0008, 0x32a: 0xe00d, 0x32b: 0x0008, 0x32c: 0xe00d, 0x32d: 0x0008, 0x32e: 0xe00d, 0x32f: 0x0008, 0x330: 0x04e5, 0x331: 0xe185, 0x332: 0xe18d, 0x333: 0x0008, 0x334: 0x04fd, 0x335: 0x03dd, 0x336: 0x0018, 0x337: 0xe07d, 0x338: 0x0008, 0x339: 0xe1d5, 0x33a: 0xe00d, 0x33b: 0x0008, 0x33c: 0x0008, 0x33d: 0x0515, 0x33e: 0x052d, 0x33f: 0x052d, // Block 0xd, offset 0x340 0x340: 0x0008, 0x341: 0x0008, 0x342: 0x0008, 0x343: 0x0008, 0x344: 0x0008, 0x345: 0x0008, 0x346: 0x0008, 0x347: 0x0008, 0x348: 0x0008, 0x349: 0x0008, 0x34a: 0x0008, 0x34b: 0x0008, 0x34c: 0x0008, 0x34d: 0x0008, 0x34e: 0x0008, 0x34f: 0x0008, 0x350: 0x0008, 0x351: 0x0008, 0x352: 0x0008, 0x353: 0x0008, 0x354: 0x0008, 0x355: 0x0008, 0x356: 0x0008, 0x357: 0x0008, 0x358: 0x0008, 0x359: 0x0008, 0x35a: 0x0008, 0x35b: 0x0008, 0x35c: 0x0008, 0x35d: 0x0008, 0x35e: 0x0008, 0x35f: 0x0008, 0x360: 0xe00d, 0x361: 0x0008, 0x362: 0xe00d, 0x363: 0x0008, 0x364: 0xe00d, 0x365: 0x0008, 0x366: 0xe00d, 0x367: 0x0008, 0x368: 0xe00d, 0x369: 0x0008, 0x36a: 0xe00d, 0x36b: 0x0008, 0x36c: 0xe00d, 0x36d: 0x0008, 0x36e: 0xe00d, 0x36f: 0x0008, 0x370: 0xe00d, 0x371: 0x0008, 0x372: 0xe00d, 0x373: 0x0008, 0x374: 0xe00d, 0x375: 0x0008, 0x376: 0xe00d, 0x377: 0x0008, 0x378: 0xe00d, 0x379: 0x0008, 0x37a: 0xe00d, 0x37b: 0x0008, 0x37c: 0xe00d, 0x37d: 0x0008, 0x37e: 0xe00d, 0x37f: 0x0008, // Block 0xe, offset 0x380 0x380: 0xe00d, 0x381: 0x0008, 0x382: 0x0018, 0x383: 0x3308, 0x384: 0x3308, 0x385: 0x3308, 0x386: 0x3308, 0x387: 0x3308, 0x388: 0x3318, 0x389: 0x3318, 0x38a: 0xe00d, 0x38b: 0x0008, 0x38c: 0xe00d, 0x38d: 0x0008, 0x38e: 0xe00d, 0x38f: 0x0008, 0x390: 0xe00d, 0x391: 0x0008, 0x392: 0xe00d, 0x393: 0x0008, 0x394: 0xe00d, 0x395: 0x0008, 0x396: 0xe00d, 0x397: 0x0008, 0x398: 0xe00d, 0x399: 0x0008, 0x39a: 0xe00d, 0x39b: 0x0008, 0x39c: 0xe00d, 0x39d: 0x0008, 0x39e: 0xe00d, 0x39f: 0x0008, 0x3a0: 0xe00d, 0x3a1: 0x0008, 0x3a2: 0xe00d, 0x3a3: 0x0008, 0x3a4: 0xe00d, 0x3a5: 0x0008, 0x3a6: 0xe00d, 0x3a7: 0x0008, 0x3a8: 0xe00d, 0x3a9: 0x0008, 0x3aa: 0xe00d, 0x3ab: 0x0008, 0x3ac: 0xe00d, 0x3ad: 0x0008, 0x3ae: 0xe00d, 0x3af: 0x0008, 0x3b0: 0xe00d, 0x3b1: 0x0008, 0x3b2: 0xe00d, 0x3b3: 0x0008, 0x3b4: 0xe00d, 0x3b5: 0x0008, 0x3b6: 0xe00d, 0x3b7: 0x0008, 0x3b8: 0xe00d, 0x3b9: 0x0008, 0x3ba: 0xe00d, 0x3bb: 0x0008, 0x3bc: 0xe00d, 0x3bd: 0x0008, 0x3be: 0xe00d, 0x3bf: 0x0008, // Block 0xf, offset 0x3c0 0x3c0: 0x0040, 0x3c1: 0xe01d, 0x3c2: 0x0008, 0x3c3: 0xe03d, 0x3c4: 0x0008, 0x3c5: 0xe01d, 0x3c6: 0x0008, 0x3c7: 0xe07d, 0x3c8: 0x0008, 0x3c9: 0xe01d, 0x3ca: 0x0008, 0x3cb: 0xe03d, 0x3cc: 0x0008, 0x3cd: 0xe01d, 0x3ce: 0x0008, 0x3cf: 0x0008, 0x3d0: 0xe00d, 0x3d1: 0x0008, 0x3d2: 0xe00d, 0x3d3: 0x0008, 0x3d4: 0xe00d, 0x3d5: 0x0008, 0x3d6: 0xe00d, 0x3d7: 0x0008, 0x3d8: 0xe00d, 0x3d9: 0x0008, 0x3da: 0xe00d, 0x3db: 0x0008, 0x3dc: 0xe00d, 0x3dd: 0x0008, 0x3de: 0xe00d, 0x3df: 0x0008, 0x3e0: 0xe00d, 0x3e1: 0x0008, 0x3e2: 0xe00d, 0x3e3: 0x0008, 0x3e4: 0xe00d, 0x3e5: 0x0008, 0x3e6: 0xe00d, 0x3e7: 0x0008, 0x3e8: 0xe00d, 0x3e9: 0x0008, 0x3ea: 0xe00d, 0x3eb: 0x0008, 0x3ec: 0xe00d, 0x3ed: 0x0008, 0x3ee: 0xe00d, 0x3ef: 0x0008, 0x3f0: 0xe00d, 0x3f1: 0x0008, 0x3f2: 0xe00d, 0x3f3: 0x0008, 0x3f4: 0xe00d, 0x3f5: 0x0008, 0x3f6: 0xe00d, 0x3f7: 0x0008, 0x3f8: 0xe00d, 0x3f9: 0x0008, 0x3fa: 0xe00d, 0x3fb: 0x0008, 0x3fc: 0xe00d, 0x3fd: 0x0008, 0x3fe: 0xe00d, 0x3ff: 0x0008, // Block 0x10, offset 0x400 0x400: 0xe00d, 0x401: 0x0008, 0x402: 0xe00d, 0x403: 0x0008, 0x404: 0xe00d, 0x405: 0x0008, 0x406: 0xe00d, 0x407: 0x0008, 0x408: 0xe00d, 0x409: 0x0008, 0x40a: 0xe00d, 0x40b: 0x0008, 0x40c: 0xe00d, 0x40d: 0x0008, 0x40e: 0xe00d, 0x40f: 0x0008, 0x410: 0xe00d, 0x411: 0x0008, 0x412: 0xe00d, 0x413: 0x0008, 0x414: 0xe00d, 0x415: 0x0008, 0x416: 0xe00d, 0x417: 0x0008, 0x418: 0xe00d, 0x419: 0x0008, 0x41a: 0xe00d, 0x41b: 0x0008, 0x41c: 0xe00d, 0x41d: 0x0008, 0x41e: 0xe00d, 0x41f: 0x0008, 0x420: 0xe00d, 0x421: 0x0008, 0x422: 0xe00d, 0x423: 0x0008, 0x424: 0xe00d, 0x425: 0x0008, 0x426: 0xe00d, 0x427: 0x0008, 0x428: 0xe00d, 0x429: 0x0008, 0x42a: 0xe00d, 0x42b: 0x0008, 0x42c: 0xe00d, 0x42d: 0x0008, 0x42e: 0xe00d, 0x42f: 0x0008, 0x430: 0x0040, 0x431: 0x03f5, 0x432: 0x03f5, 0x433: 0x03f5, 0x434: 0x03f5, 0x435: 0x03f5, 0x436: 0x03f5, 0x437: 0x03f5, 0x438: 0x03f5, 0x439: 0x03f5, 0x43a: 0x03f5, 0x43b: 0x03f5, 0x43c: 0x03f5, 0x43d: 0x03f5, 0x43e: 0x03f5, 0x43f: 0x03f5, // Block 0x11, offset 0x440 0x440: 0x0840, 0x441: 0x0840, 0x442: 0x0840, 0x443: 0x0840, 0x444: 0x0840, 0x445: 0x0840, 0x446: 0x0018, 0x447: 0x0018, 0x448: 0x0818, 0x449: 0x0018, 0x44a: 0x0018, 0x44b: 0x0818, 0x44c: 0x0018, 0x44d: 0x0818, 0x44e: 0x0018, 0x44f: 0x0018, 0x450: 0x3308, 0x451: 0x3308, 0x452: 0x3308, 0x453: 0x3308, 0x454: 0x3308, 0x455: 0x3308, 0x456: 0x3308, 0x457: 0x3308, 0x458: 0x3308, 0x459: 0x3308, 0x45a: 0x3308, 0x45b: 0x0818, 0x45c: 0x0b40, 0x45d: 0x0040, 0x45e: 0x0818, 0x45f: 0x0818, 0x460: 0x0a08, 0x461: 0x0808, 0x462: 0x0c08, 0x463: 0x0c08, 0x464: 0x0c08, 0x465: 0x0c08, 0x466: 0x0a08, 0x467: 0x0c08, 0x468: 0x0a08, 0x469: 0x0c08, 0x46a: 0x0a08, 0x46b: 0x0a08, 0x46c: 0x0a08, 0x46d: 0x0a08, 0x46e: 0x0a08, 0x46f: 0x0c08, 0x470: 0x0c08, 0x471: 0x0c08, 0x472: 0x0c08, 0x473: 0x0a08, 0x474: 0x0a08, 0x475: 0x0a08, 0x476: 0x0a08, 0x477: 0x0a08, 0x478: 0x0a08, 0x479: 0x0a08, 0x47a: 0x0a08, 0x47b: 0x0a08, 0x47c: 0x0a08, 0x47d: 0x0a08, 0x47e: 0x0a08, 0x47f: 0x0a08, // Block 0x12, offset 0x480 0x480: 0x0818, 0x481: 0x0a08, 0x482: 0x0a08, 0x483: 0x0a08, 0x484: 0x0a08, 0x485: 0x0a08, 0x486: 0x0a08, 0x487: 0x0a08, 0x488: 0x0c08, 0x489: 0x0a08, 0x48a: 0x0a08, 0x48b: 0x3308, 0x48c: 0x3308, 0x48d: 0x3308, 0x48e: 0x3308, 0x48f: 0x3308, 0x490: 0x3308, 0x491: 0x3308, 0x492: 0x3308, 0x493: 0x3308, 0x494: 0x3308, 0x495: 0x3308, 0x496: 0x3308, 0x497: 0x3308, 0x498: 0x3308, 0x499: 0x3308, 0x49a: 0x3308, 0x49b: 0x3308, 0x49c: 0x3308, 0x49d: 0x3308, 0x49e: 0x3308, 0x49f: 0x3308, 0x4a0: 0x0808, 0x4a1: 0x0808, 0x4a2: 0x0808, 0x4a3: 0x0808, 0x4a4: 0x0808, 0x4a5: 0x0808, 0x4a6: 0x0808, 0x4a7: 0x0808, 0x4a8: 0x0808, 0x4a9: 0x0808, 0x4aa: 0x0018, 0x4ab: 0x0818, 0x4ac: 0x0818, 0x4ad: 0x0818, 0x4ae: 0x0a08, 0x4af: 0x0a08, 0x4b0: 0x3308, 0x4b1: 0x0c08, 0x4b2: 0x0c08, 0x4b3: 0x0c08, 0x4b4: 0x0808, 0x4b5: 0x0429, 0x4b6: 0x0451, 0x4b7: 0x0479, 0x4b8: 0x04a1, 0x4b9: 0x0a08, 0x4ba: 0x0a08, 0x4bb: 0x0a08, 0x4bc: 0x0a08, 0x4bd: 0x0a08, 0x4be: 0x0a08, 0x4bf: 0x0a08, // Block 0x13, offset 0x4c0 0x4c0: 0x0c08, 0x4c1: 0x0a08, 0x4c2: 0x0a08, 0x4c3: 0x0c08, 0x4c4: 0x0c08, 0x4c5: 0x0c08, 0x4c6: 0x0c08, 0x4c7: 0x0c08, 0x4c8: 0x0c08, 0x4c9: 0x0c08, 0x4ca: 0x0c08, 0x4cb: 0x0c08, 0x4cc: 0x0a08, 0x4cd: 0x0c08, 0x4ce: 0x0a08, 0x4cf: 0x0c08, 0x4d0: 0x0a08, 0x4d1: 0x0a08, 0x4d2: 0x0c08, 0x4d3: 0x0c08, 0x4d4: 0x0818, 0x4d5: 0x0c08, 0x4d6: 0x3308, 0x4d7: 0x3308, 0x4d8: 0x3308, 0x4d9: 0x3308, 0x4da: 0x3308, 0x4db: 0x3308, 0x4dc: 0x3308, 0x4dd: 0x0840, 0x4de: 0x0018, 0x4df: 0x3308, 0x4e0: 0x3308, 0x4e1: 0x3308, 0x4e2: 0x3308, 0x4e3: 0x3308, 0x4e4: 0x3308, 0x4e5: 0x0808, 0x4e6: 0x0808, 0x4e7: 0x3308, 0x4e8: 0x3308, 0x4e9: 0x0018, 0x4ea: 0x3308, 0x4eb: 0x3308, 0x4ec: 0x3308, 0x4ed: 0x3308, 0x4ee: 0x0c08, 0x4ef: 0x0c08, 0x4f0: 0x0008, 0x4f1: 0x0008, 0x4f2: 0x0008, 0x4f3: 0x0008, 0x4f4: 0x0008, 0x4f5: 0x0008, 0x4f6: 0x0008, 0x4f7: 0x0008, 0x4f8: 0x0008, 0x4f9: 0x0008, 0x4fa: 0x0a08, 0x4fb: 0x0a08, 0x4fc: 0x0a08, 0x4fd: 0x0808, 0x4fe: 0x0808, 0x4ff: 0x0a08, // Block 0x14, offset 0x500 0x500: 0x0818, 0x501: 0x0818, 0x502: 0x0818, 0x503: 0x0818, 0x504: 0x0818, 0x505: 0x0818, 0x506: 0x0818, 0x507: 0x0818, 0x508: 0x0818, 0x509: 0x0818, 0x50a: 0x0818, 0x50b: 0x0818, 0x50c: 0x0818, 0x50d: 0x0818, 0x50e: 0x0040, 0x50f: 0x0b40, 0x510: 0x0c08, 0x511: 0x3308, 0x512: 0x0a08, 0x513: 0x0a08, 0x514: 0x0a08, 0x515: 0x0c08, 0x516: 0x0c08, 0x517: 0x0c08, 0x518: 0x0c08, 0x519: 0x0c08, 0x51a: 0x0a08, 0x51b: 0x0a08, 0x51c: 0x0a08, 0x51d: 0x0a08, 0x51e: 0x0c08, 0x51f: 0x0a08, 0x520: 0x0a08, 0x521: 0x0a08, 0x522: 0x0a08, 0x523: 0x0a08, 0x524: 0x0a08, 0x525: 0x0a08, 0x526: 0x0a08, 0x527: 0x0a08, 0x528: 0x0c08, 0x529: 0x0a08, 0x52a: 0x0c08, 0x52b: 0x0a08, 0x52c: 0x0c08, 0x52d: 0x0a08, 0x52e: 0x0a08, 0x52f: 0x0c08, 0x530: 0x3308, 0x531: 0x3308, 0x532: 0x3308, 0x533: 0x3308, 0x534: 0x3308, 0x535: 0x3308, 0x536: 0x3308, 0x537: 0x3308, 0x538: 0x3308, 0x539: 0x3308, 0x53a: 0x3308, 0x53b: 0x3308, 0x53c: 0x3308, 0x53d: 0x3308, 0x53e: 0x3308, 0x53f: 0x3308, // Block 0x15, offset 0x540 0x540: 0x0c08, 0x541: 0x0a08, 0x542: 0x0a08, 0x543: 0x0a08, 0x544: 0x0a08, 0x545: 0x0a08, 0x546: 0x0c08, 0x547: 0x0c08, 0x548: 0x0a08, 0x549: 0x0c08, 0x54a: 0x0a08, 0x54b: 0x0a08, 0x54c: 0x0a08, 0x54d: 0x0a08, 0x54e: 0x0a08, 0x54f: 0x0a08, 0x550: 0x0a08, 0x551: 0x0a08, 0x552: 0x0a08, 0x553: 0x0a08, 0x554: 0x0c08, 0x555: 0x0a08, 0x556: 0x0808, 0x557: 0x0808, 0x558: 0x0808, 0x559: 0x3308, 0x55a: 0x3308, 0x55b: 0x3308, 0x55c: 0x0040, 0x55d: 0x0040, 0x55e: 0x0818, 0x55f: 0x0040, 0x560: 0x0a08, 0x561: 0x0808, 0x562: 0x0a08, 0x563: 0x0a08, 0x564: 0x0a08, 0x565: 0x0a08, 0x566: 0x0808, 0x567: 0x0c08, 0x568: 0x0a08, 0x569: 0x0c08, 0x56a: 0x0c08, 0x56b: 0x0040, 0x56c: 0x0040, 0x56d: 0x0040, 0x56e: 0x0040, 0x56f: 0x0040, 0x570: 0x0040, 0x571: 0x0040, 0x572: 0x0040, 0x573: 0x0040, 0x574: 0x0040, 0x575: 0x0040, 0x576: 0x0040, 0x577: 0x0040, 0x578: 0x0040, 0x579: 0x0040, 0x57a: 0x0040, 0x57b: 0x0040, 0x57c: 0x0040, 0x57d: 0x0040, 0x57e: 0x0040, 0x57f: 0x0040, // Block 0x16, offset 0x580 0x580: 0x3008, 0x581: 0x3308, 0x582: 0x3308, 0x583: 0x3308, 0x584: 0x3308, 0x585: 0x3308, 0x586: 0x3308, 0x587: 0x3308, 0x588: 0x3308, 0x589: 0x3008, 0x58a: 0x3008, 0x58b: 0x3008, 0x58c: 0x3008, 0x58d: 0x3b08, 0x58e: 0x3008, 0x58f: 0x3008, 0x590: 0x0008, 0x591: 0x3308, 0x592: 0x3308, 0x593: 0x3308, 0x594: 0x3308, 0x595: 0x3308, 0x596: 0x3308, 0x597: 0x3308, 0x598: 0x04c9, 0x599: 0x0501, 0x59a: 0x0539, 0x59b: 0x0571, 0x59c: 0x05a9, 0x59d: 0x05e1, 0x59e: 0x0619, 0x59f: 0x0651, 0x5a0: 0x0008, 0x5a1: 0x0008, 0x5a2: 0x3308, 0x5a3: 0x3308, 0x5a4: 0x0018, 0x5a5: 0x0018, 0x5a6: 0x0008, 0x5a7: 0x0008, 0x5a8: 0x0008, 0x5a9: 0x0008, 0x5aa: 0x0008, 0x5ab: 0x0008, 0x5ac: 0x0008, 0x5ad: 0x0008, 0x5ae: 0x0008, 0x5af: 0x0008, 0x5b0: 0x0018, 0x5b1: 0x0008, 0x5b2: 0x0008, 0x5b3: 0x0008, 0x5b4: 0x0008, 0x5b5: 0x0008, 0x5b6: 0x0008, 0x5b7: 0x0008, 0x5b8: 0x0008, 0x5b9: 0x0008, 0x5ba: 0x0008, 0x5bb: 0x0008, 0x5bc: 0x0008, 0x5bd: 0x0008, 0x5be: 0x0008, 0x5bf: 0x0008, // Block 0x17, offset 0x5c0 0x5c0: 0x0008, 0x5c1: 0x3308, 0x5c2: 0x3008, 0x5c3: 0x3008, 0x5c4: 0x0040, 0x5c5: 0x0008, 0x5c6: 0x0008, 0x5c7: 0x0008, 0x5c8: 0x0008, 0x5c9: 0x0008, 0x5ca: 0x0008, 0x5cb: 0x0008, 0x5cc: 0x0008, 0x5cd: 0x0040, 0x5ce: 0x0040, 0x5cf: 0x0008, 0x5d0: 0x0008, 0x5d1: 0x0040, 0x5d2: 0x0040, 0x5d3: 0x0008, 0x5d4: 0x0008, 0x5d5: 0x0008, 0x5d6: 0x0008, 0x5d7: 0x0008, 0x5d8: 0x0008, 0x5d9: 0x0008, 0x5da: 0x0008, 0x5db: 0x0008, 0x5dc: 0x0008, 0x5dd: 0x0008, 0x5de: 0x0008, 0x5df: 0x0008, 0x5e0: 0x0008, 0x5e1: 0x0008, 0x5e2: 0x0008, 0x5e3: 0x0008, 0x5e4: 0x0008, 0x5e5: 0x0008, 0x5e6: 0x0008, 0x5e7: 0x0008, 0x5e8: 0x0008, 0x5e9: 0x0040, 0x5ea: 0x0008, 0x5eb: 0x0008, 0x5ec: 0x0008, 0x5ed: 0x0008, 0x5ee: 0x0008, 0x5ef: 0x0008, 0x5f0: 0x0008, 0x5f1: 0x0040, 0x5f2: 0x0008, 0x5f3: 0x0040, 0x5f4: 0x0040, 0x5f5: 0x0040, 0x5f6: 0x0008, 0x5f7: 0x0008, 0x5f8: 0x0008, 0x5f9: 0x0008, 0x5fa: 0x0040, 0x5fb: 0x0040, 0x5fc: 0x3308, 0x5fd: 0x0008, 0x5fe: 0x3008, 0x5ff: 0x3008, // Block 0x18, offset 0x600 0x600: 0x3008, 0x601: 0x3308, 0x602: 0x3308, 0x603: 0x3308, 0x604: 0x3308, 0x605: 0x0040, 0x606: 0x0040, 0x607: 0x3008, 0x608: 0x3008, 0x609: 0x0040, 0x60a: 0x0040, 0x60b: 0x3008, 0x60c: 0x3008, 0x60d: 0x3b08, 0x60e: 0x0008, 0x60f: 0x0040, 0x610: 0x0040, 0x611: 0x0040, 0x612: 0x0040, 0x613: 0x0040, 0x614: 0x0040, 0x615: 0x0040, 0x616: 0x0040, 0x617: 0x3008, 0x618: 0x0040, 0x619: 0x0040, 0x61a: 0x0040, 0x61b: 0x0040, 0x61c: 0x0689, 0x61d: 0x06c1, 0x61e: 0x0040, 0x61f: 0x06f9, 0x620: 0x0008, 0x621: 0x0008, 0x622: 0x3308, 0x623: 0x3308, 0x624: 0x0040, 0x625: 0x0040, 0x626: 0x0008, 0x627: 0x0008, 0x628: 0x0008, 0x629: 0x0008, 0x62a: 0x0008, 0x62b: 0x0008, 0x62c: 0x0008, 0x62d: 0x0008, 0x62e: 0x0008, 0x62f: 0x0008, 0x630: 0x0008, 0x631: 0x0008, 0x632: 0x0018, 0x633: 0x0018, 0x634: 0x0018, 0x635: 0x0018, 0x636: 0x0018, 0x637: 0x0018, 0x638: 0x0018, 0x639: 0x0018, 0x63a: 0x0018, 0x63b: 0x0018, 0x63c: 0x0008, 0x63d: 0x0018, 0x63e: 0x0040, 0x63f: 0x0040, // Block 0x19, offset 0x640 0x640: 0x0040, 0x641: 0x3308, 0x642: 0x3308, 0x643: 0x3008, 0x644: 0x0040, 0x645: 0x0008, 0x646: 0x0008, 0x647: 0x0008, 0x648: 0x0008, 0x649: 0x0008, 0x64a: 0x0008, 0x64b: 0x0040, 0x64c: 0x0040, 0x64d: 0x0040, 0x64e: 0x0040, 0x64f: 0x0008, 0x650: 0x0008, 0x651: 0x0040, 0x652: 0x0040, 0x653: 0x0008, 0x654: 0x0008, 0x655: 0x0008, 0x656: 0x0008, 0x657: 0x0008, 0x658: 0x0008, 0x659: 0x0008, 0x65a: 0x0008, 0x65b: 0x0008, 0x65c: 0x0008, 0x65d: 0x0008, 0x65e: 0x0008, 0x65f: 0x0008, 0x660: 0x0008, 0x661: 0x0008, 0x662: 0x0008, 0x663: 0x0008, 0x664: 0x0008, 0x665: 0x0008, 0x666: 0x0008, 0x667: 0x0008, 0x668: 0x0008, 0x669: 0x0040, 0x66a: 0x0008, 0x66b: 0x0008, 0x66c: 0x0008, 0x66d: 0x0008, 0x66e: 0x0008, 0x66f: 0x0008, 0x670: 0x0008, 0x671: 0x0040, 0x672: 0x0008, 0x673: 0x0731, 0x674: 0x0040, 0x675: 0x0008, 0x676: 0x0769, 0x677: 0x0040, 0x678: 0x0008, 0x679: 0x0008, 0x67a: 0x0040, 0x67b: 0x0040, 0x67c: 0x3308, 0x67d: 0x0040, 0x67e: 0x3008, 0x67f: 0x3008, // Block 0x1a, offset 0x680 0x680: 0x3008, 0x681: 0x3308, 0x682: 0x3308, 0x683: 0x0040, 0x684: 0x0040, 0x685: 0x0040, 0x686: 0x0040, 0x687: 0x3308, 0x688: 0x3308, 0x689: 0x0040, 0x68a: 0x0040, 0x68b: 0x3308, 0x68c: 0x3308, 0x68d: 0x3b08, 0x68e: 0x0040, 0x68f: 0x0040, 0x690: 0x0040, 0x691: 0x3308, 0x692: 0x0040, 0x693: 0x0040, 0x694: 0x0040, 0x695: 0x0040, 0x696: 0x0040, 0x697: 0x0040, 0x698: 0x0040, 0x699: 0x07a1, 0x69a: 0x07d9, 0x69b: 0x0811, 0x69c: 0x0008, 0x69d: 0x0040, 0x69e: 0x0849, 0x69f: 0x0040, 0x6a0: 0x0040, 0x6a1: 0x0040, 0x6a2: 0x0040, 0x6a3: 0x0040, 0x6a4: 0x0040, 0x6a5: 0x0040, 0x6a6: 0x0008, 0x6a7: 0x0008, 0x6a8: 0x0008, 0x6a9: 0x0008, 0x6aa: 0x0008, 0x6ab: 0x0008, 0x6ac: 0x0008, 0x6ad: 0x0008, 0x6ae: 0x0008, 0x6af: 0x0008, 0x6b0: 0x3308, 0x6b1: 0x3308, 0x6b2: 0x0008, 0x6b3: 0x0008, 0x6b4: 0x0008, 0x6b5: 0x3308, 0x6b6: 0x0040, 0x6b7: 0x0040, 0x6b8: 0x0040, 0x6b9: 0x0040, 0x6ba: 0x0040, 0x6bb: 0x0040, 0x6bc: 0x0040, 0x6bd: 0x0040, 0x6be: 0x0040, 0x6bf: 0x0040, // Block 0x1b, offset 0x6c0 0x6c0: 0x0040, 0x6c1: 0x3308, 0x6c2: 0x3308, 0x6c3: 0x3008, 0x6c4: 0x0040, 0x6c5: 0x0008, 0x6c6: 0x0008, 0x6c7: 0x0008, 0x6c8: 0x0008, 0x6c9: 0x0008, 0x6ca: 0x0008, 0x6cb: 0x0008, 0x6cc: 0x0008, 0x6cd: 0x0008, 0x6ce: 0x0040, 0x6cf: 0x0008, 0x6d0: 0x0008, 0x6d1: 0x0008, 0x6d2: 0x0040, 0x6d3: 0x0008, 0x6d4: 0x0008, 0x6d5: 0x0008, 0x6d6: 0x0008, 0x6d7: 0x0008, 0x6d8: 0x0008, 0x6d9: 0x0008, 0x6da: 0x0008, 0x6db: 0x0008, 0x6dc: 0x0008, 0x6dd: 0x0008, 0x6de: 0x0008, 0x6df: 0x0008, 0x6e0: 0x0008, 0x6e1: 0x0008, 0x6e2: 0x0008, 0x6e3: 0x0008, 0x6e4: 0x0008, 0x6e5: 0x0008, 0x6e6: 0x0008, 0x6e7: 0x0008, 0x6e8: 0x0008, 0x6e9: 0x0040, 0x6ea: 0x0008, 0x6eb: 0x0008, 0x6ec: 0x0008, 0x6ed: 0x0008, 0x6ee: 0x0008, 0x6ef: 0x0008, 0x6f0: 0x0008, 0x6f1: 0x0040, 0x6f2: 0x0008, 0x6f3: 0x0008, 0x6f4: 0x0040, 0x6f5: 0x0008, 0x6f6: 0x0008, 0x6f7: 0x0008, 0x6f8: 0x0008, 0x6f9: 0x0008, 0x6fa: 0x0040, 0x6fb: 0x0040, 0x6fc: 0x3308, 0x6fd: 0x0008, 0x6fe: 0x3008, 0x6ff: 0x3008, // Block 0x1c, offset 0x700 0x700: 0x3008, 0x701: 0x3308, 0x702: 0x3308, 0x703: 0x3308, 0x704: 0x3308, 0x705: 0x3308, 0x706: 0x0040, 0x707: 0x3308, 0x708: 0x3308, 0x709: 0x3008, 0x70a: 0x0040, 0x70b: 0x3008, 0x70c: 0x3008, 0x70d: 0x3b08, 0x70e: 0x0040, 0x70f: 0x0040, 0x710: 0x0008, 0x711: 0x0040, 0x712: 0x0040, 0x713: 0x0040, 0x714: 0x0040, 0x715: 0x0040, 0x716: 0x0040, 0x717: 0x0040, 0x718: 0x0040, 0x719: 0x0040, 0x71a: 0x0040, 0x71b: 0x0040, 0x71c: 0x0040, 0x71d: 0x0040, 0x71e: 0x0040, 0x71f: 0x0040, 0x720: 0x0008, 0x721: 0x0008, 0x722: 0x3308, 0x723: 0x3308, 0x724: 0x0040, 0x725: 0x0040, 0x726: 0x0008, 0x727: 0x0008, 0x728: 0x0008, 0x729: 0x0008, 0x72a: 0x0008, 0x72b: 0x0008, 0x72c: 0x0008, 0x72d: 0x0008, 0x72e: 0x0008, 0x72f: 0x0008, 0x730: 0x0018, 0x731: 0x0018, 0x732: 0x0040, 0x733: 0x0040, 0x734: 0x0040, 0x735: 0x0040, 0x736: 0x0040, 0x737: 0x0040, 0x738: 0x0040, 0x739: 0x0008, 0x73a: 0x3308, 0x73b: 0x3308, 0x73c: 0x3308, 0x73d: 0x3308, 0x73e: 0x3308, 0x73f: 0x3308, // Block 0x1d, offset 0x740 0x740: 0x0040, 0x741: 0x3308, 0x742: 0x3008, 0x743: 0x3008, 0x744: 0x0040, 0x745: 0x0008, 0x746: 0x0008, 0x747: 0x0008, 0x748: 0x0008, 0x749: 0x0008, 0x74a: 0x0008, 0x74b: 0x0008, 0x74c: 0x0008, 0x74d: 0x0040, 0x74e: 0x0040, 0x74f: 0x0008, 0x750: 0x0008, 0x751: 0x0040, 0x752: 0x0040, 0x753: 0x0008, 0x754: 0x0008, 0x755: 0x0008, 0x756: 0x0008, 0x757: 0x0008, 0x758: 0x0008, 0x759: 0x0008, 0x75a: 0x0008, 0x75b: 0x0008, 0x75c: 0x0008, 0x75d: 0x0008, 0x75e: 0x0008, 0x75f: 0x0008, 0x760: 0x0008, 0x761: 0x0008, 0x762: 0x0008, 0x763: 0x0008, 0x764: 0x0008, 0x765: 0x0008, 0x766: 0x0008, 0x767: 0x0008, 0x768: 0x0008, 0x769: 0x0040, 0x76a: 0x0008, 0x76b: 0x0008, 0x76c: 0x0008, 0x76d: 0x0008, 0x76e: 0x0008, 0x76f: 0x0008, 0x770: 0x0008, 0x771: 0x0040, 0x772: 0x0008, 0x773: 0x0008, 0x774: 0x0040, 0x775: 0x0008, 0x776: 0x0008, 0x777: 0x0008, 0x778: 0x0008, 0x779: 0x0008, 0x77a: 0x0040, 0x77b: 0x0040, 0x77c: 0x3308, 0x77d: 0x0008, 0x77e: 0x3008, 0x77f: 0x3308, // Block 0x1e, offset 0x780 0x780: 0x3008, 0x781: 0x3308, 0x782: 0x3308, 0x783: 0x3308, 0x784: 0x3308, 0x785: 0x0040, 0x786: 0x0040, 0x787: 0x3008, 0x788: 0x3008, 0x789: 0x0040, 0x78a: 0x0040, 0x78b: 0x3008, 0x78c: 0x3008, 0x78d: 0x3b08, 0x78e: 0x0040, 0x78f: 0x0040, 0x790: 0x0040, 0x791: 0x0040, 0x792: 0x0040, 0x793: 0x0040, 0x794: 0x0040, 0x795: 0x0040, 0x796: 0x3308, 0x797: 0x3008, 0x798: 0x0040, 0x799: 0x0040, 0x79a: 0x0040, 0x79b: 0x0040, 0x79c: 0x0881, 0x79d: 0x08b9, 0x79e: 0x0040, 0x79f: 0x0008, 0x7a0: 0x0008, 0x7a1: 0x0008, 0x7a2: 0x3308, 0x7a3: 0x3308, 0x7a4: 0x0040, 0x7a5: 0x0040, 0x7a6: 0x0008, 0x7a7: 0x0008, 0x7a8: 0x0008, 0x7a9: 0x0008, 0x7aa: 0x0008, 0x7ab: 0x0008, 0x7ac: 0x0008, 0x7ad: 0x0008, 0x7ae: 0x0008, 0x7af: 0x0008, 0x7b0: 0x0018, 0x7b1: 0x0008, 0x7b2: 0x0018, 0x7b3: 0x0018, 0x7b4: 0x0018, 0x7b5: 0x0018, 0x7b6: 0x0018, 0x7b7: 0x0018, 0x7b8: 0x0040, 0x7b9: 0x0040, 0x7ba: 0x0040, 0x7bb: 0x0040, 0x7bc: 0x0040, 0x7bd: 0x0040, 0x7be: 0x0040, 0x7bf: 0x0040, // Block 0x1f, offset 0x7c0 0x7c0: 0x0040, 0x7c1: 0x0040, 0x7c2: 0x3308, 0x7c3: 0x0008, 0x7c4: 0x0040, 0x7c5: 0x0008, 0x7c6: 0x0008, 0x7c7: 0x0008, 0x7c8: 0x0008, 0x7c9: 0x0008, 0x7ca: 0x0008, 0x7cb: 0x0040, 0x7cc: 0x0040, 0x7cd: 0x0040, 0x7ce: 0x0008, 0x7cf: 0x0008, 0x7d0: 0x0008, 0x7d1: 0x0040, 0x7d2: 0x0008, 0x7d3: 0x0008, 0x7d4: 0x0008, 0x7d5: 0x0008, 0x7d6: 0x0040, 0x7d7: 0x0040, 0x7d8: 0x0040, 0x7d9: 0x0008, 0x7da: 0x0008, 0x7db: 0x0040, 0x7dc: 0x0008, 0x7dd: 0x0040, 0x7de: 0x0008, 0x7df: 0x0008, 0x7e0: 0x0040, 0x7e1: 0x0040, 0x7e2: 0x0040, 0x7e3: 0x0008, 0x7e4: 0x0008, 0x7e5: 0x0040, 0x7e6: 0x0040, 0x7e7: 0x0040, 0x7e8: 0x0008, 0x7e9: 0x0008, 0x7ea: 0x0008, 0x7eb: 0x0040, 0x7ec: 0x0040, 0x7ed: 0x0040, 0x7ee: 0x0008, 0x7ef: 0x0008, 0x7f0: 0x0008, 0x7f1: 0x0008, 0x7f2: 0x0008, 0x7f3: 0x0008, 0x7f4: 0x0008, 0x7f5: 0x0008, 0x7f6: 0x0008, 0x7f7: 0x0008, 0x7f8: 0x0008, 0x7f9: 0x0008, 0x7fa: 0x0040, 0x7fb: 0x0040, 0x7fc: 0x0040, 0x7fd: 0x0040, 0x7fe: 0x3008, 0x7ff: 0x3008, // Block 0x20, offset 0x800 0x800: 0x3308, 0x801: 0x3008, 0x802: 0x3008, 0x803: 0x3008, 0x804: 0x3008, 0x805: 0x0040, 0x806: 0x3308, 0x807: 0x3308, 0x808: 0x3308, 0x809: 0x0040, 0x80a: 0x3308, 0x80b: 0x3308, 0x80c: 0x3308, 0x80d: 0x3b08, 0x80e: 0x0040, 0x80f: 0x0040, 0x810: 0x0040, 0x811: 0x0040, 0x812: 0x0040, 0x813: 0x0040, 0x814: 0x0040, 0x815: 0x3308, 0x816: 0x3308, 0x817: 0x0040, 0x818: 0x0008, 0x819: 0x0008, 0x81a: 0x0008, 0x81b: 0x0040, 0x81c: 0x0040, 0x81d: 0x0040, 0x81e: 0x0040, 0x81f: 0x0040, 0x820: 0x0008, 0x821: 0x0008, 0x822: 0x3308, 0x823: 0x3308, 0x824: 0x0040, 0x825: 0x0040, 0x826: 0x0008, 0x827: 0x0008, 0x828: 0x0008, 0x829: 0x0008, 0x82a: 0x0008, 0x82b: 0x0008, 0x82c: 0x0008, 0x82d: 0x0008, 0x82e: 0x0008, 0x82f: 0x0008, 0x830: 0x0040, 0x831: 0x0040, 0x832: 0x0040, 0x833: 0x0040, 0x834: 0x0040, 0x835: 0x0040, 0x836: 0x0040, 0x837: 0x0040, 0x838: 0x0018, 0x839: 0x0018, 0x83a: 0x0018, 0x83b: 0x0018, 0x83c: 0x0018, 0x83d: 0x0018, 0x83e: 0x0018, 0x83f: 0x0018, // Block 0x21, offset 0x840 0x840: 0x0008, 0x841: 0x3308, 0x842: 0x3008, 0x843: 0x3008, 0x844: 0x0040, 0x845: 0x0008, 0x846: 0x0008, 0x847: 0x0008, 0x848: 0x0008, 0x849: 0x0008, 0x84a: 0x0008, 0x84b: 0x0008, 0x84c: 0x0008, 0x84d: 0x0040, 0x84e: 0x0008, 0x84f: 0x0008, 0x850: 0x0008, 0x851: 0x0040, 0x852: 0x0008, 0x853: 0x0008, 0x854: 0x0008, 0x855: 0x0008, 0x856: 0x0008, 0x857: 0x0008, 0x858: 0x0008, 0x859: 0x0008, 0x85a: 0x0008, 0x85b: 0x0008, 0x85c: 0x0008, 0x85d: 0x0008, 0x85e: 0x0008, 0x85f: 0x0008, 0x860: 0x0008, 0x861: 0x0008, 0x862: 0x0008, 0x863: 0x0008, 0x864: 0x0008, 0x865: 0x0008, 0x866: 0x0008, 0x867: 0x0008, 0x868: 0x0008, 0x869: 0x0040, 0x86a: 0x0008, 0x86b: 0x0008, 0x86c: 0x0008, 0x86d: 0x0008, 0x86e: 0x0008, 0x86f: 0x0008, 0x870: 0x0008, 0x871: 0x0008, 0x872: 0x0008, 0x873: 0x0008, 0x874: 0x0040, 0x875: 0x0008, 0x876: 0x0008, 0x877: 0x0008, 0x878: 0x0008, 0x879: 0x0008, 0x87a: 0x0040, 0x87b: 0x0040, 0x87c: 0x3308, 0x87d: 0x0008, 0x87e: 0x3008, 0x87f: 0x3308, // Block 0x22, offset 0x880 0x880: 0x3008, 0x881: 0x3008, 0x882: 0x3008, 0x883: 0x3008, 0x884: 0x3008, 0x885: 0x0040, 0x886: 0x3308, 0x887: 0x3008, 0x888: 0x3008, 0x889: 0x0040, 0x88a: 0x3008, 0x88b: 0x3008, 0x88c: 0x3308, 0x88d: 0x3b08, 0x88e: 0x0040, 0x88f: 0x0040, 0x890: 0x0040, 0x891: 0x0040, 0x892: 0x0040, 0x893: 0x0040, 0x894: 0x0040, 0x895: 0x3008, 0x896: 0x3008, 0x897: 0x0040, 0x898: 0x0040, 0x899: 0x0040, 0x89a: 0x0040, 0x89b: 0x0040, 0x89c: 0x0040, 0x89d: 0x0040, 0x89e: 0x0008, 0x89f: 0x0040, 0x8a0: 0x0008, 0x8a1: 0x0008, 0x8a2: 0x3308, 0x8a3: 0x3308, 0x8a4: 0x0040, 0x8a5: 0x0040, 0x8a6: 0x0008, 0x8a7: 0x0008, 0x8a8: 0x0008, 0x8a9: 0x0008, 0x8aa: 0x0008, 0x8ab: 0x0008, 0x8ac: 0x0008, 0x8ad: 0x0008, 0x8ae: 0x0008, 0x8af: 0x0008, 0x8b0: 0x0040, 0x8b1: 0x0008, 0x8b2: 0x0008, 0x8b3: 0x0040, 0x8b4: 0x0040, 0x8b5: 0x0040, 0x8b6: 0x0040, 0x8b7: 0x0040, 0x8b8: 0x0040, 0x8b9: 0x0040, 0x8ba: 0x0040, 0x8bb: 0x0040, 0x8bc: 0x0040, 0x8bd: 0x0040, 0x8be: 0x0040, 0x8bf: 0x0040, // Block 0x23, offset 0x8c0 0x8c0: 0x3008, 0x8c1: 0x3308, 0x8c2: 0x3308, 0x8c3: 0x3308, 0x8c4: 0x3308, 0x8c5: 0x0040, 0x8c6: 0x3008, 0x8c7: 0x3008, 0x8c8: 0x3008, 0x8c9: 0x0040, 0x8ca: 0x3008, 0x8cb: 0x3008, 0x8cc: 0x3008, 0x8cd: 0x3b08, 0x8ce: 0x0008, 0x8cf: 0x0018, 0x8d0: 0x0040, 0x8d1: 0x0040, 0x8d2: 0x0040, 0x8d3: 0x0040, 0x8d4: 0x0008, 0x8d5: 0x0008, 0x8d6: 0x0008, 0x8d7: 0x3008, 0x8d8: 0x0018, 0x8d9: 0x0018, 0x8da: 0x0018, 0x8db: 0x0018, 0x8dc: 0x0018, 0x8dd: 0x0018, 0x8de: 0x0018, 0x8df: 0x0008, 0x8e0: 0x0008, 0x8e1: 0x0008, 0x8e2: 0x3308, 0x8e3: 0x3308, 0x8e4: 0x0040, 0x8e5: 0x0040, 0x8e6: 0x0008, 0x8e7: 0x0008, 0x8e8: 0x0008, 0x8e9: 0x0008, 0x8ea: 0x0008, 0x8eb: 0x0008, 0x8ec: 0x0008, 0x8ed: 0x0008, 0x8ee: 0x0008, 0x8ef: 0x0008, 0x8f0: 0x0018, 0x8f1: 0x0018, 0x8f2: 0x0018, 0x8f3: 0x0018, 0x8f4: 0x0018, 0x8f5: 0x0018, 0x8f6: 0x0018, 0x8f7: 0x0018, 0x8f8: 0x0018, 0x8f9: 0x0018, 0x8fa: 0x0008, 0x8fb: 0x0008, 0x8fc: 0x0008, 0x8fd: 0x0008, 0x8fe: 0x0008, 0x8ff: 0x0008, // Block 0x24, offset 0x900 0x900: 0x0040, 0x901: 0x0008, 0x902: 0x0008, 0x903: 0x0040, 0x904: 0x0008, 0x905: 0x0040, 0x906: 0x0040, 0x907: 0x0008, 0x908: 0x0008, 0x909: 0x0040, 0x90a: 0x0008, 0x90b: 0x0040, 0x90c: 0x0040, 0x90d: 0x0008, 0x90e: 0x0040, 0x90f: 0x0040, 0x910: 0x0040, 0x911: 0x0040, 0x912: 0x0040, 0x913: 0x0040, 0x914: 0x0008, 0x915: 0x0008, 0x916: 0x0008, 0x917: 0x0008, 0x918: 0x0040, 0x919: 0x0008, 0x91a: 0x0008, 0x91b: 0x0008, 0x91c: 0x0008, 0x91d: 0x0008, 0x91e: 0x0008, 0x91f: 0x0008, 0x920: 0x0040, 0x921: 0x0008, 0x922: 0x0008, 0x923: 0x0008, 0x924: 0x0040, 0x925: 0x0008, 0x926: 0x0040, 0x927: 0x0008, 0x928: 0x0040, 0x929: 0x0040, 0x92a: 0x0008, 0x92b: 0x0008, 0x92c: 0x0040, 0x92d: 0x0008, 0x92e: 0x0008, 0x92f: 0x0008, 0x930: 0x0008, 0x931: 0x3308, 0x932: 0x0008, 0x933: 0x0929, 0x934: 0x3308, 0x935: 0x3308, 0x936: 0x3308, 0x937: 0x3308, 0x938: 0x3308, 0x939: 0x3308, 0x93a: 0x0040, 0x93b: 0x3308, 0x93c: 0x3308, 0x93d: 0x0008, 0x93e: 0x0040, 0x93f: 0x0040, // Block 0x25, offset 0x940 0x940: 0x0008, 0x941: 0x0008, 0x942: 0x0008, 0x943: 0x09d1, 0x944: 0x0008, 0x945: 0x0008, 0x946: 0x0008, 0x947: 0x0008, 0x948: 0x0040, 0x949: 0x0008, 0x94a: 0x0008, 0x94b: 0x0008, 0x94c: 0x0008, 0x94d: 0x0a09, 0x94e: 0x0008, 0x94f: 0x0008, 0x950: 0x0008, 0x951: 0x0008, 0x952: 0x0a41, 0x953: 0x0008, 0x954: 0x0008, 0x955: 0x0008, 0x956: 0x0008, 0x957: 0x0a79, 0x958: 0x0008, 0x959: 0x0008, 0x95a: 0x0008, 0x95b: 0x0008, 0x95c: 0x0ab1, 0x95d: 0x0008, 0x95e: 0x0008, 0x95f: 0x0008, 0x960: 0x0008, 0x961: 0x0008, 0x962: 0x0008, 0x963: 0x0008, 0x964: 0x0008, 0x965: 0x0008, 0x966: 0x0008, 0x967: 0x0008, 0x968: 0x0008, 0x969: 0x0ae9, 0x96a: 0x0008, 0x96b: 0x0008, 0x96c: 0x0008, 0x96d: 0x0040, 0x96e: 0x0040, 0x96f: 0x0040, 0x970: 0x0040, 0x971: 0x3308, 0x972: 0x3308, 0x973: 0x0b21, 0x974: 0x3308, 0x975: 0x0b59, 0x976: 0x0b91, 0x977: 0x0bc9, 0x978: 0x0c19, 0x979: 0x0c51, 0x97a: 0x3308, 0x97b: 0x3308, 0x97c: 0x3308, 0x97d: 0x3308, 0x97e: 0x3308, 0x97f: 0x3008, // Block 0x26, offset 0x980 0x980: 0x3308, 0x981: 0x0ca1, 0x982: 0x3308, 0x983: 0x3308, 0x984: 0x3b08, 0x985: 0x0018, 0x986: 0x3308, 0x987: 0x3308, 0x988: 0x0008, 0x989: 0x0008, 0x98a: 0x0008, 0x98b: 0x0008, 0x98c: 0x0008, 0x98d: 0x3308, 0x98e: 0x3308, 0x98f: 0x3308, 0x990: 0x3308, 0x991: 0x3308, 0x992: 0x3308, 0x993: 0x0cd9, 0x994: 0x3308, 0x995: 0x3308, 0x996: 0x3308, 0x997: 0x3308, 0x998: 0x0040, 0x999: 0x3308, 0x99a: 0x3308, 0x99b: 0x3308, 0x99c: 0x3308, 0x99d: 0x0d11, 0x99e: 0x3308, 0x99f: 0x3308, 0x9a0: 0x3308, 0x9a1: 0x3308, 0x9a2: 0x0d49, 0x9a3: 0x3308, 0x9a4: 0x3308, 0x9a5: 0x3308, 0x9a6: 0x3308, 0x9a7: 0x0d81, 0x9a8: 0x3308, 0x9a9: 0x3308, 0x9aa: 0x3308, 0x9ab: 0x3308, 0x9ac: 0x0db9, 0x9ad: 0x3308, 0x9ae: 0x3308, 0x9af: 0x3308, 0x9b0: 0x3308, 0x9b1: 0x3308, 0x9b2: 0x3308, 0x9b3: 0x3308, 0x9b4: 0x3308, 0x9b5: 0x3308, 0x9b6: 0x3308, 0x9b7: 0x3308, 0x9b8: 0x3308, 0x9b9: 0x0df1, 0x9ba: 0x3308, 0x9bb: 0x3308, 0x9bc: 0x3308, 0x9bd: 0x0040, 0x9be: 0x0018, 0x9bf: 0x0018, // Block 0x27, offset 0x9c0 0x9c0: 0x0008, 0x9c1: 0x0008, 0x9c2: 0x0008, 0x9c3: 0x0008, 0x9c4: 0x0008, 0x9c5: 0x0008, 0x9c6: 0x0008, 0x9c7: 0x0008, 0x9c8: 0x0008, 0x9c9: 0x0008, 0x9ca: 0x0008, 0x9cb: 0x0008, 0x9cc: 0x0008, 0x9cd: 0x0008, 0x9ce: 0x0008, 0x9cf: 0x0008, 0x9d0: 0x0008, 0x9d1: 0x0008, 0x9d2: 0x0008, 0x9d3: 0x0008, 0x9d4: 0x0008, 0x9d5: 0x0008, 0x9d6: 0x0008, 0x9d7: 0x0008, 0x9d8: 0x0008, 0x9d9: 0x0008, 0x9da: 0x0008, 0x9db: 0x0008, 0x9dc: 0x0008, 0x9dd: 0x0008, 0x9de: 0x0008, 0x9df: 0x0008, 0x9e0: 0x0008, 0x9e1: 0x0008, 0x9e2: 0x0008, 0x9e3: 0x0008, 0x9e4: 0x0008, 0x9e5: 0x0008, 0x9e6: 0x0008, 0x9e7: 0x0008, 0x9e8: 0x0008, 0x9e9: 0x0008, 0x9ea: 0x0008, 0x9eb: 0x0008, 0x9ec: 0x0039, 0x9ed: 0x0ed1, 0x9ee: 0x0ee9, 0x9ef: 0x0008, 0x9f0: 0x0ef9, 0x9f1: 0x0f09, 0x9f2: 0x0f19, 0x9f3: 0x0f31, 0x9f4: 0x0249, 0x9f5: 0x0f41, 0x9f6: 0x0259, 0x9f7: 0x0f51, 0x9f8: 0x0359, 0x9f9: 0x0f61, 0x9fa: 0x0f71, 0x9fb: 0x0008, 0x9fc: 0x00d9, 0x9fd: 0x0f81, 0x9fe: 0x0f99, 0x9ff: 0x0269, // Block 0x28, offset 0xa00 0xa00: 0x0fa9, 0xa01: 0x0fb9, 0xa02: 0x0279, 0xa03: 0x0039, 0xa04: 0x0fc9, 0xa05: 0x0fe1, 0xa06: 0x059d, 0xa07: 0x0ee9, 0xa08: 0x0ef9, 0xa09: 0x0f09, 0xa0a: 0x0ff9, 0xa0b: 0x1011, 0xa0c: 0x1029, 0xa0d: 0x0f31, 0xa0e: 0x0008, 0xa0f: 0x0f51, 0xa10: 0x0f61, 0xa11: 0x1041, 0xa12: 0x00d9, 0xa13: 0x1059, 0xa14: 0x05b5, 0xa15: 0x05b5, 0xa16: 0x0f99, 0xa17: 0x0fa9, 0xa18: 0x0fb9, 0xa19: 0x059d, 0xa1a: 0x1071, 0xa1b: 0x1089, 0xa1c: 0x05cd, 0xa1d: 0x1099, 0xa1e: 0x10b1, 0xa1f: 0x10c9, 0xa20: 0x10e1, 0xa21: 0x10f9, 0xa22: 0x0f41, 0xa23: 0x0269, 0xa24: 0x0fb9, 0xa25: 0x1089, 0xa26: 0x1099, 0xa27: 0x10b1, 0xa28: 0x1111, 0xa29: 0x10e1, 0xa2a: 0x10f9, 0xa2b: 0x0008, 0xa2c: 0x0008, 0xa2d: 0x0008, 0xa2e: 0x0008, 0xa2f: 0x0008, 0xa30: 0x0008, 0xa31: 0x0008, 0xa32: 0x0008, 0xa33: 0x0008, 0xa34: 0x0008, 0xa35: 0x0008, 0xa36: 0x0008, 0xa37: 0x0008, 0xa38: 0x1129, 0xa39: 0x0008, 0xa3a: 0x0008, 0xa3b: 0x0008, 0xa3c: 0x0008, 0xa3d: 0x0008, 0xa3e: 0x0008, 0xa3f: 0x0008, // Block 0x29, offset 0xa40 0xa40: 0x0008, 0xa41: 0x0008, 0xa42: 0x0008, 0xa43: 0x0008, 0xa44: 0x0008, 0xa45: 0x0008, 0xa46: 0x0008, 0xa47: 0x0008, 0xa48: 0x0008, 0xa49: 0x0008, 0xa4a: 0x0008, 0xa4b: 0x0008, 0xa4c: 0x0008, 0xa4d: 0x0008, 0xa4e: 0x0008, 0xa4f: 0x0008, 0xa50: 0x0008, 0xa51: 0x0008, 0xa52: 0x0008, 0xa53: 0x0008, 0xa54: 0x0008, 0xa55: 0x0008, 0xa56: 0x0008, 0xa57: 0x0008, 0xa58: 0x0008, 0xa59: 0x0008, 0xa5a: 0x0008, 0xa5b: 0x1141, 0xa5c: 0x1159, 0xa5d: 0x1169, 0xa5e: 0x1181, 0xa5f: 0x1029, 0xa60: 0x1199, 0xa61: 0x11a9, 0xa62: 0x11c1, 0xa63: 0x11d9, 0xa64: 0x11f1, 0xa65: 0x1209, 0xa66: 0x1221, 0xa67: 0x05e5, 0xa68: 0x1239, 0xa69: 0x1251, 0xa6a: 0xe17d, 0xa6b: 0x1269, 0xa6c: 0x1281, 0xa6d: 0x1299, 0xa6e: 0x12b1, 0xa6f: 0x12c9, 0xa70: 0x12e1, 0xa71: 0x12f9, 0xa72: 0x1311, 0xa73: 0x1329, 0xa74: 0x1341, 0xa75: 0x1359, 0xa76: 0x1371, 0xa77: 0x1389, 0xa78: 0x05fd, 0xa79: 0x13a1, 0xa7a: 0x13b9, 0xa7b: 0x13d1, 0xa7c: 0x13e1, 0xa7d: 0x13f9, 0xa7e: 0x1411, 0xa7f: 0x1429, // Block 0x2a, offset 0xa80 0xa80: 0xe00d, 0xa81: 0x0008, 0xa82: 0xe00d, 0xa83: 0x0008, 0xa84: 0xe00d, 0xa85: 0x0008, 0xa86: 0xe00d, 0xa87: 0x0008, 0xa88: 0xe00d, 0xa89: 0x0008, 0xa8a: 0xe00d, 0xa8b: 0x0008, 0xa8c: 0xe00d, 0xa8d: 0x0008, 0xa8e: 0xe00d, 0xa8f: 0x0008, 0xa90: 0xe00d, 0xa91: 0x0008, 0xa92: 0xe00d, 0xa93: 0x0008, 0xa94: 0xe00d, 0xa95: 0x0008, 0xa96: 0xe00d, 0xa97: 0x0008, 0xa98: 0xe00d, 0xa99: 0x0008, 0xa9a: 0xe00d, 0xa9b: 0x0008, 0xa9c: 0xe00d, 0xa9d: 0x0008, 0xa9e: 0xe00d, 0xa9f: 0x0008, 0xaa0: 0xe00d, 0xaa1: 0x0008, 0xaa2: 0xe00d, 0xaa3: 0x0008, 0xaa4: 0xe00d, 0xaa5: 0x0008, 0xaa6: 0xe00d, 0xaa7: 0x0008, 0xaa8: 0xe00d, 0xaa9: 0x0008, 0xaaa: 0xe00d, 0xaab: 0x0008, 0xaac: 0xe00d, 0xaad: 0x0008, 0xaae: 0xe00d, 0xaaf: 0x0008, 0xab0: 0xe00d, 0xab1: 0x0008, 0xab2: 0xe00d, 0xab3: 0x0008, 0xab4: 0xe00d, 0xab5: 0x0008, 0xab6: 0xe00d, 0xab7: 0x0008, 0xab8: 0xe00d, 0xab9: 0x0008, 0xaba: 0xe00d, 0xabb: 0x0008, 0xabc: 0xe00d, 0xabd: 0x0008, 0xabe: 0xe00d, 0xabf: 0x0008, // Block 0x2b, offset 0xac0 0xac0: 0xe00d, 0xac1: 0x0008, 0xac2: 0xe00d, 0xac3: 0x0008, 0xac4: 0xe00d, 0xac5: 0x0008, 0xac6: 0xe00d, 0xac7: 0x0008, 0xac8: 0xe00d, 0xac9: 0x0008, 0xaca: 0xe00d, 0xacb: 0x0008, 0xacc: 0xe00d, 0xacd: 0x0008, 0xace: 0xe00d, 0xacf: 0x0008, 0xad0: 0xe00d, 0xad1: 0x0008, 0xad2: 0xe00d, 0xad3: 0x0008, 0xad4: 0xe00d, 0xad5: 0x0008, 0xad6: 0x0008, 0xad7: 0x0008, 0xad8: 0x0008, 0xad9: 0x0008, 0xada: 0x0615, 0xadb: 0x0635, 0xadc: 0x0008, 0xadd: 0x0008, 0xade: 0x1441, 0xadf: 0x0008, 0xae0: 0xe00d, 0xae1: 0x0008, 0xae2: 0xe00d, 0xae3: 0x0008, 0xae4: 0xe00d, 0xae5: 0x0008, 0xae6: 0xe00d, 0xae7: 0x0008, 0xae8: 0xe00d, 0xae9: 0x0008, 0xaea: 0xe00d, 0xaeb: 0x0008, 0xaec: 0xe00d, 0xaed: 0x0008, 0xaee: 0xe00d, 0xaef: 0x0008, 0xaf0: 0xe00d, 0xaf1: 0x0008, 0xaf2: 0xe00d, 0xaf3: 0x0008, 0xaf4: 0xe00d, 0xaf5: 0x0008, 0xaf6: 0xe00d, 0xaf7: 0x0008, 0xaf8: 0xe00d, 0xaf9: 0x0008, 0xafa: 0xe00d, 0xafb: 0x0008, 0xafc: 0xe00d, 0xafd: 0x0008, 0xafe: 0xe00d, 0xaff: 0x0008, // Block 0x2c, offset 0xb00 0xb00: 0x0008, 0xb01: 0x0008, 0xb02: 0x0008, 0xb03: 0x0008, 0xb04: 0x0008, 0xb05: 0x0008, 0xb06: 0x0040, 0xb07: 0x0040, 0xb08: 0xe045, 0xb09: 0xe045, 0xb0a: 0xe045, 0xb0b: 0xe045, 0xb0c: 0xe045, 0xb0d: 0xe045, 0xb0e: 0x0040, 0xb0f: 0x0040, 0xb10: 0x0008, 0xb11: 0x0008, 0xb12: 0x0008, 0xb13: 0x0008, 0xb14: 0x0008, 0xb15: 0x0008, 0xb16: 0x0008, 0xb17: 0x0008, 0xb18: 0x0040, 0xb19: 0xe045, 0xb1a: 0x0040, 0xb1b: 0xe045, 0xb1c: 0x0040, 0xb1d: 0xe045, 0xb1e: 0x0040, 0xb1f: 0xe045, 0xb20: 0x0008, 0xb21: 0x0008, 0xb22: 0x0008, 0xb23: 0x0008, 0xb24: 0x0008, 0xb25: 0x0008, 0xb26: 0x0008, 0xb27: 0x0008, 0xb28: 0xe045, 0xb29: 0xe045, 0xb2a: 0xe045, 0xb2b: 0xe045, 0xb2c: 0xe045, 0xb2d: 0xe045, 0xb2e: 0xe045, 0xb2f: 0xe045, 0xb30: 0x0008, 0xb31: 0x1459, 0xb32: 0x0008, 0xb33: 0x1471, 0xb34: 0x0008, 0xb35: 0x1489, 0xb36: 0x0008, 0xb37: 0x14a1, 0xb38: 0x0008, 0xb39: 0x14b9, 0xb3a: 0x0008, 0xb3b: 0x14d1, 0xb3c: 0x0008, 0xb3d: 0x14e9, 0xb3e: 0x0040, 0xb3f: 0x0040, // Block 0x2d, offset 0xb40 0xb40: 0x1501, 0xb41: 0x1531, 0xb42: 0x1561, 0xb43: 0x1591, 0xb44: 0x15c1, 0xb45: 0x15f1, 0xb46: 0x1621, 0xb47: 0x1651, 0xb48: 0x1501, 0xb49: 0x1531, 0xb4a: 0x1561, 0xb4b: 0x1591, 0xb4c: 0x15c1, 0xb4d: 0x15f1, 0xb4e: 0x1621, 0xb4f: 0x1651, 0xb50: 0x1681, 0xb51: 0x16b1, 0xb52: 0x16e1, 0xb53: 0x1711, 0xb54: 0x1741, 0xb55: 0x1771, 0xb56: 0x17a1, 0xb57: 0x17d1, 0xb58: 0x1681, 0xb59: 0x16b1, 0xb5a: 0x16e1, 0xb5b: 0x1711, 0xb5c: 0x1741, 0xb5d: 0x1771, 0xb5e: 0x17a1, 0xb5f: 0x17d1, 0xb60: 0x1801, 0xb61: 0x1831, 0xb62: 0x1861, 0xb63: 0x1891, 0xb64: 0x18c1, 0xb65: 0x18f1, 0xb66: 0x1921, 0xb67: 0x1951, 0xb68: 0x1801, 0xb69: 0x1831, 0xb6a: 0x1861, 0xb6b: 0x1891, 0xb6c: 0x18c1, 0xb6d: 0x18f1, 0xb6e: 0x1921, 0xb6f: 0x1951, 0xb70: 0x0008, 0xb71: 0x0008, 0xb72: 0x1981, 0xb73: 0x19b1, 0xb74: 0x19d9, 0xb75: 0x0040, 0xb76: 0x0008, 0xb77: 0x1a01, 0xb78: 0xe045, 0xb79: 0xe045, 0xb7a: 0x064d, 0xb7b: 0x1459, 0xb7c: 0x19b1, 0xb7d: 0x0666, 0xb7e: 0x1a31, 0xb7f: 0x0686, // Block 0x2e, offset 0xb80 0xb80: 0x06a6, 0xb81: 0x1a4a, 0xb82: 0x1a79, 0xb83: 0x1aa9, 0xb84: 0x1ad1, 0xb85: 0x0040, 0xb86: 0x0008, 0xb87: 0x1af9, 0xb88: 0x06c5, 0xb89: 0x1471, 0xb8a: 0x06dd, 0xb8b: 0x1489, 0xb8c: 0x1aa9, 0xb8d: 0x1b2a, 0xb8e: 0x1b5a, 0xb8f: 0x1b8a, 0xb90: 0x0008, 0xb91: 0x0008, 0xb92: 0x0008, 0xb93: 0x1bb9, 0xb94: 0x0040, 0xb95: 0x0040, 0xb96: 0x0008, 0xb97: 0x0008, 0xb98: 0xe045, 0xb99: 0xe045, 0xb9a: 0x06f5, 0xb9b: 0x14a1, 0xb9c: 0x0040, 0xb9d: 0x1bd2, 0xb9e: 0x1c02, 0xb9f: 0x1c32, 0xba0: 0x0008, 0xba1: 0x0008, 0xba2: 0x0008, 0xba3: 0x1c61, 0xba4: 0x0008, 0xba5: 0x0008, 0xba6: 0x0008, 0xba7: 0x0008, 0xba8: 0xe045, 0xba9: 0xe045, 0xbaa: 0x070d, 0xbab: 0x14d1, 0xbac: 0xe04d, 0xbad: 0x1c7a, 0xbae: 0x03d2, 0xbaf: 0x1caa, 0xbb0: 0x0040, 0xbb1: 0x0040, 0xbb2: 0x1cb9, 0xbb3: 0x1ce9, 0xbb4: 0x1d11, 0xbb5: 0x0040, 0xbb6: 0x0008, 0xbb7: 0x1d39, 0xbb8: 0x0725, 0xbb9: 0x14b9, 0xbba: 0x0515, 0xbbb: 0x14e9, 0xbbc: 0x1ce9, 0xbbd: 0x073e, 0xbbe: 0x075e, 0xbbf: 0x0040, // Block 0x2f, offset 0xbc0 0xbc0: 0x000a, 0xbc1: 0x000a, 0xbc2: 0x000a, 0xbc3: 0x000a, 0xbc4: 0x000a, 0xbc5: 0x000a, 0xbc6: 0x000a, 0xbc7: 0x000a, 0xbc8: 0x000a, 0xbc9: 0x000a, 0xbca: 0x000a, 0xbcb: 0x03c0, 0xbcc: 0x0003, 0xbcd: 0x0003, 0xbce: 0x0340, 0xbcf: 0x0b40, 0xbd0: 0x0018, 0xbd1: 0xe00d, 0xbd2: 0x0018, 0xbd3: 0x0018, 0xbd4: 0x0018, 0xbd5: 0x0018, 0xbd6: 0x0018, 0xbd7: 0x077e, 0xbd8: 0x0018, 0xbd9: 0x0018, 0xbda: 0x0018, 0xbdb: 0x0018, 0xbdc: 0x0018, 0xbdd: 0x0018, 0xbde: 0x0018, 0xbdf: 0x0018, 0xbe0: 0x0018, 0xbe1: 0x0018, 0xbe2: 0x0018, 0xbe3: 0x0018, 0xbe4: 0x0040, 0xbe5: 0x0040, 0xbe6: 0x0040, 0xbe7: 0x0018, 0xbe8: 0x0040, 0xbe9: 0x0040, 0xbea: 0x0340, 0xbeb: 0x0340, 0xbec: 0x0340, 0xbed: 0x0340, 0xbee: 0x0340, 0xbef: 0x000a, 0xbf0: 0x0018, 0xbf1: 0x0018, 0xbf2: 0x0018, 0xbf3: 0x1d69, 0xbf4: 0x1da1, 0xbf5: 0x0018, 0xbf6: 0x1df1, 0xbf7: 0x1e29, 0xbf8: 0x0018, 0xbf9: 0x0018, 0xbfa: 0x0018, 0xbfb: 0x0018, 0xbfc: 0x1e7a, 0xbfd: 0x0018, 0xbfe: 0x079e, 0xbff: 0x0018, // Block 0x30, offset 0xc00 0xc00: 0x0018, 0xc01: 0x0018, 0xc02: 0x0018, 0xc03: 0x0018, 0xc04: 0x0018, 0xc05: 0x0018, 0xc06: 0x0018, 0xc07: 0x1e92, 0xc08: 0x1eaa, 0xc09: 0x1ec2, 0xc0a: 0x0018, 0xc0b: 0x0018, 0xc0c: 0x0018, 0xc0d: 0x0018, 0xc0e: 0x0018, 0xc0f: 0x0018, 0xc10: 0x0018, 0xc11: 0x0018, 0xc12: 0x0018, 0xc13: 0x0018, 0xc14: 0x0018, 0xc15: 0x0018, 0xc16: 0x0018, 0xc17: 0x1ed9, 0xc18: 0x0018, 0xc19: 0x0018, 0xc1a: 0x0018, 0xc1b: 0x0018, 0xc1c: 0x0018, 0xc1d: 0x0018, 0xc1e: 0x0018, 0xc1f: 0x000a, 0xc20: 0x03c0, 0xc21: 0x0340, 0xc22: 0x0340, 0xc23: 0x0340, 0xc24: 0x03c0, 0xc25: 0x0040, 0xc26: 0x0040, 0xc27: 0x0040, 0xc28: 0x0040, 0xc29: 0x0040, 0xc2a: 0x0340, 0xc2b: 0x0340, 0xc2c: 0x0340, 0xc2d: 0x0340, 0xc2e: 0x0340, 0xc2f: 0x0340, 0xc30: 0x1f41, 0xc31: 0x0f41, 0xc32: 0x0040, 0xc33: 0x0040, 0xc34: 0x1f51, 0xc35: 0x1f61, 0xc36: 0x1f71, 0xc37: 0x1f81, 0xc38: 0x1f91, 0xc39: 0x1fa1, 0xc3a: 0x1fb2, 0xc3b: 0x07bd, 0xc3c: 0x1fc2, 0xc3d: 0x1fd2, 0xc3e: 0x1fe2, 0xc3f: 0x0f71, // Block 0x31, offset 0xc40 0xc40: 0x1f41, 0xc41: 0x00c9, 0xc42: 0x0069, 0xc43: 0x0079, 0xc44: 0x1f51, 0xc45: 0x1f61, 0xc46: 0x1f71, 0xc47: 0x1f81, 0xc48: 0x1f91, 0xc49: 0x1fa1, 0xc4a: 0x1fb2, 0xc4b: 0x07d5, 0xc4c: 0x1fc2, 0xc4d: 0x1fd2, 0xc4e: 0x1fe2, 0xc4f: 0x0040, 0xc50: 0x0039, 0xc51: 0x0f09, 0xc52: 0x00d9, 0xc53: 0x0369, 0xc54: 0x0ff9, 0xc55: 0x0249, 0xc56: 0x0f51, 0xc57: 0x0359, 0xc58: 0x0f61, 0xc59: 0x0f71, 0xc5a: 0x0f99, 0xc5b: 0x01d9, 0xc5c: 0x0fa9, 0xc5d: 0x0040, 0xc5e: 0x0040, 0xc5f: 0x0040, 0xc60: 0x0018, 0xc61: 0x0018, 0xc62: 0x0018, 0xc63: 0x0018, 0xc64: 0x0018, 0xc65: 0x0018, 0xc66: 0x0018, 0xc67: 0x0018, 0xc68: 0x1ff1, 0xc69: 0x0018, 0xc6a: 0x0018, 0xc6b: 0x0018, 0xc6c: 0x0018, 0xc6d: 0x0018, 0xc6e: 0x0018, 0xc6f: 0x0018, 0xc70: 0x0018, 0xc71: 0x0018, 0xc72: 0x0018, 0xc73: 0x0018, 0xc74: 0x0018, 0xc75: 0x0018, 0xc76: 0x0018, 0xc77: 0x0018, 0xc78: 0x0018, 0xc79: 0x0018, 0xc7a: 0x0018, 0xc7b: 0x0018, 0xc7c: 0x0018, 0xc7d: 0x0018, 0xc7e: 0x0018, 0xc7f: 0x0018, // Block 0x32, offset 0xc80 0xc80: 0x07ee, 0xc81: 0x080e, 0xc82: 0x1159, 0xc83: 0x082d, 0xc84: 0x0018, 0xc85: 0x084e, 0xc86: 0x086e, 0xc87: 0x1011, 0xc88: 0x0018, 0xc89: 0x088d, 0xc8a: 0x0f31, 0xc8b: 0x0249, 0xc8c: 0x0249, 0xc8d: 0x0249, 0xc8e: 0x0249, 0xc8f: 0x2009, 0xc90: 0x0f41, 0xc91: 0x0f41, 0xc92: 0x0359, 0xc93: 0x0359, 0xc94: 0x0018, 0xc95: 0x0f71, 0xc96: 0x2021, 0xc97: 0x0018, 0xc98: 0x0018, 0xc99: 0x0f99, 0xc9a: 0x2039, 0xc9b: 0x0269, 0xc9c: 0x0269, 0xc9d: 0x0269, 0xc9e: 0x0018, 0xc9f: 0x0018, 0xca0: 0x2049, 0xca1: 0x08ad, 0xca2: 0x2061, 0xca3: 0x0018, 0xca4: 0x13d1, 0xca5: 0x0018, 0xca6: 0x2079, 0xca7: 0x0018, 0xca8: 0x13d1, 0xca9: 0x0018, 0xcaa: 0x0f51, 0xcab: 0x2091, 0xcac: 0x0ee9, 0xcad: 0x1159, 0xcae: 0x0018, 0xcaf: 0x0f09, 0xcb0: 0x0f09, 0xcb1: 0x1199, 0xcb2: 0x0040, 0xcb3: 0x0f61, 0xcb4: 0x00d9, 0xcb5: 0x20a9, 0xcb6: 0x20c1, 0xcb7: 0x20d9, 0xcb8: 0x20f1, 0xcb9: 0x0f41, 0xcba: 0x0018, 0xcbb: 0x08cd, 0xcbc: 0x2109, 0xcbd: 0x10b1, 0xcbe: 0x10b1, 0xcbf: 0x2109, // Block 0x33, offset 0xcc0 0xcc0: 0x08ed, 0xcc1: 0x0018, 0xcc2: 0x0018, 0xcc3: 0x0018, 0xcc4: 0x0018, 0xcc5: 0x0ef9, 0xcc6: 0x0ef9, 0xcc7: 0x0f09, 0xcc8: 0x0f41, 0xcc9: 0x0259, 0xcca: 0x0018, 0xccb: 0x0018, 0xccc: 0x0018, 0xccd: 0x0018, 0xcce: 0x0008, 0xccf: 0x0018, 0xcd0: 0x2121, 0xcd1: 0x2151, 0xcd2: 0x2181, 0xcd3: 0x21b9, 0xcd4: 0x21e9, 0xcd5: 0x2219, 0xcd6: 0x2249, 0xcd7: 0x2279, 0xcd8: 0x22a9, 0xcd9: 0x22d9, 0xcda: 0x2309, 0xcdb: 0x2339, 0xcdc: 0x2369, 0xcdd: 0x2399, 0xcde: 0x23c9, 0xcdf: 0x23f9, 0xce0: 0x0f41, 0xce1: 0x2421, 0xce2: 0x0905, 0xce3: 0x2439, 0xce4: 0x1089, 0xce5: 0x2451, 0xce6: 0x0925, 0xce7: 0x2469, 0xce8: 0x2491, 0xce9: 0x0369, 0xcea: 0x24a9, 0xceb: 0x0945, 0xcec: 0x0359, 0xced: 0x1159, 0xcee: 0x0ef9, 0xcef: 0x0f61, 0xcf0: 0x0f41, 0xcf1: 0x2421, 0xcf2: 0x0965, 0xcf3: 0x2439, 0xcf4: 0x1089, 0xcf5: 0x2451, 0xcf6: 0x0985, 0xcf7: 0x2469, 0xcf8: 0x2491, 0xcf9: 0x0369, 0xcfa: 0x24a9, 0xcfb: 0x09a5, 0xcfc: 0x0359, 0xcfd: 0x1159, 0xcfe: 0x0ef9, 0xcff: 0x0f61, // Block 0x34, offset 0xd00 0xd00: 0x0018, 0xd01: 0x0018, 0xd02: 0x0018, 0xd03: 0x0018, 0xd04: 0x0018, 0xd05: 0x0018, 0xd06: 0x0018, 0xd07: 0x0018, 0xd08: 0x0018, 0xd09: 0x0018, 0xd0a: 0x0018, 0xd0b: 0x0040, 0xd0c: 0x0040, 0xd0d: 0x0040, 0xd0e: 0x0040, 0xd0f: 0x0040, 0xd10: 0x0040, 0xd11: 0x0040, 0xd12: 0x0040, 0xd13: 0x0040, 0xd14: 0x0040, 0xd15: 0x0040, 0xd16: 0x0040, 0xd17: 0x0040, 0xd18: 0x0040, 0xd19: 0x0040, 0xd1a: 0x0040, 0xd1b: 0x0040, 0xd1c: 0x0040, 0xd1d: 0x0040, 0xd1e: 0x0040, 0xd1f: 0x0040, 0xd20: 0x00c9, 0xd21: 0x0069, 0xd22: 0x0079, 0xd23: 0x1f51, 0xd24: 0x1f61, 0xd25: 0x1f71, 0xd26: 0x1f81, 0xd27: 0x1f91, 0xd28: 0x1fa1, 0xd29: 0x2601, 0xd2a: 0x2619, 0xd2b: 0x2631, 0xd2c: 0x2649, 0xd2d: 0x2661, 0xd2e: 0x2679, 0xd2f: 0x2691, 0xd30: 0x26a9, 0xd31: 0x26c1, 0xd32: 0x26d9, 0xd33: 0x26f1, 0xd34: 0x0a06, 0xd35: 0x0a26, 0xd36: 0x0a46, 0xd37: 0x0a66, 0xd38: 0x0a86, 0xd39: 0x0aa6, 0xd3a: 0x0ac6, 0xd3b: 0x0ae6, 0xd3c: 0x0b06, 0xd3d: 0x270a, 0xd3e: 0x2732, 0xd3f: 0x275a, // Block 0x35, offset 0xd40 0xd40: 0x2782, 0xd41: 0x27aa, 0xd42: 0x27d2, 0xd43: 0x27fa, 0xd44: 0x2822, 0xd45: 0x284a, 0xd46: 0x2872, 0xd47: 0x289a, 0xd48: 0x0040, 0xd49: 0x0040, 0xd4a: 0x0040, 0xd4b: 0x0040, 0xd4c: 0x0040, 0xd4d: 0x0040, 0xd4e: 0x0040, 0xd4f: 0x0040, 0xd50: 0x0040, 0xd51: 0x0040, 0xd52: 0x0040, 0xd53: 0x0040, 0xd54: 0x0040, 0xd55: 0x0040, 0xd56: 0x0040, 0xd57: 0x0040, 0xd58: 0x0040, 0xd59: 0x0040, 0xd5a: 0x0040, 0xd5b: 0x0040, 0xd5c: 0x0b26, 0xd5d: 0x0b46, 0xd5e: 0x0b66, 0xd5f: 0x0b86, 0xd60: 0x0ba6, 0xd61: 0x0bc6, 0xd62: 0x0be6, 0xd63: 0x0c06, 0xd64: 0x0c26, 0xd65: 0x0c46, 0xd66: 0x0c66, 0xd67: 0x0c86, 0xd68: 0x0ca6, 0xd69: 0x0cc6, 0xd6a: 0x0ce6, 0xd6b: 0x0d06, 0xd6c: 0x0d26, 0xd6d: 0x0d46, 0xd6e: 0x0d66, 0xd6f: 0x0d86, 0xd70: 0x0da6, 0xd71: 0x0dc6, 0xd72: 0x0de6, 0xd73: 0x0e06, 0xd74: 0x0e26, 0xd75: 0x0e46, 0xd76: 0x0039, 0xd77: 0x0ee9, 0xd78: 0x1159, 0xd79: 0x0ef9, 0xd7a: 0x0f09, 0xd7b: 0x1199, 0xd7c: 0x0f31, 0xd7d: 0x0249, 0xd7e: 0x0f41, 0xd7f: 0x0259, // Block 0x36, offset 0xd80 0xd80: 0x0f51, 0xd81: 0x0359, 0xd82: 0x0f61, 0xd83: 0x0f71, 0xd84: 0x00d9, 0xd85: 0x0f99, 0xd86: 0x2039, 0xd87: 0x0269, 0xd88: 0x01d9, 0xd89: 0x0fa9, 0xd8a: 0x0fb9, 0xd8b: 0x1089, 0xd8c: 0x0279, 0xd8d: 0x0369, 0xd8e: 0x0289, 0xd8f: 0x13d1, 0xd90: 0x0039, 0xd91: 0x0ee9, 0xd92: 0x1159, 0xd93: 0x0ef9, 0xd94: 0x0f09, 0xd95: 0x1199, 0xd96: 0x0f31, 0xd97: 0x0249, 0xd98: 0x0f41, 0xd99: 0x0259, 0xd9a: 0x0f51, 0xd9b: 0x0359, 0xd9c: 0x0f61, 0xd9d: 0x0f71, 0xd9e: 0x00d9, 0xd9f: 0x0f99, 0xda0: 0x2039, 0xda1: 0x0269, 0xda2: 0x01d9, 0xda3: 0x0fa9, 0xda4: 0x0fb9, 0xda5: 0x1089, 0xda6: 0x0279, 0xda7: 0x0369, 0xda8: 0x0289, 0xda9: 0x13d1, 0xdaa: 0x1f41, 0xdab: 0x0018, 0xdac: 0x0018, 0xdad: 0x0018, 0xdae: 0x0018, 0xdaf: 0x0018, 0xdb0: 0x0018, 0xdb1: 0x0018, 0xdb2: 0x0018, 0xdb3: 0x0018, 0xdb4: 0x0018, 0xdb5: 0x0018, 0xdb6: 0x0018, 0xdb7: 0x0018, 0xdb8: 0x0018, 0xdb9: 0x0018, 0xdba: 0x0018, 0xdbb: 0x0018, 0xdbc: 0x0018, 0xdbd: 0x0018, 0xdbe: 0x0018, 0xdbf: 0x0018, // Block 0x37, offset 0xdc0 0xdc0: 0x0008, 0xdc1: 0x0008, 0xdc2: 0x0008, 0xdc3: 0x0008, 0xdc4: 0x0008, 0xdc5: 0x0008, 0xdc6: 0x0008, 0xdc7: 0x0008, 0xdc8: 0x0008, 0xdc9: 0x0008, 0xdca: 0x0008, 0xdcb: 0x0008, 0xdcc: 0x0008, 0xdcd: 0x0008, 0xdce: 0x0008, 0xdcf: 0x0008, 0xdd0: 0x0008, 0xdd1: 0x0008, 0xdd2: 0x0008, 0xdd3: 0x0008, 0xdd4: 0x0008, 0xdd5: 0x0008, 0xdd6: 0x0008, 0xdd7: 0x0008, 0xdd8: 0x0008, 0xdd9: 0x0008, 0xdda: 0x0008, 0xddb: 0x0008, 0xddc: 0x0008, 0xddd: 0x0008, 0xdde: 0x0008, 0xddf: 0x0040, 0xde0: 0xe00d, 0xde1: 0x0008, 0xde2: 0x2971, 0xde3: 0x0ebd, 0xde4: 0x2989, 0xde5: 0x0008, 0xde6: 0x0008, 0xde7: 0xe07d, 0xde8: 0x0008, 0xde9: 0xe01d, 0xdea: 0x0008, 0xdeb: 0xe03d, 0xdec: 0x0008, 0xded: 0x0fe1, 0xdee: 0x1281, 0xdef: 0x0fc9, 0xdf0: 0x1141, 0xdf1: 0x0008, 0xdf2: 0xe00d, 0xdf3: 0x0008, 0xdf4: 0x0008, 0xdf5: 0xe01d, 0xdf6: 0x0008, 0xdf7: 0x0008, 0xdf8: 0x0008, 0xdf9: 0x0008, 0xdfa: 0x0008, 0xdfb: 0x0008, 0xdfc: 0x0259, 0xdfd: 0x1089, 0xdfe: 0x29a1, 0xdff: 0x29b9, // Block 0x38, offset 0xe00 0xe00: 0xe00d, 0xe01: 0x0008, 0xe02: 0xe00d, 0xe03: 0x0008, 0xe04: 0xe00d, 0xe05: 0x0008, 0xe06: 0xe00d, 0xe07: 0x0008, 0xe08: 0xe00d, 0xe09: 0x0008, 0xe0a: 0xe00d, 0xe0b: 0x0008, 0xe0c: 0xe00d, 0xe0d: 0x0008, 0xe0e: 0xe00d, 0xe0f: 0x0008, 0xe10: 0xe00d, 0xe11: 0x0008, 0xe12: 0xe00d, 0xe13: 0x0008, 0xe14: 0xe00d, 0xe15: 0x0008, 0xe16: 0xe00d, 0xe17: 0x0008, 0xe18: 0xe00d, 0xe19: 0x0008, 0xe1a: 0xe00d, 0xe1b: 0x0008, 0xe1c: 0xe00d, 0xe1d: 0x0008, 0xe1e: 0xe00d, 0xe1f: 0x0008, 0xe20: 0xe00d, 0xe21: 0x0008, 0xe22: 0xe00d, 0xe23: 0x0008, 0xe24: 0x0008, 0xe25: 0x0018, 0xe26: 0x0018, 0xe27: 0x0018, 0xe28: 0x0018, 0xe29: 0x0018, 0xe2a: 0x0018, 0xe2b: 0xe03d, 0xe2c: 0x0008, 0xe2d: 0xe01d, 0xe2e: 0x0008, 0xe2f: 0x3308, 0xe30: 0x3308, 0xe31: 0x3308, 0xe32: 0xe00d, 0xe33: 0x0008, 0xe34: 0x0040, 0xe35: 0x0040, 0xe36: 0x0040, 0xe37: 0x0040, 0xe38: 0x0040, 0xe39: 0x0018, 0xe3a: 0x0018, 0xe3b: 0x0018, 0xe3c: 0x0018, 0xe3d: 0x0018, 0xe3e: 0x0018, 0xe3f: 0x0018, // Block 0x39, offset 0xe40 0xe40: 0x26fd, 0xe41: 0x271d, 0xe42: 0x273d, 0xe43: 0x275d, 0xe44: 0x277d, 0xe45: 0x279d, 0xe46: 0x27bd, 0xe47: 0x27dd, 0xe48: 0x27fd, 0xe49: 0x281d, 0xe4a: 0x283d, 0xe4b: 0x285d, 0xe4c: 0x287d, 0xe4d: 0x289d, 0xe4e: 0x28bd, 0xe4f: 0x28dd, 0xe50: 0x28fd, 0xe51: 0x291d, 0xe52: 0x293d, 0xe53: 0x295d, 0xe54: 0x297d, 0xe55: 0x299d, 0xe56: 0x0040, 0xe57: 0x0040, 0xe58: 0x0040, 0xe59: 0x0040, 0xe5a: 0x0040, 0xe5b: 0x0040, 0xe5c: 0x0040, 0xe5d: 0x0040, 0xe5e: 0x0040, 0xe5f: 0x0040, 0xe60: 0x0040, 0xe61: 0x0040, 0xe62: 0x0040, 0xe63: 0x0040, 0xe64: 0x0040, 0xe65: 0x0040, 0xe66: 0x0040, 0xe67: 0x0040, 0xe68: 0x0040, 0xe69: 0x0040, 0xe6a: 0x0040, 0xe6b: 0x0040, 0xe6c: 0x0040, 0xe6d: 0x0040, 0xe6e: 0x0040, 0xe6f: 0x0040, 0xe70: 0x0040, 0xe71: 0x0040, 0xe72: 0x0040, 0xe73: 0x0040, 0xe74: 0x0040, 0xe75: 0x0040, 0xe76: 0x0040, 0xe77: 0x0040, 0xe78: 0x0040, 0xe79: 0x0040, 0xe7a: 0x0040, 0xe7b: 0x0040, 0xe7c: 0x0040, 0xe7d: 0x0040, 0xe7e: 0x0040, 0xe7f: 0x0040, // Block 0x3a, offset 0xe80 0xe80: 0x000a, 0xe81: 0x0018, 0xe82: 0x29d1, 0xe83: 0x0018, 0xe84: 0x0018, 0xe85: 0x0008, 0xe86: 0x0008, 0xe87: 0x0008, 0xe88: 0x0018, 0xe89: 0x0018, 0xe8a: 0x0018, 0xe8b: 0x0018, 0xe8c: 0x0018, 0xe8d: 0x0018, 0xe8e: 0x0018, 0xe8f: 0x0018, 0xe90: 0x0018, 0xe91: 0x0018, 0xe92: 0x0018, 0xe93: 0x0018, 0xe94: 0x0018, 0xe95: 0x0018, 0xe96: 0x0018, 0xe97: 0x0018, 0xe98: 0x0018, 0xe99: 0x0018, 0xe9a: 0x0018, 0xe9b: 0x0018, 0xe9c: 0x0018, 0xe9d: 0x0018, 0xe9e: 0x0018, 0xe9f: 0x0018, 0xea0: 0x0018, 0xea1: 0x0018, 0xea2: 0x0018, 0xea3: 0x0018, 0xea4: 0x0018, 0xea5: 0x0018, 0xea6: 0x0018, 0xea7: 0x0018, 0xea8: 0x0018, 0xea9: 0x0018, 0xeaa: 0x3308, 0xeab: 0x3308, 0xeac: 0x3308, 0xead: 0x3308, 0xeae: 0x3018, 0xeaf: 0x3018, 0xeb0: 0x0018, 0xeb1: 0x0018, 0xeb2: 0x0018, 0xeb3: 0x0018, 0xeb4: 0x0018, 0xeb5: 0x0018, 0xeb6: 0xe125, 0xeb7: 0x0018, 0xeb8: 0x29bd, 0xeb9: 0x29dd, 0xeba: 0x29fd, 0xebb: 0x0018, 0xebc: 0x0008, 0xebd: 0x0018, 0xebe: 0x0018, 0xebf: 0x0018, // Block 0x3b, offset 0xec0 0xec0: 0x2b3d, 0xec1: 0x2b5d, 0xec2: 0x2b7d, 0xec3: 0x2b9d, 0xec4: 0x2bbd, 0xec5: 0x2bdd, 0xec6: 0x2bdd, 0xec7: 0x2bdd, 0xec8: 0x2bfd, 0xec9: 0x2bfd, 0xeca: 0x2bfd, 0xecb: 0x2bfd, 0xecc: 0x2c1d, 0xecd: 0x2c1d, 0xece: 0x2c1d, 0xecf: 0x2c3d, 0xed0: 0x2c5d, 0xed1: 0x2c5d, 0xed2: 0x2a7d, 0xed3: 0x2a7d, 0xed4: 0x2c5d, 0xed5: 0x2c5d, 0xed6: 0x2c7d, 0xed7: 0x2c7d, 0xed8: 0x2c5d, 0xed9: 0x2c5d, 0xeda: 0x2a7d, 0xedb: 0x2a7d, 0xedc: 0x2c5d, 0xedd: 0x2c5d, 0xede: 0x2c3d, 0xedf: 0x2c3d, 0xee0: 0x2c9d, 0xee1: 0x2c9d, 0xee2: 0x2cbd, 0xee3: 0x2cbd, 0xee4: 0x0040, 0xee5: 0x2cdd, 0xee6: 0x2cfd, 0xee7: 0x2d1d, 0xee8: 0x2d1d, 0xee9: 0x2d3d, 0xeea: 0x2d5d, 0xeeb: 0x2d7d, 0xeec: 0x2d9d, 0xeed: 0x2dbd, 0xeee: 0x2ddd, 0xeef: 0x2dfd, 0xef0: 0x2e1d, 0xef1: 0x2e3d, 0xef2: 0x2e3d, 0xef3: 0x2e5d, 0xef4: 0x2e7d, 0xef5: 0x2e7d, 0xef6: 0x2e9d, 0xef7: 0x2ebd, 0xef8: 0x2e5d, 0xef9: 0x2edd, 0xefa: 0x2efd, 0xefb: 0x2edd, 0xefc: 0x2e5d, 0xefd: 0x2f1d, 0xefe: 0x2f3d, 0xeff: 0x2f5d, // Block 0x3c, offset 0xf00 0xf00: 0x2f7d, 0xf01: 0x2f9d, 0xf02: 0x2cfd, 0xf03: 0x2cdd, 0xf04: 0x2fbd, 0xf05: 0x2fdd, 0xf06: 0x2ffd, 0xf07: 0x301d, 0xf08: 0x303d, 0xf09: 0x305d, 0xf0a: 0x307d, 0xf0b: 0x309d, 0xf0c: 0x30bd, 0xf0d: 0x30dd, 0xf0e: 0x30fd, 0xf0f: 0x0040, 0xf10: 0x0018, 0xf11: 0x0018, 0xf12: 0x311d, 0xf13: 0x313d, 0xf14: 0x315d, 0xf15: 0x317d, 0xf16: 0x319d, 0xf17: 0x31bd, 0xf18: 0x31dd, 0xf19: 0x31fd, 0xf1a: 0x321d, 0xf1b: 0x323d, 0xf1c: 0x315d, 0xf1d: 0x325d, 0xf1e: 0x327d, 0xf1f: 0x329d, 0xf20: 0x0008, 0xf21: 0x0008, 0xf22: 0x0008, 0xf23: 0x0008, 0xf24: 0x0008, 0xf25: 0x0008, 0xf26: 0x0008, 0xf27: 0x0008, 0xf28: 0x0008, 0xf29: 0x0008, 0xf2a: 0x0008, 0xf2b: 0x0008, 0xf2c: 0x0008, 0xf2d: 0x0008, 0xf2e: 0x0008, 0xf2f: 0x0008, 0xf30: 0x0008, 0xf31: 0x0008, 0xf32: 0x0008, 0xf33: 0x0008, 0xf34: 0x0008, 0xf35: 0x0008, 0xf36: 0x0008, 0xf37: 0x0008, 0xf38: 0x0008, 0xf39: 0x0008, 0xf3a: 0x0008, 0xf3b: 0x0040, 0xf3c: 0x0040, 0xf3d: 0x0040, 0xf3e: 0x0040, 0xf3f: 0x0040, // Block 0x3d, offset 0xf40 0xf40: 0x36a2, 0xf41: 0x36d2, 0xf42: 0x3702, 0xf43: 0x3732, 0xf44: 0x32bd, 0xf45: 0x32dd, 0xf46: 0x32fd, 0xf47: 0x331d, 0xf48: 0x0018, 0xf49: 0x0018, 0xf4a: 0x0018, 0xf4b: 0x0018, 0xf4c: 0x0018, 0xf4d: 0x0018, 0xf4e: 0x0018, 0xf4f: 0x0018, 0xf50: 0x333d, 0xf51: 0x3761, 0xf52: 0x3779, 0xf53: 0x3791, 0xf54: 0x37a9, 0xf55: 0x37c1, 0xf56: 0x37d9, 0xf57: 0x37f1, 0xf58: 0x3809, 0xf59: 0x3821, 0xf5a: 0x3839, 0xf5b: 0x3851, 0xf5c: 0x3869, 0xf5d: 0x3881, 0xf5e: 0x3899, 0xf5f: 0x38b1, 0xf60: 0x335d, 0xf61: 0x337d, 0xf62: 0x339d, 0xf63: 0x33bd, 0xf64: 0x33dd, 0xf65: 0x33dd, 0xf66: 0x33fd, 0xf67: 0x341d, 0xf68: 0x343d, 0xf69: 0x345d, 0xf6a: 0x347d, 0xf6b: 0x349d, 0xf6c: 0x34bd, 0xf6d: 0x34dd, 0xf6e: 0x34fd, 0xf6f: 0x351d, 0xf70: 0x353d, 0xf71: 0x355d, 0xf72: 0x357d, 0xf73: 0x359d, 0xf74: 0x35bd, 0xf75: 0x35dd, 0xf76: 0x35fd, 0xf77: 0x361d, 0xf78: 0x363d, 0xf79: 0x365d, 0xf7a: 0x367d, 0xf7b: 0x369d, 0xf7c: 0x38c9, 0xf7d: 0x3901, 0xf7e: 0x36bd, 0xf7f: 0x0018, // Block 0x3e, offset 0xf80 0xf80: 0x36dd, 0xf81: 0x36fd, 0xf82: 0x371d, 0xf83: 0x373d, 0xf84: 0x375d, 0xf85: 0x377d, 0xf86: 0x379d, 0xf87: 0x37bd, 0xf88: 0x37dd, 0xf89: 0x37fd, 0xf8a: 0x381d, 0xf8b: 0x383d, 0xf8c: 0x385d, 0xf8d: 0x387d, 0xf8e: 0x389d, 0xf8f: 0x38bd, 0xf90: 0x38dd, 0xf91: 0x38fd, 0xf92: 0x391d, 0xf93: 0x393d, 0xf94: 0x395d, 0xf95: 0x397d, 0xf96: 0x399d, 0xf97: 0x39bd, 0xf98: 0x39dd, 0xf99: 0x39fd, 0xf9a: 0x3a1d, 0xf9b: 0x3a3d, 0xf9c: 0x3a5d, 0xf9d: 0x3a7d, 0xf9e: 0x3a9d, 0xf9f: 0x3abd, 0xfa0: 0x3add, 0xfa1: 0x3afd, 0xfa2: 0x3b1d, 0xfa3: 0x3b3d, 0xfa4: 0x3b5d, 0xfa5: 0x3b7d, 0xfa6: 0x127d, 0xfa7: 0x3b9d, 0xfa8: 0x3bbd, 0xfa9: 0x3bdd, 0xfaa: 0x3bfd, 0xfab: 0x3c1d, 0xfac: 0x3c3d, 0xfad: 0x3c5d, 0xfae: 0x239d, 0xfaf: 0x3c7d, 0xfb0: 0x3c9d, 0xfb1: 0x3939, 0xfb2: 0x3951, 0xfb3: 0x3969, 0xfb4: 0x3981, 0xfb5: 0x3999, 0xfb6: 0x39b1, 0xfb7: 0x39c9, 0xfb8: 0x39e1, 0xfb9: 0x39f9, 0xfba: 0x3a11, 0xfbb: 0x3a29, 0xfbc: 0x3a41, 0xfbd: 0x3a59, 0xfbe: 0x3a71, 0xfbf: 0x3a89, // Block 0x3f, offset 0xfc0 0xfc0: 0x3aa1, 0xfc1: 0x3ac9, 0xfc2: 0x3af1, 0xfc3: 0x3b19, 0xfc4: 0x3b41, 0xfc5: 0x3b69, 0xfc6: 0x3b91, 0xfc7: 0x3bb9, 0xfc8: 0x3be1, 0xfc9: 0x3c09, 0xfca: 0x3c39, 0xfcb: 0x3c69, 0xfcc: 0x3c99, 0xfcd: 0x3cbd, 0xfce: 0x3cb1, 0xfcf: 0x3cdd, 0xfd0: 0x3cfd, 0xfd1: 0x3d15, 0xfd2: 0x3d2d, 0xfd3: 0x3d45, 0xfd4: 0x3d5d, 0xfd5: 0x3d5d, 0xfd6: 0x3d45, 0xfd7: 0x3d75, 0xfd8: 0x07bd, 0xfd9: 0x3d8d, 0xfda: 0x3da5, 0xfdb: 0x3dbd, 0xfdc: 0x3dd5, 0xfdd: 0x3ded, 0xfde: 0x3e05, 0xfdf: 0x3e1d, 0xfe0: 0x3e35, 0xfe1: 0x3e4d, 0xfe2: 0x3e65, 0xfe3: 0x3e7d, 0xfe4: 0x3e95, 0xfe5: 0x3e95, 0xfe6: 0x3ead, 0xfe7: 0x3ead, 0xfe8: 0x3ec5, 0xfe9: 0x3ec5, 0xfea: 0x3edd, 0xfeb: 0x3ef5, 0xfec: 0x3f0d, 0xfed: 0x3f25, 0xfee: 0x3f3d, 0xfef: 0x3f3d, 0xff0: 0x3f55, 0xff1: 0x3f55, 0xff2: 0x3f55, 0xff3: 0x3f6d, 0xff4: 0x3f85, 0xff5: 0x3f9d, 0xff6: 0x3fb5, 0xff7: 0x3f9d, 0xff8: 0x3fcd, 0xff9: 0x3fe5, 0xffa: 0x3f6d, 0xffb: 0x3ffd, 0xffc: 0x4015, 0xffd: 0x4015, 0xffe: 0x4015, 0xfff: 0x0040, // Block 0x40, offset 0x1000 0x1000: 0x3cc9, 0x1001: 0x3d31, 0x1002: 0x3d99, 0x1003: 0x3e01, 0x1004: 0x3e51, 0x1005: 0x3eb9, 0x1006: 0x3f09, 0x1007: 0x3f59, 0x1008: 0x3fd9, 0x1009: 0x4041, 0x100a: 0x4091, 0x100b: 0x40e1, 0x100c: 0x4131, 0x100d: 0x4199, 0x100e: 0x4201, 0x100f: 0x4251, 0x1010: 0x42a1, 0x1011: 0x42d9, 0x1012: 0x4329, 0x1013: 0x4391, 0x1014: 0x43f9, 0x1015: 0x4431, 0x1016: 0x44b1, 0x1017: 0x4549, 0x1018: 0x45c9, 0x1019: 0x4619, 0x101a: 0x4699, 0x101b: 0x4719, 0x101c: 0x4781, 0x101d: 0x47d1, 0x101e: 0x4821, 0x101f: 0x4871, 0x1020: 0x48d9, 0x1021: 0x4959, 0x1022: 0x49c1, 0x1023: 0x4a11, 0x1024: 0x4a61, 0x1025: 0x4ab1, 0x1026: 0x4ae9, 0x1027: 0x4b21, 0x1028: 0x4b59, 0x1029: 0x4b91, 0x102a: 0x4be1, 0x102b: 0x4c31, 0x102c: 0x4cb1, 0x102d: 0x4d01, 0x102e: 0x4d69, 0x102f: 0x4de9, 0x1030: 0x4e39, 0x1031: 0x4e71, 0x1032: 0x4ea9, 0x1033: 0x4f29, 0x1034: 0x4f91, 0x1035: 0x5011, 0x1036: 0x5061, 0x1037: 0x50e1, 0x1038: 0x5119, 0x1039: 0x5169, 0x103a: 0x51b9, 0x103b: 0x5209, 0x103c: 0x5259, 0x103d: 0x52a9, 0x103e: 0x5311, 0x103f: 0x5361, // Block 0x41, offset 0x1040 0x1040: 0x5399, 0x1041: 0x53e9, 0x1042: 0x5439, 0x1043: 0x5489, 0x1044: 0x54f1, 0x1045: 0x5541, 0x1046: 0x5591, 0x1047: 0x55e1, 0x1048: 0x5661, 0x1049: 0x56c9, 0x104a: 0x5701, 0x104b: 0x5781, 0x104c: 0x57b9, 0x104d: 0x5821, 0x104e: 0x5889, 0x104f: 0x58d9, 0x1050: 0x5929, 0x1051: 0x5979, 0x1052: 0x59e1, 0x1053: 0x5a19, 0x1054: 0x5a69, 0x1055: 0x5ad1, 0x1056: 0x5b09, 0x1057: 0x5b89, 0x1058: 0x5bd9, 0x1059: 0x5c01, 0x105a: 0x5c29, 0x105b: 0x5c51, 0x105c: 0x5c79, 0x105d: 0x5ca1, 0x105e: 0x5cc9, 0x105f: 0x5cf1, 0x1060: 0x5d19, 0x1061: 0x5d41, 0x1062: 0x5d69, 0x1063: 0x5d99, 0x1064: 0x5dc9, 0x1065: 0x5df9, 0x1066: 0x5e29, 0x1067: 0x5e59, 0x1068: 0x5e89, 0x1069: 0x5eb9, 0x106a: 0x5ee9, 0x106b: 0x5f19, 0x106c: 0x5f49, 0x106d: 0x5f79, 0x106e: 0x5fa9, 0x106f: 0x5fd9, 0x1070: 0x6009, 0x1071: 0x402d, 0x1072: 0x6039, 0x1073: 0x6051, 0x1074: 0x404d, 0x1075: 0x6069, 0x1076: 0x6081, 0x1077: 0x6099, 0x1078: 0x406d, 0x1079: 0x406d, 0x107a: 0x60b1, 0x107b: 0x60c9, 0x107c: 0x6101, 0x107d: 0x6139, 0x107e: 0x6171, 0x107f: 0x61a9, // Block 0x42, offset 0x1080 0x1080: 0x6211, 0x1081: 0x6229, 0x1082: 0x408d, 0x1083: 0x6241, 0x1084: 0x6259, 0x1085: 0x6271, 0x1086: 0x6289, 0x1087: 0x62a1, 0x1088: 0x40ad, 0x1089: 0x62b9, 0x108a: 0x62e1, 0x108b: 0x62f9, 0x108c: 0x40cd, 0x108d: 0x40cd, 0x108e: 0x6311, 0x108f: 0x6329, 0x1090: 0x6341, 0x1091: 0x40ed, 0x1092: 0x410d, 0x1093: 0x412d, 0x1094: 0x414d, 0x1095: 0x416d, 0x1096: 0x6359, 0x1097: 0x6371, 0x1098: 0x6389, 0x1099: 0x63a1, 0x109a: 0x63b9, 0x109b: 0x418d, 0x109c: 0x63d1, 0x109d: 0x63e9, 0x109e: 0x6401, 0x109f: 0x41ad, 0x10a0: 0x41cd, 0x10a1: 0x6419, 0x10a2: 0x41ed, 0x10a3: 0x420d, 0x10a4: 0x422d, 0x10a5: 0x6431, 0x10a6: 0x424d, 0x10a7: 0x6449, 0x10a8: 0x6479, 0x10a9: 0x6211, 0x10aa: 0x426d, 0x10ab: 0x428d, 0x10ac: 0x42ad, 0x10ad: 0x42cd, 0x10ae: 0x64b1, 0x10af: 0x64f1, 0x10b0: 0x6539, 0x10b1: 0x6551, 0x10b2: 0x42ed, 0x10b3: 0x6569, 0x10b4: 0x6581, 0x10b5: 0x6599, 0x10b6: 0x430d, 0x10b7: 0x65b1, 0x10b8: 0x65c9, 0x10b9: 0x65b1, 0x10ba: 0x65e1, 0x10bb: 0x65f9, 0x10bc: 0x432d, 0x10bd: 0x6611, 0x10be: 0x6629, 0x10bf: 0x6611, // Block 0x43, offset 0x10c0 0x10c0: 0x434d, 0x10c1: 0x436d, 0x10c2: 0x0040, 0x10c3: 0x6641, 0x10c4: 0x6659, 0x10c5: 0x6671, 0x10c6: 0x6689, 0x10c7: 0x0040, 0x10c8: 0x66c1, 0x10c9: 0x66d9, 0x10ca: 0x66f1, 0x10cb: 0x6709, 0x10cc: 0x6721, 0x10cd: 0x6739, 0x10ce: 0x6401, 0x10cf: 0x6751, 0x10d0: 0x6769, 0x10d1: 0x6781, 0x10d2: 0x438d, 0x10d3: 0x6799, 0x10d4: 0x6289, 0x10d5: 0x43ad, 0x10d6: 0x43cd, 0x10d7: 0x67b1, 0x10d8: 0x0040, 0x10d9: 0x43ed, 0x10da: 0x67c9, 0x10db: 0x67e1, 0x10dc: 0x67f9, 0x10dd: 0x6811, 0x10de: 0x6829, 0x10df: 0x6859, 0x10e0: 0x6889, 0x10e1: 0x68b1, 0x10e2: 0x68d9, 0x10e3: 0x6901, 0x10e4: 0x6929, 0x10e5: 0x6951, 0x10e6: 0x6979, 0x10e7: 0x69a1, 0x10e8: 0x69c9, 0x10e9: 0x69f1, 0x10ea: 0x6a21, 0x10eb: 0x6a51, 0x10ec: 0x6a81, 0x10ed: 0x6ab1, 0x10ee: 0x6ae1, 0x10ef: 0x6b11, 0x10f0: 0x6b41, 0x10f1: 0x6b71, 0x10f2: 0x6ba1, 0x10f3: 0x6bd1, 0x10f4: 0x6c01, 0x10f5: 0x6c31, 0x10f6: 0x6c61, 0x10f7: 0x6c91, 0x10f8: 0x6cc1, 0x10f9: 0x6cf1, 0x10fa: 0x6d21, 0x10fb: 0x6d51, 0x10fc: 0x6d81, 0x10fd: 0x6db1, 0x10fe: 0x6de1, 0x10ff: 0x440d, // Block 0x44, offset 0x1100 0x1100: 0xe00d, 0x1101: 0x0008, 0x1102: 0xe00d, 0x1103: 0x0008, 0x1104: 0xe00d, 0x1105: 0x0008, 0x1106: 0xe00d, 0x1107: 0x0008, 0x1108: 0xe00d, 0x1109: 0x0008, 0x110a: 0xe00d, 0x110b: 0x0008, 0x110c: 0xe00d, 0x110d: 0x0008, 0x110e: 0xe00d, 0x110f: 0x0008, 0x1110: 0xe00d, 0x1111: 0x0008, 0x1112: 0xe00d, 0x1113: 0x0008, 0x1114: 0xe00d, 0x1115: 0x0008, 0x1116: 0xe00d, 0x1117: 0x0008, 0x1118: 0xe00d, 0x1119: 0x0008, 0x111a: 0xe00d, 0x111b: 0x0008, 0x111c: 0xe00d, 0x111d: 0x0008, 0x111e: 0xe00d, 0x111f: 0x0008, 0x1120: 0xe00d, 0x1121: 0x0008, 0x1122: 0xe00d, 0x1123: 0x0008, 0x1124: 0xe00d, 0x1125: 0x0008, 0x1126: 0xe00d, 0x1127: 0x0008, 0x1128: 0xe00d, 0x1129: 0x0008, 0x112a: 0xe00d, 0x112b: 0x0008, 0x112c: 0xe00d, 0x112d: 0x0008, 0x112e: 0x0008, 0x112f: 0x3308, 0x1130: 0x3318, 0x1131: 0x3318, 0x1132: 0x3318, 0x1133: 0x0018, 0x1134: 0x3308, 0x1135: 0x3308, 0x1136: 0x3308, 0x1137: 0x3308, 0x1138: 0x3308, 0x1139: 0x3308, 0x113a: 0x3308, 0x113b: 0x3308, 0x113c: 0x3308, 0x113d: 0x3308, 0x113e: 0x0018, 0x113f: 0x0008, // Block 0x45, offset 0x1140 0x1140: 0xe00d, 0x1141: 0x0008, 0x1142: 0xe00d, 0x1143: 0x0008, 0x1144: 0xe00d, 0x1145: 0x0008, 0x1146: 0xe00d, 0x1147: 0x0008, 0x1148: 0xe00d, 0x1149: 0x0008, 0x114a: 0xe00d, 0x114b: 0x0008, 0x114c: 0xe00d, 0x114d: 0x0008, 0x114e: 0xe00d, 0x114f: 0x0008, 0x1150: 0xe00d, 0x1151: 0x0008, 0x1152: 0xe00d, 0x1153: 0x0008, 0x1154: 0xe00d, 0x1155: 0x0008, 0x1156: 0xe00d, 0x1157: 0x0008, 0x1158: 0xe00d, 0x1159: 0x0008, 0x115a: 0xe00d, 0x115b: 0x0008, 0x115c: 0x0ea1, 0x115d: 0x6e11, 0x115e: 0x3308, 0x115f: 0x3308, 0x1160: 0x0008, 0x1161: 0x0008, 0x1162: 0x0008, 0x1163: 0x0008, 0x1164: 0x0008, 0x1165: 0x0008, 0x1166: 0x0008, 0x1167: 0x0008, 0x1168: 0x0008, 0x1169: 0x0008, 0x116a: 0x0008, 0x116b: 0x0008, 0x116c: 0x0008, 0x116d: 0x0008, 0x116e: 0x0008, 0x116f: 0x0008, 0x1170: 0x0008, 0x1171: 0x0008, 0x1172: 0x0008, 0x1173: 0x0008, 0x1174: 0x0008, 0x1175: 0x0008, 0x1176: 0x0008, 0x1177: 0x0008, 0x1178: 0x0008, 0x1179: 0x0008, 0x117a: 0x0008, 0x117b: 0x0008, 0x117c: 0x0008, 0x117d: 0x0008, 0x117e: 0x0008, 0x117f: 0x0008, // Block 0x46, offset 0x1180 0x1180: 0x0018, 0x1181: 0x0018, 0x1182: 0x0018, 0x1183: 0x0018, 0x1184: 0x0018, 0x1185: 0x0018, 0x1186: 0x0018, 0x1187: 0x0018, 0x1188: 0x0018, 0x1189: 0x0018, 0x118a: 0x0018, 0x118b: 0x0018, 0x118c: 0x0018, 0x118d: 0x0018, 0x118e: 0x0018, 0x118f: 0x0018, 0x1190: 0x0018, 0x1191: 0x0018, 0x1192: 0x0018, 0x1193: 0x0018, 0x1194: 0x0018, 0x1195: 0x0018, 0x1196: 0x0018, 0x1197: 0x0008, 0x1198: 0x0008, 0x1199: 0x0008, 0x119a: 0x0008, 0x119b: 0x0008, 0x119c: 0x0008, 0x119d: 0x0008, 0x119e: 0x0008, 0x119f: 0x0008, 0x11a0: 0x0018, 0x11a1: 0x0018, 0x11a2: 0xe00d, 0x11a3: 0x0008, 0x11a4: 0xe00d, 0x11a5: 0x0008, 0x11a6: 0xe00d, 0x11a7: 0x0008, 0x11a8: 0xe00d, 0x11a9: 0x0008, 0x11aa: 0xe00d, 0x11ab: 0x0008, 0x11ac: 0xe00d, 0x11ad: 0x0008, 0x11ae: 0xe00d, 0x11af: 0x0008, 0x11b0: 0x0008, 0x11b1: 0x0008, 0x11b2: 0xe00d, 0x11b3: 0x0008, 0x11b4: 0xe00d, 0x11b5: 0x0008, 0x11b6: 0xe00d, 0x11b7: 0x0008, 0x11b8: 0xe00d, 0x11b9: 0x0008, 0x11ba: 0xe00d, 0x11bb: 0x0008, 0x11bc: 0xe00d, 0x11bd: 0x0008, 0x11be: 0xe00d, 0x11bf: 0x0008, // Block 0x47, offset 0x11c0 0x11c0: 0xe00d, 0x11c1: 0x0008, 0x11c2: 0xe00d, 0x11c3: 0x0008, 0x11c4: 0xe00d, 0x11c5: 0x0008, 0x11c6: 0xe00d, 0x11c7: 0x0008, 0x11c8: 0xe00d, 0x11c9: 0x0008, 0x11ca: 0xe00d, 0x11cb: 0x0008, 0x11cc: 0xe00d, 0x11cd: 0x0008, 0x11ce: 0xe00d, 0x11cf: 0x0008, 0x11d0: 0xe00d, 0x11d1: 0x0008, 0x11d2: 0xe00d, 0x11d3: 0x0008, 0x11d4: 0xe00d, 0x11d5: 0x0008, 0x11d6: 0xe00d, 0x11d7: 0x0008, 0x11d8: 0xe00d, 0x11d9: 0x0008, 0x11da: 0xe00d, 0x11db: 0x0008, 0x11dc: 0xe00d, 0x11dd: 0x0008, 0x11de: 0xe00d, 0x11df: 0x0008, 0x11e0: 0xe00d, 0x11e1: 0x0008, 0x11e2: 0xe00d, 0x11e3: 0x0008, 0x11e4: 0xe00d, 0x11e5: 0x0008, 0x11e6: 0xe00d, 0x11e7: 0x0008, 0x11e8: 0xe00d, 0x11e9: 0x0008, 0x11ea: 0xe00d, 0x11eb: 0x0008, 0x11ec: 0xe00d, 0x11ed: 0x0008, 0x11ee: 0xe00d, 0x11ef: 0x0008, 0x11f0: 0xe0fd, 0x11f1: 0x0008, 0x11f2: 0x0008, 0x11f3: 0x0008, 0x11f4: 0x0008, 0x11f5: 0x0008, 0x11f6: 0x0008, 0x11f7: 0x0008, 0x11f8: 0x0008, 0x11f9: 0xe01d, 0x11fa: 0x0008, 0x11fb: 0xe03d, 0x11fc: 0x0008, 0x11fd: 0x442d, 0x11fe: 0xe00d, 0x11ff: 0x0008, // Block 0x48, offset 0x1200 0x1200: 0xe00d, 0x1201: 0x0008, 0x1202: 0xe00d, 0x1203: 0x0008, 0x1204: 0xe00d, 0x1205: 0x0008, 0x1206: 0xe00d, 0x1207: 0x0008, 0x1208: 0x0008, 0x1209: 0x0018, 0x120a: 0x0018, 0x120b: 0xe03d, 0x120c: 0x0008, 0x120d: 0x11d9, 0x120e: 0x0008, 0x120f: 0x0008, 0x1210: 0xe00d, 0x1211: 0x0008, 0x1212: 0xe00d, 0x1213: 0x0008, 0x1214: 0x0008, 0x1215: 0x0008, 0x1216: 0xe00d, 0x1217: 0x0008, 0x1218: 0xe00d, 0x1219: 0x0008, 0x121a: 0xe00d, 0x121b: 0x0008, 0x121c: 0xe00d, 0x121d: 0x0008, 0x121e: 0xe00d, 0x121f: 0x0008, 0x1220: 0xe00d, 0x1221: 0x0008, 0x1222: 0xe00d, 0x1223: 0x0008, 0x1224: 0xe00d, 0x1225: 0x0008, 0x1226: 0xe00d, 0x1227: 0x0008, 0x1228: 0xe00d, 0x1229: 0x0008, 0x122a: 0x6e29, 0x122b: 0x1029, 0x122c: 0x11c1, 0x122d: 0x6e41, 0x122e: 0x1221, 0x122f: 0x0040, 0x1230: 0x6e59, 0x1231: 0x6e71, 0x1232: 0x1239, 0x1233: 0x444d, 0x1234: 0xe00d, 0x1235: 0x0008, 0x1236: 0xe00d, 0x1237: 0x0008, 0x1238: 0x0040, 0x1239: 0x0040, 0x123a: 0x0040, 0x123b: 0x0040, 0x123c: 0x0040, 0x123d: 0x0040, 0x123e: 0x0040, 0x123f: 0x0040, // Block 0x49, offset 0x1240 0x1240: 0x64d5, 0x1241: 0x64f5, 0x1242: 0x6515, 0x1243: 0x6535, 0x1244: 0x6555, 0x1245: 0x6575, 0x1246: 0x6595, 0x1247: 0x65b5, 0x1248: 0x65d5, 0x1249: 0x65f5, 0x124a: 0x6615, 0x124b: 0x6635, 0x124c: 0x6655, 0x124d: 0x6675, 0x124e: 0x0008, 0x124f: 0x0008, 0x1250: 0x6695, 0x1251: 0x0008, 0x1252: 0x66b5, 0x1253: 0x0008, 0x1254: 0x0008, 0x1255: 0x66d5, 0x1256: 0x66f5, 0x1257: 0x6715, 0x1258: 0x6735, 0x1259: 0x6755, 0x125a: 0x6775, 0x125b: 0x6795, 0x125c: 0x67b5, 0x125d: 0x67d5, 0x125e: 0x67f5, 0x125f: 0x0008, 0x1260: 0x6815, 0x1261: 0x0008, 0x1262: 0x6835, 0x1263: 0x0008, 0x1264: 0x0008, 0x1265: 0x6855, 0x1266: 0x6875, 0x1267: 0x0008, 0x1268: 0x0008, 0x1269: 0x0008, 0x126a: 0x6895, 0x126b: 0x68b5, 0x126c: 0x68d5, 0x126d: 0x68f5, 0x126e: 0x6915, 0x126f: 0x6935, 0x1270: 0x6955, 0x1271: 0x6975, 0x1272: 0x6995, 0x1273: 0x69b5, 0x1274: 0x69d5, 0x1275: 0x69f5, 0x1276: 0x6a15, 0x1277: 0x6a35, 0x1278: 0x6a55, 0x1279: 0x6a75, 0x127a: 0x6a95, 0x127b: 0x6ab5, 0x127c: 0x6ad5, 0x127d: 0x6af5, 0x127e: 0x6b15, 0x127f: 0x6b35, // Block 0x4a, offset 0x1280 0x1280: 0x7a95, 0x1281: 0x7ab5, 0x1282: 0x7ad5, 0x1283: 0x7af5, 0x1284: 0x7b15, 0x1285: 0x7b35, 0x1286: 0x7b55, 0x1287: 0x7b75, 0x1288: 0x7b95, 0x1289: 0x7bb5, 0x128a: 0x7bd5, 0x128b: 0x7bf5, 0x128c: 0x7c15, 0x128d: 0x7c35, 0x128e: 0x7c55, 0x128f: 0x6ec9, 0x1290: 0x6ef1, 0x1291: 0x6f19, 0x1292: 0x7c75, 0x1293: 0x7c95, 0x1294: 0x7cb5, 0x1295: 0x6f41, 0x1296: 0x6f69, 0x1297: 0x6f91, 0x1298: 0x7cd5, 0x1299: 0x7cf5, 0x129a: 0x0040, 0x129b: 0x0040, 0x129c: 0x0040, 0x129d: 0x0040, 0x129e: 0x0040, 0x129f: 0x0040, 0x12a0: 0x0040, 0x12a1: 0x0040, 0x12a2: 0x0040, 0x12a3: 0x0040, 0x12a4: 0x0040, 0x12a5: 0x0040, 0x12a6: 0x0040, 0x12a7: 0x0040, 0x12a8: 0x0040, 0x12a9: 0x0040, 0x12aa: 0x0040, 0x12ab: 0x0040, 0x12ac: 0x0040, 0x12ad: 0x0040, 0x12ae: 0x0040, 0x12af: 0x0040, 0x12b0: 0x0040, 0x12b1: 0x0040, 0x12b2: 0x0040, 0x12b3: 0x0040, 0x12b4: 0x0040, 0x12b5: 0x0040, 0x12b6: 0x0040, 0x12b7: 0x0040, 0x12b8: 0x0040, 0x12b9: 0x0040, 0x12ba: 0x0040, 0x12bb: 0x0040, 0x12bc: 0x0040, 0x12bd: 0x0040, 0x12be: 0x0040, 0x12bf: 0x0040, // Block 0x4b, offset 0x12c0 0x12c0: 0x6fb9, 0x12c1: 0x6fd1, 0x12c2: 0x6fe9, 0x12c3: 0x7d15, 0x12c4: 0x7d35, 0x12c5: 0x7001, 0x12c6: 0x7001, 0x12c7: 0x0040, 0x12c8: 0x0040, 0x12c9: 0x0040, 0x12ca: 0x0040, 0x12cb: 0x0040, 0x12cc: 0x0040, 0x12cd: 0x0040, 0x12ce: 0x0040, 0x12cf: 0x0040, 0x12d0: 0x0040, 0x12d1: 0x0040, 0x12d2: 0x0040, 0x12d3: 0x7019, 0x12d4: 0x7041, 0x12d5: 0x7069, 0x12d6: 0x7091, 0x12d7: 0x70b9, 0x12d8: 0x0040, 0x12d9: 0x0040, 0x12da: 0x0040, 0x12db: 0x0040, 0x12dc: 0x0040, 0x12dd: 0x70e1, 0x12de: 0x3308, 0x12df: 0x7109, 0x12e0: 0x7131, 0x12e1: 0x20a9, 0x12e2: 0x20f1, 0x12e3: 0x7149, 0x12e4: 0x7161, 0x12e5: 0x7179, 0x12e6: 0x7191, 0x12e7: 0x71a9, 0x12e8: 0x71c1, 0x12e9: 0x1fb2, 0x12ea: 0x71d9, 0x12eb: 0x7201, 0x12ec: 0x7229, 0x12ed: 0x7261, 0x12ee: 0x7299, 0x12ef: 0x72c1, 0x12f0: 0x72e9, 0x12f1: 0x7311, 0x12f2: 0x7339, 0x12f3: 0x7361, 0x12f4: 0x7389, 0x12f5: 0x73b1, 0x12f6: 0x73d9, 0x12f7: 0x0040, 0x12f8: 0x7401, 0x12f9: 0x7429, 0x12fa: 0x7451, 0x12fb: 0x7479, 0x12fc: 0x74a1, 0x12fd: 0x0040, 0x12fe: 0x74c9, 0x12ff: 0x0040, // Block 0x4c, offset 0x1300 0x1300: 0x74f1, 0x1301: 0x7519, 0x1302: 0x0040, 0x1303: 0x7541, 0x1304: 0x7569, 0x1305: 0x0040, 0x1306: 0x7591, 0x1307: 0x75b9, 0x1308: 0x75e1, 0x1309: 0x7609, 0x130a: 0x7631, 0x130b: 0x7659, 0x130c: 0x7681, 0x130d: 0x76a9, 0x130e: 0x76d1, 0x130f: 0x76f9, 0x1310: 0x7721, 0x1311: 0x7721, 0x1312: 0x7739, 0x1313: 0x7739, 0x1314: 0x7739, 0x1315: 0x7739, 0x1316: 0x7751, 0x1317: 0x7751, 0x1318: 0x7751, 0x1319: 0x7751, 0x131a: 0x7769, 0x131b: 0x7769, 0x131c: 0x7769, 0x131d: 0x7769, 0x131e: 0x7781, 0x131f: 0x7781, 0x1320: 0x7781, 0x1321: 0x7781, 0x1322: 0x7799, 0x1323: 0x7799, 0x1324: 0x7799, 0x1325: 0x7799, 0x1326: 0x77b1, 0x1327: 0x77b1, 0x1328: 0x77b1, 0x1329: 0x77b1, 0x132a: 0x77c9, 0x132b: 0x77c9, 0x132c: 0x77c9, 0x132d: 0x77c9, 0x132e: 0x77e1, 0x132f: 0x77e1, 0x1330: 0x77e1, 0x1331: 0x77e1, 0x1332: 0x77f9, 0x1333: 0x77f9, 0x1334: 0x77f9, 0x1335: 0x77f9, 0x1336: 0x7811, 0x1337: 0x7811, 0x1338: 0x7811, 0x1339: 0x7811, 0x133a: 0x7829, 0x133b: 0x7829, 0x133c: 0x7829, 0x133d: 0x7829, 0x133e: 0x7841, 0x133f: 0x7841, // Block 0x4d, offset 0x1340 0x1340: 0x7841, 0x1341: 0x7841, 0x1342: 0x7859, 0x1343: 0x7859, 0x1344: 0x7871, 0x1345: 0x7871, 0x1346: 0x7889, 0x1347: 0x7889, 0x1348: 0x78a1, 0x1349: 0x78a1, 0x134a: 0x78b9, 0x134b: 0x78b9, 0x134c: 0x78d1, 0x134d: 0x78d1, 0x134e: 0x78e9, 0x134f: 0x78e9, 0x1350: 0x78e9, 0x1351: 0x78e9, 0x1352: 0x7901, 0x1353: 0x7901, 0x1354: 0x7901, 0x1355: 0x7901, 0x1356: 0x7919, 0x1357: 0x7919, 0x1358: 0x7919, 0x1359: 0x7919, 0x135a: 0x7931, 0x135b: 0x7931, 0x135c: 0x7931, 0x135d: 0x7931, 0x135e: 0x7949, 0x135f: 0x7949, 0x1360: 0x7961, 0x1361: 0x7961, 0x1362: 0x7961, 0x1363: 0x7961, 0x1364: 0x7979, 0x1365: 0x7979, 0x1366: 0x7991, 0x1367: 0x7991, 0x1368: 0x7991, 0x1369: 0x7991, 0x136a: 0x79a9, 0x136b: 0x79a9, 0x136c: 0x79a9, 0x136d: 0x79a9, 0x136e: 0x79c1, 0x136f: 0x79c1, 0x1370: 0x79d9, 0x1371: 0x79d9, 0x1372: 0x0818, 0x1373: 0x0818, 0x1374: 0x0818, 0x1375: 0x0818, 0x1376: 0x0818, 0x1377: 0x0818, 0x1378: 0x0818, 0x1379: 0x0818, 0x137a: 0x0818, 0x137b: 0x0818, 0x137c: 0x0818, 0x137d: 0x0818, 0x137e: 0x0818, 0x137f: 0x0818, // Block 0x4e, offset 0x1380 0x1380: 0x0818, 0x1381: 0x0818, 0x1382: 0x0040, 0x1383: 0x0040, 0x1384: 0x0040, 0x1385: 0x0040, 0x1386: 0x0040, 0x1387: 0x0040, 0x1388: 0x0040, 0x1389: 0x0040, 0x138a: 0x0040, 0x138b: 0x0040, 0x138c: 0x0040, 0x138d: 0x0040, 0x138e: 0x0040, 0x138f: 0x0040, 0x1390: 0x0040, 0x1391: 0x0040, 0x1392: 0x0040, 0x1393: 0x79f1, 0x1394: 0x79f1, 0x1395: 0x79f1, 0x1396: 0x79f1, 0x1397: 0x7a09, 0x1398: 0x7a09, 0x1399: 0x7a21, 0x139a: 0x7a21, 0x139b: 0x7a39, 0x139c: 0x7a39, 0x139d: 0x0479, 0x139e: 0x7a51, 0x139f: 0x7a51, 0x13a0: 0x7a69, 0x13a1: 0x7a69, 0x13a2: 0x7a81, 0x13a3: 0x7a81, 0x13a4: 0x7a99, 0x13a5: 0x7a99, 0x13a6: 0x7a99, 0x13a7: 0x7a99, 0x13a8: 0x7ab1, 0x13a9: 0x7ab1, 0x13aa: 0x7ac9, 0x13ab: 0x7ac9, 0x13ac: 0x7af1, 0x13ad: 0x7af1, 0x13ae: 0x7b19, 0x13af: 0x7b19, 0x13b0: 0x7b41, 0x13b1: 0x7b41, 0x13b2: 0x7b69, 0x13b3: 0x7b69, 0x13b4: 0x7b91, 0x13b5: 0x7b91, 0x13b6: 0x7bb9, 0x13b7: 0x7bb9, 0x13b8: 0x7bb9, 0x13b9: 0x7be1, 0x13ba: 0x7be1, 0x13bb: 0x7be1, 0x13bc: 0x7c09, 0x13bd: 0x7c09, 0x13be: 0x7c09, 0x13bf: 0x7c09, // Block 0x4f, offset 0x13c0 0x13c0: 0x85f9, 0x13c1: 0x8621, 0x13c2: 0x8649, 0x13c3: 0x8671, 0x13c4: 0x8699, 0x13c5: 0x86c1, 0x13c6: 0x86e9, 0x13c7: 0x8711, 0x13c8: 0x8739, 0x13c9: 0x8761, 0x13ca: 0x8789, 0x13cb: 0x87b1, 0x13cc: 0x87d9, 0x13cd: 0x8801, 0x13ce: 0x8829, 0x13cf: 0x8851, 0x13d0: 0x8879, 0x13d1: 0x88a1, 0x13d2: 0x88c9, 0x13d3: 0x88f1, 0x13d4: 0x8919, 0x13d5: 0x8941, 0x13d6: 0x8969, 0x13d7: 0x8991, 0x13d8: 0x89b9, 0x13d9: 0x89e1, 0x13da: 0x8a09, 0x13db: 0x8a31, 0x13dc: 0x8a59, 0x13dd: 0x8a81, 0x13de: 0x8aaa, 0x13df: 0x8ada, 0x13e0: 0x8b0a, 0x13e1: 0x8b3a, 0x13e2: 0x8b6a, 0x13e3: 0x8b9a, 0x13e4: 0x8bc9, 0x13e5: 0x8bf1, 0x13e6: 0x7c71, 0x13e7: 0x8c19, 0x13e8: 0x7be1, 0x13e9: 0x7c99, 0x13ea: 0x8c41, 0x13eb: 0x8c69, 0x13ec: 0x7d39, 0x13ed: 0x8c91, 0x13ee: 0x7d61, 0x13ef: 0x7d89, 0x13f0: 0x8cb9, 0x13f1: 0x8ce1, 0x13f2: 0x7e29, 0x13f3: 0x8d09, 0x13f4: 0x7e51, 0x13f5: 0x7e79, 0x13f6: 0x8d31, 0x13f7: 0x8d59, 0x13f8: 0x7ec9, 0x13f9: 0x8d81, 0x13fa: 0x7ef1, 0x13fb: 0x7f19, 0x13fc: 0x83a1, 0x13fd: 0x83c9, 0x13fe: 0x8441, 0x13ff: 0x8469, // Block 0x50, offset 0x1400 0x1400: 0x8491, 0x1401: 0x8531, 0x1402: 0x8559, 0x1403: 0x8581, 0x1404: 0x85a9, 0x1405: 0x8649, 0x1406: 0x8671, 0x1407: 0x8699, 0x1408: 0x8da9, 0x1409: 0x8739, 0x140a: 0x8dd1, 0x140b: 0x8df9, 0x140c: 0x8829, 0x140d: 0x8e21, 0x140e: 0x8851, 0x140f: 0x8879, 0x1410: 0x8a81, 0x1411: 0x8e49, 0x1412: 0x8e71, 0x1413: 0x89b9, 0x1414: 0x8e99, 0x1415: 0x89e1, 0x1416: 0x8a09, 0x1417: 0x7c21, 0x1418: 0x7c49, 0x1419: 0x8ec1, 0x141a: 0x7c71, 0x141b: 0x8ee9, 0x141c: 0x7cc1, 0x141d: 0x7ce9, 0x141e: 0x7d11, 0x141f: 0x7d39, 0x1420: 0x8f11, 0x1421: 0x7db1, 0x1422: 0x7dd9, 0x1423: 0x7e01, 0x1424: 0x7e29, 0x1425: 0x8f39, 0x1426: 0x7ec9, 0x1427: 0x7f41, 0x1428: 0x7f69, 0x1429: 0x7f91, 0x142a: 0x7fb9, 0x142b: 0x7fe1, 0x142c: 0x8031, 0x142d: 0x8059, 0x142e: 0x8081, 0x142f: 0x80a9, 0x1430: 0x80d1, 0x1431: 0x80f9, 0x1432: 0x8f61, 0x1433: 0x8121, 0x1434: 0x8149, 0x1435: 0x8171, 0x1436: 0x8199, 0x1437: 0x81c1, 0x1438: 0x81e9, 0x1439: 0x8239, 0x143a: 0x8261, 0x143b: 0x8289, 0x143c: 0x82b1, 0x143d: 0x82d9, 0x143e: 0x8301, 0x143f: 0x8329, // Block 0x51, offset 0x1440 0x1440: 0x8351, 0x1441: 0x8379, 0x1442: 0x83f1, 0x1443: 0x8419, 0x1444: 0x84b9, 0x1445: 0x84e1, 0x1446: 0x8509, 0x1447: 0x8531, 0x1448: 0x8559, 0x1449: 0x85d1, 0x144a: 0x85f9, 0x144b: 0x8621, 0x144c: 0x8649, 0x144d: 0x8f89, 0x144e: 0x86c1, 0x144f: 0x86e9, 0x1450: 0x8711, 0x1451: 0x8739, 0x1452: 0x87b1, 0x1453: 0x87d9, 0x1454: 0x8801, 0x1455: 0x8829, 0x1456: 0x8fb1, 0x1457: 0x88a1, 0x1458: 0x88c9, 0x1459: 0x8fd9, 0x145a: 0x8941, 0x145b: 0x8969, 0x145c: 0x8991, 0x145d: 0x89b9, 0x145e: 0x9001, 0x145f: 0x7c71, 0x1460: 0x8ee9, 0x1461: 0x7d39, 0x1462: 0x8f11, 0x1463: 0x7e29, 0x1464: 0x8f39, 0x1465: 0x7ec9, 0x1466: 0x9029, 0x1467: 0x80d1, 0x1468: 0x9051, 0x1469: 0x9079, 0x146a: 0x90a1, 0x146b: 0x8531, 0x146c: 0x8559, 0x146d: 0x8649, 0x146e: 0x8829, 0x146f: 0x8fb1, 0x1470: 0x89b9, 0x1471: 0x9001, 0x1472: 0x90c9, 0x1473: 0x9101, 0x1474: 0x9139, 0x1475: 0x9171, 0x1476: 0x9199, 0x1477: 0x91c1, 0x1478: 0x91e9, 0x1479: 0x9211, 0x147a: 0x9239, 0x147b: 0x9261, 0x147c: 0x9289, 0x147d: 0x92b1, 0x147e: 0x92d9, 0x147f: 0x9301, // Block 0x52, offset 0x1480 0x1480: 0x9329, 0x1481: 0x9351, 0x1482: 0x9379, 0x1483: 0x93a1, 0x1484: 0x93c9, 0x1485: 0x93f1, 0x1486: 0x9419, 0x1487: 0x9441, 0x1488: 0x9469, 0x1489: 0x9491, 0x148a: 0x94b9, 0x148b: 0x94e1, 0x148c: 0x9079, 0x148d: 0x9509, 0x148e: 0x9531, 0x148f: 0x9559, 0x1490: 0x9581, 0x1491: 0x9171, 0x1492: 0x9199, 0x1493: 0x91c1, 0x1494: 0x91e9, 0x1495: 0x9211, 0x1496: 0x9239, 0x1497: 0x9261, 0x1498: 0x9289, 0x1499: 0x92b1, 0x149a: 0x92d9, 0x149b: 0x9301, 0x149c: 0x9329, 0x149d: 0x9351, 0x149e: 0x9379, 0x149f: 0x93a1, 0x14a0: 0x93c9, 0x14a1: 0x93f1, 0x14a2: 0x9419, 0x14a3: 0x9441, 0x14a4: 0x9469, 0x14a5: 0x9491, 0x14a6: 0x94b9, 0x14a7: 0x94e1, 0x14a8: 0x9079, 0x14a9: 0x9509, 0x14aa: 0x9531, 0x14ab: 0x9559, 0x14ac: 0x9581, 0x14ad: 0x9491, 0x14ae: 0x94b9, 0x14af: 0x94e1, 0x14b0: 0x9079, 0x14b1: 0x9051, 0x14b2: 0x90a1, 0x14b3: 0x8211, 0x14b4: 0x8059, 0x14b5: 0x8081, 0x14b6: 0x80a9, 0x14b7: 0x9491, 0x14b8: 0x94b9, 0x14b9: 0x94e1, 0x14ba: 0x8211, 0x14bb: 0x8239, 0x14bc: 0x95a9, 0x14bd: 0x95a9, 0x14be: 0x0018, 0x14bf: 0x0018, // Block 0x53, offset 0x14c0 0x14c0: 0x0040, 0x14c1: 0x0040, 0x14c2: 0x0040, 0x14c3: 0x0040, 0x14c4: 0x0040, 0x14c5: 0x0040, 0x14c6: 0x0040, 0x14c7: 0x0040, 0x14c8: 0x0040, 0x14c9: 0x0040, 0x14ca: 0x0040, 0x14cb: 0x0040, 0x14cc: 0x0040, 0x14cd: 0x0040, 0x14ce: 0x0040, 0x14cf: 0x0040, 0x14d0: 0x95d1, 0x14d1: 0x9609, 0x14d2: 0x9609, 0x14d3: 0x9641, 0x14d4: 0x9679, 0x14d5: 0x96b1, 0x14d6: 0x96e9, 0x14d7: 0x9721, 0x14d8: 0x9759, 0x14d9: 0x9759, 0x14da: 0x9791, 0x14db: 0x97c9, 0x14dc: 0x9801, 0x14dd: 0x9839, 0x14de: 0x9871, 0x14df: 0x98a9, 0x14e0: 0x98a9, 0x14e1: 0x98e1, 0x14e2: 0x9919, 0x14e3: 0x9919, 0x14e4: 0x9951, 0x14e5: 0x9951, 0x14e6: 0x9989, 0x14e7: 0x99c1, 0x14e8: 0x99c1, 0x14e9: 0x99f9, 0x14ea: 0x9a31, 0x14eb: 0x9a31, 0x14ec: 0x9a69, 0x14ed: 0x9a69, 0x14ee: 0x9aa1, 0x14ef: 0x9ad9, 0x14f0: 0x9ad9, 0x14f1: 0x9b11, 0x14f2: 0x9b11, 0x14f3: 0x9b49, 0x14f4: 0x9b81, 0x14f5: 0x9bb9, 0x14f6: 0x9bf1, 0x14f7: 0x9bf1, 0x14f8: 0x9c29, 0x14f9: 0x9c61, 0x14fa: 0x9c99, 0x14fb: 0x9cd1, 0x14fc: 0x9d09, 0x14fd: 0x9d09, 0x14fe: 0x9d41, 0x14ff: 0x9d79, // Block 0x54, offset 0x1500 0x1500: 0xa949, 0x1501: 0xa981, 0x1502: 0xa9b9, 0x1503: 0xa8a1, 0x1504: 0x9bb9, 0x1505: 0x9989, 0x1506: 0xa9f1, 0x1507: 0xaa29, 0x1508: 0x0040, 0x1509: 0x0040, 0x150a: 0x0040, 0x150b: 0x0040, 0x150c: 0x0040, 0x150d: 0x0040, 0x150e: 0x0040, 0x150f: 0x0040, 0x1510: 0x0040, 0x1511: 0x0040, 0x1512: 0x0040, 0x1513: 0x0040, 0x1514: 0x0040, 0x1515: 0x0040, 0x1516: 0x0040, 0x1517: 0x0040, 0x1518: 0x0040, 0x1519: 0x0040, 0x151a: 0x0040, 0x151b: 0x0040, 0x151c: 0x0040, 0x151d: 0x0040, 0x151e: 0x0040, 0x151f: 0x0040, 0x1520: 0x0040, 0x1521: 0x0040, 0x1522: 0x0040, 0x1523: 0x0040, 0x1524: 0x0040, 0x1525: 0x0040, 0x1526: 0x0040, 0x1527: 0x0040, 0x1528: 0x0040, 0x1529: 0x0040, 0x152a: 0x0040, 0x152b: 0x0040, 0x152c: 0x0040, 0x152d: 0x0040, 0x152e: 0x0040, 0x152f: 0x0040, 0x1530: 0xaa61, 0x1531: 0xaa99, 0x1532: 0xaad1, 0x1533: 0xab19, 0x1534: 0xab61, 0x1535: 0xaba9, 0x1536: 0xabf1, 0x1537: 0xac39, 0x1538: 0xac81, 0x1539: 0xacc9, 0x153a: 0xad02, 0x153b: 0xae12, 0x153c: 0xae91, 0x153d: 0x0018, 0x153e: 0x0040, 0x153f: 0x0040, // Block 0x55, offset 0x1540 0x1540: 0x33c0, 0x1541: 0x33c0, 0x1542: 0x33c0, 0x1543: 0x33c0, 0x1544: 0x33c0, 0x1545: 0x33c0, 0x1546: 0x33c0, 0x1547: 0x33c0, 0x1548: 0x33c0, 0x1549: 0x33c0, 0x154a: 0x33c0, 0x154b: 0x33c0, 0x154c: 0x33c0, 0x154d: 0x33c0, 0x154e: 0x33c0, 0x154f: 0x33c0, 0x1550: 0xaeda, 0x1551: 0x7d55, 0x1552: 0x0040, 0x1553: 0xaeea, 0x1554: 0x03c2, 0x1555: 0xaefa, 0x1556: 0xaf0a, 0x1557: 0x7d75, 0x1558: 0x7d95, 0x1559: 0x0040, 0x155a: 0x0040, 0x155b: 0x0040, 0x155c: 0x0040, 0x155d: 0x0040, 0x155e: 0x0040, 0x155f: 0x0040, 0x1560: 0x3308, 0x1561: 0x3308, 0x1562: 0x3308, 0x1563: 0x3308, 0x1564: 0x3308, 0x1565: 0x3308, 0x1566: 0x3308, 0x1567: 0x3308, 0x1568: 0x3308, 0x1569: 0x3308, 0x156a: 0x3308, 0x156b: 0x3308, 0x156c: 0x3308, 0x156d: 0x3308, 0x156e: 0x3308, 0x156f: 0x3308, 0x1570: 0x0040, 0x1571: 0x7db5, 0x1572: 0x7dd5, 0x1573: 0xaf1a, 0x1574: 0xaf1a, 0x1575: 0x1fd2, 0x1576: 0x1fe2, 0x1577: 0xaf2a, 0x1578: 0xaf3a, 0x1579: 0x7df5, 0x157a: 0x7e15, 0x157b: 0x7e35, 0x157c: 0x7df5, 0x157d: 0x7e55, 0x157e: 0x7e75, 0x157f: 0x7e55, // Block 0x56, offset 0x1580 0x1580: 0x7e95, 0x1581: 0x7eb5, 0x1582: 0x7ed5, 0x1583: 0x7eb5, 0x1584: 0x7ef5, 0x1585: 0x0018, 0x1586: 0x0018, 0x1587: 0xaf4a, 0x1588: 0xaf5a, 0x1589: 0x7f16, 0x158a: 0x7f36, 0x158b: 0x7f56, 0x158c: 0x7f76, 0x158d: 0xaf1a, 0x158e: 0xaf1a, 0x158f: 0xaf1a, 0x1590: 0xaeda, 0x1591: 0x7f95, 0x1592: 0x0040, 0x1593: 0x0040, 0x1594: 0x03c2, 0x1595: 0xaeea, 0x1596: 0xaf0a, 0x1597: 0xaefa, 0x1598: 0x7fb5, 0x1599: 0x1fd2, 0x159a: 0x1fe2, 0x159b: 0xaf2a, 0x159c: 0xaf3a, 0x159d: 0x7e95, 0x159e: 0x7ef5, 0x159f: 0xaf6a, 0x15a0: 0xaf7a, 0x15a1: 0xaf8a, 0x15a2: 0x1fb2, 0x15a3: 0xaf99, 0x15a4: 0xafaa, 0x15a5: 0xafba, 0x15a6: 0x1fc2, 0x15a7: 0x0040, 0x15a8: 0xafca, 0x15a9: 0xafda, 0x15aa: 0xafea, 0x15ab: 0xaffa, 0x15ac: 0x0040, 0x15ad: 0x0040, 0x15ae: 0x0040, 0x15af: 0x0040, 0x15b0: 0x7fd6, 0x15b1: 0xb009, 0x15b2: 0x7ff6, 0x15b3: 0x0808, 0x15b4: 0x8016, 0x15b5: 0x0040, 0x15b6: 0x8036, 0x15b7: 0xb031, 0x15b8: 0x8056, 0x15b9: 0xb059, 0x15ba: 0x8076, 0x15bb: 0xb081, 0x15bc: 0x8096, 0x15bd: 0xb0a9, 0x15be: 0x80b6, 0x15bf: 0xb0d1, // Block 0x57, offset 0x15c0 0x15c0: 0xb0f9, 0x15c1: 0xb111, 0x15c2: 0xb111, 0x15c3: 0xb129, 0x15c4: 0xb129, 0x15c5: 0xb141, 0x15c6: 0xb141, 0x15c7: 0xb159, 0x15c8: 0xb159, 0x15c9: 0xb171, 0x15ca: 0xb171, 0x15cb: 0xb171, 0x15cc: 0xb171, 0x15cd: 0xb189, 0x15ce: 0xb189, 0x15cf: 0xb1a1, 0x15d0: 0xb1a1, 0x15d1: 0xb1a1, 0x15d2: 0xb1a1, 0x15d3: 0xb1b9, 0x15d4: 0xb1b9, 0x15d5: 0xb1d1, 0x15d6: 0xb1d1, 0x15d7: 0xb1d1, 0x15d8: 0xb1d1, 0x15d9: 0xb1e9, 0x15da: 0xb1e9, 0x15db: 0xb1e9, 0x15dc: 0xb1e9, 0x15dd: 0xb201, 0x15de: 0xb201, 0x15df: 0xb201, 0x15e0: 0xb201, 0x15e1: 0xb219, 0x15e2: 0xb219, 0x15e3: 0xb219, 0x15e4: 0xb219, 0x15e5: 0xb231, 0x15e6: 0xb231, 0x15e7: 0xb231, 0x15e8: 0xb231, 0x15e9: 0xb249, 0x15ea: 0xb249, 0x15eb: 0xb261, 0x15ec: 0xb261, 0x15ed: 0xb279, 0x15ee: 0xb279, 0x15ef: 0xb291, 0x15f0: 0xb291, 0x15f1: 0xb2a9, 0x15f2: 0xb2a9, 0x15f3: 0xb2a9, 0x15f4: 0xb2a9, 0x15f5: 0xb2c1, 0x15f6: 0xb2c1, 0x15f7: 0xb2c1, 0x15f8: 0xb2c1, 0x15f9: 0xb2d9, 0x15fa: 0xb2d9, 0x15fb: 0xb2d9, 0x15fc: 0xb2d9, 0x15fd: 0xb2f1, 0x15fe: 0xb2f1, 0x15ff: 0xb2f1, // Block 0x58, offset 0x1600 0x1600: 0xb2f1, 0x1601: 0xb309, 0x1602: 0xb309, 0x1603: 0xb309, 0x1604: 0xb309, 0x1605: 0xb321, 0x1606: 0xb321, 0x1607: 0xb321, 0x1608: 0xb321, 0x1609: 0xb339, 0x160a: 0xb339, 0x160b: 0xb339, 0x160c: 0xb339, 0x160d: 0xb351, 0x160e: 0xb351, 0x160f: 0xb351, 0x1610: 0xb351, 0x1611: 0xb369, 0x1612: 0xb369, 0x1613: 0xb369, 0x1614: 0xb369, 0x1615: 0xb381, 0x1616: 0xb381, 0x1617: 0xb381, 0x1618: 0xb381, 0x1619: 0xb399, 0x161a: 0xb399, 0x161b: 0xb399, 0x161c: 0xb399, 0x161d: 0xb3b1, 0x161e: 0xb3b1, 0x161f: 0xb3b1, 0x1620: 0xb3b1, 0x1621: 0xb3c9, 0x1622: 0xb3c9, 0x1623: 0xb3c9, 0x1624: 0xb3c9, 0x1625: 0xb3e1, 0x1626: 0xb3e1, 0x1627: 0xb3e1, 0x1628: 0xb3e1, 0x1629: 0xb3f9, 0x162a: 0xb3f9, 0x162b: 0xb3f9, 0x162c: 0xb3f9, 0x162d: 0xb411, 0x162e: 0xb411, 0x162f: 0x7ab1, 0x1630: 0x7ab1, 0x1631: 0xb429, 0x1632: 0xb429, 0x1633: 0xb429, 0x1634: 0xb429, 0x1635: 0xb441, 0x1636: 0xb441, 0x1637: 0xb469, 0x1638: 0xb469, 0x1639: 0xb491, 0x163a: 0xb491, 0x163b: 0xb4b9, 0x163c: 0xb4b9, 0x163d: 0x0040, 0x163e: 0x0040, 0x163f: 0x03c0, // Block 0x59, offset 0x1640 0x1640: 0x0040, 0x1641: 0xaefa, 0x1642: 0xb4e2, 0x1643: 0xaf6a, 0x1644: 0xafda, 0x1645: 0xafea, 0x1646: 0xaf7a, 0x1647: 0xb4f2, 0x1648: 0x1fd2, 0x1649: 0x1fe2, 0x164a: 0xaf8a, 0x164b: 0x1fb2, 0x164c: 0xaeda, 0x164d: 0xaf99, 0x164e: 0x29d1, 0x164f: 0xb502, 0x1650: 0x1f41, 0x1651: 0x00c9, 0x1652: 0x0069, 0x1653: 0x0079, 0x1654: 0x1f51, 0x1655: 0x1f61, 0x1656: 0x1f71, 0x1657: 0x1f81, 0x1658: 0x1f91, 0x1659: 0x1fa1, 0x165a: 0xaeea, 0x165b: 0x03c2, 0x165c: 0xafaa, 0x165d: 0x1fc2, 0x165e: 0xafba, 0x165f: 0xaf0a, 0x1660: 0xaffa, 0x1661: 0x0039, 0x1662: 0x0ee9, 0x1663: 0x1159, 0x1664: 0x0ef9, 0x1665: 0x0f09, 0x1666: 0x1199, 0x1667: 0x0f31, 0x1668: 0x0249, 0x1669: 0x0f41, 0x166a: 0x0259, 0x166b: 0x0f51, 0x166c: 0x0359, 0x166d: 0x0f61, 0x166e: 0x0f71, 0x166f: 0x00d9, 0x1670: 0x0f99, 0x1671: 0x2039, 0x1672: 0x0269, 0x1673: 0x01d9, 0x1674: 0x0fa9, 0x1675: 0x0fb9, 0x1676: 0x1089, 0x1677: 0x0279, 0x1678: 0x0369, 0x1679: 0x0289, 0x167a: 0x13d1, 0x167b: 0xaf4a, 0x167c: 0xafca, 0x167d: 0xaf5a, 0x167e: 0xb512, 0x167f: 0xaf1a, // Block 0x5a, offset 0x1680 0x1680: 0x1caa, 0x1681: 0x0039, 0x1682: 0x0ee9, 0x1683: 0x1159, 0x1684: 0x0ef9, 0x1685: 0x0f09, 0x1686: 0x1199, 0x1687: 0x0f31, 0x1688: 0x0249, 0x1689: 0x0f41, 0x168a: 0x0259, 0x168b: 0x0f51, 0x168c: 0x0359, 0x168d: 0x0f61, 0x168e: 0x0f71, 0x168f: 0x00d9, 0x1690: 0x0f99, 0x1691: 0x2039, 0x1692: 0x0269, 0x1693: 0x01d9, 0x1694: 0x0fa9, 0x1695: 0x0fb9, 0x1696: 0x1089, 0x1697: 0x0279, 0x1698: 0x0369, 0x1699: 0x0289, 0x169a: 0x13d1, 0x169b: 0xaf2a, 0x169c: 0xb522, 0x169d: 0xaf3a, 0x169e: 0xb532, 0x169f: 0x80d5, 0x16a0: 0x80f5, 0x16a1: 0x29d1, 0x16a2: 0x8115, 0x16a3: 0x8115, 0x16a4: 0x8135, 0x16a5: 0x8155, 0x16a6: 0x8175, 0x16a7: 0x8195, 0x16a8: 0x81b5, 0x16a9: 0x81d5, 0x16aa: 0x81f5, 0x16ab: 0x8215, 0x16ac: 0x8235, 0x16ad: 0x8255, 0x16ae: 0x8275, 0x16af: 0x8295, 0x16b0: 0x82b5, 0x16b1: 0x82d5, 0x16b2: 0x82f5, 0x16b3: 0x8315, 0x16b4: 0x8335, 0x16b5: 0x8355, 0x16b6: 0x8375, 0x16b7: 0x8395, 0x16b8: 0x83b5, 0x16b9: 0x83d5, 0x16ba: 0x83f5, 0x16bb: 0x8415, 0x16bc: 0x81b5, 0x16bd: 0x8435, 0x16be: 0x8455, 0x16bf: 0x8215, // Block 0x5b, offset 0x16c0 0x16c0: 0x8475, 0x16c1: 0x8495, 0x16c2: 0x84b5, 0x16c3: 0x84d5, 0x16c4: 0x84f5, 0x16c5: 0x8515, 0x16c6: 0x8535, 0x16c7: 0x8555, 0x16c8: 0x84d5, 0x16c9: 0x8575, 0x16ca: 0x84d5, 0x16cb: 0x8595, 0x16cc: 0x8595, 0x16cd: 0x85b5, 0x16ce: 0x85b5, 0x16cf: 0x85d5, 0x16d0: 0x8515, 0x16d1: 0x85f5, 0x16d2: 0x8615, 0x16d3: 0x85f5, 0x16d4: 0x8635, 0x16d5: 0x8615, 0x16d6: 0x8655, 0x16d7: 0x8655, 0x16d8: 0x8675, 0x16d9: 0x8675, 0x16da: 0x8695, 0x16db: 0x8695, 0x16dc: 0x8615, 0x16dd: 0x8115, 0x16de: 0x86b5, 0x16df: 0x86d5, 0x16e0: 0x0040, 0x16e1: 0x86f5, 0x16e2: 0x8715, 0x16e3: 0x8735, 0x16e4: 0x8755, 0x16e5: 0x8735, 0x16e6: 0x8775, 0x16e7: 0x8795, 0x16e8: 0x87b5, 0x16e9: 0x87b5, 0x16ea: 0x87d5, 0x16eb: 0x87d5, 0x16ec: 0x87f5, 0x16ed: 0x87f5, 0x16ee: 0x87d5, 0x16ef: 0x87d5, 0x16f0: 0x8815, 0x16f1: 0x8835, 0x16f2: 0x8855, 0x16f3: 0x8875, 0x16f4: 0x8895, 0x16f5: 0x88b5, 0x16f6: 0x88b5, 0x16f7: 0x88b5, 0x16f8: 0x88d5, 0x16f9: 0x88d5, 0x16fa: 0x88d5, 0x16fb: 0x88d5, 0x16fc: 0x87b5, 0x16fd: 0x87b5, 0x16fe: 0x87b5, 0x16ff: 0x0040, // Block 0x5c, offset 0x1700 0x1700: 0x0040, 0x1701: 0x0040, 0x1702: 0x8715, 0x1703: 0x86f5, 0x1704: 0x88f5, 0x1705: 0x86f5, 0x1706: 0x8715, 0x1707: 0x86f5, 0x1708: 0x0040, 0x1709: 0x0040, 0x170a: 0x8915, 0x170b: 0x8715, 0x170c: 0x8935, 0x170d: 0x88f5, 0x170e: 0x8935, 0x170f: 0x8715, 0x1710: 0x0040, 0x1711: 0x0040, 0x1712: 0x8955, 0x1713: 0x8975, 0x1714: 0x8875, 0x1715: 0x8935, 0x1716: 0x88f5, 0x1717: 0x8935, 0x1718: 0x0040, 0x1719: 0x0040, 0x171a: 0x8995, 0x171b: 0x89b5, 0x171c: 0x8995, 0x171d: 0x0040, 0x171e: 0x0040, 0x171f: 0x0040, 0x1720: 0xb541, 0x1721: 0xb559, 0x1722: 0xb571, 0x1723: 0x89d6, 0x1724: 0xb589, 0x1725: 0xb5a1, 0x1726: 0x89f5, 0x1727: 0x0040, 0x1728: 0x8a15, 0x1729: 0x8a35, 0x172a: 0x8a55, 0x172b: 0x8a35, 0x172c: 0x8a75, 0x172d: 0x8a95, 0x172e: 0x8ab5, 0x172f: 0x0040, 0x1730: 0x0040, 0x1731: 0x0040, 0x1732: 0x0040, 0x1733: 0x0040, 0x1734: 0x0040, 0x1735: 0x0040, 0x1736: 0x0040, 0x1737: 0x0040, 0x1738: 0x0040, 0x1739: 0x0340, 0x173a: 0x0340, 0x173b: 0x0340, 0x173c: 0x0040, 0x173d: 0x0040, 0x173e: 0x0040, 0x173f: 0x0040, // Block 0x5d, offset 0x1740 0x1740: 0x0a08, 0x1741: 0x0a08, 0x1742: 0x0a08, 0x1743: 0x0a08, 0x1744: 0x0a08, 0x1745: 0x0c08, 0x1746: 0x0808, 0x1747: 0x0c08, 0x1748: 0x0818, 0x1749: 0x0c08, 0x174a: 0x0c08, 0x174b: 0x0808, 0x174c: 0x0808, 0x174d: 0x0908, 0x174e: 0x0c08, 0x174f: 0x0c08, 0x1750: 0x0c08, 0x1751: 0x0c08, 0x1752: 0x0c08, 0x1753: 0x0a08, 0x1754: 0x0a08, 0x1755: 0x0a08, 0x1756: 0x0a08, 0x1757: 0x0908, 0x1758: 0x0a08, 0x1759: 0x0a08, 0x175a: 0x0a08, 0x175b: 0x0a08, 0x175c: 0x0a08, 0x175d: 0x0c08, 0x175e: 0x0a08, 0x175f: 0x0a08, 0x1760: 0x0a08, 0x1761: 0x0c08, 0x1762: 0x0808, 0x1763: 0x0808, 0x1764: 0x0c08, 0x1765: 0x3308, 0x1766: 0x3308, 0x1767: 0x0040, 0x1768: 0x0040, 0x1769: 0x0040, 0x176a: 0x0040, 0x176b: 0x0a18, 0x176c: 0x0a18, 0x176d: 0x0a18, 0x176e: 0x0a18, 0x176f: 0x0c18, 0x1770: 0x0818, 0x1771: 0x0818, 0x1772: 0x0818, 0x1773: 0x0818, 0x1774: 0x0818, 0x1775: 0x0818, 0x1776: 0x0818, 0x1777: 0x0040, 0x1778: 0x0040, 0x1779: 0x0040, 0x177a: 0x0040, 0x177b: 0x0040, 0x177c: 0x0040, 0x177d: 0x0040, 0x177e: 0x0040, 0x177f: 0x0040, // Block 0x5e, offset 0x1780 0x1780: 0x0a08, 0x1781: 0x0c08, 0x1782: 0x0a08, 0x1783: 0x0c08, 0x1784: 0x0c08, 0x1785: 0x0c08, 0x1786: 0x0a08, 0x1787: 0x0a08, 0x1788: 0x0a08, 0x1789: 0x0c08, 0x178a: 0x0a08, 0x178b: 0x0a08, 0x178c: 0x0c08, 0x178d: 0x0a08, 0x178e: 0x0c08, 0x178f: 0x0c08, 0x1790: 0x0a08, 0x1791: 0x0c08, 0x1792: 0x0040, 0x1793: 0x0040, 0x1794: 0x0040, 0x1795: 0x0040, 0x1796: 0x0040, 0x1797: 0x0040, 0x1798: 0x0040, 0x1799: 0x0818, 0x179a: 0x0818, 0x179b: 0x0818, 0x179c: 0x0818, 0x179d: 0x0040, 0x179e: 0x0040, 0x179f: 0x0040, 0x17a0: 0x0040, 0x17a1: 0x0040, 0x17a2: 0x0040, 0x17a3: 0x0040, 0x17a4: 0x0040, 0x17a5: 0x0040, 0x17a6: 0x0040, 0x17a7: 0x0040, 0x17a8: 0x0040, 0x17a9: 0x0c18, 0x17aa: 0x0c18, 0x17ab: 0x0c18, 0x17ac: 0x0c18, 0x17ad: 0x0a18, 0x17ae: 0x0a18, 0x17af: 0x0818, 0x17b0: 0x0040, 0x17b1: 0x0040, 0x17b2: 0x0040, 0x17b3: 0x0040, 0x17b4: 0x0040, 0x17b5: 0x0040, 0x17b6: 0x0040, 0x17b7: 0x0040, 0x17b8: 0x0040, 0x17b9: 0x0040, 0x17ba: 0x0040, 0x17bb: 0x0040, 0x17bc: 0x0040, 0x17bd: 0x0040, 0x17be: 0x0040, 0x17bf: 0x0040, // Block 0x5f, offset 0x17c0 0x17c0: 0x3308, 0x17c1: 0x3308, 0x17c2: 0x3008, 0x17c3: 0x3008, 0x17c4: 0x0040, 0x17c5: 0x0008, 0x17c6: 0x0008, 0x17c7: 0x0008, 0x17c8: 0x0008, 0x17c9: 0x0008, 0x17ca: 0x0008, 0x17cb: 0x0008, 0x17cc: 0x0008, 0x17cd: 0x0040, 0x17ce: 0x0040, 0x17cf: 0x0008, 0x17d0: 0x0008, 0x17d1: 0x0040, 0x17d2: 0x0040, 0x17d3: 0x0008, 0x17d4: 0x0008, 0x17d5: 0x0008, 0x17d6: 0x0008, 0x17d7: 0x0008, 0x17d8: 0x0008, 0x17d9: 0x0008, 0x17da: 0x0008, 0x17db: 0x0008, 0x17dc: 0x0008, 0x17dd: 0x0008, 0x17de: 0x0008, 0x17df: 0x0008, 0x17e0: 0x0008, 0x17e1: 0x0008, 0x17e2: 0x0008, 0x17e3: 0x0008, 0x17e4: 0x0008, 0x17e5: 0x0008, 0x17e6: 0x0008, 0x17e7: 0x0008, 0x17e8: 0x0008, 0x17e9: 0x0040, 0x17ea: 0x0008, 0x17eb: 0x0008, 0x17ec: 0x0008, 0x17ed: 0x0008, 0x17ee: 0x0008, 0x17ef: 0x0008, 0x17f0: 0x0008, 0x17f1: 0x0040, 0x17f2: 0x0008, 0x17f3: 0x0008, 0x17f4: 0x0040, 0x17f5: 0x0008, 0x17f6: 0x0008, 0x17f7: 0x0008, 0x17f8: 0x0008, 0x17f9: 0x0008, 0x17fa: 0x0040, 0x17fb: 0x0040, 0x17fc: 0x3308, 0x17fd: 0x0008, 0x17fe: 0x3008, 0x17ff: 0x3008, // Block 0x60, offset 0x1800 0x1800: 0x3308, 0x1801: 0x3008, 0x1802: 0x3008, 0x1803: 0x3008, 0x1804: 0x3008, 0x1805: 0x0040, 0x1806: 0x0040, 0x1807: 0x3008, 0x1808: 0x3008, 0x1809: 0x0040, 0x180a: 0x0040, 0x180b: 0x3008, 0x180c: 0x3008, 0x180d: 0x3808, 0x180e: 0x0040, 0x180f: 0x0040, 0x1810: 0x0008, 0x1811: 0x0040, 0x1812: 0x0040, 0x1813: 0x0040, 0x1814: 0x0040, 0x1815: 0x0040, 0x1816: 0x0040, 0x1817: 0x3008, 0x1818: 0x0040, 0x1819: 0x0040, 0x181a: 0x0040, 0x181b: 0x0040, 0x181c: 0x0040, 0x181d: 0x0008, 0x181e: 0x0008, 0x181f: 0x0008, 0x1820: 0x0008, 0x1821: 0x0008, 0x1822: 0x3008, 0x1823: 0x3008, 0x1824: 0x0040, 0x1825: 0x0040, 0x1826: 0x3308, 0x1827: 0x3308, 0x1828: 0x3308, 0x1829: 0x3308, 0x182a: 0x3308, 0x182b: 0x3308, 0x182c: 0x3308, 0x182d: 0x0040, 0x182e: 0x0040, 0x182f: 0x0040, 0x1830: 0x3308, 0x1831: 0x3308, 0x1832: 0x3308, 0x1833: 0x3308, 0x1834: 0x3308, 0x1835: 0x0040, 0x1836: 0x0040, 0x1837: 0x0040, 0x1838: 0x0040, 0x1839: 0x0040, 0x183a: 0x0040, 0x183b: 0x0040, 0x183c: 0x0040, 0x183d: 0x0040, 0x183e: 0x0040, 0x183f: 0x0040, // Block 0x61, offset 0x1840 0x1840: 0x0039, 0x1841: 0x0ee9, 0x1842: 0x1159, 0x1843: 0x0ef9, 0x1844: 0x0f09, 0x1845: 0x1199, 0x1846: 0x0f31, 0x1847: 0x0249, 0x1848: 0x0f41, 0x1849: 0x0259, 0x184a: 0x0f51, 0x184b: 0x0359, 0x184c: 0x0f61, 0x184d: 0x0f71, 0x184e: 0x00d9, 0x184f: 0x0f99, 0x1850: 0x2039, 0x1851: 0x0269, 0x1852: 0x01d9, 0x1853: 0x0fa9, 0x1854: 0x0fb9, 0x1855: 0x1089, 0x1856: 0x0279, 0x1857: 0x0369, 0x1858: 0x0289, 0x1859: 0x13d1, 0x185a: 0x0039, 0x185b: 0x0ee9, 0x185c: 0x1159, 0x185d: 0x0ef9, 0x185e: 0x0f09, 0x185f: 0x1199, 0x1860: 0x0f31, 0x1861: 0x0249, 0x1862: 0x0f41, 0x1863: 0x0259, 0x1864: 0x0f51, 0x1865: 0x0359, 0x1866: 0x0f61, 0x1867: 0x0f71, 0x1868: 0x00d9, 0x1869: 0x0f99, 0x186a: 0x2039, 0x186b: 0x0269, 0x186c: 0x01d9, 0x186d: 0x0fa9, 0x186e: 0x0fb9, 0x186f: 0x1089, 0x1870: 0x0279, 0x1871: 0x0369, 0x1872: 0x0289, 0x1873: 0x13d1, 0x1874: 0x0039, 0x1875: 0x0ee9, 0x1876: 0x1159, 0x1877: 0x0ef9, 0x1878: 0x0f09, 0x1879: 0x1199, 0x187a: 0x0f31, 0x187b: 0x0249, 0x187c: 0x0f41, 0x187d: 0x0259, 0x187e: 0x0f51, 0x187f: 0x0359, // Block 0x62, offset 0x1880 0x1880: 0x0f61, 0x1881: 0x0f71, 0x1882: 0x00d9, 0x1883: 0x0f99, 0x1884: 0x2039, 0x1885: 0x0269, 0x1886: 0x01d9, 0x1887: 0x0fa9, 0x1888: 0x0fb9, 0x1889: 0x1089, 0x188a: 0x0279, 0x188b: 0x0369, 0x188c: 0x0289, 0x188d: 0x13d1, 0x188e: 0x0039, 0x188f: 0x0ee9, 0x1890: 0x1159, 0x1891: 0x0ef9, 0x1892: 0x0f09, 0x1893: 0x1199, 0x1894: 0x0f31, 0x1895: 0x0040, 0x1896: 0x0f41, 0x1897: 0x0259, 0x1898: 0x0f51, 0x1899: 0x0359, 0x189a: 0x0f61, 0x189b: 0x0f71, 0x189c: 0x00d9, 0x189d: 0x0f99, 0x189e: 0x2039, 0x189f: 0x0269, 0x18a0: 0x01d9, 0x18a1: 0x0fa9, 0x18a2: 0x0fb9, 0x18a3: 0x1089, 0x18a4: 0x0279, 0x18a5: 0x0369, 0x18a6: 0x0289, 0x18a7: 0x13d1, 0x18a8: 0x0039, 0x18a9: 0x0ee9, 0x18aa: 0x1159, 0x18ab: 0x0ef9, 0x18ac: 0x0f09, 0x18ad: 0x1199, 0x18ae: 0x0f31, 0x18af: 0x0249, 0x18b0: 0x0f41, 0x18b1: 0x0259, 0x18b2: 0x0f51, 0x18b3: 0x0359, 0x18b4: 0x0f61, 0x18b5: 0x0f71, 0x18b6: 0x00d9, 0x18b7: 0x0f99, 0x18b8: 0x2039, 0x18b9: 0x0269, 0x18ba: 0x01d9, 0x18bb: 0x0fa9, 0x18bc: 0x0fb9, 0x18bd: 0x1089, 0x18be: 0x0279, 0x18bf: 0x0369, // Block 0x63, offset 0x18c0 0x18c0: 0x0289, 0x18c1: 0x13d1, 0x18c2: 0x0039, 0x18c3: 0x0ee9, 0x18c4: 0x1159, 0x18c5: 0x0ef9, 0x18c6: 0x0f09, 0x18c7: 0x1199, 0x18c8: 0x0f31, 0x18c9: 0x0249, 0x18ca: 0x0f41, 0x18cb: 0x0259, 0x18cc: 0x0f51, 0x18cd: 0x0359, 0x18ce: 0x0f61, 0x18cf: 0x0f71, 0x18d0: 0x00d9, 0x18d1: 0x0f99, 0x18d2: 0x2039, 0x18d3: 0x0269, 0x18d4: 0x01d9, 0x18d5: 0x0fa9, 0x18d6: 0x0fb9, 0x18d7: 0x1089, 0x18d8: 0x0279, 0x18d9: 0x0369, 0x18da: 0x0289, 0x18db: 0x13d1, 0x18dc: 0x0039, 0x18dd: 0x0040, 0x18de: 0x1159, 0x18df: 0x0ef9, 0x18e0: 0x0040, 0x18e1: 0x0040, 0x18e2: 0x0f31, 0x18e3: 0x0040, 0x18e4: 0x0040, 0x18e5: 0x0259, 0x18e6: 0x0f51, 0x18e7: 0x0040, 0x18e8: 0x0040, 0x18e9: 0x0f71, 0x18ea: 0x00d9, 0x18eb: 0x0f99, 0x18ec: 0x2039, 0x18ed: 0x0040, 0x18ee: 0x01d9, 0x18ef: 0x0fa9, 0x18f0: 0x0fb9, 0x18f1: 0x1089, 0x18f2: 0x0279, 0x18f3: 0x0369, 0x18f4: 0x0289, 0x18f5: 0x13d1, 0x18f6: 0x0039, 0x18f7: 0x0ee9, 0x18f8: 0x1159, 0x18f9: 0x0ef9, 0x18fa: 0x0040, 0x18fb: 0x1199, 0x18fc: 0x0040, 0x18fd: 0x0249, 0x18fe: 0x0f41, 0x18ff: 0x0259, // Block 0x64, offset 0x1900 0x1900: 0x0f51, 0x1901: 0x0359, 0x1902: 0x0f61, 0x1903: 0x0f71, 0x1904: 0x0040, 0x1905: 0x0f99, 0x1906: 0x2039, 0x1907: 0x0269, 0x1908: 0x01d9, 0x1909: 0x0fa9, 0x190a: 0x0fb9, 0x190b: 0x1089, 0x190c: 0x0279, 0x190d: 0x0369, 0x190e: 0x0289, 0x190f: 0x13d1, 0x1910: 0x0039, 0x1911: 0x0ee9, 0x1912: 0x1159, 0x1913: 0x0ef9, 0x1914: 0x0f09, 0x1915: 0x1199, 0x1916: 0x0f31, 0x1917: 0x0249, 0x1918: 0x0f41, 0x1919: 0x0259, 0x191a: 0x0f51, 0x191b: 0x0359, 0x191c: 0x0f61, 0x191d: 0x0f71, 0x191e: 0x00d9, 0x191f: 0x0f99, 0x1920: 0x2039, 0x1921: 0x0269, 0x1922: 0x01d9, 0x1923: 0x0fa9, 0x1924: 0x0fb9, 0x1925: 0x1089, 0x1926: 0x0279, 0x1927: 0x0369, 0x1928: 0x0289, 0x1929: 0x13d1, 0x192a: 0x0039, 0x192b: 0x0ee9, 0x192c: 0x1159, 0x192d: 0x0ef9, 0x192e: 0x0f09, 0x192f: 0x1199, 0x1930: 0x0f31, 0x1931: 0x0249, 0x1932: 0x0f41, 0x1933: 0x0259, 0x1934: 0x0f51, 0x1935: 0x0359, 0x1936: 0x0f61, 0x1937: 0x0f71, 0x1938: 0x00d9, 0x1939: 0x0f99, 0x193a: 0x2039, 0x193b: 0x0269, 0x193c: 0x01d9, 0x193d: 0x0fa9, 0x193e: 0x0fb9, 0x193f: 0x1089, // Block 0x65, offset 0x1940 0x1940: 0x0279, 0x1941: 0x0369, 0x1942: 0x0289, 0x1943: 0x13d1, 0x1944: 0x0039, 0x1945: 0x0ee9, 0x1946: 0x0040, 0x1947: 0x0ef9, 0x1948: 0x0f09, 0x1949: 0x1199, 0x194a: 0x0f31, 0x194b: 0x0040, 0x194c: 0x0040, 0x194d: 0x0259, 0x194e: 0x0f51, 0x194f: 0x0359, 0x1950: 0x0f61, 0x1951: 0x0f71, 0x1952: 0x00d9, 0x1953: 0x0f99, 0x1954: 0x2039, 0x1955: 0x0040, 0x1956: 0x01d9, 0x1957: 0x0fa9, 0x1958: 0x0fb9, 0x1959: 0x1089, 0x195a: 0x0279, 0x195b: 0x0369, 0x195c: 0x0289, 0x195d: 0x0040, 0x195e: 0x0039, 0x195f: 0x0ee9, 0x1960: 0x1159, 0x1961: 0x0ef9, 0x1962: 0x0f09, 0x1963: 0x1199, 0x1964: 0x0f31, 0x1965: 0x0249, 0x1966: 0x0f41, 0x1967: 0x0259, 0x1968: 0x0f51, 0x1969: 0x0359, 0x196a: 0x0f61, 0x196b: 0x0f71, 0x196c: 0x00d9, 0x196d: 0x0f99, 0x196e: 0x2039, 0x196f: 0x0269, 0x1970: 0x01d9, 0x1971: 0x0fa9, 0x1972: 0x0fb9, 0x1973: 0x1089, 0x1974: 0x0279, 0x1975: 0x0369, 0x1976: 0x0289, 0x1977: 0x13d1, 0x1978: 0x0039, 0x1979: 0x0ee9, 0x197a: 0x0040, 0x197b: 0x0ef9, 0x197c: 0x0f09, 0x197d: 0x1199, 0x197e: 0x0f31, 0x197f: 0x0040, // Block 0x66, offset 0x1980 0x1980: 0x0f41, 0x1981: 0x0259, 0x1982: 0x0f51, 0x1983: 0x0359, 0x1984: 0x0f61, 0x1985: 0x0040, 0x1986: 0x00d9, 0x1987: 0x0040, 0x1988: 0x0040, 0x1989: 0x0040, 0x198a: 0x01d9, 0x198b: 0x0fa9, 0x198c: 0x0fb9, 0x198d: 0x1089, 0x198e: 0x0279, 0x198f: 0x0369, 0x1990: 0x0289, 0x1991: 0x0040, 0x1992: 0x0039, 0x1993: 0x0ee9, 0x1994: 0x1159, 0x1995: 0x0ef9, 0x1996: 0x0f09, 0x1997: 0x1199, 0x1998: 0x0f31, 0x1999: 0x0249, 0x199a: 0x0f41, 0x199b: 0x0259, 0x199c: 0x0f51, 0x199d: 0x0359, 0x199e: 0x0f61, 0x199f: 0x0f71, 0x19a0: 0x00d9, 0x19a1: 0x0f99, 0x19a2: 0x2039, 0x19a3: 0x0269, 0x19a4: 0x01d9, 0x19a5: 0x0fa9, 0x19a6: 0x0fb9, 0x19a7: 0x1089, 0x19a8: 0x0279, 0x19a9: 0x0369, 0x19aa: 0x0289, 0x19ab: 0x13d1, 0x19ac: 0x0039, 0x19ad: 0x0ee9, 0x19ae: 0x1159, 0x19af: 0x0ef9, 0x19b0: 0x0f09, 0x19b1: 0x1199, 0x19b2: 0x0f31, 0x19b3: 0x0249, 0x19b4: 0x0f41, 0x19b5: 0x0259, 0x19b6: 0x0f51, 0x19b7: 0x0359, 0x19b8: 0x0f61, 0x19b9: 0x0f71, 0x19ba: 0x00d9, 0x19bb: 0x0f99, 0x19bc: 0x2039, 0x19bd: 0x0269, 0x19be: 0x01d9, 0x19bf: 0x0fa9, // Block 0x67, offset 0x19c0 0x19c0: 0x0fb9, 0x19c1: 0x1089, 0x19c2: 0x0279, 0x19c3: 0x0369, 0x19c4: 0x0289, 0x19c5: 0x13d1, 0x19c6: 0x0039, 0x19c7: 0x0ee9, 0x19c8: 0x1159, 0x19c9: 0x0ef9, 0x19ca: 0x0f09, 0x19cb: 0x1199, 0x19cc: 0x0f31, 0x19cd: 0x0249, 0x19ce: 0x0f41, 0x19cf: 0x0259, 0x19d0: 0x0f51, 0x19d1: 0x0359, 0x19d2: 0x0f61, 0x19d3: 0x0f71, 0x19d4: 0x00d9, 0x19d5: 0x0f99, 0x19d6: 0x2039, 0x19d7: 0x0269, 0x19d8: 0x01d9, 0x19d9: 0x0fa9, 0x19da: 0x0fb9, 0x19db: 0x1089, 0x19dc: 0x0279, 0x19dd: 0x0369, 0x19de: 0x0289, 0x19df: 0x13d1, 0x19e0: 0x0039, 0x19e1: 0x0ee9, 0x19e2: 0x1159, 0x19e3: 0x0ef9, 0x19e4: 0x0f09, 0x19e5: 0x1199, 0x19e6: 0x0f31, 0x19e7: 0x0249, 0x19e8: 0x0f41, 0x19e9: 0x0259, 0x19ea: 0x0f51, 0x19eb: 0x0359, 0x19ec: 0x0f61, 0x19ed: 0x0f71, 0x19ee: 0x00d9, 0x19ef: 0x0f99, 0x19f0: 0x2039, 0x19f1: 0x0269, 0x19f2: 0x01d9, 0x19f3: 0x0fa9, 0x19f4: 0x0fb9, 0x19f5: 0x1089, 0x19f6: 0x0279, 0x19f7: 0x0369, 0x19f8: 0x0289, 0x19f9: 0x13d1, 0x19fa: 0x0039, 0x19fb: 0x0ee9, 0x19fc: 0x1159, 0x19fd: 0x0ef9, 0x19fe: 0x0f09, 0x19ff: 0x1199, // Block 0x68, offset 0x1a00 0x1a00: 0x0f31, 0x1a01: 0x0249, 0x1a02: 0x0f41, 0x1a03: 0x0259, 0x1a04: 0x0f51, 0x1a05: 0x0359, 0x1a06: 0x0f61, 0x1a07: 0x0f71, 0x1a08: 0x00d9, 0x1a09: 0x0f99, 0x1a0a: 0x2039, 0x1a0b: 0x0269, 0x1a0c: 0x01d9, 0x1a0d: 0x0fa9, 0x1a0e: 0x0fb9, 0x1a0f: 0x1089, 0x1a10: 0x0279, 0x1a11: 0x0369, 0x1a12: 0x0289, 0x1a13: 0x13d1, 0x1a14: 0x0039, 0x1a15: 0x0ee9, 0x1a16: 0x1159, 0x1a17: 0x0ef9, 0x1a18: 0x0f09, 0x1a19: 0x1199, 0x1a1a: 0x0f31, 0x1a1b: 0x0249, 0x1a1c: 0x0f41, 0x1a1d: 0x0259, 0x1a1e: 0x0f51, 0x1a1f: 0x0359, 0x1a20: 0x0f61, 0x1a21: 0x0f71, 0x1a22: 0x00d9, 0x1a23: 0x0f99, 0x1a24: 0x2039, 0x1a25: 0x0269, 0x1a26: 0x01d9, 0x1a27: 0x0fa9, 0x1a28: 0x0fb9, 0x1a29: 0x1089, 0x1a2a: 0x0279, 0x1a2b: 0x0369, 0x1a2c: 0x0289, 0x1a2d: 0x13d1, 0x1a2e: 0x0039, 0x1a2f: 0x0ee9, 0x1a30: 0x1159, 0x1a31: 0x0ef9, 0x1a32: 0x0f09, 0x1a33: 0x1199, 0x1a34: 0x0f31, 0x1a35: 0x0249, 0x1a36: 0x0f41, 0x1a37: 0x0259, 0x1a38: 0x0f51, 0x1a39: 0x0359, 0x1a3a: 0x0f61, 0x1a3b: 0x0f71, 0x1a3c: 0x00d9, 0x1a3d: 0x0f99, 0x1a3e: 0x2039, 0x1a3f: 0x0269, // Block 0x69, offset 0x1a40 0x1a40: 0x01d9, 0x1a41: 0x0fa9, 0x1a42: 0x0fb9, 0x1a43: 0x1089, 0x1a44: 0x0279, 0x1a45: 0x0369, 0x1a46: 0x0289, 0x1a47: 0x13d1, 0x1a48: 0x0039, 0x1a49: 0x0ee9, 0x1a4a: 0x1159, 0x1a4b: 0x0ef9, 0x1a4c: 0x0f09, 0x1a4d: 0x1199, 0x1a4e: 0x0f31, 0x1a4f: 0x0249, 0x1a50: 0x0f41, 0x1a51: 0x0259, 0x1a52: 0x0f51, 0x1a53: 0x0359, 0x1a54: 0x0f61, 0x1a55: 0x0f71, 0x1a56: 0x00d9, 0x1a57: 0x0f99, 0x1a58: 0x2039, 0x1a59: 0x0269, 0x1a5a: 0x01d9, 0x1a5b: 0x0fa9, 0x1a5c: 0x0fb9, 0x1a5d: 0x1089, 0x1a5e: 0x0279, 0x1a5f: 0x0369, 0x1a60: 0x0289, 0x1a61: 0x13d1, 0x1a62: 0x0039, 0x1a63: 0x0ee9, 0x1a64: 0x1159, 0x1a65: 0x0ef9, 0x1a66: 0x0f09, 0x1a67: 0x1199, 0x1a68: 0x0f31, 0x1a69: 0x0249, 0x1a6a: 0x0f41, 0x1a6b: 0x0259, 0x1a6c: 0x0f51, 0x1a6d: 0x0359, 0x1a6e: 0x0f61, 0x1a6f: 0x0f71, 0x1a70: 0x00d9, 0x1a71: 0x0f99, 0x1a72: 0x2039, 0x1a73: 0x0269, 0x1a74: 0x01d9, 0x1a75: 0x0fa9, 0x1a76: 0x0fb9, 0x1a77: 0x1089, 0x1a78: 0x0279, 0x1a79: 0x0369, 0x1a7a: 0x0289, 0x1a7b: 0x13d1, 0x1a7c: 0x0039, 0x1a7d: 0x0ee9, 0x1a7e: 0x1159, 0x1a7f: 0x0ef9, // Block 0x6a, offset 0x1a80 0x1a80: 0x0f09, 0x1a81: 0x1199, 0x1a82: 0x0f31, 0x1a83: 0x0249, 0x1a84: 0x0f41, 0x1a85: 0x0259, 0x1a86: 0x0f51, 0x1a87: 0x0359, 0x1a88: 0x0f61, 0x1a89: 0x0f71, 0x1a8a: 0x00d9, 0x1a8b: 0x0f99, 0x1a8c: 0x2039, 0x1a8d: 0x0269, 0x1a8e: 0x01d9, 0x1a8f: 0x0fa9, 0x1a90: 0x0fb9, 0x1a91: 0x1089, 0x1a92: 0x0279, 0x1a93: 0x0369, 0x1a94: 0x0289, 0x1a95: 0x13d1, 0x1a96: 0x0039, 0x1a97: 0x0ee9, 0x1a98: 0x1159, 0x1a99: 0x0ef9, 0x1a9a: 0x0f09, 0x1a9b: 0x1199, 0x1a9c: 0x0f31, 0x1a9d: 0x0249, 0x1a9e: 0x0f41, 0x1a9f: 0x0259, 0x1aa0: 0x0f51, 0x1aa1: 0x0359, 0x1aa2: 0x0f61, 0x1aa3: 0x0f71, 0x1aa4: 0x00d9, 0x1aa5: 0x0f99, 0x1aa6: 0x2039, 0x1aa7: 0x0269, 0x1aa8: 0x01d9, 0x1aa9: 0x0fa9, 0x1aaa: 0x0fb9, 0x1aab: 0x1089, 0x1aac: 0x0279, 0x1aad: 0x0369, 0x1aae: 0x0289, 0x1aaf: 0x13d1, 0x1ab0: 0x0039, 0x1ab1: 0x0ee9, 0x1ab2: 0x1159, 0x1ab3: 0x0ef9, 0x1ab4: 0x0f09, 0x1ab5: 0x1199, 0x1ab6: 0x0f31, 0x1ab7: 0x0249, 0x1ab8: 0x0f41, 0x1ab9: 0x0259, 0x1aba: 0x0f51, 0x1abb: 0x0359, 0x1abc: 0x0f61, 0x1abd: 0x0f71, 0x1abe: 0x00d9, 0x1abf: 0x0f99, // Block 0x6b, offset 0x1ac0 0x1ac0: 0x2039, 0x1ac1: 0x0269, 0x1ac2: 0x01d9, 0x1ac3: 0x0fa9, 0x1ac4: 0x0fb9, 0x1ac5: 0x1089, 0x1ac6: 0x0279, 0x1ac7: 0x0369, 0x1ac8: 0x0289, 0x1ac9: 0x13d1, 0x1aca: 0x0039, 0x1acb: 0x0ee9, 0x1acc: 0x1159, 0x1acd: 0x0ef9, 0x1ace: 0x0f09, 0x1acf: 0x1199, 0x1ad0: 0x0f31, 0x1ad1: 0x0249, 0x1ad2: 0x0f41, 0x1ad3: 0x0259, 0x1ad4: 0x0f51, 0x1ad5: 0x0359, 0x1ad6: 0x0f61, 0x1ad7: 0x0f71, 0x1ad8: 0x00d9, 0x1ad9: 0x0f99, 0x1ada: 0x2039, 0x1adb: 0x0269, 0x1adc: 0x01d9, 0x1add: 0x0fa9, 0x1ade: 0x0fb9, 0x1adf: 0x1089, 0x1ae0: 0x0279, 0x1ae1: 0x0369, 0x1ae2: 0x0289, 0x1ae3: 0x13d1, 0x1ae4: 0xba81, 0x1ae5: 0xba99, 0x1ae6: 0x0040, 0x1ae7: 0x0040, 0x1ae8: 0xbab1, 0x1ae9: 0x1099, 0x1aea: 0x10b1, 0x1aeb: 0x10c9, 0x1aec: 0xbac9, 0x1aed: 0xbae1, 0x1aee: 0xbaf9, 0x1aef: 0x1429, 0x1af0: 0x1a31, 0x1af1: 0xbb11, 0x1af2: 0xbb29, 0x1af3: 0xbb41, 0x1af4: 0xbb59, 0x1af5: 0xbb71, 0x1af6: 0xbb89, 0x1af7: 0x2109, 0x1af8: 0x1111, 0x1af9: 0x1429, 0x1afa: 0xbba1, 0x1afb: 0xbbb9, 0x1afc: 0xbbd1, 0x1afd: 0x10e1, 0x1afe: 0x10f9, 0x1aff: 0xbbe9, // Block 0x6c, offset 0x1b00 0x1b00: 0x2079, 0x1b01: 0xbc01, 0x1b02: 0xbab1, 0x1b03: 0x1099, 0x1b04: 0x10b1, 0x1b05: 0x10c9, 0x1b06: 0xbac9, 0x1b07: 0xbae1, 0x1b08: 0xbaf9, 0x1b09: 0x1429, 0x1b0a: 0x1a31, 0x1b0b: 0xbb11, 0x1b0c: 0xbb29, 0x1b0d: 0xbb41, 0x1b0e: 0xbb59, 0x1b0f: 0xbb71, 0x1b10: 0xbb89, 0x1b11: 0x2109, 0x1b12: 0x1111, 0x1b13: 0xbba1, 0x1b14: 0xbba1, 0x1b15: 0xbbb9, 0x1b16: 0xbbd1, 0x1b17: 0x10e1, 0x1b18: 0x10f9, 0x1b19: 0xbbe9, 0x1b1a: 0x2079, 0x1b1b: 0xbc21, 0x1b1c: 0xbac9, 0x1b1d: 0x1429, 0x1b1e: 0xbb11, 0x1b1f: 0x10e1, 0x1b20: 0x1111, 0x1b21: 0x2109, 0x1b22: 0xbab1, 0x1b23: 0x1099, 0x1b24: 0x10b1, 0x1b25: 0x10c9, 0x1b26: 0xbac9, 0x1b27: 0xbae1, 0x1b28: 0xbaf9, 0x1b29: 0x1429, 0x1b2a: 0x1a31, 0x1b2b: 0xbb11, 0x1b2c: 0xbb29, 0x1b2d: 0xbb41, 0x1b2e: 0xbb59, 0x1b2f: 0xbb71, 0x1b30: 0xbb89, 0x1b31: 0x2109, 0x1b32: 0x1111, 0x1b33: 0x1429, 0x1b34: 0xbba1, 0x1b35: 0xbbb9, 0x1b36: 0xbbd1, 0x1b37: 0x10e1, 0x1b38: 0x10f9, 0x1b39: 0xbbe9, 0x1b3a: 0x2079, 0x1b3b: 0xbc01, 0x1b3c: 0xbab1, 0x1b3d: 0x1099, 0x1b3e: 0x10b1, 0x1b3f: 0x10c9, // Block 0x6d, offset 0x1b40 0x1b40: 0xbac9, 0x1b41: 0xbae1, 0x1b42: 0xbaf9, 0x1b43: 0x1429, 0x1b44: 0x1a31, 0x1b45: 0xbb11, 0x1b46: 0xbb29, 0x1b47: 0xbb41, 0x1b48: 0xbb59, 0x1b49: 0xbb71, 0x1b4a: 0xbb89, 0x1b4b: 0x2109, 0x1b4c: 0x1111, 0x1b4d: 0xbba1, 0x1b4e: 0xbba1, 0x1b4f: 0xbbb9, 0x1b50: 0xbbd1, 0x1b51: 0x10e1, 0x1b52: 0x10f9, 0x1b53: 0xbbe9, 0x1b54: 0x2079, 0x1b55: 0xbc21, 0x1b56: 0xbac9, 0x1b57: 0x1429, 0x1b58: 0xbb11, 0x1b59: 0x10e1, 0x1b5a: 0x1111, 0x1b5b: 0x2109, 0x1b5c: 0xbab1, 0x1b5d: 0x1099, 0x1b5e: 0x10b1, 0x1b5f: 0x10c9, 0x1b60: 0xbac9, 0x1b61: 0xbae1, 0x1b62: 0xbaf9, 0x1b63: 0x1429, 0x1b64: 0x1a31, 0x1b65: 0xbb11, 0x1b66: 0xbb29, 0x1b67: 0xbb41, 0x1b68: 0xbb59, 0x1b69: 0xbb71, 0x1b6a: 0xbb89, 0x1b6b: 0x2109, 0x1b6c: 0x1111, 0x1b6d: 0x1429, 0x1b6e: 0xbba1, 0x1b6f: 0xbbb9, 0x1b70: 0xbbd1, 0x1b71: 0x10e1, 0x1b72: 0x10f9, 0x1b73: 0xbbe9, 0x1b74: 0x2079, 0x1b75: 0xbc01, 0x1b76: 0xbab1, 0x1b77: 0x1099, 0x1b78: 0x10b1, 0x1b79: 0x10c9, 0x1b7a: 0xbac9, 0x1b7b: 0xbae1, 0x1b7c: 0xbaf9, 0x1b7d: 0x1429, 0x1b7e: 0x1a31, 0x1b7f: 0xbb11, // Block 0x6e, offset 0x1b80 0x1b80: 0xbb29, 0x1b81: 0xbb41, 0x1b82: 0xbb59, 0x1b83: 0xbb71, 0x1b84: 0xbb89, 0x1b85: 0x2109, 0x1b86: 0x1111, 0x1b87: 0xbba1, 0x1b88: 0xbba1, 0x1b89: 0xbbb9, 0x1b8a: 0xbbd1, 0x1b8b: 0x10e1, 0x1b8c: 0x10f9, 0x1b8d: 0xbbe9, 0x1b8e: 0x2079, 0x1b8f: 0xbc21, 0x1b90: 0xbac9, 0x1b91: 0x1429, 0x1b92: 0xbb11, 0x1b93: 0x10e1, 0x1b94: 0x1111, 0x1b95: 0x2109, 0x1b96: 0xbab1, 0x1b97: 0x1099, 0x1b98: 0x10b1, 0x1b99: 0x10c9, 0x1b9a: 0xbac9, 0x1b9b: 0xbae1, 0x1b9c: 0xbaf9, 0x1b9d: 0x1429, 0x1b9e: 0x1a31, 0x1b9f: 0xbb11, 0x1ba0: 0xbb29, 0x1ba1: 0xbb41, 0x1ba2: 0xbb59, 0x1ba3: 0xbb71, 0x1ba4: 0xbb89, 0x1ba5: 0x2109, 0x1ba6: 0x1111, 0x1ba7: 0x1429, 0x1ba8: 0xbba1, 0x1ba9: 0xbbb9, 0x1baa: 0xbbd1, 0x1bab: 0x10e1, 0x1bac: 0x10f9, 0x1bad: 0xbbe9, 0x1bae: 0x2079, 0x1baf: 0xbc01, 0x1bb0: 0xbab1, 0x1bb1: 0x1099, 0x1bb2: 0x10b1, 0x1bb3: 0x10c9, 0x1bb4: 0xbac9, 0x1bb5: 0xbae1, 0x1bb6: 0xbaf9, 0x1bb7: 0x1429, 0x1bb8: 0x1a31, 0x1bb9: 0xbb11, 0x1bba: 0xbb29, 0x1bbb: 0xbb41, 0x1bbc: 0xbb59, 0x1bbd: 0xbb71, 0x1bbe: 0xbb89, 0x1bbf: 0x2109, // Block 0x6f, offset 0x1bc0 0x1bc0: 0x1111, 0x1bc1: 0xbba1, 0x1bc2: 0xbba1, 0x1bc3: 0xbbb9, 0x1bc4: 0xbbd1, 0x1bc5: 0x10e1, 0x1bc6: 0x10f9, 0x1bc7: 0xbbe9, 0x1bc8: 0x2079, 0x1bc9: 0xbc21, 0x1bca: 0xbac9, 0x1bcb: 0x1429, 0x1bcc: 0xbb11, 0x1bcd: 0x10e1, 0x1bce: 0x1111, 0x1bcf: 0x2109, 0x1bd0: 0xbab1, 0x1bd1: 0x1099, 0x1bd2: 0x10b1, 0x1bd3: 0x10c9, 0x1bd4: 0xbac9, 0x1bd5: 0xbae1, 0x1bd6: 0xbaf9, 0x1bd7: 0x1429, 0x1bd8: 0x1a31, 0x1bd9: 0xbb11, 0x1bda: 0xbb29, 0x1bdb: 0xbb41, 0x1bdc: 0xbb59, 0x1bdd: 0xbb71, 0x1bde: 0xbb89, 0x1bdf: 0x2109, 0x1be0: 0x1111, 0x1be1: 0x1429, 0x1be2: 0xbba1, 0x1be3: 0xbbb9, 0x1be4: 0xbbd1, 0x1be5: 0x10e1, 0x1be6: 0x10f9, 0x1be7: 0xbbe9, 0x1be8: 0x2079, 0x1be9: 0xbc01, 0x1bea: 0xbab1, 0x1beb: 0x1099, 0x1bec: 0x10b1, 0x1bed: 0x10c9, 0x1bee: 0xbac9, 0x1bef: 0xbae1, 0x1bf0: 0xbaf9, 0x1bf1: 0x1429, 0x1bf2: 0x1a31, 0x1bf3: 0xbb11, 0x1bf4: 0xbb29, 0x1bf5: 0xbb41, 0x1bf6: 0xbb59, 0x1bf7: 0xbb71, 0x1bf8: 0xbb89, 0x1bf9: 0x2109, 0x1bfa: 0x1111, 0x1bfb: 0xbba1, 0x1bfc: 0xbba1, 0x1bfd: 0xbbb9, 0x1bfe: 0xbbd1, 0x1bff: 0x10e1, // Block 0x70, offset 0x1c00 0x1c00: 0x10f9, 0x1c01: 0xbbe9, 0x1c02: 0x2079, 0x1c03: 0xbc21, 0x1c04: 0xbac9, 0x1c05: 0x1429, 0x1c06: 0xbb11, 0x1c07: 0x10e1, 0x1c08: 0x1111, 0x1c09: 0x2109, 0x1c0a: 0xbc41, 0x1c0b: 0xbc41, 0x1c0c: 0x0040, 0x1c0d: 0x0040, 0x1c0e: 0x1f41, 0x1c0f: 0x00c9, 0x1c10: 0x0069, 0x1c11: 0x0079, 0x1c12: 0x1f51, 0x1c13: 0x1f61, 0x1c14: 0x1f71, 0x1c15: 0x1f81, 0x1c16: 0x1f91, 0x1c17: 0x1fa1, 0x1c18: 0x1f41, 0x1c19: 0x00c9, 0x1c1a: 0x0069, 0x1c1b: 0x0079, 0x1c1c: 0x1f51, 0x1c1d: 0x1f61, 0x1c1e: 0x1f71, 0x1c1f: 0x1f81, 0x1c20: 0x1f91, 0x1c21: 0x1fa1, 0x1c22: 0x1f41, 0x1c23: 0x00c9, 0x1c24: 0x0069, 0x1c25: 0x0079, 0x1c26: 0x1f51, 0x1c27: 0x1f61, 0x1c28: 0x1f71, 0x1c29: 0x1f81, 0x1c2a: 0x1f91, 0x1c2b: 0x1fa1, 0x1c2c: 0x1f41, 0x1c2d: 0x00c9, 0x1c2e: 0x0069, 0x1c2f: 0x0079, 0x1c30: 0x1f51, 0x1c31: 0x1f61, 0x1c32: 0x1f71, 0x1c33: 0x1f81, 0x1c34: 0x1f91, 0x1c35: 0x1fa1, 0x1c36: 0x1f41, 0x1c37: 0x00c9, 0x1c38: 0x0069, 0x1c39: 0x0079, 0x1c3a: 0x1f51, 0x1c3b: 0x1f61, 0x1c3c: 0x1f71, 0x1c3d: 0x1f81, 0x1c3e: 0x1f91, 0x1c3f: 0x1fa1, // Block 0x71, offset 0x1c40 0x1c40: 0xe115, 0x1c41: 0xe115, 0x1c42: 0xe135, 0x1c43: 0xe135, 0x1c44: 0xe115, 0x1c45: 0xe115, 0x1c46: 0xe175, 0x1c47: 0xe175, 0x1c48: 0xe115, 0x1c49: 0xe115, 0x1c4a: 0xe135, 0x1c4b: 0xe135, 0x1c4c: 0xe115, 0x1c4d: 0xe115, 0x1c4e: 0xe1f5, 0x1c4f: 0xe1f5, 0x1c50: 0xe115, 0x1c51: 0xe115, 0x1c52: 0xe135, 0x1c53: 0xe135, 0x1c54: 0xe115, 0x1c55: 0xe115, 0x1c56: 0xe175, 0x1c57: 0xe175, 0x1c58: 0xe115, 0x1c59: 0xe115, 0x1c5a: 0xe135, 0x1c5b: 0xe135, 0x1c5c: 0xe115, 0x1c5d: 0xe115, 0x1c5e: 0x8b05, 0x1c5f: 0x8b05, 0x1c60: 0x04b5, 0x1c61: 0x04b5, 0x1c62: 0x0a08, 0x1c63: 0x0a08, 0x1c64: 0x0a08, 0x1c65: 0x0a08, 0x1c66: 0x0a08, 0x1c67: 0x0a08, 0x1c68: 0x0a08, 0x1c69: 0x0a08, 0x1c6a: 0x0a08, 0x1c6b: 0x0a08, 0x1c6c: 0x0a08, 0x1c6d: 0x0a08, 0x1c6e: 0x0a08, 0x1c6f: 0x0a08, 0x1c70: 0x0a08, 0x1c71: 0x0a08, 0x1c72: 0x0a08, 0x1c73: 0x0a08, 0x1c74: 0x0a08, 0x1c75: 0x0a08, 0x1c76: 0x0a08, 0x1c77: 0x0a08, 0x1c78: 0x0a08, 0x1c79: 0x0a08, 0x1c7a: 0x0a08, 0x1c7b: 0x0a08, 0x1c7c: 0x0a08, 0x1c7d: 0x0a08, 0x1c7e: 0x0a08, 0x1c7f: 0x0a08, // Block 0x72, offset 0x1c80 0x1c80: 0xb189, 0x1c81: 0xb1a1, 0x1c82: 0xb201, 0x1c83: 0xb249, 0x1c84: 0x0040, 0x1c85: 0xb411, 0x1c86: 0xb291, 0x1c87: 0xb219, 0x1c88: 0xb309, 0x1c89: 0xb429, 0x1c8a: 0xb399, 0x1c8b: 0xb3b1, 0x1c8c: 0xb3c9, 0x1c8d: 0xb3e1, 0x1c8e: 0xb2a9, 0x1c8f: 0xb339, 0x1c90: 0xb369, 0x1c91: 0xb2d9, 0x1c92: 0xb381, 0x1c93: 0xb279, 0x1c94: 0xb2c1, 0x1c95: 0xb1d1, 0x1c96: 0xb1e9, 0x1c97: 0xb231, 0x1c98: 0xb261, 0x1c99: 0xb2f1, 0x1c9a: 0xb321, 0x1c9b: 0xb351, 0x1c9c: 0xbc59, 0x1c9d: 0x7949, 0x1c9e: 0xbc71, 0x1c9f: 0xbc89, 0x1ca0: 0x0040, 0x1ca1: 0xb1a1, 0x1ca2: 0xb201, 0x1ca3: 0x0040, 0x1ca4: 0xb3f9, 0x1ca5: 0x0040, 0x1ca6: 0x0040, 0x1ca7: 0xb219, 0x1ca8: 0x0040, 0x1ca9: 0xb429, 0x1caa: 0xb399, 0x1cab: 0xb3b1, 0x1cac: 0xb3c9, 0x1cad: 0xb3e1, 0x1cae: 0xb2a9, 0x1caf: 0xb339, 0x1cb0: 0xb369, 0x1cb1: 0xb2d9, 0x1cb2: 0xb381, 0x1cb3: 0x0040, 0x1cb4: 0xb2c1, 0x1cb5: 0xb1d1, 0x1cb6: 0xb1e9, 0x1cb7: 0xb231, 0x1cb8: 0x0040, 0x1cb9: 0xb2f1, 0x1cba: 0x0040, 0x1cbb: 0xb351, 0x1cbc: 0x0040, 0x1cbd: 0x0040, 0x1cbe: 0x0040, 0x1cbf: 0x0040, // Block 0x73, offset 0x1cc0 0x1cc0: 0x0040, 0x1cc1: 0x0040, 0x1cc2: 0xb201, 0x1cc3: 0x0040, 0x1cc4: 0x0040, 0x1cc5: 0x0040, 0x1cc6: 0x0040, 0x1cc7: 0xb219, 0x1cc8: 0x0040, 0x1cc9: 0xb429, 0x1cca: 0x0040, 0x1ccb: 0xb3b1, 0x1ccc: 0x0040, 0x1ccd: 0xb3e1, 0x1cce: 0xb2a9, 0x1ccf: 0xb339, 0x1cd0: 0x0040, 0x1cd1: 0xb2d9, 0x1cd2: 0xb381, 0x1cd3: 0x0040, 0x1cd4: 0xb2c1, 0x1cd5: 0x0040, 0x1cd6: 0x0040, 0x1cd7: 0xb231, 0x1cd8: 0x0040, 0x1cd9: 0xb2f1, 0x1cda: 0x0040, 0x1cdb: 0xb351, 0x1cdc: 0x0040, 0x1cdd: 0x7949, 0x1cde: 0x0040, 0x1cdf: 0xbc89, 0x1ce0: 0x0040, 0x1ce1: 0xb1a1, 0x1ce2: 0xb201, 0x1ce3: 0x0040, 0x1ce4: 0xb3f9, 0x1ce5: 0x0040, 0x1ce6: 0x0040, 0x1ce7: 0xb219, 0x1ce8: 0xb309, 0x1ce9: 0xb429, 0x1cea: 0xb399, 0x1ceb: 0x0040, 0x1cec: 0xb3c9, 0x1ced: 0xb3e1, 0x1cee: 0xb2a9, 0x1cef: 0xb339, 0x1cf0: 0xb369, 0x1cf1: 0xb2d9, 0x1cf2: 0xb381, 0x1cf3: 0x0040, 0x1cf4: 0xb2c1, 0x1cf5: 0xb1d1, 0x1cf6: 0xb1e9, 0x1cf7: 0xb231, 0x1cf8: 0x0040, 0x1cf9: 0xb2f1, 0x1cfa: 0xb321, 0x1cfb: 0xb351, 0x1cfc: 0xbc59, 0x1cfd: 0x0040, 0x1cfe: 0xbc71, 0x1cff: 0x0040, // Block 0x74, offset 0x1d00 0x1d00: 0xb189, 0x1d01: 0xb1a1, 0x1d02: 0xb201, 0x1d03: 0xb249, 0x1d04: 0xb3f9, 0x1d05: 0xb411, 0x1d06: 0xb291, 0x1d07: 0xb219, 0x1d08: 0xb309, 0x1d09: 0xb429, 0x1d0a: 0x0040, 0x1d0b: 0xb3b1, 0x1d0c: 0xb3c9, 0x1d0d: 0xb3e1, 0x1d0e: 0xb2a9, 0x1d0f: 0xb339, 0x1d10: 0xb369, 0x1d11: 0xb2d9, 0x1d12: 0xb381, 0x1d13: 0xb279, 0x1d14: 0xb2c1, 0x1d15: 0xb1d1, 0x1d16: 0xb1e9, 0x1d17: 0xb231, 0x1d18: 0xb261, 0x1d19: 0xb2f1, 0x1d1a: 0xb321, 0x1d1b: 0xb351, 0x1d1c: 0x0040, 0x1d1d: 0x0040, 0x1d1e: 0x0040, 0x1d1f: 0x0040, 0x1d20: 0x0040, 0x1d21: 0xb1a1, 0x1d22: 0xb201, 0x1d23: 0xb249, 0x1d24: 0x0040, 0x1d25: 0xb411, 0x1d26: 0xb291, 0x1d27: 0xb219, 0x1d28: 0xb309, 0x1d29: 0xb429, 0x1d2a: 0x0040, 0x1d2b: 0xb3b1, 0x1d2c: 0xb3c9, 0x1d2d: 0xb3e1, 0x1d2e: 0xb2a9, 0x1d2f: 0xb339, 0x1d30: 0xb369, 0x1d31: 0xb2d9, 0x1d32: 0xb381, 0x1d33: 0xb279, 0x1d34: 0xb2c1, 0x1d35: 0xb1d1, 0x1d36: 0xb1e9, 0x1d37: 0xb231, 0x1d38: 0xb261, 0x1d39: 0xb2f1, 0x1d3a: 0xb321, 0x1d3b: 0xb351, 0x1d3c: 0x0040, 0x1d3d: 0x0040, 0x1d3e: 0x0040, 0x1d3f: 0x0040, // Block 0x75, offset 0x1d40 0x1d40: 0x0040, 0x1d41: 0xbca2, 0x1d42: 0xbcba, 0x1d43: 0xbcd2, 0x1d44: 0xbcea, 0x1d45: 0xbd02, 0x1d46: 0xbd1a, 0x1d47: 0xbd32, 0x1d48: 0xbd4a, 0x1d49: 0xbd62, 0x1d4a: 0xbd7a, 0x1d4b: 0x0018, 0x1d4c: 0x0018, 0x1d4d: 0x0040, 0x1d4e: 0x0040, 0x1d4f: 0x0040, 0x1d50: 0xbd92, 0x1d51: 0xbdb2, 0x1d52: 0xbdd2, 0x1d53: 0xbdf2, 0x1d54: 0xbe12, 0x1d55: 0xbe32, 0x1d56: 0xbe52, 0x1d57: 0xbe72, 0x1d58: 0xbe92, 0x1d59: 0xbeb2, 0x1d5a: 0xbed2, 0x1d5b: 0xbef2, 0x1d5c: 0xbf12, 0x1d5d: 0xbf32, 0x1d5e: 0xbf52, 0x1d5f: 0xbf72, 0x1d60: 0xbf92, 0x1d61: 0xbfb2, 0x1d62: 0xbfd2, 0x1d63: 0xbff2, 0x1d64: 0xc012, 0x1d65: 0xc032, 0x1d66: 0xc052, 0x1d67: 0xc072, 0x1d68: 0xc092, 0x1d69: 0xc0b2, 0x1d6a: 0xc0d1, 0x1d6b: 0x1159, 0x1d6c: 0x0269, 0x1d6d: 0x6671, 0x1d6e: 0xc111, 0x1d6f: 0x0040, 0x1d70: 0x0039, 0x1d71: 0x0ee9, 0x1d72: 0x1159, 0x1d73: 0x0ef9, 0x1d74: 0x0f09, 0x1d75: 0x1199, 0x1d76: 0x0f31, 0x1d77: 0x0249, 0x1d78: 0x0f41, 0x1d79: 0x0259, 0x1d7a: 0x0f51, 0x1d7b: 0x0359, 0x1d7c: 0x0f61, 0x1d7d: 0x0f71, 0x1d7e: 0x00d9, 0x1d7f: 0x0f99, // Block 0x76, offset 0x1d80 0x1d80: 0x2039, 0x1d81: 0x0269, 0x1d82: 0x01d9, 0x1d83: 0x0fa9, 0x1d84: 0x0fb9, 0x1d85: 0x1089, 0x1d86: 0x0279, 0x1d87: 0x0369, 0x1d88: 0x0289, 0x1d89: 0x13d1, 0x1d8a: 0xc129, 0x1d8b: 0x65b1, 0x1d8c: 0xc141, 0x1d8d: 0x1441, 0x1d8e: 0xc159, 0x1d8f: 0xc179, 0x1d90: 0x0018, 0x1d91: 0x0018, 0x1d92: 0x0018, 0x1d93: 0x0018, 0x1d94: 0x0018, 0x1d95: 0x0018, 0x1d96: 0x0018, 0x1d97: 0x0018, 0x1d98: 0x0018, 0x1d99: 0x0018, 0x1d9a: 0x0018, 0x1d9b: 0x0018, 0x1d9c: 0x0018, 0x1d9d: 0x0018, 0x1d9e: 0x0018, 0x1d9f: 0x0018, 0x1da0: 0x0018, 0x1da1: 0x0018, 0x1da2: 0x0018, 0x1da3: 0x0018, 0x1da4: 0x0018, 0x1da5: 0x0018, 0x1da6: 0x0018, 0x1da7: 0x0018, 0x1da8: 0x0018, 0x1da9: 0x0018, 0x1daa: 0xc191, 0x1dab: 0xc1a9, 0x1dac: 0x0040, 0x1dad: 0x0040, 0x1dae: 0x0040, 0x1daf: 0x0040, 0x1db0: 0x0018, 0x1db1: 0x0018, 0x1db2: 0x0018, 0x1db3: 0x0018, 0x1db4: 0x0018, 0x1db5: 0x0018, 0x1db6: 0x0018, 0x1db7: 0x0018, 0x1db8: 0x0018, 0x1db9: 0x0018, 0x1dba: 0x0018, 0x1dbb: 0x0018, 0x1dbc: 0x0018, 0x1dbd: 0x0018, 0x1dbe: 0x0018, 0x1dbf: 0x0018, // Block 0x77, offset 0x1dc0 0x1dc0: 0xc1d9, 0x1dc1: 0xc211, 0x1dc2: 0xc249, 0x1dc3: 0x0040, 0x1dc4: 0x0040, 0x1dc5: 0x0040, 0x1dc6: 0x0040, 0x1dc7: 0x0040, 0x1dc8: 0x0040, 0x1dc9: 0x0040, 0x1dca: 0x0040, 0x1dcb: 0x0040, 0x1dcc: 0x0040, 0x1dcd: 0x0040, 0x1dce: 0x0040, 0x1dcf: 0x0040, 0x1dd0: 0xc269, 0x1dd1: 0xc289, 0x1dd2: 0xc2a9, 0x1dd3: 0xc2c9, 0x1dd4: 0xc2e9, 0x1dd5: 0xc309, 0x1dd6: 0xc329, 0x1dd7: 0xc349, 0x1dd8: 0xc369, 0x1dd9: 0xc389, 0x1dda: 0xc3a9, 0x1ddb: 0xc3c9, 0x1ddc: 0xc3e9, 0x1ddd: 0xc409, 0x1dde: 0xc429, 0x1ddf: 0xc449, 0x1de0: 0xc469, 0x1de1: 0xc489, 0x1de2: 0xc4a9, 0x1de3: 0xc4c9, 0x1de4: 0xc4e9, 0x1de5: 0xc509, 0x1de6: 0xc529, 0x1de7: 0xc549, 0x1de8: 0xc569, 0x1de9: 0xc589, 0x1dea: 0xc5a9, 0x1deb: 0xc5c9, 0x1dec: 0xc5e9, 0x1ded: 0xc609, 0x1dee: 0xc629, 0x1def: 0xc649, 0x1df0: 0xc669, 0x1df1: 0xc689, 0x1df2: 0xc6a9, 0x1df3: 0xc6c9, 0x1df4: 0xc6e9, 0x1df5: 0xc709, 0x1df6: 0xc729, 0x1df7: 0xc749, 0x1df8: 0xc769, 0x1df9: 0xc789, 0x1dfa: 0xc7a9, 0x1dfb: 0xc7c9, 0x1dfc: 0x0040, 0x1dfd: 0x0040, 0x1dfe: 0x0040, 0x1dff: 0x0040, // Block 0x78, offset 0x1e00 0x1e00: 0xcaf9, 0x1e01: 0xcb19, 0x1e02: 0xcb39, 0x1e03: 0x8b1d, 0x1e04: 0xcb59, 0x1e05: 0xcb79, 0x1e06: 0xcb99, 0x1e07: 0xcbb9, 0x1e08: 0xcbd9, 0x1e09: 0xcbf9, 0x1e0a: 0xcc19, 0x1e0b: 0xcc39, 0x1e0c: 0xcc59, 0x1e0d: 0x8b3d, 0x1e0e: 0xcc79, 0x1e0f: 0xcc99, 0x1e10: 0xccb9, 0x1e11: 0xccd9, 0x1e12: 0x8b5d, 0x1e13: 0xccf9, 0x1e14: 0xcd19, 0x1e15: 0xc429, 0x1e16: 0x8b7d, 0x1e17: 0xcd39, 0x1e18: 0xcd59, 0x1e19: 0xcd79, 0x1e1a: 0xcd99, 0x1e1b: 0xcdb9, 0x1e1c: 0x8b9d, 0x1e1d: 0xcdd9, 0x1e1e: 0xcdf9, 0x1e1f: 0xce19, 0x1e20: 0xce39, 0x1e21: 0xce59, 0x1e22: 0xc789, 0x1e23: 0xce79, 0x1e24: 0xce99, 0x1e25: 0xceb9, 0x1e26: 0xced9, 0x1e27: 0xcef9, 0x1e28: 0xcf19, 0x1e29: 0xcf39, 0x1e2a: 0xcf59, 0x1e2b: 0xcf79, 0x1e2c: 0xcf99, 0x1e2d: 0xcfb9, 0x1e2e: 0xcfd9, 0x1e2f: 0xcff9, 0x1e30: 0xd019, 0x1e31: 0xd039, 0x1e32: 0xd039, 0x1e33: 0xd039, 0x1e34: 0x8bbd, 0x1e35: 0xd059, 0x1e36: 0xd079, 0x1e37: 0xd099, 0x1e38: 0x8bdd, 0x1e39: 0xd0b9, 0x1e3a: 0xd0d9, 0x1e3b: 0xd0f9, 0x1e3c: 0xd119, 0x1e3d: 0xd139, 0x1e3e: 0xd159, 0x1e3f: 0xd179, // Block 0x79, offset 0x1e40 0x1e40: 0xd199, 0x1e41: 0xd1b9, 0x1e42: 0xd1d9, 0x1e43: 0xd1f9, 0x1e44: 0xd219, 0x1e45: 0xd239, 0x1e46: 0xd239, 0x1e47: 0xd259, 0x1e48: 0xd279, 0x1e49: 0xd299, 0x1e4a: 0xd2b9, 0x1e4b: 0xd2d9, 0x1e4c: 0xd2f9, 0x1e4d: 0xd319, 0x1e4e: 0xd339, 0x1e4f: 0xd359, 0x1e50: 0xd379, 0x1e51: 0xd399, 0x1e52: 0xd3b9, 0x1e53: 0xd3d9, 0x1e54: 0xd3f9, 0x1e55: 0xd419, 0x1e56: 0xd439, 0x1e57: 0xd459, 0x1e58: 0xd479, 0x1e59: 0x8bfd, 0x1e5a: 0xd499, 0x1e5b: 0xd4b9, 0x1e5c: 0xd4d9, 0x1e5d: 0xc309, 0x1e5e: 0xd4f9, 0x1e5f: 0xd519, 0x1e60: 0x8c1d, 0x1e61: 0x8c3d, 0x1e62: 0xd539, 0x1e63: 0xd559, 0x1e64: 0xd579, 0x1e65: 0xd599, 0x1e66: 0xd5b9, 0x1e67: 0xd5d9, 0x1e68: 0x2040, 0x1e69: 0xd5f9, 0x1e6a: 0xd619, 0x1e6b: 0xd619, 0x1e6c: 0x8c5d, 0x1e6d: 0xd639, 0x1e6e: 0xd659, 0x1e6f: 0xd679, 0x1e70: 0xd699, 0x1e71: 0x8c7d, 0x1e72: 0xd6b9, 0x1e73: 0xd6d9, 0x1e74: 0x2040, 0x1e75: 0xd6f9, 0x1e76: 0xd719, 0x1e77: 0xd739, 0x1e78: 0xd759, 0x1e79: 0xd779, 0x1e7a: 0xd799, 0x1e7b: 0x8c9d, 0x1e7c: 0xd7b9, 0x1e7d: 0x8cbd, 0x1e7e: 0xd7d9, 0x1e7f: 0xd7f9, // Block 0x7a, offset 0x1e80 0x1e80: 0xd819, 0x1e81: 0xd839, 0x1e82: 0xd859, 0x1e83: 0xd879, 0x1e84: 0xd899, 0x1e85: 0xd8b9, 0x1e86: 0xd8d9, 0x1e87: 0xd8f9, 0x1e88: 0xd919, 0x1e89: 0x8cdd, 0x1e8a: 0xd939, 0x1e8b: 0xd959, 0x1e8c: 0xd979, 0x1e8d: 0xd999, 0x1e8e: 0xd9b9, 0x1e8f: 0x8cfd, 0x1e90: 0xd9d9, 0x1e91: 0x8d1d, 0x1e92: 0x8d3d, 0x1e93: 0xd9f9, 0x1e94: 0xda19, 0x1e95: 0xda19, 0x1e96: 0xda39, 0x1e97: 0x8d5d, 0x1e98: 0x8d7d, 0x1e99: 0xda59, 0x1e9a: 0xda79, 0x1e9b: 0xda99, 0x1e9c: 0xdab9, 0x1e9d: 0xdad9, 0x1e9e: 0xdaf9, 0x1e9f: 0xdb19, 0x1ea0: 0xdb39, 0x1ea1: 0xdb59, 0x1ea2: 0xdb79, 0x1ea3: 0xdb99, 0x1ea4: 0x8d9d, 0x1ea5: 0xdbb9, 0x1ea6: 0xdbd9, 0x1ea7: 0xdbf9, 0x1ea8: 0xdc19, 0x1ea9: 0xdbf9, 0x1eaa: 0xdc39, 0x1eab: 0xdc59, 0x1eac: 0xdc79, 0x1ead: 0xdc99, 0x1eae: 0xdcb9, 0x1eaf: 0xdcd9, 0x1eb0: 0xdcf9, 0x1eb1: 0xdd19, 0x1eb2: 0xdd39, 0x1eb3: 0xdd59, 0x1eb4: 0xdd79, 0x1eb5: 0xdd99, 0x1eb6: 0xddb9, 0x1eb7: 0xddd9, 0x1eb8: 0x8dbd, 0x1eb9: 0xddf9, 0x1eba: 0xde19, 0x1ebb: 0xde39, 0x1ebc: 0xde59, 0x1ebd: 0xde79, 0x1ebe: 0x8ddd, 0x1ebf: 0xde99, // Block 0x7b, offset 0x1ec0 0x1ec0: 0xe599, 0x1ec1: 0xe5b9, 0x1ec2: 0xe5d9, 0x1ec3: 0xe5f9, 0x1ec4: 0xe619, 0x1ec5: 0xe639, 0x1ec6: 0x8efd, 0x1ec7: 0xe659, 0x1ec8: 0xe679, 0x1ec9: 0xe699, 0x1eca: 0xe6b9, 0x1ecb: 0xe6d9, 0x1ecc: 0xe6f9, 0x1ecd: 0x8f1d, 0x1ece: 0xe719, 0x1ecf: 0xe739, 0x1ed0: 0x8f3d, 0x1ed1: 0x8f5d, 0x1ed2: 0xe759, 0x1ed3: 0xe779, 0x1ed4: 0xe799, 0x1ed5: 0xe7b9, 0x1ed6: 0xe7d9, 0x1ed7: 0xe7f9, 0x1ed8: 0xe819, 0x1ed9: 0xe839, 0x1eda: 0xe859, 0x1edb: 0x8f7d, 0x1edc: 0xe879, 0x1edd: 0x8f9d, 0x1ede: 0xe899, 0x1edf: 0x2040, 0x1ee0: 0xe8b9, 0x1ee1: 0xe8d9, 0x1ee2: 0xe8f9, 0x1ee3: 0x8fbd, 0x1ee4: 0xe919, 0x1ee5: 0xe939, 0x1ee6: 0x8fdd, 0x1ee7: 0x8ffd, 0x1ee8: 0xe959, 0x1ee9: 0xe979, 0x1eea: 0xe999, 0x1eeb: 0xe9b9, 0x1eec: 0xe9d9, 0x1eed: 0xe9d9, 0x1eee: 0xe9f9, 0x1eef: 0xea19, 0x1ef0: 0xea39, 0x1ef1: 0xea59, 0x1ef2: 0xea79, 0x1ef3: 0xea99, 0x1ef4: 0xeab9, 0x1ef5: 0x901d, 0x1ef6: 0xead9, 0x1ef7: 0x903d, 0x1ef8: 0xeaf9, 0x1ef9: 0x905d, 0x1efa: 0xeb19, 0x1efb: 0x907d, 0x1efc: 0x909d, 0x1efd: 0x90bd, 0x1efe: 0xeb39, 0x1eff: 0xeb59, // Block 0x7c, offset 0x1f00 0x1f00: 0xeb79, 0x1f01: 0x90dd, 0x1f02: 0x90fd, 0x1f03: 0x911d, 0x1f04: 0x913d, 0x1f05: 0xeb99, 0x1f06: 0xebb9, 0x1f07: 0xebb9, 0x1f08: 0xebd9, 0x1f09: 0xebf9, 0x1f0a: 0xec19, 0x1f0b: 0xec39, 0x1f0c: 0xec59, 0x1f0d: 0x915d, 0x1f0e: 0xec79, 0x1f0f: 0xec99, 0x1f10: 0xecb9, 0x1f11: 0xecd9, 0x1f12: 0x917d, 0x1f13: 0xecf9, 0x1f14: 0x919d, 0x1f15: 0x91bd, 0x1f16: 0xed19, 0x1f17: 0xed39, 0x1f18: 0xed59, 0x1f19: 0xed79, 0x1f1a: 0xed99, 0x1f1b: 0xedb9, 0x1f1c: 0x91dd, 0x1f1d: 0x91fd, 0x1f1e: 0x921d, 0x1f1f: 0x2040, 0x1f20: 0xedd9, 0x1f21: 0x923d, 0x1f22: 0xedf9, 0x1f23: 0xee19, 0x1f24: 0xee39, 0x1f25: 0x925d, 0x1f26: 0xee59, 0x1f27: 0xee79, 0x1f28: 0xee99, 0x1f29: 0xeeb9, 0x1f2a: 0xeed9, 0x1f2b: 0x927d, 0x1f2c: 0xeef9, 0x1f2d: 0xef19, 0x1f2e: 0xef39, 0x1f2f: 0xef59, 0x1f30: 0xef79, 0x1f31: 0xef99, 0x1f32: 0x929d, 0x1f33: 0x92bd, 0x1f34: 0xefb9, 0x1f35: 0x92dd, 0x1f36: 0xefd9, 0x1f37: 0x92fd, 0x1f38: 0xeff9, 0x1f39: 0xf019, 0x1f3a: 0xf039, 0x1f3b: 0x931d, 0x1f3c: 0x933d, 0x1f3d: 0xf059, 0x1f3e: 0x935d, 0x1f3f: 0xf079, // Block 0x7d, offset 0x1f40 0x1f40: 0xf6b9, 0x1f41: 0xf6d9, 0x1f42: 0xf6f9, 0x1f43: 0xf719, 0x1f44: 0xf739, 0x1f45: 0x951d, 0x1f46: 0xf759, 0x1f47: 0xf779, 0x1f48: 0xf799, 0x1f49: 0xf7b9, 0x1f4a: 0xf7d9, 0x1f4b: 0x953d, 0x1f4c: 0x955d, 0x1f4d: 0xf7f9, 0x1f4e: 0xf819, 0x1f4f: 0xf839, 0x1f50: 0xf859, 0x1f51: 0xf879, 0x1f52: 0xf899, 0x1f53: 0x957d, 0x1f54: 0xf8b9, 0x1f55: 0xf8d9, 0x1f56: 0xf8f9, 0x1f57: 0xf919, 0x1f58: 0x959d, 0x1f59: 0x95bd, 0x1f5a: 0xf939, 0x1f5b: 0xf959, 0x1f5c: 0xf979, 0x1f5d: 0x95dd, 0x1f5e: 0xf999, 0x1f5f: 0xf9b9, 0x1f60: 0x6815, 0x1f61: 0x95fd, 0x1f62: 0xf9d9, 0x1f63: 0xf9f9, 0x1f64: 0xfa19, 0x1f65: 0x961d, 0x1f66: 0xfa39, 0x1f67: 0xfa59, 0x1f68: 0xfa79, 0x1f69: 0xfa99, 0x1f6a: 0xfab9, 0x1f6b: 0xfad9, 0x1f6c: 0xfaf9, 0x1f6d: 0x963d, 0x1f6e: 0xfb19, 0x1f6f: 0xfb39, 0x1f70: 0xfb59, 0x1f71: 0x965d, 0x1f72: 0xfb79, 0x1f73: 0xfb99, 0x1f74: 0xfbb9, 0x1f75: 0xfbd9, 0x1f76: 0x7b35, 0x1f77: 0x967d, 0x1f78: 0xfbf9, 0x1f79: 0xfc19, 0x1f7a: 0xfc39, 0x1f7b: 0x969d, 0x1f7c: 0xfc59, 0x1f7d: 0x96bd, 0x1f7e: 0xfc79, 0x1f7f: 0xfc79, // Block 0x7e, offset 0x1f80 0x1f80: 0xfc99, 0x1f81: 0x96dd, 0x1f82: 0xfcb9, 0x1f83: 0xfcd9, 0x1f84: 0xfcf9, 0x1f85: 0xfd19, 0x1f86: 0xfd39, 0x1f87: 0xfd59, 0x1f88: 0xfd79, 0x1f89: 0x96fd, 0x1f8a: 0xfd99, 0x1f8b: 0xfdb9, 0x1f8c: 0xfdd9, 0x1f8d: 0xfdf9, 0x1f8e: 0xfe19, 0x1f8f: 0xfe39, 0x1f90: 0x971d, 0x1f91: 0xfe59, 0x1f92: 0x973d, 0x1f93: 0x975d, 0x1f94: 0x977d, 0x1f95: 0xfe79, 0x1f96: 0xfe99, 0x1f97: 0xfeb9, 0x1f98: 0xfed9, 0x1f99: 0xfef9, 0x1f9a: 0xff19, 0x1f9b: 0xff39, 0x1f9c: 0xff59, 0x1f9d: 0x979d, 0x1f9e: 0x0040, 0x1f9f: 0x0040, 0x1fa0: 0x0040, 0x1fa1: 0x0040, 0x1fa2: 0x0040, 0x1fa3: 0x0040, 0x1fa4: 0x0040, 0x1fa5: 0x0040, 0x1fa6: 0x0040, 0x1fa7: 0x0040, 0x1fa8: 0x0040, 0x1fa9: 0x0040, 0x1faa: 0x0040, 0x1fab: 0x0040, 0x1fac: 0x0040, 0x1fad: 0x0040, 0x1fae: 0x0040, 0x1faf: 0x0040, 0x1fb0: 0x0040, 0x1fb1: 0x0040, 0x1fb2: 0x0040, 0x1fb3: 0x0040, 0x1fb4: 0x0040, 0x1fb5: 0x0040, 0x1fb6: 0x0040, 0x1fb7: 0x0040, 0x1fb8: 0x0040, 0x1fb9: 0x0040, 0x1fba: 0x0040, 0x1fbb: 0x0040, 0x1fbc: 0x0040, 0x1fbd: 0x0040, 0x1fbe: 0x0040, 0x1fbf: 0x0040, } // idnaIndex: 36 blocks, 2304 entries, 4608 bytes // Block 0 is the zero block. var idnaIndex = [2304]uint16{ // Block 0x0, offset 0x0 // Block 0x1, offset 0x40 // Block 0x2, offset 0x80 // Block 0x3, offset 0xc0 0xc2: 0x01, 0xc3: 0x7d, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x04, 0xc7: 0x05, 0xc8: 0x06, 0xc9: 0x7e, 0xca: 0x7f, 0xcb: 0x07, 0xcc: 0x80, 0xcd: 0x08, 0xce: 0x09, 0xcf: 0x0a, 0xd0: 0x81, 0xd1: 0x0b, 0xd2: 0x0c, 0xd3: 0x0d, 0xd4: 0x0e, 0xd5: 0x82, 0xd6: 0x83, 0xd7: 0x84, 0xd8: 0x0f, 0xd9: 0x10, 0xda: 0x85, 0xdb: 0x11, 0xdc: 0x12, 0xdd: 0x86, 0xde: 0x87, 0xdf: 0x88, 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, 0xe5: 0x07, 0xe6: 0x07, 0xe7: 0x07, 0xe8: 0x07, 0xe9: 0x08, 0xea: 0x09, 0xeb: 0x07, 0xec: 0x07, 0xed: 0x0a, 0xee: 0x0b, 0xef: 0x0c, 0xf0: 0x1d, 0xf1: 0x1e, 0xf2: 0x1e, 0xf3: 0x20, 0xf4: 0x21, // Block 0x4, offset 0x100 0x120: 0x89, 0x121: 0x13, 0x122: 0x8a, 0x123: 0x8b, 0x124: 0x8c, 0x125: 0x14, 0x126: 0x15, 0x127: 0x16, 0x128: 0x17, 0x129: 0x18, 0x12a: 0x19, 0x12b: 0x1a, 0x12c: 0x1b, 0x12d: 0x1c, 0x12e: 0x1d, 0x12f: 0x8d, 0x130: 0x8e, 0x131: 0x1e, 0x132: 0x1f, 0x133: 0x20, 0x134: 0x8f, 0x135: 0x21, 0x136: 0x90, 0x137: 0x91, 0x138: 0x92, 0x139: 0x93, 0x13a: 0x22, 0x13b: 0x94, 0x13c: 0x95, 0x13d: 0x23, 0x13e: 0x24, 0x13f: 0x96, // Block 0x5, offset 0x140 0x140: 0x97, 0x141: 0x98, 0x142: 0x99, 0x143: 0x9a, 0x144: 0x9b, 0x145: 0x9c, 0x146: 0x9d, 0x147: 0x9e, 0x148: 0x9f, 0x149: 0xa0, 0x14a: 0xa1, 0x14b: 0xa2, 0x14c: 0xa3, 0x14d: 0xa4, 0x14e: 0xa5, 0x14f: 0xa6, 0x150: 0xa7, 0x151: 0x9f, 0x152: 0x9f, 0x153: 0x9f, 0x154: 0x9f, 0x155: 0x9f, 0x156: 0x9f, 0x157: 0x9f, 0x158: 0x9f, 0x159: 0xa8, 0x15a: 0xa9, 0x15b: 0xaa, 0x15c: 0xab, 0x15d: 0xac, 0x15e: 0xad, 0x15f: 0xae, 0x160: 0xaf, 0x161: 0xb0, 0x162: 0xb1, 0x163: 0xb2, 0x164: 0xb3, 0x165: 0xb4, 0x166: 0xb5, 0x167: 0xb6, 0x168: 0xb7, 0x169: 0xb8, 0x16a: 0xb9, 0x16b: 0xba, 0x16c: 0xbb, 0x16d: 0xbc, 0x16e: 0xbd, 0x16f: 0xbe, 0x170: 0xbf, 0x171: 0xc0, 0x172: 0xc1, 0x173: 0xc2, 0x174: 0x25, 0x175: 0x26, 0x176: 0x27, 0x177: 0xc3, 0x178: 0x28, 0x179: 0x28, 0x17a: 0x29, 0x17b: 0x28, 0x17c: 0xc4, 0x17d: 0x2a, 0x17e: 0x2b, 0x17f: 0x2c, // Block 0x6, offset 0x180 0x180: 0x2d, 0x181: 0x2e, 0x182: 0x2f, 0x183: 0xc5, 0x184: 0x30, 0x185: 0x31, 0x186: 0xc6, 0x187: 0x9b, 0x188: 0xc7, 0x189: 0xc8, 0x18a: 0x9b, 0x18b: 0x9b, 0x18c: 0xc9, 0x18d: 0x9b, 0x18e: 0x9b, 0x18f: 0x9b, 0x190: 0xca, 0x191: 0x32, 0x192: 0x33, 0x193: 0x34, 0x194: 0x9b, 0x195: 0x9b, 0x196: 0x9b, 0x197: 0x9b, 0x198: 0x9b, 0x199: 0x9b, 0x19a: 0x9b, 0x19b: 0x9b, 0x19c: 0x9b, 0x19d: 0x9b, 0x19e: 0x9b, 0x19f: 0x9b, 0x1a0: 0x9b, 0x1a1: 0x9b, 0x1a2: 0x9b, 0x1a3: 0x9b, 0x1a4: 0x9b, 0x1a5: 0x9b, 0x1a6: 0x9b, 0x1a7: 0x9b, 0x1a8: 0xcb, 0x1a9: 0xcc, 0x1aa: 0x9b, 0x1ab: 0xcd, 0x1ac: 0x9b, 0x1ad: 0xce, 0x1ae: 0xcf, 0x1af: 0xd0, 0x1b0: 0xd1, 0x1b1: 0x35, 0x1b2: 0x28, 0x1b3: 0x36, 0x1b4: 0xd2, 0x1b5: 0xd3, 0x1b6: 0xd4, 0x1b7: 0xd5, 0x1b8: 0xd6, 0x1b9: 0xd7, 0x1ba: 0xd8, 0x1bb: 0xd9, 0x1bc: 0xda, 0x1bd: 0xdb, 0x1be: 0xdc, 0x1bf: 0x37, // Block 0x7, offset 0x1c0 0x1c0: 0x38, 0x1c1: 0xdd, 0x1c2: 0xde, 0x1c3: 0xdf, 0x1c4: 0xe0, 0x1c5: 0x39, 0x1c6: 0x3a, 0x1c7: 0xe1, 0x1c8: 0xe2, 0x1c9: 0x3b, 0x1ca: 0x3c, 0x1cb: 0x3d, 0x1cc: 0x3e, 0x1cd: 0x3f, 0x1ce: 0x40, 0x1cf: 0x41, 0x1d0: 0x9f, 0x1d1: 0x9f, 0x1d2: 0x9f, 0x1d3: 0x9f, 0x1d4: 0x9f, 0x1d5: 0x9f, 0x1d6: 0x9f, 0x1d7: 0x9f, 0x1d8: 0x9f, 0x1d9: 0x9f, 0x1da: 0x9f, 0x1db: 0x9f, 0x1dc: 0x9f, 0x1dd: 0x9f, 0x1de: 0x9f, 0x1df: 0x9f, 0x1e0: 0x9f, 0x1e1: 0x9f, 0x1e2: 0x9f, 0x1e3: 0x9f, 0x1e4: 0x9f, 0x1e5: 0x9f, 0x1e6: 0x9f, 0x1e7: 0x9f, 0x1e8: 0x9f, 0x1e9: 0x9f, 0x1ea: 0x9f, 0x1eb: 0x9f, 0x1ec: 0x9f, 0x1ed: 0x9f, 0x1ee: 0x9f, 0x1ef: 0x9f, 0x1f0: 0x9f, 0x1f1: 0x9f, 0x1f2: 0x9f, 0x1f3: 0x9f, 0x1f4: 0x9f, 0x1f5: 0x9f, 0x1f6: 0x9f, 0x1f7: 0x9f, 0x1f8: 0x9f, 0x1f9: 0x9f, 0x1fa: 0x9f, 0x1fb: 0x9f, 0x1fc: 0x9f, 0x1fd: 0x9f, 0x1fe: 0x9f, 0x1ff: 0x9f, // Block 0x8, offset 0x200 0x200: 0x9f, 0x201: 0x9f, 0x202: 0x9f, 0x203: 0x9f, 0x204: 0x9f, 0x205: 0x9f, 0x206: 0x9f, 0x207: 0x9f, 0x208: 0x9f, 0x209: 0x9f, 0x20a: 0x9f, 0x20b: 0x9f, 0x20c: 0x9f, 0x20d: 0x9f, 0x20e: 0x9f, 0x20f: 0x9f, 0x210: 0x9f, 0x211: 0x9f, 0x212: 0x9f, 0x213: 0x9f, 0x214: 0x9f, 0x215: 0x9f, 0x216: 0x9f, 0x217: 0x9f, 0x218: 0x9f, 0x219: 0x9f, 0x21a: 0x9f, 0x21b: 0x9f, 0x21c: 0x9f, 0x21d: 0x9f, 0x21e: 0x9f, 0x21f: 0x9f, 0x220: 0x9f, 0x221: 0x9f, 0x222: 0x9f, 0x223: 0x9f, 0x224: 0x9f, 0x225: 0x9f, 0x226: 0x9f, 0x227: 0x9f, 0x228: 0x9f, 0x229: 0x9f, 0x22a: 0x9f, 0x22b: 0x9f, 0x22c: 0x9f, 0x22d: 0x9f, 0x22e: 0x9f, 0x22f: 0x9f, 0x230: 0x9f, 0x231: 0x9f, 0x232: 0x9f, 0x233: 0x9f, 0x234: 0x9f, 0x235: 0x9f, 0x236: 0xb2, 0x237: 0x9b, 0x238: 0x9f, 0x239: 0x9f, 0x23a: 0x9f, 0x23b: 0x9f, 0x23c: 0x9f, 0x23d: 0x9f, 0x23e: 0x9f, 0x23f: 0x9f, // Block 0x9, offset 0x240 0x240: 0x9f, 0x241: 0x9f, 0x242: 0x9f, 0x243: 0x9f, 0x244: 0x9f, 0x245: 0x9f, 0x246: 0x9f, 0x247: 0x9f, 0x248: 0x9f, 0x249: 0x9f, 0x24a: 0x9f, 0x24b: 0x9f, 0x24c: 0x9f, 0x24d: 0x9f, 0x24e: 0x9f, 0x24f: 0x9f, 0x250: 0x9f, 0x251: 0x9f, 0x252: 0x9f, 0x253: 0x9f, 0x254: 0x9f, 0x255: 0x9f, 0x256: 0x9f, 0x257: 0x9f, 0x258: 0x9f, 0x259: 0x9f, 0x25a: 0x9f, 0x25b: 0x9f, 0x25c: 0x9f, 0x25d: 0x9f, 0x25e: 0x9f, 0x25f: 0x9f, 0x260: 0x9f, 0x261: 0x9f, 0x262: 0x9f, 0x263: 0x9f, 0x264: 0x9f, 0x265: 0x9f, 0x266: 0x9f, 0x267: 0x9f, 0x268: 0x9f, 0x269: 0x9f, 0x26a: 0x9f, 0x26b: 0x9f, 0x26c: 0x9f, 0x26d: 0x9f, 0x26e: 0x9f, 0x26f: 0x9f, 0x270: 0x9f, 0x271: 0x9f, 0x272: 0x9f, 0x273: 0x9f, 0x274: 0x9f, 0x275: 0x9f, 0x276: 0x9f, 0x277: 0x9f, 0x278: 0x9f, 0x279: 0x9f, 0x27a: 0x9f, 0x27b: 0x9f, 0x27c: 0x9f, 0x27d: 0x9f, 0x27e: 0x9f, 0x27f: 0x9f, // Block 0xa, offset 0x280 0x280: 0x9f, 0x281: 0x9f, 0x282: 0x9f, 0x283: 0x9f, 0x284: 0x9f, 0x285: 0x9f, 0x286: 0x9f, 0x287: 0x9f, 0x288: 0x9f, 0x289: 0x9f, 0x28a: 0x9f, 0x28b: 0x9f, 0x28c: 0x9f, 0x28d: 0x9f, 0x28e: 0x9f, 0x28f: 0x9f, 0x290: 0x9f, 0x291: 0x9f, 0x292: 0x9f, 0x293: 0x9f, 0x294: 0x9f, 0x295: 0x9f, 0x296: 0x9f, 0x297: 0x9f, 0x298: 0x9f, 0x299: 0x9f, 0x29a: 0x9f, 0x29b: 0x9f, 0x29c: 0x9f, 0x29d: 0x9f, 0x29e: 0x9f, 0x29f: 0x9f, 0x2a0: 0x9f, 0x2a1: 0x9f, 0x2a2: 0x9f, 0x2a3: 0x9f, 0x2a4: 0x9f, 0x2a5: 0x9f, 0x2a6: 0x9f, 0x2a7: 0x9f, 0x2a8: 0x9f, 0x2a9: 0x9f, 0x2aa: 0x9f, 0x2ab: 0x9f, 0x2ac: 0x9f, 0x2ad: 0x9f, 0x2ae: 0x9f, 0x2af: 0x9f, 0x2b0: 0x9f, 0x2b1: 0x9f, 0x2b2: 0x9f, 0x2b3: 0x9f, 0x2b4: 0x9f, 0x2b5: 0x9f, 0x2b6: 0x9f, 0x2b7: 0x9f, 0x2b8: 0x9f, 0x2b9: 0x9f, 0x2ba: 0x9f, 0x2bb: 0x9f, 0x2bc: 0x9f, 0x2bd: 0x9f, 0x2be: 0x9f, 0x2bf: 0xe3, // Block 0xb, offset 0x2c0 0x2c0: 0x9f, 0x2c1: 0x9f, 0x2c2: 0x9f, 0x2c3: 0x9f, 0x2c4: 0x9f, 0x2c5: 0x9f, 0x2c6: 0x9f, 0x2c7: 0x9f, 0x2c8: 0x9f, 0x2c9: 0x9f, 0x2ca: 0x9f, 0x2cb: 0x9f, 0x2cc: 0x9f, 0x2cd: 0x9f, 0x2ce: 0x9f, 0x2cf: 0x9f, 0x2d0: 0x9f, 0x2d1: 0x9f, 0x2d2: 0xe4, 0x2d3: 0xe5, 0x2d4: 0x9f, 0x2d5: 0x9f, 0x2d6: 0x9f, 0x2d7: 0x9f, 0x2d8: 0xe6, 0x2d9: 0x42, 0x2da: 0x43, 0x2db: 0xe7, 0x2dc: 0x44, 0x2dd: 0x45, 0x2de: 0x46, 0x2df: 0xe8, 0x2e0: 0xe9, 0x2e1: 0xea, 0x2e2: 0xeb, 0x2e3: 0xec, 0x2e4: 0xed, 0x2e5: 0xee, 0x2e6: 0xef, 0x2e7: 0xf0, 0x2e8: 0xf1, 0x2e9: 0xf2, 0x2ea: 0xf3, 0x2eb: 0xf4, 0x2ec: 0xf5, 0x2ed: 0xf6, 0x2ee: 0xf7, 0x2ef: 0xf8, 0x2f0: 0x9f, 0x2f1: 0x9f, 0x2f2: 0x9f, 0x2f3: 0x9f, 0x2f4: 0x9f, 0x2f5: 0x9f, 0x2f6: 0x9f, 0x2f7: 0x9f, 0x2f8: 0x9f, 0x2f9: 0x9f, 0x2fa: 0x9f, 0x2fb: 0x9f, 0x2fc: 0x9f, 0x2fd: 0x9f, 0x2fe: 0x9f, 0x2ff: 0x9f, // Block 0xc, offset 0x300 0x300: 0x9f, 0x301: 0x9f, 0x302: 0x9f, 0x303: 0x9f, 0x304: 0x9f, 0x305: 0x9f, 0x306: 0x9f, 0x307: 0x9f, 0x308: 0x9f, 0x309: 0x9f, 0x30a: 0x9f, 0x30b: 0x9f, 0x30c: 0x9f, 0x30d: 0x9f, 0x30e: 0x9f, 0x30f: 0x9f, 0x310: 0x9f, 0x311: 0x9f, 0x312: 0x9f, 0x313: 0x9f, 0x314: 0x9f, 0x315: 0x9f, 0x316: 0x9f, 0x317: 0x9f, 0x318: 0x9f, 0x319: 0x9f, 0x31a: 0x9f, 0x31b: 0x9f, 0x31c: 0x9f, 0x31d: 0x9f, 0x31e: 0xf9, 0x31f: 0xfa, // Block 0xd, offset 0x340 0x340: 0xba, 0x341: 0xba, 0x342: 0xba, 0x343: 0xba, 0x344: 0xba, 0x345: 0xba, 0x346: 0xba, 0x347: 0xba, 0x348: 0xba, 0x349: 0xba, 0x34a: 0xba, 0x34b: 0xba, 0x34c: 0xba, 0x34d: 0xba, 0x34e: 0xba, 0x34f: 0xba, 0x350: 0xba, 0x351: 0xba, 0x352: 0xba, 0x353: 0xba, 0x354: 0xba, 0x355: 0xba, 0x356: 0xba, 0x357: 0xba, 0x358: 0xba, 0x359: 0xba, 0x35a: 0xba, 0x35b: 0xba, 0x35c: 0xba, 0x35d: 0xba, 0x35e: 0xba, 0x35f: 0xba, 0x360: 0xba, 0x361: 0xba, 0x362: 0xba, 0x363: 0xba, 0x364: 0xba, 0x365: 0xba, 0x366: 0xba, 0x367: 0xba, 0x368: 0xba, 0x369: 0xba, 0x36a: 0xba, 0x36b: 0xba, 0x36c: 0xba, 0x36d: 0xba, 0x36e: 0xba, 0x36f: 0xba, 0x370: 0xba, 0x371: 0xba, 0x372: 0xba, 0x373: 0xba, 0x374: 0xba, 0x375: 0xba, 0x376: 0xba, 0x377: 0xba, 0x378: 0xba, 0x379: 0xba, 0x37a: 0xba, 0x37b: 0xba, 0x37c: 0xba, 0x37d: 0xba, 0x37e: 0xba, 0x37f: 0xba, // Block 0xe, offset 0x380 0x380: 0xba, 0x381: 0xba, 0x382: 0xba, 0x383: 0xba, 0x384: 0xba, 0x385: 0xba, 0x386: 0xba, 0x387: 0xba, 0x388: 0xba, 0x389: 0xba, 0x38a: 0xba, 0x38b: 0xba, 0x38c: 0xba, 0x38d: 0xba, 0x38e: 0xba, 0x38f: 0xba, 0x390: 0xba, 0x391: 0xba, 0x392: 0xba, 0x393: 0xba, 0x394: 0xba, 0x395: 0xba, 0x396: 0xba, 0x397: 0xba, 0x398: 0xba, 0x399: 0xba, 0x39a: 0xba, 0x39b: 0xba, 0x39c: 0xba, 0x39d: 0xba, 0x39e: 0xba, 0x39f: 0xba, 0x3a0: 0xba, 0x3a1: 0xba, 0x3a2: 0xba, 0x3a3: 0xba, 0x3a4: 0xfb, 0x3a5: 0xfc, 0x3a6: 0xfd, 0x3a7: 0xfe, 0x3a8: 0x47, 0x3a9: 0xff, 0x3aa: 0x100, 0x3ab: 0x48, 0x3ac: 0x49, 0x3ad: 0x4a, 0x3ae: 0x4b, 0x3af: 0x4c, 0x3b0: 0x101, 0x3b1: 0x4d, 0x3b2: 0x4e, 0x3b3: 0x4f, 0x3b4: 0x50, 0x3b5: 0x51, 0x3b6: 0x102, 0x3b7: 0x52, 0x3b8: 0x53, 0x3b9: 0x54, 0x3ba: 0x55, 0x3bb: 0x56, 0x3bc: 0x57, 0x3bd: 0x58, 0x3be: 0x59, 0x3bf: 0x5a, // Block 0xf, offset 0x3c0 0x3c0: 0x103, 0x3c1: 0x104, 0x3c2: 0x9f, 0x3c3: 0x105, 0x3c4: 0x106, 0x3c5: 0x9b, 0x3c6: 0x107, 0x3c7: 0x108, 0x3c8: 0xba, 0x3c9: 0xba, 0x3ca: 0x109, 0x3cb: 0x10a, 0x3cc: 0x10b, 0x3cd: 0x10c, 0x3ce: 0x10d, 0x3cf: 0x10e, 0x3d0: 0x10f, 0x3d1: 0x9f, 0x3d2: 0x110, 0x3d3: 0x111, 0x3d4: 0x112, 0x3d5: 0x113, 0x3d6: 0xba, 0x3d7: 0xba, 0x3d8: 0x9f, 0x3d9: 0x9f, 0x3da: 0x9f, 0x3db: 0x9f, 0x3dc: 0x114, 0x3dd: 0x115, 0x3de: 0xba, 0x3df: 0xba, 0x3e0: 0x116, 0x3e1: 0x117, 0x3e2: 0x118, 0x3e3: 0x119, 0x3e4: 0x11a, 0x3e5: 0xba, 0x3e6: 0x11b, 0x3e7: 0x11c, 0x3e8: 0x11d, 0x3e9: 0x11e, 0x3ea: 0x11f, 0x3eb: 0x5b, 0x3ec: 0x120, 0x3ed: 0x121, 0x3ee: 0x5c, 0x3ef: 0xba, 0x3f0: 0x122, 0x3f1: 0x123, 0x3f2: 0x124, 0x3f3: 0x125, 0x3f4: 0xba, 0x3f5: 0xba, 0x3f6: 0xba, 0x3f7: 0xba, 0x3f8: 0xba, 0x3f9: 0x126, 0x3fa: 0xba, 0x3fb: 0xba, 0x3fc: 0xba, 0x3fd: 0xba, 0x3fe: 0xba, 0x3ff: 0xba, // Block 0x10, offset 0x400 0x400: 0x127, 0x401: 0x128, 0x402: 0x129, 0x403: 0x12a, 0x404: 0x12b, 0x405: 0x12c, 0x406: 0x12d, 0x407: 0x12e, 0x408: 0x12f, 0x409: 0xba, 0x40a: 0x130, 0x40b: 0x131, 0x40c: 0x5d, 0x40d: 0x5e, 0x40e: 0xba, 0x40f: 0xba, 0x410: 0x132, 0x411: 0x133, 0x412: 0x134, 0x413: 0x135, 0x414: 0xba, 0x415: 0xba, 0x416: 0x136, 0x417: 0x137, 0x418: 0x138, 0x419: 0x139, 0x41a: 0x13a, 0x41b: 0x13b, 0x41c: 0x13c, 0x41d: 0xba, 0x41e: 0xba, 0x41f: 0xba, 0x420: 0xba, 0x421: 0xba, 0x422: 0x13d, 0x423: 0x13e, 0x424: 0xba, 0x425: 0xba, 0x426: 0xba, 0x427: 0xba, 0x428: 0x13f, 0x429: 0x140, 0x42a: 0x141, 0x42b: 0x142, 0x42c: 0xba, 0x42d: 0xba, 0x42e: 0xba, 0x42f: 0xba, 0x430: 0x143, 0x431: 0x144, 0x432: 0x145, 0x433: 0xba, 0x434: 0x146, 0x435: 0x147, 0x436: 0xba, 0x437: 0xba, 0x438: 0xba, 0x439: 0xba, 0x43a: 0xba, 0x43b: 0xba, 0x43c: 0xba, 0x43d: 0xba, 0x43e: 0xba, 0x43f: 0xba, // Block 0x11, offset 0x440 0x440: 0x9f, 0x441: 0x9f, 0x442: 0x9f, 0x443: 0x9f, 0x444: 0x9f, 0x445: 0x9f, 0x446: 0x9f, 0x447: 0x9f, 0x448: 0x9f, 0x449: 0x9f, 0x44a: 0x9f, 0x44b: 0x9f, 0x44c: 0x9f, 0x44d: 0x9f, 0x44e: 0x148, 0x44f: 0xba, 0x450: 0x9b, 0x451: 0x149, 0x452: 0x9f, 0x453: 0x9f, 0x454: 0x9f, 0x455: 0x14a, 0x456: 0xba, 0x457: 0xba, 0x458: 0xba, 0x459: 0xba, 0x45a: 0xba, 0x45b: 0xba, 0x45c: 0xba, 0x45d: 0xba, 0x45e: 0xba, 0x45f: 0xba, 0x460: 0xba, 0x461: 0xba, 0x462: 0xba, 0x463: 0xba, 0x464: 0xba, 0x465: 0xba, 0x466: 0xba, 0x467: 0xba, 0x468: 0xba, 0x469: 0xba, 0x46a: 0xba, 0x46b: 0xba, 0x46c: 0xba, 0x46d: 0xba, 0x46e: 0xba, 0x46f: 0xba, 0x470: 0xba, 0x471: 0xba, 0x472: 0xba, 0x473: 0xba, 0x474: 0xba, 0x475: 0xba, 0x476: 0xba, 0x477: 0xba, 0x478: 0xba, 0x479: 0xba, 0x47a: 0xba, 0x47b: 0xba, 0x47c: 0xba, 0x47d: 0xba, 0x47e: 0xba, 0x47f: 0xba, // Block 0x12, offset 0x480 0x480: 0x9f, 0x481: 0x9f, 0x482: 0x9f, 0x483: 0x9f, 0x484: 0x9f, 0x485: 0x9f, 0x486: 0x9f, 0x487: 0x9f, 0x488: 0x9f, 0x489: 0x9f, 0x48a: 0x9f, 0x48b: 0x9f, 0x48c: 0x9f, 0x48d: 0x9f, 0x48e: 0x9f, 0x48f: 0x9f, 0x490: 0x14b, 0x491: 0xba, 0x492: 0xba, 0x493: 0xba, 0x494: 0xba, 0x495: 0xba, 0x496: 0xba, 0x497: 0xba, 0x498: 0xba, 0x499: 0xba, 0x49a: 0xba, 0x49b: 0xba, 0x49c: 0xba, 0x49d: 0xba, 0x49e: 0xba, 0x49f: 0xba, 0x4a0: 0xba, 0x4a1: 0xba, 0x4a2: 0xba, 0x4a3: 0xba, 0x4a4: 0xba, 0x4a5: 0xba, 0x4a6: 0xba, 0x4a7: 0xba, 0x4a8: 0xba, 0x4a9: 0xba, 0x4aa: 0xba, 0x4ab: 0xba, 0x4ac: 0xba, 0x4ad: 0xba, 0x4ae: 0xba, 0x4af: 0xba, 0x4b0: 0xba, 0x4b1: 0xba, 0x4b2: 0xba, 0x4b3: 0xba, 0x4b4: 0xba, 0x4b5: 0xba, 0x4b6: 0xba, 0x4b7: 0xba, 0x4b8: 0xba, 0x4b9: 0xba, 0x4ba: 0xba, 0x4bb: 0xba, 0x4bc: 0xba, 0x4bd: 0xba, 0x4be: 0xba, 0x4bf: 0xba, // Block 0x13, offset 0x4c0 0x4c0: 0xba, 0x4c1: 0xba, 0x4c2: 0xba, 0x4c3: 0xba, 0x4c4: 0xba, 0x4c5: 0xba, 0x4c6: 0xba, 0x4c7: 0xba, 0x4c8: 0xba, 0x4c9: 0xba, 0x4ca: 0xba, 0x4cb: 0xba, 0x4cc: 0xba, 0x4cd: 0xba, 0x4ce: 0xba, 0x4cf: 0xba, 0x4d0: 0x9f, 0x4d1: 0x9f, 0x4d2: 0x9f, 0x4d3: 0x9f, 0x4d4: 0x9f, 0x4d5: 0x9f, 0x4d6: 0x9f, 0x4d7: 0x9f, 0x4d8: 0x9f, 0x4d9: 0x14c, 0x4da: 0xba, 0x4db: 0xba, 0x4dc: 0xba, 0x4dd: 0xba, 0x4de: 0xba, 0x4df: 0xba, 0x4e0: 0xba, 0x4e1: 0xba, 0x4e2: 0xba, 0x4e3: 0xba, 0x4e4: 0xba, 0x4e5: 0xba, 0x4e6: 0xba, 0x4e7: 0xba, 0x4e8: 0xba, 0x4e9: 0xba, 0x4ea: 0xba, 0x4eb: 0xba, 0x4ec: 0xba, 0x4ed: 0xba, 0x4ee: 0xba, 0x4ef: 0xba, 0x4f0: 0xba, 0x4f1: 0xba, 0x4f2: 0xba, 0x4f3: 0xba, 0x4f4: 0xba, 0x4f5: 0xba, 0x4f6: 0xba, 0x4f7: 0xba, 0x4f8: 0xba, 0x4f9: 0xba, 0x4fa: 0xba, 0x4fb: 0xba, 0x4fc: 0xba, 0x4fd: 0xba, 0x4fe: 0xba, 0x4ff: 0xba, // Block 0x14, offset 0x500 0x500: 0xba, 0x501: 0xba, 0x502: 0xba, 0x503: 0xba, 0x504: 0xba, 0x505: 0xba, 0x506: 0xba, 0x507: 0xba, 0x508: 0xba, 0x509: 0xba, 0x50a: 0xba, 0x50b: 0xba, 0x50c: 0xba, 0x50d: 0xba, 0x50e: 0xba, 0x50f: 0xba, 0x510: 0xba, 0x511: 0xba, 0x512: 0xba, 0x513: 0xba, 0x514: 0xba, 0x515: 0xba, 0x516: 0xba, 0x517: 0xba, 0x518: 0xba, 0x519: 0xba, 0x51a: 0xba, 0x51b: 0xba, 0x51c: 0xba, 0x51d: 0xba, 0x51e: 0xba, 0x51f: 0xba, 0x520: 0x9f, 0x521: 0x9f, 0x522: 0x9f, 0x523: 0x9f, 0x524: 0x9f, 0x525: 0x9f, 0x526: 0x9f, 0x527: 0x9f, 0x528: 0x142, 0x529: 0x14d, 0x52a: 0xba, 0x52b: 0x14e, 0x52c: 0x14f, 0x52d: 0x150, 0x52e: 0x151, 0x52f: 0xba, 0x530: 0xba, 0x531: 0xba, 0x532: 0xba, 0x533: 0xba, 0x534: 0xba, 0x535: 0xba, 0x536: 0xba, 0x537: 0xba, 0x538: 0xba, 0x539: 0xba, 0x53a: 0xba, 0x53b: 0xba, 0x53c: 0x9f, 0x53d: 0x152, 0x53e: 0x153, 0x53f: 0x154, // Block 0x15, offset 0x540 0x540: 0x9f, 0x541: 0x9f, 0x542: 0x9f, 0x543: 0x9f, 0x544: 0x9f, 0x545: 0x9f, 0x546: 0x9f, 0x547: 0x9f, 0x548: 0x9f, 0x549: 0x9f, 0x54a: 0x9f, 0x54b: 0x9f, 0x54c: 0x9f, 0x54d: 0x9f, 0x54e: 0x9f, 0x54f: 0x9f, 0x550: 0x9f, 0x551: 0x9f, 0x552: 0x9f, 0x553: 0x9f, 0x554: 0x9f, 0x555: 0x9f, 0x556: 0x9f, 0x557: 0x9f, 0x558: 0x9f, 0x559: 0x9f, 0x55a: 0x9f, 0x55b: 0x9f, 0x55c: 0x9f, 0x55d: 0x9f, 0x55e: 0x9f, 0x55f: 0x155, 0x560: 0x9f, 0x561: 0x9f, 0x562: 0x9f, 0x563: 0x9f, 0x564: 0x9f, 0x565: 0x9f, 0x566: 0x9f, 0x567: 0x9f, 0x568: 0x9f, 0x569: 0x9f, 0x56a: 0x9f, 0x56b: 0x156, 0x56c: 0xba, 0x56d: 0xba, 0x56e: 0xba, 0x56f: 0xba, 0x570: 0xba, 0x571: 0xba, 0x572: 0xba, 0x573: 0xba, 0x574: 0xba, 0x575: 0xba, 0x576: 0xba, 0x577: 0xba, 0x578: 0xba, 0x579: 0xba, 0x57a: 0xba, 0x57b: 0xba, 0x57c: 0xba, 0x57d: 0xba, 0x57e: 0xba, 0x57f: 0xba, // Block 0x16, offset 0x580 0x580: 0x9f, 0x581: 0x9f, 0x582: 0x9f, 0x583: 0x9f, 0x584: 0x157, 0x585: 0x158, 0x586: 0x9f, 0x587: 0x9f, 0x588: 0x9f, 0x589: 0x9f, 0x58a: 0x9f, 0x58b: 0x159, 0x58c: 0xba, 0x58d: 0xba, 0x58e: 0xba, 0x58f: 0xba, 0x590: 0xba, 0x591: 0xba, 0x592: 0xba, 0x593: 0xba, 0x594: 0xba, 0x595: 0xba, 0x596: 0xba, 0x597: 0xba, 0x598: 0xba, 0x599: 0xba, 0x59a: 0xba, 0x59b: 0xba, 0x59c: 0xba, 0x59d: 0xba, 0x59e: 0xba, 0x59f: 0xba, 0x5a0: 0xba, 0x5a1: 0xba, 0x5a2: 0xba, 0x5a3: 0xba, 0x5a4: 0xba, 0x5a5: 0xba, 0x5a6: 0xba, 0x5a7: 0xba, 0x5a8: 0xba, 0x5a9: 0xba, 0x5aa: 0xba, 0x5ab: 0xba, 0x5ac: 0xba, 0x5ad: 0xba, 0x5ae: 0xba, 0x5af: 0xba, 0x5b0: 0x9f, 0x5b1: 0x15a, 0x5b2: 0x15b, 0x5b3: 0xba, 0x5b4: 0xba, 0x5b5: 0xba, 0x5b6: 0xba, 0x5b7: 0xba, 0x5b8: 0xba, 0x5b9: 0xba, 0x5ba: 0xba, 0x5bb: 0xba, 0x5bc: 0xba, 0x5bd: 0xba, 0x5be: 0xba, 0x5bf: 0xba, // Block 0x17, offset 0x5c0 0x5c0: 0x9b, 0x5c1: 0x9b, 0x5c2: 0x9b, 0x5c3: 0x15c, 0x5c4: 0x15d, 0x5c5: 0x15e, 0x5c6: 0x15f, 0x5c7: 0x160, 0x5c8: 0x9b, 0x5c9: 0x161, 0x5ca: 0xba, 0x5cb: 0xba, 0x5cc: 0x9b, 0x5cd: 0x162, 0x5ce: 0xba, 0x5cf: 0xba, 0x5d0: 0x5f, 0x5d1: 0x60, 0x5d2: 0x61, 0x5d3: 0x62, 0x5d4: 0x63, 0x5d5: 0x64, 0x5d6: 0x65, 0x5d7: 0x66, 0x5d8: 0x67, 0x5d9: 0x68, 0x5da: 0x69, 0x5db: 0x6a, 0x5dc: 0x6b, 0x5dd: 0x6c, 0x5de: 0x6d, 0x5df: 0x6e, 0x5e0: 0x9b, 0x5e1: 0x9b, 0x5e2: 0x9b, 0x5e3: 0x9b, 0x5e4: 0x9b, 0x5e5: 0x9b, 0x5e6: 0x9b, 0x5e7: 0x9b, 0x5e8: 0x163, 0x5e9: 0x164, 0x5ea: 0x165, 0x5eb: 0xba, 0x5ec: 0xba, 0x5ed: 0xba, 0x5ee: 0xba, 0x5ef: 0xba, 0x5f0: 0xba, 0x5f1: 0xba, 0x5f2: 0xba, 0x5f3: 0xba, 0x5f4: 0xba, 0x5f5: 0xba, 0x5f6: 0xba, 0x5f7: 0xba, 0x5f8: 0xba, 0x5f9: 0xba, 0x5fa: 0xba, 0x5fb: 0xba, 0x5fc: 0xba, 0x5fd: 0xba, 0x5fe: 0xba, 0x5ff: 0xba, // Block 0x18, offset 0x600 0x600: 0x166, 0x601: 0xba, 0x602: 0xba, 0x603: 0xba, 0x604: 0xba, 0x605: 0xba, 0x606: 0xba, 0x607: 0xba, 0x608: 0xba, 0x609: 0xba, 0x60a: 0xba, 0x60b: 0xba, 0x60c: 0xba, 0x60d: 0xba, 0x60e: 0xba, 0x60f: 0xba, 0x610: 0xba, 0x611: 0xba, 0x612: 0xba, 0x613: 0xba, 0x614: 0xba, 0x615: 0xba, 0x616: 0xba, 0x617: 0xba, 0x618: 0xba, 0x619: 0xba, 0x61a: 0xba, 0x61b: 0xba, 0x61c: 0xba, 0x61d: 0xba, 0x61e: 0xba, 0x61f: 0xba, 0x620: 0x122, 0x621: 0x122, 0x622: 0x122, 0x623: 0x167, 0x624: 0x6f, 0x625: 0x168, 0x626: 0xba, 0x627: 0xba, 0x628: 0xba, 0x629: 0xba, 0x62a: 0xba, 0x62b: 0xba, 0x62c: 0xba, 0x62d: 0xba, 0x62e: 0xba, 0x62f: 0xba, 0x630: 0xba, 0x631: 0xba, 0x632: 0xba, 0x633: 0xba, 0x634: 0xba, 0x635: 0xba, 0x636: 0xba, 0x637: 0xba, 0x638: 0x70, 0x639: 0x71, 0x63a: 0x72, 0x63b: 0x169, 0x63c: 0xba, 0x63d: 0xba, 0x63e: 0xba, 0x63f: 0xba, // Block 0x19, offset 0x640 0x640: 0x16a, 0x641: 0x9b, 0x642: 0x16b, 0x643: 0x16c, 0x644: 0x73, 0x645: 0x74, 0x646: 0x16d, 0x647: 0x16e, 0x648: 0x75, 0x649: 0x16f, 0x64a: 0xba, 0x64b: 0xba, 0x64c: 0x9b, 0x64d: 0x9b, 0x64e: 0x9b, 0x64f: 0x9b, 0x650: 0x9b, 0x651: 0x9b, 0x652: 0x9b, 0x653: 0x9b, 0x654: 0x9b, 0x655: 0x9b, 0x656: 0x9b, 0x657: 0x9b, 0x658: 0x9b, 0x659: 0x9b, 0x65a: 0x9b, 0x65b: 0x170, 0x65c: 0x9b, 0x65d: 0x171, 0x65e: 0x9b, 0x65f: 0x172, 0x660: 0x173, 0x661: 0x174, 0x662: 0x175, 0x663: 0xba, 0x664: 0x176, 0x665: 0x177, 0x666: 0x178, 0x667: 0x179, 0x668: 0xba, 0x669: 0xba, 0x66a: 0xba, 0x66b: 0xba, 0x66c: 0xba, 0x66d: 0xba, 0x66e: 0xba, 0x66f: 0xba, 0x670: 0xba, 0x671: 0xba, 0x672: 0xba, 0x673: 0xba, 0x674: 0xba, 0x675: 0xba, 0x676: 0xba, 0x677: 0xba, 0x678: 0xba, 0x679: 0xba, 0x67a: 0xba, 0x67b: 0xba, 0x67c: 0xba, 0x67d: 0xba, 0x67e: 0xba, 0x67f: 0xba, // Block 0x1a, offset 0x680 0x680: 0x9f, 0x681: 0x9f, 0x682: 0x9f, 0x683: 0x9f, 0x684: 0x9f, 0x685: 0x9f, 0x686: 0x9f, 0x687: 0x9f, 0x688: 0x9f, 0x689: 0x9f, 0x68a: 0x9f, 0x68b: 0x9f, 0x68c: 0x9f, 0x68d: 0x9f, 0x68e: 0x9f, 0x68f: 0x9f, 0x690: 0x9f, 0x691: 0x9f, 0x692: 0x9f, 0x693: 0x9f, 0x694: 0x9f, 0x695: 0x9f, 0x696: 0x9f, 0x697: 0x9f, 0x698: 0x9f, 0x699: 0x9f, 0x69a: 0x9f, 0x69b: 0x17a, 0x69c: 0x9f, 0x69d: 0x9f, 0x69e: 0x9f, 0x69f: 0x9f, 0x6a0: 0x9f, 0x6a1: 0x9f, 0x6a2: 0x9f, 0x6a3: 0x9f, 0x6a4: 0x9f, 0x6a5: 0x9f, 0x6a6: 0x9f, 0x6a7: 0x9f, 0x6a8: 0x9f, 0x6a9: 0x9f, 0x6aa: 0x9f, 0x6ab: 0x9f, 0x6ac: 0x9f, 0x6ad: 0x9f, 0x6ae: 0x9f, 0x6af: 0x9f, 0x6b0: 0x9f, 0x6b1: 0x9f, 0x6b2: 0x9f, 0x6b3: 0x9f, 0x6b4: 0x9f, 0x6b5: 0x9f, 0x6b6: 0x9f, 0x6b7: 0x9f, 0x6b8: 0x9f, 0x6b9: 0x9f, 0x6ba: 0x9f, 0x6bb: 0x9f, 0x6bc: 0x9f, 0x6bd: 0x9f, 0x6be: 0x9f, 0x6bf: 0x9f, // Block 0x1b, offset 0x6c0 0x6c0: 0x9f, 0x6c1: 0x9f, 0x6c2: 0x9f, 0x6c3: 0x9f, 0x6c4: 0x9f, 0x6c5: 0x9f, 0x6c6: 0x9f, 0x6c7: 0x9f, 0x6c8: 0x9f, 0x6c9: 0x9f, 0x6ca: 0x9f, 0x6cb: 0x9f, 0x6cc: 0x9f, 0x6cd: 0x9f, 0x6ce: 0x9f, 0x6cf: 0x9f, 0x6d0: 0x9f, 0x6d1: 0x9f, 0x6d2: 0x9f, 0x6d3: 0x9f, 0x6d4: 0x9f, 0x6d5: 0x9f, 0x6d6: 0x9f, 0x6d7: 0x9f, 0x6d8: 0x9f, 0x6d9: 0x9f, 0x6da: 0x9f, 0x6db: 0x9f, 0x6dc: 0x17b, 0x6dd: 0x9f, 0x6de: 0x9f, 0x6df: 0x9f, 0x6e0: 0x17c, 0x6e1: 0x9f, 0x6e2: 0x9f, 0x6e3: 0x9f, 0x6e4: 0x9f, 0x6e5: 0x9f, 0x6e6: 0x9f, 0x6e7: 0x9f, 0x6e8: 0x9f, 0x6e9: 0x9f, 0x6ea: 0x9f, 0x6eb: 0x9f, 0x6ec: 0x9f, 0x6ed: 0x9f, 0x6ee: 0x9f, 0x6ef: 0x9f, 0x6f0: 0x9f, 0x6f1: 0x9f, 0x6f2: 0x9f, 0x6f3: 0x9f, 0x6f4: 0x9f, 0x6f5: 0x9f, 0x6f6: 0x9f, 0x6f7: 0x9f, 0x6f8: 0x9f, 0x6f9: 0x9f, 0x6fa: 0x9f, 0x6fb: 0x9f, 0x6fc: 0x9f, 0x6fd: 0x9f, 0x6fe: 0x9f, 0x6ff: 0x9f, // Block 0x1c, offset 0x700 0x700: 0x9f, 0x701: 0x9f, 0x702: 0x9f, 0x703: 0x9f, 0x704: 0x9f, 0x705: 0x9f, 0x706: 0x9f, 0x707: 0x9f, 0x708: 0x9f, 0x709: 0x9f, 0x70a: 0x9f, 0x70b: 0x9f, 0x70c: 0x9f, 0x70d: 0x9f, 0x70e: 0x9f, 0x70f: 0x9f, 0x710: 0x9f, 0x711: 0x9f, 0x712: 0x9f, 0x713: 0x9f, 0x714: 0x9f, 0x715: 0x9f, 0x716: 0x9f, 0x717: 0x9f, 0x718: 0x9f, 0x719: 0x9f, 0x71a: 0x9f, 0x71b: 0x9f, 0x71c: 0x9f, 0x71d: 0x9f, 0x71e: 0x9f, 0x71f: 0x9f, 0x720: 0x9f, 0x721: 0x9f, 0x722: 0x9f, 0x723: 0x9f, 0x724: 0x9f, 0x725: 0x9f, 0x726: 0x9f, 0x727: 0x9f, 0x728: 0x9f, 0x729: 0x9f, 0x72a: 0x9f, 0x72b: 0x9f, 0x72c: 0x9f, 0x72d: 0x9f, 0x72e: 0x9f, 0x72f: 0x9f, 0x730: 0x9f, 0x731: 0x9f, 0x732: 0x9f, 0x733: 0x9f, 0x734: 0x9f, 0x735: 0x9f, 0x736: 0x9f, 0x737: 0x9f, 0x738: 0x9f, 0x739: 0x9f, 0x73a: 0x17d, 0x73b: 0x9f, 0x73c: 0x9f, 0x73d: 0x9f, 0x73e: 0x9f, 0x73f: 0x9f, // Block 0x1d, offset 0x740 0x740: 0x9f, 0x741: 0x9f, 0x742: 0x9f, 0x743: 0x9f, 0x744: 0x9f, 0x745: 0x9f, 0x746: 0x9f, 0x747: 0x9f, 0x748: 0x9f, 0x749: 0x9f, 0x74a: 0x9f, 0x74b: 0x9f, 0x74c: 0x9f, 0x74d: 0x9f, 0x74e: 0x9f, 0x74f: 0x9f, 0x750: 0x9f, 0x751: 0x9f, 0x752: 0x9f, 0x753: 0x9f, 0x754: 0x9f, 0x755: 0x9f, 0x756: 0x9f, 0x757: 0x9f, 0x758: 0x9f, 0x759: 0x9f, 0x75a: 0x9f, 0x75b: 0x9f, 0x75c: 0x9f, 0x75d: 0x9f, 0x75e: 0x9f, 0x75f: 0x9f, 0x760: 0x9f, 0x761: 0x9f, 0x762: 0x9f, 0x763: 0x9f, 0x764: 0x9f, 0x765: 0x9f, 0x766: 0x9f, 0x767: 0x9f, 0x768: 0x9f, 0x769: 0x9f, 0x76a: 0x9f, 0x76b: 0x9f, 0x76c: 0x9f, 0x76d: 0x9f, 0x76e: 0x9f, 0x76f: 0x17e, 0x770: 0xba, 0x771: 0xba, 0x772: 0xba, 0x773: 0xba, 0x774: 0xba, 0x775: 0xba, 0x776: 0xba, 0x777: 0xba, 0x778: 0xba, 0x779: 0xba, 0x77a: 0xba, 0x77b: 0xba, 0x77c: 0xba, 0x77d: 0xba, 0x77e: 0xba, 0x77f: 0xba, // Block 0x1e, offset 0x780 0x780: 0xba, 0x781: 0xba, 0x782: 0xba, 0x783: 0xba, 0x784: 0xba, 0x785: 0xba, 0x786: 0xba, 0x787: 0xba, 0x788: 0xba, 0x789: 0xba, 0x78a: 0xba, 0x78b: 0xba, 0x78c: 0xba, 0x78d: 0xba, 0x78e: 0xba, 0x78f: 0xba, 0x790: 0xba, 0x791: 0xba, 0x792: 0xba, 0x793: 0xba, 0x794: 0xba, 0x795: 0xba, 0x796: 0xba, 0x797: 0xba, 0x798: 0xba, 0x799: 0xba, 0x79a: 0xba, 0x79b: 0xba, 0x79c: 0xba, 0x79d: 0xba, 0x79e: 0xba, 0x79f: 0xba, 0x7a0: 0x76, 0x7a1: 0x77, 0x7a2: 0x78, 0x7a3: 0x17f, 0x7a4: 0x79, 0x7a5: 0x7a, 0x7a6: 0x180, 0x7a7: 0x7b, 0x7a8: 0x7c, 0x7a9: 0xba, 0x7aa: 0xba, 0x7ab: 0xba, 0x7ac: 0xba, 0x7ad: 0xba, 0x7ae: 0xba, 0x7af: 0xba, 0x7b0: 0xba, 0x7b1: 0xba, 0x7b2: 0xba, 0x7b3: 0xba, 0x7b4: 0xba, 0x7b5: 0xba, 0x7b6: 0xba, 0x7b7: 0xba, 0x7b8: 0xba, 0x7b9: 0xba, 0x7ba: 0xba, 0x7bb: 0xba, 0x7bc: 0xba, 0x7bd: 0xba, 0x7be: 0xba, 0x7bf: 0xba, // Block 0x1f, offset 0x7c0 0x7d0: 0x0d, 0x7d1: 0x0e, 0x7d2: 0x0f, 0x7d3: 0x10, 0x7d4: 0x11, 0x7d5: 0x0b, 0x7d6: 0x12, 0x7d7: 0x07, 0x7d8: 0x13, 0x7d9: 0x0b, 0x7da: 0x0b, 0x7db: 0x14, 0x7dc: 0x0b, 0x7dd: 0x15, 0x7de: 0x16, 0x7df: 0x17, 0x7e0: 0x07, 0x7e1: 0x07, 0x7e2: 0x07, 0x7e3: 0x07, 0x7e4: 0x07, 0x7e5: 0x07, 0x7e6: 0x07, 0x7e7: 0x07, 0x7e8: 0x07, 0x7e9: 0x07, 0x7ea: 0x18, 0x7eb: 0x19, 0x7ec: 0x1a, 0x7ed: 0x07, 0x7ee: 0x1b, 0x7ef: 0x1c, 0x7f0: 0x0b, 0x7f1: 0x0b, 0x7f2: 0x0b, 0x7f3: 0x0b, 0x7f4: 0x0b, 0x7f5: 0x0b, 0x7f6: 0x0b, 0x7f7: 0x0b, 0x7f8: 0x0b, 0x7f9: 0x0b, 0x7fa: 0x0b, 0x7fb: 0x0b, 0x7fc: 0x0b, 0x7fd: 0x0b, 0x7fe: 0x0b, 0x7ff: 0x0b, // Block 0x20, offset 0x800 0x800: 0x0b, 0x801: 0x0b, 0x802: 0x0b, 0x803: 0x0b, 0x804: 0x0b, 0x805: 0x0b, 0x806: 0x0b, 0x807: 0x0b, 0x808: 0x0b, 0x809: 0x0b, 0x80a: 0x0b, 0x80b: 0x0b, 0x80c: 0x0b, 0x80d: 0x0b, 0x80e: 0x0b, 0x80f: 0x0b, 0x810: 0x0b, 0x811: 0x0b, 0x812: 0x0b, 0x813: 0x0b, 0x814: 0x0b, 0x815: 0x0b, 0x816: 0x0b, 0x817: 0x0b, 0x818: 0x0b, 0x819: 0x0b, 0x81a: 0x0b, 0x81b: 0x0b, 0x81c: 0x0b, 0x81d: 0x0b, 0x81e: 0x0b, 0x81f: 0x0b, 0x820: 0x0b, 0x821: 0x0b, 0x822: 0x0b, 0x823: 0x0b, 0x824: 0x0b, 0x825: 0x0b, 0x826: 0x0b, 0x827: 0x0b, 0x828: 0x0b, 0x829: 0x0b, 0x82a: 0x0b, 0x82b: 0x0b, 0x82c: 0x0b, 0x82d: 0x0b, 0x82e: 0x0b, 0x82f: 0x0b, 0x830: 0x0b, 0x831: 0x0b, 0x832: 0x0b, 0x833: 0x0b, 0x834: 0x0b, 0x835: 0x0b, 0x836: 0x0b, 0x837: 0x0b, 0x838: 0x0b, 0x839: 0x0b, 0x83a: 0x0b, 0x83b: 0x0b, 0x83c: 0x0b, 0x83d: 0x0b, 0x83e: 0x0b, 0x83f: 0x0b, // Block 0x21, offset 0x840 0x840: 0x181, 0x841: 0x182, 0x842: 0xba, 0x843: 0xba, 0x844: 0x183, 0x845: 0x183, 0x846: 0x183, 0x847: 0x184, 0x848: 0xba, 0x849: 0xba, 0x84a: 0xba, 0x84b: 0xba, 0x84c: 0xba, 0x84d: 0xba, 0x84e: 0xba, 0x84f: 0xba, 0x850: 0xba, 0x851: 0xba, 0x852: 0xba, 0x853: 0xba, 0x854: 0xba, 0x855: 0xba, 0x856: 0xba, 0x857: 0xba, 0x858: 0xba, 0x859: 0xba, 0x85a: 0xba, 0x85b: 0xba, 0x85c: 0xba, 0x85d: 0xba, 0x85e: 0xba, 0x85f: 0xba, 0x860: 0xba, 0x861: 0xba, 0x862: 0xba, 0x863: 0xba, 0x864: 0xba, 0x865: 0xba, 0x866: 0xba, 0x867: 0xba, 0x868: 0xba, 0x869: 0xba, 0x86a: 0xba, 0x86b: 0xba, 0x86c: 0xba, 0x86d: 0xba, 0x86e: 0xba, 0x86f: 0xba, 0x870: 0xba, 0x871: 0xba, 0x872: 0xba, 0x873: 0xba, 0x874: 0xba, 0x875: 0xba, 0x876: 0xba, 0x877: 0xba, 0x878: 0xba, 0x879: 0xba, 0x87a: 0xba, 0x87b: 0xba, 0x87c: 0xba, 0x87d: 0xba, 0x87e: 0xba, 0x87f: 0xba, // Block 0x22, offset 0x880 0x880: 0x0b, 0x881: 0x0b, 0x882: 0x0b, 0x883: 0x0b, 0x884: 0x0b, 0x885: 0x0b, 0x886: 0x0b, 0x887: 0x0b, 0x888: 0x0b, 0x889: 0x0b, 0x88a: 0x0b, 0x88b: 0x0b, 0x88c: 0x0b, 0x88d: 0x0b, 0x88e: 0x0b, 0x88f: 0x0b, 0x890: 0x0b, 0x891: 0x0b, 0x892: 0x0b, 0x893: 0x0b, 0x894: 0x0b, 0x895: 0x0b, 0x896: 0x0b, 0x897: 0x0b, 0x898: 0x0b, 0x899: 0x0b, 0x89a: 0x0b, 0x89b: 0x0b, 0x89c: 0x0b, 0x89d: 0x0b, 0x89e: 0x0b, 0x89f: 0x0b, 0x8a0: 0x1f, 0x8a1: 0x0b, 0x8a2: 0x0b, 0x8a3: 0x0b, 0x8a4: 0x0b, 0x8a5: 0x0b, 0x8a6: 0x0b, 0x8a7: 0x0b, 0x8a8: 0x0b, 0x8a9: 0x0b, 0x8aa: 0x0b, 0x8ab: 0x0b, 0x8ac: 0x0b, 0x8ad: 0x0b, 0x8ae: 0x0b, 0x8af: 0x0b, 0x8b0: 0x0b, 0x8b1: 0x0b, 0x8b2: 0x0b, 0x8b3: 0x0b, 0x8b4: 0x0b, 0x8b5: 0x0b, 0x8b6: 0x0b, 0x8b7: 0x0b, 0x8b8: 0x0b, 0x8b9: 0x0b, 0x8ba: 0x0b, 0x8bb: 0x0b, 0x8bc: 0x0b, 0x8bd: 0x0b, 0x8be: 0x0b, 0x8bf: 0x0b, // Block 0x23, offset 0x8c0 0x8c0: 0x0b, 0x8c1: 0x0b, 0x8c2: 0x0b, 0x8c3: 0x0b, 0x8c4: 0x0b, 0x8c5: 0x0b, 0x8c6: 0x0b, 0x8c7: 0x0b, 0x8c8: 0x0b, 0x8c9: 0x0b, 0x8ca: 0x0b, 0x8cb: 0x0b, 0x8cc: 0x0b, 0x8cd: 0x0b, 0x8ce: 0x0b, 0x8cf: 0x0b, } // idnaSparseOffset: 264 entries, 528 bytes var idnaSparseOffset = []uint16{0x0, 0x8, 0x19, 0x25, 0x27, 0x2c, 0x34, 0x3f, 0x4b, 0x4f, 0x5e, 0x63, 0x6b, 0x77, 0x85, 0x8a, 0x93, 0xa3, 0xb1, 0xbd, 0xc9, 0xda, 0xe4, 0xeb, 0xf8, 0x109, 0x110, 0x11b, 0x12a, 0x138, 0x142, 0x144, 0x149, 0x14c, 0x14f, 0x151, 0x15d, 0x168, 0x170, 0x176, 0x17c, 0x181, 0x186, 0x189, 0x18d, 0x193, 0x198, 0x1a4, 0x1ae, 0x1b4, 0x1c5, 0x1cf, 0x1d2, 0x1da, 0x1dd, 0x1ea, 0x1f2, 0x1f6, 0x1fd, 0x205, 0x215, 0x221, 0x223, 0x22d, 0x239, 0x245, 0x251, 0x259, 0x25e, 0x268, 0x279, 0x27d, 0x288, 0x28c, 0x295, 0x29d, 0x2a3, 0x2a8, 0x2ab, 0x2af, 0x2b5, 0x2b9, 0x2bd, 0x2c3, 0x2ca, 0x2d0, 0x2d8, 0x2df, 0x2ea, 0x2f4, 0x2f8, 0x2fb, 0x301, 0x305, 0x307, 0x30a, 0x30c, 0x30f, 0x319, 0x31c, 0x32b, 0x32f, 0x334, 0x337, 0x33b, 0x340, 0x345, 0x34b, 0x351, 0x360, 0x366, 0x36a, 0x379, 0x37e, 0x386, 0x390, 0x39b, 0x3a3, 0x3b4, 0x3bd, 0x3cd, 0x3da, 0x3e4, 0x3e9, 0x3f6, 0x3fa, 0x3ff, 0x401, 0x405, 0x407, 0x40b, 0x414, 0x41a, 0x41e, 0x42e, 0x438, 0x43d, 0x440, 0x446, 0x44d, 0x452, 0x456, 0x45c, 0x461, 0x46a, 0x46f, 0x475, 0x47c, 0x483, 0x48a, 0x48e, 0x493, 0x496, 0x49b, 0x4a7, 0x4ad, 0x4b2, 0x4b9, 0x4c1, 0x4c6, 0x4ca, 0x4da, 0x4e1, 0x4e5, 0x4e9, 0x4f0, 0x4f2, 0x4f5, 0x4f8, 0x4fc, 0x500, 0x506, 0x50f, 0x51b, 0x522, 0x52b, 0x533, 0x53a, 0x548, 0x555, 0x562, 0x56b, 0x56f, 0x57d, 0x585, 0x590, 0x599, 0x59f, 0x5a7, 0x5b0, 0x5ba, 0x5bd, 0x5c9, 0x5cc, 0x5d1, 0x5de, 0x5e7, 0x5f3, 0x5f6, 0x600, 0x609, 0x615, 0x622, 0x62a, 0x62d, 0x632, 0x635, 0x638, 0x63b, 0x642, 0x649, 0x64d, 0x658, 0x65b, 0x661, 0x666, 0x66a, 0x66d, 0x670, 0x673, 0x676, 0x679, 0x67e, 0x688, 0x68b, 0x68f, 0x69e, 0x6aa, 0x6ae, 0x6b3, 0x6b8, 0x6bc, 0x6c1, 0x6ca, 0x6d5, 0x6db, 0x6e3, 0x6e7, 0x6eb, 0x6f1, 0x6f7, 0x6fc, 0x6ff, 0x70f, 0x716, 0x719, 0x71c, 0x720, 0x726, 0x72b, 0x730, 0x735, 0x738, 0x73d, 0x740, 0x743, 0x747, 0x74b, 0x74e, 0x75e, 0x76f, 0x774, 0x776, 0x778} // idnaSparseValues: 1915 entries, 7660 bytes var idnaSparseValues = [1915]valueRange{ // Block 0x0, offset 0x0 {value: 0x0000, lo: 0x07}, {value: 0xe105, lo: 0x80, hi: 0x96}, {value: 0x0018, lo: 0x97, hi: 0x97}, {value: 0xe105, lo: 0x98, hi: 0x9e}, {value: 0x001f, lo: 0x9f, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xb6}, {value: 0x0018, lo: 0xb7, hi: 0xb7}, {value: 0x0008, lo: 0xb8, hi: 0xbf}, // Block 0x1, offset 0x8 {value: 0x0000, lo: 0x10}, {value: 0x0008, lo: 0x80, hi: 0x80}, {value: 0xe01d, lo: 0x81, hi: 0x81}, {value: 0x0008, lo: 0x82, hi: 0x82}, {value: 0x0335, lo: 0x83, hi: 0x83}, {value: 0x034d, lo: 0x84, hi: 0x84}, {value: 0x0365, lo: 0x85, hi: 0x85}, {value: 0xe00d, lo: 0x86, hi: 0x86}, {value: 0x0008, lo: 0x87, hi: 0x87}, {value: 0xe00d, lo: 0x88, hi: 0x88}, {value: 0x0008, lo: 0x89, hi: 0x89}, {value: 0xe00d, lo: 0x8a, hi: 0x8a}, {value: 0x0008, lo: 0x8b, hi: 0x8b}, {value: 0xe00d, lo: 0x8c, hi: 0x8c}, {value: 0x0008, lo: 0x8d, hi: 0x8d}, {value: 0xe00d, lo: 0x8e, hi: 0x8e}, {value: 0x0008, lo: 0x8f, hi: 0xbf}, // Block 0x2, offset 0x19 {value: 0x0000, lo: 0x0b}, {value: 0x0008, lo: 0x80, hi: 0xaf}, {value: 0x0249, lo: 0xb0, hi: 0xb0}, {value: 0x037d, lo: 0xb1, hi: 0xb1}, {value: 0x0259, lo: 0xb2, hi: 0xb2}, {value: 0x0269, lo: 0xb3, hi: 0xb3}, {value: 0x034d, lo: 0xb4, hi: 0xb4}, {value: 0x0395, lo: 0xb5, hi: 0xb5}, {value: 0xe1bd, lo: 0xb6, hi: 0xb6}, {value: 0x0279, lo: 0xb7, hi: 0xb7}, {value: 0x0289, lo: 0xb8, hi: 0xb8}, {value: 0x0008, lo: 0xb9, hi: 0xbf}, // Block 0x3, offset 0x25 {value: 0x0000, lo: 0x01}, {value: 0x3308, lo: 0x80, hi: 0xbf}, // Block 0x4, offset 0x27 {value: 0x0000, lo: 0x04}, {value: 0x03f5, lo: 0x80, hi: 0x8f}, {value: 0xe105, lo: 0x90, hi: 0x9f}, {value: 0x049d, lo: 0xa0, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xbf}, // Block 0x5, offset 0x2c {value: 0x0000, lo: 0x07}, {value: 0xe185, lo: 0x80, hi: 0x8f}, {value: 0x0545, lo: 0x90, hi: 0x96}, {value: 0x0040, lo: 0x97, hi: 0x98}, {value: 0x0008, lo: 0x99, hi: 0x99}, {value: 0x0018, lo: 0x9a, hi: 0x9f}, {value: 0x0040, lo: 0xa0, hi: 0xa0}, {value: 0x0008, lo: 0xa1, hi: 0xbf}, // Block 0x6, offset 0x34 {value: 0x0000, lo: 0x0a}, {value: 0x0008, lo: 0x80, hi: 0x86}, {value: 0x0401, lo: 0x87, hi: 0x87}, {value: 0x0040, lo: 0x88, hi: 0x88}, {value: 0x0018, lo: 0x89, hi: 0x8a}, {value: 0x0040, lo: 0x8b, hi: 0x8c}, {value: 0x0018, lo: 0x8d, hi: 0x8f}, {value: 0x0040, lo: 0x90, hi: 0x90}, {value: 0x3308, lo: 0x91, hi: 0xbd}, {value: 0x0818, lo: 0xbe, hi: 0xbe}, {value: 0x3308, lo: 0xbf, hi: 0xbf}, // Block 0x7, offset 0x3f {value: 0x0000, lo: 0x0b}, {value: 0x0818, lo: 0x80, hi: 0x80}, {value: 0x3308, lo: 0x81, hi: 0x82}, {value: 0x0818, lo: 0x83, hi: 0x83}, {value: 0x3308, lo: 0x84, hi: 0x85}, {value: 0x0818, lo: 0x86, hi: 0x86}, {value: 0x3308, lo: 0x87, hi: 0x87}, {value: 0x0040, lo: 0x88, hi: 0x8f}, {value: 0x0808, lo: 0x90, hi: 0xaa}, {value: 0x0040, lo: 0xab, hi: 0xaf}, {value: 0x0808, lo: 0xb0, hi: 0xb4}, {value: 0x0040, lo: 0xb5, hi: 0xbf}, // Block 0x8, offset 0x4b {value: 0x0000, lo: 0x03}, {value: 0x0a08, lo: 0x80, hi: 0x87}, {value: 0x0c08, lo: 0x88, hi: 0x99}, {value: 0x0a08, lo: 0x9a, hi: 0xbf}, // Block 0x9, offset 0x4f {value: 0x0000, lo: 0x0e}, {value: 0x3308, lo: 0x80, hi: 0x8a}, {value: 0x0040, lo: 0x8b, hi: 0x8c}, {value: 0x0c08, lo: 0x8d, hi: 0x8d}, {value: 0x0a08, lo: 0x8e, hi: 0x98}, {value: 0x0c08, lo: 0x99, hi: 0x9b}, {value: 0x0a08, lo: 0x9c, hi: 0xaa}, {value: 0x0c08, lo: 0xab, hi: 0xac}, {value: 0x0a08, lo: 0xad, hi: 0xb0}, {value: 0x0c08, lo: 0xb1, hi: 0xb1}, {value: 0x0a08, lo: 0xb2, hi: 0xb2}, {value: 0x0c08, lo: 0xb3, hi: 0xb4}, {value: 0x0a08, lo: 0xb5, hi: 0xb7}, {value: 0x0c08, lo: 0xb8, hi: 0xb9}, {value: 0x0a08, lo: 0xba, hi: 0xbf}, // Block 0xa, offset 0x5e {value: 0x0000, lo: 0x04}, {value: 0x0808, lo: 0x80, hi: 0xa5}, {value: 0x3308, lo: 0xa6, hi: 0xb0}, {value: 0x0808, lo: 0xb1, hi: 0xb1}, {value: 0x0040, lo: 0xb2, hi: 0xbf}, // Block 0xb, offset 0x63 {value: 0x0000, lo: 0x07}, {value: 0x0808, lo: 0x80, hi: 0x89}, {value: 0x0a08, lo: 0x8a, hi: 0xaa}, {value: 0x3308, lo: 0xab, hi: 0xb3}, {value: 0x0808, lo: 0xb4, hi: 0xb5}, {value: 0x0018, lo: 0xb6, hi: 0xb9}, {value: 0x0818, lo: 0xba, hi: 0xba}, {value: 0x0040, lo: 0xbb, hi: 0xbf}, // Block 0xc, offset 0x6b {value: 0x0000, lo: 0x0b}, {value: 0x0808, lo: 0x80, hi: 0x95}, {value: 0x3308, lo: 0x96, hi: 0x99}, {value: 0x0808, lo: 0x9a, hi: 0x9a}, {value: 0x3308, lo: 0x9b, hi: 0xa3}, {value: 0x0808, lo: 0xa4, hi: 0xa4}, {value: 0x3308, lo: 0xa5, hi: 0xa7}, {value: 0x0808, lo: 0xa8, hi: 0xa8}, {value: 0x3308, lo: 0xa9, hi: 0xad}, {value: 0x0040, lo: 0xae, hi: 0xaf}, {value: 0x0818, lo: 0xb0, hi: 0xbe}, {value: 0x0040, lo: 0xbf, hi: 0xbf}, // Block 0xd, offset 0x77 {value: 0x0000, lo: 0x0d}, {value: 0x0040, lo: 0x80, hi: 0x9f}, {value: 0x0a08, lo: 0xa0, hi: 0xa9}, {value: 0x0c08, lo: 0xaa, hi: 0xac}, {value: 0x0808, lo: 0xad, hi: 0xad}, {value: 0x0c08, lo: 0xae, hi: 0xae}, {value: 0x0a08, lo: 0xaf, hi: 0xb0}, {value: 0x0c08, lo: 0xb1, hi: 0xb2}, {value: 0x0a08, lo: 0xb3, hi: 0xb4}, {value: 0x0040, lo: 0xb5, hi: 0xb5}, {value: 0x0a08, lo: 0xb6, hi: 0xb8}, {value: 0x0c08, lo: 0xb9, hi: 0xb9}, {value: 0x0a08, lo: 0xba, hi: 0xbd}, {value: 0x0040, lo: 0xbe, hi: 0xbf}, // Block 0xe, offset 0x85 {value: 0x0000, lo: 0x04}, {value: 0x0040, lo: 0x80, hi: 0x93}, {value: 0x3308, lo: 0x94, hi: 0xa1}, {value: 0x0840, lo: 0xa2, hi: 0xa2}, {value: 0x3308, lo: 0xa3, hi: 0xbf}, // Block 0xf, offset 0x8a {value: 0x0000, lo: 0x08}, {value: 0x3308, lo: 0x80, hi: 0x82}, {value: 0x3008, lo: 0x83, hi: 0x83}, {value: 0x0008, lo: 0x84, hi: 0xb9}, {value: 0x3308, lo: 0xba, hi: 0xba}, {value: 0x3008, lo: 0xbb, hi: 0xbb}, {value: 0x3308, lo: 0xbc, hi: 0xbc}, {value: 0x0008, lo: 0xbd, hi: 0xbd}, {value: 0x3008, lo: 0xbe, hi: 0xbf}, // Block 0x10, offset 0x93 {value: 0x0000, lo: 0x0f}, {value: 0x3308, lo: 0x80, hi: 0x80}, {value: 0x3008, lo: 0x81, hi: 0x82}, {value: 0x0040, lo: 0x83, hi: 0x85}, {value: 0x3008, lo: 0x86, hi: 0x88}, {value: 0x0040, lo: 0x89, hi: 0x89}, {value: 0x3008, lo: 0x8a, hi: 0x8c}, {value: 0x3b08, lo: 0x8d, hi: 0x8d}, {value: 0x0040, lo: 0x8e, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x90}, {value: 0x0040, lo: 0x91, hi: 0x96}, {value: 0x3008, lo: 0x97, hi: 0x97}, {value: 0x0040, lo: 0x98, hi: 0xa5}, {value: 0x0008, lo: 0xa6, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xba}, {value: 0x0040, lo: 0xbb, hi: 0xbf}, // Block 0x11, offset 0xa3 {value: 0x0000, lo: 0x0d}, {value: 0x3308, lo: 0x80, hi: 0x80}, {value: 0x3008, lo: 0x81, hi: 0x83}, {value: 0x0040, lo: 0x84, hi: 0x84}, {value: 0x0008, lo: 0x85, hi: 0x8c}, {value: 0x0040, lo: 0x8d, hi: 0x8d}, {value: 0x0008, lo: 0x8e, hi: 0x90}, {value: 0x0040, lo: 0x91, hi: 0x91}, {value: 0x0008, lo: 0x92, hi: 0xa8}, {value: 0x0040, lo: 0xa9, hi: 0xa9}, {value: 0x0008, lo: 0xaa, hi: 0xb9}, {value: 0x0040, lo: 0xba, hi: 0xbc}, {value: 0x0008, lo: 0xbd, hi: 0xbd}, {value: 0x3308, lo: 0xbe, hi: 0xbf}, // Block 0x12, offset 0xb1 {value: 0x0000, lo: 0x0b}, {value: 0x3308, lo: 0x80, hi: 0x81}, {value: 0x3008, lo: 0x82, hi: 0x83}, {value: 0x0040, lo: 0x84, hi: 0x84}, {value: 0x0008, lo: 0x85, hi: 0x8c}, {value: 0x0040, lo: 0x8d, hi: 0x8d}, {value: 0x0008, lo: 0x8e, hi: 0x90}, {value: 0x0040, lo: 0x91, hi: 0x91}, {value: 0x0008, lo: 0x92, hi: 0xba}, {value: 0x3b08, lo: 0xbb, hi: 0xbc}, {value: 0x0008, lo: 0xbd, hi: 0xbd}, {value: 0x3008, lo: 0xbe, hi: 0xbf}, // Block 0x13, offset 0xbd {value: 0x0000, lo: 0x0b}, {value: 0x0040, lo: 0x80, hi: 0x81}, {value: 0x3008, lo: 0x82, hi: 0x83}, {value: 0x0040, lo: 0x84, hi: 0x84}, {value: 0x0008, lo: 0x85, hi: 0x96}, {value: 0x0040, lo: 0x97, hi: 0x99}, {value: 0x0008, lo: 0x9a, hi: 0xb1}, {value: 0x0040, lo: 0xb2, hi: 0xb2}, {value: 0x0008, lo: 0xb3, hi: 0xbb}, {value: 0x0040, lo: 0xbc, hi: 0xbc}, {value: 0x0008, lo: 0xbd, hi: 0xbd}, {value: 0x0040, lo: 0xbe, hi: 0xbf}, // Block 0x14, offset 0xc9 {value: 0x0000, lo: 0x10}, {value: 0x0008, lo: 0x80, hi: 0x86}, {value: 0x0040, lo: 0x87, hi: 0x89}, {value: 0x3b08, lo: 0x8a, hi: 0x8a}, {value: 0x0040, lo: 0x8b, hi: 0x8e}, {value: 0x3008, lo: 0x8f, hi: 0x91}, {value: 0x3308, lo: 0x92, hi: 0x94}, {value: 0x0040, lo: 0x95, hi: 0x95}, {value: 0x3308, lo: 0x96, hi: 0x96}, {value: 0x0040, lo: 0x97, hi: 0x97}, {value: 0x3008, lo: 0x98, hi: 0x9f}, {value: 0x0040, lo: 0xa0, hi: 0xa5}, {value: 0x0008, lo: 0xa6, hi: 0xaf}, {value: 0x0040, lo: 0xb0, hi: 0xb1}, {value: 0x3008, lo: 0xb2, hi: 0xb3}, {value: 0x0018, lo: 0xb4, hi: 0xb4}, {value: 0x0040, lo: 0xb5, hi: 0xbf}, // Block 0x15, offset 0xda {value: 0x0000, lo: 0x09}, {value: 0x0040, lo: 0x80, hi: 0x80}, {value: 0x0008, lo: 0x81, hi: 0xb0}, {value: 0x3308, lo: 0xb1, hi: 0xb1}, {value: 0x0008, lo: 0xb2, hi: 0xb2}, {value: 0x08f1, lo: 0xb3, hi: 0xb3}, {value: 0x3308, lo: 0xb4, hi: 0xb9}, {value: 0x3b08, lo: 0xba, hi: 0xba}, {value: 0x0040, lo: 0xbb, hi: 0xbe}, {value: 0x0018, lo: 0xbf, hi: 0xbf}, // Block 0x16, offset 0xe4 {value: 0x0000, lo: 0x06}, {value: 0x0008, lo: 0x80, hi: 0x86}, {value: 0x3308, lo: 0x87, hi: 0x8e}, {value: 0x0018, lo: 0x8f, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x99}, {value: 0x0018, lo: 0x9a, hi: 0x9b}, {value: 0x0040, lo: 0x9c, hi: 0xbf}, // Block 0x17, offset 0xeb {value: 0x0000, lo: 0x0c}, {value: 0x0008, lo: 0x80, hi: 0x84}, {value: 0x0040, lo: 0x85, hi: 0x85}, {value: 0x0008, lo: 0x86, hi: 0x86}, {value: 0x0040, lo: 0x87, hi: 0x87}, {value: 0x3308, lo: 0x88, hi: 0x8d}, {value: 0x0040, lo: 0x8e, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x99}, {value: 0x0040, lo: 0x9a, hi: 0x9b}, {value: 0x0961, lo: 0x9c, hi: 0x9c}, {value: 0x0999, lo: 0x9d, hi: 0x9d}, {value: 0x0008, lo: 0x9e, hi: 0x9f}, {value: 0x0040, lo: 0xa0, hi: 0xbf}, // Block 0x18, offset 0xf8 {value: 0x0000, lo: 0x10}, {value: 0x0008, lo: 0x80, hi: 0x80}, {value: 0x0018, lo: 0x81, hi: 0x8a}, {value: 0x0008, lo: 0x8b, hi: 0x8b}, {value: 0xe03d, lo: 0x8c, hi: 0x8c}, {value: 0x0018, lo: 0x8d, hi: 0x97}, {value: 0x3308, lo: 0x98, hi: 0x99}, {value: 0x0018, lo: 0x9a, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xa9}, {value: 0x0018, lo: 0xaa, hi: 0xb4}, {value: 0x3308, lo: 0xb5, hi: 0xb5}, {value: 0x0018, lo: 0xb6, hi: 0xb6}, {value: 0x3308, lo: 0xb7, hi: 0xb7}, {value: 0x0018, lo: 0xb8, hi: 0xb8}, {value: 0x3308, lo: 0xb9, hi: 0xb9}, {value: 0x0018, lo: 0xba, hi: 0xbd}, {value: 0x3008, lo: 0xbe, hi: 0xbf}, // Block 0x19, offset 0x109 {value: 0x0000, lo: 0x06}, {value: 0x0018, lo: 0x80, hi: 0x85}, {value: 0x3308, lo: 0x86, hi: 0x86}, {value: 0x0018, lo: 0x87, hi: 0x8c}, {value: 0x0040, lo: 0x8d, hi: 0x8d}, {value: 0x0018, lo: 0x8e, hi: 0x9a}, {value: 0x0040, lo: 0x9b, hi: 0xbf}, // Block 0x1a, offset 0x110 {value: 0x0000, lo: 0x0a}, {value: 0x0008, lo: 0x80, hi: 0xaa}, {value: 0x3008, lo: 0xab, hi: 0xac}, {value: 0x3308, lo: 0xad, hi: 0xb0}, {value: 0x3008, lo: 0xb1, hi: 0xb1}, {value: 0x3308, lo: 0xb2, hi: 0xb7}, {value: 0x3008, lo: 0xb8, hi: 0xb8}, {value: 0x3b08, lo: 0xb9, hi: 0xba}, {value: 0x3008, lo: 0xbb, hi: 0xbc}, {value: 0x3308, lo: 0xbd, hi: 0xbe}, {value: 0x0008, lo: 0xbf, hi: 0xbf}, // Block 0x1b, offset 0x11b {value: 0x0000, lo: 0x0e}, {value: 0x0008, lo: 0x80, hi: 0x89}, {value: 0x0018, lo: 0x8a, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x95}, {value: 0x3008, lo: 0x96, hi: 0x97}, {value: 0x3308, lo: 0x98, hi: 0x99}, {value: 0x0008, lo: 0x9a, hi: 0x9d}, {value: 0x3308, lo: 0x9e, hi: 0xa0}, {value: 0x0008, lo: 0xa1, hi: 0xa1}, {value: 0x3008, lo: 0xa2, hi: 0xa4}, {value: 0x0008, lo: 0xa5, hi: 0xa6}, {value: 0x3008, lo: 0xa7, hi: 0xad}, {value: 0x0008, lo: 0xae, hi: 0xb0}, {value: 0x3308, lo: 0xb1, hi: 0xb4}, {value: 0x0008, lo: 0xb5, hi: 0xbf}, // Block 0x1c, offset 0x12a {value: 0x0000, lo: 0x0d}, {value: 0x0008, lo: 0x80, hi: 0x81}, {value: 0x3308, lo: 0x82, hi: 0x82}, {value: 0x3008, lo: 0x83, hi: 0x84}, {value: 0x3308, lo: 0x85, hi: 0x86}, {value: 0x3008, lo: 0x87, hi: 0x8c}, {value: 0x3308, lo: 0x8d, hi: 0x8d}, {value: 0x0008, lo: 0x8e, hi: 0x8e}, {value: 0x3008, lo: 0x8f, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x99}, {value: 0x3008, lo: 0x9a, hi: 0x9c}, {value: 0x3308, lo: 0x9d, hi: 0x9d}, {value: 0x0018, lo: 0x9e, hi: 0x9f}, {value: 0x0040, lo: 0xa0, hi: 0xbf}, // Block 0x1d, offset 0x138 {value: 0x0000, lo: 0x09}, {value: 0x0040, lo: 0x80, hi: 0x86}, {value: 0x055d, lo: 0x87, hi: 0x87}, {value: 0x0040, lo: 0x88, hi: 0x8c}, {value: 0x055d, lo: 0x8d, hi: 0x8d}, {value: 0x0040, lo: 0x8e, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0xba}, {value: 0x0018, lo: 0xbb, hi: 0xbb}, {value: 0xe105, lo: 0xbc, hi: 0xbc}, {value: 0x0008, lo: 0xbd, hi: 0xbf}, // Block 0x1e, offset 0x142 {value: 0x0000, lo: 0x01}, {value: 0x0018, lo: 0x80, hi: 0xbf}, // Block 0x1f, offset 0x144 {value: 0x0000, lo: 0x04}, {value: 0x0018, lo: 0x80, hi: 0x9e}, {value: 0x0040, lo: 0x9f, hi: 0xa0}, {value: 0x2018, lo: 0xa1, hi: 0xb5}, {value: 0x0018, lo: 0xb6, hi: 0xbf}, // Block 0x20, offset 0x149 {value: 0x0000, lo: 0x02}, {value: 0x0018, lo: 0x80, hi: 0xa7}, {value: 0x2018, lo: 0xa8, hi: 0xbf}, // Block 0x21, offset 0x14c {value: 0x0000, lo: 0x02}, {value: 0x2018, lo: 0x80, hi: 0x82}, {value: 0x0018, lo: 0x83, hi: 0xbf}, // Block 0x22, offset 0x14f {value: 0x0000, lo: 0x01}, {value: 0x0008, lo: 0x80, hi: 0xbf}, // Block 0x23, offset 0x151 {value: 0x0000, lo: 0x0b}, {value: 0x0008, lo: 0x80, hi: 0x88}, {value: 0x0040, lo: 0x89, hi: 0x89}, {value: 0x0008, lo: 0x8a, hi: 0x8d}, {value: 0x0040, lo: 0x8e, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x96}, {value: 0x0040, lo: 0x97, hi: 0x97}, {value: 0x0008, lo: 0x98, hi: 0x98}, {value: 0x0040, lo: 0x99, hi: 0x99}, {value: 0x0008, lo: 0x9a, hi: 0x9d}, {value: 0x0040, lo: 0x9e, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xbf}, // Block 0x24, offset 0x15d {value: 0x0000, lo: 0x0a}, {value: 0x0008, lo: 0x80, hi: 0x88}, {value: 0x0040, lo: 0x89, hi: 0x89}, {value: 0x0008, lo: 0x8a, hi: 0x8d}, {value: 0x0040, lo: 0x8e, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0xb0}, {value: 0x0040, lo: 0xb1, hi: 0xb1}, {value: 0x0008, lo: 0xb2, hi: 0xb5}, {value: 0x0040, lo: 0xb6, hi: 0xb7}, {value: 0x0008, lo: 0xb8, hi: 0xbe}, {value: 0x0040, lo: 0xbf, hi: 0xbf}, // Block 0x25, offset 0x168 {value: 0x0000, lo: 0x07}, {value: 0x0008, lo: 0x80, hi: 0x80}, {value: 0x0040, lo: 0x81, hi: 0x81}, {value: 0x0008, lo: 0x82, hi: 0x85}, {value: 0x0040, lo: 0x86, hi: 0x87}, {value: 0x0008, lo: 0x88, hi: 0x96}, {value: 0x0040, lo: 0x97, hi: 0x97}, {value: 0x0008, lo: 0x98, hi: 0xbf}, // Block 0x26, offset 0x170 {value: 0x0000, lo: 0x05}, {value: 0x0008, lo: 0x80, hi: 0x90}, {value: 0x0040, lo: 0x91, hi: 0x91}, {value: 0x0008, lo: 0x92, hi: 0x95}, {value: 0x0040, lo: 0x96, hi: 0x97}, {value: 0x0008, lo: 0x98, hi: 0xbf}, // Block 0x27, offset 0x176 {value: 0x0000, lo: 0x05}, {value: 0x0008, lo: 0x80, hi: 0x9a}, {value: 0x0040, lo: 0x9b, hi: 0x9c}, {value: 0x3308, lo: 0x9d, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xbc}, {value: 0x0040, lo: 0xbd, hi: 0xbf}, // Block 0x28, offset 0x17c {value: 0x0000, lo: 0x04}, {value: 0x0008, lo: 0x80, hi: 0x8f}, {value: 0x0018, lo: 0x90, hi: 0x99}, {value: 0x0040, lo: 0x9a, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xbf}, // Block 0x29, offset 0x181 {value: 0x0000, lo: 0x04}, {value: 0x0008, lo: 0x80, hi: 0xb5}, {value: 0x0040, lo: 0xb6, hi: 0xb7}, {value: 0xe045, lo: 0xb8, hi: 0xbd}, {value: 0x0040, lo: 0xbe, hi: 0xbf}, // Block 0x2a, offset 0x186 {value: 0x0000, lo: 0x02}, {value: 0x0018, lo: 0x80, hi: 0x80}, {value: 0x0008, lo: 0x81, hi: 0xbf}, // Block 0x2b, offset 0x189 {value: 0x0000, lo: 0x03}, {value: 0x0008, lo: 0x80, hi: 0xac}, {value: 0x0018, lo: 0xad, hi: 0xae}, {value: 0x0008, lo: 0xaf, hi: 0xbf}, // Block 0x2c, offset 0x18d {value: 0x0000, lo: 0x05}, {value: 0x0040, lo: 0x80, hi: 0x80}, {value: 0x0008, lo: 0x81, hi: 0x9a}, {value: 0x0018, lo: 0x9b, hi: 0x9c}, {value: 0x0040, lo: 0x9d, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xbf}, // Block 0x2d, offset 0x193 {value: 0x0000, lo: 0x04}, {value: 0x0008, lo: 0x80, hi: 0xaa}, {value: 0x0018, lo: 0xab, hi: 0xb0}, {value: 0x0008, lo: 0xb1, hi: 0xb8}, {value: 0x0040, lo: 0xb9, hi: 0xbf}, // Block 0x2e, offset 0x198 {value: 0x0000, lo: 0x0b}, {value: 0x0008, lo: 0x80, hi: 0x8c}, {value: 0x0040, lo: 0x8d, hi: 0x8d}, {value: 0x0008, lo: 0x8e, hi: 0x91}, {value: 0x3308, lo: 0x92, hi: 0x93}, {value: 0x3b08, lo: 0x94, hi: 0x94}, {value: 0x0040, lo: 0x95, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xb1}, {value: 0x3308, lo: 0xb2, hi: 0xb3}, {value: 0x3b08, lo: 0xb4, hi: 0xb4}, {value: 0x0018, lo: 0xb5, hi: 0xb6}, {value: 0x0040, lo: 0xb7, hi: 0xbf}, // Block 0x2f, offset 0x1a4 {value: 0x0000, lo: 0x09}, {value: 0x0008, lo: 0x80, hi: 0x91}, {value: 0x3308, lo: 0x92, hi: 0x93}, {value: 0x0040, lo: 0x94, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xac}, {value: 0x0040, lo: 0xad, hi: 0xad}, {value: 0x0008, lo: 0xae, hi: 0xb0}, {value: 0x0040, lo: 0xb1, hi: 0xb1}, {value: 0x3308, lo: 0xb2, hi: 0xb3}, {value: 0x0040, lo: 0xb4, hi: 0xbf}, // Block 0x30, offset 0x1ae {value: 0x0000, lo: 0x05}, {value: 0x0008, lo: 0x80, hi: 0xb3}, {value: 0x3340, lo: 0xb4, hi: 0xb5}, {value: 0x3008, lo: 0xb6, hi: 0xb6}, {value: 0x3308, lo: 0xb7, hi: 0xbd}, {value: 0x3008, lo: 0xbe, hi: 0xbf}, // Block 0x31, offset 0x1b4 {value: 0x0000, lo: 0x10}, {value: 0x3008, lo: 0x80, hi: 0x85}, {value: 0x3308, lo: 0x86, hi: 0x86}, {value: 0x3008, lo: 0x87, hi: 0x88}, {value: 0x3308, lo: 0x89, hi: 0x91}, {value: 0x3b08, lo: 0x92, hi: 0x92}, {value: 0x3308, lo: 0x93, hi: 0x93}, {value: 0x0018, lo: 0x94, hi: 0x96}, {value: 0x0008, lo: 0x97, hi: 0x97}, {value: 0x0018, lo: 0x98, hi: 0x9b}, {value: 0x0008, lo: 0x9c, hi: 0x9c}, {value: 0x3308, lo: 0x9d, hi: 0x9d}, {value: 0x0040, lo: 0x9e, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xa9}, {value: 0x0040, lo: 0xaa, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xb9}, {value: 0x0040, lo: 0xba, hi: 0xbf}, // Block 0x32, offset 0x1c5 {value: 0x0000, lo: 0x09}, {value: 0x0018, lo: 0x80, hi: 0x85}, {value: 0x0040, lo: 0x86, hi: 0x86}, {value: 0x0218, lo: 0x87, hi: 0x87}, {value: 0x0018, lo: 0x88, hi: 0x8a}, {value: 0x33c0, lo: 0x8b, hi: 0x8d}, {value: 0x0040, lo: 0x8e, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x99}, {value: 0x0040, lo: 0x9a, hi: 0x9f}, {value: 0x0208, lo: 0xa0, hi: 0xbf}, // Block 0x33, offset 0x1cf {value: 0x0000, lo: 0x02}, {value: 0x0208, lo: 0x80, hi: 0xb7}, {value: 0x0040, lo: 0xb8, hi: 0xbf}, // Block 0x34, offset 0x1d2 {value: 0x0000, lo: 0x07}, {value: 0x0008, lo: 0x80, hi: 0x84}, {value: 0x3308, lo: 0x85, hi: 0x86}, {value: 0x0208, lo: 0x87, hi: 0xa8}, {value: 0x3308, lo: 0xa9, hi: 0xa9}, {value: 0x0208, lo: 0xaa, hi: 0xaa}, {value: 0x0040, lo: 0xab, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xbf}, // Block 0x35, offset 0x1da {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xb5}, {value: 0x0040, lo: 0xb6, hi: 0xbf}, // Block 0x36, offset 0x1dd {value: 0x0000, lo: 0x0c}, {value: 0x0008, lo: 0x80, hi: 0x9e}, {value: 0x0040, lo: 0x9f, hi: 0x9f}, {value: 0x3308, lo: 0xa0, hi: 0xa2}, {value: 0x3008, lo: 0xa3, hi: 0xa6}, {value: 0x3308, lo: 0xa7, hi: 0xa8}, {value: 0x3008, lo: 0xa9, hi: 0xab}, {value: 0x0040, lo: 0xac, hi: 0xaf}, {value: 0x3008, lo: 0xb0, hi: 0xb1}, {value: 0x3308, lo: 0xb2, hi: 0xb2}, {value: 0x3008, lo: 0xb3, hi: 0xb8}, {value: 0x3308, lo: 0xb9, hi: 0xbb}, {value: 0x0040, lo: 0xbc, hi: 0xbf}, // Block 0x37, offset 0x1ea {value: 0x0000, lo: 0x07}, {value: 0x0018, lo: 0x80, hi: 0x80}, {value: 0x0040, lo: 0x81, hi: 0x83}, {value: 0x0018, lo: 0x84, hi: 0x85}, {value: 0x0008, lo: 0x86, hi: 0xad}, {value: 0x0040, lo: 0xae, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xb4}, {value: 0x0040, lo: 0xb5, hi: 0xbf}, // Block 0x38, offset 0x1f2 {value: 0x0000, lo: 0x03}, {value: 0x0008, lo: 0x80, hi: 0xab}, {value: 0x0040, lo: 0xac, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xbf}, // Block 0x39, offset 0x1f6 {value: 0x0000, lo: 0x06}, {value: 0x0008, lo: 0x80, hi: 0x89}, {value: 0x0040, lo: 0x8a, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x99}, {value: 0x0028, lo: 0x9a, hi: 0x9a}, {value: 0x0040, lo: 0x9b, hi: 0x9d}, {value: 0x0018, lo: 0x9e, hi: 0xbf}, // Block 0x3a, offset 0x1fd {value: 0x0000, lo: 0x07}, {value: 0x0008, lo: 0x80, hi: 0x96}, {value: 0x3308, lo: 0x97, hi: 0x98}, {value: 0x3008, lo: 0x99, hi: 0x9a}, {value: 0x3308, lo: 0x9b, hi: 0x9b}, {value: 0x0040, lo: 0x9c, hi: 0x9d}, {value: 0x0018, lo: 0x9e, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xbf}, // Block 0x3b, offset 0x205 {value: 0x0000, lo: 0x0f}, {value: 0x0008, lo: 0x80, hi: 0x94}, {value: 0x3008, lo: 0x95, hi: 0x95}, {value: 0x3308, lo: 0x96, hi: 0x96}, {value: 0x3008, lo: 0x97, hi: 0x97}, {value: 0x3308, lo: 0x98, hi: 0x9e}, {value: 0x0040, lo: 0x9f, hi: 0x9f}, {value: 0x3b08, lo: 0xa0, hi: 0xa0}, {value: 0x3008, lo: 0xa1, hi: 0xa1}, {value: 0x3308, lo: 0xa2, hi: 0xa2}, {value: 0x3008, lo: 0xa3, hi: 0xa4}, {value: 0x3308, lo: 0xa5, hi: 0xac}, {value: 0x3008, lo: 0xad, hi: 0xb2}, {value: 0x3308, lo: 0xb3, hi: 0xbc}, {value: 0x0040, lo: 0xbd, hi: 0xbe}, {value: 0x3308, lo: 0xbf, hi: 0xbf}, // Block 0x3c, offset 0x215 {value: 0x0000, lo: 0x0b}, {value: 0x0008, lo: 0x80, hi: 0x89}, {value: 0x0040, lo: 0x8a, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x99}, {value: 0x0040, lo: 0x9a, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xa6}, {value: 0x0008, lo: 0xa7, hi: 0xa7}, {value: 0x0018, lo: 0xa8, hi: 0xad}, {value: 0x0040, lo: 0xae, hi: 0xaf}, {value: 0x3308, lo: 0xb0, hi: 0xbd}, {value: 0x3318, lo: 0xbe, hi: 0xbe}, {value: 0x0040, lo: 0xbf, hi: 0xbf}, // Block 0x3d, offset 0x221 {value: 0x0000, lo: 0x01}, {value: 0x0040, lo: 0x80, hi: 0xbf}, // Block 0x3e, offset 0x223 {value: 0x0000, lo: 0x09}, {value: 0x3308, lo: 0x80, hi: 0x83}, {value: 0x3008, lo: 0x84, hi: 0x84}, {value: 0x0008, lo: 0x85, hi: 0xb3}, {value: 0x3308, lo: 0xb4, hi: 0xb4}, {value: 0x3008, lo: 0xb5, hi: 0xb5}, {value: 0x3308, lo: 0xb6, hi: 0xba}, {value: 0x3008, lo: 0xbb, hi: 0xbb}, {value: 0x3308, lo: 0xbc, hi: 0xbc}, {value: 0x3008, lo: 0xbd, hi: 0xbf}, // Block 0x3f, offset 0x22d {value: 0x0000, lo: 0x0b}, {value: 0x3008, lo: 0x80, hi: 0x81}, {value: 0x3308, lo: 0x82, hi: 0x82}, {value: 0x3008, lo: 0x83, hi: 0x83}, {value: 0x3808, lo: 0x84, hi: 0x84}, {value: 0x0008, lo: 0x85, hi: 0x8b}, {value: 0x0040, lo: 0x8c, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x99}, {value: 0x0018, lo: 0x9a, hi: 0xaa}, {value: 0x3308, lo: 0xab, hi: 0xb3}, {value: 0x0018, lo: 0xb4, hi: 0xbc}, {value: 0x0040, lo: 0xbd, hi: 0xbf}, // Block 0x40, offset 0x239 {value: 0x0000, lo: 0x0b}, {value: 0x3308, lo: 0x80, hi: 0x81}, {value: 0x3008, lo: 0x82, hi: 0x82}, {value: 0x0008, lo: 0x83, hi: 0xa0}, {value: 0x3008, lo: 0xa1, hi: 0xa1}, {value: 0x3308, lo: 0xa2, hi: 0xa5}, {value: 0x3008, lo: 0xa6, hi: 0xa7}, {value: 0x3308, lo: 0xa8, hi: 0xa9}, {value: 0x3808, lo: 0xaa, hi: 0xaa}, {value: 0x3b08, lo: 0xab, hi: 0xab}, {value: 0x3308, lo: 0xac, hi: 0xad}, {value: 0x0008, lo: 0xae, hi: 0xbf}, // Block 0x41, offset 0x245 {value: 0x0000, lo: 0x0b}, {value: 0x0008, lo: 0x80, hi: 0xa5}, {value: 0x3308, lo: 0xa6, hi: 0xa6}, {value: 0x3008, lo: 0xa7, hi: 0xa7}, {value: 0x3308, lo: 0xa8, hi: 0xa9}, {value: 0x3008, lo: 0xaa, hi: 0xac}, {value: 0x3308, lo: 0xad, hi: 0xad}, {value: 0x3008, lo: 0xae, hi: 0xae}, {value: 0x3308, lo: 0xaf, hi: 0xb1}, {value: 0x3808, lo: 0xb2, hi: 0xb3}, {value: 0x0040, lo: 0xb4, hi: 0xbb}, {value: 0x0018, lo: 0xbc, hi: 0xbf}, // Block 0x42, offset 0x251 {value: 0x0000, lo: 0x07}, {value: 0x0008, lo: 0x80, hi: 0xa3}, {value: 0x3008, lo: 0xa4, hi: 0xab}, {value: 0x3308, lo: 0xac, hi: 0xb3}, {value: 0x3008, lo: 0xb4, hi: 0xb5}, {value: 0x3308, lo: 0xb6, hi: 0xb7}, {value: 0x0040, lo: 0xb8, hi: 0xba}, {value: 0x0018, lo: 0xbb, hi: 0xbf}, // Block 0x43, offset 0x259 {value: 0x0000, lo: 0x04}, {value: 0x0008, lo: 0x80, hi: 0x89}, {value: 0x0040, lo: 0x8a, hi: 0x8c}, {value: 0x0008, lo: 0x8d, hi: 0xbd}, {value: 0x0018, lo: 0xbe, hi: 0xbf}, // Block 0x44, offset 0x25e {value: 0x0000, lo: 0x09}, {value: 0x0e29, lo: 0x80, hi: 0x80}, {value: 0x0e41, lo: 0x81, hi: 0x81}, {value: 0x0e59, lo: 0x82, hi: 0x82}, {value: 0x0e71, lo: 0x83, hi: 0x83}, {value: 0x0e89, lo: 0x84, hi: 0x85}, {value: 0x0ea1, lo: 0x86, hi: 0x86}, {value: 0x0eb9, lo: 0x87, hi: 0x87}, {value: 0x057d, lo: 0x88, hi: 0x88}, {value: 0x0040, lo: 0x89, hi: 0xbf}, // Block 0x45, offset 0x268 {value: 0x0000, lo: 0x10}, {value: 0x0018, lo: 0x80, hi: 0x87}, {value: 0x0040, lo: 0x88, hi: 0x8f}, {value: 0x3308, lo: 0x90, hi: 0x92}, {value: 0x0018, lo: 0x93, hi: 0x93}, {value: 0x3308, lo: 0x94, hi: 0xa0}, {value: 0x3008, lo: 0xa1, hi: 0xa1}, {value: 0x3308, lo: 0xa2, hi: 0xa8}, {value: 0x0008, lo: 0xa9, hi: 0xac}, {value: 0x3308, lo: 0xad, hi: 0xad}, {value: 0x0008, lo: 0xae, hi: 0xb1}, {value: 0x3008, lo: 0xb2, hi: 0xb3}, {value: 0x3308, lo: 0xb4, hi: 0xb4}, {value: 0x0008, lo: 0xb5, hi: 0xb6}, {value: 0x3008, lo: 0xb7, hi: 0xb7}, {value: 0x3308, lo: 0xb8, hi: 0xb9}, {value: 0x0040, lo: 0xba, hi: 0xbf}, // Block 0x46, offset 0x279 {value: 0x0000, lo: 0x03}, {value: 0x3308, lo: 0x80, hi: 0xb9}, {value: 0x0040, lo: 0xba, hi: 0xba}, {value: 0x3308, lo: 0xbb, hi: 0xbf}, // Block 0x47, offset 0x27d {value: 0x0000, lo: 0x0a}, {value: 0x0008, lo: 0x80, hi: 0x87}, {value: 0xe045, lo: 0x88, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x95}, {value: 0x0040, lo: 0x96, hi: 0x97}, {value: 0xe045, lo: 0x98, hi: 0x9d}, {value: 0x0040, lo: 0x9e, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xa7}, {value: 0xe045, lo: 0xa8, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xb7}, {value: 0xe045, lo: 0xb8, hi: 0xbf}, // Block 0x48, offset 0x288 {value: 0x0000, lo: 0x03}, {value: 0x0040, lo: 0x80, hi: 0x8f}, {value: 0x3318, lo: 0x90, hi: 0xb0}, {value: 0x0040, lo: 0xb1, hi: 0xbf}, // Block 0x49, offset 0x28c {value: 0x0000, lo: 0x08}, {value: 0x0018, lo: 0x80, hi: 0x82}, {value: 0x0040, lo: 0x83, hi: 0x83}, {value: 0x0008, lo: 0x84, hi: 0x84}, {value: 0x0018, lo: 0x85, hi: 0x88}, {value: 0x24c1, lo: 0x89, hi: 0x89}, {value: 0x0018, lo: 0x8a, hi: 0x8b}, {value: 0x0040, lo: 0x8c, hi: 0x8f}, {value: 0x0018, lo: 0x90, hi: 0xbf}, // Block 0x4a, offset 0x295 {value: 0x0000, lo: 0x07}, {value: 0x0018, lo: 0x80, hi: 0xab}, {value: 0x24f1, lo: 0xac, hi: 0xac}, {value: 0x2529, lo: 0xad, hi: 0xad}, {value: 0x0018, lo: 0xae, hi: 0xae}, {value: 0x2579, lo: 0xaf, hi: 0xaf}, {value: 0x25b1, lo: 0xb0, hi: 0xb0}, {value: 0x0018, lo: 0xb1, hi: 0xbf}, // Block 0x4b, offset 0x29d {value: 0x0000, lo: 0x05}, {value: 0x0018, lo: 0x80, hi: 0x9f}, {value: 0x0080, lo: 0xa0, hi: 0xa0}, {value: 0x0018, lo: 0xa1, hi: 0xad}, {value: 0x0080, lo: 0xae, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xbf}, // Block 0x4c, offset 0x2a3 {value: 0x0000, lo: 0x04}, {value: 0x0018, lo: 0x80, hi: 0xa8}, {value: 0x09c5, lo: 0xa9, hi: 0xa9}, {value: 0x09e5, lo: 0xaa, hi: 0xaa}, {value: 0x0018, lo: 0xab, hi: 0xbf}, // Block 0x4d, offset 0x2a8 {value: 0x0000, lo: 0x02}, {value: 0x0018, lo: 0x80, hi: 0xa6}, {value: 0x0040, lo: 0xa7, hi: 0xbf}, // Block 0x4e, offset 0x2ab {value: 0x0000, lo: 0x03}, {value: 0x0018, lo: 0x80, hi: 0x8b}, {value: 0x28c1, lo: 0x8c, hi: 0x8c}, {value: 0x0018, lo: 0x8d, hi: 0xbf}, // Block 0x4f, offset 0x2af {value: 0x0000, lo: 0x05}, {value: 0x0018, lo: 0x80, hi: 0xb3}, {value: 0x0e66, lo: 0xb4, hi: 0xb4}, {value: 0x292a, lo: 0xb5, hi: 0xb5}, {value: 0x0e86, lo: 0xb6, hi: 0xb6}, {value: 0x0018, lo: 0xb7, hi: 0xbf}, // Block 0x50, offset 0x2b5 {value: 0x0000, lo: 0x03}, {value: 0x0018, lo: 0x80, hi: 0x9b}, {value: 0x2941, lo: 0x9c, hi: 0x9c}, {value: 0x0018, lo: 0x9d, hi: 0xbf}, // Block 0x51, offset 0x2b9 {value: 0x0000, lo: 0x03}, {value: 0x0018, lo: 0x80, hi: 0xb3}, {value: 0x0040, lo: 0xb4, hi: 0xb5}, {value: 0x0018, lo: 0xb6, hi: 0xbf}, // Block 0x52, offset 0x2bd {value: 0x0000, lo: 0x05}, {value: 0x0018, lo: 0x80, hi: 0x95}, {value: 0x0040, lo: 0x96, hi: 0x97}, {value: 0x0018, lo: 0x98, hi: 0xb9}, {value: 0x0040, lo: 0xba, hi: 0xbc}, {value: 0x0018, lo: 0xbd, hi: 0xbf}, // Block 0x53, offset 0x2c3 {value: 0x0000, lo: 0x06}, {value: 0x0018, lo: 0x80, hi: 0x88}, {value: 0x0040, lo: 0x89, hi: 0x89}, {value: 0x0018, lo: 0x8a, hi: 0x92}, {value: 0x0040, lo: 0x93, hi: 0xab}, {value: 0x0018, lo: 0xac, hi: 0xaf}, {value: 0x0040, lo: 0xb0, hi: 0xbf}, // Block 0x54, offset 0x2ca {value: 0x0000, lo: 0x05}, {value: 0xe185, lo: 0x80, hi: 0x8f}, {value: 0x03f5, lo: 0x90, hi: 0x9f}, {value: 0x0ea5, lo: 0xa0, hi: 0xae}, {value: 0x0040, lo: 0xaf, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xbf}, // Block 0x55, offset 0x2d0 {value: 0x0000, lo: 0x07}, {value: 0x0008, lo: 0x80, hi: 0xa5}, {value: 0x0040, lo: 0xa6, hi: 0xa6}, {value: 0x0008, lo: 0xa7, hi: 0xa7}, {value: 0x0040, lo: 0xa8, hi: 0xac}, {value: 0x0008, lo: 0xad, hi: 0xad}, {value: 0x0040, lo: 0xae, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xbf}, // Block 0x56, offset 0x2d8 {value: 0x0000, lo: 0x06}, {value: 0x0008, lo: 0x80, hi: 0xa7}, {value: 0x0040, lo: 0xa8, hi: 0xae}, {value: 0xe075, lo: 0xaf, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xb0}, {value: 0x0040, lo: 0xb1, hi: 0xbe}, {value: 0x3b08, lo: 0xbf, hi: 0xbf}, // Block 0x57, offset 0x2df {value: 0x0000, lo: 0x0a}, {value: 0x0008, lo: 0x80, hi: 0x96}, {value: 0x0040, lo: 0x97, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xa6}, {value: 0x0040, lo: 0xa7, hi: 0xa7}, {value: 0x0008, lo: 0xa8, hi: 0xae}, {value: 0x0040, lo: 0xaf, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xb6}, {value: 0x0040, lo: 0xb7, hi: 0xb7}, {value: 0x0008, lo: 0xb8, hi: 0xbe}, {value: 0x0040, lo: 0xbf, hi: 0xbf}, // Block 0x58, offset 0x2ea {value: 0x0000, lo: 0x09}, {value: 0x0008, lo: 0x80, hi: 0x86}, {value: 0x0040, lo: 0x87, hi: 0x87}, {value: 0x0008, lo: 0x88, hi: 0x8e}, {value: 0x0040, lo: 0x8f, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x96}, {value: 0x0040, lo: 0x97, hi: 0x97}, {value: 0x0008, lo: 0x98, hi: 0x9e}, {value: 0x0040, lo: 0x9f, hi: 0x9f}, {value: 0x3308, lo: 0xa0, hi: 0xbf}, // Block 0x59, offset 0x2f4 {value: 0x0000, lo: 0x03}, {value: 0x0018, lo: 0x80, hi: 0xae}, {value: 0x0008, lo: 0xaf, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xbf}, // Block 0x5a, offset 0x2f8 {value: 0x0000, lo: 0x02}, {value: 0x0018, lo: 0x80, hi: 0x89}, {value: 0x0040, lo: 0x8a, hi: 0xbf}, // Block 0x5b, offset 0x2fb {value: 0x0000, lo: 0x05}, {value: 0x0018, lo: 0x80, hi: 0x99}, {value: 0x0040, lo: 0x9a, hi: 0x9a}, {value: 0x0018, lo: 0x9b, hi: 0x9e}, {value: 0x0edd, lo: 0x9f, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xbf}, // Block 0x5c, offset 0x301 {value: 0x0000, lo: 0x03}, {value: 0x0018, lo: 0x80, hi: 0xb2}, {value: 0x0efd, lo: 0xb3, hi: 0xb3}, {value: 0x0040, lo: 0xb4, hi: 0xbf}, // Block 0x5d, offset 0x305 {value: 0x0020, lo: 0x01}, {value: 0x0f1d, lo: 0x80, hi: 0xbf}, // Block 0x5e, offset 0x307 {value: 0x0020, lo: 0x02}, {value: 0x171d, lo: 0x80, hi: 0x8f}, {value: 0x18fd, lo: 0x90, hi: 0xbf}, // Block 0x5f, offset 0x30a {value: 0x0020, lo: 0x01}, {value: 0x1efd, lo: 0x80, hi: 0xbf}, // Block 0x60, offset 0x30c {value: 0x0000, lo: 0x02}, {value: 0x0040, lo: 0x80, hi: 0x80}, {value: 0x0008, lo: 0x81, hi: 0xbf}, // Block 0x61, offset 0x30f {value: 0x0000, lo: 0x09}, {value: 0x0008, lo: 0x80, hi: 0x96}, {value: 0x0040, lo: 0x97, hi: 0x98}, {value: 0x3308, lo: 0x99, hi: 0x9a}, {value: 0x29e2, lo: 0x9b, hi: 0x9b}, {value: 0x2a0a, lo: 0x9c, hi: 0x9c}, {value: 0x0008, lo: 0x9d, hi: 0x9e}, {value: 0x2a31, lo: 0x9f, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xa0}, {value: 0x0008, lo: 0xa1, hi: 0xbf}, // Block 0x62, offset 0x319 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xbe}, {value: 0x2a69, lo: 0xbf, hi: 0xbf}, // Block 0x63, offset 0x31c {value: 0x0000, lo: 0x0e}, {value: 0x0040, lo: 0x80, hi: 0x84}, {value: 0x0008, lo: 0x85, hi: 0xae}, {value: 0x0040, lo: 0xaf, hi: 0xb0}, {value: 0x2a1d, lo: 0xb1, hi: 0xb1}, {value: 0x2a3d, lo: 0xb2, hi: 0xb2}, {value: 0x2a5d, lo: 0xb3, hi: 0xb3}, {value: 0x2a7d, lo: 0xb4, hi: 0xb4}, {value: 0x2a5d, lo: 0xb5, hi: 0xb5}, {value: 0x2a9d, lo: 0xb6, hi: 0xb6}, {value: 0x2abd, lo: 0xb7, hi: 0xb7}, {value: 0x2add, lo: 0xb8, hi: 0xb9}, {value: 0x2afd, lo: 0xba, hi: 0xbb}, {value: 0x2b1d, lo: 0xbc, hi: 0xbd}, {value: 0x2afd, lo: 0xbe, hi: 0xbf}, // Block 0x64, offset 0x32b {value: 0x0000, lo: 0x03}, {value: 0x0018, lo: 0x80, hi: 0xa3}, {value: 0x0040, lo: 0xa4, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xbf}, // Block 0x65, offset 0x32f {value: 0x0030, lo: 0x04}, {value: 0x2aa2, lo: 0x80, hi: 0x9d}, {value: 0x305a, lo: 0x9e, hi: 0x9e}, {value: 0x0040, lo: 0x9f, hi: 0x9f}, {value: 0x30a2, lo: 0xa0, hi: 0xbf}, // Block 0x66, offset 0x334 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xaa}, {value: 0x0040, lo: 0xab, hi: 0xbf}, // Block 0x67, offset 0x337 {value: 0x0000, lo: 0x03}, {value: 0x0008, lo: 0x80, hi: 0x8c}, {value: 0x0040, lo: 0x8d, hi: 0x8f}, {value: 0x0018, lo: 0x90, hi: 0xbf}, // Block 0x68, offset 0x33b {value: 0x0000, lo: 0x04}, {value: 0x0018, lo: 0x80, hi: 0x86}, {value: 0x0040, lo: 0x87, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0xbd}, {value: 0x0018, lo: 0xbe, hi: 0xbf}, // Block 0x69, offset 0x340 {value: 0x0000, lo: 0x04}, {value: 0x0008, lo: 0x80, hi: 0x8c}, {value: 0x0018, lo: 0x8d, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0xab}, {value: 0x0040, lo: 0xac, hi: 0xbf}, // Block 0x6a, offset 0x345 {value: 0x0000, lo: 0x05}, {value: 0x0008, lo: 0x80, hi: 0xa5}, {value: 0x0018, lo: 0xa6, hi: 0xaf}, {value: 0x3308, lo: 0xb0, hi: 0xb1}, {value: 0x0018, lo: 0xb2, hi: 0xb7}, {value: 0x0040, lo: 0xb8, hi: 0xbf}, // Block 0x6b, offset 0x34b {value: 0x0000, lo: 0x05}, {value: 0x0040, lo: 0x80, hi: 0xb6}, {value: 0x0008, lo: 0xb7, hi: 0xb7}, {value: 0x2009, lo: 0xb8, hi: 0xb8}, {value: 0x6e89, lo: 0xb9, hi: 0xb9}, {value: 0x0008, lo: 0xba, hi: 0xbf}, // Block 0x6c, offset 0x351 {value: 0x0000, lo: 0x0e}, {value: 0x0008, lo: 0x80, hi: 0x81}, {value: 0x3308, lo: 0x82, hi: 0x82}, {value: 0x0008, lo: 0x83, hi: 0x85}, {value: 0x3b08, lo: 0x86, hi: 0x86}, {value: 0x0008, lo: 0x87, hi: 0x8a}, {value: 0x3308, lo: 0x8b, hi: 0x8b}, {value: 0x0008, lo: 0x8c, hi: 0xa2}, {value: 0x3008, lo: 0xa3, hi: 0xa4}, {value: 0x3308, lo: 0xa5, hi: 0xa6}, {value: 0x3008, lo: 0xa7, hi: 0xa7}, {value: 0x0018, lo: 0xa8, hi: 0xab}, {value: 0x0040, lo: 0xac, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xb9}, {value: 0x0040, lo: 0xba, hi: 0xbf}, // Block 0x6d, offset 0x360 {value: 0x0000, lo: 0x05}, {value: 0x0208, lo: 0x80, hi: 0xb1}, {value: 0x0108, lo: 0xb2, hi: 0xb2}, {value: 0x0008, lo: 0xb3, hi: 0xb3}, {value: 0x0018, lo: 0xb4, hi: 0xb7}, {value: 0x0040, lo: 0xb8, hi: 0xbf}, // Block 0x6e, offset 0x366 {value: 0x0000, lo: 0x03}, {value: 0x3008, lo: 0x80, hi: 0x81}, {value: 0x0008, lo: 0x82, hi: 0xb3}, {value: 0x3008, lo: 0xb4, hi: 0xbf}, // Block 0x6f, offset 0x36a {value: 0x0000, lo: 0x0e}, {value: 0x3008, lo: 0x80, hi: 0x83}, {value: 0x3b08, lo: 0x84, hi: 0x84}, {value: 0x3308, lo: 0x85, hi: 0x85}, {value: 0x0040, lo: 0x86, hi: 0x8d}, {value: 0x0018, lo: 0x8e, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x99}, {value: 0x0040, lo: 0x9a, hi: 0x9f}, {value: 0x3308, lo: 0xa0, hi: 0xb1}, {value: 0x0008, lo: 0xb2, hi: 0xb7}, {value: 0x0018, lo: 0xb8, hi: 0xba}, {value: 0x0008, lo: 0xbb, hi: 0xbb}, {value: 0x0018, lo: 0xbc, hi: 0xbc}, {value: 0x0008, lo: 0xbd, hi: 0xbd}, {value: 0x0040, lo: 0xbe, hi: 0xbf}, // Block 0x70, offset 0x379 {value: 0x0000, lo: 0x04}, {value: 0x0008, lo: 0x80, hi: 0xa5}, {value: 0x3308, lo: 0xa6, hi: 0xad}, {value: 0x0018, lo: 0xae, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xbf}, // Block 0x71, offset 0x37e {value: 0x0000, lo: 0x07}, {value: 0x0008, lo: 0x80, hi: 0x86}, {value: 0x3308, lo: 0x87, hi: 0x91}, {value: 0x3008, lo: 0x92, hi: 0x92}, {value: 0x3808, lo: 0x93, hi: 0x93}, {value: 0x0040, lo: 0x94, hi: 0x9e}, {value: 0x0018, lo: 0x9f, hi: 0xbc}, {value: 0x0040, lo: 0xbd, hi: 0xbf}, // Block 0x72, offset 0x386 {value: 0x0000, lo: 0x09}, {value: 0x3308, lo: 0x80, hi: 0x82}, {value: 0x3008, lo: 0x83, hi: 0x83}, {value: 0x0008, lo: 0x84, hi: 0xb2}, {value: 0x3308, lo: 0xb3, hi: 0xb3}, {value: 0x3008, lo: 0xb4, hi: 0xb5}, {value: 0x3308, lo: 0xb6, hi: 0xb9}, {value: 0x3008, lo: 0xba, hi: 0xbb}, {value: 0x3308, lo: 0xbc, hi: 0xbc}, {value: 0x3008, lo: 0xbd, hi: 0xbf}, // Block 0x73, offset 0x390 {value: 0x0000, lo: 0x0a}, {value: 0x3808, lo: 0x80, hi: 0x80}, {value: 0x0018, lo: 0x81, hi: 0x8d}, {value: 0x0040, lo: 0x8e, hi: 0x8e}, {value: 0x0008, lo: 0x8f, hi: 0x99}, {value: 0x0040, lo: 0x9a, hi: 0x9d}, {value: 0x0018, lo: 0x9e, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xa4}, {value: 0x3308, lo: 0xa5, hi: 0xa5}, {value: 0x0008, lo: 0xa6, hi: 0xbe}, {value: 0x0040, lo: 0xbf, hi: 0xbf}, // Block 0x74, offset 0x39b {value: 0x0000, lo: 0x07}, {value: 0x0008, lo: 0x80, hi: 0xa8}, {value: 0x3308, lo: 0xa9, hi: 0xae}, {value: 0x3008, lo: 0xaf, hi: 0xb0}, {value: 0x3308, lo: 0xb1, hi: 0xb2}, {value: 0x3008, lo: 0xb3, hi: 0xb4}, {value: 0x3308, lo: 0xb5, hi: 0xb6}, {value: 0x0040, lo: 0xb7, hi: 0xbf}, // Block 0x75, offset 0x3a3 {value: 0x0000, lo: 0x10}, {value: 0x0008, lo: 0x80, hi: 0x82}, {value: 0x3308, lo: 0x83, hi: 0x83}, {value: 0x0008, lo: 0x84, hi: 0x8b}, {value: 0x3308, lo: 0x8c, hi: 0x8c}, {value: 0x3008, lo: 0x8d, hi: 0x8d}, {value: 0x0040, lo: 0x8e, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x99}, {value: 0x0040, lo: 0x9a, hi: 0x9b}, {value: 0x0018, lo: 0x9c, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xb6}, {value: 0x0018, lo: 0xb7, hi: 0xb9}, {value: 0x0008, lo: 0xba, hi: 0xba}, {value: 0x3008, lo: 0xbb, hi: 0xbb}, {value: 0x3308, lo: 0xbc, hi: 0xbc}, {value: 0x3008, lo: 0xbd, hi: 0xbd}, {value: 0x0008, lo: 0xbe, hi: 0xbf}, // Block 0x76, offset 0x3b4 {value: 0x0000, lo: 0x08}, {value: 0x0008, lo: 0x80, hi: 0xaf}, {value: 0x3308, lo: 0xb0, hi: 0xb0}, {value: 0x0008, lo: 0xb1, hi: 0xb1}, {value: 0x3308, lo: 0xb2, hi: 0xb4}, {value: 0x0008, lo: 0xb5, hi: 0xb6}, {value: 0x3308, lo: 0xb7, hi: 0xb8}, {value: 0x0008, lo: 0xb9, hi: 0xbd}, {value: 0x3308, lo: 0xbe, hi: 0xbf}, // Block 0x77, offset 0x3bd {value: 0x0000, lo: 0x0f}, {value: 0x0008, lo: 0x80, hi: 0x80}, {value: 0x3308, lo: 0x81, hi: 0x81}, {value: 0x0008, lo: 0x82, hi: 0x82}, {value: 0x0040, lo: 0x83, hi: 0x9a}, {value: 0x0008, lo: 0x9b, hi: 0x9d}, {value: 0x0018, lo: 0x9e, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xaa}, {value: 0x3008, lo: 0xab, hi: 0xab}, {value: 0x3308, lo: 0xac, hi: 0xad}, {value: 0x3008, lo: 0xae, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xb1}, {value: 0x0008, lo: 0xb2, hi: 0xb4}, {value: 0x3008, lo: 0xb5, hi: 0xb5}, {value: 0x3b08, lo: 0xb6, hi: 0xb6}, {value: 0x0040, lo: 0xb7, hi: 0xbf}, // Block 0x78, offset 0x3cd {value: 0x0000, lo: 0x0c}, {value: 0x0040, lo: 0x80, hi: 0x80}, {value: 0x0008, lo: 0x81, hi: 0x86}, {value: 0x0040, lo: 0x87, hi: 0x88}, {value: 0x0008, lo: 0x89, hi: 0x8e}, {value: 0x0040, lo: 0x8f, hi: 0x90}, {value: 0x0008, lo: 0x91, hi: 0x96}, {value: 0x0040, lo: 0x97, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xa6}, {value: 0x0040, lo: 0xa7, hi: 0xa7}, {value: 0x0008, lo: 0xa8, hi: 0xae}, {value: 0x0040, lo: 0xaf, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xbf}, // Block 0x79, offset 0x3da {value: 0x0000, lo: 0x09}, {value: 0x0008, lo: 0x80, hi: 0x9a}, {value: 0x0018, lo: 0x9b, hi: 0x9b}, {value: 0x4465, lo: 0x9c, hi: 0x9c}, {value: 0x447d, lo: 0x9d, hi: 0x9d}, {value: 0x2971, lo: 0x9e, hi: 0x9e}, {value: 0xe06d, lo: 0x9f, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xa5}, {value: 0x0040, lo: 0xa6, hi: 0xaf}, {value: 0x4495, lo: 0xb0, hi: 0xbf}, // Block 0x7a, offset 0x3e4 {value: 0x0000, lo: 0x04}, {value: 0x44b5, lo: 0x80, hi: 0x8f}, {value: 0x44d5, lo: 0x90, hi: 0x9f}, {value: 0x44f5, lo: 0xa0, hi: 0xaf}, {value: 0x44d5, lo: 0xb0, hi: 0xbf}, // Block 0x7b, offset 0x3e9 {value: 0x0000, lo: 0x0c}, {value: 0x0008, lo: 0x80, hi: 0xa2}, {value: 0x3008, lo: 0xa3, hi: 0xa4}, {value: 0x3308, lo: 0xa5, hi: 0xa5}, {value: 0x3008, lo: 0xa6, hi: 0xa7}, {value: 0x3308, lo: 0xa8, hi: 0xa8}, {value: 0x3008, lo: 0xa9, hi: 0xaa}, {value: 0x0018, lo: 0xab, hi: 0xab}, {value: 0x3008, lo: 0xac, hi: 0xac}, {value: 0x3b08, lo: 0xad, hi: 0xad}, {value: 0x0040, lo: 0xae, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xb9}, {value: 0x0040, lo: 0xba, hi: 0xbf}, // Block 0x7c, offset 0x3f6 {value: 0x0000, lo: 0x03}, {value: 0x0008, lo: 0x80, hi: 0xa3}, {value: 0x0040, lo: 0xa4, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xbf}, // Block 0x7d, offset 0x3fa {value: 0x0000, lo: 0x04}, {value: 0x0018, lo: 0x80, hi: 0x86}, {value: 0x0040, lo: 0x87, hi: 0x8a}, {value: 0x0018, lo: 0x8b, hi: 0xbb}, {value: 0x0040, lo: 0xbc, hi: 0xbf}, // Block 0x7e, offset 0x3ff {value: 0x0020, lo: 0x01}, {value: 0x4515, lo: 0x80, hi: 0xbf}, // Block 0x7f, offset 0x401 {value: 0x0020, lo: 0x03}, {value: 0x4d15, lo: 0x80, hi: 0x94}, {value: 0x4ad5, lo: 0x95, hi: 0x95}, {value: 0x4fb5, lo: 0x96, hi: 0xbf}, // Block 0x80, offset 0x405 {value: 0x0020, lo: 0x01}, {value: 0x54f5, lo: 0x80, hi: 0xbf}, // Block 0x81, offset 0x407 {value: 0x0020, lo: 0x03}, {value: 0x5cf5, lo: 0x80, hi: 0x84}, {value: 0x5655, lo: 0x85, hi: 0x85}, {value: 0x5d95, lo: 0x86, hi: 0xbf}, // Block 0x82, offset 0x40b {value: 0x0020, lo: 0x08}, {value: 0x6b55, lo: 0x80, hi: 0x8f}, {value: 0x6d15, lo: 0x90, hi: 0x90}, {value: 0x6d55, lo: 0x91, hi: 0xab}, {value: 0x6ea1, lo: 0xac, hi: 0xac}, {value: 0x70b5, lo: 0xad, hi: 0xad}, {value: 0x0040, lo: 0xae, hi: 0xae}, {value: 0x0040, lo: 0xaf, hi: 0xaf}, {value: 0x70d5, lo: 0xb0, hi: 0xbf}, // Block 0x83, offset 0x414 {value: 0x0020, lo: 0x05}, {value: 0x72d5, lo: 0x80, hi: 0xad}, {value: 0x6535, lo: 0xae, hi: 0xae}, {value: 0x7895, lo: 0xaf, hi: 0xb5}, {value: 0x6f55, lo: 0xb6, hi: 0xb6}, {value: 0x7975, lo: 0xb7, hi: 0xbf}, // Block 0x84, offset 0x41a {value: 0x0028, lo: 0x03}, {value: 0x7c21, lo: 0x80, hi: 0x82}, {value: 0x7be1, lo: 0x83, hi: 0x83}, {value: 0x7c99, lo: 0x84, hi: 0xbf}, // Block 0x85, offset 0x41e {value: 0x0038, lo: 0x0f}, {value: 0x9db1, lo: 0x80, hi: 0x83}, {value: 0x9e59, lo: 0x84, hi: 0x85}, {value: 0x9e91, lo: 0x86, hi: 0x87}, {value: 0x9ec9, lo: 0x88, hi: 0x8f}, {value: 0x0040, lo: 0x90, hi: 0x90}, {value: 0x0040, lo: 0x91, hi: 0x91}, {value: 0xa089, lo: 0x92, hi: 0x97}, {value: 0xa1a1, lo: 0x98, hi: 0x9c}, {value: 0xa281, lo: 0x9d, hi: 0xb3}, {value: 0x9d41, lo: 0xb4, hi: 0xb4}, {value: 0x9db1, lo: 0xb5, hi: 0xb5}, {value: 0xa789, lo: 0xb6, hi: 0xbb}, {value: 0xa869, lo: 0xbc, hi: 0xbc}, {value: 0xa7f9, lo: 0xbd, hi: 0xbd}, {value: 0xa8d9, lo: 0xbe, hi: 0xbf}, // Block 0x86, offset 0x42e {value: 0x0000, lo: 0x09}, {value: 0x0008, lo: 0x80, hi: 0x8b}, {value: 0x0040, lo: 0x8c, hi: 0x8c}, {value: 0x0008, lo: 0x8d, hi: 0xa6}, {value: 0x0040, lo: 0xa7, hi: 0xa7}, {value: 0x0008, lo: 0xa8, hi: 0xba}, {value: 0x0040, lo: 0xbb, hi: 0xbb}, {value: 0x0008, lo: 0xbc, hi: 0xbd}, {value: 0x0040, lo: 0xbe, hi: 0xbe}, {value: 0x0008, lo: 0xbf, hi: 0xbf}, // Block 0x87, offset 0x438 {value: 0x0000, lo: 0x04}, {value: 0x0008, lo: 0x80, hi: 0x8d}, {value: 0x0040, lo: 0x8e, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x9d}, {value: 0x0040, lo: 0x9e, hi: 0xbf}, // Block 0x88, offset 0x43d {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xba}, {value: 0x0040, lo: 0xbb, hi: 0xbf}, // Block 0x89, offset 0x440 {value: 0x0000, lo: 0x05}, {value: 0x0018, lo: 0x80, hi: 0x82}, {value: 0x0040, lo: 0x83, hi: 0x86}, {value: 0x0018, lo: 0x87, hi: 0xb3}, {value: 0x0040, lo: 0xb4, hi: 0xb6}, {value: 0x0018, lo: 0xb7, hi: 0xbf}, // Block 0x8a, offset 0x446 {value: 0x0000, lo: 0x06}, {value: 0x0018, lo: 0x80, hi: 0x8e}, {value: 0x0040, lo: 0x8f, hi: 0x8f}, {value: 0x0018, lo: 0x90, hi: 0x9b}, {value: 0x0040, lo: 0x9c, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xa0}, {value: 0x0040, lo: 0xa1, hi: 0xbf}, // Block 0x8b, offset 0x44d {value: 0x0000, lo: 0x04}, {value: 0x0040, lo: 0x80, hi: 0x8f}, {value: 0x0018, lo: 0x90, hi: 0xbc}, {value: 0x3308, lo: 0xbd, hi: 0xbd}, {value: 0x0040, lo: 0xbe, hi: 0xbf}, // Block 0x8c, offset 0x452 {value: 0x0000, lo: 0x03}, {value: 0x0008, lo: 0x80, hi: 0x9c}, {value: 0x0040, lo: 0x9d, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xbf}, // Block 0x8d, offset 0x456 {value: 0x0000, lo: 0x05}, {value: 0x0008, lo: 0x80, hi: 0x90}, {value: 0x0040, lo: 0x91, hi: 0x9f}, {value: 0x3308, lo: 0xa0, hi: 0xa0}, {value: 0x0018, lo: 0xa1, hi: 0xbb}, {value: 0x0040, lo: 0xbc, hi: 0xbf}, // Block 0x8e, offset 0x45c {value: 0x0000, lo: 0x04}, {value: 0x0008, lo: 0x80, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xa3}, {value: 0x0040, lo: 0xa4, hi: 0xac}, {value: 0x0008, lo: 0xad, hi: 0xbf}, // Block 0x8f, offset 0x461 {value: 0x0000, lo: 0x08}, {value: 0x0008, lo: 0x80, hi: 0x80}, {value: 0x0018, lo: 0x81, hi: 0x81}, {value: 0x0008, lo: 0x82, hi: 0x89}, {value: 0x0018, lo: 0x8a, hi: 0x8a}, {value: 0x0040, lo: 0x8b, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0xb5}, {value: 0x3308, lo: 0xb6, hi: 0xba}, {value: 0x0040, lo: 0xbb, hi: 0xbf}, // Block 0x90, offset 0x46a {value: 0x0000, lo: 0x04}, {value: 0x0008, lo: 0x80, hi: 0x9d}, {value: 0x0040, lo: 0x9e, hi: 0x9e}, {value: 0x0018, lo: 0x9f, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xbf}, // Block 0x91, offset 0x46f {value: 0x0000, lo: 0x05}, {value: 0x0008, lo: 0x80, hi: 0x83}, {value: 0x0040, lo: 0x84, hi: 0x87}, {value: 0x0008, lo: 0x88, hi: 0x8f}, {value: 0x0018, lo: 0x90, hi: 0x95}, {value: 0x0040, lo: 0x96, hi: 0xbf}, // Block 0x92, offset 0x475 {value: 0x0000, lo: 0x06}, {value: 0xe145, lo: 0x80, hi: 0x87}, {value: 0xe1c5, lo: 0x88, hi: 0x8f}, {value: 0xe145, lo: 0x90, hi: 0x97}, {value: 0x8ad5, lo: 0x98, hi: 0x9f}, {value: 0x8aed, lo: 0xa0, hi: 0xa7}, {value: 0x0008, lo: 0xa8, hi: 0xbf}, // Block 0x93, offset 0x47c {value: 0x0000, lo: 0x06}, {value: 0x0008, lo: 0x80, hi: 0x9d}, {value: 0x0040, lo: 0x9e, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xa9}, {value: 0x0040, lo: 0xaa, hi: 0xaf}, {value: 0x8aed, lo: 0xb0, hi: 0xb7}, {value: 0x8ad5, lo: 0xb8, hi: 0xbf}, // Block 0x94, offset 0x483 {value: 0x0000, lo: 0x06}, {value: 0xe145, lo: 0x80, hi: 0x87}, {value: 0xe1c5, lo: 0x88, hi: 0x8f}, {value: 0xe145, lo: 0x90, hi: 0x93}, {value: 0x0040, lo: 0x94, hi: 0x97}, {value: 0x0008, lo: 0x98, hi: 0xbb}, {value: 0x0040, lo: 0xbc, hi: 0xbf}, // Block 0x95, offset 0x48a {value: 0x0000, lo: 0x03}, {value: 0x0008, lo: 0x80, hi: 0xa7}, {value: 0x0040, lo: 0xa8, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xbf}, // Block 0x96, offset 0x48e {value: 0x0000, lo: 0x04}, {value: 0x0008, lo: 0x80, hi: 0xa3}, {value: 0x0040, lo: 0xa4, hi: 0xae}, {value: 0x0018, lo: 0xaf, hi: 0xaf}, {value: 0x0040, lo: 0xb0, hi: 0xbf}, // Block 0x97, offset 0x493 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xb6}, {value: 0x0040, lo: 0xb7, hi: 0xbf}, // Block 0x98, offset 0x496 {value: 0x0000, lo: 0x04}, {value: 0x0008, lo: 0x80, hi: 0x95}, {value: 0x0040, lo: 0x96, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xa7}, {value: 0x0040, lo: 0xa8, hi: 0xbf}, // Block 0x99, offset 0x49b {value: 0x0000, lo: 0x0b}, {value: 0x0808, lo: 0x80, hi: 0x85}, {value: 0x0040, lo: 0x86, hi: 0x87}, {value: 0x0808, lo: 0x88, hi: 0x88}, {value: 0x0040, lo: 0x89, hi: 0x89}, {value: 0x0808, lo: 0x8a, hi: 0xb5}, {value: 0x0040, lo: 0xb6, hi: 0xb6}, {value: 0x0808, lo: 0xb7, hi: 0xb8}, {value: 0x0040, lo: 0xb9, hi: 0xbb}, {value: 0x0808, lo: 0xbc, hi: 0xbc}, {value: 0x0040, lo: 0xbd, hi: 0xbe}, {value: 0x0808, lo: 0xbf, hi: 0xbf}, // Block 0x9a, offset 0x4a7 {value: 0x0000, lo: 0x05}, {value: 0x0808, lo: 0x80, hi: 0x95}, {value: 0x0040, lo: 0x96, hi: 0x96}, {value: 0x0818, lo: 0x97, hi: 0x9f}, {value: 0x0808, lo: 0xa0, hi: 0xb6}, {value: 0x0818, lo: 0xb7, hi: 0xbf}, // Block 0x9b, offset 0x4ad {value: 0x0000, lo: 0x04}, {value: 0x0808, lo: 0x80, hi: 0x9e}, {value: 0x0040, lo: 0x9f, hi: 0xa6}, {value: 0x0818, lo: 0xa7, hi: 0xaf}, {value: 0x0040, lo: 0xb0, hi: 0xbf}, // Block 0x9c, offset 0x4b2 {value: 0x0000, lo: 0x06}, {value: 0x0040, lo: 0x80, hi: 0x9f}, {value: 0x0808, lo: 0xa0, hi: 0xb2}, {value: 0x0040, lo: 0xb3, hi: 0xb3}, {value: 0x0808, lo: 0xb4, hi: 0xb5}, {value: 0x0040, lo: 0xb6, hi: 0xba}, {value: 0x0818, lo: 0xbb, hi: 0xbf}, // Block 0x9d, offset 0x4b9 {value: 0x0000, lo: 0x07}, {value: 0x0808, lo: 0x80, hi: 0x95}, {value: 0x0818, lo: 0x96, hi: 0x9b}, {value: 0x0040, lo: 0x9c, hi: 0x9e}, {value: 0x0018, lo: 0x9f, hi: 0x9f}, {value: 0x0808, lo: 0xa0, hi: 0xb9}, {value: 0x0040, lo: 0xba, hi: 0xbe}, {value: 0x0818, lo: 0xbf, hi: 0xbf}, // Block 0x9e, offset 0x4c1 {value: 0x0000, lo: 0x04}, {value: 0x0808, lo: 0x80, hi: 0xb7}, {value: 0x0040, lo: 0xb8, hi: 0xbb}, {value: 0x0818, lo: 0xbc, hi: 0xbd}, {value: 0x0808, lo: 0xbe, hi: 0xbf}, // Block 0x9f, offset 0x4c6 {value: 0x0000, lo: 0x03}, {value: 0x0818, lo: 0x80, hi: 0x8f}, {value: 0x0040, lo: 0x90, hi: 0x91}, {value: 0x0818, lo: 0x92, hi: 0xbf}, // Block 0xa0, offset 0x4ca {value: 0x0000, lo: 0x0f}, {value: 0x0808, lo: 0x80, hi: 0x80}, {value: 0x3308, lo: 0x81, hi: 0x83}, {value: 0x0040, lo: 0x84, hi: 0x84}, {value: 0x3308, lo: 0x85, hi: 0x86}, {value: 0x0040, lo: 0x87, hi: 0x8b}, {value: 0x3308, lo: 0x8c, hi: 0x8f}, {value: 0x0808, lo: 0x90, hi: 0x93}, {value: 0x0040, lo: 0x94, hi: 0x94}, {value: 0x0808, lo: 0x95, hi: 0x97}, {value: 0x0040, lo: 0x98, hi: 0x98}, {value: 0x0808, lo: 0x99, hi: 0xb3}, {value: 0x0040, lo: 0xb4, hi: 0xb7}, {value: 0x3308, lo: 0xb8, hi: 0xba}, {value: 0x0040, lo: 0xbb, hi: 0xbe}, {value: 0x3b08, lo: 0xbf, hi: 0xbf}, // Block 0xa1, offset 0x4da {value: 0x0000, lo: 0x06}, {value: 0x0818, lo: 0x80, hi: 0x87}, {value: 0x0040, lo: 0x88, hi: 0x8f}, {value: 0x0818, lo: 0x90, hi: 0x98}, {value: 0x0040, lo: 0x99, hi: 0x9f}, {value: 0x0808, lo: 0xa0, hi: 0xbc}, {value: 0x0818, lo: 0xbd, hi: 0xbf}, // Block 0xa2, offset 0x4e1 {value: 0x0000, lo: 0x03}, {value: 0x0808, lo: 0x80, hi: 0x9c}, {value: 0x0818, lo: 0x9d, hi: 0x9f}, {value: 0x0040, lo: 0xa0, hi: 0xbf}, // Block 0xa3, offset 0x4e5 {value: 0x0000, lo: 0x03}, {value: 0x0808, lo: 0x80, hi: 0xb5}, {value: 0x0040, lo: 0xb6, hi: 0xb8}, {value: 0x0018, lo: 0xb9, hi: 0xbf}, // Block 0xa4, offset 0x4e9 {value: 0x0000, lo: 0x06}, {value: 0x0808, lo: 0x80, hi: 0x95}, {value: 0x0040, lo: 0x96, hi: 0x97}, {value: 0x0818, lo: 0x98, hi: 0x9f}, {value: 0x0808, lo: 0xa0, hi: 0xb2}, {value: 0x0040, lo: 0xb3, hi: 0xb7}, {value: 0x0818, lo: 0xb8, hi: 0xbf}, // Block 0xa5, offset 0x4f0 {value: 0x0000, lo: 0x01}, {value: 0x0808, lo: 0x80, hi: 0xbf}, // Block 0xa6, offset 0x4f2 {value: 0x0000, lo: 0x02}, {value: 0x0808, lo: 0x80, hi: 0x88}, {value: 0x0040, lo: 0x89, hi: 0xbf}, // Block 0xa7, offset 0x4f5 {value: 0x0000, lo: 0x02}, {value: 0x03dd, lo: 0x80, hi: 0xb2}, {value: 0x0040, lo: 0xb3, hi: 0xbf}, // Block 0xa8, offset 0x4f8 {value: 0x0000, lo: 0x03}, {value: 0x0808, lo: 0x80, hi: 0xb2}, {value: 0x0040, lo: 0xb3, hi: 0xb9}, {value: 0x0818, lo: 0xba, hi: 0xbf}, // Block 0xa9, offset 0x4fc {value: 0x0000, lo: 0x03}, {value: 0x0040, lo: 0x80, hi: 0x9f}, {value: 0x0818, lo: 0xa0, hi: 0xbe}, {value: 0x0040, lo: 0xbf, hi: 0xbf}, // Block 0xaa, offset 0x500 {value: 0x0000, lo: 0x05}, {value: 0x3008, lo: 0x80, hi: 0x80}, {value: 0x3308, lo: 0x81, hi: 0x81}, {value: 0x3008, lo: 0x82, hi: 0x82}, {value: 0x0008, lo: 0x83, hi: 0xb7}, {value: 0x3308, lo: 0xb8, hi: 0xbf}, // Block 0xab, offset 0x506 {value: 0x0000, lo: 0x08}, {value: 0x3308, lo: 0x80, hi: 0x85}, {value: 0x3b08, lo: 0x86, hi: 0x86}, {value: 0x0018, lo: 0x87, hi: 0x8d}, {value: 0x0040, lo: 0x8e, hi: 0x91}, {value: 0x0018, lo: 0x92, hi: 0xa5}, {value: 0x0008, lo: 0xa6, hi: 0xaf}, {value: 0x0040, lo: 0xb0, hi: 0xbe}, {value: 0x3b08, lo: 0xbf, hi: 0xbf}, // Block 0xac, offset 0x50f {value: 0x0000, lo: 0x0b}, {value: 0x3308, lo: 0x80, hi: 0x81}, {value: 0x3008, lo: 0x82, hi: 0x82}, {value: 0x0008, lo: 0x83, hi: 0xaf}, {value: 0x3008, lo: 0xb0, hi: 0xb2}, {value: 0x3308, lo: 0xb3, hi: 0xb6}, {value: 0x3008, lo: 0xb7, hi: 0xb8}, {value: 0x3b08, lo: 0xb9, hi: 0xb9}, {value: 0x3308, lo: 0xba, hi: 0xba}, {value: 0x0018, lo: 0xbb, hi: 0xbc}, {value: 0x0340, lo: 0xbd, hi: 0xbd}, {value: 0x0018, lo: 0xbe, hi: 0xbf}, // Block 0xad, offset 0x51b {value: 0x0000, lo: 0x06}, {value: 0x0018, lo: 0x80, hi: 0x81}, {value: 0x0040, lo: 0x82, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0xa8}, {value: 0x0040, lo: 0xa9, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xb9}, {value: 0x0040, lo: 0xba, hi: 0xbf}, // Block 0xae, offset 0x522 {value: 0x0000, lo: 0x08}, {value: 0x3308, lo: 0x80, hi: 0x82}, {value: 0x0008, lo: 0x83, hi: 0xa6}, {value: 0x3308, lo: 0xa7, hi: 0xab}, {value: 0x3008, lo: 0xac, hi: 0xac}, {value: 0x3308, lo: 0xad, hi: 0xb2}, {value: 0x3b08, lo: 0xb3, hi: 0xb4}, {value: 0x0040, lo: 0xb5, hi: 0xb5}, {value: 0x0008, lo: 0xb6, hi: 0xbf}, // Block 0xaf, offset 0x52b {value: 0x0000, lo: 0x07}, {value: 0x0018, lo: 0x80, hi: 0x83}, {value: 0x0040, lo: 0x84, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0xb2}, {value: 0x3308, lo: 0xb3, hi: 0xb3}, {value: 0x0018, lo: 0xb4, hi: 0xb5}, {value: 0x0008, lo: 0xb6, hi: 0xb6}, {value: 0x0040, lo: 0xb7, hi: 0xbf}, // Block 0xb0, offset 0x533 {value: 0x0000, lo: 0x06}, {value: 0x3308, lo: 0x80, hi: 0x81}, {value: 0x3008, lo: 0x82, hi: 0x82}, {value: 0x0008, lo: 0x83, hi: 0xb2}, {value: 0x3008, lo: 0xb3, hi: 0xb5}, {value: 0x3308, lo: 0xb6, hi: 0xbe}, {value: 0x3008, lo: 0xbf, hi: 0xbf}, // Block 0xb1, offset 0x53a {value: 0x0000, lo: 0x0d}, {value: 0x3808, lo: 0x80, hi: 0x80}, {value: 0x0008, lo: 0x81, hi: 0x84}, {value: 0x0018, lo: 0x85, hi: 0x89}, {value: 0x3308, lo: 0x8a, hi: 0x8c}, {value: 0x0018, lo: 0x8d, hi: 0x8d}, {value: 0x0040, lo: 0x8e, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x9a}, {value: 0x0018, lo: 0x9b, hi: 0x9b}, {value: 0x0008, lo: 0x9c, hi: 0x9c}, {value: 0x0018, lo: 0x9d, hi: 0x9f}, {value: 0x0040, lo: 0xa0, hi: 0xa0}, {value: 0x0018, lo: 0xa1, hi: 0xb4}, {value: 0x0040, lo: 0xb5, hi: 0xbf}, // Block 0xb2, offset 0x548 {value: 0x0000, lo: 0x0c}, {value: 0x0008, lo: 0x80, hi: 0x91}, {value: 0x0040, lo: 0x92, hi: 0x92}, {value: 0x0008, lo: 0x93, hi: 0xab}, {value: 0x3008, lo: 0xac, hi: 0xae}, {value: 0x3308, lo: 0xaf, hi: 0xb1}, {value: 0x3008, lo: 0xb2, hi: 0xb3}, {value: 0x3308, lo: 0xb4, hi: 0xb4}, {value: 0x3808, lo: 0xb5, hi: 0xb5}, {value: 0x3308, lo: 0xb6, hi: 0xb7}, {value: 0x0018, lo: 0xb8, hi: 0xbd}, {value: 0x3308, lo: 0xbe, hi: 0xbe}, {value: 0x0040, lo: 0xbf, hi: 0xbf}, // Block 0xb3, offset 0x555 {value: 0x0000, lo: 0x0c}, {value: 0x0008, lo: 0x80, hi: 0x86}, {value: 0x0040, lo: 0x87, hi: 0x87}, {value: 0x0008, lo: 0x88, hi: 0x88}, {value: 0x0040, lo: 0x89, hi: 0x89}, {value: 0x0008, lo: 0x8a, hi: 0x8d}, {value: 0x0040, lo: 0x8e, hi: 0x8e}, {value: 0x0008, lo: 0x8f, hi: 0x9d}, {value: 0x0040, lo: 0x9e, hi: 0x9e}, {value: 0x0008, lo: 0x9f, hi: 0xa8}, {value: 0x0018, lo: 0xa9, hi: 0xa9}, {value: 0x0040, lo: 0xaa, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xbf}, // Block 0xb4, offset 0x562 {value: 0x0000, lo: 0x08}, {value: 0x0008, lo: 0x80, hi: 0x9e}, {value: 0x3308, lo: 0x9f, hi: 0x9f}, {value: 0x3008, lo: 0xa0, hi: 0xa2}, {value: 0x3308, lo: 0xa3, hi: 0xa9}, {value: 0x3b08, lo: 0xaa, hi: 0xaa}, {value: 0x0040, lo: 0xab, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xb9}, {value: 0x0040, lo: 0xba, hi: 0xbf}, // Block 0xb5, offset 0x56b {value: 0x0000, lo: 0x03}, {value: 0x0008, lo: 0x80, hi: 0xb4}, {value: 0x3008, lo: 0xb5, hi: 0xb7}, {value: 0x3308, lo: 0xb8, hi: 0xbf}, // Block 0xb6, offset 0x56f {value: 0x0000, lo: 0x0d}, {value: 0x3008, lo: 0x80, hi: 0x81}, {value: 0x3b08, lo: 0x82, hi: 0x82}, {value: 0x3308, lo: 0x83, hi: 0x84}, {value: 0x3008, lo: 0x85, hi: 0x85}, {value: 0x3308, lo: 0x86, hi: 0x86}, {value: 0x0008, lo: 0x87, hi: 0x8a}, {value: 0x0018, lo: 0x8b, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x99}, {value: 0x0040, lo: 0x9a, hi: 0x9a}, {value: 0x0018, lo: 0x9b, hi: 0x9b}, {value: 0x0040, lo: 0x9c, hi: 0x9c}, {value: 0x0018, lo: 0x9d, hi: 0x9d}, {value: 0x0040, lo: 0x9e, hi: 0xbf}, // Block 0xb7, offset 0x57d {value: 0x0000, lo: 0x07}, {value: 0x0008, lo: 0x80, hi: 0xaf}, {value: 0x3008, lo: 0xb0, hi: 0xb2}, {value: 0x3308, lo: 0xb3, hi: 0xb8}, {value: 0x3008, lo: 0xb9, hi: 0xb9}, {value: 0x3308, lo: 0xba, hi: 0xba}, {value: 0x3008, lo: 0xbb, hi: 0xbe}, {value: 0x3308, lo: 0xbf, hi: 0xbf}, // Block 0xb8, offset 0x585 {value: 0x0000, lo: 0x0a}, {value: 0x3308, lo: 0x80, hi: 0x80}, {value: 0x3008, lo: 0x81, hi: 0x81}, {value: 0x3b08, lo: 0x82, hi: 0x82}, {value: 0x3308, lo: 0x83, hi: 0x83}, {value: 0x0008, lo: 0x84, hi: 0x85}, {value: 0x0018, lo: 0x86, hi: 0x86}, {value: 0x0008, lo: 0x87, hi: 0x87}, {value: 0x0040, lo: 0x88, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x99}, {value: 0x0040, lo: 0x9a, hi: 0xbf}, // Block 0xb9, offset 0x590 {value: 0x0000, lo: 0x08}, {value: 0x0008, lo: 0x80, hi: 0xae}, {value: 0x3008, lo: 0xaf, hi: 0xb1}, {value: 0x3308, lo: 0xb2, hi: 0xb5}, {value: 0x0040, lo: 0xb6, hi: 0xb7}, {value: 0x3008, lo: 0xb8, hi: 0xbb}, {value: 0x3308, lo: 0xbc, hi: 0xbd}, {value: 0x3008, lo: 0xbe, hi: 0xbe}, {value: 0x3b08, lo: 0xbf, hi: 0xbf}, // Block 0xba, offset 0x599 {value: 0x0000, lo: 0x05}, {value: 0x3308, lo: 0x80, hi: 0x80}, {value: 0x0018, lo: 0x81, hi: 0x97}, {value: 0x0008, lo: 0x98, hi: 0x9b}, {value: 0x3308, lo: 0x9c, hi: 0x9d}, {value: 0x0040, lo: 0x9e, hi: 0xbf}, // Block 0xbb, offset 0x59f {value: 0x0000, lo: 0x07}, {value: 0x0008, lo: 0x80, hi: 0xaf}, {value: 0x3008, lo: 0xb0, hi: 0xb2}, {value: 0x3308, lo: 0xb3, hi: 0xba}, {value: 0x3008, lo: 0xbb, hi: 0xbc}, {value: 0x3308, lo: 0xbd, hi: 0xbd}, {value: 0x3008, lo: 0xbe, hi: 0xbe}, {value: 0x3b08, lo: 0xbf, hi: 0xbf}, // Block 0xbc, offset 0x5a7 {value: 0x0000, lo: 0x08}, {value: 0x3308, lo: 0x80, hi: 0x80}, {value: 0x0018, lo: 0x81, hi: 0x83}, {value: 0x0008, lo: 0x84, hi: 0x84}, {value: 0x0040, lo: 0x85, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x99}, {value: 0x0040, lo: 0x9a, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xac}, {value: 0x0040, lo: 0xad, hi: 0xbf}, // Block 0xbd, offset 0x5b0 {value: 0x0000, lo: 0x09}, {value: 0x0008, lo: 0x80, hi: 0xaa}, {value: 0x3308, lo: 0xab, hi: 0xab}, {value: 0x3008, lo: 0xac, hi: 0xac}, {value: 0x3308, lo: 0xad, hi: 0xad}, {value: 0x3008, lo: 0xae, hi: 0xaf}, {value: 0x3308, lo: 0xb0, hi: 0xb5}, {value: 0x3808, lo: 0xb6, hi: 0xb6}, {value: 0x3308, lo: 0xb7, hi: 0xb7}, {value: 0x0040, lo: 0xb8, hi: 0xbf}, // Block 0xbe, offset 0x5ba {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0x89}, {value: 0x0040, lo: 0x8a, hi: 0xbf}, // Block 0xbf, offset 0x5bd {value: 0x0000, lo: 0x0b}, {value: 0x0008, lo: 0x80, hi: 0x99}, {value: 0x0040, lo: 0x9a, hi: 0x9c}, {value: 0x3308, lo: 0x9d, hi: 0x9f}, {value: 0x3008, lo: 0xa0, hi: 0xa1}, {value: 0x3308, lo: 0xa2, hi: 0xa5}, {value: 0x3008, lo: 0xa6, hi: 0xa6}, {value: 0x3308, lo: 0xa7, hi: 0xaa}, {value: 0x3b08, lo: 0xab, hi: 0xab}, {value: 0x0040, lo: 0xac, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xb9}, {value: 0x0018, lo: 0xba, hi: 0xbf}, // Block 0xc0, offset 0x5c9 {value: 0x0000, lo: 0x02}, {value: 0x0040, lo: 0x80, hi: 0x9f}, {value: 0x049d, lo: 0xa0, hi: 0xbf}, // Block 0xc1, offset 0x5cc {value: 0x0000, lo: 0x04}, {value: 0x0008, lo: 0x80, hi: 0xa9}, {value: 0x0018, lo: 0xaa, hi: 0xb2}, {value: 0x0040, lo: 0xb3, hi: 0xbe}, {value: 0x0008, lo: 0xbf, hi: 0xbf}, // Block 0xc2, offset 0x5d1 {value: 0x0000, lo: 0x0c}, {value: 0x0008, lo: 0x80, hi: 0x80}, {value: 0x3308, lo: 0x81, hi: 0x86}, {value: 0x3008, lo: 0x87, hi: 0x88}, {value: 0x3308, lo: 0x89, hi: 0x8a}, {value: 0x0008, lo: 0x8b, hi: 0xb2}, {value: 0x3308, lo: 0xb3, hi: 0xb3}, {value: 0x3b08, lo: 0xb4, hi: 0xb4}, {value: 0x3308, lo: 0xb5, hi: 0xb8}, {value: 0x3008, lo: 0xb9, hi: 0xb9}, {value: 0x0008, lo: 0xba, hi: 0xba}, {value: 0x3308, lo: 0xbb, hi: 0xbe}, {value: 0x0018, lo: 0xbf, hi: 0xbf}, // Block 0xc3, offset 0x5de {value: 0x0000, lo: 0x08}, {value: 0x0018, lo: 0x80, hi: 0x86}, {value: 0x3b08, lo: 0x87, hi: 0x87}, {value: 0x0040, lo: 0x88, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x90}, {value: 0x3308, lo: 0x91, hi: 0x96}, {value: 0x3008, lo: 0x97, hi: 0x98}, {value: 0x3308, lo: 0x99, hi: 0x9b}, {value: 0x0008, lo: 0x9c, hi: 0xbf}, // Block 0xc4, offset 0x5e7 {value: 0x0000, lo: 0x0b}, {value: 0x0008, lo: 0x80, hi: 0x83}, {value: 0x0040, lo: 0x84, hi: 0x85}, {value: 0x0008, lo: 0x86, hi: 0x89}, {value: 0x3308, lo: 0x8a, hi: 0x96}, {value: 0x3008, lo: 0x97, hi: 0x97}, {value: 0x3308, lo: 0x98, hi: 0x98}, {value: 0x3b08, lo: 0x99, hi: 0x99}, {value: 0x0018, lo: 0x9a, hi: 0x9c}, {value: 0x0040, lo: 0x9d, hi: 0x9d}, {value: 0x0018, lo: 0x9e, hi: 0xa2}, {value: 0x0040, lo: 0xa3, hi: 0xbf}, // Block 0xc5, offset 0x5f3 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xb8}, {value: 0x0040, lo: 0xb9, hi: 0xbf}, // Block 0xc6, offset 0x5f6 {value: 0x0000, lo: 0x09}, {value: 0x0008, lo: 0x80, hi: 0x88}, {value: 0x0040, lo: 0x89, hi: 0x89}, {value: 0x0008, lo: 0x8a, hi: 0xae}, {value: 0x3008, lo: 0xaf, hi: 0xaf}, {value: 0x3308, lo: 0xb0, hi: 0xb6}, {value: 0x0040, lo: 0xb7, hi: 0xb7}, {value: 0x3308, lo: 0xb8, hi: 0xbd}, {value: 0x3008, lo: 0xbe, hi: 0xbe}, {value: 0x3b08, lo: 0xbf, hi: 0xbf}, // Block 0xc7, offset 0x600 {value: 0x0000, lo: 0x08}, {value: 0x0008, lo: 0x80, hi: 0x80}, {value: 0x0018, lo: 0x81, hi: 0x85}, {value: 0x0040, lo: 0x86, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x99}, {value: 0x0018, lo: 0x9a, hi: 0xac}, {value: 0x0040, lo: 0xad, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xb1}, {value: 0x0008, lo: 0xb2, hi: 0xbf}, // Block 0xc8, offset 0x609 {value: 0x0000, lo: 0x0b}, {value: 0x0008, lo: 0x80, hi: 0x8f}, {value: 0x0040, lo: 0x90, hi: 0x91}, {value: 0x3308, lo: 0x92, hi: 0xa7}, {value: 0x0040, lo: 0xa8, hi: 0xa8}, {value: 0x3008, lo: 0xa9, hi: 0xa9}, {value: 0x3308, lo: 0xaa, hi: 0xb0}, {value: 0x3008, lo: 0xb1, hi: 0xb1}, {value: 0x3308, lo: 0xb2, hi: 0xb3}, {value: 0x3008, lo: 0xb4, hi: 0xb4}, {value: 0x3308, lo: 0xb5, hi: 0xb6}, {value: 0x0040, lo: 0xb7, hi: 0xbf}, // Block 0xc9, offset 0x615 {value: 0x0000, lo: 0x0c}, {value: 0x0008, lo: 0x80, hi: 0x86}, {value: 0x0040, lo: 0x87, hi: 0x87}, {value: 0x0008, lo: 0x88, hi: 0x89}, {value: 0x0040, lo: 0x8a, hi: 0x8a}, {value: 0x0008, lo: 0x8b, hi: 0xb0}, {value: 0x3308, lo: 0xb1, hi: 0xb6}, {value: 0x0040, lo: 0xb7, hi: 0xb9}, {value: 0x3308, lo: 0xba, hi: 0xba}, {value: 0x0040, lo: 0xbb, hi: 0xbb}, {value: 0x3308, lo: 0xbc, hi: 0xbd}, {value: 0x0040, lo: 0xbe, hi: 0xbe}, {value: 0x3308, lo: 0xbf, hi: 0xbf}, // Block 0xca, offset 0x622 {value: 0x0000, lo: 0x07}, {value: 0x3308, lo: 0x80, hi: 0x83}, {value: 0x3b08, lo: 0x84, hi: 0x85}, {value: 0x0008, lo: 0x86, hi: 0x86}, {value: 0x3308, lo: 0x87, hi: 0x87}, {value: 0x0040, lo: 0x88, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x99}, {value: 0x0040, lo: 0x9a, hi: 0xbf}, // Block 0xcb, offset 0x62a {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0x99}, {value: 0x0040, lo: 0x9a, hi: 0xbf}, // Block 0xcc, offset 0x62d {value: 0x0000, lo: 0x04}, {value: 0x0018, lo: 0x80, hi: 0xae}, {value: 0x0040, lo: 0xaf, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xb4}, {value: 0x0040, lo: 0xb5, hi: 0xbf}, // Block 0xcd, offset 0x632 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0x83}, {value: 0x0040, lo: 0x84, hi: 0xbf}, // Block 0xce, offset 0x635 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xae}, {value: 0x0040, lo: 0xaf, hi: 0xbf}, // Block 0xcf, offset 0x638 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0x86}, {value: 0x0040, lo: 0x87, hi: 0xbf}, // Block 0xd0, offset 0x63b {value: 0x0000, lo: 0x06}, {value: 0x0008, lo: 0x80, hi: 0x9e}, {value: 0x0040, lo: 0x9f, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xa9}, {value: 0x0040, lo: 0xaa, hi: 0xad}, {value: 0x0018, lo: 0xae, hi: 0xaf}, {value: 0x0040, lo: 0xb0, hi: 0xbf}, // Block 0xd1, offset 0x642 {value: 0x0000, lo: 0x06}, {value: 0x0040, lo: 0x80, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0xad}, {value: 0x0040, lo: 0xae, hi: 0xaf}, {value: 0x3308, lo: 0xb0, hi: 0xb4}, {value: 0x0018, lo: 0xb5, hi: 0xb5}, {value: 0x0040, lo: 0xb6, hi: 0xbf}, // Block 0xd2, offset 0x649 {value: 0x0000, lo: 0x03}, {value: 0x0008, lo: 0x80, hi: 0xaf}, {value: 0x3308, lo: 0xb0, hi: 0xb6}, {value: 0x0018, lo: 0xb7, hi: 0xbf}, // Block 0xd3, offset 0x64d {value: 0x0000, lo: 0x0a}, {value: 0x0008, lo: 0x80, hi: 0x83}, {value: 0x0018, lo: 0x84, hi: 0x85}, {value: 0x0040, lo: 0x86, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x99}, {value: 0x0040, lo: 0x9a, hi: 0x9a}, {value: 0x0018, lo: 0x9b, hi: 0xa1}, {value: 0x0040, lo: 0xa2, hi: 0xa2}, {value: 0x0008, lo: 0xa3, hi: 0xb7}, {value: 0x0040, lo: 0xb8, hi: 0xbc}, {value: 0x0008, lo: 0xbd, hi: 0xbf}, // Block 0xd4, offset 0x658 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0x8f}, {value: 0x0040, lo: 0x90, hi: 0xbf}, // Block 0xd5, offset 0x65b {value: 0x0000, lo: 0x05}, {value: 0x0008, lo: 0x80, hi: 0x84}, {value: 0x0040, lo: 0x85, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x90}, {value: 0x3008, lo: 0x91, hi: 0xbe}, {value: 0x0040, lo: 0xbf, hi: 0xbf}, // Block 0xd6, offset 0x661 {value: 0x0000, lo: 0x04}, {value: 0x0040, lo: 0x80, hi: 0x8e}, {value: 0x3308, lo: 0x8f, hi: 0x92}, {value: 0x0008, lo: 0x93, hi: 0x9f}, {value: 0x0040, lo: 0xa0, hi: 0xbf}, // Block 0xd7, offset 0x666 {value: 0x0000, lo: 0x03}, {value: 0x0040, lo: 0x80, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xa1}, {value: 0x0040, lo: 0xa2, hi: 0xbf}, // Block 0xd8, offset 0x66a {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xac}, {value: 0x0040, lo: 0xad, hi: 0xbf}, // Block 0xd9, offset 0x66d {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xb2}, {value: 0x0040, lo: 0xb3, hi: 0xbf}, // Block 0xda, offset 0x670 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0x9e}, {value: 0x0040, lo: 0x9f, hi: 0xbf}, // Block 0xdb, offset 0x673 {value: 0x0000, lo: 0x02}, {value: 0x0040, lo: 0x80, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xbf}, // Block 0xdc, offset 0x676 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xbb}, {value: 0x0040, lo: 0xbc, hi: 0xbf}, // Block 0xdd, offset 0x679 {value: 0x0000, lo: 0x04}, {value: 0x0008, lo: 0x80, hi: 0xaa}, {value: 0x0040, lo: 0xab, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xbc}, {value: 0x0040, lo: 0xbd, hi: 0xbf}, // Block 0xde, offset 0x67e {value: 0x0000, lo: 0x09}, {value: 0x0008, lo: 0x80, hi: 0x88}, {value: 0x0040, lo: 0x89, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x99}, {value: 0x0040, lo: 0x9a, hi: 0x9b}, {value: 0x0018, lo: 0x9c, hi: 0x9c}, {value: 0x3308, lo: 0x9d, hi: 0x9e}, {value: 0x0018, lo: 0x9f, hi: 0x9f}, {value: 0x03c0, lo: 0xa0, hi: 0xa3}, {value: 0x0040, lo: 0xa4, hi: 0xbf}, // Block 0xdf, offset 0x688 {value: 0x0000, lo: 0x02}, {value: 0x0018, lo: 0x80, hi: 0xb5}, {value: 0x0040, lo: 0xb6, hi: 0xbf}, // Block 0xe0, offset 0x68b {value: 0x0000, lo: 0x03}, {value: 0x0018, lo: 0x80, hi: 0xa6}, {value: 0x0040, lo: 0xa7, hi: 0xa8}, {value: 0x0018, lo: 0xa9, hi: 0xbf}, // Block 0xe1, offset 0x68f {value: 0x0000, lo: 0x0e}, {value: 0x0018, lo: 0x80, hi: 0x9d}, {value: 0xb5b9, lo: 0x9e, hi: 0x9e}, {value: 0xb601, lo: 0x9f, hi: 0x9f}, {value: 0xb649, lo: 0xa0, hi: 0xa0}, {value: 0xb6b1, lo: 0xa1, hi: 0xa1}, {value: 0xb719, lo: 0xa2, hi: 0xa2}, {value: 0xb781, lo: 0xa3, hi: 0xa3}, {value: 0xb7e9, lo: 0xa4, hi: 0xa4}, {value: 0x3018, lo: 0xa5, hi: 0xa6}, {value: 0x3318, lo: 0xa7, hi: 0xa9}, {value: 0x0018, lo: 0xaa, hi: 0xac}, {value: 0x3018, lo: 0xad, hi: 0xb2}, {value: 0x0340, lo: 0xb3, hi: 0xba}, {value: 0x3318, lo: 0xbb, hi: 0xbf}, // Block 0xe2, offset 0x69e {value: 0x0000, lo: 0x0b}, {value: 0x3318, lo: 0x80, hi: 0x82}, {value: 0x0018, lo: 0x83, hi: 0x84}, {value: 0x3318, lo: 0x85, hi: 0x8b}, {value: 0x0018, lo: 0x8c, hi: 0xa9}, {value: 0x3318, lo: 0xaa, hi: 0xad}, {value: 0x0018, lo: 0xae, hi: 0xba}, {value: 0xb851, lo: 0xbb, hi: 0xbb}, {value: 0xb899, lo: 0xbc, hi: 0xbc}, {value: 0xb8e1, lo: 0xbd, hi: 0xbd}, {value: 0xb949, lo: 0xbe, hi: 0xbe}, {value: 0xb9b1, lo: 0xbf, hi: 0xbf}, // Block 0xe3, offset 0x6aa {value: 0x0000, lo: 0x03}, {value: 0xba19, lo: 0x80, hi: 0x80}, {value: 0x0018, lo: 0x81, hi: 0xa8}, {value: 0x0040, lo: 0xa9, hi: 0xbf}, // Block 0xe4, offset 0x6ae {value: 0x0000, lo: 0x04}, {value: 0x0018, lo: 0x80, hi: 0x81}, {value: 0x3318, lo: 0x82, hi: 0x84}, {value: 0x0018, lo: 0x85, hi: 0x85}, {value: 0x0040, lo: 0x86, hi: 0xbf}, // Block 0xe5, offset 0x6b3 {value: 0x0000, lo: 0x04}, {value: 0x0018, lo: 0x80, hi: 0x96}, {value: 0x0040, lo: 0x97, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xb1}, {value: 0x0040, lo: 0xb2, hi: 0xbf}, // Block 0xe6, offset 0x6b8 {value: 0x0000, lo: 0x03}, {value: 0x3308, lo: 0x80, hi: 0xb6}, {value: 0x0018, lo: 0xb7, hi: 0xba}, {value: 0x3308, lo: 0xbb, hi: 0xbf}, // Block 0xe7, offset 0x6bc {value: 0x0000, lo: 0x04}, {value: 0x3308, lo: 0x80, hi: 0xac}, {value: 0x0018, lo: 0xad, hi: 0xb4}, {value: 0x3308, lo: 0xb5, hi: 0xb5}, {value: 0x0018, lo: 0xb6, hi: 0xbf}, // Block 0xe8, offset 0x6c1 {value: 0x0000, lo: 0x08}, {value: 0x0018, lo: 0x80, hi: 0x83}, {value: 0x3308, lo: 0x84, hi: 0x84}, {value: 0x0018, lo: 0x85, hi: 0x8b}, {value: 0x0040, lo: 0x8c, hi: 0x9a}, {value: 0x3308, lo: 0x9b, hi: 0x9f}, {value: 0x0040, lo: 0xa0, hi: 0xa0}, {value: 0x3308, lo: 0xa1, hi: 0xaf}, {value: 0x0040, lo: 0xb0, hi: 0xbf}, // Block 0xe9, offset 0x6ca {value: 0x0000, lo: 0x0a}, {value: 0x3308, lo: 0x80, hi: 0x86}, {value: 0x0040, lo: 0x87, hi: 0x87}, {value: 0x3308, lo: 0x88, hi: 0x98}, {value: 0x0040, lo: 0x99, hi: 0x9a}, {value: 0x3308, lo: 0x9b, hi: 0xa1}, {value: 0x0040, lo: 0xa2, hi: 0xa2}, {value: 0x3308, lo: 0xa3, hi: 0xa4}, {value: 0x0040, lo: 0xa5, hi: 0xa5}, {value: 0x3308, lo: 0xa6, hi: 0xaa}, {value: 0x0040, lo: 0xab, hi: 0xbf}, // Block 0xea, offset 0x6d5 {value: 0x0000, lo: 0x05}, {value: 0x0808, lo: 0x80, hi: 0x84}, {value: 0x0040, lo: 0x85, hi: 0x86}, {value: 0x0818, lo: 0x87, hi: 0x8f}, {value: 0x3308, lo: 0x90, hi: 0x96}, {value: 0x0040, lo: 0x97, hi: 0xbf}, // Block 0xeb, offset 0x6db {value: 0x0000, lo: 0x07}, {value: 0x0a08, lo: 0x80, hi: 0x83}, {value: 0x3308, lo: 0x84, hi: 0x8a}, {value: 0x0040, lo: 0x8b, hi: 0x8f}, {value: 0x0808, lo: 0x90, hi: 0x99}, {value: 0x0040, lo: 0x9a, hi: 0x9d}, {value: 0x0818, lo: 0x9e, hi: 0x9f}, {value: 0x0040, lo: 0xa0, hi: 0xbf}, // Block 0xec, offset 0x6e3 {value: 0x0000, lo: 0x03}, {value: 0x0040, lo: 0x80, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xb1}, {value: 0x0040, lo: 0xb2, hi: 0xbf}, // Block 0xed, offset 0x6e7 {value: 0x0000, lo: 0x03}, {value: 0x0018, lo: 0x80, hi: 0xab}, {value: 0x0040, lo: 0xac, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xbf}, // Block 0xee, offset 0x6eb {value: 0x0000, lo: 0x05}, {value: 0x0018, lo: 0x80, hi: 0x93}, {value: 0x0040, lo: 0x94, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xae}, {value: 0x0040, lo: 0xaf, hi: 0xb0}, {value: 0x0018, lo: 0xb1, hi: 0xbf}, // Block 0xef, offset 0x6f1 {value: 0x0000, lo: 0x05}, {value: 0x0040, lo: 0x80, hi: 0x80}, {value: 0x0018, lo: 0x81, hi: 0x8f}, {value: 0x0040, lo: 0x90, hi: 0x90}, {value: 0x0018, lo: 0x91, hi: 0xb5}, {value: 0x0040, lo: 0xb6, hi: 0xbf}, // Block 0xf0, offset 0x6f7 {value: 0x0000, lo: 0x04}, {value: 0x0018, lo: 0x80, hi: 0x8f}, {value: 0xc1c1, lo: 0x90, hi: 0x90}, {value: 0x0018, lo: 0x91, hi: 0xac}, {value: 0x0040, lo: 0xad, hi: 0xbf}, // Block 0xf1, offset 0x6fc {value: 0x0000, lo: 0x02}, {value: 0x0040, lo: 0x80, hi: 0xa5}, {value: 0x0018, lo: 0xa6, hi: 0xbf}, // Block 0xf2, offset 0x6ff {value: 0x0000, lo: 0x0f}, {value: 0xc7e9, lo: 0x80, hi: 0x80}, {value: 0xc839, lo: 0x81, hi: 0x81}, {value: 0xc889, lo: 0x82, hi: 0x82}, {value: 0xc8d9, lo: 0x83, hi: 0x83}, {value: 0xc929, lo: 0x84, hi: 0x84}, {value: 0xc979, lo: 0x85, hi: 0x85}, {value: 0xc9c9, lo: 0x86, hi: 0x86}, {value: 0xca19, lo: 0x87, hi: 0x87}, {value: 0xca69, lo: 0x88, hi: 0x88}, {value: 0x0040, lo: 0x89, hi: 0x8f}, {value: 0xcab9, lo: 0x90, hi: 0x90}, {value: 0xcad9, lo: 0x91, hi: 0x91}, {value: 0x0040, lo: 0x92, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xa5}, {value: 0x0040, lo: 0xa6, hi: 0xbf}, // Block 0xf3, offset 0x70f {value: 0x0000, lo: 0x06}, {value: 0x0018, lo: 0x80, hi: 0x94}, {value: 0x0040, lo: 0x95, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xac}, {value: 0x0040, lo: 0xad, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xb8}, {value: 0x0040, lo: 0xb9, hi: 0xbf}, // Block 0xf4, offset 0x716 {value: 0x0000, lo: 0x02}, {value: 0x0018, lo: 0x80, hi: 0xb3}, {value: 0x0040, lo: 0xb4, hi: 0xbf}, // Block 0xf5, offset 0x719 {value: 0x0000, lo: 0x02}, {value: 0x0018, lo: 0x80, hi: 0x94}, {value: 0x0040, lo: 0x95, hi: 0xbf}, // Block 0xf6, offset 0x71c {value: 0x0000, lo: 0x03}, {value: 0x0018, lo: 0x80, hi: 0x8b}, {value: 0x0040, lo: 0x8c, hi: 0x8f}, {value: 0x0018, lo: 0x90, hi: 0xbf}, // Block 0xf7, offset 0x720 {value: 0x0000, lo: 0x05}, {value: 0x0018, lo: 0x80, hi: 0x87}, {value: 0x0040, lo: 0x88, hi: 0x8f}, {value: 0x0018, lo: 0x90, hi: 0x99}, {value: 0x0040, lo: 0x9a, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xbf}, // Block 0xf8, offset 0x726 {value: 0x0000, lo: 0x04}, {value: 0x0018, lo: 0x80, hi: 0x87}, {value: 0x0040, lo: 0x88, hi: 0x8f}, {value: 0x0018, lo: 0x90, hi: 0xad}, {value: 0x0040, lo: 0xae, hi: 0xbf}, // Block 0xf9, offset 0x72b {value: 0x0000, lo: 0x04}, {value: 0x0018, lo: 0x80, hi: 0x8b}, {value: 0x0040, lo: 0x8c, hi: 0x8f}, {value: 0x0018, lo: 0x90, hi: 0xbe}, {value: 0x0040, lo: 0xbf, hi: 0xbf}, // Block 0xfa, offset 0x730 {value: 0x0000, lo: 0x04}, {value: 0x0018, lo: 0x80, hi: 0x8c}, {value: 0x0040, lo: 0x8d, hi: 0x8f}, {value: 0x0018, lo: 0x90, hi: 0xab}, {value: 0x0040, lo: 0xac, hi: 0xbf}, // Block 0xfb, offset 0x735 {value: 0x0000, lo: 0x02}, {value: 0x0018, lo: 0x80, hi: 0x97}, {value: 0x0040, lo: 0x98, hi: 0xbf}, // Block 0xfc, offset 0x738 {value: 0x0000, lo: 0x04}, {value: 0x0018, lo: 0x80, hi: 0x80}, {value: 0x0040, lo: 0x81, hi: 0x8f}, {value: 0x0018, lo: 0x90, hi: 0xa6}, {value: 0x0040, lo: 0xa7, hi: 0xbf}, // Block 0xfd, offset 0x73d {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0x96}, {value: 0x0040, lo: 0x97, hi: 0xbf}, // Block 0xfe, offset 0x740 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xb4}, {value: 0x0040, lo: 0xb5, hi: 0xbf}, // Block 0xff, offset 0x743 {value: 0x0000, lo: 0x03}, {value: 0x0008, lo: 0x80, hi: 0x9d}, {value: 0x0040, lo: 0x9e, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xbf}, // Block 0x100, offset 0x747 {value: 0x0000, lo: 0x03}, {value: 0x0008, lo: 0x80, hi: 0xa1}, {value: 0x0040, lo: 0xa2, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xbf}, // Block 0x101, offset 0x74b {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xa0}, {value: 0x0040, lo: 0xa1, hi: 0xbf}, // Block 0x102, offset 0x74e {value: 0x0020, lo: 0x0f}, {value: 0xdeb9, lo: 0x80, hi: 0x89}, {value: 0x8dfd, lo: 0x8a, hi: 0x8a}, {value: 0xdff9, lo: 0x8b, hi: 0x9c}, {value: 0x8e1d, lo: 0x9d, hi: 0x9d}, {value: 0xe239, lo: 0x9e, hi: 0xa2}, {value: 0x8e3d, lo: 0xa3, hi: 0xa3}, {value: 0xe2d9, lo: 0xa4, hi: 0xab}, {value: 0x7ed5, lo: 0xac, hi: 0xac}, {value: 0xe3d9, lo: 0xad, hi: 0xaf}, {value: 0x8e5d, lo: 0xb0, hi: 0xb0}, {value: 0xe439, lo: 0xb1, hi: 0xb6}, {value: 0x8e7d, lo: 0xb7, hi: 0xb9}, {value: 0xe4f9, lo: 0xba, hi: 0xba}, {value: 0x8edd, lo: 0xbb, hi: 0xbb}, {value: 0xe519, lo: 0xbc, hi: 0xbf}, // Block 0x103, offset 0x75e {value: 0x0020, lo: 0x10}, {value: 0x937d, lo: 0x80, hi: 0x80}, {value: 0xf099, lo: 0x81, hi: 0x86}, {value: 0x939d, lo: 0x87, hi: 0x8a}, {value: 0xd9f9, lo: 0x8b, hi: 0x8b}, {value: 0xf159, lo: 0x8c, hi: 0x96}, {value: 0x941d, lo: 0x97, hi: 0x97}, {value: 0xf2b9, lo: 0x98, hi: 0xa3}, {value: 0x943d, lo: 0xa4, hi: 0xa6}, {value: 0xf439, lo: 0xa7, hi: 0xaa}, {value: 0x949d, lo: 0xab, hi: 0xab}, {value: 0xf4b9, lo: 0xac, hi: 0xac}, {value: 0x94bd, lo: 0xad, hi: 0xad}, {value: 0xf4d9, lo: 0xae, hi: 0xaf}, {value: 0x94dd, lo: 0xb0, hi: 0xb1}, {value: 0xf519, lo: 0xb2, hi: 0xbe}, {value: 0x2040, lo: 0xbf, hi: 0xbf}, // Block 0x104, offset 0x76f {value: 0x0000, lo: 0x04}, {value: 0x0040, lo: 0x80, hi: 0x80}, {value: 0x0340, lo: 0x81, hi: 0x81}, {value: 0x0040, lo: 0x82, hi: 0x9f}, {value: 0x0340, lo: 0xa0, hi: 0xbf}, // Block 0x105, offset 0x774 {value: 0x0000, lo: 0x01}, {value: 0x0340, lo: 0x80, hi: 0xbf}, // Block 0x106, offset 0x776 {value: 0x0000, lo: 0x01}, {value: 0x33c0, lo: 0x80, hi: 0xbf}, // Block 0x107, offset 0x778 {value: 0x0000, lo: 0x02}, {value: 0x33c0, lo: 0x80, hi: 0xaf}, {value: 0x0040, lo: 0xb0, hi: 0xbf}, } // Total table size 42115 bytes (41KiB); checksum: F4A1FA4E ================================================ FILE: vendor/golang.org/x/net/idna/trie.go ================================================ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. // Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package idna // appendMapping appends the mapping for the respective rune. isMapped must be // true. A mapping is a categorization of a rune as defined in UTS #46. func (c info) appendMapping(b []byte, s string) []byte { index := int(c >> indexShift) if c&xorBit == 0 { s := mappings[index:] return append(b, s[1:s[0]+1]...) } b = append(b, s...) if c&inlineXOR == inlineXOR { // TODO: support and handle two-byte inline masks b[len(b)-1] ^= byte(index) } else { for p := len(b) - int(xorData[index]); p < len(b); p++ { index++ b[p] ^= xorData[index] } } return b } // Sparse block handling code. type valueRange struct { value uint16 // header: value:stride lo, hi byte // header: lo:n } type sparseBlocks struct { values []valueRange offset []uint16 } var idnaSparse = sparseBlocks{ values: idnaSparseValues[:], offset: idnaSparseOffset[:], } // Don't use newIdnaTrie to avoid unconditional linking in of the table. var trie = &idnaTrie{} // lookup determines the type of block n and looks up the value for b. // For n < t.cutoff, the block is a simple lookup table. Otherwise, the block // is a list of ranges with an accompanying value. Given a matching range r, // the value for b is by r.value + (b - r.lo) * stride. func (t *sparseBlocks) lookup(n uint32, b byte) uint16 { offset := t.offset[n] header := t.values[offset] lo := offset + 1 hi := lo + uint16(header.lo) for lo < hi { m := lo + (hi-lo)/2 r := t.values[m] if r.lo <= b && b <= r.hi { return r.value + uint16(b-r.lo)*header.value } if b < r.lo { hi = m } else { lo = m + 1 } } return 0 } ================================================ FILE: vendor/golang.org/x/net/idna/trieval.go ================================================ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. package idna // This file contains definitions for interpreting the trie value of the idna // trie generated by "go run gen*.go". It is shared by both the generator // program and the resultant package. Sharing is achieved by the generator // copying gen_trieval.go to trieval.go and changing what's above this comment. // info holds information from the IDNA mapping table for a single rune. It is // the value returned by a trie lookup. In most cases, all information fits in // a 16-bit value. For mappings, this value may contain an index into a slice // with the mapped string. Such mappings can consist of the actual mapped value // or an XOR pattern to be applied to the bytes of the UTF8 encoding of the // input rune. This technique is used by the cases packages and reduces the // table size significantly. // // The per-rune values have the following format: // // if mapped { // if inlinedXOR { // 15..13 inline XOR marker // 12..11 unused // 10..3 inline XOR mask // } else { // 15..3 index into xor or mapping table // } // } else { // 15..14 unused // 13 mayNeedNorm // 12..11 attributes // 10..8 joining type // 7..3 category type // } // 2 use xor pattern // 1..0 mapped category // // See the definitions below for a more detailed description of the various // bits. type info uint16 const ( catSmallMask = 0x3 catBigMask = 0xF8 indexShift = 3 xorBit = 0x4 // interpret the index as an xor pattern inlineXOR = 0xE000 // These bits are set if the XOR pattern is inlined. joinShift = 8 joinMask = 0x07 // Attributes attributesMask = 0x1800 viramaModifier = 0x1800 modifier = 0x1000 rtl = 0x0800 mayNeedNorm = 0x2000 ) // A category corresponds to a category defined in the IDNA mapping table. type category uint16 const ( unknown category = 0 // not currently defined in unicode. mapped category = 1 disallowedSTD3Mapped category = 2 deviation category = 3 ) const ( valid category = 0x08 validNV8 category = 0x18 validXV8 category = 0x28 disallowed category = 0x40 disallowedSTD3Valid category = 0x80 ignored category = 0xC0 ) // join types and additional rune information const ( joiningL = (iota + 1) joiningD joiningT joiningR //the following types are derived during processing joinZWJ joinZWNJ joinVirama numJoinTypes ) func (c info) isMapped() bool { return c&0x3 != 0 } func (c info) category() category { small := c & catSmallMask if small != 0 { return category(small) } return category(c & catBigMask) } func (c info) joinType() info { if c.isMapped() { return 0 } return (c >> joinShift) & joinMask } func (c info) isModifier() bool { return c&(modifier|catSmallMask) == modifier } func (c info) isViramaModifier() bool { return c&(attributesMask|catSmallMask) == viramaModifier } ================================================ FILE: vendor/golang.org/x/net/websocket/client.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package websocket import ( "bufio" "io" "net" "net/http" "net/url" ) // DialError is an error that occurs while dialling a websocket server. type DialError struct { *Config Err error } func (e *DialError) Error() string { return "websocket.Dial " + e.Config.Location.String() + ": " + e.Err.Error() } // NewConfig creates a new WebSocket config for client connection. func NewConfig(server, origin string) (config *Config, err error) { config = new(Config) config.Version = ProtocolVersionHybi13 config.Location, err = url.ParseRequestURI(server) if err != nil { return } config.Origin, err = url.ParseRequestURI(origin) if err != nil { return } config.Header = http.Header(make(map[string][]string)) return } // NewClient creates a new WebSocket client connection over rwc. func NewClient(config *Config, rwc io.ReadWriteCloser) (ws *Conn, err error) { br := bufio.NewReader(rwc) bw := bufio.NewWriter(rwc) err = hybiClientHandshake(config, br, bw) if err != nil { return } buf := bufio.NewReadWriter(br, bw) ws = newHybiClientConn(config, buf, rwc) return } // Dial opens a new client connection to a WebSocket. func Dial(url_, protocol, origin string) (ws *Conn, err error) { config, err := NewConfig(url_, origin) if err != nil { return nil, err } if protocol != "" { config.Protocol = []string{protocol} } return DialConfig(config) } var portMap = map[string]string{ "ws": "80", "wss": "443", } func parseAuthority(location *url.URL) string { if _, ok := portMap[location.Scheme]; ok { if _, _, err := net.SplitHostPort(location.Host); err != nil { return net.JoinHostPort(location.Host, portMap[location.Scheme]) } } return location.Host } // DialConfig opens a new client connection to a WebSocket with a config. func DialConfig(config *Config) (ws *Conn, err error) { var client net.Conn if config.Location == nil { return nil, &DialError{config, ErrBadWebSocketLocation} } if config.Origin == nil { return nil, &DialError{config, ErrBadWebSocketOrigin} } dialer := config.Dialer if dialer == nil { dialer = &net.Dialer{} } client, err = dialWithDialer(dialer, config) if err != nil { goto Error } ws, err = NewClient(config, client) if err != nil { client.Close() goto Error } return Error: return nil, &DialError{config, err} } ================================================ FILE: vendor/golang.org/x/net/websocket/dial.go ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package websocket import ( "crypto/tls" "net" ) func dialWithDialer(dialer *net.Dialer, config *Config) (conn net.Conn, err error) { switch config.Location.Scheme { case "ws": conn, err = dialer.Dial("tcp", parseAuthority(config.Location)) case "wss": conn, err = tls.DialWithDialer(dialer, "tcp", parseAuthority(config.Location), config.TlsConfig) default: err = ErrBadScheme } return } ================================================ FILE: vendor/golang.org/x/net/websocket/hybi.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package websocket // This file implements a protocol of hybi draft. // http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17 import ( "bufio" "bytes" "crypto/rand" "crypto/sha1" "encoding/base64" "encoding/binary" "fmt" "io" "io/ioutil" "net/http" "net/url" "strings" ) const ( websocketGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" closeStatusNormal = 1000 closeStatusGoingAway = 1001 closeStatusProtocolError = 1002 closeStatusUnsupportedData = 1003 closeStatusFrameTooLarge = 1004 closeStatusNoStatusRcvd = 1005 closeStatusAbnormalClosure = 1006 closeStatusBadMessageData = 1007 closeStatusPolicyViolation = 1008 closeStatusTooBigData = 1009 closeStatusExtensionMismatch = 1010 maxControlFramePayloadLength = 125 ) var ( ErrBadMaskingKey = &ProtocolError{"bad masking key"} ErrBadPongMessage = &ProtocolError{"bad pong message"} ErrBadClosingStatus = &ProtocolError{"bad closing status"} ErrUnsupportedExtensions = &ProtocolError{"unsupported extensions"} ErrNotImplemented = &ProtocolError{"not implemented"} handshakeHeader = map[string]bool{ "Host": true, "Upgrade": true, "Connection": true, "Sec-Websocket-Key": true, "Sec-Websocket-Origin": true, "Sec-Websocket-Version": true, "Sec-Websocket-Protocol": true, "Sec-Websocket-Accept": true, } ) // A hybiFrameHeader is a frame header as defined in hybi draft. type hybiFrameHeader struct { Fin bool Rsv [3]bool OpCode byte Length int64 MaskingKey []byte data *bytes.Buffer } // A hybiFrameReader is a reader for hybi frame. type hybiFrameReader struct { reader io.Reader header hybiFrameHeader pos int64 length int } func (frame *hybiFrameReader) Read(msg []byte) (n int, err error) { n, err = frame.reader.Read(msg) if frame.header.MaskingKey != nil { for i := 0; i < n; i++ { msg[i] = msg[i] ^ frame.header.MaskingKey[frame.pos%4] frame.pos++ } } return n, err } func (frame *hybiFrameReader) PayloadType() byte { return frame.header.OpCode } func (frame *hybiFrameReader) HeaderReader() io.Reader { if frame.header.data == nil { return nil } if frame.header.data.Len() == 0 { return nil } return frame.header.data } func (frame *hybiFrameReader) TrailerReader() io.Reader { return nil } func (frame *hybiFrameReader) Len() (n int) { return frame.length } // A hybiFrameReaderFactory creates new frame reader based on its frame type. type hybiFrameReaderFactory struct { *bufio.Reader } // NewFrameReader reads a frame header from the connection, and creates new reader for the frame. // See Section 5.2 Base Framing protocol for detail. // http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17#section-5.2 func (buf hybiFrameReaderFactory) NewFrameReader() (frame frameReader, err error) { hybiFrame := new(hybiFrameReader) frame = hybiFrame var header []byte var b byte // First byte. FIN/RSV1/RSV2/RSV3/OpCode(4bits) b, err = buf.ReadByte() if err != nil { return } header = append(header, b) hybiFrame.header.Fin = ((header[0] >> 7) & 1) != 0 for i := 0; i < 3; i++ { j := uint(6 - i) hybiFrame.header.Rsv[i] = ((header[0] >> j) & 1) != 0 } hybiFrame.header.OpCode = header[0] & 0x0f // Second byte. Mask/Payload len(7bits) b, err = buf.ReadByte() if err != nil { return } header = append(header, b) mask := (b & 0x80) != 0 b &= 0x7f lengthFields := 0 switch { case b <= 125: // Payload length 7bits. hybiFrame.header.Length = int64(b) case b == 126: // Payload length 7+16bits lengthFields = 2 case b == 127: // Payload length 7+64bits lengthFields = 8 } for i := 0; i < lengthFields; i++ { b, err = buf.ReadByte() if err != nil { return } if lengthFields == 8 && i == 0 { // MSB must be zero when 7+64 bits b &= 0x7f } header = append(header, b) hybiFrame.header.Length = hybiFrame.header.Length*256 + int64(b) } if mask { // Masking key. 4 bytes. for i := 0; i < 4; i++ { b, err = buf.ReadByte() if err != nil { return } header = append(header, b) hybiFrame.header.MaskingKey = append(hybiFrame.header.MaskingKey, b) } } hybiFrame.reader = io.LimitReader(buf.Reader, hybiFrame.header.Length) hybiFrame.header.data = bytes.NewBuffer(header) hybiFrame.length = len(header) + int(hybiFrame.header.Length) return } // A HybiFrameWriter is a writer for hybi frame. type hybiFrameWriter struct { writer *bufio.Writer header *hybiFrameHeader } func (frame *hybiFrameWriter) Write(msg []byte) (n int, err error) { var header []byte var b byte if frame.header.Fin { b |= 0x80 } for i := 0; i < 3; i++ { if frame.header.Rsv[i] { j := uint(6 - i) b |= 1 << j } } b |= frame.header.OpCode header = append(header, b) if frame.header.MaskingKey != nil { b = 0x80 } else { b = 0 } lengthFields := 0 length := len(msg) switch { case length <= 125: b |= byte(length) case length < 65536: b |= 126 lengthFields = 2 default: b |= 127 lengthFields = 8 } header = append(header, b) for i := 0; i < lengthFields; i++ { j := uint((lengthFields - i - 1) * 8) b = byte((length >> j) & 0xff) header = append(header, b) } if frame.header.MaskingKey != nil { if len(frame.header.MaskingKey) != 4 { return 0, ErrBadMaskingKey } header = append(header, frame.header.MaskingKey...) frame.writer.Write(header) data := make([]byte, length) for i := range data { data[i] = msg[i] ^ frame.header.MaskingKey[i%4] } frame.writer.Write(data) err = frame.writer.Flush() return length, err } frame.writer.Write(header) frame.writer.Write(msg) err = frame.writer.Flush() return length, err } func (frame *hybiFrameWriter) Close() error { return nil } type hybiFrameWriterFactory struct { *bufio.Writer needMaskingKey bool } func (buf hybiFrameWriterFactory) NewFrameWriter(payloadType byte) (frame frameWriter, err error) { frameHeader := &hybiFrameHeader{Fin: true, OpCode: payloadType} if buf.needMaskingKey { frameHeader.MaskingKey, err = generateMaskingKey() if err != nil { return nil, err } } return &hybiFrameWriter{writer: buf.Writer, header: frameHeader}, nil } type hybiFrameHandler struct { conn *Conn payloadType byte } func (handler *hybiFrameHandler) HandleFrame(frame frameReader) (frameReader, error) { if handler.conn.IsServerConn() { // The client MUST mask all frames sent to the server. if frame.(*hybiFrameReader).header.MaskingKey == nil { handler.WriteClose(closeStatusProtocolError) return nil, io.EOF } } else { // The server MUST NOT mask all frames. if frame.(*hybiFrameReader).header.MaskingKey != nil { handler.WriteClose(closeStatusProtocolError) return nil, io.EOF } } if header := frame.HeaderReader(); header != nil { io.Copy(ioutil.Discard, header) } switch frame.PayloadType() { case ContinuationFrame: frame.(*hybiFrameReader).header.OpCode = handler.payloadType case TextFrame, BinaryFrame: handler.payloadType = frame.PayloadType() case CloseFrame: return nil, io.EOF case PingFrame, PongFrame: b := make([]byte, maxControlFramePayloadLength) n, err := io.ReadFull(frame, b) if err != nil && err != io.EOF && err != io.ErrUnexpectedEOF { return nil, err } io.Copy(ioutil.Discard, frame) if frame.PayloadType() == PingFrame { if _, err := handler.WritePong(b[:n]); err != nil { return nil, err } } return nil, nil } return frame, nil } func (handler *hybiFrameHandler) WriteClose(status int) (err error) { handler.conn.wio.Lock() defer handler.conn.wio.Unlock() w, err := handler.conn.frameWriterFactory.NewFrameWriter(CloseFrame) if err != nil { return err } msg := make([]byte, 2) binary.BigEndian.PutUint16(msg, uint16(status)) _, err = w.Write(msg) w.Close() return err } func (handler *hybiFrameHandler) WritePong(msg []byte) (n int, err error) { handler.conn.wio.Lock() defer handler.conn.wio.Unlock() w, err := handler.conn.frameWriterFactory.NewFrameWriter(PongFrame) if err != nil { return 0, err } n, err = w.Write(msg) w.Close() return n, err } // newHybiConn creates a new WebSocket connection speaking hybi draft protocol. func newHybiConn(config *Config, buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) *Conn { if buf == nil { br := bufio.NewReader(rwc) bw := bufio.NewWriter(rwc) buf = bufio.NewReadWriter(br, bw) } ws := &Conn{config: config, request: request, buf: buf, rwc: rwc, frameReaderFactory: hybiFrameReaderFactory{buf.Reader}, frameWriterFactory: hybiFrameWriterFactory{ buf.Writer, request == nil}, PayloadType: TextFrame, defaultCloseStatus: closeStatusNormal} ws.frameHandler = &hybiFrameHandler{conn: ws} return ws } // generateMaskingKey generates a masking key for a frame. func generateMaskingKey() (maskingKey []byte, err error) { maskingKey = make([]byte, 4) if _, err = io.ReadFull(rand.Reader, maskingKey); err != nil { return } return } // generateNonce generates a nonce consisting of a randomly selected 16-byte // value that has been base64-encoded. func generateNonce() (nonce []byte) { key := make([]byte, 16) if _, err := io.ReadFull(rand.Reader, key); err != nil { panic(err) } nonce = make([]byte, 24) base64.StdEncoding.Encode(nonce, key) return } // removeZone removes IPv6 zone identifer from host. // E.g., "[fe80::1%en0]:8080" to "[fe80::1]:8080" func removeZone(host string) string { if !strings.HasPrefix(host, "[") { return host } i := strings.LastIndex(host, "]") if i < 0 { return host } j := strings.LastIndex(host[:i], "%") if j < 0 { return host } return host[:j] + host[i:] } // getNonceAccept computes the base64-encoded SHA-1 of the concatenation of // the nonce ("Sec-WebSocket-Key" value) with the websocket GUID string. func getNonceAccept(nonce []byte) (expected []byte, err error) { h := sha1.New() if _, err = h.Write(nonce); err != nil { return } if _, err = h.Write([]byte(websocketGUID)); err != nil { return } expected = make([]byte, 28) base64.StdEncoding.Encode(expected, h.Sum(nil)) return } // Client handshake described in draft-ietf-hybi-thewebsocket-protocol-17 func hybiClientHandshake(config *Config, br *bufio.Reader, bw *bufio.Writer) (err error) { bw.WriteString("GET " + config.Location.RequestURI() + " HTTP/1.1\r\n") // According to RFC 6874, an HTTP client, proxy, or other // intermediary must remove any IPv6 zone identifier attached // to an outgoing URI. bw.WriteString("Host: " + removeZone(config.Location.Host) + "\r\n") bw.WriteString("Upgrade: websocket\r\n") bw.WriteString("Connection: Upgrade\r\n") nonce := generateNonce() if config.handshakeData != nil { nonce = []byte(config.handshakeData["key"]) } bw.WriteString("Sec-WebSocket-Key: " + string(nonce) + "\r\n") bw.WriteString("Origin: " + strings.ToLower(config.Origin.String()) + "\r\n") if config.Version != ProtocolVersionHybi13 { return ErrBadProtocolVersion } bw.WriteString("Sec-WebSocket-Version: " + fmt.Sprintf("%d", config.Version) + "\r\n") if len(config.Protocol) > 0 { bw.WriteString("Sec-WebSocket-Protocol: " + strings.Join(config.Protocol, ", ") + "\r\n") } // TODO(ukai): send Sec-WebSocket-Extensions. err = config.Header.WriteSubset(bw, handshakeHeader) if err != nil { return err } bw.WriteString("\r\n") if err = bw.Flush(); err != nil { return err } resp, err := http.ReadResponse(br, &http.Request{Method: "GET"}) if err != nil { return err } if resp.StatusCode != 101 { return ErrBadStatus } if strings.ToLower(resp.Header.Get("Upgrade")) != "websocket" || strings.ToLower(resp.Header.Get("Connection")) != "upgrade" { return ErrBadUpgrade } expectedAccept, err := getNonceAccept(nonce) if err != nil { return err } if resp.Header.Get("Sec-WebSocket-Accept") != string(expectedAccept) { return ErrChallengeResponse } if resp.Header.Get("Sec-WebSocket-Extensions") != "" { return ErrUnsupportedExtensions } offeredProtocol := resp.Header.Get("Sec-WebSocket-Protocol") if offeredProtocol != "" { protocolMatched := false for i := 0; i < len(config.Protocol); i++ { if config.Protocol[i] == offeredProtocol { protocolMatched = true break } } if !protocolMatched { return ErrBadWebSocketProtocol } config.Protocol = []string{offeredProtocol} } return nil } // newHybiClientConn creates a client WebSocket connection after handshake. func newHybiClientConn(config *Config, buf *bufio.ReadWriter, rwc io.ReadWriteCloser) *Conn { return newHybiConn(config, buf, rwc, nil) } // A HybiServerHandshaker performs a server handshake using hybi draft protocol. type hybiServerHandshaker struct { *Config accept []byte } func (c *hybiServerHandshaker) ReadHandshake(buf *bufio.Reader, req *http.Request) (code int, err error) { c.Version = ProtocolVersionHybi13 if req.Method != "GET" { return http.StatusMethodNotAllowed, ErrBadRequestMethod } // HTTP version can be safely ignored. if strings.ToLower(req.Header.Get("Upgrade")) != "websocket" || !strings.Contains(strings.ToLower(req.Header.Get("Connection")), "upgrade") { return http.StatusBadRequest, ErrNotWebSocket } key := req.Header.Get("Sec-Websocket-Key") if key == "" { return http.StatusBadRequest, ErrChallengeResponse } version := req.Header.Get("Sec-Websocket-Version") switch version { case "13": c.Version = ProtocolVersionHybi13 default: return http.StatusBadRequest, ErrBadWebSocketVersion } var scheme string if req.TLS != nil { scheme = "wss" } else { scheme = "ws" } c.Location, err = url.ParseRequestURI(scheme + "://" + req.Host + req.URL.RequestURI()) if err != nil { return http.StatusBadRequest, err } protocol := strings.TrimSpace(req.Header.Get("Sec-Websocket-Protocol")) if protocol != "" { protocols := strings.Split(protocol, ",") for i := 0; i < len(protocols); i++ { c.Protocol = append(c.Protocol, strings.TrimSpace(protocols[i])) } } c.accept, err = getNonceAccept([]byte(key)) if err != nil { return http.StatusInternalServerError, err } return http.StatusSwitchingProtocols, nil } // Origin parses the Origin header in req. // If the Origin header is not set, it returns nil and nil. func Origin(config *Config, req *http.Request) (*url.URL, error) { var origin string switch config.Version { case ProtocolVersionHybi13: origin = req.Header.Get("Origin") } if origin == "" { return nil, nil } return url.ParseRequestURI(origin) } func (c *hybiServerHandshaker) AcceptHandshake(buf *bufio.Writer) (err error) { if len(c.Protocol) > 0 { if len(c.Protocol) != 1 { // You need choose a Protocol in Handshake func in Server. return ErrBadWebSocketProtocol } } buf.WriteString("HTTP/1.1 101 Switching Protocols\r\n") buf.WriteString("Upgrade: websocket\r\n") buf.WriteString("Connection: Upgrade\r\n") buf.WriteString("Sec-WebSocket-Accept: " + string(c.accept) + "\r\n") if len(c.Protocol) > 0 { buf.WriteString("Sec-WebSocket-Protocol: " + c.Protocol[0] + "\r\n") } // TODO(ukai): send Sec-WebSocket-Extensions. if c.Header != nil { err := c.Header.WriteSubset(buf, handshakeHeader) if err != nil { return err } } buf.WriteString("\r\n") return buf.Flush() } func (c *hybiServerHandshaker) NewServerConn(buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) *Conn { return newHybiServerConn(c.Config, buf, rwc, request) } // newHybiServerConn returns a new WebSocket connection speaking hybi draft protocol. func newHybiServerConn(config *Config, buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) *Conn { return newHybiConn(config, buf, rwc, request) } ================================================ FILE: vendor/golang.org/x/net/websocket/server.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package websocket import ( "bufio" "fmt" "io" "net/http" ) func newServerConn(rwc io.ReadWriteCloser, buf *bufio.ReadWriter, req *http.Request, config *Config, handshake func(*Config, *http.Request) error) (conn *Conn, err error) { var hs serverHandshaker = &hybiServerHandshaker{Config: config} code, err := hs.ReadHandshake(buf.Reader, req) if err == ErrBadWebSocketVersion { fmt.Fprintf(buf, "HTTP/1.1 %03d %s\r\n", code, http.StatusText(code)) fmt.Fprintf(buf, "Sec-WebSocket-Version: %s\r\n", SupportedProtocolVersion) buf.WriteString("\r\n") buf.WriteString(err.Error()) buf.Flush() return } if err != nil { fmt.Fprintf(buf, "HTTP/1.1 %03d %s\r\n", code, http.StatusText(code)) buf.WriteString("\r\n") buf.WriteString(err.Error()) buf.Flush() return } if handshake != nil { err = handshake(config, req) if err != nil { code = http.StatusForbidden fmt.Fprintf(buf, "HTTP/1.1 %03d %s\r\n", code, http.StatusText(code)) buf.WriteString("\r\n") buf.Flush() return } } err = hs.AcceptHandshake(buf.Writer) if err != nil { code = http.StatusBadRequest fmt.Fprintf(buf, "HTTP/1.1 %03d %s\r\n", code, http.StatusText(code)) buf.WriteString("\r\n") buf.Flush() return } conn = hs.NewServerConn(buf, rwc, req) return } // Server represents a server of a WebSocket. type Server struct { // Config is a WebSocket configuration for new WebSocket connection. Config // Handshake is an optional function in WebSocket handshake. // For example, you can check, or don't check Origin header. // Another example, you can select config.Protocol. Handshake func(*Config, *http.Request) error // Handler handles a WebSocket connection. Handler } // ServeHTTP implements the http.Handler interface for a WebSocket func (s Server) ServeHTTP(w http.ResponseWriter, req *http.Request) { s.serveWebSocket(w, req) } func (s Server) serveWebSocket(w http.ResponseWriter, req *http.Request) { rwc, buf, err := w.(http.Hijacker).Hijack() if err != nil { panic("Hijack failed: " + err.Error()) } // The server should abort the WebSocket connection if it finds // the client did not send a handshake that matches with protocol // specification. defer rwc.Close() conn, err := newServerConn(rwc, buf, req, &s.Config, s.Handshake) if err != nil { return } if conn == nil { panic("unexpected nil conn") } s.Handler(conn) } // Handler is a simple interface to a WebSocket browser client. // It checks if Origin header is valid URL by default. // You might want to verify websocket.Conn.Config().Origin in the func. // If you use Server instead of Handler, you could call websocket.Origin and // check the origin in your Handshake func. So, if you want to accept // non-browser clients, which do not send an Origin header, set a // Server.Handshake that does not check the origin. type Handler func(*Conn) func checkOrigin(config *Config, req *http.Request) (err error) { config.Origin, err = Origin(config, req) if err == nil && config.Origin == nil { return fmt.Errorf("null origin") } return err } // ServeHTTP implements the http.Handler interface for a WebSocket func (h Handler) ServeHTTP(w http.ResponseWriter, req *http.Request) { s := Server{Handler: h, Handshake: checkOrigin} s.serveWebSocket(w, req) } ================================================ FILE: vendor/golang.org/x/net/websocket/websocket.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package websocket implements a client and server for the WebSocket protocol // as specified in RFC 6455. // // This package currently lacks some features found in an alternative // and more actively maintained WebSocket package: // // https://godoc.org/github.com/gorilla/websocket // package websocket // import "golang.org/x/net/websocket" import ( "bufio" "crypto/tls" "encoding/json" "errors" "io" "io/ioutil" "net" "net/http" "net/url" "sync" "time" ) const ( ProtocolVersionHybi13 = 13 ProtocolVersionHybi = ProtocolVersionHybi13 SupportedProtocolVersion = "13" ContinuationFrame = 0 TextFrame = 1 BinaryFrame = 2 CloseFrame = 8 PingFrame = 9 PongFrame = 10 UnknownFrame = 255 DefaultMaxPayloadBytes = 32 << 20 // 32MB ) // ProtocolError represents WebSocket protocol errors. type ProtocolError struct { ErrorString string } func (err *ProtocolError) Error() string { return err.ErrorString } var ( ErrBadProtocolVersion = &ProtocolError{"bad protocol version"} ErrBadScheme = &ProtocolError{"bad scheme"} ErrBadStatus = &ProtocolError{"bad status"} ErrBadUpgrade = &ProtocolError{"missing or bad upgrade"} ErrBadWebSocketOrigin = &ProtocolError{"missing or bad WebSocket-Origin"} ErrBadWebSocketLocation = &ProtocolError{"missing or bad WebSocket-Location"} ErrBadWebSocketProtocol = &ProtocolError{"missing or bad WebSocket-Protocol"} ErrBadWebSocketVersion = &ProtocolError{"missing or bad WebSocket Version"} ErrChallengeResponse = &ProtocolError{"mismatch challenge/response"} ErrBadFrame = &ProtocolError{"bad frame"} ErrBadFrameBoundary = &ProtocolError{"not on frame boundary"} ErrNotWebSocket = &ProtocolError{"not websocket protocol"} ErrBadRequestMethod = &ProtocolError{"bad method"} ErrNotSupported = &ProtocolError{"not supported"} ) // ErrFrameTooLarge is returned by Codec's Receive method if payload size // exceeds limit set by Conn.MaxPayloadBytes var ErrFrameTooLarge = errors.New("websocket: frame payload size exceeds limit") // Addr is an implementation of net.Addr for WebSocket. type Addr struct { *url.URL } // Network returns the network type for a WebSocket, "websocket". func (addr *Addr) Network() string { return "websocket" } // Config is a WebSocket configuration type Config struct { // A WebSocket server address. Location *url.URL // A Websocket client origin. Origin *url.URL // WebSocket subprotocols. Protocol []string // WebSocket protocol version. Version int // TLS config for secure WebSocket (wss). TlsConfig *tls.Config // Additional header fields to be sent in WebSocket opening handshake. Header http.Header // Dialer used when opening websocket connections. Dialer *net.Dialer handshakeData map[string]string } // serverHandshaker is an interface to handle WebSocket server side handshake. type serverHandshaker interface { // ReadHandshake reads handshake request message from client. // Returns http response code and error if any. ReadHandshake(buf *bufio.Reader, req *http.Request) (code int, err error) // AcceptHandshake accepts the client handshake request and sends // handshake response back to client. AcceptHandshake(buf *bufio.Writer) (err error) // NewServerConn creates a new WebSocket connection. NewServerConn(buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) (conn *Conn) } // frameReader is an interface to read a WebSocket frame. type frameReader interface { // Reader is to read payload of the frame. io.Reader // PayloadType returns payload type. PayloadType() byte // HeaderReader returns a reader to read header of the frame. HeaderReader() io.Reader // TrailerReader returns a reader to read trailer of the frame. // If it returns nil, there is no trailer in the frame. TrailerReader() io.Reader // Len returns total length of the frame, including header and trailer. Len() int } // frameReaderFactory is an interface to creates new frame reader. type frameReaderFactory interface { NewFrameReader() (r frameReader, err error) } // frameWriter is an interface to write a WebSocket frame. type frameWriter interface { // Writer is to write payload of the frame. io.WriteCloser } // frameWriterFactory is an interface to create new frame writer. type frameWriterFactory interface { NewFrameWriter(payloadType byte) (w frameWriter, err error) } type frameHandler interface { HandleFrame(frame frameReader) (r frameReader, err error) WriteClose(status int) (err error) } // Conn represents a WebSocket connection. // // Multiple goroutines may invoke methods on a Conn simultaneously. type Conn struct { config *Config request *http.Request buf *bufio.ReadWriter rwc io.ReadWriteCloser rio sync.Mutex frameReaderFactory frameReader wio sync.Mutex frameWriterFactory frameHandler PayloadType byte defaultCloseStatus int // MaxPayloadBytes limits the size of frame payload received over Conn // by Codec's Receive method. If zero, DefaultMaxPayloadBytes is used. MaxPayloadBytes int } // Read implements the io.Reader interface: // it reads data of a frame from the WebSocket connection. // if msg is not large enough for the frame data, it fills the msg and next Read // will read the rest of the frame data. // it reads Text frame or Binary frame. func (ws *Conn) Read(msg []byte) (n int, err error) { ws.rio.Lock() defer ws.rio.Unlock() again: if ws.frameReader == nil { frame, err := ws.frameReaderFactory.NewFrameReader() if err != nil { return 0, err } ws.frameReader, err = ws.frameHandler.HandleFrame(frame) if err != nil { return 0, err } if ws.frameReader == nil { goto again } } n, err = ws.frameReader.Read(msg) if err == io.EOF { if trailer := ws.frameReader.TrailerReader(); trailer != nil { io.Copy(ioutil.Discard, trailer) } ws.frameReader = nil goto again } return n, err } // Write implements the io.Writer interface: // it writes data as a frame to the WebSocket connection. func (ws *Conn) Write(msg []byte) (n int, err error) { ws.wio.Lock() defer ws.wio.Unlock() w, err := ws.frameWriterFactory.NewFrameWriter(ws.PayloadType) if err != nil { return 0, err } n, err = w.Write(msg) w.Close() return n, err } // Close implements the io.Closer interface. func (ws *Conn) Close() error { err := ws.frameHandler.WriteClose(ws.defaultCloseStatus) err1 := ws.rwc.Close() if err != nil { return err } return err1 } func (ws *Conn) IsClientConn() bool { return ws.request == nil } func (ws *Conn) IsServerConn() bool { return ws.request != nil } // LocalAddr returns the WebSocket Origin for the connection for client, or // the WebSocket location for server. func (ws *Conn) LocalAddr() net.Addr { if ws.IsClientConn() { return &Addr{ws.config.Origin} } return &Addr{ws.config.Location} } // RemoteAddr returns the WebSocket location for the connection for client, or // the Websocket Origin for server. func (ws *Conn) RemoteAddr() net.Addr { if ws.IsClientConn() { return &Addr{ws.config.Location} } return &Addr{ws.config.Origin} } var errSetDeadline = errors.New("websocket: cannot set deadline: not using a net.Conn") // SetDeadline sets the connection's network read & write deadlines. func (ws *Conn) SetDeadline(t time.Time) error { if conn, ok := ws.rwc.(net.Conn); ok { return conn.SetDeadline(t) } return errSetDeadline } // SetReadDeadline sets the connection's network read deadline. func (ws *Conn) SetReadDeadline(t time.Time) error { if conn, ok := ws.rwc.(net.Conn); ok { return conn.SetReadDeadline(t) } return errSetDeadline } // SetWriteDeadline sets the connection's network write deadline. func (ws *Conn) SetWriteDeadline(t time.Time) error { if conn, ok := ws.rwc.(net.Conn); ok { return conn.SetWriteDeadline(t) } return errSetDeadline } // Config returns the WebSocket config. func (ws *Conn) Config() *Config { return ws.config } // Request returns the http request upgraded to the WebSocket. // It is nil for client side. func (ws *Conn) Request() *http.Request { return ws.request } // Codec represents a symmetric pair of functions that implement a codec. type Codec struct { Marshal func(v interface{}) (data []byte, payloadType byte, err error) Unmarshal func(data []byte, payloadType byte, v interface{}) (err error) } // Send sends v marshaled by cd.Marshal as single frame to ws. func (cd Codec) Send(ws *Conn, v interface{}) (err error) { data, payloadType, err := cd.Marshal(v) if err != nil { return err } ws.wio.Lock() defer ws.wio.Unlock() w, err := ws.frameWriterFactory.NewFrameWriter(payloadType) if err != nil { return err } _, err = w.Write(data) w.Close() return err } // Receive receives single frame from ws, unmarshaled by cd.Unmarshal and stores // in v. The whole frame payload is read to an in-memory buffer; max size of // payload is defined by ws.MaxPayloadBytes. If frame payload size exceeds // limit, ErrFrameTooLarge is returned; in this case frame is not read off wire // completely. The next call to Receive would read and discard leftover data of // previous oversized frame before processing next frame. func (cd Codec) Receive(ws *Conn, v interface{}) (err error) { ws.rio.Lock() defer ws.rio.Unlock() if ws.frameReader != nil { _, err = io.Copy(ioutil.Discard, ws.frameReader) if err != nil { return err } ws.frameReader = nil } again: frame, err := ws.frameReaderFactory.NewFrameReader() if err != nil { return err } frame, err = ws.frameHandler.HandleFrame(frame) if err != nil { return err } if frame == nil { goto again } maxPayloadBytes := ws.MaxPayloadBytes if maxPayloadBytes == 0 { maxPayloadBytes = DefaultMaxPayloadBytes } if hf, ok := frame.(*hybiFrameReader); ok && hf.header.Length > int64(maxPayloadBytes) { // payload size exceeds limit, no need to call Unmarshal // // set frameReader to current oversized frame so that // the next call to this function can drain leftover // data before processing the next frame ws.frameReader = frame return ErrFrameTooLarge } payloadType := frame.PayloadType() data, err := ioutil.ReadAll(frame) if err != nil { return err } return cd.Unmarshal(data, payloadType, v) } func marshal(v interface{}) (msg []byte, payloadType byte, err error) { switch data := v.(type) { case string: return []byte(data), TextFrame, nil case []byte: return data, BinaryFrame, nil } return nil, UnknownFrame, ErrNotSupported } func unmarshal(msg []byte, payloadType byte, v interface{}) (err error) { switch data := v.(type) { case *string: *data = string(msg) return nil case *[]byte: *data = msg return nil } return ErrNotSupported } /* Message is a codec to send/receive text/binary data in a frame on WebSocket connection. To send/receive text frame, use string type. To send/receive binary frame, use []byte type. Trivial usage: import "websocket" // receive text frame var message string websocket.Message.Receive(ws, &message) // send text frame message = "hello" websocket.Message.Send(ws, message) // receive binary frame var data []byte websocket.Message.Receive(ws, &data) // send binary frame data = []byte{0, 1, 2} websocket.Message.Send(ws, data) */ var Message = Codec{marshal, unmarshal} func jsonMarshal(v interface{}) (msg []byte, payloadType byte, err error) { msg, err = json.Marshal(v) return msg, TextFrame, err } func jsonUnmarshal(msg []byte, payloadType byte, v interface{}) (err error) { return json.Unmarshal(msg, v) } /* JSON is a codec to send/receive JSON data in a frame from a WebSocket connection. Trivial usage: import "websocket" type T struct { Msg string Count int } // receive JSON type T var data T websocket.JSON.Receive(ws, &data) // send JSON type T websocket.JSON.Send(ws, data) */ var JSON = Codec{jsonMarshal, jsonUnmarshal} ================================================ FILE: vendor/golang.org/x/sync/LICENSE ================================================ Copyright (c) 2009 The Go Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: vendor/golang.org/x/sync/PATENTS ================================================ Additional IP Rights Grant (Patents) "This implementation" means the copyrightable works distributed by Google as part of the Go project. Google hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, transfer and otherwise run, modify and propagate the contents of this implementation of Go, where such license applies only to those patent claims, both currently owned or controlled by Google and acquired in the future, licensable by Google that are necessarily infringed by this implementation of Go. This grant does not include claims that would be infringed only as a consequence of further modification of this implementation. If you or your agent or exclusive licensee institute or order or agree to the institution of patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that this implementation of Go or any code incorporated within this implementation of Go constitutes direct or contributory patent infringement, or inducement of patent infringement, then any patent rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ================================================ FILE: vendor/golang.org/x/sync/syncmap/map.go ================================================ // Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package syncmap provides a concurrent map implementation. // It is a prototype for a proposed addition to the sync package // in the standard library. // (https://golang.org/issue/18177) package syncmap import ( "sync" "sync/atomic" "unsafe" ) // Map is a concurrent map with amortized-constant-time loads, stores, and deletes. // It is safe for multiple goroutines to call a Map's methods concurrently. // // The zero Map is valid and empty. // // A Map must not be copied after first use. type Map struct { mu sync.Mutex // read contains the portion of the map's contents that are safe for // concurrent access (with or without mu held). // // The read field itself is always safe to load, but must only be stored with // mu held. // // Entries stored in read may be updated concurrently without mu, but updating // a previously-expunged entry requires that the entry be copied to the dirty // map and unexpunged with mu held. read atomic.Value // readOnly // dirty contains the portion of the map's contents that require mu to be // held. To ensure that the dirty map can be promoted to the read map quickly, // it also includes all of the non-expunged entries in the read map. // // Expunged entries are not stored in the dirty map. An expunged entry in the // clean map must be unexpunged and added to the dirty map before a new value // can be stored to it. // // If the dirty map is nil, the next write to the map will initialize it by // making a shallow copy of the clean map, omitting stale entries. dirty map[interface{}]*entry // misses counts the number of loads since the read map was last updated that // needed to lock mu to determine whether the key was present. // // Once enough misses have occurred to cover the cost of copying the dirty // map, the dirty map will be promoted to the read map (in the unamended // state) and the next store to the map will make a new dirty copy. misses int } // readOnly is an immutable struct stored atomically in the Map.read field. type readOnly struct { m map[interface{}]*entry amended bool // true if the dirty map contains some key not in m. } // expunged is an arbitrary pointer that marks entries which have been deleted // from the dirty map. var expunged = unsafe.Pointer(new(interface{})) // An entry is a slot in the map corresponding to a particular key. type entry struct { // p points to the interface{} value stored for the entry. // // If p == nil, the entry has been deleted and m.dirty == nil. // // If p == expunged, the entry has been deleted, m.dirty != nil, and the entry // is missing from m.dirty. // // Otherwise, the entry is valid and recorded in m.read.m[key] and, if m.dirty // != nil, in m.dirty[key]. // // An entry can be deleted by atomic replacement with nil: when m.dirty is // next created, it will atomically replace nil with expunged and leave // m.dirty[key] unset. // // An entry's associated value can be updated by atomic replacement, provided // p != expunged. If p == expunged, an entry's associated value can be updated // only after first setting m.dirty[key] = e so that lookups using the dirty // map find the entry. p unsafe.Pointer // *interface{} } func newEntry(i interface{}) *entry { return &entry{p: unsafe.Pointer(&i)} } // Load returns the value stored in the map for a key, or nil if no // value is present. // The ok result indicates whether value was found in the map. func (m *Map) Load(key interface{}) (value interface{}, ok bool) { read, _ := m.read.Load().(readOnly) e, ok := read.m[key] if !ok && read.amended { m.mu.Lock() // Avoid reporting a spurious miss if m.dirty got promoted while we were // blocked on m.mu. (If further loads of the same key will not miss, it's // not worth copying the dirty map for this key.) read, _ = m.read.Load().(readOnly) e, ok = read.m[key] if !ok && read.amended { e, ok = m.dirty[key] // Regardless of whether the entry was present, record a miss: this key // will take the slow path until the dirty map is promoted to the read // map. m.missLocked() } m.mu.Unlock() } if !ok { return nil, false } return e.load() } func (e *entry) load() (value interface{}, ok bool) { p := atomic.LoadPointer(&e.p) if p == nil || p == expunged { return nil, false } return *(*interface{})(p), true } // Store sets the value for a key. func (m *Map) Store(key, value interface{}) { read, _ := m.read.Load().(readOnly) if e, ok := read.m[key]; ok && e.tryStore(&value) { return } m.mu.Lock() read, _ = m.read.Load().(readOnly) if e, ok := read.m[key]; ok { if e.unexpungeLocked() { // The entry was previously expunged, which implies that there is a // non-nil dirty map and this entry is not in it. m.dirty[key] = e } e.storeLocked(&value) } else if e, ok := m.dirty[key]; ok { e.storeLocked(&value) } else { if !read.amended { // We're adding the first new key to the dirty map. // Make sure it is allocated and mark the read-only map as incomplete. m.dirtyLocked() m.read.Store(readOnly{m: read.m, amended: true}) } m.dirty[key] = newEntry(value) } m.mu.Unlock() } // tryStore stores a value if the entry has not been expunged. // // If the entry is expunged, tryStore returns false and leaves the entry // unchanged. func (e *entry) tryStore(i *interface{}) bool { p := atomic.LoadPointer(&e.p) if p == expunged { return false } for { if atomic.CompareAndSwapPointer(&e.p, p, unsafe.Pointer(i)) { return true } p = atomic.LoadPointer(&e.p) if p == expunged { return false } } } // unexpungeLocked ensures that the entry is not marked as expunged. // // If the entry was previously expunged, it must be added to the dirty map // before m.mu is unlocked. func (e *entry) unexpungeLocked() (wasExpunged bool) { return atomic.CompareAndSwapPointer(&e.p, expunged, nil) } // storeLocked unconditionally stores a value to the entry. // // The entry must be known not to be expunged. func (e *entry) storeLocked(i *interface{}) { atomic.StorePointer(&e.p, unsafe.Pointer(i)) } // LoadOrStore returns the existing value for the key if present. // Otherwise, it stores and returns the given value. // The loaded result is true if the value was loaded, false if stored. func (m *Map) LoadOrStore(key, value interface{}) (actual interface{}, loaded bool) { // Avoid locking if it's a clean hit. read, _ := m.read.Load().(readOnly) if e, ok := read.m[key]; ok { actual, loaded, ok := e.tryLoadOrStore(value) if ok { return actual, loaded } } m.mu.Lock() read, _ = m.read.Load().(readOnly) if e, ok := read.m[key]; ok { if e.unexpungeLocked() { m.dirty[key] = e } actual, loaded, _ = e.tryLoadOrStore(value) } else if e, ok := m.dirty[key]; ok { actual, loaded, _ = e.tryLoadOrStore(value) m.missLocked() } else { if !read.amended { // We're adding the first new key to the dirty map. // Make sure it is allocated and mark the read-only map as incomplete. m.dirtyLocked() m.read.Store(readOnly{m: read.m, amended: true}) } m.dirty[key] = newEntry(value) actual, loaded = value, false } m.mu.Unlock() return actual, loaded } // tryLoadOrStore atomically loads or stores a value if the entry is not // expunged. // // If the entry is expunged, tryLoadOrStore leaves the entry unchanged and // returns with ok==false. func (e *entry) tryLoadOrStore(i interface{}) (actual interface{}, loaded, ok bool) { p := atomic.LoadPointer(&e.p) if p == expunged { return nil, false, false } if p != nil { return *(*interface{})(p), true, true } // Copy the interface after the first load to make this method more amenable // to escape analysis: if we hit the "load" path or the entry is expunged, we // shouldn't bother heap-allocating. ic := i for { if atomic.CompareAndSwapPointer(&e.p, nil, unsafe.Pointer(&ic)) { return i, false, true } p = atomic.LoadPointer(&e.p) if p == expunged { return nil, false, false } if p != nil { return *(*interface{})(p), true, true } } } // Delete deletes the value for a key. func (m *Map) Delete(key interface{}) { read, _ := m.read.Load().(readOnly) e, ok := read.m[key] if !ok && read.amended { m.mu.Lock() read, _ = m.read.Load().(readOnly) e, ok = read.m[key] if !ok && read.amended { delete(m.dirty, key) } m.mu.Unlock() } if ok { e.delete() } } func (e *entry) delete() (hadValue bool) { for { p := atomic.LoadPointer(&e.p) if p == nil || p == expunged { return false } if atomic.CompareAndSwapPointer(&e.p, p, nil) { return true } } } // Range calls f sequentially for each key and value present in the map. // If f returns false, range stops the iteration. // // Range does not necessarily correspond to any consistent snapshot of the Map's // contents: no key will be visited more than once, but if the value for any key // is stored or deleted concurrently, Range may reflect any mapping for that key // from any point during the Range call. // // Range may be O(N) with the number of elements in the map even if f returns // false after a constant number of calls. func (m *Map) Range(f func(key, value interface{}) bool) { // We need to be able to iterate over all of the keys that were already // present at the start of the call to Range. // If read.amended is false, then read.m satisfies that property without // requiring us to hold m.mu for a long time. read, _ := m.read.Load().(readOnly) if read.amended { // m.dirty contains keys not in read.m. Fortunately, Range is already O(N) // (assuming the caller does not break out early), so a call to Range // amortizes an entire copy of the map: we can promote the dirty copy // immediately! m.mu.Lock() read, _ = m.read.Load().(readOnly) if read.amended { read = readOnly{m: m.dirty} m.read.Store(read) m.dirty = nil m.misses = 0 } m.mu.Unlock() } for k, e := range read.m { v, ok := e.load() if !ok { continue } if !f(k, v) { break } } } func (m *Map) missLocked() { m.misses++ if m.misses < len(m.dirty) { return } m.read.Store(readOnly{m: m.dirty}) m.dirty = nil m.misses = 0 } func (m *Map) dirtyLocked() { if m.dirty != nil { return } read, _ := m.read.Load().(readOnly) m.dirty = make(map[interface{}]*entry, len(read.m)) for k, e := range read.m { if !e.tryExpungeLocked() { m.dirty[k] = e } } } func (e *entry) tryExpungeLocked() (isExpunged bool) { p := atomic.LoadPointer(&e.p) for p == nil { if atomic.CompareAndSwapPointer(&e.p, nil, expunged) { return true } p = atomic.LoadPointer(&e.p) } return p == expunged } ================================================ FILE: vendor/golang.org/x/sys/.gitattributes ================================================ # Treat all files in this repo as binary, with no git magic updating # line endings. Windows users contributing to Go will need to use a # modern version of git and editors capable of LF line endings. # # We'll prevent accidental CRLF line endings from entering the repo # via the git-review gofmt checks. # # See golang.org/issue/9281 * -text ================================================ FILE: vendor/golang.org/x/sys/.gitignore ================================================ # Add no patterns to .hgignore except for files generated by the build. last-change ================================================ FILE: vendor/golang.org/x/sys/AUTHORS ================================================ # This source code refers to The Go Authors for copyright purposes. # The master list of authors is in the main Go distribution, # visible at http://tip.golang.org/AUTHORS. ================================================ FILE: vendor/golang.org/x/sys/CONTRIBUTING.md ================================================ # Contributing to Go Go is an open source project. It is the work of hundreds of contributors. We appreciate your help! ## Filing issues When [filing an issue](https://golang.org/issue/new), make sure to answer these five questions: 1. What version of Go are you using (`go version`)? 2. What operating system and processor architecture are you using? 3. What did you do? 4. What did you expect to see? 5. What did you see instead? General questions should go to the [golang-nuts mailing list](https://groups.google.com/group/golang-nuts) instead of the issue tracker. The gophers there will answer or ask you to file an issue if you've tripped over a bug. ## Contributing code Please read the [Contribution Guidelines](https://golang.org/doc/contribute.html) before sending patches. **We do not accept GitHub pull requests** (we use [Gerrit](https://code.google.com/p/gerrit/) instead for code review). Unless otherwise noted, the Go source files are distributed under the BSD-style license found in the LICENSE file. ================================================ FILE: vendor/golang.org/x/sys/CONTRIBUTORS ================================================ # This source code was written by the Go contributors. # The master list of contributors is in the main Go distribution, # visible at http://tip.golang.org/CONTRIBUTORS. ================================================ FILE: vendor/golang.org/x/sys/LICENSE ================================================ Copyright (c) 2009 The Go Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: vendor/golang.org/x/sys/PATENTS ================================================ Additional IP Rights Grant (Patents) "This implementation" means the copyrightable works distributed by Google as part of the Go project. Google hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, transfer and otherwise run, modify and propagate the contents of this implementation of Go, where such license applies only to those patent claims, both currently owned or controlled by Google and acquired in the future, licensable by Google that are necessarily infringed by this implementation of Go. This grant does not include claims that would be infringed only as a consequence of further modification of this implementation. If you or your agent or exclusive licensee institute or order or agree to the institution of patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that this implementation of Go or any code incorporated within this implementation of Go constitutes direct or contributory patent infringement, or inducement of patent infringement, then any patent rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ================================================ FILE: vendor/golang.org/x/sys/README ================================================ This repository holds supplemental Go packages for low-level interactions with the operating system. To submit changes to this repository, see http://golang.org/doc/contribute.html. ================================================ FILE: vendor/golang.org/x/sys/codereview.cfg ================================================ issuerepo: golang/go ================================================ FILE: vendor/golang.org/x/sys/unix/README.md ================================================ # Building `sys/unix` The sys/unix package provides access to the raw system call interface of the underlying operating system. See: https://godoc.org/golang.org/x/sys/unix Porting Go to a new architecture/OS combination or adding syscalls, types, or constants to an existing architecture/OS pair requires some manual effort; however, there are tools that automate much of the process. ## Build Systems There are currently two ways we generate the necessary files. We are currently migrating the build system to use containers so the builds are reproducible. This is being done on an OS-by-OS basis. Please update this documentation as components of the build system change. ### Old Build System (currently for `GOOS != "Linux" || GOARCH == "sparc64"`) The old build system generates the Go files based on the C header files present on your system. This means that files for a given GOOS/GOARCH pair must be generated on a system with that OS and architecture. This also means that the generated code can differ from system to system, based on differences in the header files. To avoid this, if you are using the old build system, only generate the Go files on an installation with unmodified header files. It is also important to keep track of which version of the OS the files were generated from (ex. Darwin 14 vs Darwin 15). This makes it easier to track the progress of changes and have each OS upgrade correspond to a single change. To build the files for your current OS and architecture, make sure GOOS and GOARCH are set correctly and run `mkall.sh`. This will generate the files for your specific system. Running `mkall.sh -n` shows the commands that will be run. Requirements: bash, perl, go ### New Build System (currently for `GOOS == "Linux" && GOARCH != "sparc64"`) The new build system uses a Docker container to generate the go files directly from source checkouts of the kernel and various system libraries. This means that on any platform that supports Docker, all the files using the new build system can be generated at once, and generated files will not change based on what the person running the scripts has installed on their computer. The OS specific files for the new build system are located in the `${GOOS}` directory, and the build is coordinated by the `${GOOS}/mkall.go` program. When the kernel or system library updates, modify the Dockerfile at `${GOOS}/Dockerfile` to checkout the new release of the source. To build all the files under the new build system, you must be on an amd64/Linux system and have your GOOS and GOARCH set accordingly. Running `mkall.sh` will then generate all of the files for all of the GOOS/GOARCH pairs in the new build system. Running `mkall.sh -n` shows the commands that will be run. Requirements: bash, perl, go, docker ## Component files This section describes the various files used in the code generation process. It also contains instructions on how to modify these files to add a new architecture/OS or to add additional syscalls, types, or constants. Note that if you are using the new build system, the scripts cannot be called normally. They must be called from within the docker container. ### asm files The hand-written assembly file at `asm_${GOOS}_${GOARCH}.s` implements system call dispatch. There are three entry points: ``` func Syscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) ``` The first and second are the standard ones; they differ only in how many arguments can be passed to the kernel. The third is for low-level use by the ForkExec wrapper. Unlike the first two, it does not call into the scheduler to let it know that a system call is running. When porting Go to an new architecture/OS, this file must be implemented for each GOOS/GOARCH pair. ### mksysnum Mksysnum is a script located at `${GOOS}/mksysnum.pl` (or `mksysnum_${GOOS}.pl` for the old system). This script takes in a list of header files containing the syscall number declarations and parses them to produce the corresponding list of Go numeric constants. See `zsysnum_${GOOS}_${GOARCH}.go` for the generated constants. Adding new syscall numbers is mostly done by running the build on a sufficiently new installation of the target OS (or updating the source checkouts for the new build system). However, depending on the OS, you make need to update the parsing in mksysnum. ### mksyscall.pl The `syscall.go`, `syscall_${GOOS}.go`, `syscall_${GOOS}_${GOARCH}.go` are hand-written Go files which implement system calls (for unix, the specific OS, or the specific OS/Architecture pair respectively) that need special handling and list `//sys` comments giving prototypes for ones that can be generated. The mksyscall.pl script takes the `//sys` and `//sysnb` comments and converts them into syscalls. This requires the name of the prototype in the comment to match a syscall number in the `zsysnum_${GOOS}_${GOARCH}.go` file. The function prototype can be exported (capitalized) or not. Adding a new syscall often just requires adding a new `//sys` function prototype with the desired arguments and a capitalized name so it is exported. However, if you want the interface to the syscall to be different, often one will make an unexported `//sys` prototype, an then write a custom wrapper in `syscall_${GOOS}.go`. ### types files For each OS, there is a hand-written Go file at `${GOOS}/types.go` (or `types_${GOOS}.go` on the old system). This file includes standard C headers and creates Go type aliases to the corresponding C types. The file is then fed through godef to get the Go compatible definitions. Finally, the generated code is fed though mkpost.go to format the code correctly and remove any hidden or private identifiers. This cleaned-up code is written to `ztypes_${GOOS}_${GOARCH}.go`. The hardest part about preparing this file is figuring out which headers to include and which symbols need to be `#define`d to get the actual data structures that pass through to the kernel system calls. Some C libraries preset alternate versions for binary compatibility and translate them on the way in and out of system calls, but there is almost always a `#define` that can get the real ones. See `types_darwin.go` and `linux/types.go` for examples. To add a new type, add in the necessary include statement at the top of the file (if it is not already there) and add in a type alias line. Note that if your type is significantly different on different architectures, you may need some `#if/#elif` macros in your include statements. ### mkerrors.sh This script is used to generate the system's various constants. This doesn't just include the error numbers and error strings, but also the signal numbers an a wide variety of miscellaneous constants. The constants come from the list of include files in the `includes_${uname}` variable. A regex then picks out the desired `#define` statements, and generates the corresponding Go constants. The error numbers and strings are generated from `#include <errno.h>`, and the signal numbers and strings are generated from `#include <signal.h>`. All of these constants are written to `zerrors_${GOOS}_${GOARCH}.go` via a C program, `_errors.c`, which prints out all the constants. To add a constant, add the header that includes it to the appropriate variable. Then, edit the regex (if necessary) to match the desired constant. Avoid making the regex too broad to avoid matching unintended constants. ## Generated files ### `zerror_${GOOS}_${GOARCH}.go` A file containing all of the system's generated error numbers, error strings, signal numbers, and constants. Generated by `mkerrors.sh` (see above). ### `zsyscall_${GOOS}_${GOARCH}.go` A file containing all the generated syscalls for a specific GOOS and GOARCH. Generated by `mksyscall.pl` (see above). ### `zsysnum_${GOOS}_${GOARCH}.go` A list of numeric constants for all the syscall number of the specific GOOS and GOARCH. Generated by mksysnum (see above). ### `ztypes_${GOOS}_${GOARCH}.go` A file containing Go types for passing into (or returning from) syscalls. Generated by godefs and the types file (see above). ================================================ FILE: vendor/golang.org/x/sys/unix/asm_darwin_386.s ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !gccgo #include "textflag.h" // // System call support for 386, Darwin // // Just jump to package syscall's implementation for all these functions. // The runtime may know about them. TEXT ·Syscall(SB),NOSPLIT,$0-28 JMP syscall·Syscall(SB) TEXT ·Syscall6(SB),NOSPLIT,$0-40 JMP syscall·Syscall6(SB) TEXT ·Syscall9(SB),NOSPLIT,$0-52 JMP syscall·Syscall9(SB) TEXT ·RawSyscall(SB),NOSPLIT,$0-28 JMP syscall·RawSyscall(SB) TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 JMP syscall·RawSyscall6(SB) ================================================ FILE: vendor/golang.org/x/sys/unix/asm_darwin_amd64.s ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !gccgo #include "textflag.h" // // System call support for AMD64, Darwin // // Just jump to package syscall's implementation for all these functions. // The runtime may know about them. TEXT ·Syscall(SB),NOSPLIT,$0-56 JMP syscall·Syscall(SB) TEXT ·Syscall6(SB),NOSPLIT,$0-80 JMP syscall·Syscall6(SB) TEXT ·Syscall9(SB),NOSPLIT,$0-104 JMP syscall·Syscall9(SB) TEXT ·RawSyscall(SB),NOSPLIT,$0-56 JMP syscall·RawSyscall(SB) TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 JMP syscall·RawSyscall6(SB) ================================================ FILE: vendor/golang.org/x/sys/unix/asm_darwin_arm.s ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !gccgo // +build arm,darwin #include "textflag.h" // // System call support for ARM, Darwin // // Just jump to package syscall's implementation for all these functions. // The runtime may know about them. TEXT ·Syscall(SB),NOSPLIT,$0-28 B syscall·Syscall(SB) TEXT ·Syscall6(SB),NOSPLIT,$0-40 B syscall·Syscall6(SB) TEXT ·Syscall9(SB),NOSPLIT,$0-52 B syscall·Syscall9(SB) TEXT ·RawSyscall(SB),NOSPLIT,$0-28 B syscall·RawSyscall(SB) TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 B syscall·RawSyscall6(SB) ================================================ FILE: vendor/golang.org/x/sys/unix/asm_darwin_arm64.s ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !gccgo // +build arm64,darwin #include "textflag.h" // // System call support for AMD64, Darwin // // Just jump to package syscall's implementation for all these functions. // The runtime may know about them. TEXT ·Syscall(SB),NOSPLIT,$0-56 B syscall·Syscall(SB) TEXT ·Syscall6(SB),NOSPLIT,$0-80 B syscall·Syscall6(SB) TEXT ·Syscall9(SB),NOSPLIT,$0-104 B syscall·Syscall9(SB) TEXT ·RawSyscall(SB),NOSPLIT,$0-56 B syscall·RawSyscall(SB) TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 B syscall·RawSyscall6(SB) ================================================ FILE: vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !gccgo #include "textflag.h" // // System call support for AMD64, DragonFly // // Just jump to package syscall's implementation for all these functions. // The runtime may know about them. TEXT ·Syscall(SB),NOSPLIT,$0-64 JMP syscall·Syscall(SB) TEXT ·Syscall6(SB),NOSPLIT,$0-88 JMP syscall·Syscall6(SB) TEXT ·Syscall9(SB),NOSPLIT,$0-112 JMP syscall·Syscall9(SB) TEXT ·RawSyscall(SB),NOSPLIT,$0-64 JMP syscall·RawSyscall(SB) TEXT ·RawSyscall6(SB),NOSPLIT,$0-88 JMP syscall·RawSyscall6(SB) ================================================ FILE: vendor/golang.org/x/sys/unix/asm_freebsd_386.s ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !gccgo #include "textflag.h" // // System call support for 386, FreeBSD // // Just jump to package syscall's implementation for all these functions. // The runtime may know about them. TEXT ·Syscall(SB),NOSPLIT,$0-28 JMP syscall·Syscall(SB) TEXT ·Syscall6(SB),NOSPLIT,$0-40 JMP syscall·Syscall6(SB) TEXT ·Syscall9(SB),NOSPLIT,$0-52 JMP syscall·Syscall9(SB) TEXT ·RawSyscall(SB),NOSPLIT,$0-28 JMP syscall·RawSyscall(SB) TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 JMP syscall·RawSyscall6(SB) ================================================ FILE: vendor/golang.org/x/sys/unix/asm_freebsd_amd64.s ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !gccgo #include "textflag.h" // // System call support for AMD64, FreeBSD // // Just jump to package syscall's implementation for all these functions. // The runtime may know about them. TEXT ·Syscall(SB),NOSPLIT,$0-56 JMP syscall·Syscall(SB) TEXT ·Syscall6(SB),NOSPLIT,$0-80 JMP syscall·Syscall6(SB) TEXT ·Syscall9(SB),NOSPLIT,$0-104 JMP syscall·Syscall9(SB) TEXT ·RawSyscall(SB),NOSPLIT,$0-56 JMP syscall·RawSyscall(SB) TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 JMP syscall·RawSyscall6(SB) ================================================ FILE: vendor/golang.org/x/sys/unix/asm_freebsd_arm.s ================================================ // Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !gccgo #include "textflag.h" // // System call support for ARM, FreeBSD // // Just jump to package syscall's implementation for all these functions. // The runtime may know about them. TEXT ·Syscall(SB),NOSPLIT,$0-28 B syscall·Syscall(SB) TEXT ·Syscall6(SB),NOSPLIT,$0-40 B syscall·Syscall6(SB) TEXT ·Syscall9(SB),NOSPLIT,$0-52 B syscall·Syscall9(SB) TEXT ·RawSyscall(SB),NOSPLIT,$0-28 B syscall·RawSyscall(SB) TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 B syscall·RawSyscall6(SB) ================================================ FILE: vendor/golang.org/x/sys/unix/asm_linux_386.s ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !gccgo #include "textflag.h" // // System calls for 386, Linux // // Just jump to package syscall's implementation for all these functions. // The runtime may know about them. TEXT ·Syscall(SB),NOSPLIT,$0-28 JMP syscall·Syscall(SB) TEXT ·Syscall6(SB),NOSPLIT,$0-40 JMP syscall·Syscall6(SB) TEXT ·RawSyscall(SB),NOSPLIT,$0-28 JMP syscall·RawSyscall(SB) TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 JMP syscall·RawSyscall6(SB) TEXT ·socketcall(SB),NOSPLIT,$0-36 JMP syscall·socketcall(SB) TEXT ·rawsocketcall(SB),NOSPLIT,$0-36 JMP syscall·rawsocketcall(SB) TEXT ·seek(SB),NOSPLIT,$0-28 JMP syscall·seek(SB) ================================================ FILE: vendor/golang.org/x/sys/unix/asm_linux_amd64.s ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !gccgo #include "textflag.h" // // System calls for AMD64, Linux // // Just jump to package syscall's implementation for all these functions. // The runtime may know about them. TEXT ·Syscall(SB),NOSPLIT,$0-56 JMP syscall·Syscall(SB) TEXT ·Syscall6(SB),NOSPLIT,$0-80 JMP syscall·Syscall6(SB) TEXT ·RawSyscall(SB),NOSPLIT,$0-56 JMP syscall·RawSyscall(SB) TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 JMP syscall·RawSyscall6(SB) TEXT ·gettimeofday(SB),NOSPLIT,$0-16 JMP syscall·gettimeofday(SB) ================================================ FILE: vendor/golang.org/x/sys/unix/asm_linux_arm.s ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !gccgo #include "textflag.h" // // System calls for arm, Linux // // Just jump to package syscall's implementation for all these functions. // The runtime may know about them. TEXT ·Syscall(SB),NOSPLIT,$0-28 B syscall·Syscall(SB) TEXT ·Syscall6(SB),NOSPLIT,$0-40 B syscall·Syscall6(SB) TEXT ·RawSyscall(SB),NOSPLIT,$0-28 B syscall·RawSyscall(SB) TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 B syscall·RawSyscall6(SB) TEXT ·seek(SB),NOSPLIT,$0-32 B syscall·seek(SB) ================================================ FILE: vendor/golang.org/x/sys/unix/asm_linux_arm64.s ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build linux // +build arm64 // +build !gccgo #include "textflag.h" // Just jump to package syscall's implementation for all these functions. // The runtime may know about them. TEXT ·Syscall(SB),NOSPLIT,$0-56 B syscall·Syscall(SB) TEXT ·Syscall6(SB),NOSPLIT,$0-80 B syscall·Syscall6(SB) TEXT ·RawSyscall(SB),NOSPLIT,$0-56 B syscall·RawSyscall(SB) TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 B syscall·RawSyscall6(SB) ================================================ FILE: vendor/golang.org/x/sys/unix/asm_linux_mips64x.s ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build linux // +build mips64 mips64le // +build !gccgo #include "textflag.h" // // System calls for mips64, Linux // // Just jump to package syscall's implementation for all these functions. // The runtime may know about them. TEXT ·Syscall(SB),NOSPLIT,$0-56 JMP syscall·Syscall(SB) TEXT ·Syscall6(SB),NOSPLIT,$0-80 JMP syscall·Syscall6(SB) TEXT ·RawSyscall(SB),NOSPLIT,$0-56 JMP syscall·RawSyscall(SB) TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 JMP syscall·RawSyscall6(SB) ================================================ FILE: vendor/golang.org/x/sys/unix/asm_linux_mipsx.s ================================================ // Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build linux // +build mips mipsle // +build !gccgo #include "textflag.h" // // System calls for mips, Linux // // Just jump to package syscall's implementation for all these functions. // The runtime may know about them. TEXT ·Syscall(SB),NOSPLIT,$0-28 JMP syscall·Syscall(SB) TEXT ·Syscall6(SB),NOSPLIT,$0-40 JMP syscall·Syscall6(SB) TEXT ·Syscall9(SB),NOSPLIT,$0-52 JMP syscall·Syscall9(SB) TEXT ·RawSyscall(SB),NOSPLIT,$0-28 JMP syscall·RawSyscall(SB) TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 JMP syscall·RawSyscall6(SB) ================================================ FILE: vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s ================================================ // Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build linux // +build ppc64 ppc64le // +build !gccgo #include "textflag.h" // // System calls for ppc64, Linux // // Just jump to package syscall's implementation for all these functions. // The runtime may know about them. TEXT ·Syscall(SB),NOSPLIT,$0-56 BR syscall·Syscall(SB) TEXT ·Syscall6(SB),NOSPLIT,$0-80 BR syscall·Syscall6(SB) TEXT ·RawSyscall(SB),NOSPLIT,$0-56 BR syscall·RawSyscall(SB) TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 BR syscall·RawSyscall6(SB) ================================================ FILE: vendor/golang.org/x/sys/unix/asm_linux_s390x.s ================================================ // Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build s390x // +build linux // +build !gccgo #include "textflag.h" // // System calls for s390x, Linux // // Just jump to package syscall's implementation for all these functions. // The runtime may know about them. TEXT ·Syscall(SB),NOSPLIT,$0-56 BR syscall·Syscall(SB) TEXT ·Syscall6(SB),NOSPLIT,$0-80 BR syscall·Syscall6(SB) TEXT ·RawSyscall(SB),NOSPLIT,$0-56 BR syscall·RawSyscall(SB) TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 BR syscall·RawSyscall6(SB) ================================================ FILE: vendor/golang.org/x/sys/unix/asm_netbsd_386.s ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !gccgo #include "textflag.h" // // System call support for 386, NetBSD // // Just jump to package syscall's implementation for all these functions. // The runtime may know about them. TEXT ·Syscall(SB),NOSPLIT,$0-28 JMP syscall·Syscall(SB) TEXT ·Syscall6(SB),NOSPLIT,$0-40 JMP syscall·Syscall6(SB) TEXT ·Syscall9(SB),NOSPLIT,$0-52 JMP syscall·Syscall9(SB) TEXT ·RawSyscall(SB),NOSPLIT,$0-28 JMP syscall·RawSyscall(SB) TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 JMP syscall·RawSyscall6(SB) ================================================ FILE: vendor/golang.org/x/sys/unix/asm_netbsd_amd64.s ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !gccgo #include "textflag.h" // // System call support for AMD64, NetBSD // // Just jump to package syscall's implementation for all these functions. // The runtime may know about them. TEXT ·Syscall(SB),NOSPLIT,$0-56 JMP syscall·Syscall(SB) TEXT ·Syscall6(SB),NOSPLIT,$0-80 JMP syscall·Syscall6(SB) TEXT ·Syscall9(SB),NOSPLIT,$0-104 JMP syscall·Syscall9(SB) TEXT ·RawSyscall(SB),NOSPLIT,$0-56 JMP syscall·RawSyscall(SB) TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 JMP syscall·RawSyscall6(SB) ================================================ FILE: vendor/golang.org/x/sys/unix/asm_netbsd_arm.s ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !gccgo #include "textflag.h" // // System call support for ARM, NetBSD // // Just jump to package syscall's implementation for all these functions. // The runtime may know about them. TEXT ·Syscall(SB),NOSPLIT,$0-28 B syscall·Syscall(SB) TEXT ·Syscall6(SB),NOSPLIT,$0-40 B syscall·Syscall6(SB) TEXT ·Syscall9(SB),NOSPLIT,$0-52 B syscall·Syscall9(SB) TEXT ·RawSyscall(SB),NOSPLIT,$0-28 B syscall·RawSyscall(SB) TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 B syscall·RawSyscall6(SB) ================================================ FILE: vendor/golang.org/x/sys/unix/asm_openbsd_386.s ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !gccgo #include "textflag.h" // // System call support for 386, OpenBSD // // Just jump to package syscall's implementation for all these functions. // The runtime may know about them. TEXT ·Syscall(SB),NOSPLIT,$0-28 JMP syscall·Syscall(SB) TEXT ·Syscall6(SB),NOSPLIT,$0-40 JMP syscall·Syscall6(SB) TEXT ·Syscall9(SB),NOSPLIT,$0-52 JMP syscall·Syscall9(SB) TEXT ·RawSyscall(SB),NOSPLIT,$0-28 JMP syscall·RawSyscall(SB) TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 JMP syscall·RawSyscall6(SB) ================================================ FILE: vendor/golang.org/x/sys/unix/asm_openbsd_amd64.s ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !gccgo #include "textflag.h" // // System call support for AMD64, OpenBSD // // Just jump to package syscall's implementation for all these functions. // The runtime may know about them. TEXT ·Syscall(SB),NOSPLIT,$0-56 JMP syscall·Syscall(SB) TEXT ·Syscall6(SB),NOSPLIT,$0-80 JMP syscall·Syscall6(SB) TEXT ·Syscall9(SB),NOSPLIT,$0-104 JMP syscall·Syscall9(SB) TEXT ·RawSyscall(SB),NOSPLIT,$0-56 JMP syscall·RawSyscall(SB) TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 JMP syscall·RawSyscall6(SB) ================================================ FILE: vendor/golang.org/x/sys/unix/asm_openbsd_arm.s ================================================ // Copyright 2017 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !gccgo #include "textflag.h" // // System call support for ARM, OpenBSD // // Just jump to package syscall's implementation for all these functions. // The runtime may know about them. TEXT ·Syscall(SB),NOSPLIT,$0-28 B syscall·Syscall(SB) TEXT ·Syscall6(SB),NOSPLIT,$0-40 B syscall·Syscall6(SB) TEXT ·Syscall9(SB),NOSPLIT,$0-52 B syscall·Syscall9(SB) TEXT ·RawSyscall(SB),NOSPLIT,$0-28 B syscall·RawSyscall(SB) TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 B syscall·RawSyscall6(SB) ================================================ FILE: vendor/golang.org/x/sys/unix/asm_solaris_amd64.s ================================================ // Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !gccgo #include "textflag.h" // // System calls for amd64, Solaris are implemented in runtime/syscall_solaris.go // TEXT ·sysvicall6(SB),NOSPLIT,$0-88 JMP syscall·sysvicall6(SB) TEXT ·rawSysvicall6(SB),NOSPLIT,$0-88 JMP syscall·rawSysvicall6(SB) ================================================ FILE: vendor/golang.org/x/sys/unix/bluetooth_linux.go ================================================ // Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Bluetooth sockets and messages package unix // Bluetooth Protocols const ( BTPROTO_L2CAP = 0 BTPROTO_HCI = 1 BTPROTO_SCO = 2 BTPROTO_RFCOMM = 3 BTPROTO_BNEP = 4 BTPROTO_CMTP = 5 BTPROTO_HIDP = 6 BTPROTO_AVDTP = 7 ) const ( HCI_CHANNEL_RAW = 0 HCI_CHANNEL_USER = 1 HCI_CHANNEL_MONITOR = 2 HCI_CHANNEL_CONTROL = 3 ) // Socketoption Level const ( SOL_BLUETOOTH = 0x112 SOL_HCI = 0x0 SOL_L2CAP = 0x6 SOL_RFCOMM = 0x12 SOL_SCO = 0x11 ) ================================================ FILE: vendor/golang.org/x/sys/unix/cap_freebsd.go ================================================ // Copyright 2017 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build freebsd package unix import ( errorspkg "errors" "fmt" ) // Go implementation of C mostly found in /usr/src/sys/kern/subr_capability.c const ( // This is the version of CapRights this package understands. See C implementation for parallels. capRightsGoVersion = CAP_RIGHTS_VERSION_00 capArSizeMin = CAP_RIGHTS_VERSION_00 + 2 capArSizeMax = capRightsGoVersion + 2 ) var ( bit2idx = []int{ -1, 0, 1, -1, 2, -1, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, } ) func capidxbit(right uint64) int { return int((right >> 57) & 0x1f) } func rightToIndex(right uint64) (int, error) { idx := capidxbit(right) if idx < 0 || idx >= len(bit2idx) { return -2, fmt.Errorf("index for right 0x%x out of range", right) } return bit2idx[idx], nil } func caprver(right uint64) int { return int(right >> 62) } func capver(rights *CapRights) int { return caprver(rights.Rights[0]) } func caparsize(rights *CapRights) int { return capver(rights) + 2 } // CapRightsSet sets the permissions in setrights in rights. func CapRightsSet(rights *CapRights, setrights []uint64) error { // This is essentially a copy of cap_rights_vset() if capver(rights) != CAP_RIGHTS_VERSION_00 { return fmt.Errorf("bad rights version %d", capver(rights)) } n := caparsize(rights) if n < capArSizeMin || n > capArSizeMax { return errorspkg.New("bad rights size") } for _, right := range setrights { if caprver(right) != CAP_RIGHTS_VERSION_00 { return errorspkg.New("bad right version") } i, err := rightToIndex(right) if err != nil { return err } if i >= n { return errorspkg.New("index overflow") } if capidxbit(rights.Rights[i]) != capidxbit(right) { return errorspkg.New("index mismatch") } rights.Rights[i] |= right if capidxbit(rights.Rights[i]) != capidxbit(right) { return errorspkg.New("index mismatch (after assign)") } } return nil } // CapRightsClear clears the permissions in clearrights from rights. func CapRightsClear(rights *CapRights, clearrights []uint64) error { // This is essentially a copy of cap_rights_vclear() if capver(rights) != CAP_RIGHTS_VERSION_00 { return fmt.Errorf("bad rights version %d", capver(rights)) } n := caparsize(rights) if n < capArSizeMin || n > capArSizeMax { return errorspkg.New("bad rights size") } for _, right := range clearrights { if caprver(right) != CAP_RIGHTS_VERSION_00 { return errorspkg.New("bad right version") } i, err := rightToIndex(right) if err != nil { return err } if i >= n { return errorspkg.New("index overflow") } if capidxbit(rights.Rights[i]) != capidxbit(right) { return errorspkg.New("index mismatch") } rights.Rights[i] &= ^(right & 0x01FFFFFFFFFFFFFF) if capidxbit(rights.Rights[i]) != capidxbit(right) { return errorspkg.New("index mismatch (after assign)") } } return nil } // CapRightsIsSet checks whether all the permissions in setrights are present in rights. func CapRightsIsSet(rights *CapRights, setrights []uint64) (bool, error) { // This is essentially a copy of cap_rights_is_vset() if capver(rights) != CAP_RIGHTS_VERSION_00 { return false, fmt.Errorf("bad rights version %d", capver(rights)) } n := caparsize(rights) if n < capArSizeMin || n > capArSizeMax { return false, errorspkg.New("bad rights size") } for _, right := range setrights { if caprver(right) != CAP_RIGHTS_VERSION_00 { return false, errorspkg.New("bad right version") } i, err := rightToIndex(right) if err != nil { return false, err } if i >= n { return false, errorspkg.New("index overflow") } if capidxbit(rights.Rights[i]) != capidxbit(right) { return false, errorspkg.New("index mismatch") } if (rights.Rights[i] & right) != right { return false, nil } } return true, nil } func capright(idx uint64, bit uint64) uint64 { return ((1 << (57 + idx)) | bit) } // CapRightsInit returns a pointer to an initialised CapRights structure filled with rights. // See man cap_rights_init(3) and rights(4). func CapRightsInit(rights []uint64) (*CapRights, error) { var r CapRights r.Rights[0] = (capRightsGoVersion << 62) | capright(0, 0) r.Rights[1] = capright(1, 0) err := CapRightsSet(&r, rights) if err != nil { return nil, err } return &r, nil } // CapRightsLimit reduces the operations permitted on fd to at most those contained in rights. // The capability rights on fd can never be increased by CapRightsLimit. // See man cap_rights_limit(2) and rights(4). func CapRightsLimit(fd uintptr, rights *CapRights) error { return capRightsLimit(int(fd), rights) } // CapRightsGet returns a CapRights structure containing the operations permitted on fd. // See man cap_rights_get(3) and rights(4). func CapRightsGet(fd uintptr) (*CapRights, error) { r, err := CapRightsInit(nil) if err != nil { return nil, err } err = capRightsGet(capRightsGoVersion, int(fd), r) if err != nil { return nil, err } return r, nil } ================================================ FILE: vendor/golang.org/x/sys/unix/constants.go ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin dragonfly freebsd linux netbsd openbsd solaris package unix const ( R_OK = 0x4 W_OK = 0x2 X_OK = 0x1 ) ================================================ FILE: vendor/golang.org/x/sys/unix/dev_darwin.go ================================================ // Copyright 2017 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Functions to access/create device major and minor numbers matching the // encoding used in Darwin's sys/types.h header. package unix // Major returns the major component of a Darwin device number. func Major(dev uint64) uint32 { return uint32((dev >> 24) & 0xff) } // Minor returns the minor component of a Darwin device number. func Minor(dev uint64) uint32 { return uint32(dev & 0xffffff) } // Mkdev returns a Darwin device number generated from the given major and minor // components. func Mkdev(major, minor uint32) uint64 { return (uint64(major) << 24) | uint64(minor) } ================================================ FILE: vendor/golang.org/x/sys/unix/dev_dragonfly.go ================================================ // Copyright 2017 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Functions to access/create device major and minor numbers matching the // encoding used in Dragonfly's sys/types.h header. // // The information below is extracted and adapted from sys/types.h: // // Minor gives a cookie instead of an index since in order to avoid changing the // meanings of bits 0-15 or wasting time and space shifting bits 16-31 for // devices that don't use them. package unix // Major returns the major component of a DragonFlyBSD device number. func Major(dev uint64) uint32 { return uint32((dev >> 8) & 0xff) } // Minor returns the minor component of a DragonFlyBSD device number. func Minor(dev uint64) uint32 { return uint32(dev & 0xffff00ff) } // Mkdev returns a DragonFlyBSD device number generated from the given major and // minor components. func Mkdev(major, minor uint32) uint64 { return (uint64(major) << 8) | uint64(minor) } ================================================ FILE: vendor/golang.org/x/sys/unix/dev_freebsd.go ================================================ // Copyright 2017 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Functions to access/create device major and minor numbers matching the // encoding used in FreeBSD's sys/types.h header. // // The information below is extracted and adapted from sys/types.h: // // Minor gives a cookie instead of an index since in order to avoid changing the // meanings of bits 0-15 or wasting time and space shifting bits 16-31 for // devices that don't use them. package unix // Major returns the major component of a FreeBSD device number. func Major(dev uint64) uint32 { return uint32((dev >> 8) & 0xff) } // Minor returns the minor component of a FreeBSD device number. func Minor(dev uint64) uint32 { return uint32(dev & 0xffff00ff) } // Mkdev returns a FreeBSD device number generated from the given major and // minor components. func Mkdev(major, minor uint32) uint64 { return (uint64(major) << 8) | uint64(minor) } ================================================ FILE: vendor/golang.org/x/sys/unix/dev_linux.go ================================================ // Copyright 2017 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Functions to access/create device major and minor numbers matching the // encoding used by the Linux kernel and glibc. // // The information below is extracted and adapted from bits/sysmacros.h in the // glibc sources: // // dev_t in glibc is 64-bit, with 32-bit major and minor numbers. glibc's // default encoding is MMMM Mmmm mmmM MMmm, where M is a hex digit of the major // number and m is a hex digit of the minor number. This is backward compatible // with legacy systems where dev_t is 16 bits wide, encoded as MMmm. It is also // backward compatible with the Linux kernel, which for some architectures uses // 32-bit dev_t, encoded as mmmM MMmm. package unix // Major returns the major component of a Linux device number. func Major(dev uint64) uint32 { major := uint32((dev & 0x00000000000fff00) >> 8) major |= uint32((dev & 0xfffff00000000000) >> 32) return major } // Minor returns the minor component of a Linux device number. func Minor(dev uint64) uint32 { minor := uint32((dev & 0x00000000000000ff) >> 0) minor |= uint32((dev & 0x00000ffffff00000) >> 12) return minor } // Mkdev returns a Linux device number generated from the given major and minor // components. func Mkdev(major, minor uint32) uint64 { dev := (uint64(major) & 0x00000fff) << 8 dev |= (uint64(major) & 0xfffff000) << 32 dev |= (uint64(minor) & 0x000000ff) << 0 dev |= (uint64(minor) & 0xffffff00) << 12 return dev } ================================================ FILE: vendor/golang.org/x/sys/unix/dev_netbsd.go ================================================ // Copyright 2017 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Functions to access/create device major and minor numbers matching the // encoding used in NetBSD's sys/types.h header. package unix // Major returns the major component of a NetBSD device number. func Major(dev uint64) uint32 { return uint32((dev & 0x000fff00) >> 8) } // Minor returns the minor component of a NetBSD device number. func Minor(dev uint64) uint32 { minor := uint32((dev & 0x000000ff) >> 0) minor |= uint32((dev & 0xfff00000) >> 12) return minor } // Mkdev returns a NetBSD device number generated from the given major and minor // components. func Mkdev(major, minor uint32) uint64 { dev := (uint64(major) << 8) & 0x000fff00 dev |= (uint64(minor) << 12) & 0xfff00000 dev |= (uint64(minor) << 0) & 0x000000ff return dev } ================================================ FILE: vendor/golang.org/x/sys/unix/dev_openbsd.go ================================================ // Copyright 2017 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Functions to access/create device major and minor numbers matching the // encoding used in OpenBSD's sys/types.h header. package unix // Major returns the major component of an OpenBSD device number. func Major(dev uint64) uint32 { return uint32((dev & 0x0000ff00) >> 8) } // Minor returns the minor component of an OpenBSD device number. func Minor(dev uint64) uint32 { minor := uint32((dev & 0x000000ff) >> 0) minor |= uint32((dev & 0xffff0000) >> 8) return minor } // Mkdev returns an OpenBSD device number generated from the given major and minor // components. func Mkdev(major, minor uint32) uint64 { dev := (uint64(major) << 8) & 0x0000ff00 dev |= (uint64(minor) << 8) & 0xffff0000 dev |= (uint64(minor) << 0) & 0x000000ff return dev } ================================================ FILE: vendor/golang.org/x/sys/unix/dirent.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris package unix import "unsafe" // readInt returns the size-bytes unsigned integer in native byte order at offset off. func readInt(b []byte, off, size uintptr) (u uint64, ok bool) { if len(b) < int(off+size) { return 0, false } if isBigEndian { return readIntBE(b[off:], size), true } return readIntLE(b[off:], size), true } func readIntBE(b []byte, size uintptr) uint64 { switch size { case 1: return uint64(b[0]) case 2: _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808 return uint64(b[1]) | uint64(b[0])<<8 case 4: _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808 return uint64(b[3]) | uint64(b[2])<<8 | uint64(b[1])<<16 | uint64(b[0])<<24 case 8: _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808 return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 | uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56 default: panic("syscall: readInt with unsupported size") } } func readIntLE(b []byte, size uintptr) uint64 { switch size { case 1: return uint64(b[0]) case 2: _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808 return uint64(b[0]) | uint64(b[1])<<8 case 4: _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808 return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 case 8: _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808 return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 default: panic("syscall: readInt with unsupported size") } } // ParseDirent parses up to max directory entries in buf, // appending the names to names. It returns the number of // bytes consumed from buf, the number of entries added // to names, and the new names slice. func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) { origlen := len(buf) count = 0 for max != 0 && len(buf) > 0 { reclen, ok := direntReclen(buf) if !ok || reclen > uint64(len(buf)) { return origlen, count, names } rec := buf[:reclen] buf = buf[reclen:] ino, ok := direntIno(rec) if !ok { break } if ino == 0 { // File absent in directory. continue } const namoff = uint64(unsafe.Offsetof(Dirent{}.Name)) namlen, ok := direntNamlen(rec) if !ok || namoff+namlen > uint64(len(rec)) { break } name := rec[namoff : namoff+namlen] for i, c := range name { if c == 0 { name = name[:i] break } } // Check for useless names before allocating a string. if string(name) == "." || string(name) == ".." { continue } max-- count++ names = append(names, string(name)) } return origlen - len(buf), count, names } ================================================ FILE: vendor/golang.org/x/sys/unix/endian_big.go ================================================ // Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // // +build ppc64 s390x mips mips64 package unix const isBigEndian = true ================================================ FILE: vendor/golang.org/x/sys/unix/endian_little.go ================================================ // Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // // +build 386 amd64 amd64p32 arm arm64 ppc64le mipsle mips64le package unix const isBigEndian = false ================================================ FILE: vendor/golang.org/x/sys/unix/env_unix.go ================================================ // Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin dragonfly freebsd linux netbsd openbsd solaris // Unix environment variables. package unix import "syscall" func Getenv(key string) (value string, found bool) { return syscall.Getenv(key) } func Setenv(key, value string) error { return syscall.Setenv(key, value) } func Clearenv() { syscall.Clearenv() } func Environ() []string { return syscall.Environ() } ================================================ FILE: vendor/golang.org/x/sys/unix/env_unset.go ================================================ // Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build go1.4 package unix import "syscall" func Unsetenv(key string) error { // This was added in Go 1.4. return syscall.Unsetenv(key) } ================================================ FILE: vendor/golang.org/x/sys/unix/errors_freebsd_386.go ================================================ // Copyright 2017 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Constants that were deprecated or moved to enums in the FreeBSD headers. Keep // them here for backwards compatibility. package unix const ( IFF_SMART = 0x20 IFT_1822 = 0x2 IFT_A12MPPSWITCH = 0x82 IFT_AAL2 = 0xbb IFT_AAL5 = 0x31 IFT_ADSL = 0x5e IFT_AFLANE8023 = 0x3b IFT_AFLANE8025 = 0x3c IFT_ARAP = 0x58 IFT_ARCNET = 0x23 IFT_ARCNETPLUS = 0x24 IFT_ASYNC = 0x54 IFT_ATM = 0x25 IFT_ATMDXI = 0x69 IFT_ATMFUNI = 0x6a IFT_ATMIMA = 0x6b IFT_ATMLOGICAL = 0x50 IFT_ATMRADIO = 0xbd IFT_ATMSUBINTERFACE = 0x86 IFT_ATMVCIENDPT = 0xc2 IFT_ATMVIRTUAL = 0x95 IFT_BGPPOLICYACCOUNTING = 0xa2 IFT_BSC = 0x53 IFT_CCTEMUL = 0x3d IFT_CEPT = 0x13 IFT_CES = 0x85 IFT_CHANNEL = 0x46 IFT_CNR = 0x55 IFT_COFFEE = 0x84 IFT_COMPOSITELINK = 0x9b IFT_DCN = 0x8d IFT_DIGITALPOWERLINE = 0x8a IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba IFT_DLSW = 0x4a IFT_DOCSCABLEDOWNSTREAM = 0x80 IFT_DOCSCABLEMACLAYER = 0x7f IFT_DOCSCABLEUPSTREAM = 0x81 IFT_DS0 = 0x51 IFT_DS0BUNDLE = 0x52 IFT_DS1FDL = 0xaa IFT_DS3 = 0x1e IFT_DTM = 0x8c IFT_DVBASILN = 0xac IFT_DVBASIOUT = 0xad IFT_DVBRCCDOWNSTREAM = 0x93 IFT_DVBRCCMACLAYER = 0x92 IFT_DVBRCCUPSTREAM = 0x94 IFT_ENC = 0xf4 IFT_EON = 0x19 IFT_EPLRS = 0x57 IFT_ESCON = 0x49 IFT_ETHER = 0x6 IFT_FAITH = 0xf2 IFT_FAST = 0x7d IFT_FASTETHER = 0x3e IFT_FASTETHERFX = 0x45 IFT_FDDI = 0xf IFT_FIBRECHANNEL = 0x38 IFT_FRAMERELAYINTERCONNECT = 0x3a IFT_FRAMERELAYMPI = 0x5c IFT_FRDLCIENDPT = 0xc1 IFT_FRELAY = 0x20 IFT_FRELAYDCE = 0x2c IFT_FRF16MFRBUNDLE = 0xa3 IFT_FRFORWARD = 0x9e IFT_G703AT2MB = 0x43 IFT_G703AT64K = 0x42 IFT_GIF = 0xf0 IFT_GIGABITETHERNET = 0x75 IFT_GR303IDT = 0xb2 IFT_GR303RDT = 0xb1 IFT_H323GATEKEEPER = 0xa4 IFT_H323PROXY = 0xa5 IFT_HDH1822 = 0x3 IFT_HDLC = 0x76 IFT_HDSL2 = 0xa8 IFT_HIPERLAN2 = 0xb7 IFT_HIPPI = 0x2f IFT_HIPPIINTERFACE = 0x39 IFT_HOSTPAD = 0x5a IFT_HSSI = 0x2e IFT_HY = 0xe IFT_IBM370PARCHAN = 0x48 IFT_IDSL = 0x9a IFT_IEEE80211 = 0x47 IFT_IEEE80212 = 0x37 IFT_IEEE8023ADLAG = 0xa1 IFT_IFGSN = 0x91 IFT_IMT = 0xbe IFT_INTERLEAVE = 0x7c IFT_IP = 0x7e IFT_IPFORWARD = 0x8e IFT_IPOVERATM = 0x72 IFT_IPOVERCDLC = 0x6d IFT_IPOVERCLAW = 0x6e IFT_IPSWITCH = 0x4e IFT_IPXIP = 0xf9 IFT_ISDN = 0x3f IFT_ISDNBASIC = 0x14 IFT_ISDNPRIMARY = 0x15 IFT_ISDNS = 0x4b IFT_ISDNU = 0x4c IFT_ISO88022LLC = 0x29 IFT_ISO88023 = 0x7 IFT_ISO88024 = 0x8 IFT_ISO88025 = 0x9 IFT_ISO88025CRFPINT = 0x62 IFT_ISO88025DTR = 0x56 IFT_ISO88025FIBER = 0x73 IFT_ISO88026 = 0xa IFT_ISUP = 0xb3 IFT_L3IPXVLAN = 0x89 IFT_LAPB = 0x10 IFT_LAPD = 0x4d IFT_LAPF = 0x77 IFT_LOCALTALK = 0x2a IFT_LOOP = 0x18 IFT_MEDIAMAILOVERIP = 0x8b IFT_MFSIGLINK = 0xa7 IFT_MIOX25 = 0x26 IFT_MODEM = 0x30 IFT_MPC = 0x71 IFT_MPLS = 0xa6 IFT_MPLSTUNNEL = 0x96 IFT_MSDSL = 0x8f IFT_MVL = 0xbf IFT_MYRINET = 0x63 IFT_NFAS = 0xaf IFT_NSIP = 0x1b IFT_OPTICALCHANNEL = 0xc3 IFT_OPTICALTRANSPORT = 0xc4 IFT_OTHER = 0x1 IFT_P10 = 0xc IFT_P80 = 0xd IFT_PARA = 0x22 IFT_PFLOG = 0xf6 IFT_PFSYNC = 0xf7 IFT_PLC = 0xae IFT_POS = 0xab IFT_PPPMULTILINKBUNDLE = 0x6c IFT_PROPBWAP2MP = 0xb8 IFT_PROPCNLS = 0x59 IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 IFT_PROPMUX = 0x36 IFT_PROPWIRELESSP2P = 0x9d IFT_PTPSERIAL = 0x16 IFT_PVC = 0xf1 IFT_QLLC = 0x44 IFT_RADIOMAC = 0xbc IFT_RADSL = 0x5f IFT_REACHDSL = 0xc0 IFT_RFC1483 = 0x9f IFT_RS232 = 0x21 IFT_RSRB = 0x4f IFT_SDLC = 0x11 IFT_SDSL = 0x60 IFT_SHDSL = 0xa9 IFT_SIP = 0x1f IFT_SLIP = 0x1c IFT_SMDSDXI = 0x2b IFT_SMDSICIP = 0x34 IFT_SONET = 0x27 IFT_SONETOVERHEADCHANNEL = 0xb9 IFT_SONETPATH = 0x32 IFT_SONETVT = 0x33 IFT_SRP = 0x97 IFT_SS7SIGLINK = 0x9c IFT_STACKTOSTACK = 0x6f IFT_STARLAN = 0xb IFT_STF = 0xd7 IFT_T1 = 0x12 IFT_TDLC = 0x74 IFT_TERMPAD = 0x5b IFT_TR008 = 0xb0 IFT_TRANSPHDLC = 0x7b IFT_TUNNEL = 0x83 IFT_ULTRA = 0x1d IFT_USB = 0xa0 IFT_V11 = 0x40 IFT_V35 = 0x2d IFT_V36 = 0x41 IFT_V37 = 0x78 IFT_VDSL = 0x61 IFT_VIRTUALIPADDRESS = 0x70 IFT_VOICEEM = 0x64 IFT_VOICEENCAP = 0x67 IFT_VOICEFXO = 0x65 IFT_VOICEFXS = 0x66 IFT_VOICEOVERATM = 0x98 IFT_VOICEOVERFRAMERELAY = 0x99 IFT_VOICEOVERIP = 0x68 IFT_X213 = 0x5d IFT_X25 = 0x5 IFT_X25DDN = 0x4 IFT_X25HUNTGROUP = 0x7a IFT_X25MLP = 0x79 IFT_X25PLE = 0x28 IFT_XETHER = 0x1a IPPROTO_MAXID = 0x34 IPV6_FAITH = 0x1d IP_FAITH = 0x16 MAP_NORESERVE = 0x40 MAP_RENAME = 0x20 NET_RT_MAXID = 0x6 RTF_PRCLONING = 0x10000 RTM_OLDADD = 0x9 RTM_OLDDEL = 0xa SIOCADDRT = 0x8030720a SIOCALIFADDR = 0x8118691b SIOCDELRT = 0x8030720b SIOCDLIFADDR = 0x8118691d SIOCGLIFADDR = 0xc118691c SIOCGLIFPHYADDR = 0xc118694b SIOCSLIFPHYADDR = 0x8118694a ) ================================================ FILE: vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go ================================================ // Copyright 2017 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Constants that were deprecated or moved to enums in the FreeBSD headers. Keep // them here for backwards compatibility. package unix const ( IFF_SMART = 0x20 IFT_1822 = 0x2 IFT_A12MPPSWITCH = 0x82 IFT_AAL2 = 0xbb IFT_AAL5 = 0x31 IFT_ADSL = 0x5e IFT_AFLANE8023 = 0x3b IFT_AFLANE8025 = 0x3c IFT_ARAP = 0x58 IFT_ARCNET = 0x23 IFT_ARCNETPLUS = 0x24 IFT_ASYNC = 0x54 IFT_ATM = 0x25 IFT_ATMDXI = 0x69 IFT_ATMFUNI = 0x6a IFT_ATMIMA = 0x6b IFT_ATMLOGICAL = 0x50 IFT_ATMRADIO = 0xbd IFT_ATMSUBINTERFACE = 0x86 IFT_ATMVCIENDPT = 0xc2 IFT_ATMVIRTUAL = 0x95 IFT_BGPPOLICYACCOUNTING = 0xa2 IFT_BSC = 0x53 IFT_CCTEMUL = 0x3d IFT_CEPT = 0x13 IFT_CES = 0x85 IFT_CHANNEL = 0x46 IFT_CNR = 0x55 IFT_COFFEE = 0x84 IFT_COMPOSITELINK = 0x9b IFT_DCN = 0x8d IFT_DIGITALPOWERLINE = 0x8a IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba IFT_DLSW = 0x4a IFT_DOCSCABLEDOWNSTREAM = 0x80 IFT_DOCSCABLEMACLAYER = 0x7f IFT_DOCSCABLEUPSTREAM = 0x81 IFT_DS0 = 0x51 IFT_DS0BUNDLE = 0x52 IFT_DS1FDL = 0xaa IFT_DS3 = 0x1e IFT_DTM = 0x8c IFT_DVBASILN = 0xac IFT_DVBASIOUT = 0xad IFT_DVBRCCDOWNSTREAM = 0x93 IFT_DVBRCCMACLAYER = 0x92 IFT_DVBRCCUPSTREAM = 0x94 IFT_ENC = 0xf4 IFT_EON = 0x19 IFT_EPLRS = 0x57 IFT_ESCON = 0x49 IFT_ETHER = 0x6 IFT_FAITH = 0xf2 IFT_FAST = 0x7d IFT_FASTETHER = 0x3e IFT_FASTETHERFX = 0x45 IFT_FDDI = 0xf IFT_FIBRECHANNEL = 0x38 IFT_FRAMERELAYINTERCONNECT = 0x3a IFT_FRAMERELAYMPI = 0x5c IFT_FRDLCIENDPT = 0xc1 IFT_FRELAY = 0x20 IFT_FRELAYDCE = 0x2c IFT_FRF16MFRBUNDLE = 0xa3 IFT_FRFORWARD = 0x9e IFT_G703AT2MB = 0x43 IFT_G703AT64K = 0x42 IFT_GIF = 0xf0 IFT_GIGABITETHERNET = 0x75 IFT_GR303IDT = 0xb2 IFT_GR303RDT = 0xb1 IFT_H323GATEKEEPER = 0xa4 IFT_H323PROXY = 0xa5 IFT_HDH1822 = 0x3 IFT_HDLC = 0x76 IFT_HDSL2 = 0xa8 IFT_HIPERLAN2 = 0xb7 IFT_HIPPI = 0x2f IFT_HIPPIINTERFACE = 0x39 IFT_HOSTPAD = 0x5a IFT_HSSI = 0x2e IFT_HY = 0xe IFT_IBM370PARCHAN = 0x48 IFT_IDSL = 0x9a IFT_IEEE80211 = 0x47 IFT_IEEE80212 = 0x37 IFT_IEEE8023ADLAG = 0xa1 IFT_IFGSN = 0x91 IFT_IMT = 0xbe IFT_INTERLEAVE = 0x7c IFT_IP = 0x7e IFT_IPFORWARD = 0x8e IFT_IPOVERATM = 0x72 IFT_IPOVERCDLC = 0x6d IFT_IPOVERCLAW = 0x6e IFT_IPSWITCH = 0x4e IFT_IPXIP = 0xf9 IFT_ISDN = 0x3f IFT_ISDNBASIC = 0x14 IFT_ISDNPRIMARY = 0x15 IFT_ISDNS = 0x4b IFT_ISDNU = 0x4c IFT_ISO88022LLC = 0x29 IFT_ISO88023 = 0x7 IFT_ISO88024 = 0x8 IFT_ISO88025 = 0x9 IFT_ISO88025CRFPINT = 0x62 IFT_ISO88025DTR = 0x56 IFT_ISO88025FIBER = 0x73 IFT_ISO88026 = 0xa IFT_ISUP = 0xb3 IFT_L3IPXVLAN = 0x89 IFT_LAPB = 0x10 IFT_LAPD = 0x4d IFT_LAPF = 0x77 IFT_LOCALTALK = 0x2a IFT_LOOP = 0x18 IFT_MEDIAMAILOVERIP = 0x8b IFT_MFSIGLINK = 0xa7 IFT_MIOX25 = 0x26 IFT_MODEM = 0x30 IFT_MPC = 0x71 IFT_MPLS = 0xa6 IFT_MPLSTUNNEL = 0x96 IFT_MSDSL = 0x8f IFT_MVL = 0xbf IFT_MYRINET = 0x63 IFT_NFAS = 0xaf IFT_NSIP = 0x1b IFT_OPTICALCHANNEL = 0xc3 IFT_OPTICALTRANSPORT = 0xc4 IFT_OTHER = 0x1 IFT_P10 = 0xc IFT_P80 = 0xd IFT_PARA = 0x22 IFT_PFLOG = 0xf6 IFT_PFSYNC = 0xf7 IFT_PLC = 0xae IFT_POS = 0xab IFT_PPPMULTILINKBUNDLE = 0x6c IFT_PROPBWAP2MP = 0xb8 IFT_PROPCNLS = 0x59 IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 IFT_PROPMUX = 0x36 IFT_PROPWIRELESSP2P = 0x9d IFT_PTPSERIAL = 0x16 IFT_PVC = 0xf1 IFT_QLLC = 0x44 IFT_RADIOMAC = 0xbc IFT_RADSL = 0x5f IFT_REACHDSL = 0xc0 IFT_RFC1483 = 0x9f IFT_RS232 = 0x21 IFT_RSRB = 0x4f IFT_SDLC = 0x11 IFT_SDSL = 0x60 IFT_SHDSL = 0xa9 IFT_SIP = 0x1f IFT_SLIP = 0x1c IFT_SMDSDXI = 0x2b IFT_SMDSICIP = 0x34 IFT_SONET = 0x27 IFT_SONETOVERHEADCHANNEL = 0xb9 IFT_SONETPATH = 0x32 IFT_SONETVT = 0x33 IFT_SRP = 0x97 IFT_SS7SIGLINK = 0x9c IFT_STACKTOSTACK = 0x6f IFT_STARLAN = 0xb IFT_STF = 0xd7 IFT_T1 = 0x12 IFT_TDLC = 0x74 IFT_TERMPAD = 0x5b IFT_TR008 = 0xb0 IFT_TRANSPHDLC = 0x7b IFT_TUNNEL = 0x83 IFT_ULTRA = 0x1d IFT_USB = 0xa0 IFT_V11 = 0x40 IFT_V35 = 0x2d IFT_V36 = 0x41 IFT_V37 = 0x78 IFT_VDSL = 0x61 IFT_VIRTUALIPADDRESS = 0x70 IFT_VOICEEM = 0x64 IFT_VOICEENCAP = 0x67 IFT_VOICEFXO = 0x65 IFT_VOICEFXS = 0x66 IFT_VOICEOVERATM = 0x98 IFT_VOICEOVERFRAMERELAY = 0x99 IFT_VOICEOVERIP = 0x68 IFT_X213 = 0x5d IFT_X25 = 0x5 IFT_X25DDN = 0x4 IFT_X25HUNTGROUP = 0x7a IFT_X25MLP = 0x79 IFT_X25PLE = 0x28 IFT_XETHER = 0x1a IPPROTO_MAXID = 0x34 IPV6_FAITH = 0x1d IP_FAITH = 0x16 MAP_NORESERVE = 0x40 MAP_RENAME = 0x20 NET_RT_MAXID = 0x6 RTF_PRCLONING = 0x10000 RTM_OLDADD = 0x9 RTM_OLDDEL = 0xa SIOCADDRT = 0x8040720a SIOCALIFADDR = 0x8118691b SIOCDELRT = 0x8040720b SIOCDLIFADDR = 0x8118691d SIOCGLIFADDR = 0xc118691c SIOCGLIFPHYADDR = 0xc118694b SIOCSLIFPHYADDR = 0x8118694a ) ================================================ FILE: vendor/golang.org/x/sys/unix/errors_freebsd_arm.go ================================================ // Copyright 2017 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package unix const ( IFT_1822 = 0x2 IFT_A12MPPSWITCH = 0x82 IFT_AAL2 = 0xbb IFT_AAL5 = 0x31 IFT_ADSL = 0x5e IFT_AFLANE8023 = 0x3b IFT_AFLANE8025 = 0x3c IFT_ARAP = 0x58 IFT_ARCNET = 0x23 IFT_ARCNETPLUS = 0x24 IFT_ASYNC = 0x54 IFT_ATM = 0x25 IFT_ATMDXI = 0x69 IFT_ATMFUNI = 0x6a IFT_ATMIMA = 0x6b IFT_ATMLOGICAL = 0x50 IFT_ATMRADIO = 0xbd IFT_ATMSUBINTERFACE = 0x86 IFT_ATMVCIENDPT = 0xc2 IFT_ATMVIRTUAL = 0x95 IFT_BGPPOLICYACCOUNTING = 0xa2 IFT_BSC = 0x53 IFT_CCTEMUL = 0x3d IFT_CEPT = 0x13 IFT_CES = 0x85 IFT_CHANNEL = 0x46 IFT_CNR = 0x55 IFT_COFFEE = 0x84 IFT_COMPOSITELINK = 0x9b IFT_DCN = 0x8d IFT_DIGITALPOWERLINE = 0x8a IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba IFT_DLSW = 0x4a IFT_DOCSCABLEDOWNSTREAM = 0x80 IFT_DOCSCABLEMACLAYER = 0x7f IFT_DOCSCABLEUPSTREAM = 0x81 IFT_DS0 = 0x51 IFT_DS0BUNDLE = 0x52 IFT_DS1FDL = 0xaa IFT_DS3 = 0x1e IFT_DTM = 0x8c IFT_DVBASILN = 0xac IFT_DVBASIOUT = 0xad IFT_DVBRCCDOWNSTREAM = 0x93 IFT_DVBRCCMACLAYER = 0x92 IFT_DVBRCCUPSTREAM = 0x94 IFT_ENC = 0xf4 IFT_EON = 0x19 IFT_EPLRS = 0x57 IFT_ESCON = 0x49 IFT_ETHER = 0x6 IFT_FAST = 0x7d IFT_FASTETHER = 0x3e IFT_FASTETHERFX = 0x45 IFT_FDDI = 0xf IFT_FIBRECHANNEL = 0x38 IFT_FRAMERELAYINTERCONNECT = 0x3a IFT_FRAMERELAYMPI = 0x5c IFT_FRDLCIENDPT = 0xc1 IFT_FRELAY = 0x20 IFT_FRELAYDCE = 0x2c IFT_FRF16MFRBUNDLE = 0xa3 IFT_FRFORWARD = 0x9e IFT_G703AT2MB = 0x43 IFT_G703AT64K = 0x42 IFT_GIF = 0xf0 IFT_GIGABITETHERNET = 0x75 IFT_GR303IDT = 0xb2 IFT_GR303RDT = 0xb1 IFT_H323GATEKEEPER = 0xa4 IFT_H323PROXY = 0xa5 IFT_HDH1822 = 0x3 IFT_HDLC = 0x76 IFT_HDSL2 = 0xa8 IFT_HIPERLAN2 = 0xb7 IFT_HIPPI = 0x2f IFT_HIPPIINTERFACE = 0x39 IFT_HOSTPAD = 0x5a IFT_HSSI = 0x2e IFT_HY = 0xe IFT_IBM370PARCHAN = 0x48 IFT_IDSL = 0x9a IFT_IEEE80211 = 0x47 IFT_IEEE80212 = 0x37 IFT_IEEE8023ADLAG = 0xa1 IFT_IFGSN = 0x91 IFT_IMT = 0xbe IFT_INTERLEAVE = 0x7c IFT_IP = 0x7e IFT_IPFORWARD = 0x8e IFT_IPOVERATM = 0x72 IFT_IPOVERCDLC = 0x6d IFT_IPOVERCLAW = 0x6e IFT_IPSWITCH = 0x4e IFT_ISDN = 0x3f IFT_ISDNBASIC = 0x14 IFT_ISDNPRIMARY = 0x15 IFT_ISDNS = 0x4b IFT_ISDNU = 0x4c IFT_ISO88022LLC = 0x29 IFT_ISO88023 = 0x7 IFT_ISO88024 = 0x8 IFT_ISO88025 = 0x9 IFT_ISO88025CRFPINT = 0x62 IFT_ISO88025DTR = 0x56 IFT_ISO88025FIBER = 0x73 IFT_ISO88026 = 0xa IFT_ISUP = 0xb3 IFT_L3IPXVLAN = 0x89 IFT_LAPB = 0x10 IFT_LAPD = 0x4d IFT_LAPF = 0x77 IFT_LOCALTALK = 0x2a IFT_LOOP = 0x18 IFT_MEDIAMAILOVERIP = 0x8b IFT_MFSIGLINK = 0xa7 IFT_MIOX25 = 0x26 IFT_MODEM = 0x30 IFT_MPC = 0x71 IFT_MPLS = 0xa6 IFT_MPLSTUNNEL = 0x96 IFT_MSDSL = 0x8f IFT_MVL = 0xbf IFT_MYRINET = 0x63 IFT_NFAS = 0xaf IFT_NSIP = 0x1b IFT_OPTICALCHANNEL = 0xc3 IFT_OPTICALTRANSPORT = 0xc4 IFT_OTHER = 0x1 IFT_P10 = 0xc IFT_P80 = 0xd IFT_PARA = 0x22 IFT_PFLOG = 0xf6 IFT_PFSYNC = 0xf7 IFT_PLC = 0xae IFT_POS = 0xab IFT_PPPMULTILINKBUNDLE = 0x6c IFT_PROPBWAP2MP = 0xb8 IFT_PROPCNLS = 0x59 IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 IFT_PROPMUX = 0x36 IFT_PROPWIRELESSP2P = 0x9d IFT_PTPSERIAL = 0x16 IFT_PVC = 0xf1 IFT_QLLC = 0x44 IFT_RADIOMAC = 0xbc IFT_RADSL = 0x5f IFT_REACHDSL = 0xc0 IFT_RFC1483 = 0x9f IFT_RS232 = 0x21 IFT_RSRB = 0x4f IFT_SDLC = 0x11 IFT_SDSL = 0x60 IFT_SHDSL = 0xa9 IFT_SIP = 0x1f IFT_SLIP = 0x1c IFT_SMDSDXI = 0x2b IFT_SMDSICIP = 0x34 IFT_SONET = 0x27 IFT_SONETOVERHEADCHANNEL = 0xb9 IFT_SONETPATH = 0x32 IFT_SONETVT = 0x33 IFT_SRP = 0x97 IFT_SS7SIGLINK = 0x9c IFT_STACKTOSTACK = 0x6f IFT_STARLAN = 0xb IFT_STF = 0xd7 IFT_T1 = 0x12 IFT_TDLC = 0x74 IFT_TERMPAD = 0x5b IFT_TR008 = 0xb0 IFT_TRANSPHDLC = 0x7b IFT_TUNNEL = 0x83 IFT_ULTRA = 0x1d IFT_USB = 0xa0 IFT_V11 = 0x40 IFT_V35 = 0x2d IFT_V36 = 0x41 IFT_V37 = 0x78 IFT_VDSL = 0x61 IFT_VIRTUALIPADDRESS = 0x70 IFT_VOICEEM = 0x64 IFT_VOICEENCAP = 0x67 IFT_VOICEFXO = 0x65 IFT_VOICEFXS = 0x66 IFT_VOICEOVERATM = 0x98 IFT_VOICEOVERFRAMERELAY = 0x99 IFT_VOICEOVERIP = 0x68 IFT_X213 = 0x5d IFT_X25 = 0x5 IFT_X25DDN = 0x4 IFT_X25HUNTGROUP = 0x7a IFT_X25MLP = 0x79 IFT_X25PLE = 0x28 IFT_XETHER = 0x1a // missing constants on FreeBSD-11.1-RELEASE, copied from old values in ztypes_freebsd_arm.go IFF_SMART = 0x20 IFT_FAITH = 0xf2 IFT_IPXIP = 0xf9 IPPROTO_MAXID = 0x34 IPV6_FAITH = 0x1d IP_FAITH = 0x16 MAP_NORESERVE = 0x40 MAP_RENAME = 0x20 NET_RT_MAXID = 0x6 RTF_PRCLONING = 0x10000 RTM_OLDADD = 0x9 RTM_OLDDEL = 0xa SIOCADDRT = 0x8030720a SIOCALIFADDR = 0x8118691b SIOCDELRT = 0x8030720b SIOCDLIFADDR = 0x8118691d SIOCGLIFADDR = 0xc118691c SIOCGLIFPHYADDR = 0xc118694b SIOCSLIFPHYADDR = 0x8118694a ) ================================================ FILE: vendor/golang.org/x/sys/unix/flock.go ================================================ // Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin dragonfly freebsd linux netbsd openbsd package unix import "unsafe" // fcntl64Syscall is usually SYS_FCNTL, but is overridden on 32-bit Linux // systems by flock_linux_32bit.go to be SYS_FCNTL64. var fcntl64Syscall uintptr = SYS_FCNTL // FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command. func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error { _, _, errno := Syscall(fcntl64Syscall, fd, uintptr(cmd), uintptr(unsafe.Pointer(lk))) if errno == 0 { return nil } return errno } ================================================ FILE: vendor/golang.org/x/sys/unix/flock_linux_32bit.go ================================================ // +build linux,386 linux,arm linux,mips linux,mipsle // Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package unix func init() { // On 32-bit Linux systems, the fcntl syscall that matches Go's // Flock_t type is SYS_FCNTL64, not SYS_FCNTL. fcntl64Syscall = SYS_FCNTL64 } ================================================ FILE: vendor/golang.org/x/sys/unix/gccgo.go ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build gccgo package unix import "syscall" // We can't use the gc-syntax .s files for gccgo. On the plus side // much of the functionality can be written directly in Go. //extern gccgoRealSyscall func realSyscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r, errno uintptr) func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) { syscall.Entersyscall() r, errno := realSyscall(trap, a1, a2, a3, 0, 0, 0, 0, 0, 0) syscall.Exitsyscall() return r, 0, syscall.Errno(errno) } func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) { syscall.Entersyscall() r, errno := realSyscall(trap, a1, a2, a3, a4, a5, a6, 0, 0, 0) syscall.Exitsyscall() return r, 0, syscall.Errno(errno) } func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) { syscall.Entersyscall() r, errno := realSyscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9) syscall.Exitsyscall() return r, 0, syscall.Errno(errno) } func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) { r, errno := realSyscall(trap, a1, a2, a3, 0, 0, 0, 0, 0, 0) return r, 0, syscall.Errno(errno) } func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) { r, errno := realSyscall(trap, a1, a2, a3, a4, a5, a6, 0, 0, 0) return r, 0, syscall.Errno(errno) } ================================================ FILE: vendor/golang.org/x/sys/unix/gccgo_c.c ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build gccgo #include <errno.h> #include <stdint.h> #include <unistd.h> #define _STRINGIFY2_(x) #x #define _STRINGIFY_(x) _STRINGIFY2_(x) #define GOSYM_PREFIX _STRINGIFY_(__USER_LABEL_PREFIX__) // Call syscall from C code because the gccgo support for calling from // Go to C does not support varargs functions. struct ret { uintptr_t r; uintptr_t err; }; struct ret gccgoRealSyscall(uintptr_t trap, uintptr_t a1, uintptr_t a2, uintptr_t a3, uintptr_t a4, uintptr_t a5, uintptr_t a6, uintptr_t a7, uintptr_t a8, uintptr_t a9) { struct ret r; errno = 0; r.r = syscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9); r.err = errno; return r; } // Define the use function in C so that it is not inlined. extern void use(void *) __asm__ (GOSYM_PREFIX GOPKGPATH ".use") __attribute__((noinline)); void use(void *p __attribute__ ((unused))) { } ================================================ FILE: vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build gccgo,linux,amd64 package unix import "syscall" //extern gettimeofday func realGettimeofday(*Timeval, *byte) int32 func gettimeofday(tv *Timeval) (err syscall.Errno) { r := realGettimeofday(tv, nil) if r < 0 { return syscall.GetErrno() } return 0 } ================================================ FILE: vendor/golang.org/x/sys/unix/mkall.sh ================================================ #!/usr/bin/env bash # Copyright 2009 The Go Authors. All rights reserved. # Use of this source code is governed by a BSD-style # license that can be found in the LICENSE file. # This script runs or (given -n) prints suggested commands to generate files for # the Architecture/OS specified by the GOARCH and GOOS environment variables. # See README.md for more information about how the build system works. GOOSARCH="${GOOS}_${GOARCH}" # defaults mksyscall="./mksyscall.pl" mkerrors="./mkerrors.sh" zerrors="zerrors_$GOOSARCH.go" mksysctl="" zsysctl="zsysctl_$GOOSARCH.go" mksysnum= mktypes= run="sh" cmd="" case "$1" in -syscalls) for i in zsyscall*go do # Run the command line that appears in the first line # of the generated file to regenerate it. sed 1q $i | sed 's;^// ;;' | sh > _$i && gofmt < _$i > $i rm _$i done exit 0 ;; -n) run="cat" cmd="echo" shift esac case "$#" in 0) ;; *) echo 'usage: mkall.sh [-n]' 1>&2 exit 2 esac if [[ "$GOOS" = "linux" ]] && [[ "$GOARCH" != "sparc64" ]]; then # Use then new build system # Files generated through docker (use $cmd so you can Ctl-C the build or run) $cmd docker build --tag generate:$GOOS $GOOS $cmd docker run --interactive --tty --volume $(dirname "$(readlink -f "$0")"):/build generate:$GOOS exit fi GOOSARCH_in=syscall_$GOOSARCH.go case "$GOOSARCH" in _* | *_ | _) echo 'undefined $GOOS_$GOARCH:' "$GOOSARCH" 1>&2 exit 1 ;; darwin_386) mkerrors="$mkerrors -m32" mksyscall="./mksyscall.pl -l32" mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk macosx)/usr/include/sys/syscall.h" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; darwin_amd64) mkerrors="$mkerrors -m64" mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk macosx)/usr/include/sys/syscall.h" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; darwin_arm) mkerrors="$mkerrors" mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk iphoneos)/usr/include/sys/syscall.h" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; darwin_arm64) mkerrors="$mkerrors -m64" mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk iphoneos)/usr/include/sys/syscall.h" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; dragonfly_386) mkerrors="$mkerrors -m32" mksyscall="./mksyscall.pl -l32 -dragonfly" mksysnum="curl -s 'http://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/sys/kern/syscalls.master' | ./mksysnum_dragonfly.pl" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; dragonfly_amd64) mkerrors="$mkerrors -m64" mksyscall="./mksyscall.pl -dragonfly" mksysnum="curl -s 'http://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/sys/kern/syscalls.master' | ./mksysnum_dragonfly.pl" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; freebsd_386) mkerrors="$mkerrors -m32" mksyscall="./mksyscall.pl -l32" mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; freebsd_amd64) mkerrors="$mkerrors -m64" mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; freebsd_arm) mkerrors="$mkerrors" mksyscall="./mksyscall.pl -l32 -arm" mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl" # Let the type of C char be signed for making the bare syscall # API consistent across platforms. mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" ;; linux_sparc64) GOOSARCH_in=syscall_linux_sparc64.go unistd_h=/usr/include/sparc64-linux-gnu/asm/unistd.h mkerrors="$mkerrors -m64" mksysnum="./mksysnum_linux.pl $unistd_h" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; netbsd_386) mkerrors="$mkerrors -m32" mksyscall="./mksyscall.pl -l32 -netbsd" mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; netbsd_amd64) mkerrors="$mkerrors -m64" mksyscall="./mksyscall.pl -netbsd" mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; netbsd_arm) mkerrors="$mkerrors" mksyscall="./mksyscall.pl -l32 -netbsd -arm" mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl" # Let the type of C char be signed for making the bare syscall # API consistent across platforms. mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" ;; openbsd_386) mkerrors="$mkerrors -m32" mksyscall="./mksyscall.pl -l32 -openbsd" mksysctl="./mksysctl_openbsd.pl" mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; openbsd_amd64) mkerrors="$mkerrors -m64" mksyscall="./mksyscall.pl -openbsd" mksysctl="./mksysctl_openbsd.pl" mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; openbsd_arm) mkerrors="$mkerrors" mksyscall="./mksyscall.pl -l32 -openbsd -arm" mksysctl="./mksysctl_openbsd.pl" mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" # Let the type of C char be signed for making the bare syscall # API consistent across platforms. mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" ;; solaris_amd64) mksyscall="./mksyscall_solaris.pl" mkerrors="$mkerrors -m64" mksysnum= mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; *) echo 'unrecognized $GOOS_$GOARCH: ' "$GOOSARCH" 1>&2 exit 1 ;; esac ( if [ -n "$mkerrors" ]; then echo "$mkerrors |gofmt >$zerrors"; fi case "$GOOS" in *) syscall_goos="syscall_$GOOS.go" case "$GOOS" in darwin | dragonfly | freebsd | netbsd | openbsd) syscall_goos="syscall_bsd.go $syscall_goos" ;; esac if [ -n "$mksyscall" ]; then echo "$mksyscall -tags $GOOS,$GOARCH $syscall_goos $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.go"; fi ;; esac if [ -n "$mksysctl" ]; then echo "$mksysctl |gofmt >$zsysctl"; fi if [ -n "$mksysnum" ]; then echo "$mksysnum |gofmt >zsysnum_$GOOSARCH.go"; fi if [ -n "$mktypes" ]; then echo "$mktypes types_$GOOS.go | go run mkpost.go > ztypes_$GOOSARCH.go"; fi ) | $run ================================================ FILE: vendor/golang.org/x/sys/unix/mkerrors.sh ================================================ #!/usr/bin/env bash # Copyright 2009 The Go Authors. All rights reserved. # Use of this source code is governed by a BSD-style # license that can be found in the LICENSE file. # Generate Go code listing errors and other #defined constant # values (ENAMETOOLONG etc.), by asking the preprocessor # about the definitions. unset LANG export LC_ALL=C export LC_CTYPE=C if test -z "$GOARCH" -o -z "$GOOS"; then echo 1>&2 "GOARCH or GOOS not defined in environment" exit 1 fi # Check that we are using the new build system if we should if [[ "$GOOS" = "linux" ]] && [[ "$GOARCH" != "sparc64" ]]; then if [[ "$GOLANG_SYS_BUILD" != "docker" ]]; then echo 1>&2 "In the new build system, mkerrors should not be called directly." echo 1>&2 "See README.md" exit 1 fi fi CC=${CC:-cc} if [[ "$GOOS" = "solaris" ]]; then # Assumes GNU versions of utilities in PATH. export PATH=/usr/gnu/bin:$PATH fi uname=$(uname) includes_Darwin=' #define _DARWIN_C_SOURCE #define KERNEL #define _DARWIN_USE_64_BIT_INODE #include <stdint.h> #include <sys/attr.h> #include <sys/types.h> #include <sys/event.h> #include <sys/ptrace.h> #include <sys/socket.h> #include <sys/sockio.h> #include <sys/sysctl.h> #include <sys/mman.h> #include <sys/mount.h> #include <sys/wait.h> #include <net/bpf.h> #include <net/if.h> #include <net/if_types.h> #include <net/route.h> #include <netinet/in.h> #include <netinet/ip.h> #include <termios.h> ' includes_DragonFly=' #include <sys/types.h> #include <sys/event.h> #include <sys/socket.h> #include <sys/sockio.h> #include <sys/sysctl.h> #include <sys/mman.h> #include <sys/wait.h> #include <sys/ioctl.h> #include <net/bpf.h> #include <net/if.h> #include <net/if_types.h> #include <net/route.h> #include <netinet/in.h> #include <termios.h> #include <netinet/ip.h> #include <net/ip_mroute/ip_mroute.h> ' includes_FreeBSD=' #include <sys/capability.h> #include <sys/param.h> #include <sys/types.h> #include <sys/event.h> #include <sys/socket.h> #include <sys/sockio.h> #include <sys/sysctl.h> #include <sys/mman.h> #include <sys/mount.h> #include <sys/wait.h> #include <sys/ioctl.h> #include <net/bpf.h> #include <net/if.h> #include <net/if_types.h> #include <net/route.h> #include <netinet/in.h> #include <termios.h> #include <netinet/ip.h> #include <netinet/ip_mroute.h> #include <sys/extattr.h> #if __FreeBSD__ >= 10 #define IFT_CARP 0xf8 // IFT_CARP is deprecated in FreeBSD 10 #undef SIOCAIFADDR #define SIOCAIFADDR _IOW(105, 26, struct oifaliasreq) // ifaliasreq contains if_data #undef SIOCSIFPHYADDR #define SIOCSIFPHYADDR _IOW(105, 70, struct oifaliasreq) // ifaliasreq contains if_data #endif ' includes_Linux=' #define _LARGEFILE_SOURCE #define _LARGEFILE64_SOURCE #ifndef __LP64__ #define _FILE_OFFSET_BITS 64 #endif #define _GNU_SOURCE // <sys/ioctl.h> is broken on powerpc64, as it fails to include definitions of // these structures. We just include them copied from <bits/termios.h>. #if defined(__powerpc__) struct sgttyb { char sg_ispeed; char sg_ospeed; char sg_erase; char sg_kill; short sg_flags; }; struct tchars { char t_intrc; char t_quitc; char t_startc; char t_stopc; char t_eofc; char t_brkc; }; struct ltchars { char t_suspc; char t_dsuspc; char t_rprntc; char t_flushc; char t_werasc; char t_lnextc; }; #endif #include <bits/sockaddr.h> #include <sys/epoll.h> #include <sys/eventfd.h> #include <sys/inotify.h> #include <sys/ioctl.h> #include <sys/mman.h> #include <sys/mount.h> #include <sys/prctl.h> #include <sys/stat.h> #include <sys/types.h> #include <sys/time.h> #include <sys/socket.h> #include <sys/xattr.h> #include <linux/if.h> #include <linux/if_alg.h> #include <linux/if_arp.h> #include <linux/if_ether.h> #include <linux/if_tun.h> #include <linux/if_packet.h> #include <linux/if_addr.h> #include <linux/falloc.h> #include <linux/filter.h> #include <linux/fs.h> #include <linux/keyctl.h> #include <linux/netlink.h> #include <linux/perf_event.h> #include <linux/random.h> #include <linux/reboot.h> #include <linux/rtnetlink.h> #include <linux/ptrace.h> #include <linux/sched.h> #include <linux/seccomp.h> #include <linux/sockios.h> #include <linux/wait.h> #include <linux/icmpv6.h> #include <linux/serial.h> #include <linux/can.h> #include <linux/vm_sockets.h> #include <linux/taskstats.h> #include <linux/genetlink.h> #include <linux/watchdog.h> #include <net/route.h> #include <asm/termbits.h> #ifndef MSG_FASTOPEN #define MSG_FASTOPEN 0x20000000 #endif #ifndef PTRACE_GETREGS #define PTRACE_GETREGS 0xc #endif #ifndef PTRACE_SETREGS #define PTRACE_SETREGS 0xd #endif #ifndef SOL_NETLINK #define SOL_NETLINK 270 #endif #ifdef SOL_BLUETOOTH // SPARC includes this in /usr/include/sparc64-linux-gnu/bits/socket.h // but it is already in bluetooth_linux.go #undef SOL_BLUETOOTH #endif // Certain constants are missing from the fs/crypto UAPI #define FS_KEY_DESC_PREFIX "fscrypt:" #define FS_KEY_DESC_PREFIX_SIZE 8 #define FS_MAX_KEY_SIZE 64 ' includes_NetBSD=' #include <sys/types.h> #include <sys/param.h> #include <sys/event.h> #include <sys/mman.h> #include <sys/socket.h> #include <sys/sockio.h> #include <sys/sysctl.h> #include <sys/termios.h> #include <sys/ttycom.h> #include <sys/wait.h> #include <net/bpf.h> #include <net/if.h> #include <net/if_types.h> #include <net/route.h> #include <netinet/in.h> #include <netinet/in_systm.h> #include <netinet/ip.h> #include <netinet/ip_mroute.h> #include <netinet/if_ether.h> // Needed since <sys/param.h> refers to it... #define schedppq 1 ' includes_OpenBSD=' #include <sys/types.h> #include <sys/param.h> #include <sys/event.h> #include <sys/mman.h> #include <sys/socket.h> #include <sys/sockio.h> #include <sys/sysctl.h> #include <sys/termios.h> #include <sys/ttycom.h> #include <sys/wait.h> #include <net/bpf.h> #include <net/if.h> #include <net/if_types.h> #include <net/if_var.h> #include <net/route.h> #include <netinet/in.h> #include <netinet/in_systm.h> #include <netinet/ip.h> #include <netinet/ip_mroute.h> #include <netinet/if_ether.h> #include <net/if_bridge.h> // We keep some constants not supported in OpenBSD 5.5 and beyond for // the promise of compatibility. #define EMUL_ENABLED 0x1 #define EMUL_NATIVE 0x2 #define IPV6_FAITH 0x1d #define IPV6_OPTIONS 0x1 #define IPV6_RTHDR_STRICT 0x1 #define IPV6_SOCKOPT_RESERVED1 0x3 #define SIOCGIFGENERIC 0xc020693a #define SIOCSIFGENERIC 0x80206939 #define WALTSIG 0x4 ' includes_SunOS=' #include <limits.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/sockio.h> #include <sys/mman.h> #include <sys/wait.h> #include <sys/ioctl.h> #include <sys/mkdev.h> #include <net/bpf.h> #include <net/if.h> #include <net/if_arp.h> #include <net/if_types.h> #include <net/route.h> #include <netinet/in.h> #include <termios.h> #include <netinet/ip.h> #include <netinet/ip_mroute.h> ' includes=' #include <sys/types.h> #include <sys/file.h> #include <fcntl.h> #include <dirent.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h> #include <netinet/ip6.h> #include <netinet/tcp.h> #include <errno.h> #include <sys/signal.h> #include <signal.h> #include <sys/resource.h> #include <time.h> ' ccflags="$@" # Write go tool cgo -godefs input. ( echo package unix echo echo '/*' indirect="includes_$(uname)" echo "${!indirect} $includes" echo '*/' echo 'import "C"' echo 'import "syscall"' echo echo 'const (' # The gcc command line prints all the #defines # it encounters while processing the input echo "${!indirect} $includes" | $CC -x c - -E -dM $ccflags | awk ' $1 != "#define" || $2 ~ /\(/ || $3 == "" {next} $2 ~ /^E([ABCD]X|[BIS]P|[SD]I|S|FL)$/ {next} # 386 registers $2 ~ /^(SIGEV_|SIGSTKSZ|SIGRT(MIN|MAX))/ {next} $2 ~ /^(SCM_SRCRT)$/ {next} $2 ~ /^(MAP_FAILED)$/ {next} $2 ~ /^ELF_.*$/ {next}# <asm/elf.h> contains ELF_ARCH, etc. $2 ~ /^EXTATTR_NAMESPACE_NAMES/ || $2 ~ /^EXTATTR_NAMESPACE_[A-Z]+_STRING/ {next} $2 !~ /^ETH_/ && $2 !~ /^EPROC_/ && $2 !~ /^EQUIV_/ && $2 !~ /^EXPR_/ && $2 ~ /^E[A-Z0-9_]+$/ || $2 ~ /^B[0-9_]+$/ || $2 ~ /^(OLD|NEW)DEV$/ || $2 == "BOTHER" || $2 ~ /^CI?BAUD(EX)?$/ || $2 == "IBSHIFT" || $2 ~ /^V[A-Z0-9]+$/ || $2 ~ /^CS[A-Z0-9]/ || $2 ~ /^I(SIG|CANON|CRNL|UCLC|EXTEN|MAXBEL|STRIP|UTF8)$/ || $2 ~ /^IGN/ || $2 ~ /^IX(ON|ANY|OFF)$/ || $2 ~ /^IN(LCR|PCK)$/ || $2 ~ /(^FLU?SH)|(FLU?SH$)/ || $2 ~ /^C(LOCAL|READ|MSPAR|RTSCTS)$/ || $2 == "BRKINT" || $2 == "HUPCL" || $2 == "PENDIN" || $2 == "TOSTOP" || $2 == "XCASE" || $2 == "ALTWERASE" || $2 == "NOKERNINFO" || $2 ~ /^PAR/ || $2 ~ /^SIG[^_]/ || $2 ~ /^O[CNPFPL][A-Z]+[^_][A-Z]+$/ || $2 ~ /^(NL|CR|TAB|BS|VT|FF)DLY$/ || $2 ~ /^(NL|CR|TAB|BS|VT|FF)[0-9]$/ || $2 ~ /^O?XTABS$/ || $2 ~ /^TC[IO](ON|OFF)$/ || $2 ~ /^IN_/ || $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|EVFILT|NOTE|EV|SHUT|PROT|MAP|PACKET|MSG|SCM|MCL|DT|MADV|PR)_/ || $2 ~ /^FALLOC_/ || $2 == "ICMPV6_FILTER" || $2 == "SOMAXCONN" || $2 == "NAME_MAX" || $2 == "IFNAMSIZ" || $2 ~ /^CTL_(MAXNAME|NET|QUERY)$/ || $2 ~ /^SYSCTL_VERS/ || $2 ~ /^(MS|MNT|UMOUNT)_/ || $2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ || $2 ~ /^(O|F|E?FD|NAME|S|PTRACE|PT)_/ || $2 ~ /^LINUX_REBOOT_CMD_/ || $2 ~ /^LINUX_REBOOT_MAGIC[12]$/ || $2 !~ "NLA_TYPE_MASK" && $2 ~ /^(NETLINK|NLM|NLMSG|NLA|IFA|IFAN|RT|RTCF|RTN|RTPROT|RTNH|ARPHRD|ETH_P)_/ || $2 ~ /^SIOC/ || $2 ~ /^TIOC/ || $2 ~ /^TCGET/ || $2 ~ /^TCSET/ || $2 ~ /^TC(FLSH|SBRKP?|XONC)$/ || $2 !~ "RTF_BITS" && $2 ~ /^(IFF|IFT|NET_RT|RTM|RTF|RTV|RTA|RTAX)_/ || $2 ~ /^BIOC/ || $2 ~ /^RUSAGE_(SELF|CHILDREN|THREAD)/ || $2 ~ /^RLIMIT_(AS|CORE|CPU|DATA|FSIZE|LOCKS|MEMLOCK|MSGQUEUE|NICE|NOFILE|NPROC|RSS|RTPRIO|RTTIME|SIGPENDING|STACK)|RLIM_INFINITY/ || $2 ~ /^PRIO_(PROCESS|PGRP|USER)/ || $2 ~ /^CLONE_[A-Z_]+/ || $2 !~ /^(BPF_TIMEVAL)$/ && $2 ~ /^(BPF|DLT)_/ || $2 ~ /^CLOCK_/ || $2 ~ /^CAN_/ || $2 ~ /^CAP_/ || $2 ~ /^ALG_/ || $2 ~ /^FS_(POLICY_FLAGS|KEY_DESC|ENCRYPTION_MODE|[A-Z0-9_]+_KEY_SIZE|IOC_(GET|SET)_ENCRYPTION)/ || $2 ~ /^GRND_/ || $2 ~ /^KEY_(SPEC|REQKEY_DEFL)_/ || $2 ~ /^KEYCTL_/ || $2 ~ /^PERF_EVENT_IOC_/ || $2 ~ /^SECCOMP_MODE_/ || $2 ~ /^SPLICE_/ || $2 ~ /^(VM|VMADDR)_/ || $2 ~ /^IOCTL_VM_SOCKETS_/ || $2 ~ /^(TASKSTATS|TS)_/ || $2 ~ /^GENL_/ || $2 ~ /^UTIME_/ || $2 ~ /^XATTR_(CREATE|REPLACE)/ || $2 ~ /^ATTR_(BIT_MAP_COUNT|(CMN|VOL|FILE)_)/ || $2 ~ /^FSOPT_/ || $2 ~ /^WDIOC_/ || $2 !~ "WMESGLEN" && $2 ~ /^W[A-Z0-9]+$/ || $2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE)/ {printf("\t%s = C.%s\n", $2, $2)} $2 ~ /^__WCOREFLAG$/ {next} $2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)} {next} ' | sort echo ')' ) >_const.go # Pull out the error names for later. errors=$( echo '#include <errno.h>' | $CC -x c - -E -dM $ccflags | awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print $2 }' | sort ) # Pull out the signal names for later. signals=$( echo '#include <signal.h>' | $CC -x c - -E -dM $ccflags | awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print $2 }' | egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT)' | sort ) # Again, writing regexps to a file. echo '#include <errno.h>' | $CC -x c - -E -dM $ccflags | awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print "^\t" $2 "[ \t]*=" }' | sort >_error.grep echo '#include <signal.h>' | $CC -x c - -E -dM $ccflags | awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print "^\t" $2 "[ \t]*=" }' | egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT)' | sort >_signal.grep echo '// mkerrors.sh' "$@" echo '// Code generated by the command above; see README.md. DO NOT EDIT.' echo echo "// +build ${GOARCH},${GOOS}" echo go tool cgo -godefs -- "$@" _const.go >_error.out cat _error.out | grep -vf _error.grep | grep -vf _signal.grep echo echo '// Errors' echo 'const (' cat _error.out | grep -f _error.grep | sed 's/=\(.*\)/= syscall.Errno(\1)/' echo ')' echo echo '// Signals' echo 'const (' cat _error.out | grep -f _signal.grep | sed 's/=\(.*\)/= syscall.Signal(\1)/' echo ')' # Run C program to print error and syscall strings. ( echo -E " #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <ctype.h> #include <string.h> #include <signal.h> #define nelem(x) (sizeof(x)/sizeof((x)[0])) enum { A = 'A', Z = 'Z', a = 'a', z = 'z' }; // avoid need for single quotes below int errors[] = { " for i in $errors do echo -E ' '$i, done echo -E " }; int signals[] = { " for i in $signals do echo -E ' '$i, done # Use -E because on some systems bash builtin interprets \n itself. echo -E ' }; static int intcmp(const void *a, const void *b) { return *(int*)a - *(int*)b; } int main(void) { int i, e; char buf[1024], *p; printf("\n\n// Error table\n"); printf("var errors = [...]string {\n"); qsort(errors, nelem(errors), sizeof errors[0], intcmp); for(i=0; i<nelem(errors); i++) { e = errors[i]; if(i > 0 && errors[i-1] == e) continue; strcpy(buf, strerror(e)); // lowercase first letter: Bad -> bad, but STREAM -> STREAM. if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z) buf[0] += a - A; printf("\t%d: \"%s\",\n", e, buf); } printf("}\n\n"); printf("\n\n// Signal table\n"); printf("var signals = [...]string {\n"); qsort(signals, nelem(signals), sizeof signals[0], intcmp); for(i=0; i<nelem(signals); i++) { e = signals[i]; if(i > 0 && signals[i-1] == e) continue; strcpy(buf, strsignal(e)); // lowercase first letter: Bad -> bad, but STREAM -> STREAM. if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z) buf[0] += a - A; // cut trailing : number. p = strrchr(buf, ":"[0]); if(p) *p = '\0'; printf("\t%d: \"%s\",\n", e, buf); } printf("}\n\n"); return 0; } ' ) >_errors.c $CC $ccflags -o _errors _errors.c && $GORUN ./_errors && rm -f _errors.c _errors _const.go _error.grep _signal.grep _error.out ================================================ FILE: vendor/golang.org/x/sys/unix/mksyscall.pl ================================================ #!/usr/bin/env perl # Copyright 2009 The Go Authors. All rights reserved. # Use of this source code is governed by a BSD-style # license that can be found in the LICENSE file. # This program reads a file containing function prototypes # (like syscall_darwin.go) and generates system call bodies. # The prototypes are marked by lines beginning with "//sys" # and read like func declarations if //sys is replaced by func, but: # * The parameter lists must give a name for each argument. # This includes return parameters. # * The parameter lists must give a type for each argument: # the (x, y, z int) shorthand is not allowed. # * If the return parameter is an error number, it must be named errno. # A line beginning with //sysnb is like //sys, except that the # goroutine will not be suspended during the execution of the system # call. This must only be used for system calls which can never # block, as otherwise the system call could cause all goroutines to # hang. use strict; my $cmdline = "mksyscall.pl " . join(' ', @ARGV); my $errors = 0; my $_32bit = ""; my $plan9 = 0; my $openbsd = 0; my $netbsd = 0; my $dragonfly = 0; my $arm = 0; # 64-bit value should use (even, odd)-pair my $tags = ""; # build tags if($ARGV[0] eq "-b32") { $_32bit = "big-endian"; shift; } elsif($ARGV[0] eq "-l32") { $_32bit = "little-endian"; shift; } if($ARGV[0] eq "-plan9") { $plan9 = 1; shift; } if($ARGV[0] eq "-openbsd") { $openbsd = 1; shift; } if($ARGV[0] eq "-netbsd") { $netbsd = 1; shift; } if($ARGV[0] eq "-dragonfly") { $dragonfly = 1; shift; } if($ARGV[0] eq "-arm") { $arm = 1; shift; } if($ARGV[0] eq "-tags") { shift; $tags = $ARGV[0]; shift; } if($ARGV[0] =~ /^-/) { print STDERR "usage: mksyscall.pl [-b32 | -l32] [-tags x,y] [file ...]\n"; exit 1; } # Check that we are using the new build system if we should if($ENV{'GOOS'} eq "linux" && $ENV{'GOARCH'} ne "sparc64") { if($ENV{'GOLANG_SYS_BUILD'} ne "docker") { print STDERR "In the new build system, mksyscall should not be called directly.\n"; print STDERR "See README.md\n"; exit 1; } } sub parseparamlist($) { my ($list) = @_; $list =~ s/^\s*//; $list =~ s/\s*$//; if($list eq "") { return (); } return split(/\s*,\s*/, $list); } sub parseparam($) { my ($p) = @_; if($p !~ /^(\S*) (\S*)$/) { print STDERR "$ARGV:$.: malformed parameter: $p\n"; $errors = 1; return ("xx", "int"); } return ($1, $2); } my $text = ""; while(<>) { chomp; s/\s+/ /g; s/^\s+//; s/\s+$//; my $nonblock = /^\/\/sysnb /; next if !/^\/\/sys / && !$nonblock; # Line must be of the form # func Open(path string, mode int, perm int) (fd int, errno error) # Split into name, in params, out params. if(!/^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*((?i)SYS_[A-Z0-9_]+))?$/) { print STDERR "$ARGV:$.: malformed //sys declaration\n"; $errors = 1; next; } my ($func, $in, $out, $sysname) = ($2, $3, $4, $5); # Split argument lists on comma. my @in = parseparamlist($in); my @out = parseparamlist($out); # Try in vain to keep people from editing this file. # The theory is that they jump into the middle of the file # without reading the header. $text .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"; # Go function header. my $out_decl = @out ? sprintf(" (%s)", join(', ', @out)) : ""; $text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out_decl; # Check if err return available my $errvar = ""; foreach my $p (@out) { my ($name, $type) = parseparam($p); if($type eq "error") { $errvar = $name; last; } } # Prepare arguments to Syscall. my @args = (); my $n = 0; foreach my $p (@in) { my ($name, $type) = parseparam($p); if($type =~ /^\*/) { push @args, "uintptr(unsafe.Pointer($name))"; } elsif($type eq "string" && $errvar ne "") { $text .= "\tvar _p$n *byte\n"; $text .= "\t_p$n, $errvar = BytePtrFromString($name)\n"; $text .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; push @args, "uintptr(unsafe.Pointer(_p$n))"; $n++; } elsif($type eq "string") { print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; $text .= "\tvar _p$n *byte\n"; $text .= "\t_p$n, _ = BytePtrFromString($name)\n"; push @args, "uintptr(unsafe.Pointer(_p$n))"; $n++; } elsif($type =~ /^\[\](.*)/) { # Convert slice into pointer, length. # Have to be careful not to take address of &a[0] if len == 0: # pass dummy pointer in that case. # Used to pass nil, but some OSes or simulators reject write(fd, nil, 0). $text .= "\tvar _p$n unsafe.Pointer\n"; $text .= "\tif len($name) > 0 {\n\t\t_p$n = unsafe.Pointer(\&${name}[0])\n\t}"; $text .= " else {\n\t\t_p$n = unsafe.Pointer(&_zero)\n\t}"; $text .= "\n"; push @args, "uintptr(_p$n)", "uintptr(len($name))"; $n++; } elsif($type eq "int64" && ($openbsd || $netbsd)) { push @args, "0"; if($_32bit eq "big-endian") { push @args, "uintptr($name>>32)", "uintptr($name)"; } elsif($_32bit eq "little-endian") { push @args, "uintptr($name)", "uintptr($name>>32)"; } else { push @args, "uintptr($name)"; } } elsif($type eq "int64" && $dragonfly) { if ($func !~ /^extp(read|write)/i) { push @args, "0"; } if($_32bit eq "big-endian") { push @args, "uintptr($name>>32)", "uintptr($name)"; } elsif($_32bit eq "little-endian") { push @args, "uintptr($name)", "uintptr($name>>32)"; } else { push @args, "uintptr($name)"; } } elsif($type eq "int64" && $_32bit ne "") { if(@args % 2 && $arm) { # arm abi specifies 64-bit argument uses # (even, odd) pair push @args, "0" } if($_32bit eq "big-endian") { push @args, "uintptr($name>>32)", "uintptr($name)"; } else { push @args, "uintptr($name)", "uintptr($name>>32)"; } } else { push @args, "uintptr($name)"; } } # Determine which form to use; pad args with zeros. my $asm = "Syscall"; if ($nonblock) { $asm = "RawSyscall"; } if(@args <= 3) { while(@args < 3) { push @args, "0"; } } elsif(@args <= 6) { $asm .= "6"; while(@args < 6) { push @args, "0"; } } elsif(@args <= 9) { $asm .= "9"; while(@args < 9) { push @args, "0"; } } else { print STDERR "$ARGV:$.: too many arguments to system call\n"; } # System call number. if($sysname eq "") { $sysname = "SYS_$func"; $sysname =~ s/([a-z])([A-Z])/${1}_$2/g; # turn FooBar into Foo_Bar $sysname =~ y/a-z/A-Z/; } # Actual call. my $args = join(', ', @args); my $call = "$asm($sysname, $args)"; # Assign return values. my $body = ""; my @ret = ("_", "_", "_"); my $do_errno = 0; for(my $i=0; $i<@out; $i++) { my $p = $out[$i]; my ($name, $type) = parseparam($p); my $reg = ""; if($name eq "err" && !$plan9) { $reg = "e1"; $ret[2] = $reg; $do_errno = 1; } elsif($name eq "err" && $plan9) { $ret[0] = "r0"; $ret[2] = "e1"; next; } else { $reg = sprintf("r%d", $i); $ret[$i] = $reg; } if($type eq "bool") { $reg = "$reg != 0"; } if($type eq "int64" && $_32bit ne "") { # 64-bit number in r1:r0 or r0:r1. if($i+2 > @out) { print STDERR "$ARGV:$.: not enough registers for int64 return\n"; } if($_32bit eq "big-endian") { $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i, $i+1); } else { $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i+1, $i); } $ret[$i] = sprintf("r%d", $i); $ret[$i+1] = sprintf("r%d", $i+1); } if($reg ne "e1" || $plan9) { $body .= "\t$name = $type($reg)\n"; } } if ($ret[0] eq "_" && $ret[1] eq "_" && $ret[2] eq "_") { $text .= "\t$call\n"; } else { $text .= "\t$ret[0], $ret[1], $ret[2] := $call\n"; } $text .= $body; if ($plan9 && $ret[2] eq "e1") { $text .= "\tif int32(r0) == -1 {\n"; $text .= "\t\terr = e1\n"; $text .= "\t}\n"; } elsif ($do_errno) { $text .= "\tif e1 != 0 {\n"; $text .= "\t\terr = errnoErr(e1)\n"; $text .= "\t}\n"; } $text .= "\treturn\n"; $text .= "}\n\n"; } chomp $text; chomp $text; if($errors) { exit 1; } print <<EOF; // $cmdline // Code generated by the command above; see README.md. DO NOT EDIT. // +build $tags package unix import ( "syscall" "unsafe" ) var _ syscall.Errno $text EOF exit 0; ================================================ FILE: vendor/golang.org/x/sys/unix/mksyscall_solaris.pl ================================================ #!/usr/bin/env perl # Copyright 2009 The Go Authors. All rights reserved. # Use of this source code is governed by a BSD-style # license that can be found in the LICENSE file. # This program reads a file containing function prototypes # (like syscall_solaris.go) and generates system call bodies. # The prototypes are marked by lines beginning with "//sys" # and read like func declarations if //sys is replaced by func, but: # * The parameter lists must give a name for each argument. # This includes return parameters. # * The parameter lists must give a type for each argument: # the (x, y, z int) shorthand is not allowed. # * If the return parameter is an error number, it must be named err. # * If go func name needs to be different than its libc name, # * or the function is not in libc, name could be specified # * at the end, after "=" sign, like # //sys getsockopt(s int, level int, name int, val uintptr, vallen *_Socklen) (err error) = libsocket.getsockopt use strict; my $cmdline = "mksyscall_solaris.pl " . join(' ', @ARGV); my $errors = 0; my $_32bit = ""; my $tags = ""; # build tags binmode STDOUT; if($ARGV[0] eq "-b32") { $_32bit = "big-endian"; shift; } elsif($ARGV[0] eq "-l32") { $_32bit = "little-endian"; shift; } if($ARGV[0] eq "-tags") { shift; $tags = $ARGV[0]; shift; } if($ARGV[0] =~ /^-/) { print STDERR "usage: mksyscall_solaris.pl [-b32 | -l32] [-tags x,y] [file ...]\n"; exit 1; } sub parseparamlist($) { my ($list) = @_; $list =~ s/^\s*//; $list =~ s/\s*$//; if($list eq "") { return (); } return split(/\s*,\s*/, $list); } sub parseparam($) { my ($p) = @_; if($p !~ /^(\S*) (\S*)$/) { print STDERR "$ARGV:$.: malformed parameter: $p\n"; $errors = 1; return ("xx", "int"); } return ($1, $2); } my $package = ""; my $text = ""; my $dynimports = ""; my $linknames = ""; my @vars = (); while(<>) { chomp; s/\s+/ /g; s/^\s+//; s/\s+$//; $package = $1 if !$package && /^package (\S+)$/; my $nonblock = /^\/\/sysnb /; next if !/^\/\/sys / && !$nonblock; # Line must be of the form # func Open(path string, mode int, perm int) (fd int, err error) # Split into name, in params, out params. if(!/^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$/) { print STDERR "$ARGV:$.: malformed //sys declaration\n"; $errors = 1; next; } my ($nb, $func, $in, $out, $modname, $sysname) = ($1, $2, $3, $4, $5, $6); # Split argument lists on comma. my @in = parseparamlist($in); my @out = parseparamlist($out); # So file name. if($modname eq "") { $modname = "libc"; } # System call name. if($sysname eq "") { $sysname = "$func"; } # System call pointer variable name. my $sysvarname = "proc$sysname"; my $strconvfunc = "BytePtrFromString"; my $strconvtype = "*byte"; $sysname =~ y/A-Z/a-z/; # All libc functions are lowercase. # Runtime import of function to allow cross-platform builds. $dynimports .= "//go:cgo_import_dynamic libc_${sysname} ${sysname} \"$modname.so\"\n"; # Link symbol to proc address variable. $linknames .= "//go:linkname ${sysvarname} libc_${sysname}\n"; # Library proc address variable. push @vars, $sysvarname; # Go function header. $out = join(', ', @out); if($out ne "") { $out = " ($out)"; } if($text ne "") { $text .= "\n" } $text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out; # Check if err return available my $errvar = ""; foreach my $p (@out) { my ($name, $type) = parseparam($p); if($type eq "error") { $errvar = $name; last; } } # Prepare arguments to Syscall. my @args = (); my $n = 0; foreach my $p (@in) { my ($name, $type) = parseparam($p); if($type =~ /^\*/) { push @args, "uintptr(unsafe.Pointer($name))"; } elsif($type eq "string" && $errvar ne "") { $text .= "\tvar _p$n $strconvtype\n"; $text .= "\t_p$n, $errvar = $strconvfunc($name)\n"; $text .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; push @args, "uintptr(unsafe.Pointer(_p$n))"; $n++; } elsif($type eq "string") { print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; $text .= "\tvar _p$n $strconvtype\n"; $text .= "\t_p$n, _ = $strconvfunc($name)\n"; push @args, "uintptr(unsafe.Pointer(_p$n))"; $n++; } elsif($type =~ /^\[\](.*)/) { # Convert slice into pointer, length. # Have to be careful not to take address of &a[0] if len == 0: # pass nil in that case. $text .= "\tvar _p$n *$1\n"; $text .= "\tif len($name) > 0 {\n\t\t_p$n = \&$name\[0]\n\t}\n"; push @args, "uintptr(unsafe.Pointer(_p$n))", "uintptr(len($name))"; $n++; } elsif($type eq "int64" && $_32bit ne "") { if($_32bit eq "big-endian") { push @args, "uintptr($name >> 32)", "uintptr($name)"; } else { push @args, "uintptr($name)", "uintptr($name >> 32)"; } } elsif($type eq "bool") { $text .= "\tvar _p$n uint32\n"; $text .= "\tif $name {\n\t\t_p$n = 1\n\t} else {\n\t\t_p$n = 0\n\t}\n"; push @args, "uintptr(_p$n)"; $n++; } else { push @args, "uintptr($name)"; } } my $nargs = @args; # Determine which form to use; pad args with zeros. my $asm = "sysvicall6"; if ($nonblock) { $asm = "rawSysvicall6"; } if(@args <= 6) { while(@args < 6) { push @args, "0"; } } else { print STDERR "$ARGV:$.: too many arguments to system call\n"; } # Actual call. my $args = join(', ', @args); my $call = "$asm(uintptr(unsafe.Pointer(&$sysvarname)), $nargs, $args)"; # Assign return values. my $body = ""; my $failexpr = ""; my @ret = ("_", "_", "_"); my @pout= (); my $do_errno = 0; for(my $i=0; $i<@out; $i++) { my $p = $out[$i]; my ($name, $type) = parseparam($p); my $reg = ""; if($name eq "err") { $reg = "e1"; $ret[2] = $reg; $do_errno = 1; } else { $reg = sprintf("r%d", $i); $ret[$i] = $reg; } if($type eq "bool") { $reg = "$reg != 0"; } if($type eq "int64" && $_32bit ne "") { # 64-bit number in r1:r0 or r0:r1. if($i+2 > @out) { print STDERR "$ARGV:$.: not enough registers for int64 return\n"; } if($_32bit eq "big-endian") { $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i, $i+1); } else { $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i+1, $i); } $ret[$i] = sprintf("r%d", $i); $ret[$i+1] = sprintf("r%d", $i+1); } if($reg ne "e1") { $body .= "\t$name = $type($reg)\n"; } } if ($ret[0] eq "_" && $ret[1] eq "_" && $ret[2] eq "_") { $text .= "\t$call\n"; } else { $text .= "\t$ret[0], $ret[1], $ret[2] := $call\n"; } $text .= $body; if ($do_errno) { $text .= "\tif e1 != 0 {\n"; $text .= "\t\terr = e1\n"; $text .= "\t}\n"; } $text .= "\treturn\n"; $text .= "}\n"; } if($errors) { exit 1; } print <<EOF; // $cmdline // Code generated by the command above; see README.md. DO NOT EDIT. // +build $tags package $package import ( "syscall" "unsafe" ) EOF print "import \"golang.org/x/sys/unix\"\n" if $package ne "unix"; my $vardecls = "\t" . join(",\n\t", @vars); $vardecls .= " syscallFunc"; chomp($_=<<EOF); $dynimports $linknames var ( $vardecls ) $text EOF print $_; exit 0; ================================================ FILE: vendor/golang.org/x/sys/unix/mksysctl_openbsd.pl ================================================ #!/usr/bin/env perl # Copyright 2011 The Go Authors. All rights reserved. # Use of this source code is governed by a BSD-style # license that can be found in the LICENSE file. # # Parse the header files for OpenBSD and generate a Go usable sysctl MIB. # # Build a MIB with each entry being an array containing the level, type and # a hash that will contain additional entries if the current entry is a node. # We then walk this MIB and create a flattened sysctl name to OID hash. # use strict; if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") { print STDERR "GOARCH or GOOS not defined in environment\n"; exit 1; } my $debug = 0; my %ctls = (); my @headers = qw ( sys/sysctl.h sys/socket.h sys/tty.h sys/malloc.h sys/mount.h sys/namei.h sys/sem.h sys/shm.h sys/vmmeter.h uvm/uvm_param.h uvm/uvm_swap_encrypt.h ddb/db_var.h net/if.h net/if_pfsync.h net/pipex.h netinet/in.h netinet/icmp_var.h netinet/igmp_var.h netinet/ip_ah.h netinet/ip_carp.h netinet/ip_divert.h netinet/ip_esp.h netinet/ip_ether.h netinet/ip_gre.h netinet/ip_ipcomp.h netinet/ip_ipip.h netinet/pim_var.h netinet/tcp_var.h netinet/udp_var.h netinet6/in6.h netinet6/ip6_divert.h netinet6/pim6_var.h netinet/icmp6.h netmpls/mpls.h ); my @ctls = qw ( kern vm fs net #debug # Special handling required hw #machdep # Arch specific user ddb #vfs # Special handling required fs.posix kern.forkstat kern.intrcnt kern.malloc kern.nchstats kern.seminfo kern.shminfo kern.timecounter kern.tty kern.watchdog net.bpf net.ifq net.inet net.inet.ah net.inet.carp net.inet.divert net.inet.esp net.inet.etherip net.inet.gre net.inet.icmp net.inet.igmp net.inet.ip net.inet.ip.ifq net.inet.ipcomp net.inet.ipip net.inet.mobileip net.inet.pfsync net.inet.pim net.inet.tcp net.inet.udp net.inet6 net.inet6.divert net.inet6.ip6 net.inet6.icmp6 net.inet6.pim6 net.inet6.tcp6 net.inet6.udp6 net.mpls net.mpls.ifq net.key net.pflow net.pfsync net.pipex net.rt vm.swapencrypt #vfsgenctl # Special handling required ); # Node name "fixups" my %ctl_map = ( "ipproto" => "net.inet", "net.inet.ipproto" => "net.inet", "net.inet6.ipv6proto" => "net.inet6", "net.inet6.ipv6" => "net.inet6.ip6", "net.inet.icmpv6" => "net.inet6.icmp6", "net.inet6.divert6" => "net.inet6.divert", "net.inet6.tcp6" => "net.inet.tcp", "net.inet6.udp6" => "net.inet.udp", "mpls" => "net.mpls", "swpenc" => "vm.swapencrypt" ); # Node mappings my %node_map = ( "net.inet.ip.ifq" => "net.ifq", "net.inet.pfsync" => "net.pfsync", "net.mpls.ifq" => "net.ifq" ); my $ctlname; my %mib = (); my %sysctl = (); my $node; sub debug() { print STDERR "$_[0]\n" if $debug; } # Walk the MIB and build a sysctl name to OID mapping. sub build_sysctl() { my ($node, $name, $oid) = @_; my %node = %{$node}; my @oid = @{$oid}; foreach my $key (sort keys %node) { my @node = @{$node{$key}}; my $nodename = $name.($name ne '' ? '.' : '').$key; my @nodeoid = (@oid, $node[0]); if ($node[1] eq 'CTLTYPE_NODE') { if (exists $node_map{$nodename}) { $node = \%mib; $ctlname = $node_map{$nodename}; foreach my $part (split /\./, $ctlname) { $node = \%{@{$$node{$part}}[2]}; } } else { $node = $node[2]; } &build_sysctl($node, $nodename, \@nodeoid); } elsif ($node[1] ne '') { $sysctl{$nodename} = \@nodeoid; } } } foreach my $ctl (@ctls) { $ctls{$ctl} = $ctl; } # Build MIB foreach my $header (@headers) { &debug("Processing $header..."); open HEADER, "/usr/include/$header" || print STDERR "Failed to open $header\n"; while (<HEADER>) { if ($_ =~ /^#define\s+(CTL_NAMES)\s+{/ || $_ =~ /^#define\s+(CTL_(.*)_NAMES)\s+{/ || $_ =~ /^#define\s+((.*)CTL_NAMES)\s+{/) { if ($1 eq 'CTL_NAMES') { # Top level. $node = \%mib; } else { # Node. my $nodename = lc($2); if ($header =~ /^netinet\//) { $ctlname = "net.inet.$nodename"; } elsif ($header =~ /^netinet6\//) { $ctlname = "net.inet6.$nodename"; } elsif ($header =~ /^net\//) { $ctlname = "net.$nodename"; } else { $ctlname = "$nodename"; $ctlname =~ s/^(fs|net|kern)_/$1\./; } if (exists $ctl_map{$ctlname}) { $ctlname = $ctl_map{$ctlname}; } if (not exists $ctls{$ctlname}) { &debug("Ignoring $ctlname..."); next; } # Walk down from the top of the MIB. $node = \%mib; foreach my $part (split /\./, $ctlname) { if (not exists $$node{$part}) { &debug("Missing node $part"); $$node{$part} = [ 0, '', {} ]; } $node = \%{@{$$node{$part}}[2]}; } } # Populate current node with entries. my $i = -1; while (defined($_) && $_ !~ /^}/) { $_ = <HEADER>; $i++ if $_ =~ /{.*}/; next if $_ !~ /{\s+"(\w+)",\s+(CTLTYPE_[A-Z]+)\s+}/; $$node{$1} = [ $i, $2, {} ]; } } } close HEADER; } &build_sysctl(\%mib, "", []); print <<EOF; // mksysctl_openbsd.pl // MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT // +build $ENV{'GOARCH'},$ENV{'GOOS'} package unix; type mibentry struct { ctlname string ctloid []_C_int } var sysctlMib = []mibentry { EOF foreach my $name (sort keys %sysctl) { my @oid = @{$sysctl{$name}}; print "\t{ \"$name\", []_C_int{ ", join(', ', @oid), " } }, \n"; } print <<EOF; } EOF ================================================ FILE: vendor/golang.org/x/sys/unix/mksysnum_darwin.pl ================================================ #!/usr/bin/env perl # Copyright 2009 The Go Authors. All rights reserved. # Use of this source code is governed by a BSD-style # license that can be found in the LICENSE file. # # Generate system call table for Darwin from sys/syscall.h use strict; if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") { print STDERR "GOARCH or GOOS not defined in environment\n"; exit 1; } my $command = "mksysnum_darwin.pl " . join(' ', @ARGV); print <<EOF; // $command // Code generated by the command above; see README.md. DO NOT EDIT. // +build $ENV{'GOARCH'},$ENV{'GOOS'} package unix const ( EOF while(<>){ if(/^#define\s+SYS_(\w+)\s+([0-9]+)/){ my $name = $1; my $num = $2; $name =~ y/a-z/A-Z/; print " SYS_$name = $num;" } } print <<EOF; ) EOF ================================================ FILE: vendor/golang.org/x/sys/unix/mksysnum_dragonfly.pl ================================================ #!/usr/bin/env perl # Copyright 2009 The Go Authors. All rights reserved. # Use of this source code is governed by a BSD-style # license that can be found in the LICENSE file. # # Generate system call table for DragonFly from master list # (for example, /usr/src/sys/kern/syscalls.master). use strict; if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") { print STDERR "GOARCH or GOOS not defined in environment\n"; exit 1; } my $command = "mksysnum_dragonfly.pl " . join(' ', @ARGV); print <<EOF; // $command // Code generated by the command above; see README.md. DO NOT EDIT. // +build $ENV{'GOARCH'},$ENV{'GOOS'} package unix const ( EOF while(<>){ if(/^([0-9]+)\s+STD\s+({ \S+\s+(\w+).*)$/){ my $num = $1; my $proto = $2; my $name = "SYS_$3"; $name =~ y/a-z/A-Z/; # There are multiple entries for enosys and nosys, so comment them out. if($name =~ /^SYS_E?NOSYS$/){ $name = "// $name"; } if($name eq 'SYS_SYS_EXIT'){ $name = 'SYS_EXIT'; } print " $name = $num; // $proto\n"; } } print <<EOF; ) EOF ================================================ FILE: vendor/golang.org/x/sys/unix/mksysnum_freebsd.pl ================================================ #!/usr/bin/env perl # Copyright 2009 The Go Authors. All rights reserved. # Use of this source code is governed by a BSD-style # license that can be found in the LICENSE file. # # Generate system call table for FreeBSD from master list # (for example, /usr/src/sys/kern/syscalls.master). use strict; if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") { print STDERR "GOARCH or GOOS not defined in environment\n"; exit 1; } my $command = "mksysnum_freebsd.pl " . join(' ', @ARGV); print <<EOF; // $command // Code generated by the command above; see README.md. DO NOT EDIT. // +build $ENV{'GOARCH'},$ENV{'GOOS'} package unix const ( EOF while(<>){ if(/^([0-9]+)\s+\S+\s+STD\s+({ \S+\s+(\w+).*)$/){ my $num = $1; my $proto = $2; my $name = "SYS_$3"; $name =~ y/a-z/A-Z/; # There are multiple entries for enosys and nosys, so comment them out. if($name =~ /^SYS_E?NOSYS$/){ $name = "// $name"; } if($name eq 'SYS_SYS_EXIT'){ $name = 'SYS_EXIT'; } print " $name = $num; // $proto\n"; } } print <<EOF; ) EOF ================================================ FILE: vendor/golang.org/x/sys/unix/mksysnum_netbsd.pl ================================================ #!/usr/bin/env perl # Copyright 2009 The Go Authors. All rights reserved. # Use of this source code is governed by a BSD-style # license that can be found in the LICENSE file. # # Generate system call table for OpenBSD from master list # (for example, /usr/src/sys/kern/syscalls.master). use strict; if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") { print STDERR "GOARCH or GOOS not defined in environment\n"; exit 1; } my $command = "mksysnum_netbsd.pl " . join(' ', @ARGV); print <<EOF; // $command // Code generated by the command above; see README.md. DO NOT EDIT. // +build $ENV{'GOARCH'},$ENV{'GOOS'} package unix const ( EOF my $line = ''; while(<>){ if($line =~ /^(.*)\\$/) { # Handle continuation $line = $1; $_ =~ s/^\s+//; $line .= $_; } else { # New line $line = $_; } next if $line =~ /\\$/; if($line =~ /^([0-9]+)\s+((STD)|(NOERR))\s+(RUMP\s+)?({\s+\S+\s*\*?\s*\|(\S+)\|(\S*)\|(\w+).*\s+})(\s+(\S+))?$/) { my $num = $1; my $proto = $6; my $compat = $8; my $name = "$7_$9"; $name = "$7_$11" if $11 ne ''; $name =~ y/a-z/A-Z/; if($compat eq '' || $compat eq '13' || $compat eq '30' || $compat eq '50') { print " $name = $num; // $proto\n"; } } } print <<EOF; ) EOF ================================================ FILE: vendor/golang.org/x/sys/unix/mksysnum_openbsd.pl ================================================ #!/usr/bin/env perl # Copyright 2009 The Go Authors. All rights reserved. # Use of this source code is governed by a BSD-style # license that can be found in the LICENSE file. # # Generate system call table for OpenBSD from master list # (for example, /usr/src/sys/kern/syscalls.master). use strict; if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") { print STDERR "GOARCH or GOOS not defined in environment\n"; exit 1; } my $command = "mksysnum_openbsd.pl " . join(' ', @ARGV); print <<EOF; // $command // Code generated by the command above; see README.md. DO NOT EDIT. // +build $ENV{'GOARCH'},$ENV{'GOOS'} package unix const ( EOF while(<>){ if(/^([0-9]+)\s+STD\s+(NOLOCK\s+)?({ \S+\s+\*?(\w+).*)$/){ my $num = $1; my $proto = $3; my $name = $4; $name =~ y/a-z/A-Z/; # There are multiple entries for enosys and nosys, so comment them out. if($name =~ /^SYS_E?NOSYS$/){ $name = "// $name"; } if($name eq 'SYS_SYS_EXIT'){ $name = 'SYS_EXIT'; } print " $name = $num; // $proto\n"; } } print <<EOF; ) EOF ================================================ FILE: vendor/golang.org/x/sys/unix/openbsd_pledge.go ================================================ // Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build openbsd // +build 386 amd64 arm package unix import ( "syscall" "unsafe" ) const ( SYS_PLEDGE = 108 ) // Pledge implements the pledge syscall. For more information see pledge(2). func Pledge(promises string, paths []string) error { promisesPtr, err := syscall.BytePtrFromString(promises) if err != nil { return err } promisesUnsafe, pathsUnsafe := unsafe.Pointer(promisesPtr), unsafe.Pointer(nil) if paths != nil { var pathsPtr []*byte if pathsPtr, err = syscall.SlicePtrFromStrings(paths); err != nil { return err } pathsUnsafe = unsafe.Pointer(&pathsPtr[0]) } _, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(promisesUnsafe), uintptr(pathsUnsafe), 0) if e != 0 { return e } return nil } ================================================ FILE: vendor/golang.org/x/sys/unix/pagesize_unix.go ================================================ // Copyright 2017 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin dragonfly freebsd linux netbsd openbsd solaris // For Unix, get the pagesize from the runtime. package unix import "syscall" func Getpagesize() int { return syscall.Getpagesize() } ================================================ FILE: vendor/golang.org/x/sys/unix/race.go ================================================ // Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin,race linux,race freebsd,race package unix import ( "runtime" "unsafe" ) const raceenabled = true func raceAcquire(addr unsafe.Pointer) { runtime.RaceAcquire(addr) } func raceReleaseMerge(addr unsafe.Pointer) { runtime.RaceReleaseMerge(addr) } func raceReadRange(addr unsafe.Pointer, len int) { runtime.RaceReadRange(addr, len) } func raceWriteRange(addr unsafe.Pointer, len int) { runtime.RaceWriteRange(addr, len) } ================================================ FILE: vendor/golang.org/x/sys/unix/race0.go ================================================ // Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin,!race linux,!race freebsd,!race netbsd openbsd solaris dragonfly package unix import ( "unsafe" ) const raceenabled = false func raceAcquire(addr unsafe.Pointer) { } func raceReleaseMerge(addr unsafe.Pointer) { } func raceReadRange(addr unsafe.Pointer, len int) { } func raceWriteRange(addr unsafe.Pointer, len int) { } ================================================ FILE: vendor/golang.org/x/sys/unix/sockcmsg_linux.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Socket control messages package unix import "unsafe" // UnixCredentials encodes credentials into a socket control message // for sending to another process. This can be used for // authentication. func UnixCredentials(ucred *Ucred) []byte { b := make([]byte, CmsgSpace(SizeofUcred)) h := (*Cmsghdr)(unsafe.Pointer(&b[0])) h.Level = SOL_SOCKET h.Type = SCM_CREDENTIALS h.SetLen(CmsgLen(SizeofUcred)) *((*Ucred)(cmsgData(h))) = *ucred return b } // ParseUnixCredentials decodes a socket control message that contains // credentials in a Ucred structure. To receive such a message, the // SO_PASSCRED option must be enabled on the socket. func ParseUnixCredentials(m *SocketControlMessage) (*Ucred, error) { if m.Header.Level != SOL_SOCKET { return nil, EINVAL } if m.Header.Type != SCM_CREDENTIALS { return nil, EINVAL } ucred := *(*Ucred)(unsafe.Pointer(&m.Data[0])) return &ucred, nil } ================================================ FILE: vendor/golang.org/x/sys/unix/sockcmsg_unix.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin dragonfly freebsd linux netbsd openbsd solaris // Socket control messages package unix import "unsafe" // Round the length of a raw sockaddr up to align it properly. func cmsgAlignOf(salen int) int { salign := sizeofPtr // NOTE: It seems like 64-bit Darwin, DragonFly BSD and // Solaris kernels still require 32-bit aligned access to // network subsystem. if darwin64Bit || dragonfly64Bit || solaris64Bit { salign = 4 } return (salen + salign - 1) & ^(salign - 1) } // CmsgLen returns the value to store in the Len field of the Cmsghdr // structure, taking into account any necessary alignment. func CmsgLen(datalen int) int { return cmsgAlignOf(SizeofCmsghdr) + datalen } // CmsgSpace returns the number of bytes an ancillary element with // payload of the passed data length occupies. func CmsgSpace(datalen int) int { return cmsgAlignOf(SizeofCmsghdr) + cmsgAlignOf(datalen) } func cmsgData(h *Cmsghdr) unsafe.Pointer { return unsafe.Pointer(uintptr(unsafe.Pointer(h)) + uintptr(cmsgAlignOf(SizeofCmsghdr))) } // SocketControlMessage represents a socket control message. type SocketControlMessage struct { Header Cmsghdr Data []byte } // ParseSocketControlMessage parses b as an array of socket control // messages. func ParseSocketControlMessage(b []byte) ([]SocketControlMessage, error) { var msgs []SocketControlMessage i := 0 for i+CmsgLen(0) <= len(b) { h, dbuf, err := socketControlMessageHeaderAndData(b[i:]) if err != nil { return nil, err } m := SocketControlMessage{Header: *h, Data: dbuf} msgs = append(msgs, m) i += cmsgAlignOf(int(h.Len)) } return msgs, nil } func socketControlMessageHeaderAndData(b []byte) (*Cmsghdr, []byte, error) { h := (*Cmsghdr)(unsafe.Pointer(&b[0])) if h.Len < SizeofCmsghdr || uint64(h.Len) > uint64(len(b)) { return nil, nil, EINVAL } return h, b[cmsgAlignOf(SizeofCmsghdr):h.Len], nil } // UnixRights encodes a set of open file descriptors into a socket // control message for sending to another process. func UnixRights(fds ...int) []byte { datalen := len(fds) * 4 b := make([]byte, CmsgSpace(datalen)) h := (*Cmsghdr)(unsafe.Pointer(&b[0])) h.Level = SOL_SOCKET h.Type = SCM_RIGHTS h.SetLen(CmsgLen(datalen)) data := cmsgData(h) for _, fd := range fds { *(*int32)(data) = int32(fd) data = unsafe.Pointer(uintptr(data) + 4) } return b } // ParseUnixRights decodes a socket control message that contains an // integer array of open file descriptors from another process. func ParseUnixRights(m *SocketControlMessage) ([]int, error) { if m.Header.Level != SOL_SOCKET { return nil, EINVAL } if m.Header.Type != SCM_RIGHTS { return nil, EINVAL } fds := make([]int, len(m.Data)>>2) for i, j := 0, 0; i < len(m.Data); i += 4 { fds[j] = int(*(*int32)(unsafe.Pointer(&m.Data[i]))) j++ } return fds, nil } ================================================ FILE: vendor/golang.org/x/sys/unix/str.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin dragonfly freebsd linux netbsd openbsd solaris package unix func itoa(val int) string { // do it here rather than with fmt to avoid dependency if val < 0 { return "-" + uitoa(uint(-val)) } return uitoa(uint(val)) } func uitoa(val uint) string { var buf [32]byte // big enough for int64 i := len(buf) - 1 for val >= 10 { buf[i] = byte(val%10 + '0') i-- val /= 10 } buf[i] = byte(val + '0') return string(buf[i:]) } ================================================ FILE: vendor/golang.org/x/sys/unix/syscall.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin dragonfly freebsd linux netbsd openbsd solaris // Package unix contains an interface to the low-level operating system // primitives. OS details vary depending on the underlying system, and // by default, godoc will display OS-specific documentation for the current // system. If you want godoc to display OS documentation for another // system, set $GOOS and $GOARCH to the desired system. For example, if // you want to view documentation for freebsd/arm on linux/amd64, set $GOOS // to freebsd and $GOARCH to arm. // The primary use of this package is inside other packages that provide a more // portable interface to the system, such as "os", "time" and "net". Use // those packages rather than this one if you can. // For details of the functions and data types in this package consult // the manuals for the appropriate operating system. // These calls return err == nil to indicate success; otherwise // err represents an operating system error describing the failure and // holds a value of type syscall.Errno. package unix // import "golang.org/x/sys/unix" // ByteSliceFromString returns a NUL-terminated slice of bytes // containing the text of s. If s contains a NUL byte at any // location, it returns (nil, EINVAL). func ByteSliceFromString(s string) ([]byte, error) { for i := 0; i < len(s); i++ { if s[i] == 0 { return nil, EINVAL } } a := make([]byte, len(s)+1) copy(a, s) return a, nil } // BytePtrFromString returns a pointer to a NUL-terminated array of // bytes containing the text of s. If s contains a NUL byte at any // location, it returns (nil, EINVAL). func BytePtrFromString(s string) (*byte, error) { a, err := ByteSliceFromString(s) if err != nil { return nil, err } return &a[0], nil } // Single-word zero for use when we need a valid pointer to 0 bytes. // See mkunix.pl. var _zero uintptr ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_bsd.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin dragonfly freebsd netbsd openbsd // BSD system call wrappers shared by *BSD based systems // including OS X (Darwin) and FreeBSD. Like the other // syscall_*.go files it is compiled as Go code but also // used as input to mksyscall which parses the //sys // lines and generates system call stubs. package unix import ( "runtime" "syscall" "unsafe" ) /* * Wrapped */ //sysnb getgroups(ngid int, gid *_Gid_t) (n int, err error) //sysnb setgroups(ngid int, gid *_Gid_t) (err error) func Getgroups() (gids []int, err error) { n, err := getgroups(0, nil) if err != nil { return nil, err } if n == 0 { return nil, nil } // Sanity check group count. Max is 16 on BSD. if n < 0 || n > 1000 { return nil, EINVAL } a := make([]_Gid_t, n) n, err = getgroups(n, &a[0]) if err != nil { return nil, err } gids = make([]int, n) for i, v := range a[0:n] { gids[i] = int(v) } return } func Setgroups(gids []int) (err error) { if len(gids) == 0 { return setgroups(0, nil) } a := make([]_Gid_t, len(gids)) for i, v := range gids { a[i] = _Gid_t(v) } return setgroups(len(a), &a[0]) } func ReadDirent(fd int, buf []byte) (n int, err error) { // Final argument is (basep *uintptr) and the syscall doesn't take nil. // 64 bits should be enough. (32 bits isn't even on 386). Since the // actual system call is getdirentries64, 64 is a good guess. // TODO(rsc): Can we use a single global basep for all calls? var base = (*uintptr)(unsafe.Pointer(new(uint64))) return Getdirentries(fd, buf, base) } // Wait status is 7 bits at bottom, either 0 (exited), // 0x7F (stopped), or a signal number that caused an exit. // The 0x80 bit is whether there was a core dump. // An extra number (exit code, signal causing a stop) // is in the high bits. type WaitStatus uint32 const ( mask = 0x7F core = 0x80 shift = 8 exited = 0 stopped = 0x7F ) func (w WaitStatus) Exited() bool { return w&mask == exited } func (w WaitStatus) ExitStatus() int { if w&mask != exited { return -1 } return int(w >> shift) } func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != 0 } func (w WaitStatus) Signal() syscall.Signal { sig := syscall.Signal(w & mask) if sig == stopped || sig == 0 { return -1 } return sig } func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 } func (w WaitStatus) Stopped() bool { return w&mask == stopped && syscall.Signal(w>>shift) != SIGSTOP } func (w WaitStatus) Continued() bool { return w&mask == stopped && syscall.Signal(w>>shift) == SIGSTOP } func (w WaitStatus) StopSignal() syscall.Signal { if !w.Stopped() { return -1 } return syscall.Signal(w>>shift) & 0xFF } func (w WaitStatus) TrapCause() int { return -1 } //sys wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) { var status _C_int wpid, err = wait4(pid, &status, options, rusage) if wstatus != nil { *wstatus = WaitStatus(status) } return } //sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sysnb socket(domain int, typ int, proto int) (fd int, err error) //sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) //sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) //sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) //sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) //sys Shutdown(s int, how int) (err error) func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { if sa.Port < 0 || sa.Port > 0xFFFF { return nil, 0, EINVAL } sa.raw.Len = SizeofSockaddrInet4 sa.raw.Family = AF_INET p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) p[0] = byte(sa.Port >> 8) p[1] = byte(sa.Port) for i := 0; i < len(sa.Addr); i++ { sa.raw.Addr[i] = sa.Addr[i] } return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil } func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { if sa.Port < 0 || sa.Port > 0xFFFF { return nil, 0, EINVAL } sa.raw.Len = SizeofSockaddrInet6 sa.raw.Family = AF_INET6 p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) p[0] = byte(sa.Port >> 8) p[1] = byte(sa.Port) sa.raw.Scope_id = sa.ZoneId for i := 0; i < len(sa.Addr); i++ { sa.raw.Addr[i] = sa.Addr[i] } return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil } func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { name := sa.Name n := len(name) if n >= len(sa.raw.Path) || n == 0 { return nil, 0, EINVAL } sa.raw.Len = byte(3 + n) // 2 for Family, Len; 1 for NUL sa.raw.Family = AF_UNIX for i := 0; i < n; i++ { sa.raw.Path[i] = int8(name[i]) } return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil } func (sa *SockaddrDatalink) sockaddr() (unsafe.Pointer, _Socklen, error) { if sa.Index == 0 { return nil, 0, EINVAL } sa.raw.Len = sa.Len sa.raw.Family = AF_LINK sa.raw.Index = sa.Index sa.raw.Type = sa.Type sa.raw.Nlen = sa.Nlen sa.raw.Alen = sa.Alen sa.raw.Slen = sa.Slen for i := 0; i < len(sa.raw.Data); i++ { sa.raw.Data[i] = sa.Data[i] } return unsafe.Pointer(&sa.raw), SizeofSockaddrDatalink, nil } func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) { switch rsa.Addr.Family { case AF_LINK: pp := (*RawSockaddrDatalink)(unsafe.Pointer(rsa)) sa := new(SockaddrDatalink) sa.Len = pp.Len sa.Family = pp.Family sa.Index = pp.Index sa.Type = pp.Type sa.Nlen = pp.Nlen sa.Alen = pp.Alen sa.Slen = pp.Slen for i := 0; i < len(sa.Data); i++ { sa.Data[i] = pp.Data[i] } return sa, nil case AF_UNIX: pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa)) if pp.Len < 2 || pp.Len > SizeofSockaddrUnix { return nil, EINVAL } sa := new(SockaddrUnix) // Some BSDs include the trailing NUL in the length, whereas // others do not. Work around this by subtracting the leading // family and len. The path is then scanned to see if a NUL // terminator still exists within the length. n := int(pp.Len) - 2 // subtract leading Family, Len for i := 0; i < n; i++ { if pp.Path[i] == 0 { // found early NUL; assume Len included the NUL // or was overestimating. n = i break } } bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] sa.Name = string(bytes) return sa, nil case AF_INET: pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) sa := new(SockaddrInet4) p := (*[2]byte)(unsafe.Pointer(&pp.Port)) sa.Port = int(p[0])<<8 + int(p[1]) for i := 0; i < len(sa.Addr); i++ { sa.Addr[i] = pp.Addr[i] } return sa, nil case AF_INET6: pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) sa := new(SockaddrInet6) p := (*[2]byte)(unsafe.Pointer(&pp.Port)) sa.Port = int(p[0])<<8 + int(p[1]) sa.ZoneId = pp.Scope_id for i := 0; i < len(sa.Addr); i++ { sa.Addr[i] = pp.Addr[i] } return sa, nil } return nil, EAFNOSUPPORT } func Accept(fd int) (nfd int, sa Sockaddr, err error) { var rsa RawSockaddrAny var len _Socklen = SizeofSockaddrAny nfd, err = accept(fd, &rsa, &len) if err != nil { return } if runtime.GOOS == "darwin" && len == 0 { // Accepted socket has no address. // This is likely due to a bug in xnu kernels, // where instead of ECONNABORTED error socket // is accepted, but has no address. Close(nfd) return 0, nil, ECONNABORTED } sa, err = anyToSockaddr(&rsa) if err != nil { Close(nfd) nfd = 0 } return } func Getsockname(fd int) (sa Sockaddr, err error) { var rsa RawSockaddrAny var len _Socklen = SizeofSockaddrAny if err = getsockname(fd, &rsa, &len); err != nil { return } // TODO(jsing): DragonFly has a "bug" (see issue 3349), which should be // reported upstream. if runtime.GOOS == "dragonfly" && rsa.Addr.Family == AF_UNSPEC && rsa.Addr.Len == 0 { rsa.Addr.Family = AF_UNIX rsa.Addr.Len = SizeofSockaddrUnix } return anyToSockaddr(&rsa) } //sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) func GetsockoptByte(fd, level, opt int) (value byte, err error) { var n byte vallen := _Socklen(1) err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen) return n, err } func GetsockoptInet4Addr(fd, level, opt int) (value [4]byte, err error) { vallen := _Socklen(4) err = getsockopt(fd, level, opt, unsafe.Pointer(&value[0]), &vallen) return value, err } func GetsockoptIPMreq(fd, level, opt int) (*IPMreq, error) { var value IPMreq vallen := _Socklen(SizeofIPMreq) err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) return &value, err } func GetsockoptIPv6Mreq(fd, level, opt int) (*IPv6Mreq, error) { var value IPv6Mreq vallen := _Socklen(SizeofIPv6Mreq) err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) return &value, err } func GetsockoptIPv6MTUInfo(fd, level, opt int) (*IPv6MTUInfo, error) { var value IPv6MTUInfo vallen := _Socklen(SizeofIPv6MTUInfo) err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) return &value, err } func GetsockoptICMPv6Filter(fd, level, opt int) (*ICMPv6Filter, error) { var value ICMPv6Filter vallen := _Socklen(SizeofICMPv6Filter) err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) return &value, err } //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { var msg Msghdr var rsa RawSockaddrAny msg.Name = (*byte)(unsafe.Pointer(&rsa)) msg.Namelen = uint32(SizeofSockaddrAny) var iov Iovec if len(p) > 0 { iov.Base = (*byte)(unsafe.Pointer(&p[0])) iov.SetLen(len(p)) } var dummy byte if len(oob) > 0 { // receive at least one normal byte if len(p) == 0 { iov.Base = &dummy iov.SetLen(1) } msg.Control = (*byte)(unsafe.Pointer(&oob[0])) msg.SetControllen(len(oob)) } msg.Iov = &iov msg.Iovlen = 1 if n, err = recvmsg(fd, &msg, flags); err != nil { return } oobn = int(msg.Controllen) recvflags = int(msg.Flags) // source address is only specified if the socket is unconnected if rsa.Addr.Family != AF_UNSPEC { from, err = anyToSockaddr(&rsa) } return } //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { _, err = SendmsgN(fd, p, oob, to, flags) return } func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { var ptr unsafe.Pointer var salen _Socklen if to != nil { ptr, salen, err = to.sockaddr() if err != nil { return 0, err } } var msg Msghdr msg.Name = (*byte)(unsafe.Pointer(ptr)) msg.Namelen = uint32(salen) var iov Iovec if len(p) > 0 { iov.Base = (*byte)(unsafe.Pointer(&p[0])) iov.SetLen(len(p)) } var dummy byte if len(oob) > 0 { // send at least one normal byte if len(p) == 0 { iov.Base = &dummy iov.SetLen(1) } msg.Control = (*byte)(unsafe.Pointer(&oob[0])) msg.SetControllen(len(oob)) } msg.Iov = &iov msg.Iovlen = 1 if n, err = sendmsg(fd, &msg, flags); err != nil { return 0, err } if len(oob) > 0 && len(p) == 0 { n = 0 } return n, nil } //sys kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) func Kevent(kq int, changes, events []Kevent_t, timeout *Timespec) (n int, err error) { var change, event unsafe.Pointer if len(changes) > 0 { change = unsafe.Pointer(&changes[0]) } if len(events) > 0 { event = unsafe.Pointer(&events[0]) } return kevent(kq, change, len(changes), event, len(events), timeout) } //sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL // sysctlmib translates name to mib number and appends any additional args. func sysctlmib(name string, args ...int) ([]_C_int, error) { // Translate name to mib number. mib, err := nametomib(name) if err != nil { return nil, err } for _, a := range args { mib = append(mib, _C_int(a)) } return mib, nil } func Sysctl(name string) (string, error) { return SysctlArgs(name) } func SysctlArgs(name string, args ...int) (string, error) { buf, err := SysctlRaw(name, args...) if err != nil { return "", err } n := len(buf) // Throw away terminating NUL. if n > 0 && buf[n-1] == '\x00' { n-- } return string(buf[0:n]), nil } func SysctlUint32(name string) (uint32, error) { return SysctlUint32Args(name) } func SysctlUint32Args(name string, args ...int) (uint32, error) { mib, err := sysctlmib(name, args...) if err != nil { return 0, err } n := uintptr(4) buf := make([]byte, 4) if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil { return 0, err } if n != 4 { return 0, EIO } return *(*uint32)(unsafe.Pointer(&buf[0])), nil } func SysctlUint64(name string, args ...int) (uint64, error) { mib, err := sysctlmib(name, args...) if err != nil { return 0, err } n := uintptr(8) buf := make([]byte, 8) if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil { return 0, err } if n != 8 { return 0, EIO } return *(*uint64)(unsafe.Pointer(&buf[0])), nil } func SysctlRaw(name string, args ...int) ([]byte, error) { mib, err := sysctlmib(name, args...) if err != nil { return nil, err } // Find size. n := uintptr(0) if err := sysctl(mib, nil, &n, nil, 0); err != nil { return nil, err } if n == 0 { return nil, nil } // Read into buffer of that size. buf := make([]byte, n) if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil { return nil, err } // The actual call may return less than the original reported required // size so ensure we deal with that. return buf[:n], nil } //sys utimes(path string, timeval *[2]Timeval) (err error) func Utimes(path string, tv []Timeval) error { if tv == nil { return utimes(path, nil) } if len(tv) != 2 { return EINVAL } return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) } func UtimesNano(path string, ts []Timespec) error { if ts == nil { err := utimensat(AT_FDCWD, path, nil, 0) if err != ENOSYS { return err } return utimes(path, nil) } if len(ts) != 2 { return EINVAL } // Darwin setattrlist can set nanosecond timestamps err := setattrlistTimes(path, ts, 0) if err != ENOSYS { return err } err = utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) if err != ENOSYS { return err } // Not as efficient as it could be because Timespec and // Timeval have different types in the different OSes tv := [2]Timeval{ NsecToTimeval(TimespecToNsec(ts[0])), NsecToTimeval(TimespecToNsec(ts[1])), } return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) } func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error { if ts == nil { return utimensat(dirfd, path, nil, flags) } if len(ts) != 2 { return EINVAL } err := setattrlistTimes(path, ts, flags) if err != ENOSYS { return err } return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags) } //sys futimes(fd int, timeval *[2]Timeval) (err error) func Futimes(fd int, tv []Timeval) error { if tv == nil { return futimes(fd, nil) } if len(tv) != 2 { return EINVAL } return futimes(fd, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) } //sys fcntl(fd int, cmd int, arg int) (val int, err error) //sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) func Poll(fds []PollFd, timeout int) (n int, err error) { if len(fds) == 0 { return poll(nil, 0, timeout) } return poll(&fds[0], len(fds), timeout) } // TODO: wrap // Acct(name nil-string) (err error) // Gethostuuid(uuid *byte, timeout *Timespec) (err error) // Ptrace(req int, pid int, addr uintptr, data int) (ret uintptr, err error) var mapper = &mmapper{ active: make(map[*byte][]byte), mmap: mmap, munmap: munmap, } func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { return mapper.Mmap(fd, offset, length, prot, flags) } func Munmap(b []byte) (err error) { return mapper.Munmap(b) } //sys Madvise(b []byte, behav int) (err error) //sys Mlock(b []byte) (err error) //sys Mlockall(flags int) (err error) //sys Mprotect(b []byte, prot int) (err error) //sys Msync(b []byte, flags int) (err error) //sys Munlock(b []byte) (err error) //sys Munlockall() (err error) ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_darwin.go ================================================ // Copyright 2009,2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Darwin system calls. // This file is compiled as ordinary Go code, // but it is also input to mksyscall, // which parses the //sys lines and generates system call stubs. // Note that sometimes we use a lowercase //sys name and wrap // it in our own nicer implementation, either here or in // syscall_bsd.go or syscall_unix.go. package unix import ( errorspkg "errors" "syscall" "unsafe" ) const ImplementsGetwd = true func Getwd() (string, error) { buf := make([]byte, 2048) attrs, err := getAttrList(".", attrList{CommonAttr: attrCmnFullpath}, buf, 0) if err == nil && len(attrs) == 1 && len(attrs[0]) >= 2 { wd := string(attrs[0]) // Sanity check that it's an absolute path and ends // in a null byte, which we then strip. if wd[0] == '/' && wd[len(wd)-1] == 0 { return wd[:len(wd)-1], nil } } // If pkg/os/getwd.go gets ENOTSUP, it will fall back to the // slow algorithm. return "", ENOTSUP } type SockaddrDatalink struct { Len uint8 Family uint8 Index uint16 Type uint8 Nlen uint8 Alen uint8 Slen uint8 Data [12]int8 raw RawSockaddrDatalink } // Translate "kern.hostname" to []_C_int{0,1,2,3}. func nametomib(name string) (mib []_C_int, err error) { const siz = unsafe.Sizeof(mib[0]) // NOTE(rsc): It seems strange to set the buffer to have // size CTL_MAXNAME+2 but use only CTL_MAXNAME // as the size. I don't know why the +2 is here, but the // kernel uses +2 for its own implementation of this function. // I am scared that if we don't include the +2 here, the kernel // will silently write 2 words farther than we specify // and we'll get memory corruption. var buf [CTL_MAXNAME + 2]_C_int n := uintptr(CTL_MAXNAME) * siz p := (*byte)(unsafe.Pointer(&buf[0])) bytes, err := ByteSliceFromString(name) if err != nil { return nil, err } // Magic sysctl: "setting" 0.3 to a string name // lets you read back the array of integers form. if err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil { return nil, err } return buf[0 : n/siz], nil } func direntIno(buf []byte) (uint64, bool) { return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino)) } func direntReclen(buf []byte) (uint64, bool) { return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) } func direntNamlen(buf []byte) (uint64, bool) { return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) } //sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error) func PtraceAttach(pid int) (err error) { return ptrace(PT_ATTACH, pid, 0, 0) } func PtraceDetach(pid int) (err error) { return ptrace(PT_DETACH, pid, 0, 0) } const ( attrBitMapCount = 5 attrCmnFullpath = 0x08000000 ) type attrList struct { bitmapCount uint16 _ uint16 CommonAttr uint32 VolAttr uint32 DirAttr uint32 FileAttr uint32 Forkattr uint32 } func getAttrList(path string, attrList attrList, attrBuf []byte, options uint) (attrs [][]byte, err error) { if len(attrBuf) < 4 { return nil, errorspkg.New("attrBuf too small") } attrList.bitmapCount = attrBitMapCount var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return nil, err } _, _, e1 := Syscall6( SYS_GETATTRLIST, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(&attrList)), uintptr(unsafe.Pointer(&attrBuf[0])), uintptr(len(attrBuf)), uintptr(options), 0, ) if e1 != 0 { return nil, e1 } size := *(*uint32)(unsafe.Pointer(&attrBuf[0])) // dat is the section of attrBuf that contains valid data, // without the 4 byte length header. All attribute offsets // are relative to dat. dat := attrBuf if int(size) < len(attrBuf) { dat = dat[:size] } dat = dat[4:] // remove length prefix for i := uint32(0); int(i) < len(dat); { header := dat[i:] if len(header) < 8 { return attrs, errorspkg.New("truncated attribute header") } datOff := *(*int32)(unsafe.Pointer(&header[0])) attrLen := *(*uint32)(unsafe.Pointer(&header[4])) if datOff < 0 || uint32(datOff)+attrLen > uint32(len(dat)) { return attrs, errorspkg.New("truncated results; attrBuf too small") } end := uint32(datOff) + attrLen attrs = append(attrs, dat[datOff:end]) i = end if r := i % 4; r != 0 { i += (4 - r) } } return } //sysnb pipe() (r int, w int, err error) func Pipe(p []int) (err error) { if len(p) != 2 { return EINVAL } p[0], p[1], err = pipe() return } func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { var _p0 unsafe.Pointer var bufsize uintptr if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) } r0, _, e1 := Syscall(SYS_GETFSSTAT64, uintptr(_p0), bufsize, uintptr(flags)) n = int(r0) if e1 != 0 { err = e1 } return } func setattrlistTimes(path string, times []Timespec, flags int) error { _p0, err := BytePtrFromString(path) if err != nil { return err } var attrList attrList attrList.bitmapCount = ATTR_BIT_MAP_COUNT attrList.CommonAttr = ATTR_CMN_MODTIME | ATTR_CMN_ACCTIME // order is mtime, atime: the opposite of Chtimes attributes := [2]Timespec{times[1], times[0]} options := 0 if flags&AT_SYMLINK_NOFOLLOW != 0 { options |= FSOPT_NOFOLLOW } _, _, e1 := Syscall6( SYS_SETATTRLIST, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(&attrList)), uintptr(unsafe.Pointer(&attributes)), uintptr(unsafe.Sizeof(attributes)), uintptr(options), 0, ) if e1 != 0 { return e1 } return nil } func utimensat(dirfd int, path string, times *[2]Timespec, flags int) error { // Darwin doesn't support SYS_UTIMENSAT return ENOSYS } /* * Wrapped */ //sys kill(pid int, signum int, posix int) (err error) func Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(signum), 1) } //sys ioctl(fd int, req uint, arg uintptr) (err error) // ioctl itself should not be exposed directly, but additional get/set // functions for specific types are permissible. // IoctlSetInt performs an ioctl operation which sets an integer value // on fd, using the specified request number. func IoctlSetInt(fd int, req uint, value int) error { return ioctl(fd, req, uintptr(value)) } func IoctlSetWinsize(fd int, req uint, value *Winsize) error { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } func IoctlSetTermios(fd int, req uint, value *Termios) error { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } // IoctlGetInt performs an ioctl operation which gets an integer value // from fd, using the specified request number. func IoctlGetInt(fd int, req uint) (int, error) { var value int err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) return value, err } func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { var value Winsize err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) return &value, err } func IoctlGetTermios(fd int, req uint) (*Termios, error) { var value Termios err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) return &value, err } /* * Exposed directly */ //sys Access(path string, mode uint32) (err error) //sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) //sys Chdir(path string) (err error) //sys Chflags(path string, flags int) (err error) //sys Chmod(path string, mode uint32) (err error) //sys Chown(path string, uid int, gid int) (err error) //sys Chroot(path string) (err error) //sys Close(fd int) (err error) //sys Dup(fd int) (nfd int, err error) //sys Dup2(from int, to int) (err error) //sys Exchangedata(path1 string, path2 string, options int) (err error) //sys Exit(code int) //sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) //sys Fchdir(fd int) (err error) //sys Fchflags(fd int, flags int) (err error) //sys Fchmod(fd int, mode uint32) (err error) //sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) //sys Fchown(fd int, uid int, gid int) (err error) //sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) //sys Flock(fd int, how int) (err error) //sys Fpathconf(fd int, name int) (val int, err error) //sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 //sys Fstatfs(fd int, stat *Statfs_t) (err error) = SYS_FSTATFS64 //sys Fsync(fd int) (err error) //sys Ftruncate(fd int, length int64) (err error) //sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) = SYS_GETDIRENTRIES64 //sys Getdtablesize() (size int) //sysnb Getegid() (egid int) //sysnb Geteuid() (uid int) //sysnb Getgid() (gid int) //sysnb Getpgid(pid int) (pgid int, err error) //sysnb Getpgrp() (pgrp int) //sysnb Getpid() (pid int) //sysnb Getppid() (ppid int) //sys Getpriority(which int, who int) (prio int, err error) //sysnb Getrlimit(which int, lim *Rlimit) (err error) //sysnb Getrusage(who int, rusage *Rusage) (err error) //sysnb Getsid(pid int) (sid int, err error) //sysnb Getuid() (uid int) //sysnb Issetugid() (tainted bool) //sys Kqueue() (fd int, err error) //sys Lchown(path string, uid int, gid int) (err error) //sys Link(path string, link string) (err error) //sys Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) //sys Listen(s int, backlog int) (err error) //sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 //sys Mkdir(path string, mode uint32) (err error) //sys Mkdirat(dirfd int, path string, mode uint32) (err error) //sys Mkfifo(path string, mode uint32) (err error) //sys Mknod(path string, mode uint32, dev int) (err error) //sys Open(path string, mode int, perm uint32) (fd int, err error) //sys Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) //sys Pathconf(path string, name int) (val int, err error) //sys Pread(fd int, p []byte, offset int64) (n int, err error) //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) //sys read(fd int, p []byte) (n int, err error) //sys Readlink(path string, buf []byte) (n int, err error) //sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error) //sys Rename(from string, to string) (err error) //sys Renameat(fromfd int, from string, tofd int, to string) (err error) //sys Revoke(path string) (err error) //sys Rmdir(path string) (err error) //sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK //sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) //sys Setegid(egid int) (err error) //sysnb Seteuid(euid int) (err error) //sysnb Setgid(gid int) (err error) //sys Setlogin(name string) (err error) //sysnb Setpgid(pid int, pgid int) (err error) //sys Setpriority(which int, who int, prio int) (err error) //sys Setprivexec(flag int) (err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setreuid(ruid int, euid int) (err error) //sysnb Setrlimit(which int, lim *Rlimit) (err error) //sysnb Setsid() (pid int, err error) //sysnb Settimeofday(tp *Timeval) (err error) //sysnb Setuid(uid int) (err error) //sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 //sys Statfs(path string, stat *Statfs_t) (err error) = SYS_STATFS64 //sys Symlink(path string, link string) (err error) //sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error) //sys Sync() (err error) //sys Truncate(path string, length int64) (err error) //sys Umask(newmask int) (oldmask int) //sys Undelete(path string) (err error) //sys Unlink(path string) (err error) //sys Unlinkat(dirfd int, path string, flags int) (err error) //sys Unmount(path string, flags int) (err error) //sys write(fd int, p []byte) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) //sys munmap(addr uintptr, length uintptr) (err error) //sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ //sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE /* * Unimplemented */ // Profil // Sigaction // Sigprocmask // Getlogin // Sigpending // Sigaltstack // Ioctl // Reboot // Execve // Vfork // Sbrk // Sstk // Ovadvise // Mincore // Setitimer // Swapon // Select // Sigsuspend // Readv // Writev // Nfssvc // Getfh // Quotactl // Mount // Csops // Waitid // Add_profil // Kdebug_trace // Sigreturn // Atsocket // Kqueue_from_portset_np // Kqueue_portset // Getattrlist // Setattrlist // Getdirentriesattr // Searchfs // Delete // Copyfile // Watchevent // Waitevent // Modwatch // Getxattr // Fgetxattr // Setxattr // Fsetxattr // Removexattr // Fremovexattr // Listxattr // Flistxattr // Fsctl // Initgroups // Posix_spawn // Nfsclnt // Fhopen // Minherit // Semsys // Msgsys // Shmsys // Semctl // Semget // Semop // Msgctl // Msgget // Msgsnd // Msgrcv // Shmat // Shmctl // Shmdt // Shmget // Shm_open // Shm_unlink // Sem_open // Sem_close // Sem_unlink // Sem_wait // Sem_trywait // Sem_post // Sem_getvalue // Sem_init // Sem_destroy // Open_extended // Umask_extended // Stat_extended // Lstat_extended // Fstat_extended // Chmod_extended // Fchmod_extended // Access_extended // Settid // Gettid // Setsgroups // Getsgroups // Setwgroups // Getwgroups // Mkfifo_extended // Mkdir_extended // Identitysvc // Shared_region_check_np // Shared_region_map_np // __pthread_mutex_destroy // __pthread_mutex_init // __pthread_mutex_lock // __pthread_mutex_trylock // __pthread_mutex_unlock // __pthread_cond_init // __pthread_cond_destroy // __pthread_cond_broadcast // __pthread_cond_signal // Setsid_with_pid // __pthread_cond_timedwait // Aio_fsync // Aio_return // Aio_suspend // Aio_cancel // Aio_error // Aio_read // Aio_write // Lio_listio // __pthread_cond_wait // Iopolicysys // __pthread_kill // __pthread_sigmask // __sigwait // __disable_threadsignal // __pthread_markcancel // __pthread_canceled // __semwait_signal // Proc_info // sendfile // Stat64_extended // Lstat64_extended // Fstat64_extended // __pthread_chdir // __pthread_fchdir // Audit // Auditon // Getauid // Setauid // Getaudit // Setaudit // Getaudit_addr // Setaudit_addr // Auditctl // Bsdthread_create // Bsdthread_terminate // Stack_snapshot // Bsdthread_register // Workq_open // Workq_ops // __mac_execve // __mac_syscall // __mac_get_file // __mac_set_file // __mac_get_link // __mac_set_link // __mac_get_proc // __mac_set_proc // __mac_get_fd // __mac_set_fd // __mac_get_pid // __mac_get_lcid // __mac_get_lctx // __mac_set_lctx // Setlcid // Read_nocancel // Write_nocancel // Open_nocancel // Close_nocancel // Wait4_nocancel // Recvmsg_nocancel // Sendmsg_nocancel // Recvfrom_nocancel // Accept_nocancel // Fcntl_nocancel // Select_nocancel // Fsync_nocancel // Connect_nocancel // Sigsuspend_nocancel // Readv_nocancel // Writev_nocancel // Sendto_nocancel // Pread_nocancel // Pwrite_nocancel // Waitid_nocancel // Poll_nocancel // Msgsnd_nocancel // Msgrcv_nocancel // Sem_wait_nocancel // Aio_suspend_nocancel // __sigwait_nocancel // __semwait_signal_nocancel // __mac_mount // __mac_get_mount // __mac_getfsstat ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_darwin_386.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build 386,darwin package unix import ( "syscall" "unsafe" ) func setTimespec(sec, nsec int64) Timespec { return Timespec{Sec: int32(sec), Nsec: int32(nsec)} } func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: int32(sec), Usec: int32(usec)} } //sysnb gettimeofday(tp *Timeval) (sec int32, usec int32, err error) func Gettimeofday(tv *Timeval) (err error) { // The tv passed to gettimeofday must be non-nil // but is otherwise unused. The answers come back // in the two registers. sec, usec, err := gettimeofday(tv) tv.Sec = int32(sec) tv.Usec = int32(usec) return err } func SetKevent(k *Kevent_t, fd, mode, flags int) { k.Ident = uint32(fd) k.Filter = int16(mode) k.Flags = uint16(flags) } func (iov *Iovec) SetLen(length int) { iov.Len = uint32(length) } func (msghdr *Msghdr) SetControllen(length int) { msghdr.Controllen = uint32(length) } func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint32(length) } func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { var length = uint64(count) _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(*offset>>32), uintptr(unsafe.Pointer(&length)), 0, 0, 0, 0) written = int(length) if e1 != 0 { err = e1 } return } func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) // SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions // of darwin/386 the syscall is called sysctl instead of __sysctl. const SYS___SYSCTL = SYS_SYSCTL ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build amd64,darwin package unix import ( "syscall" "unsafe" ) func setTimespec(sec, nsec int64) Timespec { return Timespec{Sec: sec, Nsec: nsec} } func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: sec, Usec: int32(usec)} } //sysnb gettimeofday(tp *Timeval) (sec int64, usec int32, err error) func Gettimeofday(tv *Timeval) (err error) { // The tv passed to gettimeofday must be non-nil // but is otherwise unused. The answers come back // in the two registers. sec, usec, err := gettimeofday(tv) tv.Sec = sec tv.Usec = usec return err } func SetKevent(k *Kevent_t, fd, mode, flags int) { k.Ident = uint64(fd) k.Filter = int16(mode) k.Flags = uint16(flags) } func (iov *Iovec) SetLen(length int) { iov.Len = uint64(length) } func (msghdr *Msghdr) SetControllen(length int) { msghdr.Controllen = uint32(length) } func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint32(length) } func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { var length = uint64(count) _, _, e1 := Syscall6(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(unsafe.Pointer(&length)), 0, 0) written = int(length) if e1 != 0 { err = e1 } return } func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) // SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions // of darwin/amd64 the syscall is called sysctl instead of __sysctl. const SYS___SYSCTL = SYS_SYSCTL ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_darwin_arm.go ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package unix import ( "syscall" "unsafe" ) func setTimespec(sec, nsec int64) Timespec { return Timespec{Sec: int32(sec), Nsec: int32(nsec)} } func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: int32(sec), Usec: int32(usec)} } //sysnb gettimeofday(tp *Timeval) (sec int32, usec int32, err error) func Gettimeofday(tv *Timeval) (err error) { // The tv passed to gettimeofday must be non-nil // but is otherwise unused. The answers come back // in the two registers. sec, usec, err := gettimeofday(tv) tv.Sec = int32(sec) tv.Usec = int32(usec) return err } func SetKevent(k *Kevent_t, fd, mode, flags int) { k.Ident = uint32(fd) k.Filter = int16(mode) k.Flags = uint16(flags) } func (iov *Iovec) SetLen(length int) { iov.Len = uint32(length) } func (msghdr *Msghdr) SetControllen(length int) { msghdr.Controllen = uint32(length) } func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint32(length) } func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { var length = uint64(count) _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(*offset>>32), uintptr(unsafe.Pointer(&length)), 0, 0, 0, 0) written = int(length) if e1 != 0 { err = e1 } return } func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) // sic ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build arm64,darwin package unix import ( "syscall" "unsafe" ) func setTimespec(sec, nsec int64) Timespec { return Timespec{Sec: sec, Nsec: nsec} } func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: sec, Usec: int32(usec)} } //sysnb gettimeofday(tp *Timeval) (sec int64, usec int32, err error) func Gettimeofday(tv *Timeval) (err error) { // The tv passed to gettimeofday must be non-nil // but is otherwise unused. The answers come back // in the two registers. sec, usec, err := gettimeofday(tv) tv.Sec = sec tv.Usec = usec return err } func SetKevent(k *Kevent_t, fd, mode, flags int) { k.Ident = uint64(fd) k.Filter = int16(mode) k.Flags = uint16(flags) } func (iov *Iovec) SetLen(length int) { iov.Len = uint64(length) } func (msghdr *Msghdr) SetControllen(length int) { msghdr.Controllen = uint32(length) } func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint32(length) } func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { var length = uint64(count) _, _, e1 := Syscall6(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(unsafe.Pointer(&length)), 0, 0) written = int(length) if e1 != 0 { err = e1 } return } func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) // sic // SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions // of darwin/arm64 the syscall is called sysctl instead of __sysctl. const SYS___SYSCTL = SYS_SYSCTL ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_dragonfly.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // DragonFly BSD system calls. // This file is compiled as ordinary Go code, // but it is also input to mksyscall, // which parses the //sys lines and generates system call stubs. // Note that sometimes we use a lowercase //sys name and wrap // it in our own nicer implementation, either here or in // syscall_bsd.go or syscall_unix.go. package unix import "unsafe" type SockaddrDatalink struct { Len uint8 Family uint8 Index uint16 Type uint8 Nlen uint8 Alen uint8 Slen uint8 Data [12]int8 Rcf uint16 Route [16]uint16 raw RawSockaddrDatalink } // Translate "kern.hostname" to []_C_int{0,1,2,3}. func nametomib(name string) (mib []_C_int, err error) { const siz = unsafe.Sizeof(mib[0]) // NOTE(rsc): It seems strange to set the buffer to have // size CTL_MAXNAME+2 but use only CTL_MAXNAME // as the size. I don't know why the +2 is here, but the // kernel uses +2 for its own implementation of this function. // I am scared that if we don't include the +2 here, the kernel // will silently write 2 words farther than we specify // and we'll get memory corruption. var buf [CTL_MAXNAME + 2]_C_int n := uintptr(CTL_MAXNAME) * siz p := (*byte)(unsafe.Pointer(&buf[0])) bytes, err := ByteSliceFromString(name) if err != nil { return nil, err } // Magic sysctl: "setting" 0.3 to a string name // lets you read back the array of integers form. if err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil { return nil, err } return buf[0 : n/siz], nil } func direntIno(buf []byte) (uint64, bool) { return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno)) } func direntReclen(buf []byte) (uint64, bool) { namlen, ok := direntNamlen(buf) if !ok { return 0, false } return (16 + namlen + 1 + 7) &^ 7, true } func direntNamlen(buf []byte) (uint64, bool) { return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) } //sysnb pipe() (r int, w int, err error) func Pipe(p []int) (err error) { if len(p) != 2 { return EINVAL } p[0], p[1], err = pipe() return } //sys extpread(fd int, p []byte, flags int, offset int64) (n int, err error) func Pread(fd int, p []byte, offset int64) (n int, err error) { return extpread(fd, p, 0, offset) } //sys extpwrite(fd int, p []byte, flags int, offset int64) (n int, err error) func Pwrite(fd int, p []byte, offset int64) (n int, err error) { return extpwrite(fd, p, 0, offset) } func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) { var rsa RawSockaddrAny var len _Socklen = SizeofSockaddrAny nfd, err = accept4(fd, &rsa, &len, flags) if err != nil { return } if len > SizeofSockaddrAny { panic("RawSockaddrAny too small") } sa, err = anyToSockaddr(&rsa) if err != nil { Close(nfd) nfd = 0 } return } func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { var _p0 unsafe.Pointer var bufsize uintptr if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) } r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags)) n = int(r0) if e1 != 0 { err = e1 } return } func setattrlistTimes(path string, times []Timespec, flags int) error { // used on Darwin for UtimesNano return ENOSYS } //sys ioctl(fd int, req uint, arg uintptr) (err error) // ioctl itself should not be exposed directly, but additional get/set // functions for specific types are permissible. // IoctlSetInt performs an ioctl operation which sets an integer value // on fd, using the specified request number. func IoctlSetInt(fd int, req uint, value int) error { return ioctl(fd, req, uintptr(value)) } func IoctlSetWinsize(fd int, req uint, value *Winsize) error { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } func IoctlSetTermios(fd int, req uint, value *Termios) error { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } // IoctlGetInt performs an ioctl operation which gets an integer value // from fd, using the specified request number. func IoctlGetInt(fd int, req uint) (int, error) { var value int err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) return value, err } func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { var value Winsize err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) return &value, err } func IoctlGetTermios(fd int, req uint) (*Termios, error) { var value Termios err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) return &value, err } /* * Exposed directly */ //sys Access(path string, mode uint32) (err error) //sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) //sys Chdir(path string) (err error) //sys Chflags(path string, flags int) (err error) //sys Chmod(path string, mode uint32) (err error) //sys Chown(path string, uid int, gid int) (err error) //sys Chroot(path string) (err error) //sys Close(fd int) (err error) //sys Dup(fd int) (nfd int, err error) //sys Dup2(from int, to int) (err error) //sys Exit(code int) //sys Fchdir(fd int) (err error) //sys Fchflags(fd int, flags int) (err error) //sys Fchmod(fd int, mode uint32) (err error) //sys Fchown(fd int, uid int, gid int) (err error) //sys Flock(fd int, how int) (err error) //sys Fpathconf(fd int, name int) (val int, err error) //sys Fstat(fd int, stat *Stat_t) (err error) //sys Fstatfs(fd int, stat *Statfs_t) (err error) //sys Fsync(fd int) (err error) //sys Ftruncate(fd int, length int64) (err error) //sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) //sys Getdtablesize() (size int) //sysnb Getegid() (egid int) //sysnb Geteuid() (uid int) //sysnb Getgid() (gid int) //sysnb Getpgid(pid int) (pgid int, err error) //sysnb Getpgrp() (pgrp int) //sysnb Getpid() (pid int) //sysnb Getppid() (ppid int) //sys Getpriority(which int, who int) (prio int, err error) //sysnb Getrlimit(which int, lim *Rlimit) (err error) //sysnb Getrusage(who int, rusage *Rusage) (err error) //sysnb Getsid(pid int) (sid int, err error) //sysnb Gettimeofday(tv *Timeval) (err error) //sysnb Getuid() (uid int) //sys Issetugid() (tainted bool) //sys Kill(pid int, signum syscall.Signal) (err error) //sys Kqueue() (fd int, err error) //sys Lchown(path string, uid int, gid int) (err error) //sys Link(path string, link string) (err error) //sys Listen(s int, backlog int) (err error) //sys Lstat(path string, stat *Stat_t) (err error) //sys Mkdir(path string, mode uint32) (err error) //sys Mkfifo(path string, mode uint32) (err error) //sys Mknod(path string, mode uint32, dev int) (err error) //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) //sys Open(path string, mode int, perm uint32) (fd int, err error) //sys Pathconf(path string, name int) (val int, err error) //sys read(fd int, p []byte) (n int, err error) //sys Readlink(path string, buf []byte) (n int, err error) //sys Rename(from string, to string) (err error) //sys Revoke(path string) (err error) //sys Rmdir(path string) (err error) //sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK //sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) //sysnb Setegid(egid int) (err error) //sysnb Seteuid(euid int) (err error) //sysnb Setgid(gid int) (err error) //sys Setlogin(name string) (err error) //sysnb Setpgid(pid int, pgid int) (err error) //sys Setpriority(which int, who int, prio int) (err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setreuid(ruid int, euid int) (err error) //sysnb Setresgid(rgid int, egid int, sgid int) (err error) //sysnb Setresuid(ruid int, euid int, suid int) (err error) //sysnb Setrlimit(which int, lim *Rlimit) (err error) //sysnb Setsid() (pid int, err error) //sysnb Settimeofday(tp *Timeval) (err error) //sysnb Setuid(uid int) (err error) //sys Stat(path string, stat *Stat_t) (err error) //sys Statfs(path string, stat *Statfs_t) (err error) //sys Symlink(path string, link string) (err error) //sys Sync() (err error) //sys Truncate(path string, length int64) (err error) //sys Umask(newmask int) (oldmask int) //sys Undelete(path string) (err error) //sys Unlink(path string) (err error) //sys Unmount(path string, flags int) (err error) //sys write(fd int, p []byte) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) //sys munmap(addr uintptr, length uintptr) (err error) //sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ //sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE //sys accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) //sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) /* * Unimplemented * TODO(jsing): Update this list for DragonFly. */ // Profil // Sigaction // Sigprocmask // Getlogin // Sigpending // Sigaltstack // Reboot // Execve // Vfork // Sbrk // Sstk // Ovadvise // Mincore // Setitimer // Swapon // Select // Sigsuspend // Readv // Writev // Nfssvc // Getfh // Quotactl // Mount // Csops // Waitid // Add_profil // Kdebug_trace // Sigreturn // Atsocket // Kqueue_from_portset_np // Kqueue_portset // Getattrlist // Setattrlist // Getdirentriesattr // Searchfs // Delete // Copyfile // Watchevent // Waitevent // Modwatch // Getxattr // Fgetxattr // Setxattr // Fsetxattr // Removexattr // Fremovexattr // Listxattr // Flistxattr // Fsctl // Initgroups // Posix_spawn // Nfsclnt // Fhopen // Minherit // Semsys // Msgsys // Shmsys // Semctl // Semget // Semop // Msgctl // Msgget // Msgsnd // Msgrcv // Shmat // Shmctl // Shmdt // Shmget // Shm_open // Shm_unlink // Sem_open // Sem_close // Sem_unlink // Sem_wait // Sem_trywait // Sem_post // Sem_getvalue // Sem_init // Sem_destroy // Open_extended // Umask_extended // Stat_extended // Lstat_extended // Fstat_extended // Chmod_extended // Fchmod_extended // Access_extended // Settid // Gettid // Setsgroups // Getsgroups // Setwgroups // Getwgroups // Mkfifo_extended // Mkdir_extended // Identitysvc // Shared_region_check_np // Shared_region_map_np // __pthread_mutex_destroy // __pthread_mutex_init // __pthread_mutex_lock // __pthread_mutex_trylock // __pthread_mutex_unlock // __pthread_cond_init // __pthread_cond_destroy // __pthread_cond_broadcast // __pthread_cond_signal // Setsid_with_pid // __pthread_cond_timedwait // Aio_fsync // Aio_return // Aio_suspend // Aio_cancel // Aio_error // Aio_read // Aio_write // Lio_listio // __pthread_cond_wait // Iopolicysys // __pthread_kill // __pthread_sigmask // __sigwait // __disable_threadsignal // __pthread_markcancel // __pthread_canceled // __semwait_signal // Proc_info // Stat64_extended // Lstat64_extended // Fstat64_extended // __pthread_chdir // __pthread_fchdir // Audit // Auditon // Getauid // Setauid // Getaudit // Setaudit // Getaudit_addr // Setaudit_addr // Auditctl // Bsdthread_create // Bsdthread_terminate // Stack_snapshot // Bsdthread_register // Workq_open // Workq_ops // __mac_execve // __mac_syscall // __mac_get_file // __mac_set_file // __mac_get_link // __mac_set_link // __mac_get_proc // __mac_set_proc // __mac_get_fd // __mac_set_fd // __mac_get_pid // __mac_get_lcid // __mac_get_lctx // __mac_set_lctx // Setlcid // Read_nocancel // Write_nocancel // Open_nocancel // Close_nocancel // Wait4_nocancel // Recvmsg_nocancel // Sendmsg_nocancel // Recvfrom_nocancel // Accept_nocancel // Fcntl_nocancel // Select_nocancel // Fsync_nocancel // Connect_nocancel // Sigsuspend_nocancel // Readv_nocancel // Writev_nocancel // Sendto_nocancel // Pread_nocancel // Pwrite_nocancel // Waitid_nocancel // Msgsnd_nocancel // Msgrcv_nocancel // Sem_wait_nocancel // Aio_suspend_nocancel // __sigwait_nocancel // __semwait_signal_nocancel // __mac_mount // __mac_get_mount // __mac_getfsstat ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build amd64,dragonfly package unix import ( "syscall" "unsafe" ) func setTimespec(sec, nsec int64) Timespec { return Timespec{Sec: sec, Nsec: nsec} } func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: sec, Usec: usec} } func SetKevent(k *Kevent_t, fd, mode, flags int) { k.Ident = uint64(fd) k.Filter = int16(mode) k.Flags = uint16(flags) } func (iov *Iovec) SetLen(length int) { iov.Len = uint64(length) } func (msghdr *Msghdr) SetControllen(length int) { msghdr.Controllen = uint32(length) } func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint32(length) } func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { var writtenOut uint64 = 0 _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0, 0) written = int(writtenOut) if e1 != 0 { err = e1 } return } func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_freebsd.go ================================================ // Copyright 2009,2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // FreeBSD system calls. // This file is compiled as ordinary Go code, // but it is also input to mksyscall, // which parses the //sys lines and generates system call stubs. // Note that sometimes we use a lowercase //sys name and wrap // it in our own nicer implementation, either here or in // syscall_bsd.go or syscall_unix.go. package unix import "unsafe" type SockaddrDatalink struct { Len uint8 Family uint8 Index uint16 Type uint8 Nlen uint8 Alen uint8 Slen uint8 Data [46]int8 raw RawSockaddrDatalink } // Translate "kern.hostname" to []_C_int{0,1,2,3}. func nametomib(name string) (mib []_C_int, err error) { const siz = unsafe.Sizeof(mib[0]) // NOTE(rsc): It seems strange to set the buffer to have // size CTL_MAXNAME+2 but use only CTL_MAXNAME // as the size. I don't know why the +2 is here, but the // kernel uses +2 for its own implementation of this function. // I am scared that if we don't include the +2 here, the kernel // will silently write 2 words farther than we specify // and we'll get memory corruption. var buf [CTL_MAXNAME + 2]_C_int n := uintptr(CTL_MAXNAME) * siz p := (*byte)(unsafe.Pointer(&buf[0])) bytes, err := ByteSliceFromString(name) if err != nil { return nil, err } // Magic sysctl: "setting" 0.3 to a string name // lets you read back the array of integers form. if err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil { return nil, err } return buf[0 : n/siz], nil } func direntIno(buf []byte) (uint64, bool) { return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno)) } func direntReclen(buf []byte) (uint64, bool) { return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) } func direntNamlen(buf []byte) (uint64, bool) { return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) } //sysnb pipe() (r int, w int, err error) func Pipe(p []int) (err error) { if len(p) != 2 { return EINVAL } p[0], p[1], err = pipe() return } func GetsockoptIPMreqn(fd, level, opt int) (*IPMreqn, error) { var value IPMreqn vallen := _Socklen(SizeofIPMreqn) errno := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) return &value, errno } func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) { return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq)) } func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) { var rsa RawSockaddrAny var len _Socklen = SizeofSockaddrAny nfd, err = accept4(fd, &rsa, &len, flags) if err != nil { return } if len > SizeofSockaddrAny { panic("RawSockaddrAny too small") } sa, err = anyToSockaddr(&rsa) if err != nil { Close(nfd) nfd = 0 } return } func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { var _p0 unsafe.Pointer var bufsize uintptr if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) } r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags)) n = int(r0) if e1 != 0 { err = e1 } return } func setattrlistTimes(path string, times []Timespec, flags int) error { // used on Darwin for UtimesNano return ENOSYS } // Derive extattr namespace and attribute name func xattrnamespace(fullattr string) (ns int, attr string, err error) { s := -1 for idx, val := range fullattr { if val == '.' { s = idx break } } if s == -1 { return -1, "", ENOATTR } namespace := fullattr[0:s] attr = fullattr[s+1:] switch namespace { case "user": return EXTATTR_NAMESPACE_USER, attr, nil case "system": return EXTATTR_NAMESPACE_SYSTEM, attr, nil default: return -1, "", ENOATTR } } func initxattrdest(dest []byte, idx int) (d unsafe.Pointer) { if len(dest) > idx { return unsafe.Pointer(&dest[idx]) } else { return unsafe.Pointer(_zero) } } // FreeBSD implements its own syscalls to handle extended attributes func Getxattr(file string, attr string, dest []byte) (sz int, err error) { d := initxattrdest(dest, 0) destsize := len(dest) nsid, a, err := xattrnamespace(attr) if err != nil { return -1, err } return ExtattrGetFile(file, nsid, a, uintptr(d), destsize) } func Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) { d := initxattrdest(dest, 0) destsize := len(dest) nsid, a, err := xattrnamespace(attr) if err != nil { return -1, err } return ExtattrGetFd(fd, nsid, a, uintptr(d), destsize) } func Lgetxattr(link string, attr string, dest []byte) (sz int, err error) { d := initxattrdest(dest, 0) destsize := len(dest) nsid, a, err := xattrnamespace(attr) if err != nil { return -1, err } return ExtattrGetLink(link, nsid, a, uintptr(d), destsize) } // flags are unused on FreeBSD func Fsetxattr(fd int, attr string, data []byte, flags int) (err error) { d := unsafe.Pointer(&data[0]) datasiz := len(data) nsid, a, err := xattrnamespace(attr) if err != nil { return } _, err = ExtattrSetFd(fd, nsid, a, uintptr(d), datasiz) return } func Setxattr(file string, attr string, data []byte, flags int) (err error) { d := unsafe.Pointer(&data[0]) datasiz := len(data) nsid, a, err := xattrnamespace(attr) if err != nil { return } _, err = ExtattrSetFile(file, nsid, a, uintptr(d), datasiz) return } func Lsetxattr(link string, attr string, data []byte, flags int) (err error) { d := unsafe.Pointer(&data[0]) datasiz := len(data) nsid, a, err := xattrnamespace(attr) if err != nil { return } _, err = ExtattrSetLink(link, nsid, a, uintptr(d), datasiz) return } func Removexattr(file string, attr string) (err error) { nsid, a, err := xattrnamespace(attr) if err != nil { return } err = ExtattrDeleteFile(file, nsid, a) return } func Fremovexattr(fd int, attr string) (err error) { nsid, a, err := xattrnamespace(attr) if err != nil { return } err = ExtattrDeleteFd(fd, nsid, a) return } func Lremovexattr(link string, attr string) (err error) { nsid, a, err := xattrnamespace(attr) if err != nil { return } err = ExtattrDeleteLink(link, nsid, a) return } func Listxattr(file string, dest []byte) (sz int, err error) { d := initxattrdest(dest, 0) destsiz := len(dest) // FreeBSD won't allow you to list xattrs from multiple namespaces s := 0 var e error for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} { stmp, e := ExtattrListFile(file, nsid, uintptr(d), destsiz) /* Errors accessing system attrs are ignored so that * we can implement the Linux-like behavior of omitting errors that * we don't have read permissions on * * Linux will still error if we ask for user attributes on a file that * we don't have read permissions on, so don't ignore those errors */ if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER { e = nil continue } else if e != nil { return s, e } s += stmp destsiz -= s if destsiz < 0 { destsiz = 0 } d = initxattrdest(dest, s) } return s, e } func Flistxattr(fd int, dest []byte) (sz int, err error) { d := initxattrdest(dest, 0) destsiz := len(dest) s := 0 var e error for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} { stmp, e := ExtattrListFd(fd, nsid, uintptr(d), destsiz) if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER { e = nil continue } else if e != nil { return s, e } s += stmp destsiz -= s if destsiz < 0 { destsiz = 0 } d = initxattrdest(dest, s) } return s, e } func Llistxattr(link string, dest []byte) (sz int, err error) { d := initxattrdest(dest, 0) destsiz := len(dest) s := 0 var e error for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} { stmp, e := ExtattrListLink(link, nsid, uintptr(d), destsiz) if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER { e = nil continue } else if e != nil { return s, e } s += stmp destsiz -= s if destsiz < 0 { destsiz = 0 } d = initxattrdest(dest, s) } return s, e } //sys ioctl(fd int, req uint, arg uintptr) (err error) // ioctl itself should not be exposed directly, but additional get/set // functions for specific types are permissible. // IoctlSetInt performs an ioctl operation which sets an integer value // on fd, using the specified request number. func IoctlSetInt(fd int, req uint, value int) error { return ioctl(fd, req, uintptr(value)) } func IoctlSetWinsize(fd int, req uint, value *Winsize) error { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } func IoctlSetTermios(fd int, req uint, value *Termios) error { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } // IoctlGetInt performs an ioctl operation which gets an integer value // from fd, using the specified request number. func IoctlGetInt(fd int, req uint) (int, error) { var value int err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) return value, err } func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { var value Winsize err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) return &value, err } func IoctlGetTermios(fd int, req uint) (*Termios, error) { var value Termios err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) return &value, err } /* * Exposed directly */ //sys Access(path string, mode uint32) (err error) //sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) //sys CapEnter() (err error) //sys capRightsGet(version int, fd int, rightsp *CapRights) (err error) = SYS___CAP_RIGHTS_GET //sys capRightsLimit(fd int, rightsp *CapRights) (err error) //sys Chdir(path string) (err error) //sys Chflags(path string, flags int) (err error) //sys Chmod(path string, mode uint32) (err error) //sys Chown(path string, uid int, gid int) (err error) //sys Chroot(path string) (err error) //sys Close(fd int) (err error) //sys Dup(fd int) (nfd int, err error) //sys Dup2(from int, to int) (err error) //sys Exit(code int) //sys ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) //sys ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) //sys ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) //sys ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) //sys ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) //sys ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) //sys ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) //sys ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) //sys ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) //sys ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) //sys ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) //sys ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) //sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_POSIX_FADVISE //sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) //sys Fchdir(fd int) (err error) //sys Fchflags(fd int, flags int) (err error) //sys Fchmod(fd int, mode uint32) (err error) //sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) //sys Fchown(fd int, uid int, gid int) (err error) //sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) //sys Flock(fd int, how int) (err error) //sys Fpathconf(fd int, name int) (val int, err error) //sys Fstat(fd int, stat *Stat_t) (err error) //sys Fstatfs(fd int, stat *Statfs_t) (err error) //sys Fsync(fd int) (err error) //sys Ftruncate(fd int, length int64) (err error) //sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) //sys Getdtablesize() (size int) //sysnb Getegid() (egid int) //sysnb Geteuid() (uid int) //sysnb Getgid() (gid int) //sysnb Getpgid(pid int) (pgid int, err error) //sysnb Getpgrp() (pgrp int) //sysnb Getpid() (pid int) //sysnb Getppid() (ppid int) //sys Getpriority(which int, who int) (prio int, err error) //sysnb Getrlimit(which int, lim *Rlimit) (err error) //sysnb Getrusage(who int, rusage *Rusage) (err error) //sysnb Getsid(pid int) (sid int, err error) //sysnb Gettimeofday(tv *Timeval) (err error) //sysnb Getuid() (uid int) //sys Issetugid() (tainted bool) //sys Kill(pid int, signum syscall.Signal) (err error) //sys Kqueue() (fd int, err error) //sys Lchown(path string, uid int, gid int) (err error) //sys Link(path string, link string) (err error) //sys Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) //sys Listen(s int, backlog int) (err error) //sys Lstat(path string, stat *Stat_t) (err error) //sys Mkdir(path string, mode uint32) (err error) //sys Mkdirat(dirfd int, path string, mode uint32) (err error) //sys Mkfifo(path string, mode uint32) (err error) //sys Mknod(path string, mode uint32, dev int) (err error) //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) //sys Open(path string, mode int, perm uint32) (fd int, err error) //sys Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) //sys Pathconf(path string, name int) (val int, err error) //sys Pread(fd int, p []byte, offset int64) (n int, err error) //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) //sys read(fd int, p []byte) (n int, err error) //sys Readlink(path string, buf []byte) (n int, err error) //sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error) //sys Rename(from string, to string) (err error) //sys Renameat(fromfd int, from string, tofd int, to string) (err error) //sys Revoke(path string) (err error) //sys Rmdir(path string) (err error) //sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK //sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) //sysnb Setegid(egid int) (err error) //sysnb Seteuid(euid int) (err error) //sysnb Setgid(gid int) (err error) //sys Setlogin(name string) (err error) //sysnb Setpgid(pid int, pgid int) (err error) //sys Setpriority(which int, who int, prio int) (err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setreuid(ruid int, euid int) (err error) //sysnb Setresgid(rgid int, egid int, sgid int) (err error) //sysnb Setresuid(ruid int, euid int, suid int) (err error) //sysnb Setrlimit(which int, lim *Rlimit) (err error) //sysnb Setsid() (pid int, err error) //sysnb Settimeofday(tp *Timeval) (err error) //sysnb Setuid(uid int) (err error) //sys Stat(path string, stat *Stat_t) (err error) //sys Statfs(path string, stat *Statfs_t) (err error) //sys Symlink(path string, link string) (err error) //sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error) //sys Sync() (err error) //sys Truncate(path string, length int64) (err error) //sys Umask(newmask int) (oldmask int) //sys Undelete(path string) (err error) //sys Unlink(path string) (err error) //sys Unlinkat(dirfd int, path string, flags int) (err error) //sys Unmount(path string, flags int) (err error) //sys write(fd int, p []byte) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) //sys munmap(addr uintptr, length uintptr) (err error) //sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ //sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE //sys accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) //sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) /* * Unimplemented */ // Profil // Sigaction // Sigprocmask // Getlogin // Sigpending // Sigaltstack // Ioctl // Reboot // Execve // Vfork // Sbrk // Sstk // Ovadvise // Mincore // Setitimer // Swapon // Select // Sigsuspend // Readv // Writev // Nfssvc // Getfh // Quotactl // Mount // Csops // Waitid // Add_profil // Kdebug_trace // Sigreturn // Atsocket // Kqueue_from_portset_np // Kqueue_portset // Getattrlist // Setattrlist // Getdirentriesattr // Searchfs // Delete // Copyfile // Watchevent // Waitevent // Modwatch // Getxattr // Fgetxattr // Setxattr // Fsetxattr // Removexattr // Fremovexattr // Listxattr // Flistxattr // Fsctl // Initgroups // Posix_spawn // Nfsclnt // Fhopen // Minherit // Semsys // Msgsys // Shmsys // Semctl // Semget // Semop // Msgctl // Msgget // Msgsnd // Msgrcv // Shmat // Shmctl // Shmdt // Shmget // Shm_open // Shm_unlink // Sem_open // Sem_close // Sem_unlink // Sem_wait // Sem_trywait // Sem_post // Sem_getvalue // Sem_init // Sem_destroy // Open_extended // Umask_extended // Stat_extended // Lstat_extended // Fstat_extended // Chmod_extended // Fchmod_extended // Access_extended // Settid // Gettid // Setsgroups // Getsgroups // Setwgroups // Getwgroups // Mkfifo_extended // Mkdir_extended // Identitysvc // Shared_region_check_np // Shared_region_map_np // __pthread_mutex_destroy // __pthread_mutex_init // __pthread_mutex_lock // __pthread_mutex_trylock // __pthread_mutex_unlock // __pthread_cond_init // __pthread_cond_destroy // __pthread_cond_broadcast // __pthread_cond_signal // Setsid_with_pid // __pthread_cond_timedwait // Aio_fsync // Aio_return // Aio_suspend // Aio_cancel // Aio_error // Aio_read // Aio_write // Lio_listio // __pthread_cond_wait // Iopolicysys // __pthread_kill // __pthread_sigmask // __sigwait // __disable_threadsignal // __pthread_markcancel // __pthread_canceled // __semwait_signal // Proc_info // Stat64_extended // Lstat64_extended // Fstat64_extended // __pthread_chdir // __pthread_fchdir // Audit // Auditon // Getauid // Setauid // Getaudit // Setaudit // Getaudit_addr // Setaudit_addr // Auditctl // Bsdthread_create // Bsdthread_terminate // Stack_snapshot // Bsdthread_register // Workq_open // Workq_ops // __mac_execve // __mac_syscall // __mac_get_file // __mac_set_file // __mac_get_link // __mac_set_link // __mac_get_proc // __mac_set_proc // __mac_get_fd // __mac_set_fd // __mac_get_pid // __mac_get_lcid // __mac_get_lctx // __mac_set_lctx // Setlcid // Read_nocancel // Write_nocancel // Open_nocancel // Close_nocancel // Wait4_nocancel // Recvmsg_nocancel // Sendmsg_nocancel // Recvfrom_nocancel // Accept_nocancel // Fcntl_nocancel // Select_nocancel // Fsync_nocancel // Connect_nocancel // Sigsuspend_nocancel // Readv_nocancel // Writev_nocancel // Sendto_nocancel // Pread_nocancel // Pwrite_nocancel // Waitid_nocancel // Poll_nocancel // Msgsnd_nocancel // Msgrcv_nocancel // Sem_wait_nocancel // Aio_suspend_nocancel // __sigwait_nocancel // __semwait_signal_nocancel // __mac_mount // __mac_get_mount // __mac_getfsstat ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_freebsd_386.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build 386,freebsd package unix import ( "syscall" "unsafe" ) func setTimespec(sec, nsec int64) Timespec { return Timespec{Sec: int32(sec), Nsec: int32(nsec)} } func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: int32(sec), Usec: int32(usec)} } func SetKevent(k *Kevent_t, fd, mode, flags int) { k.Ident = uint32(fd) k.Filter = int16(mode) k.Flags = uint16(flags) } func (iov *Iovec) SetLen(length int) { iov.Len = uint32(length) } func (msghdr *Msghdr) SetControllen(length int) { msghdr.Controllen = uint32(length) } func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint32(length) } func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { var writtenOut uint64 = 0 _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr((*offset)>>32), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0) written = int(writtenOut) if e1 != 0 { err = e1 } return } func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build amd64,freebsd package unix import ( "syscall" "unsafe" ) func setTimespec(sec, nsec int64) Timespec { return Timespec{Sec: sec, Nsec: nsec} } func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: sec, Usec: usec} } func SetKevent(k *Kevent_t, fd, mode, flags int) { k.Ident = uint64(fd) k.Filter = int16(mode) k.Flags = uint16(flags) } func (iov *Iovec) SetLen(length int) { iov.Len = uint64(length) } func (msghdr *Msghdr) SetControllen(length int) { msghdr.Controllen = uint32(length) } func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint32(length) } func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { var writtenOut uint64 = 0 _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0, 0) written = int(writtenOut) if e1 != 0 { err = e1 } return } func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go ================================================ // Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build arm,freebsd package unix import ( "syscall" "unsafe" ) func setTimespec(sec, nsec int64) Timespec { return Timespec{Sec: sec, Nsec: int32(nsec)} } func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: sec, Usec: int32(usec)} } func SetKevent(k *Kevent_t, fd, mode, flags int) { k.Ident = uint32(fd) k.Filter = int16(mode) k.Flags = uint16(flags) } func (iov *Iovec) SetLen(length int) { iov.Len = uint32(length) } func (msghdr *Msghdr) SetControllen(length int) { msghdr.Controllen = uint32(length) } func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint32(length) } func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { var writtenOut uint64 = 0 _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr((*offset)>>32), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0) written = int(writtenOut) if e1 != 0 { err = e1 } return } func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Linux system calls. // This file is compiled as ordinary Go code, // but it is also input to mksyscall, // which parses the //sys lines and generates system call stubs. // Note that sometimes we use a lowercase //sys name and // wrap it in our own nicer implementation. package unix import ( "syscall" "unsafe" ) /* * Wrapped */ func Access(path string, mode uint32) (err error) { return Faccessat(AT_FDCWD, path, mode, 0) } func Chmod(path string, mode uint32) (err error) { return Fchmodat(AT_FDCWD, path, mode, 0) } func Chown(path string, uid int, gid int) (err error) { return Fchownat(AT_FDCWD, path, uid, gid, 0) } func Creat(path string, mode uint32) (fd int, err error) { return Open(path, O_CREAT|O_WRONLY|O_TRUNC, mode) } //sys fchmodat(dirfd int, path string, mode uint32) (err error) func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { // Linux fchmodat doesn't support the flags parameter. Mimick glibc's behavior // and check the flags. Otherwise the mode would be applied to the symlink // destination which is not what the user expects. if flags&^AT_SYMLINK_NOFOLLOW != 0 { return EINVAL } else if flags&AT_SYMLINK_NOFOLLOW != 0 { return EOPNOTSUPP } return fchmodat(dirfd, path, mode) } //sys ioctl(fd int, req uint, arg uintptr) (err error) // ioctl itself should not be exposed directly, but additional get/set // functions for specific types are permissible. // IoctlSetInt performs an ioctl operation which sets an integer value // on fd, using the specified request number. func IoctlSetInt(fd int, req uint, value int) error { return ioctl(fd, req, uintptr(value)) } func IoctlSetWinsize(fd int, req uint, value *Winsize) error { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } func IoctlSetTermios(fd int, req uint, value *Termios) error { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } // IoctlGetInt performs an ioctl operation which gets an integer value // from fd, using the specified request number. func IoctlGetInt(fd int, req uint) (int, error) { var value int err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) return value, err } func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { var value Winsize err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) return &value, err } func IoctlGetTermios(fd int, req uint) (*Termios, error) { var value Termios err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) return &value, err } //sys Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) func Link(oldpath string, newpath string) (err error) { return Linkat(AT_FDCWD, oldpath, AT_FDCWD, newpath, 0) } func Mkdir(path string, mode uint32) (err error) { return Mkdirat(AT_FDCWD, path, mode) } func Mknod(path string, mode uint32, dev int) (err error) { return Mknodat(AT_FDCWD, path, mode, dev) } func Open(path string, mode int, perm uint32) (fd int, err error) { return openat(AT_FDCWD, path, mode|O_LARGEFILE, perm) } //sys openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) func Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { return openat(dirfd, path, flags|O_LARGEFILE, mode) } //sys ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) func Ppoll(fds []PollFd, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { if len(fds) == 0 { return ppoll(nil, 0, timeout, sigmask) } return ppoll(&fds[0], len(fds), timeout, sigmask) } //sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error) func Readlink(path string, buf []byte) (n int, err error) { return Readlinkat(AT_FDCWD, path, buf) } func Rename(oldpath string, newpath string) (err error) { return Renameat(AT_FDCWD, oldpath, AT_FDCWD, newpath) } func Rmdir(path string) error { return Unlinkat(AT_FDCWD, path, AT_REMOVEDIR) } //sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error) func Symlink(oldpath string, newpath string) (err error) { return Symlinkat(oldpath, AT_FDCWD, newpath) } func Unlink(path string) error { return Unlinkat(AT_FDCWD, path, 0) } //sys Unlinkat(dirfd int, path string, flags int) (err error) //sys utimes(path string, times *[2]Timeval) (err error) func Utimes(path string, tv []Timeval) error { if tv == nil { err := utimensat(AT_FDCWD, path, nil, 0) if err != ENOSYS { return err } return utimes(path, nil) } if len(tv) != 2 { return EINVAL } var ts [2]Timespec ts[0] = NsecToTimespec(TimevalToNsec(tv[0])) ts[1] = NsecToTimespec(TimevalToNsec(tv[1])) err := utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) if err != ENOSYS { return err } return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) } //sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) func UtimesNano(path string, ts []Timespec) error { if ts == nil { err := utimensat(AT_FDCWD, path, nil, 0) if err != ENOSYS { return err } return utimes(path, nil) } if len(ts) != 2 { return EINVAL } err := utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) if err != ENOSYS { return err } // If the utimensat syscall isn't available (utimensat was added to Linux // in 2.6.22, Released, 8 July 2007) then fall back to utimes var tv [2]Timeval for i := 0; i < 2; i++ { tv[i] = NsecToTimeval(TimespecToNsec(ts[i])) } return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) } func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error { if ts == nil { return utimensat(dirfd, path, nil, flags) } if len(ts) != 2 { return EINVAL } return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags) } //sys futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) func Futimesat(dirfd int, path string, tv []Timeval) error { pathp, err := BytePtrFromString(path) if err != nil { return err } if tv == nil { return futimesat(dirfd, pathp, nil) } if len(tv) != 2 { return EINVAL } return futimesat(dirfd, pathp, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) } func Futimes(fd int, tv []Timeval) (err error) { // Believe it or not, this is the best we can do on Linux // (and is what glibc does). return Utimes("/proc/self/fd/"+itoa(fd), tv) } const ImplementsGetwd = true //sys Getcwd(buf []byte) (n int, err error) func Getwd() (wd string, err error) { var buf [PathMax]byte n, err := Getcwd(buf[0:]) if err != nil { return "", err } // Getcwd returns the number of bytes written to buf, including the NUL. if n < 1 || n > len(buf) || buf[n-1] != 0 { return "", EINVAL } return string(buf[0 : n-1]), nil } func Getgroups() (gids []int, err error) { n, err := getgroups(0, nil) if err != nil { return nil, err } if n == 0 { return nil, nil } // Sanity check group count. Max is 1<<16 on Linux. if n < 0 || n > 1<<20 { return nil, EINVAL } a := make([]_Gid_t, n) n, err = getgroups(n, &a[0]) if err != nil { return nil, err } gids = make([]int, n) for i, v := range a[0:n] { gids[i] = int(v) } return } func Setgroups(gids []int) (err error) { if len(gids) == 0 { return setgroups(0, nil) } a := make([]_Gid_t, len(gids)) for i, v := range gids { a[i] = _Gid_t(v) } return setgroups(len(a), &a[0]) } type WaitStatus uint32 // Wait status is 7 bits at bottom, either 0 (exited), // 0x7F (stopped), or a signal number that caused an exit. // The 0x80 bit is whether there was a core dump. // An extra number (exit code, signal causing a stop) // is in the high bits. At least that's the idea. // There are various irregularities. For example, the // "continued" status is 0xFFFF, distinguishing itself // from stopped via the core dump bit. const ( mask = 0x7F core = 0x80 exited = 0x00 stopped = 0x7F shift = 8 ) func (w WaitStatus) Exited() bool { return w&mask == exited } func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != exited } func (w WaitStatus) Stopped() bool { return w&0xFF == stopped } func (w WaitStatus) Continued() bool { return w == 0xFFFF } func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 } func (w WaitStatus) ExitStatus() int { if !w.Exited() { return -1 } return int(w>>shift) & 0xFF } func (w WaitStatus) Signal() syscall.Signal { if !w.Signaled() { return -1 } return syscall.Signal(w & mask) } func (w WaitStatus) StopSignal() syscall.Signal { if !w.Stopped() { return -1 } return syscall.Signal(w>>shift) & 0xFF } func (w WaitStatus) TrapCause() int { if w.StopSignal() != SIGTRAP { return -1 } return int(w>>shift) >> 8 } //sys wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) { var status _C_int wpid, err = wait4(pid, &status, options, rusage) if wstatus != nil { *wstatus = WaitStatus(status) } return } func Mkfifo(path string, mode uint32) error { return Mknod(path, mode|S_IFIFO, 0) } func Mkfifoat(dirfd int, path string, mode uint32) error { return Mknodat(dirfd, path, mode|S_IFIFO, 0) } func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { if sa.Port < 0 || sa.Port > 0xFFFF { return nil, 0, EINVAL } sa.raw.Family = AF_INET p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) p[0] = byte(sa.Port >> 8) p[1] = byte(sa.Port) for i := 0; i < len(sa.Addr); i++ { sa.raw.Addr[i] = sa.Addr[i] } return unsafe.Pointer(&sa.raw), SizeofSockaddrInet4, nil } func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { if sa.Port < 0 || sa.Port > 0xFFFF { return nil, 0, EINVAL } sa.raw.Family = AF_INET6 p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) p[0] = byte(sa.Port >> 8) p[1] = byte(sa.Port) sa.raw.Scope_id = sa.ZoneId for i := 0; i < len(sa.Addr); i++ { sa.raw.Addr[i] = sa.Addr[i] } return unsafe.Pointer(&sa.raw), SizeofSockaddrInet6, nil } func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { name := sa.Name n := len(name) if n >= len(sa.raw.Path) { return nil, 0, EINVAL } sa.raw.Family = AF_UNIX for i := 0; i < n; i++ { sa.raw.Path[i] = int8(name[i]) } // length is family (uint16), name, NUL. sl := _Socklen(2) if n > 0 { sl += _Socklen(n) + 1 } if sa.raw.Path[0] == '@' { sa.raw.Path[0] = 0 // Don't count trailing NUL for abstract address. sl-- } return unsafe.Pointer(&sa.raw), sl, nil } type SockaddrLinklayer struct { Protocol uint16 Ifindex int Hatype uint16 Pkttype uint8 Halen uint8 Addr [8]byte raw RawSockaddrLinklayer } func (sa *SockaddrLinklayer) sockaddr() (unsafe.Pointer, _Socklen, error) { if sa.Ifindex < 0 || sa.Ifindex > 0x7fffffff { return nil, 0, EINVAL } sa.raw.Family = AF_PACKET sa.raw.Protocol = sa.Protocol sa.raw.Ifindex = int32(sa.Ifindex) sa.raw.Hatype = sa.Hatype sa.raw.Pkttype = sa.Pkttype sa.raw.Halen = sa.Halen for i := 0; i < len(sa.Addr); i++ { sa.raw.Addr[i] = sa.Addr[i] } return unsafe.Pointer(&sa.raw), SizeofSockaddrLinklayer, nil } type SockaddrNetlink struct { Family uint16 Pad uint16 Pid uint32 Groups uint32 raw RawSockaddrNetlink } func (sa *SockaddrNetlink) sockaddr() (unsafe.Pointer, _Socklen, error) { sa.raw.Family = AF_NETLINK sa.raw.Pad = sa.Pad sa.raw.Pid = sa.Pid sa.raw.Groups = sa.Groups return unsafe.Pointer(&sa.raw), SizeofSockaddrNetlink, nil } type SockaddrHCI struct { Dev uint16 Channel uint16 raw RawSockaddrHCI } func (sa *SockaddrHCI) sockaddr() (unsafe.Pointer, _Socklen, error) { sa.raw.Family = AF_BLUETOOTH sa.raw.Dev = sa.Dev sa.raw.Channel = sa.Channel return unsafe.Pointer(&sa.raw), SizeofSockaddrHCI, nil } // SockaddrCAN implements the Sockaddr interface for AF_CAN type sockets. // The RxID and TxID fields are used for transport protocol addressing in // (CAN_TP16, CAN_TP20, CAN_MCNET, and CAN_ISOTP), they can be left with // zero values for CAN_RAW and CAN_BCM sockets as they have no meaning. // // The SockaddrCAN struct must be bound to the socket file descriptor // using Bind before the CAN socket can be used. // // // Read one raw CAN frame // fd, _ := Socket(AF_CAN, SOCK_RAW, CAN_RAW) // addr := &SockaddrCAN{Ifindex: index} // Bind(fd, addr) // frame := make([]byte, 16) // Read(fd, frame) // // The full SocketCAN documentation can be found in the linux kernel // archives at: https://www.kernel.org/doc/Documentation/networking/can.txt type SockaddrCAN struct { Ifindex int RxID uint32 TxID uint32 raw RawSockaddrCAN } func (sa *SockaddrCAN) sockaddr() (unsafe.Pointer, _Socklen, error) { if sa.Ifindex < 0 || sa.Ifindex > 0x7fffffff { return nil, 0, EINVAL } sa.raw.Family = AF_CAN sa.raw.Ifindex = int32(sa.Ifindex) rx := (*[4]byte)(unsafe.Pointer(&sa.RxID)) for i := 0; i < 4; i++ { sa.raw.Addr[i] = rx[i] } tx := (*[4]byte)(unsafe.Pointer(&sa.TxID)) for i := 0; i < 4; i++ { sa.raw.Addr[i+4] = tx[i] } return unsafe.Pointer(&sa.raw), SizeofSockaddrCAN, nil } // SockaddrALG implements the Sockaddr interface for AF_ALG type sockets. // SockaddrALG enables userspace access to the Linux kernel's cryptography // subsystem. The Type and Name fields specify which type of hash or cipher // should be used with a given socket. // // To create a file descriptor that provides access to a hash or cipher, both // Bind and Accept must be used. Once the setup process is complete, input // data can be written to the socket, processed by the kernel, and then read // back as hash output or ciphertext. // // Here is an example of using an AF_ALG socket with SHA1 hashing. // The initial socket setup process is as follows: // // // Open a socket to perform SHA1 hashing. // fd, _ := unix.Socket(unix.AF_ALG, unix.SOCK_SEQPACKET, 0) // addr := &unix.SockaddrALG{Type: "hash", Name: "sha1"} // unix.Bind(fd, addr) // // Note: unix.Accept does not work at this time; must invoke accept() // // manually using unix.Syscall. // hashfd, _, _ := unix.Syscall(unix.SYS_ACCEPT, uintptr(fd), 0, 0) // // Once a file descriptor has been returned from Accept, it may be used to // perform SHA1 hashing. The descriptor is not safe for concurrent use, but // may be re-used repeatedly with subsequent Write and Read operations. // // When hashing a small byte slice or string, a single Write and Read may // be used: // // // Assume hashfd is already configured using the setup process. // hash := os.NewFile(hashfd, "sha1") // // Hash an input string and read the results. Each Write discards // // previous hash state. Read always reads the current state. // b := make([]byte, 20) // for i := 0; i < 2; i++ { // io.WriteString(hash, "Hello, world.") // hash.Read(b) // fmt.Println(hex.EncodeToString(b)) // } // // Output: // // 2ae01472317d1935a84797ec1983ae243fc6aa28 // // 2ae01472317d1935a84797ec1983ae243fc6aa28 // // For hashing larger byte slices, or byte streams such as those read from // a file or socket, use Sendto with MSG_MORE to instruct the kernel to update // the hash digest instead of creating a new one for a given chunk and finalizing it. // // // Assume hashfd and addr are already configured using the setup process. // hash := os.NewFile(hashfd, "sha1") // // Hash the contents of a file. // f, _ := os.Open("/tmp/linux-4.10-rc7.tar.xz") // b := make([]byte, 4096) // for { // n, err := f.Read(b) // if err == io.EOF { // break // } // unix.Sendto(hashfd, b[:n], unix.MSG_MORE, addr) // } // hash.Read(b) // fmt.Println(hex.EncodeToString(b)) // // Output: 85cdcad0c06eef66f805ecce353bec9accbeecc5 // // For more information, see: http://www.chronox.de/crypto-API/crypto/userspace-if.html. type SockaddrALG struct { Type string Name string Feature uint32 Mask uint32 raw RawSockaddrALG } func (sa *SockaddrALG) sockaddr() (unsafe.Pointer, _Socklen, error) { // Leave room for NUL byte terminator. if len(sa.Type) > 13 { return nil, 0, EINVAL } if len(sa.Name) > 63 { return nil, 0, EINVAL } sa.raw.Family = AF_ALG sa.raw.Feat = sa.Feature sa.raw.Mask = sa.Mask typ, err := ByteSliceFromString(sa.Type) if err != nil { return nil, 0, err } name, err := ByteSliceFromString(sa.Name) if err != nil { return nil, 0, err } copy(sa.raw.Type[:], typ) copy(sa.raw.Name[:], name) return unsafe.Pointer(&sa.raw), SizeofSockaddrALG, nil } // SockaddrVM implements the Sockaddr interface for AF_VSOCK type sockets. // SockaddrVM provides access to Linux VM sockets: a mechanism that enables // bidirectional communication between a hypervisor and its guest virtual // machines. type SockaddrVM struct { // CID and Port specify a context ID and port address for a VM socket. // Guests have a unique CID, and hosts may have a well-known CID of: // - VMADDR_CID_HYPERVISOR: refers to the hypervisor process. // - VMADDR_CID_HOST: refers to other processes on the host. CID uint32 Port uint32 raw RawSockaddrVM } func (sa *SockaddrVM) sockaddr() (unsafe.Pointer, _Socklen, error) { sa.raw.Family = AF_VSOCK sa.raw.Port = sa.Port sa.raw.Cid = sa.CID return unsafe.Pointer(&sa.raw), SizeofSockaddrVM, nil } func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) { switch rsa.Addr.Family { case AF_NETLINK: pp := (*RawSockaddrNetlink)(unsafe.Pointer(rsa)) sa := new(SockaddrNetlink) sa.Family = pp.Family sa.Pad = pp.Pad sa.Pid = pp.Pid sa.Groups = pp.Groups return sa, nil case AF_PACKET: pp := (*RawSockaddrLinklayer)(unsafe.Pointer(rsa)) sa := new(SockaddrLinklayer) sa.Protocol = pp.Protocol sa.Ifindex = int(pp.Ifindex) sa.Hatype = pp.Hatype sa.Pkttype = pp.Pkttype sa.Halen = pp.Halen for i := 0; i < len(sa.Addr); i++ { sa.Addr[i] = pp.Addr[i] } return sa, nil case AF_UNIX: pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa)) sa := new(SockaddrUnix) if pp.Path[0] == 0 { // "Abstract" Unix domain socket. // Rewrite leading NUL as @ for textual display. // (This is the standard convention.) // Not friendly to overwrite in place, // but the callers below don't care. pp.Path[0] = '@' } // Assume path ends at NUL. // This is not technically the Linux semantics for // abstract Unix domain sockets--they are supposed // to be uninterpreted fixed-size binary blobs--but // everyone uses this convention. n := 0 for n < len(pp.Path) && pp.Path[n] != 0 { n++ } bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] sa.Name = string(bytes) return sa, nil case AF_INET: pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) sa := new(SockaddrInet4) p := (*[2]byte)(unsafe.Pointer(&pp.Port)) sa.Port = int(p[0])<<8 + int(p[1]) for i := 0; i < len(sa.Addr); i++ { sa.Addr[i] = pp.Addr[i] } return sa, nil case AF_INET6: pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) sa := new(SockaddrInet6) p := (*[2]byte)(unsafe.Pointer(&pp.Port)) sa.Port = int(p[0])<<8 + int(p[1]) sa.ZoneId = pp.Scope_id for i := 0; i < len(sa.Addr); i++ { sa.Addr[i] = pp.Addr[i] } return sa, nil case AF_VSOCK: pp := (*RawSockaddrVM)(unsafe.Pointer(rsa)) sa := &SockaddrVM{ CID: pp.Cid, Port: pp.Port, } return sa, nil } return nil, EAFNOSUPPORT } func Accept(fd int) (nfd int, sa Sockaddr, err error) { var rsa RawSockaddrAny var len _Socklen = SizeofSockaddrAny nfd, err = accept(fd, &rsa, &len) if err != nil { return } sa, err = anyToSockaddr(&rsa) if err != nil { Close(nfd) nfd = 0 } return } func Accept4(fd int, flags int) (nfd int, sa Sockaddr, err error) { var rsa RawSockaddrAny var len _Socklen = SizeofSockaddrAny nfd, err = accept4(fd, &rsa, &len, flags) if err != nil { return } if len > SizeofSockaddrAny { panic("RawSockaddrAny too small") } sa, err = anyToSockaddr(&rsa) if err != nil { Close(nfd) nfd = 0 } return } func Getsockname(fd int) (sa Sockaddr, err error) { var rsa RawSockaddrAny var len _Socklen = SizeofSockaddrAny if err = getsockname(fd, &rsa, &len); err != nil { return } return anyToSockaddr(&rsa) } func GetsockoptInet4Addr(fd, level, opt int) (value [4]byte, err error) { vallen := _Socklen(4) err = getsockopt(fd, level, opt, unsafe.Pointer(&value[0]), &vallen) return value, err } func GetsockoptIPMreq(fd, level, opt int) (*IPMreq, error) { var value IPMreq vallen := _Socklen(SizeofIPMreq) err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) return &value, err } func GetsockoptIPMreqn(fd, level, opt int) (*IPMreqn, error) { var value IPMreqn vallen := _Socklen(SizeofIPMreqn) err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) return &value, err } func GetsockoptIPv6Mreq(fd, level, opt int) (*IPv6Mreq, error) { var value IPv6Mreq vallen := _Socklen(SizeofIPv6Mreq) err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) return &value, err } func GetsockoptIPv6MTUInfo(fd, level, opt int) (*IPv6MTUInfo, error) { var value IPv6MTUInfo vallen := _Socklen(SizeofIPv6MTUInfo) err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) return &value, err } func GetsockoptICMPv6Filter(fd, level, opt int) (*ICMPv6Filter, error) { var value ICMPv6Filter vallen := _Socklen(SizeofICMPv6Filter) err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) return &value, err } func GetsockoptUcred(fd, level, opt int) (*Ucred, error) { var value Ucred vallen := _Socklen(SizeofUcred) err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) return &value, err } func GetsockoptTCPInfo(fd, level, opt int) (*TCPInfo, error) { var value TCPInfo vallen := _Socklen(SizeofTCPInfo) err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) return &value, err } func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) { return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq)) } // Keyctl Commands (http://man7.org/linux/man-pages/man2/keyctl.2.html) // KeyctlInt calls keyctl commands in which each argument is an int. // These commands are KEYCTL_REVOKE, KEYCTL_CHOWN, KEYCTL_CLEAR, KEYCTL_LINK, // KEYCTL_UNLINK, KEYCTL_NEGATE, KEYCTL_SET_REQKEY_KEYRING, KEYCTL_SET_TIMEOUT, // KEYCTL_ASSUME_AUTHORITY, KEYCTL_SESSION_TO_PARENT, KEYCTL_REJECT, // KEYCTL_INVALIDATE, and KEYCTL_GET_PERSISTENT. //sys KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) = SYS_KEYCTL // KeyctlBuffer calls keyctl commands in which the third and fourth // arguments are a buffer and its length, respectively. // These commands are KEYCTL_UPDATE, KEYCTL_READ, and KEYCTL_INSTANTIATE. //sys KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) = SYS_KEYCTL // KeyctlString calls keyctl commands which return a string. // These commands are KEYCTL_DESCRIBE and KEYCTL_GET_SECURITY. func KeyctlString(cmd int, id int) (string, error) { // We must loop as the string data may change in between the syscalls. // We could allocate a large buffer here to reduce the chance that the // syscall needs to be called twice; however, this is unnecessary as // the performance loss is negligible. var buffer []byte for { // Try to fill the buffer with data length, err := KeyctlBuffer(cmd, id, buffer, 0) if err != nil { return "", err } // Check if the data was written if length <= len(buffer) { // Exclude the null terminator return string(buffer[:length-1]), nil } // Make a bigger buffer if needed buffer = make([]byte, length) } } // Keyctl commands with special signatures. // KeyctlGetKeyringID implements the KEYCTL_GET_KEYRING_ID command. // See the full documentation at: // http://man7.org/linux/man-pages/man3/keyctl_get_keyring_ID.3.html func KeyctlGetKeyringID(id int, create bool) (ringid int, err error) { createInt := 0 if create { createInt = 1 } return KeyctlInt(KEYCTL_GET_KEYRING_ID, id, createInt, 0, 0) } // KeyctlSetperm implements the KEYCTL_SETPERM command. The perm value is the // key handle permission mask as described in the "keyctl setperm" section of // http://man7.org/linux/man-pages/man1/keyctl.1.html. // See the full documentation at: // http://man7.org/linux/man-pages/man3/keyctl_setperm.3.html func KeyctlSetperm(id int, perm uint32) error { _, err := KeyctlInt(KEYCTL_SETPERM, id, int(perm), 0, 0) return err } //sys keyctlJoin(cmd int, arg2 string) (ret int, err error) = SYS_KEYCTL // KeyctlJoinSessionKeyring implements the KEYCTL_JOIN_SESSION_KEYRING command. // See the full documentation at: // http://man7.org/linux/man-pages/man3/keyctl_join_session_keyring.3.html func KeyctlJoinSessionKeyring(name string) (ringid int, err error) { return keyctlJoin(KEYCTL_JOIN_SESSION_KEYRING, name) } //sys keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) = SYS_KEYCTL // KeyctlSearch implements the KEYCTL_SEARCH command. // See the full documentation at: // http://man7.org/linux/man-pages/man3/keyctl_search.3.html func KeyctlSearch(ringid int, keyType, description string, destRingid int) (id int, err error) { return keyctlSearch(KEYCTL_SEARCH, ringid, keyType, description, destRingid) } //sys keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) = SYS_KEYCTL // KeyctlInstantiateIOV implements the KEYCTL_INSTANTIATE_IOV command. This // command is similar to KEYCTL_INSTANTIATE, except that the payload is a slice // of Iovec (each of which represents a buffer) instead of a single buffer. // See the full documentation at: // http://man7.org/linux/man-pages/man3/keyctl_instantiate_iov.3.html func KeyctlInstantiateIOV(id int, payload []Iovec, ringid int) error { return keyctlIOV(KEYCTL_INSTANTIATE_IOV, id, payload, ringid) } //sys keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) = SYS_KEYCTL // KeyctlDHCompute implements the KEYCTL_DH_COMPUTE command. This command // computes a Diffie-Hellman shared secret based on the provide params. The // secret is written to the provided buffer and the returned size is the number // of bytes written (returning an error if there is insufficient space in the // buffer). If a nil buffer is passed in, this function returns the minimum // buffer length needed to store the appropriate data. Note that this differs // from KEYCTL_READ's behavior which always returns the requested payload size. // See the full documentation at: // http://man7.org/linux/man-pages/man3/keyctl_dh_compute.3.html func KeyctlDHCompute(params *KeyctlDHParams, buffer []byte) (size int, err error) { return keyctlDH(KEYCTL_DH_COMPUTE, params, buffer) } func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { var msg Msghdr var rsa RawSockaddrAny msg.Name = (*byte)(unsafe.Pointer(&rsa)) msg.Namelen = uint32(SizeofSockaddrAny) var iov Iovec if len(p) > 0 { iov.Base = &p[0] iov.SetLen(len(p)) } var dummy byte if len(oob) > 0 { var sockType int sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE) if err != nil { return } // receive at least one normal byte if sockType != SOCK_DGRAM && len(p) == 0 { iov.Base = &dummy iov.SetLen(1) } msg.Control = &oob[0] msg.SetControllen(len(oob)) } msg.Iov = &iov msg.Iovlen = 1 if n, err = recvmsg(fd, &msg, flags); err != nil { return } oobn = int(msg.Controllen) recvflags = int(msg.Flags) // source address is only specified if the socket is unconnected if rsa.Addr.Family != AF_UNSPEC { from, err = anyToSockaddr(&rsa) } return } func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { _, err = SendmsgN(fd, p, oob, to, flags) return } func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { var ptr unsafe.Pointer var salen _Socklen if to != nil { var err error ptr, salen, err = to.sockaddr() if err != nil { return 0, err } } var msg Msghdr msg.Name = (*byte)(ptr) msg.Namelen = uint32(salen) var iov Iovec if len(p) > 0 { iov.Base = &p[0] iov.SetLen(len(p)) } var dummy byte if len(oob) > 0 { var sockType int sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE) if err != nil { return 0, err } // send at least one normal byte if sockType != SOCK_DGRAM && len(p) == 0 { iov.Base = &dummy iov.SetLen(1) } msg.Control = &oob[0] msg.SetControllen(len(oob)) } msg.Iov = &iov msg.Iovlen = 1 if n, err = sendmsg(fd, &msg, flags); err != nil { return 0, err } if len(oob) > 0 && len(p) == 0 { n = 0 } return n, nil } // BindToDevice binds the socket associated with fd to device. func BindToDevice(fd int, device string) (err error) { return SetsockoptString(fd, SOL_SOCKET, SO_BINDTODEVICE, device) } //sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error) func ptracePeek(req int, pid int, addr uintptr, out []byte) (count int, err error) { // The peek requests are machine-size oriented, so we wrap it // to retrieve arbitrary-length data. // The ptrace syscall differs from glibc's ptrace. // Peeks returns the word in *data, not as the return value. var buf [sizeofPtr]byte // Leading edge. PEEKTEXT/PEEKDATA don't require aligned // access (PEEKUSER warns that it might), but if we don't // align our reads, we might straddle an unmapped page // boundary and not get the bytes leading up to the page // boundary. n := 0 if addr%sizeofPtr != 0 { err = ptrace(req, pid, addr-addr%sizeofPtr, uintptr(unsafe.Pointer(&buf[0]))) if err != nil { return 0, err } n += copy(out, buf[addr%sizeofPtr:]) out = out[n:] } // Remainder. for len(out) > 0 { // We use an internal buffer to guarantee alignment. // It's not documented if this is necessary, but we're paranoid. err = ptrace(req, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0]))) if err != nil { return n, err } copied := copy(out, buf[0:]) n += copied out = out[copied:] } return n, nil } func PtracePeekText(pid int, addr uintptr, out []byte) (count int, err error) { return ptracePeek(PTRACE_PEEKTEXT, pid, addr, out) } func PtracePeekData(pid int, addr uintptr, out []byte) (count int, err error) { return ptracePeek(PTRACE_PEEKDATA, pid, addr, out) } func PtracePeekUser(pid int, addr uintptr, out []byte) (count int, err error) { return ptracePeek(PTRACE_PEEKUSR, pid, addr, out) } func ptracePoke(pokeReq int, peekReq int, pid int, addr uintptr, data []byte) (count int, err error) { // As for ptracePeek, we need to align our accesses to deal // with the possibility of straddling an invalid page. // Leading edge. n := 0 if addr%sizeofPtr != 0 { var buf [sizeofPtr]byte err = ptrace(peekReq, pid, addr-addr%sizeofPtr, uintptr(unsafe.Pointer(&buf[0]))) if err != nil { return 0, err } n += copy(buf[addr%sizeofPtr:], data) word := *((*uintptr)(unsafe.Pointer(&buf[0]))) err = ptrace(pokeReq, pid, addr-addr%sizeofPtr, word) if err != nil { return 0, err } data = data[n:] } // Interior. for len(data) > sizeofPtr { word := *((*uintptr)(unsafe.Pointer(&data[0]))) err = ptrace(pokeReq, pid, addr+uintptr(n), word) if err != nil { return n, err } n += sizeofPtr data = data[sizeofPtr:] } // Trailing edge. if len(data) > 0 { var buf [sizeofPtr]byte err = ptrace(peekReq, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0]))) if err != nil { return n, err } copy(buf[0:], data) word := *((*uintptr)(unsafe.Pointer(&buf[0]))) err = ptrace(pokeReq, pid, addr+uintptr(n), word) if err != nil { return n, err } n += len(data) } return n, nil } func PtracePokeText(pid int, addr uintptr, data []byte) (count int, err error) { return ptracePoke(PTRACE_POKETEXT, PTRACE_PEEKTEXT, pid, addr, data) } func PtracePokeData(pid int, addr uintptr, data []byte) (count int, err error) { return ptracePoke(PTRACE_POKEDATA, PTRACE_PEEKDATA, pid, addr, data) } func PtracePokeUser(pid int, addr uintptr, data []byte) (count int, err error) { return ptracePoke(PTRACE_POKEUSR, PTRACE_PEEKUSR, pid, addr, data) } func PtraceGetRegs(pid int, regsout *PtraceRegs) (err error) { return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) } func PtraceSetRegs(pid int, regs *PtraceRegs) (err error) { return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) } func PtraceSetOptions(pid int, options int) (err error) { return ptrace(PTRACE_SETOPTIONS, pid, 0, uintptr(options)) } func PtraceGetEventMsg(pid int) (msg uint, err error) { var data _C_long err = ptrace(PTRACE_GETEVENTMSG, pid, 0, uintptr(unsafe.Pointer(&data))) msg = uint(data) return } func PtraceCont(pid int, signal int) (err error) { return ptrace(PTRACE_CONT, pid, 0, uintptr(signal)) } func PtraceSyscall(pid int, signal int) (err error) { return ptrace(PTRACE_SYSCALL, pid, 0, uintptr(signal)) } func PtraceSingleStep(pid int) (err error) { return ptrace(PTRACE_SINGLESTEP, pid, 0, 0) } func PtraceAttach(pid int) (err error) { return ptrace(PTRACE_ATTACH, pid, 0, 0) } func PtraceDetach(pid int) (err error) { return ptrace(PTRACE_DETACH, pid, 0, 0) } //sys reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) func Reboot(cmd int) (err error) { return reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd, "") } func ReadDirent(fd int, buf []byte) (n int, err error) { return Getdents(fd, buf) } func direntIno(buf []byte) (uint64, bool) { return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino)) } func direntReclen(buf []byte) (uint64, bool) { return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) } func direntNamlen(buf []byte) (uint64, bool) { reclen, ok := direntReclen(buf) if !ok { return 0, false } return reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true } //sys mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) func Mount(source string, target string, fstype string, flags uintptr, data string) (err error) { // Certain file systems get rather angry and EINVAL if you give // them an empty string of data, rather than NULL. if data == "" { return mount(source, target, fstype, flags, nil) } datap, err := BytePtrFromString(data) if err != nil { return err } return mount(source, target, fstype, flags, datap) } // Sendto // Recvfrom // Socketpair /* * Direct access */ //sys Acct(path string) (err error) //sys AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) //sys Adjtimex(buf *Timex) (state int, err error) //sys Chdir(path string) (err error) //sys Chroot(path string) (err error) //sys ClockGettime(clockid int32, time *Timespec) (err error) //sys Close(fd int) (err error) //sys CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) //sys Dup(oldfd int) (fd int, err error) //sys Dup3(oldfd int, newfd int, flags int) (err error) //sysnb EpollCreate(size int) (fd int, err error) //sysnb EpollCreate1(flag int) (fd int, err error) //sysnb EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) //sys Eventfd(initval uint, flags int) (fd int, err error) = SYS_EVENTFD2 //sys Exit(code int) = SYS_EXIT_GROUP //sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) //sys Fallocate(fd int, mode uint32, off int64, len int64) (err error) //sys Fchdir(fd int) (err error) //sys Fchmod(fd int, mode uint32) (err error) //sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) //sys fcntl(fd int, cmd int, arg int) (val int, err error) //sys Fdatasync(fd int) (err error) //sys Flock(fd int, how int) (err error) //sys Fsync(fd int) (err error) //sys Getdents(fd int, buf []byte) (n int, err error) = SYS_GETDENTS64 //sysnb Getpgid(pid int) (pgid int, err error) func Getpgrp() (pid int) { pid, _ = Getpgid(0) return } //sysnb Getpid() (pid int) //sysnb Getppid() (ppid int) //sys Getpriority(which int, who int) (prio int, err error) //sys Getrandom(buf []byte, flags int) (n int, err error) //sysnb Getrusage(who int, rusage *Rusage) (err error) //sysnb Getsid(pid int) (sid int, err error) //sysnb Gettid() (tid int) //sys Getxattr(path string, attr string, dest []byte) (sz int, err error) //sys InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) //sysnb InotifyInit1(flags int) (fd int, err error) //sysnb InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) //sysnb Kill(pid int, sig syscall.Signal) (err error) //sys Klogctl(typ int, buf []byte) (n int, err error) = SYS_SYSLOG //sys Lgetxattr(path string, attr string, dest []byte) (sz int, err error) //sys Listxattr(path string, dest []byte) (sz int, err error) //sys Llistxattr(path string, dest []byte) (sz int, err error) //sys Lremovexattr(path string, attr string) (err error) //sys Lsetxattr(path string, attr string, data []byte, flags int) (err error) //sys Mkdirat(dirfd int, path string, mode uint32) (err error) //sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error) //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) //sys PivotRoot(newroot string, putold string) (err error) = SYS_PIVOT_ROOT //sysnb prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) = SYS_PRLIMIT64 //sys Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) //sys Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) = SYS_PSELECT6 //sys read(fd int, p []byte) (n int, err error) //sys Removexattr(path string, attr string) (err error) //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) //sys Setdomainname(p []byte) (err error) //sys Sethostname(p []byte) (err error) //sysnb Setpgid(pid int, pgid int) (err error) //sysnb Setsid() (pid int, err error) //sysnb Settimeofday(tv *Timeval) (err error) //sys Setns(fd int, nstype int) (err error) // issue 1435. // On linux Setuid and Setgid only affects the current thread, not the process. // This does not match what most callers expect so we must return an error // here rather than letting the caller think that the call succeeded. func Setuid(uid int) (err error) { return EOPNOTSUPP } func Setgid(uid int) (err error) { return EOPNOTSUPP } //sys Setpriority(which int, who int, prio int) (err error) //sys Setxattr(path string, attr string, data []byte, flags int) (err error) //sys Sync() //sys Syncfs(fd int) (err error) //sysnb Sysinfo(info *Sysinfo_t) (err error) //sys Tee(rfd int, wfd int, len int, flags int) (n int64, err error) //sysnb Tgkill(tgid int, tid int, sig syscall.Signal) (err error) //sysnb Times(tms *Tms) (ticks uintptr, err error) //sysnb Umask(mask int) (oldmask int) //sysnb Uname(buf *Utsname) (err error) //sys Unmount(target string, flags int) (err error) = SYS_UMOUNT2 //sys Unshare(flags int) (err error) //sys Ustat(dev int, ubuf *Ustat_t) (err error) //sys write(fd int, p []byte) (n int, err error) //sys exitThread(code int) (err error) = SYS_EXIT //sys readlen(fd int, p *byte, np int) (n int, err error) = SYS_READ //sys writelen(fd int, p *byte, np int) (n int, err error) = SYS_WRITE // mmap varies by architecture; see syscall_linux_*.go. //sys munmap(addr uintptr, length uintptr) (err error) var mapper = &mmapper{ active: make(map[*byte][]byte), mmap: mmap, munmap: munmap, } func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { return mapper.Mmap(fd, offset, length, prot, flags) } func Munmap(b []byte) (err error) { return mapper.Munmap(b) } //sys Madvise(b []byte, advice int) (err error) //sys Mprotect(b []byte, prot int) (err error) //sys Mlock(b []byte) (err error) //sys Mlockall(flags int) (err error) //sys Msync(b []byte, flags int) (err error) //sys Munlock(b []byte) (err error) //sys Munlockall() (err error) // Vmsplice splices user pages from a slice of Iovecs into a pipe specified by fd, // using the specified flags. func Vmsplice(fd int, iovs []Iovec, flags int) (int, error) { n, _, errno := Syscall6( SYS_VMSPLICE, uintptr(fd), uintptr(unsafe.Pointer(&iovs[0])), uintptr(len(iovs)), uintptr(flags), 0, 0, ) if errno != 0 { return 0, syscall.Errno(errno) } return int(n), nil } /* * Unimplemented */ // AfsSyscall // Alarm // ArchPrctl // Brk // Capget // Capset // ClockGetres // ClockNanosleep // ClockSettime // Clone // CreateModule // DeleteModule // EpollCtlOld // EpollPwait // EpollWaitOld // Execve // Fgetxattr // Flistxattr // Fork // Fremovexattr // Fsetxattr // Futex // GetKernelSyms // GetMempolicy // GetRobustList // GetThreadArea // Getitimer // Getpmsg // IoCancel // IoDestroy // IoGetevents // IoSetup // IoSubmit // IoprioGet // IoprioSet // KexecLoad // LookupDcookie // Mbind // MigratePages // Mincore // ModifyLdt // Mount // MovePages // MqGetsetattr // MqNotify // MqOpen // MqTimedreceive // MqTimedsend // MqUnlink // Mremap // Msgctl // Msgget // Msgrcv // Msgsnd // Newfstatat // Nfsservctl // Personality // Pselect6 // Ptrace // Putpmsg // QueryModule // Quotactl // Readahead // Readv // RemapFilePages // RestartSyscall // RtSigaction // RtSigpending // RtSigprocmask // RtSigqueueinfo // RtSigreturn // RtSigsuspend // RtSigtimedwait // SchedGetPriorityMax // SchedGetPriorityMin // SchedGetaffinity // SchedGetparam // SchedGetscheduler // SchedRrGetInterval // SchedSetaffinity // SchedSetparam // SchedYield // Security // Semctl // Semget // Semop // Semtimedop // SetMempolicy // SetRobustList // SetThreadArea // SetTidAddress // Shmat // Shmctl // Shmdt // Shmget // Sigaltstack // Signalfd // Swapoff // Swapon // Sysfs // TimerCreate // TimerDelete // TimerGetoverrun // TimerGettime // TimerSettime // Timerfd // Tkill (obsolete) // Tuxcall // Umount2 // Uselib // Utimensat // Vfork // Vhangup // Vserver // Waitid // _Sysctl ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_386.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // TODO(rsc): Rewrite all nn(SP) references into name+(nn-8)(FP) // so that go vet can check that they are correct. // +build 386,linux package unix import ( "syscall" "unsafe" ) func setTimespec(sec, nsec int64) Timespec { return Timespec{Sec: int32(sec), Nsec: int32(nsec)} } func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: int32(sec), Usec: int32(usec)} } //sysnb pipe(p *[2]_C_int) (err error) func Pipe(p []int) (err error) { if len(p) != 2 { return EINVAL } var pp [2]_C_int err = pipe(&pp) p[0] = int(pp[0]) p[1] = int(pp[1]) return } //sysnb pipe2(p *[2]_C_int, flags int) (err error) func Pipe2(p []int, flags int) (err error) { if len(p) != 2 { return EINVAL } var pp [2]_C_int err = pipe2(&pp, flags) p[0] = int(pp[0]) p[1] = int(pp[1]) return } // 64-bit file system and 32-bit uid calls // (386 default is 32-bit file system and 16-bit uid). //sys Dup2(oldfd int, newfd int) (err error) //sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64_64 //sys Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32 //sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 //sys Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64 //sysnb Getegid() (egid int) = SYS_GETEGID32 //sysnb Geteuid() (euid int) = SYS_GETEUID32 //sysnb Getgid() (gid int) = SYS_GETGID32 //sysnb Getuid() (uid int) = SYS_GETUID32 //sysnb InotifyInit() (fd int, err error) //sys Ioperm(from int, num int, on int) (err error) //sys Iopl(level int) (err error) //sys Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32 //sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 //sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 //sys Setfsgid(gid int) (err error) = SYS_SETFSGID32 //sys Setfsuid(uid int) (err error) = SYS_SETFSUID32 //sysnb Setregid(rgid int, egid int) (err error) = SYS_SETREGID32 //sysnb Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32 //sysnb Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32 //sysnb Setreuid(ruid int, euid int) (err error) = SYS_SETREUID32 //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) //sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 //sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) //sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 //sysnb getgroups(n int, list *_Gid_t) (nn int, err error) = SYS_GETGROUPS32 //sysnb setgroups(n int, list *_Gid_t) (err error) = SYS_SETGROUPS32 //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT //sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) //sys Pause() (err error) func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { page := uintptr(offset / 4096) if offset != int64(page)*4096 { return 0, EINVAL } return mmap2(addr, length, prot, flags, fd, page) } type rlimit32 struct { Cur uint32 Max uint32 } //sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_GETRLIMIT const rlimInf32 = ^uint32(0) const rlimInf64 = ^uint64(0) func Getrlimit(resource int, rlim *Rlimit) (err error) { err = prlimit(0, resource, nil, rlim) if err != ENOSYS { return err } rl := rlimit32{} err = getrlimit(resource, &rl) if err != nil { return } if rl.Cur == rlimInf32 { rlim.Cur = rlimInf64 } else { rlim.Cur = uint64(rl.Cur) } if rl.Max == rlimInf32 { rlim.Max = rlimInf64 } else { rlim.Max = uint64(rl.Max) } return } //sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT func Setrlimit(resource int, rlim *Rlimit) (err error) { err = prlimit(0, resource, rlim, nil) if err != ENOSYS { return err } rl := rlimit32{} if rlim.Cur == rlimInf64 { rl.Cur = rlimInf32 } else if rlim.Cur < uint64(rlimInf32) { rl.Cur = uint32(rlim.Cur) } else { return EINVAL } if rlim.Max == rlimInf64 { rl.Max = rlimInf32 } else if rlim.Max < uint64(rlimInf32) { rl.Max = uint32(rlim.Max) } else { return EINVAL } return setrlimit(resource, &rl) } // Underlying system call writes to newoffset via pointer. // Implemented in assembly to avoid allocation. func seek(fd int, offset int64, whence int) (newoffset int64, err syscall.Errno) func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { newoffset, errno := seek(fd, offset, whence) if errno != 0 { return 0, errno } return newoffset, nil } // Vsyscalls on amd64. //sysnb Gettimeofday(tv *Timeval) (err error) //sysnb Time(t *Time_t) (tt Time_t, err error) //sys Utime(path string, buf *Utimbuf) (err error) // On x86 Linux, all the socket calls go through an extra indirection, // I think because the 5-register system call interface can't handle // the 6-argument calls like sendto and recvfrom. Instead the // arguments to the underlying system call are the number below // and a pointer to an array of uintptr. We hide the pointer in the // socketcall assembly to avoid allocation on every system call. const ( // see linux/net.h _SOCKET = 1 _BIND = 2 _CONNECT = 3 _LISTEN = 4 _ACCEPT = 5 _GETSOCKNAME = 6 _GETPEERNAME = 7 _SOCKETPAIR = 8 _SEND = 9 _RECV = 10 _SENDTO = 11 _RECVFROM = 12 _SHUTDOWN = 13 _SETSOCKOPT = 14 _GETSOCKOPT = 15 _SENDMSG = 16 _RECVMSG = 17 _ACCEPT4 = 18 _RECVMMSG = 19 _SENDMMSG = 20 ) func socketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err syscall.Errno) func rawsocketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err syscall.Errno) func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { fd, e := socketcall(_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) if e != 0 { err = e } return } func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { fd, e := socketcall(_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) if e != 0 { err = e } return } func getsockname(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, e := rawsocketcall(_GETSOCKNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) if e != 0 { err = e } return } func getpeername(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, e := rawsocketcall(_GETPEERNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) if e != 0 { err = e } return } func socketpair(domain int, typ int, flags int, fd *[2]int32) (err error) { _, e := rawsocketcall(_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd)), 0, 0) if e != 0 { err = e } return } func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, e := socketcall(_BIND, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) if e != 0 { err = e } return } func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, e := socketcall(_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) if e != 0 { err = e } return } func socket(domain int, typ int, proto int) (fd int, err error) { fd, e := rawsocketcall(_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto), 0, 0, 0) if e != 0 { err = e } return } func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { _, e := socketcall(_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e != 0 { err = e } return } func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, e := socketcall(_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), vallen, 0) if e != 0 { err = e } return } func recvfrom(s int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { var base uintptr if len(p) > 0 { base = uintptr(unsafe.Pointer(&p[0])) } n, e := socketcall(_RECVFROM, uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) if e != 0 { err = e } return } func sendto(s int, p []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { var base uintptr if len(p) > 0 { base = uintptr(unsafe.Pointer(&p[0])) } _, e := socketcall(_SENDTO, uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e != 0 { err = e } return } func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { n, e := socketcall(_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) if e != 0 { err = e } return } func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { n, e := socketcall(_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) if e != 0 { err = e } return } func Listen(s int, n int) (err error) { _, e := socketcall(_LISTEN, uintptr(s), uintptr(n), 0, 0, 0, 0) if e != 0 { err = e } return } func Shutdown(s, how int) (err error) { _, e := socketcall(_SHUTDOWN, uintptr(s), uintptr(how), 0, 0, 0, 0) if e != 0 { err = e } return } func Fstatfs(fd int, buf *Statfs_t) (err error) { _, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) if e != 0 { err = e } return } func Statfs(path string, buf *Statfs_t) (err error) { pathp, err := BytePtrFromString(path) if err != nil { return err } _, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(pathp)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) if e != 0 { err = e } return } func (r *PtraceRegs) PC() uint64 { return uint64(uint32(r.Eip)) } func (r *PtraceRegs) SetPC(pc uint64) { r.Eip = int32(pc) } func (iov *Iovec) SetLen(length int) { iov.Len = uint32(length) } func (msghdr *Msghdr) SetControllen(length int) { msghdr.Controllen = uint32(length) } func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint32(length) } //sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) func Poll(fds []PollFd, timeout int) (n int, err error) { if len(fds) == 0 { return poll(nil, 0, timeout) } return poll(&fds[0], len(fds), timeout) } ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_amd64.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build amd64,linux package unix //sys Dup2(oldfd int, newfd int) (err error) //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) //sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 //sys Fchown(fd int, uid int, gid int) (err error) //sys Fstat(fd int, stat *Stat_t) (err error) //sys Fstatfs(fd int, buf *Statfs_t) (err error) //sys Ftruncate(fd int, length int64) (err error) //sysnb Getegid() (egid int) //sysnb Geteuid() (euid int) //sysnb Getgid() (gid int) //sysnb Getrlimit(resource int, rlim *Rlimit) (err error) //sysnb Getuid() (uid int) //sysnb InotifyInit() (fd int, err error) //sys Ioperm(from int, num int, on int) (err error) //sys Iopl(level int) (err error) //sys Lchown(path string, uid int, gid int) (err error) //sys Listen(s int, n int) (err error) //sys Lstat(path string, stat *Stat_t) (err error) //sys Pause() (err error) //sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) //sys Setfsgid(gid int) (err error) //sys Setfsuid(uid int) (err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setresgid(rgid int, egid int, sgid int) (err error) //sysnb Setresuid(ruid int, euid int, suid int) (err error) //sysnb Setrlimit(resource int, rlim *Rlimit) (err error) //sysnb Setreuid(ruid int, euid int) (err error) //sys Shutdown(fd int, how int) (err error) //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) //sys Stat(path string, stat *Stat_t) (err error) //sys Statfs(path string, buf *Statfs_t) (err error) //sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) //sys Truncate(path string, length int64) (err error) //sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sysnb getgroups(n int, list *_Gid_t) (nn int, err error) //sysnb setgroups(n int, list *_Gid_t) (err error) //sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) //sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) //sysnb socket(domain int, typ int, proto int) (fd int, err error) //sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) //sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) //sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) func Gettimeofday(tv *Timeval) (err error) { errno := gettimeofday(tv) if errno != 0 { return errno } return nil } func Time(t *Time_t) (tt Time_t, err error) { var tv Timeval errno := gettimeofday(&tv) if errno != 0 { return 0, errno } if t != nil { *t = Time_t(tv.Sec) } return Time_t(tv.Sec), nil } //sys Utime(path string, buf *Utimbuf) (err error) func setTimespec(sec, nsec int64) Timespec { return Timespec{Sec: sec, Nsec: nsec} } func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: sec, Usec: usec} } //sysnb pipe(p *[2]_C_int) (err error) func Pipe(p []int) (err error) { if len(p) != 2 { return EINVAL } var pp [2]_C_int err = pipe(&pp) p[0] = int(pp[0]) p[1] = int(pp[1]) return } //sysnb pipe2(p *[2]_C_int, flags int) (err error) func Pipe2(p []int, flags int) (err error) { if len(p) != 2 { return EINVAL } var pp [2]_C_int err = pipe2(&pp, flags) p[0] = int(pp[0]) p[1] = int(pp[1]) return } func (r *PtraceRegs) PC() uint64 { return r.Rip } func (r *PtraceRegs) SetPC(pc uint64) { r.Rip = pc } func (iov *Iovec) SetLen(length int) { iov.Len = uint64(length) } func (msghdr *Msghdr) SetControllen(length int) { msghdr.Controllen = uint64(length) } func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint64(length) } //sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) func Poll(fds []PollFd, timeout int) (n int, err error) { if len(fds) == 0 { return poll(nil, 0, timeout) } return poll(&fds[0], len(fds), timeout) } ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go ================================================ // Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build amd64,linux // +build !gccgo package unix import "syscall" //go:noescape func gettimeofday(tv *Timeval) (err syscall.Errno) ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_arm.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build arm,linux package unix import ( "syscall" "unsafe" ) func setTimespec(sec, nsec int64) Timespec { return Timespec{Sec: int32(sec), Nsec: int32(nsec)} } func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: int32(sec), Usec: int32(usec)} } func Pipe(p []int) (err error) { if len(p) != 2 { return EINVAL } var pp [2]_C_int err = pipe2(&pp, 0) p[0] = int(pp[0]) p[1] = int(pp[1]) return } //sysnb pipe2(p *[2]_C_int, flags int) (err error) func Pipe2(p []int, flags int) (err error) { if len(p) != 2 { return EINVAL } var pp [2]_C_int err = pipe2(&pp, flags) p[0] = int(pp[0]) p[1] = int(pp[1]) return } // Underlying system call writes to newoffset via pointer. // Implemented in assembly to avoid allocation. func seek(fd int, offset int64, whence int) (newoffset int64, err syscall.Errno) func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { newoffset, errno := seek(fd, offset, whence) if errno != 0 { return 0, errno } return newoffset, nil } //sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sysnb getgroups(n int, list *_Gid_t) (nn int, err error) = SYS_GETGROUPS32 //sysnb setgroups(n int, list *_Gid_t) (err error) = SYS_SETGROUPS32 //sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) //sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) //sysnb socket(domain int, typ int, proto int) (fd int, err error) //sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) //sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) //sysnb socketpair(domain int, typ int, flags int, fd *[2]int32) (err error) //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) // 64-bit file system and 32-bit uid calls // (16-bit uid calls are not always supported in newer kernels) //sys Dup2(oldfd int, newfd int) (err error) //sys Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32 //sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 //sysnb Getegid() (egid int) = SYS_GETEGID32 //sysnb Geteuid() (euid int) = SYS_GETEUID32 //sysnb Getgid() (gid int) = SYS_GETGID32 //sysnb Getuid() (uid int) = SYS_GETUID32 //sysnb InotifyInit() (fd int, err error) //sys Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32 //sys Listen(s int, n int) (err error) //sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT //sys Setfsgid(gid int) (err error) = SYS_SETFSGID32 //sys Setfsuid(uid int) (err error) = SYS_SETFSUID32 //sysnb Setregid(rgid int, egid int) (err error) = SYS_SETREGID32 //sysnb Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32 //sysnb Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32 //sysnb Setreuid(ruid int, euid int) (err error) = SYS_SETREUID32 //sys Shutdown(fd int, how int) (err error) //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) //sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 // Vsyscalls on amd64. //sysnb Gettimeofday(tv *Timeval) (err error) //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) //sys Pause() (err error) func Time(t *Time_t) (Time_t, error) { var tv Timeval err := Gettimeofday(&tv) if err != nil { return 0, err } if t != nil { *t = Time_t(tv.Sec) } return Time_t(tv.Sec), nil } func Utime(path string, buf *Utimbuf) error { tv := []Timeval{ {Sec: buf.Actime}, {Sec: buf.Modtime}, } return Utimes(path, tv) } //sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 //sys Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64 func Fadvise(fd int, offset int64, length int64, advice int) (err error) { _, _, e1 := Syscall6(SYS_ARM_FADVISE64_64, uintptr(fd), uintptr(advice), uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32)) if e1 != 0 { err = errnoErr(e1) } return } //sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) func Fstatfs(fd int, buf *Statfs_t) (err error) { _, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) if e != 0 { err = e } return } func Statfs(path string, buf *Statfs_t) (err error) { pathp, err := BytePtrFromString(path) if err != nil { return err } _, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(pathp)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) if e != 0 { err = e } return } func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { page := uintptr(offset / 4096) if offset != int64(page)*4096 { return 0, EINVAL } return mmap2(addr, length, prot, flags, fd, page) } type rlimit32 struct { Cur uint32 Max uint32 } //sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_UGETRLIMIT const rlimInf32 = ^uint32(0) const rlimInf64 = ^uint64(0) func Getrlimit(resource int, rlim *Rlimit) (err error) { err = prlimit(0, resource, nil, rlim) if err != ENOSYS { return err } rl := rlimit32{} err = getrlimit(resource, &rl) if err != nil { return } if rl.Cur == rlimInf32 { rlim.Cur = rlimInf64 } else { rlim.Cur = uint64(rl.Cur) } if rl.Max == rlimInf32 { rlim.Max = rlimInf64 } else { rlim.Max = uint64(rl.Max) } return } //sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT func Setrlimit(resource int, rlim *Rlimit) (err error) { err = prlimit(0, resource, rlim, nil) if err != ENOSYS { return err } rl := rlimit32{} if rlim.Cur == rlimInf64 { rl.Cur = rlimInf32 } else if rlim.Cur < uint64(rlimInf32) { rl.Cur = uint32(rlim.Cur) } else { return EINVAL } if rlim.Max == rlimInf64 { rl.Max = rlimInf32 } else if rlim.Max < uint64(rlimInf32) { rl.Max = uint32(rlim.Max) } else { return EINVAL } return setrlimit(resource, &rl) } func (r *PtraceRegs) PC() uint64 { return uint64(r.Uregs[15]) } func (r *PtraceRegs) SetPC(pc uint64) { r.Uregs[15] = uint32(pc) } func (iov *Iovec) SetLen(length int) { iov.Len = uint32(length) } func (msghdr *Msghdr) SetControllen(length int) { msghdr.Controllen = uint32(length) } func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint32(length) } //sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) func Poll(fds []PollFd, timeout int) (n int, err error) { if len(fds) == 0 { return poll(nil, 0, timeout) } return poll(&fds[0], len(fds), timeout) } ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_arm64.go ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build arm64,linux package unix //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) = SYS_EPOLL_PWAIT //sys Fchown(fd int, uid int, gid int) (err error) //sys Fstat(fd int, stat *Stat_t) (err error) //sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) //sys Fstatfs(fd int, buf *Statfs_t) (err error) //sys Ftruncate(fd int, length int64) (err error) //sysnb Getegid() (egid int) //sysnb Geteuid() (euid int) //sysnb Getgid() (gid int) //sysnb Getrlimit(resource int, rlim *Rlimit) (err error) //sysnb Getuid() (uid int) //sys Listen(s int, n int) (err error) //sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { ts := Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} return Pselect(nfd, r, w, e, &ts, nil) } //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) //sys Setfsgid(gid int) (err error) //sys Setfsuid(uid int) (err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setresgid(rgid int, egid int, sgid int) (err error) //sysnb Setresuid(ruid int, euid int, suid int) (err error) //sysnb Setrlimit(resource int, rlim *Rlimit) (err error) //sysnb Setreuid(ruid int, euid int) (err error) //sys Shutdown(fd int, how int) (err error) //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) func Stat(path string, stat *Stat_t) (err error) { return Fstatat(AT_FDCWD, path, stat, 0) } func Lchown(path string, uid int, gid int) (err error) { return Fchownat(AT_FDCWD, path, uid, gid, AT_SYMLINK_NOFOLLOW) } func Lstat(path string, stat *Stat_t) (err error) { return Fstatat(AT_FDCWD, path, stat, AT_SYMLINK_NOFOLLOW) } //sys Statfs(path string, buf *Statfs_t) (err error) //sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) //sys Truncate(path string, length int64) (err error) //sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sysnb getgroups(n int, list *_Gid_t) (nn int, err error) //sysnb setgroups(n int, list *_Gid_t) (err error) //sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) //sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) //sysnb socket(domain int, typ int, proto int) (fd int, err error) //sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) //sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) //sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) //sysnb Gettimeofday(tv *Timeval) (err error) func setTimespec(sec, nsec int64) Timespec { return Timespec{Sec: sec, Nsec: nsec} } func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: sec, Usec: usec} } func Time(t *Time_t) (Time_t, error) { var tv Timeval err := Gettimeofday(&tv) if err != nil { return 0, err } if t != nil { *t = Time_t(tv.Sec) } return Time_t(tv.Sec), nil } func Utime(path string, buf *Utimbuf) error { tv := []Timeval{ {Sec: buf.Actime}, {Sec: buf.Modtime}, } return Utimes(path, tv) } func Pipe(p []int) (err error) { if len(p) != 2 { return EINVAL } var pp [2]_C_int err = pipe2(&pp, 0) p[0] = int(pp[0]) p[1] = int(pp[1]) return } //sysnb pipe2(p *[2]_C_int, flags int) (err error) func Pipe2(p []int, flags int) (err error) { if len(p) != 2 { return EINVAL } var pp [2]_C_int err = pipe2(&pp, flags) p[0] = int(pp[0]) p[1] = int(pp[1]) return } func (r *PtraceRegs) PC() uint64 { return r.Pc } func (r *PtraceRegs) SetPC(pc uint64) { r.Pc = pc } func (iov *Iovec) SetLen(length int) { iov.Len = uint64(length) } func (msghdr *Msghdr) SetControllen(length int) { msghdr.Controllen = uint64(length) } func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint64(length) } func InotifyInit() (fd int, err error) { return InotifyInit1(0) } func Dup2(oldfd int, newfd int) (err error) { return Dup3(oldfd, newfd, 0) } func Pause() (err error) { _, _, e1 := Syscall6(SYS_PPOLL, 0, 0, 0, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // TODO(dfc): constants that should be in zsysnum_linux_arm64.go, remove // these when the deprecated syscalls that the syscall package relies on // are removed. const ( SYS_GETPGRP = 1060 SYS_UTIMES = 1037 SYS_FUTIMESAT = 1066 SYS_PAUSE = 1061 SYS_USTAT = 1070 SYS_UTIME = 1063 SYS_LCHOWN = 1032 SYS_TIME = 1062 SYS_EPOLL_CREATE = 1042 SYS_EPOLL_WAIT = 1069 ) func Poll(fds []PollFd, timeout int) (n int, err error) { var ts *Timespec if timeout >= 0 { ts = new(Timespec) *ts = NsecToTimespec(int64(timeout) * 1e6) } if len(fds) == 0 { return ppoll(nil, 0, ts, nil) } return ppoll(&fds[0], len(fds), ts, nil) } ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build linux // +build mips64 mips64le package unix //sys Dup2(oldfd int, newfd int) (err error) //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) //sys Fchown(fd int, uid int, gid int) (err error) //sys Fstatfs(fd int, buf *Statfs_t) (err error) //sys Ftruncate(fd int, length int64) (err error) //sysnb Getegid() (egid int) //sysnb Geteuid() (euid int) //sysnb Getgid() (gid int) //sysnb Getrlimit(resource int, rlim *Rlimit) (err error) //sysnb Getuid() (uid int) //sys Lchown(path string, uid int, gid int) (err error) //sys Listen(s int, n int) (err error) //sys Pause() (err error) //sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { ts := Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} return Pselect(nfd, r, w, e, &ts, nil) } //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) //sys Setfsgid(gid int) (err error) //sys Setfsuid(uid int) (err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setresgid(rgid int, egid int, sgid int) (err error) //sysnb Setresuid(ruid int, euid int, suid int) (err error) //sysnb Setrlimit(resource int, rlim *Rlimit) (err error) //sysnb Setreuid(ruid int, euid int) (err error) //sys Shutdown(fd int, how int) (err error) //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) //sys Statfs(path string, buf *Statfs_t) (err error) //sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) //sys Truncate(path string, length int64) (err error) //sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sysnb getgroups(n int, list *_Gid_t) (nn int, err error) //sysnb setgroups(n int, list *_Gid_t) (err error) //sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) //sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) //sysnb socket(domain int, typ int, proto int) (fd int, err error) //sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) //sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) //sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) //sysnb Gettimeofday(tv *Timeval) (err error) func Time(t *Time_t) (tt Time_t, err error) { var tv Timeval err = Gettimeofday(&tv) if err != nil { return 0, err } if t != nil { *t = Time_t(tv.Sec) } return Time_t(tv.Sec), nil } //sys Utime(path string, buf *Utimbuf) (err error) func setTimespec(sec, nsec int64) Timespec { return Timespec{Sec: sec, Nsec: nsec} } func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: sec, Usec: usec} } func Pipe(p []int) (err error) { if len(p) != 2 { return EINVAL } var pp [2]_C_int err = pipe2(&pp, 0) p[0] = int(pp[0]) p[1] = int(pp[1]) return } //sysnb pipe2(p *[2]_C_int, flags int) (err error) func Pipe2(p []int, flags int) (err error) { if len(p) != 2 { return EINVAL } var pp [2]_C_int err = pipe2(&pp, flags) p[0] = int(pp[0]) p[1] = int(pp[1]) return } func Ioperm(from int, num int, on int) (err error) { return ENOSYS } func Iopl(level int) (err error) { return ENOSYS } type stat_t struct { Dev uint32 Pad0 [3]int32 Ino uint64 Mode uint32 Nlink uint32 Uid uint32 Gid uint32 Rdev uint32 Pad1 [3]uint32 Size int64 Atime uint32 Atime_nsec uint32 Mtime uint32 Mtime_nsec uint32 Ctime uint32 Ctime_nsec uint32 Blksize uint32 Pad2 uint32 Blocks int64 } //sys fstat(fd int, st *stat_t) (err error) //sys lstat(path string, st *stat_t) (err error) //sys stat(path string, st *stat_t) (err error) func Fstat(fd int, s *Stat_t) (err error) { st := &stat_t{} err = fstat(fd, st) fillStat_t(s, st) return } func Lstat(path string, s *Stat_t) (err error) { st := &stat_t{} err = lstat(path, st) fillStat_t(s, st) return } func Stat(path string, s *Stat_t) (err error) { st := &stat_t{} err = stat(path, st) fillStat_t(s, st) return } func fillStat_t(s *Stat_t, st *stat_t) { s.Dev = st.Dev s.Ino = st.Ino s.Mode = st.Mode s.Nlink = st.Nlink s.Uid = st.Uid s.Gid = st.Gid s.Rdev = st.Rdev s.Size = st.Size s.Atim = Timespec{int64(st.Atime), int64(st.Atime_nsec)} s.Mtim = Timespec{int64(st.Mtime), int64(st.Mtime_nsec)} s.Ctim = Timespec{int64(st.Ctime), int64(st.Ctime_nsec)} s.Blksize = st.Blksize s.Blocks = st.Blocks } func (r *PtraceRegs) PC() uint64 { return r.Epc } func (r *PtraceRegs) SetPC(pc uint64) { r.Epc = pc } func (iov *Iovec) SetLen(length int) { iov.Len = uint64(length) } func (msghdr *Msghdr) SetControllen(length int) { msghdr.Controllen = uint64(length) } func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint64(length) } //sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) func Poll(fds []PollFd, timeout int) (n int, err error) { if len(fds) == 0 { return poll(nil, 0, timeout) } return poll(&fds[0], len(fds), timeout) } ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go ================================================ // Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build linux // +build mips mipsle package unix import ( "syscall" "unsafe" ) func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) //sys Dup2(oldfd int, newfd int) (err error) //sys Fchown(fd int, uid int, gid int) (err error) //sys Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64 //sysnb Getegid() (egid int) //sysnb Geteuid() (euid int) //sysnb Getgid() (gid int) //sysnb Getuid() (uid int) //sys Lchown(path string, uid int, gid int) (err error) //sys Listen(s int, n int) (err error) //sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 //sys Setfsgid(gid int) (err error) //sys Setfsuid(uid int) (err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setresgid(rgid int, egid int, sgid int) (err error) //sysnb Setresuid(ruid int, euid int, suid int) (err error) //sysnb Setreuid(ruid int, euid int) (err error) //sys Shutdown(fd int, how int) (err error) //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) //sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) //sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 //sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sysnb getgroups(n int, list *_Gid_t) (nn int, err error) //sysnb setgroups(n int, list *_Gid_t) (err error) //sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) //sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) //sysnb socket(domain int, typ int, proto int) (fd int, err error) //sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) //sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) //sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) //sysnb InotifyInit() (fd int, err error) //sys Ioperm(from int, num int, on int) (err error) //sys Iopl(level int) (err error) //sysnb Gettimeofday(tv *Timeval) (err error) //sysnb Time(t *Time_t) (tt Time_t, err error) //sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 //sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 //sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 //sys Utime(path string, buf *Utimbuf) (err error) //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) //sys Pause() (err error) func Fstatfs(fd int, buf *Statfs_t) (err error) { _, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) if e != 0 { err = errnoErr(e) } return } func Statfs(path string, buf *Statfs_t) (err error) { p, err := BytePtrFromString(path) if err != nil { return err } _, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(p)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) if e != 0 { err = errnoErr(e) } return } func Seek(fd int, offset int64, whence int) (off int64, err error) { _, _, e := Syscall6(SYS__LLSEEK, uintptr(fd), uintptr(offset>>32), uintptr(offset), uintptr(unsafe.Pointer(&off)), uintptr(whence), 0) if e != 0 { err = errnoErr(e) } return } func setTimespec(sec, nsec int64) Timespec { return Timespec{Sec: int32(sec), Nsec: int32(nsec)} } func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: int32(sec), Usec: int32(usec)} } //sysnb pipe2(p *[2]_C_int, flags int) (err error) func Pipe2(p []int, flags int) (err error) { if len(p) != 2 { return EINVAL } var pp [2]_C_int err = pipe2(&pp, flags) p[0] = int(pp[0]) p[1] = int(pp[1]) return } func Pipe(p []int) (err error) { if len(p) != 2 { return EINVAL } var pp [2]_C_int err = pipe2(&pp, 0) p[0] = int(pp[0]) p[1] = int(pp[1]) return } //sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { page := uintptr(offset / 4096) if offset != int64(page)*4096 { return 0, EINVAL } return mmap2(addr, length, prot, flags, fd, page) } const rlimInf32 = ^uint32(0) const rlimInf64 = ^uint64(0) type rlimit32 struct { Cur uint32 Max uint32 } //sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_GETRLIMIT func Getrlimit(resource int, rlim *Rlimit) (err error) { err = prlimit(0, resource, nil, rlim) if err != ENOSYS { return err } rl := rlimit32{} err = getrlimit(resource, &rl) if err != nil { return } if rl.Cur == rlimInf32 { rlim.Cur = rlimInf64 } else { rlim.Cur = uint64(rl.Cur) } if rl.Max == rlimInf32 { rlim.Max = rlimInf64 } else { rlim.Max = uint64(rl.Max) } return } //sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT func Setrlimit(resource int, rlim *Rlimit) (err error) { err = prlimit(0, resource, rlim, nil) if err != ENOSYS { return err } rl := rlimit32{} if rlim.Cur == rlimInf64 { rl.Cur = rlimInf32 } else if rlim.Cur < uint64(rlimInf32) { rl.Cur = uint32(rlim.Cur) } else { return EINVAL } if rlim.Max == rlimInf64 { rl.Max = rlimInf32 } else if rlim.Max < uint64(rlimInf32) { rl.Max = uint32(rlim.Max) } else { return EINVAL } return setrlimit(resource, &rl) } func (r *PtraceRegs) PC() uint64 { return r.Epc } func (r *PtraceRegs) SetPC(pc uint64) { r.Epc = pc } func (iov *Iovec) SetLen(length int) { iov.Len = uint32(length) } func (msghdr *Msghdr) SetControllen(length int) { msghdr.Controllen = uint32(length) } func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint32(length) } //sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) func Poll(fds []PollFd, timeout int) (n int, err error) { if len(fds) == 0 { return poll(nil, 0, timeout) } return poll(&fds[0], len(fds), timeout) } ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build linux // +build ppc64 ppc64le package unix //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) //sys Dup2(oldfd int, newfd int) (err error) //sys Fchown(fd int, uid int, gid int) (err error) //sys Fstat(fd int, stat *Stat_t) (err error) //sys Fstatfs(fd int, buf *Statfs_t) (err error) //sys Ftruncate(fd int, length int64) (err error) //sysnb Getegid() (egid int) //sysnb Geteuid() (euid int) //sysnb Getgid() (gid int) //sysnb Getrlimit(resource int, rlim *Rlimit) (err error) = SYS_UGETRLIMIT //sysnb Getuid() (uid int) //sysnb InotifyInit() (fd int, err error) //sys Ioperm(from int, num int, on int) (err error) //sys Iopl(level int) (err error) //sys Lchown(path string, uid int, gid int) (err error) //sys Listen(s int, n int) (err error) //sys Lstat(path string, stat *Stat_t) (err error) //sys Pause() (err error) //sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) //sys Setfsgid(gid int) (err error) //sys Setfsuid(uid int) (err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setresgid(rgid int, egid int, sgid int) (err error) //sysnb Setresuid(ruid int, euid int, suid int) (err error) //sysnb Setrlimit(resource int, rlim *Rlimit) (err error) //sysnb Setreuid(ruid int, euid int) (err error) //sys Shutdown(fd int, how int) (err error) //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) //sys Stat(path string, stat *Stat_t) (err error) //sys Statfs(path string, buf *Statfs_t) (err error) //sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) = SYS_SYNC_FILE_RANGE2 //sys Truncate(path string, length int64) (err error) //sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sysnb getgroups(n int, list *_Gid_t) (nn int, err error) //sysnb setgroups(n int, list *_Gid_t) (err error) //sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) //sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) //sysnb socket(domain int, typ int, proto int) (fd int, err error) //sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) //sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) //sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) //sysnb Gettimeofday(tv *Timeval) (err error) //sysnb Time(t *Time_t) (tt Time_t, err error) //sys Utime(path string, buf *Utimbuf) (err error) func setTimespec(sec, nsec int64) Timespec { return Timespec{Sec: sec, Nsec: nsec} } func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: sec, Usec: usec} } func (r *PtraceRegs) PC() uint64 { return r.Nip } func (r *PtraceRegs) SetPC(pc uint64) { r.Nip = pc } func (iov *Iovec) SetLen(length int) { iov.Len = uint64(length) } func (msghdr *Msghdr) SetControllen(length int) { msghdr.Controllen = uint64(length) } func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint64(length) } //sysnb pipe(p *[2]_C_int) (err error) func Pipe(p []int) (err error) { if len(p) != 2 { return EINVAL } var pp [2]_C_int err = pipe(&pp) p[0] = int(pp[0]) p[1] = int(pp[1]) return } //sysnb pipe2(p *[2]_C_int, flags int) (err error) func Pipe2(p []int, flags int) (err error) { if len(p) != 2 { return EINVAL } var pp [2]_C_int err = pipe2(&pp, flags) p[0] = int(pp[0]) p[1] = int(pp[1]) return } //sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) func Poll(fds []PollFd, timeout int) (n int, err error) { if len(fds) == 0 { return poll(nil, 0, timeout) } return poll(&fds[0], len(fds), timeout) } ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_s390x.go ================================================ // Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build s390x,linux package unix import ( "unsafe" ) //sys Dup2(oldfd int, newfd int) (err error) //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) //sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 //sys Fchown(fd int, uid int, gid int) (err error) //sys Fstat(fd int, stat *Stat_t) (err error) //sys Fstatfs(fd int, buf *Statfs_t) (err error) //sys Ftruncate(fd int, length int64) (err error) //sysnb Getegid() (egid int) //sysnb Geteuid() (euid int) //sysnb Getgid() (gid int) //sysnb Getrlimit(resource int, rlim *Rlimit) (err error) //sysnb Getuid() (uid int) //sysnb InotifyInit() (fd int, err error) //sys Lchown(path string, uid int, gid int) (err error) //sys Lstat(path string, stat *Stat_t) (err error) //sys Pause() (err error) //sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) //sys Setfsgid(gid int) (err error) //sys Setfsuid(uid int) (err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setresgid(rgid int, egid int, sgid int) (err error) //sysnb Setresuid(ruid int, euid int, suid int) (err error) //sysnb Setrlimit(resource int, rlim *Rlimit) (err error) //sysnb Setreuid(ruid int, euid int) (err error) //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) //sys Stat(path string, stat *Stat_t) (err error) //sys Statfs(path string, buf *Statfs_t) (err error) //sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) //sys Truncate(path string, length int64) (err error) //sysnb getgroups(n int, list *_Gid_t) (nn int, err error) //sysnb setgroups(n int, list *_Gid_t) (err error) //sysnb Gettimeofday(tv *Timeval) (err error) func Time(t *Time_t) (tt Time_t, err error) { var tv Timeval err = Gettimeofday(&tv) if err != nil { return 0, err } if t != nil { *t = Time_t(tv.Sec) } return Time_t(tv.Sec), nil } //sys Utime(path string, buf *Utimbuf) (err error) func setTimespec(sec, nsec int64) Timespec { return Timespec{Sec: sec, Nsec: nsec} } func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: sec, Usec: usec} } //sysnb pipe2(p *[2]_C_int, flags int) (err error) func Pipe(p []int) (err error) { if len(p) != 2 { return EINVAL } var pp [2]_C_int err = pipe2(&pp, 0) // pipe2 is the same as pipe when flags are set to 0. p[0] = int(pp[0]) p[1] = int(pp[1]) return } func Pipe2(p []int, flags int) (err error) { if len(p) != 2 { return EINVAL } var pp [2]_C_int err = pipe2(&pp, flags) p[0] = int(pp[0]) p[1] = int(pp[1]) return } func Ioperm(from int, num int, on int) (err error) { return ENOSYS } func Iopl(level int) (err error) { return ENOSYS } func (r *PtraceRegs) PC() uint64 { return r.Psw.Addr } func (r *PtraceRegs) SetPC(pc uint64) { r.Psw.Addr = pc } func (iov *Iovec) SetLen(length int) { iov.Len = uint64(length) } func (msghdr *Msghdr) SetControllen(length int) { msghdr.Controllen = uint64(length) } func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint64(length) } // Linux on s390x uses the old mmap interface, which requires arguments to be passed in a struct. // mmap2 also requires arguments to be passed in a struct; it is currently not exposed in <asm/unistd.h>. func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { mmap_args := [6]uintptr{addr, length, uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)} r0, _, e1 := Syscall(SYS_MMAP, uintptr(unsafe.Pointer(&mmap_args[0])), 0, 0) xaddr = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // On s390x Linux, all the socket calls go through an extra indirection. // The arguments to the underlying system call (SYS_SOCKETCALL) are the // number below and a pointer to an array of uintptr. const ( // see linux/net.h netSocket = 1 netBind = 2 netConnect = 3 netListen = 4 netAccept = 5 netGetSockName = 6 netGetPeerName = 7 netSocketPair = 8 netSend = 9 netRecv = 10 netSendTo = 11 netRecvFrom = 12 netShutdown = 13 netSetSockOpt = 14 netGetSockOpt = 15 netSendMsg = 16 netRecvMsg = 17 netAccept4 = 18 netRecvMMsg = 19 netSendMMsg = 20 ) func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (int, error) { args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))} fd, _, err := Syscall(SYS_SOCKETCALL, netAccept, uintptr(unsafe.Pointer(&args)), 0) if err != 0 { return 0, err } return int(fd), nil } func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (int, error) { args := [4]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags)} fd, _, err := Syscall(SYS_SOCKETCALL, netAccept4, uintptr(unsafe.Pointer(&args)), 0) if err != 0 { return 0, err } return int(fd), nil } func getsockname(s int, rsa *RawSockaddrAny, addrlen *_Socklen) error { args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))} _, _, err := RawSyscall(SYS_SOCKETCALL, netGetSockName, uintptr(unsafe.Pointer(&args)), 0) if err != 0 { return err } return nil } func getpeername(s int, rsa *RawSockaddrAny, addrlen *_Socklen) error { args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))} _, _, err := RawSyscall(SYS_SOCKETCALL, netGetPeerName, uintptr(unsafe.Pointer(&args)), 0) if err != 0 { return err } return nil } func socketpair(domain int, typ int, flags int, fd *[2]int32) error { args := [4]uintptr{uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd))} _, _, err := RawSyscall(SYS_SOCKETCALL, netSocketPair, uintptr(unsafe.Pointer(&args)), 0) if err != 0 { return err } return nil } func bind(s int, addr unsafe.Pointer, addrlen _Socklen) error { args := [3]uintptr{uintptr(s), uintptr(addr), uintptr(addrlen)} _, _, err := Syscall(SYS_SOCKETCALL, netBind, uintptr(unsafe.Pointer(&args)), 0) if err != 0 { return err } return nil } func connect(s int, addr unsafe.Pointer, addrlen _Socklen) error { args := [3]uintptr{uintptr(s), uintptr(addr), uintptr(addrlen)} _, _, err := Syscall(SYS_SOCKETCALL, netConnect, uintptr(unsafe.Pointer(&args)), 0) if err != 0 { return err } return nil } func socket(domain int, typ int, proto int) (int, error) { args := [3]uintptr{uintptr(domain), uintptr(typ), uintptr(proto)} fd, _, err := RawSyscall(SYS_SOCKETCALL, netSocket, uintptr(unsafe.Pointer(&args)), 0) if err != 0 { return 0, err } return int(fd), nil } func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) error { args := [5]uintptr{uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen))} _, _, err := Syscall(SYS_SOCKETCALL, netGetSockOpt, uintptr(unsafe.Pointer(&args)), 0) if err != 0 { return err } return nil } func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) error { args := [4]uintptr{uintptr(s), uintptr(level), uintptr(name), uintptr(val)} _, _, err := Syscall(SYS_SOCKETCALL, netSetSockOpt, uintptr(unsafe.Pointer(&args)), 0) if err != 0 { return err } return nil } func recvfrom(s int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (int, error) { var base uintptr if len(p) > 0 { base = uintptr(unsafe.Pointer(&p[0])) } args := [6]uintptr{uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))} n, _, err := Syscall(SYS_SOCKETCALL, netRecvFrom, uintptr(unsafe.Pointer(&args)), 0) if err != 0 { return 0, err } return int(n), nil } func sendto(s int, p []byte, flags int, to unsafe.Pointer, addrlen _Socklen) error { var base uintptr if len(p) > 0 { base = uintptr(unsafe.Pointer(&p[0])) } args := [6]uintptr{uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(to), uintptr(addrlen)} _, _, err := Syscall(SYS_SOCKETCALL, netSendTo, uintptr(unsafe.Pointer(&args)), 0) if err != 0 { return err } return nil } func recvmsg(s int, msg *Msghdr, flags int) (int, error) { args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)} n, _, err := Syscall(SYS_SOCKETCALL, netRecvMsg, uintptr(unsafe.Pointer(&args)), 0) if err != 0 { return 0, err } return int(n), nil } func sendmsg(s int, msg *Msghdr, flags int) (int, error) { args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)} n, _, err := Syscall(SYS_SOCKETCALL, netSendMsg, uintptr(unsafe.Pointer(&args)), 0) if err != 0 { return 0, err } return int(n), nil } func Listen(s int, n int) error { args := [2]uintptr{uintptr(s), uintptr(n)} _, _, err := Syscall(SYS_SOCKETCALL, netListen, uintptr(unsafe.Pointer(&args)), 0) if err != 0 { return err } return nil } func Shutdown(s, how int) error { args := [2]uintptr{uintptr(s), uintptr(how)} _, _, err := Syscall(SYS_SOCKETCALL, netShutdown, uintptr(unsafe.Pointer(&args)), 0) if err != 0 { return err } return nil } //sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) func Poll(fds []PollFd, timeout int) (n int, err error) { if len(fds) == 0 { return poll(nil, 0, timeout) } return poll(&fds[0], len(fds), timeout) } ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build sparc64,linux package unix //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) //sys Dup2(oldfd int, newfd int) (err error) //sys Fchown(fd int, uid int, gid int) (err error) //sys Fstat(fd int, stat *Stat_t) (err error) //sys Fstatfs(fd int, buf *Statfs_t) (err error) //sys Ftruncate(fd int, length int64) (err error) //sysnb Getegid() (egid int) //sysnb Geteuid() (euid int) //sysnb Getgid() (gid int) //sysnb Getrlimit(resource int, rlim *Rlimit) (err error) //sysnb Getuid() (uid int) //sysnb InotifyInit() (fd int, err error) //sys Lchown(path string, uid int, gid int) (err error) //sys Listen(s int, n int) (err error) //sys Lstat(path string, stat *Stat_t) (err error) //sys Pause() (err error) //sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) //sys Setfsgid(gid int) (err error) //sys Setfsuid(uid int) (err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setresgid(rgid int, egid int, sgid int) (err error) //sysnb Setresuid(ruid int, euid int, suid int) (err error) //sysnb Setrlimit(resource int, rlim *Rlimit) (err error) //sysnb Setreuid(ruid int, euid int) (err error) //sys Shutdown(fd int, how int) (err error) //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) //sys Stat(path string, stat *Stat_t) (err error) //sys Statfs(path string, buf *Statfs_t) (err error) //sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) //sys Truncate(path string, length int64) (err error) //sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) //sysnb getgroups(n int, list *_Gid_t) (nn int, err error) //sysnb setgroups(n int, list *_Gid_t) (err error) //sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) //sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) //sysnb socket(domain int, typ int, proto int) (fd int, err error) //sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) //sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) //sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) func Ioperm(from int, num int, on int) (err error) { return ENOSYS } func Iopl(level int) (err error) { return ENOSYS } //sysnb Gettimeofday(tv *Timeval) (err error) func Time(t *Time_t) (tt Time_t, err error) { var tv Timeval err = Gettimeofday(&tv) if err != nil { return 0, err } if t != nil { *t = Time_t(tv.Sec) } return Time_t(tv.Sec), nil } //sys Utime(path string, buf *Utimbuf) (err error) func setTimespec(sec, nsec int64) Timespec { return Timespec{Sec: sec, Nsec: nsec} } func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: sec, Usec: int32(usec)} } func (r *PtraceRegs) PC() uint64 { return r.Tpc } func (r *PtraceRegs) SetPC(pc uint64) { r.Tpc = pc } func (iov *Iovec) SetLen(length int) { iov.Len = uint64(length) } func (msghdr *Msghdr) SetControllen(length int) { msghdr.Controllen = uint64(length) } func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint64(length) } //sysnb pipe(p *[2]_C_int) (err error) func Pipe(p []int) (err error) { if len(p) != 2 { return EINVAL } var pp [2]_C_int err = pipe(&pp) p[0] = int(pp[0]) p[1] = int(pp[1]) return } //sysnb pipe2(p *[2]_C_int, flags int) (err error) func Pipe2(p []int, flags int) (err error) { if len(p) != 2 { return EINVAL } var pp [2]_C_int err = pipe2(&pp, flags) p[0] = int(pp[0]) p[1] = int(pp[1]) return } //sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) func Poll(fds []PollFd, timeout int) (n int, err error) { if len(fds) == 0 { return poll(nil, 0, timeout) } return poll(&fds[0], len(fds), timeout) } ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_netbsd.go ================================================ // Copyright 2009,2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // NetBSD system calls. // This file is compiled as ordinary Go code, // but it is also input to mksyscall, // which parses the //sys lines and generates system call stubs. // Note that sometimes we use a lowercase //sys name and wrap // it in our own nicer implementation, either here or in // syscall_bsd.go or syscall_unix.go. package unix import ( "syscall" "unsafe" ) type SockaddrDatalink struct { Len uint8 Family uint8 Index uint16 Type uint8 Nlen uint8 Alen uint8 Slen uint8 Data [12]int8 raw RawSockaddrDatalink } func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) func sysctlNodes(mib []_C_int) (nodes []Sysctlnode, err error) { var olen uintptr // Get a list of all sysctl nodes below the given MIB by performing // a sysctl for the given MIB with CTL_QUERY appended. mib = append(mib, CTL_QUERY) qnode := Sysctlnode{Flags: SYSCTL_VERS_1} qp := (*byte)(unsafe.Pointer(&qnode)) sz := unsafe.Sizeof(qnode) if err = sysctl(mib, nil, &olen, qp, sz); err != nil { return nil, err } // Now that we know the size, get the actual nodes. nodes = make([]Sysctlnode, olen/sz) np := (*byte)(unsafe.Pointer(&nodes[0])) if err = sysctl(mib, np, &olen, qp, sz); err != nil { return nil, err } return nodes, nil } func nametomib(name string) (mib []_C_int, err error) { // Split name into components. var parts []string last := 0 for i := 0; i < len(name); i++ { if name[i] == '.' { parts = append(parts, name[last:i]) last = i + 1 } } parts = append(parts, name[last:]) // Discover the nodes and construct the MIB OID. for partno, part := range parts { nodes, err := sysctlNodes(mib) if err != nil { return nil, err } for _, node := range nodes { n := make([]byte, 0) for i := range node.Name { if node.Name[i] != 0 { n = append(n, byte(node.Name[i])) } } if string(n) == part { mib = append(mib, _C_int(node.Num)) break } } if len(mib) != partno+1 { return nil, EINVAL } } return mib, nil } func direntIno(buf []byte) (uint64, bool) { return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno)) } func direntReclen(buf []byte) (uint64, bool) { return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) } func direntNamlen(buf []byte) (uint64, bool) { return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) } //sysnb pipe() (fd1 int, fd2 int, err error) func Pipe(p []int) (err error) { if len(p) != 2 { return EINVAL } p[0], p[1], err = pipe() return } //sys getdents(fd int, buf []byte) (n int, err error) func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { return getdents(fd, buf) } // TODO func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { return -1, ENOSYS } func setattrlistTimes(path string, times []Timespec, flags int) error { // used on Darwin for UtimesNano return ENOSYS } //sys ioctl(fd int, req uint, arg uintptr) (err error) // ioctl itself should not be exposed directly, but additional get/set // functions for specific types are permissible. // IoctlSetInt performs an ioctl operation which sets an integer value // on fd, using the specified request number. func IoctlSetInt(fd int, req uint, value int) error { return ioctl(fd, req, uintptr(value)) } func IoctlSetWinsize(fd int, req uint, value *Winsize) error { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } func IoctlSetTermios(fd int, req uint, value *Termios) error { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } // IoctlGetInt performs an ioctl operation which gets an integer value // from fd, using the specified request number. func IoctlGetInt(fd int, req uint) (int, error) { var value int err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) return value, err } func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { var value Winsize err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) return &value, err } func IoctlGetTermios(fd int, req uint) (*Termios, error) { var value Termios err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) return &value, err } /* * Exposed directly */ //sys Access(path string, mode uint32) (err error) //sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) //sys Chdir(path string) (err error) //sys Chflags(path string, flags int) (err error) //sys Chmod(path string, mode uint32) (err error) //sys Chown(path string, uid int, gid int) (err error) //sys Chroot(path string) (err error) //sys Close(fd int) (err error) //sys Dup(fd int) (nfd int, err error) //sys Dup2(from int, to int) (err error) //sys Exit(code int) //sys Fchdir(fd int) (err error) //sys Fchflags(fd int, flags int) (err error) //sys Fchmod(fd int, mode uint32) (err error) //sys Fchown(fd int, uid int, gid int) (err error) //sys Flock(fd int, how int) (err error) //sys Fpathconf(fd int, name int) (val int, err error) //sys Fstat(fd int, stat *Stat_t) (err error) //sys Fsync(fd int) (err error) //sys Ftruncate(fd int, length int64) (err error) //sysnb Getegid() (egid int) //sysnb Geteuid() (uid int) //sysnb Getgid() (gid int) //sysnb Getpgid(pid int) (pgid int, err error) //sysnb Getpgrp() (pgrp int) //sysnb Getpid() (pid int) //sysnb Getppid() (ppid int) //sys Getpriority(which int, who int) (prio int, err error) //sysnb Getrlimit(which int, lim *Rlimit) (err error) //sysnb Getrusage(who int, rusage *Rusage) (err error) //sysnb Getsid(pid int) (sid int, err error) //sysnb Gettimeofday(tv *Timeval) (err error) //sysnb Getuid() (uid int) //sys Issetugid() (tainted bool) //sys Kill(pid int, signum syscall.Signal) (err error) //sys Kqueue() (fd int, err error) //sys Lchown(path string, uid int, gid int) (err error) //sys Link(path string, link string) (err error) //sys Listen(s int, backlog int) (err error) //sys Lstat(path string, stat *Stat_t) (err error) //sys Mkdir(path string, mode uint32) (err error) //sys Mkfifo(path string, mode uint32) (err error) //sys Mknod(path string, mode uint32, dev int) (err error) //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) //sys Open(path string, mode int, perm uint32) (fd int, err error) //sys Pathconf(path string, name int) (val int, err error) //sys Pread(fd int, p []byte, offset int64) (n int, err error) //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) //sys read(fd int, p []byte) (n int, err error) //sys Readlink(path string, buf []byte) (n int, err error) //sys Rename(from string, to string) (err error) //sys Revoke(path string) (err error) //sys Rmdir(path string) (err error) //sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK //sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) //sysnb Setegid(egid int) (err error) //sysnb Seteuid(euid int) (err error) //sysnb Setgid(gid int) (err error) //sysnb Setpgid(pid int, pgid int) (err error) //sys Setpriority(which int, who int, prio int) (err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setreuid(ruid int, euid int) (err error) //sysnb Setrlimit(which int, lim *Rlimit) (err error) //sysnb Setsid() (pid int, err error) //sysnb Settimeofday(tp *Timeval) (err error) //sysnb Setuid(uid int) (err error) //sys Stat(path string, stat *Stat_t) (err error) //sys Symlink(path string, link string) (err error) //sys Sync() (err error) //sys Truncate(path string, length int64) (err error) //sys Umask(newmask int) (oldmask int) //sys Unlink(path string) (err error) //sys Unmount(path string, flags int) (err error) //sys write(fd int, p []byte) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) //sys munmap(addr uintptr, length uintptr) (err error) //sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ //sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE //sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) /* * Unimplemented */ // ____semctl13 // __clone // __fhopen40 // __fhstat40 // __fhstatvfs140 // __fstat30 // __getcwd // __getfh30 // __getlogin // __lstat30 // __mount50 // __msgctl13 // __msync13 // __ntp_gettime30 // __posix_chown // __posix_fadvise50 // __posix_fchown // __posix_lchown // __posix_rename // __setlogin // __shmctl13 // __sigaction_sigtramp // __sigaltstack14 // __sigpending14 // __sigprocmask14 // __sigsuspend14 // __sigtimedwait // __stat30 // __syscall // __vfork14 // _ksem_close // _ksem_destroy // _ksem_getvalue // _ksem_init // _ksem_open // _ksem_post // _ksem_trywait // _ksem_unlink // _ksem_wait // _lwp_continue // _lwp_create // _lwp_ctl // _lwp_detach // _lwp_exit // _lwp_getname // _lwp_getprivate // _lwp_kill // _lwp_park // _lwp_self // _lwp_setname // _lwp_setprivate // _lwp_suspend // _lwp_unpark // _lwp_unpark_all // _lwp_wait // _lwp_wakeup // _pset_bind // _sched_getaffinity // _sched_getparam // _sched_setaffinity // _sched_setparam // acct // aio_cancel // aio_error // aio_fsync // aio_read // aio_return // aio_suspend // aio_write // break // clock_getres // clock_gettime // clock_settime // compat_09_ogetdomainname // compat_09_osetdomainname // compat_09_ouname // compat_10_omsgsys // compat_10_osemsys // compat_10_oshmsys // compat_12_fstat12 // compat_12_getdirentries // compat_12_lstat12 // compat_12_msync // compat_12_oreboot // compat_12_oswapon // compat_12_stat12 // compat_13_sigaction13 // compat_13_sigaltstack13 // compat_13_sigpending13 // compat_13_sigprocmask13 // compat_13_sigreturn13 // compat_13_sigsuspend13 // compat_14___semctl // compat_14_msgctl // compat_14_shmctl // compat_16___sigaction14 // compat_16___sigreturn14 // compat_20_fhstatfs // compat_20_fstatfs // compat_20_getfsstat // compat_20_statfs // compat_30___fhstat30 // compat_30___fstat13 // compat_30___lstat13 // compat_30___stat13 // compat_30_fhopen // compat_30_fhstat // compat_30_fhstatvfs1 // compat_30_getdents // compat_30_getfh // compat_30_ntp_gettime // compat_30_socket // compat_40_mount // compat_43_fstat43 // compat_43_lstat43 // compat_43_oaccept // compat_43_ocreat // compat_43_oftruncate // compat_43_ogetdirentries // compat_43_ogetdtablesize // compat_43_ogethostid // compat_43_ogethostname // compat_43_ogetkerninfo // compat_43_ogetpagesize // compat_43_ogetpeername // compat_43_ogetrlimit // compat_43_ogetsockname // compat_43_okillpg // compat_43_olseek // compat_43_ommap // compat_43_oquota // compat_43_orecv // compat_43_orecvfrom // compat_43_orecvmsg // compat_43_osend // compat_43_osendmsg // compat_43_osethostid // compat_43_osethostname // compat_43_osetrlimit // compat_43_osigblock // compat_43_osigsetmask // compat_43_osigstack // compat_43_osigvec // compat_43_otruncate // compat_43_owait // compat_43_stat43 // execve // extattr_delete_fd // extattr_delete_file // extattr_delete_link // extattr_get_fd // extattr_get_file // extattr_get_link // extattr_list_fd // extattr_list_file // extattr_list_link // extattr_set_fd // extattr_set_file // extattr_set_link // extattrctl // fchroot // fdatasync // fgetxattr // fktrace // flistxattr // fork // fremovexattr // fsetxattr // fstatvfs1 // fsync_range // getcontext // getitimer // getvfsstat // getxattr // ktrace // lchflags // lchmod // lfs_bmapv // lfs_markv // lfs_segclean // lfs_segwait // lgetxattr // lio_listio // listxattr // llistxattr // lremovexattr // lseek // lsetxattr // lutimes // madvise // mincore // minherit // modctl // mq_close // mq_getattr // mq_notify // mq_open // mq_receive // mq_send // mq_setattr // mq_timedreceive // mq_timedsend // mq_unlink // mremap // msgget // msgrcv // msgsnd // nfssvc // ntp_adjtime // pmc_control // pmc_get_info // pollts // preadv // profil // pselect // pset_assign // pset_create // pset_destroy // ptrace // pwritev // quotactl // rasctl // readv // reboot // removexattr // sa_enable // sa_preempt // sa_register // sa_setconcurrency // sa_stacks // sa_yield // sbrk // sched_yield // semconfig // semget // semop // setcontext // setitimer // setxattr // shmat // shmdt // shmget // sstk // statvfs1 // swapctl // sysarch // syscall // timer_create // timer_delete // timer_getoverrun // timer_gettime // timer_settime // undelete // utrace // uuidgen // vadvise // vfork // writev ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_netbsd_386.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build 386,netbsd package unix func setTimespec(sec, nsec int64) Timespec { return Timespec{Sec: sec, Nsec: int32(nsec)} } func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: sec, Usec: int32(usec)} } func SetKevent(k *Kevent_t, fd, mode, flags int) { k.Ident = uint32(fd) k.Filter = uint32(mode) k.Flags = uint32(flags) } func (iov *Iovec) SetLen(length int) { iov.Len = uint32(length) } func (msghdr *Msghdr) SetControllen(length int) { msghdr.Controllen = uint32(length) } func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint32(length) } ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build amd64,netbsd package unix func setTimespec(sec, nsec int64) Timespec { return Timespec{Sec: sec, Nsec: nsec} } func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: sec, Usec: int32(usec)} } func SetKevent(k *Kevent_t, fd, mode, flags int) { k.Ident = uint64(fd) k.Filter = uint32(mode) k.Flags = uint32(flags) } func (iov *Iovec) SetLen(length int) { iov.Len = uint64(length) } func (msghdr *Msghdr) SetControllen(length int) { msghdr.Controllen = uint32(length) } func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint32(length) } ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build arm,netbsd package unix func setTimespec(sec, nsec int64) Timespec { return Timespec{Sec: sec, Nsec: int32(nsec)} } func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: sec, Usec: int32(usec)} } func SetKevent(k *Kevent_t, fd, mode, flags int) { k.Ident = uint32(fd) k.Filter = uint32(mode) k.Flags = uint32(flags) } func (iov *Iovec) SetLen(length int) { iov.Len = uint32(length) } func (msghdr *Msghdr) SetControllen(length int) { msghdr.Controllen = uint32(length) } func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint32(length) } ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_no_getwd.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build dragonfly freebsd netbsd openbsd package unix const ImplementsGetwd = false func Getwd() (string, error) { return "", ENOTSUP } ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_openbsd.go ================================================ // Copyright 2009,2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // OpenBSD system calls. // This file is compiled as ordinary Go code, // but it is also input to mksyscall, // which parses the //sys lines and generates system call stubs. // Note that sometimes we use a lowercase //sys name and wrap // it in our own nicer implementation, either here or in // syscall_bsd.go or syscall_unix.go. package unix import ( "syscall" "unsafe" ) type SockaddrDatalink struct { Len uint8 Family uint8 Index uint16 Type uint8 Nlen uint8 Alen uint8 Slen uint8 Data [24]int8 raw RawSockaddrDatalink } func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) func nametomib(name string) (mib []_C_int, err error) { // Perform lookup via a binary search left := 0 right := len(sysctlMib) - 1 for { idx := left + (right-left)/2 switch { case name == sysctlMib[idx].ctlname: return sysctlMib[idx].ctloid, nil case name > sysctlMib[idx].ctlname: left = idx + 1 default: right = idx - 1 } if left > right { break } } return nil, EINVAL } func direntIno(buf []byte) (uint64, bool) { return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno)) } func direntReclen(buf []byte) (uint64, bool) { return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) } func direntNamlen(buf []byte) (uint64, bool) { return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) } //sysnb pipe(p *[2]_C_int) (err error) func Pipe(p []int) (err error) { if len(p) != 2 { return EINVAL } var pp [2]_C_int err = pipe(&pp) p[0] = int(pp[0]) p[1] = int(pp[1]) return } //sys getdents(fd int, buf []byte) (n int, err error) func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { return getdents(fd, buf) } // TODO func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { return -1, ENOSYS } func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { var _p0 unsafe.Pointer var bufsize uintptr if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) } r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags)) n = int(r0) if e1 != 0 { err = e1 } return } func setattrlistTimes(path string, times []Timespec, flags int) error { // used on Darwin for UtimesNano return ENOSYS } //sys ioctl(fd int, req uint, arg uintptr) (err error) // ioctl itself should not be exposed directly, but additional get/set // functions for specific types are permissible. // IoctlSetInt performs an ioctl operation which sets an integer value // on fd, using the specified request number. func IoctlSetInt(fd int, req uint, value int) error { return ioctl(fd, req, uintptr(value)) } func IoctlSetWinsize(fd int, req uint, value *Winsize) error { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } func IoctlSetTermios(fd int, req uint, value *Termios) error { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } // IoctlGetInt performs an ioctl operation which gets an integer value // from fd, using the specified request number. func IoctlGetInt(fd int, req uint) (int, error) { var value int err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) return value, err } func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { var value Winsize err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) return &value, err } func IoctlGetTermios(fd int, req uint) (*Termios, error) { var value Termios err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) return &value, err } /* * Exposed directly */ //sys Access(path string, mode uint32) (err error) //sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) //sys Chdir(path string) (err error) //sys Chflags(path string, flags int) (err error) //sys Chmod(path string, mode uint32) (err error) //sys Chown(path string, uid int, gid int) (err error) //sys Chroot(path string) (err error) //sys Close(fd int) (err error) //sys Dup(fd int) (nfd int, err error) //sys Dup2(from int, to int) (err error) //sys Exit(code int) //sys Fchdir(fd int) (err error) //sys Fchflags(fd int, flags int) (err error) //sys Fchmod(fd int, mode uint32) (err error) //sys Fchown(fd int, uid int, gid int) (err error) //sys Flock(fd int, how int) (err error) //sys Fpathconf(fd int, name int) (val int, err error) //sys Fstat(fd int, stat *Stat_t) (err error) //sys Fstatfs(fd int, stat *Statfs_t) (err error) //sys Fsync(fd int) (err error) //sys Ftruncate(fd int, length int64) (err error) //sysnb Getegid() (egid int) //sysnb Geteuid() (uid int) //sysnb Getgid() (gid int) //sysnb Getpgid(pid int) (pgid int, err error) //sysnb Getpgrp() (pgrp int) //sysnb Getpid() (pid int) //sysnb Getppid() (ppid int) //sys Getpriority(which int, who int) (prio int, err error) //sysnb Getrlimit(which int, lim *Rlimit) (err error) //sysnb Getrusage(who int, rusage *Rusage) (err error) //sysnb Getsid(pid int) (sid int, err error) //sysnb Gettimeofday(tv *Timeval) (err error) //sysnb Getuid() (uid int) //sys Issetugid() (tainted bool) //sys Kill(pid int, signum syscall.Signal) (err error) //sys Kqueue() (fd int, err error) //sys Lchown(path string, uid int, gid int) (err error) //sys Link(path string, link string) (err error) //sys Listen(s int, backlog int) (err error) //sys Lstat(path string, stat *Stat_t) (err error) //sys Mkdir(path string, mode uint32) (err error) //sys Mkfifo(path string, mode uint32) (err error) //sys Mknod(path string, mode uint32, dev int) (err error) //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) //sys Open(path string, mode int, perm uint32) (fd int, err error) //sys Pathconf(path string, name int) (val int, err error) //sys Pread(fd int, p []byte, offset int64) (n int, err error) //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) //sys read(fd int, p []byte) (n int, err error) //sys Readlink(path string, buf []byte) (n int, err error) //sys Rename(from string, to string) (err error) //sys Revoke(path string) (err error) //sys Rmdir(path string) (err error) //sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK //sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) //sysnb Setegid(egid int) (err error) //sysnb Seteuid(euid int) (err error) //sysnb Setgid(gid int) (err error) //sys Setlogin(name string) (err error) //sysnb Setpgid(pid int, pgid int) (err error) //sys Setpriority(which int, who int, prio int) (err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setreuid(ruid int, euid int) (err error) //sysnb Setresgid(rgid int, egid int, sgid int) (err error) //sysnb Setresuid(ruid int, euid int, suid int) (err error) //sysnb Setrlimit(which int, lim *Rlimit) (err error) //sysnb Setsid() (pid int, err error) //sysnb Settimeofday(tp *Timeval) (err error) //sysnb Setuid(uid int) (err error) //sys Stat(path string, stat *Stat_t) (err error) //sys Statfs(path string, stat *Statfs_t) (err error) //sys Symlink(path string, link string) (err error) //sys Sync() (err error) //sys Truncate(path string, length int64) (err error) //sys Umask(newmask int) (oldmask int) //sys Unlink(path string) (err error) //sys Unmount(path string, flags int) (err error) //sys write(fd int, p []byte) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) //sys munmap(addr uintptr, length uintptr) (err error) //sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ //sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE //sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) /* * Unimplemented */ // __getcwd // __semctl // __syscall // __sysctl // adjfreq // break // clock_getres // clock_gettime // clock_settime // closefrom // execve // faccessat // fchmodat // fchownat // fcntl // fhopen // fhstat // fhstatfs // fork // fstatat // futimens // getfh // getgid // getitimer // getlogin // getresgid // getresuid // getrtable // getthrid // ktrace // lfs_bmapv // lfs_markv // lfs_segclean // lfs_segwait // linkat // mincore // minherit // mkdirat // mkfifoat // mknodat // mount // mquery // msgctl // msgget // msgrcv // msgsnd // nfssvc // nnpfspioctl // openat // preadv // profil // pwritev // quotactl // readlinkat // readv // reboot // renameat // rfork // sched_yield // semget // semop // setgroups // setitimer // setrtable // setsockopt // shmat // shmctl // shmdt // shmget // sigaction // sigaltstack // sigpending // sigprocmask // sigreturn // sigsuspend // symlinkat // sysarch // syscall // threxit // thrsigdivert // thrsleep // thrwakeup // unlinkat // vfork // writev ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_openbsd_386.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build 386,openbsd package unix func setTimespec(sec, nsec int64) Timespec { return Timespec{Sec: sec, Nsec: int32(nsec)} } func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: sec, Usec: int32(usec)} } func SetKevent(k *Kevent_t, fd, mode, flags int) { k.Ident = uint32(fd) k.Filter = int16(mode) k.Flags = uint16(flags) } func (iov *Iovec) SetLen(length int) { iov.Len = uint32(length) } func (msghdr *Msghdr) SetControllen(length int) { msghdr.Controllen = uint32(length) } func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint32(length) } ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build amd64,openbsd package unix func setTimespec(sec, nsec int64) Timespec { return Timespec{Sec: sec, Nsec: nsec} } func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: sec, Usec: usec} } func SetKevent(k *Kevent_t, fd, mode, flags int) { k.Ident = uint64(fd) k.Filter = int16(mode) k.Flags = uint16(flags) } func (iov *Iovec) SetLen(length int) { iov.Len = uint64(length) } func (msghdr *Msghdr) SetControllen(length int) { msghdr.Controllen = uint32(length) } func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint32(length) } ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go ================================================ // Copyright 2017 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build arm,openbsd package unix func setTimespec(sec, nsec int64) Timespec { return Timespec{Sec: sec, Nsec: int32(nsec)} } func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: sec, Usec: int32(usec)} } func SetKevent(k *Kevent_t, fd, mode, flags int) { k.Ident = uint32(fd) k.Filter = int16(mode) k.Flags = uint16(flags) } func (iov *Iovec) SetLen(length int) { iov.Len = uint32(length) } func (msghdr *Msghdr) SetControllen(length int) { msghdr.Controllen = uint32(length) } func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint32(length) } ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_solaris.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Solaris system calls. // This file is compiled as ordinary Go code, // but it is also input to mksyscall, // which parses the //sys lines and generates system call stubs. // Note that sometimes we use a lowercase //sys name and wrap // it in our own nicer implementation, either here or in // syscall_solaris.go or syscall_unix.go. package unix import ( "syscall" "unsafe" ) // Implemented in runtime/syscall_solaris.go. type syscallFunc uintptr func rawSysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) func sysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) type SockaddrDatalink struct { Family uint16 Index uint16 Type uint8 Nlen uint8 Alen uint8 Slen uint8 Data [244]int8 raw RawSockaddrDatalink } func clen(n []byte) int { for i := 0; i < len(n); i++ { if n[i] == 0 { return i } } return len(n) } func direntIno(buf []byte) (uint64, bool) { return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino)) } func direntReclen(buf []byte) (uint64, bool) { return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) } func direntNamlen(buf []byte) (uint64, bool) { reclen, ok := direntReclen(buf) if !ok { return 0, false } return reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true } //sysnb pipe(p *[2]_C_int) (n int, err error) func Pipe(p []int) (err error) { if len(p) != 2 { return EINVAL } var pp [2]_C_int n, err := pipe(&pp) if n != 0 { return err } p[0] = int(pp[0]) p[1] = int(pp[1]) return nil } func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { if sa.Port < 0 || sa.Port > 0xFFFF { return nil, 0, EINVAL } sa.raw.Family = AF_INET p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) p[0] = byte(sa.Port >> 8) p[1] = byte(sa.Port) for i := 0; i < len(sa.Addr); i++ { sa.raw.Addr[i] = sa.Addr[i] } return unsafe.Pointer(&sa.raw), SizeofSockaddrInet4, nil } func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { if sa.Port < 0 || sa.Port > 0xFFFF { return nil, 0, EINVAL } sa.raw.Family = AF_INET6 p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) p[0] = byte(sa.Port >> 8) p[1] = byte(sa.Port) sa.raw.Scope_id = sa.ZoneId for i := 0; i < len(sa.Addr); i++ { sa.raw.Addr[i] = sa.Addr[i] } return unsafe.Pointer(&sa.raw), SizeofSockaddrInet6, nil } func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { name := sa.Name n := len(name) if n >= len(sa.raw.Path) { return nil, 0, EINVAL } sa.raw.Family = AF_UNIX for i := 0; i < n; i++ { sa.raw.Path[i] = int8(name[i]) } // length is family (uint16), name, NUL. sl := _Socklen(2) if n > 0 { sl += _Socklen(n) + 1 } if sa.raw.Path[0] == '@' { sa.raw.Path[0] = 0 // Don't count trailing NUL for abstract address. sl-- } return unsafe.Pointer(&sa.raw), sl, nil } //sys getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = libsocket.getsockname func Getsockname(fd int) (sa Sockaddr, err error) { var rsa RawSockaddrAny var len _Socklen = SizeofSockaddrAny if err = getsockname(fd, &rsa, &len); err != nil { return } return anyToSockaddr(&rsa) } const ImplementsGetwd = true //sys Getcwd(buf []byte) (n int, err error) func Getwd() (wd string, err error) { var buf [PathMax]byte // Getcwd will return an error if it failed for any reason. _, err = Getcwd(buf[0:]) if err != nil { return "", err } n := clen(buf[:]) if n < 1 { return "", EINVAL } return string(buf[:n]), nil } /* * Wrapped */ //sysnb getgroups(ngid int, gid *_Gid_t) (n int, err error) //sysnb setgroups(ngid int, gid *_Gid_t) (err error) func Getgroups() (gids []int, err error) { n, err := getgroups(0, nil) // Check for error and sanity check group count. Newer versions of // Solaris allow up to 1024 (NGROUPS_MAX). if n < 0 || n > 1024 { if err != nil { return nil, err } return nil, EINVAL } else if n == 0 { return nil, nil } a := make([]_Gid_t, n) n, err = getgroups(n, &a[0]) if n == -1 { return nil, err } gids = make([]int, n) for i, v := range a[0:n] { gids[i] = int(v) } return } func Setgroups(gids []int) (err error) { if len(gids) == 0 { return setgroups(0, nil) } a := make([]_Gid_t, len(gids)) for i, v := range gids { a[i] = _Gid_t(v) } return setgroups(len(a), &a[0]) } func ReadDirent(fd int, buf []byte) (n int, err error) { // Final argument is (basep *uintptr) and the syscall doesn't take nil. // TODO(rsc): Can we use a single global basep for all calls? return Getdents(fd, buf, new(uintptr)) } // Wait status is 7 bits at bottom, either 0 (exited), // 0x7F (stopped), or a signal number that caused an exit. // The 0x80 bit is whether there was a core dump. // An extra number (exit code, signal causing a stop) // is in the high bits. type WaitStatus uint32 const ( mask = 0x7F core = 0x80 shift = 8 exited = 0 stopped = 0x7F ) func (w WaitStatus) Exited() bool { return w&mask == exited } func (w WaitStatus) ExitStatus() int { if w&mask != exited { return -1 } return int(w >> shift) } func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != 0 } func (w WaitStatus) Signal() syscall.Signal { sig := syscall.Signal(w & mask) if sig == stopped || sig == 0 { return -1 } return sig } func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 } func (w WaitStatus) Stopped() bool { return w&mask == stopped && syscall.Signal(w>>shift) != SIGSTOP } func (w WaitStatus) Continued() bool { return w&mask == stopped && syscall.Signal(w>>shift) == SIGSTOP } func (w WaitStatus) StopSignal() syscall.Signal { if !w.Stopped() { return -1 } return syscall.Signal(w>>shift) & 0xFF } func (w WaitStatus) TrapCause() int { return -1 } //sys wait4(pid int32, statusp *_C_int, options int, rusage *Rusage) (wpid int32, err error) func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (int, error) { var status _C_int rpid, err := wait4(int32(pid), &status, options, rusage) wpid := int(rpid) if wpid == -1 { return wpid, err } if wstatus != nil { *wstatus = WaitStatus(status) } return wpid, nil } //sys gethostname(buf []byte) (n int, err error) func Gethostname() (name string, err error) { var buf [MaxHostNameLen]byte n, err := gethostname(buf[:]) if n != 0 { return "", err } n = clen(buf[:]) if n < 1 { return "", EFAULT } return string(buf[:n]), nil } //sys utimes(path string, times *[2]Timeval) (err error) func Utimes(path string, tv []Timeval) (err error) { if tv == nil { return utimes(path, nil) } if len(tv) != 2 { return EINVAL } return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) } //sys utimensat(fd int, path string, times *[2]Timespec, flag int) (err error) func UtimesNano(path string, ts []Timespec) error { if ts == nil { return utimensat(AT_FDCWD, path, nil, 0) } if len(ts) != 2 { return EINVAL } return utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) } func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error { if ts == nil { return utimensat(dirfd, path, nil, flags) } if len(ts) != 2 { return EINVAL } return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags) } //sys fcntl(fd int, cmd int, arg int) (val int, err error) // FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command. func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfcntl)), 3, uintptr(fd), uintptr(cmd), uintptr(unsafe.Pointer(lk)), 0, 0, 0) if e1 != 0 { return e1 } return nil } //sys futimesat(fildes int, path *byte, times *[2]Timeval) (err error) func Futimesat(dirfd int, path string, tv []Timeval) error { pathp, err := BytePtrFromString(path) if err != nil { return err } if tv == nil { return futimesat(dirfd, pathp, nil) } if len(tv) != 2 { return EINVAL } return futimesat(dirfd, pathp, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) } // Solaris doesn't have an futimes function because it allows NULL to be // specified as the path for futimesat. However, Go doesn't like // NULL-style string interfaces, so this simple wrapper is provided. func Futimes(fd int, tv []Timeval) error { if tv == nil { return futimesat(fd, nil, nil) } if len(tv) != 2 { return EINVAL } return futimesat(fd, nil, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) } func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) { switch rsa.Addr.Family { case AF_UNIX: pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa)) sa := new(SockaddrUnix) // Assume path ends at NUL. // This is not technically the Solaris semantics for // abstract Unix domain sockets -- they are supposed // to be uninterpreted fixed-size binary blobs -- but // everyone uses this convention. n := 0 for n < len(pp.Path) && pp.Path[n] != 0 { n++ } bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] sa.Name = string(bytes) return sa, nil case AF_INET: pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) sa := new(SockaddrInet4) p := (*[2]byte)(unsafe.Pointer(&pp.Port)) sa.Port = int(p[0])<<8 + int(p[1]) for i := 0; i < len(sa.Addr); i++ { sa.Addr[i] = pp.Addr[i] } return sa, nil case AF_INET6: pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) sa := new(SockaddrInet6) p := (*[2]byte)(unsafe.Pointer(&pp.Port)) sa.Port = int(p[0])<<8 + int(p[1]) sa.ZoneId = pp.Scope_id for i := 0; i < len(sa.Addr); i++ { sa.Addr[i] = pp.Addr[i] } return sa, nil } return nil, EAFNOSUPPORT } //sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) = libsocket.accept func Accept(fd int) (nfd int, sa Sockaddr, err error) { var rsa RawSockaddrAny var len _Socklen = SizeofSockaddrAny nfd, err = accept(fd, &rsa, &len) if nfd == -1 { return } sa, err = anyToSockaddr(&rsa) if err != nil { Close(nfd) nfd = 0 } return } //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.__xnet_recvmsg func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { var msg Msghdr var rsa RawSockaddrAny msg.Name = (*byte)(unsafe.Pointer(&rsa)) msg.Namelen = uint32(SizeofSockaddrAny) var iov Iovec if len(p) > 0 { iov.Base = (*int8)(unsafe.Pointer(&p[0])) iov.SetLen(len(p)) } var dummy int8 if len(oob) > 0 { // receive at least one normal byte if len(p) == 0 { iov.Base = &dummy iov.SetLen(1) } msg.Accrightslen = int32(len(oob)) } msg.Iov = &iov msg.Iovlen = 1 if n, err = recvmsg(fd, &msg, flags); n == -1 { return } oobn = int(msg.Accrightslen) // source address is only specified if the socket is unconnected if rsa.Addr.Family != AF_UNSPEC { from, err = anyToSockaddr(&rsa) } return } func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { _, err = SendmsgN(fd, p, oob, to, flags) return } //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.__xnet_sendmsg func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { var ptr unsafe.Pointer var salen _Socklen if to != nil { ptr, salen, err = to.sockaddr() if err != nil { return 0, err } } var msg Msghdr msg.Name = (*byte)(unsafe.Pointer(ptr)) msg.Namelen = uint32(salen) var iov Iovec if len(p) > 0 { iov.Base = (*int8)(unsafe.Pointer(&p[0])) iov.SetLen(len(p)) } var dummy int8 if len(oob) > 0 { // send at least one normal byte if len(p) == 0 { iov.Base = &dummy iov.SetLen(1) } msg.Accrightslen = int32(len(oob)) } msg.Iov = &iov msg.Iovlen = 1 if n, err = sendmsg(fd, &msg, flags); err != nil { return 0, err } if len(oob) > 0 && len(p) == 0 { n = 0 } return n, nil } //sys acct(path *byte) (err error) func Acct(path string) (err error) { if len(path) == 0 { // Assume caller wants to disable accounting. return acct(nil) } pathp, err := BytePtrFromString(path) if err != nil { return err } return acct(pathp) } //sys __makedev(version int, major uint, minor uint) (val uint64) func Mkdev(major, minor uint32) uint64 { return __makedev(NEWDEV, uint(major), uint(minor)) } //sys __major(version int, dev uint64) (val uint) func Major(dev uint64) uint32 { return uint32(__major(NEWDEV, dev)) } //sys __minor(version int, dev uint64) (val uint) func Minor(dev uint64) uint32 { return uint32(__minor(NEWDEV, dev)) } /* * Expose the ioctl function */ //sys ioctl(fd int, req uint, arg uintptr) (err error) func IoctlSetInt(fd int, req uint, value int) (err error) { return ioctl(fd, req, uintptr(value)) } func IoctlSetWinsize(fd int, req uint, value *Winsize) (err error) { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } func IoctlSetTermios(fd int, req uint, value *Termios) (err error) { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } func IoctlSetTermio(fd int, req uint, value *Termio) (err error) { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } func IoctlGetInt(fd int, req uint) (int, error) { var value int err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) return value, err } func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { var value Winsize err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) return &value, err } func IoctlGetTermios(fd int, req uint) (*Termios, error) { var value Termios err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) return &value, err } func IoctlGetTermio(fd int, req uint) (*Termio, error) { var value Termio err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) return &value, err } //sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) func Poll(fds []PollFd, timeout int) (n int, err error) { if len(fds) == 0 { return poll(nil, 0, timeout) } return poll(&fds[0], len(fds), timeout) } /* * Exposed directly */ //sys Access(path string, mode uint32) (err error) //sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) //sys Chdir(path string) (err error) //sys Chmod(path string, mode uint32) (err error) //sys Chown(path string, uid int, gid int) (err error) //sys Chroot(path string) (err error) //sys Close(fd int) (err error) //sys Creat(path string, mode uint32) (fd int, err error) //sys Dup(fd int) (nfd int, err error) //sys Dup2(oldfd int, newfd int) (err error) //sys Exit(code int) //sys Fchdir(fd int) (err error) //sys Fchmod(fd int, mode uint32) (err error) //sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) //sys Fchown(fd int, uid int, gid int) (err error) //sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) //sys Fdatasync(fd int) (err error) //sys Flock(fd int, how int) (err error) //sys Fpathconf(fd int, name int) (val int, err error) //sys Fstat(fd int, stat *Stat_t) (err error) //sys Fstatvfs(fd int, vfsstat *Statvfs_t) (err error) //sys Getdents(fd int, buf []byte, basep *uintptr) (n int, err error) //sysnb Getgid() (gid int) //sysnb Getpid() (pid int) //sysnb Getpgid(pid int) (pgid int, err error) //sysnb Getpgrp() (pgid int, err error) //sys Geteuid() (euid int) //sys Getegid() (egid int) //sys Getppid() (ppid int) //sys Getpriority(which int, who int) (n int, err error) //sysnb Getrlimit(which int, lim *Rlimit) (err error) //sysnb Getrusage(who int, rusage *Rusage) (err error) //sysnb Gettimeofday(tv *Timeval) (err error) //sysnb Getuid() (uid int) //sys Kill(pid int, signum syscall.Signal) (err error) //sys Lchown(path string, uid int, gid int) (err error) //sys Link(path string, link string) (err error) //sys Listen(s int, backlog int) (err error) = libsocket.__xnet_llisten //sys Lstat(path string, stat *Stat_t) (err error) //sys Madvise(b []byte, advice int) (err error) //sys Mkdir(path string, mode uint32) (err error) //sys Mkdirat(dirfd int, path string, mode uint32) (err error) //sys Mkfifo(path string, mode uint32) (err error) //sys Mkfifoat(dirfd int, path string, mode uint32) (err error) //sys Mknod(path string, mode uint32, dev int) (err error) //sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error) //sys Mlock(b []byte) (err error) //sys Mlockall(flags int) (err error) //sys Mprotect(b []byte, prot int) (err error) //sys Msync(b []byte, flags int) (err error) //sys Munlock(b []byte) (err error) //sys Munlockall() (err error) //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) //sys Open(path string, mode int, perm uint32) (fd int, err error) //sys Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) //sys Pathconf(path string, name int) (val int, err error) //sys Pause() (err error) //sys Pread(fd int, p []byte, offset int64) (n int, err error) //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) //sys read(fd int, p []byte) (n int, err error) //sys Readlink(path string, buf []byte) (n int, err error) //sys Rename(from string, to string) (err error) //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Rmdir(path string) (err error) //sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = lseek //sysnb Setegid(egid int) (err error) //sysnb Seteuid(euid int) (err error) //sysnb Setgid(gid int) (err error) //sys Sethostname(p []byte) (err error) //sysnb Setpgid(pid int, pgid int) (err error) //sys Setpriority(which int, who int, prio int) (err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setreuid(ruid int, euid int) (err error) //sysnb Setrlimit(which int, lim *Rlimit) (err error) //sysnb Setsid() (pid int, err error) //sysnb Setuid(uid int) (err error) //sys Shutdown(s int, how int) (err error) = libsocket.shutdown //sys Stat(path string, stat *Stat_t) (err error) //sys Statvfs(path string, vfsstat *Statvfs_t) (err error) //sys Symlink(path string, link string) (err error) //sys Sync() (err error) //sysnb Times(tms *Tms) (ticks uintptr, err error) //sys Truncate(path string, length int64) (err error) //sys Fsync(fd int) (err error) //sys Ftruncate(fd int, length int64) (err error) //sys Umask(mask int) (oldmask int) //sysnb Uname(buf *Utsname) (err error) //sys Unmount(target string, flags int) (err error) = libc.umount //sys Unlink(path string) (err error) //sys Unlinkat(dirfd int, path string, flags int) (err error) //sys Ustat(dev int, ubuf *Ustat_t) (err error) //sys Utime(path string, buf *Utimbuf) (err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.__xnet_bind //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.__xnet_connect //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) //sys munmap(addr uintptr, length uintptr) (err error) //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.__xnet_sendto //sys socket(domain int, typ int, proto int) (fd int, err error) = libsocket.__xnet_socket //sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) = libsocket.__xnet_socketpair //sys write(fd int, p []byte) (n int, err error) //sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) = libsocket.__xnet_getsockopt //sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = libsocket.getpeername //sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) = libsocket.setsockopt //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) = libsocket.recvfrom func readlen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procread)), 3, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf), 0, 0, 0) n = int(r0) if e1 != 0 { err = e1 } return } func writelen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwrite)), 3, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf), 0, 0, 0) n = int(r0) if e1 != 0 { err = e1 } return } var mapper = &mmapper{ active: make(map[*byte][]byte), mmap: mmap, munmap: munmap, } func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { return mapper.Mmap(fd, offset, length, prot, flags) } func Munmap(b []byte) (err error) { return mapper.Munmap(b) } ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build amd64,solaris package unix func setTimespec(sec, nsec int64) Timespec { return Timespec{Sec: sec, Nsec: nsec} } func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: sec, Usec: usec} } func (iov *Iovec) SetLen(length int) { iov.Len = uint64(length) } func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint32(length) } func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { // TODO(aram): implement this, see issue 5847. panic("unimplemented") } ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_unix.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin dragonfly freebsd linux netbsd openbsd solaris package unix import ( "runtime" "sync" "syscall" "unsafe" ) var ( Stdin = 0 Stdout = 1 Stderr = 2 ) const ( darwin64Bit = runtime.GOOS == "darwin" && sizeofPtr == 8 dragonfly64Bit = runtime.GOOS == "dragonfly" && sizeofPtr == 8 netbsd32Bit = runtime.GOOS == "netbsd" && sizeofPtr == 4 solaris64Bit = runtime.GOOS == "solaris" && sizeofPtr == 8 ) // Do the interface allocations only once for common // Errno values. var ( errEAGAIN error = syscall.EAGAIN errEINVAL error = syscall.EINVAL errENOENT error = syscall.ENOENT ) // errnoErr returns common boxed Errno values, to prevent // allocations at runtime. func errnoErr(e syscall.Errno) error { switch e { case 0: return nil case EAGAIN: return errEAGAIN case EINVAL: return errEINVAL case ENOENT: return errENOENT } return e } // Mmap manager, for use by operating system-specific implementations. type mmapper struct { sync.Mutex active map[*byte][]byte // active mappings; key is last byte in mapping mmap func(addr, length uintptr, prot, flags, fd int, offset int64) (uintptr, error) munmap func(addr uintptr, length uintptr) error } func (m *mmapper) Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { if length <= 0 { return nil, EINVAL } // Map the requested memory. addr, errno := m.mmap(0, uintptr(length), prot, flags, fd, offset) if errno != nil { return nil, errno } // Slice memory layout var sl = struct { addr uintptr len int cap int }{addr, length, length} // Use unsafe to turn sl into a []byte. b := *(*[]byte)(unsafe.Pointer(&sl)) // Register mapping in m and return it. p := &b[cap(b)-1] m.Lock() defer m.Unlock() m.active[p] = b return b, nil } func (m *mmapper) Munmap(data []byte) (err error) { if len(data) == 0 || len(data) != cap(data) { return EINVAL } // Find the base of the mapping. p := &data[cap(data)-1] m.Lock() defer m.Unlock() b := m.active[p] if b == nil || &b[0] != &data[0] { return EINVAL } // Unmap the memory and update m. if errno := m.munmap(uintptr(unsafe.Pointer(&b[0])), uintptr(len(b))); errno != nil { return errno } delete(m.active, p) return nil } func Read(fd int, p []byte) (n int, err error) { n, err = read(fd, p) if raceenabled { if n > 0 { raceWriteRange(unsafe.Pointer(&p[0]), n) } if err == nil { raceAcquire(unsafe.Pointer(&ioSync)) } } return } func Write(fd int, p []byte) (n int, err error) { if raceenabled { raceReleaseMerge(unsafe.Pointer(&ioSync)) } n, err = write(fd, p) if raceenabled && n > 0 { raceReadRange(unsafe.Pointer(&p[0]), n) } return } // For testing: clients can set this flag to force // creation of IPv6 sockets to return EAFNOSUPPORT. var SocketDisableIPv6 bool type Sockaddr interface { sockaddr() (ptr unsafe.Pointer, len _Socklen, err error) // lowercase; only we can define Sockaddrs } type SockaddrInet4 struct { Port int Addr [4]byte raw RawSockaddrInet4 } type SockaddrInet6 struct { Port int ZoneId uint32 Addr [16]byte raw RawSockaddrInet6 } type SockaddrUnix struct { Name string raw RawSockaddrUnix } func Bind(fd int, sa Sockaddr) (err error) { ptr, n, err := sa.sockaddr() if err != nil { return err } return bind(fd, ptr, n) } func Connect(fd int, sa Sockaddr) (err error) { ptr, n, err := sa.sockaddr() if err != nil { return err } return connect(fd, ptr, n) } func Getpeername(fd int) (sa Sockaddr, err error) { var rsa RawSockaddrAny var len _Socklen = SizeofSockaddrAny if err = getpeername(fd, &rsa, &len); err != nil { return } return anyToSockaddr(&rsa) } func GetsockoptInt(fd, level, opt int) (value int, err error) { var n int32 vallen := _Socklen(4) err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen) return int(n), err } func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, err error) { var rsa RawSockaddrAny var len _Socklen = SizeofSockaddrAny if n, err = recvfrom(fd, p, flags, &rsa, &len); err != nil { return } if rsa.Addr.Family != AF_UNSPEC { from, err = anyToSockaddr(&rsa) } return } func Sendto(fd int, p []byte, flags int, to Sockaddr) (err error) { ptr, n, err := to.sockaddr() if err != nil { return err } return sendto(fd, p, flags, ptr, n) } func SetsockoptByte(fd, level, opt int, value byte) (err error) { return setsockopt(fd, level, opt, unsafe.Pointer(&value), 1) } func SetsockoptInt(fd, level, opt int, value int) (err error) { var n = int32(value) return setsockopt(fd, level, opt, unsafe.Pointer(&n), 4) } func SetsockoptInet4Addr(fd, level, opt int, value [4]byte) (err error) { return setsockopt(fd, level, opt, unsafe.Pointer(&value[0]), 4) } func SetsockoptIPMreq(fd, level, opt int, mreq *IPMreq) (err error) { return setsockopt(fd, level, opt, unsafe.Pointer(mreq), SizeofIPMreq) } func SetsockoptIPv6Mreq(fd, level, opt int, mreq *IPv6Mreq) (err error) { return setsockopt(fd, level, opt, unsafe.Pointer(mreq), SizeofIPv6Mreq) } func SetsockoptICMPv6Filter(fd, level, opt int, filter *ICMPv6Filter) error { return setsockopt(fd, level, opt, unsafe.Pointer(filter), SizeofICMPv6Filter) } func SetsockoptLinger(fd, level, opt int, l *Linger) (err error) { return setsockopt(fd, level, opt, unsafe.Pointer(l), SizeofLinger) } func SetsockoptString(fd, level, opt int, s string) (err error) { return setsockopt(fd, level, opt, unsafe.Pointer(&[]byte(s)[0]), uintptr(len(s))) } func SetsockoptTimeval(fd, level, opt int, tv *Timeval) (err error) { return setsockopt(fd, level, opt, unsafe.Pointer(tv), unsafe.Sizeof(*tv)) } func Socket(domain, typ, proto int) (fd int, err error) { if domain == AF_INET6 && SocketDisableIPv6 { return -1, EAFNOSUPPORT } fd, err = socket(domain, typ, proto) return } func Socketpair(domain, typ, proto int) (fd [2]int, err error) { var fdx [2]int32 err = socketpair(domain, typ, proto, &fdx) if err == nil { fd[0] = int(fdx[0]) fd[1] = int(fdx[1]) } return } func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { if raceenabled { raceReleaseMerge(unsafe.Pointer(&ioSync)) } return sendfile(outfd, infd, offset, count) } var ioSync int64 func CloseOnExec(fd int) { fcntl(fd, F_SETFD, FD_CLOEXEC) } func SetNonblock(fd int, nonblocking bool) (err error) { flag, err := fcntl(fd, F_GETFL, 0) if err != nil { return err } if nonblocking { flag |= O_NONBLOCK } else { flag &= ^O_NONBLOCK } _, err = fcntl(fd, F_SETFL, flag) return err } ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_unix_gc.go ================================================ // Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin dragonfly freebsd linux netbsd openbsd solaris // +build !gccgo package unix import "syscall" func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) ================================================ FILE: vendor/golang.org/x/sys/unix/timestruct.go ================================================ // Copyright 2017 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin dragonfly freebsd linux netbsd openbsd solaris package unix // TimespecToNsec converts a Timespec value into a number of // nanoseconds since the Unix epoch. func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } // NsecToTimespec takes a number of nanoseconds since the Unix epoch // and returns the corresponding Timespec value. func NsecToTimespec(nsec int64) Timespec { sec := nsec / 1e9 nsec = nsec % 1e9 if nsec < 0 { nsec += 1e9 sec-- } return setTimespec(sec, nsec) } // TimevalToNsec converts a Timeval value into a number of nanoseconds // since the Unix epoch. func TimevalToNsec(tv Timeval) int64 { return int64(tv.Sec)*1e9 + int64(tv.Usec)*1e3 } // NsecToTimeval takes a number of nanoseconds since the Unix epoch // and returns the corresponding Timeval value. func NsecToTimeval(nsec int64) Timeval { nsec += 999 // round up to microsecond usec := nsec % 1e9 / 1e3 sec := nsec / 1e9 if usec < 0 { usec += 1e6 sec-- } return setTimeval(sec, usec) } // Unix returns ts as the number of seconds and nanoseconds elapsed since the // Unix epoch. func (ts *Timespec) Unix() (sec int64, nsec int64) { return int64(ts.Sec), int64(ts.Nsec) } // Unix returns tv as the number of seconds and nanoseconds elapsed since the // Unix epoch. func (tv *Timeval) Unix() (sec int64, nsec int64) { return int64(tv.Sec), int64(tv.Usec) * 1000 } // Nano returns ts as the number of nanoseconds elapsed since the Unix epoch. func (ts *Timespec) Nano() int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } // Nano returns tv as the number of nanoseconds elapsed since the Unix epoch. func (tv *Timeval) Nano() int64 { return int64(tv.Sec)*1e9 + int64(tv.Usec)*1000 } ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_darwin_386.go ================================================ // mkerrors.sh -m32 // Code generated by the command above; see README.md. DO NOT EDIT. // +build 386,darwin // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- -m32 _const.go package unix import "syscall" const ( AF_APPLETALK = 0x10 AF_CCITT = 0xa AF_CHAOS = 0x5 AF_CNT = 0x15 AF_COIP = 0x14 AF_DATAKIT = 0x9 AF_DECnet = 0xc AF_DLI = 0xd AF_E164 = 0x1c AF_ECMA = 0x8 AF_HYLINK = 0xf AF_IEEE80211 = 0x25 AF_IMPLINK = 0x3 AF_INET = 0x2 AF_INET6 = 0x1e AF_IPX = 0x17 AF_ISDN = 0x1c AF_ISO = 0x7 AF_LAT = 0xe AF_LINK = 0x12 AF_LOCAL = 0x1 AF_MAX = 0x28 AF_NATM = 0x1f AF_NDRV = 0x1b AF_NETBIOS = 0x21 AF_NS = 0x6 AF_OSI = 0x7 AF_PPP = 0x22 AF_PUP = 0x4 AF_RESERVED_36 = 0x24 AF_ROUTE = 0x11 AF_SIP = 0x18 AF_SNA = 0xb AF_SYSTEM = 0x20 AF_UNIX = 0x1 AF_UNSPEC = 0x0 AF_UTUN = 0x26 ALTWERASE = 0x200 ATTR_BIT_MAP_COUNT = 0x5 ATTR_CMN_ACCESSMASK = 0x20000 ATTR_CMN_ACCTIME = 0x1000 ATTR_CMN_ADDEDTIME = 0x10000000 ATTR_CMN_BKUPTIME = 0x2000 ATTR_CMN_CHGTIME = 0x800 ATTR_CMN_CRTIME = 0x200 ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000 ATTR_CMN_DEVID = 0x2 ATTR_CMN_DOCUMENT_ID = 0x100000 ATTR_CMN_ERROR = 0x20000000 ATTR_CMN_EXTENDED_SECURITY = 0x400000 ATTR_CMN_FILEID = 0x2000000 ATTR_CMN_FLAGS = 0x40000 ATTR_CMN_FNDRINFO = 0x4000 ATTR_CMN_FSID = 0x4 ATTR_CMN_FULLPATH = 0x8000000 ATTR_CMN_GEN_COUNT = 0x80000 ATTR_CMN_GRPID = 0x10000 ATTR_CMN_GRPUUID = 0x1000000 ATTR_CMN_MODTIME = 0x400 ATTR_CMN_NAME = 0x1 ATTR_CMN_NAMEDATTRCOUNT = 0x80000 ATTR_CMN_NAMEDATTRLIST = 0x100000 ATTR_CMN_OBJID = 0x20 ATTR_CMN_OBJPERMANENTID = 0x40 ATTR_CMN_OBJTAG = 0x10 ATTR_CMN_OBJTYPE = 0x8 ATTR_CMN_OWNERID = 0x8000 ATTR_CMN_PARENTID = 0x4000000 ATTR_CMN_PAROBJID = 0x80 ATTR_CMN_RETURNED_ATTRS = 0x80000000 ATTR_CMN_SCRIPT = 0x100 ATTR_CMN_SETMASK = 0x41c7ff00 ATTR_CMN_USERACCESS = 0x200000 ATTR_CMN_UUID = 0x800000 ATTR_CMN_VALIDMASK = 0xffffffff ATTR_CMN_VOLSETMASK = 0x6700 ATTR_FILE_ALLOCSIZE = 0x4 ATTR_FILE_CLUMPSIZE = 0x10 ATTR_FILE_DATAALLOCSIZE = 0x400 ATTR_FILE_DATAEXTENTS = 0x800 ATTR_FILE_DATALENGTH = 0x200 ATTR_FILE_DEVTYPE = 0x20 ATTR_FILE_FILETYPE = 0x40 ATTR_FILE_FORKCOUNT = 0x80 ATTR_FILE_FORKLIST = 0x100 ATTR_FILE_IOBLOCKSIZE = 0x8 ATTR_FILE_LINKCOUNT = 0x1 ATTR_FILE_RSRCALLOCSIZE = 0x2000 ATTR_FILE_RSRCEXTENTS = 0x4000 ATTR_FILE_RSRCLENGTH = 0x1000 ATTR_FILE_SETMASK = 0x20 ATTR_FILE_TOTALSIZE = 0x2 ATTR_FILE_VALIDMASK = 0x37ff ATTR_VOL_ALLOCATIONCLUMP = 0x40 ATTR_VOL_ATTRIBUTES = 0x40000000 ATTR_VOL_CAPABILITIES = 0x20000 ATTR_VOL_DIRCOUNT = 0x400 ATTR_VOL_ENCODINGSUSED = 0x10000 ATTR_VOL_FILECOUNT = 0x200 ATTR_VOL_FSTYPE = 0x1 ATTR_VOL_INFO = 0x80000000 ATTR_VOL_IOBLOCKSIZE = 0x80 ATTR_VOL_MAXOBJCOUNT = 0x800 ATTR_VOL_MINALLOCATION = 0x20 ATTR_VOL_MOUNTEDDEVICE = 0x8000 ATTR_VOL_MOUNTFLAGS = 0x4000 ATTR_VOL_MOUNTPOINT = 0x1000 ATTR_VOL_NAME = 0x2000 ATTR_VOL_OBJCOUNT = 0x100 ATTR_VOL_QUOTA_SIZE = 0x10000000 ATTR_VOL_RESERVED_SIZE = 0x20000000 ATTR_VOL_SETMASK = 0x80002000 ATTR_VOL_SIGNATURE = 0x2 ATTR_VOL_SIZE = 0x4 ATTR_VOL_SPACEAVAIL = 0x10 ATTR_VOL_SPACEFREE = 0x8 ATTR_VOL_UUID = 0x40000 ATTR_VOL_VALIDMASK = 0xf007ffff B0 = 0x0 B110 = 0x6e B115200 = 0x1c200 B1200 = 0x4b0 B134 = 0x86 B14400 = 0x3840 B150 = 0x96 B1800 = 0x708 B19200 = 0x4b00 B200 = 0xc8 B230400 = 0x38400 B2400 = 0x960 B28800 = 0x7080 B300 = 0x12c B38400 = 0x9600 B4800 = 0x12c0 B50 = 0x32 B57600 = 0xe100 B600 = 0x258 B7200 = 0x1c20 B75 = 0x4b B76800 = 0x12c00 B9600 = 0x2580 BIOCFLUSH = 0x20004268 BIOCGBLEN = 0x40044266 BIOCGDLT = 0x4004426a BIOCGDLTLIST = 0xc00c4279 BIOCGETIF = 0x4020426b BIOCGHDRCMPLT = 0x40044274 BIOCGRSIG = 0x40044272 BIOCGRTIMEOUT = 0x4008426e BIOCGSEESENT = 0x40044276 BIOCGSTATS = 0x4008426f BIOCIMMEDIATE = 0x80044270 BIOCPROMISC = 0x20004269 BIOCSBLEN = 0xc0044266 BIOCSDLT = 0x80044278 BIOCSETF = 0x80084267 BIOCSETFNR = 0x8008427e BIOCSETIF = 0x8020426c BIOCSHDRCMPLT = 0x80044275 BIOCSRSIG = 0x80044273 BIOCSRTIMEOUT = 0x8008426d BIOCSSEESENT = 0x80044277 BIOCVERSION = 0x40044271 BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALIGNMENT = 0x4 BPF_ALU = 0x4 BPF_AND = 0x50 BPF_B = 0x10 BPF_DIV = 0x30 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 BPF_JA = 0x0 BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 BPF_JMP = 0x5 BPF_JSET = 0x40 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 BPF_LEN = 0x80 BPF_LSH = 0x60 BPF_MAJOR_VERSION = 0x1 BPF_MAXBUFSIZE = 0x80000 BPF_MAXINSNS = 0x200 BPF_MEM = 0x60 BPF_MEMWORDS = 0x10 BPF_MINBUFSIZE = 0x20 BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_OR = 0x40 BPF_RELEASE = 0x30bb6 BPF_RET = 0x6 BPF_RSH = 0x70 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 BPF_TAX = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 BRKINT = 0x2 BS0 = 0x0 BS1 = 0x8000 BSDLY = 0x8000 CFLUSH = 0xf CLOCAL = 0x8000 CLOCK_MONOTONIC = 0x6 CLOCK_MONOTONIC_RAW = 0x4 CLOCK_MONOTONIC_RAW_APPROX = 0x5 CLOCK_PROCESS_CPUTIME_ID = 0xc CLOCK_REALTIME = 0x0 CLOCK_THREAD_CPUTIME_ID = 0x10 CLOCK_UPTIME_RAW = 0x8 CLOCK_UPTIME_RAW_APPROX = 0x9 CR0 = 0x0 CR1 = 0x1000 CR2 = 0x2000 CR3 = 0x3000 CRDLY = 0x3000 CREAD = 0x800 CRTSCTS = 0x30000 CS5 = 0x0 CS6 = 0x100 CS7 = 0x200 CS8 = 0x300 CSIZE = 0x300 CSTART = 0x11 CSTATUS = 0x14 CSTOP = 0x13 CSTOPB = 0x400 CSUSP = 0x1a CTL_MAXNAME = 0xc CTL_NET = 0x4 DLT_A429 = 0xb8 DLT_A653_ICM = 0xb9 DLT_AIRONET_HEADER = 0x78 DLT_AOS = 0xde DLT_APPLE_IP_OVER_IEEE1394 = 0x8a DLT_ARCNET = 0x7 DLT_ARCNET_LINUX = 0x81 DLT_ATM_CLIP = 0x13 DLT_ATM_RFC1483 = 0xb DLT_AURORA = 0x7e DLT_AX25 = 0x3 DLT_AX25_KISS = 0xca DLT_BACNET_MS_TP = 0xa5 DLT_BLUETOOTH_HCI_H4 = 0xbb DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 DLT_CAN20B = 0xbe DLT_CAN_SOCKETCAN = 0xe3 DLT_CHAOS = 0x5 DLT_CHDLC = 0x68 DLT_CISCO_IOS = 0x76 DLT_C_HDLC = 0x68 DLT_C_HDLC_WITH_DIR = 0xcd DLT_DBUS = 0xe7 DLT_DECT = 0xdd DLT_DOCSIS = 0x8f DLT_DVB_CI = 0xeb DLT_ECONET = 0x73 DLT_EN10MB = 0x1 DLT_EN3MB = 0x2 DLT_ENC = 0x6d DLT_ERF = 0xc5 DLT_ERF_ETH = 0xaf DLT_ERF_POS = 0xb0 DLT_FC_2 = 0xe0 DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 DLT_FDDI = 0xa DLT_FLEXRAY = 0xd2 DLT_FRELAY = 0x6b DLT_FRELAY_WITH_DIR = 0xce DLT_GCOM_SERIAL = 0xad DLT_GCOM_T1E1 = 0xac DLT_GPF_F = 0xab DLT_GPF_T = 0xaa DLT_GPRS_LLC = 0xa9 DLT_GSMTAP_ABIS = 0xda DLT_GSMTAP_UM = 0xd9 DLT_HHDLC = 0x79 DLT_IBM_SN = 0x92 DLT_IBM_SP = 0x91 DLT_IEEE802 = 0x6 DLT_IEEE802_11 = 0x69 DLT_IEEE802_11_RADIO = 0x7f DLT_IEEE802_11_RADIO_AVS = 0xa3 DLT_IEEE802_15_4 = 0xc3 DLT_IEEE802_15_4_LINUX = 0xbf DLT_IEEE802_15_4_NOFCS = 0xe6 DLT_IEEE802_15_4_NONASK_PHY = 0xd7 DLT_IEEE802_16_MAC_CPS = 0xbc DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 DLT_IPFILTER = 0x74 DLT_IPMB = 0xc7 DLT_IPMB_LINUX = 0xd1 DLT_IPNET = 0xe2 DLT_IPOIB = 0xf2 DLT_IPV4 = 0xe4 DLT_IPV6 = 0xe5 DLT_IP_OVER_FC = 0x7a DLT_JUNIPER_ATM1 = 0x89 DLT_JUNIPER_ATM2 = 0x87 DLT_JUNIPER_ATM_CEMIC = 0xee DLT_JUNIPER_CHDLC = 0xb5 DLT_JUNIPER_ES = 0x84 DLT_JUNIPER_ETHER = 0xb2 DLT_JUNIPER_FIBRECHANNEL = 0xea DLT_JUNIPER_FRELAY = 0xb4 DLT_JUNIPER_GGSN = 0x85 DLT_JUNIPER_ISM = 0xc2 DLT_JUNIPER_MFR = 0x86 DLT_JUNIPER_MLFR = 0x83 DLT_JUNIPER_MLPPP = 0x82 DLT_JUNIPER_MONITOR = 0xa4 DLT_JUNIPER_PIC_PEER = 0xae DLT_JUNIPER_PPP = 0xb3 DLT_JUNIPER_PPPOE = 0xa7 DLT_JUNIPER_PPPOE_ATM = 0xa8 DLT_JUNIPER_SERVICES = 0x88 DLT_JUNIPER_SRX_E2E = 0xe9 DLT_JUNIPER_ST = 0xc8 DLT_JUNIPER_VP = 0xb7 DLT_JUNIPER_VS = 0xe8 DLT_LAPB_WITH_DIR = 0xcf DLT_LAPD = 0xcb DLT_LIN = 0xd4 DLT_LINUX_EVDEV = 0xd8 DLT_LINUX_IRDA = 0x90 DLT_LINUX_LAPD = 0xb1 DLT_LINUX_PPP_WITHDIRECTION = 0xa6 DLT_LINUX_SLL = 0x71 DLT_LOOP = 0x6c DLT_LTALK = 0x72 DLT_MATCHING_MAX = 0xf5 DLT_MATCHING_MIN = 0x68 DLT_MFR = 0xb6 DLT_MOST = 0xd3 DLT_MPEG_2_TS = 0xf3 DLT_MPLS = 0xdb DLT_MTP2 = 0x8c DLT_MTP2_WITH_PHDR = 0x8b DLT_MTP3 = 0x8d DLT_MUX27010 = 0xec DLT_NETANALYZER = 0xf0 DLT_NETANALYZER_TRANSPARENT = 0xf1 DLT_NFC_LLCP = 0xf5 DLT_NFLOG = 0xef DLT_NG40 = 0xf4 DLT_NULL = 0x0 DLT_PCI_EXP = 0x7d DLT_PFLOG = 0x75 DLT_PFSYNC = 0x12 DLT_PPI = 0xc0 DLT_PPP = 0x9 DLT_PPP_BSDOS = 0x10 DLT_PPP_ETHER = 0x33 DLT_PPP_PPPD = 0xa6 DLT_PPP_SERIAL = 0x32 DLT_PPP_WITH_DIR = 0xcc DLT_PPP_WITH_DIRECTION = 0xa6 DLT_PRISM_HEADER = 0x77 DLT_PRONET = 0x4 DLT_RAIF1 = 0xc6 DLT_RAW = 0xc DLT_RIO = 0x7c DLT_SCCP = 0x8e DLT_SITA = 0xc4 DLT_SLIP = 0x8 DLT_SLIP_BSDOS = 0xf DLT_STANAG_5066_D_PDU = 0xed DLT_SUNATM = 0x7b DLT_SYMANTEC_FIREWALL = 0x63 DLT_TZSP = 0x80 DLT_USB = 0xba DLT_USB_LINUX = 0xbd DLT_USB_LINUX_MMAPPED = 0xdc DLT_USER0 = 0x93 DLT_USER1 = 0x94 DLT_USER10 = 0x9d DLT_USER11 = 0x9e DLT_USER12 = 0x9f DLT_USER13 = 0xa0 DLT_USER14 = 0xa1 DLT_USER15 = 0xa2 DLT_USER2 = 0x95 DLT_USER3 = 0x96 DLT_USER4 = 0x97 DLT_USER5 = 0x98 DLT_USER6 = 0x99 DLT_USER7 = 0x9a DLT_USER8 = 0x9b DLT_USER9 = 0x9c DLT_WIHART = 0xdf DLT_X2E_SERIAL = 0xd5 DLT_X2E_XORAYA = 0xd6 DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 DT_FIFO = 0x1 DT_LNK = 0xa DT_REG = 0x8 DT_SOCK = 0xc DT_UNKNOWN = 0x0 DT_WHT = 0xe ECHO = 0x8 ECHOCTL = 0x40 ECHOE = 0x2 ECHOK = 0x4 ECHOKE = 0x1 ECHONL = 0x10 ECHOPRT = 0x20 EVFILT_AIO = -0x3 EVFILT_EXCEPT = -0xf EVFILT_FS = -0x9 EVFILT_MACHPORT = -0x8 EVFILT_PROC = -0x5 EVFILT_READ = -0x1 EVFILT_SIGNAL = -0x6 EVFILT_SYSCOUNT = 0xf EVFILT_THREADMARKER = 0xf EVFILT_TIMER = -0x7 EVFILT_USER = -0xa EVFILT_VM = -0xc EVFILT_VNODE = -0x4 EVFILT_WRITE = -0x2 EV_ADD = 0x1 EV_CLEAR = 0x20 EV_DELETE = 0x2 EV_DISABLE = 0x8 EV_DISPATCH = 0x80 EV_DISPATCH2 = 0x180 EV_ENABLE = 0x4 EV_EOF = 0x8000 EV_ERROR = 0x4000 EV_FLAG0 = 0x1000 EV_FLAG1 = 0x2000 EV_ONESHOT = 0x10 EV_OOBAND = 0x2000 EV_POLL = 0x1000 EV_RECEIPT = 0x40 EV_SYSFLAGS = 0xf000 EV_UDATA_SPECIFIC = 0x100 EV_VANISHED = 0x200 EXTA = 0x4b00 EXTB = 0x9600 EXTPROC = 0x800 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 FF1 = 0x4000 FFDLY = 0x4000 FLUSHO = 0x800000 FSOPT_ATTR_CMN_EXTENDED = 0x20 FSOPT_NOFOLLOW = 0x1 FSOPT_NOINMEMUPDATE = 0x2 FSOPT_PACK_INVAL_ATTRS = 0x8 FSOPT_REPORT_FULLSIZE = 0x4 F_ADDFILESIGS = 0x3d F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 F_ADDFILESIGS_RETURN = 0x61 F_ADDSIGS = 0x3b F_ALLOCATEALL = 0x4 F_ALLOCATECONTIG = 0x2 F_BARRIERFSYNC = 0x55 F_CHECK_LV = 0x62 F_CHKCLEAN = 0x29 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0x43 F_FINDSIGS = 0x4e F_FLUSH_DATA = 0x28 F_FREEZE_FS = 0x35 F_FULLFSYNC = 0x33 F_GETCODEDIR = 0x48 F_GETFD = 0x1 F_GETFL = 0x3 F_GETLK = 0x7 F_GETLKPID = 0x42 F_GETNOSIGPIPE = 0x4a F_GETOWN = 0x5 F_GETPATH = 0x32 F_GETPATH_MTMINFO = 0x47 F_GETPROTECTIONCLASS = 0x3f F_GETPROTECTIONLEVEL = 0x4d F_GLOBAL_NOCACHE = 0x37 F_LOG2PHYS = 0x31 F_LOG2PHYS_EXT = 0x41 F_NOCACHE = 0x30 F_NODIRECT = 0x3e F_OK = 0x0 F_PATHPKG_CHECK = 0x34 F_PEOFPOSMODE = 0x3 F_PREALLOCATE = 0x2a F_PUNCHHOLE = 0x63 F_RDADVISE = 0x2c F_RDAHEAD = 0x2d F_RDLCK = 0x1 F_SETBACKINGSTORE = 0x46 F_SETFD = 0x2 F_SETFL = 0x4 F_SETLK = 0x8 F_SETLKW = 0x9 F_SETLKWTIMEOUT = 0xa F_SETNOSIGPIPE = 0x49 F_SETOWN = 0x6 F_SETPROTECTIONCLASS = 0x40 F_SETSIZE = 0x2b F_SINGLE_WRITER = 0x4c F_THAW_FS = 0x36 F_TRANSCODEKEY = 0x4b F_TRIM_ACTIVE_FILE = 0x64 F_UNLCK = 0x2 F_VOLPOSMODE = 0x4 F_WRLCK = 0x3 HUPCL = 0x4000 ICANON = 0x100 ICMP6_FILTER = 0x12 ICRNL = 0x100 IEXTEN = 0x400 IFF_ALLMULTI = 0x200 IFF_ALTPHYS = 0x4000 IFF_BROADCAST = 0x2 IFF_DEBUG = 0x4 IFF_LINK0 = 0x1000 IFF_LINK1 = 0x2000 IFF_LINK2 = 0x4000 IFF_LOOPBACK = 0x8 IFF_MULTICAST = 0x8000 IFF_NOARP = 0x80 IFF_NOTRAILERS = 0x20 IFF_OACTIVE = 0x400 IFF_POINTOPOINT = 0x10 IFF_PROMISC = 0x100 IFF_RUNNING = 0x40 IFF_SIMPLEX = 0x800 IFF_UP = 0x1 IFNAMSIZ = 0x10 IFT_1822 = 0x2 IFT_AAL5 = 0x31 IFT_ARCNET = 0x23 IFT_ARCNETPLUS = 0x24 IFT_ATM = 0x25 IFT_BRIDGE = 0xd1 IFT_CARP = 0xf8 IFT_CELLULAR = 0xff IFT_CEPT = 0x13 IFT_DS3 = 0x1e IFT_ENC = 0xf4 IFT_EON = 0x19 IFT_ETHER = 0x6 IFT_FAITH = 0x38 IFT_FDDI = 0xf IFT_FRELAY = 0x20 IFT_FRELAYDCE = 0x2c IFT_GIF = 0x37 IFT_HDH1822 = 0x3 IFT_HIPPI = 0x2f IFT_HSSI = 0x2e IFT_HY = 0xe IFT_IEEE1394 = 0x90 IFT_IEEE8023ADLAG = 0x88 IFT_ISDNBASIC = 0x14 IFT_ISDNPRIMARY = 0x15 IFT_ISO88022LLC = 0x29 IFT_ISO88023 = 0x7 IFT_ISO88024 = 0x8 IFT_ISO88025 = 0x9 IFT_ISO88026 = 0xa IFT_L2VLAN = 0x87 IFT_LAPB = 0x10 IFT_LOCALTALK = 0x2a IFT_LOOP = 0x18 IFT_MIOX25 = 0x26 IFT_MODEM = 0x30 IFT_NSIP = 0x1b IFT_OTHER = 0x1 IFT_P10 = 0xc IFT_P80 = 0xd IFT_PARA = 0x22 IFT_PDP = 0xff IFT_PFLOG = 0xf5 IFT_PFSYNC = 0xf6 IFT_PKTAP = 0xfe IFT_PPP = 0x17 IFT_PROPMUX = 0x36 IFT_PROPVIRTUAL = 0x35 IFT_PTPSERIAL = 0x16 IFT_RS232 = 0x21 IFT_SDLC = 0x11 IFT_SIP = 0x1f IFT_SLIP = 0x1c IFT_SMDSDXI = 0x2b IFT_SMDSICIP = 0x34 IFT_SONET = 0x27 IFT_SONETPATH = 0x32 IFT_SONETVT = 0x33 IFT_STARLAN = 0xb IFT_STF = 0x39 IFT_T1 = 0x12 IFT_ULTRA = 0x1d IFT_V35 = 0x2d IFT_X25 = 0x5 IFT_X25DDN = 0x4 IFT_X25PLE = 0x28 IFT_XETHER = 0x1a IGNBRK = 0x1 IGNCR = 0x80 IGNPAR = 0x4 IMAXBEL = 0x2000 INLCR = 0x40 INPCK = 0x10 IN_CLASSA_HOST = 0xffffff IN_CLASSA_MAX = 0x80 IN_CLASSA_NET = 0xff000000 IN_CLASSA_NSHIFT = 0x18 IN_CLASSB_HOST = 0xffff IN_CLASSB_MAX = 0x10000 IN_CLASSB_NET = 0xffff0000 IN_CLASSB_NSHIFT = 0x10 IN_CLASSC_HOST = 0xff IN_CLASSC_NET = 0xffffff00 IN_CLASSC_NSHIFT = 0x8 IN_CLASSD_HOST = 0xfffffff IN_CLASSD_NET = 0xf0000000 IN_CLASSD_NSHIFT = 0x1c IN_LINKLOCALNETNUM = 0xa9fe0000 IN_LOOPBACKNET = 0x7f IPPROTO_3PC = 0x22 IPPROTO_ADFS = 0x44 IPPROTO_AH = 0x33 IPPROTO_AHIP = 0x3d IPPROTO_APES = 0x63 IPPROTO_ARGUS = 0xd IPPROTO_AX25 = 0x5d IPPROTO_BHA = 0x31 IPPROTO_BLT = 0x1e IPPROTO_BRSATMON = 0x4c IPPROTO_CFTP = 0x3e IPPROTO_CHAOS = 0x10 IPPROTO_CMTP = 0x26 IPPROTO_CPHB = 0x49 IPPROTO_CPNX = 0x48 IPPROTO_DDP = 0x25 IPPROTO_DGP = 0x56 IPPROTO_DIVERT = 0xfe IPPROTO_DONE = 0x101 IPPROTO_DSTOPTS = 0x3c IPPROTO_EGP = 0x8 IPPROTO_EMCON = 0xe IPPROTO_ENCAP = 0x62 IPPROTO_EON = 0x50 IPPROTO_ESP = 0x32 IPPROTO_ETHERIP = 0x61 IPPROTO_FRAGMENT = 0x2c IPPROTO_GGP = 0x3 IPPROTO_GMTP = 0x64 IPPROTO_GRE = 0x2f IPPROTO_HELLO = 0x3f IPPROTO_HMP = 0x14 IPPROTO_HOPOPTS = 0x0 IPPROTO_ICMP = 0x1 IPPROTO_ICMPV6 = 0x3a IPPROTO_IDP = 0x16 IPPROTO_IDPR = 0x23 IPPROTO_IDRP = 0x2d IPPROTO_IGMP = 0x2 IPPROTO_IGP = 0x55 IPPROTO_IGRP = 0x58 IPPROTO_IL = 0x28 IPPROTO_INLSP = 0x34 IPPROTO_INP = 0x20 IPPROTO_IP = 0x0 IPPROTO_IPCOMP = 0x6c IPPROTO_IPCV = 0x47 IPPROTO_IPEIP = 0x5e IPPROTO_IPIP = 0x4 IPPROTO_IPPC = 0x43 IPPROTO_IPV4 = 0x4 IPPROTO_IPV6 = 0x29 IPPROTO_IRTP = 0x1c IPPROTO_KRYPTOLAN = 0x41 IPPROTO_LARP = 0x5b IPPROTO_LEAF1 = 0x19 IPPROTO_LEAF2 = 0x1a IPPROTO_MAX = 0x100 IPPROTO_MAXID = 0x34 IPPROTO_MEAS = 0x13 IPPROTO_MHRP = 0x30 IPPROTO_MICP = 0x5f IPPROTO_MTP = 0x5c IPPROTO_MUX = 0x12 IPPROTO_ND = 0x4d IPPROTO_NHRP = 0x36 IPPROTO_NONE = 0x3b IPPROTO_NSP = 0x1f IPPROTO_NVPII = 0xb IPPROTO_OSPFIGP = 0x59 IPPROTO_PGM = 0x71 IPPROTO_PIGP = 0x9 IPPROTO_PIM = 0x67 IPPROTO_PRM = 0x15 IPPROTO_PUP = 0xc IPPROTO_PVP = 0x4b IPPROTO_RAW = 0xff IPPROTO_RCCMON = 0xa IPPROTO_RDP = 0x1b IPPROTO_ROUTING = 0x2b IPPROTO_RSVP = 0x2e IPPROTO_RVD = 0x42 IPPROTO_SATEXPAK = 0x40 IPPROTO_SATMON = 0x45 IPPROTO_SCCSP = 0x60 IPPROTO_SCTP = 0x84 IPPROTO_SDRP = 0x2a IPPROTO_SEP = 0x21 IPPROTO_SRPC = 0x5a IPPROTO_ST = 0x7 IPPROTO_SVMTP = 0x52 IPPROTO_SWIPE = 0x35 IPPROTO_TCF = 0x57 IPPROTO_TCP = 0x6 IPPROTO_TP = 0x1d IPPROTO_TPXX = 0x27 IPPROTO_TRUNK1 = 0x17 IPPROTO_TRUNK2 = 0x18 IPPROTO_TTP = 0x54 IPPROTO_UDP = 0x11 IPPROTO_VINES = 0x53 IPPROTO_VISA = 0x46 IPPROTO_VMTP = 0x51 IPPROTO_WBEXPAK = 0x4f IPPROTO_WBMON = 0x4e IPPROTO_WSN = 0x4a IPPROTO_XNET = 0xf IPPROTO_XTP = 0x24 IPV6_2292DSTOPTS = 0x17 IPV6_2292HOPLIMIT = 0x14 IPV6_2292HOPOPTS = 0x16 IPV6_2292NEXTHOP = 0x15 IPV6_2292PKTINFO = 0x13 IPV6_2292PKTOPTIONS = 0x19 IPV6_2292RTHDR = 0x18 IPV6_BINDV6ONLY = 0x1b IPV6_BOUND_IF = 0x7d IPV6_CHECKSUM = 0x1a IPV6_DEFAULT_MULTICAST_HOPS = 0x1 IPV6_DEFAULT_MULTICAST_LOOP = 0x1 IPV6_DEFHLIM = 0x40 IPV6_FAITH = 0x1d IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 IPV6_FLOW_ECN_MASK = 0x300 IPV6_FRAGTTL = 0x3c IPV6_FW_ADD = 0x1e IPV6_FW_DEL = 0x1f IPV6_FW_FLUSH = 0x20 IPV6_FW_GET = 0x22 IPV6_FW_ZERO = 0x21 IPV6_HLIMDEC = 0x1 IPV6_IPSEC_POLICY = 0x1c IPV6_JOIN_GROUP = 0xc IPV6_LEAVE_GROUP = 0xd IPV6_MAXHLIM = 0xff IPV6_MAXOPTHDR = 0x800 IPV6_MAXPACKET = 0xffff IPV6_MAX_GROUP_SRC_FILTER = 0x200 IPV6_MAX_MEMBERSHIPS = 0xfff IPV6_MAX_SOCK_SRC_FILTER = 0x80 IPV6_MIN_MEMBERSHIPS = 0x1f IPV6_MMTU = 0x500 IPV6_MULTICAST_HOPS = 0xa IPV6_MULTICAST_IF = 0x9 IPV6_MULTICAST_LOOP = 0xb IPV6_PORTRANGE = 0xe IPV6_PORTRANGE_DEFAULT = 0x0 IPV6_PORTRANGE_HIGH = 0x1 IPV6_PORTRANGE_LOW = 0x2 IPV6_RECVTCLASS = 0x23 IPV6_RTHDR_LOOSE = 0x0 IPV6_RTHDR_STRICT = 0x1 IPV6_RTHDR_TYPE_0 = 0x0 IPV6_SOCKOPT_RESERVED1 = 0x3 IPV6_TCLASS = 0x24 IPV6_UNICAST_HOPS = 0x4 IPV6_V6ONLY = 0x1b IPV6_VERSION = 0x60 IPV6_VERSION_MASK = 0xf0 IP_ADD_MEMBERSHIP = 0xc IP_ADD_SOURCE_MEMBERSHIP = 0x46 IP_BLOCK_SOURCE = 0x48 IP_BOUND_IF = 0x19 IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 IP_DROP_MEMBERSHIP = 0xd IP_DROP_SOURCE_MEMBERSHIP = 0x47 IP_DUMMYNET_CONFIGURE = 0x3c IP_DUMMYNET_DEL = 0x3d IP_DUMMYNET_FLUSH = 0x3e IP_DUMMYNET_GET = 0x40 IP_FAITH = 0x16 IP_FW_ADD = 0x28 IP_FW_DEL = 0x29 IP_FW_FLUSH = 0x2a IP_FW_GET = 0x2c IP_FW_RESETLOG = 0x2d IP_FW_ZERO = 0x2b IP_HDRINCL = 0x2 IP_IPSEC_POLICY = 0x15 IP_MAXPACKET = 0xffff IP_MAX_GROUP_SRC_FILTER = 0x200 IP_MAX_MEMBERSHIPS = 0xfff IP_MAX_SOCK_MUTE_FILTER = 0x80 IP_MAX_SOCK_SRC_FILTER = 0x80 IP_MF = 0x2000 IP_MIN_MEMBERSHIPS = 0x1f IP_MSFILTER = 0x4a IP_MSS = 0x240 IP_MULTICAST_IF = 0x9 IP_MULTICAST_IFINDEX = 0x42 IP_MULTICAST_LOOP = 0xb IP_MULTICAST_TTL = 0xa IP_MULTICAST_VIF = 0xe IP_NAT__XXX = 0x37 IP_OFFMASK = 0x1fff IP_OLD_FW_ADD = 0x32 IP_OLD_FW_DEL = 0x33 IP_OLD_FW_FLUSH = 0x34 IP_OLD_FW_GET = 0x36 IP_OLD_FW_RESETLOG = 0x38 IP_OLD_FW_ZERO = 0x35 IP_OPTIONS = 0x1 IP_PKTINFO = 0x1a IP_PORTRANGE = 0x13 IP_PORTRANGE_DEFAULT = 0x0 IP_PORTRANGE_HIGH = 0x1 IP_PORTRANGE_LOW = 0x2 IP_RECVDSTADDR = 0x7 IP_RECVIF = 0x14 IP_RECVOPTS = 0x5 IP_RECVPKTINFO = 0x1a IP_RECVRETOPTS = 0x6 IP_RECVTOS = 0x1b IP_RECVTTL = 0x18 IP_RETOPTS = 0x8 IP_RF = 0x8000 IP_RSVP_OFF = 0x10 IP_RSVP_ON = 0xf IP_RSVP_VIF_OFF = 0x12 IP_RSVP_VIF_ON = 0x11 IP_STRIPHDR = 0x17 IP_TOS = 0x3 IP_TRAFFIC_MGT_BACKGROUND = 0x41 IP_TTL = 0x4 IP_UNBLOCK_SOURCE = 0x49 ISIG = 0x80 ISTRIP = 0x20 IUTF8 = 0x4000 IXANY = 0x800 IXOFF = 0x400 IXON = 0x200 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 MADV_CAN_REUSE = 0x9 MADV_DONTNEED = 0x4 MADV_FREE = 0x5 MADV_FREE_REUSABLE = 0x7 MADV_FREE_REUSE = 0x8 MADV_NORMAL = 0x0 MADV_PAGEOUT = 0xa MADV_RANDOM = 0x1 MADV_SEQUENTIAL = 0x2 MADV_WILLNEED = 0x3 MADV_ZERO_WIRED_PAGES = 0x6 MAP_ANON = 0x1000 MAP_ANONYMOUS = 0x1000 MAP_COPY = 0x2 MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_HASSEMAPHORE = 0x200 MAP_JIT = 0x800 MAP_NOCACHE = 0x400 MAP_NOEXTEND = 0x100 MAP_NORESERVE = 0x40 MAP_PRIVATE = 0x2 MAP_RENAME = 0x20 MAP_RESERVED0080 = 0x80 MAP_RESILIENT_CODESIGN = 0x2000 MAP_RESILIENT_MEDIA = 0x4000 MAP_SHARED = 0x1 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MNT_ASYNC = 0x40 MNT_AUTOMOUNTED = 0x400000 MNT_CMDFLAGS = 0xf0000 MNT_CPROTECT = 0x80 MNT_DEFWRITE = 0x2000000 MNT_DONTBROWSE = 0x100000 MNT_DOVOLFS = 0x8000 MNT_DWAIT = 0x4 MNT_EXPORTED = 0x100 MNT_FORCE = 0x80000 MNT_IGNORE_OWNERSHIP = 0x200000 MNT_JOURNALED = 0x800000 MNT_LOCAL = 0x1000 MNT_MULTILABEL = 0x4000000 MNT_NOATIME = 0x10000000 MNT_NOBLOCK = 0x20000 MNT_NODEV = 0x10 MNT_NOEXEC = 0x4 MNT_NOSUID = 0x8 MNT_NOUSERXATTR = 0x1000000 MNT_NOWAIT = 0x2 MNT_QUARANTINE = 0x400 MNT_QUOTA = 0x2000 MNT_RDONLY = 0x1 MNT_RELOAD = 0x40000 MNT_ROOTFS = 0x4000 MNT_SYNCHRONOUS = 0x2 MNT_UNION = 0x20 MNT_UNKNOWNPERMISSIONS = 0x200000 MNT_UPDATE = 0x10000 MNT_VISFLAGMASK = 0x17f0f5ff MNT_WAIT = 0x1 MSG_CTRUNC = 0x20 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x80 MSG_EOF = 0x100 MSG_EOR = 0x8 MSG_FLUSH = 0x400 MSG_HAVEMORE = 0x2000 MSG_HOLD = 0x800 MSG_NEEDSA = 0x10000 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_RCVMORE = 0x4000 MSG_SEND = 0x1000 MSG_TRUNC = 0x10 MSG_WAITALL = 0x40 MSG_WAITSTREAM = 0x200 MS_ASYNC = 0x1 MS_DEACTIVATE = 0x8 MS_INVALIDATE = 0x2 MS_KILLPAGES = 0x4 MS_SYNC = 0x10 NAME_MAX = 0xff NET_RT_DUMP = 0x1 NET_RT_DUMP2 = 0x7 NET_RT_FLAGS = 0x2 NET_RT_IFLIST = 0x3 NET_RT_IFLIST2 = 0x6 NET_RT_MAXID = 0xa NET_RT_STAT = 0x4 NET_RT_TRASH = 0x5 NL0 = 0x0 NL1 = 0x100 NL2 = 0x200 NL3 = 0x300 NLDLY = 0x300 NOFLSH = 0x80000000 NOKERNINFO = 0x2000000 NOTE_ABSOLUTE = 0x8 NOTE_ATTRIB = 0x8 NOTE_BACKGROUND = 0x40 NOTE_CHILD = 0x4 NOTE_CRITICAL = 0x20 NOTE_DELETE = 0x1 NOTE_EXEC = 0x20000000 NOTE_EXIT = 0x80000000 NOTE_EXITSTATUS = 0x4000000 NOTE_EXIT_CSERROR = 0x40000 NOTE_EXIT_DECRYPTFAIL = 0x10000 NOTE_EXIT_DETAIL = 0x2000000 NOTE_EXIT_DETAIL_MASK = 0x70000 NOTE_EXIT_MEMORY = 0x20000 NOTE_EXIT_REPARENTED = 0x80000 NOTE_EXTEND = 0x4 NOTE_FFAND = 0x40000000 NOTE_FFCOPY = 0xc0000000 NOTE_FFCTRLMASK = 0xc0000000 NOTE_FFLAGSMASK = 0xffffff NOTE_FFNOP = 0x0 NOTE_FFOR = 0x80000000 NOTE_FORK = 0x40000000 NOTE_FUNLOCK = 0x100 NOTE_LEEWAY = 0x10 NOTE_LINK = 0x10 NOTE_LOWAT = 0x1 NOTE_MACH_CONTINUOUS_TIME = 0x80 NOTE_NONE = 0x80 NOTE_NSECONDS = 0x4 NOTE_OOB = 0x2 NOTE_PCTRLMASK = -0x100000 NOTE_PDATAMASK = 0xfffff NOTE_REAP = 0x10000000 NOTE_RENAME = 0x20 NOTE_REVOKE = 0x40 NOTE_SECONDS = 0x1 NOTE_SIGNAL = 0x8000000 NOTE_TRACK = 0x1 NOTE_TRACKERR = 0x2 NOTE_TRIGGER = 0x1000000 NOTE_USECONDS = 0x2 NOTE_VM_ERROR = 0x10000000 NOTE_VM_PRESSURE = 0x80000000 NOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000 NOTE_VM_PRESSURE_TERMINATE = 0x40000000 NOTE_WRITE = 0x2 OCRNL = 0x10 OFDEL = 0x20000 OFILL = 0x80 ONLCR = 0x2 ONLRET = 0x40 ONOCR = 0x20 ONOEOT = 0x8 OPOST = 0x1 OXTABS = 0x4 O_ACCMODE = 0x3 O_ALERT = 0x20000000 O_APPEND = 0x8 O_ASYNC = 0x40 O_CLOEXEC = 0x1000000 O_CREAT = 0x200 O_DIRECTORY = 0x100000 O_DP_GETRAWENCRYPTED = 0x1 O_DP_GETRAWUNENCRYPTED = 0x2 O_DSYNC = 0x400000 O_EVTONLY = 0x8000 O_EXCL = 0x800 O_EXLOCK = 0x20 O_FSYNC = 0x80 O_NDELAY = 0x4 O_NOCTTY = 0x20000 O_NOFOLLOW = 0x100 O_NONBLOCK = 0x4 O_POPUP = 0x80000000 O_RDONLY = 0x0 O_RDWR = 0x2 O_SHLOCK = 0x10 O_SYMLINK = 0x200000 O_SYNC = 0x80 O_TRUNC = 0x400 O_WRONLY = 0x1 PARENB = 0x1000 PARMRK = 0x8 PARODD = 0x2000 PENDIN = 0x20000000 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 PROT_EXEC = 0x4 PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 PT_ATTACH = 0xa PT_ATTACHEXC = 0xe PT_CONTINUE = 0x7 PT_DENY_ATTACH = 0x1f PT_DETACH = 0xb PT_FIRSTMACH = 0x20 PT_FORCEQUOTA = 0x1e PT_KILL = 0x8 PT_READ_D = 0x2 PT_READ_I = 0x1 PT_READ_U = 0x3 PT_SIGEXC = 0xc PT_STEP = 0x9 PT_THUPDATE = 0xd PT_TRACE_ME = 0x0 PT_WRITE_D = 0x5 PT_WRITE_I = 0x4 PT_WRITE_U = 0x6 RLIMIT_AS = 0x5 RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 RLIMIT_CPU_USAGE_MONITOR = 0x2 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 RLIMIT_MEMLOCK = 0x6 RLIMIT_NOFILE = 0x8 RLIMIT_NPROC = 0x7 RLIMIT_RSS = 0x5 RLIMIT_STACK = 0x3 RLIM_INFINITY = 0x7fffffffffffffff RTAX_AUTHOR = 0x6 RTAX_BRD = 0x7 RTAX_DST = 0x0 RTAX_GATEWAY = 0x1 RTAX_GENMASK = 0x3 RTAX_IFA = 0x5 RTAX_IFP = 0x4 RTAX_MAX = 0x8 RTAX_NETMASK = 0x2 RTA_AUTHOR = 0x40 RTA_BRD = 0x80 RTA_DST = 0x1 RTA_GATEWAY = 0x2 RTA_GENMASK = 0x8 RTA_IFA = 0x20 RTA_IFP = 0x10 RTA_NETMASK = 0x4 RTF_BLACKHOLE = 0x1000 RTF_BROADCAST = 0x400000 RTF_CLONING = 0x100 RTF_CONDEMNED = 0x2000000 RTF_DELCLONE = 0x80 RTF_DONE = 0x40 RTF_DYNAMIC = 0x10 RTF_GATEWAY = 0x2 RTF_HOST = 0x4 RTF_IFREF = 0x4000000 RTF_IFSCOPE = 0x1000000 RTF_LLINFO = 0x400 RTF_LOCAL = 0x200000 RTF_MODIFIED = 0x20 RTF_MULTICAST = 0x800000 RTF_NOIFREF = 0x2000 RTF_PINNED = 0x100000 RTF_PRCLONING = 0x10000 RTF_PROTO1 = 0x8000 RTF_PROTO2 = 0x4000 RTF_PROTO3 = 0x40000 RTF_PROXY = 0x8000000 RTF_REJECT = 0x8 RTF_ROUTER = 0x10000000 RTF_STATIC = 0x800 RTF_UP = 0x1 RTF_WASCLONED = 0x20000 RTF_XRESOLVE = 0x200 RTM_ADD = 0x1 RTM_CHANGE = 0x3 RTM_DELADDR = 0xd RTM_DELETE = 0x2 RTM_DELMADDR = 0x10 RTM_GET = 0x4 RTM_GET2 = 0x14 RTM_IFINFO = 0xe RTM_IFINFO2 = 0x12 RTM_LOCK = 0x8 RTM_LOSING = 0x5 RTM_MISS = 0x7 RTM_NEWADDR = 0xc RTM_NEWMADDR = 0xf RTM_NEWMADDR2 = 0x13 RTM_OLDADD = 0x9 RTM_OLDDEL = 0xa RTM_REDIRECT = 0x6 RTM_RESOLVE = 0xb RTM_RTTUNIT = 0xf4240 RTM_VERSION = 0x5 RTV_EXPIRE = 0x4 RTV_HOPCOUNT = 0x2 RTV_MTU = 0x1 RTV_RPIPE = 0x8 RTV_RTT = 0x40 RTV_RTTVAR = 0x80 RTV_SPIPE = 0x10 RTV_SSTHRESH = 0x20 RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 SCM_CREDS = 0x3 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x2 SCM_TIMESTAMP_MONOTONIC = 0x4 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 SIOCADDMULTI = 0x80206931 SIOCAIFADDR = 0x8040691a SIOCARPIPLL = 0xc0206928 SIOCATMARK = 0x40047307 SIOCAUTOADDR = 0xc0206926 SIOCAUTONETMASK = 0x80206927 SIOCDELMULTI = 0x80206932 SIOCDIFADDR = 0x80206919 SIOCDIFPHYADDR = 0x80206941 SIOCGDRVSPEC = 0xc01c697b SIOCGETVLAN = 0xc020697f SIOCGHIWAT = 0x40047301 SIOCGIFADDR = 0xc0206921 SIOCGIFALTMTU = 0xc0206948 SIOCGIFASYNCMAP = 0xc020697c SIOCGIFBOND = 0xc0206947 SIOCGIFBRDADDR = 0xc0206923 SIOCGIFCAP = 0xc020695b SIOCGIFCONF = 0xc0086924 SIOCGIFDEVMTU = 0xc0206944 SIOCGIFDSTADDR = 0xc0206922 SIOCGIFFLAGS = 0xc0206911 SIOCGIFGENERIC = 0xc020693a SIOCGIFKPI = 0xc0206987 SIOCGIFMAC = 0xc0206982 SIOCGIFMEDIA = 0xc0286938 SIOCGIFMETRIC = 0xc0206917 SIOCGIFMTU = 0xc0206933 SIOCGIFNETMASK = 0xc0206925 SIOCGIFPDSTADDR = 0xc0206940 SIOCGIFPHYS = 0xc0206935 SIOCGIFPSRCADDR = 0xc020693f SIOCGIFSTATUS = 0xc331693d SIOCGIFVLAN = 0xc020697f SIOCGIFWAKEFLAGS = 0xc0206988 SIOCGLOWAT = 0x40047303 SIOCGPGRP = 0x40047309 SIOCIFCREATE = 0xc0206978 SIOCIFCREATE2 = 0xc020697a SIOCIFDESTROY = 0x80206979 SIOCIFGCLONERS = 0xc00c6981 SIOCRSLVMULTI = 0xc008693b SIOCSDRVSPEC = 0x801c697b SIOCSETVLAN = 0x8020697e SIOCSHIWAT = 0x80047300 SIOCSIFADDR = 0x8020690c SIOCSIFALTMTU = 0x80206945 SIOCSIFASYNCMAP = 0x8020697d SIOCSIFBOND = 0x80206946 SIOCSIFBRDADDR = 0x80206913 SIOCSIFCAP = 0x8020695a SIOCSIFDSTADDR = 0x8020690e SIOCSIFFLAGS = 0x80206910 SIOCSIFGENERIC = 0x80206939 SIOCSIFKPI = 0x80206986 SIOCSIFLLADDR = 0x8020693c SIOCSIFMAC = 0x80206983 SIOCSIFMEDIA = 0xc0206937 SIOCSIFMETRIC = 0x80206918 SIOCSIFMTU = 0x80206934 SIOCSIFNETMASK = 0x80206916 SIOCSIFPHYADDR = 0x8040693e SIOCSIFPHYS = 0x80206936 SIOCSIFVLAN = 0x8020697e SIOCSLOWAT = 0x80047302 SIOCSPGRP = 0x80047308 SOCK_DGRAM = 0x2 SOCK_MAXADDRLEN = 0xff SOCK_RAW = 0x3 SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x1 SOL_SOCKET = 0xffff SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x2 SO_BROADCAST = 0x20 SO_DEBUG = 0x1 SO_DONTROUTE = 0x10 SO_DONTTRUNC = 0x2000 SO_ERROR = 0x1007 SO_KEEPALIVE = 0x8 SO_LABEL = 0x1010 SO_LINGER = 0x80 SO_LINGER_SEC = 0x1080 SO_NETSVC_MARKING_LEVEL = 0x1119 SO_NET_SERVICE_TYPE = 0x1116 SO_NKE = 0x1021 SO_NOADDRERR = 0x1023 SO_NOSIGPIPE = 0x1022 SO_NOTIFYCONFLICT = 0x1026 SO_NP_EXTENSIONS = 0x1083 SO_NREAD = 0x1020 SO_NUMRCVPKT = 0x1112 SO_NWRITE = 0x1024 SO_OOBINLINE = 0x100 SO_PEERLABEL = 0x1011 SO_RANDOMPORT = 0x1082 SO_RCVBUF = 0x1002 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x1006 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_REUSESHAREUID = 0x1025 SO_SNDBUF = 0x1001 SO_SNDLOWAT = 0x1003 SO_SNDTIMEO = 0x1005 SO_TIMESTAMP = 0x400 SO_TIMESTAMP_MONOTONIC = 0x800 SO_TYPE = 0x1008 SO_UPCALLCLOSEWAIT = 0x1027 SO_USELOOPBACK = 0x40 SO_WANTMORE = 0x4000 SO_WANTOOBFLAG = 0x8000 S_IEXEC = 0x40 S_IFBLK = 0x6000 S_IFCHR = 0x2000 S_IFDIR = 0x4000 S_IFIFO = 0x1000 S_IFLNK = 0xa000 S_IFMT = 0xf000 S_IFREG = 0x8000 S_IFSOCK = 0xc000 S_IFWHT = 0xe000 S_IREAD = 0x100 S_IRGRP = 0x20 S_IROTH = 0x4 S_IRUSR = 0x100 S_IRWXG = 0x38 S_IRWXO = 0x7 S_IRWXU = 0x1c0 S_ISGID = 0x400 S_ISTXT = 0x200 S_ISUID = 0x800 S_ISVTX = 0x200 S_IWGRP = 0x10 S_IWOTH = 0x2 S_IWRITE = 0x80 S_IWUSR = 0x80 S_IXGRP = 0x8 S_IXOTH = 0x1 S_IXUSR = 0x40 TAB0 = 0x0 TAB1 = 0x400 TAB2 = 0x800 TAB3 = 0x4 TABDLY = 0xc04 TCIFLUSH = 0x1 TCIOFF = 0x3 TCIOFLUSH = 0x3 TCION = 0x4 TCOFLUSH = 0x2 TCOOFF = 0x1 TCOON = 0x2 TCP_CONNECTIONTIMEOUT = 0x20 TCP_CONNECTION_INFO = 0x106 TCP_ENABLE_ECN = 0x104 TCP_FASTOPEN = 0x105 TCP_KEEPALIVE = 0x10 TCP_KEEPCNT = 0x102 TCP_KEEPINTVL = 0x101 TCP_MAXHLEN = 0x3c TCP_MAXOLEN = 0x28 TCP_MAXSEG = 0x2 TCP_MAXWIN = 0xffff TCP_MAX_SACK = 0x4 TCP_MAX_WINSHIFT = 0xe TCP_MINMSS = 0xd8 TCP_MSS = 0x200 TCP_NODELAY = 0x1 TCP_NOOPT = 0x8 TCP_NOPUSH = 0x4 TCP_NOTSENT_LOWAT = 0x201 TCP_RXT_CONNDROPTIME = 0x80 TCP_RXT_FINDROP = 0x100 TCP_SENDMOREACKS = 0x103 TCSAFLUSH = 0x2 TIOCCBRK = 0x2000747a TIOCCDTR = 0x20007478 TIOCCONS = 0x80047462 TIOCDCDTIMESTAMP = 0x40087458 TIOCDRAIN = 0x2000745e TIOCDSIMICROCODE = 0x20007455 TIOCEXCL = 0x2000740d TIOCEXT = 0x80047460 TIOCFLUSH = 0x80047410 TIOCGDRAINWAIT = 0x40047456 TIOCGETA = 0x402c7413 TIOCGETD = 0x4004741a TIOCGPGRP = 0x40047477 TIOCGWINSZ = 0x40087468 TIOCIXOFF = 0x20007480 TIOCIXON = 0x20007481 TIOCMBIC = 0x8004746b TIOCMBIS = 0x8004746c TIOCMGDTRWAIT = 0x4004745a TIOCMGET = 0x4004746a TIOCMODG = 0x40047403 TIOCMODS = 0x80047404 TIOCMSDTRWAIT = 0x8004745b TIOCMSET = 0x8004746d TIOCM_CAR = 0x40 TIOCM_CD = 0x40 TIOCM_CTS = 0x20 TIOCM_DSR = 0x100 TIOCM_DTR = 0x2 TIOCM_LE = 0x1 TIOCM_RI = 0x80 TIOCM_RNG = 0x80 TIOCM_RTS = 0x4 TIOCM_SR = 0x10 TIOCM_ST = 0x8 TIOCNOTTY = 0x20007471 TIOCNXCL = 0x2000740e TIOCOUTQ = 0x40047473 TIOCPKT = 0x80047470 TIOCPKT_DATA = 0x0 TIOCPKT_DOSTOP = 0x20 TIOCPKT_FLUSHREAD = 0x1 TIOCPKT_FLUSHWRITE = 0x2 TIOCPKT_IOCTL = 0x40 TIOCPKT_NOSTOP = 0x10 TIOCPKT_START = 0x8 TIOCPKT_STOP = 0x4 TIOCPTYGNAME = 0x40807453 TIOCPTYGRANT = 0x20007454 TIOCPTYUNLK = 0x20007452 TIOCREMOTE = 0x80047469 TIOCSBRK = 0x2000747b TIOCSCONS = 0x20007463 TIOCSCTTY = 0x20007461 TIOCSDRAINWAIT = 0x80047457 TIOCSDTR = 0x20007479 TIOCSETA = 0x802c7414 TIOCSETAF = 0x802c7416 TIOCSETAW = 0x802c7415 TIOCSETD = 0x8004741b TIOCSIG = 0x2000745f TIOCSPGRP = 0x80047476 TIOCSTART = 0x2000746e TIOCSTAT = 0x20007465 TIOCSTI = 0x80017472 TIOCSTOP = 0x2000746f TIOCSWINSZ = 0x80087467 TIOCTIMESTAMP = 0x40087459 TIOCUCNTL = 0x80047466 TOSTOP = 0x400000 VDISCARD = 0xf VDSUSP = 0xb VEOF = 0x0 VEOL = 0x1 VEOL2 = 0x2 VERASE = 0x3 VINTR = 0x8 VKILL = 0x5 VLNEXT = 0xe VMIN = 0x10 VM_LOADAVG = 0x2 VM_MACHFACTOR = 0x4 VM_MAXID = 0x6 VM_METER = 0x1 VM_SWAPUSAGE = 0x5 VQUIT = 0x9 VREPRINT = 0x6 VSTART = 0xc VSTATUS = 0x12 VSTOP = 0xd VSUSP = 0xa VT0 = 0x0 VT1 = 0x10000 VTDLY = 0x10000 VTIME = 0x11 VWERASE = 0x4 WCONTINUED = 0x10 WCOREFLAG = 0x80 WEXITED = 0x4 WNOHANG = 0x1 WNOWAIT = 0x20 WORDSIZE = 0x20 WSTOPPED = 0x8 WUNTRACED = 0x2 ) // Errors const ( E2BIG = syscall.Errno(0x7) EACCES = syscall.Errno(0xd) EADDRINUSE = syscall.Errno(0x30) EADDRNOTAVAIL = syscall.Errno(0x31) EAFNOSUPPORT = syscall.Errno(0x2f) EAGAIN = syscall.Errno(0x23) EALREADY = syscall.Errno(0x25) EAUTH = syscall.Errno(0x50) EBADARCH = syscall.Errno(0x56) EBADEXEC = syscall.Errno(0x55) EBADF = syscall.Errno(0x9) EBADMACHO = syscall.Errno(0x58) EBADMSG = syscall.Errno(0x5e) EBADRPC = syscall.Errno(0x48) EBUSY = syscall.Errno(0x10) ECANCELED = syscall.Errno(0x59) ECHILD = syscall.Errno(0xa) ECONNABORTED = syscall.Errno(0x35) ECONNREFUSED = syscall.Errno(0x3d) ECONNRESET = syscall.Errno(0x36) EDEADLK = syscall.Errno(0xb) EDESTADDRREQ = syscall.Errno(0x27) EDEVERR = syscall.Errno(0x53) EDOM = syscall.Errno(0x21) EDQUOT = syscall.Errno(0x45) EEXIST = syscall.Errno(0x11) EFAULT = syscall.Errno(0xe) EFBIG = syscall.Errno(0x1b) EFTYPE = syscall.Errno(0x4f) EHOSTDOWN = syscall.Errno(0x40) EHOSTUNREACH = syscall.Errno(0x41) EIDRM = syscall.Errno(0x5a) EILSEQ = syscall.Errno(0x5c) EINPROGRESS = syscall.Errno(0x24) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x38) EISDIR = syscall.Errno(0x15) ELAST = syscall.Errno(0x6a) ELOOP = syscall.Errno(0x3e) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) EMSGSIZE = syscall.Errno(0x28) EMULTIHOP = syscall.Errno(0x5f) ENAMETOOLONG = syscall.Errno(0x3f) ENEEDAUTH = syscall.Errno(0x51) ENETDOWN = syscall.Errno(0x32) ENETRESET = syscall.Errno(0x34) ENETUNREACH = syscall.Errno(0x33) ENFILE = syscall.Errno(0x17) ENOATTR = syscall.Errno(0x5d) ENOBUFS = syscall.Errno(0x37) ENODATA = syscall.Errno(0x60) ENODEV = syscall.Errno(0x13) ENOENT = syscall.Errno(0x2) ENOEXEC = syscall.Errno(0x8) ENOLCK = syscall.Errno(0x4d) ENOLINK = syscall.Errno(0x61) ENOMEM = syscall.Errno(0xc) ENOMSG = syscall.Errno(0x5b) ENOPOLICY = syscall.Errno(0x67) ENOPROTOOPT = syscall.Errno(0x2a) ENOSPC = syscall.Errno(0x1c) ENOSR = syscall.Errno(0x62) ENOSTR = syscall.Errno(0x63) ENOSYS = syscall.Errno(0x4e) ENOTBLK = syscall.Errno(0xf) ENOTCONN = syscall.Errno(0x39) ENOTDIR = syscall.Errno(0x14) ENOTEMPTY = syscall.Errno(0x42) ENOTRECOVERABLE = syscall.Errno(0x68) ENOTSOCK = syscall.Errno(0x26) ENOTSUP = syscall.Errno(0x2d) ENOTTY = syscall.Errno(0x19) ENXIO = syscall.Errno(0x6) EOPNOTSUPP = syscall.Errno(0x66) EOVERFLOW = syscall.Errno(0x54) EOWNERDEAD = syscall.Errno(0x69) EPERM = syscall.Errno(0x1) EPFNOSUPPORT = syscall.Errno(0x2e) EPIPE = syscall.Errno(0x20) EPROCLIM = syscall.Errno(0x43) EPROCUNAVAIL = syscall.Errno(0x4c) EPROGMISMATCH = syscall.Errno(0x4b) EPROGUNAVAIL = syscall.Errno(0x4a) EPROTO = syscall.Errno(0x64) EPROTONOSUPPORT = syscall.Errno(0x2b) EPROTOTYPE = syscall.Errno(0x29) EPWROFF = syscall.Errno(0x52) EQFULL = syscall.Errno(0x6a) ERANGE = syscall.Errno(0x22) EREMOTE = syscall.Errno(0x47) EROFS = syscall.Errno(0x1e) ERPCMISMATCH = syscall.Errno(0x49) ESHLIBVERS = syscall.Errno(0x57) ESHUTDOWN = syscall.Errno(0x3a) ESOCKTNOSUPPORT = syscall.Errno(0x2c) ESPIPE = syscall.Errno(0x1d) ESRCH = syscall.Errno(0x3) ESTALE = syscall.Errno(0x46) ETIME = syscall.Errno(0x65) ETIMEDOUT = syscall.Errno(0x3c) ETOOMANYREFS = syscall.Errno(0x3b) ETXTBSY = syscall.Errno(0x1a) EUSERS = syscall.Errno(0x44) EWOULDBLOCK = syscall.Errno(0x23) EXDEV = syscall.Errno(0x12) ) // Signals const ( SIGABRT = syscall.Signal(0x6) SIGALRM = syscall.Signal(0xe) SIGBUS = syscall.Signal(0xa) SIGCHLD = syscall.Signal(0x14) SIGCONT = syscall.Signal(0x13) SIGEMT = syscall.Signal(0x7) SIGFPE = syscall.Signal(0x8) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) SIGINFO = syscall.Signal(0x1d) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x17) SIGIOT = syscall.Signal(0x6) SIGKILL = syscall.Signal(0x9) SIGPIPE = syscall.Signal(0xd) SIGPROF = syscall.Signal(0x1b) SIGQUIT = syscall.Signal(0x3) SIGSEGV = syscall.Signal(0xb) SIGSTOP = syscall.Signal(0x11) SIGSYS = syscall.Signal(0xc) SIGTERM = syscall.Signal(0xf) SIGTRAP = syscall.Signal(0x5) SIGTSTP = syscall.Signal(0x12) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) SIGURG = syscall.Signal(0x10) SIGUSR1 = syscall.Signal(0x1e) SIGUSR2 = syscall.Signal(0x1f) SIGVTALRM = syscall.Signal(0x1a) SIGWINCH = syscall.Signal(0x1c) SIGXCPU = syscall.Signal(0x18) SIGXFSZ = syscall.Signal(0x19) ) // Error table var errors = [...]string{ 1: "operation not permitted", 2: "no such file or directory", 3: "no such process", 4: "interrupted system call", 5: "input/output error", 6: "device not configured", 7: "argument list too long", 8: "exec format error", 9: "bad file descriptor", 10: "no child processes", 11: "resource deadlock avoided", 12: "cannot allocate memory", 13: "permission denied", 14: "bad address", 15: "block device required", 16: "resource busy", 17: "file exists", 18: "cross-device link", 19: "operation not supported by device", 20: "not a directory", 21: "is a directory", 22: "invalid argument", 23: "too many open files in system", 24: "too many open files", 25: "inappropriate ioctl for device", 26: "text file busy", 27: "file too large", 28: "no space left on device", 29: "illegal seek", 30: "read-only file system", 31: "too many links", 32: "broken pipe", 33: "numerical argument out of domain", 34: "result too large", 35: "resource temporarily unavailable", 36: "operation now in progress", 37: "operation already in progress", 38: "socket operation on non-socket", 39: "destination address required", 40: "message too long", 41: "protocol wrong type for socket", 42: "protocol not available", 43: "protocol not supported", 44: "socket type not supported", 45: "operation not supported", 46: "protocol family not supported", 47: "address family not supported by protocol family", 48: "address already in use", 49: "can't assign requested address", 50: "network is down", 51: "network is unreachable", 52: "network dropped connection on reset", 53: "software caused connection abort", 54: "connection reset by peer", 55: "no buffer space available", 56: "socket is already connected", 57: "socket is not connected", 58: "can't send after socket shutdown", 59: "too many references: can't splice", 60: "operation timed out", 61: "connection refused", 62: "too many levels of symbolic links", 63: "file name too long", 64: "host is down", 65: "no route to host", 66: "directory not empty", 67: "too many processes", 68: "too many users", 69: "disc quota exceeded", 70: "stale NFS file handle", 71: "too many levels of remote in path", 72: "RPC struct is bad", 73: "RPC version wrong", 74: "RPC prog. not avail", 75: "program version wrong", 76: "bad procedure for program", 77: "no locks available", 78: "function not implemented", 79: "inappropriate file type or format", 80: "authentication error", 81: "need authenticator", 82: "device power is off", 83: "device error", 84: "value too large to be stored in data type", 85: "bad executable (or shared library)", 86: "bad CPU type in executable", 87: "shared library version mismatch", 88: "malformed Mach-o file", 89: "operation canceled", 90: "identifier removed", 91: "no message of desired type", 92: "illegal byte sequence", 93: "attribute not found", 94: "bad message", 95: "EMULTIHOP (Reserved)", 96: "no message available on STREAM", 97: "ENOLINK (Reserved)", 98: "no STREAM resources", 99: "not a STREAM", 100: "protocol error", 101: "STREAM ioctl timeout", 102: "operation not supported on socket", 103: "policy not found", 104: "state not recoverable", 105: "previous owner died", 106: "interface output queue is full", } // Signal table var signals = [...]string{ 1: "hangup", 2: "interrupt", 3: "quit", 4: "illegal instruction", 5: "trace/BPT trap", 6: "abort trap", 7: "EMT trap", 8: "floating point exception", 9: "killed", 10: "bus error", 11: "segmentation fault", 12: "bad system call", 13: "broken pipe", 14: "alarm clock", 15: "terminated", 16: "urgent I/O condition", 17: "suspended (signal)", 18: "suspended", 19: "continued", 20: "child exited", 21: "stopped (tty input)", 22: "stopped (tty output)", 23: "I/O possible", 24: "cputime limit exceeded", 25: "filesize limit exceeded", 26: "virtual timer expired", 27: "profiling timer expired", 28: "window size changes", 29: "information request", 30: "user defined signal 1", 31: "user defined signal 2", } ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go ================================================ // mkerrors.sh -m64 // Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,darwin // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- -m64 _const.go package unix import "syscall" const ( AF_APPLETALK = 0x10 AF_CCITT = 0xa AF_CHAOS = 0x5 AF_CNT = 0x15 AF_COIP = 0x14 AF_DATAKIT = 0x9 AF_DECnet = 0xc AF_DLI = 0xd AF_E164 = 0x1c AF_ECMA = 0x8 AF_HYLINK = 0xf AF_IEEE80211 = 0x25 AF_IMPLINK = 0x3 AF_INET = 0x2 AF_INET6 = 0x1e AF_IPX = 0x17 AF_ISDN = 0x1c AF_ISO = 0x7 AF_LAT = 0xe AF_LINK = 0x12 AF_LOCAL = 0x1 AF_MAX = 0x28 AF_NATM = 0x1f AF_NDRV = 0x1b AF_NETBIOS = 0x21 AF_NS = 0x6 AF_OSI = 0x7 AF_PPP = 0x22 AF_PUP = 0x4 AF_RESERVED_36 = 0x24 AF_ROUTE = 0x11 AF_SIP = 0x18 AF_SNA = 0xb AF_SYSTEM = 0x20 AF_UNIX = 0x1 AF_UNSPEC = 0x0 AF_UTUN = 0x26 ALTWERASE = 0x200 ATTR_BIT_MAP_COUNT = 0x5 ATTR_CMN_ACCESSMASK = 0x20000 ATTR_CMN_ACCTIME = 0x1000 ATTR_CMN_ADDEDTIME = 0x10000000 ATTR_CMN_BKUPTIME = 0x2000 ATTR_CMN_CHGTIME = 0x800 ATTR_CMN_CRTIME = 0x200 ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000 ATTR_CMN_DEVID = 0x2 ATTR_CMN_DOCUMENT_ID = 0x100000 ATTR_CMN_ERROR = 0x20000000 ATTR_CMN_EXTENDED_SECURITY = 0x400000 ATTR_CMN_FILEID = 0x2000000 ATTR_CMN_FLAGS = 0x40000 ATTR_CMN_FNDRINFO = 0x4000 ATTR_CMN_FSID = 0x4 ATTR_CMN_FULLPATH = 0x8000000 ATTR_CMN_GEN_COUNT = 0x80000 ATTR_CMN_GRPID = 0x10000 ATTR_CMN_GRPUUID = 0x1000000 ATTR_CMN_MODTIME = 0x400 ATTR_CMN_NAME = 0x1 ATTR_CMN_NAMEDATTRCOUNT = 0x80000 ATTR_CMN_NAMEDATTRLIST = 0x100000 ATTR_CMN_OBJID = 0x20 ATTR_CMN_OBJPERMANENTID = 0x40 ATTR_CMN_OBJTAG = 0x10 ATTR_CMN_OBJTYPE = 0x8 ATTR_CMN_OWNERID = 0x8000 ATTR_CMN_PARENTID = 0x4000000 ATTR_CMN_PAROBJID = 0x80 ATTR_CMN_RETURNED_ATTRS = 0x80000000 ATTR_CMN_SCRIPT = 0x100 ATTR_CMN_SETMASK = 0x41c7ff00 ATTR_CMN_USERACCESS = 0x200000 ATTR_CMN_UUID = 0x800000 ATTR_CMN_VALIDMASK = 0xffffffff ATTR_CMN_VOLSETMASK = 0x6700 ATTR_FILE_ALLOCSIZE = 0x4 ATTR_FILE_CLUMPSIZE = 0x10 ATTR_FILE_DATAALLOCSIZE = 0x400 ATTR_FILE_DATAEXTENTS = 0x800 ATTR_FILE_DATALENGTH = 0x200 ATTR_FILE_DEVTYPE = 0x20 ATTR_FILE_FILETYPE = 0x40 ATTR_FILE_FORKCOUNT = 0x80 ATTR_FILE_FORKLIST = 0x100 ATTR_FILE_IOBLOCKSIZE = 0x8 ATTR_FILE_LINKCOUNT = 0x1 ATTR_FILE_RSRCALLOCSIZE = 0x2000 ATTR_FILE_RSRCEXTENTS = 0x4000 ATTR_FILE_RSRCLENGTH = 0x1000 ATTR_FILE_SETMASK = 0x20 ATTR_FILE_TOTALSIZE = 0x2 ATTR_FILE_VALIDMASK = 0x37ff ATTR_VOL_ALLOCATIONCLUMP = 0x40 ATTR_VOL_ATTRIBUTES = 0x40000000 ATTR_VOL_CAPABILITIES = 0x20000 ATTR_VOL_DIRCOUNT = 0x400 ATTR_VOL_ENCODINGSUSED = 0x10000 ATTR_VOL_FILECOUNT = 0x200 ATTR_VOL_FSTYPE = 0x1 ATTR_VOL_INFO = 0x80000000 ATTR_VOL_IOBLOCKSIZE = 0x80 ATTR_VOL_MAXOBJCOUNT = 0x800 ATTR_VOL_MINALLOCATION = 0x20 ATTR_VOL_MOUNTEDDEVICE = 0x8000 ATTR_VOL_MOUNTFLAGS = 0x4000 ATTR_VOL_MOUNTPOINT = 0x1000 ATTR_VOL_NAME = 0x2000 ATTR_VOL_OBJCOUNT = 0x100 ATTR_VOL_QUOTA_SIZE = 0x10000000 ATTR_VOL_RESERVED_SIZE = 0x20000000 ATTR_VOL_SETMASK = 0x80002000 ATTR_VOL_SIGNATURE = 0x2 ATTR_VOL_SIZE = 0x4 ATTR_VOL_SPACEAVAIL = 0x10 ATTR_VOL_SPACEFREE = 0x8 ATTR_VOL_UUID = 0x40000 ATTR_VOL_VALIDMASK = 0xf007ffff B0 = 0x0 B110 = 0x6e B115200 = 0x1c200 B1200 = 0x4b0 B134 = 0x86 B14400 = 0x3840 B150 = 0x96 B1800 = 0x708 B19200 = 0x4b00 B200 = 0xc8 B230400 = 0x38400 B2400 = 0x960 B28800 = 0x7080 B300 = 0x12c B38400 = 0x9600 B4800 = 0x12c0 B50 = 0x32 B57600 = 0xe100 B600 = 0x258 B7200 = 0x1c20 B75 = 0x4b B76800 = 0x12c00 B9600 = 0x2580 BIOCFLUSH = 0x20004268 BIOCGBLEN = 0x40044266 BIOCGDLT = 0x4004426a BIOCGDLTLIST = 0xc00c4279 BIOCGETIF = 0x4020426b BIOCGHDRCMPLT = 0x40044274 BIOCGRSIG = 0x40044272 BIOCGRTIMEOUT = 0x4010426e BIOCGSEESENT = 0x40044276 BIOCGSTATS = 0x4008426f BIOCIMMEDIATE = 0x80044270 BIOCPROMISC = 0x20004269 BIOCSBLEN = 0xc0044266 BIOCSDLT = 0x80044278 BIOCSETF = 0x80104267 BIOCSETFNR = 0x8010427e BIOCSETIF = 0x8020426c BIOCSHDRCMPLT = 0x80044275 BIOCSRSIG = 0x80044273 BIOCSRTIMEOUT = 0x8010426d BIOCSSEESENT = 0x80044277 BIOCVERSION = 0x40044271 BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALIGNMENT = 0x4 BPF_ALU = 0x4 BPF_AND = 0x50 BPF_B = 0x10 BPF_DIV = 0x30 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 BPF_JA = 0x0 BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 BPF_JMP = 0x5 BPF_JSET = 0x40 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 BPF_LEN = 0x80 BPF_LSH = 0x60 BPF_MAJOR_VERSION = 0x1 BPF_MAXBUFSIZE = 0x80000 BPF_MAXINSNS = 0x200 BPF_MEM = 0x60 BPF_MEMWORDS = 0x10 BPF_MINBUFSIZE = 0x20 BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_OR = 0x40 BPF_RELEASE = 0x30bb6 BPF_RET = 0x6 BPF_RSH = 0x70 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 BPF_TAX = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 BRKINT = 0x2 BS0 = 0x0 BS1 = 0x8000 BSDLY = 0x8000 CFLUSH = 0xf CLOCAL = 0x8000 CLOCK_MONOTONIC = 0x6 CLOCK_MONOTONIC_RAW = 0x4 CLOCK_MONOTONIC_RAW_APPROX = 0x5 CLOCK_PROCESS_CPUTIME_ID = 0xc CLOCK_REALTIME = 0x0 CLOCK_THREAD_CPUTIME_ID = 0x10 CLOCK_UPTIME_RAW = 0x8 CLOCK_UPTIME_RAW_APPROX = 0x9 CR0 = 0x0 CR1 = 0x1000 CR2 = 0x2000 CR3 = 0x3000 CRDLY = 0x3000 CREAD = 0x800 CRTSCTS = 0x30000 CS5 = 0x0 CS6 = 0x100 CS7 = 0x200 CS8 = 0x300 CSIZE = 0x300 CSTART = 0x11 CSTATUS = 0x14 CSTOP = 0x13 CSTOPB = 0x400 CSUSP = 0x1a CTL_MAXNAME = 0xc CTL_NET = 0x4 DLT_A429 = 0xb8 DLT_A653_ICM = 0xb9 DLT_AIRONET_HEADER = 0x78 DLT_AOS = 0xde DLT_APPLE_IP_OVER_IEEE1394 = 0x8a DLT_ARCNET = 0x7 DLT_ARCNET_LINUX = 0x81 DLT_ATM_CLIP = 0x13 DLT_ATM_RFC1483 = 0xb DLT_AURORA = 0x7e DLT_AX25 = 0x3 DLT_AX25_KISS = 0xca DLT_BACNET_MS_TP = 0xa5 DLT_BLUETOOTH_HCI_H4 = 0xbb DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 DLT_CAN20B = 0xbe DLT_CAN_SOCKETCAN = 0xe3 DLT_CHAOS = 0x5 DLT_CHDLC = 0x68 DLT_CISCO_IOS = 0x76 DLT_C_HDLC = 0x68 DLT_C_HDLC_WITH_DIR = 0xcd DLT_DBUS = 0xe7 DLT_DECT = 0xdd DLT_DOCSIS = 0x8f DLT_DVB_CI = 0xeb DLT_ECONET = 0x73 DLT_EN10MB = 0x1 DLT_EN3MB = 0x2 DLT_ENC = 0x6d DLT_ERF = 0xc5 DLT_ERF_ETH = 0xaf DLT_ERF_POS = 0xb0 DLT_FC_2 = 0xe0 DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 DLT_FDDI = 0xa DLT_FLEXRAY = 0xd2 DLT_FRELAY = 0x6b DLT_FRELAY_WITH_DIR = 0xce DLT_GCOM_SERIAL = 0xad DLT_GCOM_T1E1 = 0xac DLT_GPF_F = 0xab DLT_GPF_T = 0xaa DLT_GPRS_LLC = 0xa9 DLT_GSMTAP_ABIS = 0xda DLT_GSMTAP_UM = 0xd9 DLT_HHDLC = 0x79 DLT_IBM_SN = 0x92 DLT_IBM_SP = 0x91 DLT_IEEE802 = 0x6 DLT_IEEE802_11 = 0x69 DLT_IEEE802_11_RADIO = 0x7f DLT_IEEE802_11_RADIO_AVS = 0xa3 DLT_IEEE802_15_4 = 0xc3 DLT_IEEE802_15_4_LINUX = 0xbf DLT_IEEE802_15_4_NOFCS = 0xe6 DLT_IEEE802_15_4_NONASK_PHY = 0xd7 DLT_IEEE802_16_MAC_CPS = 0xbc DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 DLT_IPFILTER = 0x74 DLT_IPMB = 0xc7 DLT_IPMB_LINUX = 0xd1 DLT_IPNET = 0xe2 DLT_IPOIB = 0xf2 DLT_IPV4 = 0xe4 DLT_IPV6 = 0xe5 DLT_IP_OVER_FC = 0x7a DLT_JUNIPER_ATM1 = 0x89 DLT_JUNIPER_ATM2 = 0x87 DLT_JUNIPER_ATM_CEMIC = 0xee DLT_JUNIPER_CHDLC = 0xb5 DLT_JUNIPER_ES = 0x84 DLT_JUNIPER_ETHER = 0xb2 DLT_JUNIPER_FIBRECHANNEL = 0xea DLT_JUNIPER_FRELAY = 0xb4 DLT_JUNIPER_GGSN = 0x85 DLT_JUNIPER_ISM = 0xc2 DLT_JUNIPER_MFR = 0x86 DLT_JUNIPER_MLFR = 0x83 DLT_JUNIPER_MLPPP = 0x82 DLT_JUNIPER_MONITOR = 0xa4 DLT_JUNIPER_PIC_PEER = 0xae DLT_JUNIPER_PPP = 0xb3 DLT_JUNIPER_PPPOE = 0xa7 DLT_JUNIPER_PPPOE_ATM = 0xa8 DLT_JUNIPER_SERVICES = 0x88 DLT_JUNIPER_SRX_E2E = 0xe9 DLT_JUNIPER_ST = 0xc8 DLT_JUNIPER_VP = 0xb7 DLT_JUNIPER_VS = 0xe8 DLT_LAPB_WITH_DIR = 0xcf DLT_LAPD = 0xcb DLT_LIN = 0xd4 DLT_LINUX_EVDEV = 0xd8 DLT_LINUX_IRDA = 0x90 DLT_LINUX_LAPD = 0xb1 DLT_LINUX_PPP_WITHDIRECTION = 0xa6 DLT_LINUX_SLL = 0x71 DLT_LOOP = 0x6c DLT_LTALK = 0x72 DLT_MATCHING_MAX = 0xf5 DLT_MATCHING_MIN = 0x68 DLT_MFR = 0xb6 DLT_MOST = 0xd3 DLT_MPEG_2_TS = 0xf3 DLT_MPLS = 0xdb DLT_MTP2 = 0x8c DLT_MTP2_WITH_PHDR = 0x8b DLT_MTP3 = 0x8d DLT_MUX27010 = 0xec DLT_NETANALYZER = 0xf0 DLT_NETANALYZER_TRANSPARENT = 0xf1 DLT_NFC_LLCP = 0xf5 DLT_NFLOG = 0xef DLT_NG40 = 0xf4 DLT_NULL = 0x0 DLT_PCI_EXP = 0x7d DLT_PFLOG = 0x75 DLT_PFSYNC = 0x12 DLT_PPI = 0xc0 DLT_PPP = 0x9 DLT_PPP_BSDOS = 0x10 DLT_PPP_ETHER = 0x33 DLT_PPP_PPPD = 0xa6 DLT_PPP_SERIAL = 0x32 DLT_PPP_WITH_DIR = 0xcc DLT_PPP_WITH_DIRECTION = 0xa6 DLT_PRISM_HEADER = 0x77 DLT_PRONET = 0x4 DLT_RAIF1 = 0xc6 DLT_RAW = 0xc DLT_RIO = 0x7c DLT_SCCP = 0x8e DLT_SITA = 0xc4 DLT_SLIP = 0x8 DLT_SLIP_BSDOS = 0xf DLT_STANAG_5066_D_PDU = 0xed DLT_SUNATM = 0x7b DLT_SYMANTEC_FIREWALL = 0x63 DLT_TZSP = 0x80 DLT_USB = 0xba DLT_USB_LINUX = 0xbd DLT_USB_LINUX_MMAPPED = 0xdc DLT_USER0 = 0x93 DLT_USER1 = 0x94 DLT_USER10 = 0x9d DLT_USER11 = 0x9e DLT_USER12 = 0x9f DLT_USER13 = 0xa0 DLT_USER14 = 0xa1 DLT_USER15 = 0xa2 DLT_USER2 = 0x95 DLT_USER3 = 0x96 DLT_USER4 = 0x97 DLT_USER5 = 0x98 DLT_USER6 = 0x99 DLT_USER7 = 0x9a DLT_USER8 = 0x9b DLT_USER9 = 0x9c DLT_WIHART = 0xdf DLT_X2E_SERIAL = 0xd5 DLT_X2E_XORAYA = 0xd6 DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 DT_FIFO = 0x1 DT_LNK = 0xa DT_REG = 0x8 DT_SOCK = 0xc DT_UNKNOWN = 0x0 DT_WHT = 0xe ECHO = 0x8 ECHOCTL = 0x40 ECHOE = 0x2 ECHOK = 0x4 ECHOKE = 0x1 ECHONL = 0x10 ECHOPRT = 0x20 EVFILT_AIO = -0x3 EVFILT_EXCEPT = -0xf EVFILT_FS = -0x9 EVFILT_MACHPORT = -0x8 EVFILT_PROC = -0x5 EVFILT_READ = -0x1 EVFILT_SIGNAL = -0x6 EVFILT_SYSCOUNT = 0xf EVFILT_THREADMARKER = 0xf EVFILT_TIMER = -0x7 EVFILT_USER = -0xa EVFILT_VM = -0xc EVFILT_VNODE = -0x4 EVFILT_WRITE = -0x2 EV_ADD = 0x1 EV_CLEAR = 0x20 EV_DELETE = 0x2 EV_DISABLE = 0x8 EV_DISPATCH = 0x80 EV_DISPATCH2 = 0x180 EV_ENABLE = 0x4 EV_EOF = 0x8000 EV_ERROR = 0x4000 EV_FLAG0 = 0x1000 EV_FLAG1 = 0x2000 EV_ONESHOT = 0x10 EV_OOBAND = 0x2000 EV_POLL = 0x1000 EV_RECEIPT = 0x40 EV_SYSFLAGS = 0xf000 EV_UDATA_SPECIFIC = 0x100 EV_VANISHED = 0x200 EXTA = 0x4b00 EXTB = 0x9600 EXTPROC = 0x800 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 FF1 = 0x4000 FFDLY = 0x4000 FLUSHO = 0x800000 FSOPT_ATTR_CMN_EXTENDED = 0x20 FSOPT_NOFOLLOW = 0x1 FSOPT_NOINMEMUPDATE = 0x2 FSOPT_PACK_INVAL_ATTRS = 0x8 FSOPT_REPORT_FULLSIZE = 0x4 F_ADDFILESIGS = 0x3d F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 F_ADDFILESIGS_RETURN = 0x61 F_ADDSIGS = 0x3b F_ALLOCATEALL = 0x4 F_ALLOCATECONTIG = 0x2 F_BARRIERFSYNC = 0x55 F_CHECK_LV = 0x62 F_CHKCLEAN = 0x29 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0x43 F_FINDSIGS = 0x4e F_FLUSH_DATA = 0x28 F_FREEZE_FS = 0x35 F_FULLFSYNC = 0x33 F_GETCODEDIR = 0x48 F_GETFD = 0x1 F_GETFL = 0x3 F_GETLK = 0x7 F_GETLKPID = 0x42 F_GETNOSIGPIPE = 0x4a F_GETOWN = 0x5 F_GETPATH = 0x32 F_GETPATH_MTMINFO = 0x47 F_GETPROTECTIONCLASS = 0x3f F_GETPROTECTIONLEVEL = 0x4d F_GLOBAL_NOCACHE = 0x37 F_LOG2PHYS = 0x31 F_LOG2PHYS_EXT = 0x41 F_NOCACHE = 0x30 F_NODIRECT = 0x3e F_OK = 0x0 F_PATHPKG_CHECK = 0x34 F_PEOFPOSMODE = 0x3 F_PREALLOCATE = 0x2a F_PUNCHHOLE = 0x63 F_RDADVISE = 0x2c F_RDAHEAD = 0x2d F_RDLCK = 0x1 F_SETBACKINGSTORE = 0x46 F_SETFD = 0x2 F_SETFL = 0x4 F_SETLK = 0x8 F_SETLKW = 0x9 F_SETLKWTIMEOUT = 0xa F_SETNOSIGPIPE = 0x49 F_SETOWN = 0x6 F_SETPROTECTIONCLASS = 0x40 F_SETSIZE = 0x2b F_SINGLE_WRITER = 0x4c F_THAW_FS = 0x36 F_TRANSCODEKEY = 0x4b F_TRIM_ACTIVE_FILE = 0x64 F_UNLCK = 0x2 F_VOLPOSMODE = 0x4 F_WRLCK = 0x3 HUPCL = 0x4000 ICANON = 0x100 ICMP6_FILTER = 0x12 ICRNL = 0x100 IEXTEN = 0x400 IFF_ALLMULTI = 0x200 IFF_ALTPHYS = 0x4000 IFF_BROADCAST = 0x2 IFF_DEBUG = 0x4 IFF_LINK0 = 0x1000 IFF_LINK1 = 0x2000 IFF_LINK2 = 0x4000 IFF_LOOPBACK = 0x8 IFF_MULTICAST = 0x8000 IFF_NOARP = 0x80 IFF_NOTRAILERS = 0x20 IFF_OACTIVE = 0x400 IFF_POINTOPOINT = 0x10 IFF_PROMISC = 0x100 IFF_RUNNING = 0x40 IFF_SIMPLEX = 0x800 IFF_UP = 0x1 IFNAMSIZ = 0x10 IFT_1822 = 0x2 IFT_AAL5 = 0x31 IFT_ARCNET = 0x23 IFT_ARCNETPLUS = 0x24 IFT_ATM = 0x25 IFT_BRIDGE = 0xd1 IFT_CARP = 0xf8 IFT_CELLULAR = 0xff IFT_CEPT = 0x13 IFT_DS3 = 0x1e IFT_ENC = 0xf4 IFT_EON = 0x19 IFT_ETHER = 0x6 IFT_FAITH = 0x38 IFT_FDDI = 0xf IFT_FRELAY = 0x20 IFT_FRELAYDCE = 0x2c IFT_GIF = 0x37 IFT_HDH1822 = 0x3 IFT_HIPPI = 0x2f IFT_HSSI = 0x2e IFT_HY = 0xe IFT_IEEE1394 = 0x90 IFT_IEEE8023ADLAG = 0x88 IFT_ISDNBASIC = 0x14 IFT_ISDNPRIMARY = 0x15 IFT_ISO88022LLC = 0x29 IFT_ISO88023 = 0x7 IFT_ISO88024 = 0x8 IFT_ISO88025 = 0x9 IFT_ISO88026 = 0xa IFT_L2VLAN = 0x87 IFT_LAPB = 0x10 IFT_LOCALTALK = 0x2a IFT_LOOP = 0x18 IFT_MIOX25 = 0x26 IFT_MODEM = 0x30 IFT_NSIP = 0x1b IFT_OTHER = 0x1 IFT_P10 = 0xc IFT_P80 = 0xd IFT_PARA = 0x22 IFT_PDP = 0xff IFT_PFLOG = 0xf5 IFT_PFSYNC = 0xf6 IFT_PKTAP = 0xfe IFT_PPP = 0x17 IFT_PROPMUX = 0x36 IFT_PROPVIRTUAL = 0x35 IFT_PTPSERIAL = 0x16 IFT_RS232 = 0x21 IFT_SDLC = 0x11 IFT_SIP = 0x1f IFT_SLIP = 0x1c IFT_SMDSDXI = 0x2b IFT_SMDSICIP = 0x34 IFT_SONET = 0x27 IFT_SONETPATH = 0x32 IFT_SONETVT = 0x33 IFT_STARLAN = 0xb IFT_STF = 0x39 IFT_T1 = 0x12 IFT_ULTRA = 0x1d IFT_V35 = 0x2d IFT_X25 = 0x5 IFT_X25DDN = 0x4 IFT_X25PLE = 0x28 IFT_XETHER = 0x1a IGNBRK = 0x1 IGNCR = 0x80 IGNPAR = 0x4 IMAXBEL = 0x2000 INLCR = 0x40 INPCK = 0x10 IN_CLASSA_HOST = 0xffffff IN_CLASSA_MAX = 0x80 IN_CLASSA_NET = 0xff000000 IN_CLASSA_NSHIFT = 0x18 IN_CLASSB_HOST = 0xffff IN_CLASSB_MAX = 0x10000 IN_CLASSB_NET = 0xffff0000 IN_CLASSB_NSHIFT = 0x10 IN_CLASSC_HOST = 0xff IN_CLASSC_NET = 0xffffff00 IN_CLASSC_NSHIFT = 0x8 IN_CLASSD_HOST = 0xfffffff IN_CLASSD_NET = 0xf0000000 IN_CLASSD_NSHIFT = 0x1c IN_LINKLOCALNETNUM = 0xa9fe0000 IN_LOOPBACKNET = 0x7f IPPROTO_3PC = 0x22 IPPROTO_ADFS = 0x44 IPPROTO_AH = 0x33 IPPROTO_AHIP = 0x3d IPPROTO_APES = 0x63 IPPROTO_ARGUS = 0xd IPPROTO_AX25 = 0x5d IPPROTO_BHA = 0x31 IPPROTO_BLT = 0x1e IPPROTO_BRSATMON = 0x4c IPPROTO_CFTP = 0x3e IPPROTO_CHAOS = 0x10 IPPROTO_CMTP = 0x26 IPPROTO_CPHB = 0x49 IPPROTO_CPNX = 0x48 IPPROTO_DDP = 0x25 IPPROTO_DGP = 0x56 IPPROTO_DIVERT = 0xfe IPPROTO_DONE = 0x101 IPPROTO_DSTOPTS = 0x3c IPPROTO_EGP = 0x8 IPPROTO_EMCON = 0xe IPPROTO_ENCAP = 0x62 IPPROTO_EON = 0x50 IPPROTO_ESP = 0x32 IPPROTO_ETHERIP = 0x61 IPPROTO_FRAGMENT = 0x2c IPPROTO_GGP = 0x3 IPPROTO_GMTP = 0x64 IPPROTO_GRE = 0x2f IPPROTO_HELLO = 0x3f IPPROTO_HMP = 0x14 IPPROTO_HOPOPTS = 0x0 IPPROTO_ICMP = 0x1 IPPROTO_ICMPV6 = 0x3a IPPROTO_IDP = 0x16 IPPROTO_IDPR = 0x23 IPPROTO_IDRP = 0x2d IPPROTO_IGMP = 0x2 IPPROTO_IGP = 0x55 IPPROTO_IGRP = 0x58 IPPROTO_IL = 0x28 IPPROTO_INLSP = 0x34 IPPROTO_INP = 0x20 IPPROTO_IP = 0x0 IPPROTO_IPCOMP = 0x6c IPPROTO_IPCV = 0x47 IPPROTO_IPEIP = 0x5e IPPROTO_IPIP = 0x4 IPPROTO_IPPC = 0x43 IPPROTO_IPV4 = 0x4 IPPROTO_IPV6 = 0x29 IPPROTO_IRTP = 0x1c IPPROTO_KRYPTOLAN = 0x41 IPPROTO_LARP = 0x5b IPPROTO_LEAF1 = 0x19 IPPROTO_LEAF2 = 0x1a IPPROTO_MAX = 0x100 IPPROTO_MAXID = 0x34 IPPROTO_MEAS = 0x13 IPPROTO_MHRP = 0x30 IPPROTO_MICP = 0x5f IPPROTO_MTP = 0x5c IPPROTO_MUX = 0x12 IPPROTO_ND = 0x4d IPPROTO_NHRP = 0x36 IPPROTO_NONE = 0x3b IPPROTO_NSP = 0x1f IPPROTO_NVPII = 0xb IPPROTO_OSPFIGP = 0x59 IPPROTO_PGM = 0x71 IPPROTO_PIGP = 0x9 IPPROTO_PIM = 0x67 IPPROTO_PRM = 0x15 IPPROTO_PUP = 0xc IPPROTO_PVP = 0x4b IPPROTO_RAW = 0xff IPPROTO_RCCMON = 0xa IPPROTO_RDP = 0x1b IPPROTO_ROUTING = 0x2b IPPROTO_RSVP = 0x2e IPPROTO_RVD = 0x42 IPPROTO_SATEXPAK = 0x40 IPPROTO_SATMON = 0x45 IPPROTO_SCCSP = 0x60 IPPROTO_SCTP = 0x84 IPPROTO_SDRP = 0x2a IPPROTO_SEP = 0x21 IPPROTO_SRPC = 0x5a IPPROTO_ST = 0x7 IPPROTO_SVMTP = 0x52 IPPROTO_SWIPE = 0x35 IPPROTO_TCF = 0x57 IPPROTO_TCP = 0x6 IPPROTO_TP = 0x1d IPPROTO_TPXX = 0x27 IPPROTO_TRUNK1 = 0x17 IPPROTO_TRUNK2 = 0x18 IPPROTO_TTP = 0x54 IPPROTO_UDP = 0x11 IPPROTO_VINES = 0x53 IPPROTO_VISA = 0x46 IPPROTO_VMTP = 0x51 IPPROTO_WBEXPAK = 0x4f IPPROTO_WBMON = 0x4e IPPROTO_WSN = 0x4a IPPROTO_XNET = 0xf IPPROTO_XTP = 0x24 IPV6_2292DSTOPTS = 0x17 IPV6_2292HOPLIMIT = 0x14 IPV6_2292HOPOPTS = 0x16 IPV6_2292NEXTHOP = 0x15 IPV6_2292PKTINFO = 0x13 IPV6_2292PKTOPTIONS = 0x19 IPV6_2292RTHDR = 0x18 IPV6_BINDV6ONLY = 0x1b IPV6_BOUND_IF = 0x7d IPV6_CHECKSUM = 0x1a IPV6_DEFAULT_MULTICAST_HOPS = 0x1 IPV6_DEFAULT_MULTICAST_LOOP = 0x1 IPV6_DEFHLIM = 0x40 IPV6_FAITH = 0x1d IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 IPV6_FLOW_ECN_MASK = 0x300 IPV6_FRAGTTL = 0x3c IPV6_FW_ADD = 0x1e IPV6_FW_DEL = 0x1f IPV6_FW_FLUSH = 0x20 IPV6_FW_GET = 0x22 IPV6_FW_ZERO = 0x21 IPV6_HLIMDEC = 0x1 IPV6_IPSEC_POLICY = 0x1c IPV6_JOIN_GROUP = 0xc IPV6_LEAVE_GROUP = 0xd IPV6_MAXHLIM = 0xff IPV6_MAXOPTHDR = 0x800 IPV6_MAXPACKET = 0xffff IPV6_MAX_GROUP_SRC_FILTER = 0x200 IPV6_MAX_MEMBERSHIPS = 0xfff IPV6_MAX_SOCK_SRC_FILTER = 0x80 IPV6_MIN_MEMBERSHIPS = 0x1f IPV6_MMTU = 0x500 IPV6_MULTICAST_HOPS = 0xa IPV6_MULTICAST_IF = 0x9 IPV6_MULTICAST_LOOP = 0xb IPV6_PORTRANGE = 0xe IPV6_PORTRANGE_DEFAULT = 0x0 IPV6_PORTRANGE_HIGH = 0x1 IPV6_PORTRANGE_LOW = 0x2 IPV6_RECVTCLASS = 0x23 IPV6_RTHDR_LOOSE = 0x0 IPV6_RTHDR_STRICT = 0x1 IPV6_RTHDR_TYPE_0 = 0x0 IPV6_SOCKOPT_RESERVED1 = 0x3 IPV6_TCLASS = 0x24 IPV6_UNICAST_HOPS = 0x4 IPV6_V6ONLY = 0x1b IPV6_VERSION = 0x60 IPV6_VERSION_MASK = 0xf0 IP_ADD_MEMBERSHIP = 0xc IP_ADD_SOURCE_MEMBERSHIP = 0x46 IP_BLOCK_SOURCE = 0x48 IP_BOUND_IF = 0x19 IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 IP_DROP_MEMBERSHIP = 0xd IP_DROP_SOURCE_MEMBERSHIP = 0x47 IP_DUMMYNET_CONFIGURE = 0x3c IP_DUMMYNET_DEL = 0x3d IP_DUMMYNET_FLUSH = 0x3e IP_DUMMYNET_GET = 0x40 IP_FAITH = 0x16 IP_FW_ADD = 0x28 IP_FW_DEL = 0x29 IP_FW_FLUSH = 0x2a IP_FW_GET = 0x2c IP_FW_RESETLOG = 0x2d IP_FW_ZERO = 0x2b IP_HDRINCL = 0x2 IP_IPSEC_POLICY = 0x15 IP_MAXPACKET = 0xffff IP_MAX_GROUP_SRC_FILTER = 0x200 IP_MAX_MEMBERSHIPS = 0xfff IP_MAX_SOCK_MUTE_FILTER = 0x80 IP_MAX_SOCK_SRC_FILTER = 0x80 IP_MF = 0x2000 IP_MIN_MEMBERSHIPS = 0x1f IP_MSFILTER = 0x4a IP_MSS = 0x240 IP_MULTICAST_IF = 0x9 IP_MULTICAST_IFINDEX = 0x42 IP_MULTICAST_LOOP = 0xb IP_MULTICAST_TTL = 0xa IP_MULTICAST_VIF = 0xe IP_NAT__XXX = 0x37 IP_OFFMASK = 0x1fff IP_OLD_FW_ADD = 0x32 IP_OLD_FW_DEL = 0x33 IP_OLD_FW_FLUSH = 0x34 IP_OLD_FW_GET = 0x36 IP_OLD_FW_RESETLOG = 0x38 IP_OLD_FW_ZERO = 0x35 IP_OPTIONS = 0x1 IP_PKTINFO = 0x1a IP_PORTRANGE = 0x13 IP_PORTRANGE_DEFAULT = 0x0 IP_PORTRANGE_HIGH = 0x1 IP_PORTRANGE_LOW = 0x2 IP_RECVDSTADDR = 0x7 IP_RECVIF = 0x14 IP_RECVOPTS = 0x5 IP_RECVPKTINFO = 0x1a IP_RECVRETOPTS = 0x6 IP_RECVTOS = 0x1b IP_RECVTTL = 0x18 IP_RETOPTS = 0x8 IP_RF = 0x8000 IP_RSVP_OFF = 0x10 IP_RSVP_ON = 0xf IP_RSVP_VIF_OFF = 0x12 IP_RSVP_VIF_ON = 0x11 IP_STRIPHDR = 0x17 IP_TOS = 0x3 IP_TRAFFIC_MGT_BACKGROUND = 0x41 IP_TTL = 0x4 IP_UNBLOCK_SOURCE = 0x49 ISIG = 0x80 ISTRIP = 0x20 IUTF8 = 0x4000 IXANY = 0x800 IXOFF = 0x400 IXON = 0x200 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 MADV_CAN_REUSE = 0x9 MADV_DONTNEED = 0x4 MADV_FREE = 0x5 MADV_FREE_REUSABLE = 0x7 MADV_FREE_REUSE = 0x8 MADV_NORMAL = 0x0 MADV_PAGEOUT = 0xa MADV_RANDOM = 0x1 MADV_SEQUENTIAL = 0x2 MADV_WILLNEED = 0x3 MADV_ZERO_WIRED_PAGES = 0x6 MAP_ANON = 0x1000 MAP_ANONYMOUS = 0x1000 MAP_COPY = 0x2 MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_HASSEMAPHORE = 0x200 MAP_JIT = 0x800 MAP_NOCACHE = 0x400 MAP_NOEXTEND = 0x100 MAP_NORESERVE = 0x40 MAP_PRIVATE = 0x2 MAP_RENAME = 0x20 MAP_RESERVED0080 = 0x80 MAP_RESILIENT_CODESIGN = 0x2000 MAP_RESILIENT_MEDIA = 0x4000 MAP_SHARED = 0x1 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MNT_ASYNC = 0x40 MNT_AUTOMOUNTED = 0x400000 MNT_CMDFLAGS = 0xf0000 MNT_CPROTECT = 0x80 MNT_DEFWRITE = 0x2000000 MNT_DONTBROWSE = 0x100000 MNT_DOVOLFS = 0x8000 MNT_DWAIT = 0x4 MNT_EXPORTED = 0x100 MNT_FORCE = 0x80000 MNT_IGNORE_OWNERSHIP = 0x200000 MNT_JOURNALED = 0x800000 MNT_LOCAL = 0x1000 MNT_MULTILABEL = 0x4000000 MNT_NOATIME = 0x10000000 MNT_NOBLOCK = 0x20000 MNT_NODEV = 0x10 MNT_NOEXEC = 0x4 MNT_NOSUID = 0x8 MNT_NOUSERXATTR = 0x1000000 MNT_NOWAIT = 0x2 MNT_QUARANTINE = 0x400 MNT_QUOTA = 0x2000 MNT_RDONLY = 0x1 MNT_RELOAD = 0x40000 MNT_ROOTFS = 0x4000 MNT_SYNCHRONOUS = 0x2 MNT_UNION = 0x20 MNT_UNKNOWNPERMISSIONS = 0x200000 MNT_UPDATE = 0x10000 MNT_VISFLAGMASK = 0x17f0f5ff MNT_WAIT = 0x1 MSG_CTRUNC = 0x20 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x80 MSG_EOF = 0x100 MSG_EOR = 0x8 MSG_FLUSH = 0x400 MSG_HAVEMORE = 0x2000 MSG_HOLD = 0x800 MSG_NEEDSA = 0x10000 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_RCVMORE = 0x4000 MSG_SEND = 0x1000 MSG_TRUNC = 0x10 MSG_WAITALL = 0x40 MSG_WAITSTREAM = 0x200 MS_ASYNC = 0x1 MS_DEACTIVATE = 0x8 MS_INVALIDATE = 0x2 MS_KILLPAGES = 0x4 MS_SYNC = 0x10 NAME_MAX = 0xff NET_RT_DUMP = 0x1 NET_RT_DUMP2 = 0x7 NET_RT_FLAGS = 0x2 NET_RT_IFLIST = 0x3 NET_RT_IFLIST2 = 0x6 NET_RT_MAXID = 0xa NET_RT_STAT = 0x4 NET_RT_TRASH = 0x5 NL0 = 0x0 NL1 = 0x100 NL2 = 0x200 NL3 = 0x300 NLDLY = 0x300 NOFLSH = 0x80000000 NOKERNINFO = 0x2000000 NOTE_ABSOLUTE = 0x8 NOTE_ATTRIB = 0x8 NOTE_BACKGROUND = 0x40 NOTE_CHILD = 0x4 NOTE_CRITICAL = 0x20 NOTE_DELETE = 0x1 NOTE_EXEC = 0x20000000 NOTE_EXIT = 0x80000000 NOTE_EXITSTATUS = 0x4000000 NOTE_EXIT_CSERROR = 0x40000 NOTE_EXIT_DECRYPTFAIL = 0x10000 NOTE_EXIT_DETAIL = 0x2000000 NOTE_EXIT_DETAIL_MASK = 0x70000 NOTE_EXIT_MEMORY = 0x20000 NOTE_EXIT_REPARENTED = 0x80000 NOTE_EXTEND = 0x4 NOTE_FFAND = 0x40000000 NOTE_FFCOPY = 0xc0000000 NOTE_FFCTRLMASK = 0xc0000000 NOTE_FFLAGSMASK = 0xffffff NOTE_FFNOP = 0x0 NOTE_FFOR = 0x80000000 NOTE_FORK = 0x40000000 NOTE_FUNLOCK = 0x100 NOTE_LEEWAY = 0x10 NOTE_LINK = 0x10 NOTE_LOWAT = 0x1 NOTE_MACH_CONTINUOUS_TIME = 0x80 NOTE_NONE = 0x80 NOTE_NSECONDS = 0x4 NOTE_OOB = 0x2 NOTE_PCTRLMASK = -0x100000 NOTE_PDATAMASK = 0xfffff NOTE_REAP = 0x10000000 NOTE_RENAME = 0x20 NOTE_REVOKE = 0x40 NOTE_SECONDS = 0x1 NOTE_SIGNAL = 0x8000000 NOTE_TRACK = 0x1 NOTE_TRACKERR = 0x2 NOTE_TRIGGER = 0x1000000 NOTE_USECONDS = 0x2 NOTE_VM_ERROR = 0x10000000 NOTE_VM_PRESSURE = 0x80000000 NOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000 NOTE_VM_PRESSURE_TERMINATE = 0x40000000 NOTE_WRITE = 0x2 OCRNL = 0x10 OFDEL = 0x20000 OFILL = 0x80 ONLCR = 0x2 ONLRET = 0x40 ONOCR = 0x20 ONOEOT = 0x8 OPOST = 0x1 OXTABS = 0x4 O_ACCMODE = 0x3 O_ALERT = 0x20000000 O_APPEND = 0x8 O_ASYNC = 0x40 O_CLOEXEC = 0x1000000 O_CREAT = 0x200 O_DIRECTORY = 0x100000 O_DP_GETRAWENCRYPTED = 0x1 O_DP_GETRAWUNENCRYPTED = 0x2 O_DSYNC = 0x400000 O_EVTONLY = 0x8000 O_EXCL = 0x800 O_EXLOCK = 0x20 O_FSYNC = 0x80 O_NDELAY = 0x4 O_NOCTTY = 0x20000 O_NOFOLLOW = 0x100 O_NONBLOCK = 0x4 O_POPUP = 0x80000000 O_RDONLY = 0x0 O_RDWR = 0x2 O_SHLOCK = 0x10 O_SYMLINK = 0x200000 O_SYNC = 0x80 O_TRUNC = 0x400 O_WRONLY = 0x1 PARENB = 0x1000 PARMRK = 0x8 PARODD = 0x2000 PENDIN = 0x20000000 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 PROT_EXEC = 0x4 PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 PT_ATTACH = 0xa PT_ATTACHEXC = 0xe PT_CONTINUE = 0x7 PT_DENY_ATTACH = 0x1f PT_DETACH = 0xb PT_FIRSTMACH = 0x20 PT_FORCEQUOTA = 0x1e PT_KILL = 0x8 PT_READ_D = 0x2 PT_READ_I = 0x1 PT_READ_U = 0x3 PT_SIGEXC = 0xc PT_STEP = 0x9 PT_THUPDATE = 0xd PT_TRACE_ME = 0x0 PT_WRITE_D = 0x5 PT_WRITE_I = 0x4 PT_WRITE_U = 0x6 RLIMIT_AS = 0x5 RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 RLIMIT_CPU_USAGE_MONITOR = 0x2 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 RLIMIT_MEMLOCK = 0x6 RLIMIT_NOFILE = 0x8 RLIMIT_NPROC = 0x7 RLIMIT_RSS = 0x5 RLIMIT_STACK = 0x3 RLIM_INFINITY = 0x7fffffffffffffff RTAX_AUTHOR = 0x6 RTAX_BRD = 0x7 RTAX_DST = 0x0 RTAX_GATEWAY = 0x1 RTAX_GENMASK = 0x3 RTAX_IFA = 0x5 RTAX_IFP = 0x4 RTAX_MAX = 0x8 RTAX_NETMASK = 0x2 RTA_AUTHOR = 0x40 RTA_BRD = 0x80 RTA_DST = 0x1 RTA_GATEWAY = 0x2 RTA_GENMASK = 0x8 RTA_IFA = 0x20 RTA_IFP = 0x10 RTA_NETMASK = 0x4 RTF_BLACKHOLE = 0x1000 RTF_BROADCAST = 0x400000 RTF_CLONING = 0x100 RTF_CONDEMNED = 0x2000000 RTF_DELCLONE = 0x80 RTF_DONE = 0x40 RTF_DYNAMIC = 0x10 RTF_GATEWAY = 0x2 RTF_HOST = 0x4 RTF_IFREF = 0x4000000 RTF_IFSCOPE = 0x1000000 RTF_LLINFO = 0x400 RTF_LOCAL = 0x200000 RTF_MODIFIED = 0x20 RTF_MULTICAST = 0x800000 RTF_NOIFREF = 0x2000 RTF_PINNED = 0x100000 RTF_PRCLONING = 0x10000 RTF_PROTO1 = 0x8000 RTF_PROTO2 = 0x4000 RTF_PROTO3 = 0x40000 RTF_PROXY = 0x8000000 RTF_REJECT = 0x8 RTF_ROUTER = 0x10000000 RTF_STATIC = 0x800 RTF_UP = 0x1 RTF_WASCLONED = 0x20000 RTF_XRESOLVE = 0x200 RTM_ADD = 0x1 RTM_CHANGE = 0x3 RTM_DELADDR = 0xd RTM_DELETE = 0x2 RTM_DELMADDR = 0x10 RTM_GET = 0x4 RTM_GET2 = 0x14 RTM_IFINFO = 0xe RTM_IFINFO2 = 0x12 RTM_LOCK = 0x8 RTM_LOSING = 0x5 RTM_MISS = 0x7 RTM_NEWADDR = 0xc RTM_NEWMADDR = 0xf RTM_NEWMADDR2 = 0x13 RTM_OLDADD = 0x9 RTM_OLDDEL = 0xa RTM_REDIRECT = 0x6 RTM_RESOLVE = 0xb RTM_RTTUNIT = 0xf4240 RTM_VERSION = 0x5 RTV_EXPIRE = 0x4 RTV_HOPCOUNT = 0x2 RTV_MTU = 0x1 RTV_RPIPE = 0x8 RTV_RTT = 0x40 RTV_RTTVAR = 0x80 RTV_SPIPE = 0x10 RTV_SSTHRESH = 0x20 RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 SCM_CREDS = 0x3 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x2 SCM_TIMESTAMP_MONOTONIC = 0x4 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 SIOCADDMULTI = 0x80206931 SIOCAIFADDR = 0x8040691a SIOCARPIPLL = 0xc0206928 SIOCATMARK = 0x40047307 SIOCAUTOADDR = 0xc0206926 SIOCAUTONETMASK = 0x80206927 SIOCDELMULTI = 0x80206932 SIOCDIFADDR = 0x80206919 SIOCDIFPHYADDR = 0x80206941 SIOCGDRVSPEC = 0xc028697b SIOCGETVLAN = 0xc020697f SIOCGHIWAT = 0x40047301 SIOCGIFADDR = 0xc0206921 SIOCGIFALTMTU = 0xc0206948 SIOCGIFASYNCMAP = 0xc020697c SIOCGIFBOND = 0xc0206947 SIOCGIFBRDADDR = 0xc0206923 SIOCGIFCAP = 0xc020695b SIOCGIFCONF = 0xc00c6924 SIOCGIFDEVMTU = 0xc0206944 SIOCGIFDSTADDR = 0xc0206922 SIOCGIFFLAGS = 0xc0206911 SIOCGIFGENERIC = 0xc020693a SIOCGIFKPI = 0xc0206987 SIOCGIFMAC = 0xc0206982 SIOCGIFMEDIA = 0xc02c6938 SIOCGIFMETRIC = 0xc0206917 SIOCGIFMTU = 0xc0206933 SIOCGIFNETMASK = 0xc0206925 SIOCGIFPDSTADDR = 0xc0206940 SIOCGIFPHYS = 0xc0206935 SIOCGIFPSRCADDR = 0xc020693f SIOCGIFSTATUS = 0xc331693d SIOCGIFVLAN = 0xc020697f SIOCGIFWAKEFLAGS = 0xc0206988 SIOCGLOWAT = 0x40047303 SIOCGPGRP = 0x40047309 SIOCIFCREATE = 0xc0206978 SIOCIFCREATE2 = 0xc020697a SIOCIFDESTROY = 0x80206979 SIOCIFGCLONERS = 0xc0106981 SIOCRSLVMULTI = 0xc010693b SIOCSDRVSPEC = 0x8028697b SIOCSETVLAN = 0x8020697e SIOCSHIWAT = 0x80047300 SIOCSIFADDR = 0x8020690c SIOCSIFALTMTU = 0x80206945 SIOCSIFASYNCMAP = 0x8020697d SIOCSIFBOND = 0x80206946 SIOCSIFBRDADDR = 0x80206913 SIOCSIFCAP = 0x8020695a SIOCSIFDSTADDR = 0x8020690e SIOCSIFFLAGS = 0x80206910 SIOCSIFGENERIC = 0x80206939 SIOCSIFKPI = 0x80206986 SIOCSIFLLADDR = 0x8020693c SIOCSIFMAC = 0x80206983 SIOCSIFMEDIA = 0xc0206937 SIOCSIFMETRIC = 0x80206918 SIOCSIFMTU = 0x80206934 SIOCSIFNETMASK = 0x80206916 SIOCSIFPHYADDR = 0x8040693e SIOCSIFPHYS = 0x80206936 SIOCSIFVLAN = 0x8020697e SIOCSLOWAT = 0x80047302 SIOCSPGRP = 0x80047308 SOCK_DGRAM = 0x2 SOCK_MAXADDRLEN = 0xff SOCK_RAW = 0x3 SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x1 SOL_SOCKET = 0xffff SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x2 SO_BROADCAST = 0x20 SO_DEBUG = 0x1 SO_DONTROUTE = 0x10 SO_DONTTRUNC = 0x2000 SO_ERROR = 0x1007 SO_KEEPALIVE = 0x8 SO_LABEL = 0x1010 SO_LINGER = 0x80 SO_LINGER_SEC = 0x1080 SO_NETSVC_MARKING_LEVEL = 0x1119 SO_NET_SERVICE_TYPE = 0x1116 SO_NKE = 0x1021 SO_NOADDRERR = 0x1023 SO_NOSIGPIPE = 0x1022 SO_NOTIFYCONFLICT = 0x1026 SO_NP_EXTENSIONS = 0x1083 SO_NREAD = 0x1020 SO_NUMRCVPKT = 0x1112 SO_NWRITE = 0x1024 SO_OOBINLINE = 0x100 SO_PEERLABEL = 0x1011 SO_RANDOMPORT = 0x1082 SO_RCVBUF = 0x1002 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x1006 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_REUSESHAREUID = 0x1025 SO_SNDBUF = 0x1001 SO_SNDLOWAT = 0x1003 SO_SNDTIMEO = 0x1005 SO_TIMESTAMP = 0x400 SO_TIMESTAMP_MONOTONIC = 0x800 SO_TYPE = 0x1008 SO_UPCALLCLOSEWAIT = 0x1027 SO_USELOOPBACK = 0x40 SO_WANTMORE = 0x4000 SO_WANTOOBFLAG = 0x8000 S_IEXEC = 0x40 S_IFBLK = 0x6000 S_IFCHR = 0x2000 S_IFDIR = 0x4000 S_IFIFO = 0x1000 S_IFLNK = 0xa000 S_IFMT = 0xf000 S_IFREG = 0x8000 S_IFSOCK = 0xc000 S_IFWHT = 0xe000 S_IREAD = 0x100 S_IRGRP = 0x20 S_IROTH = 0x4 S_IRUSR = 0x100 S_IRWXG = 0x38 S_IRWXO = 0x7 S_IRWXU = 0x1c0 S_ISGID = 0x400 S_ISTXT = 0x200 S_ISUID = 0x800 S_ISVTX = 0x200 S_IWGRP = 0x10 S_IWOTH = 0x2 S_IWRITE = 0x80 S_IWUSR = 0x80 S_IXGRP = 0x8 S_IXOTH = 0x1 S_IXUSR = 0x40 TAB0 = 0x0 TAB1 = 0x400 TAB2 = 0x800 TAB3 = 0x4 TABDLY = 0xc04 TCIFLUSH = 0x1 TCIOFF = 0x3 TCIOFLUSH = 0x3 TCION = 0x4 TCOFLUSH = 0x2 TCOOFF = 0x1 TCOON = 0x2 TCP_CONNECTIONTIMEOUT = 0x20 TCP_CONNECTION_INFO = 0x106 TCP_ENABLE_ECN = 0x104 TCP_FASTOPEN = 0x105 TCP_KEEPALIVE = 0x10 TCP_KEEPCNT = 0x102 TCP_KEEPINTVL = 0x101 TCP_MAXHLEN = 0x3c TCP_MAXOLEN = 0x28 TCP_MAXSEG = 0x2 TCP_MAXWIN = 0xffff TCP_MAX_SACK = 0x4 TCP_MAX_WINSHIFT = 0xe TCP_MINMSS = 0xd8 TCP_MSS = 0x200 TCP_NODELAY = 0x1 TCP_NOOPT = 0x8 TCP_NOPUSH = 0x4 TCP_NOTSENT_LOWAT = 0x201 TCP_RXT_CONNDROPTIME = 0x80 TCP_RXT_FINDROP = 0x100 TCP_SENDMOREACKS = 0x103 TCSAFLUSH = 0x2 TIOCCBRK = 0x2000747a TIOCCDTR = 0x20007478 TIOCCONS = 0x80047462 TIOCDCDTIMESTAMP = 0x40107458 TIOCDRAIN = 0x2000745e TIOCDSIMICROCODE = 0x20007455 TIOCEXCL = 0x2000740d TIOCEXT = 0x80047460 TIOCFLUSH = 0x80047410 TIOCGDRAINWAIT = 0x40047456 TIOCGETA = 0x40487413 TIOCGETD = 0x4004741a TIOCGPGRP = 0x40047477 TIOCGWINSZ = 0x40087468 TIOCIXOFF = 0x20007480 TIOCIXON = 0x20007481 TIOCMBIC = 0x8004746b TIOCMBIS = 0x8004746c TIOCMGDTRWAIT = 0x4004745a TIOCMGET = 0x4004746a TIOCMODG = 0x40047403 TIOCMODS = 0x80047404 TIOCMSDTRWAIT = 0x8004745b TIOCMSET = 0x8004746d TIOCM_CAR = 0x40 TIOCM_CD = 0x40 TIOCM_CTS = 0x20 TIOCM_DSR = 0x100 TIOCM_DTR = 0x2 TIOCM_LE = 0x1 TIOCM_RI = 0x80 TIOCM_RNG = 0x80 TIOCM_RTS = 0x4 TIOCM_SR = 0x10 TIOCM_ST = 0x8 TIOCNOTTY = 0x20007471 TIOCNXCL = 0x2000740e TIOCOUTQ = 0x40047473 TIOCPKT = 0x80047470 TIOCPKT_DATA = 0x0 TIOCPKT_DOSTOP = 0x20 TIOCPKT_FLUSHREAD = 0x1 TIOCPKT_FLUSHWRITE = 0x2 TIOCPKT_IOCTL = 0x40 TIOCPKT_NOSTOP = 0x10 TIOCPKT_START = 0x8 TIOCPKT_STOP = 0x4 TIOCPTYGNAME = 0x40807453 TIOCPTYGRANT = 0x20007454 TIOCPTYUNLK = 0x20007452 TIOCREMOTE = 0x80047469 TIOCSBRK = 0x2000747b TIOCSCONS = 0x20007463 TIOCSCTTY = 0x20007461 TIOCSDRAINWAIT = 0x80047457 TIOCSDTR = 0x20007479 TIOCSETA = 0x80487414 TIOCSETAF = 0x80487416 TIOCSETAW = 0x80487415 TIOCSETD = 0x8004741b TIOCSIG = 0x2000745f TIOCSPGRP = 0x80047476 TIOCSTART = 0x2000746e TIOCSTAT = 0x20007465 TIOCSTI = 0x80017472 TIOCSTOP = 0x2000746f TIOCSWINSZ = 0x80087467 TIOCTIMESTAMP = 0x40107459 TIOCUCNTL = 0x80047466 TOSTOP = 0x400000 VDISCARD = 0xf VDSUSP = 0xb VEOF = 0x0 VEOL = 0x1 VEOL2 = 0x2 VERASE = 0x3 VINTR = 0x8 VKILL = 0x5 VLNEXT = 0xe VMIN = 0x10 VM_LOADAVG = 0x2 VM_MACHFACTOR = 0x4 VM_MAXID = 0x6 VM_METER = 0x1 VM_SWAPUSAGE = 0x5 VQUIT = 0x9 VREPRINT = 0x6 VSTART = 0xc VSTATUS = 0x12 VSTOP = 0xd VSUSP = 0xa VT0 = 0x0 VT1 = 0x10000 VTDLY = 0x10000 VTIME = 0x11 VWERASE = 0x4 WCONTINUED = 0x10 WCOREFLAG = 0x80 WEXITED = 0x4 WNOHANG = 0x1 WNOWAIT = 0x20 WORDSIZE = 0x40 WSTOPPED = 0x8 WUNTRACED = 0x2 ) // Errors const ( E2BIG = syscall.Errno(0x7) EACCES = syscall.Errno(0xd) EADDRINUSE = syscall.Errno(0x30) EADDRNOTAVAIL = syscall.Errno(0x31) EAFNOSUPPORT = syscall.Errno(0x2f) EAGAIN = syscall.Errno(0x23) EALREADY = syscall.Errno(0x25) EAUTH = syscall.Errno(0x50) EBADARCH = syscall.Errno(0x56) EBADEXEC = syscall.Errno(0x55) EBADF = syscall.Errno(0x9) EBADMACHO = syscall.Errno(0x58) EBADMSG = syscall.Errno(0x5e) EBADRPC = syscall.Errno(0x48) EBUSY = syscall.Errno(0x10) ECANCELED = syscall.Errno(0x59) ECHILD = syscall.Errno(0xa) ECONNABORTED = syscall.Errno(0x35) ECONNREFUSED = syscall.Errno(0x3d) ECONNRESET = syscall.Errno(0x36) EDEADLK = syscall.Errno(0xb) EDESTADDRREQ = syscall.Errno(0x27) EDEVERR = syscall.Errno(0x53) EDOM = syscall.Errno(0x21) EDQUOT = syscall.Errno(0x45) EEXIST = syscall.Errno(0x11) EFAULT = syscall.Errno(0xe) EFBIG = syscall.Errno(0x1b) EFTYPE = syscall.Errno(0x4f) EHOSTDOWN = syscall.Errno(0x40) EHOSTUNREACH = syscall.Errno(0x41) EIDRM = syscall.Errno(0x5a) EILSEQ = syscall.Errno(0x5c) EINPROGRESS = syscall.Errno(0x24) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x38) EISDIR = syscall.Errno(0x15) ELAST = syscall.Errno(0x6a) ELOOP = syscall.Errno(0x3e) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) EMSGSIZE = syscall.Errno(0x28) EMULTIHOP = syscall.Errno(0x5f) ENAMETOOLONG = syscall.Errno(0x3f) ENEEDAUTH = syscall.Errno(0x51) ENETDOWN = syscall.Errno(0x32) ENETRESET = syscall.Errno(0x34) ENETUNREACH = syscall.Errno(0x33) ENFILE = syscall.Errno(0x17) ENOATTR = syscall.Errno(0x5d) ENOBUFS = syscall.Errno(0x37) ENODATA = syscall.Errno(0x60) ENODEV = syscall.Errno(0x13) ENOENT = syscall.Errno(0x2) ENOEXEC = syscall.Errno(0x8) ENOLCK = syscall.Errno(0x4d) ENOLINK = syscall.Errno(0x61) ENOMEM = syscall.Errno(0xc) ENOMSG = syscall.Errno(0x5b) ENOPOLICY = syscall.Errno(0x67) ENOPROTOOPT = syscall.Errno(0x2a) ENOSPC = syscall.Errno(0x1c) ENOSR = syscall.Errno(0x62) ENOSTR = syscall.Errno(0x63) ENOSYS = syscall.Errno(0x4e) ENOTBLK = syscall.Errno(0xf) ENOTCONN = syscall.Errno(0x39) ENOTDIR = syscall.Errno(0x14) ENOTEMPTY = syscall.Errno(0x42) ENOTRECOVERABLE = syscall.Errno(0x68) ENOTSOCK = syscall.Errno(0x26) ENOTSUP = syscall.Errno(0x2d) ENOTTY = syscall.Errno(0x19) ENXIO = syscall.Errno(0x6) EOPNOTSUPP = syscall.Errno(0x66) EOVERFLOW = syscall.Errno(0x54) EOWNERDEAD = syscall.Errno(0x69) EPERM = syscall.Errno(0x1) EPFNOSUPPORT = syscall.Errno(0x2e) EPIPE = syscall.Errno(0x20) EPROCLIM = syscall.Errno(0x43) EPROCUNAVAIL = syscall.Errno(0x4c) EPROGMISMATCH = syscall.Errno(0x4b) EPROGUNAVAIL = syscall.Errno(0x4a) EPROTO = syscall.Errno(0x64) EPROTONOSUPPORT = syscall.Errno(0x2b) EPROTOTYPE = syscall.Errno(0x29) EPWROFF = syscall.Errno(0x52) EQFULL = syscall.Errno(0x6a) ERANGE = syscall.Errno(0x22) EREMOTE = syscall.Errno(0x47) EROFS = syscall.Errno(0x1e) ERPCMISMATCH = syscall.Errno(0x49) ESHLIBVERS = syscall.Errno(0x57) ESHUTDOWN = syscall.Errno(0x3a) ESOCKTNOSUPPORT = syscall.Errno(0x2c) ESPIPE = syscall.Errno(0x1d) ESRCH = syscall.Errno(0x3) ESTALE = syscall.Errno(0x46) ETIME = syscall.Errno(0x65) ETIMEDOUT = syscall.Errno(0x3c) ETOOMANYREFS = syscall.Errno(0x3b) ETXTBSY = syscall.Errno(0x1a) EUSERS = syscall.Errno(0x44) EWOULDBLOCK = syscall.Errno(0x23) EXDEV = syscall.Errno(0x12) ) // Signals const ( SIGABRT = syscall.Signal(0x6) SIGALRM = syscall.Signal(0xe) SIGBUS = syscall.Signal(0xa) SIGCHLD = syscall.Signal(0x14) SIGCONT = syscall.Signal(0x13) SIGEMT = syscall.Signal(0x7) SIGFPE = syscall.Signal(0x8) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) SIGINFO = syscall.Signal(0x1d) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x17) SIGIOT = syscall.Signal(0x6) SIGKILL = syscall.Signal(0x9) SIGPIPE = syscall.Signal(0xd) SIGPROF = syscall.Signal(0x1b) SIGQUIT = syscall.Signal(0x3) SIGSEGV = syscall.Signal(0xb) SIGSTOP = syscall.Signal(0x11) SIGSYS = syscall.Signal(0xc) SIGTERM = syscall.Signal(0xf) SIGTRAP = syscall.Signal(0x5) SIGTSTP = syscall.Signal(0x12) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) SIGURG = syscall.Signal(0x10) SIGUSR1 = syscall.Signal(0x1e) SIGUSR2 = syscall.Signal(0x1f) SIGVTALRM = syscall.Signal(0x1a) SIGWINCH = syscall.Signal(0x1c) SIGXCPU = syscall.Signal(0x18) SIGXFSZ = syscall.Signal(0x19) ) // Error table var errors = [...]string{ 1: "operation not permitted", 2: "no such file or directory", 3: "no such process", 4: "interrupted system call", 5: "input/output error", 6: "device not configured", 7: "argument list too long", 8: "exec format error", 9: "bad file descriptor", 10: "no child processes", 11: "resource deadlock avoided", 12: "cannot allocate memory", 13: "permission denied", 14: "bad address", 15: "block device required", 16: "resource busy", 17: "file exists", 18: "cross-device link", 19: "operation not supported by device", 20: "not a directory", 21: "is a directory", 22: "invalid argument", 23: "too many open files in system", 24: "too many open files", 25: "inappropriate ioctl for device", 26: "text file busy", 27: "file too large", 28: "no space left on device", 29: "illegal seek", 30: "read-only file system", 31: "too many links", 32: "broken pipe", 33: "numerical argument out of domain", 34: "result too large", 35: "resource temporarily unavailable", 36: "operation now in progress", 37: "operation already in progress", 38: "socket operation on non-socket", 39: "destination address required", 40: "message too long", 41: "protocol wrong type for socket", 42: "protocol not available", 43: "protocol not supported", 44: "socket type not supported", 45: "operation not supported", 46: "protocol family not supported", 47: "address family not supported by protocol family", 48: "address already in use", 49: "can't assign requested address", 50: "network is down", 51: "network is unreachable", 52: "network dropped connection on reset", 53: "software caused connection abort", 54: "connection reset by peer", 55: "no buffer space available", 56: "socket is already connected", 57: "socket is not connected", 58: "can't send after socket shutdown", 59: "too many references: can't splice", 60: "operation timed out", 61: "connection refused", 62: "too many levels of symbolic links", 63: "file name too long", 64: "host is down", 65: "no route to host", 66: "directory not empty", 67: "too many processes", 68: "too many users", 69: "disc quota exceeded", 70: "stale NFS file handle", 71: "too many levels of remote in path", 72: "RPC struct is bad", 73: "RPC version wrong", 74: "RPC prog. not avail", 75: "program version wrong", 76: "bad procedure for program", 77: "no locks available", 78: "function not implemented", 79: "inappropriate file type or format", 80: "authentication error", 81: "need authenticator", 82: "device power is off", 83: "device error", 84: "value too large to be stored in data type", 85: "bad executable (or shared library)", 86: "bad CPU type in executable", 87: "shared library version mismatch", 88: "malformed Mach-o file", 89: "operation canceled", 90: "identifier removed", 91: "no message of desired type", 92: "illegal byte sequence", 93: "attribute not found", 94: "bad message", 95: "EMULTIHOP (Reserved)", 96: "no message available on STREAM", 97: "ENOLINK (Reserved)", 98: "no STREAM resources", 99: "not a STREAM", 100: "protocol error", 101: "STREAM ioctl timeout", 102: "operation not supported on socket", 103: "policy not found", 104: "state not recoverable", 105: "previous owner died", 106: "interface output queue is full", } // Signal table var signals = [...]string{ 1: "hangup", 2: "interrupt", 3: "quit", 4: "illegal instruction", 5: "trace/BPT trap", 6: "abort trap", 7: "EMT trap", 8: "floating point exception", 9: "killed", 10: "bus error", 11: "segmentation fault", 12: "bad system call", 13: "broken pipe", 14: "alarm clock", 15: "terminated", 16: "urgent I/O condition", 17: "suspended (signal)", 18: "suspended", 19: "continued", 20: "child exited", 21: "stopped (tty input)", 22: "stopped (tty output)", 23: "I/O possible", 24: "cputime limit exceeded", 25: "filesize limit exceeded", 26: "virtual timer expired", 27: "profiling timer expired", 28: "window size changes", 29: "information request", 30: "user defined signal 1", 31: "user defined signal 2", } ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go ================================================ // mkerrors.sh // Code generated by the command above; see README.md. DO NOT EDIT. // +build arm,darwin // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- _const.go package unix import "syscall" const ( AF_APPLETALK = 0x10 AF_CCITT = 0xa AF_CHAOS = 0x5 AF_CNT = 0x15 AF_COIP = 0x14 AF_DATAKIT = 0x9 AF_DECnet = 0xc AF_DLI = 0xd AF_E164 = 0x1c AF_ECMA = 0x8 AF_HYLINK = 0xf AF_IEEE80211 = 0x25 AF_IMPLINK = 0x3 AF_INET = 0x2 AF_INET6 = 0x1e AF_IPX = 0x17 AF_ISDN = 0x1c AF_ISO = 0x7 AF_LAT = 0xe AF_LINK = 0x12 AF_LOCAL = 0x1 AF_MAX = 0x28 AF_NATM = 0x1f AF_NDRV = 0x1b AF_NETBIOS = 0x21 AF_NS = 0x6 AF_OSI = 0x7 AF_PPP = 0x22 AF_PUP = 0x4 AF_RESERVED_36 = 0x24 AF_ROUTE = 0x11 AF_SIP = 0x18 AF_SNA = 0xb AF_SYSTEM = 0x20 AF_UNIX = 0x1 AF_UNSPEC = 0x0 AF_UTUN = 0x26 ALTWERASE = 0x200 ATTR_BIT_MAP_COUNT = 0x5 ATTR_CMN_ACCESSMASK = 0x20000 ATTR_CMN_ACCTIME = 0x1000 ATTR_CMN_ADDEDTIME = 0x10000000 ATTR_CMN_BKUPTIME = 0x2000 ATTR_CMN_CHGTIME = 0x800 ATTR_CMN_CRTIME = 0x200 ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000 ATTR_CMN_DEVID = 0x2 ATTR_CMN_DOCUMENT_ID = 0x100000 ATTR_CMN_ERROR = 0x20000000 ATTR_CMN_EXTENDED_SECURITY = 0x400000 ATTR_CMN_FILEID = 0x2000000 ATTR_CMN_FLAGS = 0x40000 ATTR_CMN_FNDRINFO = 0x4000 ATTR_CMN_FSID = 0x4 ATTR_CMN_FULLPATH = 0x8000000 ATTR_CMN_GEN_COUNT = 0x80000 ATTR_CMN_GRPID = 0x10000 ATTR_CMN_GRPUUID = 0x1000000 ATTR_CMN_MODTIME = 0x400 ATTR_CMN_NAME = 0x1 ATTR_CMN_NAMEDATTRCOUNT = 0x80000 ATTR_CMN_NAMEDATTRLIST = 0x100000 ATTR_CMN_OBJID = 0x20 ATTR_CMN_OBJPERMANENTID = 0x40 ATTR_CMN_OBJTAG = 0x10 ATTR_CMN_OBJTYPE = 0x8 ATTR_CMN_OWNERID = 0x8000 ATTR_CMN_PARENTID = 0x4000000 ATTR_CMN_PAROBJID = 0x80 ATTR_CMN_RETURNED_ATTRS = 0x80000000 ATTR_CMN_SCRIPT = 0x100 ATTR_CMN_SETMASK = 0x41c7ff00 ATTR_CMN_USERACCESS = 0x200000 ATTR_CMN_UUID = 0x800000 ATTR_CMN_VALIDMASK = 0xffffffff ATTR_CMN_VOLSETMASK = 0x6700 ATTR_FILE_ALLOCSIZE = 0x4 ATTR_FILE_CLUMPSIZE = 0x10 ATTR_FILE_DATAALLOCSIZE = 0x400 ATTR_FILE_DATAEXTENTS = 0x800 ATTR_FILE_DATALENGTH = 0x200 ATTR_FILE_DEVTYPE = 0x20 ATTR_FILE_FILETYPE = 0x40 ATTR_FILE_FORKCOUNT = 0x80 ATTR_FILE_FORKLIST = 0x100 ATTR_FILE_IOBLOCKSIZE = 0x8 ATTR_FILE_LINKCOUNT = 0x1 ATTR_FILE_RSRCALLOCSIZE = 0x2000 ATTR_FILE_RSRCEXTENTS = 0x4000 ATTR_FILE_RSRCLENGTH = 0x1000 ATTR_FILE_SETMASK = 0x20 ATTR_FILE_TOTALSIZE = 0x2 ATTR_FILE_VALIDMASK = 0x37ff ATTR_VOL_ALLOCATIONCLUMP = 0x40 ATTR_VOL_ATTRIBUTES = 0x40000000 ATTR_VOL_CAPABILITIES = 0x20000 ATTR_VOL_DIRCOUNT = 0x400 ATTR_VOL_ENCODINGSUSED = 0x10000 ATTR_VOL_FILECOUNT = 0x200 ATTR_VOL_FSTYPE = 0x1 ATTR_VOL_INFO = 0x80000000 ATTR_VOL_IOBLOCKSIZE = 0x80 ATTR_VOL_MAXOBJCOUNT = 0x800 ATTR_VOL_MINALLOCATION = 0x20 ATTR_VOL_MOUNTEDDEVICE = 0x8000 ATTR_VOL_MOUNTFLAGS = 0x4000 ATTR_VOL_MOUNTPOINT = 0x1000 ATTR_VOL_NAME = 0x2000 ATTR_VOL_OBJCOUNT = 0x100 ATTR_VOL_QUOTA_SIZE = 0x10000000 ATTR_VOL_RESERVED_SIZE = 0x20000000 ATTR_VOL_SETMASK = 0x80002000 ATTR_VOL_SIGNATURE = 0x2 ATTR_VOL_SIZE = 0x4 ATTR_VOL_SPACEAVAIL = 0x10 ATTR_VOL_SPACEFREE = 0x8 ATTR_VOL_UUID = 0x40000 ATTR_VOL_VALIDMASK = 0xf007ffff B0 = 0x0 B110 = 0x6e B115200 = 0x1c200 B1200 = 0x4b0 B134 = 0x86 B14400 = 0x3840 B150 = 0x96 B1800 = 0x708 B19200 = 0x4b00 B200 = 0xc8 B230400 = 0x38400 B2400 = 0x960 B28800 = 0x7080 B300 = 0x12c B38400 = 0x9600 B4800 = 0x12c0 B50 = 0x32 B57600 = 0xe100 B600 = 0x258 B7200 = 0x1c20 B75 = 0x4b B76800 = 0x12c00 B9600 = 0x2580 BIOCFLUSH = 0x20004268 BIOCGBLEN = 0x40044266 BIOCGDLT = 0x4004426a BIOCGDLTLIST = 0xc00c4279 BIOCGETIF = 0x4020426b BIOCGHDRCMPLT = 0x40044274 BIOCGRSIG = 0x40044272 BIOCGRTIMEOUT = 0x4010426e BIOCGSEESENT = 0x40044276 BIOCGSTATS = 0x4008426f BIOCIMMEDIATE = 0x80044270 BIOCPROMISC = 0x20004269 BIOCSBLEN = 0xc0044266 BIOCSDLT = 0x80044278 BIOCSETF = 0x80104267 BIOCSETFNR = 0x8010427e BIOCSETIF = 0x8020426c BIOCSHDRCMPLT = 0x80044275 BIOCSRSIG = 0x80044273 BIOCSRTIMEOUT = 0x8010426d BIOCSSEESENT = 0x80044277 BIOCVERSION = 0x40044271 BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALIGNMENT = 0x4 BPF_ALU = 0x4 BPF_AND = 0x50 BPF_B = 0x10 BPF_DIV = 0x30 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 BPF_JA = 0x0 BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 BPF_JMP = 0x5 BPF_JSET = 0x40 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 BPF_LEN = 0x80 BPF_LSH = 0x60 BPF_MAJOR_VERSION = 0x1 BPF_MAXBUFSIZE = 0x80000 BPF_MAXINSNS = 0x200 BPF_MEM = 0x60 BPF_MEMWORDS = 0x10 BPF_MINBUFSIZE = 0x20 BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_OR = 0x40 BPF_RELEASE = 0x30bb6 BPF_RET = 0x6 BPF_RSH = 0x70 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 BPF_TAX = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 BRKINT = 0x2 BS0 = 0x0 BS1 = 0x8000 BSDLY = 0x8000 CFLUSH = 0xf CLOCAL = 0x8000 CLOCK_MONOTONIC = 0x6 CLOCK_MONOTONIC_RAW = 0x4 CLOCK_MONOTONIC_RAW_APPROX = 0x5 CLOCK_PROCESS_CPUTIME_ID = 0xc CLOCK_REALTIME = 0x0 CLOCK_THREAD_CPUTIME_ID = 0x10 CLOCK_UPTIME_RAW = 0x8 CLOCK_UPTIME_RAW_APPROX = 0x9 CR0 = 0x0 CR1 = 0x1000 CR2 = 0x2000 CR3 = 0x3000 CRDLY = 0x3000 CREAD = 0x800 CRTSCTS = 0x30000 CS5 = 0x0 CS6 = 0x100 CS7 = 0x200 CS8 = 0x300 CSIZE = 0x300 CSTART = 0x11 CSTATUS = 0x14 CSTOP = 0x13 CSTOPB = 0x400 CSUSP = 0x1a CTL_MAXNAME = 0xc CTL_NET = 0x4 DLT_A429 = 0xb8 DLT_A653_ICM = 0xb9 DLT_AIRONET_HEADER = 0x78 DLT_AOS = 0xde DLT_APPLE_IP_OVER_IEEE1394 = 0x8a DLT_ARCNET = 0x7 DLT_ARCNET_LINUX = 0x81 DLT_ATM_CLIP = 0x13 DLT_ATM_RFC1483 = 0xb DLT_AURORA = 0x7e DLT_AX25 = 0x3 DLT_AX25_KISS = 0xca DLT_BACNET_MS_TP = 0xa5 DLT_BLUETOOTH_HCI_H4 = 0xbb DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 DLT_CAN20B = 0xbe DLT_CAN_SOCKETCAN = 0xe3 DLT_CHAOS = 0x5 DLT_CHDLC = 0x68 DLT_CISCO_IOS = 0x76 DLT_C_HDLC = 0x68 DLT_C_HDLC_WITH_DIR = 0xcd DLT_DBUS = 0xe7 DLT_DECT = 0xdd DLT_DOCSIS = 0x8f DLT_DVB_CI = 0xeb DLT_ECONET = 0x73 DLT_EN10MB = 0x1 DLT_EN3MB = 0x2 DLT_ENC = 0x6d DLT_ERF = 0xc5 DLT_ERF_ETH = 0xaf DLT_ERF_POS = 0xb0 DLT_FC_2 = 0xe0 DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 DLT_FDDI = 0xa DLT_FLEXRAY = 0xd2 DLT_FRELAY = 0x6b DLT_FRELAY_WITH_DIR = 0xce DLT_GCOM_SERIAL = 0xad DLT_GCOM_T1E1 = 0xac DLT_GPF_F = 0xab DLT_GPF_T = 0xaa DLT_GPRS_LLC = 0xa9 DLT_GSMTAP_ABIS = 0xda DLT_GSMTAP_UM = 0xd9 DLT_HHDLC = 0x79 DLT_IBM_SN = 0x92 DLT_IBM_SP = 0x91 DLT_IEEE802 = 0x6 DLT_IEEE802_11 = 0x69 DLT_IEEE802_11_RADIO = 0x7f DLT_IEEE802_11_RADIO_AVS = 0xa3 DLT_IEEE802_15_4 = 0xc3 DLT_IEEE802_15_4_LINUX = 0xbf DLT_IEEE802_15_4_NOFCS = 0xe6 DLT_IEEE802_15_4_NONASK_PHY = 0xd7 DLT_IEEE802_16_MAC_CPS = 0xbc DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 DLT_IPFILTER = 0x74 DLT_IPMB = 0xc7 DLT_IPMB_LINUX = 0xd1 DLT_IPNET = 0xe2 DLT_IPOIB = 0xf2 DLT_IPV4 = 0xe4 DLT_IPV6 = 0xe5 DLT_IP_OVER_FC = 0x7a DLT_JUNIPER_ATM1 = 0x89 DLT_JUNIPER_ATM2 = 0x87 DLT_JUNIPER_ATM_CEMIC = 0xee DLT_JUNIPER_CHDLC = 0xb5 DLT_JUNIPER_ES = 0x84 DLT_JUNIPER_ETHER = 0xb2 DLT_JUNIPER_FIBRECHANNEL = 0xea DLT_JUNIPER_FRELAY = 0xb4 DLT_JUNIPER_GGSN = 0x85 DLT_JUNIPER_ISM = 0xc2 DLT_JUNIPER_MFR = 0x86 DLT_JUNIPER_MLFR = 0x83 DLT_JUNIPER_MLPPP = 0x82 DLT_JUNIPER_MONITOR = 0xa4 DLT_JUNIPER_PIC_PEER = 0xae DLT_JUNIPER_PPP = 0xb3 DLT_JUNIPER_PPPOE = 0xa7 DLT_JUNIPER_PPPOE_ATM = 0xa8 DLT_JUNIPER_SERVICES = 0x88 DLT_JUNIPER_SRX_E2E = 0xe9 DLT_JUNIPER_ST = 0xc8 DLT_JUNIPER_VP = 0xb7 DLT_JUNIPER_VS = 0xe8 DLT_LAPB_WITH_DIR = 0xcf DLT_LAPD = 0xcb DLT_LIN = 0xd4 DLT_LINUX_EVDEV = 0xd8 DLT_LINUX_IRDA = 0x90 DLT_LINUX_LAPD = 0xb1 DLT_LINUX_PPP_WITHDIRECTION = 0xa6 DLT_LINUX_SLL = 0x71 DLT_LOOP = 0x6c DLT_LTALK = 0x72 DLT_MATCHING_MAX = 0xf5 DLT_MATCHING_MIN = 0x68 DLT_MFR = 0xb6 DLT_MOST = 0xd3 DLT_MPEG_2_TS = 0xf3 DLT_MPLS = 0xdb DLT_MTP2 = 0x8c DLT_MTP2_WITH_PHDR = 0x8b DLT_MTP3 = 0x8d DLT_MUX27010 = 0xec DLT_NETANALYZER = 0xf0 DLT_NETANALYZER_TRANSPARENT = 0xf1 DLT_NFC_LLCP = 0xf5 DLT_NFLOG = 0xef DLT_NG40 = 0xf4 DLT_NULL = 0x0 DLT_PCI_EXP = 0x7d DLT_PFLOG = 0x75 DLT_PFSYNC = 0x12 DLT_PPI = 0xc0 DLT_PPP = 0x9 DLT_PPP_BSDOS = 0x10 DLT_PPP_ETHER = 0x33 DLT_PPP_PPPD = 0xa6 DLT_PPP_SERIAL = 0x32 DLT_PPP_WITH_DIR = 0xcc DLT_PPP_WITH_DIRECTION = 0xa6 DLT_PRISM_HEADER = 0x77 DLT_PRONET = 0x4 DLT_RAIF1 = 0xc6 DLT_RAW = 0xc DLT_RIO = 0x7c DLT_SCCP = 0x8e DLT_SITA = 0xc4 DLT_SLIP = 0x8 DLT_SLIP_BSDOS = 0xf DLT_STANAG_5066_D_PDU = 0xed DLT_SUNATM = 0x7b DLT_SYMANTEC_FIREWALL = 0x63 DLT_TZSP = 0x80 DLT_USB = 0xba DLT_USB_LINUX = 0xbd DLT_USB_LINUX_MMAPPED = 0xdc DLT_USER0 = 0x93 DLT_USER1 = 0x94 DLT_USER10 = 0x9d DLT_USER11 = 0x9e DLT_USER12 = 0x9f DLT_USER13 = 0xa0 DLT_USER14 = 0xa1 DLT_USER15 = 0xa2 DLT_USER2 = 0x95 DLT_USER3 = 0x96 DLT_USER4 = 0x97 DLT_USER5 = 0x98 DLT_USER6 = 0x99 DLT_USER7 = 0x9a DLT_USER8 = 0x9b DLT_USER9 = 0x9c DLT_WIHART = 0xdf DLT_X2E_SERIAL = 0xd5 DLT_X2E_XORAYA = 0xd6 DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 DT_FIFO = 0x1 DT_LNK = 0xa DT_REG = 0x8 DT_SOCK = 0xc DT_UNKNOWN = 0x0 DT_WHT = 0xe ECHO = 0x8 ECHOCTL = 0x40 ECHOE = 0x2 ECHOK = 0x4 ECHOKE = 0x1 ECHONL = 0x10 ECHOPRT = 0x20 EVFILT_AIO = -0x3 EVFILT_EXCEPT = -0xf EVFILT_FS = -0x9 EVFILT_MACHPORT = -0x8 EVFILT_PROC = -0x5 EVFILT_READ = -0x1 EVFILT_SIGNAL = -0x6 EVFILT_SYSCOUNT = 0xf EVFILT_THREADMARKER = 0xf EVFILT_TIMER = -0x7 EVFILT_USER = -0xa EVFILT_VM = -0xc EVFILT_VNODE = -0x4 EVFILT_WRITE = -0x2 EV_ADD = 0x1 EV_CLEAR = 0x20 EV_DELETE = 0x2 EV_DISABLE = 0x8 EV_DISPATCH = 0x80 EV_DISPATCH2 = 0x180 EV_ENABLE = 0x4 EV_EOF = 0x8000 EV_ERROR = 0x4000 EV_FLAG0 = 0x1000 EV_FLAG1 = 0x2000 EV_ONESHOT = 0x10 EV_OOBAND = 0x2000 EV_POLL = 0x1000 EV_RECEIPT = 0x40 EV_SYSFLAGS = 0xf000 EV_UDATA_SPECIFIC = 0x100 EV_VANISHED = 0x200 EXTA = 0x4b00 EXTB = 0x9600 EXTPROC = 0x800 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 FF1 = 0x4000 FFDLY = 0x4000 FLUSHO = 0x800000 FSOPT_ATTR_CMN_EXTENDED = 0x20 FSOPT_NOFOLLOW = 0x1 FSOPT_NOINMEMUPDATE = 0x2 FSOPT_PACK_INVAL_ATTRS = 0x8 FSOPT_REPORT_FULLSIZE = 0x4 F_ADDFILESIGS = 0x3d F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 F_ADDFILESIGS_RETURN = 0x61 F_ADDSIGS = 0x3b F_ALLOCATEALL = 0x4 F_ALLOCATECONTIG = 0x2 F_BARRIERFSYNC = 0x55 F_CHECK_LV = 0x62 F_CHKCLEAN = 0x29 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0x43 F_FINDSIGS = 0x4e F_FLUSH_DATA = 0x28 F_FREEZE_FS = 0x35 F_FULLFSYNC = 0x33 F_GETCODEDIR = 0x48 F_GETFD = 0x1 F_GETFL = 0x3 F_GETLK = 0x7 F_GETLKPID = 0x42 F_GETNOSIGPIPE = 0x4a F_GETOWN = 0x5 F_GETPATH = 0x32 F_GETPATH_MTMINFO = 0x47 F_GETPROTECTIONCLASS = 0x3f F_GETPROTECTIONLEVEL = 0x4d F_GLOBAL_NOCACHE = 0x37 F_LOG2PHYS = 0x31 F_LOG2PHYS_EXT = 0x41 F_NOCACHE = 0x30 F_NODIRECT = 0x3e F_OK = 0x0 F_PATHPKG_CHECK = 0x34 F_PEOFPOSMODE = 0x3 F_PREALLOCATE = 0x2a F_PUNCHHOLE = 0x63 F_RDADVISE = 0x2c F_RDAHEAD = 0x2d F_RDLCK = 0x1 F_SETBACKINGSTORE = 0x46 F_SETFD = 0x2 F_SETFL = 0x4 F_SETLK = 0x8 F_SETLKW = 0x9 F_SETLKWTIMEOUT = 0xa F_SETNOSIGPIPE = 0x49 F_SETOWN = 0x6 F_SETPROTECTIONCLASS = 0x40 F_SETSIZE = 0x2b F_SINGLE_WRITER = 0x4c F_THAW_FS = 0x36 F_TRANSCODEKEY = 0x4b F_TRIM_ACTIVE_FILE = 0x64 F_UNLCK = 0x2 F_VOLPOSMODE = 0x4 F_WRLCK = 0x3 HUPCL = 0x4000 ICANON = 0x100 ICMP6_FILTER = 0x12 ICRNL = 0x100 IEXTEN = 0x400 IFF_ALLMULTI = 0x200 IFF_ALTPHYS = 0x4000 IFF_BROADCAST = 0x2 IFF_DEBUG = 0x4 IFF_LINK0 = 0x1000 IFF_LINK1 = 0x2000 IFF_LINK2 = 0x4000 IFF_LOOPBACK = 0x8 IFF_MULTICAST = 0x8000 IFF_NOARP = 0x80 IFF_NOTRAILERS = 0x20 IFF_OACTIVE = 0x400 IFF_POINTOPOINT = 0x10 IFF_PROMISC = 0x100 IFF_RUNNING = 0x40 IFF_SIMPLEX = 0x800 IFF_UP = 0x1 IFNAMSIZ = 0x10 IFT_1822 = 0x2 IFT_AAL5 = 0x31 IFT_ARCNET = 0x23 IFT_ARCNETPLUS = 0x24 IFT_ATM = 0x25 IFT_BRIDGE = 0xd1 IFT_CARP = 0xf8 IFT_CELLULAR = 0xff IFT_CEPT = 0x13 IFT_DS3 = 0x1e IFT_ENC = 0xf4 IFT_EON = 0x19 IFT_ETHER = 0x6 IFT_FAITH = 0x38 IFT_FDDI = 0xf IFT_FRELAY = 0x20 IFT_FRELAYDCE = 0x2c IFT_GIF = 0x37 IFT_HDH1822 = 0x3 IFT_HIPPI = 0x2f IFT_HSSI = 0x2e IFT_HY = 0xe IFT_IEEE1394 = 0x90 IFT_IEEE8023ADLAG = 0x88 IFT_ISDNBASIC = 0x14 IFT_ISDNPRIMARY = 0x15 IFT_ISO88022LLC = 0x29 IFT_ISO88023 = 0x7 IFT_ISO88024 = 0x8 IFT_ISO88025 = 0x9 IFT_ISO88026 = 0xa IFT_L2VLAN = 0x87 IFT_LAPB = 0x10 IFT_LOCALTALK = 0x2a IFT_LOOP = 0x18 IFT_MIOX25 = 0x26 IFT_MODEM = 0x30 IFT_NSIP = 0x1b IFT_OTHER = 0x1 IFT_P10 = 0xc IFT_P80 = 0xd IFT_PARA = 0x22 IFT_PDP = 0xff IFT_PFLOG = 0xf5 IFT_PFSYNC = 0xf6 IFT_PKTAP = 0xfe IFT_PPP = 0x17 IFT_PROPMUX = 0x36 IFT_PROPVIRTUAL = 0x35 IFT_PTPSERIAL = 0x16 IFT_RS232 = 0x21 IFT_SDLC = 0x11 IFT_SIP = 0x1f IFT_SLIP = 0x1c IFT_SMDSDXI = 0x2b IFT_SMDSICIP = 0x34 IFT_SONET = 0x27 IFT_SONETPATH = 0x32 IFT_SONETVT = 0x33 IFT_STARLAN = 0xb IFT_STF = 0x39 IFT_T1 = 0x12 IFT_ULTRA = 0x1d IFT_V35 = 0x2d IFT_X25 = 0x5 IFT_X25DDN = 0x4 IFT_X25PLE = 0x28 IFT_XETHER = 0x1a IGNBRK = 0x1 IGNCR = 0x80 IGNPAR = 0x4 IMAXBEL = 0x2000 INLCR = 0x40 INPCK = 0x10 IN_CLASSA_HOST = 0xffffff IN_CLASSA_MAX = 0x80 IN_CLASSA_NET = 0xff000000 IN_CLASSA_NSHIFT = 0x18 IN_CLASSB_HOST = 0xffff IN_CLASSB_MAX = 0x10000 IN_CLASSB_NET = 0xffff0000 IN_CLASSB_NSHIFT = 0x10 IN_CLASSC_HOST = 0xff IN_CLASSC_NET = 0xffffff00 IN_CLASSC_NSHIFT = 0x8 IN_CLASSD_HOST = 0xfffffff IN_CLASSD_NET = 0xf0000000 IN_CLASSD_NSHIFT = 0x1c IN_LINKLOCALNETNUM = 0xa9fe0000 IN_LOOPBACKNET = 0x7f IPPROTO_3PC = 0x22 IPPROTO_ADFS = 0x44 IPPROTO_AH = 0x33 IPPROTO_AHIP = 0x3d IPPROTO_APES = 0x63 IPPROTO_ARGUS = 0xd IPPROTO_AX25 = 0x5d IPPROTO_BHA = 0x31 IPPROTO_BLT = 0x1e IPPROTO_BRSATMON = 0x4c IPPROTO_CFTP = 0x3e IPPROTO_CHAOS = 0x10 IPPROTO_CMTP = 0x26 IPPROTO_CPHB = 0x49 IPPROTO_CPNX = 0x48 IPPROTO_DDP = 0x25 IPPROTO_DGP = 0x56 IPPROTO_DIVERT = 0xfe IPPROTO_DONE = 0x101 IPPROTO_DSTOPTS = 0x3c IPPROTO_EGP = 0x8 IPPROTO_EMCON = 0xe IPPROTO_ENCAP = 0x62 IPPROTO_EON = 0x50 IPPROTO_ESP = 0x32 IPPROTO_ETHERIP = 0x61 IPPROTO_FRAGMENT = 0x2c IPPROTO_GGP = 0x3 IPPROTO_GMTP = 0x64 IPPROTO_GRE = 0x2f IPPROTO_HELLO = 0x3f IPPROTO_HMP = 0x14 IPPROTO_HOPOPTS = 0x0 IPPROTO_ICMP = 0x1 IPPROTO_ICMPV6 = 0x3a IPPROTO_IDP = 0x16 IPPROTO_IDPR = 0x23 IPPROTO_IDRP = 0x2d IPPROTO_IGMP = 0x2 IPPROTO_IGP = 0x55 IPPROTO_IGRP = 0x58 IPPROTO_IL = 0x28 IPPROTO_INLSP = 0x34 IPPROTO_INP = 0x20 IPPROTO_IP = 0x0 IPPROTO_IPCOMP = 0x6c IPPROTO_IPCV = 0x47 IPPROTO_IPEIP = 0x5e IPPROTO_IPIP = 0x4 IPPROTO_IPPC = 0x43 IPPROTO_IPV4 = 0x4 IPPROTO_IPV6 = 0x29 IPPROTO_IRTP = 0x1c IPPROTO_KRYPTOLAN = 0x41 IPPROTO_LARP = 0x5b IPPROTO_LEAF1 = 0x19 IPPROTO_LEAF2 = 0x1a IPPROTO_MAX = 0x100 IPPROTO_MAXID = 0x34 IPPROTO_MEAS = 0x13 IPPROTO_MHRP = 0x30 IPPROTO_MICP = 0x5f IPPROTO_MTP = 0x5c IPPROTO_MUX = 0x12 IPPROTO_ND = 0x4d IPPROTO_NHRP = 0x36 IPPROTO_NONE = 0x3b IPPROTO_NSP = 0x1f IPPROTO_NVPII = 0xb IPPROTO_OSPFIGP = 0x59 IPPROTO_PGM = 0x71 IPPROTO_PIGP = 0x9 IPPROTO_PIM = 0x67 IPPROTO_PRM = 0x15 IPPROTO_PUP = 0xc IPPROTO_PVP = 0x4b IPPROTO_RAW = 0xff IPPROTO_RCCMON = 0xa IPPROTO_RDP = 0x1b IPPROTO_ROUTING = 0x2b IPPROTO_RSVP = 0x2e IPPROTO_RVD = 0x42 IPPROTO_SATEXPAK = 0x40 IPPROTO_SATMON = 0x45 IPPROTO_SCCSP = 0x60 IPPROTO_SCTP = 0x84 IPPROTO_SDRP = 0x2a IPPROTO_SEP = 0x21 IPPROTO_SRPC = 0x5a IPPROTO_ST = 0x7 IPPROTO_SVMTP = 0x52 IPPROTO_SWIPE = 0x35 IPPROTO_TCF = 0x57 IPPROTO_TCP = 0x6 IPPROTO_TP = 0x1d IPPROTO_TPXX = 0x27 IPPROTO_TRUNK1 = 0x17 IPPROTO_TRUNK2 = 0x18 IPPROTO_TTP = 0x54 IPPROTO_UDP = 0x11 IPPROTO_VINES = 0x53 IPPROTO_VISA = 0x46 IPPROTO_VMTP = 0x51 IPPROTO_WBEXPAK = 0x4f IPPROTO_WBMON = 0x4e IPPROTO_WSN = 0x4a IPPROTO_XNET = 0xf IPPROTO_XTP = 0x24 IPV6_2292DSTOPTS = 0x17 IPV6_2292HOPLIMIT = 0x14 IPV6_2292HOPOPTS = 0x16 IPV6_2292NEXTHOP = 0x15 IPV6_2292PKTINFO = 0x13 IPV6_2292PKTOPTIONS = 0x19 IPV6_2292RTHDR = 0x18 IPV6_BINDV6ONLY = 0x1b IPV6_BOUND_IF = 0x7d IPV6_CHECKSUM = 0x1a IPV6_DEFAULT_MULTICAST_HOPS = 0x1 IPV6_DEFAULT_MULTICAST_LOOP = 0x1 IPV6_DEFHLIM = 0x40 IPV6_FAITH = 0x1d IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 IPV6_FLOW_ECN_MASK = 0x300 IPV6_FRAGTTL = 0x3c IPV6_FW_ADD = 0x1e IPV6_FW_DEL = 0x1f IPV6_FW_FLUSH = 0x20 IPV6_FW_GET = 0x22 IPV6_FW_ZERO = 0x21 IPV6_HLIMDEC = 0x1 IPV6_IPSEC_POLICY = 0x1c IPV6_JOIN_GROUP = 0xc IPV6_LEAVE_GROUP = 0xd IPV6_MAXHLIM = 0xff IPV6_MAXOPTHDR = 0x800 IPV6_MAXPACKET = 0xffff IPV6_MAX_GROUP_SRC_FILTER = 0x200 IPV6_MAX_MEMBERSHIPS = 0xfff IPV6_MAX_SOCK_SRC_FILTER = 0x80 IPV6_MIN_MEMBERSHIPS = 0x1f IPV6_MMTU = 0x500 IPV6_MULTICAST_HOPS = 0xa IPV6_MULTICAST_IF = 0x9 IPV6_MULTICAST_LOOP = 0xb IPV6_PORTRANGE = 0xe IPV6_PORTRANGE_DEFAULT = 0x0 IPV6_PORTRANGE_HIGH = 0x1 IPV6_PORTRANGE_LOW = 0x2 IPV6_RECVTCLASS = 0x23 IPV6_RTHDR_LOOSE = 0x0 IPV6_RTHDR_STRICT = 0x1 IPV6_RTHDR_TYPE_0 = 0x0 IPV6_SOCKOPT_RESERVED1 = 0x3 IPV6_TCLASS = 0x24 IPV6_UNICAST_HOPS = 0x4 IPV6_V6ONLY = 0x1b IPV6_VERSION = 0x60 IPV6_VERSION_MASK = 0xf0 IP_ADD_MEMBERSHIP = 0xc IP_ADD_SOURCE_MEMBERSHIP = 0x46 IP_BLOCK_SOURCE = 0x48 IP_BOUND_IF = 0x19 IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 IP_DROP_MEMBERSHIP = 0xd IP_DROP_SOURCE_MEMBERSHIP = 0x47 IP_DUMMYNET_CONFIGURE = 0x3c IP_DUMMYNET_DEL = 0x3d IP_DUMMYNET_FLUSH = 0x3e IP_DUMMYNET_GET = 0x40 IP_FAITH = 0x16 IP_FW_ADD = 0x28 IP_FW_DEL = 0x29 IP_FW_FLUSH = 0x2a IP_FW_GET = 0x2c IP_FW_RESETLOG = 0x2d IP_FW_ZERO = 0x2b IP_HDRINCL = 0x2 IP_IPSEC_POLICY = 0x15 IP_MAXPACKET = 0xffff IP_MAX_GROUP_SRC_FILTER = 0x200 IP_MAX_MEMBERSHIPS = 0xfff IP_MAX_SOCK_MUTE_FILTER = 0x80 IP_MAX_SOCK_SRC_FILTER = 0x80 IP_MF = 0x2000 IP_MIN_MEMBERSHIPS = 0x1f IP_MSFILTER = 0x4a IP_MSS = 0x240 IP_MULTICAST_IF = 0x9 IP_MULTICAST_IFINDEX = 0x42 IP_MULTICAST_LOOP = 0xb IP_MULTICAST_TTL = 0xa IP_MULTICAST_VIF = 0xe IP_NAT__XXX = 0x37 IP_OFFMASK = 0x1fff IP_OLD_FW_ADD = 0x32 IP_OLD_FW_DEL = 0x33 IP_OLD_FW_FLUSH = 0x34 IP_OLD_FW_GET = 0x36 IP_OLD_FW_RESETLOG = 0x38 IP_OLD_FW_ZERO = 0x35 IP_OPTIONS = 0x1 IP_PKTINFO = 0x1a IP_PORTRANGE = 0x13 IP_PORTRANGE_DEFAULT = 0x0 IP_PORTRANGE_HIGH = 0x1 IP_PORTRANGE_LOW = 0x2 IP_RECVDSTADDR = 0x7 IP_RECVIF = 0x14 IP_RECVOPTS = 0x5 IP_RECVPKTINFO = 0x1a IP_RECVRETOPTS = 0x6 IP_RECVTOS = 0x1b IP_RECVTTL = 0x18 IP_RETOPTS = 0x8 IP_RF = 0x8000 IP_RSVP_OFF = 0x10 IP_RSVP_ON = 0xf IP_RSVP_VIF_OFF = 0x12 IP_RSVP_VIF_ON = 0x11 IP_STRIPHDR = 0x17 IP_TOS = 0x3 IP_TRAFFIC_MGT_BACKGROUND = 0x41 IP_TTL = 0x4 IP_UNBLOCK_SOURCE = 0x49 ISIG = 0x80 ISTRIP = 0x20 IUTF8 = 0x4000 IXANY = 0x800 IXOFF = 0x400 IXON = 0x200 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 MADV_CAN_REUSE = 0x9 MADV_DONTNEED = 0x4 MADV_FREE = 0x5 MADV_FREE_REUSABLE = 0x7 MADV_FREE_REUSE = 0x8 MADV_NORMAL = 0x0 MADV_PAGEOUT = 0xa MADV_RANDOM = 0x1 MADV_SEQUENTIAL = 0x2 MADV_WILLNEED = 0x3 MADV_ZERO_WIRED_PAGES = 0x6 MAP_ANON = 0x1000 MAP_ANONYMOUS = 0x1000 MAP_COPY = 0x2 MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_HASSEMAPHORE = 0x200 MAP_JIT = 0x800 MAP_NOCACHE = 0x400 MAP_NOEXTEND = 0x100 MAP_NORESERVE = 0x40 MAP_PRIVATE = 0x2 MAP_RENAME = 0x20 MAP_RESERVED0080 = 0x80 MAP_RESILIENT_CODESIGN = 0x2000 MAP_RESILIENT_MEDIA = 0x4000 MAP_SHARED = 0x1 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MNT_ASYNC = 0x40 MNT_AUTOMOUNTED = 0x400000 MNT_CMDFLAGS = 0xf0000 MNT_CPROTECT = 0x80 MNT_DEFWRITE = 0x2000000 MNT_DONTBROWSE = 0x100000 MNT_DOVOLFS = 0x8000 MNT_DWAIT = 0x4 MNT_EXPORTED = 0x100 MNT_FORCE = 0x80000 MNT_IGNORE_OWNERSHIP = 0x200000 MNT_JOURNALED = 0x800000 MNT_LOCAL = 0x1000 MNT_MULTILABEL = 0x4000000 MNT_NOATIME = 0x10000000 MNT_NOBLOCK = 0x20000 MNT_NODEV = 0x10 MNT_NOEXEC = 0x4 MNT_NOSUID = 0x8 MNT_NOUSERXATTR = 0x1000000 MNT_NOWAIT = 0x2 MNT_QUARANTINE = 0x400 MNT_QUOTA = 0x2000 MNT_RDONLY = 0x1 MNT_RELOAD = 0x40000 MNT_ROOTFS = 0x4000 MNT_SYNCHRONOUS = 0x2 MNT_UNION = 0x20 MNT_UNKNOWNPERMISSIONS = 0x200000 MNT_UPDATE = 0x10000 MNT_VISFLAGMASK = 0x17f0f5ff MNT_WAIT = 0x1 MSG_CTRUNC = 0x20 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x80 MSG_EOF = 0x100 MSG_EOR = 0x8 MSG_FLUSH = 0x400 MSG_HAVEMORE = 0x2000 MSG_HOLD = 0x800 MSG_NEEDSA = 0x10000 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_RCVMORE = 0x4000 MSG_SEND = 0x1000 MSG_TRUNC = 0x10 MSG_WAITALL = 0x40 MSG_WAITSTREAM = 0x200 MS_ASYNC = 0x1 MS_DEACTIVATE = 0x8 MS_INVALIDATE = 0x2 MS_KILLPAGES = 0x4 MS_SYNC = 0x10 NAME_MAX = 0xff NET_RT_DUMP = 0x1 NET_RT_DUMP2 = 0x7 NET_RT_FLAGS = 0x2 NET_RT_IFLIST = 0x3 NET_RT_IFLIST2 = 0x6 NET_RT_MAXID = 0xa NET_RT_STAT = 0x4 NET_RT_TRASH = 0x5 NL0 = 0x0 NL1 = 0x100 NL2 = 0x200 NL3 = 0x300 NLDLY = 0x300 NOFLSH = 0x80000000 NOKERNINFO = 0x2000000 NOTE_ABSOLUTE = 0x8 NOTE_ATTRIB = 0x8 NOTE_BACKGROUND = 0x40 NOTE_CHILD = 0x4 NOTE_CRITICAL = 0x20 NOTE_DELETE = 0x1 NOTE_EXEC = 0x20000000 NOTE_EXIT = 0x80000000 NOTE_EXITSTATUS = 0x4000000 NOTE_EXIT_CSERROR = 0x40000 NOTE_EXIT_DECRYPTFAIL = 0x10000 NOTE_EXIT_DETAIL = 0x2000000 NOTE_EXIT_DETAIL_MASK = 0x70000 NOTE_EXIT_MEMORY = 0x20000 NOTE_EXIT_REPARENTED = 0x80000 NOTE_EXTEND = 0x4 NOTE_FFAND = 0x40000000 NOTE_FFCOPY = 0xc0000000 NOTE_FFCTRLMASK = 0xc0000000 NOTE_FFLAGSMASK = 0xffffff NOTE_FFNOP = 0x0 NOTE_FFOR = 0x80000000 NOTE_FORK = 0x40000000 NOTE_FUNLOCK = 0x100 NOTE_LEEWAY = 0x10 NOTE_LINK = 0x10 NOTE_LOWAT = 0x1 NOTE_MACH_CONTINUOUS_TIME = 0x80 NOTE_NONE = 0x80 NOTE_NSECONDS = 0x4 NOTE_OOB = 0x2 NOTE_PCTRLMASK = -0x100000 NOTE_PDATAMASK = 0xfffff NOTE_REAP = 0x10000000 NOTE_RENAME = 0x20 NOTE_REVOKE = 0x40 NOTE_SECONDS = 0x1 NOTE_SIGNAL = 0x8000000 NOTE_TRACK = 0x1 NOTE_TRACKERR = 0x2 NOTE_TRIGGER = 0x1000000 NOTE_USECONDS = 0x2 NOTE_VM_ERROR = 0x10000000 NOTE_VM_PRESSURE = 0x80000000 NOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000 NOTE_VM_PRESSURE_TERMINATE = 0x40000000 NOTE_WRITE = 0x2 OCRNL = 0x10 OFDEL = 0x20000 OFILL = 0x80 ONLCR = 0x2 ONLRET = 0x40 ONOCR = 0x20 ONOEOT = 0x8 OPOST = 0x1 OXTABS = 0x4 O_ACCMODE = 0x3 O_ALERT = 0x20000000 O_APPEND = 0x8 O_ASYNC = 0x40 O_CLOEXEC = 0x1000000 O_CREAT = 0x200 O_DIRECTORY = 0x100000 O_DP_GETRAWENCRYPTED = 0x1 O_DP_GETRAWUNENCRYPTED = 0x2 O_DSYNC = 0x400000 O_EVTONLY = 0x8000 O_EXCL = 0x800 O_EXLOCK = 0x20 O_FSYNC = 0x80 O_NDELAY = 0x4 O_NOCTTY = 0x20000 O_NOFOLLOW = 0x100 O_NONBLOCK = 0x4 O_POPUP = 0x80000000 O_RDONLY = 0x0 O_RDWR = 0x2 O_SHLOCK = 0x10 O_SYMLINK = 0x200000 O_SYNC = 0x80 O_TRUNC = 0x400 O_WRONLY = 0x1 PARENB = 0x1000 PARMRK = 0x8 PARODD = 0x2000 PENDIN = 0x20000000 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 PROT_EXEC = 0x4 PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 PT_ATTACH = 0xa PT_ATTACHEXC = 0xe PT_CONTINUE = 0x7 PT_DENY_ATTACH = 0x1f PT_DETACH = 0xb PT_FIRSTMACH = 0x20 PT_FORCEQUOTA = 0x1e PT_KILL = 0x8 PT_READ_D = 0x2 PT_READ_I = 0x1 PT_READ_U = 0x3 PT_SIGEXC = 0xc PT_STEP = 0x9 PT_THUPDATE = 0xd PT_TRACE_ME = 0x0 PT_WRITE_D = 0x5 PT_WRITE_I = 0x4 PT_WRITE_U = 0x6 RLIMIT_AS = 0x5 RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 RLIMIT_CPU_USAGE_MONITOR = 0x2 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 RLIMIT_MEMLOCK = 0x6 RLIMIT_NOFILE = 0x8 RLIMIT_NPROC = 0x7 RLIMIT_RSS = 0x5 RLIMIT_STACK = 0x3 RLIM_INFINITY = 0x7fffffffffffffff RTAX_AUTHOR = 0x6 RTAX_BRD = 0x7 RTAX_DST = 0x0 RTAX_GATEWAY = 0x1 RTAX_GENMASK = 0x3 RTAX_IFA = 0x5 RTAX_IFP = 0x4 RTAX_MAX = 0x8 RTAX_NETMASK = 0x2 RTA_AUTHOR = 0x40 RTA_BRD = 0x80 RTA_DST = 0x1 RTA_GATEWAY = 0x2 RTA_GENMASK = 0x8 RTA_IFA = 0x20 RTA_IFP = 0x10 RTA_NETMASK = 0x4 RTF_BLACKHOLE = 0x1000 RTF_BROADCAST = 0x400000 RTF_CLONING = 0x100 RTF_CONDEMNED = 0x2000000 RTF_DELCLONE = 0x80 RTF_DONE = 0x40 RTF_DYNAMIC = 0x10 RTF_GATEWAY = 0x2 RTF_HOST = 0x4 RTF_IFREF = 0x4000000 RTF_IFSCOPE = 0x1000000 RTF_LLINFO = 0x400 RTF_LOCAL = 0x200000 RTF_MODIFIED = 0x20 RTF_MULTICAST = 0x800000 RTF_NOIFREF = 0x2000 RTF_PINNED = 0x100000 RTF_PRCLONING = 0x10000 RTF_PROTO1 = 0x8000 RTF_PROTO2 = 0x4000 RTF_PROTO3 = 0x40000 RTF_PROXY = 0x8000000 RTF_REJECT = 0x8 RTF_ROUTER = 0x10000000 RTF_STATIC = 0x800 RTF_UP = 0x1 RTF_WASCLONED = 0x20000 RTF_XRESOLVE = 0x200 RTM_ADD = 0x1 RTM_CHANGE = 0x3 RTM_DELADDR = 0xd RTM_DELETE = 0x2 RTM_DELMADDR = 0x10 RTM_GET = 0x4 RTM_GET2 = 0x14 RTM_IFINFO = 0xe RTM_IFINFO2 = 0x12 RTM_LOCK = 0x8 RTM_LOSING = 0x5 RTM_MISS = 0x7 RTM_NEWADDR = 0xc RTM_NEWMADDR = 0xf RTM_NEWMADDR2 = 0x13 RTM_OLDADD = 0x9 RTM_OLDDEL = 0xa RTM_REDIRECT = 0x6 RTM_RESOLVE = 0xb RTM_RTTUNIT = 0xf4240 RTM_VERSION = 0x5 RTV_EXPIRE = 0x4 RTV_HOPCOUNT = 0x2 RTV_MTU = 0x1 RTV_RPIPE = 0x8 RTV_RTT = 0x40 RTV_RTTVAR = 0x80 RTV_SPIPE = 0x10 RTV_SSTHRESH = 0x20 RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 SCM_CREDS = 0x3 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x2 SCM_TIMESTAMP_MONOTONIC = 0x4 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 SIOCADDMULTI = 0x80206931 SIOCAIFADDR = 0x8040691a SIOCARPIPLL = 0xc0206928 SIOCATMARK = 0x40047307 SIOCAUTOADDR = 0xc0206926 SIOCAUTONETMASK = 0x80206927 SIOCDELMULTI = 0x80206932 SIOCDIFADDR = 0x80206919 SIOCDIFPHYADDR = 0x80206941 SIOCGDRVSPEC = 0xc028697b SIOCGETVLAN = 0xc020697f SIOCGHIWAT = 0x40047301 SIOCGIFADDR = 0xc0206921 SIOCGIFALTMTU = 0xc0206948 SIOCGIFASYNCMAP = 0xc020697c SIOCGIFBOND = 0xc0206947 SIOCGIFBRDADDR = 0xc0206923 SIOCGIFCAP = 0xc020695b SIOCGIFCONF = 0xc00c6924 SIOCGIFDEVMTU = 0xc0206944 SIOCGIFDSTADDR = 0xc0206922 SIOCGIFFLAGS = 0xc0206911 SIOCGIFGENERIC = 0xc020693a SIOCGIFKPI = 0xc0206987 SIOCGIFMAC = 0xc0206982 SIOCGIFMEDIA = 0xc02c6938 SIOCGIFMETRIC = 0xc0206917 SIOCGIFMTU = 0xc0206933 SIOCGIFNETMASK = 0xc0206925 SIOCGIFPDSTADDR = 0xc0206940 SIOCGIFPHYS = 0xc0206935 SIOCGIFPSRCADDR = 0xc020693f SIOCGIFSTATUS = 0xc331693d SIOCGIFVLAN = 0xc020697f SIOCGIFWAKEFLAGS = 0xc0206988 SIOCGLOWAT = 0x40047303 SIOCGPGRP = 0x40047309 SIOCIFCREATE = 0xc0206978 SIOCIFCREATE2 = 0xc020697a SIOCIFDESTROY = 0x80206979 SIOCIFGCLONERS = 0xc0106981 SIOCRSLVMULTI = 0xc010693b SIOCSDRVSPEC = 0x8028697b SIOCSETVLAN = 0x8020697e SIOCSHIWAT = 0x80047300 SIOCSIFADDR = 0x8020690c SIOCSIFALTMTU = 0x80206945 SIOCSIFASYNCMAP = 0x8020697d SIOCSIFBOND = 0x80206946 SIOCSIFBRDADDR = 0x80206913 SIOCSIFCAP = 0x8020695a SIOCSIFDSTADDR = 0x8020690e SIOCSIFFLAGS = 0x80206910 SIOCSIFGENERIC = 0x80206939 SIOCSIFKPI = 0x80206986 SIOCSIFLLADDR = 0x8020693c SIOCSIFMAC = 0x80206983 SIOCSIFMEDIA = 0xc0206937 SIOCSIFMETRIC = 0x80206918 SIOCSIFMTU = 0x80206934 SIOCSIFNETMASK = 0x80206916 SIOCSIFPHYADDR = 0x8040693e SIOCSIFPHYS = 0x80206936 SIOCSIFVLAN = 0x8020697e SIOCSLOWAT = 0x80047302 SIOCSPGRP = 0x80047308 SOCK_DGRAM = 0x2 SOCK_MAXADDRLEN = 0xff SOCK_RAW = 0x3 SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x1 SOL_SOCKET = 0xffff SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x2 SO_BROADCAST = 0x20 SO_DEBUG = 0x1 SO_DONTROUTE = 0x10 SO_DONTTRUNC = 0x2000 SO_ERROR = 0x1007 SO_KEEPALIVE = 0x8 SO_LABEL = 0x1010 SO_LINGER = 0x80 SO_LINGER_SEC = 0x1080 SO_NETSVC_MARKING_LEVEL = 0x1119 SO_NET_SERVICE_TYPE = 0x1116 SO_NKE = 0x1021 SO_NOADDRERR = 0x1023 SO_NOSIGPIPE = 0x1022 SO_NOTIFYCONFLICT = 0x1026 SO_NP_EXTENSIONS = 0x1083 SO_NREAD = 0x1020 SO_NUMRCVPKT = 0x1112 SO_NWRITE = 0x1024 SO_OOBINLINE = 0x100 SO_PEERLABEL = 0x1011 SO_RANDOMPORT = 0x1082 SO_RCVBUF = 0x1002 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x1006 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_REUSESHAREUID = 0x1025 SO_SNDBUF = 0x1001 SO_SNDLOWAT = 0x1003 SO_SNDTIMEO = 0x1005 SO_TIMESTAMP = 0x400 SO_TIMESTAMP_MONOTONIC = 0x800 SO_TYPE = 0x1008 SO_UPCALLCLOSEWAIT = 0x1027 SO_USELOOPBACK = 0x40 SO_WANTMORE = 0x4000 SO_WANTOOBFLAG = 0x8000 S_IEXEC = 0x40 S_IFBLK = 0x6000 S_IFCHR = 0x2000 S_IFDIR = 0x4000 S_IFIFO = 0x1000 S_IFLNK = 0xa000 S_IFMT = 0xf000 S_IFREG = 0x8000 S_IFSOCK = 0xc000 S_IFWHT = 0xe000 S_IREAD = 0x100 S_IRGRP = 0x20 S_IROTH = 0x4 S_IRUSR = 0x100 S_IRWXG = 0x38 S_IRWXO = 0x7 S_IRWXU = 0x1c0 S_ISGID = 0x400 S_ISTXT = 0x200 S_ISUID = 0x800 S_ISVTX = 0x200 S_IWGRP = 0x10 S_IWOTH = 0x2 S_IWRITE = 0x80 S_IWUSR = 0x80 S_IXGRP = 0x8 S_IXOTH = 0x1 S_IXUSR = 0x40 TAB0 = 0x0 TAB1 = 0x400 TAB2 = 0x800 TAB3 = 0x4 TABDLY = 0xc04 TCIFLUSH = 0x1 TCIOFF = 0x3 TCIOFLUSH = 0x3 TCION = 0x4 TCOFLUSH = 0x2 TCOOFF = 0x1 TCOON = 0x2 TCP_CONNECTIONTIMEOUT = 0x20 TCP_CONNECTION_INFO = 0x106 TCP_ENABLE_ECN = 0x104 TCP_FASTOPEN = 0x105 TCP_KEEPALIVE = 0x10 TCP_KEEPCNT = 0x102 TCP_KEEPINTVL = 0x101 TCP_MAXHLEN = 0x3c TCP_MAXOLEN = 0x28 TCP_MAXSEG = 0x2 TCP_MAXWIN = 0xffff TCP_MAX_SACK = 0x4 TCP_MAX_WINSHIFT = 0xe TCP_MINMSS = 0xd8 TCP_MSS = 0x200 TCP_NODELAY = 0x1 TCP_NOOPT = 0x8 TCP_NOPUSH = 0x4 TCP_NOTSENT_LOWAT = 0x201 TCP_RXT_CONNDROPTIME = 0x80 TCP_RXT_FINDROP = 0x100 TCP_SENDMOREACKS = 0x103 TCSAFLUSH = 0x2 TIOCCBRK = 0x2000747a TIOCCDTR = 0x20007478 TIOCCONS = 0x80047462 TIOCDCDTIMESTAMP = 0x40107458 TIOCDRAIN = 0x2000745e TIOCDSIMICROCODE = 0x20007455 TIOCEXCL = 0x2000740d TIOCEXT = 0x80047460 TIOCFLUSH = 0x80047410 TIOCGDRAINWAIT = 0x40047456 TIOCGETA = 0x40487413 TIOCGETD = 0x4004741a TIOCGPGRP = 0x40047477 TIOCGWINSZ = 0x40087468 TIOCIXOFF = 0x20007480 TIOCIXON = 0x20007481 TIOCMBIC = 0x8004746b TIOCMBIS = 0x8004746c TIOCMGDTRWAIT = 0x4004745a TIOCMGET = 0x4004746a TIOCMODG = 0x40047403 TIOCMODS = 0x80047404 TIOCMSDTRWAIT = 0x8004745b TIOCMSET = 0x8004746d TIOCM_CAR = 0x40 TIOCM_CD = 0x40 TIOCM_CTS = 0x20 TIOCM_DSR = 0x100 TIOCM_DTR = 0x2 TIOCM_LE = 0x1 TIOCM_RI = 0x80 TIOCM_RNG = 0x80 TIOCM_RTS = 0x4 TIOCM_SR = 0x10 TIOCM_ST = 0x8 TIOCNOTTY = 0x20007471 TIOCNXCL = 0x2000740e TIOCOUTQ = 0x40047473 TIOCPKT = 0x80047470 TIOCPKT_DATA = 0x0 TIOCPKT_DOSTOP = 0x20 TIOCPKT_FLUSHREAD = 0x1 TIOCPKT_FLUSHWRITE = 0x2 TIOCPKT_IOCTL = 0x40 TIOCPKT_NOSTOP = 0x10 TIOCPKT_START = 0x8 TIOCPKT_STOP = 0x4 TIOCPTYGNAME = 0x40807453 TIOCPTYGRANT = 0x20007454 TIOCPTYUNLK = 0x20007452 TIOCREMOTE = 0x80047469 TIOCSBRK = 0x2000747b TIOCSCONS = 0x20007463 TIOCSCTTY = 0x20007461 TIOCSDRAINWAIT = 0x80047457 TIOCSDTR = 0x20007479 TIOCSETA = 0x80487414 TIOCSETAF = 0x80487416 TIOCSETAW = 0x80487415 TIOCSETD = 0x8004741b TIOCSIG = 0x2000745f TIOCSPGRP = 0x80047476 TIOCSTART = 0x2000746e TIOCSTAT = 0x20007465 TIOCSTI = 0x80017472 TIOCSTOP = 0x2000746f TIOCSWINSZ = 0x80087467 TIOCTIMESTAMP = 0x40107459 TIOCUCNTL = 0x80047466 TOSTOP = 0x400000 VDISCARD = 0xf VDSUSP = 0xb VEOF = 0x0 VEOL = 0x1 VEOL2 = 0x2 VERASE = 0x3 VINTR = 0x8 VKILL = 0x5 VLNEXT = 0xe VMIN = 0x10 VM_LOADAVG = 0x2 VM_MACHFACTOR = 0x4 VM_MAXID = 0x6 VM_METER = 0x1 VM_SWAPUSAGE = 0x5 VQUIT = 0x9 VREPRINT = 0x6 VSTART = 0xc VSTATUS = 0x12 VSTOP = 0xd VSUSP = 0xa VT0 = 0x0 VT1 = 0x10000 VTDLY = 0x10000 VTIME = 0x11 VWERASE = 0x4 WCONTINUED = 0x10 WCOREFLAG = 0x80 WEXITED = 0x4 WNOHANG = 0x1 WNOWAIT = 0x20 WORDSIZE = 0x40 WSTOPPED = 0x8 WUNTRACED = 0x2 ) // Errors const ( E2BIG = syscall.Errno(0x7) EACCES = syscall.Errno(0xd) EADDRINUSE = syscall.Errno(0x30) EADDRNOTAVAIL = syscall.Errno(0x31) EAFNOSUPPORT = syscall.Errno(0x2f) EAGAIN = syscall.Errno(0x23) EALREADY = syscall.Errno(0x25) EAUTH = syscall.Errno(0x50) EBADARCH = syscall.Errno(0x56) EBADEXEC = syscall.Errno(0x55) EBADF = syscall.Errno(0x9) EBADMACHO = syscall.Errno(0x58) EBADMSG = syscall.Errno(0x5e) EBADRPC = syscall.Errno(0x48) EBUSY = syscall.Errno(0x10) ECANCELED = syscall.Errno(0x59) ECHILD = syscall.Errno(0xa) ECONNABORTED = syscall.Errno(0x35) ECONNREFUSED = syscall.Errno(0x3d) ECONNRESET = syscall.Errno(0x36) EDEADLK = syscall.Errno(0xb) EDESTADDRREQ = syscall.Errno(0x27) EDEVERR = syscall.Errno(0x53) EDOM = syscall.Errno(0x21) EDQUOT = syscall.Errno(0x45) EEXIST = syscall.Errno(0x11) EFAULT = syscall.Errno(0xe) EFBIG = syscall.Errno(0x1b) EFTYPE = syscall.Errno(0x4f) EHOSTDOWN = syscall.Errno(0x40) EHOSTUNREACH = syscall.Errno(0x41) EIDRM = syscall.Errno(0x5a) EILSEQ = syscall.Errno(0x5c) EINPROGRESS = syscall.Errno(0x24) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x38) EISDIR = syscall.Errno(0x15) ELAST = syscall.Errno(0x6a) ELOOP = syscall.Errno(0x3e) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) EMSGSIZE = syscall.Errno(0x28) EMULTIHOP = syscall.Errno(0x5f) ENAMETOOLONG = syscall.Errno(0x3f) ENEEDAUTH = syscall.Errno(0x51) ENETDOWN = syscall.Errno(0x32) ENETRESET = syscall.Errno(0x34) ENETUNREACH = syscall.Errno(0x33) ENFILE = syscall.Errno(0x17) ENOATTR = syscall.Errno(0x5d) ENOBUFS = syscall.Errno(0x37) ENODATA = syscall.Errno(0x60) ENODEV = syscall.Errno(0x13) ENOENT = syscall.Errno(0x2) ENOEXEC = syscall.Errno(0x8) ENOLCK = syscall.Errno(0x4d) ENOLINK = syscall.Errno(0x61) ENOMEM = syscall.Errno(0xc) ENOMSG = syscall.Errno(0x5b) ENOPOLICY = syscall.Errno(0x67) ENOPROTOOPT = syscall.Errno(0x2a) ENOSPC = syscall.Errno(0x1c) ENOSR = syscall.Errno(0x62) ENOSTR = syscall.Errno(0x63) ENOSYS = syscall.Errno(0x4e) ENOTBLK = syscall.Errno(0xf) ENOTCONN = syscall.Errno(0x39) ENOTDIR = syscall.Errno(0x14) ENOTEMPTY = syscall.Errno(0x42) ENOTRECOVERABLE = syscall.Errno(0x68) ENOTSOCK = syscall.Errno(0x26) ENOTSUP = syscall.Errno(0x2d) ENOTTY = syscall.Errno(0x19) ENXIO = syscall.Errno(0x6) EOPNOTSUPP = syscall.Errno(0x66) EOVERFLOW = syscall.Errno(0x54) EOWNERDEAD = syscall.Errno(0x69) EPERM = syscall.Errno(0x1) EPFNOSUPPORT = syscall.Errno(0x2e) EPIPE = syscall.Errno(0x20) EPROCLIM = syscall.Errno(0x43) EPROCUNAVAIL = syscall.Errno(0x4c) EPROGMISMATCH = syscall.Errno(0x4b) EPROGUNAVAIL = syscall.Errno(0x4a) EPROTO = syscall.Errno(0x64) EPROTONOSUPPORT = syscall.Errno(0x2b) EPROTOTYPE = syscall.Errno(0x29) EPWROFF = syscall.Errno(0x52) EQFULL = syscall.Errno(0x6a) ERANGE = syscall.Errno(0x22) EREMOTE = syscall.Errno(0x47) EROFS = syscall.Errno(0x1e) ERPCMISMATCH = syscall.Errno(0x49) ESHLIBVERS = syscall.Errno(0x57) ESHUTDOWN = syscall.Errno(0x3a) ESOCKTNOSUPPORT = syscall.Errno(0x2c) ESPIPE = syscall.Errno(0x1d) ESRCH = syscall.Errno(0x3) ESTALE = syscall.Errno(0x46) ETIME = syscall.Errno(0x65) ETIMEDOUT = syscall.Errno(0x3c) ETOOMANYREFS = syscall.Errno(0x3b) ETXTBSY = syscall.Errno(0x1a) EUSERS = syscall.Errno(0x44) EWOULDBLOCK = syscall.Errno(0x23) EXDEV = syscall.Errno(0x12) ) // Signals const ( SIGABRT = syscall.Signal(0x6) SIGALRM = syscall.Signal(0xe) SIGBUS = syscall.Signal(0xa) SIGCHLD = syscall.Signal(0x14) SIGCONT = syscall.Signal(0x13) SIGEMT = syscall.Signal(0x7) SIGFPE = syscall.Signal(0x8) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) SIGINFO = syscall.Signal(0x1d) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x17) SIGIOT = syscall.Signal(0x6) SIGKILL = syscall.Signal(0x9) SIGPIPE = syscall.Signal(0xd) SIGPROF = syscall.Signal(0x1b) SIGQUIT = syscall.Signal(0x3) SIGSEGV = syscall.Signal(0xb) SIGSTOP = syscall.Signal(0x11) SIGSYS = syscall.Signal(0xc) SIGTERM = syscall.Signal(0xf) SIGTRAP = syscall.Signal(0x5) SIGTSTP = syscall.Signal(0x12) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) SIGURG = syscall.Signal(0x10) SIGUSR1 = syscall.Signal(0x1e) SIGUSR2 = syscall.Signal(0x1f) SIGVTALRM = syscall.Signal(0x1a) SIGWINCH = syscall.Signal(0x1c) SIGXCPU = syscall.Signal(0x18) SIGXFSZ = syscall.Signal(0x19) ) // Error table var errors = [...]string{ 1: "operation not permitted", 2: "no such file or directory", 3: "no such process", 4: "interrupted system call", 5: "input/output error", 6: "device not configured", 7: "argument list too long", 8: "exec format error", 9: "bad file descriptor", 10: "no child processes", 11: "resource deadlock avoided", 12: "cannot allocate memory", 13: "permission denied", 14: "bad address", 15: "block device required", 16: "resource busy", 17: "file exists", 18: "cross-device link", 19: "operation not supported by device", 20: "not a directory", 21: "is a directory", 22: "invalid argument", 23: "too many open files in system", 24: "too many open files", 25: "inappropriate ioctl for device", 26: "text file busy", 27: "file too large", 28: "no space left on device", 29: "illegal seek", 30: "read-only file system", 31: "too many links", 32: "broken pipe", 33: "numerical argument out of domain", 34: "result too large", 35: "resource temporarily unavailable", 36: "operation now in progress", 37: "operation already in progress", 38: "socket operation on non-socket", 39: "destination address required", 40: "message too long", 41: "protocol wrong type for socket", 42: "protocol not available", 43: "protocol not supported", 44: "socket type not supported", 45: "operation not supported", 46: "protocol family not supported", 47: "address family not supported by protocol family", 48: "address already in use", 49: "can't assign requested address", 50: "network is down", 51: "network is unreachable", 52: "network dropped connection on reset", 53: "software caused connection abort", 54: "connection reset by peer", 55: "no buffer space available", 56: "socket is already connected", 57: "socket is not connected", 58: "can't send after socket shutdown", 59: "too many references: can't splice", 60: "operation timed out", 61: "connection refused", 62: "too many levels of symbolic links", 63: "file name too long", 64: "host is down", 65: "no route to host", 66: "directory not empty", 67: "too many processes", 68: "too many users", 69: "disc quota exceeded", 70: "stale NFS file handle", 71: "too many levels of remote in path", 72: "RPC struct is bad", 73: "RPC version wrong", 74: "RPC prog. not avail", 75: "program version wrong", 76: "bad procedure for program", 77: "no locks available", 78: "function not implemented", 79: "inappropriate file type or format", 80: "authentication error", 81: "need authenticator", 82: "device power is off", 83: "device error", 84: "value too large to be stored in data type", 85: "bad executable (or shared library)", 86: "bad CPU type in executable", 87: "shared library version mismatch", 88: "malformed Mach-o file", 89: "operation canceled", 90: "identifier removed", 91: "no message of desired type", 92: "illegal byte sequence", 93: "attribute not found", 94: "bad message", 95: "EMULTIHOP (Reserved)", 96: "no message available on STREAM", 97: "ENOLINK (Reserved)", 98: "no STREAM resources", 99: "not a STREAM", 100: "protocol error", 101: "STREAM ioctl timeout", 102: "operation not supported on socket", 103: "policy not found", 104: "state not recoverable", 105: "previous owner died", 106: "interface output queue is full", } // Signal table var signals = [...]string{ 1: "hangup", 2: "interrupt", 3: "quit", 4: "illegal instruction", 5: "trace/BPT trap", 6: "abort trap", 7: "EMT trap", 8: "floating point exception", 9: "killed", 10: "bus error", 11: "segmentation fault", 12: "bad system call", 13: "broken pipe", 14: "alarm clock", 15: "terminated", 16: "urgent I/O condition", 17: "suspended (signal)", 18: "suspended", 19: "continued", 20: "child exited", 21: "stopped (tty input)", 22: "stopped (tty output)", 23: "I/O possible", 24: "cputime limit exceeded", 25: "filesize limit exceeded", 26: "virtual timer expired", 27: "profiling timer expired", 28: "window size changes", 29: "information request", 30: "user defined signal 1", 31: "user defined signal 2", } ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go ================================================ // mkerrors.sh -m64 // Code generated by the command above; see README.md. DO NOT EDIT. // +build arm64,darwin // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- -m64 _const.go package unix import "syscall" const ( AF_APPLETALK = 0x10 AF_CCITT = 0xa AF_CHAOS = 0x5 AF_CNT = 0x15 AF_COIP = 0x14 AF_DATAKIT = 0x9 AF_DECnet = 0xc AF_DLI = 0xd AF_E164 = 0x1c AF_ECMA = 0x8 AF_HYLINK = 0xf AF_IEEE80211 = 0x25 AF_IMPLINK = 0x3 AF_INET = 0x2 AF_INET6 = 0x1e AF_IPX = 0x17 AF_ISDN = 0x1c AF_ISO = 0x7 AF_LAT = 0xe AF_LINK = 0x12 AF_LOCAL = 0x1 AF_MAX = 0x28 AF_NATM = 0x1f AF_NDRV = 0x1b AF_NETBIOS = 0x21 AF_NS = 0x6 AF_OSI = 0x7 AF_PPP = 0x22 AF_PUP = 0x4 AF_RESERVED_36 = 0x24 AF_ROUTE = 0x11 AF_SIP = 0x18 AF_SNA = 0xb AF_SYSTEM = 0x20 AF_UNIX = 0x1 AF_UNSPEC = 0x0 AF_UTUN = 0x26 ALTWERASE = 0x200 ATTR_BIT_MAP_COUNT = 0x5 ATTR_CMN_ACCESSMASK = 0x20000 ATTR_CMN_ACCTIME = 0x1000 ATTR_CMN_ADDEDTIME = 0x10000000 ATTR_CMN_BKUPTIME = 0x2000 ATTR_CMN_CHGTIME = 0x800 ATTR_CMN_CRTIME = 0x200 ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000 ATTR_CMN_DEVID = 0x2 ATTR_CMN_DOCUMENT_ID = 0x100000 ATTR_CMN_ERROR = 0x20000000 ATTR_CMN_EXTENDED_SECURITY = 0x400000 ATTR_CMN_FILEID = 0x2000000 ATTR_CMN_FLAGS = 0x40000 ATTR_CMN_FNDRINFO = 0x4000 ATTR_CMN_FSID = 0x4 ATTR_CMN_FULLPATH = 0x8000000 ATTR_CMN_GEN_COUNT = 0x80000 ATTR_CMN_GRPID = 0x10000 ATTR_CMN_GRPUUID = 0x1000000 ATTR_CMN_MODTIME = 0x400 ATTR_CMN_NAME = 0x1 ATTR_CMN_NAMEDATTRCOUNT = 0x80000 ATTR_CMN_NAMEDATTRLIST = 0x100000 ATTR_CMN_OBJID = 0x20 ATTR_CMN_OBJPERMANENTID = 0x40 ATTR_CMN_OBJTAG = 0x10 ATTR_CMN_OBJTYPE = 0x8 ATTR_CMN_OWNERID = 0x8000 ATTR_CMN_PARENTID = 0x4000000 ATTR_CMN_PAROBJID = 0x80 ATTR_CMN_RETURNED_ATTRS = 0x80000000 ATTR_CMN_SCRIPT = 0x100 ATTR_CMN_SETMASK = 0x41c7ff00 ATTR_CMN_USERACCESS = 0x200000 ATTR_CMN_UUID = 0x800000 ATTR_CMN_VALIDMASK = 0xffffffff ATTR_CMN_VOLSETMASK = 0x6700 ATTR_FILE_ALLOCSIZE = 0x4 ATTR_FILE_CLUMPSIZE = 0x10 ATTR_FILE_DATAALLOCSIZE = 0x400 ATTR_FILE_DATAEXTENTS = 0x800 ATTR_FILE_DATALENGTH = 0x200 ATTR_FILE_DEVTYPE = 0x20 ATTR_FILE_FILETYPE = 0x40 ATTR_FILE_FORKCOUNT = 0x80 ATTR_FILE_FORKLIST = 0x100 ATTR_FILE_IOBLOCKSIZE = 0x8 ATTR_FILE_LINKCOUNT = 0x1 ATTR_FILE_RSRCALLOCSIZE = 0x2000 ATTR_FILE_RSRCEXTENTS = 0x4000 ATTR_FILE_RSRCLENGTH = 0x1000 ATTR_FILE_SETMASK = 0x20 ATTR_FILE_TOTALSIZE = 0x2 ATTR_FILE_VALIDMASK = 0x37ff ATTR_VOL_ALLOCATIONCLUMP = 0x40 ATTR_VOL_ATTRIBUTES = 0x40000000 ATTR_VOL_CAPABILITIES = 0x20000 ATTR_VOL_DIRCOUNT = 0x400 ATTR_VOL_ENCODINGSUSED = 0x10000 ATTR_VOL_FILECOUNT = 0x200 ATTR_VOL_FSTYPE = 0x1 ATTR_VOL_INFO = 0x80000000 ATTR_VOL_IOBLOCKSIZE = 0x80 ATTR_VOL_MAXOBJCOUNT = 0x800 ATTR_VOL_MINALLOCATION = 0x20 ATTR_VOL_MOUNTEDDEVICE = 0x8000 ATTR_VOL_MOUNTFLAGS = 0x4000 ATTR_VOL_MOUNTPOINT = 0x1000 ATTR_VOL_NAME = 0x2000 ATTR_VOL_OBJCOUNT = 0x100 ATTR_VOL_QUOTA_SIZE = 0x10000000 ATTR_VOL_RESERVED_SIZE = 0x20000000 ATTR_VOL_SETMASK = 0x80002000 ATTR_VOL_SIGNATURE = 0x2 ATTR_VOL_SIZE = 0x4 ATTR_VOL_SPACEAVAIL = 0x10 ATTR_VOL_SPACEFREE = 0x8 ATTR_VOL_UUID = 0x40000 ATTR_VOL_VALIDMASK = 0xf007ffff B0 = 0x0 B110 = 0x6e B115200 = 0x1c200 B1200 = 0x4b0 B134 = 0x86 B14400 = 0x3840 B150 = 0x96 B1800 = 0x708 B19200 = 0x4b00 B200 = 0xc8 B230400 = 0x38400 B2400 = 0x960 B28800 = 0x7080 B300 = 0x12c B38400 = 0x9600 B4800 = 0x12c0 B50 = 0x32 B57600 = 0xe100 B600 = 0x258 B7200 = 0x1c20 B75 = 0x4b B76800 = 0x12c00 B9600 = 0x2580 BIOCFLUSH = 0x20004268 BIOCGBLEN = 0x40044266 BIOCGDLT = 0x4004426a BIOCGDLTLIST = 0xc00c4279 BIOCGETIF = 0x4020426b BIOCGHDRCMPLT = 0x40044274 BIOCGRSIG = 0x40044272 BIOCGRTIMEOUT = 0x4010426e BIOCGSEESENT = 0x40044276 BIOCGSTATS = 0x4008426f BIOCIMMEDIATE = 0x80044270 BIOCPROMISC = 0x20004269 BIOCSBLEN = 0xc0044266 BIOCSDLT = 0x80044278 BIOCSETF = 0x80104267 BIOCSETFNR = 0x8010427e BIOCSETIF = 0x8020426c BIOCSHDRCMPLT = 0x80044275 BIOCSRSIG = 0x80044273 BIOCSRTIMEOUT = 0x8010426d BIOCSSEESENT = 0x80044277 BIOCVERSION = 0x40044271 BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALIGNMENT = 0x4 BPF_ALU = 0x4 BPF_AND = 0x50 BPF_B = 0x10 BPF_DIV = 0x30 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 BPF_JA = 0x0 BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 BPF_JMP = 0x5 BPF_JSET = 0x40 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 BPF_LEN = 0x80 BPF_LSH = 0x60 BPF_MAJOR_VERSION = 0x1 BPF_MAXBUFSIZE = 0x80000 BPF_MAXINSNS = 0x200 BPF_MEM = 0x60 BPF_MEMWORDS = 0x10 BPF_MINBUFSIZE = 0x20 BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_OR = 0x40 BPF_RELEASE = 0x30bb6 BPF_RET = 0x6 BPF_RSH = 0x70 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 BPF_TAX = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 BRKINT = 0x2 BS0 = 0x0 BS1 = 0x8000 BSDLY = 0x8000 CFLUSH = 0xf CLOCAL = 0x8000 CLOCK_MONOTONIC = 0x6 CLOCK_MONOTONIC_RAW = 0x4 CLOCK_MONOTONIC_RAW_APPROX = 0x5 CLOCK_PROCESS_CPUTIME_ID = 0xc CLOCK_REALTIME = 0x0 CLOCK_THREAD_CPUTIME_ID = 0x10 CLOCK_UPTIME_RAW = 0x8 CLOCK_UPTIME_RAW_APPROX = 0x9 CR0 = 0x0 CR1 = 0x1000 CR2 = 0x2000 CR3 = 0x3000 CRDLY = 0x3000 CREAD = 0x800 CRTSCTS = 0x30000 CS5 = 0x0 CS6 = 0x100 CS7 = 0x200 CS8 = 0x300 CSIZE = 0x300 CSTART = 0x11 CSTATUS = 0x14 CSTOP = 0x13 CSTOPB = 0x400 CSUSP = 0x1a CTL_MAXNAME = 0xc CTL_NET = 0x4 DLT_A429 = 0xb8 DLT_A653_ICM = 0xb9 DLT_AIRONET_HEADER = 0x78 DLT_AOS = 0xde DLT_APPLE_IP_OVER_IEEE1394 = 0x8a DLT_ARCNET = 0x7 DLT_ARCNET_LINUX = 0x81 DLT_ATM_CLIP = 0x13 DLT_ATM_RFC1483 = 0xb DLT_AURORA = 0x7e DLT_AX25 = 0x3 DLT_AX25_KISS = 0xca DLT_BACNET_MS_TP = 0xa5 DLT_BLUETOOTH_HCI_H4 = 0xbb DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 DLT_CAN20B = 0xbe DLT_CAN_SOCKETCAN = 0xe3 DLT_CHAOS = 0x5 DLT_CHDLC = 0x68 DLT_CISCO_IOS = 0x76 DLT_C_HDLC = 0x68 DLT_C_HDLC_WITH_DIR = 0xcd DLT_DBUS = 0xe7 DLT_DECT = 0xdd DLT_DOCSIS = 0x8f DLT_DVB_CI = 0xeb DLT_ECONET = 0x73 DLT_EN10MB = 0x1 DLT_EN3MB = 0x2 DLT_ENC = 0x6d DLT_ERF = 0xc5 DLT_ERF_ETH = 0xaf DLT_ERF_POS = 0xb0 DLT_FC_2 = 0xe0 DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 DLT_FDDI = 0xa DLT_FLEXRAY = 0xd2 DLT_FRELAY = 0x6b DLT_FRELAY_WITH_DIR = 0xce DLT_GCOM_SERIAL = 0xad DLT_GCOM_T1E1 = 0xac DLT_GPF_F = 0xab DLT_GPF_T = 0xaa DLT_GPRS_LLC = 0xa9 DLT_GSMTAP_ABIS = 0xda DLT_GSMTAP_UM = 0xd9 DLT_HHDLC = 0x79 DLT_IBM_SN = 0x92 DLT_IBM_SP = 0x91 DLT_IEEE802 = 0x6 DLT_IEEE802_11 = 0x69 DLT_IEEE802_11_RADIO = 0x7f DLT_IEEE802_11_RADIO_AVS = 0xa3 DLT_IEEE802_15_4 = 0xc3 DLT_IEEE802_15_4_LINUX = 0xbf DLT_IEEE802_15_4_NOFCS = 0xe6 DLT_IEEE802_15_4_NONASK_PHY = 0xd7 DLT_IEEE802_16_MAC_CPS = 0xbc DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 DLT_IPFILTER = 0x74 DLT_IPMB = 0xc7 DLT_IPMB_LINUX = 0xd1 DLT_IPNET = 0xe2 DLT_IPOIB = 0xf2 DLT_IPV4 = 0xe4 DLT_IPV6 = 0xe5 DLT_IP_OVER_FC = 0x7a DLT_JUNIPER_ATM1 = 0x89 DLT_JUNIPER_ATM2 = 0x87 DLT_JUNIPER_ATM_CEMIC = 0xee DLT_JUNIPER_CHDLC = 0xb5 DLT_JUNIPER_ES = 0x84 DLT_JUNIPER_ETHER = 0xb2 DLT_JUNIPER_FIBRECHANNEL = 0xea DLT_JUNIPER_FRELAY = 0xb4 DLT_JUNIPER_GGSN = 0x85 DLT_JUNIPER_ISM = 0xc2 DLT_JUNIPER_MFR = 0x86 DLT_JUNIPER_MLFR = 0x83 DLT_JUNIPER_MLPPP = 0x82 DLT_JUNIPER_MONITOR = 0xa4 DLT_JUNIPER_PIC_PEER = 0xae DLT_JUNIPER_PPP = 0xb3 DLT_JUNIPER_PPPOE = 0xa7 DLT_JUNIPER_PPPOE_ATM = 0xa8 DLT_JUNIPER_SERVICES = 0x88 DLT_JUNIPER_SRX_E2E = 0xe9 DLT_JUNIPER_ST = 0xc8 DLT_JUNIPER_VP = 0xb7 DLT_JUNIPER_VS = 0xe8 DLT_LAPB_WITH_DIR = 0xcf DLT_LAPD = 0xcb DLT_LIN = 0xd4 DLT_LINUX_EVDEV = 0xd8 DLT_LINUX_IRDA = 0x90 DLT_LINUX_LAPD = 0xb1 DLT_LINUX_PPP_WITHDIRECTION = 0xa6 DLT_LINUX_SLL = 0x71 DLT_LOOP = 0x6c DLT_LTALK = 0x72 DLT_MATCHING_MAX = 0xf5 DLT_MATCHING_MIN = 0x68 DLT_MFR = 0xb6 DLT_MOST = 0xd3 DLT_MPEG_2_TS = 0xf3 DLT_MPLS = 0xdb DLT_MTP2 = 0x8c DLT_MTP2_WITH_PHDR = 0x8b DLT_MTP3 = 0x8d DLT_MUX27010 = 0xec DLT_NETANALYZER = 0xf0 DLT_NETANALYZER_TRANSPARENT = 0xf1 DLT_NFC_LLCP = 0xf5 DLT_NFLOG = 0xef DLT_NG40 = 0xf4 DLT_NULL = 0x0 DLT_PCI_EXP = 0x7d DLT_PFLOG = 0x75 DLT_PFSYNC = 0x12 DLT_PPI = 0xc0 DLT_PPP = 0x9 DLT_PPP_BSDOS = 0x10 DLT_PPP_ETHER = 0x33 DLT_PPP_PPPD = 0xa6 DLT_PPP_SERIAL = 0x32 DLT_PPP_WITH_DIR = 0xcc DLT_PPP_WITH_DIRECTION = 0xa6 DLT_PRISM_HEADER = 0x77 DLT_PRONET = 0x4 DLT_RAIF1 = 0xc6 DLT_RAW = 0xc DLT_RIO = 0x7c DLT_SCCP = 0x8e DLT_SITA = 0xc4 DLT_SLIP = 0x8 DLT_SLIP_BSDOS = 0xf DLT_STANAG_5066_D_PDU = 0xed DLT_SUNATM = 0x7b DLT_SYMANTEC_FIREWALL = 0x63 DLT_TZSP = 0x80 DLT_USB = 0xba DLT_USB_LINUX = 0xbd DLT_USB_LINUX_MMAPPED = 0xdc DLT_USER0 = 0x93 DLT_USER1 = 0x94 DLT_USER10 = 0x9d DLT_USER11 = 0x9e DLT_USER12 = 0x9f DLT_USER13 = 0xa0 DLT_USER14 = 0xa1 DLT_USER15 = 0xa2 DLT_USER2 = 0x95 DLT_USER3 = 0x96 DLT_USER4 = 0x97 DLT_USER5 = 0x98 DLT_USER6 = 0x99 DLT_USER7 = 0x9a DLT_USER8 = 0x9b DLT_USER9 = 0x9c DLT_WIHART = 0xdf DLT_X2E_SERIAL = 0xd5 DLT_X2E_XORAYA = 0xd6 DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 DT_FIFO = 0x1 DT_LNK = 0xa DT_REG = 0x8 DT_SOCK = 0xc DT_UNKNOWN = 0x0 DT_WHT = 0xe ECHO = 0x8 ECHOCTL = 0x40 ECHOE = 0x2 ECHOK = 0x4 ECHOKE = 0x1 ECHONL = 0x10 ECHOPRT = 0x20 EVFILT_AIO = -0x3 EVFILT_EXCEPT = -0xf EVFILT_FS = -0x9 EVFILT_MACHPORT = -0x8 EVFILT_PROC = -0x5 EVFILT_READ = -0x1 EVFILT_SIGNAL = -0x6 EVFILT_SYSCOUNT = 0xf EVFILT_THREADMARKER = 0xf EVFILT_TIMER = -0x7 EVFILT_USER = -0xa EVFILT_VM = -0xc EVFILT_VNODE = -0x4 EVFILT_WRITE = -0x2 EV_ADD = 0x1 EV_CLEAR = 0x20 EV_DELETE = 0x2 EV_DISABLE = 0x8 EV_DISPATCH = 0x80 EV_DISPATCH2 = 0x180 EV_ENABLE = 0x4 EV_EOF = 0x8000 EV_ERROR = 0x4000 EV_FLAG0 = 0x1000 EV_FLAG1 = 0x2000 EV_ONESHOT = 0x10 EV_OOBAND = 0x2000 EV_POLL = 0x1000 EV_RECEIPT = 0x40 EV_SYSFLAGS = 0xf000 EV_UDATA_SPECIFIC = 0x100 EV_VANISHED = 0x200 EXTA = 0x4b00 EXTB = 0x9600 EXTPROC = 0x800 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 FF1 = 0x4000 FFDLY = 0x4000 FLUSHO = 0x800000 FSOPT_ATTR_CMN_EXTENDED = 0x20 FSOPT_NOFOLLOW = 0x1 FSOPT_NOINMEMUPDATE = 0x2 FSOPT_PACK_INVAL_ATTRS = 0x8 FSOPT_REPORT_FULLSIZE = 0x4 F_ADDFILESIGS = 0x3d F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 F_ADDFILESIGS_RETURN = 0x61 F_ADDSIGS = 0x3b F_ALLOCATEALL = 0x4 F_ALLOCATECONTIG = 0x2 F_BARRIERFSYNC = 0x55 F_CHECK_LV = 0x62 F_CHKCLEAN = 0x29 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0x43 F_FINDSIGS = 0x4e F_FLUSH_DATA = 0x28 F_FREEZE_FS = 0x35 F_FULLFSYNC = 0x33 F_GETCODEDIR = 0x48 F_GETFD = 0x1 F_GETFL = 0x3 F_GETLK = 0x7 F_GETLKPID = 0x42 F_GETNOSIGPIPE = 0x4a F_GETOWN = 0x5 F_GETPATH = 0x32 F_GETPATH_MTMINFO = 0x47 F_GETPROTECTIONCLASS = 0x3f F_GETPROTECTIONLEVEL = 0x4d F_GLOBAL_NOCACHE = 0x37 F_LOG2PHYS = 0x31 F_LOG2PHYS_EXT = 0x41 F_NOCACHE = 0x30 F_NODIRECT = 0x3e F_OK = 0x0 F_PATHPKG_CHECK = 0x34 F_PEOFPOSMODE = 0x3 F_PREALLOCATE = 0x2a F_PUNCHHOLE = 0x63 F_RDADVISE = 0x2c F_RDAHEAD = 0x2d F_RDLCK = 0x1 F_SETBACKINGSTORE = 0x46 F_SETFD = 0x2 F_SETFL = 0x4 F_SETLK = 0x8 F_SETLKW = 0x9 F_SETLKWTIMEOUT = 0xa F_SETNOSIGPIPE = 0x49 F_SETOWN = 0x6 F_SETPROTECTIONCLASS = 0x40 F_SETSIZE = 0x2b F_SINGLE_WRITER = 0x4c F_THAW_FS = 0x36 F_TRANSCODEKEY = 0x4b F_TRIM_ACTIVE_FILE = 0x64 F_UNLCK = 0x2 F_VOLPOSMODE = 0x4 F_WRLCK = 0x3 HUPCL = 0x4000 ICANON = 0x100 ICMP6_FILTER = 0x12 ICRNL = 0x100 IEXTEN = 0x400 IFF_ALLMULTI = 0x200 IFF_ALTPHYS = 0x4000 IFF_BROADCAST = 0x2 IFF_DEBUG = 0x4 IFF_LINK0 = 0x1000 IFF_LINK1 = 0x2000 IFF_LINK2 = 0x4000 IFF_LOOPBACK = 0x8 IFF_MULTICAST = 0x8000 IFF_NOARP = 0x80 IFF_NOTRAILERS = 0x20 IFF_OACTIVE = 0x400 IFF_POINTOPOINT = 0x10 IFF_PROMISC = 0x100 IFF_RUNNING = 0x40 IFF_SIMPLEX = 0x800 IFF_UP = 0x1 IFNAMSIZ = 0x10 IFT_1822 = 0x2 IFT_AAL5 = 0x31 IFT_ARCNET = 0x23 IFT_ARCNETPLUS = 0x24 IFT_ATM = 0x25 IFT_BRIDGE = 0xd1 IFT_CARP = 0xf8 IFT_CELLULAR = 0xff IFT_CEPT = 0x13 IFT_DS3 = 0x1e IFT_ENC = 0xf4 IFT_EON = 0x19 IFT_ETHER = 0x6 IFT_FAITH = 0x38 IFT_FDDI = 0xf IFT_FRELAY = 0x20 IFT_FRELAYDCE = 0x2c IFT_GIF = 0x37 IFT_HDH1822 = 0x3 IFT_HIPPI = 0x2f IFT_HSSI = 0x2e IFT_HY = 0xe IFT_IEEE1394 = 0x90 IFT_IEEE8023ADLAG = 0x88 IFT_ISDNBASIC = 0x14 IFT_ISDNPRIMARY = 0x15 IFT_ISO88022LLC = 0x29 IFT_ISO88023 = 0x7 IFT_ISO88024 = 0x8 IFT_ISO88025 = 0x9 IFT_ISO88026 = 0xa IFT_L2VLAN = 0x87 IFT_LAPB = 0x10 IFT_LOCALTALK = 0x2a IFT_LOOP = 0x18 IFT_MIOX25 = 0x26 IFT_MODEM = 0x30 IFT_NSIP = 0x1b IFT_OTHER = 0x1 IFT_P10 = 0xc IFT_P80 = 0xd IFT_PARA = 0x22 IFT_PDP = 0xff IFT_PFLOG = 0xf5 IFT_PFSYNC = 0xf6 IFT_PKTAP = 0xfe IFT_PPP = 0x17 IFT_PROPMUX = 0x36 IFT_PROPVIRTUAL = 0x35 IFT_PTPSERIAL = 0x16 IFT_RS232 = 0x21 IFT_SDLC = 0x11 IFT_SIP = 0x1f IFT_SLIP = 0x1c IFT_SMDSDXI = 0x2b IFT_SMDSICIP = 0x34 IFT_SONET = 0x27 IFT_SONETPATH = 0x32 IFT_SONETVT = 0x33 IFT_STARLAN = 0xb IFT_STF = 0x39 IFT_T1 = 0x12 IFT_ULTRA = 0x1d IFT_V35 = 0x2d IFT_X25 = 0x5 IFT_X25DDN = 0x4 IFT_X25PLE = 0x28 IFT_XETHER = 0x1a IGNBRK = 0x1 IGNCR = 0x80 IGNPAR = 0x4 IMAXBEL = 0x2000 INLCR = 0x40 INPCK = 0x10 IN_CLASSA_HOST = 0xffffff IN_CLASSA_MAX = 0x80 IN_CLASSA_NET = 0xff000000 IN_CLASSA_NSHIFT = 0x18 IN_CLASSB_HOST = 0xffff IN_CLASSB_MAX = 0x10000 IN_CLASSB_NET = 0xffff0000 IN_CLASSB_NSHIFT = 0x10 IN_CLASSC_HOST = 0xff IN_CLASSC_NET = 0xffffff00 IN_CLASSC_NSHIFT = 0x8 IN_CLASSD_HOST = 0xfffffff IN_CLASSD_NET = 0xf0000000 IN_CLASSD_NSHIFT = 0x1c IN_LINKLOCALNETNUM = 0xa9fe0000 IN_LOOPBACKNET = 0x7f IPPROTO_3PC = 0x22 IPPROTO_ADFS = 0x44 IPPROTO_AH = 0x33 IPPROTO_AHIP = 0x3d IPPROTO_APES = 0x63 IPPROTO_ARGUS = 0xd IPPROTO_AX25 = 0x5d IPPROTO_BHA = 0x31 IPPROTO_BLT = 0x1e IPPROTO_BRSATMON = 0x4c IPPROTO_CFTP = 0x3e IPPROTO_CHAOS = 0x10 IPPROTO_CMTP = 0x26 IPPROTO_CPHB = 0x49 IPPROTO_CPNX = 0x48 IPPROTO_DDP = 0x25 IPPROTO_DGP = 0x56 IPPROTO_DIVERT = 0xfe IPPROTO_DONE = 0x101 IPPROTO_DSTOPTS = 0x3c IPPROTO_EGP = 0x8 IPPROTO_EMCON = 0xe IPPROTO_ENCAP = 0x62 IPPROTO_EON = 0x50 IPPROTO_ESP = 0x32 IPPROTO_ETHERIP = 0x61 IPPROTO_FRAGMENT = 0x2c IPPROTO_GGP = 0x3 IPPROTO_GMTP = 0x64 IPPROTO_GRE = 0x2f IPPROTO_HELLO = 0x3f IPPROTO_HMP = 0x14 IPPROTO_HOPOPTS = 0x0 IPPROTO_ICMP = 0x1 IPPROTO_ICMPV6 = 0x3a IPPROTO_IDP = 0x16 IPPROTO_IDPR = 0x23 IPPROTO_IDRP = 0x2d IPPROTO_IGMP = 0x2 IPPROTO_IGP = 0x55 IPPROTO_IGRP = 0x58 IPPROTO_IL = 0x28 IPPROTO_INLSP = 0x34 IPPROTO_INP = 0x20 IPPROTO_IP = 0x0 IPPROTO_IPCOMP = 0x6c IPPROTO_IPCV = 0x47 IPPROTO_IPEIP = 0x5e IPPROTO_IPIP = 0x4 IPPROTO_IPPC = 0x43 IPPROTO_IPV4 = 0x4 IPPROTO_IPV6 = 0x29 IPPROTO_IRTP = 0x1c IPPROTO_KRYPTOLAN = 0x41 IPPROTO_LARP = 0x5b IPPROTO_LEAF1 = 0x19 IPPROTO_LEAF2 = 0x1a IPPROTO_MAX = 0x100 IPPROTO_MAXID = 0x34 IPPROTO_MEAS = 0x13 IPPROTO_MHRP = 0x30 IPPROTO_MICP = 0x5f IPPROTO_MTP = 0x5c IPPROTO_MUX = 0x12 IPPROTO_ND = 0x4d IPPROTO_NHRP = 0x36 IPPROTO_NONE = 0x3b IPPROTO_NSP = 0x1f IPPROTO_NVPII = 0xb IPPROTO_OSPFIGP = 0x59 IPPROTO_PGM = 0x71 IPPROTO_PIGP = 0x9 IPPROTO_PIM = 0x67 IPPROTO_PRM = 0x15 IPPROTO_PUP = 0xc IPPROTO_PVP = 0x4b IPPROTO_RAW = 0xff IPPROTO_RCCMON = 0xa IPPROTO_RDP = 0x1b IPPROTO_ROUTING = 0x2b IPPROTO_RSVP = 0x2e IPPROTO_RVD = 0x42 IPPROTO_SATEXPAK = 0x40 IPPROTO_SATMON = 0x45 IPPROTO_SCCSP = 0x60 IPPROTO_SCTP = 0x84 IPPROTO_SDRP = 0x2a IPPROTO_SEP = 0x21 IPPROTO_SRPC = 0x5a IPPROTO_ST = 0x7 IPPROTO_SVMTP = 0x52 IPPROTO_SWIPE = 0x35 IPPROTO_TCF = 0x57 IPPROTO_TCP = 0x6 IPPROTO_TP = 0x1d IPPROTO_TPXX = 0x27 IPPROTO_TRUNK1 = 0x17 IPPROTO_TRUNK2 = 0x18 IPPROTO_TTP = 0x54 IPPROTO_UDP = 0x11 IPPROTO_VINES = 0x53 IPPROTO_VISA = 0x46 IPPROTO_VMTP = 0x51 IPPROTO_WBEXPAK = 0x4f IPPROTO_WBMON = 0x4e IPPROTO_WSN = 0x4a IPPROTO_XNET = 0xf IPPROTO_XTP = 0x24 IPV6_2292DSTOPTS = 0x17 IPV6_2292HOPLIMIT = 0x14 IPV6_2292HOPOPTS = 0x16 IPV6_2292NEXTHOP = 0x15 IPV6_2292PKTINFO = 0x13 IPV6_2292PKTOPTIONS = 0x19 IPV6_2292RTHDR = 0x18 IPV6_BINDV6ONLY = 0x1b IPV6_BOUND_IF = 0x7d IPV6_CHECKSUM = 0x1a IPV6_DEFAULT_MULTICAST_HOPS = 0x1 IPV6_DEFAULT_MULTICAST_LOOP = 0x1 IPV6_DEFHLIM = 0x40 IPV6_FAITH = 0x1d IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 IPV6_FLOW_ECN_MASK = 0x300 IPV6_FRAGTTL = 0x3c IPV6_FW_ADD = 0x1e IPV6_FW_DEL = 0x1f IPV6_FW_FLUSH = 0x20 IPV6_FW_GET = 0x22 IPV6_FW_ZERO = 0x21 IPV6_HLIMDEC = 0x1 IPV6_IPSEC_POLICY = 0x1c IPV6_JOIN_GROUP = 0xc IPV6_LEAVE_GROUP = 0xd IPV6_MAXHLIM = 0xff IPV6_MAXOPTHDR = 0x800 IPV6_MAXPACKET = 0xffff IPV6_MAX_GROUP_SRC_FILTER = 0x200 IPV6_MAX_MEMBERSHIPS = 0xfff IPV6_MAX_SOCK_SRC_FILTER = 0x80 IPV6_MIN_MEMBERSHIPS = 0x1f IPV6_MMTU = 0x500 IPV6_MULTICAST_HOPS = 0xa IPV6_MULTICAST_IF = 0x9 IPV6_MULTICAST_LOOP = 0xb IPV6_PORTRANGE = 0xe IPV6_PORTRANGE_DEFAULT = 0x0 IPV6_PORTRANGE_HIGH = 0x1 IPV6_PORTRANGE_LOW = 0x2 IPV6_RECVTCLASS = 0x23 IPV6_RTHDR_LOOSE = 0x0 IPV6_RTHDR_STRICT = 0x1 IPV6_RTHDR_TYPE_0 = 0x0 IPV6_SOCKOPT_RESERVED1 = 0x3 IPV6_TCLASS = 0x24 IPV6_UNICAST_HOPS = 0x4 IPV6_V6ONLY = 0x1b IPV6_VERSION = 0x60 IPV6_VERSION_MASK = 0xf0 IP_ADD_MEMBERSHIP = 0xc IP_ADD_SOURCE_MEMBERSHIP = 0x46 IP_BLOCK_SOURCE = 0x48 IP_BOUND_IF = 0x19 IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 IP_DROP_MEMBERSHIP = 0xd IP_DROP_SOURCE_MEMBERSHIP = 0x47 IP_DUMMYNET_CONFIGURE = 0x3c IP_DUMMYNET_DEL = 0x3d IP_DUMMYNET_FLUSH = 0x3e IP_DUMMYNET_GET = 0x40 IP_FAITH = 0x16 IP_FW_ADD = 0x28 IP_FW_DEL = 0x29 IP_FW_FLUSH = 0x2a IP_FW_GET = 0x2c IP_FW_RESETLOG = 0x2d IP_FW_ZERO = 0x2b IP_HDRINCL = 0x2 IP_IPSEC_POLICY = 0x15 IP_MAXPACKET = 0xffff IP_MAX_GROUP_SRC_FILTER = 0x200 IP_MAX_MEMBERSHIPS = 0xfff IP_MAX_SOCK_MUTE_FILTER = 0x80 IP_MAX_SOCK_SRC_FILTER = 0x80 IP_MF = 0x2000 IP_MIN_MEMBERSHIPS = 0x1f IP_MSFILTER = 0x4a IP_MSS = 0x240 IP_MULTICAST_IF = 0x9 IP_MULTICAST_IFINDEX = 0x42 IP_MULTICAST_LOOP = 0xb IP_MULTICAST_TTL = 0xa IP_MULTICAST_VIF = 0xe IP_NAT__XXX = 0x37 IP_OFFMASK = 0x1fff IP_OLD_FW_ADD = 0x32 IP_OLD_FW_DEL = 0x33 IP_OLD_FW_FLUSH = 0x34 IP_OLD_FW_GET = 0x36 IP_OLD_FW_RESETLOG = 0x38 IP_OLD_FW_ZERO = 0x35 IP_OPTIONS = 0x1 IP_PKTINFO = 0x1a IP_PORTRANGE = 0x13 IP_PORTRANGE_DEFAULT = 0x0 IP_PORTRANGE_HIGH = 0x1 IP_PORTRANGE_LOW = 0x2 IP_RECVDSTADDR = 0x7 IP_RECVIF = 0x14 IP_RECVOPTS = 0x5 IP_RECVPKTINFO = 0x1a IP_RECVRETOPTS = 0x6 IP_RECVTOS = 0x1b IP_RECVTTL = 0x18 IP_RETOPTS = 0x8 IP_RF = 0x8000 IP_RSVP_OFF = 0x10 IP_RSVP_ON = 0xf IP_RSVP_VIF_OFF = 0x12 IP_RSVP_VIF_ON = 0x11 IP_STRIPHDR = 0x17 IP_TOS = 0x3 IP_TRAFFIC_MGT_BACKGROUND = 0x41 IP_TTL = 0x4 IP_UNBLOCK_SOURCE = 0x49 ISIG = 0x80 ISTRIP = 0x20 IUTF8 = 0x4000 IXANY = 0x800 IXOFF = 0x400 IXON = 0x200 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 MADV_CAN_REUSE = 0x9 MADV_DONTNEED = 0x4 MADV_FREE = 0x5 MADV_FREE_REUSABLE = 0x7 MADV_FREE_REUSE = 0x8 MADV_NORMAL = 0x0 MADV_PAGEOUT = 0xa MADV_RANDOM = 0x1 MADV_SEQUENTIAL = 0x2 MADV_WILLNEED = 0x3 MADV_ZERO_WIRED_PAGES = 0x6 MAP_ANON = 0x1000 MAP_ANONYMOUS = 0x1000 MAP_COPY = 0x2 MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_HASSEMAPHORE = 0x200 MAP_JIT = 0x800 MAP_NOCACHE = 0x400 MAP_NOEXTEND = 0x100 MAP_NORESERVE = 0x40 MAP_PRIVATE = 0x2 MAP_RENAME = 0x20 MAP_RESERVED0080 = 0x80 MAP_RESILIENT_CODESIGN = 0x2000 MAP_RESILIENT_MEDIA = 0x4000 MAP_SHARED = 0x1 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MNT_ASYNC = 0x40 MNT_AUTOMOUNTED = 0x400000 MNT_CMDFLAGS = 0xf0000 MNT_CPROTECT = 0x80 MNT_DEFWRITE = 0x2000000 MNT_DONTBROWSE = 0x100000 MNT_DOVOLFS = 0x8000 MNT_DWAIT = 0x4 MNT_EXPORTED = 0x100 MNT_FORCE = 0x80000 MNT_IGNORE_OWNERSHIP = 0x200000 MNT_JOURNALED = 0x800000 MNT_LOCAL = 0x1000 MNT_MULTILABEL = 0x4000000 MNT_NOATIME = 0x10000000 MNT_NOBLOCK = 0x20000 MNT_NODEV = 0x10 MNT_NOEXEC = 0x4 MNT_NOSUID = 0x8 MNT_NOUSERXATTR = 0x1000000 MNT_NOWAIT = 0x2 MNT_QUARANTINE = 0x400 MNT_QUOTA = 0x2000 MNT_RDONLY = 0x1 MNT_RELOAD = 0x40000 MNT_ROOTFS = 0x4000 MNT_SYNCHRONOUS = 0x2 MNT_UNION = 0x20 MNT_UNKNOWNPERMISSIONS = 0x200000 MNT_UPDATE = 0x10000 MNT_VISFLAGMASK = 0x17f0f5ff MNT_WAIT = 0x1 MSG_CTRUNC = 0x20 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x80 MSG_EOF = 0x100 MSG_EOR = 0x8 MSG_FLUSH = 0x400 MSG_HAVEMORE = 0x2000 MSG_HOLD = 0x800 MSG_NEEDSA = 0x10000 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_RCVMORE = 0x4000 MSG_SEND = 0x1000 MSG_TRUNC = 0x10 MSG_WAITALL = 0x40 MSG_WAITSTREAM = 0x200 MS_ASYNC = 0x1 MS_DEACTIVATE = 0x8 MS_INVALIDATE = 0x2 MS_KILLPAGES = 0x4 MS_SYNC = 0x10 NAME_MAX = 0xff NET_RT_DUMP = 0x1 NET_RT_DUMP2 = 0x7 NET_RT_FLAGS = 0x2 NET_RT_IFLIST = 0x3 NET_RT_IFLIST2 = 0x6 NET_RT_MAXID = 0xa NET_RT_STAT = 0x4 NET_RT_TRASH = 0x5 NL0 = 0x0 NL1 = 0x100 NL2 = 0x200 NL3 = 0x300 NLDLY = 0x300 NOFLSH = 0x80000000 NOKERNINFO = 0x2000000 NOTE_ABSOLUTE = 0x8 NOTE_ATTRIB = 0x8 NOTE_BACKGROUND = 0x40 NOTE_CHILD = 0x4 NOTE_CRITICAL = 0x20 NOTE_DELETE = 0x1 NOTE_EXEC = 0x20000000 NOTE_EXIT = 0x80000000 NOTE_EXITSTATUS = 0x4000000 NOTE_EXIT_CSERROR = 0x40000 NOTE_EXIT_DECRYPTFAIL = 0x10000 NOTE_EXIT_DETAIL = 0x2000000 NOTE_EXIT_DETAIL_MASK = 0x70000 NOTE_EXIT_MEMORY = 0x20000 NOTE_EXIT_REPARENTED = 0x80000 NOTE_EXTEND = 0x4 NOTE_FFAND = 0x40000000 NOTE_FFCOPY = 0xc0000000 NOTE_FFCTRLMASK = 0xc0000000 NOTE_FFLAGSMASK = 0xffffff NOTE_FFNOP = 0x0 NOTE_FFOR = 0x80000000 NOTE_FORK = 0x40000000 NOTE_FUNLOCK = 0x100 NOTE_LEEWAY = 0x10 NOTE_LINK = 0x10 NOTE_LOWAT = 0x1 NOTE_MACH_CONTINUOUS_TIME = 0x80 NOTE_NONE = 0x80 NOTE_NSECONDS = 0x4 NOTE_OOB = 0x2 NOTE_PCTRLMASK = -0x100000 NOTE_PDATAMASK = 0xfffff NOTE_REAP = 0x10000000 NOTE_RENAME = 0x20 NOTE_REVOKE = 0x40 NOTE_SECONDS = 0x1 NOTE_SIGNAL = 0x8000000 NOTE_TRACK = 0x1 NOTE_TRACKERR = 0x2 NOTE_TRIGGER = 0x1000000 NOTE_USECONDS = 0x2 NOTE_VM_ERROR = 0x10000000 NOTE_VM_PRESSURE = 0x80000000 NOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000 NOTE_VM_PRESSURE_TERMINATE = 0x40000000 NOTE_WRITE = 0x2 OCRNL = 0x10 OFDEL = 0x20000 OFILL = 0x80 ONLCR = 0x2 ONLRET = 0x40 ONOCR = 0x20 ONOEOT = 0x8 OPOST = 0x1 OXTABS = 0x4 O_ACCMODE = 0x3 O_ALERT = 0x20000000 O_APPEND = 0x8 O_ASYNC = 0x40 O_CLOEXEC = 0x1000000 O_CREAT = 0x200 O_DIRECTORY = 0x100000 O_DP_GETRAWENCRYPTED = 0x1 O_DP_GETRAWUNENCRYPTED = 0x2 O_DSYNC = 0x400000 O_EVTONLY = 0x8000 O_EXCL = 0x800 O_EXLOCK = 0x20 O_FSYNC = 0x80 O_NDELAY = 0x4 O_NOCTTY = 0x20000 O_NOFOLLOW = 0x100 O_NONBLOCK = 0x4 O_POPUP = 0x80000000 O_RDONLY = 0x0 O_RDWR = 0x2 O_SHLOCK = 0x10 O_SYMLINK = 0x200000 O_SYNC = 0x80 O_TRUNC = 0x400 O_WRONLY = 0x1 PARENB = 0x1000 PARMRK = 0x8 PARODD = 0x2000 PENDIN = 0x20000000 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 PROT_EXEC = 0x4 PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 PT_ATTACH = 0xa PT_ATTACHEXC = 0xe PT_CONTINUE = 0x7 PT_DENY_ATTACH = 0x1f PT_DETACH = 0xb PT_FIRSTMACH = 0x20 PT_FORCEQUOTA = 0x1e PT_KILL = 0x8 PT_READ_D = 0x2 PT_READ_I = 0x1 PT_READ_U = 0x3 PT_SIGEXC = 0xc PT_STEP = 0x9 PT_THUPDATE = 0xd PT_TRACE_ME = 0x0 PT_WRITE_D = 0x5 PT_WRITE_I = 0x4 PT_WRITE_U = 0x6 RLIMIT_AS = 0x5 RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 RLIMIT_CPU_USAGE_MONITOR = 0x2 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 RLIMIT_MEMLOCK = 0x6 RLIMIT_NOFILE = 0x8 RLIMIT_NPROC = 0x7 RLIMIT_RSS = 0x5 RLIMIT_STACK = 0x3 RLIM_INFINITY = 0x7fffffffffffffff RTAX_AUTHOR = 0x6 RTAX_BRD = 0x7 RTAX_DST = 0x0 RTAX_GATEWAY = 0x1 RTAX_GENMASK = 0x3 RTAX_IFA = 0x5 RTAX_IFP = 0x4 RTAX_MAX = 0x8 RTAX_NETMASK = 0x2 RTA_AUTHOR = 0x40 RTA_BRD = 0x80 RTA_DST = 0x1 RTA_GATEWAY = 0x2 RTA_GENMASK = 0x8 RTA_IFA = 0x20 RTA_IFP = 0x10 RTA_NETMASK = 0x4 RTF_BLACKHOLE = 0x1000 RTF_BROADCAST = 0x400000 RTF_CLONING = 0x100 RTF_CONDEMNED = 0x2000000 RTF_DELCLONE = 0x80 RTF_DONE = 0x40 RTF_DYNAMIC = 0x10 RTF_GATEWAY = 0x2 RTF_HOST = 0x4 RTF_IFREF = 0x4000000 RTF_IFSCOPE = 0x1000000 RTF_LLINFO = 0x400 RTF_LOCAL = 0x200000 RTF_MODIFIED = 0x20 RTF_MULTICAST = 0x800000 RTF_NOIFREF = 0x2000 RTF_PINNED = 0x100000 RTF_PRCLONING = 0x10000 RTF_PROTO1 = 0x8000 RTF_PROTO2 = 0x4000 RTF_PROTO3 = 0x40000 RTF_PROXY = 0x8000000 RTF_REJECT = 0x8 RTF_ROUTER = 0x10000000 RTF_STATIC = 0x800 RTF_UP = 0x1 RTF_WASCLONED = 0x20000 RTF_XRESOLVE = 0x200 RTM_ADD = 0x1 RTM_CHANGE = 0x3 RTM_DELADDR = 0xd RTM_DELETE = 0x2 RTM_DELMADDR = 0x10 RTM_GET = 0x4 RTM_GET2 = 0x14 RTM_IFINFO = 0xe RTM_IFINFO2 = 0x12 RTM_LOCK = 0x8 RTM_LOSING = 0x5 RTM_MISS = 0x7 RTM_NEWADDR = 0xc RTM_NEWMADDR = 0xf RTM_NEWMADDR2 = 0x13 RTM_OLDADD = 0x9 RTM_OLDDEL = 0xa RTM_REDIRECT = 0x6 RTM_RESOLVE = 0xb RTM_RTTUNIT = 0xf4240 RTM_VERSION = 0x5 RTV_EXPIRE = 0x4 RTV_HOPCOUNT = 0x2 RTV_MTU = 0x1 RTV_RPIPE = 0x8 RTV_RTT = 0x40 RTV_RTTVAR = 0x80 RTV_SPIPE = 0x10 RTV_SSTHRESH = 0x20 RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 SCM_CREDS = 0x3 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x2 SCM_TIMESTAMP_MONOTONIC = 0x4 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 SIOCADDMULTI = 0x80206931 SIOCAIFADDR = 0x8040691a SIOCARPIPLL = 0xc0206928 SIOCATMARK = 0x40047307 SIOCAUTOADDR = 0xc0206926 SIOCAUTONETMASK = 0x80206927 SIOCDELMULTI = 0x80206932 SIOCDIFADDR = 0x80206919 SIOCDIFPHYADDR = 0x80206941 SIOCGDRVSPEC = 0xc028697b SIOCGETVLAN = 0xc020697f SIOCGHIWAT = 0x40047301 SIOCGIFADDR = 0xc0206921 SIOCGIFALTMTU = 0xc0206948 SIOCGIFASYNCMAP = 0xc020697c SIOCGIFBOND = 0xc0206947 SIOCGIFBRDADDR = 0xc0206923 SIOCGIFCAP = 0xc020695b SIOCGIFCONF = 0xc00c6924 SIOCGIFDEVMTU = 0xc0206944 SIOCGIFDSTADDR = 0xc0206922 SIOCGIFFLAGS = 0xc0206911 SIOCGIFGENERIC = 0xc020693a SIOCGIFKPI = 0xc0206987 SIOCGIFMAC = 0xc0206982 SIOCGIFMEDIA = 0xc02c6938 SIOCGIFMETRIC = 0xc0206917 SIOCGIFMTU = 0xc0206933 SIOCGIFNETMASK = 0xc0206925 SIOCGIFPDSTADDR = 0xc0206940 SIOCGIFPHYS = 0xc0206935 SIOCGIFPSRCADDR = 0xc020693f SIOCGIFSTATUS = 0xc331693d SIOCGIFVLAN = 0xc020697f SIOCGIFWAKEFLAGS = 0xc0206988 SIOCGLOWAT = 0x40047303 SIOCGPGRP = 0x40047309 SIOCIFCREATE = 0xc0206978 SIOCIFCREATE2 = 0xc020697a SIOCIFDESTROY = 0x80206979 SIOCIFGCLONERS = 0xc0106981 SIOCRSLVMULTI = 0xc010693b SIOCSDRVSPEC = 0x8028697b SIOCSETVLAN = 0x8020697e SIOCSHIWAT = 0x80047300 SIOCSIFADDR = 0x8020690c SIOCSIFALTMTU = 0x80206945 SIOCSIFASYNCMAP = 0x8020697d SIOCSIFBOND = 0x80206946 SIOCSIFBRDADDR = 0x80206913 SIOCSIFCAP = 0x8020695a SIOCSIFDSTADDR = 0x8020690e SIOCSIFFLAGS = 0x80206910 SIOCSIFGENERIC = 0x80206939 SIOCSIFKPI = 0x80206986 SIOCSIFLLADDR = 0x8020693c SIOCSIFMAC = 0x80206983 SIOCSIFMEDIA = 0xc0206937 SIOCSIFMETRIC = 0x80206918 SIOCSIFMTU = 0x80206934 SIOCSIFNETMASK = 0x80206916 SIOCSIFPHYADDR = 0x8040693e SIOCSIFPHYS = 0x80206936 SIOCSIFVLAN = 0x8020697e SIOCSLOWAT = 0x80047302 SIOCSPGRP = 0x80047308 SOCK_DGRAM = 0x2 SOCK_MAXADDRLEN = 0xff SOCK_RAW = 0x3 SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x1 SOL_SOCKET = 0xffff SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x2 SO_BROADCAST = 0x20 SO_DEBUG = 0x1 SO_DONTROUTE = 0x10 SO_DONTTRUNC = 0x2000 SO_ERROR = 0x1007 SO_KEEPALIVE = 0x8 SO_LABEL = 0x1010 SO_LINGER = 0x80 SO_LINGER_SEC = 0x1080 SO_NETSVC_MARKING_LEVEL = 0x1119 SO_NET_SERVICE_TYPE = 0x1116 SO_NKE = 0x1021 SO_NOADDRERR = 0x1023 SO_NOSIGPIPE = 0x1022 SO_NOTIFYCONFLICT = 0x1026 SO_NP_EXTENSIONS = 0x1083 SO_NREAD = 0x1020 SO_NUMRCVPKT = 0x1112 SO_NWRITE = 0x1024 SO_OOBINLINE = 0x100 SO_PEERLABEL = 0x1011 SO_RANDOMPORT = 0x1082 SO_RCVBUF = 0x1002 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x1006 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_REUSESHAREUID = 0x1025 SO_SNDBUF = 0x1001 SO_SNDLOWAT = 0x1003 SO_SNDTIMEO = 0x1005 SO_TIMESTAMP = 0x400 SO_TIMESTAMP_MONOTONIC = 0x800 SO_TYPE = 0x1008 SO_UPCALLCLOSEWAIT = 0x1027 SO_USELOOPBACK = 0x40 SO_WANTMORE = 0x4000 SO_WANTOOBFLAG = 0x8000 S_IEXEC = 0x40 S_IFBLK = 0x6000 S_IFCHR = 0x2000 S_IFDIR = 0x4000 S_IFIFO = 0x1000 S_IFLNK = 0xa000 S_IFMT = 0xf000 S_IFREG = 0x8000 S_IFSOCK = 0xc000 S_IFWHT = 0xe000 S_IREAD = 0x100 S_IRGRP = 0x20 S_IROTH = 0x4 S_IRUSR = 0x100 S_IRWXG = 0x38 S_IRWXO = 0x7 S_IRWXU = 0x1c0 S_ISGID = 0x400 S_ISTXT = 0x200 S_ISUID = 0x800 S_ISVTX = 0x200 S_IWGRP = 0x10 S_IWOTH = 0x2 S_IWRITE = 0x80 S_IWUSR = 0x80 S_IXGRP = 0x8 S_IXOTH = 0x1 S_IXUSR = 0x40 TAB0 = 0x0 TAB1 = 0x400 TAB2 = 0x800 TAB3 = 0x4 TABDLY = 0xc04 TCIFLUSH = 0x1 TCIOFF = 0x3 TCIOFLUSH = 0x3 TCION = 0x4 TCOFLUSH = 0x2 TCOOFF = 0x1 TCOON = 0x2 TCP_CONNECTIONTIMEOUT = 0x20 TCP_CONNECTION_INFO = 0x106 TCP_ENABLE_ECN = 0x104 TCP_FASTOPEN = 0x105 TCP_KEEPALIVE = 0x10 TCP_KEEPCNT = 0x102 TCP_KEEPINTVL = 0x101 TCP_MAXHLEN = 0x3c TCP_MAXOLEN = 0x28 TCP_MAXSEG = 0x2 TCP_MAXWIN = 0xffff TCP_MAX_SACK = 0x4 TCP_MAX_WINSHIFT = 0xe TCP_MINMSS = 0xd8 TCP_MSS = 0x200 TCP_NODELAY = 0x1 TCP_NOOPT = 0x8 TCP_NOPUSH = 0x4 TCP_NOTSENT_LOWAT = 0x201 TCP_RXT_CONNDROPTIME = 0x80 TCP_RXT_FINDROP = 0x100 TCP_SENDMOREACKS = 0x103 TCSAFLUSH = 0x2 TIOCCBRK = 0x2000747a TIOCCDTR = 0x20007478 TIOCCONS = 0x80047462 TIOCDCDTIMESTAMP = 0x40107458 TIOCDRAIN = 0x2000745e TIOCDSIMICROCODE = 0x20007455 TIOCEXCL = 0x2000740d TIOCEXT = 0x80047460 TIOCFLUSH = 0x80047410 TIOCGDRAINWAIT = 0x40047456 TIOCGETA = 0x40487413 TIOCGETD = 0x4004741a TIOCGPGRP = 0x40047477 TIOCGWINSZ = 0x40087468 TIOCIXOFF = 0x20007480 TIOCIXON = 0x20007481 TIOCMBIC = 0x8004746b TIOCMBIS = 0x8004746c TIOCMGDTRWAIT = 0x4004745a TIOCMGET = 0x4004746a TIOCMODG = 0x40047403 TIOCMODS = 0x80047404 TIOCMSDTRWAIT = 0x8004745b TIOCMSET = 0x8004746d TIOCM_CAR = 0x40 TIOCM_CD = 0x40 TIOCM_CTS = 0x20 TIOCM_DSR = 0x100 TIOCM_DTR = 0x2 TIOCM_LE = 0x1 TIOCM_RI = 0x80 TIOCM_RNG = 0x80 TIOCM_RTS = 0x4 TIOCM_SR = 0x10 TIOCM_ST = 0x8 TIOCNOTTY = 0x20007471 TIOCNXCL = 0x2000740e TIOCOUTQ = 0x40047473 TIOCPKT = 0x80047470 TIOCPKT_DATA = 0x0 TIOCPKT_DOSTOP = 0x20 TIOCPKT_FLUSHREAD = 0x1 TIOCPKT_FLUSHWRITE = 0x2 TIOCPKT_IOCTL = 0x40 TIOCPKT_NOSTOP = 0x10 TIOCPKT_START = 0x8 TIOCPKT_STOP = 0x4 TIOCPTYGNAME = 0x40807453 TIOCPTYGRANT = 0x20007454 TIOCPTYUNLK = 0x20007452 TIOCREMOTE = 0x80047469 TIOCSBRK = 0x2000747b TIOCSCONS = 0x20007463 TIOCSCTTY = 0x20007461 TIOCSDRAINWAIT = 0x80047457 TIOCSDTR = 0x20007479 TIOCSETA = 0x80487414 TIOCSETAF = 0x80487416 TIOCSETAW = 0x80487415 TIOCSETD = 0x8004741b TIOCSIG = 0x2000745f TIOCSPGRP = 0x80047476 TIOCSTART = 0x2000746e TIOCSTAT = 0x20007465 TIOCSTI = 0x80017472 TIOCSTOP = 0x2000746f TIOCSWINSZ = 0x80087467 TIOCTIMESTAMP = 0x40107459 TIOCUCNTL = 0x80047466 TOSTOP = 0x400000 VDISCARD = 0xf VDSUSP = 0xb VEOF = 0x0 VEOL = 0x1 VEOL2 = 0x2 VERASE = 0x3 VINTR = 0x8 VKILL = 0x5 VLNEXT = 0xe VMIN = 0x10 VM_LOADAVG = 0x2 VM_MACHFACTOR = 0x4 VM_MAXID = 0x6 VM_METER = 0x1 VM_SWAPUSAGE = 0x5 VQUIT = 0x9 VREPRINT = 0x6 VSTART = 0xc VSTATUS = 0x12 VSTOP = 0xd VSUSP = 0xa VT0 = 0x0 VT1 = 0x10000 VTDLY = 0x10000 VTIME = 0x11 VWERASE = 0x4 WCONTINUED = 0x10 WCOREFLAG = 0x80 WEXITED = 0x4 WNOHANG = 0x1 WNOWAIT = 0x20 WORDSIZE = 0x40 WSTOPPED = 0x8 WUNTRACED = 0x2 ) // Errors const ( E2BIG = syscall.Errno(0x7) EACCES = syscall.Errno(0xd) EADDRINUSE = syscall.Errno(0x30) EADDRNOTAVAIL = syscall.Errno(0x31) EAFNOSUPPORT = syscall.Errno(0x2f) EAGAIN = syscall.Errno(0x23) EALREADY = syscall.Errno(0x25) EAUTH = syscall.Errno(0x50) EBADARCH = syscall.Errno(0x56) EBADEXEC = syscall.Errno(0x55) EBADF = syscall.Errno(0x9) EBADMACHO = syscall.Errno(0x58) EBADMSG = syscall.Errno(0x5e) EBADRPC = syscall.Errno(0x48) EBUSY = syscall.Errno(0x10) ECANCELED = syscall.Errno(0x59) ECHILD = syscall.Errno(0xa) ECONNABORTED = syscall.Errno(0x35) ECONNREFUSED = syscall.Errno(0x3d) ECONNRESET = syscall.Errno(0x36) EDEADLK = syscall.Errno(0xb) EDESTADDRREQ = syscall.Errno(0x27) EDEVERR = syscall.Errno(0x53) EDOM = syscall.Errno(0x21) EDQUOT = syscall.Errno(0x45) EEXIST = syscall.Errno(0x11) EFAULT = syscall.Errno(0xe) EFBIG = syscall.Errno(0x1b) EFTYPE = syscall.Errno(0x4f) EHOSTDOWN = syscall.Errno(0x40) EHOSTUNREACH = syscall.Errno(0x41) EIDRM = syscall.Errno(0x5a) EILSEQ = syscall.Errno(0x5c) EINPROGRESS = syscall.Errno(0x24) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x38) EISDIR = syscall.Errno(0x15) ELAST = syscall.Errno(0x6a) ELOOP = syscall.Errno(0x3e) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) EMSGSIZE = syscall.Errno(0x28) EMULTIHOP = syscall.Errno(0x5f) ENAMETOOLONG = syscall.Errno(0x3f) ENEEDAUTH = syscall.Errno(0x51) ENETDOWN = syscall.Errno(0x32) ENETRESET = syscall.Errno(0x34) ENETUNREACH = syscall.Errno(0x33) ENFILE = syscall.Errno(0x17) ENOATTR = syscall.Errno(0x5d) ENOBUFS = syscall.Errno(0x37) ENODATA = syscall.Errno(0x60) ENODEV = syscall.Errno(0x13) ENOENT = syscall.Errno(0x2) ENOEXEC = syscall.Errno(0x8) ENOLCK = syscall.Errno(0x4d) ENOLINK = syscall.Errno(0x61) ENOMEM = syscall.Errno(0xc) ENOMSG = syscall.Errno(0x5b) ENOPOLICY = syscall.Errno(0x67) ENOPROTOOPT = syscall.Errno(0x2a) ENOSPC = syscall.Errno(0x1c) ENOSR = syscall.Errno(0x62) ENOSTR = syscall.Errno(0x63) ENOSYS = syscall.Errno(0x4e) ENOTBLK = syscall.Errno(0xf) ENOTCONN = syscall.Errno(0x39) ENOTDIR = syscall.Errno(0x14) ENOTEMPTY = syscall.Errno(0x42) ENOTRECOVERABLE = syscall.Errno(0x68) ENOTSOCK = syscall.Errno(0x26) ENOTSUP = syscall.Errno(0x2d) ENOTTY = syscall.Errno(0x19) ENXIO = syscall.Errno(0x6) EOPNOTSUPP = syscall.Errno(0x66) EOVERFLOW = syscall.Errno(0x54) EOWNERDEAD = syscall.Errno(0x69) EPERM = syscall.Errno(0x1) EPFNOSUPPORT = syscall.Errno(0x2e) EPIPE = syscall.Errno(0x20) EPROCLIM = syscall.Errno(0x43) EPROCUNAVAIL = syscall.Errno(0x4c) EPROGMISMATCH = syscall.Errno(0x4b) EPROGUNAVAIL = syscall.Errno(0x4a) EPROTO = syscall.Errno(0x64) EPROTONOSUPPORT = syscall.Errno(0x2b) EPROTOTYPE = syscall.Errno(0x29) EPWROFF = syscall.Errno(0x52) EQFULL = syscall.Errno(0x6a) ERANGE = syscall.Errno(0x22) EREMOTE = syscall.Errno(0x47) EROFS = syscall.Errno(0x1e) ERPCMISMATCH = syscall.Errno(0x49) ESHLIBVERS = syscall.Errno(0x57) ESHUTDOWN = syscall.Errno(0x3a) ESOCKTNOSUPPORT = syscall.Errno(0x2c) ESPIPE = syscall.Errno(0x1d) ESRCH = syscall.Errno(0x3) ESTALE = syscall.Errno(0x46) ETIME = syscall.Errno(0x65) ETIMEDOUT = syscall.Errno(0x3c) ETOOMANYREFS = syscall.Errno(0x3b) ETXTBSY = syscall.Errno(0x1a) EUSERS = syscall.Errno(0x44) EWOULDBLOCK = syscall.Errno(0x23) EXDEV = syscall.Errno(0x12) ) // Signals const ( SIGABRT = syscall.Signal(0x6) SIGALRM = syscall.Signal(0xe) SIGBUS = syscall.Signal(0xa) SIGCHLD = syscall.Signal(0x14) SIGCONT = syscall.Signal(0x13) SIGEMT = syscall.Signal(0x7) SIGFPE = syscall.Signal(0x8) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) SIGINFO = syscall.Signal(0x1d) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x17) SIGIOT = syscall.Signal(0x6) SIGKILL = syscall.Signal(0x9) SIGPIPE = syscall.Signal(0xd) SIGPROF = syscall.Signal(0x1b) SIGQUIT = syscall.Signal(0x3) SIGSEGV = syscall.Signal(0xb) SIGSTOP = syscall.Signal(0x11) SIGSYS = syscall.Signal(0xc) SIGTERM = syscall.Signal(0xf) SIGTRAP = syscall.Signal(0x5) SIGTSTP = syscall.Signal(0x12) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) SIGURG = syscall.Signal(0x10) SIGUSR1 = syscall.Signal(0x1e) SIGUSR2 = syscall.Signal(0x1f) SIGVTALRM = syscall.Signal(0x1a) SIGWINCH = syscall.Signal(0x1c) SIGXCPU = syscall.Signal(0x18) SIGXFSZ = syscall.Signal(0x19) ) // Error table var errors = [...]string{ 1: "operation not permitted", 2: "no such file or directory", 3: "no such process", 4: "interrupted system call", 5: "input/output error", 6: "device not configured", 7: "argument list too long", 8: "exec format error", 9: "bad file descriptor", 10: "no child processes", 11: "resource deadlock avoided", 12: "cannot allocate memory", 13: "permission denied", 14: "bad address", 15: "block device required", 16: "resource busy", 17: "file exists", 18: "cross-device link", 19: "operation not supported by device", 20: "not a directory", 21: "is a directory", 22: "invalid argument", 23: "too many open files in system", 24: "too many open files", 25: "inappropriate ioctl for device", 26: "text file busy", 27: "file too large", 28: "no space left on device", 29: "illegal seek", 30: "read-only file system", 31: "too many links", 32: "broken pipe", 33: "numerical argument out of domain", 34: "result too large", 35: "resource temporarily unavailable", 36: "operation now in progress", 37: "operation already in progress", 38: "socket operation on non-socket", 39: "destination address required", 40: "message too long", 41: "protocol wrong type for socket", 42: "protocol not available", 43: "protocol not supported", 44: "socket type not supported", 45: "operation not supported", 46: "protocol family not supported", 47: "address family not supported by protocol family", 48: "address already in use", 49: "can't assign requested address", 50: "network is down", 51: "network is unreachable", 52: "network dropped connection on reset", 53: "software caused connection abort", 54: "connection reset by peer", 55: "no buffer space available", 56: "socket is already connected", 57: "socket is not connected", 58: "can't send after socket shutdown", 59: "too many references: can't splice", 60: "operation timed out", 61: "connection refused", 62: "too many levels of symbolic links", 63: "file name too long", 64: "host is down", 65: "no route to host", 66: "directory not empty", 67: "too many processes", 68: "too many users", 69: "disc quota exceeded", 70: "stale NFS file handle", 71: "too many levels of remote in path", 72: "RPC struct is bad", 73: "RPC version wrong", 74: "RPC prog. not avail", 75: "program version wrong", 76: "bad procedure for program", 77: "no locks available", 78: "function not implemented", 79: "inappropriate file type or format", 80: "authentication error", 81: "need authenticator", 82: "device power is off", 83: "device error", 84: "value too large to be stored in data type", 85: "bad executable (or shared library)", 86: "bad CPU type in executable", 87: "shared library version mismatch", 88: "malformed Mach-o file", 89: "operation canceled", 90: "identifier removed", 91: "no message of desired type", 92: "illegal byte sequence", 93: "attribute not found", 94: "bad message", 95: "EMULTIHOP (Reserved)", 96: "no message available on STREAM", 97: "ENOLINK (Reserved)", 98: "no STREAM resources", 99: "not a STREAM", 100: "protocol error", 101: "STREAM ioctl timeout", 102: "operation not supported on socket", 103: "policy not found", 104: "state not recoverable", 105: "previous owner died", 106: "interface output queue is full", } // Signal table var signals = [...]string{ 1: "hangup", 2: "interrupt", 3: "quit", 4: "illegal instruction", 5: "trace/BPT trap", 6: "abort trap", 7: "EMT trap", 8: "floating point exception", 9: "killed", 10: "bus error", 11: "segmentation fault", 12: "bad system call", 13: "broken pipe", 14: "alarm clock", 15: "terminated", 16: "urgent I/O condition", 17: "suspended (signal)", 18: "suspended", 19: "continued", 20: "child exited", 21: "stopped (tty input)", 22: "stopped (tty output)", 23: "I/O possible", 24: "cputime limit exceeded", 25: "filesize limit exceeded", 26: "virtual timer expired", 27: "profiling timer expired", 28: "window size changes", 29: "information request", 30: "user defined signal 1", 31: "user defined signal 2", } ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go ================================================ // mkerrors.sh -m64 // Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,dragonfly // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- -m64 _const.go package unix import "syscall" const ( AF_APPLETALK = 0x10 AF_ATM = 0x1e AF_BLUETOOTH = 0x21 AF_CCITT = 0xa AF_CHAOS = 0x5 AF_CNT = 0x15 AF_COIP = 0x14 AF_DATAKIT = 0x9 AF_DECnet = 0xc AF_DLI = 0xd AF_E164 = 0x1a AF_ECMA = 0x8 AF_HYLINK = 0xf AF_IEEE80211 = 0x23 AF_IMPLINK = 0x3 AF_INET = 0x2 AF_INET6 = 0x1c AF_IPX = 0x17 AF_ISDN = 0x1a AF_ISO = 0x7 AF_LAT = 0xe AF_LINK = 0x12 AF_LOCAL = 0x1 AF_MAX = 0x24 AF_MPLS = 0x22 AF_NATM = 0x1d AF_NETBIOS = 0x6 AF_NETGRAPH = 0x20 AF_OSI = 0x7 AF_PUP = 0x4 AF_ROUTE = 0x11 AF_SIP = 0x18 AF_SNA = 0xb AF_UNIX = 0x1 AF_UNSPEC = 0x0 ALTWERASE = 0x200 B0 = 0x0 B110 = 0x6e B115200 = 0x1c200 B1200 = 0x4b0 B134 = 0x86 B14400 = 0x3840 B150 = 0x96 B1800 = 0x708 B19200 = 0x4b00 B200 = 0xc8 B230400 = 0x38400 B2400 = 0x960 B28800 = 0x7080 B300 = 0x12c B38400 = 0x9600 B4800 = 0x12c0 B50 = 0x32 B57600 = 0xe100 B600 = 0x258 B7200 = 0x1c20 B75 = 0x4b B76800 = 0x12c00 B9600 = 0x2580 BIOCFLUSH = 0x20004268 BIOCGBLEN = 0x40044266 BIOCGDLT = 0x4004426a BIOCGDLTLIST = 0xc0104279 BIOCGETIF = 0x4020426b BIOCGHDRCMPLT = 0x40044274 BIOCGRSIG = 0x40044272 BIOCGRTIMEOUT = 0x4010426e BIOCGSEESENT = 0x40044276 BIOCGSTATS = 0x4008426f BIOCIMMEDIATE = 0x80044270 BIOCLOCK = 0x2000427a BIOCPROMISC = 0x20004269 BIOCSBLEN = 0xc0044266 BIOCSDLT = 0x80044278 BIOCSETF = 0x80104267 BIOCSETIF = 0x8020426c BIOCSETWF = 0x8010427b BIOCSHDRCMPLT = 0x80044275 BIOCSRSIG = 0x80044273 BIOCSRTIMEOUT = 0x8010426d BIOCSSEESENT = 0x80044277 BIOCVERSION = 0x40044271 BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALIGNMENT = 0x8 BPF_ALU = 0x4 BPF_AND = 0x50 BPF_B = 0x10 BPF_DEFAULTBUFSIZE = 0x1000 BPF_DIV = 0x30 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 BPF_JA = 0x0 BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 BPF_JMP = 0x5 BPF_JSET = 0x40 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 BPF_LEN = 0x80 BPF_LSH = 0x60 BPF_MAJOR_VERSION = 0x1 BPF_MAXBUFSIZE = 0x80000 BPF_MAXINSNS = 0x200 BPF_MAX_CLONES = 0x80 BPF_MEM = 0x60 BPF_MEMWORDS = 0x10 BPF_MINBUFSIZE = 0x20 BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_OR = 0x40 BPF_RELEASE = 0x30bb6 BPF_RET = 0x6 BPF_RSH = 0x70 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 BPF_TAX = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 BRKINT = 0x2 CFLUSH = 0xf CLOCAL = 0x8000 CLOCK_MONOTONIC = 0x4 CLOCK_MONOTONIC_FAST = 0xc CLOCK_MONOTONIC_PRECISE = 0xb CLOCK_PROCESS_CPUTIME_ID = 0xf CLOCK_PROF = 0x2 CLOCK_REALTIME = 0x0 CLOCK_REALTIME_FAST = 0xa CLOCK_REALTIME_PRECISE = 0x9 CLOCK_SECOND = 0xd CLOCK_THREAD_CPUTIME_ID = 0xe CLOCK_UPTIME = 0x5 CLOCK_UPTIME_FAST = 0x8 CLOCK_UPTIME_PRECISE = 0x7 CLOCK_VIRTUAL = 0x1 CREAD = 0x800 CRTSCTS = 0x30000 CS5 = 0x0 CS6 = 0x100 CS7 = 0x200 CS8 = 0x300 CSIZE = 0x300 CSTART = 0x11 CSTATUS = 0x14 CSTOP = 0x13 CSTOPB = 0x400 CSUSP = 0x1a CTL_MAXNAME = 0xc CTL_NET = 0x4 DLT_A429 = 0xb8 DLT_A653_ICM = 0xb9 DLT_AIRONET_HEADER = 0x78 DLT_APPLE_IP_OVER_IEEE1394 = 0x8a DLT_ARCNET = 0x7 DLT_ARCNET_LINUX = 0x81 DLT_ATM_CLIP = 0x13 DLT_ATM_RFC1483 = 0xb DLT_AURORA = 0x7e DLT_AX25 = 0x3 DLT_AX25_KISS = 0xca DLT_BACNET_MS_TP = 0xa5 DLT_BLUETOOTH_HCI_H4 = 0xbb DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 DLT_CAN20B = 0xbe DLT_CHAOS = 0x5 DLT_CHDLC = 0x68 DLT_CISCO_IOS = 0x76 DLT_C_HDLC = 0x68 DLT_C_HDLC_WITH_DIR = 0xcd DLT_DOCSIS = 0x8f DLT_ECONET = 0x73 DLT_EN10MB = 0x1 DLT_EN3MB = 0x2 DLT_ENC = 0x6d DLT_ERF = 0xc5 DLT_ERF_ETH = 0xaf DLT_ERF_POS = 0xb0 DLT_FDDI = 0xa DLT_FLEXRAY = 0xd2 DLT_FRELAY = 0x6b DLT_FRELAY_WITH_DIR = 0xce DLT_GCOM_SERIAL = 0xad DLT_GCOM_T1E1 = 0xac DLT_GPF_F = 0xab DLT_GPF_T = 0xaa DLT_GPRS_LLC = 0xa9 DLT_HHDLC = 0x79 DLT_IBM_SN = 0x92 DLT_IBM_SP = 0x91 DLT_IEEE802 = 0x6 DLT_IEEE802_11 = 0x69 DLT_IEEE802_11_RADIO = 0x7f DLT_IEEE802_11_RADIO_AVS = 0xa3 DLT_IEEE802_15_4 = 0xc3 DLT_IEEE802_15_4_LINUX = 0xbf DLT_IEEE802_15_4_NONASK_PHY = 0xd7 DLT_IEEE802_16_MAC_CPS = 0xbc DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 DLT_IPFILTER = 0x74 DLT_IPMB = 0xc7 DLT_IPMB_LINUX = 0xd1 DLT_IP_OVER_FC = 0x7a DLT_JUNIPER_ATM1 = 0x89 DLT_JUNIPER_ATM2 = 0x87 DLT_JUNIPER_CHDLC = 0xb5 DLT_JUNIPER_ES = 0x84 DLT_JUNIPER_ETHER = 0xb2 DLT_JUNIPER_FRELAY = 0xb4 DLT_JUNIPER_GGSN = 0x85 DLT_JUNIPER_ISM = 0xc2 DLT_JUNIPER_MFR = 0x86 DLT_JUNIPER_MLFR = 0x83 DLT_JUNIPER_MLPPP = 0x82 DLT_JUNIPER_MONITOR = 0xa4 DLT_JUNIPER_PIC_PEER = 0xae DLT_JUNIPER_PPP = 0xb3 DLT_JUNIPER_PPPOE = 0xa7 DLT_JUNIPER_PPPOE_ATM = 0xa8 DLT_JUNIPER_SERVICES = 0x88 DLT_JUNIPER_ST = 0xc8 DLT_JUNIPER_VP = 0xb7 DLT_LAPB_WITH_DIR = 0xcf DLT_LAPD = 0xcb DLT_LIN = 0xd4 DLT_LINUX_IRDA = 0x90 DLT_LINUX_LAPD = 0xb1 DLT_LINUX_SLL = 0x71 DLT_LOOP = 0x6c DLT_LTALK = 0x72 DLT_MFR = 0xb6 DLT_MOST = 0xd3 DLT_MTP2 = 0x8c DLT_MTP2_WITH_PHDR = 0x8b DLT_MTP3 = 0x8d DLT_NULL = 0x0 DLT_PCI_EXP = 0x7d DLT_PFLOG = 0x75 DLT_PFSYNC = 0x12 DLT_PPI = 0xc0 DLT_PPP = 0x9 DLT_PPP_BSDOS = 0x10 DLT_PPP_ETHER = 0x33 DLT_PPP_PPPD = 0xa6 DLT_PPP_SERIAL = 0x32 DLT_PPP_WITH_DIR = 0xcc DLT_PRISM_HEADER = 0x77 DLT_PRONET = 0x4 DLT_RAIF1 = 0xc6 DLT_RAW = 0xc DLT_REDBACK_SMARTEDGE = 0x20 DLT_RIO = 0x7c DLT_SCCP = 0x8e DLT_SITA = 0xc4 DLT_SLIP = 0x8 DLT_SLIP_BSDOS = 0xf DLT_SUNATM = 0x7b DLT_SYMANTEC_FIREWALL = 0x63 DLT_TZSP = 0x80 DLT_USB = 0xba DLT_USB_LINUX = 0xbd DLT_X2E_SERIAL = 0xd5 DLT_X2E_XORAYA = 0xd6 DT_BLK = 0x6 DT_CHR = 0x2 DT_DBF = 0xf DT_DIR = 0x4 DT_FIFO = 0x1 DT_LNK = 0xa DT_REG = 0x8 DT_SOCK = 0xc DT_UNKNOWN = 0x0 DT_WHT = 0xe ECHO = 0x8 ECHOCTL = 0x40 ECHOE = 0x2 ECHOK = 0x4 ECHOKE = 0x1 ECHONL = 0x10 ECHOPRT = 0x20 EVFILT_AIO = -0x3 EVFILT_EXCEPT = -0x8 EVFILT_FS = -0xa EVFILT_MARKER = 0xf EVFILT_PROC = -0x5 EVFILT_READ = -0x1 EVFILT_SIGNAL = -0x6 EVFILT_SYSCOUNT = 0xa EVFILT_TIMER = -0x7 EVFILT_USER = -0x9 EVFILT_VNODE = -0x4 EVFILT_WRITE = -0x2 EV_ADD = 0x1 EV_CLEAR = 0x20 EV_DELETE = 0x2 EV_DISABLE = 0x8 EV_DISPATCH = 0x80 EV_ENABLE = 0x4 EV_EOF = 0x8000 EV_ERROR = 0x4000 EV_FLAG1 = 0x2000 EV_NODATA = 0x1000 EV_ONESHOT = 0x10 EV_RECEIPT = 0x40 EV_SYSFLAGS = 0xf000 EXTA = 0x4b00 EXTB = 0x9600 EXTEXIT_LWP = 0x10000 EXTEXIT_PROC = 0x0 EXTEXIT_SETINT = 0x1 EXTEXIT_SIMPLE = 0x0 EXTPROC = 0x800 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FLUSHO = 0x800000 F_DUP2FD = 0xa F_DUP2FD_CLOEXEC = 0x12 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0x11 F_GETFD = 0x1 F_GETFL = 0x3 F_GETLK = 0x7 F_GETOWN = 0x5 F_OK = 0x0 F_RDLCK = 0x1 F_SETFD = 0x2 F_SETFL = 0x4 F_SETLK = 0x8 F_SETLKW = 0x9 F_SETOWN = 0x6 F_UNLCK = 0x2 F_WRLCK = 0x3 HUPCL = 0x4000 ICANON = 0x100 ICMP6_FILTER = 0x12 ICRNL = 0x100 IEXTEN = 0x400 IFAN_ARRIVAL = 0x0 IFAN_DEPARTURE = 0x1 IFF_ALLMULTI = 0x200 IFF_ALTPHYS = 0x4000 IFF_BROADCAST = 0x2 IFF_CANTCHANGE = 0x118e72 IFF_DEBUG = 0x4 IFF_LINK0 = 0x1000 IFF_LINK1 = 0x2000 IFF_LINK2 = 0x4000 IFF_LOOPBACK = 0x8 IFF_MONITOR = 0x40000 IFF_MULTICAST = 0x8000 IFF_NOARP = 0x80 IFF_NPOLLING = 0x100000 IFF_OACTIVE = 0x400 IFF_OACTIVE_COMPAT = 0x400 IFF_POINTOPOINT = 0x10 IFF_POLLING = 0x10000 IFF_POLLING_COMPAT = 0x10000 IFF_PPROMISC = 0x20000 IFF_PROMISC = 0x100 IFF_RUNNING = 0x40 IFF_SIMPLEX = 0x800 IFF_SMART = 0x20 IFF_STATICARP = 0x80000 IFF_UP = 0x1 IFNAMSIZ = 0x10 IFT_1822 = 0x2 IFT_A12MPPSWITCH = 0x82 IFT_AAL2 = 0xbb IFT_AAL5 = 0x31 IFT_ADSL = 0x5e IFT_AFLANE8023 = 0x3b IFT_AFLANE8025 = 0x3c IFT_ARAP = 0x58 IFT_ARCNET = 0x23 IFT_ARCNETPLUS = 0x24 IFT_ASYNC = 0x54 IFT_ATM = 0x25 IFT_ATMDXI = 0x69 IFT_ATMFUNI = 0x6a IFT_ATMIMA = 0x6b IFT_ATMLOGICAL = 0x50 IFT_ATMRADIO = 0xbd IFT_ATMSUBINTERFACE = 0x86 IFT_ATMVCIENDPT = 0xc2 IFT_ATMVIRTUAL = 0x95 IFT_BGPPOLICYACCOUNTING = 0xa2 IFT_BRIDGE = 0xd1 IFT_BSC = 0x53 IFT_CARP = 0xf8 IFT_CCTEMUL = 0x3d IFT_CEPT = 0x13 IFT_CES = 0x85 IFT_CHANNEL = 0x46 IFT_CNR = 0x55 IFT_COFFEE = 0x84 IFT_COMPOSITELINK = 0x9b IFT_DCN = 0x8d IFT_DIGITALPOWERLINE = 0x8a IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba IFT_DLSW = 0x4a IFT_DOCSCABLEDOWNSTREAM = 0x80 IFT_DOCSCABLEMACLAYER = 0x7f IFT_DOCSCABLEUPSTREAM = 0x81 IFT_DS0 = 0x51 IFT_DS0BUNDLE = 0x52 IFT_DS1FDL = 0xaa IFT_DS3 = 0x1e IFT_DTM = 0x8c IFT_DVBASILN = 0xac IFT_DVBASIOUT = 0xad IFT_DVBRCCDOWNSTREAM = 0x93 IFT_DVBRCCMACLAYER = 0x92 IFT_DVBRCCUPSTREAM = 0x94 IFT_ENC = 0xf4 IFT_EON = 0x19 IFT_EPLRS = 0x57 IFT_ESCON = 0x49 IFT_ETHER = 0x6 IFT_FAITH = 0xf2 IFT_FAST = 0x7d IFT_FASTETHER = 0x3e IFT_FASTETHERFX = 0x45 IFT_FDDI = 0xf IFT_FIBRECHANNEL = 0x38 IFT_FRAMERELAYINTERCONNECT = 0x3a IFT_FRAMERELAYMPI = 0x5c IFT_FRDLCIENDPT = 0xc1 IFT_FRELAY = 0x20 IFT_FRELAYDCE = 0x2c IFT_FRF16MFRBUNDLE = 0xa3 IFT_FRFORWARD = 0x9e IFT_G703AT2MB = 0x43 IFT_G703AT64K = 0x42 IFT_GIF = 0xf0 IFT_GIGABITETHERNET = 0x75 IFT_GR303IDT = 0xb2 IFT_GR303RDT = 0xb1 IFT_H323GATEKEEPER = 0xa4 IFT_H323PROXY = 0xa5 IFT_HDH1822 = 0x3 IFT_HDLC = 0x76 IFT_HDSL2 = 0xa8 IFT_HIPERLAN2 = 0xb7 IFT_HIPPI = 0x2f IFT_HIPPIINTERFACE = 0x39 IFT_HOSTPAD = 0x5a IFT_HSSI = 0x2e IFT_HY = 0xe IFT_IBM370PARCHAN = 0x48 IFT_IDSL = 0x9a IFT_IEEE1394 = 0x90 IFT_IEEE80211 = 0x47 IFT_IEEE80212 = 0x37 IFT_IEEE8023ADLAG = 0xa1 IFT_IFGSN = 0x91 IFT_IMT = 0xbe IFT_INTERLEAVE = 0x7c IFT_IP = 0x7e IFT_IPFORWARD = 0x8e IFT_IPOVERATM = 0x72 IFT_IPOVERCDLC = 0x6d IFT_IPOVERCLAW = 0x6e IFT_IPSWITCH = 0x4e IFT_ISDN = 0x3f IFT_ISDNBASIC = 0x14 IFT_ISDNPRIMARY = 0x15 IFT_ISDNS = 0x4b IFT_ISDNU = 0x4c IFT_ISO88022LLC = 0x29 IFT_ISO88023 = 0x7 IFT_ISO88024 = 0x8 IFT_ISO88025 = 0x9 IFT_ISO88025CRFPINT = 0x62 IFT_ISO88025DTR = 0x56 IFT_ISO88025FIBER = 0x73 IFT_ISO88026 = 0xa IFT_ISUP = 0xb3 IFT_L2VLAN = 0x87 IFT_L3IPVLAN = 0x88 IFT_L3IPXVLAN = 0x89 IFT_LAPB = 0x10 IFT_LAPD = 0x4d IFT_LAPF = 0x77 IFT_LOCALTALK = 0x2a IFT_LOOP = 0x18 IFT_MEDIAMAILOVERIP = 0x8b IFT_MFSIGLINK = 0xa7 IFT_MIOX25 = 0x26 IFT_MODEM = 0x30 IFT_MPC = 0x71 IFT_MPLS = 0xa6 IFT_MPLSTUNNEL = 0x96 IFT_MSDSL = 0x8f IFT_MVL = 0xbf IFT_MYRINET = 0x63 IFT_NFAS = 0xaf IFT_NSIP = 0x1b IFT_OPTICALCHANNEL = 0xc3 IFT_OPTICALTRANSPORT = 0xc4 IFT_OTHER = 0x1 IFT_P10 = 0xc IFT_P80 = 0xd IFT_PARA = 0x22 IFT_PFLOG = 0xf5 IFT_PFSYNC = 0xf6 IFT_PLC = 0xae IFT_POS = 0xab IFT_PPP = 0x17 IFT_PPPMULTILINKBUNDLE = 0x6c IFT_PROPBWAP2MP = 0xb8 IFT_PROPCNLS = 0x59 IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 IFT_PROPMUX = 0x36 IFT_PROPVIRTUAL = 0x35 IFT_PROPWIRELESSP2P = 0x9d IFT_PTPSERIAL = 0x16 IFT_PVC = 0xf1 IFT_QLLC = 0x44 IFT_RADIOMAC = 0xbc IFT_RADSL = 0x5f IFT_REACHDSL = 0xc0 IFT_RFC1483 = 0x9f IFT_RS232 = 0x21 IFT_RSRB = 0x4f IFT_SDLC = 0x11 IFT_SDSL = 0x60 IFT_SHDSL = 0xa9 IFT_SIP = 0x1f IFT_SLIP = 0x1c IFT_SMDSDXI = 0x2b IFT_SMDSICIP = 0x34 IFT_SONET = 0x27 IFT_SONETOVERHEADCHANNEL = 0xb9 IFT_SONETPATH = 0x32 IFT_SONETVT = 0x33 IFT_SRP = 0x97 IFT_SS7SIGLINK = 0x9c IFT_STACKTOSTACK = 0x6f IFT_STARLAN = 0xb IFT_STF = 0xf3 IFT_T1 = 0x12 IFT_TDLC = 0x74 IFT_TERMPAD = 0x5b IFT_TR008 = 0xb0 IFT_TRANSPHDLC = 0x7b IFT_TUNNEL = 0x83 IFT_ULTRA = 0x1d IFT_USB = 0xa0 IFT_V11 = 0x40 IFT_V35 = 0x2d IFT_V36 = 0x41 IFT_V37 = 0x78 IFT_VDSL = 0x61 IFT_VIRTUALIPADDRESS = 0x70 IFT_VOICEEM = 0x64 IFT_VOICEENCAP = 0x67 IFT_VOICEFXO = 0x65 IFT_VOICEFXS = 0x66 IFT_VOICEOVERATM = 0x98 IFT_VOICEOVERFRAMERELAY = 0x99 IFT_VOICEOVERIP = 0x68 IFT_X213 = 0x5d IFT_X25 = 0x5 IFT_X25DDN = 0x4 IFT_X25HUNTGROUP = 0x7a IFT_X25MLP = 0x79 IFT_X25PLE = 0x28 IFT_XETHER = 0x1a IGNBRK = 0x1 IGNCR = 0x80 IGNPAR = 0x4 IMAXBEL = 0x2000 INLCR = 0x40 INPCK = 0x10 IN_CLASSA_HOST = 0xffffff IN_CLASSA_MAX = 0x80 IN_CLASSA_NET = 0xff000000 IN_CLASSA_NSHIFT = 0x18 IN_CLASSB_HOST = 0xffff IN_CLASSB_MAX = 0x10000 IN_CLASSB_NET = 0xffff0000 IN_CLASSB_NSHIFT = 0x10 IN_CLASSC_HOST = 0xff IN_CLASSC_NET = 0xffffff00 IN_CLASSC_NSHIFT = 0x8 IN_CLASSD_HOST = 0xfffffff IN_CLASSD_NET = 0xf0000000 IN_CLASSD_NSHIFT = 0x1c IN_LOOPBACKNET = 0x7f IPPROTO_3PC = 0x22 IPPROTO_ADFS = 0x44 IPPROTO_AH = 0x33 IPPROTO_AHIP = 0x3d IPPROTO_APES = 0x63 IPPROTO_ARGUS = 0xd IPPROTO_AX25 = 0x5d IPPROTO_BHA = 0x31 IPPROTO_BLT = 0x1e IPPROTO_BRSATMON = 0x4c IPPROTO_CARP = 0x70 IPPROTO_CFTP = 0x3e IPPROTO_CHAOS = 0x10 IPPROTO_CMTP = 0x26 IPPROTO_CPHB = 0x49 IPPROTO_CPNX = 0x48 IPPROTO_DDP = 0x25 IPPROTO_DGP = 0x56 IPPROTO_DIVERT = 0xfe IPPROTO_DONE = 0x101 IPPROTO_DSTOPTS = 0x3c IPPROTO_EGP = 0x8 IPPROTO_EMCON = 0xe IPPROTO_ENCAP = 0x62 IPPROTO_EON = 0x50 IPPROTO_ESP = 0x32 IPPROTO_ETHERIP = 0x61 IPPROTO_FRAGMENT = 0x2c IPPROTO_GGP = 0x3 IPPROTO_GMTP = 0x64 IPPROTO_GRE = 0x2f IPPROTO_HELLO = 0x3f IPPROTO_HMP = 0x14 IPPROTO_HOPOPTS = 0x0 IPPROTO_ICMP = 0x1 IPPROTO_ICMPV6 = 0x3a IPPROTO_IDP = 0x16 IPPROTO_IDPR = 0x23 IPPROTO_IDRP = 0x2d IPPROTO_IGMP = 0x2 IPPROTO_IGP = 0x55 IPPROTO_IGRP = 0x58 IPPROTO_IL = 0x28 IPPROTO_INLSP = 0x34 IPPROTO_INP = 0x20 IPPROTO_IP = 0x0 IPPROTO_IPCOMP = 0x6c IPPROTO_IPCV = 0x47 IPPROTO_IPEIP = 0x5e IPPROTO_IPIP = 0x4 IPPROTO_IPPC = 0x43 IPPROTO_IPV4 = 0x4 IPPROTO_IPV6 = 0x29 IPPROTO_IRTP = 0x1c IPPROTO_KRYPTOLAN = 0x41 IPPROTO_LARP = 0x5b IPPROTO_LEAF1 = 0x19 IPPROTO_LEAF2 = 0x1a IPPROTO_MAX = 0x100 IPPROTO_MAXID = 0x34 IPPROTO_MEAS = 0x13 IPPROTO_MHRP = 0x30 IPPROTO_MICP = 0x5f IPPROTO_MOBILE = 0x37 IPPROTO_MTP = 0x5c IPPROTO_MUX = 0x12 IPPROTO_ND = 0x4d IPPROTO_NHRP = 0x36 IPPROTO_NONE = 0x3b IPPROTO_NSP = 0x1f IPPROTO_NVPII = 0xb IPPROTO_OSPFIGP = 0x59 IPPROTO_PFSYNC = 0xf0 IPPROTO_PGM = 0x71 IPPROTO_PIGP = 0x9 IPPROTO_PIM = 0x67 IPPROTO_PRM = 0x15 IPPROTO_PUP = 0xc IPPROTO_PVP = 0x4b IPPROTO_RAW = 0xff IPPROTO_RCCMON = 0xa IPPROTO_RDP = 0x1b IPPROTO_ROUTING = 0x2b IPPROTO_RSVP = 0x2e IPPROTO_RVD = 0x42 IPPROTO_SATEXPAK = 0x40 IPPROTO_SATMON = 0x45 IPPROTO_SCCSP = 0x60 IPPROTO_SDRP = 0x2a IPPROTO_SEP = 0x21 IPPROTO_SKIP = 0x39 IPPROTO_SRPC = 0x5a IPPROTO_ST = 0x7 IPPROTO_SVMTP = 0x52 IPPROTO_SWIPE = 0x35 IPPROTO_TCF = 0x57 IPPROTO_TCP = 0x6 IPPROTO_TLSP = 0x38 IPPROTO_TP = 0x1d IPPROTO_TPXX = 0x27 IPPROTO_TRUNK1 = 0x17 IPPROTO_TRUNK2 = 0x18 IPPROTO_TTP = 0x54 IPPROTO_UDP = 0x11 IPPROTO_UNKNOWN = 0x102 IPPROTO_VINES = 0x53 IPPROTO_VISA = 0x46 IPPROTO_VMTP = 0x51 IPPROTO_WBEXPAK = 0x4f IPPROTO_WBMON = 0x4e IPPROTO_WSN = 0x4a IPPROTO_XNET = 0xf IPPROTO_XTP = 0x24 IPV6_AUTOFLOWLABEL = 0x3b IPV6_BINDV6ONLY = 0x1b IPV6_CHECKSUM = 0x1a IPV6_DEFAULT_MULTICAST_HOPS = 0x1 IPV6_DEFAULT_MULTICAST_LOOP = 0x1 IPV6_DEFHLIM = 0x40 IPV6_DONTFRAG = 0x3e IPV6_DSTOPTS = 0x32 IPV6_FAITH = 0x1d IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 IPV6_FRAGTTL = 0x78 IPV6_FW_ADD = 0x1e IPV6_FW_DEL = 0x1f IPV6_FW_FLUSH = 0x20 IPV6_FW_GET = 0x22 IPV6_FW_ZERO = 0x21 IPV6_HLIMDEC = 0x1 IPV6_HOPLIMIT = 0x2f IPV6_HOPOPTS = 0x31 IPV6_IPSEC_POLICY = 0x1c IPV6_JOIN_GROUP = 0xc IPV6_LEAVE_GROUP = 0xd IPV6_MAXHLIM = 0xff IPV6_MAXPACKET = 0xffff IPV6_MINHLIM = 0x28 IPV6_MMTU = 0x500 IPV6_MSFILTER = 0x4a IPV6_MULTICAST_HOPS = 0xa IPV6_MULTICAST_IF = 0x9 IPV6_MULTICAST_LOOP = 0xb IPV6_NEXTHOP = 0x30 IPV6_PATHMTU = 0x2c IPV6_PKTINFO = 0x2e IPV6_PKTOPTIONS = 0x34 IPV6_PORTRANGE = 0xe IPV6_PORTRANGE_DEFAULT = 0x0 IPV6_PORTRANGE_HIGH = 0x1 IPV6_PORTRANGE_LOW = 0x2 IPV6_PREFER_TEMPADDR = 0x3f IPV6_RECVDSTOPTS = 0x28 IPV6_RECVHOPLIMIT = 0x25 IPV6_RECVHOPOPTS = 0x27 IPV6_RECVPATHMTU = 0x2b IPV6_RECVPKTINFO = 0x24 IPV6_RECVRTHDR = 0x26 IPV6_RECVTCLASS = 0x39 IPV6_RTHDR = 0x33 IPV6_RTHDRDSTOPTS = 0x23 IPV6_RTHDR_LOOSE = 0x0 IPV6_RTHDR_STRICT = 0x1 IPV6_RTHDR_TYPE_0 = 0x0 IPV6_SOCKOPT_RESERVED1 = 0x3 IPV6_TCLASS = 0x3d IPV6_UNICAST_HOPS = 0x4 IPV6_USE_MIN_MTU = 0x2a IPV6_V6ONLY = 0x1b IPV6_VERSION = 0x60 IPV6_VERSION_MASK = 0xf0 IP_ADD_MEMBERSHIP = 0xc IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 IP_DROP_MEMBERSHIP = 0xd IP_DUMMYNET_CONFIGURE = 0x3c IP_DUMMYNET_DEL = 0x3d IP_DUMMYNET_FLUSH = 0x3e IP_DUMMYNET_GET = 0x40 IP_FAITH = 0x16 IP_FW_ADD = 0x32 IP_FW_DEL = 0x33 IP_FW_FLUSH = 0x34 IP_FW_GET = 0x36 IP_FW_RESETLOG = 0x37 IP_FW_X = 0x31 IP_FW_ZERO = 0x35 IP_HDRINCL = 0x2 IP_IPSEC_POLICY = 0x15 IP_MAXPACKET = 0xffff IP_MAX_MEMBERSHIPS = 0x14 IP_MF = 0x2000 IP_MINTTL = 0x42 IP_MSS = 0x240 IP_MULTICAST_IF = 0x9 IP_MULTICAST_LOOP = 0xb IP_MULTICAST_TTL = 0xa IP_MULTICAST_VIF = 0xe IP_OFFMASK = 0x1fff IP_OPTIONS = 0x1 IP_PORTRANGE = 0x13 IP_PORTRANGE_DEFAULT = 0x0 IP_PORTRANGE_HIGH = 0x1 IP_PORTRANGE_LOW = 0x2 IP_RECVDSTADDR = 0x7 IP_RECVIF = 0x14 IP_RECVOPTS = 0x5 IP_RECVRETOPTS = 0x6 IP_RECVTTL = 0x41 IP_RETOPTS = 0x8 IP_RF = 0x8000 IP_RSVP_OFF = 0x10 IP_RSVP_ON = 0xf IP_RSVP_VIF_OFF = 0x12 IP_RSVP_VIF_ON = 0x11 IP_TOS = 0x3 IP_TTL = 0x4 ISIG = 0x80 ISTRIP = 0x20 IXANY = 0x800 IXOFF = 0x400 IXON = 0x200 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 MADV_AUTOSYNC = 0x7 MADV_CONTROL_END = 0xb MADV_CONTROL_START = 0xa MADV_CORE = 0x9 MADV_DONTNEED = 0x4 MADV_FREE = 0x5 MADV_INVAL = 0xa MADV_NOCORE = 0x8 MADV_NORMAL = 0x0 MADV_NOSYNC = 0x6 MADV_RANDOM = 0x1 MADV_SEQUENTIAL = 0x2 MADV_SETMAP = 0xb MADV_WILLNEED = 0x3 MAP_ANON = 0x1000 MAP_ANONYMOUS = 0x1000 MAP_COPY = 0x2 MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_HASSEMAPHORE = 0x200 MAP_INHERIT = 0x80 MAP_NOCORE = 0x20000 MAP_NOEXTEND = 0x100 MAP_NORESERVE = 0x40 MAP_NOSYNC = 0x800 MAP_PRIVATE = 0x2 MAP_RENAME = 0x20 MAP_SHARED = 0x1 MAP_SIZEALIGN = 0x40000 MAP_STACK = 0x400 MAP_TRYFIXED = 0x10000 MAP_VPAGETABLE = 0x2000 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MSG_CMSG_CLOEXEC = 0x1000 MSG_CTRUNC = 0x20 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x80 MSG_EOF = 0x100 MSG_EOR = 0x8 MSG_FBLOCKING = 0x10000 MSG_FMASK = 0xffff0000 MSG_FNONBLOCKING = 0x20000 MSG_NOSIGNAL = 0x400 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_SYNC = 0x800 MSG_TRUNC = 0x10 MSG_UNUSED09 = 0x200 MSG_WAITALL = 0x40 MS_ASYNC = 0x1 MS_INVALIDATE = 0x2 MS_SYNC = 0x0 NAME_MAX = 0xff NET_RT_DUMP = 0x1 NET_RT_FLAGS = 0x2 NET_RT_IFLIST = 0x3 NET_RT_MAXID = 0x4 NOFLSH = 0x80000000 NOKERNINFO = 0x2000000 NOTE_ATTRIB = 0x8 NOTE_CHILD = 0x4 NOTE_DELETE = 0x1 NOTE_EXEC = 0x20000000 NOTE_EXIT = 0x80000000 NOTE_EXTEND = 0x4 NOTE_FFAND = 0x40000000 NOTE_FFCOPY = 0xc0000000 NOTE_FFCTRLMASK = 0xc0000000 NOTE_FFLAGSMASK = 0xffffff NOTE_FFNOP = 0x0 NOTE_FFOR = 0x80000000 NOTE_FORK = 0x40000000 NOTE_LINK = 0x10 NOTE_LOWAT = 0x1 NOTE_OOB = 0x2 NOTE_PCTRLMASK = 0xf0000000 NOTE_PDATAMASK = 0xfffff NOTE_RENAME = 0x20 NOTE_REVOKE = 0x40 NOTE_TRACK = 0x1 NOTE_TRACKERR = 0x2 NOTE_TRIGGER = 0x1000000 NOTE_WRITE = 0x2 OCRNL = 0x10 ONLCR = 0x2 ONLRET = 0x40 ONOCR = 0x20 ONOEOT = 0x8 OPOST = 0x1 OXTABS = 0x4 O_ACCMODE = 0x3 O_APPEND = 0x8 O_ASYNC = 0x40 O_CLOEXEC = 0x20000 O_CREAT = 0x200 O_DIRECT = 0x10000 O_DIRECTORY = 0x8000000 O_EXCL = 0x800 O_EXLOCK = 0x20 O_FAPPEND = 0x100000 O_FASYNCWRITE = 0x800000 O_FBLOCKING = 0x40000 O_FMASK = 0xfc0000 O_FNONBLOCKING = 0x80000 O_FOFFSET = 0x200000 O_FSYNC = 0x80 O_FSYNCWRITE = 0x400000 O_NDELAY = 0x4 O_NOCTTY = 0x8000 O_NOFOLLOW = 0x100 O_NONBLOCK = 0x4 O_RDONLY = 0x0 O_RDWR = 0x2 O_SHLOCK = 0x10 O_SYNC = 0x80 O_TRUNC = 0x400 O_WRONLY = 0x1 PARENB = 0x1000 PARMRK = 0x8 PARODD = 0x2000 PENDIN = 0x20000000 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 PROT_EXEC = 0x4 PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 RLIMIT_AS = 0xa RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 RLIMIT_NOFILE = 0x8 RLIMIT_STACK = 0x3 RLIM_INFINITY = 0x7fffffffffffffff RTAX_AUTHOR = 0x6 RTAX_BRD = 0x7 RTAX_DST = 0x0 RTAX_GATEWAY = 0x1 RTAX_GENMASK = 0x3 RTAX_IFA = 0x5 RTAX_IFP = 0x4 RTAX_MAX = 0xb RTAX_MPLS1 = 0x8 RTAX_MPLS2 = 0x9 RTAX_MPLS3 = 0xa RTAX_NETMASK = 0x2 RTA_AUTHOR = 0x40 RTA_BRD = 0x80 RTA_DST = 0x1 RTA_GATEWAY = 0x2 RTA_GENMASK = 0x8 RTA_IFA = 0x20 RTA_IFP = 0x10 RTA_MPLS1 = 0x100 RTA_MPLS2 = 0x200 RTA_MPLS3 = 0x400 RTA_NETMASK = 0x4 RTF_BLACKHOLE = 0x1000 RTF_BROADCAST = 0x400000 RTF_CLONING = 0x100 RTF_DONE = 0x40 RTF_DYNAMIC = 0x10 RTF_GATEWAY = 0x2 RTF_HOST = 0x4 RTF_LLINFO = 0x400 RTF_LOCAL = 0x200000 RTF_MODIFIED = 0x20 RTF_MPLSOPS = 0x1000000 RTF_MULTICAST = 0x800000 RTF_PINNED = 0x100000 RTF_PRCLONING = 0x10000 RTF_PROTO1 = 0x8000 RTF_PROTO2 = 0x4000 RTF_PROTO3 = 0x40000 RTF_REJECT = 0x8 RTF_STATIC = 0x800 RTF_UP = 0x1 RTF_WASCLONED = 0x20000 RTF_XRESOLVE = 0x200 RTM_ADD = 0x1 RTM_CHANGE = 0x3 RTM_DELADDR = 0xd RTM_DELETE = 0x2 RTM_DELMADDR = 0x10 RTM_GET = 0x4 RTM_IEEE80211 = 0x12 RTM_IFANNOUNCE = 0x11 RTM_IFINFO = 0xe RTM_LOCK = 0x8 RTM_LOSING = 0x5 RTM_MISS = 0x7 RTM_NEWADDR = 0xc RTM_NEWMADDR = 0xf RTM_OLDADD = 0x9 RTM_OLDDEL = 0xa RTM_REDIRECT = 0x6 RTM_RESOLVE = 0xb RTM_RTTUNIT = 0xf4240 RTM_VERSION = 0x6 RTV_EXPIRE = 0x4 RTV_HOPCOUNT = 0x2 RTV_IWCAPSEGS = 0x400 RTV_IWMAXSEGS = 0x200 RTV_MSL = 0x100 RTV_MTU = 0x1 RTV_RPIPE = 0x8 RTV_RTT = 0x40 RTV_RTTVAR = 0x80 RTV_SPIPE = 0x10 RTV_SSTHRESH = 0x20 RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 SCM_CREDS = 0x3 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x2 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 SIOCADDMULTI = 0x80206931 SIOCADDRT = 0x8040720a SIOCAIFADDR = 0x8040691a SIOCALIFADDR = 0x8118691b SIOCATMARK = 0x40047307 SIOCDELMULTI = 0x80206932 SIOCDELRT = 0x8040720b SIOCDIFADDR = 0x80206919 SIOCDIFPHYADDR = 0x80206949 SIOCDLIFADDR = 0x8118691d SIOCGDRVSPEC = 0xc028697b SIOCGETSGCNT = 0xc0207210 SIOCGETVIFCNT = 0xc028720f SIOCGHIWAT = 0x40047301 SIOCGIFADDR = 0xc0206921 SIOCGIFBRDADDR = 0xc0206923 SIOCGIFCAP = 0xc020691f SIOCGIFCONF = 0xc0106924 SIOCGIFDATA = 0xc0206926 SIOCGIFDSTADDR = 0xc0206922 SIOCGIFFLAGS = 0xc0206911 SIOCGIFGENERIC = 0xc020693a SIOCGIFGMEMB = 0xc028698a SIOCGIFINDEX = 0xc0206920 SIOCGIFMEDIA = 0xc0306938 SIOCGIFMETRIC = 0xc0206917 SIOCGIFMTU = 0xc0206933 SIOCGIFNETMASK = 0xc0206925 SIOCGIFPDSTADDR = 0xc0206948 SIOCGIFPHYS = 0xc0206935 SIOCGIFPOLLCPU = 0xc020697e SIOCGIFPSRCADDR = 0xc0206947 SIOCGIFSTATUS = 0xc331693b SIOCGIFTSOLEN = 0xc0206980 SIOCGLIFADDR = 0xc118691c SIOCGLIFPHYADDR = 0xc118694b SIOCGLOWAT = 0x40047303 SIOCGPGRP = 0x40047309 SIOCGPRIVATE_0 = 0xc0206950 SIOCGPRIVATE_1 = 0xc0206951 SIOCIFCREATE = 0xc020697a SIOCIFCREATE2 = 0xc020697c SIOCIFDESTROY = 0x80206979 SIOCIFGCLONERS = 0xc0106978 SIOCSDRVSPEC = 0x8028697b SIOCSHIWAT = 0x80047300 SIOCSIFADDR = 0x8020690c SIOCSIFBRDADDR = 0x80206913 SIOCSIFCAP = 0x8020691e SIOCSIFDSTADDR = 0x8020690e SIOCSIFFLAGS = 0x80206910 SIOCSIFGENERIC = 0x80206939 SIOCSIFLLADDR = 0x8020693c SIOCSIFMEDIA = 0xc0206937 SIOCSIFMETRIC = 0x80206918 SIOCSIFMTU = 0x80206934 SIOCSIFNAME = 0x80206928 SIOCSIFNETMASK = 0x80206916 SIOCSIFPHYADDR = 0x80406946 SIOCSIFPHYS = 0x80206936 SIOCSIFPOLLCPU = 0x8020697d SIOCSIFTSOLEN = 0x8020697f SIOCSLIFPHYADDR = 0x8118694a SIOCSLOWAT = 0x80047302 SIOCSPGRP = 0x80047308 SOCK_CLOEXEC = 0x10000000 SOCK_DGRAM = 0x2 SOCK_MAXADDRLEN = 0xff SOCK_NONBLOCK = 0x20000000 SOCK_RAW = 0x3 SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x1 SOL_SOCKET = 0xffff SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x2 SO_ACCEPTFILTER = 0x1000 SO_BROADCAST = 0x20 SO_CPUHINT = 0x1030 SO_DEBUG = 0x1 SO_DONTROUTE = 0x10 SO_ERROR = 0x1007 SO_KEEPALIVE = 0x8 SO_LINGER = 0x80 SO_NOSIGPIPE = 0x800 SO_OOBINLINE = 0x100 SO_RCVBUF = 0x1002 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x1006 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_SNDBUF = 0x1001 SO_SNDLOWAT = 0x1003 SO_SNDSPACE = 0x100a SO_SNDTIMEO = 0x1005 SO_TIMESTAMP = 0x400 SO_TYPE = 0x1008 SO_USELOOPBACK = 0x40 TCIFLUSH = 0x1 TCIOFF = 0x3 TCIOFLUSH = 0x3 TCION = 0x4 TCOFLUSH = 0x2 TCOOFF = 0x1 TCOON = 0x2 TCP_FASTKEEP = 0x80 TCP_KEEPCNT = 0x400 TCP_KEEPIDLE = 0x100 TCP_KEEPINIT = 0x20 TCP_KEEPINTVL = 0x200 TCP_MAXBURST = 0x4 TCP_MAXHLEN = 0x3c TCP_MAXOLEN = 0x28 TCP_MAXSEG = 0x2 TCP_MAXWIN = 0xffff TCP_MAX_WINSHIFT = 0xe TCP_MINMSS = 0x100 TCP_MIN_WINSHIFT = 0x5 TCP_MSS = 0x200 TCP_NODELAY = 0x1 TCP_NOOPT = 0x8 TCP_NOPUSH = 0x4 TCP_SIGNATURE_ENABLE = 0x10 TCSAFLUSH = 0x2 TIOCCBRK = 0x2000747a TIOCCDTR = 0x20007478 TIOCCONS = 0x80047462 TIOCDCDTIMESTAMP = 0x40107458 TIOCDRAIN = 0x2000745e TIOCEXCL = 0x2000740d TIOCEXT = 0x80047460 TIOCFLUSH = 0x80047410 TIOCGDRAINWAIT = 0x40047456 TIOCGETA = 0x402c7413 TIOCGETD = 0x4004741a TIOCGPGRP = 0x40047477 TIOCGSID = 0x40047463 TIOCGSIZE = 0x40087468 TIOCGWINSZ = 0x40087468 TIOCISPTMASTER = 0x20007455 TIOCMBIC = 0x8004746b TIOCMBIS = 0x8004746c TIOCMGDTRWAIT = 0x4004745a TIOCMGET = 0x4004746a TIOCMODG = 0x40047403 TIOCMODS = 0x80047404 TIOCMSDTRWAIT = 0x8004745b TIOCMSET = 0x8004746d TIOCM_CAR = 0x40 TIOCM_CD = 0x40 TIOCM_CTS = 0x20 TIOCM_DSR = 0x100 TIOCM_DTR = 0x2 TIOCM_LE = 0x1 TIOCM_RI = 0x80 TIOCM_RNG = 0x80 TIOCM_RTS = 0x4 TIOCM_SR = 0x10 TIOCM_ST = 0x8 TIOCNOTTY = 0x20007471 TIOCNXCL = 0x2000740e TIOCOUTQ = 0x40047473 TIOCPKT = 0x80047470 TIOCPKT_DATA = 0x0 TIOCPKT_DOSTOP = 0x20 TIOCPKT_FLUSHREAD = 0x1 TIOCPKT_FLUSHWRITE = 0x2 TIOCPKT_IOCTL = 0x40 TIOCPKT_NOSTOP = 0x10 TIOCPKT_START = 0x8 TIOCPKT_STOP = 0x4 TIOCREMOTE = 0x80047469 TIOCSBRK = 0x2000747b TIOCSCTTY = 0x20007461 TIOCSDRAINWAIT = 0x80047457 TIOCSDTR = 0x20007479 TIOCSETA = 0x802c7414 TIOCSETAF = 0x802c7416 TIOCSETAW = 0x802c7415 TIOCSETD = 0x8004741b TIOCSIG = 0x2000745f TIOCSPGRP = 0x80047476 TIOCSSIZE = 0x80087467 TIOCSTART = 0x2000746e TIOCSTAT = 0x20007465 TIOCSTI = 0x80017472 TIOCSTOP = 0x2000746f TIOCSWINSZ = 0x80087467 TIOCTIMESTAMP = 0x40107459 TIOCUCNTL = 0x80047466 TOSTOP = 0x400000 VCHECKPT = 0x13 VDISCARD = 0xf VDSUSP = 0xb VEOF = 0x0 VEOL = 0x1 VEOL2 = 0x2 VERASE = 0x3 VERASE2 = 0x7 VINTR = 0x8 VKILL = 0x5 VLNEXT = 0xe VMIN = 0x10 VM_BCACHE_SIZE_MAX = 0x0 VM_SWZONE_SIZE_MAX = 0x4000000000 VQUIT = 0x9 VREPRINT = 0x6 VSTART = 0xc VSTATUS = 0x12 VSTOP = 0xd VSUSP = 0xa VTIME = 0x11 VWERASE = 0x4 WCONTINUED = 0x4 WCOREFLAG = 0x80 WLINUXCLONE = 0x80000000 WNOHANG = 0x1 WSTOPPED = 0x7f WUNTRACED = 0x2 ) // Errors const ( E2BIG = syscall.Errno(0x7) EACCES = syscall.Errno(0xd) EADDRINUSE = syscall.Errno(0x30) EADDRNOTAVAIL = syscall.Errno(0x31) EAFNOSUPPORT = syscall.Errno(0x2f) EAGAIN = syscall.Errno(0x23) EALREADY = syscall.Errno(0x25) EASYNC = syscall.Errno(0x63) EAUTH = syscall.Errno(0x50) EBADF = syscall.Errno(0x9) EBADMSG = syscall.Errno(0x59) EBADRPC = syscall.Errno(0x48) EBUSY = syscall.Errno(0x10) ECANCELED = syscall.Errno(0x55) ECHILD = syscall.Errno(0xa) ECONNABORTED = syscall.Errno(0x35) ECONNREFUSED = syscall.Errno(0x3d) ECONNRESET = syscall.Errno(0x36) EDEADLK = syscall.Errno(0xb) EDESTADDRREQ = syscall.Errno(0x27) EDOM = syscall.Errno(0x21) EDOOFUS = syscall.Errno(0x58) EDQUOT = syscall.Errno(0x45) EEXIST = syscall.Errno(0x11) EFAULT = syscall.Errno(0xe) EFBIG = syscall.Errno(0x1b) EFTYPE = syscall.Errno(0x4f) EHOSTDOWN = syscall.Errno(0x40) EHOSTUNREACH = syscall.Errno(0x41) EIDRM = syscall.Errno(0x52) EILSEQ = syscall.Errno(0x56) EINPROGRESS = syscall.Errno(0x24) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x38) EISDIR = syscall.Errno(0x15) ELAST = syscall.Errno(0x63) ELOOP = syscall.Errno(0x3e) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) EMSGSIZE = syscall.Errno(0x28) EMULTIHOP = syscall.Errno(0x5a) ENAMETOOLONG = syscall.Errno(0x3f) ENEEDAUTH = syscall.Errno(0x51) ENETDOWN = syscall.Errno(0x32) ENETRESET = syscall.Errno(0x34) ENETUNREACH = syscall.Errno(0x33) ENFILE = syscall.Errno(0x17) ENOATTR = syscall.Errno(0x57) ENOBUFS = syscall.Errno(0x37) ENODEV = syscall.Errno(0x13) ENOENT = syscall.Errno(0x2) ENOEXEC = syscall.Errno(0x8) ENOLCK = syscall.Errno(0x4d) ENOLINK = syscall.Errno(0x5b) ENOMEDIUM = syscall.Errno(0x5d) ENOMEM = syscall.Errno(0xc) ENOMSG = syscall.Errno(0x53) ENOPROTOOPT = syscall.Errno(0x2a) ENOSPC = syscall.Errno(0x1c) ENOSYS = syscall.Errno(0x4e) ENOTBLK = syscall.Errno(0xf) ENOTCONN = syscall.Errno(0x39) ENOTDIR = syscall.Errno(0x14) ENOTEMPTY = syscall.Errno(0x42) ENOTSOCK = syscall.Errno(0x26) ENOTSUP = syscall.Errno(0x2d) ENOTTY = syscall.Errno(0x19) ENXIO = syscall.Errno(0x6) EOPNOTSUPP = syscall.Errno(0x2d) EOVERFLOW = syscall.Errno(0x54) EPERM = syscall.Errno(0x1) EPFNOSUPPORT = syscall.Errno(0x2e) EPIPE = syscall.Errno(0x20) EPROCLIM = syscall.Errno(0x43) EPROCUNAVAIL = syscall.Errno(0x4c) EPROGMISMATCH = syscall.Errno(0x4b) EPROGUNAVAIL = syscall.Errno(0x4a) EPROTO = syscall.Errno(0x5c) EPROTONOSUPPORT = syscall.Errno(0x2b) EPROTOTYPE = syscall.Errno(0x29) ERANGE = syscall.Errno(0x22) EREMOTE = syscall.Errno(0x47) EROFS = syscall.Errno(0x1e) ERPCMISMATCH = syscall.Errno(0x49) ESHUTDOWN = syscall.Errno(0x3a) ESOCKTNOSUPPORT = syscall.Errno(0x2c) ESPIPE = syscall.Errno(0x1d) ESRCH = syscall.Errno(0x3) ESTALE = syscall.Errno(0x46) ETIMEDOUT = syscall.Errno(0x3c) ETOOMANYREFS = syscall.Errno(0x3b) ETXTBSY = syscall.Errno(0x1a) EUNUSED94 = syscall.Errno(0x5e) EUNUSED95 = syscall.Errno(0x5f) EUNUSED96 = syscall.Errno(0x60) EUNUSED97 = syscall.Errno(0x61) EUNUSED98 = syscall.Errno(0x62) EUSERS = syscall.Errno(0x44) EWOULDBLOCK = syscall.Errno(0x23) EXDEV = syscall.Errno(0x12) ) // Signals const ( SIGABRT = syscall.Signal(0x6) SIGALRM = syscall.Signal(0xe) SIGBUS = syscall.Signal(0xa) SIGCHLD = syscall.Signal(0x14) SIGCKPT = syscall.Signal(0x21) SIGCKPTEXIT = syscall.Signal(0x22) SIGCONT = syscall.Signal(0x13) SIGEMT = syscall.Signal(0x7) SIGFPE = syscall.Signal(0x8) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) SIGINFO = syscall.Signal(0x1d) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x17) SIGIOT = syscall.Signal(0x6) SIGKILL = syscall.Signal(0x9) SIGPIPE = syscall.Signal(0xd) SIGPROF = syscall.Signal(0x1b) SIGQUIT = syscall.Signal(0x3) SIGSEGV = syscall.Signal(0xb) SIGSTOP = syscall.Signal(0x11) SIGSYS = syscall.Signal(0xc) SIGTERM = syscall.Signal(0xf) SIGTHR = syscall.Signal(0x20) SIGTRAP = syscall.Signal(0x5) SIGTSTP = syscall.Signal(0x12) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) SIGURG = syscall.Signal(0x10) SIGUSR1 = syscall.Signal(0x1e) SIGUSR2 = syscall.Signal(0x1f) SIGVTALRM = syscall.Signal(0x1a) SIGWINCH = syscall.Signal(0x1c) SIGXCPU = syscall.Signal(0x18) SIGXFSZ = syscall.Signal(0x19) ) // Error table var errors = [...]string{ 1: "operation not permitted", 2: "no such file or directory", 3: "no such process", 4: "interrupted system call", 5: "input/output error", 6: "device not configured", 7: "argument list too long", 8: "exec format error", 9: "bad file descriptor", 10: "no child processes", 11: "resource deadlock avoided", 12: "cannot allocate memory", 13: "permission denied", 14: "bad address", 15: "block device required", 16: "device busy", 17: "file exists", 18: "cross-device link", 19: "operation not supported by device", 20: "not a directory", 21: "is a directory", 22: "invalid argument", 23: "too many open files in system", 24: "too many open files", 25: "inappropriate ioctl for device", 26: "text file busy", 27: "file too large", 28: "no space left on device", 29: "illegal seek", 30: "read-only file system", 31: "too many links", 32: "broken pipe", 33: "numerical argument out of domain", 34: "result too large", 35: "resource temporarily unavailable", 36: "operation now in progress", 37: "operation already in progress", 38: "socket operation on non-socket", 39: "destination address required", 40: "message too long", 41: "protocol wrong type for socket", 42: "protocol not available", 43: "protocol not supported", 44: "socket type not supported", 45: "operation not supported", 46: "protocol family not supported", 47: "address family not supported by protocol family", 48: "address already in use", 49: "can't assign requested address", 50: "network is down", 51: "network is unreachable", 52: "network dropped connection on reset", 53: "software caused connection abort", 54: "connection reset by peer", 55: "no buffer space available", 56: "socket is already connected", 57: "socket is not connected", 58: "can't send after socket shutdown", 59: "too many references: can't splice", 60: "operation timed out", 61: "connection refused", 62: "too many levels of symbolic links", 63: "file name too long", 64: "host is down", 65: "no route to host", 66: "directory not empty", 67: "too many processes", 68: "too many users", 69: "disc quota exceeded", 70: "stale NFS file handle", 71: "too many levels of remote in path", 72: "RPC struct is bad", 73: "RPC version wrong", 74: "RPC prog. not avail", 75: "program version wrong", 76: "bad procedure for program", 77: "no locks available", 78: "function not implemented", 79: "inappropriate file type or format", 80: "authentication error", 81: "need authenticator", 82: "identifier removed", 83: "no message of desired type", 84: "value too large to be stored in data type", 85: "operation canceled", 86: "illegal byte sequence", 87: "attribute not found", 88: "programming error", 89: "bad message", 90: "multihop attempted", 91: "link has been severed", 92: "protocol error", 93: "no medium found", 94: "unknown error: 94", 95: "unknown error: 95", 96: "unknown error: 96", 97: "unknown error: 97", 98: "unknown error: 98", 99: "unknown error: 99", } // Signal table var signals = [...]string{ 1: "hangup", 2: "interrupt", 3: "quit", 4: "illegal instruction", 5: "trace/BPT trap", 6: "abort trap", 7: "EMT trap", 8: "floating point exception", 9: "killed", 10: "bus error", 11: "segmentation fault", 12: "bad system call", 13: "broken pipe", 14: "alarm clock", 15: "terminated", 16: "urgent I/O condition", 17: "suspended (signal)", 18: "suspended", 19: "continued", 20: "child exited", 21: "stopped (tty input)", 22: "stopped (tty output)", 23: "I/O possible", 24: "cputime limit exceeded", 25: "filesize limit exceeded", 26: "virtual timer expired", 27: "profiling timer expired", 28: "window size changes", 29: "information request", 30: "user defined signal 1", 31: "user defined signal 2", 32: "thread Scheduler", 33: "checkPoint", 34: "checkPointExit", } ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go ================================================ // mkerrors.sh -m32 // Code generated by the command above; see README.md. DO NOT EDIT. // +build 386,freebsd // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- -m32 _const.go package unix import "syscall" const ( AF_APPLETALK = 0x10 AF_ARP = 0x23 AF_ATM = 0x1e AF_BLUETOOTH = 0x24 AF_CCITT = 0xa AF_CHAOS = 0x5 AF_CNT = 0x15 AF_COIP = 0x14 AF_DATAKIT = 0x9 AF_DECnet = 0xc AF_DLI = 0xd AF_E164 = 0x1a AF_ECMA = 0x8 AF_HYLINK = 0xf AF_IEEE80211 = 0x25 AF_IMPLINK = 0x3 AF_INET = 0x2 AF_INET6 = 0x1c AF_INET6_SDP = 0x2a AF_INET_SDP = 0x28 AF_IPX = 0x17 AF_ISDN = 0x1a AF_ISO = 0x7 AF_LAT = 0xe AF_LINK = 0x12 AF_LOCAL = 0x1 AF_MAX = 0x2a AF_NATM = 0x1d AF_NETBIOS = 0x6 AF_NETGRAPH = 0x20 AF_OSI = 0x7 AF_PUP = 0x4 AF_ROUTE = 0x11 AF_SCLUSTER = 0x22 AF_SIP = 0x18 AF_SLOW = 0x21 AF_SNA = 0xb AF_UNIX = 0x1 AF_UNSPEC = 0x0 AF_VENDOR00 = 0x27 AF_VENDOR01 = 0x29 AF_VENDOR02 = 0x2b AF_VENDOR03 = 0x2d AF_VENDOR04 = 0x2f AF_VENDOR05 = 0x31 AF_VENDOR06 = 0x33 AF_VENDOR07 = 0x35 AF_VENDOR08 = 0x37 AF_VENDOR09 = 0x39 AF_VENDOR10 = 0x3b AF_VENDOR11 = 0x3d AF_VENDOR12 = 0x3f AF_VENDOR13 = 0x41 AF_VENDOR14 = 0x43 AF_VENDOR15 = 0x45 AF_VENDOR16 = 0x47 AF_VENDOR17 = 0x49 AF_VENDOR18 = 0x4b AF_VENDOR19 = 0x4d AF_VENDOR20 = 0x4f AF_VENDOR21 = 0x51 AF_VENDOR22 = 0x53 AF_VENDOR23 = 0x55 AF_VENDOR24 = 0x57 AF_VENDOR25 = 0x59 AF_VENDOR26 = 0x5b AF_VENDOR27 = 0x5d AF_VENDOR28 = 0x5f AF_VENDOR29 = 0x61 AF_VENDOR30 = 0x63 AF_VENDOR31 = 0x65 AF_VENDOR32 = 0x67 AF_VENDOR33 = 0x69 AF_VENDOR34 = 0x6b AF_VENDOR35 = 0x6d AF_VENDOR36 = 0x6f AF_VENDOR37 = 0x71 AF_VENDOR38 = 0x73 AF_VENDOR39 = 0x75 AF_VENDOR40 = 0x77 AF_VENDOR41 = 0x79 AF_VENDOR42 = 0x7b AF_VENDOR43 = 0x7d AF_VENDOR44 = 0x7f AF_VENDOR45 = 0x81 AF_VENDOR46 = 0x83 AF_VENDOR47 = 0x85 ALTWERASE = 0x200 B0 = 0x0 B110 = 0x6e B115200 = 0x1c200 B1200 = 0x4b0 B134 = 0x86 B14400 = 0x3840 B150 = 0x96 B1800 = 0x708 B19200 = 0x4b00 B200 = 0xc8 B230400 = 0x38400 B2400 = 0x960 B28800 = 0x7080 B300 = 0x12c B38400 = 0x9600 B460800 = 0x70800 B4800 = 0x12c0 B50 = 0x32 B57600 = 0xe100 B600 = 0x258 B7200 = 0x1c20 B75 = 0x4b B76800 = 0x12c00 B921600 = 0xe1000 B9600 = 0x2580 BIOCFEEDBACK = 0x8004427c BIOCFLUSH = 0x20004268 BIOCGBLEN = 0x40044266 BIOCGDIRECTION = 0x40044276 BIOCGDLT = 0x4004426a BIOCGDLTLIST = 0xc0084279 BIOCGETBUFMODE = 0x4004427d BIOCGETIF = 0x4020426b BIOCGETZMAX = 0x4004427f BIOCGHDRCMPLT = 0x40044274 BIOCGRSIG = 0x40044272 BIOCGRTIMEOUT = 0x4008426e BIOCGSEESENT = 0x40044276 BIOCGSTATS = 0x4008426f BIOCGTSTAMP = 0x40044283 BIOCIMMEDIATE = 0x80044270 BIOCLOCK = 0x2000427a BIOCPROMISC = 0x20004269 BIOCROTZBUF = 0x400c4280 BIOCSBLEN = 0xc0044266 BIOCSDIRECTION = 0x80044277 BIOCSDLT = 0x80044278 BIOCSETBUFMODE = 0x8004427e BIOCSETF = 0x80084267 BIOCSETFNR = 0x80084282 BIOCSETIF = 0x8020426c BIOCSETWF = 0x8008427b BIOCSETZBUF = 0x800c4281 BIOCSHDRCMPLT = 0x80044275 BIOCSRSIG = 0x80044273 BIOCSRTIMEOUT = 0x8008426d BIOCSSEESENT = 0x80044277 BIOCSTSTAMP = 0x80044284 BIOCVERSION = 0x40044271 BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALIGNMENT = 0x4 BPF_ALU = 0x4 BPF_AND = 0x50 BPF_B = 0x10 BPF_BUFMODE_BUFFER = 0x1 BPF_BUFMODE_ZBUF = 0x2 BPF_DIV = 0x30 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 BPF_JA = 0x0 BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 BPF_JMP = 0x5 BPF_JSET = 0x40 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 BPF_LEN = 0x80 BPF_LSH = 0x60 BPF_MAJOR_VERSION = 0x1 BPF_MAXBUFSIZE = 0x80000 BPF_MAXINSNS = 0x200 BPF_MEM = 0x60 BPF_MEMWORDS = 0x10 BPF_MINBUFSIZE = 0x20 BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MOD = 0x90 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_OR = 0x40 BPF_RELEASE = 0x30bb6 BPF_RET = 0x6 BPF_RSH = 0x70 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 BPF_TAX = 0x0 BPF_TXA = 0x80 BPF_T_BINTIME = 0x2 BPF_T_BINTIME_FAST = 0x102 BPF_T_BINTIME_MONOTONIC = 0x202 BPF_T_BINTIME_MONOTONIC_FAST = 0x302 BPF_T_FAST = 0x100 BPF_T_FLAG_MASK = 0x300 BPF_T_FORMAT_MASK = 0x3 BPF_T_MICROTIME = 0x0 BPF_T_MICROTIME_FAST = 0x100 BPF_T_MICROTIME_MONOTONIC = 0x200 BPF_T_MICROTIME_MONOTONIC_FAST = 0x300 BPF_T_MONOTONIC = 0x200 BPF_T_MONOTONIC_FAST = 0x300 BPF_T_NANOTIME = 0x1 BPF_T_NANOTIME_FAST = 0x101 BPF_T_NANOTIME_MONOTONIC = 0x201 BPF_T_NANOTIME_MONOTONIC_FAST = 0x301 BPF_T_NONE = 0x3 BPF_T_NORMAL = 0x0 BPF_W = 0x0 BPF_X = 0x8 BPF_XOR = 0xa0 BRKINT = 0x2 CAP_ACCEPT = 0x200000020000000 CAP_ACL_CHECK = 0x400000000010000 CAP_ACL_DELETE = 0x400000000020000 CAP_ACL_GET = 0x400000000040000 CAP_ACL_SET = 0x400000000080000 CAP_ALL0 = 0x20007ffffffffff CAP_ALL1 = 0x4000000001fffff CAP_BIND = 0x200000040000000 CAP_BINDAT = 0x200008000000400 CAP_CHFLAGSAT = 0x200000000001400 CAP_CONNECT = 0x200000080000000 CAP_CONNECTAT = 0x200010000000400 CAP_CREATE = 0x200000000000040 CAP_EVENT = 0x400000000000020 CAP_EXTATTR_DELETE = 0x400000000001000 CAP_EXTATTR_GET = 0x400000000002000 CAP_EXTATTR_LIST = 0x400000000004000 CAP_EXTATTR_SET = 0x400000000008000 CAP_FCHDIR = 0x200000000000800 CAP_FCHFLAGS = 0x200000000001000 CAP_FCHMOD = 0x200000000002000 CAP_FCHMODAT = 0x200000000002400 CAP_FCHOWN = 0x200000000004000 CAP_FCHOWNAT = 0x200000000004400 CAP_FCNTL = 0x200000000008000 CAP_FCNTL_ALL = 0x78 CAP_FCNTL_GETFL = 0x8 CAP_FCNTL_GETOWN = 0x20 CAP_FCNTL_SETFL = 0x10 CAP_FCNTL_SETOWN = 0x40 CAP_FEXECVE = 0x200000000000080 CAP_FLOCK = 0x200000000010000 CAP_FPATHCONF = 0x200000000020000 CAP_FSCK = 0x200000000040000 CAP_FSTAT = 0x200000000080000 CAP_FSTATAT = 0x200000000080400 CAP_FSTATFS = 0x200000000100000 CAP_FSYNC = 0x200000000000100 CAP_FTRUNCATE = 0x200000000000200 CAP_FUTIMES = 0x200000000200000 CAP_FUTIMESAT = 0x200000000200400 CAP_GETPEERNAME = 0x200000100000000 CAP_GETSOCKNAME = 0x200000200000000 CAP_GETSOCKOPT = 0x200000400000000 CAP_IOCTL = 0x400000000000080 CAP_IOCTLS_ALL = 0x7fffffff CAP_KQUEUE = 0x400000000100040 CAP_KQUEUE_CHANGE = 0x400000000100000 CAP_KQUEUE_EVENT = 0x400000000000040 CAP_LINKAT_SOURCE = 0x200020000000400 CAP_LINKAT_TARGET = 0x200000000400400 CAP_LISTEN = 0x200000800000000 CAP_LOOKUP = 0x200000000000400 CAP_MAC_GET = 0x400000000000001 CAP_MAC_SET = 0x400000000000002 CAP_MKDIRAT = 0x200000000800400 CAP_MKFIFOAT = 0x200000001000400 CAP_MKNODAT = 0x200000002000400 CAP_MMAP = 0x200000000000010 CAP_MMAP_R = 0x20000000000001d CAP_MMAP_RW = 0x20000000000001f CAP_MMAP_RWX = 0x20000000000003f CAP_MMAP_RX = 0x20000000000003d CAP_MMAP_W = 0x20000000000001e CAP_MMAP_WX = 0x20000000000003e CAP_MMAP_X = 0x20000000000003c CAP_PDGETPID = 0x400000000000200 CAP_PDKILL = 0x400000000000800 CAP_PDWAIT = 0x400000000000400 CAP_PEELOFF = 0x200001000000000 CAP_POLL_EVENT = 0x400000000000020 CAP_PREAD = 0x20000000000000d CAP_PWRITE = 0x20000000000000e CAP_READ = 0x200000000000001 CAP_RECV = 0x200000000000001 CAP_RENAMEAT_SOURCE = 0x200000004000400 CAP_RENAMEAT_TARGET = 0x200040000000400 CAP_RIGHTS_VERSION = 0x0 CAP_RIGHTS_VERSION_00 = 0x0 CAP_SEEK = 0x20000000000000c CAP_SEEK_TELL = 0x200000000000004 CAP_SEM_GETVALUE = 0x400000000000004 CAP_SEM_POST = 0x400000000000008 CAP_SEM_WAIT = 0x400000000000010 CAP_SEND = 0x200000000000002 CAP_SETSOCKOPT = 0x200002000000000 CAP_SHUTDOWN = 0x200004000000000 CAP_SOCK_CLIENT = 0x200007780000003 CAP_SOCK_SERVER = 0x200007f60000003 CAP_SYMLINKAT = 0x200000008000400 CAP_TTYHOOK = 0x400000000000100 CAP_UNLINKAT = 0x200000010000400 CAP_UNUSED0_44 = 0x200080000000000 CAP_UNUSED0_57 = 0x300000000000000 CAP_UNUSED1_22 = 0x400000000200000 CAP_UNUSED1_57 = 0x500000000000000 CAP_WRITE = 0x200000000000002 CFLUSH = 0xf CLOCAL = 0x8000 CLOCK_MONOTONIC = 0x4 CLOCK_MONOTONIC_FAST = 0xc CLOCK_MONOTONIC_PRECISE = 0xb CLOCK_PROCESS_CPUTIME_ID = 0xf CLOCK_PROF = 0x2 CLOCK_REALTIME = 0x0 CLOCK_REALTIME_FAST = 0xa CLOCK_REALTIME_PRECISE = 0x9 CLOCK_SECOND = 0xd CLOCK_THREAD_CPUTIME_ID = 0xe CLOCK_UPTIME = 0x5 CLOCK_UPTIME_FAST = 0x8 CLOCK_UPTIME_PRECISE = 0x7 CLOCK_VIRTUAL = 0x1 CREAD = 0x800 CRTSCTS = 0x30000 CS5 = 0x0 CS6 = 0x100 CS7 = 0x200 CS8 = 0x300 CSIZE = 0x300 CSTART = 0x11 CSTATUS = 0x14 CSTOP = 0x13 CSTOPB = 0x400 CSUSP = 0x1a CTL_MAXNAME = 0x18 CTL_NET = 0x4 DLT_A429 = 0xb8 DLT_A653_ICM = 0xb9 DLT_AIRONET_HEADER = 0x78 DLT_AOS = 0xde DLT_APPLE_IP_OVER_IEEE1394 = 0x8a DLT_ARCNET = 0x7 DLT_ARCNET_LINUX = 0x81 DLT_ATM_CLIP = 0x13 DLT_ATM_RFC1483 = 0xb DLT_AURORA = 0x7e DLT_AX25 = 0x3 DLT_AX25_KISS = 0xca DLT_BACNET_MS_TP = 0xa5 DLT_BLUETOOTH_BREDR_BB = 0xff DLT_BLUETOOTH_HCI_H4 = 0xbb DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 DLT_BLUETOOTH_LE_LL = 0xfb DLT_BLUETOOTH_LE_LL_WITH_PHDR = 0x100 DLT_BLUETOOTH_LINUX_MONITOR = 0xfe DLT_CAN20B = 0xbe DLT_CAN_SOCKETCAN = 0xe3 DLT_CHAOS = 0x5 DLT_CHDLC = 0x68 DLT_CISCO_IOS = 0x76 DLT_C_HDLC = 0x68 DLT_C_HDLC_WITH_DIR = 0xcd DLT_DBUS = 0xe7 DLT_DECT = 0xdd DLT_DOCSIS = 0x8f DLT_DVB_CI = 0xeb DLT_ECONET = 0x73 DLT_EN10MB = 0x1 DLT_EN3MB = 0x2 DLT_ENC = 0x6d DLT_EPON = 0x103 DLT_ERF = 0xc5 DLT_ERF_ETH = 0xaf DLT_ERF_POS = 0xb0 DLT_FC_2 = 0xe0 DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 DLT_FDDI = 0xa DLT_FLEXRAY = 0xd2 DLT_FRELAY = 0x6b DLT_FRELAY_WITH_DIR = 0xce DLT_GCOM_SERIAL = 0xad DLT_GCOM_T1E1 = 0xac DLT_GPF_F = 0xab DLT_GPF_T = 0xaa DLT_GPRS_LLC = 0xa9 DLT_GSMTAP_ABIS = 0xda DLT_GSMTAP_UM = 0xd9 DLT_HHDLC = 0x79 DLT_IBM_SN = 0x92 DLT_IBM_SP = 0x91 DLT_IEEE802 = 0x6 DLT_IEEE802_11 = 0x69 DLT_IEEE802_11_RADIO = 0x7f DLT_IEEE802_11_RADIO_AVS = 0xa3 DLT_IEEE802_15_4 = 0xc3 DLT_IEEE802_15_4_LINUX = 0xbf DLT_IEEE802_15_4_NOFCS = 0xe6 DLT_IEEE802_15_4_NONASK_PHY = 0xd7 DLT_IEEE802_16_MAC_CPS = 0xbc DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 DLT_INFINIBAND = 0xf7 DLT_IPFILTER = 0x74 DLT_IPMB = 0xc7 DLT_IPMB_LINUX = 0xd1 DLT_IPMI_HPM_2 = 0x104 DLT_IPNET = 0xe2 DLT_IPOIB = 0xf2 DLT_IPV4 = 0xe4 DLT_IPV6 = 0xe5 DLT_IP_OVER_FC = 0x7a DLT_JUNIPER_ATM1 = 0x89 DLT_JUNIPER_ATM2 = 0x87 DLT_JUNIPER_ATM_CEMIC = 0xee DLT_JUNIPER_CHDLC = 0xb5 DLT_JUNIPER_ES = 0x84 DLT_JUNIPER_ETHER = 0xb2 DLT_JUNIPER_FIBRECHANNEL = 0xea DLT_JUNIPER_FRELAY = 0xb4 DLT_JUNIPER_GGSN = 0x85 DLT_JUNIPER_ISM = 0xc2 DLT_JUNIPER_MFR = 0x86 DLT_JUNIPER_MLFR = 0x83 DLT_JUNIPER_MLPPP = 0x82 DLT_JUNIPER_MONITOR = 0xa4 DLT_JUNIPER_PIC_PEER = 0xae DLT_JUNIPER_PPP = 0xb3 DLT_JUNIPER_PPPOE = 0xa7 DLT_JUNIPER_PPPOE_ATM = 0xa8 DLT_JUNIPER_SERVICES = 0x88 DLT_JUNIPER_SRX_E2E = 0xe9 DLT_JUNIPER_ST = 0xc8 DLT_JUNIPER_VP = 0xb7 DLT_JUNIPER_VS = 0xe8 DLT_LAPB_WITH_DIR = 0xcf DLT_LAPD = 0xcb DLT_LIN = 0xd4 DLT_LINUX_EVDEV = 0xd8 DLT_LINUX_IRDA = 0x90 DLT_LINUX_LAPD = 0xb1 DLT_LINUX_PPP_WITHDIRECTION = 0xa6 DLT_LINUX_SLL = 0x71 DLT_LOOP = 0x6c DLT_LTALK = 0x72 DLT_MATCHING_MAX = 0x104 DLT_MATCHING_MIN = 0x68 DLT_MFR = 0xb6 DLT_MOST = 0xd3 DLT_MPEG_2_TS = 0xf3 DLT_MPLS = 0xdb DLT_MTP2 = 0x8c DLT_MTP2_WITH_PHDR = 0x8b DLT_MTP3 = 0x8d DLT_MUX27010 = 0xec DLT_NETANALYZER = 0xf0 DLT_NETANALYZER_TRANSPARENT = 0xf1 DLT_NETLINK = 0xfd DLT_NFC_LLCP = 0xf5 DLT_NFLOG = 0xef DLT_NG40 = 0xf4 DLT_NULL = 0x0 DLT_PCI_EXP = 0x7d DLT_PFLOG = 0x75 DLT_PFSYNC = 0x79 DLT_PKTAP = 0x102 DLT_PPI = 0xc0 DLT_PPP = 0x9 DLT_PPP_BSDOS = 0x10 DLT_PPP_ETHER = 0x33 DLT_PPP_PPPD = 0xa6 DLT_PPP_SERIAL = 0x32 DLT_PPP_WITH_DIR = 0xcc DLT_PPP_WITH_DIRECTION = 0xa6 DLT_PRISM_HEADER = 0x77 DLT_PROFIBUS_DL = 0x101 DLT_PRONET = 0x4 DLT_RAIF1 = 0xc6 DLT_RAW = 0xc DLT_RIO = 0x7c DLT_RTAC_SERIAL = 0xfa DLT_SCCP = 0x8e DLT_SCTP = 0xf8 DLT_SITA = 0xc4 DLT_SLIP = 0x8 DLT_SLIP_BSDOS = 0xf DLT_STANAG_5066_D_PDU = 0xed DLT_SUNATM = 0x7b DLT_SYMANTEC_FIREWALL = 0x63 DLT_TZSP = 0x80 DLT_USB = 0xba DLT_USBPCAP = 0xf9 DLT_USB_LINUX = 0xbd DLT_USB_LINUX_MMAPPED = 0xdc DLT_USER0 = 0x93 DLT_USER1 = 0x94 DLT_USER10 = 0x9d DLT_USER11 = 0x9e DLT_USER12 = 0x9f DLT_USER13 = 0xa0 DLT_USER14 = 0xa1 DLT_USER15 = 0xa2 DLT_USER2 = 0x95 DLT_USER3 = 0x96 DLT_USER4 = 0x97 DLT_USER5 = 0x98 DLT_USER6 = 0x99 DLT_USER7 = 0x9a DLT_USER8 = 0x9b DLT_USER9 = 0x9c DLT_WIHART = 0xdf DLT_WIRESHARK_UPPER_PDU = 0xfc DLT_X2E_SERIAL = 0xd5 DLT_X2E_XORAYA = 0xd6 DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 DT_FIFO = 0x1 DT_LNK = 0xa DT_REG = 0x8 DT_SOCK = 0xc DT_UNKNOWN = 0x0 DT_WHT = 0xe ECHO = 0x8 ECHOCTL = 0x40 ECHOE = 0x2 ECHOK = 0x4 ECHOKE = 0x1 ECHONL = 0x10 ECHOPRT = 0x20 EVFILT_AIO = -0x3 EVFILT_FS = -0x9 EVFILT_LIO = -0xa EVFILT_PROC = -0x5 EVFILT_PROCDESC = -0x8 EVFILT_READ = -0x1 EVFILT_SENDFILE = -0xc EVFILT_SIGNAL = -0x6 EVFILT_SYSCOUNT = 0xc EVFILT_TIMER = -0x7 EVFILT_USER = -0xb EVFILT_VNODE = -0x4 EVFILT_WRITE = -0x2 EV_ADD = 0x1 EV_CLEAR = 0x20 EV_DELETE = 0x2 EV_DISABLE = 0x8 EV_DISPATCH = 0x80 EV_DROP = 0x1000 EV_ENABLE = 0x4 EV_EOF = 0x8000 EV_ERROR = 0x4000 EV_FLAG1 = 0x2000 EV_FLAG2 = 0x4000 EV_FORCEONESHOT = 0x100 EV_ONESHOT = 0x10 EV_RECEIPT = 0x40 EV_SYSFLAGS = 0xf000 EXTA = 0x4b00 EXTATTR_NAMESPACE_EMPTY = 0x0 EXTATTR_NAMESPACE_SYSTEM = 0x2 EXTATTR_NAMESPACE_USER = 0x1 EXTB = 0x9600 EXTPROC = 0x800 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FLUSHO = 0x800000 F_CANCEL = 0x5 F_DUP2FD = 0xa F_DUP2FD_CLOEXEC = 0x12 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0x11 F_GETFD = 0x1 F_GETFL = 0x3 F_GETLK = 0xb F_GETOWN = 0x5 F_OGETLK = 0x7 F_OK = 0x0 F_OSETLK = 0x8 F_OSETLKW = 0x9 F_RDAHEAD = 0x10 F_RDLCK = 0x1 F_READAHEAD = 0xf F_SETFD = 0x2 F_SETFL = 0x4 F_SETLK = 0xc F_SETLKW = 0xd F_SETLK_REMOTE = 0xe F_SETOWN = 0x6 F_UNLCK = 0x2 F_UNLCKSYS = 0x4 F_WRLCK = 0x3 HUPCL = 0x4000 ICANON = 0x100 ICMP6_FILTER = 0x12 ICRNL = 0x100 IEXTEN = 0x400 IFAN_ARRIVAL = 0x0 IFAN_DEPARTURE = 0x1 IFF_ALLMULTI = 0x200 IFF_ALTPHYS = 0x4000 IFF_BROADCAST = 0x2 IFF_CANTCHANGE = 0x218f52 IFF_CANTCONFIG = 0x10000 IFF_DEBUG = 0x4 IFF_DRV_OACTIVE = 0x400 IFF_DRV_RUNNING = 0x40 IFF_DYING = 0x200000 IFF_LINK0 = 0x1000 IFF_LINK1 = 0x2000 IFF_LINK2 = 0x4000 IFF_LOOPBACK = 0x8 IFF_MONITOR = 0x40000 IFF_MULTICAST = 0x8000 IFF_NOARP = 0x80 IFF_OACTIVE = 0x400 IFF_POINTOPOINT = 0x10 IFF_PPROMISC = 0x20000 IFF_PROMISC = 0x100 IFF_RENAMING = 0x400000 IFF_RUNNING = 0x40 IFF_SIMPLEX = 0x800 IFF_STATICARP = 0x80000 IFF_UP = 0x1 IFNAMSIZ = 0x10 IFT_BRIDGE = 0xd1 IFT_CARP = 0xf8 IFT_IEEE1394 = 0x90 IFT_INFINIBAND = 0xc7 IFT_L2VLAN = 0x87 IFT_L3IPVLAN = 0x88 IFT_PPP = 0x17 IFT_PROPVIRTUAL = 0x35 IGNBRK = 0x1 IGNCR = 0x80 IGNPAR = 0x4 IMAXBEL = 0x2000 INLCR = 0x40 INPCK = 0x10 IN_CLASSA_HOST = 0xffffff IN_CLASSA_MAX = 0x80 IN_CLASSA_NET = 0xff000000 IN_CLASSA_NSHIFT = 0x18 IN_CLASSB_HOST = 0xffff IN_CLASSB_MAX = 0x10000 IN_CLASSB_NET = 0xffff0000 IN_CLASSB_NSHIFT = 0x10 IN_CLASSC_HOST = 0xff IN_CLASSC_NET = 0xffffff00 IN_CLASSC_NSHIFT = 0x8 IN_CLASSD_HOST = 0xfffffff IN_CLASSD_NET = 0xf0000000 IN_CLASSD_NSHIFT = 0x1c IN_LOOPBACKNET = 0x7f IN_RFC3021_MASK = 0xfffffffe IPPROTO_3PC = 0x22 IPPROTO_ADFS = 0x44 IPPROTO_AH = 0x33 IPPROTO_AHIP = 0x3d IPPROTO_APES = 0x63 IPPROTO_ARGUS = 0xd IPPROTO_AX25 = 0x5d IPPROTO_BHA = 0x31 IPPROTO_BLT = 0x1e IPPROTO_BRSATMON = 0x4c IPPROTO_CARP = 0x70 IPPROTO_CFTP = 0x3e IPPROTO_CHAOS = 0x10 IPPROTO_CMTP = 0x26 IPPROTO_CPHB = 0x49 IPPROTO_CPNX = 0x48 IPPROTO_DDP = 0x25 IPPROTO_DGP = 0x56 IPPROTO_DIVERT = 0x102 IPPROTO_DONE = 0x101 IPPROTO_DSTOPTS = 0x3c IPPROTO_EGP = 0x8 IPPROTO_EMCON = 0xe IPPROTO_ENCAP = 0x62 IPPROTO_EON = 0x50 IPPROTO_ESP = 0x32 IPPROTO_ETHERIP = 0x61 IPPROTO_FRAGMENT = 0x2c IPPROTO_GGP = 0x3 IPPROTO_GMTP = 0x64 IPPROTO_GRE = 0x2f IPPROTO_HELLO = 0x3f IPPROTO_HIP = 0x8b IPPROTO_HMP = 0x14 IPPROTO_HOPOPTS = 0x0 IPPROTO_ICMP = 0x1 IPPROTO_ICMPV6 = 0x3a IPPROTO_IDP = 0x16 IPPROTO_IDPR = 0x23 IPPROTO_IDRP = 0x2d IPPROTO_IGMP = 0x2 IPPROTO_IGP = 0x55 IPPROTO_IGRP = 0x58 IPPROTO_IL = 0x28 IPPROTO_INLSP = 0x34 IPPROTO_INP = 0x20 IPPROTO_IP = 0x0 IPPROTO_IPCOMP = 0x6c IPPROTO_IPCV = 0x47 IPPROTO_IPEIP = 0x5e IPPROTO_IPIP = 0x4 IPPROTO_IPPC = 0x43 IPPROTO_IPV4 = 0x4 IPPROTO_IPV6 = 0x29 IPPROTO_IRTP = 0x1c IPPROTO_KRYPTOLAN = 0x41 IPPROTO_LARP = 0x5b IPPROTO_LEAF1 = 0x19 IPPROTO_LEAF2 = 0x1a IPPROTO_MAX = 0x100 IPPROTO_MEAS = 0x13 IPPROTO_MH = 0x87 IPPROTO_MHRP = 0x30 IPPROTO_MICP = 0x5f IPPROTO_MOBILE = 0x37 IPPROTO_MPLS = 0x89 IPPROTO_MTP = 0x5c IPPROTO_MUX = 0x12 IPPROTO_ND = 0x4d IPPROTO_NHRP = 0x36 IPPROTO_NONE = 0x3b IPPROTO_NSP = 0x1f IPPROTO_NVPII = 0xb IPPROTO_OLD_DIVERT = 0xfe IPPROTO_OSPFIGP = 0x59 IPPROTO_PFSYNC = 0xf0 IPPROTO_PGM = 0x71 IPPROTO_PIGP = 0x9 IPPROTO_PIM = 0x67 IPPROTO_PRM = 0x15 IPPROTO_PUP = 0xc IPPROTO_PVP = 0x4b IPPROTO_RAW = 0xff IPPROTO_RCCMON = 0xa IPPROTO_RDP = 0x1b IPPROTO_RESERVED_253 = 0xfd IPPROTO_RESERVED_254 = 0xfe IPPROTO_ROUTING = 0x2b IPPROTO_RSVP = 0x2e IPPROTO_RVD = 0x42 IPPROTO_SATEXPAK = 0x40 IPPROTO_SATMON = 0x45 IPPROTO_SCCSP = 0x60 IPPROTO_SCTP = 0x84 IPPROTO_SDRP = 0x2a IPPROTO_SEND = 0x103 IPPROTO_SEP = 0x21 IPPROTO_SHIM6 = 0x8c IPPROTO_SKIP = 0x39 IPPROTO_SPACER = 0x7fff IPPROTO_SRPC = 0x5a IPPROTO_ST = 0x7 IPPROTO_SVMTP = 0x52 IPPROTO_SWIPE = 0x35 IPPROTO_TCF = 0x57 IPPROTO_TCP = 0x6 IPPROTO_TLSP = 0x38 IPPROTO_TP = 0x1d IPPROTO_TPXX = 0x27 IPPROTO_TRUNK1 = 0x17 IPPROTO_TRUNK2 = 0x18 IPPROTO_TTP = 0x54 IPPROTO_UDP = 0x11 IPPROTO_UDPLITE = 0x88 IPPROTO_VINES = 0x53 IPPROTO_VISA = 0x46 IPPROTO_VMTP = 0x51 IPPROTO_WBEXPAK = 0x4f IPPROTO_WBMON = 0x4e IPPROTO_WSN = 0x4a IPPROTO_XNET = 0xf IPPROTO_XTP = 0x24 IPV6_AUTOFLOWLABEL = 0x3b IPV6_BINDANY = 0x40 IPV6_BINDMULTI = 0x41 IPV6_BINDV6ONLY = 0x1b IPV6_CHECKSUM = 0x1a IPV6_DEFAULT_MULTICAST_HOPS = 0x1 IPV6_DEFAULT_MULTICAST_LOOP = 0x1 IPV6_DEFHLIM = 0x40 IPV6_DONTFRAG = 0x3e IPV6_DSTOPTS = 0x32 IPV6_FLOWID = 0x43 IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 IPV6_FLOWTYPE = 0x44 IPV6_FRAGTTL = 0x78 IPV6_FW_ADD = 0x1e IPV6_FW_DEL = 0x1f IPV6_FW_FLUSH = 0x20 IPV6_FW_GET = 0x22 IPV6_FW_ZERO = 0x21 IPV6_HLIMDEC = 0x1 IPV6_HOPLIMIT = 0x2f IPV6_HOPOPTS = 0x31 IPV6_IPSEC_POLICY = 0x1c IPV6_JOIN_GROUP = 0xc IPV6_LEAVE_GROUP = 0xd IPV6_MAXHLIM = 0xff IPV6_MAXOPTHDR = 0x800 IPV6_MAXPACKET = 0xffff IPV6_MAX_GROUP_SRC_FILTER = 0x200 IPV6_MAX_MEMBERSHIPS = 0xfff IPV6_MAX_SOCK_SRC_FILTER = 0x80 IPV6_MIN_MEMBERSHIPS = 0x1f IPV6_MMTU = 0x500 IPV6_MSFILTER = 0x4a IPV6_MULTICAST_HOPS = 0xa IPV6_MULTICAST_IF = 0x9 IPV6_MULTICAST_LOOP = 0xb IPV6_NEXTHOP = 0x30 IPV6_PATHMTU = 0x2c IPV6_PKTINFO = 0x2e IPV6_PORTRANGE = 0xe IPV6_PORTRANGE_DEFAULT = 0x0 IPV6_PORTRANGE_HIGH = 0x1 IPV6_PORTRANGE_LOW = 0x2 IPV6_PREFER_TEMPADDR = 0x3f IPV6_RECVDSTOPTS = 0x28 IPV6_RECVFLOWID = 0x46 IPV6_RECVHOPLIMIT = 0x25 IPV6_RECVHOPOPTS = 0x27 IPV6_RECVPATHMTU = 0x2b IPV6_RECVPKTINFO = 0x24 IPV6_RECVRSSBUCKETID = 0x47 IPV6_RECVRTHDR = 0x26 IPV6_RECVTCLASS = 0x39 IPV6_RSSBUCKETID = 0x45 IPV6_RSS_LISTEN_BUCKET = 0x42 IPV6_RTHDR = 0x33 IPV6_RTHDRDSTOPTS = 0x23 IPV6_RTHDR_LOOSE = 0x0 IPV6_RTHDR_STRICT = 0x1 IPV6_RTHDR_TYPE_0 = 0x0 IPV6_SOCKOPT_RESERVED1 = 0x3 IPV6_TCLASS = 0x3d IPV6_UNICAST_HOPS = 0x4 IPV6_USE_MIN_MTU = 0x2a IPV6_V6ONLY = 0x1b IPV6_VERSION = 0x60 IPV6_VERSION_MASK = 0xf0 IP_ADD_MEMBERSHIP = 0xc IP_ADD_SOURCE_MEMBERSHIP = 0x46 IP_BINDANY = 0x18 IP_BINDMULTI = 0x19 IP_BLOCK_SOURCE = 0x48 IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 IP_DONTFRAG = 0x43 IP_DROP_MEMBERSHIP = 0xd IP_DROP_SOURCE_MEMBERSHIP = 0x47 IP_DUMMYNET3 = 0x31 IP_DUMMYNET_CONFIGURE = 0x3c IP_DUMMYNET_DEL = 0x3d IP_DUMMYNET_FLUSH = 0x3e IP_DUMMYNET_GET = 0x40 IP_FLOWID = 0x5a IP_FLOWTYPE = 0x5b IP_FW3 = 0x30 IP_FW_ADD = 0x32 IP_FW_DEL = 0x33 IP_FW_FLUSH = 0x34 IP_FW_GET = 0x36 IP_FW_NAT_CFG = 0x38 IP_FW_NAT_DEL = 0x39 IP_FW_NAT_GET_CONFIG = 0x3a IP_FW_NAT_GET_LOG = 0x3b IP_FW_RESETLOG = 0x37 IP_FW_TABLE_ADD = 0x28 IP_FW_TABLE_DEL = 0x29 IP_FW_TABLE_FLUSH = 0x2a IP_FW_TABLE_GETSIZE = 0x2b IP_FW_TABLE_LIST = 0x2c IP_FW_ZERO = 0x35 IP_HDRINCL = 0x2 IP_IPSEC_POLICY = 0x15 IP_MAXPACKET = 0xffff IP_MAX_GROUP_SRC_FILTER = 0x200 IP_MAX_MEMBERSHIPS = 0xfff IP_MAX_SOCK_MUTE_FILTER = 0x80 IP_MAX_SOCK_SRC_FILTER = 0x80 IP_MAX_SOURCE_FILTER = 0x400 IP_MF = 0x2000 IP_MINTTL = 0x42 IP_MIN_MEMBERSHIPS = 0x1f IP_MSFILTER = 0x4a IP_MSS = 0x240 IP_MULTICAST_IF = 0x9 IP_MULTICAST_LOOP = 0xb IP_MULTICAST_TTL = 0xa IP_MULTICAST_VIF = 0xe IP_OFFMASK = 0x1fff IP_ONESBCAST = 0x17 IP_OPTIONS = 0x1 IP_PORTRANGE = 0x13 IP_PORTRANGE_DEFAULT = 0x0 IP_PORTRANGE_HIGH = 0x1 IP_PORTRANGE_LOW = 0x2 IP_RECVDSTADDR = 0x7 IP_RECVFLOWID = 0x5d IP_RECVIF = 0x14 IP_RECVOPTS = 0x5 IP_RECVRETOPTS = 0x6 IP_RECVRSSBUCKETID = 0x5e IP_RECVTOS = 0x44 IP_RECVTTL = 0x41 IP_RETOPTS = 0x8 IP_RF = 0x8000 IP_RSSBUCKETID = 0x5c IP_RSS_LISTEN_BUCKET = 0x1a IP_RSVP_OFF = 0x10 IP_RSVP_ON = 0xf IP_RSVP_VIF_OFF = 0x12 IP_RSVP_VIF_ON = 0x11 IP_SENDSRCADDR = 0x7 IP_TOS = 0x3 IP_TTL = 0x4 IP_UNBLOCK_SOURCE = 0x49 ISIG = 0x80 ISTRIP = 0x20 IXANY = 0x800 IXOFF = 0x400 IXON = 0x200 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 MADV_AUTOSYNC = 0x7 MADV_CORE = 0x9 MADV_DONTNEED = 0x4 MADV_FREE = 0x5 MADV_NOCORE = 0x8 MADV_NORMAL = 0x0 MADV_NOSYNC = 0x6 MADV_PROTECT = 0xa MADV_RANDOM = 0x1 MADV_SEQUENTIAL = 0x2 MADV_WILLNEED = 0x3 MAP_ALIGNED_SUPER = 0x1000000 MAP_ALIGNMENT_MASK = -0x1000000 MAP_ALIGNMENT_SHIFT = 0x18 MAP_ANON = 0x1000 MAP_ANONYMOUS = 0x1000 MAP_COPY = 0x2 MAP_EXCL = 0x4000 MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_HASSEMAPHORE = 0x200 MAP_NOCORE = 0x20000 MAP_NOSYNC = 0x800 MAP_PREFAULT_READ = 0x40000 MAP_PRIVATE = 0x2 MAP_RESERVED0020 = 0x20 MAP_RESERVED0040 = 0x40 MAP_RESERVED0080 = 0x80 MAP_RESERVED0100 = 0x100 MAP_SHARED = 0x1 MAP_STACK = 0x400 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MNT_ACLS = 0x8000000 MNT_ASYNC = 0x40 MNT_AUTOMOUNTED = 0x200000000 MNT_BYFSID = 0x8000000 MNT_CMDFLAGS = 0xd0f0000 MNT_DEFEXPORTED = 0x200 MNT_DELEXPORT = 0x20000 MNT_EXKERB = 0x800 MNT_EXPORTANON = 0x400 MNT_EXPORTED = 0x100 MNT_EXPUBLIC = 0x20000000 MNT_EXRDONLY = 0x80 MNT_FORCE = 0x80000 MNT_GJOURNAL = 0x2000000 MNT_IGNORE = 0x800000 MNT_LAZY = 0x3 MNT_LOCAL = 0x1000 MNT_MULTILABEL = 0x4000000 MNT_NFS4ACLS = 0x10 MNT_NOATIME = 0x10000000 MNT_NOCLUSTERR = 0x40000000 MNT_NOCLUSTERW = 0x80000000 MNT_NOEXEC = 0x4 MNT_NONBUSY = 0x4000000 MNT_NOSUID = 0x8 MNT_NOSYMFOLLOW = 0x400000 MNT_NOWAIT = 0x2 MNT_QUOTA = 0x2000 MNT_RDONLY = 0x1 MNT_RELOAD = 0x40000 MNT_ROOTFS = 0x4000 MNT_SNAPSHOT = 0x1000000 MNT_SOFTDEP = 0x200000 MNT_SUIDDIR = 0x100000 MNT_SUJ = 0x100000000 MNT_SUSPEND = 0x4 MNT_SYNCHRONOUS = 0x2 MNT_UNION = 0x20 MNT_UPDATE = 0x10000 MNT_UPDATEMASK = 0x2d8d0807e MNT_USER = 0x8000 MNT_VISFLAGMASK = 0x3fef0ffff MNT_WAIT = 0x1 MSG_CMSG_CLOEXEC = 0x40000 MSG_COMPAT = 0x8000 MSG_CTRUNC = 0x20 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x80 MSG_EOF = 0x100 MSG_EOR = 0x8 MSG_NBIO = 0x4000 MSG_NOSIGNAL = 0x20000 MSG_NOTIFICATION = 0x2000 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_TRUNC = 0x10 MSG_WAITALL = 0x40 MSG_WAITFORONE = 0x80000 MS_ASYNC = 0x1 MS_INVALIDATE = 0x2 MS_SYNC = 0x0 NAME_MAX = 0xff NET_RT_DUMP = 0x1 NET_RT_FLAGS = 0x2 NET_RT_IFLIST = 0x3 NET_RT_IFLISTL = 0x5 NET_RT_IFMALIST = 0x4 NOFLSH = 0x80000000 NOKERNINFO = 0x2000000 NOTE_ATTRIB = 0x8 NOTE_CHILD = 0x4 NOTE_CLOSE = 0x100 NOTE_CLOSE_WRITE = 0x200 NOTE_DELETE = 0x1 NOTE_EXEC = 0x20000000 NOTE_EXIT = 0x80000000 NOTE_EXTEND = 0x4 NOTE_FFAND = 0x40000000 NOTE_FFCOPY = 0xc0000000 NOTE_FFCTRLMASK = 0xc0000000 NOTE_FFLAGSMASK = 0xffffff NOTE_FFNOP = 0x0 NOTE_FFOR = 0x80000000 NOTE_FILE_POLL = 0x2 NOTE_FORK = 0x40000000 NOTE_LINK = 0x10 NOTE_LOWAT = 0x1 NOTE_MSECONDS = 0x2 NOTE_NSECONDS = 0x8 NOTE_OPEN = 0x80 NOTE_PCTRLMASK = 0xf0000000 NOTE_PDATAMASK = 0xfffff NOTE_READ = 0x400 NOTE_RENAME = 0x20 NOTE_REVOKE = 0x40 NOTE_SECONDS = 0x1 NOTE_TRACK = 0x1 NOTE_TRACKERR = 0x2 NOTE_TRIGGER = 0x1000000 NOTE_USECONDS = 0x4 NOTE_WRITE = 0x2 OCRNL = 0x10 ONLCR = 0x2 ONLRET = 0x40 ONOCR = 0x20 ONOEOT = 0x8 OPOST = 0x1 OXTABS = 0x4 O_ACCMODE = 0x3 O_APPEND = 0x8 O_ASYNC = 0x40 O_CLOEXEC = 0x100000 O_CREAT = 0x200 O_DIRECT = 0x10000 O_DIRECTORY = 0x20000 O_EXCL = 0x800 O_EXEC = 0x40000 O_EXLOCK = 0x20 O_FSYNC = 0x80 O_NDELAY = 0x4 O_NOCTTY = 0x8000 O_NOFOLLOW = 0x100 O_NONBLOCK = 0x4 O_RDONLY = 0x0 O_RDWR = 0x2 O_SHLOCK = 0x10 O_SYNC = 0x80 O_TRUNC = 0x400 O_TTY_INIT = 0x80000 O_VERIFY = 0x200000 O_WRONLY = 0x1 PARENB = 0x1000 PARMRK = 0x8 PARODD = 0x2000 PENDIN = 0x20000000 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 PROT_EXEC = 0x4 PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 RLIMIT_AS = 0xa RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 RLIMIT_MEMLOCK = 0x6 RLIMIT_NOFILE = 0x8 RLIMIT_NPROC = 0x7 RLIMIT_RSS = 0x5 RLIMIT_STACK = 0x3 RLIM_INFINITY = 0x7fffffffffffffff RTAX_AUTHOR = 0x6 RTAX_BRD = 0x7 RTAX_DST = 0x0 RTAX_GATEWAY = 0x1 RTAX_GENMASK = 0x3 RTAX_IFA = 0x5 RTAX_IFP = 0x4 RTAX_MAX = 0x8 RTAX_NETMASK = 0x2 RTA_AUTHOR = 0x40 RTA_BRD = 0x80 RTA_DST = 0x1 RTA_GATEWAY = 0x2 RTA_GENMASK = 0x8 RTA_IFA = 0x20 RTA_IFP = 0x10 RTA_NETMASK = 0x4 RTF_BLACKHOLE = 0x1000 RTF_BROADCAST = 0x400000 RTF_DONE = 0x40 RTF_DYNAMIC = 0x10 RTF_FIXEDMTU = 0x80000 RTF_FMASK = 0x1004d808 RTF_GATEWAY = 0x2 RTF_GWFLAG_COMPAT = 0x80000000 RTF_HOST = 0x4 RTF_LLDATA = 0x400 RTF_LLINFO = 0x400 RTF_LOCAL = 0x200000 RTF_MODIFIED = 0x20 RTF_MULTICAST = 0x800000 RTF_PINNED = 0x100000 RTF_PROTO1 = 0x8000 RTF_PROTO2 = 0x4000 RTF_PROTO3 = 0x40000 RTF_REJECT = 0x8 RTF_RNH_LOCKED = 0x40000000 RTF_STATIC = 0x800 RTF_STICKY = 0x10000000 RTF_UP = 0x1 RTF_XRESOLVE = 0x200 RTM_ADD = 0x1 RTM_CHANGE = 0x3 RTM_DELADDR = 0xd RTM_DELETE = 0x2 RTM_DELMADDR = 0x10 RTM_GET = 0x4 RTM_IEEE80211 = 0x12 RTM_IFANNOUNCE = 0x11 RTM_IFINFO = 0xe RTM_LOCK = 0x8 RTM_LOSING = 0x5 RTM_MISS = 0x7 RTM_NEWADDR = 0xc RTM_NEWMADDR = 0xf RTM_REDIRECT = 0x6 RTM_RESOLVE = 0xb RTM_RTTUNIT = 0xf4240 RTM_VERSION = 0x5 RTV_EXPIRE = 0x4 RTV_HOPCOUNT = 0x2 RTV_MTU = 0x1 RTV_RPIPE = 0x8 RTV_RTT = 0x40 RTV_RTTVAR = 0x80 RTV_SPIPE = 0x10 RTV_SSTHRESH = 0x20 RTV_WEIGHT = 0x100 RT_ALL_FIBS = -0x1 RT_BLACKHOLE = 0x40 RT_CACHING_CONTEXT = 0x1 RT_DEFAULT_FIB = 0x0 RT_HAS_GW = 0x80 RT_HAS_HEADER = 0x10 RT_HAS_HEADER_BIT = 0x4 RT_L2_ME = 0x4 RT_L2_ME_BIT = 0x2 RT_LLE_CACHE = 0x100 RT_MAY_LOOP = 0x8 RT_MAY_LOOP_BIT = 0x3 RT_NORTREF = 0x2 RT_REJECT = 0x20 RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 RUSAGE_THREAD = 0x1 SCM_BINTIME = 0x4 SCM_CREDS = 0x3 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x2 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 SIOCADDMULTI = 0x80206931 SIOCAIFADDR = 0x8040691a SIOCAIFGROUP = 0x80246987 SIOCATMARK = 0x40047307 SIOCDELMULTI = 0x80206932 SIOCDIFADDR = 0x80206919 SIOCDIFGROUP = 0x80246989 SIOCDIFPHYADDR = 0x80206949 SIOCGDRVSPEC = 0xc01c697b SIOCGETSGCNT = 0xc0147210 SIOCGETVIFCNT = 0xc014720f SIOCGHIWAT = 0x40047301 SIOCGI2C = 0xc020693d SIOCGIFADDR = 0xc0206921 SIOCGIFBRDADDR = 0xc0206923 SIOCGIFCAP = 0xc020691f SIOCGIFCONF = 0xc0086924 SIOCGIFDESCR = 0xc020692a SIOCGIFDSTADDR = 0xc0206922 SIOCGIFFIB = 0xc020695c SIOCGIFFLAGS = 0xc0206911 SIOCGIFGENERIC = 0xc020693a SIOCGIFGMEMB = 0xc024698a SIOCGIFGROUP = 0xc0246988 SIOCGIFINDEX = 0xc0206920 SIOCGIFMAC = 0xc0206926 SIOCGIFMEDIA = 0xc0286938 SIOCGIFMETRIC = 0xc0206917 SIOCGIFMTU = 0xc0206933 SIOCGIFNETMASK = 0xc0206925 SIOCGIFPDSTADDR = 0xc0206948 SIOCGIFPHYS = 0xc0206935 SIOCGIFPSRCADDR = 0xc0206947 SIOCGIFSTATUS = 0xc331693b SIOCGIFXMEDIA = 0xc028698b SIOCGLOWAT = 0x40047303 SIOCGPGRP = 0x40047309 SIOCGPRIVATE_0 = 0xc0206950 SIOCGPRIVATE_1 = 0xc0206951 SIOCGTUNFIB = 0xc020695e SIOCIFCREATE = 0xc020697a SIOCIFCREATE2 = 0xc020697c SIOCIFDESTROY = 0x80206979 SIOCIFGCLONERS = 0xc00c6978 SIOCSDRVSPEC = 0x801c697b SIOCSHIWAT = 0x80047300 SIOCSIFADDR = 0x8020690c SIOCSIFBRDADDR = 0x80206913 SIOCSIFCAP = 0x8020691e SIOCSIFDESCR = 0x80206929 SIOCSIFDSTADDR = 0x8020690e SIOCSIFFIB = 0x8020695d SIOCSIFFLAGS = 0x80206910 SIOCSIFGENERIC = 0x80206939 SIOCSIFLLADDR = 0x8020693c SIOCSIFMAC = 0x80206927 SIOCSIFMEDIA = 0xc0206937 SIOCSIFMETRIC = 0x80206918 SIOCSIFMTU = 0x80206934 SIOCSIFNAME = 0x80206928 SIOCSIFNETMASK = 0x80206916 SIOCSIFPHYADDR = 0x80406946 SIOCSIFPHYS = 0x80206936 SIOCSIFRVNET = 0xc020695b SIOCSIFVNET = 0xc020695a SIOCSLOWAT = 0x80047302 SIOCSPGRP = 0x80047308 SIOCSTUNFIB = 0x8020695f SOCK_CLOEXEC = 0x10000000 SOCK_DGRAM = 0x2 SOCK_MAXADDRLEN = 0xff SOCK_NONBLOCK = 0x20000000 SOCK_RAW = 0x3 SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x1 SOL_SOCKET = 0xffff SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x2 SO_ACCEPTFILTER = 0x1000 SO_BINTIME = 0x2000 SO_BROADCAST = 0x20 SO_DEBUG = 0x1 SO_DONTROUTE = 0x10 SO_ERROR = 0x1007 SO_KEEPALIVE = 0x8 SO_LABEL = 0x1009 SO_LINGER = 0x80 SO_LISTENINCQLEN = 0x1013 SO_LISTENQLEN = 0x1012 SO_LISTENQLIMIT = 0x1011 SO_NOSIGPIPE = 0x800 SO_NO_DDP = 0x8000 SO_NO_OFFLOAD = 0x4000 SO_OOBINLINE = 0x100 SO_PEERLABEL = 0x1010 SO_PROTOCOL = 0x1016 SO_PROTOTYPE = 0x1016 SO_RCVBUF = 0x1002 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x1006 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_SETFIB = 0x1014 SO_SNDBUF = 0x1001 SO_SNDLOWAT = 0x1003 SO_SNDTIMEO = 0x1005 SO_TIMESTAMP = 0x400 SO_TYPE = 0x1008 SO_USELOOPBACK = 0x40 SO_USER_COOKIE = 0x1015 SO_VENDOR = 0x80000000 TAB0 = 0x0 TAB3 = 0x4 TABDLY = 0x4 TCIFLUSH = 0x1 TCIOFF = 0x3 TCIOFLUSH = 0x3 TCION = 0x4 TCOFLUSH = 0x2 TCOOFF = 0x1 TCOON = 0x2 TCP_CA_NAME_MAX = 0x10 TCP_CCALGOOPT = 0x41 TCP_CONGESTION = 0x40 TCP_FASTOPEN = 0x401 TCP_FUNCTION_BLK = 0x2000 TCP_FUNCTION_NAME_LEN_MAX = 0x20 TCP_INFO = 0x20 TCP_KEEPCNT = 0x400 TCP_KEEPIDLE = 0x100 TCP_KEEPINIT = 0x80 TCP_KEEPINTVL = 0x200 TCP_MAXBURST = 0x4 TCP_MAXHLEN = 0x3c TCP_MAXOLEN = 0x28 TCP_MAXSEG = 0x2 TCP_MAXWIN = 0xffff TCP_MAX_SACK = 0x4 TCP_MAX_WINSHIFT = 0xe TCP_MD5SIG = 0x10 TCP_MINMSS = 0xd8 TCP_MSS = 0x218 TCP_NODELAY = 0x1 TCP_NOOPT = 0x8 TCP_NOPUSH = 0x4 TCP_PCAP_IN = 0x1000 TCP_PCAP_OUT = 0x800 TCP_VENDOR = 0x80000000 TCSAFLUSH = 0x2 TIOCCBRK = 0x2000747a TIOCCDTR = 0x20007478 TIOCCONS = 0x80047462 TIOCDRAIN = 0x2000745e TIOCEXCL = 0x2000740d TIOCEXT = 0x80047460 TIOCFLUSH = 0x80047410 TIOCGDRAINWAIT = 0x40047456 TIOCGETA = 0x402c7413 TIOCGETD = 0x4004741a TIOCGPGRP = 0x40047477 TIOCGPTN = 0x4004740f TIOCGSID = 0x40047463 TIOCGWINSZ = 0x40087468 TIOCMBIC = 0x8004746b TIOCMBIS = 0x8004746c TIOCMGDTRWAIT = 0x4004745a TIOCMGET = 0x4004746a TIOCMSDTRWAIT = 0x8004745b TIOCMSET = 0x8004746d TIOCM_CAR = 0x40 TIOCM_CD = 0x40 TIOCM_CTS = 0x20 TIOCM_DCD = 0x40 TIOCM_DSR = 0x100 TIOCM_DTR = 0x2 TIOCM_LE = 0x1 TIOCM_RI = 0x80 TIOCM_RNG = 0x80 TIOCM_RTS = 0x4 TIOCM_SR = 0x10 TIOCM_ST = 0x8 TIOCNOTTY = 0x20007471 TIOCNXCL = 0x2000740e TIOCOUTQ = 0x40047473 TIOCPKT = 0x80047470 TIOCPKT_DATA = 0x0 TIOCPKT_DOSTOP = 0x20 TIOCPKT_FLUSHREAD = 0x1 TIOCPKT_FLUSHWRITE = 0x2 TIOCPKT_IOCTL = 0x40 TIOCPKT_NOSTOP = 0x10 TIOCPKT_START = 0x8 TIOCPKT_STOP = 0x4 TIOCPTMASTER = 0x2000741c TIOCSBRK = 0x2000747b TIOCSCTTY = 0x20007461 TIOCSDRAINWAIT = 0x80047457 TIOCSDTR = 0x20007479 TIOCSETA = 0x802c7414 TIOCSETAF = 0x802c7416 TIOCSETAW = 0x802c7415 TIOCSETD = 0x8004741b TIOCSIG = 0x2004745f TIOCSPGRP = 0x80047476 TIOCSTART = 0x2000746e TIOCSTAT = 0x20007465 TIOCSTI = 0x80017472 TIOCSTOP = 0x2000746f TIOCSWINSZ = 0x80087467 TIOCTIMESTAMP = 0x40087459 TIOCUCNTL = 0x80047466 TOSTOP = 0x400000 VDISCARD = 0xf VDSUSP = 0xb VEOF = 0x0 VEOL = 0x1 VEOL2 = 0x2 VERASE = 0x3 VERASE2 = 0x7 VINTR = 0x8 VKILL = 0x5 VLNEXT = 0xe VMIN = 0x10 VQUIT = 0x9 VREPRINT = 0x6 VSTART = 0xc VSTATUS = 0x12 VSTOP = 0xd VSUSP = 0xa VTIME = 0x11 VWERASE = 0x4 WCONTINUED = 0x4 WCOREFLAG = 0x80 WEXITED = 0x10 WLINUXCLONE = 0x80000000 WNOHANG = 0x1 WNOWAIT = 0x8 WSTOPPED = 0x2 WTRAPPED = 0x20 WUNTRACED = 0x2 ) // Errors const ( E2BIG = syscall.Errno(0x7) EACCES = syscall.Errno(0xd) EADDRINUSE = syscall.Errno(0x30) EADDRNOTAVAIL = syscall.Errno(0x31) EAFNOSUPPORT = syscall.Errno(0x2f) EAGAIN = syscall.Errno(0x23) EALREADY = syscall.Errno(0x25) EAUTH = syscall.Errno(0x50) EBADF = syscall.Errno(0x9) EBADMSG = syscall.Errno(0x59) EBADRPC = syscall.Errno(0x48) EBUSY = syscall.Errno(0x10) ECANCELED = syscall.Errno(0x55) ECAPMODE = syscall.Errno(0x5e) ECHILD = syscall.Errno(0xa) ECONNABORTED = syscall.Errno(0x35) ECONNREFUSED = syscall.Errno(0x3d) ECONNRESET = syscall.Errno(0x36) EDEADLK = syscall.Errno(0xb) EDESTADDRREQ = syscall.Errno(0x27) EDOM = syscall.Errno(0x21) EDOOFUS = syscall.Errno(0x58) EDQUOT = syscall.Errno(0x45) EEXIST = syscall.Errno(0x11) EFAULT = syscall.Errno(0xe) EFBIG = syscall.Errno(0x1b) EFTYPE = syscall.Errno(0x4f) EHOSTDOWN = syscall.Errno(0x40) EHOSTUNREACH = syscall.Errno(0x41) EIDRM = syscall.Errno(0x52) EILSEQ = syscall.Errno(0x56) EINPROGRESS = syscall.Errno(0x24) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x38) EISDIR = syscall.Errno(0x15) ELAST = syscall.Errno(0x60) ELOOP = syscall.Errno(0x3e) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) EMSGSIZE = syscall.Errno(0x28) EMULTIHOP = syscall.Errno(0x5a) ENAMETOOLONG = syscall.Errno(0x3f) ENEEDAUTH = syscall.Errno(0x51) ENETDOWN = syscall.Errno(0x32) ENETRESET = syscall.Errno(0x34) ENETUNREACH = syscall.Errno(0x33) ENFILE = syscall.Errno(0x17) ENOATTR = syscall.Errno(0x57) ENOBUFS = syscall.Errno(0x37) ENODEV = syscall.Errno(0x13) ENOENT = syscall.Errno(0x2) ENOEXEC = syscall.Errno(0x8) ENOLCK = syscall.Errno(0x4d) ENOLINK = syscall.Errno(0x5b) ENOMEM = syscall.Errno(0xc) ENOMSG = syscall.Errno(0x53) ENOPROTOOPT = syscall.Errno(0x2a) ENOSPC = syscall.Errno(0x1c) ENOSYS = syscall.Errno(0x4e) ENOTBLK = syscall.Errno(0xf) ENOTCAPABLE = syscall.Errno(0x5d) ENOTCONN = syscall.Errno(0x39) ENOTDIR = syscall.Errno(0x14) ENOTEMPTY = syscall.Errno(0x42) ENOTRECOVERABLE = syscall.Errno(0x5f) ENOTSOCK = syscall.Errno(0x26) ENOTSUP = syscall.Errno(0x2d) ENOTTY = syscall.Errno(0x19) ENXIO = syscall.Errno(0x6) EOPNOTSUPP = syscall.Errno(0x2d) EOVERFLOW = syscall.Errno(0x54) EOWNERDEAD = syscall.Errno(0x60) EPERM = syscall.Errno(0x1) EPFNOSUPPORT = syscall.Errno(0x2e) EPIPE = syscall.Errno(0x20) EPROCLIM = syscall.Errno(0x43) EPROCUNAVAIL = syscall.Errno(0x4c) EPROGMISMATCH = syscall.Errno(0x4b) EPROGUNAVAIL = syscall.Errno(0x4a) EPROTO = syscall.Errno(0x5c) EPROTONOSUPPORT = syscall.Errno(0x2b) EPROTOTYPE = syscall.Errno(0x29) ERANGE = syscall.Errno(0x22) EREMOTE = syscall.Errno(0x47) EROFS = syscall.Errno(0x1e) ERPCMISMATCH = syscall.Errno(0x49) ESHUTDOWN = syscall.Errno(0x3a) ESOCKTNOSUPPORT = syscall.Errno(0x2c) ESPIPE = syscall.Errno(0x1d) ESRCH = syscall.Errno(0x3) ESTALE = syscall.Errno(0x46) ETIMEDOUT = syscall.Errno(0x3c) ETOOMANYREFS = syscall.Errno(0x3b) ETXTBSY = syscall.Errno(0x1a) EUSERS = syscall.Errno(0x44) EWOULDBLOCK = syscall.Errno(0x23) EXDEV = syscall.Errno(0x12) ) // Signals const ( SIGABRT = syscall.Signal(0x6) SIGALRM = syscall.Signal(0xe) SIGBUS = syscall.Signal(0xa) SIGCHLD = syscall.Signal(0x14) SIGCONT = syscall.Signal(0x13) SIGEMT = syscall.Signal(0x7) SIGFPE = syscall.Signal(0x8) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) SIGINFO = syscall.Signal(0x1d) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x17) SIGIOT = syscall.Signal(0x6) SIGKILL = syscall.Signal(0x9) SIGLIBRT = syscall.Signal(0x21) SIGLWP = syscall.Signal(0x20) SIGPIPE = syscall.Signal(0xd) SIGPROF = syscall.Signal(0x1b) SIGQUIT = syscall.Signal(0x3) SIGSEGV = syscall.Signal(0xb) SIGSTOP = syscall.Signal(0x11) SIGSYS = syscall.Signal(0xc) SIGTERM = syscall.Signal(0xf) SIGTHR = syscall.Signal(0x20) SIGTRAP = syscall.Signal(0x5) SIGTSTP = syscall.Signal(0x12) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) SIGURG = syscall.Signal(0x10) SIGUSR1 = syscall.Signal(0x1e) SIGUSR2 = syscall.Signal(0x1f) SIGVTALRM = syscall.Signal(0x1a) SIGWINCH = syscall.Signal(0x1c) SIGXCPU = syscall.Signal(0x18) SIGXFSZ = syscall.Signal(0x19) ) // Error table var errors = [...]string{ 1: "operation not permitted", 2: "no such file or directory", 3: "no such process", 4: "interrupted system call", 5: "input/output error", 6: "device not configured", 7: "argument list too long", 8: "exec format error", 9: "bad file descriptor", 10: "no child processes", 11: "resource deadlock avoided", 12: "cannot allocate memory", 13: "permission denied", 14: "bad address", 15: "block device required", 16: "device busy", 17: "file exists", 18: "cross-device link", 19: "operation not supported by device", 20: "not a directory", 21: "is a directory", 22: "invalid argument", 23: "too many open files in system", 24: "too many open files", 25: "inappropriate ioctl for device", 26: "text file busy", 27: "file too large", 28: "no space left on device", 29: "illegal seek", 30: "read-only file system", 31: "too many links", 32: "broken pipe", 33: "numerical argument out of domain", 34: "result too large", 35: "resource temporarily unavailable", 36: "operation now in progress", 37: "operation already in progress", 38: "socket operation on non-socket", 39: "destination address required", 40: "message too long", 41: "protocol wrong type for socket", 42: "protocol not available", 43: "protocol not supported", 44: "socket type not supported", 45: "operation not supported", 46: "protocol family not supported", 47: "address family not supported by protocol family", 48: "address already in use", 49: "can't assign requested address", 50: "network is down", 51: "network is unreachable", 52: "network dropped connection on reset", 53: "software caused connection abort", 54: "connection reset by peer", 55: "no buffer space available", 56: "socket is already connected", 57: "socket is not connected", 58: "can't send after socket shutdown", 59: "too many references: can't splice", 60: "operation timed out", 61: "connection refused", 62: "too many levels of symbolic links", 63: "file name too long", 64: "host is down", 65: "no route to host", 66: "directory not empty", 67: "too many processes", 68: "too many users", 69: "disc quota exceeded", 70: "stale NFS file handle", 71: "too many levels of remote in path", 72: "RPC struct is bad", 73: "RPC version wrong", 74: "RPC prog. not avail", 75: "program version wrong", 76: "bad procedure for program", 77: "no locks available", 78: "function not implemented", 79: "inappropriate file type or format", 80: "authentication error", 81: "need authenticator", 82: "identifier removed", 83: "no message of desired type", 84: "value too large to be stored in data type", 85: "operation canceled", 86: "illegal byte sequence", 87: "attribute not found", 88: "programming error", 89: "bad message", 90: "multihop attempted", 91: "link has been severed", 92: "protocol error", 93: "capabilities insufficient", 94: "not permitted in capability mode", 95: "state not recoverable", 96: "previous owner died", } // Signal table var signals = [...]string{ 1: "hangup", 2: "interrupt", 3: "quit", 4: "illegal instruction", 5: "trace/BPT trap", 6: "abort trap", 7: "EMT trap", 8: "floating point exception", 9: "killed", 10: "bus error", 11: "segmentation fault", 12: "bad system call", 13: "broken pipe", 14: "alarm clock", 15: "terminated", 16: "urgent I/O condition", 17: "suspended (signal)", 18: "suspended", 19: "continued", 20: "child exited", 21: "stopped (tty input)", 22: "stopped (tty output)", 23: "I/O possible", 24: "cputime limit exceeded", 25: "filesize limit exceeded", 26: "virtual timer expired", 27: "profiling timer expired", 28: "window size changes", 29: "information request", 30: "user defined signal 1", 31: "user defined signal 2", 32: "unknown signal", 33: "unknown signal", } ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go ================================================ // mkerrors.sh -m64 // Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,freebsd // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- -m64 _const.go package unix import "syscall" const ( AF_APPLETALK = 0x10 AF_ARP = 0x23 AF_ATM = 0x1e AF_BLUETOOTH = 0x24 AF_CCITT = 0xa AF_CHAOS = 0x5 AF_CNT = 0x15 AF_COIP = 0x14 AF_DATAKIT = 0x9 AF_DECnet = 0xc AF_DLI = 0xd AF_E164 = 0x1a AF_ECMA = 0x8 AF_HYLINK = 0xf AF_IEEE80211 = 0x25 AF_IMPLINK = 0x3 AF_INET = 0x2 AF_INET6 = 0x1c AF_INET6_SDP = 0x2a AF_INET_SDP = 0x28 AF_IPX = 0x17 AF_ISDN = 0x1a AF_ISO = 0x7 AF_LAT = 0xe AF_LINK = 0x12 AF_LOCAL = 0x1 AF_MAX = 0x2a AF_NATM = 0x1d AF_NETBIOS = 0x6 AF_NETGRAPH = 0x20 AF_OSI = 0x7 AF_PUP = 0x4 AF_ROUTE = 0x11 AF_SCLUSTER = 0x22 AF_SIP = 0x18 AF_SLOW = 0x21 AF_SNA = 0xb AF_UNIX = 0x1 AF_UNSPEC = 0x0 AF_VENDOR00 = 0x27 AF_VENDOR01 = 0x29 AF_VENDOR02 = 0x2b AF_VENDOR03 = 0x2d AF_VENDOR04 = 0x2f AF_VENDOR05 = 0x31 AF_VENDOR06 = 0x33 AF_VENDOR07 = 0x35 AF_VENDOR08 = 0x37 AF_VENDOR09 = 0x39 AF_VENDOR10 = 0x3b AF_VENDOR11 = 0x3d AF_VENDOR12 = 0x3f AF_VENDOR13 = 0x41 AF_VENDOR14 = 0x43 AF_VENDOR15 = 0x45 AF_VENDOR16 = 0x47 AF_VENDOR17 = 0x49 AF_VENDOR18 = 0x4b AF_VENDOR19 = 0x4d AF_VENDOR20 = 0x4f AF_VENDOR21 = 0x51 AF_VENDOR22 = 0x53 AF_VENDOR23 = 0x55 AF_VENDOR24 = 0x57 AF_VENDOR25 = 0x59 AF_VENDOR26 = 0x5b AF_VENDOR27 = 0x5d AF_VENDOR28 = 0x5f AF_VENDOR29 = 0x61 AF_VENDOR30 = 0x63 AF_VENDOR31 = 0x65 AF_VENDOR32 = 0x67 AF_VENDOR33 = 0x69 AF_VENDOR34 = 0x6b AF_VENDOR35 = 0x6d AF_VENDOR36 = 0x6f AF_VENDOR37 = 0x71 AF_VENDOR38 = 0x73 AF_VENDOR39 = 0x75 AF_VENDOR40 = 0x77 AF_VENDOR41 = 0x79 AF_VENDOR42 = 0x7b AF_VENDOR43 = 0x7d AF_VENDOR44 = 0x7f AF_VENDOR45 = 0x81 AF_VENDOR46 = 0x83 AF_VENDOR47 = 0x85 ALTWERASE = 0x200 B0 = 0x0 B110 = 0x6e B115200 = 0x1c200 B1200 = 0x4b0 B134 = 0x86 B14400 = 0x3840 B150 = 0x96 B1800 = 0x708 B19200 = 0x4b00 B200 = 0xc8 B230400 = 0x38400 B2400 = 0x960 B28800 = 0x7080 B300 = 0x12c B38400 = 0x9600 B460800 = 0x70800 B4800 = 0x12c0 B50 = 0x32 B57600 = 0xe100 B600 = 0x258 B7200 = 0x1c20 B75 = 0x4b B76800 = 0x12c00 B921600 = 0xe1000 B9600 = 0x2580 BIOCFEEDBACK = 0x8004427c BIOCFLUSH = 0x20004268 BIOCGBLEN = 0x40044266 BIOCGDIRECTION = 0x40044276 BIOCGDLT = 0x4004426a BIOCGDLTLIST = 0xc0104279 BIOCGETBUFMODE = 0x4004427d BIOCGETIF = 0x4020426b BIOCGETZMAX = 0x4008427f BIOCGHDRCMPLT = 0x40044274 BIOCGRSIG = 0x40044272 BIOCGRTIMEOUT = 0x4010426e BIOCGSEESENT = 0x40044276 BIOCGSTATS = 0x4008426f BIOCGTSTAMP = 0x40044283 BIOCIMMEDIATE = 0x80044270 BIOCLOCK = 0x2000427a BIOCPROMISC = 0x20004269 BIOCROTZBUF = 0x40184280 BIOCSBLEN = 0xc0044266 BIOCSDIRECTION = 0x80044277 BIOCSDLT = 0x80044278 BIOCSETBUFMODE = 0x8004427e BIOCSETF = 0x80104267 BIOCSETFNR = 0x80104282 BIOCSETIF = 0x8020426c BIOCSETWF = 0x8010427b BIOCSETZBUF = 0x80184281 BIOCSHDRCMPLT = 0x80044275 BIOCSRSIG = 0x80044273 BIOCSRTIMEOUT = 0x8010426d BIOCSSEESENT = 0x80044277 BIOCSTSTAMP = 0x80044284 BIOCVERSION = 0x40044271 BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALIGNMENT = 0x8 BPF_ALU = 0x4 BPF_AND = 0x50 BPF_B = 0x10 BPF_BUFMODE_BUFFER = 0x1 BPF_BUFMODE_ZBUF = 0x2 BPF_DIV = 0x30 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 BPF_JA = 0x0 BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 BPF_JMP = 0x5 BPF_JSET = 0x40 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 BPF_LEN = 0x80 BPF_LSH = 0x60 BPF_MAJOR_VERSION = 0x1 BPF_MAXBUFSIZE = 0x80000 BPF_MAXINSNS = 0x200 BPF_MEM = 0x60 BPF_MEMWORDS = 0x10 BPF_MINBUFSIZE = 0x20 BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MOD = 0x90 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_OR = 0x40 BPF_RELEASE = 0x30bb6 BPF_RET = 0x6 BPF_RSH = 0x70 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 BPF_TAX = 0x0 BPF_TXA = 0x80 BPF_T_BINTIME = 0x2 BPF_T_BINTIME_FAST = 0x102 BPF_T_BINTIME_MONOTONIC = 0x202 BPF_T_BINTIME_MONOTONIC_FAST = 0x302 BPF_T_FAST = 0x100 BPF_T_FLAG_MASK = 0x300 BPF_T_FORMAT_MASK = 0x3 BPF_T_MICROTIME = 0x0 BPF_T_MICROTIME_FAST = 0x100 BPF_T_MICROTIME_MONOTONIC = 0x200 BPF_T_MICROTIME_MONOTONIC_FAST = 0x300 BPF_T_MONOTONIC = 0x200 BPF_T_MONOTONIC_FAST = 0x300 BPF_T_NANOTIME = 0x1 BPF_T_NANOTIME_FAST = 0x101 BPF_T_NANOTIME_MONOTONIC = 0x201 BPF_T_NANOTIME_MONOTONIC_FAST = 0x301 BPF_T_NONE = 0x3 BPF_T_NORMAL = 0x0 BPF_W = 0x0 BPF_X = 0x8 BPF_XOR = 0xa0 BRKINT = 0x2 CAP_ACCEPT = 0x200000020000000 CAP_ACL_CHECK = 0x400000000010000 CAP_ACL_DELETE = 0x400000000020000 CAP_ACL_GET = 0x400000000040000 CAP_ACL_SET = 0x400000000080000 CAP_ALL0 = 0x20007ffffffffff CAP_ALL1 = 0x4000000001fffff CAP_BIND = 0x200000040000000 CAP_BINDAT = 0x200008000000400 CAP_CHFLAGSAT = 0x200000000001400 CAP_CONNECT = 0x200000080000000 CAP_CONNECTAT = 0x200010000000400 CAP_CREATE = 0x200000000000040 CAP_EVENT = 0x400000000000020 CAP_EXTATTR_DELETE = 0x400000000001000 CAP_EXTATTR_GET = 0x400000000002000 CAP_EXTATTR_LIST = 0x400000000004000 CAP_EXTATTR_SET = 0x400000000008000 CAP_FCHDIR = 0x200000000000800 CAP_FCHFLAGS = 0x200000000001000 CAP_FCHMOD = 0x200000000002000 CAP_FCHMODAT = 0x200000000002400 CAP_FCHOWN = 0x200000000004000 CAP_FCHOWNAT = 0x200000000004400 CAP_FCNTL = 0x200000000008000 CAP_FCNTL_ALL = 0x78 CAP_FCNTL_GETFL = 0x8 CAP_FCNTL_GETOWN = 0x20 CAP_FCNTL_SETFL = 0x10 CAP_FCNTL_SETOWN = 0x40 CAP_FEXECVE = 0x200000000000080 CAP_FLOCK = 0x200000000010000 CAP_FPATHCONF = 0x200000000020000 CAP_FSCK = 0x200000000040000 CAP_FSTAT = 0x200000000080000 CAP_FSTATAT = 0x200000000080400 CAP_FSTATFS = 0x200000000100000 CAP_FSYNC = 0x200000000000100 CAP_FTRUNCATE = 0x200000000000200 CAP_FUTIMES = 0x200000000200000 CAP_FUTIMESAT = 0x200000000200400 CAP_GETPEERNAME = 0x200000100000000 CAP_GETSOCKNAME = 0x200000200000000 CAP_GETSOCKOPT = 0x200000400000000 CAP_IOCTL = 0x400000000000080 CAP_IOCTLS_ALL = 0x7fffffffffffffff CAP_KQUEUE = 0x400000000100040 CAP_KQUEUE_CHANGE = 0x400000000100000 CAP_KQUEUE_EVENT = 0x400000000000040 CAP_LINKAT_SOURCE = 0x200020000000400 CAP_LINKAT_TARGET = 0x200000000400400 CAP_LISTEN = 0x200000800000000 CAP_LOOKUP = 0x200000000000400 CAP_MAC_GET = 0x400000000000001 CAP_MAC_SET = 0x400000000000002 CAP_MKDIRAT = 0x200000000800400 CAP_MKFIFOAT = 0x200000001000400 CAP_MKNODAT = 0x200000002000400 CAP_MMAP = 0x200000000000010 CAP_MMAP_R = 0x20000000000001d CAP_MMAP_RW = 0x20000000000001f CAP_MMAP_RWX = 0x20000000000003f CAP_MMAP_RX = 0x20000000000003d CAP_MMAP_W = 0x20000000000001e CAP_MMAP_WX = 0x20000000000003e CAP_MMAP_X = 0x20000000000003c CAP_PDGETPID = 0x400000000000200 CAP_PDKILL = 0x400000000000800 CAP_PDWAIT = 0x400000000000400 CAP_PEELOFF = 0x200001000000000 CAP_POLL_EVENT = 0x400000000000020 CAP_PREAD = 0x20000000000000d CAP_PWRITE = 0x20000000000000e CAP_READ = 0x200000000000001 CAP_RECV = 0x200000000000001 CAP_RENAMEAT_SOURCE = 0x200000004000400 CAP_RENAMEAT_TARGET = 0x200040000000400 CAP_RIGHTS_VERSION = 0x0 CAP_RIGHTS_VERSION_00 = 0x0 CAP_SEEK = 0x20000000000000c CAP_SEEK_TELL = 0x200000000000004 CAP_SEM_GETVALUE = 0x400000000000004 CAP_SEM_POST = 0x400000000000008 CAP_SEM_WAIT = 0x400000000000010 CAP_SEND = 0x200000000000002 CAP_SETSOCKOPT = 0x200002000000000 CAP_SHUTDOWN = 0x200004000000000 CAP_SOCK_CLIENT = 0x200007780000003 CAP_SOCK_SERVER = 0x200007f60000003 CAP_SYMLINKAT = 0x200000008000400 CAP_TTYHOOK = 0x400000000000100 CAP_UNLINKAT = 0x200000010000400 CAP_UNUSED0_44 = 0x200080000000000 CAP_UNUSED0_57 = 0x300000000000000 CAP_UNUSED1_22 = 0x400000000200000 CAP_UNUSED1_57 = 0x500000000000000 CAP_WRITE = 0x200000000000002 CFLUSH = 0xf CLOCAL = 0x8000 CLOCK_MONOTONIC = 0x4 CLOCK_MONOTONIC_FAST = 0xc CLOCK_MONOTONIC_PRECISE = 0xb CLOCK_PROCESS_CPUTIME_ID = 0xf CLOCK_PROF = 0x2 CLOCK_REALTIME = 0x0 CLOCK_REALTIME_FAST = 0xa CLOCK_REALTIME_PRECISE = 0x9 CLOCK_SECOND = 0xd CLOCK_THREAD_CPUTIME_ID = 0xe CLOCK_UPTIME = 0x5 CLOCK_UPTIME_FAST = 0x8 CLOCK_UPTIME_PRECISE = 0x7 CLOCK_VIRTUAL = 0x1 CREAD = 0x800 CRTSCTS = 0x30000 CS5 = 0x0 CS6 = 0x100 CS7 = 0x200 CS8 = 0x300 CSIZE = 0x300 CSTART = 0x11 CSTATUS = 0x14 CSTOP = 0x13 CSTOPB = 0x400 CSUSP = 0x1a CTL_MAXNAME = 0x18 CTL_NET = 0x4 DLT_A429 = 0xb8 DLT_A653_ICM = 0xb9 DLT_AIRONET_HEADER = 0x78 DLT_AOS = 0xde DLT_APPLE_IP_OVER_IEEE1394 = 0x8a DLT_ARCNET = 0x7 DLT_ARCNET_LINUX = 0x81 DLT_ATM_CLIP = 0x13 DLT_ATM_RFC1483 = 0xb DLT_AURORA = 0x7e DLT_AX25 = 0x3 DLT_AX25_KISS = 0xca DLT_BACNET_MS_TP = 0xa5 DLT_BLUETOOTH_BREDR_BB = 0xff DLT_BLUETOOTH_HCI_H4 = 0xbb DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 DLT_BLUETOOTH_LE_LL = 0xfb DLT_BLUETOOTH_LE_LL_WITH_PHDR = 0x100 DLT_BLUETOOTH_LINUX_MONITOR = 0xfe DLT_CAN20B = 0xbe DLT_CAN_SOCKETCAN = 0xe3 DLT_CHAOS = 0x5 DLT_CHDLC = 0x68 DLT_CISCO_IOS = 0x76 DLT_C_HDLC = 0x68 DLT_C_HDLC_WITH_DIR = 0xcd DLT_DBUS = 0xe7 DLT_DECT = 0xdd DLT_DOCSIS = 0x8f DLT_DVB_CI = 0xeb DLT_ECONET = 0x73 DLT_EN10MB = 0x1 DLT_EN3MB = 0x2 DLT_ENC = 0x6d DLT_EPON = 0x103 DLT_ERF = 0xc5 DLT_ERF_ETH = 0xaf DLT_ERF_POS = 0xb0 DLT_FC_2 = 0xe0 DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 DLT_FDDI = 0xa DLT_FLEXRAY = 0xd2 DLT_FRELAY = 0x6b DLT_FRELAY_WITH_DIR = 0xce DLT_GCOM_SERIAL = 0xad DLT_GCOM_T1E1 = 0xac DLT_GPF_F = 0xab DLT_GPF_T = 0xaa DLT_GPRS_LLC = 0xa9 DLT_GSMTAP_ABIS = 0xda DLT_GSMTAP_UM = 0xd9 DLT_HHDLC = 0x79 DLT_IBM_SN = 0x92 DLT_IBM_SP = 0x91 DLT_IEEE802 = 0x6 DLT_IEEE802_11 = 0x69 DLT_IEEE802_11_RADIO = 0x7f DLT_IEEE802_11_RADIO_AVS = 0xa3 DLT_IEEE802_15_4 = 0xc3 DLT_IEEE802_15_4_LINUX = 0xbf DLT_IEEE802_15_4_NOFCS = 0xe6 DLT_IEEE802_15_4_NONASK_PHY = 0xd7 DLT_IEEE802_16_MAC_CPS = 0xbc DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 DLT_INFINIBAND = 0xf7 DLT_IPFILTER = 0x74 DLT_IPMB = 0xc7 DLT_IPMB_LINUX = 0xd1 DLT_IPMI_HPM_2 = 0x104 DLT_IPNET = 0xe2 DLT_IPOIB = 0xf2 DLT_IPV4 = 0xe4 DLT_IPV6 = 0xe5 DLT_IP_OVER_FC = 0x7a DLT_JUNIPER_ATM1 = 0x89 DLT_JUNIPER_ATM2 = 0x87 DLT_JUNIPER_ATM_CEMIC = 0xee DLT_JUNIPER_CHDLC = 0xb5 DLT_JUNIPER_ES = 0x84 DLT_JUNIPER_ETHER = 0xb2 DLT_JUNIPER_FIBRECHANNEL = 0xea DLT_JUNIPER_FRELAY = 0xb4 DLT_JUNIPER_GGSN = 0x85 DLT_JUNIPER_ISM = 0xc2 DLT_JUNIPER_MFR = 0x86 DLT_JUNIPER_MLFR = 0x83 DLT_JUNIPER_MLPPP = 0x82 DLT_JUNIPER_MONITOR = 0xa4 DLT_JUNIPER_PIC_PEER = 0xae DLT_JUNIPER_PPP = 0xb3 DLT_JUNIPER_PPPOE = 0xa7 DLT_JUNIPER_PPPOE_ATM = 0xa8 DLT_JUNIPER_SERVICES = 0x88 DLT_JUNIPER_SRX_E2E = 0xe9 DLT_JUNIPER_ST = 0xc8 DLT_JUNIPER_VP = 0xb7 DLT_JUNIPER_VS = 0xe8 DLT_LAPB_WITH_DIR = 0xcf DLT_LAPD = 0xcb DLT_LIN = 0xd4 DLT_LINUX_EVDEV = 0xd8 DLT_LINUX_IRDA = 0x90 DLT_LINUX_LAPD = 0xb1 DLT_LINUX_PPP_WITHDIRECTION = 0xa6 DLT_LINUX_SLL = 0x71 DLT_LOOP = 0x6c DLT_LTALK = 0x72 DLT_MATCHING_MAX = 0x104 DLT_MATCHING_MIN = 0x68 DLT_MFR = 0xb6 DLT_MOST = 0xd3 DLT_MPEG_2_TS = 0xf3 DLT_MPLS = 0xdb DLT_MTP2 = 0x8c DLT_MTP2_WITH_PHDR = 0x8b DLT_MTP3 = 0x8d DLT_MUX27010 = 0xec DLT_NETANALYZER = 0xf0 DLT_NETANALYZER_TRANSPARENT = 0xf1 DLT_NETLINK = 0xfd DLT_NFC_LLCP = 0xf5 DLT_NFLOG = 0xef DLT_NG40 = 0xf4 DLT_NULL = 0x0 DLT_PCI_EXP = 0x7d DLT_PFLOG = 0x75 DLT_PFSYNC = 0x79 DLT_PKTAP = 0x102 DLT_PPI = 0xc0 DLT_PPP = 0x9 DLT_PPP_BSDOS = 0x10 DLT_PPP_ETHER = 0x33 DLT_PPP_PPPD = 0xa6 DLT_PPP_SERIAL = 0x32 DLT_PPP_WITH_DIR = 0xcc DLT_PPP_WITH_DIRECTION = 0xa6 DLT_PRISM_HEADER = 0x77 DLT_PROFIBUS_DL = 0x101 DLT_PRONET = 0x4 DLT_RAIF1 = 0xc6 DLT_RAW = 0xc DLT_RIO = 0x7c DLT_RTAC_SERIAL = 0xfa DLT_SCCP = 0x8e DLT_SCTP = 0xf8 DLT_SITA = 0xc4 DLT_SLIP = 0x8 DLT_SLIP_BSDOS = 0xf DLT_STANAG_5066_D_PDU = 0xed DLT_SUNATM = 0x7b DLT_SYMANTEC_FIREWALL = 0x63 DLT_TZSP = 0x80 DLT_USB = 0xba DLT_USBPCAP = 0xf9 DLT_USB_LINUX = 0xbd DLT_USB_LINUX_MMAPPED = 0xdc DLT_USER0 = 0x93 DLT_USER1 = 0x94 DLT_USER10 = 0x9d DLT_USER11 = 0x9e DLT_USER12 = 0x9f DLT_USER13 = 0xa0 DLT_USER14 = 0xa1 DLT_USER15 = 0xa2 DLT_USER2 = 0x95 DLT_USER3 = 0x96 DLT_USER4 = 0x97 DLT_USER5 = 0x98 DLT_USER6 = 0x99 DLT_USER7 = 0x9a DLT_USER8 = 0x9b DLT_USER9 = 0x9c DLT_WIHART = 0xdf DLT_WIRESHARK_UPPER_PDU = 0xfc DLT_X2E_SERIAL = 0xd5 DLT_X2E_XORAYA = 0xd6 DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 DT_FIFO = 0x1 DT_LNK = 0xa DT_REG = 0x8 DT_SOCK = 0xc DT_UNKNOWN = 0x0 DT_WHT = 0xe ECHO = 0x8 ECHOCTL = 0x40 ECHOE = 0x2 ECHOK = 0x4 ECHOKE = 0x1 ECHONL = 0x10 ECHOPRT = 0x20 EVFILT_AIO = -0x3 EVFILT_FS = -0x9 EVFILT_LIO = -0xa EVFILT_PROC = -0x5 EVFILT_PROCDESC = -0x8 EVFILT_READ = -0x1 EVFILT_SENDFILE = -0xc EVFILT_SIGNAL = -0x6 EVFILT_SYSCOUNT = 0xc EVFILT_TIMER = -0x7 EVFILT_USER = -0xb EVFILT_VNODE = -0x4 EVFILT_WRITE = -0x2 EV_ADD = 0x1 EV_CLEAR = 0x20 EV_DELETE = 0x2 EV_DISABLE = 0x8 EV_DISPATCH = 0x80 EV_DROP = 0x1000 EV_ENABLE = 0x4 EV_EOF = 0x8000 EV_ERROR = 0x4000 EV_FLAG1 = 0x2000 EV_FLAG2 = 0x4000 EV_FORCEONESHOT = 0x100 EV_ONESHOT = 0x10 EV_RECEIPT = 0x40 EV_SYSFLAGS = 0xf000 EXTA = 0x4b00 EXTATTR_NAMESPACE_EMPTY = 0x0 EXTATTR_NAMESPACE_SYSTEM = 0x2 EXTATTR_NAMESPACE_USER = 0x1 EXTB = 0x9600 EXTPROC = 0x800 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FLUSHO = 0x800000 F_CANCEL = 0x5 F_DUP2FD = 0xa F_DUP2FD_CLOEXEC = 0x12 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0x11 F_GETFD = 0x1 F_GETFL = 0x3 F_GETLK = 0xb F_GETOWN = 0x5 F_OGETLK = 0x7 F_OK = 0x0 F_OSETLK = 0x8 F_OSETLKW = 0x9 F_RDAHEAD = 0x10 F_RDLCK = 0x1 F_READAHEAD = 0xf F_SETFD = 0x2 F_SETFL = 0x4 F_SETLK = 0xc F_SETLKW = 0xd F_SETLK_REMOTE = 0xe F_SETOWN = 0x6 F_UNLCK = 0x2 F_UNLCKSYS = 0x4 F_WRLCK = 0x3 HUPCL = 0x4000 ICANON = 0x100 ICMP6_FILTER = 0x12 ICRNL = 0x100 IEXTEN = 0x400 IFAN_ARRIVAL = 0x0 IFAN_DEPARTURE = 0x1 IFF_ALLMULTI = 0x200 IFF_ALTPHYS = 0x4000 IFF_BROADCAST = 0x2 IFF_CANTCHANGE = 0x218f52 IFF_CANTCONFIG = 0x10000 IFF_DEBUG = 0x4 IFF_DRV_OACTIVE = 0x400 IFF_DRV_RUNNING = 0x40 IFF_DYING = 0x200000 IFF_LINK0 = 0x1000 IFF_LINK1 = 0x2000 IFF_LINK2 = 0x4000 IFF_LOOPBACK = 0x8 IFF_MONITOR = 0x40000 IFF_MULTICAST = 0x8000 IFF_NOARP = 0x80 IFF_OACTIVE = 0x400 IFF_POINTOPOINT = 0x10 IFF_PPROMISC = 0x20000 IFF_PROMISC = 0x100 IFF_RENAMING = 0x400000 IFF_RUNNING = 0x40 IFF_SIMPLEX = 0x800 IFF_STATICARP = 0x80000 IFF_UP = 0x1 IFNAMSIZ = 0x10 IFT_BRIDGE = 0xd1 IFT_CARP = 0xf8 IFT_IEEE1394 = 0x90 IFT_INFINIBAND = 0xc7 IFT_L2VLAN = 0x87 IFT_L3IPVLAN = 0x88 IFT_PPP = 0x17 IFT_PROPVIRTUAL = 0x35 IGNBRK = 0x1 IGNCR = 0x80 IGNPAR = 0x4 IMAXBEL = 0x2000 INLCR = 0x40 INPCK = 0x10 IN_CLASSA_HOST = 0xffffff IN_CLASSA_MAX = 0x80 IN_CLASSA_NET = 0xff000000 IN_CLASSA_NSHIFT = 0x18 IN_CLASSB_HOST = 0xffff IN_CLASSB_MAX = 0x10000 IN_CLASSB_NET = 0xffff0000 IN_CLASSB_NSHIFT = 0x10 IN_CLASSC_HOST = 0xff IN_CLASSC_NET = 0xffffff00 IN_CLASSC_NSHIFT = 0x8 IN_CLASSD_HOST = 0xfffffff IN_CLASSD_NET = 0xf0000000 IN_CLASSD_NSHIFT = 0x1c IN_LOOPBACKNET = 0x7f IN_RFC3021_MASK = 0xfffffffe IPPROTO_3PC = 0x22 IPPROTO_ADFS = 0x44 IPPROTO_AH = 0x33 IPPROTO_AHIP = 0x3d IPPROTO_APES = 0x63 IPPROTO_ARGUS = 0xd IPPROTO_AX25 = 0x5d IPPROTO_BHA = 0x31 IPPROTO_BLT = 0x1e IPPROTO_BRSATMON = 0x4c IPPROTO_CARP = 0x70 IPPROTO_CFTP = 0x3e IPPROTO_CHAOS = 0x10 IPPROTO_CMTP = 0x26 IPPROTO_CPHB = 0x49 IPPROTO_CPNX = 0x48 IPPROTO_DDP = 0x25 IPPROTO_DGP = 0x56 IPPROTO_DIVERT = 0x102 IPPROTO_DONE = 0x101 IPPROTO_DSTOPTS = 0x3c IPPROTO_EGP = 0x8 IPPROTO_EMCON = 0xe IPPROTO_ENCAP = 0x62 IPPROTO_EON = 0x50 IPPROTO_ESP = 0x32 IPPROTO_ETHERIP = 0x61 IPPROTO_FRAGMENT = 0x2c IPPROTO_GGP = 0x3 IPPROTO_GMTP = 0x64 IPPROTO_GRE = 0x2f IPPROTO_HELLO = 0x3f IPPROTO_HIP = 0x8b IPPROTO_HMP = 0x14 IPPROTO_HOPOPTS = 0x0 IPPROTO_ICMP = 0x1 IPPROTO_ICMPV6 = 0x3a IPPROTO_IDP = 0x16 IPPROTO_IDPR = 0x23 IPPROTO_IDRP = 0x2d IPPROTO_IGMP = 0x2 IPPROTO_IGP = 0x55 IPPROTO_IGRP = 0x58 IPPROTO_IL = 0x28 IPPROTO_INLSP = 0x34 IPPROTO_INP = 0x20 IPPROTO_IP = 0x0 IPPROTO_IPCOMP = 0x6c IPPROTO_IPCV = 0x47 IPPROTO_IPEIP = 0x5e IPPROTO_IPIP = 0x4 IPPROTO_IPPC = 0x43 IPPROTO_IPV4 = 0x4 IPPROTO_IPV6 = 0x29 IPPROTO_IRTP = 0x1c IPPROTO_KRYPTOLAN = 0x41 IPPROTO_LARP = 0x5b IPPROTO_LEAF1 = 0x19 IPPROTO_LEAF2 = 0x1a IPPROTO_MAX = 0x100 IPPROTO_MEAS = 0x13 IPPROTO_MH = 0x87 IPPROTO_MHRP = 0x30 IPPROTO_MICP = 0x5f IPPROTO_MOBILE = 0x37 IPPROTO_MPLS = 0x89 IPPROTO_MTP = 0x5c IPPROTO_MUX = 0x12 IPPROTO_ND = 0x4d IPPROTO_NHRP = 0x36 IPPROTO_NONE = 0x3b IPPROTO_NSP = 0x1f IPPROTO_NVPII = 0xb IPPROTO_OLD_DIVERT = 0xfe IPPROTO_OSPFIGP = 0x59 IPPROTO_PFSYNC = 0xf0 IPPROTO_PGM = 0x71 IPPROTO_PIGP = 0x9 IPPROTO_PIM = 0x67 IPPROTO_PRM = 0x15 IPPROTO_PUP = 0xc IPPROTO_PVP = 0x4b IPPROTO_RAW = 0xff IPPROTO_RCCMON = 0xa IPPROTO_RDP = 0x1b IPPROTO_RESERVED_253 = 0xfd IPPROTO_RESERVED_254 = 0xfe IPPROTO_ROUTING = 0x2b IPPROTO_RSVP = 0x2e IPPROTO_RVD = 0x42 IPPROTO_SATEXPAK = 0x40 IPPROTO_SATMON = 0x45 IPPROTO_SCCSP = 0x60 IPPROTO_SCTP = 0x84 IPPROTO_SDRP = 0x2a IPPROTO_SEND = 0x103 IPPROTO_SEP = 0x21 IPPROTO_SHIM6 = 0x8c IPPROTO_SKIP = 0x39 IPPROTO_SPACER = 0x7fff IPPROTO_SRPC = 0x5a IPPROTO_ST = 0x7 IPPROTO_SVMTP = 0x52 IPPROTO_SWIPE = 0x35 IPPROTO_TCF = 0x57 IPPROTO_TCP = 0x6 IPPROTO_TLSP = 0x38 IPPROTO_TP = 0x1d IPPROTO_TPXX = 0x27 IPPROTO_TRUNK1 = 0x17 IPPROTO_TRUNK2 = 0x18 IPPROTO_TTP = 0x54 IPPROTO_UDP = 0x11 IPPROTO_UDPLITE = 0x88 IPPROTO_VINES = 0x53 IPPROTO_VISA = 0x46 IPPROTO_VMTP = 0x51 IPPROTO_WBEXPAK = 0x4f IPPROTO_WBMON = 0x4e IPPROTO_WSN = 0x4a IPPROTO_XNET = 0xf IPPROTO_XTP = 0x24 IPV6_AUTOFLOWLABEL = 0x3b IPV6_BINDANY = 0x40 IPV6_BINDMULTI = 0x41 IPV6_BINDV6ONLY = 0x1b IPV6_CHECKSUM = 0x1a IPV6_DEFAULT_MULTICAST_HOPS = 0x1 IPV6_DEFAULT_MULTICAST_LOOP = 0x1 IPV6_DEFHLIM = 0x40 IPV6_DONTFRAG = 0x3e IPV6_DSTOPTS = 0x32 IPV6_FLOWID = 0x43 IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 IPV6_FLOWTYPE = 0x44 IPV6_FRAGTTL = 0x78 IPV6_FW_ADD = 0x1e IPV6_FW_DEL = 0x1f IPV6_FW_FLUSH = 0x20 IPV6_FW_GET = 0x22 IPV6_FW_ZERO = 0x21 IPV6_HLIMDEC = 0x1 IPV6_HOPLIMIT = 0x2f IPV6_HOPOPTS = 0x31 IPV6_IPSEC_POLICY = 0x1c IPV6_JOIN_GROUP = 0xc IPV6_LEAVE_GROUP = 0xd IPV6_MAXHLIM = 0xff IPV6_MAXOPTHDR = 0x800 IPV6_MAXPACKET = 0xffff IPV6_MAX_GROUP_SRC_FILTER = 0x200 IPV6_MAX_MEMBERSHIPS = 0xfff IPV6_MAX_SOCK_SRC_FILTER = 0x80 IPV6_MIN_MEMBERSHIPS = 0x1f IPV6_MMTU = 0x500 IPV6_MSFILTER = 0x4a IPV6_MULTICAST_HOPS = 0xa IPV6_MULTICAST_IF = 0x9 IPV6_MULTICAST_LOOP = 0xb IPV6_NEXTHOP = 0x30 IPV6_PATHMTU = 0x2c IPV6_PKTINFO = 0x2e IPV6_PORTRANGE = 0xe IPV6_PORTRANGE_DEFAULT = 0x0 IPV6_PORTRANGE_HIGH = 0x1 IPV6_PORTRANGE_LOW = 0x2 IPV6_PREFER_TEMPADDR = 0x3f IPV6_RECVDSTOPTS = 0x28 IPV6_RECVFLOWID = 0x46 IPV6_RECVHOPLIMIT = 0x25 IPV6_RECVHOPOPTS = 0x27 IPV6_RECVPATHMTU = 0x2b IPV6_RECVPKTINFO = 0x24 IPV6_RECVRSSBUCKETID = 0x47 IPV6_RECVRTHDR = 0x26 IPV6_RECVTCLASS = 0x39 IPV6_RSSBUCKETID = 0x45 IPV6_RSS_LISTEN_BUCKET = 0x42 IPV6_RTHDR = 0x33 IPV6_RTHDRDSTOPTS = 0x23 IPV6_RTHDR_LOOSE = 0x0 IPV6_RTHDR_STRICT = 0x1 IPV6_RTHDR_TYPE_0 = 0x0 IPV6_SOCKOPT_RESERVED1 = 0x3 IPV6_TCLASS = 0x3d IPV6_UNICAST_HOPS = 0x4 IPV6_USE_MIN_MTU = 0x2a IPV6_V6ONLY = 0x1b IPV6_VERSION = 0x60 IPV6_VERSION_MASK = 0xf0 IP_ADD_MEMBERSHIP = 0xc IP_ADD_SOURCE_MEMBERSHIP = 0x46 IP_BINDANY = 0x18 IP_BINDMULTI = 0x19 IP_BLOCK_SOURCE = 0x48 IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 IP_DONTFRAG = 0x43 IP_DROP_MEMBERSHIP = 0xd IP_DROP_SOURCE_MEMBERSHIP = 0x47 IP_DUMMYNET3 = 0x31 IP_DUMMYNET_CONFIGURE = 0x3c IP_DUMMYNET_DEL = 0x3d IP_DUMMYNET_FLUSH = 0x3e IP_DUMMYNET_GET = 0x40 IP_FLOWID = 0x5a IP_FLOWTYPE = 0x5b IP_FW3 = 0x30 IP_FW_ADD = 0x32 IP_FW_DEL = 0x33 IP_FW_FLUSH = 0x34 IP_FW_GET = 0x36 IP_FW_NAT_CFG = 0x38 IP_FW_NAT_DEL = 0x39 IP_FW_NAT_GET_CONFIG = 0x3a IP_FW_NAT_GET_LOG = 0x3b IP_FW_RESETLOG = 0x37 IP_FW_TABLE_ADD = 0x28 IP_FW_TABLE_DEL = 0x29 IP_FW_TABLE_FLUSH = 0x2a IP_FW_TABLE_GETSIZE = 0x2b IP_FW_TABLE_LIST = 0x2c IP_FW_ZERO = 0x35 IP_HDRINCL = 0x2 IP_IPSEC_POLICY = 0x15 IP_MAXPACKET = 0xffff IP_MAX_GROUP_SRC_FILTER = 0x200 IP_MAX_MEMBERSHIPS = 0xfff IP_MAX_SOCK_MUTE_FILTER = 0x80 IP_MAX_SOCK_SRC_FILTER = 0x80 IP_MAX_SOURCE_FILTER = 0x400 IP_MF = 0x2000 IP_MINTTL = 0x42 IP_MIN_MEMBERSHIPS = 0x1f IP_MSFILTER = 0x4a IP_MSS = 0x240 IP_MULTICAST_IF = 0x9 IP_MULTICAST_LOOP = 0xb IP_MULTICAST_TTL = 0xa IP_MULTICAST_VIF = 0xe IP_OFFMASK = 0x1fff IP_ONESBCAST = 0x17 IP_OPTIONS = 0x1 IP_PORTRANGE = 0x13 IP_PORTRANGE_DEFAULT = 0x0 IP_PORTRANGE_HIGH = 0x1 IP_PORTRANGE_LOW = 0x2 IP_RECVDSTADDR = 0x7 IP_RECVFLOWID = 0x5d IP_RECVIF = 0x14 IP_RECVOPTS = 0x5 IP_RECVRETOPTS = 0x6 IP_RECVRSSBUCKETID = 0x5e IP_RECVTOS = 0x44 IP_RECVTTL = 0x41 IP_RETOPTS = 0x8 IP_RF = 0x8000 IP_RSSBUCKETID = 0x5c IP_RSS_LISTEN_BUCKET = 0x1a IP_RSVP_OFF = 0x10 IP_RSVP_ON = 0xf IP_RSVP_VIF_OFF = 0x12 IP_RSVP_VIF_ON = 0x11 IP_SENDSRCADDR = 0x7 IP_TOS = 0x3 IP_TTL = 0x4 IP_UNBLOCK_SOURCE = 0x49 ISIG = 0x80 ISTRIP = 0x20 IXANY = 0x800 IXOFF = 0x400 IXON = 0x200 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 MADV_AUTOSYNC = 0x7 MADV_CORE = 0x9 MADV_DONTNEED = 0x4 MADV_FREE = 0x5 MADV_NOCORE = 0x8 MADV_NORMAL = 0x0 MADV_NOSYNC = 0x6 MADV_PROTECT = 0xa MADV_RANDOM = 0x1 MADV_SEQUENTIAL = 0x2 MADV_WILLNEED = 0x3 MAP_32BIT = 0x80000 MAP_ALIGNED_SUPER = 0x1000000 MAP_ALIGNMENT_MASK = -0x1000000 MAP_ALIGNMENT_SHIFT = 0x18 MAP_ANON = 0x1000 MAP_ANONYMOUS = 0x1000 MAP_COPY = 0x2 MAP_EXCL = 0x4000 MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_HASSEMAPHORE = 0x200 MAP_NOCORE = 0x20000 MAP_NOSYNC = 0x800 MAP_PREFAULT_READ = 0x40000 MAP_PRIVATE = 0x2 MAP_RESERVED0020 = 0x20 MAP_RESERVED0040 = 0x40 MAP_RESERVED0080 = 0x80 MAP_RESERVED0100 = 0x100 MAP_SHARED = 0x1 MAP_STACK = 0x400 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MNT_ACLS = 0x8000000 MNT_ASYNC = 0x40 MNT_AUTOMOUNTED = 0x200000000 MNT_BYFSID = 0x8000000 MNT_CMDFLAGS = 0xd0f0000 MNT_DEFEXPORTED = 0x200 MNT_DELEXPORT = 0x20000 MNT_EXKERB = 0x800 MNT_EXPORTANON = 0x400 MNT_EXPORTED = 0x100 MNT_EXPUBLIC = 0x20000000 MNT_EXRDONLY = 0x80 MNT_FORCE = 0x80000 MNT_GJOURNAL = 0x2000000 MNT_IGNORE = 0x800000 MNT_LAZY = 0x3 MNT_LOCAL = 0x1000 MNT_MULTILABEL = 0x4000000 MNT_NFS4ACLS = 0x10 MNT_NOATIME = 0x10000000 MNT_NOCLUSTERR = 0x40000000 MNT_NOCLUSTERW = 0x80000000 MNT_NOEXEC = 0x4 MNT_NONBUSY = 0x4000000 MNT_NOSUID = 0x8 MNT_NOSYMFOLLOW = 0x400000 MNT_NOWAIT = 0x2 MNT_QUOTA = 0x2000 MNT_RDONLY = 0x1 MNT_RELOAD = 0x40000 MNT_ROOTFS = 0x4000 MNT_SNAPSHOT = 0x1000000 MNT_SOFTDEP = 0x200000 MNT_SUIDDIR = 0x100000 MNT_SUJ = 0x100000000 MNT_SUSPEND = 0x4 MNT_SYNCHRONOUS = 0x2 MNT_UNION = 0x20 MNT_UPDATE = 0x10000 MNT_UPDATEMASK = 0x2d8d0807e MNT_USER = 0x8000 MNT_VISFLAGMASK = 0x3fef0ffff MNT_WAIT = 0x1 MSG_CMSG_CLOEXEC = 0x40000 MSG_COMPAT = 0x8000 MSG_CTRUNC = 0x20 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x80 MSG_EOF = 0x100 MSG_EOR = 0x8 MSG_NBIO = 0x4000 MSG_NOSIGNAL = 0x20000 MSG_NOTIFICATION = 0x2000 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_TRUNC = 0x10 MSG_WAITALL = 0x40 MSG_WAITFORONE = 0x80000 MS_ASYNC = 0x1 MS_INVALIDATE = 0x2 MS_SYNC = 0x0 NAME_MAX = 0xff NET_RT_DUMP = 0x1 NET_RT_FLAGS = 0x2 NET_RT_IFLIST = 0x3 NET_RT_IFLISTL = 0x5 NET_RT_IFMALIST = 0x4 NOFLSH = 0x80000000 NOKERNINFO = 0x2000000 NOTE_ATTRIB = 0x8 NOTE_CHILD = 0x4 NOTE_CLOSE = 0x100 NOTE_CLOSE_WRITE = 0x200 NOTE_DELETE = 0x1 NOTE_EXEC = 0x20000000 NOTE_EXIT = 0x80000000 NOTE_EXTEND = 0x4 NOTE_FFAND = 0x40000000 NOTE_FFCOPY = 0xc0000000 NOTE_FFCTRLMASK = 0xc0000000 NOTE_FFLAGSMASK = 0xffffff NOTE_FFNOP = 0x0 NOTE_FFOR = 0x80000000 NOTE_FILE_POLL = 0x2 NOTE_FORK = 0x40000000 NOTE_LINK = 0x10 NOTE_LOWAT = 0x1 NOTE_MSECONDS = 0x2 NOTE_NSECONDS = 0x8 NOTE_OPEN = 0x80 NOTE_PCTRLMASK = 0xf0000000 NOTE_PDATAMASK = 0xfffff NOTE_READ = 0x400 NOTE_RENAME = 0x20 NOTE_REVOKE = 0x40 NOTE_SECONDS = 0x1 NOTE_TRACK = 0x1 NOTE_TRACKERR = 0x2 NOTE_TRIGGER = 0x1000000 NOTE_USECONDS = 0x4 NOTE_WRITE = 0x2 OCRNL = 0x10 ONLCR = 0x2 ONLRET = 0x40 ONOCR = 0x20 ONOEOT = 0x8 OPOST = 0x1 OXTABS = 0x4 O_ACCMODE = 0x3 O_APPEND = 0x8 O_ASYNC = 0x40 O_CLOEXEC = 0x100000 O_CREAT = 0x200 O_DIRECT = 0x10000 O_DIRECTORY = 0x20000 O_EXCL = 0x800 O_EXEC = 0x40000 O_EXLOCK = 0x20 O_FSYNC = 0x80 O_NDELAY = 0x4 O_NOCTTY = 0x8000 O_NOFOLLOW = 0x100 O_NONBLOCK = 0x4 O_RDONLY = 0x0 O_RDWR = 0x2 O_SHLOCK = 0x10 O_SYNC = 0x80 O_TRUNC = 0x400 O_TTY_INIT = 0x80000 O_VERIFY = 0x200000 O_WRONLY = 0x1 PARENB = 0x1000 PARMRK = 0x8 PARODD = 0x2000 PENDIN = 0x20000000 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 PROT_EXEC = 0x4 PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 RLIMIT_AS = 0xa RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 RLIMIT_MEMLOCK = 0x6 RLIMIT_NOFILE = 0x8 RLIMIT_NPROC = 0x7 RLIMIT_RSS = 0x5 RLIMIT_STACK = 0x3 RLIM_INFINITY = 0x7fffffffffffffff RTAX_AUTHOR = 0x6 RTAX_BRD = 0x7 RTAX_DST = 0x0 RTAX_GATEWAY = 0x1 RTAX_GENMASK = 0x3 RTAX_IFA = 0x5 RTAX_IFP = 0x4 RTAX_MAX = 0x8 RTAX_NETMASK = 0x2 RTA_AUTHOR = 0x40 RTA_BRD = 0x80 RTA_DST = 0x1 RTA_GATEWAY = 0x2 RTA_GENMASK = 0x8 RTA_IFA = 0x20 RTA_IFP = 0x10 RTA_NETMASK = 0x4 RTF_BLACKHOLE = 0x1000 RTF_BROADCAST = 0x400000 RTF_DONE = 0x40 RTF_DYNAMIC = 0x10 RTF_FIXEDMTU = 0x80000 RTF_FMASK = 0x1004d808 RTF_GATEWAY = 0x2 RTF_GWFLAG_COMPAT = 0x80000000 RTF_HOST = 0x4 RTF_LLDATA = 0x400 RTF_LLINFO = 0x400 RTF_LOCAL = 0x200000 RTF_MODIFIED = 0x20 RTF_MULTICAST = 0x800000 RTF_PINNED = 0x100000 RTF_PROTO1 = 0x8000 RTF_PROTO2 = 0x4000 RTF_PROTO3 = 0x40000 RTF_REJECT = 0x8 RTF_RNH_LOCKED = 0x40000000 RTF_STATIC = 0x800 RTF_STICKY = 0x10000000 RTF_UP = 0x1 RTF_XRESOLVE = 0x200 RTM_ADD = 0x1 RTM_CHANGE = 0x3 RTM_DELADDR = 0xd RTM_DELETE = 0x2 RTM_DELMADDR = 0x10 RTM_GET = 0x4 RTM_IEEE80211 = 0x12 RTM_IFANNOUNCE = 0x11 RTM_IFINFO = 0xe RTM_LOCK = 0x8 RTM_LOSING = 0x5 RTM_MISS = 0x7 RTM_NEWADDR = 0xc RTM_NEWMADDR = 0xf RTM_REDIRECT = 0x6 RTM_RESOLVE = 0xb RTM_RTTUNIT = 0xf4240 RTM_VERSION = 0x5 RTV_EXPIRE = 0x4 RTV_HOPCOUNT = 0x2 RTV_MTU = 0x1 RTV_RPIPE = 0x8 RTV_RTT = 0x40 RTV_RTTVAR = 0x80 RTV_SPIPE = 0x10 RTV_SSTHRESH = 0x20 RTV_WEIGHT = 0x100 RT_ALL_FIBS = -0x1 RT_BLACKHOLE = 0x40 RT_CACHING_CONTEXT = 0x1 RT_DEFAULT_FIB = 0x0 RT_HAS_GW = 0x80 RT_HAS_HEADER = 0x10 RT_HAS_HEADER_BIT = 0x4 RT_L2_ME = 0x4 RT_L2_ME_BIT = 0x2 RT_LLE_CACHE = 0x100 RT_MAY_LOOP = 0x8 RT_MAY_LOOP_BIT = 0x3 RT_NORTREF = 0x2 RT_REJECT = 0x20 RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 RUSAGE_THREAD = 0x1 SCM_BINTIME = 0x4 SCM_CREDS = 0x3 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x2 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 SIOCADDMULTI = 0x80206931 SIOCAIFADDR = 0x8040691a SIOCAIFGROUP = 0x80286987 SIOCATMARK = 0x40047307 SIOCDELMULTI = 0x80206932 SIOCDIFADDR = 0x80206919 SIOCDIFGROUP = 0x80286989 SIOCDIFPHYADDR = 0x80206949 SIOCGDRVSPEC = 0xc028697b SIOCGETSGCNT = 0xc0207210 SIOCGETVIFCNT = 0xc028720f SIOCGHIWAT = 0x40047301 SIOCGI2C = 0xc020693d SIOCGIFADDR = 0xc0206921 SIOCGIFBRDADDR = 0xc0206923 SIOCGIFCAP = 0xc020691f SIOCGIFCONF = 0xc0106924 SIOCGIFDESCR = 0xc020692a SIOCGIFDSTADDR = 0xc0206922 SIOCGIFFIB = 0xc020695c SIOCGIFFLAGS = 0xc0206911 SIOCGIFGENERIC = 0xc020693a SIOCGIFGMEMB = 0xc028698a SIOCGIFGROUP = 0xc0286988 SIOCGIFINDEX = 0xc0206920 SIOCGIFMAC = 0xc0206926 SIOCGIFMEDIA = 0xc0306938 SIOCGIFMETRIC = 0xc0206917 SIOCGIFMTU = 0xc0206933 SIOCGIFNETMASK = 0xc0206925 SIOCGIFPDSTADDR = 0xc0206948 SIOCGIFPHYS = 0xc0206935 SIOCGIFPSRCADDR = 0xc0206947 SIOCGIFSTATUS = 0xc331693b SIOCGIFXMEDIA = 0xc030698b SIOCGLOWAT = 0x40047303 SIOCGPGRP = 0x40047309 SIOCGPRIVATE_0 = 0xc0206950 SIOCGPRIVATE_1 = 0xc0206951 SIOCGTUNFIB = 0xc020695e SIOCIFCREATE = 0xc020697a SIOCIFCREATE2 = 0xc020697c SIOCIFDESTROY = 0x80206979 SIOCIFGCLONERS = 0xc0106978 SIOCSDRVSPEC = 0x8028697b SIOCSHIWAT = 0x80047300 SIOCSIFADDR = 0x8020690c SIOCSIFBRDADDR = 0x80206913 SIOCSIFCAP = 0x8020691e SIOCSIFDESCR = 0x80206929 SIOCSIFDSTADDR = 0x8020690e SIOCSIFFIB = 0x8020695d SIOCSIFFLAGS = 0x80206910 SIOCSIFGENERIC = 0x80206939 SIOCSIFLLADDR = 0x8020693c SIOCSIFMAC = 0x80206927 SIOCSIFMEDIA = 0xc0206937 SIOCSIFMETRIC = 0x80206918 SIOCSIFMTU = 0x80206934 SIOCSIFNAME = 0x80206928 SIOCSIFNETMASK = 0x80206916 SIOCSIFPHYADDR = 0x80406946 SIOCSIFPHYS = 0x80206936 SIOCSIFRVNET = 0xc020695b SIOCSIFVNET = 0xc020695a SIOCSLOWAT = 0x80047302 SIOCSPGRP = 0x80047308 SIOCSTUNFIB = 0x8020695f SOCK_CLOEXEC = 0x10000000 SOCK_DGRAM = 0x2 SOCK_MAXADDRLEN = 0xff SOCK_NONBLOCK = 0x20000000 SOCK_RAW = 0x3 SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x1 SOL_SOCKET = 0xffff SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x2 SO_ACCEPTFILTER = 0x1000 SO_BINTIME = 0x2000 SO_BROADCAST = 0x20 SO_DEBUG = 0x1 SO_DONTROUTE = 0x10 SO_ERROR = 0x1007 SO_KEEPALIVE = 0x8 SO_LABEL = 0x1009 SO_LINGER = 0x80 SO_LISTENINCQLEN = 0x1013 SO_LISTENQLEN = 0x1012 SO_LISTENQLIMIT = 0x1011 SO_NOSIGPIPE = 0x800 SO_NO_DDP = 0x8000 SO_NO_OFFLOAD = 0x4000 SO_OOBINLINE = 0x100 SO_PEERLABEL = 0x1010 SO_PROTOCOL = 0x1016 SO_PROTOTYPE = 0x1016 SO_RCVBUF = 0x1002 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x1006 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_SETFIB = 0x1014 SO_SNDBUF = 0x1001 SO_SNDLOWAT = 0x1003 SO_SNDTIMEO = 0x1005 SO_TIMESTAMP = 0x400 SO_TYPE = 0x1008 SO_USELOOPBACK = 0x40 SO_USER_COOKIE = 0x1015 SO_VENDOR = 0x80000000 TAB0 = 0x0 TAB3 = 0x4 TABDLY = 0x4 TCIFLUSH = 0x1 TCIOFF = 0x3 TCIOFLUSH = 0x3 TCION = 0x4 TCOFLUSH = 0x2 TCOOFF = 0x1 TCOON = 0x2 TCP_CA_NAME_MAX = 0x10 TCP_CCALGOOPT = 0x41 TCP_CONGESTION = 0x40 TCP_FASTOPEN = 0x401 TCP_FUNCTION_BLK = 0x2000 TCP_FUNCTION_NAME_LEN_MAX = 0x20 TCP_INFO = 0x20 TCP_KEEPCNT = 0x400 TCP_KEEPIDLE = 0x100 TCP_KEEPINIT = 0x80 TCP_KEEPINTVL = 0x200 TCP_MAXBURST = 0x4 TCP_MAXHLEN = 0x3c TCP_MAXOLEN = 0x28 TCP_MAXSEG = 0x2 TCP_MAXWIN = 0xffff TCP_MAX_SACK = 0x4 TCP_MAX_WINSHIFT = 0xe TCP_MD5SIG = 0x10 TCP_MINMSS = 0xd8 TCP_MSS = 0x218 TCP_NODELAY = 0x1 TCP_NOOPT = 0x8 TCP_NOPUSH = 0x4 TCP_PCAP_IN = 0x1000 TCP_PCAP_OUT = 0x800 TCP_VENDOR = 0x80000000 TCSAFLUSH = 0x2 TIOCCBRK = 0x2000747a TIOCCDTR = 0x20007478 TIOCCONS = 0x80047462 TIOCDRAIN = 0x2000745e TIOCEXCL = 0x2000740d TIOCEXT = 0x80047460 TIOCFLUSH = 0x80047410 TIOCGDRAINWAIT = 0x40047456 TIOCGETA = 0x402c7413 TIOCGETD = 0x4004741a TIOCGPGRP = 0x40047477 TIOCGPTN = 0x4004740f TIOCGSID = 0x40047463 TIOCGWINSZ = 0x40087468 TIOCMBIC = 0x8004746b TIOCMBIS = 0x8004746c TIOCMGDTRWAIT = 0x4004745a TIOCMGET = 0x4004746a TIOCMSDTRWAIT = 0x8004745b TIOCMSET = 0x8004746d TIOCM_CAR = 0x40 TIOCM_CD = 0x40 TIOCM_CTS = 0x20 TIOCM_DCD = 0x40 TIOCM_DSR = 0x100 TIOCM_DTR = 0x2 TIOCM_LE = 0x1 TIOCM_RI = 0x80 TIOCM_RNG = 0x80 TIOCM_RTS = 0x4 TIOCM_SR = 0x10 TIOCM_ST = 0x8 TIOCNOTTY = 0x20007471 TIOCNXCL = 0x2000740e TIOCOUTQ = 0x40047473 TIOCPKT = 0x80047470 TIOCPKT_DATA = 0x0 TIOCPKT_DOSTOP = 0x20 TIOCPKT_FLUSHREAD = 0x1 TIOCPKT_FLUSHWRITE = 0x2 TIOCPKT_IOCTL = 0x40 TIOCPKT_NOSTOP = 0x10 TIOCPKT_START = 0x8 TIOCPKT_STOP = 0x4 TIOCPTMASTER = 0x2000741c TIOCSBRK = 0x2000747b TIOCSCTTY = 0x20007461 TIOCSDRAINWAIT = 0x80047457 TIOCSDTR = 0x20007479 TIOCSETA = 0x802c7414 TIOCSETAF = 0x802c7416 TIOCSETAW = 0x802c7415 TIOCSETD = 0x8004741b TIOCSIG = 0x2004745f TIOCSPGRP = 0x80047476 TIOCSTART = 0x2000746e TIOCSTAT = 0x20007465 TIOCSTI = 0x80017472 TIOCSTOP = 0x2000746f TIOCSWINSZ = 0x80087467 TIOCTIMESTAMP = 0x40107459 TIOCUCNTL = 0x80047466 TOSTOP = 0x400000 VDISCARD = 0xf VDSUSP = 0xb VEOF = 0x0 VEOL = 0x1 VEOL2 = 0x2 VERASE = 0x3 VERASE2 = 0x7 VINTR = 0x8 VKILL = 0x5 VLNEXT = 0xe VMIN = 0x10 VQUIT = 0x9 VREPRINT = 0x6 VSTART = 0xc VSTATUS = 0x12 VSTOP = 0xd VSUSP = 0xa VTIME = 0x11 VWERASE = 0x4 WCONTINUED = 0x4 WCOREFLAG = 0x80 WEXITED = 0x10 WLINUXCLONE = 0x80000000 WNOHANG = 0x1 WNOWAIT = 0x8 WSTOPPED = 0x2 WTRAPPED = 0x20 WUNTRACED = 0x2 ) // Errors const ( E2BIG = syscall.Errno(0x7) EACCES = syscall.Errno(0xd) EADDRINUSE = syscall.Errno(0x30) EADDRNOTAVAIL = syscall.Errno(0x31) EAFNOSUPPORT = syscall.Errno(0x2f) EAGAIN = syscall.Errno(0x23) EALREADY = syscall.Errno(0x25) EAUTH = syscall.Errno(0x50) EBADF = syscall.Errno(0x9) EBADMSG = syscall.Errno(0x59) EBADRPC = syscall.Errno(0x48) EBUSY = syscall.Errno(0x10) ECANCELED = syscall.Errno(0x55) ECAPMODE = syscall.Errno(0x5e) ECHILD = syscall.Errno(0xa) ECONNABORTED = syscall.Errno(0x35) ECONNREFUSED = syscall.Errno(0x3d) ECONNRESET = syscall.Errno(0x36) EDEADLK = syscall.Errno(0xb) EDESTADDRREQ = syscall.Errno(0x27) EDOM = syscall.Errno(0x21) EDOOFUS = syscall.Errno(0x58) EDQUOT = syscall.Errno(0x45) EEXIST = syscall.Errno(0x11) EFAULT = syscall.Errno(0xe) EFBIG = syscall.Errno(0x1b) EFTYPE = syscall.Errno(0x4f) EHOSTDOWN = syscall.Errno(0x40) EHOSTUNREACH = syscall.Errno(0x41) EIDRM = syscall.Errno(0x52) EILSEQ = syscall.Errno(0x56) EINPROGRESS = syscall.Errno(0x24) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x38) EISDIR = syscall.Errno(0x15) ELAST = syscall.Errno(0x60) ELOOP = syscall.Errno(0x3e) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) EMSGSIZE = syscall.Errno(0x28) EMULTIHOP = syscall.Errno(0x5a) ENAMETOOLONG = syscall.Errno(0x3f) ENEEDAUTH = syscall.Errno(0x51) ENETDOWN = syscall.Errno(0x32) ENETRESET = syscall.Errno(0x34) ENETUNREACH = syscall.Errno(0x33) ENFILE = syscall.Errno(0x17) ENOATTR = syscall.Errno(0x57) ENOBUFS = syscall.Errno(0x37) ENODEV = syscall.Errno(0x13) ENOENT = syscall.Errno(0x2) ENOEXEC = syscall.Errno(0x8) ENOLCK = syscall.Errno(0x4d) ENOLINK = syscall.Errno(0x5b) ENOMEM = syscall.Errno(0xc) ENOMSG = syscall.Errno(0x53) ENOPROTOOPT = syscall.Errno(0x2a) ENOSPC = syscall.Errno(0x1c) ENOSYS = syscall.Errno(0x4e) ENOTBLK = syscall.Errno(0xf) ENOTCAPABLE = syscall.Errno(0x5d) ENOTCONN = syscall.Errno(0x39) ENOTDIR = syscall.Errno(0x14) ENOTEMPTY = syscall.Errno(0x42) ENOTRECOVERABLE = syscall.Errno(0x5f) ENOTSOCK = syscall.Errno(0x26) ENOTSUP = syscall.Errno(0x2d) ENOTTY = syscall.Errno(0x19) ENXIO = syscall.Errno(0x6) EOPNOTSUPP = syscall.Errno(0x2d) EOVERFLOW = syscall.Errno(0x54) EOWNERDEAD = syscall.Errno(0x60) EPERM = syscall.Errno(0x1) EPFNOSUPPORT = syscall.Errno(0x2e) EPIPE = syscall.Errno(0x20) EPROCLIM = syscall.Errno(0x43) EPROCUNAVAIL = syscall.Errno(0x4c) EPROGMISMATCH = syscall.Errno(0x4b) EPROGUNAVAIL = syscall.Errno(0x4a) EPROTO = syscall.Errno(0x5c) EPROTONOSUPPORT = syscall.Errno(0x2b) EPROTOTYPE = syscall.Errno(0x29) ERANGE = syscall.Errno(0x22) EREMOTE = syscall.Errno(0x47) EROFS = syscall.Errno(0x1e) ERPCMISMATCH = syscall.Errno(0x49) ESHUTDOWN = syscall.Errno(0x3a) ESOCKTNOSUPPORT = syscall.Errno(0x2c) ESPIPE = syscall.Errno(0x1d) ESRCH = syscall.Errno(0x3) ESTALE = syscall.Errno(0x46) ETIMEDOUT = syscall.Errno(0x3c) ETOOMANYREFS = syscall.Errno(0x3b) ETXTBSY = syscall.Errno(0x1a) EUSERS = syscall.Errno(0x44) EWOULDBLOCK = syscall.Errno(0x23) EXDEV = syscall.Errno(0x12) ) // Signals const ( SIGABRT = syscall.Signal(0x6) SIGALRM = syscall.Signal(0xe) SIGBUS = syscall.Signal(0xa) SIGCHLD = syscall.Signal(0x14) SIGCONT = syscall.Signal(0x13) SIGEMT = syscall.Signal(0x7) SIGFPE = syscall.Signal(0x8) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) SIGINFO = syscall.Signal(0x1d) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x17) SIGIOT = syscall.Signal(0x6) SIGKILL = syscall.Signal(0x9) SIGLIBRT = syscall.Signal(0x21) SIGLWP = syscall.Signal(0x20) SIGPIPE = syscall.Signal(0xd) SIGPROF = syscall.Signal(0x1b) SIGQUIT = syscall.Signal(0x3) SIGSEGV = syscall.Signal(0xb) SIGSTOP = syscall.Signal(0x11) SIGSYS = syscall.Signal(0xc) SIGTERM = syscall.Signal(0xf) SIGTHR = syscall.Signal(0x20) SIGTRAP = syscall.Signal(0x5) SIGTSTP = syscall.Signal(0x12) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) SIGURG = syscall.Signal(0x10) SIGUSR1 = syscall.Signal(0x1e) SIGUSR2 = syscall.Signal(0x1f) SIGVTALRM = syscall.Signal(0x1a) SIGWINCH = syscall.Signal(0x1c) SIGXCPU = syscall.Signal(0x18) SIGXFSZ = syscall.Signal(0x19) ) // Error table var errors = [...]string{ 1: "operation not permitted", 2: "no such file or directory", 3: "no such process", 4: "interrupted system call", 5: "input/output error", 6: "device not configured", 7: "argument list too long", 8: "exec format error", 9: "bad file descriptor", 10: "no child processes", 11: "resource deadlock avoided", 12: "cannot allocate memory", 13: "permission denied", 14: "bad address", 15: "block device required", 16: "device busy", 17: "file exists", 18: "cross-device link", 19: "operation not supported by device", 20: "not a directory", 21: "is a directory", 22: "invalid argument", 23: "too many open files in system", 24: "too many open files", 25: "inappropriate ioctl for device", 26: "text file busy", 27: "file too large", 28: "no space left on device", 29: "illegal seek", 30: "read-only file system", 31: "too many links", 32: "broken pipe", 33: "numerical argument out of domain", 34: "result too large", 35: "resource temporarily unavailable", 36: "operation now in progress", 37: "operation already in progress", 38: "socket operation on non-socket", 39: "destination address required", 40: "message too long", 41: "protocol wrong type for socket", 42: "protocol not available", 43: "protocol not supported", 44: "socket type not supported", 45: "operation not supported", 46: "protocol family not supported", 47: "address family not supported by protocol family", 48: "address already in use", 49: "can't assign requested address", 50: "network is down", 51: "network is unreachable", 52: "network dropped connection on reset", 53: "software caused connection abort", 54: "connection reset by peer", 55: "no buffer space available", 56: "socket is already connected", 57: "socket is not connected", 58: "can't send after socket shutdown", 59: "too many references: can't splice", 60: "operation timed out", 61: "connection refused", 62: "too many levels of symbolic links", 63: "file name too long", 64: "host is down", 65: "no route to host", 66: "directory not empty", 67: "too many processes", 68: "too many users", 69: "disc quota exceeded", 70: "stale NFS file handle", 71: "too many levels of remote in path", 72: "RPC struct is bad", 73: "RPC version wrong", 74: "RPC prog. not avail", 75: "program version wrong", 76: "bad procedure for program", 77: "no locks available", 78: "function not implemented", 79: "inappropriate file type or format", 80: "authentication error", 81: "need authenticator", 82: "identifier removed", 83: "no message of desired type", 84: "value too large to be stored in data type", 85: "operation canceled", 86: "illegal byte sequence", 87: "attribute not found", 88: "programming error", 89: "bad message", 90: "multihop attempted", 91: "link has been severed", 92: "protocol error", 93: "capabilities insufficient", 94: "not permitted in capability mode", 95: "state not recoverable", 96: "previous owner died", } // Signal table var signals = [...]string{ 1: "hangup", 2: "interrupt", 3: "quit", 4: "illegal instruction", 5: "trace/BPT trap", 6: "abort trap", 7: "EMT trap", 8: "floating point exception", 9: "killed", 10: "bus error", 11: "segmentation fault", 12: "bad system call", 13: "broken pipe", 14: "alarm clock", 15: "terminated", 16: "urgent I/O condition", 17: "suspended (signal)", 18: "suspended", 19: "continued", 20: "child exited", 21: "stopped (tty input)", 22: "stopped (tty output)", 23: "I/O possible", 24: "cputime limit exceeded", 25: "filesize limit exceeded", 26: "virtual timer expired", 27: "profiling timer expired", 28: "window size changes", 29: "information request", 30: "user defined signal 1", 31: "user defined signal 2", 32: "unknown signal", 33: "unknown signal", } ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go ================================================ // mkerrors.sh // Code generated by the command above; see README.md. DO NOT EDIT. // +build arm,freebsd // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- _const.go package unix import "syscall" const ( AF_APPLETALK = 0x10 AF_ARP = 0x23 AF_ATM = 0x1e AF_BLUETOOTH = 0x24 AF_CCITT = 0xa AF_CHAOS = 0x5 AF_CNT = 0x15 AF_COIP = 0x14 AF_DATAKIT = 0x9 AF_DECnet = 0xc AF_DLI = 0xd AF_E164 = 0x1a AF_ECMA = 0x8 AF_HYLINK = 0xf AF_IEEE80211 = 0x25 AF_IMPLINK = 0x3 AF_INET = 0x2 AF_INET6 = 0x1c AF_INET6_SDP = 0x2a AF_INET_SDP = 0x28 AF_IPX = 0x17 AF_ISDN = 0x1a AF_ISO = 0x7 AF_LAT = 0xe AF_LINK = 0x12 AF_LOCAL = 0x1 AF_MAX = 0x2a AF_NATM = 0x1d AF_NETBIOS = 0x6 AF_NETGRAPH = 0x20 AF_OSI = 0x7 AF_PUP = 0x4 AF_ROUTE = 0x11 AF_SCLUSTER = 0x22 AF_SIP = 0x18 AF_SLOW = 0x21 AF_SNA = 0xb AF_UNIX = 0x1 AF_UNSPEC = 0x0 AF_VENDOR00 = 0x27 AF_VENDOR01 = 0x29 AF_VENDOR02 = 0x2b AF_VENDOR03 = 0x2d AF_VENDOR04 = 0x2f AF_VENDOR05 = 0x31 AF_VENDOR06 = 0x33 AF_VENDOR07 = 0x35 AF_VENDOR08 = 0x37 AF_VENDOR09 = 0x39 AF_VENDOR10 = 0x3b AF_VENDOR11 = 0x3d AF_VENDOR12 = 0x3f AF_VENDOR13 = 0x41 AF_VENDOR14 = 0x43 AF_VENDOR15 = 0x45 AF_VENDOR16 = 0x47 AF_VENDOR17 = 0x49 AF_VENDOR18 = 0x4b AF_VENDOR19 = 0x4d AF_VENDOR20 = 0x4f AF_VENDOR21 = 0x51 AF_VENDOR22 = 0x53 AF_VENDOR23 = 0x55 AF_VENDOR24 = 0x57 AF_VENDOR25 = 0x59 AF_VENDOR26 = 0x5b AF_VENDOR27 = 0x5d AF_VENDOR28 = 0x5f AF_VENDOR29 = 0x61 AF_VENDOR30 = 0x63 AF_VENDOR31 = 0x65 AF_VENDOR32 = 0x67 AF_VENDOR33 = 0x69 AF_VENDOR34 = 0x6b AF_VENDOR35 = 0x6d AF_VENDOR36 = 0x6f AF_VENDOR37 = 0x71 AF_VENDOR38 = 0x73 AF_VENDOR39 = 0x75 AF_VENDOR40 = 0x77 AF_VENDOR41 = 0x79 AF_VENDOR42 = 0x7b AF_VENDOR43 = 0x7d AF_VENDOR44 = 0x7f AF_VENDOR45 = 0x81 AF_VENDOR46 = 0x83 AF_VENDOR47 = 0x85 ALTWERASE = 0x200 B0 = 0x0 B110 = 0x6e B115200 = 0x1c200 B1200 = 0x4b0 B134 = 0x86 B14400 = 0x3840 B150 = 0x96 B1800 = 0x708 B19200 = 0x4b00 B200 = 0xc8 B230400 = 0x38400 B2400 = 0x960 B28800 = 0x7080 B300 = 0x12c B38400 = 0x9600 B460800 = 0x70800 B4800 = 0x12c0 B50 = 0x32 B57600 = 0xe100 B600 = 0x258 B7200 = 0x1c20 B75 = 0x4b B76800 = 0x12c00 B921600 = 0xe1000 B9600 = 0x2580 BIOCFEEDBACK = 0x8004427c BIOCFLUSH = 0x20004268 BIOCGBLEN = 0x40044266 BIOCGDIRECTION = 0x40044276 BIOCGDLT = 0x4004426a BIOCGDLTLIST = 0xc0084279 BIOCGETBUFMODE = 0x4004427d BIOCGETIF = 0x4020426b BIOCGETZMAX = 0x4004427f BIOCGHDRCMPLT = 0x40044274 BIOCGRSIG = 0x40044272 BIOCGRTIMEOUT = 0x4010426e BIOCGSEESENT = 0x40044276 BIOCGSTATS = 0x4008426f BIOCGTSTAMP = 0x40044283 BIOCIMMEDIATE = 0x80044270 BIOCLOCK = 0x2000427a BIOCPROMISC = 0x20004269 BIOCROTZBUF = 0x400c4280 BIOCSBLEN = 0xc0044266 BIOCSDIRECTION = 0x80044277 BIOCSDLT = 0x80044278 BIOCSETBUFMODE = 0x8004427e BIOCSETF = 0x80084267 BIOCSETFNR = 0x80084282 BIOCSETIF = 0x8020426c BIOCSETWF = 0x8008427b BIOCSETZBUF = 0x800c4281 BIOCSHDRCMPLT = 0x80044275 BIOCSRSIG = 0x80044273 BIOCSRTIMEOUT = 0x8010426d BIOCSSEESENT = 0x80044277 BIOCSTSTAMP = 0x80044284 BIOCVERSION = 0x40044271 BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALIGNMENT = 0x4 BPF_ALU = 0x4 BPF_AND = 0x50 BPF_B = 0x10 BPF_BUFMODE_BUFFER = 0x1 BPF_BUFMODE_ZBUF = 0x2 BPF_DIV = 0x30 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 BPF_JA = 0x0 BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 BPF_JMP = 0x5 BPF_JSET = 0x40 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 BPF_LEN = 0x80 BPF_LSH = 0x60 BPF_MAJOR_VERSION = 0x1 BPF_MAXBUFSIZE = 0x80000 BPF_MAXINSNS = 0x200 BPF_MEM = 0x60 BPF_MEMWORDS = 0x10 BPF_MINBUFSIZE = 0x20 BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MOD = 0x90 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_OR = 0x40 BPF_RELEASE = 0x30bb6 BPF_RET = 0x6 BPF_RSH = 0x70 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 BPF_TAX = 0x0 BPF_TXA = 0x80 BPF_T_BINTIME = 0x2 BPF_T_BINTIME_FAST = 0x102 BPF_T_BINTIME_MONOTONIC = 0x202 BPF_T_BINTIME_MONOTONIC_FAST = 0x302 BPF_T_FAST = 0x100 BPF_T_FLAG_MASK = 0x300 BPF_T_FORMAT_MASK = 0x3 BPF_T_MICROTIME = 0x0 BPF_T_MICROTIME_FAST = 0x100 BPF_T_MICROTIME_MONOTONIC = 0x200 BPF_T_MICROTIME_MONOTONIC_FAST = 0x300 BPF_T_MONOTONIC = 0x200 BPF_T_MONOTONIC_FAST = 0x300 BPF_T_NANOTIME = 0x1 BPF_T_NANOTIME_FAST = 0x101 BPF_T_NANOTIME_MONOTONIC = 0x201 BPF_T_NANOTIME_MONOTONIC_FAST = 0x301 BPF_T_NONE = 0x3 BPF_T_NORMAL = 0x0 BPF_W = 0x0 BPF_X = 0x8 BPF_XOR = 0xa0 BRKINT = 0x2 CAP_ACCEPT = 0x200000020000000 CAP_ACL_CHECK = 0x400000000010000 CAP_ACL_DELETE = 0x400000000020000 CAP_ACL_GET = 0x400000000040000 CAP_ACL_SET = 0x400000000080000 CAP_ALL0 = 0x20007ffffffffff CAP_ALL1 = 0x4000000001fffff CAP_BIND = 0x200000040000000 CAP_BINDAT = 0x200008000000400 CAP_CHFLAGSAT = 0x200000000001400 CAP_CONNECT = 0x200000080000000 CAP_CONNECTAT = 0x200010000000400 CAP_CREATE = 0x200000000000040 CAP_EVENT = 0x400000000000020 CAP_EXTATTR_DELETE = 0x400000000001000 CAP_EXTATTR_GET = 0x400000000002000 CAP_EXTATTR_LIST = 0x400000000004000 CAP_EXTATTR_SET = 0x400000000008000 CAP_FCHDIR = 0x200000000000800 CAP_FCHFLAGS = 0x200000000001000 CAP_FCHMOD = 0x200000000002000 CAP_FCHMODAT = 0x200000000002400 CAP_FCHOWN = 0x200000000004000 CAP_FCHOWNAT = 0x200000000004400 CAP_FCNTL = 0x200000000008000 CAP_FCNTL_ALL = 0x78 CAP_FCNTL_GETFL = 0x8 CAP_FCNTL_GETOWN = 0x20 CAP_FCNTL_SETFL = 0x10 CAP_FCNTL_SETOWN = 0x40 CAP_FEXECVE = 0x200000000000080 CAP_FLOCK = 0x200000000010000 CAP_FPATHCONF = 0x200000000020000 CAP_FSCK = 0x200000000040000 CAP_FSTAT = 0x200000000080000 CAP_FSTATAT = 0x200000000080400 CAP_FSTATFS = 0x200000000100000 CAP_FSYNC = 0x200000000000100 CAP_FTRUNCATE = 0x200000000000200 CAP_FUTIMES = 0x200000000200000 CAP_FUTIMESAT = 0x200000000200400 CAP_GETPEERNAME = 0x200000100000000 CAP_GETSOCKNAME = 0x200000200000000 CAP_GETSOCKOPT = 0x200000400000000 CAP_IOCTL = 0x400000000000080 CAP_IOCTLS_ALL = 0x7fffffff CAP_KQUEUE = 0x400000000100040 CAP_KQUEUE_CHANGE = 0x400000000100000 CAP_KQUEUE_EVENT = 0x400000000000040 CAP_LINKAT_SOURCE = 0x200020000000400 CAP_LINKAT_TARGET = 0x200000000400400 CAP_LISTEN = 0x200000800000000 CAP_LOOKUP = 0x200000000000400 CAP_MAC_GET = 0x400000000000001 CAP_MAC_SET = 0x400000000000002 CAP_MKDIRAT = 0x200000000800400 CAP_MKFIFOAT = 0x200000001000400 CAP_MKNODAT = 0x200000002000400 CAP_MMAP = 0x200000000000010 CAP_MMAP_R = 0x20000000000001d CAP_MMAP_RW = 0x20000000000001f CAP_MMAP_RWX = 0x20000000000003f CAP_MMAP_RX = 0x20000000000003d CAP_MMAP_W = 0x20000000000001e CAP_MMAP_WX = 0x20000000000003e CAP_MMAP_X = 0x20000000000003c CAP_PDGETPID = 0x400000000000200 CAP_PDKILL = 0x400000000000800 CAP_PDWAIT = 0x400000000000400 CAP_PEELOFF = 0x200001000000000 CAP_POLL_EVENT = 0x400000000000020 CAP_PREAD = 0x20000000000000d CAP_PWRITE = 0x20000000000000e CAP_READ = 0x200000000000001 CAP_RECV = 0x200000000000001 CAP_RENAMEAT_SOURCE = 0x200000004000400 CAP_RENAMEAT_TARGET = 0x200040000000400 CAP_RIGHTS_VERSION = 0x0 CAP_RIGHTS_VERSION_00 = 0x0 CAP_SEEK = 0x20000000000000c CAP_SEEK_TELL = 0x200000000000004 CAP_SEM_GETVALUE = 0x400000000000004 CAP_SEM_POST = 0x400000000000008 CAP_SEM_WAIT = 0x400000000000010 CAP_SEND = 0x200000000000002 CAP_SETSOCKOPT = 0x200002000000000 CAP_SHUTDOWN = 0x200004000000000 CAP_SOCK_CLIENT = 0x200007780000003 CAP_SOCK_SERVER = 0x200007f60000003 CAP_SYMLINKAT = 0x200000008000400 CAP_TTYHOOK = 0x400000000000100 CAP_UNLINKAT = 0x200000010000400 CAP_UNUSED0_44 = 0x200080000000000 CAP_UNUSED0_57 = 0x300000000000000 CAP_UNUSED1_22 = 0x400000000200000 CAP_UNUSED1_57 = 0x500000000000000 CAP_WRITE = 0x200000000000002 CFLUSH = 0xf CLOCAL = 0x8000 CLOCK_MONOTONIC = 0x4 CLOCK_MONOTONIC_FAST = 0xc CLOCK_MONOTONIC_PRECISE = 0xb CLOCK_PROCESS_CPUTIME_ID = 0xf CLOCK_PROF = 0x2 CLOCK_REALTIME = 0x0 CLOCK_REALTIME_FAST = 0xa CLOCK_REALTIME_PRECISE = 0x9 CLOCK_SECOND = 0xd CLOCK_THREAD_CPUTIME_ID = 0xe CLOCK_UPTIME = 0x5 CLOCK_UPTIME_FAST = 0x8 CLOCK_UPTIME_PRECISE = 0x7 CLOCK_VIRTUAL = 0x1 CREAD = 0x800 CRTSCTS = 0x30000 CS5 = 0x0 CS6 = 0x100 CS7 = 0x200 CS8 = 0x300 CSIZE = 0x300 CSTART = 0x11 CSTATUS = 0x14 CSTOP = 0x13 CSTOPB = 0x400 CSUSP = 0x1a CTL_MAXNAME = 0x18 CTL_NET = 0x4 DLT_A429 = 0xb8 DLT_A653_ICM = 0xb9 DLT_AIRONET_HEADER = 0x78 DLT_AOS = 0xde DLT_APPLE_IP_OVER_IEEE1394 = 0x8a DLT_ARCNET = 0x7 DLT_ARCNET_LINUX = 0x81 DLT_ATM_CLIP = 0x13 DLT_ATM_RFC1483 = 0xb DLT_AURORA = 0x7e DLT_AX25 = 0x3 DLT_AX25_KISS = 0xca DLT_BACNET_MS_TP = 0xa5 DLT_BLUETOOTH_BREDR_BB = 0xff DLT_BLUETOOTH_HCI_H4 = 0xbb DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 DLT_BLUETOOTH_LE_LL = 0xfb DLT_BLUETOOTH_LE_LL_WITH_PHDR = 0x100 DLT_BLUETOOTH_LINUX_MONITOR = 0xfe DLT_CAN20B = 0xbe DLT_CAN_SOCKETCAN = 0xe3 DLT_CHAOS = 0x5 DLT_CHDLC = 0x68 DLT_CISCO_IOS = 0x76 DLT_CLASS_NETBSD_RAWAF = 0x2240000 DLT_C_HDLC = 0x68 DLT_C_HDLC_WITH_DIR = 0xcd DLT_DBUS = 0xe7 DLT_DECT = 0xdd DLT_DOCSIS = 0x8f DLT_DVB_CI = 0xeb DLT_ECONET = 0x73 DLT_EN10MB = 0x1 DLT_EN3MB = 0x2 DLT_ENC = 0x6d DLT_EPON = 0x103 DLT_ERF = 0xc5 DLT_ERF_ETH = 0xaf DLT_ERF_POS = 0xb0 DLT_FC_2 = 0xe0 DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 DLT_FDDI = 0xa DLT_FLEXRAY = 0xd2 DLT_FRELAY = 0x6b DLT_FRELAY_WITH_DIR = 0xce DLT_GCOM_SERIAL = 0xad DLT_GCOM_T1E1 = 0xac DLT_GPF_F = 0xab DLT_GPF_T = 0xaa DLT_GPRS_LLC = 0xa9 DLT_GSMTAP_ABIS = 0xda DLT_GSMTAP_UM = 0xd9 DLT_IBM_SN = 0x92 DLT_IBM_SP = 0x91 DLT_IEEE802 = 0x6 DLT_IEEE802_11 = 0x69 DLT_IEEE802_11_RADIO = 0x7f DLT_IEEE802_11_RADIO_AVS = 0xa3 DLT_IEEE802_15_4 = 0xc3 DLT_IEEE802_15_4_LINUX = 0xbf DLT_IEEE802_15_4_NOFCS = 0xe6 DLT_IEEE802_15_4_NONASK_PHY = 0xd7 DLT_IEEE802_16_MAC_CPS = 0xbc DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 DLT_INFINIBAND = 0xf7 DLT_IPFILTER = 0x74 DLT_IPMB = 0xc7 DLT_IPMB_LINUX = 0xd1 DLT_IPMI_HPM_2 = 0x104 DLT_IPNET = 0xe2 DLT_IPOIB = 0xf2 DLT_IPV4 = 0xe4 DLT_IPV6 = 0xe5 DLT_IP_OVER_FC = 0x7a DLT_ISO_14443 = 0x108 DLT_JUNIPER_ATM1 = 0x89 DLT_JUNIPER_ATM2 = 0x87 DLT_JUNIPER_ATM_CEMIC = 0xee DLT_JUNIPER_CHDLC = 0xb5 DLT_JUNIPER_ES = 0x84 DLT_JUNIPER_ETHER = 0xb2 DLT_JUNIPER_FIBRECHANNEL = 0xea DLT_JUNIPER_FRELAY = 0xb4 DLT_JUNIPER_GGSN = 0x85 DLT_JUNIPER_ISM = 0xc2 DLT_JUNIPER_MFR = 0x86 DLT_JUNIPER_MLFR = 0x83 DLT_JUNIPER_MLPPP = 0x82 DLT_JUNIPER_MONITOR = 0xa4 DLT_JUNIPER_PIC_PEER = 0xae DLT_JUNIPER_PPP = 0xb3 DLT_JUNIPER_PPPOE = 0xa7 DLT_JUNIPER_PPPOE_ATM = 0xa8 DLT_JUNIPER_SERVICES = 0x88 DLT_JUNIPER_SRX_E2E = 0xe9 DLT_JUNIPER_ST = 0xc8 DLT_JUNIPER_VP = 0xb7 DLT_JUNIPER_VS = 0xe8 DLT_LAPB_WITH_DIR = 0xcf DLT_LAPD = 0xcb DLT_LIN = 0xd4 DLT_LINUX_EVDEV = 0xd8 DLT_LINUX_IRDA = 0x90 DLT_LINUX_LAPD = 0xb1 DLT_LINUX_PPP_WITHDIRECTION = 0xa6 DLT_LINUX_SLL = 0x71 DLT_LOOP = 0x6c DLT_LTALK = 0x72 DLT_MATCHING_MAX = 0x109 DLT_MATCHING_MIN = 0x68 DLT_MFR = 0xb6 DLT_MOST = 0xd3 DLT_MPEG_2_TS = 0xf3 DLT_MPLS = 0xdb DLT_MTP2 = 0x8c DLT_MTP2_WITH_PHDR = 0x8b DLT_MTP3 = 0x8d DLT_MUX27010 = 0xec DLT_NETANALYZER = 0xf0 DLT_NETANALYZER_TRANSPARENT = 0xf1 DLT_NETLINK = 0xfd DLT_NFC_LLCP = 0xf5 DLT_NFLOG = 0xef DLT_NG40 = 0xf4 DLT_NULL = 0x0 DLT_PCI_EXP = 0x7d DLT_PFLOG = 0x75 DLT_PFSYNC = 0x79 DLT_PKTAP = 0x102 DLT_PPI = 0xc0 DLT_PPP = 0x9 DLT_PPP_BSDOS = 0xe DLT_PPP_ETHER = 0x33 DLT_PPP_PPPD = 0xa6 DLT_PPP_SERIAL = 0x32 DLT_PPP_WITH_DIR = 0xcc DLT_PPP_WITH_DIRECTION = 0xa6 DLT_PRISM_HEADER = 0x77 DLT_PROFIBUS_DL = 0x101 DLT_PRONET = 0x4 DLT_RAIF1 = 0xc6 DLT_RAW = 0xc DLT_RDS = 0x109 DLT_REDBACK_SMARTEDGE = 0x20 DLT_RIO = 0x7c DLT_RTAC_SERIAL = 0xfa DLT_SCCP = 0x8e DLT_SCTP = 0xf8 DLT_SITA = 0xc4 DLT_SLIP = 0x8 DLT_SLIP_BSDOS = 0xd DLT_STANAG_5066_D_PDU = 0xed DLT_SUNATM = 0x7b DLT_SYMANTEC_FIREWALL = 0x63 DLT_TZSP = 0x80 DLT_USB = 0xba DLT_USBPCAP = 0xf9 DLT_USB_FREEBSD = 0xba DLT_USB_LINUX = 0xbd DLT_USB_LINUX_MMAPPED = 0xdc DLT_USER0 = 0x93 DLT_USER1 = 0x94 DLT_USER10 = 0x9d DLT_USER11 = 0x9e DLT_USER12 = 0x9f DLT_USER13 = 0xa0 DLT_USER14 = 0xa1 DLT_USER15 = 0xa2 DLT_USER2 = 0x95 DLT_USER3 = 0x96 DLT_USER4 = 0x97 DLT_USER5 = 0x98 DLT_USER6 = 0x99 DLT_USER7 = 0x9a DLT_USER8 = 0x9b DLT_USER9 = 0x9c DLT_WATTSTOPPER_DLM = 0x107 DLT_WIHART = 0xdf DLT_WIRESHARK_UPPER_PDU = 0xfc DLT_X2E_SERIAL = 0xd5 DLT_X2E_XORAYA = 0xd6 DLT_ZWAVE_R1_R2 = 0x105 DLT_ZWAVE_R3 = 0x106 DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 DT_FIFO = 0x1 DT_LNK = 0xa DT_REG = 0x8 DT_SOCK = 0xc DT_UNKNOWN = 0x0 DT_WHT = 0xe ECHO = 0x8 ECHOCTL = 0x40 ECHOE = 0x2 ECHOK = 0x4 ECHOKE = 0x1 ECHONL = 0x10 ECHOPRT = 0x20 EVFILT_AIO = -0x3 EVFILT_FS = -0x9 EVFILT_LIO = -0xa EVFILT_PROC = -0x5 EVFILT_PROCDESC = -0x8 EVFILT_READ = -0x1 EVFILT_SENDFILE = -0xc EVFILT_SIGNAL = -0x6 EVFILT_SYSCOUNT = 0xc EVFILT_TIMER = -0x7 EVFILT_USER = -0xb EVFILT_VNODE = -0x4 EVFILT_WRITE = -0x2 EV_ADD = 0x1 EV_CLEAR = 0x20 EV_DELETE = 0x2 EV_DISABLE = 0x8 EV_DISPATCH = 0x80 EV_DROP = 0x1000 EV_ENABLE = 0x4 EV_EOF = 0x8000 EV_ERROR = 0x4000 EV_FLAG1 = 0x2000 EV_FLAG2 = 0x4000 EV_FORCEONESHOT = 0x100 EV_ONESHOT = 0x10 EV_RECEIPT = 0x40 EV_SYSFLAGS = 0xf000 EXTA = 0x4b00 EXTATTR_NAMESPACE_EMPTY = 0x0 EXTATTR_NAMESPACE_SYSTEM = 0x2 EXTATTR_NAMESPACE_USER = 0x1 EXTB = 0x9600 EXTPROC = 0x800 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FLUSHO = 0x800000 F_CANCEL = 0x5 F_DUP2FD = 0xa F_DUP2FD_CLOEXEC = 0x12 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0x11 F_GETFD = 0x1 F_GETFL = 0x3 F_GETLK = 0xb F_GETOWN = 0x5 F_OGETLK = 0x7 F_OK = 0x0 F_OSETLK = 0x8 F_OSETLKW = 0x9 F_RDAHEAD = 0x10 F_RDLCK = 0x1 F_READAHEAD = 0xf F_SETFD = 0x2 F_SETFL = 0x4 F_SETLK = 0xc F_SETLKW = 0xd F_SETLK_REMOTE = 0xe F_SETOWN = 0x6 F_UNLCK = 0x2 F_UNLCKSYS = 0x4 F_WRLCK = 0x3 HUPCL = 0x4000 ICANON = 0x100 ICMP6_FILTER = 0x12 ICRNL = 0x100 IEXTEN = 0x400 IFAN_ARRIVAL = 0x0 IFAN_DEPARTURE = 0x1 IFF_ALLMULTI = 0x200 IFF_ALTPHYS = 0x4000 IFF_BROADCAST = 0x2 IFF_CANTCHANGE = 0x218f52 IFF_CANTCONFIG = 0x10000 IFF_DEBUG = 0x4 IFF_DRV_OACTIVE = 0x400 IFF_DRV_RUNNING = 0x40 IFF_DYING = 0x200000 IFF_LINK0 = 0x1000 IFF_LINK1 = 0x2000 IFF_LINK2 = 0x4000 IFF_LOOPBACK = 0x8 IFF_MONITOR = 0x40000 IFF_MULTICAST = 0x8000 IFF_NOARP = 0x80 IFF_OACTIVE = 0x400 IFF_POINTOPOINT = 0x10 IFF_PPROMISC = 0x20000 IFF_PROMISC = 0x100 IFF_RENAMING = 0x400000 IFF_RUNNING = 0x40 IFF_SIMPLEX = 0x800 IFF_STATICARP = 0x80000 IFF_UP = 0x1 IFNAMSIZ = 0x10 IFT_BRIDGE = 0xd1 IFT_CARP = 0xf8 IFT_IEEE1394 = 0x90 IFT_INFINIBAND = 0xc7 IFT_L2VLAN = 0x87 IFT_L3IPVLAN = 0x88 IFT_PPP = 0x17 IFT_PROPVIRTUAL = 0x35 IGNBRK = 0x1 IGNCR = 0x80 IGNPAR = 0x4 IMAXBEL = 0x2000 INLCR = 0x40 INPCK = 0x10 IN_CLASSA_HOST = 0xffffff IN_CLASSA_MAX = 0x80 IN_CLASSA_NET = 0xff000000 IN_CLASSA_NSHIFT = 0x18 IN_CLASSB_HOST = 0xffff IN_CLASSB_MAX = 0x10000 IN_CLASSB_NET = 0xffff0000 IN_CLASSB_NSHIFT = 0x10 IN_CLASSC_HOST = 0xff IN_CLASSC_NET = 0xffffff00 IN_CLASSC_NSHIFT = 0x8 IN_CLASSD_HOST = 0xfffffff IN_CLASSD_NET = 0xf0000000 IN_CLASSD_NSHIFT = 0x1c IN_LOOPBACKNET = 0x7f IN_RFC3021_MASK = 0xfffffffe IPPROTO_3PC = 0x22 IPPROTO_ADFS = 0x44 IPPROTO_AH = 0x33 IPPROTO_AHIP = 0x3d IPPROTO_APES = 0x63 IPPROTO_ARGUS = 0xd IPPROTO_AX25 = 0x5d IPPROTO_BHA = 0x31 IPPROTO_BLT = 0x1e IPPROTO_BRSATMON = 0x4c IPPROTO_CARP = 0x70 IPPROTO_CFTP = 0x3e IPPROTO_CHAOS = 0x10 IPPROTO_CMTP = 0x26 IPPROTO_CPHB = 0x49 IPPROTO_CPNX = 0x48 IPPROTO_DDP = 0x25 IPPROTO_DGP = 0x56 IPPROTO_DIVERT = 0x102 IPPROTO_DONE = 0x101 IPPROTO_DSTOPTS = 0x3c IPPROTO_EGP = 0x8 IPPROTO_EMCON = 0xe IPPROTO_ENCAP = 0x62 IPPROTO_EON = 0x50 IPPROTO_ESP = 0x32 IPPROTO_ETHERIP = 0x61 IPPROTO_FRAGMENT = 0x2c IPPROTO_GGP = 0x3 IPPROTO_GMTP = 0x64 IPPROTO_GRE = 0x2f IPPROTO_HELLO = 0x3f IPPROTO_HIP = 0x8b IPPROTO_HMP = 0x14 IPPROTO_HOPOPTS = 0x0 IPPROTO_ICMP = 0x1 IPPROTO_ICMPV6 = 0x3a IPPROTO_IDP = 0x16 IPPROTO_IDPR = 0x23 IPPROTO_IDRP = 0x2d IPPROTO_IGMP = 0x2 IPPROTO_IGP = 0x55 IPPROTO_IGRP = 0x58 IPPROTO_IL = 0x28 IPPROTO_INLSP = 0x34 IPPROTO_INP = 0x20 IPPROTO_IP = 0x0 IPPROTO_IPCOMP = 0x6c IPPROTO_IPCV = 0x47 IPPROTO_IPEIP = 0x5e IPPROTO_IPIP = 0x4 IPPROTO_IPPC = 0x43 IPPROTO_IPV4 = 0x4 IPPROTO_IPV6 = 0x29 IPPROTO_IRTP = 0x1c IPPROTO_KRYPTOLAN = 0x41 IPPROTO_LARP = 0x5b IPPROTO_LEAF1 = 0x19 IPPROTO_LEAF2 = 0x1a IPPROTO_MAX = 0x100 IPPROTO_MEAS = 0x13 IPPROTO_MH = 0x87 IPPROTO_MHRP = 0x30 IPPROTO_MICP = 0x5f IPPROTO_MOBILE = 0x37 IPPROTO_MPLS = 0x89 IPPROTO_MTP = 0x5c IPPROTO_MUX = 0x12 IPPROTO_ND = 0x4d IPPROTO_NHRP = 0x36 IPPROTO_NONE = 0x3b IPPROTO_NSP = 0x1f IPPROTO_NVPII = 0xb IPPROTO_OLD_DIVERT = 0xfe IPPROTO_OSPFIGP = 0x59 IPPROTO_PFSYNC = 0xf0 IPPROTO_PGM = 0x71 IPPROTO_PIGP = 0x9 IPPROTO_PIM = 0x67 IPPROTO_PRM = 0x15 IPPROTO_PUP = 0xc IPPROTO_PVP = 0x4b IPPROTO_RAW = 0xff IPPROTO_RCCMON = 0xa IPPROTO_RDP = 0x1b IPPROTO_RESERVED_253 = 0xfd IPPROTO_RESERVED_254 = 0xfe IPPROTO_ROUTING = 0x2b IPPROTO_RSVP = 0x2e IPPROTO_RVD = 0x42 IPPROTO_SATEXPAK = 0x40 IPPROTO_SATMON = 0x45 IPPROTO_SCCSP = 0x60 IPPROTO_SCTP = 0x84 IPPROTO_SDRP = 0x2a IPPROTO_SEND = 0x103 IPPROTO_SEP = 0x21 IPPROTO_SHIM6 = 0x8c IPPROTO_SKIP = 0x39 IPPROTO_SPACER = 0x7fff IPPROTO_SRPC = 0x5a IPPROTO_ST = 0x7 IPPROTO_SVMTP = 0x52 IPPROTO_SWIPE = 0x35 IPPROTO_TCF = 0x57 IPPROTO_TCP = 0x6 IPPROTO_TLSP = 0x38 IPPROTO_TP = 0x1d IPPROTO_TPXX = 0x27 IPPROTO_TRUNK1 = 0x17 IPPROTO_TRUNK2 = 0x18 IPPROTO_TTP = 0x54 IPPROTO_UDP = 0x11 IPPROTO_UDPLITE = 0x88 IPPROTO_VINES = 0x53 IPPROTO_VISA = 0x46 IPPROTO_VMTP = 0x51 IPPROTO_WBEXPAK = 0x4f IPPROTO_WBMON = 0x4e IPPROTO_WSN = 0x4a IPPROTO_XNET = 0xf IPPROTO_XTP = 0x24 IPV6_AUTOFLOWLABEL = 0x3b IPV6_BINDANY = 0x40 IPV6_BINDMULTI = 0x41 IPV6_BINDV6ONLY = 0x1b IPV6_CHECKSUM = 0x1a IPV6_DEFAULT_MULTICAST_HOPS = 0x1 IPV6_DEFAULT_MULTICAST_LOOP = 0x1 IPV6_DEFHLIM = 0x40 IPV6_DONTFRAG = 0x3e IPV6_DSTOPTS = 0x32 IPV6_FLOWID = 0x43 IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 IPV6_FLOWTYPE = 0x44 IPV6_FRAGTTL = 0x78 IPV6_FW_ADD = 0x1e IPV6_FW_DEL = 0x1f IPV6_FW_FLUSH = 0x20 IPV6_FW_GET = 0x22 IPV6_FW_ZERO = 0x21 IPV6_HLIMDEC = 0x1 IPV6_HOPLIMIT = 0x2f IPV6_HOPOPTS = 0x31 IPV6_IPSEC_POLICY = 0x1c IPV6_JOIN_GROUP = 0xc IPV6_LEAVE_GROUP = 0xd IPV6_MAXHLIM = 0xff IPV6_MAXOPTHDR = 0x800 IPV6_MAXPACKET = 0xffff IPV6_MAX_GROUP_SRC_FILTER = 0x200 IPV6_MAX_MEMBERSHIPS = 0xfff IPV6_MAX_SOCK_SRC_FILTER = 0x80 IPV6_MIN_MEMBERSHIPS = 0x1f IPV6_MMTU = 0x500 IPV6_MSFILTER = 0x4a IPV6_MULTICAST_HOPS = 0xa IPV6_MULTICAST_IF = 0x9 IPV6_MULTICAST_LOOP = 0xb IPV6_NEXTHOP = 0x30 IPV6_PATHMTU = 0x2c IPV6_PKTINFO = 0x2e IPV6_PORTRANGE = 0xe IPV6_PORTRANGE_DEFAULT = 0x0 IPV6_PORTRANGE_HIGH = 0x1 IPV6_PORTRANGE_LOW = 0x2 IPV6_PREFER_TEMPADDR = 0x3f IPV6_RECVDSTOPTS = 0x28 IPV6_RECVFLOWID = 0x46 IPV6_RECVHOPLIMIT = 0x25 IPV6_RECVHOPOPTS = 0x27 IPV6_RECVPATHMTU = 0x2b IPV6_RECVPKTINFO = 0x24 IPV6_RECVRSSBUCKETID = 0x47 IPV6_RECVRTHDR = 0x26 IPV6_RECVTCLASS = 0x39 IPV6_RSSBUCKETID = 0x45 IPV6_RSS_LISTEN_BUCKET = 0x42 IPV6_RTHDR = 0x33 IPV6_RTHDRDSTOPTS = 0x23 IPV6_RTHDR_LOOSE = 0x0 IPV6_RTHDR_STRICT = 0x1 IPV6_RTHDR_TYPE_0 = 0x0 IPV6_SOCKOPT_RESERVED1 = 0x3 IPV6_TCLASS = 0x3d IPV6_UNICAST_HOPS = 0x4 IPV6_USE_MIN_MTU = 0x2a IPV6_V6ONLY = 0x1b IPV6_VERSION = 0x60 IPV6_VERSION_MASK = 0xf0 IP_ADD_MEMBERSHIP = 0xc IP_ADD_SOURCE_MEMBERSHIP = 0x46 IP_BINDANY = 0x18 IP_BINDMULTI = 0x19 IP_BLOCK_SOURCE = 0x48 IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 IP_DONTFRAG = 0x43 IP_DROP_MEMBERSHIP = 0xd IP_DROP_SOURCE_MEMBERSHIP = 0x47 IP_DUMMYNET3 = 0x31 IP_DUMMYNET_CONFIGURE = 0x3c IP_DUMMYNET_DEL = 0x3d IP_DUMMYNET_FLUSH = 0x3e IP_DUMMYNET_GET = 0x40 IP_FLOWID = 0x5a IP_FLOWTYPE = 0x5b IP_FW3 = 0x30 IP_FW_ADD = 0x32 IP_FW_DEL = 0x33 IP_FW_FLUSH = 0x34 IP_FW_GET = 0x36 IP_FW_NAT_CFG = 0x38 IP_FW_NAT_DEL = 0x39 IP_FW_NAT_GET_CONFIG = 0x3a IP_FW_NAT_GET_LOG = 0x3b IP_FW_RESETLOG = 0x37 IP_FW_TABLE_ADD = 0x28 IP_FW_TABLE_DEL = 0x29 IP_FW_TABLE_FLUSH = 0x2a IP_FW_TABLE_GETSIZE = 0x2b IP_FW_TABLE_LIST = 0x2c IP_FW_ZERO = 0x35 IP_HDRINCL = 0x2 IP_IPSEC_POLICY = 0x15 IP_MAXPACKET = 0xffff IP_MAX_GROUP_SRC_FILTER = 0x200 IP_MAX_MEMBERSHIPS = 0xfff IP_MAX_SOCK_MUTE_FILTER = 0x80 IP_MAX_SOCK_SRC_FILTER = 0x80 IP_MAX_SOURCE_FILTER = 0x400 IP_MF = 0x2000 IP_MINTTL = 0x42 IP_MIN_MEMBERSHIPS = 0x1f IP_MSFILTER = 0x4a IP_MSS = 0x240 IP_MULTICAST_IF = 0x9 IP_MULTICAST_LOOP = 0xb IP_MULTICAST_TTL = 0xa IP_MULTICAST_VIF = 0xe IP_OFFMASK = 0x1fff IP_ONESBCAST = 0x17 IP_OPTIONS = 0x1 IP_PORTRANGE = 0x13 IP_PORTRANGE_DEFAULT = 0x0 IP_PORTRANGE_HIGH = 0x1 IP_PORTRANGE_LOW = 0x2 IP_RECVDSTADDR = 0x7 IP_RECVFLOWID = 0x5d IP_RECVIF = 0x14 IP_RECVOPTS = 0x5 IP_RECVRETOPTS = 0x6 IP_RECVRSSBUCKETID = 0x5e IP_RECVTOS = 0x44 IP_RECVTTL = 0x41 IP_RETOPTS = 0x8 IP_RF = 0x8000 IP_RSSBUCKETID = 0x5c IP_RSS_LISTEN_BUCKET = 0x1a IP_RSVP_OFF = 0x10 IP_RSVP_ON = 0xf IP_RSVP_VIF_OFF = 0x12 IP_RSVP_VIF_ON = 0x11 IP_SENDSRCADDR = 0x7 IP_TOS = 0x3 IP_TTL = 0x4 IP_UNBLOCK_SOURCE = 0x49 ISIG = 0x80 ISTRIP = 0x20 IXANY = 0x800 IXOFF = 0x400 IXON = 0x200 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 MADV_AUTOSYNC = 0x7 MADV_CORE = 0x9 MADV_DONTNEED = 0x4 MADV_FREE = 0x5 MADV_NOCORE = 0x8 MADV_NORMAL = 0x0 MADV_NOSYNC = 0x6 MADV_PROTECT = 0xa MADV_RANDOM = 0x1 MADV_SEQUENTIAL = 0x2 MADV_WILLNEED = 0x3 MAP_ALIGNED_SUPER = 0x1000000 MAP_ALIGNMENT_MASK = -0x1000000 MAP_ALIGNMENT_SHIFT = 0x18 MAP_ANON = 0x1000 MAP_ANONYMOUS = 0x1000 MAP_COPY = 0x2 MAP_EXCL = 0x4000 MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_GUARD = 0x2000 MAP_HASSEMAPHORE = 0x200 MAP_NOCORE = 0x20000 MAP_NOSYNC = 0x800 MAP_PREFAULT_READ = 0x40000 MAP_PRIVATE = 0x2 MAP_RESERVED0020 = 0x20 MAP_RESERVED0040 = 0x40 MAP_RESERVED0080 = 0x80 MAP_RESERVED0100 = 0x100 MAP_SHARED = 0x1 MAP_STACK = 0x400 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MNT_ACLS = 0x8000000 MNT_ASYNC = 0x40 MNT_AUTOMOUNTED = 0x200000000 MNT_BYFSID = 0x8000000 MNT_CMDFLAGS = 0xd0f0000 MNT_DEFEXPORTED = 0x200 MNT_DELEXPORT = 0x20000 MNT_EXKERB = 0x800 MNT_EXPORTANON = 0x400 MNT_EXPORTED = 0x100 MNT_EXPUBLIC = 0x20000000 MNT_EXRDONLY = 0x80 MNT_FORCE = 0x80000 MNT_GJOURNAL = 0x2000000 MNT_IGNORE = 0x800000 MNT_LAZY = 0x3 MNT_LOCAL = 0x1000 MNT_MULTILABEL = 0x4000000 MNT_NFS4ACLS = 0x10 MNT_NOATIME = 0x10000000 MNT_NOCLUSTERR = 0x40000000 MNT_NOCLUSTERW = 0x80000000 MNT_NOEXEC = 0x4 MNT_NONBUSY = 0x4000000 MNT_NOSUID = 0x8 MNT_NOSYMFOLLOW = 0x400000 MNT_NOWAIT = 0x2 MNT_QUOTA = 0x2000 MNT_RDONLY = 0x1 MNT_RELOAD = 0x40000 MNT_ROOTFS = 0x4000 MNT_SNAPSHOT = 0x1000000 MNT_SOFTDEP = 0x200000 MNT_SUIDDIR = 0x100000 MNT_SUJ = 0x100000000 MNT_SUSPEND = 0x4 MNT_SYNCHRONOUS = 0x2 MNT_UNION = 0x20 MNT_UPDATE = 0x10000 MNT_UPDATEMASK = 0x2d8d0807e MNT_USER = 0x8000 MNT_VISFLAGMASK = 0x3fef0ffff MNT_WAIT = 0x1 MSG_CMSG_CLOEXEC = 0x40000 MSG_COMPAT = 0x8000 MSG_CTRUNC = 0x20 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x80 MSG_EOF = 0x100 MSG_EOR = 0x8 MSG_NBIO = 0x4000 MSG_NOSIGNAL = 0x20000 MSG_NOTIFICATION = 0x2000 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_TRUNC = 0x10 MSG_WAITALL = 0x40 MSG_WAITFORONE = 0x80000 MS_ASYNC = 0x1 MS_INVALIDATE = 0x2 MS_SYNC = 0x0 NAME_MAX = 0xff NET_RT_DUMP = 0x1 NET_RT_FLAGS = 0x2 NET_RT_IFLIST = 0x3 NET_RT_IFLISTL = 0x5 NET_RT_IFMALIST = 0x4 NOFLSH = 0x80000000 NOKERNINFO = 0x2000000 NOTE_ATTRIB = 0x8 NOTE_CHILD = 0x4 NOTE_CLOSE = 0x100 NOTE_CLOSE_WRITE = 0x200 NOTE_DELETE = 0x1 NOTE_EXEC = 0x20000000 NOTE_EXIT = 0x80000000 NOTE_EXTEND = 0x4 NOTE_FFAND = 0x40000000 NOTE_FFCOPY = 0xc0000000 NOTE_FFCTRLMASK = 0xc0000000 NOTE_FFLAGSMASK = 0xffffff NOTE_FFNOP = 0x0 NOTE_FFOR = 0x80000000 NOTE_FILE_POLL = 0x2 NOTE_FORK = 0x40000000 NOTE_LINK = 0x10 NOTE_LOWAT = 0x1 NOTE_MSECONDS = 0x2 NOTE_NSECONDS = 0x8 NOTE_OPEN = 0x80 NOTE_PCTRLMASK = 0xf0000000 NOTE_PDATAMASK = 0xfffff NOTE_READ = 0x400 NOTE_RENAME = 0x20 NOTE_REVOKE = 0x40 NOTE_SECONDS = 0x1 NOTE_TRACK = 0x1 NOTE_TRACKERR = 0x2 NOTE_TRIGGER = 0x1000000 NOTE_USECONDS = 0x4 NOTE_WRITE = 0x2 OCRNL = 0x10 ONLCR = 0x2 ONLRET = 0x40 ONOCR = 0x20 ONOEOT = 0x8 OPOST = 0x1 OXTABS = 0x4 O_ACCMODE = 0x3 O_APPEND = 0x8 O_ASYNC = 0x40 O_CLOEXEC = 0x100000 O_CREAT = 0x200 O_DIRECT = 0x10000 O_DIRECTORY = 0x20000 O_EXCL = 0x800 O_EXEC = 0x40000 O_EXLOCK = 0x20 O_FSYNC = 0x80 O_NDELAY = 0x4 O_NOCTTY = 0x8000 O_NOFOLLOW = 0x100 O_NONBLOCK = 0x4 O_RDONLY = 0x0 O_RDWR = 0x2 O_SHLOCK = 0x10 O_SYNC = 0x80 O_TRUNC = 0x400 O_TTY_INIT = 0x80000 O_VERIFY = 0x200000 O_WRONLY = 0x1 PARENB = 0x1000 PARMRK = 0x8 PARODD = 0x2000 PENDIN = 0x20000000 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 PROT_EXEC = 0x4 PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 RLIMIT_AS = 0xa RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 RLIMIT_MEMLOCK = 0x6 RLIMIT_NOFILE = 0x8 RLIMIT_NPROC = 0x7 RLIMIT_RSS = 0x5 RLIMIT_STACK = 0x3 RLIM_INFINITY = 0x7fffffffffffffff RTAX_AUTHOR = 0x6 RTAX_BRD = 0x7 RTAX_DST = 0x0 RTAX_GATEWAY = 0x1 RTAX_GENMASK = 0x3 RTAX_IFA = 0x5 RTAX_IFP = 0x4 RTAX_MAX = 0x8 RTAX_NETMASK = 0x2 RTA_AUTHOR = 0x40 RTA_BRD = 0x80 RTA_DST = 0x1 RTA_GATEWAY = 0x2 RTA_GENMASK = 0x8 RTA_IFA = 0x20 RTA_IFP = 0x10 RTA_NETMASK = 0x4 RTF_BLACKHOLE = 0x1000 RTF_BROADCAST = 0x400000 RTF_DONE = 0x40 RTF_DYNAMIC = 0x10 RTF_FIXEDMTU = 0x80000 RTF_FMASK = 0x1004d808 RTF_GATEWAY = 0x2 RTF_GWFLAG_COMPAT = 0x80000000 RTF_HOST = 0x4 RTF_LLDATA = 0x400 RTF_LLINFO = 0x400 RTF_LOCAL = 0x200000 RTF_MODIFIED = 0x20 RTF_MULTICAST = 0x800000 RTF_PINNED = 0x100000 RTF_PROTO1 = 0x8000 RTF_PROTO2 = 0x4000 RTF_PROTO3 = 0x40000 RTF_REJECT = 0x8 RTF_RNH_LOCKED = 0x40000000 RTF_STATIC = 0x800 RTF_STICKY = 0x10000000 RTF_UP = 0x1 RTF_XRESOLVE = 0x200 RTM_ADD = 0x1 RTM_CHANGE = 0x3 RTM_DELADDR = 0xd RTM_DELETE = 0x2 RTM_DELMADDR = 0x10 RTM_GET = 0x4 RTM_IEEE80211 = 0x12 RTM_IFANNOUNCE = 0x11 RTM_IFINFO = 0xe RTM_LOCK = 0x8 RTM_LOSING = 0x5 RTM_MISS = 0x7 RTM_NEWADDR = 0xc RTM_NEWMADDR = 0xf RTM_REDIRECT = 0x6 RTM_RESOLVE = 0xb RTM_RTTUNIT = 0xf4240 RTM_VERSION = 0x5 RTV_EXPIRE = 0x4 RTV_HOPCOUNT = 0x2 RTV_MTU = 0x1 RTV_RPIPE = 0x8 RTV_RTT = 0x40 RTV_RTTVAR = 0x80 RTV_SPIPE = 0x10 RTV_SSTHRESH = 0x20 RTV_WEIGHT = 0x100 RT_ALL_FIBS = -0x1 RT_BLACKHOLE = 0x40 RT_CACHING_CONTEXT = 0x1 RT_DEFAULT_FIB = 0x0 RT_HAS_GW = 0x80 RT_HAS_HEADER = 0x10 RT_HAS_HEADER_BIT = 0x4 RT_L2_ME = 0x4 RT_L2_ME_BIT = 0x2 RT_LLE_CACHE = 0x100 RT_MAY_LOOP = 0x8 RT_MAY_LOOP_BIT = 0x3 RT_NORTREF = 0x2 RT_REJECT = 0x20 RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 RUSAGE_THREAD = 0x1 SCM_BINTIME = 0x4 SCM_CREDS = 0x3 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x2 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 SIOCADDMULTI = 0x80206931 SIOCAIFADDR = 0x8040691a SIOCAIFGROUP = 0x80246987 SIOCATMARK = 0x40047307 SIOCDELMULTI = 0x80206932 SIOCDIFADDR = 0x80206919 SIOCDIFGROUP = 0x80246989 SIOCDIFPHYADDR = 0x80206949 SIOCGDRVSPEC = 0xc01c697b SIOCGETSGCNT = 0xc0147210 SIOCGETVIFCNT = 0xc014720f SIOCGHIWAT = 0x40047301 SIOCGHWADDR = 0xc020693e SIOCGI2C = 0xc020693d SIOCGIFADDR = 0xc0206921 SIOCGIFBRDADDR = 0xc0206923 SIOCGIFCAP = 0xc020691f SIOCGIFCONF = 0xc0086924 SIOCGIFDESCR = 0xc020692a SIOCGIFDSTADDR = 0xc0206922 SIOCGIFFIB = 0xc020695c SIOCGIFFLAGS = 0xc0206911 SIOCGIFGENERIC = 0xc020693a SIOCGIFGMEMB = 0xc024698a SIOCGIFGROUP = 0xc0246988 SIOCGIFINDEX = 0xc0206920 SIOCGIFMAC = 0xc0206926 SIOCGIFMEDIA = 0xc0286938 SIOCGIFMETRIC = 0xc0206917 SIOCGIFMTU = 0xc0206933 SIOCGIFNETMASK = 0xc0206925 SIOCGIFPDSTADDR = 0xc0206948 SIOCGIFPHYS = 0xc0206935 SIOCGIFPSRCADDR = 0xc0206947 SIOCGIFSTATUS = 0xc331693b SIOCGIFXMEDIA = 0xc028698b SIOCGLOWAT = 0x40047303 SIOCGPGRP = 0x40047309 SIOCGPRIVATE_0 = 0xc0206950 SIOCGPRIVATE_1 = 0xc0206951 SIOCGTUNFIB = 0xc020695e SIOCIFCREATE = 0xc020697a SIOCIFCREATE2 = 0xc020697c SIOCIFDESTROY = 0x80206979 SIOCIFGCLONERS = 0xc00c6978 SIOCSDRVSPEC = 0x801c697b SIOCSHIWAT = 0x80047300 SIOCSIFADDR = 0x8020690c SIOCSIFBRDADDR = 0x80206913 SIOCSIFCAP = 0x8020691e SIOCSIFDESCR = 0x80206929 SIOCSIFDSTADDR = 0x8020690e SIOCSIFFIB = 0x8020695d SIOCSIFFLAGS = 0x80206910 SIOCSIFGENERIC = 0x80206939 SIOCSIFLLADDR = 0x8020693c SIOCSIFMAC = 0x80206927 SIOCSIFMEDIA = 0xc0206937 SIOCSIFMETRIC = 0x80206918 SIOCSIFMTU = 0x80206934 SIOCSIFNAME = 0x80206928 SIOCSIFNETMASK = 0x80206916 SIOCSIFPHYADDR = 0x80406946 SIOCSIFPHYS = 0x80206936 SIOCSIFRVNET = 0xc020695b SIOCSIFVNET = 0xc020695a SIOCSLOWAT = 0x80047302 SIOCSPGRP = 0x80047308 SIOCSTUNFIB = 0x8020695f SOCK_CLOEXEC = 0x10000000 SOCK_DGRAM = 0x2 SOCK_MAXADDRLEN = 0xff SOCK_NONBLOCK = 0x20000000 SOCK_RAW = 0x3 SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x1 SOL_SOCKET = 0xffff SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x2 SO_ACCEPTFILTER = 0x1000 SO_BINTIME = 0x2000 SO_BROADCAST = 0x20 SO_DEBUG = 0x1 SO_DONTROUTE = 0x10 SO_ERROR = 0x1007 SO_KEEPALIVE = 0x8 SO_LABEL = 0x1009 SO_LINGER = 0x80 SO_LISTENINCQLEN = 0x1013 SO_LISTENQLEN = 0x1012 SO_LISTENQLIMIT = 0x1011 SO_NOSIGPIPE = 0x800 SO_NO_DDP = 0x8000 SO_NO_OFFLOAD = 0x4000 SO_OOBINLINE = 0x100 SO_PEERLABEL = 0x1010 SO_PROTOCOL = 0x1016 SO_PROTOTYPE = 0x1016 SO_RCVBUF = 0x1002 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x1006 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_SETFIB = 0x1014 SO_SNDBUF = 0x1001 SO_SNDLOWAT = 0x1003 SO_SNDTIMEO = 0x1005 SO_TIMESTAMP = 0x400 SO_TYPE = 0x1008 SO_USELOOPBACK = 0x40 SO_USER_COOKIE = 0x1015 SO_VENDOR = 0x80000000 TAB0 = 0x0 TAB3 = 0x4 TABDLY = 0x4 TCIFLUSH = 0x1 TCIOFF = 0x3 TCIOFLUSH = 0x3 TCION = 0x4 TCOFLUSH = 0x2 TCOOFF = 0x1 TCOON = 0x2 TCP_CA_NAME_MAX = 0x10 TCP_CCALGOOPT = 0x41 TCP_CONGESTION = 0x40 TCP_FASTOPEN = 0x401 TCP_FUNCTION_BLK = 0x2000 TCP_FUNCTION_NAME_LEN_MAX = 0x20 TCP_INFO = 0x20 TCP_KEEPCNT = 0x400 TCP_KEEPIDLE = 0x100 TCP_KEEPINIT = 0x80 TCP_KEEPINTVL = 0x200 TCP_MAXBURST = 0x4 TCP_MAXHLEN = 0x3c TCP_MAXOLEN = 0x28 TCP_MAXSEG = 0x2 TCP_MAXWIN = 0xffff TCP_MAX_SACK = 0x4 TCP_MAX_WINSHIFT = 0xe TCP_MD5SIG = 0x10 TCP_MINMSS = 0xd8 TCP_MSS = 0x218 TCP_NODELAY = 0x1 TCP_NOOPT = 0x8 TCP_NOPUSH = 0x4 TCP_PCAP_IN = 0x1000 TCP_PCAP_OUT = 0x800 TCP_VENDOR = 0x80000000 TCSAFLUSH = 0x2 TIOCCBRK = 0x2000747a TIOCCDTR = 0x20007478 TIOCCONS = 0x80047462 TIOCDRAIN = 0x2000745e TIOCEXCL = 0x2000740d TIOCEXT = 0x80047460 TIOCFLUSH = 0x80047410 TIOCGDRAINWAIT = 0x40047456 TIOCGETA = 0x402c7413 TIOCGETD = 0x4004741a TIOCGPGRP = 0x40047477 TIOCGPTN = 0x4004740f TIOCGSID = 0x40047463 TIOCGWINSZ = 0x40087468 TIOCMBIC = 0x8004746b TIOCMBIS = 0x8004746c TIOCMGDTRWAIT = 0x4004745a TIOCMGET = 0x4004746a TIOCMSDTRWAIT = 0x8004745b TIOCMSET = 0x8004746d TIOCM_CAR = 0x40 TIOCM_CD = 0x40 TIOCM_CTS = 0x20 TIOCM_DCD = 0x40 TIOCM_DSR = 0x100 TIOCM_DTR = 0x2 TIOCM_LE = 0x1 TIOCM_RI = 0x80 TIOCM_RNG = 0x80 TIOCM_RTS = 0x4 TIOCM_SR = 0x10 TIOCM_ST = 0x8 TIOCNOTTY = 0x20007471 TIOCNXCL = 0x2000740e TIOCOUTQ = 0x40047473 TIOCPKT = 0x80047470 TIOCPKT_DATA = 0x0 TIOCPKT_DOSTOP = 0x20 TIOCPKT_FLUSHREAD = 0x1 TIOCPKT_FLUSHWRITE = 0x2 TIOCPKT_IOCTL = 0x40 TIOCPKT_NOSTOP = 0x10 TIOCPKT_START = 0x8 TIOCPKT_STOP = 0x4 TIOCPTMASTER = 0x2000741c TIOCSBRK = 0x2000747b TIOCSCTTY = 0x20007461 TIOCSDRAINWAIT = 0x80047457 TIOCSDTR = 0x20007479 TIOCSETA = 0x802c7414 TIOCSETAF = 0x802c7416 TIOCSETAW = 0x802c7415 TIOCSETD = 0x8004741b TIOCSIG = 0x2004745f TIOCSPGRP = 0x80047476 TIOCSTART = 0x2000746e TIOCSTAT = 0x20007465 TIOCSTI = 0x80017472 TIOCSTOP = 0x2000746f TIOCSWINSZ = 0x80087467 TIOCTIMESTAMP = 0x40107459 TIOCUCNTL = 0x80047466 TOSTOP = 0x400000 VDISCARD = 0xf VDSUSP = 0xb VEOF = 0x0 VEOL = 0x1 VEOL2 = 0x2 VERASE = 0x3 VERASE2 = 0x7 VINTR = 0x8 VKILL = 0x5 VLNEXT = 0xe VMIN = 0x10 VQUIT = 0x9 VREPRINT = 0x6 VSTART = 0xc VSTATUS = 0x12 VSTOP = 0xd VSUSP = 0xa VTIME = 0x11 VWERASE = 0x4 WCONTINUED = 0x4 WCOREFLAG = 0x80 WEXITED = 0x10 WLINUXCLONE = 0x80000000 WNOHANG = 0x1 WNOWAIT = 0x8 WSTOPPED = 0x2 WTRAPPED = 0x20 WUNTRACED = 0x2 ) // Errors const ( E2BIG = syscall.Errno(0x7) EACCES = syscall.Errno(0xd) EADDRINUSE = syscall.Errno(0x30) EADDRNOTAVAIL = syscall.Errno(0x31) EAFNOSUPPORT = syscall.Errno(0x2f) EAGAIN = syscall.Errno(0x23) EALREADY = syscall.Errno(0x25) EAUTH = syscall.Errno(0x50) EBADF = syscall.Errno(0x9) EBADMSG = syscall.Errno(0x59) EBADRPC = syscall.Errno(0x48) EBUSY = syscall.Errno(0x10) ECANCELED = syscall.Errno(0x55) ECAPMODE = syscall.Errno(0x5e) ECHILD = syscall.Errno(0xa) ECONNABORTED = syscall.Errno(0x35) ECONNREFUSED = syscall.Errno(0x3d) ECONNRESET = syscall.Errno(0x36) EDEADLK = syscall.Errno(0xb) EDESTADDRREQ = syscall.Errno(0x27) EDOM = syscall.Errno(0x21) EDOOFUS = syscall.Errno(0x58) EDQUOT = syscall.Errno(0x45) EEXIST = syscall.Errno(0x11) EFAULT = syscall.Errno(0xe) EFBIG = syscall.Errno(0x1b) EFTYPE = syscall.Errno(0x4f) EHOSTDOWN = syscall.Errno(0x40) EHOSTUNREACH = syscall.Errno(0x41) EIDRM = syscall.Errno(0x52) EILSEQ = syscall.Errno(0x56) EINPROGRESS = syscall.Errno(0x24) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x38) EISDIR = syscall.Errno(0x15) ELAST = syscall.Errno(0x60) ELOOP = syscall.Errno(0x3e) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) EMSGSIZE = syscall.Errno(0x28) EMULTIHOP = syscall.Errno(0x5a) ENAMETOOLONG = syscall.Errno(0x3f) ENEEDAUTH = syscall.Errno(0x51) ENETDOWN = syscall.Errno(0x32) ENETRESET = syscall.Errno(0x34) ENETUNREACH = syscall.Errno(0x33) ENFILE = syscall.Errno(0x17) ENOATTR = syscall.Errno(0x57) ENOBUFS = syscall.Errno(0x37) ENODEV = syscall.Errno(0x13) ENOENT = syscall.Errno(0x2) ENOEXEC = syscall.Errno(0x8) ENOLCK = syscall.Errno(0x4d) ENOLINK = syscall.Errno(0x5b) ENOMEM = syscall.Errno(0xc) ENOMSG = syscall.Errno(0x53) ENOPROTOOPT = syscall.Errno(0x2a) ENOSPC = syscall.Errno(0x1c) ENOSYS = syscall.Errno(0x4e) ENOTBLK = syscall.Errno(0xf) ENOTCAPABLE = syscall.Errno(0x5d) ENOTCONN = syscall.Errno(0x39) ENOTDIR = syscall.Errno(0x14) ENOTEMPTY = syscall.Errno(0x42) ENOTRECOVERABLE = syscall.Errno(0x5f) ENOTSOCK = syscall.Errno(0x26) ENOTSUP = syscall.Errno(0x2d) ENOTTY = syscall.Errno(0x19) ENXIO = syscall.Errno(0x6) EOPNOTSUPP = syscall.Errno(0x2d) EOVERFLOW = syscall.Errno(0x54) EOWNERDEAD = syscall.Errno(0x60) EPERM = syscall.Errno(0x1) EPFNOSUPPORT = syscall.Errno(0x2e) EPIPE = syscall.Errno(0x20) EPROCLIM = syscall.Errno(0x43) EPROCUNAVAIL = syscall.Errno(0x4c) EPROGMISMATCH = syscall.Errno(0x4b) EPROGUNAVAIL = syscall.Errno(0x4a) EPROTO = syscall.Errno(0x5c) EPROTONOSUPPORT = syscall.Errno(0x2b) EPROTOTYPE = syscall.Errno(0x29) ERANGE = syscall.Errno(0x22) EREMOTE = syscall.Errno(0x47) EROFS = syscall.Errno(0x1e) ERPCMISMATCH = syscall.Errno(0x49) ESHUTDOWN = syscall.Errno(0x3a) ESOCKTNOSUPPORT = syscall.Errno(0x2c) ESPIPE = syscall.Errno(0x1d) ESRCH = syscall.Errno(0x3) ESTALE = syscall.Errno(0x46) ETIMEDOUT = syscall.Errno(0x3c) ETOOMANYREFS = syscall.Errno(0x3b) ETXTBSY = syscall.Errno(0x1a) EUSERS = syscall.Errno(0x44) EWOULDBLOCK = syscall.Errno(0x23) EXDEV = syscall.Errno(0x12) ) // Signals const ( SIGABRT = syscall.Signal(0x6) SIGALRM = syscall.Signal(0xe) SIGBUS = syscall.Signal(0xa) SIGCHLD = syscall.Signal(0x14) SIGCONT = syscall.Signal(0x13) SIGEMT = syscall.Signal(0x7) SIGFPE = syscall.Signal(0x8) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) SIGINFO = syscall.Signal(0x1d) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x17) SIGIOT = syscall.Signal(0x6) SIGKILL = syscall.Signal(0x9) SIGLIBRT = syscall.Signal(0x21) SIGLWP = syscall.Signal(0x20) SIGPIPE = syscall.Signal(0xd) SIGPROF = syscall.Signal(0x1b) SIGQUIT = syscall.Signal(0x3) SIGSEGV = syscall.Signal(0xb) SIGSTOP = syscall.Signal(0x11) SIGSYS = syscall.Signal(0xc) SIGTERM = syscall.Signal(0xf) SIGTHR = syscall.Signal(0x20) SIGTRAP = syscall.Signal(0x5) SIGTSTP = syscall.Signal(0x12) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) SIGURG = syscall.Signal(0x10) SIGUSR1 = syscall.Signal(0x1e) SIGUSR2 = syscall.Signal(0x1f) SIGVTALRM = syscall.Signal(0x1a) SIGWINCH = syscall.Signal(0x1c) SIGXCPU = syscall.Signal(0x18) SIGXFSZ = syscall.Signal(0x19) ) // Error table var errors = [...]string{ 1: "operation not permitted", 2: "no such file or directory", 3: "no such process", 4: "interrupted system call", 5: "input/output error", 6: "device not configured", 7: "argument list too long", 8: "exec format error", 9: "bad file descriptor", 10: "no child processes", 11: "resource deadlock avoided", 12: "cannot allocate memory", 13: "permission denied", 14: "bad address", 15: "block device required", 16: "device busy", 17: "file exists", 18: "cross-device link", 19: "operation not supported by device", 20: "not a directory", 21: "is a directory", 22: "invalid argument", 23: "too many open files in system", 24: "too many open files", 25: "inappropriate ioctl for device", 26: "text file busy", 27: "file too large", 28: "no space left on device", 29: "illegal seek", 30: "read-only file system", 31: "too many links", 32: "broken pipe", 33: "numerical argument out of domain", 34: "result too large", 35: "resource temporarily unavailable", 36: "operation now in progress", 37: "operation already in progress", 38: "socket operation on non-socket", 39: "destination address required", 40: "message too long", 41: "protocol wrong type for socket", 42: "protocol not available", 43: "protocol not supported", 44: "socket type not supported", 45: "operation not supported", 46: "protocol family not supported", 47: "address family not supported by protocol family", 48: "address already in use", 49: "can't assign requested address", 50: "network is down", 51: "network is unreachable", 52: "network dropped connection on reset", 53: "software caused connection abort", 54: "connection reset by peer", 55: "no buffer space available", 56: "socket is already connected", 57: "socket is not connected", 58: "can't send after socket shutdown", 59: "too many references: can't splice", 60: "operation timed out", 61: "connection refused", 62: "too many levels of symbolic links", 63: "file name too long", 64: "host is down", 65: "no route to host", 66: "directory not empty", 67: "too many processes", 68: "too many users", 69: "disc quota exceeded", 70: "stale NFS file handle", 71: "too many levels of remote in path", 72: "RPC struct is bad", 73: "RPC version wrong", 74: "RPC prog. not avail", 75: "program version wrong", 76: "bad procedure for program", 77: "no locks available", 78: "function not implemented", 79: "inappropriate file type or format", 80: "authentication error", 81: "need authenticator", 82: "identifier removed", 83: "no message of desired type", 84: "value too large to be stored in data type", 85: "operation canceled", 86: "illegal byte sequence", 87: "attribute not found", 88: "programming error", 89: "bad message", 90: "multihop attempted", 91: "link has been severed", 92: "protocol error", 93: "capabilities insufficient", 94: "not permitted in capability mode", 95: "state not recoverable", 96: "previous owner died", } // Signal table var signals = [...]string{ 1: "hangup", 2: "interrupt", 3: "quit", 4: "illegal instruction", 5: "trace/BPT trap", 6: "abort trap", 7: "EMT trap", 8: "floating point exception", 9: "killed", 10: "bus error", 11: "segmentation fault", 12: "bad system call", 13: "broken pipe", 14: "alarm clock", 15: "terminated", 16: "urgent I/O condition", 17: "suspended (signal)", 18: "suspended", 19: "continued", 20: "child exited", 21: "stopped (tty input)", 22: "stopped (tty output)", 23: "I/O possible", 24: "cputime limit exceeded", 25: "filesize limit exceeded", 26: "virtual timer expired", 27: "profiling timer expired", 28: "window size changes", 29: "information request", 30: "user defined signal 1", 31: "user defined signal 2", 32: "unknown signal", 33: "unknown signal", } ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_linux_386.go ================================================ // mkerrors.sh -Wall -Werror -static -I/tmp/include -m32 // Code generated by the command above; see README.md. DO NOT EDIT. // +build 386,linux // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- -Wall -Werror -static -I/tmp/include -m32 _const.go package unix import "syscall" const ( AF_ALG = 0x26 AF_APPLETALK = 0x5 AF_ASH = 0x12 AF_ATMPVC = 0x8 AF_ATMSVC = 0x14 AF_AX25 = 0x3 AF_BLUETOOTH = 0x1f AF_BRIDGE = 0x7 AF_CAIF = 0x25 AF_CAN = 0x1d AF_DECnet = 0xc AF_ECONET = 0x13 AF_FILE = 0x1 AF_IB = 0x1b AF_IEEE802154 = 0x24 AF_INET = 0x2 AF_INET6 = 0xa AF_IPX = 0x4 AF_IRDA = 0x17 AF_ISDN = 0x22 AF_IUCV = 0x20 AF_KCM = 0x29 AF_KEY = 0xf AF_LLC = 0x1a AF_LOCAL = 0x1 AF_MAX = 0x2c AF_MPLS = 0x1c AF_NETBEUI = 0xd AF_NETLINK = 0x10 AF_NETROM = 0x6 AF_NFC = 0x27 AF_PACKET = 0x11 AF_PHONET = 0x23 AF_PPPOX = 0x18 AF_QIPCRTR = 0x2a AF_RDS = 0x15 AF_ROSE = 0xb AF_ROUTE = 0x10 AF_RXRPC = 0x21 AF_SECURITY = 0xe AF_SMC = 0x2b AF_SNA = 0x16 AF_TIPC = 0x1e AF_UNIX = 0x1 AF_UNSPEC = 0x0 AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 ALG_OP_DECRYPT = 0x0 ALG_OP_ENCRYPT = 0x1 ALG_SET_AEAD_ASSOCLEN = 0x4 ALG_SET_AEAD_AUTHSIZE = 0x5 ALG_SET_IV = 0x2 ALG_SET_KEY = 0x1 ALG_SET_OP = 0x3 ARPHRD_6LOWPAN = 0x339 ARPHRD_ADAPT = 0x108 ARPHRD_APPLETLK = 0x8 ARPHRD_ARCNET = 0x7 ARPHRD_ASH = 0x30d ARPHRD_ATM = 0x13 ARPHRD_AX25 = 0x3 ARPHRD_BIF = 0x307 ARPHRD_CAIF = 0x336 ARPHRD_CAN = 0x118 ARPHRD_CHAOS = 0x5 ARPHRD_CISCO = 0x201 ARPHRD_CSLIP = 0x101 ARPHRD_CSLIP6 = 0x103 ARPHRD_DDCMP = 0x205 ARPHRD_DLCI = 0xf ARPHRD_ECONET = 0x30e ARPHRD_EETHER = 0x2 ARPHRD_ETHER = 0x1 ARPHRD_EUI64 = 0x1b ARPHRD_FCAL = 0x311 ARPHRD_FCFABRIC = 0x313 ARPHRD_FCPL = 0x312 ARPHRD_FCPP = 0x310 ARPHRD_FDDI = 0x306 ARPHRD_FRAD = 0x302 ARPHRD_HDLC = 0x201 ARPHRD_HIPPI = 0x30c ARPHRD_HWX25 = 0x110 ARPHRD_IEEE1394 = 0x18 ARPHRD_IEEE802 = 0x6 ARPHRD_IEEE80211 = 0x321 ARPHRD_IEEE80211_PRISM = 0x322 ARPHRD_IEEE80211_RADIOTAP = 0x323 ARPHRD_IEEE802154 = 0x324 ARPHRD_IEEE802154_MONITOR = 0x325 ARPHRD_IEEE802_TR = 0x320 ARPHRD_INFINIBAND = 0x20 ARPHRD_IP6GRE = 0x337 ARPHRD_IPDDP = 0x309 ARPHRD_IPGRE = 0x30a ARPHRD_IRDA = 0x30f ARPHRD_LAPB = 0x204 ARPHRD_LOCALTLK = 0x305 ARPHRD_LOOPBACK = 0x304 ARPHRD_METRICOM = 0x17 ARPHRD_NETLINK = 0x338 ARPHRD_NETROM = 0x0 ARPHRD_NONE = 0xfffe ARPHRD_PHONET = 0x334 ARPHRD_PHONET_PIPE = 0x335 ARPHRD_PIMREG = 0x30b ARPHRD_PPP = 0x200 ARPHRD_PRONET = 0x4 ARPHRD_RAWHDLC = 0x206 ARPHRD_ROSE = 0x10e ARPHRD_RSRVD = 0x104 ARPHRD_SIT = 0x308 ARPHRD_SKIP = 0x303 ARPHRD_SLIP = 0x100 ARPHRD_SLIP6 = 0x102 ARPHRD_TUNNEL = 0x300 ARPHRD_TUNNEL6 = 0x301 ARPHRD_VOID = 0xffff ARPHRD_VSOCKMON = 0x33a ARPHRD_X25 = 0x10f B0 = 0x0 B1000000 = 0x1008 B110 = 0x3 B115200 = 0x1002 B1152000 = 0x1009 B1200 = 0x9 B134 = 0x4 B150 = 0x5 B1500000 = 0x100a B1800 = 0xa B19200 = 0xe B200 = 0x6 B2000000 = 0x100b B230400 = 0x1003 B2400 = 0xb B2500000 = 0x100c B300 = 0x7 B3000000 = 0x100d B3500000 = 0x100e B38400 = 0xf B4000000 = 0x100f B460800 = 0x1004 B4800 = 0xc B50 = 0x1 B500000 = 0x1005 B57600 = 0x1001 B576000 = 0x1006 B600 = 0x8 B75 = 0x2 B921600 = 0x1007 B9600 = 0xd BLKBSZGET = 0x80041270 BLKBSZSET = 0x40041271 BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80041272 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d BLKRRPART = 0x125f BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 BOTHER = 0x1000 BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALU = 0x4 BPF_AND = 0x50 BPF_B = 0x10 BPF_DIV = 0x30 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 BPF_JA = 0x0 BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 BPF_JMP = 0x5 BPF_JSET = 0x40 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 BPF_LEN = 0x80 BPF_LL_OFF = -0x200000 BPF_LSH = 0x60 BPF_MAJOR_VERSION = 0x1 BPF_MAXINSNS = 0x1000 BPF_MEM = 0x60 BPF_MEMWORDS = 0x10 BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MOD = 0x90 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_NET_OFF = -0x100000 BPF_OR = 0x40 BPF_RET = 0x6 BPF_RSH = 0x70 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 BPF_TAX = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 BPF_XOR = 0xa0 BRKINT = 0x2 BS0 = 0x0 BS1 = 0x2000 BSDLY = 0x2000 CAN_BCM = 0x2 CAN_EFF_FLAG = 0x80000000 CAN_EFF_ID_BITS = 0x1d CAN_EFF_MASK = 0x1fffffff CAN_ERR_FLAG = 0x20000000 CAN_ERR_MASK = 0x1fffffff CAN_INV_FILTER = 0x20000000 CAN_ISOTP = 0x6 CAN_MAX_DLC = 0x8 CAN_MAX_DLEN = 0x8 CAN_MCNET = 0x5 CAN_MTU = 0x10 CAN_NPROTO = 0x7 CAN_RAW = 0x1 CAN_RAW_FILTER_MAX = 0x200 CAN_RTR_FLAG = 0x40000000 CAN_SFF_ID_BITS = 0xb CAN_SFF_MASK = 0x7ff CAN_TP16 = 0x3 CAN_TP20 = 0x4 CBAUD = 0x100f CBAUDEX = 0x1000 CFLUSH = 0xf CIBAUD = 0x100f0000 CLOCAL = 0x800 CLOCK_BOOTTIME = 0x7 CLOCK_BOOTTIME_ALARM = 0x9 CLOCK_DEFAULT = 0x0 CLOCK_EXT = 0x1 CLOCK_INT = 0x2 CLOCK_MONOTONIC = 0x1 CLOCK_MONOTONIC_COARSE = 0x6 CLOCK_MONOTONIC_RAW = 0x4 CLOCK_PROCESS_CPUTIME_ID = 0x2 CLOCK_REALTIME = 0x0 CLOCK_REALTIME_ALARM = 0x8 CLOCK_REALTIME_COARSE = 0x5 CLOCK_TAI = 0xb CLOCK_THREAD_CPUTIME_ID = 0x3 CLOCK_TXFROMRX = 0x4 CLOCK_TXINT = 0x3 CLONE_CHILD_CLEARTID = 0x200000 CLONE_CHILD_SETTID = 0x1000000 CLONE_DETACHED = 0x400000 CLONE_FILES = 0x400 CLONE_FS = 0x200 CLONE_IO = 0x80000000 CLONE_NEWCGROUP = 0x2000000 CLONE_NEWIPC = 0x8000000 CLONE_NEWNET = 0x40000000 CLONE_NEWNS = 0x20000 CLONE_NEWPID = 0x20000000 CLONE_NEWUSER = 0x10000000 CLONE_NEWUTS = 0x4000000 CLONE_PARENT = 0x8000 CLONE_PARENT_SETTID = 0x100000 CLONE_PTRACE = 0x2000 CLONE_SETTLS = 0x80000 CLONE_SIGHAND = 0x800 CLONE_SYSVSEM = 0x40000 CLONE_THREAD = 0x10000 CLONE_UNTRACED = 0x800000 CLONE_VFORK = 0x4000 CLONE_VM = 0x100 CMSPAR = 0x40000000 CR0 = 0x0 CR1 = 0x200 CR2 = 0x400 CR3 = 0x600 CRDLY = 0x600 CREAD = 0x80 CRTSCTS = 0x80000000 CS5 = 0x0 CS6 = 0x10 CS7 = 0x20 CS8 = 0x30 CSIGNAL = 0xff CSIZE = 0x30 CSTART = 0x11 CSTATUS = 0x0 CSTOP = 0x13 CSTOPB = 0x40 CSUSP = 0x1a DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 DT_FIFO = 0x1 DT_LNK = 0xa DT_REG = 0x8 DT_SOCK = 0xc DT_UNKNOWN = 0x0 DT_WHT = 0xe ECHO = 0x8 ECHOCTL = 0x200 ECHOE = 0x10 ECHOK = 0x20 ECHOKE = 0x800 ECHONL = 0x40 ECHOPRT = 0x400 EFD_CLOEXEC = 0x80000 EFD_NONBLOCK = 0x800 EFD_SEMAPHORE = 0x1 ENCODING_DEFAULT = 0x0 ENCODING_FM_MARK = 0x3 ENCODING_FM_SPACE = 0x4 ENCODING_MANCHESTER = 0x5 ENCODING_NRZ = 0x1 ENCODING_NRZI = 0x2 EPOLLERR = 0x8 EPOLLET = 0x80000000 EPOLLEXCLUSIVE = 0x10000000 EPOLLHUP = 0x10 EPOLLIN = 0x1 EPOLLMSG = 0x400 EPOLLONESHOT = 0x40000000 EPOLLOUT = 0x4 EPOLLPRI = 0x2 EPOLLRDBAND = 0x80 EPOLLRDHUP = 0x2000 EPOLLRDNORM = 0x40 EPOLLWAKEUP = 0x20000000 EPOLLWRBAND = 0x200 EPOLLWRNORM = 0x100 EPOLL_CLOEXEC = 0x80000 EPOLL_CTL_ADD = 0x1 EPOLL_CTL_DEL = 0x2 EPOLL_CTL_MOD = 0x3 ETH_P_1588 = 0x88f7 ETH_P_8021AD = 0x88a8 ETH_P_8021AH = 0x88e7 ETH_P_8021Q = 0x8100 ETH_P_80221 = 0x8917 ETH_P_802_2 = 0x4 ETH_P_802_3 = 0x1 ETH_P_802_3_MIN = 0x600 ETH_P_802_EX1 = 0x88b5 ETH_P_AARP = 0x80f3 ETH_P_AF_IUCV = 0xfbfb ETH_P_ALL = 0x3 ETH_P_AOE = 0x88a2 ETH_P_ARCNET = 0x1a ETH_P_ARP = 0x806 ETH_P_ATALK = 0x809b ETH_P_ATMFATE = 0x8884 ETH_P_ATMMPOA = 0x884c ETH_P_AX25 = 0x2 ETH_P_BATMAN = 0x4305 ETH_P_BPQ = 0x8ff ETH_P_CAIF = 0xf7 ETH_P_CAN = 0xc ETH_P_CANFD = 0xd ETH_P_CONTROL = 0x16 ETH_P_CUST = 0x6006 ETH_P_DDCMP = 0x6 ETH_P_DEC = 0x6000 ETH_P_DIAG = 0x6005 ETH_P_DNA_DL = 0x6001 ETH_P_DNA_RC = 0x6002 ETH_P_DNA_RT = 0x6003 ETH_P_DSA = 0x1b ETH_P_ECONET = 0x18 ETH_P_EDSA = 0xdada ETH_P_FCOE = 0x8906 ETH_P_FIP = 0x8914 ETH_P_HDLC = 0x19 ETH_P_HSR = 0x892f ETH_P_IBOE = 0x8915 ETH_P_IEEE802154 = 0xf6 ETH_P_IEEEPUP = 0xa00 ETH_P_IEEEPUPAT = 0xa01 ETH_P_IP = 0x800 ETH_P_IPV6 = 0x86dd ETH_P_IPX = 0x8137 ETH_P_IRDA = 0x17 ETH_P_LAT = 0x6004 ETH_P_LINK_CTL = 0x886c ETH_P_LOCALTALK = 0x9 ETH_P_LOOP = 0x60 ETH_P_LOOPBACK = 0x9000 ETH_P_MACSEC = 0x88e5 ETH_P_MOBITEX = 0x15 ETH_P_MPLS_MC = 0x8848 ETH_P_MPLS_UC = 0x8847 ETH_P_MVRP = 0x88f5 ETH_P_NCSI = 0x88f8 ETH_P_PAE = 0x888e ETH_P_PAUSE = 0x8808 ETH_P_PHONET = 0xf5 ETH_P_PPPTALK = 0x10 ETH_P_PPP_DISC = 0x8863 ETH_P_PPP_MP = 0x8 ETH_P_PPP_SES = 0x8864 ETH_P_PRP = 0x88fb ETH_P_PUP = 0x200 ETH_P_PUPAT = 0x201 ETH_P_QINQ1 = 0x9100 ETH_P_QINQ2 = 0x9200 ETH_P_QINQ3 = 0x9300 ETH_P_RARP = 0x8035 ETH_P_SCA = 0x6007 ETH_P_SLOW = 0x8809 ETH_P_SNAP = 0x5 ETH_P_TDLS = 0x890d ETH_P_TEB = 0x6558 ETH_P_TIPC = 0x88ca ETH_P_TRAILER = 0x1c ETH_P_TR_802_2 = 0x11 ETH_P_TSN = 0x22f0 ETH_P_WAN_PPP = 0x7 ETH_P_WCCP = 0x883e ETH_P_X25 = 0x805 ETH_P_XDSA = 0xf8 EXTA = 0xe EXTB = 0xf EXTPROC = 0x10000 FALLOC_FL_COLLAPSE_RANGE = 0x8 FALLOC_FL_INSERT_RANGE = 0x20 FALLOC_FL_KEEP_SIZE = 0x1 FALLOC_FL_NO_HIDE_STALE = 0x4 FALLOC_FL_PUNCH_HOLE = 0x2 FALLOC_FL_UNSHARE_RANGE = 0x40 FALLOC_FL_ZERO_RANGE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 FF1 = 0x8000 FFDLY = 0x8000 FLUSHO = 0x1000 FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 FS_ENCRYPTION_MODE_INVALID = 0x0 FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 FS_KEY_DESCRIPTOR_SIZE = 0x8 FS_KEY_DESC_PREFIX = "fscrypt:" FS_KEY_DESC_PREFIX_SIZE = 0x8 FS_MAX_KEY_SIZE = 0x40 FS_POLICY_FLAGS_PAD_16 = 0x2 FS_POLICY_FLAGS_PAD_32 = 0x3 FS_POLICY_FLAGS_PAD_4 = 0x0 FS_POLICY_FLAGS_PAD_8 = 0x1 FS_POLICY_FLAGS_PAD_MASK = 0x3 FS_POLICY_FLAGS_VALID = 0x3 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0x406 F_EXLCK = 0x4 F_GETFD = 0x1 F_GETFL = 0x3 F_GETLEASE = 0x401 F_GETLK = 0xc F_GETLK64 = 0xc F_GETOWN = 0x9 F_GETOWN_EX = 0x10 F_GETPIPE_SZ = 0x408 F_GETSIG = 0xb F_LOCK = 0x1 F_NOTIFY = 0x402 F_OFD_GETLK = 0x24 F_OFD_SETLK = 0x25 F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 F_SETFD = 0x2 F_SETFL = 0x4 F_SETLEASE = 0x400 F_SETLK = 0xd F_SETLK64 = 0xd F_SETLKW = 0xe F_SETLKW64 = 0xe F_SETOWN = 0x8 F_SETOWN_EX = 0xf F_SETPIPE_SZ = 0x407 F_SETSIG = 0xa F_SHLCK = 0x8 F_TEST = 0x3 F_TLOCK = 0x2 F_ULOCK = 0x0 F_UNLCK = 0x2 F_WRLCK = 0x1 GENL_ADMIN_PERM = 0x1 GENL_CMD_CAP_DO = 0x2 GENL_CMD_CAP_DUMP = 0x4 GENL_CMD_CAP_HASPOL = 0x8 GENL_HDRLEN = 0x4 GENL_ID_CTRL = 0x10 GENL_ID_PMCRAID = 0x12 GENL_ID_VFS_DQUOT = 0x11 GENL_MAX_ID = 0x3ff GENL_MIN_ID = 0x10 GENL_NAMSIZ = 0x10 GENL_START_ALLOC = 0x13 GENL_UNS_ADMIN_PERM = 0x10 GRND_NONBLOCK = 0x1 GRND_RANDOM = 0x2 HUPCL = 0x400 IBSHIFT = 0x10 ICANON = 0x2 ICMPV6_FILTER = 0x1 ICRNL = 0x100 IEXTEN = 0x8000 IFA_F_DADFAILED = 0x8 IFA_F_DEPRECATED = 0x20 IFA_F_HOMEADDRESS = 0x10 IFA_F_MANAGETEMPADDR = 0x100 IFA_F_MCAUTOJOIN = 0x400 IFA_F_NODAD = 0x2 IFA_F_NOPREFIXROUTE = 0x200 IFA_F_OPTIMISTIC = 0x4 IFA_F_PERMANENT = 0x80 IFA_F_SECONDARY = 0x1 IFA_F_STABLE_PRIVACY = 0x800 IFA_F_TEMPORARY = 0x1 IFA_F_TENTATIVE = 0x40 IFA_MAX = 0x8 IFF_ALLMULTI = 0x200 IFF_ATTACH_QUEUE = 0x200 IFF_AUTOMEDIA = 0x4000 IFF_BROADCAST = 0x2 IFF_DEBUG = 0x4 IFF_DETACH_QUEUE = 0x400 IFF_DORMANT = 0x20000 IFF_DYNAMIC = 0x8000 IFF_ECHO = 0x40000 IFF_LOOPBACK = 0x8 IFF_LOWER_UP = 0x10000 IFF_MASTER = 0x400 IFF_MULTICAST = 0x1000 IFF_MULTI_QUEUE = 0x100 IFF_NOARP = 0x80 IFF_NOFILTER = 0x1000 IFF_NOTRAILERS = 0x20 IFF_NO_PI = 0x1000 IFF_ONE_QUEUE = 0x2000 IFF_PERSIST = 0x800 IFF_POINTOPOINT = 0x10 IFF_PORTSEL = 0x2000 IFF_PROMISC = 0x100 IFF_RUNNING = 0x40 IFF_SLAVE = 0x800 IFF_TAP = 0x2 IFF_TUN = 0x1 IFF_TUN_EXCL = 0x8000 IFF_UP = 0x1 IFF_VNET_HDR = 0x4000 IFF_VOLATILE = 0x70c5a IFNAMSIZ = 0x10 IGNBRK = 0x1 IGNCR = 0x80 IGNPAR = 0x4 IMAXBEL = 0x2000 INLCR = 0x40 INPCK = 0x10 IN_ACCESS = 0x1 IN_ALL_EVENTS = 0xfff IN_ATTRIB = 0x4 IN_CLASSA_HOST = 0xffffff IN_CLASSA_MAX = 0x80 IN_CLASSA_NET = 0xff000000 IN_CLASSA_NSHIFT = 0x18 IN_CLASSB_HOST = 0xffff IN_CLASSB_MAX = 0x10000 IN_CLASSB_NET = 0xffff0000 IN_CLASSB_NSHIFT = 0x10 IN_CLASSC_HOST = 0xff IN_CLASSC_NET = 0xffffff00 IN_CLASSC_NSHIFT = 0x8 IN_CLOEXEC = 0x80000 IN_CLOSE = 0x18 IN_CLOSE_NOWRITE = 0x10 IN_CLOSE_WRITE = 0x8 IN_CREATE = 0x100 IN_DELETE = 0x200 IN_DELETE_SELF = 0x400 IN_DONT_FOLLOW = 0x2000000 IN_EXCL_UNLINK = 0x4000000 IN_IGNORED = 0x8000 IN_ISDIR = 0x40000000 IN_LOOPBACKNET = 0x7f IN_MASK_ADD = 0x20000000 IN_MODIFY = 0x2 IN_MOVE = 0xc0 IN_MOVED_FROM = 0x40 IN_MOVED_TO = 0x80 IN_MOVE_SELF = 0x800 IN_NONBLOCK = 0x800 IN_ONESHOT = 0x80000000 IN_ONLYDIR = 0x1000000 IN_OPEN = 0x20 IN_Q_OVERFLOW = 0x4000 IN_UNMOUNT = 0x2000 IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 IPPROTO_AH = 0x33 IPPROTO_BEETPH = 0x5e IPPROTO_COMP = 0x6c IPPROTO_DCCP = 0x21 IPPROTO_DSTOPTS = 0x3c IPPROTO_EGP = 0x8 IPPROTO_ENCAP = 0x62 IPPROTO_ESP = 0x32 IPPROTO_FRAGMENT = 0x2c IPPROTO_GRE = 0x2f IPPROTO_HOPOPTS = 0x0 IPPROTO_ICMP = 0x1 IPPROTO_ICMPV6 = 0x3a IPPROTO_IDP = 0x16 IPPROTO_IGMP = 0x2 IPPROTO_IP = 0x0 IPPROTO_IPIP = 0x4 IPPROTO_IPV6 = 0x29 IPPROTO_MH = 0x87 IPPROTO_MPLS = 0x89 IPPROTO_MTP = 0x5c IPPROTO_NONE = 0x3b IPPROTO_PIM = 0x67 IPPROTO_PUP = 0xc IPPROTO_RAW = 0xff IPPROTO_ROUTING = 0x2b IPPROTO_RSVP = 0x2e IPPROTO_SCTP = 0x84 IPPROTO_TCP = 0x6 IPPROTO_TP = 0x1d IPPROTO_UDP = 0x11 IPPROTO_UDPLITE = 0x88 IPV6_2292DSTOPTS = 0x4 IPV6_2292HOPLIMIT = 0x8 IPV6_2292HOPOPTS = 0x3 IPV6_2292PKTINFO = 0x2 IPV6_2292PKTOPTIONS = 0x6 IPV6_2292RTHDR = 0x5 IPV6_ADDRFORM = 0x1 IPV6_ADDR_PREFERENCES = 0x48 IPV6_ADD_MEMBERSHIP = 0x14 IPV6_AUTHHDR = 0xa IPV6_AUTOFLOWLABEL = 0x46 IPV6_CHECKSUM = 0x7 IPV6_DONTFRAG = 0x3e IPV6_DROP_MEMBERSHIP = 0x15 IPV6_DSTOPTS = 0x3b IPV6_HDRINCL = 0x24 IPV6_HOPLIMIT = 0x34 IPV6_HOPOPTS = 0x36 IPV6_IPSEC_POLICY = 0x22 IPV6_JOIN_ANYCAST = 0x1b IPV6_JOIN_GROUP = 0x14 IPV6_LEAVE_ANYCAST = 0x1c IPV6_LEAVE_GROUP = 0x15 IPV6_MINHOPCOUNT = 0x49 IPV6_MTU = 0x18 IPV6_MTU_DISCOVER = 0x17 IPV6_MULTICAST_HOPS = 0x12 IPV6_MULTICAST_IF = 0x11 IPV6_MULTICAST_LOOP = 0x13 IPV6_NEXTHOP = 0x9 IPV6_ORIGDSTADDR = 0x4a IPV6_PATHMTU = 0x3d IPV6_PKTINFO = 0x32 IPV6_PMTUDISC_DO = 0x2 IPV6_PMTUDISC_DONT = 0x0 IPV6_PMTUDISC_INTERFACE = 0x4 IPV6_PMTUDISC_OMIT = 0x5 IPV6_PMTUDISC_PROBE = 0x3 IPV6_PMTUDISC_WANT = 0x1 IPV6_RECVDSTOPTS = 0x3a IPV6_RECVERR = 0x19 IPV6_RECVFRAGSIZE = 0x4d IPV6_RECVHOPLIMIT = 0x33 IPV6_RECVHOPOPTS = 0x35 IPV6_RECVORIGDSTADDR = 0x4a IPV6_RECVPATHMTU = 0x3c IPV6_RECVPKTINFO = 0x31 IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 IPV6_RTHDR_STRICT = 0x1 IPV6_RTHDR_TYPE_0 = 0x0 IPV6_RXDSTOPTS = 0x3b IPV6_RXHOPOPTS = 0x36 IPV6_TCLASS = 0x43 IPV6_TRANSPARENT = 0x4b IPV6_UNICAST_HOPS = 0x10 IPV6_UNICAST_IF = 0x4c IPV6_V6ONLY = 0x1a IPV6_XFRM_POLICY = 0x23 IP_ADD_MEMBERSHIP = 0x23 IP_ADD_SOURCE_MEMBERSHIP = 0x27 IP_BIND_ADDRESS_NO_PORT = 0x18 IP_BLOCK_SOURCE = 0x26 IP_CHECKSUM = 0x17 IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 IP_DROP_MEMBERSHIP = 0x24 IP_DROP_SOURCE_MEMBERSHIP = 0x28 IP_FREEBIND = 0xf IP_HDRINCL = 0x3 IP_IPSEC_POLICY = 0x10 IP_MAXPACKET = 0xffff IP_MAX_MEMBERSHIPS = 0x14 IP_MF = 0x2000 IP_MINTTL = 0x15 IP_MSFILTER = 0x29 IP_MSS = 0x240 IP_MTU = 0xe IP_MTU_DISCOVER = 0xa IP_MULTICAST_ALL = 0x31 IP_MULTICAST_IF = 0x20 IP_MULTICAST_LOOP = 0x22 IP_MULTICAST_TTL = 0x21 IP_NODEFRAG = 0x16 IP_OFFMASK = 0x1fff IP_OPTIONS = 0x4 IP_ORIGDSTADDR = 0x14 IP_PASSSEC = 0x12 IP_PKTINFO = 0x8 IP_PKTOPTIONS = 0x9 IP_PMTUDISC = 0xa IP_PMTUDISC_DO = 0x2 IP_PMTUDISC_DONT = 0x0 IP_PMTUDISC_INTERFACE = 0x4 IP_PMTUDISC_OMIT = 0x5 IP_PMTUDISC_PROBE = 0x3 IP_PMTUDISC_WANT = 0x1 IP_RECVERR = 0xb IP_RECVFRAGSIZE = 0x19 IP_RECVOPTS = 0x6 IP_RECVORIGDSTADDR = 0x14 IP_RECVRETOPTS = 0x7 IP_RECVTOS = 0xd IP_RECVTTL = 0xc IP_RETOPTS = 0x7 IP_RF = 0x8000 IP_ROUTER_ALERT = 0x5 IP_TOS = 0x1 IP_TRANSPARENT = 0x13 IP_TTL = 0x2 IP_UNBLOCK_SOURCE = 0x25 IP_UNICAST_IF = 0x32 IP_XFRM_POLICY = 0x11 ISIG = 0x1 ISTRIP = 0x20 IUCLC = 0x200 IUTF8 = 0x4000 IXANY = 0x800 IXOFF = 0x1000 IXON = 0x400 KEYCTL_ASSUME_AUTHORITY = 0x10 KEYCTL_CHOWN = 0x4 KEYCTL_CLEAR = 0x7 KEYCTL_DESCRIBE = 0x6 KEYCTL_DH_COMPUTE = 0x17 KEYCTL_GET_KEYRING_ID = 0x0 KEYCTL_GET_PERSISTENT = 0x16 KEYCTL_GET_SECURITY = 0x11 KEYCTL_INSTANTIATE = 0xc KEYCTL_INSTANTIATE_IOV = 0x14 KEYCTL_INVALIDATE = 0x15 KEYCTL_JOIN_SESSION_KEYRING = 0x1 KEYCTL_LINK = 0x8 KEYCTL_NEGATE = 0xd KEYCTL_READ = 0xb KEYCTL_REJECT = 0x13 KEYCTL_RESTRICT_KEYRING = 0x1d KEYCTL_REVOKE = 0x3 KEYCTL_SEARCH = 0xa KEYCTL_SESSION_TO_PARENT = 0x12 KEYCTL_SETPERM = 0x5 KEYCTL_SET_REQKEY_KEYRING = 0xe KEYCTL_SET_TIMEOUT = 0xf KEYCTL_UNLINK = 0x9 KEYCTL_UPDATE = 0x2 KEY_REQKEY_DEFL_DEFAULT = 0x0 KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 KEY_REQKEY_DEFL_NO_CHANGE = -0x1 KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 KEY_REQKEY_DEFL_USER_KEYRING = 0x4 KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 KEY_SPEC_GROUP_KEYRING = -0x6 KEY_SPEC_PROCESS_KEYRING = -0x2 KEY_SPEC_REQKEY_AUTH_KEY = -0x7 KEY_SPEC_REQUESTOR_KEYRING = -0x8 KEY_SPEC_SESSION_KEYRING = -0x3 KEY_SPEC_THREAD_KEYRING = -0x1 KEY_SPEC_USER_KEYRING = -0x4 KEY_SPEC_USER_SESSION_KEYRING = -0x5 LINUX_REBOOT_CMD_CAD_OFF = 0x0 LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef LINUX_REBOOT_CMD_HALT = 0xcdef0123 LINUX_REBOOT_CMD_KEXEC = 0x45584543 LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc LINUX_REBOOT_CMD_RESTART = 0x1234567 LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 LINUX_REBOOT_MAGIC1 = 0xfee1dead LINUX_REBOOT_MAGIC2 = 0x28121969 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 MADV_DONTFORK = 0xa MADV_DONTNEED = 0x4 MADV_FREE = 0x8 MADV_HUGEPAGE = 0xe MADV_HWPOISON = 0x64 MADV_MERGEABLE = 0xc MADV_NOHUGEPAGE = 0xf MADV_NORMAL = 0x0 MADV_RANDOM = 0x1 MADV_REMOVE = 0x9 MADV_SEQUENTIAL = 0x2 MADV_UNMERGEABLE = 0xd MADV_WILLNEED = 0x3 MAP_32BIT = 0x40 MAP_ANON = 0x20 MAP_ANONYMOUS = 0x20 MAP_DENYWRITE = 0x800 MAP_EXECUTABLE = 0x1000 MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_GROWSDOWN = 0x100 MAP_HUGETLB = 0x40000 MAP_HUGE_MASK = 0x3f MAP_HUGE_SHIFT = 0x1a MAP_LOCKED = 0x2000 MAP_NONBLOCK = 0x10000 MAP_NORESERVE = 0x4000 MAP_POPULATE = 0x8000 MAP_PRIVATE = 0x2 MAP_SHARED = 0x1 MAP_STACK = 0x20000 MAP_TYPE = 0xf MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MCL_ONFAULT = 0x4 MNT_DETACH = 0x2 MNT_EXPIRE = 0x4 MNT_FORCE = 0x1 MSG_BATCH = 0x40000 MSG_CMSG_CLOEXEC = 0x40000000 MSG_CONFIRM = 0x800 MSG_CTRUNC = 0x8 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x40 MSG_EOR = 0x80 MSG_ERRQUEUE = 0x2000 MSG_FASTOPEN = 0x20000000 MSG_FIN = 0x200 MSG_MORE = 0x8000 MSG_NOSIGNAL = 0x4000 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_PROXY = 0x10 MSG_RST = 0x1000 MSG_SYN = 0x400 MSG_TRUNC = 0x20 MSG_TRYHARD = 0x4 MSG_WAITALL = 0x100 MSG_WAITFORONE = 0x10000 MS_ACTIVE = 0x40000000 MS_ASYNC = 0x1 MS_BIND = 0x1000 MS_BORN = 0x20000000 MS_DIRSYNC = 0x80 MS_INVALIDATE = 0x2 MS_I_VERSION = 0x800000 MS_KERNMOUNT = 0x400000 MS_LAZYTIME = 0x2000000 MS_MANDLOCK = 0x40 MS_MGC_MSK = 0xffff0000 MS_MGC_VAL = 0xc0ed0000 MS_MOVE = 0x2000 MS_NOATIME = 0x400 MS_NODEV = 0x4 MS_NODIRATIME = 0x800 MS_NOEXEC = 0x8 MS_NOREMOTELOCK = 0x8000000 MS_NOSEC = 0x10000000 MS_NOSUID = 0x2 MS_NOUSER = -0x80000000 MS_POSIXACL = 0x10000 MS_PRIVATE = 0x40000 MS_RDONLY = 0x1 MS_REC = 0x4000 MS_RELATIME = 0x200000 MS_REMOUNT = 0x20 MS_RMT_MASK = 0x2800051 MS_SHARED = 0x100000 MS_SILENT = 0x8000 MS_SLAVE = 0x80000 MS_STRICTATIME = 0x1000000 MS_SUBMOUNT = 0x4000000 MS_SYNC = 0x4 MS_SYNCHRONOUS = 0x10 MS_UNBINDABLE = 0x20000 MS_VERBOSE = 0x8000 NAME_MAX = 0xff NETLINK_ADD_MEMBERSHIP = 0x1 NETLINK_AUDIT = 0x9 NETLINK_BROADCAST_ERROR = 0x4 NETLINK_CAP_ACK = 0xa NETLINK_CONNECTOR = 0xb NETLINK_CRYPTO = 0x15 NETLINK_DNRTMSG = 0xe NETLINK_DROP_MEMBERSHIP = 0x2 NETLINK_ECRYPTFS = 0x13 NETLINK_EXT_ACK = 0xb NETLINK_FIB_LOOKUP = 0xa NETLINK_FIREWALL = 0x3 NETLINK_GENERIC = 0x10 NETLINK_INET_DIAG = 0x4 NETLINK_IP6_FW = 0xd NETLINK_ISCSI = 0x8 NETLINK_KOBJECT_UEVENT = 0xf NETLINK_LISTEN_ALL_NSID = 0x8 NETLINK_LIST_MEMBERSHIPS = 0x9 NETLINK_NETFILTER = 0xc NETLINK_NFLOG = 0x5 NETLINK_NO_ENOBUFS = 0x5 NETLINK_PKTINFO = 0x3 NETLINK_RDMA = 0x14 NETLINK_ROUTE = 0x0 NETLINK_RX_RING = 0x6 NETLINK_SCSITRANSPORT = 0x12 NETLINK_SELINUX = 0x7 NETLINK_SMC = 0x16 NETLINK_SOCK_DIAG = 0x4 NETLINK_TX_RING = 0x7 NETLINK_UNUSED = 0x1 NETLINK_USERSOCK = 0x2 NETLINK_XFRM = 0x6 NL0 = 0x0 NL1 = 0x100 NLA_ALIGNTO = 0x4 NLA_F_NESTED = 0x8000 NLA_F_NET_BYTEORDER = 0x4000 NLA_HDRLEN = 0x4 NLDLY = 0x100 NLMSG_ALIGNTO = 0x4 NLMSG_DONE = 0x3 NLMSG_ERROR = 0x2 NLMSG_HDRLEN = 0x10 NLMSG_MIN_TYPE = 0x10 NLMSG_NOOP = 0x1 NLMSG_OVERRUN = 0x4 NLM_F_ACK = 0x4 NLM_F_ACK_TLVS = 0x200 NLM_F_APPEND = 0x800 NLM_F_ATOMIC = 0x400 NLM_F_CAPPED = 0x100 NLM_F_CREATE = 0x400 NLM_F_DUMP = 0x300 NLM_F_DUMP_FILTERED = 0x20 NLM_F_DUMP_INTR = 0x10 NLM_F_ECHO = 0x8 NLM_F_EXCL = 0x200 NLM_F_MATCH = 0x200 NLM_F_MULTI = 0x2 NLM_F_REPLACE = 0x100 NLM_F_REQUEST = 0x1 NLM_F_ROOT = 0x100 NOFLSH = 0x80 OCRNL = 0x8 OFDEL = 0x80 OFILL = 0x40 OLCUC = 0x2 ONLCR = 0x4 ONLRET = 0x20 ONOCR = 0x10 OPOST = 0x1 O_ACCMODE = 0x3 O_APPEND = 0x400 O_ASYNC = 0x2000 O_CLOEXEC = 0x80000 O_CREAT = 0x40 O_DIRECT = 0x4000 O_DIRECTORY = 0x10000 O_DSYNC = 0x1000 O_EXCL = 0x80 O_FSYNC = 0x101000 O_LARGEFILE = 0x8000 O_NDELAY = 0x800 O_NOATIME = 0x40000 O_NOCTTY = 0x100 O_NOFOLLOW = 0x20000 O_NONBLOCK = 0x800 O_PATH = 0x200000 O_RDONLY = 0x0 O_RDWR = 0x2 O_RSYNC = 0x101000 O_SYNC = 0x101000 O_TMPFILE = 0x410000 O_TRUNC = 0x200 O_WRONLY = 0x1 PACKET_ADD_MEMBERSHIP = 0x1 PACKET_AUXDATA = 0x8 PACKET_BROADCAST = 0x1 PACKET_COPY_THRESH = 0x7 PACKET_DROP_MEMBERSHIP = 0x2 PACKET_FANOUT = 0x12 PACKET_FANOUT_CBPF = 0x6 PACKET_FANOUT_CPU = 0x2 PACKET_FANOUT_DATA = 0x16 PACKET_FANOUT_EBPF = 0x7 PACKET_FANOUT_FLAG_DEFRAG = 0x8000 PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 PACKET_FANOUT_HASH = 0x0 PACKET_FANOUT_LB = 0x1 PACKET_FANOUT_QM = 0x5 PACKET_FANOUT_RND = 0x4 PACKET_FANOUT_ROLLOVER = 0x3 PACKET_FASTROUTE = 0x6 PACKET_HDRLEN = 0xb PACKET_HOST = 0x0 PACKET_KERNEL = 0x7 PACKET_LOOPBACK = 0x5 PACKET_LOSS = 0xe PACKET_MR_ALLMULTI = 0x2 PACKET_MR_MULTICAST = 0x0 PACKET_MR_PROMISC = 0x1 PACKET_MR_UNICAST = 0x3 PACKET_MULTICAST = 0x2 PACKET_ORIGDEV = 0x9 PACKET_OTHERHOST = 0x3 PACKET_OUTGOING = 0x4 PACKET_QDISC_BYPASS = 0x14 PACKET_RECV_OUTPUT = 0x3 PACKET_RESERVE = 0xc PACKET_ROLLOVER_STATS = 0x15 PACKET_RX_RING = 0x5 PACKET_STATISTICS = 0x6 PACKET_TIMESTAMP = 0x11 PACKET_TX_HAS_OFF = 0x13 PACKET_TX_RING = 0xd PACKET_TX_TIMESTAMP = 0x10 PACKET_USER = 0x6 PACKET_VERSION = 0xa PACKET_VNET_HDR = 0xf PARENB = 0x100 PARITY_CRC16_PR0 = 0x2 PARITY_CRC16_PR0_CCITT = 0x4 PARITY_CRC16_PR1 = 0x3 PARITY_CRC16_PR1_CCITT = 0x5 PARITY_CRC32_PR0_CCITT = 0x6 PARITY_CRC32_PR1_CCITT = 0x7 PARITY_DEFAULT = 0x0 PARITY_NONE = 0x1 PARMRK = 0x8 PARODD = 0x200 PENDIN = 0x4000 PERF_EVENT_IOC_DISABLE = 0x2401 PERF_EVENT_IOC_ENABLE = 0x2400 PERF_EVENT_IOC_ID = 0x80042407 PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 PERF_EVENT_IOC_PERIOD = 0x40082404 PERF_EVENT_IOC_REFRESH = 0x2402 PERF_EVENT_IOC_RESET = 0x2403 PERF_EVENT_IOC_SET_BPF = 0x40042408 PERF_EVENT_IOC_SET_FILTER = 0x40042406 PERF_EVENT_IOC_SET_OUTPUT = 0x2405 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 PROT_EXEC = 0x4 PROT_GROWSDOWN = 0x1000000 PROT_GROWSUP = 0x2000000 PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 PR_CAPBSET_DROP = 0x18 PR_CAPBSET_READ = 0x17 PR_CAP_AMBIENT = 0x2f PR_CAP_AMBIENT_CLEAR_ALL = 0x4 PR_CAP_AMBIENT_IS_SET = 0x1 PR_CAP_AMBIENT_LOWER = 0x3 PR_CAP_AMBIENT_RAISE = 0x2 PR_ENDIAN_BIG = 0x0 PR_ENDIAN_LITTLE = 0x1 PR_ENDIAN_PPC_LITTLE = 0x2 PR_FPEMU_NOPRINT = 0x1 PR_FPEMU_SIGFPE = 0x2 PR_FP_EXC_ASYNC = 0x2 PR_FP_EXC_DISABLED = 0x0 PR_FP_EXC_DIV = 0x10000 PR_FP_EXC_INV = 0x100000 PR_FP_EXC_NONRECOV = 0x1 PR_FP_EXC_OVF = 0x20000 PR_FP_EXC_PRECISE = 0x3 PR_FP_EXC_RES = 0x80000 PR_FP_EXC_SW_ENABLE = 0x80 PR_FP_EXC_UND = 0x40000 PR_FP_MODE_FR = 0x1 PR_FP_MODE_FRE = 0x2 PR_GET_CHILD_SUBREAPER = 0x25 PR_GET_DUMPABLE = 0x3 PR_GET_ENDIAN = 0x13 PR_GET_FPEMU = 0x9 PR_GET_FPEXC = 0xb PR_GET_FP_MODE = 0x2e PR_GET_KEEPCAPS = 0x7 PR_GET_NAME = 0x10 PR_GET_NO_NEW_PRIVS = 0x27 PR_GET_PDEATHSIG = 0x2 PR_GET_SECCOMP = 0x15 PR_GET_SECUREBITS = 0x1b PR_GET_THP_DISABLE = 0x2a PR_GET_TID_ADDRESS = 0x28 PR_GET_TIMERSLACK = 0x1e PR_GET_TIMING = 0xd PR_GET_TSC = 0x19 PR_GET_UNALIGN = 0x5 PR_MCE_KILL = 0x21 PR_MCE_KILL_CLEAR = 0x0 PR_MCE_KILL_DEFAULT = 0x2 PR_MCE_KILL_EARLY = 0x1 PR_MCE_KILL_GET = 0x22 PR_MCE_KILL_LATE = 0x0 PR_MCE_KILL_SET = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b PR_SET_CHILD_SUBREAPER = 0x24 PR_SET_DUMPABLE = 0x4 PR_SET_ENDIAN = 0x14 PR_SET_FPEMU = 0xa PR_SET_FPEXC = 0xc PR_SET_FP_MODE = 0x2d PR_SET_KEEPCAPS = 0x8 PR_SET_MM = 0x23 PR_SET_MM_ARG_END = 0x9 PR_SET_MM_ARG_START = 0x8 PR_SET_MM_AUXV = 0xc PR_SET_MM_BRK = 0x7 PR_SET_MM_END_CODE = 0x2 PR_SET_MM_END_DATA = 0x4 PR_SET_MM_ENV_END = 0xb PR_SET_MM_ENV_START = 0xa PR_SET_MM_EXE_FILE = 0xd PR_SET_MM_MAP = 0xe PR_SET_MM_MAP_SIZE = 0xf PR_SET_MM_START_BRK = 0x6 PR_SET_MM_START_CODE = 0x1 PR_SET_MM_START_DATA = 0x3 PR_SET_MM_START_STACK = 0x5 PR_SET_NAME = 0xf PR_SET_NO_NEW_PRIVS = 0x26 PR_SET_PDEATHSIG = 0x1 PR_SET_PTRACER = 0x59616d61 PR_SET_PTRACER_ANY = 0xffffffff PR_SET_SECCOMP = 0x16 PR_SET_SECUREBITS = 0x1c PR_SET_THP_DISABLE = 0x29 PR_SET_TIMERSLACK = 0x1d PR_SET_TIMING = 0xe PR_SET_TSC = 0x1a PR_SET_UNALIGN = 0x6 PR_TASK_PERF_EVENTS_DISABLE = 0x1f PR_TASK_PERF_EVENTS_ENABLE = 0x20 PR_TIMING_STATISTICAL = 0x0 PR_TIMING_TIMESTAMP = 0x1 PR_TSC_ENABLE = 0x1 PR_TSC_SIGSEGV = 0x2 PR_UNALIGN_NOPRINT = 0x1 PR_UNALIGN_SIGBUS = 0x2 PTRACE_ATTACH = 0x10 PTRACE_CONT = 0x7 PTRACE_DETACH = 0x11 PTRACE_EVENT_CLONE = 0x3 PTRACE_EVENT_EXEC = 0x4 PTRACE_EVENT_EXIT = 0x6 PTRACE_EVENT_FORK = 0x1 PTRACE_EVENT_SECCOMP = 0x7 PTRACE_EVENT_STOP = 0x80 PTRACE_EVENT_VFORK = 0x2 PTRACE_EVENT_VFORK_DONE = 0x5 PTRACE_GETEVENTMSG = 0x4201 PTRACE_GETFPREGS = 0xe PTRACE_GETFPXREGS = 0x12 PTRACE_GETREGS = 0xc PTRACE_GETREGSET = 0x4204 PTRACE_GETSIGINFO = 0x4202 PTRACE_GETSIGMASK = 0x420a PTRACE_GET_THREAD_AREA = 0x19 PTRACE_INTERRUPT = 0x4207 PTRACE_KILL = 0x8 PTRACE_LISTEN = 0x4208 PTRACE_OLDSETOPTIONS = 0x15 PTRACE_O_EXITKILL = 0x100000 PTRACE_O_MASK = 0x3000ff PTRACE_O_SUSPEND_SECCOMP = 0x200000 PTRACE_O_TRACECLONE = 0x8 PTRACE_O_TRACEEXEC = 0x10 PTRACE_O_TRACEEXIT = 0x40 PTRACE_O_TRACEFORK = 0x2 PTRACE_O_TRACESECCOMP = 0x80 PTRACE_O_TRACESYSGOOD = 0x1 PTRACE_O_TRACEVFORK = 0x4 PTRACE_O_TRACEVFORKDONE = 0x20 PTRACE_PEEKDATA = 0x2 PTRACE_PEEKSIGINFO = 0x4209 PTRACE_PEEKSIGINFO_SHARED = 0x1 PTRACE_PEEKTEXT = 0x1 PTRACE_PEEKUSR = 0x3 PTRACE_POKEDATA = 0x5 PTRACE_POKETEXT = 0x4 PTRACE_POKEUSR = 0x6 PTRACE_SECCOMP_GET_FILTER = 0x420c PTRACE_SEIZE = 0x4206 PTRACE_SETFPREGS = 0xf PTRACE_SETFPXREGS = 0x13 PTRACE_SETOPTIONS = 0x4200 PTRACE_SETREGS = 0xd PTRACE_SETREGSET = 0x4205 PTRACE_SETSIGINFO = 0x4203 PTRACE_SETSIGMASK = 0x420b PTRACE_SET_THREAD_AREA = 0x1a PTRACE_SINGLEBLOCK = 0x21 PTRACE_SINGLESTEP = 0x9 PTRACE_SYSCALL = 0x18 PTRACE_SYSEMU = 0x1f PTRACE_SYSEMU_SINGLESTEP = 0x20 PTRACE_TRACEME = 0x0 RLIMIT_AS = 0x9 RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 RLIMIT_LOCKS = 0xa RLIMIT_MEMLOCK = 0x8 RLIMIT_MSGQUEUE = 0xc RLIMIT_NICE = 0xd RLIMIT_NOFILE = 0x7 RLIMIT_NPROC = 0x6 RLIMIT_RSS = 0x5 RLIMIT_RTPRIO = 0xe RLIMIT_RTTIME = 0xf RLIMIT_SIGPENDING = 0xb RLIMIT_STACK = 0x3 RLIM_INFINITY = 0xffffffffffffffff RTAX_ADVMSS = 0x8 RTAX_CC_ALGO = 0x10 RTAX_CWND = 0x7 RTAX_FEATURES = 0xc RTAX_FEATURE_ALLFRAG = 0x8 RTAX_FEATURE_ECN = 0x1 RTAX_FEATURE_MASK = 0xf RTAX_FEATURE_SACK = 0x2 RTAX_FEATURE_TIMESTAMP = 0x4 RTAX_HOPLIMIT = 0xa RTAX_INITCWND = 0xb RTAX_INITRWND = 0xe RTAX_LOCK = 0x1 RTAX_MAX = 0x10 RTAX_MTU = 0x2 RTAX_QUICKACK = 0xf RTAX_REORDERING = 0x9 RTAX_RTO_MIN = 0xd RTAX_RTT = 0x4 RTAX_RTTVAR = 0x5 RTAX_SSTHRESH = 0x6 RTAX_UNSPEC = 0x0 RTAX_WINDOW = 0x3 RTA_ALIGNTO = 0x4 RTA_MAX = 0x1a RTCF_DIRECTSRC = 0x4000000 RTCF_DOREDIRECT = 0x1000000 RTCF_LOG = 0x2000000 RTCF_MASQ = 0x400000 RTCF_NAT = 0x800000 RTCF_VALVE = 0x200000 RTF_ADDRCLASSMASK = 0xf8000000 RTF_ADDRCONF = 0x40000 RTF_ALLONLINK = 0x20000 RTF_BROADCAST = 0x10000000 RTF_CACHE = 0x1000000 RTF_DEFAULT = 0x10000 RTF_DYNAMIC = 0x10 RTF_FLOW = 0x2000000 RTF_GATEWAY = 0x2 RTF_HOST = 0x4 RTF_INTERFACE = 0x40000000 RTF_IRTT = 0x100 RTF_LINKRT = 0x100000 RTF_LOCAL = 0x80000000 RTF_MODIFIED = 0x20 RTF_MSS = 0x40 RTF_MTU = 0x40 RTF_MULTICAST = 0x20000000 RTF_NAT = 0x8000000 RTF_NOFORWARD = 0x1000 RTF_NONEXTHOP = 0x200000 RTF_NOPMTUDISC = 0x4000 RTF_POLICY = 0x4000000 RTF_REINSTATE = 0x8 RTF_REJECT = 0x200 RTF_STATIC = 0x400 RTF_THROW = 0x2000 RTF_UP = 0x1 RTF_WINDOW = 0x80 RTF_XRESOLVE = 0x800 RTM_BASE = 0x10 RTM_DELACTION = 0x31 RTM_DELADDR = 0x15 RTM_DELADDRLABEL = 0x49 RTM_DELLINK = 0x11 RTM_DELMDB = 0x55 RTM_DELNEIGH = 0x1d RTM_DELNETCONF = 0x51 RTM_DELNSID = 0x59 RTM_DELQDISC = 0x25 RTM_DELROUTE = 0x19 RTM_DELRULE = 0x21 RTM_DELTCLASS = 0x29 RTM_DELTFILTER = 0x2d RTM_F_CLONED = 0x200 RTM_F_EQUALIZE = 0x400 RTM_F_FIB_MATCH = 0x2000 RTM_F_LOOKUP_TABLE = 0x1000 RTM_F_NOTIFY = 0x100 RTM_F_PREFIX = 0x800 RTM_GETACTION = 0x32 RTM_GETADDR = 0x16 RTM_GETADDRLABEL = 0x4a RTM_GETANYCAST = 0x3e RTM_GETDCB = 0x4e RTM_GETLINK = 0x12 RTM_GETMDB = 0x56 RTM_GETMULTICAST = 0x3a RTM_GETNEIGH = 0x1e RTM_GETNEIGHTBL = 0x42 RTM_GETNETCONF = 0x52 RTM_GETNSID = 0x5a RTM_GETQDISC = 0x26 RTM_GETROUTE = 0x1a RTM_GETRULE = 0x22 RTM_GETSTATS = 0x5e RTM_GETTCLASS = 0x2a RTM_GETTFILTER = 0x2e RTM_MAX = 0x63 RTM_NEWACTION = 0x30 RTM_NEWADDR = 0x14 RTM_NEWADDRLABEL = 0x48 RTM_NEWCACHEREPORT = 0x60 RTM_NEWLINK = 0x10 RTM_NEWMDB = 0x54 RTM_NEWNDUSEROPT = 0x44 RTM_NEWNEIGH = 0x1c RTM_NEWNEIGHTBL = 0x40 RTM_NEWNETCONF = 0x50 RTM_NEWNSID = 0x58 RTM_NEWPREFIX = 0x34 RTM_NEWQDISC = 0x24 RTM_NEWROUTE = 0x18 RTM_NEWRULE = 0x20 RTM_NEWSTATS = 0x5c RTM_NEWTCLASS = 0x28 RTM_NEWTFILTER = 0x2c RTM_NR_FAMILIES = 0x15 RTM_NR_MSGTYPES = 0x54 RTM_SETDCB = 0x4f RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 RTNH_ALIGNTO = 0x4 RTNH_COMPARE_MASK = 0x19 RTNH_F_DEAD = 0x1 RTNH_F_LINKDOWN = 0x10 RTNH_F_OFFLOAD = 0x8 RTNH_F_ONLINK = 0x4 RTNH_F_PERVASIVE = 0x2 RTNH_F_UNRESOLVED = 0x20 RTN_MAX = 0xb RTPROT_BABEL = 0x2a RTPROT_BIRD = 0xc RTPROT_BOOT = 0x3 RTPROT_DHCP = 0x10 RTPROT_DNROUTED = 0xd RTPROT_GATED = 0x8 RTPROT_KERNEL = 0x2 RTPROT_MROUTED = 0x11 RTPROT_MRT = 0xa RTPROT_NTK = 0xf RTPROT_RA = 0x9 RTPROT_REDIRECT = 0x1 RTPROT_STATIC = 0x4 RTPROT_UNSPEC = 0x0 RTPROT_XORP = 0xe RTPROT_ZEBRA = 0xb RT_CLASS_DEFAULT = 0xfd RT_CLASS_LOCAL = 0xff RT_CLASS_MAIN = 0xfe RT_CLASS_MAX = 0xff RT_CLASS_UNSPEC = 0x0 RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 RUSAGE_THREAD = 0x1 SCM_CREDENTIALS = 0x2 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x1d SCM_TIMESTAMPING = 0x25 SCM_TIMESTAMPING_OPT_STATS = 0x36 SCM_TIMESTAMPING_PKTINFO = 0x3a SCM_TIMESTAMPNS = 0x23 SCM_WIFI_STATUS = 0x29 SECCOMP_MODE_DISABLED = 0x0 SECCOMP_MODE_FILTER = 0x2 SECCOMP_MODE_STRICT = 0x1 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 SIOCADDDLCI = 0x8980 SIOCADDMULTI = 0x8931 SIOCADDRT = 0x890b SIOCATMARK = 0x8905 SIOCBONDCHANGEACTIVE = 0x8995 SIOCBONDENSLAVE = 0x8990 SIOCBONDINFOQUERY = 0x8994 SIOCBONDRELEASE = 0x8991 SIOCBONDSETHWADDR = 0x8992 SIOCBONDSLAVEINFOQUERY = 0x8993 SIOCBRADDBR = 0x89a0 SIOCBRADDIF = 0x89a2 SIOCBRDELBR = 0x89a1 SIOCBRDELIF = 0x89a3 SIOCDARP = 0x8953 SIOCDELDLCI = 0x8981 SIOCDELMULTI = 0x8932 SIOCDELRT = 0x890c SIOCDEVPRIVATE = 0x89f0 SIOCDIFADDR = 0x8936 SIOCDRARP = 0x8960 SIOCETHTOOL = 0x8946 SIOCGARP = 0x8954 SIOCGHWTSTAMP = 0x89b1 SIOCGIFADDR = 0x8915 SIOCGIFBR = 0x8940 SIOCGIFBRDADDR = 0x8919 SIOCGIFCONF = 0x8912 SIOCGIFCOUNT = 0x8938 SIOCGIFDSTADDR = 0x8917 SIOCGIFENCAP = 0x8925 SIOCGIFFLAGS = 0x8913 SIOCGIFHWADDR = 0x8927 SIOCGIFINDEX = 0x8933 SIOCGIFMAP = 0x8970 SIOCGIFMEM = 0x891f SIOCGIFMETRIC = 0x891d SIOCGIFMTU = 0x8921 SIOCGIFNAME = 0x8910 SIOCGIFNETMASK = 0x891b SIOCGIFPFLAGS = 0x8935 SIOCGIFSLAVE = 0x8929 SIOCGIFTXQLEN = 0x8942 SIOCGIFVLAN = 0x8982 SIOCGMIIPHY = 0x8947 SIOCGMIIREG = 0x8948 SIOCGPGRP = 0x8904 SIOCGRARP = 0x8961 SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 SIOCGSTAMPNS = 0x8907 SIOCINQ = 0x541b SIOCOUTQ = 0x5411 SIOCOUTQNSD = 0x894b SIOCPROTOPRIVATE = 0x89e0 SIOCRTMSG = 0x890d SIOCSARP = 0x8955 SIOCSHWTSTAMP = 0x89b0 SIOCSIFADDR = 0x8916 SIOCSIFBR = 0x8941 SIOCSIFBRDADDR = 0x891a SIOCSIFDSTADDR = 0x8918 SIOCSIFENCAP = 0x8926 SIOCSIFFLAGS = 0x8914 SIOCSIFHWADDR = 0x8924 SIOCSIFHWBROADCAST = 0x8937 SIOCSIFLINK = 0x8911 SIOCSIFMAP = 0x8971 SIOCSIFMEM = 0x8920 SIOCSIFMETRIC = 0x891e SIOCSIFMTU = 0x8922 SIOCSIFNAME = 0x8923 SIOCSIFNETMASK = 0x891c SIOCSIFPFLAGS = 0x8934 SIOCSIFSLAVE = 0x8930 SIOCSIFTXQLEN = 0x8943 SIOCSIFVLAN = 0x8983 SIOCSMIIREG = 0x8949 SIOCSPGRP = 0x8902 SIOCSRARP = 0x8962 SIOCWANDEV = 0x894a SOCK_CLOEXEC = 0x80000 SOCK_DCCP = 0x6 SOCK_DGRAM = 0x2 SOCK_IOC_TYPE = 0x89 SOCK_NONBLOCK = 0x800 SOCK_PACKET = 0xa SOCK_RAW = 0x3 SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x1 SOL_AAL = 0x109 SOL_ALG = 0x117 SOL_ATM = 0x108 SOL_CAIF = 0x116 SOL_CAN_BASE = 0x64 SOL_DCCP = 0x10d SOL_DECNET = 0x105 SOL_ICMPV6 = 0x3a SOL_IP = 0x0 SOL_IPV6 = 0x29 SOL_IRDA = 0x10a SOL_IUCV = 0x115 SOL_KCM = 0x119 SOL_LLC = 0x10c SOL_NETBEUI = 0x10b SOL_NETLINK = 0x10e SOL_NFC = 0x118 SOL_PACKET = 0x107 SOL_PNPIPE = 0x113 SOL_PPPOL2TP = 0x111 SOL_RAW = 0xff SOL_RDS = 0x114 SOL_RXRPC = 0x110 SOL_SOCKET = 0x1 SOL_TCP = 0x6 SOL_TIPC = 0x10f SOL_X25 = 0x106 SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x1e SO_ATTACH_BPF = 0x32 SO_ATTACH_FILTER = 0x1a SO_ATTACH_REUSEPORT_CBPF = 0x33 SO_ATTACH_REUSEPORT_EBPF = 0x34 SO_BINDTODEVICE = 0x19 SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe SO_BUSY_POLL = 0x2e SO_CNX_ADVICE = 0x35 SO_COOKIE = 0x39 SO_DEBUG = 0x1 SO_DETACH_BPF = 0x1b SO_DETACH_FILTER = 0x1b SO_DOMAIN = 0x27 SO_DONTROUTE = 0x5 SO_ERROR = 0x4 SO_GET_FILTER = 0x1a SO_INCOMING_CPU = 0x31 SO_INCOMING_NAPI_ID = 0x38 SO_KEEPALIVE = 0x9 SO_LINGER = 0xd SO_LOCK_FILTER = 0x2c SO_MARK = 0x24 SO_MAX_PACING_RATE = 0x2f SO_MEMINFO = 0x37 SO_NOFCS = 0x2b SO_NO_CHECK = 0xb SO_OOBINLINE = 0xa SO_PASSCRED = 0x10 SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x11 SO_PEERGROUPS = 0x3b SO_PEERNAME = 0x1c SO_PEERSEC = 0x1f SO_PRIORITY = 0xc SO_PROTOCOL = 0x26 SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x12 SO_RCVTIMEO = 0x14 SO_REUSEADDR = 0x2 SO_REUSEPORT = 0xf SO_RXQ_OVFL = 0x28 SO_SECURITY_AUTHENTICATION = 0x16 SO_SECURITY_ENCRYPTION_NETWORK = 0x18 SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 SO_SELECT_ERR_QUEUE = 0x2d SO_SNDBUF = 0x7 SO_SNDBUFFORCE = 0x20 SO_SNDLOWAT = 0x13 SO_SNDTIMEO = 0x15 SO_TIMESTAMP = 0x1d SO_TIMESTAMPING = 0x25 SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x3 SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 SO_VM_SOCKETS_BUFFER_SIZE = 0x0 SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 SO_VM_SOCKETS_TRUSTED = 0x5 SO_WIFI_STATUS = 0x29 SPLICE_F_GIFT = 0x8 SPLICE_F_MORE = 0x4 SPLICE_F_MOVE = 0x1 SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000 S_IFCHR = 0x2000 S_IFDIR = 0x4000 S_IFIFO = 0x1000 S_IFLNK = 0xa000 S_IFMT = 0xf000 S_IFREG = 0x8000 S_IFSOCK = 0xc000 S_IREAD = 0x100 S_IRGRP = 0x20 S_IROTH = 0x4 S_IRUSR = 0x100 S_IRWXG = 0x38 S_IRWXO = 0x7 S_IRWXU = 0x1c0 S_ISGID = 0x400 S_ISUID = 0x800 S_ISVTX = 0x200 S_IWGRP = 0x10 S_IWOTH = 0x2 S_IWRITE = 0x80 S_IWUSR = 0x80 S_IXGRP = 0x8 S_IXOTH = 0x1 S_IXUSR = 0x40 TAB0 = 0x0 TAB1 = 0x800 TAB2 = 0x1000 TAB3 = 0x1800 TABDLY = 0x1800 TASKSTATS_CMD_ATTR_MAX = 0x4 TASKSTATS_CMD_MAX = 0x2 TASKSTATS_GENL_NAME = "TASKSTATS" TASKSTATS_GENL_VERSION = 0x1 TASKSTATS_TYPE_MAX = 0x6 TASKSTATS_VERSION = 0x8 TCFLSH = 0x540b TCGETA = 0x5405 TCGETS = 0x5401 TCGETS2 = 0x802c542a TCGETX = 0x5432 TCIFLUSH = 0x0 TCIOFF = 0x2 TCIOFLUSH = 0x2 TCION = 0x3 TCOFLUSH = 0x1 TCOOFF = 0x0 TCOON = 0x1 TCP_CC_INFO = 0x1a TCP_CONGESTION = 0xd TCP_COOKIE_IN_ALWAYS = 0x1 TCP_COOKIE_MAX = 0x10 TCP_COOKIE_MIN = 0x8 TCP_COOKIE_OUT_NEVER = 0x2 TCP_COOKIE_PAIR_SIZE = 0x20 TCP_COOKIE_TRANSACTIONS = 0xf TCP_CORK = 0x3 TCP_DEFER_ACCEPT = 0x9 TCP_FASTOPEN = 0x17 TCP_FASTOPEN_CONNECT = 0x1e TCP_INFO = 0xb TCP_KEEPCNT = 0x6 TCP_KEEPIDLE = 0x4 TCP_KEEPINTVL = 0x5 TCP_LINGER2 = 0x8 TCP_MAXSEG = 0x2 TCP_MAXWIN = 0xffff TCP_MAX_WINSHIFT = 0xe TCP_MD5SIG = 0xe TCP_MD5SIG_MAXKEYLEN = 0x50 TCP_MSS = 0x200 TCP_MSS_DEFAULT = 0x218 TCP_MSS_DESIRED = 0x4c4 TCP_NODELAY = 0x1 TCP_NOTSENT_LOWAT = 0x19 TCP_QUEUE_SEQ = 0x15 TCP_QUICKACK = 0xc TCP_REPAIR = 0x13 TCP_REPAIR_OPTIONS = 0x16 TCP_REPAIR_QUEUE = 0x14 TCP_REPAIR_WINDOW = 0x1d TCP_SAVED_SYN = 0x1c TCP_SAVE_SYN = 0x1b TCP_SYNCNT = 0x7 TCP_S_DATA_IN = 0x4 TCP_S_DATA_OUT = 0x8 TCP_THIN_DUPACK = 0x11 TCP_THIN_LINEAR_TIMEOUTS = 0x10 TCP_TIMESTAMP = 0x18 TCP_USER_TIMEOUT = 0x12 TCP_WINDOW_CLAMP = 0xa TCSAFLUSH = 0x2 TCSBRK = 0x5409 TCSBRKP = 0x5425 TCSETA = 0x5406 TCSETAF = 0x5408 TCSETAW = 0x5407 TCSETS = 0x5402 TCSETS2 = 0x402c542b TCSETSF = 0x5404 TCSETSF2 = 0x402c542d TCSETSW = 0x5403 TCSETSW2 = 0x402c542c TCSETX = 0x5433 TCSETXF = 0x5434 TCSETXW = 0x5435 TCXONC = 0x540a TIOCCBRK = 0x5428 TIOCCONS = 0x541d TIOCEXCL = 0x540c TIOCGDEV = 0x80045432 TIOCGETD = 0x5424 TIOCGEXCL = 0x80045440 TIOCGICOUNT = 0x545d TIOCGLCKTRMIOS = 0x5456 TIOCGPGRP = 0x540f TIOCGPKT = 0x80045438 TIOCGPTLCK = 0x80045439 TIOCGPTN = 0x80045430 TIOCGPTPEER = 0x5441 TIOCGRS485 = 0x542e TIOCGSERIAL = 0x541e TIOCGSID = 0x5429 TIOCGSOFTCAR = 0x5419 TIOCGWINSZ = 0x5413 TIOCINQ = 0x541b TIOCLINUX = 0x541c TIOCMBIC = 0x5417 TIOCMBIS = 0x5416 TIOCMGET = 0x5415 TIOCMIWAIT = 0x545c TIOCMSET = 0x5418 TIOCM_CAR = 0x40 TIOCM_CD = 0x40 TIOCM_CTS = 0x20 TIOCM_DSR = 0x100 TIOCM_DTR = 0x2 TIOCM_LE = 0x1 TIOCM_RI = 0x80 TIOCM_RNG = 0x80 TIOCM_RTS = 0x4 TIOCM_SR = 0x10 TIOCM_ST = 0x8 TIOCNOTTY = 0x5422 TIOCNXCL = 0x540d TIOCOUTQ = 0x5411 TIOCPKT = 0x5420 TIOCPKT_DATA = 0x0 TIOCPKT_DOSTOP = 0x20 TIOCPKT_FLUSHREAD = 0x1 TIOCPKT_FLUSHWRITE = 0x2 TIOCPKT_IOCTL = 0x40 TIOCPKT_NOSTOP = 0x10 TIOCPKT_START = 0x8 TIOCPKT_STOP = 0x4 TIOCSBRK = 0x5427 TIOCSCTTY = 0x540e TIOCSERCONFIG = 0x5453 TIOCSERGETLSR = 0x5459 TIOCSERGETMULTI = 0x545a TIOCSERGSTRUCT = 0x5458 TIOCSERGWILD = 0x5454 TIOCSERSETMULTI = 0x545b TIOCSERSWILD = 0x5455 TIOCSER_TEMT = 0x1 TIOCSETD = 0x5423 TIOCSIG = 0x40045436 TIOCSLCKTRMIOS = 0x5457 TIOCSPGRP = 0x5410 TIOCSPTLCK = 0x40045431 TIOCSRS485 = 0x542f TIOCSSERIAL = 0x541f TIOCSSOFTCAR = 0x541a TIOCSTI = 0x5412 TIOCSWINSZ = 0x5414 TIOCVHANGUP = 0x5437 TOSTOP = 0x100 TS_COMM_LEN = 0x20 TUNATTACHFILTER = 0x400854d5 TUNDETACHFILTER = 0x400854d6 TUNGETFEATURES = 0x800454cf TUNGETFILTER = 0x800854db TUNGETIFF = 0x800454d2 TUNGETSNDBUF = 0x800454d3 TUNGETVNETBE = 0x800454df TUNGETVNETHDRSZ = 0x800454d7 TUNGETVNETLE = 0x800454dd TUNSETDEBUG = 0x400454c9 TUNSETGROUP = 0x400454ce TUNSETIFF = 0x400454ca TUNSETIFINDEX = 0x400454da TUNSETLINK = 0x400454cd TUNSETNOCSUM = 0x400454c8 TUNSETOFFLOAD = 0x400454d0 TUNSETOWNER = 0x400454cc TUNSETPERSIST = 0x400454cb TUNSETQUEUE = 0x400454d9 TUNSETSNDBUF = 0x400454d4 TUNSETTXFILTER = 0x400454d1 TUNSETVNETBE = 0x400454de TUNSETVNETHDRSZ = 0x400454d8 TUNSETVNETLE = 0x400454dc UMOUNT_NOFOLLOW = 0x8 UTIME_NOW = 0x3fffffff UTIME_OMIT = 0x3ffffffe VDISCARD = 0xd VEOF = 0x4 VEOL = 0xb VEOL2 = 0x10 VERASE = 0x2 VINTR = 0x0 VKILL = 0x3 VLNEXT = 0xf VMADDR_CID_ANY = 0xffffffff VMADDR_CID_HOST = 0x2 VMADDR_CID_HYPERVISOR = 0x0 VMADDR_CID_RESERVED = 0x1 VMADDR_PORT_ANY = 0xffffffff VMIN = 0x6 VM_SOCKETS_INVALID_VERSION = 0xffffffff VQUIT = 0x1 VREPRINT = 0xc VSTART = 0x8 VSTOP = 0x9 VSUSP = 0xa VSWTC = 0x7 VT0 = 0x0 VT1 = 0x4000 VTDLY = 0x4000 VTIME = 0x5 VWERASE = 0xe WALL = 0x40000000 WCLONE = 0x80000000 WCONTINUED = 0x8 WDIOC_GETBOOTSTATUS = 0x80045702 WDIOC_GETPRETIMEOUT = 0x80045709 WDIOC_GETSTATUS = 0x80045701 WDIOC_GETSUPPORT = 0x80285700 WDIOC_GETTEMP = 0x80045703 WDIOC_GETTIMELEFT = 0x8004570a WDIOC_GETTIMEOUT = 0x80045707 WDIOC_KEEPALIVE = 0x80045705 WDIOC_SETOPTIONS = 0x80045704 WDIOC_SETPRETIMEOUT = 0xc0045708 WDIOC_SETTIMEOUT = 0xc0045706 WEXITED = 0x4 WNOHANG = 0x1 WNOTHREAD = 0x20000000 WNOWAIT = 0x1000000 WORDSIZE = 0x20 WSTOPPED = 0x2 WUNTRACED = 0x2 XATTR_CREATE = 0x1 XATTR_REPLACE = 0x2 XCASE = 0x4 XTABS = 0x1800 ) // Errors const ( E2BIG = syscall.Errno(0x7) EACCES = syscall.Errno(0xd) EADDRINUSE = syscall.Errno(0x62) EADDRNOTAVAIL = syscall.Errno(0x63) EADV = syscall.Errno(0x44) EAFNOSUPPORT = syscall.Errno(0x61) EAGAIN = syscall.Errno(0xb) EALREADY = syscall.Errno(0x72) EBADE = syscall.Errno(0x34) EBADF = syscall.Errno(0x9) EBADFD = syscall.Errno(0x4d) EBADMSG = syscall.Errno(0x4a) EBADR = syscall.Errno(0x35) EBADRQC = syscall.Errno(0x38) EBADSLT = syscall.Errno(0x39) EBFONT = syscall.Errno(0x3b) EBUSY = syscall.Errno(0x10) ECANCELED = syscall.Errno(0x7d) ECHILD = syscall.Errno(0xa) ECHRNG = syscall.Errno(0x2c) ECOMM = syscall.Errno(0x46) ECONNABORTED = syscall.Errno(0x67) ECONNREFUSED = syscall.Errno(0x6f) ECONNRESET = syscall.Errno(0x68) EDEADLK = syscall.Errno(0x23) EDEADLOCK = syscall.Errno(0x23) EDESTADDRREQ = syscall.Errno(0x59) EDOM = syscall.Errno(0x21) EDOTDOT = syscall.Errno(0x49) EDQUOT = syscall.Errno(0x7a) EEXIST = syscall.Errno(0x11) EFAULT = syscall.Errno(0xe) EFBIG = syscall.Errno(0x1b) EHOSTDOWN = syscall.Errno(0x70) EHOSTUNREACH = syscall.Errno(0x71) EHWPOISON = syscall.Errno(0x85) EIDRM = syscall.Errno(0x2b) EILSEQ = syscall.Errno(0x54) EINPROGRESS = syscall.Errno(0x73) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x6a) EISDIR = syscall.Errno(0x15) EISNAM = syscall.Errno(0x78) EKEYEXPIRED = syscall.Errno(0x7f) EKEYREJECTED = syscall.Errno(0x81) EKEYREVOKED = syscall.Errno(0x80) EL2HLT = syscall.Errno(0x33) EL2NSYNC = syscall.Errno(0x2d) EL3HLT = syscall.Errno(0x2e) EL3RST = syscall.Errno(0x2f) ELIBACC = syscall.Errno(0x4f) ELIBBAD = syscall.Errno(0x50) ELIBEXEC = syscall.Errno(0x53) ELIBMAX = syscall.Errno(0x52) ELIBSCN = syscall.Errno(0x51) ELNRNG = syscall.Errno(0x30) ELOOP = syscall.Errno(0x28) EMEDIUMTYPE = syscall.Errno(0x7c) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) EMSGSIZE = syscall.Errno(0x5a) EMULTIHOP = syscall.Errno(0x48) ENAMETOOLONG = syscall.Errno(0x24) ENAVAIL = syscall.Errno(0x77) ENETDOWN = syscall.Errno(0x64) ENETRESET = syscall.Errno(0x66) ENETUNREACH = syscall.Errno(0x65) ENFILE = syscall.Errno(0x17) ENOANO = syscall.Errno(0x37) ENOBUFS = syscall.Errno(0x69) ENOCSI = syscall.Errno(0x32) ENODATA = syscall.Errno(0x3d) ENODEV = syscall.Errno(0x13) ENOENT = syscall.Errno(0x2) ENOEXEC = syscall.Errno(0x8) ENOKEY = syscall.Errno(0x7e) ENOLCK = syscall.Errno(0x25) ENOLINK = syscall.Errno(0x43) ENOMEDIUM = syscall.Errno(0x7b) ENOMEM = syscall.Errno(0xc) ENOMSG = syscall.Errno(0x2a) ENONET = syscall.Errno(0x40) ENOPKG = syscall.Errno(0x41) ENOPROTOOPT = syscall.Errno(0x5c) ENOSPC = syscall.Errno(0x1c) ENOSR = syscall.Errno(0x3f) ENOSTR = syscall.Errno(0x3c) ENOSYS = syscall.Errno(0x26) ENOTBLK = syscall.Errno(0xf) ENOTCONN = syscall.Errno(0x6b) ENOTDIR = syscall.Errno(0x14) ENOTEMPTY = syscall.Errno(0x27) ENOTNAM = syscall.Errno(0x76) ENOTRECOVERABLE = syscall.Errno(0x83) ENOTSOCK = syscall.Errno(0x58) ENOTSUP = syscall.Errno(0x5f) ENOTTY = syscall.Errno(0x19) ENOTUNIQ = syscall.Errno(0x4c) ENXIO = syscall.Errno(0x6) EOPNOTSUPP = syscall.Errno(0x5f) EOVERFLOW = syscall.Errno(0x4b) EOWNERDEAD = syscall.Errno(0x82) EPERM = syscall.Errno(0x1) EPFNOSUPPORT = syscall.Errno(0x60) EPIPE = syscall.Errno(0x20) EPROTO = syscall.Errno(0x47) EPROTONOSUPPORT = syscall.Errno(0x5d) EPROTOTYPE = syscall.Errno(0x5b) ERANGE = syscall.Errno(0x22) EREMCHG = syscall.Errno(0x4e) EREMOTE = syscall.Errno(0x42) EREMOTEIO = syscall.Errno(0x79) ERESTART = syscall.Errno(0x55) ERFKILL = syscall.Errno(0x84) EROFS = syscall.Errno(0x1e) ESHUTDOWN = syscall.Errno(0x6c) ESOCKTNOSUPPORT = syscall.Errno(0x5e) ESPIPE = syscall.Errno(0x1d) ESRCH = syscall.Errno(0x3) ESRMNT = syscall.Errno(0x45) ESTALE = syscall.Errno(0x74) ESTRPIPE = syscall.Errno(0x56) ETIME = syscall.Errno(0x3e) ETIMEDOUT = syscall.Errno(0x6e) ETOOMANYREFS = syscall.Errno(0x6d) ETXTBSY = syscall.Errno(0x1a) EUCLEAN = syscall.Errno(0x75) EUNATCH = syscall.Errno(0x31) EUSERS = syscall.Errno(0x57) EWOULDBLOCK = syscall.Errno(0xb) EXDEV = syscall.Errno(0x12) EXFULL = syscall.Errno(0x36) ) // Signals const ( SIGABRT = syscall.Signal(0x6) SIGALRM = syscall.Signal(0xe) SIGBUS = syscall.Signal(0x7) SIGCHLD = syscall.Signal(0x11) SIGCLD = syscall.Signal(0x11) SIGCONT = syscall.Signal(0x12) SIGFPE = syscall.Signal(0x8) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x1d) SIGIOT = syscall.Signal(0x6) SIGKILL = syscall.Signal(0x9) SIGPIPE = syscall.Signal(0xd) SIGPOLL = syscall.Signal(0x1d) SIGPROF = syscall.Signal(0x1b) SIGPWR = syscall.Signal(0x1e) SIGQUIT = syscall.Signal(0x3) SIGSEGV = syscall.Signal(0xb) SIGSTKFLT = syscall.Signal(0x10) SIGSTOP = syscall.Signal(0x13) SIGSYS = syscall.Signal(0x1f) SIGTERM = syscall.Signal(0xf) SIGTRAP = syscall.Signal(0x5) SIGTSTP = syscall.Signal(0x14) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) SIGURG = syscall.Signal(0x17) SIGUSR1 = syscall.Signal(0xa) SIGUSR2 = syscall.Signal(0xc) SIGVTALRM = syscall.Signal(0x1a) SIGWINCH = syscall.Signal(0x1c) SIGXCPU = syscall.Signal(0x18) SIGXFSZ = syscall.Signal(0x19) ) // Error table var errors = [...]string{ 1: "operation not permitted", 2: "no such file or directory", 3: "no such process", 4: "interrupted system call", 5: "input/output error", 6: "no such device or address", 7: "argument list too long", 8: "exec format error", 9: "bad file descriptor", 10: "no child processes", 11: "resource temporarily unavailable", 12: "cannot allocate memory", 13: "permission denied", 14: "bad address", 15: "block device required", 16: "device or resource busy", 17: "file exists", 18: "invalid cross-device link", 19: "no such device", 20: "not a directory", 21: "is a directory", 22: "invalid argument", 23: "too many open files in system", 24: "too many open files", 25: "inappropriate ioctl for device", 26: "text file busy", 27: "file too large", 28: "no space left on device", 29: "illegal seek", 30: "read-only file system", 31: "too many links", 32: "broken pipe", 33: "numerical argument out of domain", 34: "numerical result out of range", 35: "resource deadlock avoided", 36: "file name too long", 37: "no locks available", 38: "function not implemented", 39: "directory not empty", 40: "too many levels of symbolic links", 42: "no message of desired type", 43: "identifier removed", 44: "channel number out of range", 45: "level 2 not synchronized", 46: "level 3 halted", 47: "level 3 reset", 48: "link number out of range", 49: "protocol driver not attached", 50: "no CSI structure available", 51: "level 2 halted", 52: "invalid exchange", 53: "invalid request descriptor", 54: "exchange full", 55: "no anode", 56: "invalid request code", 57: "invalid slot", 59: "bad font file format", 60: "device not a stream", 61: "no data available", 62: "timer expired", 63: "out of streams resources", 64: "machine is not on the network", 65: "package not installed", 66: "object is remote", 67: "link has been severed", 68: "advertise error", 69: "srmount error", 70: "communication error on send", 71: "protocol error", 72: "multihop attempted", 73: "RFS specific error", 74: "bad message", 75: "value too large for defined data type", 76: "name not unique on network", 77: "file descriptor in bad state", 78: "remote address changed", 79: "can not access a needed shared library", 80: "accessing a corrupted shared library", 81: ".lib section in a.out corrupted", 82: "attempting to link in too many shared libraries", 83: "cannot exec a shared library directly", 84: "invalid or incomplete multibyte or wide character", 85: "interrupted system call should be restarted", 86: "streams pipe error", 87: "too many users", 88: "socket operation on non-socket", 89: "destination address required", 90: "message too long", 91: "protocol wrong type for socket", 92: "protocol not available", 93: "protocol not supported", 94: "socket type not supported", 95: "operation not supported", 96: "protocol family not supported", 97: "address family not supported by protocol", 98: "address already in use", 99: "cannot assign requested address", 100: "network is down", 101: "network is unreachable", 102: "network dropped connection on reset", 103: "software caused connection abort", 104: "connection reset by peer", 105: "no buffer space available", 106: "transport endpoint is already connected", 107: "transport endpoint is not connected", 108: "cannot send after transport endpoint shutdown", 109: "too many references: cannot splice", 110: "connection timed out", 111: "connection refused", 112: "host is down", 113: "no route to host", 114: "operation already in progress", 115: "operation now in progress", 116: "stale file handle", 117: "structure needs cleaning", 118: "not a XENIX named type file", 119: "no XENIX semaphores available", 120: "is a named type file", 121: "remote I/O error", 122: "disk quota exceeded", 123: "no medium found", 124: "wrong medium type", 125: "operation canceled", 126: "required key not available", 127: "key has expired", 128: "key has been revoked", 129: "key was rejected by service", 130: "owner died", 131: "state not recoverable", 132: "operation not possible due to RF-kill", 133: "memory page has hardware error", } // Signal table var signals = [...]string{ 1: "hangup", 2: "interrupt", 3: "quit", 4: "illegal instruction", 5: "trace/breakpoint trap", 6: "aborted", 7: "bus error", 8: "floating point exception", 9: "killed", 10: "user defined signal 1", 11: "segmentation fault", 12: "user defined signal 2", 13: "broken pipe", 14: "alarm clock", 15: "terminated", 16: "stack fault", 17: "child exited", 18: "continued", 19: "stopped (signal)", 20: "stopped", 21: "stopped (tty input)", 22: "stopped (tty output)", 23: "urgent I/O condition", 24: "CPU time limit exceeded", 25: "file size limit exceeded", 26: "virtual timer expired", 27: "profiling timer expired", 28: "window changed", 29: "I/O possible", 30: "power failure", 31: "bad system call", } ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go ================================================ // mkerrors.sh -Wall -Werror -static -I/tmp/include -m64 // Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,linux // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- -Wall -Werror -static -I/tmp/include -m64 _const.go package unix import "syscall" const ( AF_ALG = 0x26 AF_APPLETALK = 0x5 AF_ASH = 0x12 AF_ATMPVC = 0x8 AF_ATMSVC = 0x14 AF_AX25 = 0x3 AF_BLUETOOTH = 0x1f AF_BRIDGE = 0x7 AF_CAIF = 0x25 AF_CAN = 0x1d AF_DECnet = 0xc AF_ECONET = 0x13 AF_FILE = 0x1 AF_IB = 0x1b AF_IEEE802154 = 0x24 AF_INET = 0x2 AF_INET6 = 0xa AF_IPX = 0x4 AF_IRDA = 0x17 AF_ISDN = 0x22 AF_IUCV = 0x20 AF_KCM = 0x29 AF_KEY = 0xf AF_LLC = 0x1a AF_LOCAL = 0x1 AF_MAX = 0x2c AF_MPLS = 0x1c AF_NETBEUI = 0xd AF_NETLINK = 0x10 AF_NETROM = 0x6 AF_NFC = 0x27 AF_PACKET = 0x11 AF_PHONET = 0x23 AF_PPPOX = 0x18 AF_QIPCRTR = 0x2a AF_RDS = 0x15 AF_ROSE = 0xb AF_ROUTE = 0x10 AF_RXRPC = 0x21 AF_SECURITY = 0xe AF_SMC = 0x2b AF_SNA = 0x16 AF_TIPC = 0x1e AF_UNIX = 0x1 AF_UNSPEC = 0x0 AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 ALG_OP_DECRYPT = 0x0 ALG_OP_ENCRYPT = 0x1 ALG_SET_AEAD_ASSOCLEN = 0x4 ALG_SET_AEAD_AUTHSIZE = 0x5 ALG_SET_IV = 0x2 ALG_SET_KEY = 0x1 ALG_SET_OP = 0x3 ARPHRD_6LOWPAN = 0x339 ARPHRD_ADAPT = 0x108 ARPHRD_APPLETLK = 0x8 ARPHRD_ARCNET = 0x7 ARPHRD_ASH = 0x30d ARPHRD_ATM = 0x13 ARPHRD_AX25 = 0x3 ARPHRD_BIF = 0x307 ARPHRD_CAIF = 0x336 ARPHRD_CAN = 0x118 ARPHRD_CHAOS = 0x5 ARPHRD_CISCO = 0x201 ARPHRD_CSLIP = 0x101 ARPHRD_CSLIP6 = 0x103 ARPHRD_DDCMP = 0x205 ARPHRD_DLCI = 0xf ARPHRD_ECONET = 0x30e ARPHRD_EETHER = 0x2 ARPHRD_ETHER = 0x1 ARPHRD_EUI64 = 0x1b ARPHRD_FCAL = 0x311 ARPHRD_FCFABRIC = 0x313 ARPHRD_FCPL = 0x312 ARPHRD_FCPP = 0x310 ARPHRD_FDDI = 0x306 ARPHRD_FRAD = 0x302 ARPHRD_HDLC = 0x201 ARPHRD_HIPPI = 0x30c ARPHRD_HWX25 = 0x110 ARPHRD_IEEE1394 = 0x18 ARPHRD_IEEE802 = 0x6 ARPHRD_IEEE80211 = 0x321 ARPHRD_IEEE80211_PRISM = 0x322 ARPHRD_IEEE80211_RADIOTAP = 0x323 ARPHRD_IEEE802154 = 0x324 ARPHRD_IEEE802154_MONITOR = 0x325 ARPHRD_IEEE802_TR = 0x320 ARPHRD_INFINIBAND = 0x20 ARPHRD_IP6GRE = 0x337 ARPHRD_IPDDP = 0x309 ARPHRD_IPGRE = 0x30a ARPHRD_IRDA = 0x30f ARPHRD_LAPB = 0x204 ARPHRD_LOCALTLK = 0x305 ARPHRD_LOOPBACK = 0x304 ARPHRD_METRICOM = 0x17 ARPHRD_NETLINK = 0x338 ARPHRD_NETROM = 0x0 ARPHRD_NONE = 0xfffe ARPHRD_PHONET = 0x334 ARPHRD_PHONET_PIPE = 0x335 ARPHRD_PIMREG = 0x30b ARPHRD_PPP = 0x200 ARPHRD_PRONET = 0x4 ARPHRD_RAWHDLC = 0x206 ARPHRD_ROSE = 0x10e ARPHRD_RSRVD = 0x104 ARPHRD_SIT = 0x308 ARPHRD_SKIP = 0x303 ARPHRD_SLIP = 0x100 ARPHRD_SLIP6 = 0x102 ARPHRD_TUNNEL = 0x300 ARPHRD_TUNNEL6 = 0x301 ARPHRD_VOID = 0xffff ARPHRD_VSOCKMON = 0x33a ARPHRD_X25 = 0x10f B0 = 0x0 B1000000 = 0x1008 B110 = 0x3 B115200 = 0x1002 B1152000 = 0x1009 B1200 = 0x9 B134 = 0x4 B150 = 0x5 B1500000 = 0x100a B1800 = 0xa B19200 = 0xe B200 = 0x6 B2000000 = 0x100b B230400 = 0x1003 B2400 = 0xb B2500000 = 0x100c B300 = 0x7 B3000000 = 0x100d B3500000 = 0x100e B38400 = 0xf B4000000 = 0x100f B460800 = 0x1004 B4800 = 0xc B50 = 0x1 B500000 = 0x1005 B57600 = 0x1001 B576000 = 0x1006 B600 = 0x8 B75 = 0x2 B921600 = 0x1007 B9600 = 0xd BLKBSZGET = 0x80081270 BLKBSZSET = 0x40081271 BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80081272 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d BLKRRPART = 0x125f BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 BOTHER = 0x1000 BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALU = 0x4 BPF_AND = 0x50 BPF_B = 0x10 BPF_DIV = 0x30 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 BPF_JA = 0x0 BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 BPF_JMP = 0x5 BPF_JSET = 0x40 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 BPF_LEN = 0x80 BPF_LL_OFF = -0x200000 BPF_LSH = 0x60 BPF_MAJOR_VERSION = 0x1 BPF_MAXINSNS = 0x1000 BPF_MEM = 0x60 BPF_MEMWORDS = 0x10 BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MOD = 0x90 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_NET_OFF = -0x100000 BPF_OR = 0x40 BPF_RET = 0x6 BPF_RSH = 0x70 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 BPF_TAX = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 BPF_XOR = 0xa0 BRKINT = 0x2 BS0 = 0x0 BS1 = 0x2000 BSDLY = 0x2000 CAN_BCM = 0x2 CAN_EFF_FLAG = 0x80000000 CAN_EFF_ID_BITS = 0x1d CAN_EFF_MASK = 0x1fffffff CAN_ERR_FLAG = 0x20000000 CAN_ERR_MASK = 0x1fffffff CAN_INV_FILTER = 0x20000000 CAN_ISOTP = 0x6 CAN_MAX_DLC = 0x8 CAN_MAX_DLEN = 0x8 CAN_MCNET = 0x5 CAN_MTU = 0x10 CAN_NPROTO = 0x7 CAN_RAW = 0x1 CAN_RAW_FILTER_MAX = 0x200 CAN_RTR_FLAG = 0x40000000 CAN_SFF_ID_BITS = 0xb CAN_SFF_MASK = 0x7ff CAN_TP16 = 0x3 CAN_TP20 = 0x4 CBAUD = 0x100f CBAUDEX = 0x1000 CFLUSH = 0xf CIBAUD = 0x100f0000 CLOCAL = 0x800 CLOCK_BOOTTIME = 0x7 CLOCK_BOOTTIME_ALARM = 0x9 CLOCK_DEFAULT = 0x0 CLOCK_EXT = 0x1 CLOCK_INT = 0x2 CLOCK_MONOTONIC = 0x1 CLOCK_MONOTONIC_COARSE = 0x6 CLOCK_MONOTONIC_RAW = 0x4 CLOCK_PROCESS_CPUTIME_ID = 0x2 CLOCK_REALTIME = 0x0 CLOCK_REALTIME_ALARM = 0x8 CLOCK_REALTIME_COARSE = 0x5 CLOCK_TAI = 0xb CLOCK_THREAD_CPUTIME_ID = 0x3 CLOCK_TXFROMRX = 0x4 CLOCK_TXINT = 0x3 CLONE_CHILD_CLEARTID = 0x200000 CLONE_CHILD_SETTID = 0x1000000 CLONE_DETACHED = 0x400000 CLONE_FILES = 0x400 CLONE_FS = 0x200 CLONE_IO = 0x80000000 CLONE_NEWCGROUP = 0x2000000 CLONE_NEWIPC = 0x8000000 CLONE_NEWNET = 0x40000000 CLONE_NEWNS = 0x20000 CLONE_NEWPID = 0x20000000 CLONE_NEWUSER = 0x10000000 CLONE_NEWUTS = 0x4000000 CLONE_PARENT = 0x8000 CLONE_PARENT_SETTID = 0x100000 CLONE_PTRACE = 0x2000 CLONE_SETTLS = 0x80000 CLONE_SIGHAND = 0x800 CLONE_SYSVSEM = 0x40000 CLONE_THREAD = 0x10000 CLONE_UNTRACED = 0x800000 CLONE_VFORK = 0x4000 CLONE_VM = 0x100 CMSPAR = 0x40000000 CR0 = 0x0 CR1 = 0x200 CR2 = 0x400 CR3 = 0x600 CRDLY = 0x600 CREAD = 0x80 CRTSCTS = 0x80000000 CS5 = 0x0 CS6 = 0x10 CS7 = 0x20 CS8 = 0x30 CSIGNAL = 0xff CSIZE = 0x30 CSTART = 0x11 CSTATUS = 0x0 CSTOP = 0x13 CSTOPB = 0x40 CSUSP = 0x1a DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 DT_FIFO = 0x1 DT_LNK = 0xa DT_REG = 0x8 DT_SOCK = 0xc DT_UNKNOWN = 0x0 DT_WHT = 0xe ECHO = 0x8 ECHOCTL = 0x200 ECHOE = 0x10 ECHOK = 0x20 ECHOKE = 0x800 ECHONL = 0x40 ECHOPRT = 0x400 EFD_CLOEXEC = 0x80000 EFD_NONBLOCK = 0x800 EFD_SEMAPHORE = 0x1 ENCODING_DEFAULT = 0x0 ENCODING_FM_MARK = 0x3 ENCODING_FM_SPACE = 0x4 ENCODING_MANCHESTER = 0x5 ENCODING_NRZ = 0x1 ENCODING_NRZI = 0x2 EPOLLERR = 0x8 EPOLLET = 0x80000000 EPOLLEXCLUSIVE = 0x10000000 EPOLLHUP = 0x10 EPOLLIN = 0x1 EPOLLMSG = 0x400 EPOLLONESHOT = 0x40000000 EPOLLOUT = 0x4 EPOLLPRI = 0x2 EPOLLRDBAND = 0x80 EPOLLRDHUP = 0x2000 EPOLLRDNORM = 0x40 EPOLLWAKEUP = 0x20000000 EPOLLWRBAND = 0x200 EPOLLWRNORM = 0x100 EPOLL_CLOEXEC = 0x80000 EPOLL_CTL_ADD = 0x1 EPOLL_CTL_DEL = 0x2 EPOLL_CTL_MOD = 0x3 ETH_P_1588 = 0x88f7 ETH_P_8021AD = 0x88a8 ETH_P_8021AH = 0x88e7 ETH_P_8021Q = 0x8100 ETH_P_80221 = 0x8917 ETH_P_802_2 = 0x4 ETH_P_802_3 = 0x1 ETH_P_802_3_MIN = 0x600 ETH_P_802_EX1 = 0x88b5 ETH_P_AARP = 0x80f3 ETH_P_AF_IUCV = 0xfbfb ETH_P_ALL = 0x3 ETH_P_AOE = 0x88a2 ETH_P_ARCNET = 0x1a ETH_P_ARP = 0x806 ETH_P_ATALK = 0x809b ETH_P_ATMFATE = 0x8884 ETH_P_ATMMPOA = 0x884c ETH_P_AX25 = 0x2 ETH_P_BATMAN = 0x4305 ETH_P_BPQ = 0x8ff ETH_P_CAIF = 0xf7 ETH_P_CAN = 0xc ETH_P_CANFD = 0xd ETH_P_CONTROL = 0x16 ETH_P_CUST = 0x6006 ETH_P_DDCMP = 0x6 ETH_P_DEC = 0x6000 ETH_P_DIAG = 0x6005 ETH_P_DNA_DL = 0x6001 ETH_P_DNA_RC = 0x6002 ETH_P_DNA_RT = 0x6003 ETH_P_DSA = 0x1b ETH_P_ECONET = 0x18 ETH_P_EDSA = 0xdada ETH_P_FCOE = 0x8906 ETH_P_FIP = 0x8914 ETH_P_HDLC = 0x19 ETH_P_HSR = 0x892f ETH_P_IBOE = 0x8915 ETH_P_IEEE802154 = 0xf6 ETH_P_IEEEPUP = 0xa00 ETH_P_IEEEPUPAT = 0xa01 ETH_P_IP = 0x800 ETH_P_IPV6 = 0x86dd ETH_P_IPX = 0x8137 ETH_P_IRDA = 0x17 ETH_P_LAT = 0x6004 ETH_P_LINK_CTL = 0x886c ETH_P_LOCALTALK = 0x9 ETH_P_LOOP = 0x60 ETH_P_LOOPBACK = 0x9000 ETH_P_MACSEC = 0x88e5 ETH_P_MOBITEX = 0x15 ETH_P_MPLS_MC = 0x8848 ETH_P_MPLS_UC = 0x8847 ETH_P_MVRP = 0x88f5 ETH_P_NCSI = 0x88f8 ETH_P_PAE = 0x888e ETH_P_PAUSE = 0x8808 ETH_P_PHONET = 0xf5 ETH_P_PPPTALK = 0x10 ETH_P_PPP_DISC = 0x8863 ETH_P_PPP_MP = 0x8 ETH_P_PPP_SES = 0x8864 ETH_P_PRP = 0x88fb ETH_P_PUP = 0x200 ETH_P_PUPAT = 0x201 ETH_P_QINQ1 = 0x9100 ETH_P_QINQ2 = 0x9200 ETH_P_QINQ3 = 0x9300 ETH_P_RARP = 0x8035 ETH_P_SCA = 0x6007 ETH_P_SLOW = 0x8809 ETH_P_SNAP = 0x5 ETH_P_TDLS = 0x890d ETH_P_TEB = 0x6558 ETH_P_TIPC = 0x88ca ETH_P_TRAILER = 0x1c ETH_P_TR_802_2 = 0x11 ETH_P_TSN = 0x22f0 ETH_P_WAN_PPP = 0x7 ETH_P_WCCP = 0x883e ETH_P_X25 = 0x805 ETH_P_XDSA = 0xf8 EXTA = 0xe EXTB = 0xf EXTPROC = 0x10000 FALLOC_FL_COLLAPSE_RANGE = 0x8 FALLOC_FL_INSERT_RANGE = 0x20 FALLOC_FL_KEEP_SIZE = 0x1 FALLOC_FL_NO_HIDE_STALE = 0x4 FALLOC_FL_PUNCH_HOLE = 0x2 FALLOC_FL_UNSHARE_RANGE = 0x40 FALLOC_FL_ZERO_RANGE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 FF1 = 0x8000 FFDLY = 0x8000 FLUSHO = 0x1000 FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 FS_ENCRYPTION_MODE_INVALID = 0x0 FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 FS_KEY_DESCRIPTOR_SIZE = 0x8 FS_KEY_DESC_PREFIX = "fscrypt:" FS_KEY_DESC_PREFIX_SIZE = 0x8 FS_MAX_KEY_SIZE = 0x40 FS_POLICY_FLAGS_PAD_16 = 0x2 FS_POLICY_FLAGS_PAD_32 = 0x3 FS_POLICY_FLAGS_PAD_4 = 0x0 FS_POLICY_FLAGS_PAD_8 = 0x1 FS_POLICY_FLAGS_PAD_MASK = 0x3 FS_POLICY_FLAGS_VALID = 0x3 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0x406 F_EXLCK = 0x4 F_GETFD = 0x1 F_GETFL = 0x3 F_GETLEASE = 0x401 F_GETLK = 0x5 F_GETLK64 = 0x5 F_GETOWN = 0x9 F_GETOWN_EX = 0x10 F_GETPIPE_SZ = 0x408 F_GETSIG = 0xb F_LOCK = 0x1 F_NOTIFY = 0x402 F_OFD_GETLK = 0x24 F_OFD_SETLK = 0x25 F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 F_SETFD = 0x2 F_SETFL = 0x4 F_SETLEASE = 0x400 F_SETLK = 0x6 F_SETLK64 = 0x6 F_SETLKW = 0x7 F_SETLKW64 = 0x7 F_SETOWN = 0x8 F_SETOWN_EX = 0xf F_SETPIPE_SZ = 0x407 F_SETSIG = 0xa F_SHLCK = 0x8 F_TEST = 0x3 F_TLOCK = 0x2 F_ULOCK = 0x0 F_UNLCK = 0x2 F_WRLCK = 0x1 GENL_ADMIN_PERM = 0x1 GENL_CMD_CAP_DO = 0x2 GENL_CMD_CAP_DUMP = 0x4 GENL_CMD_CAP_HASPOL = 0x8 GENL_HDRLEN = 0x4 GENL_ID_CTRL = 0x10 GENL_ID_PMCRAID = 0x12 GENL_ID_VFS_DQUOT = 0x11 GENL_MAX_ID = 0x3ff GENL_MIN_ID = 0x10 GENL_NAMSIZ = 0x10 GENL_START_ALLOC = 0x13 GENL_UNS_ADMIN_PERM = 0x10 GRND_NONBLOCK = 0x1 GRND_RANDOM = 0x2 HUPCL = 0x400 IBSHIFT = 0x10 ICANON = 0x2 ICMPV6_FILTER = 0x1 ICRNL = 0x100 IEXTEN = 0x8000 IFA_F_DADFAILED = 0x8 IFA_F_DEPRECATED = 0x20 IFA_F_HOMEADDRESS = 0x10 IFA_F_MANAGETEMPADDR = 0x100 IFA_F_MCAUTOJOIN = 0x400 IFA_F_NODAD = 0x2 IFA_F_NOPREFIXROUTE = 0x200 IFA_F_OPTIMISTIC = 0x4 IFA_F_PERMANENT = 0x80 IFA_F_SECONDARY = 0x1 IFA_F_STABLE_PRIVACY = 0x800 IFA_F_TEMPORARY = 0x1 IFA_F_TENTATIVE = 0x40 IFA_MAX = 0x8 IFF_ALLMULTI = 0x200 IFF_ATTACH_QUEUE = 0x200 IFF_AUTOMEDIA = 0x4000 IFF_BROADCAST = 0x2 IFF_DEBUG = 0x4 IFF_DETACH_QUEUE = 0x400 IFF_DORMANT = 0x20000 IFF_DYNAMIC = 0x8000 IFF_ECHO = 0x40000 IFF_LOOPBACK = 0x8 IFF_LOWER_UP = 0x10000 IFF_MASTER = 0x400 IFF_MULTICAST = 0x1000 IFF_MULTI_QUEUE = 0x100 IFF_NOARP = 0x80 IFF_NOFILTER = 0x1000 IFF_NOTRAILERS = 0x20 IFF_NO_PI = 0x1000 IFF_ONE_QUEUE = 0x2000 IFF_PERSIST = 0x800 IFF_POINTOPOINT = 0x10 IFF_PORTSEL = 0x2000 IFF_PROMISC = 0x100 IFF_RUNNING = 0x40 IFF_SLAVE = 0x800 IFF_TAP = 0x2 IFF_TUN = 0x1 IFF_TUN_EXCL = 0x8000 IFF_UP = 0x1 IFF_VNET_HDR = 0x4000 IFF_VOLATILE = 0x70c5a IFNAMSIZ = 0x10 IGNBRK = 0x1 IGNCR = 0x80 IGNPAR = 0x4 IMAXBEL = 0x2000 INLCR = 0x40 INPCK = 0x10 IN_ACCESS = 0x1 IN_ALL_EVENTS = 0xfff IN_ATTRIB = 0x4 IN_CLASSA_HOST = 0xffffff IN_CLASSA_MAX = 0x80 IN_CLASSA_NET = 0xff000000 IN_CLASSA_NSHIFT = 0x18 IN_CLASSB_HOST = 0xffff IN_CLASSB_MAX = 0x10000 IN_CLASSB_NET = 0xffff0000 IN_CLASSB_NSHIFT = 0x10 IN_CLASSC_HOST = 0xff IN_CLASSC_NET = 0xffffff00 IN_CLASSC_NSHIFT = 0x8 IN_CLOEXEC = 0x80000 IN_CLOSE = 0x18 IN_CLOSE_NOWRITE = 0x10 IN_CLOSE_WRITE = 0x8 IN_CREATE = 0x100 IN_DELETE = 0x200 IN_DELETE_SELF = 0x400 IN_DONT_FOLLOW = 0x2000000 IN_EXCL_UNLINK = 0x4000000 IN_IGNORED = 0x8000 IN_ISDIR = 0x40000000 IN_LOOPBACKNET = 0x7f IN_MASK_ADD = 0x20000000 IN_MODIFY = 0x2 IN_MOVE = 0xc0 IN_MOVED_FROM = 0x40 IN_MOVED_TO = 0x80 IN_MOVE_SELF = 0x800 IN_NONBLOCK = 0x800 IN_ONESHOT = 0x80000000 IN_ONLYDIR = 0x1000000 IN_OPEN = 0x20 IN_Q_OVERFLOW = 0x4000 IN_UNMOUNT = 0x2000 IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 IPPROTO_AH = 0x33 IPPROTO_BEETPH = 0x5e IPPROTO_COMP = 0x6c IPPROTO_DCCP = 0x21 IPPROTO_DSTOPTS = 0x3c IPPROTO_EGP = 0x8 IPPROTO_ENCAP = 0x62 IPPROTO_ESP = 0x32 IPPROTO_FRAGMENT = 0x2c IPPROTO_GRE = 0x2f IPPROTO_HOPOPTS = 0x0 IPPROTO_ICMP = 0x1 IPPROTO_ICMPV6 = 0x3a IPPROTO_IDP = 0x16 IPPROTO_IGMP = 0x2 IPPROTO_IP = 0x0 IPPROTO_IPIP = 0x4 IPPROTO_IPV6 = 0x29 IPPROTO_MH = 0x87 IPPROTO_MPLS = 0x89 IPPROTO_MTP = 0x5c IPPROTO_NONE = 0x3b IPPROTO_PIM = 0x67 IPPROTO_PUP = 0xc IPPROTO_RAW = 0xff IPPROTO_ROUTING = 0x2b IPPROTO_RSVP = 0x2e IPPROTO_SCTP = 0x84 IPPROTO_TCP = 0x6 IPPROTO_TP = 0x1d IPPROTO_UDP = 0x11 IPPROTO_UDPLITE = 0x88 IPV6_2292DSTOPTS = 0x4 IPV6_2292HOPLIMIT = 0x8 IPV6_2292HOPOPTS = 0x3 IPV6_2292PKTINFO = 0x2 IPV6_2292PKTOPTIONS = 0x6 IPV6_2292RTHDR = 0x5 IPV6_ADDRFORM = 0x1 IPV6_ADDR_PREFERENCES = 0x48 IPV6_ADD_MEMBERSHIP = 0x14 IPV6_AUTHHDR = 0xa IPV6_AUTOFLOWLABEL = 0x46 IPV6_CHECKSUM = 0x7 IPV6_DONTFRAG = 0x3e IPV6_DROP_MEMBERSHIP = 0x15 IPV6_DSTOPTS = 0x3b IPV6_HDRINCL = 0x24 IPV6_HOPLIMIT = 0x34 IPV6_HOPOPTS = 0x36 IPV6_IPSEC_POLICY = 0x22 IPV6_JOIN_ANYCAST = 0x1b IPV6_JOIN_GROUP = 0x14 IPV6_LEAVE_ANYCAST = 0x1c IPV6_LEAVE_GROUP = 0x15 IPV6_MINHOPCOUNT = 0x49 IPV6_MTU = 0x18 IPV6_MTU_DISCOVER = 0x17 IPV6_MULTICAST_HOPS = 0x12 IPV6_MULTICAST_IF = 0x11 IPV6_MULTICAST_LOOP = 0x13 IPV6_NEXTHOP = 0x9 IPV6_ORIGDSTADDR = 0x4a IPV6_PATHMTU = 0x3d IPV6_PKTINFO = 0x32 IPV6_PMTUDISC_DO = 0x2 IPV6_PMTUDISC_DONT = 0x0 IPV6_PMTUDISC_INTERFACE = 0x4 IPV6_PMTUDISC_OMIT = 0x5 IPV6_PMTUDISC_PROBE = 0x3 IPV6_PMTUDISC_WANT = 0x1 IPV6_RECVDSTOPTS = 0x3a IPV6_RECVERR = 0x19 IPV6_RECVFRAGSIZE = 0x4d IPV6_RECVHOPLIMIT = 0x33 IPV6_RECVHOPOPTS = 0x35 IPV6_RECVORIGDSTADDR = 0x4a IPV6_RECVPATHMTU = 0x3c IPV6_RECVPKTINFO = 0x31 IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 IPV6_RTHDR_STRICT = 0x1 IPV6_RTHDR_TYPE_0 = 0x0 IPV6_RXDSTOPTS = 0x3b IPV6_RXHOPOPTS = 0x36 IPV6_TCLASS = 0x43 IPV6_TRANSPARENT = 0x4b IPV6_UNICAST_HOPS = 0x10 IPV6_UNICAST_IF = 0x4c IPV6_V6ONLY = 0x1a IPV6_XFRM_POLICY = 0x23 IP_ADD_MEMBERSHIP = 0x23 IP_ADD_SOURCE_MEMBERSHIP = 0x27 IP_BIND_ADDRESS_NO_PORT = 0x18 IP_BLOCK_SOURCE = 0x26 IP_CHECKSUM = 0x17 IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 IP_DROP_MEMBERSHIP = 0x24 IP_DROP_SOURCE_MEMBERSHIP = 0x28 IP_FREEBIND = 0xf IP_HDRINCL = 0x3 IP_IPSEC_POLICY = 0x10 IP_MAXPACKET = 0xffff IP_MAX_MEMBERSHIPS = 0x14 IP_MF = 0x2000 IP_MINTTL = 0x15 IP_MSFILTER = 0x29 IP_MSS = 0x240 IP_MTU = 0xe IP_MTU_DISCOVER = 0xa IP_MULTICAST_ALL = 0x31 IP_MULTICAST_IF = 0x20 IP_MULTICAST_LOOP = 0x22 IP_MULTICAST_TTL = 0x21 IP_NODEFRAG = 0x16 IP_OFFMASK = 0x1fff IP_OPTIONS = 0x4 IP_ORIGDSTADDR = 0x14 IP_PASSSEC = 0x12 IP_PKTINFO = 0x8 IP_PKTOPTIONS = 0x9 IP_PMTUDISC = 0xa IP_PMTUDISC_DO = 0x2 IP_PMTUDISC_DONT = 0x0 IP_PMTUDISC_INTERFACE = 0x4 IP_PMTUDISC_OMIT = 0x5 IP_PMTUDISC_PROBE = 0x3 IP_PMTUDISC_WANT = 0x1 IP_RECVERR = 0xb IP_RECVFRAGSIZE = 0x19 IP_RECVOPTS = 0x6 IP_RECVORIGDSTADDR = 0x14 IP_RECVRETOPTS = 0x7 IP_RECVTOS = 0xd IP_RECVTTL = 0xc IP_RETOPTS = 0x7 IP_RF = 0x8000 IP_ROUTER_ALERT = 0x5 IP_TOS = 0x1 IP_TRANSPARENT = 0x13 IP_TTL = 0x2 IP_UNBLOCK_SOURCE = 0x25 IP_UNICAST_IF = 0x32 IP_XFRM_POLICY = 0x11 ISIG = 0x1 ISTRIP = 0x20 IUCLC = 0x200 IUTF8 = 0x4000 IXANY = 0x800 IXOFF = 0x1000 IXON = 0x400 KEYCTL_ASSUME_AUTHORITY = 0x10 KEYCTL_CHOWN = 0x4 KEYCTL_CLEAR = 0x7 KEYCTL_DESCRIBE = 0x6 KEYCTL_DH_COMPUTE = 0x17 KEYCTL_GET_KEYRING_ID = 0x0 KEYCTL_GET_PERSISTENT = 0x16 KEYCTL_GET_SECURITY = 0x11 KEYCTL_INSTANTIATE = 0xc KEYCTL_INSTANTIATE_IOV = 0x14 KEYCTL_INVALIDATE = 0x15 KEYCTL_JOIN_SESSION_KEYRING = 0x1 KEYCTL_LINK = 0x8 KEYCTL_NEGATE = 0xd KEYCTL_READ = 0xb KEYCTL_REJECT = 0x13 KEYCTL_RESTRICT_KEYRING = 0x1d KEYCTL_REVOKE = 0x3 KEYCTL_SEARCH = 0xa KEYCTL_SESSION_TO_PARENT = 0x12 KEYCTL_SETPERM = 0x5 KEYCTL_SET_REQKEY_KEYRING = 0xe KEYCTL_SET_TIMEOUT = 0xf KEYCTL_UNLINK = 0x9 KEYCTL_UPDATE = 0x2 KEY_REQKEY_DEFL_DEFAULT = 0x0 KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 KEY_REQKEY_DEFL_NO_CHANGE = -0x1 KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 KEY_REQKEY_DEFL_USER_KEYRING = 0x4 KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 KEY_SPEC_GROUP_KEYRING = -0x6 KEY_SPEC_PROCESS_KEYRING = -0x2 KEY_SPEC_REQKEY_AUTH_KEY = -0x7 KEY_SPEC_REQUESTOR_KEYRING = -0x8 KEY_SPEC_SESSION_KEYRING = -0x3 KEY_SPEC_THREAD_KEYRING = -0x1 KEY_SPEC_USER_KEYRING = -0x4 KEY_SPEC_USER_SESSION_KEYRING = -0x5 LINUX_REBOOT_CMD_CAD_OFF = 0x0 LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef LINUX_REBOOT_CMD_HALT = 0xcdef0123 LINUX_REBOOT_CMD_KEXEC = 0x45584543 LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc LINUX_REBOOT_CMD_RESTART = 0x1234567 LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 LINUX_REBOOT_MAGIC1 = 0xfee1dead LINUX_REBOOT_MAGIC2 = 0x28121969 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 MADV_DONTFORK = 0xa MADV_DONTNEED = 0x4 MADV_FREE = 0x8 MADV_HUGEPAGE = 0xe MADV_HWPOISON = 0x64 MADV_MERGEABLE = 0xc MADV_NOHUGEPAGE = 0xf MADV_NORMAL = 0x0 MADV_RANDOM = 0x1 MADV_REMOVE = 0x9 MADV_SEQUENTIAL = 0x2 MADV_UNMERGEABLE = 0xd MADV_WILLNEED = 0x3 MAP_32BIT = 0x40 MAP_ANON = 0x20 MAP_ANONYMOUS = 0x20 MAP_DENYWRITE = 0x800 MAP_EXECUTABLE = 0x1000 MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_GROWSDOWN = 0x100 MAP_HUGETLB = 0x40000 MAP_HUGE_MASK = 0x3f MAP_HUGE_SHIFT = 0x1a MAP_LOCKED = 0x2000 MAP_NONBLOCK = 0x10000 MAP_NORESERVE = 0x4000 MAP_POPULATE = 0x8000 MAP_PRIVATE = 0x2 MAP_SHARED = 0x1 MAP_STACK = 0x20000 MAP_TYPE = 0xf MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MCL_ONFAULT = 0x4 MNT_DETACH = 0x2 MNT_EXPIRE = 0x4 MNT_FORCE = 0x1 MSG_BATCH = 0x40000 MSG_CMSG_CLOEXEC = 0x40000000 MSG_CONFIRM = 0x800 MSG_CTRUNC = 0x8 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x40 MSG_EOR = 0x80 MSG_ERRQUEUE = 0x2000 MSG_FASTOPEN = 0x20000000 MSG_FIN = 0x200 MSG_MORE = 0x8000 MSG_NOSIGNAL = 0x4000 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_PROXY = 0x10 MSG_RST = 0x1000 MSG_SYN = 0x400 MSG_TRUNC = 0x20 MSG_TRYHARD = 0x4 MSG_WAITALL = 0x100 MSG_WAITFORONE = 0x10000 MS_ACTIVE = 0x40000000 MS_ASYNC = 0x1 MS_BIND = 0x1000 MS_BORN = 0x20000000 MS_DIRSYNC = 0x80 MS_INVALIDATE = 0x2 MS_I_VERSION = 0x800000 MS_KERNMOUNT = 0x400000 MS_LAZYTIME = 0x2000000 MS_MANDLOCK = 0x40 MS_MGC_MSK = 0xffff0000 MS_MGC_VAL = 0xc0ed0000 MS_MOVE = 0x2000 MS_NOATIME = 0x400 MS_NODEV = 0x4 MS_NODIRATIME = 0x800 MS_NOEXEC = 0x8 MS_NOREMOTELOCK = 0x8000000 MS_NOSEC = 0x10000000 MS_NOSUID = 0x2 MS_NOUSER = -0x80000000 MS_POSIXACL = 0x10000 MS_PRIVATE = 0x40000 MS_RDONLY = 0x1 MS_REC = 0x4000 MS_RELATIME = 0x200000 MS_REMOUNT = 0x20 MS_RMT_MASK = 0x2800051 MS_SHARED = 0x100000 MS_SILENT = 0x8000 MS_SLAVE = 0x80000 MS_STRICTATIME = 0x1000000 MS_SUBMOUNT = 0x4000000 MS_SYNC = 0x4 MS_SYNCHRONOUS = 0x10 MS_UNBINDABLE = 0x20000 MS_VERBOSE = 0x8000 NAME_MAX = 0xff NETLINK_ADD_MEMBERSHIP = 0x1 NETLINK_AUDIT = 0x9 NETLINK_BROADCAST_ERROR = 0x4 NETLINK_CAP_ACK = 0xa NETLINK_CONNECTOR = 0xb NETLINK_CRYPTO = 0x15 NETLINK_DNRTMSG = 0xe NETLINK_DROP_MEMBERSHIP = 0x2 NETLINK_ECRYPTFS = 0x13 NETLINK_EXT_ACK = 0xb NETLINK_FIB_LOOKUP = 0xa NETLINK_FIREWALL = 0x3 NETLINK_GENERIC = 0x10 NETLINK_INET_DIAG = 0x4 NETLINK_IP6_FW = 0xd NETLINK_ISCSI = 0x8 NETLINK_KOBJECT_UEVENT = 0xf NETLINK_LISTEN_ALL_NSID = 0x8 NETLINK_LIST_MEMBERSHIPS = 0x9 NETLINK_NETFILTER = 0xc NETLINK_NFLOG = 0x5 NETLINK_NO_ENOBUFS = 0x5 NETLINK_PKTINFO = 0x3 NETLINK_RDMA = 0x14 NETLINK_ROUTE = 0x0 NETLINK_RX_RING = 0x6 NETLINK_SCSITRANSPORT = 0x12 NETLINK_SELINUX = 0x7 NETLINK_SMC = 0x16 NETLINK_SOCK_DIAG = 0x4 NETLINK_TX_RING = 0x7 NETLINK_UNUSED = 0x1 NETLINK_USERSOCK = 0x2 NETLINK_XFRM = 0x6 NL0 = 0x0 NL1 = 0x100 NLA_ALIGNTO = 0x4 NLA_F_NESTED = 0x8000 NLA_F_NET_BYTEORDER = 0x4000 NLA_HDRLEN = 0x4 NLDLY = 0x100 NLMSG_ALIGNTO = 0x4 NLMSG_DONE = 0x3 NLMSG_ERROR = 0x2 NLMSG_HDRLEN = 0x10 NLMSG_MIN_TYPE = 0x10 NLMSG_NOOP = 0x1 NLMSG_OVERRUN = 0x4 NLM_F_ACK = 0x4 NLM_F_ACK_TLVS = 0x200 NLM_F_APPEND = 0x800 NLM_F_ATOMIC = 0x400 NLM_F_CAPPED = 0x100 NLM_F_CREATE = 0x400 NLM_F_DUMP = 0x300 NLM_F_DUMP_FILTERED = 0x20 NLM_F_DUMP_INTR = 0x10 NLM_F_ECHO = 0x8 NLM_F_EXCL = 0x200 NLM_F_MATCH = 0x200 NLM_F_MULTI = 0x2 NLM_F_REPLACE = 0x100 NLM_F_REQUEST = 0x1 NLM_F_ROOT = 0x100 NOFLSH = 0x80 OCRNL = 0x8 OFDEL = 0x80 OFILL = 0x40 OLCUC = 0x2 ONLCR = 0x4 ONLRET = 0x20 ONOCR = 0x10 OPOST = 0x1 O_ACCMODE = 0x3 O_APPEND = 0x400 O_ASYNC = 0x2000 O_CLOEXEC = 0x80000 O_CREAT = 0x40 O_DIRECT = 0x4000 O_DIRECTORY = 0x10000 O_DSYNC = 0x1000 O_EXCL = 0x80 O_FSYNC = 0x101000 O_LARGEFILE = 0x0 O_NDELAY = 0x800 O_NOATIME = 0x40000 O_NOCTTY = 0x100 O_NOFOLLOW = 0x20000 O_NONBLOCK = 0x800 O_PATH = 0x200000 O_RDONLY = 0x0 O_RDWR = 0x2 O_RSYNC = 0x101000 O_SYNC = 0x101000 O_TMPFILE = 0x410000 O_TRUNC = 0x200 O_WRONLY = 0x1 PACKET_ADD_MEMBERSHIP = 0x1 PACKET_AUXDATA = 0x8 PACKET_BROADCAST = 0x1 PACKET_COPY_THRESH = 0x7 PACKET_DROP_MEMBERSHIP = 0x2 PACKET_FANOUT = 0x12 PACKET_FANOUT_CBPF = 0x6 PACKET_FANOUT_CPU = 0x2 PACKET_FANOUT_DATA = 0x16 PACKET_FANOUT_EBPF = 0x7 PACKET_FANOUT_FLAG_DEFRAG = 0x8000 PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 PACKET_FANOUT_HASH = 0x0 PACKET_FANOUT_LB = 0x1 PACKET_FANOUT_QM = 0x5 PACKET_FANOUT_RND = 0x4 PACKET_FANOUT_ROLLOVER = 0x3 PACKET_FASTROUTE = 0x6 PACKET_HDRLEN = 0xb PACKET_HOST = 0x0 PACKET_KERNEL = 0x7 PACKET_LOOPBACK = 0x5 PACKET_LOSS = 0xe PACKET_MR_ALLMULTI = 0x2 PACKET_MR_MULTICAST = 0x0 PACKET_MR_PROMISC = 0x1 PACKET_MR_UNICAST = 0x3 PACKET_MULTICAST = 0x2 PACKET_ORIGDEV = 0x9 PACKET_OTHERHOST = 0x3 PACKET_OUTGOING = 0x4 PACKET_QDISC_BYPASS = 0x14 PACKET_RECV_OUTPUT = 0x3 PACKET_RESERVE = 0xc PACKET_ROLLOVER_STATS = 0x15 PACKET_RX_RING = 0x5 PACKET_STATISTICS = 0x6 PACKET_TIMESTAMP = 0x11 PACKET_TX_HAS_OFF = 0x13 PACKET_TX_RING = 0xd PACKET_TX_TIMESTAMP = 0x10 PACKET_USER = 0x6 PACKET_VERSION = 0xa PACKET_VNET_HDR = 0xf PARENB = 0x100 PARITY_CRC16_PR0 = 0x2 PARITY_CRC16_PR0_CCITT = 0x4 PARITY_CRC16_PR1 = 0x3 PARITY_CRC16_PR1_CCITT = 0x5 PARITY_CRC32_PR0_CCITT = 0x6 PARITY_CRC32_PR1_CCITT = 0x7 PARITY_DEFAULT = 0x0 PARITY_NONE = 0x1 PARMRK = 0x8 PARODD = 0x200 PENDIN = 0x4000 PERF_EVENT_IOC_DISABLE = 0x2401 PERF_EVENT_IOC_ENABLE = 0x2400 PERF_EVENT_IOC_ID = 0x80082407 PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 PERF_EVENT_IOC_PERIOD = 0x40082404 PERF_EVENT_IOC_REFRESH = 0x2402 PERF_EVENT_IOC_RESET = 0x2403 PERF_EVENT_IOC_SET_BPF = 0x40042408 PERF_EVENT_IOC_SET_FILTER = 0x40082406 PERF_EVENT_IOC_SET_OUTPUT = 0x2405 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 PROT_EXEC = 0x4 PROT_GROWSDOWN = 0x1000000 PROT_GROWSUP = 0x2000000 PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 PR_CAPBSET_DROP = 0x18 PR_CAPBSET_READ = 0x17 PR_CAP_AMBIENT = 0x2f PR_CAP_AMBIENT_CLEAR_ALL = 0x4 PR_CAP_AMBIENT_IS_SET = 0x1 PR_CAP_AMBIENT_LOWER = 0x3 PR_CAP_AMBIENT_RAISE = 0x2 PR_ENDIAN_BIG = 0x0 PR_ENDIAN_LITTLE = 0x1 PR_ENDIAN_PPC_LITTLE = 0x2 PR_FPEMU_NOPRINT = 0x1 PR_FPEMU_SIGFPE = 0x2 PR_FP_EXC_ASYNC = 0x2 PR_FP_EXC_DISABLED = 0x0 PR_FP_EXC_DIV = 0x10000 PR_FP_EXC_INV = 0x100000 PR_FP_EXC_NONRECOV = 0x1 PR_FP_EXC_OVF = 0x20000 PR_FP_EXC_PRECISE = 0x3 PR_FP_EXC_RES = 0x80000 PR_FP_EXC_SW_ENABLE = 0x80 PR_FP_EXC_UND = 0x40000 PR_FP_MODE_FR = 0x1 PR_FP_MODE_FRE = 0x2 PR_GET_CHILD_SUBREAPER = 0x25 PR_GET_DUMPABLE = 0x3 PR_GET_ENDIAN = 0x13 PR_GET_FPEMU = 0x9 PR_GET_FPEXC = 0xb PR_GET_FP_MODE = 0x2e PR_GET_KEEPCAPS = 0x7 PR_GET_NAME = 0x10 PR_GET_NO_NEW_PRIVS = 0x27 PR_GET_PDEATHSIG = 0x2 PR_GET_SECCOMP = 0x15 PR_GET_SECUREBITS = 0x1b PR_GET_THP_DISABLE = 0x2a PR_GET_TID_ADDRESS = 0x28 PR_GET_TIMERSLACK = 0x1e PR_GET_TIMING = 0xd PR_GET_TSC = 0x19 PR_GET_UNALIGN = 0x5 PR_MCE_KILL = 0x21 PR_MCE_KILL_CLEAR = 0x0 PR_MCE_KILL_DEFAULT = 0x2 PR_MCE_KILL_EARLY = 0x1 PR_MCE_KILL_GET = 0x22 PR_MCE_KILL_LATE = 0x0 PR_MCE_KILL_SET = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b PR_SET_CHILD_SUBREAPER = 0x24 PR_SET_DUMPABLE = 0x4 PR_SET_ENDIAN = 0x14 PR_SET_FPEMU = 0xa PR_SET_FPEXC = 0xc PR_SET_FP_MODE = 0x2d PR_SET_KEEPCAPS = 0x8 PR_SET_MM = 0x23 PR_SET_MM_ARG_END = 0x9 PR_SET_MM_ARG_START = 0x8 PR_SET_MM_AUXV = 0xc PR_SET_MM_BRK = 0x7 PR_SET_MM_END_CODE = 0x2 PR_SET_MM_END_DATA = 0x4 PR_SET_MM_ENV_END = 0xb PR_SET_MM_ENV_START = 0xa PR_SET_MM_EXE_FILE = 0xd PR_SET_MM_MAP = 0xe PR_SET_MM_MAP_SIZE = 0xf PR_SET_MM_START_BRK = 0x6 PR_SET_MM_START_CODE = 0x1 PR_SET_MM_START_DATA = 0x3 PR_SET_MM_START_STACK = 0x5 PR_SET_NAME = 0xf PR_SET_NO_NEW_PRIVS = 0x26 PR_SET_PDEATHSIG = 0x1 PR_SET_PTRACER = 0x59616d61 PR_SET_PTRACER_ANY = 0xffffffffffffffff PR_SET_SECCOMP = 0x16 PR_SET_SECUREBITS = 0x1c PR_SET_THP_DISABLE = 0x29 PR_SET_TIMERSLACK = 0x1d PR_SET_TIMING = 0xe PR_SET_TSC = 0x1a PR_SET_UNALIGN = 0x6 PR_TASK_PERF_EVENTS_DISABLE = 0x1f PR_TASK_PERF_EVENTS_ENABLE = 0x20 PR_TIMING_STATISTICAL = 0x0 PR_TIMING_TIMESTAMP = 0x1 PR_TSC_ENABLE = 0x1 PR_TSC_SIGSEGV = 0x2 PR_UNALIGN_NOPRINT = 0x1 PR_UNALIGN_SIGBUS = 0x2 PTRACE_ARCH_PRCTL = 0x1e PTRACE_ATTACH = 0x10 PTRACE_CONT = 0x7 PTRACE_DETACH = 0x11 PTRACE_EVENT_CLONE = 0x3 PTRACE_EVENT_EXEC = 0x4 PTRACE_EVENT_EXIT = 0x6 PTRACE_EVENT_FORK = 0x1 PTRACE_EVENT_SECCOMP = 0x7 PTRACE_EVENT_STOP = 0x80 PTRACE_EVENT_VFORK = 0x2 PTRACE_EVENT_VFORK_DONE = 0x5 PTRACE_GETEVENTMSG = 0x4201 PTRACE_GETFPREGS = 0xe PTRACE_GETFPXREGS = 0x12 PTRACE_GETREGS = 0xc PTRACE_GETREGSET = 0x4204 PTRACE_GETSIGINFO = 0x4202 PTRACE_GETSIGMASK = 0x420a PTRACE_GET_THREAD_AREA = 0x19 PTRACE_INTERRUPT = 0x4207 PTRACE_KILL = 0x8 PTRACE_LISTEN = 0x4208 PTRACE_OLDSETOPTIONS = 0x15 PTRACE_O_EXITKILL = 0x100000 PTRACE_O_MASK = 0x3000ff PTRACE_O_SUSPEND_SECCOMP = 0x200000 PTRACE_O_TRACECLONE = 0x8 PTRACE_O_TRACEEXEC = 0x10 PTRACE_O_TRACEEXIT = 0x40 PTRACE_O_TRACEFORK = 0x2 PTRACE_O_TRACESECCOMP = 0x80 PTRACE_O_TRACESYSGOOD = 0x1 PTRACE_O_TRACEVFORK = 0x4 PTRACE_O_TRACEVFORKDONE = 0x20 PTRACE_PEEKDATA = 0x2 PTRACE_PEEKSIGINFO = 0x4209 PTRACE_PEEKSIGINFO_SHARED = 0x1 PTRACE_PEEKTEXT = 0x1 PTRACE_PEEKUSR = 0x3 PTRACE_POKEDATA = 0x5 PTRACE_POKETEXT = 0x4 PTRACE_POKEUSR = 0x6 PTRACE_SECCOMP_GET_FILTER = 0x420c PTRACE_SEIZE = 0x4206 PTRACE_SETFPREGS = 0xf PTRACE_SETFPXREGS = 0x13 PTRACE_SETOPTIONS = 0x4200 PTRACE_SETREGS = 0xd PTRACE_SETREGSET = 0x4205 PTRACE_SETSIGINFO = 0x4203 PTRACE_SETSIGMASK = 0x420b PTRACE_SET_THREAD_AREA = 0x1a PTRACE_SINGLEBLOCK = 0x21 PTRACE_SINGLESTEP = 0x9 PTRACE_SYSCALL = 0x18 PTRACE_SYSEMU = 0x1f PTRACE_SYSEMU_SINGLESTEP = 0x20 PTRACE_TRACEME = 0x0 RLIMIT_AS = 0x9 RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 RLIMIT_LOCKS = 0xa RLIMIT_MEMLOCK = 0x8 RLIMIT_MSGQUEUE = 0xc RLIMIT_NICE = 0xd RLIMIT_NOFILE = 0x7 RLIMIT_NPROC = 0x6 RLIMIT_RSS = 0x5 RLIMIT_RTPRIO = 0xe RLIMIT_RTTIME = 0xf RLIMIT_SIGPENDING = 0xb RLIMIT_STACK = 0x3 RLIM_INFINITY = 0xffffffffffffffff RTAX_ADVMSS = 0x8 RTAX_CC_ALGO = 0x10 RTAX_CWND = 0x7 RTAX_FEATURES = 0xc RTAX_FEATURE_ALLFRAG = 0x8 RTAX_FEATURE_ECN = 0x1 RTAX_FEATURE_MASK = 0xf RTAX_FEATURE_SACK = 0x2 RTAX_FEATURE_TIMESTAMP = 0x4 RTAX_HOPLIMIT = 0xa RTAX_INITCWND = 0xb RTAX_INITRWND = 0xe RTAX_LOCK = 0x1 RTAX_MAX = 0x10 RTAX_MTU = 0x2 RTAX_QUICKACK = 0xf RTAX_REORDERING = 0x9 RTAX_RTO_MIN = 0xd RTAX_RTT = 0x4 RTAX_RTTVAR = 0x5 RTAX_SSTHRESH = 0x6 RTAX_UNSPEC = 0x0 RTAX_WINDOW = 0x3 RTA_ALIGNTO = 0x4 RTA_MAX = 0x1a RTCF_DIRECTSRC = 0x4000000 RTCF_DOREDIRECT = 0x1000000 RTCF_LOG = 0x2000000 RTCF_MASQ = 0x400000 RTCF_NAT = 0x800000 RTCF_VALVE = 0x200000 RTF_ADDRCLASSMASK = 0xf8000000 RTF_ADDRCONF = 0x40000 RTF_ALLONLINK = 0x20000 RTF_BROADCAST = 0x10000000 RTF_CACHE = 0x1000000 RTF_DEFAULT = 0x10000 RTF_DYNAMIC = 0x10 RTF_FLOW = 0x2000000 RTF_GATEWAY = 0x2 RTF_HOST = 0x4 RTF_INTERFACE = 0x40000000 RTF_IRTT = 0x100 RTF_LINKRT = 0x100000 RTF_LOCAL = 0x80000000 RTF_MODIFIED = 0x20 RTF_MSS = 0x40 RTF_MTU = 0x40 RTF_MULTICAST = 0x20000000 RTF_NAT = 0x8000000 RTF_NOFORWARD = 0x1000 RTF_NONEXTHOP = 0x200000 RTF_NOPMTUDISC = 0x4000 RTF_POLICY = 0x4000000 RTF_REINSTATE = 0x8 RTF_REJECT = 0x200 RTF_STATIC = 0x400 RTF_THROW = 0x2000 RTF_UP = 0x1 RTF_WINDOW = 0x80 RTF_XRESOLVE = 0x800 RTM_BASE = 0x10 RTM_DELACTION = 0x31 RTM_DELADDR = 0x15 RTM_DELADDRLABEL = 0x49 RTM_DELLINK = 0x11 RTM_DELMDB = 0x55 RTM_DELNEIGH = 0x1d RTM_DELNETCONF = 0x51 RTM_DELNSID = 0x59 RTM_DELQDISC = 0x25 RTM_DELROUTE = 0x19 RTM_DELRULE = 0x21 RTM_DELTCLASS = 0x29 RTM_DELTFILTER = 0x2d RTM_F_CLONED = 0x200 RTM_F_EQUALIZE = 0x400 RTM_F_FIB_MATCH = 0x2000 RTM_F_LOOKUP_TABLE = 0x1000 RTM_F_NOTIFY = 0x100 RTM_F_PREFIX = 0x800 RTM_GETACTION = 0x32 RTM_GETADDR = 0x16 RTM_GETADDRLABEL = 0x4a RTM_GETANYCAST = 0x3e RTM_GETDCB = 0x4e RTM_GETLINK = 0x12 RTM_GETMDB = 0x56 RTM_GETMULTICAST = 0x3a RTM_GETNEIGH = 0x1e RTM_GETNEIGHTBL = 0x42 RTM_GETNETCONF = 0x52 RTM_GETNSID = 0x5a RTM_GETQDISC = 0x26 RTM_GETROUTE = 0x1a RTM_GETRULE = 0x22 RTM_GETSTATS = 0x5e RTM_GETTCLASS = 0x2a RTM_GETTFILTER = 0x2e RTM_MAX = 0x63 RTM_NEWACTION = 0x30 RTM_NEWADDR = 0x14 RTM_NEWADDRLABEL = 0x48 RTM_NEWCACHEREPORT = 0x60 RTM_NEWLINK = 0x10 RTM_NEWMDB = 0x54 RTM_NEWNDUSEROPT = 0x44 RTM_NEWNEIGH = 0x1c RTM_NEWNEIGHTBL = 0x40 RTM_NEWNETCONF = 0x50 RTM_NEWNSID = 0x58 RTM_NEWPREFIX = 0x34 RTM_NEWQDISC = 0x24 RTM_NEWROUTE = 0x18 RTM_NEWRULE = 0x20 RTM_NEWSTATS = 0x5c RTM_NEWTCLASS = 0x28 RTM_NEWTFILTER = 0x2c RTM_NR_FAMILIES = 0x15 RTM_NR_MSGTYPES = 0x54 RTM_SETDCB = 0x4f RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 RTNH_ALIGNTO = 0x4 RTNH_COMPARE_MASK = 0x19 RTNH_F_DEAD = 0x1 RTNH_F_LINKDOWN = 0x10 RTNH_F_OFFLOAD = 0x8 RTNH_F_ONLINK = 0x4 RTNH_F_PERVASIVE = 0x2 RTNH_F_UNRESOLVED = 0x20 RTN_MAX = 0xb RTPROT_BABEL = 0x2a RTPROT_BIRD = 0xc RTPROT_BOOT = 0x3 RTPROT_DHCP = 0x10 RTPROT_DNROUTED = 0xd RTPROT_GATED = 0x8 RTPROT_KERNEL = 0x2 RTPROT_MROUTED = 0x11 RTPROT_MRT = 0xa RTPROT_NTK = 0xf RTPROT_RA = 0x9 RTPROT_REDIRECT = 0x1 RTPROT_STATIC = 0x4 RTPROT_UNSPEC = 0x0 RTPROT_XORP = 0xe RTPROT_ZEBRA = 0xb RT_CLASS_DEFAULT = 0xfd RT_CLASS_LOCAL = 0xff RT_CLASS_MAIN = 0xfe RT_CLASS_MAX = 0xff RT_CLASS_UNSPEC = 0x0 RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 RUSAGE_THREAD = 0x1 SCM_CREDENTIALS = 0x2 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x1d SCM_TIMESTAMPING = 0x25 SCM_TIMESTAMPING_OPT_STATS = 0x36 SCM_TIMESTAMPING_PKTINFO = 0x3a SCM_TIMESTAMPNS = 0x23 SCM_WIFI_STATUS = 0x29 SECCOMP_MODE_DISABLED = 0x0 SECCOMP_MODE_FILTER = 0x2 SECCOMP_MODE_STRICT = 0x1 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 SIOCADDDLCI = 0x8980 SIOCADDMULTI = 0x8931 SIOCADDRT = 0x890b SIOCATMARK = 0x8905 SIOCBONDCHANGEACTIVE = 0x8995 SIOCBONDENSLAVE = 0x8990 SIOCBONDINFOQUERY = 0x8994 SIOCBONDRELEASE = 0x8991 SIOCBONDSETHWADDR = 0x8992 SIOCBONDSLAVEINFOQUERY = 0x8993 SIOCBRADDBR = 0x89a0 SIOCBRADDIF = 0x89a2 SIOCBRDELBR = 0x89a1 SIOCBRDELIF = 0x89a3 SIOCDARP = 0x8953 SIOCDELDLCI = 0x8981 SIOCDELMULTI = 0x8932 SIOCDELRT = 0x890c SIOCDEVPRIVATE = 0x89f0 SIOCDIFADDR = 0x8936 SIOCDRARP = 0x8960 SIOCETHTOOL = 0x8946 SIOCGARP = 0x8954 SIOCGHWTSTAMP = 0x89b1 SIOCGIFADDR = 0x8915 SIOCGIFBR = 0x8940 SIOCGIFBRDADDR = 0x8919 SIOCGIFCONF = 0x8912 SIOCGIFCOUNT = 0x8938 SIOCGIFDSTADDR = 0x8917 SIOCGIFENCAP = 0x8925 SIOCGIFFLAGS = 0x8913 SIOCGIFHWADDR = 0x8927 SIOCGIFINDEX = 0x8933 SIOCGIFMAP = 0x8970 SIOCGIFMEM = 0x891f SIOCGIFMETRIC = 0x891d SIOCGIFMTU = 0x8921 SIOCGIFNAME = 0x8910 SIOCGIFNETMASK = 0x891b SIOCGIFPFLAGS = 0x8935 SIOCGIFSLAVE = 0x8929 SIOCGIFTXQLEN = 0x8942 SIOCGIFVLAN = 0x8982 SIOCGMIIPHY = 0x8947 SIOCGMIIREG = 0x8948 SIOCGPGRP = 0x8904 SIOCGRARP = 0x8961 SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 SIOCGSTAMPNS = 0x8907 SIOCINQ = 0x541b SIOCOUTQ = 0x5411 SIOCOUTQNSD = 0x894b SIOCPROTOPRIVATE = 0x89e0 SIOCRTMSG = 0x890d SIOCSARP = 0x8955 SIOCSHWTSTAMP = 0x89b0 SIOCSIFADDR = 0x8916 SIOCSIFBR = 0x8941 SIOCSIFBRDADDR = 0x891a SIOCSIFDSTADDR = 0x8918 SIOCSIFENCAP = 0x8926 SIOCSIFFLAGS = 0x8914 SIOCSIFHWADDR = 0x8924 SIOCSIFHWBROADCAST = 0x8937 SIOCSIFLINK = 0x8911 SIOCSIFMAP = 0x8971 SIOCSIFMEM = 0x8920 SIOCSIFMETRIC = 0x891e SIOCSIFMTU = 0x8922 SIOCSIFNAME = 0x8923 SIOCSIFNETMASK = 0x891c SIOCSIFPFLAGS = 0x8934 SIOCSIFSLAVE = 0x8930 SIOCSIFTXQLEN = 0x8943 SIOCSIFVLAN = 0x8983 SIOCSMIIREG = 0x8949 SIOCSPGRP = 0x8902 SIOCSRARP = 0x8962 SIOCWANDEV = 0x894a SOCK_CLOEXEC = 0x80000 SOCK_DCCP = 0x6 SOCK_DGRAM = 0x2 SOCK_IOC_TYPE = 0x89 SOCK_NONBLOCK = 0x800 SOCK_PACKET = 0xa SOCK_RAW = 0x3 SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x1 SOL_AAL = 0x109 SOL_ALG = 0x117 SOL_ATM = 0x108 SOL_CAIF = 0x116 SOL_CAN_BASE = 0x64 SOL_DCCP = 0x10d SOL_DECNET = 0x105 SOL_ICMPV6 = 0x3a SOL_IP = 0x0 SOL_IPV6 = 0x29 SOL_IRDA = 0x10a SOL_IUCV = 0x115 SOL_KCM = 0x119 SOL_LLC = 0x10c SOL_NETBEUI = 0x10b SOL_NETLINK = 0x10e SOL_NFC = 0x118 SOL_PACKET = 0x107 SOL_PNPIPE = 0x113 SOL_PPPOL2TP = 0x111 SOL_RAW = 0xff SOL_RDS = 0x114 SOL_RXRPC = 0x110 SOL_SOCKET = 0x1 SOL_TCP = 0x6 SOL_TIPC = 0x10f SOL_X25 = 0x106 SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x1e SO_ATTACH_BPF = 0x32 SO_ATTACH_FILTER = 0x1a SO_ATTACH_REUSEPORT_CBPF = 0x33 SO_ATTACH_REUSEPORT_EBPF = 0x34 SO_BINDTODEVICE = 0x19 SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe SO_BUSY_POLL = 0x2e SO_CNX_ADVICE = 0x35 SO_COOKIE = 0x39 SO_DEBUG = 0x1 SO_DETACH_BPF = 0x1b SO_DETACH_FILTER = 0x1b SO_DOMAIN = 0x27 SO_DONTROUTE = 0x5 SO_ERROR = 0x4 SO_GET_FILTER = 0x1a SO_INCOMING_CPU = 0x31 SO_INCOMING_NAPI_ID = 0x38 SO_KEEPALIVE = 0x9 SO_LINGER = 0xd SO_LOCK_FILTER = 0x2c SO_MARK = 0x24 SO_MAX_PACING_RATE = 0x2f SO_MEMINFO = 0x37 SO_NOFCS = 0x2b SO_NO_CHECK = 0xb SO_OOBINLINE = 0xa SO_PASSCRED = 0x10 SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x11 SO_PEERGROUPS = 0x3b SO_PEERNAME = 0x1c SO_PEERSEC = 0x1f SO_PRIORITY = 0xc SO_PROTOCOL = 0x26 SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x12 SO_RCVTIMEO = 0x14 SO_REUSEADDR = 0x2 SO_REUSEPORT = 0xf SO_RXQ_OVFL = 0x28 SO_SECURITY_AUTHENTICATION = 0x16 SO_SECURITY_ENCRYPTION_NETWORK = 0x18 SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 SO_SELECT_ERR_QUEUE = 0x2d SO_SNDBUF = 0x7 SO_SNDBUFFORCE = 0x20 SO_SNDLOWAT = 0x13 SO_SNDTIMEO = 0x15 SO_TIMESTAMP = 0x1d SO_TIMESTAMPING = 0x25 SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x3 SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 SO_VM_SOCKETS_BUFFER_SIZE = 0x0 SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 SO_VM_SOCKETS_TRUSTED = 0x5 SO_WIFI_STATUS = 0x29 SPLICE_F_GIFT = 0x8 SPLICE_F_MORE = 0x4 SPLICE_F_MOVE = 0x1 SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000 S_IFCHR = 0x2000 S_IFDIR = 0x4000 S_IFIFO = 0x1000 S_IFLNK = 0xa000 S_IFMT = 0xf000 S_IFREG = 0x8000 S_IFSOCK = 0xc000 S_IREAD = 0x100 S_IRGRP = 0x20 S_IROTH = 0x4 S_IRUSR = 0x100 S_IRWXG = 0x38 S_IRWXO = 0x7 S_IRWXU = 0x1c0 S_ISGID = 0x400 S_ISUID = 0x800 S_ISVTX = 0x200 S_IWGRP = 0x10 S_IWOTH = 0x2 S_IWRITE = 0x80 S_IWUSR = 0x80 S_IXGRP = 0x8 S_IXOTH = 0x1 S_IXUSR = 0x40 TAB0 = 0x0 TAB1 = 0x800 TAB2 = 0x1000 TAB3 = 0x1800 TABDLY = 0x1800 TASKSTATS_CMD_ATTR_MAX = 0x4 TASKSTATS_CMD_MAX = 0x2 TASKSTATS_GENL_NAME = "TASKSTATS" TASKSTATS_GENL_VERSION = 0x1 TASKSTATS_TYPE_MAX = 0x6 TASKSTATS_VERSION = 0x8 TCFLSH = 0x540b TCGETA = 0x5405 TCGETS = 0x5401 TCGETS2 = 0x802c542a TCGETX = 0x5432 TCIFLUSH = 0x0 TCIOFF = 0x2 TCIOFLUSH = 0x2 TCION = 0x3 TCOFLUSH = 0x1 TCOOFF = 0x0 TCOON = 0x1 TCP_CC_INFO = 0x1a TCP_CONGESTION = 0xd TCP_COOKIE_IN_ALWAYS = 0x1 TCP_COOKIE_MAX = 0x10 TCP_COOKIE_MIN = 0x8 TCP_COOKIE_OUT_NEVER = 0x2 TCP_COOKIE_PAIR_SIZE = 0x20 TCP_COOKIE_TRANSACTIONS = 0xf TCP_CORK = 0x3 TCP_DEFER_ACCEPT = 0x9 TCP_FASTOPEN = 0x17 TCP_FASTOPEN_CONNECT = 0x1e TCP_INFO = 0xb TCP_KEEPCNT = 0x6 TCP_KEEPIDLE = 0x4 TCP_KEEPINTVL = 0x5 TCP_LINGER2 = 0x8 TCP_MAXSEG = 0x2 TCP_MAXWIN = 0xffff TCP_MAX_WINSHIFT = 0xe TCP_MD5SIG = 0xe TCP_MD5SIG_MAXKEYLEN = 0x50 TCP_MSS = 0x200 TCP_MSS_DEFAULT = 0x218 TCP_MSS_DESIRED = 0x4c4 TCP_NODELAY = 0x1 TCP_NOTSENT_LOWAT = 0x19 TCP_QUEUE_SEQ = 0x15 TCP_QUICKACK = 0xc TCP_REPAIR = 0x13 TCP_REPAIR_OPTIONS = 0x16 TCP_REPAIR_QUEUE = 0x14 TCP_REPAIR_WINDOW = 0x1d TCP_SAVED_SYN = 0x1c TCP_SAVE_SYN = 0x1b TCP_SYNCNT = 0x7 TCP_S_DATA_IN = 0x4 TCP_S_DATA_OUT = 0x8 TCP_THIN_DUPACK = 0x11 TCP_THIN_LINEAR_TIMEOUTS = 0x10 TCP_TIMESTAMP = 0x18 TCP_USER_TIMEOUT = 0x12 TCP_WINDOW_CLAMP = 0xa TCSAFLUSH = 0x2 TCSBRK = 0x5409 TCSBRKP = 0x5425 TCSETA = 0x5406 TCSETAF = 0x5408 TCSETAW = 0x5407 TCSETS = 0x5402 TCSETS2 = 0x402c542b TCSETSF = 0x5404 TCSETSF2 = 0x402c542d TCSETSW = 0x5403 TCSETSW2 = 0x402c542c TCSETX = 0x5433 TCSETXF = 0x5434 TCSETXW = 0x5435 TCXONC = 0x540a TIOCCBRK = 0x5428 TIOCCONS = 0x541d TIOCEXCL = 0x540c TIOCGDEV = 0x80045432 TIOCGETD = 0x5424 TIOCGEXCL = 0x80045440 TIOCGICOUNT = 0x545d TIOCGLCKTRMIOS = 0x5456 TIOCGPGRP = 0x540f TIOCGPKT = 0x80045438 TIOCGPTLCK = 0x80045439 TIOCGPTN = 0x80045430 TIOCGPTPEER = 0x5441 TIOCGRS485 = 0x542e TIOCGSERIAL = 0x541e TIOCGSID = 0x5429 TIOCGSOFTCAR = 0x5419 TIOCGWINSZ = 0x5413 TIOCINQ = 0x541b TIOCLINUX = 0x541c TIOCMBIC = 0x5417 TIOCMBIS = 0x5416 TIOCMGET = 0x5415 TIOCMIWAIT = 0x545c TIOCMSET = 0x5418 TIOCM_CAR = 0x40 TIOCM_CD = 0x40 TIOCM_CTS = 0x20 TIOCM_DSR = 0x100 TIOCM_DTR = 0x2 TIOCM_LE = 0x1 TIOCM_RI = 0x80 TIOCM_RNG = 0x80 TIOCM_RTS = 0x4 TIOCM_SR = 0x10 TIOCM_ST = 0x8 TIOCNOTTY = 0x5422 TIOCNXCL = 0x540d TIOCOUTQ = 0x5411 TIOCPKT = 0x5420 TIOCPKT_DATA = 0x0 TIOCPKT_DOSTOP = 0x20 TIOCPKT_FLUSHREAD = 0x1 TIOCPKT_FLUSHWRITE = 0x2 TIOCPKT_IOCTL = 0x40 TIOCPKT_NOSTOP = 0x10 TIOCPKT_START = 0x8 TIOCPKT_STOP = 0x4 TIOCSBRK = 0x5427 TIOCSCTTY = 0x540e TIOCSERCONFIG = 0x5453 TIOCSERGETLSR = 0x5459 TIOCSERGETMULTI = 0x545a TIOCSERGSTRUCT = 0x5458 TIOCSERGWILD = 0x5454 TIOCSERSETMULTI = 0x545b TIOCSERSWILD = 0x5455 TIOCSER_TEMT = 0x1 TIOCSETD = 0x5423 TIOCSIG = 0x40045436 TIOCSLCKTRMIOS = 0x5457 TIOCSPGRP = 0x5410 TIOCSPTLCK = 0x40045431 TIOCSRS485 = 0x542f TIOCSSERIAL = 0x541f TIOCSSOFTCAR = 0x541a TIOCSTI = 0x5412 TIOCSWINSZ = 0x5414 TIOCVHANGUP = 0x5437 TOSTOP = 0x100 TS_COMM_LEN = 0x20 TUNATTACHFILTER = 0x401054d5 TUNDETACHFILTER = 0x401054d6 TUNGETFEATURES = 0x800454cf TUNGETFILTER = 0x801054db TUNGETIFF = 0x800454d2 TUNGETSNDBUF = 0x800454d3 TUNGETVNETBE = 0x800454df TUNGETVNETHDRSZ = 0x800454d7 TUNGETVNETLE = 0x800454dd TUNSETDEBUG = 0x400454c9 TUNSETGROUP = 0x400454ce TUNSETIFF = 0x400454ca TUNSETIFINDEX = 0x400454da TUNSETLINK = 0x400454cd TUNSETNOCSUM = 0x400454c8 TUNSETOFFLOAD = 0x400454d0 TUNSETOWNER = 0x400454cc TUNSETPERSIST = 0x400454cb TUNSETQUEUE = 0x400454d9 TUNSETSNDBUF = 0x400454d4 TUNSETTXFILTER = 0x400454d1 TUNSETVNETBE = 0x400454de TUNSETVNETHDRSZ = 0x400454d8 TUNSETVNETLE = 0x400454dc UMOUNT_NOFOLLOW = 0x8 UTIME_NOW = 0x3fffffff UTIME_OMIT = 0x3ffffffe VDISCARD = 0xd VEOF = 0x4 VEOL = 0xb VEOL2 = 0x10 VERASE = 0x2 VINTR = 0x0 VKILL = 0x3 VLNEXT = 0xf VMADDR_CID_ANY = 0xffffffff VMADDR_CID_HOST = 0x2 VMADDR_CID_HYPERVISOR = 0x0 VMADDR_CID_RESERVED = 0x1 VMADDR_PORT_ANY = 0xffffffff VMIN = 0x6 VM_SOCKETS_INVALID_VERSION = 0xffffffff VQUIT = 0x1 VREPRINT = 0xc VSTART = 0x8 VSTOP = 0x9 VSUSP = 0xa VSWTC = 0x7 VT0 = 0x0 VT1 = 0x4000 VTDLY = 0x4000 VTIME = 0x5 VWERASE = 0xe WALL = 0x40000000 WCLONE = 0x80000000 WCONTINUED = 0x8 WDIOC_GETBOOTSTATUS = 0x80045702 WDIOC_GETPRETIMEOUT = 0x80045709 WDIOC_GETSTATUS = 0x80045701 WDIOC_GETSUPPORT = 0x80285700 WDIOC_GETTEMP = 0x80045703 WDIOC_GETTIMELEFT = 0x8004570a WDIOC_GETTIMEOUT = 0x80045707 WDIOC_KEEPALIVE = 0x80045705 WDIOC_SETOPTIONS = 0x80045704 WDIOC_SETPRETIMEOUT = 0xc0045708 WDIOC_SETTIMEOUT = 0xc0045706 WEXITED = 0x4 WNOHANG = 0x1 WNOTHREAD = 0x20000000 WNOWAIT = 0x1000000 WORDSIZE = 0x40 WSTOPPED = 0x2 WUNTRACED = 0x2 XATTR_CREATE = 0x1 XATTR_REPLACE = 0x2 XCASE = 0x4 XTABS = 0x1800 ) // Errors const ( E2BIG = syscall.Errno(0x7) EACCES = syscall.Errno(0xd) EADDRINUSE = syscall.Errno(0x62) EADDRNOTAVAIL = syscall.Errno(0x63) EADV = syscall.Errno(0x44) EAFNOSUPPORT = syscall.Errno(0x61) EAGAIN = syscall.Errno(0xb) EALREADY = syscall.Errno(0x72) EBADE = syscall.Errno(0x34) EBADF = syscall.Errno(0x9) EBADFD = syscall.Errno(0x4d) EBADMSG = syscall.Errno(0x4a) EBADR = syscall.Errno(0x35) EBADRQC = syscall.Errno(0x38) EBADSLT = syscall.Errno(0x39) EBFONT = syscall.Errno(0x3b) EBUSY = syscall.Errno(0x10) ECANCELED = syscall.Errno(0x7d) ECHILD = syscall.Errno(0xa) ECHRNG = syscall.Errno(0x2c) ECOMM = syscall.Errno(0x46) ECONNABORTED = syscall.Errno(0x67) ECONNREFUSED = syscall.Errno(0x6f) ECONNRESET = syscall.Errno(0x68) EDEADLK = syscall.Errno(0x23) EDEADLOCK = syscall.Errno(0x23) EDESTADDRREQ = syscall.Errno(0x59) EDOM = syscall.Errno(0x21) EDOTDOT = syscall.Errno(0x49) EDQUOT = syscall.Errno(0x7a) EEXIST = syscall.Errno(0x11) EFAULT = syscall.Errno(0xe) EFBIG = syscall.Errno(0x1b) EHOSTDOWN = syscall.Errno(0x70) EHOSTUNREACH = syscall.Errno(0x71) EHWPOISON = syscall.Errno(0x85) EIDRM = syscall.Errno(0x2b) EILSEQ = syscall.Errno(0x54) EINPROGRESS = syscall.Errno(0x73) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x6a) EISDIR = syscall.Errno(0x15) EISNAM = syscall.Errno(0x78) EKEYEXPIRED = syscall.Errno(0x7f) EKEYREJECTED = syscall.Errno(0x81) EKEYREVOKED = syscall.Errno(0x80) EL2HLT = syscall.Errno(0x33) EL2NSYNC = syscall.Errno(0x2d) EL3HLT = syscall.Errno(0x2e) EL3RST = syscall.Errno(0x2f) ELIBACC = syscall.Errno(0x4f) ELIBBAD = syscall.Errno(0x50) ELIBEXEC = syscall.Errno(0x53) ELIBMAX = syscall.Errno(0x52) ELIBSCN = syscall.Errno(0x51) ELNRNG = syscall.Errno(0x30) ELOOP = syscall.Errno(0x28) EMEDIUMTYPE = syscall.Errno(0x7c) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) EMSGSIZE = syscall.Errno(0x5a) EMULTIHOP = syscall.Errno(0x48) ENAMETOOLONG = syscall.Errno(0x24) ENAVAIL = syscall.Errno(0x77) ENETDOWN = syscall.Errno(0x64) ENETRESET = syscall.Errno(0x66) ENETUNREACH = syscall.Errno(0x65) ENFILE = syscall.Errno(0x17) ENOANO = syscall.Errno(0x37) ENOBUFS = syscall.Errno(0x69) ENOCSI = syscall.Errno(0x32) ENODATA = syscall.Errno(0x3d) ENODEV = syscall.Errno(0x13) ENOENT = syscall.Errno(0x2) ENOEXEC = syscall.Errno(0x8) ENOKEY = syscall.Errno(0x7e) ENOLCK = syscall.Errno(0x25) ENOLINK = syscall.Errno(0x43) ENOMEDIUM = syscall.Errno(0x7b) ENOMEM = syscall.Errno(0xc) ENOMSG = syscall.Errno(0x2a) ENONET = syscall.Errno(0x40) ENOPKG = syscall.Errno(0x41) ENOPROTOOPT = syscall.Errno(0x5c) ENOSPC = syscall.Errno(0x1c) ENOSR = syscall.Errno(0x3f) ENOSTR = syscall.Errno(0x3c) ENOSYS = syscall.Errno(0x26) ENOTBLK = syscall.Errno(0xf) ENOTCONN = syscall.Errno(0x6b) ENOTDIR = syscall.Errno(0x14) ENOTEMPTY = syscall.Errno(0x27) ENOTNAM = syscall.Errno(0x76) ENOTRECOVERABLE = syscall.Errno(0x83) ENOTSOCK = syscall.Errno(0x58) ENOTSUP = syscall.Errno(0x5f) ENOTTY = syscall.Errno(0x19) ENOTUNIQ = syscall.Errno(0x4c) ENXIO = syscall.Errno(0x6) EOPNOTSUPP = syscall.Errno(0x5f) EOVERFLOW = syscall.Errno(0x4b) EOWNERDEAD = syscall.Errno(0x82) EPERM = syscall.Errno(0x1) EPFNOSUPPORT = syscall.Errno(0x60) EPIPE = syscall.Errno(0x20) EPROTO = syscall.Errno(0x47) EPROTONOSUPPORT = syscall.Errno(0x5d) EPROTOTYPE = syscall.Errno(0x5b) ERANGE = syscall.Errno(0x22) EREMCHG = syscall.Errno(0x4e) EREMOTE = syscall.Errno(0x42) EREMOTEIO = syscall.Errno(0x79) ERESTART = syscall.Errno(0x55) ERFKILL = syscall.Errno(0x84) EROFS = syscall.Errno(0x1e) ESHUTDOWN = syscall.Errno(0x6c) ESOCKTNOSUPPORT = syscall.Errno(0x5e) ESPIPE = syscall.Errno(0x1d) ESRCH = syscall.Errno(0x3) ESRMNT = syscall.Errno(0x45) ESTALE = syscall.Errno(0x74) ESTRPIPE = syscall.Errno(0x56) ETIME = syscall.Errno(0x3e) ETIMEDOUT = syscall.Errno(0x6e) ETOOMANYREFS = syscall.Errno(0x6d) ETXTBSY = syscall.Errno(0x1a) EUCLEAN = syscall.Errno(0x75) EUNATCH = syscall.Errno(0x31) EUSERS = syscall.Errno(0x57) EWOULDBLOCK = syscall.Errno(0xb) EXDEV = syscall.Errno(0x12) EXFULL = syscall.Errno(0x36) ) // Signals const ( SIGABRT = syscall.Signal(0x6) SIGALRM = syscall.Signal(0xe) SIGBUS = syscall.Signal(0x7) SIGCHLD = syscall.Signal(0x11) SIGCLD = syscall.Signal(0x11) SIGCONT = syscall.Signal(0x12) SIGFPE = syscall.Signal(0x8) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x1d) SIGIOT = syscall.Signal(0x6) SIGKILL = syscall.Signal(0x9) SIGPIPE = syscall.Signal(0xd) SIGPOLL = syscall.Signal(0x1d) SIGPROF = syscall.Signal(0x1b) SIGPWR = syscall.Signal(0x1e) SIGQUIT = syscall.Signal(0x3) SIGSEGV = syscall.Signal(0xb) SIGSTKFLT = syscall.Signal(0x10) SIGSTOP = syscall.Signal(0x13) SIGSYS = syscall.Signal(0x1f) SIGTERM = syscall.Signal(0xf) SIGTRAP = syscall.Signal(0x5) SIGTSTP = syscall.Signal(0x14) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) SIGURG = syscall.Signal(0x17) SIGUSR1 = syscall.Signal(0xa) SIGUSR2 = syscall.Signal(0xc) SIGVTALRM = syscall.Signal(0x1a) SIGWINCH = syscall.Signal(0x1c) SIGXCPU = syscall.Signal(0x18) SIGXFSZ = syscall.Signal(0x19) ) // Error table var errors = [...]string{ 1: "operation not permitted", 2: "no such file or directory", 3: "no such process", 4: "interrupted system call", 5: "input/output error", 6: "no such device or address", 7: "argument list too long", 8: "exec format error", 9: "bad file descriptor", 10: "no child processes", 11: "resource temporarily unavailable", 12: "cannot allocate memory", 13: "permission denied", 14: "bad address", 15: "block device required", 16: "device or resource busy", 17: "file exists", 18: "invalid cross-device link", 19: "no such device", 20: "not a directory", 21: "is a directory", 22: "invalid argument", 23: "too many open files in system", 24: "too many open files", 25: "inappropriate ioctl for device", 26: "text file busy", 27: "file too large", 28: "no space left on device", 29: "illegal seek", 30: "read-only file system", 31: "too many links", 32: "broken pipe", 33: "numerical argument out of domain", 34: "numerical result out of range", 35: "resource deadlock avoided", 36: "file name too long", 37: "no locks available", 38: "function not implemented", 39: "directory not empty", 40: "too many levels of symbolic links", 42: "no message of desired type", 43: "identifier removed", 44: "channel number out of range", 45: "level 2 not synchronized", 46: "level 3 halted", 47: "level 3 reset", 48: "link number out of range", 49: "protocol driver not attached", 50: "no CSI structure available", 51: "level 2 halted", 52: "invalid exchange", 53: "invalid request descriptor", 54: "exchange full", 55: "no anode", 56: "invalid request code", 57: "invalid slot", 59: "bad font file format", 60: "device not a stream", 61: "no data available", 62: "timer expired", 63: "out of streams resources", 64: "machine is not on the network", 65: "package not installed", 66: "object is remote", 67: "link has been severed", 68: "advertise error", 69: "srmount error", 70: "communication error on send", 71: "protocol error", 72: "multihop attempted", 73: "RFS specific error", 74: "bad message", 75: "value too large for defined data type", 76: "name not unique on network", 77: "file descriptor in bad state", 78: "remote address changed", 79: "can not access a needed shared library", 80: "accessing a corrupted shared library", 81: ".lib section in a.out corrupted", 82: "attempting to link in too many shared libraries", 83: "cannot exec a shared library directly", 84: "invalid or incomplete multibyte or wide character", 85: "interrupted system call should be restarted", 86: "streams pipe error", 87: "too many users", 88: "socket operation on non-socket", 89: "destination address required", 90: "message too long", 91: "protocol wrong type for socket", 92: "protocol not available", 93: "protocol not supported", 94: "socket type not supported", 95: "operation not supported", 96: "protocol family not supported", 97: "address family not supported by protocol", 98: "address already in use", 99: "cannot assign requested address", 100: "network is down", 101: "network is unreachable", 102: "network dropped connection on reset", 103: "software caused connection abort", 104: "connection reset by peer", 105: "no buffer space available", 106: "transport endpoint is already connected", 107: "transport endpoint is not connected", 108: "cannot send after transport endpoint shutdown", 109: "too many references: cannot splice", 110: "connection timed out", 111: "connection refused", 112: "host is down", 113: "no route to host", 114: "operation already in progress", 115: "operation now in progress", 116: "stale file handle", 117: "structure needs cleaning", 118: "not a XENIX named type file", 119: "no XENIX semaphores available", 120: "is a named type file", 121: "remote I/O error", 122: "disk quota exceeded", 123: "no medium found", 124: "wrong medium type", 125: "operation canceled", 126: "required key not available", 127: "key has expired", 128: "key has been revoked", 129: "key was rejected by service", 130: "owner died", 131: "state not recoverable", 132: "operation not possible due to RF-kill", 133: "memory page has hardware error", } // Signal table var signals = [...]string{ 1: "hangup", 2: "interrupt", 3: "quit", 4: "illegal instruction", 5: "trace/breakpoint trap", 6: "aborted", 7: "bus error", 8: "floating point exception", 9: "killed", 10: "user defined signal 1", 11: "segmentation fault", 12: "user defined signal 2", 13: "broken pipe", 14: "alarm clock", 15: "terminated", 16: "stack fault", 17: "child exited", 18: "continued", 19: "stopped (signal)", 20: "stopped", 21: "stopped (tty input)", 22: "stopped (tty output)", 23: "urgent I/O condition", 24: "CPU time limit exceeded", 25: "file size limit exceeded", 26: "virtual timer expired", 27: "profiling timer expired", 28: "window changed", 29: "I/O possible", 30: "power failure", 31: "bad system call", } ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_linux_arm.go ================================================ // mkerrors.sh -Wall -Werror -static -I/tmp/include // Code generated by the command above; see README.md. DO NOT EDIT. // +build arm,linux // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go package unix import "syscall" const ( AF_ALG = 0x26 AF_APPLETALK = 0x5 AF_ASH = 0x12 AF_ATMPVC = 0x8 AF_ATMSVC = 0x14 AF_AX25 = 0x3 AF_BLUETOOTH = 0x1f AF_BRIDGE = 0x7 AF_CAIF = 0x25 AF_CAN = 0x1d AF_DECnet = 0xc AF_ECONET = 0x13 AF_FILE = 0x1 AF_IB = 0x1b AF_IEEE802154 = 0x24 AF_INET = 0x2 AF_INET6 = 0xa AF_IPX = 0x4 AF_IRDA = 0x17 AF_ISDN = 0x22 AF_IUCV = 0x20 AF_KCM = 0x29 AF_KEY = 0xf AF_LLC = 0x1a AF_LOCAL = 0x1 AF_MAX = 0x2c AF_MPLS = 0x1c AF_NETBEUI = 0xd AF_NETLINK = 0x10 AF_NETROM = 0x6 AF_NFC = 0x27 AF_PACKET = 0x11 AF_PHONET = 0x23 AF_PPPOX = 0x18 AF_QIPCRTR = 0x2a AF_RDS = 0x15 AF_ROSE = 0xb AF_ROUTE = 0x10 AF_RXRPC = 0x21 AF_SECURITY = 0xe AF_SMC = 0x2b AF_SNA = 0x16 AF_TIPC = 0x1e AF_UNIX = 0x1 AF_UNSPEC = 0x0 AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 ALG_OP_DECRYPT = 0x0 ALG_OP_ENCRYPT = 0x1 ALG_SET_AEAD_ASSOCLEN = 0x4 ALG_SET_AEAD_AUTHSIZE = 0x5 ALG_SET_IV = 0x2 ALG_SET_KEY = 0x1 ALG_SET_OP = 0x3 ARPHRD_6LOWPAN = 0x339 ARPHRD_ADAPT = 0x108 ARPHRD_APPLETLK = 0x8 ARPHRD_ARCNET = 0x7 ARPHRD_ASH = 0x30d ARPHRD_ATM = 0x13 ARPHRD_AX25 = 0x3 ARPHRD_BIF = 0x307 ARPHRD_CAIF = 0x336 ARPHRD_CAN = 0x118 ARPHRD_CHAOS = 0x5 ARPHRD_CISCO = 0x201 ARPHRD_CSLIP = 0x101 ARPHRD_CSLIP6 = 0x103 ARPHRD_DDCMP = 0x205 ARPHRD_DLCI = 0xf ARPHRD_ECONET = 0x30e ARPHRD_EETHER = 0x2 ARPHRD_ETHER = 0x1 ARPHRD_EUI64 = 0x1b ARPHRD_FCAL = 0x311 ARPHRD_FCFABRIC = 0x313 ARPHRD_FCPL = 0x312 ARPHRD_FCPP = 0x310 ARPHRD_FDDI = 0x306 ARPHRD_FRAD = 0x302 ARPHRD_HDLC = 0x201 ARPHRD_HIPPI = 0x30c ARPHRD_HWX25 = 0x110 ARPHRD_IEEE1394 = 0x18 ARPHRD_IEEE802 = 0x6 ARPHRD_IEEE80211 = 0x321 ARPHRD_IEEE80211_PRISM = 0x322 ARPHRD_IEEE80211_RADIOTAP = 0x323 ARPHRD_IEEE802154 = 0x324 ARPHRD_IEEE802154_MONITOR = 0x325 ARPHRD_IEEE802_TR = 0x320 ARPHRD_INFINIBAND = 0x20 ARPHRD_IP6GRE = 0x337 ARPHRD_IPDDP = 0x309 ARPHRD_IPGRE = 0x30a ARPHRD_IRDA = 0x30f ARPHRD_LAPB = 0x204 ARPHRD_LOCALTLK = 0x305 ARPHRD_LOOPBACK = 0x304 ARPHRD_METRICOM = 0x17 ARPHRD_NETLINK = 0x338 ARPHRD_NETROM = 0x0 ARPHRD_NONE = 0xfffe ARPHRD_PHONET = 0x334 ARPHRD_PHONET_PIPE = 0x335 ARPHRD_PIMREG = 0x30b ARPHRD_PPP = 0x200 ARPHRD_PRONET = 0x4 ARPHRD_RAWHDLC = 0x206 ARPHRD_ROSE = 0x10e ARPHRD_RSRVD = 0x104 ARPHRD_SIT = 0x308 ARPHRD_SKIP = 0x303 ARPHRD_SLIP = 0x100 ARPHRD_SLIP6 = 0x102 ARPHRD_TUNNEL = 0x300 ARPHRD_TUNNEL6 = 0x301 ARPHRD_VOID = 0xffff ARPHRD_VSOCKMON = 0x33a ARPHRD_X25 = 0x10f B0 = 0x0 B1000000 = 0x1008 B110 = 0x3 B115200 = 0x1002 B1152000 = 0x1009 B1200 = 0x9 B134 = 0x4 B150 = 0x5 B1500000 = 0x100a B1800 = 0xa B19200 = 0xe B200 = 0x6 B2000000 = 0x100b B230400 = 0x1003 B2400 = 0xb B2500000 = 0x100c B300 = 0x7 B3000000 = 0x100d B3500000 = 0x100e B38400 = 0xf B4000000 = 0x100f B460800 = 0x1004 B4800 = 0xc B50 = 0x1 B500000 = 0x1005 B57600 = 0x1001 B576000 = 0x1006 B600 = 0x8 B75 = 0x2 B921600 = 0x1007 B9600 = 0xd BLKBSZGET = 0x80041270 BLKBSZSET = 0x40041271 BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80041272 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d BLKRRPART = 0x125f BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 BOTHER = 0x1000 BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALU = 0x4 BPF_AND = 0x50 BPF_B = 0x10 BPF_DIV = 0x30 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 BPF_JA = 0x0 BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 BPF_JMP = 0x5 BPF_JSET = 0x40 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 BPF_LEN = 0x80 BPF_LL_OFF = -0x200000 BPF_LSH = 0x60 BPF_MAJOR_VERSION = 0x1 BPF_MAXINSNS = 0x1000 BPF_MEM = 0x60 BPF_MEMWORDS = 0x10 BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MOD = 0x90 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_NET_OFF = -0x100000 BPF_OR = 0x40 BPF_RET = 0x6 BPF_RSH = 0x70 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 BPF_TAX = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 BPF_XOR = 0xa0 BRKINT = 0x2 BS0 = 0x0 BS1 = 0x2000 BSDLY = 0x2000 CAN_BCM = 0x2 CAN_EFF_FLAG = 0x80000000 CAN_EFF_ID_BITS = 0x1d CAN_EFF_MASK = 0x1fffffff CAN_ERR_FLAG = 0x20000000 CAN_ERR_MASK = 0x1fffffff CAN_INV_FILTER = 0x20000000 CAN_ISOTP = 0x6 CAN_MAX_DLC = 0x8 CAN_MAX_DLEN = 0x8 CAN_MCNET = 0x5 CAN_MTU = 0x10 CAN_NPROTO = 0x7 CAN_RAW = 0x1 CAN_RAW_FILTER_MAX = 0x200 CAN_RTR_FLAG = 0x40000000 CAN_SFF_ID_BITS = 0xb CAN_SFF_MASK = 0x7ff CAN_TP16 = 0x3 CAN_TP20 = 0x4 CBAUD = 0x100f CBAUDEX = 0x1000 CFLUSH = 0xf CIBAUD = 0x100f0000 CLOCAL = 0x800 CLOCK_BOOTTIME = 0x7 CLOCK_BOOTTIME_ALARM = 0x9 CLOCK_DEFAULT = 0x0 CLOCK_EXT = 0x1 CLOCK_INT = 0x2 CLOCK_MONOTONIC = 0x1 CLOCK_MONOTONIC_COARSE = 0x6 CLOCK_MONOTONIC_RAW = 0x4 CLOCK_PROCESS_CPUTIME_ID = 0x2 CLOCK_REALTIME = 0x0 CLOCK_REALTIME_ALARM = 0x8 CLOCK_REALTIME_COARSE = 0x5 CLOCK_TAI = 0xb CLOCK_THREAD_CPUTIME_ID = 0x3 CLOCK_TXFROMRX = 0x4 CLOCK_TXINT = 0x3 CLONE_CHILD_CLEARTID = 0x200000 CLONE_CHILD_SETTID = 0x1000000 CLONE_DETACHED = 0x400000 CLONE_FILES = 0x400 CLONE_FS = 0x200 CLONE_IO = 0x80000000 CLONE_NEWCGROUP = 0x2000000 CLONE_NEWIPC = 0x8000000 CLONE_NEWNET = 0x40000000 CLONE_NEWNS = 0x20000 CLONE_NEWPID = 0x20000000 CLONE_NEWUSER = 0x10000000 CLONE_NEWUTS = 0x4000000 CLONE_PARENT = 0x8000 CLONE_PARENT_SETTID = 0x100000 CLONE_PTRACE = 0x2000 CLONE_SETTLS = 0x80000 CLONE_SIGHAND = 0x800 CLONE_SYSVSEM = 0x40000 CLONE_THREAD = 0x10000 CLONE_UNTRACED = 0x800000 CLONE_VFORK = 0x4000 CLONE_VM = 0x100 CMSPAR = 0x40000000 CR0 = 0x0 CR1 = 0x200 CR2 = 0x400 CR3 = 0x600 CRDLY = 0x600 CREAD = 0x80 CRTSCTS = 0x80000000 CS5 = 0x0 CS6 = 0x10 CS7 = 0x20 CS8 = 0x30 CSIGNAL = 0xff CSIZE = 0x30 CSTART = 0x11 CSTATUS = 0x0 CSTOP = 0x13 CSTOPB = 0x40 CSUSP = 0x1a DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 DT_FIFO = 0x1 DT_LNK = 0xa DT_REG = 0x8 DT_SOCK = 0xc DT_UNKNOWN = 0x0 DT_WHT = 0xe ECHO = 0x8 ECHOCTL = 0x200 ECHOE = 0x10 ECHOK = 0x20 ECHOKE = 0x800 ECHONL = 0x40 ECHOPRT = 0x400 EFD_CLOEXEC = 0x80000 EFD_NONBLOCK = 0x800 EFD_SEMAPHORE = 0x1 ENCODING_DEFAULT = 0x0 ENCODING_FM_MARK = 0x3 ENCODING_FM_SPACE = 0x4 ENCODING_MANCHESTER = 0x5 ENCODING_NRZ = 0x1 ENCODING_NRZI = 0x2 EPOLLERR = 0x8 EPOLLET = 0x80000000 EPOLLEXCLUSIVE = 0x10000000 EPOLLHUP = 0x10 EPOLLIN = 0x1 EPOLLMSG = 0x400 EPOLLONESHOT = 0x40000000 EPOLLOUT = 0x4 EPOLLPRI = 0x2 EPOLLRDBAND = 0x80 EPOLLRDHUP = 0x2000 EPOLLRDNORM = 0x40 EPOLLWAKEUP = 0x20000000 EPOLLWRBAND = 0x200 EPOLLWRNORM = 0x100 EPOLL_CLOEXEC = 0x80000 EPOLL_CTL_ADD = 0x1 EPOLL_CTL_DEL = 0x2 EPOLL_CTL_MOD = 0x3 ETH_P_1588 = 0x88f7 ETH_P_8021AD = 0x88a8 ETH_P_8021AH = 0x88e7 ETH_P_8021Q = 0x8100 ETH_P_80221 = 0x8917 ETH_P_802_2 = 0x4 ETH_P_802_3 = 0x1 ETH_P_802_3_MIN = 0x600 ETH_P_802_EX1 = 0x88b5 ETH_P_AARP = 0x80f3 ETH_P_AF_IUCV = 0xfbfb ETH_P_ALL = 0x3 ETH_P_AOE = 0x88a2 ETH_P_ARCNET = 0x1a ETH_P_ARP = 0x806 ETH_P_ATALK = 0x809b ETH_P_ATMFATE = 0x8884 ETH_P_ATMMPOA = 0x884c ETH_P_AX25 = 0x2 ETH_P_BATMAN = 0x4305 ETH_P_BPQ = 0x8ff ETH_P_CAIF = 0xf7 ETH_P_CAN = 0xc ETH_P_CANFD = 0xd ETH_P_CONTROL = 0x16 ETH_P_CUST = 0x6006 ETH_P_DDCMP = 0x6 ETH_P_DEC = 0x6000 ETH_P_DIAG = 0x6005 ETH_P_DNA_DL = 0x6001 ETH_P_DNA_RC = 0x6002 ETH_P_DNA_RT = 0x6003 ETH_P_DSA = 0x1b ETH_P_ECONET = 0x18 ETH_P_EDSA = 0xdada ETH_P_FCOE = 0x8906 ETH_P_FIP = 0x8914 ETH_P_HDLC = 0x19 ETH_P_HSR = 0x892f ETH_P_IBOE = 0x8915 ETH_P_IEEE802154 = 0xf6 ETH_P_IEEEPUP = 0xa00 ETH_P_IEEEPUPAT = 0xa01 ETH_P_IP = 0x800 ETH_P_IPV6 = 0x86dd ETH_P_IPX = 0x8137 ETH_P_IRDA = 0x17 ETH_P_LAT = 0x6004 ETH_P_LINK_CTL = 0x886c ETH_P_LOCALTALK = 0x9 ETH_P_LOOP = 0x60 ETH_P_LOOPBACK = 0x9000 ETH_P_MACSEC = 0x88e5 ETH_P_MOBITEX = 0x15 ETH_P_MPLS_MC = 0x8848 ETH_P_MPLS_UC = 0x8847 ETH_P_MVRP = 0x88f5 ETH_P_NCSI = 0x88f8 ETH_P_PAE = 0x888e ETH_P_PAUSE = 0x8808 ETH_P_PHONET = 0xf5 ETH_P_PPPTALK = 0x10 ETH_P_PPP_DISC = 0x8863 ETH_P_PPP_MP = 0x8 ETH_P_PPP_SES = 0x8864 ETH_P_PRP = 0x88fb ETH_P_PUP = 0x200 ETH_P_PUPAT = 0x201 ETH_P_QINQ1 = 0x9100 ETH_P_QINQ2 = 0x9200 ETH_P_QINQ3 = 0x9300 ETH_P_RARP = 0x8035 ETH_P_SCA = 0x6007 ETH_P_SLOW = 0x8809 ETH_P_SNAP = 0x5 ETH_P_TDLS = 0x890d ETH_P_TEB = 0x6558 ETH_P_TIPC = 0x88ca ETH_P_TRAILER = 0x1c ETH_P_TR_802_2 = 0x11 ETH_P_TSN = 0x22f0 ETH_P_WAN_PPP = 0x7 ETH_P_WCCP = 0x883e ETH_P_X25 = 0x805 ETH_P_XDSA = 0xf8 EXTA = 0xe EXTB = 0xf EXTPROC = 0x10000 FALLOC_FL_COLLAPSE_RANGE = 0x8 FALLOC_FL_INSERT_RANGE = 0x20 FALLOC_FL_KEEP_SIZE = 0x1 FALLOC_FL_NO_HIDE_STALE = 0x4 FALLOC_FL_PUNCH_HOLE = 0x2 FALLOC_FL_UNSHARE_RANGE = 0x40 FALLOC_FL_ZERO_RANGE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 FF1 = 0x8000 FFDLY = 0x8000 FLUSHO = 0x1000 FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 FS_ENCRYPTION_MODE_INVALID = 0x0 FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 FS_KEY_DESCRIPTOR_SIZE = 0x8 FS_KEY_DESC_PREFIX = "fscrypt:" FS_KEY_DESC_PREFIX_SIZE = 0x8 FS_MAX_KEY_SIZE = 0x40 FS_POLICY_FLAGS_PAD_16 = 0x2 FS_POLICY_FLAGS_PAD_32 = 0x3 FS_POLICY_FLAGS_PAD_4 = 0x0 FS_POLICY_FLAGS_PAD_8 = 0x1 FS_POLICY_FLAGS_PAD_MASK = 0x3 FS_POLICY_FLAGS_VALID = 0x3 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0x406 F_EXLCK = 0x4 F_GETFD = 0x1 F_GETFL = 0x3 F_GETLEASE = 0x401 F_GETLK = 0xc F_GETLK64 = 0xc F_GETOWN = 0x9 F_GETOWN_EX = 0x10 F_GETPIPE_SZ = 0x408 F_GETSIG = 0xb F_LOCK = 0x1 F_NOTIFY = 0x402 F_OFD_GETLK = 0x24 F_OFD_SETLK = 0x25 F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 F_SETFD = 0x2 F_SETFL = 0x4 F_SETLEASE = 0x400 F_SETLK = 0xd F_SETLK64 = 0xd F_SETLKW = 0xe F_SETLKW64 = 0xe F_SETOWN = 0x8 F_SETOWN_EX = 0xf F_SETPIPE_SZ = 0x407 F_SETSIG = 0xa F_SHLCK = 0x8 F_TEST = 0x3 F_TLOCK = 0x2 F_ULOCK = 0x0 F_UNLCK = 0x2 F_WRLCK = 0x1 GENL_ADMIN_PERM = 0x1 GENL_CMD_CAP_DO = 0x2 GENL_CMD_CAP_DUMP = 0x4 GENL_CMD_CAP_HASPOL = 0x8 GENL_HDRLEN = 0x4 GENL_ID_CTRL = 0x10 GENL_ID_PMCRAID = 0x12 GENL_ID_VFS_DQUOT = 0x11 GENL_MAX_ID = 0x3ff GENL_MIN_ID = 0x10 GENL_NAMSIZ = 0x10 GENL_START_ALLOC = 0x13 GENL_UNS_ADMIN_PERM = 0x10 GRND_NONBLOCK = 0x1 GRND_RANDOM = 0x2 HUPCL = 0x400 IBSHIFT = 0x10 ICANON = 0x2 ICMPV6_FILTER = 0x1 ICRNL = 0x100 IEXTEN = 0x8000 IFA_F_DADFAILED = 0x8 IFA_F_DEPRECATED = 0x20 IFA_F_HOMEADDRESS = 0x10 IFA_F_MANAGETEMPADDR = 0x100 IFA_F_MCAUTOJOIN = 0x400 IFA_F_NODAD = 0x2 IFA_F_NOPREFIXROUTE = 0x200 IFA_F_OPTIMISTIC = 0x4 IFA_F_PERMANENT = 0x80 IFA_F_SECONDARY = 0x1 IFA_F_STABLE_PRIVACY = 0x800 IFA_F_TEMPORARY = 0x1 IFA_F_TENTATIVE = 0x40 IFA_MAX = 0x8 IFF_ALLMULTI = 0x200 IFF_ATTACH_QUEUE = 0x200 IFF_AUTOMEDIA = 0x4000 IFF_BROADCAST = 0x2 IFF_DEBUG = 0x4 IFF_DETACH_QUEUE = 0x400 IFF_DORMANT = 0x20000 IFF_DYNAMIC = 0x8000 IFF_ECHO = 0x40000 IFF_LOOPBACK = 0x8 IFF_LOWER_UP = 0x10000 IFF_MASTER = 0x400 IFF_MULTICAST = 0x1000 IFF_MULTI_QUEUE = 0x100 IFF_NOARP = 0x80 IFF_NOFILTER = 0x1000 IFF_NOTRAILERS = 0x20 IFF_NO_PI = 0x1000 IFF_ONE_QUEUE = 0x2000 IFF_PERSIST = 0x800 IFF_POINTOPOINT = 0x10 IFF_PORTSEL = 0x2000 IFF_PROMISC = 0x100 IFF_RUNNING = 0x40 IFF_SLAVE = 0x800 IFF_TAP = 0x2 IFF_TUN = 0x1 IFF_TUN_EXCL = 0x8000 IFF_UP = 0x1 IFF_VNET_HDR = 0x4000 IFF_VOLATILE = 0x70c5a IFNAMSIZ = 0x10 IGNBRK = 0x1 IGNCR = 0x80 IGNPAR = 0x4 IMAXBEL = 0x2000 INLCR = 0x40 INPCK = 0x10 IN_ACCESS = 0x1 IN_ALL_EVENTS = 0xfff IN_ATTRIB = 0x4 IN_CLASSA_HOST = 0xffffff IN_CLASSA_MAX = 0x80 IN_CLASSA_NET = 0xff000000 IN_CLASSA_NSHIFT = 0x18 IN_CLASSB_HOST = 0xffff IN_CLASSB_MAX = 0x10000 IN_CLASSB_NET = 0xffff0000 IN_CLASSB_NSHIFT = 0x10 IN_CLASSC_HOST = 0xff IN_CLASSC_NET = 0xffffff00 IN_CLASSC_NSHIFT = 0x8 IN_CLOEXEC = 0x80000 IN_CLOSE = 0x18 IN_CLOSE_NOWRITE = 0x10 IN_CLOSE_WRITE = 0x8 IN_CREATE = 0x100 IN_DELETE = 0x200 IN_DELETE_SELF = 0x400 IN_DONT_FOLLOW = 0x2000000 IN_EXCL_UNLINK = 0x4000000 IN_IGNORED = 0x8000 IN_ISDIR = 0x40000000 IN_LOOPBACKNET = 0x7f IN_MASK_ADD = 0x20000000 IN_MODIFY = 0x2 IN_MOVE = 0xc0 IN_MOVED_FROM = 0x40 IN_MOVED_TO = 0x80 IN_MOVE_SELF = 0x800 IN_NONBLOCK = 0x800 IN_ONESHOT = 0x80000000 IN_ONLYDIR = 0x1000000 IN_OPEN = 0x20 IN_Q_OVERFLOW = 0x4000 IN_UNMOUNT = 0x2000 IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 IPPROTO_AH = 0x33 IPPROTO_BEETPH = 0x5e IPPROTO_COMP = 0x6c IPPROTO_DCCP = 0x21 IPPROTO_DSTOPTS = 0x3c IPPROTO_EGP = 0x8 IPPROTO_ENCAP = 0x62 IPPROTO_ESP = 0x32 IPPROTO_FRAGMENT = 0x2c IPPROTO_GRE = 0x2f IPPROTO_HOPOPTS = 0x0 IPPROTO_ICMP = 0x1 IPPROTO_ICMPV6 = 0x3a IPPROTO_IDP = 0x16 IPPROTO_IGMP = 0x2 IPPROTO_IP = 0x0 IPPROTO_IPIP = 0x4 IPPROTO_IPV6 = 0x29 IPPROTO_MH = 0x87 IPPROTO_MPLS = 0x89 IPPROTO_MTP = 0x5c IPPROTO_NONE = 0x3b IPPROTO_PIM = 0x67 IPPROTO_PUP = 0xc IPPROTO_RAW = 0xff IPPROTO_ROUTING = 0x2b IPPROTO_RSVP = 0x2e IPPROTO_SCTP = 0x84 IPPROTO_TCP = 0x6 IPPROTO_TP = 0x1d IPPROTO_UDP = 0x11 IPPROTO_UDPLITE = 0x88 IPV6_2292DSTOPTS = 0x4 IPV6_2292HOPLIMIT = 0x8 IPV6_2292HOPOPTS = 0x3 IPV6_2292PKTINFO = 0x2 IPV6_2292PKTOPTIONS = 0x6 IPV6_2292RTHDR = 0x5 IPV6_ADDRFORM = 0x1 IPV6_ADDR_PREFERENCES = 0x48 IPV6_ADD_MEMBERSHIP = 0x14 IPV6_AUTHHDR = 0xa IPV6_AUTOFLOWLABEL = 0x46 IPV6_CHECKSUM = 0x7 IPV6_DONTFRAG = 0x3e IPV6_DROP_MEMBERSHIP = 0x15 IPV6_DSTOPTS = 0x3b IPV6_HDRINCL = 0x24 IPV6_HOPLIMIT = 0x34 IPV6_HOPOPTS = 0x36 IPV6_IPSEC_POLICY = 0x22 IPV6_JOIN_ANYCAST = 0x1b IPV6_JOIN_GROUP = 0x14 IPV6_LEAVE_ANYCAST = 0x1c IPV6_LEAVE_GROUP = 0x15 IPV6_MINHOPCOUNT = 0x49 IPV6_MTU = 0x18 IPV6_MTU_DISCOVER = 0x17 IPV6_MULTICAST_HOPS = 0x12 IPV6_MULTICAST_IF = 0x11 IPV6_MULTICAST_LOOP = 0x13 IPV6_NEXTHOP = 0x9 IPV6_ORIGDSTADDR = 0x4a IPV6_PATHMTU = 0x3d IPV6_PKTINFO = 0x32 IPV6_PMTUDISC_DO = 0x2 IPV6_PMTUDISC_DONT = 0x0 IPV6_PMTUDISC_INTERFACE = 0x4 IPV6_PMTUDISC_OMIT = 0x5 IPV6_PMTUDISC_PROBE = 0x3 IPV6_PMTUDISC_WANT = 0x1 IPV6_RECVDSTOPTS = 0x3a IPV6_RECVERR = 0x19 IPV6_RECVFRAGSIZE = 0x4d IPV6_RECVHOPLIMIT = 0x33 IPV6_RECVHOPOPTS = 0x35 IPV6_RECVORIGDSTADDR = 0x4a IPV6_RECVPATHMTU = 0x3c IPV6_RECVPKTINFO = 0x31 IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 IPV6_RTHDR_STRICT = 0x1 IPV6_RTHDR_TYPE_0 = 0x0 IPV6_RXDSTOPTS = 0x3b IPV6_RXHOPOPTS = 0x36 IPV6_TCLASS = 0x43 IPV6_TRANSPARENT = 0x4b IPV6_UNICAST_HOPS = 0x10 IPV6_UNICAST_IF = 0x4c IPV6_V6ONLY = 0x1a IPV6_XFRM_POLICY = 0x23 IP_ADD_MEMBERSHIP = 0x23 IP_ADD_SOURCE_MEMBERSHIP = 0x27 IP_BIND_ADDRESS_NO_PORT = 0x18 IP_BLOCK_SOURCE = 0x26 IP_CHECKSUM = 0x17 IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 IP_DROP_MEMBERSHIP = 0x24 IP_DROP_SOURCE_MEMBERSHIP = 0x28 IP_FREEBIND = 0xf IP_HDRINCL = 0x3 IP_IPSEC_POLICY = 0x10 IP_MAXPACKET = 0xffff IP_MAX_MEMBERSHIPS = 0x14 IP_MF = 0x2000 IP_MINTTL = 0x15 IP_MSFILTER = 0x29 IP_MSS = 0x240 IP_MTU = 0xe IP_MTU_DISCOVER = 0xa IP_MULTICAST_ALL = 0x31 IP_MULTICAST_IF = 0x20 IP_MULTICAST_LOOP = 0x22 IP_MULTICAST_TTL = 0x21 IP_NODEFRAG = 0x16 IP_OFFMASK = 0x1fff IP_OPTIONS = 0x4 IP_ORIGDSTADDR = 0x14 IP_PASSSEC = 0x12 IP_PKTINFO = 0x8 IP_PKTOPTIONS = 0x9 IP_PMTUDISC = 0xa IP_PMTUDISC_DO = 0x2 IP_PMTUDISC_DONT = 0x0 IP_PMTUDISC_INTERFACE = 0x4 IP_PMTUDISC_OMIT = 0x5 IP_PMTUDISC_PROBE = 0x3 IP_PMTUDISC_WANT = 0x1 IP_RECVERR = 0xb IP_RECVFRAGSIZE = 0x19 IP_RECVOPTS = 0x6 IP_RECVORIGDSTADDR = 0x14 IP_RECVRETOPTS = 0x7 IP_RECVTOS = 0xd IP_RECVTTL = 0xc IP_RETOPTS = 0x7 IP_RF = 0x8000 IP_ROUTER_ALERT = 0x5 IP_TOS = 0x1 IP_TRANSPARENT = 0x13 IP_TTL = 0x2 IP_UNBLOCK_SOURCE = 0x25 IP_UNICAST_IF = 0x32 IP_XFRM_POLICY = 0x11 ISIG = 0x1 ISTRIP = 0x20 IUCLC = 0x200 IUTF8 = 0x4000 IXANY = 0x800 IXOFF = 0x1000 IXON = 0x400 KEYCTL_ASSUME_AUTHORITY = 0x10 KEYCTL_CHOWN = 0x4 KEYCTL_CLEAR = 0x7 KEYCTL_DESCRIBE = 0x6 KEYCTL_DH_COMPUTE = 0x17 KEYCTL_GET_KEYRING_ID = 0x0 KEYCTL_GET_PERSISTENT = 0x16 KEYCTL_GET_SECURITY = 0x11 KEYCTL_INSTANTIATE = 0xc KEYCTL_INSTANTIATE_IOV = 0x14 KEYCTL_INVALIDATE = 0x15 KEYCTL_JOIN_SESSION_KEYRING = 0x1 KEYCTL_LINK = 0x8 KEYCTL_NEGATE = 0xd KEYCTL_READ = 0xb KEYCTL_REJECT = 0x13 KEYCTL_RESTRICT_KEYRING = 0x1d KEYCTL_REVOKE = 0x3 KEYCTL_SEARCH = 0xa KEYCTL_SESSION_TO_PARENT = 0x12 KEYCTL_SETPERM = 0x5 KEYCTL_SET_REQKEY_KEYRING = 0xe KEYCTL_SET_TIMEOUT = 0xf KEYCTL_UNLINK = 0x9 KEYCTL_UPDATE = 0x2 KEY_REQKEY_DEFL_DEFAULT = 0x0 KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 KEY_REQKEY_DEFL_NO_CHANGE = -0x1 KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 KEY_REQKEY_DEFL_USER_KEYRING = 0x4 KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 KEY_SPEC_GROUP_KEYRING = -0x6 KEY_SPEC_PROCESS_KEYRING = -0x2 KEY_SPEC_REQKEY_AUTH_KEY = -0x7 KEY_SPEC_REQUESTOR_KEYRING = -0x8 KEY_SPEC_SESSION_KEYRING = -0x3 KEY_SPEC_THREAD_KEYRING = -0x1 KEY_SPEC_USER_KEYRING = -0x4 KEY_SPEC_USER_SESSION_KEYRING = -0x5 LINUX_REBOOT_CMD_CAD_OFF = 0x0 LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef LINUX_REBOOT_CMD_HALT = 0xcdef0123 LINUX_REBOOT_CMD_KEXEC = 0x45584543 LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc LINUX_REBOOT_CMD_RESTART = 0x1234567 LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 LINUX_REBOOT_MAGIC1 = 0xfee1dead LINUX_REBOOT_MAGIC2 = 0x28121969 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 MADV_DONTFORK = 0xa MADV_DONTNEED = 0x4 MADV_FREE = 0x8 MADV_HUGEPAGE = 0xe MADV_HWPOISON = 0x64 MADV_MERGEABLE = 0xc MADV_NOHUGEPAGE = 0xf MADV_NORMAL = 0x0 MADV_RANDOM = 0x1 MADV_REMOVE = 0x9 MADV_SEQUENTIAL = 0x2 MADV_UNMERGEABLE = 0xd MADV_WILLNEED = 0x3 MAP_ANON = 0x20 MAP_ANONYMOUS = 0x20 MAP_DENYWRITE = 0x800 MAP_EXECUTABLE = 0x1000 MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_GROWSDOWN = 0x100 MAP_HUGETLB = 0x40000 MAP_HUGE_MASK = 0x3f MAP_HUGE_SHIFT = 0x1a MAP_LOCKED = 0x2000 MAP_NONBLOCK = 0x10000 MAP_NORESERVE = 0x4000 MAP_POPULATE = 0x8000 MAP_PRIVATE = 0x2 MAP_SHARED = 0x1 MAP_STACK = 0x20000 MAP_TYPE = 0xf MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MCL_ONFAULT = 0x4 MNT_DETACH = 0x2 MNT_EXPIRE = 0x4 MNT_FORCE = 0x1 MSG_BATCH = 0x40000 MSG_CMSG_CLOEXEC = 0x40000000 MSG_CONFIRM = 0x800 MSG_CTRUNC = 0x8 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x40 MSG_EOR = 0x80 MSG_ERRQUEUE = 0x2000 MSG_FASTOPEN = 0x20000000 MSG_FIN = 0x200 MSG_MORE = 0x8000 MSG_NOSIGNAL = 0x4000 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_PROXY = 0x10 MSG_RST = 0x1000 MSG_SYN = 0x400 MSG_TRUNC = 0x20 MSG_TRYHARD = 0x4 MSG_WAITALL = 0x100 MSG_WAITFORONE = 0x10000 MS_ACTIVE = 0x40000000 MS_ASYNC = 0x1 MS_BIND = 0x1000 MS_BORN = 0x20000000 MS_DIRSYNC = 0x80 MS_INVALIDATE = 0x2 MS_I_VERSION = 0x800000 MS_KERNMOUNT = 0x400000 MS_LAZYTIME = 0x2000000 MS_MANDLOCK = 0x40 MS_MGC_MSK = 0xffff0000 MS_MGC_VAL = 0xc0ed0000 MS_MOVE = 0x2000 MS_NOATIME = 0x400 MS_NODEV = 0x4 MS_NODIRATIME = 0x800 MS_NOEXEC = 0x8 MS_NOREMOTELOCK = 0x8000000 MS_NOSEC = 0x10000000 MS_NOSUID = 0x2 MS_NOUSER = -0x80000000 MS_POSIXACL = 0x10000 MS_PRIVATE = 0x40000 MS_RDONLY = 0x1 MS_REC = 0x4000 MS_RELATIME = 0x200000 MS_REMOUNT = 0x20 MS_RMT_MASK = 0x2800051 MS_SHARED = 0x100000 MS_SILENT = 0x8000 MS_SLAVE = 0x80000 MS_STRICTATIME = 0x1000000 MS_SUBMOUNT = 0x4000000 MS_SYNC = 0x4 MS_SYNCHRONOUS = 0x10 MS_UNBINDABLE = 0x20000 MS_VERBOSE = 0x8000 NAME_MAX = 0xff NETLINK_ADD_MEMBERSHIP = 0x1 NETLINK_AUDIT = 0x9 NETLINK_BROADCAST_ERROR = 0x4 NETLINK_CAP_ACK = 0xa NETLINK_CONNECTOR = 0xb NETLINK_CRYPTO = 0x15 NETLINK_DNRTMSG = 0xe NETLINK_DROP_MEMBERSHIP = 0x2 NETLINK_ECRYPTFS = 0x13 NETLINK_EXT_ACK = 0xb NETLINK_FIB_LOOKUP = 0xa NETLINK_FIREWALL = 0x3 NETLINK_GENERIC = 0x10 NETLINK_INET_DIAG = 0x4 NETLINK_IP6_FW = 0xd NETLINK_ISCSI = 0x8 NETLINK_KOBJECT_UEVENT = 0xf NETLINK_LISTEN_ALL_NSID = 0x8 NETLINK_LIST_MEMBERSHIPS = 0x9 NETLINK_NETFILTER = 0xc NETLINK_NFLOG = 0x5 NETLINK_NO_ENOBUFS = 0x5 NETLINK_PKTINFO = 0x3 NETLINK_RDMA = 0x14 NETLINK_ROUTE = 0x0 NETLINK_RX_RING = 0x6 NETLINK_SCSITRANSPORT = 0x12 NETLINK_SELINUX = 0x7 NETLINK_SMC = 0x16 NETLINK_SOCK_DIAG = 0x4 NETLINK_TX_RING = 0x7 NETLINK_UNUSED = 0x1 NETLINK_USERSOCK = 0x2 NETLINK_XFRM = 0x6 NL0 = 0x0 NL1 = 0x100 NLA_ALIGNTO = 0x4 NLA_F_NESTED = 0x8000 NLA_F_NET_BYTEORDER = 0x4000 NLA_HDRLEN = 0x4 NLDLY = 0x100 NLMSG_ALIGNTO = 0x4 NLMSG_DONE = 0x3 NLMSG_ERROR = 0x2 NLMSG_HDRLEN = 0x10 NLMSG_MIN_TYPE = 0x10 NLMSG_NOOP = 0x1 NLMSG_OVERRUN = 0x4 NLM_F_ACK = 0x4 NLM_F_ACK_TLVS = 0x200 NLM_F_APPEND = 0x800 NLM_F_ATOMIC = 0x400 NLM_F_CAPPED = 0x100 NLM_F_CREATE = 0x400 NLM_F_DUMP = 0x300 NLM_F_DUMP_FILTERED = 0x20 NLM_F_DUMP_INTR = 0x10 NLM_F_ECHO = 0x8 NLM_F_EXCL = 0x200 NLM_F_MATCH = 0x200 NLM_F_MULTI = 0x2 NLM_F_REPLACE = 0x100 NLM_F_REQUEST = 0x1 NLM_F_ROOT = 0x100 NOFLSH = 0x80 OCRNL = 0x8 OFDEL = 0x80 OFILL = 0x40 OLCUC = 0x2 ONLCR = 0x4 ONLRET = 0x20 ONOCR = 0x10 OPOST = 0x1 O_ACCMODE = 0x3 O_APPEND = 0x400 O_ASYNC = 0x2000 O_CLOEXEC = 0x80000 O_CREAT = 0x40 O_DIRECT = 0x10000 O_DIRECTORY = 0x4000 O_DSYNC = 0x1000 O_EXCL = 0x80 O_FSYNC = 0x101000 O_LARGEFILE = 0x20000 O_NDELAY = 0x800 O_NOATIME = 0x40000 O_NOCTTY = 0x100 O_NOFOLLOW = 0x8000 O_NONBLOCK = 0x800 O_PATH = 0x200000 O_RDONLY = 0x0 O_RDWR = 0x2 O_RSYNC = 0x101000 O_SYNC = 0x101000 O_TMPFILE = 0x404000 O_TRUNC = 0x200 O_WRONLY = 0x1 PACKET_ADD_MEMBERSHIP = 0x1 PACKET_AUXDATA = 0x8 PACKET_BROADCAST = 0x1 PACKET_COPY_THRESH = 0x7 PACKET_DROP_MEMBERSHIP = 0x2 PACKET_FANOUT = 0x12 PACKET_FANOUT_CBPF = 0x6 PACKET_FANOUT_CPU = 0x2 PACKET_FANOUT_DATA = 0x16 PACKET_FANOUT_EBPF = 0x7 PACKET_FANOUT_FLAG_DEFRAG = 0x8000 PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 PACKET_FANOUT_HASH = 0x0 PACKET_FANOUT_LB = 0x1 PACKET_FANOUT_QM = 0x5 PACKET_FANOUT_RND = 0x4 PACKET_FANOUT_ROLLOVER = 0x3 PACKET_FASTROUTE = 0x6 PACKET_HDRLEN = 0xb PACKET_HOST = 0x0 PACKET_KERNEL = 0x7 PACKET_LOOPBACK = 0x5 PACKET_LOSS = 0xe PACKET_MR_ALLMULTI = 0x2 PACKET_MR_MULTICAST = 0x0 PACKET_MR_PROMISC = 0x1 PACKET_MR_UNICAST = 0x3 PACKET_MULTICAST = 0x2 PACKET_ORIGDEV = 0x9 PACKET_OTHERHOST = 0x3 PACKET_OUTGOING = 0x4 PACKET_QDISC_BYPASS = 0x14 PACKET_RECV_OUTPUT = 0x3 PACKET_RESERVE = 0xc PACKET_ROLLOVER_STATS = 0x15 PACKET_RX_RING = 0x5 PACKET_STATISTICS = 0x6 PACKET_TIMESTAMP = 0x11 PACKET_TX_HAS_OFF = 0x13 PACKET_TX_RING = 0xd PACKET_TX_TIMESTAMP = 0x10 PACKET_USER = 0x6 PACKET_VERSION = 0xa PACKET_VNET_HDR = 0xf PARENB = 0x100 PARITY_CRC16_PR0 = 0x2 PARITY_CRC16_PR0_CCITT = 0x4 PARITY_CRC16_PR1 = 0x3 PARITY_CRC16_PR1_CCITT = 0x5 PARITY_CRC32_PR0_CCITT = 0x6 PARITY_CRC32_PR1_CCITT = 0x7 PARITY_DEFAULT = 0x0 PARITY_NONE = 0x1 PARMRK = 0x8 PARODD = 0x200 PENDIN = 0x4000 PERF_EVENT_IOC_DISABLE = 0x2401 PERF_EVENT_IOC_ENABLE = 0x2400 PERF_EVENT_IOC_ID = 0x80042407 PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 PERF_EVENT_IOC_PERIOD = 0x40082404 PERF_EVENT_IOC_REFRESH = 0x2402 PERF_EVENT_IOC_RESET = 0x2403 PERF_EVENT_IOC_SET_BPF = 0x40042408 PERF_EVENT_IOC_SET_FILTER = 0x40042406 PERF_EVENT_IOC_SET_OUTPUT = 0x2405 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 PROT_EXEC = 0x4 PROT_GROWSDOWN = 0x1000000 PROT_GROWSUP = 0x2000000 PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 PR_CAPBSET_DROP = 0x18 PR_CAPBSET_READ = 0x17 PR_CAP_AMBIENT = 0x2f PR_CAP_AMBIENT_CLEAR_ALL = 0x4 PR_CAP_AMBIENT_IS_SET = 0x1 PR_CAP_AMBIENT_LOWER = 0x3 PR_CAP_AMBIENT_RAISE = 0x2 PR_ENDIAN_BIG = 0x0 PR_ENDIAN_LITTLE = 0x1 PR_ENDIAN_PPC_LITTLE = 0x2 PR_FPEMU_NOPRINT = 0x1 PR_FPEMU_SIGFPE = 0x2 PR_FP_EXC_ASYNC = 0x2 PR_FP_EXC_DISABLED = 0x0 PR_FP_EXC_DIV = 0x10000 PR_FP_EXC_INV = 0x100000 PR_FP_EXC_NONRECOV = 0x1 PR_FP_EXC_OVF = 0x20000 PR_FP_EXC_PRECISE = 0x3 PR_FP_EXC_RES = 0x80000 PR_FP_EXC_SW_ENABLE = 0x80 PR_FP_EXC_UND = 0x40000 PR_FP_MODE_FR = 0x1 PR_FP_MODE_FRE = 0x2 PR_GET_CHILD_SUBREAPER = 0x25 PR_GET_DUMPABLE = 0x3 PR_GET_ENDIAN = 0x13 PR_GET_FPEMU = 0x9 PR_GET_FPEXC = 0xb PR_GET_FP_MODE = 0x2e PR_GET_KEEPCAPS = 0x7 PR_GET_NAME = 0x10 PR_GET_NO_NEW_PRIVS = 0x27 PR_GET_PDEATHSIG = 0x2 PR_GET_SECCOMP = 0x15 PR_GET_SECUREBITS = 0x1b PR_GET_THP_DISABLE = 0x2a PR_GET_TID_ADDRESS = 0x28 PR_GET_TIMERSLACK = 0x1e PR_GET_TIMING = 0xd PR_GET_TSC = 0x19 PR_GET_UNALIGN = 0x5 PR_MCE_KILL = 0x21 PR_MCE_KILL_CLEAR = 0x0 PR_MCE_KILL_DEFAULT = 0x2 PR_MCE_KILL_EARLY = 0x1 PR_MCE_KILL_GET = 0x22 PR_MCE_KILL_LATE = 0x0 PR_MCE_KILL_SET = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b PR_SET_CHILD_SUBREAPER = 0x24 PR_SET_DUMPABLE = 0x4 PR_SET_ENDIAN = 0x14 PR_SET_FPEMU = 0xa PR_SET_FPEXC = 0xc PR_SET_FP_MODE = 0x2d PR_SET_KEEPCAPS = 0x8 PR_SET_MM = 0x23 PR_SET_MM_ARG_END = 0x9 PR_SET_MM_ARG_START = 0x8 PR_SET_MM_AUXV = 0xc PR_SET_MM_BRK = 0x7 PR_SET_MM_END_CODE = 0x2 PR_SET_MM_END_DATA = 0x4 PR_SET_MM_ENV_END = 0xb PR_SET_MM_ENV_START = 0xa PR_SET_MM_EXE_FILE = 0xd PR_SET_MM_MAP = 0xe PR_SET_MM_MAP_SIZE = 0xf PR_SET_MM_START_BRK = 0x6 PR_SET_MM_START_CODE = 0x1 PR_SET_MM_START_DATA = 0x3 PR_SET_MM_START_STACK = 0x5 PR_SET_NAME = 0xf PR_SET_NO_NEW_PRIVS = 0x26 PR_SET_PDEATHSIG = 0x1 PR_SET_PTRACER = 0x59616d61 PR_SET_PTRACER_ANY = 0xffffffff PR_SET_SECCOMP = 0x16 PR_SET_SECUREBITS = 0x1c PR_SET_THP_DISABLE = 0x29 PR_SET_TIMERSLACK = 0x1d PR_SET_TIMING = 0xe PR_SET_TSC = 0x1a PR_SET_UNALIGN = 0x6 PR_TASK_PERF_EVENTS_DISABLE = 0x1f PR_TASK_PERF_EVENTS_ENABLE = 0x20 PR_TIMING_STATISTICAL = 0x0 PR_TIMING_TIMESTAMP = 0x1 PR_TSC_ENABLE = 0x1 PR_TSC_SIGSEGV = 0x2 PR_UNALIGN_NOPRINT = 0x1 PR_UNALIGN_SIGBUS = 0x2 PTRACE_ATTACH = 0x10 PTRACE_CONT = 0x7 PTRACE_DETACH = 0x11 PTRACE_EVENT_CLONE = 0x3 PTRACE_EVENT_EXEC = 0x4 PTRACE_EVENT_EXIT = 0x6 PTRACE_EVENT_FORK = 0x1 PTRACE_EVENT_SECCOMP = 0x7 PTRACE_EVENT_STOP = 0x80 PTRACE_EVENT_VFORK = 0x2 PTRACE_EVENT_VFORK_DONE = 0x5 PTRACE_GETCRUNCHREGS = 0x19 PTRACE_GETEVENTMSG = 0x4201 PTRACE_GETFPREGS = 0xe PTRACE_GETHBPREGS = 0x1d PTRACE_GETREGS = 0xc PTRACE_GETREGSET = 0x4204 PTRACE_GETSIGINFO = 0x4202 PTRACE_GETSIGMASK = 0x420a PTRACE_GETVFPREGS = 0x1b PTRACE_GETWMMXREGS = 0x12 PTRACE_GET_THREAD_AREA = 0x16 PTRACE_INTERRUPT = 0x4207 PTRACE_KILL = 0x8 PTRACE_LISTEN = 0x4208 PTRACE_OLDSETOPTIONS = 0x15 PTRACE_O_EXITKILL = 0x100000 PTRACE_O_MASK = 0x3000ff PTRACE_O_SUSPEND_SECCOMP = 0x200000 PTRACE_O_TRACECLONE = 0x8 PTRACE_O_TRACEEXEC = 0x10 PTRACE_O_TRACEEXIT = 0x40 PTRACE_O_TRACEFORK = 0x2 PTRACE_O_TRACESECCOMP = 0x80 PTRACE_O_TRACESYSGOOD = 0x1 PTRACE_O_TRACEVFORK = 0x4 PTRACE_O_TRACEVFORKDONE = 0x20 PTRACE_PEEKDATA = 0x2 PTRACE_PEEKSIGINFO = 0x4209 PTRACE_PEEKSIGINFO_SHARED = 0x1 PTRACE_PEEKTEXT = 0x1 PTRACE_PEEKUSR = 0x3 PTRACE_POKEDATA = 0x5 PTRACE_POKETEXT = 0x4 PTRACE_POKEUSR = 0x6 PTRACE_SECCOMP_GET_FILTER = 0x420c PTRACE_SEIZE = 0x4206 PTRACE_SETCRUNCHREGS = 0x1a PTRACE_SETFPREGS = 0xf PTRACE_SETHBPREGS = 0x1e PTRACE_SETOPTIONS = 0x4200 PTRACE_SETREGS = 0xd PTRACE_SETREGSET = 0x4205 PTRACE_SETSIGINFO = 0x4203 PTRACE_SETSIGMASK = 0x420b PTRACE_SETVFPREGS = 0x1c PTRACE_SETWMMXREGS = 0x13 PTRACE_SET_SYSCALL = 0x17 PTRACE_SINGLESTEP = 0x9 PTRACE_SYSCALL = 0x18 PTRACE_TRACEME = 0x0 PT_DATA_ADDR = 0x10004 PT_TEXT_ADDR = 0x10000 PT_TEXT_END_ADDR = 0x10008 RLIMIT_AS = 0x9 RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 RLIMIT_LOCKS = 0xa RLIMIT_MEMLOCK = 0x8 RLIMIT_MSGQUEUE = 0xc RLIMIT_NICE = 0xd RLIMIT_NOFILE = 0x7 RLIMIT_NPROC = 0x6 RLIMIT_RSS = 0x5 RLIMIT_RTPRIO = 0xe RLIMIT_RTTIME = 0xf RLIMIT_SIGPENDING = 0xb RLIMIT_STACK = 0x3 RLIM_INFINITY = 0xffffffffffffffff RTAX_ADVMSS = 0x8 RTAX_CC_ALGO = 0x10 RTAX_CWND = 0x7 RTAX_FEATURES = 0xc RTAX_FEATURE_ALLFRAG = 0x8 RTAX_FEATURE_ECN = 0x1 RTAX_FEATURE_MASK = 0xf RTAX_FEATURE_SACK = 0x2 RTAX_FEATURE_TIMESTAMP = 0x4 RTAX_HOPLIMIT = 0xa RTAX_INITCWND = 0xb RTAX_INITRWND = 0xe RTAX_LOCK = 0x1 RTAX_MAX = 0x10 RTAX_MTU = 0x2 RTAX_QUICKACK = 0xf RTAX_REORDERING = 0x9 RTAX_RTO_MIN = 0xd RTAX_RTT = 0x4 RTAX_RTTVAR = 0x5 RTAX_SSTHRESH = 0x6 RTAX_UNSPEC = 0x0 RTAX_WINDOW = 0x3 RTA_ALIGNTO = 0x4 RTA_MAX = 0x1a RTCF_DIRECTSRC = 0x4000000 RTCF_DOREDIRECT = 0x1000000 RTCF_LOG = 0x2000000 RTCF_MASQ = 0x400000 RTCF_NAT = 0x800000 RTCF_VALVE = 0x200000 RTF_ADDRCLASSMASK = 0xf8000000 RTF_ADDRCONF = 0x40000 RTF_ALLONLINK = 0x20000 RTF_BROADCAST = 0x10000000 RTF_CACHE = 0x1000000 RTF_DEFAULT = 0x10000 RTF_DYNAMIC = 0x10 RTF_FLOW = 0x2000000 RTF_GATEWAY = 0x2 RTF_HOST = 0x4 RTF_INTERFACE = 0x40000000 RTF_IRTT = 0x100 RTF_LINKRT = 0x100000 RTF_LOCAL = 0x80000000 RTF_MODIFIED = 0x20 RTF_MSS = 0x40 RTF_MTU = 0x40 RTF_MULTICAST = 0x20000000 RTF_NAT = 0x8000000 RTF_NOFORWARD = 0x1000 RTF_NONEXTHOP = 0x200000 RTF_NOPMTUDISC = 0x4000 RTF_POLICY = 0x4000000 RTF_REINSTATE = 0x8 RTF_REJECT = 0x200 RTF_STATIC = 0x400 RTF_THROW = 0x2000 RTF_UP = 0x1 RTF_WINDOW = 0x80 RTF_XRESOLVE = 0x800 RTM_BASE = 0x10 RTM_DELACTION = 0x31 RTM_DELADDR = 0x15 RTM_DELADDRLABEL = 0x49 RTM_DELLINK = 0x11 RTM_DELMDB = 0x55 RTM_DELNEIGH = 0x1d RTM_DELNETCONF = 0x51 RTM_DELNSID = 0x59 RTM_DELQDISC = 0x25 RTM_DELROUTE = 0x19 RTM_DELRULE = 0x21 RTM_DELTCLASS = 0x29 RTM_DELTFILTER = 0x2d RTM_F_CLONED = 0x200 RTM_F_EQUALIZE = 0x400 RTM_F_FIB_MATCH = 0x2000 RTM_F_LOOKUP_TABLE = 0x1000 RTM_F_NOTIFY = 0x100 RTM_F_PREFIX = 0x800 RTM_GETACTION = 0x32 RTM_GETADDR = 0x16 RTM_GETADDRLABEL = 0x4a RTM_GETANYCAST = 0x3e RTM_GETDCB = 0x4e RTM_GETLINK = 0x12 RTM_GETMDB = 0x56 RTM_GETMULTICAST = 0x3a RTM_GETNEIGH = 0x1e RTM_GETNEIGHTBL = 0x42 RTM_GETNETCONF = 0x52 RTM_GETNSID = 0x5a RTM_GETQDISC = 0x26 RTM_GETROUTE = 0x1a RTM_GETRULE = 0x22 RTM_GETSTATS = 0x5e RTM_GETTCLASS = 0x2a RTM_GETTFILTER = 0x2e RTM_MAX = 0x63 RTM_NEWACTION = 0x30 RTM_NEWADDR = 0x14 RTM_NEWADDRLABEL = 0x48 RTM_NEWCACHEREPORT = 0x60 RTM_NEWLINK = 0x10 RTM_NEWMDB = 0x54 RTM_NEWNDUSEROPT = 0x44 RTM_NEWNEIGH = 0x1c RTM_NEWNEIGHTBL = 0x40 RTM_NEWNETCONF = 0x50 RTM_NEWNSID = 0x58 RTM_NEWPREFIX = 0x34 RTM_NEWQDISC = 0x24 RTM_NEWROUTE = 0x18 RTM_NEWRULE = 0x20 RTM_NEWSTATS = 0x5c RTM_NEWTCLASS = 0x28 RTM_NEWTFILTER = 0x2c RTM_NR_FAMILIES = 0x15 RTM_NR_MSGTYPES = 0x54 RTM_SETDCB = 0x4f RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 RTNH_ALIGNTO = 0x4 RTNH_COMPARE_MASK = 0x19 RTNH_F_DEAD = 0x1 RTNH_F_LINKDOWN = 0x10 RTNH_F_OFFLOAD = 0x8 RTNH_F_ONLINK = 0x4 RTNH_F_PERVASIVE = 0x2 RTNH_F_UNRESOLVED = 0x20 RTN_MAX = 0xb RTPROT_BABEL = 0x2a RTPROT_BIRD = 0xc RTPROT_BOOT = 0x3 RTPROT_DHCP = 0x10 RTPROT_DNROUTED = 0xd RTPROT_GATED = 0x8 RTPROT_KERNEL = 0x2 RTPROT_MROUTED = 0x11 RTPROT_MRT = 0xa RTPROT_NTK = 0xf RTPROT_RA = 0x9 RTPROT_REDIRECT = 0x1 RTPROT_STATIC = 0x4 RTPROT_UNSPEC = 0x0 RTPROT_XORP = 0xe RTPROT_ZEBRA = 0xb RT_CLASS_DEFAULT = 0xfd RT_CLASS_LOCAL = 0xff RT_CLASS_MAIN = 0xfe RT_CLASS_MAX = 0xff RT_CLASS_UNSPEC = 0x0 RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 RUSAGE_THREAD = 0x1 SCM_CREDENTIALS = 0x2 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x1d SCM_TIMESTAMPING = 0x25 SCM_TIMESTAMPING_OPT_STATS = 0x36 SCM_TIMESTAMPING_PKTINFO = 0x3a SCM_TIMESTAMPNS = 0x23 SCM_WIFI_STATUS = 0x29 SECCOMP_MODE_DISABLED = 0x0 SECCOMP_MODE_FILTER = 0x2 SECCOMP_MODE_STRICT = 0x1 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 SIOCADDDLCI = 0x8980 SIOCADDMULTI = 0x8931 SIOCADDRT = 0x890b SIOCATMARK = 0x8905 SIOCBONDCHANGEACTIVE = 0x8995 SIOCBONDENSLAVE = 0x8990 SIOCBONDINFOQUERY = 0x8994 SIOCBONDRELEASE = 0x8991 SIOCBONDSETHWADDR = 0x8992 SIOCBONDSLAVEINFOQUERY = 0x8993 SIOCBRADDBR = 0x89a0 SIOCBRADDIF = 0x89a2 SIOCBRDELBR = 0x89a1 SIOCBRDELIF = 0x89a3 SIOCDARP = 0x8953 SIOCDELDLCI = 0x8981 SIOCDELMULTI = 0x8932 SIOCDELRT = 0x890c SIOCDEVPRIVATE = 0x89f0 SIOCDIFADDR = 0x8936 SIOCDRARP = 0x8960 SIOCETHTOOL = 0x8946 SIOCGARP = 0x8954 SIOCGHWTSTAMP = 0x89b1 SIOCGIFADDR = 0x8915 SIOCGIFBR = 0x8940 SIOCGIFBRDADDR = 0x8919 SIOCGIFCONF = 0x8912 SIOCGIFCOUNT = 0x8938 SIOCGIFDSTADDR = 0x8917 SIOCGIFENCAP = 0x8925 SIOCGIFFLAGS = 0x8913 SIOCGIFHWADDR = 0x8927 SIOCGIFINDEX = 0x8933 SIOCGIFMAP = 0x8970 SIOCGIFMEM = 0x891f SIOCGIFMETRIC = 0x891d SIOCGIFMTU = 0x8921 SIOCGIFNAME = 0x8910 SIOCGIFNETMASK = 0x891b SIOCGIFPFLAGS = 0x8935 SIOCGIFSLAVE = 0x8929 SIOCGIFTXQLEN = 0x8942 SIOCGIFVLAN = 0x8982 SIOCGMIIPHY = 0x8947 SIOCGMIIREG = 0x8948 SIOCGPGRP = 0x8904 SIOCGRARP = 0x8961 SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 SIOCGSTAMPNS = 0x8907 SIOCINQ = 0x541b SIOCOUTQ = 0x5411 SIOCOUTQNSD = 0x894b SIOCPROTOPRIVATE = 0x89e0 SIOCRTMSG = 0x890d SIOCSARP = 0x8955 SIOCSHWTSTAMP = 0x89b0 SIOCSIFADDR = 0x8916 SIOCSIFBR = 0x8941 SIOCSIFBRDADDR = 0x891a SIOCSIFDSTADDR = 0x8918 SIOCSIFENCAP = 0x8926 SIOCSIFFLAGS = 0x8914 SIOCSIFHWADDR = 0x8924 SIOCSIFHWBROADCAST = 0x8937 SIOCSIFLINK = 0x8911 SIOCSIFMAP = 0x8971 SIOCSIFMEM = 0x8920 SIOCSIFMETRIC = 0x891e SIOCSIFMTU = 0x8922 SIOCSIFNAME = 0x8923 SIOCSIFNETMASK = 0x891c SIOCSIFPFLAGS = 0x8934 SIOCSIFSLAVE = 0x8930 SIOCSIFTXQLEN = 0x8943 SIOCSIFVLAN = 0x8983 SIOCSMIIREG = 0x8949 SIOCSPGRP = 0x8902 SIOCSRARP = 0x8962 SIOCWANDEV = 0x894a SOCK_CLOEXEC = 0x80000 SOCK_DCCP = 0x6 SOCK_DGRAM = 0x2 SOCK_IOC_TYPE = 0x89 SOCK_NONBLOCK = 0x800 SOCK_PACKET = 0xa SOCK_RAW = 0x3 SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x1 SOL_AAL = 0x109 SOL_ALG = 0x117 SOL_ATM = 0x108 SOL_CAIF = 0x116 SOL_CAN_BASE = 0x64 SOL_DCCP = 0x10d SOL_DECNET = 0x105 SOL_ICMPV6 = 0x3a SOL_IP = 0x0 SOL_IPV6 = 0x29 SOL_IRDA = 0x10a SOL_IUCV = 0x115 SOL_KCM = 0x119 SOL_LLC = 0x10c SOL_NETBEUI = 0x10b SOL_NETLINK = 0x10e SOL_NFC = 0x118 SOL_PACKET = 0x107 SOL_PNPIPE = 0x113 SOL_PPPOL2TP = 0x111 SOL_RAW = 0xff SOL_RDS = 0x114 SOL_RXRPC = 0x110 SOL_SOCKET = 0x1 SOL_TCP = 0x6 SOL_TIPC = 0x10f SOL_X25 = 0x106 SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x1e SO_ATTACH_BPF = 0x32 SO_ATTACH_FILTER = 0x1a SO_ATTACH_REUSEPORT_CBPF = 0x33 SO_ATTACH_REUSEPORT_EBPF = 0x34 SO_BINDTODEVICE = 0x19 SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe SO_BUSY_POLL = 0x2e SO_CNX_ADVICE = 0x35 SO_COOKIE = 0x39 SO_DEBUG = 0x1 SO_DETACH_BPF = 0x1b SO_DETACH_FILTER = 0x1b SO_DOMAIN = 0x27 SO_DONTROUTE = 0x5 SO_ERROR = 0x4 SO_GET_FILTER = 0x1a SO_INCOMING_CPU = 0x31 SO_INCOMING_NAPI_ID = 0x38 SO_KEEPALIVE = 0x9 SO_LINGER = 0xd SO_LOCK_FILTER = 0x2c SO_MARK = 0x24 SO_MAX_PACING_RATE = 0x2f SO_MEMINFO = 0x37 SO_NOFCS = 0x2b SO_NO_CHECK = 0xb SO_OOBINLINE = 0xa SO_PASSCRED = 0x10 SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x11 SO_PEERGROUPS = 0x3b SO_PEERNAME = 0x1c SO_PEERSEC = 0x1f SO_PRIORITY = 0xc SO_PROTOCOL = 0x26 SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x12 SO_RCVTIMEO = 0x14 SO_REUSEADDR = 0x2 SO_REUSEPORT = 0xf SO_RXQ_OVFL = 0x28 SO_SECURITY_AUTHENTICATION = 0x16 SO_SECURITY_ENCRYPTION_NETWORK = 0x18 SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 SO_SELECT_ERR_QUEUE = 0x2d SO_SNDBUF = 0x7 SO_SNDBUFFORCE = 0x20 SO_SNDLOWAT = 0x13 SO_SNDTIMEO = 0x15 SO_TIMESTAMP = 0x1d SO_TIMESTAMPING = 0x25 SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x3 SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 SO_VM_SOCKETS_BUFFER_SIZE = 0x0 SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 SO_VM_SOCKETS_TRUSTED = 0x5 SO_WIFI_STATUS = 0x29 SPLICE_F_GIFT = 0x8 SPLICE_F_MORE = 0x4 SPLICE_F_MOVE = 0x1 SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000 S_IFCHR = 0x2000 S_IFDIR = 0x4000 S_IFIFO = 0x1000 S_IFLNK = 0xa000 S_IFMT = 0xf000 S_IFREG = 0x8000 S_IFSOCK = 0xc000 S_IREAD = 0x100 S_IRGRP = 0x20 S_IROTH = 0x4 S_IRUSR = 0x100 S_IRWXG = 0x38 S_IRWXO = 0x7 S_IRWXU = 0x1c0 S_ISGID = 0x400 S_ISUID = 0x800 S_ISVTX = 0x200 S_IWGRP = 0x10 S_IWOTH = 0x2 S_IWRITE = 0x80 S_IWUSR = 0x80 S_IXGRP = 0x8 S_IXOTH = 0x1 S_IXUSR = 0x40 TAB0 = 0x0 TAB1 = 0x800 TAB2 = 0x1000 TAB3 = 0x1800 TABDLY = 0x1800 TASKSTATS_CMD_ATTR_MAX = 0x4 TASKSTATS_CMD_MAX = 0x2 TASKSTATS_GENL_NAME = "TASKSTATS" TASKSTATS_GENL_VERSION = 0x1 TASKSTATS_TYPE_MAX = 0x6 TASKSTATS_VERSION = 0x8 TCFLSH = 0x540b TCGETA = 0x5405 TCGETS = 0x5401 TCGETS2 = 0x802c542a TCGETX = 0x5432 TCIFLUSH = 0x0 TCIOFF = 0x2 TCIOFLUSH = 0x2 TCION = 0x3 TCOFLUSH = 0x1 TCOOFF = 0x0 TCOON = 0x1 TCP_CC_INFO = 0x1a TCP_CONGESTION = 0xd TCP_COOKIE_IN_ALWAYS = 0x1 TCP_COOKIE_MAX = 0x10 TCP_COOKIE_MIN = 0x8 TCP_COOKIE_OUT_NEVER = 0x2 TCP_COOKIE_PAIR_SIZE = 0x20 TCP_COOKIE_TRANSACTIONS = 0xf TCP_CORK = 0x3 TCP_DEFER_ACCEPT = 0x9 TCP_FASTOPEN = 0x17 TCP_FASTOPEN_CONNECT = 0x1e TCP_INFO = 0xb TCP_KEEPCNT = 0x6 TCP_KEEPIDLE = 0x4 TCP_KEEPINTVL = 0x5 TCP_LINGER2 = 0x8 TCP_MAXSEG = 0x2 TCP_MAXWIN = 0xffff TCP_MAX_WINSHIFT = 0xe TCP_MD5SIG = 0xe TCP_MD5SIG_MAXKEYLEN = 0x50 TCP_MSS = 0x200 TCP_MSS_DEFAULT = 0x218 TCP_MSS_DESIRED = 0x4c4 TCP_NODELAY = 0x1 TCP_NOTSENT_LOWAT = 0x19 TCP_QUEUE_SEQ = 0x15 TCP_QUICKACK = 0xc TCP_REPAIR = 0x13 TCP_REPAIR_OPTIONS = 0x16 TCP_REPAIR_QUEUE = 0x14 TCP_REPAIR_WINDOW = 0x1d TCP_SAVED_SYN = 0x1c TCP_SAVE_SYN = 0x1b TCP_SYNCNT = 0x7 TCP_S_DATA_IN = 0x4 TCP_S_DATA_OUT = 0x8 TCP_THIN_DUPACK = 0x11 TCP_THIN_LINEAR_TIMEOUTS = 0x10 TCP_TIMESTAMP = 0x18 TCP_USER_TIMEOUT = 0x12 TCP_WINDOW_CLAMP = 0xa TCSAFLUSH = 0x2 TCSBRK = 0x5409 TCSBRKP = 0x5425 TCSETA = 0x5406 TCSETAF = 0x5408 TCSETAW = 0x5407 TCSETS = 0x5402 TCSETS2 = 0x402c542b TCSETSF = 0x5404 TCSETSF2 = 0x402c542d TCSETSW = 0x5403 TCSETSW2 = 0x402c542c TCSETX = 0x5433 TCSETXF = 0x5434 TCSETXW = 0x5435 TCXONC = 0x540a TIOCCBRK = 0x5428 TIOCCONS = 0x541d TIOCEXCL = 0x540c TIOCGDEV = 0x80045432 TIOCGETD = 0x5424 TIOCGEXCL = 0x80045440 TIOCGICOUNT = 0x545d TIOCGLCKTRMIOS = 0x5456 TIOCGPGRP = 0x540f TIOCGPKT = 0x80045438 TIOCGPTLCK = 0x80045439 TIOCGPTN = 0x80045430 TIOCGPTPEER = 0x5441 TIOCGRS485 = 0x542e TIOCGSERIAL = 0x541e TIOCGSID = 0x5429 TIOCGSOFTCAR = 0x5419 TIOCGWINSZ = 0x5413 TIOCINQ = 0x541b TIOCLINUX = 0x541c TIOCMBIC = 0x5417 TIOCMBIS = 0x5416 TIOCMGET = 0x5415 TIOCMIWAIT = 0x545c TIOCMSET = 0x5418 TIOCM_CAR = 0x40 TIOCM_CD = 0x40 TIOCM_CTS = 0x20 TIOCM_DSR = 0x100 TIOCM_DTR = 0x2 TIOCM_LE = 0x1 TIOCM_RI = 0x80 TIOCM_RNG = 0x80 TIOCM_RTS = 0x4 TIOCM_SR = 0x10 TIOCM_ST = 0x8 TIOCNOTTY = 0x5422 TIOCNXCL = 0x540d TIOCOUTQ = 0x5411 TIOCPKT = 0x5420 TIOCPKT_DATA = 0x0 TIOCPKT_DOSTOP = 0x20 TIOCPKT_FLUSHREAD = 0x1 TIOCPKT_FLUSHWRITE = 0x2 TIOCPKT_IOCTL = 0x40 TIOCPKT_NOSTOP = 0x10 TIOCPKT_START = 0x8 TIOCPKT_STOP = 0x4 TIOCSBRK = 0x5427 TIOCSCTTY = 0x540e TIOCSERCONFIG = 0x5453 TIOCSERGETLSR = 0x5459 TIOCSERGETMULTI = 0x545a TIOCSERGSTRUCT = 0x5458 TIOCSERGWILD = 0x5454 TIOCSERSETMULTI = 0x545b TIOCSERSWILD = 0x5455 TIOCSER_TEMT = 0x1 TIOCSETD = 0x5423 TIOCSIG = 0x40045436 TIOCSLCKTRMIOS = 0x5457 TIOCSPGRP = 0x5410 TIOCSPTLCK = 0x40045431 TIOCSRS485 = 0x542f TIOCSSERIAL = 0x541f TIOCSSOFTCAR = 0x541a TIOCSTI = 0x5412 TIOCSWINSZ = 0x5414 TIOCVHANGUP = 0x5437 TOSTOP = 0x100 TS_COMM_LEN = 0x20 TUNATTACHFILTER = 0x400854d5 TUNDETACHFILTER = 0x400854d6 TUNGETFEATURES = 0x800454cf TUNGETFILTER = 0x800854db TUNGETIFF = 0x800454d2 TUNGETSNDBUF = 0x800454d3 TUNGETVNETBE = 0x800454df TUNGETVNETHDRSZ = 0x800454d7 TUNGETVNETLE = 0x800454dd TUNSETDEBUG = 0x400454c9 TUNSETGROUP = 0x400454ce TUNSETIFF = 0x400454ca TUNSETIFINDEX = 0x400454da TUNSETLINK = 0x400454cd TUNSETNOCSUM = 0x400454c8 TUNSETOFFLOAD = 0x400454d0 TUNSETOWNER = 0x400454cc TUNSETPERSIST = 0x400454cb TUNSETQUEUE = 0x400454d9 TUNSETSNDBUF = 0x400454d4 TUNSETTXFILTER = 0x400454d1 TUNSETVNETBE = 0x400454de TUNSETVNETHDRSZ = 0x400454d8 TUNSETVNETLE = 0x400454dc UMOUNT_NOFOLLOW = 0x8 UTIME_NOW = 0x3fffffff UTIME_OMIT = 0x3ffffffe VDISCARD = 0xd VEOF = 0x4 VEOL = 0xb VEOL2 = 0x10 VERASE = 0x2 VINTR = 0x0 VKILL = 0x3 VLNEXT = 0xf VMADDR_CID_ANY = 0xffffffff VMADDR_CID_HOST = 0x2 VMADDR_CID_HYPERVISOR = 0x0 VMADDR_CID_RESERVED = 0x1 VMADDR_PORT_ANY = 0xffffffff VMIN = 0x6 VM_SOCKETS_INVALID_VERSION = 0xffffffff VQUIT = 0x1 VREPRINT = 0xc VSTART = 0x8 VSTOP = 0x9 VSUSP = 0xa VSWTC = 0x7 VT0 = 0x0 VT1 = 0x4000 VTDLY = 0x4000 VTIME = 0x5 VWERASE = 0xe WALL = 0x40000000 WCLONE = 0x80000000 WCONTINUED = 0x8 WDIOC_GETBOOTSTATUS = 0x80045702 WDIOC_GETPRETIMEOUT = 0x80045709 WDIOC_GETSTATUS = 0x80045701 WDIOC_GETSUPPORT = 0x80285700 WDIOC_GETTEMP = 0x80045703 WDIOC_GETTIMELEFT = 0x8004570a WDIOC_GETTIMEOUT = 0x80045707 WDIOC_KEEPALIVE = 0x80045705 WDIOC_SETOPTIONS = 0x80045704 WDIOC_SETPRETIMEOUT = 0xc0045708 WDIOC_SETTIMEOUT = 0xc0045706 WEXITED = 0x4 WNOHANG = 0x1 WNOTHREAD = 0x20000000 WNOWAIT = 0x1000000 WORDSIZE = 0x20 WSTOPPED = 0x2 WUNTRACED = 0x2 XATTR_CREATE = 0x1 XATTR_REPLACE = 0x2 XCASE = 0x4 XTABS = 0x1800 ) // Errors const ( E2BIG = syscall.Errno(0x7) EACCES = syscall.Errno(0xd) EADDRINUSE = syscall.Errno(0x62) EADDRNOTAVAIL = syscall.Errno(0x63) EADV = syscall.Errno(0x44) EAFNOSUPPORT = syscall.Errno(0x61) EAGAIN = syscall.Errno(0xb) EALREADY = syscall.Errno(0x72) EBADE = syscall.Errno(0x34) EBADF = syscall.Errno(0x9) EBADFD = syscall.Errno(0x4d) EBADMSG = syscall.Errno(0x4a) EBADR = syscall.Errno(0x35) EBADRQC = syscall.Errno(0x38) EBADSLT = syscall.Errno(0x39) EBFONT = syscall.Errno(0x3b) EBUSY = syscall.Errno(0x10) ECANCELED = syscall.Errno(0x7d) ECHILD = syscall.Errno(0xa) ECHRNG = syscall.Errno(0x2c) ECOMM = syscall.Errno(0x46) ECONNABORTED = syscall.Errno(0x67) ECONNREFUSED = syscall.Errno(0x6f) ECONNRESET = syscall.Errno(0x68) EDEADLK = syscall.Errno(0x23) EDEADLOCK = syscall.Errno(0x23) EDESTADDRREQ = syscall.Errno(0x59) EDOM = syscall.Errno(0x21) EDOTDOT = syscall.Errno(0x49) EDQUOT = syscall.Errno(0x7a) EEXIST = syscall.Errno(0x11) EFAULT = syscall.Errno(0xe) EFBIG = syscall.Errno(0x1b) EHOSTDOWN = syscall.Errno(0x70) EHOSTUNREACH = syscall.Errno(0x71) EHWPOISON = syscall.Errno(0x85) EIDRM = syscall.Errno(0x2b) EILSEQ = syscall.Errno(0x54) EINPROGRESS = syscall.Errno(0x73) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x6a) EISDIR = syscall.Errno(0x15) EISNAM = syscall.Errno(0x78) EKEYEXPIRED = syscall.Errno(0x7f) EKEYREJECTED = syscall.Errno(0x81) EKEYREVOKED = syscall.Errno(0x80) EL2HLT = syscall.Errno(0x33) EL2NSYNC = syscall.Errno(0x2d) EL3HLT = syscall.Errno(0x2e) EL3RST = syscall.Errno(0x2f) ELIBACC = syscall.Errno(0x4f) ELIBBAD = syscall.Errno(0x50) ELIBEXEC = syscall.Errno(0x53) ELIBMAX = syscall.Errno(0x52) ELIBSCN = syscall.Errno(0x51) ELNRNG = syscall.Errno(0x30) ELOOP = syscall.Errno(0x28) EMEDIUMTYPE = syscall.Errno(0x7c) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) EMSGSIZE = syscall.Errno(0x5a) EMULTIHOP = syscall.Errno(0x48) ENAMETOOLONG = syscall.Errno(0x24) ENAVAIL = syscall.Errno(0x77) ENETDOWN = syscall.Errno(0x64) ENETRESET = syscall.Errno(0x66) ENETUNREACH = syscall.Errno(0x65) ENFILE = syscall.Errno(0x17) ENOANO = syscall.Errno(0x37) ENOBUFS = syscall.Errno(0x69) ENOCSI = syscall.Errno(0x32) ENODATA = syscall.Errno(0x3d) ENODEV = syscall.Errno(0x13) ENOENT = syscall.Errno(0x2) ENOEXEC = syscall.Errno(0x8) ENOKEY = syscall.Errno(0x7e) ENOLCK = syscall.Errno(0x25) ENOLINK = syscall.Errno(0x43) ENOMEDIUM = syscall.Errno(0x7b) ENOMEM = syscall.Errno(0xc) ENOMSG = syscall.Errno(0x2a) ENONET = syscall.Errno(0x40) ENOPKG = syscall.Errno(0x41) ENOPROTOOPT = syscall.Errno(0x5c) ENOSPC = syscall.Errno(0x1c) ENOSR = syscall.Errno(0x3f) ENOSTR = syscall.Errno(0x3c) ENOSYS = syscall.Errno(0x26) ENOTBLK = syscall.Errno(0xf) ENOTCONN = syscall.Errno(0x6b) ENOTDIR = syscall.Errno(0x14) ENOTEMPTY = syscall.Errno(0x27) ENOTNAM = syscall.Errno(0x76) ENOTRECOVERABLE = syscall.Errno(0x83) ENOTSOCK = syscall.Errno(0x58) ENOTSUP = syscall.Errno(0x5f) ENOTTY = syscall.Errno(0x19) ENOTUNIQ = syscall.Errno(0x4c) ENXIO = syscall.Errno(0x6) EOPNOTSUPP = syscall.Errno(0x5f) EOVERFLOW = syscall.Errno(0x4b) EOWNERDEAD = syscall.Errno(0x82) EPERM = syscall.Errno(0x1) EPFNOSUPPORT = syscall.Errno(0x60) EPIPE = syscall.Errno(0x20) EPROTO = syscall.Errno(0x47) EPROTONOSUPPORT = syscall.Errno(0x5d) EPROTOTYPE = syscall.Errno(0x5b) ERANGE = syscall.Errno(0x22) EREMCHG = syscall.Errno(0x4e) EREMOTE = syscall.Errno(0x42) EREMOTEIO = syscall.Errno(0x79) ERESTART = syscall.Errno(0x55) ERFKILL = syscall.Errno(0x84) EROFS = syscall.Errno(0x1e) ESHUTDOWN = syscall.Errno(0x6c) ESOCKTNOSUPPORT = syscall.Errno(0x5e) ESPIPE = syscall.Errno(0x1d) ESRCH = syscall.Errno(0x3) ESRMNT = syscall.Errno(0x45) ESTALE = syscall.Errno(0x74) ESTRPIPE = syscall.Errno(0x56) ETIME = syscall.Errno(0x3e) ETIMEDOUT = syscall.Errno(0x6e) ETOOMANYREFS = syscall.Errno(0x6d) ETXTBSY = syscall.Errno(0x1a) EUCLEAN = syscall.Errno(0x75) EUNATCH = syscall.Errno(0x31) EUSERS = syscall.Errno(0x57) EWOULDBLOCK = syscall.Errno(0xb) EXDEV = syscall.Errno(0x12) EXFULL = syscall.Errno(0x36) ) // Signals const ( SIGABRT = syscall.Signal(0x6) SIGALRM = syscall.Signal(0xe) SIGBUS = syscall.Signal(0x7) SIGCHLD = syscall.Signal(0x11) SIGCLD = syscall.Signal(0x11) SIGCONT = syscall.Signal(0x12) SIGFPE = syscall.Signal(0x8) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x1d) SIGIOT = syscall.Signal(0x6) SIGKILL = syscall.Signal(0x9) SIGPIPE = syscall.Signal(0xd) SIGPOLL = syscall.Signal(0x1d) SIGPROF = syscall.Signal(0x1b) SIGPWR = syscall.Signal(0x1e) SIGQUIT = syscall.Signal(0x3) SIGSEGV = syscall.Signal(0xb) SIGSTKFLT = syscall.Signal(0x10) SIGSTOP = syscall.Signal(0x13) SIGSYS = syscall.Signal(0x1f) SIGTERM = syscall.Signal(0xf) SIGTRAP = syscall.Signal(0x5) SIGTSTP = syscall.Signal(0x14) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) SIGURG = syscall.Signal(0x17) SIGUSR1 = syscall.Signal(0xa) SIGUSR2 = syscall.Signal(0xc) SIGVTALRM = syscall.Signal(0x1a) SIGWINCH = syscall.Signal(0x1c) SIGXCPU = syscall.Signal(0x18) SIGXFSZ = syscall.Signal(0x19) ) // Error table var errors = [...]string{ 1: "operation not permitted", 2: "no such file or directory", 3: "no such process", 4: "interrupted system call", 5: "input/output error", 6: "no such device or address", 7: "argument list too long", 8: "exec format error", 9: "bad file descriptor", 10: "no child processes", 11: "resource temporarily unavailable", 12: "cannot allocate memory", 13: "permission denied", 14: "bad address", 15: "block device required", 16: "device or resource busy", 17: "file exists", 18: "invalid cross-device link", 19: "no such device", 20: "not a directory", 21: "is a directory", 22: "invalid argument", 23: "too many open files in system", 24: "too many open files", 25: "inappropriate ioctl for device", 26: "text file busy", 27: "file too large", 28: "no space left on device", 29: "illegal seek", 30: "read-only file system", 31: "too many links", 32: "broken pipe", 33: "numerical argument out of domain", 34: "numerical result out of range", 35: "resource deadlock avoided", 36: "file name too long", 37: "no locks available", 38: "function not implemented", 39: "directory not empty", 40: "too many levels of symbolic links", 42: "no message of desired type", 43: "identifier removed", 44: "channel number out of range", 45: "level 2 not synchronized", 46: "level 3 halted", 47: "level 3 reset", 48: "link number out of range", 49: "protocol driver not attached", 50: "no CSI structure available", 51: "level 2 halted", 52: "invalid exchange", 53: "invalid request descriptor", 54: "exchange full", 55: "no anode", 56: "invalid request code", 57: "invalid slot", 59: "bad font file format", 60: "device not a stream", 61: "no data available", 62: "timer expired", 63: "out of streams resources", 64: "machine is not on the network", 65: "package not installed", 66: "object is remote", 67: "link has been severed", 68: "advertise error", 69: "srmount error", 70: "communication error on send", 71: "protocol error", 72: "multihop attempted", 73: "RFS specific error", 74: "bad message", 75: "value too large for defined data type", 76: "name not unique on network", 77: "file descriptor in bad state", 78: "remote address changed", 79: "can not access a needed shared library", 80: "accessing a corrupted shared library", 81: ".lib section in a.out corrupted", 82: "attempting to link in too many shared libraries", 83: "cannot exec a shared library directly", 84: "invalid or incomplete multibyte or wide character", 85: "interrupted system call should be restarted", 86: "streams pipe error", 87: "too many users", 88: "socket operation on non-socket", 89: "destination address required", 90: "message too long", 91: "protocol wrong type for socket", 92: "protocol not available", 93: "protocol not supported", 94: "socket type not supported", 95: "operation not supported", 96: "protocol family not supported", 97: "address family not supported by protocol", 98: "address already in use", 99: "cannot assign requested address", 100: "network is down", 101: "network is unreachable", 102: "network dropped connection on reset", 103: "software caused connection abort", 104: "connection reset by peer", 105: "no buffer space available", 106: "transport endpoint is already connected", 107: "transport endpoint is not connected", 108: "cannot send after transport endpoint shutdown", 109: "too many references: cannot splice", 110: "connection timed out", 111: "connection refused", 112: "host is down", 113: "no route to host", 114: "operation already in progress", 115: "operation now in progress", 116: "stale file handle", 117: "structure needs cleaning", 118: "not a XENIX named type file", 119: "no XENIX semaphores available", 120: "is a named type file", 121: "remote I/O error", 122: "disk quota exceeded", 123: "no medium found", 124: "wrong medium type", 125: "operation canceled", 126: "required key not available", 127: "key has expired", 128: "key has been revoked", 129: "key was rejected by service", 130: "owner died", 131: "state not recoverable", 132: "operation not possible due to RF-kill", 133: "memory page has hardware error", } // Signal table var signals = [...]string{ 1: "hangup", 2: "interrupt", 3: "quit", 4: "illegal instruction", 5: "trace/breakpoint trap", 6: "aborted", 7: "bus error", 8: "floating point exception", 9: "killed", 10: "user defined signal 1", 11: "segmentation fault", 12: "user defined signal 2", 13: "broken pipe", 14: "alarm clock", 15: "terminated", 16: "stack fault", 17: "child exited", 18: "continued", 19: "stopped (signal)", 20: "stopped", 21: "stopped (tty input)", 22: "stopped (tty output)", 23: "urgent I/O condition", 24: "CPU time limit exceeded", 25: "file size limit exceeded", 26: "virtual timer expired", 27: "profiling timer expired", 28: "window changed", 29: "I/O possible", 30: "power failure", 31: "bad system call", } ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go ================================================ // mkerrors.sh -Wall -Werror -static -I/tmp/include -fsigned-char // Code generated by the command above; see README.md. DO NOT EDIT. // +build arm64,linux // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char _const.go package unix import "syscall" const ( AF_ALG = 0x26 AF_APPLETALK = 0x5 AF_ASH = 0x12 AF_ATMPVC = 0x8 AF_ATMSVC = 0x14 AF_AX25 = 0x3 AF_BLUETOOTH = 0x1f AF_BRIDGE = 0x7 AF_CAIF = 0x25 AF_CAN = 0x1d AF_DECnet = 0xc AF_ECONET = 0x13 AF_FILE = 0x1 AF_IB = 0x1b AF_IEEE802154 = 0x24 AF_INET = 0x2 AF_INET6 = 0xa AF_IPX = 0x4 AF_IRDA = 0x17 AF_ISDN = 0x22 AF_IUCV = 0x20 AF_KCM = 0x29 AF_KEY = 0xf AF_LLC = 0x1a AF_LOCAL = 0x1 AF_MAX = 0x2c AF_MPLS = 0x1c AF_NETBEUI = 0xd AF_NETLINK = 0x10 AF_NETROM = 0x6 AF_NFC = 0x27 AF_PACKET = 0x11 AF_PHONET = 0x23 AF_PPPOX = 0x18 AF_QIPCRTR = 0x2a AF_RDS = 0x15 AF_ROSE = 0xb AF_ROUTE = 0x10 AF_RXRPC = 0x21 AF_SECURITY = 0xe AF_SMC = 0x2b AF_SNA = 0x16 AF_TIPC = 0x1e AF_UNIX = 0x1 AF_UNSPEC = 0x0 AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 ALG_OP_DECRYPT = 0x0 ALG_OP_ENCRYPT = 0x1 ALG_SET_AEAD_ASSOCLEN = 0x4 ALG_SET_AEAD_AUTHSIZE = 0x5 ALG_SET_IV = 0x2 ALG_SET_KEY = 0x1 ALG_SET_OP = 0x3 ARPHRD_6LOWPAN = 0x339 ARPHRD_ADAPT = 0x108 ARPHRD_APPLETLK = 0x8 ARPHRD_ARCNET = 0x7 ARPHRD_ASH = 0x30d ARPHRD_ATM = 0x13 ARPHRD_AX25 = 0x3 ARPHRD_BIF = 0x307 ARPHRD_CAIF = 0x336 ARPHRD_CAN = 0x118 ARPHRD_CHAOS = 0x5 ARPHRD_CISCO = 0x201 ARPHRD_CSLIP = 0x101 ARPHRD_CSLIP6 = 0x103 ARPHRD_DDCMP = 0x205 ARPHRD_DLCI = 0xf ARPHRD_ECONET = 0x30e ARPHRD_EETHER = 0x2 ARPHRD_ETHER = 0x1 ARPHRD_EUI64 = 0x1b ARPHRD_FCAL = 0x311 ARPHRD_FCFABRIC = 0x313 ARPHRD_FCPL = 0x312 ARPHRD_FCPP = 0x310 ARPHRD_FDDI = 0x306 ARPHRD_FRAD = 0x302 ARPHRD_HDLC = 0x201 ARPHRD_HIPPI = 0x30c ARPHRD_HWX25 = 0x110 ARPHRD_IEEE1394 = 0x18 ARPHRD_IEEE802 = 0x6 ARPHRD_IEEE80211 = 0x321 ARPHRD_IEEE80211_PRISM = 0x322 ARPHRD_IEEE80211_RADIOTAP = 0x323 ARPHRD_IEEE802154 = 0x324 ARPHRD_IEEE802154_MONITOR = 0x325 ARPHRD_IEEE802_TR = 0x320 ARPHRD_INFINIBAND = 0x20 ARPHRD_IP6GRE = 0x337 ARPHRD_IPDDP = 0x309 ARPHRD_IPGRE = 0x30a ARPHRD_IRDA = 0x30f ARPHRD_LAPB = 0x204 ARPHRD_LOCALTLK = 0x305 ARPHRD_LOOPBACK = 0x304 ARPHRD_METRICOM = 0x17 ARPHRD_NETLINK = 0x338 ARPHRD_NETROM = 0x0 ARPHRD_NONE = 0xfffe ARPHRD_PHONET = 0x334 ARPHRD_PHONET_PIPE = 0x335 ARPHRD_PIMREG = 0x30b ARPHRD_PPP = 0x200 ARPHRD_PRONET = 0x4 ARPHRD_RAWHDLC = 0x206 ARPHRD_ROSE = 0x10e ARPHRD_RSRVD = 0x104 ARPHRD_SIT = 0x308 ARPHRD_SKIP = 0x303 ARPHRD_SLIP = 0x100 ARPHRD_SLIP6 = 0x102 ARPHRD_TUNNEL = 0x300 ARPHRD_TUNNEL6 = 0x301 ARPHRD_VOID = 0xffff ARPHRD_VSOCKMON = 0x33a ARPHRD_X25 = 0x10f B0 = 0x0 B1000000 = 0x1008 B110 = 0x3 B115200 = 0x1002 B1152000 = 0x1009 B1200 = 0x9 B134 = 0x4 B150 = 0x5 B1500000 = 0x100a B1800 = 0xa B19200 = 0xe B200 = 0x6 B2000000 = 0x100b B230400 = 0x1003 B2400 = 0xb B2500000 = 0x100c B300 = 0x7 B3000000 = 0x100d B3500000 = 0x100e B38400 = 0xf B4000000 = 0x100f B460800 = 0x1004 B4800 = 0xc B50 = 0x1 B500000 = 0x1005 B57600 = 0x1001 B576000 = 0x1006 B600 = 0x8 B75 = 0x2 B921600 = 0x1007 B9600 = 0xd BLKBSZGET = 0x80081270 BLKBSZSET = 0x40081271 BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80081272 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d BLKRRPART = 0x125f BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 BOTHER = 0x1000 BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALU = 0x4 BPF_AND = 0x50 BPF_B = 0x10 BPF_DIV = 0x30 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 BPF_JA = 0x0 BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 BPF_JMP = 0x5 BPF_JSET = 0x40 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 BPF_LEN = 0x80 BPF_LL_OFF = -0x200000 BPF_LSH = 0x60 BPF_MAJOR_VERSION = 0x1 BPF_MAXINSNS = 0x1000 BPF_MEM = 0x60 BPF_MEMWORDS = 0x10 BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MOD = 0x90 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_NET_OFF = -0x100000 BPF_OR = 0x40 BPF_RET = 0x6 BPF_RSH = 0x70 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 BPF_TAX = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 BPF_XOR = 0xa0 BRKINT = 0x2 BS0 = 0x0 BS1 = 0x2000 BSDLY = 0x2000 CAN_BCM = 0x2 CAN_EFF_FLAG = 0x80000000 CAN_EFF_ID_BITS = 0x1d CAN_EFF_MASK = 0x1fffffff CAN_ERR_FLAG = 0x20000000 CAN_ERR_MASK = 0x1fffffff CAN_INV_FILTER = 0x20000000 CAN_ISOTP = 0x6 CAN_MAX_DLC = 0x8 CAN_MAX_DLEN = 0x8 CAN_MCNET = 0x5 CAN_MTU = 0x10 CAN_NPROTO = 0x7 CAN_RAW = 0x1 CAN_RAW_FILTER_MAX = 0x200 CAN_RTR_FLAG = 0x40000000 CAN_SFF_ID_BITS = 0xb CAN_SFF_MASK = 0x7ff CAN_TP16 = 0x3 CAN_TP20 = 0x4 CBAUD = 0x100f CBAUDEX = 0x1000 CFLUSH = 0xf CIBAUD = 0x100f0000 CLOCAL = 0x800 CLOCK_BOOTTIME = 0x7 CLOCK_BOOTTIME_ALARM = 0x9 CLOCK_DEFAULT = 0x0 CLOCK_EXT = 0x1 CLOCK_INT = 0x2 CLOCK_MONOTONIC = 0x1 CLOCK_MONOTONIC_COARSE = 0x6 CLOCK_MONOTONIC_RAW = 0x4 CLOCK_PROCESS_CPUTIME_ID = 0x2 CLOCK_REALTIME = 0x0 CLOCK_REALTIME_ALARM = 0x8 CLOCK_REALTIME_COARSE = 0x5 CLOCK_TAI = 0xb CLOCK_THREAD_CPUTIME_ID = 0x3 CLOCK_TXFROMRX = 0x4 CLOCK_TXINT = 0x3 CLONE_CHILD_CLEARTID = 0x200000 CLONE_CHILD_SETTID = 0x1000000 CLONE_DETACHED = 0x400000 CLONE_FILES = 0x400 CLONE_FS = 0x200 CLONE_IO = 0x80000000 CLONE_NEWCGROUP = 0x2000000 CLONE_NEWIPC = 0x8000000 CLONE_NEWNET = 0x40000000 CLONE_NEWNS = 0x20000 CLONE_NEWPID = 0x20000000 CLONE_NEWUSER = 0x10000000 CLONE_NEWUTS = 0x4000000 CLONE_PARENT = 0x8000 CLONE_PARENT_SETTID = 0x100000 CLONE_PTRACE = 0x2000 CLONE_SETTLS = 0x80000 CLONE_SIGHAND = 0x800 CLONE_SYSVSEM = 0x40000 CLONE_THREAD = 0x10000 CLONE_UNTRACED = 0x800000 CLONE_VFORK = 0x4000 CLONE_VM = 0x100 CMSPAR = 0x40000000 CR0 = 0x0 CR1 = 0x200 CR2 = 0x400 CR3 = 0x600 CRDLY = 0x600 CREAD = 0x80 CRTSCTS = 0x80000000 CS5 = 0x0 CS6 = 0x10 CS7 = 0x20 CS8 = 0x30 CSIGNAL = 0xff CSIZE = 0x30 CSTART = 0x11 CSTATUS = 0x0 CSTOP = 0x13 CSTOPB = 0x40 CSUSP = 0x1a DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 DT_FIFO = 0x1 DT_LNK = 0xa DT_REG = 0x8 DT_SOCK = 0xc DT_UNKNOWN = 0x0 DT_WHT = 0xe ECHO = 0x8 ECHOCTL = 0x200 ECHOE = 0x10 ECHOK = 0x20 ECHOKE = 0x800 ECHONL = 0x40 ECHOPRT = 0x400 EFD_CLOEXEC = 0x80000 EFD_NONBLOCK = 0x800 EFD_SEMAPHORE = 0x1 ENCODING_DEFAULT = 0x0 ENCODING_FM_MARK = 0x3 ENCODING_FM_SPACE = 0x4 ENCODING_MANCHESTER = 0x5 ENCODING_NRZ = 0x1 ENCODING_NRZI = 0x2 EPOLLERR = 0x8 EPOLLET = 0x80000000 EPOLLEXCLUSIVE = 0x10000000 EPOLLHUP = 0x10 EPOLLIN = 0x1 EPOLLMSG = 0x400 EPOLLONESHOT = 0x40000000 EPOLLOUT = 0x4 EPOLLPRI = 0x2 EPOLLRDBAND = 0x80 EPOLLRDHUP = 0x2000 EPOLLRDNORM = 0x40 EPOLLWAKEUP = 0x20000000 EPOLLWRBAND = 0x200 EPOLLWRNORM = 0x100 EPOLL_CLOEXEC = 0x80000 EPOLL_CTL_ADD = 0x1 EPOLL_CTL_DEL = 0x2 EPOLL_CTL_MOD = 0x3 ESR_MAGIC = 0x45535201 ETH_P_1588 = 0x88f7 ETH_P_8021AD = 0x88a8 ETH_P_8021AH = 0x88e7 ETH_P_8021Q = 0x8100 ETH_P_80221 = 0x8917 ETH_P_802_2 = 0x4 ETH_P_802_3 = 0x1 ETH_P_802_3_MIN = 0x600 ETH_P_802_EX1 = 0x88b5 ETH_P_AARP = 0x80f3 ETH_P_AF_IUCV = 0xfbfb ETH_P_ALL = 0x3 ETH_P_AOE = 0x88a2 ETH_P_ARCNET = 0x1a ETH_P_ARP = 0x806 ETH_P_ATALK = 0x809b ETH_P_ATMFATE = 0x8884 ETH_P_ATMMPOA = 0x884c ETH_P_AX25 = 0x2 ETH_P_BATMAN = 0x4305 ETH_P_BPQ = 0x8ff ETH_P_CAIF = 0xf7 ETH_P_CAN = 0xc ETH_P_CANFD = 0xd ETH_P_CONTROL = 0x16 ETH_P_CUST = 0x6006 ETH_P_DDCMP = 0x6 ETH_P_DEC = 0x6000 ETH_P_DIAG = 0x6005 ETH_P_DNA_DL = 0x6001 ETH_P_DNA_RC = 0x6002 ETH_P_DNA_RT = 0x6003 ETH_P_DSA = 0x1b ETH_P_ECONET = 0x18 ETH_P_EDSA = 0xdada ETH_P_FCOE = 0x8906 ETH_P_FIP = 0x8914 ETH_P_HDLC = 0x19 ETH_P_HSR = 0x892f ETH_P_IBOE = 0x8915 ETH_P_IEEE802154 = 0xf6 ETH_P_IEEEPUP = 0xa00 ETH_P_IEEEPUPAT = 0xa01 ETH_P_IP = 0x800 ETH_P_IPV6 = 0x86dd ETH_P_IPX = 0x8137 ETH_P_IRDA = 0x17 ETH_P_LAT = 0x6004 ETH_P_LINK_CTL = 0x886c ETH_P_LOCALTALK = 0x9 ETH_P_LOOP = 0x60 ETH_P_LOOPBACK = 0x9000 ETH_P_MACSEC = 0x88e5 ETH_P_MOBITEX = 0x15 ETH_P_MPLS_MC = 0x8848 ETH_P_MPLS_UC = 0x8847 ETH_P_MVRP = 0x88f5 ETH_P_NCSI = 0x88f8 ETH_P_PAE = 0x888e ETH_P_PAUSE = 0x8808 ETH_P_PHONET = 0xf5 ETH_P_PPPTALK = 0x10 ETH_P_PPP_DISC = 0x8863 ETH_P_PPP_MP = 0x8 ETH_P_PPP_SES = 0x8864 ETH_P_PRP = 0x88fb ETH_P_PUP = 0x200 ETH_P_PUPAT = 0x201 ETH_P_QINQ1 = 0x9100 ETH_P_QINQ2 = 0x9200 ETH_P_QINQ3 = 0x9300 ETH_P_RARP = 0x8035 ETH_P_SCA = 0x6007 ETH_P_SLOW = 0x8809 ETH_P_SNAP = 0x5 ETH_P_TDLS = 0x890d ETH_P_TEB = 0x6558 ETH_P_TIPC = 0x88ca ETH_P_TRAILER = 0x1c ETH_P_TR_802_2 = 0x11 ETH_P_TSN = 0x22f0 ETH_P_WAN_PPP = 0x7 ETH_P_WCCP = 0x883e ETH_P_X25 = 0x805 ETH_P_XDSA = 0xf8 EXTA = 0xe EXTB = 0xf EXTPROC = 0x10000 EXTRA_MAGIC = 0x45585401 FALLOC_FL_COLLAPSE_RANGE = 0x8 FALLOC_FL_INSERT_RANGE = 0x20 FALLOC_FL_KEEP_SIZE = 0x1 FALLOC_FL_NO_HIDE_STALE = 0x4 FALLOC_FL_PUNCH_HOLE = 0x2 FALLOC_FL_UNSHARE_RANGE = 0x40 FALLOC_FL_ZERO_RANGE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 FF1 = 0x8000 FFDLY = 0x8000 FLUSHO = 0x1000 FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 FS_ENCRYPTION_MODE_INVALID = 0x0 FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 FS_KEY_DESCRIPTOR_SIZE = 0x8 FS_KEY_DESC_PREFIX = "fscrypt:" FS_KEY_DESC_PREFIX_SIZE = 0x8 FS_MAX_KEY_SIZE = 0x40 FS_POLICY_FLAGS_PAD_16 = 0x2 FS_POLICY_FLAGS_PAD_32 = 0x3 FS_POLICY_FLAGS_PAD_4 = 0x0 FS_POLICY_FLAGS_PAD_8 = 0x1 FS_POLICY_FLAGS_PAD_MASK = 0x3 FS_POLICY_FLAGS_VALID = 0x3 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0x406 F_EXLCK = 0x4 F_GETFD = 0x1 F_GETFL = 0x3 F_GETLEASE = 0x401 F_GETLK = 0x5 F_GETLK64 = 0x5 F_GETOWN = 0x9 F_GETOWN_EX = 0x10 F_GETPIPE_SZ = 0x408 F_GETSIG = 0xb F_LOCK = 0x1 F_NOTIFY = 0x402 F_OFD_GETLK = 0x24 F_OFD_SETLK = 0x25 F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 F_SETFD = 0x2 F_SETFL = 0x4 F_SETLEASE = 0x400 F_SETLK = 0x6 F_SETLK64 = 0x6 F_SETLKW = 0x7 F_SETLKW64 = 0x7 F_SETOWN = 0x8 F_SETOWN_EX = 0xf F_SETPIPE_SZ = 0x407 F_SETSIG = 0xa F_SHLCK = 0x8 F_TEST = 0x3 F_TLOCK = 0x2 F_ULOCK = 0x0 F_UNLCK = 0x2 F_WRLCK = 0x1 GENL_ADMIN_PERM = 0x1 GENL_CMD_CAP_DO = 0x2 GENL_CMD_CAP_DUMP = 0x4 GENL_CMD_CAP_HASPOL = 0x8 GENL_HDRLEN = 0x4 GENL_ID_CTRL = 0x10 GENL_ID_PMCRAID = 0x12 GENL_ID_VFS_DQUOT = 0x11 GENL_MAX_ID = 0x3ff GENL_MIN_ID = 0x10 GENL_NAMSIZ = 0x10 GENL_START_ALLOC = 0x13 GENL_UNS_ADMIN_PERM = 0x10 GRND_NONBLOCK = 0x1 GRND_RANDOM = 0x2 HUPCL = 0x400 IBSHIFT = 0x10 ICANON = 0x2 ICMPV6_FILTER = 0x1 ICRNL = 0x100 IEXTEN = 0x8000 IFA_F_DADFAILED = 0x8 IFA_F_DEPRECATED = 0x20 IFA_F_HOMEADDRESS = 0x10 IFA_F_MANAGETEMPADDR = 0x100 IFA_F_MCAUTOJOIN = 0x400 IFA_F_NODAD = 0x2 IFA_F_NOPREFIXROUTE = 0x200 IFA_F_OPTIMISTIC = 0x4 IFA_F_PERMANENT = 0x80 IFA_F_SECONDARY = 0x1 IFA_F_STABLE_PRIVACY = 0x800 IFA_F_TEMPORARY = 0x1 IFA_F_TENTATIVE = 0x40 IFA_MAX = 0x8 IFF_ALLMULTI = 0x200 IFF_ATTACH_QUEUE = 0x200 IFF_AUTOMEDIA = 0x4000 IFF_BROADCAST = 0x2 IFF_DEBUG = 0x4 IFF_DETACH_QUEUE = 0x400 IFF_DORMANT = 0x20000 IFF_DYNAMIC = 0x8000 IFF_ECHO = 0x40000 IFF_LOOPBACK = 0x8 IFF_LOWER_UP = 0x10000 IFF_MASTER = 0x400 IFF_MULTICAST = 0x1000 IFF_MULTI_QUEUE = 0x100 IFF_NOARP = 0x80 IFF_NOFILTER = 0x1000 IFF_NOTRAILERS = 0x20 IFF_NO_PI = 0x1000 IFF_ONE_QUEUE = 0x2000 IFF_PERSIST = 0x800 IFF_POINTOPOINT = 0x10 IFF_PORTSEL = 0x2000 IFF_PROMISC = 0x100 IFF_RUNNING = 0x40 IFF_SLAVE = 0x800 IFF_TAP = 0x2 IFF_TUN = 0x1 IFF_TUN_EXCL = 0x8000 IFF_UP = 0x1 IFF_VNET_HDR = 0x4000 IFF_VOLATILE = 0x70c5a IFNAMSIZ = 0x10 IGNBRK = 0x1 IGNCR = 0x80 IGNPAR = 0x4 IMAXBEL = 0x2000 INLCR = 0x40 INPCK = 0x10 IN_ACCESS = 0x1 IN_ALL_EVENTS = 0xfff IN_ATTRIB = 0x4 IN_CLASSA_HOST = 0xffffff IN_CLASSA_MAX = 0x80 IN_CLASSA_NET = 0xff000000 IN_CLASSA_NSHIFT = 0x18 IN_CLASSB_HOST = 0xffff IN_CLASSB_MAX = 0x10000 IN_CLASSB_NET = 0xffff0000 IN_CLASSB_NSHIFT = 0x10 IN_CLASSC_HOST = 0xff IN_CLASSC_NET = 0xffffff00 IN_CLASSC_NSHIFT = 0x8 IN_CLOEXEC = 0x80000 IN_CLOSE = 0x18 IN_CLOSE_NOWRITE = 0x10 IN_CLOSE_WRITE = 0x8 IN_CREATE = 0x100 IN_DELETE = 0x200 IN_DELETE_SELF = 0x400 IN_DONT_FOLLOW = 0x2000000 IN_EXCL_UNLINK = 0x4000000 IN_IGNORED = 0x8000 IN_ISDIR = 0x40000000 IN_LOOPBACKNET = 0x7f IN_MASK_ADD = 0x20000000 IN_MODIFY = 0x2 IN_MOVE = 0xc0 IN_MOVED_FROM = 0x40 IN_MOVED_TO = 0x80 IN_MOVE_SELF = 0x800 IN_NONBLOCK = 0x800 IN_ONESHOT = 0x80000000 IN_ONLYDIR = 0x1000000 IN_OPEN = 0x20 IN_Q_OVERFLOW = 0x4000 IN_UNMOUNT = 0x2000 IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 IPPROTO_AH = 0x33 IPPROTO_BEETPH = 0x5e IPPROTO_COMP = 0x6c IPPROTO_DCCP = 0x21 IPPROTO_DSTOPTS = 0x3c IPPROTO_EGP = 0x8 IPPROTO_ENCAP = 0x62 IPPROTO_ESP = 0x32 IPPROTO_FRAGMENT = 0x2c IPPROTO_GRE = 0x2f IPPROTO_HOPOPTS = 0x0 IPPROTO_ICMP = 0x1 IPPROTO_ICMPV6 = 0x3a IPPROTO_IDP = 0x16 IPPROTO_IGMP = 0x2 IPPROTO_IP = 0x0 IPPROTO_IPIP = 0x4 IPPROTO_IPV6 = 0x29 IPPROTO_MH = 0x87 IPPROTO_MPLS = 0x89 IPPROTO_MTP = 0x5c IPPROTO_NONE = 0x3b IPPROTO_PIM = 0x67 IPPROTO_PUP = 0xc IPPROTO_RAW = 0xff IPPROTO_ROUTING = 0x2b IPPROTO_RSVP = 0x2e IPPROTO_SCTP = 0x84 IPPROTO_TCP = 0x6 IPPROTO_TP = 0x1d IPPROTO_UDP = 0x11 IPPROTO_UDPLITE = 0x88 IPV6_2292DSTOPTS = 0x4 IPV6_2292HOPLIMIT = 0x8 IPV6_2292HOPOPTS = 0x3 IPV6_2292PKTINFO = 0x2 IPV6_2292PKTOPTIONS = 0x6 IPV6_2292RTHDR = 0x5 IPV6_ADDRFORM = 0x1 IPV6_ADDR_PREFERENCES = 0x48 IPV6_ADD_MEMBERSHIP = 0x14 IPV6_AUTHHDR = 0xa IPV6_AUTOFLOWLABEL = 0x46 IPV6_CHECKSUM = 0x7 IPV6_DONTFRAG = 0x3e IPV6_DROP_MEMBERSHIP = 0x15 IPV6_DSTOPTS = 0x3b IPV6_HDRINCL = 0x24 IPV6_HOPLIMIT = 0x34 IPV6_HOPOPTS = 0x36 IPV6_IPSEC_POLICY = 0x22 IPV6_JOIN_ANYCAST = 0x1b IPV6_JOIN_GROUP = 0x14 IPV6_LEAVE_ANYCAST = 0x1c IPV6_LEAVE_GROUP = 0x15 IPV6_MINHOPCOUNT = 0x49 IPV6_MTU = 0x18 IPV6_MTU_DISCOVER = 0x17 IPV6_MULTICAST_HOPS = 0x12 IPV6_MULTICAST_IF = 0x11 IPV6_MULTICAST_LOOP = 0x13 IPV6_NEXTHOP = 0x9 IPV6_ORIGDSTADDR = 0x4a IPV6_PATHMTU = 0x3d IPV6_PKTINFO = 0x32 IPV6_PMTUDISC_DO = 0x2 IPV6_PMTUDISC_DONT = 0x0 IPV6_PMTUDISC_INTERFACE = 0x4 IPV6_PMTUDISC_OMIT = 0x5 IPV6_PMTUDISC_PROBE = 0x3 IPV6_PMTUDISC_WANT = 0x1 IPV6_RECVDSTOPTS = 0x3a IPV6_RECVERR = 0x19 IPV6_RECVFRAGSIZE = 0x4d IPV6_RECVHOPLIMIT = 0x33 IPV6_RECVHOPOPTS = 0x35 IPV6_RECVORIGDSTADDR = 0x4a IPV6_RECVPATHMTU = 0x3c IPV6_RECVPKTINFO = 0x31 IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 IPV6_RTHDR_STRICT = 0x1 IPV6_RTHDR_TYPE_0 = 0x0 IPV6_RXDSTOPTS = 0x3b IPV6_RXHOPOPTS = 0x36 IPV6_TCLASS = 0x43 IPV6_TRANSPARENT = 0x4b IPV6_UNICAST_HOPS = 0x10 IPV6_UNICAST_IF = 0x4c IPV6_V6ONLY = 0x1a IPV6_XFRM_POLICY = 0x23 IP_ADD_MEMBERSHIP = 0x23 IP_ADD_SOURCE_MEMBERSHIP = 0x27 IP_BIND_ADDRESS_NO_PORT = 0x18 IP_BLOCK_SOURCE = 0x26 IP_CHECKSUM = 0x17 IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 IP_DROP_MEMBERSHIP = 0x24 IP_DROP_SOURCE_MEMBERSHIP = 0x28 IP_FREEBIND = 0xf IP_HDRINCL = 0x3 IP_IPSEC_POLICY = 0x10 IP_MAXPACKET = 0xffff IP_MAX_MEMBERSHIPS = 0x14 IP_MF = 0x2000 IP_MINTTL = 0x15 IP_MSFILTER = 0x29 IP_MSS = 0x240 IP_MTU = 0xe IP_MTU_DISCOVER = 0xa IP_MULTICAST_ALL = 0x31 IP_MULTICAST_IF = 0x20 IP_MULTICAST_LOOP = 0x22 IP_MULTICAST_TTL = 0x21 IP_NODEFRAG = 0x16 IP_OFFMASK = 0x1fff IP_OPTIONS = 0x4 IP_ORIGDSTADDR = 0x14 IP_PASSSEC = 0x12 IP_PKTINFO = 0x8 IP_PKTOPTIONS = 0x9 IP_PMTUDISC = 0xa IP_PMTUDISC_DO = 0x2 IP_PMTUDISC_DONT = 0x0 IP_PMTUDISC_INTERFACE = 0x4 IP_PMTUDISC_OMIT = 0x5 IP_PMTUDISC_PROBE = 0x3 IP_PMTUDISC_WANT = 0x1 IP_RECVERR = 0xb IP_RECVFRAGSIZE = 0x19 IP_RECVOPTS = 0x6 IP_RECVORIGDSTADDR = 0x14 IP_RECVRETOPTS = 0x7 IP_RECVTOS = 0xd IP_RECVTTL = 0xc IP_RETOPTS = 0x7 IP_RF = 0x8000 IP_ROUTER_ALERT = 0x5 IP_TOS = 0x1 IP_TRANSPARENT = 0x13 IP_TTL = 0x2 IP_UNBLOCK_SOURCE = 0x25 IP_UNICAST_IF = 0x32 IP_XFRM_POLICY = 0x11 ISIG = 0x1 ISTRIP = 0x20 IUCLC = 0x200 IUTF8 = 0x4000 IXANY = 0x800 IXOFF = 0x1000 IXON = 0x400 KEYCTL_ASSUME_AUTHORITY = 0x10 KEYCTL_CHOWN = 0x4 KEYCTL_CLEAR = 0x7 KEYCTL_DESCRIBE = 0x6 KEYCTL_DH_COMPUTE = 0x17 KEYCTL_GET_KEYRING_ID = 0x0 KEYCTL_GET_PERSISTENT = 0x16 KEYCTL_GET_SECURITY = 0x11 KEYCTL_INSTANTIATE = 0xc KEYCTL_INSTANTIATE_IOV = 0x14 KEYCTL_INVALIDATE = 0x15 KEYCTL_JOIN_SESSION_KEYRING = 0x1 KEYCTL_LINK = 0x8 KEYCTL_NEGATE = 0xd KEYCTL_READ = 0xb KEYCTL_REJECT = 0x13 KEYCTL_RESTRICT_KEYRING = 0x1d KEYCTL_REVOKE = 0x3 KEYCTL_SEARCH = 0xa KEYCTL_SESSION_TO_PARENT = 0x12 KEYCTL_SETPERM = 0x5 KEYCTL_SET_REQKEY_KEYRING = 0xe KEYCTL_SET_TIMEOUT = 0xf KEYCTL_UNLINK = 0x9 KEYCTL_UPDATE = 0x2 KEY_REQKEY_DEFL_DEFAULT = 0x0 KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 KEY_REQKEY_DEFL_NO_CHANGE = -0x1 KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 KEY_REQKEY_DEFL_USER_KEYRING = 0x4 KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 KEY_SPEC_GROUP_KEYRING = -0x6 KEY_SPEC_PROCESS_KEYRING = -0x2 KEY_SPEC_REQKEY_AUTH_KEY = -0x7 KEY_SPEC_REQUESTOR_KEYRING = -0x8 KEY_SPEC_SESSION_KEYRING = -0x3 KEY_SPEC_THREAD_KEYRING = -0x1 KEY_SPEC_USER_KEYRING = -0x4 KEY_SPEC_USER_SESSION_KEYRING = -0x5 LINUX_REBOOT_CMD_CAD_OFF = 0x0 LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef LINUX_REBOOT_CMD_HALT = 0xcdef0123 LINUX_REBOOT_CMD_KEXEC = 0x45584543 LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc LINUX_REBOOT_CMD_RESTART = 0x1234567 LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 LINUX_REBOOT_MAGIC1 = 0xfee1dead LINUX_REBOOT_MAGIC2 = 0x28121969 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 MADV_DONTFORK = 0xa MADV_DONTNEED = 0x4 MADV_FREE = 0x8 MADV_HUGEPAGE = 0xe MADV_HWPOISON = 0x64 MADV_MERGEABLE = 0xc MADV_NOHUGEPAGE = 0xf MADV_NORMAL = 0x0 MADV_RANDOM = 0x1 MADV_REMOVE = 0x9 MADV_SEQUENTIAL = 0x2 MADV_UNMERGEABLE = 0xd MADV_WILLNEED = 0x3 MAP_ANON = 0x20 MAP_ANONYMOUS = 0x20 MAP_DENYWRITE = 0x800 MAP_EXECUTABLE = 0x1000 MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_GROWSDOWN = 0x100 MAP_HUGETLB = 0x40000 MAP_HUGE_MASK = 0x3f MAP_HUGE_SHIFT = 0x1a MAP_LOCKED = 0x2000 MAP_NONBLOCK = 0x10000 MAP_NORESERVE = 0x4000 MAP_POPULATE = 0x8000 MAP_PRIVATE = 0x2 MAP_SHARED = 0x1 MAP_STACK = 0x20000 MAP_TYPE = 0xf MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MCL_ONFAULT = 0x4 MNT_DETACH = 0x2 MNT_EXPIRE = 0x4 MNT_FORCE = 0x1 MSG_BATCH = 0x40000 MSG_CMSG_CLOEXEC = 0x40000000 MSG_CONFIRM = 0x800 MSG_CTRUNC = 0x8 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x40 MSG_EOR = 0x80 MSG_ERRQUEUE = 0x2000 MSG_FASTOPEN = 0x20000000 MSG_FIN = 0x200 MSG_MORE = 0x8000 MSG_NOSIGNAL = 0x4000 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_PROXY = 0x10 MSG_RST = 0x1000 MSG_SYN = 0x400 MSG_TRUNC = 0x20 MSG_TRYHARD = 0x4 MSG_WAITALL = 0x100 MSG_WAITFORONE = 0x10000 MS_ACTIVE = 0x40000000 MS_ASYNC = 0x1 MS_BIND = 0x1000 MS_BORN = 0x20000000 MS_DIRSYNC = 0x80 MS_INVALIDATE = 0x2 MS_I_VERSION = 0x800000 MS_KERNMOUNT = 0x400000 MS_LAZYTIME = 0x2000000 MS_MANDLOCK = 0x40 MS_MGC_MSK = 0xffff0000 MS_MGC_VAL = 0xc0ed0000 MS_MOVE = 0x2000 MS_NOATIME = 0x400 MS_NODEV = 0x4 MS_NODIRATIME = 0x800 MS_NOEXEC = 0x8 MS_NOREMOTELOCK = 0x8000000 MS_NOSEC = 0x10000000 MS_NOSUID = 0x2 MS_NOUSER = -0x80000000 MS_POSIXACL = 0x10000 MS_PRIVATE = 0x40000 MS_RDONLY = 0x1 MS_REC = 0x4000 MS_RELATIME = 0x200000 MS_REMOUNT = 0x20 MS_RMT_MASK = 0x2800051 MS_SHARED = 0x100000 MS_SILENT = 0x8000 MS_SLAVE = 0x80000 MS_STRICTATIME = 0x1000000 MS_SUBMOUNT = 0x4000000 MS_SYNC = 0x4 MS_SYNCHRONOUS = 0x10 MS_UNBINDABLE = 0x20000 MS_VERBOSE = 0x8000 NAME_MAX = 0xff NETLINK_ADD_MEMBERSHIP = 0x1 NETLINK_AUDIT = 0x9 NETLINK_BROADCAST_ERROR = 0x4 NETLINK_CAP_ACK = 0xa NETLINK_CONNECTOR = 0xb NETLINK_CRYPTO = 0x15 NETLINK_DNRTMSG = 0xe NETLINK_DROP_MEMBERSHIP = 0x2 NETLINK_ECRYPTFS = 0x13 NETLINK_EXT_ACK = 0xb NETLINK_FIB_LOOKUP = 0xa NETLINK_FIREWALL = 0x3 NETLINK_GENERIC = 0x10 NETLINK_INET_DIAG = 0x4 NETLINK_IP6_FW = 0xd NETLINK_ISCSI = 0x8 NETLINK_KOBJECT_UEVENT = 0xf NETLINK_LISTEN_ALL_NSID = 0x8 NETLINK_LIST_MEMBERSHIPS = 0x9 NETLINK_NETFILTER = 0xc NETLINK_NFLOG = 0x5 NETLINK_NO_ENOBUFS = 0x5 NETLINK_PKTINFO = 0x3 NETLINK_RDMA = 0x14 NETLINK_ROUTE = 0x0 NETLINK_RX_RING = 0x6 NETLINK_SCSITRANSPORT = 0x12 NETLINK_SELINUX = 0x7 NETLINK_SMC = 0x16 NETLINK_SOCK_DIAG = 0x4 NETLINK_TX_RING = 0x7 NETLINK_UNUSED = 0x1 NETLINK_USERSOCK = 0x2 NETLINK_XFRM = 0x6 NL0 = 0x0 NL1 = 0x100 NLA_ALIGNTO = 0x4 NLA_F_NESTED = 0x8000 NLA_F_NET_BYTEORDER = 0x4000 NLA_HDRLEN = 0x4 NLDLY = 0x100 NLMSG_ALIGNTO = 0x4 NLMSG_DONE = 0x3 NLMSG_ERROR = 0x2 NLMSG_HDRLEN = 0x10 NLMSG_MIN_TYPE = 0x10 NLMSG_NOOP = 0x1 NLMSG_OVERRUN = 0x4 NLM_F_ACK = 0x4 NLM_F_ACK_TLVS = 0x200 NLM_F_APPEND = 0x800 NLM_F_ATOMIC = 0x400 NLM_F_CAPPED = 0x100 NLM_F_CREATE = 0x400 NLM_F_DUMP = 0x300 NLM_F_DUMP_FILTERED = 0x20 NLM_F_DUMP_INTR = 0x10 NLM_F_ECHO = 0x8 NLM_F_EXCL = 0x200 NLM_F_MATCH = 0x200 NLM_F_MULTI = 0x2 NLM_F_REPLACE = 0x100 NLM_F_REQUEST = 0x1 NLM_F_ROOT = 0x100 NOFLSH = 0x80 OCRNL = 0x8 OFDEL = 0x80 OFILL = 0x40 OLCUC = 0x2 ONLCR = 0x4 ONLRET = 0x20 ONOCR = 0x10 OPOST = 0x1 O_ACCMODE = 0x3 O_APPEND = 0x400 O_ASYNC = 0x2000 O_CLOEXEC = 0x80000 O_CREAT = 0x40 O_DIRECT = 0x10000 O_DIRECTORY = 0x4000 O_DSYNC = 0x1000 O_EXCL = 0x80 O_FSYNC = 0x101000 O_LARGEFILE = 0x0 O_NDELAY = 0x800 O_NOATIME = 0x40000 O_NOCTTY = 0x100 O_NOFOLLOW = 0x8000 O_NONBLOCK = 0x800 O_PATH = 0x200000 O_RDONLY = 0x0 O_RDWR = 0x2 O_RSYNC = 0x101000 O_SYNC = 0x101000 O_TMPFILE = 0x404000 O_TRUNC = 0x200 O_WRONLY = 0x1 PACKET_ADD_MEMBERSHIP = 0x1 PACKET_AUXDATA = 0x8 PACKET_BROADCAST = 0x1 PACKET_COPY_THRESH = 0x7 PACKET_DROP_MEMBERSHIP = 0x2 PACKET_FANOUT = 0x12 PACKET_FANOUT_CBPF = 0x6 PACKET_FANOUT_CPU = 0x2 PACKET_FANOUT_DATA = 0x16 PACKET_FANOUT_EBPF = 0x7 PACKET_FANOUT_FLAG_DEFRAG = 0x8000 PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 PACKET_FANOUT_HASH = 0x0 PACKET_FANOUT_LB = 0x1 PACKET_FANOUT_QM = 0x5 PACKET_FANOUT_RND = 0x4 PACKET_FANOUT_ROLLOVER = 0x3 PACKET_FASTROUTE = 0x6 PACKET_HDRLEN = 0xb PACKET_HOST = 0x0 PACKET_KERNEL = 0x7 PACKET_LOOPBACK = 0x5 PACKET_LOSS = 0xe PACKET_MR_ALLMULTI = 0x2 PACKET_MR_MULTICAST = 0x0 PACKET_MR_PROMISC = 0x1 PACKET_MR_UNICAST = 0x3 PACKET_MULTICAST = 0x2 PACKET_ORIGDEV = 0x9 PACKET_OTHERHOST = 0x3 PACKET_OUTGOING = 0x4 PACKET_QDISC_BYPASS = 0x14 PACKET_RECV_OUTPUT = 0x3 PACKET_RESERVE = 0xc PACKET_ROLLOVER_STATS = 0x15 PACKET_RX_RING = 0x5 PACKET_STATISTICS = 0x6 PACKET_TIMESTAMP = 0x11 PACKET_TX_HAS_OFF = 0x13 PACKET_TX_RING = 0xd PACKET_TX_TIMESTAMP = 0x10 PACKET_USER = 0x6 PACKET_VERSION = 0xa PACKET_VNET_HDR = 0xf PARENB = 0x100 PARITY_CRC16_PR0 = 0x2 PARITY_CRC16_PR0_CCITT = 0x4 PARITY_CRC16_PR1 = 0x3 PARITY_CRC16_PR1_CCITT = 0x5 PARITY_CRC32_PR0_CCITT = 0x6 PARITY_CRC32_PR1_CCITT = 0x7 PARITY_DEFAULT = 0x0 PARITY_NONE = 0x1 PARMRK = 0x8 PARODD = 0x200 PENDIN = 0x4000 PERF_EVENT_IOC_DISABLE = 0x2401 PERF_EVENT_IOC_ENABLE = 0x2400 PERF_EVENT_IOC_ID = 0x80082407 PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 PERF_EVENT_IOC_PERIOD = 0x40082404 PERF_EVENT_IOC_REFRESH = 0x2402 PERF_EVENT_IOC_RESET = 0x2403 PERF_EVENT_IOC_SET_BPF = 0x40042408 PERF_EVENT_IOC_SET_FILTER = 0x40082406 PERF_EVENT_IOC_SET_OUTPUT = 0x2405 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 PROT_EXEC = 0x4 PROT_GROWSDOWN = 0x1000000 PROT_GROWSUP = 0x2000000 PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 PR_CAPBSET_DROP = 0x18 PR_CAPBSET_READ = 0x17 PR_CAP_AMBIENT = 0x2f PR_CAP_AMBIENT_CLEAR_ALL = 0x4 PR_CAP_AMBIENT_IS_SET = 0x1 PR_CAP_AMBIENT_LOWER = 0x3 PR_CAP_AMBIENT_RAISE = 0x2 PR_ENDIAN_BIG = 0x0 PR_ENDIAN_LITTLE = 0x1 PR_ENDIAN_PPC_LITTLE = 0x2 PR_FPEMU_NOPRINT = 0x1 PR_FPEMU_SIGFPE = 0x2 PR_FP_EXC_ASYNC = 0x2 PR_FP_EXC_DISABLED = 0x0 PR_FP_EXC_DIV = 0x10000 PR_FP_EXC_INV = 0x100000 PR_FP_EXC_NONRECOV = 0x1 PR_FP_EXC_OVF = 0x20000 PR_FP_EXC_PRECISE = 0x3 PR_FP_EXC_RES = 0x80000 PR_FP_EXC_SW_ENABLE = 0x80 PR_FP_EXC_UND = 0x40000 PR_FP_MODE_FR = 0x1 PR_FP_MODE_FRE = 0x2 PR_GET_CHILD_SUBREAPER = 0x25 PR_GET_DUMPABLE = 0x3 PR_GET_ENDIAN = 0x13 PR_GET_FPEMU = 0x9 PR_GET_FPEXC = 0xb PR_GET_FP_MODE = 0x2e PR_GET_KEEPCAPS = 0x7 PR_GET_NAME = 0x10 PR_GET_NO_NEW_PRIVS = 0x27 PR_GET_PDEATHSIG = 0x2 PR_GET_SECCOMP = 0x15 PR_GET_SECUREBITS = 0x1b PR_GET_THP_DISABLE = 0x2a PR_GET_TID_ADDRESS = 0x28 PR_GET_TIMERSLACK = 0x1e PR_GET_TIMING = 0xd PR_GET_TSC = 0x19 PR_GET_UNALIGN = 0x5 PR_MCE_KILL = 0x21 PR_MCE_KILL_CLEAR = 0x0 PR_MCE_KILL_DEFAULT = 0x2 PR_MCE_KILL_EARLY = 0x1 PR_MCE_KILL_GET = 0x22 PR_MCE_KILL_LATE = 0x0 PR_MCE_KILL_SET = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b PR_SET_CHILD_SUBREAPER = 0x24 PR_SET_DUMPABLE = 0x4 PR_SET_ENDIAN = 0x14 PR_SET_FPEMU = 0xa PR_SET_FPEXC = 0xc PR_SET_FP_MODE = 0x2d PR_SET_KEEPCAPS = 0x8 PR_SET_MM = 0x23 PR_SET_MM_ARG_END = 0x9 PR_SET_MM_ARG_START = 0x8 PR_SET_MM_AUXV = 0xc PR_SET_MM_BRK = 0x7 PR_SET_MM_END_CODE = 0x2 PR_SET_MM_END_DATA = 0x4 PR_SET_MM_ENV_END = 0xb PR_SET_MM_ENV_START = 0xa PR_SET_MM_EXE_FILE = 0xd PR_SET_MM_MAP = 0xe PR_SET_MM_MAP_SIZE = 0xf PR_SET_MM_START_BRK = 0x6 PR_SET_MM_START_CODE = 0x1 PR_SET_MM_START_DATA = 0x3 PR_SET_MM_START_STACK = 0x5 PR_SET_NAME = 0xf PR_SET_NO_NEW_PRIVS = 0x26 PR_SET_PDEATHSIG = 0x1 PR_SET_PTRACER = 0x59616d61 PR_SET_PTRACER_ANY = 0xffffffffffffffff PR_SET_SECCOMP = 0x16 PR_SET_SECUREBITS = 0x1c PR_SET_THP_DISABLE = 0x29 PR_SET_TIMERSLACK = 0x1d PR_SET_TIMING = 0xe PR_SET_TSC = 0x1a PR_SET_UNALIGN = 0x6 PR_TASK_PERF_EVENTS_DISABLE = 0x1f PR_TASK_PERF_EVENTS_ENABLE = 0x20 PR_TIMING_STATISTICAL = 0x0 PR_TIMING_TIMESTAMP = 0x1 PR_TSC_ENABLE = 0x1 PR_TSC_SIGSEGV = 0x2 PR_UNALIGN_NOPRINT = 0x1 PR_UNALIGN_SIGBUS = 0x2 PTRACE_ATTACH = 0x10 PTRACE_CONT = 0x7 PTRACE_DETACH = 0x11 PTRACE_EVENT_CLONE = 0x3 PTRACE_EVENT_EXEC = 0x4 PTRACE_EVENT_EXIT = 0x6 PTRACE_EVENT_FORK = 0x1 PTRACE_EVENT_SECCOMP = 0x7 PTRACE_EVENT_STOP = 0x80 PTRACE_EVENT_VFORK = 0x2 PTRACE_EVENT_VFORK_DONE = 0x5 PTRACE_GETEVENTMSG = 0x4201 PTRACE_GETREGS = 0xc PTRACE_GETREGSET = 0x4204 PTRACE_GETSIGINFO = 0x4202 PTRACE_GETSIGMASK = 0x420a PTRACE_INTERRUPT = 0x4207 PTRACE_KILL = 0x8 PTRACE_LISTEN = 0x4208 PTRACE_O_EXITKILL = 0x100000 PTRACE_O_MASK = 0x3000ff PTRACE_O_SUSPEND_SECCOMP = 0x200000 PTRACE_O_TRACECLONE = 0x8 PTRACE_O_TRACEEXEC = 0x10 PTRACE_O_TRACEEXIT = 0x40 PTRACE_O_TRACEFORK = 0x2 PTRACE_O_TRACESECCOMP = 0x80 PTRACE_O_TRACESYSGOOD = 0x1 PTRACE_O_TRACEVFORK = 0x4 PTRACE_O_TRACEVFORKDONE = 0x20 PTRACE_PEEKDATA = 0x2 PTRACE_PEEKSIGINFO = 0x4209 PTRACE_PEEKSIGINFO_SHARED = 0x1 PTRACE_PEEKTEXT = 0x1 PTRACE_PEEKUSR = 0x3 PTRACE_POKEDATA = 0x5 PTRACE_POKETEXT = 0x4 PTRACE_POKEUSR = 0x6 PTRACE_SECCOMP_GET_FILTER = 0x420c PTRACE_SEIZE = 0x4206 PTRACE_SETOPTIONS = 0x4200 PTRACE_SETREGS = 0xd PTRACE_SETREGSET = 0x4205 PTRACE_SETSIGINFO = 0x4203 PTRACE_SETSIGMASK = 0x420b PTRACE_SINGLESTEP = 0x9 PTRACE_SYSCALL = 0x18 PTRACE_TRACEME = 0x0 RLIMIT_AS = 0x9 RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 RLIMIT_LOCKS = 0xa RLIMIT_MEMLOCK = 0x8 RLIMIT_MSGQUEUE = 0xc RLIMIT_NICE = 0xd RLIMIT_NOFILE = 0x7 RLIMIT_NPROC = 0x6 RLIMIT_RSS = 0x5 RLIMIT_RTPRIO = 0xe RLIMIT_RTTIME = 0xf RLIMIT_SIGPENDING = 0xb RLIMIT_STACK = 0x3 RLIM_INFINITY = 0xffffffffffffffff RTAX_ADVMSS = 0x8 RTAX_CC_ALGO = 0x10 RTAX_CWND = 0x7 RTAX_FEATURES = 0xc RTAX_FEATURE_ALLFRAG = 0x8 RTAX_FEATURE_ECN = 0x1 RTAX_FEATURE_MASK = 0xf RTAX_FEATURE_SACK = 0x2 RTAX_FEATURE_TIMESTAMP = 0x4 RTAX_HOPLIMIT = 0xa RTAX_INITCWND = 0xb RTAX_INITRWND = 0xe RTAX_LOCK = 0x1 RTAX_MAX = 0x10 RTAX_MTU = 0x2 RTAX_QUICKACK = 0xf RTAX_REORDERING = 0x9 RTAX_RTO_MIN = 0xd RTAX_RTT = 0x4 RTAX_RTTVAR = 0x5 RTAX_SSTHRESH = 0x6 RTAX_UNSPEC = 0x0 RTAX_WINDOW = 0x3 RTA_ALIGNTO = 0x4 RTA_MAX = 0x1a RTCF_DIRECTSRC = 0x4000000 RTCF_DOREDIRECT = 0x1000000 RTCF_LOG = 0x2000000 RTCF_MASQ = 0x400000 RTCF_NAT = 0x800000 RTCF_VALVE = 0x200000 RTF_ADDRCLASSMASK = 0xf8000000 RTF_ADDRCONF = 0x40000 RTF_ALLONLINK = 0x20000 RTF_BROADCAST = 0x10000000 RTF_CACHE = 0x1000000 RTF_DEFAULT = 0x10000 RTF_DYNAMIC = 0x10 RTF_FLOW = 0x2000000 RTF_GATEWAY = 0x2 RTF_HOST = 0x4 RTF_INTERFACE = 0x40000000 RTF_IRTT = 0x100 RTF_LINKRT = 0x100000 RTF_LOCAL = 0x80000000 RTF_MODIFIED = 0x20 RTF_MSS = 0x40 RTF_MTU = 0x40 RTF_MULTICAST = 0x20000000 RTF_NAT = 0x8000000 RTF_NOFORWARD = 0x1000 RTF_NONEXTHOP = 0x200000 RTF_NOPMTUDISC = 0x4000 RTF_POLICY = 0x4000000 RTF_REINSTATE = 0x8 RTF_REJECT = 0x200 RTF_STATIC = 0x400 RTF_THROW = 0x2000 RTF_UP = 0x1 RTF_WINDOW = 0x80 RTF_XRESOLVE = 0x800 RTM_BASE = 0x10 RTM_DELACTION = 0x31 RTM_DELADDR = 0x15 RTM_DELADDRLABEL = 0x49 RTM_DELLINK = 0x11 RTM_DELMDB = 0x55 RTM_DELNEIGH = 0x1d RTM_DELNETCONF = 0x51 RTM_DELNSID = 0x59 RTM_DELQDISC = 0x25 RTM_DELROUTE = 0x19 RTM_DELRULE = 0x21 RTM_DELTCLASS = 0x29 RTM_DELTFILTER = 0x2d RTM_F_CLONED = 0x200 RTM_F_EQUALIZE = 0x400 RTM_F_FIB_MATCH = 0x2000 RTM_F_LOOKUP_TABLE = 0x1000 RTM_F_NOTIFY = 0x100 RTM_F_PREFIX = 0x800 RTM_GETACTION = 0x32 RTM_GETADDR = 0x16 RTM_GETADDRLABEL = 0x4a RTM_GETANYCAST = 0x3e RTM_GETDCB = 0x4e RTM_GETLINK = 0x12 RTM_GETMDB = 0x56 RTM_GETMULTICAST = 0x3a RTM_GETNEIGH = 0x1e RTM_GETNEIGHTBL = 0x42 RTM_GETNETCONF = 0x52 RTM_GETNSID = 0x5a RTM_GETQDISC = 0x26 RTM_GETROUTE = 0x1a RTM_GETRULE = 0x22 RTM_GETSTATS = 0x5e RTM_GETTCLASS = 0x2a RTM_GETTFILTER = 0x2e RTM_MAX = 0x63 RTM_NEWACTION = 0x30 RTM_NEWADDR = 0x14 RTM_NEWADDRLABEL = 0x48 RTM_NEWCACHEREPORT = 0x60 RTM_NEWLINK = 0x10 RTM_NEWMDB = 0x54 RTM_NEWNDUSEROPT = 0x44 RTM_NEWNEIGH = 0x1c RTM_NEWNEIGHTBL = 0x40 RTM_NEWNETCONF = 0x50 RTM_NEWNSID = 0x58 RTM_NEWPREFIX = 0x34 RTM_NEWQDISC = 0x24 RTM_NEWROUTE = 0x18 RTM_NEWRULE = 0x20 RTM_NEWSTATS = 0x5c RTM_NEWTCLASS = 0x28 RTM_NEWTFILTER = 0x2c RTM_NR_FAMILIES = 0x15 RTM_NR_MSGTYPES = 0x54 RTM_SETDCB = 0x4f RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 RTNH_ALIGNTO = 0x4 RTNH_COMPARE_MASK = 0x19 RTNH_F_DEAD = 0x1 RTNH_F_LINKDOWN = 0x10 RTNH_F_OFFLOAD = 0x8 RTNH_F_ONLINK = 0x4 RTNH_F_PERVASIVE = 0x2 RTNH_F_UNRESOLVED = 0x20 RTN_MAX = 0xb RTPROT_BABEL = 0x2a RTPROT_BIRD = 0xc RTPROT_BOOT = 0x3 RTPROT_DHCP = 0x10 RTPROT_DNROUTED = 0xd RTPROT_GATED = 0x8 RTPROT_KERNEL = 0x2 RTPROT_MROUTED = 0x11 RTPROT_MRT = 0xa RTPROT_NTK = 0xf RTPROT_RA = 0x9 RTPROT_REDIRECT = 0x1 RTPROT_STATIC = 0x4 RTPROT_UNSPEC = 0x0 RTPROT_XORP = 0xe RTPROT_ZEBRA = 0xb RT_CLASS_DEFAULT = 0xfd RT_CLASS_LOCAL = 0xff RT_CLASS_MAIN = 0xfe RT_CLASS_MAX = 0xff RT_CLASS_UNSPEC = 0x0 RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 RUSAGE_THREAD = 0x1 SCM_CREDENTIALS = 0x2 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x1d SCM_TIMESTAMPING = 0x25 SCM_TIMESTAMPING_OPT_STATS = 0x36 SCM_TIMESTAMPING_PKTINFO = 0x3a SCM_TIMESTAMPNS = 0x23 SCM_WIFI_STATUS = 0x29 SECCOMP_MODE_DISABLED = 0x0 SECCOMP_MODE_FILTER = 0x2 SECCOMP_MODE_STRICT = 0x1 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 SIOCADDDLCI = 0x8980 SIOCADDMULTI = 0x8931 SIOCADDRT = 0x890b SIOCATMARK = 0x8905 SIOCBONDCHANGEACTIVE = 0x8995 SIOCBONDENSLAVE = 0x8990 SIOCBONDINFOQUERY = 0x8994 SIOCBONDRELEASE = 0x8991 SIOCBONDSETHWADDR = 0x8992 SIOCBONDSLAVEINFOQUERY = 0x8993 SIOCBRADDBR = 0x89a0 SIOCBRADDIF = 0x89a2 SIOCBRDELBR = 0x89a1 SIOCBRDELIF = 0x89a3 SIOCDARP = 0x8953 SIOCDELDLCI = 0x8981 SIOCDELMULTI = 0x8932 SIOCDELRT = 0x890c SIOCDEVPRIVATE = 0x89f0 SIOCDIFADDR = 0x8936 SIOCDRARP = 0x8960 SIOCETHTOOL = 0x8946 SIOCGARP = 0x8954 SIOCGHWTSTAMP = 0x89b1 SIOCGIFADDR = 0x8915 SIOCGIFBR = 0x8940 SIOCGIFBRDADDR = 0x8919 SIOCGIFCONF = 0x8912 SIOCGIFCOUNT = 0x8938 SIOCGIFDSTADDR = 0x8917 SIOCGIFENCAP = 0x8925 SIOCGIFFLAGS = 0x8913 SIOCGIFHWADDR = 0x8927 SIOCGIFINDEX = 0x8933 SIOCGIFMAP = 0x8970 SIOCGIFMEM = 0x891f SIOCGIFMETRIC = 0x891d SIOCGIFMTU = 0x8921 SIOCGIFNAME = 0x8910 SIOCGIFNETMASK = 0x891b SIOCGIFPFLAGS = 0x8935 SIOCGIFSLAVE = 0x8929 SIOCGIFTXQLEN = 0x8942 SIOCGIFVLAN = 0x8982 SIOCGMIIPHY = 0x8947 SIOCGMIIREG = 0x8948 SIOCGPGRP = 0x8904 SIOCGRARP = 0x8961 SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 SIOCGSTAMPNS = 0x8907 SIOCINQ = 0x541b SIOCOUTQ = 0x5411 SIOCOUTQNSD = 0x894b SIOCPROTOPRIVATE = 0x89e0 SIOCRTMSG = 0x890d SIOCSARP = 0x8955 SIOCSHWTSTAMP = 0x89b0 SIOCSIFADDR = 0x8916 SIOCSIFBR = 0x8941 SIOCSIFBRDADDR = 0x891a SIOCSIFDSTADDR = 0x8918 SIOCSIFENCAP = 0x8926 SIOCSIFFLAGS = 0x8914 SIOCSIFHWADDR = 0x8924 SIOCSIFHWBROADCAST = 0x8937 SIOCSIFLINK = 0x8911 SIOCSIFMAP = 0x8971 SIOCSIFMEM = 0x8920 SIOCSIFMETRIC = 0x891e SIOCSIFMTU = 0x8922 SIOCSIFNAME = 0x8923 SIOCSIFNETMASK = 0x891c SIOCSIFPFLAGS = 0x8934 SIOCSIFSLAVE = 0x8930 SIOCSIFTXQLEN = 0x8943 SIOCSIFVLAN = 0x8983 SIOCSMIIREG = 0x8949 SIOCSPGRP = 0x8902 SIOCSRARP = 0x8962 SIOCWANDEV = 0x894a SOCK_CLOEXEC = 0x80000 SOCK_DCCP = 0x6 SOCK_DGRAM = 0x2 SOCK_IOC_TYPE = 0x89 SOCK_NONBLOCK = 0x800 SOCK_PACKET = 0xa SOCK_RAW = 0x3 SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x1 SOL_AAL = 0x109 SOL_ALG = 0x117 SOL_ATM = 0x108 SOL_CAIF = 0x116 SOL_CAN_BASE = 0x64 SOL_DCCP = 0x10d SOL_DECNET = 0x105 SOL_ICMPV6 = 0x3a SOL_IP = 0x0 SOL_IPV6 = 0x29 SOL_IRDA = 0x10a SOL_IUCV = 0x115 SOL_KCM = 0x119 SOL_LLC = 0x10c SOL_NETBEUI = 0x10b SOL_NETLINK = 0x10e SOL_NFC = 0x118 SOL_PACKET = 0x107 SOL_PNPIPE = 0x113 SOL_PPPOL2TP = 0x111 SOL_RAW = 0xff SOL_RDS = 0x114 SOL_RXRPC = 0x110 SOL_SOCKET = 0x1 SOL_TCP = 0x6 SOL_TIPC = 0x10f SOL_X25 = 0x106 SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x1e SO_ATTACH_BPF = 0x32 SO_ATTACH_FILTER = 0x1a SO_ATTACH_REUSEPORT_CBPF = 0x33 SO_ATTACH_REUSEPORT_EBPF = 0x34 SO_BINDTODEVICE = 0x19 SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe SO_BUSY_POLL = 0x2e SO_CNX_ADVICE = 0x35 SO_COOKIE = 0x39 SO_DEBUG = 0x1 SO_DETACH_BPF = 0x1b SO_DETACH_FILTER = 0x1b SO_DOMAIN = 0x27 SO_DONTROUTE = 0x5 SO_ERROR = 0x4 SO_GET_FILTER = 0x1a SO_INCOMING_CPU = 0x31 SO_INCOMING_NAPI_ID = 0x38 SO_KEEPALIVE = 0x9 SO_LINGER = 0xd SO_LOCK_FILTER = 0x2c SO_MARK = 0x24 SO_MAX_PACING_RATE = 0x2f SO_MEMINFO = 0x37 SO_NOFCS = 0x2b SO_NO_CHECK = 0xb SO_OOBINLINE = 0xa SO_PASSCRED = 0x10 SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x11 SO_PEERGROUPS = 0x3b SO_PEERNAME = 0x1c SO_PEERSEC = 0x1f SO_PRIORITY = 0xc SO_PROTOCOL = 0x26 SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x12 SO_RCVTIMEO = 0x14 SO_REUSEADDR = 0x2 SO_REUSEPORT = 0xf SO_RXQ_OVFL = 0x28 SO_SECURITY_AUTHENTICATION = 0x16 SO_SECURITY_ENCRYPTION_NETWORK = 0x18 SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 SO_SELECT_ERR_QUEUE = 0x2d SO_SNDBUF = 0x7 SO_SNDBUFFORCE = 0x20 SO_SNDLOWAT = 0x13 SO_SNDTIMEO = 0x15 SO_TIMESTAMP = 0x1d SO_TIMESTAMPING = 0x25 SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x3 SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 SO_VM_SOCKETS_BUFFER_SIZE = 0x0 SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 SO_VM_SOCKETS_TRUSTED = 0x5 SO_WIFI_STATUS = 0x29 SPLICE_F_GIFT = 0x8 SPLICE_F_MORE = 0x4 SPLICE_F_MOVE = 0x1 SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000 S_IFCHR = 0x2000 S_IFDIR = 0x4000 S_IFIFO = 0x1000 S_IFLNK = 0xa000 S_IFMT = 0xf000 S_IFREG = 0x8000 S_IFSOCK = 0xc000 S_IREAD = 0x100 S_IRGRP = 0x20 S_IROTH = 0x4 S_IRUSR = 0x100 S_IRWXG = 0x38 S_IRWXO = 0x7 S_IRWXU = 0x1c0 S_ISGID = 0x400 S_ISUID = 0x800 S_ISVTX = 0x200 S_IWGRP = 0x10 S_IWOTH = 0x2 S_IWRITE = 0x80 S_IWUSR = 0x80 S_IXGRP = 0x8 S_IXOTH = 0x1 S_IXUSR = 0x40 TAB0 = 0x0 TAB1 = 0x800 TAB2 = 0x1000 TAB3 = 0x1800 TABDLY = 0x1800 TASKSTATS_CMD_ATTR_MAX = 0x4 TASKSTATS_CMD_MAX = 0x2 TASKSTATS_GENL_NAME = "TASKSTATS" TASKSTATS_GENL_VERSION = 0x1 TASKSTATS_TYPE_MAX = 0x6 TASKSTATS_VERSION = 0x8 TCFLSH = 0x540b TCGETA = 0x5405 TCGETS = 0x5401 TCGETS2 = 0x802c542a TCGETX = 0x5432 TCIFLUSH = 0x0 TCIOFF = 0x2 TCIOFLUSH = 0x2 TCION = 0x3 TCOFLUSH = 0x1 TCOOFF = 0x0 TCOON = 0x1 TCP_CC_INFO = 0x1a TCP_CONGESTION = 0xd TCP_COOKIE_IN_ALWAYS = 0x1 TCP_COOKIE_MAX = 0x10 TCP_COOKIE_MIN = 0x8 TCP_COOKIE_OUT_NEVER = 0x2 TCP_COOKIE_PAIR_SIZE = 0x20 TCP_COOKIE_TRANSACTIONS = 0xf TCP_CORK = 0x3 TCP_DEFER_ACCEPT = 0x9 TCP_FASTOPEN = 0x17 TCP_FASTOPEN_CONNECT = 0x1e TCP_INFO = 0xb TCP_KEEPCNT = 0x6 TCP_KEEPIDLE = 0x4 TCP_KEEPINTVL = 0x5 TCP_LINGER2 = 0x8 TCP_MAXSEG = 0x2 TCP_MAXWIN = 0xffff TCP_MAX_WINSHIFT = 0xe TCP_MD5SIG = 0xe TCP_MD5SIG_MAXKEYLEN = 0x50 TCP_MSS = 0x200 TCP_MSS_DEFAULT = 0x218 TCP_MSS_DESIRED = 0x4c4 TCP_NODELAY = 0x1 TCP_NOTSENT_LOWAT = 0x19 TCP_QUEUE_SEQ = 0x15 TCP_QUICKACK = 0xc TCP_REPAIR = 0x13 TCP_REPAIR_OPTIONS = 0x16 TCP_REPAIR_QUEUE = 0x14 TCP_REPAIR_WINDOW = 0x1d TCP_SAVED_SYN = 0x1c TCP_SAVE_SYN = 0x1b TCP_SYNCNT = 0x7 TCP_S_DATA_IN = 0x4 TCP_S_DATA_OUT = 0x8 TCP_THIN_DUPACK = 0x11 TCP_THIN_LINEAR_TIMEOUTS = 0x10 TCP_TIMESTAMP = 0x18 TCP_USER_TIMEOUT = 0x12 TCP_WINDOW_CLAMP = 0xa TCSAFLUSH = 0x2 TCSBRK = 0x5409 TCSBRKP = 0x5425 TCSETA = 0x5406 TCSETAF = 0x5408 TCSETAW = 0x5407 TCSETS = 0x5402 TCSETS2 = 0x402c542b TCSETSF = 0x5404 TCSETSF2 = 0x402c542d TCSETSW = 0x5403 TCSETSW2 = 0x402c542c TCSETX = 0x5433 TCSETXF = 0x5434 TCSETXW = 0x5435 TCXONC = 0x540a TIOCCBRK = 0x5428 TIOCCONS = 0x541d TIOCEXCL = 0x540c TIOCGDEV = 0x80045432 TIOCGETD = 0x5424 TIOCGEXCL = 0x80045440 TIOCGICOUNT = 0x545d TIOCGLCKTRMIOS = 0x5456 TIOCGPGRP = 0x540f TIOCGPKT = 0x80045438 TIOCGPTLCK = 0x80045439 TIOCGPTN = 0x80045430 TIOCGPTPEER = 0x5441 TIOCGRS485 = 0x542e TIOCGSERIAL = 0x541e TIOCGSID = 0x5429 TIOCGSOFTCAR = 0x5419 TIOCGWINSZ = 0x5413 TIOCINQ = 0x541b TIOCLINUX = 0x541c TIOCMBIC = 0x5417 TIOCMBIS = 0x5416 TIOCMGET = 0x5415 TIOCMIWAIT = 0x545c TIOCMSET = 0x5418 TIOCM_CAR = 0x40 TIOCM_CD = 0x40 TIOCM_CTS = 0x20 TIOCM_DSR = 0x100 TIOCM_DTR = 0x2 TIOCM_LE = 0x1 TIOCM_RI = 0x80 TIOCM_RNG = 0x80 TIOCM_RTS = 0x4 TIOCM_SR = 0x10 TIOCM_ST = 0x8 TIOCNOTTY = 0x5422 TIOCNXCL = 0x540d TIOCOUTQ = 0x5411 TIOCPKT = 0x5420 TIOCPKT_DATA = 0x0 TIOCPKT_DOSTOP = 0x20 TIOCPKT_FLUSHREAD = 0x1 TIOCPKT_FLUSHWRITE = 0x2 TIOCPKT_IOCTL = 0x40 TIOCPKT_NOSTOP = 0x10 TIOCPKT_START = 0x8 TIOCPKT_STOP = 0x4 TIOCSBRK = 0x5427 TIOCSCTTY = 0x540e TIOCSERCONFIG = 0x5453 TIOCSERGETLSR = 0x5459 TIOCSERGETMULTI = 0x545a TIOCSERGSTRUCT = 0x5458 TIOCSERGWILD = 0x5454 TIOCSERSETMULTI = 0x545b TIOCSERSWILD = 0x5455 TIOCSER_TEMT = 0x1 TIOCSETD = 0x5423 TIOCSIG = 0x40045436 TIOCSLCKTRMIOS = 0x5457 TIOCSPGRP = 0x5410 TIOCSPTLCK = 0x40045431 TIOCSRS485 = 0x542f TIOCSSERIAL = 0x541f TIOCSSOFTCAR = 0x541a TIOCSTI = 0x5412 TIOCSWINSZ = 0x5414 TIOCVHANGUP = 0x5437 TOSTOP = 0x100 TS_COMM_LEN = 0x20 TUNATTACHFILTER = 0x401054d5 TUNDETACHFILTER = 0x401054d6 TUNGETFEATURES = 0x800454cf TUNGETFILTER = 0x801054db TUNGETIFF = 0x800454d2 TUNGETSNDBUF = 0x800454d3 TUNGETVNETBE = 0x800454df TUNGETVNETHDRSZ = 0x800454d7 TUNGETVNETLE = 0x800454dd TUNSETDEBUG = 0x400454c9 TUNSETGROUP = 0x400454ce TUNSETIFF = 0x400454ca TUNSETIFINDEX = 0x400454da TUNSETLINK = 0x400454cd TUNSETNOCSUM = 0x400454c8 TUNSETOFFLOAD = 0x400454d0 TUNSETOWNER = 0x400454cc TUNSETPERSIST = 0x400454cb TUNSETQUEUE = 0x400454d9 TUNSETSNDBUF = 0x400454d4 TUNSETTXFILTER = 0x400454d1 TUNSETVNETBE = 0x400454de TUNSETVNETHDRSZ = 0x400454d8 TUNSETVNETLE = 0x400454dc UMOUNT_NOFOLLOW = 0x8 UTIME_NOW = 0x3fffffff UTIME_OMIT = 0x3ffffffe VDISCARD = 0xd VEOF = 0x4 VEOL = 0xb VEOL2 = 0x10 VERASE = 0x2 VINTR = 0x0 VKILL = 0x3 VLNEXT = 0xf VMADDR_CID_ANY = 0xffffffff VMADDR_CID_HOST = 0x2 VMADDR_CID_HYPERVISOR = 0x0 VMADDR_CID_RESERVED = 0x1 VMADDR_PORT_ANY = 0xffffffff VMIN = 0x6 VM_SOCKETS_INVALID_VERSION = 0xffffffff VQUIT = 0x1 VREPRINT = 0xc VSTART = 0x8 VSTOP = 0x9 VSUSP = 0xa VSWTC = 0x7 VT0 = 0x0 VT1 = 0x4000 VTDLY = 0x4000 VTIME = 0x5 VWERASE = 0xe WALL = 0x40000000 WCLONE = 0x80000000 WCONTINUED = 0x8 WDIOC_GETBOOTSTATUS = 0x80045702 WDIOC_GETPRETIMEOUT = 0x80045709 WDIOC_GETSTATUS = 0x80045701 WDIOC_GETSUPPORT = 0x80285700 WDIOC_GETTEMP = 0x80045703 WDIOC_GETTIMELEFT = 0x8004570a WDIOC_GETTIMEOUT = 0x80045707 WDIOC_KEEPALIVE = 0x80045705 WDIOC_SETOPTIONS = 0x80045704 WDIOC_SETPRETIMEOUT = 0xc0045708 WDIOC_SETTIMEOUT = 0xc0045706 WEXITED = 0x4 WNOHANG = 0x1 WNOTHREAD = 0x20000000 WNOWAIT = 0x1000000 WORDSIZE = 0x40 WSTOPPED = 0x2 WUNTRACED = 0x2 XATTR_CREATE = 0x1 XATTR_REPLACE = 0x2 XCASE = 0x4 XTABS = 0x1800 ) // Errors const ( E2BIG = syscall.Errno(0x7) EACCES = syscall.Errno(0xd) EADDRINUSE = syscall.Errno(0x62) EADDRNOTAVAIL = syscall.Errno(0x63) EADV = syscall.Errno(0x44) EAFNOSUPPORT = syscall.Errno(0x61) EAGAIN = syscall.Errno(0xb) EALREADY = syscall.Errno(0x72) EBADE = syscall.Errno(0x34) EBADF = syscall.Errno(0x9) EBADFD = syscall.Errno(0x4d) EBADMSG = syscall.Errno(0x4a) EBADR = syscall.Errno(0x35) EBADRQC = syscall.Errno(0x38) EBADSLT = syscall.Errno(0x39) EBFONT = syscall.Errno(0x3b) EBUSY = syscall.Errno(0x10) ECANCELED = syscall.Errno(0x7d) ECHILD = syscall.Errno(0xa) ECHRNG = syscall.Errno(0x2c) ECOMM = syscall.Errno(0x46) ECONNABORTED = syscall.Errno(0x67) ECONNREFUSED = syscall.Errno(0x6f) ECONNRESET = syscall.Errno(0x68) EDEADLK = syscall.Errno(0x23) EDEADLOCK = syscall.Errno(0x23) EDESTADDRREQ = syscall.Errno(0x59) EDOM = syscall.Errno(0x21) EDOTDOT = syscall.Errno(0x49) EDQUOT = syscall.Errno(0x7a) EEXIST = syscall.Errno(0x11) EFAULT = syscall.Errno(0xe) EFBIG = syscall.Errno(0x1b) EHOSTDOWN = syscall.Errno(0x70) EHOSTUNREACH = syscall.Errno(0x71) EHWPOISON = syscall.Errno(0x85) EIDRM = syscall.Errno(0x2b) EILSEQ = syscall.Errno(0x54) EINPROGRESS = syscall.Errno(0x73) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x6a) EISDIR = syscall.Errno(0x15) EISNAM = syscall.Errno(0x78) EKEYEXPIRED = syscall.Errno(0x7f) EKEYREJECTED = syscall.Errno(0x81) EKEYREVOKED = syscall.Errno(0x80) EL2HLT = syscall.Errno(0x33) EL2NSYNC = syscall.Errno(0x2d) EL3HLT = syscall.Errno(0x2e) EL3RST = syscall.Errno(0x2f) ELIBACC = syscall.Errno(0x4f) ELIBBAD = syscall.Errno(0x50) ELIBEXEC = syscall.Errno(0x53) ELIBMAX = syscall.Errno(0x52) ELIBSCN = syscall.Errno(0x51) ELNRNG = syscall.Errno(0x30) ELOOP = syscall.Errno(0x28) EMEDIUMTYPE = syscall.Errno(0x7c) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) EMSGSIZE = syscall.Errno(0x5a) EMULTIHOP = syscall.Errno(0x48) ENAMETOOLONG = syscall.Errno(0x24) ENAVAIL = syscall.Errno(0x77) ENETDOWN = syscall.Errno(0x64) ENETRESET = syscall.Errno(0x66) ENETUNREACH = syscall.Errno(0x65) ENFILE = syscall.Errno(0x17) ENOANO = syscall.Errno(0x37) ENOBUFS = syscall.Errno(0x69) ENOCSI = syscall.Errno(0x32) ENODATA = syscall.Errno(0x3d) ENODEV = syscall.Errno(0x13) ENOENT = syscall.Errno(0x2) ENOEXEC = syscall.Errno(0x8) ENOKEY = syscall.Errno(0x7e) ENOLCK = syscall.Errno(0x25) ENOLINK = syscall.Errno(0x43) ENOMEDIUM = syscall.Errno(0x7b) ENOMEM = syscall.Errno(0xc) ENOMSG = syscall.Errno(0x2a) ENONET = syscall.Errno(0x40) ENOPKG = syscall.Errno(0x41) ENOPROTOOPT = syscall.Errno(0x5c) ENOSPC = syscall.Errno(0x1c) ENOSR = syscall.Errno(0x3f) ENOSTR = syscall.Errno(0x3c) ENOSYS = syscall.Errno(0x26) ENOTBLK = syscall.Errno(0xf) ENOTCONN = syscall.Errno(0x6b) ENOTDIR = syscall.Errno(0x14) ENOTEMPTY = syscall.Errno(0x27) ENOTNAM = syscall.Errno(0x76) ENOTRECOVERABLE = syscall.Errno(0x83) ENOTSOCK = syscall.Errno(0x58) ENOTSUP = syscall.Errno(0x5f) ENOTTY = syscall.Errno(0x19) ENOTUNIQ = syscall.Errno(0x4c) ENXIO = syscall.Errno(0x6) EOPNOTSUPP = syscall.Errno(0x5f) EOVERFLOW = syscall.Errno(0x4b) EOWNERDEAD = syscall.Errno(0x82) EPERM = syscall.Errno(0x1) EPFNOSUPPORT = syscall.Errno(0x60) EPIPE = syscall.Errno(0x20) EPROTO = syscall.Errno(0x47) EPROTONOSUPPORT = syscall.Errno(0x5d) EPROTOTYPE = syscall.Errno(0x5b) ERANGE = syscall.Errno(0x22) EREMCHG = syscall.Errno(0x4e) EREMOTE = syscall.Errno(0x42) EREMOTEIO = syscall.Errno(0x79) ERESTART = syscall.Errno(0x55) ERFKILL = syscall.Errno(0x84) EROFS = syscall.Errno(0x1e) ESHUTDOWN = syscall.Errno(0x6c) ESOCKTNOSUPPORT = syscall.Errno(0x5e) ESPIPE = syscall.Errno(0x1d) ESRCH = syscall.Errno(0x3) ESRMNT = syscall.Errno(0x45) ESTALE = syscall.Errno(0x74) ESTRPIPE = syscall.Errno(0x56) ETIME = syscall.Errno(0x3e) ETIMEDOUT = syscall.Errno(0x6e) ETOOMANYREFS = syscall.Errno(0x6d) ETXTBSY = syscall.Errno(0x1a) EUCLEAN = syscall.Errno(0x75) EUNATCH = syscall.Errno(0x31) EUSERS = syscall.Errno(0x57) EWOULDBLOCK = syscall.Errno(0xb) EXDEV = syscall.Errno(0x12) EXFULL = syscall.Errno(0x36) ) // Signals const ( SIGABRT = syscall.Signal(0x6) SIGALRM = syscall.Signal(0xe) SIGBUS = syscall.Signal(0x7) SIGCHLD = syscall.Signal(0x11) SIGCLD = syscall.Signal(0x11) SIGCONT = syscall.Signal(0x12) SIGFPE = syscall.Signal(0x8) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x1d) SIGIOT = syscall.Signal(0x6) SIGKILL = syscall.Signal(0x9) SIGPIPE = syscall.Signal(0xd) SIGPOLL = syscall.Signal(0x1d) SIGPROF = syscall.Signal(0x1b) SIGPWR = syscall.Signal(0x1e) SIGQUIT = syscall.Signal(0x3) SIGSEGV = syscall.Signal(0xb) SIGSTKFLT = syscall.Signal(0x10) SIGSTOP = syscall.Signal(0x13) SIGSYS = syscall.Signal(0x1f) SIGTERM = syscall.Signal(0xf) SIGTRAP = syscall.Signal(0x5) SIGTSTP = syscall.Signal(0x14) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) SIGURG = syscall.Signal(0x17) SIGUSR1 = syscall.Signal(0xa) SIGUSR2 = syscall.Signal(0xc) SIGVTALRM = syscall.Signal(0x1a) SIGWINCH = syscall.Signal(0x1c) SIGXCPU = syscall.Signal(0x18) SIGXFSZ = syscall.Signal(0x19) ) // Error table var errors = [...]string{ 1: "operation not permitted", 2: "no such file or directory", 3: "no such process", 4: "interrupted system call", 5: "input/output error", 6: "no such device or address", 7: "argument list too long", 8: "exec format error", 9: "bad file descriptor", 10: "no child processes", 11: "resource temporarily unavailable", 12: "cannot allocate memory", 13: "permission denied", 14: "bad address", 15: "block device required", 16: "device or resource busy", 17: "file exists", 18: "invalid cross-device link", 19: "no such device", 20: "not a directory", 21: "is a directory", 22: "invalid argument", 23: "too many open files in system", 24: "too many open files", 25: "inappropriate ioctl for device", 26: "text file busy", 27: "file too large", 28: "no space left on device", 29: "illegal seek", 30: "read-only file system", 31: "too many links", 32: "broken pipe", 33: "numerical argument out of domain", 34: "numerical result out of range", 35: "resource deadlock avoided", 36: "file name too long", 37: "no locks available", 38: "function not implemented", 39: "directory not empty", 40: "too many levels of symbolic links", 42: "no message of desired type", 43: "identifier removed", 44: "channel number out of range", 45: "level 2 not synchronized", 46: "level 3 halted", 47: "level 3 reset", 48: "link number out of range", 49: "protocol driver not attached", 50: "no CSI structure available", 51: "level 2 halted", 52: "invalid exchange", 53: "invalid request descriptor", 54: "exchange full", 55: "no anode", 56: "invalid request code", 57: "invalid slot", 59: "bad font file format", 60: "device not a stream", 61: "no data available", 62: "timer expired", 63: "out of streams resources", 64: "machine is not on the network", 65: "package not installed", 66: "object is remote", 67: "link has been severed", 68: "advertise error", 69: "srmount error", 70: "communication error on send", 71: "protocol error", 72: "multihop attempted", 73: "RFS specific error", 74: "bad message", 75: "value too large for defined data type", 76: "name not unique on network", 77: "file descriptor in bad state", 78: "remote address changed", 79: "can not access a needed shared library", 80: "accessing a corrupted shared library", 81: ".lib section in a.out corrupted", 82: "attempting to link in too many shared libraries", 83: "cannot exec a shared library directly", 84: "invalid or incomplete multibyte or wide character", 85: "interrupted system call should be restarted", 86: "streams pipe error", 87: "too many users", 88: "socket operation on non-socket", 89: "destination address required", 90: "message too long", 91: "protocol wrong type for socket", 92: "protocol not available", 93: "protocol not supported", 94: "socket type not supported", 95: "operation not supported", 96: "protocol family not supported", 97: "address family not supported by protocol", 98: "address already in use", 99: "cannot assign requested address", 100: "network is down", 101: "network is unreachable", 102: "network dropped connection on reset", 103: "software caused connection abort", 104: "connection reset by peer", 105: "no buffer space available", 106: "transport endpoint is already connected", 107: "transport endpoint is not connected", 108: "cannot send after transport endpoint shutdown", 109: "too many references: cannot splice", 110: "connection timed out", 111: "connection refused", 112: "host is down", 113: "no route to host", 114: "operation already in progress", 115: "operation now in progress", 116: "stale file handle", 117: "structure needs cleaning", 118: "not a XENIX named type file", 119: "no XENIX semaphores available", 120: "is a named type file", 121: "remote I/O error", 122: "disk quota exceeded", 123: "no medium found", 124: "wrong medium type", 125: "operation canceled", 126: "required key not available", 127: "key has expired", 128: "key has been revoked", 129: "key was rejected by service", 130: "owner died", 131: "state not recoverable", 132: "operation not possible due to RF-kill", 133: "memory page has hardware error", } // Signal table var signals = [...]string{ 1: "hangup", 2: "interrupt", 3: "quit", 4: "illegal instruction", 5: "trace/breakpoint trap", 6: "aborted", 7: "bus error", 8: "floating point exception", 9: "killed", 10: "user defined signal 1", 11: "segmentation fault", 12: "user defined signal 2", 13: "broken pipe", 14: "alarm clock", 15: "terminated", 16: "stack fault", 17: "child exited", 18: "continued", 19: "stopped (signal)", 20: "stopped", 21: "stopped (tty input)", 22: "stopped (tty output)", 23: "urgent I/O condition", 24: "CPU time limit exceeded", 25: "file size limit exceeded", 26: "virtual timer expired", 27: "profiling timer expired", 28: "window changed", 29: "I/O possible", 30: "power failure", 31: "bad system call", } ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_linux_mips.go ================================================ // mkerrors.sh -Wall -Werror -static -I/tmp/include // Code generated by the command above; see README.md. DO NOT EDIT. // +build mips,linux // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go package unix import "syscall" const ( AF_ALG = 0x26 AF_APPLETALK = 0x5 AF_ASH = 0x12 AF_ATMPVC = 0x8 AF_ATMSVC = 0x14 AF_AX25 = 0x3 AF_BLUETOOTH = 0x1f AF_BRIDGE = 0x7 AF_CAIF = 0x25 AF_CAN = 0x1d AF_DECnet = 0xc AF_ECONET = 0x13 AF_FILE = 0x1 AF_IB = 0x1b AF_IEEE802154 = 0x24 AF_INET = 0x2 AF_INET6 = 0xa AF_IPX = 0x4 AF_IRDA = 0x17 AF_ISDN = 0x22 AF_IUCV = 0x20 AF_KCM = 0x29 AF_KEY = 0xf AF_LLC = 0x1a AF_LOCAL = 0x1 AF_MAX = 0x2c AF_MPLS = 0x1c AF_NETBEUI = 0xd AF_NETLINK = 0x10 AF_NETROM = 0x6 AF_NFC = 0x27 AF_PACKET = 0x11 AF_PHONET = 0x23 AF_PPPOX = 0x18 AF_QIPCRTR = 0x2a AF_RDS = 0x15 AF_ROSE = 0xb AF_ROUTE = 0x10 AF_RXRPC = 0x21 AF_SECURITY = 0xe AF_SMC = 0x2b AF_SNA = 0x16 AF_TIPC = 0x1e AF_UNIX = 0x1 AF_UNSPEC = 0x0 AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 ALG_OP_DECRYPT = 0x0 ALG_OP_ENCRYPT = 0x1 ALG_SET_AEAD_ASSOCLEN = 0x4 ALG_SET_AEAD_AUTHSIZE = 0x5 ALG_SET_IV = 0x2 ALG_SET_KEY = 0x1 ALG_SET_OP = 0x3 ARPHRD_6LOWPAN = 0x339 ARPHRD_ADAPT = 0x108 ARPHRD_APPLETLK = 0x8 ARPHRD_ARCNET = 0x7 ARPHRD_ASH = 0x30d ARPHRD_ATM = 0x13 ARPHRD_AX25 = 0x3 ARPHRD_BIF = 0x307 ARPHRD_CAIF = 0x336 ARPHRD_CAN = 0x118 ARPHRD_CHAOS = 0x5 ARPHRD_CISCO = 0x201 ARPHRD_CSLIP = 0x101 ARPHRD_CSLIP6 = 0x103 ARPHRD_DDCMP = 0x205 ARPHRD_DLCI = 0xf ARPHRD_ECONET = 0x30e ARPHRD_EETHER = 0x2 ARPHRD_ETHER = 0x1 ARPHRD_EUI64 = 0x1b ARPHRD_FCAL = 0x311 ARPHRD_FCFABRIC = 0x313 ARPHRD_FCPL = 0x312 ARPHRD_FCPP = 0x310 ARPHRD_FDDI = 0x306 ARPHRD_FRAD = 0x302 ARPHRD_HDLC = 0x201 ARPHRD_HIPPI = 0x30c ARPHRD_HWX25 = 0x110 ARPHRD_IEEE1394 = 0x18 ARPHRD_IEEE802 = 0x6 ARPHRD_IEEE80211 = 0x321 ARPHRD_IEEE80211_PRISM = 0x322 ARPHRD_IEEE80211_RADIOTAP = 0x323 ARPHRD_IEEE802154 = 0x324 ARPHRD_IEEE802154_MONITOR = 0x325 ARPHRD_IEEE802_TR = 0x320 ARPHRD_INFINIBAND = 0x20 ARPHRD_IP6GRE = 0x337 ARPHRD_IPDDP = 0x309 ARPHRD_IPGRE = 0x30a ARPHRD_IRDA = 0x30f ARPHRD_LAPB = 0x204 ARPHRD_LOCALTLK = 0x305 ARPHRD_LOOPBACK = 0x304 ARPHRD_METRICOM = 0x17 ARPHRD_NETLINK = 0x338 ARPHRD_NETROM = 0x0 ARPHRD_NONE = 0xfffe ARPHRD_PHONET = 0x334 ARPHRD_PHONET_PIPE = 0x335 ARPHRD_PIMREG = 0x30b ARPHRD_PPP = 0x200 ARPHRD_PRONET = 0x4 ARPHRD_RAWHDLC = 0x206 ARPHRD_ROSE = 0x10e ARPHRD_RSRVD = 0x104 ARPHRD_SIT = 0x308 ARPHRD_SKIP = 0x303 ARPHRD_SLIP = 0x100 ARPHRD_SLIP6 = 0x102 ARPHRD_TUNNEL = 0x300 ARPHRD_TUNNEL6 = 0x301 ARPHRD_VOID = 0xffff ARPHRD_VSOCKMON = 0x33a ARPHRD_X25 = 0x10f B0 = 0x0 B1000000 = 0x1008 B110 = 0x3 B115200 = 0x1002 B1152000 = 0x1009 B1200 = 0x9 B134 = 0x4 B150 = 0x5 B1500000 = 0x100a B1800 = 0xa B19200 = 0xe B200 = 0x6 B2000000 = 0x100b B230400 = 0x1003 B2400 = 0xb B2500000 = 0x100c B300 = 0x7 B3000000 = 0x100d B3500000 = 0x100e B38400 = 0xf B4000000 = 0x100f B460800 = 0x1004 B4800 = 0xc B50 = 0x1 B500000 = 0x1005 B57600 = 0x1001 B576000 = 0x1006 B600 = 0x8 B75 = 0x2 B921600 = 0x1007 B9600 = 0xd BLKBSZGET = 0x40041270 BLKBSZSET = 0x80041271 BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40041272 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d BLKRRPART = 0x2000125f BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 BOTHER = 0x1000 BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALU = 0x4 BPF_AND = 0x50 BPF_B = 0x10 BPF_DIV = 0x30 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 BPF_JA = 0x0 BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 BPF_JMP = 0x5 BPF_JSET = 0x40 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 BPF_LEN = 0x80 BPF_LL_OFF = -0x200000 BPF_LSH = 0x60 BPF_MAJOR_VERSION = 0x1 BPF_MAXINSNS = 0x1000 BPF_MEM = 0x60 BPF_MEMWORDS = 0x10 BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MOD = 0x90 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_NET_OFF = -0x100000 BPF_OR = 0x40 BPF_RET = 0x6 BPF_RSH = 0x70 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 BPF_TAX = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 BPF_XOR = 0xa0 BRKINT = 0x2 BS0 = 0x0 BS1 = 0x2000 BSDLY = 0x2000 CAN_BCM = 0x2 CAN_EFF_FLAG = 0x80000000 CAN_EFF_ID_BITS = 0x1d CAN_EFF_MASK = 0x1fffffff CAN_ERR_FLAG = 0x20000000 CAN_ERR_MASK = 0x1fffffff CAN_INV_FILTER = 0x20000000 CAN_ISOTP = 0x6 CAN_MAX_DLC = 0x8 CAN_MAX_DLEN = 0x8 CAN_MCNET = 0x5 CAN_MTU = 0x10 CAN_NPROTO = 0x7 CAN_RAW = 0x1 CAN_RAW_FILTER_MAX = 0x200 CAN_RTR_FLAG = 0x40000000 CAN_SFF_ID_BITS = 0xb CAN_SFF_MASK = 0x7ff CAN_TP16 = 0x3 CAN_TP20 = 0x4 CBAUD = 0x100f CBAUDEX = 0x1000 CFLUSH = 0xf CIBAUD = 0x100f0000 CLOCAL = 0x800 CLOCK_BOOTTIME = 0x7 CLOCK_BOOTTIME_ALARM = 0x9 CLOCK_DEFAULT = 0x0 CLOCK_EXT = 0x1 CLOCK_INT = 0x2 CLOCK_MONOTONIC = 0x1 CLOCK_MONOTONIC_COARSE = 0x6 CLOCK_MONOTONIC_RAW = 0x4 CLOCK_PROCESS_CPUTIME_ID = 0x2 CLOCK_REALTIME = 0x0 CLOCK_REALTIME_ALARM = 0x8 CLOCK_REALTIME_COARSE = 0x5 CLOCK_TAI = 0xb CLOCK_THREAD_CPUTIME_ID = 0x3 CLOCK_TXFROMRX = 0x4 CLOCK_TXINT = 0x3 CLONE_CHILD_CLEARTID = 0x200000 CLONE_CHILD_SETTID = 0x1000000 CLONE_DETACHED = 0x400000 CLONE_FILES = 0x400 CLONE_FS = 0x200 CLONE_IO = 0x80000000 CLONE_NEWCGROUP = 0x2000000 CLONE_NEWIPC = 0x8000000 CLONE_NEWNET = 0x40000000 CLONE_NEWNS = 0x20000 CLONE_NEWPID = 0x20000000 CLONE_NEWUSER = 0x10000000 CLONE_NEWUTS = 0x4000000 CLONE_PARENT = 0x8000 CLONE_PARENT_SETTID = 0x100000 CLONE_PTRACE = 0x2000 CLONE_SETTLS = 0x80000 CLONE_SIGHAND = 0x800 CLONE_SYSVSEM = 0x40000 CLONE_THREAD = 0x10000 CLONE_UNTRACED = 0x800000 CLONE_VFORK = 0x4000 CLONE_VM = 0x100 CMSPAR = 0x40000000 CR0 = 0x0 CR1 = 0x200 CR2 = 0x400 CR3 = 0x600 CRDLY = 0x600 CREAD = 0x80 CRTSCTS = 0x80000000 CS5 = 0x0 CS6 = 0x10 CS7 = 0x20 CS8 = 0x30 CSIGNAL = 0xff CSIZE = 0x30 CSTART = 0x11 CSTATUS = 0x0 CSTOP = 0x13 CSTOPB = 0x40 CSUSP = 0x1a DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 DT_FIFO = 0x1 DT_LNK = 0xa DT_REG = 0x8 DT_SOCK = 0xc DT_UNKNOWN = 0x0 DT_WHT = 0xe ECHO = 0x8 ECHOCTL = 0x200 ECHOE = 0x10 ECHOK = 0x20 ECHOKE = 0x800 ECHONL = 0x40 ECHOPRT = 0x400 EFD_CLOEXEC = 0x80000 EFD_NONBLOCK = 0x80 EFD_SEMAPHORE = 0x1 ENCODING_DEFAULT = 0x0 ENCODING_FM_MARK = 0x3 ENCODING_FM_SPACE = 0x4 ENCODING_MANCHESTER = 0x5 ENCODING_NRZ = 0x1 ENCODING_NRZI = 0x2 EPOLLERR = 0x8 EPOLLET = 0x80000000 EPOLLEXCLUSIVE = 0x10000000 EPOLLHUP = 0x10 EPOLLIN = 0x1 EPOLLMSG = 0x400 EPOLLONESHOT = 0x40000000 EPOLLOUT = 0x4 EPOLLPRI = 0x2 EPOLLRDBAND = 0x80 EPOLLRDHUP = 0x2000 EPOLLRDNORM = 0x40 EPOLLWAKEUP = 0x20000000 EPOLLWRBAND = 0x200 EPOLLWRNORM = 0x100 EPOLL_CLOEXEC = 0x80000 EPOLL_CTL_ADD = 0x1 EPOLL_CTL_DEL = 0x2 EPOLL_CTL_MOD = 0x3 ETH_P_1588 = 0x88f7 ETH_P_8021AD = 0x88a8 ETH_P_8021AH = 0x88e7 ETH_P_8021Q = 0x8100 ETH_P_80221 = 0x8917 ETH_P_802_2 = 0x4 ETH_P_802_3 = 0x1 ETH_P_802_3_MIN = 0x600 ETH_P_802_EX1 = 0x88b5 ETH_P_AARP = 0x80f3 ETH_P_AF_IUCV = 0xfbfb ETH_P_ALL = 0x3 ETH_P_AOE = 0x88a2 ETH_P_ARCNET = 0x1a ETH_P_ARP = 0x806 ETH_P_ATALK = 0x809b ETH_P_ATMFATE = 0x8884 ETH_P_ATMMPOA = 0x884c ETH_P_AX25 = 0x2 ETH_P_BATMAN = 0x4305 ETH_P_BPQ = 0x8ff ETH_P_CAIF = 0xf7 ETH_P_CAN = 0xc ETH_P_CANFD = 0xd ETH_P_CONTROL = 0x16 ETH_P_CUST = 0x6006 ETH_P_DDCMP = 0x6 ETH_P_DEC = 0x6000 ETH_P_DIAG = 0x6005 ETH_P_DNA_DL = 0x6001 ETH_P_DNA_RC = 0x6002 ETH_P_DNA_RT = 0x6003 ETH_P_DSA = 0x1b ETH_P_ECONET = 0x18 ETH_P_EDSA = 0xdada ETH_P_FCOE = 0x8906 ETH_P_FIP = 0x8914 ETH_P_HDLC = 0x19 ETH_P_HSR = 0x892f ETH_P_IBOE = 0x8915 ETH_P_IEEE802154 = 0xf6 ETH_P_IEEEPUP = 0xa00 ETH_P_IEEEPUPAT = 0xa01 ETH_P_IP = 0x800 ETH_P_IPV6 = 0x86dd ETH_P_IPX = 0x8137 ETH_P_IRDA = 0x17 ETH_P_LAT = 0x6004 ETH_P_LINK_CTL = 0x886c ETH_P_LOCALTALK = 0x9 ETH_P_LOOP = 0x60 ETH_P_LOOPBACK = 0x9000 ETH_P_MACSEC = 0x88e5 ETH_P_MOBITEX = 0x15 ETH_P_MPLS_MC = 0x8848 ETH_P_MPLS_UC = 0x8847 ETH_P_MVRP = 0x88f5 ETH_P_NCSI = 0x88f8 ETH_P_PAE = 0x888e ETH_P_PAUSE = 0x8808 ETH_P_PHONET = 0xf5 ETH_P_PPPTALK = 0x10 ETH_P_PPP_DISC = 0x8863 ETH_P_PPP_MP = 0x8 ETH_P_PPP_SES = 0x8864 ETH_P_PRP = 0x88fb ETH_P_PUP = 0x200 ETH_P_PUPAT = 0x201 ETH_P_QINQ1 = 0x9100 ETH_P_QINQ2 = 0x9200 ETH_P_QINQ3 = 0x9300 ETH_P_RARP = 0x8035 ETH_P_SCA = 0x6007 ETH_P_SLOW = 0x8809 ETH_P_SNAP = 0x5 ETH_P_TDLS = 0x890d ETH_P_TEB = 0x6558 ETH_P_TIPC = 0x88ca ETH_P_TRAILER = 0x1c ETH_P_TR_802_2 = 0x11 ETH_P_TSN = 0x22f0 ETH_P_WAN_PPP = 0x7 ETH_P_WCCP = 0x883e ETH_P_X25 = 0x805 ETH_P_XDSA = 0xf8 EXTA = 0xe EXTB = 0xf EXTPROC = 0x10000 FALLOC_FL_COLLAPSE_RANGE = 0x8 FALLOC_FL_INSERT_RANGE = 0x20 FALLOC_FL_KEEP_SIZE = 0x1 FALLOC_FL_NO_HIDE_STALE = 0x4 FALLOC_FL_PUNCH_HOLE = 0x2 FALLOC_FL_UNSHARE_RANGE = 0x40 FALLOC_FL_ZERO_RANGE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 FF1 = 0x8000 FFDLY = 0x8000 FLUSHO = 0x2000 FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 FS_ENCRYPTION_MODE_INVALID = 0x0 FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 FS_KEY_DESCRIPTOR_SIZE = 0x8 FS_KEY_DESC_PREFIX = "fscrypt:" FS_KEY_DESC_PREFIX_SIZE = 0x8 FS_MAX_KEY_SIZE = 0x40 FS_POLICY_FLAGS_PAD_16 = 0x2 FS_POLICY_FLAGS_PAD_32 = 0x3 FS_POLICY_FLAGS_PAD_4 = 0x0 FS_POLICY_FLAGS_PAD_8 = 0x1 FS_POLICY_FLAGS_PAD_MASK = 0x3 FS_POLICY_FLAGS_VALID = 0x3 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0x406 F_EXLCK = 0x4 F_GETFD = 0x1 F_GETFL = 0x3 F_GETLEASE = 0x401 F_GETLK = 0x21 F_GETLK64 = 0x21 F_GETOWN = 0x17 F_GETOWN_EX = 0x10 F_GETPIPE_SZ = 0x408 F_GETSIG = 0xb F_LOCK = 0x1 F_NOTIFY = 0x402 F_OFD_GETLK = 0x24 F_OFD_SETLK = 0x25 F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 F_SETFD = 0x2 F_SETFL = 0x4 F_SETLEASE = 0x400 F_SETLK = 0x22 F_SETLK64 = 0x22 F_SETLKW = 0x23 F_SETLKW64 = 0x23 F_SETOWN = 0x18 F_SETOWN_EX = 0xf F_SETPIPE_SZ = 0x407 F_SETSIG = 0xa F_SHLCK = 0x8 F_TEST = 0x3 F_TLOCK = 0x2 F_ULOCK = 0x0 F_UNLCK = 0x2 F_WRLCK = 0x1 GENL_ADMIN_PERM = 0x1 GENL_CMD_CAP_DO = 0x2 GENL_CMD_CAP_DUMP = 0x4 GENL_CMD_CAP_HASPOL = 0x8 GENL_HDRLEN = 0x4 GENL_ID_CTRL = 0x10 GENL_ID_PMCRAID = 0x12 GENL_ID_VFS_DQUOT = 0x11 GENL_MAX_ID = 0x3ff GENL_MIN_ID = 0x10 GENL_NAMSIZ = 0x10 GENL_START_ALLOC = 0x13 GENL_UNS_ADMIN_PERM = 0x10 GRND_NONBLOCK = 0x1 GRND_RANDOM = 0x2 HUPCL = 0x400 IBSHIFT = 0x10 ICANON = 0x2 ICMPV6_FILTER = 0x1 ICRNL = 0x100 IEXTEN = 0x100 IFA_F_DADFAILED = 0x8 IFA_F_DEPRECATED = 0x20 IFA_F_HOMEADDRESS = 0x10 IFA_F_MANAGETEMPADDR = 0x100 IFA_F_MCAUTOJOIN = 0x400 IFA_F_NODAD = 0x2 IFA_F_NOPREFIXROUTE = 0x200 IFA_F_OPTIMISTIC = 0x4 IFA_F_PERMANENT = 0x80 IFA_F_SECONDARY = 0x1 IFA_F_STABLE_PRIVACY = 0x800 IFA_F_TEMPORARY = 0x1 IFA_F_TENTATIVE = 0x40 IFA_MAX = 0x8 IFF_ALLMULTI = 0x200 IFF_ATTACH_QUEUE = 0x200 IFF_AUTOMEDIA = 0x4000 IFF_BROADCAST = 0x2 IFF_DEBUG = 0x4 IFF_DETACH_QUEUE = 0x400 IFF_DORMANT = 0x20000 IFF_DYNAMIC = 0x8000 IFF_ECHO = 0x40000 IFF_LOOPBACK = 0x8 IFF_LOWER_UP = 0x10000 IFF_MASTER = 0x400 IFF_MULTICAST = 0x1000 IFF_MULTI_QUEUE = 0x100 IFF_NOARP = 0x80 IFF_NOFILTER = 0x1000 IFF_NOTRAILERS = 0x20 IFF_NO_PI = 0x1000 IFF_ONE_QUEUE = 0x2000 IFF_PERSIST = 0x800 IFF_POINTOPOINT = 0x10 IFF_PORTSEL = 0x2000 IFF_PROMISC = 0x100 IFF_RUNNING = 0x40 IFF_SLAVE = 0x800 IFF_TAP = 0x2 IFF_TUN = 0x1 IFF_TUN_EXCL = 0x8000 IFF_UP = 0x1 IFF_VNET_HDR = 0x4000 IFF_VOLATILE = 0x70c5a IFNAMSIZ = 0x10 IGNBRK = 0x1 IGNCR = 0x80 IGNPAR = 0x4 IMAXBEL = 0x2000 INLCR = 0x40 INPCK = 0x10 IN_ACCESS = 0x1 IN_ALL_EVENTS = 0xfff IN_ATTRIB = 0x4 IN_CLASSA_HOST = 0xffffff IN_CLASSA_MAX = 0x80 IN_CLASSA_NET = 0xff000000 IN_CLASSA_NSHIFT = 0x18 IN_CLASSB_HOST = 0xffff IN_CLASSB_MAX = 0x10000 IN_CLASSB_NET = 0xffff0000 IN_CLASSB_NSHIFT = 0x10 IN_CLASSC_HOST = 0xff IN_CLASSC_NET = 0xffffff00 IN_CLASSC_NSHIFT = 0x8 IN_CLOEXEC = 0x80000 IN_CLOSE = 0x18 IN_CLOSE_NOWRITE = 0x10 IN_CLOSE_WRITE = 0x8 IN_CREATE = 0x100 IN_DELETE = 0x200 IN_DELETE_SELF = 0x400 IN_DONT_FOLLOW = 0x2000000 IN_EXCL_UNLINK = 0x4000000 IN_IGNORED = 0x8000 IN_ISDIR = 0x40000000 IN_LOOPBACKNET = 0x7f IN_MASK_ADD = 0x20000000 IN_MODIFY = 0x2 IN_MOVE = 0xc0 IN_MOVED_FROM = 0x40 IN_MOVED_TO = 0x80 IN_MOVE_SELF = 0x800 IN_NONBLOCK = 0x80 IN_ONESHOT = 0x80000000 IN_ONLYDIR = 0x1000000 IN_OPEN = 0x20 IN_Q_OVERFLOW = 0x4000 IN_UNMOUNT = 0x2000 IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 IPPROTO_AH = 0x33 IPPROTO_BEETPH = 0x5e IPPROTO_COMP = 0x6c IPPROTO_DCCP = 0x21 IPPROTO_DSTOPTS = 0x3c IPPROTO_EGP = 0x8 IPPROTO_ENCAP = 0x62 IPPROTO_ESP = 0x32 IPPROTO_FRAGMENT = 0x2c IPPROTO_GRE = 0x2f IPPROTO_HOPOPTS = 0x0 IPPROTO_ICMP = 0x1 IPPROTO_ICMPV6 = 0x3a IPPROTO_IDP = 0x16 IPPROTO_IGMP = 0x2 IPPROTO_IP = 0x0 IPPROTO_IPIP = 0x4 IPPROTO_IPV6 = 0x29 IPPROTO_MH = 0x87 IPPROTO_MPLS = 0x89 IPPROTO_MTP = 0x5c IPPROTO_NONE = 0x3b IPPROTO_PIM = 0x67 IPPROTO_PUP = 0xc IPPROTO_RAW = 0xff IPPROTO_ROUTING = 0x2b IPPROTO_RSVP = 0x2e IPPROTO_SCTP = 0x84 IPPROTO_TCP = 0x6 IPPROTO_TP = 0x1d IPPROTO_UDP = 0x11 IPPROTO_UDPLITE = 0x88 IPV6_2292DSTOPTS = 0x4 IPV6_2292HOPLIMIT = 0x8 IPV6_2292HOPOPTS = 0x3 IPV6_2292PKTINFO = 0x2 IPV6_2292PKTOPTIONS = 0x6 IPV6_2292RTHDR = 0x5 IPV6_ADDRFORM = 0x1 IPV6_ADDR_PREFERENCES = 0x48 IPV6_ADD_MEMBERSHIP = 0x14 IPV6_AUTHHDR = 0xa IPV6_AUTOFLOWLABEL = 0x46 IPV6_CHECKSUM = 0x7 IPV6_DONTFRAG = 0x3e IPV6_DROP_MEMBERSHIP = 0x15 IPV6_DSTOPTS = 0x3b IPV6_HDRINCL = 0x24 IPV6_HOPLIMIT = 0x34 IPV6_HOPOPTS = 0x36 IPV6_IPSEC_POLICY = 0x22 IPV6_JOIN_ANYCAST = 0x1b IPV6_JOIN_GROUP = 0x14 IPV6_LEAVE_ANYCAST = 0x1c IPV6_LEAVE_GROUP = 0x15 IPV6_MINHOPCOUNT = 0x49 IPV6_MTU = 0x18 IPV6_MTU_DISCOVER = 0x17 IPV6_MULTICAST_HOPS = 0x12 IPV6_MULTICAST_IF = 0x11 IPV6_MULTICAST_LOOP = 0x13 IPV6_NEXTHOP = 0x9 IPV6_ORIGDSTADDR = 0x4a IPV6_PATHMTU = 0x3d IPV6_PKTINFO = 0x32 IPV6_PMTUDISC_DO = 0x2 IPV6_PMTUDISC_DONT = 0x0 IPV6_PMTUDISC_INTERFACE = 0x4 IPV6_PMTUDISC_OMIT = 0x5 IPV6_PMTUDISC_PROBE = 0x3 IPV6_PMTUDISC_WANT = 0x1 IPV6_RECVDSTOPTS = 0x3a IPV6_RECVERR = 0x19 IPV6_RECVFRAGSIZE = 0x4d IPV6_RECVHOPLIMIT = 0x33 IPV6_RECVHOPOPTS = 0x35 IPV6_RECVORIGDSTADDR = 0x4a IPV6_RECVPATHMTU = 0x3c IPV6_RECVPKTINFO = 0x31 IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 IPV6_RTHDR_STRICT = 0x1 IPV6_RTHDR_TYPE_0 = 0x0 IPV6_RXDSTOPTS = 0x3b IPV6_RXHOPOPTS = 0x36 IPV6_TCLASS = 0x43 IPV6_TRANSPARENT = 0x4b IPV6_UNICAST_HOPS = 0x10 IPV6_UNICAST_IF = 0x4c IPV6_V6ONLY = 0x1a IPV6_XFRM_POLICY = 0x23 IP_ADD_MEMBERSHIP = 0x23 IP_ADD_SOURCE_MEMBERSHIP = 0x27 IP_BIND_ADDRESS_NO_PORT = 0x18 IP_BLOCK_SOURCE = 0x26 IP_CHECKSUM = 0x17 IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 IP_DROP_MEMBERSHIP = 0x24 IP_DROP_SOURCE_MEMBERSHIP = 0x28 IP_FREEBIND = 0xf IP_HDRINCL = 0x3 IP_IPSEC_POLICY = 0x10 IP_MAXPACKET = 0xffff IP_MAX_MEMBERSHIPS = 0x14 IP_MF = 0x2000 IP_MINTTL = 0x15 IP_MSFILTER = 0x29 IP_MSS = 0x240 IP_MTU = 0xe IP_MTU_DISCOVER = 0xa IP_MULTICAST_ALL = 0x31 IP_MULTICAST_IF = 0x20 IP_MULTICAST_LOOP = 0x22 IP_MULTICAST_TTL = 0x21 IP_NODEFRAG = 0x16 IP_OFFMASK = 0x1fff IP_OPTIONS = 0x4 IP_ORIGDSTADDR = 0x14 IP_PASSSEC = 0x12 IP_PKTINFO = 0x8 IP_PKTOPTIONS = 0x9 IP_PMTUDISC = 0xa IP_PMTUDISC_DO = 0x2 IP_PMTUDISC_DONT = 0x0 IP_PMTUDISC_INTERFACE = 0x4 IP_PMTUDISC_OMIT = 0x5 IP_PMTUDISC_PROBE = 0x3 IP_PMTUDISC_WANT = 0x1 IP_RECVERR = 0xb IP_RECVFRAGSIZE = 0x19 IP_RECVOPTS = 0x6 IP_RECVORIGDSTADDR = 0x14 IP_RECVRETOPTS = 0x7 IP_RECVTOS = 0xd IP_RECVTTL = 0xc IP_RETOPTS = 0x7 IP_RF = 0x8000 IP_ROUTER_ALERT = 0x5 IP_TOS = 0x1 IP_TRANSPARENT = 0x13 IP_TTL = 0x2 IP_UNBLOCK_SOURCE = 0x25 IP_UNICAST_IF = 0x32 IP_XFRM_POLICY = 0x11 ISIG = 0x1 ISTRIP = 0x20 IUCLC = 0x200 IUTF8 = 0x4000 IXANY = 0x800 IXOFF = 0x1000 IXON = 0x400 KEYCTL_ASSUME_AUTHORITY = 0x10 KEYCTL_CHOWN = 0x4 KEYCTL_CLEAR = 0x7 KEYCTL_DESCRIBE = 0x6 KEYCTL_DH_COMPUTE = 0x17 KEYCTL_GET_KEYRING_ID = 0x0 KEYCTL_GET_PERSISTENT = 0x16 KEYCTL_GET_SECURITY = 0x11 KEYCTL_INSTANTIATE = 0xc KEYCTL_INSTANTIATE_IOV = 0x14 KEYCTL_INVALIDATE = 0x15 KEYCTL_JOIN_SESSION_KEYRING = 0x1 KEYCTL_LINK = 0x8 KEYCTL_NEGATE = 0xd KEYCTL_READ = 0xb KEYCTL_REJECT = 0x13 KEYCTL_RESTRICT_KEYRING = 0x1d KEYCTL_REVOKE = 0x3 KEYCTL_SEARCH = 0xa KEYCTL_SESSION_TO_PARENT = 0x12 KEYCTL_SETPERM = 0x5 KEYCTL_SET_REQKEY_KEYRING = 0xe KEYCTL_SET_TIMEOUT = 0xf KEYCTL_UNLINK = 0x9 KEYCTL_UPDATE = 0x2 KEY_REQKEY_DEFL_DEFAULT = 0x0 KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 KEY_REQKEY_DEFL_NO_CHANGE = -0x1 KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 KEY_REQKEY_DEFL_USER_KEYRING = 0x4 KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 KEY_SPEC_GROUP_KEYRING = -0x6 KEY_SPEC_PROCESS_KEYRING = -0x2 KEY_SPEC_REQKEY_AUTH_KEY = -0x7 KEY_SPEC_REQUESTOR_KEYRING = -0x8 KEY_SPEC_SESSION_KEYRING = -0x3 KEY_SPEC_THREAD_KEYRING = -0x1 KEY_SPEC_USER_KEYRING = -0x4 KEY_SPEC_USER_SESSION_KEYRING = -0x5 LINUX_REBOOT_CMD_CAD_OFF = 0x0 LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef LINUX_REBOOT_CMD_HALT = 0xcdef0123 LINUX_REBOOT_CMD_KEXEC = 0x45584543 LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc LINUX_REBOOT_CMD_RESTART = 0x1234567 LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 LINUX_REBOOT_MAGIC1 = 0xfee1dead LINUX_REBOOT_MAGIC2 = 0x28121969 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 MADV_DONTFORK = 0xa MADV_DONTNEED = 0x4 MADV_FREE = 0x8 MADV_HUGEPAGE = 0xe MADV_HWPOISON = 0x64 MADV_MERGEABLE = 0xc MADV_NOHUGEPAGE = 0xf MADV_NORMAL = 0x0 MADV_RANDOM = 0x1 MADV_REMOVE = 0x9 MADV_SEQUENTIAL = 0x2 MADV_UNMERGEABLE = 0xd MADV_WILLNEED = 0x3 MAP_ANON = 0x800 MAP_ANONYMOUS = 0x800 MAP_DENYWRITE = 0x2000 MAP_EXECUTABLE = 0x4000 MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_GROWSDOWN = 0x1000 MAP_HUGETLB = 0x80000 MAP_HUGE_MASK = 0x3f MAP_HUGE_SHIFT = 0x1a MAP_LOCKED = 0x8000 MAP_NONBLOCK = 0x20000 MAP_NORESERVE = 0x400 MAP_POPULATE = 0x10000 MAP_PRIVATE = 0x2 MAP_RENAME = 0x800 MAP_SHARED = 0x1 MAP_STACK = 0x40000 MAP_TYPE = 0xf MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MCL_ONFAULT = 0x4 MNT_DETACH = 0x2 MNT_EXPIRE = 0x4 MNT_FORCE = 0x1 MSG_BATCH = 0x40000 MSG_CMSG_CLOEXEC = 0x40000000 MSG_CONFIRM = 0x800 MSG_CTRUNC = 0x8 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x40 MSG_EOR = 0x80 MSG_ERRQUEUE = 0x2000 MSG_FASTOPEN = 0x20000000 MSG_FIN = 0x200 MSG_MORE = 0x8000 MSG_NOSIGNAL = 0x4000 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_PROXY = 0x10 MSG_RST = 0x1000 MSG_SYN = 0x400 MSG_TRUNC = 0x20 MSG_TRYHARD = 0x4 MSG_WAITALL = 0x100 MSG_WAITFORONE = 0x10000 MS_ACTIVE = 0x40000000 MS_ASYNC = 0x1 MS_BIND = 0x1000 MS_BORN = 0x20000000 MS_DIRSYNC = 0x80 MS_INVALIDATE = 0x2 MS_I_VERSION = 0x800000 MS_KERNMOUNT = 0x400000 MS_LAZYTIME = 0x2000000 MS_MANDLOCK = 0x40 MS_MGC_MSK = 0xffff0000 MS_MGC_VAL = 0xc0ed0000 MS_MOVE = 0x2000 MS_NOATIME = 0x400 MS_NODEV = 0x4 MS_NODIRATIME = 0x800 MS_NOEXEC = 0x8 MS_NOREMOTELOCK = 0x8000000 MS_NOSEC = 0x10000000 MS_NOSUID = 0x2 MS_NOUSER = -0x80000000 MS_POSIXACL = 0x10000 MS_PRIVATE = 0x40000 MS_RDONLY = 0x1 MS_REC = 0x4000 MS_RELATIME = 0x200000 MS_REMOUNT = 0x20 MS_RMT_MASK = 0x2800051 MS_SHARED = 0x100000 MS_SILENT = 0x8000 MS_SLAVE = 0x80000 MS_STRICTATIME = 0x1000000 MS_SUBMOUNT = 0x4000000 MS_SYNC = 0x4 MS_SYNCHRONOUS = 0x10 MS_UNBINDABLE = 0x20000 MS_VERBOSE = 0x8000 NAME_MAX = 0xff NETLINK_ADD_MEMBERSHIP = 0x1 NETLINK_AUDIT = 0x9 NETLINK_BROADCAST_ERROR = 0x4 NETLINK_CAP_ACK = 0xa NETLINK_CONNECTOR = 0xb NETLINK_CRYPTO = 0x15 NETLINK_DNRTMSG = 0xe NETLINK_DROP_MEMBERSHIP = 0x2 NETLINK_ECRYPTFS = 0x13 NETLINK_EXT_ACK = 0xb NETLINK_FIB_LOOKUP = 0xa NETLINK_FIREWALL = 0x3 NETLINK_GENERIC = 0x10 NETLINK_INET_DIAG = 0x4 NETLINK_IP6_FW = 0xd NETLINK_ISCSI = 0x8 NETLINK_KOBJECT_UEVENT = 0xf NETLINK_LISTEN_ALL_NSID = 0x8 NETLINK_LIST_MEMBERSHIPS = 0x9 NETLINK_NETFILTER = 0xc NETLINK_NFLOG = 0x5 NETLINK_NO_ENOBUFS = 0x5 NETLINK_PKTINFO = 0x3 NETLINK_RDMA = 0x14 NETLINK_ROUTE = 0x0 NETLINK_RX_RING = 0x6 NETLINK_SCSITRANSPORT = 0x12 NETLINK_SELINUX = 0x7 NETLINK_SMC = 0x16 NETLINK_SOCK_DIAG = 0x4 NETLINK_TX_RING = 0x7 NETLINK_UNUSED = 0x1 NETLINK_USERSOCK = 0x2 NETLINK_XFRM = 0x6 NL0 = 0x0 NL1 = 0x100 NLA_ALIGNTO = 0x4 NLA_F_NESTED = 0x8000 NLA_F_NET_BYTEORDER = 0x4000 NLA_HDRLEN = 0x4 NLDLY = 0x100 NLMSG_ALIGNTO = 0x4 NLMSG_DONE = 0x3 NLMSG_ERROR = 0x2 NLMSG_HDRLEN = 0x10 NLMSG_MIN_TYPE = 0x10 NLMSG_NOOP = 0x1 NLMSG_OVERRUN = 0x4 NLM_F_ACK = 0x4 NLM_F_ACK_TLVS = 0x200 NLM_F_APPEND = 0x800 NLM_F_ATOMIC = 0x400 NLM_F_CAPPED = 0x100 NLM_F_CREATE = 0x400 NLM_F_DUMP = 0x300 NLM_F_DUMP_FILTERED = 0x20 NLM_F_DUMP_INTR = 0x10 NLM_F_ECHO = 0x8 NLM_F_EXCL = 0x200 NLM_F_MATCH = 0x200 NLM_F_MULTI = 0x2 NLM_F_REPLACE = 0x100 NLM_F_REQUEST = 0x1 NLM_F_ROOT = 0x100 NOFLSH = 0x80 OCRNL = 0x8 OFDEL = 0x80 OFILL = 0x40 OLCUC = 0x2 ONLCR = 0x4 ONLRET = 0x20 ONOCR = 0x10 OPOST = 0x1 O_ACCMODE = 0x3 O_APPEND = 0x8 O_ASYNC = 0x1000 O_CLOEXEC = 0x80000 O_CREAT = 0x100 O_DIRECT = 0x8000 O_DIRECTORY = 0x10000 O_DSYNC = 0x10 O_EXCL = 0x400 O_FSYNC = 0x4010 O_LARGEFILE = 0x2000 O_NDELAY = 0x80 O_NOATIME = 0x40000 O_NOCTTY = 0x800 O_NOFOLLOW = 0x20000 O_NONBLOCK = 0x80 O_PATH = 0x200000 O_RDONLY = 0x0 O_RDWR = 0x2 O_RSYNC = 0x4010 O_SYNC = 0x4010 O_TMPFILE = 0x410000 O_TRUNC = 0x200 O_WRONLY = 0x1 PACKET_ADD_MEMBERSHIP = 0x1 PACKET_AUXDATA = 0x8 PACKET_BROADCAST = 0x1 PACKET_COPY_THRESH = 0x7 PACKET_DROP_MEMBERSHIP = 0x2 PACKET_FANOUT = 0x12 PACKET_FANOUT_CBPF = 0x6 PACKET_FANOUT_CPU = 0x2 PACKET_FANOUT_DATA = 0x16 PACKET_FANOUT_EBPF = 0x7 PACKET_FANOUT_FLAG_DEFRAG = 0x8000 PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 PACKET_FANOUT_HASH = 0x0 PACKET_FANOUT_LB = 0x1 PACKET_FANOUT_QM = 0x5 PACKET_FANOUT_RND = 0x4 PACKET_FANOUT_ROLLOVER = 0x3 PACKET_FASTROUTE = 0x6 PACKET_HDRLEN = 0xb PACKET_HOST = 0x0 PACKET_KERNEL = 0x7 PACKET_LOOPBACK = 0x5 PACKET_LOSS = 0xe PACKET_MR_ALLMULTI = 0x2 PACKET_MR_MULTICAST = 0x0 PACKET_MR_PROMISC = 0x1 PACKET_MR_UNICAST = 0x3 PACKET_MULTICAST = 0x2 PACKET_ORIGDEV = 0x9 PACKET_OTHERHOST = 0x3 PACKET_OUTGOING = 0x4 PACKET_QDISC_BYPASS = 0x14 PACKET_RECV_OUTPUT = 0x3 PACKET_RESERVE = 0xc PACKET_ROLLOVER_STATS = 0x15 PACKET_RX_RING = 0x5 PACKET_STATISTICS = 0x6 PACKET_TIMESTAMP = 0x11 PACKET_TX_HAS_OFF = 0x13 PACKET_TX_RING = 0xd PACKET_TX_TIMESTAMP = 0x10 PACKET_USER = 0x6 PACKET_VERSION = 0xa PACKET_VNET_HDR = 0xf PARENB = 0x100 PARITY_CRC16_PR0 = 0x2 PARITY_CRC16_PR0_CCITT = 0x4 PARITY_CRC16_PR1 = 0x3 PARITY_CRC16_PR1_CCITT = 0x5 PARITY_CRC32_PR0_CCITT = 0x6 PARITY_CRC32_PR1_CCITT = 0x7 PARITY_DEFAULT = 0x0 PARITY_NONE = 0x1 PARMRK = 0x8 PARODD = 0x200 PENDIN = 0x4000 PERF_EVENT_IOC_DISABLE = 0x20002401 PERF_EVENT_IOC_ENABLE = 0x20002400 PERF_EVENT_IOC_ID = 0x40042407 PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 PERF_EVENT_IOC_PERIOD = 0x80082404 PERF_EVENT_IOC_REFRESH = 0x20002402 PERF_EVENT_IOC_RESET = 0x20002403 PERF_EVENT_IOC_SET_BPF = 0x80042408 PERF_EVENT_IOC_SET_FILTER = 0x80042406 PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 PROT_EXEC = 0x4 PROT_GROWSDOWN = 0x1000000 PROT_GROWSUP = 0x2000000 PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 PR_CAPBSET_DROP = 0x18 PR_CAPBSET_READ = 0x17 PR_CAP_AMBIENT = 0x2f PR_CAP_AMBIENT_CLEAR_ALL = 0x4 PR_CAP_AMBIENT_IS_SET = 0x1 PR_CAP_AMBIENT_LOWER = 0x3 PR_CAP_AMBIENT_RAISE = 0x2 PR_ENDIAN_BIG = 0x0 PR_ENDIAN_LITTLE = 0x1 PR_ENDIAN_PPC_LITTLE = 0x2 PR_FPEMU_NOPRINT = 0x1 PR_FPEMU_SIGFPE = 0x2 PR_FP_EXC_ASYNC = 0x2 PR_FP_EXC_DISABLED = 0x0 PR_FP_EXC_DIV = 0x10000 PR_FP_EXC_INV = 0x100000 PR_FP_EXC_NONRECOV = 0x1 PR_FP_EXC_OVF = 0x20000 PR_FP_EXC_PRECISE = 0x3 PR_FP_EXC_RES = 0x80000 PR_FP_EXC_SW_ENABLE = 0x80 PR_FP_EXC_UND = 0x40000 PR_FP_MODE_FR = 0x1 PR_FP_MODE_FRE = 0x2 PR_GET_CHILD_SUBREAPER = 0x25 PR_GET_DUMPABLE = 0x3 PR_GET_ENDIAN = 0x13 PR_GET_FPEMU = 0x9 PR_GET_FPEXC = 0xb PR_GET_FP_MODE = 0x2e PR_GET_KEEPCAPS = 0x7 PR_GET_NAME = 0x10 PR_GET_NO_NEW_PRIVS = 0x27 PR_GET_PDEATHSIG = 0x2 PR_GET_SECCOMP = 0x15 PR_GET_SECUREBITS = 0x1b PR_GET_THP_DISABLE = 0x2a PR_GET_TID_ADDRESS = 0x28 PR_GET_TIMERSLACK = 0x1e PR_GET_TIMING = 0xd PR_GET_TSC = 0x19 PR_GET_UNALIGN = 0x5 PR_MCE_KILL = 0x21 PR_MCE_KILL_CLEAR = 0x0 PR_MCE_KILL_DEFAULT = 0x2 PR_MCE_KILL_EARLY = 0x1 PR_MCE_KILL_GET = 0x22 PR_MCE_KILL_LATE = 0x0 PR_MCE_KILL_SET = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b PR_SET_CHILD_SUBREAPER = 0x24 PR_SET_DUMPABLE = 0x4 PR_SET_ENDIAN = 0x14 PR_SET_FPEMU = 0xa PR_SET_FPEXC = 0xc PR_SET_FP_MODE = 0x2d PR_SET_KEEPCAPS = 0x8 PR_SET_MM = 0x23 PR_SET_MM_ARG_END = 0x9 PR_SET_MM_ARG_START = 0x8 PR_SET_MM_AUXV = 0xc PR_SET_MM_BRK = 0x7 PR_SET_MM_END_CODE = 0x2 PR_SET_MM_END_DATA = 0x4 PR_SET_MM_ENV_END = 0xb PR_SET_MM_ENV_START = 0xa PR_SET_MM_EXE_FILE = 0xd PR_SET_MM_MAP = 0xe PR_SET_MM_MAP_SIZE = 0xf PR_SET_MM_START_BRK = 0x6 PR_SET_MM_START_CODE = 0x1 PR_SET_MM_START_DATA = 0x3 PR_SET_MM_START_STACK = 0x5 PR_SET_NAME = 0xf PR_SET_NO_NEW_PRIVS = 0x26 PR_SET_PDEATHSIG = 0x1 PR_SET_PTRACER = 0x59616d61 PR_SET_PTRACER_ANY = 0xffffffff PR_SET_SECCOMP = 0x16 PR_SET_SECUREBITS = 0x1c PR_SET_THP_DISABLE = 0x29 PR_SET_TIMERSLACK = 0x1d PR_SET_TIMING = 0xe PR_SET_TSC = 0x1a PR_SET_UNALIGN = 0x6 PR_TASK_PERF_EVENTS_DISABLE = 0x1f PR_TASK_PERF_EVENTS_ENABLE = 0x20 PR_TIMING_STATISTICAL = 0x0 PR_TIMING_TIMESTAMP = 0x1 PR_TSC_ENABLE = 0x1 PR_TSC_SIGSEGV = 0x2 PR_UNALIGN_NOPRINT = 0x1 PR_UNALIGN_SIGBUS = 0x2 PTRACE_ATTACH = 0x10 PTRACE_CONT = 0x7 PTRACE_DETACH = 0x11 PTRACE_EVENT_CLONE = 0x3 PTRACE_EVENT_EXEC = 0x4 PTRACE_EVENT_EXIT = 0x6 PTRACE_EVENT_FORK = 0x1 PTRACE_EVENT_SECCOMP = 0x7 PTRACE_EVENT_STOP = 0x80 PTRACE_EVENT_VFORK = 0x2 PTRACE_EVENT_VFORK_DONE = 0x5 PTRACE_GETEVENTMSG = 0x4201 PTRACE_GETFPREGS = 0xe PTRACE_GETREGS = 0xc PTRACE_GETREGSET = 0x4204 PTRACE_GETSIGINFO = 0x4202 PTRACE_GETSIGMASK = 0x420a PTRACE_GET_THREAD_AREA = 0x19 PTRACE_GET_THREAD_AREA_3264 = 0xc4 PTRACE_GET_WATCH_REGS = 0xd0 PTRACE_INTERRUPT = 0x4207 PTRACE_KILL = 0x8 PTRACE_LISTEN = 0x4208 PTRACE_OLDSETOPTIONS = 0x15 PTRACE_O_EXITKILL = 0x100000 PTRACE_O_MASK = 0x3000ff PTRACE_O_SUSPEND_SECCOMP = 0x200000 PTRACE_O_TRACECLONE = 0x8 PTRACE_O_TRACEEXEC = 0x10 PTRACE_O_TRACEEXIT = 0x40 PTRACE_O_TRACEFORK = 0x2 PTRACE_O_TRACESECCOMP = 0x80 PTRACE_O_TRACESYSGOOD = 0x1 PTRACE_O_TRACEVFORK = 0x4 PTRACE_O_TRACEVFORKDONE = 0x20 PTRACE_PEEKDATA = 0x2 PTRACE_PEEKDATA_3264 = 0xc1 PTRACE_PEEKSIGINFO = 0x4209 PTRACE_PEEKSIGINFO_SHARED = 0x1 PTRACE_PEEKTEXT = 0x1 PTRACE_PEEKTEXT_3264 = 0xc0 PTRACE_PEEKUSR = 0x3 PTRACE_POKEDATA = 0x5 PTRACE_POKEDATA_3264 = 0xc3 PTRACE_POKETEXT = 0x4 PTRACE_POKETEXT_3264 = 0xc2 PTRACE_POKEUSR = 0x6 PTRACE_SECCOMP_GET_FILTER = 0x420c PTRACE_SEIZE = 0x4206 PTRACE_SETFPREGS = 0xf PTRACE_SETOPTIONS = 0x4200 PTRACE_SETREGS = 0xd PTRACE_SETREGSET = 0x4205 PTRACE_SETSIGINFO = 0x4203 PTRACE_SETSIGMASK = 0x420b PTRACE_SET_THREAD_AREA = 0x1a PTRACE_SET_WATCH_REGS = 0xd1 PTRACE_SINGLESTEP = 0x9 PTRACE_SYSCALL = 0x18 PTRACE_TRACEME = 0x0 RLIMIT_AS = 0x6 RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 RLIMIT_LOCKS = 0xa RLIMIT_MEMLOCK = 0x9 RLIMIT_MSGQUEUE = 0xc RLIMIT_NICE = 0xd RLIMIT_NOFILE = 0x5 RLIMIT_NPROC = 0x8 RLIMIT_RSS = 0x7 RLIMIT_RTPRIO = 0xe RLIMIT_RTTIME = 0xf RLIMIT_SIGPENDING = 0xb RLIMIT_STACK = 0x3 RLIM_INFINITY = 0xffffffffffffffff RTAX_ADVMSS = 0x8 RTAX_CC_ALGO = 0x10 RTAX_CWND = 0x7 RTAX_FEATURES = 0xc RTAX_FEATURE_ALLFRAG = 0x8 RTAX_FEATURE_ECN = 0x1 RTAX_FEATURE_MASK = 0xf RTAX_FEATURE_SACK = 0x2 RTAX_FEATURE_TIMESTAMP = 0x4 RTAX_HOPLIMIT = 0xa RTAX_INITCWND = 0xb RTAX_INITRWND = 0xe RTAX_LOCK = 0x1 RTAX_MAX = 0x10 RTAX_MTU = 0x2 RTAX_QUICKACK = 0xf RTAX_REORDERING = 0x9 RTAX_RTO_MIN = 0xd RTAX_RTT = 0x4 RTAX_RTTVAR = 0x5 RTAX_SSTHRESH = 0x6 RTAX_UNSPEC = 0x0 RTAX_WINDOW = 0x3 RTA_ALIGNTO = 0x4 RTA_MAX = 0x1a RTCF_DIRECTSRC = 0x4000000 RTCF_DOREDIRECT = 0x1000000 RTCF_LOG = 0x2000000 RTCF_MASQ = 0x400000 RTCF_NAT = 0x800000 RTCF_VALVE = 0x200000 RTF_ADDRCLASSMASK = 0xf8000000 RTF_ADDRCONF = 0x40000 RTF_ALLONLINK = 0x20000 RTF_BROADCAST = 0x10000000 RTF_CACHE = 0x1000000 RTF_DEFAULT = 0x10000 RTF_DYNAMIC = 0x10 RTF_FLOW = 0x2000000 RTF_GATEWAY = 0x2 RTF_HOST = 0x4 RTF_INTERFACE = 0x40000000 RTF_IRTT = 0x100 RTF_LINKRT = 0x100000 RTF_LOCAL = 0x80000000 RTF_MODIFIED = 0x20 RTF_MSS = 0x40 RTF_MTU = 0x40 RTF_MULTICAST = 0x20000000 RTF_NAT = 0x8000000 RTF_NOFORWARD = 0x1000 RTF_NONEXTHOP = 0x200000 RTF_NOPMTUDISC = 0x4000 RTF_POLICY = 0x4000000 RTF_REINSTATE = 0x8 RTF_REJECT = 0x200 RTF_STATIC = 0x400 RTF_THROW = 0x2000 RTF_UP = 0x1 RTF_WINDOW = 0x80 RTF_XRESOLVE = 0x800 RTM_BASE = 0x10 RTM_DELACTION = 0x31 RTM_DELADDR = 0x15 RTM_DELADDRLABEL = 0x49 RTM_DELLINK = 0x11 RTM_DELMDB = 0x55 RTM_DELNEIGH = 0x1d RTM_DELNETCONF = 0x51 RTM_DELNSID = 0x59 RTM_DELQDISC = 0x25 RTM_DELROUTE = 0x19 RTM_DELRULE = 0x21 RTM_DELTCLASS = 0x29 RTM_DELTFILTER = 0x2d RTM_F_CLONED = 0x200 RTM_F_EQUALIZE = 0x400 RTM_F_FIB_MATCH = 0x2000 RTM_F_LOOKUP_TABLE = 0x1000 RTM_F_NOTIFY = 0x100 RTM_F_PREFIX = 0x800 RTM_GETACTION = 0x32 RTM_GETADDR = 0x16 RTM_GETADDRLABEL = 0x4a RTM_GETANYCAST = 0x3e RTM_GETDCB = 0x4e RTM_GETLINK = 0x12 RTM_GETMDB = 0x56 RTM_GETMULTICAST = 0x3a RTM_GETNEIGH = 0x1e RTM_GETNEIGHTBL = 0x42 RTM_GETNETCONF = 0x52 RTM_GETNSID = 0x5a RTM_GETQDISC = 0x26 RTM_GETROUTE = 0x1a RTM_GETRULE = 0x22 RTM_GETSTATS = 0x5e RTM_GETTCLASS = 0x2a RTM_GETTFILTER = 0x2e RTM_MAX = 0x63 RTM_NEWACTION = 0x30 RTM_NEWADDR = 0x14 RTM_NEWADDRLABEL = 0x48 RTM_NEWCACHEREPORT = 0x60 RTM_NEWLINK = 0x10 RTM_NEWMDB = 0x54 RTM_NEWNDUSEROPT = 0x44 RTM_NEWNEIGH = 0x1c RTM_NEWNEIGHTBL = 0x40 RTM_NEWNETCONF = 0x50 RTM_NEWNSID = 0x58 RTM_NEWPREFIX = 0x34 RTM_NEWQDISC = 0x24 RTM_NEWROUTE = 0x18 RTM_NEWRULE = 0x20 RTM_NEWSTATS = 0x5c RTM_NEWTCLASS = 0x28 RTM_NEWTFILTER = 0x2c RTM_NR_FAMILIES = 0x15 RTM_NR_MSGTYPES = 0x54 RTM_SETDCB = 0x4f RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 RTNH_ALIGNTO = 0x4 RTNH_COMPARE_MASK = 0x19 RTNH_F_DEAD = 0x1 RTNH_F_LINKDOWN = 0x10 RTNH_F_OFFLOAD = 0x8 RTNH_F_ONLINK = 0x4 RTNH_F_PERVASIVE = 0x2 RTNH_F_UNRESOLVED = 0x20 RTN_MAX = 0xb RTPROT_BABEL = 0x2a RTPROT_BIRD = 0xc RTPROT_BOOT = 0x3 RTPROT_DHCP = 0x10 RTPROT_DNROUTED = 0xd RTPROT_GATED = 0x8 RTPROT_KERNEL = 0x2 RTPROT_MROUTED = 0x11 RTPROT_MRT = 0xa RTPROT_NTK = 0xf RTPROT_RA = 0x9 RTPROT_REDIRECT = 0x1 RTPROT_STATIC = 0x4 RTPROT_UNSPEC = 0x0 RTPROT_XORP = 0xe RTPROT_ZEBRA = 0xb RT_CLASS_DEFAULT = 0xfd RT_CLASS_LOCAL = 0xff RT_CLASS_MAIN = 0xfe RT_CLASS_MAX = 0xff RT_CLASS_UNSPEC = 0x0 RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 RUSAGE_THREAD = 0x1 SCM_CREDENTIALS = 0x2 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x1d SCM_TIMESTAMPING = 0x25 SCM_TIMESTAMPING_OPT_STATS = 0x36 SCM_TIMESTAMPING_PKTINFO = 0x3a SCM_TIMESTAMPNS = 0x23 SCM_WIFI_STATUS = 0x29 SECCOMP_MODE_DISABLED = 0x0 SECCOMP_MODE_FILTER = 0x2 SECCOMP_MODE_STRICT = 0x1 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 SIOCADDDLCI = 0x8980 SIOCADDMULTI = 0x8931 SIOCADDRT = 0x890b SIOCATMARK = 0x40047307 SIOCBONDCHANGEACTIVE = 0x8995 SIOCBONDENSLAVE = 0x8990 SIOCBONDINFOQUERY = 0x8994 SIOCBONDRELEASE = 0x8991 SIOCBONDSETHWADDR = 0x8992 SIOCBONDSLAVEINFOQUERY = 0x8993 SIOCBRADDBR = 0x89a0 SIOCBRADDIF = 0x89a2 SIOCBRDELBR = 0x89a1 SIOCBRDELIF = 0x89a3 SIOCDARP = 0x8953 SIOCDELDLCI = 0x8981 SIOCDELMULTI = 0x8932 SIOCDELRT = 0x890c SIOCDEVPRIVATE = 0x89f0 SIOCDIFADDR = 0x8936 SIOCDRARP = 0x8960 SIOCETHTOOL = 0x8946 SIOCGARP = 0x8954 SIOCGHWTSTAMP = 0x89b1 SIOCGIFADDR = 0x8915 SIOCGIFBR = 0x8940 SIOCGIFBRDADDR = 0x8919 SIOCGIFCONF = 0x8912 SIOCGIFCOUNT = 0x8938 SIOCGIFDSTADDR = 0x8917 SIOCGIFENCAP = 0x8925 SIOCGIFFLAGS = 0x8913 SIOCGIFHWADDR = 0x8927 SIOCGIFINDEX = 0x8933 SIOCGIFMAP = 0x8970 SIOCGIFMEM = 0x891f SIOCGIFMETRIC = 0x891d SIOCGIFMTU = 0x8921 SIOCGIFNAME = 0x8910 SIOCGIFNETMASK = 0x891b SIOCGIFPFLAGS = 0x8935 SIOCGIFSLAVE = 0x8929 SIOCGIFTXQLEN = 0x8942 SIOCGIFVLAN = 0x8982 SIOCGMIIPHY = 0x8947 SIOCGMIIREG = 0x8948 SIOCGPGRP = 0x40047309 SIOCGRARP = 0x8961 SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 SIOCGSTAMPNS = 0x8907 SIOCINQ = 0x467f SIOCOUTQ = 0x7472 SIOCOUTQNSD = 0x894b SIOCPROTOPRIVATE = 0x89e0 SIOCRTMSG = 0x890d SIOCSARP = 0x8955 SIOCSHWTSTAMP = 0x89b0 SIOCSIFADDR = 0x8916 SIOCSIFBR = 0x8941 SIOCSIFBRDADDR = 0x891a SIOCSIFDSTADDR = 0x8918 SIOCSIFENCAP = 0x8926 SIOCSIFFLAGS = 0x8914 SIOCSIFHWADDR = 0x8924 SIOCSIFHWBROADCAST = 0x8937 SIOCSIFLINK = 0x8911 SIOCSIFMAP = 0x8971 SIOCSIFMEM = 0x8920 SIOCSIFMETRIC = 0x891e SIOCSIFMTU = 0x8922 SIOCSIFNAME = 0x8923 SIOCSIFNETMASK = 0x891c SIOCSIFPFLAGS = 0x8934 SIOCSIFSLAVE = 0x8930 SIOCSIFTXQLEN = 0x8943 SIOCSIFVLAN = 0x8983 SIOCSMIIREG = 0x8949 SIOCSPGRP = 0x80047308 SIOCSRARP = 0x8962 SIOCWANDEV = 0x894a SOCK_CLOEXEC = 0x80000 SOCK_DCCP = 0x6 SOCK_DGRAM = 0x1 SOCK_IOC_TYPE = 0x89 SOCK_NONBLOCK = 0x80 SOCK_PACKET = 0xa SOCK_RAW = 0x3 SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x2 SOL_AAL = 0x109 SOL_ALG = 0x117 SOL_ATM = 0x108 SOL_CAIF = 0x116 SOL_CAN_BASE = 0x64 SOL_DCCP = 0x10d SOL_DECNET = 0x105 SOL_ICMPV6 = 0x3a SOL_IP = 0x0 SOL_IPV6 = 0x29 SOL_IRDA = 0x10a SOL_IUCV = 0x115 SOL_KCM = 0x119 SOL_LLC = 0x10c SOL_NETBEUI = 0x10b SOL_NETLINK = 0x10e SOL_NFC = 0x118 SOL_PACKET = 0x107 SOL_PNPIPE = 0x113 SOL_PPPOL2TP = 0x111 SOL_RAW = 0xff SOL_RDS = 0x114 SOL_RXRPC = 0x110 SOL_SOCKET = 0xffff SOL_TCP = 0x6 SOL_TIPC = 0x10f SOL_X25 = 0x106 SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x1009 SO_ATTACH_BPF = 0x32 SO_ATTACH_FILTER = 0x1a SO_ATTACH_REUSEPORT_CBPF = 0x33 SO_ATTACH_REUSEPORT_EBPF = 0x34 SO_BINDTODEVICE = 0x19 SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x20 SO_BSDCOMPAT = 0xe SO_BUSY_POLL = 0x2e SO_CNX_ADVICE = 0x35 SO_COOKIE = 0x39 SO_DEBUG = 0x1 SO_DETACH_BPF = 0x1b SO_DETACH_FILTER = 0x1b SO_DOMAIN = 0x1029 SO_DONTROUTE = 0x10 SO_ERROR = 0x1007 SO_GET_FILTER = 0x1a SO_INCOMING_CPU = 0x31 SO_INCOMING_NAPI_ID = 0x38 SO_KEEPALIVE = 0x8 SO_LINGER = 0x80 SO_LOCK_FILTER = 0x2c SO_MARK = 0x24 SO_MAX_PACING_RATE = 0x2f SO_MEMINFO = 0x37 SO_NOFCS = 0x2b SO_NO_CHECK = 0xb SO_OOBINLINE = 0x100 SO_PASSCRED = 0x11 SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x12 SO_PEERGROUPS = 0x3b SO_PEERNAME = 0x1c SO_PEERSEC = 0x1e SO_PRIORITY = 0xc SO_PROTOCOL = 0x1028 SO_RCVBUF = 0x1002 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x1006 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_RXQ_OVFL = 0x28 SO_SECURITY_AUTHENTICATION = 0x16 SO_SECURITY_ENCRYPTION_NETWORK = 0x18 SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 SO_SELECT_ERR_QUEUE = 0x2d SO_SNDBUF = 0x1001 SO_SNDBUFFORCE = 0x1f SO_SNDLOWAT = 0x1003 SO_SNDTIMEO = 0x1005 SO_STYLE = 0x1008 SO_TIMESTAMP = 0x1d SO_TIMESTAMPING = 0x25 SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x1008 SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 SO_VM_SOCKETS_BUFFER_SIZE = 0x0 SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 SO_VM_SOCKETS_TRUSTED = 0x5 SO_WIFI_STATUS = 0x29 SPLICE_F_GIFT = 0x8 SPLICE_F_MORE = 0x4 SPLICE_F_MOVE = 0x1 SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000 S_IFCHR = 0x2000 S_IFDIR = 0x4000 S_IFIFO = 0x1000 S_IFLNK = 0xa000 S_IFMT = 0xf000 S_IFREG = 0x8000 S_IFSOCK = 0xc000 S_IREAD = 0x100 S_IRGRP = 0x20 S_IROTH = 0x4 S_IRUSR = 0x100 S_IRWXG = 0x38 S_IRWXO = 0x7 S_IRWXU = 0x1c0 S_ISGID = 0x400 S_ISUID = 0x800 S_ISVTX = 0x200 S_IWGRP = 0x10 S_IWOTH = 0x2 S_IWRITE = 0x80 S_IWUSR = 0x80 S_IXGRP = 0x8 S_IXOTH = 0x1 S_IXUSR = 0x40 TAB0 = 0x0 TAB1 = 0x800 TAB2 = 0x1000 TAB3 = 0x1800 TABDLY = 0x1800 TASKSTATS_CMD_ATTR_MAX = 0x4 TASKSTATS_CMD_MAX = 0x2 TASKSTATS_GENL_NAME = "TASKSTATS" TASKSTATS_GENL_VERSION = 0x1 TASKSTATS_TYPE_MAX = 0x6 TASKSTATS_VERSION = 0x8 TCFLSH = 0x5407 TCGETA = 0x5401 TCGETS = 0x540d TCGETS2 = 0x4030542a TCIFLUSH = 0x0 TCIOFF = 0x2 TCIOFLUSH = 0x2 TCION = 0x3 TCOFLUSH = 0x1 TCOOFF = 0x0 TCOON = 0x1 TCP_CC_INFO = 0x1a TCP_CONGESTION = 0xd TCP_COOKIE_IN_ALWAYS = 0x1 TCP_COOKIE_MAX = 0x10 TCP_COOKIE_MIN = 0x8 TCP_COOKIE_OUT_NEVER = 0x2 TCP_COOKIE_PAIR_SIZE = 0x20 TCP_COOKIE_TRANSACTIONS = 0xf TCP_CORK = 0x3 TCP_DEFER_ACCEPT = 0x9 TCP_FASTOPEN = 0x17 TCP_FASTOPEN_CONNECT = 0x1e TCP_INFO = 0xb TCP_KEEPCNT = 0x6 TCP_KEEPIDLE = 0x4 TCP_KEEPINTVL = 0x5 TCP_LINGER2 = 0x8 TCP_MAXSEG = 0x2 TCP_MAXWIN = 0xffff TCP_MAX_WINSHIFT = 0xe TCP_MD5SIG = 0xe TCP_MD5SIG_MAXKEYLEN = 0x50 TCP_MSS = 0x200 TCP_MSS_DEFAULT = 0x218 TCP_MSS_DESIRED = 0x4c4 TCP_NODELAY = 0x1 TCP_NOTSENT_LOWAT = 0x19 TCP_QUEUE_SEQ = 0x15 TCP_QUICKACK = 0xc TCP_REPAIR = 0x13 TCP_REPAIR_OPTIONS = 0x16 TCP_REPAIR_QUEUE = 0x14 TCP_REPAIR_WINDOW = 0x1d TCP_SAVED_SYN = 0x1c TCP_SAVE_SYN = 0x1b TCP_SYNCNT = 0x7 TCP_S_DATA_IN = 0x4 TCP_S_DATA_OUT = 0x8 TCP_THIN_DUPACK = 0x11 TCP_THIN_LINEAR_TIMEOUTS = 0x10 TCP_TIMESTAMP = 0x18 TCP_USER_TIMEOUT = 0x12 TCP_WINDOW_CLAMP = 0xa TCSAFLUSH = 0x5410 TCSBRK = 0x5405 TCSBRKP = 0x5486 TCSETA = 0x5402 TCSETAF = 0x5404 TCSETAW = 0x5403 TCSETS = 0x540e TCSETS2 = 0x8030542b TCSETSF = 0x5410 TCSETSF2 = 0x8030542d TCSETSW = 0x540f TCSETSW2 = 0x8030542c TCXONC = 0x5406 TIOCCBRK = 0x5428 TIOCCONS = 0x80047478 TIOCEXCL = 0x740d TIOCGDEV = 0x40045432 TIOCGETD = 0x7400 TIOCGETP = 0x7408 TIOCGEXCL = 0x40045440 TIOCGICOUNT = 0x5492 TIOCGLCKTRMIOS = 0x548b TIOCGLTC = 0x7474 TIOCGPGRP = 0x40047477 TIOCGPKT = 0x40045438 TIOCGPTLCK = 0x40045439 TIOCGPTN = 0x40045430 TIOCGPTPEER = 0x20005441 TIOCGRS485 = 0x4020542e TIOCGSERIAL = 0x5484 TIOCGSID = 0x7416 TIOCGSOFTCAR = 0x5481 TIOCGWINSZ = 0x40087468 TIOCINQ = 0x467f TIOCLINUX = 0x5483 TIOCMBIC = 0x741c TIOCMBIS = 0x741b TIOCMGET = 0x741d TIOCMIWAIT = 0x5491 TIOCMSET = 0x741a TIOCM_CAR = 0x100 TIOCM_CD = 0x100 TIOCM_CTS = 0x40 TIOCM_DSR = 0x400 TIOCM_DTR = 0x2 TIOCM_LE = 0x1 TIOCM_RI = 0x200 TIOCM_RNG = 0x200 TIOCM_RTS = 0x4 TIOCM_SR = 0x20 TIOCM_ST = 0x10 TIOCNOTTY = 0x5471 TIOCNXCL = 0x740e TIOCOUTQ = 0x7472 TIOCPKT = 0x5470 TIOCPKT_DATA = 0x0 TIOCPKT_DOSTOP = 0x20 TIOCPKT_FLUSHREAD = 0x1 TIOCPKT_FLUSHWRITE = 0x2 TIOCPKT_IOCTL = 0x40 TIOCPKT_NOSTOP = 0x10 TIOCPKT_START = 0x8 TIOCPKT_STOP = 0x4 TIOCSBRK = 0x5427 TIOCSCTTY = 0x5480 TIOCSERCONFIG = 0x5488 TIOCSERGETLSR = 0x548e TIOCSERGETMULTI = 0x548f TIOCSERGSTRUCT = 0x548d TIOCSERGWILD = 0x5489 TIOCSERSETMULTI = 0x5490 TIOCSERSWILD = 0x548a TIOCSER_TEMT = 0x1 TIOCSETD = 0x7401 TIOCSETN = 0x740a TIOCSETP = 0x7409 TIOCSIG = 0x80045436 TIOCSLCKTRMIOS = 0x548c TIOCSLTC = 0x7475 TIOCSPGRP = 0x80047476 TIOCSPTLCK = 0x80045431 TIOCSRS485 = 0xc020542f TIOCSSERIAL = 0x5485 TIOCSSOFTCAR = 0x5482 TIOCSTI = 0x5472 TIOCSWINSZ = 0x80087467 TIOCVHANGUP = 0x5437 TOSTOP = 0x8000 TS_COMM_LEN = 0x20 TUNATTACHFILTER = 0x800854d5 TUNDETACHFILTER = 0x800854d6 TUNGETFEATURES = 0x400454cf TUNGETFILTER = 0x400854db TUNGETIFF = 0x400454d2 TUNGETSNDBUF = 0x400454d3 TUNGETVNETBE = 0x400454df TUNGETVNETHDRSZ = 0x400454d7 TUNGETVNETLE = 0x400454dd TUNSETDEBUG = 0x800454c9 TUNSETGROUP = 0x800454ce TUNSETIFF = 0x800454ca TUNSETIFINDEX = 0x800454da TUNSETLINK = 0x800454cd TUNSETNOCSUM = 0x800454c8 TUNSETOFFLOAD = 0x800454d0 TUNSETOWNER = 0x800454cc TUNSETPERSIST = 0x800454cb TUNSETQUEUE = 0x800454d9 TUNSETSNDBUF = 0x800454d4 TUNSETTXFILTER = 0x800454d1 TUNSETVNETBE = 0x800454de TUNSETVNETHDRSZ = 0x800454d8 TUNSETVNETLE = 0x800454dc UMOUNT_NOFOLLOW = 0x8 UTIME_NOW = 0x3fffffff UTIME_OMIT = 0x3ffffffe VDISCARD = 0xd VEOF = 0x10 VEOL = 0x11 VEOL2 = 0x6 VERASE = 0x2 VINTR = 0x0 VKILL = 0x3 VLNEXT = 0xf VMADDR_CID_ANY = 0xffffffff VMADDR_CID_HOST = 0x2 VMADDR_CID_HYPERVISOR = 0x0 VMADDR_CID_RESERVED = 0x1 VMADDR_PORT_ANY = 0xffffffff VMIN = 0x4 VM_SOCKETS_INVALID_VERSION = 0xffffffff VQUIT = 0x1 VREPRINT = 0xc VSTART = 0x8 VSTOP = 0x9 VSUSP = 0xa VSWTC = 0x7 VSWTCH = 0x7 VT0 = 0x0 VT1 = 0x4000 VTDLY = 0x4000 VTIME = 0x5 VWERASE = 0xe WALL = 0x40000000 WCLONE = 0x80000000 WCONTINUED = 0x8 WDIOC_GETBOOTSTATUS = 0x40045702 WDIOC_GETPRETIMEOUT = 0x40045709 WDIOC_GETSTATUS = 0x40045701 WDIOC_GETSUPPORT = 0x40285700 WDIOC_GETTEMP = 0x40045703 WDIOC_GETTIMELEFT = 0x4004570a WDIOC_GETTIMEOUT = 0x40045707 WDIOC_KEEPALIVE = 0x40045705 WDIOC_SETOPTIONS = 0x40045704 WDIOC_SETPRETIMEOUT = 0xc0045708 WDIOC_SETTIMEOUT = 0xc0045706 WEXITED = 0x4 WNOHANG = 0x1 WNOTHREAD = 0x20000000 WNOWAIT = 0x1000000 WORDSIZE = 0x20 WSTOPPED = 0x2 WUNTRACED = 0x2 XATTR_CREATE = 0x1 XATTR_REPLACE = 0x2 XCASE = 0x4 XTABS = 0x1800 ) // Errors const ( E2BIG = syscall.Errno(0x7) EACCES = syscall.Errno(0xd) EADDRINUSE = syscall.Errno(0x7d) EADDRNOTAVAIL = syscall.Errno(0x7e) EADV = syscall.Errno(0x44) EAFNOSUPPORT = syscall.Errno(0x7c) EAGAIN = syscall.Errno(0xb) EALREADY = syscall.Errno(0x95) EBADE = syscall.Errno(0x32) EBADF = syscall.Errno(0x9) EBADFD = syscall.Errno(0x51) EBADMSG = syscall.Errno(0x4d) EBADR = syscall.Errno(0x33) EBADRQC = syscall.Errno(0x36) EBADSLT = syscall.Errno(0x37) EBFONT = syscall.Errno(0x3b) EBUSY = syscall.Errno(0x10) ECANCELED = syscall.Errno(0x9e) ECHILD = syscall.Errno(0xa) ECHRNG = syscall.Errno(0x25) ECOMM = syscall.Errno(0x46) ECONNABORTED = syscall.Errno(0x82) ECONNREFUSED = syscall.Errno(0x92) ECONNRESET = syscall.Errno(0x83) EDEADLK = syscall.Errno(0x2d) EDEADLOCK = syscall.Errno(0x38) EDESTADDRREQ = syscall.Errno(0x60) EDOM = syscall.Errno(0x21) EDOTDOT = syscall.Errno(0x49) EDQUOT = syscall.Errno(0x46d) EEXIST = syscall.Errno(0x11) EFAULT = syscall.Errno(0xe) EFBIG = syscall.Errno(0x1b) EHOSTDOWN = syscall.Errno(0x93) EHOSTUNREACH = syscall.Errno(0x94) EHWPOISON = syscall.Errno(0xa8) EIDRM = syscall.Errno(0x24) EILSEQ = syscall.Errno(0x58) EINIT = syscall.Errno(0x8d) EINPROGRESS = syscall.Errno(0x96) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x85) EISDIR = syscall.Errno(0x15) EISNAM = syscall.Errno(0x8b) EKEYEXPIRED = syscall.Errno(0xa2) EKEYREJECTED = syscall.Errno(0xa4) EKEYREVOKED = syscall.Errno(0xa3) EL2HLT = syscall.Errno(0x2c) EL2NSYNC = syscall.Errno(0x26) EL3HLT = syscall.Errno(0x27) EL3RST = syscall.Errno(0x28) ELIBACC = syscall.Errno(0x53) ELIBBAD = syscall.Errno(0x54) ELIBEXEC = syscall.Errno(0x57) ELIBMAX = syscall.Errno(0x56) ELIBSCN = syscall.Errno(0x55) ELNRNG = syscall.Errno(0x29) ELOOP = syscall.Errno(0x5a) EMEDIUMTYPE = syscall.Errno(0xa0) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) EMSGSIZE = syscall.Errno(0x61) EMULTIHOP = syscall.Errno(0x4a) ENAMETOOLONG = syscall.Errno(0x4e) ENAVAIL = syscall.Errno(0x8a) ENETDOWN = syscall.Errno(0x7f) ENETRESET = syscall.Errno(0x81) ENETUNREACH = syscall.Errno(0x80) ENFILE = syscall.Errno(0x17) ENOANO = syscall.Errno(0x35) ENOBUFS = syscall.Errno(0x84) ENOCSI = syscall.Errno(0x2b) ENODATA = syscall.Errno(0x3d) ENODEV = syscall.Errno(0x13) ENOENT = syscall.Errno(0x2) ENOEXEC = syscall.Errno(0x8) ENOKEY = syscall.Errno(0xa1) ENOLCK = syscall.Errno(0x2e) ENOLINK = syscall.Errno(0x43) ENOMEDIUM = syscall.Errno(0x9f) ENOMEM = syscall.Errno(0xc) ENOMSG = syscall.Errno(0x23) ENONET = syscall.Errno(0x40) ENOPKG = syscall.Errno(0x41) ENOPROTOOPT = syscall.Errno(0x63) ENOSPC = syscall.Errno(0x1c) ENOSR = syscall.Errno(0x3f) ENOSTR = syscall.Errno(0x3c) ENOSYS = syscall.Errno(0x59) ENOTBLK = syscall.Errno(0xf) ENOTCONN = syscall.Errno(0x86) ENOTDIR = syscall.Errno(0x14) ENOTEMPTY = syscall.Errno(0x5d) ENOTNAM = syscall.Errno(0x89) ENOTRECOVERABLE = syscall.Errno(0xa6) ENOTSOCK = syscall.Errno(0x5f) ENOTSUP = syscall.Errno(0x7a) ENOTTY = syscall.Errno(0x19) ENOTUNIQ = syscall.Errno(0x50) ENXIO = syscall.Errno(0x6) EOPNOTSUPP = syscall.Errno(0x7a) EOVERFLOW = syscall.Errno(0x4f) EOWNERDEAD = syscall.Errno(0xa5) EPERM = syscall.Errno(0x1) EPFNOSUPPORT = syscall.Errno(0x7b) EPIPE = syscall.Errno(0x20) EPROTO = syscall.Errno(0x47) EPROTONOSUPPORT = syscall.Errno(0x78) EPROTOTYPE = syscall.Errno(0x62) ERANGE = syscall.Errno(0x22) EREMCHG = syscall.Errno(0x52) EREMDEV = syscall.Errno(0x8e) EREMOTE = syscall.Errno(0x42) EREMOTEIO = syscall.Errno(0x8c) ERESTART = syscall.Errno(0x5b) ERFKILL = syscall.Errno(0xa7) EROFS = syscall.Errno(0x1e) ESHUTDOWN = syscall.Errno(0x8f) ESOCKTNOSUPPORT = syscall.Errno(0x79) ESPIPE = syscall.Errno(0x1d) ESRCH = syscall.Errno(0x3) ESRMNT = syscall.Errno(0x45) ESTALE = syscall.Errno(0x97) ESTRPIPE = syscall.Errno(0x5c) ETIME = syscall.Errno(0x3e) ETIMEDOUT = syscall.Errno(0x91) ETOOMANYREFS = syscall.Errno(0x90) ETXTBSY = syscall.Errno(0x1a) EUCLEAN = syscall.Errno(0x87) EUNATCH = syscall.Errno(0x2a) EUSERS = syscall.Errno(0x5e) EWOULDBLOCK = syscall.Errno(0xb) EXDEV = syscall.Errno(0x12) EXFULL = syscall.Errno(0x34) ) // Signals const ( SIGABRT = syscall.Signal(0x6) SIGALRM = syscall.Signal(0xe) SIGBUS = syscall.Signal(0xa) SIGCHLD = syscall.Signal(0x12) SIGCLD = syscall.Signal(0x12) SIGCONT = syscall.Signal(0x19) SIGEMT = syscall.Signal(0x7) SIGFPE = syscall.Signal(0x8) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x16) SIGIOT = syscall.Signal(0x6) SIGKILL = syscall.Signal(0x9) SIGPIPE = syscall.Signal(0xd) SIGPOLL = syscall.Signal(0x16) SIGPROF = syscall.Signal(0x1d) SIGPWR = syscall.Signal(0x13) SIGQUIT = syscall.Signal(0x3) SIGSEGV = syscall.Signal(0xb) SIGSTOP = syscall.Signal(0x17) SIGSYS = syscall.Signal(0xc) SIGTERM = syscall.Signal(0xf) SIGTRAP = syscall.Signal(0x5) SIGTSTP = syscall.Signal(0x18) SIGTTIN = syscall.Signal(0x1a) SIGTTOU = syscall.Signal(0x1b) SIGURG = syscall.Signal(0x15) SIGUSR1 = syscall.Signal(0x10) SIGUSR2 = syscall.Signal(0x11) SIGVTALRM = syscall.Signal(0x1c) SIGWINCH = syscall.Signal(0x14) SIGXCPU = syscall.Signal(0x1e) SIGXFSZ = syscall.Signal(0x1f) ) // Error table var errors = [...]string{ 1: "operation not permitted", 2: "no such file or directory", 3: "no such process", 4: "interrupted system call", 5: "input/output error", 6: "no such device or address", 7: "argument list too long", 8: "exec format error", 9: "bad file descriptor", 10: "no child processes", 11: "resource temporarily unavailable", 12: "cannot allocate memory", 13: "permission denied", 14: "bad address", 15: "block device required", 16: "device or resource busy", 17: "file exists", 18: "invalid cross-device link", 19: "no such device", 20: "not a directory", 21: "is a directory", 22: "invalid argument", 23: "too many open files in system", 24: "too many open files", 25: "inappropriate ioctl for device", 26: "text file busy", 27: "file too large", 28: "no space left on device", 29: "illegal seek", 30: "read-only file system", 31: "too many links", 32: "broken pipe", 33: "numerical argument out of domain", 34: "numerical result out of range", 35: "no message of desired type", 36: "identifier removed", 37: "channel number out of range", 38: "level 2 not synchronized", 39: "level 3 halted", 40: "level 3 reset", 41: "link number out of range", 42: "protocol driver not attached", 43: "no CSI structure available", 44: "level 2 halted", 45: "resource deadlock avoided", 46: "no locks available", 50: "invalid exchange", 51: "invalid request descriptor", 52: "exchange full", 53: "no anode", 54: "invalid request code", 55: "invalid slot", 56: "file locking deadlock error", 59: "bad font file format", 60: "device not a stream", 61: "no data available", 62: "timer expired", 63: "out of streams resources", 64: "machine is not on the network", 65: "package not installed", 66: "object is remote", 67: "link has been severed", 68: "advertise error", 69: "srmount error", 70: "communication error on send", 71: "protocol error", 73: "RFS specific error", 74: "multihop attempted", 77: "bad message", 78: "file name too long", 79: "value too large for defined data type", 80: "name not unique on network", 81: "file descriptor in bad state", 82: "remote address changed", 83: "can not access a needed shared library", 84: "accessing a corrupted shared library", 85: ".lib section in a.out corrupted", 86: "attempting to link in too many shared libraries", 87: "cannot exec a shared library directly", 88: "invalid or incomplete multibyte or wide character", 89: "function not implemented", 90: "too many levels of symbolic links", 91: "interrupted system call should be restarted", 92: "streams pipe error", 93: "directory not empty", 94: "too many users", 95: "socket operation on non-socket", 96: "destination address required", 97: "message too long", 98: "protocol wrong type for socket", 99: "protocol not available", 120: "protocol not supported", 121: "socket type not supported", 122: "operation not supported", 123: "protocol family not supported", 124: "address family not supported by protocol", 125: "address already in use", 126: "cannot assign requested address", 127: "network is down", 128: "network is unreachable", 129: "network dropped connection on reset", 130: "software caused connection abort", 131: "connection reset by peer", 132: "no buffer space available", 133: "transport endpoint is already connected", 134: "transport endpoint is not connected", 135: "structure needs cleaning", 137: "not a XENIX named type file", 138: "no XENIX semaphores available", 139: "is a named type file", 140: "remote I/O error", 141: "unknown error 141", 142: "unknown error 142", 143: "cannot send after transport endpoint shutdown", 144: "too many references: cannot splice", 145: "connection timed out", 146: "connection refused", 147: "host is down", 148: "no route to host", 149: "operation already in progress", 150: "operation now in progress", 151: "stale file handle", 158: "operation canceled", 159: "no medium found", 160: "wrong medium type", 161: "required key not available", 162: "key has expired", 163: "key has been revoked", 164: "key was rejected by service", 165: "owner died", 166: "state not recoverable", 167: "operation not possible due to RF-kill", 168: "memory page has hardware error", 1133: "disk quota exceeded", } // Signal table var signals = [...]string{ 1: "hangup", 2: "interrupt", 3: "quit", 4: "illegal instruction", 5: "trace/breakpoint trap", 6: "aborted", 7: "EMT trap", 8: "floating point exception", 9: "killed", 10: "bus error", 11: "segmentation fault", 12: "bad system call", 13: "broken pipe", 14: "alarm clock", 15: "terminated", 16: "user defined signal 1", 17: "user defined signal 2", 18: "child exited", 19: "power failure", 20: "window changed", 21: "urgent I/O condition", 22: "I/O possible", 23: "stopped (signal)", 24: "stopped", 25: "continued", 26: "stopped (tty input)", 27: "stopped (tty output)", 28: "virtual timer expired", 29: "profiling timer expired", 30: "CPU time limit exceeded", 31: "file size limit exceeded", } ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go ================================================ // mkerrors.sh -Wall -Werror -static -I/tmp/include // Code generated by the command above; see README.md. DO NOT EDIT. // +build mips64,linux // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go package unix import "syscall" const ( AF_ALG = 0x26 AF_APPLETALK = 0x5 AF_ASH = 0x12 AF_ATMPVC = 0x8 AF_ATMSVC = 0x14 AF_AX25 = 0x3 AF_BLUETOOTH = 0x1f AF_BRIDGE = 0x7 AF_CAIF = 0x25 AF_CAN = 0x1d AF_DECnet = 0xc AF_ECONET = 0x13 AF_FILE = 0x1 AF_IB = 0x1b AF_IEEE802154 = 0x24 AF_INET = 0x2 AF_INET6 = 0xa AF_IPX = 0x4 AF_IRDA = 0x17 AF_ISDN = 0x22 AF_IUCV = 0x20 AF_KCM = 0x29 AF_KEY = 0xf AF_LLC = 0x1a AF_LOCAL = 0x1 AF_MAX = 0x2c AF_MPLS = 0x1c AF_NETBEUI = 0xd AF_NETLINK = 0x10 AF_NETROM = 0x6 AF_NFC = 0x27 AF_PACKET = 0x11 AF_PHONET = 0x23 AF_PPPOX = 0x18 AF_QIPCRTR = 0x2a AF_RDS = 0x15 AF_ROSE = 0xb AF_ROUTE = 0x10 AF_RXRPC = 0x21 AF_SECURITY = 0xe AF_SMC = 0x2b AF_SNA = 0x16 AF_TIPC = 0x1e AF_UNIX = 0x1 AF_UNSPEC = 0x0 AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 ALG_OP_DECRYPT = 0x0 ALG_OP_ENCRYPT = 0x1 ALG_SET_AEAD_ASSOCLEN = 0x4 ALG_SET_AEAD_AUTHSIZE = 0x5 ALG_SET_IV = 0x2 ALG_SET_KEY = 0x1 ALG_SET_OP = 0x3 ARPHRD_6LOWPAN = 0x339 ARPHRD_ADAPT = 0x108 ARPHRD_APPLETLK = 0x8 ARPHRD_ARCNET = 0x7 ARPHRD_ASH = 0x30d ARPHRD_ATM = 0x13 ARPHRD_AX25 = 0x3 ARPHRD_BIF = 0x307 ARPHRD_CAIF = 0x336 ARPHRD_CAN = 0x118 ARPHRD_CHAOS = 0x5 ARPHRD_CISCO = 0x201 ARPHRD_CSLIP = 0x101 ARPHRD_CSLIP6 = 0x103 ARPHRD_DDCMP = 0x205 ARPHRD_DLCI = 0xf ARPHRD_ECONET = 0x30e ARPHRD_EETHER = 0x2 ARPHRD_ETHER = 0x1 ARPHRD_EUI64 = 0x1b ARPHRD_FCAL = 0x311 ARPHRD_FCFABRIC = 0x313 ARPHRD_FCPL = 0x312 ARPHRD_FCPP = 0x310 ARPHRD_FDDI = 0x306 ARPHRD_FRAD = 0x302 ARPHRD_HDLC = 0x201 ARPHRD_HIPPI = 0x30c ARPHRD_HWX25 = 0x110 ARPHRD_IEEE1394 = 0x18 ARPHRD_IEEE802 = 0x6 ARPHRD_IEEE80211 = 0x321 ARPHRD_IEEE80211_PRISM = 0x322 ARPHRD_IEEE80211_RADIOTAP = 0x323 ARPHRD_IEEE802154 = 0x324 ARPHRD_IEEE802154_MONITOR = 0x325 ARPHRD_IEEE802_TR = 0x320 ARPHRD_INFINIBAND = 0x20 ARPHRD_IP6GRE = 0x337 ARPHRD_IPDDP = 0x309 ARPHRD_IPGRE = 0x30a ARPHRD_IRDA = 0x30f ARPHRD_LAPB = 0x204 ARPHRD_LOCALTLK = 0x305 ARPHRD_LOOPBACK = 0x304 ARPHRD_METRICOM = 0x17 ARPHRD_NETLINK = 0x338 ARPHRD_NETROM = 0x0 ARPHRD_NONE = 0xfffe ARPHRD_PHONET = 0x334 ARPHRD_PHONET_PIPE = 0x335 ARPHRD_PIMREG = 0x30b ARPHRD_PPP = 0x200 ARPHRD_PRONET = 0x4 ARPHRD_RAWHDLC = 0x206 ARPHRD_ROSE = 0x10e ARPHRD_RSRVD = 0x104 ARPHRD_SIT = 0x308 ARPHRD_SKIP = 0x303 ARPHRD_SLIP = 0x100 ARPHRD_SLIP6 = 0x102 ARPHRD_TUNNEL = 0x300 ARPHRD_TUNNEL6 = 0x301 ARPHRD_VOID = 0xffff ARPHRD_VSOCKMON = 0x33a ARPHRD_X25 = 0x10f B0 = 0x0 B1000000 = 0x1008 B110 = 0x3 B115200 = 0x1002 B1152000 = 0x1009 B1200 = 0x9 B134 = 0x4 B150 = 0x5 B1500000 = 0x100a B1800 = 0xa B19200 = 0xe B200 = 0x6 B2000000 = 0x100b B230400 = 0x1003 B2400 = 0xb B2500000 = 0x100c B300 = 0x7 B3000000 = 0x100d B3500000 = 0x100e B38400 = 0xf B4000000 = 0x100f B460800 = 0x1004 B4800 = 0xc B50 = 0x1 B500000 = 0x1005 B57600 = 0x1001 B576000 = 0x1006 B600 = 0x8 B75 = 0x2 B921600 = 0x1007 B9600 = 0xd BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40081272 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d BLKRRPART = 0x2000125f BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 BOTHER = 0x1000 BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALU = 0x4 BPF_AND = 0x50 BPF_B = 0x10 BPF_DIV = 0x30 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 BPF_JA = 0x0 BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 BPF_JMP = 0x5 BPF_JSET = 0x40 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 BPF_LEN = 0x80 BPF_LL_OFF = -0x200000 BPF_LSH = 0x60 BPF_MAJOR_VERSION = 0x1 BPF_MAXINSNS = 0x1000 BPF_MEM = 0x60 BPF_MEMWORDS = 0x10 BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MOD = 0x90 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_NET_OFF = -0x100000 BPF_OR = 0x40 BPF_RET = 0x6 BPF_RSH = 0x70 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 BPF_TAX = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 BPF_XOR = 0xa0 BRKINT = 0x2 BS0 = 0x0 BS1 = 0x2000 BSDLY = 0x2000 CAN_BCM = 0x2 CAN_EFF_FLAG = 0x80000000 CAN_EFF_ID_BITS = 0x1d CAN_EFF_MASK = 0x1fffffff CAN_ERR_FLAG = 0x20000000 CAN_ERR_MASK = 0x1fffffff CAN_INV_FILTER = 0x20000000 CAN_ISOTP = 0x6 CAN_MAX_DLC = 0x8 CAN_MAX_DLEN = 0x8 CAN_MCNET = 0x5 CAN_MTU = 0x10 CAN_NPROTO = 0x7 CAN_RAW = 0x1 CAN_RAW_FILTER_MAX = 0x200 CAN_RTR_FLAG = 0x40000000 CAN_SFF_ID_BITS = 0xb CAN_SFF_MASK = 0x7ff CAN_TP16 = 0x3 CAN_TP20 = 0x4 CBAUD = 0x100f CBAUDEX = 0x1000 CFLUSH = 0xf CIBAUD = 0x100f0000 CLOCAL = 0x800 CLOCK_BOOTTIME = 0x7 CLOCK_BOOTTIME_ALARM = 0x9 CLOCK_DEFAULT = 0x0 CLOCK_EXT = 0x1 CLOCK_INT = 0x2 CLOCK_MONOTONIC = 0x1 CLOCK_MONOTONIC_COARSE = 0x6 CLOCK_MONOTONIC_RAW = 0x4 CLOCK_PROCESS_CPUTIME_ID = 0x2 CLOCK_REALTIME = 0x0 CLOCK_REALTIME_ALARM = 0x8 CLOCK_REALTIME_COARSE = 0x5 CLOCK_TAI = 0xb CLOCK_THREAD_CPUTIME_ID = 0x3 CLOCK_TXFROMRX = 0x4 CLOCK_TXINT = 0x3 CLONE_CHILD_CLEARTID = 0x200000 CLONE_CHILD_SETTID = 0x1000000 CLONE_DETACHED = 0x400000 CLONE_FILES = 0x400 CLONE_FS = 0x200 CLONE_IO = 0x80000000 CLONE_NEWCGROUP = 0x2000000 CLONE_NEWIPC = 0x8000000 CLONE_NEWNET = 0x40000000 CLONE_NEWNS = 0x20000 CLONE_NEWPID = 0x20000000 CLONE_NEWUSER = 0x10000000 CLONE_NEWUTS = 0x4000000 CLONE_PARENT = 0x8000 CLONE_PARENT_SETTID = 0x100000 CLONE_PTRACE = 0x2000 CLONE_SETTLS = 0x80000 CLONE_SIGHAND = 0x800 CLONE_SYSVSEM = 0x40000 CLONE_THREAD = 0x10000 CLONE_UNTRACED = 0x800000 CLONE_VFORK = 0x4000 CLONE_VM = 0x100 CMSPAR = 0x40000000 CR0 = 0x0 CR1 = 0x200 CR2 = 0x400 CR3 = 0x600 CRDLY = 0x600 CREAD = 0x80 CRTSCTS = 0x80000000 CS5 = 0x0 CS6 = 0x10 CS7 = 0x20 CS8 = 0x30 CSIGNAL = 0xff CSIZE = 0x30 CSTART = 0x11 CSTATUS = 0x0 CSTOP = 0x13 CSTOPB = 0x40 CSUSP = 0x1a DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 DT_FIFO = 0x1 DT_LNK = 0xa DT_REG = 0x8 DT_SOCK = 0xc DT_UNKNOWN = 0x0 DT_WHT = 0xe ECHO = 0x8 ECHOCTL = 0x200 ECHOE = 0x10 ECHOK = 0x20 ECHOKE = 0x800 ECHONL = 0x40 ECHOPRT = 0x400 EFD_CLOEXEC = 0x80000 EFD_NONBLOCK = 0x80 EFD_SEMAPHORE = 0x1 ENCODING_DEFAULT = 0x0 ENCODING_FM_MARK = 0x3 ENCODING_FM_SPACE = 0x4 ENCODING_MANCHESTER = 0x5 ENCODING_NRZ = 0x1 ENCODING_NRZI = 0x2 EPOLLERR = 0x8 EPOLLET = 0x80000000 EPOLLEXCLUSIVE = 0x10000000 EPOLLHUP = 0x10 EPOLLIN = 0x1 EPOLLMSG = 0x400 EPOLLONESHOT = 0x40000000 EPOLLOUT = 0x4 EPOLLPRI = 0x2 EPOLLRDBAND = 0x80 EPOLLRDHUP = 0x2000 EPOLLRDNORM = 0x40 EPOLLWAKEUP = 0x20000000 EPOLLWRBAND = 0x200 EPOLLWRNORM = 0x100 EPOLL_CLOEXEC = 0x80000 EPOLL_CTL_ADD = 0x1 EPOLL_CTL_DEL = 0x2 EPOLL_CTL_MOD = 0x3 ETH_P_1588 = 0x88f7 ETH_P_8021AD = 0x88a8 ETH_P_8021AH = 0x88e7 ETH_P_8021Q = 0x8100 ETH_P_80221 = 0x8917 ETH_P_802_2 = 0x4 ETH_P_802_3 = 0x1 ETH_P_802_3_MIN = 0x600 ETH_P_802_EX1 = 0x88b5 ETH_P_AARP = 0x80f3 ETH_P_AF_IUCV = 0xfbfb ETH_P_ALL = 0x3 ETH_P_AOE = 0x88a2 ETH_P_ARCNET = 0x1a ETH_P_ARP = 0x806 ETH_P_ATALK = 0x809b ETH_P_ATMFATE = 0x8884 ETH_P_ATMMPOA = 0x884c ETH_P_AX25 = 0x2 ETH_P_BATMAN = 0x4305 ETH_P_BPQ = 0x8ff ETH_P_CAIF = 0xf7 ETH_P_CAN = 0xc ETH_P_CANFD = 0xd ETH_P_CONTROL = 0x16 ETH_P_CUST = 0x6006 ETH_P_DDCMP = 0x6 ETH_P_DEC = 0x6000 ETH_P_DIAG = 0x6005 ETH_P_DNA_DL = 0x6001 ETH_P_DNA_RC = 0x6002 ETH_P_DNA_RT = 0x6003 ETH_P_DSA = 0x1b ETH_P_ECONET = 0x18 ETH_P_EDSA = 0xdada ETH_P_FCOE = 0x8906 ETH_P_FIP = 0x8914 ETH_P_HDLC = 0x19 ETH_P_HSR = 0x892f ETH_P_IBOE = 0x8915 ETH_P_IEEE802154 = 0xf6 ETH_P_IEEEPUP = 0xa00 ETH_P_IEEEPUPAT = 0xa01 ETH_P_IP = 0x800 ETH_P_IPV6 = 0x86dd ETH_P_IPX = 0x8137 ETH_P_IRDA = 0x17 ETH_P_LAT = 0x6004 ETH_P_LINK_CTL = 0x886c ETH_P_LOCALTALK = 0x9 ETH_P_LOOP = 0x60 ETH_P_LOOPBACK = 0x9000 ETH_P_MACSEC = 0x88e5 ETH_P_MOBITEX = 0x15 ETH_P_MPLS_MC = 0x8848 ETH_P_MPLS_UC = 0x8847 ETH_P_MVRP = 0x88f5 ETH_P_NCSI = 0x88f8 ETH_P_PAE = 0x888e ETH_P_PAUSE = 0x8808 ETH_P_PHONET = 0xf5 ETH_P_PPPTALK = 0x10 ETH_P_PPP_DISC = 0x8863 ETH_P_PPP_MP = 0x8 ETH_P_PPP_SES = 0x8864 ETH_P_PRP = 0x88fb ETH_P_PUP = 0x200 ETH_P_PUPAT = 0x201 ETH_P_QINQ1 = 0x9100 ETH_P_QINQ2 = 0x9200 ETH_P_QINQ3 = 0x9300 ETH_P_RARP = 0x8035 ETH_P_SCA = 0x6007 ETH_P_SLOW = 0x8809 ETH_P_SNAP = 0x5 ETH_P_TDLS = 0x890d ETH_P_TEB = 0x6558 ETH_P_TIPC = 0x88ca ETH_P_TRAILER = 0x1c ETH_P_TR_802_2 = 0x11 ETH_P_TSN = 0x22f0 ETH_P_WAN_PPP = 0x7 ETH_P_WCCP = 0x883e ETH_P_X25 = 0x805 ETH_P_XDSA = 0xf8 EXTA = 0xe EXTB = 0xf EXTPROC = 0x10000 FALLOC_FL_COLLAPSE_RANGE = 0x8 FALLOC_FL_INSERT_RANGE = 0x20 FALLOC_FL_KEEP_SIZE = 0x1 FALLOC_FL_NO_HIDE_STALE = 0x4 FALLOC_FL_PUNCH_HOLE = 0x2 FALLOC_FL_UNSHARE_RANGE = 0x40 FALLOC_FL_ZERO_RANGE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 FF1 = 0x8000 FFDLY = 0x8000 FLUSHO = 0x2000 FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 FS_ENCRYPTION_MODE_INVALID = 0x0 FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 FS_KEY_DESCRIPTOR_SIZE = 0x8 FS_KEY_DESC_PREFIX = "fscrypt:" FS_KEY_DESC_PREFIX_SIZE = 0x8 FS_MAX_KEY_SIZE = 0x40 FS_POLICY_FLAGS_PAD_16 = 0x2 FS_POLICY_FLAGS_PAD_32 = 0x3 FS_POLICY_FLAGS_PAD_4 = 0x0 FS_POLICY_FLAGS_PAD_8 = 0x1 FS_POLICY_FLAGS_PAD_MASK = 0x3 FS_POLICY_FLAGS_VALID = 0x3 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0x406 F_EXLCK = 0x4 F_GETFD = 0x1 F_GETFL = 0x3 F_GETLEASE = 0x401 F_GETLK = 0xe F_GETLK64 = 0xe F_GETOWN = 0x17 F_GETOWN_EX = 0x10 F_GETPIPE_SZ = 0x408 F_GETSIG = 0xb F_LOCK = 0x1 F_NOTIFY = 0x402 F_OFD_GETLK = 0x24 F_OFD_SETLK = 0x25 F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 F_SETFD = 0x2 F_SETFL = 0x4 F_SETLEASE = 0x400 F_SETLK = 0x6 F_SETLK64 = 0x6 F_SETLKW = 0x7 F_SETLKW64 = 0x7 F_SETOWN = 0x18 F_SETOWN_EX = 0xf F_SETPIPE_SZ = 0x407 F_SETSIG = 0xa F_SHLCK = 0x8 F_TEST = 0x3 F_TLOCK = 0x2 F_ULOCK = 0x0 F_UNLCK = 0x2 F_WRLCK = 0x1 GENL_ADMIN_PERM = 0x1 GENL_CMD_CAP_DO = 0x2 GENL_CMD_CAP_DUMP = 0x4 GENL_CMD_CAP_HASPOL = 0x8 GENL_HDRLEN = 0x4 GENL_ID_CTRL = 0x10 GENL_ID_PMCRAID = 0x12 GENL_ID_VFS_DQUOT = 0x11 GENL_MAX_ID = 0x3ff GENL_MIN_ID = 0x10 GENL_NAMSIZ = 0x10 GENL_START_ALLOC = 0x13 GENL_UNS_ADMIN_PERM = 0x10 GRND_NONBLOCK = 0x1 GRND_RANDOM = 0x2 HUPCL = 0x400 IBSHIFT = 0x10 ICANON = 0x2 ICMPV6_FILTER = 0x1 ICRNL = 0x100 IEXTEN = 0x100 IFA_F_DADFAILED = 0x8 IFA_F_DEPRECATED = 0x20 IFA_F_HOMEADDRESS = 0x10 IFA_F_MANAGETEMPADDR = 0x100 IFA_F_MCAUTOJOIN = 0x400 IFA_F_NODAD = 0x2 IFA_F_NOPREFIXROUTE = 0x200 IFA_F_OPTIMISTIC = 0x4 IFA_F_PERMANENT = 0x80 IFA_F_SECONDARY = 0x1 IFA_F_STABLE_PRIVACY = 0x800 IFA_F_TEMPORARY = 0x1 IFA_F_TENTATIVE = 0x40 IFA_MAX = 0x8 IFF_ALLMULTI = 0x200 IFF_ATTACH_QUEUE = 0x200 IFF_AUTOMEDIA = 0x4000 IFF_BROADCAST = 0x2 IFF_DEBUG = 0x4 IFF_DETACH_QUEUE = 0x400 IFF_DORMANT = 0x20000 IFF_DYNAMIC = 0x8000 IFF_ECHO = 0x40000 IFF_LOOPBACK = 0x8 IFF_LOWER_UP = 0x10000 IFF_MASTER = 0x400 IFF_MULTICAST = 0x1000 IFF_MULTI_QUEUE = 0x100 IFF_NOARP = 0x80 IFF_NOFILTER = 0x1000 IFF_NOTRAILERS = 0x20 IFF_NO_PI = 0x1000 IFF_ONE_QUEUE = 0x2000 IFF_PERSIST = 0x800 IFF_POINTOPOINT = 0x10 IFF_PORTSEL = 0x2000 IFF_PROMISC = 0x100 IFF_RUNNING = 0x40 IFF_SLAVE = 0x800 IFF_TAP = 0x2 IFF_TUN = 0x1 IFF_TUN_EXCL = 0x8000 IFF_UP = 0x1 IFF_VNET_HDR = 0x4000 IFF_VOLATILE = 0x70c5a IFNAMSIZ = 0x10 IGNBRK = 0x1 IGNCR = 0x80 IGNPAR = 0x4 IMAXBEL = 0x2000 INLCR = 0x40 INPCK = 0x10 IN_ACCESS = 0x1 IN_ALL_EVENTS = 0xfff IN_ATTRIB = 0x4 IN_CLASSA_HOST = 0xffffff IN_CLASSA_MAX = 0x80 IN_CLASSA_NET = 0xff000000 IN_CLASSA_NSHIFT = 0x18 IN_CLASSB_HOST = 0xffff IN_CLASSB_MAX = 0x10000 IN_CLASSB_NET = 0xffff0000 IN_CLASSB_NSHIFT = 0x10 IN_CLASSC_HOST = 0xff IN_CLASSC_NET = 0xffffff00 IN_CLASSC_NSHIFT = 0x8 IN_CLOEXEC = 0x80000 IN_CLOSE = 0x18 IN_CLOSE_NOWRITE = 0x10 IN_CLOSE_WRITE = 0x8 IN_CREATE = 0x100 IN_DELETE = 0x200 IN_DELETE_SELF = 0x400 IN_DONT_FOLLOW = 0x2000000 IN_EXCL_UNLINK = 0x4000000 IN_IGNORED = 0x8000 IN_ISDIR = 0x40000000 IN_LOOPBACKNET = 0x7f IN_MASK_ADD = 0x20000000 IN_MODIFY = 0x2 IN_MOVE = 0xc0 IN_MOVED_FROM = 0x40 IN_MOVED_TO = 0x80 IN_MOVE_SELF = 0x800 IN_NONBLOCK = 0x80 IN_ONESHOT = 0x80000000 IN_ONLYDIR = 0x1000000 IN_OPEN = 0x20 IN_Q_OVERFLOW = 0x4000 IN_UNMOUNT = 0x2000 IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 IPPROTO_AH = 0x33 IPPROTO_BEETPH = 0x5e IPPROTO_COMP = 0x6c IPPROTO_DCCP = 0x21 IPPROTO_DSTOPTS = 0x3c IPPROTO_EGP = 0x8 IPPROTO_ENCAP = 0x62 IPPROTO_ESP = 0x32 IPPROTO_FRAGMENT = 0x2c IPPROTO_GRE = 0x2f IPPROTO_HOPOPTS = 0x0 IPPROTO_ICMP = 0x1 IPPROTO_ICMPV6 = 0x3a IPPROTO_IDP = 0x16 IPPROTO_IGMP = 0x2 IPPROTO_IP = 0x0 IPPROTO_IPIP = 0x4 IPPROTO_IPV6 = 0x29 IPPROTO_MH = 0x87 IPPROTO_MPLS = 0x89 IPPROTO_MTP = 0x5c IPPROTO_NONE = 0x3b IPPROTO_PIM = 0x67 IPPROTO_PUP = 0xc IPPROTO_RAW = 0xff IPPROTO_ROUTING = 0x2b IPPROTO_RSVP = 0x2e IPPROTO_SCTP = 0x84 IPPROTO_TCP = 0x6 IPPROTO_TP = 0x1d IPPROTO_UDP = 0x11 IPPROTO_UDPLITE = 0x88 IPV6_2292DSTOPTS = 0x4 IPV6_2292HOPLIMIT = 0x8 IPV6_2292HOPOPTS = 0x3 IPV6_2292PKTINFO = 0x2 IPV6_2292PKTOPTIONS = 0x6 IPV6_2292RTHDR = 0x5 IPV6_ADDRFORM = 0x1 IPV6_ADDR_PREFERENCES = 0x48 IPV6_ADD_MEMBERSHIP = 0x14 IPV6_AUTHHDR = 0xa IPV6_AUTOFLOWLABEL = 0x46 IPV6_CHECKSUM = 0x7 IPV6_DONTFRAG = 0x3e IPV6_DROP_MEMBERSHIP = 0x15 IPV6_DSTOPTS = 0x3b IPV6_HDRINCL = 0x24 IPV6_HOPLIMIT = 0x34 IPV6_HOPOPTS = 0x36 IPV6_IPSEC_POLICY = 0x22 IPV6_JOIN_ANYCAST = 0x1b IPV6_JOIN_GROUP = 0x14 IPV6_LEAVE_ANYCAST = 0x1c IPV6_LEAVE_GROUP = 0x15 IPV6_MINHOPCOUNT = 0x49 IPV6_MTU = 0x18 IPV6_MTU_DISCOVER = 0x17 IPV6_MULTICAST_HOPS = 0x12 IPV6_MULTICAST_IF = 0x11 IPV6_MULTICAST_LOOP = 0x13 IPV6_NEXTHOP = 0x9 IPV6_ORIGDSTADDR = 0x4a IPV6_PATHMTU = 0x3d IPV6_PKTINFO = 0x32 IPV6_PMTUDISC_DO = 0x2 IPV6_PMTUDISC_DONT = 0x0 IPV6_PMTUDISC_INTERFACE = 0x4 IPV6_PMTUDISC_OMIT = 0x5 IPV6_PMTUDISC_PROBE = 0x3 IPV6_PMTUDISC_WANT = 0x1 IPV6_RECVDSTOPTS = 0x3a IPV6_RECVERR = 0x19 IPV6_RECVFRAGSIZE = 0x4d IPV6_RECVHOPLIMIT = 0x33 IPV6_RECVHOPOPTS = 0x35 IPV6_RECVORIGDSTADDR = 0x4a IPV6_RECVPATHMTU = 0x3c IPV6_RECVPKTINFO = 0x31 IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 IPV6_RTHDR_STRICT = 0x1 IPV6_RTHDR_TYPE_0 = 0x0 IPV6_RXDSTOPTS = 0x3b IPV6_RXHOPOPTS = 0x36 IPV6_TCLASS = 0x43 IPV6_TRANSPARENT = 0x4b IPV6_UNICAST_HOPS = 0x10 IPV6_UNICAST_IF = 0x4c IPV6_V6ONLY = 0x1a IPV6_XFRM_POLICY = 0x23 IP_ADD_MEMBERSHIP = 0x23 IP_ADD_SOURCE_MEMBERSHIP = 0x27 IP_BIND_ADDRESS_NO_PORT = 0x18 IP_BLOCK_SOURCE = 0x26 IP_CHECKSUM = 0x17 IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 IP_DROP_MEMBERSHIP = 0x24 IP_DROP_SOURCE_MEMBERSHIP = 0x28 IP_FREEBIND = 0xf IP_HDRINCL = 0x3 IP_IPSEC_POLICY = 0x10 IP_MAXPACKET = 0xffff IP_MAX_MEMBERSHIPS = 0x14 IP_MF = 0x2000 IP_MINTTL = 0x15 IP_MSFILTER = 0x29 IP_MSS = 0x240 IP_MTU = 0xe IP_MTU_DISCOVER = 0xa IP_MULTICAST_ALL = 0x31 IP_MULTICAST_IF = 0x20 IP_MULTICAST_LOOP = 0x22 IP_MULTICAST_TTL = 0x21 IP_NODEFRAG = 0x16 IP_OFFMASK = 0x1fff IP_OPTIONS = 0x4 IP_ORIGDSTADDR = 0x14 IP_PASSSEC = 0x12 IP_PKTINFO = 0x8 IP_PKTOPTIONS = 0x9 IP_PMTUDISC = 0xa IP_PMTUDISC_DO = 0x2 IP_PMTUDISC_DONT = 0x0 IP_PMTUDISC_INTERFACE = 0x4 IP_PMTUDISC_OMIT = 0x5 IP_PMTUDISC_PROBE = 0x3 IP_PMTUDISC_WANT = 0x1 IP_RECVERR = 0xb IP_RECVFRAGSIZE = 0x19 IP_RECVOPTS = 0x6 IP_RECVORIGDSTADDR = 0x14 IP_RECVRETOPTS = 0x7 IP_RECVTOS = 0xd IP_RECVTTL = 0xc IP_RETOPTS = 0x7 IP_RF = 0x8000 IP_ROUTER_ALERT = 0x5 IP_TOS = 0x1 IP_TRANSPARENT = 0x13 IP_TTL = 0x2 IP_UNBLOCK_SOURCE = 0x25 IP_UNICAST_IF = 0x32 IP_XFRM_POLICY = 0x11 ISIG = 0x1 ISTRIP = 0x20 IUCLC = 0x200 IUTF8 = 0x4000 IXANY = 0x800 IXOFF = 0x1000 IXON = 0x400 KEYCTL_ASSUME_AUTHORITY = 0x10 KEYCTL_CHOWN = 0x4 KEYCTL_CLEAR = 0x7 KEYCTL_DESCRIBE = 0x6 KEYCTL_DH_COMPUTE = 0x17 KEYCTL_GET_KEYRING_ID = 0x0 KEYCTL_GET_PERSISTENT = 0x16 KEYCTL_GET_SECURITY = 0x11 KEYCTL_INSTANTIATE = 0xc KEYCTL_INSTANTIATE_IOV = 0x14 KEYCTL_INVALIDATE = 0x15 KEYCTL_JOIN_SESSION_KEYRING = 0x1 KEYCTL_LINK = 0x8 KEYCTL_NEGATE = 0xd KEYCTL_READ = 0xb KEYCTL_REJECT = 0x13 KEYCTL_RESTRICT_KEYRING = 0x1d KEYCTL_REVOKE = 0x3 KEYCTL_SEARCH = 0xa KEYCTL_SESSION_TO_PARENT = 0x12 KEYCTL_SETPERM = 0x5 KEYCTL_SET_REQKEY_KEYRING = 0xe KEYCTL_SET_TIMEOUT = 0xf KEYCTL_UNLINK = 0x9 KEYCTL_UPDATE = 0x2 KEY_REQKEY_DEFL_DEFAULT = 0x0 KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 KEY_REQKEY_DEFL_NO_CHANGE = -0x1 KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 KEY_REQKEY_DEFL_USER_KEYRING = 0x4 KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 KEY_SPEC_GROUP_KEYRING = -0x6 KEY_SPEC_PROCESS_KEYRING = -0x2 KEY_SPEC_REQKEY_AUTH_KEY = -0x7 KEY_SPEC_REQUESTOR_KEYRING = -0x8 KEY_SPEC_SESSION_KEYRING = -0x3 KEY_SPEC_THREAD_KEYRING = -0x1 KEY_SPEC_USER_KEYRING = -0x4 KEY_SPEC_USER_SESSION_KEYRING = -0x5 LINUX_REBOOT_CMD_CAD_OFF = 0x0 LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef LINUX_REBOOT_CMD_HALT = 0xcdef0123 LINUX_REBOOT_CMD_KEXEC = 0x45584543 LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc LINUX_REBOOT_CMD_RESTART = 0x1234567 LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 LINUX_REBOOT_MAGIC1 = 0xfee1dead LINUX_REBOOT_MAGIC2 = 0x28121969 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 MADV_DONTFORK = 0xa MADV_DONTNEED = 0x4 MADV_FREE = 0x8 MADV_HUGEPAGE = 0xe MADV_HWPOISON = 0x64 MADV_MERGEABLE = 0xc MADV_NOHUGEPAGE = 0xf MADV_NORMAL = 0x0 MADV_RANDOM = 0x1 MADV_REMOVE = 0x9 MADV_SEQUENTIAL = 0x2 MADV_UNMERGEABLE = 0xd MADV_WILLNEED = 0x3 MAP_ANON = 0x800 MAP_ANONYMOUS = 0x800 MAP_DENYWRITE = 0x2000 MAP_EXECUTABLE = 0x4000 MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_GROWSDOWN = 0x1000 MAP_HUGETLB = 0x80000 MAP_HUGE_MASK = 0x3f MAP_HUGE_SHIFT = 0x1a MAP_LOCKED = 0x8000 MAP_NONBLOCK = 0x20000 MAP_NORESERVE = 0x400 MAP_POPULATE = 0x10000 MAP_PRIVATE = 0x2 MAP_RENAME = 0x800 MAP_SHARED = 0x1 MAP_STACK = 0x40000 MAP_TYPE = 0xf MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MCL_ONFAULT = 0x4 MNT_DETACH = 0x2 MNT_EXPIRE = 0x4 MNT_FORCE = 0x1 MSG_BATCH = 0x40000 MSG_CMSG_CLOEXEC = 0x40000000 MSG_CONFIRM = 0x800 MSG_CTRUNC = 0x8 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x40 MSG_EOR = 0x80 MSG_ERRQUEUE = 0x2000 MSG_FASTOPEN = 0x20000000 MSG_FIN = 0x200 MSG_MORE = 0x8000 MSG_NOSIGNAL = 0x4000 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_PROXY = 0x10 MSG_RST = 0x1000 MSG_SYN = 0x400 MSG_TRUNC = 0x20 MSG_TRYHARD = 0x4 MSG_WAITALL = 0x100 MSG_WAITFORONE = 0x10000 MS_ACTIVE = 0x40000000 MS_ASYNC = 0x1 MS_BIND = 0x1000 MS_BORN = 0x20000000 MS_DIRSYNC = 0x80 MS_INVALIDATE = 0x2 MS_I_VERSION = 0x800000 MS_KERNMOUNT = 0x400000 MS_LAZYTIME = 0x2000000 MS_MANDLOCK = 0x40 MS_MGC_MSK = 0xffff0000 MS_MGC_VAL = 0xc0ed0000 MS_MOVE = 0x2000 MS_NOATIME = 0x400 MS_NODEV = 0x4 MS_NODIRATIME = 0x800 MS_NOEXEC = 0x8 MS_NOREMOTELOCK = 0x8000000 MS_NOSEC = 0x10000000 MS_NOSUID = 0x2 MS_NOUSER = -0x80000000 MS_POSIXACL = 0x10000 MS_PRIVATE = 0x40000 MS_RDONLY = 0x1 MS_REC = 0x4000 MS_RELATIME = 0x200000 MS_REMOUNT = 0x20 MS_RMT_MASK = 0x2800051 MS_SHARED = 0x100000 MS_SILENT = 0x8000 MS_SLAVE = 0x80000 MS_STRICTATIME = 0x1000000 MS_SUBMOUNT = 0x4000000 MS_SYNC = 0x4 MS_SYNCHRONOUS = 0x10 MS_UNBINDABLE = 0x20000 MS_VERBOSE = 0x8000 NAME_MAX = 0xff NETLINK_ADD_MEMBERSHIP = 0x1 NETLINK_AUDIT = 0x9 NETLINK_BROADCAST_ERROR = 0x4 NETLINK_CAP_ACK = 0xa NETLINK_CONNECTOR = 0xb NETLINK_CRYPTO = 0x15 NETLINK_DNRTMSG = 0xe NETLINK_DROP_MEMBERSHIP = 0x2 NETLINK_ECRYPTFS = 0x13 NETLINK_EXT_ACK = 0xb NETLINK_FIB_LOOKUP = 0xa NETLINK_FIREWALL = 0x3 NETLINK_GENERIC = 0x10 NETLINK_INET_DIAG = 0x4 NETLINK_IP6_FW = 0xd NETLINK_ISCSI = 0x8 NETLINK_KOBJECT_UEVENT = 0xf NETLINK_LISTEN_ALL_NSID = 0x8 NETLINK_LIST_MEMBERSHIPS = 0x9 NETLINK_NETFILTER = 0xc NETLINK_NFLOG = 0x5 NETLINK_NO_ENOBUFS = 0x5 NETLINK_PKTINFO = 0x3 NETLINK_RDMA = 0x14 NETLINK_ROUTE = 0x0 NETLINK_RX_RING = 0x6 NETLINK_SCSITRANSPORT = 0x12 NETLINK_SELINUX = 0x7 NETLINK_SMC = 0x16 NETLINK_SOCK_DIAG = 0x4 NETLINK_TX_RING = 0x7 NETLINK_UNUSED = 0x1 NETLINK_USERSOCK = 0x2 NETLINK_XFRM = 0x6 NL0 = 0x0 NL1 = 0x100 NLA_ALIGNTO = 0x4 NLA_F_NESTED = 0x8000 NLA_F_NET_BYTEORDER = 0x4000 NLA_HDRLEN = 0x4 NLDLY = 0x100 NLMSG_ALIGNTO = 0x4 NLMSG_DONE = 0x3 NLMSG_ERROR = 0x2 NLMSG_HDRLEN = 0x10 NLMSG_MIN_TYPE = 0x10 NLMSG_NOOP = 0x1 NLMSG_OVERRUN = 0x4 NLM_F_ACK = 0x4 NLM_F_ACK_TLVS = 0x200 NLM_F_APPEND = 0x800 NLM_F_ATOMIC = 0x400 NLM_F_CAPPED = 0x100 NLM_F_CREATE = 0x400 NLM_F_DUMP = 0x300 NLM_F_DUMP_FILTERED = 0x20 NLM_F_DUMP_INTR = 0x10 NLM_F_ECHO = 0x8 NLM_F_EXCL = 0x200 NLM_F_MATCH = 0x200 NLM_F_MULTI = 0x2 NLM_F_REPLACE = 0x100 NLM_F_REQUEST = 0x1 NLM_F_ROOT = 0x100 NOFLSH = 0x80 OCRNL = 0x8 OFDEL = 0x80 OFILL = 0x40 OLCUC = 0x2 ONLCR = 0x4 ONLRET = 0x20 ONOCR = 0x10 OPOST = 0x1 O_ACCMODE = 0x3 O_APPEND = 0x8 O_ASYNC = 0x1000 O_CLOEXEC = 0x80000 O_CREAT = 0x100 O_DIRECT = 0x8000 O_DIRECTORY = 0x10000 O_DSYNC = 0x10 O_EXCL = 0x400 O_FSYNC = 0x4010 O_LARGEFILE = 0x0 O_NDELAY = 0x80 O_NOATIME = 0x40000 O_NOCTTY = 0x800 O_NOFOLLOW = 0x20000 O_NONBLOCK = 0x80 O_PATH = 0x200000 O_RDONLY = 0x0 O_RDWR = 0x2 O_RSYNC = 0x4010 O_SYNC = 0x4010 O_TMPFILE = 0x410000 O_TRUNC = 0x200 O_WRONLY = 0x1 PACKET_ADD_MEMBERSHIP = 0x1 PACKET_AUXDATA = 0x8 PACKET_BROADCAST = 0x1 PACKET_COPY_THRESH = 0x7 PACKET_DROP_MEMBERSHIP = 0x2 PACKET_FANOUT = 0x12 PACKET_FANOUT_CBPF = 0x6 PACKET_FANOUT_CPU = 0x2 PACKET_FANOUT_DATA = 0x16 PACKET_FANOUT_EBPF = 0x7 PACKET_FANOUT_FLAG_DEFRAG = 0x8000 PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 PACKET_FANOUT_HASH = 0x0 PACKET_FANOUT_LB = 0x1 PACKET_FANOUT_QM = 0x5 PACKET_FANOUT_RND = 0x4 PACKET_FANOUT_ROLLOVER = 0x3 PACKET_FASTROUTE = 0x6 PACKET_HDRLEN = 0xb PACKET_HOST = 0x0 PACKET_KERNEL = 0x7 PACKET_LOOPBACK = 0x5 PACKET_LOSS = 0xe PACKET_MR_ALLMULTI = 0x2 PACKET_MR_MULTICAST = 0x0 PACKET_MR_PROMISC = 0x1 PACKET_MR_UNICAST = 0x3 PACKET_MULTICAST = 0x2 PACKET_ORIGDEV = 0x9 PACKET_OTHERHOST = 0x3 PACKET_OUTGOING = 0x4 PACKET_QDISC_BYPASS = 0x14 PACKET_RECV_OUTPUT = 0x3 PACKET_RESERVE = 0xc PACKET_ROLLOVER_STATS = 0x15 PACKET_RX_RING = 0x5 PACKET_STATISTICS = 0x6 PACKET_TIMESTAMP = 0x11 PACKET_TX_HAS_OFF = 0x13 PACKET_TX_RING = 0xd PACKET_TX_TIMESTAMP = 0x10 PACKET_USER = 0x6 PACKET_VERSION = 0xa PACKET_VNET_HDR = 0xf PARENB = 0x100 PARITY_CRC16_PR0 = 0x2 PARITY_CRC16_PR0_CCITT = 0x4 PARITY_CRC16_PR1 = 0x3 PARITY_CRC16_PR1_CCITT = 0x5 PARITY_CRC32_PR0_CCITT = 0x6 PARITY_CRC32_PR1_CCITT = 0x7 PARITY_DEFAULT = 0x0 PARITY_NONE = 0x1 PARMRK = 0x8 PARODD = 0x200 PENDIN = 0x4000 PERF_EVENT_IOC_DISABLE = 0x20002401 PERF_EVENT_IOC_ENABLE = 0x20002400 PERF_EVENT_IOC_ID = 0x40082407 PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 PERF_EVENT_IOC_PERIOD = 0x80082404 PERF_EVENT_IOC_REFRESH = 0x20002402 PERF_EVENT_IOC_RESET = 0x20002403 PERF_EVENT_IOC_SET_BPF = 0x80042408 PERF_EVENT_IOC_SET_FILTER = 0x80082406 PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 PROT_EXEC = 0x4 PROT_GROWSDOWN = 0x1000000 PROT_GROWSUP = 0x2000000 PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 PR_CAPBSET_DROP = 0x18 PR_CAPBSET_READ = 0x17 PR_CAP_AMBIENT = 0x2f PR_CAP_AMBIENT_CLEAR_ALL = 0x4 PR_CAP_AMBIENT_IS_SET = 0x1 PR_CAP_AMBIENT_LOWER = 0x3 PR_CAP_AMBIENT_RAISE = 0x2 PR_ENDIAN_BIG = 0x0 PR_ENDIAN_LITTLE = 0x1 PR_ENDIAN_PPC_LITTLE = 0x2 PR_FPEMU_NOPRINT = 0x1 PR_FPEMU_SIGFPE = 0x2 PR_FP_EXC_ASYNC = 0x2 PR_FP_EXC_DISABLED = 0x0 PR_FP_EXC_DIV = 0x10000 PR_FP_EXC_INV = 0x100000 PR_FP_EXC_NONRECOV = 0x1 PR_FP_EXC_OVF = 0x20000 PR_FP_EXC_PRECISE = 0x3 PR_FP_EXC_RES = 0x80000 PR_FP_EXC_SW_ENABLE = 0x80 PR_FP_EXC_UND = 0x40000 PR_FP_MODE_FR = 0x1 PR_FP_MODE_FRE = 0x2 PR_GET_CHILD_SUBREAPER = 0x25 PR_GET_DUMPABLE = 0x3 PR_GET_ENDIAN = 0x13 PR_GET_FPEMU = 0x9 PR_GET_FPEXC = 0xb PR_GET_FP_MODE = 0x2e PR_GET_KEEPCAPS = 0x7 PR_GET_NAME = 0x10 PR_GET_NO_NEW_PRIVS = 0x27 PR_GET_PDEATHSIG = 0x2 PR_GET_SECCOMP = 0x15 PR_GET_SECUREBITS = 0x1b PR_GET_THP_DISABLE = 0x2a PR_GET_TID_ADDRESS = 0x28 PR_GET_TIMERSLACK = 0x1e PR_GET_TIMING = 0xd PR_GET_TSC = 0x19 PR_GET_UNALIGN = 0x5 PR_MCE_KILL = 0x21 PR_MCE_KILL_CLEAR = 0x0 PR_MCE_KILL_DEFAULT = 0x2 PR_MCE_KILL_EARLY = 0x1 PR_MCE_KILL_GET = 0x22 PR_MCE_KILL_LATE = 0x0 PR_MCE_KILL_SET = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b PR_SET_CHILD_SUBREAPER = 0x24 PR_SET_DUMPABLE = 0x4 PR_SET_ENDIAN = 0x14 PR_SET_FPEMU = 0xa PR_SET_FPEXC = 0xc PR_SET_FP_MODE = 0x2d PR_SET_KEEPCAPS = 0x8 PR_SET_MM = 0x23 PR_SET_MM_ARG_END = 0x9 PR_SET_MM_ARG_START = 0x8 PR_SET_MM_AUXV = 0xc PR_SET_MM_BRK = 0x7 PR_SET_MM_END_CODE = 0x2 PR_SET_MM_END_DATA = 0x4 PR_SET_MM_ENV_END = 0xb PR_SET_MM_ENV_START = 0xa PR_SET_MM_EXE_FILE = 0xd PR_SET_MM_MAP = 0xe PR_SET_MM_MAP_SIZE = 0xf PR_SET_MM_START_BRK = 0x6 PR_SET_MM_START_CODE = 0x1 PR_SET_MM_START_DATA = 0x3 PR_SET_MM_START_STACK = 0x5 PR_SET_NAME = 0xf PR_SET_NO_NEW_PRIVS = 0x26 PR_SET_PDEATHSIG = 0x1 PR_SET_PTRACER = 0x59616d61 PR_SET_PTRACER_ANY = 0xffffffffffffffff PR_SET_SECCOMP = 0x16 PR_SET_SECUREBITS = 0x1c PR_SET_THP_DISABLE = 0x29 PR_SET_TIMERSLACK = 0x1d PR_SET_TIMING = 0xe PR_SET_TSC = 0x1a PR_SET_UNALIGN = 0x6 PR_TASK_PERF_EVENTS_DISABLE = 0x1f PR_TASK_PERF_EVENTS_ENABLE = 0x20 PR_TIMING_STATISTICAL = 0x0 PR_TIMING_TIMESTAMP = 0x1 PR_TSC_ENABLE = 0x1 PR_TSC_SIGSEGV = 0x2 PR_UNALIGN_NOPRINT = 0x1 PR_UNALIGN_SIGBUS = 0x2 PTRACE_ATTACH = 0x10 PTRACE_CONT = 0x7 PTRACE_DETACH = 0x11 PTRACE_EVENT_CLONE = 0x3 PTRACE_EVENT_EXEC = 0x4 PTRACE_EVENT_EXIT = 0x6 PTRACE_EVENT_FORK = 0x1 PTRACE_EVENT_SECCOMP = 0x7 PTRACE_EVENT_STOP = 0x80 PTRACE_EVENT_VFORK = 0x2 PTRACE_EVENT_VFORK_DONE = 0x5 PTRACE_GETEVENTMSG = 0x4201 PTRACE_GETFPREGS = 0xe PTRACE_GETREGS = 0xc PTRACE_GETREGSET = 0x4204 PTRACE_GETSIGINFO = 0x4202 PTRACE_GETSIGMASK = 0x420a PTRACE_GET_THREAD_AREA = 0x19 PTRACE_GET_THREAD_AREA_3264 = 0xc4 PTRACE_GET_WATCH_REGS = 0xd0 PTRACE_INTERRUPT = 0x4207 PTRACE_KILL = 0x8 PTRACE_LISTEN = 0x4208 PTRACE_OLDSETOPTIONS = 0x15 PTRACE_O_EXITKILL = 0x100000 PTRACE_O_MASK = 0x3000ff PTRACE_O_SUSPEND_SECCOMP = 0x200000 PTRACE_O_TRACECLONE = 0x8 PTRACE_O_TRACEEXEC = 0x10 PTRACE_O_TRACEEXIT = 0x40 PTRACE_O_TRACEFORK = 0x2 PTRACE_O_TRACESECCOMP = 0x80 PTRACE_O_TRACESYSGOOD = 0x1 PTRACE_O_TRACEVFORK = 0x4 PTRACE_O_TRACEVFORKDONE = 0x20 PTRACE_PEEKDATA = 0x2 PTRACE_PEEKDATA_3264 = 0xc1 PTRACE_PEEKSIGINFO = 0x4209 PTRACE_PEEKSIGINFO_SHARED = 0x1 PTRACE_PEEKTEXT = 0x1 PTRACE_PEEKTEXT_3264 = 0xc0 PTRACE_PEEKUSR = 0x3 PTRACE_POKEDATA = 0x5 PTRACE_POKEDATA_3264 = 0xc3 PTRACE_POKETEXT = 0x4 PTRACE_POKETEXT_3264 = 0xc2 PTRACE_POKEUSR = 0x6 PTRACE_SECCOMP_GET_FILTER = 0x420c PTRACE_SEIZE = 0x4206 PTRACE_SETFPREGS = 0xf PTRACE_SETOPTIONS = 0x4200 PTRACE_SETREGS = 0xd PTRACE_SETREGSET = 0x4205 PTRACE_SETSIGINFO = 0x4203 PTRACE_SETSIGMASK = 0x420b PTRACE_SET_THREAD_AREA = 0x1a PTRACE_SET_WATCH_REGS = 0xd1 PTRACE_SINGLESTEP = 0x9 PTRACE_SYSCALL = 0x18 PTRACE_TRACEME = 0x0 RLIMIT_AS = 0x6 RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 RLIMIT_LOCKS = 0xa RLIMIT_MEMLOCK = 0x9 RLIMIT_MSGQUEUE = 0xc RLIMIT_NICE = 0xd RLIMIT_NOFILE = 0x5 RLIMIT_NPROC = 0x8 RLIMIT_RSS = 0x7 RLIMIT_RTPRIO = 0xe RLIMIT_RTTIME = 0xf RLIMIT_SIGPENDING = 0xb RLIMIT_STACK = 0x3 RLIM_INFINITY = 0xffffffffffffffff RTAX_ADVMSS = 0x8 RTAX_CC_ALGO = 0x10 RTAX_CWND = 0x7 RTAX_FEATURES = 0xc RTAX_FEATURE_ALLFRAG = 0x8 RTAX_FEATURE_ECN = 0x1 RTAX_FEATURE_MASK = 0xf RTAX_FEATURE_SACK = 0x2 RTAX_FEATURE_TIMESTAMP = 0x4 RTAX_HOPLIMIT = 0xa RTAX_INITCWND = 0xb RTAX_INITRWND = 0xe RTAX_LOCK = 0x1 RTAX_MAX = 0x10 RTAX_MTU = 0x2 RTAX_QUICKACK = 0xf RTAX_REORDERING = 0x9 RTAX_RTO_MIN = 0xd RTAX_RTT = 0x4 RTAX_RTTVAR = 0x5 RTAX_SSTHRESH = 0x6 RTAX_UNSPEC = 0x0 RTAX_WINDOW = 0x3 RTA_ALIGNTO = 0x4 RTA_MAX = 0x1a RTCF_DIRECTSRC = 0x4000000 RTCF_DOREDIRECT = 0x1000000 RTCF_LOG = 0x2000000 RTCF_MASQ = 0x400000 RTCF_NAT = 0x800000 RTCF_VALVE = 0x200000 RTF_ADDRCLASSMASK = 0xf8000000 RTF_ADDRCONF = 0x40000 RTF_ALLONLINK = 0x20000 RTF_BROADCAST = 0x10000000 RTF_CACHE = 0x1000000 RTF_DEFAULT = 0x10000 RTF_DYNAMIC = 0x10 RTF_FLOW = 0x2000000 RTF_GATEWAY = 0x2 RTF_HOST = 0x4 RTF_INTERFACE = 0x40000000 RTF_IRTT = 0x100 RTF_LINKRT = 0x100000 RTF_LOCAL = 0x80000000 RTF_MODIFIED = 0x20 RTF_MSS = 0x40 RTF_MTU = 0x40 RTF_MULTICAST = 0x20000000 RTF_NAT = 0x8000000 RTF_NOFORWARD = 0x1000 RTF_NONEXTHOP = 0x200000 RTF_NOPMTUDISC = 0x4000 RTF_POLICY = 0x4000000 RTF_REINSTATE = 0x8 RTF_REJECT = 0x200 RTF_STATIC = 0x400 RTF_THROW = 0x2000 RTF_UP = 0x1 RTF_WINDOW = 0x80 RTF_XRESOLVE = 0x800 RTM_BASE = 0x10 RTM_DELACTION = 0x31 RTM_DELADDR = 0x15 RTM_DELADDRLABEL = 0x49 RTM_DELLINK = 0x11 RTM_DELMDB = 0x55 RTM_DELNEIGH = 0x1d RTM_DELNETCONF = 0x51 RTM_DELNSID = 0x59 RTM_DELQDISC = 0x25 RTM_DELROUTE = 0x19 RTM_DELRULE = 0x21 RTM_DELTCLASS = 0x29 RTM_DELTFILTER = 0x2d RTM_F_CLONED = 0x200 RTM_F_EQUALIZE = 0x400 RTM_F_FIB_MATCH = 0x2000 RTM_F_LOOKUP_TABLE = 0x1000 RTM_F_NOTIFY = 0x100 RTM_F_PREFIX = 0x800 RTM_GETACTION = 0x32 RTM_GETADDR = 0x16 RTM_GETADDRLABEL = 0x4a RTM_GETANYCAST = 0x3e RTM_GETDCB = 0x4e RTM_GETLINK = 0x12 RTM_GETMDB = 0x56 RTM_GETMULTICAST = 0x3a RTM_GETNEIGH = 0x1e RTM_GETNEIGHTBL = 0x42 RTM_GETNETCONF = 0x52 RTM_GETNSID = 0x5a RTM_GETQDISC = 0x26 RTM_GETROUTE = 0x1a RTM_GETRULE = 0x22 RTM_GETSTATS = 0x5e RTM_GETTCLASS = 0x2a RTM_GETTFILTER = 0x2e RTM_MAX = 0x63 RTM_NEWACTION = 0x30 RTM_NEWADDR = 0x14 RTM_NEWADDRLABEL = 0x48 RTM_NEWCACHEREPORT = 0x60 RTM_NEWLINK = 0x10 RTM_NEWMDB = 0x54 RTM_NEWNDUSEROPT = 0x44 RTM_NEWNEIGH = 0x1c RTM_NEWNEIGHTBL = 0x40 RTM_NEWNETCONF = 0x50 RTM_NEWNSID = 0x58 RTM_NEWPREFIX = 0x34 RTM_NEWQDISC = 0x24 RTM_NEWROUTE = 0x18 RTM_NEWRULE = 0x20 RTM_NEWSTATS = 0x5c RTM_NEWTCLASS = 0x28 RTM_NEWTFILTER = 0x2c RTM_NR_FAMILIES = 0x15 RTM_NR_MSGTYPES = 0x54 RTM_SETDCB = 0x4f RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 RTNH_ALIGNTO = 0x4 RTNH_COMPARE_MASK = 0x19 RTNH_F_DEAD = 0x1 RTNH_F_LINKDOWN = 0x10 RTNH_F_OFFLOAD = 0x8 RTNH_F_ONLINK = 0x4 RTNH_F_PERVASIVE = 0x2 RTNH_F_UNRESOLVED = 0x20 RTN_MAX = 0xb RTPROT_BABEL = 0x2a RTPROT_BIRD = 0xc RTPROT_BOOT = 0x3 RTPROT_DHCP = 0x10 RTPROT_DNROUTED = 0xd RTPROT_GATED = 0x8 RTPROT_KERNEL = 0x2 RTPROT_MROUTED = 0x11 RTPROT_MRT = 0xa RTPROT_NTK = 0xf RTPROT_RA = 0x9 RTPROT_REDIRECT = 0x1 RTPROT_STATIC = 0x4 RTPROT_UNSPEC = 0x0 RTPROT_XORP = 0xe RTPROT_ZEBRA = 0xb RT_CLASS_DEFAULT = 0xfd RT_CLASS_LOCAL = 0xff RT_CLASS_MAIN = 0xfe RT_CLASS_MAX = 0xff RT_CLASS_UNSPEC = 0x0 RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 RUSAGE_THREAD = 0x1 SCM_CREDENTIALS = 0x2 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x1d SCM_TIMESTAMPING = 0x25 SCM_TIMESTAMPING_OPT_STATS = 0x36 SCM_TIMESTAMPING_PKTINFO = 0x3a SCM_TIMESTAMPNS = 0x23 SCM_WIFI_STATUS = 0x29 SECCOMP_MODE_DISABLED = 0x0 SECCOMP_MODE_FILTER = 0x2 SECCOMP_MODE_STRICT = 0x1 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 SIOCADDDLCI = 0x8980 SIOCADDMULTI = 0x8931 SIOCADDRT = 0x890b SIOCATMARK = 0x40047307 SIOCBONDCHANGEACTIVE = 0x8995 SIOCBONDENSLAVE = 0x8990 SIOCBONDINFOQUERY = 0x8994 SIOCBONDRELEASE = 0x8991 SIOCBONDSETHWADDR = 0x8992 SIOCBONDSLAVEINFOQUERY = 0x8993 SIOCBRADDBR = 0x89a0 SIOCBRADDIF = 0x89a2 SIOCBRDELBR = 0x89a1 SIOCBRDELIF = 0x89a3 SIOCDARP = 0x8953 SIOCDELDLCI = 0x8981 SIOCDELMULTI = 0x8932 SIOCDELRT = 0x890c SIOCDEVPRIVATE = 0x89f0 SIOCDIFADDR = 0x8936 SIOCDRARP = 0x8960 SIOCETHTOOL = 0x8946 SIOCGARP = 0x8954 SIOCGHWTSTAMP = 0x89b1 SIOCGIFADDR = 0x8915 SIOCGIFBR = 0x8940 SIOCGIFBRDADDR = 0x8919 SIOCGIFCONF = 0x8912 SIOCGIFCOUNT = 0x8938 SIOCGIFDSTADDR = 0x8917 SIOCGIFENCAP = 0x8925 SIOCGIFFLAGS = 0x8913 SIOCGIFHWADDR = 0x8927 SIOCGIFINDEX = 0x8933 SIOCGIFMAP = 0x8970 SIOCGIFMEM = 0x891f SIOCGIFMETRIC = 0x891d SIOCGIFMTU = 0x8921 SIOCGIFNAME = 0x8910 SIOCGIFNETMASK = 0x891b SIOCGIFPFLAGS = 0x8935 SIOCGIFSLAVE = 0x8929 SIOCGIFTXQLEN = 0x8942 SIOCGIFVLAN = 0x8982 SIOCGMIIPHY = 0x8947 SIOCGMIIREG = 0x8948 SIOCGPGRP = 0x40047309 SIOCGRARP = 0x8961 SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 SIOCGSTAMPNS = 0x8907 SIOCINQ = 0x467f SIOCOUTQ = 0x7472 SIOCOUTQNSD = 0x894b SIOCPROTOPRIVATE = 0x89e0 SIOCRTMSG = 0x890d SIOCSARP = 0x8955 SIOCSHWTSTAMP = 0x89b0 SIOCSIFADDR = 0x8916 SIOCSIFBR = 0x8941 SIOCSIFBRDADDR = 0x891a SIOCSIFDSTADDR = 0x8918 SIOCSIFENCAP = 0x8926 SIOCSIFFLAGS = 0x8914 SIOCSIFHWADDR = 0x8924 SIOCSIFHWBROADCAST = 0x8937 SIOCSIFLINK = 0x8911 SIOCSIFMAP = 0x8971 SIOCSIFMEM = 0x8920 SIOCSIFMETRIC = 0x891e SIOCSIFMTU = 0x8922 SIOCSIFNAME = 0x8923 SIOCSIFNETMASK = 0x891c SIOCSIFPFLAGS = 0x8934 SIOCSIFSLAVE = 0x8930 SIOCSIFTXQLEN = 0x8943 SIOCSIFVLAN = 0x8983 SIOCSMIIREG = 0x8949 SIOCSPGRP = 0x80047308 SIOCSRARP = 0x8962 SIOCWANDEV = 0x894a SOCK_CLOEXEC = 0x80000 SOCK_DCCP = 0x6 SOCK_DGRAM = 0x1 SOCK_IOC_TYPE = 0x89 SOCK_NONBLOCK = 0x80 SOCK_PACKET = 0xa SOCK_RAW = 0x3 SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x2 SOL_AAL = 0x109 SOL_ALG = 0x117 SOL_ATM = 0x108 SOL_CAIF = 0x116 SOL_CAN_BASE = 0x64 SOL_DCCP = 0x10d SOL_DECNET = 0x105 SOL_ICMPV6 = 0x3a SOL_IP = 0x0 SOL_IPV6 = 0x29 SOL_IRDA = 0x10a SOL_IUCV = 0x115 SOL_KCM = 0x119 SOL_LLC = 0x10c SOL_NETBEUI = 0x10b SOL_NETLINK = 0x10e SOL_NFC = 0x118 SOL_PACKET = 0x107 SOL_PNPIPE = 0x113 SOL_PPPOL2TP = 0x111 SOL_RAW = 0xff SOL_RDS = 0x114 SOL_RXRPC = 0x110 SOL_SOCKET = 0xffff SOL_TCP = 0x6 SOL_TIPC = 0x10f SOL_X25 = 0x106 SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x1009 SO_ATTACH_BPF = 0x32 SO_ATTACH_FILTER = 0x1a SO_ATTACH_REUSEPORT_CBPF = 0x33 SO_ATTACH_REUSEPORT_EBPF = 0x34 SO_BINDTODEVICE = 0x19 SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x20 SO_BSDCOMPAT = 0xe SO_BUSY_POLL = 0x2e SO_CNX_ADVICE = 0x35 SO_COOKIE = 0x39 SO_DEBUG = 0x1 SO_DETACH_BPF = 0x1b SO_DETACH_FILTER = 0x1b SO_DOMAIN = 0x1029 SO_DONTROUTE = 0x10 SO_ERROR = 0x1007 SO_GET_FILTER = 0x1a SO_INCOMING_CPU = 0x31 SO_INCOMING_NAPI_ID = 0x38 SO_KEEPALIVE = 0x8 SO_LINGER = 0x80 SO_LOCK_FILTER = 0x2c SO_MARK = 0x24 SO_MAX_PACING_RATE = 0x2f SO_MEMINFO = 0x37 SO_NOFCS = 0x2b SO_NO_CHECK = 0xb SO_OOBINLINE = 0x100 SO_PASSCRED = 0x11 SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x12 SO_PEERGROUPS = 0x3b SO_PEERNAME = 0x1c SO_PEERSEC = 0x1e SO_PRIORITY = 0xc SO_PROTOCOL = 0x1028 SO_RCVBUF = 0x1002 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x1006 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_RXQ_OVFL = 0x28 SO_SECURITY_AUTHENTICATION = 0x16 SO_SECURITY_ENCRYPTION_NETWORK = 0x18 SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 SO_SELECT_ERR_QUEUE = 0x2d SO_SNDBUF = 0x1001 SO_SNDBUFFORCE = 0x1f SO_SNDLOWAT = 0x1003 SO_SNDTIMEO = 0x1005 SO_STYLE = 0x1008 SO_TIMESTAMP = 0x1d SO_TIMESTAMPING = 0x25 SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x1008 SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 SO_VM_SOCKETS_BUFFER_SIZE = 0x0 SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 SO_VM_SOCKETS_TRUSTED = 0x5 SO_WIFI_STATUS = 0x29 SPLICE_F_GIFT = 0x8 SPLICE_F_MORE = 0x4 SPLICE_F_MOVE = 0x1 SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000 S_IFCHR = 0x2000 S_IFDIR = 0x4000 S_IFIFO = 0x1000 S_IFLNK = 0xa000 S_IFMT = 0xf000 S_IFREG = 0x8000 S_IFSOCK = 0xc000 S_IREAD = 0x100 S_IRGRP = 0x20 S_IROTH = 0x4 S_IRUSR = 0x100 S_IRWXG = 0x38 S_IRWXO = 0x7 S_IRWXU = 0x1c0 S_ISGID = 0x400 S_ISUID = 0x800 S_ISVTX = 0x200 S_IWGRP = 0x10 S_IWOTH = 0x2 S_IWRITE = 0x80 S_IWUSR = 0x80 S_IXGRP = 0x8 S_IXOTH = 0x1 S_IXUSR = 0x40 TAB0 = 0x0 TAB1 = 0x800 TAB2 = 0x1000 TAB3 = 0x1800 TABDLY = 0x1800 TASKSTATS_CMD_ATTR_MAX = 0x4 TASKSTATS_CMD_MAX = 0x2 TASKSTATS_GENL_NAME = "TASKSTATS" TASKSTATS_GENL_VERSION = 0x1 TASKSTATS_TYPE_MAX = 0x6 TASKSTATS_VERSION = 0x8 TCFLSH = 0x5407 TCGETA = 0x5401 TCGETS = 0x540d TCGETS2 = 0x4030542a TCIFLUSH = 0x0 TCIOFF = 0x2 TCIOFLUSH = 0x2 TCION = 0x3 TCOFLUSH = 0x1 TCOOFF = 0x0 TCOON = 0x1 TCP_CC_INFO = 0x1a TCP_CONGESTION = 0xd TCP_COOKIE_IN_ALWAYS = 0x1 TCP_COOKIE_MAX = 0x10 TCP_COOKIE_MIN = 0x8 TCP_COOKIE_OUT_NEVER = 0x2 TCP_COOKIE_PAIR_SIZE = 0x20 TCP_COOKIE_TRANSACTIONS = 0xf TCP_CORK = 0x3 TCP_DEFER_ACCEPT = 0x9 TCP_FASTOPEN = 0x17 TCP_FASTOPEN_CONNECT = 0x1e TCP_INFO = 0xb TCP_KEEPCNT = 0x6 TCP_KEEPIDLE = 0x4 TCP_KEEPINTVL = 0x5 TCP_LINGER2 = 0x8 TCP_MAXSEG = 0x2 TCP_MAXWIN = 0xffff TCP_MAX_WINSHIFT = 0xe TCP_MD5SIG = 0xe TCP_MD5SIG_MAXKEYLEN = 0x50 TCP_MSS = 0x200 TCP_MSS_DEFAULT = 0x218 TCP_MSS_DESIRED = 0x4c4 TCP_NODELAY = 0x1 TCP_NOTSENT_LOWAT = 0x19 TCP_QUEUE_SEQ = 0x15 TCP_QUICKACK = 0xc TCP_REPAIR = 0x13 TCP_REPAIR_OPTIONS = 0x16 TCP_REPAIR_QUEUE = 0x14 TCP_REPAIR_WINDOW = 0x1d TCP_SAVED_SYN = 0x1c TCP_SAVE_SYN = 0x1b TCP_SYNCNT = 0x7 TCP_S_DATA_IN = 0x4 TCP_S_DATA_OUT = 0x8 TCP_THIN_DUPACK = 0x11 TCP_THIN_LINEAR_TIMEOUTS = 0x10 TCP_TIMESTAMP = 0x18 TCP_USER_TIMEOUT = 0x12 TCP_WINDOW_CLAMP = 0xa TCSAFLUSH = 0x5410 TCSBRK = 0x5405 TCSBRKP = 0x5486 TCSETA = 0x5402 TCSETAF = 0x5404 TCSETAW = 0x5403 TCSETS = 0x540e TCSETS2 = 0x8030542b TCSETSF = 0x5410 TCSETSF2 = 0x8030542d TCSETSW = 0x540f TCSETSW2 = 0x8030542c TCXONC = 0x5406 TIOCCBRK = 0x5428 TIOCCONS = 0x80047478 TIOCEXCL = 0x740d TIOCGDEV = 0x40045432 TIOCGETD = 0x7400 TIOCGETP = 0x7408 TIOCGEXCL = 0x40045440 TIOCGICOUNT = 0x5492 TIOCGLCKTRMIOS = 0x548b TIOCGLTC = 0x7474 TIOCGPGRP = 0x40047477 TIOCGPKT = 0x40045438 TIOCGPTLCK = 0x40045439 TIOCGPTN = 0x40045430 TIOCGPTPEER = 0x20005441 TIOCGRS485 = 0x4020542e TIOCGSERIAL = 0x5484 TIOCGSID = 0x7416 TIOCGSOFTCAR = 0x5481 TIOCGWINSZ = 0x40087468 TIOCINQ = 0x467f TIOCLINUX = 0x5483 TIOCMBIC = 0x741c TIOCMBIS = 0x741b TIOCMGET = 0x741d TIOCMIWAIT = 0x5491 TIOCMSET = 0x741a TIOCM_CAR = 0x100 TIOCM_CD = 0x100 TIOCM_CTS = 0x40 TIOCM_DSR = 0x400 TIOCM_DTR = 0x2 TIOCM_LE = 0x1 TIOCM_RI = 0x200 TIOCM_RNG = 0x200 TIOCM_RTS = 0x4 TIOCM_SR = 0x20 TIOCM_ST = 0x10 TIOCNOTTY = 0x5471 TIOCNXCL = 0x740e TIOCOUTQ = 0x7472 TIOCPKT = 0x5470 TIOCPKT_DATA = 0x0 TIOCPKT_DOSTOP = 0x20 TIOCPKT_FLUSHREAD = 0x1 TIOCPKT_FLUSHWRITE = 0x2 TIOCPKT_IOCTL = 0x40 TIOCPKT_NOSTOP = 0x10 TIOCPKT_START = 0x8 TIOCPKT_STOP = 0x4 TIOCSBRK = 0x5427 TIOCSCTTY = 0x5480 TIOCSERCONFIG = 0x5488 TIOCSERGETLSR = 0x548e TIOCSERGETMULTI = 0x548f TIOCSERGSTRUCT = 0x548d TIOCSERGWILD = 0x5489 TIOCSERSETMULTI = 0x5490 TIOCSERSWILD = 0x548a TIOCSER_TEMT = 0x1 TIOCSETD = 0x7401 TIOCSETN = 0x740a TIOCSETP = 0x7409 TIOCSIG = 0x80045436 TIOCSLCKTRMIOS = 0x548c TIOCSLTC = 0x7475 TIOCSPGRP = 0x80047476 TIOCSPTLCK = 0x80045431 TIOCSRS485 = 0xc020542f TIOCSSERIAL = 0x5485 TIOCSSOFTCAR = 0x5482 TIOCSTI = 0x5472 TIOCSWINSZ = 0x80087467 TIOCVHANGUP = 0x5437 TOSTOP = 0x8000 TS_COMM_LEN = 0x20 TUNATTACHFILTER = 0x801054d5 TUNDETACHFILTER = 0x801054d6 TUNGETFEATURES = 0x400454cf TUNGETFILTER = 0x401054db TUNGETIFF = 0x400454d2 TUNGETSNDBUF = 0x400454d3 TUNGETVNETBE = 0x400454df TUNGETVNETHDRSZ = 0x400454d7 TUNGETVNETLE = 0x400454dd TUNSETDEBUG = 0x800454c9 TUNSETGROUP = 0x800454ce TUNSETIFF = 0x800454ca TUNSETIFINDEX = 0x800454da TUNSETLINK = 0x800454cd TUNSETNOCSUM = 0x800454c8 TUNSETOFFLOAD = 0x800454d0 TUNSETOWNER = 0x800454cc TUNSETPERSIST = 0x800454cb TUNSETQUEUE = 0x800454d9 TUNSETSNDBUF = 0x800454d4 TUNSETTXFILTER = 0x800454d1 TUNSETVNETBE = 0x800454de TUNSETVNETHDRSZ = 0x800454d8 TUNSETVNETLE = 0x800454dc UMOUNT_NOFOLLOW = 0x8 UTIME_NOW = 0x3fffffff UTIME_OMIT = 0x3ffffffe VDISCARD = 0xd VEOF = 0x10 VEOL = 0x11 VEOL2 = 0x6 VERASE = 0x2 VINTR = 0x0 VKILL = 0x3 VLNEXT = 0xf VMADDR_CID_ANY = 0xffffffff VMADDR_CID_HOST = 0x2 VMADDR_CID_HYPERVISOR = 0x0 VMADDR_CID_RESERVED = 0x1 VMADDR_PORT_ANY = 0xffffffff VMIN = 0x4 VM_SOCKETS_INVALID_VERSION = 0xffffffff VQUIT = 0x1 VREPRINT = 0xc VSTART = 0x8 VSTOP = 0x9 VSUSP = 0xa VSWTC = 0x7 VSWTCH = 0x7 VT0 = 0x0 VT1 = 0x4000 VTDLY = 0x4000 VTIME = 0x5 VWERASE = 0xe WALL = 0x40000000 WCLONE = 0x80000000 WCONTINUED = 0x8 WDIOC_GETBOOTSTATUS = 0x40045702 WDIOC_GETPRETIMEOUT = 0x40045709 WDIOC_GETSTATUS = 0x40045701 WDIOC_GETSUPPORT = 0x40285700 WDIOC_GETTEMP = 0x40045703 WDIOC_GETTIMELEFT = 0x4004570a WDIOC_GETTIMEOUT = 0x40045707 WDIOC_KEEPALIVE = 0x40045705 WDIOC_SETOPTIONS = 0x40045704 WDIOC_SETPRETIMEOUT = 0xc0045708 WDIOC_SETTIMEOUT = 0xc0045706 WEXITED = 0x4 WNOHANG = 0x1 WNOTHREAD = 0x20000000 WNOWAIT = 0x1000000 WORDSIZE = 0x40 WSTOPPED = 0x2 WUNTRACED = 0x2 XATTR_CREATE = 0x1 XATTR_REPLACE = 0x2 XCASE = 0x4 XTABS = 0x1800 ) // Errors const ( E2BIG = syscall.Errno(0x7) EACCES = syscall.Errno(0xd) EADDRINUSE = syscall.Errno(0x7d) EADDRNOTAVAIL = syscall.Errno(0x7e) EADV = syscall.Errno(0x44) EAFNOSUPPORT = syscall.Errno(0x7c) EAGAIN = syscall.Errno(0xb) EALREADY = syscall.Errno(0x95) EBADE = syscall.Errno(0x32) EBADF = syscall.Errno(0x9) EBADFD = syscall.Errno(0x51) EBADMSG = syscall.Errno(0x4d) EBADR = syscall.Errno(0x33) EBADRQC = syscall.Errno(0x36) EBADSLT = syscall.Errno(0x37) EBFONT = syscall.Errno(0x3b) EBUSY = syscall.Errno(0x10) ECANCELED = syscall.Errno(0x9e) ECHILD = syscall.Errno(0xa) ECHRNG = syscall.Errno(0x25) ECOMM = syscall.Errno(0x46) ECONNABORTED = syscall.Errno(0x82) ECONNREFUSED = syscall.Errno(0x92) ECONNRESET = syscall.Errno(0x83) EDEADLK = syscall.Errno(0x2d) EDEADLOCK = syscall.Errno(0x38) EDESTADDRREQ = syscall.Errno(0x60) EDOM = syscall.Errno(0x21) EDOTDOT = syscall.Errno(0x49) EDQUOT = syscall.Errno(0x46d) EEXIST = syscall.Errno(0x11) EFAULT = syscall.Errno(0xe) EFBIG = syscall.Errno(0x1b) EHOSTDOWN = syscall.Errno(0x93) EHOSTUNREACH = syscall.Errno(0x94) EHWPOISON = syscall.Errno(0xa8) EIDRM = syscall.Errno(0x24) EILSEQ = syscall.Errno(0x58) EINIT = syscall.Errno(0x8d) EINPROGRESS = syscall.Errno(0x96) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x85) EISDIR = syscall.Errno(0x15) EISNAM = syscall.Errno(0x8b) EKEYEXPIRED = syscall.Errno(0xa2) EKEYREJECTED = syscall.Errno(0xa4) EKEYREVOKED = syscall.Errno(0xa3) EL2HLT = syscall.Errno(0x2c) EL2NSYNC = syscall.Errno(0x26) EL3HLT = syscall.Errno(0x27) EL3RST = syscall.Errno(0x28) ELIBACC = syscall.Errno(0x53) ELIBBAD = syscall.Errno(0x54) ELIBEXEC = syscall.Errno(0x57) ELIBMAX = syscall.Errno(0x56) ELIBSCN = syscall.Errno(0x55) ELNRNG = syscall.Errno(0x29) ELOOP = syscall.Errno(0x5a) EMEDIUMTYPE = syscall.Errno(0xa0) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) EMSGSIZE = syscall.Errno(0x61) EMULTIHOP = syscall.Errno(0x4a) ENAMETOOLONG = syscall.Errno(0x4e) ENAVAIL = syscall.Errno(0x8a) ENETDOWN = syscall.Errno(0x7f) ENETRESET = syscall.Errno(0x81) ENETUNREACH = syscall.Errno(0x80) ENFILE = syscall.Errno(0x17) ENOANO = syscall.Errno(0x35) ENOBUFS = syscall.Errno(0x84) ENOCSI = syscall.Errno(0x2b) ENODATA = syscall.Errno(0x3d) ENODEV = syscall.Errno(0x13) ENOENT = syscall.Errno(0x2) ENOEXEC = syscall.Errno(0x8) ENOKEY = syscall.Errno(0xa1) ENOLCK = syscall.Errno(0x2e) ENOLINK = syscall.Errno(0x43) ENOMEDIUM = syscall.Errno(0x9f) ENOMEM = syscall.Errno(0xc) ENOMSG = syscall.Errno(0x23) ENONET = syscall.Errno(0x40) ENOPKG = syscall.Errno(0x41) ENOPROTOOPT = syscall.Errno(0x63) ENOSPC = syscall.Errno(0x1c) ENOSR = syscall.Errno(0x3f) ENOSTR = syscall.Errno(0x3c) ENOSYS = syscall.Errno(0x59) ENOTBLK = syscall.Errno(0xf) ENOTCONN = syscall.Errno(0x86) ENOTDIR = syscall.Errno(0x14) ENOTEMPTY = syscall.Errno(0x5d) ENOTNAM = syscall.Errno(0x89) ENOTRECOVERABLE = syscall.Errno(0xa6) ENOTSOCK = syscall.Errno(0x5f) ENOTSUP = syscall.Errno(0x7a) ENOTTY = syscall.Errno(0x19) ENOTUNIQ = syscall.Errno(0x50) ENXIO = syscall.Errno(0x6) EOPNOTSUPP = syscall.Errno(0x7a) EOVERFLOW = syscall.Errno(0x4f) EOWNERDEAD = syscall.Errno(0xa5) EPERM = syscall.Errno(0x1) EPFNOSUPPORT = syscall.Errno(0x7b) EPIPE = syscall.Errno(0x20) EPROTO = syscall.Errno(0x47) EPROTONOSUPPORT = syscall.Errno(0x78) EPROTOTYPE = syscall.Errno(0x62) ERANGE = syscall.Errno(0x22) EREMCHG = syscall.Errno(0x52) EREMDEV = syscall.Errno(0x8e) EREMOTE = syscall.Errno(0x42) EREMOTEIO = syscall.Errno(0x8c) ERESTART = syscall.Errno(0x5b) ERFKILL = syscall.Errno(0xa7) EROFS = syscall.Errno(0x1e) ESHUTDOWN = syscall.Errno(0x8f) ESOCKTNOSUPPORT = syscall.Errno(0x79) ESPIPE = syscall.Errno(0x1d) ESRCH = syscall.Errno(0x3) ESRMNT = syscall.Errno(0x45) ESTALE = syscall.Errno(0x97) ESTRPIPE = syscall.Errno(0x5c) ETIME = syscall.Errno(0x3e) ETIMEDOUT = syscall.Errno(0x91) ETOOMANYREFS = syscall.Errno(0x90) ETXTBSY = syscall.Errno(0x1a) EUCLEAN = syscall.Errno(0x87) EUNATCH = syscall.Errno(0x2a) EUSERS = syscall.Errno(0x5e) EWOULDBLOCK = syscall.Errno(0xb) EXDEV = syscall.Errno(0x12) EXFULL = syscall.Errno(0x34) ) // Signals const ( SIGABRT = syscall.Signal(0x6) SIGALRM = syscall.Signal(0xe) SIGBUS = syscall.Signal(0xa) SIGCHLD = syscall.Signal(0x12) SIGCLD = syscall.Signal(0x12) SIGCONT = syscall.Signal(0x19) SIGEMT = syscall.Signal(0x7) SIGFPE = syscall.Signal(0x8) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x16) SIGIOT = syscall.Signal(0x6) SIGKILL = syscall.Signal(0x9) SIGPIPE = syscall.Signal(0xd) SIGPOLL = syscall.Signal(0x16) SIGPROF = syscall.Signal(0x1d) SIGPWR = syscall.Signal(0x13) SIGQUIT = syscall.Signal(0x3) SIGSEGV = syscall.Signal(0xb) SIGSTOP = syscall.Signal(0x17) SIGSYS = syscall.Signal(0xc) SIGTERM = syscall.Signal(0xf) SIGTRAP = syscall.Signal(0x5) SIGTSTP = syscall.Signal(0x18) SIGTTIN = syscall.Signal(0x1a) SIGTTOU = syscall.Signal(0x1b) SIGURG = syscall.Signal(0x15) SIGUSR1 = syscall.Signal(0x10) SIGUSR2 = syscall.Signal(0x11) SIGVTALRM = syscall.Signal(0x1c) SIGWINCH = syscall.Signal(0x14) SIGXCPU = syscall.Signal(0x1e) SIGXFSZ = syscall.Signal(0x1f) ) // Error table var errors = [...]string{ 1: "operation not permitted", 2: "no such file or directory", 3: "no such process", 4: "interrupted system call", 5: "input/output error", 6: "no such device or address", 7: "argument list too long", 8: "exec format error", 9: "bad file descriptor", 10: "no child processes", 11: "resource temporarily unavailable", 12: "cannot allocate memory", 13: "permission denied", 14: "bad address", 15: "block device required", 16: "device or resource busy", 17: "file exists", 18: "invalid cross-device link", 19: "no such device", 20: "not a directory", 21: "is a directory", 22: "invalid argument", 23: "too many open files in system", 24: "too many open files", 25: "inappropriate ioctl for device", 26: "text file busy", 27: "file too large", 28: "no space left on device", 29: "illegal seek", 30: "read-only file system", 31: "too many links", 32: "broken pipe", 33: "numerical argument out of domain", 34: "numerical result out of range", 35: "no message of desired type", 36: "identifier removed", 37: "channel number out of range", 38: "level 2 not synchronized", 39: "level 3 halted", 40: "level 3 reset", 41: "link number out of range", 42: "protocol driver not attached", 43: "no CSI structure available", 44: "level 2 halted", 45: "resource deadlock avoided", 46: "no locks available", 50: "invalid exchange", 51: "invalid request descriptor", 52: "exchange full", 53: "no anode", 54: "invalid request code", 55: "invalid slot", 56: "file locking deadlock error", 59: "bad font file format", 60: "device not a stream", 61: "no data available", 62: "timer expired", 63: "out of streams resources", 64: "machine is not on the network", 65: "package not installed", 66: "object is remote", 67: "link has been severed", 68: "advertise error", 69: "srmount error", 70: "communication error on send", 71: "protocol error", 73: "RFS specific error", 74: "multihop attempted", 77: "bad message", 78: "file name too long", 79: "value too large for defined data type", 80: "name not unique on network", 81: "file descriptor in bad state", 82: "remote address changed", 83: "can not access a needed shared library", 84: "accessing a corrupted shared library", 85: ".lib section in a.out corrupted", 86: "attempting to link in too many shared libraries", 87: "cannot exec a shared library directly", 88: "invalid or incomplete multibyte or wide character", 89: "function not implemented", 90: "too many levels of symbolic links", 91: "interrupted system call should be restarted", 92: "streams pipe error", 93: "directory not empty", 94: "too many users", 95: "socket operation on non-socket", 96: "destination address required", 97: "message too long", 98: "protocol wrong type for socket", 99: "protocol not available", 120: "protocol not supported", 121: "socket type not supported", 122: "operation not supported", 123: "protocol family not supported", 124: "address family not supported by protocol", 125: "address already in use", 126: "cannot assign requested address", 127: "network is down", 128: "network is unreachable", 129: "network dropped connection on reset", 130: "software caused connection abort", 131: "connection reset by peer", 132: "no buffer space available", 133: "transport endpoint is already connected", 134: "transport endpoint is not connected", 135: "structure needs cleaning", 137: "not a XENIX named type file", 138: "no XENIX semaphores available", 139: "is a named type file", 140: "remote I/O error", 141: "unknown error 141", 142: "unknown error 142", 143: "cannot send after transport endpoint shutdown", 144: "too many references: cannot splice", 145: "connection timed out", 146: "connection refused", 147: "host is down", 148: "no route to host", 149: "operation already in progress", 150: "operation now in progress", 151: "stale file handle", 158: "operation canceled", 159: "no medium found", 160: "wrong medium type", 161: "required key not available", 162: "key has expired", 163: "key has been revoked", 164: "key was rejected by service", 165: "owner died", 166: "state not recoverable", 167: "operation not possible due to RF-kill", 168: "memory page has hardware error", 1133: "disk quota exceeded", } // Signal table var signals = [...]string{ 1: "hangup", 2: "interrupt", 3: "quit", 4: "illegal instruction", 5: "trace/breakpoint trap", 6: "aborted", 7: "EMT trap", 8: "floating point exception", 9: "killed", 10: "bus error", 11: "segmentation fault", 12: "bad system call", 13: "broken pipe", 14: "alarm clock", 15: "terminated", 16: "user defined signal 1", 17: "user defined signal 2", 18: "child exited", 19: "power failure", 20: "window changed", 21: "urgent I/O condition", 22: "I/O possible", 23: "stopped (signal)", 24: "stopped", 25: "continued", 26: "stopped (tty input)", 27: "stopped (tty output)", 28: "virtual timer expired", 29: "profiling timer expired", 30: "CPU time limit exceeded", 31: "file size limit exceeded", } ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go ================================================ // mkerrors.sh -Wall -Werror -static -I/tmp/include // Code generated by the command above; see README.md. DO NOT EDIT. // +build mips64le,linux // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go package unix import "syscall" const ( AF_ALG = 0x26 AF_APPLETALK = 0x5 AF_ASH = 0x12 AF_ATMPVC = 0x8 AF_ATMSVC = 0x14 AF_AX25 = 0x3 AF_BLUETOOTH = 0x1f AF_BRIDGE = 0x7 AF_CAIF = 0x25 AF_CAN = 0x1d AF_DECnet = 0xc AF_ECONET = 0x13 AF_FILE = 0x1 AF_IB = 0x1b AF_IEEE802154 = 0x24 AF_INET = 0x2 AF_INET6 = 0xa AF_IPX = 0x4 AF_IRDA = 0x17 AF_ISDN = 0x22 AF_IUCV = 0x20 AF_KCM = 0x29 AF_KEY = 0xf AF_LLC = 0x1a AF_LOCAL = 0x1 AF_MAX = 0x2c AF_MPLS = 0x1c AF_NETBEUI = 0xd AF_NETLINK = 0x10 AF_NETROM = 0x6 AF_NFC = 0x27 AF_PACKET = 0x11 AF_PHONET = 0x23 AF_PPPOX = 0x18 AF_QIPCRTR = 0x2a AF_RDS = 0x15 AF_ROSE = 0xb AF_ROUTE = 0x10 AF_RXRPC = 0x21 AF_SECURITY = 0xe AF_SMC = 0x2b AF_SNA = 0x16 AF_TIPC = 0x1e AF_UNIX = 0x1 AF_UNSPEC = 0x0 AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 ALG_OP_DECRYPT = 0x0 ALG_OP_ENCRYPT = 0x1 ALG_SET_AEAD_ASSOCLEN = 0x4 ALG_SET_AEAD_AUTHSIZE = 0x5 ALG_SET_IV = 0x2 ALG_SET_KEY = 0x1 ALG_SET_OP = 0x3 ARPHRD_6LOWPAN = 0x339 ARPHRD_ADAPT = 0x108 ARPHRD_APPLETLK = 0x8 ARPHRD_ARCNET = 0x7 ARPHRD_ASH = 0x30d ARPHRD_ATM = 0x13 ARPHRD_AX25 = 0x3 ARPHRD_BIF = 0x307 ARPHRD_CAIF = 0x336 ARPHRD_CAN = 0x118 ARPHRD_CHAOS = 0x5 ARPHRD_CISCO = 0x201 ARPHRD_CSLIP = 0x101 ARPHRD_CSLIP6 = 0x103 ARPHRD_DDCMP = 0x205 ARPHRD_DLCI = 0xf ARPHRD_ECONET = 0x30e ARPHRD_EETHER = 0x2 ARPHRD_ETHER = 0x1 ARPHRD_EUI64 = 0x1b ARPHRD_FCAL = 0x311 ARPHRD_FCFABRIC = 0x313 ARPHRD_FCPL = 0x312 ARPHRD_FCPP = 0x310 ARPHRD_FDDI = 0x306 ARPHRD_FRAD = 0x302 ARPHRD_HDLC = 0x201 ARPHRD_HIPPI = 0x30c ARPHRD_HWX25 = 0x110 ARPHRD_IEEE1394 = 0x18 ARPHRD_IEEE802 = 0x6 ARPHRD_IEEE80211 = 0x321 ARPHRD_IEEE80211_PRISM = 0x322 ARPHRD_IEEE80211_RADIOTAP = 0x323 ARPHRD_IEEE802154 = 0x324 ARPHRD_IEEE802154_MONITOR = 0x325 ARPHRD_IEEE802_TR = 0x320 ARPHRD_INFINIBAND = 0x20 ARPHRD_IP6GRE = 0x337 ARPHRD_IPDDP = 0x309 ARPHRD_IPGRE = 0x30a ARPHRD_IRDA = 0x30f ARPHRD_LAPB = 0x204 ARPHRD_LOCALTLK = 0x305 ARPHRD_LOOPBACK = 0x304 ARPHRD_METRICOM = 0x17 ARPHRD_NETLINK = 0x338 ARPHRD_NETROM = 0x0 ARPHRD_NONE = 0xfffe ARPHRD_PHONET = 0x334 ARPHRD_PHONET_PIPE = 0x335 ARPHRD_PIMREG = 0x30b ARPHRD_PPP = 0x200 ARPHRD_PRONET = 0x4 ARPHRD_RAWHDLC = 0x206 ARPHRD_ROSE = 0x10e ARPHRD_RSRVD = 0x104 ARPHRD_SIT = 0x308 ARPHRD_SKIP = 0x303 ARPHRD_SLIP = 0x100 ARPHRD_SLIP6 = 0x102 ARPHRD_TUNNEL = 0x300 ARPHRD_TUNNEL6 = 0x301 ARPHRD_VOID = 0xffff ARPHRD_VSOCKMON = 0x33a ARPHRD_X25 = 0x10f B0 = 0x0 B1000000 = 0x1008 B110 = 0x3 B115200 = 0x1002 B1152000 = 0x1009 B1200 = 0x9 B134 = 0x4 B150 = 0x5 B1500000 = 0x100a B1800 = 0xa B19200 = 0xe B200 = 0x6 B2000000 = 0x100b B230400 = 0x1003 B2400 = 0xb B2500000 = 0x100c B300 = 0x7 B3000000 = 0x100d B3500000 = 0x100e B38400 = 0xf B4000000 = 0x100f B460800 = 0x1004 B4800 = 0xc B50 = 0x1 B500000 = 0x1005 B57600 = 0x1001 B576000 = 0x1006 B600 = 0x8 B75 = 0x2 B921600 = 0x1007 B9600 = 0xd BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40081272 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d BLKRRPART = 0x2000125f BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 BOTHER = 0x1000 BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALU = 0x4 BPF_AND = 0x50 BPF_B = 0x10 BPF_DIV = 0x30 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 BPF_JA = 0x0 BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 BPF_JMP = 0x5 BPF_JSET = 0x40 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 BPF_LEN = 0x80 BPF_LL_OFF = -0x200000 BPF_LSH = 0x60 BPF_MAJOR_VERSION = 0x1 BPF_MAXINSNS = 0x1000 BPF_MEM = 0x60 BPF_MEMWORDS = 0x10 BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MOD = 0x90 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_NET_OFF = -0x100000 BPF_OR = 0x40 BPF_RET = 0x6 BPF_RSH = 0x70 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 BPF_TAX = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 BPF_XOR = 0xa0 BRKINT = 0x2 BS0 = 0x0 BS1 = 0x2000 BSDLY = 0x2000 CAN_BCM = 0x2 CAN_EFF_FLAG = 0x80000000 CAN_EFF_ID_BITS = 0x1d CAN_EFF_MASK = 0x1fffffff CAN_ERR_FLAG = 0x20000000 CAN_ERR_MASK = 0x1fffffff CAN_INV_FILTER = 0x20000000 CAN_ISOTP = 0x6 CAN_MAX_DLC = 0x8 CAN_MAX_DLEN = 0x8 CAN_MCNET = 0x5 CAN_MTU = 0x10 CAN_NPROTO = 0x7 CAN_RAW = 0x1 CAN_RAW_FILTER_MAX = 0x200 CAN_RTR_FLAG = 0x40000000 CAN_SFF_ID_BITS = 0xb CAN_SFF_MASK = 0x7ff CAN_TP16 = 0x3 CAN_TP20 = 0x4 CBAUD = 0x100f CBAUDEX = 0x1000 CFLUSH = 0xf CIBAUD = 0x100f0000 CLOCAL = 0x800 CLOCK_BOOTTIME = 0x7 CLOCK_BOOTTIME_ALARM = 0x9 CLOCK_DEFAULT = 0x0 CLOCK_EXT = 0x1 CLOCK_INT = 0x2 CLOCK_MONOTONIC = 0x1 CLOCK_MONOTONIC_COARSE = 0x6 CLOCK_MONOTONIC_RAW = 0x4 CLOCK_PROCESS_CPUTIME_ID = 0x2 CLOCK_REALTIME = 0x0 CLOCK_REALTIME_ALARM = 0x8 CLOCK_REALTIME_COARSE = 0x5 CLOCK_TAI = 0xb CLOCK_THREAD_CPUTIME_ID = 0x3 CLOCK_TXFROMRX = 0x4 CLOCK_TXINT = 0x3 CLONE_CHILD_CLEARTID = 0x200000 CLONE_CHILD_SETTID = 0x1000000 CLONE_DETACHED = 0x400000 CLONE_FILES = 0x400 CLONE_FS = 0x200 CLONE_IO = 0x80000000 CLONE_NEWCGROUP = 0x2000000 CLONE_NEWIPC = 0x8000000 CLONE_NEWNET = 0x40000000 CLONE_NEWNS = 0x20000 CLONE_NEWPID = 0x20000000 CLONE_NEWUSER = 0x10000000 CLONE_NEWUTS = 0x4000000 CLONE_PARENT = 0x8000 CLONE_PARENT_SETTID = 0x100000 CLONE_PTRACE = 0x2000 CLONE_SETTLS = 0x80000 CLONE_SIGHAND = 0x800 CLONE_SYSVSEM = 0x40000 CLONE_THREAD = 0x10000 CLONE_UNTRACED = 0x800000 CLONE_VFORK = 0x4000 CLONE_VM = 0x100 CMSPAR = 0x40000000 CR0 = 0x0 CR1 = 0x200 CR2 = 0x400 CR3 = 0x600 CRDLY = 0x600 CREAD = 0x80 CRTSCTS = 0x80000000 CS5 = 0x0 CS6 = 0x10 CS7 = 0x20 CS8 = 0x30 CSIGNAL = 0xff CSIZE = 0x30 CSTART = 0x11 CSTATUS = 0x0 CSTOP = 0x13 CSTOPB = 0x40 CSUSP = 0x1a DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 DT_FIFO = 0x1 DT_LNK = 0xa DT_REG = 0x8 DT_SOCK = 0xc DT_UNKNOWN = 0x0 DT_WHT = 0xe ECHO = 0x8 ECHOCTL = 0x200 ECHOE = 0x10 ECHOK = 0x20 ECHOKE = 0x800 ECHONL = 0x40 ECHOPRT = 0x400 EFD_CLOEXEC = 0x80000 EFD_NONBLOCK = 0x80 EFD_SEMAPHORE = 0x1 ENCODING_DEFAULT = 0x0 ENCODING_FM_MARK = 0x3 ENCODING_FM_SPACE = 0x4 ENCODING_MANCHESTER = 0x5 ENCODING_NRZ = 0x1 ENCODING_NRZI = 0x2 EPOLLERR = 0x8 EPOLLET = 0x80000000 EPOLLEXCLUSIVE = 0x10000000 EPOLLHUP = 0x10 EPOLLIN = 0x1 EPOLLMSG = 0x400 EPOLLONESHOT = 0x40000000 EPOLLOUT = 0x4 EPOLLPRI = 0x2 EPOLLRDBAND = 0x80 EPOLLRDHUP = 0x2000 EPOLLRDNORM = 0x40 EPOLLWAKEUP = 0x20000000 EPOLLWRBAND = 0x200 EPOLLWRNORM = 0x100 EPOLL_CLOEXEC = 0x80000 EPOLL_CTL_ADD = 0x1 EPOLL_CTL_DEL = 0x2 EPOLL_CTL_MOD = 0x3 ETH_P_1588 = 0x88f7 ETH_P_8021AD = 0x88a8 ETH_P_8021AH = 0x88e7 ETH_P_8021Q = 0x8100 ETH_P_80221 = 0x8917 ETH_P_802_2 = 0x4 ETH_P_802_3 = 0x1 ETH_P_802_3_MIN = 0x600 ETH_P_802_EX1 = 0x88b5 ETH_P_AARP = 0x80f3 ETH_P_AF_IUCV = 0xfbfb ETH_P_ALL = 0x3 ETH_P_AOE = 0x88a2 ETH_P_ARCNET = 0x1a ETH_P_ARP = 0x806 ETH_P_ATALK = 0x809b ETH_P_ATMFATE = 0x8884 ETH_P_ATMMPOA = 0x884c ETH_P_AX25 = 0x2 ETH_P_BATMAN = 0x4305 ETH_P_BPQ = 0x8ff ETH_P_CAIF = 0xf7 ETH_P_CAN = 0xc ETH_P_CANFD = 0xd ETH_P_CONTROL = 0x16 ETH_P_CUST = 0x6006 ETH_P_DDCMP = 0x6 ETH_P_DEC = 0x6000 ETH_P_DIAG = 0x6005 ETH_P_DNA_DL = 0x6001 ETH_P_DNA_RC = 0x6002 ETH_P_DNA_RT = 0x6003 ETH_P_DSA = 0x1b ETH_P_ECONET = 0x18 ETH_P_EDSA = 0xdada ETH_P_FCOE = 0x8906 ETH_P_FIP = 0x8914 ETH_P_HDLC = 0x19 ETH_P_HSR = 0x892f ETH_P_IBOE = 0x8915 ETH_P_IEEE802154 = 0xf6 ETH_P_IEEEPUP = 0xa00 ETH_P_IEEEPUPAT = 0xa01 ETH_P_IP = 0x800 ETH_P_IPV6 = 0x86dd ETH_P_IPX = 0x8137 ETH_P_IRDA = 0x17 ETH_P_LAT = 0x6004 ETH_P_LINK_CTL = 0x886c ETH_P_LOCALTALK = 0x9 ETH_P_LOOP = 0x60 ETH_P_LOOPBACK = 0x9000 ETH_P_MACSEC = 0x88e5 ETH_P_MOBITEX = 0x15 ETH_P_MPLS_MC = 0x8848 ETH_P_MPLS_UC = 0x8847 ETH_P_MVRP = 0x88f5 ETH_P_NCSI = 0x88f8 ETH_P_PAE = 0x888e ETH_P_PAUSE = 0x8808 ETH_P_PHONET = 0xf5 ETH_P_PPPTALK = 0x10 ETH_P_PPP_DISC = 0x8863 ETH_P_PPP_MP = 0x8 ETH_P_PPP_SES = 0x8864 ETH_P_PRP = 0x88fb ETH_P_PUP = 0x200 ETH_P_PUPAT = 0x201 ETH_P_QINQ1 = 0x9100 ETH_P_QINQ2 = 0x9200 ETH_P_QINQ3 = 0x9300 ETH_P_RARP = 0x8035 ETH_P_SCA = 0x6007 ETH_P_SLOW = 0x8809 ETH_P_SNAP = 0x5 ETH_P_TDLS = 0x890d ETH_P_TEB = 0x6558 ETH_P_TIPC = 0x88ca ETH_P_TRAILER = 0x1c ETH_P_TR_802_2 = 0x11 ETH_P_TSN = 0x22f0 ETH_P_WAN_PPP = 0x7 ETH_P_WCCP = 0x883e ETH_P_X25 = 0x805 ETH_P_XDSA = 0xf8 EXTA = 0xe EXTB = 0xf EXTPROC = 0x10000 FALLOC_FL_COLLAPSE_RANGE = 0x8 FALLOC_FL_INSERT_RANGE = 0x20 FALLOC_FL_KEEP_SIZE = 0x1 FALLOC_FL_NO_HIDE_STALE = 0x4 FALLOC_FL_PUNCH_HOLE = 0x2 FALLOC_FL_UNSHARE_RANGE = 0x40 FALLOC_FL_ZERO_RANGE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 FF1 = 0x8000 FFDLY = 0x8000 FLUSHO = 0x2000 FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 FS_ENCRYPTION_MODE_INVALID = 0x0 FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 FS_KEY_DESCRIPTOR_SIZE = 0x8 FS_KEY_DESC_PREFIX = "fscrypt:" FS_KEY_DESC_PREFIX_SIZE = 0x8 FS_MAX_KEY_SIZE = 0x40 FS_POLICY_FLAGS_PAD_16 = 0x2 FS_POLICY_FLAGS_PAD_32 = 0x3 FS_POLICY_FLAGS_PAD_4 = 0x0 FS_POLICY_FLAGS_PAD_8 = 0x1 FS_POLICY_FLAGS_PAD_MASK = 0x3 FS_POLICY_FLAGS_VALID = 0x3 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0x406 F_EXLCK = 0x4 F_GETFD = 0x1 F_GETFL = 0x3 F_GETLEASE = 0x401 F_GETLK = 0xe F_GETLK64 = 0xe F_GETOWN = 0x17 F_GETOWN_EX = 0x10 F_GETPIPE_SZ = 0x408 F_GETSIG = 0xb F_LOCK = 0x1 F_NOTIFY = 0x402 F_OFD_GETLK = 0x24 F_OFD_SETLK = 0x25 F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 F_SETFD = 0x2 F_SETFL = 0x4 F_SETLEASE = 0x400 F_SETLK = 0x6 F_SETLK64 = 0x6 F_SETLKW = 0x7 F_SETLKW64 = 0x7 F_SETOWN = 0x18 F_SETOWN_EX = 0xf F_SETPIPE_SZ = 0x407 F_SETSIG = 0xa F_SHLCK = 0x8 F_TEST = 0x3 F_TLOCK = 0x2 F_ULOCK = 0x0 F_UNLCK = 0x2 F_WRLCK = 0x1 GENL_ADMIN_PERM = 0x1 GENL_CMD_CAP_DO = 0x2 GENL_CMD_CAP_DUMP = 0x4 GENL_CMD_CAP_HASPOL = 0x8 GENL_HDRLEN = 0x4 GENL_ID_CTRL = 0x10 GENL_ID_PMCRAID = 0x12 GENL_ID_VFS_DQUOT = 0x11 GENL_MAX_ID = 0x3ff GENL_MIN_ID = 0x10 GENL_NAMSIZ = 0x10 GENL_START_ALLOC = 0x13 GENL_UNS_ADMIN_PERM = 0x10 GRND_NONBLOCK = 0x1 GRND_RANDOM = 0x2 HUPCL = 0x400 IBSHIFT = 0x10 ICANON = 0x2 ICMPV6_FILTER = 0x1 ICRNL = 0x100 IEXTEN = 0x100 IFA_F_DADFAILED = 0x8 IFA_F_DEPRECATED = 0x20 IFA_F_HOMEADDRESS = 0x10 IFA_F_MANAGETEMPADDR = 0x100 IFA_F_MCAUTOJOIN = 0x400 IFA_F_NODAD = 0x2 IFA_F_NOPREFIXROUTE = 0x200 IFA_F_OPTIMISTIC = 0x4 IFA_F_PERMANENT = 0x80 IFA_F_SECONDARY = 0x1 IFA_F_STABLE_PRIVACY = 0x800 IFA_F_TEMPORARY = 0x1 IFA_F_TENTATIVE = 0x40 IFA_MAX = 0x8 IFF_ALLMULTI = 0x200 IFF_ATTACH_QUEUE = 0x200 IFF_AUTOMEDIA = 0x4000 IFF_BROADCAST = 0x2 IFF_DEBUG = 0x4 IFF_DETACH_QUEUE = 0x400 IFF_DORMANT = 0x20000 IFF_DYNAMIC = 0x8000 IFF_ECHO = 0x40000 IFF_LOOPBACK = 0x8 IFF_LOWER_UP = 0x10000 IFF_MASTER = 0x400 IFF_MULTICAST = 0x1000 IFF_MULTI_QUEUE = 0x100 IFF_NOARP = 0x80 IFF_NOFILTER = 0x1000 IFF_NOTRAILERS = 0x20 IFF_NO_PI = 0x1000 IFF_ONE_QUEUE = 0x2000 IFF_PERSIST = 0x800 IFF_POINTOPOINT = 0x10 IFF_PORTSEL = 0x2000 IFF_PROMISC = 0x100 IFF_RUNNING = 0x40 IFF_SLAVE = 0x800 IFF_TAP = 0x2 IFF_TUN = 0x1 IFF_TUN_EXCL = 0x8000 IFF_UP = 0x1 IFF_VNET_HDR = 0x4000 IFF_VOLATILE = 0x70c5a IFNAMSIZ = 0x10 IGNBRK = 0x1 IGNCR = 0x80 IGNPAR = 0x4 IMAXBEL = 0x2000 INLCR = 0x40 INPCK = 0x10 IN_ACCESS = 0x1 IN_ALL_EVENTS = 0xfff IN_ATTRIB = 0x4 IN_CLASSA_HOST = 0xffffff IN_CLASSA_MAX = 0x80 IN_CLASSA_NET = 0xff000000 IN_CLASSA_NSHIFT = 0x18 IN_CLASSB_HOST = 0xffff IN_CLASSB_MAX = 0x10000 IN_CLASSB_NET = 0xffff0000 IN_CLASSB_NSHIFT = 0x10 IN_CLASSC_HOST = 0xff IN_CLASSC_NET = 0xffffff00 IN_CLASSC_NSHIFT = 0x8 IN_CLOEXEC = 0x80000 IN_CLOSE = 0x18 IN_CLOSE_NOWRITE = 0x10 IN_CLOSE_WRITE = 0x8 IN_CREATE = 0x100 IN_DELETE = 0x200 IN_DELETE_SELF = 0x400 IN_DONT_FOLLOW = 0x2000000 IN_EXCL_UNLINK = 0x4000000 IN_IGNORED = 0x8000 IN_ISDIR = 0x40000000 IN_LOOPBACKNET = 0x7f IN_MASK_ADD = 0x20000000 IN_MODIFY = 0x2 IN_MOVE = 0xc0 IN_MOVED_FROM = 0x40 IN_MOVED_TO = 0x80 IN_MOVE_SELF = 0x800 IN_NONBLOCK = 0x80 IN_ONESHOT = 0x80000000 IN_ONLYDIR = 0x1000000 IN_OPEN = 0x20 IN_Q_OVERFLOW = 0x4000 IN_UNMOUNT = 0x2000 IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 IPPROTO_AH = 0x33 IPPROTO_BEETPH = 0x5e IPPROTO_COMP = 0x6c IPPROTO_DCCP = 0x21 IPPROTO_DSTOPTS = 0x3c IPPROTO_EGP = 0x8 IPPROTO_ENCAP = 0x62 IPPROTO_ESP = 0x32 IPPROTO_FRAGMENT = 0x2c IPPROTO_GRE = 0x2f IPPROTO_HOPOPTS = 0x0 IPPROTO_ICMP = 0x1 IPPROTO_ICMPV6 = 0x3a IPPROTO_IDP = 0x16 IPPROTO_IGMP = 0x2 IPPROTO_IP = 0x0 IPPROTO_IPIP = 0x4 IPPROTO_IPV6 = 0x29 IPPROTO_MH = 0x87 IPPROTO_MPLS = 0x89 IPPROTO_MTP = 0x5c IPPROTO_NONE = 0x3b IPPROTO_PIM = 0x67 IPPROTO_PUP = 0xc IPPROTO_RAW = 0xff IPPROTO_ROUTING = 0x2b IPPROTO_RSVP = 0x2e IPPROTO_SCTP = 0x84 IPPROTO_TCP = 0x6 IPPROTO_TP = 0x1d IPPROTO_UDP = 0x11 IPPROTO_UDPLITE = 0x88 IPV6_2292DSTOPTS = 0x4 IPV6_2292HOPLIMIT = 0x8 IPV6_2292HOPOPTS = 0x3 IPV6_2292PKTINFO = 0x2 IPV6_2292PKTOPTIONS = 0x6 IPV6_2292RTHDR = 0x5 IPV6_ADDRFORM = 0x1 IPV6_ADDR_PREFERENCES = 0x48 IPV6_ADD_MEMBERSHIP = 0x14 IPV6_AUTHHDR = 0xa IPV6_AUTOFLOWLABEL = 0x46 IPV6_CHECKSUM = 0x7 IPV6_DONTFRAG = 0x3e IPV6_DROP_MEMBERSHIP = 0x15 IPV6_DSTOPTS = 0x3b IPV6_HDRINCL = 0x24 IPV6_HOPLIMIT = 0x34 IPV6_HOPOPTS = 0x36 IPV6_IPSEC_POLICY = 0x22 IPV6_JOIN_ANYCAST = 0x1b IPV6_JOIN_GROUP = 0x14 IPV6_LEAVE_ANYCAST = 0x1c IPV6_LEAVE_GROUP = 0x15 IPV6_MINHOPCOUNT = 0x49 IPV6_MTU = 0x18 IPV6_MTU_DISCOVER = 0x17 IPV6_MULTICAST_HOPS = 0x12 IPV6_MULTICAST_IF = 0x11 IPV6_MULTICAST_LOOP = 0x13 IPV6_NEXTHOP = 0x9 IPV6_ORIGDSTADDR = 0x4a IPV6_PATHMTU = 0x3d IPV6_PKTINFO = 0x32 IPV6_PMTUDISC_DO = 0x2 IPV6_PMTUDISC_DONT = 0x0 IPV6_PMTUDISC_INTERFACE = 0x4 IPV6_PMTUDISC_OMIT = 0x5 IPV6_PMTUDISC_PROBE = 0x3 IPV6_PMTUDISC_WANT = 0x1 IPV6_RECVDSTOPTS = 0x3a IPV6_RECVERR = 0x19 IPV6_RECVFRAGSIZE = 0x4d IPV6_RECVHOPLIMIT = 0x33 IPV6_RECVHOPOPTS = 0x35 IPV6_RECVORIGDSTADDR = 0x4a IPV6_RECVPATHMTU = 0x3c IPV6_RECVPKTINFO = 0x31 IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 IPV6_RTHDR_STRICT = 0x1 IPV6_RTHDR_TYPE_0 = 0x0 IPV6_RXDSTOPTS = 0x3b IPV6_RXHOPOPTS = 0x36 IPV6_TCLASS = 0x43 IPV6_TRANSPARENT = 0x4b IPV6_UNICAST_HOPS = 0x10 IPV6_UNICAST_IF = 0x4c IPV6_V6ONLY = 0x1a IPV6_XFRM_POLICY = 0x23 IP_ADD_MEMBERSHIP = 0x23 IP_ADD_SOURCE_MEMBERSHIP = 0x27 IP_BIND_ADDRESS_NO_PORT = 0x18 IP_BLOCK_SOURCE = 0x26 IP_CHECKSUM = 0x17 IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 IP_DROP_MEMBERSHIP = 0x24 IP_DROP_SOURCE_MEMBERSHIP = 0x28 IP_FREEBIND = 0xf IP_HDRINCL = 0x3 IP_IPSEC_POLICY = 0x10 IP_MAXPACKET = 0xffff IP_MAX_MEMBERSHIPS = 0x14 IP_MF = 0x2000 IP_MINTTL = 0x15 IP_MSFILTER = 0x29 IP_MSS = 0x240 IP_MTU = 0xe IP_MTU_DISCOVER = 0xa IP_MULTICAST_ALL = 0x31 IP_MULTICAST_IF = 0x20 IP_MULTICAST_LOOP = 0x22 IP_MULTICAST_TTL = 0x21 IP_NODEFRAG = 0x16 IP_OFFMASK = 0x1fff IP_OPTIONS = 0x4 IP_ORIGDSTADDR = 0x14 IP_PASSSEC = 0x12 IP_PKTINFO = 0x8 IP_PKTOPTIONS = 0x9 IP_PMTUDISC = 0xa IP_PMTUDISC_DO = 0x2 IP_PMTUDISC_DONT = 0x0 IP_PMTUDISC_INTERFACE = 0x4 IP_PMTUDISC_OMIT = 0x5 IP_PMTUDISC_PROBE = 0x3 IP_PMTUDISC_WANT = 0x1 IP_RECVERR = 0xb IP_RECVFRAGSIZE = 0x19 IP_RECVOPTS = 0x6 IP_RECVORIGDSTADDR = 0x14 IP_RECVRETOPTS = 0x7 IP_RECVTOS = 0xd IP_RECVTTL = 0xc IP_RETOPTS = 0x7 IP_RF = 0x8000 IP_ROUTER_ALERT = 0x5 IP_TOS = 0x1 IP_TRANSPARENT = 0x13 IP_TTL = 0x2 IP_UNBLOCK_SOURCE = 0x25 IP_UNICAST_IF = 0x32 IP_XFRM_POLICY = 0x11 ISIG = 0x1 ISTRIP = 0x20 IUCLC = 0x200 IUTF8 = 0x4000 IXANY = 0x800 IXOFF = 0x1000 IXON = 0x400 KEYCTL_ASSUME_AUTHORITY = 0x10 KEYCTL_CHOWN = 0x4 KEYCTL_CLEAR = 0x7 KEYCTL_DESCRIBE = 0x6 KEYCTL_DH_COMPUTE = 0x17 KEYCTL_GET_KEYRING_ID = 0x0 KEYCTL_GET_PERSISTENT = 0x16 KEYCTL_GET_SECURITY = 0x11 KEYCTL_INSTANTIATE = 0xc KEYCTL_INSTANTIATE_IOV = 0x14 KEYCTL_INVALIDATE = 0x15 KEYCTL_JOIN_SESSION_KEYRING = 0x1 KEYCTL_LINK = 0x8 KEYCTL_NEGATE = 0xd KEYCTL_READ = 0xb KEYCTL_REJECT = 0x13 KEYCTL_RESTRICT_KEYRING = 0x1d KEYCTL_REVOKE = 0x3 KEYCTL_SEARCH = 0xa KEYCTL_SESSION_TO_PARENT = 0x12 KEYCTL_SETPERM = 0x5 KEYCTL_SET_REQKEY_KEYRING = 0xe KEYCTL_SET_TIMEOUT = 0xf KEYCTL_UNLINK = 0x9 KEYCTL_UPDATE = 0x2 KEY_REQKEY_DEFL_DEFAULT = 0x0 KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 KEY_REQKEY_DEFL_NO_CHANGE = -0x1 KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 KEY_REQKEY_DEFL_USER_KEYRING = 0x4 KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 KEY_SPEC_GROUP_KEYRING = -0x6 KEY_SPEC_PROCESS_KEYRING = -0x2 KEY_SPEC_REQKEY_AUTH_KEY = -0x7 KEY_SPEC_REQUESTOR_KEYRING = -0x8 KEY_SPEC_SESSION_KEYRING = -0x3 KEY_SPEC_THREAD_KEYRING = -0x1 KEY_SPEC_USER_KEYRING = -0x4 KEY_SPEC_USER_SESSION_KEYRING = -0x5 LINUX_REBOOT_CMD_CAD_OFF = 0x0 LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef LINUX_REBOOT_CMD_HALT = 0xcdef0123 LINUX_REBOOT_CMD_KEXEC = 0x45584543 LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc LINUX_REBOOT_CMD_RESTART = 0x1234567 LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 LINUX_REBOOT_MAGIC1 = 0xfee1dead LINUX_REBOOT_MAGIC2 = 0x28121969 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 MADV_DONTFORK = 0xa MADV_DONTNEED = 0x4 MADV_FREE = 0x8 MADV_HUGEPAGE = 0xe MADV_HWPOISON = 0x64 MADV_MERGEABLE = 0xc MADV_NOHUGEPAGE = 0xf MADV_NORMAL = 0x0 MADV_RANDOM = 0x1 MADV_REMOVE = 0x9 MADV_SEQUENTIAL = 0x2 MADV_UNMERGEABLE = 0xd MADV_WILLNEED = 0x3 MAP_ANON = 0x800 MAP_ANONYMOUS = 0x800 MAP_DENYWRITE = 0x2000 MAP_EXECUTABLE = 0x4000 MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_GROWSDOWN = 0x1000 MAP_HUGETLB = 0x80000 MAP_HUGE_MASK = 0x3f MAP_HUGE_SHIFT = 0x1a MAP_LOCKED = 0x8000 MAP_NONBLOCK = 0x20000 MAP_NORESERVE = 0x400 MAP_POPULATE = 0x10000 MAP_PRIVATE = 0x2 MAP_RENAME = 0x800 MAP_SHARED = 0x1 MAP_STACK = 0x40000 MAP_TYPE = 0xf MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MCL_ONFAULT = 0x4 MNT_DETACH = 0x2 MNT_EXPIRE = 0x4 MNT_FORCE = 0x1 MSG_BATCH = 0x40000 MSG_CMSG_CLOEXEC = 0x40000000 MSG_CONFIRM = 0x800 MSG_CTRUNC = 0x8 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x40 MSG_EOR = 0x80 MSG_ERRQUEUE = 0x2000 MSG_FASTOPEN = 0x20000000 MSG_FIN = 0x200 MSG_MORE = 0x8000 MSG_NOSIGNAL = 0x4000 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_PROXY = 0x10 MSG_RST = 0x1000 MSG_SYN = 0x400 MSG_TRUNC = 0x20 MSG_TRYHARD = 0x4 MSG_WAITALL = 0x100 MSG_WAITFORONE = 0x10000 MS_ACTIVE = 0x40000000 MS_ASYNC = 0x1 MS_BIND = 0x1000 MS_BORN = 0x20000000 MS_DIRSYNC = 0x80 MS_INVALIDATE = 0x2 MS_I_VERSION = 0x800000 MS_KERNMOUNT = 0x400000 MS_LAZYTIME = 0x2000000 MS_MANDLOCK = 0x40 MS_MGC_MSK = 0xffff0000 MS_MGC_VAL = 0xc0ed0000 MS_MOVE = 0x2000 MS_NOATIME = 0x400 MS_NODEV = 0x4 MS_NODIRATIME = 0x800 MS_NOEXEC = 0x8 MS_NOREMOTELOCK = 0x8000000 MS_NOSEC = 0x10000000 MS_NOSUID = 0x2 MS_NOUSER = -0x80000000 MS_POSIXACL = 0x10000 MS_PRIVATE = 0x40000 MS_RDONLY = 0x1 MS_REC = 0x4000 MS_RELATIME = 0x200000 MS_REMOUNT = 0x20 MS_RMT_MASK = 0x2800051 MS_SHARED = 0x100000 MS_SILENT = 0x8000 MS_SLAVE = 0x80000 MS_STRICTATIME = 0x1000000 MS_SUBMOUNT = 0x4000000 MS_SYNC = 0x4 MS_SYNCHRONOUS = 0x10 MS_UNBINDABLE = 0x20000 MS_VERBOSE = 0x8000 NAME_MAX = 0xff NETLINK_ADD_MEMBERSHIP = 0x1 NETLINK_AUDIT = 0x9 NETLINK_BROADCAST_ERROR = 0x4 NETLINK_CAP_ACK = 0xa NETLINK_CONNECTOR = 0xb NETLINK_CRYPTO = 0x15 NETLINK_DNRTMSG = 0xe NETLINK_DROP_MEMBERSHIP = 0x2 NETLINK_ECRYPTFS = 0x13 NETLINK_EXT_ACK = 0xb NETLINK_FIB_LOOKUP = 0xa NETLINK_FIREWALL = 0x3 NETLINK_GENERIC = 0x10 NETLINK_INET_DIAG = 0x4 NETLINK_IP6_FW = 0xd NETLINK_ISCSI = 0x8 NETLINK_KOBJECT_UEVENT = 0xf NETLINK_LISTEN_ALL_NSID = 0x8 NETLINK_LIST_MEMBERSHIPS = 0x9 NETLINK_NETFILTER = 0xc NETLINK_NFLOG = 0x5 NETLINK_NO_ENOBUFS = 0x5 NETLINK_PKTINFO = 0x3 NETLINK_RDMA = 0x14 NETLINK_ROUTE = 0x0 NETLINK_RX_RING = 0x6 NETLINK_SCSITRANSPORT = 0x12 NETLINK_SELINUX = 0x7 NETLINK_SMC = 0x16 NETLINK_SOCK_DIAG = 0x4 NETLINK_TX_RING = 0x7 NETLINK_UNUSED = 0x1 NETLINK_USERSOCK = 0x2 NETLINK_XFRM = 0x6 NL0 = 0x0 NL1 = 0x100 NLA_ALIGNTO = 0x4 NLA_F_NESTED = 0x8000 NLA_F_NET_BYTEORDER = 0x4000 NLA_HDRLEN = 0x4 NLDLY = 0x100 NLMSG_ALIGNTO = 0x4 NLMSG_DONE = 0x3 NLMSG_ERROR = 0x2 NLMSG_HDRLEN = 0x10 NLMSG_MIN_TYPE = 0x10 NLMSG_NOOP = 0x1 NLMSG_OVERRUN = 0x4 NLM_F_ACK = 0x4 NLM_F_ACK_TLVS = 0x200 NLM_F_APPEND = 0x800 NLM_F_ATOMIC = 0x400 NLM_F_CAPPED = 0x100 NLM_F_CREATE = 0x400 NLM_F_DUMP = 0x300 NLM_F_DUMP_FILTERED = 0x20 NLM_F_DUMP_INTR = 0x10 NLM_F_ECHO = 0x8 NLM_F_EXCL = 0x200 NLM_F_MATCH = 0x200 NLM_F_MULTI = 0x2 NLM_F_REPLACE = 0x100 NLM_F_REQUEST = 0x1 NLM_F_ROOT = 0x100 NOFLSH = 0x80 OCRNL = 0x8 OFDEL = 0x80 OFILL = 0x40 OLCUC = 0x2 ONLCR = 0x4 ONLRET = 0x20 ONOCR = 0x10 OPOST = 0x1 O_ACCMODE = 0x3 O_APPEND = 0x8 O_ASYNC = 0x1000 O_CLOEXEC = 0x80000 O_CREAT = 0x100 O_DIRECT = 0x8000 O_DIRECTORY = 0x10000 O_DSYNC = 0x10 O_EXCL = 0x400 O_FSYNC = 0x4010 O_LARGEFILE = 0x0 O_NDELAY = 0x80 O_NOATIME = 0x40000 O_NOCTTY = 0x800 O_NOFOLLOW = 0x20000 O_NONBLOCK = 0x80 O_PATH = 0x200000 O_RDONLY = 0x0 O_RDWR = 0x2 O_RSYNC = 0x4010 O_SYNC = 0x4010 O_TMPFILE = 0x410000 O_TRUNC = 0x200 O_WRONLY = 0x1 PACKET_ADD_MEMBERSHIP = 0x1 PACKET_AUXDATA = 0x8 PACKET_BROADCAST = 0x1 PACKET_COPY_THRESH = 0x7 PACKET_DROP_MEMBERSHIP = 0x2 PACKET_FANOUT = 0x12 PACKET_FANOUT_CBPF = 0x6 PACKET_FANOUT_CPU = 0x2 PACKET_FANOUT_DATA = 0x16 PACKET_FANOUT_EBPF = 0x7 PACKET_FANOUT_FLAG_DEFRAG = 0x8000 PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 PACKET_FANOUT_HASH = 0x0 PACKET_FANOUT_LB = 0x1 PACKET_FANOUT_QM = 0x5 PACKET_FANOUT_RND = 0x4 PACKET_FANOUT_ROLLOVER = 0x3 PACKET_FASTROUTE = 0x6 PACKET_HDRLEN = 0xb PACKET_HOST = 0x0 PACKET_KERNEL = 0x7 PACKET_LOOPBACK = 0x5 PACKET_LOSS = 0xe PACKET_MR_ALLMULTI = 0x2 PACKET_MR_MULTICAST = 0x0 PACKET_MR_PROMISC = 0x1 PACKET_MR_UNICAST = 0x3 PACKET_MULTICAST = 0x2 PACKET_ORIGDEV = 0x9 PACKET_OTHERHOST = 0x3 PACKET_OUTGOING = 0x4 PACKET_QDISC_BYPASS = 0x14 PACKET_RECV_OUTPUT = 0x3 PACKET_RESERVE = 0xc PACKET_ROLLOVER_STATS = 0x15 PACKET_RX_RING = 0x5 PACKET_STATISTICS = 0x6 PACKET_TIMESTAMP = 0x11 PACKET_TX_HAS_OFF = 0x13 PACKET_TX_RING = 0xd PACKET_TX_TIMESTAMP = 0x10 PACKET_USER = 0x6 PACKET_VERSION = 0xa PACKET_VNET_HDR = 0xf PARENB = 0x100 PARITY_CRC16_PR0 = 0x2 PARITY_CRC16_PR0_CCITT = 0x4 PARITY_CRC16_PR1 = 0x3 PARITY_CRC16_PR1_CCITT = 0x5 PARITY_CRC32_PR0_CCITT = 0x6 PARITY_CRC32_PR1_CCITT = 0x7 PARITY_DEFAULT = 0x0 PARITY_NONE = 0x1 PARMRK = 0x8 PARODD = 0x200 PENDIN = 0x4000 PERF_EVENT_IOC_DISABLE = 0x20002401 PERF_EVENT_IOC_ENABLE = 0x20002400 PERF_EVENT_IOC_ID = 0x40082407 PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 PERF_EVENT_IOC_PERIOD = 0x80082404 PERF_EVENT_IOC_REFRESH = 0x20002402 PERF_EVENT_IOC_RESET = 0x20002403 PERF_EVENT_IOC_SET_BPF = 0x80042408 PERF_EVENT_IOC_SET_FILTER = 0x80082406 PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 PROT_EXEC = 0x4 PROT_GROWSDOWN = 0x1000000 PROT_GROWSUP = 0x2000000 PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 PR_CAPBSET_DROP = 0x18 PR_CAPBSET_READ = 0x17 PR_CAP_AMBIENT = 0x2f PR_CAP_AMBIENT_CLEAR_ALL = 0x4 PR_CAP_AMBIENT_IS_SET = 0x1 PR_CAP_AMBIENT_LOWER = 0x3 PR_CAP_AMBIENT_RAISE = 0x2 PR_ENDIAN_BIG = 0x0 PR_ENDIAN_LITTLE = 0x1 PR_ENDIAN_PPC_LITTLE = 0x2 PR_FPEMU_NOPRINT = 0x1 PR_FPEMU_SIGFPE = 0x2 PR_FP_EXC_ASYNC = 0x2 PR_FP_EXC_DISABLED = 0x0 PR_FP_EXC_DIV = 0x10000 PR_FP_EXC_INV = 0x100000 PR_FP_EXC_NONRECOV = 0x1 PR_FP_EXC_OVF = 0x20000 PR_FP_EXC_PRECISE = 0x3 PR_FP_EXC_RES = 0x80000 PR_FP_EXC_SW_ENABLE = 0x80 PR_FP_EXC_UND = 0x40000 PR_FP_MODE_FR = 0x1 PR_FP_MODE_FRE = 0x2 PR_GET_CHILD_SUBREAPER = 0x25 PR_GET_DUMPABLE = 0x3 PR_GET_ENDIAN = 0x13 PR_GET_FPEMU = 0x9 PR_GET_FPEXC = 0xb PR_GET_FP_MODE = 0x2e PR_GET_KEEPCAPS = 0x7 PR_GET_NAME = 0x10 PR_GET_NO_NEW_PRIVS = 0x27 PR_GET_PDEATHSIG = 0x2 PR_GET_SECCOMP = 0x15 PR_GET_SECUREBITS = 0x1b PR_GET_THP_DISABLE = 0x2a PR_GET_TID_ADDRESS = 0x28 PR_GET_TIMERSLACK = 0x1e PR_GET_TIMING = 0xd PR_GET_TSC = 0x19 PR_GET_UNALIGN = 0x5 PR_MCE_KILL = 0x21 PR_MCE_KILL_CLEAR = 0x0 PR_MCE_KILL_DEFAULT = 0x2 PR_MCE_KILL_EARLY = 0x1 PR_MCE_KILL_GET = 0x22 PR_MCE_KILL_LATE = 0x0 PR_MCE_KILL_SET = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b PR_SET_CHILD_SUBREAPER = 0x24 PR_SET_DUMPABLE = 0x4 PR_SET_ENDIAN = 0x14 PR_SET_FPEMU = 0xa PR_SET_FPEXC = 0xc PR_SET_FP_MODE = 0x2d PR_SET_KEEPCAPS = 0x8 PR_SET_MM = 0x23 PR_SET_MM_ARG_END = 0x9 PR_SET_MM_ARG_START = 0x8 PR_SET_MM_AUXV = 0xc PR_SET_MM_BRK = 0x7 PR_SET_MM_END_CODE = 0x2 PR_SET_MM_END_DATA = 0x4 PR_SET_MM_ENV_END = 0xb PR_SET_MM_ENV_START = 0xa PR_SET_MM_EXE_FILE = 0xd PR_SET_MM_MAP = 0xe PR_SET_MM_MAP_SIZE = 0xf PR_SET_MM_START_BRK = 0x6 PR_SET_MM_START_CODE = 0x1 PR_SET_MM_START_DATA = 0x3 PR_SET_MM_START_STACK = 0x5 PR_SET_NAME = 0xf PR_SET_NO_NEW_PRIVS = 0x26 PR_SET_PDEATHSIG = 0x1 PR_SET_PTRACER = 0x59616d61 PR_SET_PTRACER_ANY = 0xffffffffffffffff PR_SET_SECCOMP = 0x16 PR_SET_SECUREBITS = 0x1c PR_SET_THP_DISABLE = 0x29 PR_SET_TIMERSLACK = 0x1d PR_SET_TIMING = 0xe PR_SET_TSC = 0x1a PR_SET_UNALIGN = 0x6 PR_TASK_PERF_EVENTS_DISABLE = 0x1f PR_TASK_PERF_EVENTS_ENABLE = 0x20 PR_TIMING_STATISTICAL = 0x0 PR_TIMING_TIMESTAMP = 0x1 PR_TSC_ENABLE = 0x1 PR_TSC_SIGSEGV = 0x2 PR_UNALIGN_NOPRINT = 0x1 PR_UNALIGN_SIGBUS = 0x2 PTRACE_ATTACH = 0x10 PTRACE_CONT = 0x7 PTRACE_DETACH = 0x11 PTRACE_EVENT_CLONE = 0x3 PTRACE_EVENT_EXEC = 0x4 PTRACE_EVENT_EXIT = 0x6 PTRACE_EVENT_FORK = 0x1 PTRACE_EVENT_SECCOMP = 0x7 PTRACE_EVENT_STOP = 0x80 PTRACE_EVENT_VFORK = 0x2 PTRACE_EVENT_VFORK_DONE = 0x5 PTRACE_GETEVENTMSG = 0x4201 PTRACE_GETFPREGS = 0xe PTRACE_GETREGS = 0xc PTRACE_GETREGSET = 0x4204 PTRACE_GETSIGINFO = 0x4202 PTRACE_GETSIGMASK = 0x420a PTRACE_GET_THREAD_AREA = 0x19 PTRACE_GET_THREAD_AREA_3264 = 0xc4 PTRACE_GET_WATCH_REGS = 0xd0 PTRACE_INTERRUPT = 0x4207 PTRACE_KILL = 0x8 PTRACE_LISTEN = 0x4208 PTRACE_OLDSETOPTIONS = 0x15 PTRACE_O_EXITKILL = 0x100000 PTRACE_O_MASK = 0x3000ff PTRACE_O_SUSPEND_SECCOMP = 0x200000 PTRACE_O_TRACECLONE = 0x8 PTRACE_O_TRACEEXEC = 0x10 PTRACE_O_TRACEEXIT = 0x40 PTRACE_O_TRACEFORK = 0x2 PTRACE_O_TRACESECCOMP = 0x80 PTRACE_O_TRACESYSGOOD = 0x1 PTRACE_O_TRACEVFORK = 0x4 PTRACE_O_TRACEVFORKDONE = 0x20 PTRACE_PEEKDATA = 0x2 PTRACE_PEEKDATA_3264 = 0xc1 PTRACE_PEEKSIGINFO = 0x4209 PTRACE_PEEKSIGINFO_SHARED = 0x1 PTRACE_PEEKTEXT = 0x1 PTRACE_PEEKTEXT_3264 = 0xc0 PTRACE_PEEKUSR = 0x3 PTRACE_POKEDATA = 0x5 PTRACE_POKEDATA_3264 = 0xc3 PTRACE_POKETEXT = 0x4 PTRACE_POKETEXT_3264 = 0xc2 PTRACE_POKEUSR = 0x6 PTRACE_SECCOMP_GET_FILTER = 0x420c PTRACE_SEIZE = 0x4206 PTRACE_SETFPREGS = 0xf PTRACE_SETOPTIONS = 0x4200 PTRACE_SETREGS = 0xd PTRACE_SETREGSET = 0x4205 PTRACE_SETSIGINFO = 0x4203 PTRACE_SETSIGMASK = 0x420b PTRACE_SET_THREAD_AREA = 0x1a PTRACE_SET_WATCH_REGS = 0xd1 PTRACE_SINGLESTEP = 0x9 PTRACE_SYSCALL = 0x18 PTRACE_TRACEME = 0x0 RLIMIT_AS = 0x6 RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 RLIMIT_LOCKS = 0xa RLIMIT_MEMLOCK = 0x9 RLIMIT_MSGQUEUE = 0xc RLIMIT_NICE = 0xd RLIMIT_NOFILE = 0x5 RLIMIT_NPROC = 0x8 RLIMIT_RSS = 0x7 RLIMIT_RTPRIO = 0xe RLIMIT_RTTIME = 0xf RLIMIT_SIGPENDING = 0xb RLIMIT_STACK = 0x3 RLIM_INFINITY = 0xffffffffffffffff RTAX_ADVMSS = 0x8 RTAX_CC_ALGO = 0x10 RTAX_CWND = 0x7 RTAX_FEATURES = 0xc RTAX_FEATURE_ALLFRAG = 0x8 RTAX_FEATURE_ECN = 0x1 RTAX_FEATURE_MASK = 0xf RTAX_FEATURE_SACK = 0x2 RTAX_FEATURE_TIMESTAMP = 0x4 RTAX_HOPLIMIT = 0xa RTAX_INITCWND = 0xb RTAX_INITRWND = 0xe RTAX_LOCK = 0x1 RTAX_MAX = 0x10 RTAX_MTU = 0x2 RTAX_QUICKACK = 0xf RTAX_REORDERING = 0x9 RTAX_RTO_MIN = 0xd RTAX_RTT = 0x4 RTAX_RTTVAR = 0x5 RTAX_SSTHRESH = 0x6 RTAX_UNSPEC = 0x0 RTAX_WINDOW = 0x3 RTA_ALIGNTO = 0x4 RTA_MAX = 0x1a RTCF_DIRECTSRC = 0x4000000 RTCF_DOREDIRECT = 0x1000000 RTCF_LOG = 0x2000000 RTCF_MASQ = 0x400000 RTCF_NAT = 0x800000 RTCF_VALVE = 0x200000 RTF_ADDRCLASSMASK = 0xf8000000 RTF_ADDRCONF = 0x40000 RTF_ALLONLINK = 0x20000 RTF_BROADCAST = 0x10000000 RTF_CACHE = 0x1000000 RTF_DEFAULT = 0x10000 RTF_DYNAMIC = 0x10 RTF_FLOW = 0x2000000 RTF_GATEWAY = 0x2 RTF_HOST = 0x4 RTF_INTERFACE = 0x40000000 RTF_IRTT = 0x100 RTF_LINKRT = 0x100000 RTF_LOCAL = 0x80000000 RTF_MODIFIED = 0x20 RTF_MSS = 0x40 RTF_MTU = 0x40 RTF_MULTICAST = 0x20000000 RTF_NAT = 0x8000000 RTF_NOFORWARD = 0x1000 RTF_NONEXTHOP = 0x200000 RTF_NOPMTUDISC = 0x4000 RTF_POLICY = 0x4000000 RTF_REINSTATE = 0x8 RTF_REJECT = 0x200 RTF_STATIC = 0x400 RTF_THROW = 0x2000 RTF_UP = 0x1 RTF_WINDOW = 0x80 RTF_XRESOLVE = 0x800 RTM_BASE = 0x10 RTM_DELACTION = 0x31 RTM_DELADDR = 0x15 RTM_DELADDRLABEL = 0x49 RTM_DELLINK = 0x11 RTM_DELMDB = 0x55 RTM_DELNEIGH = 0x1d RTM_DELNETCONF = 0x51 RTM_DELNSID = 0x59 RTM_DELQDISC = 0x25 RTM_DELROUTE = 0x19 RTM_DELRULE = 0x21 RTM_DELTCLASS = 0x29 RTM_DELTFILTER = 0x2d RTM_F_CLONED = 0x200 RTM_F_EQUALIZE = 0x400 RTM_F_FIB_MATCH = 0x2000 RTM_F_LOOKUP_TABLE = 0x1000 RTM_F_NOTIFY = 0x100 RTM_F_PREFIX = 0x800 RTM_GETACTION = 0x32 RTM_GETADDR = 0x16 RTM_GETADDRLABEL = 0x4a RTM_GETANYCAST = 0x3e RTM_GETDCB = 0x4e RTM_GETLINK = 0x12 RTM_GETMDB = 0x56 RTM_GETMULTICAST = 0x3a RTM_GETNEIGH = 0x1e RTM_GETNEIGHTBL = 0x42 RTM_GETNETCONF = 0x52 RTM_GETNSID = 0x5a RTM_GETQDISC = 0x26 RTM_GETROUTE = 0x1a RTM_GETRULE = 0x22 RTM_GETSTATS = 0x5e RTM_GETTCLASS = 0x2a RTM_GETTFILTER = 0x2e RTM_MAX = 0x63 RTM_NEWACTION = 0x30 RTM_NEWADDR = 0x14 RTM_NEWADDRLABEL = 0x48 RTM_NEWCACHEREPORT = 0x60 RTM_NEWLINK = 0x10 RTM_NEWMDB = 0x54 RTM_NEWNDUSEROPT = 0x44 RTM_NEWNEIGH = 0x1c RTM_NEWNEIGHTBL = 0x40 RTM_NEWNETCONF = 0x50 RTM_NEWNSID = 0x58 RTM_NEWPREFIX = 0x34 RTM_NEWQDISC = 0x24 RTM_NEWROUTE = 0x18 RTM_NEWRULE = 0x20 RTM_NEWSTATS = 0x5c RTM_NEWTCLASS = 0x28 RTM_NEWTFILTER = 0x2c RTM_NR_FAMILIES = 0x15 RTM_NR_MSGTYPES = 0x54 RTM_SETDCB = 0x4f RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 RTNH_ALIGNTO = 0x4 RTNH_COMPARE_MASK = 0x19 RTNH_F_DEAD = 0x1 RTNH_F_LINKDOWN = 0x10 RTNH_F_OFFLOAD = 0x8 RTNH_F_ONLINK = 0x4 RTNH_F_PERVASIVE = 0x2 RTNH_F_UNRESOLVED = 0x20 RTN_MAX = 0xb RTPROT_BABEL = 0x2a RTPROT_BIRD = 0xc RTPROT_BOOT = 0x3 RTPROT_DHCP = 0x10 RTPROT_DNROUTED = 0xd RTPROT_GATED = 0x8 RTPROT_KERNEL = 0x2 RTPROT_MROUTED = 0x11 RTPROT_MRT = 0xa RTPROT_NTK = 0xf RTPROT_RA = 0x9 RTPROT_REDIRECT = 0x1 RTPROT_STATIC = 0x4 RTPROT_UNSPEC = 0x0 RTPROT_XORP = 0xe RTPROT_ZEBRA = 0xb RT_CLASS_DEFAULT = 0xfd RT_CLASS_LOCAL = 0xff RT_CLASS_MAIN = 0xfe RT_CLASS_MAX = 0xff RT_CLASS_UNSPEC = 0x0 RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 RUSAGE_THREAD = 0x1 SCM_CREDENTIALS = 0x2 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x1d SCM_TIMESTAMPING = 0x25 SCM_TIMESTAMPING_OPT_STATS = 0x36 SCM_TIMESTAMPING_PKTINFO = 0x3a SCM_TIMESTAMPNS = 0x23 SCM_WIFI_STATUS = 0x29 SECCOMP_MODE_DISABLED = 0x0 SECCOMP_MODE_FILTER = 0x2 SECCOMP_MODE_STRICT = 0x1 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 SIOCADDDLCI = 0x8980 SIOCADDMULTI = 0x8931 SIOCADDRT = 0x890b SIOCATMARK = 0x40047307 SIOCBONDCHANGEACTIVE = 0x8995 SIOCBONDENSLAVE = 0x8990 SIOCBONDINFOQUERY = 0x8994 SIOCBONDRELEASE = 0x8991 SIOCBONDSETHWADDR = 0x8992 SIOCBONDSLAVEINFOQUERY = 0x8993 SIOCBRADDBR = 0x89a0 SIOCBRADDIF = 0x89a2 SIOCBRDELBR = 0x89a1 SIOCBRDELIF = 0x89a3 SIOCDARP = 0x8953 SIOCDELDLCI = 0x8981 SIOCDELMULTI = 0x8932 SIOCDELRT = 0x890c SIOCDEVPRIVATE = 0x89f0 SIOCDIFADDR = 0x8936 SIOCDRARP = 0x8960 SIOCETHTOOL = 0x8946 SIOCGARP = 0x8954 SIOCGHWTSTAMP = 0x89b1 SIOCGIFADDR = 0x8915 SIOCGIFBR = 0x8940 SIOCGIFBRDADDR = 0x8919 SIOCGIFCONF = 0x8912 SIOCGIFCOUNT = 0x8938 SIOCGIFDSTADDR = 0x8917 SIOCGIFENCAP = 0x8925 SIOCGIFFLAGS = 0x8913 SIOCGIFHWADDR = 0x8927 SIOCGIFINDEX = 0x8933 SIOCGIFMAP = 0x8970 SIOCGIFMEM = 0x891f SIOCGIFMETRIC = 0x891d SIOCGIFMTU = 0x8921 SIOCGIFNAME = 0x8910 SIOCGIFNETMASK = 0x891b SIOCGIFPFLAGS = 0x8935 SIOCGIFSLAVE = 0x8929 SIOCGIFTXQLEN = 0x8942 SIOCGIFVLAN = 0x8982 SIOCGMIIPHY = 0x8947 SIOCGMIIREG = 0x8948 SIOCGPGRP = 0x40047309 SIOCGRARP = 0x8961 SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 SIOCGSTAMPNS = 0x8907 SIOCINQ = 0x467f SIOCOUTQ = 0x7472 SIOCOUTQNSD = 0x894b SIOCPROTOPRIVATE = 0x89e0 SIOCRTMSG = 0x890d SIOCSARP = 0x8955 SIOCSHWTSTAMP = 0x89b0 SIOCSIFADDR = 0x8916 SIOCSIFBR = 0x8941 SIOCSIFBRDADDR = 0x891a SIOCSIFDSTADDR = 0x8918 SIOCSIFENCAP = 0x8926 SIOCSIFFLAGS = 0x8914 SIOCSIFHWADDR = 0x8924 SIOCSIFHWBROADCAST = 0x8937 SIOCSIFLINK = 0x8911 SIOCSIFMAP = 0x8971 SIOCSIFMEM = 0x8920 SIOCSIFMETRIC = 0x891e SIOCSIFMTU = 0x8922 SIOCSIFNAME = 0x8923 SIOCSIFNETMASK = 0x891c SIOCSIFPFLAGS = 0x8934 SIOCSIFSLAVE = 0x8930 SIOCSIFTXQLEN = 0x8943 SIOCSIFVLAN = 0x8983 SIOCSMIIREG = 0x8949 SIOCSPGRP = 0x80047308 SIOCSRARP = 0x8962 SIOCWANDEV = 0x894a SOCK_CLOEXEC = 0x80000 SOCK_DCCP = 0x6 SOCK_DGRAM = 0x1 SOCK_IOC_TYPE = 0x89 SOCK_NONBLOCK = 0x80 SOCK_PACKET = 0xa SOCK_RAW = 0x3 SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x2 SOL_AAL = 0x109 SOL_ALG = 0x117 SOL_ATM = 0x108 SOL_CAIF = 0x116 SOL_CAN_BASE = 0x64 SOL_DCCP = 0x10d SOL_DECNET = 0x105 SOL_ICMPV6 = 0x3a SOL_IP = 0x0 SOL_IPV6 = 0x29 SOL_IRDA = 0x10a SOL_IUCV = 0x115 SOL_KCM = 0x119 SOL_LLC = 0x10c SOL_NETBEUI = 0x10b SOL_NETLINK = 0x10e SOL_NFC = 0x118 SOL_PACKET = 0x107 SOL_PNPIPE = 0x113 SOL_PPPOL2TP = 0x111 SOL_RAW = 0xff SOL_RDS = 0x114 SOL_RXRPC = 0x110 SOL_SOCKET = 0xffff SOL_TCP = 0x6 SOL_TIPC = 0x10f SOL_X25 = 0x106 SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x1009 SO_ATTACH_BPF = 0x32 SO_ATTACH_FILTER = 0x1a SO_ATTACH_REUSEPORT_CBPF = 0x33 SO_ATTACH_REUSEPORT_EBPF = 0x34 SO_BINDTODEVICE = 0x19 SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x20 SO_BSDCOMPAT = 0xe SO_BUSY_POLL = 0x2e SO_CNX_ADVICE = 0x35 SO_COOKIE = 0x39 SO_DEBUG = 0x1 SO_DETACH_BPF = 0x1b SO_DETACH_FILTER = 0x1b SO_DOMAIN = 0x1029 SO_DONTROUTE = 0x10 SO_ERROR = 0x1007 SO_GET_FILTER = 0x1a SO_INCOMING_CPU = 0x31 SO_INCOMING_NAPI_ID = 0x38 SO_KEEPALIVE = 0x8 SO_LINGER = 0x80 SO_LOCK_FILTER = 0x2c SO_MARK = 0x24 SO_MAX_PACING_RATE = 0x2f SO_MEMINFO = 0x37 SO_NOFCS = 0x2b SO_NO_CHECK = 0xb SO_OOBINLINE = 0x100 SO_PASSCRED = 0x11 SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x12 SO_PEERGROUPS = 0x3b SO_PEERNAME = 0x1c SO_PEERSEC = 0x1e SO_PRIORITY = 0xc SO_PROTOCOL = 0x1028 SO_RCVBUF = 0x1002 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x1006 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_RXQ_OVFL = 0x28 SO_SECURITY_AUTHENTICATION = 0x16 SO_SECURITY_ENCRYPTION_NETWORK = 0x18 SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 SO_SELECT_ERR_QUEUE = 0x2d SO_SNDBUF = 0x1001 SO_SNDBUFFORCE = 0x1f SO_SNDLOWAT = 0x1003 SO_SNDTIMEO = 0x1005 SO_STYLE = 0x1008 SO_TIMESTAMP = 0x1d SO_TIMESTAMPING = 0x25 SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x1008 SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 SO_VM_SOCKETS_BUFFER_SIZE = 0x0 SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 SO_VM_SOCKETS_TRUSTED = 0x5 SO_WIFI_STATUS = 0x29 SPLICE_F_GIFT = 0x8 SPLICE_F_MORE = 0x4 SPLICE_F_MOVE = 0x1 SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000 S_IFCHR = 0x2000 S_IFDIR = 0x4000 S_IFIFO = 0x1000 S_IFLNK = 0xa000 S_IFMT = 0xf000 S_IFREG = 0x8000 S_IFSOCK = 0xc000 S_IREAD = 0x100 S_IRGRP = 0x20 S_IROTH = 0x4 S_IRUSR = 0x100 S_IRWXG = 0x38 S_IRWXO = 0x7 S_IRWXU = 0x1c0 S_ISGID = 0x400 S_ISUID = 0x800 S_ISVTX = 0x200 S_IWGRP = 0x10 S_IWOTH = 0x2 S_IWRITE = 0x80 S_IWUSR = 0x80 S_IXGRP = 0x8 S_IXOTH = 0x1 S_IXUSR = 0x40 TAB0 = 0x0 TAB1 = 0x800 TAB2 = 0x1000 TAB3 = 0x1800 TABDLY = 0x1800 TASKSTATS_CMD_ATTR_MAX = 0x4 TASKSTATS_CMD_MAX = 0x2 TASKSTATS_GENL_NAME = "TASKSTATS" TASKSTATS_GENL_VERSION = 0x1 TASKSTATS_TYPE_MAX = 0x6 TASKSTATS_VERSION = 0x8 TCFLSH = 0x5407 TCGETA = 0x5401 TCGETS = 0x540d TCGETS2 = 0x4030542a TCIFLUSH = 0x0 TCIOFF = 0x2 TCIOFLUSH = 0x2 TCION = 0x3 TCOFLUSH = 0x1 TCOOFF = 0x0 TCOON = 0x1 TCP_CC_INFO = 0x1a TCP_CONGESTION = 0xd TCP_COOKIE_IN_ALWAYS = 0x1 TCP_COOKIE_MAX = 0x10 TCP_COOKIE_MIN = 0x8 TCP_COOKIE_OUT_NEVER = 0x2 TCP_COOKIE_PAIR_SIZE = 0x20 TCP_COOKIE_TRANSACTIONS = 0xf TCP_CORK = 0x3 TCP_DEFER_ACCEPT = 0x9 TCP_FASTOPEN = 0x17 TCP_FASTOPEN_CONNECT = 0x1e TCP_INFO = 0xb TCP_KEEPCNT = 0x6 TCP_KEEPIDLE = 0x4 TCP_KEEPINTVL = 0x5 TCP_LINGER2 = 0x8 TCP_MAXSEG = 0x2 TCP_MAXWIN = 0xffff TCP_MAX_WINSHIFT = 0xe TCP_MD5SIG = 0xe TCP_MD5SIG_MAXKEYLEN = 0x50 TCP_MSS = 0x200 TCP_MSS_DEFAULT = 0x218 TCP_MSS_DESIRED = 0x4c4 TCP_NODELAY = 0x1 TCP_NOTSENT_LOWAT = 0x19 TCP_QUEUE_SEQ = 0x15 TCP_QUICKACK = 0xc TCP_REPAIR = 0x13 TCP_REPAIR_OPTIONS = 0x16 TCP_REPAIR_QUEUE = 0x14 TCP_REPAIR_WINDOW = 0x1d TCP_SAVED_SYN = 0x1c TCP_SAVE_SYN = 0x1b TCP_SYNCNT = 0x7 TCP_S_DATA_IN = 0x4 TCP_S_DATA_OUT = 0x8 TCP_THIN_DUPACK = 0x11 TCP_THIN_LINEAR_TIMEOUTS = 0x10 TCP_TIMESTAMP = 0x18 TCP_USER_TIMEOUT = 0x12 TCP_WINDOW_CLAMP = 0xa TCSAFLUSH = 0x5410 TCSBRK = 0x5405 TCSBRKP = 0x5486 TCSETA = 0x5402 TCSETAF = 0x5404 TCSETAW = 0x5403 TCSETS = 0x540e TCSETS2 = 0x8030542b TCSETSF = 0x5410 TCSETSF2 = 0x8030542d TCSETSW = 0x540f TCSETSW2 = 0x8030542c TCXONC = 0x5406 TIOCCBRK = 0x5428 TIOCCONS = 0x80047478 TIOCEXCL = 0x740d TIOCGDEV = 0x40045432 TIOCGETD = 0x7400 TIOCGETP = 0x7408 TIOCGEXCL = 0x40045440 TIOCGICOUNT = 0x5492 TIOCGLCKTRMIOS = 0x548b TIOCGLTC = 0x7474 TIOCGPGRP = 0x40047477 TIOCGPKT = 0x40045438 TIOCGPTLCK = 0x40045439 TIOCGPTN = 0x40045430 TIOCGPTPEER = 0x20005441 TIOCGRS485 = 0x4020542e TIOCGSERIAL = 0x5484 TIOCGSID = 0x7416 TIOCGSOFTCAR = 0x5481 TIOCGWINSZ = 0x40087468 TIOCINQ = 0x467f TIOCLINUX = 0x5483 TIOCMBIC = 0x741c TIOCMBIS = 0x741b TIOCMGET = 0x741d TIOCMIWAIT = 0x5491 TIOCMSET = 0x741a TIOCM_CAR = 0x100 TIOCM_CD = 0x100 TIOCM_CTS = 0x40 TIOCM_DSR = 0x400 TIOCM_DTR = 0x2 TIOCM_LE = 0x1 TIOCM_RI = 0x200 TIOCM_RNG = 0x200 TIOCM_RTS = 0x4 TIOCM_SR = 0x20 TIOCM_ST = 0x10 TIOCNOTTY = 0x5471 TIOCNXCL = 0x740e TIOCOUTQ = 0x7472 TIOCPKT = 0x5470 TIOCPKT_DATA = 0x0 TIOCPKT_DOSTOP = 0x20 TIOCPKT_FLUSHREAD = 0x1 TIOCPKT_FLUSHWRITE = 0x2 TIOCPKT_IOCTL = 0x40 TIOCPKT_NOSTOP = 0x10 TIOCPKT_START = 0x8 TIOCPKT_STOP = 0x4 TIOCSBRK = 0x5427 TIOCSCTTY = 0x5480 TIOCSERCONFIG = 0x5488 TIOCSERGETLSR = 0x548e TIOCSERGETMULTI = 0x548f TIOCSERGSTRUCT = 0x548d TIOCSERGWILD = 0x5489 TIOCSERSETMULTI = 0x5490 TIOCSERSWILD = 0x548a TIOCSER_TEMT = 0x1 TIOCSETD = 0x7401 TIOCSETN = 0x740a TIOCSETP = 0x7409 TIOCSIG = 0x80045436 TIOCSLCKTRMIOS = 0x548c TIOCSLTC = 0x7475 TIOCSPGRP = 0x80047476 TIOCSPTLCK = 0x80045431 TIOCSRS485 = 0xc020542f TIOCSSERIAL = 0x5485 TIOCSSOFTCAR = 0x5482 TIOCSTI = 0x5472 TIOCSWINSZ = 0x80087467 TIOCVHANGUP = 0x5437 TOSTOP = 0x8000 TS_COMM_LEN = 0x20 TUNATTACHFILTER = 0x801054d5 TUNDETACHFILTER = 0x801054d6 TUNGETFEATURES = 0x400454cf TUNGETFILTER = 0x401054db TUNGETIFF = 0x400454d2 TUNGETSNDBUF = 0x400454d3 TUNGETVNETBE = 0x400454df TUNGETVNETHDRSZ = 0x400454d7 TUNGETVNETLE = 0x400454dd TUNSETDEBUG = 0x800454c9 TUNSETGROUP = 0x800454ce TUNSETIFF = 0x800454ca TUNSETIFINDEX = 0x800454da TUNSETLINK = 0x800454cd TUNSETNOCSUM = 0x800454c8 TUNSETOFFLOAD = 0x800454d0 TUNSETOWNER = 0x800454cc TUNSETPERSIST = 0x800454cb TUNSETQUEUE = 0x800454d9 TUNSETSNDBUF = 0x800454d4 TUNSETTXFILTER = 0x800454d1 TUNSETVNETBE = 0x800454de TUNSETVNETHDRSZ = 0x800454d8 TUNSETVNETLE = 0x800454dc UMOUNT_NOFOLLOW = 0x8 UTIME_NOW = 0x3fffffff UTIME_OMIT = 0x3ffffffe VDISCARD = 0xd VEOF = 0x10 VEOL = 0x11 VEOL2 = 0x6 VERASE = 0x2 VINTR = 0x0 VKILL = 0x3 VLNEXT = 0xf VMADDR_CID_ANY = 0xffffffff VMADDR_CID_HOST = 0x2 VMADDR_CID_HYPERVISOR = 0x0 VMADDR_CID_RESERVED = 0x1 VMADDR_PORT_ANY = 0xffffffff VMIN = 0x4 VM_SOCKETS_INVALID_VERSION = 0xffffffff VQUIT = 0x1 VREPRINT = 0xc VSTART = 0x8 VSTOP = 0x9 VSUSP = 0xa VSWTC = 0x7 VSWTCH = 0x7 VT0 = 0x0 VT1 = 0x4000 VTDLY = 0x4000 VTIME = 0x5 VWERASE = 0xe WALL = 0x40000000 WCLONE = 0x80000000 WCONTINUED = 0x8 WDIOC_GETBOOTSTATUS = 0x40045702 WDIOC_GETPRETIMEOUT = 0x40045709 WDIOC_GETSTATUS = 0x40045701 WDIOC_GETSUPPORT = 0x40285700 WDIOC_GETTEMP = 0x40045703 WDIOC_GETTIMELEFT = 0x4004570a WDIOC_GETTIMEOUT = 0x40045707 WDIOC_KEEPALIVE = 0x40045705 WDIOC_SETOPTIONS = 0x40045704 WDIOC_SETPRETIMEOUT = 0xc0045708 WDIOC_SETTIMEOUT = 0xc0045706 WEXITED = 0x4 WNOHANG = 0x1 WNOTHREAD = 0x20000000 WNOWAIT = 0x1000000 WORDSIZE = 0x40 WSTOPPED = 0x2 WUNTRACED = 0x2 XATTR_CREATE = 0x1 XATTR_REPLACE = 0x2 XCASE = 0x4 XTABS = 0x1800 ) // Errors const ( E2BIG = syscall.Errno(0x7) EACCES = syscall.Errno(0xd) EADDRINUSE = syscall.Errno(0x7d) EADDRNOTAVAIL = syscall.Errno(0x7e) EADV = syscall.Errno(0x44) EAFNOSUPPORT = syscall.Errno(0x7c) EAGAIN = syscall.Errno(0xb) EALREADY = syscall.Errno(0x95) EBADE = syscall.Errno(0x32) EBADF = syscall.Errno(0x9) EBADFD = syscall.Errno(0x51) EBADMSG = syscall.Errno(0x4d) EBADR = syscall.Errno(0x33) EBADRQC = syscall.Errno(0x36) EBADSLT = syscall.Errno(0x37) EBFONT = syscall.Errno(0x3b) EBUSY = syscall.Errno(0x10) ECANCELED = syscall.Errno(0x9e) ECHILD = syscall.Errno(0xa) ECHRNG = syscall.Errno(0x25) ECOMM = syscall.Errno(0x46) ECONNABORTED = syscall.Errno(0x82) ECONNREFUSED = syscall.Errno(0x92) ECONNRESET = syscall.Errno(0x83) EDEADLK = syscall.Errno(0x2d) EDEADLOCK = syscall.Errno(0x38) EDESTADDRREQ = syscall.Errno(0x60) EDOM = syscall.Errno(0x21) EDOTDOT = syscall.Errno(0x49) EDQUOT = syscall.Errno(0x46d) EEXIST = syscall.Errno(0x11) EFAULT = syscall.Errno(0xe) EFBIG = syscall.Errno(0x1b) EHOSTDOWN = syscall.Errno(0x93) EHOSTUNREACH = syscall.Errno(0x94) EHWPOISON = syscall.Errno(0xa8) EIDRM = syscall.Errno(0x24) EILSEQ = syscall.Errno(0x58) EINIT = syscall.Errno(0x8d) EINPROGRESS = syscall.Errno(0x96) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x85) EISDIR = syscall.Errno(0x15) EISNAM = syscall.Errno(0x8b) EKEYEXPIRED = syscall.Errno(0xa2) EKEYREJECTED = syscall.Errno(0xa4) EKEYREVOKED = syscall.Errno(0xa3) EL2HLT = syscall.Errno(0x2c) EL2NSYNC = syscall.Errno(0x26) EL3HLT = syscall.Errno(0x27) EL3RST = syscall.Errno(0x28) ELIBACC = syscall.Errno(0x53) ELIBBAD = syscall.Errno(0x54) ELIBEXEC = syscall.Errno(0x57) ELIBMAX = syscall.Errno(0x56) ELIBSCN = syscall.Errno(0x55) ELNRNG = syscall.Errno(0x29) ELOOP = syscall.Errno(0x5a) EMEDIUMTYPE = syscall.Errno(0xa0) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) EMSGSIZE = syscall.Errno(0x61) EMULTIHOP = syscall.Errno(0x4a) ENAMETOOLONG = syscall.Errno(0x4e) ENAVAIL = syscall.Errno(0x8a) ENETDOWN = syscall.Errno(0x7f) ENETRESET = syscall.Errno(0x81) ENETUNREACH = syscall.Errno(0x80) ENFILE = syscall.Errno(0x17) ENOANO = syscall.Errno(0x35) ENOBUFS = syscall.Errno(0x84) ENOCSI = syscall.Errno(0x2b) ENODATA = syscall.Errno(0x3d) ENODEV = syscall.Errno(0x13) ENOENT = syscall.Errno(0x2) ENOEXEC = syscall.Errno(0x8) ENOKEY = syscall.Errno(0xa1) ENOLCK = syscall.Errno(0x2e) ENOLINK = syscall.Errno(0x43) ENOMEDIUM = syscall.Errno(0x9f) ENOMEM = syscall.Errno(0xc) ENOMSG = syscall.Errno(0x23) ENONET = syscall.Errno(0x40) ENOPKG = syscall.Errno(0x41) ENOPROTOOPT = syscall.Errno(0x63) ENOSPC = syscall.Errno(0x1c) ENOSR = syscall.Errno(0x3f) ENOSTR = syscall.Errno(0x3c) ENOSYS = syscall.Errno(0x59) ENOTBLK = syscall.Errno(0xf) ENOTCONN = syscall.Errno(0x86) ENOTDIR = syscall.Errno(0x14) ENOTEMPTY = syscall.Errno(0x5d) ENOTNAM = syscall.Errno(0x89) ENOTRECOVERABLE = syscall.Errno(0xa6) ENOTSOCK = syscall.Errno(0x5f) ENOTSUP = syscall.Errno(0x7a) ENOTTY = syscall.Errno(0x19) ENOTUNIQ = syscall.Errno(0x50) ENXIO = syscall.Errno(0x6) EOPNOTSUPP = syscall.Errno(0x7a) EOVERFLOW = syscall.Errno(0x4f) EOWNERDEAD = syscall.Errno(0xa5) EPERM = syscall.Errno(0x1) EPFNOSUPPORT = syscall.Errno(0x7b) EPIPE = syscall.Errno(0x20) EPROTO = syscall.Errno(0x47) EPROTONOSUPPORT = syscall.Errno(0x78) EPROTOTYPE = syscall.Errno(0x62) ERANGE = syscall.Errno(0x22) EREMCHG = syscall.Errno(0x52) EREMDEV = syscall.Errno(0x8e) EREMOTE = syscall.Errno(0x42) EREMOTEIO = syscall.Errno(0x8c) ERESTART = syscall.Errno(0x5b) ERFKILL = syscall.Errno(0xa7) EROFS = syscall.Errno(0x1e) ESHUTDOWN = syscall.Errno(0x8f) ESOCKTNOSUPPORT = syscall.Errno(0x79) ESPIPE = syscall.Errno(0x1d) ESRCH = syscall.Errno(0x3) ESRMNT = syscall.Errno(0x45) ESTALE = syscall.Errno(0x97) ESTRPIPE = syscall.Errno(0x5c) ETIME = syscall.Errno(0x3e) ETIMEDOUT = syscall.Errno(0x91) ETOOMANYREFS = syscall.Errno(0x90) ETXTBSY = syscall.Errno(0x1a) EUCLEAN = syscall.Errno(0x87) EUNATCH = syscall.Errno(0x2a) EUSERS = syscall.Errno(0x5e) EWOULDBLOCK = syscall.Errno(0xb) EXDEV = syscall.Errno(0x12) EXFULL = syscall.Errno(0x34) ) // Signals const ( SIGABRT = syscall.Signal(0x6) SIGALRM = syscall.Signal(0xe) SIGBUS = syscall.Signal(0xa) SIGCHLD = syscall.Signal(0x12) SIGCLD = syscall.Signal(0x12) SIGCONT = syscall.Signal(0x19) SIGEMT = syscall.Signal(0x7) SIGFPE = syscall.Signal(0x8) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x16) SIGIOT = syscall.Signal(0x6) SIGKILL = syscall.Signal(0x9) SIGPIPE = syscall.Signal(0xd) SIGPOLL = syscall.Signal(0x16) SIGPROF = syscall.Signal(0x1d) SIGPWR = syscall.Signal(0x13) SIGQUIT = syscall.Signal(0x3) SIGSEGV = syscall.Signal(0xb) SIGSTOP = syscall.Signal(0x17) SIGSYS = syscall.Signal(0xc) SIGTERM = syscall.Signal(0xf) SIGTRAP = syscall.Signal(0x5) SIGTSTP = syscall.Signal(0x18) SIGTTIN = syscall.Signal(0x1a) SIGTTOU = syscall.Signal(0x1b) SIGURG = syscall.Signal(0x15) SIGUSR1 = syscall.Signal(0x10) SIGUSR2 = syscall.Signal(0x11) SIGVTALRM = syscall.Signal(0x1c) SIGWINCH = syscall.Signal(0x14) SIGXCPU = syscall.Signal(0x1e) SIGXFSZ = syscall.Signal(0x1f) ) // Error table var errors = [...]string{ 1: "operation not permitted", 2: "no such file or directory", 3: "no such process", 4: "interrupted system call", 5: "input/output error", 6: "no such device or address", 7: "argument list too long", 8: "exec format error", 9: "bad file descriptor", 10: "no child processes", 11: "resource temporarily unavailable", 12: "cannot allocate memory", 13: "permission denied", 14: "bad address", 15: "block device required", 16: "device or resource busy", 17: "file exists", 18: "invalid cross-device link", 19: "no such device", 20: "not a directory", 21: "is a directory", 22: "invalid argument", 23: "too many open files in system", 24: "too many open files", 25: "inappropriate ioctl for device", 26: "text file busy", 27: "file too large", 28: "no space left on device", 29: "illegal seek", 30: "read-only file system", 31: "too many links", 32: "broken pipe", 33: "numerical argument out of domain", 34: "numerical result out of range", 35: "no message of desired type", 36: "identifier removed", 37: "channel number out of range", 38: "level 2 not synchronized", 39: "level 3 halted", 40: "level 3 reset", 41: "link number out of range", 42: "protocol driver not attached", 43: "no CSI structure available", 44: "level 2 halted", 45: "resource deadlock avoided", 46: "no locks available", 50: "invalid exchange", 51: "invalid request descriptor", 52: "exchange full", 53: "no anode", 54: "invalid request code", 55: "invalid slot", 56: "file locking deadlock error", 59: "bad font file format", 60: "device not a stream", 61: "no data available", 62: "timer expired", 63: "out of streams resources", 64: "machine is not on the network", 65: "package not installed", 66: "object is remote", 67: "link has been severed", 68: "advertise error", 69: "srmount error", 70: "communication error on send", 71: "protocol error", 73: "RFS specific error", 74: "multihop attempted", 77: "bad message", 78: "file name too long", 79: "value too large for defined data type", 80: "name not unique on network", 81: "file descriptor in bad state", 82: "remote address changed", 83: "can not access a needed shared library", 84: "accessing a corrupted shared library", 85: ".lib section in a.out corrupted", 86: "attempting to link in too many shared libraries", 87: "cannot exec a shared library directly", 88: "invalid or incomplete multibyte or wide character", 89: "function not implemented", 90: "too many levels of symbolic links", 91: "interrupted system call should be restarted", 92: "streams pipe error", 93: "directory not empty", 94: "too many users", 95: "socket operation on non-socket", 96: "destination address required", 97: "message too long", 98: "protocol wrong type for socket", 99: "protocol not available", 120: "protocol not supported", 121: "socket type not supported", 122: "operation not supported", 123: "protocol family not supported", 124: "address family not supported by protocol", 125: "address already in use", 126: "cannot assign requested address", 127: "network is down", 128: "network is unreachable", 129: "network dropped connection on reset", 130: "software caused connection abort", 131: "connection reset by peer", 132: "no buffer space available", 133: "transport endpoint is already connected", 134: "transport endpoint is not connected", 135: "structure needs cleaning", 137: "not a XENIX named type file", 138: "no XENIX semaphores available", 139: "is a named type file", 140: "remote I/O error", 141: "unknown error 141", 142: "unknown error 142", 143: "cannot send after transport endpoint shutdown", 144: "too many references: cannot splice", 145: "connection timed out", 146: "connection refused", 147: "host is down", 148: "no route to host", 149: "operation already in progress", 150: "operation now in progress", 151: "stale file handle", 158: "operation canceled", 159: "no medium found", 160: "wrong medium type", 161: "required key not available", 162: "key has expired", 163: "key has been revoked", 164: "key was rejected by service", 165: "owner died", 166: "state not recoverable", 167: "operation not possible due to RF-kill", 168: "memory page has hardware error", 1133: "disk quota exceeded", } // Signal table var signals = [...]string{ 1: "hangup", 2: "interrupt", 3: "quit", 4: "illegal instruction", 5: "trace/breakpoint trap", 6: "aborted", 7: "EMT trap", 8: "floating point exception", 9: "killed", 10: "bus error", 11: "segmentation fault", 12: "bad system call", 13: "broken pipe", 14: "alarm clock", 15: "terminated", 16: "user defined signal 1", 17: "user defined signal 2", 18: "child exited", 19: "power failure", 20: "window changed", 21: "urgent I/O condition", 22: "I/O possible", 23: "stopped (signal)", 24: "stopped", 25: "continued", 26: "stopped (tty input)", 27: "stopped (tty output)", 28: "virtual timer expired", 29: "profiling timer expired", 30: "CPU time limit exceeded", 31: "file size limit exceeded", } ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go ================================================ // mkerrors.sh -Wall -Werror -static -I/tmp/include // Code generated by the command above; see README.md. DO NOT EDIT. // +build mipsle,linux // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go package unix import "syscall" const ( AF_ALG = 0x26 AF_APPLETALK = 0x5 AF_ASH = 0x12 AF_ATMPVC = 0x8 AF_ATMSVC = 0x14 AF_AX25 = 0x3 AF_BLUETOOTH = 0x1f AF_BRIDGE = 0x7 AF_CAIF = 0x25 AF_CAN = 0x1d AF_DECnet = 0xc AF_ECONET = 0x13 AF_FILE = 0x1 AF_IB = 0x1b AF_IEEE802154 = 0x24 AF_INET = 0x2 AF_INET6 = 0xa AF_IPX = 0x4 AF_IRDA = 0x17 AF_ISDN = 0x22 AF_IUCV = 0x20 AF_KCM = 0x29 AF_KEY = 0xf AF_LLC = 0x1a AF_LOCAL = 0x1 AF_MAX = 0x2c AF_MPLS = 0x1c AF_NETBEUI = 0xd AF_NETLINK = 0x10 AF_NETROM = 0x6 AF_NFC = 0x27 AF_PACKET = 0x11 AF_PHONET = 0x23 AF_PPPOX = 0x18 AF_QIPCRTR = 0x2a AF_RDS = 0x15 AF_ROSE = 0xb AF_ROUTE = 0x10 AF_RXRPC = 0x21 AF_SECURITY = 0xe AF_SMC = 0x2b AF_SNA = 0x16 AF_TIPC = 0x1e AF_UNIX = 0x1 AF_UNSPEC = 0x0 AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 ALG_OP_DECRYPT = 0x0 ALG_OP_ENCRYPT = 0x1 ALG_SET_AEAD_ASSOCLEN = 0x4 ALG_SET_AEAD_AUTHSIZE = 0x5 ALG_SET_IV = 0x2 ALG_SET_KEY = 0x1 ALG_SET_OP = 0x3 ARPHRD_6LOWPAN = 0x339 ARPHRD_ADAPT = 0x108 ARPHRD_APPLETLK = 0x8 ARPHRD_ARCNET = 0x7 ARPHRD_ASH = 0x30d ARPHRD_ATM = 0x13 ARPHRD_AX25 = 0x3 ARPHRD_BIF = 0x307 ARPHRD_CAIF = 0x336 ARPHRD_CAN = 0x118 ARPHRD_CHAOS = 0x5 ARPHRD_CISCO = 0x201 ARPHRD_CSLIP = 0x101 ARPHRD_CSLIP6 = 0x103 ARPHRD_DDCMP = 0x205 ARPHRD_DLCI = 0xf ARPHRD_ECONET = 0x30e ARPHRD_EETHER = 0x2 ARPHRD_ETHER = 0x1 ARPHRD_EUI64 = 0x1b ARPHRD_FCAL = 0x311 ARPHRD_FCFABRIC = 0x313 ARPHRD_FCPL = 0x312 ARPHRD_FCPP = 0x310 ARPHRD_FDDI = 0x306 ARPHRD_FRAD = 0x302 ARPHRD_HDLC = 0x201 ARPHRD_HIPPI = 0x30c ARPHRD_HWX25 = 0x110 ARPHRD_IEEE1394 = 0x18 ARPHRD_IEEE802 = 0x6 ARPHRD_IEEE80211 = 0x321 ARPHRD_IEEE80211_PRISM = 0x322 ARPHRD_IEEE80211_RADIOTAP = 0x323 ARPHRD_IEEE802154 = 0x324 ARPHRD_IEEE802154_MONITOR = 0x325 ARPHRD_IEEE802_TR = 0x320 ARPHRD_INFINIBAND = 0x20 ARPHRD_IP6GRE = 0x337 ARPHRD_IPDDP = 0x309 ARPHRD_IPGRE = 0x30a ARPHRD_IRDA = 0x30f ARPHRD_LAPB = 0x204 ARPHRD_LOCALTLK = 0x305 ARPHRD_LOOPBACK = 0x304 ARPHRD_METRICOM = 0x17 ARPHRD_NETLINK = 0x338 ARPHRD_NETROM = 0x0 ARPHRD_NONE = 0xfffe ARPHRD_PHONET = 0x334 ARPHRD_PHONET_PIPE = 0x335 ARPHRD_PIMREG = 0x30b ARPHRD_PPP = 0x200 ARPHRD_PRONET = 0x4 ARPHRD_RAWHDLC = 0x206 ARPHRD_ROSE = 0x10e ARPHRD_RSRVD = 0x104 ARPHRD_SIT = 0x308 ARPHRD_SKIP = 0x303 ARPHRD_SLIP = 0x100 ARPHRD_SLIP6 = 0x102 ARPHRD_TUNNEL = 0x300 ARPHRD_TUNNEL6 = 0x301 ARPHRD_VOID = 0xffff ARPHRD_VSOCKMON = 0x33a ARPHRD_X25 = 0x10f B0 = 0x0 B1000000 = 0x1008 B110 = 0x3 B115200 = 0x1002 B1152000 = 0x1009 B1200 = 0x9 B134 = 0x4 B150 = 0x5 B1500000 = 0x100a B1800 = 0xa B19200 = 0xe B200 = 0x6 B2000000 = 0x100b B230400 = 0x1003 B2400 = 0xb B2500000 = 0x100c B300 = 0x7 B3000000 = 0x100d B3500000 = 0x100e B38400 = 0xf B4000000 = 0x100f B460800 = 0x1004 B4800 = 0xc B50 = 0x1 B500000 = 0x1005 B57600 = 0x1001 B576000 = 0x1006 B600 = 0x8 B75 = 0x2 B921600 = 0x1007 B9600 = 0xd BLKBSZGET = 0x40041270 BLKBSZSET = 0x80041271 BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40041272 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d BLKRRPART = 0x2000125f BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 BOTHER = 0x1000 BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALU = 0x4 BPF_AND = 0x50 BPF_B = 0x10 BPF_DIV = 0x30 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 BPF_JA = 0x0 BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 BPF_JMP = 0x5 BPF_JSET = 0x40 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 BPF_LEN = 0x80 BPF_LL_OFF = -0x200000 BPF_LSH = 0x60 BPF_MAJOR_VERSION = 0x1 BPF_MAXINSNS = 0x1000 BPF_MEM = 0x60 BPF_MEMWORDS = 0x10 BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MOD = 0x90 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_NET_OFF = -0x100000 BPF_OR = 0x40 BPF_RET = 0x6 BPF_RSH = 0x70 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 BPF_TAX = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 BPF_XOR = 0xa0 BRKINT = 0x2 BS0 = 0x0 BS1 = 0x2000 BSDLY = 0x2000 CAN_BCM = 0x2 CAN_EFF_FLAG = 0x80000000 CAN_EFF_ID_BITS = 0x1d CAN_EFF_MASK = 0x1fffffff CAN_ERR_FLAG = 0x20000000 CAN_ERR_MASK = 0x1fffffff CAN_INV_FILTER = 0x20000000 CAN_ISOTP = 0x6 CAN_MAX_DLC = 0x8 CAN_MAX_DLEN = 0x8 CAN_MCNET = 0x5 CAN_MTU = 0x10 CAN_NPROTO = 0x7 CAN_RAW = 0x1 CAN_RAW_FILTER_MAX = 0x200 CAN_RTR_FLAG = 0x40000000 CAN_SFF_ID_BITS = 0xb CAN_SFF_MASK = 0x7ff CAN_TP16 = 0x3 CAN_TP20 = 0x4 CBAUD = 0x100f CBAUDEX = 0x1000 CFLUSH = 0xf CIBAUD = 0x100f0000 CLOCAL = 0x800 CLOCK_BOOTTIME = 0x7 CLOCK_BOOTTIME_ALARM = 0x9 CLOCK_DEFAULT = 0x0 CLOCK_EXT = 0x1 CLOCK_INT = 0x2 CLOCK_MONOTONIC = 0x1 CLOCK_MONOTONIC_COARSE = 0x6 CLOCK_MONOTONIC_RAW = 0x4 CLOCK_PROCESS_CPUTIME_ID = 0x2 CLOCK_REALTIME = 0x0 CLOCK_REALTIME_ALARM = 0x8 CLOCK_REALTIME_COARSE = 0x5 CLOCK_TAI = 0xb CLOCK_THREAD_CPUTIME_ID = 0x3 CLOCK_TXFROMRX = 0x4 CLOCK_TXINT = 0x3 CLONE_CHILD_CLEARTID = 0x200000 CLONE_CHILD_SETTID = 0x1000000 CLONE_DETACHED = 0x400000 CLONE_FILES = 0x400 CLONE_FS = 0x200 CLONE_IO = 0x80000000 CLONE_NEWCGROUP = 0x2000000 CLONE_NEWIPC = 0x8000000 CLONE_NEWNET = 0x40000000 CLONE_NEWNS = 0x20000 CLONE_NEWPID = 0x20000000 CLONE_NEWUSER = 0x10000000 CLONE_NEWUTS = 0x4000000 CLONE_PARENT = 0x8000 CLONE_PARENT_SETTID = 0x100000 CLONE_PTRACE = 0x2000 CLONE_SETTLS = 0x80000 CLONE_SIGHAND = 0x800 CLONE_SYSVSEM = 0x40000 CLONE_THREAD = 0x10000 CLONE_UNTRACED = 0x800000 CLONE_VFORK = 0x4000 CLONE_VM = 0x100 CMSPAR = 0x40000000 CR0 = 0x0 CR1 = 0x200 CR2 = 0x400 CR3 = 0x600 CRDLY = 0x600 CREAD = 0x80 CRTSCTS = 0x80000000 CS5 = 0x0 CS6 = 0x10 CS7 = 0x20 CS8 = 0x30 CSIGNAL = 0xff CSIZE = 0x30 CSTART = 0x11 CSTATUS = 0x0 CSTOP = 0x13 CSTOPB = 0x40 CSUSP = 0x1a DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 DT_FIFO = 0x1 DT_LNK = 0xa DT_REG = 0x8 DT_SOCK = 0xc DT_UNKNOWN = 0x0 DT_WHT = 0xe ECHO = 0x8 ECHOCTL = 0x200 ECHOE = 0x10 ECHOK = 0x20 ECHOKE = 0x800 ECHONL = 0x40 ECHOPRT = 0x400 EFD_CLOEXEC = 0x80000 EFD_NONBLOCK = 0x80 EFD_SEMAPHORE = 0x1 ENCODING_DEFAULT = 0x0 ENCODING_FM_MARK = 0x3 ENCODING_FM_SPACE = 0x4 ENCODING_MANCHESTER = 0x5 ENCODING_NRZ = 0x1 ENCODING_NRZI = 0x2 EPOLLERR = 0x8 EPOLLET = 0x80000000 EPOLLEXCLUSIVE = 0x10000000 EPOLLHUP = 0x10 EPOLLIN = 0x1 EPOLLMSG = 0x400 EPOLLONESHOT = 0x40000000 EPOLLOUT = 0x4 EPOLLPRI = 0x2 EPOLLRDBAND = 0x80 EPOLLRDHUP = 0x2000 EPOLLRDNORM = 0x40 EPOLLWAKEUP = 0x20000000 EPOLLWRBAND = 0x200 EPOLLWRNORM = 0x100 EPOLL_CLOEXEC = 0x80000 EPOLL_CTL_ADD = 0x1 EPOLL_CTL_DEL = 0x2 EPOLL_CTL_MOD = 0x3 ETH_P_1588 = 0x88f7 ETH_P_8021AD = 0x88a8 ETH_P_8021AH = 0x88e7 ETH_P_8021Q = 0x8100 ETH_P_80221 = 0x8917 ETH_P_802_2 = 0x4 ETH_P_802_3 = 0x1 ETH_P_802_3_MIN = 0x600 ETH_P_802_EX1 = 0x88b5 ETH_P_AARP = 0x80f3 ETH_P_AF_IUCV = 0xfbfb ETH_P_ALL = 0x3 ETH_P_AOE = 0x88a2 ETH_P_ARCNET = 0x1a ETH_P_ARP = 0x806 ETH_P_ATALK = 0x809b ETH_P_ATMFATE = 0x8884 ETH_P_ATMMPOA = 0x884c ETH_P_AX25 = 0x2 ETH_P_BATMAN = 0x4305 ETH_P_BPQ = 0x8ff ETH_P_CAIF = 0xf7 ETH_P_CAN = 0xc ETH_P_CANFD = 0xd ETH_P_CONTROL = 0x16 ETH_P_CUST = 0x6006 ETH_P_DDCMP = 0x6 ETH_P_DEC = 0x6000 ETH_P_DIAG = 0x6005 ETH_P_DNA_DL = 0x6001 ETH_P_DNA_RC = 0x6002 ETH_P_DNA_RT = 0x6003 ETH_P_DSA = 0x1b ETH_P_ECONET = 0x18 ETH_P_EDSA = 0xdada ETH_P_FCOE = 0x8906 ETH_P_FIP = 0x8914 ETH_P_HDLC = 0x19 ETH_P_HSR = 0x892f ETH_P_IBOE = 0x8915 ETH_P_IEEE802154 = 0xf6 ETH_P_IEEEPUP = 0xa00 ETH_P_IEEEPUPAT = 0xa01 ETH_P_IP = 0x800 ETH_P_IPV6 = 0x86dd ETH_P_IPX = 0x8137 ETH_P_IRDA = 0x17 ETH_P_LAT = 0x6004 ETH_P_LINK_CTL = 0x886c ETH_P_LOCALTALK = 0x9 ETH_P_LOOP = 0x60 ETH_P_LOOPBACK = 0x9000 ETH_P_MACSEC = 0x88e5 ETH_P_MOBITEX = 0x15 ETH_P_MPLS_MC = 0x8848 ETH_P_MPLS_UC = 0x8847 ETH_P_MVRP = 0x88f5 ETH_P_NCSI = 0x88f8 ETH_P_PAE = 0x888e ETH_P_PAUSE = 0x8808 ETH_P_PHONET = 0xf5 ETH_P_PPPTALK = 0x10 ETH_P_PPP_DISC = 0x8863 ETH_P_PPP_MP = 0x8 ETH_P_PPP_SES = 0x8864 ETH_P_PRP = 0x88fb ETH_P_PUP = 0x200 ETH_P_PUPAT = 0x201 ETH_P_QINQ1 = 0x9100 ETH_P_QINQ2 = 0x9200 ETH_P_QINQ3 = 0x9300 ETH_P_RARP = 0x8035 ETH_P_SCA = 0x6007 ETH_P_SLOW = 0x8809 ETH_P_SNAP = 0x5 ETH_P_TDLS = 0x890d ETH_P_TEB = 0x6558 ETH_P_TIPC = 0x88ca ETH_P_TRAILER = 0x1c ETH_P_TR_802_2 = 0x11 ETH_P_TSN = 0x22f0 ETH_P_WAN_PPP = 0x7 ETH_P_WCCP = 0x883e ETH_P_X25 = 0x805 ETH_P_XDSA = 0xf8 EXTA = 0xe EXTB = 0xf EXTPROC = 0x10000 FALLOC_FL_COLLAPSE_RANGE = 0x8 FALLOC_FL_INSERT_RANGE = 0x20 FALLOC_FL_KEEP_SIZE = 0x1 FALLOC_FL_NO_HIDE_STALE = 0x4 FALLOC_FL_PUNCH_HOLE = 0x2 FALLOC_FL_UNSHARE_RANGE = 0x40 FALLOC_FL_ZERO_RANGE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 FF1 = 0x8000 FFDLY = 0x8000 FLUSHO = 0x2000 FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 FS_ENCRYPTION_MODE_INVALID = 0x0 FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 FS_KEY_DESCRIPTOR_SIZE = 0x8 FS_KEY_DESC_PREFIX = "fscrypt:" FS_KEY_DESC_PREFIX_SIZE = 0x8 FS_MAX_KEY_SIZE = 0x40 FS_POLICY_FLAGS_PAD_16 = 0x2 FS_POLICY_FLAGS_PAD_32 = 0x3 FS_POLICY_FLAGS_PAD_4 = 0x0 FS_POLICY_FLAGS_PAD_8 = 0x1 FS_POLICY_FLAGS_PAD_MASK = 0x3 FS_POLICY_FLAGS_VALID = 0x3 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0x406 F_EXLCK = 0x4 F_GETFD = 0x1 F_GETFL = 0x3 F_GETLEASE = 0x401 F_GETLK = 0x21 F_GETLK64 = 0x21 F_GETOWN = 0x17 F_GETOWN_EX = 0x10 F_GETPIPE_SZ = 0x408 F_GETSIG = 0xb F_LOCK = 0x1 F_NOTIFY = 0x402 F_OFD_GETLK = 0x24 F_OFD_SETLK = 0x25 F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 F_SETFD = 0x2 F_SETFL = 0x4 F_SETLEASE = 0x400 F_SETLK = 0x22 F_SETLK64 = 0x22 F_SETLKW = 0x23 F_SETLKW64 = 0x23 F_SETOWN = 0x18 F_SETOWN_EX = 0xf F_SETPIPE_SZ = 0x407 F_SETSIG = 0xa F_SHLCK = 0x8 F_TEST = 0x3 F_TLOCK = 0x2 F_ULOCK = 0x0 F_UNLCK = 0x2 F_WRLCK = 0x1 GENL_ADMIN_PERM = 0x1 GENL_CMD_CAP_DO = 0x2 GENL_CMD_CAP_DUMP = 0x4 GENL_CMD_CAP_HASPOL = 0x8 GENL_HDRLEN = 0x4 GENL_ID_CTRL = 0x10 GENL_ID_PMCRAID = 0x12 GENL_ID_VFS_DQUOT = 0x11 GENL_MAX_ID = 0x3ff GENL_MIN_ID = 0x10 GENL_NAMSIZ = 0x10 GENL_START_ALLOC = 0x13 GENL_UNS_ADMIN_PERM = 0x10 GRND_NONBLOCK = 0x1 GRND_RANDOM = 0x2 HUPCL = 0x400 IBSHIFT = 0x10 ICANON = 0x2 ICMPV6_FILTER = 0x1 ICRNL = 0x100 IEXTEN = 0x100 IFA_F_DADFAILED = 0x8 IFA_F_DEPRECATED = 0x20 IFA_F_HOMEADDRESS = 0x10 IFA_F_MANAGETEMPADDR = 0x100 IFA_F_MCAUTOJOIN = 0x400 IFA_F_NODAD = 0x2 IFA_F_NOPREFIXROUTE = 0x200 IFA_F_OPTIMISTIC = 0x4 IFA_F_PERMANENT = 0x80 IFA_F_SECONDARY = 0x1 IFA_F_STABLE_PRIVACY = 0x800 IFA_F_TEMPORARY = 0x1 IFA_F_TENTATIVE = 0x40 IFA_MAX = 0x8 IFF_ALLMULTI = 0x200 IFF_ATTACH_QUEUE = 0x200 IFF_AUTOMEDIA = 0x4000 IFF_BROADCAST = 0x2 IFF_DEBUG = 0x4 IFF_DETACH_QUEUE = 0x400 IFF_DORMANT = 0x20000 IFF_DYNAMIC = 0x8000 IFF_ECHO = 0x40000 IFF_LOOPBACK = 0x8 IFF_LOWER_UP = 0x10000 IFF_MASTER = 0x400 IFF_MULTICAST = 0x1000 IFF_MULTI_QUEUE = 0x100 IFF_NOARP = 0x80 IFF_NOFILTER = 0x1000 IFF_NOTRAILERS = 0x20 IFF_NO_PI = 0x1000 IFF_ONE_QUEUE = 0x2000 IFF_PERSIST = 0x800 IFF_POINTOPOINT = 0x10 IFF_PORTSEL = 0x2000 IFF_PROMISC = 0x100 IFF_RUNNING = 0x40 IFF_SLAVE = 0x800 IFF_TAP = 0x2 IFF_TUN = 0x1 IFF_TUN_EXCL = 0x8000 IFF_UP = 0x1 IFF_VNET_HDR = 0x4000 IFF_VOLATILE = 0x70c5a IFNAMSIZ = 0x10 IGNBRK = 0x1 IGNCR = 0x80 IGNPAR = 0x4 IMAXBEL = 0x2000 INLCR = 0x40 INPCK = 0x10 IN_ACCESS = 0x1 IN_ALL_EVENTS = 0xfff IN_ATTRIB = 0x4 IN_CLASSA_HOST = 0xffffff IN_CLASSA_MAX = 0x80 IN_CLASSA_NET = 0xff000000 IN_CLASSA_NSHIFT = 0x18 IN_CLASSB_HOST = 0xffff IN_CLASSB_MAX = 0x10000 IN_CLASSB_NET = 0xffff0000 IN_CLASSB_NSHIFT = 0x10 IN_CLASSC_HOST = 0xff IN_CLASSC_NET = 0xffffff00 IN_CLASSC_NSHIFT = 0x8 IN_CLOEXEC = 0x80000 IN_CLOSE = 0x18 IN_CLOSE_NOWRITE = 0x10 IN_CLOSE_WRITE = 0x8 IN_CREATE = 0x100 IN_DELETE = 0x200 IN_DELETE_SELF = 0x400 IN_DONT_FOLLOW = 0x2000000 IN_EXCL_UNLINK = 0x4000000 IN_IGNORED = 0x8000 IN_ISDIR = 0x40000000 IN_LOOPBACKNET = 0x7f IN_MASK_ADD = 0x20000000 IN_MODIFY = 0x2 IN_MOVE = 0xc0 IN_MOVED_FROM = 0x40 IN_MOVED_TO = 0x80 IN_MOVE_SELF = 0x800 IN_NONBLOCK = 0x80 IN_ONESHOT = 0x80000000 IN_ONLYDIR = 0x1000000 IN_OPEN = 0x20 IN_Q_OVERFLOW = 0x4000 IN_UNMOUNT = 0x2000 IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 IPPROTO_AH = 0x33 IPPROTO_BEETPH = 0x5e IPPROTO_COMP = 0x6c IPPROTO_DCCP = 0x21 IPPROTO_DSTOPTS = 0x3c IPPROTO_EGP = 0x8 IPPROTO_ENCAP = 0x62 IPPROTO_ESP = 0x32 IPPROTO_FRAGMENT = 0x2c IPPROTO_GRE = 0x2f IPPROTO_HOPOPTS = 0x0 IPPROTO_ICMP = 0x1 IPPROTO_ICMPV6 = 0x3a IPPROTO_IDP = 0x16 IPPROTO_IGMP = 0x2 IPPROTO_IP = 0x0 IPPROTO_IPIP = 0x4 IPPROTO_IPV6 = 0x29 IPPROTO_MH = 0x87 IPPROTO_MPLS = 0x89 IPPROTO_MTP = 0x5c IPPROTO_NONE = 0x3b IPPROTO_PIM = 0x67 IPPROTO_PUP = 0xc IPPROTO_RAW = 0xff IPPROTO_ROUTING = 0x2b IPPROTO_RSVP = 0x2e IPPROTO_SCTP = 0x84 IPPROTO_TCP = 0x6 IPPROTO_TP = 0x1d IPPROTO_UDP = 0x11 IPPROTO_UDPLITE = 0x88 IPV6_2292DSTOPTS = 0x4 IPV6_2292HOPLIMIT = 0x8 IPV6_2292HOPOPTS = 0x3 IPV6_2292PKTINFO = 0x2 IPV6_2292PKTOPTIONS = 0x6 IPV6_2292RTHDR = 0x5 IPV6_ADDRFORM = 0x1 IPV6_ADDR_PREFERENCES = 0x48 IPV6_ADD_MEMBERSHIP = 0x14 IPV6_AUTHHDR = 0xa IPV6_AUTOFLOWLABEL = 0x46 IPV6_CHECKSUM = 0x7 IPV6_DONTFRAG = 0x3e IPV6_DROP_MEMBERSHIP = 0x15 IPV6_DSTOPTS = 0x3b IPV6_HDRINCL = 0x24 IPV6_HOPLIMIT = 0x34 IPV6_HOPOPTS = 0x36 IPV6_IPSEC_POLICY = 0x22 IPV6_JOIN_ANYCAST = 0x1b IPV6_JOIN_GROUP = 0x14 IPV6_LEAVE_ANYCAST = 0x1c IPV6_LEAVE_GROUP = 0x15 IPV6_MINHOPCOUNT = 0x49 IPV6_MTU = 0x18 IPV6_MTU_DISCOVER = 0x17 IPV6_MULTICAST_HOPS = 0x12 IPV6_MULTICAST_IF = 0x11 IPV6_MULTICAST_LOOP = 0x13 IPV6_NEXTHOP = 0x9 IPV6_ORIGDSTADDR = 0x4a IPV6_PATHMTU = 0x3d IPV6_PKTINFO = 0x32 IPV6_PMTUDISC_DO = 0x2 IPV6_PMTUDISC_DONT = 0x0 IPV6_PMTUDISC_INTERFACE = 0x4 IPV6_PMTUDISC_OMIT = 0x5 IPV6_PMTUDISC_PROBE = 0x3 IPV6_PMTUDISC_WANT = 0x1 IPV6_RECVDSTOPTS = 0x3a IPV6_RECVERR = 0x19 IPV6_RECVFRAGSIZE = 0x4d IPV6_RECVHOPLIMIT = 0x33 IPV6_RECVHOPOPTS = 0x35 IPV6_RECVORIGDSTADDR = 0x4a IPV6_RECVPATHMTU = 0x3c IPV6_RECVPKTINFO = 0x31 IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 IPV6_RTHDR_STRICT = 0x1 IPV6_RTHDR_TYPE_0 = 0x0 IPV6_RXDSTOPTS = 0x3b IPV6_RXHOPOPTS = 0x36 IPV6_TCLASS = 0x43 IPV6_TRANSPARENT = 0x4b IPV6_UNICAST_HOPS = 0x10 IPV6_UNICAST_IF = 0x4c IPV6_V6ONLY = 0x1a IPV6_XFRM_POLICY = 0x23 IP_ADD_MEMBERSHIP = 0x23 IP_ADD_SOURCE_MEMBERSHIP = 0x27 IP_BIND_ADDRESS_NO_PORT = 0x18 IP_BLOCK_SOURCE = 0x26 IP_CHECKSUM = 0x17 IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 IP_DROP_MEMBERSHIP = 0x24 IP_DROP_SOURCE_MEMBERSHIP = 0x28 IP_FREEBIND = 0xf IP_HDRINCL = 0x3 IP_IPSEC_POLICY = 0x10 IP_MAXPACKET = 0xffff IP_MAX_MEMBERSHIPS = 0x14 IP_MF = 0x2000 IP_MINTTL = 0x15 IP_MSFILTER = 0x29 IP_MSS = 0x240 IP_MTU = 0xe IP_MTU_DISCOVER = 0xa IP_MULTICAST_ALL = 0x31 IP_MULTICAST_IF = 0x20 IP_MULTICAST_LOOP = 0x22 IP_MULTICAST_TTL = 0x21 IP_NODEFRAG = 0x16 IP_OFFMASK = 0x1fff IP_OPTIONS = 0x4 IP_ORIGDSTADDR = 0x14 IP_PASSSEC = 0x12 IP_PKTINFO = 0x8 IP_PKTOPTIONS = 0x9 IP_PMTUDISC = 0xa IP_PMTUDISC_DO = 0x2 IP_PMTUDISC_DONT = 0x0 IP_PMTUDISC_INTERFACE = 0x4 IP_PMTUDISC_OMIT = 0x5 IP_PMTUDISC_PROBE = 0x3 IP_PMTUDISC_WANT = 0x1 IP_RECVERR = 0xb IP_RECVFRAGSIZE = 0x19 IP_RECVOPTS = 0x6 IP_RECVORIGDSTADDR = 0x14 IP_RECVRETOPTS = 0x7 IP_RECVTOS = 0xd IP_RECVTTL = 0xc IP_RETOPTS = 0x7 IP_RF = 0x8000 IP_ROUTER_ALERT = 0x5 IP_TOS = 0x1 IP_TRANSPARENT = 0x13 IP_TTL = 0x2 IP_UNBLOCK_SOURCE = 0x25 IP_UNICAST_IF = 0x32 IP_XFRM_POLICY = 0x11 ISIG = 0x1 ISTRIP = 0x20 IUCLC = 0x200 IUTF8 = 0x4000 IXANY = 0x800 IXOFF = 0x1000 IXON = 0x400 KEYCTL_ASSUME_AUTHORITY = 0x10 KEYCTL_CHOWN = 0x4 KEYCTL_CLEAR = 0x7 KEYCTL_DESCRIBE = 0x6 KEYCTL_DH_COMPUTE = 0x17 KEYCTL_GET_KEYRING_ID = 0x0 KEYCTL_GET_PERSISTENT = 0x16 KEYCTL_GET_SECURITY = 0x11 KEYCTL_INSTANTIATE = 0xc KEYCTL_INSTANTIATE_IOV = 0x14 KEYCTL_INVALIDATE = 0x15 KEYCTL_JOIN_SESSION_KEYRING = 0x1 KEYCTL_LINK = 0x8 KEYCTL_NEGATE = 0xd KEYCTL_READ = 0xb KEYCTL_REJECT = 0x13 KEYCTL_RESTRICT_KEYRING = 0x1d KEYCTL_REVOKE = 0x3 KEYCTL_SEARCH = 0xa KEYCTL_SESSION_TO_PARENT = 0x12 KEYCTL_SETPERM = 0x5 KEYCTL_SET_REQKEY_KEYRING = 0xe KEYCTL_SET_TIMEOUT = 0xf KEYCTL_UNLINK = 0x9 KEYCTL_UPDATE = 0x2 KEY_REQKEY_DEFL_DEFAULT = 0x0 KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 KEY_REQKEY_DEFL_NO_CHANGE = -0x1 KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 KEY_REQKEY_DEFL_USER_KEYRING = 0x4 KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 KEY_SPEC_GROUP_KEYRING = -0x6 KEY_SPEC_PROCESS_KEYRING = -0x2 KEY_SPEC_REQKEY_AUTH_KEY = -0x7 KEY_SPEC_REQUESTOR_KEYRING = -0x8 KEY_SPEC_SESSION_KEYRING = -0x3 KEY_SPEC_THREAD_KEYRING = -0x1 KEY_SPEC_USER_KEYRING = -0x4 KEY_SPEC_USER_SESSION_KEYRING = -0x5 LINUX_REBOOT_CMD_CAD_OFF = 0x0 LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef LINUX_REBOOT_CMD_HALT = 0xcdef0123 LINUX_REBOOT_CMD_KEXEC = 0x45584543 LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc LINUX_REBOOT_CMD_RESTART = 0x1234567 LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 LINUX_REBOOT_MAGIC1 = 0xfee1dead LINUX_REBOOT_MAGIC2 = 0x28121969 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 MADV_DONTFORK = 0xa MADV_DONTNEED = 0x4 MADV_FREE = 0x8 MADV_HUGEPAGE = 0xe MADV_HWPOISON = 0x64 MADV_MERGEABLE = 0xc MADV_NOHUGEPAGE = 0xf MADV_NORMAL = 0x0 MADV_RANDOM = 0x1 MADV_REMOVE = 0x9 MADV_SEQUENTIAL = 0x2 MADV_UNMERGEABLE = 0xd MADV_WILLNEED = 0x3 MAP_ANON = 0x800 MAP_ANONYMOUS = 0x800 MAP_DENYWRITE = 0x2000 MAP_EXECUTABLE = 0x4000 MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_GROWSDOWN = 0x1000 MAP_HUGETLB = 0x80000 MAP_HUGE_MASK = 0x3f MAP_HUGE_SHIFT = 0x1a MAP_LOCKED = 0x8000 MAP_NONBLOCK = 0x20000 MAP_NORESERVE = 0x400 MAP_POPULATE = 0x10000 MAP_PRIVATE = 0x2 MAP_RENAME = 0x800 MAP_SHARED = 0x1 MAP_STACK = 0x40000 MAP_TYPE = 0xf MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MCL_ONFAULT = 0x4 MNT_DETACH = 0x2 MNT_EXPIRE = 0x4 MNT_FORCE = 0x1 MSG_BATCH = 0x40000 MSG_CMSG_CLOEXEC = 0x40000000 MSG_CONFIRM = 0x800 MSG_CTRUNC = 0x8 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x40 MSG_EOR = 0x80 MSG_ERRQUEUE = 0x2000 MSG_FASTOPEN = 0x20000000 MSG_FIN = 0x200 MSG_MORE = 0x8000 MSG_NOSIGNAL = 0x4000 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_PROXY = 0x10 MSG_RST = 0x1000 MSG_SYN = 0x400 MSG_TRUNC = 0x20 MSG_TRYHARD = 0x4 MSG_WAITALL = 0x100 MSG_WAITFORONE = 0x10000 MS_ACTIVE = 0x40000000 MS_ASYNC = 0x1 MS_BIND = 0x1000 MS_BORN = 0x20000000 MS_DIRSYNC = 0x80 MS_INVALIDATE = 0x2 MS_I_VERSION = 0x800000 MS_KERNMOUNT = 0x400000 MS_LAZYTIME = 0x2000000 MS_MANDLOCK = 0x40 MS_MGC_MSK = 0xffff0000 MS_MGC_VAL = 0xc0ed0000 MS_MOVE = 0x2000 MS_NOATIME = 0x400 MS_NODEV = 0x4 MS_NODIRATIME = 0x800 MS_NOEXEC = 0x8 MS_NOREMOTELOCK = 0x8000000 MS_NOSEC = 0x10000000 MS_NOSUID = 0x2 MS_NOUSER = -0x80000000 MS_POSIXACL = 0x10000 MS_PRIVATE = 0x40000 MS_RDONLY = 0x1 MS_REC = 0x4000 MS_RELATIME = 0x200000 MS_REMOUNT = 0x20 MS_RMT_MASK = 0x2800051 MS_SHARED = 0x100000 MS_SILENT = 0x8000 MS_SLAVE = 0x80000 MS_STRICTATIME = 0x1000000 MS_SUBMOUNT = 0x4000000 MS_SYNC = 0x4 MS_SYNCHRONOUS = 0x10 MS_UNBINDABLE = 0x20000 MS_VERBOSE = 0x8000 NAME_MAX = 0xff NETLINK_ADD_MEMBERSHIP = 0x1 NETLINK_AUDIT = 0x9 NETLINK_BROADCAST_ERROR = 0x4 NETLINK_CAP_ACK = 0xa NETLINK_CONNECTOR = 0xb NETLINK_CRYPTO = 0x15 NETLINK_DNRTMSG = 0xe NETLINK_DROP_MEMBERSHIP = 0x2 NETLINK_ECRYPTFS = 0x13 NETLINK_EXT_ACK = 0xb NETLINK_FIB_LOOKUP = 0xa NETLINK_FIREWALL = 0x3 NETLINK_GENERIC = 0x10 NETLINK_INET_DIAG = 0x4 NETLINK_IP6_FW = 0xd NETLINK_ISCSI = 0x8 NETLINK_KOBJECT_UEVENT = 0xf NETLINK_LISTEN_ALL_NSID = 0x8 NETLINK_LIST_MEMBERSHIPS = 0x9 NETLINK_NETFILTER = 0xc NETLINK_NFLOG = 0x5 NETLINK_NO_ENOBUFS = 0x5 NETLINK_PKTINFO = 0x3 NETLINK_RDMA = 0x14 NETLINK_ROUTE = 0x0 NETLINK_RX_RING = 0x6 NETLINK_SCSITRANSPORT = 0x12 NETLINK_SELINUX = 0x7 NETLINK_SMC = 0x16 NETLINK_SOCK_DIAG = 0x4 NETLINK_TX_RING = 0x7 NETLINK_UNUSED = 0x1 NETLINK_USERSOCK = 0x2 NETLINK_XFRM = 0x6 NL0 = 0x0 NL1 = 0x100 NLA_ALIGNTO = 0x4 NLA_F_NESTED = 0x8000 NLA_F_NET_BYTEORDER = 0x4000 NLA_HDRLEN = 0x4 NLDLY = 0x100 NLMSG_ALIGNTO = 0x4 NLMSG_DONE = 0x3 NLMSG_ERROR = 0x2 NLMSG_HDRLEN = 0x10 NLMSG_MIN_TYPE = 0x10 NLMSG_NOOP = 0x1 NLMSG_OVERRUN = 0x4 NLM_F_ACK = 0x4 NLM_F_ACK_TLVS = 0x200 NLM_F_APPEND = 0x800 NLM_F_ATOMIC = 0x400 NLM_F_CAPPED = 0x100 NLM_F_CREATE = 0x400 NLM_F_DUMP = 0x300 NLM_F_DUMP_FILTERED = 0x20 NLM_F_DUMP_INTR = 0x10 NLM_F_ECHO = 0x8 NLM_F_EXCL = 0x200 NLM_F_MATCH = 0x200 NLM_F_MULTI = 0x2 NLM_F_REPLACE = 0x100 NLM_F_REQUEST = 0x1 NLM_F_ROOT = 0x100 NOFLSH = 0x80 OCRNL = 0x8 OFDEL = 0x80 OFILL = 0x40 OLCUC = 0x2 ONLCR = 0x4 ONLRET = 0x20 ONOCR = 0x10 OPOST = 0x1 O_ACCMODE = 0x3 O_APPEND = 0x8 O_ASYNC = 0x1000 O_CLOEXEC = 0x80000 O_CREAT = 0x100 O_DIRECT = 0x8000 O_DIRECTORY = 0x10000 O_DSYNC = 0x10 O_EXCL = 0x400 O_FSYNC = 0x4010 O_LARGEFILE = 0x2000 O_NDELAY = 0x80 O_NOATIME = 0x40000 O_NOCTTY = 0x800 O_NOFOLLOW = 0x20000 O_NONBLOCK = 0x80 O_PATH = 0x200000 O_RDONLY = 0x0 O_RDWR = 0x2 O_RSYNC = 0x4010 O_SYNC = 0x4010 O_TMPFILE = 0x410000 O_TRUNC = 0x200 O_WRONLY = 0x1 PACKET_ADD_MEMBERSHIP = 0x1 PACKET_AUXDATA = 0x8 PACKET_BROADCAST = 0x1 PACKET_COPY_THRESH = 0x7 PACKET_DROP_MEMBERSHIP = 0x2 PACKET_FANOUT = 0x12 PACKET_FANOUT_CBPF = 0x6 PACKET_FANOUT_CPU = 0x2 PACKET_FANOUT_DATA = 0x16 PACKET_FANOUT_EBPF = 0x7 PACKET_FANOUT_FLAG_DEFRAG = 0x8000 PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 PACKET_FANOUT_HASH = 0x0 PACKET_FANOUT_LB = 0x1 PACKET_FANOUT_QM = 0x5 PACKET_FANOUT_RND = 0x4 PACKET_FANOUT_ROLLOVER = 0x3 PACKET_FASTROUTE = 0x6 PACKET_HDRLEN = 0xb PACKET_HOST = 0x0 PACKET_KERNEL = 0x7 PACKET_LOOPBACK = 0x5 PACKET_LOSS = 0xe PACKET_MR_ALLMULTI = 0x2 PACKET_MR_MULTICAST = 0x0 PACKET_MR_PROMISC = 0x1 PACKET_MR_UNICAST = 0x3 PACKET_MULTICAST = 0x2 PACKET_ORIGDEV = 0x9 PACKET_OTHERHOST = 0x3 PACKET_OUTGOING = 0x4 PACKET_QDISC_BYPASS = 0x14 PACKET_RECV_OUTPUT = 0x3 PACKET_RESERVE = 0xc PACKET_ROLLOVER_STATS = 0x15 PACKET_RX_RING = 0x5 PACKET_STATISTICS = 0x6 PACKET_TIMESTAMP = 0x11 PACKET_TX_HAS_OFF = 0x13 PACKET_TX_RING = 0xd PACKET_TX_TIMESTAMP = 0x10 PACKET_USER = 0x6 PACKET_VERSION = 0xa PACKET_VNET_HDR = 0xf PARENB = 0x100 PARITY_CRC16_PR0 = 0x2 PARITY_CRC16_PR0_CCITT = 0x4 PARITY_CRC16_PR1 = 0x3 PARITY_CRC16_PR1_CCITT = 0x5 PARITY_CRC32_PR0_CCITT = 0x6 PARITY_CRC32_PR1_CCITT = 0x7 PARITY_DEFAULT = 0x0 PARITY_NONE = 0x1 PARMRK = 0x8 PARODD = 0x200 PENDIN = 0x4000 PERF_EVENT_IOC_DISABLE = 0x20002401 PERF_EVENT_IOC_ENABLE = 0x20002400 PERF_EVENT_IOC_ID = 0x40042407 PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 PERF_EVENT_IOC_PERIOD = 0x80082404 PERF_EVENT_IOC_REFRESH = 0x20002402 PERF_EVENT_IOC_RESET = 0x20002403 PERF_EVENT_IOC_SET_BPF = 0x80042408 PERF_EVENT_IOC_SET_FILTER = 0x80042406 PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 PROT_EXEC = 0x4 PROT_GROWSDOWN = 0x1000000 PROT_GROWSUP = 0x2000000 PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 PR_CAPBSET_DROP = 0x18 PR_CAPBSET_READ = 0x17 PR_CAP_AMBIENT = 0x2f PR_CAP_AMBIENT_CLEAR_ALL = 0x4 PR_CAP_AMBIENT_IS_SET = 0x1 PR_CAP_AMBIENT_LOWER = 0x3 PR_CAP_AMBIENT_RAISE = 0x2 PR_ENDIAN_BIG = 0x0 PR_ENDIAN_LITTLE = 0x1 PR_ENDIAN_PPC_LITTLE = 0x2 PR_FPEMU_NOPRINT = 0x1 PR_FPEMU_SIGFPE = 0x2 PR_FP_EXC_ASYNC = 0x2 PR_FP_EXC_DISABLED = 0x0 PR_FP_EXC_DIV = 0x10000 PR_FP_EXC_INV = 0x100000 PR_FP_EXC_NONRECOV = 0x1 PR_FP_EXC_OVF = 0x20000 PR_FP_EXC_PRECISE = 0x3 PR_FP_EXC_RES = 0x80000 PR_FP_EXC_SW_ENABLE = 0x80 PR_FP_EXC_UND = 0x40000 PR_FP_MODE_FR = 0x1 PR_FP_MODE_FRE = 0x2 PR_GET_CHILD_SUBREAPER = 0x25 PR_GET_DUMPABLE = 0x3 PR_GET_ENDIAN = 0x13 PR_GET_FPEMU = 0x9 PR_GET_FPEXC = 0xb PR_GET_FP_MODE = 0x2e PR_GET_KEEPCAPS = 0x7 PR_GET_NAME = 0x10 PR_GET_NO_NEW_PRIVS = 0x27 PR_GET_PDEATHSIG = 0x2 PR_GET_SECCOMP = 0x15 PR_GET_SECUREBITS = 0x1b PR_GET_THP_DISABLE = 0x2a PR_GET_TID_ADDRESS = 0x28 PR_GET_TIMERSLACK = 0x1e PR_GET_TIMING = 0xd PR_GET_TSC = 0x19 PR_GET_UNALIGN = 0x5 PR_MCE_KILL = 0x21 PR_MCE_KILL_CLEAR = 0x0 PR_MCE_KILL_DEFAULT = 0x2 PR_MCE_KILL_EARLY = 0x1 PR_MCE_KILL_GET = 0x22 PR_MCE_KILL_LATE = 0x0 PR_MCE_KILL_SET = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b PR_SET_CHILD_SUBREAPER = 0x24 PR_SET_DUMPABLE = 0x4 PR_SET_ENDIAN = 0x14 PR_SET_FPEMU = 0xa PR_SET_FPEXC = 0xc PR_SET_FP_MODE = 0x2d PR_SET_KEEPCAPS = 0x8 PR_SET_MM = 0x23 PR_SET_MM_ARG_END = 0x9 PR_SET_MM_ARG_START = 0x8 PR_SET_MM_AUXV = 0xc PR_SET_MM_BRK = 0x7 PR_SET_MM_END_CODE = 0x2 PR_SET_MM_END_DATA = 0x4 PR_SET_MM_ENV_END = 0xb PR_SET_MM_ENV_START = 0xa PR_SET_MM_EXE_FILE = 0xd PR_SET_MM_MAP = 0xe PR_SET_MM_MAP_SIZE = 0xf PR_SET_MM_START_BRK = 0x6 PR_SET_MM_START_CODE = 0x1 PR_SET_MM_START_DATA = 0x3 PR_SET_MM_START_STACK = 0x5 PR_SET_NAME = 0xf PR_SET_NO_NEW_PRIVS = 0x26 PR_SET_PDEATHSIG = 0x1 PR_SET_PTRACER = 0x59616d61 PR_SET_PTRACER_ANY = 0xffffffff PR_SET_SECCOMP = 0x16 PR_SET_SECUREBITS = 0x1c PR_SET_THP_DISABLE = 0x29 PR_SET_TIMERSLACK = 0x1d PR_SET_TIMING = 0xe PR_SET_TSC = 0x1a PR_SET_UNALIGN = 0x6 PR_TASK_PERF_EVENTS_DISABLE = 0x1f PR_TASK_PERF_EVENTS_ENABLE = 0x20 PR_TIMING_STATISTICAL = 0x0 PR_TIMING_TIMESTAMP = 0x1 PR_TSC_ENABLE = 0x1 PR_TSC_SIGSEGV = 0x2 PR_UNALIGN_NOPRINT = 0x1 PR_UNALIGN_SIGBUS = 0x2 PTRACE_ATTACH = 0x10 PTRACE_CONT = 0x7 PTRACE_DETACH = 0x11 PTRACE_EVENT_CLONE = 0x3 PTRACE_EVENT_EXEC = 0x4 PTRACE_EVENT_EXIT = 0x6 PTRACE_EVENT_FORK = 0x1 PTRACE_EVENT_SECCOMP = 0x7 PTRACE_EVENT_STOP = 0x80 PTRACE_EVENT_VFORK = 0x2 PTRACE_EVENT_VFORK_DONE = 0x5 PTRACE_GETEVENTMSG = 0x4201 PTRACE_GETFPREGS = 0xe PTRACE_GETREGS = 0xc PTRACE_GETREGSET = 0x4204 PTRACE_GETSIGINFO = 0x4202 PTRACE_GETSIGMASK = 0x420a PTRACE_GET_THREAD_AREA = 0x19 PTRACE_GET_THREAD_AREA_3264 = 0xc4 PTRACE_GET_WATCH_REGS = 0xd0 PTRACE_INTERRUPT = 0x4207 PTRACE_KILL = 0x8 PTRACE_LISTEN = 0x4208 PTRACE_OLDSETOPTIONS = 0x15 PTRACE_O_EXITKILL = 0x100000 PTRACE_O_MASK = 0x3000ff PTRACE_O_SUSPEND_SECCOMP = 0x200000 PTRACE_O_TRACECLONE = 0x8 PTRACE_O_TRACEEXEC = 0x10 PTRACE_O_TRACEEXIT = 0x40 PTRACE_O_TRACEFORK = 0x2 PTRACE_O_TRACESECCOMP = 0x80 PTRACE_O_TRACESYSGOOD = 0x1 PTRACE_O_TRACEVFORK = 0x4 PTRACE_O_TRACEVFORKDONE = 0x20 PTRACE_PEEKDATA = 0x2 PTRACE_PEEKDATA_3264 = 0xc1 PTRACE_PEEKSIGINFO = 0x4209 PTRACE_PEEKSIGINFO_SHARED = 0x1 PTRACE_PEEKTEXT = 0x1 PTRACE_PEEKTEXT_3264 = 0xc0 PTRACE_PEEKUSR = 0x3 PTRACE_POKEDATA = 0x5 PTRACE_POKEDATA_3264 = 0xc3 PTRACE_POKETEXT = 0x4 PTRACE_POKETEXT_3264 = 0xc2 PTRACE_POKEUSR = 0x6 PTRACE_SECCOMP_GET_FILTER = 0x420c PTRACE_SEIZE = 0x4206 PTRACE_SETFPREGS = 0xf PTRACE_SETOPTIONS = 0x4200 PTRACE_SETREGS = 0xd PTRACE_SETREGSET = 0x4205 PTRACE_SETSIGINFO = 0x4203 PTRACE_SETSIGMASK = 0x420b PTRACE_SET_THREAD_AREA = 0x1a PTRACE_SET_WATCH_REGS = 0xd1 PTRACE_SINGLESTEP = 0x9 PTRACE_SYSCALL = 0x18 PTRACE_TRACEME = 0x0 RLIMIT_AS = 0x6 RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 RLIMIT_LOCKS = 0xa RLIMIT_MEMLOCK = 0x9 RLIMIT_MSGQUEUE = 0xc RLIMIT_NICE = 0xd RLIMIT_NOFILE = 0x5 RLIMIT_NPROC = 0x8 RLIMIT_RSS = 0x7 RLIMIT_RTPRIO = 0xe RLIMIT_RTTIME = 0xf RLIMIT_SIGPENDING = 0xb RLIMIT_STACK = 0x3 RLIM_INFINITY = 0xffffffffffffffff RTAX_ADVMSS = 0x8 RTAX_CC_ALGO = 0x10 RTAX_CWND = 0x7 RTAX_FEATURES = 0xc RTAX_FEATURE_ALLFRAG = 0x8 RTAX_FEATURE_ECN = 0x1 RTAX_FEATURE_MASK = 0xf RTAX_FEATURE_SACK = 0x2 RTAX_FEATURE_TIMESTAMP = 0x4 RTAX_HOPLIMIT = 0xa RTAX_INITCWND = 0xb RTAX_INITRWND = 0xe RTAX_LOCK = 0x1 RTAX_MAX = 0x10 RTAX_MTU = 0x2 RTAX_QUICKACK = 0xf RTAX_REORDERING = 0x9 RTAX_RTO_MIN = 0xd RTAX_RTT = 0x4 RTAX_RTTVAR = 0x5 RTAX_SSTHRESH = 0x6 RTAX_UNSPEC = 0x0 RTAX_WINDOW = 0x3 RTA_ALIGNTO = 0x4 RTA_MAX = 0x1a RTCF_DIRECTSRC = 0x4000000 RTCF_DOREDIRECT = 0x1000000 RTCF_LOG = 0x2000000 RTCF_MASQ = 0x400000 RTCF_NAT = 0x800000 RTCF_VALVE = 0x200000 RTF_ADDRCLASSMASK = 0xf8000000 RTF_ADDRCONF = 0x40000 RTF_ALLONLINK = 0x20000 RTF_BROADCAST = 0x10000000 RTF_CACHE = 0x1000000 RTF_DEFAULT = 0x10000 RTF_DYNAMIC = 0x10 RTF_FLOW = 0x2000000 RTF_GATEWAY = 0x2 RTF_HOST = 0x4 RTF_INTERFACE = 0x40000000 RTF_IRTT = 0x100 RTF_LINKRT = 0x100000 RTF_LOCAL = 0x80000000 RTF_MODIFIED = 0x20 RTF_MSS = 0x40 RTF_MTU = 0x40 RTF_MULTICAST = 0x20000000 RTF_NAT = 0x8000000 RTF_NOFORWARD = 0x1000 RTF_NONEXTHOP = 0x200000 RTF_NOPMTUDISC = 0x4000 RTF_POLICY = 0x4000000 RTF_REINSTATE = 0x8 RTF_REJECT = 0x200 RTF_STATIC = 0x400 RTF_THROW = 0x2000 RTF_UP = 0x1 RTF_WINDOW = 0x80 RTF_XRESOLVE = 0x800 RTM_BASE = 0x10 RTM_DELACTION = 0x31 RTM_DELADDR = 0x15 RTM_DELADDRLABEL = 0x49 RTM_DELLINK = 0x11 RTM_DELMDB = 0x55 RTM_DELNEIGH = 0x1d RTM_DELNETCONF = 0x51 RTM_DELNSID = 0x59 RTM_DELQDISC = 0x25 RTM_DELROUTE = 0x19 RTM_DELRULE = 0x21 RTM_DELTCLASS = 0x29 RTM_DELTFILTER = 0x2d RTM_F_CLONED = 0x200 RTM_F_EQUALIZE = 0x400 RTM_F_FIB_MATCH = 0x2000 RTM_F_LOOKUP_TABLE = 0x1000 RTM_F_NOTIFY = 0x100 RTM_F_PREFIX = 0x800 RTM_GETACTION = 0x32 RTM_GETADDR = 0x16 RTM_GETADDRLABEL = 0x4a RTM_GETANYCAST = 0x3e RTM_GETDCB = 0x4e RTM_GETLINK = 0x12 RTM_GETMDB = 0x56 RTM_GETMULTICAST = 0x3a RTM_GETNEIGH = 0x1e RTM_GETNEIGHTBL = 0x42 RTM_GETNETCONF = 0x52 RTM_GETNSID = 0x5a RTM_GETQDISC = 0x26 RTM_GETROUTE = 0x1a RTM_GETRULE = 0x22 RTM_GETSTATS = 0x5e RTM_GETTCLASS = 0x2a RTM_GETTFILTER = 0x2e RTM_MAX = 0x63 RTM_NEWACTION = 0x30 RTM_NEWADDR = 0x14 RTM_NEWADDRLABEL = 0x48 RTM_NEWCACHEREPORT = 0x60 RTM_NEWLINK = 0x10 RTM_NEWMDB = 0x54 RTM_NEWNDUSEROPT = 0x44 RTM_NEWNEIGH = 0x1c RTM_NEWNEIGHTBL = 0x40 RTM_NEWNETCONF = 0x50 RTM_NEWNSID = 0x58 RTM_NEWPREFIX = 0x34 RTM_NEWQDISC = 0x24 RTM_NEWROUTE = 0x18 RTM_NEWRULE = 0x20 RTM_NEWSTATS = 0x5c RTM_NEWTCLASS = 0x28 RTM_NEWTFILTER = 0x2c RTM_NR_FAMILIES = 0x15 RTM_NR_MSGTYPES = 0x54 RTM_SETDCB = 0x4f RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 RTNH_ALIGNTO = 0x4 RTNH_COMPARE_MASK = 0x19 RTNH_F_DEAD = 0x1 RTNH_F_LINKDOWN = 0x10 RTNH_F_OFFLOAD = 0x8 RTNH_F_ONLINK = 0x4 RTNH_F_PERVASIVE = 0x2 RTNH_F_UNRESOLVED = 0x20 RTN_MAX = 0xb RTPROT_BABEL = 0x2a RTPROT_BIRD = 0xc RTPROT_BOOT = 0x3 RTPROT_DHCP = 0x10 RTPROT_DNROUTED = 0xd RTPROT_GATED = 0x8 RTPROT_KERNEL = 0x2 RTPROT_MROUTED = 0x11 RTPROT_MRT = 0xa RTPROT_NTK = 0xf RTPROT_RA = 0x9 RTPROT_REDIRECT = 0x1 RTPROT_STATIC = 0x4 RTPROT_UNSPEC = 0x0 RTPROT_XORP = 0xe RTPROT_ZEBRA = 0xb RT_CLASS_DEFAULT = 0xfd RT_CLASS_LOCAL = 0xff RT_CLASS_MAIN = 0xfe RT_CLASS_MAX = 0xff RT_CLASS_UNSPEC = 0x0 RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 RUSAGE_THREAD = 0x1 SCM_CREDENTIALS = 0x2 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x1d SCM_TIMESTAMPING = 0x25 SCM_TIMESTAMPING_OPT_STATS = 0x36 SCM_TIMESTAMPING_PKTINFO = 0x3a SCM_TIMESTAMPNS = 0x23 SCM_WIFI_STATUS = 0x29 SECCOMP_MODE_DISABLED = 0x0 SECCOMP_MODE_FILTER = 0x2 SECCOMP_MODE_STRICT = 0x1 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 SIOCADDDLCI = 0x8980 SIOCADDMULTI = 0x8931 SIOCADDRT = 0x890b SIOCATMARK = 0x40047307 SIOCBONDCHANGEACTIVE = 0x8995 SIOCBONDENSLAVE = 0x8990 SIOCBONDINFOQUERY = 0x8994 SIOCBONDRELEASE = 0x8991 SIOCBONDSETHWADDR = 0x8992 SIOCBONDSLAVEINFOQUERY = 0x8993 SIOCBRADDBR = 0x89a0 SIOCBRADDIF = 0x89a2 SIOCBRDELBR = 0x89a1 SIOCBRDELIF = 0x89a3 SIOCDARP = 0x8953 SIOCDELDLCI = 0x8981 SIOCDELMULTI = 0x8932 SIOCDELRT = 0x890c SIOCDEVPRIVATE = 0x89f0 SIOCDIFADDR = 0x8936 SIOCDRARP = 0x8960 SIOCETHTOOL = 0x8946 SIOCGARP = 0x8954 SIOCGHWTSTAMP = 0x89b1 SIOCGIFADDR = 0x8915 SIOCGIFBR = 0x8940 SIOCGIFBRDADDR = 0x8919 SIOCGIFCONF = 0x8912 SIOCGIFCOUNT = 0x8938 SIOCGIFDSTADDR = 0x8917 SIOCGIFENCAP = 0x8925 SIOCGIFFLAGS = 0x8913 SIOCGIFHWADDR = 0x8927 SIOCGIFINDEX = 0x8933 SIOCGIFMAP = 0x8970 SIOCGIFMEM = 0x891f SIOCGIFMETRIC = 0x891d SIOCGIFMTU = 0x8921 SIOCGIFNAME = 0x8910 SIOCGIFNETMASK = 0x891b SIOCGIFPFLAGS = 0x8935 SIOCGIFSLAVE = 0x8929 SIOCGIFTXQLEN = 0x8942 SIOCGIFVLAN = 0x8982 SIOCGMIIPHY = 0x8947 SIOCGMIIREG = 0x8948 SIOCGPGRP = 0x40047309 SIOCGRARP = 0x8961 SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 SIOCGSTAMPNS = 0x8907 SIOCINQ = 0x467f SIOCOUTQ = 0x7472 SIOCOUTQNSD = 0x894b SIOCPROTOPRIVATE = 0x89e0 SIOCRTMSG = 0x890d SIOCSARP = 0x8955 SIOCSHWTSTAMP = 0x89b0 SIOCSIFADDR = 0x8916 SIOCSIFBR = 0x8941 SIOCSIFBRDADDR = 0x891a SIOCSIFDSTADDR = 0x8918 SIOCSIFENCAP = 0x8926 SIOCSIFFLAGS = 0x8914 SIOCSIFHWADDR = 0x8924 SIOCSIFHWBROADCAST = 0x8937 SIOCSIFLINK = 0x8911 SIOCSIFMAP = 0x8971 SIOCSIFMEM = 0x8920 SIOCSIFMETRIC = 0x891e SIOCSIFMTU = 0x8922 SIOCSIFNAME = 0x8923 SIOCSIFNETMASK = 0x891c SIOCSIFPFLAGS = 0x8934 SIOCSIFSLAVE = 0x8930 SIOCSIFTXQLEN = 0x8943 SIOCSIFVLAN = 0x8983 SIOCSMIIREG = 0x8949 SIOCSPGRP = 0x80047308 SIOCSRARP = 0x8962 SIOCWANDEV = 0x894a SOCK_CLOEXEC = 0x80000 SOCK_DCCP = 0x6 SOCK_DGRAM = 0x1 SOCK_IOC_TYPE = 0x89 SOCK_NONBLOCK = 0x80 SOCK_PACKET = 0xa SOCK_RAW = 0x3 SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x2 SOL_AAL = 0x109 SOL_ALG = 0x117 SOL_ATM = 0x108 SOL_CAIF = 0x116 SOL_CAN_BASE = 0x64 SOL_DCCP = 0x10d SOL_DECNET = 0x105 SOL_ICMPV6 = 0x3a SOL_IP = 0x0 SOL_IPV6 = 0x29 SOL_IRDA = 0x10a SOL_IUCV = 0x115 SOL_KCM = 0x119 SOL_LLC = 0x10c SOL_NETBEUI = 0x10b SOL_NETLINK = 0x10e SOL_NFC = 0x118 SOL_PACKET = 0x107 SOL_PNPIPE = 0x113 SOL_PPPOL2TP = 0x111 SOL_RAW = 0xff SOL_RDS = 0x114 SOL_RXRPC = 0x110 SOL_SOCKET = 0xffff SOL_TCP = 0x6 SOL_TIPC = 0x10f SOL_X25 = 0x106 SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x1009 SO_ATTACH_BPF = 0x32 SO_ATTACH_FILTER = 0x1a SO_ATTACH_REUSEPORT_CBPF = 0x33 SO_ATTACH_REUSEPORT_EBPF = 0x34 SO_BINDTODEVICE = 0x19 SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x20 SO_BSDCOMPAT = 0xe SO_BUSY_POLL = 0x2e SO_CNX_ADVICE = 0x35 SO_COOKIE = 0x39 SO_DEBUG = 0x1 SO_DETACH_BPF = 0x1b SO_DETACH_FILTER = 0x1b SO_DOMAIN = 0x1029 SO_DONTROUTE = 0x10 SO_ERROR = 0x1007 SO_GET_FILTER = 0x1a SO_INCOMING_CPU = 0x31 SO_INCOMING_NAPI_ID = 0x38 SO_KEEPALIVE = 0x8 SO_LINGER = 0x80 SO_LOCK_FILTER = 0x2c SO_MARK = 0x24 SO_MAX_PACING_RATE = 0x2f SO_MEMINFO = 0x37 SO_NOFCS = 0x2b SO_NO_CHECK = 0xb SO_OOBINLINE = 0x100 SO_PASSCRED = 0x11 SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x12 SO_PEERGROUPS = 0x3b SO_PEERNAME = 0x1c SO_PEERSEC = 0x1e SO_PRIORITY = 0xc SO_PROTOCOL = 0x1028 SO_RCVBUF = 0x1002 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x1006 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_RXQ_OVFL = 0x28 SO_SECURITY_AUTHENTICATION = 0x16 SO_SECURITY_ENCRYPTION_NETWORK = 0x18 SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 SO_SELECT_ERR_QUEUE = 0x2d SO_SNDBUF = 0x1001 SO_SNDBUFFORCE = 0x1f SO_SNDLOWAT = 0x1003 SO_SNDTIMEO = 0x1005 SO_STYLE = 0x1008 SO_TIMESTAMP = 0x1d SO_TIMESTAMPING = 0x25 SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x1008 SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 SO_VM_SOCKETS_BUFFER_SIZE = 0x0 SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 SO_VM_SOCKETS_TRUSTED = 0x5 SO_WIFI_STATUS = 0x29 SPLICE_F_GIFT = 0x8 SPLICE_F_MORE = 0x4 SPLICE_F_MOVE = 0x1 SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000 S_IFCHR = 0x2000 S_IFDIR = 0x4000 S_IFIFO = 0x1000 S_IFLNK = 0xa000 S_IFMT = 0xf000 S_IFREG = 0x8000 S_IFSOCK = 0xc000 S_IREAD = 0x100 S_IRGRP = 0x20 S_IROTH = 0x4 S_IRUSR = 0x100 S_IRWXG = 0x38 S_IRWXO = 0x7 S_IRWXU = 0x1c0 S_ISGID = 0x400 S_ISUID = 0x800 S_ISVTX = 0x200 S_IWGRP = 0x10 S_IWOTH = 0x2 S_IWRITE = 0x80 S_IWUSR = 0x80 S_IXGRP = 0x8 S_IXOTH = 0x1 S_IXUSR = 0x40 TAB0 = 0x0 TAB1 = 0x800 TAB2 = 0x1000 TAB3 = 0x1800 TABDLY = 0x1800 TASKSTATS_CMD_ATTR_MAX = 0x4 TASKSTATS_CMD_MAX = 0x2 TASKSTATS_GENL_NAME = "TASKSTATS" TASKSTATS_GENL_VERSION = 0x1 TASKSTATS_TYPE_MAX = 0x6 TASKSTATS_VERSION = 0x8 TCFLSH = 0x5407 TCGETA = 0x5401 TCGETS = 0x540d TCGETS2 = 0x4030542a TCIFLUSH = 0x0 TCIOFF = 0x2 TCIOFLUSH = 0x2 TCION = 0x3 TCOFLUSH = 0x1 TCOOFF = 0x0 TCOON = 0x1 TCP_CC_INFO = 0x1a TCP_CONGESTION = 0xd TCP_COOKIE_IN_ALWAYS = 0x1 TCP_COOKIE_MAX = 0x10 TCP_COOKIE_MIN = 0x8 TCP_COOKIE_OUT_NEVER = 0x2 TCP_COOKIE_PAIR_SIZE = 0x20 TCP_COOKIE_TRANSACTIONS = 0xf TCP_CORK = 0x3 TCP_DEFER_ACCEPT = 0x9 TCP_FASTOPEN = 0x17 TCP_FASTOPEN_CONNECT = 0x1e TCP_INFO = 0xb TCP_KEEPCNT = 0x6 TCP_KEEPIDLE = 0x4 TCP_KEEPINTVL = 0x5 TCP_LINGER2 = 0x8 TCP_MAXSEG = 0x2 TCP_MAXWIN = 0xffff TCP_MAX_WINSHIFT = 0xe TCP_MD5SIG = 0xe TCP_MD5SIG_MAXKEYLEN = 0x50 TCP_MSS = 0x200 TCP_MSS_DEFAULT = 0x218 TCP_MSS_DESIRED = 0x4c4 TCP_NODELAY = 0x1 TCP_NOTSENT_LOWAT = 0x19 TCP_QUEUE_SEQ = 0x15 TCP_QUICKACK = 0xc TCP_REPAIR = 0x13 TCP_REPAIR_OPTIONS = 0x16 TCP_REPAIR_QUEUE = 0x14 TCP_REPAIR_WINDOW = 0x1d TCP_SAVED_SYN = 0x1c TCP_SAVE_SYN = 0x1b TCP_SYNCNT = 0x7 TCP_S_DATA_IN = 0x4 TCP_S_DATA_OUT = 0x8 TCP_THIN_DUPACK = 0x11 TCP_THIN_LINEAR_TIMEOUTS = 0x10 TCP_TIMESTAMP = 0x18 TCP_USER_TIMEOUT = 0x12 TCP_WINDOW_CLAMP = 0xa TCSAFLUSH = 0x5410 TCSBRK = 0x5405 TCSBRKP = 0x5486 TCSETA = 0x5402 TCSETAF = 0x5404 TCSETAW = 0x5403 TCSETS = 0x540e TCSETS2 = 0x8030542b TCSETSF = 0x5410 TCSETSF2 = 0x8030542d TCSETSW = 0x540f TCSETSW2 = 0x8030542c TCXONC = 0x5406 TIOCCBRK = 0x5428 TIOCCONS = 0x80047478 TIOCEXCL = 0x740d TIOCGDEV = 0x40045432 TIOCGETD = 0x7400 TIOCGETP = 0x7408 TIOCGEXCL = 0x40045440 TIOCGICOUNT = 0x5492 TIOCGLCKTRMIOS = 0x548b TIOCGLTC = 0x7474 TIOCGPGRP = 0x40047477 TIOCGPKT = 0x40045438 TIOCGPTLCK = 0x40045439 TIOCGPTN = 0x40045430 TIOCGPTPEER = 0x20005441 TIOCGRS485 = 0x4020542e TIOCGSERIAL = 0x5484 TIOCGSID = 0x7416 TIOCGSOFTCAR = 0x5481 TIOCGWINSZ = 0x40087468 TIOCINQ = 0x467f TIOCLINUX = 0x5483 TIOCMBIC = 0x741c TIOCMBIS = 0x741b TIOCMGET = 0x741d TIOCMIWAIT = 0x5491 TIOCMSET = 0x741a TIOCM_CAR = 0x100 TIOCM_CD = 0x100 TIOCM_CTS = 0x40 TIOCM_DSR = 0x400 TIOCM_DTR = 0x2 TIOCM_LE = 0x1 TIOCM_RI = 0x200 TIOCM_RNG = 0x200 TIOCM_RTS = 0x4 TIOCM_SR = 0x20 TIOCM_ST = 0x10 TIOCNOTTY = 0x5471 TIOCNXCL = 0x740e TIOCOUTQ = 0x7472 TIOCPKT = 0x5470 TIOCPKT_DATA = 0x0 TIOCPKT_DOSTOP = 0x20 TIOCPKT_FLUSHREAD = 0x1 TIOCPKT_FLUSHWRITE = 0x2 TIOCPKT_IOCTL = 0x40 TIOCPKT_NOSTOP = 0x10 TIOCPKT_START = 0x8 TIOCPKT_STOP = 0x4 TIOCSBRK = 0x5427 TIOCSCTTY = 0x5480 TIOCSERCONFIG = 0x5488 TIOCSERGETLSR = 0x548e TIOCSERGETMULTI = 0x548f TIOCSERGSTRUCT = 0x548d TIOCSERGWILD = 0x5489 TIOCSERSETMULTI = 0x5490 TIOCSERSWILD = 0x548a TIOCSER_TEMT = 0x1 TIOCSETD = 0x7401 TIOCSETN = 0x740a TIOCSETP = 0x7409 TIOCSIG = 0x80045436 TIOCSLCKTRMIOS = 0x548c TIOCSLTC = 0x7475 TIOCSPGRP = 0x80047476 TIOCSPTLCK = 0x80045431 TIOCSRS485 = 0xc020542f TIOCSSERIAL = 0x5485 TIOCSSOFTCAR = 0x5482 TIOCSTI = 0x5472 TIOCSWINSZ = 0x80087467 TIOCVHANGUP = 0x5437 TOSTOP = 0x8000 TS_COMM_LEN = 0x20 TUNATTACHFILTER = 0x800854d5 TUNDETACHFILTER = 0x800854d6 TUNGETFEATURES = 0x400454cf TUNGETFILTER = 0x400854db TUNGETIFF = 0x400454d2 TUNGETSNDBUF = 0x400454d3 TUNGETVNETBE = 0x400454df TUNGETVNETHDRSZ = 0x400454d7 TUNGETVNETLE = 0x400454dd TUNSETDEBUG = 0x800454c9 TUNSETGROUP = 0x800454ce TUNSETIFF = 0x800454ca TUNSETIFINDEX = 0x800454da TUNSETLINK = 0x800454cd TUNSETNOCSUM = 0x800454c8 TUNSETOFFLOAD = 0x800454d0 TUNSETOWNER = 0x800454cc TUNSETPERSIST = 0x800454cb TUNSETQUEUE = 0x800454d9 TUNSETSNDBUF = 0x800454d4 TUNSETTXFILTER = 0x800454d1 TUNSETVNETBE = 0x800454de TUNSETVNETHDRSZ = 0x800454d8 TUNSETVNETLE = 0x800454dc UMOUNT_NOFOLLOW = 0x8 UTIME_NOW = 0x3fffffff UTIME_OMIT = 0x3ffffffe VDISCARD = 0xd VEOF = 0x10 VEOL = 0x11 VEOL2 = 0x6 VERASE = 0x2 VINTR = 0x0 VKILL = 0x3 VLNEXT = 0xf VMADDR_CID_ANY = 0xffffffff VMADDR_CID_HOST = 0x2 VMADDR_CID_HYPERVISOR = 0x0 VMADDR_CID_RESERVED = 0x1 VMADDR_PORT_ANY = 0xffffffff VMIN = 0x4 VM_SOCKETS_INVALID_VERSION = 0xffffffff VQUIT = 0x1 VREPRINT = 0xc VSTART = 0x8 VSTOP = 0x9 VSUSP = 0xa VSWTC = 0x7 VSWTCH = 0x7 VT0 = 0x0 VT1 = 0x4000 VTDLY = 0x4000 VTIME = 0x5 VWERASE = 0xe WALL = 0x40000000 WCLONE = 0x80000000 WCONTINUED = 0x8 WDIOC_GETBOOTSTATUS = 0x40045702 WDIOC_GETPRETIMEOUT = 0x40045709 WDIOC_GETSTATUS = 0x40045701 WDIOC_GETSUPPORT = 0x40285700 WDIOC_GETTEMP = 0x40045703 WDIOC_GETTIMELEFT = 0x4004570a WDIOC_GETTIMEOUT = 0x40045707 WDIOC_KEEPALIVE = 0x40045705 WDIOC_SETOPTIONS = 0x40045704 WDIOC_SETPRETIMEOUT = 0xc0045708 WDIOC_SETTIMEOUT = 0xc0045706 WEXITED = 0x4 WNOHANG = 0x1 WNOTHREAD = 0x20000000 WNOWAIT = 0x1000000 WORDSIZE = 0x20 WSTOPPED = 0x2 WUNTRACED = 0x2 XATTR_CREATE = 0x1 XATTR_REPLACE = 0x2 XCASE = 0x4 XTABS = 0x1800 ) // Errors const ( E2BIG = syscall.Errno(0x7) EACCES = syscall.Errno(0xd) EADDRINUSE = syscall.Errno(0x7d) EADDRNOTAVAIL = syscall.Errno(0x7e) EADV = syscall.Errno(0x44) EAFNOSUPPORT = syscall.Errno(0x7c) EAGAIN = syscall.Errno(0xb) EALREADY = syscall.Errno(0x95) EBADE = syscall.Errno(0x32) EBADF = syscall.Errno(0x9) EBADFD = syscall.Errno(0x51) EBADMSG = syscall.Errno(0x4d) EBADR = syscall.Errno(0x33) EBADRQC = syscall.Errno(0x36) EBADSLT = syscall.Errno(0x37) EBFONT = syscall.Errno(0x3b) EBUSY = syscall.Errno(0x10) ECANCELED = syscall.Errno(0x9e) ECHILD = syscall.Errno(0xa) ECHRNG = syscall.Errno(0x25) ECOMM = syscall.Errno(0x46) ECONNABORTED = syscall.Errno(0x82) ECONNREFUSED = syscall.Errno(0x92) ECONNRESET = syscall.Errno(0x83) EDEADLK = syscall.Errno(0x2d) EDEADLOCK = syscall.Errno(0x38) EDESTADDRREQ = syscall.Errno(0x60) EDOM = syscall.Errno(0x21) EDOTDOT = syscall.Errno(0x49) EDQUOT = syscall.Errno(0x46d) EEXIST = syscall.Errno(0x11) EFAULT = syscall.Errno(0xe) EFBIG = syscall.Errno(0x1b) EHOSTDOWN = syscall.Errno(0x93) EHOSTUNREACH = syscall.Errno(0x94) EHWPOISON = syscall.Errno(0xa8) EIDRM = syscall.Errno(0x24) EILSEQ = syscall.Errno(0x58) EINIT = syscall.Errno(0x8d) EINPROGRESS = syscall.Errno(0x96) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x85) EISDIR = syscall.Errno(0x15) EISNAM = syscall.Errno(0x8b) EKEYEXPIRED = syscall.Errno(0xa2) EKEYREJECTED = syscall.Errno(0xa4) EKEYREVOKED = syscall.Errno(0xa3) EL2HLT = syscall.Errno(0x2c) EL2NSYNC = syscall.Errno(0x26) EL3HLT = syscall.Errno(0x27) EL3RST = syscall.Errno(0x28) ELIBACC = syscall.Errno(0x53) ELIBBAD = syscall.Errno(0x54) ELIBEXEC = syscall.Errno(0x57) ELIBMAX = syscall.Errno(0x56) ELIBSCN = syscall.Errno(0x55) ELNRNG = syscall.Errno(0x29) ELOOP = syscall.Errno(0x5a) EMEDIUMTYPE = syscall.Errno(0xa0) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) EMSGSIZE = syscall.Errno(0x61) EMULTIHOP = syscall.Errno(0x4a) ENAMETOOLONG = syscall.Errno(0x4e) ENAVAIL = syscall.Errno(0x8a) ENETDOWN = syscall.Errno(0x7f) ENETRESET = syscall.Errno(0x81) ENETUNREACH = syscall.Errno(0x80) ENFILE = syscall.Errno(0x17) ENOANO = syscall.Errno(0x35) ENOBUFS = syscall.Errno(0x84) ENOCSI = syscall.Errno(0x2b) ENODATA = syscall.Errno(0x3d) ENODEV = syscall.Errno(0x13) ENOENT = syscall.Errno(0x2) ENOEXEC = syscall.Errno(0x8) ENOKEY = syscall.Errno(0xa1) ENOLCK = syscall.Errno(0x2e) ENOLINK = syscall.Errno(0x43) ENOMEDIUM = syscall.Errno(0x9f) ENOMEM = syscall.Errno(0xc) ENOMSG = syscall.Errno(0x23) ENONET = syscall.Errno(0x40) ENOPKG = syscall.Errno(0x41) ENOPROTOOPT = syscall.Errno(0x63) ENOSPC = syscall.Errno(0x1c) ENOSR = syscall.Errno(0x3f) ENOSTR = syscall.Errno(0x3c) ENOSYS = syscall.Errno(0x59) ENOTBLK = syscall.Errno(0xf) ENOTCONN = syscall.Errno(0x86) ENOTDIR = syscall.Errno(0x14) ENOTEMPTY = syscall.Errno(0x5d) ENOTNAM = syscall.Errno(0x89) ENOTRECOVERABLE = syscall.Errno(0xa6) ENOTSOCK = syscall.Errno(0x5f) ENOTSUP = syscall.Errno(0x7a) ENOTTY = syscall.Errno(0x19) ENOTUNIQ = syscall.Errno(0x50) ENXIO = syscall.Errno(0x6) EOPNOTSUPP = syscall.Errno(0x7a) EOVERFLOW = syscall.Errno(0x4f) EOWNERDEAD = syscall.Errno(0xa5) EPERM = syscall.Errno(0x1) EPFNOSUPPORT = syscall.Errno(0x7b) EPIPE = syscall.Errno(0x20) EPROTO = syscall.Errno(0x47) EPROTONOSUPPORT = syscall.Errno(0x78) EPROTOTYPE = syscall.Errno(0x62) ERANGE = syscall.Errno(0x22) EREMCHG = syscall.Errno(0x52) EREMDEV = syscall.Errno(0x8e) EREMOTE = syscall.Errno(0x42) EREMOTEIO = syscall.Errno(0x8c) ERESTART = syscall.Errno(0x5b) ERFKILL = syscall.Errno(0xa7) EROFS = syscall.Errno(0x1e) ESHUTDOWN = syscall.Errno(0x8f) ESOCKTNOSUPPORT = syscall.Errno(0x79) ESPIPE = syscall.Errno(0x1d) ESRCH = syscall.Errno(0x3) ESRMNT = syscall.Errno(0x45) ESTALE = syscall.Errno(0x97) ESTRPIPE = syscall.Errno(0x5c) ETIME = syscall.Errno(0x3e) ETIMEDOUT = syscall.Errno(0x91) ETOOMANYREFS = syscall.Errno(0x90) ETXTBSY = syscall.Errno(0x1a) EUCLEAN = syscall.Errno(0x87) EUNATCH = syscall.Errno(0x2a) EUSERS = syscall.Errno(0x5e) EWOULDBLOCK = syscall.Errno(0xb) EXDEV = syscall.Errno(0x12) EXFULL = syscall.Errno(0x34) ) // Signals const ( SIGABRT = syscall.Signal(0x6) SIGALRM = syscall.Signal(0xe) SIGBUS = syscall.Signal(0xa) SIGCHLD = syscall.Signal(0x12) SIGCLD = syscall.Signal(0x12) SIGCONT = syscall.Signal(0x19) SIGEMT = syscall.Signal(0x7) SIGFPE = syscall.Signal(0x8) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x16) SIGIOT = syscall.Signal(0x6) SIGKILL = syscall.Signal(0x9) SIGPIPE = syscall.Signal(0xd) SIGPOLL = syscall.Signal(0x16) SIGPROF = syscall.Signal(0x1d) SIGPWR = syscall.Signal(0x13) SIGQUIT = syscall.Signal(0x3) SIGSEGV = syscall.Signal(0xb) SIGSTOP = syscall.Signal(0x17) SIGSYS = syscall.Signal(0xc) SIGTERM = syscall.Signal(0xf) SIGTRAP = syscall.Signal(0x5) SIGTSTP = syscall.Signal(0x18) SIGTTIN = syscall.Signal(0x1a) SIGTTOU = syscall.Signal(0x1b) SIGURG = syscall.Signal(0x15) SIGUSR1 = syscall.Signal(0x10) SIGUSR2 = syscall.Signal(0x11) SIGVTALRM = syscall.Signal(0x1c) SIGWINCH = syscall.Signal(0x14) SIGXCPU = syscall.Signal(0x1e) SIGXFSZ = syscall.Signal(0x1f) ) // Error table var errors = [...]string{ 1: "operation not permitted", 2: "no such file or directory", 3: "no such process", 4: "interrupted system call", 5: "input/output error", 6: "no such device or address", 7: "argument list too long", 8: "exec format error", 9: "bad file descriptor", 10: "no child processes", 11: "resource temporarily unavailable", 12: "cannot allocate memory", 13: "permission denied", 14: "bad address", 15: "block device required", 16: "device or resource busy", 17: "file exists", 18: "invalid cross-device link", 19: "no such device", 20: "not a directory", 21: "is a directory", 22: "invalid argument", 23: "too many open files in system", 24: "too many open files", 25: "inappropriate ioctl for device", 26: "text file busy", 27: "file too large", 28: "no space left on device", 29: "illegal seek", 30: "read-only file system", 31: "too many links", 32: "broken pipe", 33: "numerical argument out of domain", 34: "numerical result out of range", 35: "no message of desired type", 36: "identifier removed", 37: "channel number out of range", 38: "level 2 not synchronized", 39: "level 3 halted", 40: "level 3 reset", 41: "link number out of range", 42: "protocol driver not attached", 43: "no CSI structure available", 44: "level 2 halted", 45: "resource deadlock avoided", 46: "no locks available", 50: "invalid exchange", 51: "invalid request descriptor", 52: "exchange full", 53: "no anode", 54: "invalid request code", 55: "invalid slot", 56: "file locking deadlock error", 59: "bad font file format", 60: "device not a stream", 61: "no data available", 62: "timer expired", 63: "out of streams resources", 64: "machine is not on the network", 65: "package not installed", 66: "object is remote", 67: "link has been severed", 68: "advertise error", 69: "srmount error", 70: "communication error on send", 71: "protocol error", 73: "RFS specific error", 74: "multihop attempted", 77: "bad message", 78: "file name too long", 79: "value too large for defined data type", 80: "name not unique on network", 81: "file descriptor in bad state", 82: "remote address changed", 83: "can not access a needed shared library", 84: "accessing a corrupted shared library", 85: ".lib section in a.out corrupted", 86: "attempting to link in too many shared libraries", 87: "cannot exec a shared library directly", 88: "invalid or incomplete multibyte or wide character", 89: "function not implemented", 90: "too many levels of symbolic links", 91: "interrupted system call should be restarted", 92: "streams pipe error", 93: "directory not empty", 94: "too many users", 95: "socket operation on non-socket", 96: "destination address required", 97: "message too long", 98: "protocol wrong type for socket", 99: "protocol not available", 120: "protocol not supported", 121: "socket type not supported", 122: "operation not supported", 123: "protocol family not supported", 124: "address family not supported by protocol", 125: "address already in use", 126: "cannot assign requested address", 127: "network is down", 128: "network is unreachable", 129: "network dropped connection on reset", 130: "software caused connection abort", 131: "connection reset by peer", 132: "no buffer space available", 133: "transport endpoint is already connected", 134: "transport endpoint is not connected", 135: "structure needs cleaning", 137: "not a XENIX named type file", 138: "no XENIX semaphores available", 139: "is a named type file", 140: "remote I/O error", 141: "unknown error 141", 142: "unknown error 142", 143: "cannot send after transport endpoint shutdown", 144: "too many references: cannot splice", 145: "connection timed out", 146: "connection refused", 147: "host is down", 148: "no route to host", 149: "operation already in progress", 150: "operation now in progress", 151: "stale file handle", 158: "operation canceled", 159: "no medium found", 160: "wrong medium type", 161: "required key not available", 162: "key has expired", 163: "key has been revoked", 164: "key was rejected by service", 165: "owner died", 166: "state not recoverable", 167: "operation not possible due to RF-kill", 168: "memory page has hardware error", 1133: "disk quota exceeded", } // Signal table var signals = [...]string{ 1: "hangup", 2: "interrupt", 3: "quit", 4: "illegal instruction", 5: "trace/breakpoint trap", 6: "aborted", 7: "EMT trap", 8: "floating point exception", 9: "killed", 10: "bus error", 11: "segmentation fault", 12: "bad system call", 13: "broken pipe", 14: "alarm clock", 15: "terminated", 16: "user defined signal 1", 17: "user defined signal 2", 18: "child exited", 19: "power failure", 20: "window changed", 21: "urgent I/O condition", 22: "I/O possible", 23: "stopped (signal)", 24: "stopped", 25: "continued", 26: "stopped (tty input)", 27: "stopped (tty output)", 28: "virtual timer expired", 29: "profiling timer expired", 30: "CPU time limit exceeded", 31: "file size limit exceeded", } ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go ================================================ // mkerrors.sh -Wall -Werror -static -I/tmp/include // Code generated by the command above; see README.md. DO NOT EDIT. // +build ppc64,linux // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go package unix import "syscall" const ( AF_ALG = 0x26 AF_APPLETALK = 0x5 AF_ASH = 0x12 AF_ATMPVC = 0x8 AF_ATMSVC = 0x14 AF_AX25 = 0x3 AF_BLUETOOTH = 0x1f AF_BRIDGE = 0x7 AF_CAIF = 0x25 AF_CAN = 0x1d AF_DECnet = 0xc AF_ECONET = 0x13 AF_FILE = 0x1 AF_IB = 0x1b AF_IEEE802154 = 0x24 AF_INET = 0x2 AF_INET6 = 0xa AF_IPX = 0x4 AF_IRDA = 0x17 AF_ISDN = 0x22 AF_IUCV = 0x20 AF_KCM = 0x29 AF_KEY = 0xf AF_LLC = 0x1a AF_LOCAL = 0x1 AF_MAX = 0x2c AF_MPLS = 0x1c AF_NETBEUI = 0xd AF_NETLINK = 0x10 AF_NETROM = 0x6 AF_NFC = 0x27 AF_PACKET = 0x11 AF_PHONET = 0x23 AF_PPPOX = 0x18 AF_QIPCRTR = 0x2a AF_RDS = 0x15 AF_ROSE = 0xb AF_ROUTE = 0x10 AF_RXRPC = 0x21 AF_SECURITY = 0xe AF_SMC = 0x2b AF_SNA = 0x16 AF_TIPC = 0x1e AF_UNIX = 0x1 AF_UNSPEC = 0x0 AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 ALG_OP_DECRYPT = 0x0 ALG_OP_ENCRYPT = 0x1 ALG_SET_AEAD_ASSOCLEN = 0x4 ALG_SET_AEAD_AUTHSIZE = 0x5 ALG_SET_IV = 0x2 ALG_SET_KEY = 0x1 ALG_SET_OP = 0x3 ARPHRD_6LOWPAN = 0x339 ARPHRD_ADAPT = 0x108 ARPHRD_APPLETLK = 0x8 ARPHRD_ARCNET = 0x7 ARPHRD_ASH = 0x30d ARPHRD_ATM = 0x13 ARPHRD_AX25 = 0x3 ARPHRD_BIF = 0x307 ARPHRD_CAIF = 0x336 ARPHRD_CAN = 0x118 ARPHRD_CHAOS = 0x5 ARPHRD_CISCO = 0x201 ARPHRD_CSLIP = 0x101 ARPHRD_CSLIP6 = 0x103 ARPHRD_DDCMP = 0x205 ARPHRD_DLCI = 0xf ARPHRD_ECONET = 0x30e ARPHRD_EETHER = 0x2 ARPHRD_ETHER = 0x1 ARPHRD_EUI64 = 0x1b ARPHRD_FCAL = 0x311 ARPHRD_FCFABRIC = 0x313 ARPHRD_FCPL = 0x312 ARPHRD_FCPP = 0x310 ARPHRD_FDDI = 0x306 ARPHRD_FRAD = 0x302 ARPHRD_HDLC = 0x201 ARPHRD_HIPPI = 0x30c ARPHRD_HWX25 = 0x110 ARPHRD_IEEE1394 = 0x18 ARPHRD_IEEE802 = 0x6 ARPHRD_IEEE80211 = 0x321 ARPHRD_IEEE80211_PRISM = 0x322 ARPHRD_IEEE80211_RADIOTAP = 0x323 ARPHRD_IEEE802154 = 0x324 ARPHRD_IEEE802154_MONITOR = 0x325 ARPHRD_IEEE802_TR = 0x320 ARPHRD_INFINIBAND = 0x20 ARPHRD_IP6GRE = 0x337 ARPHRD_IPDDP = 0x309 ARPHRD_IPGRE = 0x30a ARPHRD_IRDA = 0x30f ARPHRD_LAPB = 0x204 ARPHRD_LOCALTLK = 0x305 ARPHRD_LOOPBACK = 0x304 ARPHRD_METRICOM = 0x17 ARPHRD_NETLINK = 0x338 ARPHRD_NETROM = 0x0 ARPHRD_NONE = 0xfffe ARPHRD_PHONET = 0x334 ARPHRD_PHONET_PIPE = 0x335 ARPHRD_PIMREG = 0x30b ARPHRD_PPP = 0x200 ARPHRD_PRONET = 0x4 ARPHRD_RAWHDLC = 0x206 ARPHRD_ROSE = 0x10e ARPHRD_RSRVD = 0x104 ARPHRD_SIT = 0x308 ARPHRD_SKIP = 0x303 ARPHRD_SLIP = 0x100 ARPHRD_SLIP6 = 0x102 ARPHRD_TUNNEL = 0x300 ARPHRD_TUNNEL6 = 0x301 ARPHRD_VOID = 0xffff ARPHRD_VSOCKMON = 0x33a ARPHRD_X25 = 0x10f B0 = 0x0 B1000000 = 0x17 B110 = 0x3 B115200 = 0x11 B1152000 = 0x18 B1200 = 0x9 B134 = 0x4 B150 = 0x5 B1500000 = 0x19 B1800 = 0xa B19200 = 0xe B200 = 0x6 B2000000 = 0x1a B230400 = 0x12 B2400 = 0xb B2500000 = 0x1b B300 = 0x7 B3000000 = 0x1c B3500000 = 0x1d B38400 = 0xf B4000000 = 0x1e B460800 = 0x13 B4800 = 0xc B50 = 0x1 B500000 = 0x14 B57600 = 0x10 B576000 = 0x15 B600 = 0x8 B75 = 0x2 B921600 = 0x16 B9600 = 0xd BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40081272 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d BLKRRPART = 0x2000125f BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 BOTHER = 0x1f BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALU = 0x4 BPF_AND = 0x50 BPF_B = 0x10 BPF_DIV = 0x30 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 BPF_JA = 0x0 BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 BPF_JMP = 0x5 BPF_JSET = 0x40 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 BPF_LEN = 0x80 BPF_LL_OFF = -0x200000 BPF_LSH = 0x60 BPF_MAJOR_VERSION = 0x1 BPF_MAXINSNS = 0x1000 BPF_MEM = 0x60 BPF_MEMWORDS = 0x10 BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MOD = 0x90 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_NET_OFF = -0x100000 BPF_OR = 0x40 BPF_RET = 0x6 BPF_RSH = 0x70 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 BPF_TAX = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 BPF_XOR = 0xa0 BRKINT = 0x2 BS0 = 0x0 BS1 = 0x8000 BSDLY = 0x8000 CAN_BCM = 0x2 CAN_EFF_FLAG = 0x80000000 CAN_EFF_ID_BITS = 0x1d CAN_EFF_MASK = 0x1fffffff CAN_ERR_FLAG = 0x20000000 CAN_ERR_MASK = 0x1fffffff CAN_INV_FILTER = 0x20000000 CAN_ISOTP = 0x6 CAN_MAX_DLC = 0x8 CAN_MAX_DLEN = 0x8 CAN_MCNET = 0x5 CAN_MTU = 0x10 CAN_NPROTO = 0x7 CAN_RAW = 0x1 CAN_RAW_FILTER_MAX = 0x200 CAN_RTR_FLAG = 0x40000000 CAN_SFF_ID_BITS = 0xb CAN_SFF_MASK = 0x7ff CAN_TP16 = 0x3 CAN_TP20 = 0x4 CBAUD = 0xff CBAUDEX = 0x0 CFLUSH = 0xf CIBAUD = 0xff0000 CLOCAL = 0x8000 CLOCK_BOOTTIME = 0x7 CLOCK_BOOTTIME_ALARM = 0x9 CLOCK_DEFAULT = 0x0 CLOCK_EXT = 0x1 CLOCK_INT = 0x2 CLOCK_MONOTONIC = 0x1 CLOCK_MONOTONIC_COARSE = 0x6 CLOCK_MONOTONIC_RAW = 0x4 CLOCK_PROCESS_CPUTIME_ID = 0x2 CLOCK_REALTIME = 0x0 CLOCK_REALTIME_ALARM = 0x8 CLOCK_REALTIME_COARSE = 0x5 CLOCK_TAI = 0xb CLOCK_THREAD_CPUTIME_ID = 0x3 CLOCK_TXFROMRX = 0x4 CLOCK_TXINT = 0x3 CLONE_CHILD_CLEARTID = 0x200000 CLONE_CHILD_SETTID = 0x1000000 CLONE_DETACHED = 0x400000 CLONE_FILES = 0x400 CLONE_FS = 0x200 CLONE_IO = 0x80000000 CLONE_NEWCGROUP = 0x2000000 CLONE_NEWIPC = 0x8000000 CLONE_NEWNET = 0x40000000 CLONE_NEWNS = 0x20000 CLONE_NEWPID = 0x20000000 CLONE_NEWUSER = 0x10000000 CLONE_NEWUTS = 0x4000000 CLONE_PARENT = 0x8000 CLONE_PARENT_SETTID = 0x100000 CLONE_PTRACE = 0x2000 CLONE_SETTLS = 0x80000 CLONE_SIGHAND = 0x800 CLONE_SYSVSEM = 0x40000 CLONE_THREAD = 0x10000 CLONE_UNTRACED = 0x800000 CLONE_VFORK = 0x4000 CLONE_VM = 0x100 CMSPAR = 0x40000000 CR0 = 0x0 CR1 = 0x1000 CR2 = 0x2000 CR3 = 0x3000 CRDLY = 0x3000 CREAD = 0x800 CRTSCTS = 0x80000000 CS5 = 0x0 CS6 = 0x100 CS7 = 0x200 CS8 = 0x300 CSIGNAL = 0xff CSIZE = 0x300 CSTART = 0x11 CSTATUS = 0x0 CSTOP = 0x13 CSTOPB = 0x400 CSUSP = 0x1a DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 DT_FIFO = 0x1 DT_LNK = 0xa DT_REG = 0x8 DT_SOCK = 0xc DT_UNKNOWN = 0x0 DT_WHT = 0xe ECHO = 0x8 ECHOCTL = 0x40 ECHOE = 0x2 ECHOK = 0x4 ECHOKE = 0x1 ECHONL = 0x10 ECHOPRT = 0x20 EFD_CLOEXEC = 0x80000 EFD_NONBLOCK = 0x800 EFD_SEMAPHORE = 0x1 ENCODING_DEFAULT = 0x0 ENCODING_FM_MARK = 0x3 ENCODING_FM_SPACE = 0x4 ENCODING_MANCHESTER = 0x5 ENCODING_NRZ = 0x1 ENCODING_NRZI = 0x2 EPOLLERR = 0x8 EPOLLET = 0x80000000 EPOLLEXCLUSIVE = 0x10000000 EPOLLHUP = 0x10 EPOLLIN = 0x1 EPOLLMSG = 0x400 EPOLLONESHOT = 0x40000000 EPOLLOUT = 0x4 EPOLLPRI = 0x2 EPOLLRDBAND = 0x80 EPOLLRDHUP = 0x2000 EPOLLRDNORM = 0x40 EPOLLWAKEUP = 0x20000000 EPOLLWRBAND = 0x200 EPOLLWRNORM = 0x100 EPOLL_CLOEXEC = 0x80000 EPOLL_CTL_ADD = 0x1 EPOLL_CTL_DEL = 0x2 EPOLL_CTL_MOD = 0x3 ETH_P_1588 = 0x88f7 ETH_P_8021AD = 0x88a8 ETH_P_8021AH = 0x88e7 ETH_P_8021Q = 0x8100 ETH_P_80221 = 0x8917 ETH_P_802_2 = 0x4 ETH_P_802_3 = 0x1 ETH_P_802_3_MIN = 0x600 ETH_P_802_EX1 = 0x88b5 ETH_P_AARP = 0x80f3 ETH_P_AF_IUCV = 0xfbfb ETH_P_ALL = 0x3 ETH_P_AOE = 0x88a2 ETH_P_ARCNET = 0x1a ETH_P_ARP = 0x806 ETH_P_ATALK = 0x809b ETH_P_ATMFATE = 0x8884 ETH_P_ATMMPOA = 0x884c ETH_P_AX25 = 0x2 ETH_P_BATMAN = 0x4305 ETH_P_BPQ = 0x8ff ETH_P_CAIF = 0xf7 ETH_P_CAN = 0xc ETH_P_CANFD = 0xd ETH_P_CONTROL = 0x16 ETH_P_CUST = 0x6006 ETH_P_DDCMP = 0x6 ETH_P_DEC = 0x6000 ETH_P_DIAG = 0x6005 ETH_P_DNA_DL = 0x6001 ETH_P_DNA_RC = 0x6002 ETH_P_DNA_RT = 0x6003 ETH_P_DSA = 0x1b ETH_P_ECONET = 0x18 ETH_P_EDSA = 0xdada ETH_P_FCOE = 0x8906 ETH_P_FIP = 0x8914 ETH_P_HDLC = 0x19 ETH_P_HSR = 0x892f ETH_P_IBOE = 0x8915 ETH_P_IEEE802154 = 0xf6 ETH_P_IEEEPUP = 0xa00 ETH_P_IEEEPUPAT = 0xa01 ETH_P_IP = 0x800 ETH_P_IPV6 = 0x86dd ETH_P_IPX = 0x8137 ETH_P_IRDA = 0x17 ETH_P_LAT = 0x6004 ETH_P_LINK_CTL = 0x886c ETH_P_LOCALTALK = 0x9 ETH_P_LOOP = 0x60 ETH_P_LOOPBACK = 0x9000 ETH_P_MACSEC = 0x88e5 ETH_P_MOBITEX = 0x15 ETH_P_MPLS_MC = 0x8848 ETH_P_MPLS_UC = 0x8847 ETH_P_MVRP = 0x88f5 ETH_P_NCSI = 0x88f8 ETH_P_PAE = 0x888e ETH_P_PAUSE = 0x8808 ETH_P_PHONET = 0xf5 ETH_P_PPPTALK = 0x10 ETH_P_PPP_DISC = 0x8863 ETH_P_PPP_MP = 0x8 ETH_P_PPP_SES = 0x8864 ETH_P_PRP = 0x88fb ETH_P_PUP = 0x200 ETH_P_PUPAT = 0x201 ETH_P_QINQ1 = 0x9100 ETH_P_QINQ2 = 0x9200 ETH_P_QINQ3 = 0x9300 ETH_P_RARP = 0x8035 ETH_P_SCA = 0x6007 ETH_P_SLOW = 0x8809 ETH_P_SNAP = 0x5 ETH_P_TDLS = 0x890d ETH_P_TEB = 0x6558 ETH_P_TIPC = 0x88ca ETH_P_TRAILER = 0x1c ETH_P_TR_802_2 = 0x11 ETH_P_TSN = 0x22f0 ETH_P_WAN_PPP = 0x7 ETH_P_WCCP = 0x883e ETH_P_X25 = 0x805 ETH_P_XDSA = 0xf8 EXTA = 0xe EXTB = 0xf EXTPROC = 0x10000000 FALLOC_FL_COLLAPSE_RANGE = 0x8 FALLOC_FL_INSERT_RANGE = 0x20 FALLOC_FL_KEEP_SIZE = 0x1 FALLOC_FL_NO_HIDE_STALE = 0x4 FALLOC_FL_PUNCH_HOLE = 0x2 FALLOC_FL_UNSHARE_RANGE = 0x40 FALLOC_FL_ZERO_RANGE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 FF1 = 0x4000 FFDLY = 0x4000 FLUSHO = 0x800000 FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 FS_ENCRYPTION_MODE_INVALID = 0x0 FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 FS_KEY_DESCRIPTOR_SIZE = 0x8 FS_KEY_DESC_PREFIX = "fscrypt:" FS_KEY_DESC_PREFIX_SIZE = 0x8 FS_MAX_KEY_SIZE = 0x40 FS_POLICY_FLAGS_PAD_16 = 0x2 FS_POLICY_FLAGS_PAD_32 = 0x3 FS_POLICY_FLAGS_PAD_4 = 0x0 FS_POLICY_FLAGS_PAD_8 = 0x1 FS_POLICY_FLAGS_PAD_MASK = 0x3 FS_POLICY_FLAGS_VALID = 0x3 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0x406 F_EXLCK = 0x4 F_GETFD = 0x1 F_GETFL = 0x3 F_GETLEASE = 0x401 F_GETLK = 0x5 F_GETLK64 = 0xc F_GETOWN = 0x9 F_GETOWN_EX = 0x10 F_GETPIPE_SZ = 0x408 F_GETSIG = 0xb F_LOCK = 0x1 F_NOTIFY = 0x402 F_OFD_GETLK = 0x24 F_OFD_SETLK = 0x25 F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 F_SETFD = 0x2 F_SETFL = 0x4 F_SETLEASE = 0x400 F_SETLK = 0x6 F_SETLK64 = 0xd F_SETLKW = 0x7 F_SETLKW64 = 0xe F_SETOWN = 0x8 F_SETOWN_EX = 0xf F_SETPIPE_SZ = 0x407 F_SETSIG = 0xa F_SHLCK = 0x8 F_TEST = 0x3 F_TLOCK = 0x2 F_ULOCK = 0x0 F_UNLCK = 0x2 F_WRLCK = 0x1 GENL_ADMIN_PERM = 0x1 GENL_CMD_CAP_DO = 0x2 GENL_CMD_CAP_DUMP = 0x4 GENL_CMD_CAP_HASPOL = 0x8 GENL_HDRLEN = 0x4 GENL_ID_CTRL = 0x10 GENL_ID_PMCRAID = 0x12 GENL_ID_VFS_DQUOT = 0x11 GENL_MAX_ID = 0x3ff GENL_MIN_ID = 0x10 GENL_NAMSIZ = 0x10 GENL_START_ALLOC = 0x13 GENL_UNS_ADMIN_PERM = 0x10 GRND_NONBLOCK = 0x1 GRND_RANDOM = 0x2 HUPCL = 0x4000 IBSHIFT = 0x10 ICANON = 0x100 ICMPV6_FILTER = 0x1 ICRNL = 0x100 IEXTEN = 0x400 IFA_F_DADFAILED = 0x8 IFA_F_DEPRECATED = 0x20 IFA_F_HOMEADDRESS = 0x10 IFA_F_MANAGETEMPADDR = 0x100 IFA_F_MCAUTOJOIN = 0x400 IFA_F_NODAD = 0x2 IFA_F_NOPREFIXROUTE = 0x200 IFA_F_OPTIMISTIC = 0x4 IFA_F_PERMANENT = 0x80 IFA_F_SECONDARY = 0x1 IFA_F_STABLE_PRIVACY = 0x800 IFA_F_TEMPORARY = 0x1 IFA_F_TENTATIVE = 0x40 IFA_MAX = 0x8 IFF_ALLMULTI = 0x200 IFF_ATTACH_QUEUE = 0x200 IFF_AUTOMEDIA = 0x4000 IFF_BROADCAST = 0x2 IFF_DEBUG = 0x4 IFF_DETACH_QUEUE = 0x400 IFF_DORMANT = 0x20000 IFF_DYNAMIC = 0x8000 IFF_ECHO = 0x40000 IFF_LOOPBACK = 0x8 IFF_LOWER_UP = 0x10000 IFF_MASTER = 0x400 IFF_MULTICAST = 0x1000 IFF_MULTI_QUEUE = 0x100 IFF_NOARP = 0x80 IFF_NOFILTER = 0x1000 IFF_NOTRAILERS = 0x20 IFF_NO_PI = 0x1000 IFF_ONE_QUEUE = 0x2000 IFF_PERSIST = 0x800 IFF_POINTOPOINT = 0x10 IFF_PORTSEL = 0x2000 IFF_PROMISC = 0x100 IFF_RUNNING = 0x40 IFF_SLAVE = 0x800 IFF_TAP = 0x2 IFF_TUN = 0x1 IFF_TUN_EXCL = 0x8000 IFF_UP = 0x1 IFF_VNET_HDR = 0x4000 IFF_VOLATILE = 0x70c5a IFNAMSIZ = 0x10 IGNBRK = 0x1 IGNCR = 0x80 IGNPAR = 0x4 IMAXBEL = 0x2000 INLCR = 0x40 INPCK = 0x10 IN_ACCESS = 0x1 IN_ALL_EVENTS = 0xfff IN_ATTRIB = 0x4 IN_CLASSA_HOST = 0xffffff IN_CLASSA_MAX = 0x80 IN_CLASSA_NET = 0xff000000 IN_CLASSA_NSHIFT = 0x18 IN_CLASSB_HOST = 0xffff IN_CLASSB_MAX = 0x10000 IN_CLASSB_NET = 0xffff0000 IN_CLASSB_NSHIFT = 0x10 IN_CLASSC_HOST = 0xff IN_CLASSC_NET = 0xffffff00 IN_CLASSC_NSHIFT = 0x8 IN_CLOEXEC = 0x80000 IN_CLOSE = 0x18 IN_CLOSE_NOWRITE = 0x10 IN_CLOSE_WRITE = 0x8 IN_CREATE = 0x100 IN_DELETE = 0x200 IN_DELETE_SELF = 0x400 IN_DONT_FOLLOW = 0x2000000 IN_EXCL_UNLINK = 0x4000000 IN_IGNORED = 0x8000 IN_ISDIR = 0x40000000 IN_LOOPBACKNET = 0x7f IN_MASK_ADD = 0x20000000 IN_MODIFY = 0x2 IN_MOVE = 0xc0 IN_MOVED_FROM = 0x40 IN_MOVED_TO = 0x80 IN_MOVE_SELF = 0x800 IN_NONBLOCK = 0x800 IN_ONESHOT = 0x80000000 IN_ONLYDIR = 0x1000000 IN_OPEN = 0x20 IN_Q_OVERFLOW = 0x4000 IN_UNMOUNT = 0x2000 IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 IPPROTO_AH = 0x33 IPPROTO_BEETPH = 0x5e IPPROTO_COMP = 0x6c IPPROTO_DCCP = 0x21 IPPROTO_DSTOPTS = 0x3c IPPROTO_EGP = 0x8 IPPROTO_ENCAP = 0x62 IPPROTO_ESP = 0x32 IPPROTO_FRAGMENT = 0x2c IPPROTO_GRE = 0x2f IPPROTO_HOPOPTS = 0x0 IPPROTO_ICMP = 0x1 IPPROTO_ICMPV6 = 0x3a IPPROTO_IDP = 0x16 IPPROTO_IGMP = 0x2 IPPROTO_IP = 0x0 IPPROTO_IPIP = 0x4 IPPROTO_IPV6 = 0x29 IPPROTO_MH = 0x87 IPPROTO_MPLS = 0x89 IPPROTO_MTP = 0x5c IPPROTO_NONE = 0x3b IPPROTO_PIM = 0x67 IPPROTO_PUP = 0xc IPPROTO_RAW = 0xff IPPROTO_ROUTING = 0x2b IPPROTO_RSVP = 0x2e IPPROTO_SCTP = 0x84 IPPROTO_TCP = 0x6 IPPROTO_TP = 0x1d IPPROTO_UDP = 0x11 IPPROTO_UDPLITE = 0x88 IPV6_2292DSTOPTS = 0x4 IPV6_2292HOPLIMIT = 0x8 IPV6_2292HOPOPTS = 0x3 IPV6_2292PKTINFO = 0x2 IPV6_2292PKTOPTIONS = 0x6 IPV6_2292RTHDR = 0x5 IPV6_ADDRFORM = 0x1 IPV6_ADDR_PREFERENCES = 0x48 IPV6_ADD_MEMBERSHIP = 0x14 IPV6_AUTHHDR = 0xa IPV6_AUTOFLOWLABEL = 0x46 IPV6_CHECKSUM = 0x7 IPV6_DONTFRAG = 0x3e IPV6_DROP_MEMBERSHIP = 0x15 IPV6_DSTOPTS = 0x3b IPV6_HDRINCL = 0x24 IPV6_HOPLIMIT = 0x34 IPV6_HOPOPTS = 0x36 IPV6_IPSEC_POLICY = 0x22 IPV6_JOIN_ANYCAST = 0x1b IPV6_JOIN_GROUP = 0x14 IPV6_LEAVE_ANYCAST = 0x1c IPV6_LEAVE_GROUP = 0x15 IPV6_MINHOPCOUNT = 0x49 IPV6_MTU = 0x18 IPV6_MTU_DISCOVER = 0x17 IPV6_MULTICAST_HOPS = 0x12 IPV6_MULTICAST_IF = 0x11 IPV6_MULTICAST_LOOP = 0x13 IPV6_NEXTHOP = 0x9 IPV6_ORIGDSTADDR = 0x4a IPV6_PATHMTU = 0x3d IPV6_PKTINFO = 0x32 IPV6_PMTUDISC_DO = 0x2 IPV6_PMTUDISC_DONT = 0x0 IPV6_PMTUDISC_INTERFACE = 0x4 IPV6_PMTUDISC_OMIT = 0x5 IPV6_PMTUDISC_PROBE = 0x3 IPV6_PMTUDISC_WANT = 0x1 IPV6_RECVDSTOPTS = 0x3a IPV6_RECVERR = 0x19 IPV6_RECVFRAGSIZE = 0x4d IPV6_RECVHOPLIMIT = 0x33 IPV6_RECVHOPOPTS = 0x35 IPV6_RECVORIGDSTADDR = 0x4a IPV6_RECVPATHMTU = 0x3c IPV6_RECVPKTINFO = 0x31 IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 IPV6_RTHDR_STRICT = 0x1 IPV6_RTHDR_TYPE_0 = 0x0 IPV6_RXDSTOPTS = 0x3b IPV6_RXHOPOPTS = 0x36 IPV6_TCLASS = 0x43 IPV6_TRANSPARENT = 0x4b IPV6_UNICAST_HOPS = 0x10 IPV6_UNICAST_IF = 0x4c IPV6_V6ONLY = 0x1a IPV6_XFRM_POLICY = 0x23 IP_ADD_MEMBERSHIP = 0x23 IP_ADD_SOURCE_MEMBERSHIP = 0x27 IP_BIND_ADDRESS_NO_PORT = 0x18 IP_BLOCK_SOURCE = 0x26 IP_CHECKSUM = 0x17 IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 IP_DROP_MEMBERSHIP = 0x24 IP_DROP_SOURCE_MEMBERSHIP = 0x28 IP_FREEBIND = 0xf IP_HDRINCL = 0x3 IP_IPSEC_POLICY = 0x10 IP_MAXPACKET = 0xffff IP_MAX_MEMBERSHIPS = 0x14 IP_MF = 0x2000 IP_MINTTL = 0x15 IP_MSFILTER = 0x29 IP_MSS = 0x240 IP_MTU = 0xe IP_MTU_DISCOVER = 0xa IP_MULTICAST_ALL = 0x31 IP_MULTICAST_IF = 0x20 IP_MULTICAST_LOOP = 0x22 IP_MULTICAST_TTL = 0x21 IP_NODEFRAG = 0x16 IP_OFFMASK = 0x1fff IP_OPTIONS = 0x4 IP_ORIGDSTADDR = 0x14 IP_PASSSEC = 0x12 IP_PKTINFO = 0x8 IP_PKTOPTIONS = 0x9 IP_PMTUDISC = 0xa IP_PMTUDISC_DO = 0x2 IP_PMTUDISC_DONT = 0x0 IP_PMTUDISC_INTERFACE = 0x4 IP_PMTUDISC_OMIT = 0x5 IP_PMTUDISC_PROBE = 0x3 IP_PMTUDISC_WANT = 0x1 IP_RECVERR = 0xb IP_RECVFRAGSIZE = 0x19 IP_RECVOPTS = 0x6 IP_RECVORIGDSTADDR = 0x14 IP_RECVRETOPTS = 0x7 IP_RECVTOS = 0xd IP_RECVTTL = 0xc IP_RETOPTS = 0x7 IP_RF = 0x8000 IP_ROUTER_ALERT = 0x5 IP_TOS = 0x1 IP_TRANSPARENT = 0x13 IP_TTL = 0x2 IP_UNBLOCK_SOURCE = 0x25 IP_UNICAST_IF = 0x32 IP_XFRM_POLICY = 0x11 ISIG = 0x80 ISTRIP = 0x20 IUCLC = 0x1000 IUTF8 = 0x4000 IXANY = 0x800 IXOFF = 0x400 IXON = 0x200 KEYCTL_ASSUME_AUTHORITY = 0x10 KEYCTL_CHOWN = 0x4 KEYCTL_CLEAR = 0x7 KEYCTL_DESCRIBE = 0x6 KEYCTL_DH_COMPUTE = 0x17 KEYCTL_GET_KEYRING_ID = 0x0 KEYCTL_GET_PERSISTENT = 0x16 KEYCTL_GET_SECURITY = 0x11 KEYCTL_INSTANTIATE = 0xc KEYCTL_INSTANTIATE_IOV = 0x14 KEYCTL_INVALIDATE = 0x15 KEYCTL_JOIN_SESSION_KEYRING = 0x1 KEYCTL_LINK = 0x8 KEYCTL_NEGATE = 0xd KEYCTL_READ = 0xb KEYCTL_REJECT = 0x13 KEYCTL_RESTRICT_KEYRING = 0x1d KEYCTL_REVOKE = 0x3 KEYCTL_SEARCH = 0xa KEYCTL_SESSION_TO_PARENT = 0x12 KEYCTL_SETPERM = 0x5 KEYCTL_SET_REQKEY_KEYRING = 0xe KEYCTL_SET_TIMEOUT = 0xf KEYCTL_UNLINK = 0x9 KEYCTL_UPDATE = 0x2 KEY_REQKEY_DEFL_DEFAULT = 0x0 KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 KEY_REQKEY_DEFL_NO_CHANGE = -0x1 KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 KEY_REQKEY_DEFL_USER_KEYRING = 0x4 KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 KEY_SPEC_GROUP_KEYRING = -0x6 KEY_SPEC_PROCESS_KEYRING = -0x2 KEY_SPEC_REQKEY_AUTH_KEY = -0x7 KEY_SPEC_REQUESTOR_KEYRING = -0x8 KEY_SPEC_SESSION_KEYRING = -0x3 KEY_SPEC_THREAD_KEYRING = -0x1 KEY_SPEC_USER_KEYRING = -0x4 KEY_SPEC_USER_SESSION_KEYRING = -0x5 LINUX_REBOOT_CMD_CAD_OFF = 0x0 LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef LINUX_REBOOT_CMD_HALT = 0xcdef0123 LINUX_REBOOT_CMD_KEXEC = 0x45584543 LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc LINUX_REBOOT_CMD_RESTART = 0x1234567 LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 LINUX_REBOOT_MAGIC1 = 0xfee1dead LINUX_REBOOT_MAGIC2 = 0x28121969 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 MADV_DONTFORK = 0xa MADV_DONTNEED = 0x4 MADV_FREE = 0x8 MADV_HUGEPAGE = 0xe MADV_HWPOISON = 0x64 MADV_MERGEABLE = 0xc MADV_NOHUGEPAGE = 0xf MADV_NORMAL = 0x0 MADV_RANDOM = 0x1 MADV_REMOVE = 0x9 MADV_SEQUENTIAL = 0x2 MADV_UNMERGEABLE = 0xd MADV_WILLNEED = 0x3 MAP_ANON = 0x20 MAP_ANONYMOUS = 0x20 MAP_DENYWRITE = 0x800 MAP_EXECUTABLE = 0x1000 MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_GROWSDOWN = 0x100 MAP_HUGETLB = 0x40000 MAP_HUGE_MASK = 0x3f MAP_HUGE_SHIFT = 0x1a MAP_LOCKED = 0x80 MAP_NONBLOCK = 0x10000 MAP_NORESERVE = 0x40 MAP_POPULATE = 0x8000 MAP_PRIVATE = 0x2 MAP_SHARED = 0x1 MAP_STACK = 0x20000 MAP_TYPE = 0xf MCL_CURRENT = 0x2000 MCL_FUTURE = 0x4000 MCL_ONFAULT = 0x8000 MNT_DETACH = 0x2 MNT_EXPIRE = 0x4 MNT_FORCE = 0x1 MSG_BATCH = 0x40000 MSG_CMSG_CLOEXEC = 0x40000000 MSG_CONFIRM = 0x800 MSG_CTRUNC = 0x8 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x40 MSG_EOR = 0x80 MSG_ERRQUEUE = 0x2000 MSG_FASTOPEN = 0x20000000 MSG_FIN = 0x200 MSG_MORE = 0x8000 MSG_NOSIGNAL = 0x4000 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_PROXY = 0x10 MSG_RST = 0x1000 MSG_SYN = 0x400 MSG_TRUNC = 0x20 MSG_TRYHARD = 0x4 MSG_WAITALL = 0x100 MSG_WAITFORONE = 0x10000 MS_ACTIVE = 0x40000000 MS_ASYNC = 0x1 MS_BIND = 0x1000 MS_BORN = 0x20000000 MS_DIRSYNC = 0x80 MS_INVALIDATE = 0x2 MS_I_VERSION = 0x800000 MS_KERNMOUNT = 0x400000 MS_LAZYTIME = 0x2000000 MS_MANDLOCK = 0x40 MS_MGC_MSK = 0xffff0000 MS_MGC_VAL = 0xc0ed0000 MS_MOVE = 0x2000 MS_NOATIME = 0x400 MS_NODEV = 0x4 MS_NODIRATIME = 0x800 MS_NOEXEC = 0x8 MS_NOREMOTELOCK = 0x8000000 MS_NOSEC = 0x10000000 MS_NOSUID = 0x2 MS_NOUSER = -0x80000000 MS_POSIXACL = 0x10000 MS_PRIVATE = 0x40000 MS_RDONLY = 0x1 MS_REC = 0x4000 MS_RELATIME = 0x200000 MS_REMOUNT = 0x20 MS_RMT_MASK = 0x2800051 MS_SHARED = 0x100000 MS_SILENT = 0x8000 MS_SLAVE = 0x80000 MS_STRICTATIME = 0x1000000 MS_SUBMOUNT = 0x4000000 MS_SYNC = 0x4 MS_SYNCHRONOUS = 0x10 MS_UNBINDABLE = 0x20000 MS_VERBOSE = 0x8000 NAME_MAX = 0xff NETLINK_ADD_MEMBERSHIP = 0x1 NETLINK_AUDIT = 0x9 NETLINK_BROADCAST_ERROR = 0x4 NETLINK_CAP_ACK = 0xa NETLINK_CONNECTOR = 0xb NETLINK_CRYPTO = 0x15 NETLINK_DNRTMSG = 0xe NETLINK_DROP_MEMBERSHIP = 0x2 NETLINK_ECRYPTFS = 0x13 NETLINK_EXT_ACK = 0xb NETLINK_FIB_LOOKUP = 0xa NETLINK_FIREWALL = 0x3 NETLINK_GENERIC = 0x10 NETLINK_INET_DIAG = 0x4 NETLINK_IP6_FW = 0xd NETLINK_ISCSI = 0x8 NETLINK_KOBJECT_UEVENT = 0xf NETLINK_LISTEN_ALL_NSID = 0x8 NETLINK_LIST_MEMBERSHIPS = 0x9 NETLINK_NETFILTER = 0xc NETLINK_NFLOG = 0x5 NETLINK_NO_ENOBUFS = 0x5 NETLINK_PKTINFO = 0x3 NETLINK_RDMA = 0x14 NETLINK_ROUTE = 0x0 NETLINK_RX_RING = 0x6 NETLINK_SCSITRANSPORT = 0x12 NETLINK_SELINUX = 0x7 NETLINK_SMC = 0x16 NETLINK_SOCK_DIAG = 0x4 NETLINK_TX_RING = 0x7 NETLINK_UNUSED = 0x1 NETLINK_USERSOCK = 0x2 NETLINK_XFRM = 0x6 NL0 = 0x0 NL1 = 0x100 NL2 = 0x200 NL3 = 0x300 NLA_ALIGNTO = 0x4 NLA_F_NESTED = 0x8000 NLA_F_NET_BYTEORDER = 0x4000 NLA_HDRLEN = 0x4 NLDLY = 0x300 NLMSG_ALIGNTO = 0x4 NLMSG_DONE = 0x3 NLMSG_ERROR = 0x2 NLMSG_HDRLEN = 0x10 NLMSG_MIN_TYPE = 0x10 NLMSG_NOOP = 0x1 NLMSG_OVERRUN = 0x4 NLM_F_ACK = 0x4 NLM_F_ACK_TLVS = 0x200 NLM_F_APPEND = 0x800 NLM_F_ATOMIC = 0x400 NLM_F_CAPPED = 0x100 NLM_F_CREATE = 0x400 NLM_F_DUMP = 0x300 NLM_F_DUMP_FILTERED = 0x20 NLM_F_DUMP_INTR = 0x10 NLM_F_ECHO = 0x8 NLM_F_EXCL = 0x200 NLM_F_MATCH = 0x200 NLM_F_MULTI = 0x2 NLM_F_REPLACE = 0x100 NLM_F_REQUEST = 0x1 NLM_F_ROOT = 0x100 NOFLSH = 0x80000000 OCRNL = 0x8 OFDEL = 0x80 OFILL = 0x40 OLCUC = 0x4 ONLCR = 0x2 ONLRET = 0x20 ONOCR = 0x10 OPOST = 0x1 O_ACCMODE = 0x3 O_APPEND = 0x400 O_ASYNC = 0x2000 O_CLOEXEC = 0x80000 O_CREAT = 0x40 O_DIRECT = 0x20000 O_DIRECTORY = 0x4000 O_DSYNC = 0x1000 O_EXCL = 0x80 O_FSYNC = 0x101000 O_LARGEFILE = 0x0 O_NDELAY = 0x800 O_NOATIME = 0x40000 O_NOCTTY = 0x100 O_NOFOLLOW = 0x8000 O_NONBLOCK = 0x800 O_PATH = 0x200000 O_RDONLY = 0x0 O_RDWR = 0x2 O_RSYNC = 0x101000 O_SYNC = 0x101000 O_TMPFILE = 0x404000 O_TRUNC = 0x200 O_WRONLY = 0x1 PACKET_ADD_MEMBERSHIP = 0x1 PACKET_AUXDATA = 0x8 PACKET_BROADCAST = 0x1 PACKET_COPY_THRESH = 0x7 PACKET_DROP_MEMBERSHIP = 0x2 PACKET_FANOUT = 0x12 PACKET_FANOUT_CBPF = 0x6 PACKET_FANOUT_CPU = 0x2 PACKET_FANOUT_DATA = 0x16 PACKET_FANOUT_EBPF = 0x7 PACKET_FANOUT_FLAG_DEFRAG = 0x8000 PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 PACKET_FANOUT_HASH = 0x0 PACKET_FANOUT_LB = 0x1 PACKET_FANOUT_QM = 0x5 PACKET_FANOUT_RND = 0x4 PACKET_FANOUT_ROLLOVER = 0x3 PACKET_FASTROUTE = 0x6 PACKET_HDRLEN = 0xb PACKET_HOST = 0x0 PACKET_KERNEL = 0x7 PACKET_LOOPBACK = 0x5 PACKET_LOSS = 0xe PACKET_MR_ALLMULTI = 0x2 PACKET_MR_MULTICAST = 0x0 PACKET_MR_PROMISC = 0x1 PACKET_MR_UNICAST = 0x3 PACKET_MULTICAST = 0x2 PACKET_ORIGDEV = 0x9 PACKET_OTHERHOST = 0x3 PACKET_OUTGOING = 0x4 PACKET_QDISC_BYPASS = 0x14 PACKET_RECV_OUTPUT = 0x3 PACKET_RESERVE = 0xc PACKET_ROLLOVER_STATS = 0x15 PACKET_RX_RING = 0x5 PACKET_STATISTICS = 0x6 PACKET_TIMESTAMP = 0x11 PACKET_TX_HAS_OFF = 0x13 PACKET_TX_RING = 0xd PACKET_TX_TIMESTAMP = 0x10 PACKET_USER = 0x6 PACKET_VERSION = 0xa PACKET_VNET_HDR = 0xf PARENB = 0x1000 PARITY_CRC16_PR0 = 0x2 PARITY_CRC16_PR0_CCITT = 0x4 PARITY_CRC16_PR1 = 0x3 PARITY_CRC16_PR1_CCITT = 0x5 PARITY_CRC32_PR0_CCITT = 0x6 PARITY_CRC32_PR1_CCITT = 0x7 PARITY_DEFAULT = 0x0 PARITY_NONE = 0x1 PARMRK = 0x8 PARODD = 0x2000 PENDIN = 0x20000000 PERF_EVENT_IOC_DISABLE = 0x20002401 PERF_EVENT_IOC_ENABLE = 0x20002400 PERF_EVENT_IOC_ID = 0x40082407 PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 PERF_EVENT_IOC_PERIOD = 0x80082404 PERF_EVENT_IOC_REFRESH = 0x20002402 PERF_EVENT_IOC_RESET = 0x20002403 PERF_EVENT_IOC_SET_BPF = 0x80042408 PERF_EVENT_IOC_SET_FILTER = 0x80082406 PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 PROT_EXEC = 0x4 PROT_GROWSDOWN = 0x1000000 PROT_GROWSUP = 0x2000000 PROT_NONE = 0x0 PROT_READ = 0x1 PROT_SAO = 0x10 PROT_WRITE = 0x2 PR_CAPBSET_DROP = 0x18 PR_CAPBSET_READ = 0x17 PR_CAP_AMBIENT = 0x2f PR_CAP_AMBIENT_CLEAR_ALL = 0x4 PR_CAP_AMBIENT_IS_SET = 0x1 PR_CAP_AMBIENT_LOWER = 0x3 PR_CAP_AMBIENT_RAISE = 0x2 PR_ENDIAN_BIG = 0x0 PR_ENDIAN_LITTLE = 0x1 PR_ENDIAN_PPC_LITTLE = 0x2 PR_FPEMU_NOPRINT = 0x1 PR_FPEMU_SIGFPE = 0x2 PR_FP_EXC_ASYNC = 0x2 PR_FP_EXC_DISABLED = 0x0 PR_FP_EXC_DIV = 0x10000 PR_FP_EXC_INV = 0x100000 PR_FP_EXC_NONRECOV = 0x1 PR_FP_EXC_OVF = 0x20000 PR_FP_EXC_PRECISE = 0x3 PR_FP_EXC_RES = 0x80000 PR_FP_EXC_SW_ENABLE = 0x80 PR_FP_EXC_UND = 0x40000 PR_FP_MODE_FR = 0x1 PR_FP_MODE_FRE = 0x2 PR_GET_CHILD_SUBREAPER = 0x25 PR_GET_DUMPABLE = 0x3 PR_GET_ENDIAN = 0x13 PR_GET_FPEMU = 0x9 PR_GET_FPEXC = 0xb PR_GET_FP_MODE = 0x2e PR_GET_KEEPCAPS = 0x7 PR_GET_NAME = 0x10 PR_GET_NO_NEW_PRIVS = 0x27 PR_GET_PDEATHSIG = 0x2 PR_GET_SECCOMP = 0x15 PR_GET_SECUREBITS = 0x1b PR_GET_THP_DISABLE = 0x2a PR_GET_TID_ADDRESS = 0x28 PR_GET_TIMERSLACK = 0x1e PR_GET_TIMING = 0xd PR_GET_TSC = 0x19 PR_GET_UNALIGN = 0x5 PR_MCE_KILL = 0x21 PR_MCE_KILL_CLEAR = 0x0 PR_MCE_KILL_DEFAULT = 0x2 PR_MCE_KILL_EARLY = 0x1 PR_MCE_KILL_GET = 0x22 PR_MCE_KILL_LATE = 0x0 PR_MCE_KILL_SET = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b PR_SET_CHILD_SUBREAPER = 0x24 PR_SET_DUMPABLE = 0x4 PR_SET_ENDIAN = 0x14 PR_SET_FPEMU = 0xa PR_SET_FPEXC = 0xc PR_SET_FP_MODE = 0x2d PR_SET_KEEPCAPS = 0x8 PR_SET_MM = 0x23 PR_SET_MM_ARG_END = 0x9 PR_SET_MM_ARG_START = 0x8 PR_SET_MM_AUXV = 0xc PR_SET_MM_BRK = 0x7 PR_SET_MM_END_CODE = 0x2 PR_SET_MM_END_DATA = 0x4 PR_SET_MM_ENV_END = 0xb PR_SET_MM_ENV_START = 0xa PR_SET_MM_EXE_FILE = 0xd PR_SET_MM_MAP = 0xe PR_SET_MM_MAP_SIZE = 0xf PR_SET_MM_START_BRK = 0x6 PR_SET_MM_START_CODE = 0x1 PR_SET_MM_START_DATA = 0x3 PR_SET_MM_START_STACK = 0x5 PR_SET_NAME = 0xf PR_SET_NO_NEW_PRIVS = 0x26 PR_SET_PDEATHSIG = 0x1 PR_SET_PTRACER = 0x59616d61 PR_SET_PTRACER_ANY = 0xffffffffffffffff PR_SET_SECCOMP = 0x16 PR_SET_SECUREBITS = 0x1c PR_SET_THP_DISABLE = 0x29 PR_SET_TIMERSLACK = 0x1d PR_SET_TIMING = 0xe PR_SET_TSC = 0x1a PR_SET_UNALIGN = 0x6 PR_TASK_PERF_EVENTS_DISABLE = 0x1f PR_TASK_PERF_EVENTS_ENABLE = 0x20 PR_TIMING_STATISTICAL = 0x0 PR_TIMING_TIMESTAMP = 0x1 PR_TSC_ENABLE = 0x1 PR_TSC_SIGSEGV = 0x2 PR_UNALIGN_NOPRINT = 0x1 PR_UNALIGN_SIGBUS = 0x2 PTRACE_ATTACH = 0x10 PTRACE_CONT = 0x7 PTRACE_DETACH = 0x11 PTRACE_EVENT_CLONE = 0x3 PTRACE_EVENT_EXEC = 0x4 PTRACE_EVENT_EXIT = 0x6 PTRACE_EVENT_FORK = 0x1 PTRACE_EVENT_SECCOMP = 0x7 PTRACE_EVENT_STOP = 0x80 PTRACE_EVENT_VFORK = 0x2 PTRACE_EVENT_VFORK_DONE = 0x5 PTRACE_GETEVENTMSG = 0x4201 PTRACE_GETEVRREGS = 0x14 PTRACE_GETFPREGS = 0xe PTRACE_GETREGS = 0xc PTRACE_GETREGS64 = 0x16 PTRACE_GETREGSET = 0x4204 PTRACE_GETSIGINFO = 0x4202 PTRACE_GETSIGMASK = 0x420a PTRACE_GETVRREGS = 0x12 PTRACE_GETVSRREGS = 0x1b PTRACE_GET_DEBUGREG = 0x19 PTRACE_INTERRUPT = 0x4207 PTRACE_KILL = 0x8 PTRACE_LISTEN = 0x4208 PTRACE_O_EXITKILL = 0x100000 PTRACE_O_MASK = 0x3000ff PTRACE_O_SUSPEND_SECCOMP = 0x200000 PTRACE_O_TRACECLONE = 0x8 PTRACE_O_TRACEEXEC = 0x10 PTRACE_O_TRACEEXIT = 0x40 PTRACE_O_TRACEFORK = 0x2 PTRACE_O_TRACESECCOMP = 0x80 PTRACE_O_TRACESYSGOOD = 0x1 PTRACE_O_TRACEVFORK = 0x4 PTRACE_O_TRACEVFORKDONE = 0x20 PTRACE_PEEKDATA = 0x2 PTRACE_PEEKSIGINFO = 0x4209 PTRACE_PEEKSIGINFO_SHARED = 0x1 PTRACE_PEEKTEXT = 0x1 PTRACE_PEEKUSR = 0x3 PTRACE_POKEDATA = 0x5 PTRACE_POKETEXT = 0x4 PTRACE_POKEUSR = 0x6 PTRACE_SECCOMP_GET_FILTER = 0x420c PTRACE_SEIZE = 0x4206 PTRACE_SETEVRREGS = 0x15 PTRACE_SETFPREGS = 0xf PTRACE_SETOPTIONS = 0x4200 PTRACE_SETREGS = 0xd PTRACE_SETREGS64 = 0x17 PTRACE_SETREGSET = 0x4205 PTRACE_SETSIGINFO = 0x4203 PTRACE_SETSIGMASK = 0x420b PTRACE_SETVRREGS = 0x13 PTRACE_SETVSRREGS = 0x1c PTRACE_SET_DEBUGREG = 0x1a PTRACE_SINGLEBLOCK = 0x100 PTRACE_SINGLESTEP = 0x9 PTRACE_SYSCALL = 0x18 PTRACE_TRACEME = 0x0 PT_CCR = 0x26 PT_CTR = 0x23 PT_DAR = 0x29 PT_DSCR = 0x2c PT_DSISR = 0x2a PT_FPR0 = 0x30 PT_FPSCR = 0x50 PT_LNK = 0x24 PT_MSR = 0x21 PT_NIP = 0x20 PT_ORIG_R3 = 0x22 PT_R0 = 0x0 PT_R1 = 0x1 PT_R10 = 0xa PT_R11 = 0xb PT_R12 = 0xc PT_R13 = 0xd PT_R14 = 0xe PT_R15 = 0xf PT_R16 = 0x10 PT_R17 = 0x11 PT_R18 = 0x12 PT_R19 = 0x13 PT_R2 = 0x2 PT_R20 = 0x14 PT_R21 = 0x15 PT_R22 = 0x16 PT_R23 = 0x17 PT_R24 = 0x18 PT_R25 = 0x19 PT_R26 = 0x1a PT_R27 = 0x1b PT_R28 = 0x1c PT_R29 = 0x1d PT_R3 = 0x3 PT_R30 = 0x1e PT_R31 = 0x1f PT_R4 = 0x4 PT_R5 = 0x5 PT_R6 = 0x6 PT_R7 = 0x7 PT_R8 = 0x8 PT_R9 = 0x9 PT_REGS_COUNT = 0x2c PT_RESULT = 0x2b PT_SOFTE = 0x27 PT_TRAP = 0x28 PT_VR0 = 0x52 PT_VRSAVE = 0x94 PT_VSCR = 0x93 PT_VSR0 = 0x96 PT_VSR31 = 0xd4 PT_XER = 0x25 RLIMIT_AS = 0x9 RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 RLIMIT_LOCKS = 0xa RLIMIT_MEMLOCK = 0x8 RLIMIT_MSGQUEUE = 0xc RLIMIT_NICE = 0xd RLIMIT_NOFILE = 0x7 RLIMIT_NPROC = 0x6 RLIMIT_RSS = 0x5 RLIMIT_RTPRIO = 0xe RLIMIT_RTTIME = 0xf RLIMIT_SIGPENDING = 0xb RLIMIT_STACK = 0x3 RLIM_INFINITY = 0xffffffffffffffff RTAX_ADVMSS = 0x8 RTAX_CC_ALGO = 0x10 RTAX_CWND = 0x7 RTAX_FEATURES = 0xc RTAX_FEATURE_ALLFRAG = 0x8 RTAX_FEATURE_ECN = 0x1 RTAX_FEATURE_MASK = 0xf RTAX_FEATURE_SACK = 0x2 RTAX_FEATURE_TIMESTAMP = 0x4 RTAX_HOPLIMIT = 0xa RTAX_INITCWND = 0xb RTAX_INITRWND = 0xe RTAX_LOCK = 0x1 RTAX_MAX = 0x10 RTAX_MTU = 0x2 RTAX_QUICKACK = 0xf RTAX_REORDERING = 0x9 RTAX_RTO_MIN = 0xd RTAX_RTT = 0x4 RTAX_RTTVAR = 0x5 RTAX_SSTHRESH = 0x6 RTAX_UNSPEC = 0x0 RTAX_WINDOW = 0x3 RTA_ALIGNTO = 0x4 RTA_MAX = 0x1a RTCF_DIRECTSRC = 0x4000000 RTCF_DOREDIRECT = 0x1000000 RTCF_LOG = 0x2000000 RTCF_MASQ = 0x400000 RTCF_NAT = 0x800000 RTCF_VALVE = 0x200000 RTF_ADDRCLASSMASK = 0xf8000000 RTF_ADDRCONF = 0x40000 RTF_ALLONLINK = 0x20000 RTF_BROADCAST = 0x10000000 RTF_CACHE = 0x1000000 RTF_DEFAULT = 0x10000 RTF_DYNAMIC = 0x10 RTF_FLOW = 0x2000000 RTF_GATEWAY = 0x2 RTF_HOST = 0x4 RTF_INTERFACE = 0x40000000 RTF_IRTT = 0x100 RTF_LINKRT = 0x100000 RTF_LOCAL = 0x80000000 RTF_MODIFIED = 0x20 RTF_MSS = 0x40 RTF_MTU = 0x40 RTF_MULTICAST = 0x20000000 RTF_NAT = 0x8000000 RTF_NOFORWARD = 0x1000 RTF_NONEXTHOP = 0x200000 RTF_NOPMTUDISC = 0x4000 RTF_POLICY = 0x4000000 RTF_REINSTATE = 0x8 RTF_REJECT = 0x200 RTF_STATIC = 0x400 RTF_THROW = 0x2000 RTF_UP = 0x1 RTF_WINDOW = 0x80 RTF_XRESOLVE = 0x800 RTM_BASE = 0x10 RTM_DELACTION = 0x31 RTM_DELADDR = 0x15 RTM_DELADDRLABEL = 0x49 RTM_DELLINK = 0x11 RTM_DELMDB = 0x55 RTM_DELNEIGH = 0x1d RTM_DELNETCONF = 0x51 RTM_DELNSID = 0x59 RTM_DELQDISC = 0x25 RTM_DELROUTE = 0x19 RTM_DELRULE = 0x21 RTM_DELTCLASS = 0x29 RTM_DELTFILTER = 0x2d RTM_F_CLONED = 0x200 RTM_F_EQUALIZE = 0x400 RTM_F_FIB_MATCH = 0x2000 RTM_F_LOOKUP_TABLE = 0x1000 RTM_F_NOTIFY = 0x100 RTM_F_PREFIX = 0x800 RTM_GETACTION = 0x32 RTM_GETADDR = 0x16 RTM_GETADDRLABEL = 0x4a RTM_GETANYCAST = 0x3e RTM_GETDCB = 0x4e RTM_GETLINK = 0x12 RTM_GETMDB = 0x56 RTM_GETMULTICAST = 0x3a RTM_GETNEIGH = 0x1e RTM_GETNEIGHTBL = 0x42 RTM_GETNETCONF = 0x52 RTM_GETNSID = 0x5a RTM_GETQDISC = 0x26 RTM_GETROUTE = 0x1a RTM_GETRULE = 0x22 RTM_GETSTATS = 0x5e RTM_GETTCLASS = 0x2a RTM_GETTFILTER = 0x2e RTM_MAX = 0x63 RTM_NEWACTION = 0x30 RTM_NEWADDR = 0x14 RTM_NEWADDRLABEL = 0x48 RTM_NEWCACHEREPORT = 0x60 RTM_NEWLINK = 0x10 RTM_NEWMDB = 0x54 RTM_NEWNDUSEROPT = 0x44 RTM_NEWNEIGH = 0x1c RTM_NEWNEIGHTBL = 0x40 RTM_NEWNETCONF = 0x50 RTM_NEWNSID = 0x58 RTM_NEWPREFIX = 0x34 RTM_NEWQDISC = 0x24 RTM_NEWROUTE = 0x18 RTM_NEWRULE = 0x20 RTM_NEWSTATS = 0x5c RTM_NEWTCLASS = 0x28 RTM_NEWTFILTER = 0x2c RTM_NR_FAMILIES = 0x15 RTM_NR_MSGTYPES = 0x54 RTM_SETDCB = 0x4f RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 RTNH_ALIGNTO = 0x4 RTNH_COMPARE_MASK = 0x19 RTNH_F_DEAD = 0x1 RTNH_F_LINKDOWN = 0x10 RTNH_F_OFFLOAD = 0x8 RTNH_F_ONLINK = 0x4 RTNH_F_PERVASIVE = 0x2 RTNH_F_UNRESOLVED = 0x20 RTN_MAX = 0xb RTPROT_BABEL = 0x2a RTPROT_BIRD = 0xc RTPROT_BOOT = 0x3 RTPROT_DHCP = 0x10 RTPROT_DNROUTED = 0xd RTPROT_GATED = 0x8 RTPROT_KERNEL = 0x2 RTPROT_MROUTED = 0x11 RTPROT_MRT = 0xa RTPROT_NTK = 0xf RTPROT_RA = 0x9 RTPROT_REDIRECT = 0x1 RTPROT_STATIC = 0x4 RTPROT_UNSPEC = 0x0 RTPROT_XORP = 0xe RTPROT_ZEBRA = 0xb RT_CLASS_DEFAULT = 0xfd RT_CLASS_LOCAL = 0xff RT_CLASS_MAIN = 0xfe RT_CLASS_MAX = 0xff RT_CLASS_UNSPEC = 0x0 RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 RUSAGE_THREAD = 0x1 SCM_CREDENTIALS = 0x2 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x1d SCM_TIMESTAMPING = 0x25 SCM_TIMESTAMPING_OPT_STATS = 0x36 SCM_TIMESTAMPING_PKTINFO = 0x3a SCM_TIMESTAMPNS = 0x23 SCM_WIFI_STATUS = 0x29 SECCOMP_MODE_DISABLED = 0x0 SECCOMP_MODE_FILTER = 0x2 SECCOMP_MODE_STRICT = 0x1 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 SIOCADDDLCI = 0x8980 SIOCADDMULTI = 0x8931 SIOCADDRT = 0x890b SIOCATMARK = 0x8905 SIOCBONDCHANGEACTIVE = 0x8995 SIOCBONDENSLAVE = 0x8990 SIOCBONDINFOQUERY = 0x8994 SIOCBONDRELEASE = 0x8991 SIOCBONDSETHWADDR = 0x8992 SIOCBONDSLAVEINFOQUERY = 0x8993 SIOCBRADDBR = 0x89a0 SIOCBRADDIF = 0x89a2 SIOCBRDELBR = 0x89a1 SIOCBRDELIF = 0x89a3 SIOCDARP = 0x8953 SIOCDELDLCI = 0x8981 SIOCDELMULTI = 0x8932 SIOCDELRT = 0x890c SIOCDEVPRIVATE = 0x89f0 SIOCDIFADDR = 0x8936 SIOCDRARP = 0x8960 SIOCETHTOOL = 0x8946 SIOCGARP = 0x8954 SIOCGHWTSTAMP = 0x89b1 SIOCGIFADDR = 0x8915 SIOCGIFBR = 0x8940 SIOCGIFBRDADDR = 0x8919 SIOCGIFCONF = 0x8912 SIOCGIFCOUNT = 0x8938 SIOCGIFDSTADDR = 0x8917 SIOCGIFENCAP = 0x8925 SIOCGIFFLAGS = 0x8913 SIOCGIFHWADDR = 0x8927 SIOCGIFINDEX = 0x8933 SIOCGIFMAP = 0x8970 SIOCGIFMEM = 0x891f SIOCGIFMETRIC = 0x891d SIOCGIFMTU = 0x8921 SIOCGIFNAME = 0x8910 SIOCGIFNETMASK = 0x891b SIOCGIFPFLAGS = 0x8935 SIOCGIFSLAVE = 0x8929 SIOCGIFTXQLEN = 0x8942 SIOCGIFVLAN = 0x8982 SIOCGMIIPHY = 0x8947 SIOCGMIIREG = 0x8948 SIOCGPGRP = 0x8904 SIOCGRARP = 0x8961 SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 SIOCGSTAMPNS = 0x8907 SIOCINQ = 0x4004667f SIOCOUTQ = 0x40047473 SIOCOUTQNSD = 0x894b SIOCPROTOPRIVATE = 0x89e0 SIOCRTMSG = 0x890d SIOCSARP = 0x8955 SIOCSHWTSTAMP = 0x89b0 SIOCSIFADDR = 0x8916 SIOCSIFBR = 0x8941 SIOCSIFBRDADDR = 0x891a SIOCSIFDSTADDR = 0x8918 SIOCSIFENCAP = 0x8926 SIOCSIFFLAGS = 0x8914 SIOCSIFHWADDR = 0x8924 SIOCSIFHWBROADCAST = 0x8937 SIOCSIFLINK = 0x8911 SIOCSIFMAP = 0x8971 SIOCSIFMEM = 0x8920 SIOCSIFMETRIC = 0x891e SIOCSIFMTU = 0x8922 SIOCSIFNAME = 0x8923 SIOCSIFNETMASK = 0x891c SIOCSIFPFLAGS = 0x8934 SIOCSIFSLAVE = 0x8930 SIOCSIFTXQLEN = 0x8943 SIOCSIFVLAN = 0x8983 SIOCSMIIREG = 0x8949 SIOCSPGRP = 0x8902 SIOCSRARP = 0x8962 SIOCWANDEV = 0x894a SOCK_CLOEXEC = 0x80000 SOCK_DCCP = 0x6 SOCK_DGRAM = 0x2 SOCK_IOC_TYPE = 0x89 SOCK_NONBLOCK = 0x800 SOCK_PACKET = 0xa SOCK_RAW = 0x3 SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x1 SOL_AAL = 0x109 SOL_ALG = 0x117 SOL_ATM = 0x108 SOL_CAIF = 0x116 SOL_CAN_BASE = 0x64 SOL_DCCP = 0x10d SOL_DECNET = 0x105 SOL_ICMPV6 = 0x3a SOL_IP = 0x0 SOL_IPV6 = 0x29 SOL_IRDA = 0x10a SOL_IUCV = 0x115 SOL_KCM = 0x119 SOL_LLC = 0x10c SOL_NETBEUI = 0x10b SOL_NETLINK = 0x10e SOL_NFC = 0x118 SOL_PACKET = 0x107 SOL_PNPIPE = 0x113 SOL_PPPOL2TP = 0x111 SOL_RAW = 0xff SOL_RDS = 0x114 SOL_RXRPC = 0x110 SOL_SOCKET = 0x1 SOL_TCP = 0x6 SOL_TIPC = 0x10f SOL_X25 = 0x106 SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x1e SO_ATTACH_BPF = 0x32 SO_ATTACH_FILTER = 0x1a SO_ATTACH_REUSEPORT_CBPF = 0x33 SO_ATTACH_REUSEPORT_EBPF = 0x34 SO_BINDTODEVICE = 0x19 SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe SO_BUSY_POLL = 0x2e SO_CNX_ADVICE = 0x35 SO_COOKIE = 0x39 SO_DEBUG = 0x1 SO_DETACH_BPF = 0x1b SO_DETACH_FILTER = 0x1b SO_DOMAIN = 0x27 SO_DONTROUTE = 0x5 SO_ERROR = 0x4 SO_GET_FILTER = 0x1a SO_INCOMING_CPU = 0x31 SO_INCOMING_NAPI_ID = 0x38 SO_KEEPALIVE = 0x9 SO_LINGER = 0xd SO_LOCK_FILTER = 0x2c SO_MARK = 0x24 SO_MAX_PACING_RATE = 0x2f SO_MEMINFO = 0x37 SO_NOFCS = 0x2b SO_NO_CHECK = 0xb SO_OOBINLINE = 0xa SO_PASSCRED = 0x14 SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x15 SO_PEERGROUPS = 0x3b SO_PEERNAME = 0x1c SO_PEERSEC = 0x1f SO_PRIORITY = 0xc SO_PROTOCOL = 0x26 SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x10 SO_RCVTIMEO = 0x12 SO_REUSEADDR = 0x2 SO_REUSEPORT = 0xf SO_RXQ_OVFL = 0x28 SO_SECURITY_AUTHENTICATION = 0x16 SO_SECURITY_ENCRYPTION_NETWORK = 0x18 SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 SO_SELECT_ERR_QUEUE = 0x2d SO_SNDBUF = 0x7 SO_SNDBUFFORCE = 0x20 SO_SNDLOWAT = 0x11 SO_SNDTIMEO = 0x13 SO_TIMESTAMP = 0x1d SO_TIMESTAMPING = 0x25 SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x3 SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 SO_VM_SOCKETS_BUFFER_SIZE = 0x0 SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 SO_VM_SOCKETS_TRUSTED = 0x5 SO_WIFI_STATUS = 0x29 SPLICE_F_GIFT = 0x8 SPLICE_F_MORE = 0x4 SPLICE_F_MOVE = 0x1 SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000 S_IFCHR = 0x2000 S_IFDIR = 0x4000 S_IFIFO = 0x1000 S_IFLNK = 0xa000 S_IFMT = 0xf000 S_IFREG = 0x8000 S_IFSOCK = 0xc000 S_IREAD = 0x100 S_IRGRP = 0x20 S_IROTH = 0x4 S_IRUSR = 0x100 S_IRWXG = 0x38 S_IRWXO = 0x7 S_IRWXU = 0x1c0 S_ISGID = 0x400 S_ISUID = 0x800 S_ISVTX = 0x200 S_IWGRP = 0x10 S_IWOTH = 0x2 S_IWRITE = 0x80 S_IWUSR = 0x80 S_IXGRP = 0x8 S_IXOTH = 0x1 S_IXUSR = 0x40 TAB0 = 0x0 TAB1 = 0x400 TAB2 = 0x800 TAB3 = 0xc00 TABDLY = 0xc00 TASKSTATS_CMD_ATTR_MAX = 0x4 TASKSTATS_CMD_MAX = 0x2 TASKSTATS_GENL_NAME = "TASKSTATS" TASKSTATS_GENL_VERSION = 0x1 TASKSTATS_TYPE_MAX = 0x6 TASKSTATS_VERSION = 0x8 TCFLSH = 0x2000741f TCGETA = 0x40147417 TCGETS = 0x402c7413 TCIFLUSH = 0x0 TCIOFF = 0x2 TCIOFLUSH = 0x2 TCION = 0x3 TCOFLUSH = 0x1 TCOOFF = 0x0 TCOON = 0x1 TCP_CC_INFO = 0x1a TCP_CONGESTION = 0xd TCP_COOKIE_IN_ALWAYS = 0x1 TCP_COOKIE_MAX = 0x10 TCP_COOKIE_MIN = 0x8 TCP_COOKIE_OUT_NEVER = 0x2 TCP_COOKIE_PAIR_SIZE = 0x20 TCP_COOKIE_TRANSACTIONS = 0xf TCP_CORK = 0x3 TCP_DEFER_ACCEPT = 0x9 TCP_FASTOPEN = 0x17 TCP_FASTOPEN_CONNECT = 0x1e TCP_INFO = 0xb TCP_KEEPCNT = 0x6 TCP_KEEPIDLE = 0x4 TCP_KEEPINTVL = 0x5 TCP_LINGER2 = 0x8 TCP_MAXSEG = 0x2 TCP_MAXWIN = 0xffff TCP_MAX_WINSHIFT = 0xe TCP_MD5SIG = 0xe TCP_MD5SIG_MAXKEYLEN = 0x50 TCP_MSS = 0x200 TCP_MSS_DEFAULT = 0x218 TCP_MSS_DESIRED = 0x4c4 TCP_NODELAY = 0x1 TCP_NOTSENT_LOWAT = 0x19 TCP_QUEUE_SEQ = 0x15 TCP_QUICKACK = 0xc TCP_REPAIR = 0x13 TCP_REPAIR_OPTIONS = 0x16 TCP_REPAIR_QUEUE = 0x14 TCP_REPAIR_WINDOW = 0x1d TCP_SAVED_SYN = 0x1c TCP_SAVE_SYN = 0x1b TCP_SYNCNT = 0x7 TCP_S_DATA_IN = 0x4 TCP_S_DATA_OUT = 0x8 TCP_THIN_DUPACK = 0x11 TCP_THIN_LINEAR_TIMEOUTS = 0x10 TCP_TIMESTAMP = 0x18 TCP_USER_TIMEOUT = 0x12 TCP_WINDOW_CLAMP = 0xa TCSAFLUSH = 0x2 TCSBRK = 0x2000741d TCSBRKP = 0x5425 TCSETA = 0x80147418 TCSETAF = 0x8014741c TCSETAW = 0x80147419 TCSETS = 0x802c7414 TCSETSF = 0x802c7416 TCSETSW = 0x802c7415 TCXONC = 0x2000741e TIOCCBRK = 0x5428 TIOCCONS = 0x541d TIOCEXCL = 0x540c TIOCGDEV = 0x40045432 TIOCGETC = 0x40067412 TIOCGETD = 0x5424 TIOCGETP = 0x40067408 TIOCGEXCL = 0x40045440 TIOCGICOUNT = 0x545d TIOCGLCKTRMIOS = 0x5456 TIOCGLTC = 0x40067474 TIOCGPGRP = 0x40047477 TIOCGPKT = 0x40045438 TIOCGPTLCK = 0x40045439 TIOCGPTN = 0x40045430 TIOCGPTPEER = 0x20005441 TIOCGRS485 = 0x542e TIOCGSERIAL = 0x541e TIOCGSID = 0x5429 TIOCGSOFTCAR = 0x5419 TIOCGWINSZ = 0x40087468 TIOCINQ = 0x4004667f TIOCLINUX = 0x541c TIOCMBIC = 0x5417 TIOCMBIS = 0x5416 TIOCMGET = 0x5415 TIOCMIWAIT = 0x545c TIOCMSET = 0x5418 TIOCM_CAR = 0x40 TIOCM_CD = 0x40 TIOCM_CTS = 0x20 TIOCM_DSR = 0x100 TIOCM_DTR = 0x2 TIOCM_LE = 0x1 TIOCM_LOOP = 0x8000 TIOCM_OUT1 = 0x2000 TIOCM_OUT2 = 0x4000 TIOCM_RI = 0x80 TIOCM_RNG = 0x80 TIOCM_RTS = 0x4 TIOCM_SR = 0x10 TIOCM_ST = 0x8 TIOCNOTTY = 0x5422 TIOCNXCL = 0x540d TIOCOUTQ = 0x40047473 TIOCPKT = 0x5420 TIOCPKT_DATA = 0x0 TIOCPKT_DOSTOP = 0x20 TIOCPKT_FLUSHREAD = 0x1 TIOCPKT_FLUSHWRITE = 0x2 TIOCPKT_IOCTL = 0x40 TIOCPKT_NOSTOP = 0x10 TIOCPKT_START = 0x8 TIOCPKT_STOP = 0x4 TIOCSBRK = 0x5427 TIOCSCTTY = 0x540e TIOCSERCONFIG = 0x5453 TIOCSERGETLSR = 0x5459 TIOCSERGETMULTI = 0x545a TIOCSERGSTRUCT = 0x5458 TIOCSERGWILD = 0x5454 TIOCSERSETMULTI = 0x545b TIOCSERSWILD = 0x5455 TIOCSER_TEMT = 0x1 TIOCSETC = 0x80067411 TIOCSETD = 0x5423 TIOCSETN = 0x8006740a TIOCSETP = 0x80067409 TIOCSIG = 0x80045436 TIOCSLCKTRMIOS = 0x5457 TIOCSLTC = 0x80067475 TIOCSPGRP = 0x80047476 TIOCSPTLCK = 0x80045431 TIOCSRS485 = 0x542f TIOCSSERIAL = 0x541f TIOCSSOFTCAR = 0x541a TIOCSTART = 0x2000746e TIOCSTI = 0x5412 TIOCSTOP = 0x2000746f TIOCSWINSZ = 0x80087467 TIOCVHANGUP = 0x5437 TOSTOP = 0x400000 TS_COMM_LEN = 0x20 TUNATTACHFILTER = 0x801054d5 TUNDETACHFILTER = 0x801054d6 TUNGETFEATURES = 0x400454cf TUNGETFILTER = 0x401054db TUNGETIFF = 0x400454d2 TUNGETSNDBUF = 0x400454d3 TUNGETVNETBE = 0x400454df TUNGETVNETHDRSZ = 0x400454d7 TUNGETVNETLE = 0x400454dd TUNSETDEBUG = 0x800454c9 TUNSETGROUP = 0x800454ce TUNSETIFF = 0x800454ca TUNSETIFINDEX = 0x800454da TUNSETLINK = 0x800454cd TUNSETNOCSUM = 0x800454c8 TUNSETOFFLOAD = 0x800454d0 TUNSETOWNER = 0x800454cc TUNSETPERSIST = 0x800454cb TUNSETQUEUE = 0x800454d9 TUNSETSNDBUF = 0x800454d4 TUNSETTXFILTER = 0x800454d1 TUNSETVNETBE = 0x800454de TUNSETVNETHDRSZ = 0x800454d8 TUNSETVNETLE = 0x800454dc UMOUNT_NOFOLLOW = 0x8 UTIME_NOW = 0x3fffffff UTIME_OMIT = 0x3ffffffe VDISCARD = 0x10 VEOF = 0x4 VEOL = 0x6 VEOL2 = 0x8 VERASE = 0x2 VINTR = 0x0 VKILL = 0x3 VLNEXT = 0xf VMADDR_CID_ANY = 0xffffffff VMADDR_CID_HOST = 0x2 VMADDR_CID_HYPERVISOR = 0x0 VMADDR_CID_RESERVED = 0x1 VMADDR_PORT_ANY = 0xffffffff VMIN = 0x5 VM_SOCKETS_INVALID_VERSION = 0xffffffff VQUIT = 0x1 VREPRINT = 0xb VSTART = 0xd VSTOP = 0xe VSUSP = 0xc VSWTC = 0x9 VT0 = 0x0 VT1 = 0x10000 VTDLY = 0x10000 VTIME = 0x7 VWERASE = 0xa WALL = 0x40000000 WCLONE = 0x80000000 WCONTINUED = 0x8 WDIOC_GETBOOTSTATUS = 0x40045702 WDIOC_GETPRETIMEOUT = 0x40045709 WDIOC_GETSTATUS = 0x40045701 WDIOC_GETSUPPORT = 0x40285700 WDIOC_GETTEMP = 0x40045703 WDIOC_GETTIMELEFT = 0x4004570a WDIOC_GETTIMEOUT = 0x40045707 WDIOC_KEEPALIVE = 0x40045705 WDIOC_SETOPTIONS = 0x40045704 WDIOC_SETPRETIMEOUT = 0xc0045708 WDIOC_SETTIMEOUT = 0xc0045706 WEXITED = 0x4 WNOHANG = 0x1 WNOTHREAD = 0x20000000 WNOWAIT = 0x1000000 WORDSIZE = 0x40 WSTOPPED = 0x2 WUNTRACED = 0x2 XATTR_CREATE = 0x1 XATTR_REPLACE = 0x2 XCASE = 0x4000 XTABS = 0xc00 ) // Errors const ( E2BIG = syscall.Errno(0x7) EACCES = syscall.Errno(0xd) EADDRINUSE = syscall.Errno(0x62) EADDRNOTAVAIL = syscall.Errno(0x63) EADV = syscall.Errno(0x44) EAFNOSUPPORT = syscall.Errno(0x61) EAGAIN = syscall.Errno(0xb) EALREADY = syscall.Errno(0x72) EBADE = syscall.Errno(0x34) EBADF = syscall.Errno(0x9) EBADFD = syscall.Errno(0x4d) EBADMSG = syscall.Errno(0x4a) EBADR = syscall.Errno(0x35) EBADRQC = syscall.Errno(0x38) EBADSLT = syscall.Errno(0x39) EBFONT = syscall.Errno(0x3b) EBUSY = syscall.Errno(0x10) ECANCELED = syscall.Errno(0x7d) ECHILD = syscall.Errno(0xa) ECHRNG = syscall.Errno(0x2c) ECOMM = syscall.Errno(0x46) ECONNABORTED = syscall.Errno(0x67) ECONNREFUSED = syscall.Errno(0x6f) ECONNRESET = syscall.Errno(0x68) EDEADLK = syscall.Errno(0x23) EDEADLOCK = syscall.Errno(0x3a) EDESTADDRREQ = syscall.Errno(0x59) EDOM = syscall.Errno(0x21) EDOTDOT = syscall.Errno(0x49) EDQUOT = syscall.Errno(0x7a) EEXIST = syscall.Errno(0x11) EFAULT = syscall.Errno(0xe) EFBIG = syscall.Errno(0x1b) EHOSTDOWN = syscall.Errno(0x70) EHOSTUNREACH = syscall.Errno(0x71) EHWPOISON = syscall.Errno(0x85) EIDRM = syscall.Errno(0x2b) EILSEQ = syscall.Errno(0x54) EINPROGRESS = syscall.Errno(0x73) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x6a) EISDIR = syscall.Errno(0x15) EISNAM = syscall.Errno(0x78) EKEYEXPIRED = syscall.Errno(0x7f) EKEYREJECTED = syscall.Errno(0x81) EKEYREVOKED = syscall.Errno(0x80) EL2HLT = syscall.Errno(0x33) EL2NSYNC = syscall.Errno(0x2d) EL3HLT = syscall.Errno(0x2e) EL3RST = syscall.Errno(0x2f) ELIBACC = syscall.Errno(0x4f) ELIBBAD = syscall.Errno(0x50) ELIBEXEC = syscall.Errno(0x53) ELIBMAX = syscall.Errno(0x52) ELIBSCN = syscall.Errno(0x51) ELNRNG = syscall.Errno(0x30) ELOOP = syscall.Errno(0x28) EMEDIUMTYPE = syscall.Errno(0x7c) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) EMSGSIZE = syscall.Errno(0x5a) EMULTIHOP = syscall.Errno(0x48) ENAMETOOLONG = syscall.Errno(0x24) ENAVAIL = syscall.Errno(0x77) ENETDOWN = syscall.Errno(0x64) ENETRESET = syscall.Errno(0x66) ENETUNREACH = syscall.Errno(0x65) ENFILE = syscall.Errno(0x17) ENOANO = syscall.Errno(0x37) ENOBUFS = syscall.Errno(0x69) ENOCSI = syscall.Errno(0x32) ENODATA = syscall.Errno(0x3d) ENODEV = syscall.Errno(0x13) ENOENT = syscall.Errno(0x2) ENOEXEC = syscall.Errno(0x8) ENOKEY = syscall.Errno(0x7e) ENOLCK = syscall.Errno(0x25) ENOLINK = syscall.Errno(0x43) ENOMEDIUM = syscall.Errno(0x7b) ENOMEM = syscall.Errno(0xc) ENOMSG = syscall.Errno(0x2a) ENONET = syscall.Errno(0x40) ENOPKG = syscall.Errno(0x41) ENOPROTOOPT = syscall.Errno(0x5c) ENOSPC = syscall.Errno(0x1c) ENOSR = syscall.Errno(0x3f) ENOSTR = syscall.Errno(0x3c) ENOSYS = syscall.Errno(0x26) ENOTBLK = syscall.Errno(0xf) ENOTCONN = syscall.Errno(0x6b) ENOTDIR = syscall.Errno(0x14) ENOTEMPTY = syscall.Errno(0x27) ENOTNAM = syscall.Errno(0x76) ENOTRECOVERABLE = syscall.Errno(0x83) ENOTSOCK = syscall.Errno(0x58) ENOTSUP = syscall.Errno(0x5f) ENOTTY = syscall.Errno(0x19) ENOTUNIQ = syscall.Errno(0x4c) ENXIO = syscall.Errno(0x6) EOPNOTSUPP = syscall.Errno(0x5f) EOVERFLOW = syscall.Errno(0x4b) EOWNERDEAD = syscall.Errno(0x82) EPERM = syscall.Errno(0x1) EPFNOSUPPORT = syscall.Errno(0x60) EPIPE = syscall.Errno(0x20) EPROTO = syscall.Errno(0x47) EPROTONOSUPPORT = syscall.Errno(0x5d) EPROTOTYPE = syscall.Errno(0x5b) ERANGE = syscall.Errno(0x22) EREMCHG = syscall.Errno(0x4e) EREMOTE = syscall.Errno(0x42) EREMOTEIO = syscall.Errno(0x79) ERESTART = syscall.Errno(0x55) ERFKILL = syscall.Errno(0x84) EROFS = syscall.Errno(0x1e) ESHUTDOWN = syscall.Errno(0x6c) ESOCKTNOSUPPORT = syscall.Errno(0x5e) ESPIPE = syscall.Errno(0x1d) ESRCH = syscall.Errno(0x3) ESRMNT = syscall.Errno(0x45) ESTALE = syscall.Errno(0x74) ESTRPIPE = syscall.Errno(0x56) ETIME = syscall.Errno(0x3e) ETIMEDOUT = syscall.Errno(0x6e) ETOOMANYREFS = syscall.Errno(0x6d) ETXTBSY = syscall.Errno(0x1a) EUCLEAN = syscall.Errno(0x75) EUNATCH = syscall.Errno(0x31) EUSERS = syscall.Errno(0x57) EWOULDBLOCK = syscall.Errno(0xb) EXDEV = syscall.Errno(0x12) EXFULL = syscall.Errno(0x36) ) // Signals const ( SIGABRT = syscall.Signal(0x6) SIGALRM = syscall.Signal(0xe) SIGBUS = syscall.Signal(0x7) SIGCHLD = syscall.Signal(0x11) SIGCLD = syscall.Signal(0x11) SIGCONT = syscall.Signal(0x12) SIGFPE = syscall.Signal(0x8) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x1d) SIGIOT = syscall.Signal(0x6) SIGKILL = syscall.Signal(0x9) SIGPIPE = syscall.Signal(0xd) SIGPOLL = syscall.Signal(0x1d) SIGPROF = syscall.Signal(0x1b) SIGPWR = syscall.Signal(0x1e) SIGQUIT = syscall.Signal(0x3) SIGSEGV = syscall.Signal(0xb) SIGSTKFLT = syscall.Signal(0x10) SIGSTOP = syscall.Signal(0x13) SIGSYS = syscall.Signal(0x1f) SIGTERM = syscall.Signal(0xf) SIGTRAP = syscall.Signal(0x5) SIGTSTP = syscall.Signal(0x14) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) SIGURG = syscall.Signal(0x17) SIGUSR1 = syscall.Signal(0xa) SIGUSR2 = syscall.Signal(0xc) SIGVTALRM = syscall.Signal(0x1a) SIGWINCH = syscall.Signal(0x1c) SIGXCPU = syscall.Signal(0x18) SIGXFSZ = syscall.Signal(0x19) ) // Error table var errors = [...]string{ 1: "operation not permitted", 2: "no such file or directory", 3: "no such process", 4: "interrupted system call", 5: "input/output error", 6: "no such device or address", 7: "argument list too long", 8: "exec format error", 9: "bad file descriptor", 10: "no child processes", 11: "resource temporarily unavailable", 12: "cannot allocate memory", 13: "permission denied", 14: "bad address", 15: "block device required", 16: "device or resource busy", 17: "file exists", 18: "invalid cross-device link", 19: "no such device", 20: "not a directory", 21: "is a directory", 22: "invalid argument", 23: "too many open files in system", 24: "too many open files", 25: "inappropriate ioctl for device", 26: "text file busy", 27: "file too large", 28: "no space left on device", 29: "illegal seek", 30: "read-only file system", 31: "too many links", 32: "broken pipe", 33: "numerical argument out of domain", 34: "numerical result out of range", 35: "resource deadlock avoided", 36: "file name too long", 37: "no locks available", 38: "function not implemented", 39: "directory not empty", 40: "too many levels of symbolic links", 42: "no message of desired type", 43: "identifier removed", 44: "channel number out of range", 45: "level 2 not synchronized", 46: "level 3 halted", 47: "level 3 reset", 48: "link number out of range", 49: "protocol driver not attached", 50: "no CSI structure available", 51: "level 2 halted", 52: "invalid exchange", 53: "invalid request descriptor", 54: "exchange full", 55: "no anode", 56: "invalid request code", 57: "invalid slot", 58: "file locking deadlock error", 59: "bad font file format", 60: "device not a stream", 61: "no data available", 62: "timer expired", 63: "out of streams resources", 64: "machine is not on the network", 65: "package not installed", 66: "object is remote", 67: "link has been severed", 68: "advertise error", 69: "srmount error", 70: "communication error on send", 71: "protocol error", 72: "multihop attempted", 73: "RFS specific error", 74: "bad message", 75: "value too large for defined data type", 76: "name not unique on network", 77: "file descriptor in bad state", 78: "remote address changed", 79: "can not access a needed shared library", 80: "accessing a corrupted shared library", 81: ".lib section in a.out corrupted", 82: "attempting to link in too many shared libraries", 83: "cannot exec a shared library directly", 84: "invalid or incomplete multibyte or wide character", 85: "interrupted system call should be restarted", 86: "streams pipe error", 87: "too many users", 88: "socket operation on non-socket", 89: "destination address required", 90: "message too long", 91: "protocol wrong type for socket", 92: "protocol not available", 93: "protocol not supported", 94: "socket type not supported", 95: "operation not supported", 96: "protocol family not supported", 97: "address family not supported by protocol", 98: "address already in use", 99: "cannot assign requested address", 100: "network is down", 101: "network is unreachable", 102: "network dropped connection on reset", 103: "software caused connection abort", 104: "connection reset by peer", 105: "no buffer space available", 106: "transport endpoint is already connected", 107: "transport endpoint is not connected", 108: "cannot send after transport endpoint shutdown", 109: "too many references: cannot splice", 110: "connection timed out", 111: "connection refused", 112: "host is down", 113: "no route to host", 114: "operation already in progress", 115: "operation now in progress", 116: "stale file handle", 117: "structure needs cleaning", 118: "not a XENIX named type file", 119: "no XENIX semaphores available", 120: "is a named type file", 121: "remote I/O error", 122: "disk quota exceeded", 123: "no medium found", 124: "wrong medium type", 125: "operation canceled", 126: "required key not available", 127: "key has expired", 128: "key has been revoked", 129: "key was rejected by service", 130: "owner died", 131: "state not recoverable", 132: "operation not possible due to RF-kill", 133: "memory page has hardware error", } // Signal table var signals = [...]string{ 1: "hangup", 2: "interrupt", 3: "quit", 4: "illegal instruction", 5: "trace/breakpoint trap", 6: "aborted", 7: "bus error", 8: "floating point exception", 9: "killed", 10: "user defined signal 1", 11: "segmentation fault", 12: "user defined signal 2", 13: "broken pipe", 14: "alarm clock", 15: "terminated", 16: "stack fault", 17: "child exited", 18: "continued", 19: "stopped (signal)", 20: "stopped", 21: "stopped (tty input)", 22: "stopped (tty output)", 23: "urgent I/O condition", 24: "CPU time limit exceeded", 25: "file size limit exceeded", 26: "virtual timer expired", 27: "profiling timer expired", 28: "window changed", 29: "I/O possible", 30: "power failure", 31: "bad system call", } ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go ================================================ // mkerrors.sh -Wall -Werror -static -I/tmp/include // Code generated by the command above; see README.md. DO NOT EDIT. // +build ppc64le,linux // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go package unix import "syscall" const ( AF_ALG = 0x26 AF_APPLETALK = 0x5 AF_ASH = 0x12 AF_ATMPVC = 0x8 AF_ATMSVC = 0x14 AF_AX25 = 0x3 AF_BLUETOOTH = 0x1f AF_BRIDGE = 0x7 AF_CAIF = 0x25 AF_CAN = 0x1d AF_DECnet = 0xc AF_ECONET = 0x13 AF_FILE = 0x1 AF_IB = 0x1b AF_IEEE802154 = 0x24 AF_INET = 0x2 AF_INET6 = 0xa AF_IPX = 0x4 AF_IRDA = 0x17 AF_ISDN = 0x22 AF_IUCV = 0x20 AF_KCM = 0x29 AF_KEY = 0xf AF_LLC = 0x1a AF_LOCAL = 0x1 AF_MAX = 0x2c AF_MPLS = 0x1c AF_NETBEUI = 0xd AF_NETLINK = 0x10 AF_NETROM = 0x6 AF_NFC = 0x27 AF_PACKET = 0x11 AF_PHONET = 0x23 AF_PPPOX = 0x18 AF_QIPCRTR = 0x2a AF_RDS = 0x15 AF_ROSE = 0xb AF_ROUTE = 0x10 AF_RXRPC = 0x21 AF_SECURITY = 0xe AF_SMC = 0x2b AF_SNA = 0x16 AF_TIPC = 0x1e AF_UNIX = 0x1 AF_UNSPEC = 0x0 AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 ALG_OP_DECRYPT = 0x0 ALG_OP_ENCRYPT = 0x1 ALG_SET_AEAD_ASSOCLEN = 0x4 ALG_SET_AEAD_AUTHSIZE = 0x5 ALG_SET_IV = 0x2 ALG_SET_KEY = 0x1 ALG_SET_OP = 0x3 ARPHRD_6LOWPAN = 0x339 ARPHRD_ADAPT = 0x108 ARPHRD_APPLETLK = 0x8 ARPHRD_ARCNET = 0x7 ARPHRD_ASH = 0x30d ARPHRD_ATM = 0x13 ARPHRD_AX25 = 0x3 ARPHRD_BIF = 0x307 ARPHRD_CAIF = 0x336 ARPHRD_CAN = 0x118 ARPHRD_CHAOS = 0x5 ARPHRD_CISCO = 0x201 ARPHRD_CSLIP = 0x101 ARPHRD_CSLIP6 = 0x103 ARPHRD_DDCMP = 0x205 ARPHRD_DLCI = 0xf ARPHRD_ECONET = 0x30e ARPHRD_EETHER = 0x2 ARPHRD_ETHER = 0x1 ARPHRD_EUI64 = 0x1b ARPHRD_FCAL = 0x311 ARPHRD_FCFABRIC = 0x313 ARPHRD_FCPL = 0x312 ARPHRD_FCPP = 0x310 ARPHRD_FDDI = 0x306 ARPHRD_FRAD = 0x302 ARPHRD_HDLC = 0x201 ARPHRD_HIPPI = 0x30c ARPHRD_HWX25 = 0x110 ARPHRD_IEEE1394 = 0x18 ARPHRD_IEEE802 = 0x6 ARPHRD_IEEE80211 = 0x321 ARPHRD_IEEE80211_PRISM = 0x322 ARPHRD_IEEE80211_RADIOTAP = 0x323 ARPHRD_IEEE802154 = 0x324 ARPHRD_IEEE802154_MONITOR = 0x325 ARPHRD_IEEE802_TR = 0x320 ARPHRD_INFINIBAND = 0x20 ARPHRD_IP6GRE = 0x337 ARPHRD_IPDDP = 0x309 ARPHRD_IPGRE = 0x30a ARPHRD_IRDA = 0x30f ARPHRD_LAPB = 0x204 ARPHRD_LOCALTLK = 0x305 ARPHRD_LOOPBACK = 0x304 ARPHRD_METRICOM = 0x17 ARPHRD_NETLINK = 0x338 ARPHRD_NETROM = 0x0 ARPHRD_NONE = 0xfffe ARPHRD_PHONET = 0x334 ARPHRD_PHONET_PIPE = 0x335 ARPHRD_PIMREG = 0x30b ARPHRD_PPP = 0x200 ARPHRD_PRONET = 0x4 ARPHRD_RAWHDLC = 0x206 ARPHRD_ROSE = 0x10e ARPHRD_RSRVD = 0x104 ARPHRD_SIT = 0x308 ARPHRD_SKIP = 0x303 ARPHRD_SLIP = 0x100 ARPHRD_SLIP6 = 0x102 ARPHRD_TUNNEL = 0x300 ARPHRD_TUNNEL6 = 0x301 ARPHRD_VOID = 0xffff ARPHRD_VSOCKMON = 0x33a ARPHRD_X25 = 0x10f B0 = 0x0 B1000000 = 0x17 B110 = 0x3 B115200 = 0x11 B1152000 = 0x18 B1200 = 0x9 B134 = 0x4 B150 = 0x5 B1500000 = 0x19 B1800 = 0xa B19200 = 0xe B200 = 0x6 B2000000 = 0x1a B230400 = 0x12 B2400 = 0xb B2500000 = 0x1b B300 = 0x7 B3000000 = 0x1c B3500000 = 0x1d B38400 = 0xf B4000000 = 0x1e B460800 = 0x13 B4800 = 0xc B50 = 0x1 B500000 = 0x14 B57600 = 0x10 B576000 = 0x15 B600 = 0x8 B75 = 0x2 B921600 = 0x16 B9600 = 0xd BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40081272 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d BLKRRPART = 0x2000125f BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 BOTHER = 0x1f BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALU = 0x4 BPF_AND = 0x50 BPF_B = 0x10 BPF_DIV = 0x30 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 BPF_JA = 0x0 BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 BPF_JMP = 0x5 BPF_JSET = 0x40 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 BPF_LEN = 0x80 BPF_LL_OFF = -0x200000 BPF_LSH = 0x60 BPF_MAJOR_VERSION = 0x1 BPF_MAXINSNS = 0x1000 BPF_MEM = 0x60 BPF_MEMWORDS = 0x10 BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MOD = 0x90 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_NET_OFF = -0x100000 BPF_OR = 0x40 BPF_RET = 0x6 BPF_RSH = 0x70 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 BPF_TAX = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 BPF_XOR = 0xa0 BRKINT = 0x2 BS0 = 0x0 BS1 = 0x8000 BSDLY = 0x8000 CAN_BCM = 0x2 CAN_EFF_FLAG = 0x80000000 CAN_EFF_ID_BITS = 0x1d CAN_EFF_MASK = 0x1fffffff CAN_ERR_FLAG = 0x20000000 CAN_ERR_MASK = 0x1fffffff CAN_INV_FILTER = 0x20000000 CAN_ISOTP = 0x6 CAN_MAX_DLC = 0x8 CAN_MAX_DLEN = 0x8 CAN_MCNET = 0x5 CAN_MTU = 0x10 CAN_NPROTO = 0x7 CAN_RAW = 0x1 CAN_RAW_FILTER_MAX = 0x200 CAN_RTR_FLAG = 0x40000000 CAN_SFF_ID_BITS = 0xb CAN_SFF_MASK = 0x7ff CAN_TP16 = 0x3 CAN_TP20 = 0x4 CBAUD = 0xff CBAUDEX = 0x0 CFLUSH = 0xf CIBAUD = 0xff0000 CLOCAL = 0x8000 CLOCK_BOOTTIME = 0x7 CLOCK_BOOTTIME_ALARM = 0x9 CLOCK_DEFAULT = 0x0 CLOCK_EXT = 0x1 CLOCK_INT = 0x2 CLOCK_MONOTONIC = 0x1 CLOCK_MONOTONIC_COARSE = 0x6 CLOCK_MONOTONIC_RAW = 0x4 CLOCK_PROCESS_CPUTIME_ID = 0x2 CLOCK_REALTIME = 0x0 CLOCK_REALTIME_ALARM = 0x8 CLOCK_REALTIME_COARSE = 0x5 CLOCK_TAI = 0xb CLOCK_THREAD_CPUTIME_ID = 0x3 CLOCK_TXFROMRX = 0x4 CLOCK_TXINT = 0x3 CLONE_CHILD_CLEARTID = 0x200000 CLONE_CHILD_SETTID = 0x1000000 CLONE_DETACHED = 0x400000 CLONE_FILES = 0x400 CLONE_FS = 0x200 CLONE_IO = 0x80000000 CLONE_NEWCGROUP = 0x2000000 CLONE_NEWIPC = 0x8000000 CLONE_NEWNET = 0x40000000 CLONE_NEWNS = 0x20000 CLONE_NEWPID = 0x20000000 CLONE_NEWUSER = 0x10000000 CLONE_NEWUTS = 0x4000000 CLONE_PARENT = 0x8000 CLONE_PARENT_SETTID = 0x100000 CLONE_PTRACE = 0x2000 CLONE_SETTLS = 0x80000 CLONE_SIGHAND = 0x800 CLONE_SYSVSEM = 0x40000 CLONE_THREAD = 0x10000 CLONE_UNTRACED = 0x800000 CLONE_VFORK = 0x4000 CLONE_VM = 0x100 CMSPAR = 0x40000000 CR0 = 0x0 CR1 = 0x1000 CR2 = 0x2000 CR3 = 0x3000 CRDLY = 0x3000 CREAD = 0x800 CRTSCTS = 0x80000000 CS5 = 0x0 CS6 = 0x100 CS7 = 0x200 CS8 = 0x300 CSIGNAL = 0xff CSIZE = 0x300 CSTART = 0x11 CSTATUS = 0x0 CSTOP = 0x13 CSTOPB = 0x400 CSUSP = 0x1a DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 DT_FIFO = 0x1 DT_LNK = 0xa DT_REG = 0x8 DT_SOCK = 0xc DT_UNKNOWN = 0x0 DT_WHT = 0xe ECHO = 0x8 ECHOCTL = 0x40 ECHOE = 0x2 ECHOK = 0x4 ECHOKE = 0x1 ECHONL = 0x10 ECHOPRT = 0x20 EFD_CLOEXEC = 0x80000 EFD_NONBLOCK = 0x800 EFD_SEMAPHORE = 0x1 ENCODING_DEFAULT = 0x0 ENCODING_FM_MARK = 0x3 ENCODING_FM_SPACE = 0x4 ENCODING_MANCHESTER = 0x5 ENCODING_NRZ = 0x1 ENCODING_NRZI = 0x2 EPOLLERR = 0x8 EPOLLET = 0x80000000 EPOLLEXCLUSIVE = 0x10000000 EPOLLHUP = 0x10 EPOLLIN = 0x1 EPOLLMSG = 0x400 EPOLLONESHOT = 0x40000000 EPOLLOUT = 0x4 EPOLLPRI = 0x2 EPOLLRDBAND = 0x80 EPOLLRDHUP = 0x2000 EPOLLRDNORM = 0x40 EPOLLWAKEUP = 0x20000000 EPOLLWRBAND = 0x200 EPOLLWRNORM = 0x100 EPOLL_CLOEXEC = 0x80000 EPOLL_CTL_ADD = 0x1 EPOLL_CTL_DEL = 0x2 EPOLL_CTL_MOD = 0x3 ETH_P_1588 = 0x88f7 ETH_P_8021AD = 0x88a8 ETH_P_8021AH = 0x88e7 ETH_P_8021Q = 0x8100 ETH_P_80221 = 0x8917 ETH_P_802_2 = 0x4 ETH_P_802_3 = 0x1 ETH_P_802_3_MIN = 0x600 ETH_P_802_EX1 = 0x88b5 ETH_P_AARP = 0x80f3 ETH_P_AF_IUCV = 0xfbfb ETH_P_ALL = 0x3 ETH_P_AOE = 0x88a2 ETH_P_ARCNET = 0x1a ETH_P_ARP = 0x806 ETH_P_ATALK = 0x809b ETH_P_ATMFATE = 0x8884 ETH_P_ATMMPOA = 0x884c ETH_P_AX25 = 0x2 ETH_P_BATMAN = 0x4305 ETH_P_BPQ = 0x8ff ETH_P_CAIF = 0xf7 ETH_P_CAN = 0xc ETH_P_CANFD = 0xd ETH_P_CONTROL = 0x16 ETH_P_CUST = 0x6006 ETH_P_DDCMP = 0x6 ETH_P_DEC = 0x6000 ETH_P_DIAG = 0x6005 ETH_P_DNA_DL = 0x6001 ETH_P_DNA_RC = 0x6002 ETH_P_DNA_RT = 0x6003 ETH_P_DSA = 0x1b ETH_P_ECONET = 0x18 ETH_P_EDSA = 0xdada ETH_P_FCOE = 0x8906 ETH_P_FIP = 0x8914 ETH_P_HDLC = 0x19 ETH_P_HSR = 0x892f ETH_P_IBOE = 0x8915 ETH_P_IEEE802154 = 0xf6 ETH_P_IEEEPUP = 0xa00 ETH_P_IEEEPUPAT = 0xa01 ETH_P_IP = 0x800 ETH_P_IPV6 = 0x86dd ETH_P_IPX = 0x8137 ETH_P_IRDA = 0x17 ETH_P_LAT = 0x6004 ETH_P_LINK_CTL = 0x886c ETH_P_LOCALTALK = 0x9 ETH_P_LOOP = 0x60 ETH_P_LOOPBACK = 0x9000 ETH_P_MACSEC = 0x88e5 ETH_P_MOBITEX = 0x15 ETH_P_MPLS_MC = 0x8848 ETH_P_MPLS_UC = 0x8847 ETH_P_MVRP = 0x88f5 ETH_P_NCSI = 0x88f8 ETH_P_PAE = 0x888e ETH_P_PAUSE = 0x8808 ETH_P_PHONET = 0xf5 ETH_P_PPPTALK = 0x10 ETH_P_PPP_DISC = 0x8863 ETH_P_PPP_MP = 0x8 ETH_P_PPP_SES = 0x8864 ETH_P_PRP = 0x88fb ETH_P_PUP = 0x200 ETH_P_PUPAT = 0x201 ETH_P_QINQ1 = 0x9100 ETH_P_QINQ2 = 0x9200 ETH_P_QINQ3 = 0x9300 ETH_P_RARP = 0x8035 ETH_P_SCA = 0x6007 ETH_P_SLOW = 0x8809 ETH_P_SNAP = 0x5 ETH_P_TDLS = 0x890d ETH_P_TEB = 0x6558 ETH_P_TIPC = 0x88ca ETH_P_TRAILER = 0x1c ETH_P_TR_802_2 = 0x11 ETH_P_TSN = 0x22f0 ETH_P_WAN_PPP = 0x7 ETH_P_WCCP = 0x883e ETH_P_X25 = 0x805 ETH_P_XDSA = 0xf8 EXTA = 0xe EXTB = 0xf EXTPROC = 0x10000000 FALLOC_FL_COLLAPSE_RANGE = 0x8 FALLOC_FL_INSERT_RANGE = 0x20 FALLOC_FL_KEEP_SIZE = 0x1 FALLOC_FL_NO_HIDE_STALE = 0x4 FALLOC_FL_PUNCH_HOLE = 0x2 FALLOC_FL_UNSHARE_RANGE = 0x40 FALLOC_FL_ZERO_RANGE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 FF1 = 0x4000 FFDLY = 0x4000 FLUSHO = 0x800000 FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 FS_ENCRYPTION_MODE_INVALID = 0x0 FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 FS_KEY_DESCRIPTOR_SIZE = 0x8 FS_KEY_DESC_PREFIX = "fscrypt:" FS_KEY_DESC_PREFIX_SIZE = 0x8 FS_MAX_KEY_SIZE = 0x40 FS_POLICY_FLAGS_PAD_16 = 0x2 FS_POLICY_FLAGS_PAD_32 = 0x3 FS_POLICY_FLAGS_PAD_4 = 0x0 FS_POLICY_FLAGS_PAD_8 = 0x1 FS_POLICY_FLAGS_PAD_MASK = 0x3 FS_POLICY_FLAGS_VALID = 0x3 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0x406 F_EXLCK = 0x4 F_GETFD = 0x1 F_GETFL = 0x3 F_GETLEASE = 0x401 F_GETLK = 0x5 F_GETLK64 = 0xc F_GETOWN = 0x9 F_GETOWN_EX = 0x10 F_GETPIPE_SZ = 0x408 F_GETSIG = 0xb F_LOCK = 0x1 F_NOTIFY = 0x402 F_OFD_GETLK = 0x24 F_OFD_SETLK = 0x25 F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 F_SETFD = 0x2 F_SETFL = 0x4 F_SETLEASE = 0x400 F_SETLK = 0x6 F_SETLK64 = 0xd F_SETLKW = 0x7 F_SETLKW64 = 0xe F_SETOWN = 0x8 F_SETOWN_EX = 0xf F_SETPIPE_SZ = 0x407 F_SETSIG = 0xa F_SHLCK = 0x8 F_TEST = 0x3 F_TLOCK = 0x2 F_ULOCK = 0x0 F_UNLCK = 0x2 F_WRLCK = 0x1 GENL_ADMIN_PERM = 0x1 GENL_CMD_CAP_DO = 0x2 GENL_CMD_CAP_DUMP = 0x4 GENL_CMD_CAP_HASPOL = 0x8 GENL_HDRLEN = 0x4 GENL_ID_CTRL = 0x10 GENL_ID_PMCRAID = 0x12 GENL_ID_VFS_DQUOT = 0x11 GENL_MAX_ID = 0x3ff GENL_MIN_ID = 0x10 GENL_NAMSIZ = 0x10 GENL_START_ALLOC = 0x13 GENL_UNS_ADMIN_PERM = 0x10 GRND_NONBLOCK = 0x1 GRND_RANDOM = 0x2 HUPCL = 0x4000 IBSHIFT = 0x10 ICANON = 0x100 ICMPV6_FILTER = 0x1 ICRNL = 0x100 IEXTEN = 0x400 IFA_F_DADFAILED = 0x8 IFA_F_DEPRECATED = 0x20 IFA_F_HOMEADDRESS = 0x10 IFA_F_MANAGETEMPADDR = 0x100 IFA_F_MCAUTOJOIN = 0x400 IFA_F_NODAD = 0x2 IFA_F_NOPREFIXROUTE = 0x200 IFA_F_OPTIMISTIC = 0x4 IFA_F_PERMANENT = 0x80 IFA_F_SECONDARY = 0x1 IFA_F_STABLE_PRIVACY = 0x800 IFA_F_TEMPORARY = 0x1 IFA_F_TENTATIVE = 0x40 IFA_MAX = 0x8 IFF_ALLMULTI = 0x200 IFF_ATTACH_QUEUE = 0x200 IFF_AUTOMEDIA = 0x4000 IFF_BROADCAST = 0x2 IFF_DEBUG = 0x4 IFF_DETACH_QUEUE = 0x400 IFF_DORMANT = 0x20000 IFF_DYNAMIC = 0x8000 IFF_ECHO = 0x40000 IFF_LOOPBACK = 0x8 IFF_LOWER_UP = 0x10000 IFF_MASTER = 0x400 IFF_MULTICAST = 0x1000 IFF_MULTI_QUEUE = 0x100 IFF_NOARP = 0x80 IFF_NOFILTER = 0x1000 IFF_NOTRAILERS = 0x20 IFF_NO_PI = 0x1000 IFF_ONE_QUEUE = 0x2000 IFF_PERSIST = 0x800 IFF_POINTOPOINT = 0x10 IFF_PORTSEL = 0x2000 IFF_PROMISC = 0x100 IFF_RUNNING = 0x40 IFF_SLAVE = 0x800 IFF_TAP = 0x2 IFF_TUN = 0x1 IFF_TUN_EXCL = 0x8000 IFF_UP = 0x1 IFF_VNET_HDR = 0x4000 IFF_VOLATILE = 0x70c5a IFNAMSIZ = 0x10 IGNBRK = 0x1 IGNCR = 0x80 IGNPAR = 0x4 IMAXBEL = 0x2000 INLCR = 0x40 INPCK = 0x10 IN_ACCESS = 0x1 IN_ALL_EVENTS = 0xfff IN_ATTRIB = 0x4 IN_CLASSA_HOST = 0xffffff IN_CLASSA_MAX = 0x80 IN_CLASSA_NET = 0xff000000 IN_CLASSA_NSHIFT = 0x18 IN_CLASSB_HOST = 0xffff IN_CLASSB_MAX = 0x10000 IN_CLASSB_NET = 0xffff0000 IN_CLASSB_NSHIFT = 0x10 IN_CLASSC_HOST = 0xff IN_CLASSC_NET = 0xffffff00 IN_CLASSC_NSHIFT = 0x8 IN_CLOEXEC = 0x80000 IN_CLOSE = 0x18 IN_CLOSE_NOWRITE = 0x10 IN_CLOSE_WRITE = 0x8 IN_CREATE = 0x100 IN_DELETE = 0x200 IN_DELETE_SELF = 0x400 IN_DONT_FOLLOW = 0x2000000 IN_EXCL_UNLINK = 0x4000000 IN_IGNORED = 0x8000 IN_ISDIR = 0x40000000 IN_LOOPBACKNET = 0x7f IN_MASK_ADD = 0x20000000 IN_MODIFY = 0x2 IN_MOVE = 0xc0 IN_MOVED_FROM = 0x40 IN_MOVED_TO = 0x80 IN_MOVE_SELF = 0x800 IN_NONBLOCK = 0x800 IN_ONESHOT = 0x80000000 IN_ONLYDIR = 0x1000000 IN_OPEN = 0x20 IN_Q_OVERFLOW = 0x4000 IN_UNMOUNT = 0x2000 IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 IPPROTO_AH = 0x33 IPPROTO_BEETPH = 0x5e IPPROTO_COMP = 0x6c IPPROTO_DCCP = 0x21 IPPROTO_DSTOPTS = 0x3c IPPROTO_EGP = 0x8 IPPROTO_ENCAP = 0x62 IPPROTO_ESP = 0x32 IPPROTO_FRAGMENT = 0x2c IPPROTO_GRE = 0x2f IPPROTO_HOPOPTS = 0x0 IPPROTO_ICMP = 0x1 IPPROTO_ICMPV6 = 0x3a IPPROTO_IDP = 0x16 IPPROTO_IGMP = 0x2 IPPROTO_IP = 0x0 IPPROTO_IPIP = 0x4 IPPROTO_IPV6 = 0x29 IPPROTO_MH = 0x87 IPPROTO_MPLS = 0x89 IPPROTO_MTP = 0x5c IPPROTO_NONE = 0x3b IPPROTO_PIM = 0x67 IPPROTO_PUP = 0xc IPPROTO_RAW = 0xff IPPROTO_ROUTING = 0x2b IPPROTO_RSVP = 0x2e IPPROTO_SCTP = 0x84 IPPROTO_TCP = 0x6 IPPROTO_TP = 0x1d IPPROTO_UDP = 0x11 IPPROTO_UDPLITE = 0x88 IPV6_2292DSTOPTS = 0x4 IPV6_2292HOPLIMIT = 0x8 IPV6_2292HOPOPTS = 0x3 IPV6_2292PKTINFO = 0x2 IPV6_2292PKTOPTIONS = 0x6 IPV6_2292RTHDR = 0x5 IPV6_ADDRFORM = 0x1 IPV6_ADDR_PREFERENCES = 0x48 IPV6_ADD_MEMBERSHIP = 0x14 IPV6_AUTHHDR = 0xa IPV6_AUTOFLOWLABEL = 0x46 IPV6_CHECKSUM = 0x7 IPV6_DONTFRAG = 0x3e IPV6_DROP_MEMBERSHIP = 0x15 IPV6_DSTOPTS = 0x3b IPV6_HDRINCL = 0x24 IPV6_HOPLIMIT = 0x34 IPV6_HOPOPTS = 0x36 IPV6_IPSEC_POLICY = 0x22 IPV6_JOIN_ANYCAST = 0x1b IPV6_JOIN_GROUP = 0x14 IPV6_LEAVE_ANYCAST = 0x1c IPV6_LEAVE_GROUP = 0x15 IPV6_MINHOPCOUNT = 0x49 IPV6_MTU = 0x18 IPV6_MTU_DISCOVER = 0x17 IPV6_MULTICAST_HOPS = 0x12 IPV6_MULTICAST_IF = 0x11 IPV6_MULTICAST_LOOP = 0x13 IPV6_NEXTHOP = 0x9 IPV6_ORIGDSTADDR = 0x4a IPV6_PATHMTU = 0x3d IPV6_PKTINFO = 0x32 IPV6_PMTUDISC_DO = 0x2 IPV6_PMTUDISC_DONT = 0x0 IPV6_PMTUDISC_INTERFACE = 0x4 IPV6_PMTUDISC_OMIT = 0x5 IPV6_PMTUDISC_PROBE = 0x3 IPV6_PMTUDISC_WANT = 0x1 IPV6_RECVDSTOPTS = 0x3a IPV6_RECVERR = 0x19 IPV6_RECVFRAGSIZE = 0x4d IPV6_RECVHOPLIMIT = 0x33 IPV6_RECVHOPOPTS = 0x35 IPV6_RECVORIGDSTADDR = 0x4a IPV6_RECVPATHMTU = 0x3c IPV6_RECVPKTINFO = 0x31 IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 IPV6_RTHDR_STRICT = 0x1 IPV6_RTHDR_TYPE_0 = 0x0 IPV6_RXDSTOPTS = 0x3b IPV6_RXHOPOPTS = 0x36 IPV6_TCLASS = 0x43 IPV6_TRANSPARENT = 0x4b IPV6_UNICAST_HOPS = 0x10 IPV6_UNICAST_IF = 0x4c IPV6_V6ONLY = 0x1a IPV6_XFRM_POLICY = 0x23 IP_ADD_MEMBERSHIP = 0x23 IP_ADD_SOURCE_MEMBERSHIP = 0x27 IP_BIND_ADDRESS_NO_PORT = 0x18 IP_BLOCK_SOURCE = 0x26 IP_CHECKSUM = 0x17 IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 IP_DROP_MEMBERSHIP = 0x24 IP_DROP_SOURCE_MEMBERSHIP = 0x28 IP_FREEBIND = 0xf IP_HDRINCL = 0x3 IP_IPSEC_POLICY = 0x10 IP_MAXPACKET = 0xffff IP_MAX_MEMBERSHIPS = 0x14 IP_MF = 0x2000 IP_MINTTL = 0x15 IP_MSFILTER = 0x29 IP_MSS = 0x240 IP_MTU = 0xe IP_MTU_DISCOVER = 0xa IP_MULTICAST_ALL = 0x31 IP_MULTICAST_IF = 0x20 IP_MULTICAST_LOOP = 0x22 IP_MULTICAST_TTL = 0x21 IP_NODEFRAG = 0x16 IP_OFFMASK = 0x1fff IP_OPTIONS = 0x4 IP_ORIGDSTADDR = 0x14 IP_PASSSEC = 0x12 IP_PKTINFO = 0x8 IP_PKTOPTIONS = 0x9 IP_PMTUDISC = 0xa IP_PMTUDISC_DO = 0x2 IP_PMTUDISC_DONT = 0x0 IP_PMTUDISC_INTERFACE = 0x4 IP_PMTUDISC_OMIT = 0x5 IP_PMTUDISC_PROBE = 0x3 IP_PMTUDISC_WANT = 0x1 IP_RECVERR = 0xb IP_RECVFRAGSIZE = 0x19 IP_RECVOPTS = 0x6 IP_RECVORIGDSTADDR = 0x14 IP_RECVRETOPTS = 0x7 IP_RECVTOS = 0xd IP_RECVTTL = 0xc IP_RETOPTS = 0x7 IP_RF = 0x8000 IP_ROUTER_ALERT = 0x5 IP_TOS = 0x1 IP_TRANSPARENT = 0x13 IP_TTL = 0x2 IP_UNBLOCK_SOURCE = 0x25 IP_UNICAST_IF = 0x32 IP_XFRM_POLICY = 0x11 ISIG = 0x80 ISTRIP = 0x20 IUCLC = 0x1000 IUTF8 = 0x4000 IXANY = 0x800 IXOFF = 0x400 IXON = 0x200 KEYCTL_ASSUME_AUTHORITY = 0x10 KEYCTL_CHOWN = 0x4 KEYCTL_CLEAR = 0x7 KEYCTL_DESCRIBE = 0x6 KEYCTL_DH_COMPUTE = 0x17 KEYCTL_GET_KEYRING_ID = 0x0 KEYCTL_GET_PERSISTENT = 0x16 KEYCTL_GET_SECURITY = 0x11 KEYCTL_INSTANTIATE = 0xc KEYCTL_INSTANTIATE_IOV = 0x14 KEYCTL_INVALIDATE = 0x15 KEYCTL_JOIN_SESSION_KEYRING = 0x1 KEYCTL_LINK = 0x8 KEYCTL_NEGATE = 0xd KEYCTL_READ = 0xb KEYCTL_REJECT = 0x13 KEYCTL_RESTRICT_KEYRING = 0x1d KEYCTL_REVOKE = 0x3 KEYCTL_SEARCH = 0xa KEYCTL_SESSION_TO_PARENT = 0x12 KEYCTL_SETPERM = 0x5 KEYCTL_SET_REQKEY_KEYRING = 0xe KEYCTL_SET_TIMEOUT = 0xf KEYCTL_UNLINK = 0x9 KEYCTL_UPDATE = 0x2 KEY_REQKEY_DEFL_DEFAULT = 0x0 KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 KEY_REQKEY_DEFL_NO_CHANGE = -0x1 KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 KEY_REQKEY_DEFL_USER_KEYRING = 0x4 KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 KEY_SPEC_GROUP_KEYRING = -0x6 KEY_SPEC_PROCESS_KEYRING = -0x2 KEY_SPEC_REQKEY_AUTH_KEY = -0x7 KEY_SPEC_REQUESTOR_KEYRING = -0x8 KEY_SPEC_SESSION_KEYRING = -0x3 KEY_SPEC_THREAD_KEYRING = -0x1 KEY_SPEC_USER_KEYRING = -0x4 KEY_SPEC_USER_SESSION_KEYRING = -0x5 LINUX_REBOOT_CMD_CAD_OFF = 0x0 LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef LINUX_REBOOT_CMD_HALT = 0xcdef0123 LINUX_REBOOT_CMD_KEXEC = 0x45584543 LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc LINUX_REBOOT_CMD_RESTART = 0x1234567 LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 LINUX_REBOOT_MAGIC1 = 0xfee1dead LINUX_REBOOT_MAGIC2 = 0x28121969 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 MADV_DONTFORK = 0xa MADV_DONTNEED = 0x4 MADV_FREE = 0x8 MADV_HUGEPAGE = 0xe MADV_HWPOISON = 0x64 MADV_MERGEABLE = 0xc MADV_NOHUGEPAGE = 0xf MADV_NORMAL = 0x0 MADV_RANDOM = 0x1 MADV_REMOVE = 0x9 MADV_SEQUENTIAL = 0x2 MADV_UNMERGEABLE = 0xd MADV_WILLNEED = 0x3 MAP_ANON = 0x20 MAP_ANONYMOUS = 0x20 MAP_DENYWRITE = 0x800 MAP_EXECUTABLE = 0x1000 MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_GROWSDOWN = 0x100 MAP_HUGETLB = 0x40000 MAP_HUGE_MASK = 0x3f MAP_HUGE_SHIFT = 0x1a MAP_LOCKED = 0x80 MAP_NONBLOCK = 0x10000 MAP_NORESERVE = 0x40 MAP_POPULATE = 0x8000 MAP_PRIVATE = 0x2 MAP_SHARED = 0x1 MAP_STACK = 0x20000 MAP_TYPE = 0xf MCL_CURRENT = 0x2000 MCL_FUTURE = 0x4000 MCL_ONFAULT = 0x8000 MNT_DETACH = 0x2 MNT_EXPIRE = 0x4 MNT_FORCE = 0x1 MSG_BATCH = 0x40000 MSG_CMSG_CLOEXEC = 0x40000000 MSG_CONFIRM = 0x800 MSG_CTRUNC = 0x8 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x40 MSG_EOR = 0x80 MSG_ERRQUEUE = 0x2000 MSG_FASTOPEN = 0x20000000 MSG_FIN = 0x200 MSG_MORE = 0x8000 MSG_NOSIGNAL = 0x4000 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_PROXY = 0x10 MSG_RST = 0x1000 MSG_SYN = 0x400 MSG_TRUNC = 0x20 MSG_TRYHARD = 0x4 MSG_WAITALL = 0x100 MSG_WAITFORONE = 0x10000 MS_ACTIVE = 0x40000000 MS_ASYNC = 0x1 MS_BIND = 0x1000 MS_BORN = 0x20000000 MS_DIRSYNC = 0x80 MS_INVALIDATE = 0x2 MS_I_VERSION = 0x800000 MS_KERNMOUNT = 0x400000 MS_LAZYTIME = 0x2000000 MS_MANDLOCK = 0x40 MS_MGC_MSK = 0xffff0000 MS_MGC_VAL = 0xc0ed0000 MS_MOVE = 0x2000 MS_NOATIME = 0x400 MS_NODEV = 0x4 MS_NODIRATIME = 0x800 MS_NOEXEC = 0x8 MS_NOREMOTELOCK = 0x8000000 MS_NOSEC = 0x10000000 MS_NOSUID = 0x2 MS_NOUSER = -0x80000000 MS_POSIXACL = 0x10000 MS_PRIVATE = 0x40000 MS_RDONLY = 0x1 MS_REC = 0x4000 MS_RELATIME = 0x200000 MS_REMOUNT = 0x20 MS_RMT_MASK = 0x2800051 MS_SHARED = 0x100000 MS_SILENT = 0x8000 MS_SLAVE = 0x80000 MS_STRICTATIME = 0x1000000 MS_SUBMOUNT = 0x4000000 MS_SYNC = 0x4 MS_SYNCHRONOUS = 0x10 MS_UNBINDABLE = 0x20000 MS_VERBOSE = 0x8000 NAME_MAX = 0xff NETLINK_ADD_MEMBERSHIP = 0x1 NETLINK_AUDIT = 0x9 NETLINK_BROADCAST_ERROR = 0x4 NETLINK_CAP_ACK = 0xa NETLINK_CONNECTOR = 0xb NETLINK_CRYPTO = 0x15 NETLINK_DNRTMSG = 0xe NETLINK_DROP_MEMBERSHIP = 0x2 NETLINK_ECRYPTFS = 0x13 NETLINK_EXT_ACK = 0xb NETLINK_FIB_LOOKUP = 0xa NETLINK_FIREWALL = 0x3 NETLINK_GENERIC = 0x10 NETLINK_INET_DIAG = 0x4 NETLINK_IP6_FW = 0xd NETLINK_ISCSI = 0x8 NETLINK_KOBJECT_UEVENT = 0xf NETLINK_LISTEN_ALL_NSID = 0x8 NETLINK_LIST_MEMBERSHIPS = 0x9 NETLINK_NETFILTER = 0xc NETLINK_NFLOG = 0x5 NETLINK_NO_ENOBUFS = 0x5 NETLINK_PKTINFO = 0x3 NETLINK_RDMA = 0x14 NETLINK_ROUTE = 0x0 NETLINK_RX_RING = 0x6 NETLINK_SCSITRANSPORT = 0x12 NETLINK_SELINUX = 0x7 NETLINK_SMC = 0x16 NETLINK_SOCK_DIAG = 0x4 NETLINK_TX_RING = 0x7 NETLINK_UNUSED = 0x1 NETLINK_USERSOCK = 0x2 NETLINK_XFRM = 0x6 NL0 = 0x0 NL1 = 0x100 NL2 = 0x200 NL3 = 0x300 NLA_ALIGNTO = 0x4 NLA_F_NESTED = 0x8000 NLA_F_NET_BYTEORDER = 0x4000 NLA_HDRLEN = 0x4 NLDLY = 0x300 NLMSG_ALIGNTO = 0x4 NLMSG_DONE = 0x3 NLMSG_ERROR = 0x2 NLMSG_HDRLEN = 0x10 NLMSG_MIN_TYPE = 0x10 NLMSG_NOOP = 0x1 NLMSG_OVERRUN = 0x4 NLM_F_ACK = 0x4 NLM_F_ACK_TLVS = 0x200 NLM_F_APPEND = 0x800 NLM_F_ATOMIC = 0x400 NLM_F_CAPPED = 0x100 NLM_F_CREATE = 0x400 NLM_F_DUMP = 0x300 NLM_F_DUMP_FILTERED = 0x20 NLM_F_DUMP_INTR = 0x10 NLM_F_ECHO = 0x8 NLM_F_EXCL = 0x200 NLM_F_MATCH = 0x200 NLM_F_MULTI = 0x2 NLM_F_REPLACE = 0x100 NLM_F_REQUEST = 0x1 NLM_F_ROOT = 0x100 NOFLSH = 0x80000000 OCRNL = 0x8 OFDEL = 0x80 OFILL = 0x40 OLCUC = 0x4 ONLCR = 0x2 ONLRET = 0x20 ONOCR = 0x10 OPOST = 0x1 O_ACCMODE = 0x3 O_APPEND = 0x400 O_ASYNC = 0x2000 O_CLOEXEC = 0x80000 O_CREAT = 0x40 O_DIRECT = 0x20000 O_DIRECTORY = 0x4000 O_DSYNC = 0x1000 O_EXCL = 0x80 O_FSYNC = 0x101000 O_LARGEFILE = 0x0 O_NDELAY = 0x800 O_NOATIME = 0x40000 O_NOCTTY = 0x100 O_NOFOLLOW = 0x8000 O_NONBLOCK = 0x800 O_PATH = 0x200000 O_RDONLY = 0x0 O_RDWR = 0x2 O_RSYNC = 0x101000 O_SYNC = 0x101000 O_TMPFILE = 0x404000 O_TRUNC = 0x200 O_WRONLY = 0x1 PACKET_ADD_MEMBERSHIP = 0x1 PACKET_AUXDATA = 0x8 PACKET_BROADCAST = 0x1 PACKET_COPY_THRESH = 0x7 PACKET_DROP_MEMBERSHIP = 0x2 PACKET_FANOUT = 0x12 PACKET_FANOUT_CBPF = 0x6 PACKET_FANOUT_CPU = 0x2 PACKET_FANOUT_DATA = 0x16 PACKET_FANOUT_EBPF = 0x7 PACKET_FANOUT_FLAG_DEFRAG = 0x8000 PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 PACKET_FANOUT_HASH = 0x0 PACKET_FANOUT_LB = 0x1 PACKET_FANOUT_QM = 0x5 PACKET_FANOUT_RND = 0x4 PACKET_FANOUT_ROLLOVER = 0x3 PACKET_FASTROUTE = 0x6 PACKET_HDRLEN = 0xb PACKET_HOST = 0x0 PACKET_KERNEL = 0x7 PACKET_LOOPBACK = 0x5 PACKET_LOSS = 0xe PACKET_MR_ALLMULTI = 0x2 PACKET_MR_MULTICAST = 0x0 PACKET_MR_PROMISC = 0x1 PACKET_MR_UNICAST = 0x3 PACKET_MULTICAST = 0x2 PACKET_ORIGDEV = 0x9 PACKET_OTHERHOST = 0x3 PACKET_OUTGOING = 0x4 PACKET_QDISC_BYPASS = 0x14 PACKET_RECV_OUTPUT = 0x3 PACKET_RESERVE = 0xc PACKET_ROLLOVER_STATS = 0x15 PACKET_RX_RING = 0x5 PACKET_STATISTICS = 0x6 PACKET_TIMESTAMP = 0x11 PACKET_TX_HAS_OFF = 0x13 PACKET_TX_RING = 0xd PACKET_TX_TIMESTAMP = 0x10 PACKET_USER = 0x6 PACKET_VERSION = 0xa PACKET_VNET_HDR = 0xf PARENB = 0x1000 PARITY_CRC16_PR0 = 0x2 PARITY_CRC16_PR0_CCITT = 0x4 PARITY_CRC16_PR1 = 0x3 PARITY_CRC16_PR1_CCITT = 0x5 PARITY_CRC32_PR0_CCITT = 0x6 PARITY_CRC32_PR1_CCITT = 0x7 PARITY_DEFAULT = 0x0 PARITY_NONE = 0x1 PARMRK = 0x8 PARODD = 0x2000 PENDIN = 0x20000000 PERF_EVENT_IOC_DISABLE = 0x20002401 PERF_EVENT_IOC_ENABLE = 0x20002400 PERF_EVENT_IOC_ID = 0x40082407 PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 PERF_EVENT_IOC_PERIOD = 0x80082404 PERF_EVENT_IOC_REFRESH = 0x20002402 PERF_EVENT_IOC_RESET = 0x20002403 PERF_EVENT_IOC_SET_BPF = 0x80042408 PERF_EVENT_IOC_SET_FILTER = 0x80082406 PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 PROT_EXEC = 0x4 PROT_GROWSDOWN = 0x1000000 PROT_GROWSUP = 0x2000000 PROT_NONE = 0x0 PROT_READ = 0x1 PROT_SAO = 0x10 PROT_WRITE = 0x2 PR_CAPBSET_DROP = 0x18 PR_CAPBSET_READ = 0x17 PR_CAP_AMBIENT = 0x2f PR_CAP_AMBIENT_CLEAR_ALL = 0x4 PR_CAP_AMBIENT_IS_SET = 0x1 PR_CAP_AMBIENT_LOWER = 0x3 PR_CAP_AMBIENT_RAISE = 0x2 PR_ENDIAN_BIG = 0x0 PR_ENDIAN_LITTLE = 0x1 PR_ENDIAN_PPC_LITTLE = 0x2 PR_FPEMU_NOPRINT = 0x1 PR_FPEMU_SIGFPE = 0x2 PR_FP_EXC_ASYNC = 0x2 PR_FP_EXC_DISABLED = 0x0 PR_FP_EXC_DIV = 0x10000 PR_FP_EXC_INV = 0x100000 PR_FP_EXC_NONRECOV = 0x1 PR_FP_EXC_OVF = 0x20000 PR_FP_EXC_PRECISE = 0x3 PR_FP_EXC_RES = 0x80000 PR_FP_EXC_SW_ENABLE = 0x80 PR_FP_EXC_UND = 0x40000 PR_FP_MODE_FR = 0x1 PR_FP_MODE_FRE = 0x2 PR_GET_CHILD_SUBREAPER = 0x25 PR_GET_DUMPABLE = 0x3 PR_GET_ENDIAN = 0x13 PR_GET_FPEMU = 0x9 PR_GET_FPEXC = 0xb PR_GET_FP_MODE = 0x2e PR_GET_KEEPCAPS = 0x7 PR_GET_NAME = 0x10 PR_GET_NO_NEW_PRIVS = 0x27 PR_GET_PDEATHSIG = 0x2 PR_GET_SECCOMP = 0x15 PR_GET_SECUREBITS = 0x1b PR_GET_THP_DISABLE = 0x2a PR_GET_TID_ADDRESS = 0x28 PR_GET_TIMERSLACK = 0x1e PR_GET_TIMING = 0xd PR_GET_TSC = 0x19 PR_GET_UNALIGN = 0x5 PR_MCE_KILL = 0x21 PR_MCE_KILL_CLEAR = 0x0 PR_MCE_KILL_DEFAULT = 0x2 PR_MCE_KILL_EARLY = 0x1 PR_MCE_KILL_GET = 0x22 PR_MCE_KILL_LATE = 0x0 PR_MCE_KILL_SET = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b PR_SET_CHILD_SUBREAPER = 0x24 PR_SET_DUMPABLE = 0x4 PR_SET_ENDIAN = 0x14 PR_SET_FPEMU = 0xa PR_SET_FPEXC = 0xc PR_SET_FP_MODE = 0x2d PR_SET_KEEPCAPS = 0x8 PR_SET_MM = 0x23 PR_SET_MM_ARG_END = 0x9 PR_SET_MM_ARG_START = 0x8 PR_SET_MM_AUXV = 0xc PR_SET_MM_BRK = 0x7 PR_SET_MM_END_CODE = 0x2 PR_SET_MM_END_DATA = 0x4 PR_SET_MM_ENV_END = 0xb PR_SET_MM_ENV_START = 0xa PR_SET_MM_EXE_FILE = 0xd PR_SET_MM_MAP = 0xe PR_SET_MM_MAP_SIZE = 0xf PR_SET_MM_START_BRK = 0x6 PR_SET_MM_START_CODE = 0x1 PR_SET_MM_START_DATA = 0x3 PR_SET_MM_START_STACK = 0x5 PR_SET_NAME = 0xf PR_SET_NO_NEW_PRIVS = 0x26 PR_SET_PDEATHSIG = 0x1 PR_SET_PTRACER = 0x59616d61 PR_SET_PTRACER_ANY = 0xffffffffffffffff PR_SET_SECCOMP = 0x16 PR_SET_SECUREBITS = 0x1c PR_SET_THP_DISABLE = 0x29 PR_SET_TIMERSLACK = 0x1d PR_SET_TIMING = 0xe PR_SET_TSC = 0x1a PR_SET_UNALIGN = 0x6 PR_TASK_PERF_EVENTS_DISABLE = 0x1f PR_TASK_PERF_EVENTS_ENABLE = 0x20 PR_TIMING_STATISTICAL = 0x0 PR_TIMING_TIMESTAMP = 0x1 PR_TSC_ENABLE = 0x1 PR_TSC_SIGSEGV = 0x2 PR_UNALIGN_NOPRINT = 0x1 PR_UNALIGN_SIGBUS = 0x2 PTRACE_ATTACH = 0x10 PTRACE_CONT = 0x7 PTRACE_DETACH = 0x11 PTRACE_EVENT_CLONE = 0x3 PTRACE_EVENT_EXEC = 0x4 PTRACE_EVENT_EXIT = 0x6 PTRACE_EVENT_FORK = 0x1 PTRACE_EVENT_SECCOMP = 0x7 PTRACE_EVENT_STOP = 0x80 PTRACE_EVENT_VFORK = 0x2 PTRACE_EVENT_VFORK_DONE = 0x5 PTRACE_GETEVENTMSG = 0x4201 PTRACE_GETEVRREGS = 0x14 PTRACE_GETFPREGS = 0xe PTRACE_GETREGS = 0xc PTRACE_GETREGS64 = 0x16 PTRACE_GETREGSET = 0x4204 PTRACE_GETSIGINFO = 0x4202 PTRACE_GETSIGMASK = 0x420a PTRACE_GETVRREGS = 0x12 PTRACE_GETVSRREGS = 0x1b PTRACE_GET_DEBUGREG = 0x19 PTRACE_INTERRUPT = 0x4207 PTRACE_KILL = 0x8 PTRACE_LISTEN = 0x4208 PTRACE_O_EXITKILL = 0x100000 PTRACE_O_MASK = 0x3000ff PTRACE_O_SUSPEND_SECCOMP = 0x200000 PTRACE_O_TRACECLONE = 0x8 PTRACE_O_TRACEEXEC = 0x10 PTRACE_O_TRACEEXIT = 0x40 PTRACE_O_TRACEFORK = 0x2 PTRACE_O_TRACESECCOMP = 0x80 PTRACE_O_TRACESYSGOOD = 0x1 PTRACE_O_TRACEVFORK = 0x4 PTRACE_O_TRACEVFORKDONE = 0x20 PTRACE_PEEKDATA = 0x2 PTRACE_PEEKSIGINFO = 0x4209 PTRACE_PEEKSIGINFO_SHARED = 0x1 PTRACE_PEEKTEXT = 0x1 PTRACE_PEEKUSR = 0x3 PTRACE_POKEDATA = 0x5 PTRACE_POKETEXT = 0x4 PTRACE_POKEUSR = 0x6 PTRACE_SECCOMP_GET_FILTER = 0x420c PTRACE_SEIZE = 0x4206 PTRACE_SETEVRREGS = 0x15 PTRACE_SETFPREGS = 0xf PTRACE_SETOPTIONS = 0x4200 PTRACE_SETREGS = 0xd PTRACE_SETREGS64 = 0x17 PTRACE_SETREGSET = 0x4205 PTRACE_SETSIGINFO = 0x4203 PTRACE_SETSIGMASK = 0x420b PTRACE_SETVRREGS = 0x13 PTRACE_SETVSRREGS = 0x1c PTRACE_SET_DEBUGREG = 0x1a PTRACE_SINGLEBLOCK = 0x100 PTRACE_SINGLESTEP = 0x9 PTRACE_SYSCALL = 0x18 PTRACE_TRACEME = 0x0 PT_CCR = 0x26 PT_CTR = 0x23 PT_DAR = 0x29 PT_DSCR = 0x2c PT_DSISR = 0x2a PT_FPR0 = 0x30 PT_FPSCR = 0x50 PT_LNK = 0x24 PT_MSR = 0x21 PT_NIP = 0x20 PT_ORIG_R3 = 0x22 PT_R0 = 0x0 PT_R1 = 0x1 PT_R10 = 0xa PT_R11 = 0xb PT_R12 = 0xc PT_R13 = 0xd PT_R14 = 0xe PT_R15 = 0xf PT_R16 = 0x10 PT_R17 = 0x11 PT_R18 = 0x12 PT_R19 = 0x13 PT_R2 = 0x2 PT_R20 = 0x14 PT_R21 = 0x15 PT_R22 = 0x16 PT_R23 = 0x17 PT_R24 = 0x18 PT_R25 = 0x19 PT_R26 = 0x1a PT_R27 = 0x1b PT_R28 = 0x1c PT_R29 = 0x1d PT_R3 = 0x3 PT_R30 = 0x1e PT_R31 = 0x1f PT_R4 = 0x4 PT_R5 = 0x5 PT_R6 = 0x6 PT_R7 = 0x7 PT_R8 = 0x8 PT_R9 = 0x9 PT_REGS_COUNT = 0x2c PT_RESULT = 0x2b PT_SOFTE = 0x27 PT_TRAP = 0x28 PT_VR0 = 0x52 PT_VRSAVE = 0x94 PT_VSCR = 0x93 PT_VSR0 = 0x96 PT_VSR31 = 0xd4 PT_XER = 0x25 RLIMIT_AS = 0x9 RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 RLIMIT_LOCKS = 0xa RLIMIT_MEMLOCK = 0x8 RLIMIT_MSGQUEUE = 0xc RLIMIT_NICE = 0xd RLIMIT_NOFILE = 0x7 RLIMIT_NPROC = 0x6 RLIMIT_RSS = 0x5 RLIMIT_RTPRIO = 0xe RLIMIT_RTTIME = 0xf RLIMIT_SIGPENDING = 0xb RLIMIT_STACK = 0x3 RLIM_INFINITY = 0xffffffffffffffff RTAX_ADVMSS = 0x8 RTAX_CC_ALGO = 0x10 RTAX_CWND = 0x7 RTAX_FEATURES = 0xc RTAX_FEATURE_ALLFRAG = 0x8 RTAX_FEATURE_ECN = 0x1 RTAX_FEATURE_MASK = 0xf RTAX_FEATURE_SACK = 0x2 RTAX_FEATURE_TIMESTAMP = 0x4 RTAX_HOPLIMIT = 0xa RTAX_INITCWND = 0xb RTAX_INITRWND = 0xe RTAX_LOCK = 0x1 RTAX_MAX = 0x10 RTAX_MTU = 0x2 RTAX_QUICKACK = 0xf RTAX_REORDERING = 0x9 RTAX_RTO_MIN = 0xd RTAX_RTT = 0x4 RTAX_RTTVAR = 0x5 RTAX_SSTHRESH = 0x6 RTAX_UNSPEC = 0x0 RTAX_WINDOW = 0x3 RTA_ALIGNTO = 0x4 RTA_MAX = 0x1a RTCF_DIRECTSRC = 0x4000000 RTCF_DOREDIRECT = 0x1000000 RTCF_LOG = 0x2000000 RTCF_MASQ = 0x400000 RTCF_NAT = 0x800000 RTCF_VALVE = 0x200000 RTF_ADDRCLASSMASK = 0xf8000000 RTF_ADDRCONF = 0x40000 RTF_ALLONLINK = 0x20000 RTF_BROADCAST = 0x10000000 RTF_CACHE = 0x1000000 RTF_DEFAULT = 0x10000 RTF_DYNAMIC = 0x10 RTF_FLOW = 0x2000000 RTF_GATEWAY = 0x2 RTF_HOST = 0x4 RTF_INTERFACE = 0x40000000 RTF_IRTT = 0x100 RTF_LINKRT = 0x100000 RTF_LOCAL = 0x80000000 RTF_MODIFIED = 0x20 RTF_MSS = 0x40 RTF_MTU = 0x40 RTF_MULTICAST = 0x20000000 RTF_NAT = 0x8000000 RTF_NOFORWARD = 0x1000 RTF_NONEXTHOP = 0x200000 RTF_NOPMTUDISC = 0x4000 RTF_POLICY = 0x4000000 RTF_REINSTATE = 0x8 RTF_REJECT = 0x200 RTF_STATIC = 0x400 RTF_THROW = 0x2000 RTF_UP = 0x1 RTF_WINDOW = 0x80 RTF_XRESOLVE = 0x800 RTM_BASE = 0x10 RTM_DELACTION = 0x31 RTM_DELADDR = 0x15 RTM_DELADDRLABEL = 0x49 RTM_DELLINK = 0x11 RTM_DELMDB = 0x55 RTM_DELNEIGH = 0x1d RTM_DELNETCONF = 0x51 RTM_DELNSID = 0x59 RTM_DELQDISC = 0x25 RTM_DELROUTE = 0x19 RTM_DELRULE = 0x21 RTM_DELTCLASS = 0x29 RTM_DELTFILTER = 0x2d RTM_F_CLONED = 0x200 RTM_F_EQUALIZE = 0x400 RTM_F_FIB_MATCH = 0x2000 RTM_F_LOOKUP_TABLE = 0x1000 RTM_F_NOTIFY = 0x100 RTM_F_PREFIX = 0x800 RTM_GETACTION = 0x32 RTM_GETADDR = 0x16 RTM_GETADDRLABEL = 0x4a RTM_GETANYCAST = 0x3e RTM_GETDCB = 0x4e RTM_GETLINK = 0x12 RTM_GETMDB = 0x56 RTM_GETMULTICAST = 0x3a RTM_GETNEIGH = 0x1e RTM_GETNEIGHTBL = 0x42 RTM_GETNETCONF = 0x52 RTM_GETNSID = 0x5a RTM_GETQDISC = 0x26 RTM_GETROUTE = 0x1a RTM_GETRULE = 0x22 RTM_GETSTATS = 0x5e RTM_GETTCLASS = 0x2a RTM_GETTFILTER = 0x2e RTM_MAX = 0x63 RTM_NEWACTION = 0x30 RTM_NEWADDR = 0x14 RTM_NEWADDRLABEL = 0x48 RTM_NEWCACHEREPORT = 0x60 RTM_NEWLINK = 0x10 RTM_NEWMDB = 0x54 RTM_NEWNDUSEROPT = 0x44 RTM_NEWNEIGH = 0x1c RTM_NEWNEIGHTBL = 0x40 RTM_NEWNETCONF = 0x50 RTM_NEWNSID = 0x58 RTM_NEWPREFIX = 0x34 RTM_NEWQDISC = 0x24 RTM_NEWROUTE = 0x18 RTM_NEWRULE = 0x20 RTM_NEWSTATS = 0x5c RTM_NEWTCLASS = 0x28 RTM_NEWTFILTER = 0x2c RTM_NR_FAMILIES = 0x15 RTM_NR_MSGTYPES = 0x54 RTM_SETDCB = 0x4f RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 RTNH_ALIGNTO = 0x4 RTNH_COMPARE_MASK = 0x19 RTNH_F_DEAD = 0x1 RTNH_F_LINKDOWN = 0x10 RTNH_F_OFFLOAD = 0x8 RTNH_F_ONLINK = 0x4 RTNH_F_PERVASIVE = 0x2 RTNH_F_UNRESOLVED = 0x20 RTN_MAX = 0xb RTPROT_BABEL = 0x2a RTPROT_BIRD = 0xc RTPROT_BOOT = 0x3 RTPROT_DHCP = 0x10 RTPROT_DNROUTED = 0xd RTPROT_GATED = 0x8 RTPROT_KERNEL = 0x2 RTPROT_MROUTED = 0x11 RTPROT_MRT = 0xa RTPROT_NTK = 0xf RTPROT_RA = 0x9 RTPROT_REDIRECT = 0x1 RTPROT_STATIC = 0x4 RTPROT_UNSPEC = 0x0 RTPROT_XORP = 0xe RTPROT_ZEBRA = 0xb RT_CLASS_DEFAULT = 0xfd RT_CLASS_LOCAL = 0xff RT_CLASS_MAIN = 0xfe RT_CLASS_MAX = 0xff RT_CLASS_UNSPEC = 0x0 RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 RUSAGE_THREAD = 0x1 SCM_CREDENTIALS = 0x2 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x1d SCM_TIMESTAMPING = 0x25 SCM_TIMESTAMPING_OPT_STATS = 0x36 SCM_TIMESTAMPING_PKTINFO = 0x3a SCM_TIMESTAMPNS = 0x23 SCM_WIFI_STATUS = 0x29 SECCOMP_MODE_DISABLED = 0x0 SECCOMP_MODE_FILTER = 0x2 SECCOMP_MODE_STRICT = 0x1 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 SIOCADDDLCI = 0x8980 SIOCADDMULTI = 0x8931 SIOCADDRT = 0x890b SIOCATMARK = 0x8905 SIOCBONDCHANGEACTIVE = 0x8995 SIOCBONDENSLAVE = 0x8990 SIOCBONDINFOQUERY = 0x8994 SIOCBONDRELEASE = 0x8991 SIOCBONDSETHWADDR = 0x8992 SIOCBONDSLAVEINFOQUERY = 0x8993 SIOCBRADDBR = 0x89a0 SIOCBRADDIF = 0x89a2 SIOCBRDELBR = 0x89a1 SIOCBRDELIF = 0x89a3 SIOCDARP = 0x8953 SIOCDELDLCI = 0x8981 SIOCDELMULTI = 0x8932 SIOCDELRT = 0x890c SIOCDEVPRIVATE = 0x89f0 SIOCDIFADDR = 0x8936 SIOCDRARP = 0x8960 SIOCETHTOOL = 0x8946 SIOCGARP = 0x8954 SIOCGHWTSTAMP = 0x89b1 SIOCGIFADDR = 0x8915 SIOCGIFBR = 0x8940 SIOCGIFBRDADDR = 0x8919 SIOCGIFCONF = 0x8912 SIOCGIFCOUNT = 0x8938 SIOCGIFDSTADDR = 0x8917 SIOCGIFENCAP = 0x8925 SIOCGIFFLAGS = 0x8913 SIOCGIFHWADDR = 0x8927 SIOCGIFINDEX = 0x8933 SIOCGIFMAP = 0x8970 SIOCGIFMEM = 0x891f SIOCGIFMETRIC = 0x891d SIOCGIFMTU = 0x8921 SIOCGIFNAME = 0x8910 SIOCGIFNETMASK = 0x891b SIOCGIFPFLAGS = 0x8935 SIOCGIFSLAVE = 0x8929 SIOCGIFTXQLEN = 0x8942 SIOCGIFVLAN = 0x8982 SIOCGMIIPHY = 0x8947 SIOCGMIIREG = 0x8948 SIOCGPGRP = 0x8904 SIOCGRARP = 0x8961 SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 SIOCGSTAMPNS = 0x8907 SIOCINQ = 0x4004667f SIOCOUTQ = 0x40047473 SIOCOUTQNSD = 0x894b SIOCPROTOPRIVATE = 0x89e0 SIOCRTMSG = 0x890d SIOCSARP = 0x8955 SIOCSHWTSTAMP = 0x89b0 SIOCSIFADDR = 0x8916 SIOCSIFBR = 0x8941 SIOCSIFBRDADDR = 0x891a SIOCSIFDSTADDR = 0x8918 SIOCSIFENCAP = 0x8926 SIOCSIFFLAGS = 0x8914 SIOCSIFHWADDR = 0x8924 SIOCSIFHWBROADCAST = 0x8937 SIOCSIFLINK = 0x8911 SIOCSIFMAP = 0x8971 SIOCSIFMEM = 0x8920 SIOCSIFMETRIC = 0x891e SIOCSIFMTU = 0x8922 SIOCSIFNAME = 0x8923 SIOCSIFNETMASK = 0x891c SIOCSIFPFLAGS = 0x8934 SIOCSIFSLAVE = 0x8930 SIOCSIFTXQLEN = 0x8943 SIOCSIFVLAN = 0x8983 SIOCSMIIREG = 0x8949 SIOCSPGRP = 0x8902 SIOCSRARP = 0x8962 SIOCWANDEV = 0x894a SOCK_CLOEXEC = 0x80000 SOCK_DCCP = 0x6 SOCK_DGRAM = 0x2 SOCK_IOC_TYPE = 0x89 SOCK_NONBLOCK = 0x800 SOCK_PACKET = 0xa SOCK_RAW = 0x3 SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x1 SOL_AAL = 0x109 SOL_ALG = 0x117 SOL_ATM = 0x108 SOL_CAIF = 0x116 SOL_CAN_BASE = 0x64 SOL_DCCP = 0x10d SOL_DECNET = 0x105 SOL_ICMPV6 = 0x3a SOL_IP = 0x0 SOL_IPV6 = 0x29 SOL_IRDA = 0x10a SOL_IUCV = 0x115 SOL_KCM = 0x119 SOL_LLC = 0x10c SOL_NETBEUI = 0x10b SOL_NETLINK = 0x10e SOL_NFC = 0x118 SOL_PACKET = 0x107 SOL_PNPIPE = 0x113 SOL_PPPOL2TP = 0x111 SOL_RAW = 0xff SOL_RDS = 0x114 SOL_RXRPC = 0x110 SOL_SOCKET = 0x1 SOL_TCP = 0x6 SOL_TIPC = 0x10f SOL_X25 = 0x106 SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x1e SO_ATTACH_BPF = 0x32 SO_ATTACH_FILTER = 0x1a SO_ATTACH_REUSEPORT_CBPF = 0x33 SO_ATTACH_REUSEPORT_EBPF = 0x34 SO_BINDTODEVICE = 0x19 SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe SO_BUSY_POLL = 0x2e SO_CNX_ADVICE = 0x35 SO_COOKIE = 0x39 SO_DEBUG = 0x1 SO_DETACH_BPF = 0x1b SO_DETACH_FILTER = 0x1b SO_DOMAIN = 0x27 SO_DONTROUTE = 0x5 SO_ERROR = 0x4 SO_GET_FILTER = 0x1a SO_INCOMING_CPU = 0x31 SO_INCOMING_NAPI_ID = 0x38 SO_KEEPALIVE = 0x9 SO_LINGER = 0xd SO_LOCK_FILTER = 0x2c SO_MARK = 0x24 SO_MAX_PACING_RATE = 0x2f SO_MEMINFO = 0x37 SO_NOFCS = 0x2b SO_NO_CHECK = 0xb SO_OOBINLINE = 0xa SO_PASSCRED = 0x14 SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x15 SO_PEERGROUPS = 0x3b SO_PEERNAME = 0x1c SO_PEERSEC = 0x1f SO_PRIORITY = 0xc SO_PROTOCOL = 0x26 SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x10 SO_RCVTIMEO = 0x12 SO_REUSEADDR = 0x2 SO_REUSEPORT = 0xf SO_RXQ_OVFL = 0x28 SO_SECURITY_AUTHENTICATION = 0x16 SO_SECURITY_ENCRYPTION_NETWORK = 0x18 SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 SO_SELECT_ERR_QUEUE = 0x2d SO_SNDBUF = 0x7 SO_SNDBUFFORCE = 0x20 SO_SNDLOWAT = 0x11 SO_SNDTIMEO = 0x13 SO_TIMESTAMP = 0x1d SO_TIMESTAMPING = 0x25 SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x3 SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 SO_VM_SOCKETS_BUFFER_SIZE = 0x0 SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 SO_VM_SOCKETS_TRUSTED = 0x5 SO_WIFI_STATUS = 0x29 SPLICE_F_GIFT = 0x8 SPLICE_F_MORE = 0x4 SPLICE_F_MOVE = 0x1 SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000 S_IFCHR = 0x2000 S_IFDIR = 0x4000 S_IFIFO = 0x1000 S_IFLNK = 0xa000 S_IFMT = 0xf000 S_IFREG = 0x8000 S_IFSOCK = 0xc000 S_IREAD = 0x100 S_IRGRP = 0x20 S_IROTH = 0x4 S_IRUSR = 0x100 S_IRWXG = 0x38 S_IRWXO = 0x7 S_IRWXU = 0x1c0 S_ISGID = 0x400 S_ISUID = 0x800 S_ISVTX = 0x200 S_IWGRP = 0x10 S_IWOTH = 0x2 S_IWRITE = 0x80 S_IWUSR = 0x80 S_IXGRP = 0x8 S_IXOTH = 0x1 S_IXUSR = 0x40 TAB0 = 0x0 TAB1 = 0x400 TAB2 = 0x800 TAB3 = 0xc00 TABDLY = 0xc00 TASKSTATS_CMD_ATTR_MAX = 0x4 TASKSTATS_CMD_MAX = 0x2 TASKSTATS_GENL_NAME = "TASKSTATS" TASKSTATS_GENL_VERSION = 0x1 TASKSTATS_TYPE_MAX = 0x6 TASKSTATS_VERSION = 0x8 TCFLSH = 0x2000741f TCGETA = 0x40147417 TCGETS = 0x402c7413 TCIFLUSH = 0x0 TCIOFF = 0x2 TCIOFLUSH = 0x2 TCION = 0x3 TCOFLUSH = 0x1 TCOOFF = 0x0 TCOON = 0x1 TCP_CC_INFO = 0x1a TCP_CONGESTION = 0xd TCP_COOKIE_IN_ALWAYS = 0x1 TCP_COOKIE_MAX = 0x10 TCP_COOKIE_MIN = 0x8 TCP_COOKIE_OUT_NEVER = 0x2 TCP_COOKIE_PAIR_SIZE = 0x20 TCP_COOKIE_TRANSACTIONS = 0xf TCP_CORK = 0x3 TCP_DEFER_ACCEPT = 0x9 TCP_FASTOPEN = 0x17 TCP_FASTOPEN_CONNECT = 0x1e TCP_INFO = 0xb TCP_KEEPCNT = 0x6 TCP_KEEPIDLE = 0x4 TCP_KEEPINTVL = 0x5 TCP_LINGER2 = 0x8 TCP_MAXSEG = 0x2 TCP_MAXWIN = 0xffff TCP_MAX_WINSHIFT = 0xe TCP_MD5SIG = 0xe TCP_MD5SIG_MAXKEYLEN = 0x50 TCP_MSS = 0x200 TCP_MSS_DEFAULT = 0x218 TCP_MSS_DESIRED = 0x4c4 TCP_NODELAY = 0x1 TCP_NOTSENT_LOWAT = 0x19 TCP_QUEUE_SEQ = 0x15 TCP_QUICKACK = 0xc TCP_REPAIR = 0x13 TCP_REPAIR_OPTIONS = 0x16 TCP_REPAIR_QUEUE = 0x14 TCP_REPAIR_WINDOW = 0x1d TCP_SAVED_SYN = 0x1c TCP_SAVE_SYN = 0x1b TCP_SYNCNT = 0x7 TCP_S_DATA_IN = 0x4 TCP_S_DATA_OUT = 0x8 TCP_THIN_DUPACK = 0x11 TCP_THIN_LINEAR_TIMEOUTS = 0x10 TCP_TIMESTAMP = 0x18 TCP_USER_TIMEOUT = 0x12 TCP_WINDOW_CLAMP = 0xa TCSAFLUSH = 0x2 TCSBRK = 0x2000741d TCSBRKP = 0x5425 TCSETA = 0x80147418 TCSETAF = 0x8014741c TCSETAW = 0x80147419 TCSETS = 0x802c7414 TCSETSF = 0x802c7416 TCSETSW = 0x802c7415 TCXONC = 0x2000741e TIOCCBRK = 0x5428 TIOCCONS = 0x541d TIOCEXCL = 0x540c TIOCGDEV = 0x40045432 TIOCGETC = 0x40067412 TIOCGETD = 0x5424 TIOCGETP = 0x40067408 TIOCGEXCL = 0x40045440 TIOCGICOUNT = 0x545d TIOCGLCKTRMIOS = 0x5456 TIOCGLTC = 0x40067474 TIOCGPGRP = 0x40047477 TIOCGPKT = 0x40045438 TIOCGPTLCK = 0x40045439 TIOCGPTN = 0x40045430 TIOCGPTPEER = 0x20005441 TIOCGRS485 = 0x542e TIOCGSERIAL = 0x541e TIOCGSID = 0x5429 TIOCGSOFTCAR = 0x5419 TIOCGWINSZ = 0x40087468 TIOCINQ = 0x4004667f TIOCLINUX = 0x541c TIOCMBIC = 0x5417 TIOCMBIS = 0x5416 TIOCMGET = 0x5415 TIOCMIWAIT = 0x545c TIOCMSET = 0x5418 TIOCM_CAR = 0x40 TIOCM_CD = 0x40 TIOCM_CTS = 0x20 TIOCM_DSR = 0x100 TIOCM_DTR = 0x2 TIOCM_LE = 0x1 TIOCM_LOOP = 0x8000 TIOCM_OUT1 = 0x2000 TIOCM_OUT2 = 0x4000 TIOCM_RI = 0x80 TIOCM_RNG = 0x80 TIOCM_RTS = 0x4 TIOCM_SR = 0x10 TIOCM_ST = 0x8 TIOCNOTTY = 0x5422 TIOCNXCL = 0x540d TIOCOUTQ = 0x40047473 TIOCPKT = 0x5420 TIOCPKT_DATA = 0x0 TIOCPKT_DOSTOP = 0x20 TIOCPKT_FLUSHREAD = 0x1 TIOCPKT_FLUSHWRITE = 0x2 TIOCPKT_IOCTL = 0x40 TIOCPKT_NOSTOP = 0x10 TIOCPKT_START = 0x8 TIOCPKT_STOP = 0x4 TIOCSBRK = 0x5427 TIOCSCTTY = 0x540e TIOCSERCONFIG = 0x5453 TIOCSERGETLSR = 0x5459 TIOCSERGETMULTI = 0x545a TIOCSERGSTRUCT = 0x5458 TIOCSERGWILD = 0x5454 TIOCSERSETMULTI = 0x545b TIOCSERSWILD = 0x5455 TIOCSER_TEMT = 0x1 TIOCSETC = 0x80067411 TIOCSETD = 0x5423 TIOCSETN = 0x8006740a TIOCSETP = 0x80067409 TIOCSIG = 0x80045436 TIOCSLCKTRMIOS = 0x5457 TIOCSLTC = 0x80067475 TIOCSPGRP = 0x80047476 TIOCSPTLCK = 0x80045431 TIOCSRS485 = 0x542f TIOCSSERIAL = 0x541f TIOCSSOFTCAR = 0x541a TIOCSTART = 0x2000746e TIOCSTI = 0x5412 TIOCSTOP = 0x2000746f TIOCSWINSZ = 0x80087467 TIOCVHANGUP = 0x5437 TOSTOP = 0x400000 TS_COMM_LEN = 0x20 TUNATTACHFILTER = 0x801054d5 TUNDETACHFILTER = 0x801054d6 TUNGETFEATURES = 0x400454cf TUNGETFILTER = 0x401054db TUNGETIFF = 0x400454d2 TUNGETSNDBUF = 0x400454d3 TUNGETVNETBE = 0x400454df TUNGETVNETHDRSZ = 0x400454d7 TUNGETVNETLE = 0x400454dd TUNSETDEBUG = 0x800454c9 TUNSETGROUP = 0x800454ce TUNSETIFF = 0x800454ca TUNSETIFINDEX = 0x800454da TUNSETLINK = 0x800454cd TUNSETNOCSUM = 0x800454c8 TUNSETOFFLOAD = 0x800454d0 TUNSETOWNER = 0x800454cc TUNSETPERSIST = 0x800454cb TUNSETQUEUE = 0x800454d9 TUNSETSNDBUF = 0x800454d4 TUNSETTXFILTER = 0x800454d1 TUNSETVNETBE = 0x800454de TUNSETVNETHDRSZ = 0x800454d8 TUNSETVNETLE = 0x800454dc UMOUNT_NOFOLLOW = 0x8 UTIME_NOW = 0x3fffffff UTIME_OMIT = 0x3ffffffe VDISCARD = 0x10 VEOF = 0x4 VEOL = 0x6 VEOL2 = 0x8 VERASE = 0x2 VINTR = 0x0 VKILL = 0x3 VLNEXT = 0xf VMADDR_CID_ANY = 0xffffffff VMADDR_CID_HOST = 0x2 VMADDR_CID_HYPERVISOR = 0x0 VMADDR_CID_RESERVED = 0x1 VMADDR_PORT_ANY = 0xffffffff VMIN = 0x5 VM_SOCKETS_INVALID_VERSION = 0xffffffff VQUIT = 0x1 VREPRINT = 0xb VSTART = 0xd VSTOP = 0xe VSUSP = 0xc VSWTC = 0x9 VT0 = 0x0 VT1 = 0x10000 VTDLY = 0x10000 VTIME = 0x7 VWERASE = 0xa WALL = 0x40000000 WCLONE = 0x80000000 WCONTINUED = 0x8 WDIOC_GETBOOTSTATUS = 0x40045702 WDIOC_GETPRETIMEOUT = 0x40045709 WDIOC_GETSTATUS = 0x40045701 WDIOC_GETSUPPORT = 0x40285700 WDIOC_GETTEMP = 0x40045703 WDIOC_GETTIMELEFT = 0x4004570a WDIOC_GETTIMEOUT = 0x40045707 WDIOC_KEEPALIVE = 0x40045705 WDIOC_SETOPTIONS = 0x40045704 WDIOC_SETPRETIMEOUT = 0xc0045708 WDIOC_SETTIMEOUT = 0xc0045706 WEXITED = 0x4 WNOHANG = 0x1 WNOTHREAD = 0x20000000 WNOWAIT = 0x1000000 WORDSIZE = 0x40 WSTOPPED = 0x2 WUNTRACED = 0x2 XATTR_CREATE = 0x1 XATTR_REPLACE = 0x2 XCASE = 0x4000 XTABS = 0xc00 ) // Errors const ( E2BIG = syscall.Errno(0x7) EACCES = syscall.Errno(0xd) EADDRINUSE = syscall.Errno(0x62) EADDRNOTAVAIL = syscall.Errno(0x63) EADV = syscall.Errno(0x44) EAFNOSUPPORT = syscall.Errno(0x61) EAGAIN = syscall.Errno(0xb) EALREADY = syscall.Errno(0x72) EBADE = syscall.Errno(0x34) EBADF = syscall.Errno(0x9) EBADFD = syscall.Errno(0x4d) EBADMSG = syscall.Errno(0x4a) EBADR = syscall.Errno(0x35) EBADRQC = syscall.Errno(0x38) EBADSLT = syscall.Errno(0x39) EBFONT = syscall.Errno(0x3b) EBUSY = syscall.Errno(0x10) ECANCELED = syscall.Errno(0x7d) ECHILD = syscall.Errno(0xa) ECHRNG = syscall.Errno(0x2c) ECOMM = syscall.Errno(0x46) ECONNABORTED = syscall.Errno(0x67) ECONNREFUSED = syscall.Errno(0x6f) ECONNRESET = syscall.Errno(0x68) EDEADLK = syscall.Errno(0x23) EDEADLOCK = syscall.Errno(0x3a) EDESTADDRREQ = syscall.Errno(0x59) EDOM = syscall.Errno(0x21) EDOTDOT = syscall.Errno(0x49) EDQUOT = syscall.Errno(0x7a) EEXIST = syscall.Errno(0x11) EFAULT = syscall.Errno(0xe) EFBIG = syscall.Errno(0x1b) EHOSTDOWN = syscall.Errno(0x70) EHOSTUNREACH = syscall.Errno(0x71) EHWPOISON = syscall.Errno(0x85) EIDRM = syscall.Errno(0x2b) EILSEQ = syscall.Errno(0x54) EINPROGRESS = syscall.Errno(0x73) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x6a) EISDIR = syscall.Errno(0x15) EISNAM = syscall.Errno(0x78) EKEYEXPIRED = syscall.Errno(0x7f) EKEYREJECTED = syscall.Errno(0x81) EKEYREVOKED = syscall.Errno(0x80) EL2HLT = syscall.Errno(0x33) EL2NSYNC = syscall.Errno(0x2d) EL3HLT = syscall.Errno(0x2e) EL3RST = syscall.Errno(0x2f) ELIBACC = syscall.Errno(0x4f) ELIBBAD = syscall.Errno(0x50) ELIBEXEC = syscall.Errno(0x53) ELIBMAX = syscall.Errno(0x52) ELIBSCN = syscall.Errno(0x51) ELNRNG = syscall.Errno(0x30) ELOOP = syscall.Errno(0x28) EMEDIUMTYPE = syscall.Errno(0x7c) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) EMSGSIZE = syscall.Errno(0x5a) EMULTIHOP = syscall.Errno(0x48) ENAMETOOLONG = syscall.Errno(0x24) ENAVAIL = syscall.Errno(0x77) ENETDOWN = syscall.Errno(0x64) ENETRESET = syscall.Errno(0x66) ENETUNREACH = syscall.Errno(0x65) ENFILE = syscall.Errno(0x17) ENOANO = syscall.Errno(0x37) ENOBUFS = syscall.Errno(0x69) ENOCSI = syscall.Errno(0x32) ENODATA = syscall.Errno(0x3d) ENODEV = syscall.Errno(0x13) ENOENT = syscall.Errno(0x2) ENOEXEC = syscall.Errno(0x8) ENOKEY = syscall.Errno(0x7e) ENOLCK = syscall.Errno(0x25) ENOLINK = syscall.Errno(0x43) ENOMEDIUM = syscall.Errno(0x7b) ENOMEM = syscall.Errno(0xc) ENOMSG = syscall.Errno(0x2a) ENONET = syscall.Errno(0x40) ENOPKG = syscall.Errno(0x41) ENOPROTOOPT = syscall.Errno(0x5c) ENOSPC = syscall.Errno(0x1c) ENOSR = syscall.Errno(0x3f) ENOSTR = syscall.Errno(0x3c) ENOSYS = syscall.Errno(0x26) ENOTBLK = syscall.Errno(0xf) ENOTCONN = syscall.Errno(0x6b) ENOTDIR = syscall.Errno(0x14) ENOTEMPTY = syscall.Errno(0x27) ENOTNAM = syscall.Errno(0x76) ENOTRECOVERABLE = syscall.Errno(0x83) ENOTSOCK = syscall.Errno(0x58) ENOTSUP = syscall.Errno(0x5f) ENOTTY = syscall.Errno(0x19) ENOTUNIQ = syscall.Errno(0x4c) ENXIO = syscall.Errno(0x6) EOPNOTSUPP = syscall.Errno(0x5f) EOVERFLOW = syscall.Errno(0x4b) EOWNERDEAD = syscall.Errno(0x82) EPERM = syscall.Errno(0x1) EPFNOSUPPORT = syscall.Errno(0x60) EPIPE = syscall.Errno(0x20) EPROTO = syscall.Errno(0x47) EPROTONOSUPPORT = syscall.Errno(0x5d) EPROTOTYPE = syscall.Errno(0x5b) ERANGE = syscall.Errno(0x22) EREMCHG = syscall.Errno(0x4e) EREMOTE = syscall.Errno(0x42) EREMOTEIO = syscall.Errno(0x79) ERESTART = syscall.Errno(0x55) ERFKILL = syscall.Errno(0x84) EROFS = syscall.Errno(0x1e) ESHUTDOWN = syscall.Errno(0x6c) ESOCKTNOSUPPORT = syscall.Errno(0x5e) ESPIPE = syscall.Errno(0x1d) ESRCH = syscall.Errno(0x3) ESRMNT = syscall.Errno(0x45) ESTALE = syscall.Errno(0x74) ESTRPIPE = syscall.Errno(0x56) ETIME = syscall.Errno(0x3e) ETIMEDOUT = syscall.Errno(0x6e) ETOOMANYREFS = syscall.Errno(0x6d) ETXTBSY = syscall.Errno(0x1a) EUCLEAN = syscall.Errno(0x75) EUNATCH = syscall.Errno(0x31) EUSERS = syscall.Errno(0x57) EWOULDBLOCK = syscall.Errno(0xb) EXDEV = syscall.Errno(0x12) EXFULL = syscall.Errno(0x36) ) // Signals const ( SIGABRT = syscall.Signal(0x6) SIGALRM = syscall.Signal(0xe) SIGBUS = syscall.Signal(0x7) SIGCHLD = syscall.Signal(0x11) SIGCLD = syscall.Signal(0x11) SIGCONT = syscall.Signal(0x12) SIGFPE = syscall.Signal(0x8) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x1d) SIGIOT = syscall.Signal(0x6) SIGKILL = syscall.Signal(0x9) SIGPIPE = syscall.Signal(0xd) SIGPOLL = syscall.Signal(0x1d) SIGPROF = syscall.Signal(0x1b) SIGPWR = syscall.Signal(0x1e) SIGQUIT = syscall.Signal(0x3) SIGSEGV = syscall.Signal(0xb) SIGSTKFLT = syscall.Signal(0x10) SIGSTOP = syscall.Signal(0x13) SIGSYS = syscall.Signal(0x1f) SIGTERM = syscall.Signal(0xf) SIGTRAP = syscall.Signal(0x5) SIGTSTP = syscall.Signal(0x14) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) SIGURG = syscall.Signal(0x17) SIGUSR1 = syscall.Signal(0xa) SIGUSR2 = syscall.Signal(0xc) SIGVTALRM = syscall.Signal(0x1a) SIGWINCH = syscall.Signal(0x1c) SIGXCPU = syscall.Signal(0x18) SIGXFSZ = syscall.Signal(0x19) ) // Error table var errors = [...]string{ 1: "operation not permitted", 2: "no such file or directory", 3: "no such process", 4: "interrupted system call", 5: "input/output error", 6: "no such device or address", 7: "argument list too long", 8: "exec format error", 9: "bad file descriptor", 10: "no child processes", 11: "resource temporarily unavailable", 12: "cannot allocate memory", 13: "permission denied", 14: "bad address", 15: "block device required", 16: "device or resource busy", 17: "file exists", 18: "invalid cross-device link", 19: "no such device", 20: "not a directory", 21: "is a directory", 22: "invalid argument", 23: "too many open files in system", 24: "too many open files", 25: "inappropriate ioctl for device", 26: "text file busy", 27: "file too large", 28: "no space left on device", 29: "illegal seek", 30: "read-only file system", 31: "too many links", 32: "broken pipe", 33: "numerical argument out of domain", 34: "numerical result out of range", 35: "resource deadlock avoided", 36: "file name too long", 37: "no locks available", 38: "function not implemented", 39: "directory not empty", 40: "too many levels of symbolic links", 42: "no message of desired type", 43: "identifier removed", 44: "channel number out of range", 45: "level 2 not synchronized", 46: "level 3 halted", 47: "level 3 reset", 48: "link number out of range", 49: "protocol driver not attached", 50: "no CSI structure available", 51: "level 2 halted", 52: "invalid exchange", 53: "invalid request descriptor", 54: "exchange full", 55: "no anode", 56: "invalid request code", 57: "invalid slot", 58: "file locking deadlock error", 59: "bad font file format", 60: "device not a stream", 61: "no data available", 62: "timer expired", 63: "out of streams resources", 64: "machine is not on the network", 65: "package not installed", 66: "object is remote", 67: "link has been severed", 68: "advertise error", 69: "srmount error", 70: "communication error on send", 71: "protocol error", 72: "multihop attempted", 73: "RFS specific error", 74: "bad message", 75: "value too large for defined data type", 76: "name not unique on network", 77: "file descriptor in bad state", 78: "remote address changed", 79: "can not access a needed shared library", 80: "accessing a corrupted shared library", 81: ".lib section in a.out corrupted", 82: "attempting to link in too many shared libraries", 83: "cannot exec a shared library directly", 84: "invalid or incomplete multibyte or wide character", 85: "interrupted system call should be restarted", 86: "streams pipe error", 87: "too many users", 88: "socket operation on non-socket", 89: "destination address required", 90: "message too long", 91: "protocol wrong type for socket", 92: "protocol not available", 93: "protocol not supported", 94: "socket type not supported", 95: "operation not supported", 96: "protocol family not supported", 97: "address family not supported by protocol", 98: "address already in use", 99: "cannot assign requested address", 100: "network is down", 101: "network is unreachable", 102: "network dropped connection on reset", 103: "software caused connection abort", 104: "connection reset by peer", 105: "no buffer space available", 106: "transport endpoint is already connected", 107: "transport endpoint is not connected", 108: "cannot send after transport endpoint shutdown", 109: "too many references: cannot splice", 110: "connection timed out", 111: "connection refused", 112: "host is down", 113: "no route to host", 114: "operation already in progress", 115: "operation now in progress", 116: "stale file handle", 117: "structure needs cleaning", 118: "not a XENIX named type file", 119: "no XENIX semaphores available", 120: "is a named type file", 121: "remote I/O error", 122: "disk quota exceeded", 123: "no medium found", 124: "wrong medium type", 125: "operation canceled", 126: "required key not available", 127: "key has expired", 128: "key has been revoked", 129: "key was rejected by service", 130: "owner died", 131: "state not recoverable", 132: "operation not possible due to RF-kill", 133: "memory page has hardware error", } // Signal table var signals = [...]string{ 1: "hangup", 2: "interrupt", 3: "quit", 4: "illegal instruction", 5: "trace/breakpoint trap", 6: "aborted", 7: "bus error", 8: "floating point exception", 9: "killed", 10: "user defined signal 1", 11: "segmentation fault", 12: "user defined signal 2", 13: "broken pipe", 14: "alarm clock", 15: "terminated", 16: "stack fault", 17: "child exited", 18: "continued", 19: "stopped (signal)", 20: "stopped", 21: "stopped (tty input)", 22: "stopped (tty output)", 23: "urgent I/O condition", 24: "CPU time limit exceeded", 25: "file size limit exceeded", 26: "virtual timer expired", 27: "profiling timer expired", 28: "window changed", 29: "I/O possible", 30: "power failure", 31: "bad system call", } ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go ================================================ // mkerrors.sh -Wall -Werror -static -I/tmp/include -fsigned-char // Code generated by the command above; see README.md. DO NOT EDIT. // +build s390x,linux // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char _const.go package unix import "syscall" const ( AF_ALG = 0x26 AF_APPLETALK = 0x5 AF_ASH = 0x12 AF_ATMPVC = 0x8 AF_ATMSVC = 0x14 AF_AX25 = 0x3 AF_BLUETOOTH = 0x1f AF_BRIDGE = 0x7 AF_CAIF = 0x25 AF_CAN = 0x1d AF_DECnet = 0xc AF_ECONET = 0x13 AF_FILE = 0x1 AF_IB = 0x1b AF_IEEE802154 = 0x24 AF_INET = 0x2 AF_INET6 = 0xa AF_IPX = 0x4 AF_IRDA = 0x17 AF_ISDN = 0x22 AF_IUCV = 0x20 AF_KCM = 0x29 AF_KEY = 0xf AF_LLC = 0x1a AF_LOCAL = 0x1 AF_MAX = 0x2c AF_MPLS = 0x1c AF_NETBEUI = 0xd AF_NETLINK = 0x10 AF_NETROM = 0x6 AF_NFC = 0x27 AF_PACKET = 0x11 AF_PHONET = 0x23 AF_PPPOX = 0x18 AF_QIPCRTR = 0x2a AF_RDS = 0x15 AF_ROSE = 0xb AF_ROUTE = 0x10 AF_RXRPC = 0x21 AF_SECURITY = 0xe AF_SMC = 0x2b AF_SNA = 0x16 AF_TIPC = 0x1e AF_UNIX = 0x1 AF_UNSPEC = 0x0 AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 ALG_OP_DECRYPT = 0x0 ALG_OP_ENCRYPT = 0x1 ALG_SET_AEAD_ASSOCLEN = 0x4 ALG_SET_AEAD_AUTHSIZE = 0x5 ALG_SET_IV = 0x2 ALG_SET_KEY = 0x1 ALG_SET_OP = 0x3 ARPHRD_6LOWPAN = 0x339 ARPHRD_ADAPT = 0x108 ARPHRD_APPLETLK = 0x8 ARPHRD_ARCNET = 0x7 ARPHRD_ASH = 0x30d ARPHRD_ATM = 0x13 ARPHRD_AX25 = 0x3 ARPHRD_BIF = 0x307 ARPHRD_CAIF = 0x336 ARPHRD_CAN = 0x118 ARPHRD_CHAOS = 0x5 ARPHRD_CISCO = 0x201 ARPHRD_CSLIP = 0x101 ARPHRD_CSLIP6 = 0x103 ARPHRD_DDCMP = 0x205 ARPHRD_DLCI = 0xf ARPHRD_ECONET = 0x30e ARPHRD_EETHER = 0x2 ARPHRD_ETHER = 0x1 ARPHRD_EUI64 = 0x1b ARPHRD_FCAL = 0x311 ARPHRD_FCFABRIC = 0x313 ARPHRD_FCPL = 0x312 ARPHRD_FCPP = 0x310 ARPHRD_FDDI = 0x306 ARPHRD_FRAD = 0x302 ARPHRD_HDLC = 0x201 ARPHRD_HIPPI = 0x30c ARPHRD_HWX25 = 0x110 ARPHRD_IEEE1394 = 0x18 ARPHRD_IEEE802 = 0x6 ARPHRD_IEEE80211 = 0x321 ARPHRD_IEEE80211_PRISM = 0x322 ARPHRD_IEEE80211_RADIOTAP = 0x323 ARPHRD_IEEE802154 = 0x324 ARPHRD_IEEE802154_MONITOR = 0x325 ARPHRD_IEEE802_TR = 0x320 ARPHRD_INFINIBAND = 0x20 ARPHRD_IP6GRE = 0x337 ARPHRD_IPDDP = 0x309 ARPHRD_IPGRE = 0x30a ARPHRD_IRDA = 0x30f ARPHRD_LAPB = 0x204 ARPHRD_LOCALTLK = 0x305 ARPHRD_LOOPBACK = 0x304 ARPHRD_METRICOM = 0x17 ARPHRD_NETLINK = 0x338 ARPHRD_NETROM = 0x0 ARPHRD_NONE = 0xfffe ARPHRD_PHONET = 0x334 ARPHRD_PHONET_PIPE = 0x335 ARPHRD_PIMREG = 0x30b ARPHRD_PPP = 0x200 ARPHRD_PRONET = 0x4 ARPHRD_RAWHDLC = 0x206 ARPHRD_ROSE = 0x10e ARPHRD_RSRVD = 0x104 ARPHRD_SIT = 0x308 ARPHRD_SKIP = 0x303 ARPHRD_SLIP = 0x100 ARPHRD_SLIP6 = 0x102 ARPHRD_TUNNEL = 0x300 ARPHRD_TUNNEL6 = 0x301 ARPHRD_VOID = 0xffff ARPHRD_VSOCKMON = 0x33a ARPHRD_X25 = 0x10f B0 = 0x0 B1000000 = 0x1008 B110 = 0x3 B115200 = 0x1002 B1152000 = 0x1009 B1200 = 0x9 B134 = 0x4 B150 = 0x5 B1500000 = 0x100a B1800 = 0xa B19200 = 0xe B200 = 0x6 B2000000 = 0x100b B230400 = 0x1003 B2400 = 0xb B2500000 = 0x100c B300 = 0x7 B3000000 = 0x100d B3500000 = 0x100e B38400 = 0xf B4000000 = 0x100f B460800 = 0x1004 B4800 = 0xc B50 = 0x1 B500000 = 0x1005 B57600 = 0x1001 B576000 = 0x1006 B600 = 0x8 B75 = 0x2 B921600 = 0x1007 B9600 = 0xd BLKBSZGET = 0x80081270 BLKBSZSET = 0x40081271 BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80081272 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d BLKRRPART = 0x125f BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 BOTHER = 0x1000 BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALU = 0x4 BPF_AND = 0x50 BPF_B = 0x10 BPF_DIV = 0x30 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 BPF_JA = 0x0 BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 BPF_JMP = 0x5 BPF_JSET = 0x40 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 BPF_LEN = 0x80 BPF_LL_OFF = -0x200000 BPF_LSH = 0x60 BPF_MAJOR_VERSION = 0x1 BPF_MAXINSNS = 0x1000 BPF_MEM = 0x60 BPF_MEMWORDS = 0x10 BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MOD = 0x90 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_NET_OFF = -0x100000 BPF_OR = 0x40 BPF_RET = 0x6 BPF_RSH = 0x70 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 BPF_TAX = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 BPF_XOR = 0xa0 BRKINT = 0x2 BS0 = 0x0 BS1 = 0x2000 BSDLY = 0x2000 CAN_BCM = 0x2 CAN_EFF_FLAG = 0x80000000 CAN_EFF_ID_BITS = 0x1d CAN_EFF_MASK = 0x1fffffff CAN_ERR_FLAG = 0x20000000 CAN_ERR_MASK = 0x1fffffff CAN_INV_FILTER = 0x20000000 CAN_ISOTP = 0x6 CAN_MAX_DLC = 0x8 CAN_MAX_DLEN = 0x8 CAN_MCNET = 0x5 CAN_MTU = 0x10 CAN_NPROTO = 0x7 CAN_RAW = 0x1 CAN_RAW_FILTER_MAX = 0x200 CAN_RTR_FLAG = 0x40000000 CAN_SFF_ID_BITS = 0xb CAN_SFF_MASK = 0x7ff CAN_TP16 = 0x3 CAN_TP20 = 0x4 CBAUD = 0x100f CBAUDEX = 0x1000 CFLUSH = 0xf CIBAUD = 0x100f0000 CLOCAL = 0x800 CLOCK_BOOTTIME = 0x7 CLOCK_BOOTTIME_ALARM = 0x9 CLOCK_DEFAULT = 0x0 CLOCK_EXT = 0x1 CLOCK_INT = 0x2 CLOCK_MONOTONIC = 0x1 CLOCK_MONOTONIC_COARSE = 0x6 CLOCK_MONOTONIC_RAW = 0x4 CLOCK_PROCESS_CPUTIME_ID = 0x2 CLOCK_REALTIME = 0x0 CLOCK_REALTIME_ALARM = 0x8 CLOCK_REALTIME_COARSE = 0x5 CLOCK_TAI = 0xb CLOCK_THREAD_CPUTIME_ID = 0x3 CLOCK_TXFROMRX = 0x4 CLOCK_TXINT = 0x3 CLONE_CHILD_CLEARTID = 0x200000 CLONE_CHILD_SETTID = 0x1000000 CLONE_DETACHED = 0x400000 CLONE_FILES = 0x400 CLONE_FS = 0x200 CLONE_IO = 0x80000000 CLONE_NEWCGROUP = 0x2000000 CLONE_NEWIPC = 0x8000000 CLONE_NEWNET = 0x40000000 CLONE_NEWNS = 0x20000 CLONE_NEWPID = 0x20000000 CLONE_NEWUSER = 0x10000000 CLONE_NEWUTS = 0x4000000 CLONE_PARENT = 0x8000 CLONE_PARENT_SETTID = 0x100000 CLONE_PTRACE = 0x2000 CLONE_SETTLS = 0x80000 CLONE_SIGHAND = 0x800 CLONE_SYSVSEM = 0x40000 CLONE_THREAD = 0x10000 CLONE_UNTRACED = 0x800000 CLONE_VFORK = 0x4000 CLONE_VM = 0x100 CMSPAR = 0x40000000 CR0 = 0x0 CR1 = 0x200 CR2 = 0x400 CR3 = 0x600 CRDLY = 0x600 CREAD = 0x80 CRTSCTS = 0x80000000 CS5 = 0x0 CS6 = 0x10 CS7 = 0x20 CS8 = 0x30 CSIGNAL = 0xff CSIZE = 0x30 CSTART = 0x11 CSTATUS = 0x0 CSTOP = 0x13 CSTOPB = 0x40 CSUSP = 0x1a DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 DT_FIFO = 0x1 DT_LNK = 0xa DT_REG = 0x8 DT_SOCK = 0xc DT_UNKNOWN = 0x0 DT_WHT = 0xe ECHO = 0x8 ECHOCTL = 0x200 ECHOE = 0x10 ECHOK = 0x20 ECHOKE = 0x800 ECHONL = 0x40 ECHOPRT = 0x400 EFD_CLOEXEC = 0x80000 EFD_NONBLOCK = 0x800 EFD_SEMAPHORE = 0x1 ENCODING_DEFAULT = 0x0 ENCODING_FM_MARK = 0x3 ENCODING_FM_SPACE = 0x4 ENCODING_MANCHESTER = 0x5 ENCODING_NRZ = 0x1 ENCODING_NRZI = 0x2 EPOLLERR = 0x8 EPOLLET = 0x80000000 EPOLLEXCLUSIVE = 0x10000000 EPOLLHUP = 0x10 EPOLLIN = 0x1 EPOLLMSG = 0x400 EPOLLONESHOT = 0x40000000 EPOLLOUT = 0x4 EPOLLPRI = 0x2 EPOLLRDBAND = 0x80 EPOLLRDHUP = 0x2000 EPOLLRDNORM = 0x40 EPOLLWAKEUP = 0x20000000 EPOLLWRBAND = 0x200 EPOLLWRNORM = 0x100 EPOLL_CLOEXEC = 0x80000 EPOLL_CTL_ADD = 0x1 EPOLL_CTL_DEL = 0x2 EPOLL_CTL_MOD = 0x3 ETH_P_1588 = 0x88f7 ETH_P_8021AD = 0x88a8 ETH_P_8021AH = 0x88e7 ETH_P_8021Q = 0x8100 ETH_P_80221 = 0x8917 ETH_P_802_2 = 0x4 ETH_P_802_3 = 0x1 ETH_P_802_3_MIN = 0x600 ETH_P_802_EX1 = 0x88b5 ETH_P_AARP = 0x80f3 ETH_P_AF_IUCV = 0xfbfb ETH_P_ALL = 0x3 ETH_P_AOE = 0x88a2 ETH_P_ARCNET = 0x1a ETH_P_ARP = 0x806 ETH_P_ATALK = 0x809b ETH_P_ATMFATE = 0x8884 ETH_P_ATMMPOA = 0x884c ETH_P_AX25 = 0x2 ETH_P_BATMAN = 0x4305 ETH_P_BPQ = 0x8ff ETH_P_CAIF = 0xf7 ETH_P_CAN = 0xc ETH_P_CANFD = 0xd ETH_P_CONTROL = 0x16 ETH_P_CUST = 0x6006 ETH_P_DDCMP = 0x6 ETH_P_DEC = 0x6000 ETH_P_DIAG = 0x6005 ETH_P_DNA_DL = 0x6001 ETH_P_DNA_RC = 0x6002 ETH_P_DNA_RT = 0x6003 ETH_P_DSA = 0x1b ETH_P_ECONET = 0x18 ETH_P_EDSA = 0xdada ETH_P_FCOE = 0x8906 ETH_P_FIP = 0x8914 ETH_P_HDLC = 0x19 ETH_P_HSR = 0x892f ETH_P_IBOE = 0x8915 ETH_P_IEEE802154 = 0xf6 ETH_P_IEEEPUP = 0xa00 ETH_P_IEEEPUPAT = 0xa01 ETH_P_IP = 0x800 ETH_P_IPV6 = 0x86dd ETH_P_IPX = 0x8137 ETH_P_IRDA = 0x17 ETH_P_LAT = 0x6004 ETH_P_LINK_CTL = 0x886c ETH_P_LOCALTALK = 0x9 ETH_P_LOOP = 0x60 ETH_P_LOOPBACK = 0x9000 ETH_P_MACSEC = 0x88e5 ETH_P_MOBITEX = 0x15 ETH_P_MPLS_MC = 0x8848 ETH_P_MPLS_UC = 0x8847 ETH_P_MVRP = 0x88f5 ETH_P_NCSI = 0x88f8 ETH_P_PAE = 0x888e ETH_P_PAUSE = 0x8808 ETH_P_PHONET = 0xf5 ETH_P_PPPTALK = 0x10 ETH_P_PPP_DISC = 0x8863 ETH_P_PPP_MP = 0x8 ETH_P_PPP_SES = 0x8864 ETH_P_PRP = 0x88fb ETH_P_PUP = 0x200 ETH_P_PUPAT = 0x201 ETH_P_QINQ1 = 0x9100 ETH_P_QINQ2 = 0x9200 ETH_P_QINQ3 = 0x9300 ETH_P_RARP = 0x8035 ETH_P_SCA = 0x6007 ETH_P_SLOW = 0x8809 ETH_P_SNAP = 0x5 ETH_P_TDLS = 0x890d ETH_P_TEB = 0x6558 ETH_P_TIPC = 0x88ca ETH_P_TRAILER = 0x1c ETH_P_TR_802_2 = 0x11 ETH_P_TSN = 0x22f0 ETH_P_WAN_PPP = 0x7 ETH_P_WCCP = 0x883e ETH_P_X25 = 0x805 ETH_P_XDSA = 0xf8 EXTA = 0xe EXTB = 0xf EXTPROC = 0x10000 FALLOC_FL_COLLAPSE_RANGE = 0x8 FALLOC_FL_INSERT_RANGE = 0x20 FALLOC_FL_KEEP_SIZE = 0x1 FALLOC_FL_NO_HIDE_STALE = 0x4 FALLOC_FL_PUNCH_HOLE = 0x2 FALLOC_FL_UNSHARE_RANGE = 0x40 FALLOC_FL_ZERO_RANGE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 FF1 = 0x8000 FFDLY = 0x8000 FLUSHO = 0x1000 FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 FS_ENCRYPTION_MODE_INVALID = 0x0 FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 FS_KEY_DESCRIPTOR_SIZE = 0x8 FS_KEY_DESC_PREFIX = "fscrypt:" FS_KEY_DESC_PREFIX_SIZE = 0x8 FS_MAX_KEY_SIZE = 0x40 FS_POLICY_FLAGS_PAD_16 = 0x2 FS_POLICY_FLAGS_PAD_32 = 0x3 FS_POLICY_FLAGS_PAD_4 = 0x0 FS_POLICY_FLAGS_PAD_8 = 0x1 FS_POLICY_FLAGS_PAD_MASK = 0x3 FS_POLICY_FLAGS_VALID = 0x3 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0x406 F_EXLCK = 0x4 F_GETFD = 0x1 F_GETFL = 0x3 F_GETLEASE = 0x401 F_GETLK = 0x5 F_GETLK64 = 0x5 F_GETOWN = 0x9 F_GETOWN_EX = 0x10 F_GETPIPE_SZ = 0x408 F_GETSIG = 0xb F_LOCK = 0x1 F_NOTIFY = 0x402 F_OFD_GETLK = 0x24 F_OFD_SETLK = 0x25 F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 F_SETFD = 0x2 F_SETFL = 0x4 F_SETLEASE = 0x400 F_SETLK = 0x6 F_SETLK64 = 0x6 F_SETLKW = 0x7 F_SETLKW64 = 0x7 F_SETOWN = 0x8 F_SETOWN_EX = 0xf F_SETPIPE_SZ = 0x407 F_SETSIG = 0xa F_SHLCK = 0x8 F_TEST = 0x3 F_TLOCK = 0x2 F_ULOCK = 0x0 F_UNLCK = 0x2 F_WRLCK = 0x1 GENL_ADMIN_PERM = 0x1 GENL_CMD_CAP_DO = 0x2 GENL_CMD_CAP_DUMP = 0x4 GENL_CMD_CAP_HASPOL = 0x8 GENL_HDRLEN = 0x4 GENL_ID_CTRL = 0x10 GENL_ID_PMCRAID = 0x12 GENL_ID_VFS_DQUOT = 0x11 GENL_MAX_ID = 0x3ff GENL_MIN_ID = 0x10 GENL_NAMSIZ = 0x10 GENL_START_ALLOC = 0x13 GENL_UNS_ADMIN_PERM = 0x10 GRND_NONBLOCK = 0x1 GRND_RANDOM = 0x2 HUPCL = 0x400 IBSHIFT = 0x10 ICANON = 0x2 ICMPV6_FILTER = 0x1 ICRNL = 0x100 IEXTEN = 0x8000 IFA_F_DADFAILED = 0x8 IFA_F_DEPRECATED = 0x20 IFA_F_HOMEADDRESS = 0x10 IFA_F_MANAGETEMPADDR = 0x100 IFA_F_MCAUTOJOIN = 0x400 IFA_F_NODAD = 0x2 IFA_F_NOPREFIXROUTE = 0x200 IFA_F_OPTIMISTIC = 0x4 IFA_F_PERMANENT = 0x80 IFA_F_SECONDARY = 0x1 IFA_F_STABLE_PRIVACY = 0x800 IFA_F_TEMPORARY = 0x1 IFA_F_TENTATIVE = 0x40 IFA_MAX = 0x8 IFF_ALLMULTI = 0x200 IFF_ATTACH_QUEUE = 0x200 IFF_AUTOMEDIA = 0x4000 IFF_BROADCAST = 0x2 IFF_DEBUG = 0x4 IFF_DETACH_QUEUE = 0x400 IFF_DORMANT = 0x20000 IFF_DYNAMIC = 0x8000 IFF_ECHO = 0x40000 IFF_LOOPBACK = 0x8 IFF_LOWER_UP = 0x10000 IFF_MASTER = 0x400 IFF_MULTICAST = 0x1000 IFF_MULTI_QUEUE = 0x100 IFF_NOARP = 0x80 IFF_NOFILTER = 0x1000 IFF_NOTRAILERS = 0x20 IFF_NO_PI = 0x1000 IFF_ONE_QUEUE = 0x2000 IFF_PERSIST = 0x800 IFF_POINTOPOINT = 0x10 IFF_PORTSEL = 0x2000 IFF_PROMISC = 0x100 IFF_RUNNING = 0x40 IFF_SLAVE = 0x800 IFF_TAP = 0x2 IFF_TUN = 0x1 IFF_TUN_EXCL = 0x8000 IFF_UP = 0x1 IFF_VNET_HDR = 0x4000 IFF_VOLATILE = 0x70c5a IFNAMSIZ = 0x10 IGNBRK = 0x1 IGNCR = 0x80 IGNPAR = 0x4 IMAXBEL = 0x2000 INLCR = 0x40 INPCK = 0x10 IN_ACCESS = 0x1 IN_ALL_EVENTS = 0xfff IN_ATTRIB = 0x4 IN_CLASSA_HOST = 0xffffff IN_CLASSA_MAX = 0x80 IN_CLASSA_NET = 0xff000000 IN_CLASSA_NSHIFT = 0x18 IN_CLASSB_HOST = 0xffff IN_CLASSB_MAX = 0x10000 IN_CLASSB_NET = 0xffff0000 IN_CLASSB_NSHIFT = 0x10 IN_CLASSC_HOST = 0xff IN_CLASSC_NET = 0xffffff00 IN_CLASSC_NSHIFT = 0x8 IN_CLOEXEC = 0x80000 IN_CLOSE = 0x18 IN_CLOSE_NOWRITE = 0x10 IN_CLOSE_WRITE = 0x8 IN_CREATE = 0x100 IN_DELETE = 0x200 IN_DELETE_SELF = 0x400 IN_DONT_FOLLOW = 0x2000000 IN_EXCL_UNLINK = 0x4000000 IN_IGNORED = 0x8000 IN_ISDIR = 0x40000000 IN_LOOPBACKNET = 0x7f IN_MASK_ADD = 0x20000000 IN_MODIFY = 0x2 IN_MOVE = 0xc0 IN_MOVED_FROM = 0x40 IN_MOVED_TO = 0x80 IN_MOVE_SELF = 0x800 IN_NONBLOCK = 0x800 IN_ONESHOT = 0x80000000 IN_ONLYDIR = 0x1000000 IN_OPEN = 0x20 IN_Q_OVERFLOW = 0x4000 IN_UNMOUNT = 0x2000 IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 IPPROTO_AH = 0x33 IPPROTO_BEETPH = 0x5e IPPROTO_COMP = 0x6c IPPROTO_DCCP = 0x21 IPPROTO_DSTOPTS = 0x3c IPPROTO_EGP = 0x8 IPPROTO_ENCAP = 0x62 IPPROTO_ESP = 0x32 IPPROTO_FRAGMENT = 0x2c IPPROTO_GRE = 0x2f IPPROTO_HOPOPTS = 0x0 IPPROTO_ICMP = 0x1 IPPROTO_ICMPV6 = 0x3a IPPROTO_IDP = 0x16 IPPROTO_IGMP = 0x2 IPPROTO_IP = 0x0 IPPROTO_IPIP = 0x4 IPPROTO_IPV6 = 0x29 IPPROTO_MH = 0x87 IPPROTO_MPLS = 0x89 IPPROTO_MTP = 0x5c IPPROTO_NONE = 0x3b IPPROTO_PIM = 0x67 IPPROTO_PUP = 0xc IPPROTO_RAW = 0xff IPPROTO_ROUTING = 0x2b IPPROTO_RSVP = 0x2e IPPROTO_SCTP = 0x84 IPPROTO_TCP = 0x6 IPPROTO_TP = 0x1d IPPROTO_UDP = 0x11 IPPROTO_UDPLITE = 0x88 IPV6_2292DSTOPTS = 0x4 IPV6_2292HOPLIMIT = 0x8 IPV6_2292HOPOPTS = 0x3 IPV6_2292PKTINFO = 0x2 IPV6_2292PKTOPTIONS = 0x6 IPV6_2292RTHDR = 0x5 IPV6_ADDRFORM = 0x1 IPV6_ADDR_PREFERENCES = 0x48 IPV6_ADD_MEMBERSHIP = 0x14 IPV6_AUTHHDR = 0xa IPV6_AUTOFLOWLABEL = 0x46 IPV6_CHECKSUM = 0x7 IPV6_DONTFRAG = 0x3e IPV6_DROP_MEMBERSHIP = 0x15 IPV6_DSTOPTS = 0x3b IPV6_HDRINCL = 0x24 IPV6_HOPLIMIT = 0x34 IPV6_HOPOPTS = 0x36 IPV6_IPSEC_POLICY = 0x22 IPV6_JOIN_ANYCAST = 0x1b IPV6_JOIN_GROUP = 0x14 IPV6_LEAVE_ANYCAST = 0x1c IPV6_LEAVE_GROUP = 0x15 IPV6_MINHOPCOUNT = 0x49 IPV6_MTU = 0x18 IPV6_MTU_DISCOVER = 0x17 IPV6_MULTICAST_HOPS = 0x12 IPV6_MULTICAST_IF = 0x11 IPV6_MULTICAST_LOOP = 0x13 IPV6_NEXTHOP = 0x9 IPV6_ORIGDSTADDR = 0x4a IPV6_PATHMTU = 0x3d IPV6_PKTINFO = 0x32 IPV6_PMTUDISC_DO = 0x2 IPV6_PMTUDISC_DONT = 0x0 IPV6_PMTUDISC_INTERFACE = 0x4 IPV6_PMTUDISC_OMIT = 0x5 IPV6_PMTUDISC_PROBE = 0x3 IPV6_PMTUDISC_WANT = 0x1 IPV6_RECVDSTOPTS = 0x3a IPV6_RECVERR = 0x19 IPV6_RECVFRAGSIZE = 0x4d IPV6_RECVHOPLIMIT = 0x33 IPV6_RECVHOPOPTS = 0x35 IPV6_RECVORIGDSTADDR = 0x4a IPV6_RECVPATHMTU = 0x3c IPV6_RECVPKTINFO = 0x31 IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 IPV6_RTHDR_STRICT = 0x1 IPV6_RTHDR_TYPE_0 = 0x0 IPV6_RXDSTOPTS = 0x3b IPV6_RXHOPOPTS = 0x36 IPV6_TCLASS = 0x43 IPV6_TRANSPARENT = 0x4b IPV6_UNICAST_HOPS = 0x10 IPV6_UNICAST_IF = 0x4c IPV6_V6ONLY = 0x1a IPV6_XFRM_POLICY = 0x23 IP_ADD_MEMBERSHIP = 0x23 IP_ADD_SOURCE_MEMBERSHIP = 0x27 IP_BIND_ADDRESS_NO_PORT = 0x18 IP_BLOCK_SOURCE = 0x26 IP_CHECKSUM = 0x17 IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 IP_DROP_MEMBERSHIP = 0x24 IP_DROP_SOURCE_MEMBERSHIP = 0x28 IP_FREEBIND = 0xf IP_HDRINCL = 0x3 IP_IPSEC_POLICY = 0x10 IP_MAXPACKET = 0xffff IP_MAX_MEMBERSHIPS = 0x14 IP_MF = 0x2000 IP_MINTTL = 0x15 IP_MSFILTER = 0x29 IP_MSS = 0x240 IP_MTU = 0xe IP_MTU_DISCOVER = 0xa IP_MULTICAST_ALL = 0x31 IP_MULTICAST_IF = 0x20 IP_MULTICAST_LOOP = 0x22 IP_MULTICAST_TTL = 0x21 IP_NODEFRAG = 0x16 IP_OFFMASK = 0x1fff IP_OPTIONS = 0x4 IP_ORIGDSTADDR = 0x14 IP_PASSSEC = 0x12 IP_PKTINFO = 0x8 IP_PKTOPTIONS = 0x9 IP_PMTUDISC = 0xa IP_PMTUDISC_DO = 0x2 IP_PMTUDISC_DONT = 0x0 IP_PMTUDISC_INTERFACE = 0x4 IP_PMTUDISC_OMIT = 0x5 IP_PMTUDISC_PROBE = 0x3 IP_PMTUDISC_WANT = 0x1 IP_RECVERR = 0xb IP_RECVFRAGSIZE = 0x19 IP_RECVOPTS = 0x6 IP_RECVORIGDSTADDR = 0x14 IP_RECVRETOPTS = 0x7 IP_RECVTOS = 0xd IP_RECVTTL = 0xc IP_RETOPTS = 0x7 IP_RF = 0x8000 IP_ROUTER_ALERT = 0x5 IP_TOS = 0x1 IP_TRANSPARENT = 0x13 IP_TTL = 0x2 IP_UNBLOCK_SOURCE = 0x25 IP_UNICAST_IF = 0x32 IP_XFRM_POLICY = 0x11 ISIG = 0x1 ISTRIP = 0x20 IUCLC = 0x200 IUTF8 = 0x4000 IXANY = 0x800 IXOFF = 0x1000 IXON = 0x400 KEYCTL_ASSUME_AUTHORITY = 0x10 KEYCTL_CHOWN = 0x4 KEYCTL_CLEAR = 0x7 KEYCTL_DESCRIBE = 0x6 KEYCTL_DH_COMPUTE = 0x17 KEYCTL_GET_KEYRING_ID = 0x0 KEYCTL_GET_PERSISTENT = 0x16 KEYCTL_GET_SECURITY = 0x11 KEYCTL_INSTANTIATE = 0xc KEYCTL_INSTANTIATE_IOV = 0x14 KEYCTL_INVALIDATE = 0x15 KEYCTL_JOIN_SESSION_KEYRING = 0x1 KEYCTL_LINK = 0x8 KEYCTL_NEGATE = 0xd KEYCTL_READ = 0xb KEYCTL_REJECT = 0x13 KEYCTL_RESTRICT_KEYRING = 0x1d KEYCTL_REVOKE = 0x3 KEYCTL_SEARCH = 0xa KEYCTL_SESSION_TO_PARENT = 0x12 KEYCTL_SETPERM = 0x5 KEYCTL_SET_REQKEY_KEYRING = 0xe KEYCTL_SET_TIMEOUT = 0xf KEYCTL_UNLINK = 0x9 KEYCTL_UPDATE = 0x2 KEY_REQKEY_DEFL_DEFAULT = 0x0 KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 KEY_REQKEY_DEFL_NO_CHANGE = -0x1 KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 KEY_REQKEY_DEFL_USER_KEYRING = 0x4 KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 KEY_SPEC_GROUP_KEYRING = -0x6 KEY_SPEC_PROCESS_KEYRING = -0x2 KEY_SPEC_REQKEY_AUTH_KEY = -0x7 KEY_SPEC_REQUESTOR_KEYRING = -0x8 KEY_SPEC_SESSION_KEYRING = -0x3 KEY_SPEC_THREAD_KEYRING = -0x1 KEY_SPEC_USER_KEYRING = -0x4 KEY_SPEC_USER_SESSION_KEYRING = -0x5 LINUX_REBOOT_CMD_CAD_OFF = 0x0 LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef LINUX_REBOOT_CMD_HALT = 0xcdef0123 LINUX_REBOOT_CMD_KEXEC = 0x45584543 LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc LINUX_REBOOT_CMD_RESTART = 0x1234567 LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 LINUX_REBOOT_MAGIC1 = 0xfee1dead LINUX_REBOOT_MAGIC2 = 0x28121969 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 MADV_DONTFORK = 0xa MADV_DONTNEED = 0x4 MADV_FREE = 0x8 MADV_HUGEPAGE = 0xe MADV_HWPOISON = 0x64 MADV_MERGEABLE = 0xc MADV_NOHUGEPAGE = 0xf MADV_NORMAL = 0x0 MADV_RANDOM = 0x1 MADV_REMOVE = 0x9 MADV_SEQUENTIAL = 0x2 MADV_UNMERGEABLE = 0xd MADV_WILLNEED = 0x3 MAP_ANON = 0x20 MAP_ANONYMOUS = 0x20 MAP_DENYWRITE = 0x800 MAP_EXECUTABLE = 0x1000 MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_GROWSDOWN = 0x100 MAP_HUGETLB = 0x40000 MAP_HUGE_MASK = 0x3f MAP_HUGE_SHIFT = 0x1a MAP_LOCKED = 0x2000 MAP_NONBLOCK = 0x10000 MAP_NORESERVE = 0x4000 MAP_POPULATE = 0x8000 MAP_PRIVATE = 0x2 MAP_SHARED = 0x1 MAP_STACK = 0x20000 MAP_TYPE = 0xf MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MCL_ONFAULT = 0x4 MNT_DETACH = 0x2 MNT_EXPIRE = 0x4 MNT_FORCE = 0x1 MSG_BATCH = 0x40000 MSG_CMSG_CLOEXEC = 0x40000000 MSG_CONFIRM = 0x800 MSG_CTRUNC = 0x8 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x40 MSG_EOR = 0x80 MSG_ERRQUEUE = 0x2000 MSG_FASTOPEN = 0x20000000 MSG_FIN = 0x200 MSG_MORE = 0x8000 MSG_NOSIGNAL = 0x4000 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_PROXY = 0x10 MSG_RST = 0x1000 MSG_SYN = 0x400 MSG_TRUNC = 0x20 MSG_TRYHARD = 0x4 MSG_WAITALL = 0x100 MSG_WAITFORONE = 0x10000 MS_ACTIVE = 0x40000000 MS_ASYNC = 0x1 MS_BIND = 0x1000 MS_BORN = 0x20000000 MS_DIRSYNC = 0x80 MS_INVALIDATE = 0x2 MS_I_VERSION = 0x800000 MS_KERNMOUNT = 0x400000 MS_LAZYTIME = 0x2000000 MS_MANDLOCK = 0x40 MS_MGC_MSK = 0xffff0000 MS_MGC_VAL = 0xc0ed0000 MS_MOVE = 0x2000 MS_NOATIME = 0x400 MS_NODEV = 0x4 MS_NODIRATIME = 0x800 MS_NOEXEC = 0x8 MS_NOREMOTELOCK = 0x8000000 MS_NOSEC = 0x10000000 MS_NOSUID = 0x2 MS_NOUSER = -0x80000000 MS_POSIXACL = 0x10000 MS_PRIVATE = 0x40000 MS_RDONLY = 0x1 MS_REC = 0x4000 MS_RELATIME = 0x200000 MS_REMOUNT = 0x20 MS_RMT_MASK = 0x2800051 MS_SHARED = 0x100000 MS_SILENT = 0x8000 MS_SLAVE = 0x80000 MS_STRICTATIME = 0x1000000 MS_SUBMOUNT = 0x4000000 MS_SYNC = 0x4 MS_SYNCHRONOUS = 0x10 MS_UNBINDABLE = 0x20000 MS_VERBOSE = 0x8000 NAME_MAX = 0xff NETLINK_ADD_MEMBERSHIP = 0x1 NETLINK_AUDIT = 0x9 NETLINK_BROADCAST_ERROR = 0x4 NETLINK_CAP_ACK = 0xa NETLINK_CONNECTOR = 0xb NETLINK_CRYPTO = 0x15 NETLINK_DNRTMSG = 0xe NETLINK_DROP_MEMBERSHIP = 0x2 NETLINK_ECRYPTFS = 0x13 NETLINK_EXT_ACK = 0xb NETLINK_FIB_LOOKUP = 0xa NETLINK_FIREWALL = 0x3 NETLINK_GENERIC = 0x10 NETLINK_INET_DIAG = 0x4 NETLINK_IP6_FW = 0xd NETLINK_ISCSI = 0x8 NETLINK_KOBJECT_UEVENT = 0xf NETLINK_LISTEN_ALL_NSID = 0x8 NETLINK_LIST_MEMBERSHIPS = 0x9 NETLINK_NETFILTER = 0xc NETLINK_NFLOG = 0x5 NETLINK_NO_ENOBUFS = 0x5 NETLINK_PKTINFO = 0x3 NETLINK_RDMA = 0x14 NETLINK_ROUTE = 0x0 NETLINK_RX_RING = 0x6 NETLINK_SCSITRANSPORT = 0x12 NETLINK_SELINUX = 0x7 NETLINK_SMC = 0x16 NETLINK_SOCK_DIAG = 0x4 NETLINK_TX_RING = 0x7 NETLINK_UNUSED = 0x1 NETLINK_USERSOCK = 0x2 NETLINK_XFRM = 0x6 NL0 = 0x0 NL1 = 0x100 NLA_ALIGNTO = 0x4 NLA_F_NESTED = 0x8000 NLA_F_NET_BYTEORDER = 0x4000 NLA_HDRLEN = 0x4 NLDLY = 0x100 NLMSG_ALIGNTO = 0x4 NLMSG_DONE = 0x3 NLMSG_ERROR = 0x2 NLMSG_HDRLEN = 0x10 NLMSG_MIN_TYPE = 0x10 NLMSG_NOOP = 0x1 NLMSG_OVERRUN = 0x4 NLM_F_ACK = 0x4 NLM_F_ACK_TLVS = 0x200 NLM_F_APPEND = 0x800 NLM_F_ATOMIC = 0x400 NLM_F_CAPPED = 0x100 NLM_F_CREATE = 0x400 NLM_F_DUMP = 0x300 NLM_F_DUMP_FILTERED = 0x20 NLM_F_DUMP_INTR = 0x10 NLM_F_ECHO = 0x8 NLM_F_EXCL = 0x200 NLM_F_MATCH = 0x200 NLM_F_MULTI = 0x2 NLM_F_REPLACE = 0x100 NLM_F_REQUEST = 0x1 NLM_F_ROOT = 0x100 NOFLSH = 0x80 OCRNL = 0x8 OFDEL = 0x80 OFILL = 0x40 OLCUC = 0x2 ONLCR = 0x4 ONLRET = 0x20 ONOCR = 0x10 OPOST = 0x1 O_ACCMODE = 0x3 O_APPEND = 0x400 O_ASYNC = 0x2000 O_CLOEXEC = 0x80000 O_CREAT = 0x40 O_DIRECT = 0x4000 O_DIRECTORY = 0x10000 O_DSYNC = 0x1000 O_EXCL = 0x80 O_FSYNC = 0x101000 O_LARGEFILE = 0x0 O_NDELAY = 0x800 O_NOATIME = 0x40000 O_NOCTTY = 0x100 O_NOFOLLOW = 0x20000 O_NONBLOCK = 0x800 O_PATH = 0x200000 O_RDONLY = 0x0 O_RDWR = 0x2 O_RSYNC = 0x101000 O_SYNC = 0x101000 O_TMPFILE = 0x410000 O_TRUNC = 0x200 O_WRONLY = 0x1 PACKET_ADD_MEMBERSHIP = 0x1 PACKET_AUXDATA = 0x8 PACKET_BROADCAST = 0x1 PACKET_COPY_THRESH = 0x7 PACKET_DROP_MEMBERSHIP = 0x2 PACKET_FANOUT = 0x12 PACKET_FANOUT_CBPF = 0x6 PACKET_FANOUT_CPU = 0x2 PACKET_FANOUT_DATA = 0x16 PACKET_FANOUT_EBPF = 0x7 PACKET_FANOUT_FLAG_DEFRAG = 0x8000 PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 PACKET_FANOUT_HASH = 0x0 PACKET_FANOUT_LB = 0x1 PACKET_FANOUT_QM = 0x5 PACKET_FANOUT_RND = 0x4 PACKET_FANOUT_ROLLOVER = 0x3 PACKET_FASTROUTE = 0x6 PACKET_HDRLEN = 0xb PACKET_HOST = 0x0 PACKET_KERNEL = 0x7 PACKET_LOOPBACK = 0x5 PACKET_LOSS = 0xe PACKET_MR_ALLMULTI = 0x2 PACKET_MR_MULTICAST = 0x0 PACKET_MR_PROMISC = 0x1 PACKET_MR_UNICAST = 0x3 PACKET_MULTICAST = 0x2 PACKET_ORIGDEV = 0x9 PACKET_OTHERHOST = 0x3 PACKET_OUTGOING = 0x4 PACKET_QDISC_BYPASS = 0x14 PACKET_RECV_OUTPUT = 0x3 PACKET_RESERVE = 0xc PACKET_ROLLOVER_STATS = 0x15 PACKET_RX_RING = 0x5 PACKET_STATISTICS = 0x6 PACKET_TIMESTAMP = 0x11 PACKET_TX_HAS_OFF = 0x13 PACKET_TX_RING = 0xd PACKET_TX_TIMESTAMP = 0x10 PACKET_USER = 0x6 PACKET_VERSION = 0xa PACKET_VNET_HDR = 0xf PARENB = 0x100 PARITY_CRC16_PR0 = 0x2 PARITY_CRC16_PR0_CCITT = 0x4 PARITY_CRC16_PR1 = 0x3 PARITY_CRC16_PR1_CCITT = 0x5 PARITY_CRC32_PR0_CCITT = 0x6 PARITY_CRC32_PR1_CCITT = 0x7 PARITY_DEFAULT = 0x0 PARITY_NONE = 0x1 PARMRK = 0x8 PARODD = 0x200 PENDIN = 0x4000 PERF_EVENT_IOC_DISABLE = 0x2401 PERF_EVENT_IOC_ENABLE = 0x2400 PERF_EVENT_IOC_ID = 0x80082407 PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 PERF_EVENT_IOC_PERIOD = 0x40082404 PERF_EVENT_IOC_REFRESH = 0x2402 PERF_EVENT_IOC_RESET = 0x2403 PERF_EVENT_IOC_SET_BPF = 0x40042408 PERF_EVENT_IOC_SET_FILTER = 0x40082406 PERF_EVENT_IOC_SET_OUTPUT = 0x2405 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 PROT_EXEC = 0x4 PROT_GROWSDOWN = 0x1000000 PROT_GROWSUP = 0x2000000 PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 PR_CAPBSET_DROP = 0x18 PR_CAPBSET_READ = 0x17 PR_CAP_AMBIENT = 0x2f PR_CAP_AMBIENT_CLEAR_ALL = 0x4 PR_CAP_AMBIENT_IS_SET = 0x1 PR_CAP_AMBIENT_LOWER = 0x3 PR_CAP_AMBIENT_RAISE = 0x2 PR_ENDIAN_BIG = 0x0 PR_ENDIAN_LITTLE = 0x1 PR_ENDIAN_PPC_LITTLE = 0x2 PR_FPEMU_NOPRINT = 0x1 PR_FPEMU_SIGFPE = 0x2 PR_FP_EXC_ASYNC = 0x2 PR_FP_EXC_DISABLED = 0x0 PR_FP_EXC_DIV = 0x10000 PR_FP_EXC_INV = 0x100000 PR_FP_EXC_NONRECOV = 0x1 PR_FP_EXC_OVF = 0x20000 PR_FP_EXC_PRECISE = 0x3 PR_FP_EXC_RES = 0x80000 PR_FP_EXC_SW_ENABLE = 0x80 PR_FP_EXC_UND = 0x40000 PR_FP_MODE_FR = 0x1 PR_FP_MODE_FRE = 0x2 PR_GET_CHILD_SUBREAPER = 0x25 PR_GET_DUMPABLE = 0x3 PR_GET_ENDIAN = 0x13 PR_GET_FPEMU = 0x9 PR_GET_FPEXC = 0xb PR_GET_FP_MODE = 0x2e PR_GET_KEEPCAPS = 0x7 PR_GET_NAME = 0x10 PR_GET_NO_NEW_PRIVS = 0x27 PR_GET_PDEATHSIG = 0x2 PR_GET_SECCOMP = 0x15 PR_GET_SECUREBITS = 0x1b PR_GET_THP_DISABLE = 0x2a PR_GET_TID_ADDRESS = 0x28 PR_GET_TIMERSLACK = 0x1e PR_GET_TIMING = 0xd PR_GET_TSC = 0x19 PR_GET_UNALIGN = 0x5 PR_MCE_KILL = 0x21 PR_MCE_KILL_CLEAR = 0x0 PR_MCE_KILL_DEFAULT = 0x2 PR_MCE_KILL_EARLY = 0x1 PR_MCE_KILL_GET = 0x22 PR_MCE_KILL_LATE = 0x0 PR_MCE_KILL_SET = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b PR_SET_CHILD_SUBREAPER = 0x24 PR_SET_DUMPABLE = 0x4 PR_SET_ENDIAN = 0x14 PR_SET_FPEMU = 0xa PR_SET_FPEXC = 0xc PR_SET_FP_MODE = 0x2d PR_SET_KEEPCAPS = 0x8 PR_SET_MM = 0x23 PR_SET_MM_ARG_END = 0x9 PR_SET_MM_ARG_START = 0x8 PR_SET_MM_AUXV = 0xc PR_SET_MM_BRK = 0x7 PR_SET_MM_END_CODE = 0x2 PR_SET_MM_END_DATA = 0x4 PR_SET_MM_ENV_END = 0xb PR_SET_MM_ENV_START = 0xa PR_SET_MM_EXE_FILE = 0xd PR_SET_MM_MAP = 0xe PR_SET_MM_MAP_SIZE = 0xf PR_SET_MM_START_BRK = 0x6 PR_SET_MM_START_CODE = 0x1 PR_SET_MM_START_DATA = 0x3 PR_SET_MM_START_STACK = 0x5 PR_SET_NAME = 0xf PR_SET_NO_NEW_PRIVS = 0x26 PR_SET_PDEATHSIG = 0x1 PR_SET_PTRACER = 0x59616d61 PR_SET_PTRACER_ANY = 0xffffffffffffffff PR_SET_SECCOMP = 0x16 PR_SET_SECUREBITS = 0x1c PR_SET_THP_DISABLE = 0x29 PR_SET_TIMERSLACK = 0x1d PR_SET_TIMING = 0xe PR_SET_TSC = 0x1a PR_SET_UNALIGN = 0x6 PR_TASK_PERF_EVENTS_DISABLE = 0x1f PR_TASK_PERF_EVENTS_ENABLE = 0x20 PR_TIMING_STATISTICAL = 0x0 PR_TIMING_TIMESTAMP = 0x1 PR_TSC_ENABLE = 0x1 PR_TSC_SIGSEGV = 0x2 PR_UNALIGN_NOPRINT = 0x1 PR_UNALIGN_SIGBUS = 0x2 PTRACE_ATTACH = 0x10 PTRACE_CONT = 0x7 PTRACE_DETACH = 0x11 PTRACE_DISABLE_TE = 0x5010 PTRACE_ENABLE_TE = 0x5009 PTRACE_EVENT_CLONE = 0x3 PTRACE_EVENT_EXEC = 0x4 PTRACE_EVENT_EXIT = 0x6 PTRACE_EVENT_FORK = 0x1 PTRACE_EVENT_SECCOMP = 0x7 PTRACE_EVENT_STOP = 0x80 PTRACE_EVENT_VFORK = 0x2 PTRACE_EVENT_VFORK_DONE = 0x5 PTRACE_GETEVENTMSG = 0x4201 PTRACE_GETREGS = 0xc PTRACE_GETREGSET = 0x4204 PTRACE_GETSIGINFO = 0x4202 PTRACE_GETSIGMASK = 0x420a PTRACE_GET_LAST_BREAK = 0x5006 PTRACE_INTERRUPT = 0x4207 PTRACE_KILL = 0x8 PTRACE_LISTEN = 0x4208 PTRACE_OLDSETOPTIONS = 0x15 PTRACE_O_EXITKILL = 0x100000 PTRACE_O_MASK = 0x3000ff PTRACE_O_SUSPEND_SECCOMP = 0x200000 PTRACE_O_TRACECLONE = 0x8 PTRACE_O_TRACEEXEC = 0x10 PTRACE_O_TRACEEXIT = 0x40 PTRACE_O_TRACEFORK = 0x2 PTRACE_O_TRACESECCOMP = 0x80 PTRACE_O_TRACESYSGOOD = 0x1 PTRACE_O_TRACEVFORK = 0x4 PTRACE_O_TRACEVFORKDONE = 0x20 PTRACE_PEEKDATA = 0x2 PTRACE_PEEKDATA_AREA = 0x5003 PTRACE_PEEKSIGINFO = 0x4209 PTRACE_PEEKSIGINFO_SHARED = 0x1 PTRACE_PEEKTEXT = 0x1 PTRACE_PEEKTEXT_AREA = 0x5002 PTRACE_PEEKUSR = 0x3 PTRACE_PEEKUSR_AREA = 0x5000 PTRACE_PEEK_SYSTEM_CALL = 0x5007 PTRACE_POKEDATA = 0x5 PTRACE_POKEDATA_AREA = 0x5005 PTRACE_POKETEXT = 0x4 PTRACE_POKETEXT_AREA = 0x5004 PTRACE_POKEUSR = 0x6 PTRACE_POKEUSR_AREA = 0x5001 PTRACE_POKE_SYSTEM_CALL = 0x5008 PTRACE_PROT = 0x15 PTRACE_SECCOMP_GET_FILTER = 0x420c PTRACE_SEIZE = 0x4206 PTRACE_SETOPTIONS = 0x4200 PTRACE_SETREGS = 0xd PTRACE_SETREGSET = 0x4205 PTRACE_SETSIGINFO = 0x4203 PTRACE_SETSIGMASK = 0x420b PTRACE_SINGLEBLOCK = 0xc PTRACE_SINGLESTEP = 0x9 PTRACE_SYSCALL = 0x18 PTRACE_TE_ABORT_RAND = 0x5011 PTRACE_TRACEME = 0x0 PT_ACR0 = 0x90 PT_ACR1 = 0x94 PT_ACR10 = 0xb8 PT_ACR11 = 0xbc PT_ACR12 = 0xc0 PT_ACR13 = 0xc4 PT_ACR14 = 0xc8 PT_ACR15 = 0xcc PT_ACR2 = 0x98 PT_ACR3 = 0x9c PT_ACR4 = 0xa0 PT_ACR5 = 0xa4 PT_ACR6 = 0xa8 PT_ACR7 = 0xac PT_ACR8 = 0xb0 PT_ACR9 = 0xb4 PT_CR_10 = 0x168 PT_CR_11 = 0x170 PT_CR_9 = 0x160 PT_ENDREGS = 0x1af PT_FPC = 0xd8 PT_FPR0 = 0xe0 PT_FPR1 = 0xe8 PT_FPR10 = 0x130 PT_FPR11 = 0x138 PT_FPR12 = 0x140 PT_FPR13 = 0x148 PT_FPR14 = 0x150 PT_FPR15 = 0x158 PT_FPR2 = 0xf0 PT_FPR3 = 0xf8 PT_FPR4 = 0x100 PT_FPR5 = 0x108 PT_FPR6 = 0x110 PT_FPR7 = 0x118 PT_FPR8 = 0x120 PT_FPR9 = 0x128 PT_GPR0 = 0x10 PT_GPR1 = 0x18 PT_GPR10 = 0x60 PT_GPR11 = 0x68 PT_GPR12 = 0x70 PT_GPR13 = 0x78 PT_GPR14 = 0x80 PT_GPR15 = 0x88 PT_GPR2 = 0x20 PT_GPR3 = 0x28 PT_GPR4 = 0x30 PT_GPR5 = 0x38 PT_GPR6 = 0x40 PT_GPR7 = 0x48 PT_GPR8 = 0x50 PT_GPR9 = 0x58 PT_IEEE_IP = 0x1a8 PT_LASTOFF = 0x1a8 PT_ORIGGPR2 = 0xd0 PT_PSWADDR = 0x8 PT_PSWMASK = 0x0 RLIMIT_AS = 0x9 RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 RLIMIT_LOCKS = 0xa RLIMIT_MEMLOCK = 0x8 RLIMIT_MSGQUEUE = 0xc RLIMIT_NICE = 0xd RLIMIT_NOFILE = 0x7 RLIMIT_NPROC = 0x6 RLIMIT_RSS = 0x5 RLIMIT_RTPRIO = 0xe RLIMIT_RTTIME = 0xf RLIMIT_SIGPENDING = 0xb RLIMIT_STACK = 0x3 RLIM_INFINITY = 0xffffffffffffffff RTAX_ADVMSS = 0x8 RTAX_CC_ALGO = 0x10 RTAX_CWND = 0x7 RTAX_FEATURES = 0xc RTAX_FEATURE_ALLFRAG = 0x8 RTAX_FEATURE_ECN = 0x1 RTAX_FEATURE_MASK = 0xf RTAX_FEATURE_SACK = 0x2 RTAX_FEATURE_TIMESTAMP = 0x4 RTAX_HOPLIMIT = 0xa RTAX_INITCWND = 0xb RTAX_INITRWND = 0xe RTAX_LOCK = 0x1 RTAX_MAX = 0x10 RTAX_MTU = 0x2 RTAX_QUICKACK = 0xf RTAX_REORDERING = 0x9 RTAX_RTO_MIN = 0xd RTAX_RTT = 0x4 RTAX_RTTVAR = 0x5 RTAX_SSTHRESH = 0x6 RTAX_UNSPEC = 0x0 RTAX_WINDOW = 0x3 RTA_ALIGNTO = 0x4 RTA_MAX = 0x1a RTCF_DIRECTSRC = 0x4000000 RTCF_DOREDIRECT = 0x1000000 RTCF_LOG = 0x2000000 RTCF_MASQ = 0x400000 RTCF_NAT = 0x800000 RTCF_VALVE = 0x200000 RTF_ADDRCLASSMASK = 0xf8000000 RTF_ADDRCONF = 0x40000 RTF_ALLONLINK = 0x20000 RTF_BROADCAST = 0x10000000 RTF_CACHE = 0x1000000 RTF_DEFAULT = 0x10000 RTF_DYNAMIC = 0x10 RTF_FLOW = 0x2000000 RTF_GATEWAY = 0x2 RTF_HOST = 0x4 RTF_INTERFACE = 0x40000000 RTF_IRTT = 0x100 RTF_LINKRT = 0x100000 RTF_LOCAL = 0x80000000 RTF_MODIFIED = 0x20 RTF_MSS = 0x40 RTF_MTU = 0x40 RTF_MULTICAST = 0x20000000 RTF_NAT = 0x8000000 RTF_NOFORWARD = 0x1000 RTF_NONEXTHOP = 0x200000 RTF_NOPMTUDISC = 0x4000 RTF_POLICY = 0x4000000 RTF_REINSTATE = 0x8 RTF_REJECT = 0x200 RTF_STATIC = 0x400 RTF_THROW = 0x2000 RTF_UP = 0x1 RTF_WINDOW = 0x80 RTF_XRESOLVE = 0x800 RTM_BASE = 0x10 RTM_DELACTION = 0x31 RTM_DELADDR = 0x15 RTM_DELADDRLABEL = 0x49 RTM_DELLINK = 0x11 RTM_DELMDB = 0x55 RTM_DELNEIGH = 0x1d RTM_DELNETCONF = 0x51 RTM_DELNSID = 0x59 RTM_DELQDISC = 0x25 RTM_DELROUTE = 0x19 RTM_DELRULE = 0x21 RTM_DELTCLASS = 0x29 RTM_DELTFILTER = 0x2d RTM_F_CLONED = 0x200 RTM_F_EQUALIZE = 0x400 RTM_F_FIB_MATCH = 0x2000 RTM_F_LOOKUP_TABLE = 0x1000 RTM_F_NOTIFY = 0x100 RTM_F_PREFIX = 0x800 RTM_GETACTION = 0x32 RTM_GETADDR = 0x16 RTM_GETADDRLABEL = 0x4a RTM_GETANYCAST = 0x3e RTM_GETDCB = 0x4e RTM_GETLINK = 0x12 RTM_GETMDB = 0x56 RTM_GETMULTICAST = 0x3a RTM_GETNEIGH = 0x1e RTM_GETNEIGHTBL = 0x42 RTM_GETNETCONF = 0x52 RTM_GETNSID = 0x5a RTM_GETQDISC = 0x26 RTM_GETROUTE = 0x1a RTM_GETRULE = 0x22 RTM_GETSTATS = 0x5e RTM_GETTCLASS = 0x2a RTM_GETTFILTER = 0x2e RTM_MAX = 0x63 RTM_NEWACTION = 0x30 RTM_NEWADDR = 0x14 RTM_NEWADDRLABEL = 0x48 RTM_NEWCACHEREPORT = 0x60 RTM_NEWLINK = 0x10 RTM_NEWMDB = 0x54 RTM_NEWNDUSEROPT = 0x44 RTM_NEWNEIGH = 0x1c RTM_NEWNEIGHTBL = 0x40 RTM_NEWNETCONF = 0x50 RTM_NEWNSID = 0x58 RTM_NEWPREFIX = 0x34 RTM_NEWQDISC = 0x24 RTM_NEWROUTE = 0x18 RTM_NEWRULE = 0x20 RTM_NEWSTATS = 0x5c RTM_NEWTCLASS = 0x28 RTM_NEWTFILTER = 0x2c RTM_NR_FAMILIES = 0x15 RTM_NR_MSGTYPES = 0x54 RTM_SETDCB = 0x4f RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 RTNH_ALIGNTO = 0x4 RTNH_COMPARE_MASK = 0x19 RTNH_F_DEAD = 0x1 RTNH_F_LINKDOWN = 0x10 RTNH_F_OFFLOAD = 0x8 RTNH_F_ONLINK = 0x4 RTNH_F_PERVASIVE = 0x2 RTNH_F_UNRESOLVED = 0x20 RTN_MAX = 0xb RTPROT_BABEL = 0x2a RTPROT_BIRD = 0xc RTPROT_BOOT = 0x3 RTPROT_DHCP = 0x10 RTPROT_DNROUTED = 0xd RTPROT_GATED = 0x8 RTPROT_KERNEL = 0x2 RTPROT_MROUTED = 0x11 RTPROT_MRT = 0xa RTPROT_NTK = 0xf RTPROT_RA = 0x9 RTPROT_REDIRECT = 0x1 RTPROT_STATIC = 0x4 RTPROT_UNSPEC = 0x0 RTPROT_XORP = 0xe RTPROT_ZEBRA = 0xb RT_CLASS_DEFAULT = 0xfd RT_CLASS_LOCAL = 0xff RT_CLASS_MAIN = 0xfe RT_CLASS_MAX = 0xff RT_CLASS_UNSPEC = 0x0 RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 RUSAGE_THREAD = 0x1 SCM_CREDENTIALS = 0x2 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x1d SCM_TIMESTAMPING = 0x25 SCM_TIMESTAMPING_OPT_STATS = 0x36 SCM_TIMESTAMPING_PKTINFO = 0x3a SCM_TIMESTAMPNS = 0x23 SCM_WIFI_STATUS = 0x29 SECCOMP_MODE_DISABLED = 0x0 SECCOMP_MODE_FILTER = 0x2 SECCOMP_MODE_STRICT = 0x1 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 SIOCADDDLCI = 0x8980 SIOCADDMULTI = 0x8931 SIOCADDRT = 0x890b SIOCATMARK = 0x8905 SIOCBONDCHANGEACTIVE = 0x8995 SIOCBONDENSLAVE = 0x8990 SIOCBONDINFOQUERY = 0x8994 SIOCBONDRELEASE = 0x8991 SIOCBONDSETHWADDR = 0x8992 SIOCBONDSLAVEINFOQUERY = 0x8993 SIOCBRADDBR = 0x89a0 SIOCBRADDIF = 0x89a2 SIOCBRDELBR = 0x89a1 SIOCBRDELIF = 0x89a3 SIOCDARP = 0x8953 SIOCDELDLCI = 0x8981 SIOCDELMULTI = 0x8932 SIOCDELRT = 0x890c SIOCDEVPRIVATE = 0x89f0 SIOCDIFADDR = 0x8936 SIOCDRARP = 0x8960 SIOCETHTOOL = 0x8946 SIOCGARP = 0x8954 SIOCGHWTSTAMP = 0x89b1 SIOCGIFADDR = 0x8915 SIOCGIFBR = 0x8940 SIOCGIFBRDADDR = 0x8919 SIOCGIFCONF = 0x8912 SIOCGIFCOUNT = 0x8938 SIOCGIFDSTADDR = 0x8917 SIOCGIFENCAP = 0x8925 SIOCGIFFLAGS = 0x8913 SIOCGIFHWADDR = 0x8927 SIOCGIFINDEX = 0x8933 SIOCGIFMAP = 0x8970 SIOCGIFMEM = 0x891f SIOCGIFMETRIC = 0x891d SIOCGIFMTU = 0x8921 SIOCGIFNAME = 0x8910 SIOCGIFNETMASK = 0x891b SIOCGIFPFLAGS = 0x8935 SIOCGIFSLAVE = 0x8929 SIOCGIFTXQLEN = 0x8942 SIOCGIFVLAN = 0x8982 SIOCGMIIPHY = 0x8947 SIOCGMIIREG = 0x8948 SIOCGPGRP = 0x8904 SIOCGRARP = 0x8961 SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 SIOCGSTAMPNS = 0x8907 SIOCINQ = 0x541b SIOCOUTQ = 0x5411 SIOCOUTQNSD = 0x894b SIOCPROTOPRIVATE = 0x89e0 SIOCRTMSG = 0x890d SIOCSARP = 0x8955 SIOCSHWTSTAMP = 0x89b0 SIOCSIFADDR = 0x8916 SIOCSIFBR = 0x8941 SIOCSIFBRDADDR = 0x891a SIOCSIFDSTADDR = 0x8918 SIOCSIFENCAP = 0x8926 SIOCSIFFLAGS = 0x8914 SIOCSIFHWADDR = 0x8924 SIOCSIFHWBROADCAST = 0x8937 SIOCSIFLINK = 0x8911 SIOCSIFMAP = 0x8971 SIOCSIFMEM = 0x8920 SIOCSIFMETRIC = 0x891e SIOCSIFMTU = 0x8922 SIOCSIFNAME = 0x8923 SIOCSIFNETMASK = 0x891c SIOCSIFPFLAGS = 0x8934 SIOCSIFSLAVE = 0x8930 SIOCSIFTXQLEN = 0x8943 SIOCSIFVLAN = 0x8983 SIOCSMIIREG = 0x8949 SIOCSPGRP = 0x8902 SIOCSRARP = 0x8962 SIOCWANDEV = 0x894a SOCK_CLOEXEC = 0x80000 SOCK_DCCP = 0x6 SOCK_DGRAM = 0x2 SOCK_IOC_TYPE = 0x89 SOCK_NONBLOCK = 0x800 SOCK_PACKET = 0xa SOCK_RAW = 0x3 SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x1 SOL_AAL = 0x109 SOL_ALG = 0x117 SOL_ATM = 0x108 SOL_CAIF = 0x116 SOL_CAN_BASE = 0x64 SOL_DCCP = 0x10d SOL_DECNET = 0x105 SOL_ICMPV6 = 0x3a SOL_IP = 0x0 SOL_IPV6 = 0x29 SOL_IRDA = 0x10a SOL_IUCV = 0x115 SOL_KCM = 0x119 SOL_LLC = 0x10c SOL_NETBEUI = 0x10b SOL_NETLINK = 0x10e SOL_NFC = 0x118 SOL_PACKET = 0x107 SOL_PNPIPE = 0x113 SOL_PPPOL2TP = 0x111 SOL_RAW = 0xff SOL_RDS = 0x114 SOL_RXRPC = 0x110 SOL_SOCKET = 0x1 SOL_TCP = 0x6 SOL_TIPC = 0x10f SOL_X25 = 0x106 SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x1e SO_ATTACH_BPF = 0x32 SO_ATTACH_FILTER = 0x1a SO_ATTACH_REUSEPORT_CBPF = 0x33 SO_ATTACH_REUSEPORT_EBPF = 0x34 SO_BINDTODEVICE = 0x19 SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe SO_BUSY_POLL = 0x2e SO_CNX_ADVICE = 0x35 SO_COOKIE = 0x39 SO_DEBUG = 0x1 SO_DETACH_BPF = 0x1b SO_DETACH_FILTER = 0x1b SO_DOMAIN = 0x27 SO_DONTROUTE = 0x5 SO_ERROR = 0x4 SO_GET_FILTER = 0x1a SO_INCOMING_CPU = 0x31 SO_INCOMING_NAPI_ID = 0x38 SO_KEEPALIVE = 0x9 SO_LINGER = 0xd SO_LOCK_FILTER = 0x2c SO_MARK = 0x24 SO_MAX_PACING_RATE = 0x2f SO_MEMINFO = 0x37 SO_NOFCS = 0x2b SO_NO_CHECK = 0xb SO_OOBINLINE = 0xa SO_PASSCRED = 0x10 SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x11 SO_PEERGROUPS = 0x3b SO_PEERNAME = 0x1c SO_PEERSEC = 0x1f SO_PRIORITY = 0xc SO_PROTOCOL = 0x26 SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 SO_RCVLOWAT = 0x12 SO_RCVTIMEO = 0x14 SO_REUSEADDR = 0x2 SO_REUSEPORT = 0xf SO_RXQ_OVFL = 0x28 SO_SECURITY_AUTHENTICATION = 0x16 SO_SECURITY_ENCRYPTION_NETWORK = 0x18 SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 SO_SELECT_ERR_QUEUE = 0x2d SO_SNDBUF = 0x7 SO_SNDBUFFORCE = 0x20 SO_SNDLOWAT = 0x13 SO_SNDTIMEO = 0x15 SO_TIMESTAMP = 0x1d SO_TIMESTAMPING = 0x25 SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x3 SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 SO_VM_SOCKETS_BUFFER_SIZE = 0x0 SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 SO_VM_SOCKETS_TRUSTED = 0x5 SO_WIFI_STATUS = 0x29 SPLICE_F_GIFT = 0x8 SPLICE_F_MORE = 0x4 SPLICE_F_MOVE = 0x1 SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000 S_IFCHR = 0x2000 S_IFDIR = 0x4000 S_IFIFO = 0x1000 S_IFLNK = 0xa000 S_IFMT = 0xf000 S_IFREG = 0x8000 S_IFSOCK = 0xc000 S_IREAD = 0x100 S_IRGRP = 0x20 S_IROTH = 0x4 S_IRUSR = 0x100 S_IRWXG = 0x38 S_IRWXO = 0x7 S_IRWXU = 0x1c0 S_ISGID = 0x400 S_ISUID = 0x800 S_ISVTX = 0x200 S_IWGRP = 0x10 S_IWOTH = 0x2 S_IWRITE = 0x80 S_IWUSR = 0x80 S_IXGRP = 0x8 S_IXOTH = 0x1 S_IXUSR = 0x40 TAB0 = 0x0 TAB1 = 0x800 TAB2 = 0x1000 TAB3 = 0x1800 TABDLY = 0x1800 TASKSTATS_CMD_ATTR_MAX = 0x4 TASKSTATS_CMD_MAX = 0x2 TASKSTATS_GENL_NAME = "TASKSTATS" TASKSTATS_GENL_VERSION = 0x1 TASKSTATS_TYPE_MAX = 0x6 TASKSTATS_VERSION = 0x8 TCFLSH = 0x540b TCGETA = 0x5405 TCGETS = 0x5401 TCGETS2 = 0x802c542a TCGETX = 0x5432 TCIFLUSH = 0x0 TCIOFF = 0x2 TCIOFLUSH = 0x2 TCION = 0x3 TCOFLUSH = 0x1 TCOOFF = 0x0 TCOON = 0x1 TCP_CC_INFO = 0x1a TCP_CONGESTION = 0xd TCP_COOKIE_IN_ALWAYS = 0x1 TCP_COOKIE_MAX = 0x10 TCP_COOKIE_MIN = 0x8 TCP_COOKIE_OUT_NEVER = 0x2 TCP_COOKIE_PAIR_SIZE = 0x20 TCP_COOKIE_TRANSACTIONS = 0xf TCP_CORK = 0x3 TCP_DEFER_ACCEPT = 0x9 TCP_FASTOPEN = 0x17 TCP_FASTOPEN_CONNECT = 0x1e TCP_INFO = 0xb TCP_KEEPCNT = 0x6 TCP_KEEPIDLE = 0x4 TCP_KEEPINTVL = 0x5 TCP_LINGER2 = 0x8 TCP_MAXSEG = 0x2 TCP_MAXWIN = 0xffff TCP_MAX_WINSHIFT = 0xe TCP_MD5SIG = 0xe TCP_MD5SIG_MAXKEYLEN = 0x50 TCP_MSS = 0x200 TCP_MSS_DEFAULT = 0x218 TCP_MSS_DESIRED = 0x4c4 TCP_NODELAY = 0x1 TCP_NOTSENT_LOWAT = 0x19 TCP_QUEUE_SEQ = 0x15 TCP_QUICKACK = 0xc TCP_REPAIR = 0x13 TCP_REPAIR_OPTIONS = 0x16 TCP_REPAIR_QUEUE = 0x14 TCP_REPAIR_WINDOW = 0x1d TCP_SAVED_SYN = 0x1c TCP_SAVE_SYN = 0x1b TCP_SYNCNT = 0x7 TCP_S_DATA_IN = 0x4 TCP_S_DATA_OUT = 0x8 TCP_THIN_DUPACK = 0x11 TCP_THIN_LINEAR_TIMEOUTS = 0x10 TCP_TIMESTAMP = 0x18 TCP_USER_TIMEOUT = 0x12 TCP_WINDOW_CLAMP = 0xa TCSAFLUSH = 0x2 TCSBRK = 0x5409 TCSBRKP = 0x5425 TCSETA = 0x5406 TCSETAF = 0x5408 TCSETAW = 0x5407 TCSETS = 0x5402 TCSETS2 = 0x402c542b TCSETSF = 0x5404 TCSETSF2 = 0x402c542d TCSETSW = 0x5403 TCSETSW2 = 0x402c542c TCSETX = 0x5433 TCSETXF = 0x5434 TCSETXW = 0x5435 TCXONC = 0x540a TIOCCBRK = 0x5428 TIOCCONS = 0x541d TIOCEXCL = 0x540c TIOCGDEV = 0x80045432 TIOCGETD = 0x5424 TIOCGEXCL = 0x80045440 TIOCGICOUNT = 0x545d TIOCGLCKTRMIOS = 0x5456 TIOCGPGRP = 0x540f TIOCGPKT = 0x80045438 TIOCGPTLCK = 0x80045439 TIOCGPTN = 0x80045430 TIOCGPTPEER = 0x5441 TIOCGRS485 = 0x542e TIOCGSERIAL = 0x541e TIOCGSID = 0x5429 TIOCGSOFTCAR = 0x5419 TIOCGWINSZ = 0x5413 TIOCINQ = 0x541b TIOCLINUX = 0x541c TIOCMBIC = 0x5417 TIOCMBIS = 0x5416 TIOCMGET = 0x5415 TIOCMIWAIT = 0x545c TIOCMSET = 0x5418 TIOCM_CAR = 0x40 TIOCM_CD = 0x40 TIOCM_CTS = 0x20 TIOCM_DSR = 0x100 TIOCM_DTR = 0x2 TIOCM_LE = 0x1 TIOCM_RI = 0x80 TIOCM_RNG = 0x80 TIOCM_RTS = 0x4 TIOCM_SR = 0x10 TIOCM_ST = 0x8 TIOCNOTTY = 0x5422 TIOCNXCL = 0x540d TIOCOUTQ = 0x5411 TIOCPKT = 0x5420 TIOCPKT_DATA = 0x0 TIOCPKT_DOSTOP = 0x20 TIOCPKT_FLUSHREAD = 0x1 TIOCPKT_FLUSHWRITE = 0x2 TIOCPKT_IOCTL = 0x40 TIOCPKT_NOSTOP = 0x10 TIOCPKT_START = 0x8 TIOCPKT_STOP = 0x4 TIOCSBRK = 0x5427 TIOCSCTTY = 0x540e TIOCSERCONFIG = 0x5453 TIOCSERGETLSR = 0x5459 TIOCSERGETMULTI = 0x545a TIOCSERGSTRUCT = 0x5458 TIOCSERGWILD = 0x5454 TIOCSERSETMULTI = 0x545b TIOCSERSWILD = 0x5455 TIOCSER_TEMT = 0x1 TIOCSETD = 0x5423 TIOCSIG = 0x40045436 TIOCSLCKTRMIOS = 0x5457 TIOCSPGRP = 0x5410 TIOCSPTLCK = 0x40045431 TIOCSRS485 = 0x542f TIOCSSERIAL = 0x541f TIOCSSOFTCAR = 0x541a TIOCSTI = 0x5412 TIOCSWINSZ = 0x5414 TIOCVHANGUP = 0x5437 TOSTOP = 0x100 TS_COMM_LEN = 0x20 TUNATTACHFILTER = 0x401054d5 TUNDETACHFILTER = 0x401054d6 TUNGETFEATURES = 0x800454cf TUNGETFILTER = 0x801054db TUNGETIFF = 0x800454d2 TUNGETSNDBUF = 0x800454d3 TUNGETVNETBE = 0x800454df TUNGETVNETHDRSZ = 0x800454d7 TUNGETVNETLE = 0x800454dd TUNSETDEBUG = 0x400454c9 TUNSETGROUP = 0x400454ce TUNSETIFF = 0x400454ca TUNSETIFINDEX = 0x400454da TUNSETLINK = 0x400454cd TUNSETNOCSUM = 0x400454c8 TUNSETOFFLOAD = 0x400454d0 TUNSETOWNER = 0x400454cc TUNSETPERSIST = 0x400454cb TUNSETQUEUE = 0x400454d9 TUNSETSNDBUF = 0x400454d4 TUNSETTXFILTER = 0x400454d1 TUNSETVNETBE = 0x400454de TUNSETVNETHDRSZ = 0x400454d8 TUNSETVNETLE = 0x400454dc UMOUNT_NOFOLLOW = 0x8 UTIME_NOW = 0x3fffffff UTIME_OMIT = 0x3ffffffe VDISCARD = 0xd VEOF = 0x4 VEOL = 0xb VEOL2 = 0x10 VERASE = 0x2 VINTR = 0x0 VKILL = 0x3 VLNEXT = 0xf VMADDR_CID_ANY = 0xffffffff VMADDR_CID_HOST = 0x2 VMADDR_CID_HYPERVISOR = 0x0 VMADDR_CID_RESERVED = 0x1 VMADDR_PORT_ANY = 0xffffffff VMIN = 0x6 VM_SOCKETS_INVALID_VERSION = 0xffffffff VQUIT = 0x1 VREPRINT = 0xc VSTART = 0x8 VSTOP = 0x9 VSUSP = 0xa VSWTC = 0x7 VT0 = 0x0 VT1 = 0x4000 VTDLY = 0x4000 VTIME = 0x5 VWERASE = 0xe WALL = 0x40000000 WCLONE = 0x80000000 WCONTINUED = 0x8 WDIOC_GETBOOTSTATUS = 0x80045702 WDIOC_GETPRETIMEOUT = 0x80045709 WDIOC_GETSTATUS = 0x80045701 WDIOC_GETSUPPORT = 0x80285700 WDIOC_GETTEMP = 0x80045703 WDIOC_GETTIMELEFT = 0x8004570a WDIOC_GETTIMEOUT = 0x80045707 WDIOC_KEEPALIVE = 0x80045705 WDIOC_SETOPTIONS = 0x80045704 WDIOC_SETPRETIMEOUT = 0xc0045708 WDIOC_SETTIMEOUT = 0xc0045706 WEXITED = 0x4 WNOHANG = 0x1 WNOTHREAD = 0x20000000 WNOWAIT = 0x1000000 WORDSIZE = 0x40 WSTOPPED = 0x2 WUNTRACED = 0x2 XATTR_CREATE = 0x1 XATTR_REPLACE = 0x2 XCASE = 0x4 XTABS = 0x1800 ) // Errors const ( E2BIG = syscall.Errno(0x7) EACCES = syscall.Errno(0xd) EADDRINUSE = syscall.Errno(0x62) EADDRNOTAVAIL = syscall.Errno(0x63) EADV = syscall.Errno(0x44) EAFNOSUPPORT = syscall.Errno(0x61) EAGAIN = syscall.Errno(0xb) EALREADY = syscall.Errno(0x72) EBADE = syscall.Errno(0x34) EBADF = syscall.Errno(0x9) EBADFD = syscall.Errno(0x4d) EBADMSG = syscall.Errno(0x4a) EBADR = syscall.Errno(0x35) EBADRQC = syscall.Errno(0x38) EBADSLT = syscall.Errno(0x39) EBFONT = syscall.Errno(0x3b) EBUSY = syscall.Errno(0x10) ECANCELED = syscall.Errno(0x7d) ECHILD = syscall.Errno(0xa) ECHRNG = syscall.Errno(0x2c) ECOMM = syscall.Errno(0x46) ECONNABORTED = syscall.Errno(0x67) ECONNREFUSED = syscall.Errno(0x6f) ECONNRESET = syscall.Errno(0x68) EDEADLK = syscall.Errno(0x23) EDEADLOCK = syscall.Errno(0x23) EDESTADDRREQ = syscall.Errno(0x59) EDOM = syscall.Errno(0x21) EDOTDOT = syscall.Errno(0x49) EDQUOT = syscall.Errno(0x7a) EEXIST = syscall.Errno(0x11) EFAULT = syscall.Errno(0xe) EFBIG = syscall.Errno(0x1b) EHOSTDOWN = syscall.Errno(0x70) EHOSTUNREACH = syscall.Errno(0x71) EHWPOISON = syscall.Errno(0x85) EIDRM = syscall.Errno(0x2b) EILSEQ = syscall.Errno(0x54) EINPROGRESS = syscall.Errno(0x73) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x6a) EISDIR = syscall.Errno(0x15) EISNAM = syscall.Errno(0x78) EKEYEXPIRED = syscall.Errno(0x7f) EKEYREJECTED = syscall.Errno(0x81) EKEYREVOKED = syscall.Errno(0x80) EL2HLT = syscall.Errno(0x33) EL2NSYNC = syscall.Errno(0x2d) EL3HLT = syscall.Errno(0x2e) EL3RST = syscall.Errno(0x2f) ELIBACC = syscall.Errno(0x4f) ELIBBAD = syscall.Errno(0x50) ELIBEXEC = syscall.Errno(0x53) ELIBMAX = syscall.Errno(0x52) ELIBSCN = syscall.Errno(0x51) ELNRNG = syscall.Errno(0x30) ELOOP = syscall.Errno(0x28) EMEDIUMTYPE = syscall.Errno(0x7c) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) EMSGSIZE = syscall.Errno(0x5a) EMULTIHOP = syscall.Errno(0x48) ENAMETOOLONG = syscall.Errno(0x24) ENAVAIL = syscall.Errno(0x77) ENETDOWN = syscall.Errno(0x64) ENETRESET = syscall.Errno(0x66) ENETUNREACH = syscall.Errno(0x65) ENFILE = syscall.Errno(0x17) ENOANO = syscall.Errno(0x37) ENOBUFS = syscall.Errno(0x69) ENOCSI = syscall.Errno(0x32) ENODATA = syscall.Errno(0x3d) ENODEV = syscall.Errno(0x13) ENOENT = syscall.Errno(0x2) ENOEXEC = syscall.Errno(0x8) ENOKEY = syscall.Errno(0x7e) ENOLCK = syscall.Errno(0x25) ENOLINK = syscall.Errno(0x43) ENOMEDIUM = syscall.Errno(0x7b) ENOMEM = syscall.Errno(0xc) ENOMSG = syscall.Errno(0x2a) ENONET = syscall.Errno(0x40) ENOPKG = syscall.Errno(0x41) ENOPROTOOPT = syscall.Errno(0x5c) ENOSPC = syscall.Errno(0x1c) ENOSR = syscall.Errno(0x3f) ENOSTR = syscall.Errno(0x3c) ENOSYS = syscall.Errno(0x26) ENOTBLK = syscall.Errno(0xf) ENOTCONN = syscall.Errno(0x6b) ENOTDIR = syscall.Errno(0x14) ENOTEMPTY = syscall.Errno(0x27) ENOTNAM = syscall.Errno(0x76) ENOTRECOVERABLE = syscall.Errno(0x83) ENOTSOCK = syscall.Errno(0x58) ENOTSUP = syscall.Errno(0x5f) ENOTTY = syscall.Errno(0x19) ENOTUNIQ = syscall.Errno(0x4c) ENXIO = syscall.Errno(0x6) EOPNOTSUPP = syscall.Errno(0x5f) EOVERFLOW = syscall.Errno(0x4b) EOWNERDEAD = syscall.Errno(0x82) EPERM = syscall.Errno(0x1) EPFNOSUPPORT = syscall.Errno(0x60) EPIPE = syscall.Errno(0x20) EPROTO = syscall.Errno(0x47) EPROTONOSUPPORT = syscall.Errno(0x5d) EPROTOTYPE = syscall.Errno(0x5b) ERANGE = syscall.Errno(0x22) EREMCHG = syscall.Errno(0x4e) EREMOTE = syscall.Errno(0x42) EREMOTEIO = syscall.Errno(0x79) ERESTART = syscall.Errno(0x55) ERFKILL = syscall.Errno(0x84) EROFS = syscall.Errno(0x1e) ESHUTDOWN = syscall.Errno(0x6c) ESOCKTNOSUPPORT = syscall.Errno(0x5e) ESPIPE = syscall.Errno(0x1d) ESRCH = syscall.Errno(0x3) ESRMNT = syscall.Errno(0x45) ESTALE = syscall.Errno(0x74) ESTRPIPE = syscall.Errno(0x56) ETIME = syscall.Errno(0x3e) ETIMEDOUT = syscall.Errno(0x6e) ETOOMANYREFS = syscall.Errno(0x6d) ETXTBSY = syscall.Errno(0x1a) EUCLEAN = syscall.Errno(0x75) EUNATCH = syscall.Errno(0x31) EUSERS = syscall.Errno(0x57) EWOULDBLOCK = syscall.Errno(0xb) EXDEV = syscall.Errno(0x12) EXFULL = syscall.Errno(0x36) ) // Signals const ( SIGABRT = syscall.Signal(0x6) SIGALRM = syscall.Signal(0xe) SIGBUS = syscall.Signal(0x7) SIGCHLD = syscall.Signal(0x11) SIGCLD = syscall.Signal(0x11) SIGCONT = syscall.Signal(0x12) SIGFPE = syscall.Signal(0x8) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x1d) SIGIOT = syscall.Signal(0x6) SIGKILL = syscall.Signal(0x9) SIGPIPE = syscall.Signal(0xd) SIGPOLL = syscall.Signal(0x1d) SIGPROF = syscall.Signal(0x1b) SIGPWR = syscall.Signal(0x1e) SIGQUIT = syscall.Signal(0x3) SIGSEGV = syscall.Signal(0xb) SIGSTKFLT = syscall.Signal(0x10) SIGSTOP = syscall.Signal(0x13) SIGSYS = syscall.Signal(0x1f) SIGTERM = syscall.Signal(0xf) SIGTRAP = syscall.Signal(0x5) SIGTSTP = syscall.Signal(0x14) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) SIGURG = syscall.Signal(0x17) SIGUSR1 = syscall.Signal(0xa) SIGUSR2 = syscall.Signal(0xc) SIGVTALRM = syscall.Signal(0x1a) SIGWINCH = syscall.Signal(0x1c) SIGXCPU = syscall.Signal(0x18) SIGXFSZ = syscall.Signal(0x19) ) // Error table var errors = [...]string{ 1: "operation not permitted", 2: "no such file or directory", 3: "no such process", 4: "interrupted system call", 5: "input/output error", 6: "no such device or address", 7: "argument list too long", 8: "exec format error", 9: "bad file descriptor", 10: "no child processes", 11: "resource temporarily unavailable", 12: "cannot allocate memory", 13: "permission denied", 14: "bad address", 15: "block device required", 16: "device or resource busy", 17: "file exists", 18: "invalid cross-device link", 19: "no such device", 20: "not a directory", 21: "is a directory", 22: "invalid argument", 23: "too many open files in system", 24: "too many open files", 25: "inappropriate ioctl for device", 26: "text file busy", 27: "file too large", 28: "no space left on device", 29: "illegal seek", 30: "read-only file system", 31: "too many links", 32: "broken pipe", 33: "numerical argument out of domain", 34: "numerical result out of range", 35: "resource deadlock avoided", 36: "file name too long", 37: "no locks available", 38: "function not implemented", 39: "directory not empty", 40: "too many levels of symbolic links", 42: "no message of desired type", 43: "identifier removed", 44: "channel number out of range", 45: "level 2 not synchronized", 46: "level 3 halted", 47: "level 3 reset", 48: "link number out of range", 49: "protocol driver not attached", 50: "no CSI structure available", 51: "level 2 halted", 52: "invalid exchange", 53: "invalid request descriptor", 54: "exchange full", 55: "no anode", 56: "invalid request code", 57: "invalid slot", 59: "bad font file format", 60: "device not a stream", 61: "no data available", 62: "timer expired", 63: "out of streams resources", 64: "machine is not on the network", 65: "package not installed", 66: "object is remote", 67: "link has been severed", 68: "advertise error", 69: "srmount error", 70: "communication error on send", 71: "protocol error", 72: "multihop attempted", 73: "RFS specific error", 74: "bad message", 75: "value too large for defined data type", 76: "name not unique on network", 77: "file descriptor in bad state", 78: "remote address changed", 79: "can not access a needed shared library", 80: "accessing a corrupted shared library", 81: ".lib section in a.out corrupted", 82: "attempting to link in too many shared libraries", 83: "cannot exec a shared library directly", 84: "invalid or incomplete multibyte or wide character", 85: "interrupted system call should be restarted", 86: "streams pipe error", 87: "too many users", 88: "socket operation on non-socket", 89: "destination address required", 90: "message too long", 91: "protocol wrong type for socket", 92: "protocol not available", 93: "protocol not supported", 94: "socket type not supported", 95: "operation not supported", 96: "protocol family not supported", 97: "address family not supported by protocol", 98: "address already in use", 99: "cannot assign requested address", 100: "network is down", 101: "network is unreachable", 102: "network dropped connection on reset", 103: "software caused connection abort", 104: "connection reset by peer", 105: "no buffer space available", 106: "transport endpoint is already connected", 107: "transport endpoint is not connected", 108: "cannot send after transport endpoint shutdown", 109: "too many references: cannot splice", 110: "connection timed out", 111: "connection refused", 112: "host is down", 113: "no route to host", 114: "operation already in progress", 115: "operation now in progress", 116: "stale file handle", 117: "structure needs cleaning", 118: "not a XENIX named type file", 119: "no XENIX semaphores available", 120: "is a named type file", 121: "remote I/O error", 122: "disk quota exceeded", 123: "no medium found", 124: "wrong medium type", 125: "operation canceled", 126: "required key not available", 127: "key has expired", 128: "key has been revoked", 129: "key was rejected by service", 130: "owner died", 131: "state not recoverable", 132: "operation not possible due to RF-kill", 133: "memory page has hardware error", } // Signal table var signals = [...]string{ 1: "hangup", 2: "interrupt", 3: "quit", 4: "illegal instruction", 5: "trace/breakpoint trap", 6: "aborted", 7: "bus error", 8: "floating point exception", 9: "killed", 10: "user defined signal 1", 11: "segmentation fault", 12: "user defined signal 2", 13: "broken pipe", 14: "alarm clock", 15: "terminated", 16: "stack fault", 17: "child exited", 18: "continued", 19: "stopped (signal)", 20: "stopped", 21: "stopped (tty input)", 22: "stopped (tty output)", 23: "urgent I/O condition", 24: "CPU time limit exceeded", 25: "file size limit exceeded", 26: "virtual timer expired", 27: "profiling timer expired", 28: "window changed", 29: "I/O possible", 30: "power failure", 31: "bad system call", } ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go ================================================ // mkerrors.sh -m64 // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT // +build sparc64,linux // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- -m64 _const.go package unix import "syscall" const ( AF_ALG = 0x26 AF_APPLETALK = 0x5 AF_ASH = 0x12 AF_ATMPVC = 0x8 AF_ATMSVC = 0x14 AF_AX25 = 0x3 AF_BLUETOOTH = 0x1f AF_BRIDGE = 0x7 AF_CAIF = 0x25 AF_CAN = 0x1d AF_DECnet = 0xc AF_ECONET = 0x13 AF_FILE = 0x1 AF_IB = 0x1b AF_IEEE802154 = 0x24 AF_INET = 0x2 AF_INET6 = 0xa AF_IPX = 0x4 AF_IRDA = 0x17 AF_ISDN = 0x22 AF_IUCV = 0x20 AF_KCM = 0x29 AF_KEY = 0xf AF_LLC = 0x1a AF_LOCAL = 0x1 AF_MAX = 0x2a AF_MPLS = 0x1c AF_NETBEUI = 0xd AF_NETLINK = 0x10 AF_NETROM = 0x6 AF_NFC = 0x27 AF_PACKET = 0x11 AF_PHONET = 0x23 AF_PPPOX = 0x18 AF_RDS = 0x15 AF_ROSE = 0xb AF_ROUTE = 0x10 AF_RXRPC = 0x21 AF_SECURITY = 0xe AF_SNA = 0x16 AF_TIPC = 0x1e AF_UNIX = 0x1 AF_UNSPEC = 0x0 AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 ALG_OP_DECRYPT = 0x0 ALG_OP_ENCRYPT = 0x1 ALG_SET_AEAD_ASSOCLEN = 0x4 ALG_SET_AEAD_AUTHSIZE = 0x5 ALG_SET_IV = 0x2 ALG_SET_KEY = 0x1 ALG_SET_OP = 0x3 ARPHRD_6LOWPAN = 0x339 ARPHRD_ADAPT = 0x108 ARPHRD_APPLETLK = 0x8 ARPHRD_ARCNET = 0x7 ARPHRD_ASH = 0x30d ARPHRD_ATM = 0x13 ARPHRD_AX25 = 0x3 ARPHRD_BIF = 0x307 ARPHRD_CAIF = 0x336 ARPHRD_CAN = 0x118 ARPHRD_CHAOS = 0x5 ARPHRD_CISCO = 0x201 ARPHRD_CSLIP = 0x101 ARPHRD_CSLIP6 = 0x103 ARPHRD_DDCMP = 0x205 ARPHRD_DLCI = 0xf ARPHRD_ECONET = 0x30e ARPHRD_EETHER = 0x2 ARPHRD_ETHER = 0x1 ARPHRD_EUI64 = 0x1b ARPHRD_FCAL = 0x311 ARPHRD_FCFABRIC = 0x313 ARPHRD_FCPL = 0x312 ARPHRD_FCPP = 0x310 ARPHRD_FDDI = 0x306 ARPHRD_FRAD = 0x302 ARPHRD_HDLC = 0x201 ARPHRD_HIPPI = 0x30c ARPHRD_HWX25 = 0x110 ARPHRD_IEEE1394 = 0x18 ARPHRD_IEEE802 = 0x6 ARPHRD_IEEE80211 = 0x321 ARPHRD_IEEE80211_PRISM = 0x322 ARPHRD_IEEE80211_RADIOTAP = 0x323 ARPHRD_IEEE802154 = 0x324 ARPHRD_IEEE802154_MONITOR = 0x325 ARPHRD_IEEE802_TR = 0x320 ARPHRD_INFINIBAND = 0x20 ARPHRD_IP6GRE = 0x337 ARPHRD_IPDDP = 0x309 ARPHRD_IPGRE = 0x30a ARPHRD_IRDA = 0x30f ARPHRD_LAPB = 0x204 ARPHRD_LOCALTLK = 0x305 ARPHRD_LOOPBACK = 0x304 ARPHRD_METRICOM = 0x17 ARPHRD_NETLINK = 0x338 ARPHRD_NETROM = 0x0 ARPHRD_NONE = 0xfffe ARPHRD_PHONET = 0x334 ARPHRD_PHONET_PIPE = 0x335 ARPHRD_PIMREG = 0x30b ARPHRD_PPP = 0x200 ARPHRD_PRONET = 0x4 ARPHRD_RAWHDLC = 0x206 ARPHRD_ROSE = 0x10e ARPHRD_RSRVD = 0x104 ARPHRD_SIT = 0x308 ARPHRD_SKIP = 0x303 ARPHRD_SLIP = 0x100 ARPHRD_SLIP6 = 0x102 ARPHRD_TUNNEL = 0x300 ARPHRD_TUNNEL6 = 0x301 ARPHRD_VOID = 0xffff ARPHRD_X25 = 0x10f ASI_LEON_DFLUSH = 0x11 ASI_LEON_IFLUSH = 0x10 ASI_LEON_MMUFLUSH = 0x18 B0 = 0x0 B1000000 = 0x100c B110 = 0x3 B115200 = 0x1002 B1152000 = 0x100d B1200 = 0x9 B134 = 0x4 B150 = 0x5 B1500000 = 0x100e B153600 = 0x1006 B1800 = 0xa B19200 = 0xe B200 = 0x6 B2000000 = 0x100f B230400 = 0x1003 B2400 = 0xb B300 = 0x7 B307200 = 0x1007 B38400 = 0xf B460800 = 0x1004 B4800 = 0xc B50 = 0x1 B500000 = 0x100a B57600 = 0x1001 B576000 = 0x100b B600 = 0x8 B614400 = 0x1008 B75 = 0x2 B76800 = 0x1005 B921600 = 0x1009 B9600 = 0xd BLKBSZGET = 0x80081270 BLKBSZSET = 0x40081271 BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80081272 BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d BLKRRPART = 0x125f BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 BOTHER = 0x1000 BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALU = 0x4 BPF_AND = 0x50 BPF_B = 0x10 BPF_DIV = 0x30 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 BPF_JA = 0x0 BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 BPF_JMP = 0x5 BPF_JSET = 0x40 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 BPF_LEN = 0x80 BPF_LL_OFF = -0x200000 BPF_LSH = 0x60 BPF_MAJOR_VERSION = 0x1 BPF_MAXINSNS = 0x1000 BPF_MEM = 0x60 BPF_MEMWORDS = 0x10 BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MOD = 0x90 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_NET_OFF = -0x100000 BPF_OR = 0x40 BPF_RET = 0x6 BPF_RSH = 0x70 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 BPF_TAX = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 BPF_XOR = 0xa0 BRKINT = 0x2 BS0 = 0x0 BS1 = 0x2000 BSDLY = 0x2000 CAN_BCM = 0x2 CAN_EFF_FLAG = 0x80000000 CAN_EFF_ID_BITS = 0x1d CAN_EFF_MASK = 0x1fffffff CAN_ERR_FLAG = 0x20000000 CAN_ERR_MASK = 0x1fffffff CAN_INV_FILTER = 0x20000000 CAN_ISOTP = 0x6 CAN_MAX_DLC = 0x8 CAN_MAX_DLEN = 0x8 CAN_MCNET = 0x5 CAN_MTU = 0x10 CAN_NPROTO = 0x7 CAN_RAW = 0x1 CAN_RTR_FLAG = 0x40000000 CAN_SFF_ID_BITS = 0xb CAN_SFF_MASK = 0x7ff CAN_TP16 = 0x3 CAN_TP20 = 0x4 CBAUD = 0x100f CBAUDEX = 0x1000 CFLUSH = 0xf CIBAUD = 0x100f0000 CLOCAL = 0x800 CLOCK_BOOTTIME = 0x7 CLOCK_BOOTTIME_ALARM = 0x9 CLOCK_DEFAULT = 0x0 CLOCK_EXT = 0x1 CLOCK_INT = 0x2 CLOCK_MONOTONIC = 0x1 CLOCK_MONOTONIC_COARSE = 0x6 CLOCK_MONOTONIC_RAW = 0x4 CLOCK_PROCESS_CPUTIME_ID = 0x2 CLOCK_REALTIME = 0x0 CLOCK_REALTIME_ALARM = 0x8 CLOCK_REALTIME_COARSE = 0x5 CLOCK_TAI = 0xb CLOCK_THREAD_CPUTIME_ID = 0x3 CLOCK_TXFROMRX = 0x4 CLOCK_TXINT = 0x3 CLONE_CHILD_CLEARTID = 0x200000 CLONE_CHILD_SETTID = 0x1000000 CLONE_DETACHED = 0x400000 CLONE_FILES = 0x400 CLONE_FS = 0x200 CLONE_IO = 0x80000000 CLONE_NEWCGROUP = 0x2000000 CLONE_NEWIPC = 0x8000000 CLONE_NEWNET = 0x40000000 CLONE_NEWNS = 0x20000 CLONE_NEWPID = 0x20000000 CLONE_NEWUSER = 0x10000000 CLONE_NEWUTS = 0x4000000 CLONE_PARENT = 0x8000 CLONE_PARENT_SETTID = 0x100000 CLONE_PTRACE = 0x2000 CLONE_SETTLS = 0x80000 CLONE_SIGHAND = 0x800 CLONE_SYSVSEM = 0x40000 CLONE_THREAD = 0x10000 CLONE_UNTRACED = 0x800000 CLONE_VFORK = 0x4000 CLONE_VM = 0x100 CMSPAR = 0x40000000 CR0 = 0x0 CR1 = 0x200 CR2 = 0x400 CR3 = 0x600 CRDLY = 0x600 CREAD = 0x80 CRTSCTS = 0x80000000 CS5 = 0x0 CS6 = 0x10 CS7 = 0x20 CS8 = 0x30 CSIGNAL = 0xff CSIZE = 0x30 CSTART = 0x11 CSTATUS = 0x0 CSTOP = 0x13 CSTOPB = 0x40 CSUSP = 0x1a DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 DT_FIFO = 0x1 DT_LNK = 0xa DT_REG = 0x8 DT_SOCK = 0xc DT_UNKNOWN = 0x0 DT_WHT = 0xe ECHO = 0x8 ECHOCTL = 0x200 ECHOE = 0x10 ECHOK = 0x20 ECHOKE = 0x800 ECHONL = 0x40 ECHOPRT = 0x400 EMT_TAGOVF = 0x1 ENCODING_DEFAULT = 0x0 ENCODING_FM_MARK = 0x3 ENCODING_FM_SPACE = 0x4 ENCODING_MANCHESTER = 0x5 ENCODING_NRZ = 0x1 ENCODING_NRZI = 0x2 EPOLLERR = 0x8 EPOLLET = 0x80000000 EPOLLEXCLUSIVE = 0x10000000 EPOLLHUP = 0x10 EPOLLIN = 0x1 EPOLLMSG = 0x400 EPOLLONESHOT = 0x40000000 EPOLLOUT = 0x4 EPOLLPRI = 0x2 EPOLLRDBAND = 0x80 EPOLLRDHUP = 0x2000 EPOLLRDNORM = 0x40 EPOLLWAKEUP = 0x20000000 EPOLLWRBAND = 0x200 EPOLLWRNORM = 0x100 EPOLL_CLOEXEC = 0x400000 EPOLL_CTL_ADD = 0x1 EPOLL_CTL_DEL = 0x2 EPOLL_CTL_MOD = 0x3 ETH_P_1588 = 0x88f7 ETH_P_8021AD = 0x88a8 ETH_P_8021AH = 0x88e7 ETH_P_8021Q = 0x8100 ETH_P_80221 = 0x8917 ETH_P_802_2 = 0x4 ETH_P_802_3 = 0x1 ETH_P_802_3_MIN = 0x600 ETH_P_802_EX1 = 0x88b5 ETH_P_AARP = 0x80f3 ETH_P_AF_IUCV = 0xfbfb ETH_P_ALL = 0x3 ETH_P_AOE = 0x88a2 ETH_P_ARCNET = 0x1a ETH_P_ARP = 0x806 ETH_P_ATALK = 0x809b ETH_P_ATMFATE = 0x8884 ETH_P_ATMMPOA = 0x884c ETH_P_AX25 = 0x2 ETH_P_BATMAN = 0x4305 ETH_P_BPQ = 0x8ff ETH_P_CAIF = 0xf7 ETH_P_CAN = 0xc ETH_P_CANFD = 0xd ETH_P_CONTROL = 0x16 ETH_P_CUST = 0x6006 ETH_P_DDCMP = 0x6 ETH_P_DEC = 0x6000 ETH_P_DIAG = 0x6005 ETH_P_DNA_DL = 0x6001 ETH_P_DNA_RC = 0x6002 ETH_P_DNA_RT = 0x6003 ETH_P_DSA = 0x1b ETH_P_ECONET = 0x18 ETH_P_EDSA = 0xdada ETH_P_FCOE = 0x8906 ETH_P_FIP = 0x8914 ETH_P_HDLC = 0x19 ETH_P_HSR = 0x892f ETH_P_IEEE802154 = 0xf6 ETH_P_IEEEPUP = 0xa00 ETH_P_IEEEPUPAT = 0xa01 ETH_P_IP = 0x800 ETH_P_IPV6 = 0x86dd ETH_P_IPX = 0x8137 ETH_P_IRDA = 0x17 ETH_P_LAT = 0x6004 ETH_P_LINK_CTL = 0x886c ETH_P_LOCALTALK = 0x9 ETH_P_LOOP = 0x60 ETH_P_LOOPBACK = 0x9000 ETH_P_MACSEC = 0x88e5 ETH_P_MOBITEX = 0x15 ETH_P_MPLS_MC = 0x8848 ETH_P_MPLS_UC = 0x8847 ETH_P_MVRP = 0x88f5 ETH_P_PAE = 0x888e ETH_P_PAUSE = 0x8808 ETH_P_PHONET = 0xf5 ETH_P_PPPTALK = 0x10 ETH_P_PPP_DISC = 0x8863 ETH_P_PPP_MP = 0x8 ETH_P_PPP_SES = 0x8864 ETH_P_PRP = 0x88fb ETH_P_PUP = 0x200 ETH_P_PUPAT = 0x201 ETH_P_QINQ1 = 0x9100 ETH_P_QINQ2 = 0x9200 ETH_P_QINQ3 = 0x9300 ETH_P_RARP = 0x8035 ETH_P_SCA = 0x6007 ETH_P_SLOW = 0x8809 ETH_P_SNAP = 0x5 ETH_P_TDLS = 0x890d ETH_P_TEB = 0x6558 ETH_P_TIPC = 0x88ca ETH_P_TRAILER = 0x1c ETH_P_TR_802_2 = 0x11 ETH_P_TSN = 0x22f0 ETH_P_WAN_PPP = 0x7 ETH_P_WCCP = 0x883e ETH_P_X25 = 0x805 ETH_P_XDSA = 0xf8 EXTA = 0xe EXTB = 0xf EXTPROC = 0x10000 FALLOC_FL_COLLAPSE_RANGE = 0x8 FALLOC_FL_INSERT_RANGE = 0x20 FALLOC_FL_KEEP_SIZE = 0x1 FALLOC_FL_NO_HIDE_STALE = 0x4 FALLOC_FL_PUNCH_HOLE = 0x2 FALLOC_FL_ZERO_RANGE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 FF1 = 0x8000 FFDLY = 0x8000 FLUSHO = 0x2000 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0x406 F_EXLCK = 0x4 F_GETFD = 0x1 F_GETFL = 0x3 F_GETLEASE = 0x401 F_GETLK = 0x7 F_GETLK64 = 0x7 F_GETOWN = 0x5 F_GETOWN_EX = 0x10 F_GETPIPE_SZ = 0x408 F_GETSIG = 0xb F_LOCK = 0x1 F_NOTIFY = 0x402 F_OFD_GETLK = 0x24 F_OFD_SETLK = 0x25 F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x1 F_SETFD = 0x2 F_SETFL = 0x4 F_SETLEASE = 0x400 F_SETLK = 0x8 F_SETLK64 = 0x8 F_SETLKW = 0x9 F_SETLKW64 = 0x9 F_SETOWN = 0x6 F_SETOWN_EX = 0xf F_SETPIPE_SZ = 0x407 F_SETSIG = 0xa F_SHLCK = 0x8 F_TEST = 0x3 F_TLOCK = 0x2 F_ULOCK = 0x0 F_UNLCK = 0x3 F_WRLCK = 0x2 GRND_NONBLOCK = 0x1 GRND_RANDOM = 0x2 HUPCL = 0x400 IBSHIFT = 0x10 ICANON = 0x2 ICMPV6_FILTER = 0x1 ICRNL = 0x100 IEXTEN = 0x8000 IFA_F_DADFAILED = 0x8 IFA_F_DEPRECATED = 0x20 IFA_F_HOMEADDRESS = 0x10 IFA_F_MANAGETEMPADDR = 0x100 IFA_F_MCAUTOJOIN = 0x400 IFA_F_NODAD = 0x2 IFA_F_NOPREFIXROUTE = 0x200 IFA_F_OPTIMISTIC = 0x4 IFA_F_PERMANENT = 0x80 IFA_F_SECONDARY = 0x1 IFA_F_STABLE_PRIVACY = 0x800 IFA_F_TEMPORARY = 0x1 IFA_F_TENTATIVE = 0x40 IFA_MAX = 0x8 IFF_ALLMULTI = 0x200 IFF_ATTACH_QUEUE = 0x200 IFF_AUTOMEDIA = 0x4000 IFF_BROADCAST = 0x2 IFF_DEBUG = 0x4 IFF_DETACH_QUEUE = 0x400 IFF_DORMANT = 0x20000 IFF_DYNAMIC = 0x8000 IFF_ECHO = 0x40000 IFF_LOOPBACK = 0x8 IFF_LOWER_UP = 0x10000 IFF_MASTER = 0x400 IFF_MULTICAST = 0x1000 IFF_MULTI_QUEUE = 0x100 IFF_NOARP = 0x80 IFF_NOFILTER = 0x1000 IFF_NOTRAILERS = 0x20 IFF_NO_PI = 0x1000 IFF_ONE_QUEUE = 0x2000 IFF_PERSIST = 0x800 IFF_POINTOPOINT = 0x10 IFF_PORTSEL = 0x2000 IFF_PROMISC = 0x100 IFF_RUNNING = 0x40 IFF_SLAVE = 0x800 IFF_TAP = 0x2 IFF_TUN = 0x1 IFF_TUN_EXCL = 0x8000 IFF_UP = 0x1 IFF_VNET_HDR = 0x4000 IFF_VOLATILE = 0x70c5a IFNAMSIZ = 0x10 IGNBRK = 0x1 IGNCR = 0x80 IGNPAR = 0x4 IMAXBEL = 0x2000 INLCR = 0x40 INPCK = 0x10 IN_ACCESS = 0x1 IN_ALL_EVENTS = 0xfff IN_ATTRIB = 0x4 IN_CLASSA_HOST = 0xffffff IN_CLASSA_MAX = 0x80 IN_CLASSA_NET = 0xff000000 IN_CLASSA_NSHIFT = 0x18 IN_CLASSB_HOST = 0xffff IN_CLASSB_MAX = 0x10000 IN_CLASSB_NET = 0xffff0000 IN_CLASSB_NSHIFT = 0x10 IN_CLASSC_HOST = 0xff IN_CLASSC_NET = 0xffffff00 IN_CLASSC_NSHIFT = 0x8 IN_CLOEXEC = 0x400000 IN_CLOSE = 0x18 IN_CLOSE_NOWRITE = 0x10 IN_CLOSE_WRITE = 0x8 IN_CREATE = 0x100 IN_DELETE = 0x200 IN_DELETE_SELF = 0x400 IN_DONT_FOLLOW = 0x2000000 IN_EXCL_UNLINK = 0x4000000 IN_IGNORED = 0x8000 IN_ISDIR = 0x40000000 IN_LOOPBACKNET = 0x7f IN_MASK_ADD = 0x20000000 IN_MODIFY = 0x2 IN_MOVE = 0xc0 IN_MOVED_FROM = 0x40 IN_MOVED_TO = 0x80 IN_MOVE_SELF = 0x800 IN_NONBLOCK = 0x4000 IN_ONESHOT = 0x80000000 IN_ONLYDIR = 0x1000000 IN_OPEN = 0x20 IN_Q_OVERFLOW = 0x4000 IN_UNMOUNT = 0x2000 IPPROTO_AH = 0x33 IPPROTO_BEETPH = 0x5e IPPROTO_COMP = 0x6c IPPROTO_DCCP = 0x21 IPPROTO_DSTOPTS = 0x3c IPPROTO_EGP = 0x8 IPPROTO_ENCAP = 0x62 IPPROTO_ESP = 0x32 IPPROTO_FRAGMENT = 0x2c IPPROTO_GRE = 0x2f IPPROTO_HOPOPTS = 0x0 IPPROTO_ICMP = 0x1 IPPROTO_ICMPV6 = 0x3a IPPROTO_IDP = 0x16 IPPROTO_IGMP = 0x2 IPPROTO_IP = 0x0 IPPROTO_IPIP = 0x4 IPPROTO_IPV6 = 0x29 IPPROTO_MH = 0x87 IPPROTO_MPLS = 0x89 IPPROTO_MTP = 0x5c IPPROTO_NONE = 0x3b IPPROTO_PIM = 0x67 IPPROTO_PUP = 0xc IPPROTO_RAW = 0xff IPPROTO_ROUTING = 0x2b IPPROTO_RSVP = 0x2e IPPROTO_SCTP = 0x84 IPPROTO_TCP = 0x6 IPPROTO_TP = 0x1d IPPROTO_UDP = 0x11 IPPROTO_UDPLITE = 0x88 IPV6_2292DSTOPTS = 0x4 IPV6_2292HOPLIMIT = 0x8 IPV6_2292HOPOPTS = 0x3 IPV6_2292PKTINFO = 0x2 IPV6_2292PKTOPTIONS = 0x6 IPV6_2292RTHDR = 0x5 IPV6_ADDRFORM = 0x1 IPV6_ADD_MEMBERSHIP = 0x14 IPV6_AUTHHDR = 0xa IPV6_CHECKSUM = 0x7 IPV6_DONTFRAG = 0x3e IPV6_DROP_MEMBERSHIP = 0x15 IPV6_DSTOPTS = 0x3b IPV6_HDRINCL = 0x24 IPV6_HOPLIMIT = 0x34 IPV6_HOPOPTS = 0x36 IPV6_IPSEC_POLICY = 0x22 IPV6_JOIN_ANYCAST = 0x1b IPV6_JOIN_GROUP = 0x14 IPV6_LEAVE_ANYCAST = 0x1c IPV6_LEAVE_GROUP = 0x15 IPV6_MTU = 0x18 IPV6_MTU_DISCOVER = 0x17 IPV6_MULTICAST_HOPS = 0x12 IPV6_MULTICAST_IF = 0x11 IPV6_MULTICAST_LOOP = 0x13 IPV6_NEXTHOP = 0x9 IPV6_PATHMTU = 0x3d IPV6_PKTINFO = 0x32 IPV6_PMTUDISC_DO = 0x2 IPV6_PMTUDISC_DONT = 0x0 IPV6_PMTUDISC_INTERFACE = 0x4 IPV6_PMTUDISC_OMIT = 0x5 IPV6_PMTUDISC_PROBE = 0x3 IPV6_PMTUDISC_WANT = 0x1 IPV6_RECVDSTOPTS = 0x3a IPV6_RECVERR = 0x19 IPV6_RECVHOPLIMIT = 0x33 IPV6_RECVHOPOPTS = 0x35 IPV6_RECVPATHMTU = 0x3c IPV6_RECVPKTINFO = 0x31 IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 IPV6_RTHDR_STRICT = 0x1 IPV6_RTHDR_TYPE_0 = 0x0 IPV6_RXDSTOPTS = 0x3b IPV6_RXHOPOPTS = 0x36 IPV6_TCLASS = 0x43 IPV6_UNICAST_HOPS = 0x10 IPV6_V6ONLY = 0x1a IPV6_XFRM_POLICY = 0x23 IP_ADD_MEMBERSHIP = 0x23 IP_ADD_SOURCE_MEMBERSHIP = 0x27 IP_BIND_ADDRESS_NO_PORT = 0x18 IP_BLOCK_SOURCE = 0x26 IP_CHECKSUM = 0x17 IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 IP_DROP_MEMBERSHIP = 0x24 IP_DROP_SOURCE_MEMBERSHIP = 0x28 IP_FREEBIND = 0xf IP_HDRINCL = 0x3 IP_IPSEC_POLICY = 0x10 IP_MAXPACKET = 0xffff IP_MAX_MEMBERSHIPS = 0x14 IP_MF = 0x2000 IP_MINTTL = 0x15 IP_MSFILTER = 0x29 IP_MSS = 0x240 IP_MTU = 0xe IP_MTU_DISCOVER = 0xa IP_MULTICAST_ALL = 0x31 IP_MULTICAST_IF = 0x20 IP_MULTICAST_LOOP = 0x22 IP_MULTICAST_TTL = 0x21 IP_NODEFRAG = 0x16 IP_OFFMASK = 0x1fff IP_OPTIONS = 0x4 IP_ORIGDSTADDR = 0x14 IP_PASSSEC = 0x12 IP_PKTINFO = 0x8 IP_PKTOPTIONS = 0x9 IP_PMTUDISC = 0xa IP_PMTUDISC_DO = 0x2 IP_PMTUDISC_DONT = 0x0 IP_PMTUDISC_INTERFACE = 0x4 IP_PMTUDISC_OMIT = 0x5 IP_PMTUDISC_PROBE = 0x3 IP_PMTUDISC_WANT = 0x1 IP_RECVERR = 0xb IP_RECVOPTS = 0x6 IP_RECVORIGDSTADDR = 0x14 IP_RECVRETOPTS = 0x7 IP_RECVTOS = 0xd IP_RECVTTL = 0xc IP_RETOPTS = 0x7 IP_RF = 0x8000 IP_ROUTER_ALERT = 0x5 IP_TOS = 0x1 IP_TRANSPARENT = 0x13 IP_TTL = 0x2 IP_UNBLOCK_SOURCE = 0x25 IP_UNICAST_IF = 0x32 IP_XFRM_POLICY = 0x11 ISIG = 0x1 ISTRIP = 0x20 IUCLC = 0x200 IUTF8 = 0x4000 IXANY = 0x800 IXOFF = 0x1000 IXON = 0x400 LINUX_REBOOT_CMD_CAD_OFF = 0x0 LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef LINUX_REBOOT_CMD_HALT = 0xcdef0123 LINUX_REBOOT_CMD_KEXEC = 0x45584543 LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc LINUX_REBOOT_CMD_RESTART = 0x1234567 LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 LINUX_REBOOT_MAGIC1 = 0xfee1dead LINUX_REBOOT_MAGIC2 = 0x28121969 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 MADV_DONTFORK = 0xa MADV_DONTNEED = 0x4 MADV_FREE = 0x8 MADV_HUGEPAGE = 0xe MADV_HWPOISON = 0x64 MADV_MERGEABLE = 0xc MADV_NOHUGEPAGE = 0xf MADV_NORMAL = 0x0 MADV_RANDOM = 0x1 MADV_REMOVE = 0x9 MADV_SEQUENTIAL = 0x2 MADV_UNMERGEABLE = 0xd MADV_WILLNEED = 0x3 MAP_ANON = 0x20 MAP_ANONYMOUS = 0x20 MAP_DENYWRITE = 0x800 MAP_EXECUTABLE = 0x1000 MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_GROWSDOWN = 0x200 MAP_HUGETLB = 0x40000 MAP_HUGE_MASK = 0x3f MAP_HUGE_SHIFT = 0x1a MAP_LOCKED = 0x100 MAP_NONBLOCK = 0x10000 MAP_NORESERVE = 0x40 MAP_POPULATE = 0x8000 MAP_PRIVATE = 0x2 MAP_RENAME = 0x20 MAP_SHARED = 0x1 MAP_STACK = 0x20000 MAP_TYPE = 0xf MCL_CURRENT = 0x2000 MCL_FUTURE = 0x4000 MCL_ONFAULT = 0x8000 MNT_DETACH = 0x2 MNT_EXPIRE = 0x4 MNT_FORCE = 0x1 MSG_BATCH = 0x40000 MSG_CMSG_CLOEXEC = 0x40000000 MSG_CONFIRM = 0x800 MSG_CTRUNC = 0x8 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x40 MSG_EOR = 0x80 MSG_ERRQUEUE = 0x2000 MSG_FASTOPEN = 0x20000000 MSG_FIN = 0x200 MSG_MORE = 0x8000 MSG_NOSIGNAL = 0x4000 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_PROXY = 0x10 MSG_RST = 0x1000 MSG_SYN = 0x400 MSG_TRUNC = 0x20 MSG_TRYHARD = 0x4 MSG_WAITALL = 0x100 MSG_WAITFORONE = 0x10000 MS_ACTIVE = 0x40000000 MS_ASYNC = 0x1 MS_BIND = 0x1000 MS_DIRSYNC = 0x80 MS_INVALIDATE = 0x2 MS_I_VERSION = 0x800000 MS_KERNMOUNT = 0x400000 MS_LAZYTIME = 0x2000000 MS_MANDLOCK = 0x40 MS_MGC_MSK = 0xffff0000 MS_MGC_VAL = 0xc0ed0000 MS_MOVE = 0x2000 MS_NOATIME = 0x400 MS_NODEV = 0x4 MS_NODIRATIME = 0x800 MS_NOEXEC = 0x8 MS_NOSUID = 0x2 MS_NOUSER = -0x80000000 MS_POSIXACL = 0x10000 MS_PRIVATE = 0x40000 MS_RDONLY = 0x1 MS_REC = 0x4000 MS_RELATIME = 0x200000 MS_REMOUNT = 0x20 MS_RMT_MASK = 0x2800051 MS_SHARED = 0x100000 MS_SILENT = 0x8000 MS_SLAVE = 0x80000 MS_STRICTATIME = 0x1000000 MS_SYNC = 0x4 MS_SYNCHRONOUS = 0x10 MS_UNBINDABLE = 0x20000 NAME_MAX = 0xff NETLINK_ADD_MEMBERSHIP = 0x1 NETLINK_AUDIT = 0x9 NETLINK_BROADCAST_ERROR = 0x4 NETLINK_CAP_ACK = 0xa NETLINK_CONNECTOR = 0xb NETLINK_CRYPTO = 0x15 NETLINK_DNRTMSG = 0xe NETLINK_DROP_MEMBERSHIP = 0x2 NETLINK_ECRYPTFS = 0x13 NETLINK_FIB_LOOKUP = 0xa NETLINK_FIREWALL = 0x3 NETLINK_GENERIC = 0x10 NETLINK_INET_DIAG = 0x4 NETLINK_IP6_FW = 0xd NETLINK_ISCSI = 0x8 NETLINK_KOBJECT_UEVENT = 0xf NETLINK_LISTEN_ALL_NSID = 0x8 NETLINK_LIST_MEMBERSHIPS = 0x9 NETLINK_NETFILTER = 0xc NETLINK_NFLOG = 0x5 NETLINK_NO_ENOBUFS = 0x5 NETLINK_PKTINFO = 0x3 NETLINK_RDMA = 0x14 NETLINK_ROUTE = 0x0 NETLINK_RX_RING = 0x6 NETLINK_SCSITRANSPORT = 0x12 NETLINK_SELINUX = 0x7 NETLINK_SOCK_DIAG = 0x4 NETLINK_TX_RING = 0x7 NETLINK_UNUSED = 0x1 NETLINK_USERSOCK = 0x2 NETLINK_XFRM = 0x6 NL0 = 0x0 NL1 = 0x100 NLA_ALIGNTO = 0x4 NLA_F_NESTED = 0x8000 NLA_F_NET_BYTEORDER = 0x4000 NLA_HDRLEN = 0x4 NLDLY = 0x100 NLMSG_ALIGNTO = 0x4 NLMSG_DONE = 0x3 NLMSG_ERROR = 0x2 NLMSG_HDRLEN = 0x10 NLMSG_MIN_TYPE = 0x10 NLMSG_NOOP = 0x1 NLMSG_OVERRUN = 0x4 NLM_F_ACK = 0x4 NLM_F_APPEND = 0x800 NLM_F_ATOMIC = 0x400 NLM_F_CREATE = 0x400 NLM_F_DUMP = 0x300 NLM_F_DUMP_FILTERED = 0x20 NLM_F_DUMP_INTR = 0x10 NLM_F_ECHO = 0x8 NLM_F_EXCL = 0x200 NLM_F_MATCH = 0x200 NLM_F_MULTI = 0x2 NLM_F_REPLACE = 0x100 NLM_F_REQUEST = 0x1 NLM_F_ROOT = 0x100 NOFLSH = 0x80 OCRNL = 0x8 OFDEL = 0x80 OFILL = 0x40 OLCUC = 0x2 ONLCR = 0x4 ONLRET = 0x20 ONOCR = 0x10 OPOST = 0x1 O_ACCMODE = 0x3 O_APPEND = 0x8 O_ASYNC = 0x40 O_CLOEXEC = 0x400000 O_CREAT = 0x200 O_DIRECT = 0x100000 O_DIRECTORY = 0x10000 O_DSYNC = 0x2000 O_EXCL = 0x800 O_FSYNC = 0x802000 O_LARGEFILE = 0x0 O_NDELAY = 0x4004 O_NOATIME = 0x200000 O_NOCTTY = 0x8000 O_NOFOLLOW = 0x20000 O_NONBLOCK = 0x4000 O_PATH = 0x1000000 O_RDONLY = 0x0 O_RDWR = 0x2 O_RSYNC = 0x802000 O_SYNC = 0x802000 O_TMPFILE = 0x2010000 O_TRUNC = 0x400 O_WRONLY = 0x1 PACKET_ADD_MEMBERSHIP = 0x1 PACKET_AUXDATA = 0x8 PACKET_BROADCAST = 0x1 PACKET_COPY_THRESH = 0x7 PACKET_DROP_MEMBERSHIP = 0x2 PACKET_FANOUT = 0x12 PACKET_FANOUT_CBPF = 0x6 PACKET_FANOUT_CPU = 0x2 PACKET_FANOUT_DATA = 0x16 PACKET_FANOUT_EBPF = 0x7 PACKET_FANOUT_FLAG_DEFRAG = 0x8000 PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 PACKET_FANOUT_HASH = 0x0 PACKET_FANOUT_LB = 0x1 PACKET_FANOUT_QM = 0x5 PACKET_FANOUT_RND = 0x4 PACKET_FANOUT_ROLLOVER = 0x3 PACKET_FASTROUTE = 0x6 PACKET_HDRLEN = 0xb PACKET_HOST = 0x0 PACKET_KERNEL = 0x7 PACKET_LOOPBACK = 0x5 PACKET_LOSS = 0xe PACKET_MR_ALLMULTI = 0x2 PACKET_MR_MULTICAST = 0x0 PACKET_MR_PROMISC = 0x1 PACKET_MR_UNICAST = 0x3 PACKET_MULTICAST = 0x2 PACKET_ORIGDEV = 0x9 PACKET_OTHERHOST = 0x3 PACKET_OUTGOING = 0x4 PACKET_QDISC_BYPASS = 0x14 PACKET_RECV_OUTPUT = 0x3 PACKET_RESERVE = 0xc PACKET_ROLLOVER_STATS = 0x15 PACKET_RX_RING = 0x5 PACKET_STATISTICS = 0x6 PACKET_TIMESTAMP = 0x11 PACKET_TX_HAS_OFF = 0x13 PACKET_TX_RING = 0xd PACKET_TX_TIMESTAMP = 0x10 PACKET_USER = 0x6 PACKET_VERSION = 0xa PACKET_VNET_HDR = 0xf PARENB = 0x100 PARITY_CRC16_PR0 = 0x2 PARITY_CRC16_PR0_CCITT = 0x4 PARITY_CRC16_PR1 = 0x3 PARITY_CRC16_PR1_CCITT = 0x5 PARITY_CRC32_PR0_CCITT = 0x6 PARITY_CRC32_PR1_CCITT = 0x7 PARITY_DEFAULT = 0x0 PARITY_NONE = 0x1 PARMRK = 0x8 PARODD = 0x200 PENDIN = 0x4000 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 PROT_EXEC = 0x4 PROT_GROWSDOWN = 0x1000000 PROT_GROWSUP = 0x2000000 PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 PR_CAPBSET_DROP = 0x18 PR_CAPBSET_READ = 0x17 PR_CAP_AMBIENT = 0x2f PR_CAP_AMBIENT_CLEAR_ALL = 0x4 PR_CAP_AMBIENT_IS_SET = 0x1 PR_CAP_AMBIENT_LOWER = 0x3 PR_CAP_AMBIENT_RAISE = 0x2 PR_ENDIAN_BIG = 0x0 PR_ENDIAN_LITTLE = 0x1 PR_ENDIAN_PPC_LITTLE = 0x2 PR_FPEMU_NOPRINT = 0x1 PR_FPEMU_SIGFPE = 0x2 PR_FP_EXC_ASYNC = 0x2 PR_FP_EXC_DISABLED = 0x0 PR_FP_EXC_DIV = 0x10000 PR_FP_EXC_INV = 0x100000 PR_FP_EXC_NONRECOV = 0x1 PR_FP_EXC_OVF = 0x20000 PR_FP_EXC_PRECISE = 0x3 PR_FP_EXC_RES = 0x80000 PR_FP_EXC_SW_ENABLE = 0x80 PR_FP_EXC_UND = 0x40000 PR_FP_MODE_FR = 0x1 PR_FP_MODE_FRE = 0x2 PR_GET_CHILD_SUBREAPER = 0x25 PR_GET_DUMPABLE = 0x3 PR_GET_ENDIAN = 0x13 PR_GET_FPEMU = 0x9 PR_GET_FPEXC = 0xb PR_GET_FP_MODE = 0x2e PR_GET_KEEPCAPS = 0x7 PR_GET_NAME = 0x10 PR_GET_NO_NEW_PRIVS = 0x27 PR_GET_PDEATHSIG = 0x2 PR_GET_SECCOMP = 0x15 PR_GET_SECUREBITS = 0x1b PR_GET_THP_DISABLE = 0x2a PR_GET_TID_ADDRESS = 0x28 PR_GET_TIMERSLACK = 0x1e PR_GET_TIMING = 0xd PR_GET_TSC = 0x19 PR_GET_UNALIGN = 0x5 PR_MCE_KILL = 0x21 PR_MCE_KILL_CLEAR = 0x0 PR_MCE_KILL_DEFAULT = 0x2 PR_MCE_KILL_EARLY = 0x1 PR_MCE_KILL_GET = 0x22 PR_MCE_KILL_LATE = 0x0 PR_MCE_KILL_SET = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b PR_SET_CHILD_SUBREAPER = 0x24 PR_SET_DUMPABLE = 0x4 PR_SET_ENDIAN = 0x14 PR_SET_FPEMU = 0xa PR_SET_FPEXC = 0xc PR_SET_FP_MODE = 0x2d PR_SET_KEEPCAPS = 0x8 PR_SET_MM = 0x23 PR_SET_MM_ARG_END = 0x9 PR_SET_MM_ARG_START = 0x8 PR_SET_MM_AUXV = 0xc PR_SET_MM_BRK = 0x7 PR_SET_MM_END_CODE = 0x2 PR_SET_MM_END_DATA = 0x4 PR_SET_MM_ENV_END = 0xb PR_SET_MM_ENV_START = 0xa PR_SET_MM_EXE_FILE = 0xd PR_SET_MM_MAP = 0xe PR_SET_MM_MAP_SIZE = 0xf PR_SET_MM_START_BRK = 0x6 PR_SET_MM_START_CODE = 0x1 PR_SET_MM_START_DATA = 0x3 PR_SET_MM_START_STACK = 0x5 PR_SET_NAME = 0xf PR_SET_NO_NEW_PRIVS = 0x26 PR_SET_PDEATHSIG = 0x1 PR_SET_PTRACER = 0x59616d61 PR_SET_PTRACER_ANY = -0x1 PR_SET_SECCOMP = 0x16 PR_SET_SECUREBITS = 0x1c PR_SET_THP_DISABLE = 0x29 PR_SET_TIMERSLACK = 0x1d PR_SET_TIMING = 0xe PR_SET_TSC = 0x1a PR_SET_UNALIGN = 0x6 PR_TASK_PERF_EVENTS_DISABLE = 0x1f PR_TASK_PERF_EVENTS_ENABLE = 0x20 PR_TIMING_STATISTICAL = 0x0 PR_TIMING_TIMESTAMP = 0x1 PR_TSC_ENABLE = 0x1 PR_TSC_SIGSEGV = 0x2 PR_UNALIGN_NOPRINT = 0x1 PR_UNALIGN_SIGBUS = 0x2 PTRACE_ATTACH = 0x10 PTRACE_CONT = 0x7 PTRACE_DETACH = 0x11 PTRACE_EVENT_CLONE = 0x3 PTRACE_EVENT_EXEC = 0x4 PTRACE_EVENT_EXIT = 0x6 PTRACE_EVENT_FORK = 0x1 PTRACE_EVENT_SECCOMP = 0x7 PTRACE_EVENT_STOP = 0x80 PTRACE_EVENT_VFORK = 0x2 PTRACE_EVENT_VFORK_DONE = 0x5 PTRACE_GETEVENTMSG = 0x4201 PTRACE_GETFPAREGS = 0x14 PTRACE_GETFPREGS = 0xe PTRACE_GETFPREGS64 = 0x19 PTRACE_GETREGS = 0xc PTRACE_GETREGS64 = 0x16 PTRACE_GETREGSET = 0x4204 PTRACE_GETSIGINFO = 0x4202 PTRACE_GETSIGMASK = 0x420a PTRACE_INTERRUPT = 0x4207 PTRACE_KILL = 0x8 PTRACE_LISTEN = 0x4208 PTRACE_O_EXITKILL = 0x100000 PTRACE_O_MASK = 0x3000ff PTRACE_O_SUSPEND_SECCOMP = 0x200000 PTRACE_O_TRACECLONE = 0x8 PTRACE_O_TRACEEXEC = 0x10 PTRACE_O_TRACEEXIT = 0x40 PTRACE_O_TRACEFORK = 0x2 PTRACE_O_TRACESECCOMP = 0x80 PTRACE_O_TRACESYSGOOD = 0x1 PTRACE_O_TRACEVFORK = 0x4 PTRACE_O_TRACEVFORKDONE = 0x20 PTRACE_PEEKDATA = 0x2 PTRACE_PEEKSIGINFO = 0x4209 PTRACE_PEEKSIGINFO_SHARED = 0x1 PTRACE_PEEKTEXT = 0x1 PTRACE_PEEKUSR = 0x3 PTRACE_POKEDATA = 0x5 PTRACE_POKETEXT = 0x4 PTRACE_POKEUSR = 0x6 PTRACE_READDATA = 0x10 PTRACE_READTEXT = 0x12 PTRACE_SECCOMP_GET_FILTER = 0x420c PTRACE_SEIZE = 0x4206 PTRACE_SETFPAREGS = 0x15 PTRACE_SETFPREGS = 0xf PTRACE_SETFPREGS64 = 0x1a PTRACE_SETOPTIONS = 0x4200 PTRACE_SETREGS = 0xd PTRACE_SETREGS64 = 0x17 PTRACE_SETREGSET = 0x4205 PTRACE_SETSIGINFO = 0x4203 PTRACE_SETSIGMASK = 0x420b PTRACE_SINGLESTEP = 0x9 PTRACE_SPARC_DETACH = 0xb PTRACE_SYSCALL = 0x18 PTRACE_TRACEME = 0x0 PTRACE_WRITEDATA = 0x11 PTRACE_WRITETEXT = 0x13 PT_FP = 0x48 PT_G0 = 0x10 PT_G1 = 0x14 PT_G2 = 0x18 PT_G3 = 0x1c PT_G4 = 0x20 PT_G5 = 0x24 PT_G6 = 0x28 PT_G7 = 0x2c PT_I0 = 0x30 PT_I1 = 0x34 PT_I2 = 0x38 PT_I3 = 0x3c PT_I4 = 0x40 PT_I5 = 0x44 PT_I6 = 0x48 PT_I7 = 0x4c PT_NPC = 0x8 PT_PC = 0x4 PT_PSR = 0x0 PT_REGS_MAGIC = 0x57ac6c00 PT_TNPC = 0x90 PT_TPC = 0x88 PT_TSTATE = 0x80 PT_V9_FP = 0x70 PT_V9_G0 = 0x0 PT_V9_G1 = 0x8 PT_V9_G2 = 0x10 PT_V9_G3 = 0x18 PT_V9_G4 = 0x20 PT_V9_G5 = 0x28 PT_V9_G6 = 0x30 PT_V9_G7 = 0x38 PT_V9_I0 = 0x40 PT_V9_I1 = 0x48 PT_V9_I2 = 0x50 PT_V9_I3 = 0x58 PT_V9_I4 = 0x60 PT_V9_I5 = 0x68 PT_V9_I6 = 0x70 PT_V9_I7 = 0x78 PT_V9_MAGIC = 0x9c PT_V9_TNPC = 0x90 PT_V9_TPC = 0x88 PT_V9_TSTATE = 0x80 PT_V9_Y = 0x98 PT_WIM = 0x10 PT_Y = 0xc RLIMIT_AS = 0x9 RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 RLIMIT_NOFILE = 0x6 RLIMIT_STACK = 0x3 RLIM_INFINITY = -0x1 RTAX_ADVMSS = 0x8 RTAX_CC_ALGO = 0x10 RTAX_CWND = 0x7 RTAX_FEATURES = 0xc RTAX_FEATURE_ALLFRAG = 0x8 RTAX_FEATURE_ECN = 0x1 RTAX_FEATURE_MASK = 0xf RTAX_FEATURE_SACK = 0x2 RTAX_FEATURE_TIMESTAMP = 0x4 RTAX_HOPLIMIT = 0xa RTAX_INITCWND = 0xb RTAX_INITRWND = 0xe RTAX_LOCK = 0x1 RTAX_MAX = 0x10 RTAX_MTU = 0x2 RTAX_QUICKACK = 0xf RTAX_REORDERING = 0x9 RTAX_RTO_MIN = 0xd RTAX_RTT = 0x4 RTAX_RTTVAR = 0x5 RTAX_SSTHRESH = 0x6 RTAX_UNSPEC = 0x0 RTAX_WINDOW = 0x3 RTA_ALIGNTO = 0x4 RTA_MAX = 0x18 RTCF_DIRECTSRC = 0x4000000 RTCF_DOREDIRECT = 0x1000000 RTCF_LOG = 0x2000000 RTCF_MASQ = 0x400000 RTCF_NAT = 0x800000 RTCF_VALVE = 0x200000 RTF_ADDRCLASSMASK = 0xf8000000 RTF_ADDRCONF = 0x40000 RTF_ALLONLINK = 0x20000 RTF_BROADCAST = 0x10000000 RTF_CACHE = 0x1000000 RTF_DEFAULT = 0x10000 RTF_DYNAMIC = 0x10 RTF_FLOW = 0x2000000 RTF_GATEWAY = 0x2 RTF_HOST = 0x4 RTF_INTERFACE = 0x40000000 RTF_IRTT = 0x100 RTF_LINKRT = 0x100000 RTF_LOCAL = 0x80000000 RTF_MODIFIED = 0x20 RTF_MSS = 0x40 RTF_MTU = 0x40 RTF_MULTICAST = 0x20000000 RTF_NAT = 0x8000000 RTF_NOFORWARD = 0x1000 RTF_NONEXTHOP = 0x200000 RTF_NOPMTUDISC = 0x4000 RTF_POLICY = 0x4000000 RTF_REINSTATE = 0x8 RTF_REJECT = 0x200 RTF_STATIC = 0x400 RTF_THROW = 0x2000 RTF_UP = 0x1 RTF_WINDOW = 0x80 RTF_XRESOLVE = 0x800 RTM_BASE = 0x10 RTM_DELACTION = 0x31 RTM_DELADDR = 0x15 RTM_DELADDRLABEL = 0x49 RTM_DELLINK = 0x11 RTM_DELMDB = 0x55 RTM_DELNEIGH = 0x1d RTM_DELNSID = 0x59 RTM_DELQDISC = 0x25 RTM_DELROUTE = 0x19 RTM_DELRULE = 0x21 RTM_DELTCLASS = 0x29 RTM_DELTFILTER = 0x2d RTM_F_CLONED = 0x200 RTM_F_EQUALIZE = 0x400 RTM_F_LOOKUP_TABLE = 0x1000 RTM_F_NOTIFY = 0x100 RTM_F_PREFIX = 0x800 RTM_GETACTION = 0x32 RTM_GETADDR = 0x16 RTM_GETADDRLABEL = 0x4a RTM_GETANYCAST = 0x3e RTM_GETDCB = 0x4e RTM_GETLINK = 0x12 RTM_GETMDB = 0x56 RTM_GETMULTICAST = 0x3a RTM_GETNEIGH = 0x1e RTM_GETNEIGHTBL = 0x42 RTM_GETNETCONF = 0x52 RTM_GETNSID = 0x5a RTM_GETQDISC = 0x26 RTM_GETROUTE = 0x1a RTM_GETRULE = 0x22 RTM_GETSTATS = 0x5e RTM_GETTCLASS = 0x2a RTM_GETTFILTER = 0x2e RTM_MAX = 0x5f RTM_NEWACTION = 0x30 RTM_NEWADDR = 0x14 RTM_NEWADDRLABEL = 0x48 RTM_NEWLINK = 0x10 RTM_NEWMDB = 0x54 RTM_NEWNDUSEROPT = 0x44 RTM_NEWNEIGH = 0x1c RTM_NEWNEIGHTBL = 0x40 RTM_NEWNETCONF = 0x50 RTM_NEWNSID = 0x58 RTM_NEWPREFIX = 0x34 RTM_NEWQDISC = 0x24 RTM_NEWROUTE = 0x18 RTM_NEWRULE = 0x20 RTM_NEWSTATS = 0x5c RTM_NEWTCLASS = 0x28 RTM_NEWTFILTER = 0x2c RTM_NR_FAMILIES = 0x14 RTM_NR_MSGTYPES = 0x50 RTM_SETDCB = 0x4f RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 RTNH_ALIGNTO = 0x4 RTNH_COMPARE_MASK = 0x11 RTNH_F_DEAD = 0x1 RTNH_F_LINKDOWN = 0x10 RTNH_F_OFFLOAD = 0x8 RTNH_F_ONLINK = 0x4 RTNH_F_PERVASIVE = 0x2 RTN_MAX = 0xb RTPROT_BABEL = 0x2a RTPROT_BIRD = 0xc RTPROT_BOOT = 0x3 RTPROT_DHCP = 0x10 RTPROT_DNROUTED = 0xd RTPROT_GATED = 0x8 RTPROT_KERNEL = 0x2 RTPROT_MROUTED = 0x11 RTPROT_MRT = 0xa RTPROT_NTK = 0xf RTPROT_RA = 0x9 RTPROT_REDIRECT = 0x1 RTPROT_STATIC = 0x4 RTPROT_UNSPEC = 0x0 RTPROT_XORP = 0xe RTPROT_ZEBRA = 0xb RT_CLASS_DEFAULT = 0xfd RT_CLASS_LOCAL = 0xff RT_CLASS_MAIN = 0xfe RT_CLASS_MAX = 0xff RT_CLASS_UNSPEC = 0x0 RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 RUSAGE_THREAD = 0x1 SCM_CREDENTIALS = 0x2 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x1d SCM_TIMESTAMPING = 0x23 SCM_TIMESTAMPNS = 0x21 SCM_WIFI_STATUS = 0x25 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 SIOCADDDLCI = 0x8980 SIOCADDMULTI = 0x8931 SIOCADDRT = 0x890b SIOCATMARK = 0x8905 SIOCBONDCHANGEACTIVE = 0x8995 SIOCBONDENSLAVE = 0x8990 SIOCBONDINFOQUERY = 0x8994 SIOCBONDRELEASE = 0x8991 SIOCBONDSETHWADDR = 0x8992 SIOCBONDSLAVEINFOQUERY = 0x8993 SIOCBRADDBR = 0x89a0 SIOCBRADDIF = 0x89a2 SIOCBRDELBR = 0x89a1 SIOCBRDELIF = 0x89a3 SIOCDARP = 0x8953 SIOCDELDLCI = 0x8981 SIOCDELMULTI = 0x8932 SIOCDELRT = 0x890c SIOCDEVPRIVATE = 0x89f0 SIOCDIFADDR = 0x8936 SIOCDRARP = 0x8960 SIOCETHTOOL = 0x8946 SIOCGARP = 0x8954 SIOCGHWTSTAMP = 0x89b1 SIOCGIFADDR = 0x8915 SIOCGIFBR = 0x8940 SIOCGIFBRDADDR = 0x8919 SIOCGIFCONF = 0x8912 SIOCGIFCOUNT = 0x8938 SIOCGIFDSTADDR = 0x8917 SIOCGIFENCAP = 0x8925 SIOCGIFFLAGS = 0x8913 SIOCGIFHWADDR = 0x8927 SIOCGIFINDEX = 0x8933 SIOCGIFMAP = 0x8970 SIOCGIFMEM = 0x891f SIOCGIFMETRIC = 0x891d SIOCGIFMTU = 0x8921 SIOCGIFNAME = 0x8910 SIOCGIFNETMASK = 0x891b SIOCGIFPFLAGS = 0x8935 SIOCGIFSLAVE = 0x8929 SIOCGIFTXQLEN = 0x8942 SIOCGIFVLAN = 0x8982 SIOCGMIIPHY = 0x8947 SIOCGMIIREG = 0x8948 SIOCGPGRP = 0x8904 SIOCGRARP = 0x8961 SIOCGSTAMP = 0x8906 SIOCGSTAMPNS = 0x8907 SIOCINQ = 0x4004667f SIOCOUTQ = 0x40047473 SIOCOUTQNSD = 0x894b SIOCPROTOPRIVATE = 0x89e0 SIOCRTMSG = 0x890d SIOCSARP = 0x8955 SIOCSHWTSTAMP = 0x89b0 SIOCSIFADDR = 0x8916 SIOCSIFBR = 0x8941 SIOCSIFBRDADDR = 0x891a SIOCSIFDSTADDR = 0x8918 SIOCSIFENCAP = 0x8926 SIOCSIFFLAGS = 0x8914 SIOCSIFHWADDR = 0x8924 SIOCSIFHWBROADCAST = 0x8937 SIOCSIFLINK = 0x8911 SIOCSIFMAP = 0x8971 SIOCSIFMEM = 0x8920 SIOCSIFMETRIC = 0x891e SIOCSIFMTU = 0x8922 SIOCSIFNAME = 0x8923 SIOCSIFNETMASK = 0x891c SIOCSIFPFLAGS = 0x8934 SIOCSIFSLAVE = 0x8930 SIOCSIFTXQLEN = 0x8943 SIOCSIFVLAN = 0x8983 SIOCSMIIREG = 0x8949 SIOCSPGRP = 0x8902 SIOCSRARP = 0x8962 SIOCWANDEV = 0x894a SOCK_CLOEXEC = 0x400000 SOCK_DCCP = 0x6 SOCK_DGRAM = 0x2 SOCK_NONBLOCK = 0x4000 SOCK_PACKET = 0xa SOCK_RAW = 0x3 SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x1 SOL_AAL = 0x109 SOL_ALG = 0x117 SOL_ATM = 0x108 SOL_CAIF = 0x116 SOL_DCCP = 0x10d SOL_DECNET = 0x105 SOL_ICMPV6 = 0x3a SOL_IP = 0x0 SOL_IPV6 = 0x29 SOL_IRDA = 0x10a SOL_IUCV = 0x115 SOL_KCM = 0x119 SOL_LLC = 0x10c SOL_NETBEUI = 0x10b SOL_NETLINK = 0x10e SOL_NFC = 0x118 SOL_PACKET = 0x107 SOL_PNPIPE = 0x113 SOL_PPPOL2TP = 0x111 SOL_RAW = 0xff SOL_RDS = 0x114 SOL_RXRPC = 0x110 SOL_SOCKET = 0xffff SOL_TCP = 0x6 SOL_TIPC = 0x10f SOL_X25 = 0x106 SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x8000 SO_ATTACH_BPF = 0x34 SO_ATTACH_FILTER = 0x1a SO_ATTACH_REUSEPORT_CBPF = 0x35 SO_ATTACH_REUSEPORT_EBPF = 0x36 SO_BINDTODEVICE = 0xd SO_BPF_EXTENSIONS = 0x32 SO_BROADCAST = 0x20 SO_BSDCOMPAT = 0x400 SO_BUSY_POLL = 0x30 SO_CNX_ADVICE = 0x37 SO_DEBUG = 0x1 SO_DETACH_BPF = 0x1b SO_DETACH_FILTER = 0x1b SO_DOMAIN = 0x1029 SO_DONTROUTE = 0x10 SO_ERROR = 0x1007 SO_GET_FILTER = 0x1a SO_INCOMING_CPU = 0x33 SO_KEEPALIVE = 0x8 SO_LINGER = 0x80 SO_LOCK_FILTER = 0x28 SO_MARK = 0x22 SO_MAX_PACING_RATE = 0x31 SO_NOFCS = 0x27 SO_NO_CHECK = 0xb SO_OOBINLINE = 0x100 SO_PASSCRED = 0x2 SO_PASSSEC = 0x1f SO_PEEK_OFF = 0x26 SO_PEERCRED = 0x40 SO_PEERNAME = 0x1c SO_PEERSEC = 0x1e SO_PRIORITY = 0xc SO_PROTOCOL = 0x1028 SO_RCVBUF = 0x1002 SO_RCVBUFFORCE = 0x100b SO_RCVLOWAT = 0x800 SO_RCVTIMEO = 0x2000 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_RXQ_OVFL = 0x24 SO_SECURITY_AUTHENTICATION = 0x5001 SO_SECURITY_ENCRYPTION_NETWORK = 0x5004 SO_SECURITY_ENCRYPTION_TRANSPORT = 0x5002 SO_SELECT_ERR_QUEUE = 0x29 SO_SNDBUF = 0x1001 SO_SNDBUFFORCE = 0x100a SO_SNDLOWAT = 0x1000 SO_SNDTIMEO = 0x4000 SO_TIMESTAMP = 0x1d SO_TIMESTAMPING = 0x23 SO_TIMESTAMPNS = 0x21 SO_TYPE = 0x1008 SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 SO_VM_SOCKETS_BUFFER_SIZE = 0x0 SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 SO_VM_SOCKETS_TRUSTED = 0x5 SO_WIFI_STATUS = 0x25 SPLICE_F_GIFT = 0x8 SPLICE_F_MORE = 0x4 SPLICE_F_MOVE = 0x1 SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000 S_IFCHR = 0x2000 S_IFDIR = 0x4000 S_IFIFO = 0x1000 S_IFLNK = 0xa000 S_IFMT = 0xf000 S_IFREG = 0x8000 S_IFSOCK = 0xc000 S_IREAD = 0x100 S_IRGRP = 0x20 S_IROTH = 0x4 S_IRUSR = 0x100 S_IRWXG = 0x38 S_IRWXO = 0x7 S_IRWXU = 0x1c0 S_ISGID = 0x400 S_ISUID = 0x800 S_ISVTX = 0x200 S_IWGRP = 0x10 S_IWOTH = 0x2 S_IWRITE = 0x80 S_IWUSR = 0x80 S_IXGRP = 0x8 S_IXOTH = 0x1 S_IXUSR = 0x40 TAB0 = 0x0 TAB1 = 0x800 TAB2 = 0x1000 TAB3 = 0x1800 TABDLY = 0x1800 TCFLSH = 0x20005407 TCGETA = 0x40125401 TCGETS = 0x40245408 TCGETS2 = 0x402c540c TCIFLUSH = 0x0 TCIOFF = 0x2 TCIOFLUSH = 0x2 TCION = 0x3 TCOFLUSH = 0x1 TCOOFF = 0x0 TCOON = 0x1 TCP_CC_INFO = 0x1a TCP_CONGESTION = 0xd TCP_COOKIE_IN_ALWAYS = 0x1 TCP_COOKIE_MAX = 0x10 TCP_COOKIE_MIN = 0x8 TCP_COOKIE_OUT_NEVER = 0x2 TCP_COOKIE_PAIR_SIZE = 0x20 TCP_COOKIE_TRANSACTIONS = 0xf TCP_CORK = 0x3 TCP_DEFER_ACCEPT = 0x9 TCP_FASTOPEN = 0x17 TCP_INFO = 0xb TCP_KEEPCNT = 0x6 TCP_KEEPIDLE = 0x4 TCP_KEEPINTVL = 0x5 TCP_LINGER2 = 0x8 TCP_MAXSEG = 0x2 TCP_MAXWIN = 0xffff TCP_MAX_WINSHIFT = 0xe TCP_MD5SIG = 0xe TCP_MD5SIG_MAXKEYLEN = 0x50 TCP_MSS = 0x200 TCP_MSS_DEFAULT = 0x218 TCP_MSS_DESIRED = 0x4c4 TCP_NODELAY = 0x1 TCP_NOTSENT_LOWAT = 0x19 TCP_QUEUE_SEQ = 0x15 TCP_QUICKACK = 0xc TCP_REPAIR = 0x13 TCP_REPAIR_OPTIONS = 0x16 TCP_REPAIR_QUEUE = 0x14 TCP_SAVED_SYN = 0x1c TCP_SAVE_SYN = 0x1b TCP_SYNCNT = 0x7 TCP_S_DATA_IN = 0x4 TCP_S_DATA_OUT = 0x8 TCP_THIN_DUPACK = 0x11 TCP_THIN_LINEAR_TIMEOUTS = 0x10 TCP_TIMESTAMP = 0x18 TCP_USER_TIMEOUT = 0x12 TCP_WINDOW_CLAMP = 0xa TCSAFLUSH = 0x2 TCSBRK = 0x20005405 TCSBRKP = 0x5425 TCSETA = 0x80125402 TCSETAF = 0x80125404 TCSETAW = 0x80125403 TCSETS = 0x80245409 TCSETS2 = 0x802c540d TCSETSF = 0x8024540b TCSETSF2 = 0x802c540f TCSETSW = 0x8024540a TCSETSW2 = 0x802c540e TCXONC = 0x20005406 TIOCCBRK = 0x2000747a TIOCCONS = 0x20007424 TIOCEXCL = 0x2000740d TIOCGDEV = 0x40045432 TIOCGETD = 0x40047400 TIOCGEXCL = 0x40045440 TIOCGICOUNT = 0x545d TIOCGLCKTRMIOS = 0x5456 TIOCGPGRP = 0x40047483 TIOCGPKT = 0x40045438 TIOCGPTLCK = 0x40045439 TIOCGPTN = 0x40047486 TIOCGRS485 = 0x40205441 TIOCGSERIAL = 0x541e TIOCGSID = 0x40047485 TIOCGSOFTCAR = 0x40047464 TIOCGWINSZ = 0x40087468 TIOCINQ = 0x4004667f TIOCLINUX = 0x541c TIOCMBIC = 0x8004746b TIOCMBIS = 0x8004746c TIOCMGET = 0x4004746a TIOCMIWAIT = 0x545c TIOCMSET = 0x8004746d TIOCM_CAR = 0x40 TIOCM_CD = 0x40 TIOCM_CTS = 0x20 TIOCM_DSR = 0x100 TIOCM_DTR = 0x2 TIOCM_LE = 0x1 TIOCM_LOOP = 0x8000 TIOCM_OUT1 = 0x2000 TIOCM_OUT2 = 0x4000 TIOCM_RI = 0x80 TIOCM_RNG = 0x80 TIOCM_RTS = 0x4 TIOCM_SR = 0x10 TIOCM_ST = 0x8 TIOCNOTTY = 0x20007471 TIOCNXCL = 0x2000740e TIOCOUTQ = 0x40047473 TIOCPKT = 0x80047470 TIOCPKT_DATA = 0x0 TIOCPKT_DOSTOP = 0x20 TIOCPKT_FLUSHREAD = 0x1 TIOCPKT_FLUSHWRITE = 0x2 TIOCPKT_IOCTL = 0x40 TIOCPKT_NOSTOP = 0x10 TIOCPKT_START = 0x8 TIOCPKT_STOP = 0x4 TIOCSBRK = 0x2000747b TIOCSCTTY = 0x20007484 TIOCSERCONFIG = 0x5453 TIOCSERGETLSR = 0x5459 TIOCSERGETMULTI = 0x545a TIOCSERGSTRUCT = 0x5458 TIOCSERGWILD = 0x5454 TIOCSERSETMULTI = 0x545b TIOCSERSWILD = 0x5455 TIOCSER_TEMT = 0x1 TIOCSETD = 0x80047401 TIOCSIG = 0x80047488 TIOCSLCKTRMIOS = 0x5457 TIOCSPGRP = 0x80047482 TIOCSPTLCK = 0x80047487 TIOCSRS485 = 0xc0205442 TIOCSSERIAL = 0x541f TIOCSSOFTCAR = 0x80047465 TIOCSTART = 0x2000746e TIOCSTI = 0x80017472 TIOCSTOP = 0x2000746f TIOCSWINSZ = 0x80087467 TIOCVHANGUP = 0x20005437 TOSTOP = 0x100 TUNATTACHFILTER = 0x801054d5 TUNDETACHFILTER = 0x801054d6 TUNGETFEATURES = 0x400454cf TUNGETFILTER = 0x401054db TUNGETIFF = 0x400454d2 TUNGETSNDBUF = 0x400454d3 TUNGETVNETBE = 0x400454df TUNGETVNETHDRSZ = 0x400454d7 TUNGETVNETLE = 0x400454dd TUNSETDEBUG = 0x800454c9 TUNSETGROUP = 0x800454ce TUNSETIFF = 0x800454ca TUNSETIFINDEX = 0x800454da TUNSETLINK = 0x800454cd TUNSETNOCSUM = 0x800454c8 TUNSETOFFLOAD = 0x800454d0 TUNSETOWNER = 0x800454cc TUNSETPERSIST = 0x800454cb TUNSETQUEUE = 0x800454d9 TUNSETSNDBUF = 0x800454d4 TUNSETTXFILTER = 0x800454d1 TUNSETVNETBE = 0x800454de TUNSETVNETHDRSZ = 0x800454d8 TUNSETVNETLE = 0x800454dc VDISCARD = 0xd VDSUSP = 0xb VEOF = 0x4 VEOL = 0x5 VEOL2 = 0x6 VERASE = 0x2 VINTR = 0x0 VKILL = 0x3 VLNEXT = 0xf VMADDR_CID_ANY = 0xffffffff VMADDR_CID_HOST = 0x2 VMADDR_CID_HYPERVISOR = 0x0 VMADDR_CID_RESERVED = 0x1 VMADDR_PORT_ANY = 0xffffffff VMIN = 0x4 VQUIT = 0x1 VREPRINT = 0xc VSTART = 0x8 VSTOP = 0x9 VSUSP = 0xa VSWTC = 0x7 VT0 = 0x0 VT1 = 0x4000 VTDLY = 0x4000 VTIME = 0x5 VWERASE = 0xe WALL = 0x40000000 WCLONE = 0x80000000 WCONTINUED = 0x8 WEXITED = 0x4 WNOHANG = 0x1 WNOTHREAD = 0x20000000 WNOWAIT = 0x1000000 WORDSIZE = 0x40 WRAP = 0x20000 WSTOPPED = 0x2 WUNTRACED = 0x2 XCASE = 0x4 XTABS = 0x1800 __TIOCFLUSH = 0x80047410 ) // Errors const ( E2BIG = syscall.Errno(0x7) EACCES = syscall.Errno(0xd) EADDRINUSE = syscall.Errno(0x30) EADDRNOTAVAIL = syscall.Errno(0x31) EADV = syscall.Errno(0x53) EAFNOSUPPORT = syscall.Errno(0x2f) EAGAIN = syscall.Errno(0xb) EALREADY = syscall.Errno(0x25) EBADE = syscall.Errno(0x66) EBADF = syscall.Errno(0x9) EBADFD = syscall.Errno(0x5d) EBADMSG = syscall.Errno(0x4c) EBADR = syscall.Errno(0x67) EBADRQC = syscall.Errno(0x6a) EBADSLT = syscall.Errno(0x6b) EBFONT = syscall.Errno(0x6d) EBUSY = syscall.Errno(0x10) ECANCELED = syscall.Errno(0x7f) ECHILD = syscall.Errno(0xa) ECHRNG = syscall.Errno(0x5e) ECOMM = syscall.Errno(0x55) ECONNABORTED = syscall.Errno(0x35) ECONNREFUSED = syscall.Errno(0x3d) ECONNRESET = syscall.Errno(0x36) EDEADLK = syscall.Errno(0x4e) EDEADLOCK = syscall.Errno(0x6c) EDESTADDRREQ = syscall.Errno(0x27) EDOM = syscall.Errno(0x21) EDOTDOT = syscall.Errno(0x58) EDQUOT = syscall.Errno(0x45) EEXIST = syscall.Errno(0x11) EFAULT = syscall.Errno(0xe) EFBIG = syscall.Errno(0x1b) EHOSTDOWN = syscall.Errno(0x40) EHOSTUNREACH = syscall.Errno(0x41) EHWPOISON = syscall.Errno(0x87) EIDRM = syscall.Errno(0x4d) EILSEQ = syscall.Errno(0x7a) EINPROGRESS = syscall.Errno(0x24) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x38) EISDIR = syscall.Errno(0x15) EISNAM = syscall.Errno(0x78) EKEYEXPIRED = syscall.Errno(0x81) EKEYREJECTED = syscall.Errno(0x83) EKEYREVOKED = syscall.Errno(0x82) EL2HLT = syscall.Errno(0x65) EL2NSYNC = syscall.Errno(0x5f) EL3HLT = syscall.Errno(0x60) EL3RST = syscall.Errno(0x61) ELIBACC = syscall.Errno(0x72) ELIBBAD = syscall.Errno(0x70) ELIBEXEC = syscall.Errno(0x6e) ELIBMAX = syscall.Errno(0x7b) ELIBSCN = syscall.Errno(0x7c) ELNRNG = syscall.Errno(0x62) ELOOP = syscall.Errno(0x3e) EMEDIUMTYPE = syscall.Errno(0x7e) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) EMSGSIZE = syscall.Errno(0x28) EMULTIHOP = syscall.Errno(0x57) ENAMETOOLONG = syscall.Errno(0x3f) ENAVAIL = syscall.Errno(0x77) ENETDOWN = syscall.Errno(0x32) ENETRESET = syscall.Errno(0x34) ENETUNREACH = syscall.Errno(0x33) ENFILE = syscall.Errno(0x17) ENOANO = syscall.Errno(0x69) ENOBUFS = syscall.Errno(0x37) ENOCSI = syscall.Errno(0x64) ENODATA = syscall.Errno(0x6f) ENODEV = syscall.Errno(0x13) ENOENT = syscall.Errno(0x2) ENOEXEC = syscall.Errno(0x8) ENOKEY = syscall.Errno(0x80) ENOLCK = syscall.Errno(0x4f) ENOLINK = syscall.Errno(0x52) ENOMEDIUM = syscall.Errno(0x7d) ENOMEM = syscall.Errno(0xc) ENOMSG = syscall.Errno(0x4b) ENONET = syscall.Errno(0x50) ENOPKG = syscall.Errno(0x71) ENOPROTOOPT = syscall.Errno(0x2a) ENOSPC = syscall.Errno(0x1c) ENOSR = syscall.Errno(0x4a) ENOSTR = syscall.Errno(0x48) ENOSYS = syscall.Errno(0x5a) ENOTBLK = syscall.Errno(0xf) ENOTCONN = syscall.Errno(0x39) ENOTDIR = syscall.Errno(0x14) ENOTEMPTY = syscall.Errno(0x42) ENOTNAM = syscall.Errno(0x76) ENOTRECOVERABLE = syscall.Errno(0x85) ENOTSOCK = syscall.Errno(0x26) ENOTSUP = syscall.Errno(0x2d) ENOTTY = syscall.Errno(0x19) ENOTUNIQ = syscall.Errno(0x73) ENXIO = syscall.Errno(0x6) EOPNOTSUPP = syscall.Errno(0x2d) EOVERFLOW = syscall.Errno(0x5c) EOWNERDEAD = syscall.Errno(0x84) EPERM = syscall.Errno(0x1) EPFNOSUPPORT = syscall.Errno(0x2e) EPIPE = syscall.Errno(0x20) EPROCLIM = syscall.Errno(0x43) EPROTO = syscall.Errno(0x56) EPROTONOSUPPORT = syscall.Errno(0x2b) EPROTOTYPE = syscall.Errno(0x29) ERANGE = syscall.Errno(0x22) EREMCHG = syscall.Errno(0x59) EREMOTE = syscall.Errno(0x47) EREMOTEIO = syscall.Errno(0x79) ERESTART = syscall.Errno(0x74) ERFKILL = syscall.Errno(0x86) EROFS = syscall.Errno(0x1e) ERREMOTE = syscall.Errno(0x51) ESHUTDOWN = syscall.Errno(0x3a) ESOCKTNOSUPPORT = syscall.Errno(0x2c) ESPIPE = syscall.Errno(0x1d) ESRCH = syscall.Errno(0x3) ESRMNT = syscall.Errno(0x54) ESTALE = syscall.Errno(0x46) ESTRPIPE = syscall.Errno(0x5b) ETIME = syscall.Errno(0x49) ETIMEDOUT = syscall.Errno(0x3c) ETOOMANYREFS = syscall.Errno(0x3b) ETXTBSY = syscall.Errno(0x1a) EUCLEAN = syscall.Errno(0x75) EUNATCH = syscall.Errno(0x63) EUSERS = syscall.Errno(0x44) EWOULDBLOCK = syscall.Errno(0xb) EXDEV = syscall.Errno(0x12) EXFULL = syscall.Errno(0x68) ) // Signals const ( SIGABRT = syscall.Signal(0x6) SIGALRM = syscall.Signal(0xe) SIGBUS = syscall.Signal(0xa) SIGCHLD = syscall.Signal(0x14) SIGCLD = syscall.Signal(0x14) SIGCONT = syscall.Signal(0x13) SIGEMT = syscall.Signal(0x7) SIGFPE = syscall.Signal(0x8) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x17) SIGIOT = syscall.Signal(0x6) SIGKILL = syscall.Signal(0x9) SIGLOST = syscall.Signal(0x1d) SIGPIPE = syscall.Signal(0xd) SIGPOLL = syscall.Signal(0x17) SIGPROF = syscall.Signal(0x1b) SIGPWR = syscall.Signal(0x1d) SIGQUIT = syscall.Signal(0x3) SIGSEGV = syscall.Signal(0xb) SIGSTOP = syscall.Signal(0x11) SIGSYS = syscall.Signal(0xc) SIGTERM = syscall.Signal(0xf) SIGTRAP = syscall.Signal(0x5) SIGTSTP = syscall.Signal(0x12) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) SIGURG = syscall.Signal(0x10) SIGUSR1 = syscall.Signal(0x1e) SIGUSR2 = syscall.Signal(0x1f) SIGVTALRM = syscall.Signal(0x1a) SIGWINCH = syscall.Signal(0x1c) SIGXCPU = syscall.Signal(0x18) SIGXFSZ = syscall.Signal(0x19) ) // Error table var errors = [...]string{ 1: "operation not permitted", 2: "no such file or directory", 3: "no such process", 4: "interrupted system call", 5: "input/output error", 6: "no such device or address", 7: "argument list too long", 8: "exec format error", 9: "bad file descriptor", 10: "no child processes", 11: "resource temporarily unavailable", 12: "cannot allocate memory", 13: "permission denied", 14: "bad address", 15: "block device required", 16: "device or resource busy", 17: "file exists", 18: "invalid cross-device link", 19: "no such device", 20: "not a directory", 21: "is a directory", 22: "invalid argument", 23: "too many open files in system", 24: "too many open files", 25: "inappropriate ioctl for device", 26: "text file busy", 27: "file too large", 28: "no space left on device", 29: "illegal seek", 30: "read-only file system", 31: "too many links", 32: "broken pipe", 33: "numerical argument out of domain", 34: "numerical result out of range", 36: "operation now in progress", 37: "operation already in progress", 38: "socket operation on non-socket", 39: "destination address required", 40: "message too long", 41: "protocol wrong type for socket", 42: "protocol not available", 43: "protocol not supported", 44: "socket type not supported", 45: "operation not supported", 46: "protocol family not supported", 47: "address family not supported by protocol", 48: "address already in use", 49: "cannot assign requested address", 50: "network is down", 51: "network is unreachable", 52: "network dropped connection on reset", 53: "software caused connection abort", 54: "connection reset by peer", 55: "no buffer space available", 56: "transport endpoint is already connected", 57: "transport endpoint is not connected", 58: "cannot send after transport endpoint shutdown", 59: "too many references: cannot splice", 60: "connection timed out", 61: "connection refused", 62: "too many levels of symbolic links", 63: "file name too long", 64: "host is down", 65: "no route to host", 66: "directory not empty", 67: "too many processes", 68: "too many users", 69: "disk quota exceeded", 70: "stale file handle", 71: "object is remote", 72: "device not a stream", 73: "timer expired", 74: "out of streams resources", 75: "no message of desired type", 76: "bad message", 77: "identifier removed", 78: "resource deadlock avoided", 79: "no locks available", 80: "machine is not on the network", 81: "unknown error 81", 82: "link has been severed", 83: "advertise error", 84: "srmount error", 85: "communication error on send", 86: "protocol error", 87: "multihop attempted", 88: "RFS specific error", 89: "remote address changed", 90: "function not implemented", 91: "streams pipe error", 92: "value too large for defined data type", 93: "file descriptor in bad state", 94: "channel number out of range", 95: "level 2 not synchronized", 96: "level 3 halted", 97: "level 3 reset", 98: "link number out of range", 99: "protocol driver not attached", 100: "no CSI structure available", 101: "level 2 halted", 102: "invalid exchange", 103: "invalid request descriptor", 104: "exchange full", 105: "no anode", 106: "invalid request code", 107: "invalid slot", 108: "file locking deadlock error", 109: "bad font file format", 110: "cannot exec a shared library directly", 111: "no data available", 112: "accessing a corrupted shared library", 113: "package not installed", 114: "can not access a needed shared library", 115: "name not unique on network", 116: "interrupted system call should be restarted", 117: "structure needs cleaning", 118: "not a XENIX named type file", 119: "no XENIX semaphores available", 120: "is a named type file", 121: "remote I/O error", 122: "invalid or incomplete multibyte or wide character", 123: "attempting to link in too many shared libraries", 124: ".lib section in a.out corrupted", 125: "no medium found", 126: "wrong medium type", 127: "operation canceled", 128: "required key not available", 129: "key has expired", 130: "key has been revoked", 131: "key was rejected by service", 132: "owner died", 133: "state not recoverable", 134: "operation not possible due to RF-kill", 135: "memory page has hardware error", } // Signal table var signals = [...]string{ 1: "hangup", 2: "interrupt", 3: "quit", 4: "illegal instruction", 5: "trace/breakpoint trap", 6: "aborted", 7: "EMT trap", 8: "floating point exception", 9: "killed", 10: "bus error", 11: "segmentation fault", 12: "bad system call", 13: "broken pipe", 14: "alarm clock", 15: "terminated", 16: "urgent I/O condition", 17: "stopped (signal)", 18: "stopped", 19: "continued", 20: "child exited", 21: "stopped (tty input)", 22: "stopped (tty output)", 23: "I/O possible", 24: "CPU time limit exceeded", 25: "file size limit exceeded", 26: "virtual timer expired", 27: "profiling timer expired", 28: "window changed", 29: "resource lost", 30: "user defined signal 1", 31: "user defined signal 2", } ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go ================================================ // mkerrors.sh -m32 // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT // +build 386,netbsd // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- -m32 _const.go package unix import "syscall" const ( AF_APPLETALK = 0x10 AF_ARP = 0x1c AF_BLUETOOTH = 0x1f AF_CCITT = 0xa AF_CHAOS = 0x5 AF_CNT = 0x15 AF_COIP = 0x14 AF_DATAKIT = 0x9 AF_DECnet = 0xc AF_DLI = 0xd AF_E164 = 0x1a AF_ECMA = 0x8 AF_HYLINK = 0xf AF_IEEE80211 = 0x20 AF_IMPLINK = 0x3 AF_INET = 0x2 AF_INET6 = 0x18 AF_IPX = 0x17 AF_ISDN = 0x1a AF_ISO = 0x7 AF_LAT = 0xe AF_LINK = 0x12 AF_LOCAL = 0x1 AF_MAX = 0x23 AF_MPLS = 0x21 AF_NATM = 0x1b AF_NS = 0x6 AF_OROUTE = 0x11 AF_OSI = 0x7 AF_PUP = 0x4 AF_ROUTE = 0x22 AF_SNA = 0xb AF_UNIX = 0x1 AF_UNSPEC = 0x0 ARPHRD_ARCNET = 0x7 ARPHRD_ETHER = 0x1 ARPHRD_FRELAY = 0xf ARPHRD_IEEE1394 = 0x18 ARPHRD_IEEE802 = 0x6 ARPHRD_STRIP = 0x17 B0 = 0x0 B110 = 0x6e B115200 = 0x1c200 B1200 = 0x4b0 B134 = 0x86 B14400 = 0x3840 B150 = 0x96 B1800 = 0x708 B19200 = 0x4b00 B200 = 0xc8 B230400 = 0x38400 B2400 = 0x960 B28800 = 0x7080 B300 = 0x12c B38400 = 0x9600 B460800 = 0x70800 B4800 = 0x12c0 B50 = 0x32 B57600 = 0xe100 B600 = 0x258 B7200 = 0x1c20 B75 = 0x4b B76800 = 0x12c00 B921600 = 0xe1000 B9600 = 0x2580 BIOCFEEDBACK = 0x8004427d BIOCFLUSH = 0x20004268 BIOCGBLEN = 0x40044266 BIOCGDLT = 0x4004426a BIOCGDLTLIST = 0xc0084277 BIOCGETIF = 0x4090426b BIOCGFEEDBACK = 0x4004427c BIOCGHDRCMPLT = 0x40044274 BIOCGRTIMEOUT = 0x400c427b BIOCGSEESENT = 0x40044278 BIOCGSTATS = 0x4080426f BIOCGSTATSOLD = 0x4008426f BIOCIMMEDIATE = 0x80044270 BIOCPROMISC = 0x20004269 BIOCSBLEN = 0xc0044266 BIOCSDLT = 0x80044276 BIOCSETF = 0x80084267 BIOCSETIF = 0x8090426c BIOCSFEEDBACK = 0x8004427d BIOCSHDRCMPLT = 0x80044275 BIOCSRTIMEOUT = 0x800c427a BIOCSSEESENT = 0x80044279 BIOCSTCPF = 0x80084272 BIOCSUDPF = 0x80084273 BIOCVERSION = 0x40044271 BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALIGNMENT = 0x4 BPF_ALIGNMENT32 = 0x4 BPF_ALU = 0x4 BPF_AND = 0x50 BPF_B = 0x10 BPF_DFLTBUFSIZE = 0x100000 BPF_DIV = 0x30 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 BPF_JA = 0x0 BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 BPF_JMP = 0x5 BPF_JSET = 0x40 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 BPF_LEN = 0x80 BPF_LSH = 0x60 BPF_MAJOR_VERSION = 0x1 BPF_MAXBUFSIZE = 0x1000000 BPF_MAXINSNS = 0x200 BPF_MEM = 0x60 BPF_MEMWORDS = 0x10 BPF_MINBUFSIZE = 0x20 BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_OR = 0x40 BPF_RELEASE = 0x30bb6 BPF_RET = 0x6 BPF_RSH = 0x70 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 BPF_TAX = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 BRKINT = 0x2 CFLUSH = 0xf CLOCAL = 0x8000 CLONE_CSIGNAL = 0xff CLONE_FILES = 0x400 CLONE_FS = 0x200 CLONE_PID = 0x1000 CLONE_PTRACE = 0x2000 CLONE_SIGHAND = 0x800 CLONE_VFORK = 0x4000 CLONE_VM = 0x100 CREAD = 0x800 CS5 = 0x0 CS6 = 0x100 CS7 = 0x200 CS8 = 0x300 CSIZE = 0x300 CSTART = 0x11 CSTATUS = 0x14 CSTOP = 0x13 CSTOPB = 0x400 CSUSP = 0x1a CTL_MAXNAME = 0xc CTL_NET = 0x4 CTL_QUERY = -0x2 DIOCBSFLUSH = 0x20006478 DLT_A429 = 0xb8 DLT_A653_ICM = 0xb9 DLT_AIRONET_HEADER = 0x78 DLT_AOS = 0xde DLT_APPLE_IP_OVER_IEEE1394 = 0x8a DLT_ARCNET = 0x7 DLT_ARCNET_LINUX = 0x81 DLT_ATM_CLIP = 0x13 DLT_ATM_RFC1483 = 0xb DLT_AURORA = 0x7e DLT_AX25 = 0x3 DLT_AX25_KISS = 0xca DLT_BACNET_MS_TP = 0xa5 DLT_BLUETOOTH_HCI_H4 = 0xbb DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 DLT_CAN20B = 0xbe DLT_CAN_SOCKETCAN = 0xe3 DLT_CHAOS = 0x5 DLT_CISCO_IOS = 0x76 DLT_C_HDLC = 0x68 DLT_C_HDLC_WITH_DIR = 0xcd DLT_DECT = 0xdd DLT_DOCSIS = 0x8f DLT_ECONET = 0x73 DLT_EN10MB = 0x1 DLT_EN3MB = 0x2 DLT_ENC = 0x6d DLT_ERF = 0xc5 DLT_ERF_ETH = 0xaf DLT_ERF_POS = 0xb0 DLT_FC_2 = 0xe0 DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 DLT_FDDI = 0xa DLT_FLEXRAY = 0xd2 DLT_FRELAY = 0x6b DLT_FRELAY_WITH_DIR = 0xce DLT_GCOM_SERIAL = 0xad DLT_GCOM_T1E1 = 0xac DLT_GPF_F = 0xab DLT_GPF_T = 0xaa DLT_GPRS_LLC = 0xa9 DLT_GSMTAP_ABIS = 0xda DLT_GSMTAP_UM = 0xd9 DLT_HDLC = 0x10 DLT_HHDLC = 0x79 DLT_HIPPI = 0xf DLT_IBM_SN = 0x92 DLT_IBM_SP = 0x91 DLT_IEEE802 = 0x6 DLT_IEEE802_11 = 0x69 DLT_IEEE802_11_RADIO = 0x7f DLT_IEEE802_11_RADIO_AVS = 0xa3 DLT_IEEE802_15_4 = 0xc3 DLT_IEEE802_15_4_LINUX = 0xbf DLT_IEEE802_15_4_NONASK_PHY = 0xd7 DLT_IEEE802_16_MAC_CPS = 0xbc DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 DLT_IPMB = 0xc7 DLT_IPMB_LINUX = 0xd1 DLT_IPNET = 0xe2 DLT_IPV4 = 0xe4 DLT_IPV6 = 0xe5 DLT_IP_OVER_FC = 0x7a DLT_JUNIPER_ATM1 = 0x89 DLT_JUNIPER_ATM2 = 0x87 DLT_JUNIPER_CHDLC = 0xb5 DLT_JUNIPER_ES = 0x84 DLT_JUNIPER_ETHER = 0xb2 DLT_JUNIPER_FRELAY = 0xb4 DLT_JUNIPER_GGSN = 0x85 DLT_JUNIPER_ISM = 0xc2 DLT_JUNIPER_MFR = 0x86 DLT_JUNIPER_MLFR = 0x83 DLT_JUNIPER_MLPPP = 0x82 DLT_JUNIPER_MONITOR = 0xa4 DLT_JUNIPER_PIC_PEER = 0xae DLT_JUNIPER_PPP = 0xb3 DLT_JUNIPER_PPPOE = 0xa7 DLT_JUNIPER_PPPOE_ATM = 0xa8 DLT_JUNIPER_SERVICES = 0x88 DLT_JUNIPER_ST = 0xc8 DLT_JUNIPER_VP = 0xb7 DLT_LAPB_WITH_DIR = 0xcf DLT_LAPD = 0xcb DLT_LIN = 0xd4 DLT_LINUX_EVDEV = 0xd8 DLT_LINUX_IRDA = 0x90 DLT_LINUX_LAPD = 0xb1 DLT_LINUX_SLL = 0x71 DLT_LOOP = 0x6c DLT_LTALK = 0x72 DLT_MFR = 0xb6 DLT_MOST = 0xd3 DLT_MPLS = 0xdb DLT_MTP2 = 0x8c DLT_MTP2_WITH_PHDR = 0x8b DLT_MTP3 = 0x8d DLT_NULL = 0x0 DLT_PCI_EXP = 0x7d DLT_PFLOG = 0x75 DLT_PFSYNC = 0x12 DLT_PPI = 0xc0 DLT_PPP = 0x9 DLT_PPP_BSDOS = 0xe DLT_PPP_ETHER = 0x33 DLT_PPP_PPPD = 0xa6 DLT_PPP_SERIAL = 0x32 DLT_PPP_WITH_DIR = 0xcc DLT_PRISM_HEADER = 0x77 DLT_PRONET = 0x4 DLT_RAIF1 = 0xc6 DLT_RAW = 0xc DLT_RAWAF_MASK = 0x2240000 DLT_RIO = 0x7c DLT_SCCP = 0x8e DLT_SITA = 0xc4 DLT_SLIP = 0x8 DLT_SLIP_BSDOS = 0xd DLT_SUNATM = 0x7b DLT_SYMANTEC_FIREWALL = 0x63 DLT_TZSP = 0x80 DLT_USB = 0xba DLT_USB_LINUX = 0xbd DLT_USB_LINUX_MMAPPED = 0xdc DLT_WIHART = 0xdf DLT_X2E_SERIAL = 0xd5 DLT_X2E_XORAYA = 0xd6 DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 DT_FIFO = 0x1 DT_LNK = 0xa DT_REG = 0x8 DT_SOCK = 0xc DT_UNKNOWN = 0x0 DT_WHT = 0xe ECHO = 0x8 ECHOCTL = 0x40 ECHOE = 0x2 ECHOK = 0x4 ECHOKE = 0x1 ECHONL = 0x10 ECHOPRT = 0x20 EMUL_LINUX = 0x1 EMUL_LINUX32 = 0x5 EMUL_MAXID = 0x6 EN_SW_CTL_INF = 0x1000 EN_SW_CTL_PREC = 0x300 EN_SW_CTL_ROUND = 0xc00 EN_SW_DATACHAIN = 0x80 EN_SW_DENORM = 0x2 EN_SW_INVOP = 0x1 EN_SW_OVERFLOW = 0x8 EN_SW_PRECLOSS = 0x20 EN_SW_UNDERFLOW = 0x10 EN_SW_ZERODIV = 0x4 ETHERCAP_JUMBO_MTU = 0x4 ETHERCAP_VLAN_HWTAGGING = 0x2 ETHERCAP_VLAN_MTU = 0x1 ETHERMIN = 0x2e ETHERMTU = 0x5dc ETHERMTU_JUMBO = 0x2328 ETHERTYPE_8023 = 0x4 ETHERTYPE_AARP = 0x80f3 ETHERTYPE_ACCTON = 0x8390 ETHERTYPE_AEONIC = 0x8036 ETHERTYPE_ALPHA = 0x814a ETHERTYPE_AMBER = 0x6008 ETHERTYPE_AMOEBA = 0x8145 ETHERTYPE_APOLLO = 0x80f7 ETHERTYPE_APOLLODOMAIN = 0x8019 ETHERTYPE_APPLETALK = 0x809b ETHERTYPE_APPLITEK = 0x80c7 ETHERTYPE_ARGONAUT = 0x803a ETHERTYPE_ARP = 0x806 ETHERTYPE_AT = 0x809b ETHERTYPE_ATALK = 0x809b ETHERTYPE_ATOMIC = 0x86df ETHERTYPE_ATT = 0x8069 ETHERTYPE_ATTSTANFORD = 0x8008 ETHERTYPE_AUTOPHON = 0x806a ETHERTYPE_AXIS = 0x8856 ETHERTYPE_BCLOOP = 0x9003 ETHERTYPE_BOFL = 0x8102 ETHERTYPE_CABLETRON = 0x7034 ETHERTYPE_CHAOS = 0x804 ETHERTYPE_COMDESIGN = 0x806c ETHERTYPE_COMPUGRAPHIC = 0x806d ETHERTYPE_COUNTERPOINT = 0x8062 ETHERTYPE_CRONUS = 0x8004 ETHERTYPE_CRONUSVLN = 0x8003 ETHERTYPE_DCA = 0x1234 ETHERTYPE_DDE = 0x807b ETHERTYPE_DEBNI = 0xaaaa ETHERTYPE_DECAM = 0x8048 ETHERTYPE_DECCUST = 0x6006 ETHERTYPE_DECDIAG = 0x6005 ETHERTYPE_DECDNS = 0x803c ETHERTYPE_DECDTS = 0x803e ETHERTYPE_DECEXPER = 0x6000 ETHERTYPE_DECLAST = 0x8041 ETHERTYPE_DECLTM = 0x803f ETHERTYPE_DECMUMPS = 0x6009 ETHERTYPE_DECNETBIOS = 0x8040 ETHERTYPE_DELTACON = 0x86de ETHERTYPE_DIDDLE = 0x4321 ETHERTYPE_DLOG1 = 0x660 ETHERTYPE_DLOG2 = 0x661 ETHERTYPE_DN = 0x6003 ETHERTYPE_DOGFIGHT = 0x1989 ETHERTYPE_DSMD = 0x8039 ETHERTYPE_ECMA = 0x803 ETHERTYPE_ENCRYPT = 0x803d ETHERTYPE_ES = 0x805d ETHERTYPE_EXCELAN = 0x8010 ETHERTYPE_EXPERDATA = 0x8049 ETHERTYPE_FLIP = 0x8146 ETHERTYPE_FLOWCONTROL = 0x8808 ETHERTYPE_FRARP = 0x808 ETHERTYPE_GENDYN = 0x8068 ETHERTYPE_HAYES = 0x8130 ETHERTYPE_HIPPI_FP = 0x8180 ETHERTYPE_HITACHI = 0x8820 ETHERTYPE_HP = 0x8005 ETHERTYPE_IEEEPUP = 0xa00 ETHERTYPE_IEEEPUPAT = 0xa01 ETHERTYPE_IMLBL = 0x4c42 ETHERTYPE_IMLBLDIAG = 0x424c ETHERTYPE_IP = 0x800 ETHERTYPE_IPAS = 0x876c ETHERTYPE_IPV6 = 0x86dd ETHERTYPE_IPX = 0x8137 ETHERTYPE_IPXNEW = 0x8037 ETHERTYPE_KALPANA = 0x8582 ETHERTYPE_LANBRIDGE = 0x8038 ETHERTYPE_LANPROBE = 0x8888 ETHERTYPE_LAT = 0x6004 ETHERTYPE_LBACK = 0x9000 ETHERTYPE_LITTLE = 0x8060 ETHERTYPE_LOGICRAFT = 0x8148 ETHERTYPE_LOOPBACK = 0x9000 ETHERTYPE_MATRA = 0x807a ETHERTYPE_MAX = 0xffff ETHERTYPE_MERIT = 0x807c ETHERTYPE_MICP = 0x873a ETHERTYPE_MOPDL = 0x6001 ETHERTYPE_MOPRC = 0x6002 ETHERTYPE_MOTOROLA = 0x818d ETHERTYPE_MPLS = 0x8847 ETHERTYPE_MPLS_MCAST = 0x8848 ETHERTYPE_MUMPS = 0x813f ETHERTYPE_NBPCC = 0x3c04 ETHERTYPE_NBPCLAIM = 0x3c09 ETHERTYPE_NBPCLREQ = 0x3c05 ETHERTYPE_NBPCLRSP = 0x3c06 ETHERTYPE_NBPCREQ = 0x3c02 ETHERTYPE_NBPCRSP = 0x3c03 ETHERTYPE_NBPDG = 0x3c07 ETHERTYPE_NBPDGB = 0x3c08 ETHERTYPE_NBPDLTE = 0x3c0a ETHERTYPE_NBPRAR = 0x3c0c ETHERTYPE_NBPRAS = 0x3c0b ETHERTYPE_NBPRST = 0x3c0d ETHERTYPE_NBPSCD = 0x3c01 ETHERTYPE_NBPVCD = 0x3c00 ETHERTYPE_NBS = 0x802 ETHERTYPE_NCD = 0x8149 ETHERTYPE_NESTAR = 0x8006 ETHERTYPE_NETBEUI = 0x8191 ETHERTYPE_NOVELL = 0x8138 ETHERTYPE_NS = 0x600 ETHERTYPE_NSAT = 0x601 ETHERTYPE_NSCOMPAT = 0x807 ETHERTYPE_NTRAILER = 0x10 ETHERTYPE_OS9 = 0x7007 ETHERTYPE_OS9NET = 0x7009 ETHERTYPE_PACER = 0x80c6 ETHERTYPE_PAE = 0x888e ETHERTYPE_PCS = 0x4242 ETHERTYPE_PLANNING = 0x8044 ETHERTYPE_PPP = 0x880b ETHERTYPE_PPPOE = 0x8864 ETHERTYPE_PPPOEDISC = 0x8863 ETHERTYPE_PRIMENTS = 0x7031 ETHERTYPE_PUP = 0x200 ETHERTYPE_PUPAT = 0x200 ETHERTYPE_RACAL = 0x7030 ETHERTYPE_RATIONAL = 0x8150 ETHERTYPE_RAWFR = 0x6559 ETHERTYPE_RCL = 0x1995 ETHERTYPE_RDP = 0x8739 ETHERTYPE_RETIX = 0x80f2 ETHERTYPE_REVARP = 0x8035 ETHERTYPE_SCA = 0x6007 ETHERTYPE_SECTRA = 0x86db ETHERTYPE_SECUREDATA = 0x876d ETHERTYPE_SGITW = 0x817e ETHERTYPE_SG_BOUNCE = 0x8016 ETHERTYPE_SG_DIAG = 0x8013 ETHERTYPE_SG_NETGAMES = 0x8014 ETHERTYPE_SG_RESV = 0x8015 ETHERTYPE_SIMNET = 0x5208 ETHERTYPE_SLOWPROTOCOLS = 0x8809 ETHERTYPE_SNA = 0x80d5 ETHERTYPE_SNMP = 0x814c ETHERTYPE_SONIX = 0xfaf5 ETHERTYPE_SPIDER = 0x809f ETHERTYPE_SPRITE = 0x500 ETHERTYPE_STP = 0x8181 ETHERTYPE_TALARIS = 0x812b ETHERTYPE_TALARISMC = 0x852b ETHERTYPE_TCPCOMP = 0x876b ETHERTYPE_TCPSM = 0x9002 ETHERTYPE_TEC = 0x814f ETHERTYPE_TIGAN = 0x802f ETHERTYPE_TRAIL = 0x1000 ETHERTYPE_TRANSETHER = 0x6558 ETHERTYPE_TYMSHARE = 0x802e ETHERTYPE_UBBST = 0x7005 ETHERTYPE_UBDEBUG = 0x900 ETHERTYPE_UBDIAGLOOP = 0x7002 ETHERTYPE_UBDL = 0x7000 ETHERTYPE_UBNIU = 0x7001 ETHERTYPE_UBNMC = 0x7003 ETHERTYPE_VALID = 0x1600 ETHERTYPE_VARIAN = 0x80dd ETHERTYPE_VAXELN = 0x803b ETHERTYPE_VEECO = 0x8067 ETHERTYPE_VEXP = 0x805b ETHERTYPE_VGLAB = 0x8131 ETHERTYPE_VINES = 0xbad ETHERTYPE_VINESECHO = 0xbaf ETHERTYPE_VINESLOOP = 0xbae ETHERTYPE_VITAL = 0xff00 ETHERTYPE_VLAN = 0x8100 ETHERTYPE_VLTLMAN = 0x8080 ETHERTYPE_VPROD = 0x805c ETHERTYPE_VURESERVED = 0x8147 ETHERTYPE_WATERLOO = 0x8130 ETHERTYPE_WELLFLEET = 0x8103 ETHERTYPE_X25 = 0x805 ETHERTYPE_X75 = 0x801 ETHERTYPE_XNSSM = 0x9001 ETHERTYPE_XTP = 0x817d ETHER_ADDR_LEN = 0x6 ETHER_CRC_LEN = 0x4 ETHER_CRC_POLY_BE = 0x4c11db6 ETHER_CRC_POLY_LE = 0xedb88320 ETHER_HDR_LEN = 0xe ETHER_MAX_LEN = 0x5ee ETHER_MAX_LEN_JUMBO = 0x233a ETHER_MIN_LEN = 0x40 ETHER_PPPOE_ENCAP_LEN = 0x8 ETHER_TYPE_LEN = 0x2 ETHER_VLAN_ENCAP_LEN = 0x4 EVFILT_AIO = 0x2 EVFILT_PROC = 0x4 EVFILT_READ = 0x0 EVFILT_SIGNAL = 0x5 EVFILT_SYSCOUNT = 0x7 EVFILT_TIMER = 0x6 EVFILT_VNODE = 0x3 EVFILT_WRITE = 0x1 EV_ADD = 0x1 EV_CLEAR = 0x20 EV_DELETE = 0x2 EV_DISABLE = 0x8 EV_ENABLE = 0x4 EV_EOF = 0x8000 EV_ERROR = 0x4000 EV_FLAG1 = 0x2000 EV_ONESHOT = 0x10 EV_SYSFLAGS = 0xf000 EXTA = 0x4b00 EXTB = 0x9600 EXTPROC = 0x800 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x100 FLUSHO = 0x800000 F_CLOSEM = 0xa F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0xc F_FSCTL = -0x80000000 F_FSDIRMASK = 0x70000000 F_FSIN = 0x10000000 F_FSINOUT = 0x30000000 F_FSOUT = 0x20000000 F_FSPRIV = 0x8000 F_FSVOID = 0x40000000 F_GETFD = 0x1 F_GETFL = 0x3 F_GETLK = 0x7 F_GETNOSIGPIPE = 0xd F_GETOWN = 0x5 F_MAXFD = 0xb F_OK = 0x0 F_PARAM_MASK = 0xfff F_PARAM_MAX = 0xfff F_RDLCK = 0x1 F_SETFD = 0x2 F_SETFL = 0x4 F_SETLK = 0x8 F_SETLKW = 0x9 F_SETNOSIGPIPE = 0xe F_SETOWN = 0x6 F_UNLCK = 0x2 F_WRLCK = 0x3 HUPCL = 0x4000 ICANON = 0x100 ICMP6_FILTER = 0x12 ICRNL = 0x100 IEXTEN = 0x400 IFAN_ARRIVAL = 0x0 IFAN_DEPARTURE = 0x1 IFA_ROUTE = 0x1 IFF_ALLMULTI = 0x200 IFF_BROADCAST = 0x2 IFF_CANTCHANGE = 0x8f52 IFF_DEBUG = 0x4 IFF_LINK0 = 0x1000 IFF_LINK1 = 0x2000 IFF_LINK2 = 0x4000 IFF_LOOPBACK = 0x8 IFF_MULTICAST = 0x8000 IFF_NOARP = 0x80 IFF_NOTRAILERS = 0x20 IFF_OACTIVE = 0x400 IFF_POINTOPOINT = 0x10 IFF_PROMISC = 0x100 IFF_RUNNING = 0x40 IFF_SIMPLEX = 0x800 IFF_UP = 0x1 IFNAMSIZ = 0x10 IFT_1822 = 0x2 IFT_A12MPPSWITCH = 0x82 IFT_AAL2 = 0xbb IFT_AAL5 = 0x31 IFT_ADSL = 0x5e IFT_AFLANE8023 = 0x3b IFT_AFLANE8025 = 0x3c IFT_ARAP = 0x58 IFT_ARCNET = 0x23 IFT_ARCNETPLUS = 0x24 IFT_ASYNC = 0x54 IFT_ATM = 0x25 IFT_ATMDXI = 0x69 IFT_ATMFUNI = 0x6a IFT_ATMIMA = 0x6b IFT_ATMLOGICAL = 0x50 IFT_ATMRADIO = 0xbd IFT_ATMSUBINTERFACE = 0x86 IFT_ATMVCIENDPT = 0xc2 IFT_ATMVIRTUAL = 0x95 IFT_BGPPOLICYACCOUNTING = 0xa2 IFT_BRIDGE = 0xd1 IFT_BSC = 0x53 IFT_CARP = 0xf8 IFT_CCTEMUL = 0x3d IFT_CEPT = 0x13 IFT_CES = 0x85 IFT_CHANNEL = 0x46 IFT_CNR = 0x55 IFT_COFFEE = 0x84 IFT_COMPOSITELINK = 0x9b IFT_DCN = 0x8d IFT_DIGITALPOWERLINE = 0x8a IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba IFT_DLSW = 0x4a IFT_DOCSCABLEDOWNSTREAM = 0x80 IFT_DOCSCABLEMACLAYER = 0x7f IFT_DOCSCABLEUPSTREAM = 0x81 IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd IFT_DS0 = 0x51 IFT_DS0BUNDLE = 0x52 IFT_DS1FDL = 0xaa IFT_DS3 = 0x1e IFT_DTM = 0x8c IFT_DVBASILN = 0xac IFT_DVBASIOUT = 0xad IFT_DVBRCCDOWNSTREAM = 0x93 IFT_DVBRCCMACLAYER = 0x92 IFT_DVBRCCUPSTREAM = 0x94 IFT_ECONET = 0xce IFT_EON = 0x19 IFT_EPLRS = 0x57 IFT_ESCON = 0x49 IFT_ETHER = 0x6 IFT_FAITH = 0xf2 IFT_FAST = 0x7d IFT_FASTETHER = 0x3e IFT_FASTETHERFX = 0x45 IFT_FDDI = 0xf IFT_FIBRECHANNEL = 0x38 IFT_FRAMERELAYINTERCONNECT = 0x3a IFT_FRAMERELAYMPI = 0x5c IFT_FRDLCIENDPT = 0xc1 IFT_FRELAY = 0x20 IFT_FRELAYDCE = 0x2c IFT_FRF16MFRBUNDLE = 0xa3 IFT_FRFORWARD = 0x9e IFT_G703AT2MB = 0x43 IFT_G703AT64K = 0x42 IFT_GIF = 0xf0 IFT_GIGABITETHERNET = 0x75 IFT_GR303IDT = 0xb2 IFT_GR303RDT = 0xb1 IFT_H323GATEKEEPER = 0xa4 IFT_H323PROXY = 0xa5 IFT_HDH1822 = 0x3 IFT_HDLC = 0x76 IFT_HDSL2 = 0xa8 IFT_HIPERLAN2 = 0xb7 IFT_HIPPI = 0x2f IFT_HIPPIINTERFACE = 0x39 IFT_HOSTPAD = 0x5a IFT_HSSI = 0x2e IFT_HY = 0xe IFT_IBM370PARCHAN = 0x48 IFT_IDSL = 0x9a IFT_IEEE1394 = 0x90 IFT_IEEE80211 = 0x47 IFT_IEEE80212 = 0x37 IFT_IEEE8023ADLAG = 0xa1 IFT_IFGSN = 0x91 IFT_IMT = 0xbe IFT_INFINIBAND = 0xc7 IFT_INTERLEAVE = 0x7c IFT_IP = 0x7e IFT_IPFORWARD = 0x8e IFT_IPOVERATM = 0x72 IFT_IPOVERCDLC = 0x6d IFT_IPOVERCLAW = 0x6e IFT_IPSWITCH = 0x4e IFT_ISDN = 0x3f IFT_ISDNBASIC = 0x14 IFT_ISDNPRIMARY = 0x15 IFT_ISDNS = 0x4b IFT_ISDNU = 0x4c IFT_ISO88022LLC = 0x29 IFT_ISO88023 = 0x7 IFT_ISO88024 = 0x8 IFT_ISO88025 = 0x9 IFT_ISO88025CRFPINT = 0x62 IFT_ISO88025DTR = 0x56 IFT_ISO88025FIBER = 0x73 IFT_ISO88026 = 0xa IFT_ISUP = 0xb3 IFT_L2VLAN = 0x87 IFT_L3IPVLAN = 0x88 IFT_L3IPXVLAN = 0x89 IFT_LAPB = 0x10 IFT_LAPD = 0x4d IFT_LAPF = 0x77 IFT_LINEGROUP = 0xd2 IFT_LOCALTALK = 0x2a IFT_LOOP = 0x18 IFT_MEDIAMAILOVERIP = 0x8b IFT_MFSIGLINK = 0xa7 IFT_MIOX25 = 0x26 IFT_MODEM = 0x30 IFT_MPC = 0x71 IFT_MPLS = 0xa6 IFT_MPLSTUNNEL = 0x96 IFT_MSDSL = 0x8f IFT_MVL = 0xbf IFT_MYRINET = 0x63 IFT_NFAS = 0xaf IFT_NSIP = 0x1b IFT_OPTICALCHANNEL = 0xc3 IFT_OPTICALTRANSPORT = 0xc4 IFT_OTHER = 0x1 IFT_P10 = 0xc IFT_P80 = 0xd IFT_PARA = 0x22 IFT_PFLOG = 0xf5 IFT_PFSYNC = 0xf6 IFT_PLC = 0xae IFT_PON155 = 0xcf IFT_PON622 = 0xd0 IFT_POS = 0xab IFT_PPP = 0x17 IFT_PPPMULTILINKBUNDLE = 0x6c IFT_PROPATM = 0xc5 IFT_PROPBWAP2MP = 0xb8 IFT_PROPCNLS = 0x59 IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 IFT_PROPMUX = 0x36 IFT_PROPVIRTUAL = 0x35 IFT_PROPWIRELESSP2P = 0x9d IFT_PTPSERIAL = 0x16 IFT_PVC = 0xf1 IFT_Q2931 = 0xc9 IFT_QLLC = 0x44 IFT_RADIOMAC = 0xbc IFT_RADSL = 0x5f IFT_REACHDSL = 0xc0 IFT_RFC1483 = 0x9f IFT_RS232 = 0x21 IFT_RSRB = 0x4f IFT_SDLC = 0x11 IFT_SDSL = 0x60 IFT_SHDSL = 0xa9 IFT_SIP = 0x1f IFT_SIPSIG = 0xcc IFT_SIPTG = 0xcb IFT_SLIP = 0x1c IFT_SMDSDXI = 0x2b IFT_SMDSICIP = 0x34 IFT_SONET = 0x27 IFT_SONETOVERHEADCHANNEL = 0xb9 IFT_SONETPATH = 0x32 IFT_SONETVT = 0x33 IFT_SRP = 0x97 IFT_SS7SIGLINK = 0x9c IFT_STACKTOSTACK = 0x6f IFT_STARLAN = 0xb IFT_STF = 0xd7 IFT_T1 = 0x12 IFT_TDLC = 0x74 IFT_TELINK = 0xc8 IFT_TERMPAD = 0x5b IFT_TR008 = 0xb0 IFT_TRANSPHDLC = 0x7b IFT_TUNNEL = 0x83 IFT_ULTRA = 0x1d IFT_USB = 0xa0 IFT_V11 = 0x40 IFT_V35 = 0x2d IFT_V36 = 0x41 IFT_V37 = 0x78 IFT_VDSL = 0x61 IFT_VIRTUALIPADDRESS = 0x70 IFT_VIRTUALTG = 0xca IFT_VOICEDID = 0xd5 IFT_VOICEEM = 0x64 IFT_VOICEEMFGD = 0xd3 IFT_VOICEENCAP = 0x67 IFT_VOICEFGDEANA = 0xd4 IFT_VOICEFXO = 0x65 IFT_VOICEFXS = 0x66 IFT_VOICEOVERATM = 0x98 IFT_VOICEOVERCABLE = 0xc6 IFT_VOICEOVERFRAMERELAY = 0x99 IFT_VOICEOVERIP = 0x68 IFT_X213 = 0x5d IFT_X25 = 0x5 IFT_X25DDN = 0x4 IFT_X25HUNTGROUP = 0x7a IFT_X25MLP = 0x79 IFT_X25PLE = 0x28 IFT_XETHER = 0x1a IGNBRK = 0x1 IGNCR = 0x80 IGNPAR = 0x4 IMAXBEL = 0x2000 INLCR = 0x40 INPCK = 0x10 IN_CLASSA_HOST = 0xffffff IN_CLASSA_MAX = 0x80 IN_CLASSA_NET = 0xff000000 IN_CLASSA_NSHIFT = 0x18 IN_CLASSB_HOST = 0xffff IN_CLASSB_MAX = 0x10000 IN_CLASSB_NET = 0xffff0000 IN_CLASSB_NSHIFT = 0x10 IN_CLASSC_HOST = 0xff IN_CLASSC_NET = 0xffffff00 IN_CLASSC_NSHIFT = 0x8 IN_CLASSD_HOST = 0xfffffff IN_CLASSD_NET = 0xf0000000 IN_CLASSD_NSHIFT = 0x1c IN_LOOPBACKNET = 0x7f IPPROTO_AH = 0x33 IPPROTO_CARP = 0x70 IPPROTO_DONE = 0x101 IPPROTO_DSTOPTS = 0x3c IPPROTO_EGP = 0x8 IPPROTO_ENCAP = 0x62 IPPROTO_EON = 0x50 IPPROTO_ESP = 0x32 IPPROTO_ETHERIP = 0x61 IPPROTO_FRAGMENT = 0x2c IPPROTO_GGP = 0x3 IPPROTO_GRE = 0x2f IPPROTO_HOPOPTS = 0x0 IPPROTO_ICMP = 0x1 IPPROTO_ICMPV6 = 0x3a IPPROTO_IDP = 0x16 IPPROTO_IGMP = 0x2 IPPROTO_IP = 0x0 IPPROTO_IPCOMP = 0x6c IPPROTO_IPIP = 0x4 IPPROTO_IPV4 = 0x4 IPPROTO_IPV6 = 0x29 IPPROTO_IPV6_ICMP = 0x3a IPPROTO_MAX = 0x100 IPPROTO_MAXID = 0x34 IPPROTO_MOBILE = 0x37 IPPROTO_NONE = 0x3b IPPROTO_PFSYNC = 0xf0 IPPROTO_PIM = 0x67 IPPROTO_PUP = 0xc IPPROTO_RAW = 0xff IPPROTO_ROUTING = 0x2b IPPROTO_RSVP = 0x2e IPPROTO_TCP = 0x6 IPPROTO_TP = 0x1d IPPROTO_UDP = 0x11 IPPROTO_VRRP = 0x70 IPV6_CHECKSUM = 0x1a IPV6_DEFAULT_MULTICAST_HOPS = 0x1 IPV6_DEFAULT_MULTICAST_LOOP = 0x1 IPV6_DEFHLIM = 0x40 IPV6_DONTFRAG = 0x3e IPV6_DSTOPTS = 0x32 IPV6_FAITH = 0x1d IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 IPV6_FRAGTTL = 0x78 IPV6_HLIMDEC = 0x1 IPV6_HOPLIMIT = 0x2f IPV6_HOPOPTS = 0x31 IPV6_IPSEC_POLICY = 0x1c IPV6_JOIN_GROUP = 0xc IPV6_LEAVE_GROUP = 0xd IPV6_MAXHLIM = 0xff IPV6_MAXPACKET = 0xffff IPV6_MMTU = 0x500 IPV6_MULTICAST_HOPS = 0xa IPV6_MULTICAST_IF = 0x9 IPV6_MULTICAST_LOOP = 0xb IPV6_NEXTHOP = 0x30 IPV6_PATHMTU = 0x2c IPV6_PKTINFO = 0x2e IPV6_PORTRANGE = 0xe IPV6_PORTRANGE_DEFAULT = 0x0 IPV6_PORTRANGE_HIGH = 0x1 IPV6_PORTRANGE_LOW = 0x2 IPV6_RECVDSTOPTS = 0x28 IPV6_RECVHOPLIMIT = 0x25 IPV6_RECVHOPOPTS = 0x27 IPV6_RECVPATHMTU = 0x2b IPV6_RECVPKTINFO = 0x24 IPV6_RECVRTHDR = 0x26 IPV6_RECVTCLASS = 0x39 IPV6_RTHDR = 0x33 IPV6_RTHDRDSTOPTS = 0x23 IPV6_RTHDR_LOOSE = 0x0 IPV6_RTHDR_STRICT = 0x1 IPV6_RTHDR_TYPE_0 = 0x0 IPV6_SOCKOPT_RESERVED1 = 0x3 IPV6_TCLASS = 0x3d IPV6_UNICAST_HOPS = 0x4 IPV6_USE_MIN_MTU = 0x2a IPV6_V6ONLY = 0x1b IPV6_VERSION = 0x60 IPV6_VERSION_MASK = 0xf0 IP_ADD_MEMBERSHIP = 0xc IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 IP_DROP_MEMBERSHIP = 0xd IP_EF = 0x8000 IP_ERRORMTU = 0x15 IP_HDRINCL = 0x2 IP_IPSEC_POLICY = 0x16 IP_MAXPACKET = 0xffff IP_MAX_MEMBERSHIPS = 0x14 IP_MF = 0x2000 IP_MINFRAGSIZE = 0x45 IP_MINTTL = 0x18 IP_MSS = 0x240 IP_MULTICAST_IF = 0x9 IP_MULTICAST_LOOP = 0xb IP_MULTICAST_TTL = 0xa IP_OFFMASK = 0x1fff IP_OPTIONS = 0x1 IP_PORTRANGE = 0x13 IP_PORTRANGE_DEFAULT = 0x0 IP_PORTRANGE_HIGH = 0x1 IP_PORTRANGE_LOW = 0x2 IP_RECVDSTADDR = 0x7 IP_RECVIF = 0x14 IP_RECVOPTS = 0x5 IP_RECVRETOPTS = 0x6 IP_RECVTTL = 0x17 IP_RETOPTS = 0x8 IP_RF = 0x8000 IP_TOS = 0x3 IP_TTL = 0x4 ISIG = 0x80 ISTRIP = 0x20 IXANY = 0x800 IXOFF = 0x400 IXON = 0x200 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 MADV_DONTNEED = 0x4 MADV_FREE = 0x6 MADV_NORMAL = 0x0 MADV_RANDOM = 0x1 MADV_SEQUENTIAL = 0x2 MADV_SPACEAVAIL = 0x5 MADV_WILLNEED = 0x3 MAP_ALIGNMENT_16MB = 0x18000000 MAP_ALIGNMENT_1TB = 0x28000000 MAP_ALIGNMENT_256TB = 0x30000000 MAP_ALIGNMENT_4GB = 0x20000000 MAP_ALIGNMENT_64KB = 0x10000000 MAP_ALIGNMENT_64PB = 0x38000000 MAP_ALIGNMENT_MASK = -0x1000000 MAP_ALIGNMENT_SHIFT = 0x18 MAP_ANON = 0x1000 MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_HASSEMAPHORE = 0x200 MAP_INHERIT = 0x80 MAP_INHERIT_COPY = 0x1 MAP_INHERIT_DEFAULT = 0x1 MAP_INHERIT_DONATE_COPY = 0x3 MAP_INHERIT_NONE = 0x2 MAP_INHERIT_SHARE = 0x0 MAP_NORESERVE = 0x40 MAP_PRIVATE = 0x2 MAP_RENAME = 0x20 MAP_SHARED = 0x1 MAP_STACK = 0x2000 MAP_TRYFIXED = 0x400 MAP_WIRED = 0x800 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MSG_BCAST = 0x100 MSG_CMSG_CLOEXEC = 0x800 MSG_CONTROLMBUF = 0x2000000 MSG_CTRUNC = 0x20 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x80 MSG_EOR = 0x8 MSG_IOVUSRSPACE = 0x4000000 MSG_LENUSRSPACE = 0x8000000 MSG_MCAST = 0x200 MSG_NAMEMBUF = 0x1000000 MSG_NBIO = 0x1000 MSG_NOSIGNAL = 0x400 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_TRUNC = 0x10 MSG_USERFLAGS = 0xffffff MSG_WAITALL = 0x40 MS_ASYNC = 0x1 MS_INVALIDATE = 0x2 MS_SYNC = 0x4 NAME_MAX = 0x1ff NET_RT_DUMP = 0x1 NET_RT_FLAGS = 0x2 NET_RT_IFLIST = 0x5 NET_RT_MAXID = 0x6 NET_RT_OIFLIST = 0x4 NET_RT_OOIFLIST = 0x3 NOFLSH = 0x80000000 NOTE_ATTRIB = 0x8 NOTE_CHILD = 0x4 NOTE_DELETE = 0x1 NOTE_EXEC = 0x20000000 NOTE_EXIT = 0x80000000 NOTE_EXTEND = 0x4 NOTE_FORK = 0x40000000 NOTE_LINK = 0x10 NOTE_LOWAT = 0x1 NOTE_PCTRLMASK = 0xf0000000 NOTE_PDATAMASK = 0xfffff NOTE_RENAME = 0x20 NOTE_REVOKE = 0x40 NOTE_TRACK = 0x1 NOTE_TRACKERR = 0x2 NOTE_WRITE = 0x2 OCRNL = 0x10 OFIOGETBMAP = 0xc004667a ONLCR = 0x2 ONLRET = 0x40 ONOCR = 0x20 ONOEOT = 0x8 OPOST = 0x1 O_ACCMODE = 0x3 O_ALT_IO = 0x40000 O_APPEND = 0x8 O_ASYNC = 0x40 O_CLOEXEC = 0x400000 O_CREAT = 0x200 O_DIRECT = 0x80000 O_DIRECTORY = 0x200000 O_DSYNC = 0x10000 O_EXCL = 0x800 O_EXLOCK = 0x20 O_FSYNC = 0x80 O_NDELAY = 0x4 O_NOCTTY = 0x8000 O_NOFOLLOW = 0x100 O_NONBLOCK = 0x4 O_NOSIGPIPE = 0x1000000 O_RDONLY = 0x0 O_RDWR = 0x2 O_RSYNC = 0x20000 O_SHLOCK = 0x10 O_SYNC = 0x80 O_TRUNC = 0x400 O_WRONLY = 0x1 PARENB = 0x1000 PARMRK = 0x8 PARODD = 0x2000 PENDIN = 0x20000000 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 PRI_IOFLUSH = 0x7c PROT_EXEC = 0x4 PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 RLIMIT_AS = 0xa RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 RLIMIT_NOFILE = 0x8 RLIMIT_STACK = 0x3 RLIM_INFINITY = 0x7fffffffffffffff RTAX_AUTHOR = 0x6 RTAX_BRD = 0x7 RTAX_DST = 0x0 RTAX_GATEWAY = 0x1 RTAX_GENMASK = 0x3 RTAX_IFA = 0x5 RTAX_IFP = 0x4 RTAX_MAX = 0x9 RTAX_NETMASK = 0x2 RTAX_TAG = 0x8 RTA_AUTHOR = 0x40 RTA_BRD = 0x80 RTA_DST = 0x1 RTA_GATEWAY = 0x2 RTA_GENMASK = 0x8 RTA_IFA = 0x20 RTA_IFP = 0x10 RTA_NETMASK = 0x4 RTA_TAG = 0x100 RTF_ANNOUNCE = 0x20000 RTF_BLACKHOLE = 0x1000 RTF_CLONED = 0x2000 RTF_CLONING = 0x100 RTF_DONE = 0x40 RTF_DYNAMIC = 0x10 RTF_GATEWAY = 0x2 RTF_HOST = 0x4 RTF_LLINFO = 0x400 RTF_MASK = 0x80 RTF_MODIFIED = 0x20 RTF_PROTO1 = 0x8000 RTF_PROTO2 = 0x4000 RTF_REJECT = 0x8 RTF_SRC = 0x10000 RTF_STATIC = 0x800 RTF_UP = 0x1 RTF_XRESOLVE = 0x200 RTM_ADD = 0x1 RTM_CHANGE = 0x3 RTM_CHGADDR = 0x15 RTM_DELADDR = 0xd RTM_DELETE = 0x2 RTM_GET = 0x4 RTM_IEEE80211 = 0x11 RTM_IFANNOUNCE = 0x10 RTM_IFINFO = 0x14 RTM_LLINFO_UPD = 0x13 RTM_LOCK = 0x8 RTM_LOSING = 0x5 RTM_MISS = 0x7 RTM_NEWADDR = 0xc RTM_OIFINFO = 0xf RTM_OLDADD = 0x9 RTM_OLDDEL = 0xa RTM_OOIFINFO = 0xe RTM_REDIRECT = 0x6 RTM_RESOLVE = 0xb RTM_RTTUNIT = 0xf4240 RTM_SETGATE = 0x12 RTM_VERSION = 0x4 RTV_EXPIRE = 0x4 RTV_HOPCOUNT = 0x2 RTV_MTU = 0x1 RTV_RPIPE = 0x8 RTV_RTT = 0x40 RTV_RTTVAR = 0x80 RTV_SPIPE = 0x10 RTV_SSTHRESH = 0x20 RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 SCM_CREDS = 0x4 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x8 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 SIOCADDMULTI = 0x80906931 SIOCADDRT = 0x8030720a SIOCAIFADDR = 0x8040691a SIOCALIFADDR = 0x8118691c SIOCATMARK = 0x40047307 SIOCDELMULTI = 0x80906932 SIOCDELRT = 0x8030720b SIOCDIFADDR = 0x80906919 SIOCDIFPHYADDR = 0x80906949 SIOCDLIFADDR = 0x8118691e SIOCGDRVSPEC = 0xc01c697b SIOCGETPFSYNC = 0xc09069f8 SIOCGETSGCNT = 0xc0147534 SIOCGETVIFCNT = 0xc0147533 SIOCGHIWAT = 0x40047301 SIOCGIFADDR = 0xc0906921 SIOCGIFADDRPREF = 0xc0946920 SIOCGIFALIAS = 0xc040691b SIOCGIFBRDADDR = 0xc0906923 SIOCGIFCAP = 0xc0206976 SIOCGIFCONF = 0xc0086926 SIOCGIFDATA = 0xc0946985 SIOCGIFDLT = 0xc0906977 SIOCGIFDSTADDR = 0xc0906922 SIOCGIFFLAGS = 0xc0906911 SIOCGIFGENERIC = 0xc090693a SIOCGIFMEDIA = 0xc0286936 SIOCGIFMETRIC = 0xc0906917 SIOCGIFMTU = 0xc090697e SIOCGIFNETMASK = 0xc0906925 SIOCGIFPDSTADDR = 0xc0906948 SIOCGIFPSRCADDR = 0xc0906947 SIOCGLIFADDR = 0xc118691d SIOCGLIFPHYADDR = 0xc118694b SIOCGLINKSTR = 0xc01c6987 SIOCGLOWAT = 0x40047303 SIOCGPGRP = 0x40047309 SIOCGVH = 0xc0906983 SIOCIFCREATE = 0x8090697a SIOCIFDESTROY = 0x80906979 SIOCIFGCLONERS = 0xc00c6978 SIOCINITIFADDR = 0xc0446984 SIOCSDRVSPEC = 0x801c697b SIOCSETPFSYNC = 0x809069f7 SIOCSHIWAT = 0x80047300 SIOCSIFADDR = 0x8090690c SIOCSIFADDRPREF = 0x8094691f SIOCSIFBRDADDR = 0x80906913 SIOCSIFCAP = 0x80206975 SIOCSIFDSTADDR = 0x8090690e SIOCSIFFLAGS = 0x80906910 SIOCSIFGENERIC = 0x80906939 SIOCSIFMEDIA = 0xc0906935 SIOCSIFMETRIC = 0x80906918 SIOCSIFMTU = 0x8090697f SIOCSIFNETMASK = 0x80906916 SIOCSIFPHYADDR = 0x80406946 SIOCSLIFPHYADDR = 0x8118694a SIOCSLINKSTR = 0x801c6988 SIOCSLOWAT = 0x80047302 SIOCSPGRP = 0x80047308 SIOCSVH = 0xc0906982 SIOCZIFDATA = 0xc0946986 SOCK_CLOEXEC = 0x10000000 SOCK_DGRAM = 0x2 SOCK_FLAGS_MASK = 0xf0000000 SOCK_NONBLOCK = 0x20000000 SOCK_NOSIGPIPE = 0x40000000 SOCK_RAW = 0x3 SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x1 SOL_SOCKET = 0xffff SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x2 SO_ACCEPTFILTER = 0x1000 SO_BROADCAST = 0x20 SO_DEBUG = 0x1 SO_DONTROUTE = 0x10 SO_ERROR = 0x1007 SO_KEEPALIVE = 0x8 SO_LINGER = 0x80 SO_NOHEADER = 0x100a SO_NOSIGPIPE = 0x800 SO_OOBINLINE = 0x100 SO_OVERFLOWED = 0x1009 SO_RCVBUF = 0x1002 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x100c SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_SNDBUF = 0x1001 SO_SNDLOWAT = 0x1003 SO_SNDTIMEO = 0x100b SO_TIMESTAMP = 0x2000 SO_TYPE = 0x1008 SO_USELOOPBACK = 0x40 SYSCTL_VERSION = 0x1000000 SYSCTL_VERS_0 = 0x0 SYSCTL_VERS_1 = 0x1000000 SYSCTL_VERS_MASK = 0xff000000 S_ARCH1 = 0x10000 S_ARCH2 = 0x20000 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000 S_IFCHR = 0x2000 S_IFDIR = 0x4000 S_IFIFO = 0x1000 S_IFLNK = 0xa000 S_IFMT = 0xf000 S_IFREG = 0x8000 S_IFSOCK = 0xc000 S_IFWHT = 0xe000 S_IREAD = 0x100 S_IRGRP = 0x20 S_IROTH = 0x4 S_IRUSR = 0x100 S_IRWXG = 0x38 S_IRWXO = 0x7 S_IRWXU = 0x1c0 S_ISGID = 0x400 S_ISTXT = 0x200 S_ISUID = 0x800 S_ISVTX = 0x200 S_IWGRP = 0x10 S_IWOTH = 0x2 S_IWRITE = 0x80 S_IWUSR = 0x80 S_IXGRP = 0x8 S_IXOTH = 0x1 S_IXUSR = 0x40 S_LOGIN_SET = 0x1 TCIFLUSH = 0x1 TCIOFLUSH = 0x3 TCOFLUSH = 0x2 TCP_CONGCTL = 0x20 TCP_KEEPCNT = 0x6 TCP_KEEPIDLE = 0x3 TCP_KEEPINIT = 0x7 TCP_KEEPINTVL = 0x5 TCP_MAXBURST = 0x4 TCP_MAXSEG = 0x2 TCP_MAXWIN = 0xffff TCP_MAX_WINSHIFT = 0xe TCP_MD5SIG = 0x10 TCP_MINMSS = 0xd8 TCP_MSS = 0x218 TCP_NODELAY = 0x1 TCSAFLUSH = 0x2 TIOCCBRK = 0x2000747a TIOCCDTR = 0x20007478 TIOCCONS = 0x80047462 TIOCDCDTIMESTAMP = 0x400c7458 TIOCDRAIN = 0x2000745e TIOCEXCL = 0x2000740d TIOCEXT = 0x80047460 TIOCFLAG_CDTRCTS = 0x10 TIOCFLAG_CLOCAL = 0x2 TIOCFLAG_CRTSCTS = 0x4 TIOCFLAG_MDMBUF = 0x8 TIOCFLAG_SOFTCAR = 0x1 TIOCFLUSH = 0x80047410 TIOCGETA = 0x402c7413 TIOCGETD = 0x4004741a TIOCGFLAGS = 0x4004745d TIOCGLINED = 0x40207442 TIOCGPGRP = 0x40047477 TIOCGQSIZE = 0x40047481 TIOCGRANTPT = 0x20007447 TIOCGSID = 0x40047463 TIOCGSIZE = 0x40087468 TIOCGWINSZ = 0x40087468 TIOCMBIC = 0x8004746b TIOCMBIS = 0x8004746c TIOCMGET = 0x4004746a TIOCMSET = 0x8004746d TIOCM_CAR = 0x40 TIOCM_CD = 0x40 TIOCM_CTS = 0x20 TIOCM_DSR = 0x100 TIOCM_DTR = 0x2 TIOCM_LE = 0x1 TIOCM_RI = 0x80 TIOCM_RNG = 0x80 TIOCM_RTS = 0x4 TIOCM_SR = 0x10 TIOCM_ST = 0x8 TIOCNOTTY = 0x20007471 TIOCNXCL = 0x2000740e TIOCOUTQ = 0x40047473 TIOCPKT = 0x80047470 TIOCPKT_DATA = 0x0 TIOCPKT_DOSTOP = 0x20 TIOCPKT_FLUSHREAD = 0x1 TIOCPKT_FLUSHWRITE = 0x2 TIOCPKT_IOCTL = 0x40 TIOCPKT_NOSTOP = 0x10 TIOCPKT_START = 0x8 TIOCPKT_STOP = 0x4 TIOCPTMGET = 0x40287446 TIOCPTSNAME = 0x40287448 TIOCRCVFRAME = 0x80047445 TIOCREMOTE = 0x80047469 TIOCSBRK = 0x2000747b TIOCSCTTY = 0x20007461 TIOCSDTR = 0x20007479 TIOCSETA = 0x802c7414 TIOCSETAF = 0x802c7416 TIOCSETAW = 0x802c7415 TIOCSETD = 0x8004741b TIOCSFLAGS = 0x8004745c TIOCSIG = 0x2000745f TIOCSLINED = 0x80207443 TIOCSPGRP = 0x80047476 TIOCSQSIZE = 0x80047480 TIOCSSIZE = 0x80087467 TIOCSTART = 0x2000746e TIOCSTAT = 0x80047465 TIOCSTI = 0x80017472 TIOCSTOP = 0x2000746f TIOCSWINSZ = 0x80087467 TIOCUCNTL = 0x80047466 TIOCXMTFRAME = 0x80047444 TOSTOP = 0x400000 VDISCARD = 0xf VDSUSP = 0xb VEOF = 0x0 VEOL = 0x1 VEOL2 = 0x2 VERASE = 0x3 VINTR = 0x8 VKILL = 0x5 VLNEXT = 0xe VMIN = 0x10 VQUIT = 0x9 VREPRINT = 0x6 VSTART = 0xc VSTATUS = 0x12 VSTOP = 0xd VSUSP = 0xa VTIME = 0x11 VWERASE = 0x4 WALL = 0x8 WALLSIG = 0x8 WALTSIG = 0x4 WCLONE = 0x4 WCOREFLAG = 0x80 WNOHANG = 0x1 WNOWAIT = 0x10000 WNOZOMBIE = 0x20000 WOPTSCHECKED = 0x40000 WSTOPPED = 0x7f WUNTRACED = 0x2 ) // Errors const ( E2BIG = syscall.Errno(0x7) EACCES = syscall.Errno(0xd) EADDRINUSE = syscall.Errno(0x30) EADDRNOTAVAIL = syscall.Errno(0x31) EAFNOSUPPORT = syscall.Errno(0x2f) EAGAIN = syscall.Errno(0x23) EALREADY = syscall.Errno(0x25) EAUTH = syscall.Errno(0x50) EBADF = syscall.Errno(0x9) EBADMSG = syscall.Errno(0x58) EBADRPC = syscall.Errno(0x48) EBUSY = syscall.Errno(0x10) ECANCELED = syscall.Errno(0x57) ECHILD = syscall.Errno(0xa) ECONNABORTED = syscall.Errno(0x35) ECONNREFUSED = syscall.Errno(0x3d) ECONNRESET = syscall.Errno(0x36) EDEADLK = syscall.Errno(0xb) EDESTADDRREQ = syscall.Errno(0x27) EDOM = syscall.Errno(0x21) EDQUOT = syscall.Errno(0x45) EEXIST = syscall.Errno(0x11) EFAULT = syscall.Errno(0xe) EFBIG = syscall.Errno(0x1b) EFTYPE = syscall.Errno(0x4f) EHOSTDOWN = syscall.Errno(0x40) EHOSTUNREACH = syscall.Errno(0x41) EIDRM = syscall.Errno(0x52) EILSEQ = syscall.Errno(0x55) EINPROGRESS = syscall.Errno(0x24) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x38) EISDIR = syscall.Errno(0x15) ELAST = syscall.Errno(0x60) ELOOP = syscall.Errno(0x3e) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) EMSGSIZE = syscall.Errno(0x28) EMULTIHOP = syscall.Errno(0x5e) ENAMETOOLONG = syscall.Errno(0x3f) ENEEDAUTH = syscall.Errno(0x51) ENETDOWN = syscall.Errno(0x32) ENETRESET = syscall.Errno(0x34) ENETUNREACH = syscall.Errno(0x33) ENFILE = syscall.Errno(0x17) ENOATTR = syscall.Errno(0x5d) ENOBUFS = syscall.Errno(0x37) ENODATA = syscall.Errno(0x59) ENODEV = syscall.Errno(0x13) ENOENT = syscall.Errno(0x2) ENOEXEC = syscall.Errno(0x8) ENOLCK = syscall.Errno(0x4d) ENOLINK = syscall.Errno(0x5f) ENOMEM = syscall.Errno(0xc) ENOMSG = syscall.Errno(0x53) ENOPROTOOPT = syscall.Errno(0x2a) ENOSPC = syscall.Errno(0x1c) ENOSR = syscall.Errno(0x5a) ENOSTR = syscall.Errno(0x5b) ENOSYS = syscall.Errno(0x4e) ENOTBLK = syscall.Errno(0xf) ENOTCONN = syscall.Errno(0x39) ENOTDIR = syscall.Errno(0x14) ENOTEMPTY = syscall.Errno(0x42) ENOTSOCK = syscall.Errno(0x26) ENOTSUP = syscall.Errno(0x56) ENOTTY = syscall.Errno(0x19) ENXIO = syscall.Errno(0x6) EOPNOTSUPP = syscall.Errno(0x2d) EOVERFLOW = syscall.Errno(0x54) EPERM = syscall.Errno(0x1) EPFNOSUPPORT = syscall.Errno(0x2e) EPIPE = syscall.Errno(0x20) EPROCLIM = syscall.Errno(0x43) EPROCUNAVAIL = syscall.Errno(0x4c) EPROGMISMATCH = syscall.Errno(0x4b) EPROGUNAVAIL = syscall.Errno(0x4a) EPROTO = syscall.Errno(0x60) EPROTONOSUPPORT = syscall.Errno(0x2b) EPROTOTYPE = syscall.Errno(0x29) ERANGE = syscall.Errno(0x22) EREMOTE = syscall.Errno(0x47) EROFS = syscall.Errno(0x1e) ERPCMISMATCH = syscall.Errno(0x49) ESHUTDOWN = syscall.Errno(0x3a) ESOCKTNOSUPPORT = syscall.Errno(0x2c) ESPIPE = syscall.Errno(0x1d) ESRCH = syscall.Errno(0x3) ESTALE = syscall.Errno(0x46) ETIME = syscall.Errno(0x5c) ETIMEDOUT = syscall.Errno(0x3c) ETOOMANYREFS = syscall.Errno(0x3b) ETXTBSY = syscall.Errno(0x1a) EUSERS = syscall.Errno(0x44) EWOULDBLOCK = syscall.Errno(0x23) EXDEV = syscall.Errno(0x12) ) // Signals const ( SIGABRT = syscall.Signal(0x6) SIGALRM = syscall.Signal(0xe) SIGBUS = syscall.Signal(0xa) SIGCHLD = syscall.Signal(0x14) SIGCONT = syscall.Signal(0x13) SIGEMT = syscall.Signal(0x7) SIGFPE = syscall.Signal(0x8) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) SIGINFO = syscall.Signal(0x1d) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x17) SIGIOT = syscall.Signal(0x6) SIGKILL = syscall.Signal(0x9) SIGPIPE = syscall.Signal(0xd) SIGPROF = syscall.Signal(0x1b) SIGPWR = syscall.Signal(0x20) SIGQUIT = syscall.Signal(0x3) SIGSEGV = syscall.Signal(0xb) SIGSTOP = syscall.Signal(0x11) SIGSYS = syscall.Signal(0xc) SIGTERM = syscall.Signal(0xf) SIGTRAP = syscall.Signal(0x5) SIGTSTP = syscall.Signal(0x12) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) SIGURG = syscall.Signal(0x10) SIGUSR1 = syscall.Signal(0x1e) SIGUSR2 = syscall.Signal(0x1f) SIGVTALRM = syscall.Signal(0x1a) SIGWINCH = syscall.Signal(0x1c) SIGXCPU = syscall.Signal(0x18) SIGXFSZ = syscall.Signal(0x19) ) // Error table var errors = [...]string{ 1: "operation not permitted", 2: "no such file or directory", 3: "no such process", 4: "interrupted system call", 5: "input/output error", 6: "device not configured", 7: "argument list too long", 8: "exec format error", 9: "bad file descriptor", 10: "no child processes", 11: "resource deadlock avoided", 12: "cannot allocate memory", 13: "permission denied", 14: "bad address", 15: "block device required", 16: "device busy", 17: "file exists", 18: "cross-device link", 19: "operation not supported by device", 20: "not a directory", 21: "is a directory", 22: "invalid argument", 23: "too many open files in system", 24: "too many open files", 25: "inappropriate ioctl for device", 26: "text file busy", 27: "file too large", 28: "no space left on device", 29: "illegal seek", 30: "read-only file system", 31: "too many links", 32: "broken pipe", 33: "numerical argument out of domain", 34: "result too large or too small", 35: "resource temporarily unavailable", 36: "operation now in progress", 37: "operation already in progress", 38: "socket operation on non-socket", 39: "destination address required", 40: "message too long", 41: "protocol wrong type for socket", 42: "protocol option not available", 43: "protocol not supported", 44: "socket type not supported", 45: "operation not supported", 46: "protocol family not supported", 47: "address family not supported by protocol family", 48: "address already in use", 49: "can't assign requested address", 50: "network is down", 51: "network is unreachable", 52: "network dropped connection on reset", 53: "software caused connection abort", 54: "connection reset by peer", 55: "no buffer space available", 56: "socket is already connected", 57: "socket is not connected", 58: "can't send after socket shutdown", 59: "too many references: can't splice", 60: "connection timed out", 61: "connection refused", 62: "too many levels of symbolic links", 63: "file name too long", 64: "host is down", 65: "no route to host", 66: "directory not empty", 67: "too many processes", 68: "too many users", 69: "disc quota exceeded", 70: "stale NFS file handle", 71: "too many levels of remote in path", 72: "RPC struct is bad", 73: "RPC version wrong", 74: "RPC prog. not avail", 75: "program version wrong", 76: "bad procedure for program", 77: "no locks available", 78: "function not implemented", 79: "inappropriate file type or format", 80: "authentication error", 81: "need authenticator", 82: "identifier removed", 83: "no message of desired type", 84: "value too large to be stored in data type", 85: "illegal byte sequence", 86: "not supported", 87: "operation Canceled", 88: "bad or Corrupt message", 89: "no message available", 90: "no STREAM resources", 91: "not a STREAM", 92: "STREAM ioctl timeout", 93: "attribute not found", 94: "multihop attempted", 95: "link has been severed", 96: "protocol error", } // Signal table var signals = [...]string{ 1: "hangup", 2: "interrupt", 3: "quit", 4: "illegal instruction", 5: "trace/BPT trap", 6: "abort trap", 7: "EMT trap", 8: "floating point exception", 9: "killed", 10: "bus error", 11: "segmentation fault", 12: "bad system call", 13: "broken pipe", 14: "alarm clock", 15: "terminated", 16: "urgent I/O condition", 17: "stopped (signal)", 18: "stopped", 19: "continued", 20: "child exited", 21: "stopped (tty input)", 22: "stopped (tty output)", 23: "I/O possible", 24: "cputime limit exceeded", 25: "filesize limit exceeded", 26: "virtual timer expired", 27: "profiling timer expired", 28: "window size changes", 29: "information request", 30: "user defined signal 1", 31: "user defined signal 2", 32: "power fail/restart", } ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go ================================================ // mkerrors.sh -m64 // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT // +build amd64,netbsd // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- -m64 _const.go package unix import "syscall" const ( AF_APPLETALK = 0x10 AF_ARP = 0x1c AF_BLUETOOTH = 0x1f AF_CCITT = 0xa AF_CHAOS = 0x5 AF_CNT = 0x15 AF_COIP = 0x14 AF_DATAKIT = 0x9 AF_DECnet = 0xc AF_DLI = 0xd AF_E164 = 0x1a AF_ECMA = 0x8 AF_HYLINK = 0xf AF_IEEE80211 = 0x20 AF_IMPLINK = 0x3 AF_INET = 0x2 AF_INET6 = 0x18 AF_IPX = 0x17 AF_ISDN = 0x1a AF_ISO = 0x7 AF_LAT = 0xe AF_LINK = 0x12 AF_LOCAL = 0x1 AF_MAX = 0x23 AF_MPLS = 0x21 AF_NATM = 0x1b AF_NS = 0x6 AF_OROUTE = 0x11 AF_OSI = 0x7 AF_PUP = 0x4 AF_ROUTE = 0x22 AF_SNA = 0xb AF_UNIX = 0x1 AF_UNSPEC = 0x0 ARPHRD_ARCNET = 0x7 ARPHRD_ETHER = 0x1 ARPHRD_FRELAY = 0xf ARPHRD_IEEE1394 = 0x18 ARPHRD_IEEE802 = 0x6 ARPHRD_STRIP = 0x17 B0 = 0x0 B110 = 0x6e B115200 = 0x1c200 B1200 = 0x4b0 B134 = 0x86 B14400 = 0x3840 B150 = 0x96 B1800 = 0x708 B19200 = 0x4b00 B200 = 0xc8 B230400 = 0x38400 B2400 = 0x960 B28800 = 0x7080 B300 = 0x12c B38400 = 0x9600 B460800 = 0x70800 B4800 = 0x12c0 B50 = 0x32 B57600 = 0xe100 B600 = 0x258 B7200 = 0x1c20 B75 = 0x4b B76800 = 0x12c00 B921600 = 0xe1000 B9600 = 0x2580 BIOCFEEDBACK = 0x8004427d BIOCFLUSH = 0x20004268 BIOCGBLEN = 0x40044266 BIOCGDLT = 0x4004426a BIOCGDLTLIST = 0xc0104277 BIOCGETIF = 0x4090426b BIOCGFEEDBACK = 0x4004427c BIOCGHDRCMPLT = 0x40044274 BIOCGRTIMEOUT = 0x4010427b BIOCGSEESENT = 0x40044278 BIOCGSTATS = 0x4080426f BIOCGSTATSOLD = 0x4008426f BIOCIMMEDIATE = 0x80044270 BIOCPROMISC = 0x20004269 BIOCSBLEN = 0xc0044266 BIOCSDLT = 0x80044276 BIOCSETF = 0x80104267 BIOCSETIF = 0x8090426c BIOCSFEEDBACK = 0x8004427d BIOCSHDRCMPLT = 0x80044275 BIOCSRTIMEOUT = 0x8010427a BIOCSSEESENT = 0x80044279 BIOCSTCPF = 0x80104272 BIOCSUDPF = 0x80104273 BIOCVERSION = 0x40044271 BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALIGNMENT = 0x8 BPF_ALIGNMENT32 = 0x4 BPF_ALU = 0x4 BPF_AND = 0x50 BPF_B = 0x10 BPF_DFLTBUFSIZE = 0x100000 BPF_DIV = 0x30 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 BPF_JA = 0x0 BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 BPF_JMP = 0x5 BPF_JSET = 0x40 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 BPF_LEN = 0x80 BPF_LSH = 0x60 BPF_MAJOR_VERSION = 0x1 BPF_MAXBUFSIZE = 0x1000000 BPF_MAXINSNS = 0x200 BPF_MEM = 0x60 BPF_MEMWORDS = 0x10 BPF_MINBUFSIZE = 0x20 BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_OR = 0x40 BPF_RELEASE = 0x30bb6 BPF_RET = 0x6 BPF_RSH = 0x70 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 BPF_TAX = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 BRKINT = 0x2 CFLUSH = 0xf CLOCAL = 0x8000 CLONE_CSIGNAL = 0xff CLONE_FILES = 0x400 CLONE_FS = 0x200 CLONE_PID = 0x1000 CLONE_PTRACE = 0x2000 CLONE_SIGHAND = 0x800 CLONE_VFORK = 0x4000 CLONE_VM = 0x100 CREAD = 0x800 CS5 = 0x0 CS6 = 0x100 CS7 = 0x200 CS8 = 0x300 CSIZE = 0x300 CSTART = 0x11 CSTATUS = 0x14 CSTOP = 0x13 CSTOPB = 0x400 CSUSP = 0x1a CTL_MAXNAME = 0xc CTL_NET = 0x4 CTL_QUERY = -0x2 DIOCBSFLUSH = 0x20006478 DLT_A429 = 0xb8 DLT_A653_ICM = 0xb9 DLT_AIRONET_HEADER = 0x78 DLT_AOS = 0xde DLT_APPLE_IP_OVER_IEEE1394 = 0x8a DLT_ARCNET = 0x7 DLT_ARCNET_LINUX = 0x81 DLT_ATM_CLIP = 0x13 DLT_ATM_RFC1483 = 0xb DLT_AURORA = 0x7e DLT_AX25 = 0x3 DLT_AX25_KISS = 0xca DLT_BACNET_MS_TP = 0xa5 DLT_BLUETOOTH_HCI_H4 = 0xbb DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 DLT_CAN20B = 0xbe DLT_CAN_SOCKETCAN = 0xe3 DLT_CHAOS = 0x5 DLT_CISCO_IOS = 0x76 DLT_C_HDLC = 0x68 DLT_C_HDLC_WITH_DIR = 0xcd DLT_DECT = 0xdd DLT_DOCSIS = 0x8f DLT_ECONET = 0x73 DLT_EN10MB = 0x1 DLT_EN3MB = 0x2 DLT_ENC = 0x6d DLT_ERF = 0xc5 DLT_ERF_ETH = 0xaf DLT_ERF_POS = 0xb0 DLT_FC_2 = 0xe0 DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 DLT_FDDI = 0xa DLT_FLEXRAY = 0xd2 DLT_FRELAY = 0x6b DLT_FRELAY_WITH_DIR = 0xce DLT_GCOM_SERIAL = 0xad DLT_GCOM_T1E1 = 0xac DLT_GPF_F = 0xab DLT_GPF_T = 0xaa DLT_GPRS_LLC = 0xa9 DLT_GSMTAP_ABIS = 0xda DLT_GSMTAP_UM = 0xd9 DLT_HDLC = 0x10 DLT_HHDLC = 0x79 DLT_HIPPI = 0xf DLT_IBM_SN = 0x92 DLT_IBM_SP = 0x91 DLT_IEEE802 = 0x6 DLT_IEEE802_11 = 0x69 DLT_IEEE802_11_RADIO = 0x7f DLT_IEEE802_11_RADIO_AVS = 0xa3 DLT_IEEE802_15_4 = 0xc3 DLT_IEEE802_15_4_LINUX = 0xbf DLT_IEEE802_15_4_NONASK_PHY = 0xd7 DLT_IEEE802_16_MAC_CPS = 0xbc DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 DLT_IPMB = 0xc7 DLT_IPMB_LINUX = 0xd1 DLT_IPNET = 0xe2 DLT_IPV4 = 0xe4 DLT_IPV6 = 0xe5 DLT_IP_OVER_FC = 0x7a DLT_JUNIPER_ATM1 = 0x89 DLT_JUNIPER_ATM2 = 0x87 DLT_JUNIPER_CHDLC = 0xb5 DLT_JUNIPER_ES = 0x84 DLT_JUNIPER_ETHER = 0xb2 DLT_JUNIPER_FRELAY = 0xb4 DLT_JUNIPER_GGSN = 0x85 DLT_JUNIPER_ISM = 0xc2 DLT_JUNIPER_MFR = 0x86 DLT_JUNIPER_MLFR = 0x83 DLT_JUNIPER_MLPPP = 0x82 DLT_JUNIPER_MONITOR = 0xa4 DLT_JUNIPER_PIC_PEER = 0xae DLT_JUNIPER_PPP = 0xb3 DLT_JUNIPER_PPPOE = 0xa7 DLT_JUNIPER_PPPOE_ATM = 0xa8 DLT_JUNIPER_SERVICES = 0x88 DLT_JUNIPER_ST = 0xc8 DLT_JUNIPER_VP = 0xb7 DLT_LAPB_WITH_DIR = 0xcf DLT_LAPD = 0xcb DLT_LIN = 0xd4 DLT_LINUX_EVDEV = 0xd8 DLT_LINUX_IRDA = 0x90 DLT_LINUX_LAPD = 0xb1 DLT_LINUX_SLL = 0x71 DLT_LOOP = 0x6c DLT_LTALK = 0x72 DLT_MFR = 0xb6 DLT_MOST = 0xd3 DLT_MPLS = 0xdb DLT_MTP2 = 0x8c DLT_MTP2_WITH_PHDR = 0x8b DLT_MTP3 = 0x8d DLT_NULL = 0x0 DLT_PCI_EXP = 0x7d DLT_PFLOG = 0x75 DLT_PFSYNC = 0x12 DLT_PPI = 0xc0 DLT_PPP = 0x9 DLT_PPP_BSDOS = 0xe DLT_PPP_ETHER = 0x33 DLT_PPP_PPPD = 0xa6 DLT_PPP_SERIAL = 0x32 DLT_PPP_WITH_DIR = 0xcc DLT_PRISM_HEADER = 0x77 DLT_PRONET = 0x4 DLT_RAIF1 = 0xc6 DLT_RAW = 0xc DLT_RAWAF_MASK = 0x2240000 DLT_RIO = 0x7c DLT_SCCP = 0x8e DLT_SITA = 0xc4 DLT_SLIP = 0x8 DLT_SLIP_BSDOS = 0xd DLT_SUNATM = 0x7b DLT_SYMANTEC_FIREWALL = 0x63 DLT_TZSP = 0x80 DLT_USB = 0xba DLT_USB_LINUX = 0xbd DLT_USB_LINUX_MMAPPED = 0xdc DLT_WIHART = 0xdf DLT_X2E_SERIAL = 0xd5 DLT_X2E_XORAYA = 0xd6 DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 DT_FIFO = 0x1 DT_LNK = 0xa DT_REG = 0x8 DT_SOCK = 0xc DT_UNKNOWN = 0x0 DT_WHT = 0xe ECHO = 0x8 ECHOCTL = 0x40 ECHOE = 0x2 ECHOK = 0x4 ECHOKE = 0x1 ECHONL = 0x10 ECHOPRT = 0x20 EMUL_LINUX = 0x1 EMUL_LINUX32 = 0x5 EMUL_MAXID = 0x6 ETHERCAP_JUMBO_MTU = 0x4 ETHERCAP_VLAN_HWTAGGING = 0x2 ETHERCAP_VLAN_MTU = 0x1 ETHERMIN = 0x2e ETHERMTU = 0x5dc ETHERMTU_JUMBO = 0x2328 ETHERTYPE_8023 = 0x4 ETHERTYPE_AARP = 0x80f3 ETHERTYPE_ACCTON = 0x8390 ETHERTYPE_AEONIC = 0x8036 ETHERTYPE_ALPHA = 0x814a ETHERTYPE_AMBER = 0x6008 ETHERTYPE_AMOEBA = 0x8145 ETHERTYPE_APOLLO = 0x80f7 ETHERTYPE_APOLLODOMAIN = 0x8019 ETHERTYPE_APPLETALK = 0x809b ETHERTYPE_APPLITEK = 0x80c7 ETHERTYPE_ARGONAUT = 0x803a ETHERTYPE_ARP = 0x806 ETHERTYPE_AT = 0x809b ETHERTYPE_ATALK = 0x809b ETHERTYPE_ATOMIC = 0x86df ETHERTYPE_ATT = 0x8069 ETHERTYPE_ATTSTANFORD = 0x8008 ETHERTYPE_AUTOPHON = 0x806a ETHERTYPE_AXIS = 0x8856 ETHERTYPE_BCLOOP = 0x9003 ETHERTYPE_BOFL = 0x8102 ETHERTYPE_CABLETRON = 0x7034 ETHERTYPE_CHAOS = 0x804 ETHERTYPE_COMDESIGN = 0x806c ETHERTYPE_COMPUGRAPHIC = 0x806d ETHERTYPE_COUNTERPOINT = 0x8062 ETHERTYPE_CRONUS = 0x8004 ETHERTYPE_CRONUSVLN = 0x8003 ETHERTYPE_DCA = 0x1234 ETHERTYPE_DDE = 0x807b ETHERTYPE_DEBNI = 0xaaaa ETHERTYPE_DECAM = 0x8048 ETHERTYPE_DECCUST = 0x6006 ETHERTYPE_DECDIAG = 0x6005 ETHERTYPE_DECDNS = 0x803c ETHERTYPE_DECDTS = 0x803e ETHERTYPE_DECEXPER = 0x6000 ETHERTYPE_DECLAST = 0x8041 ETHERTYPE_DECLTM = 0x803f ETHERTYPE_DECMUMPS = 0x6009 ETHERTYPE_DECNETBIOS = 0x8040 ETHERTYPE_DELTACON = 0x86de ETHERTYPE_DIDDLE = 0x4321 ETHERTYPE_DLOG1 = 0x660 ETHERTYPE_DLOG2 = 0x661 ETHERTYPE_DN = 0x6003 ETHERTYPE_DOGFIGHT = 0x1989 ETHERTYPE_DSMD = 0x8039 ETHERTYPE_ECMA = 0x803 ETHERTYPE_ENCRYPT = 0x803d ETHERTYPE_ES = 0x805d ETHERTYPE_EXCELAN = 0x8010 ETHERTYPE_EXPERDATA = 0x8049 ETHERTYPE_FLIP = 0x8146 ETHERTYPE_FLOWCONTROL = 0x8808 ETHERTYPE_FRARP = 0x808 ETHERTYPE_GENDYN = 0x8068 ETHERTYPE_HAYES = 0x8130 ETHERTYPE_HIPPI_FP = 0x8180 ETHERTYPE_HITACHI = 0x8820 ETHERTYPE_HP = 0x8005 ETHERTYPE_IEEEPUP = 0xa00 ETHERTYPE_IEEEPUPAT = 0xa01 ETHERTYPE_IMLBL = 0x4c42 ETHERTYPE_IMLBLDIAG = 0x424c ETHERTYPE_IP = 0x800 ETHERTYPE_IPAS = 0x876c ETHERTYPE_IPV6 = 0x86dd ETHERTYPE_IPX = 0x8137 ETHERTYPE_IPXNEW = 0x8037 ETHERTYPE_KALPANA = 0x8582 ETHERTYPE_LANBRIDGE = 0x8038 ETHERTYPE_LANPROBE = 0x8888 ETHERTYPE_LAT = 0x6004 ETHERTYPE_LBACK = 0x9000 ETHERTYPE_LITTLE = 0x8060 ETHERTYPE_LOGICRAFT = 0x8148 ETHERTYPE_LOOPBACK = 0x9000 ETHERTYPE_MATRA = 0x807a ETHERTYPE_MAX = 0xffff ETHERTYPE_MERIT = 0x807c ETHERTYPE_MICP = 0x873a ETHERTYPE_MOPDL = 0x6001 ETHERTYPE_MOPRC = 0x6002 ETHERTYPE_MOTOROLA = 0x818d ETHERTYPE_MPLS = 0x8847 ETHERTYPE_MPLS_MCAST = 0x8848 ETHERTYPE_MUMPS = 0x813f ETHERTYPE_NBPCC = 0x3c04 ETHERTYPE_NBPCLAIM = 0x3c09 ETHERTYPE_NBPCLREQ = 0x3c05 ETHERTYPE_NBPCLRSP = 0x3c06 ETHERTYPE_NBPCREQ = 0x3c02 ETHERTYPE_NBPCRSP = 0x3c03 ETHERTYPE_NBPDG = 0x3c07 ETHERTYPE_NBPDGB = 0x3c08 ETHERTYPE_NBPDLTE = 0x3c0a ETHERTYPE_NBPRAR = 0x3c0c ETHERTYPE_NBPRAS = 0x3c0b ETHERTYPE_NBPRST = 0x3c0d ETHERTYPE_NBPSCD = 0x3c01 ETHERTYPE_NBPVCD = 0x3c00 ETHERTYPE_NBS = 0x802 ETHERTYPE_NCD = 0x8149 ETHERTYPE_NESTAR = 0x8006 ETHERTYPE_NETBEUI = 0x8191 ETHERTYPE_NOVELL = 0x8138 ETHERTYPE_NS = 0x600 ETHERTYPE_NSAT = 0x601 ETHERTYPE_NSCOMPAT = 0x807 ETHERTYPE_NTRAILER = 0x10 ETHERTYPE_OS9 = 0x7007 ETHERTYPE_OS9NET = 0x7009 ETHERTYPE_PACER = 0x80c6 ETHERTYPE_PAE = 0x888e ETHERTYPE_PCS = 0x4242 ETHERTYPE_PLANNING = 0x8044 ETHERTYPE_PPP = 0x880b ETHERTYPE_PPPOE = 0x8864 ETHERTYPE_PPPOEDISC = 0x8863 ETHERTYPE_PRIMENTS = 0x7031 ETHERTYPE_PUP = 0x200 ETHERTYPE_PUPAT = 0x200 ETHERTYPE_RACAL = 0x7030 ETHERTYPE_RATIONAL = 0x8150 ETHERTYPE_RAWFR = 0x6559 ETHERTYPE_RCL = 0x1995 ETHERTYPE_RDP = 0x8739 ETHERTYPE_RETIX = 0x80f2 ETHERTYPE_REVARP = 0x8035 ETHERTYPE_SCA = 0x6007 ETHERTYPE_SECTRA = 0x86db ETHERTYPE_SECUREDATA = 0x876d ETHERTYPE_SGITW = 0x817e ETHERTYPE_SG_BOUNCE = 0x8016 ETHERTYPE_SG_DIAG = 0x8013 ETHERTYPE_SG_NETGAMES = 0x8014 ETHERTYPE_SG_RESV = 0x8015 ETHERTYPE_SIMNET = 0x5208 ETHERTYPE_SLOWPROTOCOLS = 0x8809 ETHERTYPE_SNA = 0x80d5 ETHERTYPE_SNMP = 0x814c ETHERTYPE_SONIX = 0xfaf5 ETHERTYPE_SPIDER = 0x809f ETHERTYPE_SPRITE = 0x500 ETHERTYPE_STP = 0x8181 ETHERTYPE_TALARIS = 0x812b ETHERTYPE_TALARISMC = 0x852b ETHERTYPE_TCPCOMP = 0x876b ETHERTYPE_TCPSM = 0x9002 ETHERTYPE_TEC = 0x814f ETHERTYPE_TIGAN = 0x802f ETHERTYPE_TRAIL = 0x1000 ETHERTYPE_TRANSETHER = 0x6558 ETHERTYPE_TYMSHARE = 0x802e ETHERTYPE_UBBST = 0x7005 ETHERTYPE_UBDEBUG = 0x900 ETHERTYPE_UBDIAGLOOP = 0x7002 ETHERTYPE_UBDL = 0x7000 ETHERTYPE_UBNIU = 0x7001 ETHERTYPE_UBNMC = 0x7003 ETHERTYPE_VALID = 0x1600 ETHERTYPE_VARIAN = 0x80dd ETHERTYPE_VAXELN = 0x803b ETHERTYPE_VEECO = 0x8067 ETHERTYPE_VEXP = 0x805b ETHERTYPE_VGLAB = 0x8131 ETHERTYPE_VINES = 0xbad ETHERTYPE_VINESECHO = 0xbaf ETHERTYPE_VINESLOOP = 0xbae ETHERTYPE_VITAL = 0xff00 ETHERTYPE_VLAN = 0x8100 ETHERTYPE_VLTLMAN = 0x8080 ETHERTYPE_VPROD = 0x805c ETHERTYPE_VURESERVED = 0x8147 ETHERTYPE_WATERLOO = 0x8130 ETHERTYPE_WELLFLEET = 0x8103 ETHERTYPE_X25 = 0x805 ETHERTYPE_X75 = 0x801 ETHERTYPE_XNSSM = 0x9001 ETHERTYPE_XTP = 0x817d ETHER_ADDR_LEN = 0x6 ETHER_CRC_LEN = 0x4 ETHER_CRC_POLY_BE = 0x4c11db6 ETHER_CRC_POLY_LE = 0xedb88320 ETHER_HDR_LEN = 0xe ETHER_MAX_LEN = 0x5ee ETHER_MAX_LEN_JUMBO = 0x233a ETHER_MIN_LEN = 0x40 ETHER_PPPOE_ENCAP_LEN = 0x8 ETHER_TYPE_LEN = 0x2 ETHER_VLAN_ENCAP_LEN = 0x4 EVFILT_AIO = 0x2 EVFILT_PROC = 0x4 EVFILT_READ = 0x0 EVFILT_SIGNAL = 0x5 EVFILT_SYSCOUNT = 0x7 EVFILT_TIMER = 0x6 EVFILT_VNODE = 0x3 EVFILT_WRITE = 0x1 EV_ADD = 0x1 EV_CLEAR = 0x20 EV_DELETE = 0x2 EV_DISABLE = 0x8 EV_ENABLE = 0x4 EV_EOF = 0x8000 EV_ERROR = 0x4000 EV_FLAG1 = 0x2000 EV_ONESHOT = 0x10 EV_SYSFLAGS = 0xf000 EXTA = 0x4b00 EXTB = 0x9600 EXTPROC = 0x800 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x100 FLUSHO = 0x800000 F_CLOSEM = 0xa F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0xc F_FSCTL = -0x80000000 F_FSDIRMASK = 0x70000000 F_FSIN = 0x10000000 F_FSINOUT = 0x30000000 F_FSOUT = 0x20000000 F_FSPRIV = 0x8000 F_FSVOID = 0x40000000 F_GETFD = 0x1 F_GETFL = 0x3 F_GETLK = 0x7 F_GETNOSIGPIPE = 0xd F_GETOWN = 0x5 F_MAXFD = 0xb F_OK = 0x0 F_PARAM_MASK = 0xfff F_PARAM_MAX = 0xfff F_RDLCK = 0x1 F_SETFD = 0x2 F_SETFL = 0x4 F_SETLK = 0x8 F_SETLKW = 0x9 F_SETNOSIGPIPE = 0xe F_SETOWN = 0x6 F_UNLCK = 0x2 F_WRLCK = 0x3 HUPCL = 0x4000 ICANON = 0x100 ICMP6_FILTER = 0x12 ICRNL = 0x100 IEXTEN = 0x400 IFAN_ARRIVAL = 0x0 IFAN_DEPARTURE = 0x1 IFA_ROUTE = 0x1 IFF_ALLMULTI = 0x200 IFF_BROADCAST = 0x2 IFF_CANTCHANGE = 0x8f52 IFF_DEBUG = 0x4 IFF_LINK0 = 0x1000 IFF_LINK1 = 0x2000 IFF_LINK2 = 0x4000 IFF_LOOPBACK = 0x8 IFF_MULTICAST = 0x8000 IFF_NOARP = 0x80 IFF_NOTRAILERS = 0x20 IFF_OACTIVE = 0x400 IFF_POINTOPOINT = 0x10 IFF_PROMISC = 0x100 IFF_RUNNING = 0x40 IFF_SIMPLEX = 0x800 IFF_UP = 0x1 IFNAMSIZ = 0x10 IFT_1822 = 0x2 IFT_A12MPPSWITCH = 0x82 IFT_AAL2 = 0xbb IFT_AAL5 = 0x31 IFT_ADSL = 0x5e IFT_AFLANE8023 = 0x3b IFT_AFLANE8025 = 0x3c IFT_ARAP = 0x58 IFT_ARCNET = 0x23 IFT_ARCNETPLUS = 0x24 IFT_ASYNC = 0x54 IFT_ATM = 0x25 IFT_ATMDXI = 0x69 IFT_ATMFUNI = 0x6a IFT_ATMIMA = 0x6b IFT_ATMLOGICAL = 0x50 IFT_ATMRADIO = 0xbd IFT_ATMSUBINTERFACE = 0x86 IFT_ATMVCIENDPT = 0xc2 IFT_ATMVIRTUAL = 0x95 IFT_BGPPOLICYACCOUNTING = 0xa2 IFT_BRIDGE = 0xd1 IFT_BSC = 0x53 IFT_CARP = 0xf8 IFT_CCTEMUL = 0x3d IFT_CEPT = 0x13 IFT_CES = 0x85 IFT_CHANNEL = 0x46 IFT_CNR = 0x55 IFT_COFFEE = 0x84 IFT_COMPOSITELINK = 0x9b IFT_DCN = 0x8d IFT_DIGITALPOWERLINE = 0x8a IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba IFT_DLSW = 0x4a IFT_DOCSCABLEDOWNSTREAM = 0x80 IFT_DOCSCABLEMACLAYER = 0x7f IFT_DOCSCABLEUPSTREAM = 0x81 IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd IFT_DS0 = 0x51 IFT_DS0BUNDLE = 0x52 IFT_DS1FDL = 0xaa IFT_DS3 = 0x1e IFT_DTM = 0x8c IFT_DVBASILN = 0xac IFT_DVBASIOUT = 0xad IFT_DVBRCCDOWNSTREAM = 0x93 IFT_DVBRCCMACLAYER = 0x92 IFT_DVBRCCUPSTREAM = 0x94 IFT_ECONET = 0xce IFT_EON = 0x19 IFT_EPLRS = 0x57 IFT_ESCON = 0x49 IFT_ETHER = 0x6 IFT_FAITH = 0xf2 IFT_FAST = 0x7d IFT_FASTETHER = 0x3e IFT_FASTETHERFX = 0x45 IFT_FDDI = 0xf IFT_FIBRECHANNEL = 0x38 IFT_FRAMERELAYINTERCONNECT = 0x3a IFT_FRAMERELAYMPI = 0x5c IFT_FRDLCIENDPT = 0xc1 IFT_FRELAY = 0x20 IFT_FRELAYDCE = 0x2c IFT_FRF16MFRBUNDLE = 0xa3 IFT_FRFORWARD = 0x9e IFT_G703AT2MB = 0x43 IFT_G703AT64K = 0x42 IFT_GIF = 0xf0 IFT_GIGABITETHERNET = 0x75 IFT_GR303IDT = 0xb2 IFT_GR303RDT = 0xb1 IFT_H323GATEKEEPER = 0xa4 IFT_H323PROXY = 0xa5 IFT_HDH1822 = 0x3 IFT_HDLC = 0x76 IFT_HDSL2 = 0xa8 IFT_HIPERLAN2 = 0xb7 IFT_HIPPI = 0x2f IFT_HIPPIINTERFACE = 0x39 IFT_HOSTPAD = 0x5a IFT_HSSI = 0x2e IFT_HY = 0xe IFT_IBM370PARCHAN = 0x48 IFT_IDSL = 0x9a IFT_IEEE1394 = 0x90 IFT_IEEE80211 = 0x47 IFT_IEEE80212 = 0x37 IFT_IEEE8023ADLAG = 0xa1 IFT_IFGSN = 0x91 IFT_IMT = 0xbe IFT_INFINIBAND = 0xc7 IFT_INTERLEAVE = 0x7c IFT_IP = 0x7e IFT_IPFORWARD = 0x8e IFT_IPOVERATM = 0x72 IFT_IPOVERCDLC = 0x6d IFT_IPOVERCLAW = 0x6e IFT_IPSWITCH = 0x4e IFT_ISDN = 0x3f IFT_ISDNBASIC = 0x14 IFT_ISDNPRIMARY = 0x15 IFT_ISDNS = 0x4b IFT_ISDNU = 0x4c IFT_ISO88022LLC = 0x29 IFT_ISO88023 = 0x7 IFT_ISO88024 = 0x8 IFT_ISO88025 = 0x9 IFT_ISO88025CRFPINT = 0x62 IFT_ISO88025DTR = 0x56 IFT_ISO88025FIBER = 0x73 IFT_ISO88026 = 0xa IFT_ISUP = 0xb3 IFT_L2VLAN = 0x87 IFT_L3IPVLAN = 0x88 IFT_L3IPXVLAN = 0x89 IFT_LAPB = 0x10 IFT_LAPD = 0x4d IFT_LAPF = 0x77 IFT_LINEGROUP = 0xd2 IFT_LOCALTALK = 0x2a IFT_LOOP = 0x18 IFT_MEDIAMAILOVERIP = 0x8b IFT_MFSIGLINK = 0xa7 IFT_MIOX25 = 0x26 IFT_MODEM = 0x30 IFT_MPC = 0x71 IFT_MPLS = 0xa6 IFT_MPLSTUNNEL = 0x96 IFT_MSDSL = 0x8f IFT_MVL = 0xbf IFT_MYRINET = 0x63 IFT_NFAS = 0xaf IFT_NSIP = 0x1b IFT_OPTICALCHANNEL = 0xc3 IFT_OPTICALTRANSPORT = 0xc4 IFT_OTHER = 0x1 IFT_P10 = 0xc IFT_P80 = 0xd IFT_PARA = 0x22 IFT_PFLOG = 0xf5 IFT_PFSYNC = 0xf6 IFT_PLC = 0xae IFT_PON155 = 0xcf IFT_PON622 = 0xd0 IFT_POS = 0xab IFT_PPP = 0x17 IFT_PPPMULTILINKBUNDLE = 0x6c IFT_PROPATM = 0xc5 IFT_PROPBWAP2MP = 0xb8 IFT_PROPCNLS = 0x59 IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 IFT_PROPMUX = 0x36 IFT_PROPVIRTUAL = 0x35 IFT_PROPWIRELESSP2P = 0x9d IFT_PTPSERIAL = 0x16 IFT_PVC = 0xf1 IFT_Q2931 = 0xc9 IFT_QLLC = 0x44 IFT_RADIOMAC = 0xbc IFT_RADSL = 0x5f IFT_REACHDSL = 0xc0 IFT_RFC1483 = 0x9f IFT_RS232 = 0x21 IFT_RSRB = 0x4f IFT_SDLC = 0x11 IFT_SDSL = 0x60 IFT_SHDSL = 0xa9 IFT_SIP = 0x1f IFT_SIPSIG = 0xcc IFT_SIPTG = 0xcb IFT_SLIP = 0x1c IFT_SMDSDXI = 0x2b IFT_SMDSICIP = 0x34 IFT_SONET = 0x27 IFT_SONETOVERHEADCHANNEL = 0xb9 IFT_SONETPATH = 0x32 IFT_SONETVT = 0x33 IFT_SRP = 0x97 IFT_SS7SIGLINK = 0x9c IFT_STACKTOSTACK = 0x6f IFT_STARLAN = 0xb IFT_STF = 0xd7 IFT_T1 = 0x12 IFT_TDLC = 0x74 IFT_TELINK = 0xc8 IFT_TERMPAD = 0x5b IFT_TR008 = 0xb0 IFT_TRANSPHDLC = 0x7b IFT_TUNNEL = 0x83 IFT_ULTRA = 0x1d IFT_USB = 0xa0 IFT_V11 = 0x40 IFT_V35 = 0x2d IFT_V36 = 0x41 IFT_V37 = 0x78 IFT_VDSL = 0x61 IFT_VIRTUALIPADDRESS = 0x70 IFT_VIRTUALTG = 0xca IFT_VOICEDID = 0xd5 IFT_VOICEEM = 0x64 IFT_VOICEEMFGD = 0xd3 IFT_VOICEENCAP = 0x67 IFT_VOICEFGDEANA = 0xd4 IFT_VOICEFXO = 0x65 IFT_VOICEFXS = 0x66 IFT_VOICEOVERATM = 0x98 IFT_VOICEOVERCABLE = 0xc6 IFT_VOICEOVERFRAMERELAY = 0x99 IFT_VOICEOVERIP = 0x68 IFT_X213 = 0x5d IFT_X25 = 0x5 IFT_X25DDN = 0x4 IFT_X25HUNTGROUP = 0x7a IFT_X25MLP = 0x79 IFT_X25PLE = 0x28 IFT_XETHER = 0x1a IGNBRK = 0x1 IGNCR = 0x80 IGNPAR = 0x4 IMAXBEL = 0x2000 INLCR = 0x40 INPCK = 0x10 IN_CLASSA_HOST = 0xffffff IN_CLASSA_MAX = 0x80 IN_CLASSA_NET = 0xff000000 IN_CLASSA_NSHIFT = 0x18 IN_CLASSB_HOST = 0xffff IN_CLASSB_MAX = 0x10000 IN_CLASSB_NET = 0xffff0000 IN_CLASSB_NSHIFT = 0x10 IN_CLASSC_HOST = 0xff IN_CLASSC_NET = 0xffffff00 IN_CLASSC_NSHIFT = 0x8 IN_CLASSD_HOST = 0xfffffff IN_CLASSD_NET = 0xf0000000 IN_CLASSD_NSHIFT = 0x1c IN_LOOPBACKNET = 0x7f IPPROTO_AH = 0x33 IPPROTO_CARP = 0x70 IPPROTO_DONE = 0x101 IPPROTO_DSTOPTS = 0x3c IPPROTO_EGP = 0x8 IPPROTO_ENCAP = 0x62 IPPROTO_EON = 0x50 IPPROTO_ESP = 0x32 IPPROTO_ETHERIP = 0x61 IPPROTO_FRAGMENT = 0x2c IPPROTO_GGP = 0x3 IPPROTO_GRE = 0x2f IPPROTO_HOPOPTS = 0x0 IPPROTO_ICMP = 0x1 IPPROTO_ICMPV6 = 0x3a IPPROTO_IDP = 0x16 IPPROTO_IGMP = 0x2 IPPROTO_IP = 0x0 IPPROTO_IPCOMP = 0x6c IPPROTO_IPIP = 0x4 IPPROTO_IPV4 = 0x4 IPPROTO_IPV6 = 0x29 IPPROTO_IPV6_ICMP = 0x3a IPPROTO_MAX = 0x100 IPPROTO_MAXID = 0x34 IPPROTO_MOBILE = 0x37 IPPROTO_NONE = 0x3b IPPROTO_PFSYNC = 0xf0 IPPROTO_PIM = 0x67 IPPROTO_PUP = 0xc IPPROTO_RAW = 0xff IPPROTO_ROUTING = 0x2b IPPROTO_RSVP = 0x2e IPPROTO_TCP = 0x6 IPPROTO_TP = 0x1d IPPROTO_UDP = 0x11 IPPROTO_VRRP = 0x70 IPV6_CHECKSUM = 0x1a IPV6_DEFAULT_MULTICAST_HOPS = 0x1 IPV6_DEFAULT_MULTICAST_LOOP = 0x1 IPV6_DEFHLIM = 0x40 IPV6_DONTFRAG = 0x3e IPV6_DSTOPTS = 0x32 IPV6_FAITH = 0x1d IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 IPV6_FRAGTTL = 0x78 IPV6_HLIMDEC = 0x1 IPV6_HOPLIMIT = 0x2f IPV6_HOPOPTS = 0x31 IPV6_IPSEC_POLICY = 0x1c IPV6_JOIN_GROUP = 0xc IPV6_LEAVE_GROUP = 0xd IPV6_MAXHLIM = 0xff IPV6_MAXPACKET = 0xffff IPV6_MMTU = 0x500 IPV6_MULTICAST_HOPS = 0xa IPV6_MULTICAST_IF = 0x9 IPV6_MULTICAST_LOOP = 0xb IPV6_NEXTHOP = 0x30 IPV6_PATHMTU = 0x2c IPV6_PKTINFO = 0x2e IPV6_PORTRANGE = 0xe IPV6_PORTRANGE_DEFAULT = 0x0 IPV6_PORTRANGE_HIGH = 0x1 IPV6_PORTRANGE_LOW = 0x2 IPV6_RECVDSTOPTS = 0x28 IPV6_RECVHOPLIMIT = 0x25 IPV6_RECVHOPOPTS = 0x27 IPV6_RECVPATHMTU = 0x2b IPV6_RECVPKTINFO = 0x24 IPV6_RECVRTHDR = 0x26 IPV6_RECVTCLASS = 0x39 IPV6_RTHDR = 0x33 IPV6_RTHDRDSTOPTS = 0x23 IPV6_RTHDR_LOOSE = 0x0 IPV6_RTHDR_STRICT = 0x1 IPV6_RTHDR_TYPE_0 = 0x0 IPV6_SOCKOPT_RESERVED1 = 0x3 IPV6_TCLASS = 0x3d IPV6_UNICAST_HOPS = 0x4 IPV6_USE_MIN_MTU = 0x2a IPV6_V6ONLY = 0x1b IPV6_VERSION = 0x60 IPV6_VERSION_MASK = 0xf0 IP_ADD_MEMBERSHIP = 0xc IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 IP_DROP_MEMBERSHIP = 0xd IP_EF = 0x8000 IP_ERRORMTU = 0x15 IP_HDRINCL = 0x2 IP_IPSEC_POLICY = 0x16 IP_MAXPACKET = 0xffff IP_MAX_MEMBERSHIPS = 0x14 IP_MF = 0x2000 IP_MINFRAGSIZE = 0x45 IP_MINTTL = 0x18 IP_MSS = 0x240 IP_MULTICAST_IF = 0x9 IP_MULTICAST_LOOP = 0xb IP_MULTICAST_TTL = 0xa IP_OFFMASK = 0x1fff IP_OPTIONS = 0x1 IP_PORTRANGE = 0x13 IP_PORTRANGE_DEFAULT = 0x0 IP_PORTRANGE_HIGH = 0x1 IP_PORTRANGE_LOW = 0x2 IP_RECVDSTADDR = 0x7 IP_RECVIF = 0x14 IP_RECVOPTS = 0x5 IP_RECVRETOPTS = 0x6 IP_RECVTTL = 0x17 IP_RETOPTS = 0x8 IP_RF = 0x8000 IP_TOS = 0x3 IP_TTL = 0x4 ISIG = 0x80 ISTRIP = 0x20 IXANY = 0x800 IXOFF = 0x400 IXON = 0x200 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 MADV_DONTNEED = 0x4 MADV_FREE = 0x6 MADV_NORMAL = 0x0 MADV_RANDOM = 0x1 MADV_SEQUENTIAL = 0x2 MADV_SPACEAVAIL = 0x5 MADV_WILLNEED = 0x3 MAP_ALIGNMENT_16MB = 0x18000000 MAP_ALIGNMENT_1TB = 0x28000000 MAP_ALIGNMENT_256TB = 0x30000000 MAP_ALIGNMENT_4GB = 0x20000000 MAP_ALIGNMENT_64KB = 0x10000000 MAP_ALIGNMENT_64PB = 0x38000000 MAP_ALIGNMENT_MASK = -0x1000000 MAP_ALIGNMENT_SHIFT = 0x18 MAP_ANON = 0x1000 MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_HASSEMAPHORE = 0x200 MAP_INHERIT = 0x80 MAP_INHERIT_COPY = 0x1 MAP_INHERIT_DEFAULT = 0x1 MAP_INHERIT_DONATE_COPY = 0x3 MAP_INHERIT_NONE = 0x2 MAP_INHERIT_SHARE = 0x0 MAP_NORESERVE = 0x40 MAP_PRIVATE = 0x2 MAP_RENAME = 0x20 MAP_SHARED = 0x1 MAP_STACK = 0x2000 MAP_TRYFIXED = 0x400 MAP_WIRED = 0x800 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MSG_BCAST = 0x100 MSG_CMSG_CLOEXEC = 0x800 MSG_CONTROLMBUF = 0x2000000 MSG_CTRUNC = 0x20 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x80 MSG_EOR = 0x8 MSG_IOVUSRSPACE = 0x4000000 MSG_LENUSRSPACE = 0x8000000 MSG_MCAST = 0x200 MSG_NAMEMBUF = 0x1000000 MSG_NBIO = 0x1000 MSG_NOSIGNAL = 0x400 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_TRUNC = 0x10 MSG_USERFLAGS = 0xffffff MSG_WAITALL = 0x40 MS_ASYNC = 0x1 MS_INVALIDATE = 0x2 MS_SYNC = 0x4 NAME_MAX = 0x1ff NET_RT_DUMP = 0x1 NET_RT_FLAGS = 0x2 NET_RT_IFLIST = 0x5 NET_RT_MAXID = 0x6 NET_RT_OIFLIST = 0x4 NET_RT_OOIFLIST = 0x3 NOFLSH = 0x80000000 NOTE_ATTRIB = 0x8 NOTE_CHILD = 0x4 NOTE_DELETE = 0x1 NOTE_EXEC = 0x20000000 NOTE_EXIT = 0x80000000 NOTE_EXTEND = 0x4 NOTE_FORK = 0x40000000 NOTE_LINK = 0x10 NOTE_LOWAT = 0x1 NOTE_PCTRLMASK = 0xf0000000 NOTE_PDATAMASK = 0xfffff NOTE_RENAME = 0x20 NOTE_REVOKE = 0x40 NOTE_TRACK = 0x1 NOTE_TRACKERR = 0x2 NOTE_WRITE = 0x2 OCRNL = 0x10 OFIOGETBMAP = 0xc004667a ONLCR = 0x2 ONLRET = 0x40 ONOCR = 0x20 ONOEOT = 0x8 OPOST = 0x1 O_ACCMODE = 0x3 O_ALT_IO = 0x40000 O_APPEND = 0x8 O_ASYNC = 0x40 O_CLOEXEC = 0x400000 O_CREAT = 0x200 O_DIRECT = 0x80000 O_DIRECTORY = 0x200000 O_DSYNC = 0x10000 O_EXCL = 0x800 O_EXLOCK = 0x20 O_FSYNC = 0x80 O_NDELAY = 0x4 O_NOCTTY = 0x8000 O_NOFOLLOW = 0x100 O_NONBLOCK = 0x4 O_NOSIGPIPE = 0x1000000 O_RDONLY = 0x0 O_RDWR = 0x2 O_RSYNC = 0x20000 O_SHLOCK = 0x10 O_SYNC = 0x80 O_TRUNC = 0x400 O_WRONLY = 0x1 PARENB = 0x1000 PARMRK = 0x8 PARODD = 0x2000 PENDIN = 0x20000000 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 PRI_IOFLUSH = 0x7c PROT_EXEC = 0x4 PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 RLIMIT_AS = 0xa RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 RLIMIT_NOFILE = 0x8 RLIMIT_STACK = 0x3 RLIM_INFINITY = 0x7fffffffffffffff RTAX_AUTHOR = 0x6 RTAX_BRD = 0x7 RTAX_DST = 0x0 RTAX_GATEWAY = 0x1 RTAX_GENMASK = 0x3 RTAX_IFA = 0x5 RTAX_IFP = 0x4 RTAX_MAX = 0x9 RTAX_NETMASK = 0x2 RTAX_TAG = 0x8 RTA_AUTHOR = 0x40 RTA_BRD = 0x80 RTA_DST = 0x1 RTA_GATEWAY = 0x2 RTA_GENMASK = 0x8 RTA_IFA = 0x20 RTA_IFP = 0x10 RTA_NETMASK = 0x4 RTA_TAG = 0x100 RTF_ANNOUNCE = 0x20000 RTF_BLACKHOLE = 0x1000 RTF_CLONED = 0x2000 RTF_CLONING = 0x100 RTF_DONE = 0x40 RTF_DYNAMIC = 0x10 RTF_GATEWAY = 0x2 RTF_HOST = 0x4 RTF_LLINFO = 0x400 RTF_MASK = 0x80 RTF_MODIFIED = 0x20 RTF_PROTO1 = 0x8000 RTF_PROTO2 = 0x4000 RTF_REJECT = 0x8 RTF_SRC = 0x10000 RTF_STATIC = 0x800 RTF_UP = 0x1 RTF_XRESOLVE = 0x200 RTM_ADD = 0x1 RTM_CHANGE = 0x3 RTM_CHGADDR = 0x15 RTM_DELADDR = 0xd RTM_DELETE = 0x2 RTM_GET = 0x4 RTM_IEEE80211 = 0x11 RTM_IFANNOUNCE = 0x10 RTM_IFINFO = 0x14 RTM_LLINFO_UPD = 0x13 RTM_LOCK = 0x8 RTM_LOSING = 0x5 RTM_MISS = 0x7 RTM_NEWADDR = 0xc RTM_OIFINFO = 0xf RTM_OLDADD = 0x9 RTM_OLDDEL = 0xa RTM_OOIFINFO = 0xe RTM_REDIRECT = 0x6 RTM_RESOLVE = 0xb RTM_RTTUNIT = 0xf4240 RTM_SETGATE = 0x12 RTM_VERSION = 0x4 RTV_EXPIRE = 0x4 RTV_HOPCOUNT = 0x2 RTV_MTU = 0x1 RTV_RPIPE = 0x8 RTV_RTT = 0x40 RTV_RTTVAR = 0x80 RTV_SPIPE = 0x10 RTV_SSTHRESH = 0x20 RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 SCM_CREDS = 0x4 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x8 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 SIOCADDMULTI = 0x80906931 SIOCADDRT = 0x8038720a SIOCAIFADDR = 0x8040691a SIOCALIFADDR = 0x8118691c SIOCATMARK = 0x40047307 SIOCDELMULTI = 0x80906932 SIOCDELRT = 0x8038720b SIOCDIFADDR = 0x80906919 SIOCDIFPHYADDR = 0x80906949 SIOCDLIFADDR = 0x8118691e SIOCGDRVSPEC = 0xc028697b SIOCGETPFSYNC = 0xc09069f8 SIOCGETSGCNT = 0xc0207534 SIOCGETVIFCNT = 0xc0287533 SIOCGHIWAT = 0x40047301 SIOCGIFADDR = 0xc0906921 SIOCGIFADDRPREF = 0xc0986920 SIOCGIFALIAS = 0xc040691b SIOCGIFBRDADDR = 0xc0906923 SIOCGIFCAP = 0xc0206976 SIOCGIFCONF = 0xc0106926 SIOCGIFDATA = 0xc0986985 SIOCGIFDLT = 0xc0906977 SIOCGIFDSTADDR = 0xc0906922 SIOCGIFFLAGS = 0xc0906911 SIOCGIFGENERIC = 0xc090693a SIOCGIFMEDIA = 0xc0306936 SIOCGIFMETRIC = 0xc0906917 SIOCGIFMTU = 0xc090697e SIOCGIFNETMASK = 0xc0906925 SIOCGIFPDSTADDR = 0xc0906948 SIOCGIFPSRCADDR = 0xc0906947 SIOCGLIFADDR = 0xc118691d SIOCGLIFPHYADDR = 0xc118694b SIOCGLINKSTR = 0xc0286987 SIOCGLOWAT = 0x40047303 SIOCGPGRP = 0x40047309 SIOCGVH = 0xc0906983 SIOCIFCREATE = 0x8090697a SIOCIFDESTROY = 0x80906979 SIOCIFGCLONERS = 0xc0106978 SIOCINITIFADDR = 0xc0706984 SIOCSDRVSPEC = 0x8028697b SIOCSETPFSYNC = 0x809069f7 SIOCSHIWAT = 0x80047300 SIOCSIFADDR = 0x8090690c SIOCSIFADDRPREF = 0x8098691f SIOCSIFBRDADDR = 0x80906913 SIOCSIFCAP = 0x80206975 SIOCSIFDSTADDR = 0x8090690e SIOCSIFFLAGS = 0x80906910 SIOCSIFGENERIC = 0x80906939 SIOCSIFMEDIA = 0xc0906935 SIOCSIFMETRIC = 0x80906918 SIOCSIFMTU = 0x8090697f SIOCSIFNETMASK = 0x80906916 SIOCSIFPHYADDR = 0x80406946 SIOCSLIFPHYADDR = 0x8118694a SIOCSLINKSTR = 0x80286988 SIOCSLOWAT = 0x80047302 SIOCSPGRP = 0x80047308 SIOCSVH = 0xc0906982 SIOCZIFDATA = 0xc0986986 SOCK_CLOEXEC = 0x10000000 SOCK_DGRAM = 0x2 SOCK_FLAGS_MASK = 0xf0000000 SOCK_NONBLOCK = 0x20000000 SOCK_NOSIGPIPE = 0x40000000 SOCK_RAW = 0x3 SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x1 SOL_SOCKET = 0xffff SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x2 SO_ACCEPTFILTER = 0x1000 SO_BROADCAST = 0x20 SO_DEBUG = 0x1 SO_DONTROUTE = 0x10 SO_ERROR = 0x1007 SO_KEEPALIVE = 0x8 SO_LINGER = 0x80 SO_NOHEADER = 0x100a SO_NOSIGPIPE = 0x800 SO_OOBINLINE = 0x100 SO_OVERFLOWED = 0x1009 SO_RCVBUF = 0x1002 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x100c SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_SNDBUF = 0x1001 SO_SNDLOWAT = 0x1003 SO_SNDTIMEO = 0x100b SO_TIMESTAMP = 0x2000 SO_TYPE = 0x1008 SO_USELOOPBACK = 0x40 SYSCTL_VERSION = 0x1000000 SYSCTL_VERS_0 = 0x0 SYSCTL_VERS_1 = 0x1000000 SYSCTL_VERS_MASK = 0xff000000 S_ARCH1 = 0x10000 S_ARCH2 = 0x20000 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000 S_IFCHR = 0x2000 S_IFDIR = 0x4000 S_IFIFO = 0x1000 S_IFLNK = 0xa000 S_IFMT = 0xf000 S_IFREG = 0x8000 S_IFSOCK = 0xc000 S_IFWHT = 0xe000 S_IREAD = 0x100 S_IRGRP = 0x20 S_IROTH = 0x4 S_IRUSR = 0x100 S_IRWXG = 0x38 S_IRWXO = 0x7 S_IRWXU = 0x1c0 S_ISGID = 0x400 S_ISTXT = 0x200 S_ISUID = 0x800 S_ISVTX = 0x200 S_IWGRP = 0x10 S_IWOTH = 0x2 S_IWRITE = 0x80 S_IWUSR = 0x80 S_IXGRP = 0x8 S_IXOTH = 0x1 S_IXUSR = 0x40 S_LOGIN_SET = 0x1 TCIFLUSH = 0x1 TCIOFLUSH = 0x3 TCOFLUSH = 0x2 TCP_CONGCTL = 0x20 TCP_KEEPCNT = 0x6 TCP_KEEPIDLE = 0x3 TCP_KEEPINIT = 0x7 TCP_KEEPINTVL = 0x5 TCP_MAXBURST = 0x4 TCP_MAXSEG = 0x2 TCP_MAXWIN = 0xffff TCP_MAX_WINSHIFT = 0xe TCP_MD5SIG = 0x10 TCP_MINMSS = 0xd8 TCP_MSS = 0x218 TCP_NODELAY = 0x1 TCSAFLUSH = 0x2 TIOCCBRK = 0x2000747a TIOCCDTR = 0x20007478 TIOCCONS = 0x80047462 TIOCDCDTIMESTAMP = 0x40107458 TIOCDRAIN = 0x2000745e TIOCEXCL = 0x2000740d TIOCEXT = 0x80047460 TIOCFLAG_CDTRCTS = 0x10 TIOCFLAG_CLOCAL = 0x2 TIOCFLAG_CRTSCTS = 0x4 TIOCFLAG_MDMBUF = 0x8 TIOCFLAG_SOFTCAR = 0x1 TIOCFLUSH = 0x80047410 TIOCGETA = 0x402c7413 TIOCGETD = 0x4004741a TIOCGFLAGS = 0x4004745d TIOCGLINED = 0x40207442 TIOCGPGRP = 0x40047477 TIOCGQSIZE = 0x40047481 TIOCGRANTPT = 0x20007447 TIOCGSID = 0x40047463 TIOCGSIZE = 0x40087468 TIOCGWINSZ = 0x40087468 TIOCMBIC = 0x8004746b TIOCMBIS = 0x8004746c TIOCMGET = 0x4004746a TIOCMSET = 0x8004746d TIOCM_CAR = 0x40 TIOCM_CD = 0x40 TIOCM_CTS = 0x20 TIOCM_DSR = 0x100 TIOCM_DTR = 0x2 TIOCM_LE = 0x1 TIOCM_RI = 0x80 TIOCM_RNG = 0x80 TIOCM_RTS = 0x4 TIOCM_SR = 0x10 TIOCM_ST = 0x8 TIOCNOTTY = 0x20007471 TIOCNXCL = 0x2000740e TIOCOUTQ = 0x40047473 TIOCPKT = 0x80047470 TIOCPKT_DATA = 0x0 TIOCPKT_DOSTOP = 0x20 TIOCPKT_FLUSHREAD = 0x1 TIOCPKT_FLUSHWRITE = 0x2 TIOCPKT_IOCTL = 0x40 TIOCPKT_NOSTOP = 0x10 TIOCPKT_START = 0x8 TIOCPKT_STOP = 0x4 TIOCPTMGET = 0x40287446 TIOCPTSNAME = 0x40287448 TIOCRCVFRAME = 0x80087445 TIOCREMOTE = 0x80047469 TIOCSBRK = 0x2000747b TIOCSCTTY = 0x20007461 TIOCSDTR = 0x20007479 TIOCSETA = 0x802c7414 TIOCSETAF = 0x802c7416 TIOCSETAW = 0x802c7415 TIOCSETD = 0x8004741b TIOCSFLAGS = 0x8004745c TIOCSIG = 0x2000745f TIOCSLINED = 0x80207443 TIOCSPGRP = 0x80047476 TIOCSQSIZE = 0x80047480 TIOCSSIZE = 0x80087467 TIOCSTART = 0x2000746e TIOCSTAT = 0x80047465 TIOCSTI = 0x80017472 TIOCSTOP = 0x2000746f TIOCSWINSZ = 0x80087467 TIOCUCNTL = 0x80047466 TIOCXMTFRAME = 0x80087444 TOSTOP = 0x400000 VDISCARD = 0xf VDSUSP = 0xb VEOF = 0x0 VEOL = 0x1 VEOL2 = 0x2 VERASE = 0x3 VINTR = 0x8 VKILL = 0x5 VLNEXT = 0xe VMIN = 0x10 VQUIT = 0x9 VREPRINT = 0x6 VSTART = 0xc VSTATUS = 0x12 VSTOP = 0xd VSUSP = 0xa VTIME = 0x11 VWERASE = 0x4 WALL = 0x8 WALLSIG = 0x8 WALTSIG = 0x4 WCLONE = 0x4 WCOREFLAG = 0x80 WNOHANG = 0x1 WNOWAIT = 0x10000 WNOZOMBIE = 0x20000 WOPTSCHECKED = 0x40000 WSTOPPED = 0x7f WUNTRACED = 0x2 ) // Errors const ( E2BIG = syscall.Errno(0x7) EACCES = syscall.Errno(0xd) EADDRINUSE = syscall.Errno(0x30) EADDRNOTAVAIL = syscall.Errno(0x31) EAFNOSUPPORT = syscall.Errno(0x2f) EAGAIN = syscall.Errno(0x23) EALREADY = syscall.Errno(0x25) EAUTH = syscall.Errno(0x50) EBADF = syscall.Errno(0x9) EBADMSG = syscall.Errno(0x58) EBADRPC = syscall.Errno(0x48) EBUSY = syscall.Errno(0x10) ECANCELED = syscall.Errno(0x57) ECHILD = syscall.Errno(0xa) ECONNABORTED = syscall.Errno(0x35) ECONNREFUSED = syscall.Errno(0x3d) ECONNRESET = syscall.Errno(0x36) EDEADLK = syscall.Errno(0xb) EDESTADDRREQ = syscall.Errno(0x27) EDOM = syscall.Errno(0x21) EDQUOT = syscall.Errno(0x45) EEXIST = syscall.Errno(0x11) EFAULT = syscall.Errno(0xe) EFBIG = syscall.Errno(0x1b) EFTYPE = syscall.Errno(0x4f) EHOSTDOWN = syscall.Errno(0x40) EHOSTUNREACH = syscall.Errno(0x41) EIDRM = syscall.Errno(0x52) EILSEQ = syscall.Errno(0x55) EINPROGRESS = syscall.Errno(0x24) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x38) EISDIR = syscall.Errno(0x15) ELAST = syscall.Errno(0x60) ELOOP = syscall.Errno(0x3e) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) EMSGSIZE = syscall.Errno(0x28) EMULTIHOP = syscall.Errno(0x5e) ENAMETOOLONG = syscall.Errno(0x3f) ENEEDAUTH = syscall.Errno(0x51) ENETDOWN = syscall.Errno(0x32) ENETRESET = syscall.Errno(0x34) ENETUNREACH = syscall.Errno(0x33) ENFILE = syscall.Errno(0x17) ENOATTR = syscall.Errno(0x5d) ENOBUFS = syscall.Errno(0x37) ENODATA = syscall.Errno(0x59) ENODEV = syscall.Errno(0x13) ENOENT = syscall.Errno(0x2) ENOEXEC = syscall.Errno(0x8) ENOLCK = syscall.Errno(0x4d) ENOLINK = syscall.Errno(0x5f) ENOMEM = syscall.Errno(0xc) ENOMSG = syscall.Errno(0x53) ENOPROTOOPT = syscall.Errno(0x2a) ENOSPC = syscall.Errno(0x1c) ENOSR = syscall.Errno(0x5a) ENOSTR = syscall.Errno(0x5b) ENOSYS = syscall.Errno(0x4e) ENOTBLK = syscall.Errno(0xf) ENOTCONN = syscall.Errno(0x39) ENOTDIR = syscall.Errno(0x14) ENOTEMPTY = syscall.Errno(0x42) ENOTSOCK = syscall.Errno(0x26) ENOTSUP = syscall.Errno(0x56) ENOTTY = syscall.Errno(0x19) ENXIO = syscall.Errno(0x6) EOPNOTSUPP = syscall.Errno(0x2d) EOVERFLOW = syscall.Errno(0x54) EPERM = syscall.Errno(0x1) EPFNOSUPPORT = syscall.Errno(0x2e) EPIPE = syscall.Errno(0x20) EPROCLIM = syscall.Errno(0x43) EPROCUNAVAIL = syscall.Errno(0x4c) EPROGMISMATCH = syscall.Errno(0x4b) EPROGUNAVAIL = syscall.Errno(0x4a) EPROTO = syscall.Errno(0x60) EPROTONOSUPPORT = syscall.Errno(0x2b) EPROTOTYPE = syscall.Errno(0x29) ERANGE = syscall.Errno(0x22) EREMOTE = syscall.Errno(0x47) EROFS = syscall.Errno(0x1e) ERPCMISMATCH = syscall.Errno(0x49) ESHUTDOWN = syscall.Errno(0x3a) ESOCKTNOSUPPORT = syscall.Errno(0x2c) ESPIPE = syscall.Errno(0x1d) ESRCH = syscall.Errno(0x3) ESTALE = syscall.Errno(0x46) ETIME = syscall.Errno(0x5c) ETIMEDOUT = syscall.Errno(0x3c) ETOOMANYREFS = syscall.Errno(0x3b) ETXTBSY = syscall.Errno(0x1a) EUSERS = syscall.Errno(0x44) EWOULDBLOCK = syscall.Errno(0x23) EXDEV = syscall.Errno(0x12) ) // Signals const ( SIGABRT = syscall.Signal(0x6) SIGALRM = syscall.Signal(0xe) SIGBUS = syscall.Signal(0xa) SIGCHLD = syscall.Signal(0x14) SIGCONT = syscall.Signal(0x13) SIGEMT = syscall.Signal(0x7) SIGFPE = syscall.Signal(0x8) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) SIGINFO = syscall.Signal(0x1d) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x17) SIGIOT = syscall.Signal(0x6) SIGKILL = syscall.Signal(0x9) SIGPIPE = syscall.Signal(0xd) SIGPROF = syscall.Signal(0x1b) SIGPWR = syscall.Signal(0x20) SIGQUIT = syscall.Signal(0x3) SIGSEGV = syscall.Signal(0xb) SIGSTOP = syscall.Signal(0x11) SIGSYS = syscall.Signal(0xc) SIGTERM = syscall.Signal(0xf) SIGTRAP = syscall.Signal(0x5) SIGTSTP = syscall.Signal(0x12) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) SIGURG = syscall.Signal(0x10) SIGUSR1 = syscall.Signal(0x1e) SIGUSR2 = syscall.Signal(0x1f) SIGVTALRM = syscall.Signal(0x1a) SIGWINCH = syscall.Signal(0x1c) SIGXCPU = syscall.Signal(0x18) SIGXFSZ = syscall.Signal(0x19) ) // Error table var errors = [...]string{ 1: "operation not permitted", 2: "no such file or directory", 3: "no such process", 4: "interrupted system call", 5: "input/output error", 6: "device not configured", 7: "argument list too long", 8: "exec format error", 9: "bad file descriptor", 10: "no child processes", 11: "resource deadlock avoided", 12: "cannot allocate memory", 13: "permission denied", 14: "bad address", 15: "block device required", 16: "device busy", 17: "file exists", 18: "cross-device link", 19: "operation not supported by device", 20: "not a directory", 21: "is a directory", 22: "invalid argument", 23: "too many open files in system", 24: "too many open files", 25: "inappropriate ioctl for device", 26: "text file busy", 27: "file too large", 28: "no space left on device", 29: "illegal seek", 30: "read-only file system", 31: "too many links", 32: "broken pipe", 33: "numerical argument out of domain", 34: "result too large or too small", 35: "resource temporarily unavailable", 36: "operation now in progress", 37: "operation already in progress", 38: "socket operation on non-socket", 39: "destination address required", 40: "message too long", 41: "protocol wrong type for socket", 42: "protocol option not available", 43: "protocol not supported", 44: "socket type not supported", 45: "operation not supported", 46: "protocol family not supported", 47: "address family not supported by protocol family", 48: "address already in use", 49: "can't assign requested address", 50: "network is down", 51: "network is unreachable", 52: "network dropped connection on reset", 53: "software caused connection abort", 54: "connection reset by peer", 55: "no buffer space available", 56: "socket is already connected", 57: "socket is not connected", 58: "can't send after socket shutdown", 59: "too many references: can't splice", 60: "connection timed out", 61: "connection refused", 62: "too many levels of symbolic links", 63: "file name too long", 64: "host is down", 65: "no route to host", 66: "directory not empty", 67: "too many processes", 68: "too many users", 69: "disc quota exceeded", 70: "stale NFS file handle", 71: "too many levels of remote in path", 72: "RPC struct is bad", 73: "RPC version wrong", 74: "RPC prog. not avail", 75: "program version wrong", 76: "bad procedure for program", 77: "no locks available", 78: "function not implemented", 79: "inappropriate file type or format", 80: "authentication error", 81: "need authenticator", 82: "identifier removed", 83: "no message of desired type", 84: "value too large to be stored in data type", 85: "illegal byte sequence", 86: "not supported", 87: "operation Canceled", 88: "bad or Corrupt message", 89: "no message available", 90: "no STREAM resources", 91: "not a STREAM", 92: "STREAM ioctl timeout", 93: "attribute not found", 94: "multihop attempted", 95: "link has been severed", 96: "protocol error", } // Signal table var signals = [...]string{ 1: "hangup", 2: "interrupt", 3: "quit", 4: "illegal instruction", 5: "trace/BPT trap", 6: "abort trap", 7: "EMT trap", 8: "floating point exception", 9: "killed", 10: "bus error", 11: "segmentation fault", 12: "bad system call", 13: "broken pipe", 14: "alarm clock", 15: "terminated", 16: "urgent I/O condition", 17: "stopped (signal)", 18: "stopped", 19: "continued", 20: "child exited", 21: "stopped (tty input)", 22: "stopped (tty output)", 23: "I/O possible", 24: "cputime limit exceeded", 25: "filesize limit exceeded", 26: "virtual timer expired", 27: "profiling timer expired", 28: "window size changes", 29: "information request", 30: "user defined signal 1", 31: "user defined signal 2", 32: "power fail/restart", } ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go ================================================ // mkerrors.sh -marm // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT // +build arm,netbsd // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- -marm _const.go package unix import "syscall" const ( AF_APPLETALK = 0x10 AF_ARP = 0x1c AF_BLUETOOTH = 0x1f AF_CCITT = 0xa AF_CHAOS = 0x5 AF_CNT = 0x15 AF_COIP = 0x14 AF_DATAKIT = 0x9 AF_DECnet = 0xc AF_DLI = 0xd AF_E164 = 0x1a AF_ECMA = 0x8 AF_HYLINK = 0xf AF_IEEE80211 = 0x20 AF_IMPLINK = 0x3 AF_INET = 0x2 AF_INET6 = 0x18 AF_IPX = 0x17 AF_ISDN = 0x1a AF_ISO = 0x7 AF_LAT = 0xe AF_LINK = 0x12 AF_LOCAL = 0x1 AF_MAX = 0x23 AF_MPLS = 0x21 AF_NATM = 0x1b AF_NS = 0x6 AF_OROUTE = 0x11 AF_OSI = 0x7 AF_PUP = 0x4 AF_ROUTE = 0x22 AF_SNA = 0xb AF_UNIX = 0x1 AF_UNSPEC = 0x0 ARPHRD_ARCNET = 0x7 ARPHRD_ETHER = 0x1 ARPHRD_FRELAY = 0xf ARPHRD_IEEE1394 = 0x18 ARPHRD_IEEE802 = 0x6 ARPHRD_STRIP = 0x17 B0 = 0x0 B110 = 0x6e B115200 = 0x1c200 B1200 = 0x4b0 B134 = 0x86 B14400 = 0x3840 B150 = 0x96 B1800 = 0x708 B19200 = 0x4b00 B200 = 0xc8 B230400 = 0x38400 B2400 = 0x960 B28800 = 0x7080 B300 = 0x12c B38400 = 0x9600 B460800 = 0x70800 B4800 = 0x12c0 B50 = 0x32 B57600 = 0xe100 B600 = 0x258 B7200 = 0x1c20 B75 = 0x4b B76800 = 0x12c00 B921600 = 0xe1000 B9600 = 0x2580 BIOCFEEDBACK = 0x8004427d BIOCFLUSH = 0x20004268 BIOCGBLEN = 0x40044266 BIOCGDLT = 0x4004426a BIOCGDLTLIST = 0xc0084277 BIOCGETIF = 0x4090426b BIOCGFEEDBACK = 0x4004427c BIOCGHDRCMPLT = 0x40044274 BIOCGRTIMEOUT = 0x400c427b BIOCGSEESENT = 0x40044278 BIOCGSTATS = 0x4080426f BIOCGSTATSOLD = 0x4008426f BIOCIMMEDIATE = 0x80044270 BIOCPROMISC = 0x20004269 BIOCSBLEN = 0xc0044266 BIOCSDLT = 0x80044276 BIOCSETF = 0x80084267 BIOCSETIF = 0x8090426c BIOCSFEEDBACK = 0x8004427d BIOCSHDRCMPLT = 0x80044275 BIOCSRTIMEOUT = 0x800c427a BIOCSSEESENT = 0x80044279 BIOCSTCPF = 0x80084272 BIOCSUDPF = 0x80084273 BIOCVERSION = 0x40044271 BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALIGNMENT = 0x4 BPF_ALIGNMENT32 = 0x4 BPF_ALU = 0x4 BPF_AND = 0x50 BPF_B = 0x10 BPF_DFLTBUFSIZE = 0x100000 BPF_DIV = 0x30 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 BPF_JA = 0x0 BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 BPF_JMP = 0x5 BPF_JSET = 0x40 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 BPF_LEN = 0x80 BPF_LSH = 0x60 BPF_MAJOR_VERSION = 0x1 BPF_MAXBUFSIZE = 0x1000000 BPF_MAXINSNS = 0x200 BPF_MEM = 0x60 BPF_MEMWORDS = 0x10 BPF_MINBUFSIZE = 0x20 BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_OR = 0x40 BPF_RELEASE = 0x30bb6 BPF_RET = 0x6 BPF_RSH = 0x70 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 BPF_TAX = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 BRKINT = 0x2 CFLUSH = 0xf CLOCAL = 0x8000 CREAD = 0x800 CS5 = 0x0 CS6 = 0x100 CS7 = 0x200 CS8 = 0x300 CSIZE = 0x300 CSTART = 0x11 CSTATUS = 0x14 CSTOP = 0x13 CSTOPB = 0x400 CSUSP = 0x1a CTL_MAXNAME = 0xc CTL_NET = 0x4 CTL_QUERY = -0x2 DIOCBSFLUSH = 0x20006478 DLT_A429 = 0xb8 DLT_A653_ICM = 0xb9 DLT_AIRONET_HEADER = 0x78 DLT_AOS = 0xde DLT_APPLE_IP_OVER_IEEE1394 = 0x8a DLT_ARCNET = 0x7 DLT_ARCNET_LINUX = 0x81 DLT_ATM_CLIP = 0x13 DLT_ATM_RFC1483 = 0xb DLT_AURORA = 0x7e DLT_AX25 = 0x3 DLT_AX25_KISS = 0xca DLT_BACNET_MS_TP = 0xa5 DLT_BLUETOOTH_HCI_H4 = 0xbb DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 DLT_CAN20B = 0xbe DLT_CAN_SOCKETCAN = 0xe3 DLT_CHAOS = 0x5 DLT_CISCO_IOS = 0x76 DLT_C_HDLC = 0x68 DLT_C_HDLC_WITH_DIR = 0xcd DLT_DECT = 0xdd DLT_DOCSIS = 0x8f DLT_ECONET = 0x73 DLT_EN10MB = 0x1 DLT_EN3MB = 0x2 DLT_ENC = 0x6d DLT_ERF = 0xc5 DLT_ERF_ETH = 0xaf DLT_ERF_POS = 0xb0 DLT_FC_2 = 0xe0 DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 DLT_FDDI = 0xa DLT_FLEXRAY = 0xd2 DLT_FRELAY = 0x6b DLT_FRELAY_WITH_DIR = 0xce DLT_GCOM_SERIAL = 0xad DLT_GCOM_T1E1 = 0xac DLT_GPF_F = 0xab DLT_GPF_T = 0xaa DLT_GPRS_LLC = 0xa9 DLT_GSMTAP_ABIS = 0xda DLT_GSMTAP_UM = 0xd9 DLT_HDLC = 0x10 DLT_HHDLC = 0x79 DLT_HIPPI = 0xf DLT_IBM_SN = 0x92 DLT_IBM_SP = 0x91 DLT_IEEE802 = 0x6 DLT_IEEE802_11 = 0x69 DLT_IEEE802_11_RADIO = 0x7f DLT_IEEE802_11_RADIO_AVS = 0xa3 DLT_IEEE802_15_4 = 0xc3 DLT_IEEE802_15_4_LINUX = 0xbf DLT_IEEE802_15_4_NONASK_PHY = 0xd7 DLT_IEEE802_16_MAC_CPS = 0xbc DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 DLT_IPMB = 0xc7 DLT_IPMB_LINUX = 0xd1 DLT_IPNET = 0xe2 DLT_IPV4 = 0xe4 DLT_IPV6 = 0xe5 DLT_IP_OVER_FC = 0x7a DLT_JUNIPER_ATM1 = 0x89 DLT_JUNIPER_ATM2 = 0x87 DLT_JUNIPER_CHDLC = 0xb5 DLT_JUNIPER_ES = 0x84 DLT_JUNIPER_ETHER = 0xb2 DLT_JUNIPER_FRELAY = 0xb4 DLT_JUNIPER_GGSN = 0x85 DLT_JUNIPER_ISM = 0xc2 DLT_JUNIPER_MFR = 0x86 DLT_JUNIPER_MLFR = 0x83 DLT_JUNIPER_MLPPP = 0x82 DLT_JUNIPER_MONITOR = 0xa4 DLT_JUNIPER_PIC_PEER = 0xae DLT_JUNIPER_PPP = 0xb3 DLT_JUNIPER_PPPOE = 0xa7 DLT_JUNIPER_PPPOE_ATM = 0xa8 DLT_JUNIPER_SERVICES = 0x88 DLT_JUNIPER_ST = 0xc8 DLT_JUNIPER_VP = 0xb7 DLT_LAPB_WITH_DIR = 0xcf DLT_LAPD = 0xcb DLT_LIN = 0xd4 DLT_LINUX_EVDEV = 0xd8 DLT_LINUX_IRDA = 0x90 DLT_LINUX_LAPD = 0xb1 DLT_LINUX_SLL = 0x71 DLT_LOOP = 0x6c DLT_LTALK = 0x72 DLT_MFR = 0xb6 DLT_MOST = 0xd3 DLT_MPLS = 0xdb DLT_MTP2 = 0x8c DLT_MTP2_WITH_PHDR = 0x8b DLT_MTP3 = 0x8d DLT_NULL = 0x0 DLT_PCI_EXP = 0x7d DLT_PFLOG = 0x75 DLT_PFSYNC = 0x12 DLT_PPI = 0xc0 DLT_PPP = 0x9 DLT_PPP_BSDOS = 0xe DLT_PPP_ETHER = 0x33 DLT_PPP_PPPD = 0xa6 DLT_PPP_SERIAL = 0x32 DLT_PPP_WITH_DIR = 0xcc DLT_PRISM_HEADER = 0x77 DLT_PRONET = 0x4 DLT_RAIF1 = 0xc6 DLT_RAW = 0xc DLT_RAWAF_MASK = 0x2240000 DLT_RIO = 0x7c DLT_SCCP = 0x8e DLT_SITA = 0xc4 DLT_SLIP = 0x8 DLT_SLIP_BSDOS = 0xd DLT_SUNATM = 0x7b DLT_SYMANTEC_FIREWALL = 0x63 DLT_TZSP = 0x80 DLT_USB = 0xba DLT_USB_LINUX = 0xbd DLT_USB_LINUX_MMAPPED = 0xdc DLT_WIHART = 0xdf DLT_X2E_SERIAL = 0xd5 DLT_X2E_XORAYA = 0xd6 DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 DT_FIFO = 0x1 DT_LNK = 0xa DT_REG = 0x8 DT_SOCK = 0xc DT_UNKNOWN = 0x0 DT_WHT = 0xe ECHO = 0x8 ECHOCTL = 0x40 ECHOE = 0x2 ECHOK = 0x4 ECHOKE = 0x1 ECHONL = 0x10 ECHOPRT = 0x20 EMUL_LINUX = 0x1 EMUL_LINUX32 = 0x5 EMUL_MAXID = 0x6 ETHERCAP_JUMBO_MTU = 0x4 ETHERCAP_VLAN_HWTAGGING = 0x2 ETHERCAP_VLAN_MTU = 0x1 ETHERMIN = 0x2e ETHERMTU = 0x5dc ETHERMTU_JUMBO = 0x2328 ETHERTYPE_8023 = 0x4 ETHERTYPE_AARP = 0x80f3 ETHERTYPE_ACCTON = 0x8390 ETHERTYPE_AEONIC = 0x8036 ETHERTYPE_ALPHA = 0x814a ETHERTYPE_AMBER = 0x6008 ETHERTYPE_AMOEBA = 0x8145 ETHERTYPE_APOLLO = 0x80f7 ETHERTYPE_APOLLODOMAIN = 0x8019 ETHERTYPE_APPLETALK = 0x809b ETHERTYPE_APPLITEK = 0x80c7 ETHERTYPE_ARGONAUT = 0x803a ETHERTYPE_ARP = 0x806 ETHERTYPE_AT = 0x809b ETHERTYPE_ATALK = 0x809b ETHERTYPE_ATOMIC = 0x86df ETHERTYPE_ATT = 0x8069 ETHERTYPE_ATTSTANFORD = 0x8008 ETHERTYPE_AUTOPHON = 0x806a ETHERTYPE_AXIS = 0x8856 ETHERTYPE_BCLOOP = 0x9003 ETHERTYPE_BOFL = 0x8102 ETHERTYPE_CABLETRON = 0x7034 ETHERTYPE_CHAOS = 0x804 ETHERTYPE_COMDESIGN = 0x806c ETHERTYPE_COMPUGRAPHIC = 0x806d ETHERTYPE_COUNTERPOINT = 0x8062 ETHERTYPE_CRONUS = 0x8004 ETHERTYPE_CRONUSVLN = 0x8003 ETHERTYPE_DCA = 0x1234 ETHERTYPE_DDE = 0x807b ETHERTYPE_DEBNI = 0xaaaa ETHERTYPE_DECAM = 0x8048 ETHERTYPE_DECCUST = 0x6006 ETHERTYPE_DECDIAG = 0x6005 ETHERTYPE_DECDNS = 0x803c ETHERTYPE_DECDTS = 0x803e ETHERTYPE_DECEXPER = 0x6000 ETHERTYPE_DECLAST = 0x8041 ETHERTYPE_DECLTM = 0x803f ETHERTYPE_DECMUMPS = 0x6009 ETHERTYPE_DECNETBIOS = 0x8040 ETHERTYPE_DELTACON = 0x86de ETHERTYPE_DIDDLE = 0x4321 ETHERTYPE_DLOG1 = 0x660 ETHERTYPE_DLOG2 = 0x661 ETHERTYPE_DN = 0x6003 ETHERTYPE_DOGFIGHT = 0x1989 ETHERTYPE_DSMD = 0x8039 ETHERTYPE_ECMA = 0x803 ETHERTYPE_ENCRYPT = 0x803d ETHERTYPE_ES = 0x805d ETHERTYPE_EXCELAN = 0x8010 ETHERTYPE_EXPERDATA = 0x8049 ETHERTYPE_FLIP = 0x8146 ETHERTYPE_FLOWCONTROL = 0x8808 ETHERTYPE_FRARP = 0x808 ETHERTYPE_GENDYN = 0x8068 ETHERTYPE_HAYES = 0x8130 ETHERTYPE_HIPPI_FP = 0x8180 ETHERTYPE_HITACHI = 0x8820 ETHERTYPE_HP = 0x8005 ETHERTYPE_IEEEPUP = 0xa00 ETHERTYPE_IEEEPUPAT = 0xa01 ETHERTYPE_IMLBL = 0x4c42 ETHERTYPE_IMLBLDIAG = 0x424c ETHERTYPE_IP = 0x800 ETHERTYPE_IPAS = 0x876c ETHERTYPE_IPV6 = 0x86dd ETHERTYPE_IPX = 0x8137 ETHERTYPE_IPXNEW = 0x8037 ETHERTYPE_KALPANA = 0x8582 ETHERTYPE_LANBRIDGE = 0x8038 ETHERTYPE_LANPROBE = 0x8888 ETHERTYPE_LAT = 0x6004 ETHERTYPE_LBACK = 0x9000 ETHERTYPE_LITTLE = 0x8060 ETHERTYPE_LOGICRAFT = 0x8148 ETHERTYPE_LOOPBACK = 0x9000 ETHERTYPE_MATRA = 0x807a ETHERTYPE_MAX = 0xffff ETHERTYPE_MERIT = 0x807c ETHERTYPE_MICP = 0x873a ETHERTYPE_MOPDL = 0x6001 ETHERTYPE_MOPRC = 0x6002 ETHERTYPE_MOTOROLA = 0x818d ETHERTYPE_MPLS = 0x8847 ETHERTYPE_MPLS_MCAST = 0x8848 ETHERTYPE_MUMPS = 0x813f ETHERTYPE_NBPCC = 0x3c04 ETHERTYPE_NBPCLAIM = 0x3c09 ETHERTYPE_NBPCLREQ = 0x3c05 ETHERTYPE_NBPCLRSP = 0x3c06 ETHERTYPE_NBPCREQ = 0x3c02 ETHERTYPE_NBPCRSP = 0x3c03 ETHERTYPE_NBPDG = 0x3c07 ETHERTYPE_NBPDGB = 0x3c08 ETHERTYPE_NBPDLTE = 0x3c0a ETHERTYPE_NBPRAR = 0x3c0c ETHERTYPE_NBPRAS = 0x3c0b ETHERTYPE_NBPRST = 0x3c0d ETHERTYPE_NBPSCD = 0x3c01 ETHERTYPE_NBPVCD = 0x3c00 ETHERTYPE_NBS = 0x802 ETHERTYPE_NCD = 0x8149 ETHERTYPE_NESTAR = 0x8006 ETHERTYPE_NETBEUI = 0x8191 ETHERTYPE_NOVELL = 0x8138 ETHERTYPE_NS = 0x600 ETHERTYPE_NSAT = 0x601 ETHERTYPE_NSCOMPAT = 0x807 ETHERTYPE_NTRAILER = 0x10 ETHERTYPE_OS9 = 0x7007 ETHERTYPE_OS9NET = 0x7009 ETHERTYPE_PACER = 0x80c6 ETHERTYPE_PAE = 0x888e ETHERTYPE_PCS = 0x4242 ETHERTYPE_PLANNING = 0x8044 ETHERTYPE_PPP = 0x880b ETHERTYPE_PPPOE = 0x8864 ETHERTYPE_PPPOEDISC = 0x8863 ETHERTYPE_PRIMENTS = 0x7031 ETHERTYPE_PUP = 0x200 ETHERTYPE_PUPAT = 0x200 ETHERTYPE_RACAL = 0x7030 ETHERTYPE_RATIONAL = 0x8150 ETHERTYPE_RAWFR = 0x6559 ETHERTYPE_RCL = 0x1995 ETHERTYPE_RDP = 0x8739 ETHERTYPE_RETIX = 0x80f2 ETHERTYPE_REVARP = 0x8035 ETHERTYPE_SCA = 0x6007 ETHERTYPE_SECTRA = 0x86db ETHERTYPE_SECUREDATA = 0x876d ETHERTYPE_SGITW = 0x817e ETHERTYPE_SG_BOUNCE = 0x8016 ETHERTYPE_SG_DIAG = 0x8013 ETHERTYPE_SG_NETGAMES = 0x8014 ETHERTYPE_SG_RESV = 0x8015 ETHERTYPE_SIMNET = 0x5208 ETHERTYPE_SLOWPROTOCOLS = 0x8809 ETHERTYPE_SNA = 0x80d5 ETHERTYPE_SNMP = 0x814c ETHERTYPE_SONIX = 0xfaf5 ETHERTYPE_SPIDER = 0x809f ETHERTYPE_SPRITE = 0x500 ETHERTYPE_STP = 0x8181 ETHERTYPE_TALARIS = 0x812b ETHERTYPE_TALARISMC = 0x852b ETHERTYPE_TCPCOMP = 0x876b ETHERTYPE_TCPSM = 0x9002 ETHERTYPE_TEC = 0x814f ETHERTYPE_TIGAN = 0x802f ETHERTYPE_TRAIL = 0x1000 ETHERTYPE_TRANSETHER = 0x6558 ETHERTYPE_TYMSHARE = 0x802e ETHERTYPE_UBBST = 0x7005 ETHERTYPE_UBDEBUG = 0x900 ETHERTYPE_UBDIAGLOOP = 0x7002 ETHERTYPE_UBDL = 0x7000 ETHERTYPE_UBNIU = 0x7001 ETHERTYPE_UBNMC = 0x7003 ETHERTYPE_VALID = 0x1600 ETHERTYPE_VARIAN = 0x80dd ETHERTYPE_VAXELN = 0x803b ETHERTYPE_VEECO = 0x8067 ETHERTYPE_VEXP = 0x805b ETHERTYPE_VGLAB = 0x8131 ETHERTYPE_VINES = 0xbad ETHERTYPE_VINESECHO = 0xbaf ETHERTYPE_VINESLOOP = 0xbae ETHERTYPE_VITAL = 0xff00 ETHERTYPE_VLAN = 0x8100 ETHERTYPE_VLTLMAN = 0x8080 ETHERTYPE_VPROD = 0x805c ETHERTYPE_VURESERVED = 0x8147 ETHERTYPE_WATERLOO = 0x8130 ETHERTYPE_WELLFLEET = 0x8103 ETHERTYPE_X25 = 0x805 ETHERTYPE_X75 = 0x801 ETHERTYPE_XNSSM = 0x9001 ETHERTYPE_XTP = 0x817d ETHER_ADDR_LEN = 0x6 ETHER_CRC_LEN = 0x4 ETHER_CRC_POLY_BE = 0x4c11db6 ETHER_CRC_POLY_LE = 0xedb88320 ETHER_HDR_LEN = 0xe ETHER_MAX_LEN = 0x5ee ETHER_MAX_LEN_JUMBO = 0x233a ETHER_MIN_LEN = 0x40 ETHER_PPPOE_ENCAP_LEN = 0x8 ETHER_TYPE_LEN = 0x2 ETHER_VLAN_ENCAP_LEN = 0x4 EVFILT_AIO = 0x2 EVFILT_PROC = 0x4 EVFILT_READ = 0x0 EVFILT_SIGNAL = 0x5 EVFILT_SYSCOUNT = 0x7 EVFILT_TIMER = 0x6 EVFILT_VNODE = 0x3 EVFILT_WRITE = 0x1 EV_ADD = 0x1 EV_CLEAR = 0x20 EV_DELETE = 0x2 EV_DISABLE = 0x8 EV_ENABLE = 0x4 EV_EOF = 0x8000 EV_ERROR = 0x4000 EV_FLAG1 = 0x2000 EV_ONESHOT = 0x10 EV_SYSFLAGS = 0xf000 EXTA = 0x4b00 EXTB = 0x9600 EXTPROC = 0x800 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x100 FLUSHO = 0x800000 F_CLOSEM = 0xa F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0xc F_FSCTL = -0x80000000 F_FSDIRMASK = 0x70000000 F_FSIN = 0x10000000 F_FSINOUT = 0x30000000 F_FSOUT = 0x20000000 F_FSPRIV = 0x8000 F_FSVOID = 0x40000000 F_GETFD = 0x1 F_GETFL = 0x3 F_GETLK = 0x7 F_GETNOSIGPIPE = 0xd F_GETOWN = 0x5 F_MAXFD = 0xb F_OK = 0x0 F_PARAM_MASK = 0xfff F_PARAM_MAX = 0xfff F_RDLCK = 0x1 F_SETFD = 0x2 F_SETFL = 0x4 F_SETLK = 0x8 F_SETLKW = 0x9 F_SETNOSIGPIPE = 0xe F_SETOWN = 0x6 F_UNLCK = 0x2 F_WRLCK = 0x3 HUPCL = 0x4000 ICANON = 0x100 ICMP6_FILTER = 0x12 ICRNL = 0x100 IEXTEN = 0x400 IFAN_ARRIVAL = 0x0 IFAN_DEPARTURE = 0x1 IFA_ROUTE = 0x1 IFF_ALLMULTI = 0x200 IFF_BROADCAST = 0x2 IFF_CANTCHANGE = 0x8f52 IFF_DEBUG = 0x4 IFF_LINK0 = 0x1000 IFF_LINK1 = 0x2000 IFF_LINK2 = 0x4000 IFF_LOOPBACK = 0x8 IFF_MULTICAST = 0x8000 IFF_NOARP = 0x80 IFF_NOTRAILERS = 0x20 IFF_OACTIVE = 0x400 IFF_POINTOPOINT = 0x10 IFF_PROMISC = 0x100 IFF_RUNNING = 0x40 IFF_SIMPLEX = 0x800 IFF_UP = 0x1 IFNAMSIZ = 0x10 IFT_1822 = 0x2 IFT_A12MPPSWITCH = 0x82 IFT_AAL2 = 0xbb IFT_AAL5 = 0x31 IFT_ADSL = 0x5e IFT_AFLANE8023 = 0x3b IFT_AFLANE8025 = 0x3c IFT_ARAP = 0x58 IFT_ARCNET = 0x23 IFT_ARCNETPLUS = 0x24 IFT_ASYNC = 0x54 IFT_ATM = 0x25 IFT_ATMDXI = 0x69 IFT_ATMFUNI = 0x6a IFT_ATMIMA = 0x6b IFT_ATMLOGICAL = 0x50 IFT_ATMRADIO = 0xbd IFT_ATMSUBINTERFACE = 0x86 IFT_ATMVCIENDPT = 0xc2 IFT_ATMVIRTUAL = 0x95 IFT_BGPPOLICYACCOUNTING = 0xa2 IFT_BRIDGE = 0xd1 IFT_BSC = 0x53 IFT_CARP = 0xf8 IFT_CCTEMUL = 0x3d IFT_CEPT = 0x13 IFT_CES = 0x85 IFT_CHANNEL = 0x46 IFT_CNR = 0x55 IFT_COFFEE = 0x84 IFT_COMPOSITELINK = 0x9b IFT_DCN = 0x8d IFT_DIGITALPOWERLINE = 0x8a IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba IFT_DLSW = 0x4a IFT_DOCSCABLEDOWNSTREAM = 0x80 IFT_DOCSCABLEMACLAYER = 0x7f IFT_DOCSCABLEUPSTREAM = 0x81 IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd IFT_DS0 = 0x51 IFT_DS0BUNDLE = 0x52 IFT_DS1FDL = 0xaa IFT_DS3 = 0x1e IFT_DTM = 0x8c IFT_DVBASILN = 0xac IFT_DVBASIOUT = 0xad IFT_DVBRCCDOWNSTREAM = 0x93 IFT_DVBRCCMACLAYER = 0x92 IFT_DVBRCCUPSTREAM = 0x94 IFT_ECONET = 0xce IFT_EON = 0x19 IFT_EPLRS = 0x57 IFT_ESCON = 0x49 IFT_ETHER = 0x6 IFT_FAITH = 0xf2 IFT_FAST = 0x7d IFT_FASTETHER = 0x3e IFT_FASTETHERFX = 0x45 IFT_FDDI = 0xf IFT_FIBRECHANNEL = 0x38 IFT_FRAMERELAYINTERCONNECT = 0x3a IFT_FRAMERELAYMPI = 0x5c IFT_FRDLCIENDPT = 0xc1 IFT_FRELAY = 0x20 IFT_FRELAYDCE = 0x2c IFT_FRF16MFRBUNDLE = 0xa3 IFT_FRFORWARD = 0x9e IFT_G703AT2MB = 0x43 IFT_G703AT64K = 0x42 IFT_GIF = 0xf0 IFT_GIGABITETHERNET = 0x75 IFT_GR303IDT = 0xb2 IFT_GR303RDT = 0xb1 IFT_H323GATEKEEPER = 0xa4 IFT_H323PROXY = 0xa5 IFT_HDH1822 = 0x3 IFT_HDLC = 0x76 IFT_HDSL2 = 0xa8 IFT_HIPERLAN2 = 0xb7 IFT_HIPPI = 0x2f IFT_HIPPIINTERFACE = 0x39 IFT_HOSTPAD = 0x5a IFT_HSSI = 0x2e IFT_HY = 0xe IFT_IBM370PARCHAN = 0x48 IFT_IDSL = 0x9a IFT_IEEE1394 = 0x90 IFT_IEEE80211 = 0x47 IFT_IEEE80212 = 0x37 IFT_IEEE8023ADLAG = 0xa1 IFT_IFGSN = 0x91 IFT_IMT = 0xbe IFT_INFINIBAND = 0xc7 IFT_INTERLEAVE = 0x7c IFT_IP = 0x7e IFT_IPFORWARD = 0x8e IFT_IPOVERATM = 0x72 IFT_IPOVERCDLC = 0x6d IFT_IPOVERCLAW = 0x6e IFT_IPSWITCH = 0x4e IFT_ISDN = 0x3f IFT_ISDNBASIC = 0x14 IFT_ISDNPRIMARY = 0x15 IFT_ISDNS = 0x4b IFT_ISDNU = 0x4c IFT_ISO88022LLC = 0x29 IFT_ISO88023 = 0x7 IFT_ISO88024 = 0x8 IFT_ISO88025 = 0x9 IFT_ISO88025CRFPINT = 0x62 IFT_ISO88025DTR = 0x56 IFT_ISO88025FIBER = 0x73 IFT_ISO88026 = 0xa IFT_ISUP = 0xb3 IFT_L2VLAN = 0x87 IFT_L3IPVLAN = 0x88 IFT_L3IPXVLAN = 0x89 IFT_LAPB = 0x10 IFT_LAPD = 0x4d IFT_LAPF = 0x77 IFT_LINEGROUP = 0xd2 IFT_LOCALTALK = 0x2a IFT_LOOP = 0x18 IFT_MEDIAMAILOVERIP = 0x8b IFT_MFSIGLINK = 0xa7 IFT_MIOX25 = 0x26 IFT_MODEM = 0x30 IFT_MPC = 0x71 IFT_MPLS = 0xa6 IFT_MPLSTUNNEL = 0x96 IFT_MSDSL = 0x8f IFT_MVL = 0xbf IFT_MYRINET = 0x63 IFT_NFAS = 0xaf IFT_NSIP = 0x1b IFT_OPTICALCHANNEL = 0xc3 IFT_OPTICALTRANSPORT = 0xc4 IFT_OTHER = 0x1 IFT_P10 = 0xc IFT_P80 = 0xd IFT_PARA = 0x22 IFT_PFLOG = 0xf5 IFT_PFSYNC = 0xf6 IFT_PLC = 0xae IFT_PON155 = 0xcf IFT_PON622 = 0xd0 IFT_POS = 0xab IFT_PPP = 0x17 IFT_PPPMULTILINKBUNDLE = 0x6c IFT_PROPATM = 0xc5 IFT_PROPBWAP2MP = 0xb8 IFT_PROPCNLS = 0x59 IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 IFT_PROPMUX = 0x36 IFT_PROPVIRTUAL = 0x35 IFT_PROPWIRELESSP2P = 0x9d IFT_PTPSERIAL = 0x16 IFT_PVC = 0xf1 IFT_Q2931 = 0xc9 IFT_QLLC = 0x44 IFT_RADIOMAC = 0xbc IFT_RADSL = 0x5f IFT_REACHDSL = 0xc0 IFT_RFC1483 = 0x9f IFT_RS232 = 0x21 IFT_RSRB = 0x4f IFT_SDLC = 0x11 IFT_SDSL = 0x60 IFT_SHDSL = 0xa9 IFT_SIP = 0x1f IFT_SIPSIG = 0xcc IFT_SIPTG = 0xcb IFT_SLIP = 0x1c IFT_SMDSDXI = 0x2b IFT_SMDSICIP = 0x34 IFT_SONET = 0x27 IFT_SONETOVERHEADCHANNEL = 0xb9 IFT_SONETPATH = 0x32 IFT_SONETVT = 0x33 IFT_SRP = 0x97 IFT_SS7SIGLINK = 0x9c IFT_STACKTOSTACK = 0x6f IFT_STARLAN = 0xb IFT_STF = 0xd7 IFT_T1 = 0x12 IFT_TDLC = 0x74 IFT_TELINK = 0xc8 IFT_TERMPAD = 0x5b IFT_TR008 = 0xb0 IFT_TRANSPHDLC = 0x7b IFT_TUNNEL = 0x83 IFT_ULTRA = 0x1d IFT_USB = 0xa0 IFT_V11 = 0x40 IFT_V35 = 0x2d IFT_V36 = 0x41 IFT_V37 = 0x78 IFT_VDSL = 0x61 IFT_VIRTUALIPADDRESS = 0x70 IFT_VIRTUALTG = 0xca IFT_VOICEDID = 0xd5 IFT_VOICEEM = 0x64 IFT_VOICEEMFGD = 0xd3 IFT_VOICEENCAP = 0x67 IFT_VOICEFGDEANA = 0xd4 IFT_VOICEFXO = 0x65 IFT_VOICEFXS = 0x66 IFT_VOICEOVERATM = 0x98 IFT_VOICEOVERCABLE = 0xc6 IFT_VOICEOVERFRAMERELAY = 0x99 IFT_VOICEOVERIP = 0x68 IFT_X213 = 0x5d IFT_X25 = 0x5 IFT_X25DDN = 0x4 IFT_X25HUNTGROUP = 0x7a IFT_X25MLP = 0x79 IFT_X25PLE = 0x28 IFT_XETHER = 0x1a IGNBRK = 0x1 IGNCR = 0x80 IGNPAR = 0x4 IMAXBEL = 0x2000 INLCR = 0x40 INPCK = 0x10 IN_CLASSA_HOST = 0xffffff IN_CLASSA_MAX = 0x80 IN_CLASSA_NET = 0xff000000 IN_CLASSA_NSHIFT = 0x18 IN_CLASSB_HOST = 0xffff IN_CLASSB_MAX = 0x10000 IN_CLASSB_NET = 0xffff0000 IN_CLASSB_NSHIFT = 0x10 IN_CLASSC_HOST = 0xff IN_CLASSC_NET = 0xffffff00 IN_CLASSC_NSHIFT = 0x8 IN_CLASSD_HOST = 0xfffffff IN_CLASSD_NET = 0xf0000000 IN_CLASSD_NSHIFT = 0x1c IN_LOOPBACKNET = 0x7f IPPROTO_AH = 0x33 IPPROTO_CARP = 0x70 IPPROTO_DONE = 0x101 IPPROTO_DSTOPTS = 0x3c IPPROTO_EGP = 0x8 IPPROTO_ENCAP = 0x62 IPPROTO_EON = 0x50 IPPROTO_ESP = 0x32 IPPROTO_ETHERIP = 0x61 IPPROTO_FRAGMENT = 0x2c IPPROTO_GGP = 0x3 IPPROTO_GRE = 0x2f IPPROTO_HOPOPTS = 0x0 IPPROTO_ICMP = 0x1 IPPROTO_ICMPV6 = 0x3a IPPROTO_IDP = 0x16 IPPROTO_IGMP = 0x2 IPPROTO_IP = 0x0 IPPROTO_IPCOMP = 0x6c IPPROTO_IPIP = 0x4 IPPROTO_IPV4 = 0x4 IPPROTO_IPV6 = 0x29 IPPROTO_IPV6_ICMP = 0x3a IPPROTO_MAX = 0x100 IPPROTO_MAXID = 0x34 IPPROTO_MOBILE = 0x37 IPPROTO_NONE = 0x3b IPPROTO_PFSYNC = 0xf0 IPPROTO_PIM = 0x67 IPPROTO_PUP = 0xc IPPROTO_RAW = 0xff IPPROTO_ROUTING = 0x2b IPPROTO_RSVP = 0x2e IPPROTO_TCP = 0x6 IPPROTO_TP = 0x1d IPPROTO_UDP = 0x11 IPPROTO_VRRP = 0x70 IPV6_CHECKSUM = 0x1a IPV6_DEFAULT_MULTICAST_HOPS = 0x1 IPV6_DEFAULT_MULTICAST_LOOP = 0x1 IPV6_DEFHLIM = 0x40 IPV6_DONTFRAG = 0x3e IPV6_DSTOPTS = 0x32 IPV6_FAITH = 0x1d IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 IPV6_FRAGTTL = 0x78 IPV6_HLIMDEC = 0x1 IPV6_HOPLIMIT = 0x2f IPV6_HOPOPTS = 0x31 IPV6_IPSEC_POLICY = 0x1c IPV6_JOIN_GROUP = 0xc IPV6_LEAVE_GROUP = 0xd IPV6_MAXHLIM = 0xff IPV6_MAXPACKET = 0xffff IPV6_MMTU = 0x500 IPV6_MULTICAST_HOPS = 0xa IPV6_MULTICAST_IF = 0x9 IPV6_MULTICAST_LOOP = 0xb IPV6_NEXTHOP = 0x30 IPV6_PATHMTU = 0x2c IPV6_PKTINFO = 0x2e IPV6_PORTRANGE = 0xe IPV6_PORTRANGE_DEFAULT = 0x0 IPV6_PORTRANGE_HIGH = 0x1 IPV6_PORTRANGE_LOW = 0x2 IPV6_RECVDSTOPTS = 0x28 IPV6_RECVHOPLIMIT = 0x25 IPV6_RECVHOPOPTS = 0x27 IPV6_RECVPATHMTU = 0x2b IPV6_RECVPKTINFO = 0x24 IPV6_RECVRTHDR = 0x26 IPV6_RECVTCLASS = 0x39 IPV6_RTHDR = 0x33 IPV6_RTHDRDSTOPTS = 0x23 IPV6_RTHDR_LOOSE = 0x0 IPV6_RTHDR_STRICT = 0x1 IPV6_RTHDR_TYPE_0 = 0x0 IPV6_SOCKOPT_RESERVED1 = 0x3 IPV6_TCLASS = 0x3d IPV6_UNICAST_HOPS = 0x4 IPV6_USE_MIN_MTU = 0x2a IPV6_V6ONLY = 0x1b IPV6_VERSION = 0x60 IPV6_VERSION_MASK = 0xf0 IP_ADD_MEMBERSHIP = 0xc IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 IP_DROP_MEMBERSHIP = 0xd IP_EF = 0x8000 IP_ERRORMTU = 0x15 IP_HDRINCL = 0x2 IP_IPSEC_POLICY = 0x16 IP_MAXPACKET = 0xffff IP_MAX_MEMBERSHIPS = 0x14 IP_MF = 0x2000 IP_MINFRAGSIZE = 0x45 IP_MINTTL = 0x18 IP_MSS = 0x240 IP_MULTICAST_IF = 0x9 IP_MULTICAST_LOOP = 0xb IP_MULTICAST_TTL = 0xa IP_OFFMASK = 0x1fff IP_OPTIONS = 0x1 IP_PORTRANGE = 0x13 IP_PORTRANGE_DEFAULT = 0x0 IP_PORTRANGE_HIGH = 0x1 IP_PORTRANGE_LOW = 0x2 IP_RECVDSTADDR = 0x7 IP_RECVIF = 0x14 IP_RECVOPTS = 0x5 IP_RECVRETOPTS = 0x6 IP_RECVTTL = 0x17 IP_RETOPTS = 0x8 IP_RF = 0x8000 IP_TOS = 0x3 IP_TTL = 0x4 ISIG = 0x80 ISTRIP = 0x20 IXANY = 0x800 IXOFF = 0x400 IXON = 0x200 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 MADV_DONTNEED = 0x4 MADV_FREE = 0x6 MADV_NORMAL = 0x0 MADV_RANDOM = 0x1 MADV_SEQUENTIAL = 0x2 MADV_SPACEAVAIL = 0x5 MADV_WILLNEED = 0x3 MAP_ALIGNMENT_16MB = 0x18000000 MAP_ALIGNMENT_1TB = 0x28000000 MAP_ALIGNMENT_256TB = 0x30000000 MAP_ALIGNMENT_4GB = 0x20000000 MAP_ALIGNMENT_64KB = 0x10000000 MAP_ALIGNMENT_64PB = 0x38000000 MAP_ALIGNMENT_MASK = -0x1000000 MAP_ALIGNMENT_SHIFT = 0x18 MAP_ANON = 0x1000 MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_HASSEMAPHORE = 0x200 MAP_INHERIT = 0x80 MAP_INHERIT_COPY = 0x1 MAP_INHERIT_DEFAULT = 0x1 MAP_INHERIT_DONATE_COPY = 0x3 MAP_INHERIT_NONE = 0x2 MAP_INHERIT_SHARE = 0x0 MAP_NORESERVE = 0x40 MAP_PRIVATE = 0x2 MAP_RENAME = 0x20 MAP_SHARED = 0x1 MAP_STACK = 0x2000 MAP_TRYFIXED = 0x400 MAP_WIRED = 0x800 MSG_BCAST = 0x100 MSG_CMSG_CLOEXEC = 0x800 MSG_CONTROLMBUF = 0x2000000 MSG_CTRUNC = 0x20 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x80 MSG_EOR = 0x8 MSG_IOVUSRSPACE = 0x4000000 MSG_LENUSRSPACE = 0x8000000 MSG_MCAST = 0x200 MSG_NAMEMBUF = 0x1000000 MSG_NBIO = 0x1000 MSG_NOSIGNAL = 0x400 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_TRUNC = 0x10 MSG_USERFLAGS = 0xffffff MSG_WAITALL = 0x40 MS_ASYNC = 0x1 MS_INVALIDATE = 0x2 MS_SYNC = 0x4 NAME_MAX = 0x1ff NET_RT_DUMP = 0x1 NET_RT_FLAGS = 0x2 NET_RT_IFLIST = 0x5 NET_RT_MAXID = 0x6 NET_RT_OIFLIST = 0x4 NET_RT_OOIFLIST = 0x3 NOFLSH = 0x80000000 NOTE_ATTRIB = 0x8 NOTE_CHILD = 0x4 NOTE_DELETE = 0x1 NOTE_EXEC = 0x20000000 NOTE_EXIT = 0x80000000 NOTE_EXTEND = 0x4 NOTE_FORK = 0x40000000 NOTE_LINK = 0x10 NOTE_LOWAT = 0x1 NOTE_PCTRLMASK = 0xf0000000 NOTE_PDATAMASK = 0xfffff NOTE_RENAME = 0x20 NOTE_REVOKE = 0x40 NOTE_TRACK = 0x1 NOTE_TRACKERR = 0x2 NOTE_WRITE = 0x2 OCRNL = 0x10 OFIOGETBMAP = 0xc004667a ONLCR = 0x2 ONLRET = 0x40 ONOCR = 0x20 ONOEOT = 0x8 OPOST = 0x1 O_ACCMODE = 0x3 O_ALT_IO = 0x40000 O_APPEND = 0x8 O_ASYNC = 0x40 O_CLOEXEC = 0x400000 O_CREAT = 0x200 O_DIRECT = 0x80000 O_DIRECTORY = 0x200000 O_DSYNC = 0x10000 O_EXCL = 0x800 O_EXLOCK = 0x20 O_FSYNC = 0x80 O_NDELAY = 0x4 O_NOCTTY = 0x8000 O_NOFOLLOW = 0x100 O_NONBLOCK = 0x4 O_NOSIGPIPE = 0x1000000 O_RDONLY = 0x0 O_RDWR = 0x2 O_RSYNC = 0x20000 O_SHLOCK = 0x10 O_SYNC = 0x80 O_TRUNC = 0x400 O_WRONLY = 0x1 PARENB = 0x1000 PARMRK = 0x8 PARODD = 0x2000 PENDIN = 0x20000000 PROT_EXEC = 0x4 PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 PRI_IOFLUSH = 0x7c PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 RLIMIT_AS = 0xa RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 RLIMIT_NOFILE = 0x8 RLIMIT_STACK = 0x3 RLIM_INFINITY = 0x7fffffffffffffff RTAX_AUTHOR = 0x6 RTAX_BRD = 0x7 RTAX_DST = 0x0 RTAX_GATEWAY = 0x1 RTAX_GENMASK = 0x3 RTAX_IFA = 0x5 RTAX_IFP = 0x4 RTAX_MAX = 0x9 RTAX_NETMASK = 0x2 RTAX_TAG = 0x8 RTA_AUTHOR = 0x40 RTA_BRD = 0x80 RTA_DST = 0x1 RTA_GATEWAY = 0x2 RTA_GENMASK = 0x8 RTA_IFA = 0x20 RTA_IFP = 0x10 RTA_NETMASK = 0x4 RTA_TAG = 0x100 RTF_ANNOUNCE = 0x20000 RTF_BLACKHOLE = 0x1000 RTF_CLONED = 0x2000 RTF_CLONING = 0x100 RTF_DONE = 0x40 RTF_DYNAMIC = 0x10 RTF_GATEWAY = 0x2 RTF_HOST = 0x4 RTF_LLINFO = 0x400 RTF_MASK = 0x80 RTF_MODIFIED = 0x20 RTF_PROTO1 = 0x8000 RTF_PROTO2 = 0x4000 RTF_REJECT = 0x8 RTF_SRC = 0x10000 RTF_STATIC = 0x800 RTF_UP = 0x1 RTF_XRESOLVE = 0x200 RTM_ADD = 0x1 RTM_CHANGE = 0x3 RTM_CHGADDR = 0x15 RTM_DELADDR = 0xd RTM_DELETE = 0x2 RTM_GET = 0x4 RTM_IEEE80211 = 0x11 RTM_IFANNOUNCE = 0x10 RTM_IFINFO = 0x14 RTM_LLINFO_UPD = 0x13 RTM_LOCK = 0x8 RTM_LOSING = 0x5 RTM_MISS = 0x7 RTM_NEWADDR = 0xc RTM_OIFINFO = 0xf RTM_OLDADD = 0x9 RTM_OLDDEL = 0xa RTM_OOIFINFO = 0xe RTM_REDIRECT = 0x6 RTM_RESOLVE = 0xb RTM_RTTUNIT = 0xf4240 RTM_SETGATE = 0x12 RTM_VERSION = 0x4 RTV_EXPIRE = 0x4 RTV_HOPCOUNT = 0x2 RTV_MTU = 0x1 RTV_RPIPE = 0x8 RTV_RTT = 0x40 RTV_RTTVAR = 0x80 RTV_SPIPE = 0x10 RTV_SSTHRESH = 0x20 RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 SCM_CREDS = 0x4 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x8 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 SIOCADDMULTI = 0x80906931 SIOCADDRT = 0x8030720a SIOCAIFADDR = 0x8040691a SIOCALIFADDR = 0x8118691c SIOCATMARK = 0x40047307 SIOCDELMULTI = 0x80906932 SIOCDELRT = 0x8030720b SIOCDIFADDR = 0x80906919 SIOCDIFPHYADDR = 0x80906949 SIOCDLIFADDR = 0x8118691e SIOCGDRVSPEC = 0xc01c697b SIOCGETPFSYNC = 0xc09069f8 SIOCGETSGCNT = 0xc0147534 SIOCGETVIFCNT = 0xc0147533 SIOCGHIWAT = 0x40047301 SIOCGIFADDR = 0xc0906921 SIOCGIFADDRPREF = 0xc0946920 SIOCGIFALIAS = 0xc040691b SIOCGIFBRDADDR = 0xc0906923 SIOCGIFCAP = 0xc0206976 SIOCGIFCONF = 0xc0086926 SIOCGIFDATA = 0xc0946985 SIOCGIFDLT = 0xc0906977 SIOCGIFDSTADDR = 0xc0906922 SIOCGIFFLAGS = 0xc0906911 SIOCGIFGENERIC = 0xc090693a SIOCGIFMEDIA = 0xc0286936 SIOCGIFMETRIC = 0xc0906917 SIOCGIFMTU = 0xc090697e SIOCGIFNETMASK = 0xc0906925 SIOCGIFPDSTADDR = 0xc0906948 SIOCGIFPSRCADDR = 0xc0906947 SIOCGLIFADDR = 0xc118691d SIOCGLIFPHYADDR = 0xc118694b SIOCGLINKSTR = 0xc01c6987 SIOCGLOWAT = 0x40047303 SIOCGPGRP = 0x40047309 SIOCGVH = 0xc0906983 SIOCIFCREATE = 0x8090697a SIOCIFDESTROY = 0x80906979 SIOCIFGCLONERS = 0xc00c6978 SIOCINITIFADDR = 0xc0446984 SIOCSDRVSPEC = 0x801c697b SIOCSETPFSYNC = 0x809069f7 SIOCSHIWAT = 0x80047300 SIOCSIFADDR = 0x8090690c SIOCSIFADDRPREF = 0x8094691f SIOCSIFBRDADDR = 0x80906913 SIOCSIFCAP = 0x80206975 SIOCSIFDSTADDR = 0x8090690e SIOCSIFFLAGS = 0x80906910 SIOCSIFGENERIC = 0x80906939 SIOCSIFMEDIA = 0xc0906935 SIOCSIFMETRIC = 0x80906918 SIOCSIFMTU = 0x8090697f SIOCSIFNETMASK = 0x80906916 SIOCSIFPHYADDR = 0x80406946 SIOCSLIFPHYADDR = 0x8118694a SIOCSLINKSTR = 0x801c6988 SIOCSLOWAT = 0x80047302 SIOCSPGRP = 0x80047308 SIOCSVH = 0xc0906982 SIOCZIFDATA = 0xc0946986 SOCK_CLOEXEC = 0x10000000 SOCK_DGRAM = 0x2 SOCK_FLAGS_MASK = 0xf0000000 SOCK_NONBLOCK = 0x20000000 SOCK_NOSIGPIPE = 0x40000000 SOCK_RAW = 0x3 SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x1 SOL_SOCKET = 0xffff SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x2 SO_ACCEPTFILTER = 0x1000 SO_BROADCAST = 0x20 SO_DEBUG = 0x1 SO_DONTROUTE = 0x10 SO_ERROR = 0x1007 SO_KEEPALIVE = 0x8 SO_LINGER = 0x80 SO_NOHEADER = 0x100a SO_NOSIGPIPE = 0x800 SO_OOBINLINE = 0x100 SO_OVERFLOWED = 0x1009 SO_RCVBUF = 0x1002 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x100c SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_SNDBUF = 0x1001 SO_SNDLOWAT = 0x1003 SO_SNDTIMEO = 0x100b SO_TIMESTAMP = 0x2000 SO_TYPE = 0x1008 SO_USELOOPBACK = 0x40 SYSCTL_VERSION = 0x1000000 SYSCTL_VERS_0 = 0x0 SYSCTL_VERS_1 = 0x1000000 SYSCTL_VERS_MASK = 0xff000000 S_ARCH1 = 0x10000 S_ARCH2 = 0x20000 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000 S_IFCHR = 0x2000 S_IFDIR = 0x4000 S_IFIFO = 0x1000 S_IFLNK = 0xa000 S_IFMT = 0xf000 S_IFREG = 0x8000 S_IFSOCK = 0xc000 S_IFWHT = 0xe000 S_IREAD = 0x100 S_IRGRP = 0x20 S_IROTH = 0x4 S_IRUSR = 0x100 S_IRWXG = 0x38 S_IRWXO = 0x7 S_IRWXU = 0x1c0 S_ISGID = 0x400 S_ISTXT = 0x200 S_ISUID = 0x800 S_ISVTX = 0x200 S_IWGRP = 0x10 S_IWOTH = 0x2 S_IWRITE = 0x80 S_IWUSR = 0x80 S_IXGRP = 0x8 S_IXOTH = 0x1 S_IXUSR = 0x40 TCIFLUSH = 0x1 TCIOFLUSH = 0x3 TCOFLUSH = 0x2 TCP_CONGCTL = 0x20 TCP_KEEPCNT = 0x6 TCP_KEEPIDLE = 0x3 TCP_KEEPINIT = 0x7 TCP_KEEPINTVL = 0x5 TCP_MAXBURST = 0x4 TCP_MAXSEG = 0x2 TCP_MAXWIN = 0xffff TCP_MAX_WINSHIFT = 0xe TCP_MD5SIG = 0x10 TCP_MINMSS = 0xd8 TCP_MSS = 0x218 TCP_NODELAY = 0x1 TCSAFLUSH = 0x2 TIOCCBRK = 0x2000747a TIOCCDTR = 0x20007478 TIOCCONS = 0x80047462 TIOCDCDTIMESTAMP = 0x400c7458 TIOCDRAIN = 0x2000745e TIOCEXCL = 0x2000740d TIOCEXT = 0x80047460 TIOCFLAG_CDTRCTS = 0x10 TIOCFLAG_CLOCAL = 0x2 TIOCFLAG_CRTSCTS = 0x4 TIOCFLAG_MDMBUF = 0x8 TIOCFLAG_SOFTCAR = 0x1 TIOCFLUSH = 0x80047410 TIOCGETA = 0x402c7413 TIOCGETD = 0x4004741a TIOCGFLAGS = 0x4004745d TIOCGLINED = 0x40207442 TIOCGPGRP = 0x40047477 TIOCGQSIZE = 0x40047481 TIOCGRANTPT = 0x20007447 TIOCGSID = 0x40047463 TIOCGSIZE = 0x40087468 TIOCGWINSZ = 0x40087468 TIOCMBIC = 0x8004746b TIOCMBIS = 0x8004746c TIOCMGET = 0x4004746a TIOCMSET = 0x8004746d TIOCM_CAR = 0x40 TIOCM_CD = 0x40 TIOCM_CTS = 0x20 TIOCM_DSR = 0x100 TIOCM_DTR = 0x2 TIOCM_LE = 0x1 TIOCM_RI = 0x80 TIOCM_RNG = 0x80 TIOCM_RTS = 0x4 TIOCM_SR = 0x10 TIOCM_ST = 0x8 TIOCNOTTY = 0x20007471 TIOCNXCL = 0x2000740e TIOCOUTQ = 0x40047473 TIOCPKT = 0x80047470 TIOCPKT_DATA = 0x0 TIOCPKT_DOSTOP = 0x20 TIOCPKT_FLUSHREAD = 0x1 TIOCPKT_FLUSHWRITE = 0x2 TIOCPKT_IOCTL = 0x40 TIOCPKT_NOSTOP = 0x10 TIOCPKT_START = 0x8 TIOCPKT_STOP = 0x4 TIOCPTMGET = 0x48087446 TIOCPTSNAME = 0x48087448 TIOCRCVFRAME = 0x80047445 TIOCREMOTE = 0x80047469 TIOCSBRK = 0x2000747b TIOCSCTTY = 0x20007461 TIOCSDTR = 0x20007479 TIOCSETA = 0x802c7414 TIOCSETAF = 0x802c7416 TIOCSETAW = 0x802c7415 TIOCSETD = 0x8004741b TIOCSFLAGS = 0x8004745c TIOCSIG = 0x2000745f TIOCSLINED = 0x80207443 TIOCSPGRP = 0x80047476 TIOCSQSIZE = 0x80047480 TIOCSSIZE = 0x80087467 TIOCSTART = 0x2000746e TIOCSTAT = 0x80047465 TIOCSTI = 0x80017472 TIOCSTOP = 0x2000746f TIOCSWINSZ = 0x80087467 TIOCUCNTL = 0x80047466 TIOCXMTFRAME = 0x80047444 TOSTOP = 0x400000 VDISCARD = 0xf VDSUSP = 0xb VEOF = 0x0 VEOL = 0x1 VEOL2 = 0x2 VERASE = 0x3 VINTR = 0x8 VKILL = 0x5 VLNEXT = 0xe VMIN = 0x10 VQUIT = 0x9 VREPRINT = 0x6 VSTART = 0xc VSTATUS = 0x12 VSTOP = 0xd VSUSP = 0xa VTIME = 0x11 VWERASE = 0x4 WALL = 0x8 WALLSIG = 0x8 WALTSIG = 0x4 WCLONE = 0x4 WCOREFLAG = 0x80 WNOHANG = 0x1 WNOWAIT = 0x10000 WNOZOMBIE = 0x20000 WOPTSCHECKED = 0x40000 WSTOPPED = 0x7f WUNTRACED = 0x2 ) // Errors const ( E2BIG = syscall.Errno(0x7) EACCES = syscall.Errno(0xd) EADDRINUSE = syscall.Errno(0x30) EADDRNOTAVAIL = syscall.Errno(0x31) EAFNOSUPPORT = syscall.Errno(0x2f) EAGAIN = syscall.Errno(0x23) EALREADY = syscall.Errno(0x25) EAUTH = syscall.Errno(0x50) EBADF = syscall.Errno(0x9) EBADMSG = syscall.Errno(0x58) EBADRPC = syscall.Errno(0x48) EBUSY = syscall.Errno(0x10) ECANCELED = syscall.Errno(0x57) ECHILD = syscall.Errno(0xa) ECONNABORTED = syscall.Errno(0x35) ECONNREFUSED = syscall.Errno(0x3d) ECONNRESET = syscall.Errno(0x36) EDEADLK = syscall.Errno(0xb) EDESTADDRREQ = syscall.Errno(0x27) EDOM = syscall.Errno(0x21) EDQUOT = syscall.Errno(0x45) EEXIST = syscall.Errno(0x11) EFAULT = syscall.Errno(0xe) EFBIG = syscall.Errno(0x1b) EFTYPE = syscall.Errno(0x4f) EHOSTDOWN = syscall.Errno(0x40) EHOSTUNREACH = syscall.Errno(0x41) EIDRM = syscall.Errno(0x52) EILSEQ = syscall.Errno(0x55) EINPROGRESS = syscall.Errno(0x24) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x38) EISDIR = syscall.Errno(0x15) ELAST = syscall.Errno(0x60) ELOOP = syscall.Errno(0x3e) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) EMSGSIZE = syscall.Errno(0x28) EMULTIHOP = syscall.Errno(0x5e) ENAMETOOLONG = syscall.Errno(0x3f) ENEEDAUTH = syscall.Errno(0x51) ENETDOWN = syscall.Errno(0x32) ENETRESET = syscall.Errno(0x34) ENETUNREACH = syscall.Errno(0x33) ENFILE = syscall.Errno(0x17) ENOATTR = syscall.Errno(0x5d) ENOBUFS = syscall.Errno(0x37) ENODATA = syscall.Errno(0x59) ENODEV = syscall.Errno(0x13) ENOENT = syscall.Errno(0x2) ENOEXEC = syscall.Errno(0x8) ENOLCK = syscall.Errno(0x4d) ENOLINK = syscall.Errno(0x5f) ENOMEM = syscall.Errno(0xc) ENOMSG = syscall.Errno(0x53) ENOPROTOOPT = syscall.Errno(0x2a) ENOSPC = syscall.Errno(0x1c) ENOSR = syscall.Errno(0x5a) ENOSTR = syscall.Errno(0x5b) ENOSYS = syscall.Errno(0x4e) ENOTBLK = syscall.Errno(0xf) ENOTCONN = syscall.Errno(0x39) ENOTDIR = syscall.Errno(0x14) ENOTEMPTY = syscall.Errno(0x42) ENOTSOCK = syscall.Errno(0x26) ENOTSUP = syscall.Errno(0x56) ENOTTY = syscall.Errno(0x19) ENXIO = syscall.Errno(0x6) EOPNOTSUPP = syscall.Errno(0x2d) EOVERFLOW = syscall.Errno(0x54) EPERM = syscall.Errno(0x1) EPFNOSUPPORT = syscall.Errno(0x2e) EPIPE = syscall.Errno(0x20) EPROCLIM = syscall.Errno(0x43) EPROCUNAVAIL = syscall.Errno(0x4c) EPROGMISMATCH = syscall.Errno(0x4b) EPROGUNAVAIL = syscall.Errno(0x4a) EPROTO = syscall.Errno(0x60) EPROTONOSUPPORT = syscall.Errno(0x2b) EPROTOTYPE = syscall.Errno(0x29) ERANGE = syscall.Errno(0x22) EREMOTE = syscall.Errno(0x47) EROFS = syscall.Errno(0x1e) ERPCMISMATCH = syscall.Errno(0x49) ESHUTDOWN = syscall.Errno(0x3a) ESOCKTNOSUPPORT = syscall.Errno(0x2c) ESPIPE = syscall.Errno(0x1d) ESRCH = syscall.Errno(0x3) ESTALE = syscall.Errno(0x46) ETIME = syscall.Errno(0x5c) ETIMEDOUT = syscall.Errno(0x3c) ETOOMANYREFS = syscall.Errno(0x3b) ETXTBSY = syscall.Errno(0x1a) EUSERS = syscall.Errno(0x44) EWOULDBLOCK = syscall.Errno(0x23) EXDEV = syscall.Errno(0x12) ) // Signals const ( SIGABRT = syscall.Signal(0x6) SIGALRM = syscall.Signal(0xe) SIGBUS = syscall.Signal(0xa) SIGCHLD = syscall.Signal(0x14) SIGCONT = syscall.Signal(0x13) SIGEMT = syscall.Signal(0x7) SIGFPE = syscall.Signal(0x8) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) SIGINFO = syscall.Signal(0x1d) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x17) SIGIOT = syscall.Signal(0x6) SIGKILL = syscall.Signal(0x9) SIGPIPE = syscall.Signal(0xd) SIGPROF = syscall.Signal(0x1b) SIGPWR = syscall.Signal(0x20) SIGQUIT = syscall.Signal(0x3) SIGSEGV = syscall.Signal(0xb) SIGSTOP = syscall.Signal(0x11) SIGSYS = syscall.Signal(0xc) SIGTERM = syscall.Signal(0xf) SIGTRAP = syscall.Signal(0x5) SIGTSTP = syscall.Signal(0x12) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) SIGURG = syscall.Signal(0x10) SIGUSR1 = syscall.Signal(0x1e) SIGUSR2 = syscall.Signal(0x1f) SIGVTALRM = syscall.Signal(0x1a) SIGWINCH = syscall.Signal(0x1c) SIGXCPU = syscall.Signal(0x18) SIGXFSZ = syscall.Signal(0x19) ) // Error table var errors = [...]string{ 1: "operation not permitted", 2: "no such file or directory", 3: "no such process", 4: "interrupted system call", 5: "input/output error", 6: "device not configured", 7: "argument list too long", 8: "exec format error", 9: "bad file descriptor", 10: "no child processes", 11: "resource deadlock avoided", 12: "cannot allocate memory", 13: "permission denied", 14: "bad address", 15: "block device required", 16: "device busy", 17: "file exists", 18: "cross-device link", 19: "operation not supported by device", 20: "not a directory", 21: "is a directory", 22: "invalid argument", 23: "too many open files in system", 24: "too many open files", 25: "inappropriate ioctl for device", 26: "text file busy", 27: "file too large", 28: "no space left on device", 29: "illegal seek", 30: "read-only file system", 31: "too many links", 32: "broken pipe", 33: "numerical argument out of domain", 34: "result too large or too small", 35: "resource temporarily unavailable", 36: "operation now in progress", 37: "operation already in progress", 38: "socket operation on non-socket", 39: "destination address required", 40: "message too long", 41: "protocol wrong type for socket", 42: "protocol option not available", 43: "protocol not supported", 44: "socket type not supported", 45: "operation not supported", 46: "protocol family not supported", 47: "address family not supported by protocol family", 48: "address already in use", 49: "can't assign requested address", 50: "network is down", 51: "network is unreachable", 52: "network dropped connection on reset", 53: "software caused connection abort", 54: "connection reset by peer", 55: "no buffer space available", 56: "socket is already connected", 57: "socket is not connected", 58: "can't send after socket shutdown", 59: "too many references: can't splice", 60: "connection timed out", 61: "connection refused", 62: "too many levels of symbolic links", 63: "file name too long", 64: "host is down", 65: "no route to host", 66: "directory not empty", 67: "too many processes", 68: "too many users", 69: "disc quota exceeded", 70: "stale NFS file handle", 71: "too many levels of remote in path", 72: "RPC struct is bad", 73: "RPC version wrong", 74: "RPC prog. not avail", 75: "program version wrong", 76: "bad procedure for program", 77: "no locks available", 78: "function not implemented", 79: "inappropriate file type or format", 80: "authentication error", 81: "need authenticator", 82: "identifier removed", 83: "no message of desired type", 84: "value too large to be stored in data type", 85: "illegal byte sequence", 86: "not supported", 87: "operation Canceled", 88: "bad or Corrupt message", 89: "no message available", 90: "no STREAM resources", 91: "not a STREAM", 92: "STREAM ioctl timeout", 93: "attribute not found", 94: "multihop attempted", 95: "link has been severed", 96: "protocol error", } // Signal table var signals = [...]string{ 1: "hangup", 2: "interrupt", 3: "quit", 4: "illegal instruction", 5: "trace/BPT trap", 6: "abort trap", 7: "EMT trap", 8: "floating point exception", 9: "killed", 10: "bus error", 11: "segmentation fault", 12: "bad system call", 13: "broken pipe", 14: "alarm clock", 15: "terminated", 16: "urgent I/O condition", 17: "stopped (signal)", 18: "stopped", 19: "continued", 20: "child exited", 21: "stopped (tty input)", 22: "stopped (tty output)", 23: "I/O possible", 24: "cputime limit exceeded", 25: "filesize limit exceeded", 26: "virtual timer expired", 27: "profiling timer expired", 28: "window size changes", 29: "information request", 30: "user defined signal 1", 31: "user defined signal 2", 32: "power fail/restart", } ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go ================================================ // mkerrors.sh -m32 // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT // +build 386,openbsd // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- -m32 _const.go package unix import "syscall" const ( AF_APPLETALK = 0x10 AF_BLUETOOTH = 0x20 AF_CCITT = 0xa AF_CHAOS = 0x5 AF_CNT = 0x15 AF_COIP = 0x14 AF_DATAKIT = 0x9 AF_DECnet = 0xc AF_DLI = 0xd AF_E164 = 0x1a AF_ECMA = 0x8 AF_ENCAP = 0x1c AF_HYLINK = 0xf AF_IMPLINK = 0x3 AF_INET = 0x2 AF_INET6 = 0x18 AF_IPX = 0x17 AF_ISDN = 0x1a AF_ISO = 0x7 AF_KEY = 0x1e AF_LAT = 0xe AF_LINK = 0x12 AF_LOCAL = 0x1 AF_MAX = 0x24 AF_MPLS = 0x21 AF_NATM = 0x1b AF_NS = 0x6 AF_OSI = 0x7 AF_PUP = 0x4 AF_ROUTE = 0x11 AF_SIP = 0x1d AF_SNA = 0xb AF_UNIX = 0x1 AF_UNSPEC = 0x0 ARPHRD_ETHER = 0x1 ARPHRD_FRELAY = 0xf ARPHRD_IEEE1394 = 0x18 ARPHRD_IEEE802 = 0x6 B0 = 0x0 B110 = 0x6e B115200 = 0x1c200 B1200 = 0x4b0 B134 = 0x86 B14400 = 0x3840 B150 = 0x96 B1800 = 0x708 B19200 = 0x4b00 B200 = 0xc8 B230400 = 0x38400 B2400 = 0x960 B28800 = 0x7080 B300 = 0x12c B38400 = 0x9600 B4800 = 0x12c0 B50 = 0x32 B57600 = 0xe100 B600 = 0x258 B7200 = 0x1c20 B75 = 0x4b B76800 = 0x12c00 B9600 = 0x2580 BIOCFLUSH = 0x20004268 BIOCGBLEN = 0x40044266 BIOCGDIRFILT = 0x4004427c BIOCGDLT = 0x4004426a BIOCGDLTLIST = 0xc008427b BIOCGETIF = 0x4020426b BIOCGFILDROP = 0x40044278 BIOCGHDRCMPLT = 0x40044274 BIOCGRSIG = 0x40044273 BIOCGRTIMEOUT = 0x400c426e BIOCGSTATS = 0x4008426f BIOCIMMEDIATE = 0x80044270 BIOCLOCK = 0x20004276 BIOCPROMISC = 0x20004269 BIOCSBLEN = 0xc0044266 BIOCSDIRFILT = 0x8004427d BIOCSDLT = 0x8004427a BIOCSETF = 0x80084267 BIOCSETIF = 0x8020426c BIOCSETWF = 0x80084277 BIOCSFILDROP = 0x80044279 BIOCSHDRCMPLT = 0x80044275 BIOCSRSIG = 0x80044272 BIOCSRTIMEOUT = 0x800c426d BIOCVERSION = 0x40044271 BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALIGNMENT = 0x4 BPF_ALU = 0x4 BPF_AND = 0x50 BPF_B = 0x10 BPF_DIRECTION_IN = 0x1 BPF_DIRECTION_OUT = 0x2 BPF_DIV = 0x30 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 BPF_JA = 0x0 BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 BPF_JMP = 0x5 BPF_JSET = 0x40 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 BPF_LEN = 0x80 BPF_LSH = 0x60 BPF_MAJOR_VERSION = 0x1 BPF_MAXBUFSIZE = 0x200000 BPF_MAXINSNS = 0x200 BPF_MEM = 0x60 BPF_MEMWORDS = 0x10 BPF_MINBUFSIZE = 0x20 BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_OR = 0x40 BPF_RELEASE = 0x30bb6 BPF_RET = 0x6 BPF_RSH = 0x70 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 BPF_TAX = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 BRKINT = 0x2 CFLUSH = 0xf CLOCAL = 0x8000 CREAD = 0x800 CS5 = 0x0 CS6 = 0x100 CS7 = 0x200 CS8 = 0x300 CSIZE = 0x300 CSTART = 0x11 CSTATUS = 0xff CSTOP = 0x13 CSTOPB = 0x400 CSUSP = 0x1a CTL_MAXNAME = 0xc CTL_NET = 0x4 DIOCOSFPFLUSH = 0x2000444e DLT_ARCNET = 0x7 DLT_ATM_RFC1483 = 0xb DLT_AX25 = 0x3 DLT_CHAOS = 0x5 DLT_C_HDLC = 0x68 DLT_EN10MB = 0x1 DLT_EN3MB = 0x2 DLT_ENC = 0xd DLT_FDDI = 0xa DLT_IEEE802 = 0x6 DLT_IEEE802_11 = 0x69 DLT_IEEE802_11_RADIO = 0x7f DLT_LOOP = 0xc DLT_MPLS = 0xdb DLT_NULL = 0x0 DLT_PFLOG = 0x75 DLT_PFSYNC = 0x12 DLT_PPP = 0x9 DLT_PPP_BSDOS = 0x10 DLT_PPP_ETHER = 0x33 DLT_PPP_SERIAL = 0x32 DLT_PRONET = 0x4 DLT_RAW = 0xe DLT_SLIP = 0x8 DLT_SLIP_BSDOS = 0xf DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 DT_FIFO = 0x1 DT_LNK = 0xa DT_REG = 0x8 DT_SOCK = 0xc DT_UNKNOWN = 0x0 ECHO = 0x8 ECHOCTL = 0x40 ECHOE = 0x2 ECHOK = 0x4 ECHOKE = 0x1 ECHONL = 0x10 ECHOPRT = 0x20 EMT_TAGOVF = 0x1 EMUL_ENABLED = 0x1 EMUL_NATIVE = 0x2 ENDRUNDISC = 0x9 ETHERMIN = 0x2e ETHERMTU = 0x5dc ETHERTYPE_8023 = 0x4 ETHERTYPE_AARP = 0x80f3 ETHERTYPE_ACCTON = 0x8390 ETHERTYPE_AEONIC = 0x8036 ETHERTYPE_ALPHA = 0x814a ETHERTYPE_AMBER = 0x6008 ETHERTYPE_AMOEBA = 0x8145 ETHERTYPE_AOE = 0x88a2 ETHERTYPE_APOLLO = 0x80f7 ETHERTYPE_APOLLODOMAIN = 0x8019 ETHERTYPE_APPLETALK = 0x809b ETHERTYPE_APPLITEK = 0x80c7 ETHERTYPE_ARGONAUT = 0x803a ETHERTYPE_ARP = 0x806 ETHERTYPE_AT = 0x809b ETHERTYPE_ATALK = 0x809b ETHERTYPE_ATOMIC = 0x86df ETHERTYPE_ATT = 0x8069 ETHERTYPE_ATTSTANFORD = 0x8008 ETHERTYPE_AUTOPHON = 0x806a ETHERTYPE_AXIS = 0x8856 ETHERTYPE_BCLOOP = 0x9003 ETHERTYPE_BOFL = 0x8102 ETHERTYPE_CABLETRON = 0x7034 ETHERTYPE_CHAOS = 0x804 ETHERTYPE_COMDESIGN = 0x806c ETHERTYPE_COMPUGRAPHIC = 0x806d ETHERTYPE_COUNTERPOINT = 0x8062 ETHERTYPE_CRONUS = 0x8004 ETHERTYPE_CRONUSVLN = 0x8003 ETHERTYPE_DCA = 0x1234 ETHERTYPE_DDE = 0x807b ETHERTYPE_DEBNI = 0xaaaa ETHERTYPE_DECAM = 0x8048 ETHERTYPE_DECCUST = 0x6006 ETHERTYPE_DECDIAG = 0x6005 ETHERTYPE_DECDNS = 0x803c ETHERTYPE_DECDTS = 0x803e ETHERTYPE_DECEXPER = 0x6000 ETHERTYPE_DECLAST = 0x8041 ETHERTYPE_DECLTM = 0x803f ETHERTYPE_DECMUMPS = 0x6009 ETHERTYPE_DECNETBIOS = 0x8040 ETHERTYPE_DELTACON = 0x86de ETHERTYPE_DIDDLE = 0x4321 ETHERTYPE_DLOG1 = 0x660 ETHERTYPE_DLOG2 = 0x661 ETHERTYPE_DN = 0x6003 ETHERTYPE_DOGFIGHT = 0x1989 ETHERTYPE_DSMD = 0x8039 ETHERTYPE_ECMA = 0x803 ETHERTYPE_ENCRYPT = 0x803d ETHERTYPE_ES = 0x805d ETHERTYPE_EXCELAN = 0x8010 ETHERTYPE_EXPERDATA = 0x8049 ETHERTYPE_FLIP = 0x8146 ETHERTYPE_FLOWCONTROL = 0x8808 ETHERTYPE_FRARP = 0x808 ETHERTYPE_GENDYN = 0x8068 ETHERTYPE_HAYES = 0x8130 ETHERTYPE_HIPPI_FP = 0x8180 ETHERTYPE_HITACHI = 0x8820 ETHERTYPE_HP = 0x8005 ETHERTYPE_IEEEPUP = 0xa00 ETHERTYPE_IEEEPUPAT = 0xa01 ETHERTYPE_IMLBL = 0x4c42 ETHERTYPE_IMLBLDIAG = 0x424c ETHERTYPE_IP = 0x800 ETHERTYPE_IPAS = 0x876c ETHERTYPE_IPV6 = 0x86dd ETHERTYPE_IPX = 0x8137 ETHERTYPE_IPXNEW = 0x8037 ETHERTYPE_KALPANA = 0x8582 ETHERTYPE_LANBRIDGE = 0x8038 ETHERTYPE_LANPROBE = 0x8888 ETHERTYPE_LAT = 0x6004 ETHERTYPE_LBACK = 0x9000 ETHERTYPE_LITTLE = 0x8060 ETHERTYPE_LLDP = 0x88cc ETHERTYPE_LOGICRAFT = 0x8148 ETHERTYPE_LOOPBACK = 0x9000 ETHERTYPE_MATRA = 0x807a ETHERTYPE_MAX = 0xffff ETHERTYPE_MERIT = 0x807c ETHERTYPE_MICP = 0x873a ETHERTYPE_MOPDL = 0x6001 ETHERTYPE_MOPRC = 0x6002 ETHERTYPE_MOTOROLA = 0x818d ETHERTYPE_MPLS = 0x8847 ETHERTYPE_MPLS_MCAST = 0x8848 ETHERTYPE_MUMPS = 0x813f ETHERTYPE_NBPCC = 0x3c04 ETHERTYPE_NBPCLAIM = 0x3c09 ETHERTYPE_NBPCLREQ = 0x3c05 ETHERTYPE_NBPCLRSP = 0x3c06 ETHERTYPE_NBPCREQ = 0x3c02 ETHERTYPE_NBPCRSP = 0x3c03 ETHERTYPE_NBPDG = 0x3c07 ETHERTYPE_NBPDGB = 0x3c08 ETHERTYPE_NBPDLTE = 0x3c0a ETHERTYPE_NBPRAR = 0x3c0c ETHERTYPE_NBPRAS = 0x3c0b ETHERTYPE_NBPRST = 0x3c0d ETHERTYPE_NBPSCD = 0x3c01 ETHERTYPE_NBPVCD = 0x3c00 ETHERTYPE_NBS = 0x802 ETHERTYPE_NCD = 0x8149 ETHERTYPE_NESTAR = 0x8006 ETHERTYPE_NETBEUI = 0x8191 ETHERTYPE_NOVELL = 0x8138 ETHERTYPE_NS = 0x600 ETHERTYPE_NSAT = 0x601 ETHERTYPE_NSCOMPAT = 0x807 ETHERTYPE_NTRAILER = 0x10 ETHERTYPE_OS9 = 0x7007 ETHERTYPE_OS9NET = 0x7009 ETHERTYPE_PACER = 0x80c6 ETHERTYPE_PAE = 0x888e ETHERTYPE_PCS = 0x4242 ETHERTYPE_PLANNING = 0x8044 ETHERTYPE_PPP = 0x880b ETHERTYPE_PPPOE = 0x8864 ETHERTYPE_PPPOEDISC = 0x8863 ETHERTYPE_PRIMENTS = 0x7031 ETHERTYPE_PUP = 0x200 ETHERTYPE_PUPAT = 0x200 ETHERTYPE_QINQ = 0x88a8 ETHERTYPE_RACAL = 0x7030 ETHERTYPE_RATIONAL = 0x8150 ETHERTYPE_RAWFR = 0x6559 ETHERTYPE_RCL = 0x1995 ETHERTYPE_RDP = 0x8739 ETHERTYPE_RETIX = 0x80f2 ETHERTYPE_REVARP = 0x8035 ETHERTYPE_SCA = 0x6007 ETHERTYPE_SECTRA = 0x86db ETHERTYPE_SECUREDATA = 0x876d ETHERTYPE_SGITW = 0x817e ETHERTYPE_SG_BOUNCE = 0x8016 ETHERTYPE_SG_DIAG = 0x8013 ETHERTYPE_SG_NETGAMES = 0x8014 ETHERTYPE_SG_RESV = 0x8015 ETHERTYPE_SIMNET = 0x5208 ETHERTYPE_SLOW = 0x8809 ETHERTYPE_SNA = 0x80d5 ETHERTYPE_SNMP = 0x814c ETHERTYPE_SONIX = 0xfaf5 ETHERTYPE_SPIDER = 0x809f ETHERTYPE_SPRITE = 0x500 ETHERTYPE_STP = 0x8181 ETHERTYPE_TALARIS = 0x812b ETHERTYPE_TALARISMC = 0x852b ETHERTYPE_TCPCOMP = 0x876b ETHERTYPE_TCPSM = 0x9002 ETHERTYPE_TEC = 0x814f ETHERTYPE_TIGAN = 0x802f ETHERTYPE_TRAIL = 0x1000 ETHERTYPE_TRANSETHER = 0x6558 ETHERTYPE_TYMSHARE = 0x802e ETHERTYPE_UBBST = 0x7005 ETHERTYPE_UBDEBUG = 0x900 ETHERTYPE_UBDIAGLOOP = 0x7002 ETHERTYPE_UBDL = 0x7000 ETHERTYPE_UBNIU = 0x7001 ETHERTYPE_UBNMC = 0x7003 ETHERTYPE_VALID = 0x1600 ETHERTYPE_VARIAN = 0x80dd ETHERTYPE_VAXELN = 0x803b ETHERTYPE_VEECO = 0x8067 ETHERTYPE_VEXP = 0x805b ETHERTYPE_VGLAB = 0x8131 ETHERTYPE_VINES = 0xbad ETHERTYPE_VINESECHO = 0xbaf ETHERTYPE_VINESLOOP = 0xbae ETHERTYPE_VITAL = 0xff00 ETHERTYPE_VLAN = 0x8100 ETHERTYPE_VLTLMAN = 0x8080 ETHERTYPE_VPROD = 0x805c ETHERTYPE_VURESERVED = 0x8147 ETHERTYPE_WATERLOO = 0x8130 ETHERTYPE_WELLFLEET = 0x8103 ETHERTYPE_X25 = 0x805 ETHERTYPE_X75 = 0x801 ETHERTYPE_XNSSM = 0x9001 ETHERTYPE_XTP = 0x817d ETHER_ADDR_LEN = 0x6 ETHER_ALIGN = 0x2 ETHER_CRC_LEN = 0x4 ETHER_CRC_POLY_BE = 0x4c11db6 ETHER_CRC_POLY_LE = 0xedb88320 ETHER_HDR_LEN = 0xe ETHER_MAX_DIX_LEN = 0x600 ETHER_MAX_LEN = 0x5ee ETHER_MIN_LEN = 0x40 ETHER_TYPE_LEN = 0x2 ETHER_VLAN_ENCAP_LEN = 0x4 EVFILT_AIO = -0x3 EVFILT_PROC = -0x5 EVFILT_READ = -0x1 EVFILT_SIGNAL = -0x6 EVFILT_SYSCOUNT = 0x7 EVFILT_TIMER = -0x7 EVFILT_VNODE = -0x4 EVFILT_WRITE = -0x2 EV_ADD = 0x1 EV_CLEAR = 0x20 EV_DELETE = 0x2 EV_DISABLE = 0x8 EV_ENABLE = 0x4 EV_EOF = 0x8000 EV_ERROR = 0x4000 EV_FLAG1 = 0x2000 EV_ONESHOT = 0x10 EV_SYSFLAGS = 0xf000 EXTA = 0x4b00 EXTB = 0x9600 EXTPROC = 0x800 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FLUSHO = 0x800000 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0xa F_GETFD = 0x1 F_GETFL = 0x3 F_GETLK = 0x7 F_GETOWN = 0x5 F_OK = 0x0 F_RDLCK = 0x1 F_SETFD = 0x2 F_SETFL = 0x4 F_SETLK = 0x8 F_SETLKW = 0x9 F_SETOWN = 0x6 F_UNLCK = 0x2 F_WRLCK = 0x3 HUPCL = 0x4000 ICANON = 0x100 ICMP6_FILTER = 0x12 ICRNL = 0x100 IEXTEN = 0x400 IFAN_ARRIVAL = 0x0 IFAN_DEPARTURE = 0x1 IFA_ROUTE = 0x1 IFF_ALLMULTI = 0x200 IFF_BROADCAST = 0x2 IFF_CANTCHANGE = 0x8e52 IFF_DEBUG = 0x4 IFF_LINK0 = 0x1000 IFF_LINK1 = 0x2000 IFF_LINK2 = 0x4000 IFF_LOOPBACK = 0x8 IFF_MULTICAST = 0x8000 IFF_NOARP = 0x80 IFF_NOTRAILERS = 0x20 IFF_OACTIVE = 0x400 IFF_POINTOPOINT = 0x10 IFF_PROMISC = 0x100 IFF_RUNNING = 0x40 IFF_SIMPLEX = 0x800 IFF_UP = 0x1 IFNAMSIZ = 0x10 IFT_1822 = 0x2 IFT_A12MPPSWITCH = 0x82 IFT_AAL2 = 0xbb IFT_AAL5 = 0x31 IFT_ADSL = 0x5e IFT_AFLANE8023 = 0x3b IFT_AFLANE8025 = 0x3c IFT_ARAP = 0x58 IFT_ARCNET = 0x23 IFT_ARCNETPLUS = 0x24 IFT_ASYNC = 0x54 IFT_ATM = 0x25 IFT_ATMDXI = 0x69 IFT_ATMFUNI = 0x6a IFT_ATMIMA = 0x6b IFT_ATMLOGICAL = 0x50 IFT_ATMRADIO = 0xbd IFT_ATMSUBINTERFACE = 0x86 IFT_ATMVCIENDPT = 0xc2 IFT_ATMVIRTUAL = 0x95 IFT_BGPPOLICYACCOUNTING = 0xa2 IFT_BLUETOOTH = 0xf8 IFT_BRIDGE = 0xd1 IFT_BSC = 0x53 IFT_CARP = 0xf7 IFT_CCTEMUL = 0x3d IFT_CEPT = 0x13 IFT_CES = 0x85 IFT_CHANNEL = 0x46 IFT_CNR = 0x55 IFT_COFFEE = 0x84 IFT_COMPOSITELINK = 0x9b IFT_DCN = 0x8d IFT_DIGITALPOWERLINE = 0x8a IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba IFT_DLSW = 0x4a IFT_DOCSCABLEDOWNSTREAM = 0x80 IFT_DOCSCABLEMACLAYER = 0x7f IFT_DOCSCABLEUPSTREAM = 0x81 IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd IFT_DS0 = 0x51 IFT_DS0BUNDLE = 0x52 IFT_DS1FDL = 0xaa IFT_DS3 = 0x1e IFT_DTM = 0x8c IFT_DUMMY = 0xf1 IFT_DVBASILN = 0xac IFT_DVBASIOUT = 0xad IFT_DVBRCCDOWNSTREAM = 0x93 IFT_DVBRCCMACLAYER = 0x92 IFT_DVBRCCUPSTREAM = 0x94 IFT_ECONET = 0xce IFT_ENC = 0xf4 IFT_EON = 0x19 IFT_EPLRS = 0x57 IFT_ESCON = 0x49 IFT_ETHER = 0x6 IFT_FAITH = 0xf3 IFT_FAST = 0x7d IFT_FASTETHER = 0x3e IFT_FASTETHERFX = 0x45 IFT_FDDI = 0xf IFT_FIBRECHANNEL = 0x38 IFT_FRAMERELAYINTERCONNECT = 0x3a IFT_FRAMERELAYMPI = 0x5c IFT_FRDLCIENDPT = 0xc1 IFT_FRELAY = 0x20 IFT_FRELAYDCE = 0x2c IFT_FRF16MFRBUNDLE = 0xa3 IFT_FRFORWARD = 0x9e IFT_G703AT2MB = 0x43 IFT_G703AT64K = 0x42 IFT_GIF = 0xf0 IFT_GIGABITETHERNET = 0x75 IFT_GR303IDT = 0xb2 IFT_GR303RDT = 0xb1 IFT_H323GATEKEEPER = 0xa4 IFT_H323PROXY = 0xa5 IFT_HDH1822 = 0x3 IFT_HDLC = 0x76 IFT_HDSL2 = 0xa8 IFT_HIPERLAN2 = 0xb7 IFT_HIPPI = 0x2f IFT_HIPPIINTERFACE = 0x39 IFT_HOSTPAD = 0x5a IFT_HSSI = 0x2e IFT_HY = 0xe IFT_IBM370PARCHAN = 0x48 IFT_IDSL = 0x9a IFT_IEEE1394 = 0x90 IFT_IEEE80211 = 0x47 IFT_IEEE80212 = 0x37 IFT_IEEE8023ADLAG = 0xa1 IFT_IFGSN = 0x91 IFT_IMT = 0xbe IFT_INFINIBAND = 0xc7 IFT_INTERLEAVE = 0x7c IFT_IP = 0x7e IFT_IPFORWARD = 0x8e IFT_IPOVERATM = 0x72 IFT_IPOVERCDLC = 0x6d IFT_IPOVERCLAW = 0x6e IFT_IPSWITCH = 0x4e IFT_ISDN = 0x3f IFT_ISDNBASIC = 0x14 IFT_ISDNPRIMARY = 0x15 IFT_ISDNS = 0x4b IFT_ISDNU = 0x4c IFT_ISO88022LLC = 0x29 IFT_ISO88023 = 0x7 IFT_ISO88024 = 0x8 IFT_ISO88025 = 0x9 IFT_ISO88025CRFPINT = 0x62 IFT_ISO88025DTR = 0x56 IFT_ISO88025FIBER = 0x73 IFT_ISO88026 = 0xa IFT_ISUP = 0xb3 IFT_L2VLAN = 0x87 IFT_L3IPVLAN = 0x88 IFT_L3IPXVLAN = 0x89 IFT_LAPB = 0x10 IFT_LAPD = 0x4d IFT_LAPF = 0x77 IFT_LINEGROUP = 0xd2 IFT_LOCALTALK = 0x2a IFT_LOOP = 0x18 IFT_MEDIAMAILOVERIP = 0x8b IFT_MFSIGLINK = 0xa7 IFT_MIOX25 = 0x26 IFT_MODEM = 0x30 IFT_MPC = 0x71 IFT_MPLS = 0xa6 IFT_MPLSTUNNEL = 0x96 IFT_MSDSL = 0x8f IFT_MVL = 0xbf IFT_MYRINET = 0x63 IFT_NFAS = 0xaf IFT_NSIP = 0x1b IFT_OPTICALCHANNEL = 0xc3 IFT_OPTICALTRANSPORT = 0xc4 IFT_OTHER = 0x1 IFT_P10 = 0xc IFT_P80 = 0xd IFT_PARA = 0x22 IFT_PFLOG = 0xf5 IFT_PFLOW = 0xf9 IFT_PFSYNC = 0xf6 IFT_PLC = 0xae IFT_PON155 = 0xcf IFT_PON622 = 0xd0 IFT_POS = 0xab IFT_PPP = 0x17 IFT_PPPMULTILINKBUNDLE = 0x6c IFT_PROPATM = 0xc5 IFT_PROPBWAP2MP = 0xb8 IFT_PROPCNLS = 0x59 IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 IFT_PROPMUX = 0x36 IFT_PROPVIRTUAL = 0x35 IFT_PROPWIRELESSP2P = 0x9d IFT_PTPSERIAL = 0x16 IFT_PVC = 0xf2 IFT_Q2931 = 0xc9 IFT_QLLC = 0x44 IFT_RADIOMAC = 0xbc IFT_RADSL = 0x5f IFT_REACHDSL = 0xc0 IFT_RFC1483 = 0x9f IFT_RS232 = 0x21 IFT_RSRB = 0x4f IFT_SDLC = 0x11 IFT_SDSL = 0x60 IFT_SHDSL = 0xa9 IFT_SIP = 0x1f IFT_SIPSIG = 0xcc IFT_SIPTG = 0xcb IFT_SLIP = 0x1c IFT_SMDSDXI = 0x2b IFT_SMDSICIP = 0x34 IFT_SONET = 0x27 IFT_SONETOVERHEADCHANNEL = 0xb9 IFT_SONETPATH = 0x32 IFT_SONETVT = 0x33 IFT_SRP = 0x97 IFT_SS7SIGLINK = 0x9c IFT_STACKTOSTACK = 0x6f IFT_STARLAN = 0xb IFT_T1 = 0x12 IFT_TDLC = 0x74 IFT_TELINK = 0xc8 IFT_TERMPAD = 0x5b IFT_TR008 = 0xb0 IFT_TRANSPHDLC = 0x7b IFT_TUNNEL = 0x83 IFT_ULTRA = 0x1d IFT_USB = 0xa0 IFT_V11 = 0x40 IFT_V35 = 0x2d IFT_V36 = 0x41 IFT_V37 = 0x78 IFT_VDSL = 0x61 IFT_VIRTUALIPADDRESS = 0x70 IFT_VIRTUALTG = 0xca IFT_VOICEDID = 0xd5 IFT_VOICEEM = 0x64 IFT_VOICEEMFGD = 0xd3 IFT_VOICEENCAP = 0x67 IFT_VOICEFGDEANA = 0xd4 IFT_VOICEFXO = 0x65 IFT_VOICEFXS = 0x66 IFT_VOICEOVERATM = 0x98 IFT_VOICEOVERCABLE = 0xc6 IFT_VOICEOVERFRAMERELAY = 0x99 IFT_VOICEOVERIP = 0x68 IFT_X213 = 0x5d IFT_X25 = 0x5 IFT_X25DDN = 0x4 IFT_X25HUNTGROUP = 0x7a IFT_X25MLP = 0x79 IFT_X25PLE = 0x28 IFT_XETHER = 0x1a IGNBRK = 0x1 IGNCR = 0x80 IGNPAR = 0x4 IMAXBEL = 0x2000 INLCR = 0x40 INPCK = 0x10 IN_CLASSA_HOST = 0xffffff IN_CLASSA_MAX = 0x80 IN_CLASSA_NET = 0xff000000 IN_CLASSA_NSHIFT = 0x18 IN_CLASSB_HOST = 0xffff IN_CLASSB_MAX = 0x10000 IN_CLASSB_NET = 0xffff0000 IN_CLASSB_NSHIFT = 0x10 IN_CLASSC_HOST = 0xff IN_CLASSC_NET = 0xffffff00 IN_CLASSC_NSHIFT = 0x8 IN_CLASSD_HOST = 0xfffffff IN_CLASSD_NET = 0xf0000000 IN_CLASSD_NSHIFT = 0x1c IN_LOOPBACKNET = 0x7f IN_RFC3021_HOST = 0x1 IN_RFC3021_NET = 0xfffffffe IN_RFC3021_NSHIFT = 0x1f IPPROTO_AH = 0x33 IPPROTO_CARP = 0x70 IPPROTO_DIVERT = 0x102 IPPROTO_DIVERT_INIT = 0x2 IPPROTO_DIVERT_RESP = 0x1 IPPROTO_DONE = 0x101 IPPROTO_DSTOPTS = 0x3c IPPROTO_EGP = 0x8 IPPROTO_ENCAP = 0x62 IPPROTO_EON = 0x50 IPPROTO_ESP = 0x32 IPPROTO_ETHERIP = 0x61 IPPROTO_FRAGMENT = 0x2c IPPROTO_GGP = 0x3 IPPROTO_GRE = 0x2f IPPROTO_HOPOPTS = 0x0 IPPROTO_ICMP = 0x1 IPPROTO_ICMPV6 = 0x3a IPPROTO_IDP = 0x16 IPPROTO_IGMP = 0x2 IPPROTO_IP = 0x0 IPPROTO_IPCOMP = 0x6c IPPROTO_IPIP = 0x4 IPPROTO_IPV4 = 0x4 IPPROTO_IPV6 = 0x29 IPPROTO_MAX = 0x100 IPPROTO_MAXID = 0x103 IPPROTO_MOBILE = 0x37 IPPROTO_MPLS = 0x89 IPPROTO_NONE = 0x3b IPPROTO_PFSYNC = 0xf0 IPPROTO_PIM = 0x67 IPPROTO_PUP = 0xc IPPROTO_RAW = 0xff IPPROTO_ROUTING = 0x2b IPPROTO_RSVP = 0x2e IPPROTO_TCP = 0x6 IPPROTO_TP = 0x1d IPPROTO_UDP = 0x11 IPV6_AUTH_LEVEL = 0x35 IPV6_AUTOFLOWLABEL = 0x3b IPV6_CHECKSUM = 0x1a IPV6_DEFAULT_MULTICAST_HOPS = 0x1 IPV6_DEFAULT_MULTICAST_LOOP = 0x1 IPV6_DEFHLIM = 0x40 IPV6_DONTFRAG = 0x3e IPV6_DSTOPTS = 0x32 IPV6_ESP_NETWORK_LEVEL = 0x37 IPV6_ESP_TRANS_LEVEL = 0x36 IPV6_FAITH = 0x1d IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 IPV6_FRAGTTL = 0x78 IPV6_HLIMDEC = 0x1 IPV6_HOPLIMIT = 0x2f IPV6_HOPOPTS = 0x31 IPV6_IPCOMP_LEVEL = 0x3c IPV6_JOIN_GROUP = 0xc IPV6_LEAVE_GROUP = 0xd IPV6_MAXHLIM = 0xff IPV6_MAXPACKET = 0xffff IPV6_MMTU = 0x500 IPV6_MULTICAST_HOPS = 0xa IPV6_MULTICAST_IF = 0x9 IPV6_MULTICAST_LOOP = 0xb IPV6_NEXTHOP = 0x30 IPV6_OPTIONS = 0x1 IPV6_PATHMTU = 0x2c IPV6_PIPEX = 0x3f IPV6_PKTINFO = 0x2e IPV6_PORTRANGE = 0xe IPV6_PORTRANGE_DEFAULT = 0x0 IPV6_PORTRANGE_HIGH = 0x1 IPV6_PORTRANGE_LOW = 0x2 IPV6_RECVDSTOPTS = 0x28 IPV6_RECVDSTPORT = 0x40 IPV6_RECVHOPLIMIT = 0x25 IPV6_RECVHOPOPTS = 0x27 IPV6_RECVPATHMTU = 0x2b IPV6_RECVPKTINFO = 0x24 IPV6_RECVRTHDR = 0x26 IPV6_RECVTCLASS = 0x39 IPV6_RTABLE = 0x1021 IPV6_RTHDR = 0x33 IPV6_RTHDRDSTOPTS = 0x23 IPV6_RTHDR_LOOSE = 0x0 IPV6_RTHDR_STRICT = 0x1 IPV6_RTHDR_TYPE_0 = 0x0 IPV6_SOCKOPT_RESERVED1 = 0x3 IPV6_TCLASS = 0x3d IPV6_UNICAST_HOPS = 0x4 IPV6_USE_MIN_MTU = 0x2a IPV6_V6ONLY = 0x1b IPV6_VERSION = 0x60 IPV6_VERSION_MASK = 0xf0 IP_ADD_MEMBERSHIP = 0xc IP_AUTH_LEVEL = 0x14 IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 IP_DIVERTFL = 0x1022 IP_DROP_MEMBERSHIP = 0xd IP_ESP_NETWORK_LEVEL = 0x16 IP_ESP_TRANS_LEVEL = 0x15 IP_HDRINCL = 0x2 IP_IPCOMP_LEVEL = 0x1d IP_IPSECFLOWINFO = 0x24 IP_IPSEC_LOCAL_AUTH = 0x1b IP_IPSEC_LOCAL_CRED = 0x19 IP_IPSEC_LOCAL_ID = 0x17 IP_IPSEC_REMOTE_AUTH = 0x1c IP_IPSEC_REMOTE_CRED = 0x1a IP_IPSEC_REMOTE_ID = 0x18 IP_MAXPACKET = 0xffff IP_MAX_MEMBERSHIPS = 0xfff IP_MF = 0x2000 IP_MINTTL = 0x20 IP_MIN_MEMBERSHIPS = 0xf IP_MSS = 0x240 IP_MULTICAST_IF = 0x9 IP_MULTICAST_LOOP = 0xb IP_MULTICAST_TTL = 0xa IP_OFFMASK = 0x1fff IP_OPTIONS = 0x1 IP_PIPEX = 0x22 IP_PORTRANGE = 0x13 IP_PORTRANGE_DEFAULT = 0x0 IP_PORTRANGE_HIGH = 0x1 IP_PORTRANGE_LOW = 0x2 IP_RECVDSTADDR = 0x7 IP_RECVDSTPORT = 0x21 IP_RECVIF = 0x1e IP_RECVOPTS = 0x5 IP_RECVRETOPTS = 0x6 IP_RECVRTABLE = 0x23 IP_RECVTTL = 0x1f IP_RETOPTS = 0x8 IP_RF = 0x8000 IP_RTABLE = 0x1021 IP_TOS = 0x3 IP_TTL = 0x4 ISIG = 0x80 ISTRIP = 0x20 IXANY = 0x800 IXOFF = 0x400 IXON = 0x200 LCNT_OVERLOAD_FLUSH = 0x6 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 MADV_DONTNEED = 0x4 MADV_FREE = 0x6 MADV_NORMAL = 0x0 MADV_RANDOM = 0x1 MADV_SEQUENTIAL = 0x2 MADV_SPACEAVAIL = 0x5 MADV_WILLNEED = 0x3 MAP_ANON = 0x1000 MAP_COPY = 0x4 MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_FLAGMASK = 0x1ff7 MAP_HASSEMAPHORE = 0x200 MAP_INHERIT = 0x80 MAP_INHERIT_COPY = 0x1 MAP_INHERIT_DONATE_COPY = 0x3 MAP_INHERIT_NONE = 0x2 MAP_INHERIT_SHARE = 0x0 MAP_NOEXTEND = 0x100 MAP_NORESERVE = 0x40 MAP_PRIVATE = 0x2 MAP_RENAME = 0x20 MAP_SHARED = 0x1 MAP_TRYFIXED = 0x400 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MSG_BCAST = 0x100 MSG_CTRUNC = 0x20 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x80 MSG_EOR = 0x8 MSG_MCAST = 0x200 MSG_NOSIGNAL = 0x400 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_TRUNC = 0x10 MSG_WAITALL = 0x40 MS_ASYNC = 0x1 MS_INVALIDATE = 0x4 MS_SYNC = 0x2 NAME_MAX = 0xff NET_RT_DUMP = 0x1 NET_RT_FLAGS = 0x2 NET_RT_IFLIST = 0x3 NET_RT_MAXID = 0x6 NET_RT_STATS = 0x4 NET_RT_TABLE = 0x5 NOFLSH = 0x80000000 NOTE_ATTRIB = 0x8 NOTE_CHILD = 0x4 NOTE_DELETE = 0x1 NOTE_EOF = 0x2 NOTE_EXEC = 0x20000000 NOTE_EXIT = 0x80000000 NOTE_EXTEND = 0x4 NOTE_FORK = 0x40000000 NOTE_LINK = 0x10 NOTE_LOWAT = 0x1 NOTE_PCTRLMASK = 0xf0000000 NOTE_PDATAMASK = 0xfffff NOTE_RENAME = 0x20 NOTE_REVOKE = 0x40 NOTE_TRACK = 0x1 NOTE_TRACKERR = 0x2 NOTE_TRUNCATE = 0x80 NOTE_WRITE = 0x2 OCRNL = 0x10 ONLCR = 0x2 ONLRET = 0x80 ONOCR = 0x40 ONOEOT = 0x8 OPOST = 0x1 O_ACCMODE = 0x3 O_APPEND = 0x8 O_ASYNC = 0x40 O_CLOEXEC = 0x10000 O_CREAT = 0x200 O_DIRECTORY = 0x20000 O_DSYNC = 0x80 O_EXCL = 0x800 O_EXLOCK = 0x20 O_FSYNC = 0x80 O_NDELAY = 0x4 O_NOCTTY = 0x8000 O_NOFOLLOW = 0x100 O_NONBLOCK = 0x4 O_RDONLY = 0x0 O_RDWR = 0x2 O_RSYNC = 0x80 O_SHLOCK = 0x10 O_SYNC = 0x80 O_TRUNC = 0x400 O_WRONLY = 0x1 PARENB = 0x1000 PARMRK = 0x8 PARODD = 0x2000 PENDIN = 0x20000000 PF_FLUSH = 0x1 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 PROT_EXEC = 0x4 PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 PT_MASK = 0x3ff000 RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 RLIMIT_NOFILE = 0x8 RLIMIT_STACK = 0x3 RLIM_INFINITY = 0x7fffffffffffffff RTAX_AUTHOR = 0x6 RTAX_BRD = 0x7 RTAX_DST = 0x0 RTAX_GATEWAY = 0x1 RTAX_GENMASK = 0x3 RTAX_IFA = 0x5 RTAX_IFP = 0x4 RTAX_LABEL = 0xa RTAX_MAX = 0xb RTAX_NETMASK = 0x2 RTAX_SRC = 0x8 RTAX_SRCMASK = 0x9 RTA_AUTHOR = 0x40 RTA_BRD = 0x80 RTA_DST = 0x1 RTA_GATEWAY = 0x2 RTA_GENMASK = 0x8 RTA_IFA = 0x20 RTA_IFP = 0x10 RTA_LABEL = 0x400 RTA_NETMASK = 0x4 RTA_SRC = 0x100 RTA_SRCMASK = 0x200 RTF_ANNOUNCE = 0x4000 RTF_BLACKHOLE = 0x1000 RTF_CLONED = 0x10000 RTF_CLONING = 0x100 RTF_DONE = 0x40 RTF_DYNAMIC = 0x10 RTF_FMASK = 0x10f808 RTF_GATEWAY = 0x2 RTF_HOST = 0x4 RTF_LLINFO = 0x400 RTF_MASK = 0x80 RTF_MODIFIED = 0x20 RTF_MPATH = 0x40000 RTF_MPLS = 0x100000 RTF_PERMANENT_ARP = 0x2000 RTF_PROTO1 = 0x8000 RTF_PROTO2 = 0x4000 RTF_PROTO3 = 0x2000 RTF_REJECT = 0x8 RTF_SOURCE = 0x20000 RTF_STATIC = 0x800 RTF_TUNNEL = 0x100000 RTF_UP = 0x1 RTF_USETRAILERS = 0x8000 RTF_XRESOLVE = 0x200 RTM_ADD = 0x1 RTM_CHANGE = 0x3 RTM_DELADDR = 0xd RTM_DELETE = 0x2 RTM_DESYNC = 0x10 RTM_GET = 0x4 RTM_IFANNOUNCE = 0xf RTM_IFINFO = 0xe RTM_LOCK = 0x8 RTM_LOSING = 0x5 RTM_MAXSIZE = 0x800 RTM_MISS = 0x7 RTM_NEWADDR = 0xc RTM_REDIRECT = 0x6 RTM_RESOLVE = 0xb RTM_RTTUNIT = 0xf4240 RTM_VERSION = 0x5 RTV_EXPIRE = 0x4 RTV_HOPCOUNT = 0x2 RTV_MTU = 0x1 RTV_RPIPE = 0x8 RTV_RTT = 0x40 RTV_RTTVAR = 0x80 RTV_SPIPE = 0x10 RTV_SSTHRESH = 0x20 RT_TABLEID_MAX = 0xff RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 RUSAGE_THREAD = 0x1 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x4 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 SIOCADDMULTI = 0x80206931 SIOCAIFADDR = 0x8040691a SIOCAIFGROUP = 0x80246987 SIOCALIFADDR = 0x8218691c SIOCATMARK = 0x40047307 SIOCBRDGADD = 0x8054693c SIOCBRDGADDS = 0x80546941 SIOCBRDGARL = 0x806e694d SIOCBRDGDADDR = 0x81286947 SIOCBRDGDEL = 0x8054693d SIOCBRDGDELS = 0x80546942 SIOCBRDGFLUSH = 0x80546948 SIOCBRDGFRL = 0x806e694e SIOCBRDGGCACHE = 0xc0146941 SIOCBRDGGFD = 0xc0146952 SIOCBRDGGHT = 0xc0146951 SIOCBRDGGIFFLGS = 0xc054693e SIOCBRDGGMA = 0xc0146953 SIOCBRDGGPARAM = 0xc03c6958 SIOCBRDGGPRI = 0xc0146950 SIOCBRDGGRL = 0xc028694f SIOCBRDGGSIFS = 0xc054693c SIOCBRDGGTO = 0xc0146946 SIOCBRDGIFS = 0xc0546942 SIOCBRDGRTS = 0xc0186943 SIOCBRDGSADDR = 0xc1286944 SIOCBRDGSCACHE = 0x80146940 SIOCBRDGSFD = 0x80146952 SIOCBRDGSHT = 0x80146951 SIOCBRDGSIFCOST = 0x80546955 SIOCBRDGSIFFLGS = 0x8054693f SIOCBRDGSIFPRIO = 0x80546954 SIOCBRDGSMA = 0x80146953 SIOCBRDGSPRI = 0x80146950 SIOCBRDGSPROTO = 0x8014695a SIOCBRDGSTO = 0x80146945 SIOCBRDGSTXHC = 0x80146959 SIOCDELMULTI = 0x80206932 SIOCDIFADDR = 0x80206919 SIOCDIFGROUP = 0x80246989 SIOCDIFPHYADDR = 0x80206949 SIOCDLIFADDR = 0x8218691e SIOCGETKALIVE = 0xc01869a4 SIOCGETLABEL = 0x8020699a SIOCGETPFLOW = 0xc02069fe SIOCGETPFSYNC = 0xc02069f8 SIOCGETSGCNT = 0xc0147534 SIOCGETVIFCNT = 0xc0147533 SIOCGETVLAN = 0xc0206990 SIOCGHIWAT = 0x40047301 SIOCGIFADDR = 0xc0206921 SIOCGIFASYNCMAP = 0xc020697c SIOCGIFBRDADDR = 0xc0206923 SIOCGIFCONF = 0xc0086924 SIOCGIFDATA = 0xc020691b SIOCGIFDESCR = 0xc0206981 SIOCGIFDSTADDR = 0xc0206922 SIOCGIFFLAGS = 0xc0206911 SIOCGIFGATTR = 0xc024698b SIOCGIFGENERIC = 0xc020693a SIOCGIFGMEMB = 0xc024698a SIOCGIFGROUP = 0xc0246988 SIOCGIFHARDMTU = 0xc02069a5 SIOCGIFMEDIA = 0xc0286936 SIOCGIFMETRIC = 0xc0206917 SIOCGIFMTU = 0xc020697e SIOCGIFNETMASK = 0xc0206925 SIOCGIFPDSTADDR = 0xc0206948 SIOCGIFPRIORITY = 0xc020699c SIOCGIFPSRCADDR = 0xc0206947 SIOCGIFRDOMAIN = 0xc02069a0 SIOCGIFRTLABEL = 0xc0206983 SIOCGIFTIMESLOT = 0xc0206986 SIOCGIFXFLAGS = 0xc020699e SIOCGLIFADDR = 0xc218691d SIOCGLIFPHYADDR = 0xc218694b SIOCGLIFPHYRTABLE = 0xc02069a2 SIOCGLIFPHYTTL = 0xc02069a9 SIOCGLOWAT = 0x40047303 SIOCGPGRP = 0x40047309 SIOCGSPPPPARAMS = 0xc0206994 SIOCGVH = 0xc02069f6 SIOCGVNETID = 0xc02069a7 SIOCIFCREATE = 0x8020697a SIOCIFDESTROY = 0x80206979 SIOCIFGCLONERS = 0xc00c6978 SIOCSETKALIVE = 0x801869a3 SIOCSETLABEL = 0x80206999 SIOCSETPFLOW = 0x802069fd SIOCSETPFSYNC = 0x802069f7 SIOCSETVLAN = 0x8020698f SIOCSHIWAT = 0x80047300 SIOCSIFADDR = 0x8020690c SIOCSIFASYNCMAP = 0x8020697d SIOCSIFBRDADDR = 0x80206913 SIOCSIFDESCR = 0x80206980 SIOCSIFDSTADDR = 0x8020690e SIOCSIFFLAGS = 0x80206910 SIOCSIFGATTR = 0x8024698c SIOCSIFGENERIC = 0x80206939 SIOCSIFLLADDR = 0x8020691f SIOCSIFMEDIA = 0xc0206935 SIOCSIFMETRIC = 0x80206918 SIOCSIFMTU = 0x8020697f SIOCSIFNETMASK = 0x80206916 SIOCSIFPHYADDR = 0x80406946 SIOCSIFPRIORITY = 0x8020699b SIOCSIFRDOMAIN = 0x8020699f SIOCSIFRTLABEL = 0x80206982 SIOCSIFTIMESLOT = 0x80206985 SIOCSIFXFLAGS = 0x8020699d SIOCSLIFPHYADDR = 0x8218694a SIOCSLIFPHYRTABLE = 0x802069a1 SIOCSLIFPHYTTL = 0x802069a8 SIOCSLOWAT = 0x80047302 SIOCSPGRP = 0x80047308 SIOCSSPPPPARAMS = 0x80206993 SIOCSVH = 0xc02069f5 SIOCSVNETID = 0x802069a6 SOCK_DGRAM = 0x2 SOCK_RAW = 0x3 SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x1 SOL_SOCKET = 0xffff SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x2 SO_BINDANY = 0x1000 SO_BROADCAST = 0x20 SO_DEBUG = 0x1 SO_DONTROUTE = 0x10 SO_ERROR = 0x1007 SO_KEEPALIVE = 0x8 SO_LINGER = 0x80 SO_NETPROC = 0x1020 SO_OOBINLINE = 0x100 SO_PEERCRED = 0x1022 SO_RCVBUF = 0x1002 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x1006 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_RTABLE = 0x1021 SO_SNDBUF = 0x1001 SO_SNDLOWAT = 0x1003 SO_SNDTIMEO = 0x1005 SO_SPLICE = 0x1023 SO_TIMESTAMP = 0x800 SO_TYPE = 0x1008 SO_USELOOPBACK = 0x40 TCIFLUSH = 0x1 TCIOFLUSH = 0x3 TCOFLUSH = 0x2 TCP_MAXBURST = 0x4 TCP_MAXSEG = 0x2 TCP_MAXWIN = 0xffff TCP_MAX_SACK = 0x3 TCP_MAX_WINSHIFT = 0xe TCP_MD5SIG = 0x4 TCP_MSS = 0x200 TCP_NODELAY = 0x1 TCP_NOPUSH = 0x10 TCP_NSTATES = 0xb TCP_SACK_ENABLE = 0x8 TCSAFLUSH = 0x2 TIOCCBRK = 0x2000747a TIOCCDTR = 0x20007478 TIOCCONS = 0x80047462 TIOCDRAIN = 0x2000745e TIOCEXCL = 0x2000740d TIOCEXT = 0x80047460 TIOCFLAG_CLOCAL = 0x2 TIOCFLAG_CRTSCTS = 0x4 TIOCFLAG_MDMBUF = 0x8 TIOCFLAG_PPS = 0x10 TIOCFLAG_SOFTCAR = 0x1 TIOCFLUSH = 0x80047410 TIOCGETA = 0x402c7413 TIOCGETD = 0x4004741a TIOCGFLAGS = 0x4004745d TIOCGPGRP = 0x40047477 TIOCGSID = 0x40047463 TIOCGTSTAMP = 0x400c745b TIOCGWINSZ = 0x40087468 TIOCMBIC = 0x8004746b TIOCMBIS = 0x8004746c TIOCMGET = 0x4004746a TIOCMODG = 0x4004746a TIOCMODS = 0x8004746d TIOCMSET = 0x8004746d TIOCM_CAR = 0x40 TIOCM_CD = 0x40 TIOCM_CTS = 0x20 TIOCM_DSR = 0x100 TIOCM_DTR = 0x2 TIOCM_LE = 0x1 TIOCM_RI = 0x80 TIOCM_RNG = 0x80 TIOCM_RTS = 0x4 TIOCM_SR = 0x10 TIOCM_ST = 0x8 TIOCNOTTY = 0x20007471 TIOCNXCL = 0x2000740e TIOCOUTQ = 0x40047473 TIOCPKT = 0x80047470 TIOCPKT_DATA = 0x0 TIOCPKT_DOSTOP = 0x20 TIOCPKT_FLUSHREAD = 0x1 TIOCPKT_FLUSHWRITE = 0x2 TIOCPKT_IOCTL = 0x40 TIOCPKT_NOSTOP = 0x10 TIOCPKT_START = 0x8 TIOCPKT_STOP = 0x4 TIOCREMOTE = 0x80047469 TIOCSBRK = 0x2000747b TIOCSCTTY = 0x20007461 TIOCSDTR = 0x20007479 TIOCSETA = 0x802c7414 TIOCSETAF = 0x802c7416 TIOCSETAW = 0x802c7415 TIOCSETD = 0x8004741b TIOCSFLAGS = 0x8004745c TIOCSIG = 0x8004745f TIOCSPGRP = 0x80047476 TIOCSTART = 0x2000746e TIOCSTAT = 0x80047465 TIOCSTI = 0x80017472 TIOCSTOP = 0x2000746f TIOCSTSTAMP = 0x8008745a TIOCSWINSZ = 0x80087467 TIOCUCNTL = 0x80047466 TOSTOP = 0x400000 VDISCARD = 0xf VDSUSP = 0xb VEOF = 0x0 VEOL = 0x1 VEOL2 = 0x2 VERASE = 0x3 VINTR = 0x8 VKILL = 0x5 VLNEXT = 0xe VMIN = 0x10 VQUIT = 0x9 VREPRINT = 0x6 VSTART = 0xc VSTATUS = 0x12 VSTOP = 0xd VSUSP = 0xa VTIME = 0x11 VWERASE = 0x4 WALTSIG = 0x4 WCONTINUED = 0x8 WCOREFLAG = 0x80 WNOHANG = 0x1 WSTOPPED = 0x7f WUNTRACED = 0x2 ) // Errors const ( E2BIG = syscall.Errno(0x7) EACCES = syscall.Errno(0xd) EADDRINUSE = syscall.Errno(0x30) EADDRNOTAVAIL = syscall.Errno(0x31) EAFNOSUPPORT = syscall.Errno(0x2f) EAGAIN = syscall.Errno(0x23) EALREADY = syscall.Errno(0x25) EAUTH = syscall.Errno(0x50) EBADF = syscall.Errno(0x9) EBADRPC = syscall.Errno(0x48) EBUSY = syscall.Errno(0x10) ECANCELED = syscall.Errno(0x58) ECHILD = syscall.Errno(0xa) ECONNABORTED = syscall.Errno(0x35) ECONNREFUSED = syscall.Errno(0x3d) ECONNRESET = syscall.Errno(0x36) EDEADLK = syscall.Errno(0xb) EDESTADDRREQ = syscall.Errno(0x27) EDOM = syscall.Errno(0x21) EDQUOT = syscall.Errno(0x45) EEXIST = syscall.Errno(0x11) EFAULT = syscall.Errno(0xe) EFBIG = syscall.Errno(0x1b) EFTYPE = syscall.Errno(0x4f) EHOSTDOWN = syscall.Errno(0x40) EHOSTUNREACH = syscall.Errno(0x41) EIDRM = syscall.Errno(0x59) EILSEQ = syscall.Errno(0x54) EINPROGRESS = syscall.Errno(0x24) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EIPSEC = syscall.Errno(0x52) EISCONN = syscall.Errno(0x38) EISDIR = syscall.Errno(0x15) ELAST = syscall.Errno(0x5b) ELOOP = syscall.Errno(0x3e) EMEDIUMTYPE = syscall.Errno(0x56) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) EMSGSIZE = syscall.Errno(0x28) ENAMETOOLONG = syscall.Errno(0x3f) ENEEDAUTH = syscall.Errno(0x51) ENETDOWN = syscall.Errno(0x32) ENETRESET = syscall.Errno(0x34) ENETUNREACH = syscall.Errno(0x33) ENFILE = syscall.Errno(0x17) ENOATTR = syscall.Errno(0x53) ENOBUFS = syscall.Errno(0x37) ENODEV = syscall.Errno(0x13) ENOENT = syscall.Errno(0x2) ENOEXEC = syscall.Errno(0x8) ENOLCK = syscall.Errno(0x4d) ENOMEDIUM = syscall.Errno(0x55) ENOMEM = syscall.Errno(0xc) ENOMSG = syscall.Errno(0x5a) ENOPROTOOPT = syscall.Errno(0x2a) ENOSPC = syscall.Errno(0x1c) ENOSYS = syscall.Errno(0x4e) ENOTBLK = syscall.Errno(0xf) ENOTCONN = syscall.Errno(0x39) ENOTDIR = syscall.Errno(0x14) ENOTEMPTY = syscall.Errno(0x42) ENOTSOCK = syscall.Errno(0x26) ENOTSUP = syscall.Errno(0x5b) ENOTTY = syscall.Errno(0x19) ENXIO = syscall.Errno(0x6) EOPNOTSUPP = syscall.Errno(0x2d) EOVERFLOW = syscall.Errno(0x57) EPERM = syscall.Errno(0x1) EPFNOSUPPORT = syscall.Errno(0x2e) EPIPE = syscall.Errno(0x20) EPROCLIM = syscall.Errno(0x43) EPROCUNAVAIL = syscall.Errno(0x4c) EPROGMISMATCH = syscall.Errno(0x4b) EPROGUNAVAIL = syscall.Errno(0x4a) EPROTONOSUPPORT = syscall.Errno(0x2b) EPROTOTYPE = syscall.Errno(0x29) ERANGE = syscall.Errno(0x22) EREMOTE = syscall.Errno(0x47) EROFS = syscall.Errno(0x1e) ERPCMISMATCH = syscall.Errno(0x49) ESHUTDOWN = syscall.Errno(0x3a) ESOCKTNOSUPPORT = syscall.Errno(0x2c) ESPIPE = syscall.Errno(0x1d) ESRCH = syscall.Errno(0x3) ESTALE = syscall.Errno(0x46) ETIMEDOUT = syscall.Errno(0x3c) ETOOMANYREFS = syscall.Errno(0x3b) ETXTBSY = syscall.Errno(0x1a) EUSERS = syscall.Errno(0x44) EWOULDBLOCK = syscall.Errno(0x23) EXDEV = syscall.Errno(0x12) ) // Signals const ( SIGABRT = syscall.Signal(0x6) SIGALRM = syscall.Signal(0xe) SIGBUS = syscall.Signal(0xa) SIGCHLD = syscall.Signal(0x14) SIGCONT = syscall.Signal(0x13) SIGEMT = syscall.Signal(0x7) SIGFPE = syscall.Signal(0x8) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) SIGINFO = syscall.Signal(0x1d) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x17) SIGIOT = syscall.Signal(0x6) SIGKILL = syscall.Signal(0x9) SIGPIPE = syscall.Signal(0xd) SIGPROF = syscall.Signal(0x1b) SIGQUIT = syscall.Signal(0x3) SIGSEGV = syscall.Signal(0xb) SIGSTOP = syscall.Signal(0x11) SIGSYS = syscall.Signal(0xc) SIGTERM = syscall.Signal(0xf) SIGTHR = syscall.Signal(0x20) SIGTRAP = syscall.Signal(0x5) SIGTSTP = syscall.Signal(0x12) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) SIGURG = syscall.Signal(0x10) SIGUSR1 = syscall.Signal(0x1e) SIGUSR2 = syscall.Signal(0x1f) SIGVTALRM = syscall.Signal(0x1a) SIGWINCH = syscall.Signal(0x1c) SIGXCPU = syscall.Signal(0x18) SIGXFSZ = syscall.Signal(0x19) ) // Error table var errors = [...]string{ 1: "operation not permitted", 2: "no such file or directory", 3: "no such process", 4: "interrupted system call", 5: "input/output error", 6: "device not configured", 7: "argument list too long", 8: "exec format error", 9: "bad file descriptor", 10: "no child processes", 11: "resource deadlock avoided", 12: "cannot allocate memory", 13: "permission denied", 14: "bad address", 15: "block device required", 16: "device busy", 17: "file exists", 18: "cross-device link", 19: "operation not supported by device", 20: "not a directory", 21: "is a directory", 22: "invalid argument", 23: "too many open files in system", 24: "too many open files", 25: "inappropriate ioctl for device", 26: "text file busy", 27: "file too large", 28: "no space left on device", 29: "illegal seek", 30: "read-only file system", 31: "too many links", 32: "broken pipe", 33: "numerical argument out of domain", 34: "result too large", 35: "resource temporarily unavailable", 36: "operation now in progress", 37: "operation already in progress", 38: "socket operation on non-socket", 39: "destination address required", 40: "message too long", 41: "protocol wrong type for socket", 42: "protocol not available", 43: "protocol not supported", 44: "socket type not supported", 45: "operation not supported", 46: "protocol family not supported", 47: "address family not supported by protocol family", 48: "address already in use", 49: "can't assign requested address", 50: "network is down", 51: "network is unreachable", 52: "network dropped connection on reset", 53: "software caused connection abort", 54: "connection reset by peer", 55: "no buffer space available", 56: "socket is already connected", 57: "socket is not connected", 58: "can't send after socket shutdown", 59: "too many references: can't splice", 60: "connection timed out", 61: "connection refused", 62: "too many levels of symbolic links", 63: "file name too long", 64: "host is down", 65: "no route to host", 66: "directory not empty", 67: "too many processes", 68: "too many users", 69: "disc quota exceeded", 70: "stale NFS file handle", 71: "too many levels of remote in path", 72: "RPC struct is bad", 73: "RPC version wrong", 74: "RPC prog. not avail", 75: "program version wrong", 76: "bad procedure for program", 77: "no locks available", 78: "function not implemented", 79: "inappropriate file type or format", 80: "authentication error", 81: "need authenticator", 82: "IPsec processing failure", 83: "attribute not found", 84: "illegal byte sequence", 85: "no medium found", 86: "wrong medium type", 87: "value too large to be stored in data type", 88: "operation canceled", 89: "identifier removed", 90: "no message of desired type", 91: "not supported", } // Signal table var signals = [...]string{ 1: "hangup", 2: "interrupt", 3: "quit", 4: "illegal instruction", 5: "trace/BPT trap", 6: "abort trap", 7: "EMT trap", 8: "floating point exception", 9: "killed", 10: "bus error", 11: "segmentation fault", 12: "bad system call", 13: "broken pipe", 14: "alarm clock", 15: "terminated", 16: "urgent I/O condition", 17: "stopped (signal)", 18: "stopped", 19: "continued", 20: "child exited", 21: "stopped (tty input)", 22: "stopped (tty output)", 23: "I/O possible", 24: "cputime limit exceeded", 25: "filesize limit exceeded", 26: "virtual timer expired", 27: "profiling timer expired", 28: "window size changes", 29: "information request", 30: "user defined signal 1", 31: "user defined signal 2", 32: "thread AST", } ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go ================================================ // mkerrors.sh -m64 // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT // +build amd64,openbsd // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- -m64 _const.go package unix import "syscall" const ( AF_APPLETALK = 0x10 AF_BLUETOOTH = 0x20 AF_CCITT = 0xa AF_CHAOS = 0x5 AF_CNT = 0x15 AF_COIP = 0x14 AF_DATAKIT = 0x9 AF_DECnet = 0xc AF_DLI = 0xd AF_E164 = 0x1a AF_ECMA = 0x8 AF_ENCAP = 0x1c AF_HYLINK = 0xf AF_IMPLINK = 0x3 AF_INET = 0x2 AF_INET6 = 0x18 AF_IPX = 0x17 AF_ISDN = 0x1a AF_ISO = 0x7 AF_KEY = 0x1e AF_LAT = 0xe AF_LINK = 0x12 AF_LOCAL = 0x1 AF_MAX = 0x24 AF_MPLS = 0x21 AF_NATM = 0x1b AF_NS = 0x6 AF_OSI = 0x7 AF_PUP = 0x4 AF_ROUTE = 0x11 AF_SIP = 0x1d AF_SNA = 0xb AF_UNIX = 0x1 AF_UNSPEC = 0x0 ARPHRD_ETHER = 0x1 ARPHRD_FRELAY = 0xf ARPHRD_IEEE1394 = 0x18 ARPHRD_IEEE802 = 0x6 B0 = 0x0 B110 = 0x6e B115200 = 0x1c200 B1200 = 0x4b0 B134 = 0x86 B14400 = 0x3840 B150 = 0x96 B1800 = 0x708 B19200 = 0x4b00 B200 = 0xc8 B230400 = 0x38400 B2400 = 0x960 B28800 = 0x7080 B300 = 0x12c B38400 = 0x9600 B4800 = 0x12c0 B50 = 0x32 B57600 = 0xe100 B600 = 0x258 B7200 = 0x1c20 B75 = 0x4b B76800 = 0x12c00 B9600 = 0x2580 BIOCFLUSH = 0x20004268 BIOCGBLEN = 0x40044266 BIOCGDIRFILT = 0x4004427c BIOCGDLT = 0x4004426a BIOCGDLTLIST = 0xc010427b BIOCGETIF = 0x4020426b BIOCGFILDROP = 0x40044278 BIOCGHDRCMPLT = 0x40044274 BIOCGRSIG = 0x40044273 BIOCGRTIMEOUT = 0x4010426e BIOCGSTATS = 0x4008426f BIOCIMMEDIATE = 0x80044270 BIOCLOCK = 0x20004276 BIOCPROMISC = 0x20004269 BIOCSBLEN = 0xc0044266 BIOCSDIRFILT = 0x8004427d BIOCSDLT = 0x8004427a BIOCSETF = 0x80104267 BIOCSETIF = 0x8020426c BIOCSETWF = 0x80104277 BIOCSFILDROP = 0x80044279 BIOCSHDRCMPLT = 0x80044275 BIOCSRSIG = 0x80044272 BIOCSRTIMEOUT = 0x8010426d BIOCVERSION = 0x40044271 BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALIGNMENT = 0x4 BPF_ALU = 0x4 BPF_AND = 0x50 BPF_B = 0x10 BPF_DIRECTION_IN = 0x1 BPF_DIRECTION_OUT = 0x2 BPF_DIV = 0x30 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 BPF_JA = 0x0 BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 BPF_JMP = 0x5 BPF_JSET = 0x40 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 BPF_LEN = 0x80 BPF_LSH = 0x60 BPF_MAJOR_VERSION = 0x1 BPF_MAXBUFSIZE = 0x200000 BPF_MAXINSNS = 0x200 BPF_MEM = 0x60 BPF_MEMWORDS = 0x10 BPF_MINBUFSIZE = 0x20 BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_OR = 0x40 BPF_RELEASE = 0x30bb6 BPF_RET = 0x6 BPF_RSH = 0x70 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 BPF_TAX = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 BRKINT = 0x2 CFLUSH = 0xf CLOCAL = 0x8000 CREAD = 0x800 CS5 = 0x0 CS6 = 0x100 CS7 = 0x200 CS8 = 0x300 CSIZE = 0x300 CSTART = 0x11 CSTATUS = 0xff CSTOP = 0x13 CSTOPB = 0x400 CSUSP = 0x1a CTL_MAXNAME = 0xc CTL_NET = 0x4 DIOCOSFPFLUSH = 0x2000444e DLT_ARCNET = 0x7 DLT_ATM_RFC1483 = 0xb DLT_AX25 = 0x3 DLT_CHAOS = 0x5 DLT_C_HDLC = 0x68 DLT_EN10MB = 0x1 DLT_EN3MB = 0x2 DLT_ENC = 0xd DLT_FDDI = 0xa DLT_IEEE802 = 0x6 DLT_IEEE802_11 = 0x69 DLT_IEEE802_11_RADIO = 0x7f DLT_LOOP = 0xc DLT_MPLS = 0xdb DLT_NULL = 0x0 DLT_PFLOG = 0x75 DLT_PFSYNC = 0x12 DLT_PPP = 0x9 DLT_PPP_BSDOS = 0x10 DLT_PPP_ETHER = 0x33 DLT_PPP_SERIAL = 0x32 DLT_PRONET = 0x4 DLT_RAW = 0xe DLT_SLIP = 0x8 DLT_SLIP_BSDOS = 0xf DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 DT_FIFO = 0x1 DT_LNK = 0xa DT_REG = 0x8 DT_SOCK = 0xc DT_UNKNOWN = 0x0 ECHO = 0x8 ECHOCTL = 0x40 ECHOE = 0x2 ECHOK = 0x4 ECHOKE = 0x1 ECHONL = 0x10 ECHOPRT = 0x20 EMT_TAGOVF = 0x1 EMUL_ENABLED = 0x1 EMUL_NATIVE = 0x2 ENDRUNDISC = 0x9 ETHERMIN = 0x2e ETHERMTU = 0x5dc ETHERTYPE_8023 = 0x4 ETHERTYPE_AARP = 0x80f3 ETHERTYPE_ACCTON = 0x8390 ETHERTYPE_AEONIC = 0x8036 ETHERTYPE_ALPHA = 0x814a ETHERTYPE_AMBER = 0x6008 ETHERTYPE_AMOEBA = 0x8145 ETHERTYPE_AOE = 0x88a2 ETHERTYPE_APOLLO = 0x80f7 ETHERTYPE_APOLLODOMAIN = 0x8019 ETHERTYPE_APPLETALK = 0x809b ETHERTYPE_APPLITEK = 0x80c7 ETHERTYPE_ARGONAUT = 0x803a ETHERTYPE_ARP = 0x806 ETHERTYPE_AT = 0x809b ETHERTYPE_ATALK = 0x809b ETHERTYPE_ATOMIC = 0x86df ETHERTYPE_ATT = 0x8069 ETHERTYPE_ATTSTANFORD = 0x8008 ETHERTYPE_AUTOPHON = 0x806a ETHERTYPE_AXIS = 0x8856 ETHERTYPE_BCLOOP = 0x9003 ETHERTYPE_BOFL = 0x8102 ETHERTYPE_CABLETRON = 0x7034 ETHERTYPE_CHAOS = 0x804 ETHERTYPE_COMDESIGN = 0x806c ETHERTYPE_COMPUGRAPHIC = 0x806d ETHERTYPE_COUNTERPOINT = 0x8062 ETHERTYPE_CRONUS = 0x8004 ETHERTYPE_CRONUSVLN = 0x8003 ETHERTYPE_DCA = 0x1234 ETHERTYPE_DDE = 0x807b ETHERTYPE_DEBNI = 0xaaaa ETHERTYPE_DECAM = 0x8048 ETHERTYPE_DECCUST = 0x6006 ETHERTYPE_DECDIAG = 0x6005 ETHERTYPE_DECDNS = 0x803c ETHERTYPE_DECDTS = 0x803e ETHERTYPE_DECEXPER = 0x6000 ETHERTYPE_DECLAST = 0x8041 ETHERTYPE_DECLTM = 0x803f ETHERTYPE_DECMUMPS = 0x6009 ETHERTYPE_DECNETBIOS = 0x8040 ETHERTYPE_DELTACON = 0x86de ETHERTYPE_DIDDLE = 0x4321 ETHERTYPE_DLOG1 = 0x660 ETHERTYPE_DLOG2 = 0x661 ETHERTYPE_DN = 0x6003 ETHERTYPE_DOGFIGHT = 0x1989 ETHERTYPE_DSMD = 0x8039 ETHERTYPE_ECMA = 0x803 ETHERTYPE_ENCRYPT = 0x803d ETHERTYPE_ES = 0x805d ETHERTYPE_EXCELAN = 0x8010 ETHERTYPE_EXPERDATA = 0x8049 ETHERTYPE_FLIP = 0x8146 ETHERTYPE_FLOWCONTROL = 0x8808 ETHERTYPE_FRARP = 0x808 ETHERTYPE_GENDYN = 0x8068 ETHERTYPE_HAYES = 0x8130 ETHERTYPE_HIPPI_FP = 0x8180 ETHERTYPE_HITACHI = 0x8820 ETHERTYPE_HP = 0x8005 ETHERTYPE_IEEEPUP = 0xa00 ETHERTYPE_IEEEPUPAT = 0xa01 ETHERTYPE_IMLBL = 0x4c42 ETHERTYPE_IMLBLDIAG = 0x424c ETHERTYPE_IP = 0x800 ETHERTYPE_IPAS = 0x876c ETHERTYPE_IPV6 = 0x86dd ETHERTYPE_IPX = 0x8137 ETHERTYPE_IPXNEW = 0x8037 ETHERTYPE_KALPANA = 0x8582 ETHERTYPE_LANBRIDGE = 0x8038 ETHERTYPE_LANPROBE = 0x8888 ETHERTYPE_LAT = 0x6004 ETHERTYPE_LBACK = 0x9000 ETHERTYPE_LITTLE = 0x8060 ETHERTYPE_LLDP = 0x88cc ETHERTYPE_LOGICRAFT = 0x8148 ETHERTYPE_LOOPBACK = 0x9000 ETHERTYPE_MATRA = 0x807a ETHERTYPE_MAX = 0xffff ETHERTYPE_MERIT = 0x807c ETHERTYPE_MICP = 0x873a ETHERTYPE_MOPDL = 0x6001 ETHERTYPE_MOPRC = 0x6002 ETHERTYPE_MOTOROLA = 0x818d ETHERTYPE_MPLS = 0x8847 ETHERTYPE_MPLS_MCAST = 0x8848 ETHERTYPE_MUMPS = 0x813f ETHERTYPE_NBPCC = 0x3c04 ETHERTYPE_NBPCLAIM = 0x3c09 ETHERTYPE_NBPCLREQ = 0x3c05 ETHERTYPE_NBPCLRSP = 0x3c06 ETHERTYPE_NBPCREQ = 0x3c02 ETHERTYPE_NBPCRSP = 0x3c03 ETHERTYPE_NBPDG = 0x3c07 ETHERTYPE_NBPDGB = 0x3c08 ETHERTYPE_NBPDLTE = 0x3c0a ETHERTYPE_NBPRAR = 0x3c0c ETHERTYPE_NBPRAS = 0x3c0b ETHERTYPE_NBPRST = 0x3c0d ETHERTYPE_NBPSCD = 0x3c01 ETHERTYPE_NBPVCD = 0x3c00 ETHERTYPE_NBS = 0x802 ETHERTYPE_NCD = 0x8149 ETHERTYPE_NESTAR = 0x8006 ETHERTYPE_NETBEUI = 0x8191 ETHERTYPE_NOVELL = 0x8138 ETHERTYPE_NS = 0x600 ETHERTYPE_NSAT = 0x601 ETHERTYPE_NSCOMPAT = 0x807 ETHERTYPE_NTRAILER = 0x10 ETHERTYPE_OS9 = 0x7007 ETHERTYPE_OS9NET = 0x7009 ETHERTYPE_PACER = 0x80c6 ETHERTYPE_PAE = 0x888e ETHERTYPE_PCS = 0x4242 ETHERTYPE_PLANNING = 0x8044 ETHERTYPE_PPP = 0x880b ETHERTYPE_PPPOE = 0x8864 ETHERTYPE_PPPOEDISC = 0x8863 ETHERTYPE_PRIMENTS = 0x7031 ETHERTYPE_PUP = 0x200 ETHERTYPE_PUPAT = 0x200 ETHERTYPE_QINQ = 0x88a8 ETHERTYPE_RACAL = 0x7030 ETHERTYPE_RATIONAL = 0x8150 ETHERTYPE_RAWFR = 0x6559 ETHERTYPE_RCL = 0x1995 ETHERTYPE_RDP = 0x8739 ETHERTYPE_RETIX = 0x80f2 ETHERTYPE_REVARP = 0x8035 ETHERTYPE_SCA = 0x6007 ETHERTYPE_SECTRA = 0x86db ETHERTYPE_SECUREDATA = 0x876d ETHERTYPE_SGITW = 0x817e ETHERTYPE_SG_BOUNCE = 0x8016 ETHERTYPE_SG_DIAG = 0x8013 ETHERTYPE_SG_NETGAMES = 0x8014 ETHERTYPE_SG_RESV = 0x8015 ETHERTYPE_SIMNET = 0x5208 ETHERTYPE_SLOW = 0x8809 ETHERTYPE_SNA = 0x80d5 ETHERTYPE_SNMP = 0x814c ETHERTYPE_SONIX = 0xfaf5 ETHERTYPE_SPIDER = 0x809f ETHERTYPE_SPRITE = 0x500 ETHERTYPE_STP = 0x8181 ETHERTYPE_TALARIS = 0x812b ETHERTYPE_TALARISMC = 0x852b ETHERTYPE_TCPCOMP = 0x876b ETHERTYPE_TCPSM = 0x9002 ETHERTYPE_TEC = 0x814f ETHERTYPE_TIGAN = 0x802f ETHERTYPE_TRAIL = 0x1000 ETHERTYPE_TRANSETHER = 0x6558 ETHERTYPE_TYMSHARE = 0x802e ETHERTYPE_UBBST = 0x7005 ETHERTYPE_UBDEBUG = 0x900 ETHERTYPE_UBDIAGLOOP = 0x7002 ETHERTYPE_UBDL = 0x7000 ETHERTYPE_UBNIU = 0x7001 ETHERTYPE_UBNMC = 0x7003 ETHERTYPE_VALID = 0x1600 ETHERTYPE_VARIAN = 0x80dd ETHERTYPE_VAXELN = 0x803b ETHERTYPE_VEECO = 0x8067 ETHERTYPE_VEXP = 0x805b ETHERTYPE_VGLAB = 0x8131 ETHERTYPE_VINES = 0xbad ETHERTYPE_VINESECHO = 0xbaf ETHERTYPE_VINESLOOP = 0xbae ETHERTYPE_VITAL = 0xff00 ETHERTYPE_VLAN = 0x8100 ETHERTYPE_VLTLMAN = 0x8080 ETHERTYPE_VPROD = 0x805c ETHERTYPE_VURESERVED = 0x8147 ETHERTYPE_WATERLOO = 0x8130 ETHERTYPE_WELLFLEET = 0x8103 ETHERTYPE_X25 = 0x805 ETHERTYPE_X75 = 0x801 ETHERTYPE_XNSSM = 0x9001 ETHERTYPE_XTP = 0x817d ETHER_ADDR_LEN = 0x6 ETHER_ALIGN = 0x2 ETHER_CRC_LEN = 0x4 ETHER_CRC_POLY_BE = 0x4c11db6 ETHER_CRC_POLY_LE = 0xedb88320 ETHER_HDR_LEN = 0xe ETHER_MAX_DIX_LEN = 0x600 ETHER_MAX_LEN = 0x5ee ETHER_MIN_LEN = 0x40 ETHER_TYPE_LEN = 0x2 ETHER_VLAN_ENCAP_LEN = 0x4 EVFILT_AIO = -0x3 EVFILT_PROC = -0x5 EVFILT_READ = -0x1 EVFILT_SIGNAL = -0x6 EVFILT_SYSCOUNT = 0x7 EVFILT_TIMER = -0x7 EVFILT_VNODE = -0x4 EVFILT_WRITE = -0x2 EV_ADD = 0x1 EV_CLEAR = 0x20 EV_DELETE = 0x2 EV_DISABLE = 0x8 EV_ENABLE = 0x4 EV_EOF = 0x8000 EV_ERROR = 0x4000 EV_FLAG1 = 0x2000 EV_ONESHOT = 0x10 EV_SYSFLAGS = 0xf000 EXTA = 0x4b00 EXTB = 0x9600 EXTPROC = 0x800 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FLUSHO = 0x800000 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0xa F_GETFD = 0x1 F_GETFL = 0x3 F_GETLK = 0x7 F_GETOWN = 0x5 F_OK = 0x0 F_RDLCK = 0x1 F_SETFD = 0x2 F_SETFL = 0x4 F_SETLK = 0x8 F_SETLKW = 0x9 F_SETOWN = 0x6 F_UNLCK = 0x2 F_WRLCK = 0x3 HUPCL = 0x4000 ICANON = 0x100 ICMP6_FILTER = 0x12 ICRNL = 0x100 IEXTEN = 0x400 IFAN_ARRIVAL = 0x0 IFAN_DEPARTURE = 0x1 IFA_ROUTE = 0x1 IFF_ALLMULTI = 0x200 IFF_BROADCAST = 0x2 IFF_CANTCHANGE = 0x8e52 IFF_DEBUG = 0x4 IFF_LINK0 = 0x1000 IFF_LINK1 = 0x2000 IFF_LINK2 = 0x4000 IFF_LOOPBACK = 0x8 IFF_MULTICAST = 0x8000 IFF_NOARP = 0x80 IFF_NOTRAILERS = 0x20 IFF_OACTIVE = 0x400 IFF_POINTOPOINT = 0x10 IFF_PROMISC = 0x100 IFF_RUNNING = 0x40 IFF_SIMPLEX = 0x800 IFF_UP = 0x1 IFNAMSIZ = 0x10 IFT_1822 = 0x2 IFT_A12MPPSWITCH = 0x82 IFT_AAL2 = 0xbb IFT_AAL5 = 0x31 IFT_ADSL = 0x5e IFT_AFLANE8023 = 0x3b IFT_AFLANE8025 = 0x3c IFT_ARAP = 0x58 IFT_ARCNET = 0x23 IFT_ARCNETPLUS = 0x24 IFT_ASYNC = 0x54 IFT_ATM = 0x25 IFT_ATMDXI = 0x69 IFT_ATMFUNI = 0x6a IFT_ATMIMA = 0x6b IFT_ATMLOGICAL = 0x50 IFT_ATMRADIO = 0xbd IFT_ATMSUBINTERFACE = 0x86 IFT_ATMVCIENDPT = 0xc2 IFT_ATMVIRTUAL = 0x95 IFT_BGPPOLICYACCOUNTING = 0xa2 IFT_BLUETOOTH = 0xf8 IFT_BRIDGE = 0xd1 IFT_BSC = 0x53 IFT_CARP = 0xf7 IFT_CCTEMUL = 0x3d IFT_CEPT = 0x13 IFT_CES = 0x85 IFT_CHANNEL = 0x46 IFT_CNR = 0x55 IFT_COFFEE = 0x84 IFT_COMPOSITELINK = 0x9b IFT_DCN = 0x8d IFT_DIGITALPOWERLINE = 0x8a IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba IFT_DLSW = 0x4a IFT_DOCSCABLEDOWNSTREAM = 0x80 IFT_DOCSCABLEMACLAYER = 0x7f IFT_DOCSCABLEUPSTREAM = 0x81 IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd IFT_DS0 = 0x51 IFT_DS0BUNDLE = 0x52 IFT_DS1FDL = 0xaa IFT_DS3 = 0x1e IFT_DTM = 0x8c IFT_DUMMY = 0xf1 IFT_DVBASILN = 0xac IFT_DVBASIOUT = 0xad IFT_DVBRCCDOWNSTREAM = 0x93 IFT_DVBRCCMACLAYER = 0x92 IFT_DVBRCCUPSTREAM = 0x94 IFT_ECONET = 0xce IFT_ENC = 0xf4 IFT_EON = 0x19 IFT_EPLRS = 0x57 IFT_ESCON = 0x49 IFT_ETHER = 0x6 IFT_FAITH = 0xf3 IFT_FAST = 0x7d IFT_FASTETHER = 0x3e IFT_FASTETHERFX = 0x45 IFT_FDDI = 0xf IFT_FIBRECHANNEL = 0x38 IFT_FRAMERELAYINTERCONNECT = 0x3a IFT_FRAMERELAYMPI = 0x5c IFT_FRDLCIENDPT = 0xc1 IFT_FRELAY = 0x20 IFT_FRELAYDCE = 0x2c IFT_FRF16MFRBUNDLE = 0xa3 IFT_FRFORWARD = 0x9e IFT_G703AT2MB = 0x43 IFT_G703AT64K = 0x42 IFT_GIF = 0xf0 IFT_GIGABITETHERNET = 0x75 IFT_GR303IDT = 0xb2 IFT_GR303RDT = 0xb1 IFT_H323GATEKEEPER = 0xa4 IFT_H323PROXY = 0xa5 IFT_HDH1822 = 0x3 IFT_HDLC = 0x76 IFT_HDSL2 = 0xa8 IFT_HIPERLAN2 = 0xb7 IFT_HIPPI = 0x2f IFT_HIPPIINTERFACE = 0x39 IFT_HOSTPAD = 0x5a IFT_HSSI = 0x2e IFT_HY = 0xe IFT_IBM370PARCHAN = 0x48 IFT_IDSL = 0x9a IFT_IEEE1394 = 0x90 IFT_IEEE80211 = 0x47 IFT_IEEE80212 = 0x37 IFT_IEEE8023ADLAG = 0xa1 IFT_IFGSN = 0x91 IFT_IMT = 0xbe IFT_INFINIBAND = 0xc7 IFT_INTERLEAVE = 0x7c IFT_IP = 0x7e IFT_IPFORWARD = 0x8e IFT_IPOVERATM = 0x72 IFT_IPOVERCDLC = 0x6d IFT_IPOVERCLAW = 0x6e IFT_IPSWITCH = 0x4e IFT_ISDN = 0x3f IFT_ISDNBASIC = 0x14 IFT_ISDNPRIMARY = 0x15 IFT_ISDNS = 0x4b IFT_ISDNU = 0x4c IFT_ISO88022LLC = 0x29 IFT_ISO88023 = 0x7 IFT_ISO88024 = 0x8 IFT_ISO88025 = 0x9 IFT_ISO88025CRFPINT = 0x62 IFT_ISO88025DTR = 0x56 IFT_ISO88025FIBER = 0x73 IFT_ISO88026 = 0xa IFT_ISUP = 0xb3 IFT_L2VLAN = 0x87 IFT_L3IPVLAN = 0x88 IFT_L3IPXVLAN = 0x89 IFT_LAPB = 0x10 IFT_LAPD = 0x4d IFT_LAPF = 0x77 IFT_LINEGROUP = 0xd2 IFT_LOCALTALK = 0x2a IFT_LOOP = 0x18 IFT_MEDIAMAILOVERIP = 0x8b IFT_MFSIGLINK = 0xa7 IFT_MIOX25 = 0x26 IFT_MODEM = 0x30 IFT_MPC = 0x71 IFT_MPLS = 0xa6 IFT_MPLSTUNNEL = 0x96 IFT_MSDSL = 0x8f IFT_MVL = 0xbf IFT_MYRINET = 0x63 IFT_NFAS = 0xaf IFT_NSIP = 0x1b IFT_OPTICALCHANNEL = 0xc3 IFT_OPTICALTRANSPORT = 0xc4 IFT_OTHER = 0x1 IFT_P10 = 0xc IFT_P80 = 0xd IFT_PARA = 0x22 IFT_PFLOG = 0xf5 IFT_PFLOW = 0xf9 IFT_PFSYNC = 0xf6 IFT_PLC = 0xae IFT_PON155 = 0xcf IFT_PON622 = 0xd0 IFT_POS = 0xab IFT_PPP = 0x17 IFT_PPPMULTILINKBUNDLE = 0x6c IFT_PROPATM = 0xc5 IFT_PROPBWAP2MP = 0xb8 IFT_PROPCNLS = 0x59 IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 IFT_PROPMUX = 0x36 IFT_PROPVIRTUAL = 0x35 IFT_PROPWIRELESSP2P = 0x9d IFT_PTPSERIAL = 0x16 IFT_PVC = 0xf2 IFT_Q2931 = 0xc9 IFT_QLLC = 0x44 IFT_RADIOMAC = 0xbc IFT_RADSL = 0x5f IFT_REACHDSL = 0xc0 IFT_RFC1483 = 0x9f IFT_RS232 = 0x21 IFT_RSRB = 0x4f IFT_SDLC = 0x11 IFT_SDSL = 0x60 IFT_SHDSL = 0xa9 IFT_SIP = 0x1f IFT_SIPSIG = 0xcc IFT_SIPTG = 0xcb IFT_SLIP = 0x1c IFT_SMDSDXI = 0x2b IFT_SMDSICIP = 0x34 IFT_SONET = 0x27 IFT_SONETOVERHEADCHANNEL = 0xb9 IFT_SONETPATH = 0x32 IFT_SONETVT = 0x33 IFT_SRP = 0x97 IFT_SS7SIGLINK = 0x9c IFT_STACKTOSTACK = 0x6f IFT_STARLAN = 0xb IFT_T1 = 0x12 IFT_TDLC = 0x74 IFT_TELINK = 0xc8 IFT_TERMPAD = 0x5b IFT_TR008 = 0xb0 IFT_TRANSPHDLC = 0x7b IFT_TUNNEL = 0x83 IFT_ULTRA = 0x1d IFT_USB = 0xa0 IFT_V11 = 0x40 IFT_V35 = 0x2d IFT_V36 = 0x41 IFT_V37 = 0x78 IFT_VDSL = 0x61 IFT_VIRTUALIPADDRESS = 0x70 IFT_VIRTUALTG = 0xca IFT_VOICEDID = 0xd5 IFT_VOICEEM = 0x64 IFT_VOICEEMFGD = 0xd3 IFT_VOICEENCAP = 0x67 IFT_VOICEFGDEANA = 0xd4 IFT_VOICEFXO = 0x65 IFT_VOICEFXS = 0x66 IFT_VOICEOVERATM = 0x98 IFT_VOICEOVERCABLE = 0xc6 IFT_VOICEOVERFRAMERELAY = 0x99 IFT_VOICEOVERIP = 0x68 IFT_X213 = 0x5d IFT_X25 = 0x5 IFT_X25DDN = 0x4 IFT_X25HUNTGROUP = 0x7a IFT_X25MLP = 0x79 IFT_X25PLE = 0x28 IFT_XETHER = 0x1a IGNBRK = 0x1 IGNCR = 0x80 IGNPAR = 0x4 IMAXBEL = 0x2000 INLCR = 0x40 INPCK = 0x10 IN_CLASSA_HOST = 0xffffff IN_CLASSA_MAX = 0x80 IN_CLASSA_NET = 0xff000000 IN_CLASSA_NSHIFT = 0x18 IN_CLASSB_HOST = 0xffff IN_CLASSB_MAX = 0x10000 IN_CLASSB_NET = 0xffff0000 IN_CLASSB_NSHIFT = 0x10 IN_CLASSC_HOST = 0xff IN_CLASSC_NET = 0xffffff00 IN_CLASSC_NSHIFT = 0x8 IN_CLASSD_HOST = 0xfffffff IN_CLASSD_NET = 0xf0000000 IN_CLASSD_NSHIFT = 0x1c IN_LOOPBACKNET = 0x7f IN_RFC3021_HOST = 0x1 IN_RFC3021_NET = 0xfffffffe IN_RFC3021_NSHIFT = 0x1f IPPROTO_AH = 0x33 IPPROTO_CARP = 0x70 IPPROTO_DIVERT = 0x102 IPPROTO_DIVERT_INIT = 0x2 IPPROTO_DIVERT_RESP = 0x1 IPPROTO_DONE = 0x101 IPPROTO_DSTOPTS = 0x3c IPPROTO_EGP = 0x8 IPPROTO_ENCAP = 0x62 IPPROTO_EON = 0x50 IPPROTO_ESP = 0x32 IPPROTO_ETHERIP = 0x61 IPPROTO_FRAGMENT = 0x2c IPPROTO_GGP = 0x3 IPPROTO_GRE = 0x2f IPPROTO_HOPOPTS = 0x0 IPPROTO_ICMP = 0x1 IPPROTO_ICMPV6 = 0x3a IPPROTO_IDP = 0x16 IPPROTO_IGMP = 0x2 IPPROTO_IP = 0x0 IPPROTO_IPCOMP = 0x6c IPPROTO_IPIP = 0x4 IPPROTO_IPV4 = 0x4 IPPROTO_IPV6 = 0x29 IPPROTO_MAX = 0x100 IPPROTO_MAXID = 0x103 IPPROTO_MOBILE = 0x37 IPPROTO_MPLS = 0x89 IPPROTO_NONE = 0x3b IPPROTO_PFSYNC = 0xf0 IPPROTO_PIM = 0x67 IPPROTO_PUP = 0xc IPPROTO_RAW = 0xff IPPROTO_ROUTING = 0x2b IPPROTO_RSVP = 0x2e IPPROTO_TCP = 0x6 IPPROTO_TP = 0x1d IPPROTO_UDP = 0x11 IPV6_AUTH_LEVEL = 0x35 IPV6_AUTOFLOWLABEL = 0x3b IPV6_CHECKSUM = 0x1a IPV6_DEFAULT_MULTICAST_HOPS = 0x1 IPV6_DEFAULT_MULTICAST_LOOP = 0x1 IPV6_DEFHLIM = 0x40 IPV6_DONTFRAG = 0x3e IPV6_DSTOPTS = 0x32 IPV6_ESP_NETWORK_LEVEL = 0x37 IPV6_ESP_TRANS_LEVEL = 0x36 IPV6_FAITH = 0x1d IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 IPV6_FRAGTTL = 0x78 IPV6_HLIMDEC = 0x1 IPV6_HOPLIMIT = 0x2f IPV6_HOPOPTS = 0x31 IPV6_IPCOMP_LEVEL = 0x3c IPV6_JOIN_GROUP = 0xc IPV6_LEAVE_GROUP = 0xd IPV6_MAXHLIM = 0xff IPV6_MAXPACKET = 0xffff IPV6_MMTU = 0x500 IPV6_MULTICAST_HOPS = 0xa IPV6_MULTICAST_IF = 0x9 IPV6_MULTICAST_LOOP = 0xb IPV6_NEXTHOP = 0x30 IPV6_OPTIONS = 0x1 IPV6_PATHMTU = 0x2c IPV6_PIPEX = 0x3f IPV6_PKTINFO = 0x2e IPV6_PORTRANGE = 0xe IPV6_PORTRANGE_DEFAULT = 0x0 IPV6_PORTRANGE_HIGH = 0x1 IPV6_PORTRANGE_LOW = 0x2 IPV6_RECVDSTOPTS = 0x28 IPV6_RECVDSTPORT = 0x40 IPV6_RECVHOPLIMIT = 0x25 IPV6_RECVHOPOPTS = 0x27 IPV6_RECVPATHMTU = 0x2b IPV6_RECVPKTINFO = 0x24 IPV6_RECVRTHDR = 0x26 IPV6_RECVTCLASS = 0x39 IPV6_RTABLE = 0x1021 IPV6_RTHDR = 0x33 IPV6_RTHDRDSTOPTS = 0x23 IPV6_RTHDR_LOOSE = 0x0 IPV6_RTHDR_STRICT = 0x1 IPV6_RTHDR_TYPE_0 = 0x0 IPV6_SOCKOPT_RESERVED1 = 0x3 IPV6_TCLASS = 0x3d IPV6_UNICAST_HOPS = 0x4 IPV6_USE_MIN_MTU = 0x2a IPV6_V6ONLY = 0x1b IPV6_VERSION = 0x60 IPV6_VERSION_MASK = 0xf0 IP_ADD_MEMBERSHIP = 0xc IP_AUTH_LEVEL = 0x14 IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 IP_DIVERTFL = 0x1022 IP_DROP_MEMBERSHIP = 0xd IP_ESP_NETWORK_LEVEL = 0x16 IP_ESP_TRANS_LEVEL = 0x15 IP_HDRINCL = 0x2 IP_IPCOMP_LEVEL = 0x1d IP_IPSECFLOWINFO = 0x24 IP_IPSEC_LOCAL_AUTH = 0x1b IP_IPSEC_LOCAL_CRED = 0x19 IP_IPSEC_LOCAL_ID = 0x17 IP_IPSEC_REMOTE_AUTH = 0x1c IP_IPSEC_REMOTE_CRED = 0x1a IP_IPSEC_REMOTE_ID = 0x18 IP_MAXPACKET = 0xffff IP_MAX_MEMBERSHIPS = 0xfff IP_MF = 0x2000 IP_MINTTL = 0x20 IP_MIN_MEMBERSHIPS = 0xf IP_MSS = 0x240 IP_MULTICAST_IF = 0x9 IP_MULTICAST_LOOP = 0xb IP_MULTICAST_TTL = 0xa IP_OFFMASK = 0x1fff IP_OPTIONS = 0x1 IP_PIPEX = 0x22 IP_PORTRANGE = 0x13 IP_PORTRANGE_DEFAULT = 0x0 IP_PORTRANGE_HIGH = 0x1 IP_PORTRANGE_LOW = 0x2 IP_RECVDSTADDR = 0x7 IP_RECVDSTPORT = 0x21 IP_RECVIF = 0x1e IP_RECVOPTS = 0x5 IP_RECVRETOPTS = 0x6 IP_RECVRTABLE = 0x23 IP_RECVTTL = 0x1f IP_RETOPTS = 0x8 IP_RF = 0x8000 IP_RTABLE = 0x1021 IP_TOS = 0x3 IP_TTL = 0x4 ISIG = 0x80 ISTRIP = 0x20 IXANY = 0x800 IXOFF = 0x400 IXON = 0x200 LCNT_OVERLOAD_FLUSH = 0x6 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 MADV_DONTNEED = 0x4 MADV_FREE = 0x6 MADV_NORMAL = 0x0 MADV_RANDOM = 0x1 MADV_SEQUENTIAL = 0x2 MADV_SPACEAVAIL = 0x5 MADV_WILLNEED = 0x3 MAP_ANON = 0x1000 MAP_COPY = 0x4 MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_FLAGMASK = 0x1ff7 MAP_HASSEMAPHORE = 0x200 MAP_INHERIT = 0x80 MAP_INHERIT_COPY = 0x1 MAP_INHERIT_DONATE_COPY = 0x3 MAP_INHERIT_NONE = 0x2 MAP_INHERIT_SHARE = 0x0 MAP_NOEXTEND = 0x100 MAP_NORESERVE = 0x40 MAP_PRIVATE = 0x2 MAP_RENAME = 0x20 MAP_SHARED = 0x1 MAP_TRYFIXED = 0x400 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MSG_BCAST = 0x100 MSG_CTRUNC = 0x20 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x80 MSG_EOR = 0x8 MSG_MCAST = 0x200 MSG_NOSIGNAL = 0x400 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_TRUNC = 0x10 MSG_WAITALL = 0x40 MS_ASYNC = 0x1 MS_INVALIDATE = 0x4 MS_SYNC = 0x2 NAME_MAX = 0xff NET_RT_DUMP = 0x1 NET_RT_FLAGS = 0x2 NET_RT_IFLIST = 0x3 NET_RT_MAXID = 0x6 NET_RT_STATS = 0x4 NET_RT_TABLE = 0x5 NOFLSH = 0x80000000 NOTE_ATTRIB = 0x8 NOTE_CHILD = 0x4 NOTE_DELETE = 0x1 NOTE_EOF = 0x2 NOTE_EXEC = 0x20000000 NOTE_EXIT = 0x80000000 NOTE_EXTEND = 0x4 NOTE_FORK = 0x40000000 NOTE_LINK = 0x10 NOTE_LOWAT = 0x1 NOTE_PCTRLMASK = 0xf0000000 NOTE_PDATAMASK = 0xfffff NOTE_RENAME = 0x20 NOTE_REVOKE = 0x40 NOTE_TRACK = 0x1 NOTE_TRACKERR = 0x2 NOTE_TRUNCATE = 0x80 NOTE_WRITE = 0x2 OCRNL = 0x10 ONLCR = 0x2 ONLRET = 0x80 ONOCR = 0x40 ONOEOT = 0x8 OPOST = 0x1 O_ACCMODE = 0x3 O_APPEND = 0x8 O_ASYNC = 0x40 O_CLOEXEC = 0x10000 O_CREAT = 0x200 O_DIRECTORY = 0x20000 O_DSYNC = 0x80 O_EXCL = 0x800 O_EXLOCK = 0x20 O_FSYNC = 0x80 O_NDELAY = 0x4 O_NOCTTY = 0x8000 O_NOFOLLOW = 0x100 O_NONBLOCK = 0x4 O_RDONLY = 0x0 O_RDWR = 0x2 O_RSYNC = 0x80 O_SHLOCK = 0x10 O_SYNC = 0x80 O_TRUNC = 0x400 O_WRONLY = 0x1 PARENB = 0x1000 PARMRK = 0x8 PARODD = 0x2000 PENDIN = 0x20000000 PF_FLUSH = 0x1 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 PROT_EXEC = 0x4 PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 RLIMIT_NOFILE = 0x8 RLIMIT_STACK = 0x3 RLIM_INFINITY = 0x7fffffffffffffff RTAX_AUTHOR = 0x6 RTAX_BRD = 0x7 RTAX_DST = 0x0 RTAX_GATEWAY = 0x1 RTAX_GENMASK = 0x3 RTAX_IFA = 0x5 RTAX_IFP = 0x4 RTAX_LABEL = 0xa RTAX_MAX = 0xb RTAX_NETMASK = 0x2 RTAX_SRC = 0x8 RTAX_SRCMASK = 0x9 RTA_AUTHOR = 0x40 RTA_BRD = 0x80 RTA_DST = 0x1 RTA_GATEWAY = 0x2 RTA_GENMASK = 0x8 RTA_IFA = 0x20 RTA_IFP = 0x10 RTA_LABEL = 0x400 RTA_NETMASK = 0x4 RTA_SRC = 0x100 RTA_SRCMASK = 0x200 RTF_ANNOUNCE = 0x4000 RTF_BLACKHOLE = 0x1000 RTF_CLONED = 0x10000 RTF_CLONING = 0x100 RTF_DONE = 0x40 RTF_DYNAMIC = 0x10 RTF_FMASK = 0x10f808 RTF_GATEWAY = 0x2 RTF_HOST = 0x4 RTF_LLINFO = 0x400 RTF_MASK = 0x80 RTF_MODIFIED = 0x20 RTF_MPATH = 0x40000 RTF_MPLS = 0x100000 RTF_PERMANENT_ARP = 0x2000 RTF_PROTO1 = 0x8000 RTF_PROTO2 = 0x4000 RTF_PROTO3 = 0x2000 RTF_REJECT = 0x8 RTF_SOURCE = 0x20000 RTF_STATIC = 0x800 RTF_TUNNEL = 0x100000 RTF_UP = 0x1 RTF_USETRAILERS = 0x8000 RTF_XRESOLVE = 0x200 RTM_ADD = 0x1 RTM_CHANGE = 0x3 RTM_DELADDR = 0xd RTM_DELETE = 0x2 RTM_DESYNC = 0x10 RTM_GET = 0x4 RTM_IFANNOUNCE = 0xf RTM_IFINFO = 0xe RTM_LOCK = 0x8 RTM_LOSING = 0x5 RTM_MAXSIZE = 0x800 RTM_MISS = 0x7 RTM_NEWADDR = 0xc RTM_REDIRECT = 0x6 RTM_RESOLVE = 0xb RTM_RTTUNIT = 0xf4240 RTM_VERSION = 0x5 RTV_EXPIRE = 0x4 RTV_HOPCOUNT = 0x2 RTV_MTU = 0x1 RTV_RPIPE = 0x8 RTV_RTT = 0x40 RTV_RTTVAR = 0x80 RTV_SPIPE = 0x10 RTV_SSTHRESH = 0x20 RT_TABLEID_MAX = 0xff RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 RUSAGE_THREAD = 0x1 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x4 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 SIOCADDMULTI = 0x80206931 SIOCAIFADDR = 0x8040691a SIOCAIFGROUP = 0x80286987 SIOCALIFADDR = 0x8218691c SIOCATMARK = 0x40047307 SIOCBRDGADD = 0x8058693c SIOCBRDGADDS = 0x80586941 SIOCBRDGARL = 0x806e694d SIOCBRDGDADDR = 0x81286947 SIOCBRDGDEL = 0x8058693d SIOCBRDGDELS = 0x80586942 SIOCBRDGFLUSH = 0x80586948 SIOCBRDGFRL = 0x806e694e SIOCBRDGGCACHE = 0xc0146941 SIOCBRDGGFD = 0xc0146952 SIOCBRDGGHT = 0xc0146951 SIOCBRDGGIFFLGS = 0xc058693e SIOCBRDGGMA = 0xc0146953 SIOCBRDGGPARAM = 0xc0406958 SIOCBRDGGPRI = 0xc0146950 SIOCBRDGGRL = 0xc030694f SIOCBRDGGSIFS = 0xc058693c SIOCBRDGGTO = 0xc0146946 SIOCBRDGIFS = 0xc0586942 SIOCBRDGRTS = 0xc0206943 SIOCBRDGSADDR = 0xc1286944 SIOCBRDGSCACHE = 0x80146940 SIOCBRDGSFD = 0x80146952 SIOCBRDGSHT = 0x80146951 SIOCBRDGSIFCOST = 0x80586955 SIOCBRDGSIFFLGS = 0x8058693f SIOCBRDGSIFPRIO = 0x80586954 SIOCBRDGSMA = 0x80146953 SIOCBRDGSPRI = 0x80146950 SIOCBRDGSPROTO = 0x8014695a SIOCBRDGSTO = 0x80146945 SIOCBRDGSTXHC = 0x80146959 SIOCDELMULTI = 0x80206932 SIOCDIFADDR = 0x80206919 SIOCDIFGROUP = 0x80286989 SIOCDIFPHYADDR = 0x80206949 SIOCDLIFADDR = 0x8218691e SIOCGETKALIVE = 0xc01869a4 SIOCGETLABEL = 0x8020699a SIOCGETPFLOW = 0xc02069fe SIOCGETPFSYNC = 0xc02069f8 SIOCGETSGCNT = 0xc0207534 SIOCGETVIFCNT = 0xc0287533 SIOCGETVLAN = 0xc0206990 SIOCGHIWAT = 0x40047301 SIOCGIFADDR = 0xc0206921 SIOCGIFASYNCMAP = 0xc020697c SIOCGIFBRDADDR = 0xc0206923 SIOCGIFCONF = 0xc0106924 SIOCGIFDATA = 0xc020691b SIOCGIFDESCR = 0xc0206981 SIOCGIFDSTADDR = 0xc0206922 SIOCGIFFLAGS = 0xc0206911 SIOCGIFGATTR = 0xc028698b SIOCGIFGENERIC = 0xc020693a SIOCGIFGMEMB = 0xc028698a SIOCGIFGROUP = 0xc0286988 SIOCGIFHARDMTU = 0xc02069a5 SIOCGIFMEDIA = 0xc0306936 SIOCGIFMETRIC = 0xc0206917 SIOCGIFMTU = 0xc020697e SIOCGIFNETMASK = 0xc0206925 SIOCGIFPDSTADDR = 0xc0206948 SIOCGIFPRIORITY = 0xc020699c SIOCGIFPSRCADDR = 0xc0206947 SIOCGIFRDOMAIN = 0xc02069a0 SIOCGIFRTLABEL = 0xc0206983 SIOCGIFTIMESLOT = 0xc0206986 SIOCGIFXFLAGS = 0xc020699e SIOCGLIFADDR = 0xc218691d SIOCGLIFPHYADDR = 0xc218694b SIOCGLIFPHYRTABLE = 0xc02069a2 SIOCGLIFPHYTTL = 0xc02069a9 SIOCGLOWAT = 0x40047303 SIOCGPGRP = 0x40047309 SIOCGSPPPPARAMS = 0xc0206994 SIOCGVH = 0xc02069f6 SIOCGVNETID = 0xc02069a7 SIOCIFCREATE = 0x8020697a SIOCIFDESTROY = 0x80206979 SIOCIFGCLONERS = 0xc0106978 SIOCSETKALIVE = 0x801869a3 SIOCSETLABEL = 0x80206999 SIOCSETPFLOW = 0x802069fd SIOCSETPFSYNC = 0x802069f7 SIOCSETVLAN = 0x8020698f SIOCSHIWAT = 0x80047300 SIOCSIFADDR = 0x8020690c SIOCSIFASYNCMAP = 0x8020697d SIOCSIFBRDADDR = 0x80206913 SIOCSIFDESCR = 0x80206980 SIOCSIFDSTADDR = 0x8020690e SIOCSIFFLAGS = 0x80206910 SIOCSIFGATTR = 0x8028698c SIOCSIFGENERIC = 0x80206939 SIOCSIFLLADDR = 0x8020691f SIOCSIFMEDIA = 0xc0206935 SIOCSIFMETRIC = 0x80206918 SIOCSIFMTU = 0x8020697f SIOCSIFNETMASK = 0x80206916 SIOCSIFPHYADDR = 0x80406946 SIOCSIFPRIORITY = 0x8020699b SIOCSIFRDOMAIN = 0x8020699f SIOCSIFRTLABEL = 0x80206982 SIOCSIFTIMESLOT = 0x80206985 SIOCSIFXFLAGS = 0x8020699d SIOCSLIFPHYADDR = 0x8218694a SIOCSLIFPHYRTABLE = 0x802069a1 SIOCSLIFPHYTTL = 0x802069a8 SIOCSLOWAT = 0x80047302 SIOCSPGRP = 0x80047308 SIOCSSPPPPARAMS = 0x80206993 SIOCSVH = 0xc02069f5 SIOCSVNETID = 0x802069a6 SOCK_DGRAM = 0x2 SOCK_RAW = 0x3 SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x1 SOL_SOCKET = 0xffff SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x2 SO_BINDANY = 0x1000 SO_BROADCAST = 0x20 SO_DEBUG = 0x1 SO_DONTROUTE = 0x10 SO_ERROR = 0x1007 SO_KEEPALIVE = 0x8 SO_LINGER = 0x80 SO_NETPROC = 0x1020 SO_OOBINLINE = 0x100 SO_PEERCRED = 0x1022 SO_RCVBUF = 0x1002 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x1006 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_RTABLE = 0x1021 SO_SNDBUF = 0x1001 SO_SNDLOWAT = 0x1003 SO_SNDTIMEO = 0x1005 SO_SPLICE = 0x1023 SO_TIMESTAMP = 0x800 SO_TYPE = 0x1008 SO_USELOOPBACK = 0x40 TCIFLUSH = 0x1 TCIOFLUSH = 0x3 TCOFLUSH = 0x2 TCP_MAXBURST = 0x4 TCP_MAXSEG = 0x2 TCP_MAXWIN = 0xffff TCP_MAX_SACK = 0x3 TCP_MAX_WINSHIFT = 0xe TCP_MD5SIG = 0x4 TCP_MSS = 0x200 TCP_NODELAY = 0x1 TCP_NOPUSH = 0x10 TCP_NSTATES = 0xb TCP_SACK_ENABLE = 0x8 TCSAFLUSH = 0x2 TIOCCBRK = 0x2000747a TIOCCDTR = 0x20007478 TIOCCONS = 0x80047462 TIOCDRAIN = 0x2000745e TIOCEXCL = 0x2000740d TIOCEXT = 0x80047460 TIOCFLAG_CLOCAL = 0x2 TIOCFLAG_CRTSCTS = 0x4 TIOCFLAG_MDMBUF = 0x8 TIOCFLAG_PPS = 0x10 TIOCFLAG_SOFTCAR = 0x1 TIOCFLUSH = 0x80047410 TIOCGETA = 0x402c7413 TIOCGETD = 0x4004741a TIOCGFLAGS = 0x4004745d TIOCGPGRP = 0x40047477 TIOCGSID = 0x40047463 TIOCGTSTAMP = 0x4010745b TIOCGWINSZ = 0x40087468 TIOCMBIC = 0x8004746b TIOCMBIS = 0x8004746c TIOCMGET = 0x4004746a TIOCMODG = 0x4004746a TIOCMODS = 0x8004746d TIOCMSET = 0x8004746d TIOCM_CAR = 0x40 TIOCM_CD = 0x40 TIOCM_CTS = 0x20 TIOCM_DSR = 0x100 TIOCM_DTR = 0x2 TIOCM_LE = 0x1 TIOCM_RI = 0x80 TIOCM_RNG = 0x80 TIOCM_RTS = 0x4 TIOCM_SR = 0x10 TIOCM_ST = 0x8 TIOCNOTTY = 0x20007471 TIOCNXCL = 0x2000740e TIOCOUTQ = 0x40047473 TIOCPKT = 0x80047470 TIOCPKT_DATA = 0x0 TIOCPKT_DOSTOP = 0x20 TIOCPKT_FLUSHREAD = 0x1 TIOCPKT_FLUSHWRITE = 0x2 TIOCPKT_IOCTL = 0x40 TIOCPKT_NOSTOP = 0x10 TIOCPKT_START = 0x8 TIOCPKT_STOP = 0x4 TIOCREMOTE = 0x80047469 TIOCSBRK = 0x2000747b TIOCSCTTY = 0x20007461 TIOCSDTR = 0x20007479 TIOCSETA = 0x802c7414 TIOCSETAF = 0x802c7416 TIOCSETAW = 0x802c7415 TIOCSETD = 0x8004741b TIOCSFLAGS = 0x8004745c TIOCSIG = 0x8004745f TIOCSPGRP = 0x80047476 TIOCSTART = 0x2000746e TIOCSTAT = 0x80047465 TIOCSTI = 0x80017472 TIOCSTOP = 0x2000746f TIOCSTSTAMP = 0x8008745a TIOCSWINSZ = 0x80087467 TIOCUCNTL = 0x80047466 TOSTOP = 0x400000 VDISCARD = 0xf VDSUSP = 0xb VEOF = 0x0 VEOL = 0x1 VEOL2 = 0x2 VERASE = 0x3 VINTR = 0x8 VKILL = 0x5 VLNEXT = 0xe VMIN = 0x10 VQUIT = 0x9 VREPRINT = 0x6 VSTART = 0xc VSTATUS = 0x12 VSTOP = 0xd VSUSP = 0xa VTIME = 0x11 VWERASE = 0x4 WALTSIG = 0x4 WCONTINUED = 0x8 WCOREFLAG = 0x80 WNOHANG = 0x1 WSTOPPED = 0x7f WUNTRACED = 0x2 ) // Errors const ( E2BIG = syscall.Errno(0x7) EACCES = syscall.Errno(0xd) EADDRINUSE = syscall.Errno(0x30) EADDRNOTAVAIL = syscall.Errno(0x31) EAFNOSUPPORT = syscall.Errno(0x2f) EAGAIN = syscall.Errno(0x23) EALREADY = syscall.Errno(0x25) EAUTH = syscall.Errno(0x50) EBADF = syscall.Errno(0x9) EBADRPC = syscall.Errno(0x48) EBUSY = syscall.Errno(0x10) ECANCELED = syscall.Errno(0x58) ECHILD = syscall.Errno(0xa) ECONNABORTED = syscall.Errno(0x35) ECONNREFUSED = syscall.Errno(0x3d) ECONNRESET = syscall.Errno(0x36) EDEADLK = syscall.Errno(0xb) EDESTADDRREQ = syscall.Errno(0x27) EDOM = syscall.Errno(0x21) EDQUOT = syscall.Errno(0x45) EEXIST = syscall.Errno(0x11) EFAULT = syscall.Errno(0xe) EFBIG = syscall.Errno(0x1b) EFTYPE = syscall.Errno(0x4f) EHOSTDOWN = syscall.Errno(0x40) EHOSTUNREACH = syscall.Errno(0x41) EIDRM = syscall.Errno(0x59) EILSEQ = syscall.Errno(0x54) EINPROGRESS = syscall.Errno(0x24) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EIPSEC = syscall.Errno(0x52) EISCONN = syscall.Errno(0x38) EISDIR = syscall.Errno(0x15) ELAST = syscall.Errno(0x5b) ELOOP = syscall.Errno(0x3e) EMEDIUMTYPE = syscall.Errno(0x56) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) EMSGSIZE = syscall.Errno(0x28) ENAMETOOLONG = syscall.Errno(0x3f) ENEEDAUTH = syscall.Errno(0x51) ENETDOWN = syscall.Errno(0x32) ENETRESET = syscall.Errno(0x34) ENETUNREACH = syscall.Errno(0x33) ENFILE = syscall.Errno(0x17) ENOATTR = syscall.Errno(0x53) ENOBUFS = syscall.Errno(0x37) ENODEV = syscall.Errno(0x13) ENOENT = syscall.Errno(0x2) ENOEXEC = syscall.Errno(0x8) ENOLCK = syscall.Errno(0x4d) ENOMEDIUM = syscall.Errno(0x55) ENOMEM = syscall.Errno(0xc) ENOMSG = syscall.Errno(0x5a) ENOPROTOOPT = syscall.Errno(0x2a) ENOSPC = syscall.Errno(0x1c) ENOSYS = syscall.Errno(0x4e) ENOTBLK = syscall.Errno(0xf) ENOTCONN = syscall.Errno(0x39) ENOTDIR = syscall.Errno(0x14) ENOTEMPTY = syscall.Errno(0x42) ENOTSOCK = syscall.Errno(0x26) ENOTSUP = syscall.Errno(0x5b) ENOTTY = syscall.Errno(0x19) ENXIO = syscall.Errno(0x6) EOPNOTSUPP = syscall.Errno(0x2d) EOVERFLOW = syscall.Errno(0x57) EPERM = syscall.Errno(0x1) EPFNOSUPPORT = syscall.Errno(0x2e) EPIPE = syscall.Errno(0x20) EPROCLIM = syscall.Errno(0x43) EPROCUNAVAIL = syscall.Errno(0x4c) EPROGMISMATCH = syscall.Errno(0x4b) EPROGUNAVAIL = syscall.Errno(0x4a) EPROTONOSUPPORT = syscall.Errno(0x2b) EPROTOTYPE = syscall.Errno(0x29) ERANGE = syscall.Errno(0x22) EREMOTE = syscall.Errno(0x47) EROFS = syscall.Errno(0x1e) ERPCMISMATCH = syscall.Errno(0x49) ESHUTDOWN = syscall.Errno(0x3a) ESOCKTNOSUPPORT = syscall.Errno(0x2c) ESPIPE = syscall.Errno(0x1d) ESRCH = syscall.Errno(0x3) ESTALE = syscall.Errno(0x46) ETIMEDOUT = syscall.Errno(0x3c) ETOOMANYREFS = syscall.Errno(0x3b) ETXTBSY = syscall.Errno(0x1a) EUSERS = syscall.Errno(0x44) EWOULDBLOCK = syscall.Errno(0x23) EXDEV = syscall.Errno(0x12) ) // Signals const ( SIGABRT = syscall.Signal(0x6) SIGALRM = syscall.Signal(0xe) SIGBUS = syscall.Signal(0xa) SIGCHLD = syscall.Signal(0x14) SIGCONT = syscall.Signal(0x13) SIGEMT = syscall.Signal(0x7) SIGFPE = syscall.Signal(0x8) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) SIGINFO = syscall.Signal(0x1d) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x17) SIGIOT = syscall.Signal(0x6) SIGKILL = syscall.Signal(0x9) SIGPIPE = syscall.Signal(0xd) SIGPROF = syscall.Signal(0x1b) SIGQUIT = syscall.Signal(0x3) SIGSEGV = syscall.Signal(0xb) SIGSTOP = syscall.Signal(0x11) SIGSYS = syscall.Signal(0xc) SIGTERM = syscall.Signal(0xf) SIGTHR = syscall.Signal(0x20) SIGTRAP = syscall.Signal(0x5) SIGTSTP = syscall.Signal(0x12) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) SIGURG = syscall.Signal(0x10) SIGUSR1 = syscall.Signal(0x1e) SIGUSR2 = syscall.Signal(0x1f) SIGVTALRM = syscall.Signal(0x1a) SIGWINCH = syscall.Signal(0x1c) SIGXCPU = syscall.Signal(0x18) SIGXFSZ = syscall.Signal(0x19) ) // Error table var errors = [...]string{ 1: "operation not permitted", 2: "no such file or directory", 3: "no such process", 4: "interrupted system call", 5: "input/output error", 6: "device not configured", 7: "argument list too long", 8: "exec format error", 9: "bad file descriptor", 10: "no child processes", 11: "resource deadlock avoided", 12: "cannot allocate memory", 13: "permission denied", 14: "bad address", 15: "block device required", 16: "device busy", 17: "file exists", 18: "cross-device link", 19: "operation not supported by device", 20: "not a directory", 21: "is a directory", 22: "invalid argument", 23: "too many open files in system", 24: "too many open files", 25: "inappropriate ioctl for device", 26: "text file busy", 27: "file too large", 28: "no space left on device", 29: "illegal seek", 30: "read-only file system", 31: "too many links", 32: "broken pipe", 33: "numerical argument out of domain", 34: "result too large", 35: "resource temporarily unavailable", 36: "operation now in progress", 37: "operation already in progress", 38: "socket operation on non-socket", 39: "destination address required", 40: "message too long", 41: "protocol wrong type for socket", 42: "protocol not available", 43: "protocol not supported", 44: "socket type not supported", 45: "operation not supported", 46: "protocol family not supported", 47: "address family not supported by protocol family", 48: "address already in use", 49: "can't assign requested address", 50: "network is down", 51: "network is unreachable", 52: "network dropped connection on reset", 53: "software caused connection abort", 54: "connection reset by peer", 55: "no buffer space available", 56: "socket is already connected", 57: "socket is not connected", 58: "can't send after socket shutdown", 59: "too many references: can't splice", 60: "connection timed out", 61: "connection refused", 62: "too many levels of symbolic links", 63: "file name too long", 64: "host is down", 65: "no route to host", 66: "directory not empty", 67: "too many processes", 68: "too many users", 69: "disc quota exceeded", 70: "stale NFS file handle", 71: "too many levels of remote in path", 72: "RPC struct is bad", 73: "RPC version wrong", 74: "RPC prog. not avail", 75: "program version wrong", 76: "bad procedure for program", 77: "no locks available", 78: "function not implemented", 79: "inappropriate file type or format", 80: "authentication error", 81: "need authenticator", 82: "IPsec processing failure", 83: "attribute not found", 84: "illegal byte sequence", 85: "no medium found", 86: "wrong medium type", 87: "value too large to be stored in data type", 88: "operation canceled", 89: "identifier removed", 90: "no message of desired type", 91: "not supported", } // Signal table var signals = [...]string{ 1: "hangup", 2: "interrupt", 3: "quit", 4: "illegal instruction", 5: "trace/BPT trap", 6: "abort trap", 7: "EMT trap", 8: "floating point exception", 9: "killed", 10: "bus error", 11: "segmentation fault", 12: "bad system call", 13: "broken pipe", 14: "alarm clock", 15: "terminated", 16: "urgent I/O condition", 17: "stopped (signal)", 18: "stopped", 19: "continued", 20: "child exited", 21: "stopped (tty input)", 22: "stopped (tty output)", 23: "I/O possible", 24: "cputime limit exceeded", 25: "filesize limit exceeded", 26: "virtual timer expired", 27: "profiling timer expired", 28: "window size changes", 29: "information request", 30: "user defined signal 1", 31: "user defined signal 2", 32: "thread AST", } ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go ================================================ // mkerrors.sh // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- _const.go // +build arm,openbsd package unix import "syscall" const ( AF_APPLETALK = 0x10 AF_BLUETOOTH = 0x20 AF_CCITT = 0xa AF_CHAOS = 0x5 AF_CNT = 0x15 AF_COIP = 0x14 AF_DATAKIT = 0x9 AF_DECnet = 0xc AF_DLI = 0xd AF_E164 = 0x1a AF_ECMA = 0x8 AF_ENCAP = 0x1c AF_HYLINK = 0xf AF_IMPLINK = 0x3 AF_INET = 0x2 AF_INET6 = 0x18 AF_IPX = 0x17 AF_ISDN = 0x1a AF_ISO = 0x7 AF_KEY = 0x1e AF_LAT = 0xe AF_LINK = 0x12 AF_LOCAL = 0x1 AF_MAX = 0x24 AF_MPLS = 0x21 AF_NATM = 0x1b AF_NS = 0x6 AF_OSI = 0x7 AF_PUP = 0x4 AF_ROUTE = 0x11 AF_SIP = 0x1d AF_SNA = 0xb AF_UNIX = 0x1 AF_UNSPEC = 0x0 ARPHRD_ETHER = 0x1 ARPHRD_FRELAY = 0xf ARPHRD_IEEE1394 = 0x18 ARPHRD_IEEE802 = 0x6 B0 = 0x0 B110 = 0x6e B115200 = 0x1c200 B1200 = 0x4b0 B134 = 0x86 B14400 = 0x3840 B150 = 0x96 B1800 = 0x708 B19200 = 0x4b00 B200 = 0xc8 B230400 = 0x38400 B2400 = 0x960 B28800 = 0x7080 B300 = 0x12c B38400 = 0x9600 B4800 = 0x12c0 B50 = 0x32 B57600 = 0xe100 B600 = 0x258 B7200 = 0x1c20 B75 = 0x4b B76800 = 0x12c00 B9600 = 0x2580 BIOCFLUSH = 0x20004268 BIOCGBLEN = 0x40044266 BIOCGDIRFILT = 0x4004427c BIOCGDLT = 0x4004426a BIOCGDLTLIST = 0xc008427b BIOCGETIF = 0x4020426b BIOCGFILDROP = 0x40044278 BIOCGHDRCMPLT = 0x40044274 BIOCGRSIG = 0x40044273 BIOCGRTIMEOUT = 0x400c426e BIOCGSTATS = 0x4008426f BIOCIMMEDIATE = 0x80044270 BIOCLOCK = 0x20004276 BIOCPROMISC = 0x20004269 BIOCSBLEN = 0xc0044266 BIOCSDIRFILT = 0x8004427d BIOCSDLT = 0x8004427a BIOCSETF = 0x80084267 BIOCSETIF = 0x8020426c BIOCSETWF = 0x80084277 BIOCSFILDROP = 0x80044279 BIOCSHDRCMPLT = 0x80044275 BIOCSRSIG = 0x80044272 BIOCSRTIMEOUT = 0x800c426d BIOCVERSION = 0x40044271 BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALIGNMENT = 0x4 BPF_ALU = 0x4 BPF_AND = 0x50 BPF_B = 0x10 BPF_DIRECTION_IN = 0x1 BPF_DIRECTION_OUT = 0x2 BPF_DIV = 0x30 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 BPF_JA = 0x0 BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 BPF_JMP = 0x5 BPF_JSET = 0x40 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 BPF_LEN = 0x80 BPF_LSH = 0x60 BPF_MAJOR_VERSION = 0x1 BPF_MAXBUFSIZE = 0x200000 BPF_MAXINSNS = 0x200 BPF_MEM = 0x60 BPF_MEMWORDS = 0x10 BPF_MINBUFSIZE = 0x20 BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_OR = 0x40 BPF_RELEASE = 0x30bb6 BPF_RET = 0x6 BPF_RSH = 0x70 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 BPF_TAX = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 BRKINT = 0x2 CFLUSH = 0xf CLOCAL = 0x8000 CREAD = 0x800 CS5 = 0x0 CS6 = 0x100 CS7 = 0x200 CS8 = 0x300 CSIZE = 0x300 CSTART = 0x11 CSTATUS = 0xff CSTOP = 0x13 CSTOPB = 0x400 CSUSP = 0x1a CTL_MAXNAME = 0xc CTL_NET = 0x4 DIOCOSFPFLUSH = 0x2000444e DLT_ARCNET = 0x7 DLT_ATM_RFC1483 = 0xb DLT_AX25 = 0x3 DLT_CHAOS = 0x5 DLT_C_HDLC = 0x68 DLT_EN10MB = 0x1 DLT_EN3MB = 0x2 DLT_ENC = 0xd DLT_FDDI = 0xa DLT_IEEE802 = 0x6 DLT_IEEE802_11 = 0x69 DLT_IEEE802_11_RADIO = 0x7f DLT_LOOP = 0xc DLT_MPLS = 0xdb DLT_NULL = 0x0 DLT_PFLOG = 0x75 DLT_PFSYNC = 0x12 DLT_PPP = 0x9 DLT_PPP_BSDOS = 0x10 DLT_PPP_ETHER = 0x33 DLT_PPP_SERIAL = 0x32 DLT_PRONET = 0x4 DLT_RAW = 0xe DLT_SLIP = 0x8 DLT_SLIP_BSDOS = 0xf DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 DT_FIFO = 0x1 DT_LNK = 0xa DT_REG = 0x8 DT_SOCK = 0xc DT_UNKNOWN = 0x0 ECHO = 0x8 ECHOCTL = 0x40 ECHOE = 0x2 ECHOK = 0x4 ECHOKE = 0x1 ECHONL = 0x10 ECHOPRT = 0x20 EMT_TAGOVF = 0x1 EMUL_ENABLED = 0x1 EMUL_NATIVE = 0x2 ENDRUNDISC = 0x9 ETHERMIN = 0x2e ETHERMTU = 0x5dc ETHERTYPE_8023 = 0x4 ETHERTYPE_AARP = 0x80f3 ETHERTYPE_ACCTON = 0x8390 ETHERTYPE_AEONIC = 0x8036 ETHERTYPE_ALPHA = 0x814a ETHERTYPE_AMBER = 0x6008 ETHERTYPE_AMOEBA = 0x8145 ETHERTYPE_AOE = 0x88a2 ETHERTYPE_APOLLO = 0x80f7 ETHERTYPE_APOLLODOMAIN = 0x8019 ETHERTYPE_APPLETALK = 0x809b ETHERTYPE_APPLITEK = 0x80c7 ETHERTYPE_ARGONAUT = 0x803a ETHERTYPE_ARP = 0x806 ETHERTYPE_AT = 0x809b ETHERTYPE_ATALK = 0x809b ETHERTYPE_ATOMIC = 0x86df ETHERTYPE_ATT = 0x8069 ETHERTYPE_ATTSTANFORD = 0x8008 ETHERTYPE_AUTOPHON = 0x806a ETHERTYPE_AXIS = 0x8856 ETHERTYPE_BCLOOP = 0x9003 ETHERTYPE_BOFL = 0x8102 ETHERTYPE_CABLETRON = 0x7034 ETHERTYPE_CHAOS = 0x804 ETHERTYPE_COMDESIGN = 0x806c ETHERTYPE_COMPUGRAPHIC = 0x806d ETHERTYPE_COUNTERPOINT = 0x8062 ETHERTYPE_CRONUS = 0x8004 ETHERTYPE_CRONUSVLN = 0x8003 ETHERTYPE_DCA = 0x1234 ETHERTYPE_DDE = 0x807b ETHERTYPE_DEBNI = 0xaaaa ETHERTYPE_DECAM = 0x8048 ETHERTYPE_DECCUST = 0x6006 ETHERTYPE_DECDIAG = 0x6005 ETHERTYPE_DECDNS = 0x803c ETHERTYPE_DECDTS = 0x803e ETHERTYPE_DECEXPER = 0x6000 ETHERTYPE_DECLAST = 0x8041 ETHERTYPE_DECLTM = 0x803f ETHERTYPE_DECMUMPS = 0x6009 ETHERTYPE_DECNETBIOS = 0x8040 ETHERTYPE_DELTACON = 0x86de ETHERTYPE_DIDDLE = 0x4321 ETHERTYPE_DLOG1 = 0x660 ETHERTYPE_DLOG2 = 0x661 ETHERTYPE_DN = 0x6003 ETHERTYPE_DOGFIGHT = 0x1989 ETHERTYPE_DSMD = 0x8039 ETHERTYPE_ECMA = 0x803 ETHERTYPE_ENCRYPT = 0x803d ETHERTYPE_ES = 0x805d ETHERTYPE_EXCELAN = 0x8010 ETHERTYPE_EXPERDATA = 0x8049 ETHERTYPE_FLIP = 0x8146 ETHERTYPE_FLOWCONTROL = 0x8808 ETHERTYPE_FRARP = 0x808 ETHERTYPE_GENDYN = 0x8068 ETHERTYPE_HAYES = 0x8130 ETHERTYPE_HIPPI_FP = 0x8180 ETHERTYPE_HITACHI = 0x8820 ETHERTYPE_HP = 0x8005 ETHERTYPE_IEEEPUP = 0xa00 ETHERTYPE_IEEEPUPAT = 0xa01 ETHERTYPE_IMLBL = 0x4c42 ETHERTYPE_IMLBLDIAG = 0x424c ETHERTYPE_IP = 0x800 ETHERTYPE_IPAS = 0x876c ETHERTYPE_IPV6 = 0x86dd ETHERTYPE_IPX = 0x8137 ETHERTYPE_IPXNEW = 0x8037 ETHERTYPE_KALPANA = 0x8582 ETHERTYPE_LANBRIDGE = 0x8038 ETHERTYPE_LANPROBE = 0x8888 ETHERTYPE_LAT = 0x6004 ETHERTYPE_LBACK = 0x9000 ETHERTYPE_LITTLE = 0x8060 ETHERTYPE_LLDP = 0x88cc ETHERTYPE_LOGICRAFT = 0x8148 ETHERTYPE_LOOPBACK = 0x9000 ETHERTYPE_MATRA = 0x807a ETHERTYPE_MAX = 0xffff ETHERTYPE_MERIT = 0x807c ETHERTYPE_MICP = 0x873a ETHERTYPE_MOPDL = 0x6001 ETHERTYPE_MOPRC = 0x6002 ETHERTYPE_MOTOROLA = 0x818d ETHERTYPE_MPLS = 0x8847 ETHERTYPE_MPLS_MCAST = 0x8848 ETHERTYPE_MUMPS = 0x813f ETHERTYPE_NBPCC = 0x3c04 ETHERTYPE_NBPCLAIM = 0x3c09 ETHERTYPE_NBPCLREQ = 0x3c05 ETHERTYPE_NBPCLRSP = 0x3c06 ETHERTYPE_NBPCREQ = 0x3c02 ETHERTYPE_NBPCRSP = 0x3c03 ETHERTYPE_NBPDG = 0x3c07 ETHERTYPE_NBPDGB = 0x3c08 ETHERTYPE_NBPDLTE = 0x3c0a ETHERTYPE_NBPRAR = 0x3c0c ETHERTYPE_NBPRAS = 0x3c0b ETHERTYPE_NBPRST = 0x3c0d ETHERTYPE_NBPSCD = 0x3c01 ETHERTYPE_NBPVCD = 0x3c00 ETHERTYPE_NBS = 0x802 ETHERTYPE_NCD = 0x8149 ETHERTYPE_NESTAR = 0x8006 ETHERTYPE_NETBEUI = 0x8191 ETHERTYPE_NOVELL = 0x8138 ETHERTYPE_NS = 0x600 ETHERTYPE_NSAT = 0x601 ETHERTYPE_NSCOMPAT = 0x807 ETHERTYPE_NTRAILER = 0x10 ETHERTYPE_OS9 = 0x7007 ETHERTYPE_OS9NET = 0x7009 ETHERTYPE_PACER = 0x80c6 ETHERTYPE_PAE = 0x888e ETHERTYPE_PCS = 0x4242 ETHERTYPE_PLANNING = 0x8044 ETHERTYPE_PPP = 0x880b ETHERTYPE_PPPOE = 0x8864 ETHERTYPE_PPPOEDISC = 0x8863 ETHERTYPE_PRIMENTS = 0x7031 ETHERTYPE_PUP = 0x200 ETHERTYPE_PUPAT = 0x200 ETHERTYPE_QINQ = 0x88a8 ETHERTYPE_RACAL = 0x7030 ETHERTYPE_RATIONAL = 0x8150 ETHERTYPE_RAWFR = 0x6559 ETHERTYPE_RCL = 0x1995 ETHERTYPE_RDP = 0x8739 ETHERTYPE_RETIX = 0x80f2 ETHERTYPE_REVARP = 0x8035 ETHERTYPE_SCA = 0x6007 ETHERTYPE_SECTRA = 0x86db ETHERTYPE_SECUREDATA = 0x876d ETHERTYPE_SGITW = 0x817e ETHERTYPE_SG_BOUNCE = 0x8016 ETHERTYPE_SG_DIAG = 0x8013 ETHERTYPE_SG_NETGAMES = 0x8014 ETHERTYPE_SG_RESV = 0x8015 ETHERTYPE_SIMNET = 0x5208 ETHERTYPE_SLOW = 0x8809 ETHERTYPE_SNA = 0x80d5 ETHERTYPE_SNMP = 0x814c ETHERTYPE_SONIX = 0xfaf5 ETHERTYPE_SPIDER = 0x809f ETHERTYPE_SPRITE = 0x500 ETHERTYPE_STP = 0x8181 ETHERTYPE_TALARIS = 0x812b ETHERTYPE_TALARISMC = 0x852b ETHERTYPE_TCPCOMP = 0x876b ETHERTYPE_TCPSM = 0x9002 ETHERTYPE_TEC = 0x814f ETHERTYPE_TIGAN = 0x802f ETHERTYPE_TRAIL = 0x1000 ETHERTYPE_TRANSETHER = 0x6558 ETHERTYPE_TYMSHARE = 0x802e ETHERTYPE_UBBST = 0x7005 ETHERTYPE_UBDEBUG = 0x900 ETHERTYPE_UBDIAGLOOP = 0x7002 ETHERTYPE_UBDL = 0x7000 ETHERTYPE_UBNIU = 0x7001 ETHERTYPE_UBNMC = 0x7003 ETHERTYPE_VALID = 0x1600 ETHERTYPE_VARIAN = 0x80dd ETHERTYPE_VAXELN = 0x803b ETHERTYPE_VEECO = 0x8067 ETHERTYPE_VEXP = 0x805b ETHERTYPE_VGLAB = 0x8131 ETHERTYPE_VINES = 0xbad ETHERTYPE_VINESECHO = 0xbaf ETHERTYPE_VINESLOOP = 0xbae ETHERTYPE_VITAL = 0xff00 ETHERTYPE_VLAN = 0x8100 ETHERTYPE_VLTLMAN = 0x8080 ETHERTYPE_VPROD = 0x805c ETHERTYPE_VURESERVED = 0x8147 ETHERTYPE_WATERLOO = 0x8130 ETHERTYPE_WELLFLEET = 0x8103 ETHERTYPE_X25 = 0x805 ETHERTYPE_X75 = 0x801 ETHERTYPE_XNSSM = 0x9001 ETHERTYPE_XTP = 0x817d ETHER_ADDR_LEN = 0x6 ETHER_ALIGN = 0x2 ETHER_CRC_LEN = 0x4 ETHER_CRC_POLY_BE = 0x4c11db6 ETHER_CRC_POLY_LE = 0xedb88320 ETHER_HDR_LEN = 0xe ETHER_MAX_DIX_LEN = 0x600 ETHER_MAX_LEN = 0x5ee ETHER_MIN_LEN = 0x40 ETHER_TYPE_LEN = 0x2 ETHER_VLAN_ENCAP_LEN = 0x4 EVFILT_AIO = -0x3 EVFILT_PROC = -0x5 EVFILT_READ = -0x1 EVFILT_SIGNAL = -0x6 EVFILT_SYSCOUNT = 0x7 EVFILT_TIMER = -0x7 EVFILT_VNODE = -0x4 EVFILT_WRITE = -0x2 EV_ADD = 0x1 EV_CLEAR = 0x20 EV_DELETE = 0x2 EV_DISABLE = 0x8 EV_ENABLE = 0x4 EV_EOF = 0x8000 EV_ERROR = 0x4000 EV_FLAG1 = 0x2000 EV_ONESHOT = 0x10 EV_SYSFLAGS = 0xf000 EXTA = 0x4b00 EXTB = 0x9600 EXTPROC = 0x800 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FLUSHO = 0x800000 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0xa F_GETFD = 0x1 F_GETFL = 0x3 F_GETLK = 0x7 F_GETOWN = 0x5 F_RDLCK = 0x1 F_SETFD = 0x2 F_SETFL = 0x4 F_SETLK = 0x8 F_SETLKW = 0x9 F_SETOWN = 0x6 F_UNLCK = 0x2 F_WRLCK = 0x3 HUPCL = 0x4000 ICANON = 0x100 ICMP6_FILTER = 0x12 ICRNL = 0x100 IEXTEN = 0x400 IFAN_ARRIVAL = 0x0 IFAN_DEPARTURE = 0x1 IFA_ROUTE = 0x1 IFF_ALLMULTI = 0x200 IFF_BROADCAST = 0x2 IFF_CANTCHANGE = 0x8e52 IFF_DEBUG = 0x4 IFF_LINK0 = 0x1000 IFF_LINK1 = 0x2000 IFF_LINK2 = 0x4000 IFF_LOOPBACK = 0x8 IFF_MULTICAST = 0x8000 IFF_NOARP = 0x80 IFF_NOTRAILERS = 0x20 IFF_OACTIVE = 0x400 IFF_POINTOPOINT = 0x10 IFF_PROMISC = 0x100 IFF_RUNNING = 0x40 IFF_SIMPLEX = 0x800 IFF_UP = 0x1 IFNAMSIZ = 0x10 IFT_1822 = 0x2 IFT_A12MPPSWITCH = 0x82 IFT_AAL2 = 0xbb IFT_AAL5 = 0x31 IFT_ADSL = 0x5e IFT_AFLANE8023 = 0x3b IFT_AFLANE8025 = 0x3c IFT_ARAP = 0x58 IFT_ARCNET = 0x23 IFT_ARCNETPLUS = 0x24 IFT_ASYNC = 0x54 IFT_ATM = 0x25 IFT_ATMDXI = 0x69 IFT_ATMFUNI = 0x6a IFT_ATMIMA = 0x6b IFT_ATMLOGICAL = 0x50 IFT_ATMRADIO = 0xbd IFT_ATMSUBINTERFACE = 0x86 IFT_ATMVCIENDPT = 0xc2 IFT_ATMVIRTUAL = 0x95 IFT_BGPPOLICYACCOUNTING = 0xa2 IFT_BLUETOOTH = 0xf8 IFT_BRIDGE = 0xd1 IFT_BSC = 0x53 IFT_CARP = 0xf7 IFT_CCTEMUL = 0x3d IFT_CEPT = 0x13 IFT_CES = 0x85 IFT_CHANNEL = 0x46 IFT_CNR = 0x55 IFT_COFFEE = 0x84 IFT_COMPOSITELINK = 0x9b IFT_DCN = 0x8d IFT_DIGITALPOWERLINE = 0x8a IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba IFT_DLSW = 0x4a IFT_DOCSCABLEDOWNSTREAM = 0x80 IFT_DOCSCABLEMACLAYER = 0x7f IFT_DOCSCABLEUPSTREAM = 0x81 IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd IFT_DS0 = 0x51 IFT_DS0BUNDLE = 0x52 IFT_DS1FDL = 0xaa IFT_DS3 = 0x1e IFT_DTM = 0x8c IFT_DUMMY = 0xf1 IFT_DVBASILN = 0xac IFT_DVBASIOUT = 0xad IFT_DVBRCCDOWNSTREAM = 0x93 IFT_DVBRCCMACLAYER = 0x92 IFT_DVBRCCUPSTREAM = 0x94 IFT_ECONET = 0xce IFT_ENC = 0xf4 IFT_EON = 0x19 IFT_EPLRS = 0x57 IFT_ESCON = 0x49 IFT_ETHER = 0x6 IFT_FAITH = 0xf3 IFT_FAST = 0x7d IFT_FASTETHER = 0x3e IFT_FASTETHERFX = 0x45 IFT_FDDI = 0xf IFT_FIBRECHANNEL = 0x38 IFT_FRAMERELAYINTERCONNECT = 0x3a IFT_FRAMERELAYMPI = 0x5c IFT_FRDLCIENDPT = 0xc1 IFT_FRELAY = 0x20 IFT_FRELAYDCE = 0x2c IFT_FRF16MFRBUNDLE = 0xa3 IFT_FRFORWARD = 0x9e IFT_G703AT2MB = 0x43 IFT_G703AT64K = 0x42 IFT_GIF = 0xf0 IFT_GIGABITETHERNET = 0x75 IFT_GR303IDT = 0xb2 IFT_GR303RDT = 0xb1 IFT_H323GATEKEEPER = 0xa4 IFT_H323PROXY = 0xa5 IFT_HDH1822 = 0x3 IFT_HDLC = 0x76 IFT_HDSL2 = 0xa8 IFT_HIPERLAN2 = 0xb7 IFT_HIPPI = 0x2f IFT_HIPPIINTERFACE = 0x39 IFT_HOSTPAD = 0x5a IFT_HSSI = 0x2e IFT_HY = 0xe IFT_IBM370PARCHAN = 0x48 IFT_IDSL = 0x9a IFT_IEEE1394 = 0x90 IFT_IEEE80211 = 0x47 IFT_IEEE80212 = 0x37 IFT_IEEE8023ADLAG = 0xa1 IFT_IFGSN = 0x91 IFT_IMT = 0xbe IFT_INFINIBAND = 0xc7 IFT_INTERLEAVE = 0x7c IFT_IP = 0x7e IFT_IPFORWARD = 0x8e IFT_IPOVERATM = 0x72 IFT_IPOVERCDLC = 0x6d IFT_IPOVERCLAW = 0x6e IFT_IPSWITCH = 0x4e IFT_ISDN = 0x3f IFT_ISDNBASIC = 0x14 IFT_ISDNPRIMARY = 0x15 IFT_ISDNS = 0x4b IFT_ISDNU = 0x4c IFT_ISO88022LLC = 0x29 IFT_ISO88023 = 0x7 IFT_ISO88024 = 0x8 IFT_ISO88025 = 0x9 IFT_ISO88025CRFPINT = 0x62 IFT_ISO88025DTR = 0x56 IFT_ISO88025FIBER = 0x73 IFT_ISO88026 = 0xa IFT_ISUP = 0xb3 IFT_L2VLAN = 0x87 IFT_L3IPVLAN = 0x88 IFT_L3IPXVLAN = 0x89 IFT_LAPB = 0x10 IFT_LAPD = 0x4d IFT_LAPF = 0x77 IFT_LINEGROUP = 0xd2 IFT_LOCALTALK = 0x2a IFT_LOOP = 0x18 IFT_MEDIAMAILOVERIP = 0x8b IFT_MFSIGLINK = 0xa7 IFT_MIOX25 = 0x26 IFT_MODEM = 0x30 IFT_MPC = 0x71 IFT_MPLS = 0xa6 IFT_MPLSTUNNEL = 0x96 IFT_MSDSL = 0x8f IFT_MVL = 0xbf IFT_MYRINET = 0x63 IFT_NFAS = 0xaf IFT_NSIP = 0x1b IFT_OPTICALCHANNEL = 0xc3 IFT_OPTICALTRANSPORT = 0xc4 IFT_OTHER = 0x1 IFT_P10 = 0xc IFT_P80 = 0xd IFT_PARA = 0x22 IFT_PFLOG = 0xf5 IFT_PFLOW = 0xf9 IFT_PFSYNC = 0xf6 IFT_PLC = 0xae IFT_PON155 = 0xcf IFT_PON622 = 0xd0 IFT_POS = 0xab IFT_PPP = 0x17 IFT_PPPMULTILINKBUNDLE = 0x6c IFT_PROPATM = 0xc5 IFT_PROPBWAP2MP = 0xb8 IFT_PROPCNLS = 0x59 IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 IFT_PROPMUX = 0x36 IFT_PROPVIRTUAL = 0x35 IFT_PROPWIRELESSP2P = 0x9d IFT_PTPSERIAL = 0x16 IFT_PVC = 0xf2 IFT_Q2931 = 0xc9 IFT_QLLC = 0x44 IFT_RADIOMAC = 0xbc IFT_RADSL = 0x5f IFT_REACHDSL = 0xc0 IFT_RFC1483 = 0x9f IFT_RS232 = 0x21 IFT_RSRB = 0x4f IFT_SDLC = 0x11 IFT_SDSL = 0x60 IFT_SHDSL = 0xa9 IFT_SIP = 0x1f IFT_SIPSIG = 0xcc IFT_SIPTG = 0xcb IFT_SLIP = 0x1c IFT_SMDSDXI = 0x2b IFT_SMDSICIP = 0x34 IFT_SONET = 0x27 IFT_SONETOVERHEADCHANNEL = 0xb9 IFT_SONETPATH = 0x32 IFT_SONETVT = 0x33 IFT_SRP = 0x97 IFT_SS7SIGLINK = 0x9c IFT_STACKTOSTACK = 0x6f IFT_STARLAN = 0xb IFT_T1 = 0x12 IFT_TDLC = 0x74 IFT_TELINK = 0xc8 IFT_TERMPAD = 0x5b IFT_TR008 = 0xb0 IFT_TRANSPHDLC = 0x7b IFT_TUNNEL = 0x83 IFT_ULTRA = 0x1d IFT_USB = 0xa0 IFT_V11 = 0x40 IFT_V35 = 0x2d IFT_V36 = 0x41 IFT_V37 = 0x78 IFT_VDSL = 0x61 IFT_VIRTUALIPADDRESS = 0x70 IFT_VIRTUALTG = 0xca IFT_VOICEDID = 0xd5 IFT_VOICEEM = 0x64 IFT_VOICEEMFGD = 0xd3 IFT_VOICEENCAP = 0x67 IFT_VOICEFGDEANA = 0xd4 IFT_VOICEFXO = 0x65 IFT_VOICEFXS = 0x66 IFT_VOICEOVERATM = 0x98 IFT_VOICEOVERCABLE = 0xc6 IFT_VOICEOVERFRAMERELAY = 0x99 IFT_VOICEOVERIP = 0x68 IFT_X213 = 0x5d IFT_X25 = 0x5 IFT_X25DDN = 0x4 IFT_X25HUNTGROUP = 0x7a IFT_X25MLP = 0x79 IFT_X25PLE = 0x28 IFT_XETHER = 0x1a IGNBRK = 0x1 IGNCR = 0x80 IGNPAR = 0x4 IMAXBEL = 0x2000 INLCR = 0x40 INPCK = 0x10 IN_CLASSA_HOST = 0xffffff IN_CLASSA_MAX = 0x80 IN_CLASSA_NET = 0xff000000 IN_CLASSA_NSHIFT = 0x18 IN_CLASSB_HOST = 0xffff IN_CLASSB_MAX = 0x10000 IN_CLASSB_NET = 0xffff0000 IN_CLASSB_NSHIFT = 0x10 IN_CLASSC_HOST = 0xff IN_CLASSC_NET = 0xffffff00 IN_CLASSC_NSHIFT = 0x8 IN_CLASSD_HOST = 0xfffffff IN_CLASSD_NET = 0xf0000000 IN_CLASSD_NSHIFT = 0x1c IN_LOOPBACKNET = 0x7f IN_RFC3021_HOST = 0x1 IN_RFC3021_NET = 0xfffffffe IN_RFC3021_NSHIFT = 0x1f IPPROTO_AH = 0x33 IPPROTO_CARP = 0x70 IPPROTO_DIVERT = 0x102 IPPROTO_DIVERT_INIT = 0x2 IPPROTO_DIVERT_RESP = 0x1 IPPROTO_DONE = 0x101 IPPROTO_DSTOPTS = 0x3c IPPROTO_EGP = 0x8 IPPROTO_ENCAP = 0x62 IPPROTO_EON = 0x50 IPPROTO_ESP = 0x32 IPPROTO_ETHERIP = 0x61 IPPROTO_FRAGMENT = 0x2c IPPROTO_GGP = 0x3 IPPROTO_GRE = 0x2f IPPROTO_HOPOPTS = 0x0 IPPROTO_ICMP = 0x1 IPPROTO_ICMPV6 = 0x3a IPPROTO_IDP = 0x16 IPPROTO_IGMP = 0x2 IPPROTO_IP = 0x0 IPPROTO_IPCOMP = 0x6c IPPROTO_IPIP = 0x4 IPPROTO_IPV4 = 0x4 IPPROTO_IPV6 = 0x29 IPPROTO_MAX = 0x100 IPPROTO_MAXID = 0x103 IPPROTO_MOBILE = 0x37 IPPROTO_MPLS = 0x89 IPPROTO_NONE = 0x3b IPPROTO_PFSYNC = 0xf0 IPPROTO_PIM = 0x67 IPPROTO_PUP = 0xc IPPROTO_RAW = 0xff IPPROTO_ROUTING = 0x2b IPPROTO_RSVP = 0x2e IPPROTO_TCP = 0x6 IPPROTO_TP = 0x1d IPPROTO_UDP = 0x11 IPV6_AUTH_LEVEL = 0x35 IPV6_AUTOFLOWLABEL = 0x3b IPV6_CHECKSUM = 0x1a IPV6_DEFAULT_MULTICAST_HOPS = 0x1 IPV6_DEFAULT_MULTICAST_LOOP = 0x1 IPV6_DEFHLIM = 0x40 IPV6_DONTFRAG = 0x3e IPV6_DSTOPTS = 0x32 IPV6_ESP_NETWORK_LEVEL = 0x37 IPV6_ESP_TRANS_LEVEL = 0x36 IPV6_FAITH = 0x1d IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 IPV6_FRAGTTL = 0x78 IPV6_HLIMDEC = 0x1 IPV6_HOPLIMIT = 0x2f IPV6_HOPOPTS = 0x31 IPV6_IPCOMP_LEVEL = 0x3c IPV6_JOIN_GROUP = 0xc IPV6_LEAVE_GROUP = 0xd IPV6_MAXHLIM = 0xff IPV6_MAXPACKET = 0xffff IPV6_MMTU = 0x500 IPV6_MULTICAST_HOPS = 0xa IPV6_MULTICAST_IF = 0x9 IPV6_MULTICAST_LOOP = 0xb IPV6_NEXTHOP = 0x30 IPV6_OPTIONS = 0x1 IPV6_PATHMTU = 0x2c IPV6_PIPEX = 0x3f IPV6_PKTINFO = 0x2e IPV6_PORTRANGE = 0xe IPV6_PORTRANGE_DEFAULT = 0x0 IPV6_PORTRANGE_HIGH = 0x1 IPV6_PORTRANGE_LOW = 0x2 IPV6_RECVDSTOPTS = 0x28 IPV6_RECVDSTPORT = 0x40 IPV6_RECVHOPLIMIT = 0x25 IPV6_RECVHOPOPTS = 0x27 IPV6_RECVPATHMTU = 0x2b IPV6_RECVPKTINFO = 0x24 IPV6_RECVRTHDR = 0x26 IPV6_RECVTCLASS = 0x39 IPV6_RTABLE = 0x1021 IPV6_RTHDR = 0x33 IPV6_RTHDRDSTOPTS = 0x23 IPV6_RTHDR_LOOSE = 0x0 IPV6_RTHDR_STRICT = 0x1 IPV6_RTHDR_TYPE_0 = 0x0 IPV6_SOCKOPT_RESERVED1 = 0x3 IPV6_TCLASS = 0x3d IPV6_UNICAST_HOPS = 0x4 IPV6_USE_MIN_MTU = 0x2a IPV6_V6ONLY = 0x1b IPV6_VERSION = 0x60 IPV6_VERSION_MASK = 0xf0 IP_ADD_MEMBERSHIP = 0xc IP_AUTH_LEVEL = 0x14 IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 IP_DIVERTFL = 0x1022 IP_DROP_MEMBERSHIP = 0xd IP_ESP_NETWORK_LEVEL = 0x16 IP_ESP_TRANS_LEVEL = 0x15 IP_HDRINCL = 0x2 IP_IPCOMP_LEVEL = 0x1d IP_IPSECFLOWINFO = 0x24 IP_IPSEC_LOCAL_AUTH = 0x1b IP_IPSEC_LOCAL_CRED = 0x19 IP_IPSEC_LOCAL_ID = 0x17 IP_IPSEC_REMOTE_AUTH = 0x1c IP_IPSEC_REMOTE_CRED = 0x1a IP_IPSEC_REMOTE_ID = 0x18 IP_MAXPACKET = 0xffff IP_MAX_MEMBERSHIPS = 0xfff IP_MF = 0x2000 IP_MINTTL = 0x20 IP_MIN_MEMBERSHIPS = 0xf IP_MSS = 0x240 IP_MULTICAST_IF = 0x9 IP_MULTICAST_LOOP = 0xb IP_MULTICAST_TTL = 0xa IP_OFFMASK = 0x1fff IP_OPTIONS = 0x1 IP_PIPEX = 0x22 IP_PORTRANGE = 0x13 IP_PORTRANGE_DEFAULT = 0x0 IP_PORTRANGE_HIGH = 0x1 IP_PORTRANGE_LOW = 0x2 IP_RECVDSTADDR = 0x7 IP_RECVDSTPORT = 0x21 IP_RECVIF = 0x1e IP_RECVOPTS = 0x5 IP_RECVRETOPTS = 0x6 IP_RECVRTABLE = 0x23 IP_RECVTTL = 0x1f IP_RETOPTS = 0x8 IP_RF = 0x8000 IP_RTABLE = 0x1021 IP_TOS = 0x3 IP_TTL = 0x4 ISIG = 0x80 ISTRIP = 0x20 IXANY = 0x800 IXOFF = 0x400 IXON = 0x200 LCNT_OVERLOAD_FLUSH = 0x6 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 MADV_DONTNEED = 0x4 MADV_FREE = 0x6 MADV_NORMAL = 0x0 MADV_RANDOM = 0x1 MADV_SEQUENTIAL = 0x2 MADV_SPACEAVAIL = 0x5 MADV_WILLNEED = 0x3 MAP_ANON = 0x1000 MAP_ANONYMOUS = 0x1000 MAP_COPY = 0x2 MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_FLAGMASK = 0x3ff7 MAP_HASSEMAPHORE = 0x0 MAP_INHERIT = 0x0 MAP_INHERIT_COPY = 0x1 MAP_INHERIT_NONE = 0x2 MAP_INHERIT_SHARE = 0x0 MAP_INHERIT_ZERO = 0x3 MAP_NOEXTEND = 0x0 MAP_NORESERVE = 0x0 MAP_PRIVATE = 0x2 MAP_RENAME = 0x0 MAP_SHARED = 0x1 MAP_TRYFIXED = 0x0 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MSG_BCAST = 0x100 MSG_CMSG_CLOEXEC = 0x800 MSG_CTRUNC = 0x20 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x80 MSG_EOR = 0x8 MSG_MCAST = 0x200 MSG_NOSIGNAL = 0x400 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_TRUNC = 0x10 MSG_WAITALL = 0x40 MS_ASYNC = 0x1 MS_INVALIDATE = 0x4 MS_SYNC = 0x2 NAME_MAX = 0xff NET_RT_DUMP = 0x1 NET_RT_FLAGS = 0x2 NET_RT_IFLIST = 0x3 NET_RT_MAXID = 0x6 NET_RT_STATS = 0x4 NET_RT_TABLE = 0x5 NOFLSH = 0x80000000 NOTE_ATTRIB = 0x8 NOTE_CHILD = 0x4 NOTE_DELETE = 0x1 NOTE_EOF = 0x2 NOTE_EXEC = 0x20000000 NOTE_EXIT = 0x80000000 NOTE_EXTEND = 0x4 NOTE_FORK = 0x40000000 NOTE_LINK = 0x10 NOTE_LOWAT = 0x1 NOTE_PCTRLMASK = 0xf0000000 NOTE_PDATAMASK = 0xfffff NOTE_RENAME = 0x20 NOTE_REVOKE = 0x40 NOTE_TRACK = 0x1 NOTE_TRACKERR = 0x2 NOTE_TRUNCATE = 0x80 NOTE_WRITE = 0x2 OCRNL = 0x10 ONLCR = 0x2 ONLRET = 0x80 ONOCR = 0x40 ONOEOT = 0x8 OPOST = 0x1 O_ACCMODE = 0x3 O_APPEND = 0x8 O_ASYNC = 0x40 O_CLOEXEC = 0x10000 O_CREAT = 0x200 O_DIRECTORY = 0x20000 O_DSYNC = 0x80 O_EXCL = 0x800 O_EXLOCK = 0x20 O_FSYNC = 0x80 O_NDELAY = 0x4 O_NOCTTY = 0x8000 O_NOFOLLOW = 0x100 O_NONBLOCK = 0x4 O_RDONLY = 0x0 O_RDWR = 0x2 O_RSYNC = 0x80 O_SHLOCK = 0x10 O_SYNC = 0x80 O_TRUNC = 0x400 O_WRONLY = 0x1 PARENB = 0x1000 PARMRK = 0x8 PARODD = 0x2000 PENDIN = 0x20000000 PF_FLUSH = 0x1 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 PROT_EXEC = 0x4 PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 RLIMIT_NOFILE = 0x8 RLIMIT_STACK = 0x3 RLIM_INFINITY = 0x7fffffffffffffff RTAX_AUTHOR = 0x6 RTAX_BRD = 0x7 RTAX_DST = 0x0 RTAX_GATEWAY = 0x1 RTAX_GENMASK = 0x3 RTAX_IFA = 0x5 RTAX_IFP = 0x4 RTAX_LABEL = 0xa RTAX_MAX = 0xb RTAX_NETMASK = 0x2 RTAX_SRC = 0x8 RTAX_SRCMASK = 0x9 RTA_AUTHOR = 0x40 RTA_BRD = 0x80 RTA_DST = 0x1 RTA_GATEWAY = 0x2 RTA_GENMASK = 0x8 RTA_IFA = 0x20 RTA_IFP = 0x10 RTA_LABEL = 0x400 RTA_NETMASK = 0x4 RTA_SRC = 0x100 RTA_SRCMASK = 0x200 RTF_ANNOUNCE = 0x4000 RTF_BLACKHOLE = 0x1000 RTF_BROADCAST = 0x400000 RTF_CLONED = 0x10000 RTF_CLONING = 0x100 RTF_DONE = 0x40 RTF_DYNAMIC = 0x10 RTF_FMASK = 0x70f808 RTF_GATEWAY = 0x2 RTF_HOST = 0x4 RTF_LLINFO = 0x400 RTF_LOCAL = 0x200000 RTF_MASK = 0x80 RTF_MODIFIED = 0x20 RTF_MPATH = 0x40000 RTF_MPLS = 0x100000 RTF_PERMANENT_ARP = 0x2000 RTF_PROTO1 = 0x8000 RTF_PROTO2 = 0x4000 RTF_PROTO3 = 0x2000 RTF_REJECT = 0x8 RTF_STATIC = 0x800 RTF_UP = 0x1 RTF_USETRAILERS = 0x8000 RTF_XRESOLVE = 0x200 RTM_ADD = 0x1 RTM_CHANGE = 0x3 RTM_DELADDR = 0xd RTM_DELETE = 0x2 RTM_DESYNC = 0x10 RTM_GET = 0x4 RTM_IFANNOUNCE = 0xf RTM_IFINFO = 0xe RTM_LOCK = 0x8 RTM_LOSING = 0x5 RTM_MAXSIZE = 0x800 RTM_MISS = 0x7 RTM_NEWADDR = 0xc RTM_REDIRECT = 0x6 RTM_RESOLVE = 0xb RTM_RTTUNIT = 0xf4240 RTM_VERSION = 0x5 RTV_EXPIRE = 0x4 RTV_HOPCOUNT = 0x2 RTV_MTU = 0x1 RTV_RPIPE = 0x8 RTV_RTT = 0x40 RTV_RTTVAR = 0x80 RTV_SPIPE = 0x10 RTV_SSTHRESH = 0x20 RT_TABLEID_MAX = 0xff RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 RUSAGE_THREAD = 0x1 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x4 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 SIOCADDMULTI = 0x80206931 SIOCAIFADDR = 0x8040691a SIOCAIFGROUP = 0x80246987 SIOCALIFADDR = 0x8218691c SIOCATMARK = 0x40047307 SIOCBRDGADD = 0x8054693c SIOCBRDGADDS = 0x80546941 SIOCBRDGARL = 0x806e694d SIOCBRDGDADDR = 0x81286947 SIOCBRDGDEL = 0x8054693d SIOCBRDGDELS = 0x80546942 SIOCBRDGFLUSH = 0x80546948 SIOCBRDGFRL = 0x806e694e SIOCBRDGGCACHE = 0xc0146941 SIOCBRDGGFD = 0xc0146952 SIOCBRDGGHT = 0xc0146951 SIOCBRDGGIFFLGS = 0xc054693e SIOCBRDGGMA = 0xc0146953 SIOCBRDGGPARAM = 0xc03c6958 SIOCBRDGGPRI = 0xc0146950 SIOCBRDGGRL = 0xc028694f SIOCBRDGGSIFS = 0xc054693c SIOCBRDGGTO = 0xc0146946 SIOCBRDGIFS = 0xc0546942 SIOCBRDGRTS = 0xc0186943 SIOCBRDGSADDR = 0xc1286944 SIOCBRDGSCACHE = 0x80146940 SIOCBRDGSFD = 0x80146952 SIOCBRDGSHT = 0x80146951 SIOCBRDGSIFCOST = 0x80546955 SIOCBRDGSIFFLGS = 0x8054693f SIOCBRDGSIFPRIO = 0x80546954 SIOCBRDGSMA = 0x80146953 SIOCBRDGSPRI = 0x80146950 SIOCBRDGSPROTO = 0x8014695a SIOCBRDGSTO = 0x80146945 SIOCBRDGSTXHC = 0x80146959 SIOCDELMULTI = 0x80206932 SIOCDIFADDR = 0x80206919 SIOCDIFGROUP = 0x80246989 SIOCDIFPHYADDR = 0x80206949 SIOCDLIFADDR = 0x8218691e SIOCGETKALIVE = 0xc01869a4 SIOCGETLABEL = 0x8020699a SIOCGETPFLOW = 0xc02069fe SIOCGETPFSYNC = 0xc02069f8 SIOCGETSGCNT = 0xc0147534 SIOCGETVIFCNT = 0xc0147533 SIOCGETVLAN = 0xc0206990 SIOCGHIWAT = 0x40047301 SIOCGIFADDR = 0xc0206921 SIOCGIFASYNCMAP = 0xc020697c SIOCGIFBRDADDR = 0xc0206923 SIOCGIFCONF = 0xc0086924 SIOCGIFDATA = 0xc020691b SIOCGIFDESCR = 0xc0206981 SIOCGIFDSTADDR = 0xc0206922 SIOCGIFFLAGS = 0xc0206911 SIOCGIFGATTR = 0xc024698b SIOCGIFGENERIC = 0xc020693a SIOCGIFGMEMB = 0xc024698a SIOCGIFGROUP = 0xc0246988 SIOCGIFHARDMTU = 0xc02069a5 SIOCGIFMEDIA = 0xc0286936 SIOCGIFMETRIC = 0xc0206917 SIOCGIFMTU = 0xc020697e SIOCGIFNETMASK = 0xc0206925 SIOCGIFPDSTADDR = 0xc0206948 SIOCGIFPRIORITY = 0xc020699c SIOCGIFPSRCADDR = 0xc0206947 SIOCGIFRDOMAIN = 0xc02069a0 SIOCGIFRTLABEL = 0xc0206983 SIOCGIFRXR = 0x802069aa SIOCGIFTIMESLOT = 0xc0206986 SIOCGIFXFLAGS = 0xc020699e SIOCGLIFADDR = 0xc218691d SIOCGLIFPHYADDR = 0xc218694b SIOCGLIFPHYRTABLE = 0xc02069a2 SIOCGLIFPHYTTL = 0xc02069a9 SIOCGLOWAT = 0x40047303 SIOCGPGRP = 0x40047309 SIOCGSPPPPARAMS = 0xc0206994 SIOCGVH = 0xc02069f6 SIOCGVNETID = 0xc02069a7 SIOCIFCREATE = 0x8020697a SIOCIFDESTROY = 0x80206979 SIOCIFGCLONERS = 0xc00c6978 SIOCSETKALIVE = 0x801869a3 SIOCSETLABEL = 0x80206999 SIOCSETPFLOW = 0x802069fd SIOCSETPFSYNC = 0x802069f7 SIOCSETVLAN = 0x8020698f SIOCSHIWAT = 0x80047300 SIOCSIFADDR = 0x8020690c SIOCSIFASYNCMAP = 0x8020697d SIOCSIFBRDADDR = 0x80206913 SIOCSIFDESCR = 0x80206980 SIOCSIFDSTADDR = 0x8020690e SIOCSIFFLAGS = 0x80206910 SIOCSIFGATTR = 0x8024698c SIOCSIFGENERIC = 0x80206939 SIOCSIFLLADDR = 0x8020691f SIOCSIFMEDIA = 0xc0206935 SIOCSIFMETRIC = 0x80206918 SIOCSIFMTU = 0x8020697f SIOCSIFNETMASK = 0x80206916 SIOCSIFPHYADDR = 0x80406946 SIOCSIFPRIORITY = 0x8020699b SIOCSIFRDOMAIN = 0x8020699f SIOCSIFRTLABEL = 0x80206982 SIOCSIFTIMESLOT = 0x80206985 SIOCSIFXFLAGS = 0x8020699d SIOCSLIFPHYADDR = 0x8218694a SIOCSLIFPHYRTABLE = 0x802069a1 SIOCSLIFPHYTTL = 0x802069a8 SIOCSLOWAT = 0x80047302 SIOCSPGRP = 0x80047308 SIOCSSPPPPARAMS = 0x80206993 SIOCSVH = 0xc02069f5 SIOCSVNETID = 0x802069a6 SOCK_CLOEXEC = 0x8000 SOCK_DGRAM = 0x2 SOCK_NONBLOCK = 0x4000 SOCK_RAW = 0x3 SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x1 SOL_SOCKET = 0xffff SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x2 SO_BINDANY = 0x1000 SO_BROADCAST = 0x20 SO_DEBUG = 0x1 SO_DONTROUTE = 0x10 SO_ERROR = 0x1007 SO_KEEPALIVE = 0x8 SO_LINGER = 0x80 SO_NETPROC = 0x1020 SO_OOBINLINE = 0x100 SO_PEERCRED = 0x1022 SO_RCVBUF = 0x1002 SO_RCVLOWAT = 0x1004 SO_RCVTIMEO = 0x1006 SO_REUSEADDR = 0x4 SO_REUSEPORT = 0x200 SO_RTABLE = 0x1021 SO_SNDBUF = 0x1001 SO_SNDLOWAT = 0x1003 SO_SNDTIMEO = 0x1005 SO_SPLICE = 0x1023 SO_TIMESTAMP = 0x800 SO_TYPE = 0x1008 SO_USELOOPBACK = 0x40 TCIFLUSH = 0x1 TCIOFLUSH = 0x3 TCOFLUSH = 0x2 TCP_MAXBURST = 0x4 TCP_MAXSEG = 0x2 TCP_MAXWIN = 0xffff TCP_MAX_SACK = 0x3 TCP_MAX_WINSHIFT = 0xe TCP_MD5SIG = 0x4 TCP_MSS = 0x200 TCP_NODELAY = 0x1 TCP_NOPUSH = 0x10 TCP_NSTATES = 0xb TCP_SACK_ENABLE = 0x8 TCSAFLUSH = 0x2 TIOCCBRK = 0x2000747a TIOCCDTR = 0x20007478 TIOCCONS = 0x80047462 TIOCDRAIN = 0x2000745e TIOCEXCL = 0x2000740d TIOCEXT = 0x80047460 TIOCFLAG_CLOCAL = 0x2 TIOCFLAG_CRTSCTS = 0x4 TIOCFLAG_MDMBUF = 0x8 TIOCFLAG_PPS = 0x10 TIOCFLAG_SOFTCAR = 0x1 TIOCFLUSH = 0x80047410 TIOCGETA = 0x402c7413 TIOCGETD = 0x4004741a TIOCGFLAGS = 0x4004745d TIOCGPGRP = 0x40047477 TIOCGSID = 0x40047463 TIOCGTSTAMP = 0x400c745b TIOCGWINSZ = 0x40087468 TIOCMBIC = 0x8004746b TIOCMBIS = 0x8004746c TIOCMGET = 0x4004746a TIOCMODG = 0x4004746a TIOCMODS = 0x8004746d TIOCMSET = 0x8004746d TIOCM_CAR = 0x40 TIOCM_CD = 0x40 TIOCM_CTS = 0x20 TIOCM_DSR = 0x100 TIOCM_DTR = 0x2 TIOCM_LE = 0x1 TIOCM_RI = 0x80 TIOCM_RNG = 0x80 TIOCM_RTS = 0x4 TIOCM_SR = 0x10 TIOCM_ST = 0x8 TIOCNOTTY = 0x20007471 TIOCNXCL = 0x2000740e TIOCOUTQ = 0x40047473 TIOCPKT = 0x80047470 TIOCPKT_DATA = 0x0 TIOCPKT_DOSTOP = 0x20 TIOCPKT_FLUSHREAD = 0x1 TIOCPKT_FLUSHWRITE = 0x2 TIOCPKT_IOCTL = 0x40 TIOCPKT_NOSTOP = 0x10 TIOCPKT_START = 0x8 TIOCPKT_STOP = 0x4 TIOCREMOTE = 0x80047469 TIOCSBRK = 0x2000747b TIOCSCTTY = 0x20007461 TIOCSDTR = 0x20007479 TIOCSETA = 0x802c7414 TIOCSETAF = 0x802c7416 TIOCSETAW = 0x802c7415 TIOCSETD = 0x8004741b TIOCSFLAGS = 0x8004745c TIOCSIG = 0x8004745f TIOCSPGRP = 0x80047476 TIOCSTART = 0x2000746e TIOCSTAT = 0x80047465 TIOCSTI = 0x80017472 TIOCSTOP = 0x2000746f TIOCSTSTAMP = 0x8008745a TIOCSWINSZ = 0x80087467 TIOCUCNTL = 0x80047466 TOSTOP = 0x400000 VDISCARD = 0xf VDSUSP = 0xb VEOF = 0x0 VEOL = 0x1 VEOL2 = 0x2 VERASE = 0x3 VINTR = 0x8 VKILL = 0x5 VLNEXT = 0xe VMIN = 0x10 VQUIT = 0x9 VREPRINT = 0x6 VSTART = 0xc VSTATUS = 0x12 VSTOP = 0xd VSUSP = 0xa VTIME = 0x11 VWERASE = 0x4 WALTSIG = 0x4 WCONTINUED = 0x8 WCOREFLAG = 0x80 WNOHANG = 0x1 WUNTRACED = 0x2 ) // Errors const ( E2BIG = syscall.Errno(0x7) EACCES = syscall.Errno(0xd) EADDRINUSE = syscall.Errno(0x30) EADDRNOTAVAIL = syscall.Errno(0x31) EAFNOSUPPORT = syscall.Errno(0x2f) EAGAIN = syscall.Errno(0x23) EALREADY = syscall.Errno(0x25) EAUTH = syscall.Errno(0x50) EBADF = syscall.Errno(0x9) EBADRPC = syscall.Errno(0x48) EBUSY = syscall.Errno(0x10) ECANCELED = syscall.Errno(0x58) ECHILD = syscall.Errno(0xa) ECONNABORTED = syscall.Errno(0x35) ECONNREFUSED = syscall.Errno(0x3d) ECONNRESET = syscall.Errno(0x36) EDEADLK = syscall.Errno(0xb) EDESTADDRREQ = syscall.Errno(0x27) EDOM = syscall.Errno(0x21) EDQUOT = syscall.Errno(0x45) EEXIST = syscall.Errno(0x11) EFAULT = syscall.Errno(0xe) EFBIG = syscall.Errno(0x1b) EFTYPE = syscall.Errno(0x4f) EHOSTDOWN = syscall.Errno(0x40) EHOSTUNREACH = syscall.Errno(0x41) EIDRM = syscall.Errno(0x59) EILSEQ = syscall.Errno(0x54) EINPROGRESS = syscall.Errno(0x24) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EIPSEC = syscall.Errno(0x52) EISCONN = syscall.Errno(0x38) EISDIR = syscall.Errno(0x15) ELAST = syscall.Errno(0x5b) ELOOP = syscall.Errno(0x3e) EMEDIUMTYPE = syscall.Errno(0x56) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) EMSGSIZE = syscall.Errno(0x28) ENAMETOOLONG = syscall.Errno(0x3f) ENEEDAUTH = syscall.Errno(0x51) ENETDOWN = syscall.Errno(0x32) ENETRESET = syscall.Errno(0x34) ENETUNREACH = syscall.Errno(0x33) ENFILE = syscall.Errno(0x17) ENOATTR = syscall.Errno(0x53) ENOBUFS = syscall.Errno(0x37) ENODEV = syscall.Errno(0x13) ENOENT = syscall.Errno(0x2) ENOEXEC = syscall.Errno(0x8) ENOLCK = syscall.Errno(0x4d) ENOMEDIUM = syscall.Errno(0x55) ENOMEM = syscall.Errno(0xc) ENOMSG = syscall.Errno(0x5a) ENOPROTOOPT = syscall.Errno(0x2a) ENOSPC = syscall.Errno(0x1c) ENOSYS = syscall.Errno(0x4e) ENOTBLK = syscall.Errno(0xf) ENOTCONN = syscall.Errno(0x39) ENOTDIR = syscall.Errno(0x14) ENOTEMPTY = syscall.Errno(0x42) ENOTSOCK = syscall.Errno(0x26) ENOTSUP = syscall.Errno(0x5b) ENOTTY = syscall.Errno(0x19) ENXIO = syscall.Errno(0x6) EOPNOTSUPP = syscall.Errno(0x2d) EOVERFLOW = syscall.Errno(0x57) EPERM = syscall.Errno(0x1) EPFNOSUPPORT = syscall.Errno(0x2e) EPIPE = syscall.Errno(0x20) EPROCLIM = syscall.Errno(0x43) EPROCUNAVAIL = syscall.Errno(0x4c) EPROGMISMATCH = syscall.Errno(0x4b) EPROGUNAVAIL = syscall.Errno(0x4a) EPROTONOSUPPORT = syscall.Errno(0x2b) EPROTOTYPE = syscall.Errno(0x29) ERANGE = syscall.Errno(0x22) EREMOTE = syscall.Errno(0x47) EROFS = syscall.Errno(0x1e) ERPCMISMATCH = syscall.Errno(0x49) ESHUTDOWN = syscall.Errno(0x3a) ESOCKTNOSUPPORT = syscall.Errno(0x2c) ESPIPE = syscall.Errno(0x1d) ESRCH = syscall.Errno(0x3) ESTALE = syscall.Errno(0x46) ETIMEDOUT = syscall.Errno(0x3c) ETOOMANYREFS = syscall.Errno(0x3b) ETXTBSY = syscall.Errno(0x1a) EUSERS = syscall.Errno(0x44) EWOULDBLOCK = syscall.Errno(0x23) EXDEV = syscall.Errno(0x12) ) // Signals const ( SIGABRT = syscall.Signal(0x6) SIGALRM = syscall.Signal(0xe) SIGBUS = syscall.Signal(0xa) SIGCHLD = syscall.Signal(0x14) SIGCONT = syscall.Signal(0x13) SIGEMT = syscall.Signal(0x7) SIGFPE = syscall.Signal(0x8) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) SIGINFO = syscall.Signal(0x1d) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x17) SIGIOT = syscall.Signal(0x6) SIGKILL = syscall.Signal(0x9) SIGPIPE = syscall.Signal(0xd) SIGPROF = syscall.Signal(0x1b) SIGQUIT = syscall.Signal(0x3) SIGSEGV = syscall.Signal(0xb) SIGSTOP = syscall.Signal(0x11) SIGSYS = syscall.Signal(0xc) SIGTERM = syscall.Signal(0xf) SIGTHR = syscall.Signal(0x20) SIGTRAP = syscall.Signal(0x5) SIGTSTP = syscall.Signal(0x12) SIGTTIN = syscall.Signal(0x15) SIGTTOU = syscall.Signal(0x16) SIGURG = syscall.Signal(0x10) SIGUSR1 = syscall.Signal(0x1e) SIGUSR2 = syscall.Signal(0x1f) SIGVTALRM = syscall.Signal(0x1a) SIGWINCH = syscall.Signal(0x1c) SIGXCPU = syscall.Signal(0x18) SIGXFSZ = syscall.Signal(0x19) ) // Error table var errors = [...]string{ 1: "operation not permitted", 2: "no such file or directory", 3: "no such process", 4: "interrupted system call", 5: "input/output error", 6: "device not configured", 7: "argument list too long", 8: "exec format error", 9: "bad file descriptor", 10: "no child processes", 11: "resource deadlock avoided", 12: "cannot allocate memory", 13: "permission denied", 14: "bad address", 15: "block device required", 16: "device busy", 17: "file exists", 18: "cross-device link", 19: "operation not supported by device", 20: "not a directory", 21: "is a directory", 22: "invalid argument", 23: "too many open files in system", 24: "too many open files", 25: "inappropriate ioctl for device", 26: "text file busy", 27: "file too large", 28: "no space left on device", 29: "illegal seek", 30: "read-only file system", 31: "too many links", 32: "broken pipe", 33: "numerical argument out of domain", 34: "result too large", 35: "resource temporarily unavailable", 36: "operation now in progress", 37: "operation already in progress", 38: "socket operation on non-socket", 39: "destination address required", 40: "message too long", 41: "protocol wrong type for socket", 42: "protocol not available", 43: "protocol not supported", 44: "socket type not supported", 45: "operation not supported", 46: "protocol family not supported", 47: "address family not supported by protocol family", 48: "address already in use", 49: "can't assign requested address", 50: "network is down", 51: "network is unreachable", 52: "network dropped connection on reset", 53: "software caused connection abort", 54: "connection reset by peer", 55: "no buffer space available", 56: "socket is already connected", 57: "socket is not connected", 58: "can't send after socket shutdown", 59: "too many references: can't splice", 60: "connection timed out", 61: "connection refused", 62: "too many levels of symbolic links", 63: "file name too long", 64: "host is down", 65: "no route to host", 66: "directory not empty", 67: "too many processes", 68: "too many users", 69: "disc quota exceeded", 70: "stale NFS file handle", 71: "too many levels of remote in path", 72: "RPC struct is bad", 73: "RPC version wrong", 74: "RPC prog. not avail", 75: "program version wrong", 76: "bad procedure for program", 77: "no locks available", 78: "function not implemented", 79: "inappropriate file type or format", 80: "authentication error", 81: "need authenticator", 82: "IPsec processing failure", 83: "attribute not found", 84: "illegal byte sequence", 85: "no medium found", 86: "wrong medium type", 87: "value too large to be stored in data type", 88: "operation canceled", 89: "identifier removed", 90: "no message of desired type", 91: "not supported", } // Signal table var signals = [...]string{ 1: "hangup", 2: "interrupt", 3: "quit", 4: "illegal instruction", 5: "trace/BPT trap", 6: "abort trap", 7: "EMT trap", 8: "floating point exception", 9: "killed", 10: "bus error", 11: "segmentation fault", 12: "bad system call", 13: "broken pipe", 14: "alarm clock", 15: "terminated", 16: "urgent I/O condition", 17: "stopped (signal)", 18: "stopped", 19: "continued", 20: "child exited", 21: "stopped (tty input)", 22: "stopped (tty output)", 23: "I/O possible", 24: "cputime limit exceeded", 25: "filesize limit exceeded", 26: "virtual timer expired", 27: "profiling timer expired", 28: "window size changes", 29: "information request", 30: "user defined signal 1", 31: "user defined signal 2", 32: "thread AST", } ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go ================================================ // mkerrors.sh -m64 // Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,solaris // Created by cgo -godefs - DO NOT EDIT // cgo -godefs -- -m64 _const.go package unix import "syscall" const ( AF_802 = 0x12 AF_APPLETALK = 0x10 AF_CCITT = 0xa AF_CHAOS = 0x5 AF_DATAKIT = 0x9 AF_DECnet = 0xc AF_DLI = 0xd AF_ECMA = 0x8 AF_FILE = 0x1 AF_GOSIP = 0x16 AF_HYLINK = 0xf AF_IMPLINK = 0x3 AF_INET = 0x2 AF_INET6 = 0x1a AF_INET_OFFLOAD = 0x1e AF_IPX = 0x17 AF_KEY = 0x1b AF_LAT = 0xe AF_LINK = 0x19 AF_LOCAL = 0x1 AF_MAX = 0x20 AF_NBS = 0x7 AF_NCA = 0x1c AF_NIT = 0x11 AF_NS = 0x6 AF_OSI = 0x13 AF_OSINET = 0x15 AF_PACKET = 0x20 AF_POLICY = 0x1d AF_PUP = 0x4 AF_ROUTE = 0x18 AF_SNA = 0xb AF_TRILL = 0x1f AF_UNIX = 0x1 AF_UNSPEC = 0x0 AF_X25 = 0x14 ARPHRD_ARCNET = 0x7 ARPHRD_ATM = 0x10 ARPHRD_AX25 = 0x3 ARPHRD_CHAOS = 0x5 ARPHRD_EETHER = 0x2 ARPHRD_ETHER = 0x1 ARPHRD_FC = 0x12 ARPHRD_FRAME = 0xf ARPHRD_HDLC = 0x11 ARPHRD_IB = 0x20 ARPHRD_IEEE802 = 0x6 ARPHRD_IPATM = 0x13 ARPHRD_METRICOM = 0x17 ARPHRD_TUNNEL = 0x1f B0 = 0x0 B110 = 0x3 B115200 = 0x12 B1200 = 0x9 B134 = 0x4 B150 = 0x5 B153600 = 0x13 B1800 = 0xa B19200 = 0xe B200 = 0x6 B230400 = 0x14 B2400 = 0xb B300 = 0x7 B307200 = 0x15 B38400 = 0xf B460800 = 0x16 B4800 = 0xc B50 = 0x1 B57600 = 0x10 B600 = 0x8 B75 = 0x2 B76800 = 0x11 B921600 = 0x17 B9600 = 0xd BIOCFLUSH = 0x20004268 BIOCGBLEN = 0x40044266 BIOCGDLT = 0x4004426a BIOCGDLTLIST = -0x3fefbd89 BIOCGDLTLIST32 = -0x3ff7bd89 BIOCGETIF = 0x4020426b BIOCGETLIF = 0x4078426b BIOCGHDRCMPLT = 0x40044274 BIOCGRTIMEOUT = 0x4010427b BIOCGRTIMEOUT32 = 0x4008427b BIOCGSEESENT = 0x40044278 BIOCGSTATS = 0x4080426f BIOCGSTATSOLD = 0x4008426f BIOCIMMEDIATE = -0x7ffbbd90 BIOCPROMISC = 0x20004269 BIOCSBLEN = -0x3ffbbd9a BIOCSDLT = -0x7ffbbd8a BIOCSETF = -0x7fefbd99 BIOCSETF32 = -0x7ff7bd99 BIOCSETIF = -0x7fdfbd94 BIOCSETLIF = -0x7f87bd94 BIOCSHDRCMPLT = -0x7ffbbd8b BIOCSRTIMEOUT = -0x7fefbd86 BIOCSRTIMEOUT32 = -0x7ff7bd86 BIOCSSEESENT = -0x7ffbbd87 BIOCSTCPF = -0x7fefbd8e BIOCSUDPF = -0x7fefbd8d BIOCVERSION = 0x40044271 BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 BPF_ALIGNMENT = 0x4 BPF_ALU = 0x4 BPF_AND = 0x50 BPF_B = 0x10 BPF_DFLTBUFSIZE = 0x100000 BPF_DIV = 0x30 BPF_H = 0x8 BPF_IMM = 0x0 BPF_IND = 0x40 BPF_JA = 0x0 BPF_JEQ = 0x10 BPF_JGE = 0x30 BPF_JGT = 0x20 BPF_JMP = 0x5 BPF_JSET = 0x40 BPF_K = 0x0 BPF_LD = 0x0 BPF_LDX = 0x1 BPF_LEN = 0x80 BPF_LSH = 0x60 BPF_MAJOR_VERSION = 0x1 BPF_MAXBUFSIZE = 0x1000000 BPF_MAXINSNS = 0x200 BPF_MEM = 0x60 BPF_MEMWORDS = 0x10 BPF_MINBUFSIZE = 0x20 BPF_MINOR_VERSION = 0x1 BPF_MISC = 0x7 BPF_MSH = 0xa0 BPF_MUL = 0x20 BPF_NEG = 0x80 BPF_OR = 0x40 BPF_RELEASE = 0x30bb6 BPF_RET = 0x6 BPF_RSH = 0x70 BPF_ST = 0x2 BPF_STX = 0x3 BPF_SUB = 0x10 BPF_TAX = 0x0 BPF_TXA = 0x80 BPF_W = 0x0 BPF_X = 0x8 BRKINT = 0x2 BS0 = 0x0 BS1 = 0x2000 BSDLY = 0x2000 CBAUD = 0xf CFLUSH = 0xf CIBAUD = 0xf0000 CLOCAL = 0x800 CLOCK_HIGHRES = 0x4 CLOCK_LEVEL = 0xa CLOCK_MONOTONIC = 0x4 CLOCK_PROCESS_CPUTIME_ID = 0x5 CLOCK_PROF = 0x2 CLOCK_REALTIME = 0x3 CLOCK_THREAD_CPUTIME_ID = 0x2 CLOCK_VIRTUAL = 0x1 CR0 = 0x0 CR1 = 0x200 CR2 = 0x400 CR3 = 0x600 CRDLY = 0x600 CREAD = 0x80 CRTSCTS = 0x80000000 CS5 = 0x0 CS6 = 0x10 CS7 = 0x20 CS8 = 0x30 CSIZE = 0x30 CSTART = 0x11 CSTATUS = 0x14 CSTOP = 0x13 CSTOPB = 0x40 CSUSP = 0x1a CSWTCH = 0x1a DLT_AIRONET_HEADER = 0x78 DLT_APPLE_IP_OVER_IEEE1394 = 0x8a DLT_ARCNET = 0x7 DLT_ARCNET_LINUX = 0x81 DLT_ATM_CLIP = 0x13 DLT_ATM_RFC1483 = 0xb DLT_AURORA = 0x7e DLT_AX25 = 0x3 DLT_BACNET_MS_TP = 0xa5 DLT_CHAOS = 0x5 DLT_CISCO_IOS = 0x76 DLT_C_HDLC = 0x68 DLT_DOCSIS = 0x8f DLT_ECONET = 0x73 DLT_EN10MB = 0x1 DLT_EN3MB = 0x2 DLT_ENC = 0x6d DLT_ERF_ETH = 0xaf DLT_ERF_POS = 0xb0 DLT_FDDI = 0xa DLT_FRELAY = 0x6b DLT_GCOM_SERIAL = 0xad DLT_GCOM_T1E1 = 0xac DLT_GPF_F = 0xab DLT_GPF_T = 0xaa DLT_GPRS_LLC = 0xa9 DLT_HDLC = 0x10 DLT_HHDLC = 0x79 DLT_HIPPI = 0xf DLT_IBM_SN = 0x92 DLT_IBM_SP = 0x91 DLT_IEEE802 = 0x6 DLT_IEEE802_11 = 0x69 DLT_IEEE802_11_RADIO = 0x7f DLT_IEEE802_11_RADIO_AVS = 0xa3 DLT_IPNET = 0xe2 DLT_IPOIB = 0xa2 DLT_IP_OVER_FC = 0x7a DLT_JUNIPER_ATM1 = 0x89 DLT_JUNIPER_ATM2 = 0x87 DLT_JUNIPER_CHDLC = 0xb5 DLT_JUNIPER_ES = 0x84 DLT_JUNIPER_ETHER = 0xb2 DLT_JUNIPER_FRELAY = 0xb4 DLT_JUNIPER_GGSN = 0x85 DLT_JUNIPER_MFR = 0x86 DLT_JUNIPER_MLFR = 0x83 DLT_JUNIPER_MLPPP = 0x82 DLT_JUNIPER_MONITOR = 0xa4 DLT_JUNIPER_PIC_PEER = 0xae DLT_JUNIPER_PPP = 0xb3 DLT_JUNIPER_PPPOE = 0xa7 DLT_JUNIPER_PPPOE_ATM = 0xa8 DLT_JUNIPER_SERVICES = 0x88 DLT_LINUX_IRDA = 0x90 DLT_LINUX_LAPD = 0xb1 DLT_LINUX_SLL = 0x71 DLT_LOOP = 0x6c DLT_LTALK = 0x72 DLT_MTP2 = 0x8c DLT_MTP2_WITH_PHDR = 0x8b DLT_MTP3 = 0x8d DLT_NULL = 0x0 DLT_PCI_EXP = 0x7d DLT_PFLOG = 0x75 DLT_PFSYNC = 0x12 DLT_PPP = 0x9 DLT_PPP_BSDOS = 0xe DLT_PPP_PPPD = 0xa6 DLT_PRISM_HEADER = 0x77 DLT_PRONET = 0x4 DLT_RAW = 0xc DLT_RAWAF_MASK = 0x2240000 DLT_RIO = 0x7c DLT_SCCP = 0x8e DLT_SLIP = 0x8 DLT_SLIP_BSDOS = 0xd DLT_SUNATM = 0x7b DLT_SYMANTEC_FIREWALL = 0x63 DLT_TZSP = 0x80 ECHO = 0x8 ECHOCTL = 0x200 ECHOE = 0x10 ECHOK = 0x20 ECHOKE = 0x800 ECHONL = 0x40 ECHOPRT = 0x400 EMPTY_SET = 0x0 EMT_CPCOVF = 0x1 EQUALITY_CHECK = 0x0 EXTA = 0xe EXTB = 0xf FD_CLOEXEC = 0x1 FD_NFDBITS = 0x40 FD_SETSIZE = 0x10000 FF0 = 0x0 FF1 = 0x8000 FFDLY = 0x8000 FLUSHALL = 0x1 FLUSHDATA = 0x0 FLUSHO = 0x2000 F_ALLOCSP = 0xa F_ALLOCSP64 = 0xa F_BADFD = 0x2e F_BLKSIZE = 0x13 F_BLOCKS = 0x12 F_CHKFL = 0x8 F_COMPAT = 0x8 F_DUP2FD = 0x9 F_DUP2FD_CLOEXEC = 0x24 F_DUPFD = 0x0 F_DUPFD_CLOEXEC = 0x25 F_FLOCK = 0x35 F_FLOCK64 = 0x35 F_FLOCKW = 0x36 F_FLOCKW64 = 0x36 F_FREESP = 0xb F_FREESP64 = 0xb F_GETFD = 0x1 F_GETFL = 0x3 F_GETLK = 0xe F_GETLK64 = 0xe F_GETOWN = 0x17 F_GETXFL = 0x2d F_HASREMOTELOCKS = 0x1a F_ISSTREAM = 0xd F_MANDDNY = 0x10 F_MDACC = 0x20 F_NODNY = 0x0 F_NPRIV = 0x10 F_OFD_GETLK = 0x2f F_OFD_GETLK64 = 0x2f F_OFD_SETLK = 0x30 F_OFD_SETLK64 = 0x30 F_OFD_SETLKW = 0x31 F_OFD_SETLKW64 = 0x31 F_PRIV = 0xf F_QUOTACTL = 0x11 F_RDACC = 0x1 F_RDDNY = 0x1 F_RDLCK = 0x1 F_REVOKE = 0x19 F_RMACC = 0x4 F_RMDNY = 0x4 F_RWACC = 0x3 F_RWDNY = 0x3 F_SETFD = 0x2 F_SETFL = 0x4 F_SETLK = 0x6 F_SETLK64 = 0x6 F_SETLK64_NBMAND = 0x2a F_SETLKW = 0x7 F_SETLKW64 = 0x7 F_SETLK_NBMAND = 0x2a F_SETOWN = 0x18 F_SHARE = 0x28 F_SHARE_NBMAND = 0x2b F_UNLCK = 0x3 F_UNLKSYS = 0x4 F_UNSHARE = 0x29 F_WRACC = 0x2 F_WRDNY = 0x2 F_WRLCK = 0x2 HUPCL = 0x400 IBSHIFT = 0x10 ICANON = 0x2 ICRNL = 0x100 IEXTEN = 0x8000 IFF_ADDRCONF = 0x80000 IFF_ALLMULTI = 0x200 IFF_ANYCAST = 0x400000 IFF_BROADCAST = 0x2 IFF_CANTCHANGE = 0x7f203003b5a IFF_COS_ENABLED = 0x200000000 IFF_DEBUG = 0x4 IFF_DEPRECATED = 0x40000 IFF_DHCPRUNNING = 0x4000 IFF_DUPLICATE = 0x4000000000 IFF_FAILED = 0x10000000 IFF_FIXEDMTU = 0x1000000000 IFF_INACTIVE = 0x40000000 IFF_INTELLIGENT = 0x400 IFF_IPMP = 0x8000000000 IFF_IPMP_CANTCHANGE = 0x10000000 IFF_IPMP_INVALID = 0x1ec200080 IFF_IPV4 = 0x1000000 IFF_IPV6 = 0x2000000 IFF_L3PROTECT = 0x40000000000 IFF_LOOPBACK = 0x8 IFF_MULTICAST = 0x800 IFF_MULTI_BCAST = 0x1000 IFF_NOACCEPT = 0x4000000 IFF_NOARP = 0x80 IFF_NOFAILOVER = 0x8000000 IFF_NOLINKLOCAL = 0x20000000000 IFF_NOLOCAL = 0x20000 IFF_NONUD = 0x200000 IFF_NORTEXCH = 0x800000 IFF_NOTRAILERS = 0x20 IFF_NOXMIT = 0x10000 IFF_OFFLINE = 0x80000000 IFF_POINTOPOINT = 0x10 IFF_PREFERRED = 0x400000000 IFF_PRIVATE = 0x8000 IFF_PROMISC = 0x100 IFF_ROUTER = 0x100000 IFF_RUNNING = 0x40 IFF_STANDBY = 0x20000000 IFF_TEMPORARY = 0x800000000 IFF_UNNUMBERED = 0x2000 IFF_UP = 0x1 IFF_VIRTUAL = 0x2000000000 IFF_VRRP = 0x10000000000 IFF_XRESOLV = 0x100000000 IFNAMSIZ = 0x10 IFT_1822 = 0x2 IFT_6TO4 = 0xca IFT_AAL5 = 0x31 IFT_ARCNET = 0x23 IFT_ARCNETPLUS = 0x24 IFT_ATM = 0x25 IFT_CEPT = 0x13 IFT_DS3 = 0x1e IFT_EON = 0x19 IFT_ETHER = 0x6 IFT_FDDI = 0xf IFT_FRELAY = 0x20 IFT_FRELAYDCE = 0x2c IFT_HDH1822 = 0x3 IFT_HIPPI = 0x2f IFT_HSSI = 0x2e IFT_HY = 0xe IFT_IB = 0xc7 IFT_IPV4 = 0xc8 IFT_IPV6 = 0xc9 IFT_ISDNBASIC = 0x14 IFT_ISDNPRIMARY = 0x15 IFT_ISO88022LLC = 0x29 IFT_ISO88023 = 0x7 IFT_ISO88024 = 0x8 IFT_ISO88025 = 0x9 IFT_ISO88026 = 0xa IFT_LAPB = 0x10 IFT_LOCALTALK = 0x2a IFT_LOOP = 0x18 IFT_MIOX25 = 0x26 IFT_MODEM = 0x30 IFT_NSIP = 0x1b IFT_OTHER = 0x1 IFT_P10 = 0xc IFT_P80 = 0xd IFT_PARA = 0x22 IFT_PPP = 0x17 IFT_PROPMUX = 0x36 IFT_PROPVIRTUAL = 0x35 IFT_PTPSERIAL = 0x16 IFT_RS232 = 0x21 IFT_SDLC = 0x11 IFT_SIP = 0x1f IFT_SLIP = 0x1c IFT_SMDSDXI = 0x2b IFT_SMDSICIP = 0x34 IFT_SONET = 0x27 IFT_SONETPATH = 0x32 IFT_SONETVT = 0x33 IFT_STARLAN = 0xb IFT_T1 = 0x12 IFT_ULTRA = 0x1d IFT_V35 = 0x2d IFT_X25 = 0x5 IFT_X25DDN = 0x4 IFT_X25PLE = 0x28 IFT_XETHER = 0x1a IGNBRK = 0x1 IGNCR = 0x80 IGNPAR = 0x4 IMAXBEL = 0x2000 INLCR = 0x40 INPCK = 0x10 IN_AUTOCONF_MASK = 0xffff0000 IN_AUTOCONF_NET = 0xa9fe0000 IN_CLASSA_HOST = 0xffffff IN_CLASSA_MAX = 0x80 IN_CLASSA_NET = 0xff000000 IN_CLASSA_NSHIFT = 0x18 IN_CLASSB_HOST = 0xffff IN_CLASSB_MAX = 0x10000 IN_CLASSB_NET = 0xffff0000 IN_CLASSB_NSHIFT = 0x10 IN_CLASSC_HOST = 0xff IN_CLASSC_NET = 0xffffff00 IN_CLASSC_NSHIFT = 0x8 IN_CLASSD_HOST = 0xfffffff IN_CLASSD_NET = 0xf0000000 IN_CLASSD_NSHIFT = 0x1c IN_CLASSE_NET = 0xffffffff IN_LOOPBACKNET = 0x7f IN_PRIVATE12_MASK = 0xfff00000 IN_PRIVATE12_NET = 0xac100000 IN_PRIVATE16_MASK = 0xffff0000 IN_PRIVATE16_NET = 0xc0a80000 IN_PRIVATE8_MASK = 0xff000000 IN_PRIVATE8_NET = 0xa000000 IPPROTO_AH = 0x33 IPPROTO_DSTOPTS = 0x3c IPPROTO_EGP = 0x8 IPPROTO_ENCAP = 0x4 IPPROTO_EON = 0x50 IPPROTO_ESP = 0x32 IPPROTO_FRAGMENT = 0x2c IPPROTO_GGP = 0x3 IPPROTO_HELLO = 0x3f IPPROTO_HOPOPTS = 0x0 IPPROTO_ICMP = 0x1 IPPROTO_ICMPV6 = 0x3a IPPROTO_IDP = 0x16 IPPROTO_IGMP = 0x2 IPPROTO_IP = 0x0 IPPROTO_IPV6 = 0x29 IPPROTO_MAX = 0x100 IPPROTO_ND = 0x4d IPPROTO_NONE = 0x3b IPPROTO_OSPF = 0x59 IPPROTO_PIM = 0x67 IPPROTO_PUP = 0xc IPPROTO_RAW = 0xff IPPROTO_ROUTING = 0x2b IPPROTO_RSVP = 0x2e IPPROTO_SCTP = 0x84 IPPROTO_TCP = 0x6 IPPROTO_UDP = 0x11 IPV6_ADD_MEMBERSHIP = 0x9 IPV6_BOUND_IF = 0x41 IPV6_CHECKSUM = 0x18 IPV6_DONTFRAG = 0x21 IPV6_DROP_MEMBERSHIP = 0xa IPV6_DSTOPTS = 0xf IPV6_FLOWINFO_FLOWLABEL = 0xffff0f00 IPV6_FLOWINFO_TCLASS = 0xf00f IPV6_HOPLIMIT = 0xc IPV6_HOPOPTS = 0xe IPV6_JOIN_GROUP = 0x9 IPV6_LEAVE_GROUP = 0xa IPV6_MULTICAST_HOPS = 0x7 IPV6_MULTICAST_IF = 0x6 IPV6_MULTICAST_LOOP = 0x8 IPV6_NEXTHOP = 0xd IPV6_PAD1_OPT = 0x0 IPV6_PATHMTU = 0x25 IPV6_PKTINFO = 0xb IPV6_PREFER_SRC_CGA = 0x20 IPV6_PREFER_SRC_CGADEFAULT = 0x10 IPV6_PREFER_SRC_CGAMASK = 0x30 IPV6_PREFER_SRC_COA = 0x2 IPV6_PREFER_SRC_DEFAULT = 0x15 IPV6_PREFER_SRC_HOME = 0x1 IPV6_PREFER_SRC_MASK = 0x3f IPV6_PREFER_SRC_MIPDEFAULT = 0x1 IPV6_PREFER_SRC_MIPMASK = 0x3 IPV6_PREFER_SRC_NONCGA = 0x10 IPV6_PREFER_SRC_PUBLIC = 0x4 IPV6_PREFER_SRC_TMP = 0x8 IPV6_PREFER_SRC_TMPDEFAULT = 0x4 IPV6_PREFER_SRC_TMPMASK = 0xc IPV6_RECVDSTOPTS = 0x28 IPV6_RECVHOPLIMIT = 0x13 IPV6_RECVHOPOPTS = 0x14 IPV6_RECVPATHMTU = 0x24 IPV6_RECVPKTINFO = 0x12 IPV6_RECVRTHDR = 0x16 IPV6_RECVRTHDRDSTOPTS = 0x17 IPV6_RECVTCLASS = 0x19 IPV6_RTHDR = 0x10 IPV6_RTHDRDSTOPTS = 0x11 IPV6_RTHDR_TYPE_0 = 0x0 IPV6_SEC_OPT = 0x22 IPV6_SRC_PREFERENCES = 0x23 IPV6_TCLASS = 0x26 IPV6_UNICAST_HOPS = 0x5 IPV6_UNSPEC_SRC = 0x42 IPV6_USE_MIN_MTU = 0x20 IPV6_V6ONLY = 0x27 IP_ADD_MEMBERSHIP = 0x13 IP_ADD_SOURCE_MEMBERSHIP = 0x17 IP_BLOCK_SOURCE = 0x15 IP_BOUND_IF = 0x41 IP_BROADCAST = 0x106 IP_BROADCAST_TTL = 0x43 IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 IP_DHCPINIT_IF = 0x45 IP_DONTFRAG = 0x1b IP_DONTROUTE = 0x105 IP_DROP_MEMBERSHIP = 0x14 IP_DROP_SOURCE_MEMBERSHIP = 0x18 IP_HDRINCL = 0x2 IP_MAXPACKET = 0xffff IP_MF = 0x2000 IP_MSS = 0x240 IP_MULTICAST_IF = 0x10 IP_MULTICAST_LOOP = 0x12 IP_MULTICAST_TTL = 0x11 IP_NEXTHOP = 0x19 IP_OPTIONS = 0x1 IP_PKTINFO = 0x1a IP_RECVDSTADDR = 0x7 IP_RECVIF = 0x9 IP_RECVOPTS = 0x5 IP_RECVPKTINFO = 0x1a IP_RECVRETOPTS = 0x6 IP_RECVSLLA = 0xa IP_RECVTTL = 0xb IP_RETOPTS = 0x8 IP_REUSEADDR = 0x104 IP_SEC_OPT = 0x22 IP_TOS = 0x3 IP_TTL = 0x4 IP_UNBLOCK_SOURCE = 0x16 IP_UNSPEC_SRC = 0x42 ISIG = 0x1 ISTRIP = 0x20 IUCLC = 0x200 IXANY = 0x800 IXOFF = 0x1000 IXON = 0x400 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 MADV_ACCESS_DEFAULT = 0x6 MADV_ACCESS_LWP = 0x7 MADV_ACCESS_MANY = 0x8 MADV_DONTNEED = 0x4 MADV_FREE = 0x5 MADV_NORMAL = 0x0 MADV_PURGE = 0x9 MADV_RANDOM = 0x1 MADV_SEQUENTIAL = 0x2 MADV_WILLNEED = 0x3 MAP_32BIT = 0x80 MAP_ALIGN = 0x200 MAP_ANON = 0x100 MAP_ANONYMOUS = 0x100 MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_INITDATA = 0x800 MAP_NORESERVE = 0x40 MAP_PRIVATE = 0x2 MAP_RENAME = 0x20 MAP_SHARED = 0x1 MAP_TEXT = 0x400 MAP_TYPE = 0xf MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MSG_CTRUNC = 0x10 MSG_DONTROUTE = 0x4 MSG_DONTWAIT = 0x80 MSG_DUPCTRL = 0x800 MSG_EOR = 0x8 MSG_MAXIOVLEN = 0x10 MSG_NOTIFICATION = 0x100 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_TRUNC = 0x20 MSG_WAITALL = 0x40 MSG_XPG4_2 = 0x8000 MS_ASYNC = 0x1 MS_INVALIDATE = 0x2 MS_OLDSYNC = 0x0 MS_SYNC = 0x4 M_FLUSH = 0x86 NAME_MAX = 0xff NEWDEV = 0x1 NL0 = 0x0 NL1 = 0x100 NLDLY = 0x100 NOFLSH = 0x80 OCRNL = 0x8 OFDEL = 0x80 OFILL = 0x40 OLCUC = 0x2 OLDDEV = 0x0 ONBITSMAJOR = 0x7 ONBITSMINOR = 0x8 ONLCR = 0x4 ONLRET = 0x20 ONOCR = 0x10 OPENFAIL = -0x1 OPOST = 0x1 O_ACCMODE = 0x600003 O_APPEND = 0x8 O_CLOEXEC = 0x800000 O_CREAT = 0x100 O_DSYNC = 0x40 O_EXCL = 0x400 O_EXEC = 0x400000 O_LARGEFILE = 0x2000 O_NDELAY = 0x4 O_NOCTTY = 0x800 O_NOFOLLOW = 0x20000 O_NOLINKS = 0x40000 O_NONBLOCK = 0x80 O_RDONLY = 0x0 O_RDWR = 0x2 O_RSYNC = 0x8000 O_SEARCH = 0x200000 O_SIOCGIFCONF = -0x3ff796ec O_SIOCGLIFCONF = -0x3fef9688 O_SYNC = 0x10 O_TRUNC = 0x200 O_WRONLY = 0x1 O_XATTR = 0x4000 PARENB = 0x100 PAREXT = 0x100000 PARMRK = 0x8 PARODD = 0x200 PENDIN = 0x4000 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 PROT_EXEC = 0x4 PROT_NONE = 0x0 PROT_READ = 0x1 PROT_WRITE = 0x2 RLIMIT_AS = 0x6 RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 RLIMIT_NOFILE = 0x5 RLIMIT_STACK = 0x3 RLIM_INFINITY = -0x3 RTAX_AUTHOR = 0x6 RTAX_BRD = 0x7 RTAX_DST = 0x0 RTAX_GATEWAY = 0x1 RTAX_GENMASK = 0x3 RTAX_IFA = 0x5 RTAX_IFP = 0x4 RTAX_MAX = 0x9 RTAX_NETMASK = 0x2 RTAX_SRC = 0x8 RTA_AUTHOR = 0x40 RTA_BRD = 0x80 RTA_DST = 0x1 RTA_GATEWAY = 0x2 RTA_GENMASK = 0x8 RTA_IFA = 0x20 RTA_IFP = 0x10 RTA_NETMASK = 0x4 RTA_NUMBITS = 0x9 RTA_SRC = 0x100 RTF_BLACKHOLE = 0x1000 RTF_CLONING = 0x100 RTF_DONE = 0x40 RTF_DYNAMIC = 0x10 RTF_GATEWAY = 0x2 RTF_HOST = 0x4 RTF_INDIRECT = 0x40000 RTF_KERNEL = 0x80000 RTF_LLINFO = 0x400 RTF_MASK = 0x80 RTF_MODIFIED = 0x20 RTF_MULTIRT = 0x10000 RTF_PRIVATE = 0x2000 RTF_PROTO1 = 0x8000 RTF_PROTO2 = 0x4000 RTF_REJECT = 0x8 RTF_SETSRC = 0x20000 RTF_STATIC = 0x800 RTF_UP = 0x1 RTF_XRESOLVE = 0x200 RTF_ZONE = 0x100000 RTM_ADD = 0x1 RTM_CHANGE = 0x3 RTM_CHGADDR = 0xf RTM_DELADDR = 0xd RTM_DELETE = 0x2 RTM_FREEADDR = 0x10 RTM_GET = 0x4 RTM_IFINFO = 0xe RTM_LOCK = 0x8 RTM_LOSING = 0x5 RTM_MISS = 0x7 RTM_NEWADDR = 0xc RTM_OLDADD = 0x9 RTM_OLDDEL = 0xa RTM_REDIRECT = 0x6 RTM_RESOLVE = 0xb RTM_VERSION = 0x3 RTV_EXPIRE = 0x4 RTV_HOPCOUNT = 0x2 RTV_MTU = 0x1 RTV_RPIPE = 0x8 RTV_RTT = 0x40 RTV_RTTVAR = 0x80 RTV_SPIPE = 0x10 RTV_SSTHRESH = 0x20 RT_AWARE = 0x1 RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 SCM_RIGHTS = 0x1010 SCM_TIMESTAMP = 0x1013 SCM_UCRED = 0x1012 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 SIG2STR_MAX = 0x20 SIOCADDMULTI = -0x7fdf96cf SIOCADDRT = -0x7fcf8df6 SIOCATMARK = 0x40047307 SIOCDARP = -0x7fdb96e0 SIOCDELMULTI = -0x7fdf96ce SIOCDELRT = -0x7fcf8df5 SIOCDXARP = -0x7fff9658 SIOCGARP = -0x3fdb96e1 SIOCGDSTINFO = -0x3fff965c SIOCGENADDR = -0x3fdf96ab SIOCGENPSTATS = -0x3fdf96c7 SIOCGETLSGCNT = -0x3fef8deb SIOCGETNAME = 0x40107334 SIOCGETPEER = 0x40107335 SIOCGETPROP = -0x3fff8f44 SIOCGETSGCNT = -0x3feb8deb SIOCGETSYNC = -0x3fdf96d3 SIOCGETVIFCNT = -0x3feb8dec SIOCGHIWAT = 0x40047301 SIOCGIFADDR = -0x3fdf96f3 SIOCGIFBRDADDR = -0x3fdf96e9 SIOCGIFCONF = -0x3ff796a4 SIOCGIFDSTADDR = -0x3fdf96f1 SIOCGIFFLAGS = -0x3fdf96ef SIOCGIFHWADDR = -0x3fdf9647 SIOCGIFINDEX = -0x3fdf96a6 SIOCGIFMEM = -0x3fdf96ed SIOCGIFMETRIC = -0x3fdf96e5 SIOCGIFMTU = -0x3fdf96ea SIOCGIFMUXID = -0x3fdf96a8 SIOCGIFNETMASK = -0x3fdf96e7 SIOCGIFNUM = 0x40046957 SIOCGIP6ADDRPOLICY = -0x3fff965e SIOCGIPMSFILTER = -0x3ffb964c SIOCGLIFADDR = -0x3f87968f SIOCGLIFBINDING = -0x3f879666 SIOCGLIFBRDADDR = -0x3f879685 SIOCGLIFCONF = -0x3fef965b SIOCGLIFDADSTATE = -0x3f879642 SIOCGLIFDSTADDR = -0x3f87968d SIOCGLIFFLAGS = -0x3f87968b SIOCGLIFGROUPINFO = -0x3f4b9663 SIOCGLIFGROUPNAME = -0x3f879664 SIOCGLIFHWADDR = -0x3f879640 SIOCGLIFINDEX = -0x3f87967b SIOCGLIFLNKINFO = -0x3f879674 SIOCGLIFMETRIC = -0x3f879681 SIOCGLIFMTU = -0x3f879686 SIOCGLIFMUXID = -0x3f87967d SIOCGLIFNETMASK = -0x3f879683 SIOCGLIFNUM = -0x3ff3967e SIOCGLIFSRCOF = -0x3fef964f SIOCGLIFSUBNET = -0x3f879676 SIOCGLIFTOKEN = -0x3f879678 SIOCGLIFUSESRC = -0x3f879651 SIOCGLIFZONE = -0x3f879656 SIOCGLOWAT = 0x40047303 SIOCGMSFILTER = -0x3ffb964e SIOCGPGRP = 0x40047309 SIOCGSTAMP = -0x3fef9646 SIOCGXARP = -0x3fff9659 SIOCIFDETACH = -0x7fdf96c8 SIOCILB = -0x3ffb9645 SIOCLIFADDIF = -0x3f879691 SIOCLIFDELND = -0x7f879673 SIOCLIFGETND = -0x3f879672 SIOCLIFREMOVEIF = -0x7f879692 SIOCLIFSETND = -0x7f879671 SIOCLOWER = -0x7fdf96d7 SIOCSARP = -0x7fdb96e2 SIOCSCTPGOPT = -0x3fef9653 SIOCSCTPPEELOFF = -0x3ffb9652 SIOCSCTPSOPT = -0x7fef9654 SIOCSENABLESDP = -0x3ffb9649 SIOCSETPROP = -0x7ffb8f43 SIOCSETSYNC = -0x7fdf96d4 SIOCSHIWAT = -0x7ffb8d00 SIOCSIFADDR = -0x7fdf96f4 SIOCSIFBRDADDR = -0x7fdf96e8 SIOCSIFDSTADDR = -0x7fdf96f2 SIOCSIFFLAGS = -0x7fdf96f0 SIOCSIFINDEX = -0x7fdf96a5 SIOCSIFMEM = -0x7fdf96ee SIOCSIFMETRIC = -0x7fdf96e4 SIOCSIFMTU = -0x7fdf96eb SIOCSIFMUXID = -0x7fdf96a7 SIOCSIFNAME = -0x7fdf96b7 SIOCSIFNETMASK = -0x7fdf96e6 SIOCSIP6ADDRPOLICY = -0x7fff965d SIOCSIPMSFILTER = -0x7ffb964b SIOCSLGETREQ = -0x3fdf96b9 SIOCSLIFADDR = -0x7f879690 SIOCSLIFBRDADDR = -0x7f879684 SIOCSLIFDSTADDR = -0x7f87968e SIOCSLIFFLAGS = -0x7f87968c SIOCSLIFGROUPNAME = -0x7f879665 SIOCSLIFINDEX = -0x7f87967a SIOCSLIFLNKINFO = -0x7f879675 SIOCSLIFMETRIC = -0x7f879680 SIOCSLIFMTU = -0x7f879687 SIOCSLIFMUXID = -0x7f87967c SIOCSLIFNAME = -0x3f87967f SIOCSLIFNETMASK = -0x7f879682 SIOCSLIFPREFIX = -0x3f879641 SIOCSLIFSUBNET = -0x7f879677 SIOCSLIFTOKEN = -0x7f879679 SIOCSLIFUSESRC = -0x7f879650 SIOCSLIFZONE = -0x7f879655 SIOCSLOWAT = -0x7ffb8cfe SIOCSLSTAT = -0x7fdf96b8 SIOCSMSFILTER = -0x7ffb964d SIOCSPGRP = -0x7ffb8cf8 SIOCSPROMISC = -0x7ffb96d0 SIOCSQPTR = -0x3ffb9648 SIOCSSDSTATS = -0x3fdf96d2 SIOCSSESTATS = -0x3fdf96d1 SIOCSXARP = -0x7fff965a SIOCTMYADDR = -0x3ff79670 SIOCTMYSITE = -0x3ff7966e SIOCTONLINK = -0x3ff7966f SIOCUPPER = -0x7fdf96d8 SIOCX25RCV = -0x3fdf96c4 SIOCX25TBL = -0x3fdf96c3 SIOCX25XMT = -0x3fdf96c5 SIOCXPROTO = 0x20007337 SOCK_CLOEXEC = 0x80000 SOCK_DGRAM = 0x1 SOCK_NDELAY = 0x200000 SOCK_NONBLOCK = 0x100000 SOCK_RAW = 0x4 SOCK_RDM = 0x5 SOCK_SEQPACKET = 0x6 SOCK_STREAM = 0x2 SOCK_TYPE_MASK = 0xffff SOL_FILTER = 0xfffc SOL_PACKET = 0xfffd SOL_ROUTE = 0xfffe SOL_SOCKET = 0xffff SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x2 SO_ALL = 0x3f SO_ALLZONES = 0x1014 SO_ANON_MLP = 0x100a SO_ATTACH_FILTER = 0x40000001 SO_BAND = 0x4000 SO_BROADCAST = 0x20 SO_COPYOPT = 0x80000 SO_DEBUG = 0x1 SO_DELIM = 0x8000 SO_DETACH_FILTER = 0x40000002 SO_DGRAM_ERRIND = 0x200 SO_DOMAIN = 0x100c SO_DONTLINGER = -0x81 SO_DONTROUTE = 0x10 SO_ERROPT = 0x40000 SO_ERROR = 0x1007 SO_EXCLBIND = 0x1015 SO_HIWAT = 0x10 SO_ISNTTY = 0x800 SO_ISTTY = 0x400 SO_KEEPALIVE = 0x8 SO_LINGER = 0x80 SO_LOWAT = 0x20 SO_MAC_EXEMPT = 0x100b SO_MAC_IMPLICIT = 0x1016 SO_MAXBLK = 0x100000 SO_MAXPSZ = 0x8 SO_MINPSZ = 0x4 SO_MREADOFF = 0x80 SO_MREADON = 0x40 SO_NDELOFF = 0x200 SO_NDELON = 0x100 SO_NODELIM = 0x10000 SO_OOBINLINE = 0x100 SO_PROTOTYPE = 0x1009 SO_RCVBUF = 0x1002 SO_RCVLOWAT = 0x1004 SO_RCVPSH = 0x100d SO_RCVTIMEO = 0x1006 SO_READOPT = 0x1 SO_RECVUCRED = 0x400 SO_REUSEADDR = 0x4 SO_SECATTR = 0x1011 SO_SNDBUF = 0x1001 SO_SNDLOWAT = 0x1003 SO_SNDTIMEO = 0x1005 SO_STRHOLD = 0x20000 SO_TAIL = 0x200000 SO_TIMESTAMP = 0x1013 SO_TONSTOP = 0x2000 SO_TOSTOP = 0x1000 SO_TYPE = 0x1008 SO_USELOOPBACK = 0x40 SO_VRRP = 0x1017 SO_WROFF = 0x2 TAB0 = 0x0 TAB1 = 0x800 TAB2 = 0x1000 TAB3 = 0x1800 TABDLY = 0x1800 TCFLSH = 0x5407 TCGETA = 0x5401 TCGETS = 0x540d TCIFLUSH = 0x0 TCIOFF = 0x2 TCIOFLUSH = 0x2 TCION = 0x3 TCOFLUSH = 0x1 TCOOFF = 0x0 TCOON = 0x1 TCP_ABORT_THRESHOLD = 0x11 TCP_ANONPRIVBIND = 0x20 TCP_CONN_ABORT_THRESHOLD = 0x13 TCP_CONN_NOTIFY_THRESHOLD = 0x12 TCP_CORK = 0x18 TCP_EXCLBIND = 0x21 TCP_INIT_CWND = 0x15 TCP_KEEPALIVE = 0x8 TCP_KEEPALIVE_ABORT_THRESHOLD = 0x17 TCP_KEEPALIVE_THRESHOLD = 0x16 TCP_KEEPCNT = 0x23 TCP_KEEPIDLE = 0x22 TCP_KEEPINTVL = 0x24 TCP_LINGER2 = 0x1c TCP_MAXSEG = 0x2 TCP_MSS = 0x218 TCP_NODELAY = 0x1 TCP_NOTIFY_THRESHOLD = 0x10 TCP_RECVDSTADDR = 0x14 TCP_RTO_INITIAL = 0x19 TCP_RTO_MAX = 0x1b TCP_RTO_MIN = 0x1a TCSAFLUSH = 0x5410 TCSBRK = 0x5405 TCSETA = 0x5402 TCSETAF = 0x5404 TCSETAW = 0x5403 TCSETS = 0x540e TCSETSF = 0x5410 TCSETSW = 0x540f TCXONC = 0x5406 TIOC = 0x5400 TIOCCBRK = 0x747a TIOCCDTR = 0x7478 TIOCCILOOP = 0x746c TIOCEXCL = 0x740d TIOCFLUSH = 0x7410 TIOCGETC = 0x7412 TIOCGETD = 0x7400 TIOCGETP = 0x7408 TIOCGLTC = 0x7474 TIOCGPGRP = 0x7414 TIOCGPPS = 0x547d TIOCGPPSEV = 0x547f TIOCGSID = 0x7416 TIOCGSOFTCAR = 0x5469 TIOCGWINSZ = 0x5468 TIOCHPCL = 0x7402 TIOCKBOF = 0x5409 TIOCKBON = 0x5408 TIOCLBIC = 0x747e TIOCLBIS = 0x747f TIOCLGET = 0x747c TIOCLSET = 0x747d TIOCMBIC = 0x741c TIOCMBIS = 0x741b TIOCMGET = 0x741d TIOCMSET = 0x741a TIOCM_CAR = 0x40 TIOCM_CD = 0x40 TIOCM_CTS = 0x20 TIOCM_DSR = 0x100 TIOCM_DTR = 0x2 TIOCM_LE = 0x1 TIOCM_RI = 0x80 TIOCM_RNG = 0x80 TIOCM_RTS = 0x4 TIOCM_SR = 0x10 TIOCM_ST = 0x8 TIOCNOTTY = 0x7471 TIOCNXCL = 0x740e TIOCOUTQ = 0x7473 TIOCREMOTE = 0x741e TIOCSBRK = 0x747b TIOCSCTTY = 0x7484 TIOCSDTR = 0x7479 TIOCSETC = 0x7411 TIOCSETD = 0x7401 TIOCSETN = 0x740a TIOCSETP = 0x7409 TIOCSIGNAL = 0x741f TIOCSILOOP = 0x746d TIOCSLTC = 0x7475 TIOCSPGRP = 0x7415 TIOCSPPS = 0x547e TIOCSSOFTCAR = 0x546a TIOCSTART = 0x746e TIOCSTI = 0x7417 TIOCSTOP = 0x746f TIOCSWINSZ = 0x5467 TOSTOP = 0x100 VCEOF = 0x8 VCEOL = 0x9 VDISCARD = 0xd VDSUSP = 0xb VEOF = 0x4 VEOL = 0x5 VEOL2 = 0x6 VERASE = 0x2 VERASE2 = 0x11 VINTR = 0x0 VKILL = 0x3 VLNEXT = 0xf VMIN = 0x4 VQUIT = 0x1 VREPRINT = 0xc VSTART = 0x8 VSTATUS = 0x10 VSTOP = 0x9 VSUSP = 0xa VSWTCH = 0x7 VT0 = 0x0 VT1 = 0x4000 VTDLY = 0x4000 VTIME = 0x5 VWERASE = 0xe WCONTFLG = 0xffff WCONTINUED = 0x8 WCOREFLG = 0x80 WEXITED = 0x1 WNOHANG = 0x40 WNOWAIT = 0x80 WOPTMASK = 0xcf WRAP = 0x20000 WSIGMASK = 0x7f WSTOPFLG = 0x7f WSTOPPED = 0x4 WTRAPPED = 0x2 WUNTRACED = 0x4 XCASE = 0x4 XTABS = 0x1800 ) // Errors const ( E2BIG = syscall.Errno(0x7) EACCES = syscall.Errno(0xd) EADDRINUSE = syscall.Errno(0x7d) EADDRNOTAVAIL = syscall.Errno(0x7e) EADV = syscall.Errno(0x44) EAFNOSUPPORT = syscall.Errno(0x7c) EAGAIN = syscall.Errno(0xb) EALREADY = syscall.Errno(0x95) EBADE = syscall.Errno(0x32) EBADF = syscall.Errno(0x9) EBADFD = syscall.Errno(0x51) EBADMSG = syscall.Errno(0x4d) EBADR = syscall.Errno(0x33) EBADRQC = syscall.Errno(0x36) EBADSLT = syscall.Errno(0x37) EBFONT = syscall.Errno(0x39) EBUSY = syscall.Errno(0x10) ECANCELED = syscall.Errno(0x2f) ECHILD = syscall.Errno(0xa) ECHRNG = syscall.Errno(0x25) ECOMM = syscall.Errno(0x46) ECONNABORTED = syscall.Errno(0x82) ECONNREFUSED = syscall.Errno(0x92) ECONNRESET = syscall.Errno(0x83) EDEADLK = syscall.Errno(0x2d) EDEADLOCK = syscall.Errno(0x38) EDESTADDRREQ = syscall.Errno(0x60) EDOM = syscall.Errno(0x21) EDQUOT = syscall.Errno(0x31) EEXIST = syscall.Errno(0x11) EFAULT = syscall.Errno(0xe) EFBIG = syscall.Errno(0x1b) EHOSTDOWN = syscall.Errno(0x93) EHOSTUNREACH = syscall.Errno(0x94) EIDRM = syscall.Errno(0x24) EILSEQ = syscall.Errno(0x58) EINPROGRESS = syscall.Errno(0x96) EINTR = syscall.Errno(0x4) EINVAL = syscall.Errno(0x16) EIO = syscall.Errno(0x5) EISCONN = syscall.Errno(0x85) EISDIR = syscall.Errno(0x15) EL2HLT = syscall.Errno(0x2c) EL2NSYNC = syscall.Errno(0x26) EL3HLT = syscall.Errno(0x27) EL3RST = syscall.Errno(0x28) ELIBACC = syscall.Errno(0x53) ELIBBAD = syscall.Errno(0x54) ELIBEXEC = syscall.Errno(0x57) ELIBMAX = syscall.Errno(0x56) ELIBSCN = syscall.Errno(0x55) ELNRNG = syscall.Errno(0x29) ELOCKUNMAPPED = syscall.Errno(0x48) ELOOP = syscall.Errno(0x5a) EMFILE = syscall.Errno(0x18) EMLINK = syscall.Errno(0x1f) EMSGSIZE = syscall.Errno(0x61) EMULTIHOP = syscall.Errno(0x4a) ENAMETOOLONG = syscall.Errno(0x4e) ENETDOWN = syscall.Errno(0x7f) ENETRESET = syscall.Errno(0x81) ENETUNREACH = syscall.Errno(0x80) ENFILE = syscall.Errno(0x17) ENOANO = syscall.Errno(0x35) ENOBUFS = syscall.Errno(0x84) ENOCSI = syscall.Errno(0x2b) ENODATA = syscall.Errno(0x3d) ENODEV = syscall.Errno(0x13) ENOENT = syscall.Errno(0x2) ENOEXEC = syscall.Errno(0x8) ENOLCK = syscall.Errno(0x2e) ENOLINK = syscall.Errno(0x43) ENOMEM = syscall.Errno(0xc) ENOMSG = syscall.Errno(0x23) ENONET = syscall.Errno(0x40) ENOPKG = syscall.Errno(0x41) ENOPROTOOPT = syscall.Errno(0x63) ENOSPC = syscall.Errno(0x1c) ENOSR = syscall.Errno(0x3f) ENOSTR = syscall.Errno(0x3c) ENOSYS = syscall.Errno(0x59) ENOTACTIVE = syscall.Errno(0x49) ENOTBLK = syscall.Errno(0xf) ENOTCONN = syscall.Errno(0x86) ENOTDIR = syscall.Errno(0x14) ENOTEMPTY = syscall.Errno(0x5d) ENOTRECOVERABLE = syscall.Errno(0x3b) ENOTSOCK = syscall.Errno(0x5f) ENOTSUP = syscall.Errno(0x30) ENOTTY = syscall.Errno(0x19) ENOTUNIQ = syscall.Errno(0x50) ENXIO = syscall.Errno(0x6) EOPNOTSUPP = syscall.Errno(0x7a) EOVERFLOW = syscall.Errno(0x4f) EOWNERDEAD = syscall.Errno(0x3a) EPERM = syscall.Errno(0x1) EPFNOSUPPORT = syscall.Errno(0x7b) EPIPE = syscall.Errno(0x20) EPROTO = syscall.Errno(0x47) EPROTONOSUPPORT = syscall.Errno(0x78) EPROTOTYPE = syscall.Errno(0x62) ERANGE = syscall.Errno(0x22) EREMCHG = syscall.Errno(0x52) EREMOTE = syscall.Errno(0x42) ERESTART = syscall.Errno(0x5b) EROFS = syscall.Errno(0x1e) ESHUTDOWN = syscall.Errno(0x8f) ESOCKTNOSUPPORT = syscall.Errno(0x79) ESPIPE = syscall.Errno(0x1d) ESRCH = syscall.Errno(0x3) ESRMNT = syscall.Errno(0x45) ESTALE = syscall.Errno(0x97) ESTRPIPE = syscall.Errno(0x5c) ETIME = syscall.Errno(0x3e) ETIMEDOUT = syscall.Errno(0x91) ETOOMANYREFS = syscall.Errno(0x90) ETXTBSY = syscall.Errno(0x1a) EUNATCH = syscall.Errno(0x2a) EUSERS = syscall.Errno(0x5e) EWOULDBLOCK = syscall.Errno(0xb) EXDEV = syscall.Errno(0x12) EXFULL = syscall.Errno(0x34) ) // Signals const ( SIGABRT = syscall.Signal(0x6) SIGALRM = syscall.Signal(0xe) SIGBUS = syscall.Signal(0xa) SIGCANCEL = syscall.Signal(0x24) SIGCHLD = syscall.Signal(0x12) SIGCLD = syscall.Signal(0x12) SIGCONT = syscall.Signal(0x19) SIGEMT = syscall.Signal(0x7) SIGFPE = syscall.Signal(0x8) SIGFREEZE = syscall.Signal(0x22) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) SIGINFO = syscall.Signal(0x29) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x16) SIGIOT = syscall.Signal(0x6) SIGJVM1 = syscall.Signal(0x27) SIGJVM2 = syscall.Signal(0x28) SIGKILL = syscall.Signal(0x9) SIGLOST = syscall.Signal(0x25) SIGLWP = syscall.Signal(0x21) SIGPIPE = syscall.Signal(0xd) SIGPOLL = syscall.Signal(0x16) SIGPROF = syscall.Signal(0x1d) SIGPWR = syscall.Signal(0x13) SIGQUIT = syscall.Signal(0x3) SIGSEGV = syscall.Signal(0xb) SIGSTOP = syscall.Signal(0x17) SIGSYS = syscall.Signal(0xc) SIGTERM = syscall.Signal(0xf) SIGTHAW = syscall.Signal(0x23) SIGTRAP = syscall.Signal(0x5) SIGTSTP = syscall.Signal(0x18) SIGTTIN = syscall.Signal(0x1a) SIGTTOU = syscall.Signal(0x1b) SIGURG = syscall.Signal(0x15) SIGUSR1 = syscall.Signal(0x10) SIGUSR2 = syscall.Signal(0x11) SIGVTALRM = syscall.Signal(0x1c) SIGWAITING = syscall.Signal(0x20) SIGWINCH = syscall.Signal(0x14) SIGXCPU = syscall.Signal(0x1e) SIGXFSZ = syscall.Signal(0x1f) SIGXRES = syscall.Signal(0x26) ) // Error table var errors = [...]string{ 1: "not owner", 2: "no such file or directory", 3: "no such process", 4: "interrupted system call", 5: "I/O error", 6: "no such device or address", 7: "arg list too long", 8: "exec format error", 9: "bad file number", 10: "no child processes", 11: "resource temporarily unavailable", 12: "not enough space", 13: "permission denied", 14: "bad address", 15: "block device required", 16: "device busy", 17: "file exists", 18: "cross-device link", 19: "no such device", 20: "not a directory", 21: "is a directory", 22: "invalid argument", 23: "file table overflow", 24: "too many open files", 25: "inappropriate ioctl for device", 26: "text file busy", 27: "file too large", 28: "no space left on device", 29: "illegal seek", 30: "read-only file system", 31: "too many links", 32: "broken pipe", 33: "argument out of domain", 34: "result too large", 35: "no message of desired type", 36: "identifier removed", 37: "channel number out of range", 38: "level 2 not synchronized", 39: "level 3 halted", 40: "level 3 reset", 41: "link number out of range", 42: "protocol driver not attached", 43: "no CSI structure available", 44: "level 2 halted", 45: "deadlock situation detected/avoided", 46: "no record locks available", 47: "operation canceled", 48: "operation not supported", 49: "disc quota exceeded", 50: "bad exchange descriptor", 51: "bad request descriptor", 52: "message tables full", 53: "anode table overflow", 54: "bad request code", 55: "invalid slot", 56: "file locking deadlock", 57: "bad font file format", 58: "owner of the lock died", 59: "lock is not recoverable", 60: "not a stream device", 61: "no data available", 62: "timer expired", 63: "out of stream resources", 64: "machine is not on the network", 65: "package not installed", 66: "object is remote", 67: "link has been severed", 68: "advertise error", 69: "srmount error", 70: "communication error on send", 71: "protocol error", 72: "locked lock was unmapped ", 73: "facility is not active", 74: "multihop attempted", 77: "not a data message", 78: "file name too long", 79: "value too large for defined data type", 80: "name not unique on network", 81: "file descriptor in bad state", 82: "remote address changed", 83: "can not access a needed shared library", 84: "accessing a corrupted shared library", 85: ".lib section in a.out corrupted", 86: "attempting to link in more shared libraries than system limit", 87: "can not exec a shared library directly", 88: "illegal byte sequence", 89: "operation not applicable", 90: "number of symbolic links encountered during path name traversal exceeds MAXSYMLINKS", 91: "error 91", 92: "error 92", 93: "directory not empty", 94: "too many users", 95: "socket operation on non-socket", 96: "destination address required", 97: "message too long", 98: "protocol wrong type for socket", 99: "option not supported by protocol", 120: "protocol not supported", 121: "socket type not supported", 122: "operation not supported on transport endpoint", 123: "protocol family not supported", 124: "address family not supported by protocol family", 125: "address already in use", 126: "cannot assign requested address", 127: "network is down", 128: "network is unreachable", 129: "network dropped connection because of reset", 130: "software caused connection abort", 131: "connection reset by peer", 132: "no buffer space available", 133: "transport endpoint is already connected", 134: "transport endpoint is not connected", 143: "cannot send after socket shutdown", 144: "too many references: cannot splice", 145: "connection timed out", 146: "connection refused", 147: "host is down", 148: "no route to host", 149: "operation already in progress", 150: "operation now in progress", 151: "stale NFS file handle", } // Signal table var signals = [...]string{ 1: "hangup", 2: "interrupt", 3: "quit", 4: "illegal Instruction", 5: "trace/Breakpoint Trap", 6: "abort", 7: "emulation Trap", 8: "arithmetic Exception", 9: "killed", 10: "bus Error", 11: "segmentation Fault", 12: "bad System Call", 13: "broken Pipe", 14: "alarm Clock", 15: "terminated", 16: "user Signal 1", 17: "user Signal 2", 18: "child Status Changed", 19: "power-Fail/Restart", 20: "window Size Change", 21: "urgent Socket Condition", 22: "pollable Event", 23: "stopped (signal)", 24: "stopped (user)", 25: "continued", 26: "stopped (tty input)", 27: "stopped (tty output)", 28: "virtual Timer Expired", 29: "profiling Timer Expired", 30: "cpu Limit Exceeded", 31: "file Size Limit Exceeded", 32: "no runnable lwp", 33: "inter-lwp signal", 34: "checkpoint Freeze", 35: "checkpoint Thaw", 36: "thread Cancellation", 37: "resource Lost", 38: "resource Control Exceeded", 39: "reserved for JVM 1", 40: "reserved for JVM 2", 41: "information Request", } ================================================ FILE: vendor/golang.org/x/sys/unix/zptrace386_linux.go ================================================ // Code generated by linux/mkall.go generatePtracePair(386, amd64). DO NOT EDIT. // +build linux // +build 386 amd64 package unix import "unsafe" // PtraceRegs386 is the registers used by 386 binaries. type PtraceRegs386 struct { Ebx int32 Ecx int32 Edx int32 Esi int32 Edi int32 Ebp int32 Eax int32 Xds int32 Xes int32 Xfs int32 Xgs int32 Orig_eax int32 Eip int32 Xcs int32 Eflags int32 Esp int32 Xss int32 } // PtraceGetRegs386 fetches the registers used by 386 binaries. func PtraceGetRegs386(pid int, regsout *PtraceRegs386) error { return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) } // PtraceSetRegs386 sets the registers used by 386 binaries. func PtraceSetRegs386(pid int, regs *PtraceRegs386) error { return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) } // PtraceRegsAmd64 is the registers used by amd64 binaries. type PtraceRegsAmd64 struct { R15 uint64 R14 uint64 R13 uint64 R12 uint64 Rbp uint64 Rbx uint64 R11 uint64 R10 uint64 R9 uint64 R8 uint64 Rax uint64 Rcx uint64 Rdx uint64 Rsi uint64 Rdi uint64 Orig_rax uint64 Rip uint64 Cs uint64 Eflags uint64 Rsp uint64 Ss uint64 Fs_base uint64 Gs_base uint64 Ds uint64 Es uint64 Fs uint64 Gs uint64 } // PtraceGetRegsAmd64 fetches the registers used by amd64 binaries. func PtraceGetRegsAmd64(pid int, regsout *PtraceRegsAmd64) error { return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) } // PtraceSetRegsAmd64 sets the registers used by amd64 binaries. func PtraceSetRegsAmd64(pid int, regs *PtraceRegsAmd64) error { return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) } ================================================ FILE: vendor/golang.org/x/sys/unix/zptracearm_linux.go ================================================ // Code generated by linux/mkall.go generatePtracePair(arm, arm64). DO NOT EDIT. // +build linux // +build arm arm64 package unix import "unsafe" // PtraceRegsArm is the registers used by arm binaries. type PtraceRegsArm struct { Uregs [18]uint32 } // PtraceGetRegsArm fetches the registers used by arm binaries. func PtraceGetRegsArm(pid int, regsout *PtraceRegsArm) error { return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) } // PtraceSetRegsArm sets the registers used by arm binaries. func PtraceSetRegsArm(pid int, regs *PtraceRegsArm) error { return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) } // PtraceRegsArm64 is the registers used by arm64 binaries. type PtraceRegsArm64 struct { Regs [31]uint64 Sp uint64 Pc uint64 Pstate uint64 } // PtraceGetRegsArm64 fetches the registers used by arm64 binaries. func PtraceGetRegsArm64(pid int, regsout *PtraceRegsArm64) error { return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) } // PtraceSetRegsArm64 sets the registers used by arm64 binaries. func PtraceSetRegsArm64(pid int, regs *PtraceRegsArm64) error { return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) } ================================================ FILE: vendor/golang.org/x/sys/unix/zptracemips_linux.go ================================================ // Code generated by linux/mkall.go generatePtracePair(mips, mips64). DO NOT EDIT. // +build linux // +build mips mips64 package unix import "unsafe" // PtraceRegsMips is the registers used by mips binaries. type PtraceRegsMips struct { Regs [32]uint64 Lo uint64 Hi uint64 Epc uint64 Badvaddr uint64 Status uint64 Cause uint64 } // PtraceGetRegsMips fetches the registers used by mips binaries. func PtraceGetRegsMips(pid int, regsout *PtraceRegsMips) error { return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) } // PtraceSetRegsMips sets the registers used by mips binaries. func PtraceSetRegsMips(pid int, regs *PtraceRegsMips) error { return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) } // PtraceRegsMips64 is the registers used by mips64 binaries. type PtraceRegsMips64 struct { Regs [32]uint64 Lo uint64 Hi uint64 Epc uint64 Badvaddr uint64 Status uint64 Cause uint64 } // PtraceGetRegsMips64 fetches the registers used by mips64 binaries. func PtraceGetRegsMips64(pid int, regsout *PtraceRegsMips64) error { return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) } // PtraceSetRegsMips64 sets the registers used by mips64 binaries. func PtraceSetRegsMips64(pid int, regs *PtraceRegsMips64) error { return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) } ================================================ FILE: vendor/golang.org/x/sys/unix/zptracemipsle_linux.go ================================================ // Code generated by linux/mkall.go generatePtracePair(mipsle, mips64le). DO NOT EDIT. // +build linux // +build mipsle mips64le package unix import "unsafe" // PtraceRegsMipsle is the registers used by mipsle binaries. type PtraceRegsMipsle struct { Regs [32]uint64 Lo uint64 Hi uint64 Epc uint64 Badvaddr uint64 Status uint64 Cause uint64 } // PtraceGetRegsMipsle fetches the registers used by mipsle binaries. func PtraceGetRegsMipsle(pid int, regsout *PtraceRegsMipsle) error { return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) } // PtraceSetRegsMipsle sets the registers used by mipsle binaries. func PtraceSetRegsMipsle(pid int, regs *PtraceRegsMipsle) error { return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) } // PtraceRegsMips64le is the registers used by mips64le binaries. type PtraceRegsMips64le struct { Regs [32]uint64 Lo uint64 Hi uint64 Epc uint64 Badvaddr uint64 Status uint64 Cause uint64 } // PtraceGetRegsMips64le fetches the registers used by mips64le binaries. func PtraceGetRegsMips64le(pid int, regsout *PtraceRegsMips64le) error { return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) } // PtraceSetRegsMips64le sets the registers used by mips64le binaries. func PtraceSetRegsMips64le(pid int, regs *PtraceRegsMips64le) error { return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) } ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go ================================================ // mksyscall.pl -l32 -tags darwin,386 syscall_bsd.go syscall_darwin.go syscall_darwin_386.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build darwin,386 package unix import ( "syscall" "unsafe" ) var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(ngid int, gid *_Gid_t) (n int, err error) { r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(ngid int, gid *_Gid_t) (err error) { _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(s int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { var _p0 unsafe.Pointer if len(mib) > 0 { _p0 = unsafe.Pointer(&mib[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimes(fd int, timeval *[2]Timeval) (err error) { _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, behav int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe() (r int, w int, err error) { r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) r = int(r0) w = int(r1) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kill(pid int, signum int, posix int) (err error) { _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chflags(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chmod(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(fd int) (nfd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(from int, to int) (err error) { _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exchangedata(path1 string, path2 string, options int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path1) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(path2) if err != nil { return } _, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { Syscall(SYS_EXIT, uintptr(code), 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchflags(fd int, flags int) (err error) { _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fpathconf(fd int, name int) (val int, err error) { r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, stat *Statfs_t) (err error) { _, _, e1 := Syscall(SYS_FSTATFS64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), uintptr(length>>32)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdtablesize() (size int) { r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) size = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) gid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgrp() (pgrp int) { r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) pgrp = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) pid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Issetugid() (tainted bool) { r0, _, _ := RawSyscall(SYS_ISSETUGID, 0, 0, 0) tainted = bool(r0 != 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kqueue() (fd int, err error) { r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Link(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, backlog int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdir(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifo(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknod(path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Open(path string, mode int, perm uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pathconf(path string, name int) (val int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlink(path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rename(from string, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(to) if err != nil { return } _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Renameat(fromfd int, from string, tofd int, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(to) if err != nil { return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Revoke(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rmdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(whence), 0, 0) newoffset = int64(int64(r1)<<32 | int64(r0)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setegid(egid int) (err error) { _, _, e1 := Syscall(SYS_SETEGID, uintptr(egid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seteuid(euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setgid(gid int) (err error) { _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setlogin(name string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(name) if err != nil { return } _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setprivexec(flag int) (err error) { _, _, e1 := Syscall(SYS_SETPRIVEXEC, uintptr(flag), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tp *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setuid(uid int) (err error) { _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, stat *Statfs_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlink(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() (err error) { _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(newmask int) (oldmask int) { r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) oldmask = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Undelete(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlink(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlinkat(dirfd int, path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos), uintptr(pos>>32), 0, 0) ret = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func gettimeofday(tp *Timeval) (sec int32, usec int32, err error) { r0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) sec = int32(r0) usec = int32(r1) if e1 != 0 { err = errnoErr(e1) } return } ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go ================================================ // mksyscall.pl -tags darwin,amd64 syscall_bsd.go syscall_darwin.go syscall_darwin_amd64.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build darwin,amd64 package unix import ( "syscall" "unsafe" ) var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(ngid int, gid *_Gid_t) (n int, err error) { r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(ngid int, gid *_Gid_t) (err error) { _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(s int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { var _p0 unsafe.Pointer if len(mib) > 0 { _p0 = unsafe.Pointer(&mib[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimes(fd int, timeval *[2]Timeval) (err error) { _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, behav int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe() (r int, w int, err error) { r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) r = int(r0) w = int(r1) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kill(pid int, signum int, posix int) (err error) { _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chflags(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chmod(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(fd int) (nfd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(from int, to int) (err error) { _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exchangedata(path1 string, path2 string, options int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path1) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(path2) if err != nil { return } _, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { Syscall(SYS_EXIT, uintptr(code), 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchflags(fd int, flags int) (err error) { _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fpathconf(fd int, name int) (val int, err error) { r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, stat *Statfs_t) (err error) { _, _, e1 := Syscall(SYS_FSTATFS64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdtablesize() (size int) { r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) size = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) gid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgrp() (pgrp int) { r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) pgrp = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) pid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Issetugid() (tainted bool) { r0, _, _ := RawSyscall(SYS_ISSETUGID, 0, 0, 0) tainted = bool(r0 != 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kqueue() (fd int, err error) { r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Link(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, backlog int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdir(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifo(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknod(path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Open(path string, mode int, perm uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pathconf(path string, name int) (val int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlink(path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rename(from string, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(to) if err != nil { return } _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Renameat(fromfd int, from string, tofd int, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(to) if err != nil { return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Revoke(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rmdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) newoffset = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setegid(egid int) (err error) { _, _, e1 := Syscall(SYS_SETEGID, uintptr(egid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seteuid(euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setgid(gid int) (err error) { _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setlogin(name string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(name) if err != nil { return } _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setprivexec(flag int) (err error) { _, _, e1 := Syscall(SYS_SETPRIVEXEC, uintptr(flag), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tp *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setuid(uid int) (err error) { _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, stat *Statfs_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlink(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() (err error) { _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(newmask int) (oldmask int) { r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) oldmask = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Undelete(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlink(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlinkat(dirfd int, path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) ret = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func gettimeofday(tp *Timeval) (sec int64, usec int32, err error) { r0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) sec = int64(r0) usec = int32(r1) if e1 != 0 { err = errnoErr(e1) } return } ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go ================================================ // mksyscall.pl -tags darwin,arm syscall_bsd.go syscall_darwin.go syscall_darwin_arm.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build darwin,arm package unix import ( "syscall" "unsafe" ) var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(ngid int, gid *_Gid_t) (n int, err error) { r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(ngid int, gid *_Gid_t) (err error) { _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(s int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { var _p0 unsafe.Pointer if len(mib) > 0 { _p0 = unsafe.Pointer(&mib[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimes(fd int, timeval *[2]Timeval) (err error) { _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, behav int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe() (r int, w int, err error) { r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) r = int(r0) w = int(r1) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kill(pid int, signum int, posix int) (err error) { _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chflags(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chmod(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(fd int) (nfd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(from int, to int) (err error) { _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exchangedata(path1 string, path2 string, options int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path1) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(path2) if err != nil { return } _, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { Syscall(SYS_EXIT, uintptr(code), 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchflags(fd int, flags int) (err error) { _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fpathconf(fd int, name int) (val int, err error) { r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, stat *Statfs_t) (err error) { _, _, e1 := Syscall(SYS_FSTATFS64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), uintptr(length>>32)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdtablesize() (size int) { r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) size = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) gid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgrp() (pgrp int) { r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) pgrp = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) pid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Issetugid() (tainted bool) { r0, _, _ := RawSyscall(SYS_ISSETUGID, 0, 0, 0) tainted = bool(r0 != 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kqueue() (fd int, err error) { r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Link(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, backlog int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdir(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifo(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknod(path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Open(path string, mode int, perm uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pathconf(path string, name int) (val int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlink(path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rename(from string, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(to) if err != nil { return } _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Renameat(fromfd int, from string, tofd int, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(to) if err != nil { return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Revoke(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rmdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(whence), 0, 0) newoffset = int64(int64(r1)<<32 | int64(r0)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setegid(egid int) (err error) { _, _, e1 := Syscall(SYS_SETEGID, uintptr(egid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seteuid(euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setgid(gid int) (err error) { _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setlogin(name string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(name) if err != nil { return } _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setprivexec(flag int) (err error) { _, _, e1 := Syscall(SYS_SETPRIVEXEC, uintptr(flag), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tp *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setuid(uid int) (err error) { _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, stat *Statfs_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlink(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() (err error) { _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(newmask int) (oldmask int) { r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) oldmask = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Undelete(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlink(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlinkat(dirfd int, path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos), uintptr(pos>>32), 0, 0) ret = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func gettimeofday(tp *Timeval) (sec int32, usec int32, err error) { r0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) sec = int32(r0) usec = int32(r1) if e1 != 0 { err = errnoErr(e1) } return } ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go ================================================ // mksyscall.pl -tags darwin,arm64 syscall_bsd.go syscall_darwin.go syscall_darwin_arm64.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build darwin,arm64 package unix import ( "syscall" "unsafe" ) var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(ngid int, gid *_Gid_t) (n int, err error) { r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(ngid int, gid *_Gid_t) (err error) { _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(s int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { var _p0 unsafe.Pointer if len(mib) > 0 { _p0 = unsafe.Pointer(&mib[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimes(fd int, timeval *[2]Timeval) (err error) { _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, behav int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe() (r int, w int, err error) { r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) r = int(r0) w = int(r1) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kill(pid int, signum int, posix int) (err error) { _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chflags(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chmod(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(fd int) (nfd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(from int, to int) (err error) { _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exchangedata(path1 string, path2 string, options int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path1) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(path2) if err != nil { return } _, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { Syscall(SYS_EXIT, uintptr(code), 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchflags(fd int, flags int) (err error) { _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fpathconf(fd int, name int) (val int, err error) { r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, stat *Statfs_t) (err error) { _, _, e1 := Syscall(SYS_FSTATFS64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdtablesize() (size int) { r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) size = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) gid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgrp() (pgrp int) { r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) pgrp = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) pid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Issetugid() (tainted bool) { r0, _, _ := RawSyscall(SYS_ISSETUGID, 0, 0, 0) tainted = bool(r0 != 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kqueue() (fd int, err error) { r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Link(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, backlog int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdir(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifo(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknod(path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Open(path string, mode int, perm uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pathconf(path string, name int) (val int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlink(path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rename(from string, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(to) if err != nil { return } _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Renameat(fromfd int, from string, tofd int, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(to) if err != nil { return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Revoke(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rmdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) newoffset = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setegid(egid int) (err error) { _, _, e1 := Syscall(SYS_SETEGID, uintptr(egid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seteuid(euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setgid(gid int) (err error) { _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setlogin(name string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(name) if err != nil { return } _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setprivexec(flag int) (err error) { _, _, e1 := Syscall(SYS_SETPRIVEXEC, uintptr(flag), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tp *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setuid(uid int) (err error) { _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, stat *Statfs_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlink(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() (err error) { _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(newmask int) (oldmask int) { r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) oldmask = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Undelete(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlink(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlinkat(dirfd int, path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) ret = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func gettimeofday(tp *Timeval) (sec int64, usec int32, err error) { r0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) sec = int64(r0) usec = int32(r1) if e1 != 0 { err = errnoErr(e1) } return } ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go ================================================ // mksyscall.pl -dragonfly -tags dragonfly,amd64 syscall_bsd.go syscall_dragonfly.go syscall_dragonfly_amd64.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build dragonfly,amd64 package unix import ( "syscall" "unsafe" ) var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(ngid int, gid *_Gid_t) (n int, err error) { r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(ngid int, gid *_Gid_t) (err error) { _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(s int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { var _p0 unsafe.Pointer if len(mib) > 0 { _p0 = unsafe.Pointer(&mib[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimes(fd int, timeval *[2]Timeval) (err error) { _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, behav int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe() (r int, w int, err error) { r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) r = int(r0) w = int(r1) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func extpread(fd int, p []byte, flags int, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_EXTPREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(offset), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func extpwrite(fd int, p []byte, flags int, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_EXTPWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(offset), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chflags(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chmod(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(fd int) (nfd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(from int, to int) (err error) { _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { Syscall(SYS_EXIT, uintptr(code), 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchflags(fd int, flags int) (err error) { _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fpathconf(fd int, name int) (val int, err error) { r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, stat *Statfs_t) (err error) { _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdtablesize() (size int) { r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) size = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) gid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgrp() (pgrp int) { r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) pgrp = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) pid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Issetugid() (tainted bool) { r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) tainted = bool(r0 != 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, signum syscall.Signal) (err error) { _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kqueue() (fd int, err error) { r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Link(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, backlog int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdir(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifo(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknod(path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Open(path string, mode int, perm uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pathconf(path string, name int) (val int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlink(path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rename(from string, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(to) if err != nil { return } _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Revoke(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rmdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { r0, _, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(whence), 0, 0) newoffset = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setegid(egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seteuid(euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setgid(gid int) (err error) { _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setlogin(name string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(name) if err != nil { return } _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresgid(rgid int, egid int, sgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresuid(ruid int, euid int, suid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tp *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setuid(uid int) (err error) { _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, stat *Statfs_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlink(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() (err error) { _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(newmask int) (oldmask int) { r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) oldmask = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Undelete(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlink(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), 0, 0) ret = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go ================================================ // mksyscall.pl -l32 -tags freebsd,386 syscall_bsd.go syscall_freebsd.go syscall_freebsd_386.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build freebsd,386 package unix import ( "syscall" "unsafe" ) var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(ngid int, gid *_Gid_t) (n int, err error) { r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(ngid int, gid *_Gid_t) (err error) { _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(s int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { var _p0 unsafe.Pointer if len(mib) > 0 { _p0 = unsafe.Pointer(&mib[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimes(fd int, timeval *[2]Timeval) (err error) { _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, behav int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe() (r int, w int, err error) { r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) r = int(r0) w = int(r1) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func CapEnter() (err error) { _, _, e1 := Syscall(SYS_CAP_ENTER, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func capRightsGet(version int, fd int, rightsp *CapRights) (err error) { _, _, e1 := Syscall(SYS___CAP_RIGHTS_GET, uintptr(version), uintptr(fd), uintptr(unsafe.Pointer(rightsp))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func capRightsLimit(fd int, rightsp *CapRights) (err error) { _, _, e1 := Syscall(SYS_CAP_RIGHTS_LIMIT, uintptr(fd), uintptr(unsafe.Pointer(rightsp)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chflags(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chmod(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(fd int) (nfd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(from int, to int) (err error) { _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { Syscall(SYS_EXIT, uintptr(code), 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(attrname) if err != nil { return } r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(attrname) if err != nil { return } r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(attrname) if err != nil { return } _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FD, uintptr(fd), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(file) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attrname) if err != nil { return } r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(file) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attrname) if err != nil { return } r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(file) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attrname) if err != nil { return } _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(file) if err != nil { return } r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(link) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attrname) if err != nil { return } r0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(link) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attrname) if err != nil { return } r0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(link) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attrname) if err != nil { return } _, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(link) if err != nil { return } r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fadvise(fd int, offset int64, length int64, advice int) (err error) { _, _, e1 := Syscall6(SYS_POSIX_FADVISE, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32), uintptr(advice)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchflags(fd int, flags int) (err error) { _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fpathconf(fd int, name int) (val int, err error) { r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, stat *Statfs_t) (err error) { _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), uintptr(length>>32)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdtablesize() (size int) { r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) size = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) gid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgrp() (pgrp int) { r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) pgrp = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) pid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Issetugid() (tainted bool) { r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) tainted = bool(r0 != 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, signum syscall.Signal) (err error) { _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kqueue() (fd int, err error) { r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Link(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, backlog int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdir(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifo(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknod(path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Open(path string, mode int, perm uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(fdat), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pathconf(path string, name int) (val int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlink(path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rename(from string, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(to) if err != nil { return } _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Renameat(fromfd int, from string, tofd int, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(to) if err != nil { return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Revoke(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rmdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(whence), 0, 0) newoffset = int64(int64(r1)<<32 | int64(r0)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setegid(egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seteuid(euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setgid(gid int) (err error) { _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setlogin(name string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(name) if err != nil { return } _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresgid(rgid int, egid int, sgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresuid(ruid int, euid int, suid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tp *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setuid(uid int) (err error) { _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, stat *Statfs_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlink(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() (err error) { _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(newmask int) (oldmask int) { r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) oldmask = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Undelete(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlink(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlinkat(dirfd int, path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos), uintptr(pos>>32), 0, 0) ret = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go ================================================ // mksyscall.pl -tags freebsd,amd64 syscall_bsd.go syscall_freebsd.go syscall_freebsd_amd64.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build freebsd,amd64 package unix import ( "syscall" "unsafe" ) var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(ngid int, gid *_Gid_t) (n int, err error) { r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(ngid int, gid *_Gid_t) (err error) { _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(s int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { var _p0 unsafe.Pointer if len(mib) > 0 { _p0 = unsafe.Pointer(&mib[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimes(fd int, timeval *[2]Timeval) (err error) { _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, behav int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe() (r int, w int, err error) { r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) r = int(r0) w = int(r1) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func CapEnter() (err error) { _, _, e1 := Syscall(SYS_CAP_ENTER, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func capRightsGet(version int, fd int, rightsp *CapRights) (err error) { _, _, e1 := Syscall(SYS___CAP_RIGHTS_GET, uintptr(version), uintptr(fd), uintptr(unsafe.Pointer(rightsp))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func capRightsLimit(fd int, rightsp *CapRights) (err error) { _, _, e1 := Syscall(SYS_CAP_RIGHTS_LIMIT, uintptr(fd), uintptr(unsafe.Pointer(rightsp)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chflags(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chmod(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(fd int) (nfd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(from int, to int) (err error) { _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { Syscall(SYS_EXIT, uintptr(code), 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(attrname) if err != nil { return } r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(attrname) if err != nil { return } r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(attrname) if err != nil { return } _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FD, uintptr(fd), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(file) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attrname) if err != nil { return } r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(file) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attrname) if err != nil { return } r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(file) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attrname) if err != nil { return } _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(file) if err != nil { return } r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(link) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attrname) if err != nil { return } r0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(link) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attrname) if err != nil { return } r0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(link) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attrname) if err != nil { return } _, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(link) if err != nil { return } r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fadvise(fd int, offset int64, length int64, advice int) (err error) { _, _, e1 := Syscall6(SYS_POSIX_FADVISE, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchflags(fd int, flags int) (err error) { _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fpathconf(fd int, name int) (val int, err error) { r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, stat *Statfs_t) (err error) { _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdtablesize() (size int) { r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) size = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) gid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgrp() (pgrp int) { r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) pgrp = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) pid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Issetugid() (tainted bool) { r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) tainted = bool(r0 != 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, signum syscall.Signal) (err error) { _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kqueue() (fd int, err error) { r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Link(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, backlog int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdir(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifo(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknod(path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Open(path string, mode int, perm uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(fdat), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pathconf(path string, name int) (val int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlink(path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rename(from string, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(to) if err != nil { return } _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Renameat(fromfd int, from string, tofd int, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(to) if err != nil { return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Revoke(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rmdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) newoffset = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setegid(egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seteuid(euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setgid(gid int) (err error) { _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setlogin(name string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(name) if err != nil { return } _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresgid(rgid int, egid int, sgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresuid(ruid int, euid int, suid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tp *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setuid(uid int) (err error) { _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, stat *Statfs_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlink(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() (err error) { _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(newmask int) (oldmask int) { r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) oldmask = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Undelete(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlink(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlinkat(dirfd int, path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) ret = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go ================================================ // mksyscall.pl -l32 -arm -tags freebsd,arm syscall_bsd.go syscall_freebsd.go syscall_freebsd_arm.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build freebsd,arm package unix import ( "syscall" "unsafe" ) var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(ngid int, gid *_Gid_t) (n int, err error) { r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(ngid int, gid *_Gid_t) (err error) { _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(s int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { var _p0 unsafe.Pointer if len(mib) > 0 { _p0 = unsafe.Pointer(&mib[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimes(fd int, timeval *[2]Timeval) (err error) { _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, behav int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe() (r int, w int, err error) { r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) r = int(r0) w = int(r1) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func CapEnter() (err error) { _, _, e1 := Syscall(SYS_CAP_ENTER, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func capRightsGet(version int, fd int, rightsp *CapRights) (err error) { _, _, e1 := Syscall(SYS___CAP_RIGHTS_GET, uintptr(version), uintptr(fd), uintptr(unsafe.Pointer(rightsp))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func capRightsLimit(fd int, rightsp *CapRights) (err error) { _, _, e1 := Syscall(SYS_CAP_RIGHTS_LIMIT, uintptr(fd), uintptr(unsafe.Pointer(rightsp)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chflags(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chmod(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(fd int) (nfd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(from int, to int) (err error) { _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { Syscall(SYS_EXIT, uintptr(code), 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(attrname) if err != nil { return } r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(attrname) if err != nil { return } r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(attrname) if err != nil { return } _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FD, uintptr(fd), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(file) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attrname) if err != nil { return } r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(file) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attrname) if err != nil { return } r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(file) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attrname) if err != nil { return } _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(file) if err != nil { return } r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(link) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attrname) if err != nil { return } r0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(link) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attrname) if err != nil { return } r0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(link) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attrname) if err != nil { return } _, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(link) if err != nil { return } r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fadvise(fd int, offset int64, length int64, advice int) (err error) { _, _, e1 := Syscall9(SYS_POSIX_FADVISE, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32), uintptr(advice), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchflags(fd int, flags int) (err error) { _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fpathconf(fd int, name int) (val int, err error) { r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, stat *Statfs_t) (err error) { _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdtablesize() (size int) { r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) size = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) gid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgrp() (pgrp int) { r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) pgrp = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) pid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Issetugid() (tainted bool) { r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) tainted = bool(r0 != 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, signum syscall.Signal) (err error) { _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kqueue() (fd int, err error) { r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Link(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, backlog int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdir(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifo(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknod(path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Open(path string, mode int, perm uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(fdat), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pathconf(path string, name int) (val int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlink(path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rename(from string, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(to) if err != nil { return } _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Renameat(fromfd int, from string, tofd int, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(to) if err != nil { return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Revoke(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rmdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) newoffset = int64(int64(r1)<<32 | int64(r0)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setegid(egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seteuid(euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setgid(gid int) (err error) { _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setlogin(name string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(name) if err != nil { return } _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresgid(rgid int, egid int, sgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresuid(ruid int, euid int, suid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tp *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setuid(uid int) (err error) { _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, stat *Statfs_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlink(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() (err error) { _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(newmask int) (oldmask int) { r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) oldmask = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Undelete(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlink(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlinkat(dirfd int, path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) ret = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_linux_386.go ================================================ // mksyscall.pl -l32 -tags linux,386 syscall_linux.go syscall_linux_386.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build linux,386 package unix import ( "syscall" "unsafe" ) var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fchmodat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlinkat(dirfd int, path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, times *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getcwd(buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlJoin(cmd int, arg2 string) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(arg2) if err != nil { return } r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(arg3) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(arg4) if err != nil { return } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { var _p0 unsafe.Pointer if len(payload) > 0 { _p0 = unsafe.Pointer(&payload[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(arg) if err != nil { return } _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { var _p0 *byte _p0, err = BytePtrFromString(source) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(target) if err != nil { return } var _p2 *byte _p2, err = BytePtrFromString(fstype) if err != nil { return } _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Acct(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { var _p0 *byte _p0, err = BytePtrFromString(keyType) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(description) if err != nil { return } var _p2 unsafe.Pointer if len(payload) > 0 { _p2 = unsafe.Pointer(&payload[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) id = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtimex(buf *Timex) (state int, err error) { r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) state = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ClockGettime(clockid int32, time *Timespec) (err error) { _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(oldfd int) (fd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup3(oldfd int, newfd int, flags int) (err error) { _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCreate(size int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCreate1(flag int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Eventfd(initval uint, flags int) (fd int, err error) { r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(off>>32), uintptr(len), uintptr(len>>32)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fdatasync(fd int) (err error) { _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) pid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrandom(buf []byte, flags int) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettid() (tid int) { r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) tid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getxattr(path string, attr string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(dest) > 0 { _p2 = unsafe.Pointer(&dest[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { var _p0 *byte _p0, err = BytePtrFromString(pathname) if err != nil { return } r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) watchdesc = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyInit1(flags int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) success = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, sig syscall.Signal) (err error) { _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Klogctl(typ int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(dest) > 0 { _p2 = unsafe.Pointer(&dest[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(dest) > 0 { _p1 = unsafe.Pointer(&dest[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Llistxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(dest) > 0 { _p1 = unsafe.Pointer(&dest[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lremovexattr(path string, attr string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(data) > 0 { _p2 = unsafe.Pointer(&data[0]) } else { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func PivotRoot(newroot string, putold string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(newroot) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(putold) if err != nil { return } _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Removexattr(path string, attr string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { var _p0 *byte _p0, err = BytePtrFromString(keyType) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(description) if err != nil { return } var _p2 *byte _p2, err = BytePtrFromString(callback) if err != nil { return } r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) id = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setdomainname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sethostname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setns(fd int, nstype int) (err error) { _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setxattr(path string, attr string, data []byte, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(data) > 0 { _p2 = unsafe.Pointer(&data[0]) } else { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() { Syscall(SYS_SYNC, 0, 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Syncfs(fd int) (err error) { _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sysinfo(info *Sysinfo_t) (err error) { _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { r0, r1, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) n = int64(int64(r1)<<32 | int64(r0)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Times(tms *Tms) (ticks uintptr, err error) { r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) ticks = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(mask int) (oldmask int) { r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) oldmask = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Uname(buf *Utsname) (err error) { _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(target string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(target) if err != nil { return } _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unshare(flags int) (err error) { _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ustat(dev int, ubuf *Ustat_t) (err error) { _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func exitThread(code int) (err error) { _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, p *byte, np int) (n int, err error) { r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, p *byte, np int) (n int, err error) { r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, advice int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe(p *[2]_C_int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe2(p *[2]_C_int, flags int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(oldfd int, newfd int) (err error) { _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fadvise(fd int, offset int64, length int64, advice int) (err error) { _, _, e1 := Syscall6(SYS_FADVISE64_64, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32), uintptr(advice)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN32, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { _, _, e1 := Syscall(SYS_FTRUNCATE64, uintptr(fd), uintptr(length), uintptr(length>>32)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { r0, _, _ := RawSyscall(SYS_GETEGID32, 0, 0, 0) egid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (euid int) { r0, _, _ := RawSyscall(SYS_GETEUID32, 0, 0, 0) euid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { r0, _, _ := RawSyscall(SYS_GETGID32, 0, 0, 0) gid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETUID32, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyInit() (fd int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ioperm(from int, num int, on int) (err error) { _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Iopl(level int) (err error) { _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LCHOWN32, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { r0, _, e1 := Syscall6(SYS_SENDFILE64, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) written = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setfsgid(gid int) (err error) { _, _, e1 := Syscall(SYS_SETFSGID32, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setfsuid(uid int) (err error) { _, _, e1 := Syscall(SYS_SETFSUID32, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREGID32, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresgid(rgid int, egid int, sgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESGID32, uintptr(rgid), uintptr(egid), uintptr(sgid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresuid(ruid int, euid int, suid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESUID32, uintptr(ruid), uintptr(euid), uintptr(suid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREUID32, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(off>>32), uintptr(n), uintptr(n>>32), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(n int, list *_Gid_t) (nn int, err error) { r0, _, e1 := RawSyscall(SYS_GETGROUPS32, uintptr(n), uintptr(unsafe.Pointer(list)), 0) nn = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(n int, list *_Gid_t) (err error) { _, _, e1 := RawSyscall(SYS_SETGROUPS32, uintptr(n), uintptr(unsafe.Pointer(list)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) { r0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset)) xaddr = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { var _p0 unsafe.Pointer if len(events) > 0 { _p0 = unsafe.Pointer(&events[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pause() (err error) { _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getrlimit(resource int, rlim *rlimit32) (err error) { _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setrlimit(resource int, rlim *rlimit32) (err error) { _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Time(t *Time_t) (tt Time_t, err error) { r0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0) tt = Time_t(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Utime(path string, buf *Utimbuf) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go ================================================ // mksyscall.pl -tags linux,amd64 syscall_linux.go syscall_linux_amd64.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build linux,amd64 package unix import ( "syscall" "unsafe" ) var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fchmodat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlinkat(dirfd int, path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, times *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getcwd(buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlJoin(cmd int, arg2 string) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(arg2) if err != nil { return } r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(arg3) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(arg4) if err != nil { return } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { var _p0 unsafe.Pointer if len(payload) > 0 { _p0 = unsafe.Pointer(&payload[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(arg) if err != nil { return } _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { var _p0 *byte _p0, err = BytePtrFromString(source) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(target) if err != nil { return } var _p2 *byte _p2, err = BytePtrFromString(fstype) if err != nil { return } _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Acct(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { var _p0 *byte _p0, err = BytePtrFromString(keyType) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(description) if err != nil { return } var _p2 unsafe.Pointer if len(payload) > 0 { _p2 = unsafe.Pointer(&payload[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) id = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtimex(buf *Timex) (state int, err error) { r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) state = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ClockGettime(clockid int32, time *Timespec) (err error) { _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(oldfd int) (fd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup3(oldfd int, newfd int, flags int) (err error) { _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCreate(size int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCreate1(flag int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Eventfd(initval uint, flags int) (fd int, err error) { r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fdatasync(fd int) (err error) { _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) pid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrandom(buf []byte, flags int) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettid() (tid int) { r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) tid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getxattr(path string, attr string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(dest) > 0 { _p2 = unsafe.Pointer(&dest[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { var _p0 *byte _p0, err = BytePtrFromString(pathname) if err != nil { return } r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) watchdesc = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyInit1(flags int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) success = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, sig syscall.Signal) (err error) { _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Klogctl(typ int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(dest) > 0 { _p2 = unsafe.Pointer(&dest[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(dest) > 0 { _p1 = unsafe.Pointer(&dest[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Llistxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(dest) > 0 { _p1 = unsafe.Pointer(&dest[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lremovexattr(path string, attr string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(data) > 0 { _p2 = unsafe.Pointer(&data[0]) } else { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func PivotRoot(newroot string, putold string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(newroot) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(putold) if err != nil { return } _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Removexattr(path string, attr string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { var _p0 *byte _p0, err = BytePtrFromString(keyType) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(description) if err != nil { return } var _p2 *byte _p2, err = BytePtrFromString(callback) if err != nil { return } r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) id = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setdomainname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sethostname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setns(fd int, nstype int) (err error) { _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setxattr(path string, attr string, data []byte, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(data) > 0 { _p2 = unsafe.Pointer(&data[0]) } else { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() { Syscall(SYS_SYNC, 0, 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Syncfs(fd int) (err error) { _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sysinfo(info *Sysinfo_t) (err error) { _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) n = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Times(tms *Tms) (ticks uintptr, err error) { r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) ticks = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(mask int) (oldmask int) { r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) oldmask = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Uname(buf *Utsname) (err error) { _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(target string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(target) if err != nil { return } _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unshare(flags int) (err error) { _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ustat(dev int, ubuf *Ustat_t) (err error) { _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func exitThread(code int) (err error) { _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, p *byte, np int) (n int, err error) { r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, p *byte, np int) (n int, err error) { r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, advice int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(oldfd int, newfd int) (err error) { _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { var _p0 unsafe.Pointer if len(events) > 0 { _p0 = unsafe.Pointer(&events[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fadvise(fd int, offset int64, length int64, advice int) (err error) { _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, buf *Statfs_t) (err error) { _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (euid int) { r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) euid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) gid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(resource int, rlim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyInit() (fd int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ioperm(from int, num int, on int) (err error) { _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Iopl(level int) (err error) { _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, n int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pause() (err error) { _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (off int64, err error) { r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) off = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) written = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setfsgid(gid int) (err error) { _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setfsuid(uid int) (err error) { _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresgid(rgid int, egid int, sgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresuid(ruid int, euid int, suid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(resource int, rlim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) n = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, buf *Statfs_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(n int, list *_Gid_t) (nn int, err error) { r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) nn = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(n int, list *_Gid_t) (err error) { _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) xaddr = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Utime(path string, buf *Utimbuf) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe(p *[2]_C_int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe2(p *[2]_C_int, flags int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go ================================================ // mksyscall.pl -l32 -arm -tags linux,arm syscall_linux.go syscall_linux_arm.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build linux,arm package unix import ( "syscall" "unsafe" ) var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fchmodat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlinkat(dirfd int, path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, times *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getcwd(buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlJoin(cmd int, arg2 string) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(arg2) if err != nil { return } r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(arg3) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(arg4) if err != nil { return } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { var _p0 unsafe.Pointer if len(payload) > 0 { _p0 = unsafe.Pointer(&payload[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(arg) if err != nil { return } _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { var _p0 *byte _p0, err = BytePtrFromString(source) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(target) if err != nil { return } var _p2 *byte _p2, err = BytePtrFromString(fstype) if err != nil { return } _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Acct(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { var _p0 *byte _p0, err = BytePtrFromString(keyType) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(description) if err != nil { return } var _p2 unsafe.Pointer if len(payload) > 0 { _p2 = unsafe.Pointer(&payload[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) id = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtimex(buf *Timex) (state int, err error) { r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) state = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ClockGettime(clockid int32, time *Timespec) (err error) { _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(oldfd int) (fd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup3(oldfd int, newfd int, flags int) (err error) { _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCreate(size int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCreate1(flag int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Eventfd(initval uint, flags int) (fd int, err error) { r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(off>>32), uintptr(len), uintptr(len>>32)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fdatasync(fd int) (err error) { _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) pid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrandom(buf []byte, flags int) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettid() (tid int) { r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) tid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getxattr(path string, attr string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(dest) > 0 { _p2 = unsafe.Pointer(&dest[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { var _p0 *byte _p0, err = BytePtrFromString(pathname) if err != nil { return } r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) watchdesc = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyInit1(flags int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) success = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, sig syscall.Signal) (err error) { _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Klogctl(typ int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(dest) > 0 { _p2 = unsafe.Pointer(&dest[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(dest) > 0 { _p1 = unsafe.Pointer(&dest[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Llistxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(dest) > 0 { _p1 = unsafe.Pointer(&dest[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lremovexattr(path string, attr string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(data) > 0 { _p2 = unsafe.Pointer(&data[0]) } else { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func PivotRoot(newroot string, putold string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(newroot) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(putold) if err != nil { return } _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Removexattr(path string, attr string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { var _p0 *byte _p0, err = BytePtrFromString(keyType) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(description) if err != nil { return } var _p2 *byte _p2, err = BytePtrFromString(callback) if err != nil { return } r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) id = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setdomainname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sethostname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setns(fd int, nstype int) (err error) { _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setxattr(path string, attr string, data []byte, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(data) > 0 { _p2 = unsafe.Pointer(&data[0]) } else { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() { Syscall(SYS_SYNC, 0, 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Syncfs(fd int) (err error) { _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sysinfo(info *Sysinfo_t) (err error) { _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { r0, r1, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) n = int64(int64(r1)<<32 | int64(r0)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Times(tms *Tms) (ticks uintptr, err error) { r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) ticks = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(mask int) (oldmask int) { r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) oldmask = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Uname(buf *Utsname) (err error) { _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(target string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(target) if err != nil { return } _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unshare(flags int) (err error) { _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ustat(dev int, ubuf *Ustat_t) (err error) { _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func exitThread(code int) (err error) { _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, p *byte, np int) (n int, err error) { r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, p *byte, np int) (n int, err error) { r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, advice int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe2(p *[2]_C_int, flags int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(n int, list *_Gid_t) (nn int, err error) { r0, _, e1 := RawSyscall(SYS_GETGROUPS32, uintptr(n), uintptr(unsafe.Pointer(list)), 0) nn = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(n int, list *_Gid_t) (err error) { _, _, e1 := RawSyscall(SYS_SETGROUPS32, uintptr(n), uintptr(unsafe.Pointer(list)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, flags int, fd *[2]int32) (err error) { _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(oldfd int, newfd int) (err error) { _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN32, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { r0, _, _ := RawSyscall(SYS_GETEGID32, 0, 0, 0) egid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (euid int) { r0, _, _ := RawSyscall(SYS_GETEUID32, 0, 0, 0) euid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { r0, _, _ := RawSyscall(SYS_GETGID32, 0, 0, 0) gid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETUID32, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyInit() (fd int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LCHOWN32, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, n int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { r0, _, e1 := Syscall6(SYS_SENDFILE64, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) written = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setfsgid(gid int) (err error) { _, _, e1 := Syscall(SYS_SETFSGID32, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setfsuid(uid int) (err error) { _, _, e1 := Syscall(SYS_SETFSUID32, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREGID32, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresgid(rgid int, egid int, sgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESGID32, uintptr(rgid), uintptr(egid), uintptr(sgid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresuid(ruid int, euid int, suid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESUID32, uintptr(ruid), uintptr(euid), uintptr(suid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREUID32, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { var _p0 unsafe.Pointer if len(events) > 0 { _p0 = unsafe.Pointer(&events[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pause() (err error) { _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { _, _, e1 := Syscall6(SYS_FTRUNCATE64, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) { r0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset)) xaddr = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getrlimit(resource int, rlim *rlimit32) (err error) { _, _, e1 := RawSyscall(SYS_UGETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setrlimit(resource int, rlim *rlimit32) (err error) { _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go ================================================ // mksyscall.pl -tags linux,arm64 syscall_linux.go syscall_linux_arm64.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build linux,arm64 package unix import ( "syscall" "unsafe" ) var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fchmodat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlinkat(dirfd int, path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, times *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getcwd(buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlJoin(cmd int, arg2 string) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(arg2) if err != nil { return } r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(arg3) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(arg4) if err != nil { return } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { var _p0 unsafe.Pointer if len(payload) > 0 { _p0 = unsafe.Pointer(&payload[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(arg) if err != nil { return } _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { var _p0 *byte _p0, err = BytePtrFromString(source) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(target) if err != nil { return } var _p2 *byte _p2, err = BytePtrFromString(fstype) if err != nil { return } _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Acct(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { var _p0 *byte _p0, err = BytePtrFromString(keyType) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(description) if err != nil { return } var _p2 unsafe.Pointer if len(payload) > 0 { _p2 = unsafe.Pointer(&payload[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) id = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtimex(buf *Timex) (state int, err error) { r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) state = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ClockGettime(clockid int32, time *Timespec) (err error) { _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(oldfd int) (fd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup3(oldfd int, newfd int, flags int) (err error) { _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCreate(size int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCreate1(flag int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Eventfd(initval uint, flags int) (fd int, err error) { r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fdatasync(fd int) (err error) { _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) pid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrandom(buf []byte, flags int) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettid() (tid int) { r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) tid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getxattr(path string, attr string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(dest) > 0 { _p2 = unsafe.Pointer(&dest[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { var _p0 *byte _p0, err = BytePtrFromString(pathname) if err != nil { return } r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) watchdesc = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyInit1(flags int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) success = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, sig syscall.Signal) (err error) { _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Klogctl(typ int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(dest) > 0 { _p2 = unsafe.Pointer(&dest[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(dest) > 0 { _p1 = unsafe.Pointer(&dest[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Llistxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(dest) > 0 { _p1 = unsafe.Pointer(&dest[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lremovexattr(path string, attr string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(data) > 0 { _p2 = unsafe.Pointer(&data[0]) } else { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func PivotRoot(newroot string, putold string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(newroot) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(putold) if err != nil { return } _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Removexattr(path string, attr string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { var _p0 *byte _p0, err = BytePtrFromString(keyType) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(description) if err != nil { return } var _p2 *byte _p2, err = BytePtrFromString(callback) if err != nil { return } r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) id = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setdomainname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sethostname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setns(fd int, nstype int) (err error) { _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setxattr(path string, attr string, data []byte, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(data) > 0 { _p2 = unsafe.Pointer(&data[0]) } else { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() { Syscall(SYS_SYNC, 0, 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Syncfs(fd int) (err error) { _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sysinfo(info *Sysinfo_t) (err error) { _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) n = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Times(tms *Tms) (ticks uintptr, err error) { r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) ticks = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(mask int) (oldmask int) { r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) oldmask = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Uname(buf *Utsname) (err error) { _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(target string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(target) if err != nil { return } _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unshare(flags int) (err error) { _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ustat(dev int, ubuf *Ustat_t) (err error) { _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func exitThread(code int) (err error) { _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, p *byte, np int) (n int, err error) { r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, p *byte, np int) (n int, err error) { r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, advice int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { var _p0 unsafe.Pointer if len(events) > 0 { _p0 = unsafe.Pointer(&events[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_EPOLL_PWAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, buf *Statfs_t) (err error) { _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (euid int) { r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) euid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) gid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(resource int, rlim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, n int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (off int64, err error) { r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) off = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) written = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setfsgid(gid int) (err error) { _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setfsuid(uid int) (err error) { _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresgid(rgid int, egid int, sgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresuid(ruid int, euid int, suid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(resource int, rlim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) n = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, buf *Statfs_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(n int, list *_Gid_t) (nn int, err error) { r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) nn = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(n int, list *_Gid_t) (err error) { _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) xaddr = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe2(p *[2]_C_int, flags int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go ================================================ // mksyscall.pl -b32 -arm -tags linux,mips syscall_linux.go syscall_linux_mipsx.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build linux,mips package unix import ( "syscall" "unsafe" ) var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fchmodat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlinkat(dirfd int, path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, times *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getcwd(buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlJoin(cmd int, arg2 string) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(arg2) if err != nil { return } r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(arg3) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(arg4) if err != nil { return } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { var _p0 unsafe.Pointer if len(payload) > 0 { _p0 = unsafe.Pointer(&payload[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(arg) if err != nil { return } _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { var _p0 *byte _p0, err = BytePtrFromString(source) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(target) if err != nil { return } var _p2 *byte _p2, err = BytePtrFromString(fstype) if err != nil { return } _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Acct(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { var _p0 *byte _p0, err = BytePtrFromString(keyType) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(description) if err != nil { return } var _p2 unsafe.Pointer if len(payload) > 0 { _p2 = unsafe.Pointer(&payload[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) id = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtimex(buf *Timex) (state int, err error) { r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) state = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ClockGettime(clockid int32, time *Timespec) (err error) { _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(oldfd int) (fd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup3(oldfd int, newfd int, flags int) (err error) { _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCreate(size int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCreate1(flag int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Eventfd(initval uint, flags int) (fd int, err error) { r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off>>32), uintptr(off), uintptr(len>>32), uintptr(len)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fdatasync(fd int) (err error) { _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) pid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrandom(buf []byte, flags int) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettid() (tid int) { r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) tid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getxattr(path string, attr string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(dest) > 0 { _p2 = unsafe.Pointer(&dest[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { var _p0 *byte _p0, err = BytePtrFromString(pathname) if err != nil { return } r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) watchdesc = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyInit1(flags int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) success = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, sig syscall.Signal) (err error) { _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Klogctl(typ int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(dest) > 0 { _p2 = unsafe.Pointer(&dest[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(dest) > 0 { _p1 = unsafe.Pointer(&dest[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Llistxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(dest) > 0 { _p1 = unsafe.Pointer(&dest[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lremovexattr(path string, attr string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(data) > 0 { _p2 = unsafe.Pointer(&data[0]) } else { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func PivotRoot(newroot string, putold string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(newroot) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(putold) if err != nil { return } _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Removexattr(path string, attr string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { var _p0 *byte _p0, err = BytePtrFromString(keyType) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(description) if err != nil { return } var _p2 *byte _p2, err = BytePtrFromString(callback) if err != nil { return } r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) id = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setdomainname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sethostname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setns(fd int, nstype int) (err error) { _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setxattr(path string, attr string, data []byte, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(data) > 0 { _p2 = unsafe.Pointer(&data[0]) } else { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() { Syscall(SYS_SYNC, 0, 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Syncfs(fd int) (err error) { _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sysinfo(info *Sysinfo_t) (err error) { _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { r0, r1, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) n = int64(int64(r0)<<32 | int64(r1)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Times(tms *Tms) (ticks uintptr, err error) { r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) ticks = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(mask int) (oldmask int) { r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) oldmask = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Uname(buf *Utsname) (err error) { _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(target string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(target) if err != nil { return } _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unshare(flags int) (err error) { _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ustat(dev int, ubuf *Ustat_t) (err error) { _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func exitThread(code int) (err error) { _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, p *byte, np int) (n int, err error) { r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, p *byte, np int) (n int, err error) { r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, advice int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(oldfd int, newfd int) (err error) { _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { _, _, e1 := Syscall6(SYS_FTRUNCATE64, uintptr(fd), 0, uintptr(length>>32), uintptr(length), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (euid int) { r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) euid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) gid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, n int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset>>32), uintptr(offset)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset>>32), uintptr(offset)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { r0, _, e1 := Syscall6(SYS_SENDFILE64, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) written = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setfsgid(gid int) (err error) { _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setfsuid(uid int) (err error) { _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresgid(rgid int, egid int, sgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresuid(ruid int, euid int, suid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { r0, r1, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) n = int64(int64(r0)<<32 | int64(r1)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { _, _, e1 := Syscall9(SYS_SYNC_FILE_RANGE, uintptr(fd), 0, uintptr(off>>32), uintptr(off), uintptr(n>>32), uintptr(n), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length>>32), uintptr(length), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(n int, list *_Gid_t) (nn int, err error) { r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) nn = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(n int, list *_Gid_t) (err error) { _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyInit() (fd int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ioperm(from int, num int, on int) (err error) { _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Iopl(level int) (err error) { _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Time(t *Time_t) (tt Time_t, err error) { r0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0) tt = Time_t(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Utime(path string, buf *Utimbuf) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { var _p0 unsafe.Pointer if len(events) > 0 { _p0 = unsafe.Pointer(&events[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pause() (err error) { _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe2(p *[2]_C_int, flags int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) { r0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset)) xaddr = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getrlimit(resource int, rlim *rlimit32) (err error) { _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setrlimit(resource int, rlim *rlimit32) (err error) { _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go ================================================ // mksyscall.pl -tags linux,mips64 syscall_linux.go syscall_linux_mips64x.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build linux,mips64 package unix import ( "syscall" "unsafe" ) var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fchmodat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlinkat(dirfd int, path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, times *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getcwd(buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlJoin(cmd int, arg2 string) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(arg2) if err != nil { return } r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(arg3) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(arg4) if err != nil { return } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { var _p0 unsafe.Pointer if len(payload) > 0 { _p0 = unsafe.Pointer(&payload[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(arg) if err != nil { return } _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { var _p0 *byte _p0, err = BytePtrFromString(source) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(target) if err != nil { return } var _p2 *byte _p2, err = BytePtrFromString(fstype) if err != nil { return } _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Acct(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { var _p0 *byte _p0, err = BytePtrFromString(keyType) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(description) if err != nil { return } var _p2 unsafe.Pointer if len(payload) > 0 { _p2 = unsafe.Pointer(&payload[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) id = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtimex(buf *Timex) (state int, err error) { r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) state = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ClockGettime(clockid int32, time *Timespec) (err error) { _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(oldfd int) (fd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup3(oldfd int, newfd int, flags int) (err error) { _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCreate(size int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCreate1(flag int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Eventfd(initval uint, flags int) (fd int, err error) { r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fdatasync(fd int) (err error) { _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) pid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrandom(buf []byte, flags int) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettid() (tid int) { r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) tid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getxattr(path string, attr string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(dest) > 0 { _p2 = unsafe.Pointer(&dest[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { var _p0 *byte _p0, err = BytePtrFromString(pathname) if err != nil { return } r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) watchdesc = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyInit1(flags int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) success = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, sig syscall.Signal) (err error) { _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Klogctl(typ int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(dest) > 0 { _p2 = unsafe.Pointer(&dest[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(dest) > 0 { _p1 = unsafe.Pointer(&dest[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Llistxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(dest) > 0 { _p1 = unsafe.Pointer(&dest[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lremovexattr(path string, attr string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(data) > 0 { _p2 = unsafe.Pointer(&data[0]) } else { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func PivotRoot(newroot string, putold string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(newroot) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(putold) if err != nil { return } _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Removexattr(path string, attr string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { var _p0 *byte _p0, err = BytePtrFromString(keyType) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(description) if err != nil { return } var _p2 *byte _p2, err = BytePtrFromString(callback) if err != nil { return } r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) id = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setdomainname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sethostname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setns(fd int, nstype int) (err error) { _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setxattr(path string, attr string, data []byte, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(data) > 0 { _p2 = unsafe.Pointer(&data[0]) } else { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() { Syscall(SYS_SYNC, 0, 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Syncfs(fd int) (err error) { _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sysinfo(info *Sysinfo_t) (err error) { _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) n = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Times(tms *Tms) (ticks uintptr, err error) { r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) ticks = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(mask int) (oldmask int) { r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) oldmask = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Uname(buf *Utsname) (err error) { _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(target string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(target) if err != nil { return } _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unshare(flags int) (err error) { _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ustat(dev int, ubuf *Ustat_t) (err error) { _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func exitThread(code int) (err error) { _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, p *byte, np int) (n int, err error) { r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, p *byte, np int) (n int, err error) { r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, advice int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(oldfd int, newfd int) (err error) { _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { var _p0 unsafe.Pointer if len(events) > 0 { _p0 = unsafe.Pointer(&events[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, buf *Statfs_t) (err error) { _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (euid int) { r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) euid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) gid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(resource int, rlim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, n int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pause() (err error) { _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (off int64, err error) { r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) off = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) written = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setfsgid(gid int) (err error) { _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setfsuid(uid int) (err error) { _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresgid(rgid int, egid int, sgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresuid(ruid int, euid int, suid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(resource int, rlim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) n = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, buf *Statfs_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(n int, list *_Gid_t) (nn int, err error) { r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) nn = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(n int, list *_Gid_t) (err error) { _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) xaddr = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Utime(path string, buf *Utimbuf) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe2(p *[2]_C_int, flags int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fstat(fd int, st *stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(st)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func lstat(path string, st *stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func stat(path string, st *stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go ================================================ // mksyscall.pl -tags linux,mips64le syscall_linux.go syscall_linux_mips64x.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build linux,mips64le package unix import ( "syscall" "unsafe" ) var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fchmodat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlinkat(dirfd int, path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, times *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getcwd(buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlJoin(cmd int, arg2 string) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(arg2) if err != nil { return } r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(arg3) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(arg4) if err != nil { return } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { var _p0 unsafe.Pointer if len(payload) > 0 { _p0 = unsafe.Pointer(&payload[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(arg) if err != nil { return } _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { var _p0 *byte _p0, err = BytePtrFromString(source) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(target) if err != nil { return } var _p2 *byte _p2, err = BytePtrFromString(fstype) if err != nil { return } _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Acct(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { var _p0 *byte _p0, err = BytePtrFromString(keyType) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(description) if err != nil { return } var _p2 unsafe.Pointer if len(payload) > 0 { _p2 = unsafe.Pointer(&payload[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) id = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtimex(buf *Timex) (state int, err error) { r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) state = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ClockGettime(clockid int32, time *Timespec) (err error) { _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(oldfd int) (fd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup3(oldfd int, newfd int, flags int) (err error) { _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCreate(size int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCreate1(flag int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Eventfd(initval uint, flags int) (fd int, err error) { r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fdatasync(fd int) (err error) { _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) pid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrandom(buf []byte, flags int) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettid() (tid int) { r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) tid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getxattr(path string, attr string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(dest) > 0 { _p2 = unsafe.Pointer(&dest[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { var _p0 *byte _p0, err = BytePtrFromString(pathname) if err != nil { return } r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) watchdesc = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyInit1(flags int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) success = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, sig syscall.Signal) (err error) { _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Klogctl(typ int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(dest) > 0 { _p2 = unsafe.Pointer(&dest[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(dest) > 0 { _p1 = unsafe.Pointer(&dest[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Llistxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(dest) > 0 { _p1 = unsafe.Pointer(&dest[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lremovexattr(path string, attr string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(data) > 0 { _p2 = unsafe.Pointer(&data[0]) } else { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func PivotRoot(newroot string, putold string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(newroot) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(putold) if err != nil { return } _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Removexattr(path string, attr string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { var _p0 *byte _p0, err = BytePtrFromString(keyType) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(description) if err != nil { return } var _p2 *byte _p2, err = BytePtrFromString(callback) if err != nil { return } r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) id = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setdomainname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sethostname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setns(fd int, nstype int) (err error) { _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setxattr(path string, attr string, data []byte, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(data) > 0 { _p2 = unsafe.Pointer(&data[0]) } else { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() { Syscall(SYS_SYNC, 0, 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Syncfs(fd int) (err error) { _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sysinfo(info *Sysinfo_t) (err error) { _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) n = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Times(tms *Tms) (ticks uintptr, err error) { r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) ticks = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(mask int) (oldmask int) { r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) oldmask = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Uname(buf *Utsname) (err error) { _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(target string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(target) if err != nil { return } _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unshare(flags int) (err error) { _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ustat(dev int, ubuf *Ustat_t) (err error) { _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func exitThread(code int) (err error) { _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, p *byte, np int) (n int, err error) { r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, p *byte, np int) (n int, err error) { r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, advice int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(oldfd int, newfd int) (err error) { _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { var _p0 unsafe.Pointer if len(events) > 0 { _p0 = unsafe.Pointer(&events[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, buf *Statfs_t) (err error) { _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (euid int) { r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) euid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) gid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(resource int, rlim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, n int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pause() (err error) { _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (off int64, err error) { r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) off = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) written = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setfsgid(gid int) (err error) { _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setfsuid(uid int) (err error) { _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresgid(rgid int, egid int, sgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresuid(ruid int, euid int, suid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(resource int, rlim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) n = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, buf *Statfs_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(n int, list *_Gid_t) (nn int, err error) { r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) nn = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(n int, list *_Gid_t) (err error) { _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) xaddr = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Utime(path string, buf *Utimbuf) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe2(p *[2]_C_int, flags int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fstat(fd int, st *stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(st)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func lstat(path string, st *stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func stat(path string, st *stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go ================================================ // mksyscall.pl -l32 -arm -tags linux,mipsle syscall_linux.go syscall_linux_mipsx.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build linux,mipsle package unix import ( "syscall" "unsafe" ) var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fchmodat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlinkat(dirfd int, path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, times *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getcwd(buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlJoin(cmd int, arg2 string) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(arg2) if err != nil { return } r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(arg3) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(arg4) if err != nil { return } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { var _p0 unsafe.Pointer if len(payload) > 0 { _p0 = unsafe.Pointer(&payload[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(arg) if err != nil { return } _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { var _p0 *byte _p0, err = BytePtrFromString(source) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(target) if err != nil { return } var _p2 *byte _p2, err = BytePtrFromString(fstype) if err != nil { return } _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Acct(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { var _p0 *byte _p0, err = BytePtrFromString(keyType) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(description) if err != nil { return } var _p2 unsafe.Pointer if len(payload) > 0 { _p2 = unsafe.Pointer(&payload[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) id = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtimex(buf *Timex) (state int, err error) { r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) state = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ClockGettime(clockid int32, time *Timespec) (err error) { _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(oldfd int) (fd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup3(oldfd int, newfd int, flags int) (err error) { _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCreate(size int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCreate1(flag int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Eventfd(initval uint, flags int) (fd int, err error) { r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(off>>32), uintptr(len), uintptr(len>>32)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fdatasync(fd int) (err error) { _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) pid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrandom(buf []byte, flags int) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettid() (tid int) { r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) tid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getxattr(path string, attr string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(dest) > 0 { _p2 = unsafe.Pointer(&dest[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { var _p0 *byte _p0, err = BytePtrFromString(pathname) if err != nil { return } r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) watchdesc = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyInit1(flags int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) success = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, sig syscall.Signal) (err error) { _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Klogctl(typ int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(dest) > 0 { _p2 = unsafe.Pointer(&dest[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(dest) > 0 { _p1 = unsafe.Pointer(&dest[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Llistxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(dest) > 0 { _p1 = unsafe.Pointer(&dest[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lremovexattr(path string, attr string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(data) > 0 { _p2 = unsafe.Pointer(&data[0]) } else { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func PivotRoot(newroot string, putold string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(newroot) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(putold) if err != nil { return } _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Removexattr(path string, attr string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { var _p0 *byte _p0, err = BytePtrFromString(keyType) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(description) if err != nil { return } var _p2 *byte _p2, err = BytePtrFromString(callback) if err != nil { return } r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) id = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setdomainname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sethostname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setns(fd int, nstype int) (err error) { _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setxattr(path string, attr string, data []byte, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(data) > 0 { _p2 = unsafe.Pointer(&data[0]) } else { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() { Syscall(SYS_SYNC, 0, 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Syncfs(fd int) (err error) { _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sysinfo(info *Sysinfo_t) (err error) { _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { r0, r1, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) n = int64(int64(r1)<<32 | int64(r0)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Times(tms *Tms) (ticks uintptr, err error) { r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) ticks = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(mask int) (oldmask int) { r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) oldmask = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Uname(buf *Utsname) (err error) { _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(target string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(target) if err != nil { return } _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unshare(flags int) (err error) { _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ustat(dev int, ubuf *Ustat_t) (err error) { _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func exitThread(code int) (err error) { _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, p *byte, np int) (n int, err error) { r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, p *byte, np int) (n int, err error) { r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, advice int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(oldfd int, newfd int) (err error) { _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { _, _, e1 := Syscall6(SYS_FTRUNCATE64, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (euid int) { r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) euid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) gid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, n int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { r0, _, e1 := Syscall6(SYS_SENDFILE64, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) written = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setfsgid(gid int) (err error) { _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setfsuid(uid int) (err error) { _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresgid(rgid int, egid int, sgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresuid(ruid int, euid int, suid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { r0, r1, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) n = int64(int64(r1)<<32 | int64(r0)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { _, _, e1 := Syscall9(SYS_SYNC_FILE_RANGE, uintptr(fd), 0, uintptr(off), uintptr(off>>32), uintptr(n), uintptr(n>>32), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(n int, list *_Gid_t) (nn int, err error) { r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) nn = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(n int, list *_Gid_t) (err error) { _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyInit() (fd int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ioperm(from int, num int, on int) (err error) { _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Iopl(level int) (err error) { _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Time(t *Time_t) (tt Time_t, err error) { r0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0) tt = Time_t(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Utime(path string, buf *Utimbuf) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { var _p0 unsafe.Pointer if len(events) > 0 { _p0 = unsafe.Pointer(&events[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pause() (err error) { _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe2(p *[2]_C_int, flags int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) { r0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset)) xaddr = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getrlimit(resource int, rlim *rlimit32) (err error) { _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setrlimit(resource int, rlim *rlimit32) (err error) { _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go ================================================ // mksyscall.pl -tags linux,ppc64 syscall_linux.go syscall_linux_ppc64x.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build linux,ppc64 package unix import ( "syscall" "unsafe" ) var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fchmodat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlinkat(dirfd int, path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, times *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getcwd(buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlJoin(cmd int, arg2 string) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(arg2) if err != nil { return } r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(arg3) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(arg4) if err != nil { return } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { var _p0 unsafe.Pointer if len(payload) > 0 { _p0 = unsafe.Pointer(&payload[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(arg) if err != nil { return } _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { var _p0 *byte _p0, err = BytePtrFromString(source) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(target) if err != nil { return } var _p2 *byte _p2, err = BytePtrFromString(fstype) if err != nil { return } _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Acct(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { var _p0 *byte _p0, err = BytePtrFromString(keyType) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(description) if err != nil { return } var _p2 unsafe.Pointer if len(payload) > 0 { _p2 = unsafe.Pointer(&payload[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) id = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtimex(buf *Timex) (state int, err error) { r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) state = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ClockGettime(clockid int32, time *Timespec) (err error) { _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(oldfd int) (fd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup3(oldfd int, newfd int, flags int) (err error) { _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCreate(size int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCreate1(flag int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Eventfd(initval uint, flags int) (fd int, err error) { r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fdatasync(fd int) (err error) { _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) pid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrandom(buf []byte, flags int) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettid() (tid int) { r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) tid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getxattr(path string, attr string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(dest) > 0 { _p2 = unsafe.Pointer(&dest[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { var _p0 *byte _p0, err = BytePtrFromString(pathname) if err != nil { return } r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) watchdesc = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyInit1(flags int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) success = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, sig syscall.Signal) (err error) { _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Klogctl(typ int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(dest) > 0 { _p2 = unsafe.Pointer(&dest[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(dest) > 0 { _p1 = unsafe.Pointer(&dest[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Llistxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(dest) > 0 { _p1 = unsafe.Pointer(&dest[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lremovexattr(path string, attr string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(data) > 0 { _p2 = unsafe.Pointer(&data[0]) } else { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func PivotRoot(newroot string, putold string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(newroot) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(putold) if err != nil { return } _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Removexattr(path string, attr string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { var _p0 *byte _p0, err = BytePtrFromString(keyType) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(description) if err != nil { return } var _p2 *byte _p2, err = BytePtrFromString(callback) if err != nil { return } r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) id = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setdomainname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sethostname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setns(fd int, nstype int) (err error) { _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setxattr(path string, attr string, data []byte, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(data) > 0 { _p2 = unsafe.Pointer(&data[0]) } else { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() { Syscall(SYS_SYNC, 0, 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Syncfs(fd int) (err error) { _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sysinfo(info *Sysinfo_t) (err error) { _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) n = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Times(tms *Tms) (ticks uintptr, err error) { r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) ticks = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(mask int) (oldmask int) { r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) oldmask = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Uname(buf *Utsname) (err error) { _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(target string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(target) if err != nil { return } _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unshare(flags int) (err error) { _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ustat(dev int, ubuf *Ustat_t) (err error) { _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func exitThread(code int) (err error) { _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, p *byte, np int) (n int, err error) { r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, p *byte, np int) (n int, err error) { r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, advice int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { var _p0 unsafe.Pointer if len(events) > 0 { _p0 = unsafe.Pointer(&events[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(oldfd int, newfd int) (err error) { _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, buf *Statfs_t) (err error) { _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (euid int) { r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) euid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) gid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(resource int, rlim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_UGETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyInit() (fd int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ioperm(from int, num int, on int) (err error) { _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Iopl(level int) (err error) { _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, n int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pause() (err error) { _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (off int64, err error) { r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) off = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) written = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setfsgid(gid int) (err error) { _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setfsuid(uid int) (err error) { _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresgid(rgid int, egid int, sgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresuid(ruid int, euid int, suid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(resource int, rlim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) n = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, buf *Statfs_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE2, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(n int, list *_Gid_t) (nn int, err error) { r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) nn = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(n int, list *_Gid_t) (err error) { _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) xaddr = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Time(t *Time_t) (tt Time_t, err error) { r0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0) tt = Time_t(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Utime(path string, buf *Utimbuf) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe(p *[2]_C_int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe2(p *[2]_C_int, flags int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go ================================================ // mksyscall.pl -tags linux,ppc64le syscall_linux.go syscall_linux_ppc64x.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build linux,ppc64le package unix import ( "syscall" "unsafe" ) var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fchmodat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlinkat(dirfd int, path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, times *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getcwd(buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlJoin(cmd int, arg2 string) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(arg2) if err != nil { return } r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(arg3) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(arg4) if err != nil { return } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { var _p0 unsafe.Pointer if len(payload) > 0 { _p0 = unsafe.Pointer(&payload[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(arg) if err != nil { return } _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { var _p0 *byte _p0, err = BytePtrFromString(source) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(target) if err != nil { return } var _p2 *byte _p2, err = BytePtrFromString(fstype) if err != nil { return } _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Acct(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { var _p0 *byte _p0, err = BytePtrFromString(keyType) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(description) if err != nil { return } var _p2 unsafe.Pointer if len(payload) > 0 { _p2 = unsafe.Pointer(&payload[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) id = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtimex(buf *Timex) (state int, err error) { r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) state = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ClockGettime(clockid int32, time *Timespec) (err error) { _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(oldfd int) (fd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup3(oldfd int, newfd int, flags int) (err error) { _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCreate(size int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCreate1(flag int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Eventfd(initval uint, flags int) (fd int, err error) { r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fdatasync(fd int) (err error) { _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) pid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrandom(buf []byte, flags int) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettid() (tid int) { r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) tid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getxattr(path string, attr string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(dest) > 0 { _p2 = unsafe.Pointer(&dest[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { var _p0 *byte _p0, err = BytePtrFromString(pathname) if err != nil { return } r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) watchdesc = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyInit1(flags int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) success = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, sig syscall.Signal) (err error) { _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Klogctl(typ int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(dest) > 0 { _p2 = unsafe.Pointer(&dest[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(dest) > 0 { _p1 = unsafe.Pointer(&dest[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Llistxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(dest) > 0 { _p1 = unsafe.Pointer(&dest[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lremovexattr(path string, attr string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(data) > 0 { _p2 = unsafe.Pointer(&data[0]) } else { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func PivotRoot(newroot string, putold string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(newroot) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(putold) if err != nil { return } _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Removexattr(path string, attr string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { var _p0 *byte _p0, err = BytePtrFromString(keyType) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(description) if err != nil { return } var _p2 *byte _p2, err = BytePtrFromString(callback) if err != nil { return } r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) id = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setdomainname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sethostname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setns(fd int, nstype int) (err error) { _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setxattr(path string, attr string, data []byte, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(data) > 0 { _p2 = unsafe.Pointer(&data[0]) } else { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() { Syscall(SYS_SYNC, 0, 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Syncfs(fd int) (err error) { _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sysinfo(info *Sysinfo_t) (err error) { _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) n = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Times(tms *Tms) (ticks uintptr, err error) { r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) ticks = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(mask int) (oldmask int) { r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) oldmask = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Uname(buf *Utsname) (err error) { _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(target string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(target) if err != nil { return } _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unshare(flags int) (err error) { _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ustat(dev int, ubuf *Ustat_t) (err error) { _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func exitThread(code int) (err error) { _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, p *byte, np int) (n int, err error) { r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, p *byte, np int) (n int, err error) { r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, advice int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { var _p0 unsafe.Pointer if len(events) > 0 { _p0 = unsafe.Pointer(&events[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(oldfd int, newfd int) (err error) { _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, buf *Statfs_t) (err error) { _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (euid int) { r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) euid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) gid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(resource int, rlim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_UGETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyInit() (fd int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ioperm(from int, num int, on int) (err error) { _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Iopl(level int) (err error) { _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, n int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pause() (err error) { _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (off int64, err error) { r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) off = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) written = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setfsgid(gid int) (err error) { _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setfsuid(uid int) (err error) { _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresgid(rgid int, egid int, sgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresuid(ruid int, euid int, suid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(resource int, rlim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) n = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, buf *Statfs_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE2, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(n int, list *_Gid_t) (nn int, err error) { r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) nn = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(n int, list *_Gid_t) (err error) { _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) xaddr = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Time(t *Time_t) (tt Time_t, err error) { r0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0) tt = Time_t(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Utime(path string, buf *Utimbuf) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe(p *[2]_C_int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe2(p *[2]_C_int, flags int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go ================================================ // mksyscall.pl -tags linux,s390x syscall_linux.go syscall_linux_s390x.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build linux,s390x package unix import ( "syscall" "unsafe" ) var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fchmodat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlinkat(dirfd int, path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, times *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getcwd(buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlJoin(cmd int, arg2 string) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(arg2) if err != nil { return } r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { var _p0 *byte _p0, err = BytePtrFromString(arg3) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(arg4) if err != nil { return } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { var _p0 unsafe.Pointer if len(payload) > 0 { _p0 = unsafe.Pointer(&payload[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) ret = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(arg) if err != nil { return } _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { var _p0 *byte _p0, err = BytePtrFromString(source) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(target) if err != nil { return } var _p2 *byte _p2, err = BytePtrFromString(fstype) if err != nil { return } _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Acct(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { var _p0 *byte _p0, err = BytePtrFromString(keyType) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(description) if err != nil { return } var _p2 unsafe.Pointer if len(payload) > 0 { _p2 = unsafe.Pointer(&payload[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) id = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtimex(buf *Timex) (state int, err error) { r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) state = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ClockGettime(clockid int32, time *Timespec) (err error) { _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(oldfd int) (fd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup3(oldfd int, newfd int, flags int) (err error) { _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCreate(size int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCreate1(flag int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Eventfd(initval uint, flags int) (fd int, err error) { r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fdatasync(fd int) (err error) { _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) pid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrandom(buf []byte, flags int) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettid() (tid int) { r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) tid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getxattr(path string, attr string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(dest) > 0 { _p2 = unsafe.Pointer(&dest[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { var _p0 *byte _p0, err = BytePtrFromString(pathname) if err != nil { return } r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) watchdesc = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyInit1(flags int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) success = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, sig syscall.Signal) (err error) { _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Klogctl(typ int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(dest) > 0 { _p2 = unsafe.Pointer(&dest[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(dest) > 0 { _p1 = unsafe.Pointer(&dest[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Llistxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(dest) > 0 { _p1 = unsafe.Pointer(&dest[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lremovexattr(path string, attr string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(data) > 0 { _p2 = unsafe.Pointer(&data[0]) } else { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func PivotRoot(newroot string, putold string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(newroot) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(putold) if err != nil { return } _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Removexattr(path string, attr string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { var _p0 *byte _p0, err = BytePtrFromString(keyType) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(description) if err != nil { return } var _p2 *byte _p2, err = BytePtrFromString(callback) if err != nil { return } r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) id = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setdomainname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sethostname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setns(fd int, nstype int) (err error) { _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setxattr(path string, attr string, data []byte, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(data) > 0 { _p2 = unsafe.Pointer(&data[0]) } else { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() { Syscall(SYS_SYNC, 0, 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Syncfs(fd int) (err error) { _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sysinfo(info *Sysinfo_t) (err error) { _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) n = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Times(tms *Tms) (ticks uintptr, err error) { r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) ticks = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(mask int) (oldmask int) { r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) oldmask = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Uname(buf *Utsname) (err error) { _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(target string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(target) if err != nil { return } _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unshare(flags int) (err error) { _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ustat(dev int, ubuf *Ustat_t) (err error) { _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func exitThread(code int) (err error) { _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, p *byte, np int) (n int, err error) { r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, p *byte, np int) (n int, err error) { r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, advice int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(oldfd int, newfd int) (err error) { _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { var _p0 unsafe.Pointer if len(events) > 0 { _p0 = unsafe.Pointer(&events[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fadvise(fd int, offset int64, length int64, advice int) (err error) { _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, buf *Statfs_t) (err error) { _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (euid int) { r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) euid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) gid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(resource int, rlim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyInit() (fd int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pause() (err error) { _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (off int64, err error) { r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) off = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) written = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setfsgid(gid int) (err error) { _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setfsuid(uid int) (err error) { _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresgid(rgid int, egid int, sgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresuid(ruid int, euid int, suid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(resource int, rlim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) n = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, buf *Statfs_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(n int, list *_Gid_t) (nn int, err error) { r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) nn = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(n int, list *_Gid_t) (err error) { _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Utime(path string, buf *Utimbuf) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe2(p *[2]_C_int, flags int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go ================================================ // mksyscall.pl -tags linux,sparc64 syscall_linux.go syscall_linux_sparc64.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build linux,sparc64 package unix import ( "syscall" "unsafe" ) var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlinkat(dirfd int, path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, times *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getcwd(buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(arg) if err != nil { return } _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { var _p0 *byte _p0, err = BytePtrFromString(source) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(target) if err != nil { return } var _p2 *byte _p2, err = BytePtrFromString(fstype) if err != nil { return } _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Acct(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtimex(buf *Timex) (state int, err error) { r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) state = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ClockGettime(clockid int32, time *Timespec) (err error) { _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(oldfd int) (fd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup3(oldfd int, newfd int, flags int) (err error) { _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCreate(size int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCreate1(flag int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fdatasync(fd int) (err error) { _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) pid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrandom(buf []byte, flags int) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettid() (tid int) { r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) tid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getxattr(path string, attr string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(dest) > 0 { _p2 = unsafe.Pointer(&dest[0]) } else { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { var _p0 *byte _p0, err = BytePtrFromString(pathname) if err != nil { return } r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) watchdesc = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyInit1(flags int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) success = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, sig syscall.Signal) (err error) { _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Klogctl(typ int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listxattr(path string, dest []byte) (sz int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(dest) > 0 { _p1 = unsafe.Pointer(&dest[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) sz = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func PivotRoot(newroot string, putold string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(newroot) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(putold) if err != nil { return } _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Removexattr(path string, attr string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setdomainname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sethostname(p []byte) (err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setns(fd int, nstype int) (err error) { _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setxattr(path string, attr string, data []byte, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(attr) if err != nil { return } var _p2 unsafe.Pointer if len(data) > 0 { _p2 = unsafe.Pointer(&data[0]) } else { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() { Syscall(SYS_SYNC, 0, 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sysinfo(info *Sysinfo_t) (err error) { _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) n = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Times(tms *Tms) (ticks uintptr, err error) { r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) ticks = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(mask int) (oldmask int) { r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) oldmask = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Uname(buf *Utsname) (err error) { _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(target string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(target) if err != nil { return } _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unshare(flags int) (err error) { _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ustat(dev int, ubuf *Ustat_t) (err error) { _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func exitThread(code int) (err error) { _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, p *byte, np int) (n int, err error) { r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, p *byte, np int) (n int, err error) { r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, advice int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { var _p0 unsafe.Pointer if len(events) > 0 { _p0 = unsafe.Pointer(&events[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(oldfd int, newfd int) (err error) { _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, buf *Statfs_t) (err error) { _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (euid int) { r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) euid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) gid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(resource int, rlim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func InotifyInit() (fd int, err error) { r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, n int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pause() (err error) { _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (off int64, err error) { r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) off = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) written = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setfsgid(gid int) (err error) { _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setfsuid(uid int) (err error) { _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresgid(rgid int, egid int, sgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresuid(ruid int, euid int, suid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(resource int, rlim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) n = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, buf *Statfs_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(n int, list *_Gid_t) (nn int, err error) { r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) nn = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(n int, list *_Gid_t) (err error) { _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) xaddr = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Utime(path string, buf *Utimbuf) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe(p *[2]_C_int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe2(p *[2]_C_int, flags int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go ================================================ // mksyscall.pl -l32 -netbsd -tags netbsd,386 syscall_bsd.go syscall_netbsd.go syscall_netbsd_386.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build netbsd,386 package unix import ( "syscall" "unsafe" ) var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(ngid int, gid *_Gid_t) (n int, err error) { r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(ngid int, gid *_Gid_t) (err error) { _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(s int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { var _p0 unsafe.Pointer if len(mib) > 0 { _p0 = unsafe.Pointer(&mib[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimes(fd int, timeval *[2]Timeval) (err error) { _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, behav int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe() (fd1 int, fd2 int, err error) { r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) fd1 = int(r0) fd2 = int(r1) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chflags(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chmod(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(fd int) (nfd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(from int, to int) (err error) { _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { Syscall(SYS_EXIT, uintptr(code), 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchflags(fd int, flags int) (err error) { _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fpathconf(fd int, name int) (val int, err error) { r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) gid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgrp() (pgrp int) { r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) pgrp = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) pid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Issetugid() (tainted bool) { r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) tainted = bool(r0 != 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, signum syscall.Signal) (err error) { _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kqueue() (fd int, err error) { r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Link(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, backlog int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdir(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifo(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknod(path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Open(path string, mode int, perm uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pathconf(path string, name int) (val int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlink(path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rename(from string, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(to) if err != nil { return } _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Revoke(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rmdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) newoffset = int64(int64(r1)<<32 | int64(r0)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setegid(egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seteuid(euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setgid(gid int) (err error) { _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tp *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setuid(uid int) (err error) { _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlink(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() (err error) { _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(newmask int) (oldmask int) { r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) oldmask = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlink(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) ret = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go ================================================ // mksyscall.pl -netbsd -tags netbsd,amd64 syscall_bsd.go syscall_netbsd.go syscall_netbsd_amd64.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build netbsd,amd64 package unix import ( "syscall" "unsafe" ) var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(ngid int, gid *_Gid_t) (n int, err error) { r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(ngid int, gid *_Gid_t) (err error) { _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(s int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { var _p0 unsafe.Pointer if len(mib) > 0 { _p0 = unsafe.Pointer(&mib[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimes(fd int, timeval *[2]Timeval) (err error) { _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, behav int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe() (fd1 int, fd2 int, err error) { r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) fd1 = int(r0) fd2 = int(r1) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chflags(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chmod(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(fd int) (nfd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(from int, to int) (err error) { _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { Syscall(SYS_EXIT, uintptr(code), 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchflags(fd int, flags int) (err error) { _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fpathconf(fd int, name int) (val int, err error) { r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) gid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgrp() (pgrp int) { r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) pgrp = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) pid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Issetugid() (tainted bool) { r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) tainted = bool(r0 != 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, signum syscall.Signal) (err error) { _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kqueue() (fd int, err error) { r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Link(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, backlog int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdir(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifo(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknod(path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Open(path string, mode int, perm uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pathconf(path string, name int) (val int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlink(path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rename(from string, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(to) if err != nil { return } _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Revoke(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rmdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { r0, _, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(whence), 0, 0) newoffset = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setegid(egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seteuid(euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setgid(gid int) (err error) { _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tp *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setuid(uid int) (err error) { _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlink(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() (err error) { _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(newmask int) (oldmask int) { r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) oldmask = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlink(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), 0, 0) ret = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go ================================================ // mksyscall.pl -l32 -netbsd -arm -tags netbsd,arm syscall_bsd.go syscall_netbsd.go syscall_netbsd_arm.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build netbsd,arm package unix import ( "syscall" "unsafe" ) var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(ngid int, gid *_Gid_t) (n int, err error) { r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(ngid int, gid *_Gid_t) (err error) { _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(s int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { var _p0 unsafe.Pointer if len(mib) > 0 { _p0 = unsafe.Pointer(&mib[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimes(fd int, timeval *[2]Timeval) (err error) { _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, behav int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe() (fd1 int, fd2 int, err error) { r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) fd1 = int(r0) fd2 = int(r1) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chflags(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chmod(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(fd int) (nfd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(from int, to int) (err error) { _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { Syscall(SYS_EXIT, uintptr(code), 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchflags(fd int, flags int) (err error) { _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fpathconf(fd int, name int) (val int, err error) { r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) gid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgrp() (pgrp int) { r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) pgrp = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) pid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Issetugid() (tainted bool) { r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) tainted = bool(r0 != 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, signum syscall.Signal) (err error) { _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kqueue() (fd int, err error) { r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Link(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, backlog int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdir(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifo(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknod(path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Open(path string, mode int, perm uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pathconf(path string, name int) (val int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlink(path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rename(from string, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(to) if err != nil { return } _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Revoke(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rmdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) newoffset = int64(int64(r1)<<32 | int64(r0)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setegid(egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seteuid(euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setgid(gid int) (err error) { _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tp *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setuid(uid int) (err error) { _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlink(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() (err error) { _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(newmask int) (oldmask int) { r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) oldmask = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlink(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) ret = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go ================================================ // mksyscall.pl -l32 -openbsd -tags openbsd,386 syscall_bsd.go syscall_openbsd.go syscall_openbsd_386.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build openbsd,386 package unix import ( "syscall" "unsafe" ) var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(ngid int, gid *_Gid_t) (n int, err error) { r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(ngid int, gid *_Gid_t) (err error) { _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(s int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { var _p0 unsafe.Pointer if len(mib) > 0 { _p0 = unsafe.Pointer(&mib[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimes(fd int, timeval *[2]Timeval) (err error) { _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, behav int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe(p *[2]_C_int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chflags(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chmod(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(fd int) (nfd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(from int, to int) (err error) { _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { Syscall(SYS_EXIT, uintptr(code), 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchflags(fd int, flags int) (err error) { _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fpathconf(fd int, name int) (val int, err error) { r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, stat *Statfs_t) (err error) { _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) gid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgrp() (pgrp int) { r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) pgrp = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) pid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Issetugid() (tainted bool) { r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) tainted = bool(r0 != 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, signum syscall.Signal) (err error) { _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kqueue() (fd int, err error) { r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Link(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, backlog int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdir(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifo(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknod(path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Open(path string, mode int, perm uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pathconf(path string, name int) (val int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlink(path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rename(from string, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(to) if err != nil { return } _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Revoke(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rmdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) newoffset = int64(int64(r1)<<32 | int64(r0)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setegid(egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seteuid(euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setgid(gid int) (err error) { _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setlogin(name string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(name) if err != nil { return } _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresgid(rgid int, egid int, sgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresuid(ruid int, euid int, suid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tp *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setuid(uid int) (err error) { _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, stat *Statfs_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlink(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() (err error) { _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(newmask int) (oldmask int) { r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) oldmask = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlink(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) ret = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go ================================================ // mksyscall.pl -openbsd -tags openbsd,amd64 syscall_bsd.go syscall_openbsd.go syscall_openbsd_amd64.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build openbsd,amd64 package unix import ( "syscall" "unsafe" ) var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(ngid int, gid *_Gid_t) (n int, err error) { r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(ngid int, gid *_Gid_t) (err error) { _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(s int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { var _p0 unsafe.Pointer if len(mib) > 0 { _p0 = unsafe.Pointer(&mib[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimes(fd int, timeval *[2]Timeval) (err error) { _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, behav int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe(p *[2]_C_int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chflags(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chmod(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(fd int) (nfd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(from int, to int) (err error) { _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { Syscall(SYS_EXIT, uintptr(code), 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchflags(fd int, flags int) (err error) { _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fpathconf(fd int, name int) (val int, err error) { r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, stat *Statfs_t) (err error) { _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) gid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgrp() (pgrp int) { r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) pgrp = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) pid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Issetugid() (tainted bool) { r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) tainted = bool(r0 != 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, signum syscall.Signal) (err error) { _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kqueue() (fd int, err error) { r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Link(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, backlog int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdir(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifo(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknod(path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Open(path string, mode int, perm uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pathconf(path string, name int) (val int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlink(path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rename(from string, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(to) if err != nil { return } _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Revoke(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rmdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { r0, _, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(whence), 0, 0) newoffset = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setegid(egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seteuid(euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setgid(gid int) (err error) { _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setlogin(name string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(name) if err != nil { return } _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresgid(rgid int, egid int, sgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresuid(ruid int, euid int, suid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tp *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setuid(uid int) (err error) { _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, stat *Statfs_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlink(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() (err error) { _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(newmask int) (oldmask int) { r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) oldmask = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlink(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), 0, 0) ret = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go ================================================ // mksyscall.pl -l32 -openbsd -arm -tags openbsd,arm syscall_bsd.go syscall_openbsd.go syscall_openbsd_arm.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build openbsd,arm package unix import ( "syscall" "unsafe" ) var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getgroups(ngid int, gid *_Gid_t) (n int, err error) { r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(ngid int, gid *_Gid_t) (err error) { _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(s int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { var _p0 unsafe.Pointer if len(mib) > 0 { _p0 = unsafe.Pointer(&mib[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimes(fd int, timeval *[2]Timeval) (err error) { _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Madvise(b []byte, behav int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Msync(b []byte, flags int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { _p0 = unsafe.Pointer(&b[0]) } else { _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe(p *[2]_C_int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chflags(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chmod(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(fd int) (nfd int, err error) { r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(from int, to int) (err error) { _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exit(code int) { Syscall(SYS_EXIT, uintptr(code), 0, 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchflags(fd int, flags int) (err error) { _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fpathconf(fd int, name int) (val int, err error) { r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, stat *Statfs_t) (err error) { _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) gid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgrp() (pgrp int) { r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) pgrp = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) pid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tv *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) uid = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Issetugid() (tainted bool) { r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) tainted = bool(r0 != 0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kill(pid int, signum syscall.Signal) (err error) { _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kqueue() (fd int, err error) { r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Link(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, backlog int) (err error) { _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdir(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifo(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknod(path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Open(path string, mode int, perm uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pathconf(path string, name int) (val int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlink(path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 unsafe.Pointer if len(buf) > 0 { _p1 = unsafe.Pointer(&buf[0]) } else { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rename(from string, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(to) if err != nil { return } _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Revoke(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rmdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) newoffset = int64(int64(r1)<<32 | int64(r0)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setegid(egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seteuid(euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setgid(gid int) (err error) { _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setlogin(name string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(name) if err != nil { return } _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresgid(rgid int, egid int, sgid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setresuid(ruid int, euid int, suid int) (err error) { _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tp *Timeval) (err error) { _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setuid(uid int) (err error) { _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, stat *Statfs_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlink(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() (err error) { _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(newmask int) (oldmask int) { r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) oldmask = int(r0) return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlink(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { _p0 = unsafe.Pointer(&p[0]) } else { _p0 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) ret = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readlen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writelen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go ================================================ // mksyscall_solaris.pl -tags solaris,amd64 syscall_solaris.go syscall_solaris_amd64.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build solaris,amd64 package unix import ( "syscall" "unsafe" ) //go:cgo_import_dynamic libc_pipe pipe "libc.so" //go:cgo_import_dynamic libc_getsockname getsockname "libsocket.so" //go:cgo_import_dynamic libc_getcwd getcwd "libc.so" //go:cgo_import_dynamic libc_getgroups getgroups "libc.so" //go:cgo_import_dynamic libc_setgroups setgroups "libc.so" //go:cgo_import_dynamic libc_wait4 wait4 "libc.so" //go:cgo_import_dynamic libc_gethostname gethostname "libc.so" //go:cgo_import_dynamic libc_utimes utimes "libc.so" //go:cgo_import_dynamic libc_utimensat utimensat "libc.so" //go:cgo_import_dynamic libc_fcntl fcntl "libc.so" //go:cgo_import_dynamic libc_futimesat futimesat "libc.so" //go:cgo_import_dynamic libc_accept accept "libsocket.so" //go:cgo_import_dynamic libc___xnet_recvmsg __xnet_recvmsg "libsocket.so" //go:cgo_import_dynamic libc___xnet_sendmsg __xnet_sendmsg "libsocket.so" //go:cgo_import_dynamic libc_acct acct "libc.so" //go:cgo_import_dynamic libc___makedev __makedev "libc.so" //go:cgo_import_dynamic libc___major __major "libc.so" //go:cgo_import_dynamic libc___minor __minor "libc.so" //go:cgo_import_dynamic libc_ioctl ioctl "libc.so" //go:cgo_import_dynamic libc_poll poll "libc.so" //go:cgo_import_dynamic libc_access access "libc.so" //go:cgo_import_dynamic libc_adjtime adjtime "libc.so" //go:cgo_import_dynamic libc_chdir chdir "libc.so" //go:cgo_import_dynamic libc_chmod chmod "libc.so" //go:cgo_import_dynamic libc_chown chown "libc.so" //go:cgo_import_dynamic libc_chroot chroot "libc.so" //go:cgo_import_dynamic libc_close close "libc.so" //go:cgo_import_dynamic libc_creat creat "libc.so" //go:cgo_import_dynamic libc_dup dup "libc.so" //go:cgo_import_dynamic libc_dup2 dup2 "libc.so" //go:cgo_import_dynamic libc_exit exit "libc.so" //go:cgo_import_dynamic libc_fchdir fchdir "libc.so" //go:cgo_import_dynamic libc_fchmod fchmod "libc.so" //go:cgo_import_dynamic libc_fchmodat fchmodat "libc.so" //go:cgo_import_dynamic libc_fchown fchown "libc.so" //go:cgo_import_dynamic libc_fchownat fchownat "libc.so" //go:cgo_import_dynamic libc_fdatasync fdatasync "libc.so" //go:cgo_import_dynamic libc_flock flock "libc.so" //go:cgo_import_dynamic libc_fpathconf fpathconf "libc.so" //go:cgo_import_dynamic libc_fstat fstat "libc.so" //go:cgo_import_dynamic libc_fstatvfs fstatvfs "libc.so" //go:cgo_import_dynamic libc_getdents getdents "libc.so" //go:cgo_import_dynamic libc_getgid getgid "libc.so" //go:cgo_import_dynamic libc_getpid getpid "libc.so" //go:cgo_import_dynamic libc_getpgid getpgid "libc.so" //go:cgo_import_dynamic libc_getpgrp getpgrp "libc.so" //go:cgo_import_dynamic libc_geteuid geteuid "libc.so" //go:cgo_import_dynamic libc_getegid getegid "libc.so" //go:cgo_import_dynamic libc_getppid getppid "libc.so" //go:cgo_import_dynamic libc_getpriority getpriority "libc.so" //go:cgo_import_dynamic libc_getrlimit getrlimit "libc.so" //go:cgo_import_dynamic libc_getrusage getrusage "libc.so" //go:cgo_import_dynamic libc_gettimeofday gettimeofday "libc.so" //go:cgo_import_dynamic libc_getuid getuid "libc.so" //go:cgo_import_dynamic libc_kill kill "libc.so" //go:cgo_import_dynamic libc_lchown lchown "libc.so" //go:cgo_import_dynamic libc_link link "libc.so" //go:cgo_import_dynamic libc___xnet_llisten __xnet_llisten "libsocket.so" //go:cgo_import_dynamic libc_lstat lstat "libc.so" //go:cgo_import_dynamic libc_madvise madvise "libc.so" //go:cgo_import_dynamic libc_mkdir mkdir "libc.so" //go:cgo_import_dynamic libc_mkdirat mkdirat "libc.so" //go:cgo_import_dynamic libc_mkfifo mkfifo "libc.so" //go:cgo_import_dynamic libc_mkfifoat mkfifoat "libc.so" //go:cgo_import_dynamic libc_mknod mknod "libc.so" //go:cgo_import_dynamic libc_mknodat mknodat "libc.so" //go:cgo_import_dynamic libc_mlock mlock "libc.so" //go:cgo_import_dynamic libc_mlockall mlockall "libc.so" //go:cgo_import_dynamic libc_mprotect mprotect "libc.so" //go:cgo_import_dynamic libc_msync msync "libc.so" //go:cgo_import_dynamic libc_munlock munlock "libc.so" //go:cgo_import_dynamic libc_munlockall munlockall "libc.so" //go:cgo_import_dynamic libc_nanosleep nanosleep "libc.so" //go:cgo_import_dynamic libc_open open "libc.so" //go:cgo_import_dynamic libc_openat openat "libc.so" //go:cgo_import_dynamic libc_pathconf pathconf "libc.so" //go:cgo_import_dynamic libc_pause pause "libc.so" //go:cgo_import_dynamic libc_pread pread "libc.so" //go:cgo_import_dynamic libc_pwrite pwrite "libc.so" //go:cgo_import_dynamic libc_read read "libc.so" //go:cgo_import_dynamic libc_readlink readlink "libc.so" //go:cgo_import_dynamic libc_rename rename "libc.so" //go:cgo_import_dynamic libc_renameat renameat "libc.so" //go:cgo_import_dynamic libc_rmdir rmdir "libc.so" //go:cgo_import_dynamic libc_lseek lseek "libc.so" //go:cgo_import_dynamic libc_setegid setegid "libc.so" //go:cgo_import_dynamic libc_seteuid seteuid "libc.so" //go:cgo_import_dynamic libc_setgid setgid "libc.so" //go:cgo_import_dynamic libc_sethostname sethostname "libc.so" //go:cgo_import_dynamic libc_setpgid setpgid "libc.so" //go:cgo_import_dynamic libc_setpriority setpriority "libc.so" //go:cgo_import_dynamic libc_setregid setregid "libc.so" //go:cgo_import_dynamic libc_setreuid setreuid "libc.so" //go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" //go:cgo_import_dynamic libc_setsid setsid "libc.so" //go:cgo_import_dynamic libc_setuid setuid "libc.so" //go:cgo_import_dynamic libc_shutdown shutdown "libsocket.so" //go:cgo_import_dynamic libc_stat stat "libc.so" //go:cgo_import_dynamic libc_statvfs statvfs "libc.so" //go:cgo_import_dynamic libc_symlink symlink "libc.so" //go:cgo_import_dynamic libc_sync sync "libc.so" //go:cgo_import_dynamic libc_times times "libc.so" //go:cgo_import_dynamic libc_truncate truncate "libc.so" //go:cgo_import_dynamic libc_fsync fsync "libc.so" //go:cgo_import_dynamic libc_ftruncate ftruncate "libc.so" //go:cgo_import_dynamic libc_umask umask "libc.so" //go:cgo_import_dynamic libc_uname uname "libc.so" //go:cgo_import_dynamic libc_umount umount "libc.so" //go:cgo_import_dynamic libc_unlink unlink "libc.so" //go:cgo_import_dynamic libc_unlinkat unlinkat "libc.so" //go:cgo_import_dynamic libc_ustat ustat "libc.so" //go:cgo_import_dynamic libc_utime utime "libc.so" //go:cgo_import_dynamic libc___xnet_bind __xnet_bind "libsocket.so" //go:cgo_import_dynamic libc___xnet_connect __xnet_connect "libsocket.so" //go:cgo_import_dynamic libc_mmap mmap "libc.so" //go:cgo_import_dynamic libc_munmap munmap "libc.so" //go:cgo_import_dynamic libc___xnet_sendto __xnet_sendto "libsocket.so" //go:cgo_import_dynamic libc___xnet_socket __xnet_socket "libsocket.so" //go:cgo_import_dynamic libc___xnet_socketpair __xnet_socketpair "libsocket.so" //go:cgo_import_dynamic libc_write write "libc.so" //go:cgo_import_dynamic libc___xnet_getsockopt __xnet_getsockopt "libsocket.so" //go:cgo_import_dynamic libc_getpeername getpeername "libsocket.so" //go:cgo_import_dynamic libc_setsockopt setsockopt "libsocket.so" //go:cgo_import_dynamic libc_recvfrom recvfrom "libsocket.so" //go:linkname procpipe libc_pipe //go:linkname procgetsockname libc_getsockname //go:linkname procGetcwd libc_getcwd //go:linkname procgetgroups libc_getgroups //go:linkname procsetgroups libc_setgroups //go:linkname procwait4 libc_wait4 //go:linkname procgethostname libc_gethostname //go:linkname procutimes libc_utimes //go:linkname procutimensat libc_utimensat //go:linkname procfcntl libc_fcntl //go:linkname procfutimesat libc_futimesat //go:linkname procaccept libc_accept //go:linkname proc__xnet_recvmsg libc___xnet_recvmsg //go:linkname proc__xnet_sendmsg libc___xnet_sendmsg //go:linkname procacct libc_acct //go:linkname proc__makedev libc___makedev //go:linkname proc__major libc___major //go:linkname proc__minor libc___minor //go:linkname procioctl libc_ioctl //go:linkname procpoll libc_poll //go:linkname procAccess libc_access //go:linkname procAdjtime libc_adjtime //go:linkname procChdir libc_chdir //go:linkname procChmod libc_chmod //go:linkname procChown libc_chown //go:linkname procChroot libc_chroot //go:linkname procClose libc_close //go:linkname procCreat libc_creat //go:linkname procDup libc_dup //go:linkname procDup2 libc_dup2 //go:linkname procExit libc_exit //go:linkname procFchdir libc_fchdir //go:linkname procFchmod libc_fchmod //go:linkname procFchmodat libc_fchmodat //go:linkname procFchown libc_fchown //go:linkname procFchownat libc_fchownat //go:linkname procFdatasync libc_fdatasync //go:linkname procFlock libc_flock //go:linkname procFpathconf libc_fpathconf //go:linkname procFstat libc_fstat //go:linkname procFstatvfs libc_fstatvfs //go:linkname procGetdents libc_getdents //go:linkname procGetgid libc_getgid //go:linkname procGetpid libc_getpid //go:linkname procGetpgid libc_getpgid //go:linkname procGetpgrp libc_getpgrp //go:linkname procGeteuid libc_geteuid //go:linkname procGetegid libc_getegid //go:linkname procGetppid libc_getppid //go:linkname procGetpriority libc_getpriority //go:linkname procGetrlimit libc_getrlimit //go:linkname procGetrusage libc_getrusage //go:linkname procGettimeofday libc_gettimeofday //go:linkname procGetuid libc_getuid //go:linkname procKill libc_kill //go:linkname procLchown libc_lchown //go:linkname procLink libc_link //go:linkname proc__xnet_llisten libc___xnet_llisten //go:linkname procLstat libc_lstat //go:linkname procMadvise libc_madvise //go:linkname procMkdir libc_mkdir //go:linkname procMkdirat libc_mkdirat //go:linkname procMkfifo libc_mkfifo //go:linkname procMkfifoat libc_mkfifoat //go:linkname procMknod libc_mknod //go:linkname procMknodat libc_mknodat //go:linkname procMlock libc_mlock //go:linkname procMlockall libc_mlockall //go:linkname procMprotect libc_mprotect //go:linkname procMsync libc_msync //go:linkname procMunlock libc_munlock //go:linkname procMunlockall libc_munlockall //go:linkname procNanosleep libc_nanosleep //go:linkname procOpen libc_open //go:linkname procOpenat libc_openat //go:linkname procPathconf libc_pathconf //go:linkname procPause libc_pause //go:linkname procPread libc_pread //go:linkname procPwrite libc_pwrite //go:linkname procread libc_read //go:linkname procReadlink libc_readlink //go:linkname procRename libc_rename //go:linkname procRenameat libc_renameat //go:linkname procRmdir libc_rmdir //go:linkname proclseek libc_lseek //go:linkname procSetegid libc_setegid //go:linkname procSeteuid libc_seteuid //go:linkname procSetgid libc_setgid //go:linkname procSethostname libc_sethostname //go:linkname procSetpgid libc_setpgid //go:linkname procSetpriority libc_setpriority //go:linkname procSetregid libc_setregid //go:linkname procSetreuid libc_setreuid //go:linkname procSetrlimit libc_setrlimit //go:linkname procSetsid libc_setsid //go:linkname procSetuid libc_setuid //go:linkname procshutdown libc_shutdown //go:linkname procStat libc_stat //go:linkname procStatvfs libc_statvfs //go:linkname procSymlink libc_symlink //go:linkname procSync libc_sync //go:linkname procTimes libc_times //go:linkname procTruncate libc_truncate //go:linkname procFsync libc_fsync //go:linkname procFtruncate libc_ftruncate //go:linkname procUmask libc_umask //go:linkname procUname libc_uname //go:linkname procumount libc_umount //go:linkname procUnlink libc_unlink //go:linkname procUnlinkat libc_unlinkat //go:linkname procUstat libc_ustat //go:linkname procUtime libc_utime //go:linkname proc__xnet_bind libc___xnet_bind //go:linkname proc__xnet_connect libc___xnet_connect //go:linkname procmmap libc_mmap //go:linkname procmunmap libc_munmap //go:linkname proc__xnet_sendto libc___xnet_sendto //go:linkname proc__xnet_socket libc___xnet_socket //go:linkname proc__xnet_socketpair libc___xnet_socketpair //go:linkname procwrite libc_write //go:linkname proc__xnet_getsockopt libc___xnet_getsockopt //go:linkname procgetpeername libc_getpeername //go:linkname procsetsockopt libc_setsockopt //go:linkname procrecvfrom libc_recvfrom var ( procpipe, procgetsockname, procGetcwd, procgetgroups, procsetgroups, procwait4, procgethostname, procutimes, procutimensat, procfcntl, procfutimesat, procaccept, proc__xnet_recvmsg, proc__xnet_sendmsg, procacct, proc__makedev, proc__major, proc__minor, procioctl, procpoll, procAccess, procAdjtime, procChdir, procChmod, procChown, procChroot, procClose, procCreat, procDup, procDup2, procExit, procFchdir, procFchmod, procFchmodat, procFchown, procFchownat, procFdatasync, procFlock, procFpathconf, procFstat, procFstatvfs, procGetdents, procGetgid, procGetpid, procGetpgid, procGetpgrp, procGeteuid, procGetegid, procGetppid, procGetpriority, procGetrlimit, procGetrusage, procGettimeofday, procGetuid, procKill, procLchown, procLink, proc__xnet_llisten, procLstat, procMadvise, procMkdir, procMkdirat, procMkfifo, procMkfifoat, procMknod, procMknodat, procMlock, procMlockall, procMprotect, procMsync, procMunlock, procMunlockall, procNanosleep, procOpen, procOpenat, procPathconf, procPause, procPread, procPwrite, procread, procReadlink, procRename, procRenameat, procRmdir, proclseek, procSetegid, procSeteuid, procSetgid, procSethostname, procSetpgid, procSetpriority, procSetregid, procSetreuid, procSetrlimit, procSetsid, procSetuid, procshutdown, procStat, procStatvfs, procSymlink, procSync, procTimes, procTruncate, procFsync, procFtruncate, procUmask, procUname, procumount, procUnlink, procUnlinkat, procUstat, procUtime, proc__xnet_bind, proc__xnet_connect, procmmap, procmunmap, proc__xnet_sendto, proc__xnet_socket, proc__xnet_socketpair, procwrite, proc__xnet_getsockopt, procgetpeername, procsetsockopt, procrecvfrom syscallFunc ) func pipe(p *[2]_C_int) (n int, err error) { r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procpipe)), 1, uintptr(unsafe.Pointer(p)), 0, 0, 0, 0, 0) n = int(r0) if e1 != 0 { err = e1 } return } func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgetsockname)), 3, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) if e1 != 0 { err = e1 } return } func Getcwd(buf []byte) (n int, err error) { var _p0 *byte if len(buf) > 0 { _p0 = &buf[0] } r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetcwd)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), 0, 0, 0, 0) n = int(r0) if e1 != 0 { err = e1 } return } func getgroups(ngid int, gid *_Gid_t) (n int, err error) { r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procgetgroups)), 2, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0, 0, 0, 0) n = int(r0) if e1 != 0 { err = e1 } return } func setgroups(ngid int, gid *_Gid_t) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procsetgroups)), 2, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func wait4(pid int32, statusp *_C_int, options int, rusage *Rusage) (wpid int32, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwait4)), 4, uintptr(pid), uintptr(unsafe.Pointer(statusp)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int32(r0) if e1 != 0 { err = e1 } return } func gethostname(buf []byte) (n int, err error) { var _p0 *byte if len(buf) > 0 { _p0 = &buf[0] } r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgethostname)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), 0, 0, 0, 0) n = int(r0) if e1 != 0 { err = e1 } return } func utimes(path string, times *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procutimes)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func utimensat(fd int, path string, times *[2]Timespec, flag int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procutimensat)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flag), 0, 0) if e1 != 0 { err = e1 } return } func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfcntl)), 3, uintptr(fd), uintptr(cmd), uintptr(arg), 0, 0, 0) val = int(r0) if e1 != 0 { err = e1 } return } func futimesat(fildes int, path *byte, times *[2]Timeval) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfutimesat)), 3, uintptr(fildes), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times)), 0, 0, 0) if e1 != 0 { err = e1 } return } func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procaccept)), 3, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) fd = int(r0) if e1 != 0 { err = e1 } return } func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_recvmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) n = int(r0) if e1 != 0 { err = e1 } return } func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_sendmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) n = int(r0) if e1 != 0 { err = e1 } return } func acct(path *byte) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procacct)), 1, uintptr(unsafe.Pointer(path)), 0, 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func __makedev(version int, major uint, minor uint) (val uint64) { r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&proc__makedev)), 3, uintptr(version), uintptr(major), uintptr(minor), 0, 0, 0) val = uint64(r0) return } func __major(version int, dev uint64) (val uint) { r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&proc__major)), 2, uintptr(version), uintptr(dev), 0, 0, 0, 0) val = uint(r0) return } func __minor(version int, dev uint64) (val uint) { r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&proc__minor)), 2, uintptr(version), uintptr(dev), 0, 0, 0, 0) val = uint(r0) return } func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procioctl)), 3, uintptr(fd), uintptr(req), uintptr(arg), 0, 0, 0) if e1 != 0 { err = e1 } return } func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procpoll)), 3, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout), 0, 0, 0) n = int(r0) if e1 != 0 { err = e1 } return } func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procAccess)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procAdjtime)), 2, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChdir)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Chmod(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChmod)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Chown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChown)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), 0, 0, 0) if e1 != 0 { err = e1 } return } func Chroot(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChroot)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Close(fd int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procClose)), 1, uintptr(fd), 0, 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Creat(path string, mode uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procCreat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) fd = int(r0) if e1 != 0 { err = e1 } return } func Dup(fd int) (nfd int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procDup)), 1, uintptr(fd), 0, 0, 0, 0, 0) nfd = int(r0) if e1 != 0 { err = e1 } return } func Dup2(oldfd int, newfd int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procDup2)), 2, uintptr(oldfd), uintptr(newfd), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Exit(code int) { sysvicall6(uintptr(unsafe.Pointer(&procExit)), 1, uintptr(code), 0, 0, 0, 0, 0) return } func Fchdir(fd int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchdir)), 1, uintptr(fd), 0, 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchmod)), 2, uintptr(fd), uintptr(mode), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchmodat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { err = e1 } return } func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchown)), 3, uintptr(fd), uintptr(uid), uintptr(gid), 0, 0, 0) if e1 != 0 { err = e1 } return } func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchownat)), 5, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { err = e1 } return } func Fdatasync(fd int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFdatasync)), 1, uintptr(fd), 0, 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Flock(fd int, how int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFlock)), 2, uintptr(fd), uintptr(how), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Fpathconf(fd int, name int) (val int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFpathconf)), 2, uintptr(fd), uintptr(name), 0, 0, 0, 0) val = int(r0) if e1 != 0 { err = e1 } return } func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFstat)), 2, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Fstatvfs(fd int, vfsstat *Statvfs_t) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFstatvfs)), 2, uintptr(fd), uintptr(unsafe.Pointer(vfsstat)), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Getdents(fd int, buf []byte, basep *uintptr) (n int, err error) { var _p0 *byte if len(buf) > 0 { _p0 = &buf[0] } r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetdents)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) n = int(r0) if e1 != 0 { err = e1 } return } func Getgid() (gid int) { r0, _, _ := rawSysvicall6(uintptr(unsafe.Pointer(&procGetgid)), 0, 0, 0, 0, 0, 0, 0) gid = int(r0) return } func Getpid() (pid int) { r0, _, _ := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpid)), 0, 0, 0, 0, 0, 0, 0) pid = int(r0) return } func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpgid)), 1, uintptr(pid), 0, 0, 0, 0, 0) pgid = int(r0) if e1 != 0 { err = e1 } return } func Getpgrp() (pgid int, err error) { r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpgrp)), 0, 0, 0, 0, 0, 0, 0) pgid = int(r0) if e1 != 0 { err = e1 } return } func Geteuid() (euid int) { r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procGeteuid)), 0, 0, 0, 0, 0, 0, 0) euid = int(r0) return } func Getegid() (egid int) { r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procGetegid)), 0, 0, 0, 0, 0, 0, 0) egid = int(r0) return } func Getppid() (ppid int) { r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procGetppid)), 0, 0, 0, 0, 0, 0, 0) ppid = int(r0) return } func Getpriority(which int, who int) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetpriority)), 2, uintptr(which), uintptr(who), 0, 0, 0, 0) n = int(r0) if e1 != 0 { err = e1 } return } func Getrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetrlimit)), 2, uintptr(which), uintptr(unsafe.Pointer(lim)), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetrusage)), 2, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Gettimeofday(tv *Timeval) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGettimeofday)), 1, uintptr(unsafe.Pointer(tv)), 0, 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Getuid() (uid int) { r0, _, _ := rawSysvicall6(uintptr(unsafe.Pointer(&procGetuid)), 0, 0, 0, 0, 0, 0, 0) uid = int(r0) return } func Kill(pid int, signum syscall.Signal) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procKill)), 2, uintptr(pid), uintptr(signum), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLchown)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), 0, 0, 0) if e1 != 0 { err = e1 } return } func Link(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLink)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Listen(s int, backlog int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_llisten)), 2, uintptr(s), uintptr(backlog), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Lstat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLstat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Madvise(b []byte, advice int) (err error) { var _p0 *byte if len(b) > 0 { _p0 = &b[0] } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMadvise)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(advice), 0, 0, 0) if e1 != 0 { err = e1 } return } func Mkdir(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkdir)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Mkdirat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkdirat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0) if e1 != 0 { err = e1 } return } func Mkfifo(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkfifo)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Mkfifoat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkfifoat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0) if e1 != 0 { err = e1 } return } func Mknod(path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMknod)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0, 0) if e1 != 0 { err = e1 } return } func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMknodat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) if e1 != 0 { err = e1 } return } func Mlock(b []byte) (err error) { var _p0 *byte if len(b) > 0 { _p0 = &b[0] } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMlock)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Mlockall(flags int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMlockall)), 1, uintptr(flags), 0, 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Mprotect(b []byte, prot int) (err error) { var _p0 *byte if len(b) > 0 { _p0 = &b[0] } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMprotect)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(prot), 0, 0, 0) if e1 != 0 { err = e1 } return } func Msync(b []byte, flags int) (err error) { var _p0 *byte if len(b) > 0 { _p0 = &b[0] } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMsync)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(flags), 0, 0, 0) if e1 != 0 { err = e1 } return } func Munlock(b []byte) (err error) { var _p0 *byte if len(b) > 0 { _p0 = &b[0] } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMunlock)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Munlockall() (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMunlockall)), 0, 0, 0, 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procNanosleep)), 2, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Open(path string, mode int, perm uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procOpen)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0, 0) fd = int(r0) if e1 != 0 { err = e1 } return } func Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procOpenat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) fd = int(r0) if e1 != 0 { err = e1 } return } func Pathconf(path string, name int) (val int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPathconf)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0, 0, 0, 0) val = int(r0) if e1 != 0 { err = e1 } return } func Pause() (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPause)), 0, 0, 0, 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 *byte if len(p) > 0 { _p0 = &p[0] } r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPread)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = e1 } return } func Pwrite(fd int, p []byte, offset int64) (n int, err error) { var _p0 *byte if len(p) > 0 { _p0 = &p[0] } r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPwrite)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = e1 } return } func read(fd int, p []byte) (n int, err error) { var _p0 *byte if len(p) > 0 { _p0 = &p[0] } r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procread)), 3, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0) n = int(r0) if e1 != 0 { err = e1 } return } func Readlink(path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte if len(buf) > 0 { _p1 = &buf[0] } r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procReadlink)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(len(buf)), 0, 0, 0) n = int(r0) if e1 != 0 { err = e1 } return } func Rename(from string, to string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(from) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(to) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRename)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(newpath) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRenameat)), 4, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { err = e1 } return } func Rmdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRmdir)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proclseek)), 3, uintptr(fd), uintptr(offset), uintptr(whence), 0, 0, 0) newoffset = int64(r0) if e1 != 0 { err = e1 } return } func Setegid(egid int) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetegid)), 1, uintptr(egid), 0, 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Seteuid(euid int) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSeteuid)), 1, uintptr(euid), 0, 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Setgid(gid int) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetgid)), 1, uintptr(gid), 0, 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Sethostname(p []byte) (err error) { var _p0 *byte if len(p) > 0 { _p0 = &p[0] } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSethostname)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Setpgid(pid int, pgid int) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetpgid)), 2, uintptr(pid), uintptr(pgid), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSetpriority)), 3, uintptr(which), uintptr(who), uintptr(prio), 0, 0, 0) if e1 != 0 { err = e1 } return } func Setregid(rgid int, egid int) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetregid)), 2, uintptr(rgid), uintptr(egid), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Setreuid(ruid int, euid int) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetreuid)), 2, uintptr(ruid), uintptr(euid), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Setrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetrlimit)), 2, uintptr(which), uintptr(unsafe.Pointer(lim)), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Setsid() (pid int, err error) { r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetsid)), 0, 0, 0, 0, 0, 0, 0) pid = int(r0) if e1 != 0 { err = e1 } return } func Setuid(uid int) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetuid)), 1, uintptr(uid), 0, 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Shutdown(s int, how int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procshutdown)), 2, uintptr(s), uintptr(how), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Stat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procStat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Statvfs(path string, vfsstat *Statvfs_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procStatvfs)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(vfsstat)), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Symlink(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } var _p1 *byte _p1, err = BytePtrFromString(link) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSymlink)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Sync() (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSync)), 0, 0, 0, 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Times(tms *Tms) (ticks uintptr, err error) { r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procTimes)), 1, uintptr(unsafe.Pointer(tms)), 0, 0, 0, 0, 0) ticks = uintptr(r0) if e1 != 0 { err = e1 } return } func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procTruncate)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Fsync(fd int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFsync)), 1, uintptr(fd), 0, 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Ftruncate(fd int, length int64) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFtruncate)), 2, uintptr(fd), uintptr(length), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Umask(mask int) (oldmask int) { r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procUmask)), 1, uintptr(mask), 0, 0, 0, 0, 0) oldmask = int(r0) return } func Uname(buf *Utsname) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procUname)), 1, uintptr(unsafe.Pointer(buf)), 0, 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Unmount(target string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(target) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procumount)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Unlink(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUnlink)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Unlinkat(dirfd int, path string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUnlinkat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0, 0, 0) if e1 != 0 { err = e1 } return } func Ustat(dev int, ubuf *Ustat_t) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUstat)), 2, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func Utime(path string, buf *Utimbuf) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUtime)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_bind)), 3, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) if e1 != 0 { err = e1 } return } func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_connect)), 3, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) if e1 != 0 { err = e1 } return } func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procmmap)), 6, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) ret = uintptr(r0) if e1 != 0 { err = e1 } return } func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procmunmap)), 2, uintptr(addr), uintptr(length), 0, 0, 0, 0) if e1 != 0 { err = e1 } return } func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { var _p0 *byte if len(buf) > 0 { _p0 = &buf[0] } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_sendto)), 6, uintptr(s), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = e1 } return } func socket(domain int, typ int, proto int) (fd int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_socket)), 3, uintptr(domain), uintptr(typ), uintptr(proto), 0, 0, 0) fd = int(r0) if e1 != 0 { err = e1 } return } func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&proc__xnet_socketpair)), 4, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = e1 } return } func write(fd int, p []byte) (n int, err error) { var _p0 *byte if len(p) > 0 { _p0 = &p[0] } r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwrite)), 3, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0) n = int(r0) if e1 != 0 { err = e1 } return } func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_getsockopt)), 5, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = e1 } return } func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procgetpeername)), 3, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) if e1 != 0 { err = e1 } return } func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procsetsockopt)), 5, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = e1 } return } func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { var _p0 *byte if len(p) > 0 { _p0 = &p[0] } r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procrecvfrom)), 6, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { err = e1 } return } ================================================ FILE: vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go ================================================ // mksysctl_openbsd.pl // MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT package unix type mibentry struct { ctlname string ctloid []_C_int } var sysctlMib = []mibentry{ {"ddb.console", []_C_int{9, 6}}, {"ddb.log", []_C_int{9, 7}}, {"ddb.max_line", []_C_int{9, 3}}, {"ddb.max_width", []_C_int{9, 2}}, {"ddb.panic", []_C_int{9, 5}}, {"ddb.radix", []_C_int{9, 1}}, {"ddb.tab_stop_width", []_C_int{9, 4}}, {"ddb.trigger", []_C_int{9, 8}}, {"fs.posix.setuid", []_C_int{3, 1, 1}}, {"hw.allowpowerdown", []_C_int{6, 22}}, {"hw.byteorder", []_C_int{6, 4}}, {"hw.cpuspeed", []_C_int{6, 12}}, {"hw.diskcount", []_C_int{6, 10}}, {"hw.disknames", []_C_int{6, 8}}, {"hw.diskstats", []_C_int{6, 9}}, {"hw.machine", []_C_int{6, 1}}, {"hw.model", []_C_int{6, 2}}, {"hw.ncpu", []_C_int{6, 3}}, {"hw.ncpufound", []_C_int{6, 21}}, {"hw.pagesize", []_C_int{6, 7}}, {"hw.physmem", []_C_int{6, 19}}, {"hw.product", []_C_int{6, 15}}, {"hw.serialno", []_C_int{6, 17}}, {"hw.setperf", []_C_int{6, 13}}, {"hw.usermem", []_C_int{6, 20}}, {"hw.uuid", []_C_int{6, 18}}, {"hw.vendor", []_C_int{6, 14}}, {"hw.version", []_C_int{6, 16}}, {"kern.arandom", []_C_int{1, 37}}, {"kern.argmax", []_C_int{1, 8}}, {"kern.boottime", []_C_int{1, 21}}, {"kern.bufcachepercent", []_C_int{1, 72}}, {"kern.ccpu", []_C_int{1, 45}}, {"kern.clockrate", []_C_int{1, 12}}, {"kern.consdev", []_C_int{1, 75}}, {"kern.cp_time", []_C_int{1, 40}}, {"kern.cp_time2", []_C_int{1, 71}}, {"kern.cryptodevallowsoft", []_C_int{1, 53}}, {"kern.domainname", []_C_int{1, 22}}, {"kern.file", []_C_int{1, 73}}, {"kern.forkstat", []_C_int{1, 42}}, {"kern.fscale", []_C_int{1, 46}}, {"kern.fsync", []_C_int{1, 33}}, {"kern.hostid", []_C_int{1, 11}}, {"kern.hostname", []_C_int{1, 10}}, {"kern.intrcnt.nintrcnt", []_C_int{1, 63, 1}}, {"kern.job_control", []_C_int{1, 19}}, {"kern.malloc.buckets", []_C_int{1, 39, 1}}, {"kern.malloc.kmemnames", []_C_int{1, 39, 3}}, {"kern.maxclusters", []_C_int{1, 67}}, {"kern.maxfiles", []_C_int{1, 7}}, {"kern.maxlocksperuid", []_C_int{1, 70}}, {"kern.maxpartitions", []_C_int{1, 23}}, {"kern.maxproc", []_C_int{1, 6}}, {"kern.maxthread", []_C_int{1, 25}}, {"kern.maxvnodes", []_C_int{1, 5}}, {"kern.mbstat", []_C_int{1, 59}}, {"kern.msgbuf", []_C_int{1, 48}}, {"kern.msgbufsize", []_C_int{1, 38}}, {"kern.nchstats", []_C_int{1, 41}}, {"kern.netlivelocks", []_C_int{1, 76}}, {"kern.nfiles", []_C_int{1, 56}}, {"kern.ngroups", []_C_int{1, 18}}, {"kern.nosuidcoredump", []_C_int{1, 32}}, {"kern.nprocs", []_C_int{1, 47}}, {"kern.nselcoll", []_C_int{1, 43}}, {"kern.nthreads", []_C_int{1, 26}}, {"kern.numvnodes", []_C_int{1, 58}}, {"kern.osrelease", []_C_int{1, 2}}, {"kern.osrevision", []_C_int{1, 3}}, {"kern.ostype", []_C_int{1, 1}}, {"kern.osversion", []_C_int{1, 27}}, {"kern.pool_debug", []_C_int{1, 77}}, {"kern.posix1version", []_C_int{1, 17}}, {"kern.proc", []_C_int{1, 66}}, {"kern.random", []_C_int{1, 31}}, {"kern.rawpartition", []_C_int{1, 24}}, {"kern.saved_ids", []_C_int{1, 20}}, {"kern.securelevel", []_C_int{1, 9}}, {"kern.seminfo", []_C_int{1, 61}}, {"kern.shminfo", []_C_int{1, 62}}, {"kern.somaxconn", []_C_int{1, 28}}, {"kern.sominconn", []_C_int{1, 29}}, {"kern.splassert", []_C_int{1, 54}}, {"kern.stackgap_random", []_C_int{1, 50}}, {"kern.sysvipc_info", []_C_int{1, 51}}, {"kern.sysvmsg", []_C_int{1, 34}}, {"kern.sysvsem", []_C_int{1, 35}}, {"kern.sysvshm", []_C_int{1, 36}}, {"kern.timecounter.choice", []_C_int{1, 69, 4}}, {"kern.timecounter.hardware", []_C_int{1, 69, 3}}, {"kern.timecounter.tick", []_C_int{1, 69, 1}}, {"kern.timecounter.timestepwarnings", []_C_int{1, 69, 2}}, {"kern.tty.maxptys", []_C_int{1, 44, 6}}, {"kern.tty.nptys", []_C_int{1, 44, 7}}, {"kern.tty.tk_cancc", []_C_int{1, 44, 4}}, {"kern.tty.tk_nin", []_C_int{1, 44, 1}}, {"kern.tty.tk_nout", []_C_int{1, 44, 2}}, {"kern.tty.tk_rawcc", []_C_int{1, 44, 3}}, {"kern.tty.ttyinfo", []_C_int{1, 44, 5}}, {"kern.ttycount", []_C_int{1, 57}}, {"kern.userasymcrypto", []_C_int{1, 60}}, {"kern.usercrypto", []_C_int{1, 52}}, {"kern.usermount", []_C_int{1, 30}}, {"kern.version", []_C_int{1, 4}}, {"kern.vnode", []_C_int{1, 13}}, {"kern.watchdog.auto", []_C_int{1, 64, 2}}, {"kern.watchdog.period", []_C_int{1, 64, 1}}, {"net.bpf.bufsize", []_C_int{4, 31, 1}}, {"net.bpf.maxbufsize", []_C_int{4, 31, 2}}, {"net.inet.ah.enable", []_C_int{4, 2, 51, 1}}, {"net.inet.ah.stats", []_C_int{4, 2, 51, 2}}, {"net.inet.carp.allow", []_C_int{4, 2, 112, 1}}, {"net.inet.carp.log", []_C_int{4, 2, 112, 3}}, {"net.inet.carp.preempt", []_C_int{4, 2, 112, 2}}, {"net.inet.carp.stats", []_C_int{4, 2, 112, 4}}, {"net.inet.divert.recvspace", []_C_int{4, 2, 258, 1}}, {"net.inet.divert.sendspace", []_C_int{4, 2, 258, 2}}, {"net.inet.divert.stats", []_C_int{4, 2, 258, 3}}, {"net.inet.esp.enable", []_C_int{4, 2, 50, 1}}, {"net.inet.esp.stats", []_C_int{4, 2, 50, 4}}, {"net.inet.esp.udpencap", []_C_int{4, 2, 50, 2}}, {"net.inet.esp.udpencap_port", []_C_int{4, 2, 50, 3}}, {"net.inet.etherip.allow", []_C_int{4, 2, 97, 1}}, {"net.inet.etherip.stats", []_C_int{4, 2, 97, 2}}, {"net.inet.gre.allow", []_C_int{4, 2, 47, 1}}, {"net.inet.gre.wccp", []_C_int{4, 2, 47, 2}}, {"net.inet.icmp.bmcastecho", []_C_int{4, 2, 1, 2}}, {"net.inet.icmp.errppslimit", []_C_int{4, 2, 1, 3}}, {"net.inet.icmp.maskrepl", []_C_int{4, 2, 1, 1}}, {"net.inet.icmp.rediraccept", []_C_int{4, 2, 1, 4}}, {"net.inet.icmp.redirtimeout", []_C_int{4, 2, 1, 5}}, {"net.inet.icmp.stats", []_C_int{4, 2, 1, 7}}, {"net.inet.icmp.tstamprepl", []_C_int{4, 2, 1, 6}}, {"net.inet.igmp.stats", []_C_int{4, 2, 2, 1}}, {"net.inet.ip.arpqueued", []_C_int{4, 2, 0, 36}}, {"net.inet.ip.encdebug", []_C_int{4, 2, 0, 12}}, {"net.inet.ip.forwarding", []_C_int{4, 2, 0, 1}}, {"net.inet.ip.ifq.congestion", []_C_int{4, 2, 0, 30, 4}}, {"net.inet.ip.ifq.drops", []_C_int{4, 2, 0, 30, 3}}, {"net.inet.ip.ifq.len", []_C_int{4, 2, 0, 30, 1}}, {"net.inet.ip.ifq.maxlen", []_C_int{4, 2, 0, 30, 2}}, {"net.inet.ip.maxqueue", []_C_int{4, 2, 0, 11}}, {"net.inet.ip.mforwarding", []_C_int{4, 2, 0, 31}}, {"net.inet.ip.mrtproto", []_C_int{4, 2, 0, 34}}, {"net.inet.ip.mrtstats", []_C_int{4, 2, 0, 35}}, {"net.inet.ip.mtu", []_C_int{4, 2, 0, 4}}, {"net.inet.ip.mtudisc", []_C_int{4, 2, 0, 27}}, {"net.inet.ip.mtudisctimeout", []_C_int{4, 2, 0, 28}}, {"net.inet.ip.multipath", []_C_int{4, 2, 0, 32}}, {"net.inet.ip.portfirst", []_C_int{4, 2, 0, 7}}, {"net.inet.ip.porthifirst", []_C_int{4, 2, 0, 9}}, {"net.inet.ip.porthilast", []_C_int{4, 2, 0, 10}}, {"net.inet.ip.portlast", []_C_int{4, 2, 0, 8}}, {"net.inet.ip.redirect", []_C_int{4, 2, 0, 2}}, {"net.inet.ip.sourceroute", []_C_int{4, 2, 0, 5}}, {"net.inet.ip.stats", []_C_int{4, 2, 0, 33}}, {"net.inet.ip.ttl", []_C_int{4, 2, 0, 3}}, {"net.inet.ipcomp.enable", []_C_int{4, 2, 108, 1}}, {"net.inet.ipcomp.stats", []_C_int{4, 2, 108, 2}}, {"net.inet.ipip.allow", []_C_int{4, 2, 4, 1}}, {"net.inet.ipip.stats", []_C_int{4, 2, 4, 2}}, {"net.inet.mobileip.allow", []_C_int{4, 2, 55, 1}}, {"net.inet.pfsync.stats", []_C_int{4, 2, 240, 1}}, {"net.inet.pim.stats", []_C_int{4, 2, 103, 1}}, {"net.inet.tcp.ackonpush", []_C_int{4, 2, 6, 13}}, {"net.inet.tcp.always_keepalive", []_C_int{4, 2, 6, 22}}, {"net.inet.tcp.baddynamic", []_C_int{4, 2, 6, 6}}, {"net.inet.tcp.drop", []_C_int{4, 2, 6, 19}}, {"net.inet.tcp.ecn", []_C_int{4, 2, 6, 14}}, {"net.inet.tcp.ident", []_C_int{4, 2, 6, 9}}, {"net.inet.tcp.keepidle", []_C_int{4, 2, 6, 3}}, {"net.inet.tcp.keepinittime", []_C_int{4, 2, 6, 2}}, {"net.inet.tcp.keepintvl", []_C_int{4, 2, 6, 4}}, {"net.inet.tcp.mssdflt", []_C_int{4, 2, 6, 11}}, {"net.inet.tcp.reasslimit", []_C_int{4, 2, 6, 18}}, {"net.inet.tcp.rfc1323", []_C_int{4, 2, 6, 1}}, {"net.inet.tcp.rfc3390", []_C_int{4, 2, 6, 17}}, {"net.inet.tcp.rstppslimit", []_C_int{4, 2, 6, 12}}, {"net.inet.tcp.sack", []_C_int{4, 2, 6, 10}}, {"net.inet.tcp.sackholelimit", []_C_int{4, 2, 6, 20}}, {"net.inet.tcp.slowhz", []_C_int{4, 2, 6, 5}}, {"net.inet.tcp.stats", []_C_int{4, 2, 6, 21}}, {"net.inet.tcp.synbucketlimit", []_C_int{4, 2, 6, 16}}, {"net.inet.tcp.syncachelimit", []_C_int{4, 2, 6, 15}}, {"net.inet.udp.baddynamic", []_C_int{4, 2, 17, 2}}, {"net.inet.udp.checksum", []_C_int{4, 2, 17, 1}}, {"net.inet.udp.recvspace", []_C_int{4, 2, 17, 3}}, {"net.inet.udp.sendspace", []_C_int{4, 2, 17, 4}}, {"net.inet.udp.stats", []_C_int{4, 2, 17, 5}}, {"net.inet6.divert.recvspace", []_C_int{4, 24, 86, 1}}, {"net.inet6.divert.sendspace", []_C_int{4, 24, 86, 2}}, {"net.inet6.divert.stats", []_C_int{4, 24, 86, 3}}, {"net.inet6.icmp6.errppslimit", []_C_int{4, 24, 30, 14}}, {"net.inet6.icmp6.mtudisc_hiwat", []_C_int{4, 24, 30, 16}}, {"net.inet6.icmp6.mtudisc_lowat", []_C_int{4, 24, 30, 17}}, {"net.inet6.icmp6.nd6_debug", []_C_int{4, 24, 30, 18}}, {"net.inet6.icmp6.nd6_delay", []_C_int{4, 24, 30, 8}}, {"net.inet6.icmp6.nd6_maxnudhint", []_C_int{4, 24, 30, 15}}, {"net.inet6.icmp6.nd6_mmaxtries", []_C_int{4, 24, 30, 10}}, {"net.inet6.icmp6.nd6_prune", []_C_int{4, 24, 30, 6}}, {"net.inet6.icmp6.nd6_umaxtries", []_C_int{4, 24, 30, 9}}, {"net.inet6.icmp6.nd6_useloopback", []_C_int{4, 24, 30, 11}}, {"net.inet6.icmp6.nodeinfo", []_C_int{4, 24, 30, 13}}, {"net.inet6.icmp6.rediraccept", []_C_int{4, 24, 30, 2}}, {"net.inet6.icmp6.redirtimeout", []_C_int{4, 24, 30, 3}}, {"net.inet6.ip6.accept_rtadv", []_C_int{4, 24, 17, 12}}, {"net.inet6.ip6.auto_flowlabel", []_C_int{4, 24, 17, 17}}, {"net.inet6.ip6.dad_count", []_C_int{4, 24, 17, 16}}, {"net.inet6.ip6.dad_pending", []_C_int{4, 24, 17, 49}}, {"net.inet6.ip6.defmcasthlim", []_C_int{4, 24, 17, 18}}, {"net.inet6.ip6.forwarding", []_C_int{4, 24, 17, 1}}, {"net.inet6.ip6.forwsrcrt", []_C_int{4, 24, 17, 5}}, {"net.inet6.ip6.hdrnestlimit", []_C_int{4, 24, 17, 15}}, {"net.inet6.ip6.hlim", []_C_int{4, 24, 17, 3}}, {"net.inet6.ip6.log_interval", []_C_int{4, 24, 17, 14}}, {"net.inet6.ip6.maxdynroutes", []_C_int{4, 24, 17, 48}}, {"net.inet6.ip6.maxfragpackets", []_C_int{4, 24, 17, 9}}, {"net.inet6.ip6.maxfrags", []_C_int{4, 24, 17, 41}}, {"net.inet6.ip6.maxifdefrouters", []_C_int{4, 24, 17, 47}}, {"net.inet6.ip6.maxifprefixes", []_C_int{4, 24, 17, 46}}, {"net.inet6.ip6.mforwarding", []_C_int{4, 24, 17, 42}}, {"net.inet6.ip6.mrtproto", []_C_int{4, 24, 17, 8}}, {"net.inet6.ip6.mtudisctimeout", []_C_int{4, 24, 17, 50}}, {"net.inet6.ip6.multicast_mtudisc", []_C_int{4, 24, 17, 44}}, {"net.inet6.ip6.multipath", []_C_int{4, 24, 17, 43}}, {"net.inet6.ip6.neighborgcthresh", []_C_int{4, 24, 17, 45}}, {"net.inet6.ip6.redirect", []_C_int{4, 24, 17, 2}}, {"net.inet6.ip6.rr_prune", []_C_int{4, 24, 17, 22}}, {"net.inet6.ip6.sourcecheck", []_C_int{4, 24, 17, 10}}, {"net.inet6.ip6.sourcecheck_logint", []_C_int{4, 24, 17, 11}}, {"net.inet6.ip6.use_deprecated", []_C_int{4, 24, 17, 21}}, {"net.inet6.ip6.v6only", []_C_int{4, 24, 17, 24}}, {"net.key.sadb_dump", []_C_int{4, 30, 1}}, {"net.key.spd_dump", []_C_int{4, 30, 2}}, {"net.mpls.ifq.congestion", []_C_int{4, 33, 3, 4}}, {"net.mpls.ifq.drops", []_C_int{4, 33, 3, 3}}, {"net.mpls.ifq.len", []_C_int{4, 33, 3, 1}}, {"net.mpls.ifq.maxlen", []_C_int{4, 33, 3, 2}}, {"net.mpls.mapttl_ip", []_C_int{4, 33, 5}}, {"net.mpls.mapttl_ip6", []_C_int{4, 33, 6}}, {"net.mpls.maxloop_inkernel", []_C_int{4, 33, 4}}, {"net.mpls.ttl", []_C_int{4, 33, 2}}, {"net.pflow.stats", []_C_int{4, 34, 1}}, {"net.pipex.enable", []_C_int{4, 35, 1}}, {"vm.anonmin", []_C_int{2, 7}}, {"vm.loadavg", []_C_int{2, 2}}, {"vm.maxslp", []_C_int{2, 10}}, {"vm.nkmempages", []_C_int{2, 6}}, {"vm.psstrings", []_C_int{2, 3}}, {"vm.swapencrypt.enable", []_C_int{2, 5, 0}}, {"vm.swapencrypt.keyscreated", []_C_int{2, 5, 1}}, {"vm.swapencrypt.keysdeleted", []_C_int{2, 5, 2}}, {"vm.uspace", []_C_int{2, 11}}, {"vm.uvmexp", []_C_int{2, 4}}, {"vm.vmmeter", []_C_int{2, 1}}, {"vm.vnodemin", []_C_int{2, 9}}, {"vm.vtextmin", []_C_int{2, 8}}, } ================================================ FILE: vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go ================================================ // mksysctl_openbsd.pl // MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT package unix type mibentry struct { ctlname string ctloid []_C_int } var sysctlMib = []mibentry{ {"ddb.console", []_C_int{9, 6}}, {"ddb.log", []_C_int{9, 7}}, {"ddb.max_line", []_C_int{9, 3}}, {"ddb.max_width", []_C_int{9, 2}}, {"ddb.panic", []_C_int{9, 5}}, {"ddb.radix", []_C_int{9, 1}}, {"ddb.tab_stop_width", []_C_int{9, 4}}, {"ddb.trigger", []_C_int{9, 8}}, {"fs.posix.setuid", []_C_int{3, 1, 1}}, {"hw.allowpowerdown", []_C_int{6, 22}}, {"hw.byteorder", []_C_int{6, 4}}, {"hw.cpuspeed", []_C_int{6, 12}}, {"hw.diskcount", []_C_int{6, 10}}, {"hw.disknames", []_C_int{6, 8}}, {"hw.diskstats", []_C_int{6, 9}}, {"hw.machine", []_C_int{6, 1}}, {"hw.model", []_C_int{6, 2}}, {"hw.ncpu", []_C_int{6, 3}}, {"hw.ncpufound", []_C_int{6, 21}}, {"hw.pagesize", []_C_int{6, 7}}, {"hw.physmem", []_C_int{6, 19}}, {"hw.product", []_C_int{6, 15}}, {"hw.serialno", []_C_int{6, 17}}, {"hw.setperf", []_C_int{6, 13}}, {"hw.usermem", []_C_int{6, 20}}, {"hw.uuid", []_C_int{6, 18}}, {"hw.vendor", []_C_int{6, 14}}, {"hw.version", []_C_int{6, 16}}, {"kern.arandom", []_C_int{1, 37}}, {"kern.argmax", []_C_int{1, 8}}, {"kern.boottime", []_C_int{1, 21}}, {"kern.bufcachepercent", []_C_int{1, 72}}, {"kern.ccpu", []_C_int{1, 45}}, {"kern.clockrate", []_C_int{1, 12}}, {"kern.consdev", []_C_int{1, 75}}, {"kern.cp_time", []_C_int{1, 40}}, {"kern.cp_time2", []_C_int{1, 71}}, {"kern.cryptodevallowsoft", []_C_int{1, 53}}, {"kern.domainname", []_C_int{1, 22}}, {"kern.file", []_C_int{1, 73}}, {"kern.forkstat", []_C_int{1, 42}}, {"kern.fscale", []_C_int{1, 46}}, {"kern.fsync", []_C_int{1, 33}}, {"kern.hostid", []_C_int{1, 11}}, {"kern.hostname", []_C_int{1, 10}}, {"kern.intrcnt.nintrcnt", []_C_int{1, 63, 1}}, {"kern.job_control", []_C_int{1, 19}}, {"kern.malloc.buckets", []_C_int{1, 39, 1}}, {"kern.malloc.kmemnames", []_C_int{1, 39, 3}}, {"kern.maxclusters", []_C_int{1, 67}}, {"kern.maxfiles", []_C_int{1, 7}}, {"kern.maxlocksperuid", []_C_int{1, 70}}, {"kern.maxpartitions", []_C_int{1, 23}}, {"kern.maxproc", []_C_int{1, 6}}, {"kern.maxthread", []_C_int{1, 25}}, {"kern.maxvnodes", []_C_int{1, 5}}, {"kern.mbstat", []_C_int{1, 59}}, {"kern.msgbuf", []_C_int{1, 48}}, {"kern.msgbufsize", []_C_int{1, 38}}, {"kern.nchstats", []_C_int{1, 41}}, {"kern.netlivelocks", []_C_int{1, 76}}, {"kern.nfiles", []_C_int{1, 56}}, {"kern.ngroups", []_C_int{1, 18}}, {"kern.nosuidcoredump", []_C_int{1, 32}}, {"kern.nprocs", []_C_int{1, 47}}, {"kern.nselcoll", []_C_int{1, 43}}, {"kern.nthreads", []_C_int{1, 26}}, {"kern.numvnodes", []_C_int{1, 58}}, {"kern.osrelease", []_C_int{1, 2}}, {"kern.osrevision", []_C_int{1, 3}}, {"kern.ostype", []_C_int{1, 1}}, {"kern.osversion", []_C_int{1, 27}}, {"kern.pool_debug", []_C_int{1, 77}}, {"kern.posix1version", []_C_int{1, 17}}, {"kern.proc", []_C_int{1, 66}}, {"kern.random", []_C_int{1, 31}}, {"kern.rawpartition", []_C_int{1, 24}}, {"kern.saved_ids", []_C_int{1, 20}}, {"kern.securelevel", []_C_int{1, 9}}, {"kern.seminfo", []_C_int{1, 61}}, {"kern.shminfo", []_C_int{1, 62}}, {"kern.somaxconn", []_C_int{1, 28}}, {"kern.sominconn", []_C_int{1, 29}}, {"kern.splassert", []_C_int{1, 54}}, {"kern.stackgap_random", []_C_int{1, 50}}, {"kern.sysvipc_info", []_C_int{1, 51}}, {"kern.sysvmsg", []_C_int{1, 34}}, {"kern.sysvsem", []_C_int{1, 35}}, {"kern.sysvshm", []_C_int{1, 36}}, {"kern.timecounter.choice", []_C_int{1, 69, 4}}, {"kern.timecounter.hardware", []_C_int{1, 69, 3}}, {"kern.timecounter.tick", []_C_int{1, 69, 1}}, {"kern.timecounter.timestepwarnings", []_C_int{1, 69, 2}}, {"kern.tty.maxptys", []_C_int{1, 44, 6}}, {"kern.tty.nptys", []_C_int{1, 44, 7}}, {"kern.tty.tk_cancc", []_C_int{1, 44, 4}}, {"kern.tty.tk_nin", []_C_int{1, 44, 1}}, {"kern.tty.tk_nout", []_C_int{1, 44, 2}}, {"kern.tty.tk_rawcc", []_C_int{1, 44, 3}}, {"kern.tty.ttyinfo", []_C_int{1, 44, 5}}, {"kern.ttycount", []_C_int{1, 57}}, {"kern.userasymcrypto", []_C_int{1, 60}}, {"kern.usercrypto", []_C_int{1, 52}}, {"kern.usermount", []_C_int{1, 30}}, {"kern.version", []_C_int{1, 4}}, {"kern.vnode", []_C_int{1, 13}}, {"kern.watchdog.auto", []_C_int{1, 64, 2}}, {"kern.watchdog.period", []_C_int{1, 64, 1}}, {"net.bpf.bufsize", []_C_int{4, 31, 1}}, {"net.bpf.maxbufsize", []_C_int{4, 31, 2}}, {"net.inet.ah.enable", []_C_int{4, 2, 51, 1}}, {"net.inet.ah.stats", []_C_int{4, 2, 51, 2}}, {"net.inet.carp.allow", []_C_int{4, 2, 112, 1}}, {"net.inet.carp.log", []_C_int{4, 2, 112, 3}}, {"net.inet.carp.preempt", []_C_int{4, 2, 112, 2}}, {"net.inet.carp.stats", []_C_int{4, 2, 112, 4}}, {"net.inet.divert.recvspace", []_C_int{4, 2, 258, 1}}, {"net.inet.divert.sendspace", []_C_int{4, 2, 258, 2}}, {"net.inet.divert.stats", []_C_int{4, 2, 258, 3}}, {"net.inet.esp.enable", []_C_int{4, 2, 50, 1}}, {"net.inet.esp.stats", []_C_int{4, 2, 50, 4}}, {"net.inet.esp.udpencap", []_C_int{4, 2, 50, 2}}, {"net.inet.esp.udpencap_port", []_C_int{4, 2, 50, 3}}, {"net.inet.etherip.allow", []_C_int{4, 2, 97, 1}}, {"net.inet.etherip.stats", []_C_int{4, 2, 97, 2}}, {"net.inet.gre.allow", []_C_int{4, 2, 47, 1}}, {"net.inet.gre.wccp", []_C_int{4, 2, 47, 2}}, {"net.inet.icmp.bmcastecho", []_C_int{4, 2, 1, 2}}, {"net.inet.icmp.errppslimit", []_C_int{4, 2, 1, 3}}, {"net.inet.icmp.maskrepl", []_C_int{4, 2, 1, 1}}, {"net.inet.icmp.rediraccept", []_C_int{4, 2, 1, 4}}, {"net.inet.icmp.redirtimeout", []_C_int{4, 2, 1, 5}}, {"net.inet.icmp.stats", []_C_int{4, 2, 1, 7}}, {"net.inet.icmp.tstamprepl", []_C_int{4, 2, 1, 6}}, {"net.inet.igmp.stats", []_C_int{4, 2, 2, 1}}, {"net.inet.ip.arpqueued", []_C_int{4, 2, 0, 36}}, {"net.inet.ip.encdebug", []_C_int{4, 2, 0, 12}}, {"net.inet.ip.forwarding", []_C_int{4, 2, 0, 1}}, {"net.inet.ip.ifq.congestion", []_C_int{4, 2, 0, 30, 4}}, {"net.inet.ip.ifq.drops", []_C_int{4, 2, 0, 30, 3}}, {"net.inet.ip.ifq.len", []_C_int{4, 2, 0, 30, 1}}, {"net.inet.ip.ifq.maxlen", []_C_int{4, 2, 0, 30, 2}}, {"net.inet.ip.maxqueue", []_C_int{4, 2, 0, 11}}, {"net.inet.ip.mforwarding", []_C_int{4, 2, 0, 31}}, {"net.inet.ip.mrtproto", []_C_int{4, 2, 0, 34}}, {"net.inet.ip.mrtstats", []_C_int{4, 2, 0, 35}}, {"net.inet.ip.mtu", []_C_int{4, 2, 0, 4}}, {"net.inet.ip.mtudisc", []_C_int{4, 2, 0, 27}}, {"net.inet.ip.mtudisctimeout", []_C_int{4, 2, 0, 28}}, {"net.inet.ip.multipath", []_C_int{4, 2, 0, 32}}, {"net.inet.ip.portfirst", []_C_int{4, 2, 0, 7}}, {"net.inet.ip.porthifirst", []_C_int{4, 2, 0, 9}}, {"net.inet.ip.porthilast", []_C_int{4, 2, 0, 10}}, {"net.inet.ip.portlast", []_C_int{4, 2, 0, 8}}, {"net.inet.ip.redirect", []_C_int{4, 2, 0, 2}}, {"net.inet.ip.sourceroute", []_C_int{4, 2, 0, 5}}, {"net.inet.ip.stats", []_C_int{4, 2, 0, 33}}, {"net.inet.ip.ttl", []_C_int{4, 2, 0, 3}}, {"net.inet.ipcomp.enable", []_C_int{4, 2, 108, 1}}, {"net.inet.ipcomp.stats", []_C_int{4, 2, 108, 2}}, {"net.inet.ipip.allow", []_C_int{4, 2, 4, 1}}, {"net.inet.ipip.stats", []_C_int{4, 2, 4, 2}}, {"net.inet.mobileip.allow", []_C_int{4, 2, 55, 1}}, {"net.inet.pfsync.stats", []_C_int{4, 2, 240, 1}}, {"net.inet.pim.stats", []_C_int{4, 2, 103, 1}}, {"net.inet.tcp.ackonpush", []_C_int{4, 2, 6, 13}}, {"net.inet.tcp.always_keepalive", []_C_int{4, 2, 6, 22}}, {"net.inet.tcp.baddynamic", []_C_int{4, 2, 6, 6}}, {"net.inet.tcp.drop", []_C_int{4, 2, 6, 19}}, {"net.inet.tcp.ecn", []_C_int{4, 2, 6, 14}}, {"net.inet.tcp.ident", []_C_int{4, 2, 6, 9}}, {"net.inet.tcp.keepidle", []_C_int{4, 2, 6, 3}}, {"net.inet.tcp.keepinittime", []_C_int{4, 2, 6, 2}}, {"net.inet.tcp.keepintvl", []_C_int{4, 2, 6, 4}}, {"net.inet.tcp.mssdflt", []_C_int{4, 2, 6, 11}}, {"net.inet.tcp.reasslimit", []_C_int{4, 2, 6, 18}}, {"net.inet.tcp.rfc1323", []_C_int{4, 2, 6, 1}}, {"net.inet.tcp.rfc3390", []_C_int{4, 2, 6, 17}}, {"net.inet.tcp.rstppslimit", []_C_int{4, 2, 6, 12}}, {"net.inet.tcp.sack", []_C_int{4, 2, 6, 10}}, {"net.inet.tcp.sackholelimit", []_C_int{4, 2, 6, 20}}, {"net.inet.tcp.slowhz", []_C_int{4, 2, 6, 5}}, {"net.inet.tcp.stats", []_C_int{4, 2, 6, 21}}, {"net.inet.tcp.synbucketlimit", []_C_int{4, 2, 6, 16}}, {"net.inet.tcp.syncachelimit", []_C_int{4, 2, 6, 15}}, {"net.inet.udp.baddynamic", []_C_int{4, 2, 17, 2}}, {"net.inet.udp.checksum", []_C_int{4, 2, 17, 1}}, {"net.inet.udp.recvspace", []_C_int{4, 2, 17, 3}}, {"net.inet.udp.sendspace", []_C_int{4, 2, 17, 4}}, {"net.inet.udp.stats", []_C_int{4, 2, 17, 5}}, {"net.inet6.divert.recvspace", []_C_int{4, 24, 86, 1}}, {"net.inet6.divert.sendspace", []_C_int{4, 24, 86, 2}}, {"net.inet6.divert.stats", []_C_int{4, 24, 86, 3}}, {"net.inet6.icmp6.errppslimit", []_C_int{4, 24, 30, 14}}, {"net.inet6.icmp6.mtudisc_hiwat", []_C_int{4, 24, 30, 16}}, {"net.inet6.icmp6.mtudisc_lowat", []_C_int{4, 24, 30, 17}}, {"net.inet6.icmp6.nd6_debug", []_C_int{4, 24, 30, 18}}, {"net.inet6.icmp6.nd6_delay", []_C_int{4, 24, 30, 8}}, {"net.inet6.icmp6.nd6_maxnudhint", []_C_int{4, 24, 30, 15}}, {"net.inet6.icmp6.nd6_mmaxtries", []_C_int{4, 24, 30, 10}}, {"net.inet6.icmp6.nd6_prune", []_C_int{4, 24, 30, 6}}, {"net.inet6.icmp6.nd6_umaxtries", []_C_int{4, 24, 30, 9}}, {"net.inet6.icmp6.nd6_useloopback", []_C_int{4, 24, 30, 11}}, {"net.inet6.icmp6.nodeinfo", []_C_int{4, 24, 30, 13}}, {"net.inet6.icmp6.rediraccept", []_C_int{4, 24, 30, 2}}, {"net.inet6.icmp6.redirtimeout", []_C_int{4, 24, 30, 3}}, {"net.inet6.ip6.accept_rtadv", []_C_int{4, 24, 17, 12}}, {"net.inet6.ip6.auto_flowlabel", []_C_int{4, 24, 17, 17}}, {"net.inet6.ip6.dad_count", []_C_int{4, 24, 17, 16}}, {"net.inet6.ip6.dad_pending", []_C_int{4, 24, 17, 49}}, {"net.inet6.ip6.defmcasthlim", []_C_int{4, 24, 17, 18}}, {"net.inet6.ip6.forwarding", []_C_int{4, 24, 17, 1}}, {"net.inet6.ip6.forwsrcrt", []_C_int{4, 24, 17, 5}}, {"net.inet6.ip6.hdrnestlimit", []_C_int{4, 24, 17, 15}}, {"net.inet6.ip6.hlim", []_C_int{4, 24, 17, 3}}, {"net.inet6.ip6.log_interval", []_C_int{4, 24, 17, 14}}, {"net.inet6.ip6.maxdynroutes", []_C_int{4, 24, 17, 48}}, {"net.inet6.ip6.maxfragpackets", []_C_int{4, 24, 17, 9}}, {"net.inet6.ip6.maxfrags", []_C_int{4, 24, 17, 41}}, {"net.inet6.ip6.maxifdefrouters", []_C_int{4, 24, 17, 47}}, {"net.inet6.ip6.maxifprefixes", []_C_int{4, 24, 17, 46}}, {"net.inet6.ip6.mforwarding", []_C_int{4, 24, 17, 42}}, {"net.inet6.ip6.mrtproto", []_C_int{4, 24, 17, 8}}, {"net.inet6.ip6.mtudisctimeout", []_C_int{4, 24, 17, 50}}, {"net.inet6.ip6.multicast_mtudisc", []_C_int{4, 24, 17, 44}}, {"net.inet6.ip6.multipath", []_C_int{4, 24, 17, 43}}, {"net.inet6.ip6.neighborgcthresh", []_C_int{4, 24, 17, 45}}, {"net.inet6.ip6.redirect", []_C_int{4, 24, 17, 2}}, {"net.inet6.ip6.rr_prune", []_C_int{4, 24, 17, 22}}, {"net.inet6.ip6.sourcecheck", []_C_int{4, 24, 17, 10}}, {"net.inet6.ip6.sourcecheck_logint", []_C_int{4, 24, 17, 11}}, {"net.inet6.ip6.use_deprecated", []_C_int{4, 24, 17, 21}}, {"net.inet6.ip6.v6only", []_C_int{4, 24, 17, 24}}, {"net.key.sadb_dump", []_C_int{4, 30, 1}}, {"net.key.spd_dump", []_C_int{4, 30, 2}}, {"net.mpls.ifq.congestion", []_C_int{4, 33, 3, 4}}, {"net.mpls.ifq.drops", []_C_int{4, 33, 3, 3}}, {"net.mpls.ifq.len", []_C_int{4, 33, 3, 1}}, {"net.mpls.ifq.maxlen", []_C_int{4, 33, 3, 2}}, {"net.mpls.mapttl_ip", []_C_int{4, 33, 5}}, {"net.mpls.mapttl_ip6", []_C_int{4, 33, 6}}, {"net.mpls.maxloop_inkernel", []_C_int{4, 33, 4}}, {"net.mpls.ttl", []_C_int{4, 33, 2}}, {"net.pflow.stats", []_C_int{4, 34, 1}}, {"net.pipex.enable", []_C_int{4, 35, 1}}, {"vm.anonmin", []_C_int{2, 7}}, {"vm.loadavg", []_C_int{2, 2}}, {"vm.maxslp", []_C_int{2, 10}}, {"vm.nkmempages", []_C_int{2, 6}}, {"vm.psstrings", []_C_int{2, 3}}, {"vm.swapencrypt.enable", []_C_int{2, 5, 0}}, {"vm.swapencrypt.keyscreated", []_C_int{2, 5, 1}}, {"vm.swapencrypt.keysdeleted", []_C_int{2, 5, 2}}, {"vm.uspace", []_C_int{2, 11}}, {"vm.uvmexp", []_C_int{2, 4}}, {"vm.vmmeter", []_C_int{2, 1}}, {"vm.vnodemin", []_C_int{2, 9}}, {"vm.vtextmin", []_C_int{2, 8}}, } ================================================ FILE: vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go ================================================ // mksysctl_openbsd.pl // MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT package unix type mibentry struct { ctlname string ctloid []_C_int } var sysctlMib = []mibentry{ {"ddb.console", []_C_int{9, 6}}, {"ddb.log", []_C_int{9, 7}}, {"ddb.max_line", []_C_int{9, 3}}, {"ddb.max_width", []_C_int{9, 2}}, {"ddb.panic", []_C_int{9, 5}}, {"ddb.radix", []_C_int{9, 1}}, {"ddb.tab_stop_width", []_C_int{9, 4}}, {"ddb.trigger", []_C_int{9, 8}}, {"fs.posix.setuid", []_C_int{3, 1, 1}}, {"hw.allowpowerdown", []_C_int{6, 22}}, {"hw.byteorder", []_C_int{6, 4}}, {"hw.cpuspeed", []_C_int{6, 12}}, {"hw.diskcount", []_C_int{6, 10}}, {"hw.disknames", []_C_int{6, 8}}, {"hw.diskstats", []_C_int{6, 9}}, {"hw.machine", []_C_int{6, 1}}, {"hw.model", []_C_int{6, 2}}, {"hw.ncpu", []_C_int{6, 3}}, {"hw.ncpufound", []_C_int{6, 21}}, {"hw.pagesize", []_C_int{6, 7}}, {"hw.physmem", []_C_int{6, 19}}, {"hw.product", []_C_int{6, 15}}, {"hw.serialno", []_C_int{6, 17}}, {"hw.setperf", []_C_int{6, 13}}, {"hw.usermem", []_C_int{6, 20}}, {"hw.uuid", []_C_int{6, 18}}, {"hw.vendor", []_C_int{6, 14}}, {"hw.version", []_C_int{6, 16}}, {"kern.arandom", []_C_int{1, 37}}, {"kern.argmax", []_C_int{1, 8}}, {"kern.boottime", []_C_int{1, 21}}, {"kern.bufcachepercent", []_C_int{1, 72}}, {"kern.ccpu", []_C_int{1, 45}}, {"kern.clockrate", []_C_int{1, 12}}, {"kern.consdev", []_C_int{1, 75}}, {"kern.cp_time", []_C_int{1, 40}}, {"kern.cp_time2", []_C_int{1, 71}}, {"kern.cryptodevallowsoft", []_C_int{1, 53}}, {"kern.domainname", []_C_int{1, 22}}, {"kern.file", []_C_int{1, 73}}, {"kern.forkstat", []_C_int{1, 42}}, {"kern.fscale", []_C_int{1, 46}}, {"kern.fsync", []_C_int{1, 33}}, {"kern.hostid", []_C_int{1, 11}}, {"kern.hostname", []_C_int{1, 10}}, {"kern.intrcnt.nintrcnt", []_C_int{1, 63, 1}}, {"kern.job_control", []_C_int{1, 19}}, {"kern.malloc.buckets", []_C_int{1, 39, 1}}, {"kern.malloc.kmemnames", []_C_int{1, 39, 3}}, {"kern.maxclusters", []_C_int{1, 67}}, {"kern.maxfiles", []_C_int{1, 7}}, {"kern.maxlocksperuid", []_C_int{1, 70}}, {"kern.maxpartitions", []_C_int{1, 23}}, {"kern.maxproc", []_C_int{1, 6}}, {"kern.maxthread", []_C_int{1, 25}}, {"kern.maxvnodes", []_C_int{1, 5}}, {"kern.mbstat", []_C_int{1, 59}}, {"kern.msgbuf", []_C_int{1, 48}}, {"kern.msgbufsize", []_C_int{1, 38}}, {"kern.nchstats", []_C_int{1, 41}}, {"kern.netlivelocks", []_C_int{1, 76}}, {"kern.nfiles", []_C_int{1, 56}}, {"kern.ngroups", []_C_int{1, 18}}, {"kern.nosuidcoredump", []_C_int{1, 32}}, {"kern.nprocs", []_C_int{1, 47}}, {"kern.nselcoll", []_C_int{1, 43}}, {"kern.nthreads", []_C_int{1, 26}}, {"kern.numvnodes", []_C_int{1, 58}}, {"kern.osrelease", []_C_int{1, 2}}, {"kern.osrevision", []_C_int{1, 3}}, {"kern.ostype", []_C_int{1, 1}}, {"kern.osversion", []_C_int{1, 27}}, {"kern.pool_debug", []_C_int{1, 77}}, {"kern.posix1version", []_C_int{1, 17}}, {"kern.proc", []_C_int{1, 66}}, {"kern.random", []_C_int{1, 31}}, {"kern.rawpartition", []_C_int{1, 24}}, {"kern.saved_ids", []_C_int{1, 20}}, {"kern.securelevel", []_C_int{1, 9}}, {"kern.seminfo", []_C_int{1, 61}}, {"kern.shminfo", []_C_int{1, 62}}, {"kern.somaxconn", []_C_int{1, 28}}, {"kern.sominconn", []_C_int{1, 29}}, {"kern.splassert", []_C_int{1, 54}}, {"kern.stackgap_random", []_C_int{1, 50}}, {"kern.sysvipc_info", []_C_int{1, 51}}, {"kern.sysvmsg", []_C_int{1, 34}}, {"kern.sysvsem", []_C_int{1, 35}}, {"kern.sysvshm", []_C_int{1, 36}}, {"kern.timecounter.choice", []_C_int{1, 69, 4}}, {"kern.timecounter.hardware", []_C_int{1, 69, 3}}, {"kern.timecounter.tick", []_C_int{1, 69, 1}}, {"kern.timecounter.timestepwarnings", []_C_int{1, 69, 2}}, {"kern.tty.maxptys", []_C_int{1, 44, 6}}, {"kern.tty.nptys", []_C_int{1, 44, 7}}, {"kern.tty.tk_cancc", []_C_int{1, 44, 4}}, {"kern.tty.tk_nin", []_C_int{1, 44, 1}}, {"kern.tty.tk_nout", []_C_int{1, 44, 2}}, {"kern.tty.tk_rawcc", []_C_int{1, 44, 3}}, {"kern.tty.ttyinfo", []_C_int{1, 44, 5}}, {"kern.ttycount", []_C_int{1, 57}}, {"kern.userasymcrypto", []_C_int{1, 60}}, {"kern.usercrypto", []_C_int{1, 52}}, {"kern.usermount", []_C_int{1, 30}}, {"kern.version", []_C_int{1, 4}}, {"kern.vnode", []_C_int{1, 13}}, {"kern.watchdog.auto", []_C_int{1, 64, 2}}, {"kern.watchdog.period", []_C_int{1, 64, 1}}, {"net.bpf.bufsize", []_C_int{4, 31, 1}}, {"net.bpf.maxbufsize", []_C_int{4, 31, 2}}, {"net.inet.ah.enable", []_C_int{4, 2, 51, 1}}, {"net.inet.ah.stats", []_C_int{4, 2, 51, 2}}, {"net.inet.carp.allow", []_C_int{4, 2, 112, 1}}, {"net.inet.carp.log", []_C_int{4, 2, 112, 3}}, {"net.inet.carp.preempt", []_C_int{4, 2, 112, 2}}, {"net.inet.carp.stats", []_C_int{4, 2, 112, 4}}, {"net.inet.divert.recvspace", []_C_int{4, 2, 258, 1}}, {"net.inet.divert.sendspace", []_C_int{4, 2, 258, 2}}, {"net.inet.divert.stats", []_C_int{4, 2, 258, 3}}, {"net.inet.esp.enable", []_C_int{4, 2, 50, 1}}, {"net.inet.esp.stats", []_C_int{4, 2, 50, 4}}, {"net.inet.esp.udpencap", []_C_int{4, 2, 50, 2}}, {"net.inet.esp.udpencap_port", []_C_int{4, 2, 50, 3}}, {"net.inet.etherip.allow", []_C_int{4, 2, 97, 1}}, {"net.inet.etherip.stats", []_C_int{4, 2, 97, 2}}, {"net.inet.gre.allow", []_C_int{4, 2, 47, 1}}, {"net.inet.gre.wccp", []_C_int{4, 2, 47, 2}}, {"net.inet.icmp.bmcastecho", []_C_int{4, 2, 1, 2}}, {"net.inet.icmp.errppslimit", []_C_int{4, 2, 1, 3}}, {"net.inet.icmp.maskrepl", []_C_int{4, 2, 1, 1}}, {"net.inet.icmp.rediraccept", []_C_int{4, 2, 1, 4}}, {"net.inet.icmp.redirtimeout", []_C_int{4, 2, 1, 5}}, {"net.inet.icmp.stats", []_C_int{4, 2, 1, 7}}, {"net.inet.icmp.tstamprepl", []_C_int{4, 2, 1, 6}}, {"net.inet.igmp.stats", []_C_int{4, 2, 2, 1}}, {"net.inet.ip.arpqueued", []_C_int{4, 2, 0, 36}}, {"net.inet.ip.encdebug", []_C_int{4, 2, 0, 12}}, {"net.inet.ip.forwarding", []_C_int{4, 2, 0, 1}}, {"net.inet.ip.ifq.congestion", []_C_int{4, 2, 0, 30, 4}}, {"net.inet.ip.ifq.drops", []_C_int{4, 2, 0, 30, 3}}, {"net.inet.ip.ifq.len", []_C_int{4, 2, 0, 30, 1}}, {"net.inet.ip.ifq.maxlen", []_C_int{4, 2, 0, 30, 2}}, {"net.inet.ip.maxqueue", []_C_int{4, 2, 0, 11}}, {"net.inet.ip.mforwarding", []_C_int{4, 2, 0, 31}}, {"net.inet.ip.mrtproto", []_C_int{4, 2, 0, 34}}, {"net.inet.ip.mrtstats", []_C_int{4, 2, 0, 35}}, {"net.inet.ip.mtu", []_C_int{4, 2, 0, 4}}, {"net.inet.ip.mtudisc", []_C_int{4, 2, 0, 27}}, {"net.inet.ip.mtudisctimeout", []_C_int{4, 2, 0, 28}}, {"net.inet.ip.multipath", []_C_int{4, 2, 0, 32}}, {"net.inet.ip.portfirst", []_C_int{4, 2, 0, 7}}, {"net.inet.ip.porthifirst", []_C_int{4, 2, 0, 9}}, {"net.inet.ip.porthilast", []_C_int{4, 2, 0, 10}}, {"net.inet.ip.portlast", []_C_int{4, 2, 0, 8}}, {"net.inet.ip.redirect", []_C_int{4, 2, 0, 2}}, {"net.inet.ip.sourceroute", []_C_int{4, 2, 0, 5}}, {"net.inet.ip.stats", []_C_int{4, 2, 0, 33}}, {"net.inet.ip.ttl", []_C_int{4, 2, 0, 3}}, {"net.inet.ipcomp.enable", []_C_int{4, 2, 108, 1}}, {"net.inet.ipcomp.stats", []_C_int{4, 2, 108, 2}}, {"net.inet.ipip.allow", []_C_int{4, 2, 4, 1}}, {"net.inet.ipip.stats", []_C_int{4, 2, 4, 2}}, {"net.inet.mobileip.allow", []_C_int{4, 2, 55, 1}}, {"net.inet.pfsync.stats", []_C_int{4, 2, 240, 1}}, {"net.inet.pim.stats", []_C_int{4, 2, 103, 1}}, {"net.inet.tcp.ackonpush", []_C_int{4, 2, 6, 13}}, {"net.inet.tcp.always_keepalive", []_C_int{4, 2, 6, 22}}, {"net.inet.tcp.baddynamic", []_C_int{4, 2, 6, 6}}, {"net.inet.tcp.drop", []_C_int{4, 2, 6, 19}}, {"net.inet.tcp.ecn", []_C_int{4, 2, 6, 14}}, {"net.inet.tcp.ident", []_C_int{4, 2, 6, 9}}, {"net.inet.tcp.keepidle", []_C_int{4, 2, 6, 3}}, {"net.inet.tcp.keepinittime", []_C_int{4, 2, 6, 2}}, {"net.inet.tcp.keepintvl", []_C_int{4, 2, 6, 4}}, {"net.inet.tcp.mssdflt", []_C_int{4, 2, 6, 11}}, {"net.inet.tcp.reasslimit", []_C_int{4, 2, 6, 18}}, {"net.inet.tcp.rfc1323", []_C_int{4, 2, 6, 1}}, {"net.inet.tcp.rfc3390", []_C_int{4, 2, 6, 17}}, {"net.inet.tcp.rstppslimit", []_C_int{4, 2, 6, 12}}, {"net.inet.tcp.sack", []_C_int{4, 2, 6, 10}}, {"net.inet.tcp.sackholelimit", []_C_int{4, 2, 6, 20}}, {"net.inet.tcp.slowhz", []_C_int{4, 2, 6, 5}}, {"net.inet.tcp.stats", []_C_int{4, 2, 6, 21}}, {"net.inet.tcp.synbucketlimit", []_C_int{4, 2, 6, 16}}, {"net.inet.tcp.syncachelimit", []_C_int{4, 2, 6, 15}}, {"net.inet.udp.baddynamic", []_C_int{4, 2, 17, 2}}, {"net.inet.udp.checksum", []_C_int{4, 2, 17, 1}}, {"net.inet.udp.recvspace", []_C_int{4, 2, 17, 3}}, {"net.inet.udp.sendspace", []_C_int{4, 2, 17, 4}}, {"net.inet.udp.stats", []_C_int{4, 2, 17, 5}}, {"net.inet6.divert.recvspace", []_C_int{4, 24, 86, 1}}, {"net.inet6.divert.sendspace", []_C_int{4, 24, 86, 2}}, {"net.inet6.divert.stats", []_C_int{4, 24, 86, 3}}, {"net.inet6.icmp6.errppslimit", []_C_int{4, 24, 30, 14}}, {"net.inet6.icmp6.mtudisc_hiwat", []_C_int{4, 24, 30, 16}}, {"net.inet6.icmp6.mtudisc_lowat", []_C_int{4, 24, 30, 17}}, {"net.inet6.icmp6.nd6_debug", []_C_int{4, 24, 30, 18}}, {"net.inet6.icmp6.nd6_delay", []_C_int{4, 24, 30, 8}}, {"net.inet6.icmp6.nd6_maxnudhint", []_C_int{4, 24, 30, 15}}, {"net.inet6.icmp6.nd6_mmaxtries", []_C_int{4, 24, 30, 10}}, {"net.inet6.icmp6.nd6_prune", []_C_int{4, 24, 30, 6}}, {"net.inet6.icmp6.nd6_umaxtries", []_C_int{4, 24, 30, 9}}, {"net.inet6.icmp6.nd6_useloopback", []_C_int{4, 24, 30, 11}}, {"net.inet6.icmp6.nodeinfo", []_C_int{4, 24, 30, 13}}, {"net.inet6.icmp6.rediraccept", []_C_int{4, 24, 30, 2}}, {"net.inet6.icmp6.redirtimeout", []_C_int{4, 24, 30, 3}}, {"net.inet6.ip6.accept_rtadv", []_C_int{4, 24, 17, 12}}, {"net.inet6.ip6.auto_flowlabel", []_C_int{4, 24, 17, 17}}, {"net.inet6.ip6.dad_count", []_C_int{4, 24, 17, 16}}, {"net.inet6.ip6.dad_pending", []_C_int{4, 24, 17, 49}}, {"net.inet6.ip6.defmcasthlim", []_C_int{4, 24, 17, 18}}, {"net.inet6.ip6.forwarding", []_C_int{4, 24, 17, 1}}, {"net.inet6.ip6.forwsrcrt", []_C_int{4, 24, 17, 5}}, {"net.inet6.ip6.hdrnestlimit", []_C_int{4, 24, 17, 15}}, {"net.inet6.ip6.hlim", []_C_int{4, 24, 17, 3}}, {"net.inet6.ip6.log_interval", []_C_int{4, 24, 17, 14}}, {"net.inet6.ip6.maxdynroutes", []_C_int{4, 24, 17, 48}}, {"net.inet6.ip6.maxfragpackets", []_C_int{4, 24, 17, 9}}, {"net.inet6.ip6.maxfrags", []_C_int{4, 24, 17, 41}}, {"net.inet6.ip6.maxifdefrouters", []_C_int{4, 24, 17, 47}}, {"net.inet6.ip6.maxifprefixes", []_C_int{4, 24, 17, 46}}, {"net.inet6.ip6.mforwarding", []_C_int{4, 24, 17, 42}}, {"net.inet6.ip6.mrtproto", []_C_int{4, 24, 17, 8}}, {"net.inet6.ip6.mtudisctimeout", []_C_int{4, 24, 17, 50}}, {"net.inet6.ip6.multicast_mtudisc", []_C_int{4, 24, 17, 44}}, {"net.inet6.ip6.multipath", []_C_int{4, 24, 17, 43}}, {"net.inet6.ip6.neighborgcthresh", []_C_int{4, 24, 17, 45}}, {"net.inet6.ip6.redirect", []_C_int{4, 24, 17, 2}}, {"net.inet6.ip6.rr_prune", []_C_int{4, 24, 17, 22}}, {"net.inet6.ip6.sourcecheck", []_C_int{4, 24, 17, 10}}, {"net.inet6.ip6.sourcecheck_logint", []_C_int{4, 24, 17, 11}}, {"net.inet6.ip6.use_deprecated", []_C_int{4, 24, 17, 21}}, {"net.inet6.ip6.v6only", []_C_int{4, 24, 17, 24}}, {"net.key.sadb_dump", []_C_int{4, 30, 1}}, {"net.key.spd_dump", []_C_int{4, 30, 2}}, {"net.mpls.ifq.congestion", []_C_int{4, 33, 3, 4}}, {"net.mpls.ifq.drops", []_C_int{4, 33, 3, 3}}, {"net.mpls.ifq.len", []_C_int{4, 33, 3, 1}}, {"net.mpls.ifq.maxlen", []_C_int{4, 33, 3, 2}}, {"net.mpls.mapttl_ip", []_C_int{4, 33, 5}}, {"net.mpls.mapttl_ip6", []_C_int{4, 33, 6}}, {"net.mpls.maxloop_inkernel", []_C_int{4, 33, 4}}, {"net.mpls.ttl", []_C_int{4, 33, 2}}, {"net.pflow.stats", []_C_int{4, 34, 1}}, {"net.pipex.enable", []_C_int{4, 35, 1}}, {"vm.anonmin", []_C_int{2, 7}}, {"vm.loadavg", []_C_int{2, 2}}, {"vm.maxslp", []_C_int{2, 10}}, {"vm.nkmempages", []_C_int{2, 6}}, {"vm.psstrings", []_C_int{2, 3}}, {"vm.swapencrypt.enable", []_C_int{2, 5, 0}}, {"vm.swapencrypt.keyscreated", []_C_int{2, 5, 1}}, {"vm.swapencrypt.keysdeleted", []_C_int{2, 5, 2}}, {"vm.uspace", []_C_int{2, 11}}, {"vm.uvmexp", []_C_int{2, 4}}, {"vm.vmmeter", []_C_int{2, 1}}, {"vm.vnodemin", []_C_int{2, 9}}, {"vm.vtextmin", []_C_int{2, 8}}, } ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go ================================================ // mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/sys/syscall.h // Code generated by the command above; see README.md. DO NOT EDIT. // +build 386,darwin package unix const ( SYS_SYSCALL = 0 SYS_EXIT = 1 SYS_FORK = 2 SYS_READ = 3 SYS_WRITE = 4 SYS_OPEN = 5 SYS_CLOSE = 6 SYS_WAIT4 = 7 SYS_LINK = 9 SYS_UNLINK = 10 SYS_CHDIR = 12 SYS_FCHDIR = 13 SYS_MKNOD = 14 SYS_CHMOD = 15 SYS_CHOWN = 16 SYS_GETFSSTAT = 18 SYS_GETPID = 20 SYS_SETUID = 23 SYS_GETUID = 24 SYS_GETEUID = 25 SYS_PTRACE = 26 SYS_RECVMSG = 27 SYS_SENDMSG = 28 SYS_RECVFROM = 29 SYS_ACCEPT = 30 SYS_GETPEERNAME = 31 SYS_GETSOCKNAME = 32 SYS_ACCESS = 33 SYS_CHFLAGS = 34 SYS_FCHFLAGS = 35 SYS_SYNC = 36 SYS_KILL = 37 SYS_GETPPID = 39 SYS_DUP = 41 SYS_PIPE = 42 SYS_GETEGID = 43 SYS_SIGACTION = 46 SYS_GETGID = 47 SYS_SIGPROCMASK = 48 SYS_GETLOGIN = 49 SYS_SETLOGIN = 50 SYS_ACCT = 51 SYS_SIGPENDING = 52 SYS_SIGALTSTACK = 53 SYS_IOCTL = 54 SYS_REBOOT = 55 SYS_REVOKE = 56 SYS_SYMLINK = 57 SYS_READLINK = 58 SYS_EXECVE = 59 SYS_UMASK = 60 SYS_CHROOT = 61 SYS_MSYNC = 65 SYS_VFORK = 66 SYS_MUNMAP = 73 SYS_MPROTECT = 74 SYS_MADVISE = 75 SYS_MINCORE = 78 SYS_GETGROUPS = 79 SYS_SETGROUPS = 80 SYS_GETPGRP = 81 SYS_SETPGID = 82 SYS_SETITIMER = 83 SYS_SWAPON = 85 SYS_GETITIMER = 86 SYS_GETDTABLESIZE = 89 SYS_DUP2 = 90 SYS_FCNTL = 92 SYS_SELECT = 93 SYS_FSYNC = 95 SYS_SETPRIORITY = 96 SYS_SOCKET = 97 SYS_CONNECT = 98 SYS_GETPRIORITY = 100 SYS_BIND = 104 SYS_SETSOCKOPT = 105 SYS_LISTEN = 106 SYS_SIGSUSPEND = 111 SYS_GETTIMEOFDAY = 116 SYS_GETRUSAGE = 117 SYS_GETSOCKOPT = 118 SYS_READV = 120 SYS_WRITEV = 121 SYS_SETTIMEOFDAY = 122 SYS_FCHOWN = 123 SYS_FCHMOD = 124 SYS_SETREUID = 126 SYS_SETREGID = 127 SYS_RENAME = 128 SYS_FLOCK = 131 SYS_MKFIFO = 132 SYS_SENDTO = 133 SYS_SHUTDOWN = 134 SYS_SOCKETPAIR = 135 SYS_MKDIR = 136 SYS_RMDIR = 137 SYS_UTIMES = 138 SYS_FUTIMES = 139 SYS_ADJTIME = 140 SYS_GETHOSTUUID = 142 SYS_SETSID = 147 SYS_GETPGID = 151 SYS_SETPRIVEXEC = 152 SYS_PREAD = 153 SYS_PWRITE = 154 SYS_NFSSVC = 155 SYS_STATFS = 157 SYS_FSTATFS = 158 SYS_UNMOUNT = 159 SYS_GETFH = 161 SYS_QUOTACTL = 165 SYS_MOUNT = 167 SYS_CSOPS = 169 SYS_CSOPS_AUDITTOKEN = 170 SYS_WAITID = 173 SYS_KDEBUG_TYPEFILTER = 177 SYS_KDEBUG_TRACE_STRING = 178 SYS_KDEBUG_TRACE64 = 179 SYS_KDEBUG_TRACE = 180 SYS_SETGID = 181 SYS_SETEGID = 182 SYS_SETEUID = 183 SYS_SIGRETURN = 184 SYS_THREAD_SELFCOUNTS = 186 SYS_FDATASYNC = 187 SYS_STAT = 188 SYS_FSTAT = 189 SYS_LSTAT = 190 SYS_PATHCONF = 191 SYS_FPATHCONF = 192 SYS_GETRLIMIT = 194 SYS_SETRLIMIT = 195 SYS_GETDIRENTRIES = 196 SYS_MMAP = 197 SYS_LSEEK = 199 SYS_TRUNCATE = 200 SYS_FTRUNCATE = 201 SYS_SYSCTL = 202 SYS_MLOCK = 203 SYS_MUNLOCK = 204 SYS_UNDELETE = 205 SYS_OPEN_DPROTECTED_NP = 216 SYS_GETATTRLIST = 220 SYS_SETATTRLIST = 221 SYS_GETDIRENTRIESATTR = 222 SYS_EXCHANGEDATA = 223 SYS_SEARCHFS = 225 SYS_DELETE = 226 SYS_COPYFILE = 227 SYS_FGETATTRLIST = 228 SYS_FSETATTRLIST = 229 SYS_POLL = 230 SYS_WATCHEVENT = 231 SYS_WAITEVENT = 232 SYS_MODWATCH = 233 SYS_GETXATTR = 234 SYS_FGETXATTR = 235 SYS_SETXATTR = 236 SYS_FSETXATTR = 237 SYS_REMOVEXATTR = 238 SYS_FREMOVEXATTR = 239 SYS_LISTXATTR = 240 SYS_FLISTXATTR = 241 SYS_FSCTL = 242 SYS_INITGROUPS = 243 SYS_POSIX_SPAWN = 244 SYS_FFSCTL = 245 SYS_NFSCLNT = 247 SYS_FHOPEN = 248 SYS_MINHERIT = 250 SYS_SEMSYS = 251 SYS_MSGSYS = 252 SYS_SHMSYS = 253 SYS_SEMCTL = 254 SYS_SEMGET = 255 SYS_SEMOP = 256 SYS_MSGCTL = 258 SYS_MSGGET = 259 SYS_MSGSND = 260 SYS_MSGRCV = 261 SYS_SHMAT = 262 SYS_SHMCTL = 263 SYS_SHMDT = 264 SYS_SHMGET = 265 SYS_SHM_OPEN = 266 SYS_SHM_UNLINK = 267 SYS_SEM_OPEN = 268 SYS_SEM_CLOSE = 269 SYS_SEM_UNLINK = 270 SYS_SEM_WAIT = 271 SYS_SEM_TRYWAIT = 272 SYS_SEM_POST = 273 SYS_SYSCTLBYNAME = 274 SYS_OPEN_EXTENDED = 277 SYS_UMASK_EXTENDED = 278 SYS_STAT_EXTENDED = 279 SYS_LSTAT_EXTENDED = 280 SYS_FSTAT_EXTENDED = 281 SYS_CHMOD_EXTENDED = 282 SYS_FCHMOD_EXTENDED = 283 SYS_ACCESS_EXTENDED = 284 SYS_SETTID = 285 SYS_GETTID = 286 SYS_SETSGROUPS = 287 SYS_GETSGROUPS = 288 SYS_SETWGROUPS = 289 SYS_GETWGROUPS = 290 SYS_MKFIFO_EXTENDED = 291 SYS_MKDIR_EXTENDED = 292 SYS_IDENTITYSVC = 293 SYS_SHARED_REGION_CHECK_NP = 294 SYS_VM_PRESSURE_MONITOR = 296 SYS_PSYNCH_RW_LONGRDLOCK = 297 SYS_PSYNCH_RW_YIELDWRLOCK = 298 SYS_PSYNCH_RW_DOWNGRADE = 299 SYS_PSYNCH_RW_UPGRADE = 300 SYS_PSYNCH_MUTEXWAIT = 301 SYS_PSYNCH_MUTEXDROP = 302 SYS_PSYNCH_CVBROAD = 303 SYS_PSYNCH_CVSIGNAL = 304 SYS_PSYNCH_CVWAIT = 305 SYS_PSYNCH_RW_RDLOCK = 306 SYS_PSYNCH_RW_WRLOCK = 307 SYS_PSYNCH_RW_UNLOCK = 308 SYS_PSYNCH_RW_UNLOCK2 = 309 SYS_GETSID = 310 SYS_SETTID_WITH_PID = 311 SYS_PSYNCH_CVCLRPREPOST = 312 SYS_AIO_FSYNC = 313 SYS_AIO_RETURN = 314 SYS_AIO_SUSPEND = 315 SYS_AIO_CANCEL = 316 SYS_AIO_ERROR = 317 SYS_AIO_READ = 318 SYS_AIO_WRITE = 319 SYS_LIO_LISTIO = 320 SYS_IOPOLICYSYS = 322 SYS_PROCESS_POLICY = 323 SYS_MLOCKALL = 324 SYS_MUNLOCKALL = 325 SYS_ISSETUGID = 327 SYS___PTHREAD_KILL = 328 SYS___PTHREAD_SIGMASK = 329 SYS___SIGWAIT = 330 SYS___DISABLE_THREADSIGNAL = 331 SYS___PTHREAD_MARKCANCEL = 332 SYS___PTHREAD_CANCELED = 333 SYS___SEMWAIT_SIGNAL = 334 SYS_PROC_INFO = 336 SYS_SENDFILE = 337 SYS_STAT64 = 338 SYS_FSTAT64 = 339 SYS_LSTAT64 = 340 SYS_STAT64_EXTENDED = 341 SYS_LSTAT64_EXTENDED = 342 SYS_FSTAT64_EXTENDED = 343 SYS_GETDIRENTRIES64 = 344 SYS_STATFS64 = 345 SYS_FSTATFS64 = 346 SYS_GETFSSTAT64 = 347 SYS___PTHREAD_CHDIR = 348 SYS___PTHREAD_FCHDIR = 349 SYS_AUDIT = 350 SYS_AUDITON = 351 SYS_GETAUID = 353 SYS_SETAUID = 354 SYS_GETAUDIT_ADDR = 357 SYS_SETAUDIT_ADDR = 358 SYS_AUDITCTL = 359 SYS_BSDTHREAD_CREATE = 360 SYS_BSDTHREAD_TERMINATE = 361 SYS_KQUEUE = 362 SYS_KEVENT = 363 SYS_LCHOWN = 364 SYS_BSDTHREAD_REGISTER = 366 SYS_WORKQ_OPEN = 367 SYS_WORKQ_KERNRETURN = 368 SYS_KEVENT64 = 369 SYS___OLD_SEMWAIT_SIGNAL = 370 SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371 SYS_THREAD_SELFID = 372 SYS_LEDGER = 373 SYS_KEVENT_QOS = 374 SYS_KEVENT_ID = 375 SYS___MAC_EXECVE = 380 SYS___MAC_SYSCALL = 381 SYS___MAC_GET_FILE = 382 SYS___MAC_SET_FILE = 383 SYS___MAC_GET_LINK = 384 SYS___MAC_SET_LINK = 385 SYS___MAC_GET_PROC = 386 SYS___MAC_SET_PROC = 387 SYS___MAC_GET_FD = 388 SYS___MAC_SET_FD = 389 SYS___MAC_GET_PID = 390 SYS_PSELECT = 394 SYS_PSELECT_NOCANCEL = 395 SYS_READ_NOCANCEL = 396 SYS_WRITE_NOCANCEL = 397 SYS_OPEN_NOCANCEL = 398 SYS_CLOSE_NOCANCEL = 399 SYS_WAIT4_NOCANCEL = 400 SYS_RECVMSG_NOCANCEL = 401 SYS_SENDMSG_NOCANCEL = 402 SYS_RECVFROM_NOCANCEL = 403 SYS_ACCEPT_NOCANCEL = 404 SYS_MSYNC_NOCANCEL = 405 SYS_FCNTL_NOCANCEL = 406 SYS_SELECT_NOCANCEL = 407 SYS_FSYNC_NOCANCEL = 408 SYS_CONNECT_NOCANCEL = 409 SYS_SIGSUSPEND_NOCANCEL = 410 SYS_READV_NOCANCEL = 411 SYS_WRITEV_NOCANCEL = 412 SYS_SENDTO_NOCANCEL = 413 SYS_PREAD_NOCANCEL = 414 SYS_PWRITE_NOCANCEL = 415 SYS_WAITID_NOCANCEL = 416 SYS_POLL_NOCANCEL = 417 SYS_MSGSND_NOCANCEL = 418 SYS_MSGRCV_NOCANCEL = 419 SYS_SEM_WAIT_NOCANCEL = 420 SYS_AIO_SUSPEND_NOCANCEL = 421 SYS___SIGWAIT_NOCANCEL = 422 SYS___SEMWAIT_SIGNAL_NOCANCEL = 423 SYS___MAC_MOUNT = 424 SYS___MAC_GET_MOUNT = 425 SYS___MAC_GETFSSTAT = 426 SYS_FSGETPATH = 427 SYS_AUDIT_SESSION_SELF = 428 SYS_AUDIT_SESSION_JOIN = 429 SYS_FILEPORT_MAKEPORT = 430 SYS_FILEPORT_MAKEFD = 431 SYS_AUDIT_SESSION_PORT = 432 SYS_PID_SUSPEND = 433 SYS_PID_RESUME = 434 SYS_PID_HIBERNATE = 435 SYS_PID_SHUTDOWN_SOCKETS = 436 SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438 SYS_KAS_INFO = 439 SYS_MEMORYSTATUS_CONTROL = 440 SYS_GUARDED_OPEN_NP = 441 SYS_GUARDED_CLOSE_NP = 442 SYS_GUARDED_KQUEUE_NP = 443 SYS_CHANGE_FDGUARD_NP = 444 SYS_USRCTL = 445 SYS_PROC_RLIMIT_CONTROL = 446 SYS_CONNECTX = 447 SYS_DISCONNECTX = 448 SYS_PEELOFF = 449 SYS_SOCKET_DELEGATE = 450 SYS_TELEMETRY = 451 SYS_PROC_UUID_POLICY = 452 SYS_MEMORYSTATUS_GET_LEVEL = 453 SYS_SYSTEM_OVERRIDE = 454 SYS_VFS_PURGE = 455 SYS_SFI_CTL = 456 SYS_SFI_PIDCTL = 457 SYS_COALITION = 458 SYS_COALITION_INFO = 459 SYS_NECP_MATCH_POLICY = 460 SYS_GETATTRLISTBULK = 461 SYS_CLONEFILEAT = 462 SYS_OPENAT = 463 SYS_OPENAT_NOCANCEL = 464 SYS_RENAMEAT = 465 SYS_FACCESSAT = 466 SYS_FCHMODAT = 467 SYS_FCHOWNAT = 468 SYS_FSTATAT = 469 SYS_FSTATAT64 = 470 SYS_LINKAT = 471 SYS_UNLINKAT = 472 SYS_READLINKAT = 473 SYS_SYMLINKAT = 474 SYS_MKDIRAT = 475 SYS_GETATTRLISTAT = 476 SYS_PROC_TRACE_LOG = 477 SYS_BSDTHREAD_CTL = 478 SYS_OPENBYID_NP = 479 SYS_RECVMSG_X = 480 SYS_SENDMSG_X = 481 SYS_THREAD_SELFUSAGE = 482 SYS_CSRCTL = 483 SYS_GUARDED_OPEN_DPROTECTED_NP = 484 SYS_GUARDED_WRITE_NP = 485 SYS_GUARDED_PWRITE_NP = 486 SYS_GUARDED_WRITEV_NP = 487 SYS_RENAMEATX_NP = 488 SYS_MREMAP_ENCRYPTED = 489 SYS_NETAGENT_TRIGGER = 490 SYS_STACK_SNAPSHOT_WITH_CONFIG = 491 SYS_MICROSTACKSHOT = 492 SYS_GRAB_PGO_DATA = 493 SYS_PERSONA = 494 SYS_WORK_INTERVAL_CTL = 499 SYS_GETENTROPY = 500 SYS_NECP_OPEN = 501 SYS_NECP_CLIENT_ACTION = 502 SYS___NEXUS_OPEN = 503 SYS___NEXUS_REGISTER = 504 SYS___NEXUS_DEREGISTER = 505 SYS___NEXUS_CREATE = 506 SYS___NEXUS_DESTROY = 507 SYS___NEXUS_GET_OPT = 508 SYS___NEXUS_SET_OPT = 509 SYS___CHANNEL_OPEN = 510 SYS___CHANNEL_GET_INFO = 511 SYS___CHANNEL_SYNC = 512 SYS___CHANNEL_GET_OPT = 513 SYS___CHANNEL_SET_OPT = 514 SYS_ULOCK_WAIT = 515 SYS_ULOCK_WAKE = 516 SYS_FCLONEFILEAT = 517 SYS_FS_SNAPSHOT = 518 SYS_TERMINATE_WITH_PAYLOAD = 520 SYS_ABORT_WITH_PAYLOAD = 521 SYS_NECP_SESSION_OPEN = 522 SYS_NECP_SESSION_ACTION = 523 SYS_SETATTRLISTAT = 524 SYS_NET_QOS_GUIDELINE = 525 SYS_FMOUNT = 526 SYS_NTP_ADJTIME = 527 SYS_NTP_GETTIME = 528 SYS_OS_FAULT_WITH_PAYLOAD = 529 SYS_MAXSYSCALL = 530 SYS_INVALID = 63 ) ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go ================================================ // mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/sys/syscall.h // Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,darwin package unix const ( SYS_SYSCALL = 0 SYS_EXIT = 1 SYS_FORK = 2 SYS_READ = 3 SYS_WRITE = 4 SYS_OPEN = 5 SYS_CLOSE = 6 SYS_WAIT4 = 7 SYS_LINK = 9 SYS_UNLINK = 10 SYS_CHDIR = 12 SYS_FCHDIR = 13 SYS_MKNOD = 14 SYS_CHMOD = 15 SYS_CHOWN = 16 SYS_GETFSSTAT = 18 SYS_GETPID = 20 SYS_SETUID = 23 SYS_GETUID = 24 SYS_GETEUID = 25 SYS_PTRACE = 26 SYS_RECVMSG = 27 SYS_SENDMSG = 28 SYS_RECVFROM = 29 SYS_ACCEPT = 30 SYS_GETPEERNAME = 31 SYS_GETSOCKNAME = 32 SYS_ACCESS = 33 SYS_CHFLAGS = 34 SYS_FCHFLAGS = 35 SYS_SYNC = 36 SYS_KILL = 37 SYS_GETPPID = 39 SYS_DUP = 41 SYS_PIPE = 42 SYS_GETEGID = 43 SYS_SIGACTION = 46 SYS_GETGID = 47 SYS_SIGPROCMASK = 48 SYS_GETLOGIN = 49 SYS_SETLOGIN = 50 SYS_ACCT = 51 SYS_SIGPENDING = 52 SYS_SIGALTSTACK = 53 SYS_IOCTL = 54 SYS_REBOOT = 55 SYS_REVOKE = 56 SYS_SYMLINK = 57 SYS_READLINK = 58 SYS_EXECVE = 59 SYS_UMASK = 60 SYS_CHROOT = 61 SYS_MSYNC = 65 SYS_VFORK = 66 SYS_MUNMAP = 73 SYS_MPROTECT = 74 SYS_MADVISE = 75 SYS_MINCORE = 78 SYS_GETGROUPS = 79 SYS_SETGROUPS = 80 SYS_GETPGRP = 81 SYS_SETPGID = 82 SYS_SETITIMER = 83 SYS_SWAPON = 85 SYS_GETITIMER = 86 SYS_GETDTABLESIZE = 89 SYS_DUP2 = 90 SYS_FCNTL = 92 SYS_SELECT = 93 SYS_FSYNC = 95 SYS_SETPRIORITY = 96 SYS_SOCKET = 97 SYS_CONNECT = 98 SYS_GETPRIORITY = 100 SYS_BIND = 104 SYS_SETSOCKOPT = 105 SYS_LISTEN = 106 SYS_SIGSUSPEND = 111 SYS_GETTIMEOFDAY = 116 SYS_GETRUSAGE = 117 SYS_GETSOCKOPT = 118 SYS_READV = 120 SYS_WRITEV = 121 SYS_SETTIMEOFDAY = 122 SYS_FCHOWN = 123 SYS_FCHMOD = 124 SYS_SETREUID = 126 SYS_SETREGID = 127 SYS_RENAME = 128 SYS_FLOCK = 131 SYS_MKFIFO = 132 SYS_SENDTO = 133 SYS_SHUTDOWN = 134 SYS_SOCKETPAIR = 135 SYS_MKDIR = 136 SYS_RMDIR = 137 SYS_UTIMES = 138 SYS_FUTIMES = 139 SYS_ADJTIME = 140 SYS_GETHOSTUUID = 142 SYS_SETSID = 147 SYS_GETPGID = 151 SYS_SETPRIVEXEC = 152 SYS_PREAD = 153 SYS_PWRITE = 154 SYS_NFSSVC = 155 SYS_STATFS = 157 SYS_FSTATFS = 158 SYS_UNMOUNT = 159 SYS_GETFH = 161 SYS_QUOTACTL = 165 SYS_MOUNT = 167 SYS_CSOPS = 169 SYS_CSOPS_AUDITTOKEN = 170 SYS_WAITID = 173 SYS_KDEBUG_TYPEFILTER = 177 SYS_KDEBUG_TRACE_STRING = 178 SYS_KDEBUG_TRACE64 = 179 SYS_KDEBUG_TRACE = 180 SYS_SETGID = 181 SYS_SETEGID = 182 SYS_SETEUID = 183 SYS_SIGRETURN = 184 SYS_THREAD_SELFCOUNTS = 186 SYS_FDATASYNC = 187 SYS_STAT = 188 SYS_FSTAT = 189 SYS_LSTAT = 190 SYS_PATHCONF = 191 SYS_FPATHCONF = 192 SYS_GETRLIMIT = 194 SYS_SETRLIMIT = 195 SYS_GETDIRENTRIES = 196 SYS_MMAP = 197 SYS_LSEEK = 199 SYS_TRUNCATE = 200 SYS_FTRUNCATE = 201 SYS_SYSCTL = 202 SYS_MLOCK = 203 SYS_MUNLOCK = 204 SYS_UNDELETE = 205 SYS_OPEN_DPROTECTED_NP = 216 SYS_GETATTRLIST = 220 SYS_SETATTRLIST = 221 SYS_GETDIRENTRIESATTR = 222 SYS_EXCHANGEDATA = 223 SYS_SEARCHFS = 225 SYS_DELETE = 226 SYS_COPYFILE = 227 SYS_FGETATTRLIST = 228 SYS_FSETATTRLIST = 229 SYS_POLL = 230 SYS_WATCHEVENT = 231 SYS_WAITEVENT = 232 SYS_MODWATCH = 233 SYS_GETXATTR = 234 SYS_FGETXATTR = 235 SYS_SETXATTR = 236 SYS_FSETXATTR = 237 SYS_REMOVEXATTR = 238 SYS_FREMOVEXATTR = 239 SYS_LISTXATTR = 240 SYS_FLISTXATTR = 241 SYS_FSCTL = 242 SYS_INITGROUPS = 243 SYS_POSIX_SPAWN = 244 SYS_FFSCTL = 245 SYS_NFSCLNT = 247 SYS_FHOPEN = 248 SYS_MINHERIT = 250 SYS_SEMSYS = 251 SYS_MSGSYS = 252 SYS_SHMSYS = 253 SYS_SEMCTL = 254 SYS_SEMGET = 255 SYS_SEMOP = 256 SYS_MSGCTL = 258 SYS_MSGGET = 259 SYS_MSGSND = 260 SYS_MSGRCV = 261 SYS_SHMAT = 262 SYS_SHMCTL = 263 SYS_SHMDT = 264 SYS_SHMGET = 265 SYS_SHM_OPEN = 266 SYS_SHM_UNLINK = 267 SYS_SEM_OPEN = 268 SYS_SEM_CLOSE = 269 SYS_SEM_UNLINK = 270 SYS_SEM_WAIT = 271 SYS_SEM_TRYWAIT = 272 SYS_SEM_POST = 273 SYS_SYSCTLBYNAME = 274 SYS_OPEN_EXTENDED = 277 SYS_UMASK_EXTENDED = 278 SYS_STAT_EXTENDED = 279 SYS_LSTAT_EXTENDED = 280 SYS_FSTAT_EXTENDED = 281 SYS_CHMOD_EXTENDED = 282 SYS_FCHMOD_EXTENDED = 283 SYS_ACCESS_EXTENDED = 284 SYS_SETTID = 285 SYS_GETTID = 286 SYS_SETSGROUPS = 287 SYS_GETSGROUPS = 288 SYS_SETWGROUPS = 289 SYS_GETWGROUPS = 290 SYS_MKFIFO_EXTENDED = 291 SYS_MKDIR_EXTENDED = 292 SYS_IDENTITYSVC = 293 SYS_SHARED_REGION_CHECK_NP = 294 SYS_VM_PRESSURE_MONITOR = 296 SYS_PSYNCH_RW_LONGRDLOCK = 297 SYS_PSYNCH_RW_YIELDWRLOCK = 298 SYS_PSYNCH_RW_DOWNGRADE = 299 SYS_PSYNCH_RW_UPGRADE = 300 SYS_PSYNCH_MUTEXWAIT = 301 SYS_PSYNCH_MUTEXDROP = 302 SYS_PSYNCH_CVBROAD = 303 SYS_PSYNCH_CVSIGNAL = 304 SYS_PSYNCH_CVWAIT = 305 SYS_PSYNCH_RW_RDLOCK = 306 SYS_PSYNCH_RW_WRLOCK = 307 SYS_PSYNCH_RW_UNLOCK = 308 SYS_PSYNCH_RW_UNLOCK2 = 309 SYS_GETSID = 310 SYS_SETTID_WITH_PID = 311 SYS_PSYNCH_CVCLRPREPOST = 312 SYS_AIO_FSYNC = 313 SYS_AIO_RETURN = 314 SYS_AIO_SUSPEND = 315 SYS_AIO_CANCEL = 316 SYS_AIO_ERROR = 317 SYS_AIO_READ = 318 SYS_AIO_WRITE = 319 SYS_LIO_LISTIO = 320 SYS_IOPOLICYSYS = 322 SYS_PROCESS_POLICY = 323 SYS_MLOCKALL = 324 SYS_MUNLOCKALL = 325 SYS_ISSETUGID = 327 SYS___PTHREAD_KILL = 328 SYS___PTHREAD_SIGMASK = 329 SYS___SIGWAIT = 330 SYS___DISABLE_THREADSIGNAL = 331 SYS___PTHREAD_MARKCANCEL = 332 SYS___PTHREAD_CANCELED = 333 SYS___SEMWAIT_SIGNAL = 334 SYS_PROC_INFO = 336 SYS_SENDFILE = 337 SYS_STAT64 = 338 SYS_FSTAT64 = 339 SYS_LSTAT64 = 340 SYS_STAT64_EXTENDED = 341 SYS_LSTAT64_EXTENDED = 342 SYS_FSTAT64_EXTENDED = 343 SYS_GETDIRENTRIES64 = 344 SYS_STATFS64 = 345 SYS_FSTATFS64 = 346 SYS_GETFSSTAT64 = 347 SYS___PTHREAD_CHDIR = 348 SYS___PTHREAD_FCHDIR = 349 SYS_AUDIT = 350 SYS_AUDITON = 351 SYS_GETAUID = 353 SYS_SETAUID = 354 SYS_GETAUDIT_ADDR = 357 SYS_SETAUDIT_ADDR = 358 SYS_AUDITCTL = 359 SYS_BSDTHREAD_CREATE = 360 SYS_BSDTHREAD_TERMINATE = 361 SYS_KQUEUE = 362 SYS_KEVENT = 363 SYS_LCHOWN = 364 SYS_BSDTHREAD_REGISTER = 366 SYS_WORKQ_OPEN = 367 SYS_WORKQ_KERNRETURN = 368 SYS_KEVENT64 = 369 SYS___OLD_SEMWAIT_SIGNAL = 370 SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371 SYS_THREAD_SELFID = 372 SYS_LEDGER = 373 SYS_KEVENT_QOS = 374 SYS_KEVENT_ID = 375 SYS___MAC_EXECVE = 380 SYS___MAC_SYSCALL = 381 SYS___MAC_GET_FILE = 382 SYS___MAC_SET_FILE = 383 SYS___MAC_GET_LINK = 384 SYS___MAC_SET_LINK = 385 SYS___MAC_GET_PROC = 386 SYS___MAC_SET_PROC = 387 SYS___MAC_GET_FD = 388 SYS___MAC_SET_FD = 389 SYS___MAC_GET_PID = 390 SYS_PSELECT = 394 SYS_PSELECT_NOCANCEL = 395 SYS_READ_NOCANCEL = 396 SYS_WRITE_NOCANCEL = 397 SYS_OPEN_NOCANCEL = 398 SYS_CLOSE_NOCANCEL = 399 SYS_WAIT4_NOCANCEL = 400 SYS_RECVMSG_NOCANCEL = 401 SYS_SENDMSG_NOCANCEL = 402 SYS_RECVFROM_NOCANCEL = 403 SYS_ACCEPT_NOCANCEL = 404 SYS_MSYNC_NOCANCEL = 405 SYS_FCNTL_NOCANCEL = 406 SYS_SELECT_NOCANCEL = 407 SYS_FSYNC_NOCANCEL = 408 SYS_CONNECT_NOCANCEL = 409 SYS_SIGSUSPEND_NOCANCEL = 410 SYS_READV_NOCANCEL = 411 SYS_WRITEV_NOCANCEL = 412 SYS_SENDTO_NOCANCEL = 413 SYS_PREAD_NOCANCEL = 414 SYS_PWRITE_NOCANCEL = 415 SYS_WAITID_NOCANCEL = 416 SYS_POLL_NOCANCEL = 417 SYS_MSGSND_NOCANCEL = 418 SYS_MSGRCV_NOCANCEL = 419 SYS_SEM_WAIT_NOCANCEL = 420 SYS_AIO_SUSPEND_NOCANCEL = 421 SYS___SIGWAIT_NOCANCEL = 422 SYS___SEMWAIT_SIGNAL_NOCANCEL = 423 SYS___MAC_MOUNT = 424 SYS___MAC_GET_MOUNT = 425 SYS___MAC_GETFSSTAT = 426 SYS_FSGETPATH = 427 SYS_AUDIT_SESSION_SELF = 428 SYS_AUDIT_SESSION_JOIN = 429 SYS_FILEPORT_MAKEPORT = 430 SYS_FILEPORT_MAKEFD = 431 SYS_AUDIT_SESSION_PORT = 432 SYS_PID_SUSPEND = 433 SYS_PID_RESUME = 434 SYS_PID_HIBERNATE = 435 SYS_PID_SHUTDOWN_SOCKETS = 436 SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438 SYS_KAS_INFO = 439 SYS_MEMORYSTATUS_CONTROL = 440 SYS_GUARDED_OPEN_NP = 441 SYS_GUARDED_CLOSE_NP = 442 SYS_GUARDED_KQUEUE_NP = 443 SYS_CHANGE_FDGUARD_NP = 444 SYS_USRCTL = 445 SYS_PROC_RLIMIT_CONTROL = 446 SYS_CONNECTX = 447 SYS_DISCONNECTX = 448 SYS_PEELOFF = 449 SYS_SOCKET_DELEGATE = 450 SYS_TELEMETRY = 451 SYS_PROC_UUID_POLICY = 452 SYS_MEMORYSTATUS_GET_LEVEL = 453 SYS_SYSTEM_OVERRIDE = 454 SYS_VFS_PURGE = 455 SYS_SFI_CTL = 456 SYS_SFI_PIDCTL = 457 SYS_COALITION = 458 SYS_COALITION_INFO = 459 SYS_NECP_MATCH_POLICY = 460 SYS_GETATTRLISTBULK = 461 SYS_CLONEFILEAT = 462 SYS_OPENAT = 463 SYS_OPENAT_NOCANCEL = 464 SYS_RENAMEAT = 465 SYS_FACCESSAT = 466 SYS_FCHMODAT = 467 SYS_FCHOWNAT = 468 SYS_FSTATAT = 469 SYS_FSTATAT64 = 470 SYS_LINKAT = 471 SYS_UNLINKAT = 472 SYS_READLINKAT = 473 SYS_SYMLINKAT = 474 SYS_MKDIRAT = 475 SYS_GETATTRLISTAT = 476 SYS_PROC_TRACE_LOG = 477 SYS_BSDTHREAD_CTL = 478 SYS_OPENBYID_NP = 479 SYS_RECVMSG_X = 480 SYS_SENDMSG_X = 481 SYS_THREAD_SELFUSAGE = 482 SYS_CSRCTL = 483 SYS_GUARDED_OPEN_DPROTECTED_NP = 484 SYS_GUARDED_WRITE_NP = 485 SYS_GUARDED_PWRITE_NP = 486 SYS_GUARDED_WRITEV_NP = 487 SYS_RENAMEATX_NP = 488 SYS_MREMAP_ENCRYPTED = 489 SYS_NETAGENT_TRIGGER = 490 SYS_STACK_SNAPSHOT_WITH_CONFIG = 491 SYS_MICROSTACKSHOT = 492 SYS_GRAB_PGO_DATA = 493 SYS_PERSONA = 494 SYS_WORK_INTERVAL_CTL = 499 SYS_GETENTROPY = 500 SYS_NECP_OPEN = 501 SYS_NECP_CLIENT_ACTION = 502 SYS___NEXUS_OPEN = 503 SYS___NEXUS_REGISTER = 504 SYS___NEXUS_DEREGISTER = 505 SYS___NEXUS_CREATE = 506 SYS___NEXUS_DESTROY = 507 SYS___NEXUS_GET_OPT = 508 SYS___NEXUS_SET_OPT = 509 SYS___CHANNEL_OPEN = 510 SYS___CHANNEL_GET_INFO = 511 SYS___CHANNEL_SYNC = 512 SYS___CHANNEL_GET_OPT = 513 SYS___CHANNEL_SET_OPT = 514 SYS_ULOCK_WAIT = 515 SYS_ULOCK_WAKE = 516 SYS_FCLONEFILEAT = 517 SYS_FS_SNAPSHOT = 518 SYS_TERMINATE_WITH_PAYLOAD = 520 SYS_ABORT_WITH_PAYLOAD = 521 SYS_NECP_SESSION_OPEN = 522 SYS_NECP_SESSION_ACTION = 523 SYS_SETATTRLISTAT = 524 SYS_NET_QOS_GUIDELINE = 525 SYS_FMOUNT = 526 SYS_NTP_ADJTIME = 527 SYS_NTP_GETTIME = 528 SYS_OS_FAULT_WITH_PAYLOAD = 529 SYS_MAXSYSCALL = 530 SYS_INVALID = 63 ) ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go ================================================ // mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.1.sdk/usr/include/sys/syscall.h // Code generated by the command above; see README.md. DO NOT EDIT. // +build arm,darwin package unix const ( SYS_SYSCALL = 0 SYS_EXIT = 1 SYS_FORK = 2 SYS_READ = 3 SYS_WRITE = 4 SYS_OPEN = 5 SYS_CLOSE = 6 SYS_WAIT4 = 7 SYS_LINK = 9 SYS_UNLINK = 10 SYS_CHDIR = 12 SYS_FCHDIR = 13 SYS_MKNOD = 14 SYS_CHMOD = 15 SYS_CHOWN = 16 SYS_GETFSSTAT = 18 SYS_GETPID = 20 SYS_SETUID = 23 SYS_GETUID = 24 SYS_GETEUID = 25 SYS_PTRACE = 26 SYS_RECVMSG = 27 SYS_SENDMSG = 28 SYS_RECVFROM = 29 SYS_ACCEPT = 30 SYS_GETPEERNAME = 31 SYS_GETSOCKNAME = 32 SYS_ACCESS = 33 SYS_CHFLAGS = 34 SYS_FCHFLAGS = 35 SYS_SYNC = 36 SYS_KILL = 37 SYS_GETPPID = 39 SYS_DUP = 41 SYS_PIPE = 42 SYS_GETEGID = 43 SYS_SIGACTION = 46 SYS_GETGID = 47 SYS_SIGPROCMASK = 48 SYS_GETLOGIN = 49 SYS_SETLOGIN = 50 SYS_ACCT = 51 SYS_SIGPENDING = 52 SYS_SIGALTSTACK = 53 SYS_IOCTL = 54 SYS_REBOOT = 55 SYS_REVOKE = 56 SYS_SYMLINK = 57 SYS_READLINK = 58 SYS_EXECVE = 59 SYS_UMASK = 60 SYS_CHROOT = 61 SYS_MSYNC = 65 SYS_VFORK = 66 SYS_MUNMAP = 73 SYS_MPROTECT = 74 SYS_MADVISE = 75 SYS_MINCORE = 78 SYS_GETGROUPS = 79 SYS_SETGROUPS = 80 SYS_GETPGRP = 81 SYS_SETPGID = 82 SYS_SETITIMER = 83 SYS_SWAPON = 85 SYS_GETITIMER = 86 SYS_GETDTABLESIZE = 89 SYS_DUP2 = 90 SYS_FCNTL = 92 SYS_SELECT = 93 SYS_FSYNC = 95 SYS_SETPRIORITY = 96 SYS_SOCKET = 97 SYS_CONNECT = 98 SYS_GETPRIORITY = 100 SYS_BIND = 104 SYS_SETSOCKOPT = 105 SYS_LISTEN = 106 SYS_SIGSUSPEND = 111 SYS_GETTIMEOFDAY = 116 SYS_GETRUSAGE = 117 SYS_GETSOCKOPT = 118 SYS_READV = 120 SYS_WRITEV = 121 SYS_SETTIMEOFDAY = 122 SYS_FCHOWN = 123 SYS_FCHMOD = 124 SYS_SETREUID = 126 SYS_SETREGID = 127 SYS_RENAME = 128 SYS_FLOCK = 131 SYS_MKFIFO = 132 SYS_SENDTO = 133 SYS_SHUTDOWN = 134 SYS_SOCKETPAIR = 135 SYS_MKDIR = 136 SYS_RMDIR = 137 SYS_UTIMES = 138 SYS_FUTIMES = 139 SYS_ADJTIME = 140 SYS_GETHOSTUUID = 142 SYS_SETSID = 147 SYS_GETPGID = 151 SYS_SETPRIVEXEC = 152 SYS_PREAD = 153 SYS_PWRITE = 154 SYS_NFSSVC = 155 SYS_STATFS = 157 SYS_FSTATFS = 158 SYS_UNMOUNT = 159 SYS_GETFH = 161 SYS_QUOTACTL = 165 SYS_MOUNT = 167 SYS_CSOPS = 169 SYS_CSOPS_AUDITTOKEN = 170 SYS_WAITID = 173 SYS_KDEBUG_TYPEFILTER = 177 SYS_KDEBUG_TRACE_STRING = 178 SYS_KDEBUG_TRACE64 = 179 SYS_KDEBUG_TRACE = 180 SYS_SETGID = 181 SYS_SETEGID = 182 SYS_SETEUID = 183 SYS_SIGRETURN = 184 SYS_THREAD_SELFCOUNTS = 186 SYS_FDATASYNC = 187 SYS_STAT = 188 SYS_FSTAT = 189 SYS_LSTAT = 190 SYS_PATHCONF = 191 SYS_FPATHCONF = 192 SYS_GETRLIMIT = 194 SYS_SETRLIMIT = 195 SYS_GETDIRENTRIES = 196 SYS_MMAP = 197 SYS_LSEEK = 199 SYS_TRUNCATE = 200 SYS_FTRUNCATE = 201 SYS_SYSCTL = 202 SYS_MLOCK = 203 SYS_MUNLOCK = 204 SYS_UNDELETE = 205 SYS_OPEN_DPROTECTED_NP = 216 SYS_GETATTRLIST = 220 SYS_SETATTRLIST = 221 SYS_GETDIRENTRIESATTR = 222 SYS_EXCHANGEDATA = 223 SYS_SEARCHFS = 225 SYS_DELETE = 226 SYS_COPYFILE = 227 SYS_FGETATTRLIST = 228 SYS_FSETATTRLIST = 229 SYS_POLL = 230 SYS_WATCHEVENT = 231 SYS_WAITEVENT = 232 SYS_MODWATCH = 233 SYS_GETXATTR = 234 SYS_FGETXATTR = 235 SYS_SETXATTR = 236 SYS_FSETXATTR = 237 SYS_REMOVEXATTR = 238 SYS_FREMOVEXATTR = 239 SYS_LISTXATTR = 240 SYS_FLISTXATTR = 241 SYS_FSCTL = 242 SYS_INITGROUPS = 243 SYS_POSIX_SPAWN = 244 SYS_FFSCTL = 245 SYS_NFSCLNT = 247 SYS_FHOPEN = 248 SYS_MINHERIT = 250 SYS_SEMSYS = 251 SYS_MSGSYS = 252 SYS_SHMSYS = 253 SYS_SEMCTL = 254 SYS_SEMGET = 255 SYS_SEMOP = 256 SYS_MSGCTL = 258 SYS_MSGGET = 259 SYS_MSGSND = 260 SYS_MSGRCV = 261 SYS_SHMAT = 262 SYS_SHMCTL = 263 SYS_SHMDT = 264 SYS_SHMGET = 265 SYS_SHM_OPEN = 266 SYS_SHM_UNLINK = 267 SYS_SEM_OPEN = 268 SYS_SEM_CLOSE = 269 SYS_SEM_UNLINK = 270 SYS_SEM_WAIT = 271 SYS_SEM_TRYWAIT = 272 SYS_SEM_POST = 273 SYS_SYSCTLBYNAME = 274 SYS_OPEN_EXTENDED = 277 SYS_UMASK_EXTENDED = 278 SYS_STAT_EXTENDED = 279 SYS_LSTAT_EXTENDED = 280 SYS_FSTAT_EXTENDED = 281 SYS_CHMOD_EXTENDED = 282 SYS_FCHMOD_EXTENDED = 283 SYS_ACCESS_EXTENDED = 284 SYS_SETTID = 285 SYS_GETTID = 286 SYS_SETSGROUPS = 287 SYS_GETSGROUPS = 288 SYS_SETWGROUPS = 289 SYS_GETWGROUPS = 290 SYS_MKFIFO_EXTENDED = 291 SYS_MKDIR_EXTENDED = 292 SYS_IDENTITYSVC = 293 SYS_SHARED_REGION_CHECK_NP = 294 SYS_VM_PRESSURE_MONITOR = 296 SYS_PSYNCH_RW_LONGRDLOCK = 297 SYS_PSYNCH_RW_YIELDWRLOCK = 298 SYS_PSYNCH_RW_DOWNGRADE = 299 SYS_PSYNCH_RW_UPGRADE = 300 SYS_PSYNCH_MUTEXWAIT = 301 SYS_PSYNCH_MUTEXDROP = 302 SYS_PSYNCH_CVBROAD = 303 SYS_PSYNCH_CVSIGNAL = 304 SYS_PSYNCH_CVWAIT = 305 SYS_PSYNCH_RW_RDLOCK = 306 SYS_PSYNCH_RW_WRLOCK = 307 SYS_PSYNCH_RW_UNLOCK = 308 SYS_PSYNCH_RW_UNLOCK2 = 309 SYS_GETSID = 310 SYS_SETTID_WITH_PID = 311 SYS_PSYNCH_CVCLRPREPOST = 312 SYS_AIO_FSYNC = 313 SYS_AIO_RETURN = 314 SYS_AIO_SUSPEND = 315 SYS_AIO_CANCEL = 316 SYS_AIO_ERROR = 317 SYS_AIO_READ = 318 SYS_AIO_WRITE = 319 SYS_LIO_LISTIO = 320 SYS_IOPOLICYSYS = 322 SYS_PROCESS_POLICY = 323 SYS_MLOCKALL = 324 SYS_MUNLOCKALL = 325 SYS_ISSETUGID = 327 SYS___PTHREAD_KILL = 328 SYS___PTHREAD_SIGMASK = 329 SYS___SIGWAIT = 330 SYS___DISABLE_THREADSIGNAL = 331 SYS___PTHREAD_MARKCANCEL = 332 SYS___PTHREAD_CANCELED = 333 SYS___SEMWAIT_SIGNAL = 334 SYS_PROC_INFO = 336 SYS_SENDFILE = 337 SYS_STAT64 = 338 SYS_FSTAT64 = 339 SYS_LSTAT64 = 340 SYS_STAT64_EXTENDED = 341 SYS_LSTAT64_EXTENDED = 342 SYS_FSTAT64_EXTENDED = 343 SYS_GETDIRENTRIES64 = 344 SYS_STATFS64 = 345 SYS_FSTATFS64 = 346 SYS_GETFSSTAT64 = 347 SYS___PTHREAD_CHDIR = 348 SYS___PTHREAD_FCHDIR = 349 SYS_AUDIT = 350 SYS_AUDITON = 351 SYS_GETAUID = 353 SYS_SETAUID = 354 SYS_GETAUDIT_ADDR = 357 SYS_SETAUDIT_ADDR = 358 SYS_AUDITCTL = 359 SYS_BSDTHREAD_CREATE = 360 SYS_BSDTHREAD_TERMINATE = 361 SYS_KQUEUE = 362 SYS_KEVENT = 363 SYS_LCHOWN = 364 SYS_BSDTHREAD_REGISTER = 366 SYS_WORKQ_OPEN = 367 SYS_WORKQ_KERNRETURN = 368 SYS_KEVENT64 = 369 SYS___OLD_SEMWAIT_SIGNAL = 370 SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371 SYS_THREAD_SELFID = 372 SYS_LEDGER = 373 SYS_KEVENT_QOS = 374 SYS_KEVENT_ID = 375 SYS___MAC_EXECVE = 380 SYS___MAC_SYSCALL = 381 SYS___MAC_GET_FILE = 382 SYS___MAC_SET_FILE = 383 SYS___MAC_GET_LINK = 384 SYS___MAC_SET_LINK = 385 SYS___MAC_GET_PROC = 386 SYS___MAC_SET_PROC = 387 SYS___MAC_GET_FD = 388 SYS___MAC_SET_FD = 389 SYS___MAC_GET_PID = 390 SYS_PSELECT = 394 SYS_PSELECT_NOCANCEL = 395 SYS_READ_NOCANCEL = 396 SYS_WRITE_NOCANCEL = 397 SYS_OPEN_NOCANCEL = 398 SYS_CLOSE_NOCANCEL = 399 SYS_WAIT4_NOCANCEL = 400 SYS_RECVMSG_NOCANCEL = 401 SYS_SENDMSG_NOCANCEL = 402 SYS_RECVFROM_NOCANCEL = 403 SYS_ACCEPT_NOCANCEL = 404 SYS_MSYNC_NOCANCEL = 405 SYS_FCNTL_NOCANCEL = 406 SYS_SELECT_NOCANCEL = 407 SYS_FSYNC_NOCANCEL = 408 SYS_CONNECT_NOCANCEL = 409 SYS_SIGSUSPEND_NOCANCEL = 410 SYS_READV_NOCANCEL = 411 SYS_WRITEV_NOCANCEL = 412 SYS_SENDTO_NOCANCEL = 413 SYS_PREAD_NOCANCEL = 414 SYS_PWRITE_NOCANCEL = 415 SYS_WAITID_NOCANCEL = 416 SYS_POLL_NOCANCEL = 417 SYS_MSGSND_NOCANCEL = 418 SYS_MSGRCV_NOCANCEL = 419 SYS_SEM_WAIT_NOCANCEL = 420 SYS_AIO_SUSPEND_NOCANCEL = 421 SYS___SIGWAIT_NOCANCEL = 422 SYS___SEMWAIT_SIGNAL_NOCANCEL = 423 SYS___MAC_MOUNT = 424 SYS___MAC_GET_MOUNT = 425 SYS___MAC_GETFSSTAT = 426 SYS_FSGETPATH = 427 SYS_AUDIT_SESSION_SELF = 428 SYS_AUDIT_SESSION_JOIN = 429 SYS_FILEPORT_MAKEPORT = 430 SYS_FILEPORT_MAKEFD = 431 SYS_AUDIT_SESSION_PORT = 432 SYS_PID_SUSPEND = 433 SYS_PID_RESUME = 434 SYS_PID_HIBERNATE = 435 SYS_PID_SHUTDOWN_SOCKETS = 436 SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438 SYS_KAS_INFO = 439 SYS_MEMORYSTATUS_CONTROL = 440 SYS_GUARDED_OPEN_NP = 441 SYS_GUARDED_CLOSE_NP = 442 SYS_GUARDED_KQUEUE_NP = 443 SYS_CHANGE_FDGUARD_NP = 444 SYS_USRCTL = 445 SYS_PROC_RLIMIT_CONTROL = 446 SYS_CONNECTX = 447 SYS_DISCONNECTX = 448 SYS_PEELOFF = 449 SYS_SOCKET_DELEGATE = 450 SYS_TELEMETRY = 451 SYS_PROC_UUID_POLICY = 452 SYS_MEMORYSTATUS_GET_LEVEL = 453 SYS_SYSTEM_OVERRIDE = 454 SYS_VFS_PURGE = 455 SYS_SFI_CTL = 456 SYS_SFI_PIDCTL = 457 SYS_COALITION = 458 SYS_COALITION_INFO = 459 SYS_NECP_MATCH_POLICY = 460 SYS_GETATTRLISTBULK = 461 SYS_CLONEFILEAT = 462 SYS_OPENAT = 463 SYS_OPENAT_NOCANCEL = 464 SYS_RENAMEAT = 465 SYS_FACCESSAT = 466 SYS_FCHMODAT = 467 SYS_FCHOWNAT = 468 SYS_FSTATAT = 469 SYS_FSTATAT64 = 470 SYS_LINKAT = 471 SYS_UNLINKAT = 472 SYS_READLINKAT = 473 SYS_SYMLINKAT = 474 SYS_MKDIRAT = 475 SYS_GETATTRLISTAT = 476 SYS_PROC_TRACE_LOG = 477 SYS_BSDTHREAD_CTL = 478 SYS_OPENBYID_NP = 479 SYS_RECVMSG_X = 480 SYS_SENDMSG_X = 481 SYS_THREAD_SELFUSAGE = 482 SYS_CSRCTL = 483 SYS_GUARDED_OPEN_DPROTECTED_NP = 484 SYS_GUARDED_WRITE_NP = 485 SYS_GUARDED_PWRITE_NP = 486 SYS_GUARDED_WRITEV_NP = 487 SYS_RENAMEATX_NP = 488 SYS_MREMAP_ENCRYPTED = 489 SYS_NETAGENT_TRIGGER = 490 SYS_STACK_SNAPSHOT_WITH_CONFIG = 491 SYS_MICROSTACKSHOT = 492 SYS_GRAB_PGO_DATA = 493 SYS_PERSONA = 494 SYS_WORK_INTERVAL_CTL = 499 SYS_GETENTROPY = 500 SYS_NECP_OPEN = 501 SYS_NECP_CLIENT_ACTION = 502 SYS___NEXUS_OPEN = 503 SYS___NEXUS_REGISTER = 504 SYS___NEXUS_DEREGISTER = 505 SYS___NEXUS_CREATE = 506 SYS___NEXUS_DESTROY = 507 SYS___NEXUS_GET_OPT = 508 SYS___NEXUS_SET_OPT = 509 SYS___CHANNEL_OPEN = 510 SYS___CHANNEL_GET_INFO = 511 SYS___CHANNEL_SYNC = 512 SYS___CHANNEL_GET_OPT = 513 SYS___CHANNEL_SET_OPT = 514 SYS_ULOCK_WAIT = 515 SYS_ULOCK_WAKE = 516 SYS_FCLONEFILEAT = 517 SYS_FS_SNAPSHOT = 518 SYS_TERMINATE_WITH_PAYLOAD = 520 SYS_ABORT_WITH_PAYLOAD = 521 SYS_NECP_SESSION_OPEN = 522 SYS_NECP_SESSION_ACTION = 523 SYS_SETATTRLISTAT = 524 SYS_NET_QOS_GUIDELINE = 525 SYS_FMOUNT = 526 SYS_NTP_ADJTIME = 527 SYS_NTP_GETTIME = 528 SYS_OS_FAULT_WITH_PAYLOAD = 529 SYS_MAXSYSCALL = 530 SYS_INVALID = 63 ) ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go ================================================ // mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.1.sdk/usr/include/sys/syscall.h // Code generated by the command above; see README.md. DO NOT EDIT. // +build arm64,darwin package unix const ( SYS_SYSCALL = 0 SYS_EXIT = 1 SYS_FORK = 2 SYS_READ = 3 SYS_WRITE = 4 SYS_OPEN = 5 SYS_CLOSE = 6 SYS_WAIT4 = 7 SYS_LINK = 9 SYS_UNLINK = 10 SYS_CHDIR = 12 SYS_FCHDIR = 13 SYS_MKNOD = 14 SYS_CHMOD = 15 SYS_CHOWN = 16 SYS_GETFSSTAT = 18 SYS_GETPID = 20 SYS_SETUID = 23 SYS_GETUID = 24 SYS_GETEUID = 25 SYS_PTRACE = 26 SYS_RECVMSG = 27 SYS_SENDMSG = 28 SYS_RECVFROM = 29 SYS_ACCEPT = 30 SYS_GETPEERNAME = 31 SYS_GETSOCKNAME = 32 SYS_ACCESS = 33 SYS_CHFLAGS = 34 SYS_FCHFLAGS = 35 SYS_SYNC = 36 SYS_KILL = 37 SYS_GETPPID = 39 SYS_DUP = 41 SYS_PIPE = 42 SYS_GETEGID = 43 SYS_SIGACTION = 46 SYS_GETGID = 47 SYS_SIGPROCMASK = 48 SYS_GETLOGIN = 49 SYS_SETLOGIN = 50 SYS_ACCT = 51 SYS_SIGPENDING = 52 SYS_SIGALTSTACK = 53 SYS_IOCTL = 54 SYS_REBOOT = 55 SYS_REVOKE = 56 SYS_SYMLINK = 57 SYS_READLINK = 58 SYS_EXECVE = 59 SYS_UMASK = 60 SYS_CHROOT = 61 SYS_MSYNC = 65 SYS_VFORK = 66 SYS_MUNMAP = 73 SYS_MPROTECT = 74 SYS_MADVISE = 75 SYS_MINCORE = 78 SYS_GETGROUPS = 79 SYS_SETGROUPS = 80 SYS_GETPGRP = 81 SYS_SETPGID = 82 SYS_SETITIMER = 83 SYS_SWAPON = 85 SYS_GETITIMER = 86 SYS_GETDTABLESIZE = 89 SYS_DUP2 = 90 SYS_FCNTL = 92 SYS_SELECT = 93 SYS_FSYNC = 95 SYS_SETPRIORITY = 96 SYS_SOCKET = 97 SYS_CONNECT = 98 SYS_GETPRIORITY = 100 SYS_BIND = 104 SYS_SETSOCKOPT = 105 SYS_LISTEN = 106 SYS_SIGSUSPEND = 111 SYS_GETTIMEOFDAY = 116 SYS_GETRUSAGE = 117 SYS_GETSOCKOPT = 118 SYS_READV = 120 SYS_WRITEV = 121 SYS_SETTIMEOFDAY = 122 SYS_FCHOWN = 123 SYS_FCHMOD = 124 SYS_SETREUID = 126 SYS_SETREGID = 127 SYS_RENAME = 128 SYS_FLOCK = 131 SYS_MKFIFO = 132 SYS_SENDTO = 133 SYS_SHUTDOWN = 134 SYS_SOCKETPAIR = 135 SYS_MKDIR = 136 SYS_RMDIR = 137 SYS_UTIMES = 138 SYS_FUTIMES = 139 SYS_ADJTIME = 140 SYS_GETHOSTUUID = 142 SYS_SETSID = 147 SYS_GETPGID = 151 SYS_SETPRIVEXEC = 152 SYS_PREAD = 153 SYS_PWRITE = 154 SYS_NFSSVC = 155 SYS_STATFS = 157 SYS_FSTATFS = 158 SYS_UNMOUNT = 159 SYS_GETFH = 161 SYS_QUOTACTL = 165 SYS_MOUNT = 167 SYS_CSOPS = 169 SYS_CSOPS_AUDITTOKEN = 170 SYS_WAITID = 173 SYS_KDEBUG_TYPEFILTER = 177 SYS_KDEBUG_TRACE_STRING = 178 SYS_KDEBUG_TRACE64 = 179 SYS_KDEBUG_TRACE = 180 SYS_SETGID = 181 SYS_SETEGID = 182 SYS_SETEUID = 183 SYS_SIGRETURN = 184 SYS_THREAD_SELFCOUNTS = 186 SYS_FDATASYNC = 187 SYS_STAT = 188 SYS_FSTAT = 189 SYS_LSTAT = 190 SYS_PATHCONF = 191 SYS_FPATHCONF = 192 SYS_GETRLIMIT = 194 SYS_SETRLIMIT = 195 SYS_GETDIRENTRIES = 196 SYS_MMAP = 197 SYS_LSEEK = 199 SYS_TRUNCATE = 200 SYS_FTRUNCATE = 201 SYS_SYSCTL = 202 SYS_MLOCK = 203 SYS_MUNLOCK = 204 SYS_UNDELETE = 205 SYS_OPEN_DPROTECTED_NP = 216 SYS_GETATTRLIST = 220 SYS_SETATTRLIST = 221 SYS_GETDIRENTRIESATTR = 222 SYS_EXCHANGEDATA = 223 SYS_SEARCHFS = 225 SYS_DELETE = 226 SYS_COPYFILE = 227 SYS_FGETATTRLIST = 228 SYS_FSETATTRLIST = 229 SYS_POLL = 230 SYS_WATCHEVENT = 231 SYS_WAITEVENT = 232 SYS_MODWATCH = 233 SYS_GETXATTR = 234 SYS_FGETXATTR = 235 SYS_SETXATTR = 236 SYS_FSETXATTR = 237 SYS_REMOVEXATTR = 238 SYS_FREMOVEXATTR = 239 SYS_LISTXATTR = 240 SYS_FLISTXATTR = 241 SYS_FSCTL = 242 SYS_INITGROUPS = 243 SYS_POSIX_SPAWN = 244 SYS_FFSCTL = 245 SYS_NFSCLNT = 247 SYS_FHOPEN = 248 SYS_MINHERIT = 250 SYS_SEMSYS = 251 SYS_MSGSYS = 252 SYS_SHMSYS = 253 SYS_SEMCTL = 254 SYS_SEMGET = 255 SYS_SEMOP = 256 SYS_MSGCTL = 258 SYS_MSGGET = 259 SYS_MSGSND = 260 SYS_MSGRCV = 261 SYS_SHMAT = 262 SYS_SHMCTL = 263 SYS_SHMDT = 264 SYS_SHMGET = 265 SYS_SHM_OPEN = 266 SYS_SHM_UNLINK = 267 SYS_SEM_OPEN = 268 SYS_SEM_CLOSE = 269 SYS_SEM_UNLINK = 270 SYS_SEM_WAIT = 271 SYS_SEM_TRYWAIT = 272 SYS_SEM_POST = 273 SYS_SYSCTLBYNAME = 274 SYS_OPEN_EXTENDED = 277 SYS_UMASK_EXTENDED = 278 SYS_STAT_EXTENDED = 279 SYS_LSTAT_EXTENDED = 280 SYS_FSTAT_EXTENDED = 281 SYS_CHMOD_EXTENDED = 282 SYS_FCHMOD_EXTENDED = 283 SYS_ACCESS_EXTENDED = 284 SYS_SETTID = 285 SYS_GETTID = 286 SYS_SETSGROUPS = 287 SYS_GETSGROUPS = 288 SYS_SETWGROUPS = 289 SYS_GETWGROUPS = 290 SYS_MKFIFO_EXTENDED = 291 SYS_MKDIR_EXTENDED = 292 SYS_IDENTITYSVC = 293 SYS_SHARED_REGION_CHECK_NP = 294 SYS_VM_PRESSURE_MONITOR = 296 SYS_PSYNCH_RW_LONGRDLOCK = 297 SYS_PSYNCH_RW_YIELDWRLOCK = 298 SYS_PSYNCH_RW_DOWNGRADE = 299 SYS_PSYNCH_RW_UPGRADE = 300 SYS_PSYNCH_MUTEXWAIT = 301 SYS_PSYNCH_MUTEXDROP = 302 SYS_PSYNCH_CVBROAD = 303 SYS_PSYNCH_CVSIGNAL = 304 SYS_PSYNCH_CVWAIT = 305 SYS_PSYNCH_RW_RDLOCK = 306 SYS_PSYNCH_RW_WRLOCK = 307 SYS_PSYNCH_RW_UNLOCK = 308 SYS_PSYNCH_RW_UNLOCK2 = 309 SYS_GETSID = 310 SYS_SETTID_WITH_PID = 311 SYS_PSYNCH_CVCLRPREPOST = 312 SYS_AIO_FSYNC = 313 SYS_AIO_RETURN = 314 SYS_AIO_SUSPEND = 315 SYS_AIO_CANCEL = 316 SYS_AIO_ERROR = 317 SYS_AIO_READ = 318 SYS_AIO_WRITE = 319 SYS_LIO_LISTIO = 320 SYS_IOPOLICYSYS = 322 SYS_PROCESS_POLICY = 323 SYS_MLOCKALL = 324 SYS_MUNLOCKALL = 325 SYS_ISSETUGID = 327 SYS___PTHREAD_KILL = 328 SYS___PTHREAD_SIGMASK = 329 SYS___SIGWAIT = 330 SYS___DISABLE_THREADSIGNAL = 331 SYS___PTHREAD_MARKCANCEL = 332 SYS___PTHREAD_CANCELED = 333 SYS___SEMWAIT_SIGNAL = 334 SYS_PROC_INFO = 336 SYS_SENDFILE = 337 SYS_STAT64 = 338 SYS_FSTAT64 = 339 SYS_LSTAT64 = 340 SYS_STAT64_EXTENDED = 341 SYS_LSTAT64_EXTENDED = 342 SYS_FSTAT64_EXTENDED = 343 SYS_GETDIRENTRIES64 = 344 SYS_STATFS64 = 345 SYS_FSTATFS64 = 346 SYS_GETFSSTAT64 = 347 SYS___PTHREAD_CHDIR = 348 SYS___PTHREAD_FCHDIR = 349 SYS_AUDIT = 350 SYS_AUDITON = 351 SYS_GETAUID = 353 SYS_SETAUID = 354 SYS_GETAUDIT_ADDR = 357 SYS_SETAUDIT_ADDR = 358 SYS_AUDITCTL = 359 SYS_BSDTHREAD_CREATE = 360 SYS_BSDTHREAD_TERMINATE = 361 SYS_KQUEUE = 362 SYS_KEVENT = 363 SYS_LCHOWN = 364 SYS_BSDTHREAD_REGISTER = 366 SYS_WORKQ_OPEN = 367 SYS_WORKQ_KERNRETURN = 368 SYS_KEVENT64 = 369 SYS___OLD_SEMWAIT_SIGNAL = 370 SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371 SYS_THREAD_SELFID = 372 SYS_LEDGER = 373 SYS_KEVENT_QOS = 374 SYS_KEVENT_ID = 375 SYS___MAC_EXECVE = 380 SYS___MAC_SYSCALL = 381 SYS___MAC_GET_FILE = 382 SYS___MAC_SET_FILE = 383 SYS___MAC_GET_LINK = 384 SYS___MAC_SET_LINK = 385 SYS___MAC_GET_PROC = 386 SYS___MAC_SET_PROC = 387 SYS___MAC_GET_FD = 388 SYS___MAC_SET_FD = 389 SYS___MAC_GET_PID = 390 SYS_PSELECT = 394 SYS_PSELECT_NOCANCEL = 395 SYS_READ_NOCANCEL = 396 SYS_WRITE_NOCANCEL = 397 SYS_OPEN_NOCANCEL = 398 SYS_CLOSE_NOCANCEL = 399 SYS_WAIT4_NOCANCEL = 400 SYS_RECVMSG_NOCANCEL = 401 SYS_SENDMSG_NOCANCEL = 402 SYS_RECVFROM_NOCANCEL = 403 SYS_ACCEPT_NOCANCEL = 404 SYS_MSYNC_NOCANCEL = 405 SYS_FCNTL_NOCANCEL = 406 SYS_SELECT_NOCANCEL = 407 SYS_FSYNC_NOCANCEL = 408 SYS_CONNECT_NOCANCEL = 409 SYS_SIGSUSPEND_NOCANCEL = 410 SYS_READV_NOCANCEL = 411 SYS_WRITEV_NOCANCEL = 412 SYS_SENDTO_NOCANCEL = 413 SYS_PREAD_NOCANCEL = 414 SYS_PWRITE_NOCANCEL = 415 SYS_WAITID_NOCANCEL = 416 SYS_POLL_NOCANCEL = 417 SYS_MSGSND_NOCANCEL = 418 SYS_MSGRCV_NOCANCEL = 419 SYS_SEM_WAIT_NOCANCEL = 420 SYS_AIO_SUSPEND_NOCANCEL = 421 SYS___SIGWAIT_NOCANCEL = 422 SYS___SEMWAIT_SIGNAL_NOCANCEL = 423 SYS___MAC_MOUNT = 424 SYS___MAC_GET_MOUNT = 425 SYS___MAC_GETFSSTAT = 426 SYS_FSGETPATH = 427 SYS_AUDIT_SESSION_SELF = 428 SYS_AUDIT_SESSION_JOIN = 429 SYS_FILEPORT_MAKEPORT = 430 SYS_FILEPORT_MAKEFD = 431 SYS_AUDIT_SESSION_PORT = 432 SYS_PID_SUSPEND = 433 SYS_PID_RESUME = 434 SYS_PID_HIBERNATE = 435 SYS_PID_SHUTDOWN_SOCKETS = 436 SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438 SYS_KAS_INFO = 439 SYS_MEMORYSTATUS_CONTROL = 440 SYS_GUARDED_OPEN_NP = 441 SYS_GUARDED_CLOSE_NP = 442 SYS_GUARDED_KQUEUE_NP = 443 SYS_CHANGE_FDGUARD_NP = 444 SYS_USRCTL = 445 SYS_PROC_RLIMIT_CONTROL = 446 SYS_CONNECTX = 447 SYS_DISCONNECTX = 448 SYS_PEELOFF = 449 SYS_SOCKET_DELEGATE = 450 SYS_TELEMETRY = 451 SYS_PROC_UUID_POLICY = 452 SYS_MEMORYSTATUS_GET_LEVEL = 453 SYS_SYSTEM_OVERRIDE = 454 SYS_VFS_PURGE = 455 SYS_SFI_CTL = 456 SYS_SFI_PIDCTL = 457 SYS_COALITION = 458 SYS_COALITION_INFO = 459 SYS_NECP_MATCH_POLICY = 460 SYS_GETATTRLISTBULK = 461 SYS_CLONEFILEAT = 462 SYS_OPENAT = 463 SYS_OPENAT_NOCANCEL = 464 SYS_RENAMEAT = 465 SYS_FACCESSAT = 466 SYS_FCHMODAT = 467 SYS_FCHOWNAT = 468 SYS_FSTATAT = 469 SYS_FSTATAT64 = 470 SYS_LINKAT = 471 SYS_UNLINKAT = 472 SYS_READLINKAT = 473 SYS_SYMLINKAT = 474 SYS_MKDIRAT = 475 SYS_GETATTRLISTAT = 476 SYS_PROC_TRACE_LOG = 477 SYS_BSDTHREAD_CTL = 478 SYS_OPENBYID_NP = 479 SYS_RECVMSG_X = 480 SYS_SENDMSG_X = 481 SYS_THREAD_SELFUSAGE = 482 SYS_CSRCTL = 483 SYS_GUARDED_OPEN_DPROTECTED_NP = 484 SYS_GUARDED_WRITE_NP = 485 SYS_GUARDED_PWRITE_NP = 486 SYS_GUARDED_WRITEV_NP = 487 SYS_RENAMEATX_NP = 488 SYS_MREMAP_ENCRYPTED = 489 SYS_NETAGENT_TRIGGER = 490 SYS_STACK_SNAPSHOT_WITH_CONFIG = 491 SYS_MICROSTACKSHOT = 492 SYS_GRAB_PGO_DATA = 493 SYS_PERSONA = 494 SYS_WORK_INTERVAL_CTL = 499 SYS_GETENTROPY = 500 SYS_NECP_OPEN = 501 SYS_NECP_CLIENT_ACTION = 502 SYS___NEXUS_OPEN = 503 SYS___NEXUS_REGISTER = 504 SYS___NEXUS_DEREGISTER = 505 SYS___NEXUS_CREATE = 506 SYS___NEXUS_DESTROY = 507 SYS___NEXUS_GET_OPT = 508 SYS___NEXUS_SET_OPT = 509 SYS___CHANNEL_OPEN = 510 SYS___CHANNEL_GET_INFO = 511 SYS___CHANNEL_SYNC = 512 SYS___CHANNEL_GET_OPT = 513 SYS___CHANNEL_SET_OPT = 514 SYS_ULOCK_WAIT = 515 SYS_ULOCK_WAKE = 516 SYS_FCLONEFILEAT = 517 SYS_FS_SNAPSHOT = 518 SYS_TERMINATE_WITH_PAYLOAD = 520 SYS_ABORT_WITH_PAYLOAD = 521 SYS_NECP_SESSION_OPEN = 522 SYS_NECP_SESSION_ACTION = 523 SYS_SETATTRLISTAT = 524 SYS_NET_QOS_GUIDELINE = 525 SYS_FMOUNT = 526 SYS_NTP_ADJTIME = 527 SYS_NTP_GETTIME = 528 SYS_OS_FAULT_WITH_PAYLOAD = 529 SYS_MAXSYSCALL = 530 SYS_INVALID = 63 ) ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go ================================================ // mksysnum_dragonfly.pl // Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,dragonfly package unix const ( // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int SYS_EXIT = 1 // { void exit(int rval); } SYS_FORK = 2 // { int fork(void); } SYS_READ = 3 // { ssize_t read(int fd, void *buf, size_t nbyte); } SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, size_t nbyte); } SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } SYS_CLOSE = 6 // { int close(int fd); } SYS_WAIT4 = 7 // { int wait4(int pid, int *status, int options, \ SYS_LINK = 9 // { int link(char *path, char *link); } SYS_UNLINK = 10 // { int unlink(char *path); } SYS_CHDIR = 12 // { int chdir(char *path); } SYS_FCHDIR = 13 // { int fchdir(int fd); } SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } SYS_CHMOD = 15 // { int chmod(char *path, int mode); } SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } SYS_OBREAK = 17 // { int obreak(char *nsize); } break obreak_args int SYS_GETFSSTAT = 18 // { int getfsstat(struct statfs *buf, long bufsize, \ SYS_GETPID = 20 // { pid_t getpid(void); } SYS_MOUNT = 21 // { int mount(char *type, char *path, int flags, \ SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } SYS_SETUID = 23 // { int setuid(uid_t uid); } SYS_GETUID = 24 // { uid_t getuid(void); } SYS_GETEUID = 25 // { uid_t geteuid(void); } SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, caddr_t addr, \ SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, int flags); } SYS_SENDMSG = 28 // { int sendmsg(int s, caddr_t msg, int flags); } SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, size_t len, \ SYS_ACCEPT = 30 // { int accept(int s, caddr_t name, int *anamelen); } SYS_GETPEERNAME = 31 // { int getpeername(int fdes, caddr_t asa, int *alen); } SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, caddr_t asa, int *alen); } SYS_ACCESS = 33 // { int access(char *path, int flags); } SYS_CHFLAGS = 34 // { int chflags(char *path, int flags); } SYS_FCHFLAGS = 35 // { int fchflags(int fd, int flags); } SYS_SYNC = 36 // { int sync(void); } SYS_KILL = 37 // { int kill(int pid, int signum); } SYS_GETPPID = 39 // { pid_t getppid(void); } SYS_DUP = 41 // { int dup(int fd); } SYS_PIPE = 42 // { int pipe(void); } SYS_GETEGID = 43 // { gid_t getegid(void); } SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, int facs, \ SYS_GETGID = 47 // { gid_t getgid(void); } SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int namelen); } SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } SYS_ACCT = 51 // { int acct(char *path); } SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, stack_t *oss); } SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, caddr_t data); } SYS_REBOOT = 55 // { int reboot(int opt); } SYS_REVOKE = 56 // { int revoke(char *path); } SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } SYS_READLINK = 58 // { int readlink(char *path, char *buf, int count); } SYS_EXECVE = 59 // { int execve(char *fname, char **argv, char **envv); } SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args int SYS_CHROOT = 61 // { int chroot(char *path); } SYS_MSYNC = 65 // { int msync(void *addr, size_t len, int flags); } SYS_VFORK = 66 // { pid_t vfork(void); } SYS_SBRK = 69 // { int sbrk(int incr); } SYS_SSTK = 70 // { int sstk(int incr); } SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } SYS_MPROTECT = 74 // { int mprotect(void *addr, size_t len, int prot); } SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, int behav); } SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, gid_t *gidset); } SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, gid_t *gidset); } SYS_GETPGRP = 81 // { int getpgrp(void); } SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } SYS_SETITIMER = 83 // { int setitimer(u_int which, struct itimerval *itv, \ SYS_SWAPON = 85 // { int swapon(char *name); } SYS_GETITIMER = 86 // { int getitimer(u_int which, struct itimerval *itv); } SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } SYS_DUP2 = 90 // { int dup2(int from, int to); } SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ SYS_FSYNC = 95 // { int fsync(int fd); } SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, int prio); } SYS_SOCKET = 97 // { int socket(int domain, int type, int protocol); } SYS_CONNECT = 98 // { int connect(int s, caddr_t name, int namelen); } SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } SYS_BIND = 104 // { int bind(int s, caddr_t name, int namelen); } SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ SYS_LISTEN = 106 // { int listen(int s, int backlog); } SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ SYS_GETRUSAGE = 117 // { int getrusage(int who, struct rusage *rusage); } SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, u_int iovcnt); } SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } SYS_RENAME = 128 // { int rename(char *from, char *to); } SYS_FLOCK = 131 // { int flock(int fd, int how); } SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, int protocol, \ SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } SYS_RMDIR = 137 // { int rmdir(char *path); } SYS_UTIMES = 138 // { int utimes(char *path, struct timeval *tptr); } SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ SYS_SETSID = 147 // { int setsid(void); } SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ SYS_STATFS = 157 // { int statfs(char *path, struct statfs *buf); } SYS_FSTATFS = 158 // { int fstatfs(int fd, struct statfs *buf); } SYS_GETFH = 161 // { int getfh(char *fname, struct fhandle *fhp); } SYS_GETDOMAINNAME = 162 // { int getdomainname(char *domainname, int len); } SYS_SETDOMAINNAME = 163 // { int setdomainname(char *domainname, int len); } SYS_UNAME = 164 // { int uname(struct utsname *name); } SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ SYS_EXTPREAD = 173 // { ssize_t extpread(int fd, void *buf, \ SYS_EXTPWRITE = 174 // { ssize_t extpwrite(int fd, const void *buf, \ SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } SYS_SETGID = 181 // { int setgid(gid_t gid); } SYS_SETEGID = 182 // { int setegid(gid_t egid); } SYS_SETEUID = 183 // { int seteuid(uid_t euid); } SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ SYS_MMAP = 197 // { caddr_t mmap(caddr_t addr, size_t len, int prot, \ // SYS_NOSYS = 198; // { int nosys(void); } __syscall __syscall_args int SYS_LSEEK = 199 // { off_t lseek(int fd, int pad, off_t offset, \ SYS_TRUNCATE = 200 // { int truncate(char *path, int pad, off_t length); } SYS_FTRUNCATE = 201 // { int ftruncate(int fd, int pad, off_t length); } SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, \ SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } SYS_UNDELETE = 205 // { int undelete(char *path); } SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } SYS_GETPGID = 207 // { int getpgid(pid_t pid); } SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ SYS___SEMCTL = 220 // { int __semctl(int semid, int semnum, int cmd, \ SYS_SEMGET = 221 // { int semget(key_t key, int nsems, int semflg); } SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, \ SYS_MSGCTL = 224 // { int msgctl(int msqid, int cmd, \ SYS_MSGGET = 225 // { int msgget(key_t key, int msgflg); } SYS_MSGSND = 226 // { int msgsnd(int msqid, const void *msgp, size_t msgsz, \ SYS_MSGRCV = 227 // { int msgrcv(int msqid, void *msgp, size_t msgsz, \ SYS_SHMAT = 228 // { caddr_t shmat(int shmid, const void *shmaddr, \ SYS_SHMCTL = 229 // { int shmctl(int shmid, int cmd, \ SYS_SHMDT = 230 // { int shmdt(const void *shmaddr); } SYS_SHMGET = 231 // { int shmget(key_t key, size_t size, int shmflg); } SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ SYS_CLOCK_SETTIME = 233 // { int clock_settime(clockid_t clock_id, \ SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, int inherit); } SYS_RFORK = 251 // { int rfork(int flags); } SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, u_int nfds, \ SYS_ISSETUGID = 253 // { int issetugid(void); } SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } SYS_LUTIMES = 276 // { int lutimes(char *path, struct timeval *tptr); } SYS_EXTPREADV = 289 // { ssize_t extpreadv(int fd, struct iovec *iovp, \ SYS_EXTPWRITEV = 290 // { ssize_t extpwritev(int fd, struct iovec *iovp,\ SYS_FHSTATFS = 297 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, int flags); } SYS_MODNEXT = 300 // { int modnext(int modid); } SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat* stat); } SYS_MODFNEXT = 302 // { int modfnext(int modid); } SYS_MODFIND = 303 // { int modfind(const char *name); } SYS_KLDLOAD = 304 // { int kldload(const char *file); } SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } SYS_KLDFIND = 306 // { int kldfind(const char *file); } SYS_KLDNEXT = 307 // { int kldnext(int fileid); } SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat* stat); } SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } SYS_GETSID = 310 // { int getsid(pid_t pid); } SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); } SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); } SYS_AIO_RETURN = 314 // { int aio_return(struct aiocb *aiocbp); } SYS_AIO_SUSPEND = 315 // { int aio_suspend(struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); } SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); } SYS_AIO_READ = 318 // { int aio_read(struct aiocb *aiocbp); } SYS_AIO_WRITE = 319 // { int aio_write(struct aiocb *aiocbp); } SYS_LIO_LISTIO = 320 // { int lio_listio(int mode, struct aiocb * const *acb_list, int nent, struct sigevent *sig); } SYS_YIELD = 321 // { int yield(void); } SYS_MLOCKALL = 324 // { int mlockall(int how); } SYS_MUNLOCKALL = 325 // { int munlockall(void); } SYS___GETCWD = 326 // { int __getcwd(u_char *buf, u_int buflen); } SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, const struct sched_param *param); } SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct sched_param *param); } SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); } SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } SYS_SCHED_YIELD = 331 // { int sched_yield (void); } SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, struct timespec *interval); } SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, void *data); } SYS_JAIL = 338 // { int jail(struct jail *jail); } SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, const sigset_t *set, \ SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } SYS_SIGACTION = 342 // { int sigaction(int sig, const struct sigaction *act, \ SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } SYS_SIGRETURN = 344 // { int sigreturn(ucontext_t *sigcntxp); } SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set,\ SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set,\ SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, acl_type_t type, \ SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, acl_type_t type, \ SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, acl_type_t type); } SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, acl_type_t type, \ SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ SYS_EXTATTR_SET_FILE = 356 // { int extattr_set_file(const char *path, \ SYS_EXTATTR_GET_FILE = 357 // { int extattr_get_file(const char *path, \ SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ SYS_AIO_WAITCOMPLETE = 359 // { int aio_waitcomplete(struct aiocb **aiocbp, struct timespec *timeout); } SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); } SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); } SYS_KQUEUE = 362 // { int kqueue(void); } SYS_KEVENT = 363 // { int kevent(int fd, \ SYS_KENV = 390 // { int kenv(int what, const char *name, char *value, int len); } SYS_LCHFLAGS = 391 // { int lchflags(char *path, int flags); } SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); } SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, \ SYS_VARSYM_SET = 450 // { int varsym_set(int level, const char *name, const char *data); } SYS_VARSYM_GET = 451 // { int varsym_get(int mask, const char *wild, char *buf, int bufsize); } SYS_VARSYM_LIST = 452 // { int varsym_list(int level, char *buf, int maxsize, int *marker); } SYS_EXEC_SYS_REGISTER = 465 // { int exec_sys_register(void *entry); } SYS_EXEC_SYS_UNREGISTER = 466 // { int exec_sys_unregister(int id); } SYS_SYS_CHECKPOINT = 467 // { int sys_checkpoint(int type, int fd, pid_t pid, int retval); } SYS_MOUNTCTL = 468 // { int mountctl(const char *path, int op, int fd, const void *ctl, int ctllen, void *buf, int buflen); } SYS_UMTX_SLEEP = 469 // { int umtx_sleep(volatile const int *ptr, int value, int timeout); } SYS_UMTX_WAKEUP = 470 // { int umtx_wakeup(volatile const int *ptr, int count); } SYS_JAIL_ATTACH = 471 // { int jail_attach(int jid); } SYS_SET_TLS_AREA = 472 // { int set_tls_area(int which, struct tls_info *info, size_t infosize); } SYS_GET_TLS_AREA = 473 // { int get_tls_area(int which, struct tls_info *info, size_t infosize); } SYS_CLOSEFROM = 474 // { int closefrom(int fd); } SYS_STAT = 475 // { int stat(const char *path, struct stat *ub); } SYS_FSTAT = 476 // { int fstat(int fd, struct stat *sb); } SYS_LSTAT = 477 // { int lstat(const char *path, struct stat *ub); } SYS_FHSTAT = 478 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); } SYS_GETDIRENTRIES = 479 // { int getdirentries(int fd, char *buf, u_int count, \ SYS_GETDENTS = 480 // { int getdents(int fd, char *buf, size_t count); } SYS_USCHED_SET = 481 // { int usched_set(pid_t pid, int cmd, void *data, \ SYS_EXTACCEPT = 482 // { int extaccept(int s, int flags, caddr_t name, int *anamelen); } SYS_EXTCONNECT = 483 // { int extconnect(int s, int flags, caddr_t name, int namelen); } SYS_MCONTROL = 485 // { int mcontrol(void *addr, size_t len, int behav, off_t value); } SYS_VMSPACE_CREATE = 486 // { int vmspace_create(void *id, int type, void *data); } SYS_VMSPACE_DESTROY = 487 // { int vmspace_destroy(void *id); } SYS_VMSPACE_CTL = 488 // { int vmspace_ctl(void *id, int cmd, \ SYS_VMSPACE_MMAP = 489 // { int vmspace_mmap(void *id, void *addr, size_t len, \ SYS_VMSPACE_MUNMAP = 490 // { int vmspace_munmap(void *id, void *addr, \ SYS_VMSPACE_MCONTROL = 491 // { int vmspace_mcontrol(void *id, void *addr, \ SYS_VMSPACE_PREAD = 492 // { ssize_t vmspace_pread(void *id, void *buf, \ SYS_VMSPACE_PWRITE = 493 // { ssize_t vmspace_pwrite(void *id, const void *buf, \ SYS_EXTEXIT = 494 // { void extexit(int how, int status, void *addr); } SYS_LWP_CREATE = 495 // { int lwp_create(struct lwp_params *params); } SYS_LWP_GETTID = 496 // { lwpid_t lwp_gettid(void); } SYS_LWP_KILL = 497 // { int lwp_kill(pid_t pid, lwpid_t tid, int signum); } SYS_LWP_RTPRIO = 498 // { int lwp_rtprio(int function, pid_t pid, lwpid_t tid, struct rtprio *rtp); } SYS_PSELECT = 499 // { int pselect(int nd, fd_set *in, fd_set *ou, \ SYS_STATVFS = 500 // { int statvfs(const char *path, struct statvfs *buf); } SYS_FSTATVFS = 501 // { int fstatvfs(int fd, struct statvfs *buf); } SYS_FHSTATVFS = 502 // { int fhstatvfs(const struct fhandle *u_fhp, struct statvfs *buf); } SYS_GETVFSSTAT = 503 // { int getvfsstat(struct statfs *buf, \ SYS_OPENAT = 504 // { int openat(int fd, char *path, int flags, int mode); } SYS_FSTATAT = 505 // { int fstatat(int fd, char *path, \ SYS_FCHMODAT = 506 // { int fchmodat(int fd, char *path, int mode, \ SYS_FCHOWNAT = 507 // { int fchownat(int fd, char *path, int uid, int gid, \ SYS_UNLINKAT = 508 // { int unlinkat(int fd, char *path, int flags); } SYS_FACCESSAT = 509 // { int faccessat(int fd, char *path, int amode, \ SYS_MQ_OPEN = 510 // { mqd_t mq_open(const char * name, int oflag, \ SYS_MQ_CLOSE = 511 // { int mq_close(mqd_t mqdes); } SYS_MQ_UNLINK = 512 // { int mq_unlink(const char *name); } SYS_MQ_GETATTR = 513 // { int mq_getattr(mqd_t mqdes, \ SYS_MQ_SETATTR = 514 // { int mq_setattr(mqd_t mqdes, \ SYS_MQ_NOTIFY = 515 // { int mq_notify(mqd_t mqdes, \ SYS_MQ_SEND = 516 // { int mq_send(mqd_t mqdes, const char *msg_ptr, \ SYS_MQ_RECEIVE = 517 // { ssize_t mq_receive(mqd_t mqdes, char *msg_ptr, \ SYS_MQ_TIMEDSEND = 518 // { int mq_timedsend(mqd_t mqdes, \ SYS_MQ_TIMEDRECEIVE = 519 // { ssize_t mq_timedreceive(mqd_t mqdes, \ SYS_IOPRIO_SET = 520 // { int ioprio_set(int which, int who, int prio); } SYS_IOPRIO_GET = 521 // { int ioprio_get(int which, int who); } SYS_CHROOT_KERNEL = 522 // { int chroot_kernel(char *path); } SYS_RENAMEAT = 523 // { int renameat(int oldfd, char *old, int newfd, \ SYS_MKDIRAT = 524 // { int mkdirat(int fd, char *path, mode_t mode); } SYS_MKFIFOAT = 525 // { int mkfifoat(int fd, char *path, mode_t mode); } SYS_MKNODAT = 526 // { int mknodat(int fd, char *path, mode_t mode, \ SYS_READLINKAT = 527 // { int readlinkat(int fd, char *path, char *buf, \ SYS_SYMLINKAT = 528 // { int symlinkat(char *path1, int fd, char *path2); } SYS_SWAPOFF = 529 // { int swapoff(char *name); } SYS_VQUOTACTL = 530 // { int vquotactl(const char *path, \ SYS_LINKAT = 531 // { int linkat(int fd1, char *path1, int fd2, \ SYS_EACCESS = 532 // { int eaccess(char *path, int flags); } SYS_LPATHCONF = 533 // { int lpathconf(char *path, int name); } SYS_VMM_GUEST_CTL = 534 // { int vmm_guest_ctl(int op, struct vmm_guest_options *options); } SYS_VMM_GUEST_SYNC_ADDR = 535 // { int vmm_guest_sync_addr(long *dstaddr, long *srcaddr); } SYS_PROCCTL = 536 // { int procctl(idtype_t idtype, id_t id, int cmd, void *data); } SYS_CHFLAGSAT = 537 // { int chflagsat(int fd, const char *path, int flags, int atflags);} SYS_PIPE2 = 538 // { int pipe2(int *fildes, int flags); } SYS_UTIMENSAT = 539 // { int utimensat(int fd, const char *path, const struct timespec *ts, int flags); } SYS_FUTIMENS = 540 // { int futimens(int fd, const struct timespec *ts); } SYS_ACCEPT4 = 541 // { int accept4(int s, caddr_t name, int *anamelen, int flags); } SYS_LWP_SETNAME = 542 // { int lwp_setname(lwpid_t tid, const char *name); } SYS_PPOLL = 543 // { int ppoll(struct pollfd *fds, u_int nfds, \ SYS_LWP_SETAFFINITY = 544 // { int lwp_setaffinity(pid_t pid, lwpid_t tid, const cpumask_t *mask); } SYS_LWP_GETAFFINITY = 545 // { int lwp_getaffinity(pid_t pid, lwpid_t tid, cpumask_t *mask); } SYS_LWP_CREATE2 = 546 // { int lwp_create2(struct lwp_params *params, const cpumask_t *mask); } ) ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go ================================================ // mksysnum_freebsd.pl // Code generated by the command above; see README.md. DO NOT EDIT. // +build 386,freebsd package unix const ( // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int SYS_EXIT = 1 // { void sys_exit(int rval); } exit \ SYS_FORK = 2 // { int fork(void); } SYS_READ = 3 // { ssize_t read(int fd, void *buf, \ SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, \ SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } SYS_CLOSE = 6 // { int close(int fd); } SYS_WAIT4 = 7 // { int wait4(int pid, int *status, \ SYS_LINK = 9 // { int link(char *path, char *link); } SYS_UNLINK = 10 // { int unlink(char *path); } SYS_CHDIR = 12 // { int chdir(char *path); } SYS_FCHDIR = 13 // { int fchdir(int fd); } SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } SYS_CHMOD = 15 // { int chmod(char *path, int mode); } SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } SYS_OBREAK = 17 // { int obreak(char *nsize); } break \ SYS_GETPID = 20 // { pid_t getpid(void); } SYS_MOUNT = 21 // { int mount(char *type, char *path, \ SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } SYS_SETUID = 23 // { int setuid(uid_t uid); } SYS_GETUID = 24 // { uid_t getuid(void); } SYS_GETEUID = 25 // { uid_t geteuid(void); } SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, \ SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, \ SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, \ SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, \ SYS_ACCEPT = 30 // { int accept(int s, \ SYS_GETPEERNAME = 31 // { int getpeername(int fdes, \ SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, \ SYS_ACCESS = 33 // { int access(char *path, int amode); } SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); } SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); } SYS_SYNC = 36 // { int sync(void); } SYS_KILL = 37 // { int kill(int pid, int signum); } SYS_GETPPID = 39 // { pid_t getppid(void); } SYS_DUP = 41 // { int dup(u_int fd); } SYS_PIPE = 42 // { int pipe(void); } SYS_GETEGID = 43 // { gid_t getegid(void); } SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, \ SYS_GETGID = 47 // { gid_t getgid(void); } SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int \ SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } SYS_ACCT = 51 // { int acct(char *path); } SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, \ SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, \ SYS_REBOOT = 55 // { int reboot(int opt); } SYS_REVOKE = 56 // { int revoke(char *path); } SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, \ SYS_EXECVE = 59 // { int execve(char *fname, char **argv, \ SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args \ SYS_CHROOT = 61 // { int chroot(char *path); } SYS_MSYNC = 65 // { int msync(void *addr, size_t len, \ SYS_VFORK = 66 // { int vfork(void); } SYS_SBRK = 69 // { int sbrk(int incr); } SYS_SSTK = 70 // { int sstk(int incr); } SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise \ SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, \ SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, \ SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, \ SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, \ SYS_GETPGRP = 81 // { int getpgrp(void); } SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } SYS_SETITIMER = 83 // { int setitimer(u_int which, struct \ SYS_SWAPON = 85 // { int swapon(char *name); } SYS_GETITIMER = 86 // { int getitimer(u_int which, \ SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ SYS_FSYNC = 95 // { int fsync(int fd); } SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, \ SYS_SOCKET = 97 // { int socket(int domain, int type, \ SYS_CONNECT = 98 // { int connect(int s, caddr_t name, \ SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } SYS_BIND = 104 // { int bind(int s, caddr_t name, \ SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ SYS_LISTEN = 106 // { int listen(int s, int backlog); } SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ SYS_GETRUSAGE = 117 // { int getrusage(int who, \ SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, \ SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } SYS_RENAME = 128 // { int rename(char *from, char *to); } SYS_FLOCK = 131 // { int flock(int fd, int how); } SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, \ SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } SYS_RMDIR = 137 // { int rmdir(char *path); } SYS_UTIMES = 138 // { int utimes(char *path, \ SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ SYS_SETSID = 147 // { int setsid(void); } SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ SYS_LGETFH = 160 // { int lgetfh(char *fname, \ SYS_GETFH = 161 // { int getfh(char *fname, \ SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, \ SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, \ SYS_SETFIB = 175 // { int setfib(int fibnum); } SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } SYS_SETGID = 181 // { int setgid(gid_t gid); } SYS_SETEGID = 182 // { int setegid(gid_t egid); } SYS_SETEUID = 183 // { int seteuid(uid_t euid); } SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, \ SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, \ SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, \ SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, \ SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, \ SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, \ SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } SYS_UNDELETE = 205 // { int undelete(char *path); } SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } SYS_GETPGID = 207 // { int getpgid(pid_t pid); } SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ SYS_CLOCK_SETTIME = 233 // { int clock_settime( \ SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, \ SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, \ SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct \ SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( \ SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( \ SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,\ SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, \ SYS_RFORK = 251 // { int rfork(int flags); } SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, \ SYS_ISSETUGID = 253 // { int issetugid(void); } SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, \ SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } SYS_LUTIMES = 276 // { int lutimes(char *path, \ SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \ SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \ SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, \ SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, \ SYS_MODNEXT = 300 // { int modnext(int modid); } SYS_MODSTAT = 301 // { int modstat(int modid, \ SYS_MODFNEXT = 302 // { int modfnext(int modid); } SYS_MODFIND = 303 // { int modfind(const char *name); } SYS_KLDLOAD = 304 // { int kldload(const char *file); } SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } SYS_KLDFIND = 306 // { int kldfind(const char *file); } SYS_KLDNEXT = 307 // { int kldnext(int fileid); } SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct \ SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } SYS_GETSID = 310 // { int getsid(pid_t pid); } SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, \ SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, \ SYS_YIELD = 321 // { int yield(void); } SYS_MLOCKALL = 324 // { int mlockall(int how); } SYS_MUNLOCKALL = 325 // { int munlockall(void); } SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, \ SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct \ SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int \ SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } SYS_SCHED_YIELD = 331 // { int sched_yield (void); } SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, \ SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, \ SYS_JAIL = 338 // { int jail(struct jail *jail); } SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, \ SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, \ SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, \ SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, \ SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, \ SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, \ SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, \ SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( \ SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( \ SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \ SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \ SYS_KQUEUE = 362 // { int kqueue(void); } SYS_KEVENT = 363 // { int kevent(int fd, \ SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, \ SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, \ SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, \ SYS___SETUGID = 374 // { int __setugid(int flag); } SYS_EACCESS = 376 // { int eaccess(char *path, int amode); } SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, \ SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); } SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); } SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, \ SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, \ SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, \ SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, \ SYS_KENV = 390 // { int kenv(int what, const char *name, \ SYS_LCHFLAGS = 391 // { int lchflags(const char *path, \ SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, \ SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, \ SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, \ SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, \ SYS_STATFS = 396 // { int statfs(char *path, \ SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, \ SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, \ SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, \ SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, \ SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( \ SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( \ SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( \ SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, \ SYS_SIGACTION = 416 // { int sigaction(int sig, \ SYS_SIGRETURN = 417 // { int sigreturn( \ SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } SYS_SETCONTEXT = 422 // { int setcontext( \ SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, \ SYS_SWAPOFF = 424 // { int swapoff(const char *name); } SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, \ SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, \ SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, \ SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, \ SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, \ SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, \ SYS_THR_EXIT = 431 // { void thr_exit(long *state); } SYS_THR_SELF = 432 // { int thr_self(long *id); } SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, \ SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( \ SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( \ SYS_THR_SUSPEND = 442 // { int thr_suspend( \ SYS_THR_WAKE = 443 // { int thr_wake(long id); } SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } SYS_AUDIT = 445 // { int audit(const void *record, \ SYS_AUDITON = 446 // { int auditon(int cmd, void *data, \ SYS_GETAUID = 447 // { int getauid(uid_t *auid); } SYS_SETAUID = 448 // { int setauid(uid_t *auid); } SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( \ SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( \ SYS_AUDITCTL = 453 // { int auditctl(char *path); } SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, \ SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, \ SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, \ SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, \ SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, \ SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, \ SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, \ SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); } SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); } SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); } SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, \ SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); } SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); } SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \ SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, \ SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, \ SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, \ SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, \ SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, \ SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, \ SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, \ SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, \ SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, \ SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, \ SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, \ SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, \ SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, \ SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, \ SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, \ SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); } SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, \ SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, \ SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); } SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); } SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); } SYS___CAP_RIGHTS_GET = 515 // { int __cap_rights_get(int version, \ SYS_CAP_ENTER = 516 // { int cap_enter(void); } SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); } SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); } SYS_PDKILL = 519 // { int pdkill(int fd, int signum); } SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); } SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, \ SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, \ SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); } SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, \ SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, \ SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, \ SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, \ SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, \ SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, \ SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, \ SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, \ SYS_CAP_RIGHTS_LIMIT = 533 // { int cap_rights_limit(int fd, \ SYS_CAP_IOCTLS_LIMIT = 534 // { int cap_ioctls_limit(int fd, \ SYS_CAP_IOCTLS_GET = 535 // { ssize_t cap_ioctls_get(int fd, \ SYS_CAP_FCNTLS_LIMIT = 536 // { int cap_fcntls_limit(int fd, \ SYS_CAP_FCNTLS_GET = 537 // { int cap_fcntls_get(int fd, \ SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, \ SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, \ SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, \ SYS_ACCEPT4 = 541 // { int accept4(int s, \ SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); } SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, \ SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \ SYS_FUTIMENS = 546 // { int futimens(int fd, \ SYS_UTIMENSAT = 547 // { int utimensat(int fd, \ ) ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go ================================================ // mksysnum_freebsd.pl // Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,freebsd package unix const ( // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int SYS_EXIT = 1 // { void sys_exit(int rval); } exit \ SYS_FORK = 2 // { int fork(void); } SYS_READ = 3 // { ssize_t read(int fd, void *buf, \ SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, \ SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } SYS_CLOSE = 6 // { int close(int fd); } SYS_WAIT4 = 7 // { int wait4(int pid, int *status, \ SYS_LINK = 9 // { int link(char *path, char *link); } SYS_UNLINK = 10 // { int unlink(char *path); } SYS_CHDIR = 12 // { int chdir(char *path); } SYS_FCHDIR = 13 // { int fchdir(int fd); } SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } SYS_CHMOD = 15 // { int chmod(char *path, int mode); } SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } SYS_OBREAK = 17 // { int obreak(char *nsize); } break \ SYS_GETPID = 20 // { pid_t getpid(void); } SYS_MOUNT = 21 // { int mount(char *type, char *path, \ SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } SYS_SETUID = 23 // { int setuid(uid_t uid); } SYS_GETUID = 24 // { uid_t getuid(void); } SYS_GETEUID = 25 // { uid_t geteuid(void); } SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, \ SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, \ SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, \ SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, \ SYS_ACCEPT = 30 // { int accept(int s, \ SYS_GETPEERNAME = 31 // { int getpeername(int fdes, \ SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, \ SYS_ACCESS = 33 // { int access(char *path, int amode); } SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); } SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); } SYS_SYNC = 36 // { int sync(void); } SYS_KILL = 37 // { int kill(int pid, int signum); } SYS_GETPPID = 39 // { pid_t getppid(void); } SYS_DUP = 41 // { int dup(u_int fd); } SYS_PIPE = 42 // { int pipe(void); } SYS_GETEGID = 43 // { gid_t getegid(void); } SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, \ SYS_GETGID = 47 // { gid_t getgid(void); } SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int \ SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } SYS_ACCT = 51 // { int acct(char *path); } SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, \ SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, \ SYS_REBOOT = 55 // { int reboot(int opt); } SYS_REVOKE = 56 // { int revoke(char *path); } SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, \ SYS_EXECVE = 59 // { int execve(char *fname, char **argv, \ SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args \ SYS_CHROOT = 61 // { int chroot(char *path); } SYS_MSYNC = 65 // { int msync(void *addr, size_t len, \ SYS_VFORK = 66 // { int vfork(void); } SYS_SBRK = 69 // { int sbrk(int incr); } SYS_SSTK = 70 // { int sstk(int incr); } SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise \ SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, \ SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, \ SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, \ SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, \ SYS_GETPGRP = 81 // { int getpgrp(void); } SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } SYS_SETITIMER = 83 // { int setitimer(u_int which, struct \ SYS_SWAPON = 85 // { int swapon(char *name); } SYS_GETITIMER = 86 // { int getitimer(u_int which, \ SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ SYS_FSYNC = 95 // { int fsync(int fd); } SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, \ SYS_SOCKET = 97 // { int socket(int domain, int type, \ SYS_CONNECT = 98 // { int connect(int s, caddr_t name, \ SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } SYS_BIND = 104 // { int bind(int s, caddr_t name, \ SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ SYS_LISTEN = 106 // { int listen(int s, int backlog); } SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ SYS_GETRUSAGE = 117 // { int getrusage(int who, \ SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, \ SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } SYS_RENAME = 128 // { int rename(char *from, char *to); } SYS_FLOCK = 131 // { int flock(int fd, int how); } SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, \ SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } SYS_RMDIR = 137 // { int rmdir(char *path); } SYS_UTIMES = 138 // { int utimes(char *path, \ SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ SYS_SETSID = 147 // { int setsid(void); } SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ SYS_LGETFH = 160 // { int lgetfh(char *fname, \ SYS_GETFH = 161 // { int getfh(char *fname, \ SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, \ SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, \ SYS_SETFIB = 175 // { int setfib(int fibnum); } SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } SYS_SETGID = 181 // { int setgid(gid_t gid); } SYS_SETEGID = 182 // { int setegid(gid_t egid); } SYS_SETEUID = 183 // { int seteuid(uid_t euid); } SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, \ SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, \ SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, \ SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, \ SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, \ SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, \ SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } SYS_UNDELETE = 205 // { int undelete(char *path); } SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } SYS_GETPGID = 207 // { int getpgid(pid_t pid); } SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ SYS_CLOCK_SETTIME = 233 // { int clock_settime( \ SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, \ SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, \ SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct \ SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( \ SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( \ SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,\ SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, \ SYS_RFORK = 251 // { int rfork(int flags); } SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, \ SYS_ISSETUGID = 253 // { int issetugid(void); } SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, \ SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } SYS_LUTIMES = 276 // { int lutimes(char *path, \ SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \ SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \ SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, \ SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, \ SYS_MODNEXT = 300 // { int modnext(int modid); } SYS_MODSTAT = 301 // { int modstat(int modid, \ SYS_MODFNEXT = 302 // { int modfnext(int modid); } SYS_MODFIND = 303 // { int modfind(const char *name); } SYS_KLDLOAD = 304 // { int kldload(const char *file); } SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } SYS_KLDFIND = 306 // { int kldfind(const char *file); } SYS_KLDNEXT = 307 // { int kldnext(int fileid); } SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct \ SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } SYS_GETSID = 310 // { int getsid(pid_t pid); } SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, \ SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, \ SYS_YIELD = 321 // { int yield(void); } SYS_MLOCKALL = 324 // { int mlockall(int how); } SYS_MUNLOCKALL = 325 // { int munlockall(void); } SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, \ SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct \ SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int \ SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } SYS_SCHED_YIELD = 331 // { int sched_yield (void); } SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, \ SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, \ SYS_JAIL = 338 // { int jail(struct jail *jail); } SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, \ SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, \ SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, \ SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, \ SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, \ SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, \ SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, \ SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( \ SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( \ SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \ SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \ SYS_KQUEUE = 362 // { int kqueue(void); } SYS_KEVENT = 363 // { int kevent(int fd, \ SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, \ SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, \ SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, \ SYS___SETUGID = 374 // { int __setugid(int flag); } SYS_EACCESS = 376 // { int eaccess(char *path, int amode); } SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, \ SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); } SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); } SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, \ SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, \ SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, \ SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, \ SYS_KENV = 390 // { int kenv(int what, const char *name, \ SYS_LCHFLAGS = 391 // { int lchflags(const char *path, \ SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, \ SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, \ SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, \ SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, \ SYS_STATFS = 396 // { int statfs(char *path, \ SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, \ SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, \ SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, \ SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, \ SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( \ SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( \ SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( \ SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, \ SYS_SIGACTION = 416 // { int sigaction(int sig, \ SYS_SIGRETURN = 417 // { int sigreturn( \ SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } SYS_SETCONTEXT = 422 // { int setcontext( \ SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, \ SYS_SWAPOFF = 424 // { int swapoff(const char *name); } SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, \ SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, \ SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, \ SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, \ SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, \ SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, \ SYS_THR_EXIT = 431 // { void thr_exit(long *state); } SYS_THR_SELF = 432 // { int thr_self(long *id); } SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, \ SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( \ SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( \ SYS_THR_SUSPEND = 442 // { int thr_suspend( \ SYS_THR_WAKE = 443 // { int thr_wake(long id); } SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } SYS_AUDIT = 445 // { int audit(const void *record, \ SYS_AUDITON = 446 // { int auditon(int cmd, void *data, \ SYS_GETAUID = 447 // { int getauid(uid_t *auid); } SYS_SETAUID = 448 // { int setauid(uid_t *auid); } SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( \ SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( \ SYS_AUDITCTL = 453 // { int auditctl(char *path); } SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, \ SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, \ SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, \ SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, \ SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, \ SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, \ SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, \ SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); } SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); } SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); } SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, \ SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); } SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); } SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \ SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, \ SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, \ SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, \ SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, \ SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, \ SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, \ SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, \ SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, \ SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, \ SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, \ SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, \ SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, \ SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, \ SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, \ SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, \ SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); } SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, \ SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, \ SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); } SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); } SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); } SYS___CAP_RIGHTS_GET = 515 // { int __cap_rights_get(int version, \ SYS_CAP_ENTER = 516 // { int cap_enter(void); } SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); } SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); } SYS_PDKILL = 519 // { int pdkill(int fd, int signum); } SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); } SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, \ SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, \ SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); } SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, \ SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, \ SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, \ SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, \ SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, \ SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, \ SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, \ SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, \ SYS_CAP_RIGHTS_LIMIT = 533 // { int cap_rights_limit(int fd, \ SYS_CAP_IOCTLS_LIMIT = 534 // { int cap_ioctls_limit(int fd, \ SYS_CAP_IOCTLS_GET = 535 // { ssize_t cap_ioctls_get(int fd, \ SYS_CAP_FCNTLS_LIMIT = 536 // { int cap_fcntls_limit(int fd, \ SYS_CAP_FCNTLS_GET = 537 // { int cap_fcntls_get(int fd, \ SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, \ SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, \ SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, \ SYS_ACCEPT4 = 541 // { int accept4(int s, \ SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); } SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, \ SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \ SYS_FUTIMENS = 546 // { int futimens(int fd, \ SYS_UTIMENSAT = 547 // { int utimensat(int fd, \ ) ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go ================================================ // mksysnum_freebsd.pl // Code generated by the command above; see README.md. DO NOT EDIT. // +build arm,freebsd package unix const ( // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int SYS_EXIT = 1 // { void sys_exit(int rval); } exit \ SYS_FORK = 2 // { int fork(void); } SYS_READ = 3 // { ssize_t read(int fd, void *buf, \ SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, \ SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } SYS_CLOSE = 6 // { int close(int fd); } SYS_WAIT4 = 7 // { int wait4(int pid, int *status, \ SYS_LINK = 9 // { int link(char *path, char *link); } SYS_UNLINK = 10 // { int unlink(char *path); } SYS_CHDIR = 12 // { int chdir(char *path); } SYS_FCHDIR = 13 // { int fchdir(int fd); } SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } SYS_CHMOD = 15 // { int chmod(char *path, int mode); } SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } SYS_OBREAK = 17 // { int obreak(char *nsize); } break \ SYS_GETPID = 20 // { pid_t getpid(void); } SYS_MOUNT = 21 // { int mount(char *type, char *path, \ SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } SYS_SETUID = 23 // { int setuid(uid_t uid); } SYS_GETUID = 24 // { uid_t getuid(void); } SYS_GETEUID = 25 // { uid_t geteuid(void); } SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, \ SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, \ SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, \ SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, \ SYS_ACCEPT = 30 // { int accept(int s, \ SYS_GETPEERNAME = 31 // { int getpeername(int fdes, \ SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, \ SYS_ACCESS = 33 // { int access(char *path, int amode); } SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); } SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); } SYS_SYNC = 36 // { int sync(void); } SYS_KILL = 37 // { int kill(int pid, int signum); } SYS_GETPPID = 39 // { pid_t getppid(void); } SYS_DUP = 41 // { int dup(u_int fd); } SYS_PIPE = 42 // { int pipe(void); } SYS_GETEGID = 43 // { gid_t getegid(void); } SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, \ SYS_GETGID = 47 // { gid_t getgid(void); } SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int \ SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } SYS_ACCT = 51 // { int acct(char *path); } SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, \ SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, \ SYS_REBOOT = 55 // { int reboot(int opt); } SYS_REVOKE = 56 // { int revoke(char *path); } SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, \ SYS_EXECVE = 59 // { int execve(char *fname, char **argv, \ SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args \ SYS_CHROOT = 61 // { int chroot(char *path); } SYS_MSYNC = 65 // { int msync(void *addr, size_t len, \ SYS_VFORK = 66 // { int vfork(void); } SYS_SBRK = 69 // { int sbrk(int incr); } SYS_SSTK = 70 // { int sstk(int incr); } SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise \ SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, \ SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, \ SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, \ SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, \ SYS_GETPGRP = 81 // { int getpgrp(void); } SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } SYS_SETITIMER = 83 // { int setitimer(u_int which, struct \ SYS_SWAPON = 85 // { int swapon(char *name); } SYS_GETITIMER = 86 // { int getitimer(u_int which, \ SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ SYS_FSYNC = 95 // { int fsync(int fd); } SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, \ SYS_SOCKET = 97 // { int socket(int domain, int type, \ SYS_CONNECT = 98 // { int connect(int s, caddr_t name, \ SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } SYS_BIND = 104 // { int bind(int s, caddr_t name, \ SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ SYS_LISTEN = 106 // { int listen(int s, int backlog); } SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ SYS_GETRUSAGE = 117 // { int getrusage(int who, \ SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, \ SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } SYS_RENAME = 128 // { int rename(char *from, char *to); } SYS_FLOCK = 131 // { int flock(int fd, int how); } SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, \ SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } SYS_RMDIR = 137 // { int rmdir(char *path); } SYS_UTIMES = 138 // { int utimes(char *path, \ SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ SYS_SETSID = 147 // { int setsid(void); } SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ SYS_LGETFH = 160 // { int lgetfh(char *fname, \ SYS_GETFH = 161 // { int getfh(char *fname, \ SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, \ SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, \ SYS_SETFIB = 175 // { int setfib(int fibnum); } SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } SYS_SETGID = 181 // { int setgid(gid_t gid); } SYS_SETEGID = 182 // { int setegid(gid_t egid); } SYS_SETEUID = 183 // { int seteuid(uid_t euid); } SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, \ SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, \ SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, \ SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, \ SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, \ SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, \ SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } SYS_UNDELETE = 205 // { int undelete(char *path); } SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } SYS_GETPGID = 207 // { int getpgid(pid_t pid); } SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ SYS_CLOCK_SETTIME = 233 // { int clock_settime( \ SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, \ SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, \ SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct \ SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( \ SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( \ SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,\ SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, \ SYS_RFORK = 251 // { int rfork(int flags); } SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, \ SYS_ISSETUGID = 253 // { int issetugid(void); } SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, \ SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } SYS_LUTIMES = 276 // { int lutimes(char *path, \ SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \ SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \ SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, \ SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, \ SYS_MODNEXT = 300 // { int modnext(int modid); } SYS_MODSTAT = 301 // { int modstat(int modid, \ SYS_MODFNEXT = 302 // { int modfnext(int modid); } SYS_MODFIND = 303 // { int modfind(const char *name); } SYS_KLDLOAD = 304 // { int kldload(const char *file); } SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } SYS_KLDFIND = 306 // { int kldfind(const char *file); } SYS_KLDNEXT = 307 // { int kldnext(int fileid); } SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct \ SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } SYS_GETSID = 310 // { int getsid(pid_t pid); } SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, \ SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, \ SYS_YIELD = 321 // { int yield(void); } SYS_MLOCKALL = 324 // { int mlockall(int how); } SYS_MUNLOCKALL = 325 // { int munlockall(void); } SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, \ SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct \ SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int \ SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } SYS_SCHED_YIELD = 331 // { int sched_yield (void); } SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, \ SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, \ SYS_JAIL = 338 // { int jail(struct jail *jail); } SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, \ SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, \ SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, \ SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, \ SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, \ SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, \ SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, \ SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( \ SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( \ SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \ SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \ SYS_KQUEUE = 362 // { int kqueue(void); } SYS_KEVENT = 363 // { int kevent(int fd, \ SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, \ SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, \ SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, \ SYS___SETUGID = 374 // { int __setugid(int flag); } SYS_EACCESS = 376 // { int eaccess(char *path, int amode); } SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, \ SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); } SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); } SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, \ SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, \ SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, \ SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, \ SYS_KENV = 390 // { int kenv(int what, const char *name, \ SYS_LCHFLAGS = 391 // { int lchflags(const char *path, \ SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, \ SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, \ SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, \ SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, \ SYS_STATFS = 396 // { int statfs(char *path, \ SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, \ SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, \ SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, \ SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, \ SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( \ SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( \ SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( \ SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, \ SYS_SIGACTION = 416 // { int sigaction(int sig, \ SYS_SIGRETURN = 417 // { int sigreturn( \ SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } SYS_SETCONTEXT = 422 // { int setcontext( \ SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, \ SYS_SWAPOFF = 424 // { int swapoff(const char *name); } SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, \ SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, \ SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, \ SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, \ SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, \ SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, \ SYS_THR_EXIT = 431 // { void thr_exit(long *state); } SYS_THR_SELF = 432 // { int thr_self(long *id); } SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, \ SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( \ SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( \ SYS_THR_SUSPEND = 442 // { int thr_suspend( \ SYS_THR_WAKE = 443 // { int thr_wake(long id); } SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } SYS_AUDIT = 445 // { int audit(const void *record, \ SYS_AUDITON = 446 // { int auditon(int cmd, void *data, \ SYS_GETAUID = 447 // { int getauid(uid_t *auid); } SYS_SETAUID = 448 // { int setauid(uid_t *auid); } SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( \ SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( \ SYS_AUDITCTL = 453 // { int auditctl(char *path); } SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, \ SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, \ SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, \ SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, \ SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, \ SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, \ SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, \ SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); } SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); } SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); } SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, \ SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); } SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); } SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \ SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, \ SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, \ SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, \ SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, \ SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, \ SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, \ SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, \ SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, \ SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, \ SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, \ SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, \ SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, \ SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, \ SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, \ SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, \ SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); } SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, \ SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, \ SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); } SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); } SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); } SYS___CAP_RIGHTS_GET = 515 // { int __cap_rights_get(int version, \ SYS_CAP_ENTER = 516 // { int cap_enter(void); } SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); } SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); } SYS_PDKILL = 519 // { int pdkill(int fd, int signum); } SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); } SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, \ SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, \ SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); } SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, \ SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, \ SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, \ SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, \ SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, \ SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, \ SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, \ SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, \ SYS_CAP_RIGHTS_LIMIT = 533 // { int cap_rights_limit(int fd, \ SYS_CAP_IOCTLS_LIMIT = 534 // { int cap_ioctls_limit(int fd, \ SYS_CAP_IOCTLS_GET = 535 // { ssize_t cap_ioctls_get(int fd, \ SYS_CAP_FCNTLS_LIMIT = 536 // { int cap_fcntls_limit(int fd, \ SYS_CAP_FCNTLS_GET = 537 // { int cap_fcntls_get(int fd, \ SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, \ SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, \ SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, \ SYS_ACCEPT4 = 541 // { int accept4(int s, \ SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); } SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, \ SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \ SYS_FUTIMENS = 546 // { int futimens(int fd, \ SYS_UTIMENSAT = 547 // { int utimensat(int fd, \ ) ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_linux_386.go ================================================ // linux/mksysnum.pl -Wall -Werror -static -I/tmp/include -m32 /tmp/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. // +build 386,linux package unix const ( SYS_RESTART_SYSCALL = 0 SYS_EXIT = 1 SYS_FORK = 2 SYS_READ = 3 SYS_WRITE = 4 SYS_OPEN = 5 SYS_CLOSE = 6 SYS_WAITPID = 7 SYS_CREAT = 8 SYS_LINK = 9 SYS_UNLINK = 10 SYS_EXECVE = 11 SYS_CHDIR = 12 SYS_TIME = 13 SYS_MKNOD = 14 SYS_CHMOD = 15 SYS_LCHOWN = 16 SYS_BREAK = 17 SYS_OLDSTAT = 18 SYS_LSEEK = 19 SYS_GETPID = 20 SYS_MOUNT = 21 SYS_UMOUNT = 22 SYS_SETUID = 23 SYS_GETUID = 24 SYS_STIME = 25 SYS_PTRACE = 26 SYS_ALARM = 27 SYS_OLDFSTAT = 28 SYS_PAUSE = 29 SYS_UTIME = 30 SYS_STTY = 31 SYS_GTTY = 32 SYS_ACCESS = 33 SYS_NICE = 34 SYS_FTIME = 35 SYS_SYNC = 36 SYS_KILL = 37 SYS_RENAME = 38 SYS_MKDIR = 39 SYS_RMDIR = 40 SYS_DUP = 41 SYS_PIPE = 42 SYS_TIMES = 43 SYS_PROF = 44 SYS_BRK = 45 SYS_SETGID = 46 SYS_GETGID = 47 SYS_SIGNAL = 48 SYS_GETEUID = 49 SYS_GETEGID = 50 SYS_ACCT = 51 SYS_UMOUNT2 = 52 SYS_LOCK = 53 SYS_IOCTL = 54 SYS_FCNTL = 55 SYS_MPX = 56 SYS_SETPGID = 57 SYS_ULIMIT = 58 SYS_OLDOLDUNAME = 59 SYS_UMASK = 60 SYS_CHROOT = 61 SYS_USTAT = 62 SYS_DUP2 = 63 SYS_GETPPID = 64 SYS_GETPGRP = 65 SYS_SETSID = 66 SYS_SIGACTION = 67 SYS_SGETMASK = 68 SYS_SSETMASK = 69 SYS_SETREUID = 70 SYS_SETREGID = 71 SYS_SIGSUSPEND = 72 SYS_SIGPENDING = 73 SYS_SETHOSTNAME = 74 SYS_SETRLIMIT = 75 SYS_GETRLIMIT = 76 SYS_GETRUSAGE = 77 SYS_GETTIMEOFDAY = 78 SYS_SETTIMEOFDAY = 79 SYS_GETGROUPS = 80 SYS_SETGROUPS = 81 SYS_SELECT = 82 SYS_SYMLINK = 83 SYS_OLDLSTAT = 84 SYS_READLINK = 85 SYS_USELIB = 86 SYS_SWAPON = 87 SYS_REBOOT = 88 SYS_READDIR = 89 SYS_MMAP = 90 SYS_MUNMAP = 91 SYS_TRUNCATE = 92 SYS_FTRUNCATE = 93 SYS_FCHMOD = 94 SYS_FCHOWN = 95 SYS_GETPRIORITY = 96 SYS_SETPRIORITY = 97 SYS_PROFIL = 98 SYS_STATFS = 99 SYS_FSTATFS = 100 SYS_IOPERM = 101 SYS_SOCKETCALL = 102 SYS_SYSLOG = 103 SYS_SETITIMER = 104 SYS_GETITIMER = 105 SYS_STAT = 106 SYS_LSTAT = 107 SYS_FSTAT = 108 SYS_OLDUNAME = 109 SYS_IOPL = 110 SYS_VHANGUP = 111 SYS_IDLE = 112 SYS_VM86OLD = 113 SYS_WAIT4 = 114 SYS_SWAPOFF = 115 SYS_SYSINFO = 116 SYS_IPC = 117 SYS_FSYNC = 118 SYS_SIGRETURN = 119 SYS_CLONE = 120 SYS_SETDOMAINNAME = 121 SYS_UNAME = 122 SYS_MODIFY_LDT = 123 SYS_ADJTIMEX = 124 SYS_MPROTECT = 125 SYS_SIGPROCMASK = 126 SYS_CREATE_MODULE = 127 SYS_INIT_MODULE = 128 SYS_DELETE_MODULE = 129 SYS_GET_KERNEL_SYMS = 130 SYS_QUOTACTL = 131 SYS_GETPGID = 132 SYS_FCHDIR = 133 SYS_BDFLUSH = 134 SYS_SYSFS = 135 SYS_PERSONALITY = 136 SYS_AFS_SYSCALL = 137 SYS_SETFSUID = 138 SYS_SETFSGID = 139 SYS__LLSEEK = 140 SYS_GETDENTS = 141 SYS__NEWSELECT = 142 SYS_FLOCK = 143 SYS_MSYNC = 144 SYS_READV = 145 SYS_WRITEV = 146 SYS_GETSID = 147 SYS_FDATASYNC = 148 SYS__SYSCTL = 149 SYS_MLOCK = 150 SYS_MUNLOCK = 151 SYS_MLOCKALL = 152 SYS_MUNLOCKALL = 153 SYS_SCHED_SETPARAM = 154 SYS_SCHED_GETPARAM = 155 SYS_SCHED_SETSCHEDULER = 156 SYS_SCHED_GETSCHEDULER = 157 SYS_SCHED_YIELD = 158 SYS_SCHED_GET_PRIORITY_MAX = 159 SYS_SCHED_GET_PRIORITY_MIN = 160 SYS_SCHED_RR_GET_INTERVAL = 161 SYS_NANOSLEEP = 162 SYS_MREMAP = 163 SYS_SETRESUID = 164 SYS_GETRESUID = 165 SYS_VM86 = 166 SYS_QUERY_MODULE = 167 SYS_POLL = 168 SYS_NFSSERVCTL = 169 SYS_SETRESGID = 170 SYS_GETRESGID = 171 SYS_PRCTL = 172 SYS_RT_SIGRETURN = 173 SYS_RT_SIGACTION = 174 SYS_RT_SIGPROCMASK = 175 SYS_RT_SIGPENDING = 176 SYS_RT_SIGTIMEDWAIT = 177 SYS_RT_SIGQUEUEINFO = 178 SYS_RT_SIGSUSPEND = 179 SYS_PREAD64 = 180 SYS_PWRITE64 = 181 SYS_CHOWN = 182 SYS_GETCWD = 183 SYS_CAPGET = 184 SYS_CAPSET = 185 SYS_SIGALTSTACK = 186 SYS_SENDFILE = 187 SYS_GETPMSG = 188 SYS_PUTPMSG = 189 SYS_VFORK = 190 SYS_UGETRLIMIT = 191 SYS_MMAP2 = 192 SYS_TRUNCATE64 = 193 SYS_FTRUNCATE64 = 194 SYS_STAT64 = 195 SYS_LSTAT64 = 196 SYS_FSTAT64 = 197 SYS_LCHOWN32 = 198 SYS_GETUID32 = 199 SYS_GETGID32 = 200 SYS_GETEUID32 = 201 SYS_GETEGID32 = 202 SYS_SETREUID32 = 203 SYS_SETREGID32 = 204 SYS_GETGROUPS32 = 205 SYS_SETGROUPS32 = 206 SYS_FCHOWN32 = 207 SYS_SETRESUID32 = 208 SYS_GETRESUID32 = 209 SYS_SETRESGID32 = 210 SYS_GETRESGID32 = 211 SYS_CHOWN32 = 212 SYS_SETUID32 = 213 SYS_SETGID32 = 214 SYS_SETFSUID32 = 215 SYS_SETFSGID32 = 216 SYS_PIVOT_ROOT = 217 SYS_MINCORE = 218 SYS_MADVISE = 219 SYS_GETDENTS64 = 220 SYS_FCNTL64 = 221 SYS_GETTID = 224 SYS_READAHEAD = 225 SYS_SETXATTR = 226 SYS_LSETXATTR = 227 SYS_FSETXATTR = 228 SYS_GETXATTR = 229 SYS_LGETXATTR = 230 SYS_FGETXATTR = 231 SYS_LISTXATTR = 232 SYS_LLISTXATTR = 233 SYS_FLISTXATTR = 234 SYS_REMOVEXATTR = 235 SYS_LREMOVEXATTR = 236 SYS_FREMOVEXATTR = 237 SYS_TKILL = 238 SYS_SENDFILE64 = 239 SYS_FUTEX = 240 SYS_SCHED_SETAFFINITY = 241 SYS_SCHED_GETAFFINITY = 242 SYS_SET_THREAD_AREA = 243 SYS_GET_THREAD_AREA = 244 SYS_IO_SETUP = 245 SYS_IO_DESTROY = 246 SYS_IO_GETEVENTS = 247 SYS_IO_SUBMIT = 248 SYS_IO_CANCEL = 249 SYS_FADVISE64 = 250 SYS_EXIT_GROUP = 252 SYS_LOOKUP_DCOOKIE = 253 SYS_EPOLL_CREATE = 254 SYS_EPOLL_CTL = 255 SYS_EPOLL_WAIT = 256 SYS_REMAP_FILE_PAGES = 257 SYS_SET_TID_ADDRESS = 258 SYS_TIMER_CREATE = 259 SYS_TIMER_SETTIME = 260 SYS_TIMER_GETTIME = 261 SYS_TIMER_GETOVERRUN = 262 SYS_TIMER_DELETE = 263 SYS_CLOCK_SETTIME = 264 SYS_CLOCK_GETTIME = 265 SYS_CLOCK_GETRES = 266 SYS_CLOCK_NANOSLEEP = 267 SYS_STATFS64 = 268 SYS_FSTATFS64 = 269 SYS_TGKILL = 270 SYS_UTIMES = 271 SYS_FADVISE64_64 = 272 SYS_VSERVER = 273 SYS_MBIND = 274 SYS_GET_MEMPOLICY = 275 SYS_SET_MEMPOLICY = 276 SYS_MQ_OPEN = 277 SYS_MQ_UNLINK = 278 SYS_MQ_TIMEDSEND = 279 SYS_MQ_TIMEDRECEIVE = 280 SYS_MQ_NOTIFY = 281 SYS_MQ_GETSETATTR = 282 SYS_KEXEC_LOAD = 283 SYS_WAITID = 284 SYS_ADD_KEY = 286 SYS_REQUEST_KEY = 287 SYS_KEYCTL = 288 SYS_IOPRIO_SET = 289 SYS_IOPRIO_GET = 290 SYS_INOTIFY_INIT = 291 SYS_INOTIFY_ADD_WATCH = 292 SYS_INOTIFY_RM_WATCH = 293 SYS_MIGRATE_PAGES = 294 SYS_OPENAT = 295 SYS_MKDIRAT = 296 SYS_MKNODAT = 297 SYS_FCHOWNAT = 298 SYS_FUTIMESAT = 299 SYS_FSTATAT64 = 300 SYS_UNLINKAT = 301 SYS_RENAMEAT = 302 SYS_LINKAT = 303 SYS_SYMLINKAT = 304 SYS_READLINKAT = 305 SYS_FCHMODAT = 306 SYS_FACCESSAT = 307 SYS_PSELECT6 = 308 SYS_PPOLL = 309 SYS_UNSHARE = 310 SYS_SET_ROBUST_LIST = 311 SYS_GET_ROBUST_LIST = 312 SYS_SPLICE = 313 SYS_SYNC_FILE_RANGE = 314 SYS_TEE = 315 SYS_VMSPLICE = 316 SYS_MOVE_PAGES = 317 SYS_GETCPU = 318 SYS_EPOLL_PWAIT = 319 SYS_UTIMENSAT = 320 SYS_SIGNALFD = 321 SYS_TIMERFD_CREATE = 322 SYS_EVENTFD = 323 SYS_FALLOCATE = 324 SYS_TIMERFD_SETTIME = 325 SYS_TIMERFD_GETTIME = 326 SYS_SIGNALFD4 = 327 SYS_EVENTFD2 = 328 SYS_EPOLL_CREATE1 = 329 SYS_DUP3 = 330 SYS_PIPE2 = 331 SYS_INOTIFY_INIT1 = 332 SYS_PREADV = 333 SYS_PWRITEV = 334 SYS_RT_TGSIGQUEUEINFO = 335 SYS_PERF_EVENT_OPEN = 336 SYS_RECVMMSG = 337 SYS_FANOTIFY_INIT = 338 SYS_FANOTIFY_MARK = 339 SYS_PRLIMIT64 = 340 SYS_NAME_TO_HANDLE_AT = 341 SYS_OPEN_BY_HANDLE_AT = 342 SYS_CLOCK_ADJTIME = 343 SYS_SYNCFS = 344 SYS_SENDMMSG = 345 SYS_SETNS = 346 SYS_PROCESS_VM_READV = 347 SYS_PROCESS_VM_WRITEV = 348 SYS_KCMP = 349 SYS_FINIT_MODULE = 350 SYS_SCHED_SETATTR = 351 SYS_SCHED_GETATTR = 352 SYS_RENAMEAT2 = 353 SYS_SECCOMP = 354 SYS_GETRANDOM = 355 SYS_MEMFD_CREATE = 356 SYS_BPF = 357 SYS_EXECVEAT = 358 SYS_SOCKET = 359 SYS_SOCKETPAIR = 360 SYS_BIND = 361 SYS_CONNECT = 362 SYS_LISTEN = 363 SYS_ACCEPT4 = 364 SYS_GETSOCKOPT = 365 SYS_SETSOCKOPT = 366 SYS_GETSOCKNAME = 367 SYS_GETPEERNAME = 368 SYS_SENDTO = 369 SYS_SENDMSG = 370 SYS_RECVFROM = 371 SYS_RECVMSG = 372 SYS_SHUTDOWN = 373 SYS_USERFAULTFD = 374 SYS_MEMBARRIER = 375 SYS_MLOCK2 = 376 SYS_COPY_FILE_RANGE = 377 SYS_PREADV2 = 378 SYS_PWRITEV2 = 379 SYS_PKEY_MPROTECT = 380 SYS_PKEY_ALLOC = 381 SYS_PKEY_FREE = 382 SYS_STATX = 383 SYS_ARCH_PRCTL = 384 ) ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go ================================================ // linux/mksysnum.pl -Wall -Werror -static -I/tmp/include -m64 /tmp/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,linux package unix const ( SYS_READ = 0 SYS_WRITE = 1 SYS_OPEN = 2 SYS_CLOSE = 3 SYS_STAT = 4 SYS_FSTAT = 5 SYS_LSTAT = 6 SYS_POLL = 7 SYS_LSEEK = 8 SYS_MMAP = 9 SYS_MPROTECT = 10 SYS_MUNMAP = 11 SYS_BRK = 12 SYS_RT_SIGACTION = 13 SYS_RT_SIGPROCMASK = 14 SYS_RT_SIGRETURN = 15 SYS_IOCTL = 16 SYS_PREAD64 = 17 SYS_PWRITE64 = 18 SYS_READV = 19 SYS_WRITEV = 20 SYS_ACCESS = 21 SYS_PIPE = 22 SYS_SELECT = 23 SYS_SCHED_YIELD = 24 SYS_MREMAP = 25 SYS_MSYNC = 26 SYS_MINCORE = 27 SYS_MADVISE = 28 SYS_SHMGET = 29 SYS_SHMAT = 30 SYS_SHMCTL = 31 SYS_DUP = 32 SYS_DUP2 = 33 SYS_PAUSE = 34 SYS_NANOSLEEP = 35 SYS_GETITIMER = 36 SYS_ALARM = 37 SYS_SETITIMER = 38 SYS_GETPID = 39 SYS_SENDFILE = 40 SYS_SOCKET = 41 SYS_CONNECT = 42 SYS_ACCEPT = 43 SYS_SENDTO = 44 SYS_RECVFROM = 45 SYS_SENDMSG = 46 SYS_RECVMSG = 47 SYS_SHUTDOWN = 48 SYS_BIND = 49 SYS_LISTEN = 50 SYS_GETSOCKNAME = 51 SYS_GETPEERNAME = 52 SYS_SOCKETPAIR = 53 SYS_SETSOCKOPT = 54 SYS_GETSOCKOPT = 55 SYS_CLONE = 56 SYS_FORK = 57 SYS_VFORK = 58 SYS_EXECVE = 59 SYS_EXIT = 60 SYS_WAIT4 = 61 SYS_KILL = 62 SYS_UNAME = 63 SYS_SEMGET = 64 SYS_SEMOP = 65 SYS_SEMCTL = 66 SYS_SHMDT = 67 SYS_MSGGET = 68 SYS_MSGSND = 69 SYS_MSGRCV = 70 SYS_MSGCTL = 71 SYS_FCNTL = 72 SYS_FLOCK = 73 SYS_FSYNC = 74 SYS_FDATASYNC = 75 SYS_TRUNCATE = 76 SYS_FTRUNCATE = 77 SYS_GETDENTS = 78 SYS_GETCWD = 79 SYS_CHDIR = 80 SYS_FCHDIR = 81 SYS_RENAME = 82 SYS_MKDIR = 83 SYS_RMDIR = 84 SYS_CREAT = 85 SYS_LINK = 86 SYS_UNLINK = 87 SYS_SYMLINK = 88 SYS_READLINK = 89 SYS_CHMOD = 90 SYS_FCHMOD = 91 SYS_CHOWN = 92 SYS_FCHOWN = 93 SYS_LCHOWN = 94 SYS_UMASK = 95 SYS_GETTIMEOFDAY = 96 SYS_GETRLIMIT = 97 SYS_GETRUSAGE = 98 SYS_SYSINFO = 99 SYS_TIMES = 100 SYS_PTRACE = 101 SYS_GETUID = 102 SYS_SYSLOG = 103 SYS_GETGID = 104 SYS_SETUID = 105 SYS_SETGID = 106 SYS_GETEUID = 107 SYS_GETEGID = 108 SYS_SETPGID = 109 SYS_GETPPID = 110 SYS_GETPGRP = 111 SYS_SETSID = 112 SYS_SETREUID = 113 SYS_SETREGID = 114 SYS_GETGROUPS = 115 SYS_SETGROUPS = 116 SYS_SETRESUID = 117 SYS_GETRESUID = 118 SYS_SETRESGID = 119 SYS_GETRESGID = 120 SYS_GETPGID = 121 SYS_SETFSUID = 122 SYS_SETFSGID = 123 SYS_GETSID = 124 SYS_CAPGET = 125 SYS_CAPSET = 126 SYS_RT_SIGPENDING = 127 SYS_RT_SIGTIMEDWAIT = 128 SYS_RT_SIGQUEUEINFO = 129 SYS_RT_SIGSUSPEND = 130 SYS_SIGALTSTACK = 131 SYS_UTIME = 132 SYS_MKNOD = 133 SYS_USELIB = 134 SYS_PERSONALITY = 135 SYS_USTAT = 136 SYS_STATFS = 137 SYS_FSTATFS = 138 SYS_SYSFS = 139 SYS_GETPRIORITY = 140 SYS_SETPRIORITY = 141 SYS_SCHED_SETPARAM = 142 SYS_SCHED_GETPARAM = 143 SYS_SCHED_SETSCHEDULER = 144 SYS_SCHED_GETSCHEDULER = 145 SYS_SCHED_GET_PRIORITY_MAX = 146 SYS_SCHED_GET_PRIORITY_MIN = 147 SYS_SCHED_RR_GET_INTERVAL = 148 SYS_MLOCK = 149 SYS_MUNLOCK = 150 SYS_MLOCKALL = 151 SYS_MUNLOCKALL = 152 SYS_VHANGUP = 153 SYS_MODIFY_LDT = 154 SYS_PIVOT_ROOT = 155 SYS__SYSCTL = 156 SYS_PRCTL = 157 SYS_ARCH_PRCTL = 158 SYS_ADJTIMEX = 159 SYS_SETRLIMIT = 160 SYS_CHROOT = 161 SYS_SYNC = 162 SYS_ACCT = 163 SYS_SETTIMEOFDAY = 164 SYS_MOUNT = 165 SYS_UMOUNT2 = 166 SYS_SWAPON = 167 SYS_SWAPOFF = 168 SYS_REBOOT = 169 SYS_SETHOSTNAME = 170 SYS_SETDOMAINNAME = 171 SYS_IOPL = 172 SYS_IOPERM = 173 SYS_CREATE_MODULE = 174 SYS_INIT_MODULE = 175 SYS_DELETE_MODULE = 176 SYS_GET_KERNEL_SYMS = 177 SYS_QUERY_MODULE = 178 SYS_QUOTACTL = 179 SYS_NFSSERVCTL = 180 SYS_GETPMSG = 181 SYS_PUTPMSG = 182 SYS_AFS_SYSCALL = 183 SYS_TUXCALL = 184 SYS_SECURITY = 185 SYS_GETTID = 186 SYS_READAHEAD = 187 SYS_SETXATTR = 188 SYS_LSETXATTR = 189 SYS_FSETXATTR = 190 SYS_GETXATTR = 191 SYS_LGETXATTR = 192 SYS_FGETXATTR = 193 SYS_LISTXATTR = 194 SYS_LLISTXATTR = 195 SYS_FLISTXATTR = 196 SYS_REMOVEXATTR = 197 SYS_LREMOVEXATTR = 198 SYS_FREMOVEXATTR = 199 SYS_TKILL = 200 SYS_TIME = 201 SYS_FUTEX = 202 SYS_SCHED_SETAFFINITY = 203 SYS_SCHED_GETAFFINITY = 204 SYS_SET_THREAD_AREA = 205 SYS_IO_SETUP = 206 SYS_IO_DESTROY = 207 SYS_IO_GETEVENTS = 208 SYS_IO_SUBMIT = 209 SYS_IO_CANCEL = 210 SYS_GET_THREAD_AREA = 211 SYS_LOOKUP_DCOOKIE = 212 SYS_EPOLL_CREATE = 213 SYS_EPOLL_CTL_OLD = 214 SYS_EPOLL_WAIT_OLD = 215 SYS_REMAP_FILE_PAGES = 216 SYS_GETDENTS64 = 217 SYS_SET_TID_ADDRESS = 218 SYS_RESTART_SYSCALL = 219 SYS_SEMTIMEDOP = 220 SYS_FADVISE64 = 221 SYS_TIMER_CREATE = 222 SYS_TIMER_SETTIME = 223 SYS_TIMER_GETTIME = 224 SYS_TIMER_GETOVERRUN = 225 SYS_TIMER_DELETE = 226 SYS_CLOCK_SETTIME = 227 SYS_CLOCK_GETTIME = 228 SYS_CLOCK_GETRES = 229 SYS_CLOCK_NANOSLEEP = 230 SYS_EXIT_GROUP = 231 SYS_EPOLL_WAIT = 232 SYS_EPOLL_CTL = 233 SYS_TGKILL = 234 SYS_UTIMES = 235 SYS_VSERVER = 236 SYS_MBIND = 237 SYS_SET_MEMPOLICY = 238 SYS_GET_MEMPOLICY = 239 SYS_MQ_OPEN = 240 SYS_MQ_UNLINK = 241 SYS_MQ_TIMEDSEND = 242 SYS_MQ_TIMEDRECEIVE = 243 SYS_MQ_NOTIFY = 244 SYS_MQ_GETSETATTR = 245 SYS_KEXEC_LOAD = 246 SYS_WAITID = 247 SYS_ADD_KEY = 248 SYS_REQUEST_KEY = 249 SYS_KEYCTL = 250 SYS_IOPRIO_SET = 251 SYS_IOPRIO_GET = 252 SYS_INOTIFY_INIT = 253 SYS_INOTIFY_ADD_WATCH = 254 SYS_INOTIFY_RM_WATCH = 255 SYS_MIGRATE_PAGES = 256 SYS_OPENAT = 257 SYS_MKDIRAT = 258 SYS_MKNODAT = 259 SYS_FCHOWNAT = 260 SYS_FUTIMESAT = 261 SYS_NEWFSTATAT = 262 SYS_UNLINKAT = 263 SYS_RENAMEAT = 264 SYS_LINKAT = 265 SYS_SYMLINKAT = 266 SYS_READLINKAT = 267 SYS_FCHMODAT = 268 SYS_FACCESSAT = 269 SYS_PSELECT6 = 270 SYS_PPOLL = 271 SYS_UNSHARE = 272 SYS_SET_ROBUST_LIST = 273 SYS_GET_ROBUST_LIST = 274 SYS_SPLICE = 275 SYS_TEE = 276 SYS_SYNC_FILE_RANGE = 277 SYS_VMSPLICE = 278 SYS_MOVE_PAGES = 279 SYS_UTIMENSAT = 280 SYS_EPOLL_PWAIT = 281 SYS_SIGNALFD = 282 SYS_TIMERFD_CREATE = 283 SYS_EVENTFD = 284 SYS_FALLOCATE = 285 SYS_TIMERFD_SETTIME = 286 SYS_TIMERFD_GETTIME = 287 SYS_ACCEPT4 = 288 SYS_SIGNALFD4 = 289 SYS_EVENTFD2 = 290 SYS_EPOLL_CREATE1 = 291 SYS_DUP3 = 292 SYS_PIPE2 = 293 SYS_INOTIFY_INIT1 = 294 SYS_PREADV = 295 SYS_PWRITEV = 296 SYS_RT_TGSIGQUEUEINFO = 297 SYS_PERF_EVENT_OPEN = 298 SYS_RECVMMSG = 299 SYS_FANOTIFY_INIT = 300 SYS_FANOTIFY_MARK = 301 SYS_PRLIMIT64 = 302 SYS_NAME_TO_HANDLE_AT = 303 SYS_OPEN_BY_HANDLE_AT = 304 SYS_CLOCK_ADJTIME = 305 SYS_SYNCFS = 306 SYS_SENDMMSG = 307 SYS_SETNS = 308 SYS_GETCPU = 309 SYS_PROCESS_VM_READV = 310 SYS_PROCESS_VM_WRITEV = 311 SYS_KCMP = 312 SYS_FINIT_MODULE = 313 SYS_SCHED_SETATTR = 314 SYS_SCHED_GETATTR = 315 SYS_RENAMEAT2 = 316 SYS_SECCOMP = 317 SYS_GETRANDOM = 318 SYS_MEMFD_CREATE = 319 SYS_KEXEC_FILE_LOAD = 320 SYS_BPF = 321 SYS_EXECVEAT = 322 SYS_USERFAULTFD = 323 SYS_MEMBARRIER = 324 SYS_MLOCK2 = 325 SYS_COPY_FILE_RANGE = 326 SYS_PREADV2 = 327 SYS_PWRITEV2 = 328 SYS_PKEY_MPROTECT = 329 SYS_PKEY_ALLOC = 330 SYS_PKEY_FREE = 331 SYS_STATX = 332 ) ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go ================================================ // linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. // +build arm,linux package unix const ( SYS_RESTART_SYSCALL = 0 SYS_EXIT = 1 SYS_FORK = 2 SYS_READ = 3 SYS_WRITE = 4 SYS_OPEN = 5 SYS_CLOSE = 6 SYS_CREAT = 8 SYS_LINK = 9 SYS_UNLINK = 10 SYS_EXECVE = 11 SYS_CHDIR = 12 SYS_MKNOD = 14 SYS_CHMOD = 15 SYS_LCHOWN = 16 SYS_LSEEK = 19 SYS_GETPID = 20 SYS_MOUNT = 21 SYS_SETUID = 23 SYS_GETUID = 24 SYS_PTRACE = 26 SYS_PAUSE = 29 SYS_ACCESS = 33 SYS_NICE = 34 SYS_SYNC = 36 SYS_KILL = 37 SYS_RENAME = 38 SYS_MKDIR = 39 SYS_RMDIR = 40 SYS_DUP = 41 SYS_PIPE = 42 SYS_TIMES = 43 SYS_BRK = 45 SYS_SETGID = 46 SYS_GETGID = 47 SYS_GETEUID = 49 SYS_GETEGID = 50 SYS_ACCT = 51 SYS_UMOUNT2 = 52 SYS_IOCTL = 54 SYS_FCNTL = 55 SYS_SETPGID = 57 SYS_UMASK = 60 SYS_CHROOT = 61 SYS_USTAT = 62 SYS_DUP2 = 63 SYS_GETPPID = 64 SYS_GETPGRP = 65 SYS_SETSID = 66 SYS_SIGACTION = 67 SYS_SETREUID = 70 SYS_SETREGID = 71 SYS_SIGSUSPEND = 72 SYS_SIGPENDING = 73 SYS_SETHOSTNAME = 74 SYS_SETRLIMIT = 75 SYS_GETRUSAGE = 77 SYS_GETTIMEOFDAY = 78 SYS_SETTIMEOFDAY = 79 SYS_GETGROUPS = 80 SYS_SETGROUPS = 81 SYS_SYMLINK = 83 SYS_READLINK = 85 SYS_USELIB = 86 SYS_SWAPON = 87 SYS_REBOOT = 88 SYS_MUNMAP = 91 SYS_TRUNCATE = 92 SYS_FTRUNCATE = 93 SYS_FCHMOD = 94 SYS_FCHOWN = 95 SYS_GETPRIORITY = 96 SYS_SETPRIORITY = 97 SYS_STATFS = 99 SYS_FSTATFS = 100 SYS_SYSLOG = 103 SYS_SETITIMER = 104 SYS_GETITIMER = 105 SYS_STAT = 106 SYS_LSTAT = 107 SYS_FSTAT = 108 SYS_VHANGUP = 111 SYS_WAIT4 = 114 SYS_SWAPOFF = 115 SYS_SYSINFO = 116 SYS_FSYNC = 118 SYS_SIGRETURN = 119 SYS_CLONE = 120 SYS_SETDOMAINNAME = 121 SYS_UNAME = 122 SYS_ADJTIMEX = 124 SYS_MPROTECT = 125 SYS_SIGPROCMASK = 126 SYS_INIT_MODULE = 128 SYS_DELETE_MODULE = 129 SYS_QUOTACTL = 131 SYS_GETPGID = 132 SYS_FCHDIR = 133 SYS_BDFLUSH = 134 SYS_SYSFS = 135 SYS_PERSONALITY = 136 SYS_SETFSUID = 138 SYS_SETFSGID = 139 SYS__LLSEEK = 140 SYS_GETDENTS = 141 SYS__NEWSELECT = 142 SYS_FLOCK = 143 SYS_MSYNC = 144 SYS_READV = 145 SYS_WRITEV = 146 SYS_GETSID = 147 SYS_FDATASYNC = 148 SYS__SYSCTL = 149 SYS_MLOCK = 150 SYS_MUNLOCK = 151 SYS_MLOCKALL = 152 SYS_MUNLOCKALL = 153 SYS_SCHED_SETPARAM = 154 SYS_SCHED_GETPARAM = 155 SYS_SCHED_SETSCHEDULER = 156 SYS_SCHED_GETSCHEDULER = 157 SYS_SCHED_YIELD = 158 SYS_SCHED_GET_PRIORITY_MAX = 159 SYS_SCHED_GET_PRIORITY_MIN = 160 SYS_SCHED_RR_GET_INTERVAL = 161 SYS_NANOSLEEP = 162 SYS_MREMAP = 163 SYS_SETRESUID = 164 SYS_GETRESUID = 165 SYS_POLL = 168 SYS_NFSSERVCTL = 169 SYS_SETRESGID = 170 SYS_GETRESGID = 171 SYS_PRCTL = 172 SYS_RT_SIGRETURN = 173 SYS_RT_SIGACTION = 174 SYS_RT_SIGPROCMASK = 175 SYS_RT_SIGPENDING = 176 SYS_RT_SIGTIMEDWAIT = 177 SYS_RT_SIGQUEUEINFO = 178 SYS_RT_SIGSUSPEND = 179 SYS_PREAD64 = 180 SYS_PWRITE64 = 181 SYS_CHOWN = 182 SYS_GETCWD = 183 SYS_CAPGET = 184 SYS_CAPSET = 185 SYS_SIGALTSTACK = 186 SYS_SENDFILE = 187 SYS_VFORK = 190 SYS_UGETRLIMIT = 191 SYS_MMAP2 = 192 SYS_TRUNCATE64 = 193 SYS_FTRUNCATE64 = 194 SYS_STAT64 = 195 SYS_LSTAT64 = 196 SYS_FSTAT64 = 197 SYS_LCHOWN32 = 198 SYS_GETUID32 = 199 SYS_GETGID32 = 200 SYS_GETEUID32 = 201 SYS_GETEGID32 = 202 SYS_SETREUID32 = 203 SYS_SETREGID32 = 204 SYS_GETGROUPS32 = 205 SYS_SETGROUPS32 = 206 SYS_FCHOWN32 = 207 SYS_SETRESUID32 = 208 SYS_GETRESUID32 = 209 SYS_SETRESGID32 = 210 SYS_GETRESGID32 = 211 SYS_CHOWN32 = 212 SYS_SETUID32 = 213 SYS_SETGID32 = 214 SYS_SETFSUID32 = 215 SYS_SETFSGID32 = 216 SYS_GETDENTS64 = 217 SYS_PIVOT_ROOT = 218 SYS_MINCORE = 219 SYS_MADVISE = 220 SYS_FCNTL64 = 221 SYS_GETTID = 224 SYS_READAHEAD = 225 SYS_SETXATTR = 226 SYS_LSETXATTR = 227 SYS_FSETXATTR = 228 SYS_GETXATTR = 229 SYS_LGETXATTR = 230 SYS_FGETXATTR = 231 SYS_LISTXATTR = 232 SYS_LLISTXATTR = 233 SYS_FLISTXATTR = 234 SYS_REMOVEXATTR = 235 SYS_LREMOVEXATTR = 236 SYS_FREMOVEXATTR = 237 SYS_TKILL = 238 SYS_SENDFILE64 = 239 SYS_FUTEX = 240 SYS_SCHED_SETAFFINITY = 241 SYS_SCHED_GETAFFINITY = 242 SYS_IO_SETUP = 243 SYS_IO_DESTROY = 244 SYS_IO_GETEVENTS = 245 SYS_IO_SUBMIT = 246 SYS_IO_CANCEL = 247 SYS_EXIT_GROUP = 248 SYS_LOOKUP_DCOOKIE = 249 SYS_EPOLL_CREATE = 250 SYS_EPOLL_CTL = 251 SYS_EPOLL_WAIT = 252 SYS_REMAP_FILE_PAGES = 253 SYS_SET_TID_ADDRESS = 256 SYS_TIMER_CREATE = 257 SYS_TIMER_SETTIME = 258 SYS_TIMER_GETTIME = 259 SYS_TIMER_GETOVERRUN = 260 SYS_TIMER_DELETE = 261 SYS_CLOCK_SETTIME = 262 SYS_CLOCK_GETTIME = 263 SYS_CLOCK_GETRES = 264 SYS_CLOCK_NANOSLEEP = 265 SYS_STATFS64 = 266 SYS_FSTATFS64 = 267 SYS_TGKILL = 268 SYS_UTIMES = 269 SYS_ARM_FADVISE64_64 = 270 SYS_PCICONFIG_IOBASE = 271 SYS_PCICONFIG_READ = 272 SYS_PCICONFIG_WRITE = 273 SYS_MQ_OPEN = 274 SYS_MQ_UNLINK = 275 SYS_MQ_TIMEDSEND = 276 SYS_MQ_TIMEDRECEIVE = 277 SYS_MQ_NOTIFY = 278 SYS_MQ_GETSETATTR = 279 SYS_WAITID = 280 SYS_SOCKET = 281 SYS_BIND = 282 SYS_CONNECT = 283 SYS_LISTEN = 284 SYS_ACCEPT = 285 SYS_GETSOCKNAME = 286 SYS_GETPEERNAME = 287 SYS_SOCKETPAIR = 288 SYS_SEND = 289 SYS_SENDTO = 290 SYS_RECV = 291 SYS_RECVFROM = 292 SYS_SHUTDOWN = 293 SYS_SETSOCKOPT = 294 SYS_GETSOCKOPT = 295 SYS_SENDMSG = 296 SYS_RECVMSG = 297 SYS_SEMOP = 298 SYS_SEMGET = 299 SYS_SEMCTL = 300 SYS_MSGSND = 301 SYS_MSGRCV = 302 SYS_MSGGET = 303 SYS_MSGCTL = 304 SYS_SHMAT = 305 SYS_SHMDT = 306 SYS_SHMGET = 307 SYS_SHMCTL = 308 SYS_ADD_KEY = 309 SYS_REQUEST_KEY = 310 SYS_KEYCTL = 311 SYS_SEMTIMEDOP = 312 SYS_VSERVER = 313 SYS_IOPRIO_SET = 314 SYS_IOPRIO_GET = 315 SYS_INOTIFY_INIT = 316 SYS_INOTIFY_ADD_WATCH = 317 SYS_INOTIFY_RM_WATCH = 318 SYS_MBIND = 319 SYS_GET_MEMPOLICY = 320 SYS_SET_MEMPOLICY = 321 SYS_OPENAT = 322 SYS_MKDIRAT = 323 SYS_MKNODAT = 324 SYS_FCHOWNAT = 325 SYS_FUTIMESAT = 326 SYS_FSTATAT64 = 327 SYS_UNLINKAT = 328 SYS_RENAMEAT = 329 SYS_LINKAT = 330 SYS_SYMLINKAT = 331 SYS_READLINKAT = 332 SYS_FCHMODAT = 333 SYS_FACCESSAT = 334 SYS_PSELECT6 = 335 SYS_PPOLL = 336 SYS_UNSHARE = 337 SYS_SET_ROBUST_LIST = 338 SYS_GET_ROBUST_LIST = 339 SYS_SPLICE = 340 SYS_ARM_SYNC_FILE_RANGE = 341 SYS_TEE = 342 SYS_VMSPLICE = 343 SYS_MOVE_PAGES = 344 SYS_GETCPU = 345 SYS_EPOLL_PWAIT = 346 SYS_KEXEC_LOAD = 347 SYS_UTIMENSAT = 348 SYS_SIGNALFD = 349 SYS_TIMERFD_CREATE = 350 SYS_EVENTFD = 351 SYS_FALLOCATE = 352 SYS_TIMERFD_SETTIME = 353 SYS_TIMERFD_GETTIME = 354 SYS_SIGNALFD4 = 355 SYS_EVENTFD2 = 356 SYS_EPOLL_CREATE1 = 357 SYS_DUP3 = 358 SYS_PIPE2 = 359 SYS_INOTIFY_INIT1 = 360 SYS_PREADV = 361 SYS_PWRITEV = 362 SYS_RT_TGSIGQUEUEINFO = 363 SYS_PERF_EVENT_OPEN = 364 SYS_RECVMMSG = 365 SYS_ACCEPT4 = 366 SYS_FANOTIFY_INIT = 367 SYS_FANOTIFY_MARK = 368 SYS_PRLIMIT64 = 369 SYS_NAME_TO_HANDLE_AT = 370 SYS_OPEN_BY_HANDLE_AT = 371 SYS_CLOCK_ADJTIME = 372 SYS_SYNCFS = 373 SYS_SENDMMSG = 374 SYS_SETNS = 375 SYS_PROCESS_VM_READV = 376 SYS_PROCESS_VM_WRITEV = 377 SYS_KCMP = 378 SYS_FINIT_MODULE = 379 SYS_SCHED_SETATTR = 380 SYS_SCHED_GETATTR = 381 SYS_RENAMEAT2 = 382 SYS_SECCOMP = 383 SYS_GETRANDOM = 384 SYS_MEMFD_CREATE = 385 SYS_BPF = 386 SYS_EXECVEAT = 387 SYS_USERFAULTFD = 388 SYS_MEMBARRIER = 389 SYS_MLOCK2 = 390 SYS_COPY_FILE_RANGE = 391 SYS_PREADV2 = 392 SYS_PWRITEV2 = 393 SYS_PKEY_MPROTECT = 394 SYS_PKEY_ALLOC = 395 SYS_PKEY_FREE = 396 SYS_STATX = 397 ) ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go ================================================ // linux/mksysnum.pl -Wall -Werror -static -I/tmp/include -fsigned-char /tmp/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. // +build arm64,linux package unix const ( SYS_IO_SETUP = 0 SYS_IO_DESTROY = 1 SYS_IO_SUBMIT = 2 SYS_IO_CANCEL = 3 SYS_IO_GETEVENTS = 4 SYS_SETXATTR = 5 SYS_LSETXATTR = 6 SYS_FSETXATTR = 7 SYS_GETXATTR = 8 SYS_LGETXATTR = 9 SYS_FGETXATTR = 10 SYS_LISTXATTR = 11 SYS_LLISTXATTR = 12 SYS_FLISTXATTR = 13 SYS_REMOVEXATTR = 14 SYS_LREMOVEXATTR = 15 SYS_FREMOVEXATTR = 16 SYS_GETCWD = 17 SYS_LOOKUP_DCOOKIE = 18 SYS_EVENTFD2 = 19 SYS_EPOLL_CREATE1 = 20 SYS_EPOLL_CTL = 21 SYS_EPOLL_PWAIT = 22 SYS_DUP = 23 SYS_DUP3 = 24 SYS_FCNTL = 25 SYS_INOTIFY_INIT1 = 26 SYS_INOTIFY_ADD_WATCH = 27 SYS_INOTIFY_RM_WATCH = 28 SYS_IOCTL = 29 SYS_IOPRIO_SET = 30 SYS_IOPRIO_GET = 31 SYS_FLOCK = 32 SYS_MKNODAT = 33 SYS_MKDIRAT = 34 SYS_UNLINKAT = 35 SYS_SYMLINKAT = 36 SYS_LINKAT = 37 SYS_RENAMEAT = 38 SYS_UMOUNT2 = 39 SYS_MOUNT = 40 SYS_PIVOT_ROOT = 41 SYS_NFSSERVCTL = 42 SYS_STATFS = 43 SYS_FSTATFS = 44 SYS_TRUNCATE = 45 SYS_FTRUNCATE = 46 SYS_FALLOCATE = 47 SYS_FACCESSAT = 48 SYS_CHDIR = 49 SYS_FCHDIR = 50 SYS_CHROOT = 51 SYS_FCHMOD = 52 SYS_FCHMODAT = 53 SYS_FCHOWNAT = 54 SYS_FCHOWN = 55 SYS_OPENAT = 56 SYS_CLOSE = 57 SYS_VHANGUP = 58 SYS_PIPE2 = 59 SYS_QUOTACTL = 60 SYS_GETDENTS64 = 61 SYS_LSEEK = 62 SYS_READ = 63 SYS_WRITE = 64 SYS_READV = 65 SYS_WRITEV = 66 SYS_PREAD64 = 67 SYS_PWRITE64 = 68 SYS_PREADV = 69 SYS_PWRITEV = 70 SYS_SENDFILE = 71 SYS_PSELECT6 = 72 SYS_PPOLL = 73 SYS_SIGNALFD4 = 74 SYS_VMSPLICE = 75 SYS_SPLICE = 76 SYS_TEE = 77 SYS_READLINKAT = 78 SYS_FSTATAT = 79 SYS_FSTAT = 80 SYS_SYNC = 81 SYS_FSYNC = 82 SYS_FDATASYNC = 83 SYS_SYNC_FILE_RANGE = 84 SYS_TIMERFD_CREATE = 85 SYS_TIMERFD_SETTIME = 86 SYS_TIMERFD_GETTIME = 87 SYS_UTIMENSAT = 88 SYS_ACCT = 89 SYS_CAPGET = 90 SYS_CAPSET = 91 SYS_PERSONALITY = 92 SYS_EXIT = 93 SYS_EXIT_GROUP = 94 SYS_WAITID = 95 SYS_SET_TID_ADDRESS = 96 SYS_UNSHARE = 97 SYS_FUTEX = 98 SYS_SET_ROBUST_LIST = 99 SYS_GET_ROBUST_LIST = 100 SYS_NANOSLEEP = 101 SYS_GETITIMER = 102 SYS_SETITIMER = 103 SYS_KEXEC_LOAD = 104 SYS_INIT_MODULE = 105 SYS_DELETE_MODULE = 106 SYS_TIMER_CREATE = 107 SYS_TIMER_GETTIME = 108 SYS_TIMER_GETOVERRUN = 109 SYS_TIMER_SETTIME = 110 SYS_TIMER_DELETE = 111 SYS_CLOCK_SETTIME = 112 SYS_CLOCK_GETTIME = 113 SYS_CLOCK_GETRES = 114 SYS_CLOCK_NANOSLEEP = 115 SYS_SYSLOG = 116 SYS_PTRACE = 117 SYS_SCHED_SETPARAM = 118 SYS_SCHED_SETSCHEDULER = 119 SYS_SCHED_GETSCHEDULER = 120 SYS_SCHED_GETPARAM = 121 SYS_SCHED_SETAFFINITY = 122 SYS_SCHED_GETAFFINITY = 123 SYS_SCHED_YIELD = 124 SYS_SCHED_GET_PRIORITY_MAX = 125 SYS_SCHED_GET_PRIORITY_MIN = 126 SYS_SCHED_RR_GET_INTERVAL = 127 SYS_RESTART_SYSCALL = 128 SYS_KILL = 129 SYS_TKILL = 130 SYS_TGKILL = 131 SYS_SIGALTSTACK = 132 SYS_RT_SIGSUSPEND = 133 SYS_RT_SIGACTION = 134 SYS_RT_SIGPROCMASK = 135 SYS_RT_SIGPENDING = 136 SYS_RT_SIGTIMEDWAIT = 137 SYS_RT_SIGQUEUEINFO = 138 SYS_RT_SIGRETURN = 139 SYS_SETPRIORITY = 140 SYS_GETPRIORITY = 141 SYS_REBOOT = 142 SYS_SETREGID = 143 SYS_SETGID = 144 SYS_SETREUID = 145 SYS_SETUID = 146 SYS_SETRESUID = 147 SYS_GETRESUID = 148 SYS_SETRESGID = 149 SYS_GETRESGID = 150 SYS_SETFSUID = 151 SYS_SETFSGID = 152 SYS_TIMES = 153 SYS_SETPGID = 154 SYS_GETPGID = 155 SYS_GETSID = 156 SYS_SETSID = 157 SYS_GETGROUPS = 158 SYS_SETGROUPS = 159 SYS_UNAME = 160 SYS_SETHOSTNAME = 161 SYS_SETDOMAINNAME = 162 SYS_GETRLIMIT = 163 SYS_SETRLIMIT = 164 SYS_GETRUSAGE = 165 SYS_UMASK = 166 SYS_PRCTL = 167 SYS_GETCPU = 168 SYS_GETTIMEOFDAY = 169 SYS_SETTIMEOFDAY = 170 SYS_ADJTIMEX = 171 SYS_GETPID = 172 SYS_GETPPID = 173 SYS_GETUID = 174 SYS_GETEUID = 175 SYS_GETGID = 176 SYS_GETEGID = 177 SYS_GETTID = 178 SYS_SYSINFO = 179 SYS_MQ_OPEN = 180 SYS_MQ_UNLINK = 181 SYS_MQ_TIMEDSEND = 182 SYS_MQ_TIMEDRECEIVE = 183 SYS_MQ_NOTIFY = 184 SYS_MQ_GETSETATTR = 185 SYS_MSGGET = 186 SYS_MSGCTL = 187 SYS_MSGRCV = 188 SYS_MSGSND = 189 SYS_SEMGET = 190 SYS_SEMCTL = 191 SYS_SEMTIMEDOP = 192 SYS_SEMOP = 193 SYS_SHMGET = 194 SYS_SHMCTL = 195 SYS_SHMAT = 196 SYS_SHMDT = 197 SYS_SOCKET = 198 SYS_SOCKETPAIR = 199 SYS_BIND = 200 SYS_LISTEN = 201 SYS_ACCEPT = 202 SYS_CONNECT = 203 SYS_GETSOCKNAME = 204 SYS_GETPEERNAME = 205 SYS_SENDTO = 206 SYS_RECVFROM = 207 SYS_SETSOCKOPT = 208 SYS_GETSOCKOPT = 209 SYS_SHUTDOWN = 210 SYS_SENDMSG = 211 SYS_RECVMSG = 212 SYS_READAHEAD = 213 SYS_BRK = 214 SYS_MUNMAP = 215 SYS_MREMAP = 216 SYS_ADD_KEY = 217 SYS_REQUEST_KEY = 218 SYS_KEYCTL = 219 SYS_CLONE = 220 SYS_EXECVE = 221 SYS_MMAP = 222 SYS_FADVISE64 = 223 SYS_SWAPON = 224 SYS_SWAPOFF = 225 SYS_MPROTECT = 226 SYS_MSYNC = 227 SYS_MLOCK = 228 SYS_MUNLOCK = 229 SYS_MLOCKALL = 230 SYS_MUNLOCKALL = 231 SYS_MINCORE = 232 SYS_MADVISE = 233 SYS_REMAP_FILE_PAGES = 234 SYS_MBIND = 235 SYS_GET_MEMPOLICY = 236 SYS_SET_MEMPOLICY = 237 SYS_MIGRATE_PAGES = 238 SYS_MOVE_PAGES = 239 SYS_RT_TGSIGQUEUEINFO = 240 SYS_PERF_EVENT_OPEN = 241 SYS_ACCEPT4 = 242 SYS_RECVMMSG = 243 SYS_ARCH_SPECIFIC_SYSCALL = 244 SYS_WAIT4 = 260 SYS_PRLIMIT64 = 261 SYS_FANOTIFY_INIT = 262 SYS_FANOTIFY_MARK = 263 SYS_NAME_TO_HANDLE_AT = 264 SYS_OPEN_BY_HANDLE_AT = 265 SYS_CLOCK_ADJTIME = 266 SYS_SYNCFS = 267 SYS_SETNS = 268 SYS_SENDMMSG = 269 SYS_PROCESS_VM_READV = 270 SYS_PROCESS_VM_WRITEV = 271 SYS_KCMP = 272 SYS_FINIT_MODULE = 273 SYS_SCHED_SETATTR = 274 SYS_SCHED_GETATTR = 275 SYS_RENAMEAT2 = 276 SYS_SECCOMP = 277 SYS_GETRANDOM = 278 SYS_MEMFD_CREATE = 279 SYS_BPF = 280 SYS_EXECVEAT = 281 SYS_USERFAULTFD = 282 SYS_MEMBARRIER = 283 SYS_MLOCK2 = 284 SYS_COPY_FILE_RANGE = 285 SYS_PREADV2 = 286 SYS_PWRITEV2 = 287 SYS_PKEY_MPROTECT = 288 SYS_PKEY_ALLOC = 289 SYS_PKEY_FREE = 290 SYS_STATX = 291 ) ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go ================================================ // linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. // +build mips,linux package unix const ( SYS_SYSCALL = 4000 SYS_EXIT = 4001 SYS_FORK = 4002 SYS_READ = 4003 SYS_WRITE = 4004 SYS_OPEN = 4005 SYS_CLOSE = 4006 SYS_WAITPID = 4007 SYS_CREAT = 4008 SYS_LINK = 4009 SYS_UNLINK = 4010 SYS_EXECVE = 4011 SYS_CHDIR = 4012 SYS_TIME = 4013 SYS_MKNOD = 4014 SYS_CHMOD = 4015 SYS_LCHOWN = 4016 SYS_BREAK = 4017 SYS_UNUSED18 = 4018 SYS_LSEEK = 4019 SYS_GETPID = 4020 SYS_MOUNT = 4021 SYS_UMOUNT = 4022 SYS_SETUID = 4023 SYS_GETUID = 4024 SYS_STIME = 4025 SYS_PTRACE = 4026 SYS_ALARM = 4027 SYS_UNUSED28 = 4028 SYS_PAUSE = 4029 SYS_UTIME = 4030 SYS_STTY = 4031 SYS_GTTY = 4032 SYS_ACCESS = 4033 SYS_NICE = 4034 SYS_FTIME = 4035 SYS_SYNC = 4036 SYS_KILL = 4037 SYS_RENAME = 4038 SYS_MKDIR = 4039 SYS_RMDIR = 4040 SYS_DUP = 4041 SYS_PIPE = 4042 SYS_TIMES = 4043 SYS_PROF = 4044 SYS_BRK = 4045 SYS_SETGID = 4046 SYS_GETGID = 4047 SYS_SIGNAL = 4048 SYS_GETEUID = 4049 SYS_GETEGID = 4050 SYS_ACCT = 4051 SYS_UMOUNT2 = 4052 SYS_LOCK = 4053 SYS_IOCTL = 4054 SYS_FCNTL = 4055 SYS_MPX = 4056 SYS_SETPGID = 4057 SYS_ULIMIT = 4058 SYS_UNUSED59 = 4059 SYS_UMASK = 4060 SYS_CHROOT = 4061 SYS_USTAT = 4062 SYS_DUP2 = 4063 SYS_GETPPID = 4064 SYS_GETPGRP = 4065 SYS_SETSID = 4066 SYS_SIGACTION = 4067 SYS_SGETMASK = 4068 SYS_SSETMASK = 4069 SYS_SETREUID = 4070 SYS_SETREGID = 4071 SYS_SIGSUSPEND = 4072 SYS_SIGPENDING = 4073 SYS_SETHOSTNAME = 4074 SYS_SETRLIMIT = 4075 SYS_GETRLIMIT = 4076 SYS_GETRUSAGE = 4077 SYS_GETTIMEOFDAY = 4078 SYS_SETTIMEOFDAY = 4079 SYS_GETGROUPS = 4080 SYS_SETGROUPS = 4081 SYS_RESERVED82 = 4082 SYS_SYMLINK = 4083 SYS_UNUSED84 = 4084 SYS_READLINK = 4085 SYS_USELIB = 4086 SYS_SWAPON = 4087 SYS_REBOOT = 4088 SYS_READDIR = 4089 SYS_MMAP = 4090 SYS_MUNMAP = 4091 SYS_TRUNCATE = 4092 SYS_FTRUNCATE = 4093 SYS_FCHMOD = 4094 SYS_FCHOWN = 4095 SYS_GETPRIORITY = 4096 SYS_SETPRIORITY = 4097 SYS_PROFIL = 4098 SYS_STATFS = 4099 SYS_FSTATFS = 4100 SYS_IOPERM = 4101 SYS_SOCKETCALL = 4102 SYS_SYSLOG = 4103 SYS_SETITIMER = 4104 SYS_GETITIMER = 4105 SYS_STAT = 4106 SYS_LSTAT = 4107 SYS_FSTAT = 4108 SYS_UNUSED109 = 4109 SYS_IOPL = 4110 SYS_VHANGUP = 4111 SYS_IDLE = 4112 SYS_VM86 = 4113 SYS_WAIT4 = 4114 SYS_SWAPOFF = 4115 SYS_SYSINFO = 4116 SYS_IPC = 4117 SYS_FSYNC = 4118 SYS_SIGRETURN = 4119 SYS_CLONE = 4120 SYS_SETDOMAINNAME = 4121 SYS_UNAME = 4122 SYS_MODIFY_LDT = 4123 SYS_ADJTIMEX = 4124 SYS_MPROTECT = 4125 SYS_SIGPROCMASK = 4126 SYS_CREATE_MODULE = 4127 SYS_INIT_MODULE = 4128 SYS_DELETE_MODULE = 4129 SYS_GET_KERNEL_SYMS = 4130 SYS_QUOTACTL = 4131 SYS_GETPGID = 4132 SYS_FCHDIR = 4133 SYS_BDFLUSH = 4134 SYS_SYSFS = 4135 SYS_PERSONALITY = 4136 SYS_AFS_SYSCALL = 4137 SYS_SETFSUID = 4138 SYS_SETFSGID = 4139 SYS__LLSEEK = 4140 SYS_GETDENTS = 4141 SYS__NEWSELECT = 4142 SYS_FLOCK = 4143 SYS_MSYNC = 4144 SYS_READV = 4145 SYS_WRITEV = 4146 SYS_CACHEFLUSH = 4147 SYS_CACHECTL = 4148 SYS_SYSMIPS = 4149 SYS_UNUSED150 = 4150 SYS_GETSID = 4151 SYS_FDATASYNC = 4152 SYS__SYSCTL = 4153 SYS_MLOCK = 4154 SYS_MUNLOCK = 4155 SYS_MLOCKALL = 4156 SYS_MUNLOCKALL = 4157 SYS_SCHED_SETPARAM = 4158 SYS_SCHED_GETPARAM = 4159 SYS_SCHED_SETSCHEDULER = 4160 SYS_SCHED_GETSCHEDULER = 4161 SYS_SCHED_YIELD = 4162 SYS_SCHED_GET_PRIORITY_MAX = 4163 SYS_SCHED_GET_PRIORITY_MIN = 4164 SYS_SCHED_RR_GET_INTERVAL = 4165 SYS_NANOSLEEP = 4166 SYS_MREMAP = 4167 SYS_ACCEPT = 4168 SYS_BIND = 4169 SYS_CONNECT = 4170 SYS_GETPEERNAME = 4171 SYS_GETSOCKNAME = 4172 SYS_GETSOCKOPT = 4173 SYS_LISTEN = 4174 SYS_RECV = 4175 SYS_RECVFROM = 4176 SYS_RECVMSG = 4177 SYS_SEND = 4178 SYS_SENDMSG = 4179 SYS_SENDTO = 4180 SYS_SETSOCKOPT = 4181 SYS_SHUTDOWN = 4182 SYS_SOCKET = 4183 SYS_SOCKETPAIR = 4184 SYS_SETRESUID = 4185 SYS_GETRESUID = 4186 SYS_QUERY_MODULE = 4187 SYS_POLL = 4188 SYS_NFSSERVCTL = 4189 SYS_SETRESGID = 4190 SYS_GETRESGID = 4191 SYS_PRCTL = 4192 SYS_RT_SIGRETURN = 4193 SYS_RT_SIGACTION = 4194 SYS_RT_SIGPROCMASK = 4195 SYS_RT_SIGPENDING = 4196 SYS_RT_SIGTIMEDWAIT = 4197 SYS_RT_SIGQUEUEINFO = 4198 SYS_RT_SIGSUSPEND = 4199 SYS_PREAD64 = 4200 SYS_PWRITE64 = 4201 SYS_CHOWN = 4202 SYS_GETCWD = 4203 SYS_CAPGET = 4204 SYS_CAPSET = 4205 SYS_SIGALTSTACK = 4206 SYS_SENDFILE = 4207 SYS_GETPMSG = 4208 SYS_PUTPMSG = 4209 SYS_MMAP2 = 4210 SYS_TRUNCATE64 = 4211 SYS_FTRUNCATE64 = 4212 SYS_STAT64 = 4213 SYS_LSTAT64 = 4214 SYS_FSTAT64 = 4215 SYS_PIVOT_ROOT = 4216 SYS_MINCORE = 4217 SYS_MADVISE = 4218 SYS_GETDENTS64 = 4219 SYS_FCNTL64 = 4220 SYS_RESERVED221 = 4221 SYS_GETTID = 4222 SYS_READAHEAD = 4223 SYS_SETXATTR = 4224 SYS_LSETXATTR = 4225 SYS_FSETXATTR = 4226 SYS_GETXATTR = 4227 SYS_LGETXATTR = 4228 SYS_FGETXATTR = 4229 SYS_LISTXATTR = 4230 SYS_LLISTXATTR = 4231 SYS_FLISTXATTR = 4232 SYS_REMOVEXATTR = 4233 SYS_LREMOVEXATTR = 4234 SYS_FREMOVEXATTR = 4235 SYS_TKILL = 4236 SYS_SENDFILE64 = 4237 SYS_FUTEX = 4238 SYS_SCHED_SETAFFINITY = 4239 SYS_SCHED_GETAFFINITY = 4240 SYS_IO_SETUP = 4241 SYS_IO_DESTROY = 4242 SYS_IO_GETEVENTS = 4243 SYS_IO_SUBMIT = 4244 SYS_IO_CANCEL = 4245 SYS_EXIT_GROUP = 4246 SYS_LOOKUP_DCOOKIE = 4247 SYS_EPOLL_CREATE = 4248 SYS_EPOLL_CTL = 4249 SYS_EPOLL_WAIT = 4250 SYS_REMAP_FILE_PAGES = 4251 SYS_SET_TID_ADDRESS = 4252 SYS_RESTART_SYSCALL = 4253 SYS_FADVISE64 = 4254 SYS_STATFS64 = 4255 SYS_FSTATFS64 = 4256 SYS_TIMER_CREATE = 4257 SYS_TIMER_SETTIME = 4258 SYS_TIMER_GETTIME = 4259 SYS_TIMER_GETOVERRUN = 4260 SYS_TIMER_DELETE = 4261 SYS_CLOCK_SETTIME = 4262 SYS_CLOCK_GETTIME = 4263 SYS_CLOCK_GETRES = 4264 SYS_CLOCK_NANOSLEEP = 4265 SYS_TGKILL = 4266 SYS_UTIMES = 4267 SYS_MBIND = 4268 SYS_GET_MEMPOLICY = 4269 SYS_SET_MEMPOLICY = 4270 SYS_MQ_OPEN = 4271 SYS_MQ_UNLINK = 4272 SYS_MQ_TIMEDSEND = 4273 SYS_MQ_TIMEDRECEIVE = 4274 SYS_MQ_NOTIFY = 4275 SYS_MQ_GETSETATTR = 4276 SYS_VSERVER = 4277 SYS_WAITID = 4278 SYS_ADD_KEY = 4280 SYS_REQUEST_KEY = 4281 SYS_KEYCTL = 4282 SYS_SET_THREAD_AREA = 4283 SYS_INOTIFY_INIT = 4284 SYS_INOTIFY_ADD_WATCH = 4285 SYS_INOTIFY_RM_WATCH = 4286 SYS_MIGRATE_PAGES = 4287 SYS_OPENAT = 4288 SYS_MKDIRAT = 4289 SYS_MKNODAT = 4290 SYS_FCHOWNAT = 4291 SYS_FUTIMESAT = 4292 SYS_FSTATAT64 = 4293 SYS_UNLINKAT = 4294 SYS_RENAMEAT = 4295 SYS_LINKAT = 4296 SYS_SYMLINKAT = 4297 SYS_READLINKAT = 4298 SYS_FCHMODAT = 4299 SYS_FACCESSAT = 4300 SYS_PSELECT6 = 4301 SYS_PPOLL = 4302 SYS_UNSHARE = 4303 SYS_SPLICE = 4304 SYS_SYNC_FILE_RANGE = 4305 SYS_TEE = 4306 SYS_VMSPLICE = 4307 SYS_MOVE_PAGES = 4308 SYS_SET_ROBUST_LIST = 4309 SYS_GET_ROBUST_LIST = 4310 SYS_KEXEC_LOAD = 4311 SYS_GETCPU = 4312 SYS_EPOLL_PWAIT = 4313 SYS_IOPRIO_SET = 4314 SYS_IOPRIO_GET = 4315 SYS_UTIMENSAT = 4316 SYS_SIGNALFD = 4317 SYS_TIMERFD = 4318 SYS_EVENTFD = 4319 SYS_FALLOCATE = 4320 SYS_TIMERFD_CREATE = 4321 SYS_TIMERFD_GETTIME = 4322 SYS_TIMERFD_SETTIME = 4323 SYS_SIGNALFD4 = 4324 SYS_EVENTFD2 = 4325 SYS_EPOLL_CREATE1 = 4326 SYS_DUP3 = 4327 SYS_PIPE2 = 4328 SYS_INOTIFY_INIT1 = 4329 SYS_PREADV = 4330 SYS_PWRITEV = 4331 SYS_RT_TGSIGQUEUEINFO = 4332 SYS_PERF_EVENT_OPEN = 4333 SYS_ACCEPT4 = 4334 SYS_RECVMMSG = 4335 SYS_FANOTIFY_INIT = 4336 SYS_FANOTIFY_MARK = 4337 SYS_PRLIMIT64 = 4338 SYS_NAME_TO_HANDLE_AT = 4339 SYS_OPEN_BY_HANDLE_AT = 4340 SYS_CLOCK_ADJTIME = 4341 SYS_SYNCFS = 4342 SYS_SENDMMSG = 4343 SYS_SETNS = 4344 SYS_PROCESS_VM_READV = 4345 SYS_PROCESS_VM_WRITEV = 4346 SYS_KCMP = 4347 SYS_FINIT_MODULE = 4348 SYS_SCHED_SETATTR = 4349 SYS_SCHED_GETATTR = 4350 SYS_RENAMEAT2 = 4351 SYS_SECCOMP = 4352 SYS_GETRANDOM = 4353 SYS_MEMFD_CREATE = 4354 SYS_BPF = 4355 SYS_EXECVEAT = 4356 SYS_USERFAULTFD = 4357 SYS_MEMBARRIER = 4358 SYS_MLOCK2 = 4359 SYS_COPY_FILE_RANGE = 4360 SYS_PREADV2 = 4361 SYS_PWRITEV2 = 4362 SYS_PKEY_MPROTECT = 4363 SYS_PKEY_ALLOC = 4364 SYS_PKEY_FREE = 4365 SYS_STATX = 4366 ) ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go ================================================ // linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. // +build mips64,linux package unix const ( SYS_READ = 5000 SYS_WRITE = 5001 SYS_OPEN = 5002 SYS_CLOSE = 5003 SYS_STAT = 5004 SYS_FSTAT = 5005 SYS_LSTAT = 5006 SYS_POLL = 5007 SYS_LSEEK = 5008 SYS_MMAP = 5009 SYS_MPROTECT = 5010 SYS_MUNMAP = 5011 SYS_BRK = 5012 SYS_RT_SIGACTION = 5013 SYS_RT_SIGPROCMASK = 5014 SYS_IOCTL = 5015 SYS_PREAD64 = 5016 SYS_PWRITE64 = 5017 SYS_READV = 5018 SYS_WRITEV = 5019 SYS_ACCESS = 5020 SYS_PIPE = 5021 SYS__NEWSELECT = 5022 SYS_SCHED_YIELD = 5023 SYS_MREMAP = 5024 SYS_MSYNC = 5025 SYS_MINCORE = 5026 SYS_MADVISE = 5027 SYS_SHMGET = 5028 SYS_SHMAT = 5029 SYS_SHMCTL = 5030 SYS_DUP = 5031 SYS_DUP2 = 5032 SYS_PAUSE = 5033 SYS_NANOSLEEP = 5034 SYS_GETITIMER = 5035 SYS_SETITIMER = 5036 SYS_ALARM = 5037 SYS_GETPID = 5038 SYS_SENDFILE = 5039 SYS_SOCKET = 5040 SYS_CONNECT = 5041 SYS_ACCEPT = 5042 SYS_SENDTO = 5043 SYS_RECVFROM = 5044 SYS_SENDMSG = 5045 SYS_RECVMSG = 5046 SYS_SHUTDOWN = 5047 SYS_BIND = 5048 SYS_LISTEN = 5049 SYS_GETSOCKNAME = 5050 SYS_GETPEERNAME = 5051 SYS_SOCKETPAIR = 5052 SYS_SETSOCKOPT = 5053 SYS_GETSOCKOPT = 5054 SYS_CLONE = 5055 SYS_FORK = 5056 SYS_EXECVE = 5057 SYS_EXIT = 5058 SYS_WAIT4 = 5059 SYS_KILL = 5060 SYS_UNAME = 5061 SYS_SEMGET = 5062 SYS_SEMOP = 5063 SYS_SEMCTL = 5064 SYS_SHMDT = 5065 SYS_MSGGET = 5066 SYS_MSGSND = 5067 SYS_MSGRCV = 5068 SYS_MSGCTL = 5069 SYS_FCNTL = 5070 SYS_FLOCK = 5071 SYS_FSYNC = 5072 SYS_FDATASYNC = 5073 SYS_TRUNCATE = 5074 SYS_FTRUNCATE = 5075 SYS_GETDENTS = 5076 SYS_GETCWD = 5077 SYS_CHDIR = 5078 SYS_FCHDIR = 5079 SYS_RENAME = 5080 SYS_MKDIR = 5081 SYS_RMDIR = 5082 SYS_CREAT = 5083 SYS_LINK = 5084 SYS_UNLINK = 5085 SYS_SYMLINK = 5086 SYS_READLINK = 5087 SYS_CHMOD = 5088 SYS_FCHMOD = 5089 SYS_CHOWN = 5090 SYS_FCHOWN = 5091 SYS_LCHOWN = 5092 SYS_UMASK = 5093 SYS_GETTIMEOFDAY = 5094 SYS_GETRLIMIT = 5095 SYS_GETRUSAGE = 5096 SYS_SYSINFO = 5097 SYS_TIMES = 5098 SYS_PTRACE = 5099 SYS_GETUID = 5100 SYS_SYSLOG = 5101 SYS_GETGID = 5102 SYS_SETUID = 5103 SYS_SETGID = 5104 SYS_GETEUID = 5105 SYS_GETEGID = 5106 SYS_SETPGID = 5107 SYS_GETPPID = 5108 SYS_GETPGRP = 5109 SYS_SETSID = 5110 SYS_SETREUID = 5111 SYS_SETREGID = 5112 SYS_GETGROUPS = 5113 SYS_SETGROUPS = 5114 SYS_SETRESUID = 5115 SYS_GETRESUID = 5116 SYS_SETRESGID = 5117 SYS_GETRESGID = 5118 SYS_GETPGID = 5119 SYS_SETFSUID = 5120 SYS_SETFSGID = 5121 SYS_GETSID = 5122 SYS_CAPGET = 5123 SYS_CAPSET = 5124 SYS_RT_SIGPENDING = 5125 SYS_RT_SIGTIMEDWAIT = 5126 SYS_RT_SIGQUEUEINFO = 5127 SYS_RT_SIGSUSPEND = 5128 SYS_SIGALTSTACK = 5129 SYS_UTIME = 5130 SYS_MKNOD = 5131 SYS_PERSONALITY = 5132 SYS_USTAT = 5133 SYS_STATFS = 5134 SYS_FSTATFS = 5135 SYS_SYSFS = 5136 SYS_GETPRIORITY = 5137 SYS_SETPRIORITY = 5138 SYS_SCHED_SETPARAM = 5139 SYS_SCHED_GETPARAM = 5140 SYS_SCHED_SETSCHEDULER = 5141 SYS_SCHED_GETSCHEDULER = 5142 SYS_SCHED_GET_PRIORITY_MAX = 5143 SYS_SCHED_GET_PRIORITY_MIN = 5144 SYS_SCHED_RR_GET_INTERVAL = 5145 SYS_MLOCK = 5146 SYS_MUNLOCK = 5147 SYS_MLOCKALL = 5148 SYS_MUNLOCKALL = 5149 SYS_VHANGUP = 5150 SYS_PIVOT_ROOT = 5151 SYS__SYSCTL = 5152 SYS_PRCTL = 5153 SYS_ADJTIMEX = 5154 SYS_SETRLIMIT = 5155 SYS_CHROOT = 5156 SYS_SYNC = 5157 SYS_ACCT = 5158 SYS_SETTIMEOFDAY = 5159 SYS_MOUNT = 5160 SYS_UMOUNT2 = 5161 SYS_SWAPON = 5162 SYS_SWAPOFF = 5163 SYS_REBOOT = 5164 SYS_SETHOSTNAME = 5165 SYS_SETDOMAINNAME = 5166 SYS_CREATE_MODULE = 5167 SYS_INIT_MODULE = 5168 SYS_DELETE_MODULE = 5169 SYS_GET_KERNEL_SYMS = 5170 SYS_QUERY_MODULE = 5171 SYS_QUOTACTL = 5172 SYS_NFSSERVCTL = 5173 SYS_GETPMSG = 5174 SYS_PUTPMSG = 5175 SYS_AFS_SYSCALL = 5176 SYS_RESERVED177 = 5177 SYS_GETTID = 5178 SYS_READAHEAD = 5179 SYS_SETXATTR = 5180 SYS_LSETXATTR = 5181 SYS_FSETXATTR = 5182 SYS_GETXATTR = 5183 SYS_LGETXATTR = 5184 SYS_FGETXATTR = 5185 SYS_LISTXATTR = 5186 SYS_LLISTXATTR = 5187 SYS_FLISTXATTR = 5188 SYS_REMOVEXATTR = 5189 SYS_LREMOVEXATTR = 5190 SYS_FREMOVEXATTR = 5191 SYS_TKILL = 5192 SYS_RESERVED193 = 5193 SYS_FUTEX = 5194 SYS_SCHED_SETAFFINITY = 5195 SYS_SCHED_GETAFFINITY = 5196 SYS_CACHEFLUSH = 5197 SYS_CACHECTL = 5198 SYS_SYSMIPS = 5199 SYS_IO_SETUP = 5200 SYS_IO_DESTROY = 5201 SYS_IO_GETEVENTS = 5202 SYS_IO_SUBMIT = 5203 SYS_IO_CANCEL = 5204 SYS_EXIT_GROUP = 5205 SYS_LOOKUP_DCOOKIE = 5206 SYS_EPOLL_CREATE = 5207 SYS_EPOLL_CTL = 5208 SYS_EPOLL_WAIT = 5209 SYS_REMAP_FILE_PAGES = 5210 SYS_RT_SIGRETURN = 5211 SYS_SET_TID_ADDRESS = 5212 SYS_RESTART_SYSCALL = 5213 SYS_SEMTIMEDOP = 5214 SYS_FADVISE64 = 5215 SYS_TIMER_CREATE = 5216 SYS_TIMER_SETTIME = 5217 SYS_TIMER_GETTIME = 5218 SYS_TIMER_GETOVERRUN = 5219 SYS_TIMER_DELETE = 5220 SYS_CLOCK_SETTIME = 5221 SYS_CLOCK_GETTIME = 5222 SYS_CLOCK_GETRES = 5223 SYS_CLOCK_NANOSLEEP = 5224 SYS_TGKILL = 5225 SYS_UTIMES = 5226 SYS_MBIND = 5227 SYS_GET_MEMPOLICY = 5228 SYS_SET_MEMPOLICY = 5229 SYS_MQ_OPEN = 5230 SYS_MQ_UNLINK = 5231 SYS_MQ_TIMEDSEND = 5232 SYS_MQ_TIMEDRECEIVE = 5233 SYS_MQ_NOTIFY = 5234 SYS_MQ_GETSETATTR = 5235 SYS_VSERVER = 5236 SYS_WAITID = 5237 SYS_ADD_KEY = 5239 SYS_REQUEST_KEY = 5240 SYS_KEYCTL = 5241 SYS_SET_THREAD_AREA = 5242 SYS_INOTIFY_INIT = 5243 SYS_INOTIFY_ADD_WATCH = 5244 SYS_INOTIFY_RM_WATCH = 5245 SYS_MIGRATE_PAGES = 5246 SYS_OPENAT = 5247 SYS_MKDIRAT = 5248 SYS_MKNODAT = 5249 SYS_FCHOWNAT = 5250 SYS_FUTIMESAT = 5251 SYS_NEWFSTATAT = 5252 SYS_UNLINKAT = 5253 SYS_RENAMEAT = 5254 SYS_LINKAT = 5255 SYS_SYMLINKAT = 5256 SYS_READLINKAT = 5257 SYS_FCHMODAT = 5258 SYS_FACCESSAT = 5259 SYS_PSELECT6 = 5260 SYS_PPOLL = 5261 SYS_UNSHARE = 5262 SYS_SPLICE = 5263 SYS_SYNC_FILE_RANGE = 5264 SYS_TEE = 5265 SYS_VMSPLICE = 5266 SYS_MOVE_PAGES = 5267 SYS_SET_ROBUST_LIST = 5268 SYS_GET_ROBUST_LIST = 5269 SYS_KEXEC_LOAD = 5270 SYS_GETCPU = 5271 SYS_EPOLL_PWAIT = 5272 SYS_IOPRIO_SET = 5273 SYS_IOPRIO_GET = 5274 SYS_UTIMENSAT = 5275 SYS_SIGNALFD = 5276 SYS_TIMERFD = 5277 SYS_EVENTFD = 5278 SYS_FALLOCATE = 5279 SYS_TIMERFD_CREATE = 5280 SYS_TIMERFD_GETTIME = 5281 SYS_TIMERFD_SETTIME = 5282 SYS_SIGNALFD4 = 5283 SYS_EVENTFD2 = 5284 SYS_EPOLL_CREATE1 = 5285 SYS_DUP3 = 5286 SYS_PIPE2 = 5287 SYS_INOTIFY_INIT1 = 5288 SYS_PREADV = 5289 SYS_PWRITEV = 5290 SYS_RT_TGSIGQUEUEINFO = 5291 SYS_PERF_EVENT_OPEN = 5292 SYS_ACCEPT4 = 5293 SYS_RECVMMSG = 5294 SYS_FANOTIFY_INIT = 5295 SYS_FANOTIFY_MARK = 5296 SYS_PRLIMIT64 = 5297 SYS_NAME_TO_HANDLE_AT = 5298 SYS_OPEN_BY_HANDLE_AT = 5299 SYS_CLOCK_ADJTIME = 5300 SYS_SYNCFS = 5301 SYS_SENDMMSG = 5302 SYS_SETNS = 5303 SYS_PROCESS_VM_READV = 5304 SYS_PROCESS_VM_WRITEV = 5305 SYS_KCMP = 5306 SYS_FINIT_MODULE = 5307 SYS_GETDENTS64 = 5308 SYS_SCHED_SETATTR = 5309 SYS_SCHED_GETATTR = 5310 SYS_RENAMEAT2 = 5311 SYS_SECCOMP = 5312 SYS_GETRANDOM = 5313 SYS_MEMFD_CREATE = 5314 SYS_BPF = 5315 SYS_EXECVEAT = 5316 SYS_USERFAULTFD = 5317 SYS_MEMBARRIER = 5318 SYS_MLOCK2 = 5319 SYS_COPY_FILE_RANGE = 5320 SYS_PREADV2 = 5321 SYS_PWRITEV2 = 5322 SYS_PKEY_MPROTECT = 5323 SYS_PKEY_ALLOC = 5324 SYS_PKEY_FREE = 5325 SYS_STATX = 5326 ) ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go ================================================ // linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. // +build mips64le,linux package unix const ( SYS_READ = 5000 SYS_WRITE = 5001 SYS_OPEN = 5002 SYS_CLOSE = 5003 SYS_STAT = 5004 SYS_FSTAT = 5005 SYS_LSTAT = 5006 SYS_POLL = 5007 SYS_LSEEK = 5008 SYS_MMAP = 5009 SYS_MPROTECT = 5010 SYS_MUNMAP = 5011 SYS_BRK = 5012 SYS_RT_SIGACTION = 5013 SYS_RT_SIGPROCMASK = 5014 SYS_IOCTL = 5015 SYS_PREAD64 = 5016 SYS_PWRITE64 = 5017 SYS_READV = 5018 SYS_WRITEV = 5019 SYS_ACCESS = 5020 SYS_PIPE = 5021 SYS__NEWSELECT = 5022 SYS_SCHED_YIELD = 5023 SYS_MREMAP = 5024 SYS_MSYNC = 5025 SYS_MINCORE = 5026 SYS_MADVISE = 5027 SYS_SHMGET = 5028 SYS_SHMAT = 5029 SYS_SHMCTL = 5030 SYS_DUP = 5031 SYS_DUP2 = 5032 SYS_PAUSE = 5033 SYS_NANOSLEEP = 5034 SYS_GETITIMER = 5035 SYS_SETITIMER = 5036 SYS_ALARM = 5037 SYS_GETPID = 5038 SYS_SENDFILE = 5039 SYS_SOCKET = 5040 SYS_CONNECT = 5041 SYS_ACCEPT = 5042 SYS_SENDTO = 5043 SYS_RECVFROM = 5044 SYS_SENDMSG = 5045 SYS_RECVMSG = 5046 SYS_SHUTDOWN = 5047 SYS_BIND = 5048 SYS_LISTEN = 5049 SYS_GETSOCKNAME = 5050 SYS_GETPEERNAME = 5051 SYS_SOCKETPAIR = 5052 SYS_SETSOCKOPT = 5053 SYS_GETSOCKOPT = 5054 SYS_CLONE = 5055 SYS_FORK = 5056 SYS_EXECVE = 5057 SYS_EXIT = 5058 SYS_WAIT4 = 5059 SYS_KILL = 5060 SYS_UNAME = 5061 SYS_SEMGET = 5062 SYS_SEMOP = 5063 SYS_SEMCTL = 5064 SYS_SHMDT = 5065 SYS_MSGGET = 5066 SYS_MSGSND = 5067 SYS_MSGRCV = 5068 SYS_MSGCTL = 5069 SYS_FCNTL = 5070 SYS_FLOCK = 5071 SYS_FSYNC = 5072 SYS_FDATASYNC = 5073 SYS_TRUNCATE = 5074 SYS_FTRUNCATE = 5075 SYS_GETDENTS = 5076 SYS_GETCWD = 5077 SYS_CHDIR = 5078 SYS_FCHDIR = 5079 SYS_RENAME = 5080 SYS_MKDIR = 5081 SYS_RMDIR = 5082 SYS_CREAT = 5083 SYS_LINK = 5084 SYS_UNLINK = 5085 SYS_SYMLINK = 5086 SYS_READLINK = 5087 SYS_CHMOD = 5088 SYS_FCHMOD = 5089 SYS_CHOWN = 5090 SYS_FCHOWN = 5091 SYS_LCHOWN = 5092 SYS_UMASK = 5093 SYS_GETTIMEOFDAY = 5094 SYS_GETRLIMIT = 5095 SYS_GETRUSAGE = 5096 SYS_SYSINFO = 5097 SYS_TIMES = 5098 SYS_PTRACE = 5099 SYS_GETUID = 5100 SYS_SYSLOG = 5101 SYS_GETGID = 5102 SYS_SETUID = 5103 SYS_SETGID = 5104 SYS_GETEUID = 5105 SYS_GETEGID = 5106 SYS_SETPGID = 5107 SYS_GETPPID = 5108 SYS_GETPGRP = 5109 SYS_SETSID = 5110 SYS_SETREUID = 5111 SYS_SETREGID = 5112 SYS_GETGROUPS = 5113 SYS_SETGROUPS = 5114 SYS_SETRESUID = 5115 SYS_GETRESUID = 5116 SYS_SETRESGID = 5117 SYS_GETRESGID = 5118 SYS_GETPGID = 5119 SYS_SETFSUID = 5120 SYS_SETFSGID = 5121 SYS_GETSID = 5122 SYS_CAPGET = 5123 SYS_CAPSET = 5124 SYS_RT_SIGPENDING = 5125 SYS_RT_SIGTIMEDWAIT = 5126 SYS_RT_SIGQUEUEINFO = 5127 SYS_RT_SIGSUSPEND = 5128 SYS_SIGALTSTACK = 5129 SYS_UTIME = 5130 SYS_MKNOD = 5131 SYS_PERSONALITY = 5132 SYS_USTAT = 5133 SYS_STATFS = 5134 SYS_FSTATFS = 5135 SYS_SYSFS = 5136 SYS_GETPRIORITY = 5137 SYS_SETPRIORITY = 5138 SYS_SCHED_SETPARAM = 5139 SYS_SCHED_GETPARAM = 5140 SYS_SCHED_SETSCHEDULER = 5141 SYS_SCHED_GETSCHEDULER = 5142 SYS_SCHED_GET_PRIORITY_MAX = 5143 SYS_SCHED_GET_PRIORITY_MIN = 5144 SYS_SCHED_RR_GET_INTERVAL = 5145 SYS_MLOCK = 5146 SYS_MUNLOCK = 5147 SYS_MLOCKALL = 5148 SYS_MUNLOCKALL = 5149 SYS_VHANGUP = 5150 SYS_PIVOT_ROOT = 5151 SYS__SYSCTL = 5152 SYS_PRCTL = 5153 SYS_ADJTIMEX = 5154 SYS_SETRLIMIT = 5155 SYS_CHROOT = 5156 SYS_SYNC = 5157 SYS_ACCT = 5158 SYS_SETTIMEOFDAY = 5159 SYS_MOUNT = 5160 SYS_UMOUNT2 = 5161 SYS_SWAPON = 5162 SYS_SWAPOFF = 5163 SYS_REBOOT = 5164 SYS_SETHOSTNAME = 5165 SYS_SETDOMAINNAME = 5166 SYS_CREATE_MODULE = 5167 SYS_INIT_MODULE = 5168 SYS_DELETE_MODULE = 5169 SYS_GET_KERNEL_SYMS = 5170 SYS_QUERY_MODULE = 5171 SYS_QUOTACTL = 5172 SYS_NFSSERVCTL = 5173 SYS_GETPMSG = 5174 SYS_PUTPMSG = 5175 SYS_AFS_SYSCALL = 5176 SYS_RESERVED177 = 5177 SYS_GETTID = 5178 SYS_READAHEAD = 5179 SYS_SETXATTR = 5180 SYS_LSETXATTR = 5181 SYS_FSETXATTR = 5182 SYS_GETXATTR = 5183 SYS_LGETXATTR = 5184 SYS_FGETXATTR = 5185 SYS_LISTXATTR = 5186 SYS_LLISTXATTR = 5187 SYS_FLISTXATTR = 5188 SYS_REMOVEXATTR = 5189 SYS_LREMOVEXATTR = 5190 SYS_FREMOVEXATTR = 5191 SYS_TKILL = 5192 SYS_RESERVED193 = 5193 SYS_FUTEX = 5194 SYS_SCHED_SETAFFINITY = 5195 SYS_SCHED_GETAFFINITY = 5196 SYS_CACHEFLUSH = 5197 SYS_CACHECTL = 5198 SYS_SYSMIPS = 5199 SYS_IO_SETUP = 5200 SYS_IO_DESTROY = 5201 SYS_IO_GETEVENTS = 5202 SYS_IO_SUBMIT = 5203 SYS_IO_CANCEL = 5204 SYS_EXIT_GROUP = 5205 SYS_LOOKUP_DCOOKIE = 5206 SYS_EPOLL_CREATE = 5207 SYS_EPOLL_CTL = 5208 SYS_EPOLL_WAIT = 5209 SYS_REMAP_FILE_PAGES = 5210 SYS_RT_SIGRETURN = 5211 SYS_SET_TID_ADDRESS = 5212 SYS_RESTART_SYSCALL = 5213 SYS_SEMTIMEDOP = 5214 SYS_FADVISE64 = 5215 SYS_TIMER_CREATE = 5216 SYS_TIMER_SETTIME = 5217 SYS_TIMER_GETTIME = 5218 SYS_TIMER_GETOVERRUN = 5219 SYS_TIMER_DELETE = 5220 SYS_CLOCK_SETTIME = 5221 SYS_CLOCK_GETTIME = 5222 SYS_CLOCK_GETRES = 5223 SYS_CLOCK_NANOSLEEP = 5224 SYS_TGKILL = 5225 SYS_UTIMES = 5226 SYS_MBIND = 5227 SYS_GET_MEMPOLICY = 5228 SYS_SET_MEMPOLICY = 5229 SYS_MQ_OPEN = 5230 SYS_MQ_UNLINK = 5231 SYS_MQ_TIMEDSEND = 5232 SYS_MQ_TIMEDRECEIVE = 5233 SYS_MQ_NOTIFY = 5234 SYS_MQ_GETSETATTR = 5235 SYS_VSERVER = 5236 SYS_WAITID = 5237 SYS_ADD_KEY = 5239 SYS_REQUEST_KEY = 5240 SYS_KEYCTL = 5241 SYS_SET_THREAD_AREA = 5242 SYS_INOTIFY_INIT = 5243 SYS_INOTIFY_ADD_WATCH = 5244 SYS_INOTIFY_RM_WATCH = 5245 SYS_MIGRATE_PAGES = 5246 SYS_OPENAT = 5247 SYS_MKDIRAT = 5248 SYS_MKNODAT = 5249 SYS_FCHOWNAT = 5250 SYS_FUTIMESAT = 5251 SYS_NEWFSTATAT = 5252 SYS_UNLINKAT = 5253 SYS_RENAMEAT = 5254 SYS_LINKAT = 5255 SYS_SYMLINKAT = 5256 SYS_READLINKAT = 5257 SYS_FCHMODAT = 5258 SYS_FACCESSAT = 5259 SYS_PSELECT6 = 5260 SYS_PPOLL = 5261 SYS_UNSHARE = 5262 SYS_SPLICE = 5263 SYS_SYNC_FILE_RANGE = 5264 SYS_TEE = 5265 SYS_VMSPLICE = 5266 SYS_MOVE_PAGES = 5267 SYS_SET_ROBUST_LIST = 5268 SYS_GET_ROBUST_LIST = 5269 SYS_KEXEC_LOAD = 5270 SYS_GETCPU = 5271 SYS_EPOLL_PWAIT = 5272 SYS_IOPRIO_SET = 5273 SYS_IOPRIO_GET = 5274 SYS_UTIMENSAT = 5275 SYS_SIGNALFD = 5276 SYS_TIMERFD = 5277 SYS_EVENTFD = 5278 SYS_FALLOCATE = 5279 SYS_TIMERFD_CREATE = 5280 SYS_TIMERFD_GETTIME = 5281 SYS_TIMERFD_SETTIME = 5282 SYS_SIGNALFD4 = 5283 SYS_EVENTFD2 = 5284 SYS_EPOLL_CREATE1 = 5285 SYS_DUP3 = 5286 SYS_PIPE2 = 5287 SYS_INOTIFY_INIT1 = 5288 SYS_PREADV = 5289 SYS_PWRITEV = 5290 SYS_RT_TGSIGQUEUEINFO = 5291 SYS_PERF_EVENT_OPEN = 5292 SYS_ACCEPT4 = 5293 SYS_RECVMMSG = 5294 SYS_FANOTIFY_INIT = 5295 SYS_FANOTIFY_MARK = 5296 SYS_PRLIMIT64 = 5297 SYS_NAME_TO_HANDLE_AT = 5298 SYS_OPEN_BY_HANDLE_AT = 5299 SYS_CLOCK_ADJTIME = 5300 SYS_SYNCFS = 5301 SYS_SENDMMSG = 5302 SYS_SETNS = 5303 SYS_PROCESS_VM_READV = 5304 SYS_PROCESS_VM_WRITEV = 5305 SYS_KCMP = 5306 SYS_FINIT_MODULE = 5307 SYS_GETDENTS64 = 5308 SYS_SCHED_SETATTR = 5309 SYS_SCHED_GETATTR = 5310 SYS_RENAMEAT2 = 5311 SYS_SECCOMP = 5312 SYS_GETRANDOM = 5313 SYS_MEMFD_CREATE = 5314 SYS_BPF = 5315 SYS_EXECVEAT = 5316 SYS_USERFAULTFD = 5317 SYS_MEMBARRIER = 5318 SYS_MLOCK2 = 5319 SYS_COPY_FILE_RANGE = 5320 SYS_PREADV2 = 5321 SYS_PWRITEV2 = 5322 SYS_PKEY_MPROTECT = 5323 SYS_PKEY_ALLOC = 5324 SYS_PKEY_FREE = 5325 SYS_STATX = 5326 ) ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go ================================================ // linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. // +build mipsle,linux package unix const ( SYS_SYSCALL = 4000 SYS_EXIT = 4001 SYS_FORK = 4002 SYS_READ = 4003 SYS_WRITE = 4004 SYS_OPEN = 4005 SYS_CLOSE = 4006 SYS_WAITPID = 4007 SYS_CREAT = 4008 SYS_LINK = 4009 SYS_UNLINK = 4010 SYS_EXECVE = 4011 SYS_CHDIR = 4012 SYS_TIME = 4013 SYS_MKNOD = 4014 SYS_CHMOD = 4015 SYS_LCHOWN = 4016 SYS_BREAK = 4017 SYS_UNUSED18 = 4018 SYS_LSEEK = 4019 SYS_GETPID = 4020 SYS_MOUNT = 4021 SYS_UMOUNT = 4022 SYS_SETUID = 4023 SYS_GETUID = 4024 SYS_STIME = 4025 SYS_PTRACE = 4026 SYS_ALARM = 4027 SYS_UNUSED28 = 4028 SYS_PAUSE = 4029 SYS_UTIME = 4030 SYS_STTY = 4031 SYS_GTTY = 4032 SYS_ACCESS = 4033 SYS_NICE = 4034 SYS_FTIME = 4035 SYS_SYNC = 4036 SYS_KILL = 4037 SYS_RENAME = 4038 SYS_MKDIR = 4039 SYS_RMDIR = 4040 SYS_DUP = 4041 SYS_PIPE = 4042 SYS_TIMES = 4043 SYS_PROF = 4044 SYS_BRK = 4045 SYS_SETGID = 4046 SYS_GETGID = 4047 SYS_SIGNAL = 4048 SYS_GETEUID = 4049 SYS_GETEGID = 4050 SYS_ACCT = 4051 SYS_UMOUNT2 = 4052 SYS_LOCK = 4053 SYS_IOCTL = 4054 SYS_FCNTL = 4055 SYS_MPX = 4056 SYS_SETPGID = 4057 SYS_ULIMIT = 4058 SYS_UNUSED59 = 4059 SYS_UMASK = 4060 SYS_CHROOT = 4061 SYS_USTAT = 4062 SYS_DUP2 = 4063 SYS_GETPPID = 4064 SYS_GETPGRP = 4065 SYS_SETSID = 4066 SYS_SIGACTION = 4067 SYS_SGETMASK = 4068 SYS_SSETMASK = 4069 SYS_SETREUID = 4070 SYS_SETREGID = 4071 SYS_SIGSUSPEND = 4072 SYS_SIGPENDING = 4073 SYS_SETHOSTNAME = 4074 SYS_SETRLIMIT = 4075 SYS_GETRLIMIT = 4076 SYS_GETRUSAGE = 4077 SYS_GETTIMEOFDAY = 4078 SYS_SETTIMEOFDAY = 4079 SYS_GETGROUPS = 4080 SYS_SETGROUPS = 4081 SYS_RESERVED82 = 4082 SYS_SYMLINK = 4083 SYS_UNUSED84 = 4084 SYS_READLINK = 4085 SYS_USELIB = 4086 SYS_SWAPON = 4087 SYS_REBOOT = 4088 SYS_READDIR = 4089 SYS_MMAP = 4090 SYS_MUNMAP = 4091 SYS_TRUNCATE = 4092 SYS_FTRUNCATE = 4093 SYS_FCHMOD = 4094 SYS_FCHOWN = 4095 SYS_GETPRIORITY = 4096 SYS_SETPRIORITY = 4097 SYS_PROFIL = 4098 SYS_STATFS = 4099 SYS_FSTATFS = 4100 SYS_IOPERM = 4101 SYS_SOCKETCALL = 4102 SYS_SYSLOG = 4103 SYS_SETITIMER = 4104 SYS_GETITIMER = 4105 SYS_STAT = 4106 SYS_LSTAT = 4107 SYS_FSTAT = 4108 SYS_UNUSED109 = 4109 SYS_IOPL = 4110 SYS_VHANGUP = 4111 SYS_IDLE = 4112 SYS_VM86 = 4113 SYS_WAIT4 = 4114 SYS_SWAPOFF = 4115 SYS_SYSINFO = 4116 SYS_IPC = 4117 SYS_FSYNC = 4118 SYS_SIGRETURN = 4119 SYS_CLONE = 4120 SYS_SETDOMAINNAME = 4121 SYS_UNAME = 4122 SYS_MODIFY_LDT = 4123 SYS_ADJTIMEX = 4124 SYS_MPROTECT = 4125 SYS_SIGPROCMASK = 4126 SYS_CREATE_MODULE = 4127 SYS_INIT_MODULE = 4128 SYS_DELETE_MODULE = 4129 SYS_GET_KERNEL_SYMS = 4130 SYS_QUOTACTL = 4131 SYS_GETPGID = 4132 SYS_FCHDIR = 4133 SYS_BDFLUSH = 4134 SYS_SYSFS = 4135 SYS_PERSONALITY = 4136 SYS_AFS_SYSCALL = 4137 SYS_SETFSUID = 4138 SYS_SETFSGID = 4139 SYS__LLSEEK = 4140 SYS_GETDENTS = 4141 SYS__NEWSELECT = 4142 SYS_FLOCK = 4143 SYS_MSYNC = 4144 SYS_READV = 4145 SYS_WRITEV = 4146 SYS_CACHEFLUSH = 4147 SYS_CACHECTL = 4148 SYS_SYSMIPS = 4149 SYS_UNUSED150 = 4150 SYS_GETSID = 4151 SYS_FDATASYNC = 4152 SYS__SYSCTL = 4153 SYS_MLOCK = 4154 SYS_MUNLOCK = 4155 SYS_MLOCKALL = 4156 SYS_MUNLOCKALL = 4157 SYS_SCHED_SETPARAM = 4158 SYS_SCHED_GETPARAM = 4159 SYS_SCHED_SETSCHEDULER = 4160 SYS_SCHED_GETSCHEDULER = 4161 SYS_SCHED_YIELD = 4162 SYS_SCHED_GET_PRIORITY_MAX = 4163 SYS_SCHED_GET_PRIORITY_MIN = 4164 SYS_SCHED_RR_GET_INTERVAL = 4165 SYS_NANOSLEEP = 4166 SYS_MREMAP = 4167 SYS_ACCEPT = 4168 SYS_BIND = 4169 SYS_CONNECT = 4170 SYS_GETPEERNAME = 4171 SYS_GETSOCKNAME = 4172 SYS_GETSOCKOPT = 4173 SYS_LISTEN = 4174 SYS_RECV = 4175 SYS_RECVFROM = 4176 SYS_RECVMSG = 4177 SYS_SEND = 4178 SYS_SENDMSG = 4179 SYS_SENDTO = 4180 SYS_SETSOCKOPT = 4181 SYS_SHUTDOWN = 4182 SYS_SOCKET = 4183 SYS_SOCKETPAIR = 4184 SYS_SETRESUID = 4185 SYS_GETRESUID = 4186 SYS_QUERY_MODULE = 4187 SYS_POLL = 4188 SYS_NFSSERVCTL = 4189 SYS_SETRESGID = 4190 SYS_GETRESGID = 4191 SYS_PRCTL = 4192 SYS_RT_SIGRETURN = 4193 SYS_RT_SIGACTION = 4194 SYS_RT_SIGPROCMASK = 4195 SYS_RT_SIGPENDING = 4196 SYS_RT_SIGTIMEDWAIT = 4197 SYS_RT_SIGQUEUEINFO = 4198 SYS_RT_SIGSUSPEND = 4199 SYS_PREAD64 = 4200 SYS_PWRITE64 = 4201 SYS_CHOWN = 4202 SYS_GETCWD = 4203 SYS_CAPGET = 4204 SYS_CAPSET = 4205 SYS_SIGALTSTACK = 4206 SYS_SENDFILE = 4207 SYS_GETPMSG = 4208 SYS_PUTPMSG = 4209 SYS_MMAP2 = 4210 SYS_TRUNCATE64 = 4211 SYS_FTRUNCATE64 = 4212 SYS_STAT64 = 4213 SYS_LSTAT64 = 4214 SYS_FSTAT64 = 4215 SYS_PIVOT_ROOT = 4216 SYS_MINCORE = 4217 SYS_MADVISE = 4218 SYS_GETDENTS64 = 4219 SYS_FCNTL64 = 4220 SYS_RESERVED221 = 4221 SYS_GETTID = 4222 SYS_READAHEAD = 4223 SYS_SETXATTR = 4224 SYS_LSETXATTR = 4225 SYS_FSETXATTR = 4226 SYS_GETXATTR = 4227 SYS_LGETXATTR = 4228 SYS_FGETXATTR = 4229 SYS_LISTXATTR = 4230 SYS_LLISTXATTR = 4231 SYS_FLISTXATTR = 4232 SYS_REMOVEXATTR = 4233 SYS_LREMOVEXATTR = 4234 SYS_FREMOVEXATTR = 4235 SYS_TKILL = 4236 SYS_SENDFILE64 = 4237 SYS_FUTEX = 4238 SYS_SCHED_SETAFFINITY = 4239 SYS_SCHED_GETAFFINITY = 4240 SYS_IO_SETUP = 4241 SYS_IO_DESTROY = 4242 SYS_IO_GETEVENTS = 4243 SYS_IO_SUBMIT = 4244 SYS_IO_CANCEL = 4245 SYS_EXIT_GROUP = 4246 SYS_LOOKUP_DCOOKIE = 4247 SYS_EPOLL_CREATE = 4248 SYS_EPOLL_CTL = 4249 SYS_EPOLL_WAIT = 4250 SYS_REMAP_FILE_PAGES = 4251 SYS_SET_TID_ADDRESS = 4252 SYS_RESTART_SYSCALL = 4253 SYS_FADVISE64 = 4254 SYS_STATFS64 = 4255 SYS_FSTATFS64 = 4256 SYS_TIMER_CREATE = 4257 SYS_TIMER_SETTIME = 4258 SYS_TIMER_GETTIME = 4259 SYS_TIMER_GETOVERRUN = 4260 SYS_TIMER_DELETE = 4261 SYS_CLOCK_SETTIME = 4262 SYS_CLOCK_GETTIME = 4263 SYS_CLOCK_GETRES = 4264 SYS_CLOCK_NANOSLEEP = 4265 SYS_TGKILL = 4266 SYS_UTIMES = 4267 SYS_MBIND = 4268 SYS_GET_MEMPOLICY = 4269 SYS_SET_MEMPOLICY = 4270 SYS_MQ_OPEN = 4271 SYS_MQ_UNLINK = 4272 SYS_MQ_TIMEDSEND = 4273 SYS_MQ_TIMEDRECEIVE = 4274 SYS_MQ_NOTIFY = 4275 SYS_MQ_GETSETATTR = 4276 SYS_VSERVER = 4277 SYS_WAITID = 4278 SYS_ADD_KEY = 4280 SYS_REQUEST_KEY = 4281 SYS_KEYCTL = 4282 SYS_SET_THREAD_AREA = 4283 SYS_INOTIFY_INIT = 4284 SYS_INOTIFY_ADD_WATCH = 4285 SYS_INOTIFY_RM_WATCH = 4286 SYS_MIGRATE_PAGES = 4287 SYS_OPENAT = 4288 SYS_MKDIRAT = 4289 SYS_MKNODAT = 4290 SYS_FCHOWNAT = 4291 SYS_FUTIMESAT = 4292 SYS_FSTATAT64 = 4293 SYS_UNLINKAT = 4294 SYS_RENAMEAT = 4295 SYS_LINKAT = 4296 SYS_SYMLINKAT = 4297 SYS_READLINKAT = 4298 SYS_FCHMODAT = 4299 SYS_FACCESSAT = 4300 SYS_PSELECT6 = 4301 SYS_PPOLL = 4302 SYS_UNSHARE = 4303 SYS_SPLICE = 4304 SYS_SYNC_FILE_RANGE = 4305 SYS_TEE = 4306 SYS_VMSPLICE = 4307 SYS_MOVE_PAGES = 4308 SYS_SET_ROBUST_LIST = 4309 SYS_GET_ROBUST_LIST = 4310 SYS_KEXEC_LOAD = 4311 SYS_GETCPU = 4312 SYS_EPOLL_PWAIT = 4313 SYS_IOPRIO_SET = 4314 SYS_IOPRIO_GET = 4315 SYS_UTIMENSAT = 4316 SYS_SIGNALFD = 4317 SYS_TIMERFD = 4318 SYS_EVENTFD = 4319 SYS_FALLOCATE = 4320 SYS_TIMERFD_CREATE = 4321 SYS_TIMERFD_GETTIME = 4322 SYS_TIMERFD_SETTIME = 4323 SYS_SIGNALFD4 = 4324 SYS_EVENTFD2 = 4325 SYS_EPOLL_CREATE1 = 4326 SYS_DUP3 = 4327 SYS_PIPE2 = 4328 SYS_INOTIFY_INIT1 = 4329 SYS_PREADV = 4330 SYS_PWRITEV = 4331 SYS_RT_TGSIGQUEUEINFO = 4332 SYS_PERF_EVENT_OPEN = 4333 SYS_ACCEPT4 = 4334 SYS_RECVMMSG = 4335 SYS_FANOTIFY_INIT = 4336 SYS_FANOTIFY_MARK = 4337 SYS_PRLIMIT64 = 4338 SYS_NAME_TO_HANDLE_AT = 4339 SYS_OPEN_BY_HANDLE_AT = 4340 SYS_CLOCK_ADJTIME = 4341 SYS_SYNCFS = 4342 SYS_SENDMMSG = 4343 SYS_SETNS = 4344 SYS_PROCESS_VM_READV = 4345 SYS_PROCESS_VM_WRITEV = 4346 SYS_KCMP = 4347 SYS_FINIT_MODULE = 4348 SYS_SCHED_SETATTR = 4349 SYS_SCHED_GETATTR = 4350 SYS_RENAMEAT2 = 4351 SYS_SECCOMP = 4352 SYS_GETRANDOM = 4353 SYS_MEMFD_CREATE = 4354 SYS_BPF = 4355 SYS_EXECVEAT = 4356 SYS_USERFAULTFD = 4357 SYS_MEMBARRIER = 4358 SYS_MLOCK2 = 4359 SYS_COPY_FILE_RANGE = 4360 SYS_PREADV2 = 4361 SYS_PWRITEV2 = 4362 SYS_PKEY_MPROTECT = 4363 SYS_PKEY_ALLOC = 4364 SYS_PKEY_FREE = 4365 SYS_STATX = 4366 ) ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go ================================================ // linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. // +build ppc64,linux package unix const ( SYS_RESTART_SYSCALL = 0 SYS_EXIT = 1 SYS_FORK = 2 SYS_READ = 3 SYS_WRITE = 4 SYS_OPEN = 5 SYS_CLOSE = 6 SYS_WAITPID = 7 SYS_CREAT = 8 SYS_LINK = 9 SYS_UNLINK = 10 SYS_EXECVE = 11 SYS_CHDIR = 12 SYS_TIME = 13 SYS_MKNOD = 14 SYS_CHMOD = 15 SYS_LCHOWN = 16 SYS_BREAK = 17 SYS_OLDSTAT = 18 SYS_LSEEK = 19 SYS_GETPID = 20 SYS_MOUNT = 21 SYS_UMOUNT = 22 SYS_SETUID = 23 SYS_GETUID = 24 SYS_STIME = 25 SYS_PTRACE = 26 SYS_ALARM = 27 SYS_OLDFSTAT = 28 SYS_PAUSE = 29 SYS_UTIME = 30 SYS_STTY = 31 SYS_GTTY = 32 SYS_ACCESS = 33 SYS_NICE = 34 SYS_FTIME = 35 SYS_SYNC = 36 SYS_KILL = 37 SYS_RENAME = 38 SYS_MKDIR = 39 SYS_RMDIR = 40 SYS_DUP = 41 SYS_PIPE = 42 SYS_TIMES = 43 SYS_PROF = 44 SYS_BRK = 45 SYS_SETGID = 46 SYS_GETGID = 47 SYS_SIGNAL = 48 SYS_GETEUID = 49 SYS_GETEGID = 50 SYS_ACCT = 51 SYS_UMOUNT2 = 52 SYS_LOCK = 53 SYS_IOCTL = 54 SYS_FCNTL = 55 SYS_MPX = 56 SYS_SETPGID = 57 SYS_ULIMIT = 58 SYS_OLDOLDUNAME = 59 SYS_UMASK = 60 SYS_CHROOT = 61 SYS_USTAT = 62 SYS_DUP2 = 63 SYS_GETPPID = 64 SYS_GETPGRP = 65 SYS_SETSID = 66 SYS_SIGACTION = 67 SYS_SGETMASK = 68 SYS_SSETMASK = 69 SYS_SETREUID = 70 SYS_SETREGID = 71 SYS_SIGSUSPEND = 72 SYS_SIGPENDING = 73 SYS_SETHOSTNAME = 74 SYS_SETRLIMIT = 75 SYS_GETRLIMIT = 76 SYS_GETRUSAGE = 77 SYS_GETTIMEOFDAY = 78 SYS_SETTIMEOFDAY = 79 SYS_GETGROUPS = 80 SYS_SETGROUPS = 81 SYS_SELECT = 82 SYS_SYMLINK = 83 SYS_OLDLSTAT = 84 SYS_READLINK = 85 SYS_USELIB = 86 SYS_SWAPON = 87 SYS_REBOOT = 88 SYS_READDIR = 89 SYS_MMAP = 90 SYS_MUNMAP = 91 SYS_TRUNCATE = 92 SYS_FTRUNCATE = 93 SYS_FCHMOD = 94 SYS_FCHOWN = 95 SYS_GETPRIORITY = 96 SYS_SETPRIORITY = 97 SYS_PROFIL = 98 SYS_STATFS = 99 SYS_FSTATFS = 100 SYS_IOPERM = 101 SYS_SOCKETCALL = 102 SYS_SYSLOG = 103 SYS_SETITIMER = 104 SYS_GETITIMER = 105 SYS_STAT = 106 SYS_LSTAT = 107 SYS_FSTAT = 108 SYS_OLDUNAME = 109 SYS_IOPL = 110 SYS_VHANGUP = 111 SYS_IDLE = 112 SYS_VM86 = 113 SYS_WAIT4 = 114 SYS_SWAPOFF = 115 SYS_SYSINFO = 116 SYS_IPC = 117 SYS_FSYNC = 118 SYS_SIGRETURN = 119 SYS_CLONE = 120 SYS_SETDOMAINNAME = 121 SYS_UNAME = 122 SYS_MODIFY_LDT = 123 SYS_ADJTIMEX = 124 SYS_MPROTECT = 125 SYS_SIGPROCMASK = 126 SYS_CREATE_MODULE = 127 SYS_INIT_MODULE = 128 SYS_DELETE_MODULE = 129 SYS_GET_KERNEL_SYMS = 130 SYS_QUOTACTL = 131 SYS_GETPGID = 132 SYS_FCHDIR = 133 SYS_BDFLUSH = 134 SYS_SYSFS = 135 SYS_PERSONALITY = 136 SYS_AFS_SYSCALL = 137 SYS_SETFSUID = 138 SYS_SETFSGID = 139 SYS__LLSEEK = 140 SYS_GETDENTS = 141 SYS__NEWSELECT = 142 SYS_FLOCK = 143 SYS_MSYNC = 144 SYS_READV = 145 SYS_WRITEV = 146 SYS_GETSID = 147 SYS_FDATASYNC = 148 SYS__SYSCTL = 149 SYS_MLOCK = 150 SYS_MUNLOCK = 151 SYS_MLOCKALL = 152 SYS_MUNLOCKALL = 153 SYS_SCHED_SETPARAM = 154 SYS_SCHED_GETPARAM = 155 SYS_SCHED_SETSCHEDULER = 156 SYS_SCHED_GETSCHEDULER = 157 SYS_SCHED_YIELD = 158 SYS_SCHED_GET_PRIORITY_MAX = 159 SYS_SCHED_GET_PRIORITY_MIN = 160 SYS_SCHED_RR_GET_INTERVAL = 161 SYS_NANOSLEEP = 162 SYS_MREMAP = 163 SYS_SETRESUID = 164 SYS_GETRESUID = 165 SYS_QUERY_MODULE = 166 SYS_POLL = 167 SYS_NFSSERVCTL = 168 SYS_SETRESGID = 169 SYS_GETRESGID = 170 SYS_PRCTL = 171 SYS_RT_SIGRETURN = 172 SYS_RT_SIGACTION = 173 SYS_RT_SIGPROCMASK = 174 SYS_RT_SIGPENDING = 175 SYS_RT_SIGTIMEDWAIT = 176 SYS_RT_SIGQUEUEINFO = 177 SYS_RT_SIGSUSPEND = 178 SYS_PREAD64 = 179 SYS_PWRITE64 = 180 SYS_CHOWN = 181 SYS_GETCWD = 182 SYS_CAPGET = 183 SYS_CAPSET = 184 SYS_SIGALTSTACK = 185 SYS_SENDFILE = 186 SYS_GETPMSG = 187 SYS_PUTPMSG = 188 SYS_VFORK = 189 SYS_UGETRLIMIT = 190 SYS_READAHEAD = 191 SYS_PCICONFIG_READ = 198 SYS_PCICONFIG_WRITE = 199 SYS_PCICONFIG_IOBASE = 200 SYS_MULTIPLEXER = 201 SYS_GETDENTS64 = 202 SYS_PIVOT_ROOT = 203 SYS_MADVISE = 205 SYS_MINCORE = 206 SYS_GETTID = 207 SYS_TKILL = 208 SYS_SETXATTR = 209 SYS_LSETXATTR = 210 SYS_FSETXATTR = 211 SYS_GETXATTR = 212 SYS_LGETXATTR = 213 SYS_FGETXATTR = 214 SYS_LISTXATTR = 215 SYS_LLISTXATTR = 216 SYS_FLISTXATTR = 217 SYS_REMOVEXATTR = 218 SYS_LREMOVEXATTR = 219 SYS_FREMOVEXATTR = 220 SYS_FUTEX = 221 SYS_SCHED_SETAFFINITY = 222 SYS_SCHED_GETAFFINITY = 223 SYS_TUXCALL = 225 SYS_IO_SETUP = 227 SYS_IO_DESTROY = 228 SYS_IO_GETEVENTS = 229 SYS_IO_SUBMIT = 230 SYS_IO_CANCEL = 231 SYS_SET_TID_ADDRESS = 232 SYS_FADVISE64 = 233 SYS_EXIT_GROUP = 234 SYS_LOOKUP_DCOOKIE = 235 SYS_EPOLL_CREATE = 236 SYS_EPOLL_CTL = 237 SYS_EPOLL_WAIT = 238 SYS_REMAP_FILE_PAGES = 239 SYS_TIMER_CREATE = 240 SYS_TIMER_SETTIME = 241 SYS_TIMER_GETTIME = 242 SYS_TIMER_GETOVERRUN = 243 SYS_TIMER_DELETE = 244 SYS_CLOCK_SETTIME = 245 SYS_CLOCK_GETTIME = 246 SYS_CLOCK_GETRES = 247 SYS_CLOCK_NANOSLEEP = 248 SYS_SWAPCONTEXT = 249 SYS_TGKILL = 250 SYS_UTIMES = 251 SYS_STATFS64 = 252 SYS_FSTATFS64 = 253 SYS_RTAS = 255 SYS_SYS_DEBUG_SETCONTEXT = 256 SYS_MIGRATE_PAGES = 258 SYS_MBIND = 259 SYS_GET_MEMPOLICY = 260 SYS_SET_MEMPOLICY = 261 SYS_MQ_OPEN = 262 SYS_MQ_UNLINK = 263 SYS_MQ_TIMEDSEND = 264 SYS_MQ_TIMEDRECEIVE = 265 SYS_MQ_NOTIFY = 266 SYS_MQ_GETSETATTR = 267 SYS_KEXEC_LOAD = 268 SYS_ADD_KEY = 269 SYS_REQUEST_KEY = 270 SYS_KEYCTL = 271 SYS_WAITID = 272 SYS_IOPRIO_SET = 273 SYS_IOPRIO_GET = 274 SYS_INOTIFY_INIT = 275 SYS_INOTIFY_ADD_WATCH = 276 SYS_INOTIFY_RM_WATCH = 277 SYS_SPU_RUN = 278 SYS_SPU_CREATE = 279 SYS_PSELECT6 = 280 SYS_PPOLL = 281 SYS_UNSHARE = 282 SYS_SPLICE = 283 SYS_TEE = 284 SYS_VMSPLICE = 285 SYS_OPENAT = 286 SYS_MKDIRAT = 287 SYS_MKNODAT = 288 SYS_FCHOWNAT = 289 SYS_FUTIMESAT = 290 SYS_NEWFSTATAT = 291 SYS_UNLINKAT = 292 SYS_RENAMEAT = 293 SYS_LINKAT = 294 SYS_SYMLINKAT = 295 SYS_READLINKAT = 296 SYS_FCHMODAT = 297 SYS_FACCESSAT = 298 SYS_GET_ROBUST_LIST = 299 SYS_SET_ROBUST_LIST = 300 SYS_MOVE_PAGES = 301 SYS_GETCPU = 302 SYS_EPOLL_PWAIT = 303 SYS_UTIMENSAT = 304 SYS_SIGNALFD = 305 SYS_TIMERFD_CREATE = 306 SYS_EVENTFD = 307 SYS_SYNC_FILE_RANGE2 = 308 SYS_FALLOCATE = 309 SYS_SUBPAGE_PROT = 310 SYS_TIMERFD_SETTIME = 311 SYS_TIMERFD_GETTIME = 312 SYS_SIGNALFD4 = 313 SYS_EVENTFD2 = 314 SYS_EPOLL_CREATE1 = 315 SYS_DUP3 = 316 SYS_PIPE2 = 317 SYS_INOTIFY_INIT1 = 318 SYS_PERF_EVENT_OPEN = 319 SYS_PREADV = 320 SYS_PWRITEV = 321 SYS_RT_TGSIGQUEUEINFO = 322 SYS_FANOTIFY_INIT = 323 SYS_FANOTIFY_MARK = 324 SYS_PRLIMIT64 = 325 SYS_SOCKET = 326 SYS_BIND = 327 SYS_CONNECT = 328 SYS_LISTEN = 329 SYS_ACCEPT = 330 SYS_GETSOCKNAME = 331 SYS_GETPEERNAME = 332 SYS_SOCKETPAIR = 333 SYS_SEND = 334 SYS_SENDTO = 335 SYS_RECV = 336 SYS_RECVFROM = 337 SYS_SHUTDOWN = 338 SYS_SETSOCKOPT = 339 SYS_GETSOCKOPT = 340 SYS_SENDMSG = 341 SYS_RECVMSG = 342 SYS_RECVMMSG = 343 SYS_ACCEPT4 = 344 SYS_NAME_TO_HANDLE_AT = 345 SYS_OPEN_BY_HANDLE_AT = 346 SYS_CLOCK_ADJTIME = 347 SYS_SYNCFS = 348 SYS_SENDMMSG = 349 SYS_SETNS = 350 SYS_PROCESS_VM_READV = 351 SYS_PROCESS_VM_WRITEV = 352 SYS_FINIT_MODULE = 353 SYS_KCMP = 354 SYS_SCHED_SETATTR = 355 SYS_SCHED_GETATTR = 356 SYS_RENAMEAT2 = 357 SYS_SECCOMP = 358 SYS_GETRANDOM = 359 SYS_MEMFD_CREATE = 360 SYS_BPF = 361 SYS_EXECVEAT = 362 SYS_SWITCH_ENDIAN = 363 SYS_USERFAULTFD = 364 SYS_MEMBARRIER = 365 SYS_MLOCK2 = 378 SYS_COPY_FILE_RANGE = 379 SYS_PREADV2 = 380 SYS_PWRITEV2 = 381 SYS_KEXEC_FILE_LOAD = 382 SYS_STATX = 383 ) ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go ================================================ // linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. // +build ppc64le,linux package unix const ( SYS_RESTART_SYSCALL = 0 SYS_EXIT = 1 SYS_FORK = 2 SYS_READ = 3 SYS_WRITE = 4 SYS_OPEN = 5 SYS_CLOSE = 6 SYS_WAITPID = 7 SYS_CREAT = 8 SYS_LINK = 9 SYS_UNLINK = 10 SYS_EXECVE = 11 SYS_CHDIR = 12 SYS_TIME = 13 SYS_MKNOD = 14 SYS_CHMOD = 15 SYS_LCHOWN = 16 SYS_BREAK = 17 SYS_OLDSTAT = 18 SYS_LSEEK = 19 SYS_GETPID = 20 SYS_MOUNT = 21 SYS_UMOUNT = 22 SYS_SETUID = 23 SYS_GETUID = 24 SYS_STIME = 25 SYS_PTRACE = 26 SYS_ALARM = 27 SYS_OLDFSTAT = 28 SYS_PAUSE = 29 SYS_UTIME = 30 SYS_STTY = 31 SYS_GTTY = 32 SYS_ACCESS = 33 SYS_NICE = 34 SYS_FTIME = 35 SYS_SYNC = 36 SYS_KILL = 37 SYS_RENAME = 38 SYS_MKDIR = 39 SYS_RMDIR = 40 SYS_DUP = 41 SYS_PIPE = 42 SYS_TIMES = 43 SYS_PROF = 44 SYS_BRK = 45 SYS_SETGID = 46 SYS_GETGID = 47 SYS_SIGNAL = 48 SYS_GETEUID = 49 SYS_GETEGID = 50 SYS_ACCT = 51 SYS_UMOUNT2 = 52 SYS_LOCK = 53 SYS_IOCTL = 54 SYS_FCNTL = 55 SYS_MPX = 56 SYS_SETPGID = 57 SYS_ULIMIT = 58 SYS_OLDOLDUNAME = 59 SYS_UMASK = 60 SYS_CHROOT = 61 SYS_USTAT = 62 SYS_DUP2 = 63 SYS_GETPPID = 64 SYS_GETPGRP = 65 SYS_SETSID = 66 SYS_SIGACTION = 67 SYS_SGETMASK = 68 SYS_SSETMASK = 69 SYS_SETREUID = 70 SYS_SETREGID = 71 SYS_SIGSUSPEND = 72 SYS_SIGPENDING = 73 SYS_SETHOSTNAME = 74 SYS_SETRLIMIT = 75 SYS_GETRLIMIT = 76 SYS_GETRUSAGE = 77 SYS_GETTIMEOFDAY = 78 SYS_SETTIMEOFDAY = 79 SYS_GETGROUPS = 80 SYS_SETGROUPS = 81 SYS_SELECT = 82 SYS_SYMLINK = 83 SYS_OLDLSTAT = 84 SYS_READLINK = 85 SYS_USELIB = 86 SYS_SWAPON = 87 SYS_REBOOT = 88 SYS_READDIR = 89 SYS_MMAP = 90 SYS_MUNMAP = 91 SYS_TRUNCATE = 92 SYS_FTRUNCATE = 93 SYS_FCHMOD = 94 SYS_FCHOWN = 95 SYS_GETPRIORITY = 96 SYS_SETPRIORITY = 97 SYS_PROFIL = 98 SYS_STATFS = 99 SYS_FSTATFS = 100 SYS_IOPERM = 101 SYS_SOCKETCALL = 102 SYS_SYSLOG = 103 SYS_SETITIMER = 104 SYS_GETITIMER = 105 SYS_STAT = 106 SYS_LSTAT = 107 SYS_FSTAT = 108 SYS_OLDUNAME = 109 SYS_IOPL = 110 SYS_VHANGUP = 111 SYS_IDLE = 112 SYS_VM86 = 113 SYS_WAIT4 = 114 SYS_SWAPOFF = 115 SYS_SYSINFO = 116 SYS_IPC = 117 SYS_FSYNC = 118 SYS_SIGRETURN = 119 SYS_CLONE = 120 SYS_SETDOMAINNAME = 121 SYS_UNAME = 122 SYS_MODIFY_LDT = 123 SYS_ADJTIMEX = 124 SYS_MPROTECT = 125 SYS_SIGPROCMASK = 126 SYS_CREATE_MODULE = 127 SYS_INIT_MODULE = 128 SYS_DELETE_MODULE = 129 SYS_GET_KERNEL_SYMS = 130 SYS_QUOTACTL = 131 SYS_GETPGID = 132 SYS_FCHDIR = 133 SYS_BDFLUSH = 134 SYS_SYSFS = 135 SYS_PERSONALITY = 136 SYS_AFS_SYSCALL = 137 SYS_SETFSUID = 138 SYS_SETFSGID = 139 SYS__LLSEEK = 140 SYS_GETDENTS = 141 SYS__NEWSELECT = 142 SYS_FLOCK = 143 SYS_MSYNC = 144 SYS_READV = 145 SYS_WRITEV = 146 SYS_GETSID = 147 SYS_FDATASYNC = 148 SYS__SYSCTL = 149 SYS_MLOCK = 150 SYS_MUNLOCK = 151 SYS_MLOCKALL = 152 SYS_MUNLOCKALL = 153 SYS_SCHED_SETPARAM = 154 SYS_SCHED_GETPARAM = 155 SYS_SCHED_SETSCHEDULER = 156 SYS_SCHED_GETSCHEDULER = 157 SYS_SCHED_YIELD = 158 SYS_SCHED_GET_PRIORITY_MAX = 159 SYS_SCHED_GET_PRIORITY_MIN = 160 SYS_SCHED_RR_GET_INTERVAL = 161 SYS_NANOSLEEP = 162 SYS_MREMAP = 163 SYS_SETRESUID = 164 SYS_GETRESUID = 165 SYS_QUERY_MODULE = 166 SYS_POLL = 167 SYS_NFSSERVCTL = 168 SYS_SETRESGID = 169 SYS_GETRESGID = 170 SYS_PRCTL = 171 SYS_RT_SIGRETURN = 172 SYS_RT_SIGACTION = 173 SYS_RT_SIGPROCMASK = 174 SYS_RT_SIGPENDING = 175 SYS_RT_SIGTIMEDWAIT = 176 SYS_RT_SIGQUEUEINFO = 177 SYS_RT_SIGSUSPEND = 178 SYS_PREAD64 = 179 SYS_PWRITE64 = 180 SYS_CHOWN = 181 SYS_GETCWD = 182 SYS_CAPGET = 183 SYS_CAPSET = 184 SYS_SIGALTSTACK = 185 SYS_SENDFILE = 186 SYS_GETPMSG = 187 SYS_PUTPMSG = 188 SYS_VFORK = 189 SYS_UGETRLIMIT = 190 SYS_READAHEAD = 191 SYS_PCICONFIG_READ = 198 SYS_PCICONFIG_WRITE = 199 SYS_PCICONFIG_IOBASE = 200 SYS_MULTIPLEXER = 201 SYS_GETDENTS64 = 202 SYS_PIVOT_ROOT = 203 SYS_MADVISE = 205 SYS_MINCORE = 206 SYS_GETTID = 207 SYS_TKILL = 208 SYS_SETXATTR = 209 SYS_LSETXATTR = 210 SYS_FSETXATTR = 211 SYS_GETXATTR = 212 SYS_LGETXATTR = 213 SYS_FGETXATTR = 214 SYS_LISTXATTR = 215 SYS_LLISTXATTR = 216 SYS_FLISTXATTR = 217 SYS_REMOVEXATTR = 218 SYS_LREMOVEXATTR = 219 SYS_FREMOVEXATTR = 220 SYS_FUTEX = 221 SYS_SCHED_SETAFFINITY = 222 SYS_SCHED_GETAFFINITY = 223 SYS_TUXCALL = 225 SYS_IO_SETUP = 227 SYS_IO_DESTROY = 228 SYS_IO_GETEVENTS = 229 SYS_IO_SUBMIT = 230 SYS_IO_CANCEL = 231 SYS_SET_TID_ADDRESS = 232 SYS_FADVISE64 = 233 SYS_EXIT_GROUP = 234 SYS_LOOKUP_DCOOKIE = 235 SYS_EPOLL_CREATE = 236 SYS_EPOLL_CTL = 237 SYS_EPOLL_WAIT = 238 SYS_REMAP_FILE_PAGES = 239 SYS_TIMER_CREATE = 240 SYS_TIMER_SETTIME = 241 SYS_TIMER_GETTIME = 242 SYS_TIMER_GETOVERRUN = 243 SYS_TIMER_DELETE = 244 SYS_CLOCK_SETTIME = 245 SYS_CLOCK_GETTIME = 246 SYS_CLOCK_GETRES = 247 SYS_CLOCK_NANOSLEEP = 248 SYS_SWAPCONTEXT = 249 SYS_TGKILL = 250 SYS_UTIMES = 251 SYS_STATFS64 = 252 SYS_FSTATFS64 = 253 SYS_RTAS = 255 SYS_SYS_DEBUG_SETCONTEXT = 256 SYS_MIGRATE_PAGES = 258 SYS_MBIND = 259 SYS_GET_MEMPOLICY = 260 SYS_SET_MEMPOLICY = 261 SYS_MQ_OPEN = 262 SYS_MQ_UNLINK = 263 SYS_MQ_TIMEDSEND = 264 SYS_MQ_TIMEDRECEIVE = 265 SYS_MQ_NOTIFY = 266 SYS_MQ_GETSETATTR = 267 SYS_KEXEC_LOAD = 268 SYS_ADD_KEY = 269 SYS_REQUEST_KEY = 270 SYS_KEYCTL = 271 SYS_WAITID = 272 SYS_IOPRIO_SET = 273 SYS_IOPRIO_GET = 274 SYS_INOTIFY_INIT = 275 SYS_INOTIFY_ADD_WATCH = 276 SYS_INOTIFY_RM_WATCH = 277 SYS_SPU_RUN = 278 SYS_SPU_CREATE = 279 SYS_PSELECT6 = 280 SYS_PPOLL = 281 SYS_UNSHARE = 282 SYS_SPLICE = 283 SYS_TEE = 284 SYS_VMSPLICE = 285 SYS_OPENAT = 286 SYS_MKDIRAT = 287 SYS_MKNODAT = 288 SYS_FCHOWNAT = 289 SYS_FUTIMESAT = 290 SYS_NEWFSTATAT = 291 SYS_UNLINKAT = 292 SYS_RENAMEAT = 293 SYS_LINKAT = 294 SYS_SYMLINKAT = 295 SYS_READLINKAT = 296 SYS_FCHMODAT = 297 SYS_FACCESSAT = 298 SYS_GET_ROBUST_LIST = 299 SYS_SET_ROBUST_LIST = 300 SYS_MOVE_PAGES = 301 SYS_GETCPU = 302 SYS_EPOLL_PWAIT = 303 SYS_UTIMENSAT = 304 SYS_SIGNALFD = 305 SYS_TIMERFD_CREATE = 306 SYS_EVENTFD = 307 SYS_SYNC_FILE_RANGE2 = 308 SYS_FALLOCATE = 309 SYS_SUBPAGE_PROT = 310 SYS_TIMERFD_SETTIME = 311 SYS_TIMERFD_GETTIME = 312 SYS_SIGNALFD4 = 313 SYS_EVENTFD2 = 314 SYS_EPOLL_CREATE1 = 315 SYS_DUP3 = 316 SYS_PIPE2 = 317 SYS_INOTIFY_INIT1 = 318 SYS_PERF_EVENT_OPEN = 319 SYS_PREADV = 320 SYS_PWRITEV = 321 SYS_RT_TGSIGQUEUEINFO = 322 SYS_FANOTIFY_INIT = 323 SYS_FANOTIFY_MARK = 324 SYS_PRLIMIT64 = 325 SYS_SOCKET = 326 SYS_BIND = 327 SYS_CONNECT = 328 SYS_LISTEN = 329 SYS_ACCEPT = 330 SYS_GETSOCKNAME = 331 SYS_GETPEERNAME = 332 SYS_SOCKETPAIR = 333 SYS_SEND = 334 SYS_SENDTO = 335 SYS_RECV = 336 SYS_RECVFROM = 337 SYS_SHUTDOWN = 338 SYS_SETSOCKOPT = 339 SYS_GETSOCKOPT = 340 SYS_SENDMSG = 341 SYS_RECVMSG = 342 SYS_RECVMMSG = 343 SYS_ACCEPT4 = 344 SYS_NAME_TO_HANDLE_AT = 345 SYS_OPEN_BY_HANDLE_AT = 346 SYS_CLOCK_ADJTIME = 347 SYS_SYNCFS = 348 SYS_SENDMMSG = 349 SYS_SETNS = 350 SYS_PROCESS_VM_READV = 351 SYS_PROCESS_VM_WRITEV = 352 SYS_FINIT_MODULE = 353 SYS_KCMP = 354 SYS_SCHED_SETATTR = 355 SYS_SCHED_GETATTR = 356 SYS_RENAMEAT2 = 357 SYS_SECCOMP = 358 SYS_GETRANDOM = 359 SYS_MEMFD_CREATE = 360 SYS_BPF = 361 SYS_EXECVEAT = 362 SYS_SWITCH_ENDIAN = 363 SYS_USERFAULTFD = 364 SYS_MEMBARRIER = 365 SYS_MLOCK2 = 378 SYS_COPY_FILE_RANGE = 379 SYS_PREADV2 = 380 SYS_PWRITEV2 = 381 SYS_KEXEC_FILE_LOAD = 382 SYS_STATX = 383 ) ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go ================================================ // linux/mksysnum.pl -Wall -Werror -static -I/tmp/include -fsigned-char /tmp/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. // +build s390x,linux package unix const ( SYS_EXIT = 1 SYS_FORK = 2 SYS_READ = 3 SYS_WRITE = 4 SYS_OPEN = 5 SYS_CLOSE = 6 SYS_RESTART_SYSCALL = 7 SYS_CREAT = 8 SYS_LINK = 9 SYS_UNLINK = 10 SYS_EXECVE = 11 SYS_CHDIR = 12 SYS_MKNOD = 14 SYS_CHMOD = 15 SYS_LSEEK = 19 SYS_GETPID = 20 SYS_MOUNT = 21 SYS_UMOUNT = 22 SYS_PTRACE = 26 SYS_ALARM = 27 SYS_PAUSE = 29 SYS_UTIME = 30 SYS_ACCESS = 33 SYS_NICE = 34 SYS_SYNC = 36 SYS_KILL = 37 SYS_RENAME = 38 SYS_MKDIR = 39 SYS_RMDIR = 40 SYS_DUP = 41 SYS_PIPE = 42 SYS_TIMES = 43 SYS_BRK = 45 SYS_SIGNAL = 48 SYS_ACCT = 51 SYS_UMOUNT2 = 52 SYS_IOCTL = 54 SYS_FCNTL = 55 SYS_SETPGID = 57 SYS_UMASK = 60 SYS_CHROOT = 61 SYS_USTAT = 62 SYS_DUP2 = 63 SYS_GETPPID = 64 SYS_GETPGRP = 65 SYS_SETSID = 66 SYS_SIGACTION = 67 SYS_SIGSUSPEND = 72 SYS_SIGPENDING = 73 SYS_SETHOSTNAME = 74 SYS_SETRLIMIT = 75 SYS_GETRUSAGE = 77 SYS_GETTIMEOFDAY = 78 SYS_SETTIMEOFDAY = 79 SYS_SYMLINK = 83 SYS_READLINK = 85 SYS_USELIB = 86 SYS_SWAPON = 87 SYS_REBOOT = 88 SYS_READDIR = 89 SYS_MMAP = 90 SYS_MUNMAP = 91 SYS_TRUNCATE = 92 SYS_FTRUNCATE = 93 SYS_FCHMOD = 94 SYS_GETPRIORITY = 96 SYS_SETPRIORITY = 97 SYS_STATFS = 99 SYS_FSTATFS = 100 SYS_SOCKETCALL = 102 SYS_SYSLOG = 103 SYS_SETITIMER = 104 SYS_GETITIMER = 105 SYS_STAT = 106 SYS_LSTAT = 107 SYS_FSTAT = 108 SYS_LOOKUP_DCOOKIE = 110 SYS_VHANGUP = 111 SYS_IDLE = 112 SYS_WAIT4 = 114 SYS_SWAPOFF = 115 SYS_SYSINFO = 116 SYS_IPC = 117 SYS_FSYNC = 118 SYS_SIGRETURN = 119 SYS_CLONE = 120 SYS_SETDOMAINNAME = 121 SYS_UNAME = 122 SYS_ADJTIMEX = 124 SYS_MPROTECT = 125 SYS_SIGPROCMASK = 126 SYS_CREATE_MODULE = 127 SYS_INIT_MODULE = 128 SYS_DELETE_MODULE = 129 SYS_GET_KERNEL_SYMS = 130 SYS_QUOTACTL = 131 SYS_GETPGID = 132 SYS_FCHDIR = 133 SYS_BDFLUSH = 134 SYS_SYSFS = 135 SYS_PERSONALITY = 136 SYS_AFS_SYSCALL = 137 SYS_GETDENTS = 141 SYS_FLOCK = 143 SYS_MSYNC = 144 SYS_READV = 145 SYS_WRITEV = 146 SYS_GETSID = 147 SYS_FDATASYNC = 148 SYS__SYSCTL = 149 SYS_MLOCK = 150 SYS_MUNLOCK = 151 SYS_MLOCKALL = 152 SYS_MUNLOCKALL = 153 SYS_SCHED_SETPARAM = 154 SYS_SCHED_GETPARAM = 155 SYS_SCHED_SETSCHEDULER = 156 SYS_SCHED_GETSCHEDULER = 157 SYS_SCHED_YIELD = 158 SYS_SCHED_GET_PRIORITY_MAX = 159 SYS_SCHED_GET_PRIORITY_MIN = 160 SYS_SCHED_RR_GET_INTERVAL = 161 SYS_NANOSLEEP = 162 SYS_MREMAP = 163 SYS_QUERY_MODULE = 167 SYS_POLL = 168 SYS_NFSSERVCTL = 169 SYS_PRCTL = 172 SYS_RT_SIGRETURN = 173 SYS_RT_SIGACTION = 174 SYS_RT_SIGPROCMASK = 175 SYS_RT_SIGPENDING = 176 SYS_RT_SIGTIMEDWAIT = 177 SYS_RT_SIGQUEUEINFO = 178 SYS_RT_SIGSUSPEND = 179 SYS_PREAD64 = 180 SYS_PWRITE64 = 181 SYS_GETCWD = 183 SYS_CAPGET = 184 SYS_CAPSET = 185 SYS_SIGALTSTACK = 186 SYS_SENDFILE = 187 SYS_GETPMSG = 188 SYS_PUTPMSG = 189 SYS_VFORK = 190 SYS_PIVOT_ROOT = 217 SYS_MINCORE = 218 SYS_MADVISE = 219 SYS_GETDENTS64 = 220 SYS_READAHEAD = 222 SYS_SETXATTR = 224 SYS_LSETXATTR = 225 SYS_FSETXATTR = 226 SYS_GETXATTR = 227 SYS_LGETXATTR = 228 SYS_FGETXATTR = 229 SYS_LISTXATTR = 230 SYS_LLISTXATTR = 231 SYS_FLISTXATTR = 232 SYS_REMOVEXATTR = 233 SYS_LREMOVEXATTR = 234 SYS_FREMOVEXATTR = 235 SYS_GETTID = 236 SYS_TKILL = 237 SYS_FUTEX = 238 SYS_SCHED_SETAFFINITY = 239 SYS_SCHED_GETAFFINITY = 240 SYS_TGKILL = 241 SYS_IO_SETUP = 243 SYS_IO_DESTROY = 244 SYS_IO_GETEVENTS = 245 SYS_IO_SUBMIT = 246 SYS_IO_CANCEL = 247 SYS_EXIT_GROUP = 248 SYS_EPOLL_CREATE = 249 SYS_EPOLL_CTL = 250 SYS_EPOLL_WAIT = 251 SYS_SET_TID_ADDRESS = 252 SYS_FADVISE64 = 253 SYS_TIMER_CREATE = 254 SYS_TIMER_SETTIME = 255 SYS_TIMER_GETTIME = 256 SYS_TIMER_GETOVERRUN = 257 SYS_TIMER_DELETE = 258 SYS_CLOCK_SETTIME = 259 SYS_CLOCK_GETTIME = 260 SYS_CLOCK_GETRES = 261 SYS_CLOCK_NANOSLEEP = 262 SYS_STATFS64 = 265 SYS_FSTATFS64 = 266 SYS_REMAP_FILE_PAGES = 267 SYS_MBIND = 268 SYS_GET_MEMPOLICY = 269 SYS_SET_MEMPOLICY = 270 SYS_MQ_OPEN = 271 SYS_MQ_UNLINK = 272 SYS_MQ_TIMEDSEND = 273 SYS_MQ_TIMEDRECEIVE = 274 SYS_MQ_NOTIFY = 275 SYS_MQ_GETSETATTR = 276 SYS_KEXEC_LOAD = 277 SYS_ADD_KEY = 278 SYS_REQUEST_KEY = 279 SYS_KEYCTL = 280 SYS_WAITID = 281 SYS_IOPRIO_SET = 282 SYS_IOPRIO_GET = 283 SYS_INOTIFY_INIT = 284 SYS_INOTIFY_ADD_WATCH = 285 SYS_INOTIFY_RM_WATCH = 286 SYS_MIGRATE_PAGES = 287 SYS_OPENAT = 288 SYS_MKDIRAT = 289 SYS_MKNODAT = 290 SYS_FCHOWNAT = 291 SYS_FUTIMESAT = 292 SYS_UNLINKAT = 294 SYS_RENAMEAT = 295 SYS_LINKAT = 296 SYS_SYMLINKAT = 297 SYS_READLINKAT = 298 SYS_FCHMODAT = 299 SYS_FACCESSAT = 300 SYS_PSELECT6 = 301 SYS_PPOLL = 302 SYS_UNSHARE = 303 SYS_SET_ROBUST_LIST = 304 SYS_GET_ROBUST_LIST = 305 SYS_SPLICE = 306 SYS_SYNC_FILE_RANGE = 307 SYS_TEE = 308 SYS_VMSPLICE = 309 SYS_MOVE_PAGES = 310 SYS_GETCPU = 311 SYS_EPOLL_PWAIT = 312 SYS_UTIMES = 313 SYS_FALLOCATE = 314 SYS_UTIMENSAT = 315 SYS_SIGNALFD = 316 SYS_TIMERFD = 317 SYS_EVENTFD = 318 SYS_TIMERFD_CREATE = 319 SYS_TIMERFD_SETTIME = 320 SYS_TIMERFD_GETTIME = 321 SYS_SIGNALFD4 = 322 SYS_EVENTFD2 = 323 SYS_INOTIFY_INIT1 = 324 SYS_PIPE2 = 325 SYS_DUP3 = 326 SYS_EPOLL_CREATE1 = 327 SYS_PREADV = 328 SYS_PWRITEV = 329 SYS_RT_TGSIGQUEUEINFO = 330 SYS_PERF_EVENT_OPEN = 331 SYS_FANOTIFY_INIT = 332 SYS_FANOTIFY_MARK = 333 SYS_PRLIMIT64 = 334 SYS_NAME_TO_HANDLE_AT = 335 SYS_OPEN_BY_HANDLE_AT = 336 SYS_CLOCK_ADJTIME = 337 SYS_SYNCFS = 338 SYS_SETNS = 339 SYS_PROCESS_VM_READV = 340 SYS_PROCESS_VM_WRITEV = 341 SYS_S390_RUNTIME_INSTR = 342 SYS_KCMP = 343 SYS_FINIT_MODULE = 344 SYS_SCHED_SETATTR = 345 SYS_SCHED_GETATTR = 346 SYS_RENAMEAT2 = 347 SYS_SECCOMP = 348 SYS_GETRANDOM = 349 SYS_MEMFD_CREATE = 350 SYS_BPF = 351 SYS_S390_PCI_MMIO_WRITE = 352 SYS_S390_PCI_MMIO_READ = 353 SYS_EXECVEAT = 354 SYS_USERFAULTFD = 355 SYS_MEMBARRIER = 356 SYS_RECVMMSG = 357 SYS_SENDMMSG = 358 SYS_SOCKET = 359 SYS_SOCKETPAIR = 360 SYS_BIND = 361 SYS_CONNECT = 362 SYS_LISTEN = 363 SYS_ACCEPT4 = 364 SYS_GETSOCKOPT = 365 SYS_SETSOCKOPT = 366 SYS_GETSOCKNAME = 367 SYS_GETPEERNAME = 368 SYS_SENDTO = 369 SYS_SENDMSG = 370 SYS_RECVFROM = 371 SYS_RECVMSG = 372 SYS_SHUTDOWN = 373 SYS_MLOCK2 = 374 SYS_COPY_FILE_RANGE = 375 SYS_PREADV2 = 376 SYS_PWRITEV2 = 377 SYS_S390_GUARDED_STORAGE = 378 SYS_STATX = 379 SYS_SELECT = 142 SYS_GETRLIMIT = 191 SYS_LCHOWN = 198 SYS_GETUID = 199 SYS_GETGID = 200 SYS_GETEUID = 201 SYS_GETEGID = 202 SYS_SETREUID = 203 SYS_SETREGID = 204 SYS_GETGROUPS = 205 SYS_SETGROUPS = 206 SYS_FCHOWN = 207 SYS_SETRESUID = 208 SYS_GETRESUID = 209 SYS_SETRESGID = 210 SYS_GETRESGID = 211 SYS_CHOWN = 212 SYS_SETUID = 213 SYS_SETGID = 214 SYS_SETFSUID = 215 SYS_SETFSGID = 216 SYS_NEWFSTATAT = 293 ) ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go ================================================ // mksysnum_linux.pl -Ilinux/usr/include -m64 -D__arch64__ linux/usr/include/asm/unistd.h // MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT // +build sparc64,linux package unix const ( SYS_RESTART_SYSCALL = 0 SYS_EXIT = 1 SYS_FORK = 2 SYS_READ = 3 SYS_WRITE = 4 SYS_OPEN = 5 SYS_CLOSE = 6 SYS_WAIT4 = 7 SYS_CREAT = 8 SYS_LINK = 9 SYS_UNLINK = 10 SYS_EXECV = 11 SYS_CHDIR = 12 SYS_CHOWN = 13 SYS_MKNOD = 14 SYS_CHMOD = 15 SYS_LCHOWN = 16 SYS_BRK = 17 SYS_PERFCTR = 18 SYS_LSEEK = 19 SYS_GETPID = 20 SYS_CAPGET = 21 SYS_CAPSET = 22 SYS_SETUID = 23 SYS_GETUID = 24 SYS_VMSPLICE = 25 SYS_PTRACE = 26 SYS_ALARM = 27 SYS_SIGALTSTACK = 28 SYS_PAUSE = 29 SYS_UTIME = 30 SYS_ACCESS = 33 SYS_NICE = 34 SYS_SYNC = 36 SYS_KILL = 37 SYS_STAT = 38 SYS_SENDFILE = 39 SYS_LSTAT = 40 SYS_DUP = 41 SYS_PIPE = 42 SYS_TIMES = 43 SYS_UMOUNT2 = 45 SYS_SETGID = 46 SYS_GETGID = 47 SYS_SIGNAL = 48 SYS_GETEUID = 49 SYS_GETEGID = 50 SYS_ACCT = 51 SYS_MEMORY_ORDERING = 52 SYS_IOCTL = 54 SYS_REBOOT = 55 SYS_SYMLINK = 57 SYS_READLINK = 58 SYS_EXECVE = 59 SYS_UMASK = 60 SYS_CHROOT = 61 SYS_FSTAT = 62 SYS_FSTAT64 = 63 SYS_GETPAGESIZE = 64 SYS_MSYNC = 65 SYS_VFORK = 66 SYS_PREAD64 = 67 SYS_PWRITE64 = 68 SYS_MMAP = 71 SYS_MUNMAP = 73 SYS_MPROTECT = 74 SYS_MADVISE = 75 SYS_VHANGUP = 76 SYS_MINCORE = 78 SYS_GETGROUPS = 79 SYS_SETGROUPS = 80 SYS_GETPGRP = 81 SYS_SETITIMER = 83 SYS_SWAPON = 85 SYS_GETITIMER = 86 SYS_SETHOSTNAME = 88 SYS_DUP2 = 90 SYS_FCNTL = 92 SYS_SELECT = 93 SYS_FSYNC = 95 SYS_SETPRIORITY = 96 SYS_SOCKET = 97 SYS_CONNECT = 98 SYS_ACCEPT = 99 SYS_GETPRIORITY = 100 SYS_RT_SIGRETURN = 101 SYS_RT_SIGACTION = 102 SYS_RT_SIGPROCMASK = 103 SYS_RT_SIGPENDING = 104 SYS_RT_SIGTIMEDWAIT = 105 SYS_RT_SIGQUEUEINFO = 106 SYS_RT_SIGSUSPEND = 107 SYS_SETRESUID = 108 SYS_GETRESUID = 109 SYS_SETRESGID = 110 SYS_GETRESGID = 111 SYS_RECVMSG = 113 SYS_SENDMSG = 114 SYS_GETTIMEOFDAY = 116 SYS_GETRUSAGE = 117 SYS_GETSOCKOPT = 118 SYS_GETCWD = 119 SYS_READV = 120 SYS_WRITEV = 121 SYS_SETTIMEOFDAY = 122 SYS_FCHOWN = 123 SYS_FCHMOD = 124 SYS_RECVFROM = 125 SYS_SETREUID = 126 SYS_SETREGID = 127 SYS_RENAME = 128 SYS_TRUNCATE = 129 SYS_FTRUNCATE = 130 SYS_FLOCK = 131 SYS_LSTAT64 = 132 SYS_SENDTO = 133 SYS_SHUTDOWN = 134 SYS_SOCKETPAIR = 135 SYS_MKDIR = 136 SYS_RMDIR = 137 SYS_UTIMES = 138 SYS_STAT64 = 139 SYS_SENDFILE64 = 140 SYS_GETPEERNAME = 141 SYS_FUTEX = 142 SYS_GETTID = 143 SYS_GETRLIMIT = 144 SYS_SETRLIMIT = 145 SYS_PIVOT_ROOT = 146 SYS_PRCTL = 147 SYS_PCICONFIG_READ = 148 SYS_PCICONFIG_WRITE = 149 SYS_GETSOCKNAME = 150 SYS_INOTIFY_INIT = 151 SYS_INOTIFY_ADD_WATCH = 152 SYS_POLL = 153 SYS_GETDENTS64 = 154 SYS_INOTIFY_RM_WATCH = 156 SYS_STATFS = 157 SYS_FSTATFS = 158 SYS_UMOUNT = 159 SYS_SCHED_SET_AFFINITY = 160 SYS_SCHED_GET_AFFINITY = 161 SYS_GETDOMAINNAME = 162 SYS_SETDOMAINNAME = 163 SYS_UTRAP_INSTALL = 164 SYS_QUOTACTL = 165 SYS_SET_TID_ADDRESS = 166 SYS_MOUNT = 167 SYS_USTAT = 168 SYS_SETXATTR = 169 SYS_LSETXATTR = 170 SYS_FSETXATTR = 171 SYS_GETXATTR = 172 SYS_LGETXATTR = 173 SYS_GETDENTS = 174 SYS_SETSID = 175 SYS_FCHDIR = 176 SYS_FGETXATTR = 177 SYS_LISTXATTR = 178 SYS_LLISTXATTR = 179 SYS_FLISTXATTR = 180 SYS_REMOVEXATTR = 181 SYS_LREMOVEXATTR = 182 SYS_SIGPENDING = 183 SYS_QUERY_MODULE = 184 SYS_SETPGID = 185 SYS_FREMOVEXATTR = 186 SYS_TKILL = 187 SYS_EXIT_GROUP = 188 SYS_UNAME = 189 SYS_INIT_MODULE = 190 SYS_PERSONALITY = 191 SYS_REMAP_FILE_PAGES = 192 SYS_EPOLL_CREATE = 193 SYS_EPOLL_CTL = 194 SYS_EPOLL_WAIT = 195 SYS_IOPRIO_SET = 196 SYS_GETPPID = 197 SYS_SIGACTION = 198 SYS_SGETMASK = 199 SYS_SSETMASK = 200 SYS_SIGSUSPEND = 201 SYS_OLDLSTAT = 202 SYS_USELIB = 203 SYS_READDIR = 204 SYS_READAHEAD = 205 SYS_SOCKETCALL = 206 SYS_SYSLOG = 207 SYS_LOOKUP_DCOOKIE = 208 SYS_FADVISE64 = 209 SYS_FADVISE64_64 = 210 SYS_TGKILL = 211 SYS_WAITPID = 212 SYS_SWAPOFF = 213 SYS_SYSINFO = 214 SYS_IPC = 215 SYS_SIGRETURN = 216 SYS_CLONE = 217 SYS_IOPRIO_GET = 218 SYS_ADJTIMEX = 219 SYS_SIGPROCMASK = 220 SYS_CREATE_MODULE = 221 SYS_DELETE_MODULE = 222 SYS_GET_KERNEL_SYMS = 223 SYS_GETPGID = 224 SYS_BDFLUSH = 225 SYS_SYSFS = 226 SYS_AFS_SYSCALL = 227 SYS_SETFSUID = 228 SYS_SETFSGID = 229 SYS__NEWSELECT = 230 SYS_SPLICE = 232 SYS_STIME = 233 SYS_STATFS64 = 234 SYS_FSTATFS64 = 235 SYS__LLSEEK = 236 SYS_MLOCK = 237 SYS_MUNLOCK = 238 SYS_MLOCKALL = 239 SYS_MUNLOCKALL = 240 SYS_SCHED_SETPARAM = 241 SYS_SCHED_GETPARAM = 242 SYS_SCHED_SETSCHEDULER = 243 SYS_SCHED_GETSCHEDULER = 244 SYS_SCHED_YIELD = 245 SYS_SCHED_GET_PRIORITY_MAX = 246 SYS_SCHED_GET_PRIORITY_MIN = 247 SYS_SCHED_RR_GET_INTERVAL = 248 SYS_NANOSLEEP = 249 SYS_MREMAP = 250 SYS__SYSCTL = 251 SYS_GETSID = 252 SYS_FDATASYNC = 253 SYS_NFSSERVCTL = 254 SYS_SYNC_FILE_RANGE = 255 SYS_CLOCK_SETTIME = 256 SYS_CLOCK_GETTIME = 257 SYS_CLOCK_GETRES = 258 SYS_CLOCK_NANOSLEEP = 259 SYS_SCHED_GETAFFINITY = 260 SYS_SCHED_SETAFFINITY = 261 SYS_TIMER_SETTIME = 262 SYS_TIMER_GETTIME = 263 SYS_TIMER_GETOVERRUN = 264 SYS_TIMER_DELETE = 265 SYS_TIMER_CREATE = 266 SYS_IO_SETUP = 268 SYS_IO_DESTROY = 269 SYS_IO_SUBMIT = 270 SYS_IO_CANCEL = 271 SYS_IO_GETEVENTS = 272 SYS_MQ_OPEN = 273 SYS_MQ_UNLINK = 274 SYS_MQ_TIMEDSEND = 275 SYS_MQ_TIMEDRECEIVE = 276 SYS_MQ_NOTIFY = 277 SYS_MQ_GETSETATTR = 278 SYS_WAITID = 279 SYS_TEE = 280 SYS_ADD_KEY = 281 SYS_REQUEST_KEY = 282 SYS_KEYCTL = 283 SYS_OPENAT = 284 SYS_MKDIRAT = 285 SYS_MKNODAT = 286 SYS_FCHOWNAT = 287 SYS_FUTIMESAT = 288 SYS_FSTATAT64 = 289 SYS_UNLINKAT = 290 SYS_RENAMEAT = 291 SYS_LINKAT = 292 SYS_SYMLINKAT = 293 SYS_READLINKAT = 294 SYS_FCHMODAT = 295 SYS_FACCESSAT = 296 SYS_PSELECT6 = 297 SYS_PPOLL = 298 SYS_UNSHARE = 299 SYS_SET_ROBUST_LIST = 300 SYS_GET_ROBUST_LIST = 301 SYS_MIGRATE_PAGES = 302 SYS_MBIND = 303 SYS_GET_MEMPOLICY = 304 SYS_SET_MEMPOLICY = 305 SYS_KEXEC_LOAD = 306 SYS_MOVE_PAGES = 307 SYS_GETCPU = 308 SYS_EPOLL_PWAIT = 309 SYS_UTIMENSAT = 310 SYS_SIGNALFD = 311 SYS_TIMERFD_CREATE = 312 SYS_EVENTFD = 313 SYS_FALLOCATE = 314 SYS_TIMERFD_SETTIME = 315 SYS_TIMERFD_GETTIME = 316 SYS_SIGNALFD4 = 317 SYS_EVENTFD2 = 318 SYS_EPOLL_CREATE1 = 319 SYS_DUP3 = 320 SYS_PIPE2 = 321 SYS_INOTIFY_INIT1 = 322 SYS_ACCEPT4 = 323 SYS_PREADV = 324 SYS_PWRITEV = 325 SYS_RT_TGSIGQUEUEINFO = 326 SYS_PERF_EVENT_OPEN = 327 SYS_RECVMMSG = 328 SYS_FANOTIFY_INIT = 329 SYS_FANOTIFY_MARK = 330 SYS_PRLIMIT64 = 331 SYS_NAME_TO_HANDLE_AT = 332 SYS_OPEN_BY_HANDLE_AT = 333 SYS_CLOCK_ADJTIME = 334 SYS_SYNCFS = 335 SYS_SENDMMSG = 336 SYS_SETNS = 337 SYS_PROCESS_VM_READV = 338 SYS_PROCESS_VM_WRITEV = 339 SYS_KERN_FEATURES = 340 SYS_KCMP = 341 SYS_FINIT_MODULE = 342 SYS_SCHED_SETATTR = 343 SYS_SCHED_GETATTR = 344 SYS_RENAMEAT2 = 345 SYS_SECCOMP = 346 SYS_GETRANDOM = 347 SYS_MEMFD_CREATE = 348 SYS_BPF = 349 SYS_EXECVEAT = 350 SYS_MEMBARRIER = 351 SYS_USERFAULTFD = 352 SYS_BIND = 353 SYS_LISTEN = 354 SYS_SETSOCKOPT = 355 SYS_MLOCK2 = 356 SYS_COPY_FILE_RANGE = 357 SYS_PREADV2 = 358 SYS_PWRITEV2 = 359 ) ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go ================================================ // mksysnum_netbsd.pl // MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT // +build 386,netbsd package unix const ( SYS_EXIT = 1 // { void|sys||exit(int rval); } SYS_FORK = 2 // { int|sys||fork(void); } SYS_READ = 3 // { ssize_t|sys||read(int fd, void *buf, size_t nbyte); } SYS_WRITE = 4 // { ssize_t|sys||write(int fd, const void *buf, size_t nbyte); } SYS_OPEN = 5 // { int|sys||open(const char *path, int flags, ... mode_t mode); } SYS_CLOSE = 6 // { int|sys||close(int fd); } SYS_LINK = 9 // { int|sys||link(const char *path, const char *link); } SYS_UNLINK = 10 // { int|sys||unlink(const char *path); } SYS_CHDIR = 12 // { int|sys||chdir(const char *path); } SYS_FCHDIR = 13 // { int|sys||fchdir(int fd); } SYS_CHMOD = 15 // { int|sys||chmod(const char *path, mode_t mode); } SYS_CHOWN = 16 // { int|sys||chown(const char *path, uid_t uid, gid_t gid); } SYS_BREAK = 17 // { int|sys||obreak(char *nsize); } SYS_GETPID = 20 // { pid_t|sys||getpid_with_ppid(void); } SYS_UNMOUNT = 22 // { int|sys||unmount(const char *path, int flags); } SYS_SETUID = 23 // { int|sys||setuid(uid_t uid); } SYS_GETUID = 24 // { uid_t|sys||getuid_with_euid(void); } SYS_GETEUID = 25 // { uid_t|sys||geteuid(void); } SYS_PTRACE = 26 // { int|sys||ptrace(int req, pid_t pid, void *addr, int data); } SYS_RECVMSG = 27 // { ssize_t|sys||recvmsg(int s, struct msghdr *msg, int flags); } SYS_SENDMSG = 28 // { ssize_t|sys||sendmsg(int s, const struct msghdr *msg, int flags); } SYS_RECVFROM = 29 // { ssize_t|sys||recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlenaddr); } SYS_ACCEPT = 30 // { int|sys||accept(int s, struct sockaddr *name, socklen_t *anamelen); } SYS_GETPEERNAME = 31 // { int|sys||getpeername(int fdes, struct sockaddr *asa, socklen_t *alen); } SYS_GETSOCKNAME = 32 // { int|sys||getsockname(int fdes, struct sockaddr *asa, socklen_t *alen); } SYS_ACCESS = 33 // { int|sys||access(const char *path, int flags); } SYS_CHFLAGS = 34 // { int|sys||chflags(const char *path, u_long flags); } SYS_FCHFLAGS = 35 // { int|sys||fchflags(int fd, u_long flags); } SYS_SYNC = 36 // { void|sys||sync(void); } SYS_KILL = 37 // { int|sys||kill(pid_t pid, int signum); } SYS_GETPPID = 39 // { pid_t|sys||getppid(void); } SYS_DUP = 41 // { int|sys||dup(int fd); } SYS_PIPE = 42 // { int|sys||pipe(void); } SYS_GETEGID = 43 // { gid_t|sys||getegid(void); } SYS_PROFIL = 44 // { int|sys||profil(char *samples, size_t size, u_long offset, u_int scale); } SYS_KTRACE = 45 // { int|sys||ktrace(const char *fname, int ops, int facs, pid_t pid); } SYS_GETGID = 47 // { gid_t|sys||getgid_with_egid(void); } SYS___GETLOGIN = 49 // { int|sys||__getlogin(char *namebuf, size_t namelen); } SYS___SETLOGIN = 50 // { int|sys||__setlogin(const char *namebuf); } SYS_ACCT = 51 // { int|sys||acct(const char *path); } SYS_IOCTL = 54 // { int|sys||ioctl(int fd, u_long com, ... void *data); } SYS_REVOKE = 56 // { int|sys||revoke(const char *path); } SYS_SYMLINK = 57 // { int|sys||symlink(const char *path, const char *link); } SYS_READLINK = 58 // { ssize_t|sys||readlink(const char *path, char *buf, size_t count); } SYS_EXECVE = 59 // { int|sys||execve(const char *path, char * const *argp, char * const *envp); } SYS_UMASK = 60 // { mode_t|sys||umask(mode_t newmask); } SYS_CHROOT = 61 // { int|sys||chroot(const char *path); } SYS_VFORK = 66 // { int|sys||vfork(void); } SYS_SBRK = 69 // { int|sys||sbrk(intptr_t incr); } SYS_SSTK = 70 // { int|sys||sstk(int incr); } SYS_VADVISE = 72 // { int|sys||ovadvise(int anom); } SYS_MUNMAP = 73 // { int|sys||munmap(void *addr, size_t len); } SYS_MPROTECT = 74 // { int|sys||mprotect(void *addr, size_t len, int prot); } SYS_MADVISE = 75 // { int|sys||madvise(void *addr, size_t len, int behav); } SYS_MINCORE = 78 // { int|sys||mincore(void *addr, size_t len, char *vec); } SYS_GETGROUPS = 79 // { int|sys||getgroups(int gidsetsize, gid_t *gidset); } SYS_SETGROUPS = 80 // { int|sys||setgroups(int gidsetsize, const gid_t *gidset); } SYS_GETPGRP = 81 // { int|sys||getpgrp(void); } SYS_SETPGID = 82 // { int|sys||setpgid(pid_t pid, pid_t pgid); } SYS_DUP2 = 90 // { int|sys||dup2(int from, int to); } SYS_FCNTL = 92 // { int|sys||fcntl(int fd, int cmd, ... void *arg); } SYS_FSYNC = 95 // { int|sys||fsync(int fd); } SYS_SETPRIORITY = 96 // { int|sys||setpriority(int which, id_t who, int prio); } SYS_CONNECT = 98 // { int|sys||connect(int s, const struct sockaddr *name, socklen_t namelen); } SYS_GETPRIORITY = 100 // { int|sys||getpriority(int which, id_t who); } SYS_BIND = 104 // { int|sys||bind(int s, const struct sockaddr *name, socklen_t namelen); } SYS_SETSOCKOPT = 105 // { int|sys||setsockopt(int s, int level, int name, const void *val, socklen_t valsize); } SYS_LISTEN = 106 // { int|sys||listen(int s, int backlog); } SYS_GETSOCKOPT = 118 // { int|sys||getsockopt(int s, int level, int name, void *val, socklen_t *avalsize); } SYS_READV = 120 // { ssize_t|sys||readv(int fd, const struct iovec *iovp, int iovcnt); } SYS_WRITEV = 121 // { ssize_t|sys||writev(int fd, const struct iovec *iovp, int iovcnt); } SYS_FCHOWN = 123 // { int|sys||fchown(int fd, uid_t uid, gid_t gid); } SYS_FCHMOD = 124 // { int|sys||fchmod(int fd, mode_t mode); } SYS_SETREUID = 126 // { int|sys||setreuid(uid_t ruid, uid_t euid); } SYS_SETREGID = 127 // { int|sys||setregid(gid_t rgid, gid_t egid); } SYS_RENAME = 128 // { int|sys||rename(const char *from, const char *to); } SYS_FLOCK = 131 // { int|sys||flock(int fd, int how); } SYS_MKFIFO = 132 // { int|sys||mkfifo(const char *path, mode_t mode); } SYS_SENDTO = 133 // { ssize_t|sys||sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); } SYS_SHUTDOWN = 134 // { int|sys||shutdown(int s, int how); } SYS_SOCKETPAIR = 135 // { int|sys||socketpair(int domain, int type, int protocol, int *rsv); } SYS_MKDIR = 136 // { int|sys||mkdir(const char *path, mode_t mode); } SYS_RMDIR = 137 // { int|sys||rmdir(const char *path); } SYS_SETSID = 147 // { int|sys||setsid(void); } SYS_SYSARCH = 165 // { int|sys||sysarch(int op, void *parms); } SYS_PREAD = 173 // { ssize_t|sys||pread(int fd, void *buf, size_t nbyte, int PAD, off_t offset); } SYS_PWRITE = 174 // { ssize_t|sys||pwrite(int fd, const void *buf, size_t nbyte, int PAD, off_t offset); } SYS_NTP_ADJTIME = 176 // { int|sys||ntp_adjtime(struct timex *tp); } SYS_SETGID = 181 // { int|sys||setgid(gid_t gid); } SYS_SETEGID = 182 // { int|sys||setegid(gid_t egid); } SYS_SETEUID = 183 // { int|sys||seteuid(uid_t euid); } SYS_PATHCONF = 191 // { long|sys||pathconf(const char *path, int name); } SYS_FPATHCONF = 192 // { long|sys||fpathconf(int fd, int name); } SYS_GETRLIMIT = 194 // { int|sys||getrlimit(int which, struct rlimit *rlp); } SYS_SETRLIMIT = 195 // { int|sys||setrlimit(int which, const struct rlimit *rlp); } SYS_MMAP = 197 // { void *|sys||mmap(void *addr, size_t len, int prot, int flags, int fd, long PAD, off_t pos); } SYS_LSEEK = 199 // { off_t|sys||lseek(int fd, int PAD, off_t offset, int whence); } SYS_TRUNCATE = 200 // { int|sys||truncate(const char *path, int PAD, off_t length); } SYS_FTRUNCATE = 201 // { int|sys||ftruncate(int fd, int PAD, off_t length); } SYS___SYSCTL = 202 // { int|sys||__sysctl(const int *name, u_int namelen, void *old, size_t *oldlenp, const void *new, size_t newlen); } SYS_MLOCK = 203 // { int|sys||mlock(const void *addr, size_t len); } SYS_MUNLOCK = 204 // { int|sys||munlock(const void *addr, size_t len); } SYS_UNDELETE = 205 // { int|sys||undelete(const char *path); } SYS_GETPGID = 207 // { pid_t|sys||getpgid(pid_t pid); } SYS_REBOOT = 208 // { int|sys||reboot(int opt, char *bootstr); } SYS_POLL = 209 // { int|sys||poll(struct pollfd *fds, u_int nfds, int timeout); } SYS_SEMGET = 221 // { int|sys||semget(key_t key, int nsems, int semflg); } SYS_SEMOP = 222 // { int|sys||semop(int semid, struct sembuf *sops, size_t nsops); } SYS_SEMCONFIG = 223 // { int|sys||semconfig(int flag); } SYS_MSGGET = 225 // { int|sys||msgget(key_t key, int msgflg); } SYS_MSGSND = 226 // { int|sys||msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } SYS_MSGRCV = 227 // { ssize_t|sys||msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } SYS_SHMAT = 228 // { void *|sys||shmat(int shmid, const void *shmaddr, int shmflg); } SYS_SHMDT = 230 // { int|sys||shmdt(const void *shmaddr); } SYS_SHMGET = 231 // { int|sys||shmget(key_t key, size_t size, int shmflg); } SYS_TIMER_CREATE = 235 // { int|sys||timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid); } SYS_TIMER_DELETE = 236 // { int|sys||timer_delete(timer_t timerid); } SYS_TIMER_GETOVERRUN = 239 // { int|sys||timer_getoverrun(timer_t timerid); } SYS_FDATASYNC = 241 // { int|sys||fdatasync(int fd); } SYS_MLOCKALL = 242 // { int|sys||mlockall(int flags); } SYS_MUNLOCKALL = 243 // { int|sys||munlockall(void); } SYS_SIGQUEUEINFO = 245 // { int|sys||sigqueueinfo(pid_t pid, const siginfo_t *info); } SYS_MODCTL = 246 // { int|sys||modctl(int cmd, void *arg); } SYS___POSIX_RENAME = 270 // { int|sys||__posix_rename(const char *from, const char *to); } SYS_SWAPCTL = 271 // { int|sys||swapctl(int cmd, void *arg, int misc); } SYS_MINHERIT = 273 // { int|sys||minherit(void *addr, size_t len, int inherit); } SYS_LCHMOD = 274 // { int|sys||lchmod(const char *path, mode_t mode); } SYS_LCHOWN = 275 // { int|sys||lchown(const char *path, uid_t uid, gid_t gid); } SYS_MSYNC = 277 // { int|sys|13|msync(void *addr, size_t len, int flags); } SYS___POSIX_CHOWN = 283 // { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); } SYS___POSIX_FCHOWN = 284 // { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); } SYS___POSIX_LCHOWN = 285 // { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); } SYS_GETSID = 286 // { pid_t|sys||getsid(pid_t pid); } SYS___CLONE = 287 // { pid_t|sys||__clone(int flags, void *stack); } SYS_FKTRACE = 288 // { int|sys||fktrace(int fd, int ops, int facs, pid_t pid); } SYS_PREADV = 289 // { ssize_t|sys||preadv(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } SYS_PWRITEV = 290 // { ssize_t|sys||pwritev(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } SYS___GETCWD = 296 // { int|sys||__getcwd(char *bufp, size_t length); } SYS_FCHROOT = 297 // { int|sys||fchroot(int fd); } SYS_LCHFLAGS = 304 // { int|sys||lchflags(const char *path, u_long flags); } SYS_ISSETUGID = 305 // { int|sys||issetugid(void); } SYS_UTRACE = 306 // { int|sys||utrace(const char *label, void *addr, size_t len); } SYS_GETCONTEXT = 307 // { int|sys||getcontext(struct __ucontext *ucp); } SYS_SETCONTEXT = 308 // { int|sys||setcontext(const struct __ucontext *ucp); } SYS__LWP_CREATE = 309 // { int|sys||_lwp_create(const struct __ucontext *ucp, u_long flags, lwpid_t *new_lwp); } SYS__LWP_EXIT = 310 // { int|sys||_lwp_exit(void); } SYS__LWP_SELF = 311 // { lwpid_t|sys||_lwp_self(void); } SYS__LWP_WAIT = 312 // { int|sys||_lwp_wait(lwpid_t wait_for, lwpid_t *departed); } SYS__LWP_SUSPEND = 313 // { int|sys||_lwp_suspend(lwpid_t target); } SYS__LWP_CONTINUE = 314 // { int|sys||_lwp_continue(lwpid_t target); } SYS__LWP_WAKEUP = 315 // { int|sys||_lwp_wakeup(lwpid_t target); } SYS__LWP_GETPRIVATE = 316 // { void *|sys||_lwp_getprivate(void); } SYS__LWP_SETPRIVATE = 317 // { void|sys||_lwp_setprivate(void *ptr); } SYS__LWP_KILL = 318 // { int|sys||_lwp_kill(lwpid_t target, int signo); } SYS__LWP_DETACH = 319 // { int|sys||_lwp_detach(lwpid_t target); } SYS__LWP_UNPARK = 321 // { int|sys||_lwp_unpark(lwpid_t target, const void *hint); } SYS__LWP_UNPARK_ALL = 322 // { ssize_t|sys||_lwp_unpark_all(const lwpid_t *targets, size_t ntargets, const void *hint); } SYS__LWP_SETNAME = 323 // { int|sys||_lwp_setname(lwpid_t target, const char *name); } SYS__LWP_GETNAME = 324 // { int|sys||_lwp_getname(lwpid_t target, char *name, size_t len); } SYS__LWP_CTL = 325 // { int|sys||_lwp_ctl(int features, struct lwpctl **address); } SYS___SIGACTION_SIGTRAMP = 340 // { int|sys||__sigaction_sigtramp(int signum, const struct sigaction *nsa, struct sigaction *osa, const void *tramp, int vers); } SYS_PMC_GET_INFO = 341 // { int|sys||pmc_get_info(int ctr, int op, void *args); } SYS_PMC_CONTROL = 342 // { int|sys||pmc_control(int ctr, int op, void *args); } SYS_RASCTL = 343 // { int|sys||rasctl(void *addr, size_t len, int op); } SYS_KQUEUE = 344 // { int|sys||kqueue(void); } SYS__SCHED_SETPARAM = 346 // { int|sys||_sched_setparam(pid_t pid, lwpid_t lid, int policy, const struct sched_param *params); } SYS__SCHED_GETPARAM = 347 // { int|sys||_sched_getparam(pid_t pid, lwpid_t lid, int *policy, struct sched_param *params); } SYS__SCHED_SETAFFINITY = 348 // { int|sys||_sched_setaffinity(pid_t pid, lwpid_t lid, size_t size, const cpuset_t *cpuset); } SYS__SCHED_GETAFFINITY = 349 // { int|sys||_sched_getaffinity(pid_t pid, lwpid_t lid, size_t size, cpuset_t *cpuset); } SYS_SCHED_YIELD = 350 // { int|sys||sched_yield(void); } SYS_FSYNC_RANGE = 354 // { int|sys||fsync_range(int fd, int flags, off_t start, off_t length); } SYS_UUIDGEN = 355 // { int|sys||uuidgen(struct uuid *store, int count); } SYS_GETVFSSTAT = 356 // { int|sys||getvfsstat(struct statvfs *buf, size_t bufsize, int flags); } SYS_STATVFS1 = 357 // { int|sys||statvfs1(const char *path, struct statvfs *buf, int flags); } SYS_FSTATVFS1 = 358 // { int|sys||fstatvfs1(int fd, struct statvfs *buf, int flags); } SYS_EXTATTRCTL = 360 // { int|sys||extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } SYS_EXTATTR_SET_FILE = 361 // { int|sys||extattr_set_file(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } SYS_EXTATTR_GET_FILE = 362 // { ssize_t|sys||extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_FILE = 363 // { int|sys||extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } SYS_EXTATTR_SET_FD = 364 // { int|sys||extattr_set_fd(int fd, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } SYS_EXTATTR_GET_FD = 365 // { ssize_t|sys||extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_FD = 366 // { int|sys||extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } SYS_EXTATTR_SET_LINK = 367 // { int|sys||extattr_set_link(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } SYS_EXTATTR_GET_LINK = 368 // { ssize_t|sys||extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_LINK = 369 // { int|sys||extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } SYS_EXTATTR_LIST_FD = 370 // { ssize_t|sys||extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } SYS_EXTATTR_LIST_FILE = 371 // { ssize_t|sys||extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } SYS_EXTATTR_LIST_LINK = 372 // { ssize_t|sys||extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } SYS_SETXATTR = 375 // { int|sys||setxattr(const char *path, const char *name, const void *value, size_t size, int flags); } SYS_LSETXATTR = 376 // { int|sys||lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); } SYS_FSETXATTR = 377 // { int|sys||fsetxattr(int fd, const char *name, const void *value, size_t size, int flags); } SYS_GETXATTR = 378 // { int|sys||getxattr(const char *path, const char *name, void *value, size_t size); } SYS_LGETXATTR = 379 // { int|sys||lgetxattr(const char *path, const char *name, void *value, size_t size); } SYS_FGETXATTR = 380 // { int|sys||fgetxattr(int fd, const char *name, void *value, size_t size); } SYS_LISTXATTR = 381 // { int|sys||listxattr(const char *path, char *list, size_t size); } SYS_LLISTXATTR = 382 // { int|sys||llistxattr(const char *path, char *list, size_t size); } SYS_FLISTXATTR = 383 // { int|sys||flistxattr(int fd, char *list, size_t size); } SYS_REMOVEXATTR = 384 // { int|sys||removexattr(const char *path, const char *name); } SYS_LREMOVEXATTR = 385 // { int|sys||lremovexattr(const char *path, const char *name); } SYS_FREMOVEXATTR = 386 // { int|sys||fremovexattr(int fd, const char *name); } SYS_GETDENTS = 390 // { int|sys|30|getdents(int fd, char *buf, size_t count); } SYS_SOCKET = 394 // { int|sys|30|socket(int domain, int type, int protocol); } SYS_GETFH = 395 // { int|sys|30|getfh(const char *fname, void *fhp, size_t *fh_size); } SYS_MOUNT = 410 // { int|sys|50|mount(const char *type, const char *path, int flags, void *data, size_t data_len); } SYS_MREMAP = 411 // { void *|sys||mremap(void *old_address, size_t old_size, void *new_address, size_t new_size, int flags); } SYS_PSET_CREATE = 412 // { int|sys||pset_create(psetid_t *psid); } SYS_PSET_DESTROY = 413 // { int|sys||pset_destroy(psetid_t psid); } SYS_PSET_ASSIGN = 414 // { int|sys||pset_assign(psetid_t psid, cpuid_t cpuid, psetid_t *opsid); } SYS__PSET_BIND = 415 // { int|sys||_pset_bind(idtype_t idtype, id_t first_id, id_t second_id, psetid_t psid, psetid_t *opsid); } SYS_POSIX_FADVISE = 416 // { int|sys|50|posix_fadvise(int fd, int PAD, off_t offset, off_t len, int advice); } SYS_SELECT = 417 // { int|sys|50|select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); } SYS_GETTIMEOFDAY = 418 // { int|sys|50|gettimeofday(struct timeval *tp, void *tzp); } SYS_SETTIMEOFDAY = 419 // { int|sys|50|settimeofday(const struct timeval *tv, const void *tzp); } SYS_UTIMES = 420 // { int|sys|50|utimes(const char *path, const struct timeval *tptr); } SYS_ADJTIME = 421 // { int|sys|50|adjtime(const struct timeval *delta, struct timeval *olddelta); } SYS_FUTIMES = 423 // { int|sys|50|futimes(int fd, const struct timeval *tptr); } SYS_LUTIMES = 424 // { int|sys|50|lutimes(const char *path, const struct timeval *tptr); } SYS_SETITIMER = 425 // { int|sys|50|setitimer(int which, const struct itimerval *itv, struct itimerval *oitv); } SYS_GETITIMER = 426 // { int|sys|50|getitimer(int which, struct itimerval *itv); } SYS_CLOCK_GETTIME = 427 // { int|sys|50|clock_gettime(clockid_t clock_id, struct timespec *tp); } SYS_CLOCK_SETTIME = 428 // { int|sys|50|clock_settime(clockid_t clock_id, const struct timespec *tp); } SYS_CLOCK_GETRES = 429 // { int|sys|50|clock_getres(clockid_t clock_id, struct timespec *tp); } SYS_NANOSLEEP = 430 // { int|sys|50|nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } SYS___SIGTIMEDWAIT = 431 // { int|sys|50|__sigtimedwait(const sigset_t *set, siginfo_t *info, struct timespec *timeout); } SYS__LWP_PARK = 434 // { int|sys|50|_lwp_park(const struct timespec *ts, lwpid_t unpark, const void *hint, const void *unparkhint); } SYS_KEVENT = 435 // { int|sys|50|kevent(int fd, const struct kevent *changelist, size_t nchanges, struct kevent *eventlist, size_t nevents, const struct timespec *timeout); } SYS_PSELECT = 436 // { int|sys|50|pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *mask); } SYS_POLLTS = 437 // { int|sys|50|pollts(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *mask); } SYS_STAT = 439 // { int|sys|50|stat(const char *path, struct stat *ub); } SYS_FSTAT = 440 // { int|sys|50|fstat(int fd, struct stat *sb); } SYS_LSTAT = 441 // { int|sys|50|lstat(const char *path, struct stat *ub); } SYS___SEMCTL = 442 // { int|sys|50|__semctl(int semid, int semnum, int cmd, ... union __semun *arg); } SYS_SHMCTL = 443 // { int|sys|50|shmctl(int shmid, int cmd, struct shmid_ds *buf); } SYS_MSGCTL = 444 // { int|sys|50|msgctl(int msqid, int cmd, struct msqid_ds *buf); } SYS_GETRUSAGE = 445 // { int|sys|50|getrusage(int who, struct rusage *rusage); } SYS_TIMER_SETTIME = 446 // { int|sys|50|timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); } SYS_TIMER_GETTIME = 447 // { int|sys|50|timer_gettime(timer_t timerid, struct itimerspec *value); } SYS_NTP_GETTIME = 448 // { int|sys|50|ntp_gettime(struct ntptimeval *ntvp); } SYS_WAIT4 = 449 // { int|sys|50|wait4(pid_t pid, int *status, int options, struct rusage *rusage); } SYS_MKNOD = 450 // { int|sys|50|mknod(const char *path, mode_t mode, dev_t dev); } SYS_FHSTAT = 451 // { int|sys|50|fhstat(const void *fhp, size_t fh_size, struct stat *sb); } SYS_PIPE2 = 453 // { int|sys||pipe2(int *fildes, int flags); } SYS_DUP3 = 454 // { int|sys||dup3(int from, int to, int flags); } SYS_KQUEUE1 = 455 // { int|sys||kqueue1(int flags); } SYS_PACCEPT = 456 // { int|sys||paccept(int s, struct sockaddr *name, socklen_t *anamelen, const sigset_t *mask, int flags); } SYS_LINKAT = 457 // { int|sys||linkat(int fd1, const char *name1, int fd2, const char *name2, int flags); } SYS_RENAMEAT = 458 // { int|sys||renameat(int fromfd, const char *from, int tofd, const char *to); } SYS_MKFIFOAT = 459 // { int|sys||mkfifoat(int fd, const char *path, mode_t mode); } SYS_MKNODAT = 460 // { int|sys||mknodat(int fd, const char *path, mode_t mode, uint32_t dev); } SYS_MKDIRAT = 461 // { int|sys||mkdirat(int fd, const char *path, mode_t mode); } SYS_FACCESSAT = 462 // { int|sys||faccessat(int fd, const char *path, int amode, int flag); } SYS_FCHMODAT = 463 // { int|sys||fchmodat(int fd, const char *path, mode_t mode, int flag); } SYS_FCHOWNAT = 464 // { int|sys||fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag); } SYS_FEXECVE = 465 // { int|sys||fexecve(int fd, char * const *argp, char * const *envp); } SYS_FSTATAT = 466 // { int|sys||fstatat(int fd, const char *path, struct stat *buf, int flag); } SYS_UTIMENSAT = 467 // { int|sys||utimensat(int fd, const char *path, const struct timespec *tptr, int flag); } SYS_OPENAT = 468 // { int|sys||openat(int fd, const char *path, int oflags, ... mode_t mode); } SYS_READLINKAT = 469 // { int|sys||readlinkat(int fd, const char *path, char *buf, size_t bufsize); } SYS_SYMLINKAT = 470 // { int|sys||symlinkat(const char *path1, int fd, const char *path2); } SYS_UNLINKAT = 471 // { int|sys||unlinkat(int fd, const char *path, int flag); } SYS_FUTIMENS = 472 // { int|sys||futimens(int fd, const struct timespec *tptr); } SYS___QUOTACTL = 473 // { int|sys||__quotactl(const char *path, struct quotactl_args *args); } SYS_POSIX_SPAWN = 474 // { int|sys||posix_spawn(pid_t *pid, const char *path, const struct posix_spawn_file_actions *file_actions, const struct posix_spawnattr *attrp, char *const *argv, char *const *envp); } SYS_RECVMMSG = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); } SYS_SENDMMSG = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); } ) ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go ================================================ // mksysnum_netbsd.pl // MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT // +build amd64,netbsd package unix const ( SYS_EXIT = 1 // { void|sys||exit(int rval); } SYS_FORK = 2 // { int|sys||fork(void); } SYS_READ = 3 // { ssize_t|sys||read(int fd, void *buf, size_t nbyte); } SYS_WRITE = 4 // { ssize_t|sys||write(int fd, const void *buf, size_t nbyte); } SYS_OPEN = 5 // { int|sys||open(const char *path, int flags, ... mode_t mode); } SYS_CLOSE = 6 // { int|sys||close(int fd); } SYS_LINK = 9 // { int|sys||link(const char *path, const char *link); } SYS_UNLINK = 10 // { int|sys||unlink(const char *path); } SYS_CHDIR = 12 // { int|sys||chdir(const char *path); } SYS_FCHDIR = 13 // { int|sys||fchdir(int fd); } SYS_CHMOD = 15 // { int|sys||chmod(const char *path, mode_t mode); } SYS_CHOWN = 16 // { int|sys||chown(const char *path, uid_t uid, gid_t gid); } SYS_BREAK = 17 // { int|sys||obreak(char *nsize); } SYS_GETPID = 20 // { pid_t|sys||getpid_with_ppid(void); } SYS_UNMOUNT = 22 // { int|sys||unmount(const char *path, int flags); } SYS_SETUID = 23 // { int|sys||setuid(uid_t uid); } SYS_GETUID = 24 // { uid_t|sys||getuid_with_euid(void); } SYS_GETEUID = 25 // { uid_t|sys||geteuid(void); } SYS_PTRACE = 26 // { int|sys||ptrace(int req, pid_t pid, void *addr, int data); } SYS_RECVMSG = 27 // { ssize_t|sys||recvmsg(int s, struct msghdr *msg, int flags); } SYS_SENDMSG = 28 // { ssize_t|sys||sendmsg(int s, const struct msghdr *msg, int flags); } SYS_RECVFROM = 29 // { ssize_t|sys||recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlenaddr); } SYS_ACCEPT = 30 // { int|sys||accept(int s, struct sockaddr *name, socklen_t *anamelen); } SYS_GETPEERNAME = 31 // { int|sys||getpeername(int fdes, struct sockaddr *asa, socklen_t *alen); } SYS_GETSOCKNAME = 32 // { int|sys||getsockname(int fdes, struct sockaddr *asa, socklen_t *alen); } SYS_ACCESS = 33 // { int|sys||access(const char *path, int flags); } SYS_CHFLAGS = 34 // { int|sys||chflags(const char *path, u_long flags); } SYS_FCHFLAGS = 35 // { int|sys||fchflags(int fd, u_long flags); } SYS_SYNC = 36 // { void|sys||sync(void); } SYS_KILL = 37 // { int|sys||kill(pid_t pid, int signum); } SYS_GETPPID = 39 // { pid_t|sys||getppid(void); } SYS_DUP = 41 // { int|sys||dup(int fd); } SYS_PIPE = 42 // { int|sys||pipe(void); } SYS_GETEGID = 43 // { gid_t|sys||getegid(void); } SYS_PROFIL = 44 // { int|sys||profil(char *samples, size_t size, u_long offset, u_int scale); } SYS_KTRACE = 45 // { int|sys||ktrace(const char *fname, int ops, int facs, pid_t pid); } SYS_GETGID = 47 // { gid_t|sys||getgid_with_egid(void); } SYS___GETLOGIN = 49 // { int|sys||__getlogin(char *namebuf, size_t namelen); } SYS___SETLOGIN = 50 // { int|sys||__setlogin(const char *namebuf); } SYS_ACCT = 51 // { int|sys||acct(const char *path); } SYS_IOCTL = 54 // { int|sys||ioctl(int fd, u_long com, ... void *data); } SYS_REVOKE = 56 // { int|sys||revoke(const char *path); } SYS_SYMLINK = 57 // { int|sys||symlink(const char *path, const char *link); } SYS_READLINK = 58 // { ssize_t|sys||readlink(const char *path, char *buf, size_t count); } SYS_EXECVE = 59 // { int|sys||execve(const char *path, char * const *argp, char * const *envp); } SYS_UMASK = 60 // { mode_t|sys||umask(mode_t newmask); } SYS_CHROOT = 61 // { int|sys||chroot(const char *path); } SYS_VFORK = 66 // { int|sys||vfork(void); } SYS_SBRK = 69 // { int|sys||sbrk(intptr_t incr); } SYS_SSTK = 70 // { int|sys||sstk(int incr); } SYS_VADVISE = 72 // { int|sys||ovadvise(int anom); } SYS_MUNMAP = 73 // { int|sys||munmap(void *addr, size_t len); } SYS_MPROTECT = 74 // { int|sys||mprotect(void *addr, size_t len, int prot); } SYS_MADVISE = 75 // { int|sys||madvise(void *addr, size_t len, int behav); } SYS_MINCORE = 78 // { int|sys||mincore(void *addr, size_t len, char *vec); } SYS_GETGROUPS = 79 // { int|sys||getgroups(int gidsetsize, gid_t *gidset); } SYS_SETGROUPS = 80 // { int|sys||setgroups(int gidsetsize, const gid_t *gidset); } SYS_GETPGRP = 81 // { int|sys||getpgrp(void); } SYS_SETPGID = 82 // { int|sys||setpgid(pid_t pid, pid_t pgid); } SYS_DUP2 = 90 // { int|sys||dup2(int from, int to); } SYS_FCNTL = 92 // { int|sys||fcntl(int fd, int cmd, ... void *arg); } SYS_FSYNC = 95 // { int|sys||fsync(int fd); } SYS_SETPRIORITY = 96 // { int|sys||setpriority(int which, id_t who, int prio); } SYS_CONNECT = 98 // { int|sys||connect(int s, const struct sockaddr *name, socklen_t namelen); } SYS_GETPRIORITY = 100 // { int|sys||getpriority(int which, id_t who); } SYS_BIND = 104 // { int|sys||bind(int s, const struct sockaddr *name, socklen_t namelen); } SYS_SETSOCKOPT = 105 // { int|sys||setsockopt(int s, int level, int name, const void *val, socklen_t valsize); } SYS_LISTEN = 106 // { int|sys||listen(int s, int backlog); } SYS_GETSOCKOPT = 118 // { int|sys||getsockopt(int s, int level, int name, void *val, socklen_t *avalsize); } SYS_READV = 120 // { ssize_t|sys||readv(int fd, const struct iovec *iovp, int iovcnt); } SYS_WRITEV = 121 // { ssize_t|sys||writev(int fd, const struct iovec *iovp, int iovcnt); } SYS_FCHOWN = 123 // { int|sys||fchown(int fd, uid_t uid, gid_t gid); } SYS_FCHMOD = 124 // { int|sys||fchmod(int fd, mode_t mode); } SYS_SETREUID = 126 // { int|sys||setreuid(uid_t ruid, uid_t euid); } SYS_SETREGID = 127 // { int|sys||setregid(gid_t rgid, gid_t egid); } SYS_RENAME = 128 // { int|sys||rename(const char *from, const char *to); } SYS_FLOCK = 131 // { int|sys||flock(int fd, int how); } SYS_MKFIFO = 132 // { int|sys||mkfifo(const char *path, mode_t mode); } SYS_SENDTO = 133 // { ssize_t|sys||sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); } SYS_SHUTDOWN = 134 // { int|sys||shutdown(int s, int how); } SYS_SOCKETPAIR = 135 // { int|sys||socketpair(int domain, int type, int protocol, int *rsv); } SYS_MKDIR = 136 // { int|sys||mkdir(const char *path, mode_t mode); } SYS_RMDIR = 137 // { int|sys||rmdir(const char *path); } SYS_SETSID = 147 // { int|sys||setsid(void); } SYS_SYSARCH = 165 // { int|sys||sysarch(int op, void *parms); } SYS_PREAD = 173 // { ssize_t|sys||pread(int fd, void *buf, size_t nbyte, int PAD, off_t offset); } SYS_PWRITE = 174 // { ssize_t|sys||pwrite(int fd, const void *buf, size_t nbyte, int PAD, off_t offset); } SYS_NTP_ADJTIME = 176 // { int|sys||ntp_adjtime(struct timex *tp); } SYS_SETGID = 181 // { int|sys||setgid(gid_t gid); } SYS_SETEGID = 182 // { int|sys||setegid(gid_t egid); } SYS_SETEUID = 183 // { int|sys||seteuid(uid_t euid); } SYS_PATHCONF = 191 // { long|sys||pathconf(const char *path, int name); } SYS_FPATHCONF = 192 // { long|sys||fpathconf(int fd, int name); } SYS_GETRLIMIT = 194 // { int|sys||getrlimit(int which, struct rlimit *rlp); } SYS_SETRLIMIT = 195 // { int|sys||setrlimit(int which, const struct rlimit *rlp); } SYS_MMAP = 197 // { void *|sys||mmap(void *addr, size_t len, int prot, int flags, int fd, long PAD, off_t pos); } SYS_LSEEK = 199 // { off_t|sys||lseek(int fd, int PAD, off_t offset, int whence); } SYS_TRUNCATE = 200 // { int|sys||truncate(const char *path, int PAD, off_t length); } SYS_FTRUNCATE = 201 // { int|sys||ftruncate(int fd, int PAD, off_t length); } SYS___SYSCTL = 202 // { int|sys||__sysctl(const int *name, u_int namelen, void *old, size_t *oldlenp, const void *new, size_t newlen); } SYS_MLOCK = 203 // { int|sys||mlock(const void *addr, size_t len); } SYS_MUNLOCK = 204 // { int|sys||munlock(const void *addr, size_t len); } SYS_UNDELETE = 205 // { int|sys||undelete(const char *path); } SYS_GETPGID = 207 // { pid_t|sys||getpgid(pid_t pid); } SYS_REBOOT = 208 // { int|sys||reboot(int opt, char *bootstr); } SYS_POLL = 209 // { int|sys||poll(struct pollfd *fds, u_int nfds, int timeout); } SYS_SEMGET = 221 // { int|sys||semget(key_t key, int nsems, int semflg); } SYS_SEMOP = 222 // { int|sys||semop(int semid, struct sembuf *sops, size_t nsops); } SYS_SEMCONFIG = 223 // { int|sys||semconfig(int flag); } SYS_MSGGET = 225 // { int|sys||msgget(key_t key, int msgflg); } SYS_MSGSND = 226 // { int|sys||msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } SYS_MSGRCV = 227 // { ssize_t|sys||msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } SYS_SHMAT = 228 // { void *|sys||shmat(int shmid, const void *shmaddr, int shmflg); } SYS_SHMDT = 230 // { int|sys||shmdt(const void *shmaddr); } SYS_SHMGET = 231 // { int|sys||shmget(key_t key, size_t size, int shmflg); } SYS_TIMER_CREATE = 235 // { int|sys||timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid); } SYS_TIMER_DELETE = 236 // { int|sys||timer_delete(timer_t timerid); } SYS_TIMER_GETOVERRUN = 239 // { int|sys||timer_getoverrun(timer_t timerid); } SYS_FDATASYNC = 241 // { int|sys||fdatasync(int fd); } SYS_MLOCKALL = 242 // { int|sys||mlockall(int flags); } SYS_MUNLOCKALL = 243 // { int|sys||munlockall(void); } SYS_SIGQUEUEINFO = 245 // { int|sys||sigqueueinfo(pid_t pid, const siginfo_t *info); } SYS_MODCTL = 246 // { int|sys||modctl(int cmd, void *arg); } SYS___POSIX_RENAME = 270 // { int|sys||__posix_rename(const char *from, const char *to); } SYS_SWAPCTL = 271 // { int|sys||swapctl(int cmd, void *arg, int misc); } SYS_MINHERIT = 273 // { int|sys||minherit(void *addr, size_t len, int inherit); } SYS_LCHMOD = 274 // { int|sys||lchmod(const char *path, mode_t mode); } SYS_LCHOWN = 275 // { int|sys||lchown(const char *path, uid_t uid, gid_t gid); } SYS_MSYNC = 277 // { int|sys|13|msync(void *addr, size_t len, int flags); } SYS___POSIX_CHOWN = 283 // { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); } SYS___POSIX_FCHOWN = 284 // { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); } SYS___POSIX_LCHOWN = 285 // { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); } SYS_GETSID = 286 // { pid_t|sys||getsid(pid_t pid); } SYS___CLONE = 287 // { pid_t|sys||__clone(int flags, void *stack); } SYS_FKTRACE = 288 // { int|sys||fktrace(int fd, int ops, int facs, pid_t pid); } SYS_PREADV = 289 // { ssize_t|sys||preadv(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } SYS_PWRITEV = 290 // { ssize_t|sys||pwritev(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } SYS___GETCWD = 296 // { int|sys||__getcwd(char *bufp, size_t length); } SYS_FCHROOT = 297 // { int|sys||fchroot(int fd); } SYS_LCHFLAGS = 304 // { int|sys||lchflags(const char *path, u_long flags); } SYS_ISSETUGID = 305 // { int|sys||issetugid(void); } SYS_UTRACE = 306 // { int|sys||utrace(const char *label, void *addr, size_t len); } SYS_GETCONTEXT = 307 // { int|sys||getcontext(struct __ucontext *ucp); } SYS_SETCONTEXT = 308 // { int|sys||setcontext(const struct __ucontext *ucp); } SYS__LWP_CREATE = 309 // { int|sys||_lwp_create(const struct __ucontext *ucp, u_long flags, lwpid_t *new_lwp); } SYS__LWP_EXIT = 310 // { int|sys||_lwp_exit(void); } SYS__LWP_SELF = 311 // { lwpid_t|sys||_lwp_self(void); } SYS__LWP_WAIT = 312 // { int|sys||_lwp_wait(lwpid_t wait_for, lwpid_t *departed); } SYS__LWP_SUSPEND = 313 // { int|sys||_lwp_suspend(lwpid_t target); } SYS__LWP_CONTINUE = 314 // { int|sys||_lwp_continue(lwpid_t target); } SYS__LWP_WAKEUP = 315 // { int|sys||_lwp_wakeup(lwpid_t target); } SYS__LWP_GETPRIVATE = 316 // { void *|sys||_lwp_getprivate(void); } SYS__LWP_SETPRIVATE = 317 // { void|sys||_lwp_setprivate(void *ptr); } SYS__LWP_KILL = 318 // { int|sys||_lwp_kill(lwpid_t target, int signo); } SYS__LWP_DETACH = 319 // { int|sys||_lwp_detach(lwpid_t target); } SYS__LWP_UNPARK = 321 // { int|sys||_lwp_unpark(lwpid_t target, const void *hint); } SYS__LWP_UNPARK_ALL = 322 // { ssize_t|sys||_lwp_unpark_all(const lwpid_t *targets, size_t ntargets, const void *hint); } SYS__LWP_SETNAME = 323 // { int|sys||_lwp_setname(lwpid_t target, const char *name); } SYS__LWP_GETNAME = 324 // { int|sys||_lwp_getname(lwpid_t target, char *name, size_t len); } SYS__LWP_CTL = 325 // { int|sys||_lwp_ctl(int features, struct lwpctl **address); } SYS___SIGACTION_SIGTRAMP = 340 // { int|sys||__sigaction_sigtramp(int signum, const struct sigaction *nsa, struct sigaction *osa, const void *tramp, int vers); } SYS_PMC_GET_INFO = 341 // { int|sys||pmc_get_info(int ctr, int op, void *args); } SYS_PMC_CONTROL = 342 // { int|sys||pmc_control(int ctr, int op, void *args); } SYS_RASCTL = 343 // { int|sys||rasctl(void *addr, size_t len, int op); } SYS_KQUEUE = 344 // { int|sys||kqueue(void); } SYS__SCHED_SETPARAM = 346 // { int|sys||_sched_setparam(pid_t pid, lwpid_t lid, int policy, const struct sched_param *params); } SYS__SCHED_GETPARAM = 347 // { int|sys||_sched_getparam(pid_t pid, lwpid_t lid, int *policy, struct sched_param *params); } SYS__SCHED_SETAFFINITY = 348 // { int|sys||_sched_setaffinity(pid_t pid, lwpid_t lid, size_t size, const cpuset_t *cpuset); } SYS__SCHED_GETAFFINITY = 349 // { int|sys||_sched_getaffinity(pid_t pid, lwpid_t lid, size_t size, cpuset_t *cpuset); } SYS_SCHED_YIELD = 350 // { int|sys||sched_yield(void); } SYS_FSYNC_RANGE = 354 // { int|sys||fsync_range(int fd, int flags, off_t start, off_t length); } SYS_UUIDGEN = 355 // { int|sys||uuidgen(struct uuid *store, int count); } SYS_GETVFSSTAT = 356 // { int|sys||getvfsstat(struct statvfs *buf, size_t bufsize, int flags); } SYS_STATVFS1 = 357 // { int|sys||statvfs1(const char *path, struct statvfs *buf, int flags); } SYS_FSTATVFS1 = 358 // { int|sys||fstatvfs1(int fd, struct statvfs *buf, int flags); } SYS_EXTATTRCTL = 360 // { int|sys||extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } SYS_EXTATTR_SET_FILE = 361 // { int|sys||extattr_set_file(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } SYS_EXTATTR_GET_FILE = 362 // { ssize_t|sys||extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_FILE = 363 // { int|sys||extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } SYS_EXTATTR_SET_FD = 364 // { int|sys||extattr_set_fd(int fd, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } SYS_EXTATTR_GET_FD = 365 // { ssize_t|sys||extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_FD = 366 // { int|sys||extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } SYS_EXTATTR_SET_LINK = 367 // { int|sys||extattr_set_link(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } SYS_EXTATTR_GET_LINK = 368 // { ssize_t|sys||extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_LINK = 369 // { int|sys||extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } SYS_EXTATTR_LIST_FD = 370 // { ssize_t|sys||extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } SYS_EXTATTR_LIST_FILE = 371 // { ssize_t|sys||extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } SYS_EXTATTR_LIST_LINK = 372 // { ssize_t|sys||extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } SYS_SETXATTR = 375 // { int|sys||setxattr(const char *path, const char *name, const void *value, size_t size, int flags); } SYS_LSETXATTR = 376 // { int|sys||lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); } SYS_FSETXATTR = 377 // { int|sys||fsetxattr(int fd, const char *name, const void *value, size_t size, int flags); } SYS_GETXATTR = 378 // { int|sys||getxattr(const char *path, const char *name, void *value, size_t size); } SYS_LGETXATTR = 379 // { int|sys||lgetxattr(const char *path, const char *name, void *value, size_t size); } SYS_FGETXATTR = 380 // { int|sys||fgetxattr(int fd, const char *name, void *value, size_t size); } SYS_LISTXATTR = 381 // { int|sys||listxattr(const char *path, char *list, size_t size); } SYS_LLISTXATTR = 382 // { int|sys||llistxattr(const char *path, char *list, size_t size); } SYS_FLISTXATTR = 383 // { int|sys||flistxattr(int fd, char *list, size_t size); } SYS_REMOVEXATTR = 384 // { int|sys||removexattr(const char *path, const char *name); } SYS_LREMOVEXATTR = 385 // { int|sys||lremovexattr(const char *path, const char *name); } SYS_FREMOVEXATTR = 386 // { int|sys||fremovexattr(int fd, const char *name); } SYS_GETDENTS = 390 // { int|sys|30|getdents(int fd, char *buf, size_t count); } SYS_SOCKET = 394 // { int|sys|30|socket(int domain, int type, int protocol); } SYS_GETFH = 395 // { int|sys|30|getfh(const char *fname, void *fhp, size_t *fh_size); } SYS_MOUNT = 410 // { int|sys|50|mount(const char *type, const char *path, int flags, void *data, size_t data_len); } SYS_MREMAP = 411 // { void *|sys||mremap(void *old_address, size_t old_size, void *new_address, size_t new_size, int flags); } SYS_PSET_CREATE = 412 // { int|sys||pset_create(psetid_t *psid); } SYS_PSET_DESTROY = 413 // { int|sys||pset_destroy(psetid_t psid); } SYS_PSET_ASSIGN = 414 // { int|sys||pset_assign(psetid_t psid, cpuid_t cpuid, psetid_t *opsid); } SYS__PSET_BIND = 415 // { int|sys||_pset_bind(idtype_t idtype, id_t first_id, id_t second_id, psetid_t psid, psetid_t *opsid); } SYS_POSIX_FADVISE = 416 // { int|sys|50|posix_fadvise(int fd, int PAD, off_t offset, off_t len, int advice); } SYS_SELECT = 417 // { int|sys|50|select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); } SYS_GETTIMEOFDAY = 418 // { int|sys|50|gettimeofday(struct timeval *tp, void *tzp); } SYS_SETTIMEOFDAY = 419 // { int|sys|50|settimeofday(const struct timeval *tv, const void *tzp); } SYS_UTIMES = 420 // { int|sys|50|utimes(const char *path, const struct timeval *tptr); } SYS_ADJTIME = 421 // { int|sys|50|adjtime(const struct timeval *delta, struct timeval *olddelta); } SYS_FUTIMES = 423 // { int|sys|50|futimes(int fd, const struct timeval *tptr); } SYS_LUTIMES = 424 // { int|sys|50|lutimes(const char *path, const struct timeval *tptr); } SYS_SETITIMER = 425 // { int|sys|50|setitimer(int which, const struct itimerval *itv, struct itimerval *oitv); } SYS_GETITIMER = 426 // { int|sys|50|getitimer(int which, struct itimerval *itv); } SYS_CLOCK_GETTIME = 427 // { int|sys|50|clock_gettime(clockid_t clock_id, struct timespec *tp); } SYS_CLOCK_SETTIME = 428 // { int|sys|50|clock_settime(clockid_t clock_id, const struct timespec *tp); } SYS_CLOCK_GETRES = 429 // { int|sys|50|clock_getres(clockid_t clock_id, struct timespec *tp); } SYS_NANOSLEEP = 430 // { int|sys|50|nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } SYS___SIGTIMEDWAIT = 431 // { int|sys|50|__sigtimedwait(const sigset_t *set, siginfo_t *info, struct timespec *timeout); } SYS__LWP_PARK = 434 // { int|sys|50|_lwp_park(const struct timespec *ts, lwpid_t unpark, const void *hint, const void *unparkhint); } SYS_KEVENT = 435 // { int|sys|50|kevent(int fd, const struct kevent *changelist, size_t nchanges, struct kevent *eventlist, size_t nevents, const struct timespec *timeout); } SYS_PSELECT = 436 // { int|sys|50|pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *mask); } SYS_POLLTS = 437 // { int|sys|50|pollts(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *mask); } SYS_STAT = 439 // { int|sys|50|stat(const char *path, struct stat *ub); } SYS_FSTAT = 440 // { int|sys|50|fstat(int fd, struct stat *sb); } SYS_LSTAT = 441 // { int|sys|50|lstat(const char *path, struct stat *ub); } SYS___SEMCTL = 442 // { int|sys|50|__semctl(int semid, int semnum, int cmd, ... union __semun *arg); } SYS_SHMCTL = 443 // { int|sys|50|shmctl(int shmid, int cmd, struct shmid_ds *buf); } SYS_MSGCTL = 444 // { int|sys|50|msgctl(int msqid, int cmd, struct msqid_ds *buf); } SYS_GETRUSAGE = 445 // { int|sys|50|getrusage(int who, struct rusage *rusage); } SYS_TIMER_SETTIME = 446 // { int|sys|50|timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); } SYS_TIMER_GETTIME = 447 // { int|sys|50|timer_gettime(timer_t timerid, struct itimerspec *value); } SYS_NTP_GETTIME = 448 // { int|sys|50|ntp_gettime(struct ntptimeval *ntvp); } SYS_WAIT4 = 449 // { int|sys|50|wait4(pid_t pid, int *status, int options, struct rusage *rusage); } SYS_MKNOD = 450 // { int|sys|50|mknod(const char *path, mode_t mode, dev_t dev); } SYS_FHSTAT = 451 // { int|sys|50|fhstat(const void *fhp, size_t fh_size, struct stat *sb); } SYS_PIPE2 = 453 // { int|sys||pipe2(int *fildes, int flags); } SYS_DUP3 = 454 // { int|sys||dup3(int from, int to, int flags); } SYS_KQUEUE1 = 455 // { int|sys||kqueue1(int flags); } SYS_PACCEPT = 456 // { int|sys||paccept(int s, struct sockaddr *name, socklen_t *anamelen, const sigset_t *mask, int flags); } SYS_LINKAT = 457 // { int|sys||linkat(int fd1, const char *name1, int fd2, const char *name2, int flags); } SYS_RENAMEAT = 458 // { int|sys||renameat(int fromfd, const char *from, int tofd, const char *to); } SYS_MKFIFOAT = 459 // { int|sys||mkfifoat(int fd, const char *path, mode_t mode); } SYS_MKNODAT = 460 // { int|sys||mknodat(int fd, const char *path, mode_t mode, uint32_t dev); } SYS_MKDIRAT = 461 // { int|sys||mkdirat(int fd, const char *path, mode_t mode); } SYS_FACCESSAT = 462 // { int|sys||faccessat(int fd, const char *path, int amode, int flag); } SYS_FCHMODAT = 463 // { int|sys||fchmodat(int fd, const char *path, mode_t mode, int flag); } SYS_FCHOWNAT = 464 // { int|sys||fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag); } SYS_FEXECVE = 465 // { int|sys||fexecve(int fd, char * const *argp, char * const *envp); } SYS_FSTATAT = 466 // { int|sys||fstatat(int fd, const char *path, struct stat *buf, int flag); } SYS_UTIMENSAT = 467 // { int|sys||utimensat(int fd, const char *path, const struct timespec *tptr, int flag); } SYS_OPENAT = 468 // { int|sys||openat(int fd, const char *path, int oflags, ... mode_t mode); } SYS_READLINKAT = 469 // { int|sys||readlinkat(int fd, const char *path, char *buf, size_t bufsize); } SYS_SYMLINKAT = 470 // { int|sys||symlinkat(const char *path1, int fd, const char *path2); } SYS_UNLINKAT = 471 // { int|sys||unlinkat(int fd, const char *path, int flag); } SYS_FUTIMENS = 472 // { int|sys||futimens(int fd, const struct timespec *tptr); } SYS___QUOTACTL = 473 // { int|sys||__quotactl(const char *path, struct quotactl_args *args); } SYS_POSIX_SPAWN = 474 // { int|sys||posix_spawn(pid_t *pid, const char *path, const struct posix_spawn_file_actions *file_actions, const struct posix_spawnattr *attrp, char *const *argv, char *const *envp); } SYS_RECVMMSG = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); } SYS_SENDMMSG = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); } ) ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go ================================================ // mksysnum_netbsd.pl // MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT // +build arm,netbsd package unix const ( SYS_EXIT = 1 // { void|sys||exit(int rval); } SYS_FORK = 2 // { int|sys||fork(void); } SYS_READ = 3 // { ssize_t|sys||read(int fd, void *buf, size_t nbyte); } SYS_WRITE = 4 // { ssize_t|sys||write(int fd, const void *buf, size_t nbyte); } SYS_OPEN = 5 // { int|sys||open(const char *path, int flags, ... mode_t mode); } SYS_CLOSE = 6 // { int|sys||close(int fd); } SYS_LINK = 9 // { int|sys||link(const char *path, const char *link); } SYS_UNLINK = 10 // { int|sys||unlink(const char *path); } SYS_CHDIR = 12 // { int|sys||chdir(const char *path); } SYS_FCHDIR = 13 // { int|sys||fchdir(int fd); } SYS_CHMOD = 15 // { int|sys||chmod(const char *path, mode_t mode); } SYS_CHOWN = 16 // { int|sys||chown(const char *path, uid_t uid, gid_t gid); } SYS_BREAK = 17 // { int|sys||obreak(char *nsize); } SYS_GETPID = 20 // { pid_t|sys||getpid_with_ppid(void); } SYS_UNMOUNT = 22 // { int|sys||unmount(const char *path, int flags); } SYS_SETUID = 23 // { int|sys||setuid(uid_t uid); } SYS_GETUID = 24 // { uid_t|sys||getuid_with_euid(void); } SYS_GETEUID = 25 // { uid_t|sys||geteuid(void); } SYS_PTRACE = 26 // { int|sys||ptrace(int req, pid_t pid, void *addr, int data); } SYS_RECVMSG = 27 // { ssize_t|sys||recvmsg(int s, struct msghdr *msg, int flags); } SYS_SENDMSG = 28 // { ssize_t|sys||sendmsg(int s, const struct msghdr *msg, int flags); } SYS_RECVFROM = 29 // { ssize_t|sys||recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlenaddr); } SYS_ACCEPT = 30 // { int|sys||accept(int s, struct sockaddr *name, socklen_t *anamelen); } SYS_GETPEERNAME = 31 // { int|sys||getpeername(int fdes, struct sockaddr *asa, socklen_t *alen); } SYS_GETSOCKNAME = 32 // { int|sys||getsockname(int fdes, struct sockaddr *asa, socklen_t *alen); } SYS_ACCESS = 33 // { int|sys||access(const char *path, int flags); } SYS_CHFLAGS = 34 // { int|sys||chflags(const char *path, u_long flags); } SYS_FCHFLAGS = 35 // { int|sys||fchflags(int fd, u_long flags); } SYS_SYNC = 36 // { void|sys||sync(void); } SYS_KILL = 37 // { int|sys||kill(pid_t pid, int signum); } SYS_GETPPID = 39 // { pid_t|sys||getppid(void); } SYS_DUP = 41 // { int|sys||dup(int fd); } SYS_PIPE = 42 // { int|sys||pipe(void); } SYS_GETEGID = 43 // { gid_t|sys||getegid(void); } SYS_PROFIL = 44 // { int|sys||profil(char *samples, size_t size, u_long offset, u_int scale); } SYS_KTRACE = 45 // { int|sys||ktrace(const char *fname, int ops, int facs, pid_t pid); } SYS_GETGID = 47 // { gid_t|sys||getgid_with_egid(void); } SYS___GETLOGIN = 49 // { int|sys||__getlogin(char *namebuf, size_t namelen); } SYS___SETLOGIN = 50 // { int|sys||__setlogin(const char *namebuf); } SYS_ACCT = 51 // { int|sys||acct(const char *path); } SYS_IOCTL = 54 // { int|sys||ioctl(int fd, u_long com, ... void *data); } SYS_REVOKE = 56 // { int|sys||revoke(const char *path); } SYS_SYMLINK = 57 // { int|sys||symlink(const char *path, const char *link); } SYS_READLINK = 58 // { ssize_t|sys||readlink(const char *path, char *buf, size_t count); } SYS_EXECVE = 59 // { int|sys||execve(const char *path, char * const *argp, char * const *envp); } SYS_UMASK = 60 // { mode_t|sys||umask(mode_t newmask); } SYS_CHROOT = 61 // { int|sys||chroot(const char *path); } SYS_VFORK = 66 // { int|sys||vfork(void); } SYS_SBRK = 69 // { int|sys||sbrk(intptr_t incr); } SYS_SSTK = 70 // { int|sys||sstk(int incr); } SYS_VADVISE = 72 // { int|sys||ovadvise(int anom); } SYS_MUNMAP = 73 // { int|sys||munmap(void *addr, size_t len); } SYS_MPROTECT = 74 // { int|sys||mprotect(void *addr, size_t len, int prot); } SYS_MADVISE = 75 // { int|sys||madvise(void *addr, size_t len, int behav); } SYS_MINCORE = 78 // { int|sys||mincore(void *addr, size_t len, char *vec); } SYS_GETGROUPS = 79 // { int|sys||getgroups(int gidsetsize, gid_t *gidset); } SYS_SETGROUPS = 80 // { int|sys||setgroups(int gidsetsize, const gid_t *gidset); } SYS_GETPGRP = 81 // { int|sys||getpgrp(void); } SYS_SETPGID = 82 // { int|sys||setpgid(pid_t pid, pid_t pgid); } SYS_DUP2 = 90 // { int|sys||dup2(int from, int to); } SYS_FCNTL = 92 // { int|sys||fcntl(int fd, int cmd, ... void *arg); } SYS_FSYNC = 95 // { int|sys||fsync(int fd); } SYS_SETPRIORITY = 96 // { int|sys||setpriority(int which, id_t who, int prio); } SYS_CONNECT = 98 // { int|sys||connect(int s, const struct sockaddr *name, socklen_t namelen); } SYS_GETPRIORITY = 100 // { int|sys||getpriority(int which, id_t who); } SYS_BIND = 104 // { int|sys||bind(int s, const struct sockaddr *name, socklen_t namelen); } SYS_SETSOCKOPT = 105 // { int|sys||setsockopt(int s, int level, int name, const void *val, socklen_t valsize); } SYS_LISTEN = 106 // { int|sys||listen(int s, int backlog); } SYS_GETSOCKOPT = 118 // { int|sys||getsockopt(int s, int level, int name, void *val, socklen_t *avalsize); } SYS_READV = 120 // { ssize_t|sys||readv(int fd, const struct iovec *iovp, int iovcnt); } SYS_WRITEV = 121 // { ssize_t|sys||writev(int fd, const struct iovec *iovp, int iovcnt); } SYS_FCHOWN = 123 // { int|sys||fchown(int fd, uid_t uid, gid_t gid); } SYS_FCHMOD = 124 // { int|sys||fchmod(int fd, mode_t mode); } SYS_SETREUID = 126 // { int|sys||setreuid(uid_t ruid, uid_t euid); } SYS_SETREGID = 127 // { int|sys||setregid(gid_t rgid, gid_t egid); } SYS_RENAME = 128 // { int|sys||rename(const char *from, const char *to); } SYS_FLOCK = 131 // { int|sys||flock(int fd, int how); } SYS_MKFIFO = 132 // { int|sys||mkfifo(const char *path, mode_t mode); } SYS_SENDTO = 133 // { ssize_t|sys||sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); } SYS_SHUTDOWN = 134 // { int|sys||shutdown(int s, int how); } SYS_SOCKETPAIR = 135 // { int|sys||socketpair(int domain, int type, int protocol, int *rsv); } SYS_MKDIR = 136 // { int|sys||mkdir(const char *path, mode_t mode); } SYS_RMDIR = 137 // { int|sys||rmdir(const char *path); } SYS_SETSID = 147 // { int|sys||setsid(void); } SYS_SYSARCH = 165 // { int|sys||sysarch(int op, void *parms); } SYS_PREAD = 173 // { ssize_t|sys||pread(int fd, void *buf, size_t nbyte, int PAD, off_t offset); } SYS_PWRITE = 174 // { ssize_t|sys||pwrite(int fd, const void *buf, size_t nbyte, int PAD, off_t offset); } SYS_NTP_ADJTIME = 176 // { int|sys||ntp_adjtime(struct timex *tp); } SYS_SETGID = 181 // { int|sys||setgid(gid_t gid); } SYS_SETEGID = 182 // { int|sys||setegid(gid_t egid); } SYS_SETEUID = 183 // { int|sys||seteuid(uid_t euid); } SYS_PATHCONF = 191 // { long|sys||pathconf(const char *path, int name); } SYS_FPATHCONF = 192 // { long|sys||fpathconf(int fd, int name); } SYS_GETRLIMIT = 194 // { int|sys||getrlimit(int which, struct rlimit *rlp); } SYS_SETRLIMIT = 195 // { int|sys||setrlimit(int which, const struct rlimit *rlp); } SYS_MMAP = 197 // { void *|sys||mmap(void *addr, size_t len, int prot, int flags, int fd, long PAD, off_t pos); } SYS_LSEEK = 199 // { off_t|sys||lseek(int fd, int PAD, off_t offset, int whence); } SYS_TRUNCATE = 200 // { int|sys||truncate(const char *path, int PAD, off_t length); } SYS_FTRUNCATE = 201 // { int|sys||ftruncate(int fd, int PAD, off_t length); } SYS___SYSCTL = 202 // { int|sys||__sysctl(const int *name, u_int namelen, void *old, size_t *oldlenp, const void *new, size_t newlen); } SYS_MLOCK = 203 // { int|sys||mlock(const void *addr, size_t len); } SYS_MUNLOCK = 204 // { int|sys||munlock(const void *addr, size_t len); } SYS_UNDELETE = 205 // { int|sys||undelete(const char *path); } SYS_GETPGID = 207 // { pid_t|sys||getpgid(pid_t pid); } SYS_REBOOT = 208 // { int|sys||reboot(int opt, char *bootstr); } SYS_POLL = 209 // { int|sys||poll(struct pollfd *fds, u_int nfds, int timeout); } SYS_SEMGET = 221 // { int|sys||semget(key_t key, int nsems, int semflg); } SYS_SEMOP = 222 // { int|sys||semop(int semid, struct sembuf *sops, size_t nsops); } SYS_SEMCONFIG = 223 // { int|sys||semconfig(int flag); } SYS_MSGGET = 225 // { int|sys||msgget(key_t key, int msgflg); } SYS_MSGSND = 226 // { int|sys||msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } SYS_MSGRCV = 227 // { ssize_t|sys||msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } SYS_SHMAT = 228 // { void *|sys||shmat(int shmid, const void *shmaddr, int shmflg); } SYS_SHMDT = 230 // { int|sys||shmdt(const void *shmaddr); } SYS_SHMGET = 231 // { int|sys||shmget(key_t key, size_t size, int shmflg); } SYS_TIMER_CREATE = 235 // { int|sys||timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid); } SYS_TIMER_DELETE = 236 // { int|sys||timer_delete(timer_t timerid); } SYS_TIMER_GETOVERRUN = 239 // { int|sys||timer_getoverrun(timer_t timerid); } SYS_FDATASYNC = 241 // { int|sys||fdatasync(int fd); } SYS_MLOCKALL = 242 // { int|sys||mlockall(int flags); } SYS_MUNLOCKALL = 243 // { int|sys||munlockall(void); } SYS_SIGQUEUEINFO = 245 // { int|sys||sigqueueinfo(pid_t pid, const siginfo_t *info); } SYS_MODCTL = 246 // { int|sys||modctl(int cmd, void *arg); } SYS___POSIX_RENAME = 270 // { int|sys||__posix_rename(const char *from, const char *to); } SYS_SWAPCTL = 271 // { int|sys||swapctl(int cmd, void *arg, int misc); } SYS_MINHERIT = 273 // { int|sys||minherit(void *addr, size_t len, int inherit); } SYS_LCHMOD = 274 // { int|sys||lchmod(const char *path, mode_t mode); } SYS_LCHOWN = 275 // { int|sys||lchown(const char *path, uid_t uid, gid_t gid); } SYS_MSYNC = 277 // { int|sys|13|msync(void *addr, size_t len, int flags); } SYS___POSIX_CHOWN = 283 // { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); } SYS___POSIX_FCHOWN = 284 // { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); } SYS___POSIX_LCHOWN = 285 // { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); } SYS_GETSID = 286 // { pid_t|sys||getsid(pid_t pid); } SYS___CLONE = 287 // { pid_t|sys||__clone(int flags, void *stack); } SYS_FKTRACE = 288 // { int|sys||fktrace(int fd, int ops, int facs, pid_t pid); } SYS_PREADV = 289 // { ssize_t|sys||preadv(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } SYS_PWRITEV = 290 // { ssize_t|sys||pwritev(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } SYS___GETCWD = 296 // { int|sys||__getcwd(char *bufp, size_t length); } SYS_FCHROOT = 297 // { int|sys||fchroot(int fd); } SYS_LCHFLAGS = 304 // { int|sys||lchflags(const char *path, u_long flags); } SYS_ISSETUGID = 305 // { int|sys||issetugid(void); } SYS_UTRACE = 306 // { int|sys||utrace(const char *label, void *addr, size_t len); } SYS_GETCONTEXT = 307 // { int|sys||getcontext(struct __ucontext *ucp); } SYS_SETCONTEXT = 308 // { int|sys||setcontext(const struct __ucontext *ucp); } SYS__LWP_CREATE = 309 // { int|sys||_lwp_create(const struct __ucontext *ucp, u_long flags, lwpid_t *new_lwp); } SYS__LWP_EXIT = 310 // { int|sys||_lwp_exit(void); } SYS__LWP_SELF = 311 // { lwpid_t|sys||_lwp_self(void); } SYS__LWP_WAIT = 312 // { int|sys||_lwp_wait(lwpid_t wait_for, lwpid_t *departed); } SYS__LWP_SUSPEND = 313 // { int|sys||_lwp_suspend(lwpid_t target); } SYS__LWP_CONTINUE = 314 // { int|sys||_lwp_continue(lwpid_t target); } SYS__LWP_WAKEUP = 315 // { int|sys||_lwp_wakeup(lwpid_t target); } SYS__LWP_GETPRIVATE = 316 // { void *|sys||_lwp_getprivate(void); } SYS__LWP_SETPRIVATE = 317 // { void|sys||_lwp_setprivate(void *ptr); } SYS__LWP_KILL = 318 // { int|sys||_lwp_kill(lwpid_t target, int signo); } SYS__LWP_DETACH = 319 // { int|sys||_lwp_detach(lwpid_t target); } SYS__LWP_UNPARK = 321 // { int|sys||_lwp_unpark(lwpid_t target, const void *hint); } SYS__LWP_UNPARK_ALL = 322 // { ssize_t|sys||_lwp_unpark_all(const lwpid_t *targets, size_t ntargets, const void *hint); } SYS__LWP_SETNAME = 323 // { int|sys||_lwp_setname(lwpid_t target, const char *name); } SYS__LWP_GETNAME = 324 // { int|sys||_lwp_getname(lwpid_t target, char *name, size_t len); } SYS__LWP_CTL = 325 // { int|sys||_lwp_ctl(int features, struct lwpctl **address); } SYS___SIGACTION_SIGTRAMP = 340 // { int|sys||__sigaction_sigtramp(int signum, const struct sigaction *nsa, struct sigaction *osa, const void *tramp, int vers); } SYS_PMC_GET_INFO = 341 // { int|sys||pmc_get_info(int ctr, int op, void *args); } SYS_PMC_CONTROL = 342 // { int|sys||pmc_control(int ctr, int op, void *args); } SYS_RASCTL = 343 // { int|sys||rasctl(void *addr, size_t len, int op); } SYS_KQUEUE = 344 // { int|sys||kqueue(void); } SYS__SCHED_SETPARAM = 346 // { int|sys||_sched_setparam(pid_t pid, lwpid_t lid, int policy, const struct sched_param *params); } SYS__SCHED_GETPARAM = 347 // { int|sys||_sched_getparam(pid_t pid, lwpid_t lid, int *policy, struct sched_param *params); } SYS__SCHED_SETAFFINITY = 348 // { int|sys||_sched_setaffinity(pid_t pid, lwpid_t lid, size_t size, const cpuset_t *cpuset); } SYS__SCHED_GETAFFINITY = 349 // { int|sys||_sched_getaffinity(pid_t pid, lwpid_t lid, size_t size, cpuset_t *cpuset); } SYS_SCHED_YIELD = 350 // { int|sys||sched_yield(void); } SYS_FSYNC_RANGE = 354 // { int|sys||fsync_range(int fd, int flags, off_t start, off_t length); } SYS_UUIDGEN = 355 // { int|sys||uuidgen(struct uuid *store, int count); } SYS_GETVFSSTAT = 356 // { int|sys||getvfsstat(struct statvfs *buf, size_t bufsize, int flags); } SYS_STATVFS1 = 357 // { int|sys||statvfs1(const char *path, struct statvfs *buf, int flags); } SYS_FSTATVFS1 = 358 // { int|sys||fstatvfs1(int fd, struct statvfs *buf, int flags); } SYS_EXTATTRCTL = 360 // { int|sys||extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } SYS_EXTATTR_SET_FILE = 361 // { int|sys||extattr_set_file(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } SYS_EXTATTR_GET_FILE = 362 // { ssize_t|sys||extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_FILE = 363 // { int|sys||extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } SYS_EXTATTR_SET_FD = 364 // { int|sys||extattr_set_fd(int fd, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } SYS_EXTATTR_GET_FD = 365 // { ssize_t|sys||extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_FD = 366 // { int|sys||extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } SYS_EXTATTR_SET_LINK = 367 // { int|sys||extattr_set_link(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } SYS_EXTATTR_GET_LINK = 368 // { ssize_t|sys||extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_LINK = 369 // { int|sys||extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } SYS_EXTATTR_LIST_FD = 370 // { ssize_t|sys||extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } SYS_EXTATTR_LIST_FILE = 371 // { ssize_t|sys||extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } SYS_EXTATTR_LIST_LINK = 372 // { ssize_t|sys||extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } SYS_SETXATTR = 375 // { int|sys||setxattr(const char *path, const char *name, const void *value, size_t size, int flags); } SYS_LSETXATTR = 376 // { int|sys||lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); } SYS_FSETXATTR = 377 // { int|sys||fsetxattr(int fd, const char *name, const void *value, size_t size, int flags); } SYS_GETXATTR = 378 // { int|sys||getxattr(const char *path, const char *name, void *value, size_t size); } SYS_LGETXATTR = 379 // { int|sys||lgetxattr(const char *path, const char *name, void *value, size_t size); } SYS_FGETXATTR = 380 // { int|sys||fgetxattr(int fd, const char *name, void *value, size_t size); } SYS_LISTXATTR = 381 // { int|sys||listxattr(const char *path, char *list, size_t size); } SYS_LLISTXATTR = 382 // { int|sys||llistxattr(const char *path, char *list, size_t size); } SYS_FLISTXATTR = 383 // { int|sys||flistxattr(int fd, char *list, size_t size); } SYS_REMOVEXATTR = 384 // { int|sys||removexattr(const char *path, const char *name); } SYS_LREMOVEXATTR = 385 // { int|sys||lremovexattr(const char *path, const char *name); } SYS_FREMOVEXATTR = 386 // { int|sys||fremovexattr(int fd, const char *name); } SYS_GETDENTS = 390 // { int|sys|30|getdents(int fd, char *buf, size_t count); } SYS_SOCKET = 394 // { int|sys|30|socket(int domain, int type, int protocol); } SYS_GETFH = 395 // { int|sys|30|getfh(const char *fname, void *fhp, size_t *fh_size); } SYS_MOUNT = 410 // { int|sys|50|mount(const char *type, const char *path, int flags, void *data, size_t data_len); } SYS_MREMAP = 411 // { void *|sys||mremap(void *old_address, size_t old_size, void *new_address, size_t new_size, int flags); } SYS_PSET_CREATE = 412 // { int|sys||pset_create(psetid_t *psid); } SYS_PSET_DESTROY = 413 // { int|sys||pset_destroy(psetid_t psid); } SYS_PSET_ASSIGN = 414 // { int|sys||pset_assign(psetid_t psid, cpuid_t cpuid, psetid_t *opsid); } SYS__PSET_BIND = 415 // { int|sys||_pset_bind(idtype_t idtype, id_t first_id, id_t second_id, psetid_t psid, psetid_t *opsid); } SYS_POSIX_FADVISE = 416 // { int|sys|50|posix_fadvise(int fd, int PAD, off_t offset, off_t len, int advice); } SYS_SELECT = 417 // { int|sys|50|select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); } SYS_GETTIMEOFDAY = 418 // { int|sys|50|gettimeofday(struct timeval *tp, void *tzp); } SYS_SETTIMEOFDAY = 419 // { int|sys|50|settimeofday(const struct timeval *tv, const void *tzp); } SYS_UTIMES = 420 // { int|sys|50|utimes(const char *path, const struct timeval *tptr); } SYS_ADJTIME = 421 // { int|sys|50|adjtime(const struct timeval *delta, struct timeval *olddelta); } SYS_FUTIMES = 423 // { int|sys|50|futimes(int fd, const struct timeval *tptr); } SYS_LUTIMES = 424 // { int|sys|50|lutimes(const char *path, const struct timeval *tptr); } SYS_SETITIMER = 425 // { int|sys|50|setitimer(int which, const struct itimerval *itv, struct itimerval *oitv); } SYS_GETITIMER = 426 // { int|sys|50|getitimer(int which, struct itimerval *itv); } SYS_CLOCK_GETTIME = 427 // { int|sys|50|clock_gettime(clockid_t clock_id, struct timespec *tp); } SYS_CLOCK_SETTIME = 428 // { int|sys|50|clock_settime(clockid_t clock_id, const struct timespec *tp); } SYS_CLOCK_GETRES = 429 // { int|sys|50|clock_getres(clockid_t clock_id, struct timespec *tp); } SYS_NANOSLEEP = 430 // { int|sys|50|nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } SYS___SIGTIMEDWAIT = 431 // { int|sys|50|__sigtimedwait(const sigset_t *set, siginfo_t *info, struct timespec *timeout); } SYS__LWP_PARK = 434 // { int|sys|50|_lwp_park(const struct timespec *ts, lwpid_t unpark, const void *hint, const void *unparkhint); } SYS_KEVENT = 435 // { int|sys|50|kevent(int fd, const struct kevent *changelist, size_t nchanges, struct kevent *eventlist, size_t nevents, const struct timespec *timeout); } SYS_PSELECT = 436 // { int|sys|50|pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *mask); } SYS_POLLTS = 437 // { int|sys|50|pollts(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *mask); } SYS_STAT = 439 // { int|sys|50|stat(const char *path, struct stat *ub); } SYS_FSTAT = 440 // { int|sys|50|fstat(int fd, struct stat *sb); } SYS_LSTAT = 441 // { int|sys|50|lstat(const char *path, struct stat *ub); } SYS___SEMCTL = 442 // { int|sys|50|__semctl(int semid, int semnum, int cmd, ... union __semun *arg); } SYS_SHMCTL = 443 // { int|sys|50|shmctl(int shmid, int cmd, struct shmid_ds *buf); } SYS_MSGCTL = 444 // { int|sys|50|msgctl(int msqid, int cmd, struct msqid_ds *buf); } SYS_GETRUSAGE = 445 // { int|sys|50|getrusage(int who, struct rusage *rusage); } SYS_TIMER_SETTIME = 446 // { int|sys|50|timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); } SYS_TIMER_GETTIME = 447 // { int|sys|50|timer_gettime(timer_t timerid, struct itimerspec *value); } SYS_NTP_GETTIME = 448 // { int|sys|50|ntp_gettime(struct ntptimeval *ntvp); } SYS_WAIT4 = 449 // { int|sys|50|wait4(pid_t pid, int *status, int options, struct rusage *rusage); } SYS_MKNOD = 450 // { int|sys|50|mknod(const char *path, mode_t mode, dev_t dev); } SYS_FHSTAT = 451 // { int|sys|50|fhstat(const void *fhp, size_t fh_size, struct stat *sb); } SYS_PIPE2 = 453 // { int|sys||pipe2(int *fildes, int flags); } SYS_DUP3 = 454 // { int|sys||dup3(int from, int to, int flags); } SYS_KQUEUE1 = 455 // { int|sys||kqueue1(int flags); } SYS_PACCEPT = 456 // { int|sys||paccept(int s, struct sockaddr *name, socklen_t *anamelen, const sigset_t *mask, int flags); } SYS_LINKAT = 457 // { int|sys||linkat(int fd1, const char *name1, int fd2, const char *name2, int flags); } SYS_RENAMEAT = 458 // { int|sys||renameat(int fromfd, const char *from, int tofd, const char *to); } SYS_MKFIFOAT = 459 // { int|sys||mkfifoat(int fd, const char *path, mode_t mode); } SYS_MKNODAT = 460 // { int|sys||mknodat(int fd, const char *path, mode_t mode, uint32_t dev); } SYS_MKDIRAT = 461 // { int|sys||mkdirat(int fd, const char *path, mode_t mode); } SYS_FACCESSAT = 462 // { int|sys||faccessat(int fd, const char *path, int amode, int flag); } SYS_FCHMODAT = 463 // { int|sys||fchmodat(int fd, const char *path, mode_t mode, int flag); } SYS_FCHOWNAT = 464 // { int|sys||fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag); } SYS_FEXECVE = 465 // { int|sys||fexecve(int fd, char * const *argp, char * const *envp); } SYS_FSTATAT = 466 // { int|sys||fstatat(int fd, const char *path, struct stat *buf, int flag); } SYS_UTIMENSAT = 467 // { int|sys||utimensat(int fd, const char *path, const struct timespec *tptr, int flag); } SYS_OPENAT = 468 // { int|sys||openat(int fd, const char *path, int oflags, ... mode_t mode); } SYS_READLINKAT = 469 // { int|sys||readlinkat(int fd, const char *path, char *buf, size_t bufsize); } SYS_SYMLINKAT = 470 // { int|sys||symlinkat(const char *path1, int fd, const char *path2); } SYS_UNLINKAT = 471 // { int|sys||unlinkat(int fd, const char *path, int flag); } SYS_FUTIMENS = 472 // { int|sys||futimens(int fd, const struct timespec *tptr); } SYS___QUOTACTL = 473 // { int|sys||__quotactl(const char *path, struct quotactl_args *args); } SYS_POSIX_SPAWN = 474 // { int|sys||posix_spawn(pid_t *pid, const char *path, const struct posix_spawn_file_actions *file_actions, const struct posix_spawnattr *attrp, char *const *argv, char *const *envp); } SYS_RECVMMSG = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); } SYS_SENDMMSG = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); } ) ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go ================================================ // mksysnum_openbsd.pl // MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT // +build 386,openbsd package unix const ( SYS_EXIT = 1 // { void sys_exit(int rval); } SYS_FORK = 2 // { int sys_fork(void); } SYS_READ = 3 // { ssize_t sys_read(int fd, void *buf, size_t nbyte); } SYS_WRITE = 4 // { ssize_t sys_write(int fd, const void *buf, \ SYS_OPEN = 5 // { int sys_open(const char *path, \ SYS_CLOSE = 6 // { int sys_close(int fd); } SYS___TFORK = 8 // { int sys___tfork(const struct __tfork *param, \ SYS_LINK = 9 // { int sys_link(const char *path, const char *link); } SYS_UNLINK = 10 // { int sys_unlink(const char *path); } SYS_WAIT4 = 11 // { pid_t sys_wait4(pid_t pid, int *status, \ SYS_CHDIR = 12 // { int sys_chdir(const char *path); } SYS_FCHDIR = 13 // { int sys_fchdir(int fd); } SYS_MKNOD = 14 // { int sys_mknod(const char *path, mode_t mode, \ SYS_CHMOD = 15 // { int sys_chmod(const char *path, mode_t mode); } SYS_CHOWN = 16 // { int sys_chown(const char *path, uid_t uid, \ SYS_OBREAK = 17 // { int sys_obreak(char *nsize); } break SYS_GETDTABLECOUNT = 18 // { int sys_getdtablecount(void); } SYS_GETRUSAGE = 19 // { int sys_getrusage(int who, \ SYS_GETPID = 20 // { pid_t sys_getpid(void); } SYS_MOUNT = 21 // { int sys_mount(const char *type, const char *path, \ SYS_UNMOUNT = 22 // { int sys_unmount(const char *path, int flags); } SYS_SETUID = 23 // { int sys_setuid(uid_t uid); } SYS_GETUID = 24 // { uid_t sys_getuid(void); } SYS_GETEUID = 25 // { uid_t sys_geteuid(void); } SYS_PTRACE = 26 // { int sys_ptrace(int req, pid_t pid, caddr_t addr, \ SYS_RECVMSG = 27 // { ssize_t sys_recvmsg(int s, struct msghdr *msg, \ SYS_SENDMSG = 28 // { ssize_t sys_sendmsg(int s, \ SYS_RECVFROM = 29 // { ssize_t sys_recvfrom(int s, void *buf, size_t len, \ SYS_ACCEPT = 30 // { int sys_accept(int s, struct sockaddr *name, \ SYS_GETPEERNAME = 31 // { int sys_getpeername(int fdes, struct sockaddr *asa, \ SYS_GETSOCKNAME = 32 // { int sys_getsockname(int fdes, struct sockaddr *asa, \ SYS_ACCESS = 33 // { int sys_access(const char *path, int flags); } SYS_CHFLAGS = 34 // { int sys_chflags(const char *path, u_int flags); } SYS_FCHFLAGS = 35 // { int sys_fchflags(int fd, u_int flags); } SYS_SYNC = 36 // { void sys_sync(void); } SYS_KILL = 37 // { int sys_kill(int pid, int signum); } SYS_STAT = 38 // { int sys_stat(const char *path, struct stat *ub); } SYS_GETPPID = 39 // { pid_t sys_getppid(void); } SYS_LSTAT = 40 // { int sys_lstat(const char *path, struct stat *ub); } SYS_DUP = 41 // { int sys_dup(int fd); } SYS_FSTATAT = 42 // { int sys_fstatat(int fd, const char *path, \ SYS_GETEGID = 43 // { gid_t sys_getegid(void); } SYS_PROFIL = 44 // { int sys_profil(caddr_t samples, size_t size, \ SYS_KTRACE = 45 // { int sys_ktrace(const char *fname, int ops, \ SYS_SIGACTION = 46 // { int sys_sigaction(int signum, \ SYS_GETGID = 47 // { gid_t sys_getgid(void); } SYS_SIGPROCMASK = 48 // { int sys_sigprocmask(int how, sigset_t mask); } SYS_GETLOGIN = 49 // { int sys_getlogin(char *namebuf, u_int namelen); } SYS_SETLOGIN = 50 // { int sys_setlogin(const char *namebuf); } SYS_ACCT = 51 // { int sys_acct(const char *path); } SYS_SIGPENDING = 52 // { int sys_sigpending(void); } SYS_FSTAT = 53 // { int sys_fstat(int fd, struct stat *sb); } SYS_IOCTL = 54 // { int sys_ioctl(int fd, \ SYS_REBOOT = 55 // { int sys_reboot(int opt); } SYS_REVOKE = 56 // { int sys_revoke(const char *path); } SYS_SYMLINK = 57 // { int sys_symlink(const char *path, \ SYS_READLINK = 58 // { int sys_readlink(const char *path, char *buf, \ SYS_EXECVE = 59 // { int sys_execve(const char *path, \ SYS_UMASK = 60 // { mode_t sys_umask(mode_t newmask); } SYS_CHROOT = 61 // { int sys_chroot(const char *path); } SYS_GETFSSTAT = 62 // { int sys_getfsstat(struct statfs *buf, size_t bufsize, \ SYS_STATFS = 63 // { int sys_statfs(const char *path, \ SYS_FSTATFS = 64 // { int sys_fstatfs(int fd, struct statfs *buf); } SYS_FHSTATFS = 65 // { int sys_fhstatfs(const fhandle_t *fhp, \ SYS_VFORK = 66 // { int sys_vfork(void); } SYS_GETTIMEOFDAY = 67 // { int sys_gettimeofday(struct timeval *tp, \ SYS_SETTIMEOFDAY = 68 // { int sys_settimeofday(const struct timeval *tv, \ SYS_SETITIMER = 69 // { int sys_setitimer(int which, \ SYS_GETITIMER = 70 // { int sys_getitimer(int which, \ SYS_SELECT = 71 // { int sys_select(int nd, fd_set *in, fd_set *ou, \ SYS_KEVENT = 72 // { int sys_kevent(int fd, \ SYS_MUNMAP = 73 // { int sys_munmap(void *addr, size_t len); } SYS_MPROTECT = 74 // { int sys_mprotect(void *addr, size_t len, \ SYS_MADVISE = 75 // { int sys_madvise(void *addr, size_t len, \ SYS_UTIMES = 76 // { int sys_utimes(const char *path, \ SYS_FUTIMES = 77 // { int sys_futimes(int fd, \ SYS_MINCORE = 78 // { int sys_mincore(void *addr, size_t len, \ SYS_GETGROUPS = 79 // { int sys_getgroups(int gidsetsize, \ SYS_SETGROUPS = 80 // { int sys_setgroups(int gidsetsize, \ SYS_GETPGRP = 81 // { int sys_getpgrp(void); } SYS_SETPGID = 82 // { int sys_setpgid(pid_t pid, int pgid); } SYS_UTIMENSAT = 84 // { int sys_utimensat(int fd, const char *path, \ SYS_FUTIMENS = 85 // { int sys_futimens(int fd, \ SYS_CLOCK_GETTIME = 87 // { int sys_clock_gettime(clockid_t clock_id, \ SYS_CLOCK_SETTIME = 88 // { int sys_clock_settime(clockid_t clock_id, \ SYS_CLOCK_GETRES = 89 // { int sys_clock_getres(clockid_t clock_id, \ SYS_DUP2 = 90 // { int sys_dup2(int from, int to); } SYS_NANOSLEEP = 91 // { int sys_nanosleep(const struct timespec *rqtp, \ SYS_FCNTL = 92 // { int sys_fcntl(int fd, int cmd, ... void *arg); } SYS___THRSLEEP = 94 // { int sys___thrsleep(const volatile void *ident, \ SYS_FSYNC = 95 // { int sys_fsync(int fd); } SYS_SETPRIORITY = 96 // { int sys_setpriority(int which, id_t who, int prio); } SYS_SOCKET = 97 // { int sys_socket(int domain, int type, int protocol); } SYS_CONNECT = 98 // { int sys_connect(int s, const struct sockaddr *name, \ SYS_GETDENTS = 99 // { int sys_getdents(int fd, void *buf, size_t buflen); } SYS_GETPRIORITY = 100 // { int sys_getpriority(int which, id_t who); } SYS_SIGRETURN = 103 // { int sys_sigreturn(struct sigcontext *sigcntxp); } SYS_BIND = 104 // { int sys_bind(int s, const struct sockaddr *name, \ SYS_SETSOCKOPT = 105 // { int sys_setsockopt(int s, int level, int name, \ SYS_LISTEN = 106 // { int sys_listen(int s, int backlog); } SYS_PPOLL = 109 // { int sys_ppoll(struct pollfd *fds, \ SYS_PSELECT = 110 // { int sys_pselect(int nd, fd_set *in, fd_set *ou, \ SYS_SIGSUSPEND = 111 // { int sys_sigsuspend(int mask); } SYS_GETSOCKOPT = 118 // { int sys_getsockopt(int s, int level, int name, \ SYS_READV = 120 // { ssize_t sys_readv(int fd, \ SYS_WRITEV = 121 // { ssize_t sys_writev(int fd, \ SYS_FCHOWN = 123 // { int sys_fchown(int fd, uid_t uid, gid_t gid); } SYS_FCHMOD = 124 // { int sys_fchmod(int fd, mode_t mode); } SYS_SETREUID = 126 // { int sys_setreuid(uid_t ruid, uid_t euid); } SYS_SETREGID = 127 // { int sys_setregid(gid_t rgid, gid_t egid); } SYS_RENAME = 128 // { int sys_rename(const char *from, const char *to); } SYS_FLOCK = 131 // { int sys_flock(int fd, int how); } SYS_MKFIFO = 132 // { int sys_mkfifo(const char *path, mode_t mode); } SYS_SENDTO = 133 // { ssize_t sys_sendto(int s, const void *buf, \ SYS_SHUTDOWN = 134 // { int sys_shutdown(int s, int how); } SYS_SOCKETPAIR = 135 // { int sys_socketpair(int domain, int type, \ SYS_MKDIR = 136 // { int sys_mkdir(const char *path, mode_t mode); } SYS_RMDIR = 137 // { int sys_rmdir(const char *path); } SYS_ADJTIME = 140 // { int sys_adjtime(const struct timeval *delta, \ SYS_SETSID = 147 // { int sys_setsid(void); } SYS_QUOTACTL = 148 // { int sys_quotactl(const char *path, int cmd, \ SYS_NFSSVC = 155 // { int sys_nfssvc(int flag, void *argp); } SYS_GETFH = 161 // { int sys_getfh(const char *fname, fhandle_t *fhp); } SYS_SYSARCH = 165 // { int sys_sysarch(int op, void *parms); } SYS_PREAD = 173 // { ssize_t sys_pread(int fd, void *buf, \ SYS_PWRITE = 174 // { ssize_t sys_pwrite(int fd, const void *buf, \ SYS_SETGID = 181 // { int sys_setgid(gid_t gid); } SYS_SETEGID = 182 // { int sys_setegid(gid_t egid); } SYS_SETEUID = 183 // { int sys_seteuid(uid_t euid); } SYS_PATHCONF = 191 // { long sys_pathconf(const char *path, int name); } SYS_FPATHCONF = 192 // { long sys_fpathconf(int fd, int name); } SYS_SWAPCTL = 193 // { int sys_swapctl(int cmd, const void *arg, int misc); } SYS_GETRLIMIT = 194 // { int sys_getrlimit(int which, \ SYS_SETRLIMIT = 195 // { int sys_setrlimit(int which, \ SYS_MMAP = 197 // { void *sys_mmap(void *addr, size_t len, int prot, \ SYS_LSEEK = 199 // { off_t sys_lseek(int fd, int pad, off_t offset, \ SYS_TRUNCATE = 200 // { int sys_truncate(const char *path, int pad, \ SYS_FTRUNCATE = 201 // { int sys_ftruncate(int fd, int pad, off_t length); } SYS___SYSCTL = 202 // { int sys___sysctl(const int *name, u_int namelen, \ SYS_MLOCK = 203 // { int sys_mlock(const void *addr, size_t len); } SYS_MUNLOCK = 204 // { int sys_munlock(const void *addr, size_t len); } SYS_GETPGID = 207 // { pid_t sys_getpgid(pid_t pid); } SYS_UTRACE = 209 // { int sys_utrace(const char *label, const void *addr, \ SYS_SEMGET = 221 // { int sys_semget(key_t key, int nsems, int semflg); } SYS_MSGGET = 225 // { int sys_msgget(key_t key, int msgflg); } SYS_MSGSND = 226 // { int sys_msgsnd(int msqid, const void *msgp, size_t msgsz, \ SYS_MSGRCV = 227 // { int sys_msgrcv(int msqid, void *msgp, size_t msgsz, \ SYS_SHMAT = 228 // { void *sys_shmat(int shmid, const void *shmaddr, \ SYS_SHMDT = 230 // { int sys_shmdt(const void *shmaddr); } SYS_MINHERIT = 250 // { int sys_minherit(void *addr, size_t len, \ SYS_POLL = 252 // { int sys_poll(struct pollfd *fds, \ SYS_ISSETUGID = 253 // { int sys_issetugid(void); } SYS_LCHOWN = 254 // { int sys_lchown(const char *path, uid_t uid, gid_t gid); } SYS_GETSID = 255 // { pid_t sys_getsid(pid_t pid); } SYS_MSYNC = 256 // { int sys_msync(void *addr, size_t len, int flags); } SYS_PIPE = 263 // { int sys_pipe(int *fdp); } SYS_FHOPEN = 264 // { int sys_fhopen(const fhandle_t *fhp, int flags); } SYS_PREADV = 267 // { ssize_t sys_preadv(int fd, \ SYS_PWRITEV = 268 // { ssize_t sys_pwritev(int fd, \ SYS_KQUEUE = 269 // { int sys_kqueue(void); } SYS_MLOCKALL = 271 // { int sys_mlockall(int flags); } SYS_MUNLOCKALL = 272 // { int sys_munlockall(void); } SYS_GETRESUID = 281 // { int sys_getresuid(uid_t *ruid, uid_t *euid, \ SYS_SETRESUID = 282 // { int sys_setresuid(uid_t ruid, uid_t euid, \ SYS_GETRESGID = 283 // { int sys_getresgid(gid_t *rgid, gid_t *egid, \ SYS_SETRESGID = 284 // { int sys_setresgid(gid_t rgid, gid_t egid, \ SYS_MQUERY = 286 // { void *sys_mquery(void *addr, size_t len, int prot, \ SYS_CLOSEFROM = 287 // { int sys_closefrom(int fd); } SYS_SIGALTSTACK = 288 // { int sys_sigaltstack(const struct sigaltstack *nss, \ SYS_SHMGET = 289 // { int sys_shmget(key_t key, size_t size, int shmflg); } SYS_SEMOP = 290 // { int sys_semop(int semid, struct sembuf *sops, \ SYS_FHSTAT = 294 // { int sys_fhstat(const fhandle_t *fhp, \ SYS___SEMCTL = 295 // { int sys___semctl(int semid, int semnum, int cmd, \ SYS_SHMCTL = 296 // { int sys_shmctl(int shmid, int cmd, \ SYS_MSGCTL = 297 // { int sys_msgctl(int msqid, int cmd, \ SYS_SCHED_YIELD = 298 // { int sys_sched_yield(void); } SYS_GETTHRID = 299 // { pid_t sys_getthrid(void); } SYS___THRWAKEUP = 301 // { int sys___thrwakeup(const volatile void *ident, \ SYS___THREXIT = 302 // { void sys___threxit(pid_t *notdead); } SYS___THRSIGDIVERT = 303 // { int sys___thrsigdivert(sigset_t sigmask, \ SYS___GETCWD = 304 // { int sys___getcwd(char *buf, size_t len); } SYS_ADJFREQ = 305 // { int sys_adjfreq(const int64_t *freq, \ SYS_SETRTABLE = 310 // { int sys_setrtable(int rtableid); } SYS_GETRTABLE = 311 // { int sys_getrtable(void); } SYS_FACCESSAT = 313 // { int sys_faccessat(int fd, const char *path, \ SYS_FCHMODAT = 314 // { int sys_fchmodat(int fd, const char *path, \ SYS_FCHOWNAT = 315 // { int sys_fchownat(int fd, const char *path, \ SYS_LINKAT = 317 // { int sys_linkat(int fd1, const char *path1, int fd2, \ SYS_MKDIRAT = 318 // { int sys_mkdirat(int fd, const char *path, \ SYS_MKFIFOAT = 319 // { int sys_mkfifoat(int fd, const char *path, \ SYS_MKNODAT = 320 // { int sys_mknodat(int fd, const char *path, \ SYS_OPENAT = 321 // { int sys_openat(int fd, const char *path, int flags, \ SYS_READLINKAT = 322 // { ssize_t sys_readlinkat(int fd, const char *path, \ SYS_RENAMEAT = 323 // { int sys_renameat(int fromfd, const char *from, \ SYS_SYMLINKAT = 324 // { int sys_symlinkat(const char *path, int fd, \ SYS_UNLINKAT = 325 // { int sys_unlinkat(int fd, const char *path, \ SYS___SET_TCB = 329 // { void sys___set_tcb(void *tcb); } SYS___GET_TCB = 330 // { void *sys___get_tcb(void); } ) ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go ================================================ // mksysnum_openbsd.pl // MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT // +build amd64,openbsd package unix const ( SYS_EXIT = 1 // { void sys_exit(int rval); } SYS_FORK = 2 // { int sys_fork(void); } SYS_READ = 3 // { ssize_t sys_read(int fd, void *buf, size_t nbyte); } SYS_WRITE = 4 // { ssize_t sys_write(int fd, const void *buf, \ SYS_OPEN = 5 // { int sys_open(const char *path, \ SYS_CLOSE = 6 // { int sys_close(int fd); } SYS___TFORK = 8 // { int sys___tfork(const struct __tfork *param, \ SYS_LINK = 9 // { int sys_link(const char *path, const char *link); } SYS_UNLINK = 10 // { int sys_unlink(const char *path); } SYS_WAIT4 = 11 // { pid_t sys_wait4(pid_t pid, int *status, \ SYS_CHDIR = 12 // { int sys_chdir(const char *path); } SYS_FCHDIR = 13 // { int sys_fchdir(int fd); } SYS_MKNOD = 14 // { int sys_mknod(const char *path, mode_t mode, \ SYS_CHMOD = 15 // { int sys_chmod(const char *path, mode_t mode); } SYS_CHOWN = 16 // { int sys_chown(const char *path, uid_t uid, \ SYS_OBREAK = 17 // { int sys_obreak(char *nsize); } break SYS_GETDTABLECOUNT = 18 // { int sys_getdtablecount(void); } SYS_GETRUSAGE = 19 // { int sys_getrusage(int who, \ SYS_GETPID = 20 // { pid_t sys_getpid(void); } SYS_MOUNT = 21 // { int sys_mount(const char *type, const char *path, \ SYS_UNMOUNT = 22 // { int sys_unmount(const char *path, int flags); } SYS_SETUID = 23 // { int sys_setuid(uid_t uid); } SYS_GETUID = 24 // { uid_t sys_getuid(void); } SYS_GETEUID = 25 // { uid_t sys_geteuid(void); } SYS_PTRACE = 26 // { int sys_ptrace(int req, pid_t pid, caddr_t addr, \ SYS_RECVMSG = 27 // { ssize_t sys_recvmsg(int s, struct msghdr *msg, \ SYS_SENDMSG = 28 // { ssize_t sys_sendmsg(int s, \ SYS_RECVFROM = 29 // { ssize_t sys_recvfrom(int s, void *buf, size_t len, \ SYS_ACCEPT = 30 // { int sys_accept(int s, struct sockaddr *name, \ SYS_GETPEERNAME = 31 // { int sys_getpeername(int fdes, struct sockaddr *asa, \ SYS_GETSOCKNAME = 32 // { int sys_getsockname(int fdes, struct sockaddr *asa, \ SYS_ACCESS = 33 // { int sys_access(const char *path, int flags); } SYS_CHFLAGS = 34 // { int sys_chflags(const char *path, u_int flags); } SYS_FCHFLAGS = 35 // { int sys_fchflags(int fd, u_int flags); } SYS_SYNC = 36 // { void sys_sync(void); } SYS_KILL = 37 // { int sys_kill(int pid, int signum); } SYS_STAT = 38 // { int sys_stat(const char *path, struct stat *ub); } SYS_GETPPID = 39 // { pid_t sys_getppid(void); } SYS_LSTAT = 40 // { int sys_lstat(const char *path, struct stat *ub); } SYS_DUP = 41 // { int sys_dup(int fd); } SYS_FSTATAT = 42 // { int sys_fstatat(int fd, const char *path, \ SYS_GETEGID = 43 // { gid_t sys_getegid(void); } SYS_PROFIL = 44 // { int sys_profil(caddr_t samples, size_t size, \ SYS_KTRACE = 45 // { int sys_ktrace(const char *fname, int ops, \ SYS_SIGACTION = 46 // { int sys_sigaction(int signum, \ SYS_GETGID = 47 // { gid_t sys_getgid(void); } SYS_SIGPROCMASK = 48 // { int sys_sigprocmask(int how, sigset_t mask); } SYS_GETLOGIN = 49 // { int sys_getlogin(char *namebuf, u_int namelen); } SYS_SETLOGIN = 50 // { int sys_setlogin(const char *namebuf); } SYS_ACCT = 51 // { int sys_acct(const char *path); } SYS_SIGPENDING = 52 // { int sys_sigpending(void); } SYS_FSTAT = 53 // { int sys_fstat(int fd, struct stat *sb); } SYS_IOCTL = 54 // { int sys_ioctl(int fd, \ SYS_REBOOT = 55 // { int sys_reboot(int opt); } SYS_REVOKE = 56 // { int sys_revoke(const char *path); } SYS_SYMLINK = 57 // { int sys_symlink(const char *path, \ SYS_READLINK = 58 // { int sys_readlink(const char *path, char *buf, \ SYS_EXECVE = 59 // { int sys_execve(const char *path, \ SYS_UMASK = 60 // { mode_t sys_umask(mode_t newmask); } SYS_CHROOT = 61 // { int sys_chroot(const char *path); } SYS_GETFSSTAT = 62 // { int sys_getfsstat(struct statfs *buf, size_t bufsize, \ SYS_STATFS = 63 // { int sys_statfs(const char *path, \ SYS_FSTATFS = 64 // { int sys_fstatfs(int fd, struct statfs *buf); } SYS_FHSTATFS = 65 // { int sys_fhstatfs(const fhandle_t *fhp, \ SYS_VFORK = 66 // { int sys_vfork(void); } SYS_GETTIMEOFDAY = 67 // { int sys_gettimeofday(struct timeval *tp, \ SYS_SETTIMEOFDAY = 68 // { int sys_settimeofday(const struct timeval *tv, \ SYS_SETITIMER = 69 // { int sys_setitimer(int which, \ SYS_GETITIMER = 70 // { int sys_getitimer(int which, \ SYS_SELECT = 71 // { int sys_select(int nd, fd_set *in, fd_set *ou, \ SYS_KEVENT = 72 // { int sys_kevent(int fd, \ SYS_MUNMAP = 73 // { int sys_munmap(void *addr, size_t len); } SYS_MPROTECT = 74 // { int sys_mprotect(void *addr, size_t len, \ SYS_MADVISE = 75 // { int sys_madvise(void *addr, size_t len, \ SYS_UTIMES = 76 // { int sys_utimes(const char *path, \ SYS_FUTIMES = 77 // { int sys_futimes(int fd, \ SYS_MINCORE = 78 // { int sys_mincore(void *addr, size_t len, \ SYS_GETGROUPS = 79 // { int sys_getgroups(int gidsetsize, \ SYS_SETGROUPS = 80 // { int sys_setgroups(int gidsetsize, \ SYS_GETPGRP = 81 // { int sys_getpgrp(void); } SYS_SETPGID = 82 // { int sys_setpgid(pid_t pid, int pgid); } SYS_UTIMENSAT = 84 // { int sys_utimensat(int fd, const char *path, \ SYS_FUTIMENS = 85 // { int sys_futimens(int fd, \ SYS_CLOCK_GETTIME = 87 // { int sys_clock_gettime(clockid_t clock_id, \ SYS_CLOCK_SETTIME = 88 // { int sys_clock_settime(clockid_t clock_id, \ SYS_CLOCK_GETRES = 89 // { int sys_clock_getres(clockid_t clock_id, \ SYS_DUP2 = 90 // { int sys_dup2(int from, int to); } SYS_NANOSLEEP = 91 // { int sys_nanosleep(const struct timespec *rqtp, \ SYS_FCNTL = 92 // { int sys_fcntl(int fd, int cmd, ... void *arg); } SYS___THRSLEEP = 94 // { int sys___thrsleep(const volatile void *ident, \ SYS_FSYNC = 95 // { int sys_fsync(int fd); } SYS_SETPRIORITY = 96 // { int sys_setpriority(int which, id_t who, int prio); } SYS_SOCKET = 97 // { int sys_socket(int domain, int type, int protocol); } SYS_CONNECT = 98 // { int sys_connect(int s, const struct sockaddr *name, \ SYS_GETDENTS = 99 // { int sys_getdents(int fd, void *buf, size_t buflen); } SYS_GETPRIORITY = 100 // { int sys_getpriority(int which, id_t who); } SYS_SIGRETURN = 103 // { int sys_sigreturn(struct sigcontext *sigcntxp); } SYS_BIND = 104 // { int sys_bind(int s, const struct sockaddr *name, \ SYS_SETSOCKOPT = 105 // { int sys_setsockopt(int s, int level, int name, \ SYS_LISTEN = 106 // { int sys_listen(int s, int backlog); } SYS_PPOLL = 109 // { int sys_ppoll(struct pollfd *fds, \ SYS_PSELECT = 110 // { int sys_pselect(int nd, fd_set *in, fd_set *ou, \ SYS_SIGSUSPEND = 111 // { int sys_sigsuspend(int mask); } SYS_GETSOCKOPT = 118 // { int sys_getsockopt(int s, int level, int name, \ SYS_READV = 120 // { ssize_t sys_readv(int fd, \ SYS_WRITEV = 121 // { ssize_t sys_writev(int fd, \ SYS_FCHOWN = 123 // { int sys_fchown(int fd, uid_t uid, gid_t gid); } SYS_FCHMOD = 124 // { int sys_fchmod(int fd, mode_t mode); } SYS_SETREUID = 126 // { int sys_setreuid(uid_t ruid, uid_t euid); } SYS_SETREGID = 127 // { int sys_setregid(gid_t rgid, gid_t egid); } SYS_RENAME = 128 // { int sys_rename(const char *from, const char *to); } SYS_FLOCK = 131 // { int sys_flock(int fd, int how); } SYS_MKFIFO = 132 // { int sys_mkfifo(const char *path, mode_t mode); } SYS_SENDTO = 133 // { ssize_t sys_sendto(int s, const void *buf, \ SYS_SHUTDOWN = 134 // { int sys_shutdown(int s, int how); } SYS_SOCKETPAIR = 135 // { int sys_socketpair(int domain, int type, \ SYS_MKDIR = 136 // { int sys_mkdir(const char *path, mode_t mode); } SYS_RMDIR = 137 // { int sys_rmdir(const char *path); } SYS_ADJTIME = 140 // { int sys_adjtime(const struct timeval *delta, \ SYS_SETSID = 147 // { int sys_setsid(void); } SYS_QUOTACTL = 148 // { int sys_quotactl(const char *path, int cmd, \ SYS_NFSSVC = 155 // { int sys_nfssvc(int flag, void *argp); } SYS_GETFH = 161 // { int sys_getfh(const char *fname, fhandle_t *fhp); } SYS_SYSARCH = 165 // { int sys_sysarch(int op, void *parms); } SYS_PREAD = 173 // { ssize_t sys_pread(int fd, void *buf, \ SYS_PWRITE = 174 // { ssize_t sys_pwrite(int fd, const void *buf, \ SYS_SETGID = 181 // { int sys_setgid(gid_t gid); } SYS_SETEGID = 182 // { int sys_setegid(gid_t egid); } SYS_SETEUID = 183 // { int sys_seteuid(uid_t euid); } SYS_PATHCONF = 191 // { long sys_pathconf(const char *path, int name); } SYS_FPATHCONF = 192 // { long sys_fpathconf(int fd, int name); } SYS_SWAPCTL = 193 // { int sys_swapctl(int cmd, const void *arg, int misc); } SYS_GETRLIMIT = 194 // { int sys_getrlimit(int which, \ SYS_SETRLIMIT = 195 // { int sys_setrlimit(int which, \ SYS_MMAP = 197 // { void *sys_mmap(void *addr, size_t len, int prot, \ SYS_LSEEK = 199 // { off_t sys_lseek(int fd, int pad, off_t offset, \ SYS_TRUNCATE = 200 // { int sys_truncate(const char *path, int pad, \ SYS_FTRUNCATE = 201 // { int sys_ftruncate(int fd, int pad, off_t length); } SYS___SYSCTL = 202 // { int sys___sysctl(const int *name, u_int namelen, \ SYS_MLOCK = 203 // { int sys_mlock(const void *addr, size_t len); } SYS_MUNLOCK = 204 // { int sys_munlock(const void *addr, size_t len); } SYS_GETPGID = 207 // { pid_t sys_getpgid(pid_t pid); } SYS_UTRACE = 209 // { int sys_utrace(const char *label, const void *addr, \ SYS_SEMGET = 221 // { int sys_semget(key_t key, int nsems, int semflg); } SYS_MSGGET = 225 // { int sys_msgget(key_t key, int msgflg); } SYS_MSGSND = 226 // { int sys_msgsnd(int msqid, const void *msgp, size_t msgsz, \ SYS_MSGRCV = 227 // { int sys_msgrcv(int msqid, void *msgp, size_t msgsz, \ SYS_SHMAT = 228 // { void *sys_shmat(int shmid, const void *shmaddr, \ SYS_SHMDT = 230 // { int sys_shmdt(const void *shmaddr); } SYS_MINHERIT = 250 // { int sys_minherit(void *addr, size_t len, \ SYS_POLL = 252 // { int sys_poll(struct pollfd *fds, \ SYS_ISSETUGID = 253 // { int sys_issetugid(void); } SYS_LCHOWN = 254 // { int sys_lchown(const char *path, uid_t uid, gid_t gid); } SYS_GETSID = 255 // { pid_t sys_getsid(pid_t pid); } SYS_MSYNC = 256 // { int sys_msync(void *addr, size_t len, int flags); } SYS_PIPE = 263 // { int sys_pipe(int *fdp); } SYS_FHOPEN = 264 // { int sys_fhopen(const fhandle_t *fhp, int flags); } SYS_PREADV = 267 // { ssize_t sys_preadv(int fd, \ SYS_PWRITEV = 268 // { ssize_t sys_pwritev(int fd, \ SYS_KQUEUE = 269 // { int sys_kqueue(void); } SYS_MLOCKALL = 271 // { int sys_mlockall(int flags); } SYS_MUNLOCKALL = 272 // { int sys_munlockall(void); } SYS_GETRESUID = 281 // { int sys_getresuid(uid_t *ruid, uid_t *euid, \ SYS_SETRESUID = 282 // { int sys_setresuid(uid_t ruid, uid_t euid, \ SYS_GETRESGID = 283 // { int sys_getresgid(gid_t *rgid, gid_t *egid, \ SYS_SETRESGID = 284 // { int sys_setresgid(gid_t rgid, gid_t egid, \ SYS_MQUERY = 286 // { void *sys_mquery(void *addr, size_t len, int prot, \ SYS_CLOSEFROM = 287 // { int sys_closefrom(int fd); } SYS_SIGALTSTACK = 288 // { int sys_sigaltstack(const struct sigaltstack *nss, \ SYS_SHMGET = 289 // { int sys_shmget(key_t key, size_t size, int shmflg); } SYS_SEMOP = 290 // { int sys_semop(int semid, struct sembuf *sops, \ SYS_FHSTAT = 294 // { int sys_fhstat(const fhandle_t *fhp, \ SYS___SEMCTL = 295 // { int sys___semctl(int semid, int semnum, int cmd, \ SYS_SHMCTL = 296 // { int sys_shmctl(int shmid, int cmd, \ SYS_MSGCTL = 297 // { int sys_msgctl(int msqid, int cmd, \ SYS_SCHED_YIELD = 298 // { int sys_sched_yield(void); } SYS_GETTHRID = 299 // { pid_t sys_getthrid(void); } SYS___THRWAKEUP = 301 // { int sys___thrwakeup(const volatile void *ident, \ SYS___THREXIT = 302 // { void sys___threxit(pid_t *notdead); } SYS___THRSIGDIVERT = 303 // { int sys___thrsigdivert(sigset_t sigmask, \ SYS___GETCWD = 304 // { int sys___getcwd(char *buf, size_t len); } SYS_ADJFREQ = 305 // { int sys_adjfreq(const int64_t *freq, \ SYS_SETRTABLE = 310 // { int sys_setrtable(int rtableid); } SYS_GETRTABLE = 311 // { int sys_getrtable(void); } SYS_FACCESSAT = 313 // { int sys_faccessat(int fd, const char *path, \ SYS_FCHMODAT = 314 // { int sys_fchmodat(int fd, const char *path, \ SYS_FCHOWNAT = 315 // { int sys_fchownat(int fd, const char *path, \ SYS_LINKAT = 317 // { int sys_linkat(int fd1, const char *path1, int fd2, \ SYS_MKDIRAT = 318 // { int sys_mkdirat(int fd, const char *path, \ SYS_MKFIFOAT = 319 // { int sys_mkfifoat(int fd, const char *path, \ SYS_MKNODAT = 320 // { int sys_mknodat(int fd, const char *path, \ SYS_OPENAT = 321 // { int sys_openat(int fd, const char *path, int flags, \ SYS_READLINKAT = 322 // { ssize_t sys_readlinkat(int fd, const char *path, \ SYS_RENAMEAT = 323 // { int sys_renameat(int fromfd, const char *from, \ SYS_SYMLINKAT = 324 // { int sys_symlinkat(const char *path, int fd, \ SYS_UNLINKAT = 325 // { int sys_unlinkat(int fd, const char *path, \ SYS___SET_TCB = 329 // { void sys___set_tcb(void *tcb); } SYS___GET_TCB = 330 // { void *sys___get_tcb(void); } ) ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go ================================================ // mksysnum_openbsd.pl // MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT // +build arm,openbsd package unix const ( SYS_EXIT = 1 // { void sys_exit(int rval); } SYS_FORK = 2 // { int sys_fork(void); } SYS_READ = 3 // { ssize_t sys_read(int fd, void *buf, size_t nbyte); } SYS_WRITE = 4 // { ssize_t sys_write(int fd, const void *buf, \ SYS_OPEN = 5 // { int sys_open(const char *path, \ SYS_CLOSE = 6 // { int sys_close(int fd); } SYS_GETENTROPY = 7 // { int sys_getentropy(void *buf, size_t nbyte); } SYS___TFORK = 8 // { int sys___tfork(const struct __tfork *param, \ SYS_LINK = 9 // { int sys_link(const char *path, const char *link); } SYS_UNLINK = 10 // { int sys_unlink(const char *path); } SYS_WAIT4 = 11 // { pid_t sys_wait4(pid_t pid, int *status, \ SYS_CHDIR = 12 // { int sys_chdir(const char *path); } SYS_FCHDIR = 13 // { int sys_fchdir(int fd); } SYS_MKNOD = 14 // { int sys_mknod(const char *path, mode_t mode, \ SYS_CHMOD = 15 // { int sys_chmod(const char *path, mode_t mode); } SYS_CHOWN = 16 // { int sys_chown(const char *path, uid_t uid, \ SYS_OBREAK = 17 // { int sys_obreak(char *nsize); } break SYS_GETDTABLECOUNT = 18 // { int sys_getdtablecount(void); } SYS_GETRUSAGE = 19 // { int sys_getrusage(int who, \ SYS_GETPID = 20 // { pid_t sys_getpid(void); } SYS_MOUNT = 21 // { int sys_mount(const char *type, const char *path, \ SYS_UNMOUNT = 22 // { int sys_unmount(const char *path, int flags); } SYS_SETUID = 23 // { int sys_setuid(uid_t uid); } SYS_GETUID = 24 // { uid_t sys_getuid(void); } SYS_GETEUID = 25 // { uid_t sys_geteuid(void); } SYS_PTRACE = 26 // { int sys_ptrace(int req, pid_t pid, caddr_t addr, \ SYS_RECVMSG = 27 // { ssize_t sys_recvmsg(int s, struct msghdr *msg, \ SYS_SENDMSG = 28 // { ssize_t sys_sendmsg(int s, \ SYS_RECVFROM = 29 // { ssize_t sys_recvfrom(int s, void *buf, size_t len, \ SYS_ACCEPT = 30 // { int sys_accept(int s, struct sockaddr *name, \ SYS_GETPEERNAME = 31 // { int sys_getpeername(int fdes, struct sockaddr *asa, \ SYS_GETSOCKNAME = 32 // { int sys_getsockname(int fdes, struct sockaddr *asa, \ SYS_ACCESS = 33 // { int sys_access(const char *path, int amode); } SYS_CHFLAGS = 34 // { int sys_chflags(const char *path, u_int flags); } SYS_FCHFLAGS = 35 // { int sys_fchflags(int fd, u_int flags); } SYS_SYNC = 36 // { void sys_sync(void); } SYS_STAT = 38 // { int sys_stat(const char *path, struct stat *ub); } SYS_GETPPID = 39 // { pid_t sys_getppid(void); } SYS_LSTAT = 40 // { int sys_lstat(const char *path, struct stat *ub); } SYS_DUP = 41 // { int sys_dup(int fd); } SYS_FSTATAT = 42 // { int sys_fstatat(int fd, const char *path, \ SYS_GETEGID = 43 // { gid_t sys_getegid(void); } SYS_PROFIL = 44 // { int sys_profil(caddr_t samples, size_t size, \ SYS_KTRACE = 45 // { int sys_ktrace(const char *fname, int ops, \ SYS_SIGACTION = 46 // { int sys_sigaction(int signum, \ SYS_GETGID = 47 // { gid_t sys_getgid(void); } SYS_SIGPROCMASK = 48 // { int sys_sigprocmask(int how, sigset_t mask); } SYS_GETLOGIN = 49 // { int sys_getlogin(char *namebuf, u_int namelen); } SYS_SETLOGIN = 50 // { int sys_setlogin(const char *namebuf); } SYS_ACCT = 51 // { int sys_acct(const char *path); } SYS_SIGPENDING = 52 // { int sys_sigpending(void); } SYS_FSTAT = 53 // { int sys_fstat(int fd, struct stat *sb); } SYS_IOCTL = 54 // { int sys_ioctl(int fd, \ SYS_REBOOT = 55 // { int sys_reboot(int opt); } SYS_REVOKE = 56 // { int sys_revoke(const char *path); } SYS_SYMLINK = 57 // { int sys_symlink(const char *path, \ SYS_READLINK = 58 // { ssize_t sys_readlink(const char *path, \ SYS_EXECVE = 59 // { int sys_execve(const char *path, \ SYS_UMASK = 60 // { mode_t sys_umask(mode_t newmask); } SYS_CHROOT = 61 // { int sys_chroot(const char *path); } SYS_GETFSSTAT = 62 // { int sys_getfsstat(struct statfs *buf, size_t bufsize, \ SYS_STATFS = 63 // { int sys_statfs(const char *path, \ SYS_FSTATFS = 64 // { int sys_fstatfs(int fd, struct statfs *buf); } SYS_FHSTATFS = 65 // { int sys_fhstatfs(const fhandle_t *fhp, \ SYS_VFORK = 66 // { int sys_vfork(void); } SYS_GETTIMEOFDAY = 67 // { int sys_gettimeofday(struct timeval *tp, \ SYS_SETTIMEOFDAY = 68 // { int sys_settimeofday(const struct timeval *tv, \ SYS_SETITIMER = 69 // { int sys_setitimer(int which, \ SYS_GETITIMER = 70 // { int sys_getitimer(int which, \ SYS_SELECT = 71 // { int sys_select(int nd, fd_set *in, fd_set *ou, \ SYS_KEVENT = 72 // { int sys_kevent(int fd, \ SYS_MUNMAP = 73 // { int sys_munmap(void *addr, size_t len); } SYS_MPROTECT = 74 // { int sys_mprotect(void *addr, size_t len, \ SYS_MADVISE = 75 // { int sys_madvise(void *addr, size_t len, \ SYS_UTIMES = 76 // { int sys_utimes(const char *path, \ SYS_FUTIMES = 77 // { int sys_futimes(int fd, \ SYS_MINCORE = 78 // { int sys_mincore(void *addr, size_t len, \ SYS_GETGROUPS = 79 // { int sys_getgroups(int gidsetsize, \ SYS_SETGROUPS = 80 // { int sys_setgroups(int gidsetsize, \ SYS_GETPGRP = 81 // { int sys_getpgrp(void); } SYS_SETPGID = 82 // { int sys_setpgid(pid_t pid, pid_t pgid); } SYS_SENDSYSLOG = 83 // { int sys_sendsyslog(const void *buf, size_t nbyte); } SYS_UTIMENSAT = 84 // { int sys_utimensat(int fd, const char *path, \ SYS_FUTIMENS = 85 // { int sys_futimens(int fd, \ SYS_CLOCK_GETTIME = 87 // { int sys_clock_gettime(clockid_t clock_id, \ SYS_CLOCK_SETTIME = 88 // { int sys_clock_settime(clockid_t clock_id, \ SYS_CLOCK_GETRES = 89 // { int sys_clock_getres(clockid_t clock_id, \ SYS_DUP2 = 90 // { int sys_dup2(int from, int to); } SYS_NANOSLEEP = 91 // { int sys_nanosleep(const struct timespec *rqtp, \ SYS_FCNTL = 92 // { int sys_fcntl(int fd, int cmd, ... void *arg); } SYS_ACCEPT4 = 93 // { int sys_accept4(int s, struct sockaddr *name, \ SYS___THRSLEEP = 94 // { int sys___thrsleep(const volatile void *ident, \ SYS_FSYNC = 95 // { int sys_fsync(int fd); } SYS_SETPRIORITY = 96 // { int sys_setpriority(int which, id_t who, int prio); } SYS_SOCKET = 97 // { int sys_socket(int domain, int type, int protocol); } SYS_CONNECT = 98 // { int sys_connect(int s, const struct sockaddr *name, \ SYS_GETDENTS = 99 // { int sys_getdents(int fd, void *buf, size_t buflen); } SYS_GETPRIORITY = 100 // { int sys_getpriority(int which, id_t who); } SYS_PIPE2 = 101 // { int sys_pipe2(int *fdp, int flags); } SYS_DUP3 = 102 // { int sys_dup3(int from, int to, int flags); } SYS_SIGRETURN = 103 // { int sys_sigreturn(struct sigcontext *sigcntxp); } SYS_BIND = 104 // { int sys_bind(int s, const struct sockaddr *name, \ SYS_SETSOCKOPT = 105 // { int sys_setsockopt(int s, int level, int name, \ SYS_LISTEN = 106 // { int sys_listen(int s, int backlog); } SYS_CHFLAGSAT = 107 // { int sys_chflagsat(int fd, const char *path, \ SYS_PPOLL = 109 // { int sys_ppoll(struct pollfd *fds, \ SYS_PSELECT = 110 // { int sys_pselect(int nd, fd_set *in, fd_set *ou, \ SYS_SIGSUSPEND = 111 // { int sys_sigsuspend(int mask); } SYS_GETSOCKOPT = 118 // { int sys_getsockopt(int s, int level, int name, \ SYS_READV = 120 // { ssize_t sys_readv(int fd, \ SYS_WRITEV = 121 // { ssize_t sys_writev(int fd, \ SYS_KILL = 122 // { int sys_kill(int pid, int signum); } SYS_FCHOWN = 123 // { int sys_fchown(int fd, uid_t uid, gid_t gid); } SYS_FCHMOD = 124 // { int sys_fchmod(int fd, mode_t mode); } SYS_SETREUID = 126 // { int sys_setreuid(uid_t ruid, uid_t euid); } SYS_SETREGID = 127 // { int sys_setregid(gid_t rgid, gid_t egid); } SYS_RENAME = 128 // { int sys_rename(const char *from, const char *to); } SYS_FLOCK = 131 // { int sys_flock(int fd, int how); } SYS_MKFIFO = 132 // { int sys_mkfifo(const char *path, mode_t mode); } SYS_SENDTO = 133 // { ssize_t sys_sendto(int s, const void *buf, \ SYS_SHUTDOWN = 134 // { int sys_shutdown(int s, int how); } SYS_SOCKETPAIR = 135 // { int sys_socketpair(int domain, int type, \ SYS_MKDIR = 136 // { int sys_mkdir(const char *path, mode_t mode); } SYS_RMDIR = 137 // { int sys_rmdir(const char *path); } SYS_ADJTIME = 140 // { int sys_adjtime(const struct timeval *delta, \ SYS_SETSID = 147 // { int sys_setsid(void); } SYS_QUOTACTL = 148 // { int sys_quotactl(const char *path, int cmd, \ SYS_NFSSVC = 155 // { int sys_nfssvc(int flag, void *argp); } SYS_GETFH = 161 // { int sys_getfh(const char *fname, fhandle_t *fhp); } SYS_SYSARCH = 165 // { int sys_sysarch(int op, void *parms); } SYS_PREAD = 173 // { ssize_t sys_pread(int fd, void *buf, \ SYS_PWRITE = 174 // { ssize_t sys_pwrite(int fd, const void *buf, \ SYS_SETGID = 181 // { int sys_setgid(gid_t gid); } SYS_SETEGID = 182 // { int sys_setegid(gid_t egid); } SYS_SETEUID = 183 // { int sys_seteuid(uid_t euid); } SYS_PATHCONF = 191 // { long sys_pathconf(const char *path, int name); } SYS_FPATHCONF = 192 // { long sys_fpathconf(int fd, int name); } SYS_SWAPCTL = 193 // { int sys_swapctl(int cmd, const void *arg, int misc); } SYS_GETRLIMIT = 194 // { int sys_getrlimit(int which, \ SYS_SETRLIMIT = 195 // { int sys_setrlimit(int which, \ SYS_MMAP = 197 // { void *sys_mmap(void *addr, size_t len, int prot, \ SYS_LSEEK = 199 // { off_t sys_lseek(int fd, int pad, off_t offset, \ SYS_TRUNCATE = 200 // { int sys_truncate(const char *path, int pad, \ SYS_FTRUNCATE = 201 // { int sys_ftruncate(int fd, int pad, off_t length); } SYS___SYSCTL = 202 // { int sys___sysctl(const int *name, u_int namelen, \ SYS_MLOCK = 203 // { int sys_mlock(const void *addr, size_t len); } SYS_MUNLOCK = 204 // { int sys_munlock(const void *addr, size_t len); } SYS_GETPGID = 207 // { pid_t sys_getpgid(pid_t pid); } SYS_UTRACE = 209 // { int sys_utrace(const char *label, const void *addr, \ SYS_SEMGET = 221 // { int sys_semget(key_t key, int nsems, int semflg); } SYS_MSGGET = 225 // { int sys_msgget(key_t key, int msgflg); } SYS_MSGSND = 226 // { int sys_msgsnd(int msqid, const void *msgp, size_t msgsz, \ SYS_MSGRCV = 227 // { int sys_msgrcv(int msqid, void *msgp, size_t msgsz, \ SYS_SHMAT = 228 // { void *sys_shmat(int shmid, const void *shmaddr, \ SYS_SHMDT = 230 // { int sys_shmdt(const void *shmaddr); } SYS_MINHERIT = 250 // { int sys_minherit(void *addr, size_t len, \ SYS_POLL = 252 // { int sys_poll(struct pollfd *fds, \ SYS_ISSETUGID = 253 // { int sys_issetugid(void); } SYS_LCHOWN = 254 // { int sys_lchown(const char *path, uid_t uid, gid_t gid); } SYS_GETSID = 255 // { pid_t sys_getsid(pid_t pid); } SYS_MSYNC = 256 // { int sys_msync(void *addr, size_t len, int flags); } SYS_PIPE = 263 // { int sys_pipe(int *fdp); } SYS_FHOPEN = 264 // { int sys_fhopen(const fhandle_t *fhp, int flags); } SYS_PREADV = 267 // { ssize_t sys_preadv(int fd, \ SYS_PWRITEV = 268 // { ssize_t sys_pwritev(int fd, \ SYS_KQUEUE = 269 // { int sys_kqueue(void); } SYS_MLOCKALL = 271 // { int sys_mlockall(int flags); } SYS_MUNLOCKALL = 272 // { int sys_munlockall(void); } SYS_GETRESUID = 281 // { int sys_getresuid(uid_t *ruid, uid_t *euid, \ SYS_SETRESUID = 282 // { int sys_setresuid(uid_t ruid, uid_t euid, \ SYS_GETRESGID = 283 // { int sys_getresgid(gid_t *rgid, gid_t *egid, \ SYS_SETRESGID = 284 // { int sys_setresgid(gid_t rgid, gid_t egid, \ SYS_MQUERY = 286 // { void *sys_mquery(void *addr, size_t len, int prot, \ SYS_CLOSEFROM = 287 // { int sys_closefrom(int fd); } SYS_SIGALTSTACK = 288 // { int sys_sigaltstack(const struct sigaltstack *nss, \ SYS_SHMGET = 289 // { int sys_shmget(key_t key, size_t size, int shmflg); } SYS_SEMOP = 290 // { int sys_semop(int semid, struct sembuf *sops, \ SYS_FHSTAT = 294 // { int sys_fhstat(const fhandle_t *fhp, \ SYS___SEMCTL = 295 // { int sys___semctl(int semid, int semnum, int cmd, \ SYS_SHMCTL = 296 // { int sys_shmctl(int shmid, int cmd, \ SYS_MSGCTL = 297 // { int sys_msgctl(int msqid, int cmd, \ SYS_SCHED_YIELD = 298 // { int sys_sched_yield(void); } SYS_GETTHRID = 299 // { pid_t sys_getthrid(void); } SYS___THRWAKEUP = 301 // { int sys___thrwakeup(const volatile void *ident, \ SYS___THREXIT = 302 // { void sys___threxit(pid_t *notdead); } SYS___THRSIGDIVERT = 303 // { int sys___thrsigdivert(sigset_t sigmask, \ SYS___GETCWD = 304 // { int sys___getcwd(char *buf, size_t len); } SYS_ADJFREQ = 305 // { int sys_adjfreq(const int64_t *freq, \ SYS_SETRTABLE = 310 // { int sys_setrtable(int rtableid); } SYS_GETRTABLE = 311 // { int sys_getrtable(void); } SYS_FACCESSAT = 313 // { int sys_faccessat(int fd, const char *path, \ SYS_FCHMODAT = 314 // { int sys_fchmodat(int fd, const char *path, \ SYS_FCHOWNAT = 315 // { int sys_fchownat(int fd, const char *path, \ SYS_LINKAT = 317 // { int sys_linkat(int fd1, const char *path1, int fd2, \ SYS_MKDIRAT = 318 // { int sys_mkdirat(int fd, const char *path, \ SYS_MKFIFOAT = 319 // { int sys_mkfifoat(int fd, const char *path, \ SYS_MKNODAT = 320 // { int sys_mknodat(int fd, const char *path, \ SYS_OPENAT = 321 // { int sys_openat(int fd, const char *path, int flags, \ SYS_READLINKAT = 322 // { ssize_t sys_readlinkat(int fd, const char *path, \ SYS_RENAMEAT = 323 // { int sys_renameat(int fromfd, const char *from, \ SYS_SYMLINKAT = 324 // { int sys_symlinkat(const char *path, int fd, \ SYS_UNLINKAT = 325 // { int sys_unlinkat(int fd, const char *path, \ SYS___SET_TCB = 329 // { void sys___set_tcb(void *tcb); } SYS___GET_TCB = 330 // { void *sys___get_tcb(void); } ) ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_solaris_amd64.go ================================================ // Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build amd64,solaris package unix // TODO(aram): remove these before Go 1.3. const ( SYS_EXECVE = 59 SYS_FCNTL = 62 ) ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_darwin_386.go ================================================ // cgo -godefs types_darwin.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build 386,darwin package unix const ( sizeofPtr = 0x4 sizeofShort = 0x2 sizeofInt = 0x4 sizeofLong = 0x4 sizeofLongLong = 0x8 ) type ( _C_short int16 _C_int int32 _C_long int32 _C_long_long int64 ) type Timespec struct { Sec int32 Nsec int32 } type Timeval struct { Sec int32 Usec int32 } type Timeval32 struct{} type Rusage struct { Utime Timeval Stime Timeval Maxrss int32 Ixrss int32 Idrss int32 Isrss int32 Minflt int32 Majflt int32 Nswap int32 Inblock int32 Oublock int32 Msgsnd int32 Msgrcv int32 Nsignals int32 Nvcsw int32 Nivcsw int32 } type Rlimit struct { Cur uint64 Max uint64 } type _Gid_t uint32 type Stat_t struct { Dev int32 Mode uint16 Nlink uint16 Ino uint64 Uid uint32 Gid uint32 Rdev int32 Atimespec Timespec Mtimespec Timespec Ctimespec Timespec Birthtimespec Timespec Size int64 Blocks int64 Blksize int32 Flags uint32 Gen uint32 Lspare int32 Qspare [2]int64 } type Statfs_t struct { Bsize uint32 Iosize int32 Blocks uint64 Bfree uint64 Bavail uint64 Files uint64 Ffree uint64 Fsid Fsid Owner uint32 Type uint32 Flags uint32 Fssubtype uint32 Fstypename [16]int8 Mntonname [1024]int8 Mntfromname [1024]int8 Reserved [8]uint32 } type Flock_t struct { Start int64 Len int64 Pid int32 Type int16 Whence int16 } type Fstore_t struct { Flags uint32 Posmode int32 Offset int64 Length int64 Bytesalloc int64 } type Radvisory_t struct { Offset int64 Count int32 } type Fbootstraptransfer_t struct { Offset int64 Length uint32 Buffer *byte } type Log2phys_t struct { Flags uint32 Contigbytes int64 Devoffset int64 } type Fsid struct { Val [2]int32 } type Dirent struct { Ino uint64 Seekoff uint64 Reclen uint16 Namlen uint16 Type uint8 Name [1024]int8 Pad_cgo_0 [3]byte } type RawSockaddrInet4 struct { Len uint8 Family uint8 Port uint16 Addr [4]byte /* in_addr */ Zero [8]int8 } type RawSockaddrInet6 struct { Len uint8 Family uint8 Port uint16 Flowinfo uint32 Addr [16]byte /* in6_addr */ Scope_id uint32 } type RawSockaddrUnix struct { Len uint8 Family uint8 Path [104]int8 } type RawSockaddrDatalink struct { Len uint8 Family uint8 Index uint16 Type uint8 Nlen uint8 Alen uint8 Slen uint8 Data [12]int8 } type RawSockaddr struct { Len uint8 Family uint8 Data [14]int8 } type RawSockaddrAny struct { Addr RawSockaddr Pad [92]int8 } type _Socklen uint32 type Linger struct { Onoff int32 Linger int32 } type Iovec struct { Base *byte Len uint32 } type IPMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } type IPv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } type Msghdr struct { Name *byte Namelen uint32 Iov *Iovec Iovlen int32 Control *byte Controllen uint32 Flags int32 } type Cmsghdr struct { Len uint32 Level int32 Type int32 } type Inet4Pktinfo struct { Ifindex uint32 Spec_dst [4]byte /* in_addr */ Addr [4]byte /* in_addr */ } type Inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } type IPv6MTUInfo struct { Addr RawSockaddrInet6 Mtu uint32 } type ICMPv6Filter struct { Filt [8]uint32 } const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c SizeofSockaddrAny = 0x6c SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x14 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPv6Mreq = 0x14 SizeofMsghdr = 0x1c SizeofCmsghdr = 0xc SizeofInet4Pktinfo = 0xc SizeofInet6Pktinfo = 0x14 SizeofIPv6MTUInfo = 0x20 SizeofICMPv6Filter = 0x20 ) const ( PTRACE_TRACEME = 0x0 PTRACE_CONT = 0x7 PTRACE_KILL = 0x8 ) type Kevent_t struct { Ident uint32 Filter int16 Flags uint16 Fflags uint32 Data int32 Udata *byte } type FdSet struct { Bits [32]int32 } const ( SizeofIfMsghdr = 0x70 SizeofIfData = 0x60 SizeofIfaMsghdr = 0x14 SizeofIfmaMsghdr = 0x10 SizeofIfmaMsghdr2 = 0x14 SizeofRtMsghdr = 0x5c SizeofRtMetrics = 0x38 ) type IfMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte Data IfData } type IfData struct { Type uint8 Typelen uint8 Physical uint8 Addrlen uint8 Hdrlen uint8 Recvquota uint8 Xmitquota uint8 Unused1 uint8 Mtu uint32 Metric uint32 Baudrate uint32 Ipackets uint32 Ierrors uint32 Opackets uint32 Oerrors uint32 Collisions uint32 Ibytes uint32 Obytes uint32 Imcasts uint32 Omcasts uint32 Iqdrops uint32 Noproto uint32 Recvtiming uint32 Xmittiming uint32 Lastchange Timeval Unused2 uint32 Hwassist uint32 Reserved1 uint32 Reserved2 uint32 } type IfaMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte Metric int32 } type IfmaMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte } type IfmaMsghdr2 struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte Refcount int32 } type RtMsghdr struct { Msglen uint16 Version uint8 Type uint8 Index uint16 Pad_cgo_0 [2]byte Flags int32 Addrs int32 Pid int32 Seq int32 Errno int32 Use int32 Inits uint32 Rmx RtMetrics } type RtMetrics struct { Locks uint32 Mtu uint32 Hopcount uint32 Expire int32 Recvpipe uint32 Sendpipe uint32 Ssthresh uint32 Rtt uint32 Rttvar uint32 Pksent uint32 Filler [4]uint32 } const ( SizeofBpfVersion = 0x4 SizeofBpfStat = 0x8 SizeofBpfProgram = 0x8 SizeofBpfInsn = 0x8 SizeofBpfHdr = 0x14 ) type BpfVersion struct { Major uint16 Minor uint16 } type BpfStat struct { Recv uint32 Drop uint32 } type BpfProgram struct { Len uint32 Insns *BpfInsn } type BpfInsn struct { Code uint16 Jt uint8 Jf uint8 K uint32 } type BpfHdr struct { Tstamp Timeval Caplen uint32 Datalen uint32 Hdrlen uint16 Pad_cgo_0 [2]byte } type Termios struct { Iflag uint32 Oflag uint32 Cflag uint32 Lflag uint32 Cc [20]uint8 Ispeed uint32 Ospeed uint32 } type Winsize struct { Row uint16 Col uint16 Xpixel uint16 Ypixel uint16 } const ( AT_FDCWD = -0x2 AT_REMOVEDIR = 0x80 AT_SYMLINK_FOLLOW = 0x40 AT_SYMLINK_NOFOLLOW = 0x20 ) type PollFd struct { Fd int32 Events int16 Revents int16 } const ( POLLERR = 0x8 POLLHUP = 0x10 POLLIN = 0x1 POLLNVAL = 0x20 POLLOUT = 0x4 POLLPRI = 0x2 POLLRDBAND = 0x80 POLLRDNORM = 0x40 POLLWRBAND = 0x100 POLLWRNORM = 0x4 ) ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go ================================================ // cgo -godefs types_darwin.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,darwin package unix const ( sizeofPtr = 0x8 sizeofShort = 0x2 sizeofInt = 0x4 sizeofLong = 0x8 sizeofLongLong = 0x8 ) type ( _C_short int16 _C_int int32 _C_long int64 _C_long_long int64 ) type Timespec struct { Sec int64 Nsec int64 } type Timeval struct { Sec int64 Usec int32 Pad_cgo_0 [4]byte } type Timeval32 struct { Sec int32 Usec int32 } type Rusage struct { Utime Timeval Stime Timeval Maxrss int64 Ixrss int64 Idrss int64 Isrss int64 Minflt int64 Majflt int64 Nswap int64 Inblock int64 Oublock int64 Msgsnd int64 Msgrcv int64 Nsignals int64 Nvcsw int64 Nivcsw int64 } type Rlimit struct { Cur uint64 Max uint64 } type _Gid_t uint32 type Stat_t struct { Dev int32 Mode uint16 Nlink uint16 Ino uint64 Uid uint32 Gid uint32 Rdev int32 Pad_cgo_0 [4]byte Atimespec Timespec Mtimespec Timespec Ctimespec Timespec Birthtimespec Timespec Size int64 Blocks int64 Blksize int32 Flags uint32 Gen uint32 Lspare int32 Qspare [2]int64 } type Statfs_t struct { Bsize uint32 Iosize int32 Blocks uint64 Bfree uint64 Bavail uint64 Files uint64 Ffree uint64 Fsid Fsid Owner uint32 Type uint32 Flags uint32 Fssubtype uint32 Fstypename [16]int8 Mntonname [1024]int8 Mntfromname [1024]int8 Reserved [8]uint32 } type Flock_t struct { Start int64 Len int64 Pid int32 Type int16 Whence int16 } type Fstore_t struct { Flags uint32 Posmode int32 Offset int64 Length int64 Bytesalloc int64 } type Radvisory_t struct { Offset int64 Count int32 Pad_cgo_0 [4]byte } type Fbootstraptransfer_t struct { Offset int64 Length uint64 Buffer *byte } type Log2phys_t struct { Flags uint32 Pad_cgo_0 [8]byte Pad_cgo_1 [8]byte } type Fsid struct { Val [2]int32 } type Dirent struct { Ino uint64 Seekoff uint64 Reclen uint16 Namlen uint16 Type uint8 Name [1024]int8 Pad_cgo_0 [3]byte } type RawSockaddrInet4 struct { Len uint8 Family uint8 Port uint16 Addr [4]byte /* in_addr */ Zero [8]int8 } type RawSockaddrInet6 struct { Len uint8 Family uint8 Port uint16 Flowinfo uint32 Addr [16]byte /* in6_addr */ Scope_id uint32 } type RawSockaddrUnix struct { Len uint8 Family uint8 Path [104]int8 } type RawSockaddrDatalink struct { Len uint8 Family uint8 Index uint16 Type uint8 Nlen uint8 Alen uint8 Slen uint8 Data [12]int8 } type RawSockaddr struct { Len uint8 Family uint8 Data [14]int8 } type RawSockaddrAny struct { Addr RawSockaddr Pad [92]int8 } type _Socklen uint32 type Linger struct { Onoff int32 Linger int32 } type Iovec struct { Base *byte Len uint64 } type IPMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } type IPv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } type Msghdr struct { Name *byte Namelen uint32 Pad_cgo_0 [4]byte Iov *Iovec Iovlen int32 Pad_cgo_1 [4]byte Control *byte Controllen uint32 Flags int32 } type Cmsghdr struct { Len uint32 Level int32 Type int32 } type Inet4Pktinfo struct { Ifindex uint32 Spec_dst [4]byte /* in_addr */ Addr [4]byte /* in_addr */ } type Inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } type IPv6MTUInfo struct { Addr RawSockaddrInet6 Mtu uint32 } type ICMPv6Filter struct { Filt [8]uint32 } const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c SizeofSockaddrAny = 0x6c SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x14 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPv6Mreq = 0x14 SizeofMsghdr = 0x30 SizeofCmsghdr = 0xc SizeofInet4Pktinfo = 0xc SizeofInet6Pktinfo = 0x14 SizeofIPv6MTUInfo = 0x20 SizeofICMPv6Filter = 0x20 ) const ( PTRACE_TRACEME = 0x0 PTRACE_CONT = 0x7 PTRACE_KILL = 0x8 ) type Kevent_t struct { Ident uint64 Filter int16 Flags uint16 Fflags uint32 Data int64 Udata *byte } type FdSet struct { Bits [32]int32 } const ( SizeofIfMsghdr = 0x70 SizeofIfData = 0x60 SizeofIfaMsghdr = 0x14 SizeofIfmaMsghdr = 0x10 SizeofIfmaMsghdr2 = 0x14 SizeofRtMsghdr = 0x5c SizeofRtMetrics = 0x38 ) type IfMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte Data IfData } type IfData struct { Type uint8 Typelen uint8 Physical uint8 Addrlen uint8 Hdrlen uint8 Recvquota uint8 Xmitquota uint8 Unused1 uint8 Mtu uint32 Metric uint32 Baudrate uint32 Ipackets uint32 Ierrors uint32 Opackets uint32 Oerrors uint32 Collisions uint32 Ibytes uint32 Obytes uint32 Imcasts uint32 Omcasts uint32 Iqdrops uint32 Noproto uint32 Recvtiming uint32 Xmittiming uint32 Lastchange Timeval32 Unused2 uint32 Hwassist uint32 Reserved1 uint32 Reserved2 uint32 } type IfaMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte Metric int32 } type IfmaMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte } type IfmaMsghdr2 struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte Refcount int32 } type RtMsghdr struct { Msglen uint16 Version uint8 Type uint8 Index uint16 Pad_cgo_0 [2]byte Flags int32 Addrs int32 Pid int32 Seq int32 Errno int32 Use int32 Inits uint32 Rmx RtMetrics } type RtMetrics struct { Locks uint32 Mtu uint32 Hopcount uint32 Expire int32 Recvpipe uint32 Sendpipe uint32 Ssthresh uint32 Rtt uint32 Rttvar uint32 Pksent uint32 Filler [4]uint32 } const ( SizeofBpfVersion = 0x4 SizeofBpfStat = 0x8 SizeofBpfProgram = 0x10 SizeofBpfInsn = 0x8 SizeofBpfHdr = 0x14 ) type BpfVersion struct { Major uint16 Minor uint16 } type BpfStat struct { Recv uint32 Drop uint32 } type BpfProgram struct { Len uint32 Pad_cgo_0 [4]byte Insns *BpfInsn } type BpfInsn struct { Code uint16 Jt uint8 Jf uint8 K uint32 } type BpfHdr struct { Tstamp Timeval32 Caplen uint32 Datalen uint32 Hdrlen uint16 Pad_cgo_0 [2]byte } type Termios struct { Iflag uint64 Oflag uint64 Cflag uint64 Lflag uint64 Cc [20]uint8 Pad_cgo_0 [4]byte Ispeed uint64 Ospeed uint64 } type Winsize struct { Row uint16 Col uint16 Xpixel uint16 Ypixel uint16 } const ( AT_FDCWD = -0x2 AT_REMOVEDIR = 0x80 AT_SYMLINK_FOLLOW = 0x40 AT_SYMLINK_NOFOLLOW = 0x20 ) type PollFd struct { Fd int32 Events int16 Revents int16 } const ( POLLERR = 0x8 POLLHUP = 0x10 POLLIN = 0x1 POLLNVAL = 0x20 POLLOUT = 0x4 POLLPRI = 0x2 POLLRDBAND = 0x80 POLLRDNORM = 0x40 POLLWRBAND = 0x100 POLLWRNORM = 0x4 ) ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go ================================================ // NOTE: cgo can't generate struct Stat_t and struct Statfs_t yet // Created by cgo -godefs - DO NOT EDIT // cgo -godefs types_darwin.go // +build arm,darwin package unix const ( sizeofPtr = 0x4 sizeofShort = 0x2 sizeofInt = 0x4 sizeofLong = 0x4 sizeofLongLong = 0x8 ) type ( _C_short int16 _C_int int32 _C_long int32 _C_long_long int64 ) type Timespec struct { Sec int32 Nsec int32 } type Timeval struct { Sec int32 Usec int32 } type Timeval32 [0]byte type Rusage struct { Utime Timeval Stime Timeval Maxrss int32 Ixrss int32 Idrss int32 Isrss int32 Minflt int32 Majflt int32 Nswap int32 Inblock int32 Oublock int32 Msgsnd int32 Msgrcv int32 Nsignals int32 Nvcsw int32 Nivcsw int32 } type Rlimit struct { Cur uint64 Max uint64 } type _Gid_t uint32 type Stat_t struct { Dev int32 Mode uint16 Nlink uint16 Ino uint64 Uid uint32 Gid uint32 Rdev int32 Atimespec Timespec Mtimespec Timespec Ctimespec Timespec Birthtimespec Timespec Size int64 Blocks int64 Blksize int32 Flags uint32 Gen uint32 Lspare int32 Qspare [2]int64 } type Statfs_t struct { Bsize uint32 Iosize int32 Blocks uint64 Bfree uint64 Bavail uint64 Files uint64 Ffree uint64 Fsid Fsid Owner uint32 Type uint32 Flags uint32 Fssubtype uint32 Fstypename [16]int8 Mntonname [1024]int8 Mntfromname [1024]int8 Reserved [8]uint32 } type Flock_t struct { Start int64 Len int64 Pid int32 Type int16 Whence int16 } type Fstore_t struct { Flags uint32 Posmode int32 Offset int64 Length int64 Bytesalloc int64 } type Radvisory_t struct { Offset int64 Count int32 } type Fbootstraptransfer_t struct { Offset int64 Length uint32 Buffer *byte } type Log2phys_t struct { Flags uint32 Contigbytes int64 Devoffset int64 } type Fsid struct { Val [2]int32 } type Dirent struct { Ino uint64 Seekoff uint64 Reclen uint16 Namlen uint16 Type uint8 Name [1024]int8 Pad_cgo_0 [3]byte } type RawSockaddrInet4 struct { Len uint8 Family uint8 Port uint16 Addr [4]byte /* in_addr */ Zero [8]int8 } type RawSockaddrInet6 struct { Len uint8 Family uint8 Port uint16 Flowinfo uint32 Addr [16]byte /* in6_addr */ Scope_id uint32 } type RawSockaddrUnix struct { Len uint8 Family uint8 Path [104]int8 } type RawSockaddrDatalink struct { Len uint8 Family uint8 Index uint16 Type uint8 Nlen uint8 Alen uint8 Slen uint8 Data [12]int8 } type RawSockaddr struct { Len uint8 Family uint8 Data [14]int8 } type RawSockaddrAny struct { Addr RawSockaddr Pad [92]int8 } type _Socklen uint32 type Linger struct { Onoff int32 Linger int32 } type Iovec struct { Base *byte Len uint32 } type IPMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } type IPv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } type Msghdr struct { Name *byte Namelen uint32 Iov *Iovec Iovlen int32 Control *byte Controllen uint32 Flags int32 } type Cmsghdr struct { Len uint32 Level int32 Type int32 } type Inet4Pktinfo struct { Ifindex uint32 Spec_dst [4]byte /* in_addr */ Addr [4]byte /* in_addr */ } type Inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } type IPv6MTUInfo struct { Addr RawSockaddrInet6 Mtu uint32 } type ICMPv6Filter struct { Filt [8]uint32 } const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c SizeofSockaddrAny = 0x6c SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x14 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPv6Mreq = 0x14 SizeofMsghdr = 0x1c SizeofCmsghdr = 0xc SizeofInet4Pktinfo = 0xc SizeofInet6Pktinfo = 0x14 SizeofIPv6MTUInfo = 0x20 SizeofICMPv6Filter = 0x20 ) const ( PTRACE_TRACEME = 0x0 PTRACE_CONT = 0x7 PTRACE_KILL = 0x8 ) type Kevent_t struct { Ident uint32 Filter int16 Flags uint16 Fflags uint32 Data int32 Udata *byte } type FdSet struct { Bits [32]int32 } const ( SizeofIfMsghdr = 0x70 SizeofIfData = 0x60 SizeofIfaMsghdr = 0x14 SizeofIfmaMsghdr = 0x10 SizeofIfmaMsghdr2 = 0x14 SizeofRtMsghdr = 0x5c SizeofRtMetrics = 0x38 ) type IfMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte Data IfData } type IfData struct { Type uint8 Typelen uint8 Physical uint8 Addrlen uint8 Hdrlen uint8 Recvquota uint8 Xmitquota uint8 Unused1 uint8 Mtu uint32 Metric uint32 Baudrate uint32 Ipackets uint32 Ierrors uint32 Opackets uint32 Oerrors uint32 Collisions uint32 Ibytes uint32 Obytes uint32 Imcasts uint32 Omcasts uint32 Iqdrops uint32 Noproto uint32 Recvtiming uint32 Xmittiming uint32 Lastchange Timeval Unused2 uint32 Hwassist uint32 Reserved1 uint32 Reserved2 uint32 } type IfaMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte Metric int32 } type IfmaMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte } type IfmaMsghdr2 struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte Refcount int32 } type RtMsghdr struct { Msglen uint16 Version uint8 Type uint8 Index uint16 Pad_cgo_0 [2]byte Flags int32 Addrs int32 Pid int32 Seq int32 Errno int32 Use int32 Inits uint32 Rmx RtMetrics } type RtMetrics struct { Locks uint32 Mtu uint32 Hopcount uint32 Expire int32 Recvpipe uint32 Sendpipe uint32 Ssthresh uint32 Rtt uint32 Rttvar uint32 Pksent uint32 Filler [4]uint32 } const ( SizeofBpfVersion = 0x4 SizeofBpfStat = 0x8 SizeofBpfProgram = 0x8 SizeofBpfInsn = 0x8 SizeofBpfHdr = 0x14 ) type BpfVersion struct { Major uint16 Minor uint16 } type BpfStat struct { Recv uint32 Drop uint32 } type BpfProgram struct { Len uint32 Insns *BpfInsn } type BpfInsn struct { Code uint16 Jt uint8 Jf uint8 K uint32 } type BpfHdr struct { Tstamp Timeval Caplen uint32 Datalen uint32 Hdrlen uint16 Pad_cgo_0 [2]byte } type Termios struct { Iflag uint32 Oflag uint32 Cflag uint32 Lflag uint32 Cc [20]uint8 Ispeed uint32 Ospeed uint32 } type Winsize struct { Row uint16 Col uint16 Xpixel uint16 Ypixel uint16 } const ( AT_FDCWD = -0x2 AT_REMOVEDIR = 0x80 AT_SYMLINK_FOLLOW = 0x40 AT_SYMLINK_NOFOLLOW = 0x20 ) type PollFd struct { Fd int32 Events int16 Revents int16 } const ( POLLERR = 0x8 POLLHUP = 0x10 POLLIN = 0x1 POLLNVAL = 0x20 POLLOUT = 0x4 POLLPRI = 0x2 POLLRDBAND = 0x80 POLLRDNORM = 0x40 POLLWRBAND = 0x100 POLLWRNORM = 0x4 ) ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go ================================================ // cgo -godefs types_darwin.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build arm64,darwin package unix const ( sizeofPtr = 0x8 sizeofShort = 0x2 sizeofInt = 0x4 sizeofLong = 0x8 sizeofLongLong = 0x8 ) type ( _C_short int16 _C_int int32 _C_long int64 _C_long_long int64 ) type Timespec struct { Sec int64 Nsec int64 } type Timeval struct { Sec int64 Usec int32 Pad_cgo_0 [4]byte } type Timeval32 struct { Sec int32 Usec int32 } type Rusage struct { Utime Timeval Stime Timeval Maxrss int64 Ixrss int64 Idrss int64 Isrss int64 Minflt int64 Majflt int64 Nswap int64 Inblock int64 Oublock int64 Msgsnd int64 Msgrcv int64 Nsignals int64 Nvcsw int64 Nivcsw int64 } type Rlimit struct { Cur uint64 Max uint64 } type _Gid_t uint32 type Stat_t struct { Dev int32 Mode uint16 Nlink uint16 Ino uint64 Uid uint32 Gid uint32 Rdev int32 Pad_cgo_0 [4]byte Atimespec Timespec Mtimespec Timespec Ctimespec Timespec Birthtimespec Timespec Size int64 Blocks int64 Blksize int32 Flags uint32 Gen uint32 Lspare int32 Qspare [2]int64 } type Statfs_t struct { Bsize uint32 Iosize int32 Blocks uint64 Bfree uint64 Bavail uint64 Files uint64 Ffree uint64 Fsid Fsid Owner uint32 Type uint32 Flags uint32 Fssubtype uint32 Fstypename [16]int8 Mntonname [1024]int8 Mntfromname [1024]int8 Reserved [8]uint32 } type Flock_t struct { Start int64 Len int64 Pid int32 Type int16 Whence int16 } type Fstore_t struct { Flags uint32 Posmode int32 Offset int64 Length int64 Bytesalloc int64 } type Radvisory_t struct { Offset int64 Count int32 Pad_cgo_0 [4]byte } type Fbootstraptransfer_t struct { Offset int64 Length uint64 Buffer *byte } type Log2phys_t struct { Flags uint32 Pad_cgo_0 [8]byte Pad_cgo_1 [8]byte } type Fsid struct { Val [2]int32 } type Dirent struct { Ino uint64 Seekoff uint64 Reclen uint16 Namlen uint16 Type uint8 Name [1024]int8 Pad_cgo_0 [3]byte } type RawSockaddrInet4 struct { Len uint8 Family uint8 Port uint16 Addr [4]byte /* in_addr */ Zero [8]int8 } type RawSockaddrInet6 struct { Len uint8 Family uint8 Port uint16 Flowinfo uint32 Addr [16]byte /* in6_addr */ Scope_id uint32 } type RawSockaddrUnix struct { Len uint8 Family uint8 Path [104]int8 } type RawSockaddrDatalink struct { Len uint8 Family uint8 Index uint16 Type uint8 Nlen uint8 Alen uint8 Slen uint8 Data [12]int8 } type RawSockaddr struct { Len uint8 Family uint8 Data [14]int8 } type RawSockaddrAny struct { Addr RawSockaddr Pad [92]int8 } type _Socklen uint32 type Linger struct { Onoff int32 Linger int32 } type Iovec struct { Base *byte Len uint64 } type IPMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } type IPv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } type Msghdr struct { Name *byte Namelen uint32 Pad_cgo_0 [4]byte Iov *Iovec Iovlen int32 Pad_cgo_1 [4]byte Control *byte Controllen uint32 Flags int32 } type Cmsghdr struct { Len uint32 Level int32 Type int32 } type Inet4Pktinfo struct { Ifindex uint32 Spec_dst [4]byte /* in_addr */ Addr [4]byte /* in_addr */ } type Inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } type IPv6MTUInfo struct { Addr RawSockaddrInet6 Mtu uint32 } type ICMPv6Filter struct { Filt [8]uint32 } const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c SizeofSockaddrAny = 0x6c SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x14 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPv6Mreq = 0x14 SizeofMsghdr = 0x30 SizeofCmsghdr = 0xc SizeofInet4Pktinfo = 0xc SizeofInet6Pktinfo = 0x14 SizeofIPv6MTUInfo = 0x20 SizeofICMPv6Filter = 0x20 ) const ( PTRACE_TRACEME = 0x0 PTRACE_CONT = 0x7 PTRACE_KILL = 0x8 ) type Kevent_t struct { Ident uint64 Filter int16 Flags uint16 Fflags uint32 Data int64 Udata *byte } type FdSet struct { Bits [32]int32 } const ( SizeofIfMsghdr = 0x70 SizeofIfData = 0x60 SizeofIfaMsghdr = 0x14 SizeofIfmaMsghdr = 0x10 SizeofIfmaMsghdr2 = 0x14 SizeofRtMsghdr = 0x5c SizeofRtMetrics = 0x38 ) type IfMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte Data IfData } type IfData struct { Type uint8 Typelen uint8 Physical uint8 Addrlen uint8 Hdrlen uint8 Recvquota uint8 Xmitquota uint8 Unused1 uint8 Mtu uint32 Metric uint32 Baudrate uint32 Ipackets uint32 Ierrors uint32 Opackets uint32 Oerrors uint32 Collisions uint32 Ibytes uint32 Obytes uint32 Imcasts uint32 Omcasts uint32 Iqdrops uint32 Noproto uint32 Recvtiming uint32 Xmittiming uint32 Lastchange Timeval32 Unused2 uint32 Hwassist uint32 Reserved1 uint32 Reserved2 uint32 } type IfaMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte Metric int32 } type IfmaMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte } type IfmaMsghdr2 struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte Refcount int32 } type RtMsghdr struct { Msglen uint16 Version uint8 Type uint8 Index uint16 Pad_cgo_0 [2]byte Flags int32 Addrs int32 Pid int32 Seq int32 Errno int32 Use int32 Inits uint32 Rmx RtMetrics } type RtMetrics struct { Locks uint32 Mtu uint32 Hopcount uint32 Expire int32 Recvpipe uint32 Sendpipe uint32 Ssthresh uint32 Rtt uint32 Rttvar uint32 Pksent uint32 Filler [4]uint32 } const ( SizeofBpfVersion = 0x4 SizeofBpfStat = 0x8 SizeofBpfProgram = 0x10 SizeofBpfInsn = 0x8 SizeofBpfHdr = 0x14 ) type BpfVersion struct { Major uint16 Minor uint16 } type BpfStat struct { Recv uint32 Drop uint32 } type BpfProgram struct { Len uint32 Pad_cgo_0 [4]byte Insns *BpfInsn } type BpfInsn struct { Code uint16 Jt uint8 Jf uint8 K uint32 } type BpfHdr struct { Tstamp Timeval32 Caplen uint32 Datalen uint32 Hdrlen uint16 Pad_cgo_0 [2]byte } type Termios struct { Iflag uint64 Oflag uint64 Cflag uint64 Lflag uint64 Cc [20]uint8 Pad_cgo_0 [4]byte Ispeed uint64 Ospeed uint64 } type Winsize struct { Row uint16 Col uint16 Xpixel uint16 Ypixel uint16 } const ( AT_FDCWD = -0x2 AT_REMOVEDIR = 0x80 AT_SYMLINK_FOLLOW = 0x40 AT_SYMLINK_NOFOLLOW = 0x20 ) type PollFd struct { Fd int32 Events int16 Revents int16 } const ( POLLERR = 0x8 POLLHUP = 0x10 POLLIN = 0x1 POLLNVAL = 0x20 POLLOUT = 0x4 POLLPRI = 0x2 POLLRDBAND = 0x80 POLLRDNORM = 0x40 POLLWRBAND = 0x100 POLLWRNORM = 0x4 ) ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go ================================================ // cgo -godefs types_dragonfly.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,dragonfly package unix const ( sizeofPtr = 0x8 sizeofShort = 0x2 sizeofInt = 0x4 sizeofLong = 0x8 sizeofLongLong = 0x8 ) type ( _C_short int16 _C_int int32 _C_long int64 _C_long_long int64 ) type Timespec struct { Sec int64 Nsec int64 } type Timeval struct { Sec int64 Usec int64 } type Rusage struct { Utime Timeval Stime Timeval Maxrss int64 Ixrss int64 Idrss int64 Isrss int64 Minflt int64 Majflt int64 Nswap int64 Inblock int64 Oublock int64 Msgsnd int64 Msgrcv int64 Nsignals int64 Nvcsw int64 Nivcsw int64 } type Rlimit struct { Cur int64 Max int64 } type _Gid_t uint32 const ( S_IFMT = 0xf000 S_IFIFO = 0x1000 S_IFCHR = 0x2000 S_IFDIR = 0x4000 S_IFBLK = 0x6000 S_IFREG = 0x8000 S_IFLNK = 0xa000 S_IFSOCK = 0xc000 S_ISUID = 0x800 S_ISGID = 0x400 S_ISVTX = 0x200 S_IRUSR = 0x100 S_IWUSR = 0x80 S_IXUSR = 0x40 ) type Stat_t struct { Ino uint64 Nlink uint32 Dev uint32 Mode uint16 Padding1 uint16 Uid uint32 Gid uint32 Rdev uint32 Atim Timespec Mtim Timespec Ctim Timespec Size int64 Blocks int64 Blksize uint32 Flags uint32 Gen uint32 Lspare int32 Qspare1 int64 Qspare2 int64 } type Statfs_t struct { Spare2 int64 Bsize int64 Iosize int64 Blocks int64 Bfree int64 Bavail int64 Files int64 Ffree int64 Fsid Fsid Owner uint32 Type int32 Flags int32 Pad_cgo_0 [4]byte Syncwrites int64 Asyncwrites int64 Fstypename [16]int8 Mntonname [80]int8 Syncreads int64 Asyncreads int64 Spares1 int16 Mntfromname [80]int8 Spares2 int16 Pad_cgo_1 [4]byte Spare [2]int64 } type Flock_t struct { Start int64 Len int64 Pid int32 Type int16 Whence int16 } type Dirent struct { Fileno uint64 Namlen uint16 Type uint8 Unused1 uint8 Unused2 uint32 Name [256]int8 } type Fsid struct { Val [2]int32 } type RawSockaddrInet4 struct { Len uint8 Family uint8 Port uint16 Addr [4]byte /* in_addr */ Zero [8]int8 } type RawSockaddrInet6 struct { Len uint8 Family uint8 Port uint16 Flowinfo uint32 Addr [16]byte /* in6_addr */ Scope_id uint32 } type RawSockaddrUnix struct { Len uint8 Family uint8 Path [104]int8 } type RawSockaddrDatalink struct { Len uint8 Family uint8 Index uint16 Type uint8 Nlen uint8 Alen uint8 Slen uint8 Data [12]int8 Rcf uint16 Route [16]uint16 } type RawSockaddr struct { Len uint8 Family uint8 Data [14]int8 } type RawSockaddrAny struct { Addr RawSockaddr Pad [92]int8 } type _Socklen uint32 type Linger struct { Onoff int32 Linger int32 } type Iovec struct { Base *byte Len uint64 } type IPMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } type IPv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } type Msghdr struct { Name *byte Namelen uint32 Pad_cgo_0 [4]byte Iov *Iovec Iovlen int32 Pad_cgo_1 [4]byte Control *byte Controllen uint32 Flags int32 } type Cmsghdr struct { Len uint32 Level int32 Type int32 } type Inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } type IPv6MTUInfo struct { Addr RawSockaddrInet6 Mtu uint32 } type ICMPv6Filter struct { Filt [8]uint32 } const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c SizeofSockaddrAny = 0x6c SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x36 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPv6Mreq = 0x14 SizeofMsghdr = 0x30 SizeofCmsghdr = 0xc SizeofInet6Pktinfo = 0x14 SizeofIPv6MTUInfo = 0x20 SizeofICMPv6Filter = 0x20 ) const ( PTRACE_TRACEME = 0x0 PTRACE_CONT = 0x7 PTRACE_KILL = 0x8 ) type Kevent_t struct { Ident uint64 Filter int16 Flags uint16 Fflags uint32 Data int64 Udata *byte } type FdSet struct { Bits [16]uint64 } const ( SizeofIfMsghdr = 0xb0 SizeofIfData = 0xa0 SizeofIfaMsghdr = 0x14 SizeofIfmaMsghdr = 0x10 SizeofIfAnnounceMsghdr = 0x18 SizeofRtMsghdr = 0x98 SizeofRtMetrics = 0x70 ) type IfMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte Data IfData } type IfData struct { Type uint8 Physical uint8 Addrlen uint8 Hdrlen uint8 Recvquota uint8 Xmitquota uint8 Pad_cgo_0 [2]byte Mtu uint64 Metric uint64 Link_state uint64 Baudrate uint64 Ipackets uint64 Ierrors uint64 Opackets uint64 Oerrors uint64 Collisions uint64 Ibytes uint64 Obytes uint64 Imcasts uint64 Omcasts uint64 Iqdrops uint64 Noproto uint64 Hwassist uint64 Oqdrops uint64 Lastchange Timeval } type IfaMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte Metric int32 } type IfmaMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte } type IfAnnounceMsghdr struct { Msglen uint16 Version uint8 Type uint8 Index uint16 Name [16]int8 What uint16 } type RtMsghdr struct { Msglen uint16 Version uint8 Type uint8 Index uint16 Pad_cgo_0 [2]byte Flags int32 Addrs int32 Pid int32 Seq int32 Errno int32 Use int32 Inits uint64 Rmx RtMetrics } type RtMetrics struct { Locks uint64 Mtu uint64 Pksent uint64 Expire uint64 Sendpipe uint64 Ssthresh uint64 Rtt uint64 Rttvar uint64 Recvpipe uint64 Hopcount uint64 Mssopt uint16 Pad uint16 Pad_cgo_0 [4]byte Msl uint64 Iwmaxsegs uint64 Iwcapsegs uint64 } const ( SizeofBpfVersion = 0x4 SizeofBpfStat = 0x8 SizeofBpfProgram = 0x10 SizeofBpfInsn = 0x8 SizeofBpfHdr = 0x20 ) type BpfVersion struct { Major uint16 Minor uint16 } type BpfStat struct { Recv uint32 Drop uint32 } type BpfProgram struct { Len uint32 Pad_cgo_0 [4]byte Insns *BpfInsn } type BpfInsn struct { Code uint16 Jt uint8 Jf uint8 K uint32 } type BpfHdr struct { Tstamp Timeval Caplen uint32 Datalen uint32 Hdrlen uint16 Pad_cgo_0 [6]byte } type Termios struct { Iflag uint32 Oflag uint32 Cflag uint32 Lflag uint32 Cc [20]uint8 Ispeed uint32 Ospeed uint32 } type Winsize struct { Row uint16 Col uint16 Xpixel uint16 Ypixel uint16 } const ( AT_FDCWD = 0xfffafdcd AT_SYMLINK_NOFOLLOW = 0x1 ) type PollFd struct { Fd int32 Events int16 Revents int16 } const ( POLLERR = 0x8 POLLHUP = 0x10 POLLIN = 0x1 POLLNVAL = 0x20 POLLOUT = 0x4 POLLPRI = 0x2 POLLRDBAND = 0x80 POLLRDNORM = 0x40 POLLWRBAND = 0x100 POLLWRNORM = 0x4 ) ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go ================================================ // cgo -godefs types_freebsd.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build 386,freebsd package unix const ( sizeofPtr = 0x4 sizeofShort = 0x2 sizeofInt = 0x4 sizeofLong = 0x4 sizeofLongLong = 0x8 ) type ( _C_short int16 _C_int int32 _C_long int32 _C_long_long int64 ) type Timespec struct { Sec int32 Nsec int32 } type Timeval struct { Sec int32 Usec int32 } type Rusage struct { Utime Timeval Stime Timeval Maxrss int32 Ixrss int32 Idrss int32 Isrss int32 Minflt int32 Majflt int32 Nswap int32 Inblock int32 Oublock int32 Msgsnd int32 Msgrcv int32 Nsignals int32 Nvcsw int32 Nivcsw int32 } type Rlimit struct { Cur int64 Max int64 } type _Gid_t uint32 const ( S_IFMT = 0xf000 S_IFIFO = 0x1000 S_IFCHR = 0x2000 S_IFDIR = 0x4000 S_IFBLK = 0x6000 S_IFREG = 0x8000 S_IFLNK = 0xa000 S_IFSOCK = 0xc000 S_ISUID = 0x800 S_ISGID = 0x400 S_ISVTX = 0x200 S_IRUSR = 0x100 S_IWUSR = 0x80 S_IXUSR = 0x40 ) type Stat_t struct { Dev uint32 Ino uint32 Mode uint16 Nlink uint16 Uid uint32 Gid uint32 Rdev uint32 Atimespec Timespec Mtimespec Timespec Ctimespec Timespec Size int64 Blocks int64 Blksize int32 Flags uint32 Gen uint32 Lspare int32 Birthtimespec Timespec Pad_cgo_0 [8]byte } type Statfs_t struct { Version uint32 Type uint32 Flags uint64 Bsize uint64 Iosize uint64 Blocks uint64 Bfree uint64 Bavail int64 Files uint64 Ffree int64 Syncwrites uint64 Asyncwrites uint64 Syncreads uint64 Asyncreads uint64 Spare [10]uint64 Namemax uint32 Owner uint32 Fsid Fsid Charspare [80]int8 Fstypename [16]int8 Mntfromname [88]int8 Mntonname [88]int8 } type Flock_t struct { Start int64 Len int64 Pid int32 Type int16 Whence int16 Sysid int32 } type Dirent struct { Fileno uint32 Reclen uint16 Type uint8 Namlen uint8 Name [256]int8 } type Fsid struct { Val [2]int32 } const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 FADV_SEQUENTIAL = 0x2 FADV_WILLNEED = 0x3 FADV_DONTNEED = 0x4 FADV_NOREUSE = 0x5 ) type RawSockaddrInet4 struct { Len uint8 Family uint8 Port uint16 Addr [4]byte /* in_addr */ Zero [8]int8 } type RawSockaddrInet6 struct { Len uint8 Family uint8 Port uint16 Flowinfo uint32 Addr [16]byte /* in6_addr */ Scope_id uint32 } type RawSockaddrUnix struct { Len uint8 Family uint8 Path [104]int8 } type RawSockaddrDatalink struct { Len uint8 Family uint8 Index uint16 Type uint8 Nlen uint8 Alen uint8 Slen uint8 Data [46]int8 } type RawSockaddr struct { Len uint8 Family uint8 Data [14]int8 } type RawSockaddrAny struct { Addr RawSockaddr Pad [92]int8 } type _Socklen uint32 type Linger struct { Onoff int32 Linger int32 } type Iovec struct { Base *byte Len uint32 } type IPMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } type IPMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } type IPv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } type Msghdr struct { Name *byte Namelen uint32 Iov *Iovec Iovlen int32 Control *byte Controllen uint32 Flags int32 } type Cmsghdr struct { Len uint32 Level int32 Type int32 } type Inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } type IPv6MTUInfo struct { Addr RawSockaddrInet6 Mtu uint32 } type ICMPv6Filter struct { Filt [8]uint32 } const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c SizeofSockaddrAny = 0x6c SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x36 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 SizeofMsghdr = 0x1c SizeofCmsghdr = 0xc SizeofInet6Pktinfo = 0x14 SizeofIPv6MTUInfo = 0x20 SizeofICMPv6Filter = 0x20 ) const ( PTRACE_TRACEME = 0x0 PTRACE_CONT = 0x7 PTRACE_KILL = 0x8 ) type Kevent_t struct { Ident uint32 Filter int16 Flags uint16 Fflags uint32 Data int32 Udata *byte } type FdSet struct { X__fds_bits [32]uint32 } const ( sizeofIfMsghdr = 0xa8 SizeofIfMsghdr = 0x60 sizeofIfData = 0x98 SizeofIfData = 0x50 SizeofIfaMsghdr = 0x14 SizeofIfmaMsghdr = 0x10 SizeofIfAnnounceMsghdr = 0x18 SizeofRtMsghdr = 0x5c SizeofRtMetrics = 0x38 ) type ifMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte Data ifData } type IfMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte Data IfData } type ifData struct { Type uint8 Physical uint8 Addrlen uint8 Hdrlen uint8 Link_state uint8 Vhid uint8 Datalen uint16 Mtu uint32 Metric uint32 Baudrate uint64 Ipackets uint64 Ierrors uint64 Opackets uint64 Oerrors uint64 Collisions uint64 Ibytes uint64 Obytes uint64 Imcasts uint64 Omcasts uint64 Iqdrops uint64 Oqdrops uint64 Noproto uint64 Hwassist uint64 X__ifi_epoch [8]byte X__ifi_lastchange [16]byte } type IfData struct { Type uint8 Physical uint8 Addrlen uint8 Hdrlen uint8 Link_state uint8 Spare_char1 uint8 Spare_char2 uint8 Datalen uint8 Mtu uint32 Metric uint32 Baudrate uint32 Ipackets uint32 Ierrors uint32 Opackets uint32 Oerrors uint32 Collisions uint32 Ibytes uint32 Obytes uint32 Imcasts uint32 Omcasts uint32 Iqdrops uint32 Noproto uint32 Hwassist uint32 Epoch int32 Lastchange Timeval } type IfaMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte Metric int32 } type IfmaMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte } type IfAnnounceMsghdr struct { Msglen uint16 Version uint8 Type uint8 Index uint16 Name [16]int8 What uint16 } type RtMsghdr struct { Msglen uint16 Version uint8 Type uint8 Index uint16 Pad_cgo_0 [2]byte Flags int32 Addrs int32 Pid int32 Seq int32 Errno int32 Fmask int32 Inits uint32 Rmx RtMetrics } type RtMetrics struct { Locks uint32 Mtu uint32 Hopcount uint32 Expire uint32 Recvpipe uint32 Sendpipe uint32 Ssthresh uint32 Rtt uint32 Rttvar uint32 Pksent uint32 Weight uint32 Filler [3]uint32 } const ( SizeofBpfVersion = 0x4 SizeofBpfStat = 0x8 SizeofBpfZbuf = 0xc SizeofBpfProgram = 0x8 SizeofBpfInsn = 0x8 SizeofBpfHdr = 0x14 SizeofBpfZbufHeader = 0x20 ) type BpfVersion struct { Major uint16 Minor uint16 } type BpfStat struct { Recv uint32 Drop uint32 } type BpfZbuf struct { Bufa *byte Bufb *byte Buflen uint32 } type BpfProgram struct { Len uint32 Insns *BpfInsn } type BpfInsn struct { Code uint16 Jt uint8 Jf uint8 K uint32 } type BpfHdr struct { Tstamp Timeval Caplen uint32 Datalen uint32 Hdrlen uint16 Pad_cgo_0 [2]byte } type BpfZbufHeader struct { Kernel_gen uint32 Kernel_len uint32 User_gen uint32 X_bzh_pad [5]uint32 } type Termios struct { Iflag uint32 Oflag uint32 Cflag uint32 Lflag uint32 Cc [20]uint8 Ispeed uint32 Ospeed uint32 } type Winsize struct { Row uint16 Col uint16 Xpixel uint16 Ypixel uint16 } const ( AT_FDCWD = -0x64 AT_REMOVEDIR = 0x800 AT_SYMLINK_FOLLOW = 0x400 AT_SYMLINK_NOFOLLOW = 0x200 ) type PollFd struct { Fd int32 Events int16 Revents int16 } const ( POLLERR = 0x8 POLLHUP = 0x10 POLLIN = 0x1 POLLINIGNEOF = 0x2000 POLLNVAL = 0x20 POLLOUT = 0x4 POLLPRI = 0x2 POLLRDBAND = 0x80 POLLRDNORM = 0x40 POLLWRBAND = 0x100 POLLWRNORM = 0x4 ) type CapRights struct { Rights [2]uint64 } ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go ================================================ // cgo -godefs types_freebsd.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,freebsd package unix const ( sizeofPtr = 0x8 sizeofShort = 0x2 sizeofInt = 0x4 sizeofLong = 0x8 sizeofLongLong = 0x8 ) type ( _C_short int16 _C_int int32 _C_long int64 _C_long_long int64 ) type Timespec struct { Sec int64 Nsec int64 } type Timeval struct { Sec int64 Usec int64 } type Rusage struct { Utime Timeval Stime Timeval Maxrss int64 Ixrss int64 Idrss int64 Isrss int64 Minflt int64 Majflt int64 Nswap int64 Inblock int64 Oublock int64 Msgsnd int64 Msgrcv int64 Nsignals int64 Nvcsw int64 Nivcsw int64 } type Rlimit struct { Cur int64 Max int64 } type _Gid_t uint32 const ( S_IFMT = 0xf000 S_IFIFO = 0x1000 S_IFCHR = 0x2000 S_IFDIR = 0x4000 S_IFBLK = 0x6000 S_IFREG = 0x8000 S_IFLNK = 0xa000 S_IFSOCK = 0xc000 S_ISUID = 0x800 S_ISGID = 0x400 S_ISVTX = 0x200 S_IRUSR = 0x100 S_IWUSR = 0x80 S_IXUSR = 0x40 ) type Stat_t struct { Dev uint32 Ino uint32 Mode uint16 Nlink uint16 Uid uint32 Gid uint32 Rdev uint32 Atimespec Timespec Mtimespec Timespec Ctimespec Timespec Size int64 Blocks int64 Blksize int32 Flags uint32 Gen uint32 Lspare int32 Birthtimespec Timespec } type Statfs_t struct { Version uint32 Type uint32 Flags uint64 Bsize uint64 Iosize uint64 Blocks uint64 Bfree uint64 Bavail int64 Files uint64 Ffree int64 Syncwrites uint64 Asyncwrites uint64 Syncreads uint64 Asyncreads uint64 Spare [10]uint64 Namemax uint32 Owner uint32 Fsid Fsid Charspare [80]int8 Fstypename [16]int8 Mntfromname [88]int8 Mntonname [88]int8 } type Flock_t struct { Start int64 Len int64 Pid int32 Type int16 Whence int16 Sysid int32 Pad_cgo_0 [4]byte } type Dirent struct { Fileno uint32 Reclen uint16 Type uint8 Namlen uint8 Name [256]int8 } type Fsid struct { Val [2]int32 } const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 FADV_SEQUENTIAL = 0x2 FADV_WILLNEED = 0x3 FADV_DONTNEED = 0x4 FADV_NOREUSE = 0x5 ) type RawSockaddrInet4 struct { Len uint8 Family uint8 Port uint16 Addr [4]byte /* in_addr */ Zero [8]int8 } type RawSockaddrInet6 struct { Len uint8 Family uint8 Port uint16 Flowinfo uint32 Addr [16]byte /* in6_addr */ Scope_id uint32 } type RawSockaddrUnix struct { Len uint8 Family uint8 Path [104]int8 } type RawSockaddrDatalink struct { Len uint8 Family uint8 Index uint16 Type uint8 Nlen uint8 Alen uint8 Slen uint8 Data [46]int8 } type RawSockaddr struct { Len uint8 Family uint8 Data [14]int8 } type RawSockaddrAny struct { Addr RawSockaddr Pad [92]int8 } type _Socklen uint32 type Linger struct { Onoff int32 Linger int32 } type Iovec struct { Base *byte Len uint64 } type IPMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } type IPMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } type IPv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } type Msghdr struct { Name *byte Namelen uint32 Pad_cgo_0 [4]byte Iov *Iovec Iovlen int32 Pad_cgo_1 [4]byte Control *byte Controllen uint32 Flags int32 } type Cmsghdr struct { Len uint32 Level int32 Type int32 } type Inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } type IPv6MTUInfo struct { Addr RawSockaddrInet6 Mtu uint32 } type ICMPv6Filter struct { Filt [8]uint32 } const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c SizeofSockaddrAny = 0x6c SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x36 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 SizeofMsghdr = 0x30 SizeofCmsghdr = 0xc SizeofInet6Pktinfo = 0x14 SizeofIPv6MTUInfo = 0x20 SizeofICMPv6Filter = 0x20 ) const ( PTRACE_TRACEME = 0x0 PTRACE_CONT = 0x7 PTRACE_KILL = 0x8 ) type Kevent_t struct { Ident uint64 Filter int16 Flags uint16 Fflags uint32 Data int64 Udata *byte } type FdSet struct { X__fds_bits [16]uint64 } const ( sizeofIfMsghdr = 0xa8 SizeofIfMsghdr = 0xa8 sizeofIfData = 0x98 SizeofIfData = 0x98 SizeofIfaMsghdr = 0x14 SizeofIfmaMsghdr = 0x10 SizeofIfAnnounceMsghdr = 0x18 SizeofRtMsghdr = 0x98 SizeofRtMetrics = 0x70 ) type ifMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte Data ifData } type IfMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte Data IfData } type ifData struct { Type uint8 Physical uint8 Addrlen uint8 Hdrlen uint8 Link_state uint8 Vhid uint8 Datalen uint16 Mtu uint32 Metric uint32 Baudrate uint64 Ipackets uint64 Ierrors uint64 Opackets uint64 Oerrors uint64 Collisions uint64 Ibytes uint64 Obytes uint64 Imcasts uint64 Omcasts uint64 Iqdrops uint64 Oqdrops uint64 Noproto uint64 Hwassist uint64 X__ifi_epoch [8]byte X__ifi_lastchange [16]byte } type IfData struct { Type uint8 Physical uint8 Addrlen uint8 Hdrlen uint8 Link_state uint8 Spare_char1 uint8 Spare_char2 uint8 Datalen uint8 Mtu uint64 Metric uint64 Baudrate uint64 Ipackets uint64 Ierrors uint64 Opackets uint64 Oerrors uint64 Collisions uint64 Ibytes uint64 Obytes uint64 Imcasts uint64 Omcasts uint64 Iqdrops uint64 Noproto uint64 Hwassist uint64 Epoch int64 Lastchange Timeval } type IfaMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte Metric int32 } type IfmaMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte } type IfAnnounceMsghdr struct { Msglen uint16 Version uint8 Type uint8 Index uint16 Name [16]int8 What uint16 } type RtMsghdr struct { Msglen uint16 Version uint8 Type uint8 Index uint16 Pad_cgo_0 [2]byte Flags int32 Addrs int32 Pid int32 Seq int32 Errno int32 Fmask int32 Inits uint64 Rmx RtMetrics } type RtMetrics struct { Locks uint64 Mtu uint64 Hopcount uint64 Expire uint64 Recvpipe uint64 Sendpipe uint64 Ssthresh uint64 Rtt uint64 Rttvar uint64 Pksent uint64 Weight uint64 Filler [3]uint64 } const ( SizeofBpfVersion = 0x4 SizeofBpfStat = 0x8 SizeofBpfZbuf = 0x18 SizeofBpfProgram = 0x10 SizeofBpfInsn = 0x8 SizeofBpfHdr = 0x20 SizeofBpfZbufHeader = 0x20 ) type BpfVersion struct { Major uint16 Minor uint16 } type BpfStat struct { Recv uint32 Drop uint32 } type BpfZbuf struct { Bufa *byte Bufb *byte Buflen uint64 } type BpfProgram struct { Len uint32 Pad_cgo_0 [4]byte Insns *BpfInsn } type BpfInsn struct { Code uint16 Jt uint8 Jf uint8 K uint32 } type BpfHdr struct { Tstamp Timeval Caplen uint32 Datalen uint32 Hdrlen uint16 Pad_cgo_0 [6]byte } type BpfZbufHeader struct { Kernel_gen uint32 Kernel_len uint32 User_gen uint32 X_bzh_pad [5]uint32 } type Termios struct { Iflag uint32 Oflag uint32 Cflag uint32 Lflag uint32 Cc [20]uint8 Ispeed uint32 Ospeed uint32 } type Winsize struct { Row uint16 Col uint16 Xpixel uint16 Ypixel uint16 } const ( AT_FDCWD = -0x64 AT_REMOVEDIR = 0x800 AT_SYMLINK_FOLLOW = 0x400 AT_SYMLINK_NOFOLLOW = 0x200 ) type PollFd struct { Fd int32 Events int16 Revents int16 } const ( POLLERR = 0x8 POLLHUP = 0x10 POLLIN = 0x1 POLLINIGNEOF = 0x2000 POLLNVAL = 0x20 POLLOUT = 0x4 POLLPRI = 0x2 POLLRDBAND = 0x80 POLLRDNORM = 0x40 POLLWRBAND = 0x100 POLLWRNORM = 0x4 ) type CapRights struct { Rights [2]uint64 } ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go ================================================ // cgo -godefs -- -fsigned-char types_freebsd.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build arm,freebsd package unix const ( sizeofPtr = 0x4 sizeofShort = 0x2 sizeofInt = 0x4 sizeofLong = 0x4 sizeofLongLong = 0x8 ) type ( _C_short int16 _C_int int32 _C_long int32 _C_long_long int64 ) type Timespec struct { Sec int64 Nsec int32 Pad_cgo_0 [4]byte } type Timeval struct { Sec int64 Usec int32 Pad_cgo_0 [4]byte } type Rusage struct { Utime Timeval Stime Timeval Maxrss int32 Ixrss int32 Idrss int32 Isrss int32 Minflt int32 Majflt int32 Nswap int32 Inblock int32 Oublock int32 Msgsnd int32 Msgrcv int32 Nsignals int32 Nvcsw int32 Nivcsw int32 } type Rlimit struct { Cur int64 Max int64 } type _Gid_t uint32 const ( S_IFMT = 0xf000 S_IFIFO = 0x1000 S_IFCHR = 0x2000 S_IFDIR = 0x4000 S_IFBLK = 0x6000 S_IFREG = 0x8000 S_IFLNK = 0xa000 S_IFSOCK = 0xc000 S_ISUID = 0x800 S_ISGID = 0x400 S_ISVTX = 0x200 S_IRUSR = 0x100 S_IWUSR = 0x80 S_IXUSR = 0x40 ) type Stat_t struct { Dev uint32 Ino uint32 Mode uint16 Nlink uint16 Uid uint32 Gid uint32 Rdev uint32 Atimespec Timespec Mtimespec Timespec Ctimespec Timespec Size int64 Blocks int64 Blksize int32 Flags uint32 Gen uint32 Lspare int32 Birthtimespec Timespec } type Statfs_t struct { Version uint32 Type uint32 Flags uint64 Bsize uint64 Iosize uint64 Blocks uint64 Bfree uint64 Bavail int64 Files uint64 Ffree int64 Syncwrites uint64 Asyncwrites uint64 Syncreads uint64 Asyncreads uint64 Spare [10]uint64 Namemax uint32 Owner uint32 Fsid Fsid Charspare [80]int8 Fstypename [16]int8 Mntfromname [88]int8 Mntonname [88]int8 } type Flock_t struct { Start int64 Len int64 Pid int32 Type int16 Whence int16 Sysid int32 Pad_cgo_0 [4]byte } type Dirent struct { Fileno uint32 Reclen uint16 Type uint8 Namlen uint8 Name [256]int8 } type Fsid struct { Val [2]int32 } const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 FADV_SEQUENTIAL = 0x2 FADV_WILLNEED = 0x3 FADV_DONTNEED = 0x4 FADV_NOREUSE = 0x5 ) type RawSockaddrInet4 struct { Len uint8 Family uint8 Port uint16 Addr [4]byte /* in_addr */ Zero [8]int8 } type RawSockaddrInet6 struct { Len uint8 Family uint8 Port uint16 Flowinfo uint32 Addr [16]byte /* in6_addr */ Scope_id uint32 } type RawSockaddrUnix struct { Len uint8 Family uint8 Path [104]int8 } type RawSockaddrDatalink struct { Len uint8 Family uint8 Index uint16 Type uint8 Nlen uint8 Alen uint8 Slen uint8 Data [46]int8 } type RawSockaddr struct { Len uint8 Family uint8 Data [14]int8 } type RawSockaddrAny struct { Addr RawSockaddr Pad [92]int8 } type _Socklen uint32 type Linger struct { Onoff int32 Linger int32 } type Iovec struct { Base *byte Len uint32 } type IPMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } type IPMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } type IPv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } type Msghdr struct { Name *byte Namelen uint32 Iov *Iovec Iovlen int32 Control *byte Controllen uint32 Flags int32 } type Cmsghdr struct { Len uint32 Level int32 Type int32 } type Inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } type IPv6MTUInfo struct { Addr RawSockaddrInet6 Mtu uint32 } type ICMPv6Filter struct { Filt [8]uint32 } const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c SizeofSockaddrAny = 0x6c SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x36 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 SizeofMsghdr = 0x1c SizeofCmsghdr = 0xc SizeofInet6Pktinfo = 0x14 SizeofIPv6MTUInfo = 0x20 SizeofICMPv6Filter = 0x20 ) const ( PTRACE_TRACEME = 0x0 PTRACE_CONT = 0x7 PTRACE_KILL = 0x8 ) type Kevent_t struct { Ident uint32 Filter int16 Flags uint16 Fflags uint32 Data int32 Udata *byte } type FdSet struct { X__fds_bits [32]uint32 } const ( sizeofIfMsghdr = 0xa8 SizeofIfMsghdr = 0x70 sizeofIfData = 0x98 SizeofIfData = 0x60 SizeofIfaMsghdr = 0x14 SizeofIfmaMsghdr = 0x10 SizeofIfAnnounceMsghdr = 0x18 SizeofRtMsghdr = 0x5c SizeofRtMetrics = 0x38 ) type ifMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte Data ifData } type IfMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte Data IfData } type ifData struct { Type uint8 Physical uint8 Addrlen uint8 Hdrlen uint8 Link_state uint8 Vhid uint8 Datalen uint16 Mtu uint32 Metric uint32 Baudrate uint64 Ipackets uint64 Ierrors uint64 Opackets uint64 Oerrors uint64 Collisions uint64 Ibytes uint64 Obytes uint64 Imcasts uint64 Omcasts uint64 Iqdrops uint64 Oqdrops uint64 Noproto uint64 Hwassist uint64 X__ifi_epoch [8]byte X__ifi_lastchange [16]byte } type IfData struct { Type uint8 Physical uint8 Addrlen uint8 Hdrlen uint8 Link_state uint8 Spare_char1 uint8 Spare_char2 uint8 Datalen uint8 Mtu uint32 Metric uint32 Baudrate uint32 Ipackets uint32 Ierrors uint32 Opackets uint32 Oerrors uint32 Collisions uint32 Ibytes uint32 Obytes uint32 Imcasts uint32 Omcasts uint32 Iqdrops uint32 Noproto uint32 Hwassist uint32 Pad_cgo_0 [4]byte Epoch int64 Lastchange Timeval } type IfaMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte Metric int32 } type IfmaMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte } type IfAnnounceMsghdr struct { Msglen uint16 Version uint8 Type uint8 Index uint16 Name [16]int8 What uint16 } type RtMsghdr struct { Msglen uint16 Version uint8 Type uint8 Index uint16 Pad_cgo_0 [2]byte Flags int32 Addrs int32 Pid int32 Seq int32 Errno int32 Fmask int32 Inits uint32 Rmx RtMetrics } type RtMetrics struct { Locks uint32 Mtu uint32 Hopcount uint32 Expire uint32 Recvpipe uint32 Sendpipe uint32 Ssthresh uint32 Rtt uint32 Rttvar uint32 Pksent uint32 Weight uint32 Filler [3]uint32 } const ( SizeofBpfVersion = 0x4 SizeofBpfStat = 0x8 SizeofBpfZbuf = 0xc SizeofBpfProgram = 0x8 SizeofBpfInsn = 0x8 SizeofBpfHdr = 0x20 SizeofBpfZbufHeader = 0x20 ) type BpfVersion struct { Major uint16 Minor uint16 } type BpfStat struct { Recv uint32 Drop uint32 } type BpfZbuf struct { Bufa *byte Bufb *byte Buflen uint32 } type BpfProgram struct { Len uint32 Insns *BpfInsn } type BpfInsn struct { Code uint16 Jt uint8 Jf uint8 K uint32 } type BpfHdr struct { Tstamp Timeval Caplen uint32 Datalen uint32 Hdrlen uint16 Pad_cgo_0 [6]byte } type BpfZbufHeader struct { Kernel_gen uint32 Kernel_len uint32 User_gen uint32 X_bzh_pad [5]uint32 } type Termios struct { Iflag uint32 Oflag uint32 Cflag uint32 Lflag uint32 Cc [20]uint8 Ispeed uint32 Ospeed uint32 } type Winsize struct { Row uint16 Col uint16 Xpixel uint16 Ypixel uint16 } const ( AT_FDCWD = -0x64 AT_REMOVEDIR = 0x800 AT_SYMLINK_FOLLOW = 0x400 AT_SYMLINK_NOFOLLOW = 0x200 ) type PollFd struct { Fd int32 Events int16 Revents int16 } const ( POLLERR = 0x8 POLLHUP = 0x10 POLLIN = 0x1 POLLINIGNEOF = 0x2000 POLLNVAL = 0x20 POLLOUT = 0x4 POLLPRI = 0x2 POLLRDBAND = 0x80 POLLRDNORM = 0x40 POLLWRBAND = 0x100 POLLWRNORM = 0x4 ) type CapRights struct { Rights [2]uint64 } ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_linux_386.go ================================================ // cgo -godefs -- -Wall -Werror -static -I/tmp/include -m32 linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build 386,linux package unix const ( sizeofPtr = 0x4 sizeofShort = 0x2 sizeofInt = 0x4 sizeofLong = 0x4 sizeofLongLong = 0x8 PathMax = 0x1000 ) type ( _C_short int16 _C_int int32 _C_long int32 _C_long_long int64 ) type Timespec struct { Sec int32 Nsec int32 } type Timeval struct { Sec int32 Usec int32 } type Timex struct { Modes uint32 Offset int32 Freq int32 Maxerror int32 Esterror int32 Status int32 Constant int32 Precision int32 Tolerance int32 Time Timeval Tick int32 Ppsfreq int32 Jitter int32 Shift int32 Stabil int32 Jitcnt int32 Calcnt int32 Errcnt int32 Stbcnt int32 Tai int32 Pad_cgo_0 [44]byte } type Time_t int32 type Tms struct { Utime int32 Stime int32 Cutime int32 Cstime int32 } type Utimbuf struct { Actime int32 Modtime int32 } type Rusage struct { Utime Timeval Stime Timeval Maxrss int32 Ixrss int32 Idrss int32 Isrss int32 Minflt int32 Majflt int32 Nswap int32 Inblock int32 Oublock int32 Msgsnd int32 Msgrcv int32 Nsignals int32 Nvcsw int32 Nivcsw int32 } type Rlimit struct { Cur uint64 Max uint64 } type _Gid_t uint32 type Stat_t struct { Dev uint64 X__pad1 uint16 Pad_cgo_0 [2]byte X__st_ino uint32 Mode uint32 Nlink uint32 Uid uint32 Gid uint32 Rdev uint64 X__pad2 uint16 Pad_cgo_1 [2]byte Size int64 Blksize int32 Blocks int64 Atim Timespec Mtim Timespec Ctim Timespec Ino uint64 } type Statfs_t struct { Type int32 Bsize int32 Blocks uint64 Bfree uint64 Bavail uint64 Files uint64 Ffree uint64 Fsid Fsid Namelen int32 Frsize int32 Flags int32 Spare [4]int32 } type Dirent struct { Ino uint64 Off int64 Reclen uint16 Type uint8 Name [256]int8 Pad_cgo_0 [1]byte } type Fsid struct { X__val [2]int32 } type Flock_t struct { Type int16 Whence int16 Start int64 Len int64 Pid int32 } type FscryptPolicy struct { Version uint8 Contents_encryption_mode uint8 Filenames_encryption_mode uint8 Flags uint8 Master_key_descriptor [8]uint8 } type FscryptKey struct { Mode uint32 Raw [64]uint8 Size uint32 } type KeyctlDHParams struct { Private int32 Prime int32 Base int32 } const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 FADV_SEQUENTIAL = 0x2 FADV_WILLNEED = 0x3 FADV_DONTNEED = 0x4 FADV_NOREUSE = 0x5 ) type RawSockaddrInet4 struct { Family uint16 Port uint16 Addr [4]byte /* in_addr */ Zero [8]uint8 } type RawSockaddrInet6 struct { Family uint16 Port uint16 Flowinfo uint32 Addr [16]byte /* in6_addr */ Scope_id uint32 } type RawSockaddrUnix struct { Family uint16 Path [108]int8 } type RawSockaddrLinklayer struct { Family uint16 Protocol uint16 Ifindex int32 Hatype uint16 Pkttype uint8 Halen uint8 Addr [8]uint8 } type RawSockaddrNetlink struct { Family uint16 Pad uint16 Pid uint32 Groups uint32 } type RawSockaddrHCI struct { Family uint16 Dev uint16 Channel uint16 } type RawSockaddrCAN struct { Family uint16 Pad_cgo_0 [2]byte Ifindex int32 Addr [8]byte } type RawSockaddrALG struct { Family uint16 Type [14]uint8 Feat uint32 Mask uint32 Name [64]uint8 } type RawSockaddrVM struct { Family uint16 Reserved1 uint16 Port uint32 Cid uint32 Zero [4]uint8 } type RawSockaddr struct { Family uint16 Data [14]int8 } type RawSockaddrAny struct { Addr RawSockaddr Pad [96]int8 } type _Socklen uint32 type Linger struct { Onoff int32 Linger int32 } type Iovec struct { Base *byte Len uint32 } type IPMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } type IPMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } type IPv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } type PacketMreq struct { Ifindex int32 Type uint16 Alen uint16 Address [8]uint8 } type Msghdr struct { Name *byte Namelen uint32 Iov *Iovec Iovlen uint32 Control *byte Controllen uint32 Flags int32 } type Cmsghdr struct { Len uint32 Level int32 Type int32 } type Inet4Pktinfo struct { Ifindex int32 Spec_dst [4]byte /* in_addr */ Addr [4]byte /* in_addr */ } type Inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } type IPv6MTUInfo struct { Addr RawSockaddrInet6 Mtu uint32 } type ICMPv6Filter struct { Data [8]uint32 } type Ucred struct { Pid int32 Uid uint32 Gid uint32 } type TCPInfo struct { State uint8 Ca_state uint8 Retransmits uint8 Probes uint8 Backoff uint8 Options uint8 Pad_cgo_0 [2]byte Rto uint32 Ato uint32 Snd_mss uint32 Rcv_mss uint32 Unacked uint32 Sacked uint32 Lost uint32 Retrans uint32 Fackets uint32 Last_data_sent uint32 Last_ack_sent uint32 Last_data_recv uint32 Last_ack_recv uint32 Pmtu uint32 Rcv_ssthresh uint32 Rtt uint32 Rttvar uint32 Snd_ssthresh uint32 Snd_cwnd uint32 Advmss uint32 Reordering uint32 Rcv_rtt uint32 Rcv_space uint32 Total_retrans uint32 } const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c SizeofSockaddrAny = 0x70 SizeofSockaddrUnix = 0x6e SizeofSockaddrLinklayer = 0x14 SizeofSockaddrNetlink = 0xc SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 SizeofPacketMreq = 0x10 SizeofMsghdr = 0x1c SizeofCmsghdr = 0xc SizeofInet4Pktinfo = 0xc SizeofInet6Pktinfo = 0x14 SizeofIPv6MTUInfo = 0x20 SizeofICMPv6Filter = 0x20 SizeofUcred = 0xc SizeofTCPInfo = 0x68 ) const ( IFA_UNSPEC = 0x0 IFA_ADDRESS = 0x1 IFA_LOCAL = 0x2 IFA_LABEL = 0x3 IFA_BROADCAST = 0x4 IFA_ANYCAST = 0x5 IFA_CACHEINFO = 0x6 IFA_MULTICAST = 0x7 IFLA_UNSPEC = 0x0 IFLA_ADDRESS = 0x1 IFLA_BROADCAST = 0x2 IFLA_IFNAME = 0x3 IFLA_MTU = 0x4 IFLA_LINK = 0x5 IFLA_QDISC = 0x6 IFLA_STATS = 0x7 IFLA_COST = 0x8 IFLA_PRIORITY = 0x9 IFLA_MASTER = 0xa IFLA_WIRELESS = 0xb IFLA_PROTINFO = 0xc IFLA_TXQLEN = 0xd IFLA_MAP = 0xe IFLA_WEIGHT = 0xf IFLA_OPERSTATE = 0x10 IFLA_LINKMODE = 0x11 IFLA_LINKINFO = 0x12 IFLA_NET_NS_PID = 0x13 IFLA_IFALIAS = 0x14 IFLA_MAX = 0x2c RT_SCOPE_UNIVERSE = 0x0 RT_SCOPE_SITE = 0xc8 RT_SCOPE_LINK = 0xfd RT_SCOPE_HOST = 0xfe RT_SCOPE_NOWHERE = 0xff RT_TABLE_UNSPEC = 0x0 RT_TABLE_COMPAT = 0xfc RT_TABLE_DEFAULT = 0xfd RT_TABLE_MAIN = 0xfe RT_TABLE_LOCAL = 0xff RT_TABLE_MAX = 0xffffffff RTA_UNSPEC = 0x0 RTA_DST = 0x1 RTA_SRC = 0x2 RTA_IIF = 0x3 RTA_OIF = 0x4 RTA_GATEWAY = 0x5 RTA_PRIORITY = 0x6 RTA_PREFSRC = 0x7 RTA_METRICS = 0x8 RTA_MULTIPATH = 0x9 RTA_FLOW = 0xb RTA_CACHEINFO = 0xc RTA_TABLE = 0xf RTN_UNSPEC = 0x0 RTN_UNICAST = 0x1 RTN_LOCAL = 0x2 RTN_BROADCAST = 0x3 RTN_ANYCAST = 0x4 RTN_MULTICAST = 0x5 RTN_BLACKHOLE = 0x6 RTN_UNREACHABLE = 0x7 RTN_PROHIBIT = 0x8 RTN_THROW = 0x9 RTN_NAT = 0xa RTN_XRESOLVE = 0xb RTNLGRP_NONE = 0x0 RTNLGRP_LINK = 0x1 RTNLGRP_NOTIFY = 0x2 RTNLGRP_NEIGH = 0x3 RTNLGRP_TC = 0x4 RTNLGRP_IPV4_IFADDR = 0x5 RTNLGRP_IPV4_MROUTE = 0x6 RTNLGRP_IPV4_ROUTE = 0x7 RTNLGRP_IPV4_RULE = 0x8 RTNLGRP_IPV6_IFADDR = 0x9 RTNLGRP_IPV6_MROUTE = 0xa RTNLGRP_IPV6_ROUTE = 0xb RTNLGRP_IPV6_IFINFO = 0xc RTNLGRP_IPV6_PREFIX = 0x12 RTNLGRP_IPV6_RULE = 0x13 RTNLGRP_ND_USEROPT = 0x14 SizeofNlMsghdr = 0x10 SizeofNlMsgerr = 0x14 SizeofRtGenmsg = 0x1 SizeofNlAttr = 0x4 SizeofRtAttr = 0x4 SizeofIfInfomsg = 0x10 SizeofIfAddrmsg = 0x8 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 ) type NlMsghdr struct { Len uint32 Type uint16 Flags uint16 Seq uint32 Pid uint32 } type NlMsgerr struct { Error int32 Msg NlMsghdr } type RtGenmsg struct { Family uint8 } type NlAttr struct { Len uint16 Type uint16 } type RtAttr struct { Len uint16 Type uint16 } type IfInfomsg struct { Family uint8 X__ifi_pad uint8 Type uint16 Index int32 Flags uint32 Change uint32 } type IfAddrmsg struct { Family uint8 Prefixlen uint8 Flags uint8 Scope uint8 Index uint32 } type RtMsg struct { Family uint8 Dst_len uint8 Src_len uint8 Tos uint8 Table uint8 Protocol uint8 Scope uint8 Type uint8 Flags uint32 } type RtNexthop struct { Len uint16 Flags uint8 Hops uint8 Ifindex int32 } const ( SizeofSockFilter = 0x8 SizeofSockFprog = 0x8 ) type SockFilter struct { Code uint16 Jt uint8 Jf uint8 K uint32 } type SockFprog struct { Len uint16 Pad_cgo_0 [2]byte Filter *SockFilter } type InotifyEvent struct { Wd int32 Mask uint32 Cookie uint32 Len uint32 } const SizeofInotifyEvent = 0x10 type PtraceRegs struct { Ebx int32 Ecx int32 Edx int32 Esi int32 Edi int32 Ebp int32 Eax int32 Xds int32 Xes int32 Xfs int32 Xgs int32 Orig_eax int32 Eip int32 Xcs int32 Eflags int32 Esp int32 Xss int32 } type FdSet struct { Bits [32]int32 } type Sysinfo_t struct { Uptime int32 Loads [3]uint32 Totalram uint32 Freeram uint32 Sharedram uint32 Bufferram uint32 Totalswap uint32 Freeswap uint32 Procs uint16 Pad uint16 Totalhigh uint32 Freehigh uint32 Unit uint32 X_f [8]int8 } type Utsname struct { Sysname [65]byte Nodename [65]byte Release [65]byte Version [65]byte Machine [65]byte Domainname [65]byte } type Ustat_t struct { Tfree int32 Tinode uint32 Fname [6]int8 Fpack [6]int8 } type EpollEvent struct { Events uint32 Fd int32 Pad int32 } const ( AT_FDCWD = -0x64 AT_REMOVEDIR = 0x200 AT_SYMLINK_FOLLOW = 0x400 AT_SYMLINK_NOFOLLOW = 0x100 ) type PollFd struct { Fd int32 Events int16 Revents int16 } const ( POLLIN = 0x1 POLLPRI = 0x2 POLLOUT = 0x4 POLLRDHUP = 0x2000 POLLERR = 0x8 POLLHUP = 0x10 POLLNVAL = 0x20 ) type Sigset_t struct { X__val [32]uint32 } const RNDGETENTCNT = 0x80045200 const PERF_IOC_FLAG_GROUP = 0x1 type Termios struct { Iflag uint32 Oflag uint32 Cflag uint32 Lflag uint32 Line uint8 Cc [19]uint8 Ispeed uint32 Ospeed uint32 } type Winsize struct { Row uint16 Col uint16 Xpixel uint16 Ypixel uint16 } type Taskstats struct { Version uint16 Pad_cgo_0 [2]byte Ac_exitcode uint32 Ac_flag uint8 Ac_nice uint8 Pad_cgo_1 [6]byte Cpu_count uint64 Cpu_delay_total uint64 Blkio_count uint64 Blkio_delay_total uint64 Swapin_count uint64 Swapin_delay_total uint64 Cpu_run_real_total uint64 Cpu_run_virtual_total uint64 Ac_comm [32]int8 Ac_sched uint8 Ac_pad [3]uint8 Pad_cgo_2 [4]byte Ac_uid uint32 Ac_gid uint32 Ac_pid uint32 Ac_ppid uint32 Ac_btime uint32 Pad_cgo_3 [4]byte Ac_etime uint64 Ac_utime uint64 Ac_stime uint64 Ac_minflt uint64 Ac_majflt uint64 Coremem uint64 Virtmem uint64 Hiwater_rss uint64 Hiwater_vm uint64 Read_char uint64 Write_char uint64 Read_syscalls uint64 Write_syscalls uint64 Read_bytes uint64 Write_bytes uint64 Cancelled_write_bytes uint64 Nvcsw uint64 Nivcsw uint64 Ac_utimescaled uint64 Ac_stimescaled uint64 Cpu_scaled_run_real_total uint64 Freepages_count uint64 Freepages_delay_total uint64 } const ( TASKSTATS_CMD_UNSPEC = 0x0 TASKSTATS_CMD_GET = 0x1 TASKSTATS_CMD_NEW = 0x2 TASKSTATS_TYPE_UNSPEC = 0x0 TASKSTATS_TYPE_PID = 0x1 TASKSTATS_TYPE_TGID = 0x2 TASKSTATS_TYPE_STATS = 0x3 TASKSTATS_TYPE_AGGR_PID = 0x4 TASKSTATS_TYPE_AGGR_TGID = 0x5 TASKSTATS_TYPE_NULL = 0x6 TASKSTATS_CMD_ATTR_UNSPEC = 0x0 TASKSTATS_CMD_ATTR_PID = 0x1 TASKSTATS_CMD_ATTR_TGID = 0x2 TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 ) type Genlmsghdr struct { Cmd uint8 Version uint8 Reserved uint16 } const ( CTRL_CMD_UNSPEC = 0x0 CTRL_CMD_NEWFAMILY = 0x1 CTRL_CMD_DELFAMILY = 0x2 CTRL_CMD_GETFAMILY = 0x3 CTRL_CMD_NEWOPS = 0x4 CTRL_CMD_DELOPS = 0x5 CTRL_CMD_GETOPS = 0x6 CTRL_CMD_NEWMCAST_GRP = 0x7 CTRL_CMD_DELMCAST_GRP = 0x8 CTRL_CMD_GETMCAST_GRP = 0x9 CTRL_ATTR_UNSPEC = 0x0 CTRL_ATTR_FAMILY_ID = 0x1 CTRL_ATTR_FAMILY_NAME = 0x2 CTRL_ATTR_VERSION = 0x3 CTRL_ATTR_HDRSIZE = 0x4 CTRL_ATTR_MAXATTR = 0x5 CTRL_ATTR_OPS = 0x6 CTRL_ATTR_MCAST_GROUPS = 0x7 CTRL_ATTR_OP_UNSPEC = 0x0 CTRL_ATTR_OP_ID = 0x1 CTRL_ATTR_OP_FLAGS = 0x2 CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 CTRL_ATTR_MCAST_GRP_NAME = 0x1 CTRL_ATTR_MCAST_GRP_ID = 0x2 ) ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go ================================================ // cgo -godefs -- -Wall -Werror -static -I/tmp/include -m64 linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,linux package unix const ( sizeofPtr = 0x8 sizeofShort = 0x2 sizeofInt = 0x4 sizeofLong = 0x8 sizeofLongLong = 0x8 PathMax = 0x1000 ) type ( _C_short int16 _C_int int32 _C_long int64 _C_long_long int64 ) type Timespec struct { Sec int64 Nsec int64 } type Timeval struct { Sec int64 Usec int64 } type Timex struct { Modes uint32 Pad_cgo_0 [4]byte Offset int64 Freq int64 Maxerror int64 Esterror int64 Status int32 Pad_cgo_1 [4]byte Constant int64 Precision int64 Tolerance int64 Time Timeval Tick int64 Ppsfreq int64 Jitter int64 Shift int32 Pad_cgo_2 [4]byte Stabil int64 Jitcnt int64 Calcnt int64 Errcnt int64 Stbcnt int64 Tai int32 Pad_cgo_3 [44]byte } type Time_t int64 type Tms struct { Utime int64 Stime int64 Cutime int64 Cstime int64 } type Utimbuf struct { Actime int64 Modtime int64 } type Rusage struct { Utime Timeval Stime Timeval Maxrss int64 Ixrss int64 Idrss int64 Isrss int64 Minflt int64 Majflt int64 Nswap int64 Inblock int64 Oublock int64 Msgsnd int64 Msgrcv int64 Nsignals int64 Nvcsw int64 Nivcsw int64 } type Rlimit struct { Cur uint64 Max uint64 } type _Gid_t uint32 type Stat_t struct { Dev uint64 Ino uint64 Nlink uint64 Mode uint32 Uid uint32 Gid uint32 X__pad0 int32 Rdev uint64 Size int64 Blksize int64 Blocks int64 Atim Timespec Mtim Timespec Ctim Timespec _ [3]int64 } type Statfs_t struct { Type int64 Bsize int64 Blocks uint64 Bfree uint64 Bavail uint64 Files uint64 Ffree uint64 Fsid Fsid Namelen int64 Frsize int64 Flags int64 Spare [4]int64 } type Dirent struct { Ino uint64 Off int64 Reclen uint16 Type uint8 Name [256]int8 Pad_cgo_0 [5]byte } type Fsid struct { X__val [2]int32 } type Flock_t struct { Type int16 Whence int16 Pad_cgo_0 [4]byte Start int64 Len int64 Pid int32 Pad_cgo_1 [4]byte } type FscryptPolicy struct { Version uint8 Contents_encryption_mode uint8 Filenames_encryption_mode uint8 Flags uint8 Master_key_descriptor [8]uint8 } type FscryptKey struct { Mode uint32 Raw [64]uint8 Size uint32 } type KeyctlDHParams struct { Private int32 Prime int32 Base int32 } const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 FADV_SEQUENTIAL = 0x2 FADV_WILLNEED = 0x3 FADV_DONTNEED = 0x4 FADV_NOREUSE = 0x5 ) type RawSockaddrInet4 struct { Family uint16 Port uint16 Addr [4]byte /* in_addr */ Zero [8]uint8 } type RawSockaddrInet6 struct { Family uint16 Port uint16 Flowinfo uint32 Addr [16]byte /* in6_addr */ Scope_id uint32 } type RawSockaddrUnix struct { Family uint16 Path [108]int8 } type RawSockaddrLinklayer struct { Family uint16 Protocol uint16 Ifindex int32 Hatype uint16 Pkttype uint8 Halen uint8 Addr [8]uint8 } type RawSockaddrNetlink struct { Family uint16 Pad uint16 Pid uint32 Groups uint32 } type RawSockaddrHCI struct { Family uint16 Dev uint16 Channel uint16 } type RawSockaddrCAN struct { Family uint16 Pad_cgo_0 [2]byte Ifindex int32 Addr [8]byte } type RawSockaddrALG struct { Family uint16 Type [14]uint8 Feat uint32 Mask uint32 Name [64]uint8 } type RawSockaddrVM struct { Family uint16 Reserved1 uint16 Port uint32 Cid uint32 Zero [4]uint8 } type RawSockaddr struct { Family uint16 Data [14]int8 } type RawSockaddrAny struct { Addr RawSockaddr Pad [96]int8 } type _Socklen uint32 type Linger struct { Onoff int32 Linger int32 } type Iovec struct { Base *byte Len uint64 } type IPMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } type IPMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } type IPv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } type PacketMreq struct { Ifindex int32 Type uint16 Alen uint16 Address [8]uint8 } type Msghdr struct { Name *byte Namelen uint32 Pad_cgo_0 [4]byte Iov *Iovec Iovlen uint64 Control *byte Controllen uint64 Flags int32 Pad_cgo_1 [4]byte } type Cmsghdr struct { Len uint64 Level int32 Type int32 } type Inet4Pktinfo struct { Ifindex int32 Spec_dst [4]byte /* in_addr */ Addr [4]byte /* in_addr */ } type Inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } type IPv6MTUInfo struct { Addr RawSockaddrInet6 Mtu uint32 } type ICMPv6Filter struct { Data [8]uint32 } type Ucred struct { Pid int32 Uid uint32 Gid uint32 } type TCPInfo struct { State uint8 Ca_state uint8 Retransmits uint8 Probes uint8 Backoff uint8 Options uint8 Pad_cgo_0 [2]byte Rto uint32 Ato uint32 Snd_mss uint32 Rcv_mss uint32 Unacked uint32 Sacked uint32 Lost uint32 Retrans uint32 Fackets uint32 Last_data_sent uint32 Last_ack_sent uint32 Last_data_recv uint32 Last_ack_recv uint32 Pmtu uint32 Rcv_ssthresh uint32 Rtt uint32 Rttvar uint32 Snd_ssthresh uint32 Snd_cwnd uint32 Advmss uint32 Reordering uint32 Rcv_rtt uint32 Rcv_space uint32 Total_retrans uint32 } const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c SizeofSockaddrAny = 0x70 SizeofSockaddrUnix = 0x6e SizeofSockaddrLinklayer = 0x14 SizeofSockaddrNetlink = 0xc SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 SizeofPacketMreq = 0x10 SizeofMsghdr = 0x38 SizeofCmsghdr = 0x10 SizeofInet4Pktinfo = 0xc SizeofInet6Pktinfo = 0x14 SizeofIPv6MTUInfo = 0x20 SizeofICMPv6Filter = 0x20 SizeofUcred = 0xc SizeofTCPInfo = 0x68 ) const ( IFA_UNSPEC = 0x0 IFA_ADDRESS = 0x1 IFA_LOCAL = 0x2 IFA_LABEL = 0x3 IFA_BROADCAST = 0x4 IFA_ANYCAST = 0x5 IFA_CACHEINFO = 0x6 IFA_MULTICAST = 0x7 IFLA_UNSPEC = 0x0 IFLA_ADDRESS = 0x1 IFLA_BROADCAST = 0x2 IFLA_IFNAME = 0x3 IFLA_MTU = 0x4 IFLA_LINK = 0x5 IFLA_QDISC = 0x6 IFLA_STATS = 0x7 IFLA_COST = 0x8 IFLA_PRIORITY = 0x9 IFLA_MASTER = 0xa IFLA_WIRELESS = 0xb IFLA_PROTINFO = 0xc IFLA_TXQLEN = 0xd IFLA_MAP = 0xe IFLA_WEIGHT = 0xf IFLA_OPERSTATE = 0x10 IFLA_LINKMODE = 0x11 IFLA_LINKINFO = 0x12 IFLA_NET_NS_PID = 0x13 IFLA_IFALIAS = 0x14 IFLA_MAX = 0x2c RT_SCOPE_UNIVERSE = 0x0 RT_SCOPE_SITE = 0xc8 RT_SCOPE_LINK = 0xfd RT_SCOPE_HOST = 0xfe RT_SCOPE_NOWHERE = 0xff RT_TABLE_UNSPEC = 0x0 RT_TABLE_COMPAT = 0xfc RT_TABLE_DEFAULT = 0xfd RT_TABLE_MAIN = 0xfe RT_TABLE_LOCAL = 0xff RT_TABLE_MAX = 0xffffffff RTA_UNSPEC = 0x0 RTA_DST = 0x1 RTA_SRC = 0x2 RTA_IIF = 0x3 RTA_OIF = 0x4 RTA_GATEWAY = 0x5 RTA_PRIORITY = 0x6 RTA_PREFSRC = 0x7 RTA_METRICS = 0x8 RTA_MULTIPATH = 0x9 RTA_FLOW = 0xb RTA_CACHEINFO = 0xc RTA_TABLE = 0xf RTN_UNSPEC = 0x0 RTN_UNICAST = 0x1 RTN_LOCAL = 0x2 RTN_BROADCAST = 0x3 RTN_ANYCAST = 0x4 RTN_MULTICAST = 0x5 RTN_BLACKHOLE = 0x6 RTN_UNREACHABLE = 0x7 RTN_PROHIBIT = 0x8 RTN_THROW = 0x9 RTN_NAT = 0xa RTN_XRESOLVE = 0xb RTNLGRP_NONE = 0x0 RTNLGRP_LINK = 0x1 RTNLGRP_NOTIFY = 0x2 RTNLGRP_NEIGH = 0x3 RTNLGRP_TC = 0x4 RTNLGRP_IPV4_IFADDR = 0x5 RTNLGRP_IPV4_MROUTE = 0x6 RTNLGRP_IPV4_ROUTE = 0x7 RTNLGRP_IPV4_RULE = 0x8 RTNLGRP_IPV6_IFADDR = 0x9 RTNLGRP_IPV6_MROUTE = 0xa RTNLGRP_IPV6_ROUTE = 0xb RTNLGRP_IPV6_IFINFO = 0xc RTNLGRP_IPV6_PREFIX = 0x12 RTNLGRP_IPV6_RULE = 0x13 RTNLGRP_ND_USEROPT = 0x14 SizeofNlMsghdr = 0x10 SizeofNlMsgerr = 0x14 SizeofRtGenmsg = 0x1 SizeofNlAttr = 0x4 SizeofRtAttr = 0x4 SizeofIfInfomsg = 0x10 SizeofIfAddrmsg = 0x8 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 ) type NlMsghdr struct { Len uint32 Type uint16 Flags uint16 Seq uint32 Pid uint32 } type NlMsgerr struct { Error int32 Msg NlMsghdr } type RtGenmsg struct { Family uint8 } type NlAttr struct { Len uint16 Type uint16 } type RtAttr struct { Len uint16 Type uint16 } type IfInfomsg struct { Family uint8 X__ifi_pad uint8 Type uint16 Index int32 Flags uint32 Change uint32 } type IfAddrmsg struct { Family uint8 Prefixlen uint8 Flags uint8 Scope uint8 Index uint32 } type RtMsg struct { Family uint8 Dst_len uint8 Src_len uint8 Tos uint8 Table uint8 Protocol uint8 Scope uint8 Type uint8 Flags uint32 } type RtNexthop struct { Len uint16 Flags uint8 Hops uint8 Ifindex int32 } const ( SizeofSockFilter = 0x8 SizeofSockFprog = 0x10 ) type SockFilter struct { Code uint16 Jt uint8 Jf uint8 K uint32 } type SockFprog struct { Len uint16 Pad_cgo_0 [6]byte Filter *SockFilter } type InotifyEvent struct { Wd int32 Mask uint32 Cookie uint32 Len uint32 } const SizeofInotifyEvent = 0x10 type PtraceRegs struct { R15 uint64 R14 uint64 R13 uint64 R12 uint64 Rbp uint64 Rbx uint64 R11 uint64 R10 uint64 R9 uint64 R8 uint64 Rax uint64 Rcx uint64 Rdx uint64 Rsi uint64 Rdi uint64 Orig_rax uint64 Rip uint64 Cs uint64 Eflags uint64 Rsp uint64 Ss uint64 Fs_base uint64 Gs_base uint64 Ds uint64 Es uint64 Fs uint64 Gs uint64 } type FdSet struct { Bits [16]int64 } type Sysinfo_t struct { Uptime int64 Loads [3]uint64 Totalram uint64 Freeram uint64 Sharedram uint64 Bufferram uint64 Totalswap uint64 Freeswap uint64 Procs uint16 Pad uint16 Pad_cgo_0 [4]byte Totalhigh uint64 Freehigh uint64 Unit uint32 X_f [0]int8 Pad_cgo_1 [4]byte } type Utsname struct { Sysname [65]byte Nodename [65]byte Release [65]byte Version [65]byte Machine [65]byte Domainname [65]byte } type Ustat_t struct { Tfree int32 Pad_cgo_0 [4]byte Tinode uint64 Fname [6]int8 Fpack [6]int8 Pad_cgo_1 [4]byte } type EpollEvent struct { Events uint32 Fd int32 Pad int32 } const ( AT_FDCWD = -0x64 AT_REMOVEDIR = 0x200 AT_SYMLINK_FOLLOW = 0x400 AT_SYMLINK_NOFOLLOW = 0x100 ) type PollFd struct { Fd int32 Events int16 Revents int16 } const ( POLLIN = 0x1 POLLPRI = 0x2 POLLOUT = 0x4 POLLRDHUP = 0x2000 POLLERR = 0x8 POLLHUP = 0x10 POLLNVAL = 0x20 ) type Sigset_t struct { X__val [16]uint64 } const RNDGETENTCNT = 0x80045200 const PERF_IOC_FLAG_GROUP = 0x1 type Termios struct { Iflag uint32 Oflag uint32 Cflag uint32 Lflag uint32 Line uint8 Cc [19]uint8 Ispeed uint32 Ospeed uint32 } type Winsize struct { Row uint16 Col uint16 Xpixel uint16 Ypixel uint16 } type Taskstats struct { Version uint16 Pad_cgo_0 [2]byte Ac_exitcode uint32 Ac_flag uint8 Ac_nice uint8 Pad_cgo_1 [6]byte Cpu_count uint64 Cpu_delay_total uint64 Blkio_count uint64 Blkio_delay_total uint64 Swapin_count uint64 Swapin_delay_total uint64 Cpu_run_real_total uint64 Cpu_run_virtual_total uint64 Ac_comm [32]int8 Ac_sched uint8 Ac_pad [3]uint8 Pad_cgo_2 [4]byte Ac_uid uint32 Ac_gid uint32 Ac_pid uint32 Ac_ppid uint32 Ac_btime uint32 Pad_cgo_3 [4]byte Ac_etime uint64 Ac_utime uint64 Ac_stime uint64 Ac_minflt uint64 Ac_majflt uint64 Coremem uint64 Virtmem uint64 Hiwater_rss uint64 Hiwater_vm uint64 Read_char uint64 Write_char uint64 Read_syscalls uint64 Write_syscalls uint64 Read_bytes uint64 Write_bytes uint64 Cancelled_write_bytes uint64 Nvcsw uint64 Nivcsw uint64 Ac_utimescaled uint64 Ac_stimescaled uint64 Cpu_scaled_run_real_total uint64 Freepages_count uint64 Freepages_delay_total uint64 } const ( TASKSTATS_CMD_UNSPEC = 0x0 TASKSTATS_CMD_GET = 0x1 TASKSTATS_CMD_NEW = 0x2 TASKSTATS_TYPE_UNSPEC = 0x0 TASKSTATS_TYPE_PID = 0x1 TASKSTATS_TYPE_TGID = 0x2 TASKSTATS_TYPE_STATS = 0x3 TASKSTATS_TYPE_AGGR_PID = 0x4 TASKSTATS_TYPE_AGGR_TGID = 0x5 TASKSTATS_TYPE_NULL = 0x6 TASKSTATS_CMD_ATTR_UNSPEC = 0x0 TASKSTATS_CMD_ATTR_PID = 0x1 TASKSTATS_CMD_ATTR_TGID = 0x2 TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 ) type Genlmsghdr struct { Cmd uint8 Version uint8 Reserved uint16 } const ( CTRL_CMD_UNSPEC = 0x0 CTRL_CMD_NEWFAMILY = 0x1 CTRL_CMD_DELFAMILY = 0x2 CTRL_CMD_GETFAMILY = 0x3 CTRL_CMD_NEWOPS = 0x4 CTRL_CMD_DELOPS = 0x5 CTRL_CMD_GETOPS = 0x6 CTRL_CMD_NEWMCAST_GRP = 0x7 CTRL_CMD_DELMCAST_GRP = 0x8 CTRL_CMD_GETMCAST_GRP = 0x9 CTRL_ATTR_UNSPEC = 0x0 CTRL_ATTR_FAMILY_ID = 0x1 CTRL_ATTR_FAMILY_NAME = 0x2 CTRL_ATTR_VERSION = 0x3 CTRL_ATTR_HDRSIZE = 0x4 CTRL_ATTR_MAXATTR = 0x5 CTRL_ATTR_OPS = 0x6 CTRL_ATTR_MCAST_GROUPS = 0x7 CTRL_ATTR_OP_UNSPEC = 0x0 CTRL_ATTR_OP_ID = 0x1 CTRL_ATTR_OP_FLAGS = 0x2 CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 CTRL_ATTR_MCAST_GRP_NAME = 0x1 CTRL_ATTR_MCAST_GRP_ID = 0x2 ) ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_linux_arm.go ================================================ // cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build arm,linux package unix const ( sizeofPtr = 0x4 sizeofShort = 0x2 sizeofInt = 0x4 sizeofLong = 0x4 sizeofLongLong = 0x8 PathMax = 0x1000 ) type ( _C_short int16 _C_int int32 _C_long int32 _C_long_long int64 ) type Timespec struct { Sec int32 Nsec int32 } type Timeval struct { Sec int32 Usec int32 } type Timex struct { Modes uint32 Offset int32 Freq int32 Maxerror int32 Esterror int32 Status int32 Constant int32 Precision int32 Tolerance int32 Time Timeval Tick int32 Ppsfreq int32 Jitter int32 Shift int32 Stabil int32 Jitcnt int32 Calcnt int32 Errcnt int32 Stbcnt int32 Tai int32 Pad_cgo_0 [44]byte } type Time_t int32 type Tms struct { Utime int32 Stime int32 Cutime int32 Cstime int32 } type Utimbuf struct { Actime int32 Modtime int32 } type Rusage struct { Utime Timeval Stime Timeval Maxrss int32 Ixrss int32 Idrss int32 Isrss int32 Minflt int32 Majflt int32 Nswap int32 Inblock int32 Oublock int32 Msgsnd int32 Msgrcv int32 Nsignals int32 Nvcsw int32 Nivcsw int32 } type Rlimit struct { Cur uint64 Max uint64 } type _Gid_t uint32 type Stat_t struct { Dev uint64 X__pad1 uint16 Pad_cgo_0 [2]byte X__st_ino uint32 Mode uint32 Nlink uint32 Uid uint32 Gid uint32 Rdev uint64 X__pad2 uint16 Pad_cgo_1 [6]byte Size int64 Blksize int32 Pad_cgo_2 [4]byte Blocks int64 Atim Timespec Mtim Timespec Ctim Timespec Ino uint64 } type Statfs_t struct { Type int32 Bsize int32 Blocks uint64 Bfree uint64 Bavail uint64 Files uint64 Ffree uint64 Fsid Fsid Namelen int32 Frsize int32 Flags int32 Spare [4]int32 Pad_cgo_0 [4]byte } type Dirent struct { Ino uint64 Off int64 Reclen uint16 Type uint8 Name [256]uint8 Pad_cgo_0 [5]byte } type Fsid struct { X__val [2]int32 } type Flock_t struct { Type int16 Whence int16 Pad_cgo_0 [4]byte Start int64 Len int64 Pid int32 Pad_cgo_1 [4]byte } type FscryptPolicy struct { Version uint8 Contents_encryption_mode uint8 Filenames_encryption_mode uint8 Flags uint8 Master_key_descriptor [8]uint8 } type FscryptKey struct { Mode uint32 Raw [64]uint8 Size uint32 } type KeyctlDHParams struct { Private int32 Prime int32 Base int32 } const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 FADV_SEQUENTIAL = 0x2 FADV_WILLNEED = 0x3 FADV_DONTNEED = 0x4 FADV_NOREUSE = 0x5 ) type RawSockaddrInet4 struct { Family uint16 Port uint16 Addr [4]byte /* in_addr */ Zero [8]uint8 } type RawSockaddrInet6 struct { Family uint16 Port uint16 Flowinfo uint32 Addr [16]byte /* in6_addr */ Scope_id uint32 } type RawSockaddrUnix struct { Family uint16 Path [108]int8 } type RawSockaddrLinklayer struct { Family uint16 Protocol uint16 Ifindex int32 Hatype uint16 Pkttype uint8 Halen uint8 Addr [8]uint8 } type RawSockaddrNetlink struct { Family uint16 Pad uint16 Pid uint32 Groups uint32 } type RawSockaddrHCI struct { Family uint16 Dev uint16 Channel uint16 } type RawSockaddrCAN struct { Family uint16 Pad_cgo_0 [2]byte Ifindex int32 Addr [8]byte } type RawSockaddrALG struct { Family uint16 Type [14]uint8 Feat uint32 Mask uint32 Name [64]uint8 } type RawSockaddrVM struct { Family uint16 Reserved1 uint16 Port uint32 Cid uint32 Zero [4]uint8 } type RawSockaddr struct { Family uint16 Data [14]uint8 } type RawSockaddrAny struct { Addr RawSockaddr Pad [96]uint8 } type _Socklen uint32 type Linger struct { Onoff int32 Linger int32 } type Iovec struct { Base *byte Len uint32 } type IPMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } type IPMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } type IPv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } type PacketMreq struct { Ifindex int32 Type uint16 Alen uint16 Address [8]uint8 } type Msghdr struct { Name *byte Namelen uint32 Iov *Iovec Iovlen uint32 Control *byte Controllen uint32 Flags int32 } type Cmsghdr struct { Len uint32 Level int32 Type int32 } type Inet4Pktinfo struct { Ifindex int32 Spec_dst [4]byte /* in_addr */ Addr [4]byte /* in_addr */ } type Inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } type IPv6MTUInfo struct { Addr RawSockaddrInet6 Mtu uint32 } type ICMPv6Filter struct { Data [8]uint32 } type Ucred struct { Pid int32 Uid uint32 Gid uint32 } type TCPInfo struct { State uint8 Ca_state uint8 Retransmits uint8 Probes uint8 Backoff uint8 Options uint8 Pad_cgo_0 [2]byte Rto uint32 Ato uint32 Snd_mss uint32 Rcv_mss uint32 Unacked uint32 Sacked uint32 Lost uint32 Retrans uint32 Fackets uint32 Last_data_sent uint32 Last_ack_sent uint32 Last_data_recv uint32 Last_ack_recv uint32 Pmtu uint32 Rcv_ssthresh uint32 Rtt uint32 Rttvar uint32 Snd_ssthresh uint32 Snd_cwnd uint32 Advmss uint32 Reordering uint32 Rcv_rtt uint32 Rcv_space uint32 Total_retrans uint32 } const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c SizeofSockaddrAny = 0x70 SizeofSockaddrUnix = 0x6e SizeofSockaddrLinklayer = 0x14 SizeofSockaddrNetlink = 0xc SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 SizeofPacketMreq = 0x10 SizeofMsghdr = 0x1c SizeofCmsghdr = 0xc SizeofInet4Pktinfo = 0xc SizeofInet6Pktinfo = 0x14 SizeofIPv6MTUInfo = 0x20 SizeofICMPv6Filter = 0x20 SizeofUcred = 0xc SizeofTCPInfo = 0x68 ) const ( IFA_UNSPEC = 0x0 IFA_ADDRESS = 0x1 IFA_LOCAL = 0x2 IFA_LABEL = 0x3 IFA_BROADCAST = 0x4 IFA_ANYCAST = 0x5 IFA_CACHEINFO = 0x6 IFA_MULTICAST = 0x7 IFLA_UNSPEC = 0x0 IFLA_ADDRESS = 0x1 IFLA_BROADCAST = 0x2 IFLA_IFNAME = 0x3 IFLA_MTU = 0x4 IFLA_LINK = 0x5 IFLA_QDISC = 0x6 IFLA_STATS = 0x7 IFLA_COST = 0x8 IFLA_PRIORITY = 0x9 IFLA_MASTER = 0xa IFLA_WIRELESS = 0xb IFLA_PROTINFO = 0xc IFLA_TXQLEN = 0xd IFLA_MAP = 0xe IFLA_WEIGHT = 0xf IFLA_OPERSTATE = 0x10 IFLA_LINKMODE = 0x11 IFLA_LINKINFO = 0x12 IFLA_NET_NS_PID = 0x13 IFLA_IFALIAS = 0x14 IFLA_MAX = 0x2c RT_SCOPE_UNIVERSE = 0x0 RT_SCOPE_SITE = 0xc8 RT_SCOPE_LINK = 0xfd RT_SCOPE_HOST = 0xfe RT_SCOPE_NOWHERE = 0xff RT_TABLE_UNSPEC = 0x0 RT_TABLE_COMPAT = 0xfc RT_TABLE_DEFAULT = 0xfd RT_TABLE_MAIN = 0xfe RT_TABLE_LOCAL = 0xff RT_TABLE_MAX = 0xffffffff RTA_UNSPEC = 0x0 RTA_DST = 0x1 RTA_SRC = 0x2 RTA_IIF = 0x3 RTA_OIF = 0x4 RTA_GATEWAY = 0x5 RTA_PRIORITY = 0x6 RTA_PREFSRC = 0x7 RTA_METRICS = 0x8 RTA_MULTIPATH = 0x9 RTA_FLOW = 0xb RTA_CACHEINFO = 0xc RTA_TABLE = 0xf RTN_UNSPEC = 0x0 RTN_UNICAST = 0x1 RTN_LOCAL = 0x2 RTN_BROADCAST = 0x3 RTN_ANYCAST = 0x4 RTN_MULTICAST = 0x5 RTN_BLACKHOLE = 0x6 RTN_UNREACHABLE = 0x7 RTN_PROHIBIT = 0x8 RTN_THROW = 0x9 RTN_NAT = 0xa RTN_XRESOLVE = 0xb RTNLGRP_NONE = 0x0 RTNLGRP_LINK = 0x1 RTNLGRP_NOTIFY = 0x2 RTNLGRP_NEIGH = 0x3 RTNLGRP_TC = 0x4 RTNLGRP_IPV4_IFADDR = 0x5 RTNLGRP_IPV4_MROUTE = 0x6 RTNLGRP_IPV4_ROUTE = 0x7 RTNLGRP_IPV4_RULE = 0x8 RTNLGRP_IPV6_IFADDR = 0x9 RTNLGRP_IPV6_MROUTE = 0xa RTNLGRP_IPV6_ROUTE = 0xb RTNLGRP_IPV6_IFINFO = 0xc RTNLGRP_IPV6_PREFIX = 0x12 RTNLGRP_IPV6_RULE = 0x13 RTNLGRP_ND_USEROPT = 0x14 SizeofNlMsghdr = 0x10 SizeofNlMsgerr = 0x14 SizeofRtGenmsg = 0x1 SizeofNlAttr = 0x4 SizeofRtAttr = 0x4 SizeofIfInfomsg = 0x10 SizeofIfAddrmsg = 0x8 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 ) type NlMsghdr struct { Len uint32 Type uint16 Flags uint16 Seq uint32 Pid uint32 } type NlMsgerr struct { Error int32 Msg NlMsghdr } type RtGenmsg struct { Family uint8 } type NlAttr struct { Len uint16 Type uint16 } type RtAttr struct { Len uint16 Type uint16 } type IfInfomsg struct { Family uint8 X__ifi_pad uint8 Type uint16 Index int32 Flags uint32 Change uint32 } type IfAddrmsg struct { Family uint8 Prefixlen uint8 Flags uint8 Scope uint8 Index uint32 } type RtMsg struct { Family uint8 Dst_len uint8 Src_len uint8 Tos uint8 Table uint8 Protocol uint8 Scope uint8 Type uint8 Flags uint32 } type RtNexthop struct { Len uint16 Flags uint8 Hops uint8 Ifindex int32 } const ( SizeofSockFilter = 0x8 SizeofSockFprog = 0x8 ) type SockFilter struct { Code uint16 Jt uint8 Jf uint8 K uint32 } type SockFprog struct { Len uint16 Pad_cgo_0 [2]byte Filter *SockFilter } type InotifyEvent struct { Wd int32 Mask uint32 Cookie uint32 Len uint32 } const SizeofInotifyEvent = 0x10 type PtraceRegs struct { Uregs [18]uint32 } type FdSet struct { Bits [32]int32 } type Sysinfo_t struct { Uptime int32 Loads [3]uint32 Totalram uint32 Freeram uint32 Sharedram uint32 Bufferram uint32 Totalswap uint32 Freeswap uint32 Procs uint16 Pad uint16 Totalhigh uint32 Freehigh uint32 Unit uint32 X_f [8]uint8 } type Utsname struct { Sysname [65]byte Nodename [65]byte Release [65]byte Version [65]byte Machine [65]byte Domainname [65]byte } type Ustat_t struct { Tfree int32 Tinode uint32 Fname [6]uint8 Fpack [6]uint8 } type EpollEvent struct { Events uint32 PadFd int32 Fd int32 Pad int32 } const ( AT_FDCWD = -0x64 AT_REMOVEDIR = 0x200 AT_SYMLINK_FOLLOW = 0x400 AT_SYMLINK_NOFOLLOW = 0x100 ) type PollFd struct { Fd int32 Events int16 Revents int16 } const ( POLLIN = 0x1 POLLPRI = 0x2 POLLOUT = 0x4 POLLRDHUP = 0x2000 POLLERR = 0x8 POLLHUP = 0x10 POLLNVAL = 0x20 ) type Sigset_t struct { X__val [32]uint32 } const RNDGETENTCNT = 0x80045200 const PERF_IOC_FLAG_GROUP = 0x1 type Termios struct { Iflag uint32 Oflag uint32 Cflag uint32 Lflag uint32 Line uint8 Cc [19]uint8 Ispeed uint32 Ospeed uint32 } type Winsize struct { Row uint16 Col uint16 Xpixel uint16 Ypixel uint16 } type Taskstats struct { Version uint16 Pad_cgo_0 [2]byte Ac_exitcode uint32 Ac_flag uint8 Ac_nice uint8 Pad_cgo_1 [6]byte Cpu_count uint64 Cpu_delay_total uint64 Blkio_count uint64 Blkio_delay_total uint64 Swapin_count uint64 Swapin_delay_total uint64 Cpu_run_real_total uint64 Cpu_run_virtual_total uint64 Ac_comm [32]uint8 Ac_sched uint8 Ac_pad [3]uint8 Pad_cgo_2 [4]byte Ac_uid uint32 Ac_gid uint32 Ac_pid uint32 Ac_ppid uint32 Ac_btime uint32 Pad_cgo_3 [4]byte Ac_etime uint64 Ac_utime uint64 Ac_stime uint64 Ac_minflt uint64 Ac_majflt uint64 Coremem uint64 Virtmem uint64 Hiwater_rss uint64 Hiwater_vm uint64 Read_char uint64 Write_char uint64 Read_syscalls uint64 Write_syscalls uint64 Read_bytes uint64 Write_bytes uint64 Cancelled_write_bytes uint64 Nvcsw uint64 Nivcsw uint64 Ac_utimescaled uint64 Ac_stimescaled uint64 Cpu_scaled_run_real_total uint64 Freepages_count uint64 Freepages_delay_total uint64 } const ( TASKSTATS_CMD_UNSPEC = 0x0 TASKSTATS_CMD_GET = 0x1 TASKSTATS_CMD_NEW = 0x2 TASKSTATS_TYPE_UNSPEC = 0x0 TASKSTATS_TYPE_PID = 0x1 TASKSTATS_TYPE_TGID = 0x2 TASKSTATS_TYPE_STATS = 0x3 TASKSTATS_TYPE_AGGR_PID = 0x4 TASKSTATS_TYPE_AGGR_TGID = 0x5 TASKSTATS_TYPE_NULL = 0x6 TASKSTATS_CMD_ATTR_UNSPEC = 0x0 TASKSTATS_CMD_ATTR_PID = 0x1 TASKSTATS_CMD_ATTR_TGID = 0x2 TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 ) type Genlmsghdr struct { Cmd uint8 Version uint8 Reserved uint16 } const ( CTRL_CMD_UNSPEC = 0x0 CTRL_CMD_NEWFAMILY = 0x1 CTRL_CMD_DELFAMILY = 0x2 CTRL_CMD_GETFAMILY = 0x3 CTRL_CMD_NEWOPS = 0x4 CTRL_CMD_DELOPS = 0x5 CTRL_CMD_GETOPS = 0x6 CTRL_CMD_NEWMCAST_GRP = 0x7 CTRL_CMD_DELMCAST_GRP = 0x8 CTRL_CMD_GETMCAST_GRP = 0x9 CTRL_ATTR_UNSPEC = 0x0 CTRL_ATTR_FAMILY_ID = 0x1 CTRL_ATTR_FAMILY_NAME = 0x2 CTRL_ATTR_VERSION = 0x3 CTRL_ATTR_HDRSIZE = 0x4 CTRL_ATTR_MAXATTR = 0x5 CTRL_ATTR_OPS = 0x6 CTRL_ATTR_MCAST_GROUPS = 0x7 CTRL_ATTR_OP_UNSPEC = 0x0 CTRL_ATTR_OP_ID = 0x1 CTRL_ATTR_OP_FLAGS = 0x2 CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 CTRL_ATTR_MCAST_GRP_NAME = 0x1 CTRL_ATTR_MCAST_GRP_ID = 0x2 ) ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go ================================================ // cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build arm64,linux package unix const ( sizeofPtr = 0x8 sizeofShort = 0x2 sizeofInt = 0x4 sizeofLong = 0x8 sizeofLongLong = 0x8 PathMax = 0x1000 ) type ( _C_short int16 _C_int int32 _C_long int64 _C_long_long int64 ) type Timespec struct { Sec int64 Nsec int64 } type Timeval struct { Sec int64 Usec int64 } type Timex struct { Modes uint32 Pad_cgo_0 [4]byte Offset int64 Freq int64 Maxerror int64 Esterror int64 Status int32 Pad_cgo_1 [4]byte Constant int64 Precision int64 Tolerance int64 Time Timeval Tick int64 Ppsfreq int64 Jitter int64 Shift int32 Pad_cgo_2 [4]byte Stabil int64 Jitcnt int64 Calcnt int64 Errcnt int64 Stbcnt int64 Tai int32 Pad_cgo_3 [44]byte } type Time_t int64 type Tms struct { Utime int64 Stime int64 Cutime int64 Cstime int64 } type Utimbuf struct { Actime int64 Modtime int64 } type Rusage struct { Utime Timeval Stime Timeval Maxrss int64 Ixrss int64 Idrss int64 Isrss int64 Minflt int64 Majflt int64 Nswap int64 Inblock int64 Oublock int64 Msgsnd int64 Msgrcv int64 Nsignals int64 Nvcsw int64 Nivcsw int64 } type Rlimit struct { Cur uint64 Max uint64 } type _Gid_t uint32 type Stat_t struct { Dev uint64 Ino uint64 Mode uint32 Nlink uint32 Uid uint32 Gid uint32 Rdev uint64 X__pad1 uint64 Size int64 Blksize int32 X__pad2 int32 Blocks int64 Atim Timespec Mtim Timespec Ctim Timespec _ [2]int32 } type Statfs_t struct { Type int64 Bsize int64 Blocks uint64 Bfree uint64 Bavail uint64 Files uint64 Ffree uint64 Fsid Fsid Namelen int64 Frsize int64 Flags int64 Spare [4]int64 } type Dirent struct { Ino uint64 Off int64 Reclen uint16 Type uint8 Name [256]int8 Pad_cgo_0 [5]byte } type Fsid struct { X__val [2]int32 } type Flock_t struct { Type int16 Whence int16 Pad_cgo_0 [4]byte Start int64 Len int64 Pid int32 Pad_cgo_1 [4]byte } type FscryptPolicy struct { Version uint8 Contents_encryption_mode uint8 Filenames_encryption_mode uint8 Flags uint8 Master_key_descriptor [8]uint8 } type FscryptKey struct { Mode uint32 Raw [64]uint8 Size uint32 } type KeyctlDHParams struct { Private int32 Prime int32 Base int32 } const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 FADV_SEQUENTIAL = 0x2 FADV_WILLNEED = 0x3 FADV_DONTNEED = 0x4 FADV_NOREUSE = 0x5 ) type RawSockaddrInet4 struct { Family uint16 Port uint16 Addr [4]byte /* in_addr */ Zero [8]uint8 } type RawSockaddrInet6 struct { Family uint16 Port uint16 Flowinfo uint32 Addr [16]byte /* in6_addr */ Scope_id uint32 } type RawSockaddrUnix struct { Family uint16 Path [108]int8 } type RawSockaddrLinklayer struct { Family uint16 Protocol uint16 Ifindex int32 Hatype uint16 Pkttype uint8 Halen uint8 Addr [8]uint8 } type RawSockaddrNetlink struct { Family uint16 Pad uint16 Pid uint32 Groups uint32 } type RawSockaddrHCI struct { Family uint16 Dev uint16 Channel uint16 } type RawSockaddrCAN struct { Family uint16 Pad_cgo_0 [2]byte Ifindex int32 Addr [8]byte } type RawSockaddrALG struct { Family uint16 Type [14]uint8 Feat uint32 Mask uint32 Name [64]uint8 } type RawSockaddrVM struct { Family uint16 Reserved1 uint16 Port uint32 Cid uint32 Zero [4]uint8 } type RawSockaddr struct { Family uint16 Data [14]int8 } type RawSockaddrAny struct { Addr RawSockaddr Pad [96]int8 } type _Socklen uint32 type Linger struct { Onoff int32 Linger int32 } type Iovec struct { Base *byte Len uint64 } type IPMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } type IPMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } type IPv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } type PacketMreq struct { Ifindex int32 Type uint16 Alen uint16 Address [8]uint8 } type Msghdr struct { Name *byte Namelen uint32 Pad_cgo_0 [4]byte Iov *Iovec Iovlen uint64 Control *byte Controllen uint64 Flags int32 Pad_cgo_1 [4]byte } type Cmsghdr struct { Len uint64 Level int32 Type int32 } type Inet4Pktinfo struct { Ifindex int32 Spec_dst [4]byte /* in_addr */ Addr [4]byte /* in_addr */ } type Inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } type IPv6MTUInfo struct { Addr RawSockaddrInet6 Mtu uint32 } type ICMPv6Filter struct { Data [8]uint32 } type Ucred struct { Pid int32 Uid uint32 Gid uint32 } type TCPInfo struct { State uint8 Ca_state uint8 Retransmits uint8 Probes uint8 Backoff uint8 Options uint8 Pad_cgo_0 [2]byte Rto uint32 Ato uint32 Snd_mss uint32 Rcv_mss uint32 Unacked uint32 Sacked uint32 Lost uint32 Retrans uint32 Fackets uint32 Last_data_sent uint32 Last_ack_sent uint32 Last_data_recv uint32 Last_ack_recv uint32 Pmtu uint32 Rcv_ssthresh uint32 Rtt uint32 Rttvar uint32 Snd_ssthresh uint32 Snd_cwnd uint32 Advmss uint32 Reordering uint32 Rcv_rtt uint32 Rcv_space uint32 Total_retrans uint32 } const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c SizeofSockaddrAny = 0x70 SizeofSockaddrUnix = 0x6e SizeofSockaddrLinklayer = 0x14 SizeofSockaddrNetlink = 0xc SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 SizeofPacketMreq = 0x10 SizeofMsghdr = 0x38 SizeofCmsghdr = 0x10 SizeofInet4Pktinfo = 0xc SizeofInet6Pktinfo = 0x14 SizeofIPv6MTUInfo = 0x20 SizeofICMPv6Filter = 0x20 SizeofUcred = 0xc SizeofTCPInfo = 0x68 ) const ( IFA_UNSPEC = 0x0 IFA_ADDRESS = 0x1 IFA_LOCAL = 0x2 IFA_LABEL = 0x3 IFA_BROADCAST = 0x4 IFA_ANYCAST = 0x5 IFA_CACHEINFO = 0x6 IFA_MULTICAST = 0x7 IFLA_UNSPEC = 0x0 IFLA_ADDRESS = 0x1 IFLA_BROADCAST = 0x2 IFLA_IFNAME = 0x3 IFLA_MTU = 0x4 IFLA_LINK = 0x5 IFLA_QDISC = 0x6 IFLA_STATS = 0x7 IFLA_COST = 0x8 IFLA_PRIORITY = 0x9 IFLA_MASTER = 0xa IFLA_WIRELESS = 0xb IFLA_PROTINFO = 0xc IFLA_TXQLEN = 0xd IFLA_MAP = 0xe IFLA_WEIGHT = 0xf IFLA_OPERSTATE = 0x10 IFLA_LINKMODE = 0x11 IFLA_LINKINFO = 0x12 IFLA_NET_NS_PID = 0x13 IFLA_IFALIAS = 0x14 IFLA_MAX = 0x2c RT_SCOPE_UNIVERSE = 0x0 RT_SCOPE_SITE = 0xc8 RT_SCOPE_LINK = 0xfd RT_SCOPE_HOST = 0xfe RT_SCOPE_NOWHERE = 0xff RT_TABLE_UNSPEC = 0x0 RT_TABLE_COMPAT = 0xfc RT_TABLE_DEFAULT = 0xfd RT_TABLE_MAIN = 0xfe RT_TABLE_LOCAL = 0xff RT_TABLE_MAX = 0xffffffff RTA_UNSPEC = 0x0 RTA_DST = 0x1 RTA_SRC = 0x2 RTA_IIF = 0x3 RTA_OIF = 0x4 RTA_GATEWAY = 0x5 RTA_PRIORITY = 0x6 RTA_PREFSRC = 0x7 RTA_METRICS = 0x8 RTA_MULTIPATH = 0x9 RTA_FLOW = 0xb RTA_CACHEINFO = 0xc RTA_TABLE = 0xf RTN_UNSPEC = 0x0 RTN_UNICAST = 0x1 RTN_LOCAL = 0x2 RTN_BROADCAST = 0x3 RTN_ANYCAST = 0x4 RTN_MULTICAST = 0x5 RTN_BLACKHOLE = 0x6 RTN_UNREACHABLE = 0x7 RTN_PROHIBIT = 0x8 RTN_THROW = 0x9 RTN_NAT = 0xa RTN_XRESOLVE = 0xb RTNLGRP_NONE = 0x0 RTNLGRP_LINK = 0x1 RTNLGRP_NOTIFY = 0x2 RTNLGRP_NEIGH = 0x3 RTNLGRP_TC = 0x4 RTNLGRP_IPV4_IFADDR = 0x5 RTNLGRP_IPV4_MROUTE = 0x6 RTNLGRP_IPV4_ROUTE = 0x7 RTNLGRP_IPV4_RULE = 0x8 RTNLGRP_IPV6_IFADDR = 0x9 RTNLGRP_IPV6_MROUTE = 0xa RTNLGRP_IPV6_ROUTE = 0xb RTNLGRP_IPV6_IFINFO = 0xc RTNLGRP_IPV6_PREFIX = 0x12 RTNLGRP_IPV6_RULE = 0x13 RTNLGRP_ND_USEROPT = 0x14 SizeofNlMsghdr = 0x10 SizeofNlMsgerr = 0x14 SizeofRtGenmsg = 0x1 SizeofNlAttr = 0x4 SizeofRtAttr = 0x4 SizeofIfInfomsg = 0x10 SizeofIfAddrmsg = 0x8 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 ) type NlMsghdr struct { Len uint32 Type uint16 Flags uint16 Seq uint32 Pid uint32 } type NlMsgerr struct { Error int32 Msg NlMsghdr } type RtGenmsg struct { Family uint8 } type NlAttr struct { Len uint16 Type uint16 } type RtAttr struct { Len uint16 Type uint16 } type IfInfomsg struct { Family uint8 X__ifi_pad uint8 Type uint16 Index int32 Flags uint32 Change uint32 } type IfAddrmsg struct { Family uint8 Prefixlen uint8 Flags uint8 Scope uint8 Index uint32 } type RtMsg struct { Family uint8 Dst_len uint8 Src_len uint8 Tos uint8 Table uint8 Protocol uint8 Scope uint8 Type uint8 Flags uint32 } type RtNexthop struct { Len uint16 Flags uint8 Hops uint8 Ifindex int32 } const ( SizeofSockFilter = 0x8 SizeofSockFprog = 0x10 ) type SockFilter struct { Code uint16 Jt uint8 Jf uint8 K uint32 } type SockFprog struct { Len uint16 Pad_cgo_0 [6]byte Filter *SockFilter } type InotifyEvent struct { Wd int32 Mask uint32 Cookie uint32 Len uint32 } const SizeofInotifyEvent = 0x10 type PtraceRegs struct { Regs [31]uint64 Sp uint64 Pc uint64 Pstate uint64 } type FdSet struct { Bits [16]int64 } type Sysinfo_t struct { Uptime int64 Loads [3]uint64 Totalram uint64 Freeram uint64 Sharedram uint64 Bufferram uint64 Totalswap uint64 Freeswap uint64 Procs uint16 Pad uint16 Pad_cgo_0 [4]byte Totalhigh uint64 Freehigh uint64 Unit uint32 X_f [0]int8 Pad_cgo_1 [4]byte } type Utsname struct { Sysname [65]byte Nodename [65]byte Release [65]byte Version [65]byte Machine [65]byte Domainname [65]byte } type Ustat_t struct { Tfree int32 Pad_cgo_0 [4]byte Tinode uint64 Fname [6]int8 Fpack [6]int8 Pad_cgo_1 [4]byte } type EpollEvent struct { Events uint32 PadFd int32 Fd int32 Pad int32 } const ( AT_FDCWD = -0x64 AT_REMOVEDIR = 0x200 AT_SYMLINK_FOLLOW = 0x400 AT_SYMLINK_NOFOLLOW = 0x100 ) type PollFd struct { Fd int32 Events int16 Revents int16 } const ( POLLIN = 0x1 POLLPRI = 0x2 POLLOUT = 0x4 POLLRDHUP = 0x2000 POLLERR = 0x8 POLLHUP = 0x10 POLLNVAL = 0x20 ) type Sigset_t struct { X__val [16]uint64 } const RNDGETENTCNT = 0x80045200 const PERF_IOC_FLAG_GROUP = 0x1 type Termios struct { Iflag uint32 Oflag uint32 Cflag uint32 Lflag uint32 Line uint8 Cc [19]uint8 Ispeed uint32 Ospeed uint32 } type Winsize struct { Row uint16 Col uint16 Xpixel uint16 Ypixel uint16 } type Taskstats struct { Version uint16 Pad_cgo_0 [2]byte Ac_exitcode uint32 Ac_flag uint8 Ac_nice uint8 Pad_cgo_1 [6]byte Cpu_count uint64 Cpu_delay_total uint64 Blkio_count uint64 Blkio_delay_total uint64 Swapin_count uint64 Swapin_delay_total uint64 Cpu_run_real_total uint64 Cpu_run_virtual_total uint64 Ac_comm [32]int8 Ac_sched uint8 Ac_pad [3]uint8 Pad_cgo_2 [4]byte Ac_uid uint32 Ac_gid uint32 Ac_pid uint32 Ac_ppid uint32 Ac_btime uint32 Pad_cgo_3 [4]byte Ac_etime uint64 Ac_utime uint64 Ac_stime uint64 Ac_minflt uint64 Ac_majflt uint64 Coremem uint64 Virtmem uint64 Hiwater_rss uint64 Hiwater_vm uint64 Read_char uint64 Write_char uint64 Read_syscalls uint64 Write_syscalls uint64 Read_bytes uint64 Write_bytes uint64 Cancelled_write_bytes uint64 Nvcsw uint64 Nivcsw uint64 Ac_utimescaled uint64 Ac_stimescaled uint64 Cpu_scaled_run_real_total uint64 Freepages_count uint64 Freepages_delay_total uint64 } const ( TASKSTATS_CMD_UNSPEC = 0x0 TASKSTATS_CMD_GET = 0x1 TASKSTATS_CMD_NEW = 0x2 TASKSTATS_TYPE_UNSPEC = 0x0 TASKSTATS_TYPE_PID = 0x1 TASKSTATS_TYPE_TGID = 0x2 TASKSTATS_TYPE_STATS = 0x3 TASKSTATS_TYPE_AGGR_PID = 0x4 TASKSTATS_TYPE_AGGR_TGID = 0x5 TASKSTATS_TYPE_NULL = 0x6 TASKSTATS_CMD_ATTR_UNSPEC = 0x0 TASKSTATS_CMD_ATTR_PID = 0x1 TASKSTATS_CMD_ATTR_TGID = 0x2 TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 ) type Genlmsghdr struct { Cmd uint8 Version uint8 Reserved uint16 } const ( CTRL_CMD_UNSPEC = 0x0 CTRL_CMD_NEWFAMILY = 0x1 CTRL_CMD_DELFAMILY = 0x2 CTRL_CMD_GETFAMILY = 0x3 CTRL_CMD_NEWOPS = 0x4 CTRL_CMD_DELOPS = 0x5 CTRL_CMD_GETOPS = 0x6 CTRL_CMD_NEWMCAST_GRP = 0x7 CTRL_CMD_DELMCAST_GRP = 0x8 CTRL_CMD_GETMCAST_GRP = 0x9 CTRL_ATTR_UNSPEC = 0x0 CTRL_ATTR_FAMILY_ID = 0x1 CTRL_ATTR_FAMILY_NAME = 0x2 CTRL_ATTR_VERSION = 0x3 CTRL_ATTR_HDRSIZE = 0x4 CTRL_ATTR_MAXATTR = 0x5 CTRL_ATTR_OPS = 0x6 CTRL_ATTR_MCAST_GROUPS = 0x7 CTRL_ATTR_OP_UNSPEC = 0x0 CTRL_ATTR_OP_ID = 0x1 CTRL_ATTR_OP_FLAGS = 0x2 CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 CTRL_ATTR_MCAST_GRP_NAME = 0x1 CTRL_ATTR_MCAST_GRP_ID = 0x2 ) ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_linux_mips.go ================================================ // cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build mips,linux package unix const ( sizeofPtr = 0x4 sizeofShort = 0x2 sizeofInt = 0x4 sizeofLong = 0x4 sizeofLongLong = 0x8 PathMax = 0x1000 ) type ( _C_short int16 _C_int int32 _C_long int32 _C_long_long int64 ) type Timespec struct { Sec int32 Nsec int32 } type Timeval struct { Sec int32 Usec int32 } type Timex struct { Modes uint32 Offset int32 Freq int32 Maxerror int32 Esterror int32 Status int32 Constant int32 Precision int32 Tolerance int32 Time Timeval Tick int32 Ppsfreq int32 Jitter int32 Shift int32 Stabil int32 Jitcnt int32 Calcnt int32 Errcnt int32 Stbcnt int32 Tai int32 Pad_cgo_0 [44]byte } type Time_t int32 type Tms struct { Utime int32 Stime int32 Cutime int32 Cstime int32 } type Utimbuf struct { Actime int32 Modtime int32 } type Rusage struct { Utime Timeval Stime Timeval Maxrss int32 Ixrss int32 Idrss int32 Isrss int32 Minflt int32 Majflt int32 Nswap int32 Inblock int32 Oublock int32 Msgsnd int32 Msgrcv int32 Nsignals int32 Nvcsw int32 Nivcsw int32 } type Rlimit struct { Cur uint64 Max uint64 } type _Gid_t uint32 type Stat_t struct { Dev uint32 Pad1 [3]int32 Ino uint64 Mode uint32 Nlink uint32 Uid uint32 Gid uint32 Rdev uint32 Pad2 [3]int32 Size int64 Atim Timespec Mtim Timespec Ctim Timespec Blksize int32 Pad4 int32 Blocks int64 Pad5 [14]int32 } type Statfs_t struct { Type int32 Bsize int32 Frsize int32 Pad_cgo_0 [4]byte Blocks uint64 Bfree uint64 Files uint64 Ffree uint64 Bavail uint64 Fsid Fsid Namelen int32 Flags int32 Spare [5]int32 Pad_cgo_1 [4]byte } type Dirent struct { Ino uint64 Off int64 Reclen uint16 Type uint8 Name [256]int8 Pad_cgo_0 [5]byte } type Fsid struct { X__val [2]int32 } type Flock_t struct { Type int16 Whence int16 Pad_cgo_0 [4]byte Start int64 Len int64 Pid int32 Pad_cgo_1 [4]byte } type FscryptPolicy struct { Version uint8 Contents_encryption_mode uint8 Filenames_encryption_mode uint8 Flags uint8 Master_key_descriptor [8]uint8 } type FscryptKey struct { Mode uint32 Raw [64]uint8 Size uint32 } type KeyctlDHParams struct { Private int32 Prime int32 Base int32 } const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 FADV_SEQUENTIAL = 0x2 FADV_WILLNEED = 0x3 FADV_DONTNEED = 0x4 FADV_NOREUSE = 0x5 ) type RawSockaddrInet4 struct { Family uint16 Port uint16 Addr [4]byte /* in_addr */ Zero [8]uint8 } type RawSockaddrInet6 struct { Family uint16 Port uint16 Flowinfo uint32 Addr [16]byte /* in6_addr */ Scope_id uint32 } type RawSockaddrUnix struct { Family uint16 Path [108]int8 } type RawSockaddrLinklayer struct { Family uint16 Protocol uint16 Ifindex int32 Hatype uint16 Pkttype uint8 Halen uint8 Addr [8]uint8 } type RawSockaddrNetlink struct { Family uint16 Pad uint16 Pid uint32 Groups uint32 } type RawSockaddrHCI struct { Family uint16 Dev uint16 Channel uint16 } type RawSockaddrCAN struct { Family uint16 Pad_cgo_0 [2]byte Ifindex int32 Addr [8]byte } type RawSockaddrALG struct { Family uint16 Type [14]uint8 Feat uint32 Mask uint32 Name [64]uint8 } type RawSockaddrVM struct { Family uint16 Reserved1 uint16 Port uint32 Cid uint32 Zero [4]uint8 } type RawSockaddr struct { Family uint16 Data [14]int8 } type RawSockaddrAny struct { Addr RawSockaddr Pad [96]int8 } type _Socklen uint32 type Linger struct { Onoff int32 Linger int32 } type Iovec struct { Base *byte Len uint32 } type IPMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } type IPMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } type IPv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } type PacketMreq struct { Ifindex int32 Type uint16 Alen uint16 Address [8]uint8 } type Msghdr struct { Name *byte Namelen uint32 Iov *Iovec Iovlen uint32 Control *byte Controllen uint32 Flags int32 } type Cmsghdr struct { Len uint32 Level int32 Type int32 } type Inet4Pktinfo struct { Ifindex int32 Spec_dst [4]byte /* in_addr */ Addr [4]byte /* in_addr */ } type Inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } type IPv6MTUInfo struct { Addr RawSockaddrInet6 Mtu uint32 } type ICMPv6Filter struct { Data [8]uint32 } type Ucred struct { Pid int32 Uid uint32 Gid uint32 } type TCPInfo struct { State uint8 Ca_state uint8 Retransmits uint8 Probes uint8 Backoff uint8 Options uint8 Pad_cgo_0 [2]byte Rto uint32 Ato uint32 Snd_mss uint32 Rcv_mss uint32 Unacked uint32 Sacked uint32 Lost uint32 Retrans uint32 Fackets uint32 Last_data_sent uint32 Last_ack_sent uint32 Last_data_recv uint32 Last_ack_recv uint32 Pmtu uint32 Rcv_ssthresh uint32 Rtt uint32 Rttvar uint32 Snd_ssthresh uint32 Snd_cwnd uint32 Advmss uint32 Reordering uint32 Rcv_rtt uint32 Rcv_space uint32 Total_retrans uint32 } const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c SizeofSockaddrAny = 0x70 SizeofSockaddrUnix = 0x6e SizeofSockaddrLinklayer = 0x14 SizeofSockaddrNetlink = 0xc SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 SizeofPacketMreq = 0x10 SizeofMsghdr = 0x1c SizeofCmsghdr = 0xc SizeofInet4Pktinfo = 0xc SizeofInet6Pktinfo = 0x14 SizeofIPv6MTUInfo = 0x20 SizeofICMPv6Filter = 0x20 SizeofUcred = 0xc SizeofTCPInfo = 0x68 ) const ( IFA_UNSPEC = 0x0 IFA_ADDRESS = 0x1 IFA_LOCAL = 0x2 IFA_LABEL = 0x3 IFA_BROADCAST = 0x4 IFA_ANYCAST = 0x5 IFA_CACHEINFO = 0x6 IFA_MULTICAST = 0x7 IFLA_UNSPEC = 0x0 IFLA_ADDRESS = 0x1 IFLA_BROADCAST = 0x2 IFLA_IFNAME = 0x3 IFLA_MTU = 0x4 IFLA_LINK = 0x5 IFLA_QDISC = 0x6 IFLA_STATS = 0x7 IFLA_COST = 0x8 IFLA_PRIORITY = 0x9 IFLA_MASTER = 0xa IFLA_WIRELESS = 0xb IFLA_PROTINFO = 0xc IFLA_TXQLEN = 0xd IFLA_MAP = 0xe IFLA_WEIGHT = 0xf IFLA_OPERSTATE = 0x10 IFLA_LINKMODE = 0x11 IFLA_LINKINFO = 0x12 IFLA_NET_NS_PID = 0x13 IFLA_IFALIAS = 0x14 IFLA_MAX = 0x2c RT_SCOPE_UNIVERSE = 0x0 RT_SCOPE_SITE = 0xc8 RT_SCOPE_LINK = 0xfd RT_SCOPE_HOST = 0xfe RT_SCOPE_NOWHERE = 0xff RT_TABLE_UNSPEC = 0x0 RT_TABLE_COMPAT = 0xfc RT_TABLE_DEFAULT = 0xfd RT_TABLE_MAIN = 0xfe RT_TABLE_LOCAL = 0xff RT_TABLE_MAX = 0xffffffff RTA_UNSPEC = 0x0 RTA_DST = 0x1 RTA_SRC = 0x2 RTA_IIF = 0x3 RTA_OIF = 0x4 RTA_GATEWAY = 0x5 RTA_PRIORITY = 0x6 RTA_PREFSRC = 0x7 RTA_METRICS = 0x8 RTA_MULTIPATH = 0x9 RTA_FLOW = 0xb RTA_CACHEINFO = 0xc RTA_TABLE = 0xf RTN_UNSPEC = 0x0 RTN_UNICAST = 0x1 RTN_LOCAL = 0x2 RTN_BROADCAST = 0x3 RTN_ANYCAST = 0x4 RTN_MULTICAST = 0x5 RTN_BLACKHOLE = 0x6 RTN_UNREACHABLE = 0x7 RTN_PROHIBIT = 0x8 RTN_THROW = 0x9 RTN_NAT = 0xa RTN_XRESOLVE = 0xb RTNLGRP_NONE = 0x0 RTNLGRP_LINK = 0x1 RTNLGRP_NOTIFY = 0x2 RTNLGRP_NEIGH = 0x3 RTNLGRP_TC = 0x4 RTNLGRP_IPV4_IFADDR = 0x5 RTNLGRP_IPV4_MROUTE = 0x6 RTNLGRP_IPV4_ROUTE = 0x7 RTNLGRP_IPV4_RULE = 0x8 RTNLGRP_IPV6_IFADDR = 0x9 RTNLGRP_IPV6_MROUTE = 0xa RTNLGRP_IPV6_ROUTE = 0xb RTNLGRP_IPV6_IFINFO = 0xc RTNLGRP_IPV6_PREFIX = 0x12 RTNLGRP_IPV6_RULE = 0x13 RTNLGRP_ND_USEROPT = 0x14 SizeofNlMsghdr = 0x10 SizeofNlMsgerr = 0x14 SizeofRtGenmsg = 0x1 SizeofNlAttr = 0x4 SizeofRtAttr = 0x4 SizeofIfInfomsg = 0x10 SizeofIfAddrmsg = 0x8 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 ) type NlMsghdr struct { Len uint32 Type uint16 Flags uint16 Seq uint32 Pid uint32 } type NlMsgerr struct { Error int32 Msg NlMsghdr } type RtGenmsg struct { Family uint8 } type NlAttr struct { Len uint16 Type uint16 } type RtAttr struct { Len uint16 Type uint16 } type IfInfomsg struct { Family uint8 X__ifi_pad uint8 Type uint16 Index int32 Flags uint32 Change uint32 } type IfAddrmsg struct { Family uint8 Prefixlen uint8 Flags uint8 Scope uint8 Index uint32 } type RtMsg struct { Family uint8 Dst_len uint8 Src_len uint8 Tos uint8 Table uint8 Protocol uint8 Scope uint8 Type uint8 Flags uint32 } type RtNexthop struct { Len uint16 Flags uint8 Hops uint8 Ifindex int32 } const ( SizeofSockFilter = 0x8 SizeofSockFprog = 0x8 ) type SockFilter struct { Code uint16 Jt uint8 Jf uint8 K uint32 } type SockFprog struct { Len uint16 Pad_cgo_0 [2]byte Filter *SockFilter } type InotifyEvent struct { Wd int32 Mask uint32 Cookie uint32 Len uint32 } const SizeofInotifyEvent = 0x10 type PtraceRegs struct { Regs [32]uint64 Lo uint64 Hi uint64 Epc uint64 Badvaddr uint64 Status uint64 Cause uint64 } type FdSet struct { Bits [32]int32 } type Sysinfo_t struct { Uptime int32 Loads [3]uint32 Totalram uint32 Freeram uint32 Sharedram uint32 Bufferram uint32 Totalswap uint32 Freeswap uint32 Procs uint16 Pad uint16 Totalhigh uint32 Freehigh uint32 Unit uint32 X_f [8]int8 } type Utsname struct { Sysname [65]byte Nodename [65]byte Release [65]byte Version [65]byte Machine [65]byte Domainname [65]byte } type Ustat_t struct { Tfree int32 Tinode uint32 Fname [6]int8 Fpack [6]int8 } type EpollEvent struct { Events uint32 PadFd int32 Fd int32 Pad int32 } const ( AT_FDCWD = -0x64 AT_REMOVEDIR = 0x200 AT_SYMLINK_FOLLOW = 0x400 AT_SYMLINK_NOFOLLOW = 0x100 ) type PollFd struct { Fd int32 Events int16 Revents int16 } const ( POLLIN = 0x1 POLLPRI = 0x2 POLLOUT = 0x4 POLLRDHUP = 0x2000 POLLERR = 0x8 POLLHUP = 0x10 POLLNVAL = 0x20 ) type Sigset_t struct { X__val [32]uint32 } const RNDGETENTCNT = 0x40045200 const PERF_IOC_FLAG_GROUP = 0x1 type Termios struct { Iflag uint32 Oflag uint32 Cflag uint32 Lflag uint32 Line uint8 Cc [23]uint8 Ispeed uint32 Ospeed uint32 } type Winsize struct { Row uint16 Col uint16 Xpixel uint16 Ypixel uint16 } type Taskstats struct { Version uint16 Pad_cgo_0 [2]byte Ac_exitcode uint32 Ac_flag uint8 Ac_nice uint8 Pad_cgo_1 [6]byte Cpu_count uint64 Cpu_delay_total uint64 Blkio_count uint64 Blkio_delay_total uint64 Swapin_count uint64 Swapin_delay_total uint64 Cpu_run_real_total uint64 Cpu_run_virtual_total uint64 Ac_comm [32]int8 Ac_sched uint8 Ac_pad [3]uint8 Pad_cgo_2 [4]byte Ac_uid uint32 Ac_gid uint32 Ac_pid uint32 Ac_ppid uint32 Ac_btime uint32 Pad_cgo_3 [4]byte Ac_etime uint64 Ac_utime uint64 Ac_stime uint64 Ac_minflt uint64 Ac_majflt uint64 Coremem uint64 Virtmem uint64 Hiwater_rss uint64 Hiwater_vm uint64 Read_char uint64 Write_char uint64 Read_syscalls uint64 Write_syscalls uint64 Read_bytes uint64 Write_bytes uint64 Cancelled_write_bytes uint64 Nvcsw uint64 Nivcsw uint64 Ac_utimescaled uint64 Ac_stimescaled uint64 Cpu_scaled_run_real_total uint64 Freepages_count uint64 Freepages_delay_total uint64 } const ( TASKSTATS_CMD_UNSPEC = 0x0 TASKSTATS_CMD_GET = 0x1 TASKSTATS_CMD_NEW = 0x2 TASKSTATS_TYPE_UNSPEC = 0x0 TASKSTATS_TYPE_PID = 0x1 TASKSTATS_TYPE_TGID = 0x2 TASKSTATS_TYPE_STATS = 0x3 TASKSTATS_TYPE_AGGR_PID = 0x4 TASKSTATS_TYPE_AGGR_TGID = 0x5 TASKSTATS_TYPE_NULL = 0x6 TASKSTATS_CMD_ATTR_UNSPEC = 0x0 TASKSTATS_CMD_ATTR_PID = 0x1 TASKSTATS_CMD_ATTR_TGID = 0x2 TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 ) type Genlmsghdr struct { Cmd uint8 Version uint8 Reserved uint16 } const ( CTRL_CMD_UNSPEC = 0x0 CTRL_CMD_NEWFAMILY = 0x1 CTRL_CMD_DELFAMILY = 0x2 CTRL_CMD_GETFAMILY = 0x3 CTRL_CMD_NEWOPS = 0x4 CTRL_CMD_DELOPS = 0x5 CTRL_CMD_GETOPS = 0x6 CTRL_CMD_NEWMCAST_GRP = 0x7 CTRL_CMD_DELMCAST_GRP = 0x8 CTRL_CMD_GETMCAST_GRP = 0x9 CTRL_ATTR_UNSPEC = 0x0 CTRL_ATTR_FAMILY_ID = 0x1 CTRL_ATTR_FAMILY_NAME = 0x2 CTRL_ATTR_VERSION = 0x3 CTRL_ATTR_HDRSIZE = 0x4 CTRL_ATTR_MAXATTR = 0x5 CTRL_ATTR_OPS = 0x6 CTRL_ATTR_MCAST_GROUPS = 0x7 CTRL_ATTR_OP_UNSPEC = 0x0 CTRL_ATTR_OP_ID = 0x1 CTRL_ATTR_OP_FLAGS = 0x2 CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 CTRL_ATTR_MCAST_GRP_NAME = 0x1 CTRL_ATTR_MCAST_GRP_ID = 0x2 ) ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go ================================================ // cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build mips64,linux package unix const ( sizeofPtr = 0x8 sizeofShort = 0x2 sizeofInt = 0x4 sizeofLong = 0x8 sizeofLongLong = 0x8 PathMax = 0x1000 ) type ( _C_short int16 _C_int int32 _C_long int64 _C_long_long int64 ) type Timespec struct { Sec int64 Nsec int64 } type Timeval struct { Sec int64 Usec int64 } type Timex struct { Modes uint32 Pad_cgo_0 [4]byte Offset int64 Freq int64 Maxerror int64 Esterror int64 Status int32 Pad_cgo_1 [4]byte Constant int64 Precision int64 Tolerance int64 Time Timeval Tick int64 Ppsfreq int64 Jitter int64 Shift int32 Pad_cgo_2 [4]byte Stabil int64 Jitcnt int64 Calcnt int64 Errcnt int64 Stbcnt int64 Tai int32 Pad_cgo_3 [44]byte } type Time_t int64 type Tms struct { Utime int64 Stime int64 Cutime int64 Cstime int64 } type Utimbuf struct { Actime int64 Modtime int64 } type Rusage struct { Utime Timeval Stime Timeval Maxrss int64 Ixrss int64 Idrss int64 Isrss int64 Minflt int64 Majflt int64 Nswap int64 Inblock int64 Oublock int64 Msgsnd int64 Msgrcv int64 Nsignals int64 Nvcsw int64 Nivcsw int64 } type Rlimit struct { Cur uint64 Max uint64 } type _Gid_t uint32 type Stat_t struct { Dev uint32 Pad1 [3]uint32 Ino uint64 Mode uint32 Nlink uint32 Uid uint32 Gid uint32 Rdev uint32 Pad2 [3]uint32 Size int64 Atim Timespec Mtim Timespec Ctim Timespec Blksize uint32 Pad4 uint32 Blocks int64 } type Statfs_t struct { Type int64 Bsize int64 Frsize int64 Blocks uint64 Bfree uint64 Files uint64 Ffree uint64 Bavail uint64 Fsid Fsid Namelen int64 Flags int64 Spare [5]int64 } type Dirent struct { Ino uint64 Off int64 Reclen uint16 Type uint8 Name [256]int8 Pad_cgo_0 [5]byte } type Fsid struct { X__val [2]int32 } type Flock_t struct { Type int16 Whence int16 Pad_cgo_0 [4]byte Start int64 Len int64 Pid int32 Pad_cgo_1 [4]byte } type FscryptPolicy struct { Version uint8 Contents_encryption_mode uint8 Filenames_encryption_mode uint8 Flags uint8 Master_key_descriptor [8]uint8 } type FscryptKey struct { Mode uint32 Raw [64]uint8 Size uint32 } type KeyctlDHParams struct { Private int32 Prime int32 Base int32 } const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 FADV_SEQUENTIAL = 0x2 FADV_WILLNEED = 0x3 FADV_DONTNEED = 0x4 FADV_NOREUSE = 0x5 ) type RawSockaddrInet4 struct { Family uint16 Port uint16 Addr [4]byte /* in_addr */ Zero [8]uint8 } type RawSockaddrInet6 struct { Family uint16 Port uint16 Flowinfo uint32 Addr [16]byte /* in6_addr */ Scope_id uint32 } type RawSockaddrUnix struct { Family uint16 Path [108]int8 } type RawSockaddrLinklayer struct { Family uint16 Protocol uint16 Ifindex int32 Hatype uint16 Pkttype uint8 Halen uint8 Addr [8]uint8 } type RawSockaddrNetlink struct { Family uint16 Pad uint16 Pid uint32 Groups uint32 } type RawSockaddrHCI struct { Family uint16 Dev uint16 Channel uint16 } type RawSockaddrCAN struct { Family uint16 Pad_cgo_0 [2]byte Ifindex int32 Addr [8]byte } type RawSockaddrALG struct { Family uint16 Type [14]uint8 Feat uint32 Mask uint32 Name [64]uint8 } type RawSockaddrVM struct { Family uint16 Reserved1 uint16 Port uint32 Cid uint32 Zero [4]uint8 } type RawSockaddr struct { Family uint16 Data [14]int8 } type RawSockaddrAny struct { Addr RawSockaddr Pad [96]int8 } type _Socklen uint32 type Linger struct { Onoff int32 Linger int32 } type Iovec struct { Base *byte Len uint64 } type IPMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } type IPMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } type IPv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } type PacketMreq struct { Ifindex int32 Type uint16 Alen uint16 Address [8]uint8 } type Msghdr struct { Name *byte Namelen uint32 Pad_cgo_0 [4]byte Iov *Iovec Iovlen uint64 Control *byte Controllen uint64 Flags int32 Pad_cgo_1 [4]byte } type Cmsghdr struct { Len uint64 Level int32 Type int32 } type Inet4Pktinfo struct { Ifindex int32 Spec_dst [4]byte /* in_addr */ Addr [4]byte /* in_addr */ } type Inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } type IPv6MTUInfo struct { Addr RawSockaddrInet6 Mtu uint32 } type ICMPv6Filter struct { Data [8]uint32 } type Ucred struct { Pid int32 Uid uint32 Gid uint32 } type TCPInfo struct { State uint8 Ca_state uint8 Retransmits uint8 Probes uint8 Backoff uint8 Options uint8 Pad_cgo_0 [2]byte Rto uint32 Ato uint32 Snd_mss uint32 Rcv_mss uint32 Unacked uint32 Sacked uint32 Lost uint32 Retrans uint32 Fackets uint32 Last_data_sent uint32 Last_ack_sent uint32 Last_data_recv uint32 Last_ack_recv uint32 Pmtu uint32 Rcv_ssthresh uint32 Rtt uint32 Rttvar uint32 Snd_ssthresh uint32 Snd_cwnd uint32 Advmss uint32 Reordering uint32 Rcv_rtt uint32 Rcv_space uint32 Total_retrans uint32 } const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c SizeofSockaddrAny = 0x70 SizeofSockaddrUnix = 0x6e SizeofSockaddrLinklayer = 0x14 SizeofSockaddrNetlink = 0xc SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 SizeofPacketMreq = 0x10 SizeofMsghdr = 0x38 SizeofCmsghdr = 0x10 SizeofInet4Pktinfo = 0xc SizeofInet6Pktinfo = 0x14 SizeofIPv6MTUInfo = 0x20 SizeofICMPv6Filter = 0x20 SizeofUcred = 0xc SizeofTCPInfo = 0x68 ) const ( IFA_UNSPEC = 0x0 IFA_ADDRESS = 0x1 IFA_LOCAL = 0x2 IFA_LABEL = 0x3 IFA_BROADCAST = 0x4 IFA_ANYCAST = 0x5 IFA_CACHEINFO = 0x6 IFA_MULTICAST = 0x7 IFLA_UNSPEC = 0x0 IFLA_ADDRESS = 0x1 IFLA_BROADCAST = 0x2 IFLA_IFNAME = 0x3 IFLA_MTU = 0x4 IFLA_LINK = 0x5 IFLA_QDISC = 0x6 IFLA_STATS = 0x7 IFLA_COST = 0x8 IFLA_PRIORITY = 0x9 IFLA_MASTER = 0xa IFLA_WIRELESS = 0xb IFLA_PROTINFO = 0xc IFLA_TXQLEN = 0xd IFLA_MAP = 0xe IFLA_WEIGHT = 0xf IFLA_OPERSTATE = 0x10 IFLA_LINKMODE = 0x11 IFLA_LINKINFO = 0x12 IFLA_NET_NS_PID = 0x13 IFLA_IFALIAS = 0x14 IFLA_MAX = 0x2c RT_SCOPE_UNIVERSE = 0x0 RT_SCOPE_SITE = 0xc8 RT_SCOPE_LINK = 0xfd RT_SCOPE_HOST = 0xfe RT_SCOPE_NOWHERE = 0xff RT_TABLE_UNSPEC = 0x0 RT_TABLE_COMPAT = 0xfc RT_TABLE_DEFAULT = 0xfd RT_TABLE_MAIN = 0xfe RT_TABLE_LOCAL = 0xff RT_TABLE_MAX = 0xffffffff RTA_UNSPEC = 0x0 RTA_DST = 0x1 RTA_SRC = 0x2 RTA_IIF = 0x3 RTA_OIF = 0x4 RTA_GATEWAY = 0x5 RTA_PRIORITY = 0x6 RTA_PREFSRC = 0x7 RTA_METRICS = 0x8 RTA_MULTIPATH = 0x9 RTA_FLOW = 0xb RTA_CACHEINFO = 0xc RTA_TABLE = 0xf RTN_UNSPEC = 0x0 RTN_UNICAST = 0x1 RTN_LOCAL = 0x2 RTN_BROADCAST = 0x3 RTN_ANYCAST = 0x4 RTN_MULTICAST = 0x5 RTN_BLACKHOLE = 0x6 RTN_UNREACHABLE = 0x7 RTN_PROHIBIT = 0x8 RTN_THROW = 0x9 RTN_NAT = 0xa RTN_XRESOLVE = 0xb RTNLGRP_NONE = 0x0 RTNLGRP_LINK = 0x1 RTNLGRP_NOTIFY = 0x2 RTNLGRP_NEIGH = 0x3 RTNLGRP_TC = 0x4 RTNLGRP_IPV4_IFADDR = 0x5 RTNLGRP_IPV4_MROUTE = 0x6 RTNLGRP_IPV4_ROUTE = 0x7 RTNLGRP_IPV4_RULE = 0x8 RTNLGRP_IPV6_IFADDR = 0x9 RTNLGRP_IPV6_MROUTE = 0xa RTNLGRP_IPV6_ROUTE = 0xb RTNLGRP_IPV6_IFINFO = 0xc RTNLGRP_IPV6_PREFIX = 0x12 RTNLGRP_IPV6_RULE = 0x13 RTNLGRP_ND_USEROPT = 0x14 SizeofNlMsghdr = 0x10 SizeofNlMsgerr = 0x14 SizeofRtGenmsg = 0x1 SizeofNlAttr = 0x4 SizeofRtAttr = 0x4 SizeofIfInfomsg = 0x10 SizeofIfAddrmsg = 0x8 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 ) type NlMsghdr struct { Len uint32 Type uint16 Flags uint16 Seq uint32 Pid uint32 } type NlMsgerr struct { Error int32 Msg NlMsghdr } type RtGenmsg struct { Family uint8 } type NlAttr struct { Len uint16 Type uint16 } type RtAttr struct { Len uint16 Type uint16 } type IfInfomsg struct { Family uint8 X__ifi_pad uint8 Type uint16 Index int32 Flags uint32 Change uint32 } type IfAddrmsg struct { Family uint8 Prefixlen uint8 Flags uint8 Scope uint8 Index uint32 } type RtMsg struct { Family uint8 Dst_len uint8 Src_len uint8 Tos uint8 Table uint8 Protocol uint8 Scope uint8 Type uint8 Flags uint32 } type RtNexthop struct { Len uint16 Flags uint8 Hops uint8 Ifindex int32 } const ( SizeofSockFilter = 0x8 SizeofSockFprog = 0x10 ) type SockFilter struct { Code uint16 Jt uint8 Jf uint8 K uint32 } type SockFprog struct { Len uint16 Pad_cgo_0 [6]byte Filter *SockFilter } type InotifyEvent struct { Wd int32 Mask uint32 Cookie uint32 Len uint32 } const SizeofInotifyEvent = 0x10 type PtraceRegs struct { Regs [32]uint64 Lo uint64 Hi uint64 Epc uint64 Badvaddr uint64 Status uint64 Cause uint64 } type FdSet struct { Bits [16]int64 } type Sysinfo_t struct { Uptime int64 Loads [3]uint64 Totalram uint64 Freeram uint64 Sharedram uint64 Bufferram uint64 Totalswap uint64 Freeswap uint64 Procs uint16 Pad uint16 Pad_cgo_0 [4]byte Totalhigh uint64 Freehigh uint64 Unit uint32 X_f [0]int8 Pad_cgo_1 [4]byte } type Utsname struct { Sysname [65]byte Nodename [65]byte Release [65]byte Version [65]byte Machine [65]byte Domainname [65]byte } type Ustat_t struct { Tfree int32 Pad_cgo_0 [4]byte Tinode uint64 Fname [6]int8 Fpack [6]int8 Pad_cgo_1 [4]byte } type EpollEvent struct { Events uint32 Fd int32 Pad int32 } const ( AT_FDCWD = -0x64 AT_REMOVEDIR = 0x200 AT_SYMLINK_FOLLOW = 0x400 AT_SYMLINK_NOFOLLOW = 0x100 ) type PollFd struct { Fd int32 Events int16 Revents int16 } const ( POLLIN = 0x1 POLLPRI = 0x2 POLLOUT = 0x4 POLLRDHUP = 0x2000 POLLERR = 0x8 POLLHUP = 0x10 POLLNVAL = 0x20 ) type Sigset_t struct { X__val [16]uint64 } const RNDGETENTCNT = 0x40045200 const PERF_IOC_FLAG_GROUP = 0x1 type Termios struct { Iflag uint32 Oflag uint32 Cflag uint32 Lflag uint32 Line uint8 Cc [23]uint8 Ispeed uint32 Ospeed uint32 } type Winsize struct { Row uint16 Col uint16 Xpixel uint16 Ypixel uint16 } type Taskstats struct { Version uint16 Pad_cgo_0 [2]byte Ac_exitcode uint32 Ac_flag uint8 Ac_nice uint8 Pad_cgo_1 [6]byte Cpu_count uint64 Cpu_delay_total uint64 Blkio_count uint64 Blkio_delay_total uint64 Swapin_count uint64 Swapin_delay_total uint64 Cpu_run_real_total uint64 Cpu_run_virtual_total uint64 Ac_comm [32]int8 Ac_sched uint8 Ac_pad [3]uint8 Pad_cgo_2 [4]byte Ac_uid uint32 Ac_gid uint32 Ac_pid uint32 Ac_ppid uint32 Ac_btime uint32 Pad_cgo_3 [4]byte Ac_etime uint64 Ac_utime uint64 Ac_stime uint64 Ac_minflt uint64 Ac_majflt uint64 Coremem uint64 Virtmem uint64 Hiwater_rss uint64 Hiwater_vm uint64 Read_char uint64 Write_char uint64 Read_syscalls uint64 Write_syscalls uint64 Read_bytes uint64 Write_bytes uint64 Cancelled_write_bytes uint64 Nvcsw uint64 Nivcsw uint64 Ac_utimescaled uint64 Ac_stimescaled uint64 Cpu_scaled_run_real_total uint64 Freepages_count uint64 Freepages_delay_total uint64 } const ( TASKSTATS_CMD_UNSPEC = 0x0 TASKSTATS_CMD_GET = 0x1 TASKSTATS_CMD_NEW = 0x2 TASKSTATS_TYPE_UNSPEC = 0x0 TASKSTATS_TYPE_PID = 0x1 TASKSTATS_TYPE_TGID = 0x2 TASKSTATS_TYPE_STATS = 0x3 TASKSTATS_TYPE_AGGR_PID = 0x4 TASKSTATS_TYPE_AGGR_TGID = 0x5 TASKSTATS_TYPE_NULL = 0x6 TASKSTATS_CMD_ATTR_UNSPEC = 0x0 TASKSTATS_CMD_ATTR_PID = 0x1 TASKSTATS_CMD_ATTR_TGID = 0x2 TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 ) type Genlmsghdr struct { Cmd uint8 Version uint8 Reserved uint16 } const ( CTRL_CMD_UNSPEC = 0x0 CTRL_CMD_NEWFAMILY = 0x1 CTRL_CMD_DELFAMILY = 0x2 CTRL_CMD_GETFAMILY = 0x3 CTRL_CMD_NEWOPS = 0x4 CTRL_CMD_DELOPS = 0x5 CTRL_CMD_GETOPS = 0x6 CTRL_CMD_NEWMCAST_GRP = 0x7 CTRL_CMD_DELMCAST_GRP = 0x8 CTRL_CMD_GETMCAST_GRP = 0x9 CTRL_ATTR_UNSPEC = 0x0 CTRL_ATTR_FAMILY_ID = 0x1 CTRL_ATTR_FAMILY_NAME = 0x2 CTRL_ATTR_VERSION = 0x3 CTRL_ATTR_HDRSIZE = 0x4 CTRL_ATTR_MAXATTR = 0x5 CTRL_ATTR_OPS = 0x6 CTRL_ATTR_MCAST_GROUPS = 0x7 CTRL_ATTR_OP_UNSPEC = 0x0 CTRL_ATTR_OP_ID = 0x1 CTRL_ATTR_OP_FLAGS = 0x2 CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 CTRL_ATTR_MCAST_GRP_NAME = 0x1 CTRL_ATTR_MCAST_GRP_ID = 0x2 ) ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go ================================================ // cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build mips64le,linux package unix const ( sizeofPtr = 0x8 sizeofShort = 0x2 sizeofInt = 0x4 sizeofLong = 0x8 sizeofLongLong = 0x8 PathMax = 0x1000 ) type ( _C_short int16 _C_int int32 _C_long int64 _C_long_long int64 ) type Timespec struct { Sec int64 Nsec int64 } type Timeval struct { Sec int64 Usec int64 } type Timex struct { Modes uint32 Pad_cgo_0 [4]byte Offset int64 Freq int64 Maxerror int64 Esterror int64 Status int32 Pad_cgo_1 [4]byte Constant int64 Precision int64 Tolerance int64 Time Timeval Tick int64 Ppsfreq int64 Jitter int64 Shift int32 Pad_cgo_2 [4]byte Stabil int64 Jitcnt int64 Calcnt int64 Errcnt int64 Stbcnt int64 Tai int32 Pad_cgo_3 [44]byte } type Time_t int64 type Tms struct { Utime int64 Stime int64 Cutime int64 Cstime int64 } type Utimbuf struct { Actime int64 Modtime int64 } type Rusage struct { Utime Timeval Stime Timeval Maxrss int64 Ixrss int64 Idrss int64 Isrss int64 Minflt int64 Majflt int64 Nswap int64 Inblock int64 Oublock int64 Msgsnd int64 Msgrcv int64 Nsignals int64 Nvcsw int64 Nivcsw int64 } type Rlimit struct { Cur uint64 Max uint64 } type _Gid_t uint32 type Stat_t struct { Dev uint32 Pad1 [3]uint32 Ino uint64 Mode uint32 Nlink uint32 Uid uint32 Gid uint32 Rdev uint32 Pad2 [3]uint32 Size int64 Atim Timespec Mtim Timespec Ctim Timespec Blksize uint32 Pad4 uint32 Blocks int64 } type Statfs_t struct { Type int64 Bsize int64 Frsize int64 Blocks uint64 Bfree uint64 Files uint64 Ffree uint64 Bavail uint64 Fsid Fsid Namelen int64 Flags int64 Spare [5]int64 } type Dirent struct { Ino uint64 Off int64 Reclen uint16 Type uint8 Name [256]int8 Pad_cgo_0 [5]byte } type Fsid struct { X__val [2]int32 } type Flock_t struct { Type int16 Whence int16 Pad_cgo_0 [4]byte Start int64 Len int64 Pid int32 Pad_cgo_1 [4]byte } type FscryptPolicy struct { Version uint8 Contents_encryption_mode uint8 Filenames_encryption_mode uint8 Flags uint8 Master_key_descriptor [8]uint8 } type FscryptKey struct { Mode uint32 Raw [64]uint8 Size uint32 } type KeyctlDHParams struct { Private int32 Prime int32 Base int32 } const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 FADV_SEQUENTIAL = 0x2 FADV_WILLNEED = 0x3 FADV_DONTNEED = 0x4 FADV_NOREUSE = 0x5 ) type RawSockaddrInet4 struct { Family uint16 Port uint16 Addr [4]byte /* in_addr */ Zero [8]uint8 } type RawSockaddrInet6 struct { Family uint16 Port uint16 Flowinfo uint32 Addr [16]byte /* in6_addr */ Scope_id uint32 } type RawSockaddrUnix struct { Family uint16 Path [108]int8 } type RawSockaddrLinklayer struct { Family uint16 Protocol uint16 Ifindex int32 Hatype uint16 Pkttype uint8 Halen uint8 Addr [8]uint8 } type RawSockaddrNetlink struct { Family uint16 Pad uint16 Pid uint32 Groups uint32 } type RawSockaddrHCI struct { Family uint16 Dev uint16 Channel uint16 } type RawSockaddrCAN struct { Family uint16 Pad_cgo_0 [2]byte Ifindex int32 Addr [8]byte } type RawSockaddrALG struct { Family uint16 Type [14]uint8 Feat uint32 Mask uint32 Name [64]uint8 } type RawSockaddrVM struct { Family uint16 Reserved1 uint16 Port uint32 Cid uint32 Zero [4]uint8 } type RawSockaddr struct { Family uint16 Data [14]int8 } type RawSockaddrAny struct { Addr RawSockaddr Pad [96]int8 } type _Socklen uint32 type Linger struct { Onoff int32 Linger int32 } type Iovec struct { Base *byte Len uint64 } type IPMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } type IPMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } type IPv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } type PacketMreq struct { Ifindex int32 Type uint16 Alen uint16 Address [8]uint8 } type Msghdr struct { Name *byte Namelen uint32 Pad_cgo_0 [4]byte Iov *Iovec Iovlen uint64 Control *byte Controllen uint64 Flags int32 Pad_cgo_1 [4]byte } type Cmsghdr struct { Len uint64 Level int32 Type int32 } type Inet4Pktinfo struct { Ifindex int32 Spec_dst [4]byte /* in_addr */ Addr [4]byte /* in_addr */ } type Inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } type IPv6MTUInfo struct { Addr RawSockaddrInet6 Mtu uint32 } type ICMPv6Filter struct { Data [8]uint32 } type Ucred struct { Pid int32 Uid uint32 Gid uint32 } type TCPInfo struct { State uint8 Ca_state uint8 Retransmits uint8 Probes uint8 Backoff uint8 Options uint8 Pad_cgo_0 [2]byte Rto uint32 Ato uint32 Snd_mss uint32 Rcv_mss uint32 Unacked uint32 Sacked uint32 Lost uint32 Retrans uint32 Fackets uint32 Last_data_sent uint32 Last_ack_sent uint32 Last_data_recv uint32 Last_ack_recv uint32 Pmtu uint32 Rcv_ssthresh uint32 Rtt uint32 Rttvar uint32 Snd_ssthresh uint32 Snd_cwnd uint32 Advmss uint32 Reordering uint32 Rcv_rtt uint32 Rcv_space uint32 Total_retrans uint32 } const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c SizeofSockaddrAny = 0x70 SizeofSockaddrUnix = 0x6e SizeofSockaddrLinklayer = 0x14 SizeofSockaddrNetlink = 0xc SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 SizeofPacketMreq = 0x10 SizeofMsghdr = 0x38 SizeofCmsghdr = 0x10 SizeofInet4Pktinfo = 0xc SizeofInet6Pktinfo = 0x14 SizeofIPv6MTUInfo = 0x20 SizeofICMPv6Filter = 0x20 SizeofUcred = 0xc SizeofTCPInfo = 0x68 ) const ( IFA_UNSPEC = 0x0 IFA_ADDRESS = 0x1 IFA_LOCAL = 0x2 IFA_LABEL = 0x3 IFA_BROADCAST = 0x4 IFA_ANYCAST = 0x5 IFA_CACHEINFO = 0x6 IFA_MULTICAST = 0x7 IFLA_UNSPEC = 0x0 IFLA_ADDRESS = 0x1 IFLA_BROADCAST = 0x2 IFLA_IFNAME = 0x3 IFLA_MTU = 0x4 IFLA_LINK = 0x5 IFLA_QDISC = 0x6 IFLA_STATS = 0x7 IFLA_COST = 0x8 IFLA_PRIORITY = 0x9 IFLA_MASTER = 0xa IFLA_WIRELESS = 0xb IFLA_PROTINFO = 0xc IFLA_TXQLEN = 0xd IFLA_MAP = 0xe IFLA_WEIGHT = 0xf IFLA_OPERSTATE = 0x10 IFLA_LINKMODE = 0x11 IFLA_LINKINFO = 0x12 IFLA_NET_NS_PID = 0x13 IFLA_IFALIAS = 0x14 IFLA_MAX = 0x2c RT_SCOPE_UNIVERSE = 0x0 RT_SCOPE_SITE = 0xc8 RT_SCOPE_LINK = 0xfd RT_SCOPE_HOST = 0xfe RT_SCOPE_NOWHERE = 0xff RT_TABLE_UNSPEC = 0x0 RT_TABLE_COMPAT = 0xfc RT_TABLE_DEFAULT = 0xfd RT_TABLE_MAIN = 0xfe RT_TABLE_LOCAL = 0xff RT_TABLE_MAX = 0xffffffff RTA_UNSPEC = 0x0 RTA_DST = 0x1 RTA_SRC = 0x2 RTA_IIF = 0x3 RTA_OIF = 0x4 RTA_GATEWAY = 0x5 RTA_PRIORITY = 0x6 RTA_PREFSRC = 0x7 RTA_METRICS = 0x8 RTA_MULTIPATH = 0x9 RTA_FLOW = 0xb RTA_CACHEINFO = 0xc RTA_TABLE = 0xf RTN_UNSPEC = 0x0 RTN_UNICAST = 0x1 RTN_LOCAL = 0x2 RTN_BROADCAST = 0x3 RTN_ANYCAST = 0x4 RTN_MULTICAST = 0x5 RTN_BLACKHOLE = 0x6 RTN_UNREACHABLE = 0x7 RTN_PROHIBIT = 0x8 RTN_THROW = 0x9 RTN_NAT = 0xa RTN_XRESOLVE = 0xb RTNLGRP_NONE = 0x0 RTNLGRP_LINK = 0x1 RTNLGRP_NOTIFY = 0x2 RTNLGRP_NEIGH = 0x3 RTNLGRP_TC = 0x4 RTNLGRP_IPV4_IFADDR = 0x5 RTNLGRP_IPV4_MROUTE = 0x6 RTNLGRP_IPV4_ROUTE = 0x7 RTNLGRP_IPV4_RULE = 0x8 RTNLGRP_IPV6_IFADDR = 0x9 RTNLGRP_IPV6_MROUTE = 0xa RTNLGRP_IPV6_ROUTE = 0xb RTNLGRP_IPV6_IFINFO = 0xc RTNLGRP_IPV6_PREFIX = 0x12 RTNLGRP_IPV6_RULE = 0x13 RTNLGRP_ND_USEROPT = 0x14 SizeofNlMsghdr = 0x10 SizeofNlMsgerr = 0x14 SizeofRtGenmsg = 0x1 SizeofNlAttr = 0x4 SizeofRtAttr = 0x4 SizeofIfInfomsg = 0x10 SizeofIfAddrmsg = 0x8 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 ) type NlMsghdr struct { Len uint32 Type uint16 Flags uint16 Seq uint32 Pid uint32 } type NlMsgerr struct { Error int32 Msg NlMsghdr } type RtGenmsg struct { Family uint8 } type NlAttr struct { Len uint16 Type uint16 } type RtAttr struct { Len uint16 Type uint16 } type IfInfomsg struct { Family uint8 X__ifi_pad uint8 Type uint16 Index int32 Flags uint32 Change uint32 } type IfAddrmsg struct { Family uint8 Prefixlen uint8 Flags uint8 Scope uint8 Index uint32 } type RtMsg struct { Family uint8 Dst_len uint8 Src_len uint8 Tos uint8 Table uint8 Protocol uint8 Scope uint8 Type uint8 Flags uint32 } type RtNexthop struct { Len uint16 Flags uint8 Hops uint8 Ifindex int32 } const ( SizeofSockFilter = 0x8 SizeofSockFprog = 0x10 ) type SockFilter struct { Code uint16 Jt uint8 Jf uint8 K uint32 } type SockFprog struct { Len uint16 Pad_cgo_0 [6]byte Filter *SockFilter } type InotifyEvent struct { Wd int32 Mask uint32 Cookie uint32 Len uint32 } const SizeofInotifyEvent = 0x10 type PtraceRegs struct { Regs [32]uint64 Lo uint64 Hi uint64 Epc uint64 Badvaddr uint64 Status uint64 Cause uint64 } type FdSet struct { Bits [16]int64 } type Sysinfo_t struct { Uptime int64 Loads [3]uint64 Totalram uint64 Freeram uint64 Sharedram uint64 Bufferram uint64 Totalswap uint64 Freeswap uint64 Procs uint16 Pad uint16 Pad_cgo_0 [4]byte Totalhigh uint64 Freehigh uint64 Unit uint32 X_f [0]int8 Pad_cgo_1 [4]byte } type Utsname struct { Sysname [65]byte Nodename [65]byte Release [65]byte Version [65]byte Machine [65]byte Domainname [65]byte } type Ustat_t struct { Tfree int32 Pad_cgo_0 [4]byte Tinode uint64 Fname [6]int8 Fpack [6]int8 Pad_cgo_1 [4]byte } type EpollEvent struct { Events uint32 Fd int32 Pad int32 } const ( AT_FDCWD = -0x64 AT_REMOVEDIR = 0x200 AT_SYMLINK_FOLLOW = 0x400 AT_SYMLINK_NOFOLLOW = 0x100 ) type PollFd struct { Fd int32 Events int16 Revents int16 } const ( POLLIN = 0x1 POLLPRI = 0x2 POLLOUT = 0x4 POLLRDHUP = 0x2000 POLLERR = 0x8 POLLHUP = 0x10 POLLNVAL = 0x20 ) type Sigset_t struct { X__val [16]uint64 } const RNDGETENTCNT = 0x40045200 const PERF_IOC_FLAG_GROUP = 0x1 type Termios struct { Iflag uint32 Oflag uint32 Cflag uint32 Lflag uint32 Line uint8 Cc [23]uint8 Ispeed uint32 Ospeed uint32 } type Winsize struct { Row uint16 Col uint16 Xpixel uint16 Ypixel uint16 } type Taskstats struct { Version uint16 Pad_cgo_0 [2]byte Ac_exitcode uint32 Ac_flag uint8 Ac_nice uint8 Pad_cgo_1 [6]byte Cpu_count uint64 Cpu_delay_total uint64 Blkio_count uint64 Blkio_delay_total uint64 Swapin_count uint64 Swapin_delay_total uint64 Cpu_run_real_total uint64 Cpu_run_virtual_total uint64 Ac_comm [32]int8 Ac_sched uint8 Ac_pad [3]uint8 Pad_cgo_2 [4]byte Ac_uid uint32 Ac_gid uint32 Ac_pid uint32 Ac_ppid uint32 Ac_btime uint32 Pad_cgo_3 [4]byte Ac_etime uint64 Ac_utime uint64 Ac_stime uint64 Ac_minflt uint64 Ac_majflt uint64 Coremem uint64 Virtmem uint64 Hiwater_rss uint64 Hiwater_vm uint64 Read_char uint64 Write_char uint64 Read_syscalls uint64 Write_syscalls uint64 Read_bytes uint64 Write_bytes uint64 Cancelled_write_bytes uint64 Nvcsw uint64 Nivcsw uint64 Ac_utimescaled uint64 Ac_stimescaled uint64 Cpu_scaled_run_real_total uint64 Freepages_count uint64 Freepages_delay_total uint64 } const ( TASKSTATS_CMD_UNSPEC = 0x0 TASKSTATS_CMD_GET = 0x1 TASKSTATS_CMD_NEW = 0x2 TASKSTATS_TYPE_UNSPEC = 0x0 TASKSTATS_TYPE_PID = 0x1 TASKSTATS_TYPE_TGID = 0x2 TASKSTATS_TYPE_STATS = 0x3 TASKSTATS_TYPE_AGGR_PID = 0x4 TASKSTATS_TYPE_AGGR_TGID = 0x5 TASKSTATS_TYPE_NULL = 0x6 TASKSTATS_CMD_ATTR_UNSPEC = 0x0 TASKSTATS_CMD_ATTR_PID = 0x1 TASKSTATS_CMD_ATTR_TGID = 0x2 TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 ) type Genlmsghdr struct { Cmd uint8 Version uint8 Reserved uint16 } const ( CTRL_CMD_UNSPEC = 0x0 CTRL_CMD_NEWFAMILY = 0x1 CTRL_CMD_DELFAMILY = 0x2 CTRL_CMD_GETFAMILY = 0x3 CTRL_CMD_NEWOPS = 0x4 CTRL_CMD_DELOPS = 0x5 CTRL_CMD_GETOPS = 0x6 CTRL_CMD_NEWMCAST_GRP = 0x7 CTRL_CMD_DELMCAST_GRP = 0x8 CTRL_CMD_GETMCAST_GRP = 0x9 CTRL_ATTR_UNSPEC = 0x0 CTRL_ATTR_FAMILY_ID = 0x1 CTRL_ATTR_FAMILY_NAME = 0x2 CTRL_ATTR_VERSION = 0x3 CTRL_ATTR_HDRSIZE = 0x4 CTRL_ATTR_MAXATTR = 0x5 CTRL_ATTR_OPS = 0x6 CTRL_ATTR_MCAST_GROUPS = 0x7 CTRL_ATTR_OP_UNSPEC = 0x0 CTRL_ATTR_OP_ID = 0x1 CTRL_ATTR_OP_FLAGS = 0x2 CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 CTRL_ATTR_MCAST_GRP_NAME = 0x1 CTRL_ATTR_MCAST_GRP_ID = 0x2 ) ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go ================================================ // cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build mipsle,linux package unix const ( sizeofPtr = 0x4 sizeofShort = 0x2 sizeofInt = 0x4 sizeofLong = 0x4 sizeofLongLong = 0x8 PathMax = 0x1000 ) type ( _C_short int16 _C_int int32 _C_long int32 _C_long_long int64 ) type Timespec struct { Sec int32 Nsec int32 } type Timeval struct { Sec int32 Usec int32 } type Timex struct { Modes uint32 Offset int32 Freq int32 Maxerror int32 Esterror int32 Status int32 Constant int32 Precision int32 Tolerance int32 Time Timeval Tick int32 Ppsfreq int32 Jitter int32 Shift int32 Stabil int32 Jitcnt int32 Calcnt int32 Errcnt int32 Stbcnt int32 Tai int32 Pad_cgo_0 [44]byte } type Time_t int32 type Tms struct { Utime int32 Stime int32 Cutime int32 Cstime int32 } type Utimbuf struct { Actime int32 Modtime int32 } type Rusage struct { Utime Timeval Stime Timeval Maxrss int32 Ixrss int32 Idrss int32 Isrss int32 Minflt int32 Majflt int32 Nswap int32 Inblock int32 Oublock int32 Msgsnd int32 Msgrcv int32 Nsignals int32 Nvcsw int32 Nivcsw int32 } type Rlimit struct { Cur uint64 Max uint64 } type _Gid_t uint32 type Stat_t struct { Dev uint32 Pad1 [3]int32 Ino uint64 Mode uint32 Nlink uint32 Uid uint32 Gid uint32 Rdev uint32 Pad2 [3]int32 Size int64 Atim Timespec Mtim Timespec Ctim Timespec Blksize int32 Pad4 int32 Blocks int64 Pad5 [14]int32 } type Statfs_t struct { Type int32 Bsize int32 Frsize int32 Pad_cgo_0 [4]byte Blocks uint64 Bfree uint64 Files uint64 Ffree uint64 Bavail uint64 Fsid Fsid Namelen int32 Flags int32 Spare [5]int32 Pad_cgo_1 [4]byte } type Dirent struct { Ino uint64 Off int64 Reclen uint16 Type uint8 Name [256]int8 Pad_cgo_0 [5]byte } type Fsid struct { X__val [2]int32 } type Flock_t struct { Type int16 Whence int16 Pad_cgo_0 [4]byte Start int64 Len int64 Pid int32 Pad_cgo_1 [4]byte } type FscryptPolicy struct { Version uint8 Contents_encryption_mode uint8 Filenames_encryption_mode uint8 Flags uint8 Master_key_descriptor [8]uint8 } type FscryptKey struct { Mode uint32 Raw [64]uint8 Size uint32 } type KeyctlDHParams struct { Private int32 Prime int32 Base int32 } const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 FADV_SEQUENTIAL = 0x2 FADV_WILLNEED = 0x3 FADV_DONTNEED = 0x4 FADV_NOREUSE = 0x5 ) type RawSockaddrInet4 struct { Family uint16 Port uint16 Addr [4]byte /* in_addr */ Zero [8]uint8 } type RawSockaddrInet6 struct { Family uint16 Port uint16 Flowinfo uint32 Addr [16]byte /* in6_addr */ Scope_id uint32 } type RawSockaddrUnix struct { Family uint16 Path [108]int8 } type RawSockaddrLinklayer struct { Family uint16 Protocol uint16 Ifindex int32 Hatype uint16 Pkttype uint8 Halen uint8 Addr [8]uint8 } type RawSockaddrNetlink struct { Family uint16 Pad uint16 Pid uint32 Groups uint32 } type RawSockaddrHCI struct { Family uint16 Dev uint16 Channel uint16 } type RawSockaddrCAN struct { Family uint16 Pad_cgo_0 [2]byte Ifindex int32 Addr [8]byte } type RawSockaddrALG struct { Family uint16 Type [14]uint8 Feat uint32 Mask uint32 Name [64]uint8 } type RawSockaddrVM struct { Family uint16 Reserved1 uint16 Port uint32 Cid uint32 Zero [4]uint8 } type RawSockaddr struct { Family uint16 Data [14]int8 } type RawSockaddrAny struct { Addr RawSockaddr Pad [96]int8 } type _Socklen uint32 type Linger struct { Onoff int32 Linger int32 } type Iovec struct { Base *byte Len uint32 } type IPMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } type IPMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } type IPv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } type PacketMreq struct { Ifindex int32 Type uint16 Alen uint16 Address [8]uint8 } type Msghdr struct { Name *byte Namelen uint32 Iov *Iovec Iovlen uint32 Control *byte Controllen uint32 Flags int32 } type Cmsghdr struct { Len uint32 Level int32 Type int32 } type Inet4Pktinfo struct { Ifindex int32 Spec_dst [4]byte /* in_addr */ Addr [4]byte /* in_addr */ } type Inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } type IPv6MTUInfo struct { Addr RawSockaddrInet6 Mtu uint32 } type ICMPv6Filter struct { Data [8]uint32 } type Ucred struct { Pid int32 Uid uint32 Gid uint32 } type TCPInfo struct { State uint8 Ca_state uint8 Retransmits uint8 Probes uint8 Backoff uint8 Options uint8 Pad_cgo_0 [2]byte Rto uint32 Ato uint32 Snd_mss uint32 Rcv_mss uint32 Unacked uint32 Sacked uint32 Lost uint32 Retrans uint32 Fackets uint32 Last_data_sent uint32 Last_ack_sent uint32 Last_data_recv uint32 Last_ack_recv uint32 Pmtu uint32 Rcv_ssthresh uint32 Rtt uint32 Rttvar uint32 Snd_ssthresh uint32 Snd_cwnd uint32 Advmss uint32 Reordering uint32 Rcv_rtt uint32 Rcv_space uint32 Total_retrans uint32 } const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c SizeofSockaddrAny = 0x70 SizeofSockaddrUnix = 0x6e SizeofSockaddrLinklayer = 0x14 SizeofSockaddrNetlink = 0xc SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 SizeofPacketMreq = 0x10 SizeofMsghdr = 0x1c SizeofCmsghdr = 0xc SizeofInet4Pktinfo = 0xc SizeofInet6Pktinfo = 0x14 SizeofIPv6MTUInfo = 0x20 SizeofICMPv6Filter = 0x20 SizeofUcred = 0xc SizeofTCPInfo = 0x68 ) const ( IFA_UNSPEC = 0x0 IFA_ADDRESS = 0x1 IFA_LOCAL = 0x2 IFA_LABEL = 0x3 IFA_BROADCAST = 0x4 IFA_ANYCAST = 0x5 IFA_CACHEINFO = 0x6 IFA_MULTICAST = 0x7 IFLA_UNSPEC = 0x0 IFLA_ADDRESS = 0x1 IFLA_BROADCAST = 0x2 IFLA_IFNAME = 0x3 IFLA_MTU = 0x4 IFLA_LINK = 0x5 IFLA_QDISC = 0x6 IFLA_STATS = 0x7 IFLA_COST = 0x8 IFLA_PRIORITY = 0x9 IFLA_MASTER = 0xa IFLA_WIRELESS = 0xb IFLA_PROTINFO = 0xc IFLA_TXQLEN = 0xd IFLA_MAP = 0xe IFLA_WEIGHT = 0xf IFLA_OPERSTATE = 0x10 IFLA_LINKMODE = 0x11 IFLA_LINKINFO = 0x12 IFLA_NET_NS_PID = 0x13 IFLA_IFALIAS = 0x14 IFLA_MAX = 0x2c RT_SCOPE_UNIVERSE = 0x0 RT_SCOPE_SITE = 0xc8 RT_SCOPE_LINK = 0xfd RT_SCOPE_HOST = 0xfe RT_SCOPE_NOWHERE = 0xff RT_TABLE_UNSPEC = 0x0 RT_TABLE_COMPAT = 0xfc RT_TABLE_DEFAULT = 0xfd RT_TABLE_MAIN = 0xfe RT_TABLE_LOCAL = 0xff RT_TABLE_MAX = 0xffffffff RTA_UNSPEC = 0x0 RTA_DST = 0x1 RTA_SRC = 0x2 RTA_IIF = 0x3 RTA_OIF = 0x4 RTA_GATEWAY = 0x5 RTA_PRIORITY = 0x6 RTA_PREFSRC = 0x7 RTA_METRICS = 0x8 RTA_MULTIPATH = 0x9 RTA_FLOW = 0xb RTA_CACHEINFO = 0xc RTA_TABLE = 0xf RTN_UNSPEC = 0x0 RTN_UNICAST = 0x1 RTN_LOCAL = 0x2 RTN_BROADCAST = 0x3 RTN_ANYCAST = 0x4 RTN_MULTICAST = 0x5 RTN_BLACKHOLE = 0x6 RTN_UNREACHABLE = 0x7 RTN_PROHIBIT = 0x8 RTN_THROW = 0x9 RTN_NAT = 0xa RTN_XRESOLVE = 0xb RTNLGRP_NONE = 0x0 RTNLGRP_LINK = 0x1 RTNLGRP_NOTIFY = 0x2 RTNLGRP_NEIGH = 0x3 RTNLGRP_TC = 0x4 RTNLGRP_IPV4_IFADDR = 0x5 RTNLGRP_IPV4_MROUTE = 0x6 RTNLGRP_IPV4_ROUTE = 0x7 RTNLGRP_IPV4_RULE = 0x8 RTNLGRP_IPV6_IFADDR = 0x9 RTNLGRP_IPV6_MROUTE = 0xa RTNLGRP_IPV6_ROUTE = 0xb RTNLGRP_IPV6_IFINFO = 0xc RTNLGRP_IPV6_PREFIX = 0x12 RTNLGRP_IPV6_RULE = 0x13 RTNLGRP_ND_USEROPT = 0x14 SizeofNlMsghdr = 0x10 SizeofNlMsgerr = 0x14 SizeofRtGenmsg = 0x1 SizeofNlAttr = 0x4 SizeofRtAttr = 0x4 SizeofIfInfomsg = 0x10 SizeofIfAddrmsg = 0x8 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 ) type NlMsghdr struct { Len uint32 Type uint16 Flags uint16 Seq uint32 Pid uint32 } type NlMsgerr struct { Error int32 Msg NlMsghdr } type RtGenmsg struct { Family uint8 } type NlAttr struct { Len uint16 Type uint16 } type RtAttr struct { Len uint16 Type uint16 } type IfInfomsg struct { Family uint8 X__ifi_pad uint8 Type uint16 Index int32 Flags uint32 Change uint32 } type IfAddrmsg struct { Family uint8 Prefixlen uint8 Flags uint8 Scope uint8 Index uint32 } type RtMsg struct { Family uint8 Dst_len uint8 Src_len uint8 Tos uint8 Table uint8 Protocol uint8 Scope uint8 Type uint8 Flags uint32 } type RtNexthop struct { Len uint16 Flags uint8 Hops uint8 Ifindex int32 } const ( SizeofSockFilter = 0x8 SizeofSockFprog = 0x8 ) type SockFilter struct { Code uint16 Jt uint8 Jf uint8 K uint32 } type SockFprog struct { Len uint16 Pad_cgo_0 [2]byte Filter *SockFilter } type InotifyEvent struct { Wd int32 Mask uint32 Cookie uint32 Len uint32 } const SizeofInotifyEvent = 0x10 type PtraceRegs struct { Regs [32]uint64 Lo uint64 Hi uint64 Epc uint64 Badvaddr uint64 Status uint64 Cause uint64 } type FdSet struct { Bits [32]int32 } type Sysinfo_t struct { Uptime int32 Loads [3]uint32 Totalram uint32 Freeram uint32 Sharedram uint32 Bufferram uint32 Totalswap uint32 Freeswap uint32 Procs uint16 Pad uint16 Totalhigh uint32 Freehigh uint32 Unit uint32 X_f [8]int8 } type Utsname struct { Sysname [65]byte Nodename [65]byte Release [65]byte Version [65]byte Machine [65]byte Domainname [65]byte } type Ustat_t struct { Tfree int32 Tinode uint32 Fname [6]int8 Fpack [6]int8 } type EpollEvent struct { Events uint32 PadFd int32 Fd int32 Pad int32 } const ( AT_FDCWD = -0x64 AT_REMOVEDIR = 0x200 AT_SYMLINK_FOLLOW = 0x400 AT_SYMLINK_NOFOLLOW = 0x100 ) type PollFd struct { Fd int32 Events int16 Revents int16 } const ( POLLIN = 0x1 POLLPRI = 0x2 POLLOUT = 0x4 POLLRDHUP = 0x2000 POLLERR = 0x8 POLLHUP = 0x10 POLLNVAL = 0x20 ) type Sigset_t struct { X__val [32]uint32 } const RNDGETENTCNT = 0x40045200 const PERF_IOC_FLAG_GROUP = 0x1 type Termios struct { Iflag uint32 Oflag uint32 Cflag uint32 Lflag uint32 Line uint8 Cc [23]uint8 Ispeed uint32 Ospeed uint32 } type Winsize struct { Row uint16 Col uint16 Xpixel uint16 Ypixel uint16 } type Taskstats struct { Version uint16 Pad_cgo_0 [2]byte Ac_exitcode uint32 Ac_flag uint8 Ac_nice uint8 Pad_cgo_1 [6]byte Cpu_count uint64 Cpu_delay_total uint64 Blkio_count uint64 Blkio_delay_total uint64 Swapin_count uint64 Swapin_delay_total uint64 Cpu_run_real_total uint64 Cpu_run_virtual_total uint64 Ac_comm [32]int8 Ac_sched uint8 Ac_pad [3]uint8 Pad_cgo_2 [4]byte Ac_uid uint32 Ac_gid uint32 Ac_pid uint32 Ac_ppid uint32 Ac_btime uint32 Pad_cgo_3 [4]byte Ac_etime uint64 Ac_utime uint64 Ac_stime uint64 Ac_minflt uint64 Ac_majflt uint64 Coremem uint64 Virtmem uint64 Hiwater_rss uint64 Hiwater_vm uint64 Read_char uint64 Write_char uint64 Read_syscalls uint64 Write_syscalls uint64 Read_bytes uint64 Write_bytes uint64 Cancelled_write_bytes uint64 Nvcsw uint64 Nivcsw uint64 Ac_utimescaled uint64 Ac_stimescaled uint64 Cpu_scaled_run_real_total uint64 Freepages_count uint64 Freepages_delay_total uint64 } const ( TASKSTATS_CMD_UNSPEC = 0x0 TASKSTATS_CMD_GET = 0x1 TASKSTATS_CMD_NEW = 0x2 TASKSTATS_TYPE_UNSPEC = 0x0 TASKSTATS_TYPE_PID = 0x1 TASKSTATS_TYPE_TGID = 0x2 TASKSTATS_TYPE_STATS = 0x3 TASKSTATS_TYPE_AGGR_PID = 0x4 TASKSTATS_TYPE_AGGR_TGID = 0x5 TASKSTATS_TYPE_NULL = 0x6 TASKSTATS_CMD_ATTR_UNSPEC = 0x0 TASKSTATS_CMD_ATTR_PID = 0x1 TASKSTATS_CMD_ATTR_TGID = 0x2 TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 ) type Genlmsghdr struct { Cmd uint8 Version uint8 Reserved uint16 } const ( CTRL_CMD_UNSPEC = 0x0 CTRL_CMD_NEWFAMILY = 0x1 CTRL_CMD_DELFAMILY = 0x2 CTRL_CMD_GETFAMILY = 0x3 CTRL_CMD_NEWOPS = 0x4 CTRL_CMD_DELOPS = 0x5 CTRL_CMD_GETOPS = 0x6 CTRL_CMD_NEWMCAST_GRP = 0x7 CTRL_CMD_DELMCAST_GRP = 0x8 CTRL_CMD_GETMCAST_GRP = 0x9 CTRL_ATTR_UNSPEC = 0x0 CTRL_ATTR_FAMILY_ID = 0x1 CTRL_ATTR_FAMILY_NAME = 0x2 CTRL_ATTR_VERSION = 0x3 CTRL_ATTR_HDRSIZE = 0x4 CTRL_ATTR_MAXATTR = 0x5 CTRL_ATTR_OPS = 0x6 CTRL_ATTR_MCAST_GROUPS = 0x7 CTRL_ATTR_OP_UNSPEC = 0x0 CTRL_ATTR_OP_ID = 0x1 CTRL_ATTR_OP_FLAGS = 0x2 CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 CTRL_ATTR_MCAST_GRP_NAME = 0x1 CTRL_ATTR_MCAST_GRP_ID = 0x2 ) ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go ================================================ // cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build ppc64,linux package unix const ( sizeofPtr = 0x8 sizeofShort = 0x2 sizeofInt = 0x4 sizeofLong = 0x8 sizeofLongLong = 0x8 PathMax = 0x1000 ) type ( _C_short int16 _C_int int32 _C_long int64 _C_long_long int64 ) type Timespec struct { Sec int64 Nsec int64 } type Timeval struct { Sec int64 Usec int64 } type Timex struct { Modes uint32 Pad_cgo_0 [4]byte Offset int64 Freq int64 Maxerror int64 Esterror int64 Status int32 Pad_cgo_1 [4]byte Constant int64 Precision int64 Tolerance int64 Time Timeval Tick int64 Ppsfreq int64 Jitter int64 Shift int32 Pad_cgo_2 [4]byte Stabil int64 Jitcnt int64 Calcnt int64 Errcnt int64 Stbcnt int64 Tai int32 Pad_cgo_3 [44]byte } type Time_t int64 type Tms struct { Utime int64 Stime int64 Cutime int64 Cstime int64 } type Utimbuf struct { Actime int64 Modtime int64 } type Rusage struct { Utime Timeval Stime Timeval Maxrss int64 Ixrss int64 Idrss int64 Isrss int64 Minflt int64 Majflt int64 Nswap int64 Inblock int64 Oublock int64 Msgsnd int64 Msgrcv int64 Nsignals int64 Nvcsw int64 Nivcsw int64 } type Rlimit struct { Cur uint64 Max uint64 } type _Gid_t uint32 type Stat_t struct { Dev uint64 Ino uint64 Nlink uint64 Mode uint32 Uid uint32 Gid uint32 X__pad2 int32 Rdev uint64 Size int64 Blksize int64 Blocks int64 Atim Timespec Mtim Timespec Ctim Timespec _ uint64 _ uint64 _ uint64 } type Statfs_t struct { Type int64 Bsize int64 Blocks uint64 Bfree uint64 Bavail uint64 Files uint64 Ffree uint64 Fsid Fsid Namelen int64 Frsize int64 Flags int64 Spare [4]int64 } type Dirent struct { Ino uint64 Off int64 Reclen uint16 Type uint8 Name [256]uint8 Pad_cgo_0 [5]byte } type Fsid struct { X__val [2]int32 } type Flock_t struct { Type int16 Whence int16 Pad_cgo_0 [4]byte Start int64 Len int64 Pid int32 Pad_cgo_1 [4]byte } type FscryptPolicy struct { Version uint8 Contents_encryption_mode uint8 Filenames_encryption_mode uint8 Flags uint8 Master_key_descriptor [8]uint8 } type FscryptKey struct { Mode uint32 Raw [64]uint8 Size uint32 } type KeyctlDHParams struct { Private int32 Prime int32 Base int32 } const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 FADV_SEQUENTIAL = 0x2 FADV_WILLNEED = 0x3 FADV_DONTNEED = 0x4 FADV_NOREUSE = 0x5 ) type RawSockaddrInet4 struct { Family uint16 Port uint16 Addr [4]byte /* in_addr */ Zero [8]uint8 } type RawSockaddrInet6 struct { Family uint16 Port uint16 Flowinfo uint32 Addr [16]byte /* in6_addr */ Scope_id uint32 } type RawSockaddrUnix struct { Family uint16 Path [108]int8 } type RawSockaddrLinklayer struct { Family uint16 Protocol uint16 Ifindex int32 Hatype uint16 Pkttype uint8 Halen uint8 Addr [8]uint8 } type RawSockaddrNetlink struct { Family uint16 Pad uint16 Pid uint32 Groups uint32 } type RawSockaddrHCI struct { Family uint16 Dev uint16 Channel uint16 } type RawSockaddrCAN struct { Family uint16 Pad_cgo_0 [2]byte Ifindex int32 Addr [8]byte } type RawSockaddrALG struct { Family uint16 Type [14]uint8 Feat uint32 Mask uint32 Name [64]uint8 } type RawSockaddrVM struct { Family uint16 Reserved1 uint16 Port uint32 Cid uint32 Zero [4]uint8 } type RawSockaddr struct { Family uint16 Data [14]uint8 } type RawSockaddrAny struct { Addr RawSockaddr Pad [96]uint8 } type _Socklen uint32 type Linger struct { Onoff int32 Linger int32 } type Iovec struct { Base *byte Len uint64 } type IPMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } type IPMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } type IPv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } type PacketMreq struct { Ifindex int32 Type uint16 Alen uint16 Address [8]uint8 } type Msghdr struct { Name *byte Namelen uint32 Pad_cgo_0 [4]byte Iov *Iovec Iovlen uint64 Control *byte Controllen uint64 Flags int32 Pad_cgo_1 [4]byte } type Cmsghdr struct { Len uint64 Level int32 Type int32 } type Inet4Pktinfo struct { Ifindex int32 Spec_dst [4]byte /* in_addr */ Addr [4]byte /* in_addr */ } type Inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } type IPv6MTUInfo struct { Addr RawSockaddrInet6 Mtu uint32 } type ICMPv6Filter struct { Data [8]uint32 } type Ucred struct { Pid int32 Uid uint32 Gid uint32 } type TCPInfo struct { State uint8 Ca_state uint8 Retransmits uint8 Probes uint8 Backoff uint8 Options uint8 Pad_cgo_0 [2]byte Rto uint32 Ato uint32 Snd_mss uint32 Rcv_mss uint32 Unacked uint32 Sacked uint32 Lost uint32 Retrans uint32 Fackets uint32 Last_data_sent uint32 Last_ack_sent uint32 Last_data_recv uint32 Last_ack_recv uint32 Pmtu uint32 Rcv_ssthresh uint32 Rtt uint32 Rttvar uint32 Snd_ssthresh uint32 Snd_cwnd uint32 Advmss uint32 Reordering uint32 Rcv_rtt uint32 Rcv_space uint32 Total_retrans uint32 } const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c SizeofSockaddrAny = 0x70 SizeofSockaddrUnix = 0x6e SizeofSockaddrLinklayer = 0x14 SizeofSockaddrNetlink = 0xc SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 SizeofPacketMreq = 0x10 SizeofMsghdr = 0x38 SizeofCmsghdr = 0x10 SizeofInet4Pktinfo = 0xc SizeofInet6Pktinfo = 0x14 SizeofIPv6MTUInfo = 0x20 SizeofICMPv6Filter = 0x20 SizeofUcred = 0xc SizeofTCPInfo = 0x68 ) const ( IFA_UNSPEC = 0x0 IFA_ADDRESS = 0x1 IFA_LOCAL = 0x2 IFA_LABEL = 0x3 IFA_BROADCAST = 0x4 IFA_ANYCAST = 0x5 IFA_CACHEINFO = 0x6 IFA_MULTICAST = 0x7 IFLA_UNSPEC = 0x0 IFLA_ADDRESS = 0x1 IFLA_BROADCAST = 0x2 IFLA_IFNAME = 0x3 IFLA_MTU = 0x4 IFLA_LINK = 0x5 IFLA_QDISC = 0x6 IFLA_STATS = 0x7 IFLA_COST = 0x8 IFLA_PRIORITY = 0x9 IFLA_MASTER = 0xa IFLA_WIRELESS = 0xb IFLA_PROTINFO = 0xc IFLA_TXQLEN = 0xd IFLA_MAP = 0xe IFLA_WEIGHT = 0xf IFLA_OPERSTATE = 0x10 IFLA_LINKMODE = 0x11 IFLA_LINKINFO = 0x12 IFLA_NET_NS_PID = 0x13 IFLA_IFALIAS = 0x14 IFLA_MAX = 0x2c RT_SCOPE_UNIVERSE = 0x0 RT_SCOPE_SITE = 0xc8 RT_SCOPE_LINK = 0xfd RT_SCOPE_HOST = 0xfe RT_SCOPE_NOWHERE = 0xff RT_TABLE_UNSPEC = 0x0 RT_TABLE_COMPAT = 0xfc RT_TABLE_DEFAULT = 0xfd RT_TABLE_MAIN = 0xfe RT_TABLE_LOCAL = 0xff RT_TABLE_MAX = 0xffffffff RTA_UNSPEC = 0x0 RTA_DST = 0x1 RTA_SRC = 0x2 RTA_IIF = 0x3 RTA_OIF = 0x4 RTA_GATEWAY = 0x5 RTA_PRIORITY = 0x6 RTA_PREFSRC = 0x7 RTA_METRICS = 0x8 RTA_MULTIPATH = 0x9 RTA_FLOW = 0xb RTA_CACHEINFO = 0xc RTA_TABLE = 0xf RTN_UNSPEC = 0x0 RTN_UNICAST = 0x1 RTN_LOCAL = 0x2 RTN_BROADCAST = 0x3 RTN_ANYCAST = 0x4 RTN_MULTICAST = 0x5 RTN_BLACKHOLE = 0x6 RTN_UNREACHABLE = 0x7 RTN_PROHIBIT = 0x8 RTN_THROW = 0x9 RTN_NAT = 0xa RTN_XRESOLVE = 0xb RTNLGRP_NONE = 0x0 RTNLGRP_LINK = 0x1 RTNLGRP_NOTIFY = 0x2 RTNLGRP_NEIGH = 0x3 RTNLGRP_TC = 0x4 RTNLGRP_IPV4_IFADDR = 0x5 RTNLGRP_IPV4_MROUTE = 0x6 RTNLGRP_IPV4_ROUTE = 0x7 RTNLGRP_IPV4_RULE = 0x8 RTNLGRP_IPV6_IFADDR = 0x9 RTNLGRP_IPV6_MROUTE = 0xa RTNLGRP_IPV6_ROUTE = 0xb RTNLGRP_IPV6_IFINFO = 0xc RTNLGRP_IPV6_PREFIX = 0x12 RTNLGRP_IPV6_RULE = 0x13 RTNLGRP_ND_USEROPT = 0x14 SizeofNlMsghdr = 0x10 SizeofNlMsgerr = 0x14 SizeofRtGenmsg = 0x1 SizeofNlAttr = 0x4 SizeofRtAttr = 0x4 SizeofIfInfomsg = 0x10 SizeofIfAddrmsg = 0x8 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 ) type NlMsghdr struct { Len uint32 Type uint16 Flags uint16 Seq uint32 Pid uint32 } type NlMsgerr struct { Error int32 Msg NlMsghdr } type RtGenmsg struct { Family uint8 } type NlAttr struct { Len uint16 Type uint16 } type RtAttr struct { Len uint16 Type uint16 } type IfInfomsg struct { Family uint8 X__ifi_pad uint8 Type uint16 Index int32 Flags uint32 Change uint32 } type IfAddrmsg struct { Family uint8 Prefixlen uint8 Flags uint8 Scope uint8 Index uint32 } type RtMsg struct { Family uint8 Dst_len uint8 Src_len uint8 Tos uint8 Table uint8 Protocol uint8 Scope uint8 Type uint8 Flags uint32 } type RtNexthop struct { Len uint16 Flags uint8 Hops uint8 Ifindex int32 } const ( SizeofSockFilter = 0x8 SizeofSockFprog = 0x10 ) type SockFilter struct { Code uint16 Jt uint8 Jf uint8 K uint32 } type SockFprog struct { Len uint16 Pad_cgo_0 [6]byte Filter *SockFilter } type InotifyEvent struct { Wd int32 Mask uint32 Cookie uint32 Len uint32 } const SizeofInotifyEvent = 0x10 type PtraceRegs struct { Gpr [32]uint64 Nip uint64 Msr uint64 Orig_gpr3 uint64 Ctr uint64 Link uint64 Xer uint64 Ccr uint64 Softe uint64 Trap uint64 Dar uint64 Dsisr uint64 Result uint64 } type FdSet struct { Bits [16]int64 } type Sysinfo_t struct { Uptime int64 Loads [3]uint64 Totalram uint64 Freeram uint64 Sharedram uint64 Bufferram uint64 Totalswap uint64 Freeswap uint64 Procs uint16 Pad uint16 Pad_cgo_0 [4]byte Totalhigh uint64 Freehigh uint64 Unit uint32 X_f [0]uint8 Pad_cgo_1 [4]byte } type Utsname struct { Sysname [65]byte Nodename [65]byte Release [65]byte Version [65]byte Machine [65]byte Domainname [65]byte } type Ustat_t struct { Tfree int32 Pad_cgo_0 [4]byte Tinode uint64 Fname [6]uint8 Fpack [6]uint8 Pad_cgo_1 [4]byte } type EpollEvent struct { Events uint32 X_padFd int32 Fd int32 Pad int32 } const ( AT_FDCWD = -0x64 AT_REMOVEDIR = 0x200 AT_SYMLINK_FOLLOW = 0x400 AT_SYMLINK_NOFOLLOW = 0x100 ) type PollFd struct { Fd int32 Events int16 Revents int16 } const ( POLLIN = 0x1 POLLPRI = 0x2 POLLOUT = 0x4 POLLRDHUP = 0x2000 POLLERR = 0x8 POLLHUP = 0x10 POLLNVAL = 0x20 ) type Sigset_t struct { X__val [16]uint64 } const RNDGETENTCNT = 0x40045200 const PERF_IOC_FLAG_GROUP = 0x1 type Termios struct { Iflag uint32 Oflag uint32 Cflag uint32 Lflag uint32 Cc [19]uint8 Line uint8 Ispeed uint32 Ospeed uint32 } type Winsize struct { Row uint16 Col uint16 Xpixel uint16 Ypixel uint16 } type Taskstats struct { Version uint16 Pad_cgo_0 [2]byte Ac_exitcode uint32 Ac_flag uint8 Ac_nice uint8 Pad_cgo_1 [6]byte Cpu_count uint64 Cpu_delay_total uint64 Blkio_count uint64 Blkio_delay_total uint64 Swapin_count uint64 Swapin_delay_total uint64 Cpu_run_real_total uint64 Cpu_run_virtual_total uint64 Ac_comm [32]uint8 Ac_sched uint8 Ac_pad [3]uint8 Pad_cgo_2 [4]byte Ac_uid uint32 Ac_gid uint32 Ac_pid uint32 Ac_ppid uint32 Ac_btime uint32 Pad_cgo_3 [4]byte Ac_etime uint64 Ac_utime uint64 Ac_stime uint64 Ac_minflt uint64 Ac_majflt uint64 Coremem uint64 Virtmem uint64 Hiwater_rss uint64 Hiwater_vm uint64 Read_char uint64 Write_char uint64 Read_syscalls uint64 Write_syscalls uint64 Read_bytes uint64 Write_bytes uint64 Cancelled_write_bytes uint64 Nvcsw uint64 Nivcsw uint64 Ac_utimescaled uint64 Ac_stimescaled uint64 Cpu_scaled_run_real_total uint64 Freepages_count uint64 Freepages_delay_total uint64 } const ( TASKSTATS_CMD_UNSPEC = 0x0 TASKSTATS_CMD_GET = 0x1 TASKSTATS_CMD_NEW = 0x2 TASKSTATS_TYPE_UNSPEC = 0x0 TASKSTATS_TYPE_PID = 0x1 TASKSTATS_TYPE_TGID = 0x2 TASKSTATS_TYPE_STATS = 0x3 TASKSTATS_TYPE_AGGR_PID = 0x4 TASKSTATS_TYPE_AGGR_TGID = 0x5 TASKSTATS_TYPE_NULL = 0x6 TASKSTATS_CMD_ATTR_UNSPEC = 0x0 TASKSTATS_CMD_ATTR_PID = 0x1 TASKSTATS_CMD_ATTR_TGID = 0x2 TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 ) type Genlmsghdr struct { Cmd uint8 Version uint8 Reserved uint16 } const ( CTRL_CMD_UNSPEC = 0x0 CTRL_CMD_NEWFAMILY = 0x1 CTRL_CMD_DELFAMILY = 0x2 CTRL_CMD_GETFAMILY = 0x3 CTRL_CMD_NEWOPS = 0x4 CTRL_CMD_DELOPS = 0x5 CTRL_CMD_GETOPS = 0x6 CTRL_CMD_NEWMCAST_GRP = 0x7 CTRL_CMD_DELMCAST_GRP = 0x8 CTRL_CMD_GETMCAST_GRP = 0x9 CTRL_ATTR_UNSPEC = 0x0 CTRL_ATTR_FAMILY_ID = 0x1 CTRL_ATTR_FAMILY_NAME = 0x2 CTRL_ATTR_VERSION = 0x3 CTRL_ATTR_HDRSIZE = 0x4 CTRL_ATTR_MAXATTR = 0x5 CTRL_ATTR_OPS = 0x6 CTRL_ATTR_MCAST_GROUPS = 0x7 CTRL_ATTR_OP_UNSPEC = 0x0 CTRL_ATTR_OP_ID = 0x1 CTRL_ATTR_OP_FLAGS = 0x2 CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 CTRL_ATTR_MCAST_GRP_NAME = 0x1 CTRL_ATTR_MCAST_GRP_ID = 0x2 ) ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go ================================================ // cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build ppc64le,linux package unix const ( sizeofPtr = 0x8 sizeofShort = 0x2 sizeofInt = 0x4 sizeofLong = 0x8 sizeofLongLong = 0x8 PathMax = 0x1000 ) type ( _C_short int16 _C_int int32 _C_long int64 _C_long_long int64 ) type Timespec struct { Sec int64 Nsec int64 } type Timeval struct { Sec int64 Usec int64 } type Timex struct { Modes uint32 Pad_cgo_0 [4]byte Offset int64 Freq int64 Maxerror int64 Esterror int64 Status int32 Pad_cgo_1 [4]byte Constant int64 Precision int64 Tolerance int64 Time Timeval Tick int64 Ppsfreq int64 Jitter int64 Shift int32 Pad_cgo_2 [4]byte Stabil int64 Jitcnt int64 Calcnt int64 Errcnt int64 Stbcnt int64 Tai int32 Pad_cgo_3 [44]byte } type Time_t int64 type Tms struct { Utime int64 Stime int64 Cutime int64 Cstime int64 } type Utimbuf struct { Actime int64 Modtime int64 } type Rusage struct { Utime Timeval Stime Timeval Maxrss int64 Ixrss int64 Idrss int64 Isrss int64 Minflt int64 Majflt int64 Nswap int64 Inblock int64 Oublock int64 Msgsnd int64 Msgrcv int64 Nsignals int64 Nvcsw int64 Nivcsw int64 } type Rlimit struct { Cur uint64 Max uint64 } type _Gid_t uint32 type Stat_t struct { Dev uint64 Ino uint64 Nlink uint64 Mode uint32 Uid uint32 Gid uint32 X__pad2 int32 Rdev uint64 Size int64 Blksize int64 Blocks int64 Atim Timespec Mtim Timespec Ctim Timespec _ uint64 _ uint64 _ uint64 } type Statfs_t struct { Type int64 Bsize int64 Blocks uint64 Bfree uint64 Bavail uint64 Files uint64 Ffree uint64 Fsid Fsid Namelen int64 Frsize int64 Flags int64 Spare [4]int64 } type Dirent struct { Ino uint64 Off int64 Reclen uint16 Type uint8 Name [256]uint8 Pad_cgo_0 [5]byte } type Fsid struct { X__val [2]int32 } type Flock_t struct { Type int16 Whence int16 Pad_cgo_0 [4]byte Start int64 Len int64 Pid int32 Pad_cgo_1 [4]byte } type FscryptPolicy struct { Version uint8 Contents_encryption_mode uint8 Filenames_encryption_mode uint8 Flags uint8 Master_key_descriptor [8]uint8 } type FscryptKey struct { Mode uint32 Raw [64]uint8 Size uint32 } type KeyctlDHParams struct { Private int32 Prime int32 Base int32 } const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 FADV_SEQUENTIAL = 0x2 FADV_WILLNEED = 0x3 FADV_DONTNEED = 0x4 FADV_NOREUSE = 0x5 ) type RawSockaddrInet4 struct { Family uint16 Port uint16 Addr [4]byte /* in_addr */ Zero [8]uint8 } type RawSockaddrInet6 struct { Family uint16 Port uint16 Flowinfo uint32 Addr [16]byte /* in6_addr */ Scope_id uint32 } type RawSockaddrUnix struct { Family uint16 Path [108]int8 } type RawSockaddrLinklayer struct { Family uint16 Protocol uint16 Ifindex int32 Hatype uint16 Pkttype uint8 Halen uint8 Addr [8]uint8 } type RawSockaddrNetlink struct { Family uint16 Pad uint16 Pid uint32 Groups uint32 } type RawSockaddrHCI struct { Family uint16 Dev uint16 Channel uint16 } type RawSockaddrCAN struct { Family uint16 Pad_cgo_0 [2]byte Ifindex int32 Addr [8]byte } type RawSockaddrALG struct { Family uint16 Type [14]uint8 Feat uint32 Mask uint32 Name [64]uint8 } type RawSockaddrVM struct { Family uint16 Reserved1 uint16 Port uint32 Cid uint32 Zero [4]uint8 } type RawSockaddr struct { Family uint16 Data [14]uint8 } type RawSockaddrAny struct { Addr RawSockaddr Pad [96]uint8 } type _Socklen uint32 type Linger struct { Onoff int32 Linger int32 } type Iovec struct { Base *byte Len uint64 } type IPMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } type IPMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } type IPv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } type PacketMreq struct { Ifindex int32 Type uint16 Alen uint16 Address [8]uint8 } type Msghdr struct { Name *byte Namelen uint32 Pad_cgo_0 [4]byte Iov *Iovec Iovlen uint64 Control *byte Controllen uint64 Flags int32 Pad_cgo_1 [4]byte } type Cmsghdr struct { Len uint64 Level int32 Type int32 } type Inet4Pktinfo struct { Ifindex int32 Spec_dst [4]byte /* in_addr */ Addr [4]byte /* in_addr */ } type Inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } type IPv6MTUInfo struct { Addr RawSockaddrInet6 Mtu uint32 } type ICMPv6Filter struct { Data [8]uint32 } type Ucred struct { Pid int32 Uid uint32 Gid uint32 } type TCPInfo struct { State uint8 Ca_state uint8 Retransmits uint8 Probes uint8 Backoff uint8 Options uint8 Pad_cgo_0 [2]byte Rto uint32 Ato uint32 Snd_mss uint32 Rcv_mss uint32 Unacked uint32 Sacked uint32 Lost uint32 Retrans uint32 Fackets uint32 Last_data_sent uint32 Last_ack_sent uint32 Last_data_recv uint32 Last_ack_recv uint32 Pmtu uint32 Rcv_ssthresh uint32 Rtt uint32 Rttvar uint32 Snd_ssthresh uint32 Snd_cwnd uint32 Advmss uint32 Reordering uint32 Rcv_rtt uint32 Rcv_space uint32 Total_retrans uint32 } const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c SizeofSockaddrAny = 0x70 SizeofSockaddrUnix = 0x6e SizeofSockaddrLinklayer = 0x14 SizeofSockaddrNetlink = 0xc SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 SizeofPacketMreq = 0x10 SizeofMsghdr = 0x38 SizeofCmsghdr = 0x10 SizeofInet4Pktinfo = 0xc SizeofInet6Pktinfo = 0x14 SizeofIPv6MTUInfo = 0x20 SizeofICMPv6Filter = 0x20 SizeofUcred = 0xc SizeofTCPInfo = 0x68 ) const ( IFA_UNSPEC = 0x0 IFA_ADDRESS = 0x1 IFA_LOCAL = 0x2 IFA_LABEL = 0x3 IFA_BROADCAST = 0x4 IFA_ANYCAST = 0x5 IFA_CACHEINFO = 0x6 IFA_MULTICAST = 0x7 IFLA_UNSPEC = 0x0 IFLA_ADDRESS = 0x1 IFLA_BROADCAST = 0x2 IFLA_IFNAME = 0x3 IFLA_MTU = 0x4 IFLA_LINK = 0x5 IFLA_QDISC = 0x6 IFLA_STATS = 0x7 IFLA_COST = 0x8 IFLA_PRIORITY = 0x9 IFLA_MASTER = 0xa IFLA_WIRELESS = 0xb IFLA_PROTINFO = 0xc IFLA_TXQLEN = 0xd IFLA_MAP = 0xe IFLA_WEIGHT = 0xf IFLA_OPERSTATE = 0x10 IFLA_LINKMODE = 0x11 IFLA_LINKINFO = 0x12 IFLA_NET_NS_PID = 0x13 IFLA_IFALIAS = 0x14 IFLA_MAX = 0x2c RT_SCOPE_UNIVERSE = 0x0 RT_SCOPE_SITE = 0xc8 RT_SCOPE_LINK = 0xfd RT_SCOPE_HOST = 0xfe RT_SCOPE_NOWHERE = 0xff RT_TABLE_UNSPEC = 0x0 RT_TABLE_COMPAT = 0xfc RT_TABLE_DEFAULT = 0xfd RT_TABLE_MAIN = 0xfe RT_TABLE_LOCAL = 0xff RT_TABLE_MAX = 0xffffffff RTA_UNSPEC = 0x0 RTA_DST = 0x1 RTA_SRC = 0x2 RTA_IIF = 0x3 RTA_OIF = 0x4 RTA_GATEWAY = 0x5 RTA_PRIORITY = 0x6 RTA_PREFSRC = 0x7 RTA_METRICS = 0x8 RTA_MULTIPATH = 0x9 RTA_FLOW = 0xb RTA_CACHEINFO = 0xc RTA_TABLE = 0xf RTN_UNSPEC = 0x0 RTN_UNICAST = 0x1 RTN_LOCAL = 0x2 RTN_BROADCAST = 0x3 RTN_ANYCAST = 0x4 RTN_MULTICAST = 0x5 RTN_BLACKHOLE = 0x6 RTN_UNREACHABLE = 0x7 RTN_PROHIBIT = 0x8 RTN_THROW = 0x9 RTN_NAT = 0xa RTN_XRESOLVE = 0xb RTNLGRP_NONE = 0x0 RTNLGRP_LINK = 0x1 RTNLGRP_NOTIFY = 0x2 RTNLGRP_NEIGH = 0x3 RTNLGRP_TC = 0x4 RTNLGRP_IPV4_IFADDR = 0x5 RTNLGRP_IPV4_MROUTE = 0x6 RTNLGRP_IPV4_ROUTE = 0x7 RTNLGRP_IPV4_RULE = 0x8 RTNLGRP_IPV6_IFADDR = 0x9 RTNLGRP_IPV6_MROUTE = 0xa RTNLGRP_IPV6_ROUTE = 0xb RTNLGRP_IPV6_IFINFO = 0xc RTNLGRP_IPV6_PREFIX = 0x12 RTNLGRP_IPV6_RULE = 0x13 RTNLGRP_ND_USEROPT = 0x14 SizeofNlMsghdr = 0x10 SizeofNlMsgerr = 0x14 SizeofRtGenmsg = 0x1 SizeofNlAttr = 0x4 SizeofRtAttr = 0x4 SizeofIfInfomsg = 0x10 SizeofIfAddrmsg = 0x8 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 ) type NlMsghdr struct { Len uint32 Type uint16 Flags uint16 Seq uint32 Pid uint32 } type NlMsgerr struct { Error int32 Msg NlMsghdr } type RtGenmsg struct { Family uint8 } type NlAttr struct { Len uint16 Type uint16 } type RtAttr struct { Len uint16 Type uint16 } type IfInfomsg struct { Family uint8 X__ifi_pad uint8 Type uint16 Index int32 Flags uint32 Change uint32 } type IfAddrmsg struct { Family uint8 Prefixlen uint8 Flags uint8 Scope uint8 Index uint32 } type RtMsg struct { Family uint8 Dst_len uint8 Src_len uint8 Tos uint8 Table uint8 Protocol uint8 Scope uint8 Type uint8 Flags uint32 } type RtNexthop struct { Len uint16 Flags uint8 Hops uint8 Ifindex int32 } const ( SizeofSockFilter = 0x8 SizeofSockFprog = 0x10 ) type SockFilter struct { Code uint16 Jt uint8 Jf uint8 K uint32 } type SockFprog struct { Len uint16 Pad_cgo_0 [6]byte Filter *SockFilter } type InotifyEvent struct { Wd int32 Mask uint32 Cookie uint32 Len uint32 } const SizeofInotifyEvent = 0x10 type PtraceRegs struct { Gpr [32]uint64 Nip uint64 Msr uint64 Orig_gpr3 uint64 Ctr uint64 Link uint64 Xer uint64 Ccr uint64 Softe uint64 Trap uint64 Dar uint64 Dsisr uint64 Result uint64 } type FdSet struct { Bits [16]int64 } type Sysinfo_t struct { Uptime int64 Loads [3]uint64 Totalram uint64 Freeram uint64 Sharedram uint64 Bufferram uint64 Totalswap uint64 Freeswap uint64 Procs uint16 Pad uint16 Pad_cgo_0 [4]byte Totalhigh uint64 Freehigh uint64 Unit uint32 X_f [0]uint8 Pad_cgo_1 [4]byte } type Utsname struct { Sysname [65]byte Nodename [65]byte Release [65]byte Version [65]byte Machine [65]byte Domainname [65]byte } type Ustat_t struct { Tfree int32 Pad_cgo_0 [4]byte Tinode uint64 Fname [6]uint8 Fpack [6]uint8 Pad_cgo_1 [4]byte } type EpollEvent struct { Events uint32 X_padFd int32 Fd int32 Pad int32 } const ( AT_FDCWD = -0x64 AT_REMOVEDIR = 0x200 AT_SYMLINK_FOLLOW = 0x400 AT_SYMLINK_NOFOLLOW = 0x100 ) type PollFd struct { Fd int32 Events int16 Revents int16 } const ( POLLIN = 0x1 POLLPRI = 0x2 POLLOUT = 0x4 POLLRDHUP = 0x2000 POLLERR = 0x8 POLLHUP = 0x10 POLLNVAL = 0x20 ) type Sigset_t struct { X__val [16]uint64 } const RNDGETENTCNT = 0x40045200 const PERF_IOC_FLAG_GROUP = 0x1 type Termios struct { Iflag uint32 Oflag uint32 Cflag uint32 Lflag uint32 Cc [19]uint8 Line uint8 Ispeed uint32 Ospeed uint32 } type Winsize struct { Row uint16 Col uint16 Xpixel uint16 Ypixel uint16 } type Taskstats struct { Version uint16 Pad_cgo_0 [2]byte Ac_exitcode uint32 Ac_flag uint8 Ac_nice uint8 Pad_cgo_1 [6]byte Cpu_count uint64 Cpu_delay_total uint64 Blkio_count uint64 Blkio_delay_total uint64 Swapin_count uint64 Swapin_delay_total uint64 Cpu_run_real_total uint64 Cpu_run_virtual_total uint64 Ac_comm [32]uint8 Ac_sched uint8 Ac_pad [3]uint8 Pad_cgo_2 [4]byte Ac_uid uint32 Ac_gid uint32 Ac_pid uint32 Ac_ppid uint32 Ac_btime uint32 Pad_cgo_3 [4]byte Ac_etime uint64 Ac_utime uint64 Ac_stime uint64 Ac_minflt uint64 Ac_majflt uint64 Coremem uint64 Virtmem uint64 Hiwater_rss uint64 Hiwater_vm uint64 Read_char uint64 Write_char uint64 Read_syscalls uint64 Write_syscalls uint64 Read_bytes uint64 Write_bytes uint64 Cancelled_write_bytes uint64 Nvcsw uint64 Nivcsw uint64 Ac_utimescaled uint64 Ac_stimescaled uint64 Cpu_scaled_run_real_total uint64 Freepages_count uint64 Freepages_delay_total uint64 } const ( TASKSTATS_CMD_UNSPEC = 0x0 TASKSTATS_CMD_GET = 0x1 TASKSTATS_CMD_NEW = 0x2 TASKSTATS_TYPE_UNSPEC = 0x0 TASKSTATS_TYPE_PID = 0x1 TASKSTATS_TYPE_TGID = 0x2 TASKSTATS_TYPE_STATS = 0x3 TASKSTATS_TYPE_AGGR_PID = 0x4 TASKSTATS_TYPE_AGGR_TGID = 0x5 TASKSTATS_TYPE_NULL = 0x6 TASKSTATS_CMD_ATTR_UNSPEC = 0x0 TASKSTATS_CMD_ATTR_PID = 0x1 TASKSTATS_CMD_ATTR_TGID = 0x2 TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 ) type Genlmsghdr struct { Cmd uint8 Version uint8 Reserved uint16 } const ( CTRL_CMD_UNSPEC = 0x0 CTRL_CMD_NEWFAMILY = 0x1 CTRL_CMD_DELFAMILY = 0x2 CTRL_CMD_GETFAMILY = 0x3 CTRL_CMD_NEWOPS = 0x4 CTRL_CMD_DELOPS = 0x5 CTRL_CMD_GETOPS = 0x6 CTRL_CMD_NEWMCAST_GRP = 0x7 CTRL_CMD_DELMCAST_GRP = 0x8 CTRL_CMD_GETMCAST_GRP = 0x9 CTRL_ATTR_UNSPEC = 0x0 CTRL_ATTR_FAMILY_ID = 0x1 CTRL_ATTR_FAMILY_NAME = 0x2 CTRL_ATTR_VERSION = 0x3 CTRL_ATTR_HDRSIZE = 0x4 CTRL_ATTR_MAXATTR = 0x5 CTRL_ATTR_OPS = 0x6 CTRL_ATTR_MCAST_GROUPS = 0x7 CTRL_ATTR_OP_UNSPEC = 0x0 CTRL_ATTR_OP_ID = 0x1 CTRL_ATTR_OP_FLAGS = 0x2 CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 CTRL_ATTR_MCAST_GRP_NAME = 0x1 CTRL_ATTR_MCAST_GRP_ID = 0x2 ) ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go ================================================ // cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build s390x,linux package unix const ( sizeofPtr = 0x8 sizeofShort = 0x2 sizeofInt = 0x4 sizeofLong = 0x8 sizeofLongLong = 0x8 PathMax = 0x1000 ) type ( _C_short int16 _C_int int32 _C_long int64 _C_long_long int64 ) type Timespec struct { Sec int64 Nsec int64 } type Timeval struct { Sec int64 Usec int64 } type Timex struct { Modes uint32 _ [4]byte Offset int64 Freq int64 Maxerror int64 Esterror int64 Status int32 _ [4]byte Constant int64 Precision int64 Tolerance int64 Time Timeval Tick int64 Ppsfreq int64 Jitter int64 Shift int32 _ [4]byte Stabil int64 Jitcnt int64 Calcnt int64 Errcnt int64 Stbcnt int64 Tai int32 _ [44]byte } type Time_t int64 type Tms struct { Utime int64 Stime int64 Cutime int64 Cstime int64 } type Utimbuf struct { Actime int64 Modtime int64 } type Rusage struct { Utime Timeval Stime Timeval Maxrss int64 Ixrss int64 Idrss int64 Isrss int64 Minflt int64 Majflt int64 Nswap int64 Inblock int64 Oublock int64 Msgsnd int64 Msgrcv int64 Nsignals int64 Nvcsw int64 Nivcsw int64 } type Rlimit struct { Cur uint64 Max uint64 } type _Gid_t uint32 type Stat_t struct { Dev uint64 Ino uint64 Nlink uint64 Mode uint32 Uid uint32 Gid uint32 _ int32 Rdev uint64 Size int64 Atim Timespec Mtim Timespec Ctim Timespec Blksize int64 Blocks int64 _ [3]int64 } type Statfs_t struct { Type uint32 Bsize uint32 Blocks uint64 Bfree uint64 Bavail uint64 Files uint64 Ffree uint64 Fsid Fsid Namelen uint32 Frsize uint32 Flags uint32 Spare [4]uint32 _ [4]byte } type Dirent struct { Ino uint64 Off int64 Reclen uint16 Type uint8 Name [256]int8 _ [5]byte } type Fsid struct { _ [2]int32 } type Flock_t struct { Type int16 Whence int16 _ [4]byte Start int64 Len int64 Pid int32 _ [4]byte } type FscryptPolicy struct { Version uint8 Contents_encryption_mode uint8 Filenames_encryption_mode uint8 Flags uint8 Master_key_descriptor [8]uint8 } type FscryptKey struct { Mode uint32 Raw [64]uint8 Size uint32 } type KeyctlDHParams struct { Private int32 Prime int32 Base int32 } const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 FADV_SEQUENTIAL = 0x2 FADV_WILLNEED = 0x3 FADV_DONTNEED = 0x6 FADV_NOREUSE = 0x7 ) type RawSockaddrInet4 struct { Family uint16 Port uint16 Addr [4]byte /* in_addr */ Zero [8]uint8 } type RawSockaddrInet6 struct { Family uint16 Port uint16 Flowinfo uint32 Addr [16]byte /* in6_addr */ Scope_id uint32 } type RawSockaddrUnix struct { Family uint16 Path [108]int8 } type RawSockaddrLinklayer struct { Family uint16 Protocol uint16 Ifindex int32 Hatype uint16 Pkttype uint8 Halen uint8 Addr [8]uint8 } type RawSockaddrNetlink struct { Family uint16 Pad uint16 Pid uint32 Groups uint32 } type RawSockaddrHCI struct { Family uint16 Dev uint16 Channel uint16 } type RawSockaddrCAN struct { Family uint16 _ [2]byte Ifindex int32 Addr [8]byte } type RawSockaddrALG struct { Family uint16 Type [14]uint8 Feat uint32 Mask uint32 Name [64]uint8 } type RawSockaddrVM struct { Family uint16 Reserved1 uint16 Port uint32 Cid uint32 Zero [4]uint8 } type RawSockaddr struct { Family uint16 Data [14]int8 } type RawSockaddrAny struct { Addr RawSockaddr Pad [96]int8 } type _Socklen uint32 type Linger struct { Onoff int32 Linger int32 } type Iovec struct { Base *byte Len uint64 } type IPMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } type IPMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } type IPv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } type PacketMreq struct { Ifindex int32 Type uint16 Alen uint16 Address [8]uint8 } type Msghdr struct { Name *byte Namelen uint32 _ [4]byte Iov *Iovec Iovlen uint64 Control *byte Controllen uint64 Flags int32 _ [4]byte } type Cmsghdr struct { Len uint64 Level int32 Type int32 } type Inet4Pktinfo struct { Ifindex int32 Spec_dst [4]byte /* in_addr */ Addr [4]byte /* in_addr */ } type Inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } type IPv6MTUInfo struct { Addr RawSockaddrInet6 Mtu uint32 } type ICMPv6Filter struct { Data [8]uint32 } type Ucred struct { Pid int32 Uid uint32 Gid uint32 } type TCPInfo struct { State uint8 Ca_state uint8 Retransmits uint8 Probes uint8 Backoff uint8 Options uint8 _ [2]byte Rto uint32 Ato uint32 Snd_mss uint32 Rcv_mss uint32 Unacked uint32 Sacked uint32 Lost uint32 Retrans uint32 Fackets uint32 Last_data_sent uint32 Last_ack_sent uint32 Last_data_recv uint32 Last_ack_recv uint32 Pmtu uint32 Rcv_ssthresh uint32 Rtt uint32 Rttvar uint32 Snd_ssthresh uint32 Snd_cwnd uint32 Advmss uint32 Reordering uint32 Rcv_rtt uint32 Rcv_space uint32 Total_retrans uint32 } const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c SizeofSockaddrAny = 0x70 SizeofSockaddrUnix = 0x6e SizeofSockaddrLinklayer = 0x14 SizeofSockaddrNetlink = 0xc SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 SizeofPacketMreq = 0x10 SizeofMsghdr = 0x38 SizeofCmsghdr = 0x10 SizeofInet4Pktinfo = 0xc SizeofInet6Pktinfo = 0x14 SizeofIPv6MTUInfo = 0x20 SizeofICMPv6Filter = 0x20 SizeofUcred = 0xc SizeofTCPInfo = 0x68 ) const ( IFA_UNSPEC = 0x0 IFA_ADDRESS = 0x1 IFA_LOCAL = 0x2 IFA_LABEL = 0x3 IFA_BROADCAST = 0x4 IFA_ANYCAST = 0x5 IFA_CACHEINFO = 0x6 IFA_MULTICAST = 0x7 IFLA_UNSPEC = 0x0 IFLA_ADDRESS = 0x1 IFLA_BROADCAST = 0x2 IFLA_IFNAME = 0x3 IFLA_MTU = 0x4 IFLA_LINK = 0x5 IFLA_QDISC = 0x6 IFLA_STATS = 0x7 IFLA_COST = 0x8 IFLA_PRIORITY = 0x9 IFLA_MASTER = 0xa IFLA_WIRELESS = 0xb IFLA_PROTINFO = 0xc IFLA_TXQLEN = 0xd IFLA_MAP = 0xe IFLA_WEIGHT = 0xf IFLA_OPERSTATE = 0x10 IFLA_LINKMODE = 0x11 IFLA_LINKINFO = 0x12 IFLA_NET_NS_PID = 0x13 IFLA_IFALIAS = 0x14 IFLA_MAX = 0x2c RT_SCOPE_UNIVERSE = 0x0 RT_SCOPE_SITE = 0xc8 RT_SCOPE_LINK = 0xfd RT_SCOPE_HOST = 0xfe RT_SCOPE_NOWHERE = 0xff RT_TABLE_UNSPEC = 0x0 RT_TABLE_COMPAT = 0xfc RT_TABLE_DEFAULT = 0xfd RT_TABLE_MAIN = 0xfe RT_TABLE_LOCAL = 0xff RT_TABLE_MAX = 0xffffffff RTA_UNSPEC = 0x0 RTA_DST = 0x1 RTA_SRC = 0x2 RTA_IIF = 0x3 RTA_OIF = 0x4 RTA_GATEWAY = 0x5 RTA_PRIORITY = 0x6 RTA_PREFSRC = 0x7 RTA_METRICS = 0x8 RTA_MULTIPATH = 0x9 RTA_FLOW = 0xb RTA_CACHEINFO = 0xc RTA_TABLE = 0xf RTN_UNSPEC = 0x0 RTN_UNICAST = 0x1 RTN_LOCAL = 0x2 RTN_BROADCAST = 0x3 RTN_ANYCAST = 0x4 RTN_MULTICAST = 0x5 RTN_BLACKHOLE = 0x6 RTN_UNREACHABLE = 0x7 RTN_PROHIBIT = 0x8 RTN_THROW = 0x9 RTN_NAT = 0xa RTN_XRESOLVE = 0xb RTNLGRP_NONE = 0x0 RTNLGRP_LINK = 0x1 RTNLGRP_NOTIFY = 0x2 RTNLGRP_NEIGH = 0x3 RTNLGRP_TC = 0x4 RTNLGRP_IPV4_IFADDR = 0x5 RTNLGRP_IPV4_MROUTE = 0x6 RTNLGRP_IPV4_ROUTE = 0x7 RTNLGRP_IPV4_RULE = 0x8 RTNLGRP_IPV6_IFADDR = 0x9 RTNLGRP_IPV6_MROUTE = 0xa RTNLGRP_IPV6_ROUTE = 0xb RTNLGRP_IPV6_IFINFO = 0xc RTNLGRP_IPV6_PREFIX = 0x12 RTNLGRP_IPV6_RULE = 0x13 RTNLGRP_ND_USEROPT = 0x14 SizeofNlMsghdr = 0x10 SizeofNlMsgerr = 0x14 SizeofRtGenmsg = 0x1 SizeofNlAttr = 0x4 SizeofRtAttr = 0x4 SizeofIfInfomsg = 0x10 SizeofIfAddrmsg = 0x8 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 ) type NlMsghdr struct { Len uint32 Type uint16 Flags uint16 Seq uint32 Pid uint32 } type NlMsgerr struct { Error int32 Msg NlMsghdr } type RtGenmsg struct { Family uint8 } type NlAttr struct { Len uint16 Type uint16 } type RtAttr struct { Len uint16 Type uint16 } type IfInfomsg struct { Family uint8 _ uint8 Type uint16 Index int32 Flags uint32 Change uint32 } type IfAddrmsg struct { Family uint8 Prefixlen uint8 Flags uint8 Scope uint8 Index uint32 } type RtMsg struct { Family uint8 Dst_len uint8 Src_len uint8 Tos uint8 Table uint8 Protocol uint8 Scope uint8 Type uint8 Flags uint32 } type RtNexthop struct { Len uint16 Flags uint8 Hops uint8 Ifindex int32 } const ( SizeofSockFilter = 0x8 SizeofSockFprog = 0x10 ) type SockFilter struct { Code uint16 Jt uint8 Jf uint8 K uint32 } type SockFprog struct { Len uint16 _ [6]byte Filter *SockFilter } type InotifyEvent struct { Wd int32 Mask uint32 Cookie uint32 Len uint32 } const SizeofInotifyEvent = 0x10 type PtraceRegs struct { Psw PtracePsw Gprs [16]uint64 Acrs [16]uint32 Orig_gpr2 uint64 Fp_regs PtraceFpregs Per_info PtracePer Ieee_instruction_pointer uint64 } type PtracePsw struct { Mask uint64 Addr uint64 } type PtraceFpregs struct { Fpc uint32 _ [4]byte Fprs [16]float64 } type PtracePer struct { _ [0]uint64 _ [24]byte _ [8]byte Starting_addr uint64 Ending_addr uint64 Perc_atmid uint16 _ [6]byte Address uint64 Access_id uint8 _ [7]byte } type FdSet struct { Bits [16]int64 } type Sysinfo_t struct { Uptime int64 Loads [3]uint64 Totalram uint64 Freeram uint64 Sharedram uint64 Bufferram uint64 Totalswap uint64 Freeswap uint64 Procs uint16 Pad uint16 _ [4]byte Totalhigh uint64 Freehigh uint64 Unit uint32 _ [0]int8 _ [4]byte } type Utsname struct { Sysname [65]byte Nodename [65]byte Release [65]byte Version [65]byte Machine [65]byte Domainname [65]byte } type Ustat_t struct { Tfree int32 _ [4]byte Tinode uint64 Fname [6]int8 Fpack [6]int8 _ [4]byte } type EpollEvent struct { Events uint32 _ int32 Fd int32 Pad int32 } const ( AT_FDCWD = -0x64 AT_REMOVEDIR = 0x200 AT_SYMLINK_FOLLOW = 0x400 AT_SYMLINK_NOFOLLOW = 0x100 ) type PollFd struct { Fd int32 Events int16 Revents int16 } const ( POLLIN = 0x1 POLLPRI = 0x2 POLLOUT = 0x4 POLLRDHUP = 0x2000 POLLERR = 0x8 POLLHUP = 0x10 POLLNVAL = 0x20 ) type Sigset_t struct { _ [16]uint64 } const RNDGETENTCNT = 0x80045200 const PERF_IOC_FLAG_GROUP = 0x1 type Termios struct { Iflag uint32 Oflag uint32 Cflag uint32 Lflag uint32 Line uint8 Cc [19]uint8 Ispeed uint32 Ospeed uint32 } type Winsize struct { Row uint16 Col uint16 Xpixel uint16 Ypixel uint16 } type Taskstats struct { Version uint16 _ [2]byte Ac_exitcode uint32 Ac_flag uint8 Ac_nice uint8 _ [6]byte Cpu_count uint64 Cpu_delay_total uint64 Blkio_count uint64 Blkio_delay_total uint64 Swapin_count uint64 Swapin_delay_total uint64 Cpu_run_real_total uint64 Cpu_run_virtual_total uint64 Ac_comm [32]int8 Ac_sched uint8 Ac_pad [3]uint8 _ [4]byte Ac_uid uint32 Ac_gid uint32 Ac_pid uint32 Ac_ppid uint32 Ac_btime uint32 _ [4]byte Ac_etime uint64 Ac_utime uint64 Ac_stime uint64 Ac_minflt uint64 Ac_majflt uint64 Coremem uint64 Virtmem uint64 Hiwater_rss uint64 Hiwater_vm uint64 Read_char uint64 Write_char uint64 Read_syscalls uint64 Write_syscalls uint64 Read_bytes uint64 Write_bytes uint64 Cancelled_write_bytes uint64 Nvcsw uint64 Nivcsw uint64 Ac_utimescaled uint64 Ac_stimescaled uint64 Cpu_scaled_run_real_total uint64 Freepages_count uint64 Freepages_delay_total uint64 } const ( TASKSTATS_CMD_UNSPEC = 0x0 TASKSTATS_CMD_GET = 0x1 TASKSTATS_CMD_NEW = 0x2 TASKSTATS_TYPE_UNSPEC = 0x0 TASKSTATS_TYPE_PID = 0x1 TASKSTATS_TYPE_TGID = 0x2 TASKSTATS_TYPE_STATS = 0x3 TASKSTATS_TYPE_AGGR_PID = 0x4 TASKSTATS_TYPE_AGGR_TGID = 0x5 TASKSTATS_TYPE_NULL = 0x6 TASKSTATS_CMD_ATTR_UNSPEC = 0x0 TASKSTATS_CMD_ATTR_PID = 0x1 TASKSTATS_CMD_ATTR_TGID = 0x2 TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 ) type Genlmsghdr struct { Cmd uint8 Version uint8 Reserved uint16 } const ( CTRL_CMD_UNSPEC = 0x0 CTRL_CMD_NEWFAMILY = 0x1 CTRL_CMD_DELFAMILY = 0x2 CTRL_CMD_GETFAMILY = 0x3 CTRL_CMD_NEWOPS = 0x4 CTRL_CMD_DELOPS = 0x5 CTRL_CMD_GETOPS = 0x6 CTRL_CMD_NEWMCAST_GRP = 0x7 CTRL_CMD_DELMCAST_GRP = 0x8 CTRL_CMD_GETMCAST_GRP = 0x9 CTRL_ATTR_UNSPEC = 0x0 CTRL_ATTR_FAMILY_ID = 0x1 CTRL_ATTR_FAMILY_NAME = 0x2 CTRL_ATTR_VERSION = 0x3 CTRL_ATTR_HDRSIZE = 0x4 CTRL_ATTR_MAXATTR = 0x5 CTRL_ATTR_OPS = 0x6 CTRL_ATTR_MCAST_GROUPS = 0x7 CTRL_ATTR_OP_UNSPEC = 0x0 CTRL_ATTR_OP_ID = 0x1 CTRL_ATTR_OP_FLAGS = 0x2 CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 CTRL_ATTR_MCAST_GRP_NAME = 0x1 CTRL_ATTR_MCAST_GRP_ID = 0x2 ) ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go ================================================ // +build sparc64,linux // Created by cgo -godefs - DO NOT EDIT // cgo -godefs types_linux.go | go run mkpost.go package unix const ( sizeofPtr = 0x8 sizeofShort = 0x2 sizeofInt = 0x4 sizeofLong = 0x8 sizeofLongLong = 0x8 PathMax = 0x1000 ) type ( _C_short int16 _C_int int32 _C_long int64 _C_long_long int64 ) type Timespec struct { Sec int64 Nsec int64 } type Timeval struct { Sec int64 Usec int32 Pad_cgo_0 [4]byte } type Timex struct { Modes uint32 Pad_cgo_0 [4]byte Offset int64 Freq int64 Maxerror int64 Esterror int64 Status int32 Pad_cgo_1 [4]byte Constant int64 Precision int64 Tolerance int64 Time Timeval Tick int64 Ppsfreq int64 Jitter int64 Shift int32 Pad_cgo_2 [4]byte Stabil int64 Jitcnt int64 Calcnt int64 Errcnt int64 Stbcnt int64 Tai int32 Pad_cgo_3 [44]byte } type Time_t int64 type Tms struct { Utime int64 Stime int64 Cutime int64 Cstime int64 } type Utimbuf struct { Actime int64 Modtime int64 } type Rusage struct { Utime Timeval Stime Timeval Maxrss int64 Ixrss int64 Idrss int64 Isrss int64 Minflt int64 Majflt int64 Nswap int64 Inblock int64 Oublock int64 Msgsnd int64 Msgrcv int64 Nsignals int64 Nvcsw int64 Nivcsw int64 } type Rlimit struct { Cur uint64 Max uint64 } type _Gid_t uint32 type Stat_t struct { Dev uint64 X__pad1 uint16 Pad_cgo_0 [6]byte Ino uint64 Mode uint32 Nlink uint32 Uid uint32 Gid uint32 Rdev uint64 X__pad2 uint16 Pad_cgo_1 [6]byte Size int64 Blksize int64 Blocks int64 Atim Timespec Mtim Timespec Ctim Timespec X__glibc_reserved4 uint64 X__glibc_reserved5 uint64 } type Statfs_t struct { Type int64 Bsize int64 Blocks uint64 Bfree uint64 Bavail uint64 Files uint64 Ffree uint64 Fsid Fsid Namelen int64 Frsize int64 Flags int64 Spare [4]int64 } type Dirent struct { Ino uint64 Off int64 Reclen uint16 Type uint8 Name [256]int8 Pad_cgo_0 [5]byte } type Fsid struct { X__val [2]int32 } type Flock_t struct { Type int16 Whence int16 Pad_cgo_0 [4]byte Start int64 Len int64 Pid int32 X__glibc_reserved int16 Pad_cgo_1 [2]byte } const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 FADV_SEQUENTIAL = 0x2 FADV_WILLNEED = 0x3 FADV_DONTNEED = 0x4 FADV_NOREUSE = 0x5 ) type RawSockaddrInet4 struct { Family uint16 Port uint16 Addr [4]byte /* in_addr */ Zero [8]uint8 } type RawSockaddrInet6 struct { Family uint16 Port uint16 Flowinfo uint32 Addr [16]byte /* in6_addr */ Scope_id uint32 } type RawSockaddrUnix struct { Family uint16 Path [108]int8 } type RawSockaddrLinklayer struct { Family uint16 Protocol uint16 Ifindex int32 Hatype uint16 Pkttype uint8 Halen uint8 Addr [8]uint8 } type RawSockaddrNetlink struct { Family uint16 Pad uint16 Pid uint32 Groups uint32 } type RawSockaddrHCI struct { Family uint16 Dev uint16 Channel uint16 } type RawSockaddrCAN struct { Family uint16 Pad_cgo_0 [2]byte Ifindex int32 Addr [8]byte } type RawSockaddrALG struct { Family uint16 Type [14]uint8 Feat uint32 Mask uint32 Name [64]uint8 } type RawSockaddrVM struct { Family uint16 Reserved1 uint16 Port uint32 Cid uint32 Zero [4]uint8 } type RawSockaddr struct { Family uint16 Data [14]int8 } type RawSockaddrAny struct { Addr RawSockaddr Pad [96]int8 } type _Socklen uint32 type Linger struct { Onoff int32 Linger int32 } type Iovec struct { Base *byte Len uint64 } type IPMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } type IPMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } type IPv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } type Msghdr struct { Name *byte Namelen uint32 Pad_cgo_0 [4]byte Iov *Iovec Iovlen uint64 Control *byte Controllen uint64 Flags int32 Pad_cgo_1 [4]byte } type Cmsghdr struct { Len uint64 Level int32 Type int32 } type Inet4Pktinfo struct { Ifindex int32 Spec_dst [4]byte /* in_addr */ Addr [4]byte /* in_addr */ } type Inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } type IPv6MTUInfo struct { Addr RawSockaddrInet6 Mtu uint32 } type ICMPv6Filter struct { Data [8]uint32 } type Ucred struct { Pid int32 Uid uint32 Gid uint32 } type TCPInfo struct { State uint8 Ca_state uint8 Retransmits uint8 Probes uint8 Backoff uint8 Options uint8 Pad_cgo_0 [2]byte Rto uint32 Ato uint32 Snd_mss uint32 Rcv_mss uint32 Unacked uint32 Sacked uint32 Lost uint32 Retrans uint32 Fackets uint32 Last_data_sent uint32 Last_ack_sent uint32 Last_data_recv uint32 Last_ack_recv uint32 Pmtu uint32 Rcv_ssthresh uint32 Rtt uint32 Rttvar uint32 Snd_ssthresh uint32 Snd_cwnd uint32 Advmss uint32 Reordering uint32 Rcv_rtt uint32 Rcv_space uint32 Total_retrans uint32 } const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c SizeofSockaddrAny = 0x70 SizeofSockaddrUnix = 0x6e SizeofSockaddrLinklayer = 0x14 SizeofSockaddrNetlink = 0xc SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 SizeofMsghdr = 0x38 SizeofCmsghdr = 0x10 SizeofInet4Pktinfo = 0xc SizeofInet6Pktinfo = 0x14 SizeofIPv6MTUInfo = 0x20 SizeofICMPv6Filter = 0x20 SizeofUcred = 0xc SizeofTCPInfo = 0x68 ) const ( IFA_UNSPEC = 0x0 IFA_ADDRESS = 0x1 IFA_LOCAL = 0x2 IFA_LABEL = 0x3 IFA_BROADCAST = 0x4 IFA_ANYCAST = 0x5 IFA_CACHEINFO = 0x6 IFA_MULTICAST = 0x7 IFLA_UNSPEC = 0x0 IFLA_ADDRESS = 0x1 IFLA_BROADCAST = 0x2 IFLA_IFNAME = 0x3 IFLA_MTU = 0x4 IFLA_LINK = 0x5 IFLA_QDISC = 0x6 IFLA_STATS = 0x7 IFLA_COST = 0x8 IFLA_PRIORITY = 0x9 IFLA_MASTER = 0xa IFLA_WIRELESS = 0xb IFLA_PROTINFO = 0xc IFLA_TXQLEN = 0xd IFLA_MAP = 0xe IFLA_WEIGHT = 0xf IFLA_OPERSTATE = 0x10 IFLA_LINKMODE = 0x11 IFLA_LINKINFO = 0x12 IFLA_NET_NS_PID = 0x13 IFLA_IFALIAS = 0x14 IFLA_MAX = 0x2a RT_SCOPE_UNIVERSE = 0x0 RT_SCOPE_SITE = 0xc8 RT_SCOPE_LINK = 0xfd RT_SCOPE_HOST = 0xfe RT_SCOPE_NOWHERE = 0xff RT_TABLE_UNSPEC = 0x0 RT_TABLE_COMPAT = 0xfc RT_TABLE_DEFAULT = 0xfd RT_TABLE_MAIN = 0xfe RT_TABLE_LOCAL = 0xff RT_TABLE_MAX = 0xffffffff RTA_UNSPEC = 0x0 RTA_DST = 0x1 RTA_SRC = 0x2 RTA_IIF = 0x3 RTA_OIF = 0x4 RTA_GATEWAY = 0x5 RTA_PRIORITY = 0x6 RTA_PREFSRC = 0x7 RTA_METRICS = 0x8 RTA_MULTIPATH = 0x9 RTA_FLOW = 0xb RTA_CACHEINFO = 0xc RTA_TABLE = 0xf RTN_UNSPEC = 0x0 RTN_UNICAST = 0x1 RTN_LOCAL = 0x2 RTN_BROADCAST = 0x3 RTN_ANYCAST = 0x4 RTN_MULTICAST = 0x5 RTN_BLACKHOLE = 0x6 RTN_UNREACHABLE = 0x7 RTN_PROHIBIT = 0x8 RTN_THROW = 0x9 RTN_NAT = 0xa RTN_XRESOLVE = 0xb RTNLGRP_NONE = 0x0 RTNLGRP_LINK = 0x1 RTNLGRP_NOTIFY = 0x2 RTNLGRP_NEIGH = 0x3 RTNLGRP_TC = 0x4 RTNLGRP_IPV4_IFADDR = 0x5 RTNLGRP_IPV4_MROUTE = 0x6 RTNLGRP_IPV4_ROUTE = 0x7 RTNLGRP_IPV4_RULE = 0x8 RTNLGRP_IPV6_IFADDR = 0x9 RTNLGRP_IPV6_MROUTE = 0xa RTNLGRP_IPV6_ROUTE = 0xb RTNLGRP_IPV6_IFINFO = 0xc RTNLGRP_IPV6_PREFIX = 0x12 RTNLGRP_IPV6_RULE = 0x13 RTNLGRP_ND_USEROPT = 0x14 SizeofNlMsghdr = 0x10 SizeofNlMsgerr = 0x14 SizeofRtGenmsg = 0x1 SizeofNlAttr = 0x4 SizeofRtAttr = 0x4 SizeofIfInfomsg = 0x10 SizeofIfAddrmsg = 0x8 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 ) type NlMsghdr struct { Len uint32 Type uint16 Flags uint16 Seq uint32 Pid uint32 } type NlMsgerr struct { Error int32 Msg NlMsghdr } type RtGenmsg struct { Family uint8 } type NlAttr struct { Len uint16 Type uint16 } type RtAttr struct { Len uint16 Type uint16 } type IfInfomsg struct { Family uint8 X__ifi_pad uint8 Type uint16 Index int32 Flags uint32 Change uint32 } type IfAddrmsg struct { Family uint8 Prefixlen uint8 Flags uint8 Scope uint8 Index uint32 } type RtMsg struct { Family uint8 Dst_len uint8 Src_len uint8 Tos uint8 Table uint8 Protocol uint8 Scope uint8 Type uint8 Flags uint32 } type RtNexthop struct { Len uint16 Flags uint8 Hops uint8 Ifindex int32 } const ( SizeofSockFilter = 0x8 SizeofSockFprog = 0x10 ) type SockFilter struct { Code uint16 Jt uint8 Jf uint8 K uint32 } type SockFprog struct { Len uint16 Pad_cgo_0 [6]byte Filter *SockFilter } type InotifyEvent struct { Wd int32 Mask uint32 Cookie uint32 Len uint32 } const SizeofInotifyEvent = 0x10 type PtraceRegs struct { Regs [16]uint64 Tstate uint64 Tpc uint64 Tnpc uint64 Y uint32 Magic uint32 } type ptracePsw struct { } type ptraceFpregs struct { } type ptracePer struct { } type FdSet struct { Bits [16]int64 } type Sysinfo_t struct { Uptime int64 Loads [3]uint64 Totalram uint64 Freeram uint64 Sharedram uint64 Bufferram uint64 Totalswap uint64 Freeswap uint64 Procs uint16 Pad uint16 Pad_cgo_0 [4]byte Totalhigh uint64 Freehigh uint64 Unit uint32 X_f [0]int8 Pad_cgo_1 [4]byte } type Utsname struct { Sysname [65]byte Nodename [65]byte Release [65]byte Version [65]byte Machine [65]byte Domainname [65]byte } type Ustat_t struct { Tfree int32 Pad_cgo_0 [4]byte Tinode uint64 Fname [6]int8 Fpack [6]int8 Pad_cgo_1 [4]byte } type EpollEvent struct { Events uint32 X_padFd int32 Fd int32 Pad int32 } const ( AT_FDCWD = -0x64 AT_REMOVEDIR = 0x200 AT_SYMLINK_FOLLOW = 0x400 AT_SYMLINK_NOFOLLOW = 0x100 ) type PollFd struct { Fd int32 Events int16 Revents int16 } const ( POLLIN = 0x1 POLLPRI = 0x2 POLLOUT = 0x4 POLLRDHUP = 0x800 POLLERR = 0x8 POLLHUP = 0x10 POLLNVAL = 0x20 ) type Sigset_t struct { X__val [16]uint64 } type Termios struct { Iflag uint32 Oflag uint32 Cflag uint32 Lflag uint32 Line uint8 Cc [19]uint8 Ispeed uint32 Ospeed uint32 } ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go ================================================ // cgo -godefs types_netbsd.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build 386,netbsd package unix const ( sizeofPtr = 0x4 sizeofShort = 0x2 sizeofInt = 0x4 sizeofLong = 0x4 sizeofLongLong = 0x8 ) type ( _C_short int16 _C_int int32 _C_long int32 _C_long_long int64 ) type Timespec struct { Sec int64 Nsec int32 } type Timeval struct { Sec int64 Usec int32 } type Rusage struct { Utime Timeval Stime Timeval Maxrss int32 Ixrss int32 Idrss int32 Isrss int32 Minflt int32 Majflt int32 Nswap int32 Inblock int32 Oublock int32 Msgsnd int32 Msgrcv int32 Nsignals int32 Nvcsw int32 Nivcsw int32 } type Rlimit struct { Cur uint64 Max uint64 } type _Gid_t uint32 type Stat_t struct { Dev uint64 Mode uint32 Ino uint64 Nlink uint32 Uid uint32 Gid uint32 Rdev uint64 Atimespec Timespec Mtimespec Timespec Ctimespec Timespec Birthtimespec Timespec Size int64 Blocks int64 Blksize uint32 Flags uint32 Gen uint32 Spare [2]uint32 } type Statfs_t [0]byte type Flock_t struct { Start int64 Len int64 Pid int32 Type int16 Whence int16 } type Dirent struct { Fileno uint64 Reclen uint16 Namlen uint16 Type uint8 Name [512]int8 Pad_cgo_0 [3]byte } type Fsid struct { X__fsid_val [2]int32 } type RawSockaddrInet4 struct { Len uint8 Family uint8 Port uint16 Addr [4]byte /* in_addr */ Zero [8]int8 } type RawSockaddrInet6 struct { Len uint8 Family uint8 Port uint16 Flowinfo uint32 Addr [16]byte /* in6_addr */ Scope_id uint32 } type RawSockaddrUnix struct { Len uint8 Family uint8 Path [104]int8 } type RawSockaddrDatalink struct { Len uint8 Family uint8 Index uint16 Type uint8 Nlen uint8 Alen uint8 Slen uint8 Data [12]int8 } type RawSockaddr struct { Len uint8 Family uint8 Data [14]int8 } type RawSockaddrAny struct { Addr RawSockaddr Pad [92]int8 } type _Socklen uint32 type Linger struct { Onoff int32 Linger int32 } type Iovec struct { Base *byte Len uint32 } type IPMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } type IPv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } type Msghdr struct { Name *byte Namelen uint32 Iov *Iovec Iovlen int32 Control *byte Controllen uint32 Flags int32 } type Cmsghdr struct { Len uint32 Level int32 Type int32 } type Inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } type IPv6MTUInfo struct { Addr RawSockaddrInet6 Mtu uint32 } type ICMPv6Filter struct { Filt [8]uint32 } const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c SizeofSockaddrAny = 0x6c SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x14 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPv6Mreq = 0x14 SizeofMsghdr = 0x1c SizeofCmsghdr = 0xc SizeofInet6Pktinfo = 0x14 SizeofIPv6MTUInfo = 0x20 SizeofICMPv6Filter = 0x20 ) const ( PTRACE_TRACEME = 0x0 PTRACE_CONT = 0x7 PTRACE_KILL = 0x8 ) type Kevent_t struct { Ident uint32 Filter uint32 Flags uint32 Fflags uint32 Data int64 Udata int32 } type FdSet struct { Bits [8]uint32 } const ( SizeofIfMsghdr = 0x98 SizeofIfData = 0x84 SizeofIfaMsghdr = 0x18 SizeofIfAnnounceMsghdr = 0x18 SizeofRtMsghdr = 0x78 SizeofRtMetrics = 0x50 ) type IfMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte Data IfData Pad_cgo_1 [4]byte } type IfData struct { Type uint8 Addrlen uint8 Hdrlen uint8 Pad_cgo_0 [1]byte Link_state int32 Mtu uint64 Metric uint64 Baudrate uint64 Ipackets uint64 Ierrors uint64 Opackets uint64 Oerrors uint64 Collisions uint64 Ibytes uint64 Obytes uint64 Imcasts uint64 Omcasts uint64 Iqdrops uint64 Noproto uint64 Lastchange Timespec } type IfaMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Metric int32 Index uint16 Pad_cgo_0 [6]byte } type IfAnnounceMsghdr struct { Msglen uint16 Version uint8 Type uint8 Index uint16 Name [16]int8 What uint16 } type RtMsghdr struct { Msglen uint16 Version uint8 Type uint8 Index uint16 Pad_cgo_0 [2]byte Flags int32 Addrs int32 Pid int32 Seq int32 Errno int32 Use int32 Inits int32 Pad_cgo_1 [4]byte Rmx RtMetrics } type RtMetrics struct { Locks uint64 Mtu uint64 Hopcount uint64 Recvpipe uint64 Sendpipe uint64 Ssthresh uint64 Rtt uint64 Rttvar uint64 Expire int64 Pksent int64 } type Mclpool [0]byte const ( SizeofBpfVersion = 0x4 SizeofBpfStat = 0x80 SizeofBpfProgram = 0x8 SizeofBpfInsn = 0x8 SizeofBpfHdr = 0x14 ) type BpfVersion struct { Major uint16 Minor uint16 } type BpfStat struct { Recv uint64 Drop uint64 Capt uint64 Padding [13]uint64 } type BpfProgram struct { Len uint32 Insns *BpfInsn } type BpfInsn struct { Code uint16 Jt uint8 Jf uint8 K uint32 } type BpfHdr struct { Tstamp BpfTimeval Caplen uint32 Datalen uint32 Hdrlen uint16 Pad_cgo_0 [2]byte } type BpfTimeval struct { Sec int32 Usec int32 } type Termios struct { Iflag uint32 Oflag uint32 Cflag uint32 Lflag uint32 Cc [20]uint8 Ispeed int32 Ospeed int32 } type Winsize struct { Row uint16 Col uint16 Xpixel uint16 Ypixel uint16 } const ( AT_FDCWD = -0x64 AT_SYMLINK_NOFOLLOW = 0x200 ) type PollFd struct { Fd int32 Events int16 Revents int16 } const ( POLLERR = 0x8 POLLHUP = 0x10 POLLIN = 0x1 POLLNVAL = 0x20 POLLOUT = 0x4 POLLPRI = 0x2 POLLRDBAND = 0x80 POLLRDNORM = 0x40 POLLWRBAND = 0x100 POLLWRNORM = 0x4 ) type Sysctlnode struct { Flags uint32 Num int32 Name [32]int8 Ver uint32 X__rsvd uint32 Un [16]byte X_sysctl_size [8]byte X_sysctl_func [8]byte X_sysctl_parent [8]byte X_sysctl_desc [8]byte } ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go ================================================ // cgo -godefs types_netbsd.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,netbsd package unix const ( sizeofPtr = 0x8 sizeofShort = 0x2 sizeofInt = 0x4 sizeofLong = 0x8 sizeofLongLong = 0x8 ) type ( _C_short int16 _C_int int32 _C_long int64 _C_long_long int64 ) type Timespec struct { Sec int64 Nsec int64 } type Timeval struct { Sec int64 Usec int32 Pad_cgo_0 [4]byte } type Rusage struct { Utime Timeval Stime Timeval Maxrss int64 Ixrss int64 Idrss int64 Isrss int64 Minflt int64 Majflt int64 Nswap int64 Inblock int64 Oublock int64 Msgsnd int64 Msgrcv int64 Nsignals int64 Nvcsw int64 Nivcsw int64 } type Rlimit struct { Cur uint64 Max uint64 } type _Gid_t uint32 type Stat_t struct { Dev uint64 Mode uint32 Pad_cgo_0 [4]byte Ino uint64 Nlink uint32 Uid uint32 Gid uint32 Pad_cgo_1 [4]byte Rdev uint64 Atimespec Timespec Mtimespec Timespec Ctimespec Timespec Birthtimespec Timespec Size int64 Blocks int64 Blksize uint32 Flags uint32 Gen uint32 Spare [2]uint32 Pad_cgo_2 [4]byte } type Statfs_t [0]byte type Flock_t struct { Start int64 Len int64 Pid int32 Type int16 Whence int16 } type Dirent struct { Fileno uint64 Reclen uint16 Namlen uint16 Type uint8 Name [512]int8 Pad_cgo_0 [3]byte } type Fsid struct { X__fsid_val [2]int32 } type RawSockaddrInet4 struct { Len uint8 Family uint8 Port uint16 Addr [4]byte /* in_addr */ Zero [8]int8 } type RawSockaddrInet6 struct { Len uint8 Family uint8 Port uint16 Flowinfo uint32 Addr [16]byte /* in6_addr */ Scope_id uint32 } type RawSockaddrUnix struct { Len uint8 Family uint8 Path [104]int8 } type RawSockaddrDatalink struct { Len uint8 Family uint8 Index uint16 Type uint8 Nlen uint8 Alen uint8 Slen uint8 Data [12]int8 } type RawSockaddr struct { Len uint8 Family uint8 Data [14]int8 } type RawSockaddrAny struct { Addr RawSockaddr Pad [92]int8 } type _Socklen uint32 type Linger struct { Onoff int32 Linger int32 } type Iovec struct { Base *byte Len uint64 } type IPMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } type IPv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } type Msghdr struct { Name *byte Namelen uint32 Pad_cgo_0 [4]byte Iov *Iovec Iovlen int32 Pad_cgo_1 [4]byte Control *byte Controllen uint32 Flags int32 } type Cmsghdr struct { Len uint32 Level int32 Type int32 } type Inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } type IPv6MTUInfo struct { Addr RawSockaddrInet6 Mtu uint32 } type ICMPv6Filter struct { Filt [8]uint32 } const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c SizeofSockaddrAny = 0x6c SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x14 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPv6Mreq = 0x14 SizeofMsghdr = 0x30 SizeofCmsghdr = 0xc SizeofInet6Pktinfo = 0x14 SizeofIPv6MTUInfo = 0x20 SizeofICMPv6Filter = 0x20 ) const ( PTRACE_TRACEME = 0x0 PTRACE_CONT = 0x7 PTRACE_KILL = 0x8 ) type Kevent_t struct { Ident uint64 Filter uint32 Flags uint32 Fflags uint32 Pad_cgo_0 [4]byte Data int64 Udata int64 } type FdSet struct { Bits [8]uint32 } const ( SizeofIfMsghdr = 0x98 SizeofIfData = 0x88 SizeofIfaMsghdr = 0x18 SizeofIfAnnounceMsghdr = 0x18 SizeofRtMsghdr = 0x78 SizeofRtMetrics = 0x50 ) type IfMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte Data IfData } type IfData struct { Type uint8 Addrlen uint8 Hdrlen uint8 Pad_cgo_0 [1]byte Link_state int32 Mtu uint64 Metric uint64 Baudrate uint64 Ipackets uint64 Ierrors uint64 Opackets uint64 Oerrors uint64 Collisions uint64 Ibytes uint64 Obytes uint64 Imcasts uint64 Omcasts uint64 Iqdrops uint64 Noproto uint64 Lastchange Timespec } type IfaMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Metric int32 Index uint16 Pad_cgo_0 [6]byte } type IfAnnounceMsghdr struct { Msglen uint16 Version uint8 Type uint8 Index uint16 Name [16]int8 What uint16 } type RtMsghdr struct { Msglen uint16 Version uint8 Type uint8 Index uint16 Pad_cgo_0 [2]byte Flags int32 Addrs int32 Pid int32 Seq int32 Errno int32 Use int32 Inits int32 Pad_cgo_1 [4]byte Rmx RtMetrics } type RtMetrics struct { Locks uint64 Mtu uint64 Hopcount uint64 Recvpipe uint64 Sendpipe uint64 Ssthresh uint64 Rtt uint64 Rttvar uint64 Expire int64 Pksent int64 } type Mclpool [0]byte const ( SizeofBpfVersion = 0x4 SizeofBpfStat = 0x80 SizeofBpfProgram = 0x10 SizeofBpfInsn = 0x8 SizeofBpfHdr = 0x20 ) type BpfVersion struct { Major uint16 Minor uint16 } type BpfStat struct { Recv uint64 Drop uint64 Capt uint64 Padding [13]uint64 } type BpfProgram struct { Len uint32 Pad_cgo_0 [4]byte Insns *BpfInsn } type BpfInsn struct { Code uint16 Jt uint8 Jf uint8 K uint32 } type BpfHdr struct { Tstamp BpfTimeval Caplen uint32 Datalen uint32 Hdrlen uint16 Pad_cgo_0 [6]byte } type BpfTimeval struct { Sec int64 Usec int64 } type Termios struct { Iflag uint32 Oflag uint32 Cflag uint32 Lflag uint32 Cc [20]uint8 Ispeed int32 Ospeed int32 } type Winsize struct { Row uint16 Col uint16 Xpixel uint16 Ypixel uint16 } const ( AT_FDCWD = -0x64 AT_SYMLINK_NOFOLLOW = 0x200 ) type PollFd struct { Fd int32 Events int16 Revents int16 } const ( POLLERR = 0x8 POLLHUP = 0x10 POLLIN = 0x1 POLLNVAL = 0x20 POLLOUT = 0x4 POLLPRI = 0x2 POLLRDBAND = 0x80 POLLRDNORM = 0x40 POLLWRBAND = 0x100 POLLWRNORM = 0x4 ) type Sysctlnode struct { Flags uint32 Num int32 Name [32]int8 Ver uint32 X__rsvd uint32 Un [16]byte X_sysctl_size [8]byte X_sysctl_func [8]byte X_sysctl_parent [8]byte X_sysctl_desc [8]byte } ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go ================================================ // cgo -godefs types_netbsd.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build arm,netbsd package unix const ( sizeofPtr = 0x4 sizeofShort = 0x2 sizeofInt = 0x4 sizeofLong = 0x4 sizeofLongLong = 0x8 ) type ( _C_short int16 _C_int int32 _C_long int32 _C_long_long int64 ) type Timespec struct { Sec int64 Nsec int32 Pad_cgo_0 [4]byte } type Timeval struct { Sec int64 Usec int32 Pad_cgo_0 [4]byte } type Rusage struct { Utime Timeval Stime Timeval Maxrss int32 Ixrss int32 Idrss int32 Isrss int32 Minflt int32 Majflt int32 Nswap int32 Inblock int32 Oublock int32 Msgsnd int32 Msgrcv int32 Nsignals int32 Nvcsw int32 Nivcsw int32 } type Rlimit struct { Cur uint64 Max uint64 } type _Gid_t uint32 type Stat_t struct { Dev uint64 Mode uint32 Pad_cgo_0 [4]byte Ino uint64 Nlink uint32 Uid uint32 Gid uint32 Pad_cgo_1 [4]byte Rdev uint64 Atimespec Timespec Mtimespec Timespec Ctimespec Timespec Birthtimespec Timespec Size int64 Blocks int64 Blksize uint32 Flags uint32 Gen uint32 Spare [2]uint32 Pad_cgo_2 [4]byte } type Statfs_t [0]byte type Flock_t struct { Start int64 Len int64 Pid int32 Type int16 Whence int16 } type Dirent struct { Fileno uint64 Reclen uint16 Namlen uint16 Type uint8 Name [512]int8 Pad_cgo_0 [3]byte } type Fsid struct { X__fsid_val [2]int32 } type RawSockaddrInet4 struct { Len uint8 Family uint8 Port uint16 Addr [4]byte /* in_addr */ Zero [8]int8 } type RawSockaddrInet6 struct { Len uint8 Family uint8 Port uint16 Flowinfo uint32 Addr [16]byte /* in6_addr */ Scope_id uint32 } type RawSockaddrUnix struct { Len uint8 Family uint8 Path [104]int8 } type RawSockaddrDatalink struct { Len uint8 Family uint8 Index uint16 Type uint8 Nlen uint8 Alen uint8 Slen uint8 Data [12]int8 } type RawSockaddr struct { Len uint8 Family uint8 Data [14]int8 } type RawSockaddrAny struct { Addr RawSockaddr Pad [92]int8 } type _Socklen uint32 type Linger struct { Onoff int32 Linger int32 } type Iovec struct { Base *byte Len uint32 } type IPMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } type IPv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } type Msghdr struct { Name *byte Namelen uint32 Iov *Iovec Iovlen int32 Control *byte Controllen uint32 Flags int32 } type Cmsghdr struct { Len uint32 Level int32 Type int32 } type Inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } type IPv6MTUInfo struct { Addr RawSockaddrInet6 Mtu uint32 } type ICMPv6Filter struct { Filt [8]uint32 } const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c SizeofSockaddrAny = 0x6c SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x14 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPv6Mreq = 0x14 SizeofMsghdr = 0x1c SizeofCmsghdr = 0xc SizeofInet6Pktinfo = 0x14 SizeofIPv6MTUInfo = 0x20 SizeofICMPv6Filter = 0x20 ) const ( PTRACE_TRACEME = 0x0 PTRACE_CONT = 0x7 PTRACE_KILL = 0x8 ) type Kevent_t struct { Ident uint32 Filter uint32 Flags uint32 Fflags uint32 Data int64 Udata int32 Pad_cgo_0 [4]byte } type FdSet struct { Bits [8]uint32 } const ( SizeofIfMsghdr = 0x98 SizeofIfData = 0x88 SizeofIfaMsghdr = 0x18 SizeofIfAnnounceMsghdr = 0x18 SizeofRtMsghdr = 0x78 SizeofRtMetrics = 0x50 ) type IfMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte Data IfData } type IfData struct { Type uint8 Addrlen uint8 Hdrlen uint8 Pad_cgo_0 [1]byte Link_state int32 Mtu uint64 Metric uint64 Baudrate uint64 Ipackets uint64 Ierrors uint64 Opackets uint64 Oerrors uint64 Collisions uint64 Ibytes uint64 Obytes uint64 Imcasts uint64 Omcasts uint64 Iqdrops uint64 Noproto uint64 Lastchange Timespec } type IfaMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Metric int32 Index uint16 Pad_cgo_0 [6]byte } type IfAnnounceMsghdr struct { Msglen uint16 Version uint8 Type uint8 Index uint16 Name [16]int8 What uint16 } type RtMsghdr struct { Msglen uint16 Version uint8 Type uint8 Index uint16 Pad_cgo_0 [2]byte Flags int32 Addrs int32 Pid int32 Seq int32 Errno int32 Use int32 Inits int32 Pad_cgo_1 [4]byte Rmx RtMetrics } type RtMetrics struct { Locks uint64 Mtu uint64 Hopcount uint64 Recvpipe uint64 Sendpipe uint64 Ssthresh uint64 Rtt uint64 Rttvar uint64 Expire int64 Pksent int64 } type Mclpool [0]byte const ( SizeofBpfVersion = 0x4 SizeofBpfStat = 0x80 SizeofBpfProgram = 0x8 SizeofBpfInsn = 0x8 SizeofBpfHdr = 0x14 ) type BpfVersion struct { Major uint16 Minor uint16 } type BpfStat struct { Recv uint64 Drop uint64 Capt uint64 Padding [13]uint64 } type BpfProgram struct { Len uint32 Insns *BpfInsn } type BpfInsn struct { Code uint16 Jt uint8 Jf uint8 K uint32 } type BpfHdr struct { Tstamp BpfTimeval Caplen uint32 Datalen uint32 Hdrlen uint16 Pad_cgo_0 [2]byte } type BpfTimeval struct { Sec int32 Usec int32 } type Termios struct { Iflag uint32 Oflag uint32 Cflag uint32 Lflag uint32 Cc [20]uint8 Ispeed int32 Ospeed int32 } type Winsize struct { Row uint16 Col uint16 Xpixel uint16 Ypixel uint16 } const ( AT_FDCWD = -0x64 AT_SYMLINK_NOFOLLOW = 0x200 ) type PollFd struct { Fd int32 Events int16 Revents int16 } const ( POLLERR = 0x8 POLLHUP = 0x10 POLLIN = 0x1 POLLNVAL = 0x20 POLLOUT = 0x4 POLLPRI = 0x2 POLLRDBAND = 0x80 POLLRDNORM = 0x40 POLLWRBAND = 0x100 POLLWRNORM = 0x4 ) type Sysctlnode struct { Flags uint32 Num int32 Name [32]int8 Ver uint32 X__rsvd uint32 Un [16]byte X_sysctl_size [8]byte X_sysctl_func [8]byte X_sysctl_parent [8]byte X_sysctl_desc [8]byte } ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go ================================================ // cgo -godefs types_openbsd.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build 386,openbsd package unix const ( sizeofPtr = 0x4 sizeofShort = 0x2 sizeofInt = 0x4 sizeofLong = 0x4 sizeofLongLong = 0x8 ) type ( _C_short int16 _C_int int32 _C_long int32 _C_long_long int64 ) type Timespec struct { Sec int64 Nsec int32 } type Timeval struct { Sec int64 Usec int32 } type Rusage struct { Utime Timeval Stime Timeval Maxrss int32 Ixrss int32 Idrss int32 Isrss int32 Minflt int32 Majflt int32 Nswap int32 Inblock int32 Oublock int32 Msgsnd int32 Msgrcv int32 Nsignals int32 Nvcsw int32 Nivcsw int32 } type Rlimit struct { Cur uint64 Max uint64 } type _Gid_t uint32 const ( S_IFMT = 0xf000 S_IFIFO = 0x1000 S_IFCHR = 0x2000 S_IFDIR = 0x4000 S_IFBLK = 0x6000 S_IFREG = 0x8000 S_IFLNK = 0xa000 S_IFSOCK = 0xc000 S_ISUID = 0x800 S_ISGID = 0x400 S_ISVTX = 0x200 S_IRUSR = 0x100 S_IWUSR = 0x80 S_IXUSR = 0x40 ) type Stat_t struct { Mode uint32 Dev int32 Ino uint64 Nlink uint32 Uid uint32 Gid uint32 Rdev int32 Atim Timespec Mtim Timespec Ctim Timespec Size int64 Blocks int64 Blksize uint32 Flags uint32 Gen uint32 X__st_birthtim Timespec } type Statfs_t struct { F_flags uint32 F_bsize uint32 F_iosize uint32 F_blocks uint64 F_bfree uint64 F_bavail int64 F_files uint64 F_ffree uint64 F_favail int64 F_syncwrites uint64 F_syncreads uint64 F_asyncwrites uint64 F_asyncreads uint64 F_fsid Fsid F_namemax uint32 F_owner uint32 F_ctime uint64 F_fstypename [16]int8 F_mntonname [90]int8 F_mntfromname [90]int8 F_mntfromspec [90]int8 Pad_cgo_0 [2]byte Mount_info [160]byte } type Flock_t struct { Start int64 Len int64 Pid int32 Type int16 Whence int16 } type Dirent struct { Fileno uint64 Off int64 Reclen uint16 Type uint8 Namlen uint8 X__d_padding [4]uint8 Name [256]int8 } type Fsid struct { Val [2]int32 } type RawSockaddrInet4 struct { Len uint8 Family uint8 Port uint16 Addr [4]byte /* in_addr */ Zero [8]int8 } type RawSockaddrInet6 struct { Len uint8 Family uint8 Port uint16 Flowinfo uint32 Addr [16]byte /* in6_addr */ Scope_id uint32 } type RawSockaddrUnix struct { Len uint8 Family uint8 Path [104]int8 } type RawSockaddrDatalink struct { Len uint8 Family uint8 Index uint16 Type uint8 Nlen uint8 Alen uint8 Slen uint8 Data [24]int8 } type RawSockaddr struct { Len uint8 Family uint8 Data [14]int8 } type RawSockaddrAny struct { Addr RawSockaddr Pad [92]int8 } type _Socklen uint32 type Linger struct { Onoff int32 Linger int32 } type Iovec struct { Base *byte Len uint32 } type IPMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } type IPv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } type Msghdr struct { Name *byte Namelen uint32 Iov *Iovec Iovlen uint32 Control *byte Controllen uint32 Flags int32 } type Cmsghdr struct { Len uint32 Level int32 Type int32 } type Inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } type IPv6MTUInfo struct { Addr RawSockaddrInet6 Mtu uint32 } type ICMPv6Filter struct { Filt [8]uint32 } const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c SizeofSockaddrAny = 0x6c SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x20 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPv6Mreq = 0x14 SizeofMsghdr = 0x1c SizeofCmsghdr = 0xc SizeofInet6Pktinfo = 0x14 SizeofIPv6MTUInfo = 0x20 SizeofICMPv6Filter = 0x20 ) const ( PTRACE_TRACEME = 0x0 PTRACE_CONT = 0x7 PTRACE_KILL = 0x8 ) type Kevent_t struct { Ident uint32 Filter int16 Flags uint16 Fflags uint32 Data int64 Udata *byte } type FdSet struct { Bits [32]uint32 } const ( SizeofIfMsghdr = 0xec SizeofIfData = 0xd4 SizeofIfaMsghdr = 0x18 SizeofIfAnnounceMsghdr = 0x1a SizeofRtMsghdr = 0x60 SizeofRtMetrics = 0x38 ) type IfMsghdr struct { Msglen uint16 Version uint8 Type uint8 Hdrlen uint16 Index uint16 Tableid uint16 Pad1 uint8 Pad2 uint8 Addrs int32 Flags int32 Xflags int32 Data IfData } type IfData struct { Type uint8 Addrlen uint8 Hdrlen uint8 Link_state uint8 Mtu uint32 Metric uint32 Pad uint32 Baudrate uint64 Ipackets uint64 Ierrors uint64 Opackets uint64 Oerrors uint64 Collisions uint64 Ibytes uint64 Obytes uint64 Imcasts uint64 Omcasts uint64 Iqdrops uint64 Noproto uint64 Capabilities uint32 Lastchange Timeval Mclpool [7]Mclpool } type IfaMsghdr struct { Msglen uint16 Version uint8 Type uint8 Hdrlen uint16 Index uint16 Tableid uint16 Pad1 uint8 Pad2 uint8 Addrs int32 Flags int32 Metric int32 } type IfAnnounceMsghdr struct { Msglen uint16 Version uint8 Type uint8 Hdrlen uint16 Index uint16 What uint16 Name [16]int8 } type RtMsghdr struct { Msglen uint16 Version uint8 Type uint8 Hdrlen uint16 Index uint16 Tableid uint16 Priority uint8 Mpls uint8 Addrs int32 Flags int32 Fmask int32 Pid int32 Seq int32 Errno int32 Inits uint32 Rmx RtMetrics } type RtMetrics struct { Pksent uint64 Expire int64 Locks uint32 Mtu uint32 Refcnt uint32 Hopcount uint32 Recvpipe uint32 Sendpipe uint32 Ssthresh uint32 Rtt uint32 Rttvar uint32 Pad uint32 } type Mclpool struct { Grown int32 Alive uint16 Hwm uint16 Cwm uint16 Lwm uint16 } const ( SizeofBpfVersion = 0x4 SizeofBpfStat = 0x8 SizeofBpfProgram = 0x8 SizeofBpfInsn = 0x8 SizeofBpfHdr = 0x14 ) type BpfVersion struct { Major uint16 Minor uint16 } type BpfStat struct { Recv uint32 Drop uint32 } type BpfProgram struct { Len uint32 Insns *BpfInsn } type BpfInsn struct { Code uint16 Jt uint8 Jf uint8 K uint32 } type BpfHdr struct { Tstamp BpfTimeval Caplen uint32 Datalen uint32 Hdrlen uint16 Pad_cgo_0 [2]byte } type BpfTimeval struct { Sec uint32 Usec uint32 } type Termios struct { Iflag uint32 Oflag uint32 Cflag uint32 Lflag uint32 Cc [20]uint8 Ispeed int32 Ospeed int32 } type Winsize struct { Row uint16 Col uint16 Xpixel uint16 Ypixel uint16 } const ( AT_FDCWD = -0x64 AT_SYMLINK_NOFOLLOW = 0x2 ) type PollFd struct { Fd int32 Events int16 Revents int16 } const ( POLLERR = 0x8 POLLHUP = 0x10 POLLIN = 0x1 POLLNVAL = 0x20 POLLOUT = 0x4 POLLPRI = 0x2 POLLRDBAND = 0x80 POLLRDNORM = 0x40 POLLWRBAND = 0x100 POLLWRNORM = 0x4 ) ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go ================================================ // cgo -godefs types_openbsd.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,openbsd package unix const ( sizeofPtr = 0x8 sizeofShort = 0x2 sizeofInt = 0x4 sizeofLong = 0x8 sizeofLongLong = 0x8 ) type ( _C_short int16 _C_int int32 _C_long int64 _C_long_long int64 ) type Timespec struct { Sec int64 Nsec int64 } type Timeval struct { Sec int64 Usec int64 } type Rusage struct { Utime Timeval Stime Timeval Maxrss int64 Ixrss int64 Idrss int64 Isrss int64 Minflt int64 Majflt int64 Nswap int64 Inblock int64 Oublock int64 Msgsnd int64 Msgrcv int64 Nsignals int64 Nvcsw int64 Nivcsw int64 } type Rlimit struct { Cur uint64 Max uint64 } type _Gid_t uint32 const ( S_IFMT = 0xf000 S_IFIFO = 0x1000 S_IFCHR = 0x2000 S_IFDIR = 0x4000 S_IFBLK = 0x6000 S_IFREG = 0x8000 S_IFLNK = 0xa000 S_IFSOCK = 0xc000 S_ISUID = 0x800 S_ISGID = 0x400 S_ISVTX = 0x200 S_IRUSR = 0x100 S_IWUSR = 0x80 S_IXUSR = 0x40 ) type Stat_t struct { Mode uint32 Dev int32 Ino uint64 Nlink uint32 Uid uint32 Gid uint32 Rdev int32 Atim Timespec Mtim Timespec Ctim Timespec Size int64 Blocks int64 Blksize uint32 Flags uint32 Gen uint32 Pad_cgo_0 [4]byte X__st_birthtim Timespec } type Statfs_t struct { F_flags uint32 F_bsize uint32 F_iosize uint32 Pad_cgo_0 [4]byte F_blocks uint64 F_bfree uint64 F_bavail int64 F_files uint64 F_ffree uint64 F_favail int64 F_syncwrites uint64 F_syncreads uint64 F_asyncwrites uint64 F_asyncreads uint64 F_fsid Fsid F_namemax uint32 F_owner uint32 F_ctime uint64 F_fstypename [16]int8 F_mntonname [90]int8 F_mntfromname [90]int8 F_mntfromspec [90]int8 Pad_cgo_1 [2]byte Mount_info [160]byte } type Flock_t struct { Start int64 Len int64 Pid int32 Type int16 Whence int16 } type Dirent struct { Fileno uint64 Off int64 Reclen uint16 Type uint8 Namlen uint8 X__d_padding [4]uint8 Name [256]int8 } type Fsid struct { Val [2]int32 } type RawSockaddrInet4 struct { Len uint8 Family uint8 Port uint16 Addr [4]byte /* in_addr */ Zero [8]int8 } type RawSockaddrInet6 struct { Len uint8 Family uint8 Port uint16 Flowinfo uint32 Addr [16]byte /* in6_addr */ Scope_id uint32 } type RawSockaddrUnix struct { Len uint8 Family uint8 Path [104]int8 } type RawSockaddrDatalink struct { Len uint8 Family uint8 Index uint16 Type uint8 Nlen uint8 Alen uint8 Slen uint8 Data [24]int8 } type RawSockaddr struct { Len uint8 Family uint8 Data [14]int8 } type RawSockaddrAny struct { Addr RawSockaddr Pad [92]int8 } type _Socklen uint32 type Linger struct { Onoff int32 Linger int32 } type Iovec struct { Base *byte Len uint64 } type IPMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } type IPv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } type Msghdr struct { Name *byte Namelen uint32 Pad_cgo_0 [4]byte Iov *Iovec Iovlen uint32 Pad_cgo_1 [4]byte Control *byte Controllen uint32 Flags int32 } type Cmsghdr struct { Len uint32 Level int32 Type int32 } type Inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } type IPv6MTUInfo struct { Addr RawSockaddrInet6 Mtu uint32 } type ICMPv6Filter struct { Filt [8]uint32 } const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c SizeofSockaddrAny = 0x6c SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x20 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPv6Mreq = 0x14 SizeofMsghdr = 0x30 SizeofCmsghdr = 0xc SizeofInet6Pktinfo = 0x14 SizeofIPv6MTUInfo = 0x20 SizeofICMPv6Filter = 0x20 ) const ( PTRACE_TRACEME = 0x0 PTRACE_CONT = 0x7 PTRACE_KILL = 0x8 ) type Kevent_t struct { Ident uint64 Filter int16 Flags uint16 Fflags uint32 Data int64 Udata *byte } type FdSet struct { Bits [32]uint32 } const ( SizeofIfMsghdr = 0xf8 SizeofIfData = 0xe0 SizeofIfaMsghdr = 0x18 SizeofIfAnnounceMsghdr = 0x1a SizeofRtMsghdr = 0x60 SizeofRtMetrics = 0x38 ) type IfMsghdr struct { Msglen uint16 Version uint8 Type uint8 Hdrlen uint16 Index uint16 Tableid uint16 Pad1 uint8 Pad2 uint8 Addrs int32 Flags int32 Xflags int32 Data IfData } type IfData struct { Type uint8 Addrlen uint8 Hdrlen uint8 Link_state uint8 Mtu uint32 Metric uint32 Pad uint32 Baudrate uint64 Ipackets uint64 Ierrors uint64 Opackets uint64 Oerrors uint64 Collisions uint64 Ibytes uint64 Obytes uint64 Imcasts uint64 Omcasts uint64 Iqdrops uint64 Noproto uint64 Capabilities uint32 Pad_cgo_0 [4]byte Lastchange Timeval Mclpool [7]Mclpool Pad_cgo_1 [4]byte } type IfaMsghdr struct { Msglen uint16 Version uint8 Type uint8 Hdrlen uint16 Index uint16 Tableid uint16 Pad1 uint8 Pad2 uint8 Addrs int32 Flags int32 Metric int32 } type IfAnnounceMsghdr struct { Msglen uint16 Version uint8 Type uint8 Hdrlen uint16 Index uint16 What uint16 Name [16]int8 } type RtMsghdr struct { Msglen uint16 Version uint8 Type uint8 Hdrlen uint16 Index uint16 Tableid uint16 Priority uint8 Mpls uint8 Addrs int32 Flags int32 Fmask int32 Pid int32 Seq int32 Errno int32 Inits uint32 Rmx RtMetrics } type RtMetrics struct { Pksent uint64 Expire int64 Locks uint32 Mtu uint32 Refcnt uint32 Hopcount uint32 Recvpipe uint32 Sendpipe uint32 Ssthresh uint32 Rtt uint32 Rttvar uint32 Pad uint32 } type Mclpool struct { Grown int32 Alive uint16 Hwm uint16 Cwm uint16 Lwm uint16 } const ( SizeofBpfVersion = 0x4 SizeofBpfStat = 0x8 SizeofBpfProgram = 0x10 SizeofBpfInsn = 0x8 SizeofBpfHdr = 0x14 ) type BpfVersion struct { Major uint16 Minor uint16 } type BpfStat struct { Recv uint32 Drop uint32 } type BpfProgram struct { Len uint32 Pad_cgo_0 [4]byte Insns *BpfInsn } type BpfInsn struct { Code uint16 Jt uint8 Jf uint8 K uint32 } type BpfHdr struct { Tstamp BpfTimeval Caplen uint32 Datalen uint32 Hdrlen uint16 Pad_cgo_0 [2]byte } type BpfTimeval struct { Sec uint32 Usec uint32 } type Termios struct { Iflag uint32 Oflag uint32 Cflag uint32 Lflag uint32 Cc [20]uint8 Ispeed int32 Ospeed int32 } type Winsize struct { Row uint16 Col uint16 Xpixel uint16 Ypixel uint16 } const ( AT_FDCWD = -0x64 AT_SYMLINK_NOFOLLOW = 0x2 ) type PollFd struct { Fd int32 Events int16 Revents int16 } const ( POLLERR = 0x8 POLLHUP = 0x10 POLLIN = 0x1 POLLNVAL = 0x20 POLLOUT = 0x4 POLLPRI = 0x2 POLLRDBAND = 0x80 POLLRDNORM = 0x40 POLLWRBAND = 0x100 POLLWRNORM = 0x4 ) ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go ================================================ // cgo -godefs types_openbsd.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build arm,openbsd package unix const ( sizeofPtr = 0x4 sizeofShort = 0x2 sizeofInt = 0x4 sizeofLong = 0x4 sizeofLongLong = 0x8 ) type ( _C_short int16 _C_int int32 _C_long int32 _C_long_long int64 ) type Timespec struct { Sec int64 Nsec int32 } type Timeval struct { Sec int64 Usec int32 } type Rusage struct { Utime Timeval Stime Timeval Maxrss int32 Ixrss int32 Idrss int32 Isrss int32 Minflt int32 Majflt int32 Nswap int32 Inblock int32 Oublock int32 Msgsnd int32 Msgrcv int32 Nsignals int32 Nvcsw int32 Nivcsw int32 } type Rlimit struct { Cur uint64 Max uint64 } type _Gid_t uint32 const ( S_IFMT = 0xf000 S_IFIFO = 0x1000 S_IFCHR = 0x2000 S_IFDIR = 0x4000 S_IFBLK = 0x6000 S_IFREG = 0x8000 S_IFLNK = 0xa000 S_IFSOCK = 0xc000 S_ISUID = 0x800 S_ISGID = 0x400 S_ISVTX = 0x200 S_IRUSR = 0x100 S_IWUSR = 0x80 S_IXUSR = 0x40 ) type Stat_t struct { Mode uint32 Dev int32 Ino uint64 Nlink uint32 Uid uint32 Gid uint32 Rdev int32 Atim Timespec Mtim Timespec Ctim Timespec Size int64 Blocks int64 Blksize int32 Flags uint32 Gen uint32 X__st_birthtim Timespec } type Statfs_t struct { F_flags uint32 F_bsize uint32 F_iosize uint32 F_blocks uint64 F_bfree uint64 F_bavail int64 F_files uint64 F_ffree uint64 F_favail int64 F_syncwrites uint64 F_syncreads uint64 F_asyncwrites uint64 F_asyncreads uint64 F_fsid Fsid F_namemax uint32 F_owner uint32 F_ctime uint64 F_fstypename [16]uint8 F_mntonname [90]uint8 F_mntfromname [90]uint8 F_mntfromspec [90]uint8 Pad_cgo_0 [2]byte Mount_info [160]byte } type Flock_t struct { Start int64 Len int64 Pid int32 Type int16 Whence int16 } type Dirent struct { Fileno uint64 Off int64 Reclen uint16 Type uint8 Namlen uint8 X__d_padding [4]uint8 Name [256]uint8 } type Fsid struct { Val [2]int32 } type RawSockaddrInet4 struct { Len uint8 Family uint8 Port uint16 Addr [4]byte /* in_addr */ Zero [8]int8 } type RawSockaddrInet6 struct { Len uint8 Family uint8 Port uint16 Flowinfo uint32 Addr [16]byte /* in6_addr */ Scope_id uint32 } type RawSockaddrUnix struct { Len uint8 Family uint8 Path [104]int8 } type RawSockaddrDatalink struct { Len uint8 Family uint8 Index uint16 Type uint8 Nlen uint8 Alen uint8 Slen uint8 Data [24]int8 } type RawSockaddr struct { Len uint8 Family uint8 Data [14]int8 } type RawSockaddrAny struct { Addr RawSockaddr Pad [92]int8 } type _Socklen uint32 type Linger struct { Onoff int32 Linger int32 } type Iovec struct { Base *byte Len uint32 } type IPMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } type IPv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } type Msghdr struct { Name *byte Namelen uint32 Iov *Iovec Iovlen uint32 Control *byte Controllen uint32 Flags int32 } type Cmsghdr struct { Len uint32 Level int32 Type int32 } type Inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } type IPv6MTUInfo struct { Addr RawSockaddrInet6 Mtu uint32 } type ICMPv6Filter struct { Filt [8]uint32 } const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c SizeofSockaddrAny = 0x6c SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x20 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPv6Mreq = 0x14 SizeofMsghdr = 0x1c SizeofCmsghdr = 0xc SizeofInet6Pktinfo = 0x14 SizeofIPv6MTUInfo = 0x20 SizeofICMPv6Filter = 0x20 ) const ( PTRACE_TRACEME = 0x0 PTRACE_CONT = 0x7 PTRACE_KILL = 0x8 ) type Kevent_t struct { Ident uint32 Filter int16 Flags uint16 Fflags uint32 Data int64 Udata *byte } type FdSet struct { Bits [32]uint32 } const ( SizeofIfMsghdr = 0x98 SizeofIfData = 0x80 SizeofIfaMsghdr = 0x18 SizeofIfAnnounceMsghdr = 0x1a SizeofRtMsghdr = 0x60 SizeofRtMetrics = 0x38 ) type IfMsghdr struct { Msglen uint16 Version uint8 Type uint8 Hdrlen uint16 Index uint16 Tableid uint16 Pad1 uint8 Pad2 uint8 Addrs int32 Flags int32 Xflags int32 Data IfData } type IfData struct { Type uint8 Addrlen uint8 Hdrlen uint8 Link_state uint8 Mtu uint32 Metric uint32 Pad uint32 Baudrate uint64 Ipackets uint64 Ierrors uint64 Opackets uint64 Oerrors uint64 Collisions uint64 Ibytes uint64 Obytes uint64 Imcasts uint64 Omcasts uint64 Iqdrops uint64 Noproto uint64 Capabilities uint32 Lastchange Timeval } type IfaMsghdr struct { Msglen uint16 Version uint8 Type uint8 Hdrlen uint16 Index uint16 Tableid uint16 Pad1 uint8 Pad2 uint8 Addrs int32 Flags int32 Metric int32 } type IfAnnounceMsghdr struct { Msglen uint16 Version uint8 Type uint8 Hdrlen uint16 Index uint16 What uint16 Name [16]uint8 } type RtMsghdr struct { Msglen uint16 Version uint8 Type uint8 Hdrlen uint16 Index uint16 Tableid uint16 Priority uint8 Mpls uint8 Addrs int32 Flags int32 Fmask int32 Pid int32 Seq int32 Errno int32 Inits uint32 Rmx RtMetrics } type RtMetrics struct { Pksent uint64 Expire int64 Locks uint32 Mtu uint32 Refcnt uint32 Hopcount uint32 Recvpipe uint32 Sendpipe uint32 Ssthresh uint32 Rtt uint32 Rttvar uint32 Pad uint32 } type Mclpool struct{} const ( SizeofBpfVersion = 0x4 SizeofBpfStat = 0x8 SizeofBpfProgram = 0x8 SizeofBpfInsn = 0x8 SizeofBpfHdr = 0x14 ) type BpfVersion struct { Major uint16 Minor uint16 } type BpfStat struct { Recv uint32 Drop uint32 } type BpfProgram struct { Len uint32 Insns *BpfInsn } type BpfInsn struct { Code uint16 Jt uint8 Jf uint8 K uint32 } type BpfHdr struct { Tstamp BpfTimeval Caplen uint32 Datalen uint32 Hdrlen uint16 Pad_cgo_0 [2]byte } type BpfTimeval struct { Sec uint32 Usec uint32 } type Termios struct { Iflag uint32 Oflag uint32 Cflag uint32 Lflag uint32 Cc [20]uint8 Ispeed int32 Ospeed int32 } type Winsize struct { Row uint16 Col uint16 Xpixel uint16 Ypixel uint16 } const ( AT_FDCWD = -0x64 AT_SYMLINK_NOFOLLOW = 0x2 ) type PollFd struct { Fd int32 Events int16 Revents int16 } const ( POLLERR = 0x8 POLLHUP = 0x10 POLLIN = 0x1 POLLNVAL = 0x20 POLLOUT = 0x4 POLLPRI = 0x2 POLLRDBAND = 0x80 POLLRDNORM = 0x40 POLLWRBAND = 0x100 POLLWRNORM = 0x4 ) ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go ================================================ // cgo -godefs types_solaris.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,solaris package unix const ( sizeofPtr = 0x8 sizeofShort = 0x2 sizeofInt = 0x4 sizeofLong = 0x8 sizeofLongLong = 0x8 PathMax = 0x400 MaxHostNameLen = 0x100 ) type ( _C_short int16 _C_int int32 _C_long int64 _C_long_long int64 ) type Timespec struct { Sec int64 Nsec int64 } type Timeval struct { Sec int64 Usec int64 } type Timeval32 struct { Sec int32 Usec int32 } type Tms struct { Utime int64 Stime int64 Cutime int64 Cstime int64 } type Utimbuf struct { Actime int64 Modtime int64 } type Rusage struct { Utime Timeval Stime Timeval Maxrss int64 Ixrss int64 Idrss int64 Isrss int64 Minflt int64 Majflt int64 Nswap int64 Inblock int64 Oublock int64 Msgsnd int64 Msgrcv int64 Nsignals int64 Nvcsw int64 Nivcsw int64 } type Rlimit struct { Cur uint64 Max uint64 } type _Gid_t uint32 const ( S_IFMT = 0xf000 S_IFIFO = 0x1000 S_IFCHR = 0x2000 S_IFDIR = 0x4000 S_IFBLK = 0x6000 S_IFREG = 0x8000 S_IFLNK = 0xa000 S_IFSOCK = 0xc000 S_ISUID = 0x800 S_ISGID = 0x400 S_ISVTX = 0x200 S_IRUSR = 0x100 S_IWUSR = 0x80 S_IXUSR = 0x40 ) type Stat_t struct { Dev uint64 Ino uint64 Mode uint32 Nlink uint32 Uid uint32 Gid uint32 Rdev uint64 Size int64 Atim Timespec Mtim Timespec Ctim Timespec Blksize int32 Pad_cgo_0 [4]byte Blocks int64 Fstype [16]int8 } type Flock_t struct { Type int16 Whence int16 Pad_cgo_0 [4]byte Start int64 Len int64 Sysid int32 Pid int32 Pad [4]int64 } type Dirent struct { Ino uint64 Off int64 Reclen uint16 Name [1]int8 Pad_cgo_0 [5]byte } type _Fsblkcnt_t uint64 type Statvfs_t struct { Bsize uint64 Frsize uint64 Blocks uint64 Bfree uint64 Bavail uint64 Files uint64 Ffree uint64 Favail uint64 Fsid uint64 Basetype [16]int8 Flag uint64 Namemax uint64 Fstr [32]int8 } type RawSockaddrInet4 struct { Family uint16 Port uint16 Addr [4]byte /* in_addr */ Zero [8]int8 } type RawSockaddrInet6 struct { Family uint16 Port uint16 Flowinfo uint32 Addr [16]byte /* in6_addr */ Scope_id uint32 X__sin6_src_id uint32 } type RawSockaddrUnix struct { Family uint16 Path [108]int8 } type RawSockaddrDatalink struct { Family uint16 Index uint16 Type uint8 Nlen uint8 Alen uint8 Slen uint8 Data [244]int8 } type RawSockaddr struct { Family uint16 Data [14]int8 } type RawSockaddrAny struct { Addr RawSockaddr Pad [236]int8 } type _Socklen uint32 type Linger struct { Onoff int32 Linger int32 } type Iovec struct { Base *int8 Len uint64 } type IPMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } type IPv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } type Msghdr struct { Name *byte Namelen uint32 Pad_cgo_0 [4]byte Iov *Iovec Iovlen int32 Pad_cgo_1 [4]byte Accrights *int8 Accrightslen int32 Pad_cgo_2 [4]byte } type Cmsghdr struct { Len uint32 Level int32 Type int32 } type Inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } type IPv6MTUInfo struct { Addr RawSockaddrInet6 Mtu uint32 } type ICMPv6Filter struct { X__icmp6_filt [8]uint32 } const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x20 SizeofSockaddrAny = 0xfc SizeofSockaddrUnix = 0x6e SizeofSockaddrDatalink = 0xfc SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPv6Mreq = 0x14 SizeofMsghdr = 0x30 SizeofCmsghdr = 0xc SizeofInet6Pktinfo = 0x14 SizeofIPv6MTUInfo = 0x24 SizeofICMPv6Filter = 0x20 ) type FdSet struct { Bits [1024]int64 } type Utsname struct { Sysname [257]byte Nodename [257]byte Release [257]byte Version [257]byte Machine [257]byte } type Ustat_t struct { Tfree int64 Tinode uint64 Fname [6]int8 Fpack [6]int8 Pad_cgo_0 [4]byte } const ( AT_FDCWD = 0xffd19553 AT_SYMLINK_NOFOLLOW = 0x1000 AT_SYMLINK_FOLLOW = 0x2000 AT_REMOVEDIR = 0x1 AT_EACCESS = 0x4 ) const ( SizeofIfMsghdr = 0x54 SizeofIfData = 0x44 SizeofIfaMsghdr = 0x14 SizeofRtMsghdr = 0x4c SizeofRtMetrics = 0x28 ) type IfMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte Data IfData } type IfData struct { Type uint8 Addrlen uint8 Hdrlen uint8 Pad_cgo_0 [1]byte Mtu uint32 Metric uint32 Baudrate uint32 Ipackets uint32 Ierrors uint32 Opackets uint32 Oerrors uint32 Collisions uint32 Ibytes uint32 Obytes uint32 Imcasts uint32 Omcasts uint32 Iqdrops uint32 Noproto uint32 Lastchange Timeval32 } type IfaMsghdr struct { Msglen uint16 Version uint8 Type uint8 Addrs int32 Flags int32 Index uint16 Pad_cgo_0 [2]byte Metric int32 } type RtMsghdr struct { Msglen uint16 Version uint8 Type uint8 Index uint16 Pad_cgo_0 [2]byte Flags int32 Addrs int32 Pid int32 Seq int32 Errno int32 Use int32 Inits uint32 Rmx RtMetrics } type RtMetrics struct { Locks uint32 Mtu uint32 Hopcount uint32 Expire uint32 Recvpipe uint32 Sendpipe uint32 Ssthresh uint32 Rtt uint32 Rttvar uint32 Pksent uint32 } const ( SizeofBpfVersion = 0x4 SizeofBpfStat = 0x80 SizeofBpfProgram = 0x10 SizeofBpfInsn = 0x8 SizeofBpfHdr = 0x14 ) type BpfVersion struct { Major uint16 Minor uint16 } type BpfStat struct { Recv uint64 Drop uint64 Capt uint64 Padding [13]uint64 } type BpfProgram struct { Len uint32 Pad_cgo_0 [4]byte Insns *BpfInsn } type BpfInsn struct { Code uint16 Jt uint8 Jf uint8 K uint32 } type BpfTimeval struct { Sec int32 Usec int32 } type BpfHdr struct { Tstamp BpfTimeval Caplen uint32 Datalen uint32 Hdrlen uint16 Pad_cgo_0 [2]byte } type Termios struct { Iflag uint32 Oflag uint32 Cflag uint32 Lflag uint32 Cc [19]uint8 Pad_cgo_0 [1]byte } type Termio struct { Iflag uint16 Oflag uint16 Cflag uint16 Lflag uint16 Line int8 Cc [8]uint8 Pad_cgo_0 [1]byte } type Winsize struct { Row uint16 Col uint16 Xpixel uint16 Ypixel uint16 } type PollFd struct { Fd int32 Events int16 Revents int16 } const ( POLLERR = 0x8 POLLHUP = 0x10 POLLIN = 0x1 POLLNVAL = 0x20 POLLOUT = 0x4 POLLPRI = 0x2 POLLRDBAND = 0x80 POLLRDNORM = 0x40 POLLWRBAND = 0x100 POLLWRNORM = 0x4 ) ================================================ FILE: vendor/golang.org/x/sys/windows/asm_windows_386.s ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // // System calls for 386, Windows are implemented in runtime/syscall_windows.goc // TEXT ·getprocaddress(SB), 7, $0-8 JMP syscall·getprocaddress(SB) TEXT ·loadlibrary(SB), 7, $0-4 JMP syscall·loadlibrary(SB) ================================================ FILE: vendor/golang.org/x/sys/windows/asm_windows_amd64.s ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // // System calls for amd64, Windows are implemented in runtime/syscall_windows.goc // TEXT ·getprocaddress(SB), 7, $0-32 JMP syscall·getprocaddress(SB) TEXT ·loadlibrary(SB), 7, $0-8 JMP syscall·loadlibrary(SB) ================================================ FILE: vendor/golang.org/x/sys/windows/dll_windows.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package windows import ( "sync" "sync/atomic" "syscall" "unsafe" ) // DLLError describes reasons for DLL load failures. type DLLError struct { Err error ObjName string Msg string } func (e *DLLError) Error() string { return e.Msg } // Implemented in runtime/syscall_windows.goc; we provide jumps to them in our assembly file. func loadlibrary(filename *uint16) (handle uintptr, err syscall.Errno) func getprocaddress(handle uintptr, procname *uint8) (proc uintptr, err syscall.Errno) // A DLL implements access to a single DLL. type DLL struct { Name string Handle Handle } // LoadDLL loads DLL file into memory. // // Warning: using LoadDLL without an absolute path name is subject to // DLL preloading attacks. To safely load a system DLL, use LazyDLL // with System set to true, or use LoadLibraryEx directly. func LoadDLL(name string) (dll *DLL, err error) { namep, err := UTF16PtrFromString(name) if err != nil { return nil, err } h, e := loadlibrary(namep) if e != 0 { return nil, &DLLError{ Err: e, ObjName: name, Msg: "Failed to load " + name + ": " + e.Error(), } } d := &DLL{ Name: name, Handle: Handle(h), } return d, nil } // MustLoadDLL is like LoadDLL but panics if load operation failes. func MustLoadDLL(name string) *DLL { d, e := LoadDLL(name) if e != nil { panic(e) } return d } // FindProc searches DLL d for procedure named name and returns *Proc // if found. It returns an error if search fails. func (d *DLL) FindProc(name string) (proc *Proc, err error) { namep, err := BytePtrFromString(name) if err != nil { return nil, err } a, e := getprocaddress(uintptr(d.Handle), namep) if e != 0 { return nil, &DLLError{ Err: e, ObjName: name, Msg: "Failed to find " + name + " procedure in " + d.Name + ": " + e.Error(), } } p := &Proc{ Dll: d, Name: name, addr: a, } return p, nil } // MustFindProc is like FindProc but panics if search fails. func (d *DLL) MustFindProc(name string) *Proc { p, e := d.FindProc(name) if e != nil { panic(e) } return p } // Release unloads DLL d from memory. func (d *DLL) Release() (err error) { return FreeLibrary(d.Handle) } // A Proc implements access to a procedure inside a DLL. type Proc struct { Dll *DLL Name string addr uintptr } // Addr returns the address of the procedure represented by p. // The return value can be passed to Syscall to run the procedure. func (p *Proc) Addr() uintptr { return p.addr } //go:uintptrescapes // Call executes procedure p with arguments a. It will panic, if more than 15 arguments // are supplied. // // The returned error is always non-nil, constructed from the result of GetLastError. // Callers must inspect the primary return value to decide whether an error occurred // (according to the semantics of the specific function being called) before consulting // the error. The error will be guaranteed to contain windows.Errno. func (p *Proc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error) { switch len(a) { case 0: return syscall.Syscall(p.Addr(), uintptr(len(a)), 0, 0, 0) case 1: return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], 0, 0) case 2: return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], a[1], 0) case 3: return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], a[1], a[2]) case 4: return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], 0, 0) case 5: return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], 0) case 6: return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5]) case 7: return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], 0, 0) case 8: return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], 0) case 9: return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]) case 10: return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], 0, 0) case 11: return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], 0) case 12: return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11]) case 13: return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], 0, 0) case 14: return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], 0) case 15: return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14]) default: panic("Call " + p.Name + " with too many arguments " + itoa(len(a)) + ".") } } // A LazyDLL implements access to a single DLL. // It will delay the load of the DLL until the first // call to its Handle method or to one of its // LazyProc's Addr method. type LazyDLL struct { Name string // System determines whether the DLL must be loaded from the // Windows System directory, bypassing the normal DLL search // path. System bool mu sync.Mutex dll *DLL // non nil once DLL is loaded } // Load loads DLL file d.Name into memory. It returns an error if fails. // Load will not try to load DLL, if it is already loaded into memory. func (d *LazyDLL) Load() error { // Non-racy version of: // if d.dll != nil { if atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&d.dll))) != nil { return nil } d.mu.Lock() defer d.mu.Unlock() if d.dll != nil { return nil } // kernel32.dll is special, since it's where LoadLibraryEx comes from. // The kernel already special-cases its name, so it's always // loaded from system32. var dll *DLL var err error if d.Name == "kernel32.dll" { dll, err = LoadDLL(d.Name) } else { dll, err = loadLibraryEx(d.Name, d.System) } if err != nil { return err } // Non-racy version of: // d.dll = dll atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&d.dll)), unsafe.Pointer(dll)) return nil } // mustLoad is like Load but panics if search fails. func (d *LazyDLL) mustLoad() { e := d.Load() if e != nil { panic(e) } } // Handle returns d's module handle. func (d *LazyDLL) Handle() uintptr { d.mustLoad() return uintptr(d.dll.Handle) } // NewProc returns a LazyProc for accessing the named procedure in the DLL d. func (d *LazyDLL) NewProc(name string) *LazyProc { return &LazyProc{l: d, Name: name} } // NewLazyDLL creates new LazyDLL associated with DLL file. func NewLazyDLL(name string) *LazyDLL { return &LazyDLL{Name: name} } // NewLazySystemDLL is like NewLazyDLL, but will only // search Windows System directory for the DLL if name is // a base name (like "advapi32.dll"). func NewLazySystemDLL(name string) *LazyDLL { return &LazyDLL{Name: name, System: true} } // A LazyProc implements access to a procedure inside a LazyDLL. // It delays the lookup until the Addr method is called. type LazyProc struct { Name string mu sync.Mutex l *LazyDLL proc *Proc } // Find searches DLL for procedure named p.Name. It returns // an error if search fails. Find will not search procedure, // if it is already found and loaded into memory. func (p *LazyProc) Find() error { // Non-racy version of: // if p.proc == nil { if atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&p.proc))) == nil { p.mu.Lock() defer p.mu.Unlock() if p.proc == nil { e := p.l.Load() if e != nil { return e } proc, e := p.l.dll.FindProc(p.Name) if e != nil { return e } // Non-racy version of: // p.proc = proc atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&p.proc)), unsafe.Pointer(proc)) } } return nil } // mustFind is like Find but panics if search fails. func (p *LazyProc) mustFind() { e := p.Find() if e != nil { panic(e) } } // Addr returns the address of the procedure represented by p. // The return value can be passed to Syscall to run the procedure. // It will panic if the procedure cannot be found. func (p *LazyProc) Addr() uintptr { p.mustFind() return p.proc.Addr() } //go:uintptrescapes // Call executes procedure p with arguments a. It will panic, if more than 15 arguments // are supplied. It will also panic if the procedure cannot be found. // // The returned error is always non-nil, constructed from the result of GetLastError. // Callers must inspect the primary return value to decide whether an error occurred // (according to the semantics of the specific function being called) before consulting // the error. The error will be guaranteed to contain windows.Errno. func (p *LazyProc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error) { p.mustFind() return p.proc.Call(a...) } var canDoSearchSystem32Once struct { sync.Once v bool } func initCanDoSearchSystem32() { // https://msdn.microsoft.com/en-us/library/ms684179(v=vs.85).aspx says: // "Windows 7, Windows Server 2008 R2, Windows Vista, and Windows // Server 2008: The LOAD_LIBRARY_SEARCH_* flags are available on // systems that have KB2533623 installed. To determine whether the // flags are available, use GetProcAddress to get the address of the // AddDllDirectory, RemoveDllDirectory, or SetDefaultDllDirectories // function. If GetProcAddress succeeds, the LOAD_LIBRARY_SEARCH_* // flags can be used with LoadLibraryEx." canDoSearchSystem32Once.v = (modkernel32.NewProc("AddDllDirectory").Find() == nil) } func canDoSearchSystem32() bool { canDoSearchSystem32Once.Do(initCanDoSearchSystem32) return canDoSearchSystem32Once.v } func isBaseName(name string) bool { for _, c := range name { if c == ':' || c == '/' || c == '\\' { return false } } return true } // loadLibraryEx wraps the Windows LoadLibraryEx function. // // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85).aspx // // If name is not an absolute path, LoadLibraryEx searches for the DLL // in a variety of automatic locations unless constrained by flags. // See: https://msdn.microsoft.com/en-us/library/ff919712%28VS.85%29.aspx func loadLibraryEx(name string, system bool) (*DLL, error) { loadDLL := name var flags uintptr if system { if canDoSearchSystem32() { const LOAD_LIBRARY_SEARCH_SYSTEM32 = 0x00000800 flags = LOAD_LIBRARY_SEARCH_SYSTEM32 } else if isBaseName(name) { // WindowsXP or unpatched Windows machine // trying to load "foo.dll" out of the system // folder, but LoadLibraryEx doesn't support // that yet on their system, so emulate it. windir, _ := Getenv("WINDIR") // old var; apparently works on XP if windir == "" { return nil, errString("%WINDIR% not defined") } loadDLL = windir + "\\System32\\" + name } } h, err := LoadLibraryEx(loadDLL, 0, flags) if err != nil { return nil, err } return &DLL{Name: name, Handle: h}, nil } type errString string func (s errString) Error() string { return string(s) } ================================================ FILE: vendor/golang.org/x/sys/windows/env_unset.go ================================================ // Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build windows // +build go1.4 package windows import "syscall" func Unsetenv(key string) error { // This was added in Go 1.4. return syscall.Unsetenv(key) } ================================================ FILE: vendor/golang.org/x/sys/windows/env_windows.go ================================================ // Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Windows environment variables. package windows import "syscall" func Getenv(key string) (value string, found bool) { return syscall.Getenv(key) } func Setenv(key, value string) error { return syscall.Setenv(key, value) } func Clearenv() { syscall.Clearenv() } func Environ() []string { return syscall.Environ() } ================================================ FILE: vendor/golang.org/x/sys/windows/eventlog.go ================================================ // Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build windows package windows const ( EVENTLOG_SUCCESS = 0 EVENTLOG_ERROR_TYPE = 1 EVENTLOG_WARNING_TYPE = 2 EVENTLOG_INFORMATION_TYPE = 4 EVENTLOG_AUDIT_SUCCESS = 8 EVENTLOG_AUDIT_FAILURE = 16 ) //sys RegisterEventSource(uncServerName *uint16, sourceName *uint16) (handle Handle, err error) [failretval==0] = advapi32.RegisterEventSourceW //sys DeregisterEventSource(handle Handle) (err error) = advapi32.DeregisterEventSource //sys ReportEvent(log Handle, etype uint16, category uint16, eventId uint32, usrSId uintptr, numStrings uint16, dataSize uint32, strings **uint16, rawData *byte) (err error) = advapi32.ReportEventW ================================================ FILE: vendor/golang.org/x/sys/windows/exec_windows.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Fork, exec, wait, etc. package windows // EscapeArg rewrites command line argument s as prescribed // in http://msdn.microsoft.com/en-us/library/ms880421. // This function returns "" (2 double quotes) if s is empty. // Alternatively, these transformations are done: // - every back slash (\) is doubled, but only if immediately // followed by double quote ("); // - every double quote (") is escaped by back slash (\); // - finally, s is wrapped with double quotes (arg -> "arg"), // but only if there is space or tab inside s. func EscapeArg(s string) string { if len(s) == 0 { return "\"\"" } n := len(s) hasSpace := false for i := 0; i < len(s); i++ { switch s[i] { case '"', '\\': n++ case ' ', '\t': hasSpace = true } } if hasSpace { n += 2 } if n == len(s) { return s } qs := make([]byte, n) j := 0 if hasSpace { qs[j] = '"' j++ } slashes := 0 for i := 0; i < len(s); i++ { switch s[i] { default: slashes = 0 qs[j] = s[i] case '\\': slashes++ qs[j] = s[i] case '"': for ; slashes > 0; slashes-- { qs[j] = '\\' j++ } qs[j] = '\\' j++ qs[j] = s[i] } j++ } if hasSpace { for ; slashes > 0; slashes-- { qs[j] = '\\' j++ } qs[j] = '"' j++ } return string(qs[:j]) } func CloseOnExec(fd Handle) { SetHandleInformation(Handle(fd), HANDLE_FLAG_INHERIT, 0) } // FullPath retrieves the full path of the specified file. func FullPath(name string) (path string, err error) { p, err := UTF16PtrFromString(name) if err != nil { return "", err } n := uint32(100) for { buf := make([]uint16, n) n, err = GetFullPathName(p, uint32(len(buf)), &buf[0], nil) if err != nil { return "", err } if n <= uint32(len(buf)) { return UTF16ToString(buf[:n]), nil } } } ================================================ FILE: vendor/golang.org/x/sys/windows/memory_windows.go ================================================ // Copyright 2017 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package windows const ( MEM_COMMIT = 0x00001000 MEM_RESERVE = 0x00002000 MEM_DECOMMIT = 0x00004000 MEM_RELEASE = 0x00008000 MEM_RESET = 0x00080000 MEM_TOP_DOWN = 0x00100000 MEM_WRITE_WATCH = 0x00200000 MEM_PHYSICAL = 0x00400000 MEM_RESET_UNDO = 0x01000000 MEM_LARGE_PAGES = 0x20000000 PAGE_NOACCESS = 0x01 PAGE_READONLY = 0x02 PAGE_READWRITE = 0x04 PAGE_WRITECOPY = 0x08 PAGE_EXECUTE_READ = 0x20 PAGE_EXECUTE_READWRITE = 0x40 PAGE_EXECUTE_WRITECOPY = 0x80 ) ================================================ FILE: vendor/golang.org/x/sys/windows/mksyscall.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package windows //go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go eventlog.go service.go syscall_windows.go security_windows.go ================================================ FILE: vendor/golang.org/x/sys/windows/race.go ================================================ // Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build windows,race package windows import ( "runtime" "unsafe" ) const raceenabled = true func raceAcquire(addr unsafe.Pointer) { runtime.RaceAcquire(addr) } func raceReleaseMerge(addr unsafe.Pointer) { runtime.RaceReleaseMerge(addr) } func raceReadRange(addr unsafe.Pointer, len int) { runtime.RaceReadRange(addr, len) } func raceWriteRange(addr unsafe.Pointer, len int) { runtime.RaceWriteRange(addr, len) } ================================================ FILE: vendor/golang.org/x/sys/windows/race0.go ================================================ // Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build windows,!race package windows import ( "unsafe" ) const raceenabled = false func raceAcquire(addr unsafe.Pointer) { } func raceReleaseMerge(addr unsafe.Pointer) { } func raceReadRange(addr unsafe.Pointer, len int) { } func raceWriteRange(addr unsafe.Pointer, len int) { } ================================================ FILE: vendor/golang.org/x/sys/windows/security_windows.go ================================================ // Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package windows import ( "syscall" "unsafe" ) const ( STANDARD_RIGHTS_REQUIRED = 0xf0000 STANDARD_RIGHTS_READ = 0x20000 STANDARD_RIGHTS_WRITE = 0x20000 STANDARD_RIGHTS_EXECUTE = 0x20000 STANDARD_RIGHTS_ALL = 0x1F0000 ) const ( NameUnknown = 0 NameFullyQualifiedDN = 1 NameSamCompatible = 2 NameDisplay = 3 NameUniqueId = 6 NameCanonical = 7 NameUserPrincipal = 8 NameCanonicalEx = 9 NameServicePrincipal = 10 NameDnsDomain = 12 ) // This function returns 1 byte BOOLEAN rather than the 4 byte BOOL. // http://blogs.msdn.com/b/drnick/archive/2007/12/19/windows-and-upn-format-credentials.aspx //sys TranslateName(accName *uint16, accNameFormat uint32, desiredNameFormat uint32, translatedName *uint16, nSize *uint32) (err error) [failretval&0xff==0] = secur32.TranslateNameW //sys GetUserNameEx(nameFormat uint32, nameBuffre *uint16, nSize *uint32) (err error) [failretval&0xff==0] = secur32.GetUserNameExW // TranslateAccountName converts a directory service // object name from one format to another. func TranslateAccountName(username string, from, to uint32, initSize int) (string, error) { u, e := UTF16PtrFromString(username) if e != nil { return "", e } n := uint32(50) for { b := make([]uint16, n) e = TranslateName(u, from, to, &b[0], &n) if e == nil { return UTF16ToString(b[:n]), nil } if e != ERROR_INSUFFICIENT_BUFFER { return "", e } if n <= uint32(len(b)) { return "", e } } } const ( // do not reorder NetSetupUnknownStatus = iota NetSetupUnjoined NetSetupWorkgroupName NetSetupDomainName ) type UserInfo10 struct { Name *uint16 Comment *uint16 UsrComment *uint16 FullName *uint16 } //sys NetUserGetInfo(serverName *uint16, userName *uint16, level uint32, buf **byte) (neterr error) = netapi32.NetUserGetInfo //sys NetGetJoinInformation(server *uint16, name **uint16, bufType *uint32) (neterr error) = netapi32.NetGetJoinInformation //sys NetApiBufferFree(buf *byte) (neterr error) = netapi32.NetApiBufferFree const ( // do not reorder SidTypeUser = 1 + iota SidTypeGroup SidTypeDomain SidTypeAlias SidTypeWellKnownGroup SidTypeDeletedAccount SidTypeInvalid SidTypeUnknown SidTypeComputer SidTypeLabel ) type SidIdentifierAuthority struct { Value [6]byte } var ( SECURITY_NULL_SID_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 0}} SECURITY_WORLD_SID_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 1}} SECURITY_LOCAL_SID_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 2}} SECURITY_CREATOR_SID_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 3}} SECURITY_NON_UNIQUE_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 4}} SECURITY_NT_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 5}} SECURITY_MANDATORY_LABEL_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 16}} ) const ( SECURITY_NULL_RID = 0 SECURITY_WORLD_RID = 0 SECURITY_LOCAL_RID = 0 SECURITY_CREATOR_OWNER_RID = 0 SECURITY_CREATOR_GROUP_RID = 1 SECURITY_DIALUP_RID = 1 SECURITY_NETWORK_RID = 2 SECURITY_BATCH_RID = 3 SECURITY_INTERACTIVE_RID = 4 SECURITY_LOGON_IDS_RID = 5 SECURITY_SERVICE_RID = 6 SECURITY_LOCAL_SYSTEM_RID = 18 SECURITY_BUILTIN_DOMAIN_RID = 32 SECURITY_PRINCIPAL_SELF_RID = 10 SECURITY_CREATOR_OWNER_SERVER_RID = 0x2 SECURITY_CREATOR_GROUP_SERVER_RID = 0x3 SECURITY_LOGON_IDS_RID_COUNT = 0x3 SECURITY_ANONYMOUS_LOGON_RID = 0x7 SECURITY_PROXY_RID = 0x8 SECURITY_ENTERPRISE_CONTROLLERS_RID = 0x9 SECURITY_SERVER_LOGON_RID = SECURITY_ENTERPRISE_CONTROLLERS_RID SECURITY_AUTHENTICATED_USER_RID = 0xb SECURITY_RESTRICTED_CODE_RID = 0xc SECURITY_NT_NON_UNIQUE_RID = 0x15 ) //sys LookupAccountSid(systemName *uint16, sid *SID, name *uint16, nameLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) = advapi32.LookupAccountSidW //sys LookupAccountName(systemName *uint16, accountName *uint16, sid *SID, sidLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) = advapi32.LookupAccountNameW //sys ConvertSidToStringSid(sid *SID, stringSid **uint16) (err error) = advapi32.ConvertSidToStringSidW //sys ConvertStringSidToSid(stringSid *uint16, sid **SID) (err error) = advapi32.ConvertStringSidToSidW //sys GetLengthSid(sid *SID) (len uint32) = advapi32.GetLengthSid //sys CopySid(destSidLen uint32, destSid *SID, srcSid *SID) (err error) = advapi32.CopySid //sys AllocateAndInitializeSid(identAuth *SidIdentifierAuthority, subAuth byte, subAuth0 uint32, subAuth1 uint32, subAuth2 uint32, subAuth3 uint32, subAuth4 uint32, subAuth5 uint32, subAuth6 uint32, subAuth7 uint32, sid **SID) (err error) = advapi32.AllocateAndInitializeSid //sys FreeSid(sid *SID) (err error) [failretval!=0] = advapi32.FreeSid //sys EqualSid(sid1 *SID, sid2 *SID) (isEqual bool) = advapi32.EqualSid // The security identifier (SID) structure is a variable-length // structure used to uniquely identify users or groups. type SID struct{} // StringToSid converts a string-format security identifier // sid into a valid, functional sid. func StringToSid(s string) (*SID, error) { var sid *SID p, e := UTF16PtrFromString(s) if e != nil { return nil, e } e = ConvertStringSidToSid(p, &sid) if e != nil { return nil, e } defer LocalFree((Handle)(unsafe.Pointer(sid))) return sid.Copy() } // LookupSID retrieves a security identifier sid for the account // and the name of the domain on which the account was found. // System specify target computer to search. func LookupSID(system, account string) (sid *SID, domain string, accType uint32, err error) { if len(account) == 0 { return nil, "", 0, syscall.EINVAL } acc, e := UTF16PtrFromString(account) if e != nil { return nil, "", 0, e } var sys *uint16 if len(system) > 0 { sys, e = UTF16PtrFromString(system) if e != nil { return nil, "", 0, e } } n := uint32(50) dn := uint32(50) for { b := make([]byte, n) db := make([]uint16, dn) sid = (*SID)(unsafe.Pointer(&b[0])) e = LookupAccountName(sys, acc, sid, &n, &db[0], &dn, &accType) if e == nil { return sid, UTF16ToString(db), accType, nil } if e != ERROR_INSUFFICIENT_BUFFER { return nil, "", 0, e } if n <= uint32(len(b)) { return nil, "", 0, e } } } // String converts sid to a string format // suitable for display, storage, or transmission. func (sid *SID) String() (string, error) { var s *uint16 e := ConvertSidToStringSid(sid, &s) if e != nil { return "", e } defer LocalFree((Handle)(unsafe.Pointer(s))) return UTF16ToString((*[256]uint16)(unsafe.Pointer(s))[:]), nil } // Len returns the length, in bytes, of a valid security identifier sid. func (sid *SID) Len() int { return int(GetLengthSid(sid)) } // Copy creates a duplicate of security identifier sid. func (sid *SID) Copy() (*SID, error) { b := make([]byte, sid.Len()) sid2 := (*SID)(unsafe.Pointer(&b[0])) e := CopySid(uint32(len(b)), sid2, sid) if e != nil { return nil, e } return sid2, nil } // LookupAccount retrieves the name of the account for this sid // and the name of the first domain on which this sid is found. // System specify target computer to search for. func (sid *SID) LookupAccount(system string) (account, domain string, accType uint32, err error) { var sys *uint16 if len(system) > 0 { sys, err = UTF16PtrFromString(system) if err != nil { return "", "", 0, err } } n := uint32(50) dn := uint32(50) for { b := make([]uint16, n) db := make([]uint16, dn) e := LookupAccountSid(sys, sid, &b[0], &n, &db[0], &dn, &accType) if e == nil { return UTF16ToString(b), UTF16ToString(db), accType, nil } if e != ERROR_INSUFFICIENT_BUFFER { return "", "", 0, e } if n <= uint32(len(b)) { return "", "", 0, e } } } const ( // do not reorder TOKEN_ASSIGN_PRIMARY = 1 << iota TOKEN_DUPLICATE TOKEN_IMPERSONATE TOKEN_QUERY TOKEN_QUERY_SOURCE TOKEN_ADJUST_PRIVILEGES TOKEN_ADJUST_GROUPS TOKEN_ADJUST_DEFAULT TOKEN_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | TOKEN_ASSIGN_PRIMARY | TOKEN_DUPLICATE | TOKEN_IMPERSONATE | TOKEN_QUERY | TOKEN_QUERY_SOURCE | TOKEN_ADJUST_PRIVILEGES | TOKEN_ADJUST_GROUPS | TOKEN_ADJUST_DEFAULT TOKEN_READ = STANDARD_RIGHTS_READ | TOKEN_QUERY TOKEN_WRITE = STANDARD_RIGHTS_WRITE | TOKEN_ADJUST_PRIVILEGES | TOKEN_ADJUST_GROUPS | TOKEN_ADJUST_DEFAULT TOKEN_EXECUTE = STANDARD_RIGHTS_EXECUTE ) const ( // do not reorder TokenUser = 1 + iota TokenGroups TokenPrivileges TokenOwner TokenPrimaryGroup TokenDefaultDacl TokenSource TokenType TokenImpersonationLevel TokenStatistics TokenRestrictedSids TokenSessionId TokenGroupsAndPrivileges TokenSessionReference TokenSandBoxInert TokenAuditPolicy TokenOrigin TokenElevationType TokenLinkedToken TokenElevation TokenHasRestrictions TokenAccessInformation TokenVirtualizationAllowed TokenVirtualizationEnabled TokenIntegrityLevel TokenUIAccess TokenMandatoryPolicy TokenLogonSid MaxTokenInfoClass ) type SIDAndAttributes struct { Sid *SID Attributes uint32 } type Tokenuser struct { User SIDAndAttributes } type Tokenprimarygroup struct { PrimaryGroup *SID } type Tokengroups struct { GroupCount uint32 Groups [1]SIDAndAttributes } //sys OpenProcessToken(h Handle, access uint32, token *Token) (err error) = advapi32.OpenProcessToken //sys GetTokenInformation(t Token, infoClass uint32, info *byte, infoLen uint32, returnedLen *uint32) (err error) = advapi32.GetTokenInformation //sys GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) = userenv.GetUserProfileDirectoryW // An access token contains the security information for a logon session. // The system creates an access token when a user logs on, and every // process executed on behalf of the user has a copy of the token. // The token identifies the user, the user's groups, and the user's // privileges. The system uses the token to control access to securable // objects and to control the ability of the user to perform various // system-related operations on the local computer. type Token Handle // OpenCurrentProcessToken opens the access token // associated with current process. func OpenCurrentProcessToken() (Token, error) { p, e := GetCurrentProcess() if e != nil { return 0, e } var t Token e = OpenProcessToken(p, TOKEN_QUERY, &t) if e != nil { return 0, e } return t, nil } // Close releases access to access token. func (t Token) Close() error { return CloseHandle(Handle(t)) } // getInfo retrieves a specified type of information about an access token. func (t Token) getInfo(class uint32, initSize int) (unsafe.Pointer, error) { n := uint32(initSize) for { b := make([]byte, n) e := GetTokenInformation(t, class, &b[0], uint32(len(b)), &n) if e == nil { return unsafe.Pointer(&b[0]), nil } if e != ERROR_INSUFFICIENT_BUFFER { return nil, e } if n <= uint32(len(b)) { return nil, e } } } // GetTokenUser retrieves access token t user account information. func (t Token) GetTokenUser() (*Tokenuser, error) { i, e := t.getInfo(TokenUser, 50) if e != nil { return nil, e } return (*Tokenuser)(i), nil } // GetTokenGroups retrieves group accounts associated with access token t. func (t Token) GetTokenGroups() (*Tokengroups, error) { i, e := t.getInfo(TokenGroups, 50) if e != nil { return nil, e } return (*Tokengroups)(i), nil } // GetTokenPrimaryGroup retrieves access token t primary group information. // A pointer to a SID structure representing a group that will become // the primary group of any objects created by a process using this access token. func (t Token) GetTokenPrimaryGroup() (*Tokenprimarygroup, error) { i, e := t.getInfo(TokenPrimaryGroup, 50) if e != nil { return nil, e } return (*Tokenprimarygroup)(i), nil } // GetUserProfileDirectory retrieves path to the // root directory of the access token t user's profile. func (t Token) GetUserProfileDirectory() (string, error) { n := uint32(100) for { b := make([]uint16, n) e := GetUserProfileDirectory(t, &b[0], &n) if e == nil { return UTF16ToString(b), nil } if e != ERROR_INSUFFICIENT_BUFFER { return "", e } if n <= uint32(len(b)) { return "", e } } } ================================================ FILE: vendor/golang.org/x/sys/windows/service.go ================================================ // Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build windows package windows const ( SC_MANAGER_CONNECT = 1 SC_MANAGER_CREATE_SERVICE = 2 SC_MANAGER_ENUMERATE_SERVICE = 4 SC_MANAGER_LOCK = 8 SC_MANAGER_QUERY_LOCK_STATUS = 16 SC_MANAGER_MODIFY_BOOT_CONFIG = 32 SC_MANAGER_ALL_ACCESS = 0xf003f ) //sys OpenSCManager(machineName *uint16, databaseName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenSCManagerW const ( SERVICE_KERNEL_DRIVER = 1 SERVICE_FILE_SYSTEM_DRIVER = 2 SERVICE_ADAPTER = 4 SERVICE_RECOGNIZER_DRIVER = 8 SERVICE_WIN32_OWN_PROCESS = 16 SERVICE_WIN32_SHARE_PROCESS = 32 SERVICE_WIN32 = SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS SERVICE_INTERACTIVE_PROCESS = 256 SERVICE_DRIVER = SERVICE_KERNEL_DRIVER | SERVICE_FILE_SYSTEM_DRIVER | SERVICE_RECOGNIZER_DRIVER SERVICE_TYPE_ALL = SERVICE_WIN32 | SERVICE_ADAPTER | SERVICE_DRIVER | SERVICE_INTERACTIVE_PROCESS SERVICE_BOOT_START = 0 SERVICE_SYSTEM_START = 1 SERVICE_AUTO_START = 2 SERVICE_DEMAND_START = 3 SERVICE_DISABLED = 4 SERVICE_ERROR_IGNORE = 0 SERVICE_ERROR_NORMAL = 1 SERVICE_ERROR_SEVERE = 2 SERVICE_ERROR_CRITICAL = 3 SC_STATUS_PROCESS_INFO = 0 SERVICE_STOPPED = 1 SERVICE_START_PENDING = 2 SERVICE_STOP_PENDING = 3 SERVICE_RUNNING = 4 SERVICE_CONTINUE_PENDING = 5 SERVICE_PAUSE_PENDING = 6 SERVICE_PAUSED = 7 SERVICE_NO_CHANGE = 0xffffffff SERVICE_ACCEPT_STOP = 1 SERVICE_ACCEPT_PAUSE_CONTINUE = 2 SERVICE_ACCEPT_SHUTDOWN = 4 SERVICE_ACCEPT_PARAMCHANGE = 8 SERVICE_ACCEPT_NETBINDCHANGE = 16 SERVICE_ACCEPT_HARDWAREPROFILECHANGE = 32 SERVICE_ACCEPT_POWEREVENT = 64 SERVICE_ACCEPT_SESSIONCHANGE = 128 SERVICE_CONTROL_STOP = 1 SERVICE_CONTROL_PAUSE = 2 SERVICE_CONTROL_CONTINUE = 3 SERVICE_CONTROL_INTERROGATE = 4 SERVICE_CONTROL_SHUTDOWN = 5 SERVICE_CONTROL_PARAMCHANGE = 6 SERVICE_CONTROL_NETBINDADD = 7 SERVICE_CONTROL_NETBINDREMOVE = 8 SERVICE_CONTROL_NETBINDENABLE = 9 SERVICE_CONTROL_NETBINDDISABLE = 10 SERVICE_CONTROL_DEVICEEVENT = 11 SERVICE_CONTROL_HARDWAREPROFILECHANGE = 12 SERVICE_CONTROL_POWEREVENT = 13 SERVICE_CONTROL_SESSIONCHANGE = 14 SERVICE_ACTIVE = 1 SERVICE_INACTIVE = 2 SERVICE_STATE_ALL = 3 SERVICE_QUERY_CONFIG = 1 SERVICE_CHANGE_CONFIG = 2 SERVICE_QUERY_STATUS = 4 SERVICE_ENUMERATE_DEPENDENTS = 8 SERVICE_START = 16 SERVICE_STOP = 32 SERVICE_PAUSE_CONTINUE = 64 SERVICE_INTERROGATE = 128 SERVICE_USER_DEFINED_CONTROL = 256 SERVICE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG | SERVICE_QUERY_STATUS | SERVICE_ENUMERATE_DEPENDENTS | SERVICE_START | SERVICE_STOP | SERVICE_PAUSE_CONTINUE | SERVICE_INTERROGATE | SERVICE_USER_DEFINED_CONTROL SERVICE_RUNS_IN_SYSTEM_PROCESS = 1 SERVICE_CONFIG_DESCRIPTION = 1 SERVICE_CONFIG_FAILURE_ACTIONS = 2 NO_ERROR = 0 SC_ENUM_PROCESS_INFO = 0 ) type SERVICE_STATUS struct { ServiceType uint32 CurrentState uint32 ControlsAccepted uint32 Win32ExitCode uint32 ServiceSpecificExitCode uint32 CheckPoint uint32 WaitHint uint32 } type SERVICE_TABLE_ENTRY struct { ServiceName *uint16 ServiceProc uintptr } type QUERY_SERVICE_CONFIG struct { ServiceType uint32 StartType uint32 ErrorControl uint32 BinaryPathName *uint16 LoadOrderGroup *uint16 TagId uint32 Dependencies *uint16 ServiceStartName *uint16 DisplayName *uint16 } type SERVICE_DESCRIPTION struct { Description *uint16 } type SERVICE_STATUS_PROCESS struct { ServiceType uint32 CurrentState uint32 ControlsAccepted uint32 Win32ExitCode uint32 ServiceSpecificExitCode uint32 CheckPoint uint32 WaitHint uint32 ProcessId uint32 ServiceFlags uint32 } type ENUM_SERVICE_STATUS_PROCESS struct { ServiceName *uint16 DisplayName *uint16 ServiceStatusProcess SERVICE_STATUS_PROCESS } //sys CloseServiceHandle(handle Handle) (err error) = advapi32.CloseServiceHandle //sys CreateService(mgr Handle, serviceName *uint16, displayName *uint16, access uint32, srvType uint32, startType uint32, errCtl uint32, pathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16) (handle Handle, err error) [failretval==0] = advapi32.CreateServiceW //sys OpenService(mgr Handle, serviceName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenServiceW //sys DeleteService(service Handle) (err error) = advapi32.DeleteService //sys StartService(service Handle, numArgs uint32, argVectors **uint16) (err error) = advapi32.StartServiceW //sys QueryServiceStatus(service Handle, status *SERVICE_STATUS) (err error) = advapi32.QueryServiceStatus //sys ControlService(service Handle, control uint32, status *SERVICE_STATUS) (err error) = advapi32.ControlService //sys StartServiceCtrlDispatcher(serviceTable *SERVICE_TABLE_ENTRY) (err error) = advapi32.StartServiceCtrlDispatcherW //sys SetServiceStatus(service Handle, serviceStatus *SERVICE_STATUS) (err error) = advapi32.SetServiceStatus //sys ChangeServiceConfig(service Handle, serviceType uint32, startType uint32, errorControl uint32, binaryPathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16, displayName *uint16) (err error) = advapi32.ChangeServiceConfigW //sys QueryServiceConfig(service Handle, serviceConfig *QUERY_SERVICE_CONFIG, bufSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceConfigW //sys ChangeServiceConfig2(service Handle, infoLevel uint32, info *byte) (err error) = advapi32.ChangeServiceConfig2W //sys QueryServiceConfig2(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceConfig2W //sys EnumServicesStatusEx(mgr Handle, infoLevel uint32, serviceType uint32, serviceState uint32, services *byte, bufSize uint32, bytesNeeded *uint32, servicesReturned *uint32, resumeHandle *uint32, groupName *uint16) (err error) = advapi32.EnumServicesStatusExW ================================================ FILE: vendor/golang.org/x/sys/windows/str.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build windows package windows func itoa(val int) string { // do it here rather than with fmt to avoid dependency if val < 0 { return "-" + itoa(-val) } var buf [32]byte // big enough for int64 i := len(buf) - 1 for val >= 10 { buf[i] = byte(val%10 + '0') i-- val /= 10 } buf[i] = byte(val + '0') return string(buf[i:]) } ================================================ FILE: vendor/golang.org/x/sys/windows/syscall.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build windows // Package windows contains an interface to the low-level operating system // primitives. OS details vary depending on the underlying system, and // by default, godoc will display the OS-specific documentation for the current // system. If you want godoc to display syscall documentation for another // system, set $GOOS and $GOARCH to the desired system. For example, if // you want to view documentation for freebsd/arm on linux/amd64, set $GOOS // to freebsd and $GOARCH to arm. // The primary use of this package is inside other packages that provide a more // portable interface to the system, such as "os", "time" and "net". Use // those packages rather than this one if you can. // For details of the functions and data types in this package consult // the manuals for the appropriate operating system. // These calls return err == nil to indicate success; otherwise // err represents an operating system error describing the failure and // holds a value of type syscall.Errno. package windows // import "golang.org/x/sys/windows" import ( "syscall" ) // ByteSliceFromString returns a NUL-terminated slice of bytes // containing the text of s. If s contains a NUL byte at any // location, it returns (nil, syscall.EINVAL). func ByteSliceFromString(s string) ([]byte, error) { for i := 0; i < len(s); i++ { if s[i] == 0 { return nil, syscall.EINVAL } } a := make([]byte, len(s)+1) copy(a, s) return a, nil } // BytePtrFromString returns a pointer to a NUL-terminated array of // bytes containing the text of s. If s contains a NUL byte at any // location, it returns (nil, syscall.EINVAL). func BytePtrFromString(s string) (*byte, error) { a, err := ByteSliceFromString(s) if err != nil { return nil, err } return &a[0], nil } // Single-word zero for use when we need a valid pointer to 0 bytes. // See mksyscall.pl. var _zero uintptr func (ts *Timespec) Unix() (sec int64, nsec int64) { return int64(ts.Sec), int64(ts.Nsec) } func (tv *Timeval) Unix() (sec int64, nsec int64) { return int64(tv.Sec), int64(tv.Usec) * 1000 } func (ts *Timespec) Nano() int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } func (tv *Timeval) Nano() int64 { return int64(tv.Sec)*1e9 + int64(tv.Usec)*1000 } ================================================ FILE: vendor/golang.org/x/sys/windows/syscall_windows.go ================================================ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Windows system calls. package windows import ( errorspkg "errors" "sync" "syscall" "unicode/utf16" "unsafe" ) type Handle uintptr const InvalidHandle = ^Handle(0) // StringToUTF16 is deprecated. Use UTF16FromString instead. // If s contains a NUL byte this function panics instead of // returning an error. func StringToUTF16(s string) []uint16 { a, err := UTF16FromString(s) if err != nil { panic("windows: string with NUL passed to StringToUTF16") } return a } // UTF16FromString returns the UTF-16 encoding of the UTF-8 string // s, with a terminating NUL added. If s contains a NUL byte at any // location, it returns (nil, syscall.EINVAL). func UTF16FromString(s string) ([]uint16, error) { for i := 0; i < len(s); i++ { if s[i] == 0 { return nil, syscall.EINVAL } } return utf16.Encode([]rune(s + "\x00")), nil } // UTF16ToString returns the UTF-8 encoding of the UTF-16 sequence s, // with a terminating NUL removed. func UTF16ToString(s []uint16) string { for i, v := range s { if v == 0 { s = s[0:i] break } } return string(utf16.Decode(s)) } // StringToUTF16Ptr is deprecated. Use UTF16PtrFromString instead. // If s contains a NUL byte this function panics instead of // returning an error. func StringToUTF16Ptr(s string) *uint16 { return &StringToUTF16(s)[0] } // UTF16PtrFromString returns pointer to the UTF-16 encoding of // the UTF-8 string s, with a terminating NUL added. If s // contains a NUL byte at any location, it returns (nil, syscall.EINVAL). func UTF16PtrFromString(s string) (*uint16, error) { a, err := UTF16FromString(s) if err != nil { return nil, err } return &a[0], nil } func Getpagesize() int { return 4096 } // NewCallback converts a Go function to a function pointer conforming to the stdcall calling convention. // This is useful when interoperating with Windows code requiring callbacks. func NewCallback(fn interface{}) uintptr { return syscall.NewCallback(fn) } // NewCallbackCDecl converts a Go function to a function pointer conforming to the cdecl calling convention. // This is useful when interoperating with Windows code requiring callbacks. func NewCallbackCDecl(fn interface{}) uintptr { return syscall.NewCallbackCDecl(fn) } // windows api calls //sys GetLastError() (lasterr error) //sys LoadLibrary(libname string) (handle Handle, err error) = LoadLibraryW //sys LoadLibraryEx(libname string, zero Handle, flags uintptr) (handle Handle, err error) = LoadLibraryExW //sys FreeLibrary(handle Handle) (err error) //sys GetProcAddress(module Handle, procname string) (proc uintptr, err error) //sys GetVersion() (ver uint32, err error) //sys FormatMessage(flags uint32, msgsrc uintptr, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, err error) = FormatMessageW //sys ExitProcess(exitcode uint32) //sys CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile int32) (handle Handle, err error) [failretval==InvalidHandle] = CreateFileW //sys ReadFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) //sys WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) //sys SetFilePointer(handle Handle, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, err error) [failretval==0xffffffff] //sys CloseHandle(handle Handle) (err error) //sys GetStdHandle(stdhandle uint32) (handle Handle, err error) [failretval==InvalidHandle] //sys SetStdHandle(stdhandle uint32, handle Handle) (err error) //sys findFirstFile1(name *uint16, data *win32finddata1) (handle Handle, err error) [failretval==InvalidHandle] = FindFirstFileW //sys findNextFile1(handle Handle, data *win32finddata1) (err error) = FindNextFileW //sys FindClose(handle Handle) (err error) //sys GetFileInformationByHandle(handle Handle, data *ByHandleFileInformation) (err error) //sys GetCurrentDirectory(buflen uint32, buf *uint16) (n uint32, err error) = GetCurrentDirectoryW //sys SetCurrentDirectory(path *uint16) (err error) = SetCurrentDirectoryW //sys CreateDirectory(path *uint16, sa *SecurityAttributes) (err error) = CreateDirectoryW //sys RemoveDirectory(path *uint16) (err error) = RemoveDirectoryW //sys DeleteFile(path *uint16) (err error) = DeleteFileW //sys MoveFile(from *uint16, to *uint16) (err error) = MoveFileW //sys MoveFileEx(from *uint16, to *uint16, flags uint32) (err error) = MoveFileExW //sys GetComputerName(buf *uint16, n *uint32) (err error) = GetComputerNameW //sys GetComputerNameEx(nametype uint32, buf *uint16, n *uint32) (err error) = GetComputerNameExW //sys SetEndOfFile(handle Handle) (err error) //sys GetSystemTimeAsFileTime(time *Filetime) //sys GetSystemTimePreciseAsFileTime(time *Filetime) //sys GetTimeZoneInformation(tzi *Timezoneinformation) (rc uint32, err error) [failretval==0xffffffff] //sys CreateIoCompletionPort(filehandle Handle, cphandle Handle, key uint32, threadcnt uint32) (handle Handle, err error) //sys GetQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uint32, overlapped **Overlapped, timeout uint32) (err error) //sys PostQueuedCompletionStatus(cphandle Handle, qty uint32, key uint32, overlapped *Overlapped) (err error) //sys CancelIo(s Handle) (err error) //sys CancelIoEx(s Handle, o *Overlapped) (err error) //sys CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) = CreateProcessW //sys OpenProcess(da uint32, inheritHandle bool, pid uint32) (handle Handle, err error) //sys TerminateProcess(handle Handle, exitcode uint32) (err error) //sys GetExitCodeProcess(handle Handle, exitcode *uint32) (err error) //sys GetStartupInfo(startupInfo *StartupInfo) (err error) = GetStartupInfoW //sys GetCurrentProcess() (pseudoHandle Handle, err error) //sys GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error) //sys DuplicateHandle(hSourceProcessHandle Handle, hSourceHandle Handle, hTargetProcessHandle Handle, lpTargetHandle *Handle, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (err error) //sys WaitForSingleObject(handle Handle, waitMilliseconds uint32) (event uint32, err error) [failretval==0xffffffff] //sys GetTempPath(buflen uint32, buf *uint16) (n uint32, err error) = GetTempPathW //sys CreatePipe(readhandle *Handle, writehandle *Handle, sa *SecurityAttributes, size uint32) (err error) //sys GetFileType(filehandle Handle) (n uint32, err error) //sys CryptAcquireContext(provhandle *Handle, container *uint16, provider *uint16, provtype uint32, flags uint32) (err error) = advapi32.CryptAcquireContextW //sys CryptReleaseContext(provhandle Handle, flags uint32) (err error) = advapi32.CryptReleaseContext //sys CryptGenRandom(provhandle Handle, buflen uint32, buf *byte) (err error) = advapi32.CryptGenRandom //sys GetEnvironmentStrings() (envs *uint16, err error) [failretval==nil] = kernel32.GetEnvironmentStringsW //sys FreeEnvironmentStrings(envs *uint16) (err error) = kernel32.FreeEnvironmentStringsW //sys GetEnvironmentVariable(name *uint16, buffer *uint16, size uint32) (n uint32, err error) = kernel32.GetEnvironmentVariableW //sys SetEnvironmentVariable(name *uint16, value *uint16) (err error) = kernel32.SetEnvironmentVariableW //sys SetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error) //sys GetFileAttributes(name *uint16) (attrs uint32, err error) [failretval==INVALID_FILE_ATTRIBUTES] = kernel32.GetFileAttributesW //sys SetFileAttributes(name *uint16, attrs uint32) (err error) = kernel32.SetFileAttributesW //sys GetFileAttributesEx(name *uint16, level uint32, info *byte) (err error) = kernel32.GetFileAttributesExW //sys GetCommandLine() (cmd *uint16) = kernel32.GetCommandLineW //sys CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, err error) [failretval==nil] = shell32.CommandLineToArgvW //sys LocalFree(hmem Handle) (handle Handle, err error) [failretval!=0] //sys SetHandleInformation(handle Handle, mask uint32, flags uint32) (err error) //sys FlushFileBuffers(handle Handle) (err error) //sys GetFullPathName(path *uint16, buflen uint32, buf *uint16, fname **uint16) (n uint32, err error) = kernel32.GetFullPathNameW //sys GetLongPathName(path *uint16, buf *uint16, buflen uint32) (n uint32, err error) = kernel32.GetLongPathNameW //sys GetShortPathName(longpath *uint16, shortpath *uint16, buflen uint32) (n uint32, err error) = kernel32.GetShortPathNameW //sys CreateFileMapping(fhandle Handle, sa *SecurityAttributes, prot uint32, maxSizeHigh uint32, maxSizeLow uint32, name *uint16) (handle Handle, err error) = kernel32.CreateFileMappingW //sys MapViewOfFile(handle Handle, access uint32, offsetHigh uint32, offsetLow uint32, length uintptr) (addr uintptr, err error) //sys UnmapViewOfFile(addr uintptr) (err error) //sys FlushViewOfFile(addr uintptr, length uintptr) (err error) //sys VirtualLock(addr uintptr, length uintptr) (err error) //sys VirtualUnlock(addr uintptr, length uintptr) (err error) //sys VirtualAlloc(address uintptr, size uintptr, alloctype uint32, protect uint32) (value uintptr, err error) = kernel32.VirtualAlloc //sys VirtualFree(address uintptr, size uintptr, freetype uint32) (err error) = kernel32.VirtualFree //sys VirtualProtect(address uintptr, size uintptr, newprotect uint32, oldprotect *uint32) (err error) = kernel32.VirtualProtect //sys TransmitFile(s Handle, handle Handle, bytesToWrite uint32, bytsPerSend uint32, overlapped *Overlapped, transmitFileBuf *TransmitFileBuffers, flags uint32) (err error) = mswsock.TransmitFile //sys ReadDirectoryChanges(handle Handle, buf *byte, buflen uint32, watchSubTree bool, mask uint32, retlen *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) = kernel32.ReadDirectoryChangesW //sys CertOpenSystemStore(hprov Handle, name *uint16) (store Handle, err error) = crypt32.CertOpenSystemStoreW //sys CertOpenStore(storeProvider uintptr, msgAndCertEncodingType uint32, cryptProv uintptr, flags uint32, para uintptr) (handle Handle, err error) [failretval==InvalidHandle] = crypt32.CertOpenStore //sys CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext, err error) [failretval==nil] = crypt32.CertEnumCertificatesInStore //sys CertAddCertificateContextToStore(store Handle, certContext *CertContext, addDisposition uint32, storeContext **CertContext) (err error) = crypt32.CertAddCertificateContextToStore //sys CertCloseStore(store Handle, flags uint32) (err error) = crypt32.CertCloseStore //sys CertGetCertificateChain(engine Handle, leaf *CertContext, time *Filetime, additionalStore Handle, para *CertChainPara, flags uint32, reserved uintptr, chainCtx **CertChainContext) (err error) = crypt32.CertGetCertificateChain //sys CertFreeCertificateChain(ctx *CertChainContext) = crypt32.CertFreeCertificateChain //sys CertCreateCertificateContext(certEncodingType uint32, certEncoded *byte, encodedLen uint32) (context *CertContext, err error) [failretval==nil] = crypt32.CertCreateCertificateContext //sys CertFreeCertificateContext(ctx *CertContext) (err error) = crypt32.CertFreeCertificateContext //sys CertVerifyCertificateChainPolicy(policyOID uintptr, chain *CertChainContext, para *CertChainPolicyPara, status *CertChainPolicyStatus) (err error) = crypt32.CertVerifyCertificateChainPolicy //sys RegOpenKeyEx(key Handle, subkey *uint16, options uint32, desiredAccess uint32, result *Handle) (regerrno error) = advapi32.RegOpenKeyExW //sys RegCloseKey(key Handle) (regerrno error) = advapi32.RegCloseKey //sys RegQueryInfoKey(key Handle, class *uint16, classLen *uint32, reserved *uint32, subkeysLen *uint32, maxSubkeyLen *uint32, maxClassLen *uint32, valuesLen *uint32, maxValueNameLen *uint32, maxValueLen *uint32, saLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegQueryInfoKeyW //sys RegEnumKeyEx(key Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, class *uint16, classLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegEnumKeyExW //sys RegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) = advapi32.RegQueryValueExW //sys getCurrentProcessId() (pid uint32) = kernel32.GetCurrentProcessId //sys GetConsoleMode(console Handle, mode *uint32) (err error) = kernel32.GetConsoleMode //sys SetConsoleMode(console Handle, mode uint32) (err error) = kernel32.SetConsoleMode //sys GetConsoleScreenBufferInfo(console Handle, info *ConsoleScreenBufferInfo) (err error) = kernel32.GetConsoleScreenBufferInfo //sys WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) = kernel32.WriteConsoleW //sys ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) = kernel32.ReadConsoleW //sys CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.CreateToolhelp32Snapshot //sys Process32First(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32FirstW //sys Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32NextW //sys DeviceIoControl(handle Handle, ioControlCode uint32, inBuffer *byte, inBufferSize uint32, outBuffer *byte, outBufferSize uint32, bytesReturned *uint32, overlapped *Overlapped) (err error) // This function returns 1 byte BOOLEAN rather than the 4 byte BOOL. //sys CreateSymbolicLink(symlinkfilename *uint16, targetfilename *uint16, flags uint32) (err error) [failretval&0xff==0] = CreateSymbolicLinkW //sys CreateHardLink(filename *uint16, existingfilename *uint16, reserved uintptr) (err error) [failretval&0xff==0] = CreateHardLinkW //sys GetCurrentThreadId() (id uint32) //sys CreateEvent(eventAttrs *SecurityAttributes, manualReset uint32, initialState uint32, name *uint16) (handle Handle, err error) = kernel32.CreateEventW //sys CreateEventEx(eventAttrs *SecurityAttributes, name *uint16, flags uint32, desiredAccess uint32) (handle Handle, err error) = kernel32.CreateEventExW //sys OpenEvent(desiredAccess uint32, inheritHandle bool, name *uint16) (handle Handle, err error) = kernel32.OpenEventW //sys SetEvent(event Handle) (err error) = kernel32.SetEvent //sys ResetEvent(event Handle) (err error) = kernel32.ResetEvent //sys PulseEvent(event Handle) (err error) = kernel32.PulseEvent // syscall interface implementation for other packages // GetProcAddressByOrdinal retrieves the address of the exported // function from module by ordinal. func GetProcAddressByOrdinal(module Handle, ordinal uintptr) (proc uintptr, err error) { r0, _, e1 := syscall.Syscall(procGetProcAddress.Addr(), 2, uintptr(module), ordinal, 0) proc = uintptr(r0) if proc == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func Exit(code int) { ExitProcess(uint32(code)) } func makeInheritSa() *SecurityAttributes { var sa SecurityAttributes sa.Length = uint32(unsafe.Sizeof(sa)) sa.InheritHandle = 1 return &sa } func Open(path string, mode int, perm uint32) (fd Handle, err error) { if len(path) == 0 { return InvalidHandle, ERROR_FILE_NOT_FOUND } pathp, err := UTF16PtrFromString(path) if err != nil { return InvalidHandle, err } var access uint32 switch mode & (O_RDONLY | O_WRONLY | O_RDWR) { case O_RDONLY: access = GENERIC_READ case O_WRONLY: access = GENERIC_WRITE case O_RDWR: access = GENERIC_READ | GENERIC_WRITE } if mode&O_CREAT != 0 { access |= GENERIC_WRITE } if mode&O_APPEND != 0 { access &^= GENERIC_WRITE access |= FILE_APPEND_DATA } sharemode := uint32(FILE_SHARE_READ | FILE_SHARE_WRITE) var sa *SecurityAttributes if mode&O_CLOEXEC == 0 { sa = makeInheritSa() } var createmode uint32 switch { case mode&(O_CREAT|O_EXCL) == (O_CREAT | O_EXCL): createmode = CREATE_NEW case mode&(O_CREAT|O_TRUNC) == (O_CREAT | O_TRUNC): createmode = CREATE_ALWAYS case mode&O_CREAT == O_CREAT: createmode = OPEN_ALWAYS case mode&O_TRUNC == O_TRUNC: createmode = TRUNCATE_EXISTING default: createmode = OPEN_EXISTING } h, e := CreateFile(pathp, access, sharemode, sa, createmode, FILE_ATTRIBUTE_NORMAL, 0) return h, e } func Read(fd Handle, p []byte) (n int, err error) { var done uint32 e := ReadFile(fd, p, &done, nil) if e != nil { if e == ERROR_BROKEN_PIPE { // NOTE(brainman): work around ERROR_BROKEN_PIPE is returned on reading EOF from stdin return 0, nil } return 0, e } if raceenabled { if done > 0 { raceWriteRange(unsafe.Pointer(&p[0]), int(done)) } raceAcquire(unsafe.Pointer(&ioSync)) } return int(done), nil } func Write(fd Handle, p []byte) (n int, err error) { if raceenabled { raceReleaseMerge(unsafe.Pointer(&ioSync)) } var done uint32 e := WriteFile(fd, p, &done, nil) if e != nil { return 0, e } if raceenabled && done > 0 { raceReadRange(unsafe.Pointer(&p[0]), int(done)) } return int(done), nil } var ioSync int64 func Seek(fd Handle, offset int64, whence int) (newoffset int64, err error) { var w uint32 switch whence { case 0: w = FILE_BEGIN case 1: w = FILE_CURRENT case 2: w = FILE_END } hi := int32(offset >> 32) lo := int32(offset) // use GetFileType to check pipe, pipe can't do seek ft, _ := GetFileType(fd) if ft == FILE_TYPE_PIPE { return 0, syscall.EPIPE } rlo, e := SetFilePointer(fd, lo, &hi, w) if e != nil { return 0, e } return int64(hi)<<32 + int64(rlo), nil } func Close(fd Handle) (err error) { return CloseHandle(fd) } var ( Stdin = getStdHandle(STD_INPUT_HANDLE) Stdout = getStdHandle(STD_OUTPUT_HANDLE) Stderr = getStdHandle(STD_ERROR_HANDLE) ) func getStdHandle(stdhandle uint32) (fd Handle) { r, _ := GetStdHandle(stdhandle) CloseOnExec(r) return r } const ImplementsGetwd = true func Getwd() (wd string, err error) { b := make([]uint16, 300) n, e := GetCurrentDirectory(uint32(len(b)), &b[0]) if e != nil { return "", e } return string(utf16.Decode(b[0:n])), nil } func Chdir(path string) (err error) { pathp, err := UTF16PtrFromString(path) if err != nil { return err } return SetCurrentDirectory(pathp) } func Mkdir(path string, mode uint32) (err error) { pathp, err := UTF16PtrFromString(path) if err != nil { return err } return CreateDirectory(pathp, nil) } func Rmdir(path string) (err error) { pathp, err := UTF16PtrFromString(path) if err != nil { return err } return RemoveDirectory(pathp) } func Unlink(path string) (err error) { pathp, err := UTF16PtrFromString(path) if err != nil { return err } return DeleteFile(pathp) } func Rename(oldpath, newpath string) (err error) { from, err := UTF16PtrFromString(oldpath) if err != nil { return err } to, err := UTF16PtrFromString(newpath) if err != nil { return err } return MoveFileEx(from, to, MOVEFILE_REPLACE_EXISTING) } func ComputerName() (name string, err error) { var n uint32 = MAX_COMPUTERNAME_LENGTH + 1 b := make([]uint16, n) e := GetComputerName(&b[0], &n) if e != nil { return "", e } return string(utf16.Decode(b[0:n])), nil } func Ftruncate(fd Handle, length int64) (err error) { curoffset, e := Seek(fd, 0, 1) if e != nil { return e } defer Seek(fd, curoffset, 0) _, e = Seek(fd, length, 0) if e != nil { return e } e = SetEndOfFile(fd) if e != nil { return e } return nil } func Gettimeofday(tv *Timeval) (err error) { var ft Filetime GetSystemTimeAsFileTime(&ft) *tv = NsecToTimeval(ft.Nanoseconds()) return nil } func Pipe(p []Handle) (err error) { if len(p) != 2 { return syscall.EINVAL } var r, w Handle e := CreatePipe(&r, &w, makeInheritSa(), 0) if e != nil { return e } p[0] = r p[1] = w return nil } func Utimes(path string, tv []Timeval) (err error) { if len(tv) != 2 { return syscall.EINVAL } pathp, e := UTF16PtrFromString(path) if e != nil { return e } h, e := CreateFile(pathp, FILE_WRITE_ATTRIBUTES, FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0) if e != nil { return e } defer Close(h) a := NsecToFiletime(tv[0].Nanoseconds()) w := NsecToFiletime(tv[1].Nanoseconds()) return SetFileTime(h, nil, &a, &w) } func UtimesNano(path string, ts []Timespec) (err error) { if len(ts) != 2 { return syscall.EINVAL } pathp, e := UTF16PtrFromString(path) if e != nil { return e } h, e := CreateFile(pathp, FILE_WRITE_ATTRIBUTES, FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0) if e != nil { return e } defer Close(h) a := NsecToFiletime(TimespecToNsec(ts[0])) w := NsecToFiletime(TimespecToNsec(ts[1])) return SetFileTime(h, nil, &a, &w) } func Fsync(fd Handle) (err error) { return FlushFileBuffers(fd) } func Chmod(path string, mode uint32) (err error) { if mode == 0 { return syscall.EINVAL } p, e := UTF16PtrFromString(path) if e != nil { return e } attrs, e := GetFileAttributes(p) if e != nil { return e } if mode&S_IWRITE != 0 { attrs &^= FILE_ATTRIBUTE_READONLY } else { attrs |= FILE_ATTRIBUTE_READONLY } return SetFileAttributes(p, attrs) } func LoadGetSystemTimePreciseAsFileTime() error { return procGetSystemTimePreciseAsFileTime.Find() } func LoadCancelIoEx() error { return procCancelIoEx.Find() } func LoadSetFileCompletionNotificationModes() error { return procSetFileCompletionNotificationModes.Find() } // net api calls const socket_error = uintptr(^uint32(0)) //sys WSAStartup(verreq uint32, data *WSAData) (sockerr error) = ws2_32.WSAStartup //sys WSACleanup() (err error) [failretval==socket_error] = ws2_32.WSACleanup //sys WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) [failretval==socket_error] = ws2_32.WSAIoctl //sys socket(af int32, typ int32, protocol int32) (handle Handle, err error) [failretval==InvalidHandle] = ws2_32.socket //sys Setsockopt(s Handle, level int32, optname int32, optval *byte, optlen int32) (err error) [failretval==socket_error] = ws2_32.setsockopt //sys Getsockopt(s Handle, level int32, optname int32, optval *byte, optlen *int32) (err error) [failretval==socket_error] = ws2_32.getsockopt //sys bind(s Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socket_error] = ws2_32.bind //sys connect(s Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socket_error] = ws2_32.connect //sys getsockname(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) [failretval==socket_error] = ws2_32.getsockname //sys getpeername(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) [failretval==socket_error] = ws2_32.getpeername //sys listen(s Handle, backlog int32) (err error) [failretval==socket_error] = ws2_32.listen //sys shutdown(s Handle, how int32) (err error) [failretval==socket_error] = ws2_32.shutdown //sys Closesocket(s Handle) (err error) [failretval==socket_error] = ws2_32.closesocket //sys AcceptEx(ls Handle, as Handle, buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, recvd *uint32, overlapped *Overlapped) (err error) = mswsock.AcceptEx //sys GetAcceptExSockaddrs(buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, lrsa **RawSockaddrAny, lrsalen *int32, rrsa **RawSockaddrAny, rrsalen *int32) = mswsock.GetAcceptExSockaddrs //sys WSARecv(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSARecv //sys WSASend(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASend //sys WSARecvFrom(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, from *RawSockaddrAny, fromlen *int32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSARecvFrom //sys WSASendTo(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to *RawSockaddrAny, tolen int32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASendTo //sys GetHostByName(name string) (h *Hostent, err error) [failretval==nil] = ws2_32.gethostbyname //sys GetServByName(name string, proto string) (s *Servent, err error) [failretval==nil] = ws2_32.getservbyname //sys Ntohs(netshort uint16) (u uint16) = ws2_32.ntohs //sys GetProtoByName(name string) (p *Protoent, err error) [failretval==nil] = ws2_32.getprotobyname //sys DnsQuery(name string, qtype uint16, options uint32, extra *byte, qrs **DNSRecord, pr *byte) (status error) = dnsapi.DnsQuery_W //sys DnsRecordListFree(rl *DNSRecord, freetype uint32) = dnsapi.DnsRecordListFree //sys DnsNameCompare(name1 *uint16, name2 *uint16) (same bool) = dnsapi.DnsNameCompare_W //sys GetAddrInfoW(nodename *uint16, servicename *uint16, hints *AddrinfoW, result **AddrinfoW) (sockerr error) = ws2_32.GetAddrInfoW //sys FreeAddrInfoW(addrinfo *AddrinfoW) = ws2_32.FreeAddrInfoW //sys GetIfEntry(pIfRow *MibIfRow) (errcode error) = iphlpapi.GetIfEntry //sys GetAdaptersInfo(ai *IpAdapterInfo, ol *uint32) (errcode error) = iphlpapi.GetAdaptersInfo //sys SetFileCompletionNotificationModes(handle Handle, flags uint8) (err error) = kernel32.SetFileCompletionNotificationModes //sys WSAEnumProtocols(protocols *int32, protocolBuffer *WSAProtocolInfo, bufferLength *uint32) (n int32, err error) [failretval==-1] = ws2_32.WSAEnumProtocolsW //sys GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) = iphlpapi.GetAdaptersAddresses //sys GetACP() (acp uint32) = kernel32.GetACP //sys MultiByteToWideChar(codePage uint32, dwFlags uint32, str *byte, nstr int32, wchar *uint16, nwchar int32) (nwrite int32, err error) = kernel32.MultiByteToWideChar // For testing: clients can set this flag to force // creation of IPv6 sockets to return EAFNOSUPPORT. var SocketDisableIPv6 bool type RawSockaddrInet4 struct { Family uint16 Port uint16 Addr [4]byte /* in_addr */ Zero [8]uint8 } type RawSockaddrInet6 struct { Family uint16 Port uint16 Flowinfo uint32 Addr [16]byte /* in6_addr */ Scope_id uint32 } type RawSockaddr struct { Family uint16 Data [14]int8 } type RawSockaddrAny struct { Addr RawSockaddr Pad [96]int8 } type Sockaddr interface { sockaddr() (ptr unsafe.Pointer, len int32, err error) // lowercase; only we can define Sockaddrs } type SockaddrInet4 struct { Port int Addr [4]byte raw RawSockaddrInet4 } func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, int32, error) { if sa.Port < 0 || sa.Port > 0xFFFF { return nil, 0, syscall.EINVAL } sa.raw.Family = AF_INET p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) p[0] = byte(sa.Port >> 8) p[1] = byte(sa.Port) for i := 0; i < len(sa.Addr); i++ { sa.raw.Addr[i] = sa.Addr[i] } return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil } type SockaddrInet6 struct { Port int ZoneId uint32 Addr [16]byte raw RawSockaddrInet6 } func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, int32, error) { if sa.Port < 0 || sa.Port > 0xFFFF { return nil, 0, syscall.EINVAL } sa.raw.Family = AF_INET6 p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) p[0] = byte(sa.Port >> 8) p[1] = byte(sa.Port) sa.raw.Scope_id = sa.ZoneId for i := 0; i < len(sa.Addr); i++ { sa.raw.Addr[i] = sa.Addr[i] } return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil } type SockaddrUnix struct { Name string } func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, int32, error) { // TODO(brainman): implement SockaddrUnix.sockaddr() return nil, 0, syscall.EWINDOWS } func (rsa *RawSockaddrAny) Sockaddr() (Sockaddr, error) { switch rsa.Addr.Family { case AF_UNIX: return nil, syscall.EWINDOWS case AF_INET: pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) sa := new(SockaddrInet4) p := (*[2]byte)(unsafe.Pointer(&pp.Port)) sa.Port = int(p[0])<<8 + int(p[1]) for i := 0; i < len(sa.Addr); i++ { sa.Addr[i] = pp.Addr[i] } return sa, nil case AF_INET6: pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) sa := new(SockaddrInet6) p := (*[2]byte)(unsafe.Pointer(&pp.Port)) sa.Port = int(p[0])<<8 + int(p[1]) sa.ZoneId = pp.Scope_id for i := 0; i < len(sa.Addr); i++ { sa.Addr[i] = pp.Addr[i] } return sa, nil } return nil, syscall.EAFNOSUPPORT } func Socket(domain, typ, proto int) (fd Handle, err error) { if domain == AF_INET6 && SocketDisableIPv6 { return InvalidHandle, syscall.EAFNOSUPPORT } return socket(int32(domain), int32(typ), int32(proto)) } func SetsockoptInt(fd Handle, level, opt int, value int) (err error) { v := int32(value) return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&v)), int32(unsafe.Sizeof(v))) } func Bind(fd Handle, sa Sockaddr) (err error) { ptr, n, err := sa.sockaddr() if err != nil { return err } return bind(fd, ptr, n) } func Connect(fd Handle, sa Sockaddr) (err error) { ptr, n, err := sa.sockaddr() if err != nil { return err } return connect(fd, ptr, n) } func Getsockname(fd Handle) (sa Sockaddr, err error) { var rsa RawSockaddrAny l := int32(unsafe.Sizeof(rsa)) if err = getsockname(fd, &rsa, &l); err != nil { return } return rsa.Sockaddr() } func Getpeername(fd Handle) (sa Sockaddr, err error) { var rsa RawSockaddrAny l := int32(unsafe.Sizeof(rsa)) if err = getpeername(fd, &rsa, &l); err != nil { return } return rsa.Sockaddr() } func Listen(s Handle, n int) (err error) { return listen(s, int32(n)) } func Shutdown(fd Handle, how int) (err error) { return shutdown(fd, int32(how)) } func WSASendto(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to Sockaddr, overlapped *Overlapped, croutine *byte) (err error) { rsa, l, err := to.sockaddr() if err != nil { return err } return WSASendTo(s, bufs, bufcnt, sent, flags, (*RawSockaddrAny)(unsafe.Pointer(rsa)), l, overlapped, croutine) } func LoadGetAddrInfo() error { return procGetAddrInfoW.Find() } var connectExFunc struct { once sync.Once addr uintptr err error } func LoadConnectEx() error { connectExFunc.once.Do(func() { var s Handle s, connectExFunc.err = Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) if connectExFunc.err != nil { return } defer CloseHandle(s) var n uint32 connectExFunc.err = WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, (*byte)(unsafe.Pointer(&WSAID_CONNECTEX)), uint32(unsafe.Sizeof(WSAID_CONNECTEX)), (*byte)(unsafe.Pointer(&connectExFunc.addr)), uint32(unsafe.Sizeof(connectExFunc.addr)), &n, nil, 0) }) return connectExFunc.err } func connectEx(s Handle, name unsafe.Pointer, namelen int32, sendBuf *byte, sendDataLen uint32, bytesSent *uint32, overlapped *Overlapped) (err error) { r1, _, e1 := syscall.Syscall9(connectExFunc.addr, 7, uintptr(s), uintptr(name), uintptr(namelen), uintptr(unsafe.Pointer(sendBuf)), uintptr(sendDataLen), uintptr(unsafe.Pointer(bytesSent)), uintptr(unsafe.Pointer(overlapped)), 0, 0) if r1 == 0 { if e1 != 0 { err = error(e1) } else { err = syscall.EINVAL } } return } func ConnectEx(fd Handle, sa Sockaddr, sendBuf *byte, sendDataLen uint32, bytesSent *uint32, overlapped *Overlapped) error { err := LoadConnectEx() if err != nil { return errorspkg.New("failed to find ConnectEx: " + err.Error()) } ptr, n, err := sa.sockaddr() if err != nil { return err } return connectEx(fd, ptr, n, sendBuf, sendDataLen, bytesSent, overlapped) } var sendRecvMsgFunc struct { once sync.Once sendAddr uintptr recvAddr uintptr err error } func loadWSASendRecvMsg() error { sendRecvMsgFunc.once.Do(func() { var s Handle s, sendRecvMsgFunc.err = Socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP) if sendRecvMsgFunc.err != nil { return } defer CloseHandle(s) var n uint32 sendRecvMsgFunc.err = WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, (*byte)(unsafe.Pointer(&WSAID_WSARECVMSG)), uint32(unsafe.Sizeof(WSAID_WSARECVMSG)), (*byte)(unsafe.Pointer(&sendRecvMsgFunc.recvAddr)), uint32(unsafe.Sizeof(sendRecvMsgFunc.recvAddr)), &n, nil, 0) if sendRecvMsgFunc.err != nil { return } sendRecvMsgFunc.err = WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, (*byte)(unsafe.Pointer(&WSAID_WSASENDMSG)), uint32(unsafe.Sizeof(WSAID_WSASENDMSG)), (*byte)(unsafe.Pointer(&sendRecvMsgFunc.sendAddr)), uint32(unsafe.Sizeof(sendRecvMsgFunc.sendAddr)), &n, nil, 0) }) return sendRecvMsgFunc.err } func WSASendMsg(fd Handle, msg *WSAMsg, flags uint32, bytesSent *uint32, overlapped *Overlapped, croutine *byte) error { err := loadWSASendRecvMsg() if err != nil { return err } r1, _, e1 := syscall.Syscall6(sendRecvMsgFunc.sendAddr, 6, uintptr(fd), uintptr(unsafe.Pointer(msg)), uintptr(flags), uintptr(unsafe.Pointer(bytesSent)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine))) if r1 == socket_error { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return err } func WSARecvMsg(fd Handle, msg *WSAMsg, bytesReceived *uint32, overlapped *Overlapped, croutine *byte) error { err := loadWSASendRecvMsg() if err != nil { return err } r1, _, e1 := syscall.Syscall6(sendRecvMsgFunc.recvAddr, 5, uintptr(fd), uintptr(unsafe.Pointer(msg)), uintptr(unsafe.Pointer(bytesReceived)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0) if r1 == socket_error { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return err } // Invented structures to support what package os expects. type Rusage struct { CreationTime Filetime ExitTime Filetime KernelTime Filetime UserTime Filetime } type WaitStatus struct { ExitCode uint32 } func (w WaitStatus) Exited() bool { return true } func (w WaitStatus) ExitStatus() int { return int(w.ExitCode) } func (w WaitStatus) Signal() Signal { return -1 } func (w WaitStatus) CoreDump() bool { return false } func (w WaitStatus) Stopped() bool { return false } func (w WaitStatus) Continued() bool { return false } func (w WaitStatus) StopSignal() Signal { return -1 } func (w WaitStatus) Signaled() bool { return false } func (w WaitStatus) TrapCause() int { return -1 } // Timespec is an invented structure on Windows, but here for // consistency with the corresponding package for other operating systems. type Timespec struct { Sec int64 Nsec int64 } func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } func NsecToTimespec(nsec int64) (ts Timespec) { ts.Sec = nsec / 1e9 ts.Nsec = nsec % 1e9 return } // TODO(brainman): fix all needed for net func Accept(fd Handle) (nfd Handle, sa Sockaddr, err error) { return 0, nil, syscall.EWINDOWS } func Recvfrom(fd Handle, p []byte, flags int) (n int, from Sockaddr, err error) { return 0, nil, syscall.EWINDOWS } func Sendto(fd Handle, p []byte, flags int, to Sockaddr) (err error) { return syscall.EWINDOWS } func SetsockoptTimeval(fd Handle, level, opt int, tv *Timeval) (err error) { return syscall.EWINDOWS } // The Linger struct is wrong but we only noticed after Go 1. // sysLinger is the real system call structure. // BUG(brainman): The definition of Linger is not appropriate for direct use // with Setsockopt and Getsockopt. // Use SetsockoptLinger instead. type Linger struct { Onoff int32 Linger int32 } type sysLinger struct { Onoff uint16 Linger uint16 } type IPMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } type IPv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } func GetsockoptInt(fd Handle, level, opt int) (int, error) { return -1, syscall.EWINDOWS } func SetsockoptLinger(fd Handle, level, opt int, l *Linger) (err error) { sys := sysLinger{Onoff: uint16(l.Onoff), Linger: uint16(l.Linger)} return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&sys)), int32(unsafe.Sizeof(sys))) } func SetsockoptInet4Addr(fd Handle, level, opt int, value [4]byte) (err error) { return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&value[0])), 4) } func SetsockoptIPMreq(fd Handle, level, opt int, mreq *IPMreq) (err error) { return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(mreq)), int32(unsafe.Sizeof(*mreq))) } func SetsockoptIPv6Mreq(fd Handle, level, opt int, mreq *IPv6Mreq) (err error) { return syscall.EWINDOWS } func Getpid() (pid int) { return int(getCurrentProcessId()) } func FindFirstFile(name *uint16, data *Win32finddata) (handle Handle, err error) { // NOTE(rsc): The Win32finddata struct is wrong for the system call: // the two paths are each one uint16 short. Use the correct struct, // a win32finddata1, and then copy the results out. // There is no loss of expressivity here, because the final // uint16, if it is used, is supposed to be a NUL, and Go doesn't need that. // For Go 1.1, we might avoid the allocation of win32finddata1 here // by adding a final Bug [2]uint16 field to the struct and then // adjusting the fields in the result directly. var data1 win32finddata1 handle, err = findFirstFile1(name, &data1) if err == nil { copyFindData(data, &data1) } return } func FindNextFile(handle Handle, data *Win32finddata) (err error) { var data1 win32finddata1 err = findNextFile1(handle, &data1) if err == nil { copyFindData(data, &data1) } return } func getProcessEntry(pid int) (*ProcessEntry32, error) { snapshot, err := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) if err != nil { return nil, err } defer CloseHandle(snapshot) var procEntry ProcessEntry32 procEntry.Size = uint32(unsafe.Sizeof(procEntry)) if err = Process32First(snapshot, &procEntry); err != nil { return nil, err } for { if procEntry.ProcessID == uint32(pid) { return &procEntry, nil } err = Process32Next(snapshot, &procEntry) if err != nil { return nil, err } } } func Getppid() (ppid int) { pe, err := getProcessEntry(Getpid()) if err != nil { return -1 } return int(pe.ParentProcessID) } // TODO(brainman): fix all needed for os func Fchdir(fd Handle) (err error) { return syscall.EWINDOWS } func Link(oldpath, newpath string) (err error) { return syscall.EWINDOWS } func Symlink(path, link string) (err error) { return syscall.EWINDOWS } func Fchmod(fd Handle, mode uint32) (err error) { return syscall.EWINDOWS } func Chown(path string, uid int, gid int) (err error) { return syscall.EWINDOWS } func Lchown(path string, uid int, gid int) (err error) { return syscall.EWINDOWS } func Fchown(fd Handle, uid int, gid int) (err error) { return syscall.EWINDOWS } func Getuid() (uid int) { return -1 } func Geteuid() (euid int) { return -1 } func Getgid() (gid int) { return -1 } func Getegid() (egid int) { return -1 } func Getgroups() (gids []int, err error) { return nil, syscall.EWINDOWS } type Signal int func (s Signal) Signal() {} func (s Signal) String() string { if 0 <= s && int(s) < len(signals) { str := signals[s] if str != "" { return str } } return "signal " + itoa(int(s)) } func LoadCreateSymbolicLink() error { return procCreateSymbolicLinkW.Find() } // Readlink returns the destination of the named symbolic link. func Readlink(path string, buf []byte) (n int, err error) { fd, err := CreateFile(StringToUTF16Ptr(path), GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, 0) if err != nil { return -1, err } defer CloseHandle(fd) rdbbuf := make([]byte, MAXIMUM_REPARSE_DATA_BUFFER_SIZE) var bytesReturned uint32 err = DeviceIoControl(fd, FSCTL_GET_REPARSE_POINT, nil, 0, &rdbbuf[0], uint32(len(rdbbuf)), &bytesReturned, nil) if err != nil { return -1, err } rdb := (*reparseDataBuffer)(unsafe.Pointer(&rdbbuf[0])) var s string switch rdb.ReparseTag { case IO_REPARSE_TAG_SYMLINK: data := (*symbolicLinkReparseBuffer)(unsafe.Pointer(&rdb.reparseBuffer)) p := (*[0xffff]uint16)(unsafe.Pointer(&data.PathBuffer[0])) s = UTF16ToString(p[data.PrintNameOffset/2 : (data.PrintNameLength-data.PrintNameOffset)/2]) case IO_REPARSE_TAG_MOUNT_POINT: data := (*mountPointReparseBuffer)(unsafe.Pointer(&rdb.reparseBuffer)) p := (*[0xffff]uint16)(unsafe.Pointer(&data.PathBuffer[0])) s = UTF16ToString(p[data.PrintNameOffset/2 : (data.PrintNameLength-data.PrintNameOffset)/2]) default: // the path is not a symlink or junction but another type of reparse // point return -1, syscall.ENOENT } n = copy(buf, []byte(s)) return n, nil } ================================================ FILE: vendor/golang.org/x/sys/windows/types_windows.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package windows import "syscall" const ( // Windows errors. ERROR_FILE_NOT_FOUND syscall.Errno = 2 ERROR_PATH_NOT_FOUND syscall.Errno = 3 ERROR_ACCESS_DENIED syscall.Errno = 5 ERROR_NO_MORE_FILES syscall.Errno = 18 ERROR_HANDLE_EOF syscall.Errno = 38 ERROR_NETNAME_DELETED syscall.Errno = 64 ERROR_FILE_EXISTS syscall.Errno = 80 ERROR_BROKEN_PIPE syscall.Errno = 109 ERROR_BUFFER_OVERFLOW syscall.Errno = 111 ERROR_INSUFFICIENT_BUFFER syscall.Errno = 122 ERROR_MOD_NOT_FOUND syscall.Errno = 126 ERROR_PROC_NOT_FOUND syscall.Errno = 127 ERROR_ALREADY_EXISTS syscall.Errno = 183 ERROR_ENVVAR_NOT_FOUND syscall.Errno = 203 ERROR_MORE_DATA syscall.Errno = 234 ERROR_OPERATION_ABORTED syscall.Errno = 995 ERROR_IO_PENDING syscall.Errno = 997 ERROR_SERVICE_SPECIFIC_ERROR syscall.Errno = 1066 ERROR_NOT_FOUND syscall.Errno = 1168 ERROR_PRIVILEGE_NOT_HELD syscall.Errno = 1314 WSAEACCES syscall.Errno = 10013 WSAEMSGSIZE syscall.Errno = 10040 WSAECONNRESET syscall.Errno = 10054 ) const ( // Invented values to support what package os expects. O_RDONLY = 0x00000 O_WRONLY = 0x00001 O_RDWR = 0x00002 O_CREAT = 0x00040 O_EXCL = 0x00080 O_NOCTTY = 0x00100 O_TRUNC = 0x00200 O_NONBLOCK = 0x00800 O_APPEND = 0x00400 O_SYNC = 0x01000 O_ASYNC = 0x02000 O_CLOEXEC = 0x80000 ) const ( // More invented values for signals SIGHUP = Signal(0x1) SIGINT = Signal(0x2) SIGQUIT = Signal(0x3) SIGILL = Signal(0x4) SIGTRAP = Signal(0x5) SIGABRT = Signal(0x6) SIGBUS = Signal(0x7) SIGFPE = Signal(0x8) SIGKILL = Signal(0x9) SIGSEGV = Signal(0xb) SIGPIPE = Signal(0xd) SIGALRM = Signal(0xe) SIGTERM = Signal(0xf) ) var signals = [...]string{ 1: "hangup", 2: "interrupt", 3: "quit", 4: "illegal instruction", 5: "trace/breakpoint trap", 6: "aborted", 7: "bus error", 8: "floating point exception", 9: "killed", 10: "user defined signal 1", 11: "segmentation fault", 12: "user defined signal 2", 13: "broken pipe", 14: "alarm clock", 15: "terminated", } const ( GENERIC_READ = 0x80000000 GENERIC_WRITE = 0x40000000 GENERIC_EXECUTE = 0x20000000 GENERIC_ALL = 0x10000000 FILE_LIST_DIRECTORY = 0x00000001 FILE_APPEND_DATA = 0x00000004 FILE_WRITE_ATTRIBUTES = 0x00000100 FILE_SHARE_READ = 0x00000001 FILE_SHARE_WRITE = 0x00000002 FILE_SHARE_DELETE = 0x00000004 FILE_ATTRIBUTE_READONLY = 0x00000001 FILE_ATTRIBUTE_HIDDEN = 0x00000002 FILE_ATTRIBUTE_SYSTEM = 0x00000004 FILE_ATTRIBUTE_DIRECTORY = 0x00000010 FILE_ATTRIBUTE_ARCHIVE = 0x00000020 FILE_ATTRIBUTE_NORMAL = 0x00000080 FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400 INVALID_FILE_ATTRIBUTES = 0xffffffff CREATE_NEW = 1 CREATE_ALWAYS = 2 OPEN_EXISTING = 3 OPEN_ALWAYS = 4 TRUNCATE_EXISTING = 5 FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000 FILE_FLAG_BACKUP_SEMANTICS = 0x02000000 FILE_FLAG_OVERLAPPED = 0x40000000 HANDLE_FLAG_INHERIT = 0x00000001 STARTF_USESTDHANDLES = 0x00000100 STARTF_USESHOWWINDOW = 0x00000001 DUPLICATE_CLOSE_SOURCE = 0x00000001 DUPLICATE_SAME_ACCESS = 0x00000002 STD_INPUT_HANDLE = -10 & (1<<32 - 1) STD_OUTPUT_HANDLE = -11 & (1<<32 - 1) STD_ERROR_HANDLE = -12 & (1<<32 - 1) FILE_BEGIN = 0 FILE_CURRENT = 1 FILE_END = 2 LANG_ENGLISH = 0x09 SUBLANG_ENGLISH_US = 0x01 FORMAT_MESSAGE_ALLOCATE_BUFFER = 256 FORMAT_MESSAGE_IGNORE_INSERTS = 512 FORMAT_MESSAGE_FROM_STRING = 1024 FORMAT_MESSAGE_FROM_HMODULE = 2048 FORMAT_MESSAGE_FROM_SYSTEM = 4096 FORMAT_MESSAGE_ARGUMENT_ARRAY = 8192 FORMAT_MESSAGE_MAX_WIDTH_MASK = 255 MAX_PATH = 260 MAX_LONG_PATH = 32768 MAX_COMPUTERNAME_LENGTH = 15 TIME_ZONE_ID_UNKNOWN = 0 TIME_ZONE_ID_STANDARD = 1 TIME_ZONE_ID_DAYLIGHT = 2 IGNORE = 0 INFINITE = 0xffffffff WAIT_TIMEOUT = 258 WAIT_ABANDONED = 0x00000080 WAIT_OBJECT_0 = 0x00000000 WAIT_FAILED = 0xFFFFFFFF CREATE_NEW_PROCESS_GROUP = 0x00000200 CREATE_UNICODE_ENVIRONMENT = 0x00000400 PROCESS_TERMINATE = 1 PROCESS_QUERY_INFORMATION = 0x00000400 SYNCHRONIZE = 0x00100000 FILE_MAP_COPY = 0x01 FILE_MAP_WRITE = 0x02 FILE_MAP_READ = 0x04 FILE_MAP_EXECUTE = 0x20 CTRL_C_EVENT = 0 CTRL_BREAK_EVENT = 1 // Windows reserves errors >= 1<<29 for application use. APPLICATION_ERROR = 1 << 29 ) const ( // flags for CreateToolhelp32Snapshot TH32CS_SNAPHEAPLIST = 0x01 TH32CS_SNAPPROCESS = 0x02 TH32CS_SNAPTHREAD = 0x04 TH32CS_SNAPMODULE = 0x08 TH32CS_SNAPMODULE32 = 0x10 TH32CS_SNAPALL = TH32CS_SNAPHEAPLIST | TH32CS_SNAPMODULE | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD TH32CS_INHERIT = 0x80000000 ) const ( // filters for ReadDirectoryChangesW FILE_NOTIFY_CHANGE_FILE_NAME = 0x001 FILE_NOTIFY_CHANGE_DIR_NAME = 0x002 FILE_NOTIFY_CHANGE_ATTRIBUTES = 0x004 FILE_NOTIFY_CHANGE_SIZE = 0x008 FILE_NOTIFY_CHANGE_LAST_WRITE = 0x010 FILE_NOTIFY_CHANGE_LAST_ACCESS = 0x020 FILE_NOTIFY_CHANGE_CREATION = 0x040 FILE_NOTIFY_CHANGE_SECURITY = 0x100 ) const ( // do not reorder FILE_ACTION_ADDED = iota + 1 FILE_ACTION_REMOVED FILE_ACTION_MODIFIED FILE_ACTION_RENAMED_OLD_NAME FILE_ACTION_RENAMED_NEW_NAME ) const ( // wincrypt.h PROV_RSA_FULL = 1 PROV_RSA_SIG = 2 PROV_DSS = 3 PROV_FORTEZZA = 4 PROV_MS_EXCHANGE = 5 PROV_SSL = 6 PROV_RSA_SCHANNEL = 12 PROV_DSS_DH = 13 PROV_EC_ECDSA_SIG = 14 PROV_EC_ECNRA_SIG = 15 PROV_EC_ECDSA_FULL = 16 PROV_EC_ECNRA_FULL = 17 PROV_DH_SCHANNEL = 18 PROV_SPYRUS_LYNKS = 20 PROV_RNG = 21 PROV_INTEL_SEC = 22 PROV_REPLACE_OWF = 23 PROV_RSA_AES = 24 CRYPT_VERIFYCONTEXT = 0xF0000000 CRYPT_NEWKEYSET = 0x00000008 CRYPT_DELETEKEYSET = 0x00000010 CRYPT_MACHINE_KEYSET = 0x00000020 CRYPT_SILENT = 0x00000040 CRYPT_DEFAULT_CONTAINER_OPTIONAL = 0x00000080 USAGE_MATCH_TYPE_AND = 0 USAGE_MATCH_TYPE_OR = 1 X509_ASN_ENCODING = 0x00000001 PKCS_7_ASN_ENCODING = 0x00010000 CERT_STORE_PROV_MEMORY = 2 CERT_STORE_ADD_ALWAYS = 4 CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG = 0x00000004 CERT_TRUST_NO_ERROR = 0x00000000 CERT_TRUST_IS_NOT_TIME_VALID = 0x00000001 CERT_TRUST_IS_REVOKED = 0x00000004 CERT_TRUST_IS_NOT_SIGNATURE_VALID = 0x00000008 CERT_TRUST_IS_NOT_VALID_FOR_USAGE = 0x00000010 CERT_TRUST_IS_UNTRUSTED_ROOT = 0x00000020 CERT_TRUST_REVOCATION_STATUS_UNKNOWN = 0x00000040 CERT_TRUST_IS_CYCLIC = 0x00000080 CERT_TRUST_INVALID_EXTENSION = 0x00000100 CERT_TRUST_INVALID_POLICY_CONSTRAINTS = 0x00000200 CERT_TRUST_INVALID_BASIC_CONSTRAINTS = 0x00000400 CERT_TRUST_INVALID_NAME_CONSTRAINTS = 0x00000800 CERT_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT = 0x00001000 CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT = 0x00002000 CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT = 0x00004000 CERT_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT = 0x00008000 CERT_TRUST_IS_OFFLINE_REVOCATION = 0x01000000 CERT_TRUST_NO_ISSUANCE_CHAIN_POLICY = 0x02000000 CERT_TRUST_IS_EXPLICIT_DISTRUST = 0x04000000 CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT = 0x08000000 CERT_CHAIN_POLICY_BASE = 1 CERT_CHAIN_POLICY_AUTHENTICODE = 2 CERT_CHAIN_POLICY_AUTHENTICODE_TS = 3 CERT_CHAIN_POLICY_SSL = 4 CERT_CHAIN_POLICY_BASIC_CONSTRAINTS = 5 CERT_CHAIN_POLICY_NT_AUTH = 6 CERT_CHAIN_POLICY_MICROSOFT_ROOT = 7 CERT_CHAIN_POLICY_EV = 8 CERT_E_EXPIRED = 0x800B0101 CERT_E_ROLE = 0x800B0103 CERT_E_PURPOSE = 0x800B0106 CERT_E_UNTRUSTEDROOT = 0x800B0109 CERT_E_CN_NO_MATCH = 0x800B010F AUTHTYPE_CLIENT = 1 AUTHTYPE_SERVER = 2 ) var ( OID_PKIX_KP_SERVER_AUTH = []byte("1.3.6.1.5.5.7.3.1\x00") OID_SERVER_GATED_CRYPTO = []byte("1.3.6.1.4.1.311.10.3.3\x00") OID_SGC_NETSCAPE = []byte("2.16.840.1.113730.4.1\x00") ) // Invented values to support what package os expects. type Timeval struct { Sec int32 Usec int32 } func (tv *Timeval) Nanoseconds() int64 { return (int64(tv.Sec)*1e6 + int64(tv.Usec)) * 1e3 } func NsecToTimeval(nsec int64) (tv Timeval) { tv.Sec = int32(nsec / 1e9) tv.Usec = int32(nsec % 1e9 / 1e3) return } type SecurityAttributes struct { Length uint32 SecurityDescriptor uintptr InheritHandle uint32 } type Overlapped struct { Internal uintptr InternalHigh uintptr Offset uint32 OffsetHigh uint32 HEvent Handle } type FileNotifyInformation struct { NextEntryOffset uint32 Action uint32 FileNameLength uint32 FileName uint16 } type Filetime struct { LowDateTime uint32 HighDateTime uint32 } // Nanoseconds returns Filetime ft in nanoseconds // since Epoch (00:00:00 UTC, January 1, 1970). func (ft *Filetime) Nanoseconds() int64 { // 100-nanosecond intervals since January 1, 1601 nsec := int64(ft.HighDateTime)<<32 + int64(ft.LowDateTime) // change starting time to the Epoch (00:00:00 UTC, January 1, 1970) nsec -= 116444736000000000 // convert into nanoseconds nsec *= 100 return nsec } func NsecToFiletime(nsec int64) (ft Filetime) { // convert into 100-nanosecond nsec /= 100 // change starting time to January 1, 1601 nsec += 116444736000000000 // split into high / low ft.LowDateTime = uint32(nsec & 0xffffffff) ft.HighDateTime = uint32(nsec >> 32 & 0xffffffff) return ft } type Win32finddata struct { FileAttributes uint32 CreationTime Filetime LastAccessTime Filetime LastWriteTime Filetime FileSizeHigh uint32 FileSizeLow uint32 Reserved0 uint32 Reserved1 uint32 FileName [MAX_PATH - 1]uint16 AlternateFileName [13]uint16 } // This is the actual system call structure. // Win32finddata is what we committed to in Go 1. type win32finddata1 struct { FileAttributes uint32 CreationTime Filetime LastAccessTime Filetime LastWriteTime Filetime FileSizeHigh uint32 FileSizeLow uint32 Reserved0 uint32 Reserved1 uint32 FileName [MAX_PATH]uint16 AlternateFileName [14]uint16 } func copyFindData(dst *Win32finddata, src *win32finddata1) { dst.FileAttributes = src.FileAttributes dst.CreationTime = src.CreationTime dst.LastAccessTime = src.LastAccessTime dst.LastWriteTime = src.LastWriteTime dst.FileSizeHigh = src.FileSizeHigh dst.FileSizeLow = src.FileSizeLow dst.Reserved0 = src.Reserved0 dst.Reserved1 = src.Reserved1 // The src is 1 element bigger than dst, but it must be NUL. copy(dst.FileName[:], src.FileName[:]) copy(dst.AlternateFileName[:], src.AlternateFileName[:]) } type ByHandleFileInformation struct { FileAttributes uint32 CreationTime Filetime LastAccessTime Filetime LastWriteTime Filetime VolumeSerialNumber uint32 FileSizeHigh uint32 FileSizeLow uint32 NumberOfLinks uint32 FileIndexHigh uint32 FileIndexLow uint32 } const ( GetFileExInfoStandard = 0 GetFileExMaxInfoLevel = 1 ) type Win32FileAttributeData struct { FileAttributes uint32 CreationTime Filetime LastAccessTime Filetime LastWriteTime Filetime FileSizeHigh uint32 FileSizeLow uint32 } // ShowWindow constants const ( // winuser.h SW_HIDE = 0 SW_NORMAL = 1 SW_SHOWNORMAL = 1 SW_SHOWMINIMIZED = 2 SW_SHOWMAXIMIZED = 3 SW_MAXIMIZE = 3 SW_SHOWNOACTIVATE = 4 SW_SHOW = 5 SW_MINIMIZE = 6 SW_SHOWMINNOACTIVE = 7 SW_SHOWNA = 8 SW_RESTORE = 9 SW_SHOWDEFAULT = 10 SW_FORCEMINIMIZE = 11 ) type StartupInfo struct { Cb uint32 _ *uint16 Desktop *uint16 Title *uint16 X uint32 Y uint32 XSize uint32 YSize uint32 XCountChars uint32 YCountChars uint32 FillAttribute uint32 Flags uint32 ShowWindow uint16 _ uint16 _ *byte StdInput Handle StdOutput Handle StdErr Handle } type ProcessInformation struct { Process Handle Thread Handle ProcessId uint32 ThreadId uint32 } type ProcessEntry32 struct { Size uint32 Usage uint32 ProcessID uint32 DefaultHeapID uintptr ModuleID uint32 Threads uint32 ParentProcessID uint32 PriClassBase int32 Flags uint32 ExeFile [MAX_PATH]uint16 } type Systemtime struct { Year uint16 Month uint16 DayOfWeek uint16 Day uint16 Hour uint16 Minute uint16 Second uint16 Milliseconds uint16 } type Timezoneinformation struct { Bias int32 StandardName [32]uint16 StandardDate Systemtime StandardBias int32 DaylightName [32]uint16 DaylightDate Systemtime DaylightBias int32 } // Socket related. const ( AF_UNSPEC = 0 AF_UNIX = 1 AF_INET = 2 AF_INET6 = 23 AF_NETBIOS = 17 SOCK_STREAM = 1 SOCK_DGRAM = 2 SOCK_RAW = 3 SOCK_SEQPACKET = 5 IPPROTO_IP = 0 IPPROTO_IPV6 = 0x29 IPPROTO_TCP = 6 IPPROTO_UDP = 17 SOL_SOCKET = 0xffff SO_REUSEADDR = 4 SO_KEEPALIVE = 8 SO_DONTROUTE = 16 SO_BROADCAST = 32 SO_LINGER = 128 SO_RCVBUF = 0x1002 SO_SNDBUF = 0x1001 SO_UPDATE_ACCEPT_CONTEXT = 0x700b SO_UPDATE_CONNECT_CONTEXT = 0x7010 IOC_OUT = 0x40000000 IOC_IN = 0x80000000 IOC_VENDOR = 0x18000000 IOC_INOUT = IOC_IN | IOC_OUT IOC_WS2 = 0x08000000 SIO_GET_EXTENSION_FUNCTION_POINTER = IOC_INOUT | IOC_WS2 | 6 SIO_KEEPALIVE_VALS = IOC_IN | IOC_VENDOR | 4 SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12 // cf. http://support.microsoft.com/default.aspx?scid=kb;en-us;257460 IP_TOS = 0x3 IP_TTL = 0x4 IP_MULTICAST_IF = 0x9 IP_MULTICAST_TTL = 0xa IP_MULTICAST_LOOP = 0xb IP_ADD_MEMBERSHIP = 0xc IP_DROP_MEMBERSHIP = 0xd IPV6_V6ONLY = 0x1b IPV6_UNICAST_HOPS = 0x4 IPV6_MULTICAST_IF = 0x9 IPV6_MULTICAST_HOPS = 0xa IPV6_MULTICAST_LOOP = 0xb IPV6_JOIN_GROUP = 0xc IPV6_LEAVE_GROUP = 0xd MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_DONTROUTE = 0x4 MSG_WAITALL = 0x8 MSG_TRUNC = 0x0100 MSG_CTRUNC = 0x0200 MSG_BCAST = 0x0400 MSG_MCAST = 0x0800 SOMAXCONN = 0x7fffffff TCP_NODELAY = 1 SHUT_RD = 0 SHUT_WR = 1 SHUT_RDWR = 2 WSADESCRIPTION_LEN = 256 WSASYS_STATUS_LEN = 128 ) type WSABuf struct { Len uint32 Buf *byte } type WSAMsg struct { Name *syscall.RawSockaddrAny Namelen int32 Buffers *WSABuf BufferCount uint32 Control WSABuf Flags uint32 } // Invented values to support what package os expects. const ( S_IFMT = 0x1f000 S_IFIFO = 0x1000 S_IFCHR = 0x2000 S_IFDIR = 0x4000 S_IFBLK = 0x6000 S_IFREG = 0x8000 S_IFLNK = 0xa000 S_IFSOCK = 0xc000 S_ISUID = 0x800 S_ISGID = 0x400 S_ISVTX = 0x200 S_IRUSR = 0x100 S_IWRITE = 0x80 S_IWUSR = 0x80 S_IXUSR = 0x40 ) const ( FILE_TYPE_CHAR = 0x0002 FILE_TYPE_DISK = 0x0001 FILE_TYPE_PIPE = 0x0003 FILE_TYPE_REMOTE = 0x8000 FILE_TYPE_UNKNOWN = 0x0000 ) type Hostent struct { Name *byte Aliases **byte AddrType uint16 Length uint16 AddrList **byte } type Protoent struct { Name *byte Aliases **byte Proto uint16 } const ( DNS_TYPE_A = 0x0001 DNS_TYPE_NS = 0x0002 DNS_TYPE_MD = 0x0003 DNS_TYPE_MF = 0x0004 DNS_TYPE_CNAME = 0x0005 DNS_TYPE_SOA = 0x0006 DNS_TYPE_MB = 0x0007 DNS_TYPE_MG = 0x0008 DNS_TYPE_MR = 0x0009 DNS_TYPE_NULL = 0x000a DNS_TYPE_WKS = 0x000b DNS_TYPE_PTR = 0x000c DNS_TYPE_HINFO = 0x000d DNS_TYPE_MINFO = 0x000e DNS_TYPE_MX = 0x000f DNS_TYPE_TEXT = 0x0010 DNS_TYPE_RP = 0x0011 DNS_TYPE_AFSDB = 0x0012 DNS_TYPE_X25 = 0x0013 DNS_TYPE_ISDN = 0x0014 DNS_TYPE_RT = 0x0015 DNS_TYPE_NSAP = 0x0016 DNS_TYPE_NSAPPTR = 0x0017 DNS_TYPE_SIG = 0x0018 DNS_TYPE_KEY = 0x0019 DNS_TYPE_PX = 0x001a DNS_TYPE_GPOS = 0x001b DNS_TYPE_AAAA = 0x001c DNS_TYPE_LOC = 0x001d DNS_TYPE_NXT = 0x001e DNS_TYPE_EID = 0x001f DNS_TYPE_NIMLOC = 0x0020 DNS_TYPE_SRV = 0x0021 DNS_TYPE_ATMA = 0x0022 DNS_TYPE_NAPTR = 0x0023 DNS_TYPE_KX = 0x0024 DNS_TYPE_CERT = 0x0025 DNS_TYPE_A6 = 0x0026 DNS_TYPE_DNAME = 0x0027 DNS_TYPE_SINK = 0x0028 DNS_TYPE_OPT = 0x0029 DNS_TYPE_DS = 0x002B DNS_TYPE_RRSIG = 0x002E DNS_TYPE_NSEC = 0x002F DNS_TYPE_DNSKEY = 0x0030 DNS_TYPE_DHCID = 0x0031 DNS_TYPE_UINFO = 0x0064 DNS_TYPE_UID = 0x0065 DNS_TYPE_GID = 0x0066 DNS_TYPE_UNSPEC = 0x0067 DNS_TYPE_ADDRS = 0x00f8 DNS_TYPE_TKEY = 0x00f9 DNS_TYPE_TSIG = 0x00fa DNS_TYPE_IXFR = 0x00fb DNS_TYPE_AXFR = 0x00fc DNS_TYPE_MAILB = 0x00fd DNS_TYPE_MAILA = 0x00fe DNS_TYPE_ALL = 0x00ff DNS_TYPE_ANY = 0x00ff DNS_TYPE_WINS = 0xff01 DNS_TYPE_WINSR = 0xff02 DNS_TYPE_NBSTAT = 0xff01 ) const ( DNS_INFO_NO_RECORDS = 0x251D ) const ( // flags inside DNSRecord.Dw DnsSectionQuestion = 0x0000 DnsSectionAnswer = 0x0001 DnsSectionAuthority = 0x0002 DnsSectionAdditional = 0x0003 ) type DNSSRVData struct { Target *uint16 Priority uint16 Weight uint16 Port uint16 Pad uint16 } type DNSPTRData struct { Host *uint16 } type DNSMXData struct { NameExchange *uint16 Preference uint16 Pad uint16 } type DNSTXTData struct { StringCount uint16 StringArray [1]*uint16 } type DNSRecord struct { Next *DNSRecord Name *uint16 Type uint16 Length uint16 Dw uint32 Ttl uint32 Reserved uint32 Data [40]byte } const ( TF_DISCONNECT = 1 TF_REUSE_SOCKET = 2 TF_WRITE_BEHIND = 4 TF_USE_DEFAULT_WORKER = 0 TF_USE_SYSTEM_THREAD = 16 TF_USE_KERNEL_APC = 32 ) type TransmitFileBuffers struct { Head uintptr HeadLength uint32 Tail uintptr TailLength uint32 } const ( IFF_UP = 1 IFF_BROADCAST = 2 IFF_LOOPBACK = 4 IFF_POINTTOPOINT = 8 IFF_MULTICAST = 16 ) const SIO_GET_INTERFACE_LIST = 0x4004747F // TODO(mattn): SockaddrGen is union of sockaddr/sockaddr_in/sockaddr_in6_old. // will be fixed to change variable type as suitable. type SockaddrGen [24]byte type InterfaceInfo struct { Flags uint32 Address SockaddrGen BroadcastAddress SockaddrGen Netmask SockaddrGen } type IpAddressString struct { String [16]byte } type IpMaskString IpAddressString type IpAddrString struct { Next *IpAddrString IpAddress IpAddressString IpMask IpMaskString Context uint32 } const MAX_ADAPTER_NAME_LENGTH = 256 const MAX_ADAPTER_DESCRIPTION_LENGTH = 128 const MAX_ADAPTER_ADDRESS_LENGTH = 8 type IpAdapterInfo struct { Next *IpAdapterInfo ComboIndex uint32 AdapterName [MAX_ADAPTER_NAME_LENGTH + 4]byte Description [MAX_ADAPTER_DESCRIPTION_LENGTH + 4]byte AddressLength uint32 Address [MAX_ADAPTER_ADDRESS_LENGTH]byte Index uint32 Type uint32 DhcpEnabled uint32 CurrentIpAddress *IpAddrString IpAddressList IpAddrString GatewayList IpAddrString DhcpServer IpAddrString HaveWins bool PrimaryWinsServer IpAddrString SecondaryWinsServer IpAddrString LeaseObtained int64 LeaseExpires int64 } const MAXLEN_PHYSADDR = 8 const MAX_INTERFACE_NAME_LEN = 256 const MAXLEN_IFDESCR = 256 type MibIfRow struct { Name [MAX_INTERFACE_NAME_LEN]uint16 Index uint32 Type uint32 Mtu uint32 Speed uint32 PhysAddrLen uint32 PhysAddr [MAXLEN_PHYSADDR]byte AdminStatus uint32 OperStatus uint32 LastChange uint32 InOctets uint32 InUcastPkts uint32 InNUcastPkts uint32 InDiscards uint32 InErrors uint32 InUnknownProtos uint32 OutOctets uint32 OutUcastPkts uint32 OutNUcastPkts uint32 OutDiscards uint32 OutErrors uint32 OutQLen uint32 DescrLen uint32 Descr [MAXLEN_IFDESCR]byte } type CertContext struct { EncodingType uint32 EncodedCert *byte Length uint32 CertInfo uintptr Store Handle } type CertChainContext struct { Size uint32 TrustStatus CertTrustStatus ChainCount uint32 Chains **CertSimpleChain LowerQualityChainCount uint32 LowerQualityChains **CertChainContext HasRevocationFreshnessTime uint32 RevocationFreshnessTime uint32 } type CertSimpleChain struct { Size uint32 TrustStatus CertTrustStatus NumElements uint32 Elements **CertChainElement TrustListInfo uintptr HasRevocationFreshnessTime uint32 RevocationFreshnessTime uint32 } type CertChainElement struct { Size uint32 CertContext *CertContext TrustStatus CertTrustStatus RevocationInfo *CertRevocationInfo IssuanceUsage *CertEnhKeyUsage ApplicationUsage *CertEnhKeyUsage ExtendedErrorInfo *uint16 } type CertRevocationInfo struct { Size uint32 RevocationResult uint32 RevocationOid *byte OidSpecificInfo uintptr HasFreshnessTime uint32 FreshnessTime uint32 CrlInfo uintptr // *CertRevocationCrlInfo } type CertTrustStatus struct { ErrorStatus uint32 InfoStatus uint32 } type CertUsageMatch struct { Type uint32 Usage CertEnhKeyUsage } type CertEnhKeyUsage struct { Length uint32 UsageIdentifiers **byte } type CertChainPara struct { Size uint32 RequestedUsage CertUsageMatch RequstedIssuancePolicy CertUsageMatch URLRetrievalTimeout uint32 CheckRevocationFreshnessTime uint32 RevocationFreshnessTime uint32 CacheResync *Filetime } type CertChainPolicyPara struct { Size uint32 Flags uint32 ExtraPolicyPara uintptr } type SSLExtraCertChainPolicyPara struct { Size uint32 AuthType uint32 Checks uint32 ServerName *uint16 } type CertChainPolicyStatus struct { Size uint32 Error uint32 ChainIndex uint32 ElementIndex uint32 ExtraPolicyStatus uintptr } const ( // do not reorder HKEY_CLASSES_ROOT = 0x80000000 + iota HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS HKEY_PERFORMANCE_DATA HKEY_CURRENT_CONFIG HKEY_DYN_DATA KEY_QUERY_VALUE = 1 KEY_SET_VALUE = 2 KEY_CREATE_SUB_KEY = 4 KEY_ENUMERATE_SUB_KEYS = 8 KEY_NOTIFY = 16 KEY_CREATE_LINK = 32 KEY_WRITE = 0x20006 KEY_EXECUTE = 0x20019 KEY_READ = 0x20019 KEY_WOW64_64KEY = 0x0100 KEY_WOW64_32KEY = 0x0200 KEY_ALL_ACCESS = 0xf003f ) const ( // do not reorder REG_NONE = iota REG_SZ REG_EXPAND_SZ REG_BINARY REG_DWORD_LITTLE_ENDIAN REG_DWORD_BIG_ENDIAN REG_LINK REG_MULTI_SZ REG_RESOURCE_LIST REG_FULL_RESOURCE_DESCRIPTOR REG_RESOURCE_REQUIREMENTS_LIST REG_QWORD_LITTLE_ENDIAN REG_DWORD = REG_DWORD_LITTLE_ENDIAN REG_QWORD = REG_QWORD_LITTLE_ENDIAN ) type AddrinfoW struct { Flags int32 Family int32 Socktype int32 Protocol int32 Addrlen uintptr Canonname *uint16 Addr uintptr Next *AddrinfoW } const ( AI_PASSIVE = 1 AI_CANONNAME = 2 AI_NUMERICHOST = 4 ) type GUID struct { Data1 uint32 Data2 uint16 Data3 uint16 Data4 [8]byte } var WSAID_CONNECTEX = GUID{ 0x25a207b9, 0xddf3, 0x4660, [8]byte{0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e}, } var WSAID_WSASENDMSG = GUID{ 0xa441e712, 0x754f, 0x43ca, [8]byte{0x84, 0xa7, 0x0d, 0xee, 0x44, 0xcf, 0x60, 0x6d}, } var WSAID_WSARECVMSG = GUID{ 0xf689d7c8, 0x6f1f, 0x436b, [8]byte{0x8a, 0x53, 0xe5, 0x4f, 0xe3, 0x51, 0xc3, 0x22}, } const ( FILE_SKIP_COMPLETION_PORT_ON_SUCCESS = 1 FILE_SKIP_SET_EVENT_ON_HANDLE = 2 ) const ( WSAPROTOCOL_LEN = 255 MAX_PROTOCOL_CHAIN = 7 BASE_PROTOCOL = 1 LAYERED_PROTOCOL = 0 XP1_CONNECTIONLESS = 0x00000001 XP1_GUARANTEED_DELIVERY = 0x00000002 XP1_GUARANTEED_ORDER = 0x00000004 XP1_MESSAGE_ORIENTED = 0x00000008 XP1_PSEUDO_STREAM = 0x00000010 XP1_GRACEFUL_CLOSE = 0x00000020 XP1_EXPEDITED_DATA = 0x00000040 XP1_CONNECT_DATA = 0x00000080 XP1_DISCONNECT_DATA = 0x00000100 XP1_SUPPORT_BROADCAST = 0x00000200 XP1_SUPPORT_MULTIPOINT = 0x00000400 XP1_MULTIPOINT_CONTROL_PLANE = 0x00000800 XP1_MULTIPOINT_DATA_PLANE = 0x00001000 XP1_QOS_SUPPORTED = 0x00002000 XP1_UNI_SEND = 0x00008000 XP1_UNI_RECV = 0x00010000 XP1_IFS_HANDLES = 0x00020000 XP1_PARTIAL_MESSAGE = 0x00040000 XP1_SAN_SUPPORT_SDP = 0x00080000 PFL_MULTIPLE_PROTO_ENTRIES = 0x00000001 PFL_RECOMMENDED_PROTO_ENTRY = 0x00000002 PFL_HIDDEN = 0x00000004 PFL_MATCHES_PROTOCOL_ZERO = 0x00000008 PFL_NETWORKDIRECT_PROVIDER = 0x00000010 ) type WSAProtocolInfo struct { ServiceFlags1 uint32 ServiceFlags2 uint32 ServiceFlags3 uint32 ServiceFlags4 uint32 ProviderFlags uint32 ProviderId GUID CatalogEntryId uint32 ProtocolChain WSAProtocolChain Version int32 AddressFamily int32 MaxSockAddr int32 MinSockAddr int32 SocketType int32 Protocol int32 ProtocolMaxOffset int32 NetworkByteOrder int32 SecurityScheme int32 MessageSize uint32 ProviderReserved uint32 ProtocolName [WSAPROTOCOL_LEN + 1]uint16 } type WSAProtocolChain struct { ChainLen int32 ChainEntries [MAX_PROTOCOL_CHAIN]uint32 } type TCPKeepalive struct { OnOff uint32 Time uint32 Interval uint32 } type symbolicLinkReparseBuffer struct { SubstituteNameOffset uint16 SubstituteNameLength uint16 PrintNameOffset uint16 PrintNameLength uint16 Flags uint32 PathBuffer [1]uint16 } type mountPointReparseBuffer struct { SubstituteNameOffset uint16 SubstituteNameLength uint16 PrintNameOffset uint16 PrintNameLength uint16 PathBuffer [1]uint16 } type reparseDataBuffer struct { ReparseTag uint32 ReparseDataLength uint16 Reserved uint16 // GenericReparseBuffer reparseBuffer byte } const ( FSCTL_GET_REPARSE_POINT = 0x900A8 MAXIMUM_REPARSE_DATA_BUFFER_SIZE = 16 * 1024 IO_REPARSE_TAG_MOUNT_POINT = 0xA0000003 IO_REPARSE_TAG_SYMLINK = 0xA000000C SYMBOLIC_LINK_FLAG_DIRECTORY = 0x1 ) const ( ComputerNameNetBIOS = 0 ComputerNameDnsHostname = 1 ComputerNameDnsDomain = 2 ComputerNameDnsFullyQualified = 3 ComputerNamePhysicalNetBIOS = 4 ComputerNamePhysicalDnsHostname = 5 ComputerNamePhysicalDnsDomain = 6 ComputerNamePhysicalDnsFullyQualified = 7 ComputerNameMax = 8 ) const ( MOVEFILE_REPLACE_EXISTING = 0x1 MOVEFILE_COPY_ALLOWED = 0x2 MOVEFILE_DELAY_UNTIL_REBOOT = 0x4 MOVEFILE_WRITE_THROUGH = 0x8 MOVEFILE_CREATE_HARDLINK = 0x10 MOVEFILE_FAIL_IF_NOT_TRACKABLE = 0x20 ) const GAA_FLAG_INCLUDE_PREFIX = 0x00000010 const ( IF_TYPE_OTHER = 1 IF_TYPE_ETHERNET_CSMACD = 6 IF_TYPE_ISO88025_TOKENRING = 9 IF_TYPE_PPP = 23 IF_TYPE_SOFTWARE_LOOPBACK = 24 IF_TYPE_ATM = 37 IF_TYPE_IEEE80211 = 71 IF_TYPE_TUNNEL = 131 IF_TYPE_IEEE1394 = 144 ) type SocketAddress struct { Sockaddr *syscall.RawSockaddrAny SockaddrLength int32 } type IpAdapterUnicastAddress struct { Length uint32 Flags uint32 Next *IpAdapterUnicastAddress Address SocketAddress PrefixOrigin int32 SuffixOrigin int32 DadState int32 ValidLifetime uint32 PreferredLifetime uint32 LeaseLifetime uint32 OnLinkPrefixLength uint8 } type IpAdapterAnycastAddress struct { Length uint32 Flags uint32 Next *IpAdapterAnycastAddress Address SocketAddress } type IpAdapterMulticastAddress struct { Length uint32 Flags uint32 Next *IpAdapterMulticastAddress Address SocketAddress } type IpAdapterDnsServerAdapter struct { Length uint32 Reserved uint32 Next *IpAdapterDnsServerAdapter Address SocketAddress } type IpAdapterPrefix struct { Length uint32 Flags uint32 Next *IpAdapterPrefix Address SocketAddress PrefixLength uint32 } type IpAdapterAddresses struct { Length uint32 IfIndex uint32 Next *IpAdapterAddresses AdapterName *byte FirstUnicastAddress *IpAdapterUnicastAddress FirstAnycastAddress *IpAdapterAnycastAddress FirstMulticastAddress *IpAdapterMulticastAddress FirstDnsServerAddress *IpAdapterDnsServerAdapter DnsSuffix *uint16 Description *uint16 FriendlyName *uint16 PhysicalAddress [syscall.MAX_ADAPTER_ADDRESS_LENGTH]byte PhysicalAddressLength uint32 Flags uint32 Mtu uint32 IfType uint32 OperStatus uint32 Ipv6IfIndex uint32 ZoneIndices [16]uint32 FirstPrefix *IpAdapterPrefix /* more fields might be present here. */ } const ( IfOperStatusUp = 1 IfOperStatusDown = 2 IfOperStatusTesting = 3 IfOperStatusUnknown = 4 IfOperStatusDormant = 5 IfOperStatusNotPresent = 6 IfOperStatusLowerLayerDown = 7 ) // Console related constants used for the mode parameter to SetConsoleMode. See // https://docs.microsoft.com/en-us/windows/console/setconsolemode for details. const ( ENABLE_PROCESSED_INPUT = 0x1 ENABLE_LINE_INPUT = 0x2 ENABLE_ECHO_INPUT = 0x4 ENABLE_WINDOW_INPUT = 0x8 ENABLE_MOUSE_INPUT = 0x10 ENABLE_INSERT_MODE = 0x20 ENABLE_QUICK_EDIT_MODE = 0x40 ENABLE_EXTENDED_FLAGS = 0x80 ENABLE_AUTO_POSITION = 0x100 ENABLE_VIRTUAL_TERMINAL_INPUT = 0x200 ENABLE_PROCESSED_OUTPUT = 0x1 ENABLE_WRAP_AT_EOL_OUTPUT = 0x2 ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x4 DISABLE_NEWLINE_AUTO_RETURN = 0x8 ENABLE_LVB_GRID_WORLDWIDE = 0x10 ) type Coord struct { X int16 Y int16 } type SmallRect struct { Left int16 Top int16 Right int16 Bottom int16 } // Used with GetConsoleScreenBuffer to retreive information about a console // screen buffer. See // https://docs.microsoft.com/en-us/windows/console/console-screen-buffer-info-str // for details. type ConsoleScreenBufferInfo struct { Size Coord CursorPosition Coord Attributes uint16 Window SmallRect MaximumWindowSize Coord } ================================================ FILE: vendor/golang.org/x/sys/windows/types_windows_386.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package windows type WSAData struct { Version uint16 HighVersion uint16 Description [WSADESCRIPTION_LEN + 1]byte SystemStatus [WSASYS_STATUS_LEN + 1]byte MaxSockets uint16 MaxUdpDg uint16 VendorInfo *byte } type Servent struct { Name *byte Aliases **byte Port uint16 Proto *byte } ================================================ FILE: vendor/golang.org/x/sys/windows/types_windows_amd64.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package windows type WSAData struct { Version uint16 HighVersion uint16 MaxSockets uint16 MaxUdpDg uint16 VendorInfo *byte Description [WSADESCRIPTION_LEN + 1]byte SystemStatus [WSASYS_STATUS_LEN + 1]byte } type Servent struct { Name *byte Aliases **byte Proto *byte Port uint16 } ================================================ FILE: vendor/golang.org/x/sys/windows/zsyscall_windows.go ================================================ // MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT package windows import ( "syscall" "unsafe" ) var _ unsafe.Pointer // Do the interface allocations only once for common // Errno values. const ( errnoERROR_IO_PENDING = 997 ) var ( errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) ) // errnoErr returns common boxed Errno values, to prevent // allocations at runtime. func errnoErr(e syscall.Errno) error { switch e { case 0: return nil case errnoERROR_IO_PENDING: return errERROR_IO_PENDING } // TODO: add more here, after collecting data on the common // error values see on Windows. (perhaps when running // all.bat?) return e } var ( modadvapi32 = NewLazySystemDLL("advapi32.dll") modkernel32 = NewLazySystemDLL("kernel32.dll") modshell32 = NewLazySystemDLL("shell32.dll") modmswsock = NewLazySystemDLL("mswsock.dll") modcrypt32 = NewLazySystemDLL("crypt32.dll") modws2_32 = NewLazySystemDLL("ws2_32.dll") moddnsapi = NewLazySystemDLL("dnsapi.dll") modiphlpapi = NewLazySystemDLL("iphlpapi.dll") modsecur32 = NewLazySystemDLL("secur32.dll") modnetapi32 = NewLazySystemDLL("netapi32.dll") moduserenv = NewLazySystemDLL("userenv.dll") procRegisterEventSourceW = modadvapi32.NewProc("RegisterEventSourceW") procDeregisterEventSource = modadvapi32.NewProc("DeregisterEventSource") procReportEventW = modadvapi32.NewProc("ReportEventW") procOpenSCManagerW = modadvapi32.NewProc("OpenSCManagerW") procCloseServiceHandle = modadvapi32.NewProc("CloseServiceHandle") procCreateServiceW = modadvapi32.NewProc("CreateServiceW") procOpenServiceW = modadvapi32.NewProc("OpenServiceW") procDeleteService = modadvapi32.NewProc("DeleteService") procStartServiceW = modadvapi32.NewProc("StartServiceW") procQueryServiceStatus = modadvapi32.NewProc("QueryServiceStatus") procControlService = modadvapi32.NewProc("ControlService") procStartServiceCtrlDispatcherW = modadvapi32.NewProc("StartServiceCtrlDispatcherW") procSetServiceStatus = modadvapi32.NewProc("SetServiceStatus") procChangeServiceConfigW = modadvapi32.NewProc("ChangeServiceConfigW") procQueryServiceConfigW = modadvapi32.NewProc("QueryServiceConfigW") procChangeServiceConfig2W = modadvapi32.NewProc("ChangeServiceConfig2W") procQueryServiceConfig2W = modadvapi32.NewProc("QueryServiceConfig2W") procEnumServicesStatusExW = modadvapi32.NewProc("EnumServicesStatusExW") procGetLastError = modkernel32.NewProc("GetLastError") procLoadLibraryW = modkernel32.NewProc("LoadLibraryW") procLoadLibraryExW = modkernel32.NewProc("LoadLibraryExW") procFreeLibrary = modkernel32.NewProc("FreeLibrary") procGetProcAddress = modkernel32.NewProc("GetProcAddress") procGetVersion = modkernel32.NewProc("GetVersion") procFormatMessageW = modkernel32.NewProc("FormatMessageW") procExitProcess = modkernel32.NewProc("ExitProcess") procCreateFileW = modkernel32.NewProc("CreateFileW") procReadFile = modkernel32.NewProc("ReadFile") procWriteFile = modkernel32.NewProc("WriteFile") procSetFilePointer = modkernel32.NewProc("SetFilePointer") procCloseHandle = modkernel32.NewProc("CloseHandle") procGetStdHandle = modkernel32.NewProc("GetStdHandle") procSetStdHandle = modkernel32.NewProc("SetStdHandle") procFindFirstFileW = modkernel32.NewProc("FindFirstFileW") procFindNextFileW = modkernel32.NewProc("FindNextFileW") procFindClose = modkernel32.NewProc("FindClose") procGetFileInformationByHandle = modkernel32.NewProc("GetFileInformationByHandle") procGetCurrentDirectoryW = modkernel32.NewProc("GetCurrentDirectoryW") procSetCurrentDirectoryW = modkernel32.NewProc("SetCurrentDirectoryW") procCreateDirectoryW = modkernel32.NewProc("CreateDirectoryW") procRemoveDirectoryW = modkernel32.NewProc("RemoveDirectoryW") procDeleteFileW = modkernel32.NewProc("DeleteFileW") procMoveFileW = modkernel32.NewProc("MoveFileW") procMoveFileExW = modkernel32.NewProc("MoveFileExW") procGetComputerNameW = modkernel32.NewProc("GetComputerNameW") procGetComputerNameExW = modkernel32.NewProc("GetComputerNameExW") procSetEndOfFile = modkernel32.NewProc("SetEndOfFile") procGetSystemTimeAsFileTime = modkernel32.NewProc("GetSystemTimeAsFileTime") procGetSystemTimePreciseAsFileTime = modkernel32.NewProc("GetSystemTimePreciseAsFileTime") procGetTimeZoneInformation = modkernel32.NewProc("GetTimeZoneInformation") procCreateIoCompletionPort = modkernel32.NewProc("CreateIoCompletionPort") procGetQueuedCompletionStatus = modkernel32.NewProc("GetQueuedCompletionStatus") procPostQueuedCompletionStatus = modkernel32.NewProc("PostQueuedCompletionStatus") procCancelIo = modkernel32.NewProc("CancelIo") procCancelIoEx = modkernel32.NewProc("CancelIoEx") procCreateProcessW = modkernel32.NewProc("CreateProcessW") procOpenProcess = modkernel32.NewProc("OpenProcess") procTerminateProcess = modkernel32.NewProc("TerminateProcess") procGetExitCodeProcess = modkernel32.NewProc("GetExitCodeProcess") procGetStartupInfoW = modkernel32.NewProc("GetStartupInfoW") procGetCurrentProcess = modkernel32.NewProc("GetCurrentProcess") procGetProcessTimes = modkernel32.NewProc("GetProcessTimes") procDuplicateHandle = modkernel32.NewProc("DuplicateHandle") procWaitForSingleObject = modkernel32.NewProc("WaitForSingleObject") procGetTempPathW = modkernel32.NewProc("GetTempPathW") procCreatePipe = modkernel32.NewProc("CreatePipe") procGetFileType = modkernel32.NewProc("GetFileType") procCryptAcquireContextW = modadvapi32.NewProc("CryptAcquireContextW") procCryptReleaseContext = modadvapi32.NewProc("CryptReleaseContext") procCryptGenRandom = modadvapi32.NewProc("CryptGenRandom") procGetEnvironmentStringsW = modkernel32.NewProc("GetEnvironmentStringsW") procFreeEnvironmentStringsW = modkernel32.NewProc("FreeEnvironmentStringsW") procGetEnvironmentVariableW = modkernel32.NewProc("GetEnvironmentVariableW") procSetEnvironmentVariableW = modkernel32.NewProc("SetEnvironmentVariableW") procSetFileTime = modkernel32.NewProc("SetFileTime") procGetFileAttributesW = modkernel32.NewProc("GetFileAttributesW") procSetFileAttributesW = modkernel32.NewProc("SetFileAttributesW") procGetFileAttributesExW = modkernel32.NewProc("GetFileAttributesExW") procGetCommandLineW = modkernel32.NewProc("GetCommandLineW") procCommandLineToArgvW = modshell32.NewProc("CommandLineToArgvW") procLocalFree = modkernel32.NewProc("LocalFree") procSetHandleInformation = modkernel32.NewProc("SetHandleInformation") procFlushFileBuffers = modkernel32.NewProc("FlushFileBuffers") procGetFullPathNameW = modkernel32.NewProc("GetFullPathNameW") procGetLongPathNameW = modkernel32.NewProc("GetLongPathNameW") procGetShortPathNameW = modkernel32.NewProc("GetShortPathNameW") procCreateFileMappingW = modkernel32.NewProc("CreateFileMappingW") procMapViewOfFile = modkernel32.NewProc("MapViewOfFile") procUnmapViewOfFile = modkernel32.NewProc("UnmapViewOfFile") procFlushViewOfFile = modkernel32.NewProc("FlushViewOfFile") procVirtualLock = modkernel32.NewProc("VirtualLock") procVirtualUnlock = modkernel32.NewProc("VirtualUnlock") procVirtualAlloc = modkernel32.NewProc("VirtualAlloc") procVirtualFree = modkernel32.NewProc("VirtualFree") procVirtualProtect = modkernel32.NewProc("VirtualProtect") procTransmitFile = modmswsock.NewProc("TransmitFile") procReadDirectoryChangesW = modkernel32.NewProc("ReadDirectoryChangesW") procCertOpenSystemStoreW = modcrypt32.NewProc("CertOpenSystemStoreW") procCertOpenStore = modcrypt32.NewProc("CertOpenStore") procCertEnumCertificatesInStore = modcrypt32.NewProc("CertEnumCertificatesInStore") procCertAddCertificateContextToStore = modcrypt32.NewProc("CertAddCertificateContextToStore") procCertCloseStore = modcrypt32.NewProc("CertCloseStore") procCertGetCertificateChain = modcrypt32.NewProc("CertGetCertificateChain") procCertFreeCertificateChain = modcrypt32.NewProc("CertFreeCertificateChain") procCertCreateCertificateContext = modcrypt32.NewProc("CertCreateCertificateContext") procCertFreeCertificateContext = modcrypt32.NewProc("CertFreeCertificateContext") procCertVerifyCertificateChainPolicy = modcrypt32.NewProc("CertVerifyCertificateChainPolicy") procRegOpenKeyExW = modadvapi32.NewProc("RegOpenKeyExW") procRegCloseKey = modadvapi32.NewProc("RegCloseKey") procRegQueryInfoKeyW = modadvapi32.NewProc("RegQueryInfoKeyW") procRegEnumKeyExW = modadvapi32.NewProc("RegEnumKeyExW") procRegQueryValueExW = modadvapi32.NewProc("RegQueryValueExW") procGetCurrentProcessId = modkernel32.NewProc("GetCurrentProcessId") procGetConsoleMode = modkernel32.NewProc("GetConsoleMode") procSetConsoleMode = modkernel32.NewProc("SetConsoleMode") procGetConsoleScreenBufferInfo = modkernel32.NewProc("GetConsoleScreenBufferInfo") procWriteConsoleW = modkernel32.NewProc("WriteConsoleW") procReadConsoleW = modkernel32.NewProc("ReadConsoleW") procCreateToolhelp32Snapshot = modkernel32.NewProc("CreateToolhelp32Snapshot") procProcess32FirstW = modkernel32.NewProc("Process32FirstW") procProcess32NextW = modkernel32.NewProc("Process32NextW") procDeviceIoControl = modkernel32.NewProc("DeviceIoControl") procCreateSymbolicLinkW = modkernel32.NewProc("CreateSymbolicLinkW") procCreateHardLinkW = modkernel32.NewProc("CreateHardLinkW") procGetCurrentThreadId = modkernel32.NewProc("GetCurrentThreadId") procCreateEventW = modkernel32.NewProc("CreateEventW") procCreateEventExW = modkernel32.NewProc("CreateEventExW") procOpenEventW = modkernel32.NewProc("OpenEventW") procSetEvent = modkernel32.NewProc("SetEvent") procResetEvent = modkernel32.NewProc("ResetEvent") procPulseEvent = modkernel32.NewProc("PulseEvent") procWSAStartup = modws2_32.NewProc("WSAStartup") procWSACleanup = modws2_32.NewProc("WSACleanup") procWSAIoctl = modws2_32.NewProc("WSAIoctl") procsocket = modws2_32.NewProc("socket") procsetsockopt = modws2_32.NewProc("setsockopt") procgetsockopt = modws2_32.NewProc("getsockopt") procbind = modws2_32.NewProc("bind") procconnect = modws2_32.NewProc("connect") procgetsockname = modws2_32.NewProc("getsockname") procgetpeername = modws2_32.NewProc("getpeername") proclisten = modws2_32.NewProc("listen") procshutdown = modws2_32.NewProc("shutdown") procclosesocket = modws2_32.NewProc("closesocket") procAcceptEx = modmswsock.NewProc("AcceptEx") procGetAcceptExSockaddrs = modmswsock.NewProc("GetAcceptExSockaddrs") procWSARecv = modws2_32.NewProc("WSARecv") procWSASend = modws2_32.NewProc("WSASend") procWSARecvFrom = modws2_32.NewProc("WSARecvFrom") procWSASendTo = modws2_32.NewProc("WSASendTo") procgethostbyname = modws2_32.NewProc("gethostbyname") procgetservbyname = modws2_32.NewProc("getservbyname") procntohs = modws2_32.NewProc("ntohs") procgetprotobyname = modws2_32.NewProc("getprotobyname") procDnsQuery_W = moddnsapi.NewProc("DnsQuery_W") procDnsRecordListFree = moddnsapi.NewProc("DnsRecordListFree") procDnsNameCompare_W = moddnsapi.NewProc("DnsNameCompare_W") procGetAddrInfoW = modws2_32.NewProc("GetAddrInfoW") procFreeAddrInfoW = modws2_32.NewProc("FreeAddrInfoW") procGetIfEntry = modiphlpapi.NewProc("GetIfEntry") procGetAdaptersInfo = modiphlpapi.NewProc("GetAdaptersInfo") procSetFileCompletionNotificationModes = modkernel32.NewProc("SetFileCompletionNotificationModes") procWSAEnumProtocolsW = modws2_32.NewProc("WSAEnumProtocolsW") procGetAdaptersAddresses = modiphlpapi.NewProc("GetAdaptersAddresses") procGetACP = modkernel32.NewProc("GetACP") procMultiByteToWideChar = modkernel32.NewProc("MultiByteToWideChar") procTranslateNameW = modsecur32.NewProc("TranslateNameW") procGetUserNameExW = modsecur32.NewProc("GetUserNameExW") procNetUserGetInfo = modnetapi32.NewProc("NetUserGetInfo") procNetGetJoinInformation = modnetapi32.NewProc("NetGetJoinInformation") procNetApiBufferFree = modnetapi32.NewProc("NetApiBufferFree") procLookupAccountSidW = modadvapi32.NewProc("LookupAccountSidW") procLookupAccountNameW = modadvapi32.NewProc("LookupAccountNameW") procConvertSidToStringSidW = modadvapi32.NewProc("ConvertSidToStringSidW") procConvertStringSidToSidW = modadvapi32.NewProc("ConvertStringSidToSidW") procGetLengthSid = modadvapi32.NewProc("GetLengthSid") procCopySid = modadvapi32.NewProc("CopySid") procAllocateAndInitializeSid = modadvapi32.NewProc("AllocateAndInitializeSid") procFreeSid = modadvapi32.NewProc("FreeSid") procEqualSid = modadvapi32.NewProc("EqualSid") procOpenProcessToken = modadvapi32.NewProc("OpenProcessToken") procGetTokenInformation = modadvapi32.NewProc("GetTokenInformation") procGetUserProfileDirectoryW = moduserenv.NewProc("GetUserProfileDirectoryW") ) func RegisterEventSource(uncServerName *uint16, sourceName *uint16) (handle Handle, err error) { r0, _, e1 := syscall.Syscall(procRegisterEventSourceW.Addr(), 2, uintptr(unsafe.Pointer(uncServerName)), uintptr(unsafe.Pointer(sourceName)), 0) handle = Handle(r0) if handle == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func DeregisterEventSource(handle Handle) (err error) { r1, _, e1 := syscall.Syscall(procDeregisterEventSource.Addr(), 1, uintptr(handle), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func ReportEvent(log Handle, etype uint16, category uint16, eventId uint32, usrSId uintptr, numStrings uint16, dataSize uint32, strings **uint16, rawData *byte) (err error) { r1, _, e1 := syscall.Syscall9(procReportEventW.Addr(), 9, uintptr(log), uintptr(etype), uintptr(category), uintptr(eventId), uintptr(usrSId), uintptr(numStrings), uintptr(dataSize), uintptr(unsafe.Pointer(strings)), uintptr(unsafe.Pointer(rawData))) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func OpenSCManager(machineName *uint16, databaseName *uint16, access uint32) (handle Handle, err error) { r0, _, e1 := syscall.Syscall(procOpenSCManagerW.Addr(), 3, uintptr(unsafe.Pointer(machineName)), uintptr(unsafe.Pointer(databaseName)), uintptr(access)) handle = Handle(r0) if handle == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func CloseServiceHandle(handle Handle) (err error) { r1, _, e1 := syscall.Syscall(procCloseServiceHandle.Addr(), 1, uintptr(handle), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func CreateService(mgr Handle, serviceName *uint16, displayName *uint16, access uint32, srvType uint32, startType uint32, errCtl uint32, pathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16) (handle Handle, err error) { r0, _, e1 := syscall.Syscall15(procCreateServiceW.Addr(), 13, uintptr(mgr), uintptr(unsafe.Pointer(serviceName)), uintptr(unsafe.Pointer(displayName)), uintptr(access), uintptr(srvType), uintptr(startType), uintptr(errCtl), uintptr(unsafe.Pointer(pathName)), uintptr(unsafe.Pointer(loadOrderGroup)), uintptr(unsafe.Pointer(tagId)), uintptr(unsafe.Pointer(dependencies)), uintptr(unsafe.Pointer(serviceStartName)), uintptr(unsafe.Pointer(password)), 0, 0) handle = Handle(r0) if handle == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func OpenService(mgr Handle, serviceName *uint16, access uint32) (handle Handle, err error) { r0, _, e1 := syscall.Syscall(procOpenServiceW.Addr(), 3, uintptr(mgr), uintptr(unsafe.Pointer(serviceName)), uintptr(access)) handle = Handle(r0) if handle == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func DeleteService(service Handle) (err error) { r1, _, e1 := syscall.Syscall(procDeleteService.Addr(), 1, uintptr(service), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func StartService(service Handle, numArgs uint32, argVectors **uint16) (err error) { r1, _, e1 := syscall.Syscall(procStartServiceW.Addr(), 3, uintptr(service), uintptr(numArgs), uintptr(unsafe.Pointer(argVectors))) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func QueryServiceStatus(service Handle, status *SERVICE_STATUS) (err error) { r1, _, e1 := syscall.Syscall(procQueryServiceStatus.Addr(), 2, uintptr(service), uintptr(unsafe.Pointer(status)), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func ControlService(service Handle, control uint32, status *SERVICE_STATUS) (err error) { r1, _, e1 := syscall.Syscall(procControlService.Addr(), 3, uintptr(service), uintptr(control), uintptr(unsafe.Pointer(status))) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func StartServiceCtrlDispatcher(serviceTable *SERVICE_TABLE_ENTRY) (err error) { r1, _, e1 := syscall.Syscall(procStartServiceCtrlDispatcherW.Addr(), 1, uintptr(unsafe.Pointer(serviceTable)), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func SetServiceStatus(service Handle, serviceStatus *SERVICE_STATUS) (err error) { r1, _, e1 := syscall.Syscall(procSetServiceStatus.Addr(), 2, uintptr(service), uintptr(unsafe.Pointer(serviceStatus)), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func ChangeServiceConfig(service Handle, serviceType uint32, startType uint32, errorControl uint32, binaryPathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16, displayName *uint16) (err error) { r1, _, e1 := syscall.Syscall12(procChangeServiceConfigW.Addr(), 11, uintptr(service), uintptr(serviceType), uintptr(startType), uintptr(errorControl), uintptr(unsafe.Pointer(binaryPathName)), uintptr(unsafe.Pointer(loadOrderGroup)), uintptr(unsafe.Pointer(tagId)), uintptr(unsafe.Pointer(dependencies)), uintptr(unsafe.Pointer(serviceStartName)), uintptr(unsafe.Pointer(password)), uintptr(unsafe.Pointer(displayName)), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func QueryServiceConfig(service Handle, serviceConfig *QUERY_SERVICE_CONFIG, bufSize uint32, bytesNeeded *uint32) (err error) { r1, _, e1 := syscall.Syscall6(procQueryServiceConfigW.Addr(), 4, uintptr(service), uintptr(unsafe.Pointer(serviceConfig)), uintptr(bufSize), uintptr(unsafe.Pointer(bytesNeeded)), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func ChangeServiceConfig2(service Handle, infoLevel uint32, info *byte) (err error) { r1, _, e1 := syscall.Syscall(procChangeServiceConfig2W.Addr(), 3, uintptr(service), uintptr(infoLevel), uintptr(unsafe.Pointer(info))) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func QueryServiceConfig2(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) { r1, _, e1 := syscall.Syscall6(procQueryServiceConfig2W.Addr(), 5, uintptr(service), uintptr(infoLevel), uintptr(unsafe.Pointer(buff)), uintptr(buffSize), uintptr(unsafe.Pointer(bytesNeeded)), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func EnumServicesStatusEx(mgr Handle, infoLevel uint32, serviceType uint32, serviceState uint32, services *byte, bufSize uint32, bytesNeeded *uint32, servicesReturned *uint32, resumeHandle *uint32, groupName *uint16) (err error) { r1, _, e1 := syscall.Syscall12(procEnumServicesStatusExW.Addr(), 10, uintptr(mgr), uintptr(infoLevel), uintptr(serviceType), uintptr(serviceState), uintptr(unsafe.Pointer(services)), uintptr(bufSize), uintptr(unsafe.Pointer(bytesNeeded)), uintptr(unsafe.Pointer(servicesReturned)), uintptr(unsafe.Pointer(resumeHandle)), uintptr(unsafe.Pointer(groupName)), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetLastError() (lasterr error) { r0, _, _ := syscall.Syscall(procGetLastError.Addr(), 0, 0, 0, 0) if r0 != 0 { lasterr = syscall.Errno(r0) } return } func LoadLibrary(libname string) (handle Handle, err error) { var _p0 *uint16 _p0, err = syscall.UTF16PtrFromString(libname) if err != nil { return } return _LoadLibrary(_p0) } func _LoadLibrary(libname *uint16) (handle Handle, err error) { r0, _, e1 := syscall.Syscall(procLoadLibraryW.Addr(), 1, uintptr(unsafe.Pointer(libname)), 0, 0) handle = Handle(r0) if handle == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func LoadLibraryEx(libname string, zero Handle, flags uintptr) (handle Handle, err error) { var _p0 *uint16 _p0, err = syscall.UTF16PtrFromString(libname) if err != nil { return } return _LoadLibraryEx(_p0, zero, flags) } func _LoadLibraryEx(libname *uint16, zero Handle, flags uintptr) (handle Handle, err error) { r0, _, e1 := syscall.Syscall(procLoadLibraryExW.Addr(), 3, uintptr(unsafe.Pointer(libname)), uintptr(zero), uintptr(flags)) handle = Handle(r0) if handle == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func FreeLibrary(handle Handle) (err error) { r1, _, e1 := syscall.Syscall(procFreeLibrary.Addr(), 1, uintptr(handle), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetProcAddress(module Handle, procname string) (proc uintptr, err error) { var _p0 *byte _p0, err = syscall.BytePtrFromString(procname) if err != nil { return } return _GetProcAddress(module, _p0) } func _GetProcAddress(module Handle, procname *byte) (proc uintptr, err error) { r0, _, e1 := syscall.Syscall(procGetProcAddress.Addr(), 2, uintptr(module), uintptr(unsafe.Pointer(procname)), 0) proc = uintptr(r0) if proc == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetVersion() (ver uint32, err error) { r0, _, e1 := syscall.Syscall(procGetVersion.Addr(), 0, 0, 0, 0) ver = uint32(r0) if ver == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func FormatMessage(flags uint32, msgsrc uintptr, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, err error) { var _p0 *uint16 if len(buf) > 0 { _p0 = &buf[0] } r0, _, e1 := syscall.Syscall9(procFormatMessageW.Addr(), 7, uintptr(flags), uintptr(msgsrc), uintptr(msgid), uintptr(langid), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(args)), 0, 0) n = uint32(r0) if n == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func ExitProcess(exitcode uint32) { syscall.Syscall(procExitProcess.Addr(), 1, uintptr(exitcode), 0, 0) return } func CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile int32) (handle Handle, err error) { r0, _, e1 := syscall.Syscall9(procCreateFileW.Addr(), 7, uintptr(unsafe.Pointer(name)), uintptr(access), uintptr(mode), uintptr(unsafe.Pointer(sa)), uintptr(createmode), uintptr(attrs), uintptr(templatefile), 0, 0) handle = Handle(r0) if handle == InvalidHandle { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func ReadFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) { var _p0 *byte if len(buf) > 0 { _p0 = &buf[0] } r1, _, e1 := syscall.Syscall6(procReadFile.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(done)), uintptr(unsafe.Pointer(overlapped)), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) { var _p0 *byte if len(buf) > 0 { _p0 = &buf[0] } r1, _, e1 := syscall.Syscall6(procWriteFile.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(done)), uintptr(unsafe.Pointer(overlapped)), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func SetFilePointer(handle Handle, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, err error) { r0, _, e1 := syscall.Syscall6(procSetFilePointer.Addr(), 4, uintptr(handle), uintptr(lowoffset), uintptr(unsafe.Pointer(highoffsetptr)), uintptr(whence), 0, 0) newlowoffset = uint32(r0) if newlowoffset == 0xffffffff { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func CloseHandle(handle Handle) (err error) { r1, _, e1 := syscall.Syscall(procCloseHandle.Addr(), 1, uintptr(handle), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetStdHandle(stdhandle uint32) (handle Handle, err error) { r0, _, e1 := syscall.Syscall(procGetStdHandle.Addr(), 1, uintptr(stdhandle), 0, 0) handle = Handle(r0) if handle == InvalidHandle { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func SetStdHandle(stdhandle uint32, handle Handle) (err error) { r1, _, e1 := syscall.Syscall(procSetStdHandle.Addr(), 2, uintptr(stdhandle), uintptr(handle), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func findFirstFile1(name *uint16, data *win32finddata1) (handle Handle, err error) { r0, _, e1 := syscall.Syscall(procFindFirstFileW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(data)), 0) handle = Handle(r0) if handle == InvalidHandle { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func findNextFile1(handle Handle, data *win32finddata1) (err error) { r1, _, e1 := syscall.Syscall(procFindNextFileW.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(data)), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func FindClose(handle Handle) (err error) { r1, _, e1 := syscall.Syscall(procFindClose.Addr(), 1, uintptr(handle), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetFileInformationByHandle(handle Handle, data *ByHandleFileInformation) (err error) { r1, _, e1 := syscall.Syscall(procGetFileInformationByHandle.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(data)), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetCurrentDirectory(buflen uint32, buf *uint16) (n uint32, err error) { r0, _, e1 := syscall.Syscall(procGetCurrentDirectoryW.Addr(), 2, uintptr(buflen), uintptr(unsafe.Pointer(buf)), 0) n = uint32(r0) if n == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func SetCurrentDirectory(path *uint16) (err error) { r1, _, e1 := syscall.Syscall(procSetCurrentDirectoryW.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func CreateDirectory(path *uint16, sa *SecurityAttributes) (err error) { r1, _, e1 := syscall.Syscall(procCreateDirectoryW.Addr(), 2, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(sa)), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func RemoveDirectory(path *uint16) (err error) { r1, _, e1 := syscall.Syscall(procRemoveDirectoryW.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func DeleteFile(path *uint16) (err error) { r1, _, e1 := syscall.Syscall(procDeleteFileW.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func MoveFile(from *uint16, to *uint16) (err error) { r1, _, e1 := syscall.Syscall(procMoveFileW.Addr(), 2, uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(to)), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func MoveFileEx(from *uint16, to *uint16, flags uint32) (err error) { r1, _, e1 := syscall.Syscall(procMoveFileExW.Addr(), 3, uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(to)), uintptr(flags)) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetComputerName(buf *uint16, n *uint32) (err error) { r1, _, e1 := syscall.Syscall(procGetComputerNameW.Addr(), 2, uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(n)), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetComputerNameEx(nametype uint32, buf *uint16, n *uint32) (err error) { r1, _, e1 := syscall.Syscall(procGetComputerNameExW.Addr(), 3, uintptr(nametype), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(n))) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func SetEndOfFile(handle Handle) (err error) { r1, _, e1 := syscall.Syscall(procSetEndOfFile.Addr(), 1, uintptr(handle), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetSystemTimeAsFileTime(time *Filetime) { syscall.Syscall(procGetSystemTimeAsFileTime.Addr(), 1, uintptr(unsafe.Pointer(time)), 0, 0) return } func GetSystemTimePreciseAsFileTime(time *Filetime) { syscall.Syscall(procGetSystemTimePreciseAsFileTime.Addr(), 1, uintptr(unsafe.Pointer(time)), 0, 0) return } func GetTimeZoneInformation(tzi *Timezoneinformation) (rc uint32, err error) { r0, _, e1 := syscall.Syscall(procGetTimeZoneInformation.Addr(), 1, uintptr(unsafe.Pointer(tzi)), 0, 0) rc = uint32(r0) if rc == 0xffffffff { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func CreateIoCompletionPort(filehandle Handle, cphandle Handle, key uint32, threadcnt uint32) (handle Handle, err error) { r0, _, e1 := syscall.Syscall6(procCreateIoCompletionPort.Addr(), 4, uintptr(filehandle), uintptr(cphandle), uintptr(key), uintptr(threadcnt), 0, 0) handle = Handle(r0) if handle == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uint32, overlapped **Overlapped, timeout uint32) (err error) { r1, _, e1 := syscall.Syscall6(procGetQueuedCompletionStatus.Addr(), 5, uintptr(cphandle), uintptr(unsafe.Pointer(qty)), uintptr(unsafe.Pointer(key)), uintptr(unsafe.Pointer(overlapped)), uintptr(timeout), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func PostQueuedCompletionStatus(cphandle Handle, qty uint32, key uint32, overlapped *Overlapped) (err error) { r1, _, e1 := syscall.Syscall6(procPostQueuedCompletionStatus.Addr(), 4, uintptr(cphandle), uintptr(qty), uintptr(key), uintptr(unsafe.Pointer(overlapped)), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func CancelIo(s Handle) (err error) { r1, _, e1 := syscall.Syscall(procCancelIo.Addr(), 1, uintptr(s), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func CancelIoEx(s Handle, o *Overlapped) (err error) { r1, _, e1 := syscall.Syscall(procCancelIoEx.Addr(), 2, uintptr(s), uintptr(unsafe.Pointer(o)), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) { var _p0 uint32 if inheritHandles { _p0 = 1 } else { _p0 = 0 } r1, _, e1 := syscall.Syscall12(procCreateProcessW.Addr(), 10, uintptr(unsafe.Pointer(appName)), uintptr(unsafe.Pointer(commandLine)), uintptr(unsafe.Pointer(procSecurity)), uintptr(unsafe.Pointer(threadSecurity)), uintptr(_p0), uintptr(creationFlags), uintptr(unsafe.Pointer(env)), uintptr(unsafe.Pointer(currentDir)), uintptr(unsafe.Pointer(startupInfo)), uintptr(unsafe.Pointer(outProcInfo)), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func OpenProcess(da uint32, inheritHandle bool, pid uint32) (handle Handle, err error) { var _p0 uint32 if inheritHandle { _p0 = 1 } else { _p0 = 0 } r0, _, e1 := syscall.Syscall(procOpenProcess.Addr(), 3, uintptr(da), uintptr(_p0), uintptr(pid)) handle = Handle(r0) if handle == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func TerminateProcess(handle Handle, exitcode uint32) (err error) { r1, _, e1 := syscall.Syscall(procTerminateProcess.Addr(), 2, uintptr(handle), uintptr(exitcode), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetExitCodeProcess(handle Handle, exitcode *uint32) (err error) { r1, _, e1 := syscall.Syscall(procGetExitCodeProcess.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(exitcode)), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetStartupInfo(startupInfo *StartupInfo) (err error) { r1, _, e1 := syscall.Syscall(procGetStartupInfoW.Addr(), 1, uintptr(unsafe.Pointer(startupInfo)), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetCurrentProcess() (pseudoHandle Handle, err error) { r0, _, e1 := syscall.Syscall(procGetCurrentProcess.Addr(), 0, 0, 0, 0) pseudoHandle = Handle(r0) if pseudoHandle == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error) { r1, _, e1 := syscall.Syscall6(procGetProcessTimes.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(creationTime)), uintptr(unsafe.Pointer(exitTime)), uintptr(unsafe.Pointer(kernelTime)), uintptr(unsafe.Pointer(userTime)), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func DuplicateHandle(hSourceProcessHandle Handle, hSourceHandle Handle, hTargetProcessHandle Handle, lpTargetHandle *Handle, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (err error) { var _p0 uint32 if bInheritHandle { _p0 = 1 } else { _p0 = 0 } r1, _, e1 := syscall.Syscall9(procDuplicateHandle.Addr(), 7, uintptr(hSourceProcessHandle), uintptr(hSourceHandle), uintptr(hTargetProcessHandle), uintptr(unsafe.Pointer(lpTargetHandle)), uintptr(dwDesiredAccess), uintptr(_p0), uintptr(dwOptions), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func WaitForSingleObject(handle Handle, waitMilliseconds uint32) (event uint32, err error) { r0, _, e1 := syscall.Syscall(procWaitForSingleObject.Addr(), 2, uintptr(handle), uintptr(waitMilliseconds), 0) event = uint32(r0) if event == 0xffffffff { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetTempPath(buflen uint32, buf *uint16) (n uint32, err error) { r0, _, e1 := syscall.Syscall(procGetTempPathW.Addr(), 2, uintptr(buflen), uintptr(unsafe.Pointer(buf)), 0) n = uint32(r0) if n == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func CreatePipe(readhandle *Handle, writehandle *Handle, sa *SecurityAttributes, size uint32) (err error) { r1, _, e1 := syscall.Syscall6(procCreatePipe.Addr(), 4, uintptr(unsafe.Pointer(readhandle)), uintptr(unsafe.Pointer(writehandle)), uintptr(unsafe.Pointer(sa)), uintptr(size), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetFileType(filehandle Handle) (n uint32, err error) { r0, _, e1 := syscall.Syscall(procGetFileType.Addr(), 1, uintptr(filehandle), 0, 0) n = uint32(r0) if n == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func CryptAcquireContext(provhandle *Handle, container *uint16, provider *uint16, provtype uint32, flags uint32) (err error) { r1, _, e1 := syscall.Syscall6(procCryptAcquireContextW.Addr(), 5, uintptr(unsafe.Pointer(provhandle)), uintptr(unsafe.Pointer(container)), uintptr(unsafe.Pointer(provider)), uintptr(provtype), uintptr(flags), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func CryptReleaseContext(provhandle Handle, flags uint32) (err error) { r1, _, e1 := syscall.Syscall(procCryptReleaseContext.Addr(), 2, uintptr(provhandle), uintptr(flags), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func CryptGenRandom(provhandle Handle, buflen uint32, buf *byte) (err error) { r1, _, e1 := syscall.Syscall(procCryptGenRandom.Addr(), 3, uintptr(provhandle), uintptr(buflen), uintptr(unsafe.Pointer(buf))) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetEnvironmentStrings() (envs *uint16, err error) { r0, _, e1 := syscall.Syscall(procGetEnvironmentStringsW.Addr(), 0, 0, 0, 0) envs = (*uint16)(unsafe.Pointer(r0)) if envs == nil { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func FreeEnvironmentStrings(envs *uint16) (err error) { r1, _, e1 := syscall.Syscall(procFreeEnvironmentStringsW.Addr(), 1, uintptr(unsafe.Pointer(envs)), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetEnvironmentVariable(name *uint16, buffer *uint16, size uint32) (n uint32, err error) { r0, _, e1 := syscall.Syscall(procGetEnvironmentVariableW.Addr(), 3, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(buffer)), uintptr(size)) n = uint32(r0) if n == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func SetEnvironmentVariable(name *uint16, value *uint16) (err error) { r1, _, e1 := syscall.Syscall(procSetEnvironmentVariableW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(value)), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func SetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error) { r1, _, e1 := syscall.Syscall6(procSetFileTime.Addr(), 4, uintptr(handle), uintptr(unsafe.Pointer(ctime)), uintptr(unsafe.Pointer(atime)), uintptr(unsafe.Pointer(wtime)), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetFileAttributes(name *uint16) (attrs uint32, err error) { r0, _, e1 := syscall.Syscall(procGetFileAttributesW.Addr(), 1, uintptr(unsafe.Pointer(name)), 0, 0) attrs = uint32(r0) if attrs == INVALID_FILE_ATTRIBUTES { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func SetFileAttributes(name *uint16, attrs uint32) (err error) { r1, _, e1 := syscall.Syscall(procSetFileAttributesW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(attrs), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetFileAttributesEx(name *uint16, level uint32, info *byte) (err error) { r1, _, e1 := syscall.Syscall(procGetFileAttributesExW.Addr(), 3, uintptr(unsafe.Pointer(name)), uintptr(level), uintptr(unsafe.Pointer(info))) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetCommandLine() (cmd *uint16) { r0, _, _ := syscall.Syscall(procGetCommandLineW.Addr(), 0, 0, 0, 0) cmd = (*uint16)(unsafe.Pointer(r0)) return } func CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, err error) { r0, _, e1 := syscall.Syscall(procCommandLineToArgvW.Addr(), 2, uintptr(unsafe.Pointer(cmd)), uintptr(unsafe.Pointer(argc)), 0) argv = (*[8192]*[8192]uint16)(unsafe.Pointer(r0)) if argv == nil { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func LocalFree(hmem Handle) (handle Handle, err error) { r0, _, e1 := syscall.Syscall(procLocalFree.Addr(), 1, uintptr(hmem), 0, 0) handle = Handle(r0) if handle != 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func SetHandleInformation(handle Handle, mask uint32, flags uint32) (err error) { r1, _, e1 := syscall.Syscall(procSetHandleInformation.Addr(), 3, uintptr(handle), uintptr(mask), uintptr(flags)) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func FlushFileBuffers(handle Handle) (err error) { r1, _, e1 := syscall.Syscall(procFlushFileBuffers.Addr(), 1, uintptr(handle), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetFullPathName(path *uint16, buflen uint32, buf *uint16, fname **uint16) (n uint32, err error) { r0, _, e1 := syscall.Syscall6(procGetFullPathNameW.Addr(), 4, uintptr(unsafe.Pointer(path)), uintptr(buflen), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(fname)), 0, 0) n = uint32(r0) if n == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetLongPathName(path *uint16, buf *uint16, buflen uint32) (n uint32, err error) { r0, _, e1 := syscall.Syscall(procGetLongPathNameW.Addr(), 3, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(buf)), uintptr(buflen)) n = uint32(r0) if n == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetShortPathName(longpath *uint16, shortpath *uint16, buflen uint32) (n uint32, err error) { r0, _, e1 := syscall.Syscall(procGetShortPathNameW.Addr(), 3, uintptr(unsafe.Pointer(longpath)), uintptr(unsafe.Pointer(shortpath)), uintptr(buflen)) n = uint32(r0) if n == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func CreateFileMapping(fhandle Handle, sa *SecurityAttributes, prot uint32, maxSizeHigh uint32, maxSizeLow uint32, name *uint16) (handle Handle, err error) { r0, _, e1 := syscall.Syscall6(procCreateFileMappingW.Addr(), 6, uintptr(fhandle), uintptr(unsafe.Pointer(sa)), uintptr(prot), uintptr(maxSizeHigh), uintptr(maxSizeLow), uintptr(unsafe.Pointer(name))) handle = Handle(r0) if handle == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func MapViewOfFile(handle Handle, access uint32, offsetHigh uint32, offsetLow uint32, length uintptr) (addr uintptr, err error) { r0, _, e1 := syscall.Syscall6(procMapViewOfFile.Addr(), 5, uintptr(handle), uintptr(access), uintptr(offsetHigh), uintptr(offsetLow), uintptr(length), 0) addr = uintptr(r0) if addr == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func UnmapViewOfFile(addr uintptr) (err error) { r1, _, e1 := syscall.Syscall(procUnmapViewOfFile.Addr(), 1, uintptr(addr), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func FlushViewOfFile(addr uintptr, length uintptr) (err error) { r1, _, e1 := syscall.Syscall(procFlushViewOfFile.Addr(), 2, uintptr(addr), uintptr(length), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func VirtualLock(addr uintptr, length uintptr) (err error) { r1, _, e1 := syscall.Syscall(procVirtualLock.Addr(), 2, uintptr(addr), uintptr(length), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func VirtualUnlock(addr uintptr, length uintptr) (err error) { r1, _, e1 := syscall.Syscall(procVirtualUnlock.Addr(), 2, uintptr(addr), uintptr(length), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func VirtualAlloc(address uintptr, size uintptr, alloctype uint32, protect uint32) (value uintptr, err error) { r0, _, e1 := syscall.Syscall6(procVirtualAlloc.Addr(), 4, uintptr(address), uintptr(size), uintptr(alloctype), uintptr(protect), 0, 0) value = uintptr(r0) if value == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func VirtualFree(address uintptr, size uintptr, freetype uint32) (err error) { r1, _, e1 := syscall.Syscall(procVirtualFree.Addr(), 3, uintptr(address), uintptr(size), uintptr(freetype)) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func VirtualProtect(address uintptr, size uintptr, newprotect uint32, oldprotect *uint32) (err error) { r1, _, e1 := syscall.Syscall6(procVirtualProtect.Addr(), 4, uintptr(address), uintptr(size), uintptr(newprotect), uintptr(unsafe.Pointer(oldprotect)), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func TransmitFile(s Handle, handle Handle, bytesToWrite uint32, bytsPerSend uint32, overlapped *Overlapped, transmitFileBuf *TransmitFileBuffers, flags uint32) (err error) { r1, _, e1 := syscall.Syscall9(procTransmitFile.Addr(), 7, uintptr(s), uintptr(handle), uintptr(bytesToWrite), uintptr(bytsPerSend), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(transmitFileBuf)), uintptr(flags), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func ReadDirectoryChanges(handle Handle, buf *byte, buflen uint32, watchSubTree bool, mask uint32, retlen *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) { var _p0 uint32 if watchSubTree { _p0 = 1 } else { _p0 = 0 } r1, _, e1 := syscall.Syscall9(procReadDirectoryChangesW.Addr(), 8, uintptr(handle), uintptr(unsafe.Pointer(buf)), uintptr(buflen), uintptr(_p0), uintptr(mask), uintptr(unsafe.Pointer(retlen)), uintptr(unsafe.Pointer(overlapped)), uintptr(completionRoutine), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func CertOpenSystemStore(hprov Handle, name *uint16) (store Handle, err error) { r0, _, e1 := syscall.Syscall(procCertOpenSystemStoreW.Addr(), 2, uintptr(hprov), uintptr(unsafe.Pointer(name)), 0) store = Handle(r0) if store == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func CertOpenStore(storeProvider uintptr, msgAndCertEncodingType uint32, cryptProv uintptr, flags uint32, para uintptr) (handle Handle, err error) { r0, _, e1 := syscall.Syscall6(procCertOpenStore.Addr(), 5, uintptr(storeProvider), uintptr(msgAndCertEncodingType), uintptr(cryptProv), uintptr(flags), uintptr(para), 0) handle = Handle(r0) if handle == InvalidHandle { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext, err error) { r0, _, e1 := syscall.Syscall(procCertEnumCertificatesInStore.Addr(), 2, uintptr(store), uintptr(unsafe.Pointer(prevContext)), 0) context = (*CertContext)(unsafe.Pointer(r0)) if context == nil { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func CertAddCertificateContextToStore(store Handle, certContext *CertContext, addDisposition uint32, storeContext **CertContext) (err error) { r1, _, e1 := syscall.Syscall6(procCertAddCertificateContextToStore.Addr(), 4, uintptr(store), uintptr(unsafe.Pointer(certContext)), uintptr(addDisposition), uintptr(unsafe.Pointer(storeContext)), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func CertCloseStore(store Handle, flags uint32) (err error) { r1, _, e1 := syscall.Syscall(procCertCloseStore.Addr(), 2, uintptr(store), uintptr(flags), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func CertGetCertificateChain(engine Handle, leaf *CertContext, time *Filetime, additionalStore Handle, para *CertChainPara, flags uint32, reserved uintptr, chainCtx **CertChainContext) (err error) { r1, _, e1 := syscall.Syscall9(procCertGetCertificateChain.Addr(), 8, uintptr(engine), uintptr(unsafe.Pointer(leaf)), uintptr(unsafe.Pointer(time)), uintptr(additionalStore), uintptr(unsafe.Pointer(para)), uintptr(flags), uintptr(reserved), uintptr(unsafe.Pointer(chainCtx)), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func CertFreeCertificateChain(ctx *CertChainContext) { syscall.Syscall(procCertFreeCertificateChain.Addr(), 1, uintptr(unsafe.Pointer(ctx)), 0, 0) return } func CertCreateCertificateContext(certEncodingType uint32, certEncoded *byte, encodedLen uint32) (context *CertContext, err error) { r0, _, e1 := syscall.Syscall(procCertCreateCertificateContext.Addr(), 3, uintptr(certEncodingType), uintptr(unsafe.Pointer(certEncoded)), uintptr(encodedLen)) context = (*CertContext)(unsafe.Pointer(r0)) if context == nil { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func CertFreeCertificateContext(ctx *CertContext) (err error) { r1, _, e1 := syscall.Syscall(procCertFreeCertificateContext.Addr(), 1, uintptr(unsafe.Pointer(ctx)), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func CertVerifyCertificateChainPolicy(policyOID uintptr, chain *CertChainContext, para *CertChainPolicyPara, status *CertChainPolicyStatus) (err error) { r1, _, e1 := syscall.Syscall6(procCertVerifyCertificateChainPolicy.Addr(), 4, uintptr(policyOID), uintptr(unsafe.Pointer(chain)), uintptr(unsafe.Pointer(para)), uintptr(unsafe.Pointer(status)), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func RegOpenKeyEx(key Handle, subkey *uint16, options uint32, desiredAccess uint32, result *Handle) (regerrno error) { r0, _, _ := syscall.Syscall6(procRegOpenKeyExW.Addr(), 5, uintptr(key), uintptr(unsafe.Pointer(subkey)), uintptr(options), uintptr(desiredAccess), uintptr(unsafe.Pointer(result)), 0) if r0 != 0 { regerrno = syscall.Errno(r0) } return } func RegCloseKey(key Handle) (regerrno error) { r0, _, _ := syscall.Syscall(procRegCloseKey.Addr(), 1, uintptr(key), 0, 0) if r0 != 0 { regerrno = syscall.Errno(r0) } return } func RegQueryInfoKey(key Handle, class *uint16, classLen *uint32, reserved *uint32, subkeysLen *uint32, maxSubkeyLen *uint32, maxClassLen *uint32, valuesLen *uint32, maxValueNameLen *uint32, maxValueLen *uint32, saLen *uint32, lastWriteTime *Filetime) (regerrno error) { r0, _, _ := syscall.Syscall12(procRegQueryInfoKeyW.Addr(), 12, uintptr(key), uintptr(unsafe.Pointer(class)), uintptr(unsafe.Pointer(classLen)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(subkeysLen)), uintptr(unsafe.Pointer(maxSubkeyLen)), uintptr(unsafe.Pointer(maxClassLen)), uintptr(unsafe.Pointer(valuesLen)), uintptr(unsafe.Pointer(maxValueNameLen)), uintptr(unsafe.Pointer(maxValueLen)), uintptr(unsafe.Pointer(saLen)), uintptr(unsafe.Pointer(lastWriteTime))) if r0 != 0 { regerrno = syscall.Errno(r0) } return } func RegEnumKeyEx(key Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, class *uint16, classLen *uint32, lastWriteTime *Filetime) (regerrno error) { r0, _, _ := syscall.Syscall9(procRegEnumKeyExW.Addr(), 8, uintptr(key), uintptr(index), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameLen)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(class)), uintptr(unsafe.Pointer(classLen)), uintptr(unsafe.Pointer(lastWriteTime)), 0) if r0 != 0 { regerrno = syscall.Errno(r0) } return } func RegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) { r0, _, _ := syscall.Syscall6(procRegQueryValueExW.Addr(), 6, uintptr(key), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(valtype)), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(buflen))) if r0 != 0 { regerrno = syscall.Errno(r0) } return } func getCurrentProcessId() (pid uint32) { r0, _, _ := syscall.Syscall(procGetCurrentProcessId.Addr(), 0, 0, 0, 0) pid = uint32(r0) return } func GetConsoleMode(console Handle, mode *uint32) (err error) { r1, _, e1 := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(console), uintptr(unsafe.Pointer(mode)), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func SetConsoleMode(console Handle, mode uint32) (err error) { r1, _, e1 := syscall.Syscall(procSetConsoleMode.Addr(), 2, uintptr(console), uintptr(mode), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetConsoleScreenBufferInfo(console Handle, info *ConsoleScreenBufferInfo) (err error) { r1, _, e1 := syscall.Syscall(procGetConsoleScreenBufferInfo.Addr(), 2, uintptr(console), uintptr(unsafe.Pointer(info)), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) { r1, _, e1 := syscall.Syscall6(procWriteConsoleW.Addr(), 5, uintptr(console), uintptr(unsafe.Pointer(buf)), uintptr(towrite), uintptr(unsafe.Pointer(written)), uintptr(unsafe.Pointer(reserved)), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) { r1, _, e1 := syscall.Syscall6(procReadConsoleW.Addr(), 5, uintptr(console), uintptr(unsafe.Pointer(buf)), uintptr(toread), uintptr(unsafe.Pointer(read)), uintptr(unsafe.Pointer(inputControl)), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) { r0, _, e1 := syscall.Syscall(procCreateToolhelp32Snapshot.Addr(), 2, uintptr(flags), uintptr(processId), 0) handle = Handle(r0) if handle == InvalidHandle { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func Process32First(snapshot Handle, procEntry *ProcessEntry32) (err error) { r1, _, e1 := syscall.Syscall(procProcess32FirstW.Addr(), 2, uintptr(snapshot), uintptr(unsafe.Pointer(procEntry)), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error) { r1, _, e1 := syscall.Syscall(procProcess32NextW.Addr(), 2, uintptr(snapshot), uintptr(unsafe.Pointer(procEntry)), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func DeviceIoControl(handle Handle, ioControlCode uint32, inBuffer *byte, inBufferSize uint32, outBuffer *byte, outBufferSize uint32, bytesReturned *uint32, overlapped *Overlapped) (err error) { r1, _, e1 := syscall.Syscall9(procDeviceIoControl.Addr(), 8, uintptr(handle), uintptr(ioControlCode), uintptr(unsafe.Pointer(inBuffer)), uintptr(inBufferSize), uintptr(unsafe.Pointer(outBuffer)), uintptr(outBufferSize), uintptr(unsafe.Pointer(bytesReturned)), uintptr(unsafe.Pointer(overlapped)), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func CreateSymbolicLink(symlinkfilename *uint16, targetfilename *uint16, flags uint32) (err error) { r1, _, e1 := syscall.Syscall(procCreateSymbolicLinkW.Addr(), 3, uintptr(unsafe.Pointer(symlinkfilename)), uintptr(unsafe.Pointer(targetfilename)), uintptr(flags)) if r1&0xff == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func CreateHardLink(filename *uint16, existingfilename *uint16, reserved uintptr) (err error) { r1, _, e1 := syscall.Syscall(procCreateHardLinkW.Addr(), 3, uintptr(unsafe.Pointer(filename)), uintptr(unsafe.Pointer(existingfilename)), uintptr(reserved)) if r1&0xff == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetCurrentThreadId() (id uint32) { r0, _, _ := syscall.Syscall(procGetCurrentThreadId.Addr(), 0, 0, 0, 0) id = uint32(r0) return } func CreateEvent(eventAttrs *SecurityAttributes, manualReset uint32, initialState uint32, name *uint16) (handle Handle, err error) { r0, _, e1 := syscall.Syscall6(procCreateEventW.Addr(), 4, uintptr(unsafe.Pointer(eventAttrs)), uintptr(manualReset), uintptr(initialState), uintptr(unsafe.Pointer(name)), 0, 0) handle = Handle(r0) if handle == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func CreateEventEx(eventAttrs *SecurityAttributes, name *uint16, flags uint32, desiredAccess uint32) (handle Handle, err error) { r0, _, e1 := syscall.Syscall6(procCreateEventExW.Addr(), 4, uintptr(unsafe.Pointer(eventAttrs)), uintptr(unsafe.Pointer(name)), uintptr(flags), uintptr(desiredAccess), 0, 0) handle = Handle(r0) if handle == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func OpenEvent(desiredAccess uint32, inheritHandle bool, name *uint16) (handle Handle, err error) { var _p0 uint32 if inheritHandle { _p0 = 1 } else { _p0 = 0 } r0, _, e1 := syscall.Syscall(procOpenEventW.Addr(), 3, uintptr(desiredAccess), uintptr(_p0), uintptr(unsafe.Pointer(name))) handle = Handle(r0) if handle == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func SetEvent(event Handle) (err error) { r1, _, e1 := syscall.Syscall(procSetEvent.Addr(), 1, uintptr(event), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func ResetEvent(event Handle) (err error) { r1, _, e1 := syscall.Syscall(procResetEvent.Addr(), 1, uintptr(event), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func PulseEvent(event Handle) (err error) { r1, _, e1 := syscall.Syscall(procPulseEvent.Addr(), 1, uintptr(event), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func WSAStartup(verreq uint32, data *WSAData) (sockerr error) { r0, _, _ := syscall.Syscall(procWSAStartup.Addr(), 2, uintptr(verreq), uintptr(unsafe.Pointer(data)), 0) if r0 != 0 { sockerr = syscall.Errno(r0) } return } func WSACleanup() (err error) { r1, _, e1 := syscall.Syscall(procWSACleanup.Addr(), 0, 0, 0, 0) if r1 == socket_error { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) { r1, _, e1 := syscall.Syscall9(procWSAIoctl.Addr(), 9, uintptr(s), uintptr(iocc), uintptr(unsafe.Pointer(inbuf)), uintptr(cbif), uintptr(unsafe.Pointer(outbuf)), uintptr(cbob), uintptr(unsafe.Pointer(cbbr)), uintptr(unsafe.Pointer(overlapped)), uintptr(completionRoutine)) if r1 == socket_error { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func socket(af int32, typ int32, protocol int32) (handle Handle, err error) { r0, _, e1 := syscall.Syscall(procsocket.Addr(), 3, uintptr(af), uintptr(typ), uintptr(protocol)) handle = Handle(r0) if handle == InvalidHandle { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func Setsockopt(s Handle, level int32, optname int32, optval *byte, optlen int32) (err error) { r1, _, e1 := syscall.Syscall6(procsetsockopt.Addr(), 5, uintptr(s), uintptr(level), uintptr(optname), uintptr(unsafe.Pointer(optval)), uintptr(optlen), 0) if r1 == socket_error { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func Getsockopt(s Handle, level int32, optname int32, optval *byte, optlen *int32) (err error) { r1, _, e1 := syscall.Syscall6(procgetsockopt.Addr(), 5, uintptr(s), uintptr(level), uintptr(optname), uintptr(unsafe.Pointer(optval)), uintptr(unsafe.Pointer(optlen)), 0) if r1 == socket_error { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func bind(s Handle, name unsafe.Pointer, namelen int32) (err error) { r1, _, e1 := syscall.Syscall(procbind.Addr(), 3, uintptr(s), uintptr(name), uintptr(namelen)) if r1 == socket_error { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func connect(s Handle, name unsafe.Pointer, namelen int32) (err error) { r1, _, e1 := syscall.Syscall(procconnect.Addr(), 3, uintptr(s), uintptr(name), uintptr(namelen)) if r1 == socket_error { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func getsockname(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) { r1, _, e1 := syscall.Syscall(procgetsockname.Addr(), 3, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if r1 == socket_error { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func getpeername(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) { r1, _, e1 := syscall.Syscall(procgetpeername.Addr(), 3, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if r1 == socket_error { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func listen(s Handle, backlog int32) (err error) { r1, _, e1 := syscall.Syscall(proclisten.Addr(), 2, uintptr(s), uintptr(backlog), 0) if r1 == socket_error { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func shutdown(s Handle, how int32) (err error) { r1, _, e1 := syscall.Syscall(procshutdown.Addr(), 2, uintptr(s), uintptr(how), 0) if r1 == socket_error { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func Closesocket(s Handle) (err error) { r1, _, e1 := syscall.Syscall(procclosesocket.Addr(), 1, uintptr(s), 0, 0) if r1 == socket_error { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func AcceptEx(ls Handle, as Handle, buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, recvd *uint32, overlapped *Overlapped) (err error) { r1, _, e1 := syscall.Syscall9(procAcceptEx.Addr(), 8, uintptr(ls), uintptr(as), uintptr(unsafe.Pointer(buf)), uintptr(rxdatalen), uintptr(laddrlen), uintptr(raddrlen), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(overlapped)), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetAcceptExSockaddrs(buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, lrsa **RawSockaddrAny, lrsalen *int32, rrsa **RawSockaddrAny, rrsalen *int32) { syscall.Syscall9(procGetAcceptExSockaddrs.Addr(), 8, uintptr(unsafe.Pointer(buf)), uintptr(rxdatalen), uintptr(laddrlen), uintptr(raddrlen), uintptr(unsafe.Pointer(lrsa)), uintptr(unsafe.Pointer(lrsalen)), uintptr(unsafe.Pointer(rrsa)), uintptr(unsafe.Pointer(rrsalen)), 0) return } func WSARecv(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, overlapped *Overlapped, croutine *byte) (err error) { r1, _, e1 := syscall.Syscall9(procWSARecv.Addr(), 7, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0, 0) if r1 == socket_error { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func WSASend(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, overlapped *Overlapped, croutine *byte) (err error) { r1, _, e1 := syscall.Syscall9(procWSASend.Addr(), 7, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(sent)), uintptr(flags), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0, 0) if r1 == socket_error { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func WSARecvFrom(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, from *RawSockaddrAny, fromlen *int32, overlapped *Overlapped, croutine *byte) (err error) { r1, _, e1 := syscall.Syscall9(procWSARecvFrom.Addr(), 9, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine))) if r1 == socket_error { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func WSASendTo(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to *RawSockaddrAny, tolen int32, overlapped *Overlapped, croutine *byte) (err error) { r1, _, e1 := syscall.Syscall9(procWSASendTo.Addr(), 9, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(sent)), uintptr(flags), uintptr(unsafe.Pointer(to)), uintptr(tolen), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine))) if r1 == socket_error { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetHostByName(name string) (h *Hostent, err error) { var _p0 *byte _p0, err = syscall.BytePtrFromString(name) if err != nil { return } return _GetHostByName(_p0) } func _GetHostByName(name *byte) (h *Hostent, err error) { r0, _, e1 := syscall.Syscall(procgethostbyname.Addr(), 1, uintptr(unsafe.Pointer(name)), 0, 0) h = (*Hostent)(unsafe.Pointer(r0)) if h == nil { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetServByName(name string, proto string) (s *Servent, err error) { var _p0 *byte _p0, err = syscall.BytePtrFromString(name) if err != nil { return } var _p1 *byte _p1, err = syscall.BytePtrFromString(proto) if err != nil { return } return _GetServByName(_p0, _p1) } func _GetServByName(name *byte, proto *byte) (s *Servent, err error) { r0, _, e1 := syscall.Syscall(procgetservbyname.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(proto)), 0) s = (*Servent)(unsafe.Pointer(r0)) if s == nil { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func Ntohs(netshort uint16) (u uint16) { r0, _, _ := syscall.Syscall(procntohs.Addr(), 1, uintptr(netshort), 0, 0) u = uint16(r0) return } func GetProtoByName(name string) (p *Protoent, err error) { var _p0 *byte _p0, err = syscall.BytePtrFromString(name) if err != nil { return } return _GetProtoByName(_p0) } func _GetProtoByName(name *byte) (p *Protoent, err error) { r0, _, e1 := syscall.Syscall(procgetprotobyname.Addr(), 1, uintptr(unsafe.Pointer(name)), 0, 0) p = (*Protoent)(unsafe.Pointer(r0)) if p == nil { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func DnsQuery(name string, qtype uint16, options uint32, extra *byte, qrs **DNSRecord, pr *byte) (status error) { var _p0 *uint16 _p0, status = syscall.UTF16PtrFromString(name) if status != nil { return } return _DnsQuery(_p0, qtype, options, extra, qrs, pr) } func _DnsQuery(name *uint16, qtype uint16, options uint32, extra *byte, qrs **DNSRecord, pr *byte) (status error) { r0, _, _ := syscall.Syscall6(procDnsQuery_W.Addr(), 6, uintptr(unsafe.Pointer(name)), uintptr(qtype), uintptr(options), uintptr(unsafe.Pointer(extra)), uintptr(unsafe.Pointer(qrs)), uintptr(unsafe.Pointer(pr))) if r0 != 0 { status = syscall.Errno(r0) } return } func DnsRecordListFree(rl *DNSRecord, freetype uint32) { syscall.Syscall(procDnsRecordListFree.Addr(), 2, uintptr(unsafe.Pointer(rl)), uintptr(freetype), 0) return } func DnsNameCompare(name1 *uint16, name2 *uint16) (same bool) { r0, _, _ := syscall.Syscall(procDnsNameCompare_W.Addr(), 2, uintptr(unsafe.Pointer(name1)), uintptr(unsafe.Pointer(name2)), 0) same = r0 != 0 return } func GetAddrInfoW(nodename *uint16, servicename *uint16, hints *AddrinfoW, result **AddrinfoW) (sockerr error) { r0, _, _ := syscall.Syscall6(procGetAddrInfoW.Addr(), 4, uintptr(unsafe.Pointer(nodename)), uintptr(unsafe.Pointer(servicename)), uintptr(unsafe.Pointer(hints)), uintptr(unsafe.Pointer(result)), 0, 0) if r0 != 0 { sockerr = syscall.Errno(r0) } return } func FreeAddrInfoW(addrinfo *AddrinfoW) { syscall.Syscall(procFreeAddrInfoW.Addr(), 1, uintptr(unsafe.Pointer(addrinfo)), 0, 0) return } func GetIfEntry(pIfRow *MibIfRow) (errcode error) { r0, _, _ := syscall.Syscall(procGetIfEntry.Addr(), 1, uintptr(unsafe.Pointer(pIfRow)), 0, 0) if r0 != 0 { errcode = syscall.Errno(r0) } return } func GetAdaptersInfo(ai *IpAdapterInfo, ol *uint32) (errcode error) { r0, _, _ := syscall.Syscall(procGetAdaptersInfo.Addr(), 2, uintptr(unsafe.Pointer(ai)), uintptr(unsafe.Pointer(ol)), 0) if r0 != 0 { errcode = syscall.Errno(r0) } return } func SetFileCompletionNotificationModes(handle Handle, flags uint8) (err error) { r1, _, e1 := syscall.Syscall(procSetFileCompletionNotificationModes.Addr(), 2, uintptr(handle), uintptr(flags), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func WSAEnumProtocols(protocols *int32, protocolBuffer *WSAProtocolInfo, bufferLength *uint32) (n int32, err error) { r0, _, e1 := syscall.Syscall(procWSAEnumProtocolsW.Addr(), 3, uintptr(unsafe.Pointer(protocols)), uintptr(unsafe.Pointer(protocolBuffer)), uintptr(unsafe.Pointer(bufferLength))) n = int32(r0) if n == -1 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) { r0, _, _ := syscall.Syscall6(procGetAdaptersAddresses.Addr(), 5, uintptr(family), uintptr(flags), uintptr(reserved), uintptr(unsafe.Pointer(adapterAddresses)), uintptr(unsafe.Pointer(sizePointer)), 0) if r0 != 0 { errcode = syscall.Errno(r0) } return } func GetACP() (acp uint32) { r0, _, _ := syscall.Syscall(procGetACP.Addr(), 0, 0, 0, 0) acp = uint32(r0) return } func MultiByteToWideChar(codePage uint32, dwFlags uint32, str *byte, nstr int32, wchar *uint16, nwchar int32) (nwrite int32, err error) { r0, _, e1 := syscall.Syscall6(procMultiByteToWideChar.Addr(), 6, uintptr(codePage), uintptr(dwFlags), uintptr(unsafe.Pointer(str)), uintptr(nstr), uintptr(unsafe.Pointer(wchar)), uintptr(nwchar)) nwrite = int32(r0) if nwrite == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func TranslateName(accName *uint16, accNameFormat uint32, desiredNameFormat uint32, translatedName *uint16, nSize *uint32) (err error) { r1, _, e1 := syscall.Syscall6(procTranslateNameW.Addr(), 5, uintptr(unsafe.Pointer(accName)), uintptr(accNameFormat), uintptr(desiredNameFormat), uintptr(unsafe.Pointer(translatedName)), uintptr(unsafe.Pointer(nSize)), 0) if r1&0xff == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetUserNameEx(nameFormat uint32, nameBuffre *uint16, nSize *uint32) (err error) { r1, _, e1 := syscall.Syscall(procGetUserNameExW.Addr(), 3, uintptr(nameFormat), uintptr(unsafe.Pointer(nameBuffre)), uintptr(unsafe.Pointer(nSize))) if r1&0xff == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func NetUserGetInfo(serverName *uint16, userName *uint16, level uint32, buf **byte) (neterr error) { r0, _, _ := syscall.Syscall6(procNetUserGetInfo.Addr(), 4, uintptr(unsafe.Pointer(serverName)), uintptr(unsafe.Pointer(userName)), uintptr(level), uintptr(unsafe.Pointer(buf)), 0, 0) if r0 != 0 { neterr = syscall.Errno(r0) } return } func NetGetJoinInformation(server *uint16, name **uint16, bufType *uint32) (neterr error) { r0, _, _ := syscall.Syscall(procNetGetJoinInformation.Addr(), 3, uintptr(unsafe.Pointer(server)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(bufType))) if r0 != 0 { neterr = syscall.Errno(r0) } return } func NetApiBufferFree(buf *byte) (neterr error) { r0, _, _ := syscall.Syscall(procNetApiBufferFree.Addr(), 1, uintptr(unsafe.Pointer(buf)), 0, 0) if r0 != 0 { neterr = syscall.Errno(r0) } return } func LookupAccountSid(systemName *uint16, sid *SID, name *uint16, nameLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) { r1, _, e1 := syscall.Syscall9(procLookupAccountSidW.Addr(), 7, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameLen)), uintptr(unsafe.Pointer(refdDomainName)), uintptr(unsafe.Pointer(refdDomainNameLen)), uintptr(unsafe.Pointer(use)), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func LookupAccountName(systemName *uint16, accountName *uint16, sid *SID, sidLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) { r1, _, e1 := syscall.Syscall9(procLookupAccountNameW.Addr(), 7, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(accountName)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(sidLen)), uintptr(unsafe.Pointer(refdDomainName)), uintptr(unsafe.Pointer(refdDomainNameLen)), uintptr(unsafe.Pointer(use)), 0, 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func ConvertSidToStringSid(sid *SID, stringSid **uint16) (err error) { r1, _, e1 := syscall.Syscall(procConvertSidToStringSidW.Addr(), 2, uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(stringSid)), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func ConvertStringSidToSid(stringSid *uint16, sid **SID) (err error) { r1, _, e1 := syscall.Syscall(procConvertStringSidToSidW.Addr(), 2, uintptr(unsafe.Pointer(stringSid)), uintptr(unsafe.Pointer(sid)), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetLengthSid(sid *SID) (len uint32) { r0, _, _ := syscall.Syscall(procGetLengthSid.Addr(), 1, uintptr(unsafe.Pointer(sid)), 0, 0) len = uint32(r0) return } func CopySid(destSidLen uint32, destSid *SID, srcSid *SID) (err error) { r1, _, e1 := syscall.Syscall(procCopySid.Addr(), 3, uintptr(destSidLen), uintptr(unsafe.Pointer(destSid)), uintptr(unsafe.Pointer(srcSid))) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func AllocateAndInitializeSid(identAuth *SidIdentifierAuthority, subAuth byte, subAuth0 uint32, subAuth1 uint32, subAuth2 uint32, subAuth3 uint32, subAuth4 uint32, subAuth5 uint32, subAuth6 uint32, subAuth7 uint32, sid **SID) (err error) { r1, _, e1 := syscall.Syscall12(procAllocateAndInitializeSid.Addr(), 11, uintptr(unsafe.Pointer(identAuth)), uintptr(subAuth), uintptr(subAuth0), uintptr(subAuth1), uintptr(subAuth2), uintptr(subAuth3), uintptr(subAuth4), uintptr(subAuth5), uintptr(subAuth6), uintptr(subAuth7), uintptr(unsafe.Pointer(sid)), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func FreeSid(sid *SID) (err error) { r1, _, e1 := syscall.Syscall(procFreeSid.Addr(), 1, uintptr(unsafe.Pointer(sid)), 0, 0) if r1 != 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func EqualSid(sid1 *SID, sid2 *SID) (isEqual bool) { r0, _, _ := syscall.Syscall(procEqualSid.Addr(), 2, uintptr(unsafe.Pointer(sid1)), uintptr(unsafe.Pointer(sid2)), 0) isEqual = r0 != 0 return } func OpenProcessToken(h Handle, access uint32, token *Token) (err error) { r1, _, e1 := syscall.Syscall(procOpenProcessToken.Addr(), 3, uintptr(h), uintptr(access), uintptr(unsafe.Pointer(token))) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetTokenInformation(t Token, infoClass uint32, info *byte, infoLen uint32, returnedLen *uint32) (err error) { r1, _, e1 := syscall.Syscall6(procGetTokenInformation.Addr(), 5, uintptr(t), uintptr(infoClass), uintptr(unsafe.Pointer(info)), uintptr(infoLen), uintptr(unsafe.Pointer(returnedLen)), 0) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } func GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) { r1, _, e1 := syscall.Syscall(procGetUserProfileDirectoryW.Addr(), 3, uintptr(t), uintptr(unsafe.Pointer(dir)), uintptr(unsafe.Pointer(dirLen))) if r1 == 0 { if e1 != 0 { err = errnoErr(e1) } else { err = syscall.EINVAL } } return } ================================================ FILE: vendor/golang.org/x/text/.gitattributes ================================================ # Treat all files in this repo as binary, with no git magic updating # line endings. Windows users contributing to Go will need to use a # modern version of git and editors capable of LF line endings. # # We'll prevent accidental CRLF line endings from entering the repo # via the git-review gofmt checks. # # See golang.org/issue/9281 * -text ================================================ FILE: vendor/golang.org/x/text/.gitignore ================================================ # Add no patterns to .gitignore except for files generated by the build. last-change /DATA ================================================ FILE: vendor/golang.org/x/text/AUTHORS ================================================ # This source code refers to The Go Authors for copyright purposes. # The master list of authors is in the main Go distribution, # visible at http://tip.golang.org/AUTHORS. ================================================ FILE: vendor/golang.org/x/text/CONTRIBUTING.md ================================================ # Contributing to Go Go is an open source project. It is the work of hundreds of contributors. We appreciate your help! ## Filing issues When [filing an issue](https://golang.org/issue/new), make sure to answer these five questions: 1. What version of Go are you using (`go version`)? 2. What operating system and processor architecture are you using? 3. What did you do? 4. What did you expect to see? 5. What did you see instead? General questions should go to the [golang-nuts mailing list](https://groups.google.com/group/golang-nuts) instead of the issue tracker. The gophers there will answer or ask you to file an issue if you've tripped over a bug. ## Contributing code Please read the [Contribution Guidelines](https://golang.org/doc/contribute.html) before sending patches. **We do not accept GitHub pull requests** (we use [Gerrit](https://code.google.com/p/gerrit/) instead for code review). Unless otherwise noted, the Go source files are distributed under the BSD-style license found in the LICENSE file. ================================================ FILE: vendor/golang.org/x/text/CONTRIBUTORS ================================================ # This source code was written by the Go contributors. # The master list of contributors is in the main Go distribution, # visible at http://tip.golang.org/CONTRIBUTORS. ================================================ FILE: vendor/golang.org/x/text/LICENSE ================================================ Copyright (c) 2009 The Go Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: vendor/golang.org/x/text/PATENTS ================================================ Additional IP Rights Grant (Patents) "This implementation" means the copyrightable works distributed by Google as part of the Go project. Google hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, transfer and otherwise run, modify and propagate the contents of this implementation of Go, where such license applies only to those patent claims, both currently owned or controlled by Google and acquired in the future, licensable by Google that are necessarily infringed by this implementation of Go. This grant does not include claims that would be infringed only as a consequence of further modification of this implementation. If you or your agent or exclusive licensee institute or order or agree to the institution of patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that this implementation of Go or any code incorporated within this implementation of Go constitutes direct or contributory patent infringement, or inducement of patent infringement, then any patent rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ================================================ FILE: vendor/golang.org/x/text/README ================================================ This repository holds supplementary Go libraries for text processing, many involving Unicode. To submit changes to this repository, see http://golang.org/doc/contribute.html. To generate the tables in this repository (except for the encoding tables), run go generate from this directory. By default tables are generated for the Unicode version in core and the CLDR version defined in golang.org/x/text/unicode/cldr. Running go generate will as a side effect create a DATA subdirectory in this directory which holds all files that are used as a source for generating the tables. This directory will also serve as a cache. Run go test ./... from this directory to run all tests. Add the "-tags icu" flag to also run ICU conformance tests (if available). This requires that you have the correct ICU version installed on your system. TODO: - updating unversioned source files. ================================================ FILE: vendor/golang.org/x/text/codereview.cfg ================================================ issuerepo: golang/go ================================================ FILE: vendor/golang.org/x/text/encoding/charmap/charmap.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //go:generate go run maketables.go // Package charmap provides simple character encodings such as IBM Code Page 437 // and Windows 1252. package charmap // import "golang.org/x/text/encoding/charmap" import ( "unicode/utf8" "golang.org/x/text/encoding" "golang.org/x/text/encoding/internal" "golang.org/x/text/encoding/internal/identifier" "golang.org/x/text/transform" ) // These encodings vary only in the way clients should interpret them. Their // coded character set is identical and a single implementation can be shared. var ( // ISO8859_6E is the ISO 8859-6E encoding. ISO8859_6E encoding.Encoding = &iso8859_6E // ISO8859_6I is the ISO 8859-6I encoding. ISO8859_6I encoding.Encoding = &iso8859_6I // ISO8859_8E is the ISO 8859-8E encoding. ISO8859_8E encoding.Encoding = &iso8859_8E // ISO8859_8I is the ISO 8859-8I encoding. ISO8859_8I encoding.Encoding = &iso8859_8I iso8859_6E = internal.Encoding{ ISO8859_6, "ISO-8859-6E", identifier.ISO88596E, } iso8859_6I = internal.Encoding{ ISO8859_6, "ISO-8859-6I", identifier.ISO88596I, } iso8859_8E = internal.Encoding{ ISO8859_8, "ISO-8859-8E", identifier.ISO88598E, } iso8859_8I = internal.Encoding{ ISO8859_8, "ISO-8859-8I", identifier.ISO88598I, } ) // All is a list of all defined encodings in this package. var All = listAll // TODO: implement these encodings, in order of importance. // ASCII, ISO8859_1: Rather common. Close to Windows 1252. // ISO8859_9: Close to Windows 1254. // utf8Enc holds a rune's UTF-8 encoding in data[:len]. type utf8Enc struct { len uint8 data [3]byte } // charmap describes an 8-bit character set encoding. type charmap struct { // name is the encoding's name. name string // mib is the encoding type of this encoder. mib identifier.MIB // asciiSuperset states whether the encoding is a superset of ASCII. asciiSuperset bool // low is the lower bound of the encoded byte for a non-ASCII rune. If // charmap.asciiSuperset is true then this will be 0x80, otherwise 0x00. low uint8 // replacement is the encoded replacement character. replacement byte // decode is the map from encoded byte to UTF-8. decode [256]utf8Enc // encoding is the map from runes to encoded bytes. Each entry is a // uint32: the high 8 bits are the encoded byte and the low 24 bits are // the rune. The table entries are sorted by ascending rune. encode [256]uint32 } func (m *charmap) NewDecoder() *encoding.Decoder { return &encoding.Decoder{Transformer: charmapDecoder{charmap: m}} } func (m *charmap) NewEncoder() *encoding.Encoder { return &encoding.Encoder{Transformer: charmapEncoder{charmap: m}} } func (m *charmap) String() string { return m.name } func (m *charmap) ID() (mib identifier.MIB, other string) { return m.mib, "" } // charmapDecoder implements transform.Transformer by decoding to UTF-8. type charmapDecoder struct { transform.NopResetter charmap *charmap } func (m charmapDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { for i, c := range src { if m.charmap.asciiSuperset && c < utf8.RuneSelf { if nDst >= len(dst) { err = transform.ErrShortDst break } dst[nDst] = c nDst++ nSrc = i + 1 continue } decode := &m.charmap.decode[c] n := int(decode.len) if nDst+n > len(dst) { err = transform.ErrShortDst break } // It's 15% faster to avoid calling copy for these tiny slices. for j := 0; j < n; j++ { dst[nDst] = decode.data[j] nDst++ } nSrc = i + 1 } return nDst, nSrc, err } // charmapEncoder implements transform.Transformer by encoding from UTF-8. type charmapEncoder struct { transform.NopResetter charmap *charmap } func (m charmapEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { r, size := rune(0), 0 loop: for nSrc < len(src) { if nDst >= len(dst) { err = transform.ErrShortDst break } r = rune(src[nSrc]) // Decode a 1-byte rune. if r < utf8.RuneSelf { if m.charmap.asciiSuperset { nSrc++ dst[nDst] = uint8(r) nDst++ continue } size = 1 } else { // Decode a multi-byte rune. r, size = utf8.DecodeRune(src[nSrc:]) if size == 1 { // All valid runes of size 1 (those below utf8.RuneSelf) were // handled above. We have invalid UTF-8 or we haven't seen the // full character yet. if !atEOF && !utf8.FullRune(src[nSrc:]) { err = transform.ErrShortSrc } else { err = internal.RepertoireError(m.charmap.replacement) } break } } // Binary search in [low, high) for that rune in the m.charmap.encode table. for low, high := int(m.charmap.low), 0x100; ; { if low >= high { err = internal.RepertoireError(m.charmap.replacement) break loop } mid := (low + high) / 2 got := m.charmap.encode[mid] gotRune := rune(got & (1<<24 - 1)) if gotRune < r { low = mid + 1 } else if gotRune > r { high = mid } else { dst[nDst] = byte(got >> 24) nDst++ break } } nSrc += size } return nDst, nSrc, err } ================================================ FILE: vendor/golang.org/x/text/encoding/charmap/maketables.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build ignore package main import ( "bufio" "fmt" "log" "net/http" "sort" "strings" "unicode/utf8" "golang.org/x/text/encoding" "golang.org/x/text/internal/gen" ) const ascii = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" + "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" + ` !"#$%&'()*+,-./0123456789:;<=>?` + `@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_` + "`abcdefghijklmnopqrstuvwxyz{|}~\u007f" var encodings = []struct { name string mib string comment string varName string replacement byte mapping string }{ { "IBM Code Page 037", "IBM037", "", "CodePage037", 0x3f, "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM037-2.1.2.ucm", }, { "IBM Code Page 437", "PC8CodePage437", "", "CodePage437", encoding.ASCIISub, "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM437-2.1.2.ucm", }, { "IBM Code Page 850", "PC850Multilingual", "", "CodePage850", encoding.ASCIISub, "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM850-2.1.2.ucm", }, { "IBM Code Page 852", "PCp852", "", "CodePage852", encoding.ASCIISub, "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM852-2.1.2.ucm", }, { "IBM Code Page 855", "IBM855", "", "CodePage855", encoding.ASCIISub, "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM855-2.1.2.ucm", }, { "Windows Code Page 858", // PC latin1 with Euro "IBM00858", "", "CodePage858", encoding.ASCIISub, "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/windows-858-2000.ucm", }, { "IBM Code Page 860", "IBM860", "", "CodePage860", encoding.ASCIISub, "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM860-2.1.2.ucm", }, { "IBM Code Page 862", "PC862LatinHebrew", "", "CodePage862", encoding.ASCIISub, "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM862-2.1.2.ucm", }, { "IBM Code Page 863", "IBM863", "", "CodePage863", encoding.ASCIISub, "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM863-2.1.2.ucm", }, { "IBM Code Page 865", "IBM865", "", "CodePage865", encoding.ASCIISub, "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM865-2.1.2.ucm", }, { "IBM Code Page 866", "IBM866", "", "CodePage866", encoding.ASCIISub, "http://encoding.spec.whatwg.org/index-ibm866.txt", }, { "IBM Code Page 1047", "IBM1047", "", "CodePage1047", 0x3f, "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM1047-2.1.2.ucm", }, { "IBM Code Page 1140", "IBM01140", "", "CodePage1140", 0x3f, "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/ibm-1140_P100-1997.ucm", }, { "ISO 8859-1", "ISOLatin1", "", "ISO8859_1", encoding.ASCIISub, "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/iso-8859_1-1998.ucm", }, { "ISO 8859-2", "ISOLatin2", "", "ISO8859_2", encoding.ASCIISub, "http://encoding.spec.whatwg.org/index-iso-8859-2.txt", }, { "ISO 8859-3", "ISOLatin3", "", "ISO8859_3", encoding.ASCIISub, "http://encoding.spec.whatwg.org/index-iso-8859-3.txt", }, { "ISO 8859-4", "ISOLatin4", "", "ISO8859_4", encoding.ASCIISub, "http://encoding.spec.whatwg.org/index-iso-8859-4.txt", }, { "ISO 8859-5", "ISOLatinCyrillic", "", "ISO8859_5", encoding.ASCIISub, "http://encoding.spec.whatwg.org/index-iso-8859-5.txt", }, { "ISO 8859-6", "ISOLatinArabic", "", "ISO8859_6,ISO8859_6E,ISO8859_6I", encoding.ASCIISub, "http://encoding.spec.whatwg.org/index-iso-8859-6.txt", }, { "ISO 8859-7", "ISOLatinGreek", "", "ISO8859_7", encoding.ASCIISub, "http://encoding.spec.whatwg.org/index-iso-8859-7.txt", }, { "ISO 8859-8", "ISOLatinHebrew", "", "ISO8859_8,ISO8859_8E,ISO8859_8I", encoding.ASCIISub, "http://encoding.spec.whatwg.org/index-iso-8859-8.txt", }, { "ISO 8859-9", "ISOLatin5", "", "ISO8859_9", encoding.ASCIISub, "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/iso-8859_9-1999.ucm", }, { "ISO 8859-10", "ISOLatin6", "", "ISO8859_10", encoding.ASCIISub, "http://encoding.spec.whatwg.org/index-iso-8859-10.txt", }, { "ISO 8859-13", "ISO885913", "", "ISO8859_13", encoding.ASCIISub, "http://encoding.spec.whatwg.org/index-iso-8859-13.txt", }, { "ISO 8859-14", "ISO885914", "", "ISO8859_14", encoding.ASCIISub, "http://encoding.spec.whatwg.org/index-iso-8859-14.txt", }, { "ISO 8859-15", "ISO885915", "", "ISO8859_15", encoding.ASCIISub, "http://encoding.spec.whatwg.org/index-iso-8859-15.txt", }, { "ISO 8859-16", "ISO885916", "", "ISO8859_16", encoding.ASCIISub, "http://encoding.spec.whatwg.org/index-iso-8859-16.txt", }, { "KOI8-R", "KOI8R", "", "KOI8R", encoding.ASCIISub, "http://encoding.spec.whatwg.org/index-koi8-r.txt", }, { "KOI8-U", "KOI8U", "", "KOI8U", encoding.ASCIISub, "http://encoding.spec.whatwg.org/index-koi8-u.txt", }, { "Macintosh", "Macintosh", "", "Macintosh", encoding.ASCIISub, "http://encoding.spec.whatwg.org/index-macintosh.txt", }, { "Macintosh Cyrillic", "MacintoshCyrillic", "", "MacintoshCyrillic", encoding.ASCIISub, "http://encoding.spec.whatwg.org/index-x-mac-cyrillic.txt", }, { "Windows 874", "Windows874", "", "Windows874", encoding.ASCIISub, "http://encoding.spec.whatwg.org/index-windows-874.txt", }, { "Windows 1250", "Windows1250", "", "Windows1250", encoding.ASCIISub, "http://encoding.spec.whatwg.org/index-windows-1250.txt", }, { "Windows 1251", "Windows1251", "", "Windows1251", encoding.ASCIISub, "http://encoding.spec.whatwg.org/index-windows-1251.txt", }, { "Windows 1252", "Windows1252", "", "Windows1252", encoding.ASCIISub, "http://encoding.spec.whatwg.org/index-windows-1252.txt", }, { "Windows 1253", "Windows1253", "", "Windows1253", encoding.ASCIISub, "http://encoding.spec.whatwg.org/index-windows-1253.txt", }, { "Windows 1254", "Windows1254", "", "Windows1254", encoding.ASCIISub, "http://encoding.spec.whatwg.org/index-windows-1254.txt", }, { "Windows 1255", "Windows1255", "", "Windows1255", encoding.ASCIISub, "http://encoding.spec.whatwg.org/index-windows-1255.txt", }, { "Windows 1256", "Windows1256", "", "Windows1256", encoding.ASCIISub, "http://encoding.spec.whatwg.org/index-windows-1256.txt", }, { "Windows 1257", "Windows1257", "", "Windows1257", encoding.ASCIISub, "http://encoding.spec.whatwg.org/index-windows-1257.txt", }, { "Windows 1258", "Windows1258", "", "Windows1258", encoding.ASCIISub, "http://encoding.spec.whatwg.org/index-windows-1258.txt", }, { "X-User-Defined", "XUserDefined", "It is defined at http://encoding.spec.whatwg.org/#x-user-defined", "XUserDefined", encoding.ASCIISub, ascii + "\uf780\uf781\uf782\uf783\uf784\uf785\uf786\uf787" + "\uf788\uf789\uf78a\uf78b\uf78c\uf78d\uf78e\uf78f" + "\uf790\uf791\uf792\uf793\uf794\uf795\uf796\uf797" + "\uf798\uf799\uf79a\uf79b\uf79c\uf79d\uf79e\uf79f" + "\uf7a0\uf7a1\uf7a2\uf7a3\uf7a4\uf7a5\uf7a6\uf7a7" + "\uf7a8\uf7a9\uf7aa\uf7ab\uf7ac\uf7ad\uf7ae\uf7af" + "\uf7b0\uf7b1\uf7b2\uf7b3\uf7b4\uf7b5\uf7b6\uf7b7" + "\uf7b8\uf7b9\uf7ba\uf7bb\uf7bc\uf7bd\uf7be\uf7bf" + "\uf7c0\uf7c1\uf7c2\uf7c3\uf7c4\uf7c5\uf7c6\uf7c7" + "\uf7c8\uf7c9\uf7ca\uf7cb\uf7cc\uf7cd\uf7ce\uf7cf" + "\uf7d0\uf7d1\uf7d2\uf7d3\uf7d4\uf7d5\uf7d6\uf7d7" + "\uf7d8\uf7d9\uf7da\uf7db\uf7dc\uf7dd\uf7de\uf7df" + "\uf7e0\uf7e1\uf7e2\uf7e3\uf7e4\uf7e5\uf7e6\uf7e7" + "\uf7e8\uf7e9\uf7ea\uf7eb\uf7ec\uf7ed\uf7ee\uf7ef" + "\uf7f0\uf7f1\uf7f2\uf7f3\uf7f4\uf7f5\uf7f6\uf7f7" + "\uf7f8\uf7f9\uf7fa\uf7fb\uf7fc\uf7fd\uf7fe\uf7ff", }, } func getWHATWG(url string) string { res, err := http.Get(url) if err != nil { log.Fatalf("%q: Get: %v", url, err) } defer res.Body.Close() mapping := make([]rune, 128) for i := range mapping { mapping[i] = '\ufffd' } scanner := bufio.NewScanner(res.Body) for scanner.Scan() { s := strings.TrimSpace(scanner.Text()) if s == "" || s[0] == '#' { continue } x, y := 0, 0 if _, err := fmt.Sscanf(s, "%d\t0x%x", &x, &y); err != nil { log.Fatalf("could not parse %q", s) } if x < 0 || 128 <= x { log.Fatalf("code %d is out of range", x) } if 0x80 <= y && y < 0xa0 { // We diverge from the WHATWG spec by mapping control characters // in the range [0x80, 0xa0) to U+FFFD. continue } mapping[x] = rune(y) } return ascii + string(mapping) } func getUCM(url string) string { res, err := http.Get(url) if err != nil { log.Fatalf("%q: Get: %v", url, err) } defer res.Body.Close() mapping := make([]rune, 256) for i := range mapping { mapping[i] = '\ufffd' } charsFound := 0 scanner := bufio.NewScanner(res.Body) for scanner.Scan() { s := strings.TrimSpace(scanner.Text()) if s == "" || s[0] == '#' { continue } var c byte var r rune if _, err := fmt.Sscanf(s, `<U%x> \x%x |0`, &r, &c); err != nil { continue } mapping[c] = r charsFound++ } if charsFound < 200 { log.Fatalf("%q: only %d characters found (wrong page format?)", url, charsFound) } return string(mapping) } func main() { mibs := map[string]bool{} all := []string{} w := gen.NewCodeWriter() defer w.WriteGoFile("tables.go", "charmap") printf := func(s string, a ...interface{}) { fmt.Fprintf(w, s, a...) } printf("import (\n") printf("\t\"golang.org/x/text/encoding\"\n") printf("\t\"golang.org/x/text/encoding/internal/identifier\"\n") printf(")\n\n") for _, e := range encodings { varNames := strings.Split(e.varName, ",") all = append(all, varNames...) varName := varNames[0] switch { case strings.HasPrefix(e.mapping, "http://encoding.spec.whatwg.org/"): e.mapping = getWHATWG(e.mapping) case strings.HasPrefix(e.mapping, "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/"): e.mapping = getUCM(e.mapping) } asciiSuperset, low := strings.HasPrefix(e.mapping, ascii), 0x00 if asciiSuperset { low = 0x80 } lvn := 1 if strings.HasPrefix(varName, "ISO") || strings.HasPrefix(varName, "KOI") { lvn = 3 } lowerVarName := strings.ToLower(varName[:lvn]) + varName[lvn:] printf("// %s is the %s encoding.\n", varName, e.name) if e.comment != "" { printf("//\n// %s\n", e.comment) } printf("var %s encoding.Encoding = &%s\n\nvar %s = charmap{\nname: %q,\n", varName, lowerVarName, lowerVarName, e.name) if mibs[e.mib] { log.Fatalf("MIB type %q declared multiple times.", e.mib) } printf("mib: identifier.%s,\n", e.mib) printf("asciiSuperset: %t,\n", asciiSuperset) printf("low: 0x%02x,\n", low) printf("replacement: 0x%02x,\n", e.replacement) printf("decode: [256]utf8Enc{\n") i, backMapping := 0, map[rune]byte{} for _, c := range e.mapping { if _, ok := backMapping[c]; !ok && c != utf8.RuneError { backMapping[c] = byte(i) } var buf [8]byte n := utf8.EncodeRune(buf[:], c) if n > 3 { panic(fmt.Sprintf("rune %q (%U) is too long", c, c)) } printf("{%d,[3]byte{0x%02x,0x%02x,0x%02x}},", n, buf[0], buf[1], buf[2]) if i%2 == 1 { printf("\n") } i++ } printf("},\n") printf("encode: [256]uint32{\n") encode := make([]uint32, 0, 256) for c, i := range backMapping { encode = append(encode, uint32(i)<<24|uint32(c)) } sort.Sort(byRune(encode)) for len(encode) < cap(encode) { encode = append(encode, encode[len(encode)-1]) } for i, enc := range encode { printf("0x%08x,", enc) if i%8 == 7 { printf("\n") } } printf("},\n}\n") // Add an estimate of the size of a single charmap{} struct value, which // includes two 256 elem arrays of 4 bytes and some extra fields, which // align to 3 uint64s on 64-bit architectures. w.Size += 2*4*256 + 3*8 } // TODO: add proper line breaking. printf("var listAll = []encoding.Encoding{\n%s,\n}\n\n", strings.Join(all, ",\n")) } type byRune []uint32 func (b byRune) Len() int { return len(b) } func (b byRune) Less(i, j int) bool { return b[i]&0xffffff < b[j]&0xffffff } func (b byRune) Swap(i, j int) { b[i], b[j] = b[j], b[i] } ================================================ FILE: vendor/golang.org/x/text/encoding/charmap/tables.go ================================================ // This file was generated by go generate; DO NOT EDIT package charmap import ( "golang.org/x/text/encoding" "golang.org/x/text/encoding/internal/identifier" ) // CodePage037 is the IBM Code Page 037 encoding. var CodePage037 encoding.Encoding = &codePage037 var codePage037 = charmap{ name: "IBM Code Page 037", mib: identifier.IBM037, asciiSuperset: false, low: 0x00, replacement: 0x3f, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x9c, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x86, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x97, 0x00}}, {2, [3]byte{0xc2, 0x8d, 0x00}}, {2, [3]byte{0xc2, 0x8e, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x9d, 0x00}}, {2, [3]byte{0xc2, 0x85, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x87, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x92, 0x00}}, {2, [3]byte{0xc2, 0x8f, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x80, 0x00}}, {2, [3]byte{0xc2, 0x81, 0x00}}, {2, [3]byte{0xc2, 0x82, 0x00}}, {2, [3]byte{0xc2, 0x83, 0x00}}, {2, [3]byte{0xc2, 0x84, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x88, 0x00}}, {2, [3]byte{0xc2, 0x89, 0x00}}, {2, [3]byte{0xc2, 0x8a, 0x00}}, {2, [3]byte{0xc2, 0x8b, 0x00}}, {2, [3]byte{0xc2, 0x8c, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x90, 0x00}}, {2, [3]byte{0xc2, 0x91, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x93, 0x00}}, {2, [3]byte{0xc2, 0x94, 0x00}}, {2, [3]byte{0xc2, 0x95, 0x00}}, {2, [3]byte{0xc2, 0x96, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x98, 0x00}}, {2, [3]byte{0xc2, 0x99, 0x00}}, {2, [3]byte{0xc2, 0x9a, 0x00}}, {2, [3]byte{0xc2, 0x9b, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x9e, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc2, 0xa2, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, {2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xac, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}}, {2, [3]byte{0xc2, 0xa6, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, {2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}}, {2, [3]byte{0xc3, 0x8c, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {2, [3]byte{0xc3, 0x98, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xb0, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}}, {2, [3]byte{0xc3, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}}, {2, [3]byte{0xc3, 0x90, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}}, {2, [3]byte{0xc3, 0x9e, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xbe, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}}, {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc2, 0x9f, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x37000004, 0x2d000005, 0x2e000006, 0x2f000007, 0x16000008, 0x05000009, 0x2500000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x3c000014, 0x3d000015, 0x32000016, 0x26000017, 0x18000018, 0x19000019, 0x3f00001a, 0x2700001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x40000020, 0x5a000021, 0x7f000022, 0x7b000023, 0x5b000024, 0x6c000025, 0x50000026, 0x7d000027, 0x4d000028, 0x5d000029, 0x5c00002a, 0x4e00002b, 0x6b00002c, 0x6000002d, 0x4b00002e, 0x6100002f, 0xf0000030, 0xf1000031, 0xf2000032, 0xf3000033, 0xf4000034, 0xf5000035, 0xf6000036, 0xf7000037, 0xf8000038, 0xf9000039, 0x7a00003a, 0x5e00003b, 0x4c00003c, 0x7e00003d, 0x6e00003e, 0x6f00003f, 0x7c000040, 0xc1000041, 0xc2000042, 0xc3000043, 0xc4000044, 0xc5000045, 0xc6000046, 0xc7000047, 0xc8000048, 0xc9000049, 0xd100004a, 0xd200004b, 0xd300004c, 0xd400004d, 0xd500004e, 0xd600004f, 0xd7000050, 0xd8000051, 0xd9000052, 0xe2000053, 0xe3000054, 0xe4000055, 0xe5000056, 0xe6000057, 0xe7000058, 0xe8000059, 0xe900005a, 0xba00005b, 0xe000005c, 0xbb00005d, 0xb000005e, 0x6d00005f, 0x79000060, 0x81000061, 0x82000062, 0x83000063, 0x84000064, 0x85000065, 0x86000066, 0x87000067, 0x88000068, 0x89000069, 0x9100006a, 0x9200006b, 0x9300006c, 0x9400006d, 0x9500006e, 0x9600006f, 0x97000070, 0x98000071, 0x99000072, 0xa2000073, 0xa3000074, 0xa4000075, 0xa5000076, 0xa6000077, 0xa7000078, 0xa8000079, 0xa900007a, 0xc000007b, 0x4f00007c, 0xd000007d, 0xa100007e, 0x0700007f, 0x20000080, 0x21000081, 0x22000082, 0x23000083, 0x24000084, 0x15000085, 0x06000086, 0x17000087, 0x28000088, 0x29000089, 0x2a00008a, 0x2b00008b, 0x2c00008c, 0x0900008d, 0x0a00008e, 0x1b00008f, 0x30000090, 0x31000091, 0x1a000092, 0x33000093, 0x34000094, 0x35000095, 0x36000096, 0x08000097, 0x38000098, 0x39000099, 0x3a00009a, 0x3b00009b, 0x0400009c, 0x1400009d, 0x3e00009e, 0xff00009f, 0x410000a0, 0xaa0000a1, 0x4a0000a2, 0xb10000a3, 0x9f0000a4, 0xb20000a5, 0x6a0000a6, 0xb50000a7, 0xbd0000a8, 0xb40000a9, 0x9a0000aa, 0x8a0000ab, 0x5f0000ac, 0xca0000ad, 0xaf0000ae, 0xbc0000af, 0x900000b0, 0x8f0000b1, 0xea0000b2, 0xfa0000b3, 0xbe0000b4, 0xa00000b5, 0xb60000b6, 0xb30000b7, 0x9d0000b8, 0xda0000b9, 0x9b0000ba, 0x8b0000bb, 0xb70000bc, 0xb80000bd, 0xb90000be, 0xab0000bf, 0x640000c0, 0x650000c1, 0x620000c2, 0x660000c3, 0x630000c4, 0x670000c5, 0x9e0000c6, 0x680000c7, 0x740000c8, 0x710000c9, 0x720000ca, 0x730000cb, 0x780000cc, 0x750000cd, 0x760000ce, 0x770000cf, 0xac0000d0, 0x690000d1, 0xed0000d2, 0xee0000d3, 0xeb0000d4, 0xef0000d5, 0xec0000d6, 0xbf0000d7, 0x800000d8, 0xfd0000d9, 0xfe0000da, 0xfb0000db, 0xfc0000dc, 0xad0000dd, 0xae0000de, 0x590000df, 0x440000e0, 0x450000e1, 0x420000e2, 0x460000e3, 0x430000e4, 0x470000e5, 0x9c0000e6, 0x480000e7, 0x540000e8, 0x510000e9, 0x520000ea, 0x530000eb, 0x580000ec, 0x550000ed, 0x560000ee, 0x570000ef, 0x8c0000f0, 0x490000f1, 0xcd0000f2, 0xce0000f3, 0xcb0000f4, 0xcf0000f5, 0xcc0000f6, 0xe10000f7, 0x700000f8, 0xdd0000f9, 0xde0000fa, 0xdb0000fb, 0xdc0000fc, 0x8d0000fd, 0x8e0000fe, 0xdf0000ff, }, } // CodePage437 is the IBM Code Page 437 encoding. var CodePage437 encoding.Encoding = &codePage437 var codePage437 = charmap{ name: "IBM Code Page 437", mib: identifier.PC8CodePage437, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, {3, [3]byte{0xe2, 0x82, 0xa7}}, {2, [3]byte{0xc6, 0x92, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}}, {2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}}, {3, [3]byte{0xe2, 0x8c, 0x90}}, {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}}, {3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x94, 0x82}}, {3, [3]byte{0xe2, 0x94, 0xa4}}, {3, [3]byte{0xe2, 0x95, 0xa1}}, {3, [3]byte{0xe2, 0x95, 0xa2}}, {3, [3]byte{0xe2, 0x95, 0x96}}, {3, [3]byte{0xe2, 0x95, 0x95}}, {3, [3]byte{0xe2, 0x95, 0xa3}}, {3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x97}}, {3, [3]byte{0xe2, 0x95, 0x9d}}, {3, [3]byte{0xe2, 0x95, 0x9c}}, {3, [3]byte{0xe2, 0x95, 0x9b}}, {3, [3]byte{0xe2, 0x94, 0x90}}, {3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0xb4}}, {3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0x9c}}, {3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0xbc}}, {3, [3]byte{0xe2, 0x95, 0x9e}}, {3, [3]byte{0xe2, 0x95, 0x9f}}, {3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x94}}, {3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xa6}}, {3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0x90}}, {3, [3]byte{0xe2, 0x95, 0xac}}, {3, [3]byte{0xe2, 0x95, 0xa7}}, {3, [3]byte{0xe2, 0x95, 0xa8}}, {3, [3]byte{0xe2, 0x95, 0xa4}}, {3, [3]byte{0xe2, 0x95, 0xa5}}, {3, [3]byte{0xe2, 0x95, 0x99}}, {3, [3]byte{0xe2, 0x95, 0x98}}, {3, [3]byte{0xe2, 0x95, 0x92}}, {3, [3]byte{0xe2, 0x95, 0x93}}, {3, [3]byte{0xe2, 0x95, 0xab}}, {3, [3]byte{0xe2, 0x95, 0xaa}}, {3, [3]byte{0xe2, 0x94, 0x98}}, {3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x88}}, {3, [3]byte{0xe2, 0x96, 0x84}}, {3, [3]byte{0xe2, 0x96, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x90}}, {3, [3]byte{0xe2, 0x96, 0x80}}, {2, [3]byte{0xce, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, {2, [3]byte{0xce, 0x93, 0x00}}, {2, [3]byte{0xcf, 0x80, 0x00}}, {2, [3]byte{0xce, 0xa3, 0x00}}, {2, [3]byte{0xcf, 0x83, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xcf, 0x84, 0x00}}, {2, [3]byte{0xce, 0xa6, 0x00}}, {2, [3]byte{0xce, 0x98, 0x00}}, {2, [3]byte{0xce, 0xa9, 0x00}}, {2, [3]byte{0xce, 0xb4, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x9e}}, {2, [3]byte{0xcf, 0x86, 0x00}}, {2, [3]byte{0xce, 0xb5, 0x00}}, {3, [3]byte{0xe2, 0x88, 0xa9}}, {3, [3]byte{0xe2, 0x89, 0xa1}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, {3, [3]byte{0xe2, 0x89, 0xa5}}, {3, [3]byte{0xe2, 0x89, 0xa4}}, {3, [3]byte{0xe2, 0x8c, 0xa0}}, {3, [3]byte{0xe2, 0x8c, 0xa1}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x89, 0x88}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x99}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x9a}}, {3, [3]byte{0xe2, 0x81, 0xbf}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, {3, [3]byte{0xe2, 0x96, 0xa0}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xff0000a0, 0xad0000a1, 0x9b0000a2, 0x9c0000a3, 0x9d0000a5, 0xa60000aa, 0xae0000ab, 0xaa0000ac, 0xf80000b0, 0xf10000b1, 0xfd0000b2, 0xe60000b5, 0xfa0000b7, 0xa70000ba, 0xaf0000bb, 0xac0000bc, 0xab0000bd, 0xa80000bf, 0x8e0000c4, 0x8f0000c5, 0x920000c6, 0x800000c7, 0x900000c9, 0xa50000d1, 0x990000d6, 0x9a0000dc, 0xe10000df, 0x850000e0, 0xa00000e1, 0x830000e2, 0x840000e4, 0x860000e5, 0x910000e6, 0x870000e7, 0x8a0000e8, 0x820000e9, 0x880000ea, 0x890000eb, 0x8d0000ec, 0xa10000ed, 0x8c0000ee, 0x8b0000ef, 0xa40000f1, 0x950000f2, 0xa20000f3, 0x930000f4, 0x940000f6, 0xf60000f7, 0x970000f9, 0xa30000fa, 0x960000fb, 0x810000fc, 0x980000ff, 0x9f000192, 0xe2000393, 0xe9000398, 0xe40003a3, 0xe80003a6, 0xea0003a9, 0xe00003b1, 0xeb0003b4, 0xee0003b5, 0xe30003c0, 0xe50003c3, 0xe70003c4, 0xed0003c6, 0xfc00207f, 0x9e0020a7, 0xf9002219, 0xfb00221a, 0xec00221e, 0xef002229, 0xf7002248, 0xf0002261, 0xf3002264, 0xf2002265, 0xa9002310, 0xf4002320, 0xf5002321, 0xc4002500, 0xb3002502, 0xda00250c, 0xbf002510, 0xc0002514, 0xd9002518, 0xc300251c, 0xb4002524, 0xc200252c, 0xc1002534, 0xc500253c, 0xcd002550, 0xba002551, 0xd5002552, 0xd6002553, 0xc9002554, 0xb8002555, 0xb7002556, 0xbb002557, 0xd4002558, 0xd3002559, 0xc800255a, 0xbe00255b, 0xbd00255c, 0xbc00255d, 0xc600255e, 0xc700255f, 0xcc002560, 0xb5002561, 0xb6002562, 0xb9002563, 0xd1002564, 0xd2002565, 0xcb002566, 0xcf002567, 0xd0002568, 0xca002569, 0xd800256a, 0xd700256b, 0xce00256c, 0xdf002580, 0xdc002584, 0xdb002588, 0xdd00258c, 0xde002590, 0xb0002591, 0xb1002592, 0xb2002593, 0xfe0025a0, }, } // CodePage850 is the IBM Code Page 850 encoding. var CodePage850 encoding.Encoding = &codePage850 var codePage850 = charmap{ name: "IBM Code Page 850", mib: identifier.PC850Multilingual, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, {2, [3]byte{0xc6, 0x92, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}}, {2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}}, {3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x94, 0x82}}, {3, [3]byte{0xe2, 0x94, 0xa4}}, {2, [3]byte{0xc3, 0x81, 0x00}}, {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, {3, [3]byte{0xe2, 0x95, 0xa3}}, {3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x97}}, {3, [3]byte{0xe2, 0x95, 0x9d}}, {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, {3, [3]byte{0xe2, 0x94, 0x90}}, {3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0xb4}}, {3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0x9c}}, {3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0xbc}}, {2, [3]byte{0xc3, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}}, {3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x94}}, {3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xa6}}, {3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0x90}}, {3, [3]byte{0xe2, 0x95, 0xac}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xb0, 0x00}}, {2, [3]byte{0xc3, 0x90, 0x00}}, {2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, {2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc4, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}}, {3, [3]byte{0xe2, 0x94, 0x98}}, {3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x88}}, {3, [3]byte{0xe2, 0x96, 0x84}}, {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0x8c, 0x00}}, {3, [3]byte{0xe2, 0x96, 0x80}}, {2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xc3, 0xbe, 0x00}}, {2, [3]byte{0xc3, 0x9e, 0x00}}, {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}}, {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x97}}, {2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, {3, [3]byte{0xe2, 0x96, 0xa0}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xff0000a0, 0xad0000a1, 0xbd0000a2, 0x9c0000a3, 0xcf0000a4, 0xbe0000a5, 0xdd0000a6, 0xf50000a7, 0xf90000a8, 0xb80000a9, 0xa60000aa, 0xae0000ab, 0xaa0000ac, 0xf00000ad, 0xa90000ae, 0xee0000af, 0xf80000b0, 0xf10000b1, 0xfd0000b2, 0xfc0000b3, 0xef0000b4, 0xe60000b5, 0xf40000b6, 0xfa0000b7, 0xf70000b8, 0xfb0000b9, 0xa70000ba, 0xaf0000bb, 0xac0000bc, 0xab0000bd, 0xf30000be, 0xa80000bf, 0xb70000c0, 0xb50000c1, 0xb60000c2, 0xc70000c3, 0x8e0000c4, 0x8f0000c5, 0x920000c6, 0x800000c7, 0xd40000c8, 0x900000c9, 0xd20000ca, 0xd30000cb, 0xde0000cc, 0xd60000cd, 0xd70000ce, 0xd80000cf, 0xd10000d0, 0xa50000d1, 0xe30000d2, 0xe00000d3, 0xe20000d4, 0xe50000d5, 0x990000d6, 0x9e0000d7, 0x9d0000d8, 0xeb0000d9, 0xe90000da, 0xea0000db, 0x9a0000dc, 0xed0000dd, 0xe80000de, 0xe10000df, 0x850000e0, 0xa00000e1, 0x830000e2, 0xc60000e3, 0x840000e4, 0x860000e5, 0x910000e6, 0x870000e7, 0x8a0000e8, 0x820000e9, 0x880000ea, 0x890000eb, 0x8d0000ec, 0xa10000ed, 0x8c0000ee, 0x8b0000ef, 0xd00000f0, 0xa40000f1, 0x950000f2, 0xa20000f3, 0x930000f4, 0xe40000f5, 0x940000f6, 0xf60000f7, 0x9b0000f8, 0x970000f9, 0xa30000fa, 0x960000fb, 0x810000fc, 0xec0000fd, 0xe70000fe, 0x980000ff, 0xd5000131, 0x9f000192, 0xf2002017, 0xc4002500, 0xb3002502, 0xda00250c, 0xbf002510, 0xc0002514, 0xd9002518, 0xc300251c, 0xb4002524, 0xc200252c, 0xc1002534, 0xc500253c, 0xcd002550, 0xba002551, 0xc9002554, 0xbb002557, 0xc800255a, 0xbc00255d, 0xcc002560, 0xb9002563, 0xcb002566, 0xca002569, 0xce00256c, 0xdf002580, 0xdc002584, 0xdb002588, 0xb0002591, 0xb1002592, 0xb2002593, 0xfe0025a0, }, } // CodePage852 is the IBM Code Page 852 encoding. var CodePage852 encoding.Encoding = &codePage852 var codePage852 = charmap{ name: "IBM Code Page 852", mib: identifier.PCp852, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc5, 0xaf, 0x00}}, {2, [3]byte{0xc4, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, {2, [3]byte{0xc5, 0x82, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, {2, [3]byte{0xc5, 0x90, 0x00}}, {2, [3]byte{0xc5, 0x91, 0x00}}, {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc5, 0xb9, 0x00}}, {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc4, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc4, 0xb9, 0x00}}, {2, [3]byte{0xc4, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc4, 0xbd, 0x00}}, {2, [3]byte{0xc4, 0xbe, 0x00}}, {2, [3]byte{0xc5, 0x9a, 0x00}}, {2, [3]byte{0xc5, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc5, 0xa4, 0x00}}, {2, [3]byte{0xc5, 0xa5, 0x00}}, {2, [3]byte{0xc5, 0x81, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, {2, [3]byte{0xc4, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc4, 0x84, 0x00}}, {2, [3]byte{0xc4, 0x85, 0x00}}, {2, [3]byte{0xc5, 0xbd, 0x00}}, {2, [3]byte{0xc5, 0xbe, 0x00}}, {2, [3]byte{0xc4, 0x98, 0x00}}, {2, [3]byte{0xc4, 0x99, 0x00}}, {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc5, 0xba, 0x00}}, {2, [3]byte{0xc4, 0x8c, 0x00}}, {2, [3]byte{0xc5, 0x9f, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}}, {3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x94, 0x82}}, {3, [3]byte{0xe2, 0x94, 0xa4}}, {2, [3]byte{0xc3, 0x81, 0x00}}, {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc4, 0x9a, 0x00}}, {2, [3]byte{0xc5, 0x9e, 0x00}}, {3, [3]byte{0xe2, 0x95, 0xa3}}, {3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x97}}, {3, [3]byte{0xe2, 0x95, 0x9d}}, {2, [3]byte{0xc5, 0xbb, 0x00}}, {2, [3]byte{0xc5, 0xbc, 0x00}}, {3, [3]byte{0xe2, 0x94, 0x90}}, {3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0xb4}}, {3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0x9c}}, {3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0xbc}}, {2, [3]byte{0xc4, 0x82, 0x00}}, {2, [3]byte{0xc4, 0x83, 0x00}}, {3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x94}}, {3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xa6}}, {3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0x90}}, {3, [3]byte{0xe2, 0x95, 0xac}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc4, 0x91, 0x00}}, {2, [3]byte{0xc4, 0x90, 0x00}}, {2, [3]byte{0xc4, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, {2, [3]byte{0xc4, 0x8f, 0x00}}, {2, [3]byte{0xc5, 0x87, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc4, 0x9b, 0x00}}, {3, [3]byte{0xe2, 0x94, 0x98}}, {3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x88}}, {3, [3]byte{0xe2, 0x96, 0x84}}, {2, [3]byte{0xc5, 0xa2, 0x00}}, {2, [3]byte{0xc5, 0xae, 0x00}}, {3, [3]byte{0xe2, 0x96, 0x80}}, {2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc5, 0x83, 0x00}}, {2, [3]byte{0xc5, 0x84, 0x00}}, {2, [3]byte{0xc5, 0x88, 0x00}}, {2, [3]byte{0xc5, 0xa0, 0x00}}, {2, [3]byte{0xc5, 0xa1, 0x00}}, {2, [3]byte{0xc5, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc5, 0x95, 0x00}}, {2, [3]byte{0xc5, 0xb0, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}}, {2, [3]byte{0xc5, 0xa3, 0x00}}, {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xcb, 0x9d, 0x00}}, {2, [3]byte{0xcb, 0x9b, 0x00}}, {2, [3]byte{0xcb, 0x87, 0x00}}, {2, [3]byte{0xcb, 0x98, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xcb, 0x99, 0x00}}, {2, [3]byte{0xc5, 0xb1, 0x00}}, {2, [3]byte{0xc5, 0x98, 0x00}}, {2, [3]byte{0xc5, 0x99, 0x00}}, {3, [3]byte{0xe2, 0x96, 0xa0}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xff0000a0, 0xcf0000a4, 0xf50000a7, 0xf90000a8, 0xae0000ab, 0xaa0000ac, 0xf00000ad, 0xf80000b0, 0xef0000b4, 0xf70000b8, 0xaf0000bb, 0xb50000c1, 0xb60000c2, 0x8e0000c4, 0x800000c7, 0x900000c9, 0xd30000cb, 0xd60000cd, 0xd70000ce, 0xe00000d3, 0xe20000d4, 0x990000d6, 0x9e0000d7, 0xe90000da, 0x9a0000dc, 0xed0000dd, 0xe10000df, 0xa00000e1, 0x830000e2, 0x840000e4, 0x870000e7, 0x820000e9, 0x890000eb, 0xa10000ed, 0x8c0000ee, 0xa20000f3, 0x930000f4, 0x940000f6, 0xf60000f7, 0xa30000fa, 0x810000fc, 0xec0000fd, 0xc6000102, 0xc7000103, 0xa4000104, 0xa5000105, 0x8f000106, 0x86000107, 0xac00010c, 0x9f00010d, 0xd200010e, 0xd400010f, 0xd1000110, 0xd0000111, 0xa8000118, 0xa9000119, 0xb700011a, 0xd800011b, 0x91000139, 0x9200013a, 0x9500013d, 0x9600013e, 0x9d000141, 0x88000142, 0xe3000143, 0xe4000144, 0xd5000147, 0xe5000148, 0x8a000150, 0x8b000151, 0xe8000154, 0xea000155, 0xfc000158, 0xfd000159, 0x9700015a, 0x9800015b, 0xb800015e, 0xad00015f, 0xe6000160, 0xe7000161, 0xdd000162, 0xee000163, 0x9b000164, 0x9c000165, 0xde00016e, 0x8500016f, 0xeb000170, 0xfb000171, 0x8d000179, 0xab00017a, 0xbd00017b, 0xbe00017c, 0xa600017d, 0xa700017e, 0xf30002c7, 0xf40002d8, 0xfa0002d9, 0xf20002db, 0xf10002dd, 0xc4002500, 0xb3002502, 0xda00250c, 0xbf002510, 0xc0002514, 0xd9002518, 0xc300251c, 0xb4002524, 0xc200252c, 0xc1002534, 0xc500253c, 0xcd002550, 0xba002551, 0xc9002554, 0xbb002557, 0xc800255a, 0xbc00255d, 0xcc002560, 0xb9002563, 0xcb002566, 0xca002569, 0xce00256c, 0xdf002580, 0xdc002584, 0xdb002588, 0xb0002591, 0xb1002592, 0xb2002593, 0xfe0025a0, }, } // CodePage855 is the IBM Code Page 855 encoding. var CodePage855 encoding.Encoding = &codePage855 var codePage855 = charmap{ name: "IBM Code Page 855", mib: identifier.IBM855, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {2, [3]byte{0xd1, 0x92, 0x00}}, {2, [3]byte{0xd0, 0x82, 0x00}}, {2, [3]byte{0xd1, 0x93, 0x00}}, {2, [3]byte{0xd0, 0x83, 0x00}}, {2, [3]byte{0xd1, 0x91, 0x00}}, {2, [3]byte{0xd0, 0x81, 0x00}}, {2, [3]byte{0xd1, 0x94, 0x00}}, {2, [3]byte{0xd0, 0x84, 0x00}}, {2, [3]byte{0xd1, 0x95, 0x00}}, {2, [3]byte{0xd0, 0x85, 0x00}}, {2, [3]byte{0xd1, 0x96, 0x00}}, {2, [3]byte{0xd0, 0x86, 0x00}}, {2, [3]byte{0xd1, 0x97, 0x00}}, {2, [3]byte{0xd0, 0x87, 0x00}}, {2, [3]byte{0xd1, 0x98, 0x00}}, {2, [3]byte{0xd0, 0x88, 0x00}}, {2, [3]byte{0xd1, 0x99, 0x00}}, {2, [3]byte{0xd0, 0x89, 0x00}}, {2, [3]byte{0xd1, 0x9a, 0x00}}, {2, [3]byte{0xd0, 0x8a, 0x00}}, {2, [3]byte{0xd1, 0x9b, 0x00}}, {2, [3]byte{0xd0, 0x8b, 0x00}}, {2, [3]byte{0xd1, 0x9c, 0x00}}, {2, [3]byte{0xd0, 0x8c, 0x00}}, {2, [3]byte{0xd1, 0x9e, 0x00}}, {2, [3]byte{0xd0, 0x8e, 0x00}}, {2, [3]byte{0xd1, 0x9f, 0x00}}, {2, [3]byte{0xd0, 0x8f, 0x00}}, {2, [3]byte{0xd1, 0x8e, 0x00}}, {2, [3]byte{0xd0, 0xae, 0x00}}, {2, [3]byte{0xd1, 0x8a, 0x00}}, {2, [3]byte{0xd0, 0xaa, 0x00}}, {2, [3]byte{0xd0, 0xb0, 0x00}}, {2, [3]byte{0xd0, 0x90, 0x00}}, {2, [3]byte{0xd0, 0xb1, 0x00}}, {2, [3]byte{0xd0, 0x91, 0x00}}, {2, [3]byte{0xd1, 0x86, 0x00}}, {2, [3]byte{0xd0, 0xa6, 0x00}}, {2, [3]byte{0xd0, 0xb4, 0x00}}, {2, [3]byte{0xd0, 0x94, 0x00}}, {2, [3]byte{0xd0, 0xb5, 0x00}}, {2, [3]byte{0xd0, 0x95, 0x00}}, {2, [3]byte{0xd1, 0x84, 0x00}}, {2, [3]byte{0xd0, 0xa4, 0x00}}, {2, [3]byte{0xd0, 0xb3, 0x00}}, {2, [3]byte{0xd0, 0x93, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}}, {3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x94, 0x82}}, {3, [3]byte{0xe2, 0x94, 0xa4}}, {2, [3]byte{0xd1, 0x85, 0x00}}, {2, [3]byte{0xd0, 0xa5, 0x00}}, {2, [3]byte{0xd0, 0xb8, 0x00}}, {2, [3]byte{0xd0, 0x98, 0x00}}, {3, [3]byte{0xe2, 0x95, 0xa3}}, {3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x97}}, {3, [3]byte{0xe2, 0x95, 0x9d}}, {2, [3]byte{0xd0, 0xb9, 0x00}}, {2, [3]byte{0xd0, 0x99, 0x00}}, {3, [3]byte{0xe2, 0x94, 0x90}}, {3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0xb4}}, {3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0x9c}}, {3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0xbc}}, {2, [3]byte{0xd0, 0xba, 0x00}}, {2, [3]byte{0xd0, 0x9a, 0x00}}, {3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x94}}, {3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xa6}}, {3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0x90}}, {3, [3]byte{0xe2, 0x95, 0xac}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xd0, 0xbb, 0x00}}, {2, [3]byte{0xd0, 0x9b, 0x00}}, {2, [3]byte{0xd0, 0xbc, 0x00}}, {2, [3]byte{0xd0, 0x9c, 0x00}}, {2, [3]byte{0xd0, 0xbd, 0x00}}, {2, [3]byte{0xd0, 0x9d, 0x00}}, {2, [3]byte{0xd0, 0xbe, 0x00}}, {2, [3]byte{0xd0, 0x9e, 0x00}}, {2, [3]byte{0xd0, 0xbf, 0x00}}, {3, [3]byte{0xe2, 0x94, 0x98}}, {3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x88}}, {3, [3]byte{0xe2, 0x96, 0x84}}, {2, [3]byte{0xd0, 0x9f, 0x00}}, {2, [3]byte{0xd1, 0x8f, 0x00}}, {3, [3]byte{0xe2, 0x96, 0x80}}, {2, [3]byte{0xd0, 0xaf, 0x00}}, {2, [3]byte{0xd1, 0x80, 0x00}}, {2, [3]byte{0xd0, 0xa0, 0x00}}, {2, [3]byte{0xd1, 0x81, 0x00}}, {2, [3]byte{0xd0, 0xa1, 0x00}}, {2, [3]byte{0xd1, 0x82, 0x00}}, {2, [3]byte{0xd0, 0xa2, 0x00}}, {2, [3]byte{0xd1, 0x83, 0x00}}, {2, [3]byte{0xd0, 0xa3, 0x00}}, {2, [3]byte{0xd0, 0xb6, 0x00}}, {2, [3]byte{0xd0, 0x96, 0x00}}, {2, [3]byte{0xd0, 0xb2, 0x00}}, {2, [3]byte{0xd0, 0x92, 0x00}}, {2, [3]byte{0xd1, 0x8c, 0x00}}, {2, [3]byte{0xd0, 0xac, 0x00}}, {3, [3]byte{0xe2, 0x84, 0x96}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xd1, 0x8b, 0x00}}, {2, [3]byte{0xd0, 0xab, 0x00}}, {2, [3]byte{0xd0, 0xb7, 0x00}}, {2, [3]byte{0xd0, 0x97, 0x00}}, {2, [3]byte{0xd1, 0x88, 0x00}}, {2, [3]byte{0xd0, 0xa8, 0x00}}, {2, [3]byte{0xd1, 0x8d, 0x00}}, {2, [3]byte{0xd0, 0xad, 0x00}}, {2, [3]byte{0xd1, 0x89, 0x00}}, {2, [3]byte{0xd0, 0xa9, 0x00}}, {2, [3]byte{0xd1, 0x87, 0x00}}, {2, [3]byte{0xd0, 0xa7, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {3, [3]byte{0xe2, 0x96, 0xa0}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xff0000a0, 0xcf0000a4, 0xfd0000a7, 0xae0000ab, 0xf00000ad, 0xaf0000bb, 0x85000401, 0x81000402, 0x83000403, 0x87000404, 0x89000405, 0x8b000406, 0x8d000407, 0x8f000408, 0x91000409, 0x9300040a, 0x9500040b, 0x9700040c, 0x9900040e, 0x9b00040f, 0xa1000410, 0xa3000411, 0xec000412, 0xad000413, 0xa7000414, 0xa9000415, 0xea000416, 0xf4000417, 0xb8000418, 0xbe000419, 0xc700041a, 0xd100041b, 0xd300041c, 0xd500041d, 0xd700041e, 0xdd00041f, 0xe2000420, 0xe4000421, 0xe6000422, 0xe8000423, 0xab000424, 0xb6000425, 0xa5000426, 0xfc000427, 0xf6000428, 0xfa000429, 0x9f00042a, 0xf200042b, 0xee00042c, 0xf800042d, 0x9d00042e, 0xe000042f, 0xa0000430, 0xa2000431, 0xeb000432, 0xac000433, 0xa6000434, 0xa8000435, 0xe9000436, 0xf3000437, 0xb7000438, 0xbd000439, 0xc600043a, 0xd000043b, 0xd200043c, 0xd400043d, 0xd600043e, 0xd800043f, 0xe1000440, 0xe3000441, 0xe5000442, 0xe7000443, 0xaa000444, 0xb5000445, 0xa4000446, 0xfb000447, 0xf5000448, 0xf9000449, 0x9e00044a, 0xf100044b, 0xed00044c, 0xf700044d, 0x9c00044e, 0xde00044f, 0x84000451, 0x80000452, 0x82000453, 0x86000454, 0x88000455, 0x8a000456, 0x8c000457, 0x8e000458, 0x90000459, 0x9200045a, 0x9400045b, 0x9600045c, 0x9800045e, 0x9a00045f, 0xef002116, 0xc4002500, 0xb3002502, 0xda00250c, 0xbf002510, 0xc0002514, 0xd9002518, 0xc300251c, 0xb4002524, 0xc200252c, 0xc1002534, 0xc500253c, 0xcd002550, 0xba002551, 0xc9002554, 0xbb002557, 0xc800255a, 0xbc00255d, 0xcc002560, 0xb9002563, 0xcb002566, 0xca002569, 0xce00256c, 0xdf002580, 0xdc002584, 0xdb002588, 0xb0002591, 0xb1002592, 0xb2002593, 0xfe0025a0, }, } // CodePage858 is the Windows Code Page 858 encoding. var CodePage858 encoding.Encoding = &codePage858 var codePage858 = charmap{ name: "Windows Code Page 858", mib: identifier.IBM00858, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, {2, [3]byte{0xc6, 0x92, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}}, {2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}}, {3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x94, 0x82}}, {3, [3]byte{0xe2, 0x94, 0xa4}}, {2, [3]byte{0xc3, 0x81, 0x00}}, {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, {3, [3]byte{0xe2, 0x95, 0xa3}}, {3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x97}}, {3, [3]byte{0xe2, 0x95, 0x9d}}, {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, {3, [3]byte{0xe2, 0x94, 0x90}}, {3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0xb4}}, {3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0x9c}}, {3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0xbc}}, {2, [3]byte{0xc3, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}}, {3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x94}}, {3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xa6}}, {3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0x90}}, {3, [3]byte{0xe2, 0x95, 0xac}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xb0, 0x00}}, {2, [3]byte{0xc3, 0x90, 0x00}}, {2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, {2, [3]byte{0xc3, 0x88, 0x00}}, {3, [3]byte{0xe2, 0x82, 0xac}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}}, {3, [3]byte{0xe2, 0x94, 0x98}}, {3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x88}}, {3, [3]byte{0xe2, 0x96, 0x84}}, {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0x8c, 0x00}}, {3, [3]byte{0xe2, 0x96, 0x80}}, {2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xc3, 0xbe, 0x00}}, {2, [3]byte{0xc3, 0x9e, 0x00}}, {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}}, {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x97}}, {2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, {3, [3]byte{0xe2, 0x96, 0xa0}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xff0000a0, 0xad0000a1, 0xbd0000a2, 0x9c0000a3, 0xcf0000a4, 0xbe0000a5, 0xdd0000a6, 0xf50000a7, 0xf90000a8, 0xb80000a9, 0xa60000aa, 0xae0000ab, 0xaa0000ac, 0xf00000ad, 0xa90000ae, 0xee0000af, 0xf80000b0, 0xf10000b1, 0xfd0000b2, 0xfc0000b3, 0xef0000b4, 0xe60000b5, 0xf40000b6, 0xfa0000b7, 0xf70000b8, 0xfb0000b9, 0xa70000ba, 0xaf0000bb, 0xac0000bc, 0xab0000bd, 0xf30000be, 0xa80000bf, 0xb70000c0, 0xb50000c1, 0xb60000c2, 0xc70000c3, 0x8e0000c4, 0x8f0000c5, 0x920000c6, 0x800000c7, 0xd40000c8, 0x900000c9, 0xd20000ca, 0xd30000cb, 0xde0000cc, 0xd60000cd, 0xd70000ce, 0xd80000cf, 0xd10000d0, 0xa50000d1, 0xe30000d2, 0xe00000d3, 0xe20000d4, 0xe50000d5, 0x990000d6, 0x9e0000d7, 0x9d0000d8, 0xeb0000d9, 0xe90000da, 0xea0000db, 0x9a0000dc, 0xed0000dd, 0xe80000de, 0xe10000df, 0x850000e0, 0xa00000e1, 0x830000e2, 0xc60000e3, 0x840000e4, 0x860000e5, 0x910000e6, 0x870000e7, 0x8a0000e8, 0x820000e9, 0x880000ea, 0x890000eb, 0x8d0000ec, 0xa10000ed, 0x8c0000ee, 0x8b0000ef, 0xd00000f0, 0xa40000f1, 0x950000f2, 0xa20000f3, 0x930000f4, 0xe40000f5, 0x940000f6, 0xf60000f7, 0x9b0000f8, 0x970000f9, 0xa30000fa, 0x960000fb, 0x810000fc, 0xec0000fd, 0xe70000fe, 0x980000ff, 0x9f000192, 0xf2002017, 0xd50020ac, 0xc4002500, 0xb3002502, 0xda00250c, 0xbf002510, 0xc0002514, 0xd9002518, 0xc300251c, 0xb4002524, 0xc200252c, 0xc1002534, 0xc500253c, 0xcd002550, 0xba002551, 0xc9002554, 0xbb002557, 0xc800255a, 0xbc00255d, 0xcc002560, 0xb9002563, 0xcb002566, 0xca002569, 0xce00256c, 0xdf002580, 0xdc002584, 0xdb002588, 0xb0002591, 0xb1002592, 0xb2002593, 0xfe0025a0, }, } // CodePage860 is the IBM Code Page 860 encoding. var CodePage860 encoding.Encoding = &codePage860 var codePage860 = charmap{ name: "IBM Code Page 860", mib: identifier.IBM860, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}}, {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}}, {2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, {2, [3]byte{0xc3, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}}, {3, [3]byte{0xe2, 0x82, 0xa7}}, {2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}}, {2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}}, {2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}}, {3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x94, 0x82}}, {3, [3]byte{0xe2, 0x94, 0xa4}}, {3, [3]byte{0xe2, 0x95, 0xa1}}, {3, [3]byte{0xe2, 0x95, 0xa2}}, {3, [3]byte{0xe2, 0x95, 0x96}}, {3, [3]byte{0xe2, 0x95, 0x95}}, {3, [3]byte{0xe2, 0x95, 0xa3}}, {3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x97}}, {3, [3]byte{0xe2, 0x95, 0x9d}}, {3, [3]byte{0xe2, 0x95, 0x9c}}, {3, [3]byte{0xe2, 0x95, 0x9b}}, {3, [3]byte{0xe2, 0x94, 0x90}}, {3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0xb4}}, {3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0x9c}}, {3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0xbc}}, {3, [3]byte{0xe2, 0x95, 0x9e}}, {3, [3]byte{0xe2, 0x95, 0x9f}}, {3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x94}}, {3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xa6}}, {3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0x90}}, {3, [3]byte{0xe2, 0x95, 0xac}}, {3, [3]byte{0xe2, 0x95, 0xa7}}, {3, [3]byte{0xe2, 0x95, 0xa8}}, {3, [3]byte{0xe2, 0x95, 0xa4}}, {3, [3]byte{0xe2, 0x95, 0xa5}}, {3, [3]byte{0xe2, 0x95, 0x99}}, {3, [3]byte{0xe2, 0x95, 0x98}}, {3, [3]byte{0xe2, 0x95, 0x92}}, {3, [3]byte{0xe2, 0x95, 0x93}}, {3, [3]byte{0xe2, 0x95, 0xab}}, {3, [3]byte{0xe2, 0x95, 0xaa}}, {3, [3]byte{0xe2, 0x94, 0x98}}, {3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x88}}, {3, [3]byte{0xe2, 0x96, 0x84}}, {3, [3]byte{0xe2, 0x96, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x90}}, {3, [3]byte{0xe2, 0x96, 0x80}}, {2, [3]byte{0xce, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, {2, [3]byte{0xce, 0x93, 0x00}}, {2, [3]byte{0xcf, 0x80, 0x00}}, {2, [3]byte{0xce, 0xa3, 0x00}}, {2, [3]byte{0xcf, 0x83, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xcf, 0x84, 0x00}}, {2, [3]byte{0xce, 0xa6, 0x00}}, {2, [3]byte{0xce, 0x98, 0x00}}, {2, [3]byte{0xce, 0xa9, 0x00}}, {2, [3]byte{0xce, 0xb4, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x9e}}, {2, [3]byte{0xcf, 0x86, 0x00}}, {2, [3]byte{0xce, 0xb5, 0x00}}, {3, [3]byte{0xe2, 0x88, 0xa9}}, {3, [3]byte{0xe2, 0x89, 0xa1}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, {3, [3]byte{0xe2, 0x89, 0xa5}}, {3, [3]byte{0xe2, 0x89, 0xa4}}, {3, [3]byte{0xe2, 0x8c, 0xa0}}, {3, [3]byte{0xe2, 0x8c, 0xa1}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x89, 0x88}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x99}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x9a}}, {3, [3]byte{0xe2, 0x81, 0xbf}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, {3, [3]byte{0xe2, 0x96, 0xa0}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xff0000a0, 0xad0000a1, 0x9b0000a2, 0x9c0000a3, 0xa60000aa, 0xae0000ab, 0xaa0000ac, 0xf80000b0, 0xf10000b1, 0xfd0000b2, 0xe60000b5, 0xfa0000b7, 0xa70000ba, 0xaf0000bb, 0xac0000bc, 0xab0000bd, 0xa80000bf, 0x910000c0, 0x860000c1, 0x8f0000c2, 0x8e0000c3, 0x800000c7, 0x920000c8, 0x900000c9, 0x890000ca, 0x980000cc, 0x8b0000cd, 0xa50000d1, 0xa90000d2, 0x9f0000d3, 0x8c0000d4, 0x990000d5, 0x9d0000d9, 0x960000da, 0x9a0000dc, 0xe10000df, 0x850000e0, 0xa00000e1, 0x830000e2, 0x840000e3, 0x870000e7, 0x8a0000e8, 0x820000e9, 0x880000ea, 0x8d0000ec, 0xa10000ed, 0xa40000f1, 0x950000f2, 0xa20000f3, 0x930000f4, 0x940000f5, 0xf60000f7, 0x970000f9, 0xa30000fa, 0x810000fc, 0xe2000393, 0xe9000398, 0xe40003a3, 0xe80003a6, 0xea0003a9, 0xe00003b1, 0xeb0003b4, 0xee0003b5, 0xe30003c0, 0xe50003c3, 0xe70003c4, 0xed0003c6, 0xfc00207f, 0x9e0020a7, 0xf9002219, 0xfb00221a, 0xec00221e, 0xef002229, 0xf7002248, 0xf0002261, 0xf3002264, 0xf2002265, 0xf4002320, 0xf5002321, 0xc4002500, 0xb3002502, 0xda00250c, 0xbf002510, 0xc0002514, 0xd9002518, 0xc300251c, 0xb4002524, 0xc200252c, 0xc1002534, 0xc500253c, 0xcd002550, 0xba002551, 0xd5002552, 0xd6002553, 0xc9002554, 0xb8002555, 0xb7002556, 0xbb002557, 0xd4002558, 0xd3002559, 0xc800255a, 0xbe00255b, 0xbd00255c, 0xbc00255d, 0xc600255e, 0xc700255f, 0xcc002560, 0xb5002561, 0xb6002562, 0xb9002563, 0xd1002564, 0xd2002565, 0xcb002566, 0xcf002567, 0xd0002568, 0xca002569, 0xd800256a, 0xd700256b, 0xce00256c, 0xdf002580, 0xdc002584, 0xdb002588, 0xdd00258c, 0xde002590, 0xb0002591, 0xb1002592, 0xb2002593, 0xfe0025a0, }, } // CodePage862 is the IBM Code Page 862 encoding. var CodePage862 encoding.Encoding = &codePage862 var codePage862 = charmap{ name: "IBM Code Page 862", mib: identifier.PC862LatinHebrew, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {2, [3]byte{0xd7, 0x90, 0x00}}, {2, [3]byte{0xd7, 0x91, 0x00}}, {2, [3]byte{0xd7, 0x92, 0x00}}, {2, [3]byte{0xd7, 0x93, 0x00}}, {2, [3]byte{0xd7, 0x94, 0x00}}, {2, [3]byte{0xd7, 0x95, 0x00}}, {2, [3]byte{0xd7, 0x96, 0x00}}, {2, [3]byte{0xd7, 0x97, 0x00}}, {2, [3]byte{0xd7, 0x98, 0x00}}, {2, [3]byte{0xd7, 0x99, 0x00}}, {2, [3]byte{0xd7, 0x9a, 0x00}}, {2, [3]byte{0xd7, 0x9b, 0x00}}, {2, [3]byte{0xd7, 0x9c, 0x00}}, {2, [3]byte{0xd7, 0x9d, 0x00}}, {2, [3]byte{0xd7, 0x9e, 0x00}}, {2, [3]byte{0xd7, 0x9f, 0x00}}, {2, [3]byte{0xd7, 0xa0, 0x00}}, {2, [3]byte{0xd7, 0xa1, 0x00}}, {2, [3]byte{0xd7, 0xa2, 0x00}}, {2, [3]byte{0xd7, 0xa3, 0x00}}, {2, [3]byte{0xd7, 0xa4, 0x00}}, {2, [3]byte{0xd7, 0xa5, 0x00}}, {2, [3]byte{0xd7, 0xa6, 0x00}}, {2, [3]byte{0xd7, 0xa7, 0x00}}, {2, [3]byte{0xd7, 0xa8, 0x00}}, {2, [3]byte{0xd7, 0xa9, 0x00}}, {2, [3]byte{0xd7, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, {3, [3]byte{0xe2, 0x82, 0xa7}}, {2, [3]byte{0xc6, 0x92, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}}, {2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}}, {3, [3]byte{0xe2, 0x8c, 0x90}}, {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}}, {3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x94, 0x82}}, {3, [3]byte{0xe2, 0x94, 0xa4}}, {3, [3]byte{0xe2, 0x95, 0xa1}}, {3, [3]byte{0xe2, 0x95, 0xa2}}, {3, [3]byte{0xe2, 0x95, 0x96}}, {3, [3]byte{0xe2, 0x95, 0x95}}, {3, [3]byte{0xe2, 0x95, 0xa3}}, {3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x97}}, {3, [3]byte{0xe2, 0x95, 0x9d}}, {3, [3]byte{0xe2, 0x95, 0x9c}}, {3, [3]byte{0xe2, 0x95, 0x9b}}, {3, [3]byte{0xe2, 0x94, 0x90}}, {3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0xb4}}, {3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0x9c}}, {3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0xbc}}, {3, [3]byte{0xe2, 0x95, 0x9e}}, {3, [3]byte{0xe2, 0x95, 0x9f}}, {3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x94}}, {3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xa6}}, {3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0x90}}, {3, [3]byte{0xe2, 0x95, 0xac}}, {3, [3]byte{0xe2, 0x95, 0xa7}}, {3, [3]byte{0xe2, 0x95, 0xa8}}, {3, [3]byte{0xe2, 0x95, 0xa4}}, {3, [3]byte{0xe2, 0x95, 0xa5}}, {3, [3]byte{0xe2, 0x95, 0x99}}, {3, [3]byte{0xe2, 0x95, 0x98}}, {3, [3]byte{0xe2, 0x95, 0x92}}, {3, [3]byte{0xe2, 0x95, 0x93}}, {3, [3]byte{0xe2, 0x95, 0xab}}, {3, [3]byte{0xe2, 0x95, 0xaa}}, {3, [3]byte{0xe2, 0x94, 0x98}}, {3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x88}}, {3, [3]byte{0xe2, 0x96, 0x84}}, {3, [3]byte{0xe2, 0x96, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x90}}, {3, [3]byte{0xe2, 0x96, 0x80}}, {2, [3]byte{0xce, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, {2, [3]byte{0xce, 0x93, 0x00}}, {2, [3]byte{0xcf, 0x80, 0x00}}, {2, [3]byte{0xce, 0xa3, 0x00}}, {2, [3]byte{0xcf, 0x83, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xcf, 0x84, 0x00}}, {2, [3]byte{0xce, 0xa6, 0x00}}, {2, [3]byte{0xce, 0x98, 0x00}}, {2, [3]byte{0xce, 0xa9, 0x00}}, {2, [3]byte{0xce, 0xb4, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x9e}}, {2, [3]byte{0xcf, 0x86, 0x00}}, {2, [3]byte{0xce, 0xb5, 0x00}}, {3, [3]byte{0xe2, 0x88, 0xa9}}, {3, [3]byte{0xe2, 0x89, 0xa1}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, {3, [3]byte{0xe2, 0x89, 0xa5}}, {3, [3]byte{0xe2, 0x89, 0xa4}}, {3, [3]byte{0xe2, 0x8c, 0xa0}}, {3, [3]byte{0xe2, 0x8c, 0xa1}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x89, 0x88}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x99}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x9a}}, {3, [3]byte{0xe2, 0x81, 0xbf}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, {3, [3]byte{0xe2, 0x96, 0xa0}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xff0000a0, 0xad0000a1, 0x9b0000a2, 0x9c0000a3, 0x9d0000a5, 0xa60000aa, 0xae0000ab, 0xaa0000ac, 0xf80000b0, 0xf10000b1, 0xfd0000b2, 0xe60000b5, 0xfa0000b7, 0xa70000ba, 0xaf0000bb, 0xac0000bc, 0xab0000bd, 0xa80000bf, 0xa50000d1, 0xe10000df, 0xa00000e1, 0xa10000ed, 0xa40000f1, 0xa20000f3, 0xf60000f7, 0xa30000fa, 0x9f000192, 0xe2000393, 0xe9000398, 0xe40003a3, 0xe80003a6, 0xea0003a9, 0xe00003b1, 0xeb0003b4, 0xee0003b5, 0xe30003c0, 0xe50003c3, 0xe70003c4, 0xed0003c6, 0x800005d0, 0x810005d1, 0x820005d2, 0x830005d3, 0x840005d4, 0x850005d5, 0x860005d6, 0x870005d7, 0x880005d8, 0x890005d9, 0x8a0005da, 0x8b0005db, 0x8c0005dc, 0x8d0005dd, 0x8e0005de, 0x8f0005df, 0x900005e0, 0x910005e1, 0x920005e2, 0x930005e3, 0x940005e4, 0x950005e5, 0x960005e6, 0x970005e7, 0x980005e8, 0x990005e9, 0x9a0005ea, 0xfc00207f, 0x9e0020a7, 0xf9002219, 0xfb00221a, 0xec00221e, 0xef002229, 0xf7002248, 0xf0002261, 0xf3002264, 0xf2002265, 0xa9002310, 0xf4002320, 0xf5002321, 0xc4002500, 0xb3002502, 0xda00250c, 0xbf002510, 0xc0002514, 0xd9002518, 0xc300251c, 0xb4002524, 0xc200252c, 0xc1002534, 0xc500253c, 0xcd002550, 0xba002551, 0xd5002552, 0xd6002553, 0xc9002554, 0xb8002555, 0xb7002556, 0xbb002557, 0xd4002558, 0xd3002559, 0xc800255a, 0xbe00255b, 0xbd00255c, 0xbc00255d, 0xc600255e, 0xc700255f, 0xcc002560, 0xb5002561, 0xb6002562, 0xb9002563, 0xd1002564, 0xd2002565, 0xcb002566, 0xcf002567, 0xd0002568, 0xca002569, 0xd800256a, 0xd700256b, 0xce00256c, 0xdf002580, 0xdc002584, 0xdb002588, 0xdd00258c, 0xde002590, 0xb0002591, 0xb1002592, 0xb2002593, 0xfe0025a0, }, } // CodePage863 is the IBM Code Page 863 encoding. var CodePage863 encoding.Encoding = &codePage863 var codePage863 = charmap{ name: "IBM Code Page 863", mib: identifier.IBM863, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, {2, [3]byte{0xc3, 0xae, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x97}}, {2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, {2, [3]byte{0xc6, 0x92, 0x00}}, {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}}, {3, [3]byte{0xe2, 0x8c, 0x90}}, {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}}, {3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x94, 0x82}}, {3, [3]byte{0xe2, 0x94, 0xa4}}, {3, [3]byte{0xe2, 0x95, 0xa1}}, {3, [3]byte{0xe2, 0x95, 0xa2}}, {3, [3]byte{0xe2, 0x95, 0x96}}, {3, [3]byte{0xe2, 0x95, 0x95}}, {3, [3]byte{0xe2, 0x95, 0xa3}}, {3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x97}}, {3, [3]byte{0xe2, 0x95, 0x9d}}, {3, [3]byte{0xe2, 0x95, 0x9c}}, {3, [3]byte{0xe2, 0x95, 0x9b}}, {3, [3]byte{0xe2, 0x94, 0x90}}, {3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0xb4}}, {3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0x9c}}, {3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0xbc}}, {3, [3]byte{0xe2, 0x95, 0x9e}}, {3, [3]byte{0xe2, 0x95, 0x9f}}, {3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x94}}, {3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xa6}}, {3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0x90}}, {3, [3]byte{0xe2, 0x95, 0xac}}, {3, [3]byte{0xe2, 0x95, 0xa7}}, {3, [3]byte{0xe2, 0x95, 0xa8}}, {3, [3]byte{0xe2, 0x95, 0xa4}}, {3, [3]byte{0xe2, 0x95, 0xa5}}, {3, [3]byte{0xe2, 0x95, 0x99}}, {3, [3]byte{0xe2, 0x95, 0x98}}, {3, [3]byte{0xe2, 0x95, 0x92}}, {3, [3]byte{0xe2, 0x95, 0x93}}, {3, [3]byte{0xe2, 0x95, 0xab}}, {3, [3]byte{0xe2, 0x95, 0xaa}}, {3, [3]byte{0xe2, 0x94, 0x98}}, {3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x88}}, {3, [3]byte{0xe2, 0x96, 0x84}}, {3, [3]byte{0xe2, 0x96, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x90}}, {3, [3]byte{0xe2, 0x96, 0x80}}, {2, [3]byte{0xce, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, {2, [3]byte{0xce, 0x93, 0x00}}, {2, [3]byte{0xcf, 0x80, 0x00}}, {2, [3]byte{0xce, 0xa3, 0x00}}, {2, [3]byte{0xcf, 0x83, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xcf, 0x84, 0x00}}, {2, [3]byte{0xce, 0xa6, 0x00}}, {2, [3]byte{0xce, 0x98, 0x00}}, {2, [3]byte{0xce, 0xa9, 0x00}}, {2, [3]byte{0xce, 0xb4, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x9e}}, {2, [3]byte{0xcf, 0x86, 0x00}}, {2, [3]byte{0xce, 0xb5, 0x00}}, {3, [3]byte{0xe2, 0x88, 0xa9}}, {3, [3]byte{0xe2, 0x89, 0xa1}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, {3, [3]byte{0xe2, 0x89, 0xa5}}, {3, [3]byte{0xe2, 0x89, 0xa4}}, {3, [3]byte{0xe2, 0x8c, 0xa0}}, {3, [3]byte{0xe2, 0x8c, 0xa1}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x89, 0x88}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x99}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x9a}}, {3, [3]byte{0xe2, 0x81, 0xbf}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, {3, [3]byte{0xe2, 0x96, 0xa0}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xff0000a0, 0x9b0000a2, 0x9c0000a3, 0x980000a4, 0xa00000a6, 0x8f0000a7, 0xa40000a8, 0xae0000ab, 0xaa0000ac, 0xa70000af, 0xf80000b0, 0xf10000b1, 0xfd0000b2, 0xa60000b3, 0xa10000b4, 0xe60000b5, 0x860000b6, 0xfa0000b7, 0xa50000b8, 0xaf0000bb, 0xac0000bc, 0xab0000bd, 0xad0000be, 0x8e0000c0, 0x840000c2, 0x800000c7, 0x910000c8, 0x900000c9, 0x920000ca, 0x940000cb, 0xa80000ce, 0x950000cf, 0x990000d4, 0x9d0000d9, 0x9e0000db, 0x9a0000dc, 0xe10000df, 0x850000e0, 0x830000e2, 0x870000e7, 0x8a0000e8, 0x820000e9, 0x880000ea, 0x890000eb, 0x8c0000ee, 0x8b0000ef, 0xa20000f3, 0x930000f4, 0xf60000f7, 0x970000f9, 0xa30000fa, 0x960000fb, 0x810000fc, 0x9f000192, 0xe2000393, 0xe9000398, 0xe40003a3, 0xe80003a6, 0xea0003a9, 0xe00003b1, 0xeb0003b4, 0xee0003b5, 0xe30003c0, 0xe50003c3, 0xe70003c4, 0xed0003c6, 0x8d002017, 0xfc00207f, 0xf9002219, 0xfb00221a, 0xec00221e, 0xef002229, 0xf7002248, 0xf0002261, 0xf3002264, 0xf2002265, 0xa9002310, 0xf4002320, 0xf5002321, 0xc4002500, 0xb3002502, 0xda00250c, 0xbf002510, 0xc0002514, 0xd9002518, 0xc300251c, 0xb4002524, 0xc200252c, 0xc1002534, 0xc500253c, 0xcd002550, 0xba002551, 0xd5002552, 0xd6002553, 0xc9002554, 0xb8002555, 0xb7002556, 0xbb002557, 0xd4002558, 0xd3002559, 0xc800255a, 0xbe00255b, 0xbd00255c, 0xbc00255d, 0xc600255e, 0xc700255f, 0xcc002560, 0xb5002561, 0xb6002562, 0xb9002563, 0xd1002564, 0xd2002565, 0xcb002566, 0xcf002567, 0xd0002568, 0xca002569, 0xd800256a, 0xd700256b, 0xce00256c, 0xdf002580, 0xdc002584, 0xdb002588, 0xdd00258c, 0xde002590, 0xb0002591, 0xb1002592, 0xb2002593, 0xfe0025a0, }, } // CodePage865 is the IBM Code Page 865 encoding. var CodePage865 encoding.Encoding = &codePage865 var codePage865 = charmap{ name: "IBM Code Page 865", mib: identifier.IBM865, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0x98, 0x00}}, {3, [3]byte{0xe2, 0x82, 0xa7}}, {2, [3]byte{0xc6, 0x92, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}}, {2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}}, {3, [3]byte{0xe2, 0x8c, 0x90}}, {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, {3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}}, {3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x94, 0x82}}, {3, [3]byte{0xe2, 0x94, 0xa4}}, {3, [3]byte{0xe2, 0x95, 0xa1}}, {3, [3]byte{0xe2, 0x95, 0xa2}}, {3, [3]byte{0xe2, 0x95, 0x96}}, {3, [3]byte{0xe2, 0x95, 0x95}}, {3, [3]byte{0xe2, 0x95, 0xa3}}, {3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x97}}, {3, [3]byte{0xe2, 0x95, 0x9d}}, {3, [3]byte{0xe2, 0x95, 0x9c}}, {3, [3]byte{0xe2, 0x95, 0x9b}}, {3, [3]byte{0xe2, 0x94, 0x90}}, {3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0xb4}}, {3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0x9c}}, {3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0xbc}}, {3, [3]byte{0xe2, 0x95, 0x9e}}, {3, [3]byte{0xe2, 0x95, 0x9f}}, {3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x94}}, {3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xa6}}, {3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0x90}}, {3, [3]byte{0xe2, 0x95, 0xac}}, {3, [3]byte{0xe2, 0x95, 0xa7}}, {3, [3]byte{0xe2, 0x95, 0xa8}}, {3, [3]byte{0xe2, 0x95, 0xa4}}, {3, [3]byte{0xe2, 0x95, 0xa5}}, {3, [3]byte{0xe2, 0x95, 0x99}}, {3, [3]byte{0xe2, 0x95, 0x98}}, {3, [3]byte{0xe2, 0x95, 0x92}}, {3, [3]byte{0xe2, 0x95, 0x93}}, {3, [3]byte{0xe2, 0x95, 0xab}}, {3, [3]byte{0xe2, 0x95, 0xaa}}, {3, [3]byte{0xe2, 0x94, 0x98}}, {3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x88}}, {3, [3]byte{0xe2, 0x96, 0x84}}, {3, [3]byte{0xe2, 0x96, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x90}}, {3, [3]byte{0xe2, 0x96, 0x80}}, {2, [3]byte{0xce, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, {2, [3]byte{0xce, 0x93, 0x00}}, {2, [3]byte{0xcf, 0x80, 0x00}}, {2, [3]byte{0xce, 0xa3, 0x00}}, {2, [3]byte{0xcf, 0x83, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xcf, 0x84, 0x00}}, {2, [3]byte{0xce, 0xa6, 0x00}}, {2, [3]byte{0xce, 0x98, 0x00}}, {2, [3]byte{0xce, 0xa9, 0x00}}, {2, [3]byte{0xce, 0xb4, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x9e}}, {2, [3]byte{0xcf, 0x86, 0x00}}, {2, [3]byte{0xce, 0xb5, 0x00}}, {3, [3]byte{0xe2, 0x88, 0xa9}}, {3, [3]byte{0xe2, 0x89, 0xa1}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, {3, [3]byte{0xe2, 0x89, 0xa5}}, {3, [3]byte{0xe2, 0x89, 0xa4}}, {3, [3]byte{0xe2, 0x8c, 0xa0}}, {3, [3]byte{0xe2, 0x8c, 0xa1}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x89, 0x88}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x99}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x9a}}, {3, [3]byte{0xe2, 0x81, 0xbf}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, {3, [3]byte{0xe2, 0x96, 0xa0}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xff0000a0, 0xad0000a1, 0x9c0000a3, 0xaf0000a4, 0xa60000aa, 0xae0000ab, 0xaa0000ac, 0xf80000b0, 0xf10000b1, 0xfd0000b2, 0xe60000b5, 0xfa0000b7, 0xa70000ba, 0xac0000bc, 0xab0000bd, 0xa80000bf, 0x8e0000c4, 0x8f0000c5, 0x920000c6, 0x800000c7, 0x900000c9, 0xa50000d1, 0x990000d6, 0x9d0000d8, 0x9a0000dc, 0xe10000df, 0x850000e0, 0xa00000e1, 0x830000e2, 0x840000e4, 0x860000e5, 0x910000e6, 0x870000e7, 0x8a0000e8, 0x820000e9, 0x880000ea, 0x890000eb, 0x8d0000ec, 0xa10000ed, 0x8c0000ee, 0x8b0000ef, 0xa40000f1, 0x950000f2, 0xa20000f3, 0x930000f4, 0x940000f6, 0xf60000f7, 0x9b0000f8, 0x970000f9, 0xa30000fa, 0x960000fb, 0x810000fc, 0x980000ff, 0x9f000192, 0xe2000393, 0xe9000398, 0xe40003a3, 0xe80003a6, 0xea0003a9, 0xe00003b1, 0xeb0003b4, 0xee0003b5, 0xe30003c0, 0xe50003c3, 0xe70003c4, 0xed0003c6, 0xfc00207f, 0x9e0020a7, 0xf9002219, 0xfb00221a, 0xec00221e, 0xef002229, 0xf7002248, 0xf0002261, 0xf3002264, 0xf2002265, 0xa9002310, 0xf4002320, 0xf5002321, 0xc4002500, 0xb3002502, 0xda00250c, 0xbf002510, 0xc0002514, 0xd9002518, 0xc300251c, 0xb4002524, 0xc200252c, 0xc1002534, 0xc500253c, 0xcd002550, 0xba002551, 0xd5002552, 0xd6002553, 0xc9002554, 0xb8002555, 0xb7002556, 0xbb002557, 0xd4002558, 0xd3002559, 0xc800255a, 0xbe00255b, 0xbd00255c, 0xbc00255d, 0xc600255e, 0xc700255f, 0xcc002560, 0xb5002561, 0xb6002562, 0xb9002563, 0xd1002564, 0xd2002565, 0xcb002566, 0xcf002567, 0xd0002568, 0xca002569, 0xd800256a, 0xd700256b, 0xce00256c, 0xdf002580, 0xdc002584, 0xdb002588, 0xdd00258c, 0xde002590, 0xb0002591, 0xb1002592, 0xb2002593, 0xfe0025a0, }, } // CodePage866 is the IBM Code Page 866 encoding. var CodePage866 encoding.Encoding = &codePage866 var codePage866 = charmap{ name: "IBM Code Page 866", mib: identifier.IBM866, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {2, [3]byte{0xd0, 0x90, 0x00}}, {2, [3]byte{0xd0, 0x91, 0x00}}, {2, [3]byte{0xd0, 0x92, 0x00}}, {2, [3]byte{0xd0, 0x93, 0x00}}, {2, [3]byte{0xd0, 0x94, 0x00}}, {2, [3]byte{0xd0, 0x95, 0x00}}, {2, [3]byte{0xd0, 0x96, 0x00}}, {2, [3]byte{0xd0, 0x97, 0x00}}, {2, [3]byte{0xd0, 0x98, 0x00}}, {2, [3]byte{0xd0, 0x99, 0x00}}, {2, [3]byte{0xd0, 0x9a, 0x00}}, {2, [3]byte{0xd0, 0x9b, 0x00}}, {2, [3]byte{0xd0, 0x9c, 0x00}}, {2, [3]byte{0xd0, 0x9d, 0x00}}, {2, [3]byte{0xd0, 0x9e, 0x00}}, {2, [3]byte{0xd0, 0x9f, 0x00}}, {2, [3]byte{0xd0, 0xa0, 0x00}}, {2, [3]byte{0xd0, 0xa1, 0x00}}, {2, [3]byte{0xd0, 0xa2, 0x00}}, {2, [3]byte{0xd0, 0xa3, 0x00}}, {2, [3]byte{0xd0, 0xa4, 0x00}}, {2, [3]byte{0xd0, 0xa5, 0x00}}, {2, [3]byte{0xd0, 0xa6, 0x00}}, {2, [3]byte{0xd0, 0xa7, 0x00}}, {2, [3]byte{0xd0, 0xa8, 0x00}}, {2, [3]byte{0xd0, 0xa9, 0x00}}, {2, [3]byte{0xd0, 0xaa, 0x00}}, {2, [3]byte{0xd0, 0xab, 0x00}}, {2, [3]byte{0xd0, 0xac, 0x00}}, {2, [3]byte{0xd0, 0xad, 0x00}}, {2, [3]byte{0xd0, 0xae, 0x00}}, {2, [3]byte{0xd0, 0xaf, 0x00}}, {2, [3]byte{0xd0, 0xb0, 0x00}}, {2, [3]byte{0xd0, 0xb1, 0x00}}, {2, [3]byte{0xd0, 0xb2, 0x00}}, {2, [3]byte{0xd0, 0xb3, 0x00}}, {2, [3]byte{0xd0, 0xb4, 0x00}}, {2, [3]byte{0xd0, 0xb5, 0x00}}, {2, [3]byte{0xd0, 0xb6, 0x00}}, {2, [3]byte{0xd0, 0xb7, 0x00}}, {2, [3]byte{0xd0, 0xb8, 0x00}}, {2, [3]byte{0xd0, 0xb9, 0x00}}, {2, [3]byte{0xd0, 0xba, 0x00}}, {2, [3]byte{0xd0, 0xbb, 0x00}}, {2, [3]byte{0xd0, 0xbc, 0x00}}, {2, [3]byte{0xd0, 0xbd, 0x00}}, {2, [3]byte{0xd0, 0xbe, 0x00}}, {2, [3]byte{0xd0, 0xbf, 0x00}}, {3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}}, {3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x94, 0x82}}, {3, [3]byte{0xe2, 0x94, 0xa4}}, {3, [3]byte{0xe2, 0x95, 0xa1}}, {3, [3]byte{0xe2, 0x95, 0xa2}}, {3, [3]byte{0xe2, 0x95, 0x96}}, {3, [3]byte{0xe2, 0x95, 0x95}}, {3, [3]byte{0xe2, 0x95, 0xa3}}, {3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x97}}, {3, [3]byte{0xe2, 0x95, 0x9d}}, {3, [3]byte{0xe2, 0x95, 0x9c}}, {3, [3]byte{0xe2, 0x95, 0x9b}}, {3, [3]byte{0xe2, 0x94, 0x90}}, {3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0xb4}}, {3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0x9c}}, {3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0xbc}}, {3, [3]byte{0xe2, 0x95, 0x9e}}, {3, [3]byte{0xe2, 0x95, 0x9f}}, {3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x94}}, {3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xa6}}, {3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0x90}}, {3, [3]byte{0xe2, 0x95, 0xac}}, {3, [3]byte{0xe2, 0x95, 0xa7}}, {3, [3]byte{0xe2, 0x95, 0xa8}}, {3, [3]byte{0xe2, 0x95, 0xa4}}, {3, [3]byte{0xe2, 0x95, 0xa5}}, {3, [3]byte{0xe2, 0x95, 0x99}}, {3, [3]byte{0xe2, 0x95, 0x98}}, {3, [3]byte{0xe2, 0x95, 0x92}}, {3, [3]byte{0xe2, 0x95, 0x93}}, {3, [3]byte{0xe2, 0x95, 0xab}}, {3, [3]byte{0xe2, 0x95, 0xaa}}, {3, [3]byte{0xe2, 0x94, 0x98}}, {3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x88}}, {3, [3]byte{0xe2, 0x96, 0x84}}, {3, [3]byte{0xe2, 0x96, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x90}}, {3, [3]byte{0xe2, 0x96, 0x80}}, {2, [3]byte{0xd1, 0x80, 0x00}}, {2, [3]byte{0xd1, 0x81, 0x00}}, {2, [3]byte{0xd1, 0x82, 0x00}}, {2, [3]byte{0xd1, 0x83, 0x00}}, {2, [3]byte{0xd1, 0x84, 0x00}}, {2, [3]byte{0xd1, 0x85, 0x00}}, {2, [3]byte{0xd1, 0x86, 0x00}}, {2, [3]byte{0xd1, 0x87, 0x00}}, {2, [3]byte{0xd1, 0x88, 0x00}}, {2, [3]byte{0xd1, 0x89, 0x00}}, {2, [3]byte{0xd1, 0x8a, 0x00}}, {2, [3]byte{0xd1, 0x8b, 0x00}}, {2, [3]byte{0xd1, 0x8c, 0x00}}, {2, [3]byte{0xd1, 0x8d, 0x00}}, {2, [3]byte{0xd1, 0x8e, 0x00}}, {2, [3]byte{0xd1, 0x8f, 0x00}}, {2, [3]byte{0xd0, 0x81, 0x00}}, {2, [3]byte{0xd1, 0x91, 0x00}}, {2, [3]byte{0xd0, 0x84, 0x00}}, {2, [3]byte{0xd1, 0x94, 0x00}}, {2, [3]byte{0xd0, 0x87, 0x00}}, {2, [3]byte{0xd1, 0x97, 0x00}}, {2, [3]byte{0xd0, 0x8e, 0x00}}, {2, [3]byte{0xd1, 0x9e, 0x00}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x99}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x9a}}, {3, [3]byte{0xe2, 0x84, 0x96}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, {3, [3]byte{0xe2, 0x96, 0xa0}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xff0000a0, 0xfd0000a4, 0xf80000b0, 0xfa0000b7, 0xf0000401, 0xf2000404, 0xf4000407, 0xf600040e, 0x80000410, 0x81000411, 0x82000412, 0x83000413, 0x84000414, 0x85000415, 0x86000416, 0x87000417, 0x88000418, 0x89000419, 0x8a00041a, 0x8b00041b, 0x8c00041c, 0x8d00041d, 0x8e00041e, 0x8f00041f, 0x90000420, 0x91000421, 0x92000422, 0x93000423, 0x94000424, 0x95000425, 0x96000426, 0x97000427, 0x98000428, 0x99000429, 0x9a00042a, 0x9b00042b, 0x9c00042c, 0x9d00042d, 0x9e00042e, 0x9f00042f, 0xa0000430, 0xa1000431, 0xa2000432, 0xa3000433, 0xa4000434, 0xa5000435, 0xa6000436, 0xa7000437, 0xa8000438, 0xa9000439, 0xaa00043a, 0xab00043b, 0xac00043c, 0xad00043d, 0xae00043e, 0xaf00043f, 0xe0000440, 0xe1000441, 0xe2000442, 0xe3000443, 0xe4000444, 0xe5000445, 0xe6000446, 0xe7000447, 0xe8000448, 0xe9000449, 0xea00044a, 0xeb00044b, 0xec00044c, 0xed00044d, 0xee00044e, 0xef00044f, 0xf1000451, 0xf3000454, 0xf5000457, 0xf700045e, 0xfc002116, 0xf9002219, 0xfb00221a, 0xc4002500, 0xb3002502, 0xda00250c, 0xbf002510, 0xc0002514, 0xd9002518, 0xc300251c, 0xb4002524, 0xc200252c, 0xc1002534, 0xc500253c, 0xcd002550, 0xba002551, 0xd5002552, 0xd6002553, 0xc9002554, 0xb8002555, 0xb7002556, 0xbb002557, 0xd4002558, 0xd3002559, 0xc800255a, 0xbe00255b, 0xbd00255c, 0xbc00255d, 0xc600255e, 0xc700255f, 0xcc002560, 0xb5002561, 0xb6002562, 0xb9002563, 0xd1002564, 0xd2002565, 0xcb002566, 0xcf002567, 0xd0002568, 0xca002569, 0xd800256a, 0xd700256b, 0xce00256c, 0xdf002580, 0xdc002584, 0xdb002588, 0xdd00258c, 0xde002590, 0xb0002591, 0xb1002592, 0xb2002593, 0xfe0025a0, }, } // CodePage1047 is the IBM Code Page 1047 encoding. var CodePage1047 encoding.Encoding = &codePage1047 var codePage1047 = charmap{ name: "IBM Code Page 1047", mib: identifier.IBM1047, asciiSuperset: false, low: 0x00, replacement: 0x3f, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x9c, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x86, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x97, 0x00}}, {2, [3]byte{0xc2, 0x8d, 0x00}}, {2, [3]byte{0xc2, 0x8e, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x9d, 0x00}}, {2, [3]byte{0xc2, 0x85, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x87, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x92, 0x00}}, {2, [3]byte{0xc2, 0x8f, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x80, 0x00}}, {2, [3]byte{0xc2, 0x81, 0x00}}, {2, [3]byte{0xc2, 0x82, 0x00}}, {2, [3]byte{0xc2, 0x83, 0x00}}, {2, [3]byte{0xc2, 0x84, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x88, 0x00}}, {2, [3]byte{0xc2, 0x89, 0x00}}, {2, [3]byte{0xc2, 0x8a, 0x00}}, {2, [3]byte{0xc2, 0x8b, 0x00}}, {2, [3]byte{0xc2, 0x8c, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x90, 0x00}}, {2, [3]byte{0xc2, 0x91, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x93, 0x00}}, {2, [3]byte{0xc2, 0x94, 0x00}}, {2, [3]byte{0xc2, 0x95, 0x00}}, {2, [3]byte{0xc2, 0x96, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x98, 0x00}}, {2, [3]byte{0xc2, 0x99, 0x00}}, {2, [3]byte{0xc2, 0x9a, 0x00}}, {2, [3]byte{0xc2, 0x9b, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x9e, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc2, 0xa2, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, {2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}}, {2, [3]byte{0xc2, 0xa6, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, {2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}}, {2, [3]byte{0xc3, 0x8c, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {2, [3]byte{0xc3, 0x98, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xb0, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}}, {2, [3]byte{0xc3, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}}, {2, [3]byte{0xc3, 0x90, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {2, [3]byte{0xc3, 0x9e, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}}, {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc2, 0x9f, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x37000004, 0x2d000005, 0x2e000006, 0x2f000007, 0x16000008, 0x05000009, 0x2500000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x3c000014, 0x3d000015, 0x32000016, 0x26000017, 0x18000018, 0x19000019, 0x3f00001a, 0x2700001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x40000020, 0x5a000021, 0x7f000022, 0x7b000023, 0x5b000024, 0x6c000025, 0x50000026, 0x7d000027, 0x4d000028, 0x5d000029, 0x5c00002a, 0x4e00002b, 0x6b00002c, 0x6000002d, 0x4b00002e, 0x6100002f, 0xf0000030, 0xf1000031, 0xf2000032, 0xf3000033, 0xf4000034, 0xf5000035, 0xf6000036, 0xf7000037, 0xf8000038, 0xf9000039, 0x7a00003a, 0x5e00003b, 0x4c00003c, 0x7e00003d, 0x6e00003e, 0x6f00003f, 0x7c000040, 0xc1000041, 0xc2000042, 0xc3000043, 0xc4000044, 0xc5000045, 0xc6000046, 0xc7000047, 0xc8000048, 0xc9000049, 0xd100004a, 0xd200004b, 0xd300004c, 0xd400004d, 0xd500004e, 0xd600004f, 0xd7000050, 0xd8000051, 0xd9000052, 0xe2000053, 0xe3000054, 0xe4000055, 0xe5000056, 0xe6000057, 0xe7000058, 0xe8000059, 0xe900005a, 0xad00005b, 0xe000005c, 0xbd00005d, 0x5f00005e, 0x6d00005f, 0x79000060, 0x81000061, 0x82000062, 0x83000063, 0x84000064, 0x85000065, 0x86000066, 0x87000067, 0x88000068, 0x89000069, 0x9100006a, 0x9200006b, 0x9300006c, 0x9400006d, 0x9500006e, 0x9600006f, 0x97000070, 0x98000071, 0x99000072, 0xa2000073, 0xa3000074, 0xa4000075, 0xa5000076, 0xa6000077, 0xa7000078, 0xa8000079, 0xa900007a, 0xc000007b, 0x4f00007c, 0xd000007d, 0xa100007e, 0x0700007f, 0x20000080, 0x21000081, 0x22000082, 0x23000083, 0x24000084, 0x15000085, 0x06000086, 0x17000087, 0x28000088, 0x29000089, 0x2a00008a, 0x2b00008b, 0x2c00008c, 0x0900008d, 0x0a00008e, 0x1b00008f, 0x30000090, 0x31000091, 0x1a000092, 0x33000093, 0x34000094, 0x35000095, 0x36000096, 0x08000097, 0x38000098, 0x39000099, 0x3a00009a, 0x3b00009b, 0x0400009c, 0x1400009d, 0x3e00009e, 0xff00009f, 0x410000a0, 0xaa0000a1, 0x4a0000a2, 0xb10000a3, 0x9f0000a4, 0xb20000a5, 0x6a0000a6, 0xb50000a7, 0xbb0000a8, 0xb40000a9, 0x9a0000aa, 0x8a0000ab, 0xb00000ac, 0xca0000ad, 0xaf0000ae, 0xbc0000af, 0x900000b0, 0x8f0000b1, 0xea0000b2, 0xfa0000b3, 0xbe0000b4, 0xa00000b5, 0xb60000b6, 0xb30000b7, 0x9d0000b8, 0xda0000b9, 0x9b0000ba, 0x8b0000bb, 0xb70000bc, 0xb80000bd, 0xb90000be, 0xab0000bf, 0x640000c0, 0x650000c1, 0x620000c2, 0x660000c3, 0x630000c4, 0x670000c5, 0x9e0000c6, 0x680000c7, 0x740000c8, 0x710000c9, 0x720000ca, 0x730000cb, 0x780000cc, 0x750000cd, 0x760000ce, 0x770000cf, 0xac0000d0, 0x690000d1, 0xed0000d2, 0xee0000d3, 0xeb0000d4, 0xef0000d5, 0xec0000d6, 0xbf0000d7, 0x800000d8, 0xfd0000d9, 0xfe0000da, 0xfb0000db, 0xfc0000dc, 0xba0000dd, 0xae0000de, 0x590000df, 0x440000e0, 0x450000e1, 0x420000e2, 0x460000e3, 0x430000e4, 0x470000e5, 0x9c0000e6, 0x480000e7, 0x540000e8, 0x510000e9, 0x520000ea, 0x530000eb, 0x580000ec, 0x550000ed, 0x560000ee, 0x570000ef, 0x8c0000f0, 0x490000f1, 0xcd0000f2, 0xce0000f3, 0xcb0000f4, 0xcf0000f5, 0xcc0000f6, 0xe10000f7, 0x700000f8, 0xdd0000f9, 0xde0000fa, 0xdb0000fb, 0xdc0000fc, 0x8d0000fd, 0x8e0000fe, 0xdf0000ff, }, } // CodePage1140 is the IBM Code Page 1140 encoding. var CodePage1140 encoding.Encoding = &codePage1140 var codePage1140 = charmap{ name: "IBM Code Page 1140", mib: identifier.IBM01140, asciiSuperset: false, low: 0x00, replacement: 0x3f, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x9c, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x86, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x97, 0x00}}, {2, [3]byte{0xc2, 0x8d, 0x00}}, {2, [3]byte{0xc2, 0x8e, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x9d, 0x00}}, {2, [3]byte{0xc2, 0x85, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x87, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x92, 0x00}}, {2, [3]byte{0xc2, 0x8f, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x80, 0x00}}, {2, [3]byte{0xc2, 0x81, 0x00}}, {2, [3]byte{0xc2, 0x82, 0x00}}, {2, [3]byte{0xc2, 0x83, 0x00}}, {2, [3]byte{0xc2, 0x84, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x88, 0x00}}, {2, [3]byte{0xc2, 0x89, 0x00}}, {2, [3]byte{0xc2, 0x8a, 0x00}}, {2, [3]byte{0xc2, 0x8b, 0x00}}, {2, [3]byte{0xc2, 0x8c, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x90, 0x00}}, {2, [3]byte{0xc2, 0x91, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x93, 0x00}}, {2, [3]byte{0xc2, 0x94, 0x00}}, {2, [3]byte{0xc2, 0x95, 0x00}}, {2, [3]byte{0xc2, 0x96, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x98, 0x00}}, {2, [3]byte{0xc2, 0x99, 0x00}}, {2, [3]byte{0xc2, 0x9a, 0x00}}, {2, [3]byte{0xc2, 0x9b, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x9e, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc2, 0xa2, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, {2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xac, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}}, {2, [3]byte{0xc2, 0xa6, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, {2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}}, {2, [3]byte{0xc3, 0x8c, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {2, [3]byte{0xc3, 0x98, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xb0, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}}, {2, [3]byte{0xc3, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0x86, 0x00}}, {3, [3]byte{0xe2, 0x82, 0xac}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}}, {2, [3]byte{0xc3, 0x90, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}}, {2, [3]byte{0xc3, 0x9e, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xbe, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}}, {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc2, 0x9f, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x37000004, 0x2d000005, 0x2e000006, 0x2f000007, 0x16000008, 0x05000009, 0x2500000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x3c000014, 0x3d000015, 0x32000016, 0x26000017, 0x18000018, 0x19000019, 0x3f00001a, 0x2700001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x40000020, 0x5a000021, 0x7f000022, 0x7b000023, 0x5b000024, 0x6c000025, 0x50000026, 0x7d000027, 0x4d000028, 0x5d000029, 0x5c00002a, 0x4e00002b, 0x6b00002c, 0x6000002d, 0x4b00002e, 0x6100002f, 0xf0000030, 0xf1000031, 0xf2000032, 0xf3000033, 0xf4000034, 0xf5000035, 0xf6000036, 0xf7000037, 0xf8000038, 0xf9000039, 0x7a00003a, 0x5e00003b, 0x4c00003c, 0x7e00003d, 0x6e00003e, 0x6f00003f, 0x7c000040, 0xc1000041, 0xc2000042, 0xc3000043, 0xc4000044, 0xc5000045, 0xc6000046, 0xc7000047, 0xc8000048, 0xc9000049, 0xd100004a, 0xd200004b, 0xd300004c, 0xd400004d, 0xd500004e, 0xd600004f, 0xd7000050, 0xd8000051, 0xd9000052, 0xe2000053, 0xe3000054, 0xe4000055, 0xe5000056, 0xe6000057, 0xe7000058, 0xe8000059, 0xe900005a, 0xba00005b, 0xe000005c, 0xbb00005d, 0xb000005e, 0x6d00005f, 0x79000060, 0x81000061, 0x82000062, 0x83000063, 0x84000064, 0x85000065, 0x86000066, 0x87000067, 0x88000068, 0x89000069, 0x9100006a, 0x9200006b, 0x9300006c, 0x9400006d, 0x9500006e, 0x9600006f, 0x97000070, 0x98000071, 0x99000072, 0xa2000073, 0xa3000074, 0xa4000075, 0xa5000076, 0xa6000077, 0xa7000078, 0xa8000079, 0xa900007a, 0xc000007b, 0x4f00007c, 0xd000007d, 0xa100007e, 0x0700007f, 0x20000080, 0x21000081, 0x22000082, 0x23000083, 0x24000084, 0x15000085, 0x06000086, 0x17000087, 0x28000088, 0x29000089, 0x2a00008a, 0x2b00008b, 0x2c00008c, 0x0900008d, 0x0a00008e, 0x1b00008f, 0x30000090, 0x31000091, 0x1a000092, 0x33000093, 0x34000094, 0x35000095, 0x36000096, 0x08000097, 0x38000098, 0x39000099, 0x3a00009a, 0x3b00009b, 0x0400009c, 0x1400009d, 0x3e00009e, 0xff00009f, 0x410000a0, 0xaa0000a1, 0x4a0000a2, 0xb10000a3, 0xb20000a5, 0x6a0000a6, 0xb50000a7, 0xbd0000a8, 0xb40000a9, 0x9a0000aa, 0x8a0000ab, 0x5f0000ac, 0xca0000ad, 0xaf0000ae, 0xbc0000af, 0x900000b0, 0x8f0000b1, 0xea0000b2, 0xfa0000b3, 0xbe0000b4, 0xa00000b5, 0xb60000b6, 0xb30000b7, 0x9d0000b8, 0xda0000b9, 0x9b0000ba, 0x8b0000bb, 0xb70000bc, 0xb80000bd, 0xb90000be, 0xab0000bf, 0x640000c0, 0x650000c1, 0x620000c2, 0x660000c3, 0x630000c4, 0x670000c5, 0x9e0000c6, 0x680000c7, 0x740000c8, 0x710000c9, 0x720000ca, 0x730000cb, 0x780000cc, 0x750000cd, 0x760000ce, 0x770000cf, 0xac0000d0, 0x690000d1, 0xed0000d2, 0xee0000d3, 0xeb0000d4, 0xef0000d5, 0xec0000d6, 0xbf0000d7, 0x800000d8, 0xfd0000d9, 0xfe0000da, 0xfb0000db, 0xfc0000dc, 0xad0000dd, 0xae0000de, 0x590000df, 0x440000e0, 0x450000e1, 0x420000e2, 0x460000e3, 0x430000e4, 0x470000e5, 0x9c0000e6, 0x480000e7, 0x540000e8, 0x510000e9, 0x520000ea, 0x530000eb, 0x580000ec, 0x550000ed, 0x560000ee, 0x570000ef, 0x8c0000f0, 0x490000f1, 0xcd0000f2, 0xce0000f3, 0xcb0000f4, 0xcf0000f5, 0xcc0000f6, 0xe10000f7, 0x700000f8, 0xdd0000f9, 0xde0000fa, 0xdb0000fb, 0xdc0000fc, 0x8d0000fd, 0x8e0000fe, 0xdf0000ff, 0x9f0020ac, }, } // ISO8859_1 is the ISO 8859-1 encoding. var ISO8859_1 encoding.Encoding = &iso8859_1 var iso8859_1 = charmap{ name: "ISO 8859-1", mib: identifier.ISOLatin1, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x80, 0x00}}, {2, [3]byte{0xc2, 0x81, 0x00}}, {2, [3]byte{0xc2, 0x82, 0x00}}, {2, [3]byte{0xc2, 0x83, 0x00}}, {2, [3]byte{0xc2, 0x84, 0x00}}, {2, [3]byte{0xc2, 0x85, 0x00}}, {2, [3]byte{0xc2, 0x86, 0x00}}, {2, [3]byte{0xc2, 0x87, 0x00}}, {2, [3]byte{0xc2, 0x88, 0x00}}, {2, [3]byte{0xc2, 0x89, 0x00}}, {2, [3]byte{0xc2, 0x8a, 0x00}}, {2, [3]byte{0xc2, 0x8b, 0x00}}, {2, [3]byte{0xc2, 0x8c, 0x00}}, {2, [3]byte{0xc2, 0x8d, 0x00}}, {2, [3]byte{0xc2, 0x8e, 0x00}}, {2, [3]byte{0xc2, 0x8f, 0x00}}, {2, [3]byte{0xc2, 0x90, 0x00}}, {2, [3]byte{0xc2, 0x91, 0x00}}, {2, [3]byte{0xc2, 0x92, 0x00}}, {2, [3]byte{0xc2, 0x93, 0x00}}, {2, [3]byte{0xc2, 0x94, 0x00}}, {2, [3]byte{0xc2, 0x95, 0x00}}, {2, [3]byte{0xc2, 0x96, 0x00}}, {2, [3]byte{0xc2, 0x97, 0x00}}, {2, [3]byte{0xc2, 0x98, 0x00}}, {2, [3]byte{0xc2, 0x99, 0x00}}, {2, [3]byte{0xc2, 0x9a, 0x00}}, {2, [3]byte{0xc2, 0x9b, 0x00}}, {2, [3]byte{0xc2, 0x9c, 0x00}}, {2, [3]byte{0xc2, 0x9d, 0x00}}, {2, [3]byte{0xc2, 0x9e, 0x00}}, {2, [3]byte{0xc2, 0x9f, 0x00}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}}, {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, {2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}}, {2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}}, {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, {2, [3]byte{0xc3, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}}, {2, [3]byte{0xc3, 0x90, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}}, {2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, {2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}}, {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}}, {2, [3]byte{0xc3, 0x9e, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, {2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, {2, [3]byte{0xc3, 0xb0, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}}, {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}}, {2, [3]byte{0xc3, 0xbe, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0x80000080, 0x81000081, 0x82000082, 0x83000083, 0x84000084, 0x85000085, 0x86000086, 0x87000087, 0x88000088, 0x89000089, 0x8a00008a, 0x8b00008b, 0x8c00008c, 0x8d00008d, 0x8e00008e, 0x8f00008f, 0x90000090, 0x91000091, 0x92000092, 0x93000093, 0x94000094, 0x95000095, 0x96000096, 0x97000097, 0x98000098, 0x99000099, 0x9a00009a, 0x9b00009b, 0x9c00009c, 0x9d00009d, 0x9e00009e, 0x9f00009f, 0xa00000a0, 0xa10000a1, 0xa20000a2, 0xa30000a3, 0xa40000a4, 0xa50000a5, 0xa60000a6, 0xa70000a7, 0xa80000a8, 0xa90000a9, 0xaa0000aa, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xaf0000af, 0xb00000b0, 0xb10000b1, 0xb20000b2, 0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7, 0xb80000b8, 0xb90000b9, 0xba0000ba, 0xbb0000bb, 0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xbf0000bf, 0xc00000c0, 0xc10000c1, 0xc20000c2, 0xc30000c3, 0xc40000c4, 0xc50000c5, 0xc60000c6, 0xc70000c7, 0xc80000c8, 0xc90000c9, 0xca0000ca, 0xcb0000cb, 0xcc0000cc, 0xcd0000cd, 0xce0000ce, 0xcf0000cf, 0xd00000d0, 0xd10000d1, 0xd20000d2, 0xd30000d3, 0xd40000d4, 0xd50000d5, 0xd60000d6, 0xd70000d7, 0xd80000d8, 0xd90000d9, 0xda0000da, 0xdb0000db, 0xdc0000dc, 0xdd0000dd, 0xde0000de, 0xdf0000df, 0xe00000e0, 0xe10000e1, 0xe20000e2, 0xe30000e3, 0xe40000e4, 0xe50000e5, 0xe60000e6, 0xe70000e7, 0xe80000e8, 0xe90000e9, 0xea0000ea, 0xeb0000eb, 0xec0000ec, 0xed0000ed, 0xee0000ee, 0xef0000ef, 0xf00000f0, 0xf10000f1, 0xf20000f2, 0xf30000f3, 0xf40000f4, 0xf50000f5, 0xf60000f6, 0xf70000f7, 0xf80000f8, 0xf90000f9, 0xfa0000fa, 0xfb0000fb, 0xfc0000fc, 0xfd0000fd, 0xfe0000fe, 0xff0000ff, }, } // ISO8859_2 is the ISO 8859-2 encoding. var ISO8859_2 encoding.Encoding = &iso8859_2 var iso8859_2 = charmap{ name: "ISO 8859-2", mib: identifier.ISOLatin2, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc4, 0x84, 0x00}}, {2, [3]byte{0xcb, 0x98, 0x00}}, {2, [3]byte{0xc5, 0x81, 0x00}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc4, 0xbd, 0x00}}, {2, [3]byte{0xc5, 0x9a, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc5, 0xa0, 0x00}}, {2, [3]byte{0xc5, 0x9e, 0x00}}, {2, [3]byte{0xc5, 0xa4, 0x00}}, {2, [3]byte{0xc5, 0xb9, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc5, 0xbd, 0x00}}, {2, [3]byte{0xc5, 0xbb, 0x00}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc4, 0x85, 0x00}}, {2, [3]byte{0xcb, 0x9b, 0x00}}, {2, [3]byte{0xc5, 0x82, 0x00}}, {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc4, 0xbe, 0x00}}, {2, [3]byte{0xc5, 0x9b, 0x00}}, {2, [3]byte{0xcb, 0x87, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc5, 0xa1, 0x00}}, {2, [3]byte{0xc5, 0x9f, 0x00}}, {2, [3]byte{0xc5, 0xa5, 0x00}}, {2, [3]byte{0xc5, 0xba, 0x00}}, {2, [3]byte{0xcb, 0x9d, 0x00}}, {2, [3]byte{0xc5, 0xbe, 0x00}}, {2, [3]byte{0xc5, 0xbc, 0x00}}, {2, [3]byte{0xc5, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc4, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc4, 0xb9, 0x00}}, {2, [3]byte{0xc4, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc4, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc4, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, {2, [3]byte{0xc4, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc4, 0x8e, 0x00}}, {2, [3]byte{0xc4, 0x90, 0x00}}, {2, [3]byte{0xc5, 0x83, 0x00}}, {2, [3]byte{0xc5, 0x87, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc5, 0x90, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, {2, [3]byte{0xc5, 0x98, 0x00}}, {2, [3]byte{0xc5, 0xae, 0x00}}, {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc5, 0xb0, 0x00}}, {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}}, {2, [3]byte{0xc5, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, {2, [3]byte{0xc5, 0x95, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc4, 0x83, 0x00}}, {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc4, 0xba, 0x00}}, {2, [3]byte{0xc4, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, {2, [3]byte{0xc4, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc4, 0x99, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, {2, [3]byte{0xc4, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc4, 0x8f, 0x00}}, {2, [3]byte{0xc4, 0x91, 0x00}}, {2, [3]byte{0xc5, 0x84, 0x00}}, {2, [3]byte{0xc5, 0x88, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc5, 0x91, 0x00}}, {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {2, [3]byte{0xc5, 0x99, 0x00}}, {2, [3]byte{0xc5, 0xaf, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc5, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}}, {2, [3]byte{0xc5, 0xa3, 0x00}}, {2, [3]byte{0xcb, 0x99, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xa00000a0, 0xa40000a4, 0xa70000a7, 0xa80000a8, 0xad0000ad, 0xb00000b0, 0xb40000b4, 0xb80000b8, 0xc10000c1, 0xc20000c2, 0xc40000c4, 0xc70000c7, 0xc90000c9, 0xcb0000cb, 0xcd0000cd, 0xce0000ce, 0xd30000d3, 0xd40000d4, 0xd60000d6, 0xd70000d7, 0xda0000da, 0xdc0000dc, 0xdd0000dd, 0xdf0000df, 0xe10000e1, 0xe20000e2, 0xe40000e4, 0xe70000e7, 0xe90000e9, 0xeb0000eb, 0xed0000ed, 0xee0000ee, 0xf30000f3, 0xf40000f4, 0xf60000f6, 0xf70000f7, 0xfa0000fa, 0xfc0000fc, 0xfd0000fd, 0xc3000102, 0xe3000103, 0xa1000104, 0xb1000105, 0xc6000106, 0xe6000107, 0xc800010c, 0xe800010d, 0xcf00010e, 0xef00010f, 0xd0000110, 0xf0000111, 0xca000118, 0xea000119, 0xcc00011a, 0xec00011b, 0xc5000139, 0xe500013a, 0xa500013d, 0xb500013e, 0xa3000141, 0xb3000142, 0xd1000143, 0xf1000144, 0xd2000147, 0xf2000148, 0xd5000150, 0xf5000151, 0xc0000154, 0xe0000155, 0xd8000158, 0xf8000159, 0xa600015a, 0xb600015b, 0xaa00015e, 0xba00015f, 0xa9000160, 0xb9000161, 0xde000162, 0xfe000163, 0xab000164, 0xbb000165, 0xd900016e, 0xf900016f, 0xdb000170, 0xfb000171, 0xac000179, 0xbc00017a, 0xaf00017b, 0xbf00017c, 0xae00017d, 0xbe00017e, 0xb70002c7, 0xa20002d8, 0xff0002d9, 0xb20002db, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, }, } // ISO8859_3 is the ISO 8859-3 encoding. var ISO8859_3 encoding.Encoding = &iso8859_3 var iso8859_3 = charmap{ name: "ISO 8859-3", mib: identifier.ISOLatin3, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc4, 0xa6, 0x00}}, {2, [3]byte{0xcb, 0x98, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc4, 0xa4, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc4, 0xb0, 0x00}}, {2, [3]byte{0xc5, 0x9e, 0x00}}, {2, [3]byte{0xc4, 0x9e, 0x00}}, {2, [3]byte{0xc4, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc5, 0xbb, 0x00}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc4, 0xa7, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xc4, 0xa5, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc4, 0xb1, 0x00}}, {2, [3]byte{0xc5, 0x9f, 0x00}}, {2, [3]byte{0xc4, 0x9f, 0x00}}, {2, [3]byte{0xc4, 0xb5, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc5, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, {2, [3]byte{0xc3, 0x82, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc4, 0x8a, 0x00}}, {2, [3]byte{0xc4, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, {2, [3]byte{0xc3, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc3, 0x91, 0x00}}, {2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc4, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, {2, [3]byte{0xc4, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}}, {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc5, 0xac, 0x00}}, {2, [3]byte{0xc5, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc4, 0x8b, 0x00}}, {2, [3]byte{0xc4, 0x89, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, {2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc4, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {2, [3]byte{0xc4, 0x9d, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc5, 0xad, 0x00}}, {2, [3]byte{0xc5, 0x9d, 0x00}}, {2, [3]byte{0xcb, 0x99, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xa00000a0, 0xa30000a3, 0xa40000a4, 0xa70000a7, 0xa80000a8, 0xad0000ad, 0xb00000b0, 0xb20000b2, 0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb70000b7, 0xb80000b8, 0xbd0000bd, 0xc00000c0, 0xc10000c1, 0xc20000c2, 0xc40000c4, 0xc70000c7, 0xc80000c8, 0xc90000c9, 0xca0000ca, 0xcb0000cb, 0xcc0000cc, 0xcd0000cd, 0xce0000ce, 0xcf0000cf, 0xd10000d1, 0xd20000d2, 0xd30000d3, 0xd40000d4, 0xd60000d6, 0xd70000d7, 0xd90000d9, 0xda0000da, 0xdb0000db, 0xdc0000dc, 0xdf0000df, 0xe00000e0, 0xe10000e1, 0xe20000e2, 0xe40000e4, 0xe70000e7, 0xe80000e8, 0xe90000e9, 0xea0000ea, 0xeb0000eb, 0xec0000ec, 0xed0000ed, 0xee0000ee, 0xef0000ef, 0xf10000f1, 0xf20000f2, 0xf30000f3, 0xf40000f4, 0xf60000f6, 0xf70000f7, 0xf90000f9, 0xfa0000fa, 0xfb0000fb, 0xfc0000fc, 0xc6000108, 0xe6000109, 0xc500010a, 0xe500010b, 0xd800011c, 0xf800011d, 0xab00011e, 0xbb00011f, 0xd5000120, 0xf5000121, 0xa6000124, 0xb6000125, 0xa1000126, 0xb1000127, 0xa9000130, 0xb9000131, 0xac000134, 0xbc000135, 0xde00015c, 0xfe00015d, 0xaa00015e, 0xba00015f, 0xdd00016c, 0xfd00016d, 0xaf00017b, 0xbf00017c, 0xa20002d8, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, }, } // ISO8859_4 is the ISO 8859-4 encoding. var ISO8859_4 encoding.Encoding = &iso8859_4 var iso8859_4 = charmap{ name: "ISO 8859-4", mib: identifier.ISOLatin4, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc4, 0x84, 0x00}}, {2, [3]byte{0xc4, 0xb8, 0x00}}, {2, [3]byte{0xc5, 0x96, 0x00}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc4, 0xa8, 0x00}}, {2, [3]byte{0xc4, 0xbb, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc5, 0xa0, 0x00}}, {2, [3]byte{0xc4, 0x92, 0x00}}, {2, [3]byte{0xc4, 0xa2, 0x00}}, {2, [3]byte{0xc5, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc5, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc4, 0x85, 0x00}}, {2, [3]byte{0xcb, 0x9b, 0x00}}, {2, [3]byte{0xc5, 0x97, 0x00}}, {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc4, 0xa9, 0x00}}, {2, [3]byte{0xc4, 0xbc, 0x00}}, {2, [3]byte{0xcb, 0x87, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc5, 0xa1, 0x00}}, {2, [3]byte{0xc4, 0x93, 0x00}}, {2, [3]byte{0xc4, 0xa3, 0x00}}, {2, [3]byte{0xc5, 0xa7, 0x00}}, {2, [3]byte{0xc5, 0x8a, 0x00}}, {2, [3]byte{0xc5, 0xbe, 0x00}}, {2, [3]byte{0xc5, 0x8b, 0x00}}, {2, [3]byte{0xc4, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}}, {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc4, 0xae, 0x00}}, {2, [3]byte{0xc4, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc4, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, {2, [3]byte{0xc4, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc4, 0xaa, 0x00}}, {2, [3]byte{0xc4, 0x90, 0x00}}, {2, [3]byte{0xc5, 0x85, 0x00}}, {2, [3]byte{0xc5, 0x8c, 0x00}}, {2, [3]byte{0xc4, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, {2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc5, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc5, 0xa8, 0x00}}, {2, [3]byte{0xc5, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, {2, [3]byte{0xc4, 0x81, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc4, 0xaf, 0x00}}, {2, [3]byte{0xc4, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc4, 0x99, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, {2, [3]byte{0xc4, 0x97, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc4, 0xab, 0x00}}, {2, [3]byte{0xc4, 0x91, 0x00}}, {2, [3]byte{0xc5, 0x86, 0x00}}, {2, [3]byte{0xc5, 0x8d, 0x00}}, {2, [3]byte{0xc4, 0xb7, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}}, {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc5, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc5, 0xa9, 0x00}}, {2, [3]byte{0xc5, 0xab, 0x00}}, {2, [3]byte{0xcb, 0x99, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xa00000a0, 0xa40000a4, 0xa70000a7, 0xa80000a8, 0xad0000ad, 0xaf0000af, 0xb00000b0, 0xb40000b4, 0xb80000b8, 0xc10000c1, 0xc20000c2, 0xc30000c3, 0xc40000c4, 0xc50000c5, 0xc60000c6, 0xc90000c9, 0xcb0000cb, 0xcd0000cd, 0xce0000ce, 0xd40000d4, 0xd50000d5, 0xd60000d6, 0xd70000d7, 0xd80000d8, 0xda0000da, 0xdb0000db, 0xdc0000dc, 0xdf0000df, 0xe10000e1, 0xe20000e2, 0xe30000e3, 0xe40000e4, 0xe50000e5, 0xe60000e6, 0xe90000e9, 0xeb0000eb, 0xed0000ed, 0xee0000ee, 0xf40000f4, 0xf50000f5, 0xf60000f6, 0xf70000f7, 0xf80000f8, 0xfa0000fa, 0xfb0000fb, 0xfc0000fc, 0xc0000100, 0xe0000101, 0xa1000104, 0xb1000105, 0xc800010c, 0xe800010d, 0xd0000110, 0xf0000111, 0xaa000112, 0xba000113, 0xcc000116, 0xec000117, 0xca000118, 0xea000119, 0xab000122, 0xbb000123, 0xa5000128, 0xb5000129, 0xcf00012a, 0xef00012b, 0xc700012e, 0xe700012f, 0xd3000136, 0xf3000137, 0xa2000138, 0xa600013b, 0xb600013c, 0xd1000145, 0xf1000146, 0xbd00014a, 0xbf00014b, 0xd200014c, 0xf200014d, 0xa3000156, 0xb3000157, 0xa9000160, 0xb9000161, 0xac000166, 0xbc000167, 0xdd000168, 0xfd000169, 0xde00016a, 0xfe00016b, 0xd9000172, 0xf9000173, 0xae00017d, 0xbe00017e, 0xb70002c7, 0xff0002d9, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, }, } // ISO8859_5 is the ISO 8859-5 encoding. var ISO8859_5 encoding.Encoding = &iso8859_5 var iso8859_5 = charmap{ name: "ISO 8859-5", mib: identifier.ISOLatinCyrillic, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xd0, 0x81, 0x00}}, {2, [3]byte{0xd0, 0x82, 0x00}}, {2, [3]byte{0xd0, 0x83, 0x00}}, {2, [3]byte{0xd0, 0x84, 0x00}}, {2, [3]byte{0xd0, 0x85, 0x00}}, {2, [3]byte{0xd0, 0x86, 0x00}}, {2, [3]byte{0xd0, 0x87, 0x00}}, {2, [3]byte{0xd0, 0x88, 0x00}}, {2, [3]byte{0xd0, 0x89, 0x00}}, {2, [3]byte{0xd0, 0x8a, 0x00}}, {2, [3]byte{0xd0, 0x8b, 0x00}}, {2, [3]byte{0xd0, 0x8c, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xd0, 0x8e, 0x00}}, {2, [3]byte{0xd0, 0x8f, 0x00}}, {2, [3]byte{0xd0, 0x90, 0x00}}, {2, [3]byte{0xd0, 0x91, 0x00}}, {2, [3]byte{0xd0, 0x92, 0x00}}, {2, [3]byte{0xd0, 0x93, 0x00}}, {2, [3]byte{0xd0, 0x94, 0x00}}, {2, [3]byte{0xd0, 0x95, 0x00}}, {2, [3]byte{0xd0, 0x96, 0x00}}, {2, [3]byte{0xd0, 0x97, 0x00}}, {2, [3]byte{0xd0, 0x98, 0x00}}, {2, [3]byte{0xd0, 0x99, 0x00}}, {2, [3]byte{0xd0, 0x9a, 0x00}}, {2, [3]byte{0xd0, 0x9b, 0x00}}, {2, [3]byte{0xd0, 0x9c, 0x00}}, {2, [3]byte{0xd0, 0x9d, 0x00}}, {2, [3]byte{0xd0, 0x9e, 0x00}}, {2, [3]byte{0xd0, 0x9f, 0x00}}, {2, [3]byte{0xd0, 0xa0, 0x00}}, {2, [3]byte{0xd0, 0xa1, 0x00}}, {2, [3]byte{0xd0, 0xa2, 0x00}}, {2, [3]byte{0xd0, 0xa3, 0x00}}, {2, [3]byte{0xd0, 0xa4, 0x00}}, {2, [3]byte{0xd0, 0xa5, 0x00}}, {2, [3]byte{0xd0, 0xa6, 0x00}}, {2, [3]byte{0xd0, 0xa7, 0x00}}, {2, [3]byte{0xd0, 0xa8, 0x00}}, {2, [3]byte{0xd0, 0xa9, 0x00}}, {2, [3]byte{0xd0, 0xaa, 0x00}}, {2, [3]byte{0xd0, 0xab, 0x00}}, {2, [3]byte{0xd0, 0xac, 0x00}}, {2, [3]byte{0xd0, 0xad, 0x00}}, {2, [3]byte{0xd0, 0xae, 0x00}}, {2, [3]byte{0xd0, 0xaf, 0x00}}, {2, [3]byte{0xd0, 0xb0, 0x00}}, {2, [3]byte{0xd0, 0xb1, 0x00}}, {2, [3]byte{0xd0, 0xb2, 0x00}}, {2, [3]byte{0xd0, 0xb3, 0x00}}, {2, [3]byte{0xd0, 0xb4, 0x00}}, {2, [3]byte{0xd0, 0xb5, 0x00}}, {2, [3]byte{0xd0, 0xb6, 0x00}}, {2, [3]byte{0xd0, 0xb7, 0x00}}, {2, [3]byte{0xd0, 0xb8, 0x00}}, {2, [3]byte{0xd0, 0xb9, 0x00}}, {2, [3]byte{0xd0, 0xba, 0x00}}, {2, [3]byte{0xd0, 0xbb, 0x00}}, {2, [3]byte{0xd0, 0xbc, 0x00}}, {2, [3]byte{0xd0, 0xbd, 0x00}}, {2, [3]byte{0xd0, 0xbe, 0x00}}, {2, [3]byte{0xd0, 0xbf, 0x00}}, {2, [3]byte{0xd1, 0x80, 0x00}}, {2, [3]byte{0xd1, 0x81, 0x00}}, {2, [3]byte{0xd1, 0x82, 0x00}}, {2, [3]byte{0xd1, 0x83, 0x00}}, {2, [3]byte{0xd1, 0x84, 0x00}}, {2, [3]byte{0xd1, 0x85, 0x00}}, {2, [3]byte{0xd1, 0x86, 0x00}}, {2, [3]byte{0xd1, 0x87, 0x00}}, {2, [3]byte{0xd1, 0x88, 0x00}}, {2, [3]byte{0xd1, 0x89, 0x00}}, {2, [3]byte{0xd1, 0x8a, 0x00}}, {2, [3]byte{0xd1, 0x8b, 0x00}}, {2, [3]byte{0xd1, 0x8c, 0x00}}, {2, [3]byte{0xd1, 0x8d, 0x00}}, {2, [3]byte{0xd1, 0x8e, 0x00}}, {2, [3]byte{0xd1, 0x8f, 0x00}}, {3, [3]byte{0xe2, 0x84, 0x96}}, {2, [3]byte{0xd1, 0x91, 0x00}}, {2, [3]byte{0xd1, 0x92, 0x00}}, {2, [3]byte{0xd1, 0x93, 0x00}}, {2, [3]byte{0xd1, 0x94, 0x00}}, {2, [3]byte{0xd1, 0x95, 0x00}}, {2, [3]byte{0xd1, 0x96, 0x00}}, {2, [3]byte{0xd1, 0x97, 0x00}}, {2, [3]byte{0xd1, 0x98, 0x00}}, {2, [3]byte{0xd1, 0x99, 0x00}}, {2, [3]byte{0xd1, 0x9a, 0x00}}, {2, [3]byte{0xd1, 0x9b, 0x00}}, {2, [3]byte{0xd1, 0x9c, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {2, [3]byte{0xd1, 0x9e, 0x00}}, {2, [3]byte{0xd1, 0x9f, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xa00000a0, 0xfd0000a7, 0xad0000ad, 0xa1000401, 0xa2000402, 0xa3000403, 0xa4000404, 0xa5000405, 0xa6000406, 0xa7000407, 0xa8000408, 0xa9000409, 0xaa00040a, 0xab00040b, 0xac00040c, 0xae00040e, 0xaf00040f, 0xb0000410, 0xb1000411, 0xb2000412, 0xb3000413, 0xb4000414, 0xb5000415, 0xb6000416, 0xb7000417, 0xb8000418, 0xb9000419, 0xba00041a, 0xbb00041b, 0xbc00041c, 0xbd00041d, 0xbe00041e, 0xbf00041f, 0xc0000420, 0xc1000421, 0xc2000422, 0xc3000423, 0xc4000424, 0xc5000425, 0xc6000426, 0xc7000427, 0xc8000428, 0xc9000429, 0xca00042a, 0xcb00042b, 0xcc00042c, 0xcd00042d, 0xce00042e, 0xcf00042f, 0xd0000430, 0xd1000431, 0xd2000432, 0xd3000433, 0xd4000434, 0xd5000435, 0xd6000436, 0xd7000437, 0xd8000438, 0xd9000439, 0xda00043a, 0xdb00043b, 0xdc00043c, 0xdd00043d, 0xde00043e, 0xdf00043f, 0xe0000440, 0xe1000441, 0xe2000442, 0xe3000443, 0xe4000444, 0xe5000445, 0xe6000446, 0xe7000447, 0xe8000448, 0xe9000449, 0xea00044a, 0xeb00044b, 0xec00044c, 0xed00044d, 0xee00044e, 0xef00044f, 0xf1000451, 0xf2000452, 0xf3000453, 0xf4000454, 0xf5000455, 0xf6000456, 0xf7000457, 0xf8000458, 0xf9000459, 0xfa00045a, 0xfb00045b, 0xfc00045c, 0xfe00045e, 0xff00045f, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, }, } // ISO8859_6 is the ISO 8859-6 encoding. var ISO8859_6 encoding.Encoding = &iso8859_6 var iso8859_6 = charmap{ name: "ISO 8859-6", mib: identifier.ISOLatinArabic, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xd8, 0x8c, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xd8, 0x9b, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xd8, 0x9f, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xd8, 0xa1, 0x00}}, {2, [3]byte{0xd8, 0xa2, 0x00}}, {2, [3]byte{0xd8, 0xa3, 0x00}}, {2, [3]byte{0xd8, 0xa4, 0x00}}, {2, [3]byte{0xd8, 0xa5, 0x00}}, {2, [3]byte{0xd8, 0xa6, 0x00}}, {2, [3]byte{0xd8, 0xa7, 0x00}}, {2, [3]byte{0xd8, 0xa8, 0x00}}, {2, [3]byte{0xd8, 0xa9, 0x00}}, {2, [3]byte{0xd8, 0xaa, 0x00}}, {2, [3]byte{0xd8, 0xab, 0x00}}, {2, [3]byte{0xd8, 0xac, 0x00}}, {2, [3]byte{0xd8, 0xad, 0x00}}, {2, [3]byte{0xd8, 0xae, 0x00}}, {2, [3]byte{0xd8, 0xaf, 0x00}}, {2, [3]byte{0xd8, 0xb0, 0x00}}, {2, [3]byte{0xd8, 0xb1, 0x00}}, {2, [3]byte{0xd8, 0xb2, 0x00}}, {2, [3]byte{0xd8, 0xb3, 0x00}}, {2, [3]byte{0xd8, 0xb4, 0x00}}, {2, [3]byte{0xd8, 0xb5, 0x00}}, {2, [3]byte{0xd8, 0xb6, 0x00}}, {2, [3]byte{0xd8, 0xb7, 0x00}}, {2, [3]byte{0xd8, 0xb8, 0x00}}, {2, [3]byte{0xd8, 0xb9, 0x00}}, {2, [3]byte{0xd8, 0xba, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xd9, 0x80, 0x00}}, {2, [3]byte{0xd9, 0x81, 0x00}}, {2, [3]byte{0xd9, 0x82, 0x00}}, {2, [3]byte{0xd9, 0x83, 0x00}}, {2, [3]byte{0xd9, 0x84, 0x00}}, {2, [3]byte{0xd9, 0x85, 0x00}}, {2, [3]byte{0xd9, 0x86, 0x00}}, {2, [3]byte{0xd9, 0x87, 0x00}}, {2, [3]byte{0xd9, 0x88, 0x00}}, {2, [3]byte{0xd9, 0x89, 0x00}}, {2, [3]byte{0xd9, 0x8a, 0x00}}, {2, [3]byte{0xd9, 0x8b, 0x00}}, {2, [3]byte{0xd9, 0x8c, 0x00}}, {2, [3]byte{0xd9, 0x8d, 0x00}}, {2, [3]byte{0xd9, 0x8e, 0x00}}, {2, [3]byte{0xd9, 0x8f, 0x00}}, {2, [3]byte{0xd9, 0x90, 0x00}}, {2, [3]byte{0xd9, 0x91, 0x00}}, {2, [3]byte{0xd9, 0x92, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xa00000a0, 0xa40000a4, 0xad0000ad, 0xac00060c, 0xbb00061b, 0xbf00061f, 0xc1000621, 0xc2000622, 0xc3000623, 0xc4000624, 0xc5000625, 0xc6000626, 0xc7000627, 0xc8000628, 0xc9000629, 0xca00062a, 0xcb00062b, 0xcc00062c, 0xcd00062d, 0xce00062e, 0xcf00062f, 0xd0000630, 0xd1000631, 0xd2000632, 0xd3000633, 0xd4000634, 0xd5000635, 0xd6000636, 0xd7000637, 0xd8000638, 0xd9000639, 0xda00063a, 0xe0000640, 0xe1000641, 0xe2000642, 0xe3000643, 0xe4000644, 0xe5000645, 0xe6000646, 0xe7000647, 0xe8000648, 0xe9000649, 0xea00064a, 0xeb00064b, 0xec00064c, 0xed00064d, 0xee00064e, 0xef00064f, 0xf0000650, 0xf1000651, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, }, } // ISO8859_7 is the ISO 8859-7 encoding. var ISO8859_7 encoding.Encoding = &iso8859_7 var iso8859_7 = charmap{ name: "ISO 8859-7", mib: identifier.ISOLatinGreek, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x98}}, {3, [3]byte{0xe2, 0x80, 0x99}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, {3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xe2, 0x82, 0xaf}}, {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, {2, [3]byte{0xcd, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x95}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, {2, [3]byte{0xce, 0x84, 0x00}}, {2, [3]byte{0xce, 0x85, 0x00}}, {2, [3]byte{0xce, 0x86, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xce, 0x88, 0x00}}, {2, [3]byte{0xce, 0x89, 0x00}}, {2, [3]byte{0xce, 0x8a, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {2, [3]byte{0xce, 0x8c, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, {2, [3]byte{0xce, 0x8e, 0x00}}, {2, [3]byte{0xce, 0x8f, 0x00}}, {2, [3]byte{0xce, 0x90, 0x00}}, {2, [3]byte{0xce, 0x91, 0x00}}, {2, [3]byte{0xce, 0x92, 0x00}}, {2, [3]byte{0xce, 0x93, 0x00}}, {2, [3]byte{0xce, 0x94, 0x00}}, {2, [3]byte{0xce, 0x95, 0x00}}, {2, [3]byte{0xce, 0x96, 0x00}}, {2, [3]byte{0xce, 0x97, 0x00}}, {2, [3]byte{0xce, 0x98, 0x00}}, {2, [3]byte{0xce, 0x99, 0x00}}, {2, [3]byte{0xce, 0x9a, 0x00}}, {2, [3]byte{0xce, 0x9b, 0x00}}, {2, [3]byte{0xce, 0x9c, 0x00}}, {2, [3]byte{0xce, 0x9d, 0x00}}, {2, [3]byte{0xce, 0x9e, 0x00}}, {2, [3]byte{0xce, 0x9f, 0x00}}, {2, [3]byte{0xce, 0xa0, 0x00}}, {2, [3]byte{0xce, 0xa1, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xce, 0xa3, 0x00}}, {2, [3]byte{0xce, 0xa4, 0x00}}, {2, [3]byte{0xce, 0xa5, 0x00}}, {2, [3]byte{0xce, 0xa6, 0x00}}, {2, [3]byte{0xce, 0xa7, 0x00}}, {2, [3]byte{0xce, 0xa8, 0x00}}, {2, [3]byte{0xce, 0xa9, 0x00}}, {2, [3]byte{0xce, 0xaa, 0x00}}, {2, [3]byte{0xce, 0xab, 0x00}}, {2, [3]byte{0xce, 0xac, 0x00}}, {2, [3]byte{0xce, 0xad, 0x00}}, {2, [3]byte{0xce, 0xae, 0x00}}, {2, [3]byte{0xce, 0xaf, 0x00}}, {2, [3]byte{0xce, 0xb0, 0x00}}, {2, [3]byte{0xce, 0xb1, 0x00}}, {2, [3]byte{0xce, 0xb2, 0x00}}, {2, [3]byte{0xce, 0xb3, 0x00}}, {2, [3]byte{0xce, 0xb4, 0x00}}, {2, [3]byte{0xce, 0xb5, 0x00}}, {2, [3]byte{0xce, 0xb6, 0x00}}, {2, [3]byte{0xce, 0xb7, 0x00}}, {2, [3]byte{0xce, 0xb8, 0x00}}, {2, [3]byte{0xce, 0xb9, 0x00}}, {2, [3]byte{0xce, 0xba, 0x00}}, {2, [3]byte{0xce, 0xbb, 0x00}}, {2, [3]byte{0xce, 0xbc, 0x00}}, {2, [3]byte{0xce, 0xbd, 0x00}}, {2, [3]byte{0xce, 0xbe, 0x00}}, {2, [3]byte{0xce, 0xbf, 0x00}}, {2, [3]byte{0xcf, 0x80, 0x00}}, {2, [3]byte{0xcf, 0x81, 0x00}}, {2, [3]byte{0xcf, 0x82, 0x00}}, {2, [3]byte{0xcf, 0x83, 0x00}}, {2, [3]byte{0xcf, 0x84, 0x00}}, {2, [3]byte{0xcf, 0x85, 0x00}}, {2, [3]byte{0xcf, 0x86, 0x00}}, {2, [3]byte{0xcf, 0x87, 0x00}}, {2, [3]byte{0xcf, 0x88, 0x00}}, {2, [3]byte{0xcf, 0x89, 0x00}}, {2, [3]byte{0xcf, 0x8a, 0x00}}, {2, [3]byte{0xcf, 0x8b, 0x00}}, {2, [3]byte{0xcf, 0x8c, 0x00}}, {2, [3]byte{0xcf, 0x8d, 0x00}}, {2, [3]byte{0xcf, 0x8e, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xa00000a0, 0xa30000a3, 0xa60000a6, 0xa70000a7, 0xa80000a8, 0xa90000a9, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xb00000b0, 0xb10000b1, 0xb20000b2, 0xb30000b3, 0xb70000b7, 0xbb0000bb, 0xbd0000bd, 0xaa00037a, 0xb4000384, 0xb5000385, 0xb6000386, 0xb8000388, 0xb9000389, 0xba00038a, 0xbc00038c, 0xbe00038e, 0xbf00038f, 0xc0000390, 0xc1000391, 0xc2000392, 0xc3000393, 0xc4000394, 0xc5000395, 0xc6000396, 0xc7000397, 0xc8000398, 0xc9000399, 0xca00039a, 0xcb00039b, 0xcc00039c, 0xcd00039d, 0xce00039e, 0xcf00039f, 0xd00003a0, 0xd10003a1, 0xd30003a3, 0xd40003a4, 0xd50003a5, 0xd60003a6, 0xd70003a7, 0xd80003a8, 0xd90003a9, 0xda0003aa, 0xdb0003ab, 0xdc0003ac, 0xdd0003ad, 0xde0003ae, 0xdf0003af, 0xe00003b0, 0xe10003b1, 0xe20003b2, 0xe30003b3, 0xe40003b4, 0xe50003b5, 0xe60003b6, 0xe70003b7, 0xe80003b8, 0xe90003b9, 0xea0003ba, 0xeb0003bb, 0xec0003bc, 0xed0003bd, 0xee0003be, 0xef0003bf, 0xf00003c0, 0xf10003c1, 0xf20003c2, 0xf30003c3, 0xf40003c4, 0xf50003c5, 0xf60003c6, 0xf70003c7, 0xf80003c8, 0xf90003c9, 0xfa0003ca, 0xfb0003cb, 0xfc0003cc, 0xfd0003cd, 0xfe0003ce, 0xaf002015, 0xa1002018, 0xa2002019, 0xa40020ac, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, }, } // ISO8859_8 is the ISO 8859-8 encoding. var ISO8859_8 encoding.Encoding = &iso8859_8 var iso8859_8 = charmap{ name: "ISO 8859-8", mib: identifier.ISOLatinHebrew, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xbe, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x97}}, {2, [3]byte{0xd7, 0x90, 0x00}}, {2, [3]byte{0xd7, 0x91, 0x00}}, {2, [3]byte{0xd7, 0x92, 0x00}}, {2, [3]byte{0xd7, 0x93, 0x00}}, {2, [3]byte{0xd7, 0x94, 0x00}}, {2, [3]byte{0xd7, 0x95, 0x00}}, {2, [3]byte{0xd7, 0x96, 0x00}}, {2, [3]byte{0xd7, 0x97, 0x00}}, {2, [3]byte{0xd7, 0x98, 0x00}}, {2, [3]byte{0xd7, 0x99, 0x00}}, {2, [3]byte{0xd7, 0x9a, 0x00}}, {2, [3]byte{0xd7, 0x9b, 0x00}}, {2, [3]byte{0xd7, 0x9c, 0x00}}, {2, [3]byte{0xd7, 0x9d, 0x00}}, {2, [3]byte{0xd7, 0x9e, 0x00}}, {2, [3]byte{0xd7, 0x9f, 0x00}}, {2, [3]byte{0xd7, 0xa0, 0x00}}, {2, [3]byte{0xd7, 0xa1, 0x00}}, {2, [3]byte{0xd7, 0xa2, 0x00}}, {2, [3]byte{0xd7, 0xa3, 0x00}}, {2, [3]byte{0xd7, 0xa4, 0x00}}, {2, [3]byte{0xd7, 0xa5, 0x00}}, {2, [3]byte{0xd7, 0xa6, 0x00}}, {2, [3]byte{0xd7, 0xa7, 0x00}}, {2, [3]byte{0xd7, 0xa8, 0x00}}, {2, [3]byte{0xd7, 0xa9, 0x00}}, {2, [3]byte{0xd7, 0xaa, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x8e}}, {3, [3]byte{0xe2, 0x80, 0x8f}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xa00000a0, 0xa20000a2, 0xa30000a3, 0xa40000a4, 0xa50000a5, 0xa60000a6, 0xa70000a7, 0xa80000a8, 0xa90000a9, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xaf0000af, 0xb00000b0, 0xb10000b1, 0xb20000b2, 0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7, 0xb80000b8, 0xb90000b9, 0xbb0000bb, 0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xaa0000d7, 0xba0000f7, 0xe00005d0, 0xe10005d1, 0xe20005d2, 0xe30005d3, 0xe40005d4, 0xe50005d5, 0xe60005d6, 0xe70005d7, 0xe80005d8, 0xe90005d9, 0xea0005da, 0xeb0005db, 0xec0005dc, 0xed0005dd, 0xee0005de, 0xef0005df, 0xf00005e0, 0xf10005e1, 0xf20005e2, 0xf30005e3, 0xf40005e4, 0xf50005e5, 0xf60005e6, 0xf70005e7, 0xf80005e8, 0xf90005e9, 0xfa0005ea, 0xfd00200e, 0xfe00200f, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, }, } // ISO8859_9 is the ISO 8859-9 encoding. var ISO8859_9 encoding.Encoding = &iso8859_9 var iso8859_9 = charmap{ name: "ISO 8859-9", mib: identifier.ISOLatin5, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x80, 0x00}}, {2, [3]byte{0xc2, 0x81, 0x00}}, {2, [3]byte{0xc2, 0x82, 0x00}}, {2, [3]byte{0xc2, 0x83, 0x00}}, {2, [3]byte{0xc2, 0x84, 0x00}}, {2, [3]byte{0xc2, 0x85, 0x00}}, {2, [3]byte{0xc2, 0x86, 0x00}}, {2, [3]byte{0xc2, 0x87, 0x00}}, {2, [3]byte{0xc2, 0x88, 0x00}}, {2, [3]byte{0xc2, 0x89, 0x00}}, {2, [3]byte{0xc2, 0x8a, 0x00}}, {2, [3]byte{0xc2, 0x8b, 0x00}}, {2, [3]byte{0xc2, 0x8c, 0x00}}, {2, [3]byte{0xc2, 0x8d, 0x00}}, {2, [3]byte{0xc2, 0x8e, 0x00}}, {2, [3]byte{0xc2, 0x8f, 0x00}}, {2, [3]byte{0xc2, 0x90, 0x00}}, {2, [3]byte{0xc2, 0x91, 0x00}}, {2, [3]byte{0xc2, 0x92, 0x00}}, {2, [3]byte{0xc2, 0x93, 0x00}}, {2, [3]byte{0xc2, 0x94, 0x00}}, {2, [3]byte{0xc2, 0x95, 0x00}}, {2, [3]byte{0xc2, 0x96, 0x00}}, {2, [3]byte{0xc2, 0x97, 0x00}}, {2, [3]byte{0xc2, 0x98, 0x00}}, {2, [3]byte{0xc2, 0x99, 0x00}}, {2, [3]byte{0xc2, 0x9a, 0x00}}, {2, [3]byte{0xc2, 0x9b, 0x00}}, {2, [3]byte{0xc2, 0x9c, 0x00}}, {2, [3]byte{0xc2, 0x9d, 0x00}}, {2, [3]byte{0xc2, 0x9e, 0x00}}, {2, [3]byte{0xc2, 0x9f, 0x00}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}}, {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, {2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}}, {2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}}, {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, {2, [3]byte{0xc3, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}}, {2, [3]byte{0xc4, 0x9e, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}}, {2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, {2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}}, {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc4, 0xb0, 0x00}}, {2, [3]byte{0xc5, 0x9e, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, {2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, {2, [3]byte{0xc4, 0x9f, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}}, {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc4, 0xb1, 0x00}}, {2, [3]byte{0xc5, 0x9f, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0x80000080, 0x81000081, 0x82000082, 0x83000083, 0x84000084, 0x85000085, 0x86000086, 0x87000087, 0x88000088, 0x89000089, 0x8a00008a, 0x8b00008b, 0x8c00008c, 0x8d00008d, 0x8e00008e, 0x8f00008f, 0x90000090, 0x91000091, 0x92000092, 0x93000093, 0x94000094, 0x95000095, 0x96000096, 0x97000097, 0x98000098, 0x99000099, 0x9a00009a, 0x9b00009b, 0x9c00009c, 0x9d00009d, 0x9e00009e, 0x9f00009f, 0xa00000a0, 0xa10000a1, 0xa20000a2, 0xa30000a3, 0xa40000a4, 0xa50000a5, 0xa60000a6, 0xa70000a7, 0xa80000a8, 0xa90000a9, 0xaa0000aa, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xaf0000af, 0xb00000b0, 0xb10000b1, 0xb20000b2, 0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7, 0xb80000b8, 0xb90000b9, 0xba0000ba, 0xbb0000bb, 0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xbf0000bf, 0xc00000c0, 0xc10000c1, 0xc20000c2, 0xc30000c3, 0xc40000c4, 0xc50000c5, 0xc60000c6, 0xc70000c7, 0xc80000c8, 0xc90000c9, 0xca0000ca, 0xcb0000cb, 0xcc0000cc, 0xcd0000cd, 0xce0000ce, 0xcf0000cf, 0xd10000d1, 0xd20000d2, 0xd30000d3, 0xd40000d4, 0xd50000d5, 0xd60000d6, 0xd70000d7, 0xd80000d8, 0xd90000d9, 0xda0000da, 0xdb0000db, 0xdc0000dc, 0xdf0000df, 0xe00000e0, 0xe10000e1, 0xe20000e2, 0xe30000e3, 0xe40000e4, 0xe50000e5, 0xe60000e6, 0xe70000e7, 0xe80000e8, 0xe90000e9, 0xea0000ea, 0xeb0000eb, 0xec0000ec, 0xed0000ed, 0xee0000ee, 0xef0000ef, 0xf10000f1, 0xf20000f2, 0xf30000f3, 0xf40000f4, 0xf50000f5, 0xf60000f6, 0xf70000f7, 0xf80000f8, 0xf90000f9, 0xfa0000fa, 0xfb0000fb, 0xfc0000fc, 0xff0000ff, 0xd000011e, 0xf000011f, 0xdd000130, 0xfd000131, 0xde00015e, 0xfe00015f, }, } // ISO8859_10 is the ISO 8859-10 encoding. var ISO8859_10 encoding.Encoding = &iso8859_10 var iso8859_10 = charmap{ name: "ISO 8859-10", mib: identifier.ISOLatin6, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc4, 0x84, 0x00}}, {2, [3]byte{0xc4, 0x92, 0x00}}, {2, [3]byte{0xc4, 0xa2, 0x00}}, {2, [3]byte{0xc4, 0xaa, 0x00}}, {2, [3]byte{0xc4, 0xa8, 0x00}}, {2, [3]byte{0xc4, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {2, [3]byte{0xc4, 0xbb, 0x00}}, {2, [3]byte{0xc4, 0x90, 0x00}}, {2, [3]byte{0xc5, 0xa0, 0x00}}, {2, [3]byte{0xc5, 0xa6, 0x00}}, {2, [3]byte{0xc5, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc5, 0xaa, 0x00}}, {2, [3]byte{0xc5, 0x8a, 0x00}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc4, 0x85, 0x00}}, {2, [3]byte{0xc4, 0x93, 0x00}}, {2, [3]byte{0xc4, 0xa3, 0x00}}, {2, [3]byte{0xc4, 0xab, 0x00}}, {2, [3]byte{0xc4, 0xa9, 0x00}}, {2, [3]byte{0xc4, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc4, 0xbc, 0x00}}, {2, [3]byte{0xc4, 0x91, 0x00}}, {2, [3]byte{0xc5, 0xa1, 0x00}}, {2, [3]byte{0xc5, 0xa7, 0x00}}, {2, [3]byte{0xc5, 0xbe, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x95}}, {2, [3]byte{0xc5, 0xab, 0x00}}, {2, [3]byte{0xc5, 0x8b, 0x00}}, {2, [3]byte{0xc4, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}}, {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc4, 0xae, 0x00}}, {2, [3]byte{0xc4, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc4, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, {2, [3]byte{0xc4, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}}, {2, [3]byte{0xc3, 0x90, 0x00}}, {2, [3]byte{0xc5, 0x85, 0x00}}, {2, [3]byte{0xc5, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc5, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc5, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}}, {2, [3]byte{0xc3, 0x9e, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, {2, [3]byte{0xc4, 0x81, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc4, 0xaf, 0x00}}, {2, [3]byte{0xc4, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc4, 0x99, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, {2, [3]byte{0xc4, 0x97, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, {2, [3]byte{0xc3, 0xb0, 0x00}}, {2, [3]byte{0xc5, 0x86, 0x00}}, {2, [3]byte{0xc5, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}}, {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc5, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc5, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}}, {2, [3]byte{0xc3, 0xbe, 0x00}}, {2, [3]byte{0xc4, 0xb8, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xa00000a0, 0xa70000a7, 0xad0000ad, 0xb00000b0, 0xb70000b7, 0xc10000c1, 0xc20000c2, 0xc30000c3, 0xc40000c4, 0xc50000c5, 0xc60000c6, 0xc90000c9, 0xcb0000cb, 0xcd0000cd, 0xce0000ce, 0xcf0000cf, 0xd00000d0, 0xd30000d3, 0xd40000d4, 0xd50000d5, 0xd60000d6, 0xd80000d8, 0xda0000da, 0xdb0000db, 0xdc0000dc, 0xdd0000dd, 0xde0000de, 0xdf0000df, 0xe10000e1, 0xe20000e2, 0xe30000e3, 0xe40000e4, 0xe50000e5, 0xe60000e6, 0xe90000e9, 0xeb0000eb, 0xed0000ed, 0xee0000ee, 0xef0000ef, 0xf00000f0, 0xf30000f3, 0xf40000f4, 0xf50000f5, 0xf60000f6, 0xf80000f8, 0xfa0000fa, 0xfb0000fb, 0xfc0000fc, 0xfd0000fd, 0xfe0000fe, 0xc0000100, 0xe0000101, 0xa1000104, 0xb1000105, 0xc800010c, 0xe800010d, 0xa9000110, 0xb9000111, 0xa2000112, 0xb2000113, 0xcc000116, 0xec000117, 0xca000118, 0xea000119, 0xa3000122, 0xb3000123, 0xa5000128, 0xb5000129, 0xa400012a, 0xb400012b, 0xc700012e, 0xe700012f, 0xa6000136, 0xb6000137, 0xff000138, 0xa800013b, 0xb800013c, 0xd1000145, 0xf1000146, 0xaf00014a, 0xbf00014b, 0xd200014c, 0xf200014d, 0xaa000160, 0xba000161, 0xab000166, 0xbb000167, 0xd7000168, 0xf7000169, 0xae00016a, 0xbe00016b, 0xd9000172, 0xf9000173, 0xac00017d, 0xbc00017e, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, }, } // ISO8859_13 is the ISO 8859-13 encoding. var ISO8859_13 encoding.Encoding = &iso8859_13 var iso8859_13 = charmap{ name: "ISO 8859-13", mib: identifier.ISO885913, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x9d}}, {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x9e}}, {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, {2, [3]byte{0xc5, 0x96, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x9c}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}}, {2, [3]byte{0xc5, 0x97, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc4, 0x84, 0x00}}, {2, [3]byte{0xc4, 0xae, 0x00}}, {2, [3]byte{0xc4, 0x80, 0x00}}, {2, [3]byte{0xc4, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, {2, [3]byte{0xc4, 0x98, 0x00}}, {2, [3]byte{0xc4, 0x92, 0x00}}, {2, [3]byte{0xc4, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc5, 0xb9, 0x00}}, {2, [3]byte{0xc4, 0x96, 0x00}}, {2, [3]byte{0xc4, 0xa2, 0x00}}, {2, [3]byte{0xc4, 0xb6, 0x00}}, {2, [3]byte{0xc4, 0xaa, 0x00}}, {2, [3]byte{0xc4, 0xbb, 0x00}}, {2, [3]byte{0xc5, 0xa0, 0x00}}, {2, [3]byte{0xc5, 0x83, 0x00}}, {2, [3]byte{0xc5, 0x85, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc5, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, {2, [3]byte{0xc5, 0xb2, 0x00}}, {2, [3]byte{0xc5, 0x81, 0x00}}, {2, [3]byte{0xc5, 0x9a, 0x00}}, {2, [3]byte{0xc5, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc5, 0xbb, 0x00}}, {2, [3]byte{0xc5, 0xbd, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, {2, [3]byte{0xc4, 0x85, 0x00}}, {2, [3]byte{0xc4, 0xaf, 0x00}}, {2, [3]byte{0xc4, 0x81, 0x00}}, {2, [3]byte{0xc4, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, {2, [3]byte{0xc4, 0x99, 0x00}}, {2, [3]byte{0xc4, 0x93, 0x00}}, {2, [3]byte{0xc4, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc5, 0xba, 0x00}}, {2, [3]byte{0xc4, 0x97, 0x00}}, {2, [3]byte{0xc4, 0xa3, 0x00}}, {2, [3]byte{0xc4, 0xb7, 0x00}}, {2, [3]byte{0xc4, 0xab, 0x00}}, {2, [3]byte{0xc4, 0xbc, 0x00}}, {2, [3]byte{0xc5, 0xa1, 0x00}}, {2, [3]byte{0xc5, 0x84, 0x00}}, {2, [3]byte{0xc5, 0x86, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc5, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}}, {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {2, [3]byte{0xc5, 0xb3, 0x00}}, {2, [3]byte{0xc5, 0x82, 0x00}}, {2, [3]byte{0xc5, 0x9b, 0x00}}, {2, [3]byte{0xc5, 0xab, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc5, 0xbc, 0x00}}, {2, [3]byte{0xc5, 0xbe, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x99}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xa00000a0, 0xa20000a2, 0xa30000a3, 0xa40000a4, 0xa60000a6, 0xa70000a7, 0xa90000a9, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xb00000b0, 0xb10000b1, 0xb20000b2, 0xb30000b3, 0xb50000b5, 0xb60000b6, 0xb70000b7, 0xb90000b9, 0xbb0000bb, 0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xc40000c4, 0xc50000c5, 0xaf0000c6, 0xc90000c9, 0xd30000d3, 0xd50000d5, 0xd60000d6, 0xd70000d7, 0xa80000d8, 0xdc0000dc, 0xdf0000df, 0xe40000e4, 0xe50000e5, 0xbf0000e6, 0xe90000e9, 0xf30000f3, 0xf50000f5, 0xf60000f6, 0xf70000f7, 0xb80000f8, 0xfc0000fc, 0xc2000100, 0xe2000101, 0xc0000104, 0xe0000105, 0xc3000106, 0xe3000107, 0xc800010c, 0xe800010d, 0xc7000112, 0xe7000113, 0xcb000116, 0xeb000117, 0xc6000118, 0xe6000119, 0xcc000122, 0xec000123, 0xce00012a, 0xee00012b, 0xc100012e, 0xe100012f, 0xcd000136, 0xed000137, 0xcf00013b, 0xef00013c, 0xd9000141, 0xf9000142, 0xd1000143, 0xf1000144, 0xd2000145, 0xf2000146, 0xd400014c, 0xf400014d, 0xaa000156, 0xba000157, 0xda00015a, 0xfa00015b, 0xd0000160, 0xf0000161, 0xdb00016a, 0xfb00016b, 0xd8000172, 0xf8000173, 0xca000179, 0xea00017a, 0xdd00017b, 0xfd00017c, 0xde00017d, 0xfe00017e, 0xff002019, 0xb400201c, 0xa100201d, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, }, } // ISO8859_14 is the ISO 8859-14 encoding. var ISO8859_14 encoding.Encoding = &iso8859_14 var iso8859_14 = charmap{ name: "ISO 8859-14", mib: identifier.ISO885914, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {3, [3]byte{0xe1, 0xb8, 0x82}}, {3, [3]byte{0xe1, 0xb8, 0x83}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc4, 0x8a, 0x00}}, {2, [3]byte{0xc4, 0x8b, 0x00}}, {3, [3]byte{0xe1, 0xb8, 0x8a}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {3, [3]byte{0xe1, 0xba, 0x80}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, {3, [3]byte{0xe1, 0xba, 0x82}}, {3, [3]byte{0xe1, 0xb8, 0x8b}}, {3, [3]byte{0xe1, 0xbb, 0xb2}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc5, 0xb8, 0x00}}, {3, [3]byte{0xe1, 0xb8, 0x9e}}, {3, [3]byte{0xe1, 0xb8, 0x9f}}, {2, [3]byte{0xc4, 0xa0, 0x00}}, {2, [3]byte{0xc4, 0xa1, 0x00}}, {3, [3]byte{0xe1, 0xb9, 0x80}}, {3, [3]byte{0xe1, 0xb9, 0x81}}, {2, [3]byte{0xc2, 0xb6, 0x00}}, {3, [3]byte{0xe1, 0xb9, 0x96}}, {3, [3]byte{0xe1, 0xba, 0x81}}, {3, [3]byte{0xe1, 0xb9, 0x97}}, {3, [3]byte{0xe1, 0xba, 0x83}}, {3, [3]byte{0xe1, 0xb9, 0xa0}}, {3, [3]byte{0xe1, 0xbb, 0xb3}}, {3, [3]byte{0xe1, 0xba, 0x84}}, {3, [3]byte{0xe1, 0xba, 0x85}}, {3, [3]byte{0xe1, 0xb9, 0xa1}}, {2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}}, {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, {2, [3]byte{0xc3, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}}, {2, [3]byte{0xc5, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}}, {2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, {3, [3]byte{0xe1, 0xb9, 0xaa}}, {2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}}, {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}}, {2, [3]byte{0xc5, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, {2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, {2, [3]byte{0xc5, 0xb5, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}}, {2, [3]byte{0xc3, 0xb6, 0x00}}, {3, [3]byte{0xe1, 0xb9, 0xab}}, {2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}}, {2, [3]byte{0xc5, 0xb7, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xa00000a0, 0xa30000a3, 0xa70000a7, 0xa90000a9, 0xad0000ad, 0xae0000ae, 0xb60000b6, 0xc00000c0, 0xc10000c1, 0xc20000c2, 0xc30000c3, 0xc40000c4, 0xc50000c5, 0xc60000c6, 0xc70000c7, 0xc80000c8, 0xc90000c9, 0xca0000ca, 0xcb0000cb, 0xcc0000cc, 0xcd0000cd, 0xce0000ce, 0xcf0000cf, 0xd10000d1, 0xd20000d2, 0xd30000d3, 0xd40000d4, 0xd50000d5, 0xd60000d6, 0xd80000d8, 0xd90000d9, 0xda0000da, 0xdb0000db, 0xdc0000dc, 0xdd0000dd, 0xdf0000df, 0xe00000e0, 0xe10000e1, 0xe20000e2, 0xe30000e3, 0xe40000e4, 0xe50000e5, 0xe60000e6, 0xe70000e7, 0xe80000e8, 0xe90000e9, 0xea0000ea, 0xeb0000eb, 0xec0000ec, 0xed0000ed, 0xee0000ee, 0xef0000ef, 0xf10000f1, 0xf20000f2, 0xf30000f3, 0xf40000f4, 0xf50000f5, 0xf60000f6, 0xf80000f8, 0xf90000f9, 0xfa0000fa, 0xfb0000fb, 0xfc0000fc, 0xfd0000fd, 0xff0000ff, 0xa400010a, 0xa500010b, 0xb2000120, 0xb3000121, 0xd0000174, 0xf0000175, 0xde000176, 0xfe000177, 0xaf000178, 0xa1001e02, 0xa2001e03, 0xa6001e0a, 0xab001e0b, 0xb0001e1e, 0xb1001e1f, 0xb4001e40, 0xb5001e41, 0xb7001e56, 0xb9001e57, 0xbb001e60, 0xbf001e61, 0xd7001e6a, 0xf7001e6b, 0xa8001e80, 0xb8001e81, 0xaa001e82, 0xba001e83, 0xbd001e84, 0xbe001e85, 0xac001ef2, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, }, } // ISO8859_15 is the ISO 8859-15 encoding. var ISO8859_15 encoding.Encoding = &iso8859_15 var iso8859_15 = charmap{ name: "ISO 8859-15", mib: identifier.ISO885915, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}}, {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, {3, [3]byte{0xe2, 0x82, 0xac}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, {2, [3]byte{0xc5, 0xa0, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {2, [3]byte{0xc5, 0xa1, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, {2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, {2, [3]byte{0xc5, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc5, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {2, [3]byte{0xc5, 0x92, 0x00}}, {2, [3]byte{0xc5, 0x93, 0x00}}, {2, [3]byte{0xc5, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}}, {2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}}, {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, {2, [3]byte{0xc3, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}}, {2, [3]byte{0xc3, 0x90, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}}, {2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, {2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}}, {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}}, {2, [3]byte{0xc3, 0x9e, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, {2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, {2, [3]byte{0xc3, 0xb0, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}}, {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}}, {2, [3]byte{0xc3, 0xbe, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xa00000a0, 0xa10000a1, 0xa20000a2, 0xa30000a3, 0xa50000a5, 0xa70000a7, 0xa90000a9, 0xaa0000aa, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xaf0000af, 0xb00000b0, 0xb10000b1, 0xb20000b2, 0xb30000b3, 0xb50000b5, 0xb60000b6, 0xb70000b7, 0xb90000b9, 0xba0000ba, 0xbb0000bb, 0xbf0000bf, 0xc00000c0, 0xc10000c1, 0xc20000c2, 0xc30000c3, 0xc40000c4, 0xc50000c5, 0xc60000c6, 0xc70000c7, 0xc80000c8, 0xc90000c9, 0xca0000ca, 0xcb0000cb, 0xcc0000cc, 0xcd0000cd, 0xce0000ce, 0xcf0000cf, 0xd00000d0, 0xd10000d1, 0xd20000d2, 0xd30000d3, 0xd40000d4, 0xd50000d5, 0xd60000d6, 0xd70000d7, 0xd80000d8, 0xd90000d9, 0xda0000da, 0xdb0000db, 0xdc0000dc, 0xdd0000dd, 0xde0000de, 0xdf0000df, 0xe00000e0, 0xe10000e1, 0xe20000e2, 0xe30000e3, 0xe40000e4, 0xe50000e5, 0xe60000e6, 0xe70000e7, 0xe80000e8, 0xe90000e9, 0xea0000ea, 0xeb0000eb, 0xec0000ec, 0xed0000ed, 0xee0000ee, 0xef0000ef, 0xf00000f0, 0xf10000f1, 0xf20000f2, 0xf30000f3, 0xf40000f4, 0xf50000f5, 0xf60000f6, 0xf70000f7, 0xf80000f8, 0xf90000f9, 0xfa0000fa, 0xfb0000fb, 0xfc0000fc, 0xfd0000fd, 0xfe0000fe, 0xff0000ff, 0xbc000152, 0xbd000153, 0xa6000160, 0xa8000161, 0xbe000178, 0xb400017d, 0xb800017e, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, }, } // ISO8859_16 is the ISO 8859-16 encoding. var ISO8859_16 encoding.Encoding = &iso8859_16 var iso8859_16 = charmap{ name: "ISO 8859-16", mib: identifier.ISO885916, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc4, 0x84, 0x00}}, {2, [3]byte{0xc4, 0x85, 0x00}}, {2, [3]byte{0xc5, 0x81, 0x00}}, {3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xe2, 0x80, 0x9e}}, {2, [3]byte{0xc5, 0xa0, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {2, [3]byte{0xc5, 0xa1, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, {2, [3]byte{0xc8, 0x98, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc5, 0xb9, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc5, 0xba, 0x00}}, {2, [3]byte{0xc5, 0xbb, 0x00}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, {2, [3]byte{0xc4, 0x8c, 0x00}}, {2, [3]byte{0xc5, 0x82, 0x00}}, {2, [3]byte{0xc5, 0xbd, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x9d}}, {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc5, 0xbe, 0x00}}, {2, [3]byte{0xc4, 0x8d, 0x00}}, {2, [3]byte{0xc8, 0x99, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {2, [3]byte{0xc5, 0x92, 0x00}}, {2, [3]byte{0xc5, 0x93, 0x00}}, {2, [3]byte{0xc5, 0xb8, 0x00}}, {2, [3]byte{0xc5, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc4, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc4, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, {2, [3]byte{0xc3, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}}, {2, [3]byte{0xc4, 0x90, 0x00}}, {2, [3]byte{0xc5, 0x83, 0x00}}, {2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc5, 0x90, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc5, 0x9a, 0x00}}, {2, [3]byte{0xc5, 0xb0, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}}, {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc4, 0x98, 0x00}}, {2, [3]byte{0xc8, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc4, 0x83, 0x00}}, {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc4, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, {2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, {2, [3]byte{0xc4, 0x91, 0x00}}, {2, [3]byte{0xc5, 0x84, 0x00}}, {2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc5, 0x91, 0x00}}, {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc5, 0x9b, 0x00}}, {2, [3]byte{0xc5, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc4, 0x99, 0x00}}, {2, [3]byte{0xc8, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xa00000a0, 0xa70000a7, 0xa90000a9, 0xab0000ab, 0xad0000ad, 0xb00000b0, 0xb10000b1, 0xb60000b6, 0xb70000b7, 0xbb0000bb, 0xc00000c0, 0xc10000c1, 0xc20000c2, 0xc40000c4, 0xc60000c6, 0xc70000c7, 0xc80000c8, 0xc90000c9, 0xca0000ca, 0xcb0000cb, 0xcc0000cc, 0xcd0000cd, 0xce0000ce, 0xcf0000cf, 0xd20000d2, 0xd30000d3, 0xd40000d4, 0xd60000d6, 0xd90000d9, 0xda0000da, 0xdb0000db, 0xdc0000dc, 0xdf0000df, 0xe00000e0, 0xe10000e1, 0xe20000e2, 0xe40000e4, 0xe60000e6, 0xe70000e7, 0xe80000e8, 0xe90000e9, 0xea0000ea, 0xeb0000eb, 0xec0000ec, 0xed0000ed, 0xee0000ee, 0xef0000ef, 0xf20000f2, 0xf30000f3, 0xf40000f4, 0xf60000f6, 0xf90000f9, 0xfa0000fa, 0xfb0000fb, 0xfc0000fc, 0xff0000ff, 0xc3000102, 0xe3000103, 0xa1000104, 0xa2000105, 0xc5000106, 0xe5000107, 0xb200010c, 0xb900010d, 0xd0000110, 0xf0000111, 0xdd000118, 0xfd000119, 0xa3000141, 0xb3000142, 0xd1000143, 0xf1000144, 0xd5000150, 0xf5000151, 0xbc000152, 0xbd000153, 0xd700015a, 0xf700015b, 0xa6000160, 0xa8000161, 0xd8000170, 0xf8000171, 0xbe000178, 0xac000179, 0xae00017a, 0xaf00017b, 0xbf00017c, 0xb400017d, 0xb800017e, 0xaa000218, 0xba000219, 0xde00021a, 0xfe00021b, 0xb500201d, 0xa500201e, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, }, } // KOI8R is the KOI8-R encoding. var KOI8R encoding.Encoding = &koi8R var koi8R = charmap{ name: "KOI8-R", mib: identifier.KOI8R, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0x82}}, {3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x94, 0x90}}, {3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0x98}}, {3, [3]byte{0xe2, 0x94, 0x9c}}, {3, [3]byte{0xe2, 0x94, 0xa4}}, {3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0xb4}}, {3, [3]byte{0xe2, 0x94, 0xbc}}, {3, [3]byte{0xe2, 0x96, 0x80}}, {3, [3]byte{0xe2, 0x96, 0x84}}, {3, [3]byte{0xe2, 0x96, 0x88}}, {3, [3]byte{0xe2, 0x96, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x90}}, {3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}}, {3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x8c, 0xa0}}, {3, [3]byte{0xe2, 0x96, 0xa0}}, {3, [3]byte{0xe2, 0x88, 0x99}}, {3, [3]byte{0xe2, 0x88, 0x9a}}, {3, [3]byte{0xe2, 0x89, 0x88}}, {3, [3]byte{0xe2, 0x89, 0xa4}}, {3, [3]byte{0xe2, 0x89, 0xa5}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {3, [3]byte{0xe2, 0x8c, 0xa1}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x95, 0x90}}, {3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x92}}, {2, [3]byte{0xd1, 0x91, 0x00}}, {3, [3]byte{0xe2, 0x95, 0x93}}, {3, [3]byte{0xe2, 0x95, 0x94}}, {3, [3]byte{0xe2, 0x95, 0x95}}, {3, [3]byte{0xe2, 0x95, 0x96}}, {3, [3]byte{0xe2, 0x95, 0x97}}, {3, [3]byte{0xe2, 0x95, 0x98}}, {3, [3]byte{0xe2, 0x95, 0x99}}, {3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x9b}}, {3, [3]byte{0xe2, 0x95, 0x9c}}, {3, [3]byte{0xe2, 0x95, 0x9d}}, {3, [3]byte{0xe2, 0x95, 0x9e}}, {3, [3]byte{0xe2, 0x95, 0x9f}}, {3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0xa1}}, {2, [3]byte{0xd0, 0x81, 0x00}}, {3, [3]byte{0xe2, 0x95, 0xa2}}, {3, [3]byte{0xe2, 0x95, 0xa3}}, {3, [3]byte{0xe2, 0x95, 0xa4}}, {3, [3]byte{0xe2, 0x95, 0xa5}}, {3, [3]byte{0xe2, 0x95, 0xa6}}, {3, [3]byte{0xe2, 0x95, 0xa7}}, {3, [3]byte{0xe2, 0x95, 0xa8}}, {3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xaa}}, {3, [3]byte{0xe2, 0x95, 0xab}}, {3, [3]byte{0xe2, 0x95, 0xac}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, {2, [3]byte{0xd1, 0x8e, 0x00}}, {2, [3]byte{0xd0, 0xb0, 0x00}}, {2, [3]byte{0xd0, 0xb1, 0x00}}, {2, [3]byte{0xd1, 0x86, 0x00}}, {2, [3]byte{0xd0, 0xb4, 0x00}}, {2, [3]byte{0xd0, 0xb5, 0x00}}, {2, [3]byte{0xd1, 0x84, 0x00}}, {2, [3]byte{0xd0, 0xb3, 0x00}}, {2, [3]byte{0xd1, 0x85, 0x00}}, {2, [3]byte{0xd0, 0xb8, 0x00}}, {2, [3]byte{0xd0, 0xb9, 0x00}}, {2, [3]byte{0xd0, 0xba, 0x00}}, {2, [3]byte{0xd0, 0xbb, 0x00}}, {2, [3]byte{0xd0, 0xbc, 0x00}}, {2, [3]byte{0xd0, 0xbd, 0x00}}, {2, [3]byte{0xd0, 0xbe, 0x00}}, {2, [3]byte{0xd0, 0xbf, 0x00}}, {2, [3]byte{0xd1, 0x8f, 0x00}}, {2, [3]byte{0xd1, 0x80, 0x00}}, {2, [3]byte{0xd1, 0x81, 0x00}}, {2, [3]byte{0xd1, 0x82, 0x00}}, {2, [3]byte{0xd1, 0x83, 0x00}}, {2, [3]byte{0xd0, 0xb6, 0x00}}, {2, [3]byte{0xd0, 0xb2, 0x00}}, {2, [3]byte{0xd1, 0x8c, 0x00}}, {2, [3]byte{0xd1, 0x8b, 0x00}}, {2, [3]byte{0xd0, 0xb7, 0x00}}, {2, [3]byte{0xd1, 0x88, 0x00}}, {2, [3]byte{0xd1, 0x8d, 0x00}}, {2, [3]byte{0xd1, 0x89, 0x00}}, {2, [3]byte{0xd1, 0x87, 0x00}}, {2, [3]byte{0xd1, 0x8a, 0x00}}, {2, [3]byte{0xd0, 0xae, 0x00}}, {2, [3]byte{0xd0, 0x90, 0x00}}, {2, [3]byte{0xd0, 0x91, 0x00}}, {2, [3]byte{0xd0, 0xa6, 0x00}}, {2, [3]byte{0xd0, 0x94, 0x00}}, {2, [3]byte{0xd0, 0x95, 0x00}}, {2, [3]byte{0xd0, 0xa4, 0x00}}, {2, [3]byte{0xd0, 0x93, 0x00}}, {2, [3]byte{0xd0, 0xa5, 0x00}}, {2, [3]byte{0xd0, 0x98, 0x00}}, {2, [3]byte{0xd0, 0x99, 0x00}}, {2, [3]byte{0xd0, 0x9a, 0x00}}, {2, [3]byte{0xd0, 0x9b, 0x00}}, {2, [3]byte{0xd0, 0x9c, 0x00}}, {2, [3]byte{0xd0, 0x9d, 0x00}}, {2, [3]byte{0xd0, 0x9e, 0x00}}, {2, [3]byte{0xd0, 0x9f, 0x00}}, {2, [3]byte{0xd0, 0xaf, 0x00}}, {2, [3]byte{0xd0, 0xa0, 0x00}}, {2, [3]byte{0xd0, 0xa1, 0x00}}, {2, [3]byte{0xd0, 0xa2, 0x00}}, {2, [3]byte{0xd0, 0xa3, 0x00}}, {2, [3]byte{0xd0, 0x96, 0x00}}, {2, [3]byte{0xd0, 0x92, 0x00}}, {2, [3]byte{0xd0, 0xac, 0x00}}, {2, [3]byte{0xd0, 0xab, 0x00}}, {2, [3]byte{0xd0, 0x97, 0x00}}, {2, [3]byte{0xd0, 0xa8, 0x00}}, {2, [3]byte{0xd0, 0xad, 0x00}}, {2, [3]byte{0xd0, 0xa9, 0x00}}, {2, [3]byte{0xd0, 0xa7, 0x00}}, {2, [3]byte{0xd0, 0xaa, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0x9a0000a0, 0xbf0000a9, 0x9c0000b0, 0x9d0000b2, 0x9e0000b7, 0x9f0000f7, 0xb3000401, 0xe1000410, 0xe2000411, 0xf7000412, 0xe7000413, 0xe4000414, 0xe5000415, 0xf6000416, 0xfa000417, 0xe9000418, 0xea000419, 0xeb00041a, 0xec00041b, 0xed00041c, 0xee00041d, 0xef00041e, 0xf000041f, 0xf2000420, 0xf3000421, 0xf4000422, 0xf5000423, 0xe6000424, 0xe8000425, 0xe3000426, 0xfe000427, 0xfb000428, 0xfd000429, 0xff00042a, 0xf900042b, 0xf800042c, 0xfc00042d, 0xe000042e, 0xf100042f, 0xc1000430, 0xc2000431, 0xd7000432, 0xc7000433, 0xc4000434, 0xc5000435, 0xd6000436, 0xda000437, 0xc9000438, 0xca000439, 0xcb00043a, 0xcc00043b, 0xcd00043c, 0xce00043d, 0xcf00043e, 0xd000043f, 0xd2000440, 0xd3000441, 0xd4000442, 0xd5000443, 0xc6000444, 0xc8000445, 0xc3000446, 0xde000447, 0xdb000448, 0xdd000449, 0xdf00044a, 0xd900044b, 0xd800044c, 0xdc00044d, 0xc000044e, 0xd100044f, 0xa3000451, 0x95002219, 0x9600221a, 0x97002248, 0x98002264, 0x99002265, 0x93002320, 0x9b002321, 0x80002500, 0x81002502, 0x8200250c, 0x83002510, 0x84002514, 0x85002518, 0x8600251c, 0x87002524, 0x8800252c, 0x89002534, 0x8a00253c, 0xa0002550, 0xa1002551, 0xa2002552, 0xa4002553, 0xa5002554, 0xa6002555, 0xa7002556, 0xa8002557, 0xa9002558, 0xaa002559, 0xab00255a, 0xac00255b, 0xad00255c, 0xae00255d, 0xaf00255e, 0xb000255f, 0xb1002560, 0xb2002561, 0xb4002562, 0xb5002563, 0xb6002564, 0xb7002565, 0xb8002566, 0xb9002567, 0xba002568, 0xbb002569, 0xbc00256a, 0xbd00256b, 0xbe00256c, 0x8b002580, 0x8c002584, 0x8d002588, 0x8e00258c, 0x8f002590, 0x90002591, 0x91002592, 0x92002593, 0x940025a0, }, } // KOI8U is the KOI8-U encoding. var KOI8U encoding.Encoding = &koi8U var koi8U = charmap{ name: "KOI8-U", mib: identifier.KOI8U, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0x82}}, {3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x94, 0x90}}, {3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0x98}}, {3, [3]byte{0xe2, 0x94, 0x9c}}, {3, [3]byte{0xe2, 0x94, 0xa4}}, {3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0xb4}}, {3, [3]byte{0xe2, 0x94, 0xbc}}, {3, [3]byte{0xe2, 0x96, 0x80}}, {3, [3]byte{0xe2, 0x96, 0x84}}, {3, [3]byte{0xe2, 0x96, 0x88}}, {3, [3]byte{0xe2, 0x96, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x90}}, {3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}}, {3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x8c, 0xa0}}, {3, [3]byte{0xe2, 0x96, 0xa0}}, {3, [3]byte{0xe2, 0x88, 0x99}}, {3, [3]byte{0xe2, 0x88, 0x9a}}, {3, [3]byte{0xe2, 0x89, 0x88}}, {3, [3]byte{0xe2, 0x89, 0xa4}}, {3, [3]byte{0xe2, 0x89, 0xa5}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {3, [3]byte{0xe2, 0x8c, 0xa1}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x95, 0x90}}, {3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x92}}, {2, [3]byte{0xd1, 0x91, 0x00}}, {2, [3]byte{0xd1, 0x94, 0x00}}, {3, [3]byte{0xe2, 0x95, 0x94}}, {2, [3]byte{0xd1, 0x96, 0x00}}, {2, [3]byte{0xd1, 0x97, 0x00}}, {3, [3]byte{0xe2, 0x95, 0x97}}, {3, [3]byte{0xe2, 0x95, 0x98}}, {3, [3]byte{0xe2, 0x95, 0x99}}, {3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x9b}}, {2, [3]byte{0xd2, 0x91, 0x00}}, {2, [3]byte{0xd1, 0x9e, 0x00}}, {3, [3]byte{0xe2, 0x95, 0x9e}}, {3, [3]byte{0xe2, 0x95, 0x9f}}, {3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0xa1}}, {2, [3]byte{0xd0, 0x81, 0x00}}, {2, [3]byte{0xd0, 0x84, 0x00}}, {3, [3]byte{0xe2, 0x95, 0xa3}}, {2, [3]byte{0xd0, 0x86, 0x00}}, {2, [3]byte{0xd0, 0x87, 0x00}}, {3, [3]byte{0xe2, 0x95, 0xa6}}, {3, [3]byte{0xe2, 0x95, 0xa7}}, {3, [3]byte{0xe2, 0x95, 0xa8}}, {3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xaa}}, {2, [3]byte{0xd2, 0x90, 0x00}}, {2, [3]byte{0xd0, 0x8e, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, {2, [3]byte{0xd1, 0x8e, 0x00}}, {2, [3]byte{0xd0, 0xb0, 0x00}}, {2, [3]byte{0xd0, 0xb1, 0x00}}, {2, [3]byte{0xd1, 0x86, 0x00}}, {2, [3]byte{0xd0, 0xb4, 0x00}}, {2, [3]byte{0xd0, 0xb5, 0x00}}, {2, [3]byte{0xd1, 0x84, 0x00}}, {2, [3]byte{0xd0, 0xb3, 0x00}}, {2, [3]byte{0xd1, 0x85, 0x00}}, {2, [3]byte{0xd0, 0xb8, 0x00}}, {2, [3]byte{0xd0, 0xb9, 0x00}}, {2, [3]byte{0xd0, 0xba, 0x00}}, {2, [3]byte{0xd0, 0xbb, 0x00}}, {2, [3]byte{0xd0, 0xbc, 0x00}}, {2, [3]byte{0xd0, 0xbd, 0x00}}, {2, [3]byte{0xd0, 0xbe, 0x00}}, {2, [3]byte{0xd0, 0xbf, 0x00}}, {2, [3]byte{0xd1, 0x8f, 0x00}}, {2, [3]byte{0xd1, 0x80, 0x00}}, {2, [3]byte{0xd1, 0x81, 0x00}}, {2, [3]byte{0xd1, 0x82, 0x00}}, {2, [3]byte{0xd1, 0x83, 0x00}}, {2, [3]byte{0xd0, 0xb6, 0x00}}, {2, [3]byte{0xd0, 0xb2, 0x00}}, {2, [3]byte{0xd1, 0x8c, 0x00}}, {2, [3]byte{0xd1, 0x8b, 0x00}}, {2, [3]byte{0xd0, 0xb7, 0x00}}, {2, [3]byte{0xd1, 0x88, 0x00}}, {2, [3]byte{0xd1, 0x8d, 0x00}}, {2, [3]byte{0xd1, 0x89, 0x00}}, {2, [3]byte{0xd1, 0x87, 0x00}}, {2, [3]byte{0xd1, 0x8a, 0x00}}, {2, [3]byte{0xd0, 0xae, 0x00}}, {2, [3]byte{0xd0, 0x90, 0x00}}, {2, [3]byte{0xd0, 0x91, 0x00}}, {2, [3]byte{0xd0, 0xa6, 0x00}}, {2, [3]byte{0xd0, 0x94, 0x00}}, {2, [3]byte{0xd0, 0x95, 0x00}}, {2, [3]byte{0xd0, 0xa4, 0x00}}, {2, [3]byte{0xd0, 0x93, 0x00}}, {2, [3]byte{0xd0, 0xa5, 0x00}}, {2, [3]byte{0xd0, 0x98, 0x00}}, {2, [3]byte{0xd0, 0x99, 0x00}}, {2, [3]byte{0xd0, 0x9a, 0x00}}, {2, [3]byte{0xd0, 0x9b, 0x00}}, {2, [3]byte{0xd0, 0x9c, 0x00}}, {2, [3]byte{0xd0, 0x9d, 0x00}}, {2, [3]byte{0xd0, 0x9e, 0x00}}, {2, [3]byte{0xd0, 0x9f, 0x00}}, {2, [3]byte{0xd0, 0xaf, 0x00}}, {2, [3]byte{0xd0, 0xa0, 0x00}}, {2, [3]byte{0xd0, 0xa1, 0x00}}, {2, [3]byte{0xd0, 0xa2, 0x00}}, {2, [3]byte{0xd0, 0xa3, 0x00}}, {2, [3]byte{0xd0, 0x96, 0x00}}, {2, [3]byte{0xd0, 0x92, 0x00}}, {2, [3]byte{0xd0, 0xac, 0x00}}, {2, [3]byte{0xd0, 0xab, 0x00}}, {2, [3]byte{0xd0, 0x97, 0x00}}, {2, [3]byte{0xd0, 0xa8, 0x00}}, {2, [3]byte{0xd0, 0xad, 0x00}}, {2, [3]byte{0xd0, 0xa9, 0x00}}, {2, [3]byte{0xd0, 0xa7, 0x00}}, {2, [3]byte{0xd0, 0xaa, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0x9a0000a0, 0xbf0000a9, 0x9c0000b0, 0x9d0000b2, 0x9e0000b7, 0x9f0000f7, 0xb3000401, 0xb4000404, 0xb6000406, 0xb7000407, 0xbe00040e, 0xe1000410, 0xe2000411, 0xf7000412, 0xe7000413, 0xe4000414, 0xe5000415, 0xf6000416, 0xfa000417, 0xe9000418, 0xea000419, 0xeb00041a, 0xec00041b, 0xed00041c, 0xee00041d, 0xef00041e, 0xf000041f, 0xf2000420, 0xf3000421, 0xf4000422, 0xf5000423, 0xe6000424, 0xe8000425, 0xe3000426, 0xfe000427, 0xfb000428, 0xfd000429, 0xff00042a, 0xf900042b, 0xf800042c, 0xfc00042d, 0xe000042e, 0xf100042f, 0xc1000430, 0xc2000431, 0xd7000432, 0xc7000433, 0xc4000434, 0xc5000435, 0xd6000436, 0xda000437, 0xc9000438, 0xca000439, 0xcb00043a, 0xcc00043b, 0xcd00043c, 0xce00043d, 0xcf00043e, 0xd000043f, 0xd2000440, 0xd3000441, 0xd4000442, 0xd5000443, 0xc6000444, 0xc8000445, 0xc3000446, 0xde000447, 0xdb000448, 0xdd000449, 0xdf00044a, 0xd900044b, 0xd800044c, 0xdc00044d, 0xc000044e, 0xd100044f, 0xa3000451, 0xa4000454, 0xa6000456, 0xa7000457, 0xae00045e, 0xbd000490, 0xad000491, 0x95002219, 0x9600221a, 0x97002248, 0x98002264, 0x99002265, 0x93002320, 0x9b002321, 0x80002500, 0x81002502, 0x8200250c, 0x83002510, 0x84002514, 0x85002518, 0x8600251c, 0x87002524, 0x8800252c, 0x89002534, 0x8a00253c, 0xa0002550, 0xa1002551, 0xa2002552, 0xa5002554, 0xa8002557, 0xa9002558, 0xaa002559, 0xab00255a, 0xac00255b, 0xaf00255e, 0xb000255f, 0xb1002560, 0xb2002561, 0xb5002563, 0xb8002566, 0xb9002567, 0xba002568, 0xbb002569, 0xbc00256a, 0x8b002580, 0x8c002584, 0x8d002588, 0x8e00258c, 0x8f002590, 0x90002591, 0x91002592, 0x92002593, 0x940025a0, }, } // Macintosh is the Macintosh encoding. var Macintosh encoding.Encoding = &macintosh var macintosh = charmap{ name: "Macintosh", mib: identifier.Macintosh, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xa0}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xa2}}, {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, {3, [3]byte{0xe2, 0x84, 0xa2}}, {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}}, {3, [3]byte{0xe2, 0x89, 0xa0}}, {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x98, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x9e}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, {3, [3]byte{0xe2, 0x89, 0xa4}}, {3, [3]byte{0xe2, 0x89, 0xa5}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x82}}, {3, [3]byte{0xe2, 0x88, 0x91}}, {3, [3]byte{0xe2, 0x88, 0x8f}}, {2, [3]byte{0xcf, 0x80, 0x00}}, {3, [3]byte{0xe2, 0x88, 0xab}}, {2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xce, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}}, {2, [3]byte{0xc2, 0xac, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x9a}}, {2, [3]byte{0xc6, 0x92, 0x00}}, {3, [3]byte{0xe2, 0x89, 0x88}}, {3, [3]byte{0xe2, 0x88, 0x86}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xa6}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, {2, [3]byte{0xc5, 0x92, 0x00}}, {2, [3]byte{0xc5, 0x93, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}}, {3, [3]byte{0xe2, 0x80, 0x9c}}, {3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0x98}}, {3, [3]byte{0xe2, 0x80, 0x99}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x97, 0x8a}}, {2, [3]byte{0xc3, 0xbf, 0x00}}, {2, [3]byte{0xc5, 0xb8, 0x00}}, {3, [3]byte{0xe2, 0x81, 0x84}}, {3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xe2, 0x80, 0xb9}}, {3, [3]byte{0xe2, 0x80, 0xba}}, {3, [3]byte{0xef, 0xac, 0x81}}, {3, [3]byte{0xef, 0xac, 0x82}}, {3, [3]byte{0xe2, 0x80, 0xa1}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x9a}}, {3, [3]byte{0xe2, 0x80, 0x9e}}, {3, [3]byte{0xe2, 0x80, 0xb0}}, {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, {2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}}, {2, [3]byte{0xc3, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x94, 0x00}}, {3, [3]byte{0xef, 0xa3, 0xbf}}, {2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}}, {2, [3]byte{0xc4, 0xb1, 0x00}}, {2, [3]byte{0xcb, 0x86, 0x00}}, {2, [3]byte{0xcb, 0x9c, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}}, {2, [3]byte{0xcb, 0x98, 0x00}}, {2, [3]byte{0xcb, 0x99, 0x00}}, {2, [3]byte{0xcb, 0x9a, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xcb, 0x9d, 0x00}}, {2, [3]byte{0xcb, 0x9b, 0x00}}, {2, [3]byte{0xcb, 0x87, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xca0000a0, 0xc10000a1, 0xa20000a2, 0xa30000a3, 0xb40000a5, 0xa40000a7, 0xac0000a8, 0xa90000a9, 0xbb0000aa, 0xc70000ab, 0xc20000ac, 0xa80000ae, 0xf80000af, 0xa10000b0, 0xb10000b1, 0xab0000b4, 0xb50000b5, 0xa60000b6, 0xe10000b7, 0xfc0000b8, 0xbc0000ba, 0xc80000bb, 0xc00000bf, 0xcb0000c0, 0xe70000c1, 0xe50000c2, 0xcc0000c3, 0x800000c4, 0x810000c5, 0xae0000c6, 0x820000c7, 0xe90000c8, 0x830000c9, 0xe60000ca, 0xe80000cb, 0xed0000cc, 0xea0000cd, 0xeb0000ce, 0xec0000cf, 0x840000d1, 0xf10000d2, 0xee0000d3, 0xef0000d4, 0xcd0000d5, 0x850000d6, 0xaf0000d8, 0xf40000d9, 0xf20000da, 0xf30000db, 0x860000dc, 0xa70000df, 0x880000e0, 0x870000e1, 0x890000e2, 0x8b0000e3, 0x8a0000e4, 0x8c0000e5, 0xbe0000e6, 0x8d0000e7, 0x8f0000e8, 0x8e0000e9, 0x900000ea, 0x910000eb, 0x930000ec, 0x920000ed, 0x940000ee, 0x950000ef, 0x960000f1, 0x980000f2, 0x970000f3, 0x990000f4, 0x9b0000f5, 0x9a0000f6, 0xd60000f7, 0xbf0000f8, 0x9d0000f9, 0x9c0000fa, 0x9e0000fb, 0x9f0000fc, 0xd80000ff, 0xf5000131, 0xce000152, 0xcf000153, 0xd9000178, 0xc4000192, 0xf60002c6, 0xff0002c7, 0xf90002d8, 0xfa0002d9, 0xfb0002da, 0xfe0002db, 0xf70002dc, 0xfd0002dd, 0xbd0003a9, 0xb90003c0, 0xd0002013, 0xd1002014, 0xd4002018, 0xd5002019, 0xe200201a, 0xd200201c, 0xd300201d, 0xe300201e, 0xa0002020, 0xe0002021, 0xa5002022, 0xc9002026, 0xe4002030, 0xdc002039, 0xdd00203a, 0xda002044, 0xdb0020ac, 0xaa002122, 0xb6002202, 0xc6002206, 0xb800220f, 0xb7002211, 0xc300221a, 0xb000221e, 0xba00222b, 0xc5002248, 0xad002260, 0xb2002264, 0xb3002265, 0xd70025ca, 0xf000f8ff, 0xde00fb01, 0xdf00fb02, }, } // MacintoshCyrillic is the Macintosh Cyrillic encoding. var MacintoshCyrillic encoding.Encoding = &macintoshCyrillic var macintoshCyrillic = charmap{ name: "Macintosh Cyrillic", mib: identifier.MacintoshCyrillic, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {2, [3]byte{0xd0, 0x90, 0x00}}, {2, [3]byte{0xd0, 0x91, 0x00}}, {2, [3]byte{0xd0, 0x92, 0x00}}, {2, [3]byte{0xd0, 0x93, 0x00}}, {2, [3]byte{0xd0, 0x94, 0x00}}, {2, [3]byte{0xd0, 0x95, 0x00}}, {2, [3]byte{0xd0, 0x96, 0x00}}, {2, [3]byte{0xd0, 0x97, 0x00}}, {2, [3]byte{0xd0, 0x98, 0x00}}, {2, [3]byte{0xd0, 0x99, 0x00}}, {2, [3]byte{0xd0, 0x9a, 0x00}}, {2, [3]byte{0xd0, 0x9b, 0x00}}, {2, [3]byte{0xd0, 0x9c, 0x00}}, {2, [3]byte{0xd0, 0x9d, 0x00}}, {2, [3]byte{0xd0, 0x9e, 0x00}}, {2, [3]byte{0xd0, 0x9f, 0x00}}, {2, [3]byte{0xd0, 0xa0, 0x00}}, {2, [3]byte{0xd0, 0xa1, 0x00}}, {2, [3]byte{0xd0, 0xa2, 0x00}}, {2, [3]byte{0xd0, 0xa3, 0x00}}, {2, [3]byte{0xd0, 0xa4, 0x00}}, {2, [3]byte{0xd0, 0xa5, 0x00}}, {2, [3]byte{0xd0, 0xa6, 0x00}}, {2, [3]byte{0xd0, 0xa7, 0x00}}, {2, [3]byte{0xd0, 0xa8, 0x00}}, {2, [3]byte{0xd0, 0xa9, 0x00}}, {2, [3]byte{0xd0, 0xaa, 0x00}}, {2, [3]byte{0xd0, 0xab, 0x00}}, {2, [3]byte{0xd0, 0xac, 0x00}}, {2, [3]byte{0xd0, 0xad, 0x00}}, {2, [3]byte{0xd0, 0xae, 0x00}}, {2, [3]byte{0xd0, 0xaf, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xa0}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xd2, 0x90, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xa2}}, {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xd0, 0x86, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, {3, [3]byte{0xe2, 0x84, 0xa2}}, {2, [3]byte{0xd0, 0x82, 0x00}}, {2, [3]byte{0xd1, 0x92, 0x00}}, {3, [3]byte{0xe2, 0x89, 0xa0}}, {2, [3]byte{0xd0, 0x83, 0x00}}, {2, [3]byte{0xd1, 0x93, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x9e}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, {3, [3]byte{0xe2, 0x89, 0xa4}}, {3, [3]byte{0xe2, 0x89, 0xa5}}, {2, [3]byte{0xd1, 0x96, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xd2, 0x91, 0x00}}, {2, [3]byte{0xd0, 0x88, 0x00}}, {2, [3]byte{0xd0, 0x84, 0x00}}, {2, [3]byte{0xd1, 0x94, 0x00}}, {2, [3]byte{0xd0, 0x87, 0x00}}, {2, [3]byte{0xd1, 0x97, 0x00}}, {2, [3]byte{0xd0, 0x89, 0x00}}, {2, [3]byte{0xd1, 0x99, 0x00}}, {2, [3]byte{0xd0, 0x8a, 0x00}}, {2, [3]byte{0xd1, 0x9a, 0x00}}, {2, [3]byte{0xd1, 0x98, 0x00}}, {2, [3]byte{0xd0, 0x85, 0x00}}, {2, [3]byte{0xc2, 0xac, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x9a}}, {2, [3]byte{0xc6, 0x92, 0x00}}, {3, [3]byte{0xe2, 0x89, 0x88}}, {3, [3]byte{0xe2, 0x88, 0x86}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xa6}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xd0, 0x8b, 0x00}}, {2, [3]byte{0xd1, 0x9b, 0x00}}, {2, [3]byte{0xd0, 0x8c, 0x00}}, {2, [3]byte{0xd1, 0x9c, 0x00}}, {2, [3]byte{0xd1, 0x95, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}}, {3, [3]byte{0xe2, 0x80, 0x9c}}, {3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0x98}}, {3, [3]byte{0xe2, 0x80, 0x99}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x9e}}, {2, [3]byte{0xd0, 0x8e, 0x00}}, {2, [3]byte{0xd1, 0x9e, 0x00}}, {2, [3]byte{0xd0, 0x8f, 0x00}}, {2, [3]byte{0xd1, 0x9f, 0x00}}, {3, [3]byte{0xe2, 0x84, 0x96}}, {2, [3]byte{0xd0, 0x81, 0x00}}, {2, [3]byte{0xd1, 0x91, 0x00}}, {2, [3]byte{0xd1, 0x8f, 0x00}}, {2, [3]byte{0xd0, 0xb0, 0x00}}, {2, [3]byte{0xd0, 0xb1, 0x00}}, {2, [3]byte{0xd0, 0xb2, 0x00}}, {2, [3]byte{0xd0, 0xb3, 0x00}}, {2, [3]byte{0xd0, 0xb4, 0x00}}, {2, [3]byte{0xd0, 0xb5, 0x00}}, {2, [3]byte{0xd0, 0xb6, 0x00}}, {2, [3]byte{0xd0, 0xb7, 0x00}}, {2, [3]byte{0xd0, 0xb8, 0x00}}, {2, [3]byte{0xd0, 0xb9, 0x00}}, {2, [3]byte{0xd0, 0xba, 0x00}}, {2, [3]byte{0xd0, 0xbb, 0x00}}, {2, [3]byte{0xd0, 0xbc, 0x00}}, {2, [3]byte{0xd0, 0xbd, 0x00}}, {2, [3]byte{0xd0, 0xbe, 0x00}}, {2, [3]byte{0xd0, 0xbf, 0x00}}, {2, [3]byte{0xd1, 0x80, 0x00}}, {2, [3]byte{0xd1, 0x81, 0x00}}, {2, [3]byte{0xd1, 0x82, 0x00}}, {2, [3]byte{0xd1, 0x83, 0x00}}, {2, [3]byte{0xd1, 0x84, 0x00}}, {2, [3]byte{0xd1, 0x85, 0x00}}, {2, [3]byte{0xd1, 0x86, 0x00}}, {2, [3]byte{0xd1, 0x87, 0x00}}, {2, [3]byte{0xd1, 0x88, 0x00}}, {2, [3]byte{0xd1, 0x89, 0x00}}, {2, [3]byte{0xd1, 0x8a, 0x00}}, {2, [3]byte{0xd1, 0x8b, 0x00}}, {2, [3]byte{0xd1, 0x8c, 0x00}}, {2, [3]byte{0xd1, 0x8d, 0x00}}, {2, [3]byte{0xd1, 0x8e, 0x00}}, {3, [3]byte{0xe2, 0x82, 0xac}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xca0000a0, 0xa30000a3, 0xa40000a7, 0xa90000a9, 0xc70000ab, 0xc20000ac, 0xa80000ae, 0xa10000b0, 0xb10000b1, 0xb50000b5, 0xa60000b6, 0xc80000bb, 0xd60000f7, 0xc4000192, 0xdd000401, 0xab000402, 0xae000403, 0xb8000404, 0xc1000405, 0xa7000406, 0xba000407, 0xb7000408, 0xbc000409, 0xbe00040a, 0xcb00040b, 0xcd00040c, 0xd800040e, 0xda00040f, 0x80000410, 0x81000411, 0x82000412, 0x83000413, 0x84000414, 0x85000415, 0x86000416, 0x87000417, 0x88000418, 0x89000419, 0x8a00041a, 0x8b00041b, 0x8c00041c, 0x8d00041d, 0x8e00041e, 0x8f00041f, 0x90000420, 0x91000421, 0x92000422, 0x93000423, 0x94000424, 0x95000425, 0x96000426, 0x97000427, 0x98000428, 0x99000429, 0x9a00042a, 0x9b00042b, 0x9c00042c, 0x9d00042d, 0x9e00042e, 0x9f00042f, 0xe0000430, 0xe1000431, 0xe2000432, 0xe3000433, 0xe4000434, 0xe5000435, 0xe6000436, 0xe7000437, 0xe8000438, 0xe9000439, 0xea00043a, 0xeb00043b, 0xec00043c, 0xed00043d, 0xee00043e, 0xef00043f, 0xf0000440, 0xf1000441, 0xf2000442, 0xf3000443, 0xf4000444, 0xf5000445, 0xf6000446, 0xf7000447, 0xf8000448, 0xf9000449, 0xfa00044a, 0xfb00044b, 0xfc00044c, 0xfd00044d, 0xfe00044e, 0xdf00044f, 0xde000451, 0xac000452, 0xaf000453, 0xb9000454, 0xcf000455, 0xb4000456, 0xbb000457, 0xc0000458, 0xbd000459, 0xbf00045a, 0xcc00045b, 0xce00045c, 0xd900045e, 0xdb00045f, 0xa2000490, 0xb6000491, 0xd0002013, 0xd1002014, 0xd4002018, 0xd5002019, 0xd200201c, 0xd300201d, 0xd700201e, 0xa0002020, 0xa5002022, 0xc9002026, 0xff0020ac, 0xdc002116, 0xaa002122, 0xc6002206, 0xc300221a, 0xb000221e, 0xc5002248, 0xad002260, 0xb2002264, 0xb3002265, }, } // Windows874 is the Windows 874 encoding. var Windows874 encoding.Encoding = &windows874 var windows874 = charmap{ name: "Windows 874", mib: identifier.Windows874, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xa6}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x98}}, {3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}}, {3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}}, {3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {3, [3]byte{0xe0, 0xb8, 0x81}}, {3, [3]byte{0xe0, 0xb8, 0x82}}, {3, [3]byte{0xe0, 0xb8, 0x83}}, {3, [3]byte{0xe0, 0xb8, 0x84}}, {3, [3]byte{0xe0, 0xb8, 0x85}}, {3, [3]byte{0xe0, 0xb8, 0x86}}, {3, [3]byte{0xe0, 0xb8, 0x87}}, {3, [3]byte{0xe0, 0xb8, 0x88}}, {3, [3]byte{0xe0, 0xb8, 0x89}}, {3, [3]byte{0xe0, 0xb8, 0x8a}}, {3, [3]byte{0xe0, 0xb8, 0x8b}}, {3, [3]byte{0xe0, 0xb8, 0x8c}}, {3, [3]byte{0xe0, 0xb8, 0x8d}}, {3, [3]byte{0xe0, 0xb8, 0x8e}}, {3, [3]byte{0xe0, 0xb8, 0x8f}}, {3, [3]byte{0xe0, 0xb8, 0x90}}, {3, [3]byte{0xe0, 0xb8, 0x91}}, {3, [3]byte{0xe0, 0xb8, 0x92}}, {3, [3]byte{0xe0, 0xb8, 0x93}}, {3, [3]byte{0xe0, 0xb8, 0x94}}, {3, [3]byte{0xe0, 0xb8, 0x95}}, {3, [3]byte{0xe0, 0xb8, 0x96}}, {3, [3]byte{0xe0, 0xb8, 0x97}}, {3, [3]byte{0xe0, 0xb8, 0x98}}, {3, [3]byte{0xe0, 0xb8, 0x99}}, {3, [3]byte{0xe0, 0xb8, 0x9a}}, {3, [3]byte{0xe0, 0xb8, 0x9b}}, {3, [3]byte{0xe0, 0xb8, 0x9c}}, {3, [3]byte{0xe0, 0xb8, 0x9d}}, {3, [3]byte{0xe0, 0xb8, 0x9e}}, {3, [3]byte{0xe0, 0xb8, 0x9f}}, {3, [3]byte{0xe0, 0xb8, 0xa0}}, {3, [3]byte{0xe0, 0xb8, 0xa1}}, {3, [3]byte{0xe0, 0xb8, 0xa2}}, {3, [3]byte{0xe0, 0xb8, 0xa3}}, {3, [3]byte{0xe0, 0xb8, 0xa4}}, {3, [3]byte{0xe0, 0xb8, 0xa5}}, {3, [3]byte{0xe0, 0xb8, 0xa6}}, {3, [3]byte{0xe0, 0xb8, 0xa7}}, {3, [3]byte{0xe0, 0xb8, 0xa8}}, {3, [3]byte{0xe0, 0xb8, 0xa9}}, {3, [3]byte{0xe0, 0xb8, 0xaa}}, {3, [3]byte{0xe0, 0xb8, 0xab}}, {3, [3]byte{0xe0, 0xb8, 0xac}}, {3, [3]byte{0xe0, 0xb8, 0xad}}, {3, [3]byte{0xe0, 0xb8, 0xae}}, {3, [3]byte{0xe0, 0xb8, 0xaf}}, {3, [3]byte{0xe0, 0xb8, 0xb0}}, {3, [3]byte{0xe0, 0xb8, 0xb1}}, {3, [3]byte{0xe0, 0xb8, 0xb2}}, {3, [3]byte{0xe0, 0xb8, 0xb3}}, {3, [3]byte{0xe0, 0xb8, 0xb4}}, {3, [3]byte{0xe0, 0xb8, 0xb5}}, {3, [3]byte{0xe0, 0xb8, 0xb6}}, {3, [3]byte{0xe0, 0xb8, 0xb7}}, {3, [3]byte{0xe0, 0xb8, 0xb8}}, {3, [3]byte{0xe0, 0xb8, 0xb9}}, {3, [3]byte{0xe0, 0xb8, 0xba}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe0, 0xb8, 0xbf}}, {3, [3]byte{0xe0, 0xb9, 0x80}}, {3, [3]byte{0xe0, 0xb9, 0x81}}, {3, [3]byte{0xe0, 0xb9, 0x82}}, {3, [3]byte{0xe0, 0xb9, 0x83}}, {3, [3]byte{0xe0, 0xb9, 0x84}}, {3, [3]byte{0xe0, 0xb9, 0x85}}, {3, [3]byte{0xe0, 0xb9, 0x86}}, {3, [3]byte{0xe0, 0xb9, 0x87}}, {3, [3]byte{0xe0, 0xb9, 0x88}}, {3, [3]byte{0xe0, 0xb9, 0x89}}, {3, [3]byte{0xe0, 0xb9, 0x8a}}, {3, [3]byte{0xe0, 0xb9, 0x8b}}, {3, [3]byte{0xe0, 0xb9, 0x8c}}, {3, [3]byte{0xe0, 0xb9, 0x8d}}, {3, [3]byte{0xe0, 0xb9, 0x8e}}, {3, [3]byte{0xe0, 0xb9, 0x8f}}, {3, [3]byte{0xe0, 0xb9, 0x90}}, {3, [3]byte{0xe0, 0xb9, 0x91}}, {3, [3]byte{0xe0, 0xb9, 0x92}}, {3, [3]byte{0xe0, 0xb9, 0x93}}, {3, [3]byte{0xe0, 0xb9, 0x94}}, {3, [3]byte{0xe0, 0xb9, 0x95}}, {3, [3]byte{0xe0, 0xb9, 0x96}}, {3, [3]byte{0xe0, 0xb9, 0x97}}, {3, [3]byte{0xe0, 0xb9, 0x98}}, {3, [3]byte{0xe0, 0xb9, 0x99}}, {3, [3]byte{0xe0, 0xb9, 0x9a}}, {3, [3]byte{0xe0, 0xb9, 0x9b}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xa00000a0, 0xa1000e01, 0xa2000e02, 0xa3000e03, 0xa4000e04, 0xa5000e05, 0xa6000e06, 0xa7000e07, 0xa8000e08, 0xa9000e09, 0xaa000e0a, 0xab000e0b, 0xac000e0c, 0xad000e0d, 0xae000e0e, 0xaf000e0f, 0xb0000e10, 0xb1000e11, 0xb2000e12, 0xb3000e13, 0xb4000e14, 0xb5000e15, 0xb6000e16, 0xb7000e17, 0xb8000e18, 0xb9000e19, 0xba000e1a, 0xbb000e1b, 0xbc000e1c, 0xbd000e1d, 0xbe000e1e, 0xbf000e1f, 0xc0000e20, 0xc1000e21, 0xc2000e22, 0xc3000e23, 0xc4000e24, 0xc5000e25, 0xc6000e26, 0xc7000e27, 0xc8000e28, 0xc9000e29, 0xca000e2a, 0xcb000e2b, 0xcc000e2c, 0xcd000e2d, 0xce000e2e, 0xcf000e2f, 0xd0000e30, 0xd1000e31, 0xd2000e32, 0xd3000e33, 0xd4000e34, 0xd5000e35, 0xd6000e36, 0xd7000e37, 0xd8000e38, 0xd9000e39, 0xda000e3a, 0xdf000e3f, 0xe0000e40, 0xe1000e41, 0xe2000e42, 0xe3000e43, 0xe4000e44, 0xe5000e45, 0xe6000e46, 0xe7000e47, 0xe8000e48, 0xe9000e49, 0xea000e4a, 0xeb000e4b, 0xec000e4c, 0xed000e4d, 0xee000e4e, 0xef000e4f, 0xf0000e50, 0xf1000e51, 0xf2000e52, 0xf3000e53, 0xf4000e54, 0xf5000e55, 0xf6000e56, 0xf7000e57, 0xf8000e58, 0xf9000e59, 0xfa000e5a, 0xfb000e5b, 0x96002013, 0x97002014, 0x91002018, 0x92002019, 0x9300201c, 0x9400201d, 0x95002022, 0x85002026, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, }, } // Windows1250 is the Windows 1250 encoding. var Windows1250 encoding.Encoding = &windows1250 var windows1250 = charmap{ name: "Windows 1250", mib: identifier.Windows1250, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x9a}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x9e}}, {3, [3]byte{0xe2, 0x80, 0xa6}}, {3, [3]byte{0xe2, 0x80, 0xa0}}, {3, [3]byte{0xe2, 0x80, 0xa1}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xb0}}, {2, [3]byte{0xc5, 0xa0, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb9}}, {2, [3]byte{0xc5, 0x9a, 0x00}}, {2, [3]byte{0xc5, 0xa4, 0x00}}, {2, [3]byte{0xc5, 0xbd, 0x00}}, {2, [3]byte{0xc5, 0xb9, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x98}}, {3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}}, {3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}}, {3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x84, 0xa2}}, {2, [3]byte{0xc5, 0xa1, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xba}}, {2, [3]byte{0xc5, 0x9b, 0x00}}, {2, [3]byte{0xc5, 0xa5, 0x00}}, {2, [3]byte{0xc5, 0xbe, 0x00}}, {2, [3]byte{0xc5, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xcb, 0x87, 0x00}}, {2, [3]byte{0xcb, 0x98, 0x00}}, {2, [3]byte{0xc5, 0x81, 0x00}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc4, 0x84, 0x00}}, {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, {2, [3]byte{0xc5, 0x9e, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc5, 0xbb, 0x00}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, {2, [3]byte{0xcb, 0x9b, 0x00}}, {2, [3]byte{0xc5, 0x82, 0x00}}, {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc4, 0x85, 0x00}}, {2, [3]byte{0xc5, 0x9f, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {2, [3]byte{0xc4, 0xbd, 0x00}}, {2, [3]byte{0xcb, 0x9d, 0x00}}, {2, [3]byte{0xc4, 0xbe, 0x00}}, {2, [3]byte{0xc5, 0xbc, 0x00}}, {2, [3]byte{0xc5, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc4, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc4, 0xb9, 0x00}}, {2, [3]byte{0xc4, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc4, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc4, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, {2, [3]byte{0xc4, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc4, 0x8e, 0x00}}, {2, [3]byte{0xc4, 0x90, 0x00}}, {2, [3]byte{0xc5, 0x83, 0x00}}, {2, [3]byte{0xc5, 0x87, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc5, 0x90, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, {2, [3]byte{0xc5, 0x98, 0x00}}, {2, [3]byte{0xc5, 0xae, 0x00}}, {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc5, 0xb0, 0x00}}, {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}}, {2, [3]byte{0xc5, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, {2, [3]byte{0xc5, 0x95, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc4, 0x83, 0x00}}, {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc4, 0xba, 0x00}}, {2, [3]byte{0xc4, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, {2, [3]byte{0xc4, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc4, 0x99, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, {2, [3]byte{0xc4, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc4, 0x8f, 0x00}}, {2, [3]byte{0xc4, 0x91, 0x00}}, {2, [3]byte{0xc5, 0x84, 0x00}}, {2, [3]byte{0xc5, 0x88, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc5, 0x91, 0x00}}, {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {2, [3]byte{0xc5, 0x99, 0x00}}, {2, [3]byte{0xc5, 0xaf, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc5, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}}, {2, [3]byte{0xc5, 0xa3, 0x00}}, {2, [3]byte{0xcb, 0x99, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xa00000a0, 0xa40000a4, 0xa60000a6, 0xa70000a7, 0xa80000a8, 0xa90000a9, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xb00000b0, 0xb10000b1, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7, 0xb80000b8, 0xbb0000bb, 0xc10000c1, 0xc20000c2, 0xc40000c4, 0xc70000c7, 0xc90000c9, 0xcb0000cb, 0xcd0000cd, 0xce0000ce, 0xd30000d3, 0xd40000d4, 0xd60000d6, 0xd70000d7, 0xda0000da, 0xdc0000dc, 0xdd0000dd, 0xdf0000df, 0xe10000e1, 0xe20000e2, 0xe40000e4, 0xe70000e7, 0xe90000e9, 0xeb0000eb, 0xed0000ed, 0xee0000ee, 0xf30000f3, 0xf40000f4, 0xf60000f6, 0xf70000f7, 0xfa0000fa, 0xfc0000fc, 0xfd0000fd, 0xc3000102, 0xe3000103, 0xa5000104, 0xb9000105, 0xc6000106, 0xe6000107, 0xc800010c, 0xe800010d, 0xcf00010e, 0xef00010f, 0xd0000110, 0xf0000111, 0xca000118, 0xea000119, 0xcc00011a, 0xec00011b, 0xc5000139, 0xe500013a, 0xbc00013d, 0xbe00013e, 0xa3000141, 0xb3000142, 0xd1000143, 0xf1000144, 0xd2000147, 0xf2000148, 0xd5000150, 0xf5000151, 0xc0000154, 0xe0000155, 0xd8000158, 0xf8000159, 0x8c00015a, 0x9c00015b, 0xaa00015e, 0xba00015f, 0x8a000160, 0x9a000161, 0xde000162, 0xfe000163, 0x8d000164, 0x9d000165, 0xd900016e, 0xf900016f, 0xdb000170, 0xfb000171, 0x8f000179, 0x9f00017a, 0xaf00017b, 0xbf00017c, 0x8e00017d, 0x9e00017e, 0xa10002c7, 0xa20002d8, 0xff0002d9, 0xb20002db, 0xbd0002dd, 0x96002013, 0x97002014, 0x91002018, 0x92002019, 0x8200201a, 0x9300201c, 0x9400201d, 0x8400201e, 0x86002020, 0x87002021, 0x95002022, 0x85002026, 0x89002030, 0x8b002039, 0x9b00203a, 0x800020ac, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, }, } // Windows1251 is the Windows 1251 encoding. var Windows1251 encoding.Encoding = &windows1251 var windows1251 = charmap{ name: "Windows 1251", mib: identifier.Windows1251, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {2, [3]byte{0xd0, 0x82, 0x00}}, {2, [3]byte{0xd0, 0x83, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x9a}}, {2, [3]byte{0xd1, 0x93, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x9e}}, {3, [3]byte{0xe2, 0x80, 0xa6}}, {3, [3]byte{0xe2, 0x80, 0xa0}}, {3, [3]byte{0xe2, 0x80, 0xa1}}, {3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xe2, 0x80, 0xb0}}, {2, [3]byte{0xd0, 0x89, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb9}}, {2, [3]byte{0xd0, 0x8a, 0x00}}, {2, [3]byte{0xd0, 0x8c, 0x00}}, {2, [3]byte{0xd0, 0x8b, 0x00}}, {2, [3]byte{0xd0, 0x8f, 0x00}}, {2, [3]byte{0xd1, 0x92, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x98}}, {3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}}, {3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}}, {3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x84, 0xa2}}, {2, [3]byte{0xd1, 0x99, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xba}}, {2, [3]byte{0xd1, 0x9a, 0x00}}, {2, [3]byte{0xd1, 0x9c, 0x00}}, {2, [3]byte{0xd1, 0x9b, 0x00}}, {2, [3]byte{0xd1, 0x9f, 0x00}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xd0, 0x8e, 0x00}}, {2, [3]byte{0xd1, 0x9e, 0x00}}, {2, [3]byte{0xd0, 0x88, 0x00}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xd2, 0x90, 0x00}}, {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {2, [3]byte{0xd0, 0x81, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, {2, [3]byte{0xd0, 0x84, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xd0, 0x87, 0x00}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, {2, [3]byte{0xd0, 0x86, 0x00}}, {2, [3]byte{0xd1, 0x96, 0x00}}, {2, [3]byte{0xd2, 0x91, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xd1, 0x91, 0x00}}, {3, [3]byte{0xe2, 0x84, 0x96}}, {2, [3]byte{0xd1, 0x94, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {2, [3]byte{0xd1, 0x98, 0x00}}, {2, [3]byte{0xd0, 0x85, 0x00}}, {2, [3]byte{0xd1, 0x95, 0x00}}, {2, [3]byte{0xd1, 0x97, 0x00}}, {2, [3]byte{0xd0, 0x90, 0x00}}, {2, [3]byte{0xd0, 0x91, 0x00}}, {2, [3]byte{0xd0, 0x92, 0x00}}, {2, [3]byte{0xd0, 0x93, 0x00}}, {2, [3]byte{0xd0, 0x94, 0x00}}, {2, [3]byte{0xd0, 0x95, 0x00}}, {2, [3]byte{0xd0, 0x96, 0x00}}, {2, [3]byte{0xd0, 0x97, 0x00}}, {2, [3]byte{0xd0, 0x98, 0x00}}, {2, [3]byte{0xd0, 0x99, 0x00}}, {2, [3]byte{0xd0, 0x9a, 0x00}}, {2, [3]byte{0xd0, 0x9b, 0x00}}, {2, [3]byte{0xd0, 0x9c, 0x00}}, {2, [3]byte{0xd0, 0x9d, 0x00}}, {2, [3]byte{0xd0, 0x9e, 0x00}}, {2, [3]byte{0xd0, 0x9f, 0x00}}, {2, [3]byte{0xd0, 0xa0, 0x00}}, {2, [3]byte{0xd0, 0xa1, 0x00}}, {2, [3]byte{0xd0, 0xa2, 0x00}}, {2, [3]byte{0xd0, 0xa3, 0x00}}, {2, [3]byte{0xd0, 0xa4, 0x00}}, {2, [3]byte{0xd0, 0xa5, 0x00}}, {2, [3]byte{0xd0, 0xa6, 0x00}}, {2, [3]byte{0xd0, 0xa7, 0x00}}, {2, [3]byte{0xd0, 0xa8, 0x00}}, {2, [3]byte{0xd0, 0xa9, 0x00}}, {2, [3]byte{0xd0, 0xaa, 0x00}}, {2, [3]byte{0xd0, 0xab, 0x00}}, {2, [3]byte{0xd0, 0xac, 0x00}}, {2, [3]byte{0xd0, 0xad, 0x00}}, {2, [3]byte{0xd0, 0xae, 0x00}}, {2, [3]byte{0xd0, 0xaf, 0x00}}, {2, [3]byte{0xd0, 0xb0, 0x00}}, {2, [3]byte{0xd0, 0xb1, 0x00}}, {2, [3]byte{0xd0, 0xb2, 0x00}}, {2, [3]byte{0xd0, 0xb3, 0x00}}, {2, [3]byte{0xd0, 0xb4, 0x00}}, {2, [3]byte{0xd0, 0xb5, 0x00}}, {2, [3]byte{0xd0, 0xb6, 0x00}}, {2, [3]byte{0xd0, 0xb7, 0x00}}, {2, [3]byte{0xd0, 0xb8, 0x00}}, {2, [3]byte{0xd0, 0xb9, 0x00}}, {2, [3]byte{0xd0, 0xba, 0x00}}, {2, [3]byte{0xd0, 0xbb, 0x00}}, {2, [3]byte{0xd0, 0xbc, 0x00}}, {2, [3]byte{0xd0, 0xbd, 0x00}}, {2, [3]byte{0xd0, 0xbe, 0x00}}, {2, [3]byte{0xd0, 0xbf, 0x00}}, {2, [3]byte{0xd1, 0x80, 0x00}}, {2, [3]byte{0xd1, 0x81, 0x00}}, {2, [3]byte{0xd1, 0x82, 0x00}}, {2, [3]byte{0xd1, 0x83, 0x00}}, {2, [3]byte{0xd1, 0x84, 0x00}}, {2, [3]byte{0xd1, 0x85, 0x00}}, {2, [3]byte{0xd1, 0x86, 0x00}}, {2, [3]byte{0xd1, 0x87, 0x00}}, {2, [3]byte{0xd1, 0x88, 0x00}}, {2, [3]byte{0xd1, 0x89, 0x00}}, {2, [3]byte{0xd1, 0x8a, 0x00}}, {2, [3]byte{0xd1, 0x8b, 0x00}}, {2, [3]byte{0xd1, 0x8c, 0x00}}, {2, [3]byte{0xd1, 0x8d, 0x00}}, {2, [3]byte{0xd1, 0x8e, 0x00}}, {2, [3]byte{0xd1, 0x8f, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xa00000a0, 0xa40000a4, 0xa60000a6, 0xa70000a7, 0xa90000a9, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xb00000b0, 0xb10000b1, 0xb50000b5, 0xb60000b6, 0xb70000b7, 0xbb0000bb, 0xa8000401, 0x80000402, 0x81000403, 0xaa000404, 0xbd000405, 0xb2000406, 0xaf000407, 0xa3000408, 0x8a000409, 0x8c00040a, 0x8e00040b, 0x8d00040c, 0xa100040e, 0x8f00040f, 0xc0000410, 0xc1000411, 0xc2000412, 0xc3000413, 0xc4000414, 0xc5000415, 0xc6000416, 0xc7000417, 0xc8000418, 0xc9000419, 0xca00041a, 0xcb00041b, 0xcc00041c, 0xcd00041d, 0xce00041e, 0xcf00041f, 0xd0000420, 0xd1000421, 0xd2000422, 0xd3000423, 0xd4000424, 0xd5000425, 0xd6000426, 0xd7000427, 0xd8000428, 0xd9000429, 0xda00042a, 0xdb00042b, 0xdc00042c, 0xdd00042d, 0xde00042e, 0xdf00042f, 0xe0000430, 0xe1000431, 0xe2000432, 0xe3000433, 0xe4000434, 0xe5000435, 0xe6000436, 0xe7000437, 0xe8000438, 0xe9000439, 0xea00043a, 0xeb00043b, 0xec00043c, 0xed00043d, 0xee00043e, 0xef00043f, 0xf0000440, 0xf1000441, 0xf2000442, 0xf3000443, 0xf4000444, 0xf5000445, 0xf6000446, 0xf7000447, 0xf8000448, 0xf9000449, 0xfa00044a, 0xfb00044b, 0xfc00044c, 0xfd00044d, 0xfe00044e, 0xff00044f, 0xb8000451, 0x90000452, 0x83000453, 0xba000454, 0xbe000455, 0xb3000456, 0xbf000457, 0xbc000458, 0x9a000459, 0x9c00045a, 0x9e00045b, 0x9d00045c, 0xa200045e, 0x9f00045f, 0xa5000490, 0xb4000491, 0x96002013, 0x97002014, 0x91002018, 0x92002019, 0x8200201a, 0x9300201c, 0x9400201d, 0x8400201e, 0x86002020, 0x87002021, 0x95002022, 0x85002026, 0x89002030, 0x8b002039, 0x9b00203a, 0x880020ac, 0xb9002116, 0x99002122, 0x99002122, }, } // Windows1252 is the Windows 1252 encoding. var Windows1252 encoding.Encoding = &windows1252 var windows1252 = charmap{ name: "Windows 1252", mib: identifier.Windows1252, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x9a}}, {2, [3]byte{0xc6, 0x92, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x9e}}, {3, [3]byte{0xe2, 0x80, 0xa6}}, {3, [3]byte{0xe2, 0x80, 0xa0}}, {3, [3]byte{0xe2, 0x80, 0xa1}}, {2, [3]byte{0xcb, 0x86, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb0}}, {2, [3]byte{0xc5, 0xa0, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb9}}, {2, [3]byte{0xc5, 0x92, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc5, 0xbd, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x98}}, {3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}}, {3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}}, {3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}}, {2, [3]byte{0xcb, 0x9c, 0x00}}, {3, [3]byte{0xe2, 0x84, 0xa2}}, {2, [3]byte{0xc5, 0xa1, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xba}}, {2, [3]byte{0xc5, 0x93, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc5, 0xbe, 0x00}}, {2, [3]byte{0xc5, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}}, {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, {2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}}, {2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}}, {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, {2, [3]byte{0xc3, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}}, {2, [3]byte{0xc3, 0x90, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}}, {2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, {2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}}, {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}}, {2, [3]byte{0xc3, 0x9e, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, {2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, {2, [3]byte{0xc3, 0xb0, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}}, {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}}, {2, [3]byte{0xc3, 0xbe, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xa00000a0, 0xa10000a1, 0xa20000a2, 0xa30000a3, 0xa40000a4, 0xa50000a5, 0xa60000a6, 0xa70000a7, 0xa80000a8, 0xa90000a9, 0xaa0000aa, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xaf0000af, 0xb00000b0, 0xb10000b1, 0xb20000b2, 0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7, 0xb80000b8, 0xb90000b9, 0xba0000ba, 0xbb0000bb, 0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xbf0000bf, 0xc00000c0, 0xc10000c1, 0xc20000c2, 0xc30000c3, 0xc40000c4, 0xc50000c5, 0xc60000c6, 0xc70000c7, 0xc80000c8, 0xc90000c9, 0xca0000ca, 0xcb0000cb, 0xcc0000cc, 0xcd0000cd, 0xce0000ce, 0xcf0000cf, 0xd00000d0, 0xd10000d1, 0xd20000d2, 0xd30000d3, 0xd40000d4, 0xd50000d5, 0xd60000d6, 0xd70000d7, 0xd80000d8, 0xd90000d9, 0xda0000da, 0xdb0000db, 0xdc0000dc, 0xdd0000dd, 0xde0000de, 0xdf0000df, 0xe00000e0, 0xe10000e1, 0xe20000e2, 0xe30000e3, 0xe40000e4, 0xe50000e5, 0xe60000e6, 0xe70000e7, 0xe80000e8, 0xe90000e9, 0xea0000ea, 0xeb0000eb, 0xec0000ec, 0xed0000ed, 0xee0000ee, 0xef0000ef, 0xf00000f0, 0xf10000f1, 0xf20000f2, 0xf30000f3, 0xf40000f4, 0xf50000f5, 0xf60000f6, 0xf70000f7, 0xf80000f8, 0xf90000f9, 0xfa0000fa, 0xfb0000fb, 0xfc0000fc, 0xfd0000fd, 0xfe0000fe, 0xff0000ff, 0x8c000152, 0x9c000153, 0x8a000160, 0x9a000161, 0x9f000178, 0x8e00017d, 0x9e00017e, 0x83000192, 0x880002c6, 0x980002dc, 0x96002013, 0x97002014, 0x91002018, 0x92002019, 0x8200201a, 0x9300201c, 0x9400201d, 0x8400201e, 0x86002020, 0x87002021, 0x95002022, 0x85002026, 0x89002030, 0x8b002039, 0x9b00203a, 0x800020ac, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, }, } // Windows1253 is the Windows 1253 encoding. var Windows1253 encoding.Encoding = &windows1253 var windows1253 = charmap{ name: "Windows 1253", mib: identifier.Windows1253, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x9a}}, {2, [3]byte{0xc6, 0x92, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x9e}}, {3, [3]byte{0xe2, 0x80, 0xa6}}, {3, [3]byte{0xe2, 0x80, 0xa0}}, {3, [3]byte{0xe2, 0x80, 0xa1}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xb0}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xb9}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x98}}, {3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}}, {3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}}, {3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x84, 0xa2}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xba}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xce, 0x85, 0x00}}, {2, [3]byte{0xce, 0x86, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x95}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, {2, [3]byte{0xce, 0x84, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xce, 0x88, 0x00}}, {2, [3]byte{0xce, 0x89, 0x00}}, {2, [3]byte{0xce, 0x8a, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {2, [3]byte{0xce, 0x8c, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, {2, [3]byte{0xce, 0x8e, 0x00}}, {2, [3]byte{0xce, 0x8f, 0x00}}, {2, [3]byte{0xce, 0x90, 0x00}}, {2, [3]byte{0xce, 0x91, 0x00}}, {2, [3]byte{0xce, 0x92, 0x00}}, {2, [3]byte{0xce, 0x93, 0x00}}, {2, [3]byte{0xce, 0x94, 0x00}}, {2, [3]byte{0xce, 0x95, 0x00}}, {2, [3]byte{0xce, 0x96, 0x00}}, {2, [3]byte{0xce, 0x97, 0x00}}, {2, [3]byte{0xce, 0x98, 0x00}}, {2, [3]byte{0xce, 0x99, 0x00}}, {2, [3]byte{0xce, 0x9a, 0x00}}, {2, [3]byte{0xce, 0x9b, 0x00}}, {2, [3]byte{0xce, 0x9c, 0x00}}, {2, [3]byte{0xce, 0x9d, 0x00}}, {2, [3]byte{0xce, 0x9e, 0x00}}, {2, [3]byte{0xce, 0x9f, 0x00}}, {2, [3]byte{0xce, 0xa0, 0x00}}, {2, [3]byte{0xce, 0xa1, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xce, 0xa3, 0x00}}, {2, [3]byte{0xce, 0xa4, 0x00}}, {2, [3]byte{0xce, 0xa5, 0x00}}, {2, [3]byte{0xce, 0xa6, 0x00}}, {2, [3]byte{0xce, 0xa7, 0x00}}, {2, [3]byte{0xce, 0xa8, 0x00}}, {2, [3]byte{0xce, 0xa9, 0x00}}, {2, [3]byte{0xce, 0xaa, 0x00}}, {2, [3]byte{0xce, 0xab, 0x00}}, {2, [3]byte{0xce, 0xac, 0x00}}, {2, [3]byte{0xce, 0xad, 0x00}}, {2, [3]byte{0xce, 0xae, 0x00}}, {2, [3]byte{0xce, 0xaf, 0x00}}, {2, [3]byte{0xce, 0xb0, 0x00}}, {2, [3]byte{0xce, 0xb1, 0x00}}, {2, [3]byte{0xce, 0xb2, 0x00}}, {2, [3]byte{0xce, 0xb3, 0x00}}, {2, [3]byte{0xce, 0xb4, 0x00}}, {2, [3]byte{0xce, 0xb5, 0x00}}, {2, [3]byte{0xce, 0xb6, 0x00}}, {2, [3]byte{0xce, 0xb7, 0x00}}, {2, [3]byte{0xce, 0xb8, 0x00}}, {2, [3]byte{0xce, 0xb9, 0x00}}, {2, [3]byte{0xce, 0xba, 0x00}}, {2, [3]byte{0xce, 0xbb, 0x00}}, {2, [3]byte{0xce, 0xbc, 0x00}}, {2, [3]byte{0xce, 0xbd, 0x00}}, {2, [3]byte{0xce, 0xbe, 0x00}}, {2, [3]byte{0xce, 0xbf, 0x00}}, {2, [3]byte{0xcf, 0x80, 0x00}}, {2, [3]byte{0xcf, 0x81, 0x00}}, {2, [3]byte{0xcf, 0x82, 0x00}}, {2, [3]byte{0xcf, 0x83, 0x00}}, {2, [3]byte{0xcf, 0x84, 0x00}}, {2, [3]byte{0xcf, 0x85, 0x00}}, {2, [3]byte{0xcf, 0x86, 0x00}}, {2, [3]byte{0xcf, 0x87, 0x00}}, {2, [3]byte{0xcf, 0x88, 0x00}}, {2, [3]byte{0xcf, 0x89, 0x00}}, {2, [3]byte{0xcf, 0x8a, 0x00}}, {2, [3]byte{0xcf, 0x8b, 0x00}}, {2, [3]byte{0xcf, 0x8c, 0x00}}, {2, [3]byte{0xcf, 0x8d, 0x00}}, {2, [3]byte{0xcf, 0x8e, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xa00000a0, 0xa30000a3, 0xa40000a4, 0xa50000a5, 0xa60000a6, 0xa70000a7, 0xa80000a8, 0xa90000a9, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xb00000b0, 0xb10000b1, 0xb20000b2, 0xb30000b3, 0xb50000b5, 0xb60000b6, 0xb70000b7, 0xbb0000bb, 0xbd0000bd, 0x83000192, 0xb4000384, 0xa1000385, 0xa2000386, 0xb8000388, 0xb9000389, 0xba00038a, 0xbc00038c, 0xbe00038e, 0xbf00038f, 0xc0000390, 0xc1000391, 0xc2000392, 0xc3000393, 0xc4000394, 0xc5000395, 0xc6000396, 0xc7000397, 0xc8000398, 0xc9000399, 0xca00039a, 0xcb00039b, 0xcc00039c, 0xcd00039d, 0xce00039e, 0xcf00039f, 0xd00003a0, 0xd10003a1, 0xd30003a3, 0xd40003a4, 0xd50003a5, 0xd60003a6, 0xd70003a7, 0xd80003a8, 0xd90003a9, 0xda0003aa, 0xdb0003ab, 0xdc0003ac, 0xdd0003ad, 0xde0003ae, 0xdf0003af, 0xe00003b0, 0xe10003b1, 0xe20003b2, 0xe30003b3, 0xe40003b4, 0xe50003b5, 0xe60003b6, 0xe70003b7, 0xe80003b8, 0xe90003b9, 0xea0003ba, 0xeb0003bb, 0xec0003bc, 0xed0003bd, 0xee0003be, 0xef0003bf, 0xf00003c0, 0xf10003c1, 0xf20003c2, 0xf30003c3, 0xf40003c4, 0xf50003c5, 0xf60003c6, 0xf70003c7, 0xf80003c8, 0xf90003c9, 0xfa0003ca, 0xfb0003cb, 0xfc0003cc, 0xfd0003cd, 0xfe0003ce, 0x96002013, 0x97002014, 0xaf002015, 0x91002018, 0x92002019, 0x8200201a, 0x9300201c, 0x9400201d, 0x8400201e, 0x86002020, 0x87002021, 0x95002022, 0x85002026, 0x89002030, 0x8b002039, 0x9b00203a, 0x800020ac, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, }, } // Windows1254 is the Windows 1254 encoding. var Windows1254 encoding.Encoding = &windows1254 var windows1254 = charmap{ name: "Windows 1254", mib: identifier.Windows1254, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x9a}}, {2, [3]byte{0xc6, 0x92, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x9e}}, {3, [3]byte{0xe2, 0x80, 0xa6}}, {3, [3]byte{0xe2, 0x80, 0xa0}}, {3, [3]byte{0xe2, 0x80, 0xa1}}, {2, [3]byte{0xcb, 0x86, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb0}}, {2, [3]byte{0xc5, 0xa0, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb9}}, {2, [3]byte{0xc5, 0x92, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x98}}, {3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}}, {3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}}, {3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}}, {2, [3]byte{0xcb, 0x9c, 0x00}}, {3, [3]byte{0xe2, 0x84, 0xa2}}, {2, [3]byte{0xc5, 0xa1, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xba}}, {2, [3]byte{0xc5, 0x93, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc5, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}}, {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, {2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}}, {2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}}, {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, {2, [3]byte{0xc3, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}}, {2, [3]byte{0xc4, 0x9e, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}}, {2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, {2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}}, {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc4, 0xb0, 0x00}}, {2, [3]byte{0xc5, 0x9e, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, {2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, {2, [3]byte{0xc4, 0x9f, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}}, {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc4, 0xb1, 0x00}}, {2, [3]byte{0xc5, 0x9f, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xa00000a0, 0xa10000a1, 0xa20000a2, 0xa30000a3, 0xa40000a4, 0xa50000a5, 0xa60000a6, 0xa70000a7, 0xa80000a8, 0xa90000a9, 0xaa0000aa, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xaf0000af, 0xb00000b0, 0xb10000b1, 0xb20000b2, 0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7, 0xb80000b8, 0xb90000b9, 0xba0000ba, 0xbb0000bb, 0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xbf0000bf, 0xc00000c0, 0xc10000c1, 0xc20000c2, 0xc30000c3, 0xc40000c4, 0xc50000c5, 0xc60000c6, 0xc70000c7, 0xc80000c8, 0xc90000c9, 0xca0000ca, 0xcb0000cb, 0xcc0000cc, 0xcd0000cd, 0xce0000ce, 0xcf0000cf, 0xd10000d1, 0xd20000d2, 0xd30000d3, 0xd40000d4, 0xd50000d5, 0xd60000d6, 0xd70000d7, 0xd80000d8, 0xd90000d9, 0xda0000da, 0xdb0000db, 0xdc0000dc, 0xdf0000df, 0xe00000e0, 0xe10000e1, 0xe20000e2, 0xe30000e3, 0xe40000e4, 0xe50000e5, 0xe60000e6, 0xe70000e7, 0xe80000e8, 0xe90000e9, 0xea0000ea, 0xeb0000eb, 0xec0000ec, 0xed0000ed, 0xee0000ee, 0xef0000ef, 0xf10000f1, 0xf20000f2, 0xf30000f3, 0xf40000f4, 0xf50000f5, 0xf60000f6, 0xf70000f7, 0xf80000f8, 0xf90000f9, 0xfa0000fa, 0xfb0000fb, 0xfc0000fc, 0xff0000ff, 0xd000011e, 0xf000011f, 0xdd000130, 0xfd000131, 0x8c000152, 0x9c000153, 0xde00015e, 0xfe00015f, 0x8a000160, 0x9a000161, 0x9f000178, 0x83000192, 0x880002c6, 0x980002dc, 0x96002013, 0x97002014, 0x91002018, 0x92002019, 0x8200201a, 0x9300201c, 0x9400201d, 0x8400201e, 0x86002020, 0x87002021, 0x95002022, 0x85002026, 0x89002030, 0x8b002039, 0x9b00203a, 0x800020ac, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, }, } // Windows1255 is the Windows 1255 encoding. var Windows1255 encoding.Encoding = &windows1255 var windows1255 = charmap{ name: "Windows 1255", mib: identifier.Windows1255, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x9a}}, {2, [3]byte{0xc6, 0x92, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x9e}}, {3, [3]byte{0xe2, 0x80, 0xa6}}, {3, [3]byte{0xe2, 0x80, 0xa0}}, {3, [3]byte{0xe2, 0x80, 0xa1}}, {2, [3]byte{0xcb, 0x86, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb0}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xb9}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x98}}, {3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}}, {3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}}, {3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}}, {2, [3]byte{0xcb, 0x9c, 0x00}}, {3, [3]byte{0xe2, 0x84, 0xa2}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xba}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}}, {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, {3, [3]byte{0xe2, 0x82, 0xaa}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}}, {2, [3]byte{0xd6, 0xb0, 0x00}}, {2, [3]byte{0xd6, 0xb1, 0x00}}, {2, [3]byte{0xd6, 0xb2, 0x00}}, {2, [3]byte{0xd6, 0xb3, 0x00}}, {2, [3]byte{0xd6, 0xb4, 0x00}}, {2, [3]byte{0xd6, 0xb5, 0x00}}, {2, [3]byte{0xd6, 0xb6, 0x00}}, {2, [3]byte{0xd6, 0xb7, 0x00}}, {2, [3]byte{0xd6, 0xb8, 0x00}}, {2, [3]byte{0xd6, 0xb9, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xd6, 0xbb, 0x00}}, {2, [3]byte{0xd6, 0xbc, 0x00}}, {2, [3]byte{0xd6, 0xbd, 0x00}}, {2, [3]byte{0xd6, 0xbe, 0x00}}, {2, [3]byte{0xd6, 0xbf, 0x00}}, {2, [3]byte{0xd7, 0x80, 0x00}}, {2, [3]byte{0xd7, 0x81, 0x00}}, {2, [3]byte{0xd7, 0x82, 0x00}}, {2, [3]byte{0xd7, 0x83, 0x00}}, {2, [3]byte{0xd7, 0xb0, 0x00}}, {2, [3]byte{0xd7, 0xb1, 0x00}}, {2, [3]byte{0xd7, 0xb2, 0x00}}, {2, [3]byte{0xd7, 0xb3, 0x00}}, {2, [3]byte{0xd7, 0xb4, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xd7, 0x90, 0x00}}, {2, [3]byte{0xd7, 0x91, 0x00}}, {2, [3]byte{0xd7, 0x92, 0x00}}, {2, [3]byte{0xd7, 0x93, 0x00}}, {2, [3]byte{0xd7, 0x94, 0x00}}, {2, [3]byte{0xd7, 0x95, 0x00}}, {2, [3]byte{0xd7, 0x96, 0x00}}, {2, [3]byte{0xd7, 0x97, 0x00}}, {2, [3]byte{0xd7, 0x98, 0x00}}, {2, [3]byte{0xd7, 0x99, 0x00}}, {2, [3]byte{0xd7, 0x9a, 0x00}}, {2, [3]byte{0xd7, 0x9b, 0x00}}, {2, [3]byte{0xd7, 0x9c, 0x00}}, {2, [3]byte{0xd7, 0x9d, 0x00}}, {2, [3]byte{0xd7, 0x9e, 0x00}}, {2, [3]byte{0xd7, 0x9f, 0x00}}, {2, [3]byte{0xd7, 0xa0, 0x00}}, {2, [3]byte{0xd7, 0xa1, 0x00}}, {2, [3]byte{0xd7, 0xa2, 0x00}}, {2, [3]byte{0xd7, 0xa3, 0x00}}, {2, [3]byte{0xd7, 0xa4, 0x00}}, {2, [3]byte{0xd7, 0xa5, 0x00}}, {2, [3]byte{0xd7, 0xa6, 0x00}}, {2, [3]byte{0xd7, 0xa7, 0x00}}, {2, [3]byte{0xd7, 0xa8, 0x00}}, {2, [3]byte{0xd7, 0xa9, 0x00}}, {2, [3]byte{0xd7, 0xaa, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x8e}}, {3, [3]byte{0xe2, 0x80, 0x8f}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xa00000a0, 0xa10000a1, 0xa20000a2, 0xa30000a3, 0xa50000a5, 0xa60000a6, 0xa70000a7, 0xa80000a8, 0xa90000a9, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xaf0000af, 0xb00000b0, 0xb10000b1, 0xb20000b2, 0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7, 0xb80000b8, 0xb90000b9, 0xbb0000bb, 0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xbf0000bf, 0xaa0000d7, 0xba0000f7, 0x83000192, 0x880002c6, 0x980002dc, 0xc00005b0, 0xc10005b1, 0xc20005b2, 0xc30005b3, 0xc40005b4, 0xc50005b5, 0xc60005b6, 0xc70005b7, 0xc80005b8, 0xc90005b9, 0xcb0005bb, 0xcc0005bc, 0xcd0005bd, 0xce0005be, 0xcf0005bf, 0xd00005c0, 0xd10005c1, 0xd20005c2, 0xd30005c3, 0xe00005d0, 0xe10005d1, 0xe20005d2, 0xe30005d3, 0xe40005d4, 0xe50005d5, 0xe60005d6, 0xe70005d7, 0xe80005d8, 0xe90005d9, 0xea0005da, 0xeb0005db, 0xec0005dc, 0xed0005dd, 0xee0005de, 0xef0005df, 0xf00005e0, 0xf10005e1, 0xf20005e2, 0xf30005e3, 0xf40005e4, 0xf50005e5, 0xf60005e6, 0xf70005e7, 0xf80005e8, 0xf90005e9, 0xfa0005ea, 0xd40005f0, 0xd50005f1, 0xd60005f2, 0xd70005f3, 0xd80005f4, 0xfd00200e, 0xfe00200f, 0x96002013, 0x97002014, 0x91002018, 0x92002019, 0x8200201a, 0x9300201c, 0x9400201d, 0x8400201e, 0x86002020, 0x87002021, 0x95002022, 0x85002026, 0x89002030, 0x8b002039, 0x9b00203a, 0xa40020aa, 0x800020ac, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, }, } // Windows1256 is the Windows 1256 encoding. var Windows1256 encoding.Encoding = &windows1256 var windows1256 = charmap{ name: "Windows 1256", mib: identifier.Windows1256, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {3, [3]byte{0xe2, 0x82, 0xac}}, {2, [3]byte{0xd9, 0xbe, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x9a}}, {2, [3]byte{0xc6, 0x92, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x9e}}, {3, [3]byte{0xe2, 0x80, 0xa6}}, {3, [3]byte{0xe2, 0x80, 0xa0}}, {3, [3]byte{0xe2, 0x80, 0xa1}}, {2, [3]byte{0xcb, 0x86, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb0}}, {2, [3]byte{0xd9, 0xb9, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb9}}, {2, [3]byte{0xc5, 0x92, 0x00}}, {2, [3]byte{0xda, 0x86, 0x00}}, {2, [3]byte{0xda, 0x98, 0x00}}, {2, [3]byte{0xda, 0x88, 0x00}}, {2, [3]byte{0xda, 0xaf, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x98}}, {3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}}, {3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}}, {3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}}, {2, [3]byte{0xda, 0xa9, 0x00}}, {3, [3]byte{0xe2, 0x84, 0xa2}}, {2, [3]byte{0xda, 0x91, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xba}}, {2, [3]byte{0xc5, 0x93, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x8c}}, {3, [3]byte{0xe2, 0x80, 0x8d}}, {2, [3]byte{0xda, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xd8, 0x8c, 0x00}}, {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, {2, [3]byte{0xda, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}}, {2, [3]byte{0xd8, 0x9b, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xd8, 0x9f, 0x00}}, {2, [3]byte{0xdb, 0x81, 0x00}}, {2, [3]byte{0xd8, 0xa1, 0x00}}, {2, [3]byte{0xd8, 0xa2, 0x00}}, {2, [3]byte{0xd8, 0xa3, 0x00}}, {2, [3]byte{0xd8, 0xa4, 0x00}}, {2, [3]byte{0xd8, 0xa5, 0x00}}, {2, [3]byte{0xd8, 0xa6, 0x00}}, {2, [3]byte{0xd8, 0xa7, 0x00}}, {2, [3]byte{0xd8, 0xa8, 0x00}}, {2, [3]byte{0xd8, 0xa9, 0x00}}, {2, [3]byte{0xd8, 0xaa, 0x00}}, {2, [3]byte{0xd8, 0xab, 0x00}}, {2, [3]byte{0xd8, 0xac, 0x00}}, {2, [3]byte{0xd8, 0xad, 0x00}}, {2, [3]byte{0xd8, 0xae, 0x00}}, {2, [3]byte{0xd8, 0xaf, 0x00}}, {2, [3]byte{0xd8, 0xb0, 0x00}}, {2, [3]byte{0xd8, 0xb1, 0x00}}, {2, [3]byte{0xd8, 0xb2, 0x00}}, {2, [3]byte{0xd8, 0xb3, 0x00}}, {2, [3]byte{0xd8, 0xb4, 0x00}}, {2, [3]byte{0xd8, 0xb5, 0x00}}, {2, [3]byte{0xd8, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, {2, [3]byte{0xd8, 0xb7, 0x00}}, {2, [3]byte{0xd8, 0xb8, 0x00}}, {2, [3]byte{0xd8, 0xb9, 0x00}}, {2, [3]byte{0xd8, 0xba, 0x00}}, {2, [3]byte{0xd9, 0x80, 0x00}}, {2, [3]byte{0xd9, 0x81, 0x00}}, {2, [3]byte{0xd9, 0x82, 0x00}}, {2, [3]byte{0xd9, 0x83, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xd9, 0x84, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xd9, 0x85, 0x00}}, {2, [3]byte{0xd9, 0x86, 0x00}}, {2, [3]byte{0xd9, 0x87, 0x00}}, {2, [3]byte{0xd9, 0x88, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, {2, [3]byte{0xd9, 0x89, 0x00}}, {2, [3]byte{0xd9, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, {2, [3]byte{0xd9, 0x8b, 0x00}}, {2, [3]byte{0xd9, 0x8c, 0x00}}, {2, [3]byte{0xd9, 0x8d, 0x00}}, {2, [3]byte{0xd9, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xd9, 0x8f, 0x00}}, {2, [3]byte{0xd9, 0x90, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {2, [3]byte{0xd9, 0x91, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, {2, [3]byte{0xd9, 0x92, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x8e}}, {3, [3]byte{0xe2, 0x80, 0x8f}}, {2, [3]byte{0xdb, 0x92, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xa00000a0, 0xa20000a2, 0xa30000a3, 0xa40000a4, 0xa50000a5, 0xa60000a6, 0xa70000a7, 0xa80000a8, 0xa90000a9, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xaf0000af, 0xb00000b0, 0xb10000b1, 0xb20000b2, 0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7, 0xb80000b8, 0xb90000b9, 0xbb0000bb, 0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xd70000d7, 0xe00000e0, 0xe20000e2, 0xe70000e7, 0xe80000e8, 0xe90000e9, 0xea0000ea, 0xeb0000eb, 0xee0000ee, 0xef0000ef, 0xf40000f4, 0xf70000f7, 0xf90000f9, 0xfb0000fb, 0xfc0000fc, 0x8c000152, 0x9c000153, 0x83000192, 0x880002c6, 0xa100060c, 0xba00061b, 0xbf00061f, 0xc1000621, 0xc2000622, 0xc3000623, 0xc4000624, 0xc5000625, 0xc6000626, 0xc7000627, 0xc8000628, 0xc9000629, 0xca00062a, 0xcb00062b, 0xcc00062c, 0xcd00062d, 0xce00062e, 0xcf00062f, 0xd0000630, 0xd1000631, 0xd2000632, 0xd3000633, 0xd4000634, 0xd5000635, 0xd6000636, 0xd8000637, 0xd9000638, 0xda000639, 0xdb00063a, 0xdc000640, 0xdd000641, 0xde000642, 0xdf000643, 0xe1000644, 0xe3000645, 0xe4000646, 0xe5000647, 0xe6000648, 0xec000649, 0xed00064a, 0xf000064b, 0xf100064c, 0xf200064d, 0xf300064e, 0xf500064f, 0xf6000650, 0xf8000651, 0xfa000652, 0x8a000679, 0x8100067e, 0x8d000686, 0x8f000688, 0x9a000691, 0x8e000698, 0x980006a9, 0x900006af, 0x9f0006ba, 0xaa0006be, 0xc00006c1, 0xff0006d2, 0x9d00200c, 0x9e00200d, 0xfd00200e, 0xfe00200f, 0x96002013, 0x97002014, 0x91002018, 0x92002019, 0x8200201a, 0x9300201c, 0x9400201d, 0x8400201e, 0x86002020, 0x87002021, 0x95002022, 0x85002026, 0x89002030, 0x8b002039, 0x9b00203a, 0x800020ac, 0x99002122, }, } // Windows1257 is the Windows 1257 encoding. var Windows1257 encoding.Encoding = &windows1257 var windows1257 = charmap{ name: "Windows 1257", mib: identifier.Windows1257, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x9a}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x9e}}, {3, [3]byte{0xe2, 0x80, 0xa6}}, {3, [3]byte{0xe2, 0x80, 0xa0}}, {3, [3]byte{0xe2, 0x80, 0xa1}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xb0}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xb9}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xcb, 0x87, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x98}}, {3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}}, {3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}}, {3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x84, 0xa2}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xba}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xaf, 0x00}}, {2, [3]byte{0xcb, 0x9b, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, {2, [3]byte{0xc5, 0x96, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}}, {2, [3]byte{0xc5, 0x97, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc4, 0x84, 0x00}}, {2, [3]byte{0xc4, 0xae, 0x00}}, {2, [3]byte{0xc4, 0x80, 0x00}}, {2, [3]byte{0xc4, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, {2, [3]byte{0xc4, 0x98, 0x00}}, {2, [3]byte{0xc4, 0x92, 0x00}}, {2, [3]byte{0xc4, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc5, 0xb9, 0x00}}, {2, [3]byte{0xc4, 0x96, 0x00}}, {2, [3]byte{0xc4, 0xa2, 0x00}}, {2, [3]byte{0xc4, 0xb6, 0x00}}, {2, [3]byte{0xc4, 0xaa, 0x00}}, {2, [3]byte{0xc4, 0xbb, 0x00}}, {2, [3]byte{0xc5, 0xa0, 0x00}}, {2, [3]byte{0xc5, 0x83, 0x00}}, {2, [3]byte{0xc5, 0x85, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc5, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, {2, [3]byte{0xc5, 0xb2, 0x00}}, {2, [3]byte{0xc5, 0x81, 0x00}}, {2, [3]byte{0xc5, 0x9a, 0x00}}, {2, [3]byte{0xc5, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc5, 0xbb, 0x00}}, {2, [3]byte{0xc5, 0xbd, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, {2, [3]byte{0xc4, 0x85, 0x00}}, {2, [3]byte{0xc4, 0xaf, 0x00}}, {2, [3]byte{0xc4, 0x81, 0x00}}, {2, [3]byte{0xc4, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, {2, [3]byte{0xc4, 0x99, 0x00}}, {2, [3]byte{0xc4, 0x93, 0x00}}, {2, [3]byte{0xc4, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc5, 0xba, 0x00}}, {2, [3]byte{0xc4, 0x97, 0x00}}, {2, [3]byte{0xc4, 0xa3, 0x00}}, {2, [3]byte{0xc4, 0xb7, 0x00}}, {2, [3]byte{0xc4, 0xab, 0x00}}, {2, [3]byte{0xc4, 0xbc, 0x00}}, {2, [3]byte{0xc5, 0xa1, 0x00}}, {2, [3]byte{0xc5, 0x84, 0x00}}, {2, [3]byte{0xc5, 0x86, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc5, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}}, {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {2, [3]byte{0xc5, 0xb3, 0x00}}, {2, [3]byte{0xc5, 0x82, 0x00}}, {2, [3]byte{0xc5, 0x9b, 0x00}}, {2, [3]byte{0xc5, 0xab, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc5, 0xbc, 0x00}}, {2, [3]byte{0xc5, 0xbe, 0x00}}, {2, [3]byte{0xcb, 0x99, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xa00000a0, 0xa20000a2, 0xa30000a3, 0xa40000a4, 0xa60000a6, 0xa70000a7, 0x8d0000a8, 0xa90000a9, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0x9d0000af, 0xb00000b0, 0xb10000b1, 0xb20000b2, 0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7, 0x8f0000b8, 0xb90000b9, 0xbb0000bb, 0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xc40000c4, 0xc50000c5, 0xaf0000c6, 0xc90000c9, 0xd30000d3, 0xd50000d5, 0xd60000d6, 0xd70000d7, 0xa80000d8, 0xdc0000dc, 0xdf0000df, 0xe40000e4, 0xe50000e5, 0xbf0000e6, 0xe90000e9, 0xf30000f3, 0xf50000f5, 0xf60000f6, 0xf70000f7, 0xb80000f8, 0xfc0000fc, 0xc2000100, 0xe2000101, 0xc0000104, 0xe0000105, 0xc3000106, 0xe3000107, 0xc800010c, 0xe800010d, 0xc7000112, 0xe7000113, 0xcb000116, 0xeb000117, 0xc6000118, 0xe6000119, 0xcc000122, 0xec000123, 0xce00012a, 0xee00012b, 0xc100012e, 0xe100012f, 0xcd000136, 0xed000137, 0xcf00013b, 0xef00013c, 0xd9000141, 0xf9000142, 0xd1000143, 0xf1000144, 0xd2000145, 0xf2000146, 0xd400014c, 0xf400014d, 0xaa000156, 0xba000157, 0xda00015a, 0xfa00015b, 0xd0000160, 0xf0000161, 0xdb00016a, 0xfb00016b, 0xd8000172, 0xf8000173, 0xca000179, 0xea00017a, 0xdd00017b, 0xfd00017c, 0xde00017d, 0xfe00017e, 0x8e0002c7, 0xff0002d9, 0x9e0002db, 0x96002013, 0x97002014, 0x91002018, 0x92002019, 0x8200201a, 0x9300201c, 0x9400201d, 0x8400201e, 0x86002020, 0x87002021, 0x95002022, 0x85002026, 0x89002030, 0x8b002039, 0x9b00203a, 0x800020ac, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, }, } // Windows1258 is the Windows 1258 encoding. var Windows1258 encoding.Encoding = &windows1258 var windows1258 = charmap{ name: "Windows 1258", mib: identifier.Windows1258, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x9a}}, {2, [3]byte{0xc6, 0x92, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x9e}}, {3, [3]byte{0xe2, 0x80, 0xa6}}, {3, [3]byte{0xe2, 0x80, 0xa0}}, {3, [3]byte{0xe2, 0x80, 0xa1}}, {2, [3]byte{0xcb, 0x86, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb0}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xb9}}, {2, [3]byte{0xc5, 0x92, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x98}}, {3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}}, {3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}}, {3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}}, {2, [3]byte{0xcb, 0x9c, 0x00}}, {3, [3]byte{0xe2, 0x84, 0xa2}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xba}}, {2, [3]byte{0xc5, 0x93, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc5, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}}, {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, {2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}}, {2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc4, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, {2, [3]byte{0xcc, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}}, {2, [3]byte{0xc4, 0x90, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}}, {2, [3]byte{0xcc, 0x89, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc6, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, {2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}}, {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc6, 0xaf, 0x00}}, {2, [3]byte{0xcc, 0x83, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc4, 0x83, 0x00}}, {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, {2, [3]byte{0xcc, 0x81, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, {2, [3]byte{0xc4, 0x91, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xcc, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc6, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, {2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc6, 0xb0, 0x00}}, {3, [3]byte{0xe2, 0x82, 0xab}}, {2, [3]byte{0xc3, 0xbf, 0x00}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0xa00000a0, 0xa10000a1, 0xa20000a2, 0xa30000a3, 0xa40000a4, 0xa50000a5, 0xa60000a6, 0xa70000a7, 0xa80000a8, 0xa90000a9, 0xaa0000aa, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xaf0000af, 0xb00000b0, 0xb10000b1, 0xb20000b2, 0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7, 0xb80000b8, 0xb90000b9, 0xba0000ba, 0xbb0000bb, 0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xbf0000bf, 0xc00000c0, 0xc10000c1, 0xc20000c2, 0xc40000c4, 0xc50000c5, 0xc60000c6, 0xc70000c7, 0xc80000c8, 0xc90000c9, 0xca0000ca, 0xcb0000cb, 0xcd0000cd, 0xce0000ce, 0xcf0000cf, 0xd10000d1, 0xd30000d3, 0xd40000d4, 0xd60000d6, 0xd70000d7, 0xd80000d8, 0xd90000d9, 0xda0000da, 0xdb0000db, 0xdc0000dc, 0xdf0000df, 0xe00000e0, 0xe10000e1, 0xe20000e2, 0xe40000e4, 0xe50000e5, 0xe60000e6, 0xe70000e7, 0xe80000e8, 0xe90000e9, 0xea0000ea, 0xeb0000eb, 0xed0000ed, 0xee0000ee, 0xef0000ef, 0xf10000f1, 0xf30000f3, 0xf40000f4, 0xf60000f6, 0xf70000f7, 0xf80000f8, 0xf90000f9, 0xfa0000fa, 0xfb0000fb, 0xfc0000fc, 0xff0000ff, 0xc3000102, 0xe3000103, 0xd0000110, 0xf0000111, 0x8c000152, 0x9c000153, 0x9f000178, 0x83000192, 0xd50001a0, 0xf50001a1, 0xdd0001af, 0xfd0001b0, 0x880002c6, 0x980002dc, 0xcc000300, 0xec000301, 0xde000303, 0xd2000309, 0xf2000323, 0x96002013, 0x97002014, 0x91002018, 0x92002019, 0x8200201a, 0x9300201c, 0x9400201d, 0x8400201e, 0x86002020, 0x87002021, 0x95002022, 0x85002026, 0x89002030, 0x8b002039, 0x9b00203a, 0xfe0020ab, 0x800020ac, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, }, } // XUserDefined is the X-User-Defined encoding. // // It is defined at http://encoding.spec.whatwg.org/#x-user-defined var XUserDefined encoding.Encoding = &xUserDefined var xUserDefined = charmap{ name: "X-User-Defined", mib: identifier.XUserDefined, asciiSuperset: true, low: 0x80, replacement: 0x1a, decode: [256]utf8Enc{ {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, {3, [3]byte{0xef, 0x9e, 0x80}}, {3, [3]byte{0xef, 0x9e, 0x81}}, {3, [3]byte{0xef, 0x9e, 0x82}}, {3, [3]byte{0xef, 0x9e, 0x83}}, {3, [3]byte{0xef, 0x9e, 0x84}}, {3, [3]byte{0xef, 0x9e, 0x85}}, {3, [3]byte{0xef, 0x9e, 0x86}}, {3, [3]byte{0xef, 0x9e, 0x87}}, {3, [3]byte{0xef, 0x9e, 0x88}}, {3, [3]byte{0xef, 0x9e, 0x89}}, {3, [3]byte{0xef, 0x9e, 0x8a}}, {3, [3]byte{0xef, 0x9e, 0x8b}}, {3, [3]byte{0xef, 0x9e, 0x8c}}, {3, [3]byte{0xef, 0x9e, 0x8d}}, {3, [3]byte{0xef, 0x9e, 0x8e}}, {3, [3]byte{0xef, 0x9e, 0x8f}}, {3, [3]byte{0xef, 0x9e, 0x90}}, {3, [3]byte{0xef, 0x9e, 0x91}}, {3, [3]byte{0xef, 0x9e, 0x92}}, {3, [3]byte{0xef, 0x9e, 0x93}}, {3, [3]byte{0xef, 0x9e, 0x94}}, {3, [3]byte{0xef, 0x9e, 0x95}}, {3, [3]byte{0xef, 0x9e, 0x96}}, {3, [3]byte{0xef, 0x9e, 0x97}}, {3, [3]byte{0xef, 0x9e, 0x98}}, {3, [3]byte{0xef, 0x9e, 0x99}}, {3, [3]byte{0xef, 0x9e, 0x9a}}, {3, [3]byte{0xef, 0x9e, 0x9b}}, {3, [3]byte{0xef, 0x9e, 0x9c}}, {3, [3]byte{0xef, 0x9e, 0x9d}}, {3, [3]byte{0xef, 0x9e, 0x9e}}, {3, [3]byte{0xef, 0x9e, 0x9f}}, {3, [3]byte{0xef, 0x9e, 0xa0}}, {3, [3]byte{0xef, 0x9e, 0xa1}}, {3, [3]byte{0xef, 0x9e, 0xa2}}, {3, [3]byte{0xef, 0x9e, 0xa3}}, {3, [3]byte{0xef, 0x9e, 0xa4}}, {3, [3]byte{0xef, 0x9e, 0xa5}}, {3, [3]byte{0xef, 0x9e, 0xa6}}, {3, [3]byte{0xef, 0x9e, 0xa7}}, {3, [3]byte{0xef, 0x9e, 0xa8}}, {3, [3]byte{0xef, 0x9e, 0xa9}}, {3, [3]byte{0xef, 0x9e, 0xaa}}, {3, [3]byte{0xef, 0x9e, 0xab}}, {3, [3]byte{0xef, 0x9e, 0xac}}, {3, [3]byte{0xef, 0x9e, 0xad}}, {3, [3]byte{0xef, 0x9e, 0xae}}, {3, [3]byte{0xef, 0x9e, 0xaf}}, {3, [3]byte{0xef, 0x9e, 0xb0}}, {3, [3]byte{0xef, 0x9e, 0xb1}}, {3, [3]byte{0xef, 0x9e, 0xb2}}, {3, [3]byte{0xef, 0x9e, 0xb3}}, {3, [3]byte{0xef, 0x9e, 0xb4}}, {3, [3]byte{0xef, 0x9e, 0xb5}}, {3, [3]byte{0xef, 0x9e, 0xb6}}, {3, [3]byte{0xef, 0x9e, 0xb7}}, {3, [3]byte{0xef, 0x9e, 0xb8}}, {3, [3]byte{0xef, 0x9e, 0xb9}}, {3, [3]byte{0xef, 0x9e, 0xba}}, {3, [3]byte{0xef, 0x9e, 0xbb}}, {3, [3]byte{0xef, 0x9e, 0xbc}}, {3, [3]byte{0xef, 0x9e, 0xbd}}, {3, [3]byte{0xef, 0x9e, 0xbe}}, {3, [3]byte{0xef, 0x9e, 0xbf}}, {3, [3]byte{0xef, 0x9f, 0x80}}, {3, [3]byte{0xef, 0x9f, 0x81}}, {3, [3]byte{0xef, 0x9f, 0x82}}, {3, [3]byte{0xef, 0x9f, 0x83}}, {3, [3]byte{0xef, 0x9f, 0x84}}, {3, [3]byte{0xef, 0x9f, 0x85}}, {3, [3]byte{0xef, 0x9f, 0x86}}, {3, [3]byte{0xef, 0x9f, 0x87}}, {3, [3]byte{0xef, 0x9f, 0x88}}, {3, [3]byte{0xef, 0x9f, 0x89}}, {3, [3]byte{0xef, 0x9f, 0x8a}}, {3, [3]byte{0xef, 0x9f, 0x8b}}, {3, [3]byte{0xef, 0x9f, 0x8c}}, {3, [3]byte{0xef, 0x9f, 0x8d}}, {3, [3]byte{0xef, 0x9f, 0x8e}}, {3, [3]byte{0xef, 0x9f, 0x8f}}, {3, [3]byte{0xef, 0x9f, 0x90}}, {3, [3]byte{0xef, 0x9f, 0x91}}, {3, [3]byte{0xef, 0x9f, 0x92}}, {3, [3]byte{0xef, 0x9f, 0x93}}, {3, [3]byte{0xef, 0x9f, 0x94}}, {3, [3]byte{0xef, 0x9f, 0x95}}, {3, [3]byte{0xef, 0x9f, 0x96}}, {3, [3]byte{0xef, 0x9f, 0x97}}, {3, [3]byte{0xef, 0x9f, 0x98}}, {3, [3]byte{0xef, 0x9f, 0x99}}, {3, [3]byte{0xef, 0x9f, 0x9a}}, {3, [3]byte{0xef, 0x9f, 0x9b}}, {3, [3]byte{0xef, 0x9f, 0x9c}}, {3, [3]byte{0xef, 0x9f, 0x9d}}, {3, [3]byte{0xef, 0x9f, 0x9e}}, {3, [3]byte{0xef, 0x9f, 0x9f}}, {3, [3]byte{0xef, 0x9f, 0xa0}}, {3, [3]byte{0xef, 0x9f, 0xa1}}, {3, [3]byte{0xef, 0x9f, 0xa2}}, {3, [3]byte{0xef, 0x9f, 0xa3}}, {3, [3]byte{0xef, 0x9f, 0xa4}}, {3, [3]byte{0xef, 0x9f, 0xa5}}, {3, [3]byte{0xef, 0x9f, 0xa6}}, {3, [3]byte{0xef, 0x9f, 0xa7}}, {3, [3]byte{0xef, 0x9f, 0xa8}}, {3, [3]byte{0xef, 0x9f, 0xa9}}, {3, [3]byte{0xef, 0x9f, 0xaa}}, {3, [3]byte{0xef, 0x9f, 0xab}}, {3, [3]byte{0xef, 0x9f, 0xac}}, {3, [3]byte{0xef, 0x9f, 0xad}}, {3, [3]byte{0xef, 0x9f, 0xae}}, {3, [3]byte{0xef, 0x9f, 0xaf}}, {3, [3]byte{0xef, 0x9f, 0xb0}}, {3, [3]byte{0xef, 0x9f, 0xb1}}, {3, [3]byte{0xef, 0x9f, 0xb2}}, {3, [3]byte{0xef, 0x9f, 0xb3}}, {3, [3]byte{0xef, 0x9f, 0xb4}}, {3, [3]byte{0xef, 0x9f, 0xb5}}, {3, [3]byte{0xef, 0x9f, 0xb6}}, {3, [3]byte{0xef, 0x9f, 0xb7}}, {3, [3]byte{0xef, 0x9f, 0xb8}}, {3, [3]byte{0xef, 0x9f, 0xb9}}, {3, [3]byte{0xef, 0x9f, 0xba}}, {3, [3]byte{0xef, 0x9f, 0xbb}}, {3, [3]byte{0xef, 0x9f, 0xbc}}, {3, [3]byte{0xef, 0x9f, 0xbd}}, {3, [3]byte{0xef, 0x9f, 0xbe}}, {3, [3]byte{0xef, 0x9f, 0xbf}}, }, encode: [256]uint32{ 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, 0x8000f780, 0x8100f781, 0x8200f782, 0x8300f783, 0x8400f784, 0x8500f785, 0x8600f786, 0x8700f787, 0x8800f788, 0x8900f789, 0x8a00f78a, 0x8b00f78b, 0x8c00f78c, 0x8d00f78d, 0x8e00f78e, 0x8f00f78f, 0x9000f790, 0x9100f791, 0x9200f792, 0x9300f793, 0x9400f794, 0x9500f795, 0x9600f796, 0x9700f797, 0x9800f798, 0x9900f799, 0x9a00f79a, 0x9b00f79b, 0x9c00f79c, 0x9d00f79d, 0x9e00f79e, 0x9f00f79f, 0xa000f7a0, 0xa100f7a1, 0xa200f7a2, 0xa300f7a3, 0xa400f7a4, 0xa500f7a5, 0xa600f7a6, 0xa700f7a7, 0xa800f7a8, 0xa900f7a9, 0xaa00f7aa, 0xab00f7ab, 0xac00f7ac, 0xad00f7ad, 0xae00f7ae, 0xaf00f7af, 0xb000f7b0, 0xb100f7b1, 0xb200f7b2, 0xb300f7b3, 0xb400f7b4, 0xb500f7b5, 0xb600f7b6, 0xb700f7b7, 0xb800f7b8, 0xb900f7b9, 0xba00f7ba, 0xbb00f7bb, 0xbc00f7bc, 0xbd00f7bd, 0xbe00f7be, 0xbf00f7bf, 0xc000f7c0, 0xc100f7c1, 0xc200f7c2, 0xc300f7c3, 0xc400f7c4, 0xc500f7c5, 0xc600f7c6, 0xc700f7c7, 0xc800f7c8, 0xc900f7c9, 0xca00f7ca, 0xcb00f7cb, 0xcc00f7cc, 0xcd00f7cd, 0xce00f7ce, 0xcf00f7cf, 0xd000f7d0, 0xd100f7d1, 0xd200f7d2, 0xd300f7d3, 0xd400f7d4, 0xd500f7d5, 0xd600f7d6, 0xd700f7d7, 0xd800f7d8, 0xd900f7d9, 0xda00f7da, 0xdb00f7db, 0xdc00f7dc, 0xdd00f7dd, 0xde00f7de, 0xdf00f7df, 0xe000f7e0, 0xe100f7e1, 0xe200f7e2, 0xe300f7e3, 0xe400f7e4, 0xe500f7e5, 0xe600f7e6, 0xe700f7e7, 0xe800f7e8, 0xe900f7e9, 0xea00f7ea, 0xeb00f7eb, 0xec00f7ec, 0xed00f7ed, 0xee00f7ee, 0xef00f7ef, 0xf000f7f0, 0xf100f7f1, 0xf200f7f2, 0xf300f7f3, 0xf400f7f4, 0xf500f7f5, 0xf600f7f6, 0xf700f7f7, 0xf800f7f8, 0xf900f7f9, 0xfa00f7fa, 0xfb00f7fb, 0xfc00f7fc, 0xfd00f7fd, 0xfe00f7fe, 0xff00f7ff, }, } var listAll = []encoding.Encoding{ CodePage037, CodePage437, CodePage850, CodePage852, CodePage855, CodePage858, CodePage860, CodePage862, CodePage863, CodePage865, CodePage866, CodePage1047, CodePage1140, ISO8859_1, ISO8859_2, ISO8859_3, ISO8859_4, ISO8859_5, ISO8859_6, ISO8859_6E, ISO8859_6I, ISO8859_7, ISO8859_8, ISO8859_8E, ISO8859_8I, ISO8859_9, ISO8859_10, ISO8859_13, ISO8859_14, ISO8859_15, ISO8859_16, KOI8R, KOI8U, Macintosh, MacintoshCyrillic, Windows874, Windows1250, Windows1251, Windows1252, Windows1253, Windows1254, Windows1255, Windows1256, Windows1257, Windows1258, XUserDefined, } // Total table size 87024 bytes (84KiB); checksum: 811C9DC5 ================================================ FILE: vendor/golang.org/x/text/encoding/encoding.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package encoding defines an interface for character encodings, such as Shift // JIS and Windows 1252, that can convert to and from UTF-8. // // Encoding implementations are provided in other packages, such as // golang.org/x/text/encoding/charmap and // golang.org/x/text/encoding/japanese. package encoding // import "golang.org/x/text/encoding" import ( "errors" "io" "strconv" "unicode/utf8" "golang.org/x/text/encoding/internal/identifier" "golang.org/x/text/transform" ) // TODO: // - There seems to be some inconsistency in when decoders return errors // and when not. Also documentation seems to suggest they shouldn't return // errors at all (except for UTF-16). // - Encoders seem to rely on or at least benefit from the input being in NFC // normal form. Perhaps add an example how users could prepare their output. // Encoding is a character set encoding that can be transformed to and from // UTF-8. type Encoding interface { // NewDecoder returns a Decoder. NewDecoder() *Decoder // NewEncoder returns an Encoder. NewEncoder() *Encoder } // A Decoder converts bytes to UTF-8. It implements transform.Transformer. // // Transforming source bytes that are not of that encoding will not result in an // error per se. Each byte that cannot be transcoded will be represented in the // output by the UTF-8 encoding of '\uFFFD', the replacement rune. type Decoder struct { transform.Transformer // This forces external creators of Decoders to use names in struct // initializers, allowing for future extendibility without having to break // code. _ struct{} } // Bytes converts the given encoded bytes to UTF-8. It returns the converted // bytes or nil, err if any error occurred. func (d *Decoder) Bytes(b []byte) ([]byte, error) { b, _, err := transform.Bytes(d, b) if err != nil { return nil, err } return b, nil } // String converts the given encoded string to UTF-8. It returns the converted // string or "", err if any error occurred. func (d *Decoder) String(s string) (string, error) { s, _, err := transform.String(d, s) if err != nil { return "", err } return s, nil } // Reader wraps another Reader to decode its bytes. // // The Decoder may not be used for any other operation as long as the returned // Reader is in use. func (d *Decoder) Reader(r io.Reader) io.Reader { return transform.NewReader(r, d) } // An Encoder converts bytes from UTF-8. It implements transform.Transformer. // // Each rune that cannot be transcoded will result in an error. In this case, // the transform will consume all source byte up to, not including the offending // rune. Transforming source bytes that are not valid UTF-8 will be replaced by // `\uFFFD`. To return early with an error instead, use transform.Chain to // preprocess the data with a UTF8Validator. type Encoder struct { transform.Transformer // This forces external creators of Encoders to use names in struct // initializers, allowing for future extendibility without having to break // code. _ struct{} } // Bytes converts bytes from UTF-8. It returns the converted bytes or nil, err if // any error occurred. func (e *Encoder) Bytes(b []byte) ([]byte, error) { b, _, err := transform.Bytes(e, b) if err != nil { return nil, err } return b, nil } // String converts a string from UTF-8. It returns the converted string or // "", err if any error occurred. func (e *Encoder) String(s string) (string, error) { s, _, err := transform.String(e, s) if err != nil { return "", err } return s, nil } // Writer wraps another Writer to encode its UTF-8 output. // // The Encoder may not be used for any other operation as long as the returned // Writer is in use. func (e *Encoder) Writer(w io.Writer) io.Writer { return transform.NewWriter(w, e) } // ASCIISub is the ASCII substitute character, as recommended by // http://unicode.org/reports/tr36/#Text_Comparison const ASCIISub = '\x1a' // Nop is the nop encoding. Its transformed bytes are the same as the source // bytes; it does not replace invalid UTF-8 sequences. var Nop Encoding = nop{} type nop struct{} func (nop) NewDecoder() *Decoder { return &Decoder{Transformer: transform.Nop} } func (nop) NewEncoder() *Encoder { return &Encoder{Transformer: transform.Nop} } // Replacement is the replacement encoding. Decoding from the replacement // encoding yields a single '\uFFFD' replacement rune. Encoding from UTF-8 to // the replacement encoding yields the same as the source bytes except that // invalid UTF-8 is converted to '\uFFFD'. // // It is defined at http://encoding.spec.whatwg.org/#replacement var Replacement Encoding = replacement{} type replacement struct{} func (replacement) NewDecoder() *Decoder { return &Decoder{Transformer: replacementDecoder{}} } func (replacement) NewEncoder() *Encoder { return &Encoder{Transformer: replacementEncoder{}} } func (replacement) ID() (mib identifier.MIB, other string) { return identifier.Replacement, "" } type replacementDecoder struct{ transform.NopResetter } func (replacementDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { if len(dst) < 3 { return 0, 0, transform.ErrShortDst } if atEOF { const fffd = "\ufffd" dst[0] = fffd[0] dst[1] = fffd[1] dst[2] = fffd[2] nDst = 3 } return nDst, len(src), nil } type replacementEncoder struct{ transform.NopResetter } func (replacementEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { r, size := rune(0), 0 for ; nSrc < len(src); nSrc += size { r = rune(src[nSrc]) // Decode a 1-byte rune. if r < utf8.RuneSelf { size = 1 } else { // Decode a multi-byte rune. r, size = utf8.DecodeRune(src[nSrc:]) if size == 1 { // All valid runes of size 1 (those below utf8.RuneSelf) were // handled above. We have invalid UTF-8 or we haven't seen the // full character yet. if !atEOF && !utf8.FullRune(src[nSrc:]) { err = transform.ErrShortSrc break } r = '\ufffd' } } if nDst+utf8.RuneLen(r) > len(dst) { err = transform.ErrShortDst break } nDst += utf8.EncodeRune(dst[nDst:], r) } return nDst, nSrc, err } // HTMLEscapeUnsupported wraps encoders to replace source runes outside the // repertoire of the destination encoding with HTML escape sequences. // // This wrapper exists to comply to URL and HTML forms requiring a // non-terminating legacy encoder. The produced sequences may lead to data // loss as they are indistinguishable from legitimate input. To avoid this // issue, use UTF-8 encodings whenever possible. func HTMLEscapeUnsupported(e *Encoder) *Encoder { return &Encoder{Transformer: &errorHandler{e, errorToHTML}} } // ReplaceUnsupported wraps encoders to replace source runes outside the // repertoire of the destination encoding with an encoding-specific // replacement. // // This wrapper is only provided for backwards compatibility and legacy // handling. Its use is strongly discouraged. Use UTF-8 whenever possible. func ReplaceUnsupported(e *Encoder) *Encoder { return &Encoder{Transformer: &errorHandler{e, errorToReplacement}} } type errorHandler struct { *Encoder handler func(dst []byte, r rune, err repertoireError) (n int, ok bool) } // TODO: consider making this error public in some form. type repertoireError interface { Replacement() byte } func (h errorHandler) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { nDst, nSrc, err = h.Transformer.Transform(dst, src, atEOF) for err != nil { rerr, ok := err.(repertoireError) if !ok { return nDst, nSrc, err } r, sz := utf8.DecodeRune(src[nSrc:]) n, ok := h.handler(dst[nDst:], r, rerr) if !ok { return nDst, nSrc, transform.ErrShortDst } err = nil nDst += n if nSrc += sz; nSrc < len(src) { var dn, sn int dn, sn, err = h.Transformer.Transform(dst[nDst:], src[nSrc:], atEOF) nDst += dn nSrc += sn } } return nDst, nSrc, err } func errorToHTML(dst []byte, r rune, err repertoireError) (n int, ok bool) { buf := [8]byte{} b := strconv.AppendUint(buf[:0], uint64(r), 10) if n = len(b) + len("&#;"); n >= len(dst) { return 0, false } dst[0] = '&' dst[1] = '#' dst[copy(dst[2:], b)+2] = ';' return n, true } func errorToReplacement(dst []byte, r rune, err repertoireError) (n int, ok bool) { if len(dst) == 0 { return 0, false } dst[0] = err.Replacement() return 1, true } // ErrInvalidUTF8 means that a transformer encountered invalid UTF-8. var ErrInvalidUTF8 = errors.New("encoding: invalid UTF-8") // UTF8Validator is a transformer that returns ErrInvalidUTF8 on the first // input byte that is not valid UTF-8. var UTF8Validator transform.Transformer = utf8Validator{} type utf8Validator struct{ transform.NopResetter } func (utf8Validator) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { n := len(src) if n > len(dst) { n = len(dst) } for i := 0; i < n; { if c := src[i]; c < utf8.RuneSelf { dst[i] = c i++ continue } _, size := utf8.DecodeRune(src[i:]) if size == 1 { // All valid runes of size 1 (those below utf8.RuneSelf) were // handled above. We have invalid UTF-8 or we haven't seen the // full character yet. err = ErrInvalidUTF8 if !atEOF && !utf8.FullRune(src[i:]) { err = transform.ErrShortSrc } return i, i, err } if i+size > len(dst) { return i, i, transform.ErrShortDst } for ; size > 0; size-- { dst[i] = src[i] i++ } } if len(src) > len(dst) { err = transform.ErrShortDst } return n, n, err } ================================================ FILE: vendor/golang.org/x/text/encoding/htmlindex/gen.go ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build ignore package main import ( "bytes" "encoding/json" "fmt" "log" "strings" "golang.org/x/text/internal/gen" ) type group struct { Encodings []struct { Labels []string Name string } } func main() { gen.Init() r := gen.Open("https://encoding.spec.whatwg.org", "whatwg", "encodings.json") var groups []group if err := json.NewDecoder(r).Decode(&groups); err != nil { log.Fatalf("Error reading encodings.json: %v", err) } w := &bytes.Buffer{} fmt.Fprintln(w, "type htmlEncoding byte") fmt.Fprintln(w, "const (") for i, g := range groups { for _, e := range g.Encodings { key := strings.ToLower(e.Name) name := consts[key] if name == "" { log.Fatalf("No const defined for %s.", key) } if i == 0 { fmt.Fprintf(w, "%s htmlEncoding = iota\n", name) } else { fmt.Fprintf(w, "%s\n", name) } } } fmt.Fprintln(w, "numEncodings") fmt.Fprint(w, ")\n\n") fmt.Fprintln(w, "var canonical = [numEncodings]string{") for _, g := range groups { for _, e := range g.Encodings { fmt.Fprintf(w, "%q,\n", strings.ToLower(e.Name)) } } fmt.Fprint(w, "}\n\n") fmt.Fprintln(w, "var nameMap = map[string]htmlEncoding{") for _, g := range groups { for _, e := range g.Encodings { for _, l := range e.Labels { key := strings.ToLower(e.Name) name := consts[key] fmt.Fprintf(w, "%q: %s,\n", l, name) } } } fmt.Fprint(w, "}\n\n") var tags []string fmt.Fprintln(w, "var localeMap = []htmlEncoding{") for _, loc := range locales { tags = append(tags, loc.tag) fmt.Fprintf(w, "%s, // %s \n", consts[loc.name], loc.tag) } fmt.Fprint(w, "}\n\n") fmt.Fprintf(w, "const locales = %q\n", strings.Join(tags, " ")) gen.WriteGoFile("tables.go", "htmlindex", w.Bytes()) } // consts maps canonical encoding name to internal constant. var consts = map[string]string{ "utf-8": "utf8", "ibm866": "ibm866", "iso-8859-2": "iso8859_2", "iso-8859-3": "iso8859_3", "iso-8859-4": "iso8859_4", "iso-8859-5": "iso8859_5", "iso-8859-6": "iso8859_6", "iso-8859-7": "iso8859_7", "iso-8859-8": "iso8859_8", "iso-8859-8-i": "iso8859_8I", "iso-8859-10": "iso8859_10", "iso-8859-13": "iso8859_13", "iso-8859-14": "iso8859_14", "iso-8859-15": "iso8859_15", "iso-8859-16": "iso8859_16", "koi8-r": "koi8r", "koi8-u": "koi8u", "macintosh": "macintosh", "windows-874": "windows874", "windows-1250": "windows1250", "windows-1251": "windows1251", "windows-1252": "windows1252", "windows-1253": "windows1253", "windows-1254": "windows1254", "windows-1255": "windows1255", "windows-1256": "windows1256", "windows-1257": "windows1257", "windows-1258": "windows1258", "x-mac-cyrillic": "macintoshCyrillic", "gbk": "gbk", "gb18030": "gb18030", // "hz-gb-2312": "hzgb2312", // Was removed from WhatWG "big5": "big5", "euc-jp": "eucjp", "iso-2022-jp": "iso2022jp", "shift_jis": "shiftJIS", "euc-kr": "euckr", "replacement": "replacement", "utf-16be": "utf16be", "utf-16le": "utf16le", "x-user-defined": "xUserDefined", } // locales is taken from // https://html.spec.whatwg.org/multipage/syntax.html#encoding-sniffing-algorithm. var locales = []struct{ tag, name string }{ {"und", "windows-1252"}, // The default value. {"ar", "windows-1256"}, {"ba", "windows-1251"}, {"be", "windows-1251"}, {"bg", "windows-1251"}, {"cs", "windows-1250"}, {"el", "iso-8859-7"}, {"et", "windows-1257"}, {"fa", "windows-1256"}, {"he", "windows-1255"}, {"hr", "windows-1250"}, {"hu", "iso-8859-2"}, {"ja", "shift_jis"}, {"kk", "windows-1251"}, {"ko", "euc-kr"}, {"ku", "windows-1254"}, {"ky", "windows-1251"}, {"lt", "windows-1257"}, {"lv", "windows-1257"}, {"mk", "windows-1251"}, {"pl", "iso-8859-2"}, {"ru", "windows-1251"}, {"sah", "windows-1251"}, {"sk", "windows-1250"}, {"sl", "iso-8859-2"}, {"sr", "windows-1251"}, {"tg", "windows-1251"}, {"th", "windows-874"}, {"tr", "windows-1254"}, {"tt", "windows-1251"}, {"uk", "windows-1251"}, {"vi", "windows-1258"}, {"zh-hans", "gb18030"}, {"zh-hant", "big5"}, } ================================================ FILE: vendor/golang.org/x/text/encoding/htmlindex/htmlindex.go ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //go:generate go run gen.go // Package htmlindex maps character set encoding names to Encodings as // recommended by the W3C for use in HTML 5. See http://www.w3.org/TR/encoding. package htmlindex // TODO: perhaps have a "bare" version of the index (used by this package) that // is not pre-loaded with all encodings. Global variables in encodings prevent // the linker from being able to purge unneeded tables. This means that // referencing all encodings, as this package does for the default index, links // in all encodings unconditionally. // // This issue can be solved by either solving the linking issue (see // https://github.com/golang/go/issues/6330) or refactoring the encoding tables // (e.g. moving the tables to internal packages that do not use global // variables). // TODO: allow canonicalizing names import ( "errors" "strings" "sync" "golang.org/x/text/encoding" "golang.org/x/text/encoding/internal/identifier" "golang.org/x/text/language" ) var ( errInvalidName = errors.New("htmlindex: invalid encoding name") errUnknown = errors.New("htmlindex: unknown Encoding") errUnsupported = errors.New("htmlindex: this encoding is not supported") ) var ( matcherOnce sync.Once matcher language.Matcher ) // LanguageDefault returns the canonical name of the default encoding for a // given language. func LanguageDefault(tag language.Tag) string { matcherOnce.Do(func() { tags := []language.Tag{} for _, t := range strings.Split(locales, " ") { tags = append(tags, language.MustParse(t)) } matcher = language.NewMatcher(tags) }) _, i, _ := matcher.Match(tag) return canonical[localeMap[i]] // Default is Windows-1252. } // Get returns an Encoding for one of the names listed in // http://www.w3.org/TR/encoding using the Default Index. Matching is case- // insensitive. func Get(name string) (encoding.Encoding, error) { x, ok := nameMap[strings.ToLower(strings.TrimSpace(name))] if !ok { return nil, errInvalidName } return encodings[x], nil } // Name reports the canonical name of the given Encoding. It will return // an error if e is not associated with a supported encoding scheme. func Name(e encoding.Encoding) (string, error) { id, ok := e.(identifier.Interface) if !ok { return "", errUnknown } mib, _ := id.ID() if mib == 0 { return "", errUnknown } v, ok := mibMap[mib] if !ok { return "", errUnsupported } return canonical[v], nil } ================================================ FILE: vendor/golang.org/x/text/encoding/htmlindex/map.go ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package htmlindex import ( "golang.org/x/text/encoding" "golang.org/x/text/encoding/charmap" "golang.org/x/text/encoding/internal/identifier" "golang.org/x/text/encoding/japanese" "golang.org/x/text/encoding/korean" "golang.org/x/text/encoding/simplifiedchinese" "golang.org/x/text/encoding/traditionalchinese" "golang.org/x/text/encoding/unicode" ) // mibMap maps a MIB identifier to an htmlEncoding index. var mibMap = map[identifier.MIB]htmlEncoding{ identifier.UTF8: utf8, identifier.UTF16BE: utf16be, identifier.UTF16LE: utf16le, identifier.IBM866: ibm866, identifier.ISOLatin2: iso8859_2, identifier.ISOLatin3: iso8859_3, identifier.ISOLatin4: iso8859_4, identifier.ISOLatinCyrillic: iso8859_5, identifier.ISOLatinArabic: iso8859_6, identifier.ISOLatinGreek: iso8859_7, identifier.ISOLatinHebrew: iso8859_8, identifier.ISO88598I: iso8859_8I, identifier.ISOLatin6: iso8859_10, identifier.ISO885913: iso8859_13, identifier.ISO885914: iso8859_14, identifier.ISO885915: iso8859_15, identifier.ISO885916: iso8859_16, identifier.KOI8R: koi8r, identifier.KOI8U: koi8u, identifier.Macintosh: macintosh, identifier.MacintoshCyrillic: macintoshCyrillic, identifier.Windows874: windows874, identifier.Windows1250: windows1250, identifier.Windows1251: windows1251, identifier.Windows1252: windows1252, identifier.Windows1253: windows1253, identifier.Windows1254: windows1254, identifier.Windows1255: windows1255, identifier.Windows1256: windows1256, identifier.Windows1257: windows1257, identifier.Windows1258: windows1258, identifier.XUserDefined: xUserDefined, identifier.GBK: gbk, identifier.GB18030: gb18030, identifier.Big5: big5, identifier.EUCPkdFmtJapanese: eucjp, identifier.ISO2022JP: iso2022jp, identifier.ShiftJIS: shiftJIS, identifier.EUCKR: euckr, identifier.Replacement: replacement, } // encodings maps the internal htmlEncoding to an Encoding. // TODO: consider using a reusable index in encoding/internal. var encodings = [numEncodings]encoding.Encoding{ utf8: unicode.UTF8, ibm866: charmap.CodePage866, iso8859_2: charmap.ISO8859_2, iso8859_3: charmap.ISO8859_3, iso8859_4: charmap.ISO8859_4, iso8859_5: charmap.ISO8859_5, iso8859_6: charmap.ISO8859_6, iso8859_7: charmap.ISO8859_7, iso8859_8: charmap.ISO8859_8, iso8859_8I: charmap.ISO8859_8I, iso8859_10: charmap.ISO8859_10, iso8859_13: charmap.ISO8859_13, iso8859_14: charmap.ISO8859_14, iso8859_15: charmap.ISO8859_15, iso8859_16: charmap.ISO8859_16, koi8r: charmap.KOI8R, koi8u: charmap.KOI8U, macintosh: charmap.Macintosh, windows874: charmap.Windows874, windows1250: charmap.Windows1250, windows1251: charmap.Windows1251, windows1252: charmap.Windows1252, windows1253: charmap.Windows1253, windows1254: charmap.Windows1254, windows1255: charmap.Windows1255, windows1256: charmap.Windows1256, windows1257: charmap.Windows1257, windows1258: charmap.Windows1258, macintoshCyrillic: charmap.MacintoshCyrillic, gbk: simplifiedchinese.GBK, gb18030: simplifiedchinese.GB18030, big5: traditionalchinese.Big5, eucjp: japanese.EUCJP, iso2022jp: japanese.ISO2022JP, shiftJIS: japanese.ShiftJIS, euckr: korean.EUCKR, replacement: encoding.Replacement, utf16be: unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM), utf16le: unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM), xUserDefined: charmap.XUserDefined, } ================================================ FILE: vendor/golang.org/x/text/encoding/htmlindex/tables.go ================================================ // This file was generated by go generate; DO NOT EDIT package htmlindex type htmlEncoding byte const ( utf8 htmlEncoding = iota ibm866 iso8859_2 iso8859_3 iso8859_4 iso8859_5 iso8859_6 iso8859_7 iso8859_8 iso8859_8I iso8859_10 iso8859_13 iso8859_14 iso8859_15 iso8859_16 koi8r koi8u macintosh windows874 windows1250 windows1251 windows1252 windows1253 windows1254 windows1255 windows1256 windows1257 windows1258 macintoshCyrillic gbk gb18030 big5 eucjp iso2022jp shiftJIS euckr replacement utf16be utf16le xUserDefined numEncodings ) var canonical = [numEncodings]string{ "utf-8", "ibm866", "iso-8859-2", "iso-8859-3", "iso-8859-4", "iso-8859-5", "iso-8859-6", "iso-8859-7", "iso-8859-8", "iso-8859-8-i", "iso-8859-10", "iso-8859-13", "iso-8859-14", "iso-8859-15", "iso-8859-16", "koi8-r", "koi8-u", "macintosh", "windows-874", "windows-1250", "windows-1251", "windows-1252", "windows-1253", "windows-1254", "windows-1255", "windows-1256", "windows-1257", "windows-1258", "x-mac-cyrillic", "gbk", "gb18030", "big5", "euc-jp", "iso-2022-jp", "shift_jis", "euc-kr", "replacement", "utf-16be", "utf-16le", "x-user-defined", } var nameMap = map[string]htmlEncoding{ "unicode-1-1-utf-8": utf8, "utf-8": utf8, "utf8": utf8, "866": ibm866, "cp866": ibm866, "csibm866": ibm866, "ibm866": ibm866, "csisolatin2": iso8859_2, "iso-8859-2": iso8859_2, "iso-ir-101": iso8859_2, "iso8859-2": iso8859_2, "iso88592": iso8859_2, "iso_8859-2": iso8859_2, "iso_8859-2:1987": iso8859_2, "l2": iso8859_2, "latin2": iso8859_2, "csisolatin3": iso8859_3, "iso-8859-3": iso8859_3, "iso-ir-109": iso8859_3, "iso8859-3": iso8859_3, "iso88593": iso8859_3, "iso_8859-3": iso8859_3, "iso_8859-3:1988": iso8859_3, "l3": iso8859_3, "latin3": iso8859_3, "csisolatin4": iso8859_4, "iso-8859-4": iso8859_4, "iso-ir-110": iso8859_4, "iso8859-4": iso8859_4, "iso88594": iso8859_4, "iso_8859-4": iso8859_4, "iso_8859-4:1988": iso8859_4, "l4": iso8859_4, "latin4": iso8859_4, "csisolatincyrillic": iso8859_5, "cyrillic": iso8859_5, "iso-8859-5": iso8859_5, "iso-ir-144": iso8859_5, "iso8859-5": iso8859_5, "iso88595": iso8859_5, "iso_8859-5": iso8859_5, "iso_8859-5:1988": iso8859_5, "arabic": iso8859_6, "asmo-708": iso8859_6, "csiso88596e": iso8859_6, "csiso88596i": iso8859_6, "csisolatinarabic": iso8859_6, "ecma-114": iso8859_6, "iso-8859-6": iso8859_6, "iso-8859-6-e": iso8859_6, "iso-8859-6-i": iso8859_6, "iso-ir-127": iso8859_6, "iso8859-6": iso8859_6, "iso88596": iso8859_6, "iso_8859-6": iso8859_6, "iso_8859-6:1987": iso8859_6, "csisolatingreek": iso8859_7, "ecma-118": iso8859_7, "elot_928": iso8859_7, "greek": iso8859_7, "greek8": iso8859_7, "iso-8859-7": iso8859_7, "iso-ir-126": iso8859_7, "iso8859-7": iso8859_7, "iso88597": iso8859_7, "iso_8859-7": iso8859_7, "iso_8859-7:1987": iso8859_7, "sun_eu_greek": iso8859_7, "csiso88598e": iso8859_8, "csisolatinhebrew": iso8859_8, "hebrew": iso8859_8, "iso-8859-8": iso8859_8, "iso-8859-8-e": iso8859_8, "iso-ir-138": iso8859_8, "iso8859-8": iso8859_8, "iso88598": iso8859_8, "iso_8859-8": iso8859_8, "iso_8859-8:1988": iso8859_8, "visual": iso8859_8, "csiso88598i": iso8859_8I, "iso-8859-8-i": iso8859_8I, "logical": iso8859_8I, "csisolatin6": iso8859_10, "iso-8859-10": iso8859_10, "iso-ir-157": iso8859_10, "iso8859-10": iso8859_10, "iso885910": iso8859_10, "l6": iso8859_10, "latin6": iso8859_10, "iso-8859-13": iso8859_13, "iso8859-13": iso8859_13, "iso885913": iso8859_13, "iso-8859-14": iso8859_14, "iso8859-14": iso8859_14, "iso885914": iso8859_14, "csisolatin9": iso8859_15, "iso-8859-15": iso8859_15, "iso8859-15": iso8859_15, "iso885915": iso8859_15, "iso_8859-15": iso8859_15, "l9": iso8859_15, "iso-8859-16": iso8859_16, "cskoi8r": koi8r, "koi": koi8r, "koi8": koi8r, "koi8-r": koi8r, "koi8_r": koi8r, "koi8-ru": koi8u, "koi8-u": koi8u, "csmacintosh": macintosh, "mac": macintosh, "macintosh": macintosh, "x-mac-roman": macintosh, "dos-874": windows874, "iso-8859-11": windows874, "iso8859-11": windows874, "iso885911": windows874, "tis-620": windows874, "windows-874": windows874, "cp1250": windows1250, "windows-1250": windows1250, "x-cp1250": windows1250, "cp1251": windows1251, "windows-1251": windows1251, "x-cp1251": windows1251, "ansi_x3.4-1968": windows1252, "ascii": windows1252, "cp1252": windows1252, "cp819": windows1252, "csisolatin1": windows1252, "ibm819": windows1252, "iso-8859-1": windows1252, "iso-ir-100": windows1252, "iso8859-1": windows1252, "iso88591": windows1252, "iso_8859-1": windows1252, "iso_8859-1:1987": windows1252, "l1": windows1252, "latin1": windows1252, "us-ascii": windows1252, "windows-1252": windows1252, "x-cp1252": windows1252, "cp1253": windows1253, "windows-1253": windows1253, "x-cp1253": windows1253, "cp1254": windows1254, "csisolatin5": windows1254, "iso-8859-9": windows1254, "iso-ir-148": windows1254, "iso8859-9": windows1254, "iso88599": windows1254, "iso_8859-9": windows1254, "iso_8859-9:1989": windows1254, "l5": windows1254, "latin5": windows1254, "windows-1254": windows1254, "x-cp1254": windows1254, "cp1255": windows1255, "windows-1255": windows1255, "x-cp1255": windows1255, "cp1256": windows1256, "windows-1256": windows1256, "x-cp1256": windows1256, "cp1257": windows1257, "windows-1257": windows1257, "x-cp1257": windows1257, "cp1258": windows1258, "windows-1258": windows1258, "x-cp1258": windows1258, "x-mac-cyrillic": macintoshCyrillic, "x-mac-ukrainian": macintoshCyrillic, "chinese": gbk, "csgb2312": gbk, "csiso58gb231280": gbk, "gb2312": gbk, "gb_2312": gbk, "gb_2312-80": gbk, "gbk": gbk, "iso-ir-58": gbk, "x-gbk": gbk, "gb18030": gb18030, "big5": big5, "big5-hkscs": big5, "cn-big5": big5, "csbig5": big5, "x-x-big5": big5, "cseucpkdfmtjapanese": eucjp, "euc-jp": eucjp, "x-euc-jp": eucjp, "csiso2022jp": iso2022jp, "iso-2022-jp": iso2022jp, "csshiftjis": shiftJIS, "ms932": shiftJIS, "ms_kanji": shiftJIS, "shift-jis": shiftJIS, "shift_jis": shiftJIS, "sjis": shiftJIS, "windows-31j": shiftJIS, "x-sjis": shiftJIS, "cseuckr": euckr, "csksc56011987": euckr, "euc-kr": euckr, "iso-ir-149": euckr, "korean": euckr, "ks_c_5601-1987": euckr, "ks_c_5601-1989": euckr, "ksc5601": euckr, "ksc_5601": euckr, "windows-949": euckr, "csiso2022kr": replacement, "hz-gb-2312": replacement, "iso-2022-cn": replacement, "iso-2022-cn-ext": replacement, "iso-2022-kr": replacement, "utf-16be": utf16be, "utf-16": utf16le, "utf-16le": utf16le, "x-user-defined": xUserDefined, } var localeMap = []htmlEncoding{ windows1252, // und windows1256, // ar windows1251, // ba windows1251, // be windows1251, // bg windows1250, // cs iso8859_7, // el windows1257, // et windows1256, // fa windows1255, // he windows1250, // hr iso8859_2, // hu shiftJIS, // ja windows1251, // kk euckr, // ko windows1254, // ku windows1251, // ky windows1257, // lt windows1257, // lv windows1251, // mk iso8859_2, // pl windows1251, // ru windows1251, // sah windows1250, // sk iso8859_2, // sl windows1251, // sr windows1251, // tg windows874, // th windows1254, // tr windows1251, // tt windows1251, // uk windows1258, // vi gb18030, // zh-hans big5, // zh-hant } const locales = "und ar ba be bg cs el et fa he hr hu ja kk ko ku ky lt lv mk pl ru sah sk sl sr tg th tr tt uk vi zh-hans zh-hant" ================================================ FILE: vendor/golang.org/x/text/encoding/internal/identifier/gen.go ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build ignore package main import ( "bytes" "encoding/xml" "fmt" "io" "log" "strings" "golang.org/x/text/internal/gen" ) type registry struct { XMLName xml.Name `xml:"registry"` Updated string `xml:"updated"` Registry []struct { ID string `xml:"id,attr"` Record []struct { Name string `xml:"name"` Xref []struct { Type string `xml:"type,attr"` Data string `xml:"data,attr"` } `xml:"xref"` Desc struct { Data string `xml:",innerxml"` // Any []struct { // Data string `xml:",chardata"` // } `xml:",any"` // Data string `xml:",chardata"` } `xml:"description,"` MIB string `xml:"value"` Alias []string `xml:"alias"` MIME string `xml:"preferred_alias"` } `xml:"record"` } `xml:"registry"` } func main() { r := gen.OpenIANAFile("assignments/character-sets/character-sets.xml") reg := ®istry{} if err := xml.NewDecoder(r).Decode(®); err != nil && err != io.EOF { log.Fatalf("Error decoding charset registry: %v", err) } if len(reg.Registry) == 0 || reg.Registry[0].ID != "character-sets-1" { log.Fatalf("Unexpected ID %s", reg.Registry[0].ID) } w := &bytes.Buffer{} fmt.Fprintf(w, "const (\n") for _, rec := range reg.Registry[0].Record { constName := "" for _, a := range rec.Alias { if strings.HasPrefix(a, "cs") && strings.IndexByte(a, '-') == -1 { // Some of the constant definitions have comments in them. Strip those. constName = strings.Title(strings.SplitN(a[2:], "\n", 2)[0]) } } if constName == "" { switch rec.MIB { case "2085": constName = "HZGB2312" // Not listed as alias for some reason. default: log.Fatalf("No cs alias defined for %s.", rec.MIB) } } if rec.MIME != "" { rec.MIME = fmt.Sprintf(" (MIME: %s)", rec.MIME) } fmt.Fprintf(w, "// %s is the MIB identifier with IANA name %s%s.\n//\n", constName, rec.Name, rec.MIME) if len(rec.Desc.Data) > 0 { fmt.Fprint(w, "// ") d := xml.NewDecoder(strings.NewReader(rec.Desc.Data)) inElem := true attr := "" for { t, err := d.Token() if err != nil { if err != io.EOF { log.Fatal(err) } break } switch x := t.(type) { case xml.CharData: attr = "" // Don't need attribute info. a := bytes.Split([]byte(x), []byte("\n")) for i, b := range a { if b = bytes.TrimSpace(b); len(b) != 0 { if !inElem && i > 0 { fmt.Fprint(w, "\n// ") } inElem = false fmt.Fprintf(w, "%s ", string(b)) } } case xml.StartElement: if x.Name.Local == "xref" { inElem = true use := false for _, a := range x.Attr { if a.Name.Local == "type" { use = use || a.Value != "person" } if a.Name.Local == "data" && use { attr = a.Value + " " } } } case xml.EndElement: inElem = false fmt.Fprint(w, attr) } } fmt.Fprint(w, "\n") } for _, x := range rec.Xref { switch x.Type { case "rfc": fmt.Fprintf(w, "// Reference: %s\n", strings.ToUpper(x.Data)) case "uri": fmt.Fprintf(w, "// Reference: %s\n", x.Data) } } fmt.Fprintf(w, "%s MIB = %s\n", constName, rec.MIB) fmt.Fprintln(w) } fmt.Fprintln(w, ")") gen.WriteGoFile("mib.go", "identifier", w.Bytes()) } ================================================ FILE: vendor/golang.org/x/text/encoding/internal/identifier/identifier.go ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //go:generate go run gen.go // Package identifier defines the contract between implementations of Encoding // and Index by defining identifiers that uniquely identify standardized coded // character sets (CCS) and character encoding schemes (CES), which we will // together refer to as encodings, for which Encoding implementations provide // converters to and from UTF-8. This package is typically only of concern to // implementers of Indexes and Encodings. // // One part of the identifier is the MIB code, which is defined by IANA and // uniquely identifies a CCS or CES. Each code is associated with data that // references authorities, official documentation as well as aliases and MIME // names. // // Not all CESs are covered by the IANA registry. The "other" string that is // returned by ID can be used to identify other character sets or versions of // existing ones. // // It is recommended that each package that provides a set of Encodings provide // the All and Common variables to reference all supported encodings and // commonly used subset. This allows Index implementations to include all // available encodings without explicitly referencing or knowing about them. package identifier // Note: this package is internal, but could be made public if there is a need // for writing third-party Indexes and Encodings. // References: // - http://source.icu-project.org/repos/icu/icu/trunk/source/data/mappings/convrtrs.txt // - http://www.iana.org/assignments/character-sets/character-sets.xhtml // - http://www.iana.org/assignments/ianacharset-mib/ianacharset-mib // - http://www.ietf.org/rfc/rfc2978.txt // - http://www.unicode.org/reports/tr22/ // - http://www.w3.org/TR/encoding/ // - https://encoding.spec.whatwg.org/ // - https://encoding.spec.whatwg.org/encodings.json // - https://tools.ietf.org/html/rfc6657#section-5 // Interface can be implemented by Encodings to define the CCS or CES for which // it implements conversions. type Interface interface { // ID returns an encoding identifier. Exactly one of the mib and other // values should be non-zero. // // In the usual case it is only necessary to indicate the MIB code. The // other string can be used to specify encodings for which there is no MIB, // such as "x-mac-dingbat". // // The other string may only contain the characters a-z, A-Z, 0-9, - and _. ID() (mib MIB, other string) // NOTE: the restrictions on the encoding are to allow extending the syntax // with additional information such as versions, vendors and other variants. } // A MIB identifies an encoding. It is derived from the IANA MIB codes and adds // some identifiers for some encodings that are not covered by the IANA // standard. // // See http://www.iana.org/assignments/ianacharset-mib. type MIB uint16 // These additional MIB types are not defined in IANA. They are added because // they are common and defined within the text repo. const ( // Unofficial marks the start of encodings not registered by IANA. Unofficial MIB = 10000 + iota // Replacement is the WhatWG replacement encoding. Replacement // XUserDefined is the code for x-user-defined. XUserDefined // MacintoshCyrillic is the code for x-mac-cyrillic. MacintoshCyrillic ) ================================================ FILE: vendor/golang.org/x/text/encoding/internal/identifier/mib.go ================================================ // This file was generated by go generate; DO NOT EDIT package identifier const ( // ASCII is the MIB identifier with IANA name US-ASCII (MIME: US-ASCII). // // ANSI X3.4-1986 // Reference: RFC2046 ASCII MIB = 3 // ISOLatin1 is the MIB identifier with IANA name ISO_8859-1:1987 (MIME: ISO-8859-1). // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISOLatin1 MIB = 4 // ISOLatin2 is the MIB identifier with IANA name ISO_8859-2:1987 (MIME: ISO-8859-2). // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISOLatin2 MIB = 5 // ISOLatin3 is the MIB identifier with IANA name ISO_8859-3:1988 (MIME: ISO-8859-3). // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISOLatin3 MIB = 6 // ISOLatin4 is the MIB identifier with IANA name ISO_8859-4:1988 (MIME: ISO-8859-4). // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISOLatin4 MIB = 7 // ISOLatinCyrillic is the MIB identifier with IANA name ISO_8859-5:1988 (MIME: ISO-8859-5). // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISOLatinCyrillic MIB = 8 // ISOLatinArabic is the MIB identifier with IANA name ISO_8859-6:1987 (MIME: ISO-8859-6). // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISOLatinArabic MIB = 9 // ISOLatinGreek is the MIB identifier with IANA name ISO_8859-7:1987 (MIME: ISO-8859-7). // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1947 // Reference: RFC1345 ISOLatinGreek MIB = 10 // ISOLatinHebrew is the MIB identifier with IANA name ISO_8859-8:1988 (MIME: ISO-8859-8). // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISOLatinHebrew MIB = 11 // ISOLatin5 is the MIB identifier with IANA name ISO_8859-9:1989 (MIME: ISO-8859-9). // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISOLatin5 MIB = 12 // ISOLatin6 is the MIB identifier with IANA name ISO-8859-10 (MIME: ISO-8859-10). // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISOLatin6 MIB = 13 // ISOTextComm is the MIB identifier with IANA name ISO_6937-2-add. // // ISO-IR: International Register of Escape Sequences and ISO 6937-2:1983 // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISOTextComm MIB = 14 // HalfWidthKatakana is the MIB identifier with IANA name JIS_X0201. // // JIS X 0201-1976. One byte only, this is equivalent to // JIS/Roman (similar to ASCII) plus eight-bit half-width // Katakana // Reference: RFC1345 HalfWidthKatakana MIB = 15 // JISEncoding is the MIB identifier with IANA name JIS_Encoding. // // JIS X 0202-1991. Uses ISO 2022 escape sequences to // shift code sets as documented in JIS X 0202-1991. JISEncoding MIB = 16 // ShiftJIS is the MIB identifier with IANA name Shift_JIS (MIME: Shift_JIS). // // This charset is an extension of csHalfWidthKatakana by // adding graphic characters in JIS X 0208. The CCS's are // JIS X0201:1997 and JIS X0208:1997. The // complete definition is shown in Appendix 1 of JIS // X0208:1997. // This charset can be used for the top-level media type "text". ShiftJIS MIB = 17 // EUCPkdFmtJapanese is the MIB identifier with IANA name Extended_UNIX_Code_Packed_Format_for_Japanese (MIME: EUC-JP). // // Standardized by OSF, UNIX International, and UNIX Systems // Laboratories Pacific. Uses ISO 2022 rules to select // code set 0: US-ASCII (a single 7-bit byte set) // code set 1: JIS X0208-1990 (a double 8-bit byte set) // restricted to A0-FF in both bytes // code set 2: Half Width Katakana (a single 7-bit byte set) // requiring SS2 as the character prefix // code set 3: JIS X0212-1990 (a double 7-bit byte set) // restricted to A0-FF in both bytes // requiring SS3 as the character prefix EUCPkdFmtJapanese MIB = 18 // EUCFixWidJapanese is the MIB identifier with IANA name Extended_UNIX_Code_Fixed_Width_for_Japanese. // // Used in Japan. Each character is 2 octets. // code set 0: US-ASCII (a single 7-bit byte set) // 1st byte = 00 // 2nd byte = 20-7E // code set 1: JIS X0208-1990 (a double 7-bit byte set) // restricted to A0-FF in both bytes // code set 2: Half Width Katakana (a single 7-bit byte set) // 1st byte = 00 // 2nd byte = A0-FF // code set 3: JIS X0212-1990 (a double 7-bit byte set) // restricted to A0-FF in // the first byte // and 21-7E in the second byte EUCFixWidJapanese MIB = 19 // ISO4UnitedKingdom is the MIB identifier with IANA name BS_4730. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO4UnitedKingdom MIB = 20 // ISO11SwedishForNames is the MIB identifier with IANA name SEN_850200_C. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO11SwedishForNames MIB = 21 // ISO15Italian is the MIB identifier with IANA name IT. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO15Italian MIB = 22 // ISO17Spanish is the MIB identifier with IANA name ES. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO17Spanish MIB = 23 // ISO21German is the MIB identifier with IANA name DIN_66003. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO21German MIB = 24 // ISO60Norwegian1 is the MIB identifier with IANA name NS_4551-1. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO60Norwegian1 MIB = 25 // ISO69French is the MIB identifier with IANA name NF_Z_62-010. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO69French MIB = 26 // ISO10646UTF1 is the MIB identifier with IANA name ISO-10646-UTF-1. // // Universal Transfer Format (1), this is the multibyte // encoding, that subsets ASCII-7. It does not have byte // ordering issues. ISO10646UTF1 MIB = 27 // ISO646basic1983 is the MIB identifier with IANA name ISO_646.basic:1983. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO646basic1983 MIB = 28 // INVARIANT is the MIB identifier with IANA name INVARIANT. // // Reference: RFC1345 INVARIANT MIB = 29 // ISO2IntlRefVersion is the MIB identifier with IANA name ISO_646.irv:1983. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO2IntlRefVersion MIB = 30 // NATSSEFI is the MIB identifier with IANA name NATS-SEFI. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 NATSSEFI MIB = 31 // NATSSEFIADD is the MIB identifier with IANA name NATS-SEFI-ADD. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 NATSSEFIADD MIB = 32 // NATSDANO is the MIB identifier with IANA name NATS-DANO. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 NATSDANO MIB = 33 // NATSDANOADD is the MIB identifier with IANA name NATS-DANO-ADD. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 NATSDANOADD MIB = 34 // ISO10Swedish is the MIB identifier with IANA name SEN_850200_B. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO10Swedish MIB = 35 // KSC56011987 is the MIB identifier with IANA name KS_C_5601-1987. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 KSC56011987 MIB = 36 // ISO2022KR is the MIB identifier with IANA name ISO-2022-KR (MIME: ISO-2022-KR). // // rfc1557 (see also KS_C_5601-1987) // Reference: RFC1557 ISO2022KR MIB = 37 // EUCKR is the MIB identifier with IANA name EUC-KR (MIME: EUC-KR). // // rfc1557 (see also KS_C_5861-1992) // Reference: RFC1557 EUCKR MIB = 38 // ISO2022JP is the MIB identifier with IANA name ISO-2022-JP (MIME: ISO-2022-JP). // // rfc1468 (see also rfc2237 ) // Reference: RFC1468 ISO2022JP MIB = 39 // ISO2022JP2 is the MIB identifier with IANA name ISO-2022-JP-2 (MIME: ISO-2022-JP-2). // // rfc1554 // Reference: RFC1554 ISO2022JP2 MIB = 40 // ISO13JISC6220jp is the MIB identifier with IANA name JIS_C6220-1969-jp. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO13JISC6220jp MIB = 41 // ISO14JISC6220ro is the MIB identifier with IANA name JIS_C6220-1969-ro. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO14JISC6220ro MIB = 42 // ISO16Portuguese is the MIB identifier with IANA name PT. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO16Portuguese MIB = 43 // ISO18Greek7Old is the MIB identifier with IANA name greek7-old. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO18Greek7Old MIB = 44 // ISO19LatinGreek is the MIB identifier with IANA name latin-greek. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO19LatinGreek MIB = 45 // ISO25French is the MIB identifier with IANA name NF_Z_62-010_(1973). // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO25French MIB = 46 // ISO27LatinGreek1 is the MIB identifier with IANA name Latin-greek-1. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO27LatinGreek1 MIB = 47 // ISO5427Cyrillic is the MIB identifier with IANA name ISO_5427. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO5427Cyrillic MIB = 48 // ISO42JISC62261978 is the MIB identifier with IANA name JIS_C6226-1978. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO42JISC62261978 MIB = 49 // ISO47BSViewdata is the MIB identifier with IANA name BS_viewdata. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO47BSViewdata MIB = 50 // ISO49INIS is the MIB identifier with IANA name INIS. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO49INIS MIB = 51 // ISO50INIS8 is the MIB identifier with IANA name INIS-8. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO50INIS8 MIB = 52 // ISO51INISCyrillic is the MIB identifier with IANA name INIS-cyrillic. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO51INISCyrillic MIB = 53 // ISO54271981 is the MIB identifier with IANA name ISO_5427:1981. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO54271981 MIB = 54 // ISO5428Greek is the MIB identifier with IANA name ISO_5428:1980. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO5428Greek MIB = 55 // ISO57GB1988 is the MIB identifier with IANA name GB_1988-80. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO57GB1988 MIB = 56 // ISO58GB231280 is the MIB identifier with IANA name GB_2312-80. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO58GB231280 MIB = 57 // ISO61Norwegian2 is the MIB identifier with IANA name NS_4551-2. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO61Norwegian2 MIB = 58 // ISO70VideotexSupp1 is the MIB identifier with IANA name videotex-suppl. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO70VideotexSupp1 MIB = 59 // ISO84Portuguese2 is the MIB identifier with IANA name PT2. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO84Portuguese2 MIB = 60 // ISO85Spanish2 is the MIB identifier with IANA name ES2. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO85Spanish2 MIB = 61 // ISO86Hungarian is the MIB identifier with IANA name MSZ_7795.3. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO86Hungarian MIB = 62 // ISO87JISX0208 is the MIB identifier with IANA name JIS_C6226-1983. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO87JISX0208 MIB = 63 // ISO88Greek7 is the MIB identifier with IANA name greek7. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO88Greek7 MIB = 64 // ISO89ASMO449 is the MIB identifier with IANA name ASMO_449. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO89ASMO449 MIB = 65 // ISO90 is the MIB identifier with IANA name iso-ir-90. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO90 MIB = 66 // ISO91JISC62291984a is the MIB identifier with IANA name JIS_C6229-1984-a. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO91JISC62291984a MIB = 67 // ISO92JISC62991984b is the MIB identifier with IANA name JIS_C6229-1984-b. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO92JISC62991984b MIB = 68 // ISO93JIS62291984badd is the MIB identifier with IANA name JIS_C6229-1984-b-add. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO93JIS62291984badd MIB = 69 // ISO94JIS62291984hand is the MIB identifier with IANA name JIS_C6229-1984-hand. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO94JIS62291984hand MIB = 70 // ISO95JIS62291984handadd is the MIB identifier with IANA name JIS_C6229-1984-hand-add. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO95JIS62291984handadd MIB = 71 // ISO96JISC62291984kana is the MIB identifier with IANA name JIS_C6229-1984-kana. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO96JISC62291984kana MIB = 72 // ISO2033 is the MIB identifier with IANA name ISO_2033-1983. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO2033 MIB = 73 // ISO99NAPLPS is the MIB identifier with IANA name ANSI_X3.110-1983. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO99NAPLPS MIB = 74 // ISO102T617bit is the MIB identifier with IANA name T.61-7bit. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO102T617bit MIB = 75 // ISO103T618bit is the MIB identifier with IANA name T.61-8bit. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO103T618bit MIB = 76 // ISO111ECMACyrillic is the MIB identifier with IANA name ECMA-cyrillic. // // ISO registry // (formerly ECMA // registry ) ISO111ECMACyrillic MIB = 77 // ISO121Canadian1 is the MIB identifier with IANA name CSA_Z243.4-1985-1. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO121Canadian1 MIB = 78 // ISO122Canadian2 is the MIB identifier with IANA name CSA_Z243.4-1985-2. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO122Canadian2 MIB = 79 // ISO123CSAZ24341985gr is the MIB identifier with IANA name CSA_Z243.4-1985-gr. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO123CSAZ24341985gr MIB = 80 // ISO88596E is the MIB identifier with IANA name ISO_8859-6-E (MIME: ISO-8859-6-E). // // rfc1556 // Reference: RFC1556 ISO88596E MIB = 81 // ISO88596I is the MIB identifier with IANA name ISO_8859-6-I (MIME: ISO-8859-6-I). // // rfc1556 // Reference: RFC1556 ISO88596I MIB = 82 // ISO128T101G2 is the MIB identifier with IANA name T.101-G2. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO128T101G2 MIB = 83 // ISO88598E is the MIB identifier with IANA name ISO_8859-8-E (MIME: ISO-8859-8-E). // // rfc1556 // Reference: RFC1556 ISO88598E MIB = 84 // ISO88598I is the MIB identifier with IANA name ISO_8859-8-I (MIME: ISO-8859-8-I). // // rfc1556 // Reference: RFC1556 ISO88598I MIB = 85 // ISO139CSN369103 is the MIB identifier with IANA name CSN_369103. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO139CSN369103 MIB = 86 // ISO141JUSIB1002 is the MIB identifier with IANA name JUS_I.B1.002. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO141JUSIB1002 MIB = 87 // ISO143IECP271 is the MIB identifier with IANA name IEC_P27-1. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO143IECP271 MIB = 88 // ISO146Serbian is the MIB identifier with IANA name JUS_I.B1.003-serb. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO146Serbian MIB = 89 // ISO147Macedonian is the MIB identifier with IANA name JUS_I.B1.003-mac. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO147Macedonian MIB = 90 // ISO150GreekCCITT is the MIB identifier with IANA name greek-ccitt. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO150GreekCCITT MIB = 91 // ISO151Cuba is the MIB identifier with IANA name NC_NC00-10:81. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO151Cuba MIB = 92 // ISO6937Add is the MIB identifier with IANA name ISO_6937-2-25. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO6937Add MIB = 93 // ISO153GOST1976874 is the MIB identifier with IANA name GOST_19768-74. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO153GOST1976874 MIB = 94 // ISO8859Supp is the MIB identifier with IANA name ISO_8859-supp. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO8859Supp MIB = 95 // ISO10367Box is the MIB identifier with IANA name ISO_10367-box. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO10367Box MIB = 96 // ISO158Lap is the MIB identifier with IANA name latin-lap. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO158Lap MIB = 97 // ISO159JISX02121990 is the MIB identifier with IANA name JIS_X0212-1990. // // ISO-IR: International Register of Escape Sequences // Note: The current registration authority is IPSJ/ITSCJ, Japan. // Reference: RFC1345 ISO159JISX02121990 MIB = 98 // ISO646Danish is the MIB identifier with IANA name DS_2089. // // Danish Standard, DS 2089, February 1974 // Reference: RFC1345 ISO646Danish MIB = 99 // USDK is the MIB identifier with IANA name us-dk. // // Reference: RFC1345 USDK MIB = 100 // DKUS is the MIB identifier with IANA name dk-us. // // Reference: RFC1345 DKUS MIB = 101 // KSC5636 is the MIB identifier with IANA name KSC5636. // // Reference: RFC1345 KSC5636 MIB = 102 // Unicode11UTF7 is the MIB identifier with IANA name UNICODE-1-1-UTF-7. // // rfc1642 // Reference: RFC1642 Unicode11UTF7 MIB = 103 // ISO2022CN is the MIB identifier with IANA name ISO-2022-CN. // // rfc1922 // Reference: RFC1922 ISO2022CN MIB = 104 // ISO2022CNEXT is the MIB identifier with IANA name ISO-2022-CN-EXT. // // rfc1922 // Reference: RFC1922 ISO2022CNEXT MIB = 105 // UTF8 is the MIB identifier with IANA name UTF-8. // // rfc3629 // Reference: RFC3629 UTF8 MIB = 106 // ISO885913 is the MIB identifier with IANA name ISO-8859-13. // // ISO See http://www.iana.org/assignments/charset-reg/ISO-8859-13 http://www.iana.org/assignments/charset-reg/ISO-8859-13 ISO885913 MIB = 109 // ISO885914 is the MIB identifier with IANA name ISO-8859-14. // // ISO See http://www.iana.org/assignments/charset-reg/ISO-8859-14 ISO885914 MIB = 110 // ISO885915 is the MIB identifier with IANA name ISO-8859-15. // // ISO // Please see: http://www.iana.org/assignments/charset-reg/ISO-8859-15 ISO885915 MIB = 111 // ISO885916 is the MIB identifier with IANA name ISO-8859-16. // // ISO ISO885916 MIB = 112 // GBK is the MIB identifier with IANA name GBK. // // Chinese IT Standardization Technical Committee // Please see: http://www.iana.org/assignments/charset-reg/GBK GBK MIB = 113 // GB18030 is the MIB identifier with IANA name GB18030. // // Chinese IT Standardization Technical Committee // Please see: http://www.iana.org/assignments/charset-reg/GB18030 GB18030 MIB = 114 // OSDEBCDICDF0415 is the MIB identifier with IANA name OSD_EBCDIC_DF04_15. // // Fujitsu-Siemens standard mainframe EBCDIC encoding // Please see: http://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF04-15 OSDEBCDICDF0415 MIB = 115 // OSDEBCDICDF03IRV is the MIB identifier with IANA name OSD_EBCDIC_DF03_IRV. // // Fujitsu-Siemens standard mainframe EBCDIC encoding // Please see: http://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF03-IRV OSDEBCDICDF03IRV MIB = 116 // OSDEBCDICDF041 is the MIB identifier with IANA name OSD_EBCDIC_DF04_1. // // Fujitsu-Siemens standard mainframe EBCDIC encoding // Please see: http://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF04-1 OSDEBCDICDF041 MIB = 117 // ISO115481 is the MIB identifier with IANA name ISO-11548-1. // // See http://www.iana.org/assignments/charset-reg/ISO-11548-1 ISO115481 MIB = 118 // KZ1048 is the MIB identifier with IANA name KZ-1048. // // See http://www.iana.org/assignments/charset-reg/KZ-1048 KZ1048 MIB = 119 // Unicode is the MIB identifier with IANA name ISO-10646-UCS-2. // // the 2-octet Basic Multilingual Plane, aka Unicode // this needs to specify network byte order: the standard // does not specify (it is a 16-bit integer space) Unicode MIB = 1000 // UCS4 is the MIB identifier with IANA name ISO-10646-UCS-4. // // the full code space. (same comment about byte order, // these are 31-bit numbers. UCS4 MIB = 1001 // UnicodeASCII is the MIB identifier with IANA name ISO-10646-UCS-Basic. // // ASCII subset of Unicode. Basic Latin = collection 1 // See ISO 10646, Appendix A UnicodeASCII MIB = 1002 // UnicodeLatin1 is the MIB identifier with IANA name ISO-10646-Unicode-Latin1. // // ISO Latin-1 subset of Unicode. Basic Latin and Latin-1 // Supplement = collections 1 and 2. See ISO 10646, // Appendix A. See rfc1815 . UnicodeLatin1 MIB = 1003 // UnicodeJapanese is the MIB identifier with IANA name ISO-10646-J-1. // // ISO 10646 Japanese, see rfc1815 . UnicodeJapanese MIB = 1004 // UnicodeIBM1261 is the MIB identifier with IANA name ISO-Unicode-IBM-1261. // // IBM Latin-2, -3, -5, Extended Presentation Set, GCSGID: 1261 UnicodeIBM1261 MIB = 1005 // UnicodeIBM1268 is the MIB identifier with IANA name ISO-Unicode-IBM-1268. // // IBM Latin-4 Extended Presentation Set, GCSGID: 1268 UnicodeIBM1268 MIB = 1006 // UnicodeIBM1276 is the MIB identifier with IANA name ISO-Unicode-IBM-1276. // // IBM Cyrillic Greek Extended Presentation Set, GCSGID: 1276 UnicodeIBM1276 MIB = 1007 // UnicodeIBM1264 is the MIB identifier with IANA name ISO-Unicode-IBM-1264. // // IBM Arabic Presentation Set, GCSGID: 1264 UnicodeIBM1264 MIB = 1008 // UnicodeIBM1265 is the MIB identifier with IANA name ISO-Unicode-IBM-1265. // // IBM Hebrew Presentation Set, GCSGID: 1265 UnicodeIBM1265 MIB = 1009 // Unicode11 is the MIB identifier with IANA name UNICODE-1-1. // // rfc1641 // Reference: RFC1641 Unicode11 MIB = 1010 // SCSU is the MIB identifier with IANA name SCSU. // // SCSU See http://www.iana.org/assignments/charset-reg/SCSU SCSU MIB = 1011 // UTF7 is the MIB identifier with IANA name UTF-7. // // rfc2152 // Reference: RFC2152 UTF7 MIB = 1012 // UTF16BE is the MIB identifier with IANA name UTF-16BE. // // rfc2781 // Reference: RFC2781 UTF16BE MIB = 1013 // UTF16LE is the MIB identifier with IANA name UTF-16LE. // // rfc2781 // Reference: RFC2781 UTF16LE MIB = 1014 // UTF16 is the MIB identifier with IANA name UTF-16. // // rfc2781 // Reference: RFC2781 UTF16 MIB = 1015 // CESU8 is the MIB identifier with IANA name CESU-8. // // http://www.unicode.org/unicode/reports/tr26 CESU8 MIB = 1016 // UTF32 is the MIB identifier with IANA name UTF-32. // // http://www.unicode.org/unicode/reports/tr19/ UTF32 MIB = 1017 // UTF32BE is the MIB identifier with IANA name UTF-32BE. // // http://www.unicode.org/unicode/reports/tr19/ UTF32BE MIB = 1018 // UTF32LE is the MIB identifier with IANA name UTF-32LE. // // http://www.unicode.org/unicode/reports/tr19/ UTF32LE MIB = 1019 // BOCU1 is the MIB identifier with IANA name BOCU-1. // // http://www.unicode.org/notes/tn6/ BOCU1 MIB = 1020 // Windows30Latin1 is the MIB identifier with IANA name ISO-8859-1-Windows-3.0-Latin-1. // // Extended ISO 8859-1 Latin-1 for Windows 3.0. // PCL Symbol Set id: 9U Windows30Latin1 MIB = 2000 // Windows31Latin1 is the MIB identifier with IANA name ISO-8859-1-Windows-3.1-Latin-1. // // Extended ISO 8859-1 Latin-1 for Windows 3.1. // PCL Symbol Set id: 19U Windows31Latin1 MIB = 2001 // Windows31Latin2 is the MIB identifier with IANA name ISO-8859-2-Windows-Latin-2. // // Extended ISO 8859-2. Latin-2 for Windows 3.1. // PCL Symbol Set id: 9E Windows31Latin2 MIB = 2002 // Windows31Latin5 is the MIB identifier with IANA name ISO-8859-9-Windows-Latin-5. // // Extended ISO 8859-9. Latin-5 for Windows 3.1 // PCL Symbol Set id: 5T Windows31Latin5 MIB = 2003 // HPRoman8 is the MIB identifier with IANA name hp-roman8. // // LaserJet IIP Printer User's Manual, // HP part no 33471-90901, Hewlet-Packard, June 1989. // Reference: RFC1345 HPRoman8 MIB = 2004 // AdobeStandardEncoding is the MIB identifier with IANA name Adobe-Standard-Encoding. // // PostScript Language Reference Manual // PCL Symbol Set id: 10J AdobeStandardEncoding MIB = 2005 // VenturaUS is the MIB identifier with IANA name Ventura-US. // // Ventura US. ASCII plus characters typically used in // publishing, like pilcrow, copyright, registered, trade mark, // section, dagger, and double dagger in the range A0 (hex) // to FF (hex). // PCL Symbol Set id: 14J VenturaUS MIB = 2006 // VenturaInternational is the MIB identifier with IANA name Ventura-International. // // Ventura International. ASCII plus coded characters similar // to Roman8. // PCL Symbol Set id: 13J VenturaInternational MIB = 2007 // DECMCS is the MIB identifier with IANA name DEC-MCS. // // VAX/VMS User's Manual, // Order Number: AI-Y517A-TE, April 1986. // Reference: RFC1345 DECMCS MIB = 2008 // PC850Multilingual is the MIB identifier with IANA name IBM850. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 PC850Multilingual MIB = 2009 // PC8DanishNorwegian is the MIB identifier with IANA name PC8-Danish-Norwegian. // // PC Danish Norwegian // 8-bit PC set for Danish Norwegian // PCL Symbol Set id: 11U PC8DanishNorwegian MIB = 2012 // PC862LatinHebrew is the MIB identifier with IANA name IBM862. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 PC862LatinHebrew MIB = 2013 // PC8Turkish is the MIB identifier with IANA name PC8-Turkish. // // PC Latin Turkish. PCL Symbol Set id: 9T PC8Turkish MIB = 2014 // IBMSymbols is the MIB identifier with IANA name IBM-Symbols. // // Presentation Set, CPGID: 259 IBMSymbols MIB = 2015 // IBMThai is the MIB identifier with IANA name IBM-Thai. // // Presentation Set, CPGID: 838 IBMThai MIB = 2016 // HPLegal is the MIB identifier with IANA name HP-Legal. // // PCL 5 Comparison Guide, Hewlett-Packard, // HP part number 5961-0510, October 1992 // PCL Symbol Set id: 1U HPLegal MIB = 2017 // HPPiFont is the MIB identifier with IANA name HP-Pi-font. // // PCL 5 Comparison Guide, Hewlett-Packard, // HP part number 5961-0510, October 1992 // PCL Symbol Set id: 15U HPPiFont MIB = 2018 // HPMath8 is the MIB identifier with IANA name HP-Math8. // // PCL 5 Comparison Guide, Hewlett-Packard, // HP part number 5961-0510, October 1992 // PCL Symbol Set id: 8M HPMath8 MIB = 2019 // HPPSMath is the MIB identifier with IANA name Adobe-Symbol-Encoding. // // PostScript Language Reference Manual // PCL Symbol Set id: 5M HPPSMath MIB = 2020 // HPDesktop is the MIB identifier with IANA name HP-DeskTop. // // PCL 5 Comparison Guide, Hewlett-Packard, // HP part number 5961-0510, October 1992 // PCL Symbol Set id: 7J HPDesktop MIB = 2021 // VenturaMath is the MIB identifier with IANA name Ventura-Math. // // PCL 5 Comparison Guide, Hewlett-Packard, // HP part number 5961-0510, October 1992 // PCL Symbol Set id: 6M VenturaMath MIB = 2022 // MicrosoftPublishing is the MIB identifier with IANA name Microsoft-Publishing. // // PCL 5 Comparison Guide, Hewlett-Packard, // HP part number 5961-0510, October 1992 // PCL Symbol Set id: 6J MicrosoftPublishing MIB = 2023 // Windows31J is the MIB identifier with IANA name Windows-31J. // // Windows Japanese. A further extension of Shift_JIS // to include NEC special characters (Row 13), NEC // selection of IBM extensions (Rows 89 to 92), and IBM // extensions (Rows 115 to 119). The CCS's are // JIS X0201:1997, JIS X0208:1997, and these extensions. // This charset can be used for the top-level media type "text", // but it is of limited or specialized use (see rfc2278 ). // PCL Symbol Set id: 19K Windows31J MIB = 2024 // GB2312 is the MIB identifier with IANA name GB2312 (MIME: GB2312). // // Chinese for People's Republic of China (PRC) mixed one byte, // two byte set: // 20-7E = one byte ASCII // A1-FE = two byte PRC Kanji // See GB 2312-80 // PCL Symbol Set Id: 18C GB2312 MIB = 2025 // Big5 is the MIB identifier with IANA name Big5 (MIME: Big5). // // Chinese for Taiwan Multi-byte set. // PCL Symbol Set Id: 18T Big5 MIB = 2026 // Macintosh is the MIB identifier with IANA name macintosh. // // The Unicode Standard ver1.0, ISBN 0-201-56788-1, Oct 1991 // Reference: RFC1345 Macintosh MIB = 2027 // IBM037 is the MIB identifier with IANA name IBM037. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 IBM037 MIB = 2028 // IBM038 is the MIB identifier with IANA name IBM038. // // IBM 3174 Character Set Ref, GA27-3831-02, March 1990 // Reference: RFC1345 IBM038 MIB = 2029 // IBM273 is the MIB identifier with IANA name IBM273. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 IBM273 MIB = 2030 // IBM274 is the MIB identifier with IANA name IBM274. // // IBM 3174 Character Set Ref, GA27-3831-02, March 1990 // Reference: RFC1345 IBM274 MIB = 2031 // IBM275 is the MIB identifier with IANA name IBM275. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 IBM275 MIB = 2032 // IBM277 is the MIB identifier with IANA name IBM277. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 IBM277 MIB = 2033 // IBM278 is the MIB identifier with IANA name IBM278. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 IBM278 MIB = 2034 // IBM280 is the MIB identifier with IANA name IBM280. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 IBM280 MIB = 2035 // IBM281 is the MIB identifier with IANA name IBM281. // // IBM 3174 Character Set Ref, GA27-3831-02, March 1990 // Reference: RFC1345 IBM281 MIB = 2036 // IBM284 is the MIB identifier with IANA name IBM284. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 IBM284 MIB = 2037 // IBM285 is the MIB identifier with IANA name IBM285. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 IBM285 MIB = 2038 // IBM290 is the MIB identifier with IANA name IBM290. // // IBM 3174 Character Set Ref, GA27-3831-02, March 1990 // Reference: RFC1345 IBM290 MIB = 2039 // IBM297 is the MIB identifier with IANA name IBM297. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 IBM297 MIB = 2040 // IBM420 is the MIB identifier with IANA name IBM420. // // IBM NLS RM Vol2 SE09-8002-01, March 1990, // IBM NLS RM p 11-11 // Reference: RFC1345 IBM420 MIB = 2041 // IBM423 is the MIB identifier with IANA name IBM423. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 IBM423 MIB = 2042 // IBM424 is the MIB identifier with IANA name IBM424. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 IBM424 MIB = 2043 // PC8CodePage437 is the MIB identifier with IANA name IBM437. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 PC8CodePage437 MIB = 2011 // IBM500 is the MIB identifier with IANA name IBM500. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 IBM500 MIB = 2044 // IBM851 is the MIB identifier with IANA name IBM851. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 IBM851 MIB = 2045 // PCp852 is the MIB identifier with IANA name IBM852. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 PCp852 MIB = 2010 // IBM855 is the MIB identifier with IANA name IBM855. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 IBM855 MIB = 2046 // IBM857 is the MIB identifier with IANA name IBM857. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 IBM857 MIB = 2047 // IBM860 is the MIB identifier with IANA name IBM860. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 IBM860 MIB = 2048 // IBM861 is the MIB identifier with IANA name IBM861. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 IBM861 MIB = 2049 // IBM863 is the MIB identifier with IANA name IBM863. // // IBM Keyboard layouts and code pages, PN 07G4586 June 1991 // Reference: RFC1345 IBM863 MIB = 2050 // IBM864 is the MIB identifier with IANA name IBM864. // // IBM Keyboard layouts and code pages, PN 07G4586 June 1991 // Reference: RFC1345 IBM864 MIB = 2051 // IBM865 is the MIB identifier with IANA name IBM865. // // IBM DOS 3.3 Ref (Abridged), 94X9575 (Feb 1987) // Reference: RFC1345 IBM865 MIB = 2052 // IBM868 is the MIB identifier with IANA name IBM868. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 IBM868 MIB = 2053 // IBM869 is the MIB identifier with IANA name IBM869. // // IBM Keyboard layouts and code pages, PN 07G4586 June 1991 // Reference: RFC1345 IBM869 MIB = 2054 // IBM870 is the MIB identifier with IANA name IBM870. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 IBM870 MIB = 2055 // IBM871 is the MIB identifier with IANA name IBM871. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 IBM871 MIB = 2056 // IBM880 is the MIB identifier with IANA name IBM880. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 IBM880 MIB = 2057 // IBM891 is the MIB identifier with IANA name IBM891. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 IBM891 MIB = 2058 // IBM903 is the MIB identifier with IANA name IBM903. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 IBM903 MIB = 2059 // IBBM904 is the MIB identifier with IANA name IBM904. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 IBBM904 MIB = 2060 // IBM905 is the MIB identifier with IANA name IBM905. // // IBM 3174 Character Set Ref, GA27-3831-02, March 1990 // Reference: RFC1345 IBM905 MIB = 2061 // IBM918 is the MIB identifier with IANA name IBM918. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 IBM918 MIB = 2062 // IBM1026 is the MIB identifier with IANA name IBM1026. // // IBM NLS RM Vol2 SE09-8002-01, March 1990 // Reference: RFC1345 IBM1026 MIB = 2063 // IBMEBCDICATDE is the MIB identifier with IANA name EBCDIC-AT-DE. // // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 // Reference: RFC1345 IBMEBCDICATDE MIB = 2064 // EBCDICATDEA is the MIB identifier with IANA name EBCDIC-AT-DE-A. // // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 // Reference: RFC1345 EBCDICATDEA MIB = 2065 // EBCDICCAFR is the MIB identifier with IANA name EBCDIC-CA-FR. // // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 // Reference: RFC1345 EBCDICCAFR MIB = 2066 // EBCDICDKNO is the MIB identifier with IANA name EBCDIC-DK-NO. // // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 // Reference: RFC1345 EBCDICDKNO MIB = 2067 // EBCDICDKNOA is the MIB identifier with IANA name EBCDIC-DK-NO-A. // // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 // Reference: RFC1345 EBCDICDKNOA MIB = 2068 // EBCDICFISE is the MIB identifier with IANA name EBCDIC-FI-SE. // // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 // Reference: RFC1345 EBCDICFISE MIB = 2069 // EBCDICFISEA is the MIB identifier with IANA name EBCDIC-FI-SE-A. // // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 // Reference: RFC1345 EBCDICFISEA MIB = 2070 // EBCDICFR is the MIB identifier with IANA name EBCDIC-FR. // // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 // Reference: RFC1345 EBCDICFR MIB = 2071 // EBCDICIT is the MIB identifier with IANA name EBCDIC-IT. // // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 // Reference: RFC1345 EBCDICIT MIB = 2072 // EBCDICPT is the MIB identifier with IANA name EBCDIC-PT. // // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 // Reference: RFC1345 EBCDICPT MIB = 2073 // EBCDICES is the MIB identifier with IANA name EBCDIC-ES. // // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 // Reference: RFC1345 EBCDICES MIB = 2074 // EBCDICESA is the MIB identifier with IANA name EBCDIC-ES-A. // // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 // Reference: RFC1345 EBCDICESA MIB = 2075 // EBCDICESS is the MIB identifier with IANA name EBCDIC-ES-S. // // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 // Reference: RFC1345 EBCDICESS MIB = 2076 // EBCDICUK is the MIB identifier with IANA name EBCDIC-UK. // // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 // Reference: RFC1345 EBCDICUK MIB = 2077 // EBCDICUS is the MIB identifier with IANA name EBCDIC-US. // // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 // Reference: RFC1345 EBCDICUS MIB = 2078 // Unknown8BiT is the MIB identifier with IANA name UNKNOWN-8BIT. // // Reference: RFC1428 Unknown8BiT MIB = 2079 // Mnemonic is the MIB identifier with IANA name MNEMONIC. // // rfc1345 , also known as "mnemonic+ascii+38" // Reference: RFC1345 Mnemonic MIB = 2080 // Mnem is the MIB identifier with IANA name MNEM. // // rfc1345 , also known as "mnemonic+ascii+8200" // Reference: RFC1345 Mnem MIB = 2081 // VISCII is the MIB identifier with IANA name VISCII. // // rfc1456 // Reference: RFC1456 VISCII MIB = 2082 // VIQR is the MIB identifier with IANA name VIQR. // // rfc1456 // Reference: RFC1456 VIQR MIB = 2083 // KOI8R is the MIB identifier with IANA name KOI8-R (MIME: KOI8-R). // // rfc1489 , based on GOST-19768-74, ISO-6937/8, // INIS-Cyrillic, ISO-5427. // Reference: RFC1489 KOI8R MIB = 2084 // HZGB2312 is the MIB identifier with IANA name HZ-GB-2312. // // rfc1842 , rfc1843 rfc1843 rfc1842 HZGB2312 MIB = 2085 // IBM866 is the MIB identifier with IANA name IBM866. // // IBM NLDG Volume 2 (SE09-8002-03) August 1994 IBM866 MIB = 2086 // PC775Baltic is the MIB identifier with IANA name IBM775. // // HP PCL 5 Comparison Guide (P/N 5021-0329) pp B-13, 1996 PC775Baltic MIB = 2087 // KOI8U is the MIB identifier with IANA name KOI8-U. // // rfc2319 // Reference: RFC2319 KOI8U MIB = 2088 // IBM00858 is the MIB identifier with IANA name IBM00858. // // IBM See http://www.iana.org/assignments/charset-reg/IBM00858 IBM00858 MIB = 2089 // IBM00924 is the MIB identifier with IANA name IBM00924. // // IBM See http://www.iana.org/assignments/charset-reg/IBM00924 IBM00924 MIB = 2090 // IBM01140 is the MIB identifier with IANA name IBM01140. // // IBM See http://www.iana.org/assignments/charset-reg/IBM01140 IBM01140 MIB = 2091 // IBM01141 is the MIB identifier with IANA name IBM01141. // // IBM See http://www.iana.org/assignments/charset-reg/IBM01141 IBM01141 MIB = 2092 // IBM01142 is the MIB identifier with IANA name IBM01142. // // IBM See http://www.iana.org/assignments/charset-reg/IBM01142 IBM01142 MIB = 2093 // IBM01143 is the MIB identifier with IANA name IBM01143. // // IBM See http://www.iana.org/assignments/charset-reg/IBM01143 IBM01143 MIB = 2094 // IBM01144 is the MIB identifier with IANA name IBM01144. // // IBM See http://www.iana.org/assignments/charset-reg/IBM01144 IBM01144 MIB = 2095 // IBM01145 is the MIB identifier with IANA name IBM01145. // // IBM See http://www.iana.org/assignments/charset-reg/IBM01145 IBM01145 MIB = 2096 // IBM01146 is the MIB identifier with IANA name IBM01146. // // IBM See http://www.iana.org/assignments/charset-reg/IBM01146 IBM01146 MIB = 2097 // IBM01147 is the MIB identifier with IANA name IBM01147. // // IBM See http://www.iana.org/assignments/charset-reg/IBM01147 IBM01147 MIB = 2098 // IBM01148 is the MIB identifier with IANA name IBM01148. // // IBM See http://www.iana.org/assignments/charset-reg/IBM01148 IBM01148 MIB = 2099 // IBM01149 is the MIB identifier with IANA name IBM01149. // // IBM See http://www.iana.org/assignments/charset-reg/IBM01149 IBM01149 MIB = 2100 // Big5HKSCS is the MIB identifier with IANA name Big5-HKSCS. // // See http://www.iana.org/assignments/charset-reg/Big5-HKSCS Big5HKSCS MIB = 2101 // IBM1047 is the MIB identifier with IANA name IBM1047. // // IBM1047 (EBCDIC Latin 1/Open Systems) http://www-1.ibm.com/servers/eserver/iseries/software/globalization/pdf/cp01047z.pdf IBM1047 MIB = 2102 // PTCP154 is the MIB identifier with IANA name PTCP154. // // See http://www.iana.org/assignments/charset-reg/PTCP154 PTCP154 MIB = 2103 // Amiga1251 is the MIB identifier with IANA name Amiga-1251. // // See http://www.amiga.ultranet.ru/Amiga-1251.html Amiga1251 MIB = 2104 // KOI7switched is the MIB identifier with IANA name KOI7-switched. // // See http://www.iana.org/assignments/charset-reg/KOI7-switched KOI7switched MIB = 2105 // BRF is the MIB identifier with IANA name BRF. // // See http://www.iana.org/assignments/charset-reg/BRF BRF MIB = 2106 // TSCII is the MIB identifier with IANA name TSCII. // // See http://www.iana.org/assignments/charset-reg/TSCII TSCII MIB = 2107 // CP51932 is the MIB identifier with IANA name CP51932. // // See http://www.iana.org/assignments/charset-reg/CP51932 CP51932 MIB = 2108 // Windows874 is the MIB identifier with IANA name windows-874. // // See http://www.iana.org/assignments/charset-reg/windows-874 Windows874 MIB = 2109 // Windows1250 is the MIB identifier with IANA name windows-1250. // // Microsoft http://www.iana.org/assignments/charset-reg/windows-1250 Windows1250 MIB = 2250 // Windows1251 is the MIB identifier with IANA name windows-1251. // // Microsoft http://www.iana.org/assignments/charset-reg/windows-1251 Windows1251 MIB = 2251 // Windows1252 is the MIB identifier with IANA name windows-1252. // // Microsoft http://www.iana.org/assignments/charset-reg/windows-1252 Windows1252 MIB = 2252 // Windows1253 is the MIB identifier with IANA name windows-1253. // // Microsoft http://www.iana.org/assignments/charset-reg/windows-1253 Windows1253 MIB = 2253 // Windows1254 is the MIB identifier with IANA name windows-1254. // // Microsoft http://www.iana.org/assignments/charset-reg/windows-1254 Windows1254 MIB = 2254 // Windows1255 is the MIB identifier with IANA name windows-1255. // // Microsoft http://www.iana.org/assignments/charset-reg/windows-1255 Windows1255 MIB = 2255 // Windows1256 is the MIB identifier with IANA name windows-1256. // // Microsoft http://www.iana.org/assignments/charset-reg/windows-1256 Windows1256 MIB = 2256 // Windows1257 is the MIB identifier with IANA name windows-1257. // // Microsoft http://www.iana.org/assignments/charset-reg/windows-1257 Windows1257 MIB = 2257 // Windows1258 is the MIB identifier with IANA name windows-1258. // // Microsoft http://www.iana.org/assignments/charset-reg/windows-1258 Windows1258 MIB = 2258 // TIS620 is the MIB identifier with IANA name TIS-620. // // Thai Industrial Standards Institute (TISI) TIS620 MIB = 2259 // CP50220 is the MIB identifier with IANA name CP50220. // // See http://www.iana.org/assignments/charset-reg/CP50220 CP50220 MIB = 2260 ) ================================================ FILE: vendor/golang.org/x/text/encoding/internal/internal.go ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package internal contains code that is shared among encoding implementations. package internal import ( "golang.org/x/text/encoding" "golang.org/x/text/encoding/internal/identifier" "golang.org/x/text/transform" ) // Encoding is an implementation of the Encoding interface that adds the String // and ID methods to an existing encoding. type Encoding struct { encoding.Encoding Name string MIB identifier.MIB } // _ verifies that Encoding implements identifier.Interface. var _ identifier.Interface = (*Encoding)(nil) func (e *Encoding) String() string { return e.Name } func (e *Encoding) ID() (mib identifier.MIB, other string) { return e.MIB, "" } // SimpleEncoding is an Encoding that combines two Transformers. type SimpleEncoding struct { Decoder transform.Transformer Encoder transform.Transformer } func (e *SimpleEncoding) NewDecoder() *encoding.Decoder { return &encoding.Decoder{Transformer: e.Decoder} } func (e *SimpleEncoding) NewEncoder() *encoding.Encoder { return &encoding.Encoder{Transformer: e.Encoder} } // FuncEncoding is an Encoding that combines two functions returning a new // Transformer. type FuncEncoding struct { Decoder func() transform.Transformer Encoder func() transform.Transformer } func (e FuncEncoding) NewDecoder() *encoding.Decoder { return &encoding.Decoder{Transformer: e.Decoder()} } func (e FuncEncoding) NewEncoder() *encoding.Encoder { return &encoding.Encoder{Transformer: e.Encoder()} } // A RepertoireError indicates a rune is not in the repertoire of a destination // encoding. It is associated with an encoding-specific suggested replacement // byte. type RepertoireError byte // Error implements the error interrface. func (r RepertoireError) Error() string { return "encoding: rune not supported by encoding." } // Replacement returns the replacement string associated with this error. func (r RepertoireError) Replacement() byte { return byte(r) } var ErrASCIIReplacement = RepertoireError(encoding.ASCIISub) ================================================ FILE: vendor/golang.org/x/text/encoding/japanese/all.go ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package japanese import ( "golang.org/x/text/encoding" ) // All is a list of all defined encodings in this package. var All = []encoding.Encoding{EUCJP, ISO2022JP, ShiftJIS} ================================================ FILE: vendor/golang.org/x/text/encoding/japanese/eucjp.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package japanese import ( "errors" "unicode/utf8" "golang.org/x/text/encoding" "golang.org/x/text/encoding/internal" "golang.org/x/text/encoding/internal/identifier" "golang.org/x/text/transform" ) // EUCJP is the EUC-JP encoding. var EUCJP encoding.Encoding = &eucJP var eucJP = internal.Encoding{ &internal.SimpleEncoding{eucJPDecoder{}, eucJPEncoder{}}, "EUC-JP", identifier.EUCPkdFmtJapanese, } var errInvalidEUCJP = errors.New("japanese: invalid EUC-JP encoding") type eucJPDecoder struct{ transform.NopResetter } func (eucJPDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { r, size := rune(0), 0 loop: for ; nSrc < len(src); nSrc += size { switch c0 := src[nSrc]; { case c0 < utf8.RuneSelf: r, size = rune(c0), 1 case c0 == 0x8e: if nSrc+1 >= len(src) { err = transform.ErrShortSrc break loop } c1 := src[nSrc+1] if c1 < 0xa1 || 0xdf < c1 { err = errInvalidEUCJP break loop } r, size = rune(c1)+(0xff61-0xa1), 2 case c0 == 0x8f: if nSrc+2 >= len(src) { err = transform.ErrShortSrc break loop } c1 := src[nSrc+1] if c1 < 0xa1 || 0xfe < c1 { err = errInvalidEUCJP break loop } c2 := src[nSrc+2] if c2 < 0xa1 || 0xfe < c2 { err = errInvalidEUCJP break loop } r, size = '\ufffd', 3 if i := int(c1-0xa1)*94 + int(c2-0xa1); i < len(jis0212Decode) { r = rune(jis0212Decode[i]) if r == 0 { r = '\ufffd' } } case 0xa1 <= c0 && c0 <= 0xfe: if nSrc+1 >= len(src) { err = transform.ErrShortSrc break loop } c1 := src[nSrc+1] if c1 < 0xa1 || 0xfe < c1 { err = errInvalidEUCJP break loop } r, size = '\ufffd', 2 if i := int(c0-0xa1)*94 + int(c1-0xa1); i < len(jis0208Decode) { r = rune(jis0208Decode[i]) if r == 0 { r = '\ufffd' } } default: err = errInvalidEUCJP break loop } if nDst+utf8.RuneLen(r) > len(dst) { err = transform.ErrShortDst break loop } nDst += utf8.EncodeRune(dst[nDst:], r) } if atEOF && err == transform.ErrShortSrc { err = errInvalidEUCJP } return nDst, nSrc, err } type eucJPEncoder struct{ transform.NopResetter } func (eucJPEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { r, size := rune(0), 0 for ; nSrc < len(src); nSrc += size { r = rune(src[nSrc]) // Decode a 1-byte rune. if r < utf8.RuneSelf { size = 1 } else { // Decode a multi-byte rune. r, size = utf8.DecodeRune(src[nSrc:]) if size == 1 { // All valid runes of size 1 (those below utf8.RuneSelf) were // handled above. We have invalid UTF-8 or we haven't seen the // full character yet. if !atEOF && !utf8.FullRune(src[nSrc:]) { err = transform.ErrShortSrc break } } // func init checks that the switch covers all tables. switch { case encode0Low <= r && r < encode0High: if r = rune(encode0[r-encode0Low]); r != 0 { goto write2or3 } case encode1Low <= r && r < encode1High: if r = rune(encode1[r-encode1Low]); r != 0 { goto write2or3 } case encode2Low <= r && r < encode2High: if r = rune(encode2[r-encode2Low]); r != 0 { goto write2or3 } case encode3Low <= r && r < encode3High: if r = rune(encode3[r-encode3Low]); r != 0 { goto write2or3 } case encode4Low <= r && r < encode4High: if r = rune(encode4[r-encode4Low]); r != 0 { goto write2or3 } case encode5Low <= r && r < encode5High: if 0xff61 <= r && r < 0xffa0 { goto write2 } if r = rune(encode5[r-encode5Low]); r != 0 { goto write2or3 } } err = internal.ErrASCIIReplacement break } if nDst >= len(dst) { err = transform.ErrShortDst break } dst[nDst] = uint8(r) nDst++ continue write2or3: if r>>tableShift == jis0208 { if nDst+2 > len(dst) { err = transform.ErrShortDst break } } else { if nDst+3 > len(dst) { err = transform.ErrShortDst break } dst[nDst] = 0x8f nDst++ } dst[nDst+0] = 0xa1 + uint8(r>>codeShift)&codeMask dst[nDst+1] = 0xa1 + uint8(r)&codeMask nDst += 2 continue write2: if nDst+2 > len(dst) { err = transform.ErrShortDst break } dst[nDst+0] = 0x8e dst[nDst+1] = uint8(r - (0xff61 - 0xa1)) nDst += 2 continue } return nDst, nSrc, err } func init() { // Check that the hard-coded encode switch covers all tables. if numEncodeTables != 6 { panic("bad numEncodeTables") } } ================================================ FILE: vendor/golang.org/x/text/encoding/japanese/iso2022jp.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package japanese import ( "errors" "unicode/utf8" "golang.org/x/text/encoding" "golang.org/x/text/encoding/internal" "golang.org/x/text/encoding/internal/identifier" "golang.org/x/text/transform" ) // ISO2022JP is the ISO-2022-JP encoding. var ISO2022JP encoding.Encoding = &iso2022JP var iso2022JP = internal.Encoding{ internal.FuncEncoding{iso2022JPNewDecoder, iso2022JPNewEncoder}, "ISO-2022-JP", identifier.ISO2022JP, } func iso2022JPNewDecoder() transform.Transformer { return new(iso2022JPDecoder) } func iso2022JPNewEncoder() transform.Transformer { return new(iso2022JPEncoder) } var errInvalidISO2022JP = errors.New("japanese: invalid ISO-2022-JP encoding") const ( asciiState = iota katakanaState jis0208State jis0212State ) const asciiEsc = 0x1b type iso2022JPDecoder int func (d *iso2022JPDecoder) Reset() { *d = asciiState } func (d *iso2022JPDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { r, size := rune(0), 0 loop: for ; nSrc < len(src); nSrc += size { c0 := src[nSrc] if c0 >= utf8.RuneSelf { err = errInvalidISO2022JP break loop } if c0 == asciiEsc { if nSrc+2 >= len(src) { err = transform.ErrShortSrc break loop } size = 3 c1 := src[nSrc+1] c2 := src[nSrc+2] switch { case c1 == '$' && (c2 == '@' || c2 == 'B'): *d = jis0208State continue case c1 == '$' && c2 == '(': if nSrc+3 >= len(src) { err = transform.ErrShortSrc break loop } size = 4 if src[nSrc]+3 == 'D' { *d = jis0212State continue } case c1 == '(' && (c2 == 'B' || c2 == 'J'): *d = asciiState continue case c1 == '(' && c2 == 'I': *d = katakanaState continue } err = errInvalidISO2022JP break loop } switch *d { case asciiState: r, size = rune(c0), 1 case katakanaState: if c0 < 0x21 || 0x60 <= c0 { err = errInvalidISO2022JP break loop } r, size = rune(c0)+(0xff61-0x21), 1 default: if c0 == 0x0a { *d = asciiState r, size = rune(c0), 1 break } if nSrc+1 >= len(src) { err = transform.ErrShortSrc break loop } size = 2 c1 := src[nSrc+1] i := int(c0-0x21)*94 + int(c1-0x21) if *d == jis0208State && i < len(jis0208Decode) { r = rune(jis0208Decode[i]) } else if *d == jis0212State && i < len(jis0212Decode) { r = rune(jis0212Decode[i]) } else { r = '\ufffd' break } if r == 0 { r = '\ufffd' } } if nDst+utf8.RuneLen(r) > len(dst) { err = transform.ErrShortDst break loop } nDst += utf8.EncodeRune(dst[nDst:], r) } if atEOF && err == transform.ErrShortSrc { err = errInvalidISO2022JP } return nDst, nSrc, err } type iso2022JPEncoder int func (e *iso2022JPEncoder) Reset() { *e = asciiState } func (e *iso2022JPEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { r, size := rune(0), 0 for ; nSrc < len(src); nSrc += size { r = rune(src[nSrc]) // Decode a 1-byte rune. if r < utf8.RuneSelf { size = 1 } else { // Decode a multi-byte rune. r, size = utf8.DecodeRune(src[nSrc:]) if size == 1 { // All valid runes of size 1 (those below utf8.RuneSelf) were // handled above. We have invalid UTF-8 or we haven't seen the // full character yet. if !atEOF && !utf8.FullRune(src[nSrc:]) { err = transform.ErrShortSrc break } } // func init checks that the switch covers all tables. // // http://encoding.spec.whatwg.org/#iso-2022-jp says that "the index jis0212 // is not used by the iso-2022-jp encoder due to lack of widespread support". // // TODO: do we have to special-case U+00A5 and U+203E, as per // http://encoding.spec.whatwg.org/#iso-2022-jp // Doing so would mean that "\u00a5" would not be preserved // after an encode-decode round trip. switch { case encode0Low <= r && r < encode0High: if r = rune(encode0[r-encode0Low]); r>>tableShift == jis0208 { goto writeJIS } case encode1Low <= r && r < encode1High: if r = rune(encode1[r-encode1Low]); r>>tableShift == jis0208 { goto writeJIS } case encode2Low <= r && r < encode2High: if r = rune(encode2[r-encode2Low]); r>>tableShift == jis0208 { goto writeJIS } case encode3Low <= r && r < encode3High: if r = rune(encode3[r-encode3Low]); r>>tableShift == jis0208 { goto writeJIS } case encode4Low <= r && r < encode4High: if r = rune(encode4[r-encode4Low]); r>>tableShift == jis0208 { goto writeJIS } case encode5Low <= r && r < encode5High: if 0xff61 <= r && r < 0xffa0 { goto writeKatakana } if r = rune(encode5[r-encode5Low]); r>>tableShift == jis0208 { goto writeJIS } } // Switch back to ASCII state in case of error so that an ASCII // replacement character can be written in the correct state. if *e != asciiState { if nDst+3 > len(dst) { err = transform.ErrShortDst break } *e = asciiState dst[nDst+0] = asciiEsc dst[nDst+1] = '(' dst[nDst+2] = 'B' nDst += 3 } err = internal.ErrASCIIReplacement break } if *e != asciiState { if nDst+4 > len(dst) { err = transform.ErrShortDst break } *e = asciiState dst[nDst+0] = asciiEsc dst[nDst+1] = '(' dst[nDst+2] = 'B' nDst += 3 } else if nDst >= len(dst) { err = transform.ErrShortDst break } dst[nDst] = uint8(r) nDst++ continue writeJIS: if *e != jis0208State { if nDst+5 > len(dst) { err = transform.ErrShortDst break } *e = jis0208State dst[nDst+0] = asciiEsc dst[nDst+1] = '$' dst[nDst+2] = 'B' nDst += 3 } else if nDst+2 > len(dst) { err = transform.ErrShortDst break } dst[nDst+0] = 0x21 + uint8(r>>codeShift)&codeMask dst[nDst+1] = 0x21 + uint8(r)&codeMask nDst += 2 continue writeKatakana: if *e != katakanaState { if nDst+4 > len(dst) { err = transform.ErrShortDst break } *e = katakanaState dst[nDst+0] = asciiEsc dst[nDst+1] = '(' dst[nDst+2] = 'I' nDst += 3 } else if nDst >= len(dst) { err = transform.ErrShortDst break } dst[nDst] = uint8(r - (0xff61 - 0x21)) nDst++ continue } if atEOF && err == nil && *e != asciiState { if nDst+3 > len(dst) { err = transform.ErrShortDst } else { *e = asciiState dst[nDst+0] = asciiEsc dst[nDst+1] = '(' dst[nDst+2] = 'B' nDst += 3 } } return nDst, nSrc, err } ================================================ FILE: vendor/golang.org/x/text/encoding/japanese/maketables.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build ignore package main // This program generates tables.go: // go run maketables.go | gofmt > tables.go // TODO: Emoji extensions? // http://www.unicode.org/faq/emoji_dingbats.html // http://www.unicode.org/Public/UNIDATA/EmojiSources.txt import ( "bufio" "fmt" "log" "net/http" "sort" "strings" ) type entry struct { jisCode, table int } func main() { fmt.Printf("// generated by go run maketables.go; DO NOT EDIT\n\n") fmt.Printf("// Package japanese provides Japanese encodings such as EUC-JP and Shift JIS.\n") fmt.Printf(`package japanese // import "golang.org/x/text/encoding/japanese"` + "\n\n") reverse := [65536]entry{} for i := range reverse { reverse[i].table = -1 } tables := []struct { url string name string }{ {"http://encoding.spec.whatwg.org/index-jis0208.txt", "0208"}, {"http://encoding.spec.whatwg.org/index-jis0212.txt", "0212"}, } for i, table := range tables { res, err := http.Get(table.url) if err != nil { log.Fatalf("%q: Get: %v", table.url, err) } defer res.Body.Close() mapping := [65536]uint16{} scanner := bufio.NewScanner(res.Body) for scanner.Scan() { s := strings.TrimSpace(scanner.Text()) if s == "" || s[0] == '#' { continue } x, y := 0, uint16(0) if _, err := fmt.Sscanf(s, "%d 0x%x", &x, &y); err != nil { log.Fatalf("%q: could not parse %q", table.url, s) } if x < 0 || 120*94 <= x { log.Fatalf("%q: JIS code %d is out of range", table.url, x) } mapping[x] = y if reverse[y].table == -1 { reverse[y] = entry{jisCode: x, table: i} } } if err := scanner.Err(); err != nil { log.Fatalf("%q: scanner error: %v", table.url, err) } fmt.Printf("// jis%sDecode is the decoding table from JIS %s code to Unicode.\n// It is defined at %s\n", table.name, table.name, table.url) fmt.Printf("var jis%sDecode = [...]uint16{\n", table.name) for i, m := range mapping { if m != 0 { fmt.Printf("\t%d: 0x%04X,\n", i, m) } } fmt.Printf("}\n\n") } // Any run of at least separation continuous zero entries in the reverse map will // be a separate encode table. const separation = 1024 intervals := []interval(nil) low, high := -1, -1 for i, v := range reverse { if v.table == -1 { continue } if low < 0 { low = i } else if i-high >= separation { if high >= 0 { intervals = append(intervals, interval{low, high}) } low = i } high = i + 1 } if high >= 0 { intervals = append(intervals, interval{low, high}) } sort.Sort(byDecreasingLength(intervals)) fmt.Printf("const (\n") fmt.Printf("\tjis0208 = 1\n") fmt.Printf("\tjis0212 = 2\n") fmt.Printf("\tcodeMask = 0x7f\n") fmt.Printf("\tcodeShift = 7\n") fmt.Printf("\ttableShift = 14\n") fmt.Printf(")\n\n") fmt.Printf("const numEncodeTables = %d\n\n", len(intervals)) fmt.Printf("// encodeX are the encoding tables from Unicode to JIS code,\n") fmt.Printf("// sorted by decreasing length.\n") for i, v := range intervals { fmt.Printf("// encode%d: %5d entries for runes in [%5d, %5d).\n", i, v.len(), v.low, v.high) } fmt.Printf("//\n") fmt.Printf("// The high two bits of the value record whether the JIS code comes from the\n") fmt.Printf("// JIS0208 table (high bits == 1) or the JIS0212 table (high bits == 2).\n") fmt.Printf("// The low 14 bits are two 7-bit unsigned integers j1 and j2 that form the\n") fmt.Printf("// JIS code (94*j1 + j2) within that table.\n") fmt.Printf("\n") for i, v := range intervals { fmt.Printf("const encode%dLow, encode%dHigh = %d, %d\n\n", i, i, v.low, v.high) fmt.Printf("var encode%d = [...]uint16{\n", i) for j := v.low; j < v.high; j++ { x := reverse[j] if x.table == -1 { continue } fmt.Printf("\t%d - %d: jis%s<<14 | 0x%02X<<7 | 0x%02X,\n", j, v.low, tables[x.table].name, x.jisCode/94, x.jisCode%94) } fmt.Printf("}\n\n") } } // interval is a half-open interval [low, high). type interval struct { low, high int } func (i interval) len() int { return i.high - i.low } // byDecreasingLength sorts intervals by decreasing length. type byDecreasingLength []interval func (b byDecreasingLength) Len() int { return len(b) } func (b byDecreasingLength) Less(i, j int) bool { return b[i].len() > b[j].len() } func (b byDecreasingLength) Swap(i, j int) { b[i], b[j] = b[j], b[i] } ================================================ FILE: vendor/golang.org/x/text/encoding/japanese/shiftjis.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package japanese import ( "errors" "unicode/utf8" "golang.org/x/text/encoding" "golang.org/x/text/encoding/internal" "golang.org/x/text/encoding/internal/identifier" "golang.org/x/text/transform" ) // ShiftJIS is the Shift JIS encoding, also known as Code Page 932 and // Windows-31J. var ShiftJIS encoding.Encoding = &shiftJIS var shiftJIS = internal.Encoding{ &internal.SimpleEncoding{shiftJISDecoder{}, shiftJISEncoder{}}, "Shift JIS", identifier.ShiftJIS, } var errInvalidShiftJIS = errors.New("japanese: invalid Shift JIS encoding") type shiftJISDecoder struct{ transform.NopResetter } func (shiftJISDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { r, size := rune(0), 0 loop: for ; nSrc < len(src); nSrc += size { switch c0 := src[nSrc]; { case c0 < utf8.RuneSelf: r, size = rune(c0), 1 case 0xa1 <= c0 && c0 < 0xe0: r, size = rune(c0)+(0xff61-0xa1), 1 case (0x81 <= c0 && c0 < 0xa0) || (0xe0 <= c0 && c0 < 0xfd): if c0 <= 0x9f { c0 -= 0x70 } else { c0 -= 0xb0 } c0 = 2*c0 - 0x21 if nSrc+1 >= len(src) { err = transform.ErrShortSrc break loop } c1 := src[nSrc+1] switch { case c1 < 0x40: err = errInvalidShiftJIS break loop case c1 < 0x7f: c0-- c1 -= 0x40 case c1 == 0x7f: err = errInvalidShiftJIS break loop case c1 < 0x9f: c0-- c1 -= 0x41 case c1 < 0xfd: c1 -= 0x9f default: err = errInvalidShiftJIS break loop } r, size = '\ufffd', 2 if i := int(c0)*94 + int(c1); i < len(jis0208Decode) { r = rune(jis0208Decode[i]) if r == 0 { r = '\ufffd' } } default: err = errInvalidShiftJIS break loop } if nDst+utf8.RuneLen(r) > len(dst) { err = transform.ErrShortDst break loop } nDst += utf8.EncodeRune(dst[nDst:], r) } if atEOF && err == transform.ErrShortSrc { err = errInvalidShiftJIS } return nDst, nSrc, err } type shiftJISEncoder struct{ transform.NopResetter } func (shiftJISEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { r, size := rune(0), 0 loop: for ; nSrc < len(src); nSrc += size { r = rune(src[nSrc]) // Decode a 1-byte rune. if r < utf8.RuneSelf { size = 1 } else { // Decode a multi-byte rune. r, size = utf8.DecodeRune(src[nSrc:]) if size == 1 { // All valid runes of size 1 (those below utf8.RuneSelf) were // handled above. We have invalid UTF-8 or we haven't seen the // full character yet. if !atEOF && !utf8.FullRune(src[nSrc:]) { err = transform.ErrShortSrc break loop } } // func init checks that the switch covers all tables. switch { case encode0Low <= r && r < encode0High: if r = rune(encode0[r-encode0Low]); r>>tableShift == jis0208 { goto write2 } case encode1Low <= r && r < encode1High: if r = rune(encode1[r-encode1Low]); r>>tableShift == jis0208 { goto write2 } case encode2Low <= r && r < encode2High: if r = rune(encode2[r-encode2Low]); r>>tableShift == jis0208 { goto write2 } case encode3Low <= r && r < encode3High: if r = rune(encode3[r-encode3Low]); r>>tableShift == jis0208 { goto write2 } case encode4Low <= r && r < encode4High: if r = rune(encode4[r-encode4Low]); r>>tableShift == jis0208 { goto write2 } case encode5Low <= r && r < encode5High: if 0xff61 <= r && r < 0xffa0 { r -= 0xff61 - 0xa1 goto write1 } if r = rune(encode5[r-encode5Low]); r>>tableShift == jis0208 { goto write2 } } err = internal.ErrASCIIReplacement break } write1: if nDst >= len(dst) { err = transform.ErrShortDst break } dst[nDst] = uint8(r) nDst++ continue write2: j1 := uint8(r>>codeShift) & codeMask j2 := uint8(r) & codeMask if nDst+2 > len(dst) { err = transform.ErrShortDst break loop } if j1 <= 61 { dst[nDst+0] = 129 + j1/2 } else { dst[nDst+0] = 193 + j1/2 } if j1&1 == 0 { dst[nDst+1] = j2 + j2/63 + 64 } else { dst[nDst+1] = j2 + 159 } nDst += 2 continue } return nDst, nSrc, err } ================================================ FILE: vendor/golang.org/x/text/encoding/japanese/tables.go ================================================ // generated by go run maketables.go; DO NOT EDIT // Package japanese provides Japanese encodings such as EUC-JP and Shift JIS. package japanese // import "golang.org/x/text/encoding/japanese" // jis0208Decode is the decoding table from JIS 0208 code to Unicode. // It is defined at http://encoding.spec.whatwg.org/index-jis0208.txt var jis0208Decode = [...]uint16{ 0: 0x3000, 1: 0x3001, 2: 0x3002, 3: 0xFF0C, 4: 0xFF0E, 5: 0x30FB, 6: 0xFF1A, 7: 0xFF1B, 8: 0xFF1F, 9: 0xFF01, 10: 0x309B, 11: 0x309C, 12: 0x00B4, 13: 0xFF40, 14: 0x00A8, 15: 0xFF3E, 16: 0xFFE3, 17: 0xFF3F, 18: 0x30FD, 19: 0x30FE, 20: 0x309D, 21: 0x309E, 22: 0x3003, 23: 0x4EDD, 24: 0x3005, 25: 0x3006, 26: 0x3007, 27: 0x30FC, 28: 0x2015, 29: 0x2010, 30: 0xFF0F, 31: 0xFF3C, 32: 0xFF5E, 33: 0x2225, 34: 0xFF5C, 35: 0x2026, 36: 0x2025, 37: 0x2018, 38: 0x2019, 39: 0x201C, 40: 0x201D, 41: 0xFF08, 42: 0xFF09, 43: 0x3014, 44: 0x3015, 45: 0xFF3B, 46: 0xFF3D, 47: 0xFF5B, 48: 0xFF5D, 49: 0x3008, 50: 0x3009, 51: 0x300A, 52: 0x300B, 53: 0x300C, 54: 0x300D, 55: 0x300E, 56: 0x300F, 57: 0x3010, 58: 0x3011, 59: 0xFF0B, 60: 0xFF0D, 61: 0x00B1, 62: 0x00D7, 63: 0x00F7, 64: 0xFF1D, 65: 0x2260, 66: 0xFF1C, 67: 0xFF1E, 68: 0x2266, 69: 0x2267, 70: 0x221E, 71: 0x2234, 72: 0x2642, 73: 0x2640, 74: 0x00B0, 75: 0x2032, 76: 0x2033, 77: 0x2103, 78: 0xFFE5, 79: 0xFF04, 80: 0xFFE0, 81: 0xFFE1, 82: 0xFF05, 83: 0xFF03, 84: 0xFF06, 85: 0xFF0A, 86: 0xFF20, 87: 0x00A7, 88: 0x2606, 89: 0x2605, 90: 0x25CB, 91: 0x25CF, 92: 0x25CE, 93: 0x25C7, 94: 0x25C6, 95: 0x25A1, 96: 0x25A0, 97: 0x25B3, 98: 0x25B2, 99: 0x25BD, 100: 0x25BC, 101: 0x203B, 102: 0x3012, 103: 0x2192, 104: 0x2190, 105: 0x2191, 106: 0x2193, 107: 0x3013, 119: 0x2208, 120: 0x220B, 121: 0x2286, 122: 0x2287, 123: 0x2282, 124: 0x2283, 125: 0x222A, 126: 0x2229, 135: 0x2227, 136: 0x2228, 137: 0xFFE2, 138: 0x21D2, 139: 0x21D4, 140: 0x2200, 141: 0x2203, 153: 0x2220, 154: 0x22A5, 155: 0x2312, 156: 0x2202, 157: 0x2207, 158: 0x2261, 159: 0x2252, 160: 0x226A, 161: 0x226B, 162: 0x221A, 163: 0x223D, 164: 0x221D, 165: 0x2235, 166: 0x222B, 167: 0x222C, 175: 0x212B, 176: 0x2030, 177: 0x266F, 178: 0x266D, 179: 0x266A, 180: 0x2020, 181: 0x2021, 182: 0x00B6, 187: 0x25EF, 203: 0xFF10, 204: 0xFF11, 205: 0xFF12, 206: 0xFF13, 207: 0xFF14, 208: 0xFF15, 209: 0xFF16, 210: 0xFF17, 211: 0xFF18, 212: 0xFF19, 220: 0xFF21, 221: 0xFF22, 222: 0xFF23, 223: 0xFF24, 224: 0xFF25, 225: 0xFF26, 226: 0xFF27, 227: 0xFF28, 228: 0xFF29, 229: 0xFF2A, 230: 0xFF2B, 231: 0xFF2C, 232: 0xFF2D, 233: 0xFF2E, 234: 0xFF2F, 235: 0xFF30, 236: 0xFF31, 237: 0xFF32, 238: 0xFF33, 239: 0xFF34, 240: 0xFF35, 241: 0xFF36, 242: 0xFF37, 243: 0xFF38, 244: 0xFF39, 245: 0xFF3A, 252: 0xFF41, 253: 0xFF42, 254: 0xFF43, 255: 0xFF44, 256: 0xFF45, 257: 0xFF46, 258: 0xFF47, 259: 0xFF48, 260: 0xFF49, 261: 0xFF4A, 262: 0xFF4B, 263: 0xFF4C, 264: 0xFF4D, 265: 0xFF4E, 266: 0xFF4F, 267: 0xFF50, 268: 0xFF51, 269: 0xFF52, 270: 0xFF53, 271: 0xFF54, 272: 0xFF55, 273: 0xFF56, 274: 0xFF57, 275: 0xFF58, 276: 0xFF59, 277: 0xFF5A, 282: 0x3041, 283: 0x3042, 284: 0x3043, 285: 0x3044, 286: 0x3045, 287: 0x3046, 288: 0x3047, 289: 0x3048, 290: 0x3049, 291: 0x304A, 292: 0x304B, 293: 0x304C, 294: 0x304D, 295: 0x304E, 296: 0x304F, 297: 0x3050, 298: 0x3051, 299: 0x3052, 300: 0x3053, 301: 0x3054, 302: 0x3055, 303: 0x3056, 304: 0x3057, 305: 0x3058, 306: 0x3059, 307: 0x305A, 308: 0x305B, 309: 0x305C, 310: 0x305D, 311: 0x305E, 312: 0x305F, 313: 0x3060, 314: 0x3061, 315: 0x3062, 316: 0x3063, 317: 0x3064, 318: 0x3065, 319: 0x3066, 320: 0x3067, 321: 0x3068, 322: 0x3069, 323: 0x306A, 324: 0x306B, 325: 0x306C, 326: 0x306D, 327: 0x306E, 328: 0x306F, 329: 0x3070, 330: 0x3071, 331: 0x3072, 332: 0x3073, 333: 0x3074, 334: 0x3075, 335: 0x3076, 336: 0x3077, 337: 0x3078, 338: 0x3079, 339: 0x307A, 340: 0x307B, 341: 0x307C, 342: 0x307D, 343: 0x307E, 344: 0x307F, 345: 0x3080, 346: 0x3081, 347: 0x3082, 348: 0x3083, 349: 0x3084, 350: 0x3085, 351: 0x3086, 352: 0x3087, 353: 0x3088, 354: 0x3089, 355: 0x308A, 356: 0x308B, 357: 0x308C, 358: 0x308D, 359: 0x308E, 360: 0x308F, 361: 0x3090, 362: 0x3091, 363: 0x3092, 364: 0x3093, 376: 0x30A1, 377: 0x30A2, 378: 0x30A3, 379: 0x30A4, 380: 0x30A5, 381: 0x30A6, 382: 0x30A7, 383: 0x30A8, 384: 0x30A9, 385: 0x30AA, 386: 0x30AB, 387: 0x30AC, 388: 0x30AD, 389: 0x30AE, 390: 0x30AF, 391: 0x30B0, 392: 0x30B1, 393: 0x30B2, 394: 0x30B3, 395: 0x30B4, 396: 0x30B5, 397: 0x30B6, 398: 0x30B7, 399: 0x30B8, 400: 0x30B9, 401: 0x30BA, 402: 0x30BB, 403: 0x30BC, 404: 0x30BD, 405: 0x30BE, 406: 0x30BF, 407: 0x30C0, 408: 0x30C1, 409: 0x30C2, 410: 0x30C3, 411: 0x30C4, 412: 0x30C5, 413: 0x30C6, 414: 0x30C7, 415: 0x30C8, 416: 0x30C9, 417: 0x30CA, 418: 0x30CB, 419: 0x30CC, 420: 0x30CD, 421: 0x30CE, 422: 0x30CF, 423: 0x30D0, 424: 0x30D1, 425: 0x30D2, 426: 0x30D3, 427: 0x30D4, 428: 0x30D5, 429: 0x30D6, 430: 0x30D7, 431: 0x30D8, 432: 0x30D9, 433: 0x30DA, 434: 0x30DB, 435: 0x30DC, 436: 0x30DD, 437: 0x30DE, 438: 0x30DF, 439: 0x30E0, 440: 0x30E1, 441: 0x30E2, 442: 0x30E3, 443: 0x30E4, 444: 0x30E5, 445: 0x30E6, 446: 0x30E7, 447: 0x30E8, 448: 0x30E9, 449: 0x30EA, 450: 0x30EB, 451: 0x30EC, 452: 0x30ED, 453: 0x30EE, 454: 0x30EF, 455: 0x30F0, 456: 0x30F1, 457: 0x30F2, 458: 0x30F3, 459: 0x30F4, 460: 0x30F5, 461: 0x30F6, 470: 0x0391, 471: 0x0392, 472: 0x0393, 473: 0x0394, 474: 0x0395, 475: 0x0396, 476: 0x0397, 477: 0x0398, 478: 0x0399, 479: 0x039A, 480: 0x039B, 481: 0x039C, 482: 0x039D, 483: 0x039E, 484: 0x039F, 485: 0x03A0, 486: 0x03A1, 487: 0x03A3, 488: 0x03A4, 489: 0x03A5, 490: 0x03A6, 491: 0x03A7, 492: 0x03A8, 493: 0x03A9, 502: 0x03B1, 503: 0x03B2, 504: 0x03B3, 505: 0x03B4, 506: 0x03B5, 507: 0x03B6, 508: 0x03B7, 509: 0x03B8, 510: 0x03B9, 511: 0x03BA, 512: 0x03BB, 513: 0x03BC, 514: 0x03BD, 515: 0x03BE, 516: 0x03BF, 517: 0x03C0, 518: 0x03C1, 519: 0x03C3, 520: 0x03C4, 521: 0x03C5, 522: 0x03C6, 523: 0x03C7, 524: 0x03C8, 525: 0x03C9, 564: 0x0410, 565: 0x0411, 566: 0x0412, 567: 0x0413, 568: 0x0414, 569: 0x0415, 570: 0x0401, 571: 0x0416, 572: 0x0417, 573: 0x0418, 574: 0x0419, 575: 0x041A, 576: 0x041B, 577: 0x041C, 578: 0x041D, 579: 0x041E, 580: 0x041F, 581: 0x0420, 582: 0x0421, 583: 0x0422, 584: 0x0423, 585: 0x0424, 586: 0x0425, 587: 0x0426, 588: 0x0427, 589: 0x0428, 590: 0x0429, 591: 0x042A, 592: 0x042B, 593: 0x042C, 594: 0x042D, 595: 0x042E, 596: 0x042F, 612: 0x0430, 613: 0x0431, 614: 0x0432, 615: 0x0433, 616: 0x0434, 617: 0x0435, 618: 0x0451, 619: 0x0436, 620: 0x0437, 621: 0x0438, 622: 0x0439, 623: 0x043A, 624: 0x043B, 625: 0x043C, 626: 0x043D, 627: 0x043E, 628: 0x043F, 629: 0x0440, 630: 0x0441, 631: 0x0442, 632: 0x0443, 633: 0x0444, 634: 0x0445, 635: 0x0446, 636: 0x0447, 637: 0x0448, 638: 0x0449, 639: 0x044A, 640: 0x044B, 641: 0x044C, 642: 0x044D, 643: 0x044E, 644: 0x044F, 658: 0x2500, 659: 0x2502, 660: 0x250C, 661: 0x2510, 662: 0x2518, 663: 0x2514, 664: 0x251C, 665: 0x252C, 666: 0x2524, 667: 0x2534, 668: 0x253C, 669: 0x2501, 670: 0x2503, 671: 0x250F, 672: 0x2513, 673: 0x251B, 674: 0x2517, 675: 0x2523, 676: 0x2533, 677: 0x252B, 678: 0x253B, 679: 0x254B, 680: 0x2520, 681: 0x252F, 682: 0x2528, 683: 0x2537, 684: 0x253F, 685: 0x251D, 686: 0x2530, 687: 0x2525, 688: 0x2538, 689: 0x2542, 1128: 0x2460, 1129: 0x2461, 1130: 0x2462, 1131: 0x2463, 1132: 0x2464, 1133: 0x2465, 1134: 0x2466, 1135: 0x2467, 1136: 0x2468, 1137: 0x2469, 1138: 0x246A, 1139: 0x246B, 1140: 0x246C, 1141: 0x246D, 1142: 0x246E, 1143: 0x246F, 1144: 0x2470, 1145: 0x2471, 1146: 0x2472, 1147: 0x2473, 1148: 0x2160, 1149: 0x2161, 1150: 0x2162, 1151: 0x2163, 1152: 0x2164, 1153: 0x2165, 1154: 0x2166, 1155: 0x2167, 1156: 0x2168, 1157: 0x2169, 1159: 0x3349, 1160: 0x3314, 1161: 0x3322, 1162: 0x334D, 1163: 0x3318, 1164: 0x3327, 1165: 0x3303, 1166: 0x3336, 1167: 0x3351, 1168: 0x3357, 1169: 0x330D, 1170: 0x3326, 1171: 0x3323, 1172: 0x332B, 1173: 0x334A, 1174: 0x333B, 1175: 0x339C, 1176: 0x339D, 1177: 0x339E, 1178: 0x338E, 1179: 0x338F, 1180: 0x33C4, 1181: 0x33A1, 1190: 0x337B, 1191: 0x301D, 1192: 0x301F, 1193: 0x2116, 1194: 0x33CD, 1195: 0x2121, 1196: 0x32A4, 1197: 0x32A5, 1198: 0x32A6, 1199: 0x32A7, 1200: 0x32A8, 1201: 0x3231, 1202: 0x3232, 1203: 0x3239, 1204: 0x337E, 1205: 0x337D, 1206: 0x337C, 1207: 0x2252, 1208: 0x2261, 1209: 0x222B, 1210: 0x222E, 1211: 0x2211, 1212: 0x221A, 1213: 0x22A5, 1214: 0x2220, 1215: 0x221F, 1216: 0x22BF, 1217: 0x2235, 1218: 0x2229, 1219: 0x222A, 1410: 0x4E9C, 1411: 0x5516, 1412: 0x5A03, 1413: 0x963F, 1414: 0x54C0, 1415: 0x611B, 1416: 0x6328, 1417: 0x59F6, 1418: 0x9022, 1419: 0x8475, 1420: 0x831C, 1421: 0x7A50, 1422: 0x60AA, 1423: 0x63E1, 1424: 0x6E25, 1425: 0x65ED, 1426: 0x8466, 1427: 0x82A6, 1428: 0x9BF5, 1429: 0x6893, 1430: 0x5727, 1431: 0x65A1, 1432: 0x6271, 1433: 0x5B9B, 1434: 0x59D0, 1435: 0x867B, 1436: 0x98F4, 1437: 0x7D62, 1438: 0x7DBE, 1439: 0x9B8E, 1440: 0x6216, 1441: 0x7C9F, 1442: 0x88B7, 1443: 0x5B89, 1444: 0x5EB5, 1445: 0x6309, 1446: 0x6697, 1447: 0x6848, 1448: 0x95C7, 1449: 0x978D, 1450: 0x674F, 1451: 0x4EE5, 1452: 0x4F0A, 1453: 0x4F4D, 1454: 0x4F9D, 1455: 0x5049, 1456: 0x56F2, 1457: 0x5937, 1458: 0x59D4, 1459: 0x5A01, 1460: 0x5C09, 1461: 0x60DF, 1462: 0x610F, 1463: 0x6170, 1464: 0x6613, 1465: 0x6905, 1466: 0x70BA, 1467: 0x754F, 1468: 0x7570, 1469: 0x79FB, 1470: 0x7DAD, 1471: 0x7DEF, 1472: 0x80C3, 1473: 0x840E, 1474: 0x8863, 1475: 0x8B02, 1476: 0x9055, 1477: 0x907A, 1478: 0x533B, 1479: 0x4E95, 1480: 0x4EA5, 1481: 0x57DF, 1482: 0x80B2, 1483: 0x90C1, 1484: 0x78EF, 1485: 0x4E00, 1486: 0x58F1, 1487: 0x6EA2, 1488: 0x9038, 1489: 0x7A32, 1490: 0x8328, 1491: 0x828B, 1492: 0x9C2F, 1493: 0x5141, 1494: 0x5370, 1495: 0x54BD, 1496: 0x54E1, 1497: 0x56E0, 1498: 0x59FB, 1499: 0x5F15, 1500: 0x98F2, 1501: 0x6DEB, 1502: 0x80E4, 1503: 0x852D, 1504: 0x9662, 1505: 0x9670, 1506: 0x96A0, 1507: 0x97FB, 1508: 0x540B, 1509: 0x53F3, 1510: 0x5B87, 1511: 0x70CF, 1512: 0x7FBD, 1513: 0x8FC2, 1514: 0x96E8, 1515: 0x536F, 1516: 0x9D5C, 1517: 0x7ABA, 1518: 0x4E11, 1519: 0x7893, 1520: 0x81FC, 1521: 0x6E26, 1522: 0x5618, 1523: 0x5504, 1524: 0x6B1D, 1525: 0x851A, 1526: 0x9C3B, 1527: 0x59E5, 1528: 0x53A9, 1529: 0x6D66, 1530: 0x74DC, 1531: 0x958F, 1532: 0x5642, 1533: 0x4E91, 1534: 0x904B, 1535: 0x96F2, 1536: 0x834F, 1537: 0x990C, 1538: 0x53E1, 1539: 0x55B6, 1540: 0x5B30, 1541: 0x5F71, 1542: 0x6620, 1543: 0x66F3, 1544: 0x6804, 1545: 0x6C38, 1546: 0x6CF3, 1547: 0x6D29, 1548: 0x745B, 1549: 0x76C8, 1550: 0x7A4E, 1551: 0x9834, 1552: 0x82F1, 1553: 0x885B, 1554: 0x8A60, 1555: 0x92ED, 1556: 0x6DB2, 1557: 0x75AB, 1558: 0x76CA, 1559: 0x99C5, 1560: 0x60A6, 1561: 0x8B01, 1562: 0x8D8A, 1563: 0x95B2, 1564: 0x698E, 1565: 0x53AD, 1566: 0x5186, 1567: 0x5712, 1568: 0x5830, 1569: 0x5944, 1570: 0x5BB4, 1571: 0x5EF6, 1572: 0x6028, 1573: 0x63A9, 1574: 0x63F4, 1575: 0x6CBF, 1576: 0x6F14, 1577: 0x708E, 1578: 0x7114, 1579: 0x7159, 1580: 0x71D5, 1581: 0x733F, 1582: 0x7E01, 1583: 0x8276, 1584: 0x82D1, 1585: 0x8597, 1586: 0x9060, 1587: 0x925B, 1588: 0x9D1B, 1589: 0x5869, 1590: 0x65BC, 1591: 0x6C5A, 1592: 0x7525, 1593: 0x51F9, 1594: 0x592E, 1595: 0x5965, 1596: 0x5F80, 1597: 0x5FDC, 1598: 0x62BC, 1599: 0x65FA, 1600: 0x6A2A, 1601: 0x6B27, 1602: 0x6BB4, 1603: 0x738B, 1604: 0x7FC1, 1605: 0x8956, 1606: 0x9D2C, 1607: 0x9D0E, 1608: 0x9EC4, 1609: 0x5CA1, 1610: 0x6C96, 1611: 0x837B, 1612: 0x5104, 1613: 0x5C4B, 1614: 0x61B6, 1615: 0x81C6, 1616: 0x6876, 1617: 0x7261, 1618: 0x4E59, 1619: 0x4FFA, 1620: 0x5378, 1621: 0x6069, 1622: 0x6E29, 1623: 0x7A4F, 1624: 0x97F3, 1625: 0x4E0B, 1626: 0x5316, 1627: 0x4EEE, 1628: 0x4F55, 1629: 0x4F3D, 1630: 0x4FA1, 1631: 0x4F73, 1632: 0x52A0, 1633: 0x53EF, 1634: 0x5609, 1635: 0x590F, 1636: 0x5AC1, 1637: 0x5BB6, 1638: 0x5BE1, 1639: 0x79D1, 1640: 0x6687, 1641: 0x679C, 1642: 0x67B6, 1643: 0x6B4C, 1644: 0x6CB3, 1645: 0x706B, 1646: 0x73C2, 1647: 0x798D, 1648: 0x79BE, 1649: 0x7A3C, 1650: 0x7B87, 1651: 0x82B1, 1652: 0x82DB, 1653: 0x8304, 1654: 0x8377, 1655: 0x83EF, 1656: 0x83D3, 1657: 0x8766, 1658: 0x8AB2, 1659: 0x5629, 1660: 0x8CA8, 1661: 0x8FE6, 1662: 0x904E, 1663: 0x971E, 1664: 0x868A, 1665: 0x4FC4, 1666: 0x5CE8, 1667: 0x6211, 1668: 0x7259, 1669: 0x753B, 1670: 0x81E5, 1671: 0x82BD, 1672: 0x86FE, 1673: 0x8CC0, 1674: 0x96C5, 1675: 0x9913, 1676: 0x99D5, 1677: 0x4ECB, 1678: 0x4F1A, 1679: 0x89E3, 1680: 0x56DE, 1681: 0x584A, 1682: 0x58CA, 1683: 0x5EFB, 1684: 0x5FEB, 1685: 0x602A, 1686: 0x6094, 1687: 0x6062, 1688: 0x61D0, 1689: 0x6212, 1690: 0x62D0, 1691: 0x6539, 1692: 0x9B41, 1693: 0x6666, 1694: 0x68B0, 1695: 0x6D77, 1696: 0x7070, 1697: 0x754C, 1698: 0x7686, 1699: 0x7D75, 1700: 0x82A5, 1701: 0x87F9, 1702: 0x958B, 1703: 0x968E, 1704: 0x8C9D, 1705: 0x51F1, 1706: 0x52BE, 1707: 0x5916, 1708: 0x54B3, 1709: 0x5BB3, 1710: 0x5D16, 1711: 0x6168, 1712: 0x6982, 1713: 0x6DAF, 1714: 0x788D, 1715: 0x84CB, 1716: 0x8857, 1717: 0x8A72, 1718: 0x93A7, 1719: 0x9AB8, 1720: 0x6D6C, 1721: 0x99A8, 1722: 0x86D9, 1723: 0x57A3, 1724: 0x67FF, 1725: 0x86CE, 1726: 0x920E, 1727: 0x5283, 1728: 0x5687, 1729: 0x5404, 1730: 0x5ED3, 1731: 0x62E1, 1732: 0x64B9, 1733: 0x683C, 1734: 0x6838, 1735: 0x6BBB, 1736: 0x7372, 1737: 0x78BA, 1738: 0x7A6B, 1739: 0x899A, 1740: 0x89D2, 1741: 0x8D6B, 1742: 0x8F03, 1743: 0x90ED, 1744: 0x95A3, 1745: 0x9694, 1746: 0x9769, 1747: 0x5B66, 1748: 0x5CB3, 1749: 0x697D, 1750: 0x984D, 1751: 0x984E, 1752: 0x639B, 1753: 0x7B20, 1754: 0x6A2B, 1755: 0x6A7F, 1756: 0x68B6, 1757: 0x9C0D, 1758: 0x6F5F, 1759: 0x5272, 1760: 0x559D, 1761: 0x6070, 1762: 0x62EC, 1763: 0x6D3B, 1764: 0x6E07, 1765: 0x6ED1, 1766: 0x845B, 1767: 0x8910, 1768: 0x8F44, 1769: 0x4E14, 1770: 0x9C39, 1771: 0x53F6, 1772: 0x691B, 1773: 0x6A3A, 1774: 0x9784, 1775: 0x682A, 1776: 0x515C, 1777: 0x7AC3, 1778: 0x84B2, 1779: 0x91DC, 1780: 0x938C, 1781: 0x565B, 1782: 0x9D28, 1783: 0x6822, 1784: 0x8305, 1785: 0x8431, 1786: 0x7CA5, 1787: 0x5208, 1788: 0x82C5, 1789: 0x74E6, 1790: 0x4E7E, 1791: 0x4F83, 1792: 0x51A0, 1793: 0x5BD2, 1794: 0x520A, 1795: 0x52D8, 1796: 0x52E7, 1797: 0x5DFB, 1798: 0x559A, 1799: 0x582A, 1800: 0x59E6, 1801: 0x5B8C, 1802: 0x5B98, 1803: 0x5BDB, 1804: 0x5E72, 1805: 0x5E79, 1806: 0x60A3, 1807: 0x611F, 1808: 0x6163, 1809: 0x61BE, 1810: 0x63DB, 1811: 0x6562, 1812: 0x67D1, 1813: 0x6853, 1814: 0x68FA, 1815: 0x6B3E, 1816: 0x6B53, 1817: 0x6C57, 1818: 0x6F22, 1819: 0x6F97, 1820: 0x6F45, 1821: 0x74B0, 1822: 0x7518, 1823: 0x76E3, 1824: 0x770B, 1825: 0x7AFF, 1826: 0x7BA1, 1827: 0x7C21, 1828: 0x7DE9, 1829: 0x7F36, 1830: 0x7FF0, 1831: 0x809D, 1832: 0x8266, 1833: 0x839E, 1834: 0x89B3, 1835: 0x8ACC, 1836: 0x8CAB, 1837: 0x9084, 1838: 0x9451, 1839: 0x9593, 1840: 0x9591, 1841: 0x95A2, 1842: 0x9665, 1843: 0x97D3, 1844: 0x9928, 1845: 0x8218, 1846: 0x4E38, 1847: 0x542B, 1848: 0x5CB8, 1849: 0x5DCC, 1850: 0x73A9, 1851: 0x764C, 1852: 0x773C, 1853: 0x5CA9, 1854: 0x7FEB, 1855: 0x8D0B, 1856: 0x96C1, 1857: 0x9811, 1858: 0x9854, 1859: 0x9858, 1860: 0x4F01, 1861: 0x4F0E, 1862: 0x5371, 1863: 0x559C, 1864: 0x5668, 1865: 0x57FA, 1866: 0x5947, 1867: 0x5B09, 1868: 0x5BC4, 1869: 0x5C90, 1870: 0x5E0C, 1871: 0x5E7E, 1872: 0x5FCC, 1873: 0x63EE, 1874: 0x673A, 1875: 0x65D7, 1876: 0x65E2, 1877: 0x671F, 1878: 0x68CB, 1879: 0x68C4, 1880: 0x6A5F, 1881: 0x5E30, 1882: 0x6BC5, 1883: 0x6C17, 1884: 0x6C7D, 1885: 0x757F, 1886: 0x7948, 1887: 0x5B63, 1888: 0x7A00, 1889: 0x7D00, 1890: 0x5FBD, 1891: 0x898F, 1892: 0x8A18, 1893: 0x8CB4, 1894: 0x8D77, 1895: 0x8ECC, 1896: 0x8F1D, 1897: 0x98E2, 1898: 0x9A0E, 1899: 0x9B3C, 1900: 0x4E80, 1901: 0x507D, 1902: 0x5100, 1903: 0x5993, 1904: 0x5B9C, 1905: 0x622F, 1906: 0x6280, 1907: 0x64EC, 1908: 0x6B3A, 1909: 0x72A0, 1910: 0x7591, 1911: 0x7947, 1912: 0x7FA9, 1913: 0x87FB, 1914: 0x8ABC, 1915: 0x8B70, 1916: 0x63AC, 1917: 0x83CA, 1918: 0x97A0, 1919: 0x5409, 1920: 0x5403, 1921: 0x55AB, 1922: 0x6854, 1923: 0x6A58, 1924: 0x8A70, 1925: 0x7827, 1926: 0x6775, 1927: 0x9ECD, 1928: 0x5374, 1929: 0x5BA2, 1930: 0x811A, 1931: 0x8650, 1932: 0x9006, 1933: 0x4E18, 1934: 0x4E45, 1935: 0x4EC7, 1936: 0x4F11, 1937: 0x53CA, 1938: 0x5438, 1939: 0x5BAE, 1940: 0x5F13, 1941: 0x6025, 1942: 0x6551, 1943: 0x673D, 1944: 0x6C42, 1945: 0x6C72, 1946: 0x6CE3, 1947: 0x7078, 1948: 0x7403, 1949: 0x7A76, 1950: 0x7AAE, 1951: 0x7B08, 1952: 0x7D1A, 1953: 0x7CFE, 1954: 0x7D66, 1955: 0x65E7, 1956: 0x725B, 1957: 0x53BB, 1958: 0x5C45, 1959: 0x5DE8, 1960: 0x62D2, 1961: 0x62E0, 1962: 0x6319, 1963: 0x6E20, 1964: 0x865A, 1965: 0x8A31, 1966: 0x8DDD, 1967: 0x92F8, 1968: 0x6F01, 1969: 0x79A6, 1970: 0x9B5A, 1971: 0x4EA8, 1972: 0x4EAB, 1973: 0x4EAC, 1974: 0x4F9B, 1975: 0x4FA0, 1976: 0x50D1, 1977: 0x5147, 1978: 0x7AF6, 1979: 0x5171, 1980: 0x51F6, 1981: 0x5354, 1982: 0x5321, 1983: 0x537F, 1984: 0x53EB, 1985: 0x55AC, 1986: 0x5883, 1987: 0x5CE1, 1988: 0x5F37, 1989: 0x5F4A, 1990: 0x602F, 1991: 0x6050, 1992: 0x606D, 1993: 0x631F, 1994: 0x6559, 1995: 0x6A4B, 1996: 0x6CC1, 1997: 0x72C2, 1998: 0x72ED, 1999: 0x77EF, 2000: 0x80F8, 2001: 0x8105, 2002: 0x8208, 2003: 0x854E, 2004: 0x90F7, 2005: 0x93E1, 2006: 0x97FF, 2007: 0x9957, 2008: 0x9A5A, 2009: 0x4EF0, 2010: 0x51DD, 2011: 0x5C2D, 2012: 0x6681, 2013: 0x696D, 2014: 0x5C40, 2015: 0x66F2, 2016: 0x6975, 2017: 0x7389, 2018: 0x6850, 2019: 0x7C81, 2020: 0x50C5, 2021: 0x52E4, 2022: 0x5747, 2023: 0x5DFE, 2024: 0x9326, 2025: 0x65A4, 2026: 0x6B23, 2027: 0x6B3D, 2028: 0x7434, 2029: 0x7981, 2030: 0x79BD, 2031: 0x7B4B, 2032: 0x7DCA, 2033: 0x82B9, 2034: 0x83CC, 2035: 0x887F, 2036: 0x895F, 2037: 0x8B39, 2038: 0x8FD1, 2039: 0x91D1, 2040: 0x541F, 2041: 0x9280, 2042: 0x4E5D, 2043: 0x5036, 2044: 0x53E5, 2045: 0x533A, 2046: 0x72D7, 2047: 0x7396, 2048: 0x77E9, 2049: 0x82E6, 2050: 0x8EAF, 2051: 0x99C6, 2052: 0x99C8, 2053: 0x99D2, 2054: 0x5177, 2055: 0x611A, 2056: 0x865E, 2057: 0x55B0, 2058: 0x7A7A, 2059: 0x5076, 2060: 0x5BD3, 2061: 0x9047, 2062: 0x9685, 2063: 0x4E32, 2064: 0x6ADB, 2065: 0x91E7, 2066: 0x5C51, 2067: 0x5C48, 2068: 0x6398, 2069: 0x7A9F, 2070: 0x6C93, 2071: 0x9774, 2072: 0x8F61, 2073: 0x7AAA, 2074: 0x718A, 2075: 0x9688, 2076: 0x7C82, 2077: 0x6817, 2078: 0x7E70, 2079: 0x6851, 2080: 0x936C, 2081: 0x52F2, 2082: 0x541B, 2083: 0x85AB, 2084: 0x8A13, 2085: 0x7FA4, 2086: 0x8ECD, 2087: 0x90E1, 2088: 0x5366, 2089: 0x8888, 2090: 0x7941, 2091: 0x4FC2, 2092: 0x50BE, 2093: 0x5211, 2094: 0x5144, 2095: 0x5553, 2096: 0x572D, 2097: 0x73EA, 2098: 0x578B, 2099: 0x5951, 2100: 0x5F62, 2101: 0x5F84, 2102: 0x6075, 2103: 0x6176, 2104: 0x6167, 2105: 0x61A9, 2106: 0x63B2, 2107: 0x643A, 2108: 0x656C, 2109: 0x666F, 2110: 0x6842, 2111: 0x6E13, 2112: 0x7566, 2113: 0x7A3D, 2114: 0x7CFB, 2115: 0x7D4C, 2116: 0x7D99, 2117: 0x7E4B, 2118: 0x7F6B, 2119: 0x830E, 2120: 0x834A, 2121: 0x86CD, 2122: 0x8A08, 2123: 0x8A63, 2124: 0x8B66, 2125: 0x8EFD, 2126: 0x981A, 2127: 0x9D8F, 2128: 0x82B8, 2129: 0x8FCE, 2130: 0x9BE8, 2131: 0x5287, 2132: 0x621F, 2133: 0x6483, 2134: 0x6FC0, 2135: 0x9699, 2136: 0x6841, 2137: 0x5091, 2138: 0x6B20, 2139: 0x6C7A, 2140: 0x6F54, 2141: 0x7A74, 2142: 0x7D50, 2143: 0x8840, 2144: 0x8A23, 2145: 0x6708, 2146: 0x4EF6, 2147: 0x5039, 2148: 0x5026, 2149: 0x5065, 2150: 0x517C, 2151: 0x5238, 2152: 0x5263, 2153: 0x55A7, 2154: 0x570F, 2155: 0x5805, 2156: 0x5ACC, 2157: 0x5EFA, 2158: 0x61B2, 2159: 0x61F8, 2160: 0x62F3, 2161: 0x6372, 2162: 0x691C, 2163: 0x6A29, 2164: 0x727D, 2165: 0x72AC, 2166: 0x732E, 2167: 0x7814, 2168: 0x786F, 2169: 0x7D79, 2170: 0x770C, 2171: 0x80A9, 2172: 0x898B, 2173: 0x8B19, 2174: 0x8CE2, 2175: 0x8ED2, 2176: 0x9063, 2177: 0x9375, 2178: 0x967A, 2179: 0x9855, 2180: 0x9A13, 2181: 0x9E78, 2182: 0x5143, 2183: 0x539F, 2184: 0x53B3, 2185: 0x5E7B, 2186: 0x5F26, 2187: 0x6E1B, 2188: 0x6E90, 2189: 0x7384, 2190: 0x73FE, 2191: 0x7D43, 2192: 0x8237, 2193: 0x8A00, 2194: 0x8AFA, 2195: 0x9650, 2196: 0x4E4E, 2197: 0x500B, 2198: 0x53E4, 2199: 0x547C, 2200: 0x56FA, 2201: 0x59D1, 2202: 0x5B64, 2203: 0x5DF1, 2204: 0x5EAB, 2205: 0x5F27, 2206: 0x6238, 2207: 0x6545, 2208: 0x67AF, 2209: 0x6E56, 2210: 0x72D0, 2211: 0x7CCA, 2212: 0x88B4, 2213: 0x80A1, 2214: 0x80E1, 2215: 0x83F0, 2216: 0x864E, 2217: 0x8A87, 2218: 0x8DE8, 2219: 0x9237, 2220: 0x96C7, 2221: 0x9867, 2222: 0x9F13, 2223: 0x4E94, 2224: 0x4E92, 2225: 0x4F0D, 2226: 0x5348, 2227: 0x5449, 2228: 0x543E, 2229: 0x5A2F, 2230: 0x5F8C, 2231: 0x5FA1, 2232: 0x609F, 2233: 0x68A7, 2234: 0x6A8E, 2235: 0x745A, 2236: 0x7881, 2237: 0x8A9E, 2238: 0x8AA4, 2239: 0x8B77, 2240: 0x9190, 2241: 0x4E5E, 2242: 0x9BC9, 2243: 0x4EA4, 2244: 0x4F7C, 2245: 0x4FAF, 2246: 0x5019, 2247: 0x5016, 2248: 0x5149, 2249: 0x516C, 2250: 0x529F, 2251: 0x52B9, 2252: 0x52FE, 2253: 0x539A, 2254: 0x53E3, 2255: 0x5411, 2256: 0x540E, 2257: 0x5589, 2258: 0x5751, 2259: 0x57A2, 2260: 0x597D, 2261: 0x5B54, 2262: 0x5B5D, 2263: 0x5B8F, 2264: 0x5DE5, 2265: 0x5DE7, 2266: 0x5DF7, 2267: 0x5E78, 2268: 0x5E83, 2269: 0x5E9A, 2270: 0x5EB7, 2271: 0x5F18, 2272: 0x6052, 2273: 0x614C, 2274: 0x6297, 2275: 0x62D8, 2276: 0x63A7, 2277: 0x653B, 2278: 0x6602, 2279: 0x6643, 2280: 0x66F4, 2281: 0x676D, 2282: 0x6821, 2283: 0x6897, 2284: 0x69CB, 2285: 0x6C5F, 2286: 0x6D2A, 2287: 0x6D69, 2288: 0x6E2F, 2289: 0x6E9D, 2290: 0x7532, 2291: 0x7687, 2292: 0x786C, 2293: 0x7A3F, 2294: 0x7CE0, 2295: 0x7D05, 2296: 0x7D18, 2297: 0x7D5E, 2298: 0x7DB1, 2299: 0x8015, 2300: 0x8003, 2301: 0x80AF, 2302: 0x80B1, 2303: 0x8154, 2304: 0x818F, 2305: 0x822A, 2306: 0x8352, 2307: 0x884C, 2308: 0x8861, 2309: 0x8B1B, 2310: 0x8CA2, 2311: 0x8CFC, 2312: 0x90CA, 2313: 0x9175, 2314: 0x9271, 2315: 0x783F, 2316: 0x92FC, 2317: 0x95A4, 2318: 0x964D, 2319: 0x9805, 2320: 0x9999, 2321: 0x9AD8, 2322: 0x9D3B, 2323: 0x525B, 2324: 0x52AB, 2325: 0x53F7, 2326: 0x5408, 2327: 0x58D5, 2328: 0x62F7, 2329: 0x6FE0, 2330: 0x8C6A, 2331: 0x8F5F, 2332: 0x9EB9, 2333: 0x514B, 2334: 0x523B, 2335: 0x544A, 2336: 0x56FD, 2337: 0x7A40, 2338: 0x9177, 2339: 0x9D60, 2340: 0x9ED2, 2341: 0x7344, 2342: 0x6F09, 2343: 0x8170, 2344: 0x7511, 2345: 0x5FFD, 2346: 0x60DA, 2347: 0x9AA8, 2348: 0x72DB, 2349: 0x8FBC, 2350: 0x6B64, 2351: 0x9803, 2352: 0x4ECA, 2353: 0x56F0, 2354: 0x5764, 2355: 0x58BE, 2356: 0x5A5A, 2357: 0x6068, 2358: 0x61C7, 2359: 0x660F, 2360: 0x6606, 2361: 0x6839, 2362: 0x68B1, 2363: 0x6DF7, 2364: 0x75D5, 2365: 0x7D3A, 2366: 0x826E, 2367: 0x9B42, 2368: 0x4E9B, 2369: 0x4F50, 2370: 0x53C9, 2371: 0x5506, 2372: 0x5D6F, 2373: 0x5DE6, 2374: 0x5DEE, 2375: 0x67FB, 2376: 0x6C99, 2377: 0x7473, 2378: 0x7802, 2379: 0x8A50, 2380: 0x9396, 2381: 0x88DF, 2382: 0x5750, 2383: 0x5EA7, 2384: 0x632B, 2385: 0x50B5, 2386: 0x50AC, 2387: 0x518D, 2388: 0x6700, 2389: 0x54C9, 2390: 0x585E, 2391: 0x59BB, 2392: 0x5BB0, 2393: 0x5F69, 2394: 0x624D, 2395: 0x63A1, 2396: 0x683D, 2397: 0x6B73, 2398: 0x6E08, 2399: 0x707D, 2400: 0x91C7, 2401: 0x7280, 2402: 0x7815, 2403: 0x7826, 2404: 0x796D, 2405: 0x658E, 2406: 0x7D30, 2407: 0x83DC, 2408: 0x88C1, 2409: 0x8F09, 2410: 0x969B, 2411: 0x5264, 2412: 0x5728, 2413: 0x6750, 2414: 0x7F6A, 2415: 0x8CA1, 2416: 0x51B4, 2417: 0x5742, 2418: 0x962A, 2419: 0x583A, 2420: 0x698A, 2421: 0x80B4, 2422: 0x54B2, 2423: 0x5D0E, 2424: 0x57FC, 2425: 0x7895, 2426: 0x9DFA, 2427: 0x4F5C, 2428: 0x524A, 2429: 0x548B, 2430: 0x643E, 2431: 0x6628, 2432: 0x6714, 2433: 0x67F5, 2434: 0x7A84, 2435: 0x7B56, 2436: 0x7D22, 2437: 0x932F, 2438: 0x685C, 2439: 0x9BAD, 2440: 0x7B39, 2441: 0x5319, 2442: 0x518A, 2443: 0x5237, 2444: 0x5BDF, 2445: 0x62F6, 2446: 0x64AE, 2447: 0x64E6, 2448: 0x672D, 2449: 0x6BBA, 2450: 0x85A9, 2451: 0x96D1, 2452: 0x7690, 2453: 0x9BD6, 2454: 0x634C, 2455: 0x9306, 2456: 0x9BAB, 2457: 0x76BF, 2458: 0x6652, 2459: 0x4E09, 2460: 0x5098, 2461: 0x53C2, 2462: 0x5C71, 2463: 0x60E8, 2464: 0x6492, 2465: 0x6563, 2466: 0x685F, 2467: 0x71E6, 2468: 0x73CA, 2469: 0x7523, 2470: 0x7B97, 2471: 0x7E82, 2472: 0x8695, 2473: 0x8B83, 2474: 0x8CDB, 2475: 0x9178, 2476: 0x9910, 2477: 0x65AC, 2478: 0x66AB, 2479: 0x6B8B, 2480: 0x4ED5, 2481: 0x4ED4, 2482: 0x4F3A, 2483: 0x4F7F, 2484: 0x523A, 2485: 0x53F8, 2486: 0x53F2, 2487: 0x55E3, 2488: 0x56DB, 2489: 0x58EB, 2490: 0x59CB, 2491: 0x59C9, 2492: 0x59FF, 2493: 0x5B50, 2494: 0x5C4D, 2495: 0x5E02, 2496: 0x5E2B, 2497: 0x5FD7, 2498: 0x601D, 2499: 0x6307, 2500: 0x652F, 2501: 0x5B5C, 2502: 0x65AF, 2503: 0x65BD, 2504: 0x65E8, 2505: 0x679D, 2506: 0x6B62, 2507: 0x6B7B, 2508: 0x6C0F, 2509: 0x7345, 2510: 0x7949, 2511: 0x79C1, 2512: 0x7CF8, 2513: 0x7D19, 2514: 0x7D2B, 2515: 0x80A2, 2516: 0x8102, 2517: 0x81F3, 2518: 0x8996, 2519: 0x8A5E, 2520: 0x8A69, 2521: 0x8A66, 2522: 0x8A8C, 2523: 0x8AEE, 2524: 0x8CC7, 2525: 0x8CDC, 2526: 0x96CC, 2527: 0x98FC, 2528: 0x6B6F, 2529: 0x4E8B, 2530: 0x4F3C, 2531: 0x4F8D, 2532: 0x5150, 2533: 0x5B57, 2534: 0x5BFA, 2535: 0x6148, 2536: 0x6301, 2537: 0x6642, 2538: 0x6B21, 2539: 0x6ECB, 2540: 0x6CBB, 2541: 0x723E, 2542: 0x74BD, 2543: 0x75D4, 2544: 0x78C1, 2545: 0x793A, 2546: 0x800C, 2547: 0x8033, 2548: 0x81EA, 2549: 0x8494, 2550: 0x8F9E, 2551: 0x6C50, 2552: 0x9E7F, 2553: 0x5F0F, 2554: 0x8B58, 2555: 0x9D2B, 2556: 0x7AFA, 2557: 0x8EF8, 2558: 0x5B8D, 2559: 0x96EB, 2560: 0x4E03, 2561: 0x53F1, 2562: 0x57F7, 2563: 0x5931, 2564: 0x5AC9, 2565: 0x5BA4, 2566: 0x6089, 2567: 0x6E7F, 2568: 0x6F06, 2569: 0x75BE, 2570: 0x8CEA, 2571: 0x5B9F, 2572: 0x8500, 2573: 0x7BE0, 2574: 0x5072, 2575: 0x67F4, 2576: 0x829D, 2577: 0x5C61, 2578: 0x854A, 2579: 0x7E1E, 2580: 0x820E, 2581: 0x5199, 2582: 0x5C04, 2583: 0x6368, 2584: 0x8D66, 2585: 0x659C, 2586: 0x716E, 2587: 0x793E, 2588: 0x7D17, 2589: 0x8005, 2590: 0x8B1D, 2591: 0x8ECA, 2592: 0x906E, 2593: 0x86C7, 2594: 0x90AA, 2595: 0x501F, 2596: 0x52FA, 2597: 0x5C3A, 2598: 0x6753, 2599: 0x707C, 2600: 0x7235, 2601: 0x914C, 2602: 0x91C8, 2603: 0x932B, 2604: 0x82E5, 2605: 0x5BC2, 2606: 0x5F31, 2607: 0x60F9, 2608: 0x4E3B, 2609: 0x53D6, 2610: 0x5B88, 2611: 0x624B, 2612: 0x6731, 2613: 0x6B8A, 2614: 0x72E9, 2615: 0x73E0, 2616: 0x7A2E, 2617: 0x816B, 2618: 0x8DA3, 2619: 0x9152, 2620: 0x9996, 2621: 0x5112, 2622: 0x53D7, 2623: 0x546A, 2624: 0x5BFF, 2625: 0x6388, 2626: 0x6A39, 2627: 0x7DAC, 2628: 0x9700, 2629: 0x56DA, 2630: 0x53CE, 2631: 0x5468, 2632: 0x5B97, 2633: 0x5C31, 2634: 0x5DDE, 2635: 0x4FEE, 2636: 0x6101, 2637: 0x62FE, 2638: 0x6D32, 2639: 0x79C0, 2640: 0x79CB, 2641: 0x7D42, 2642: 0x7E4D, 2643: 0x7FD2, 2644: 0x81ED, 2645: 0x821F, 2646: 0x8490, 2647: 0x8846, 2648: 0x8972, 2649: 0x8B90, 2650: 0x8E74, 2651: 0x8F2F, 2652: 0x9031, 2653: 0x914B, 2654: 0x916C, 2655: 0x96C6, 2656: 0x919C, 2657: 0x4EC0, 2658: 0x4F4F, 2659: 0x5145, 2660: 0x5341, 2661: 0x5F93, 2662: 0x620E, 2663: 0x67D4, 2664: 0x6C41, 2665: 0x6E0B, 2666: 0x7363, 2667: 0x7E26, 2668: 0x91CD, 2669: 0x9283, 2670: 0x53D4, 2671: 0x5919, 2672: 0x5BBF, 2673: 0x6DD1, 2674: 0x795D, 2675: 0x7E2E, 2676: 0x7C9B, 2677: 0x587E, 2678: 0x719F, 2679: 0x51FA, 2680: 0x8853, 2681: 0x8FF0, 2682: 0x4FCA, 2683: 0x5CFB, 2684: 0x6625, 2685: 0x77AC, 2686: 0x7AE3, 2687: 0x821C, 2688: 0x99FF, 2689: 0x51C6, 2690: 0x5FAA, 2691: 0x65EC, 2692: 0x696F, 2693: 0x6B89, 2694: 0x6DF3, 2695: 0x6E96, 2696: 0x6F64, 2697: 0x76FE, 2698: 0x7D14, 2699: 0x5DE1, 2700: 0x9075, 2701: 0x9187, 2702: 0x9806, 2703: 0x51E6, 2704: 0x521D, 2705: 0x6240, 2706: 0x6691, 2707: 0x66D9, 2708: 0x6E1A, 2709: 0x5EB6, 2710: 0x7DD2, 2711: 0x7F72, 2712: 0x66F8, 2713: 0x85AF, 2714: 0x85F7, 2715: 0x8AF8, 2716: 0x52A9, 2717: 0x53D9, 2718: 0x5973, 2719: 0x5E8F, 2720: 0x5F90, 2721: 0x6055, 2722: 0x92E4, 2723: 0x9664, 2724: 0x50B7, 2725: 0x511F, 2726: 0x52DD, 2727: 0x5320, 2728: 0x5347, 2729: 0x53EC, 2730: 0x54E8, 2731: 0x5546, 2732: 0x5531, 2733: 0x5617, 2734: 0x5968, 2735: 0x59BE, 2736: 0x5A3C, 2737: 0x5BB5, 2738: 0x5C06, 2739: 0x5C0F, 2740: 0x5C11, 2741: 0x5C1A, 2742: 0x5E84, 2743: 0x5E8A, 2744: 0x5EE0, 2745: 0x5F70, 2746: 0x627F, 2747: 0x6284, 2748: 0x62DB, 2749: 0x638C, 2750: 0x6377, 2751: 0x6607, 2752: 0x660C, 2753: 0x662D, 2754: 0x6676, 2755: 0x677E, 2756: 0x68A2, 2757: 0x6A1F, 2758: 0x6A35, 2759: 0x6CBC, 2760: 0x6D88, 2761: 0x6E09, 2762: 0x6E58, 2763: 0x713C, 2764: 0x7126, 2765: 0x7167, 2766: 0x75C7, 2767: 0x7701, 2768: 0x785D, 2769: 0x7901, 2770: 0x7965, 2771: 0x79F0, 2772: 0x7AE0, 2773: 0x7B11, 2774: 0x7CA7, 2775: 0x7D39, 2776: 0x8096, 2777: 0x83D6, 2778: 0x848B, 2779: 0x8549, 2780: 0x885D, 2781: 0x88F3, 2782: 0x8A1F, 2783: 0x8A3C, 2784: 0x8A54, 2785: 0x8A73, 2786: 0x8C61, 2787: 0x8CDE, 2788: 0x91A4, 2789: 0x9266, 2790: 0x937E, 2791: 0x9418, 2792: 0x969C, 2793: 0x9798, 2794: 0x4E0A, 2795: 0x4E08, 2796: 0x4E1E, 2797: 0x4E57, 2798: 0x5197, 2799: 0x5270, 2800: 0x57CE, 2801: 0x5834, 2802: 0x58CC, 2803: 0x5B22, 2804: 0x5E38, 2805: 0x60C5, 2806: 0x64FE, 2807: 0x6761, 2808: 0x6756, 2809: 0x6D44, 2810: 0x72B6, 2811: 0x7573, 2812: 0x7A63, 2813: 0x84B8, 2814: 0x8B72, 2815: 0x91B8, 2816: 0x9320, 2817: 0x5631, 2818: 0x57F4, 2819: 0x98FE, 2820: 0x62ED, 2821: 0x690D, 2822: 0x6B96, 2823: 0x71ED, 2824: 0x7E54, 2825: 0x8077, 2826: 0x8272, 2827: 0x89E6, 2828: 0x98DF, 2829: 0x8755, 2830: 0x8FB1, 2831: 0x5C3B, 2832: 0x4F38, 2833: 0x4FE1, 2834: 0x4FB5, 2835: 0x5507, 2836: 0x5A20, 2837: 0x5BDD, 2838: 0x5BE9, 2839: 0x5FC3, 2840: 0x614E, 2841: 0x632F, 2842: 0x65B0, 2843: 0x664B, 2844: 0x68EE, 2845: 0x699B, 2846: 0x6D78, 2847: 0x6DF1, 2848: 0x7533, 2849: 0x75B9, 2850: 0x771F, 2851: 0x795E, 2852: 0x79E6, 2853: 0x7D33, 2854: 0x81E3, 2855: 0x82AF, 2856: 0x85AA, 2857: 0x89AA, 2858: 0x8A3A, 2859: 0x8EAB, 2860: 0x8F9B, 2861: 0x9032, 2862: 0x91DD, 2863: 0x9707, 2864: 0x4EBA, 2865: 0x4EC1, 2866: 0x5203, 2867: 0x5875, 2868: 0x58EC, 2869: 0x5C0B, 2870: 0x751A, 2871: 0x5C3D, 2872: 0x814E, 2873: 0x8A0A, 2874: 0x8FC5, 2875: 0x9663, 2876: 0x976D, 2877: 0x7B25, 2878: 0x8ACF, 2879: 0x9808, 2880: 0x9162, 2881: 0x56F3, 2882: 0x53A8, 2883: 0x9017, 2884: 0x5439, 2885: 0x5782, 2886: 0x5E25, 2887: 0x63A8, 2888: 0x6C34, 2889: 0x708A, 2890: 0x7761, 2891: 0x7C8B, 2892: 0x7FE0, 2893: 0x8870, 2894: 0x9042, 2895: 0x9154, 2896: 0x9310, 2897: 0x9318, 2898: 0x968F, 2899: 0x745E, 2900: 0x9AC4, 2901: 0x5D07, 2902: 0x5D69, 2903: 0x6570, 2904: 0x67A2, 2905: 0x8DA8, 2906: 0x96DB, 2907: 0x636E, 2908: 0x6749, 2909: 0x6919, 2910: 0x83C5, 2911: 0x9817, 2912: 0x96C0, 2913: 0x88FE, 2914: 0x6F84, 2915: 0x647A, 2916: 0x5BF8, 2917: 0x4E16, 2918: 0x702C, 2919: 0x755D, 2920: 0x662F, 2921: 0x51C4, 2922: 0x5236, 2923: 0x52E2, 2924: 0x59D3, 2925: 0x5F81, 2926: 0x6027, 2927: 0x6210, 2928: 0x653F, 2929: 0x6574, 2930: 0x661F, 2931: 0x6674, 2932: 0x68F2, 2933: 0x6816, 2934: 0x6B63, 2935: 0x6E05, 2936: 0x7272, 2937: 0x751F, 2938: 0x76DB, 2939: 0x7CBE, 2940: 0x8056, 2941: 0x58F0, 2942: 0x88FD, 2943: 0x897F, 2944: 0x8AA0, 2945: 0x8A93, 2946: 0x8ACB, 2947: 0x901D, 2948: 0x9192, 2949: 0x9752, 2950: 0x9759, 2951: 0x6589, 2952: 0x7A0E, 2953: 0x8106, 2954: 0x96BB, 2955: 0x5E2D, 2956: 0x60DC, 2957: 0x621A, 2958: 0x65A5, 2959: 0x6614, 2960: 0x6790, 2961: 0x77F3, 2962: 0x7A4D, 2963: 0x7C4D, 2964: 0x7E3E, 2965: 0x810A, 2966: 0x8CAC, 2967: 0x8D64, 2968: 0x8DE1, 2969: 0x8E5F, 2970: 0x78A9, 2971: 0x5207, 2972: 0x62D9, 2973: 0x63A5, 2974: 0x6442, 2975: 0x6298, 2976: 0x8A2D, 2977: 0x7A83, 2978: 0x7BC0, 2979: 0x8AAC, 2980: 0x96EA, 2981: 0x7D76, 2982: 0x820C, 2983: 0x8749, 2984: 0x4ED9, 2985: 0x5148, 2986: 0x5343, 2987: 0x5360, 2988: 0x5BA3, 2989: 0x5C02, 2990: 0x5C16, 2991: 0x5DDD, 2992: 0x6226, 2993: 0x6247, 2994: 0x64B0, 2995: 0x6813, 2996: 0x6834, 2997: 0x6CC9, 2998: 0x6D45, 2999: 0x6D17, 3000: 0x67D3, 3001: 0x6F5C, 3002: 0x714E, 3003: 0x717D, 3004: 0x65CB, 3005: 0x7A7F, 3006: 0x7BAD, 3007: 0x7DDA, 3008: 0x7E4A, 3009: 0x7FA8, 3010: 0x817A, 3011: 0x821B, 3012: 0x8239, 3013: 0x85A6, 3014: 0x8A6E, 3015: 0x8CCE, 3016: 0x8DF5, 3017: 0x9078, 3018: 0x9077, 3019: 0x92AD, 3020: 0x9291, 3021: 0x9583, 3022: 0x9BAE, 3023: 0x524D, 3024: 0x5584, 3025: 0x6F38, 3026: 0x7136, 3027: 0x5168, 3028: 0x7985, 3029: 0x7E55, 3030: 0x81B3, 3031: 0x7CCE, 3032: 0x564C, 3033: 0x5851, 3034: 0x5CA8, 3035: 0x63AA, 3036: 0x66FE, 3037: 0x66FD, 3038: 0x695A, 3039: 0x72D9, 3040: 0x758F, 3041: 0x758E, 3042: 0x790E, 3043: 0x7956, 3044: 0x79DF, 3045: 0x7C97, 3046: 0x7D20, 3047: 0x7D44, 3048: 0x8607, 3049: 0x8A34, 3050: 0x963B, 3051: 0x9061, 3052: 0x9F20, 3053: 0x50E7, 3054: 0x5275, 3055: 0x53CC, 3056: 0x53E2, 3057: 0x5009, 3058: 0x55AA, 3059: 0x58EE, 3060: 0x594F, 3061: 0x723D, 3062: 0x5B8B, 3063: 0x5C64, 3064: 0x531D, 3065: 0x60E3, 3066: 0x60F3, 3067: 0x635C, 3068: 0x6383, 3069: 0x633F, 3070: 0x63BB, 3071: 0x64CD, 3072: 0x65E9, 3073: 0x66F9, 3074: 0x5DE3, 3075: 0x69CD, 3076: 0x69FD, 3077: 0x6F15, 3078: 0x71E5, 3079: 0x4E89, 3080: 0x75E9, 3081: 0x76F8, 3082: 0x7A93, 3083: 0x7CDF, 3084: 0x7DCF, 3085: 0x7D9C, 3086: 0x8061, 3087: 0x8349, 3088: 0x8358, 3089: 0x846C, 3090: 0x84BC, 3091: 0x85FB, 3092: 0x88C5, 3093: 0x8D70, 3094: 0x9001, 3095: 0x906D, 3096: 0x9397, 3097: 0x971C, 3098: 0x9A12, 3099: 0x50CF, 3100: 0x5897, 3101: 0x618E, 3102: 0x81D3, 3103: 0x8535, 3104: 0x8D08, 3105: 0x9020, 3106: 0x4FC3, 3107: 0x5074, 3108: 0x5247, 3109: 0x5373, 3110: 0x606F, 3111: 0x6349, 3112: 0x675F, 3113: 0x6E2C, 3114: 0x8DB3, 3115: 0x901F, 3116: 0x4FD7, 3117: 0x5C5E, 3118: 0x8CCA, 3119: 0x65CF, 3120: 0x7D9A, 3121: 0x5352, 3122: 0x8896, 3123: 0x5176, 3124: 0x63C3, 3125: 0x5B58, 3126: 0x5B6B, 3127: 0x5C0A, 3128: 0x640D, 3129: 0x6751, 3130: 0x905C, 3131: 0x4ED6, 3132: 0x591A, 3133: 0x592A, 3134: 0x6C70, 3135: 0x8A51, 3136: 0x553E, 3137: 0x5815, 3138: 0x59A5, 3139: 0x60F0, 3140: 0x6253, 3141: 0x67C1, 3142: 0x8235, 3143: 0x6955, 3144: 0x9640, 3145: 0x99C4, 3146: 0x9A28, 3147: 0x4F53, 3148: 0x5806, 3149: 0x5BFE, 3150: 0x8010, 3151: 0x5CB1, 3152: 0x5E2F, 3153: 0x5F85, 3154: 0x6020, 3155: 0x614B, 3156: 0x6234, 3157: 0x66FF, 3158: 0x6CF0, 3159: 0x6EDE, 3160: 0x80CE, 3161: 0x817F, 3162: 0x82D4, 3163: 0x888B, 3164: 0x8CB8, 3165: 0x9000, 3166: 0x902E, 3167: 0x968A, 3168: 0x9EDB, 3169: 0x9BDB, 3170: 0x4EE3, 3171: 0x53F0, 3172: 0x5927, 3173: 0x7B2C, 3174: 0x918D, 3175: 0x984C, 3176: 0x9DF9, 3177: 0x6EDD, 3178: 0x7027, 3179: 0x5353, 3180: 0x5544, 3181: 0x5B85, 3182: 0x6258, 3183: 0x629E, 3184: 0x62D3, 3185: 0x6CA2, 3186: 0x6FEF, 3187: 0x7422, 3188: 0x8A17, 3189: 0x9438, 3190: 0x6FC1, 3191: 0x8AFE, 3192: 0x8338, 3193: 0x51E7, 3194: 0x86F8, 3195: 0x53EA, 3196: 0x53E9, 3197: 0x4F46, 3198: 0x9054, 3199: 0x8FB0, 3200: 0x596A, 3201: 0x8131, 3202: 0x5DFD, 3203: 0x7AEA, 3204: 0x8FBF, 3205: 0x68DA, 3206: 0x8C37, 3207: 0x72F8, 3208: 0x9C48, 3209: 0x6A3D, 3210: 0x8AB0, 3211: 0x4E39, 3212: 0x5358, 3213: 0x5606, 3214: 0x5766, 3215: 0x62C5, 3216: 0x63A2, 3217: 0x65E6, 3218: 0x6B4E, 3219: 0x6DE1, 3220: 0x6E5B, 3221: 0x70AD, 3222: 0x77ED, 3223: 0x7AEF, 3224: 0x7BAA, 3225: 0x7DBB, 3226: 0x803D, 3227: 0x80C6, 3228: 0x86CB, 3229: 0x8A95, 3230: 0x935B, 3231: 0x56E3, 3232: 0x58C7, 3233: 0x5F3E, 3234: 0x65AD, 3235: 0x6696, 3236: 0x6A80, 3237: 0x6BB5, 3238: 0x7537, 3239: 0x8AC7, 3240: 0x5024, 3241: 0x77E5, 3242: 0x5730, 3243: 0x5F1B, 3244: 0x6065, 3245: 0x667A, 3246: 0x6C60, 3247: 0x75F4, 3248: 0x7A1A, 3249: 0x7F6E, 3250: 0x81F4, 3251: 0x8718, 3252: 0x9045, 3253: 0x99B3, 3254: 0x7BC9, 3255: 0x755C, 3256: 0x7AF9, 3257: 0x7B51, 3258: 0x84C4, 3259: 0x9010, 3260: 0x79E9, 3261: 0x7A92, 3262: 0x8336, 3263: 0x5AE1, 3264: 0x7740, 3265: 0x4E2D, 3266: 0x4EF2, 3267: 0x5B99, 3268: 0x5FE0, 3269: 0x62BD, 3270: 0x663C, 3271: 0x67F1, 3272: 0x6CE8, 3273: 0x866B, 3274: 0x8877, 3275: 0x8A3B, 3276: 0x914E, 3277: 0x92F3, 3278: 0x99D0, 3279: 0x6A17, 3280: 0x7026, 3281: 0x732A, 3282: 0x82E7, 3283: 0x8457, 3284: 0x8CAF, 3285: 0x4E01, 3286: 0x5146, 3287: 0x51CB, 3288: 0x558B, 3289: 0x5BF5, 3290: 0x5E16, 3291: 0x5E33, 3292: 0x5E81, 3293: 0x5F14, 3294: 0x5F35, 3295: 0x5F6B, 3296: 0x5FB4, 3297: 0x61F2, 3298: 0x6311, 3299: 0x66A2, 3300: 0x671D, 3301: 0x6F6E, 3302: 0x7252, 3303: 0x753A, 3304: 0x773A, 3305: 0x8074, 3306: 0x8139, 3307: 0x8178, 3308: 0x8776, 3309: 0x8ABF, 3310: 0x8ADC, 3311: 0x8D85, 3312: 0x8DF3, 3313: 0x929A, 3314: 0x9577, 3315: 0x9802, 3316: 0x9CE5, 3317: 0x52C5, 3318: 0x6357, 3319: 0x76F4, 3320: 0x6715, 3321: 0x6C88, 3322: 0x73CD, 3323: 0x8CC3, 3324: 0x93AE, 3325: 0x9673, 3326: 0x6D25, 3327: 0x589C, 3328: 0x690E, 3329: 0x69CC, 3330: 0x8FFD, 3331: 0x939A, 3332: 0x75DB, 3333: 0x901A, 3334: 0x585A, 3335: 0x6802, 3336: 0x63B4, 3337: 0x69FB, 3338: 0x4F43, 3339: 0x6F2C, 3340: 0x67D8, 3341: 0x8FBB, 3342: 0x8526, 3343: 0x7DB4, 3344: 0x9354, 3345: 0x693F, 3346: 0x6F70, 3347: 0x576A, 3348: 0x58F7, 3349: 0x5B2C, 3350: 0x7D2C, 3351: 0x722A, 3352: 0x540A, 3353: 0x91E3, 3354: 0x9DB4, 3355: 0x4EAD, 3356: 0x4F4E, 3357: 0x505C, 3358: 0x5075, 3359: 0x5243, 3360: 0x8C9E, 3361: 0x5448, 3362: 0x5824, 3363: 0x5B9A, 3364: 0x5E1D, 3365: 0x5E95, 3366: 0x5EAD, 3367: 0x5EF7, 3368: 0x5F1F, 3369: 0x608C, 3370: 0x62B5, 3371: 0x633A, 3372: 0x63D0, 3373: 0x68AF, 3374: 0x6C40, 3375: 0x7887, 3376: 0x798E, 3377: 0x7A0B, 3378: 0x7DE0, 3379: 0x8247, 3380: 0x8A02, 3381: 0x8AE6, 3382: 0x8E44, 3383: 0x9013, 3384: 0x90B8, 3385: 0x912D, 3386: 0x91D8, 3387: 0x9F0E, 3388: 0x6CE5, 3389: 0x6458, 3390: 0x64E2, 3391: 0x6575, 3392: 0x6EF4, 3393: 0x7684, 3394: 0x7B1B, 3395: 0x9069, 3396: 0x93D1, 3397: 0x6EBA, 3398: 0x54F2, 3399: 0x5FB9, 3400: 0x64A4, 3401: 0x8F4D, 3402: 0x8FED, 3403: 0x9244, 3404: 0x5178, 3405: 0x586B, 3406: 0x5929, 3407: 0x5C55, 3408: 0x5E97, 3409: 0x6DFB, 3410: 0x7E8F, 3411: 0x751C, 3412: 0x8CBC, 3413: 0x8EE2, 3414: 0x985B, 3415: 0x70B9, 3416: 0x4F1D, 3417: 0x6BBF, 3418: 0x6FB1, 3419: 0x7530, 3420: 0x96FB, 3421: 0x514E, 3422: 0x5410, 3423: 0x5835, 3424: 0x5857, 3425: 0x59AC, 3426: 0x5C60, 3427: 0x5F92, 3428: 0x6597, 3429: 0x675C, 3430: 0x6E21, 3431: 0x767B, 3432: 0x83DF, 3433: 0x8CED, 3434: 0x9014, 3435: 0x90FD, 3436: 0x934D, 3437: 0x7825, 3438: 0x783A, 3439: 0x52AA, 3440: 0x5EA6, 3441: 0x571F, 3442: 0x5974, 3443: 0x6012, 3444: 0x5012, 3445: 0x515A, 3446: 0x51AC, 3447: 0x51CD, 3448: 0x5200, 3449: 0x5510, 3450: 0x5854, 3451: 0x5858, 3452: 0x5957, 3453: 0x5B95, 3454: 0x5CF6, 3455: 0x5D8B, 3456: 0x60BC, 3457: 0x6295, 3458: 0x642D, 3459: 0x6771, 3460: 0x6843, 3461: 0x68BC, 3462: 0x68DF, 3463: 0x76D7, 3464: 0x6DD8, 3465: 0x6E6F, 3466: 0x6D9B, 3467: 0x706F, 3468: 0x71C8, 3469: 0x5F53, 3470: 0x75D8, 3471: 0x7977, 3472: 0x7B49, 3473: 0x7B54, 3474: 0x7B52, 3475: 0x7CD6, 3476: 0x7D71, 3477: 0x5230, 3478: 0x8463, 3479: 0x8569, 3480: 0x85E4, 3481: 0x8A0E, 3482: 0x8B04, 3483: 0x8C46, 3484: 0x8E0F, 3485: 0x9003, 3486: 0x900F, 3487: 0x9419, 3488: 0x9676, 3489: 0x982D, 3490: 0x9A30, 3491: 0x95D8, 3492: 0x50CD, 3493: 0x52D5, 3494: 0x540C, 3495: 0x5802, 3496: 0x5C0E, 3497: 0x61A7, 3498: 0x649E, 3499: 0x6D1E, 3500: 0x77B3, 3501: 0x7AE5, 3502: 0x80F4, 3503: 0x8404, 3504: 0x9053, 3505: 0x9285, 3506: 0x5CE0, 3507: 0x9D07, 3508: 0x533F, 3509: 0x5F97, 3510: 0x5FB3, 3511: 0x6D9C, 3512: 0x7279, 3513: 0x7763, 3514: 0x79BF, 3515: 0x7BE4, 3516: 0x6BD2, 3517: 0x72EC, 3518: 0x8AAD, 3519: 0x6803, 3520: 0x6A61, 3521: 0x51F8, 3522: 0x7A81, 3523: 0x6934, 3524: 0x5C4A, 3525: 0x9CF6, 3526: 0x82EB, 3527: 0x5BC5, 3528: 0x9149, 3529: 0x701E, 3530: 0x5678, 3531: 0x5C6F, 3532: 0x60C7, 3533: 0x6566, 3534: 0x6C8C, 3535: 0x8C5A, 3536: 0x9041, 3537: 0x9813, 3538: 0x5451, 3539: 0x66C7, 3540: 0x920D, 3541: 0x5948, 3542: 0x90A3, 3543: 0x5185, 3544: 0x4E4D, 3545: 0x51EA, 3546: 0x8599, 3547: 0x8B0E, 3548: 0x7058, 3549: 0x637A, 3550: 0x934B, 3551: 0x6962, 3552: 0x99B4, 3553: 0x7E04, 3554: 0x7577, 3555: 0x5357, 3556: 0x6960, 3557: 0x8EDF, 3558: 0x96E3, 3559: 0x6C5D, 3560: 0x4E8C, 3561: 0x5C3C, 3562: 0x5F10, 3563: 0x8FE9, 3564: 0x5302, 3565: 0x8CD1, 3566: 0x8089, 3567: 0x8679, 3568: 0x5EFF, 3569: 0x65E5, 3570: 0x4E73, 3571: 0x5165, 3572: 0x5982, 3573: 0x5C3F, 3574: 0x97EE, 3575: 0x4EFB, 3576: 0x598A, 3577: 0x5FCD, 3578: 0x8A8D, 3579: 0x6FE1, 3580: 0x79B0, 3581: 0x7962, 3582: 0x5BE7, 3583: 0x8471, 3584: 0x732B, 3585: 0x71B1, 3586: 0x5E74, 3587: 0x5FF5, 3588: 0x637B, 3589: 0x649A, 3590: 0x71C3, 3591: 0x7C98, 3592: 0x4E43, 3593: 0x5EFC, 3594: 0x4E4B, 3595: 0x57DC, 3596: 0x56A2, 3597: 0x60A9, 3598: 0x6FC3, 3599: 0x7D0D, 3600: 0x80FD, 3601: 0x8133, 3602: 0x81BF, 3603: 0x8FB2, 3604: 0x8997, 3605: 0x86A4, 3606: 0x5DF4, 3607: 0x628A, 3608: 0x64AD, 3609: 0x8987, 3610: 0x6777, 3611: 0x6CE2, 3612: 0x6D3E, 3613: 0x7436, 3614: 0x7834, 3615: 0x5A46, 3616: 0x7F75, 3617: 0x82AD, 3618: 0x99AC, 3619: 0x4FF3, 3620: 0x5EC3, 3621: 0x62DD, 3622: 0x6392, 3623: 0x6557, 3624: 0x676F, 3625: 0x76C3, 3626: 0x724C, 3627: 0x80CC, 3628: 0x80BA, 3629: 0x8F29, 3630: 0x914D, 3631: 0x500D, 3632: 0x57F9, 3633: 0x5A92, 3634: 0x6885, 3635: 0x6973, 3636: 0x7164, 3637: 0x72FD, 3638: 0x8CB7, 3639: 0x58F2, 3640: 0x8CE0, 3641: 0x966A, 3642: 0x9019, 3643: 0x877F, 3644: 0x79E4, 3645: 0x77E7, 3646: 0x8429, 3647: 0x4F2F, 3648: 0x5265, 3649: 0x535A, 3650: 0x62CD, 3651: 0x67CF, 3652: 0x6CCA, 3653: 0x767D, 3654: 0x7B94, 3655: 0x7C95, 3656: 0x8236, 3657: 0x8584, 3658: 0x8FEB, 3659: 0x66DD, 3660: 0x6F20, 3661: 0x7206, 3662: 0x7E1B, 3663: 0x83AB, 3664: 0x99C1, 3665: 0x9EA6, 3666: 0x51FD, 3667: 0x7BB1, 3668: 0x7872, 3669: 0x7BB8, 3670: 0x8087, 3671: 0x7B48, 3672: 0x6AE8, 3673: 0x5E61, 3674: 0x808C, 3675: 0x7551, 3676: 0x7560, 3677: 0x516B, 3678: 0x9262, 3679: 0x6E8C, 3680: 0x767A, 3681: 0x9197, 3682: 0x9AEA, 3683: 0x4F10, 3684: 0x7F70, 3685: 0x629C, 3686: 0x7B4F, 3687: 0x95A5, 3688: 0x9CE9, 3689: 0x567A, 3690: 0x5859, 3691: 0x86E4, 3692: 0x96BC, 3693: 0x4F34, 3694: 0x5224, 3695: 0x534A, 3696: 0x53CD, 3697: 0x53DB, 3698: 0x5E06, 3699: 0x642C, 3700: 0x6591, 3701: 0x677F, 3702: 0x6C3E, 3703: 0x6C4E, 3704: 0x7248, 3705: 0x72AF, 3706: 0x73ED, 3707: 0x7554, 3708: 0x7E41, 3709: 0x822C, 3710: 0x85E9, 3711: 0x8CA9, 3712: 0x7BC4, 3713: 0x91C6, 3714: 0x7169, 3715: 0x9812, 3716: 0x98EF, 3717: 0x633D, 3718: 0x6669, 3719: 0x756A, 3720: 0x76E4, 3721: 0x78D0, 3722: 0x8543, 3723: 0x86EE, 3724: 0x532A, 3725: 0x5351, 3726: 0x5426, 3727: 0x5983, 3728: 0x5E87, 3729: 0x5F7C, 3730: 0x60B2, 3731: 0x6249, 3732: 0x6279, 3733: 0x62AB, 3734: 0x6590, 3735: 0x6BD4, 3736: 0x6CCC, 3737: 0x75B2, 3738: 0x76AE, 3739: 0x7891, 3740: 0x79D8, 3741: 0x7DCB, 3742: 0x7F77, 3743: 0x80A5, 3744: 0x88AB, 3745: 0x8AB9, 3746: 0x8CBB, 3747: 0x907F, 3748: 0x975E, 3749: 0x98DB, 3750: 0x6A0B, 3751: 0x7C38, 3752: 0x5099, 3753: 0x5C3E, 3754: 0x5FAE, 3755: 0x6787, 3756: 0x6BD8, 3757: 0x7435, 3758: 0x7709, 3759: 0x7F8E, 3760: 0x9F3B, 3761: 0x67CA, 3762: 0x7A17, 3763: 0x5339, 3764: 0x758B, 3765: 0x9AED, 3766: 0x5F66, 3767: 0x819D, 3768: 0x83F1, 3769: 0x8098, 3770: 0x5F3C, 3771: 0x5FC5, 3772: 0x7562, 3773: 0x7B46, 3774: 0x903C, 3775: 0x6867, 3776: 0x59EB, 3777: 0x5A9B, 3778: 0x7D10, 3779: 0x767E, 3780: 0x8B2C, 3781: 0x4FF5, 3782: 0x5F6A, 3783: 0x6A19, 3784: 0x6C37, 3785: 0x6F02, 3786: 0x74E2, 3787: 0x7968, 3788: 0x8868, 3789: 0x8A55, 3790: 0x8C79, 3791: 0x5EDF, 3792: 0x63CF, 3793: 0x75C5, 3794: 0x79D2, 3795: 0x82D7, 3796: 0x9328, 3797: 0x92F2, 3798: 0x849C, 3799: 0x86ED, 3800: 0x9C2D, 3801: 0x54C1, 3802: 0x5F6C, 3803: 0x658C, 3804: 0x6D5C, 3805: 0x7015, 3806: 0x8CA7, 3807: 0x8CD3, 3808: 0x983B, 3809: 0x654F, 3810: 0x74F6, 3811: 0x4E0D, 3812: 0x4ED8, 3813: 0x57E0, 3814: 0x592B, 3815: 0x5A66, 3816: 0x5BCC, 3817: 0x51A8, 3818: 0x5E03, 3819: 0x5E9C, 3820: 0x6016, 3821: 0x6276, 3822: 0x6577, 3823: 0x65A7, 3824: 0x666E, 3825: 0x6D6E, 3826: 0x7236, 3827: 0x7B26, 3828: 0x8150, 3829: 0x819A, 3830: 0x8299, 3831: 0x8B5C, 3832: 0x8CA0, 3833: 0x8CE6, 3834: 0x8D74, 3835: 0x961C, 3836: 0x9644, 3837: 0x4FAE, 3838: 0x64AB, 3839: 0x6B66, 3840: 0x821E, 3841: 0x8461, 3842: 0x856A, 3843: 0x90E8, 3844: 0x5C01, 3845: 0x6953, 3846: 0x98A8, 3847: 0x847A, 3848: 0x8557, 3849: 0x4F0F, 3850: 0x526F, 3851: 0x5FA9, 3852: 0x5E45, 3853: 0x670D, 3854: 0x798F, 3855: 0x8179, 3856: 0x8907, 3857: 0x8986, 3858: 0x6DF5, 3859: 0x5F17, 3860: 0x6255, 3861: 0x6CB8, 3862: 0x4ECF, 3863: 0x7269, 3864: 0x9B92, 3865: 0x5206, 3866: 0x543B, 3867: 0x5674, 3868: 0x58B3, 3869: 0x61A4, 3870: 0x626E, 3871: 0x711A, 3872: 0x596E, 3873: 0x7C89, 3874: 0x7CDE, 3875: 0x7D1B, 3876: 0x96F0, 3877: 0x6587, 3878: 0x805E, 3879: 0x4E19, 3880: 0x4F75, 3881: 0x5175, 3882: 0x5840, 3883: 0x5E63, 3884: 0x5E73, 3885: 0x5F0A, 3886: 0x67C4, 3887: 0x4E26, 3888: 0x853D, 3889: 0x9589, 3890: 0x965B, 3891: 0x7C73, 3892: 0x9801, 3893: 0x50FB, 3894: 0x58C1, 3895: 0x7656, 3896: 0x78A7, 3897: 0x5225, 3898: 0x77A5, 3899: 0x8511, 3900: 0x7B86, 3901: 0x504F, 3902: 0x5909, 3903: 0x7247, 3904: 0x7BC7, 3905: 0x7DE8, 3906: 0x8FBA, 3907: 0x8FD4, 3908: 0x904D, 3909: 0x4FBF, 3910: 0x52C9, 3911: 0x5A29, 3912: 0x5F01, 3913: 0x97AD, 3914: 0x4FDD, 3915: 0x8217, 3916: 0x92EA, 3917: 0x5703, 3918: 0x6355, 3919: 0x6B69, 3920: 0x752B, 3921: 0x88DC, 3922: 0x8F14, 3923: 0x7A42, 3924: 0x52DF, 3925: 0x5893, 3926: 0x6155, 3927: 0x620A, 3928: 0x66AE, 3929: 0x6BCD, 3930: 0x7C3F, 3931: 0x83E9, 3932: 0x5023, 3933: 0x4FF8, 3934: 0x5305, 3935: 0x5446, 3936: 0x5831, 3937: 0x5949, 3938: 0x5B9D, 3939: 0x5CF0, 3940: 0x5CEF, 3941: 0x5D29, 3942: 0x5E96, 3943: 0x62B1, 3944: 0x6367, 3945: 0x653E, 3946: 0x65B9, 3947: 0x670B, 3948: 0x6CD5, 3949: 0x6CE1, 3950: 0x70F9, 3951: 0x7832, 3952: 0x7E2B, 3953: 0x80DE, 3954: 0x82B3, 3955: 0x840C, 3956: 0x84EC, 3957: 0x8702, 3958: 0x8912, 3959: 0x8A2A, 3960: 0x8C4A, 3961: 0x90A6, 3962: 0x92D2, 3963: 0x98FD, 3964: 0x9CF3, 3965: 0x9D6C, 3966: 0x4E4F, 3967: 0x4EA1, 3968: 0x508D, 3969: 0x5256, 3970: 0x574A, 3971: 0x59A8, 3972: 0x5E3D, 3973: 0x5FD8, 3974: 0x5FD9, 3975: 0x623F, 3976: 0x66B4, 3977: 0x671B, 3978: 0x67D0, 3979: 0x68D2, 3980: 0x5192, 3981: 0x7D21, 3982: 0x80AA, 3983: 0x81A8, 3984: 0x8B00, 3985: 0x8C8C, 3986: 0x8CBF, 3987: 0x927E, 3988: 0x9632, 3989: 0x5420, 3990: 0x982C, 3991: 0x5317, 3992: 0x50D5, 3993: 0x535C, 3994: 0x58A8, 3995: 0x64B2, 3996: 0x6734, 3997: 0x7267, 3998: 0x7766, 3999: 0x7A46, 4000: 0x91E6, 4001: 0x52C3, 4002: 0x6CA1, 4003: 0x6B86, 4004: 0x5800, 4005: 0x5E4C, 4006: 0x5954, 4007: 0x672C, 4008: 0x7FFB, 4009: 0x51E1, 4010: 0x76C6, 4011: 0x6469, 4012: 0x78E8, 4013: 0x9B54, 4014: 0x9EBB, 4015: 0x57CB, 4016: 0x59B9, 4017: 0x6627, 4018: 0x679A, 4019: 0x6BCE, 4020: 0x54E9, 4021: 0x69D9, 4022: 0x5E55, 4023: 0x819C, 4024: 0x6795, 4025: 0x9BAA, 4026: 0x67FE, 4027: 0x9C52, 4028: 0x685D, 4029: 0x4EA6, 4030: 0x4FE3, 4031: 0x53C8, 4032: 0x62B9, 4033: 0x672B, 4034: 0x6CAB, 4035: 0x8FC4, 4036: 0x4FAD, 4037: 0x7E6D, 4038: 0x9EBF, 4039: 0x4E07, 4040: 0x6162, 4041: 0x6E80, 4042: 0x6F2B, 4043: 0x8513, 4044: 0x5473, 4045: 0x672A, 4046: 0x9B45, 4047: 0x5DF3, 4048: 0x7B95, 4049: 0x5CAC, 4050: 0x5BC6, 4051: 0x871C, 4052: 0x6E4A, 4053: 0x84D1, 4054: 0x7A14, 4055: 0x8108, 4056: 0x5999, 4057: 0x7C8D, 4058: 0x6C11, 4059: 0x7720, 4060: 0x52D9, 4061: 0x5922, 4062: 0x7121, 4063: 0x725F, 4064: 0x77DB, 4065: 0x9727, 4066: 0x9D61, 4067: 0x690B, 4068: 0x5A7F, 4069: 0x5A18, 4070: 0x51A5, 4071: 0x540D, 4072: 0x547D, 4073: 0x660E, 4074: 0x76DF, 4075: 0x8FF7, 4076: 0x9298, 4077: 0x9CF4, 4078: 0x59EA, 4079: 0x725D, 4080: 0x6EC5, 4081: 0x514D, 4082: 0x68C9, 4083: 0x7DBF, 4084: 0x7DEC, 4085: 0x9762, 4086: 0x9EBA, 4087: 0x6478, 4088: 0x6A21, 4089: 0x8302, 4090: 0x5984, 4091: 0x5B5F, 4092: 0x6BDB, 4093: 0x731B, 4094: 0x76F2, 4095: 0x7DB2, 4096: 0x8017, 4097: 0x8499, 4098: 0x5132, 4099: 0x6728, 4100: 0x9ED9, 4101: 0x76EE, 4102: 0x6762, 4103: 0x52FF, 4104: 0x9905, 4105: 0x5C24, 4106: 0x623B, 4107: 0x7C7E, 4108: 0x8CB0, 4109: 0x554F, 4110: 0x60B6, 4111: 0x7D0B, 4112: 0x9580, 4113: 0x5301, 4114: 0x4E5F, 4115: 0x51B6, 4116: 0x591C, 4117: 0x723A, 4118: 0x8036, 4119: 0x91CE, 4120: 0x5F25, 4121: 0x77E2, 4122: 0x5384, 4123: 0x5F79, 4124: 0x7D04, 4125: 0x85AC, 4126: 0x8A33, 4127: 0x8E8D, 4128: 0x9756, 4129: 0x67F3, 4130: 0x85AE, 4131: 0x9453, 4132: 0x6109, 4133: 0x6108, 4134: 0x6CB9, 4135: 0x7652, 4136: 0x8AED, 4137: 0x8F38, 4138: 0x552F, 4139: 0x4F51, 4140: 0x512A, 4141: 0x52C7, 4142: 0x53CB, 4143: 0x5BA5, 4144: 0x5E7D, 4145: 0x60A0, 4146: 0x6182, 4147: 0x63D6, 4148: 0x6709, 4149: 0x67DA, 4150: 0x6E67, 4151: 0x6D8C, 4152: 0x7336, 4153: 0x7337, 4154: 0x7531, 4155: 0x7950, 4156: 0x88D5, 4157: 0x8A98, 4158: 0x904A, 4159: 0x9091, 4160: 0x90F5, 4161: 0x96C4, 4162: 0x878D, 4163: 0x5915, 4164: 0x4E88, 4165: 0x4F59, 4166: 0x4E0E, 4167: 0x8A89, 4168: 0x8F3F, 4169: 0x9810, 4170: 0x50AD, 4171: 0x5E7C, 4172: 0x5996, 4173: 0x5BB9, 4174: 0x5EB8, 4175: 0x63DA, 4176: 0x63FA, 4177: 0x64C1, 4178: 0x66DC, 4179: 0x694A, 4180: 0x69D8, 4181: 0x6D0B, 4182: 0x6EB6, 4183: 0x7194, 4184: 0x7528, 4185: 0x7AAF, 4186: 0x7F8A, 4187: 0x8000, 4188: 0x8449, 4189: 0x84C9, 4190: 0x8981, 4191: 0x8B21, 4192: 0x8E0A, 4193: 0x9065, 4194: 0x967D, 4195: 0x990A, 4196: 0x617E, 4197: 0x6291, 4198: 0x6B32, 4199: 0x6C83, 4200: 0x6D74, 4201: 0x7FCC, 4202: 0x7FFC, 4203: 0x6DC0, 4204: 0x7F85, 4205: 0x87BA, 4206: 0x88F8, 4207: 0x6765, 4208: 0x83B1, 4209: 0x983C, 4210: 0x96F7, 4211: 0x6D1B, 4212: 0x7D61, 4213: 0x843D, 4214: 0x916A, 4215: 0x4E71, 4216: 0x5375, 4217: 0x5D50, 4218: 0x6B04, 4219: 0x6FEB, 4220: 0x85CD, 4221: 0x862D, 4222: 0x89A7, 4223: 0x5229, 4224: 0x540F, 4225: 0x5C65, 4226: 0x674E, 4227: 0x68A8, 4228: 0x7406, 4229: 0x7483, 4230: 0x75E2, 4231: 0x88CF, 4232: 0x88E1, 4233: 0x91CC, 4234: 0x96E2, 4235: 0x9678, 4236: 0x5F8B, 4237: 0x7387, 4238: 0x7ACB, 4239: 0x844E, 4240: 0x63A0, 4241: 0x7565, 4242: 0x5289, 4243: 0x6D41, 4244: 0x6E9C, 4245: 0x7409, 4246: 0x7559, 4247: 0x786B, 4248: 0x7C92, 4249: 0x9686, 4250: 0x7ADC, 4251: 0x9F8D, 4252: 0x4FB6, 4253: 0x616E, 4254: 0x65C5, 4255: 0x865C, 4256: 0x4E86, 4257: 0x4EAE, 4258: 0x50DA, 4259: 0x4E21, 4260: 0x51CC, 4261: 0x5BEE, 4262: 0x6599, 4263: 0x6881, 4264: 0x6DBC, 4265: 0x731F, 4266: 0x7642, 4267: 0x77AD, 4268: 0x7A1C, 4269: 0x7CE7, 4270: 0x826F, 4271: 0x8AD2, 4272: 0x907C, 4273: 0x91CF, 4274: 0x9675, 4275: 0x9818, 4276: 0x529B, 4277: 0x7DD1, 4278: 0x502B, 4279: 0x5398, 4280: 0x6797, 4281: 0x6DCB, 4282: 0x71D0, 4283: 0x7433, 4284: 0x81E8, 4285: 0x8F2A, 4286: 0x96A3, 4287: 0x9C57, 4288: 0x9E9F, 4289: 0x7460, 4290: 0x5841, 4291: 0x6D99, 4292: 0x7D2F, 4293: 0x985E, 4294: 0x4EE4, 4295: 0x4F36, 4296: 0x4F8B, 4297: 0x51B7, 4298: 0x52B1, 4299: 0x5DBA, 4300: 0x601C, 4301: 0x73B2, 4302: 0x793C, 4303: 0x82D3, 4304: 0x9234, 4305: 0x96B7, 4306: 0x96F6, 4307: 0x970A, 4308: 0x9E97, 4309: 0x9F62, 4310: 0x66A6, 4311: 0x6B74, 4312: 0x5217, 4313: 0x52A3, 4314: 0x70C8, 4315: 0x88C2, 4316: 0x5EC9, 4317: 0x604B, 4318: 0x6190, 4319: 0x6F23, 4320: 0x7149, 4321: 0x7C3E, 4322: 0x7DF4, 4323: 0x806F, 4324: 0x84EE, 4325: 0x9023, 4326: 0x932C, 4327: 0x5442, 4328: 0x9B6F, 4329: 0x6AD3, 4330: 0x7089, 4331: 0x8CC2, 4332: 0x8DEF, 4333: 0x9732, 4334: 0x52B4, 4335: 0x5A41, 4336: 0x5ECA, 4337: 0x5F04, 4338: 0x6717, 4339: 0x697C, 4340: 0x6994, 4341: 0x6D6A, 4342: 0x6F0F, 4343: 0x7262, 4344: 0x72FC, 4345: 0x7BED, 4346: 0x8001, 4347: 0x807E, 4348: 0x874B, 4349: 0x90CE, 4350: 0x516D, 4351: 0x9E93, 4352: 0x7984, 4353: 0x808B, 4354: 0x9332, 4355: 0x8AD6, 4356: 0x502D, 4357: 0x548C, 4358: 0x8A71, 4359: 0x6B6A, 4360: 0x8CC4, 4361: 0x8107, 4362: 0x60D1, 4363: 0x67A0, 4364: 0x9DF2, 4365: 0x4E99, 4366: 0x4E98, 4367: 0x9C10, 4368: 0x8A6B, 4369: 0x85C1, 4370: 0x8568, 4371: 0x6900, 4372: 0x6E7E, 4373: 0x7897, 4374: 0x8155, 4418: 0x5F0C, 4419: 0x4E10, 4420: 0x4E15, 4421: 0x4E2A, 4422: 0x4E31, 4423: 0x4E36, 4424: 0x4E3C, 4425: 0x4E3F, 4426: 0x4E42, 4427: 0x4E56, 4428: 0x4E58, 4429: 0x4E82, 4430: 0x4E85, 4431: 0x8C6B, 4432: 0x4E8A, 4433: 0x8212, 4434: 0x5F0D, 4435: 0x4E8E, 4436: 0x4E9E, 4437: 0x4E9F, 4438: 0x4EA0, 4439: 0x4EA2, 4440: 0x4EB0, 4441: 0x4EB3, 4442: 0x4EB6, 4443: 0x4ECE, 4444: 0x4ECD, 4445: 0x4EC4, 4446: 0x4EC6, 4447: 0x4EC2, 4448: 0x4ED7, 4449: 0x4EDE, 4450: 0x4EED, 4451: 0x4EDF, 4452: 0x4EF7, 4453: 0x4F09, 4454: 0x4F5A, 4455: 0x4F30, 4456: 0x4F5B, 4457: 0x4F5D, 4458: 0x4F57, 4459: 0x4F47, 4460: 0x4F76, 4461: 0x4F88, 4462: 0x4F8F, 4463: 0x4F98, 4464: 0x4F7B, 4465: 0x4F69, 4466: 0x4F70, 4467: 0x4F91, 4468: 0x4F6F, 4469: 0x4F86, 4470: 0x4F96, 4471: 0x5118, 4472: 0x4FD4, 4473: 0x4FDF, 4474: 0x4FCE, 4475: 0x4FD8, 4476: 0x4FDB, 4477: 0x4FD1, 4478: 0x4FDA, 4479: 0x4FD0, 4480: 0x4FE4, 4481: 0x4FE5, 4482: 0x501A, 4483: 0x5028, 4484: 0x5014, 4485: 0x502A, 4486: 0x5025, 4487: 0x5005, 4488: 0x4F1C, 4489: 0x4FF6, 4490: 0x5021, 4491: 0x5029, 4492: 0x502C, 4493: 0x4FFE, 4494: 0x4FEF, 4495: 0x5011, 4496: 0x5006, 4497: 0x5043, 4498: 0x5047, 4499: 0x6703, 4500: 0x5055, 4501: 0x5050, 4502: 0x5048, 4503: 0x505A, 4504: 0x5056, 4505: 0x506C, 4506: 0x5078, 4507: 0x5080, 4508: 0x509A, 4509: 0x5085, 4510: 0x50B4, 4511: 0x50B2, 4512: 0x50C9, 4513: 0x50CA, 4514: 0x50B3, 4515: 0x50C2, 4516: 0x50D6, 4517: 0x50DE, 4518: 0x50E5, 4519: 0x50ED, 4520: 0x50E3, 4521: 0x50EE, 4522: 0x50F9, 4523: 0x50F5, 4524: 0x5109, 4525: 0x5101, 4526: 0x5102, 4527: 0x5116, 4528: 0x5115, 4529: 0x5114, 4530: 0x511A, 4531: 0x5121, 4532: 0x513A, 4533: 0x5137, 4534: 0x513C, 4535: 0x513B, 4536: 0x513F, 4537: 0x5140, 4538: 0x5152, 4539: 0x514C, 4540: 0x5154, 4541: 0x5162, 4542: 0x7AF8, 4543: 0x5169, 4544: 0x516A, 4545: 0x516E, 4546: 0x5180, 4547: 0x5182, 4548: 0x56D8, 4549: 0x518C, 4550: 0x5189, 4551: 0x518F, 4552: 0x5191, 4553: 0x5193, 4554: 0x5195, 4555: 0x5196, 4556: 0x51A4, 4557: 0x51A6, 4558: 0x51A2, 4559: 0x51A9, 4560: 0x51AA, 4561: 0x51AB, 4562: 0x51B3, 4563: 0x51B1, 4564: 0x51B2, 4565: 0x51B0, 4566: 0x51B5, 4567: 0x51BD, 4568: 0x51C5, 4569: 0x51C9, 4570: 0x51DB, 4571: 0x51E0, 4572: 0x8655, 4573: 0x51E9, 4574: 0x51ED, 4575: 0x51F0, 4576: 0x51F5, 4577: 0x51FE, 4578: 0x5204, 4579: 0x520B, 4580: 0x5214, 4581: 0x520E, 4582: 0x5227, 4583: 0x522A, 4584: 0x522E, 4585: 0x5233, 4586: 0x5239, 4587: 0x524F, 4588: 0x5244, 4589: 0x524B, 4590: 0x524C, 4591: 0x525E, 4592: 0x5254, 4593: 0x526A, 4594: 0x5274, 4595: 0x5269, 4596: 0x5273, 4597: 0x527F, 4598: 0x527D, 4599: 0x528D, 4600: 0x5294, 4601: 0x5292, 4602: 0x5271, 4603: 0x5288, 4604: 0x5291, 4605: 0x8FA8, 4606: 0x8FA7, 4607: 0x52AC, 4608: 0x52AD, 4609: 0x52BC, 4610: 0x52B5, 4611: 0x52C1, 4612: 0x52CD, 4613: 0x52D7, 4614: 0x52DE, 4615: 0x52E3, 4616: 0x52E6, 4617: 0x98ED, 4618: 0x52E0, 4619: 0x52F3, 4620: 0x52F5, 4621: 0x52F8, 4622: 0x52F9, 4623: 0x5306, 4624: 0x5308, 4625: 0x7538, 4626: 0x530D, 4627: 0x5310, 4628: 0x530F, 4629: 0x5315, 4630: 0x531A, 4631: 0x5323, 4632: 0x532F, 4633: 0x5331, 4634: 0x5333, 4635: 0x5338, 4636: 0x5340, 4637: 0x5346, 4638: 0x5345, 4639: 0x4E17, 4640: 0x5349, 4641: 0x534D, 4642: 0x51D6, 4643: 0x535E, 4644: 0x5369, 4645: 0x536E, 4646: 0x5918, 4647: 0x537B, 4648: 0x5377, 4649: 0x5382, 4650: 0x5396, 4651: 0x53A0, 4652: 0x53A6, 4653: 0x53A5, 4654: 0x53AE, 4655: 0x53B0, 4656: 0x53B6, 4657: 0x53C3, 4658: 0x7C12, 4659: 0x96D9, 4660: 0x53DF, 4661: 0x66FC, 4662: 0x71EE, 4663: 0x53EE, 4664: 0x53E8, 4665: 0x53ED, 4666: 0x53FA, 4667: 0x5401, 4668: 0x543D, 4669: 0x5440, 4670: 0x542C, 4671: 0x542D, 4672: 0x543C, 4673: 0x542E, 4674: 0x5436, 4675: 0x5429, 4676: 0x541D, 4677: 0x544E, 4678: 0x548F, 4679: 0x5475, 4680: 0x548E, 4681: 0x545F, 4682: 0x5471, 4683: 0x5477, 4684: 0x5470, 4685: 0x5492, 4686: 0x547B, 4687: 0x5480, 4688: 0x5476, 4689: 0x5484, 4690: 0x5490, 4691: 0x5486, 4692: 0x54C7, 4693: 0x54A2, 4694: 0x54B8, 4695: 0x54A5, 4696: 0x54AC, 4697: 0x54C4, 4698: 0x54C8, 4699: 0x54A8, 4700: 0x54AB, 4701: 0x54C2, 4702: 0x54A4, 4703: 0x54BE, 4704: 0x54BC, 4705: 0x54D8, 4706: 0x54E5, 4707: 0x54E6, 4708: 0x550F, 4709: 0x5514, 4710: 0x54FD, 4711: 0x54EE, 4712: 0x54ED, 4713: 0x54FA, 4714: 0x54E2, 4715: 0x5539, 4716: 0x5540, 4717: 0x5563, 4718: 0x554C, 4719: 0x552E, 4720: 0x555C, 4721: 0x5545, 4722: 0x5556, 4723: 0x5557, 4724: 0x5538, 4725: 0x5533, 4726: 0x555D, 4727: 0x5599, 4728: 0x5580, 4729: 0x54AF, 4730: 0x558A, 4731: 0x559F, 4732: 0x557B, 4733: 0x557E, 4734: 0x5598, 4735: 0x559E, 4736: 0x55AE, 4737: 0x557C, 4738: 0x5583, 4739: 0x55A9, 4740: 0x5587, 4741: 0x55A8, 4742: 0x55DA, 4743: 0x55C5, 4744: 0x55DF, 4745: 0x55C4, 4746: 0x55DC, 4747: 0x55E4, 4748: 0x55D4, 4749: 0x5614, 4750: 0x55F7, 4751: 0x5616, 4752: 0x55FE, 4753: 0x55FD, 4754: 0x561B, 4755: 0x55F9, 4756: 0x564E, 4757: 0x5650, 4758: 0x71DF, 4759: 0x5634, 4760: 0x5636, 4761: 0x5632, 4762: 0x5638, 4763: 0x566B, 4764: 0x5664, 4765: 0x562F, 4766: 0x566C, 4767: 0x566A, 4768: 0x5686, 4769: 0x5680, 4770: 0x568A, 4771: 0x56A0, 4772: 0x5694, 4773: 0x568F, 4774: 0x56A5, 4775: 0x56AE, 4776: 0x56B6, 4777: 0x56B4, 4778: 0x56C2, 4779: 0x56BC, 4780: 0x56C1, 4781: 0x56C3, 4782: 0x56C0, 4783: 0x56C8, 4784: 0x56CE, 4785: 0x56D1, 4786: 0x56D3, 4787: 0x56D7, 4788: 0x56EE, 4789: 0x56F9, 4790: 0x5700, 4791: 0x56FF, 4792: 0x5704, 4793: 0x5709, 4794: 0x5708, 4795: 0x570B, 4796: 0x570D, 4797: 0x5713, 4798: 0x5718, 4799: 0x5716, 4800: 0x55C7, 4801: 0x571C, 4802: 0x5726, 4803: 0x5737, 4804: 0x5738, 4805: 0x574E, 4806: 0x573B, 4807: 0x5740, 4808: 0x574F, 4809: 0x5769, 4810: 0x57C0, 4811: 0x5788, 4812: 0x5761, 4813: 0x577F, 4814: 0x5789, 4815: 0x5793, 4816: 0x57A0, 4817: 0x57B3, 4818: 0x57A4, 4819: 0x57AA, 4820: 0x57B0, 4821: 0x57C3, 4822: 0x57C6, 4823: 0x57D4, 4824: 0x57D2, 4825: 0x57D3, 4826: 0x580A, 4827: 0x57D6, 4828: 0x57E3, 4829: 0x580B, 4830: 0x5819, 4831: 0x581D, 4832: 0x5872, 4833: 0x5821, 4834: 0x5862, 4835: 0x584B, 4836: 0x5870, 4837: 0x6BC0, 4838: 0x5852, 4839: 0x583D, 4840: 0x5879, 4841: 0x5885, 4842: 0x58B9, 4843: 0x589F, 4844: 0x58AB, 4845: 0x58BA, 4846: 0x58DE, 4847: 0x58BB, 4848: 0x58B8, 4849: 0x58AE, 4850: 0x58C5, 4851: 0x58D3, 4852: 0x58D1, 4853: 0x58D7, 4854: 0x58D9, 4855: 0x58D8, 4856: 0x58E5, 4857: 0x58DC, 4858: 0x58E4, 4859: 0x58DF, 4860: 0x58EF, 4861: 0x58FA, 4862: 0x58F9, 4863: 0x58FB, 4864: 0x58FC, 4865: 0x58FD, 4866: 0x5902, 4867: 0x590A, 4868: 0x5910, 4869: 0x591B, 4870: 0x68A6, 4871: 0x5925, 4872: 0x592C, 4873: 0x592D, 4874: 0x5932, 4875: 0x5938, 4876: 0x593E, 4877: 0x7AD2, 4878: 0x5955, 4879: 0x5950, 4880: 0x594E, 4881: 0x595A, 4882: 0x5958, 4883: 0x5962, 4884: 0x5960, 4885: 0x5967, 4886: 0x596C, 4887: 0x5969, 4888: 0x5978, 4889: 0x5981, 4890: 0x599D, 4891: 0x4F5E, 4892: 0x4FAB, 4893: 0x59A3, 4894: 0x59B2, 4895: 0x59C6, 4896: 0x59E8, 4897: 0x59DC, 4898: 0x598D, 4899: 0x59D9, 4900: 0x59DA, 4901: 0x5A25, 4902: 0x5A1F, 4903: 0x5A11, 4904: 0x5A1C, 4905: 0x5A09, 4906: 0x5A1A, 4907: 0x5A40, 4908: 0x5A6C, 4909: 0x5A49, 4910: 0x5A35, 4911: 0x5A36, 4912: 0x5A62, 4913: 0x5A6A, 4914: 0x5A9A, 4915: 0x5ABC, 4916: 0x5ABE, 4917: 0x5ACB, 4918: 0x5AC2, 4919: 0x5ABD, 4920: 0x5AE3, 4921: 0x5AD7, 4922: 0x5AE6, 4923: 0x5AE9, 4924: 0x5AD6, 4925: 0x5AFA, 4926: 0x5AFB, 4927: 0x5B0C, 4928: 0x5B0B, 4929: 0x5B16, 4930: 0x5B32, 4931: 0x5AD0, 4932: 0x5B2A, 4933: 0x5B36, 4934: 0x5B3E, 4935: 0x5B43, 4936: 0x5B45, 4937: 0x5B40, 4938: 0x5B51, 4939: 0x5B55, 4940: 0x5B5A, 4941: 0x5B5B, 4942: 0x5B65, 4943: 0x5B69, 4944: 0x5B70, 4945: 0x5B73, 4946: 0x5B75, 4947: 0x5B78, 4948: 0x6588, 4949: 0x5B7A, 4950: 0x5B80, 4951: 0x5B83, 4952: 0x5BA6, 4953: 0x5BB8, 4954: 0x5BC3, 4955: 0x5BC7, 4956: 0x5BC9, 4957: 0x5BD4, 4958: 0x5BD0, 4959: 0x5BE4, 4960: 0x5BE6, 4961: 0x5BE2, 4962: 0x5BDE, 4963: 0x5BE5, 4964: 0x5BEB, 4965: 0x5BF0, 4966: 0x5BF6, 4967: 0x5BF3, 4968: 0x5C05, 4969: 0x5C07, 4970: 0x5C08, 4971: 0x5C0D, 4972: 0x5C13, 4973: 0x5C20, 4974: 0x5C22, 4975: 0x5C28, 4976: 0x5C38, 4977: 0x5C39, 4978: 0x5C41, 4979: 0x5C46, 4980: 0x5C4E, 4981: 0x5C53, 4982: 0x5C50, 4983: 0x5C4F, 4984: 0x5B71, 4985: 0x5C6C, 4986: 0x5C6E, 4987: 0x4E62, 4988: 0x5C76, 4989: 0x5C79, 4990: 0x5C8C, 4991: 0x5C91, 4992: 0x5C94, 4993: 0x599B, 4994: 0x5CAB, 4995: 0x5CBB, 4996: 0x5CB6, 4997: 0x5CBC, 4998: 0x5CB7, 4999: 0x5CC5, 5000: 0x5CBE, 5001: 0x5CC7, 5002: 0x5CD9, 5003: 0x5CE9, 5004: 0x5CFD, 5005: 0x5CFA, 5006: 0x5CED, 5007: 0x5D8C, 5008: 0x5CEA, 5009: 0x5D0B, 5010: 0x5D15, 5011: 0x5D17, 5012: 0x5D5C, 5013: 0x5D1F, 5014: 0x5D1B, 5015: 0x5D11, 5016: 0x5D14, 5017: 0x5D22, 5018: 0x5D1A, 5019: 0x5D19, 5020: 0x5D18, 5021: 0x5D4C, 5022: 0x5D52, 5023: 0x5D4E, 5024: 0x5D4B, 5025: 0x5D6C, 5026: 0x5D73, 5027: 0x5D76, 5028: 0x5D87, 5029: 0x5D84, 5030: 0x5D82, 5031: 0x5DA2, 5032: 0x5D9D, 5033: 0x5DAC, 5034: 0x5DAE, 5035: 0x5DBD, 5036: 0x5D90, 5037: 0x5DB7, 5038: 0x5DBC, 5039: 0x5DC9, 5040: 0x5DCD, 5041: 0x5DD3, 5042: 0x5DD2, 5043: 0x5DD6, 5044: 0x5DDB, 5045: 0x5DEB, 5046: 0x5DF2, 5047: 0x5DF5, 5048: 0x5E0B, 5049: 0x5E1A, 5050: 0x5E19, 5051: 0x5E11, 5052: 0x5E1B, 5053: 0x5E36, 5054: 0x5E37, 5055: 0x5E44, 5056: 0x5E43, 5057: 0x5E40, 5058: 0x5E4E, 5059: 0x5E57, 5060: 0x5E54, 5061: 0x5E5F, 5062: 0x5E62, 5063: 0x5E64, 5064: 0x5E47, 5065: 0x5E75, 5066: 0x5E76, 5067: 0x5E7A, 5068: 0x9EBC, 5069: 0x5E7F, 5070: 0x5EA0, 5071: 0x5EC1, 5072: 0x5EC2, 5073: 0x5EC8, 5074: 0x5ED0, 5075: 0x5ECF, 5076: 0x5ED6, 5077: 0x5EE3, 5078: 0x5EDD, 5079: 0x5EDA, 5080: 0x5EDB, 5081: 0x5EE2, 5082: 0x5EE1, 5083: 0x5EE8, 5084: 0x5EE9, 5085: 0x5EEC, 5086: 0x5EF1, 5087: 0x5EF3, 5088: 0x5EF0, 5089: 0x5EF4, 5090: 0x5EF8, 5091: 0x5EFE, 5092: 0x5F03, 5093: 0x5F09, 5094: 0x5F5D, 5095: 0x5F5C, 5096: 0x5F0B, 5097: 0x5F11, 5098: 0x5F16, 5099: 0x5F29, 5100: 0x5F2D, 5101: 0x5F38, 5102: 0x5F41, 5103: 0x5F48, 5104: 0x5F4C, 5105: 0x5F4E, 5106: 0x5F2F, 5107: 0x5F51, 5108: 0x5F56, 5109: 0x5F57, 5110: 0x5F59, 5111: 0x5F61, 5112: 0x5F6D, 5113: 0x5F73, 5114: 0x5F77, 5115: 0x5F83, 5116: 0x5F82, 5117: 0x5F7F, 5118: 0x5F8A, 5119: 0x5F88, 5120: 0x5F91, 5121: 0x5F87, 5122: 0x5F9E, 5123: 0x5F99, 5124: 0x5F98, 5125: 0x5FA0, 5126: 0x5FA8, 5127: 0x5FAD, 5128: 0x5FBC, 5129: 0x5FD6, 5130: 0x5FFB, 5131: 0x5FE4, 5132: 0x5FF8, 5133: 0x5FF1, 5134: 0x5FDD, 5135: 0x60B3, 5136: 0x5FFF, 5137: 0x6021, 5138: 0x6060, 5139: 0x6019, 5140: 0x6010, 5141: 0x6029, 5142: 0x600E, 5143: 0x6031, 5144: 0x601B, 5145: 0x6015, 5146: 0x602B, 5147: 0x6026, 5148: 0x600F, 5149: 0x603A, 5150: 0x605A, 5151: 0x6041, 5152: 0x606A, 5153: 0x6077, 5154: 0x605F, 5155: 0x604A, 5156: 0x6046, 5157: 0x604D, 5158: 0x6063, 5159: 0x6043, 5160: 0x6064, 5161: 0x6042, 5162: 0x606C, 5163: 0x606B, 5164: 0x6059, 5165: 0x6081, 5166: 0x608D, 5167: 0x60E7, 5168: 0x6083, 5169: 0x609A, 5170: 0x6084, 5171: 0x609B, 5172: 0x6096, 5173: 0x6097, 5174: 0x6092, 5175: 0x60A7, 5176: 0x608B, 5177: 0x60E1, 5178: 0x60B8, 5179: 0x60E0, 5180: 0x60D3, 5181: 0x60B4, 5182: 0x5FF0, 5183: 0x60BD, 5184: 0x60C6, 5185: 0x60B5, 5186: 0x60D8, 5187: 0x614D, 5188: 0x6115, 5189: 0x6106, 5190: 0x60F6, 5191: 0x60F7, 5192: 0x6100, 5193: 0x60F4, 5194: 0x60FA, 5195: 0x6103, 5196: 0x6121, 5197: 0x60FB, 5198: 0x60F1, 5199: 0x610D, 5200: 0x610E, 5201: 0x6147, 5202: 0x613E, 5203: 0x6128, 5204: 0x6127, 5205: 0x614A, 5206: 0x613F, 5207: 0x613C, 5208: 0x612C, 5209: 0x6134, 5210: 0x613D, 5211: 0x6142, 5212: 0x6144, 5213: 0x6173, 5214: 0x6177, 5215: 0x6158, 5216: 0x6159, 5217: 0x615A, 5218: 0x616B, 5219: 0x6174, 5220: 0x616F, 5221: 0x6165, 5222: 0x6171, 5223: 0x615F, 5224: 0x615D, 5225: 0x6153, 5226: 0x6175, 5227: 0x6199, 5228: 0x6196, 5229: 0x6187, 5230: 0x61AC, 5231: 0x6194, 5232: 0x619A, 5233: 0x618A, 5234: 0x6191, 5235: 0x61AB, 5236: 0x61AE, 5237: 0x61CC, 5238: 0x61CA, 5239: 0x61C9, 5240: 0x61F7, 5241: 0x61C8, 5242: 0x61C3, 5243: 0x61C6, 5244: 0x61BA, 5245: 0x61CB, 5246: 0x7F79, 5247: 0x61CD, 5248: 0x61E6, 5249: 0x61E3, 5250: 0x61F6, 5251: 0x61FA, 5252: 0x61F4, 5253: 0x61FF, 5254: 0x61FD, 5255: 0x61FC, 5256: 0x61FE, 5257: 0x6200, 5258: 0x6208, 5259: 0x6209, 5260: 0x620D, 5261: 0x620C, 5262: 0x6214, 5263: 0x621B, 5264: 0x621E, 5265: 0x6221, 5266: 0x622A, 5267: 0x622E, 5268: 0x6230, 5269: 0x6232, 5270: 0x6233, 5271: 0x6241, 5272: 0x624E, 5273: 0x625E, 5274: 0x6263, 5275: 0x625B, 5276: 0x6260, 5277: 0x6268, 5278: 0x627C, 5279: 0x6282, 5280: 0x6289, 5281: 0x627E, 5282: 0x6292, 5283: 0x6293, 5284: 0x6296, 5285: 0x62D4, 5286: 0x6283, 5287: 0x6294, 5288: 0x62D7, 5289: 0x62D1, 5290: 0x62BB, 5291: 0x62CF, 5292: 0x62FF, 5293: 0x62C6, 5294: 0x64D4, 5295: 0x62C8, 5296: 0x62DC, 5297: 0x62CC, 5298: 0x62CA, 5299: 0x62C2, 5300: 0x62C7, 5301: 0x629B, 5302: 0x62C9, 5303: 0x630C, 5304: 0x62EE, 5305: 0x62F1, 5306: 0x6327, 5307: 0x6302, 5308: 0x6308, 5309: 0x62EF, 5310: 0x62F5, 5311: 0x6350, 5312: 0x633E, 5313: 0x634D, 5314: 0x641C, 5315: 0x634F, 5316: 0x6396, 5317: 0x638E, 5318: 0x6380, 5319: 0x63AB, 5320: 0x6376, 5321: 0x63A3, 5322: 0x638F, 5323: 0x6389, 5324: 0x639F, 5325: 0x63B5, 5326: 0x636B, 5327: 0x6369, 5328: 0x63BE, 5329: 0x63E9, 5330: 0x63C0, 5331: 0x63C6, 5332: 0x63E3, 5333: 0x63C9, 5334: 0x63D2, 5335: 0x63F6, 5336: 0x63C4, 5337: 0x6416, 5338: 0x6434, 5339: 0x6406, 5340: 0x6413, 5341: 0x6426, 5342: 0x6436, 5343: 0x651D, 5344: 0x6417, 5345: 0x6428, 5346: 0x640F, 5347: 0x6467, 5348: 0x646F, 5349: 0x6476, 5350: 0x644E, 5351: 0x652A, 5352: 0x6495, 5353: 0x6493, 5354: 0x64A5, 5355: 0x64A9, 5356: 0x6488, 5357: 0x64BC, 5358: 0x64DA, 5359: 0x64D2, 5360: 0x64C5, 5361: 0x64C7, 5362: 0x64BB, 5363: 0x64D8, 5364: 0x64C2, 5365: 0x64F1, 5366: 0x64E7, 5367: 0x8209, 5368: 0x64E0, 5369: 0x64E1, 5370: 0x62AC, 5371: 0x64E3, 5372: 0x64EF, 5373: 0x652C, 5374: 0x64F6, 5375: 0x64F4, 5376: 0x64F2, 5377: 0x64FA, 5378: 0x6500, 5379: 0x64FD, 5380: 0x6518, 5381: 0x651C, 5382: 0x6505, 5383: 0x6524, 5384: 0x6523, 5385: 0x652B, 5386: 0x6534, 5387: 0x6535, 5388: 0x6537, 5389: 0x6536, 5390: 0x6538, 5391: 0x754B, 5392: 0x6548, 5393: 0x6556, 5394: 0x6555, 5395: 0x654D, 5396: 0x6558, 5397: 0x655E, 5398: 0x655D, 5399: 0x6572, 5400: 0x6578, 5401: 0x6582, 5402: 0x6583, 5403: 0x8B8A, 5404: 0x659B, 5405: 0x659F, 5406: 0x65AB, 5407: 0x65B7, 5408: 0x65C3, 5409: 0x65C6, 5410: 0x65C1, 5411: 0x65C4, 5412: 0x65CC, 5413: 0x65D2, 5414: 0x65DB, 5415: 0x65D9, 5416: 0x65E0, 5417: 0x65E1, 5418: 0x65F1, 5419: 0x6772, 5420: 0x660A, 5421: 0x6603, 5422: 0x65FB, 5423: 0x6773, 5424: 0x6635, 5425: 0x6636, 5426: 0x6634, 5427: 0x661C, 5428: 0x664F, 5429: 0x6644, 5430: 0x6649, 5431: 0x6641, 5432: 0x665E, 5433: 0x665D, 5434: 0x6664, 5435: 0x6667, 5436: 0x6668, 5437: 0x665F, 5438: 0x6662, 5439: 0x6670, 5440: 0x6683, 5441: 0x6688, 5442: 0x668E, 5443: 0x6689, 5444: 0x6684, 5445: 0x6698, 5446: 0x669D, 5447: 0x66C1, 5448: 0x66B9, 5449: 0x66C9, 5450: 0x66BE, 5451: 0x66BC, 5452: 0x66C4, 5453: 0x66B8, 5454: 0x66D6, 5455: 0x66DA, 5456: 0x66E0, 5457: 0x663F, 5458: 0x66E6, 5459: 0x66E9, 5460: 0x66F0, 5461: 0x66F5, 5462: 0x66F7, 5463: 0x670F, 5464: 0x6716, 5465: 0x671E, 5466: 0x6726, 5467: 0x6727, 5468: 0x9738, 5469: 0x672E, 5470: 0x673F, 5471: 0x6736, 5472: 0x6741, 5473: 0x6738, 5474: 0x6737, 5475: 0x6746, 5476: 0x675E, 5477: 0x6760, 5478: 0x6759, 5479: 0x6763, 5480: 0x6764, 5481: 0x6789, 5482: 0x6770, 5483: 0x67A9, 5484: 0x677C, 5485: 0x676A, 5486: 0x678C, 5487: 0x678B, 5488: 0x67A6, 5489: 0x67A1, 5490: 0x6785, 5491: 0x67B7, 5492: 0x67EF, 5493: 0x67B4, 5494: 0x67EC, 5495: 0x67B3, 5496: 0x67E9, 5497: 0x67B8, 5498: 0x67E4, 5499: 0x67DE, 5500: 0x67DD, 5501: 0x67E2, 5502: 0x67EE, 5503: 0x67B9, 5504: 0x67CE, 5505: 0x67C6, 5506: 0x67E7, 5507: 0x6A9C, 5508: 0x681E, 5509: 0x6846, 5510: 0x6829, 5511: 0x6840, 5512: 0x684D, 5513: 0x6832, 5514: 0x684E, 5515: 0x68B3, 5516: 0x682B, 5517: 0x6859, 5518: 0x6863, 5519: 0x6877, 5520: 0x687F, 5521: 0x689F, 5522: 0x688F, 5523: 0x68AD, 5524: 0x6894, 5525: 0x689D, 5526: 0x689B, 5527: 0x6883, 5528: 0x6AAE, 5529: 0x68B9, 5530: 0x6874, 5531: 0x68B5, 5532: 0x68A0, 5533: 0x68BA, 5534: 0x690F, 5535: 0x688D, 5536: 0x687E, 5537: 0x6901, 5538: 0x68CA, 5539: 0x6908, 5540: 0x68D8, 5541: 0x6922, 5542: 0x6926, 5543: 0x68E1, 5544: 0x690C, 5545: 0x68CD, 5546: 0x68D4, 5547: 0x68E7, 5548: 0x68D5, 5549: 0x6936, 5550: 0x6912, 5551: 0x6904, 5552: 0x68D7, 5553: 0x68E3, 5554: 0x6925, 5555: 0x68F9, 5556: 0x68E0, 5557: 0x68EF, 5558: 0x6928, 5559: 0x692A, 5560: 0x691A, 5561: 0x6923, 5562: 0x6921, 5563: 0x68C6, 5564: 0x6979, 5565: 0x6977, 5566: 0x695C, 5567: 0x6978, 5568: 0x696B, 5569: 0x6954, 5570: 0x697E, 5571: 0x696E, 5572: 0x6939, 5573: 0x6974, 5574: 0x693D, 5575: 0x6959, 5576: 0x6930, 5577: 0x6961, 5578: 0x695E, 5579: 0x695D, 5580: 0x6981, 5581: 0x696A, 5582: 0x69B2, 5583: 0x69AE, 5584: 0x69D0, 5585: 0x69BF, 5586: 0x69C1, 5587: 0x69D3, 5588: 0x69BE, 5589: 0x69CE, 5590: 0x5BE8, 5591: 0x69CA, 5592: 0x69DD, 5593: 0x69BB, 5594: 0x69C3, 5595: 0x69A7, 5596: 0x6A2E, 5597: 0x6991, 5598: 0x69A0, 5599: 0x699C, 5600: 0x6995, 5601: 0x69B4, 5602: 0x69DE, 5603: 0x69E8, 5604: 0x6A02, 5605: 0x6A1B, 5606: 0x69FF, 5607: 0x6B0A, 5608: 0x69F9, 5609: 0x69F2, 5610: 0x69E7, 5611: 0x6A05, 5612: 0x69B1, 5613: 0x6A1E, 5614: 0x69ED, 5615: 0x6A14, 5616: 0x69EB, 5617: 0x6A0A, 5618: 0x6A12, 5619: 0x6AC1, 5620: 0x6A23, 5621: 0x6A13, 5622: 0x6A44, 5623: 0x6A0C, 5624: 0x6A72, 5625: 0x6A36, 5626: 0x6A78, 5627: 0x6A47, 5628: 0x6A62, 5629: 0x6A59, 5630: 0x6A66, 5631: 0x6A48, 5632: 0x6A38, 5633: 0x6A22, 5634: 0x6A90, 5635: 0x6A8D, 5636: 0x6AA0, 5637: 0x6A84, 5638: 0x6AA2, 5639: 0x6AA3, 5640: 0x6A97, 5641: 0x8617, 5642: 0x6ABB, 5643: 0x6AC3, 5644: 0x6AC2, 5645: 0x6AB8, 5646: 0x6AB3, 5647: 0x6AAC, 5648: 0x6ADE, 5649: 0x6AD1, 5650: 0x6ADF, 5651: 0x6AAA, 5652: 0x6ADA, 5653: 0x6AEA, 5654: 0x6AFB, 5655: 0x6B05, 5656: 0x8616, 5657: 0x6AFA, 5658: 0x6B12, 5659: 0x6B16, 5660: 0x9B31, 5661: 0x6B1F, 5662: 0x6B38, 5663: 0x6B37, 5664: 0x76DC, 5665: 0x6B39, 5666: 0x98EE, 5667: 0x6B47, 5668: 0x6B43, 5669: 0x6B49, 5670: 0x6B50, 5671: 0x6B59, 5672: 0x6B54, 5673: 0x6B5B, 5674: 0x6B5F, 5675: 0x6B61, 5676: 0x6B78, 5677: 0x6B79, 5678: 0x6B7F, 5679: 0x6B80, 5680: 0x6B84, 5681: 0x6B83, 5682: 0x6B8D, 5683: 0x6B98, 5684: 0x6B95, 5685: 0x6B9E, 5686: 0x6BA4, 5687: 0x6BAA, 5688: 0x6BAB, 5689: 0x6BAF, 5690: 0x6BB2, 5691: 0x6BB1, 5692: 0x6BB3, 5693: 0x6BB7, 5694: 0x6BBC, 5695: 0x6BC6, 5696: 0x6BCB, 5697: 0x6BD3, 5698: 0x6BDF, 5699: 0x6BEC, 5700: 0x6BEB, 5701: 0x6BF3, 5702: 0x6BEF, 5703: 0x9EBE, 5704: 0x6C08, 5705: 0x6C13, 5706: 0x6C14, 5707: 0x6C1B, 5708: 0x6C24, 5709: 0x6C23, 5710: 0x6C5E, 5711: 0x6C55, 5712: 0x6C62, 5713: 0x6C6A, 5714: 0x6C82, 5715: 0x6C8D, 5716: 0x6C9A, 5717: 0x6C81, 5718: 0x6C9B, 5719: 0x6C7E, 5720: 0x6C68, 5721: 0x6C73, 5722: 0x6C92, 5723: 0x6C90, 5724: 0x6CC4, 5725: 0x6CF1, 5726: 0x6CD3, 5727: 0x6CBD, 5728: 0x6CD7, 5729: 0x6CC5, 5730: 0x6CDD, 5731: 0x6CAE, 5732: 0x6CB1, 5733: 0x6CBE, 5734: 0x6CBA, 5735: 0x6CDB, 5736: 0x6CEF, 5737: 0x6CD9, 5738: 0x6CEA, 5739: 0x6D1F, 5740: 0x884D, 5741: 0x6D36, 5742: 0x6D2B, 5743: 0x6D3D, 5744: 0x6D38, 5745: 0x6D19, 5746: 0x6D35, 5747: 0x6D33, 5748: 0x6D12, 5749: 0x6D0C, 5750: 0x6D63, 5751: 0x6D93, 5752: 0x6D64, 5753: 0x6D5A, 5754: 0x6D79, 5755: 0x6D59, 5756: 0x6D8E, 5757: 0x6D95, 5758: 0x6FE4, 5759: 0x6D85, 5760: 0x6DF9, 5761: 0x6E15, 5762: 0x6E0A, 5763: 0x6DB5, 5764: 0x6DC7, 5765: 0x6DE6, 5766: 0x6DB8, 5767: 0x6DC6, 5768: 0x6DEC, 5769: 0x6DDE, 5770: 0x6DCC, 5771: 0x6DE8, 5772: 0x6DD2, 5773: 0x6DC5, 5774: 0x6DFA, 5775: 0x6DD9, 5776: 0x6DE4, 5777: 0x6DD5, 5778: 0x6DEA, 5779: 0x6DEE, 5780: 0x6E2D, 5781: 0x6E6E, 5782: 0x6E2E, 5783: 0x6E19, 5784: 0x6E72, 5785: 0x6E5F, 5786: 0x6E3E, 5787: 0x6E23, 5788: 0x6E6B, 5789: 0x6E2B, 5790: 0x6E76, 5791: 0x6E4D, 5792: 0x6E1F, 5793: 0x6E43, 5794: 0x6E3A, 5795: 0x6E4E, 5796: 0x6E24, 5797: 0x6EFF, 5798: 0x6E1D, 5799: 0x6E38, 5800: 0x6E82, 5801: 0x6EAA, 5802: 0x6E98, 5803: 0x6EC9, 5804: 0x6EB7, 5805: 0x6ED3, 5806: 0x6EBD, 5807: 0x6EAF, 5808: 0x6EC4, 5809: 0x6EB2, 5810: 0x6ED4, 5811: 0x6ED5, 5812: 0x6E8F, 5813: 0x6EA5, 5814: 0x6EC2, 5815: 0x6E9F, 5816: 0x6F41, 5817: 0x6F11, 5818: 0x704C, 5819: 0x6EEC, 5820: 0x6EF8, 5821: 0x6EFE, 5822: 0x6F3F, 5823: 0x6EF2, 5824: 0x6F31, 5825: 0x6EEF, 5826: 0x6F32, 5827: 0x6ECC, 5828: 0x6F3E, 5829: 0x6F13, 5830: 0x6EF7, 5831: 0x6F86, 5832: 0x6F7A, 5833: 0x6F78, 5834: 0x6F81, 5835: 0x6F80, 5836: 0x6F6F, 5837: 0x6F5B, 5838: 0x6FF3, 5839: 0x6F6D, 5840: 0x6F82, 5841: 0x6F7C, 5842: 0x6F58, 5843: 0x6F8E, 5844: 0x6F91, 5845: 0x6FC2, 5846: 0x6F66, 5847: 0x6FB3, 5848: 0x6FA3, 5849: 0x6FA1, 5850: 0x6FA4, 5851: 0x6FB9, 5852: 0x6FC6, 5853: 0x6FAA, 5854: 0x6FDF, 5855: 0x6FD5, 5856: 0x6FEC, 5857: 0x6FD4, 5858: 0x6FD8, 5859: 0x6FF1, 5860: 0x6FEE, 5861: 0x6FDB, 5862: 0x7009, 5863: 0x700B, 5864: 0x6FFA, 5865: 0x7011, 5866: 0x7001, 5867: 0x700F, 5868: 0x6FFE, 5869: 0x701B, 5870: 0x701A, 5871: 0x6F74, 5872: 0x701D, 5873: 0x7018, 5874: 0x701F, 5875: 0x7030, 5876: 0x703E, 5877: 0x7032, 5878: 0x7051, 5879: 0x7063, 5880: 0x7099, 5881: 0x7092, 5882: 0x70AF, 5883: 0x70F1, 5884: 0x70AC, 5885: 0x70B8, 5886: 0x70B3, 5887: 0x70AE, 5888: 0x70DF, 5889: 0x70CB, 5890: 0x70DD, 5891: 0x70D9, 5892: 0x7109, 5893: 0x70FD, 5894: 0x711C, 5895: 0x7119, 5896: 0x7165, 5897: 0x7155, 5898: 0x7188, 5899: 0x7166, 5900: 0x7162, 5901: 0x714C, 5902: 0x7156, 5903: 0x716C, 5904: 0x718F, 5905: 0x71FB, 5906: 0x7184, 5907: 0x7195, 5908: 0x71A8, 5909: 0x71AC, 5910: 0x71D7, 5911: 0x71B9, 5912: 0x71BE, 5913: 0x71D2, 5914: 0x71C9, 5915: 0x71D4, 5916: 0x71CE, 5917: 0x71E0, 5918: 0x71EC, 5919: 0x71E7, 5920: 0x71F5, 5921: 0x71FC, 5922: 0x71F9, 5923: 0x71FF, 5924: 0x720D, 5925: 0x7210, 5926: 0x721B, 5927: 0x7228, 5928: 0x722D, 5929: 0x722C, 5930: 0x7230, 5931: 0x7232, 5932: 0x723B, 5933: 0x723C, 5934: 0x723F, 5935: 0x7240, 5936: 0x7246, 5937: 0x724B, 5938: 0x7258, 5939: 0x7274, 5940: 0x727E, 5941: 0x7282, 5942: 0x7281, 5943: 0x7287, 5944: 0x7292, 5945: 0x7296, 5946: 0x72A2, 5947: 0x72A7, 5948: 0x72B9, 5949: 0x72B2, 5950: 0x72C3, 5951: 0x72C6, 5952: 0x72C4, 5953: 0x72CE, 5954: 0x72D2, 5955: 0x72E2, 5956: 0x72E0, 5957: 0x72E1, 5958: 0x72F9, 5959: 0x72F7, 5960: 0x500F, 5961: 0x7317, 5962: 0x730A, 5963: 0x731C, 5964: 0x7316, 5965: 0x731D, 5966: 0x7334, 5967: 0x732F, 5968: 0x7329, 5969: 0x7325, 5970: 0x733E, 5971: 0x734E, 5972: 0x734F, 5973: 0x9ED8, 5974: 0x7357, 5975: 0x736A, 5976: 0x7368, 5977: 0x7370, 5978: 0x7378, 5979: 0x7375, 5980: 0x737B, 5981: 0x737A, 5982: 0x73C8, 5983: 0x73B3, 5984: 0x73CE, 5985: 0x73BB, 5986: 0x73C0, 5987: 0x73E5, 5988: 0x73EE, 5989: 0x73DE, 5990: 0x74A2, 5991: 0x7405, 5992: 0x746F, 5993: 0x7425, 5994: 0x73F8, 5995: 0x7432, 5996: 0x743A, 5997: 0x7455, 5998: 0x743F, 5999: 0x745F, 6000: 0x7459, 6001: 0x7441, 6002: 0x745C, 6003: 0x7469, 6004: 0x7470, 6005: 0x7463, 6006: 0x746A, 6007: 0x7476, 6008: 0x747E, 6009: 0x748B, 6010: 0x749E, 6011: 0x74A7, 6012: 0x74CA, 6013: 0x74CF, 6014: 0x74D4, 6015: 0x73F1, 6016: 0x74E0, 6017: 0x74E3, 6018: 0x74E7, 6019: 0x74E9, 6020: 0x74EE, 6021: 0x74F2, 6022: 0x74F0, 6023: 0x74F1, 6024: 0x74F8, 6025: 0x74F7, 6026: 0x7504, 6027: 0x7503, 6028: 0x7505, 6029: 0x750C, 6030: 0x750E, 6031: 0x750D, 6032: 0x7515, 6033: 0x7513, 6034: 0x751E, 6035: 0x7526, 6036: 0x752C, 6037: 0x753C, 6038: 0x7544, 6039: 0x754D, 6040: 0x754A, 6041: 0x7549, 6042: 0x755B, 6043: 0x7546, 6044: 0x755A, 6045: 0x7569, 6046: 0x7564, 6047: 0x7567, 6048: 0x756B, 6049: 0x756D, 6050: 0x7578, 6051: 0x7576, 6052: 0x7586, 6053: 0x7587, 6054: 0x7574, 6055: 0x758A, 6056: 0x7589, 6057: 0x7582, 6058: 0x7594, 6059: 0x759A, 6060: 0x759D, 6061: 0x75A5, 6062: 0x75A3, 6063: 0x75C2, 6064: 0x75B3, 6065: 0x75C3, 6066: 0x75B5, 6067: 0x75BD, 6068: 0x75B8, 6069: 0x75BC, 6070: 0x75B1, 6071: 0x75CD, 6072: 0x75CA, 6073: 0x75D2, 6074: 0x75D9, 6075: 0x75E3, 6076: 0x75DE, 6077: 0x75FE, 6078: 0x75FF, 6079: 0x75FC, 6080: 0x7601, 6081: 0x75F0, 6082: 0x75FA, 6083: 0x75F2, 6084: 0x75F3, 6085: 0x760B, 6086: 0x760D, 6087: 0x7609, 6088: 0x761F, 6089: 0x7627, 6090: 0x7620, 6091: 0x7621, 6092: 0x7622, 6093: 0x7624, 6094: 0x7634, 6095: 0x7630, 6096: 0x763B, 6097: 0x7647, 6098: 0x7648, 6099: 0x7646, 6100: 0x765C, 6101: 0x7658, 6102: 0x7661, 6103: 0x7662, 6104: 0x7668, 6105: 0x7669, 6106: 0x766A, 6107: 0x7667, 6108: 0x766C, 6109: 0x7670, 6110: 0x7672, 6111: 0x7676, 6112: 0x7678, 6113: 0x767C, 6114: 0x7680, 6115: 0x7683, 6116: 0x7688, 6117: 0x768B, 6118: 0x768E, 6119: 0x7696, 6120: 0x7693, 6121: 0x7699, 6122: 0x769A, 6123: 0x76B0, 6124: 0x76B4, 6125: 0x76B8, 6126: 0x76B9, 6127: 0x76BA, 6128: 0x76C2, 6129: 0x76CD, 6130: 0x76D6, 6131: 0x76D2, 6132: 0x76DE, 6133: 0x76E1, 6134: 0x76E5, 6135: 0x76E7, 6136: 0x76EA, 6137: 0x862F, 6138: 0x76FB, 6139: 0x7708, 6140: 0x7707, 6141: 0x7704, 6142: 0x7729, 6143: 0x7724, 6144: 0x771E, 6145: 0x7725, 6146: 0x7726, 6147: 0x771B, 6148: 0x7737, 6149: 0x7738, 6150: 0x7747, 6151: 0x775A, 6152: 0x7768, 6153: 0x776B, 6154: 0x775B, 6155: 0x7765, 6156: 0x777F, 6157: 0x777E, 6158: 0x7779, 6159: 0x778E, 6160: 0x778B, 6161: 0x7791, 6162: 0x77A0, 6163: 0x779E, 6164: 0x77B0, 6165: 0x77B6, 6166: 0x77B9, 6167: 0x77BF, 6168: 0x77BC, 6169: 0x77BD, 6170: 0x77BB, 6171: 0x77C7, 6172: 0x77CD, 6173: 0x77D7, 6174: 0x77DA, 6175: 0x77DC, 6176: 0x77E3, 6177: 0x77EE, 6178: 0x77FC, 6179: 0x780C, 6180: 0x7812, 6181: 0x7926, 6182: 0x7820, 6183: 0x792A, 6184: 0x7845, 6185: 0x788E, 6186: 0x7874, 6187: 0x7886, 6188: 0x787C, 6189: 0x789A, 6190: 0x788C, 6191: 0x78A3, 6192: 0x78B5, 6193: 0x78AA, 6194: 0x78AF, 6195: 0x78D1, 6196: 0x78C6, 6197: 0x78CB, 6198: 0x78D4, 6199: 0x78BE, 6200: 0x78BC, 6201: 0x78C5, 6202: 0x78CA, 6203: 0x78EC, 6204: 0x78E7, 6205: 0x78DA, 6206: 0x78FD, 6207: 0x78F4, 6208: 0x7907, 6209: 0x7912, 6210: 0x7911, 6211: 0x7919, 6212: 0x792C, 6213: 0x792B, 6214: 0x7940, 6215: 0x7960, 6216: 0x7957, 6217: 0x795F, 6218: 0x795A, 6219: 0x7955, 6220: 0x7953, 6221: 0x797A, 6222: 0x797F, 6223: 0x798A, 6224: 0x799D, 6225: 0x79A7, 6226: 0x9F4B, 6227: 0x79AA, 6228: 0x79AE, 6229: 0x79B3, 6230: 0x79B9, 6231: 0x79BA, 6232: 0x79C9, 6233: 0x79D5, 6234: 0x79E7, 6235: 0x79EC, 6236: 0x79E1, 6237: 0x79E3, 6238: 0x7A08, 6239: 0x7A0D, 6240: 0x7A18, 6241: 0x7A19, 6242: 0x7A20, 6243: 0x7A1F, 6244: 0x7980, 6245: 0x7A31, 6246: 0x7A3B, 6247: 0x7A3E, 6248: 0x7A37, 6249: 0x7A43, 6250: 0x7A57, 6251: 0x7A49, 6252: 0x7A61, 6253: 0x7A62, 6254: 0x7A69, 6255: 0x9F9D, 6256: 0x7A70, 6257: 0x7A79, 6258: 0x7A7D, 6259: 0x7A88, 6260: 0x7A97, 6261: 0x7A95, 6262: 0x7A98, 6263: 0x7A96, 6264: 0x7AA9, 6265: 0x7AC8, 6266: 0x7AB0, 6267: 0x7AB6, 6268: 0x7AC5, 6269: 0x7AC4, 6270: 0x7ABF, 6271: 0x9083, 6272: 0x7AC7, 6273: 0x7ACA, 6274: 0x7ACD, 6275: 0x7ACF, 6276: 0x7AD5, 6277: 0x7AD3, 6278: 0x7AD9, 6279: 0x7ADA, 6280: 0x7ADD, 6281: 0x7AE1, 6282: 0x7AE2, 6283: 0x7AE6, 6284: 0x7AED, 6285: 0x7AF0, 6286: 0x7B02, 6287: 0x7B0F, 6288: 0x7B0A, 6289: 0x7B06, 6290: 0x7B33, 6291: 0x7B18, 6292: 0x7B19, 6293: 0x7B1E, 6294: 0x7B35, 6295: 0x7B28, 6296: 0x7B36, 6297: 0x7B50, 6298: 0x7B7A, 6299: 0x7B04, 6300: 0x7B4D, 6301: 0x7B0B, 6302: 0x7B4C, 6303: 0x7B45, 6304: 0x7B75, 6305: 0x7B65, 6306: 0x7B74, 6307: 0x7B67, 6308: 0x7B70, 6309: 0x7B71, 6310: 0x7B6C, 6311: 0x7B6E, 6312: 0x7B9D, 6313: 0x7B98, 6314: 0x7B9F, 6315: 0x7B8D, 6316: 0x7B9C, 6317: 0x7B9A, 6318: 0x7B8B, 6319: 0x7B92, 6320: 0x7B8F, 6321: 0x7B5D, 6322: 0x7B99, 6323: 0x7BCB, 6324: 0x7BC1, 6325: 0x7BCC, 6326: 0x7BCF, 6327: 0x7BB4, 6328: 0x7BC6, 6329: 0x7BDD, 6330: 0x7BE9, 6331: 0x7C11, 6332: 0x7C14, 6333: 0x7BE6, 6334: 0x7BE5, 6335: 0x7C60, 6336: 0x7C00, 6337: 0x7C07, 6338: 0x7C13, 6339: 0x7BF3, 6340: 0x7BF7, 6341: 0x7C17, 6342: 0x7C0D, 6343: 0x7BF6, 6344: 0x7C23, 6345: 0x7C27, 6346: 0x7C2A, 6347: 0x7C1F, 6348: 0x7C37, 6349: 0x7C2B, 6350: 0x7C3D, 6351: 0x7C4C, 6352: 0x7C43, 6353: 0x7C54, 6354: 0x7C4F, 6355: 0x7C40, 6356: 0x7C50, 6357: 0x7C58, 6358: 0x7C5F, 6359: 0x7C64, 6360: 0x7C56, 6361: 0x7C65, 6362: 0x7C6C, 6363: 0x7C75, 6364: 0x7C83, 6365: 0x7C90, 6366: 0x7CA4, 6367: 0x7CAD, 6368: 0x7CA2, 6369: 0x7CAB, 6370: 0x7CA1, 6371: 0x7CA8, 6372: 0x7CB3, 6373: 0x7CB2, 6374: 0x7CB1, 6375: 0x7CAE, 6376: 0x7CB9, 6377: 0x7CBD, 6378: 0x7CC0, 6379: 0x7CC5, 6380: 0x7CC2, 6381: 0x7CD8, 6382: 0x7CD2, 6383: 0x7CDC, 6384: 0x7CE2, 6385: 0x9B3B, 6386: 0x7CEF, 6387: 0x7CF2, 6388: 0x7CF4, 6389: 0x7CF6, 6390: 0x7CFA, 6391: 0x7D06, 6392: 0x7D02, 6393: 0x7D1C, 6394: 0x7D15, 6395: 0x7D0A, 6396: 0x7D45, 6397: 0x7D4B, 6398: 0x7D2E, 6399: 0x7D32, 6400: 0x7D3F, 6401: 0x7D35, 6402: 0x7D46, 6403: 0x7D73, 6404: 0x7D56, 6405: 0x7D4E, 6406: 0x7D72, 6407: 0x7D68, 6408: 0x7D6E, 6409: 0x7D4F, 6410: 0x7D63, 6411: 0x7D93, 6412: 0x7D89, 6413: 0x7D5B, 6414: 0x7D8F, 6415: 0x7D7D, 6416: 0x7D9B, 6417: 0x7DBA, 6418: 0x7DAE, 6419: 0x7DA3, 6420: 0x7DB5, 6421: 0x7DC7, 6422: 0x7DBD, 6423: 0x7DAB, 6424: 0x7E3D, 6425: 0x7DA2, 6426: 0x7DAF, 6427: 0x7DDC, 6428: 0x7DB8, 6429: 0x7D9F, 6430: 0x7DB0, 6431: 0x7DD8, 6432: 0x7DDD, 6433: 0x7DE4, 6434: 0x7DDE, 6435: 0x7DFB, 6436: 0x7DF2, 6437: 0x7DE1, 6438: 0x7E05, 6439: 0x7E0A, 6440: 0x7E23, 6441: 0x7E21, 6442: 0x7E12, 6443: 0x7E31, 6444: 0x7E1F, 6445: 0x7E09, 6446: 0x7E0B, 6447: 0x7E22, 6448: 0x7E46, 6449: 0x7E66, 6450: 0x7E3B, 6451: 0x7E35, 6452: 0x7E39, 6453: 0x7E43, 6454: 0x7E37, 6455: 0x7E32, 6456: 0x7E3A, 6457: 0x7E67, 6458: 0x7E5D, 6459: 0x7E56, 6460: 0x7E5E, 6461: 0x7E59, 6462: 0x7E5A, 6463: 0x7E79, 6464: 0x7E6A, 6465: 0x7E69, 6466: 0x7E7C, 6467: 0x7E7B, 6468: 0x7E83, 6469: 0x7DD5, 6470: 0x7E7D, 6471: 0x8FAE, 6472: 0x7E7F, 6473: 0x7E88, 6474: 0x7E89, 6475: 0x7E8C, 6476: 0x7E92, 6477: 0x7E90, 6478: 0x7E93, 6479: 0x7E94, 6480: 0x7E96, 6481: 0x7E8E, 6482: 0x7E9B, 6483: 0x7E9C, 6484: 0x7F38, 6485: 0x7F3A, 6486: 0x7F45, 6487: 0x7F4C, 6488: 0x7F4D, 6489: 0x7F4E, 6490: 0x7F50, 6491: 0x7F51, 6492: 0x7F55, 6493: 0x7F54, 6494: 0x7F58, 6495: 0x7F5F, 6496: 0x7F60, 6497: 0x7F68, 6498: 0x7F69, 6499: 0x7F67, 6500: 0x7F78, 6501: 0x7F82, 6502: 0x7F86, 6503: 0x7F83, 6504: 0x7F88, 6505: 0x7F87, 6506: 0x7F8C, 6507: 0x7F94, 6508: 0x7F9E, 6509: 0x7F9D, 6510: 0x7F9A, 6511: 0x7FA3, 6512: 0x7FAF, 6513: 0x7FB2, 6514: 0x7FB9, 6515: 0x7FAE, 6516: 0x7FB6, 6517: 0x7FB8, 6518: 0x8B71, 6519: 0x7FC5, 6520: 0x7FC6, 6521: 0x7FCA, 6522: 0x7FD5, 6523: 0x7FD4, 6524: 0x7FE1, 6525: 0x7FE6, 6526: 0x7FE9, 6527: 0x7FF3, 6528: 0x7FF9, 6529: 0x98DC, 6530: 0x8006, 6531: 0x8004, 6532: 0x800B, 6533: 0x8012, 6534: 0x8018, 6535: 0x8019, 6536: 0x801C, 6537: 0x8021, 6538: 0x8028, 6539: 0x803F, 6540: 0x803B, 6541: 0x804A, 6542: 0x8046, 6543: 0x8052, 6544: 0x8058, 6545: 0x805A, 6546: 0x805F, 6547: 0x8062, 6548: 0x8068, 6549: 0x8073, 6550: 0x8072, 6551: 0x8070, 6552: 0x8076, 6553: 0x8079, 6554: 0x807D, 6555: 0x807F, 6556: 0x8084, 6557: 0x8086, 6558: 0x8085, 6559: 0x809B, 6560: 0x8093, 6561: 0x809A, 6562: 0x80AD, 6563: 0x5190, 6564: 0x80AC, 6565: 0x80DB, 6566: 0x80E5, 6567: 0x80D9, 6568: 0x80DD, 6569: 0x80C4, 6570: 0x80DA, 6571: 0x80D6, 6572: 0x8109, 6573: 0x80EF, 6574: 0x80F1, 6575: 0x811B, 6576: 0x8129, 6577: 0x8123, 6578: 0x812F, 6579: 0x814B, 6580: 0x968B, 6581: 0x8146, 6582: 0x813E, 6583: 0x8153, 6584: 0x8151, 6585: 0x80FC, 6586: 0x8171, 6587: 0x816E, 6588: 0x8165, 6589: 0x8166, 6590: 0x8174, 6591: 0x8183, 6592: 0x8188, 6593: 0x818A, 6594: 0x8180, 6595: 0x8182, 6596: 0x81A0, 6597: 0x8195, 6598: 0x81A4, 6599: 0x81A3, 6600: 0x815F, 6601: 0x8193, 6602: 0x81A9, 6603: 0x81B0, 6604: 0x81B5, 6605: 0x81BE, 6606: 0x81B8, 6607: 0x81BD, 6608: 0x81C0, 6609: 0x81C2, 6610: 0x81BA, 6611: 0x81C9, 6612: 0x81CD, 6613: 0x81D1, 6614: 0x81D9, 6615: 0x81D8, 6616: 0x81C8, 6617: 0x81DA, 6618: 0x81DF, 6619: 0x81E0, 6620: 0x81E7, 6621: 0x81FA, 6622: 0x81FB, 6623: 0x81FE, 6624: 0x8201, 6625: 0x8202, 6626: 0x8205, 6627: 0x8207, 6628: 0x820A, 6629: 0x820D, 6630: 0x8210, 6631: 0x8216, 6632: 0x8229, 6633: 0x822B, 6634: 0x8238, 6635: 0x8233, 6636: 0x8240, 6637: 0x8259, 6638: 0x8258, 6639: 0x825D, 6640: 0x825A, 6641: 0x825F, 6642: 0x8264, 6643: 0x8262, 6644: 0x8268, 6645: 0x826A, 6646: 0x826B, 6647: 0x822E, 6648: 0x8271, 6649: 0x8277, 6650: 0x8278, 6651: 0x827E, 6652: 0x828D, 6653: 0x8292, 6654: 0x82AB, 6655: 0x829F, 6656: 0x82BB, 6657: 0x82AC, 6658: 0x82E1, 6659: 0x82E3, 6660: 0x82DF, 6661: 0x82D2, 6662: 0x82F4, 6663: 0x82F3, 6664: 0x82FA, 6665: 0x8393, 6666: 0x8303, 6667: 0x82FB, 6668: 0x82F9, 6669: 0x82DE, 6670: 0x8306, 6671: 0x82DC, 6672: 0x8309, 6673: 0x82D9, 6674: 0x8335, 6675: 0x8334, 6676: 0x8316, 6677: 0x8332, 6678: 0x8331, 6679: 0x8340, 6680: 0x8339, 6681: 0x8350, 6682: 0x8345, 6683: 0x832F, 6684: 0x832B, 6685: 0x8317, 6686: 0x8318, 6687: 0x8385, 6688: 0x839A, 6689: 0x83AA, 6690: 0x839F, 6691: 0x83A2, 6692: 0x8396, 6693: 0x8323, 6694: 0x838E, 6695: 0x8387, 6696: 0x838A, 6697: 0x837C, 6698: 0x83B5, 6699: 0x8373, 6700: 0x8375, 6701: 0x83A0, 6702: 0x8389, 6703: 0x83A8, 6704: 0x83F4, 6705: 0x8413, 6706: 0x83EB, 6707: 0x83CE, 6708: 0x83FD, 6709: 0x8403, 6710: 0x83D8, 6711: 0x840B, 6712: 0x83C1, 6713: 0x83F7, 6714: 0x8407, 6715: 0x83E0, 6716: 0x83F2, 6717: 0x840D, 6718: 0x8422, 6719: 0x8420, 6720: 0x83BD, 6721: 0x8438, 6722: 0x8506, 6723: 0x83FB, 6724: 0x846D, 6725: 0x842A, 6726: 0x843C, 6727: 0x855A, 6728: 0x8484, 6729: 0x8477, 6730: 0x846B, 6731: 0x84AD, 6732: 0x846E, 6733: 0x8482, 6734: 0x8469, 6735: 0x8446, 6736: 0x842C, 6737: 0x846F, 6738: 0x8479, 6739: 0x8435, 6740: 0x84CA, 6741: 0x8462, 6742: 0x84B9, 6743: 0x84BF, 6744: 0x849F, 6745: 0x84D9, 6746: 0x84CD, 6747: 0x84BB, 6748: 0x84DA, 6749: 0x84D0, 6750: 0x84C1, 6751: 0x84C6, 6752: 0x84D6, 6753: 0x84A1, 6754: 0x8521, 6755: 0x84FF, 6756: 0x84F4, 6757: 0x8517, 6758: 0x8518, 6759: 0x852C, 6760: 0x851F, 6761: 0x8515, 6762: 0x8514, 6763: 0x84FC, 6764: 0x8540, 6765: 0x8563, 6766: 0x8558, 6767: 0x8548, 6768: 0x8541, 6769: 0x8602, 6770: 0x854B, 6771: 0x8555, 6772: 0x8580, 6773: 0x85A4, 6774: 0x8588, 6775: 0x8591, 6776: 0x858A, 6777: 0x85A8, 6778: 0x856D, 6779: 0x8594, 6780: 0x859B, 6781: 0x85EA, 6782: 0x8587, 6783: 0x859C, 6784: 0x8577, 6785: 0x857E, 6786: 0x8590, 6787: 0x85C9, 6788: 0x85BA, 6789: 0x85CF, 6790: 0x85B9, 6791: 0x85D0, 6792: 0x85D5, 6793: 0x85DD, 6794: 0x85E5, 6795: 0x85DC, 6796: 0x85F9, 6797: 0x860A, 6798: 0x8613, 6799: 0x860B, 6800: 0x85FE, 6801: 0x85FA, 6802: 0x8606, 6803: 0x8622, 6804: 0x861A, 6805: 0x8630, 6806: 0x863F, 6807: 0x864D, 6808: 0x4E55, 6809: 0x8654, 6810: 0x865F, 6811: 0x8667, 6812: 0x8671, 6813: 0x8693, 6814: 0x86A3, 6815: 0x86A9, 6816: 0x86AA, 6817: 0x868B, 6818: 0x868C, 6819: 0x86B6, 6820: 0x86AF, 6821: 0x86C4, 6822: 0x86C6, 6823: 0x86B0, 6824: 0x86C9, 6825: 0x8823, 6826: 0x86AB, 6827: 0x86D4, 6828: 0x86DE, 6829: 0x86E9, 6830: 0x86EC, 6831: 0x86DF, 6832: 0x86DB, 6833: 0x86EF, 6834: 0x8712, 6835: 0x8706, 6836: 0x8708, 6837: 0x8700, 6838: 0x8703, 6839: 0x86FB, 6840: 0x8711, 6841: 0x8709, 6842: 0x870D, 6843: 0x86F9, 6844: 0x870A, 6845: 0x8734, 6846: 0x873F, 6847: 0x8737, 6848: 0x873B, 6849: 0x8725, 6850: 0x8729, 6851: 0x871A, 6852: 0x8760, 6853: 0x875F, 6854: 0x8778, 6855: 0x874C, 6856: 0x874E, 6857: 0x8774, 6858: 0x8757, 6859: 0x8768, 6860: 0x876E, 6861: 0x8759, 6862: 0x8753, 6863: 0x8763, 6864: 0x876A, 6865: 0x8805, 6866: 0x87A2, 6867: 0x879F, 6868: 0x8782, 6869: 0x87AF, 6870: 0x87CB, 6871: 0x87BD, 6872: 0x87C0, 6873: 0x87D0, 6874: 0x96D6, 6875: 0x87AB, 6876: 0x87C4, 6877: 0x87B3, 6878: 0x87C7, 6879: 0x87C6, 6880: 0x87BB, 6881: 0x87EF, 6882: 0x87F2, 6883: 0x87E0, 6884: 0x880F, 6885: 0x880D, 6886: 0x87FE, 6887: 0x87F6, 6888: 0x87F7, 6889: 0x880E, 6890: 0x87D2, 6891: 0x8811, 6892: 0x8816, 6893: 0x8815, 6894: 0x8822, 6895: 0x8821, 6896: 0x8831, 6897: 0x8836, 6898: 0x8839, 6899: 0x8827, 6900: 0x883B, 6901: 0x8844, 6902: 0x8842, 6903: 0x8852, 6904: 0x8859, 6905: 0x885E, 6906: 0x8862, 6907: 0x886B, 6908: 0x8881, 6909: 0x887E, 6910: 0x889E, 6911: 0x8875, 6912: 0x887D, 6913: 0x88B5, 6914: 0x8872, 6915: 0x8882, 6916: 0x8897, 6917: 0x8892, 6918: 0x88AE, 6919: 0x8899, 6920: 0x88A2, 6921: 0x888D, 6922: 0x88A4, 6923: 0x88B0, 6924: 0x88BF, 6925: 0x88B1, 6926: 0x88C3, 6927: 0x88C4, 6928: 0x88D4, 6929: 0x88D8, 6930: 0x88D9, 6931: 0x88DD, 6932: 0x88F9, 6933: 0x8902, 6934: 0x88FC, 6935: 0x88F4, 6936: 0x88E8, 6937: 0x88F2, 6938: 0x8904, 6939: 0x890C, 6940: 0x890A, 6941: 0x8913, 6942: 0x8943, 6943: 0x891E, 6944: 0x8925, 6945: 0x892A, 6946: 0x892B, 6947: 0x8941, 6948: 0x8944, 6949: 0x893B, 6950: 0x8936, 6951: 0x8938, 6952: 0x894C, 6953: 0x891D, 6954: 0x8960, 6955: 0x895E, 6956: 0x8966, 6957: 0x8964, 6958: 0x896D, 6959: 0x896A, 6960: 0x896F, 6961: 0x8974, 6962: 0x8977, 6963: 0x897E, 6964: 0x8983, 6965: 0x8988, 6966: 0x898A, 6967: 0x8993, 6968: 0x8998, 6969: 0x89A1, 6970: 0x89A9, 6971: 0x89A6, 6972: 0x89AC, 6973: 0x89AF, 6974: 0x89B2, 6975: 0x89BA, 6976: 0x89BD, 6977: 0x89BF, 6978: 0x89C0, 6979: 0x89DA, 6980: 0x89DC, 6981: 0x89DD, 6982: 0x89E7, 6983: 0x89F4, 6984: 0x89F8, 6985: 0x8A03, 6986: 0x8A16, 6987: 0x8A10, 6988: 0x8A0C, 6989: 0x8A1B, 6990: 0x8A1D, 6991: 0x8A25, 6992: 0x8A36, 6993: 0x8A41, 6994: 0x8A5B, 6995: 0x8A52, 6996: 0x8A46, 6997: 0x8A48, 6998: 0x8A7C, 6999: 0x8A6D, 7000: 0x8A6C, 7001: 0x8A62, 7002: 0x8A85, 7003: 0x8A82, 7004: 0x8A84, 7005: 0x8AA8, 7006: 0x8AA1, 7007: 0x8A91, 7008: 0x8AA5, 7009: 0x8AA6, 7010: 0x8A9A, 7011: 0x8AA3, 7012: 0x8AC4, 7013: 0x8ACD, 7014: 0x8AC2, 7015: 0x8ADA, 7016: 0x8AEB, 7017: 0x8AF3, 7018: 0x8AE7, 7019: 0x8AE4, 7020: 0x8AF1, 7021: 0x8B14, 7022: 0x8AE0, 7023: 0x8AE2, 7024: 0x8AF7, 7025: 0x8ADE, 7026: 0x8ADB, 7027: 0x8B0C, 7028: 0x8B07, 7029: 0x8B1A, 7030: 0x8AE1, 7031: 0x8B16, 7032: 0x8B10, 7033: 0x8B17, 7034: 0x8B20, 7035: 0x8B33, 7036: 0x97AB, 7037: 0x8B26, 7038: 0x8B2B, 7039: 0x8B3E, 7040: 0x8B28, 7041: 0x8B41, 7042: 0x8B4C, 7043: 0x8B4F, 7044: 0x8B4E, 7045: 0x8B49, 7046: 0x8B56, 7047: 0x8B5B, 7048: 0x8B5A, 7049: 0x8B6B, 7050: 0x8B5F, 7051: 0x8B6C, 7052: 0x8B6F, 7053: 0x8B74, 7054: 0x8B7D, 7055: 0x8B80, 7056: 0x8B8C, 7057: 0x8B8E, 7058: 0x8B92, 7059: 0x8B93, 7060: 0x8B96, 7061: 0x8B99, 7062: 0x8B9A, 7063: 0x8C3A, 7064: 0x8C41, 7065: 0x8C3F, 7066: 0x8C48, 7067: 0x8C4C, 7068: 0x8C4E, 7069: 0x8C50, 7070: 0x8C55, 7071: 0x8C62, 7072: 0x8C6C, 7073: 0x8C78, 7074: 0x8C7A, 7075: 0x8C82, 7076: 0x8C89, 7077: 0x8C85, 7078: 0x8C8A, 7079: 0x8C8D, 7080: 0x8C8E, 7081: 0x8C94, 7082: 0x8C7C, 7083: 0x8C98, 7084: 0x621D, 7085: 0x8CAD, 7086: 0x8CAA, 7087: 0x8CBD, 7088: 0x8CB2, 7089: 0x8CB3, 7090: 0x8CAE, 7091: 0x8CB6, 7092: 0x8CC8, 7093: 0x8CC1, 7094: 0x8CE4, 7095: 0x8CE3, 7096: 0x8CDA, 7097: 0x8CFD, 7098: 0x8CFA, 7099: 0x8CFB, 7100: 0x8D04, 7101: 0x8D05, 7102: 0x8D0A, 7103: 0x8D07, 7104: 0x8D0F, 7105: 0x8D0D, 7106: 0x8D10, 7107: 0x9F4E, 7108: 0x8D13, 7109: 0x8CCD, 7110: 0x8D14, 7111: 0x8D16, 7112: 0x8D67, 7113: 0x8D6D, 7114: 0x8D71, 7115: 0x8D73, 7116: 0x8D81, 7117: 0x8D99, 7118: 0x8DC2, 7119: 0x8DBE, 7120: 0x8DBA, 7121: 0x8DCF, 7122: 0x8DDA, 7123: 0x8DD6, 7124: 0x8DCC, 7125: 0x8DDB, 7126: 0x8DCB, 7127: 0x8DEA, 7128: 0x8DEB, 7129: 0x8DDF, 7130: 0x8DE3, 7131: 0x8DFC, 7132: 0x8E08, 7133: 0x8E09, 7134: 0x8DFF, 7135: 0x8E1D, 7136: 0x8E1E, 7137: 0x8E10, 7138: 0x8E1F, 7139: 0x8E42, 7140: 0x8E35, 7141: 0x8E30, 7142: 0x8E34, 7143: 0x8E4A, 7144: 0x8E47, 7145: 0x8E49, 7146: 0x8E4C, 7147: 0x8E50, 7148: 0x8E48, 7149: 0x8E59, 7150: 0x8E64, 7151: 0x8E60, 7152: 0x8E2A, 7153: 0x8E63, 7154: 0x8E55, 7155: 0x8E76, 7156: 0x8E72, 7157: 0x8E7C, 7158: 0x8E81, 7159: 0x8E87, 7160: 0x8E85, 7161: 0x8E84, 7162: 0x8E8B, 7163: 0x8E8A, 7164: 0x8E93, 7165: 0x8E91, 7166: 0x8E94, 7167: 0x8E99, 7168: 0x8EAA, 7169: 0x8EA1, 7170: 0x8EAC, 7171: 0x8EB0, 7172: 0x8EC6, 7173: 0x8EB1, 7174: 0x8EBE, 7175: 0x8EC5, 7176: 0x8EC8, 7177: 0x8ECB, 7178: 0x8EDB, 7179: 0x8EE3, 7180: 0x8EFC, 7181: 0x8EFB, 7182: 0x8EEB, 7183: 0x8EFE, 7184: 0x8F0A, 7185: 0x8F05, 7186: 0x8F15, 7187: 0x8F12, 7188: 0x8F19, 7189: 0x8F13, 7190: 0x8F1C, 7191: 0x8F1F, 7192: 0x8F1B, 7193: 0x8F0C, 7194: 0x8F26, 7195: 0x8F33, 7196: 0x8F3B, 7197: 0x8F39, 7198: 0x8F45, 7199: 0x8F42, 7200: 0x8F3E, 7201: 0x8F4C, 7202: 0x8F49, 7203: 0x8F46, 7204: 0x8F4E, 7205: 0x8F57, 7206: 0x8F5C, 7207: 0x8F62, 7208: 0x8F63, 7209: 0x8F64, 7210: 0x8F9C, 7211: 0x8F9F, 7212: 0x8FA3, 7213: 0x8FAD, 7214: 0x8FAF, 7215: 0x8FB7, 7216: 0x8FDA, 7217: 0x8FE5, 7218: 0x8FE2, 7219: 0x8FEA, 7220: 0x8FEF, 7221: 0x9087, 7222: 0x8FF4, 7223: 0x9005, 7224: 0x8FF9, 7225: 0x8FFA, 7226: 0x9011, 7227: 0x9015, 7228: 0x9021, 7229: 0x900D, 7230: 0x901E, 7231: 0x9016, 7232: 0x900B, 7233: 0x9027, 7234: 0x9036, 7235: 0x9035, 7236: 0x9039, 7237: 0x8FF8, 7238: 0x904F, 7239: 0x9050, 7240: 0x9051, 7241: 0x9052, 7242: 0x900E, 7243: 0x9049, 7244: 0x903E, 7245: 0x9056, 7246: 0x9058, 7247: 0x905E, 7248: 0x9068, 7249: 0x906F, 7250: 0x9076, 7251: 0x96A8, 7252: 0x9072, 7253: 0x9082, 7254: 0x907D, 7255: 0x9081, 7256: 0x9080, 7257: 0x908A, 7258: 0x9089, 7259: 0x908F, 7260: 0x90A8, 7261: 0x90AF, 7262: 0x90B1, 7263: 0x90B5, 7264: 0x90E2, 7265: 0x90E4, 7266: 0x6248, 7267: 0x90DB, 7268: 0x9102, 7269: 0x9112, 7270: 0x9119, 7271: 0x9132, 7272: 0x9130, 7273: 0x914A, 7274: 0x9156, 7275: 0x9158, 7276: 0x9163, 7277: 0x9165, 7278: 0x9169, 7279: 0x9173, 7280: 0x9172, 7281: 0x918B, 7282: 0x9189, 7283: 0x9182, 7284: 0x91A2, 7285: 0x91AB, 7286: 0x91AF, 7287: 0x91AA, 7288: 0x91B5, 7289: 0x91B4, 7290: 0x91BA, 7291: 0x91C0, 7292: 0x91C1, 7293: 0x91C9, 7294: 0x91CB, 7295: 0x91D0, 7296: 0x91D6, 7297: 0x91DF, 7298: 0x91E1, 7299: 0x91DB, 7300: 0x91FC, 7301: 0x91F5, 7302: 0x91F6, 7303: 0x921E, 7304: 0x91FF, 7305: 0x9214, 7306: 0x922C, 7307: 0x9215, 7308: 0x9211, 7309: 0x925E, 7310: 0x9257, 7311: 0x9245, 7312: 0x9249, 7313: 0x9264, 7314: 0x9248, 7315: 0x9295, 7316: 0x923F, 7317: 0x924B, 7318: 0x9250, 7319: 0x929C, 7320: 0x9296, 7321: 0x9293, 7322: 0x929B, 7323: 0x925A, 7324: 0x92CF, 7325: 0x92B9, 7326: 0x92B7, 7327: 0x92E9, 7328: 0x930F, 7329: 0x92FA, 7330: 0x9344, 7331: 0x932E, 7332: 0x9319, 7333: 0x9322, 7334: 0x931A, 7335: 0x9323, 7336: 0x933A, 7337: 0x9335, 7338: 0x933B, 7339: 0x935C, 7340: 0x9360, 7341: 0x937C, 7342: 0x936E, 7343: 0x9356, 7344: 0x93B0, 7345: 0x93AC, 7346: 0x93AD, 7347: 0x9394, 7348: 0x93B9, 7349: 0x93D6, 7350: 0x93D7, 7351: 0x93E8, 7352: 0x93E5, 7353: 0x93D8, 7354: 0x93C3, 7355: 0x93DD, 7356: 0x93D0, 7357: 0x93C8, 7358: 0x93E4, 7359: 0x941A, 7360: 0x9414, 7361: 0x9413, 7362: 0x9403, 7363: 0x9407, 7364: 0x9410, 7365: 0x9436, 7366: 0x942B, 7367: 0x9435, 7368: 0x9421, 7369: 0x943A, 7370: 0x9441, 7371: 0x9452, 7372: 0x9444, 7373: 0x945B, 7374: 0x9460, 7375: 0x9462, 7376: 0x945E, 7377: 0x946A, 7378: 0x9229, 7379: 0x9470, 7380: 0x9475, 7381: 0x9477, 7382: 0x947D, 7383: 0x945A, 7384: 0x947C, 7385: 0x947E, 7386: 0x9481, 7387: 0x947F, 7388: 0x9582, 7389: 0x9587, 7390: 0x958A, 7391: 0x9594, 7392: 0x9596, 7393: 0x9598, 7394: 0x9599, 7395: 0x95A0, 7396: 0x95A8, 7397: 0x95A7, 7398: 0x95AD, 7399: 0x95BC, 7400: 0x95BB, 7401: 0x95B9, 7402: 0x95BE, 7403: 0x95CA, 7404: 0x6FF6, 7405: 0x95C3, 7406: 0x95CD, 7407: 0x95CC, 7408: 0x95D5, 7409: 0x95D4, 7410: 0x95D6, 7411: 0x95DC, 7412: 0x95E1, 7413: 0x95E5, 7414: 0x95E2, 7415: 0x9621, 7416: 0x9628, 7417: 0x962E, 7418: 0x962F, 7419: 0x9642, 7420: 0x964C, 7421: 0x964F, 7422: 0x964B, 7423: 0x9677, 7424: 0x965C, 7425: 0x965E, 7426: 0x965D, 7427: 0x965F, 7428: 0x9666, 7429: 0x9672, 7430: 0x966C, 7431: 0x968D, 7432: 0x9698, 7433: 0x9695, 7434: 0x9697, 7435: 0x96AA, 7436: 0x96A7, 7437: 0x96B1, 7438: 0x96B2, 7439: 0x96B0, 7440: 0x96B4, 7441: 0x96B6, 7442: 0x96B8, 7443: 0x96B9, 7444: 0x96CE, 7445: 0x96CB, 7446: 0x96C9, 7447: 0x96CD, 7448: 0x894D, 7449: 0x96DC, 7450: 0x970D, 7451: 0x96D5, 7452: 0x96F9, 7453: 0x9704, 7454: 0x9706, 7455: 0x9708, 7456: 0x9713, 7457: 0x970E, 7458: 0x9711, 7459: 0x970F, 7460: 0x9716, 7461: 0x9719, 7462: 0x9724, 7463: 0x972A, 7464: 0x9730, 7465: 0x9739, 7466: 0x973D, 7467: 0x973E, 7468: 0x9744, 7469: 0x9746, 7470: 0x9748, 7471: 0x9742, 7472: 0x9749, 7473: 0x975C, 7474: 0x9760, 7475: 0x9764, 7476: 0x9766, 7477: 0x9768, 7478: 0x52D2, 7479: 0x976B, 7480: 0x9771, 7481: 0x9779, 7482: 0x9785, 7483: 0x977C, 7484: 0x9781, 7485: 0x977A, 7486: 0x9786, 7487: 0x978B, 7488: 0x978F, 7489: 0x9790, 7490: 0x979C, 7491: 0x97A8, 7492: 0x97A6, 7493: 0x97A3, 7494: 0x97B3, 7495: 0x97B4, 7496: 0x97C3, 7497: 0x97C6, 7498: 0x97C8, 7499: 0x97CB, 7500: 0x97DC, 7501: 0x97ED, 7502: 0x9F4F, 7503: 0x97F2, 7504: 0x7ADF, 7505: 0x97F6, 7506: 0x97F5, 7507: 0x980F, 7508: 0x980C, 7509: 0x9838, 7510: 0x9824, 7511: 0x9821, 7512: 0x9837, 7513: 0x983D, 7514: 0x9846, 7515: 0x984F, 7516: 0x984B, 7517: 0x986B, 7518: 0x986F, 7519: 0x9870, 7520: 0x9871, 7521: 0x9874, 7522: 0x9873, 7523: 0x98AA, 7524: 0x98AF, 7525: 0x98B1, 7526: 0x98B6, 7527: 0x98C4, 7528: 0x98C3, 7529: 0x98C6, 7530: 0x98E9, 7531: 0x98EB, 7532: 0x9903, 7533: 0x9909, 7534: 0x9912, 7535: 0x9914, 7536: 0x9918, 7537: 0x9921, 7538: 0x991D, 7539: 0x991E, 7540: 0x9924, 7541: 0x9920, 7542: 0x992C, 7543: 0x992E, 7544: 0x993D, 7545: 0x993E, 7546: 0x9942, 7547: 0x9949, 7548: 0x9945, 7549: 0x9950, 7550: 0x994B, 7551: 0x9951, 7552: 0x9952, 7553: 0x994C, 7554: 0x9955, 7555: 0x9997, 7556: 0x9998, 7557: 0x99A5, 7558: 0x99AD, 7559: 0x99AE, 7560: 0x99BC, 7561: 0x99DF, 7562: 0x99DB, 7563: 0x99DD, 7564: 0x99D8, 7565: 0x99D1, 7566: 0x99ED, 7567: 0x99EE, 7568: 0x99F1, 7569: 0x99F2, 7570: 0x99FB, 7571: 0x99F8, 7572: 0x9A01, 7573: 0x9A0F, 7574: 0x9A05, 7575: 0x99E2, 7576: 0x9A19, 7577: 0x9A2B, 7578: 0x9A37, 7579: 0x9A45, 7580: 0x9A42, 7581: 0x9A40, 7582: 0x9A43, 7583: 0x9A3E, 7584: 0x9A55, 7585: 0x9A4D, 7586: 0x9A5B, 7587: 0x9A57, 7588: 0x9A5F, 7589: 0x9A62, 7590: 0x9A65, 7591: 0x9A64, 7592: 0x9A69, 7593: 0x9A6B, 7594: 0x9A6A, 7595: 0x9AAD, 7596: 0x9AB0, 7597: 0x9ABC, 7598: 0x9AC0, 7599: 0x9ACF, 7600: 0x9AD1, 7601: 0x9AD3, 7602: 0x9AD4, 7603: 0x9ADE, 7604: 0x9ADF, 7605: 0x9AE2, 7606: 0x9AE3, 7607: 0x9AE6, 7608: 0x9AEF, 7609: 0x9AEB, 7610: 0x9AEE, 7611: 0x9AF4, 7612: 0x9AF1, 7613: 0x9AF7, 7614: 0x9AFB, 7615: 0x9B06, 7616: 0x9B18, 7617: 0x9B1A, 7618: 0x9B1F, 7619: 0x9B22, 7620: 0x9B23, 7621: 0x9B25, 7622: 0x9B27, 7623: 0x9B28, 7624: 0x9B29, 7625: 0x9B2A, 7626: 0x9B2E, 7627: 0x9B2F, 7628: 0x9B32, 7629: 0x9B44, 7630: 0x9B43, 7631: 0x9B4F, 7632: 0x9B4D, 7633: 0x9B4E, 7634: 0x9B51, 7635: 0x9B58, 7636: 0x9B74, 7637: 0x9B93, 7638: 0x9B83, 7639: 0x9B91, 7640: 0x9B96, 7641: 0x9B97, 7642: 0x9B9F, 7643: 0x9BA0, 7644: 0x9BA8, 7645: 0x9BB4, 7646: 0x9BC0, 7647: 0x9BCA, 7648: 0x9BB9, 7649: 0x9BC6, 7650: 0x9BCF, 7651: 0x9BD1, 7652: 0x9BD2, 7653: 0x9BE3, 7654: 0x9BE2, 7655: 0x9BE4, 7656: 0x9BD4, 7657: 0x9BE1, 7658: 0x9C3A, 7659: 0x9BF2, 7660: 0x9BF1, 7661: 0x9BF0, 7662: 0x9C15, 7663: 0x9C14, 7664: 0x9C09, 7665: 0x9C13, 7666: 0x9C0C, 7667: 0x9C06, 7668: 0x9C08, 7669: 0x9C12, 7670: 0x9C0A, 7671: 0x9C04, 7672: 0x9C2E, 7673: 0x9C1B, 7674: 0x9C25, 7675: 0x9C24, 7676: 0x9C21, 7677: 0x9C30, 7678: 0x9C47, 7679: 0x9C32, 7680: 0x9C46, 7681: 0x9C3E, 7682: 0x9C5A, 7683: 0x9C60, 7684: 0x9C67, 7685: 0x9C76, 7686: 0x9C78, 7687: 0x9CE7, 7688: 0x9CEC, 7689: 0x9CF0, 7690: 0x9D09, 7691: 0x9D08, 7692: 0x9CEB, 7693: 0x9D03, 7694: 0x9D06, 7695: 0x9D2A, 7696: 0x9D26, 7697: 0x9DAF, 7698: 0x9D23, 7699: 0x9D1F, 7700: 0x9D44, 7701: 0x9D15, 7702: 0x9D12, 7703: 0x9D41, 7704: 0x9D3F, 7705: 0x9D3E, 7706: 0x9D46, 7707: 0x9D48, 7708: 0x9D5D, 7709: 0x9D5E, 7710: 0x9D64, 7711: 0x9D51, 7712: 0x9D50, 7713: 0x9D59, 7714: 0x9D72, 7715: 0x9D89, 7716: 0x9D87, 7717: 0x9DAB, 7718: 0x9D6F, 7719: 0x9D7A, 7720: 0x9D9A, 7721: 0x9DA4, 7722: 0x9DA9, 7723: 0x9DB2, 7724: 0x9DC4, 7725: 0x9DC1, 7726: 0x9DBB, 7727: 0x9DB8, 7728: 0x9DBA, 7729: 0x9DC6, 7730: 0x9DCF, 7731: 0x9DC2, 7732: 0x9DD9, 7733: 0x9DD3, 7734: 0x9DF8, 7735: 0x9DE6, 7736: 0x9DED, 7737: 0x9DEF, 7738: 0x9DFD, 7739: 0x9E1A, 7740: 0x9E1B, 7741: 0x9E1E, 7742: 0x9E75, 7743: 0x9E79, 7744: 0x9E7D, 7745: 0x9E81, 7746: 0x9E88, 7747: 0x9E8B, 7748: 0x9E8C, 7749: 0x9E92, 7750: 0x9E95, 7751: 0x9E91, 7752: 0x9E9D, 7753: 0x9EA5, 7754: 0x9EA9, 7755: 0x9EB8, 7756: 0x9EAA, 7757: 0x9EAD, 7758: 0x9761, 7759: 0x9ECC, 7760: 0x9ECE, 7761: 0x9ECF, 7762: 0x9ED0, 7763: 0x9ED4, 7764: 0x9EDC, 7765: 0x9EDE, 7766: 0x9EDD, 7767: 0x9EE0, 7768: 0x9EE5, 7769: 0x9EE8, 7770: 0x9EEF, 7771: 0x9EF4, 7772: 0x9EF6, 7773: 0x9EF7, 7774: 0x9EF9, 7775: 0x9EFB, 7776: 0x9EFC, 7777: 0x9EFD, 7778: 0x9F07, 7779: 0x9F08, 7780: 0x76B7, 7781: 0x9F15, 7782: 0x9F21, 7783: 0x9F2C, 7784: 0x9F3E, 7785: 0x9F4A, 7786: 0x9F52, 7787: 0x9F54, 7788: 0x9F63, 7789: 0x9F5F, 7790: 0x9F60, 7791: 0x9F61, 7792: 0x9F66, 7793: 0x9F67, 7794: 0x9F6C, 7795: 0x9F6A, 7796: 0x9F77, 7797: 0x9F72, 7798: 0x9F76, 7799: 0x9F95, 7800: 0x9F9C, 7801: 0x9FA0, 7802: 0x582F, 7803: 0x69C7, 7804: 0x9059, 7805: 0x7464, 7806: 0x51DC, 7807: 0x7199, 8272: 0x7E8A, 8273: 0x891C, 8274: 0x9348, 8275: 0x9288, 8276: 0x84DC, 8277: 0x4FC9, 8278: 0x70BB, 8279: 0x6631, 8280: 0x68C8, 8281: 0x92F9, 8282: 0x66FB, 8283: 0x5F45, 8284: 0x4E28, 8285: 0x4EE1, 8286: 0x4EFC, 8287: 0x4F00, 8288: 0x4F03, 8289: 0x4F39, 8290: 0x4F56, 8291: 0x4F92, 8292: 0x4F8A, 8293: 0x4F9A, 8294: 0x4F94, 8295: 0x4FCD, 8296: 0x5040, 8297: 0x5022, 8298: 0x4FFF, 8299: 0x501E, 8300: 0x5046, 8301: 0x5070, 8302: 0x5042, 8303: 0x5094, 8304: 0x50F4, 8305: 0x50D8, 8306: 0x514A, 8307: 0x5164, 8308: 0x519D, 8309: 0x51BE, 8310: 0x51EC, 8311: 0x5215, 8312: 0x529C, 8313: 0x52A6, 8314: 0x52C0, 8315: 0x52DB, 8316: 0x5300, 8317: 0x5307, 8318: 0x5324, 8319: 0x5372, 8320: 0x5393, 8321: 0x53B2, 8322: 0x53DD, 8323: 0xFA0E, 8324: 0x549C, 8325: 0x548A, 8326: 0x54A9, 8327: 0x54FF, 8328: 0x5586, 8329: 0x5759, 8330: 0x5765, 8331: 0x57AC, 8332: 0x57C8, 8333: 0x57C7, 8334: 0xFA0F, 8335: 0xFA10, 8336: 0x589E, 8337: 0x58B2, 8338: 0x590B, 8339: 0x5953, 8340: 0x595B, 8341: 0x595D, 8342: 0x5963, 8343: 0x59A4, 8344: 0x59BA, 8345: 0x5B56, 8346: 0x5BC0, 8347: 0x752F, 8348: 0x5BD8, 8349: 0x5BEC, 8350: 0x5C1E, 8351: 0x5CA6, 8352: 0x5CBA, 8353: 0x5CF5, 8354: 0x5D27, 8355: 0x5D53, 8356: 0xFA11, 8357: 0x5D42, 8358: 0x5D6D, 8359: 0x5DB8, 8360: 0x5DB9, 8361: 0x5DD0, 8362: 0x5F21, 8363: 0x5F34, 8364: 0x5F67, 8365: 0x5FB7, 8366: 0x5FDE, 8367: 0x605D, 8368: 0x6085, 8369: 0x608A, 8370: 0x60DE, 8371: 0x60D5, 8372: 0x6120, 8373: 0x60F2, 8374: 0x6111, 8375: 0x6137, 8376: 0x6130, 8377: 0x6198, 8378: 0x6213, 8379: 0x62A6, 8380: 0x63F5, 8381: 0x6460, 8382: 0x649D, 8383: 0x64CE, 8384: 0x654E, 8385: 0x6600, 8386: 0x6615, 8387: 0x663B, 8388: 0x6609, 8389: 0x662E, 8390: 0x661E, 8391: 0x6624, 8392: 0x6665, 8393: 0x6657, 8394: 0x6659, 8395: 0xFA12, 8396: 0x6673, 8397: 0x6699, 8398: 0x66A0, 8399: 0x66B2, 8400: 0x66BF, 8401: 0x66FA, 8402: 0x670E, 8403: 0xF929, 8404: 0x6766, 8405: 0x67BB, 8406: 0x6852, 8407: 0x67C0, 8408: 0x6801, 8409: 0x6844, 8410: 0x68CF, 8411: 0xFA13, 8412: 0x6968, 8413: 0xFA14, 8414: 0x6998, 8415: 0x69E2, 8416: 0x6A30, 8417: 0x6A6B, 8418: 0x6A46, 8419: 0x6A73, 8420: 0x6A7E, 8421: 0x6AE2, 8422: 0x6AE4, 8423: 0x6BD6, 8424: 0x6C3F, 8425: 0x6C5C, 8426: 0x6C86, 8427: 0x6C6F, 8428: 0x6CDA, 8429: 0x6D04, 8430: 0x6D87, 8431: 0x6D6F, 8432: 0x6D96, 8433: 0x6DAC, 8434: 0x6DCF, 8435: 0x6DF8, 8436: 0x6DF2, 8437: 0x6DFC, 8438: 0x6E39, 8439: 0x6E5C, 8440: 0x6E27, 8441: 0x6E3C, 8442: 0x6EBF, 8443: 0x6F88, 8444: 0x6FB5, 8445: 0x6FF5, 8446: 0x7005, 8447: 0x7007, 8448: 0x7028, 8449: 0x7085, 8450: 0x70AB, 8451: 0x710F, 8452: 0x7104, 8453: 0x715C, 8454: 0x7146, 8455: 0x7147, 8456: 0xFA15, 8457: 0x71C1, 8458: 0x71FE, 8459: 0x72B1, 8460: 0x72BE, 8461: 0x7324, 8462: 0xFA16, 8463: 0x7377, 8464: 0x73BD, 8465: 0x73C9, 8466: 0x73D6, 8467: 0x73E3, 8468: 0x73D2, 8469: 0x7407, 8470: 0x73F5, 8471: 0x7426, 8472: 0x742A, 8473: 0x7429, 8474: 0x742E, 8475: 0x7462, 8476: 0x7489, 8477: 0x749F, 8478: 0x7501, 8479: 0x756F, 8480: 0x7682, 8481: 0x769C, 8482: 0x769E, 8483: 0x769B, 8484: 0x76A6, 8485: 0xFA17, 8486: 0x7746, 8487: 0x52AF, 8488: 0x7821, 8489: 0x784E, 8490: 0x7864, 8491: 0x787A, 8492: 0x7930, 8493: 0xFA18, 8494: 0xFA19, 8495: 0xFA1A, 8496: 0x7994, 8497: 0xFA1B, 8498: 0x799B, 8499: 0x7AD1, 8500: 0x7AE7, 8501: 0xFA1C, 8502: 0x7AEB, 8503: 0x7B9E, 8504: 0xFA1D, 8505: 0x7D48, 8506: 0x7D5C, 8507: 0x7DB7, 8508: 0x7DA0, 8509: 0x7DD6, 8510: 0x7E52, 8511: 0x7F47, 8512: 0x7FA1, 8513: 0xFA1E, 8514: 0x8301, 8515: 0x8362, 8516: 0x837F, 8517: 0x83C7, 8518: 0x83F6, 8519: 0x8448, 8520: 0x84B4, 8521: 0x8553, 8522: 0x8559, 8523: 0x856B, 8524: 0xFA1F, 8525: 0x85B0, 8526: 0xFA20, 8527: 0xFA21, 8528: 0x8807, 8529: 0x88F5, 8530: 0x8A12, 8531: 0x8A37, 8532: 0x8A79, 8533: 0x8AA7, 8534: 0x8ABE, 8535: 0x8ADF, 8536: 0xFA22, 8537: 0x8AF6, 8538: 0x8B53, 8539: 0x8B7F, 8540: 0x8CF0, 8541: 0x8CF4, 8542: 0x8D12, 8543: 0x8D76, 8544: 0xFA23, 8545: 0x8ECF, 8546: 0xFA24, 8547: 0xFA25, 8548: 0x9067, 8549: 0x90DE, 8550: 0xFA26, 8551: 0x9115, 8552: 0x9127, 8553: 0x91DA, 8554: 0x91D7, 8555: 0x91DE, 8556: 0x91ED, 8557: 0x91EE, 8558: 0x91E4, 8559: 0x91E5, 8560: 0x9206, 8561: 0x9210, 8562: 0x920A, 8563: 0x923A, 8564: 0x9240, 8565: 0x923C, 8566: 0x924E, 8567: 0x9259, 8568: 0x9251, 8569: 0x9239, 8570: 0x9267, 8571: 0x92A7, 8572: 0x9277, 8573: 0x9278, 8574: 0x92E7, 8575: 0x92D7, 8576: 0x92D9, 8577: 0x92D0, 8578: 0xFA27, 8579: 0x92D5, 8580: 0x92E0, 8581: 0x92D3, 8582: 0x9325, 8583: 0x9321, 8584: 0x92FB, 8585: 0xFA28, 8586: 0x931E, 8587: 0x92FF, 8588: 0x931D, 8589: 0x9302, 8590: 0x9370, 8591: 0x9357, 8592: 0x93A4, 8593: 0x93C6, 8594: 0x93DE, 8595: 0x93F8, 8596: 0x9431, 8597: 0x9445, 8598: 0x9448, 8599: 0x9592, 8600: 0xF9DC, 8601: 0xFA29, 8602: 0x969D, 8603: 0x96AF, 8604: 0x9733, 8605: 0x973B, 8606: 0x9743, 8607: 0x974D, 8608: 0x974F, 8609: 0x9751, 8610: 0x9755, 8611: 0x9857, 8612: 0x9865, 8613: 0xFA2A, 8614: 0xFA2B, 8615: 0x9927, 8616: 0xFA2C, 8617: 0x999E, 8618: 0x9A4E, 8619: 0x9AD9, 8620: 0x9ADC, 8621: 0x9B75, 8622: 0x9B72, 8623: 0x9B8F, 8624: 0x9BB1, 8625: 0x9BBB, 8626: 0x9C00, 8627: 0x9D70, 8628: 0x9D6B, 8629: 0xFA2D, 8630: 0x9E19, 8631: 0x9ED1, 8634: 0x2170, 8635: 0x2171, 8636: 0x2172, 8637: 0x2173, 8638: 0x2174, 8639: 0x2175, 8640: 0x2176, 8641: 0x2177, 8642: 0x2178, 8643: 0x2179, 8644: 0xFFE2, 8645: 0xFFE4, 8646: 0xFF07, 8647: 0xFF02, 10716: 0x2170, 10717: 0x2171, 10718: 0x2172, 10719: 0x2173, 10720: 0x2174, 10721: 0x2175, 10722: 0x2176, 10723: 0x2177, 10724: 0x2178, 10725: 0x2179, 10726: 0x2160, 10727: 0x2161, 10728: 0x2162, 10729: 0x2163, 10730: 0x2164, 10731: 0x2165, 10732: 0x2166, 10733: 0x2167, 10734: 0x2168, 10735: 0x2169, 10736: 0xFFE2, 10737: 0xFFE4, 10738: 0xFF07, 10739: 0xFF02, 10740: 0x3231, 10741: 0x2116, 10742: 0x2121, 10743: 0x2235, 10744: 0x7E8A, 10745: 0x891C, 10746: 0x9348, 10747: 0x9288, 10748: 0x84DC, 10749: 0x4FC9, 10750: 0x70BB, 10751: 0x6631, 10752: 0x68C8, 10753: 0x92F9, 10754: 0x66FB, 10755: 0x5F45, 10756: 0x4E28, 10757: 0x4EE1, 10758: 0x4EFC, 10759: 0x4F00, 10760: 0x4F03, 10761: 0x4F39, 10762: 0x4F56, 10763: 0x4F92, 10764: 0x4F8A, 10765: 0x4F9A, 10766: 0x4F94, 10767: 0x4FCD, 10768: 0x5040, 10769: 0x5022, 10770: 0x4FFF, 10771: 0x501E, 10772: 0x5046, 10773: 0x5070, 10774: 0x5042, 10775: 0x5094, 10776: 0x50F4, 10777: 0x50D8, 10778: 0x514A, 10779: 0x5164, 10780: 0x519D, 10781: 0x51BE, 10782: 0x51EC, 10783: 0x5215, 10784: 0x529C, 10785: 0x52A6, 10786: 0x52C0, 10787: 0x52DB, 10788: 0x5300, 10789: 0x5307, 10790: 0x5324, 10791: 0x5372, 10792: 0x5393, 10793: 0x53B2, 10794: 0x53DD, 10795: 0xFA0E, 10796: 0x549C, 10797: 0x548A, 10798: 0x54A9, 10799: 0x54FF, 10800: 0x5586, 10801: 0x5759, 10802: 0x5765, 10803: 0x57AC, 10804: 0x57C8, 10805: 0x57C7, 10806: 0xFA0F, 10807: 0xFA10, 10808: 0x589E, 10809: 0x58B2, 10810: 0x590B, 10811: 0x5953, 10812: 0x595B, 10813: 0x595D, 10814: 0x5963, 10815: 0x59A4, 10816: 0x59BA, 10817: 0x5B56, 10818: 0x5BC0, 10819: 0x752F, 10820: 0x5BD8, 10821: 0x5BEC, 10822: 0x5C1E, 10823: 0x5CA6, 10824: 0x5CBA, 10825: 0x5CF5, 10826: 0x5D27, 10827: 0x5D53, 10828: 0xFA11, 10829: 0x5D42, 10830: 0x5D6D, 10831: 0x5DB8, 10832: 0x5DB9, 10833: 0x5DD0, 10834: 0x5F21, 10835: 0x5F34, 10836: 0x5F67, 10837: 0x5FB7, 10838: 0x5FDE, 10839: 0x605D, 10840: 0x6085, 10841: 0x608A, 10842: 0x60DE, 10843: 0x60D5, 10844: 0x6120, 10845: 0x60F2, 10846: 0x6111, 10847: 0x6137, 10848: 0x6130, 10849: 0x6198, 10850: 0x6213, 10851: 0x62A6, 10852: 0x63F5, 10853: 0x6460, 10854: 0x649D, 10855: 0x64CE, 10856: 0x654E, 10857: 0x6600, 10858: 0x6615, 10859: 0x663B, 10860: 0x6609, 10861: 0x662E, 10862: 0x661E, 10863: 0x6624, 10864: 0x6665, 10865: 0x6657, 10866: 0x6659, 10867: 0xFA12, 10868: 0x6673, 10869: 0x6699, 10870: 0x66A0, 10871: 0x66B2, 10872: 0x66BF, 10873: 0x66FA, 10874: 0x670E, 10875: 0xF929, 10876: 0x6766, 10877: 0x67BB, 10878: 0x6852, 10879: 0x67C0, 10880: 0x6801, 10881: 0x6844, 10882: 0x68CF, 10883: 0xFA13, 10884: 0x6968, 10885: 0xFA14, 10886: 0x6998, 10887: 0x69E2, 10888: 0x6A30, 10889: 0x6A6B, 10890: 0x6A46, 10891: 0x6A73, 10892: 0x6A7E, 10893: 0x6AE2, 10894: 0x6AE4, 10895: 0x6BD6, 10896: 0x6C3F, 10897: 0x6C5C, 10898: 0x6C86, 10899: 0x6C6F, 10900: 0x6CDA, 10901: 0x6D04, 10902: 0x6D87, 10903: 0x6D6F, 10904: 0x6D96, 10905: 0x6DAC, 10906: 0x6DCF, 10907: 0x6DF8, 10908: 0x6DF2, 10909: 0x6DFC, 10910: 0x6E39, 10911: 0x6E5C, 10912: 0x6E27, 10913: 0x6E3C, 10914: 0x6EBF, 10915: 0x6F88, 10916: 0x6FB5, 10917: 0x6FF5, 10918: 0x7005, 10919: 0x7007, 10920: 0x7028, 10921: 0x7085, 10922: 0x70AB, 10923: 0x710F, 10924: 0x7104, 10925: 0x715C, 10926: 0x7146, 10927: 0x7147, 10928: 0xFA15, 10929: 0x71C1, 10930: 0x71FE, 10931: 0x72B1, 10932: 0x72BE, 10933: 0x7324, 10934: 0xFA16, 10935: 0x7377, 10936: 0x73BD, 10937: 0x73C9, 10938: 0x73D6, 10939: 0x73E3, 10940: 0x73D2, 10941: 0x7407, 10942: 0x73F5, 10943: 0x7426, 10944: 0x742A, 10945: 0x7429, 10946: 0x742E, 10947: 0x7462, 10948: 0x7489, 10949: 0x749F, 10950: 0x7501, 10951: 0x756F, 10952: 0x7682, 10953: 0x769C, 10954: 0x769E, 10955: 0x769B, 10956: 0x76A6, 10957: 0xFA17, 10958: 0x7746, 10959: 0x52AF, 10960: 0x7821, 10961: 0x784E, 10962: 0x7864, 10963: 0x787A, 10964: 0x7930, 10965: 0xFA18, 10966: 0xFA19, 10967: 0xFA1A, 10968: 0x7994, 10969: 0xFA1B, 10970: 0x799B, 10971: 0x7AD1, 10972: 0x7AE7, 10973: 0xFA1C, 10974: 0x7AEB, 10975: 0x7B9E, 10976: 0xFA1D, 10977: 0x7D48, 10978: 0x7D5C, 10979: 0x7DB7, 10980: 0x7DA0, 10981: 0x7DD6, 10982: 0x7E52, 10983: 0x7F47, 10984: 0x7FA1, 10985: 0xFA1E, 10986: 0x8301, 10987: 0x8362, 10988: 0x837F, 10989: 0x83C7, 10990: 0x83F6, 10991: 0x8448, 10992: 0x84B4, 10993: 0x8553, 10994: 0x8559, 10995: 0x856B, 10996: 0xFA1F, 10997: 0x85B0, 10998: 0xFA20, 10999: 0xFA21, 11000: 0x8807, 11001: 0x88F5, 11002: 0x8A12, 11003: 0x8A37, 11004: 0x8A79, 11005: 0x8AA7, 11006: 0x8ABE, 11007: 0x8ADF, 11008: 0xFA22, 11009: 0x8AF6, 11010: 0x8B53, 11011: 0x8B7F, 11012: 0x8CF0, 11013: 0x8CF4, 11014: 0x8D12, 11015: 0x8D76, 11016: 0xFA23, 11017: 0x8ECF, 11018: 0xFA24, 11019: 0xFA25, 11020: 0x9067, 11021: 0x90DE, 11022: 0xFA26, 11023: 0x9115, 11024: 0x9127, 11025: 0x91DA, 11026: 0x91D7, 11027: 0x91DE, 11028: 0x91ED, 11029: 0x91EE, 11030: 0x91E4, 11031: 0x91E5, 11032: 0x9206, 11033: 0x9210, 11034: 0x920A, 11035: 0x923A, 11036: 0x9240, 11037: 0x923C, 11038: 0x924E, 11039: 0x9259, 11040: 0x9251, 11041: 0x9239, 11042: 0x9267, 11043: 0x92A7, 11044: 0x9277, 11045: 0x9278, 11046: 0x92E7, 11047: 0x92D7, 11048: 0x92D9, 11049: 0x92D0, 11050: 0xFA27, 11051: 0x92D5, 11052: 0x92E0, 11053: 0x92D3, 11054: 0x9325, 11055: 0x9321, 11056: 0x92FB, 11057: 0xFA28, 11058: 0x931E, 11059: 0x92FF, 11060: 0x931D, 11061: 0x9302, 11062: 0x9370, 11063: 0x9357, 11064: 0x93A4, 11065: 0x93C6, 11066: 0x93DE, 11067: 0x93F8, 11068: 0x9431, 11069: 0x9445, 11070: 0x9448, 11071: 0x9592, 11072: 0xF9DC, 11073: 0xFA29, 11074: 0x969D, 11075: 0x96AF, 11076: 0x9733, 11077: 0x973B, 11078: 0x9743, 11079: 0x974D, 11080: 0x974F, 11081: 0x9751, 11082: 0x9755, 11083: 0x9857, 11084: 0x9865, 11085: 0xFA2A, 11086: 0xFA2B, 11087: 0x9927, 11088: 0xFA2C, 11089: 0x999E, 11090: 0x9A4E, 11091: 0x9AD9, 11092: 0x9ADC, 11093: 0x9B75, 11094: 0x9B72, 11095: 0x9B8F, 11096: 0x9BB1, 11097: 0x9BBB, 11098: 0x9C00, 11099: 0x9D70, 11100: 0x9D6B, 11101: 0xFA2D, 11102: 0x9E19, 11103: 0x9ED1, } // jis0212Decode is the decoding table from JIS 0212 code to Unicode. // It is defined at http://encoding.spec.whatwg.org/index-jis0212.txt var jis0212Decode = [...]uint16{ 108: 0x02D8, 109: 0x02C7, 110: 0x00B8, 111: 0x02D9, 112: 0x02DD, 113: 0x00AF, 114: 0x02DB, 115: 0x02DA, 116: 0xFF5E, 117: 0x0384, 118: 0x0385, 127: 0x00A1, 128: 0x00A6, 129: 0x00BF, 168: 0x00BA, 169: 0x00AA, 170: 0x00A9, 171: 0x00AE, 172: 0x2122, 173: 0x00A4, 174: 0x2116, 534: 0x0386, 535: 0x0388, 536: 0x0389, 537: 0x038A, 538: 0x03AA, 540: 0x038C, 542: 0x038E, 543: 0x03AB, 545: 0x038F, 550: 0x03AC, 551: 0x03AD, 552: 0x03AE, 553: 0x03AF, 554: 0x03CA, 555: 0x0390, 556: 0x03CC, 557: 0x03C2, 558: 0x03CD, 559: 0x03CB, 560: 0x03B0, 561: 0x03CE, 597: 0x0402, 598: 0x0403, 599: 0x0404, 600: 0x0405, 601: 0x0406, 602: 0x0407, 603: 0x0408, 604: 0x0409, 605: 0x040A, 606: 0x040B, 607: 0x040C, 608: 0x040E, 609: 0x040F, 645: 0x0452, 646: 0x0453, 647: 0x0454, 648: 0x0455, 649: 0x0456, 650: 0x0457, 651: 0x0458, 652: 0x0459, 653: 0x045A, 654: 0x045B, 655: 0x045C, 656: 0x045E, 657: 0x045F, 752: 0x00C6, 753: 0x0110, 755: 0x0126, 757: 0x0132, 759: 0x0141, 760: 0x013F, 762: 0x014A, 763: 0x00D8, 764: 0x0152, 766: 0x0166, 767: 0x00DE, 784: 0x00E6, 785: 0x0111, 786: 0x00F0, 787: 0x0127, 788: 0x0131, 789: 0x0133, 790: 0x0138, 791: 0x0142, 792: 0x0140, 793: 0x0149, 794: 0x014B, 795: 0x00F8, 796: 0x0153, 797: 0x00DF, 798: 0x0167, 799: 0x00FE, 846: 0x00C1, 847: 0x00C0, 848: 0x00C4, 849: 0x00C2, 850: 0x0102, 851: 0x01CD, 852: 0x0100, 853: 0x0104, 854: 0x00C5, 855: 0x00C3, 856: 0x0106, 857: 0x0108, 858: 0x010C, 859: 0x00C7, 860: 0x010A, 861: 0x010E, 862: 0x00C9, 863: 0x00C8, 864: 0x00CB, 865: 0x00CA, 866: 0x011A, 867: 0x0116, 868: 0x0112, 869: 0x0118, 871: 0x011C, 872: 0x011E, 873: 0x0122, 874: 0x0120, 875: 0x0124, 876: 0x00CD, 877: 0x00CC, 878: 0x00CF, 879: 0x00CE, 880: 0x01CF, 881: 0x0130, 882: 0x012A, 883: 0x012E, 884: 0x0128, 885: 0x0134, 886: 0x0136, 887: 0x0139, 888: 0x013D, 889: 0x013B, 890: 0x0143, 891: 0x0147, 892: 0x0145, 893: 0x00D1, 894: 0x00D3, 895: 0x00D2, 896: 0x00D6, 897: 0x00D4, 898: 0x01D1, 899: 0x0150, 900: 0x014C, 901: 0x00D5, 902: 0x0154, 903: 0x0158, 904: 0x0156, 905: 0x015A, 906: 0x015C, 907: 0x0160, 908: 0x015E, 909: 0x0164, 910: 0x0162, 911: 0x00DA, 912: 0x00D9, 913: 0x00DC, 914: 0x00DB, 915: 0x016C, 916: 0x01D3, 917: 0x0170, 918: 0x016A, 919: 0x0172, 920: 0x016E, 921: 0x0168, 922: 0x01D7, 923: 0x01DB, 924: 0x01D9, 925: 0x01D5, 926: 0x0174, 927: 0x00DD, 928: 0x0178, 929: 0x0176, 930: 0x0179, 931: 0x017D, 932: 0x017B, 940: 0x00E1, 941: 0x00E0, 942: 0x00E4, 943: 0x00E2, 944: 0x0103, 945: 0x01CE, 946: 0x0101, 947: 0x0105, 948: 0x00E5, 949: 0x00E3, 950: 0x0107, 951: 0x0109, 952: 0x010D, 953: 0x00E7, 954: 0x010B, 955: 0x010F, 956: 0x00E9, 957: 0x00E8, 958: 0x00EB, 959: 0x00EA, 960: 0x011B, 961: 0x0117, 962: 0x0113, 963: 0x0119, 964: 0x01F5, 965: 0x011D, 966: 0x011F, 968: 0x0121, 969: 0x0125, 970: 0x00ED, 971: 0x00EC, 972: 0x00EF, 973: 0x00EE, 974: 0x01D0, 976: 0x012B, 977: 0x012F, 978: 0x0129, 979: 0x0135, 980: 0x0137, 981: 0x013A, 982: 0x013E, 983: 0x013C, 984: 0x0144, 985: 0x0148, 986: 0x0146, 987: 0x00F1, 988: 0x00F3, 989: 0x00F2, 990: 0x00F6, 991: 0x00F4, 992: 0x01D2, 993: 0x0151, 994: 0x014D, 995: 0x00F5, 996: 0x0155, 997: 0x0159, 998: 0x0157, 999: 0x015B, 1000: 0x015D, 1001: 0x0161, 1002: 0x015F, 1003: 0x0165, 1004: 0x0163, 1005: 0x00FA, 1006: 0x00F9, 1007: 0x00FC, 1008: 0x00FB, 1009: 0x016D, 1010: 0x01D4, 1011: 0x0171, 1012: 0x016B, 1013: 0x0173, 1014: 0x016F, 1015: 0x0169, 1016: 0x01D8, 1017: 0x01DC, 1018: 0x01DA, 1019: 0x01D6, 1020: 0x0175, 1021: 0x00FD, 1022: 0x00FF, 1023: 0x0177, 1024: 0x017A, 1025: 0x017E, 1026: 0x017C, 1410: 0x4E02, 1411: 0x4E04, 1412: 0x4E05, 1413: 0x4E0C, 1414: 0x4E12, 1415: 0x4E1F, 1416: 0x4E23, 1417: 0x4E24, 1418: 0x4E28, 1419: 0x4E2B, 1420: 0x4E2E, 1421: 0x4E2F, 1422: 0x4E30, 1423: 0x4E35, 1424: 0x4E40, 1425: 0x4E41, 1426: 0x4E44, 1427: 0x4E47, 1428: 0x4E51, 1429: 0x4E5A, 1430: 0x4E5C, 1431: 0x4E63, 1432: 0x4E68, 1433: 0x4E69, 1434: 0x4E74, 1435: 0x4E75, 1436: 0x4E79, 1437: 0x4E7F, 1438: 0x4E8D, 1439: 0x4E96, 1440: 0x4E97, 1441: 0x4E9D, 1442: 0x4EAF, 1443: 0x4EB9, 1444: 0x4EC3, 1445: 0x4ED0, 1446: 0x4EDA, 1447: 0x4EDB, 1448: 0x4EE0, 1449: 0x4EE1, 1450: 0x4EE2, 1451: 0x4EE8, 1452: 0x4EEF, 1453: 0x4EF1, 1454: 0x4EF3, 1455: 0x4EF5, 1456: 0x4EFD, 1457: 0x4EFE, 1458: 0x4EFF, 1459: 0x4F00, 1460: 0x4F02, 1461: 0x4F03, 1462: 0x4F08, 1463: 0x4F0B, 1464: 0x4F0C, 1465: 0x4F12, 1466: 0x4F15, 1467: 0x4F16, 1468: 0x4F17, 1469: 0x4F19, 1470: 0x4F2E, 1471: 0x4F31, 1472: 0x4F60, 1473: 0x4F33, 1474: 0x4F35, 1475: 0x4F37, 1476: 0x4F39, 1477: 0x4F3B, 1478: 0x4F3E, 1479: 0x4F40, 1480: 0x4F42, 1481: 0x4F48, 1482: 0x4F49, 1483: 0x4F4B, 1484: 0x4F4C, 1485: 0x4F52, 1486: 0x4F54, 1487: 0x4F56, 1488: 0x4F58, 1489: 0x4F5F, 1490: 0x4F63, 1491: 0x4F6A, 1492: 0x4F6C, 1493: 0x4F6E, 1494: 0x4F71, 1495: 0x4F77, 1496: 0x4F78, 1497: 0x4F79, 1498: 0x4F7A, 1499: 0x4F7D, 1500: 0x4F7E, 1501: 0x4F81, 1502: 0x4F82, 1503: 0x4F84, 1504: 0x4F85, 1505: 0x4F89, 1506: 0x4F8A, 1507: 0x4F8C, 1508: 0x4F8E, 1509: 0x4F90, 1510: 0x4F92, 1511: 0x4F93, 1512: 0x4F94, 1513: 0x4F97, 1514: 0x4F99, 1515: 0x4F9A, 1516: 0x4F9E, 1517: 0x4F9F, 1518: 0x4FB2, 1519: 0x4FB7, 1520: 0x4FB9, 1521: 0x4FBB, 1522: 0x4FBC, 1523: 0x4FBD, 1524: 0x4FBE, 1525: 0x4FC0, 1526: 0x4FC1, 1527: 0x4FC5, 1528: 0x4FC6, 1529: 0x4FC8, 1530: 0x4FC9, 1531: 0x4FCB, 1532: 0x4FCC, 1533: 0x4FCD, 1534: 0x4FCF, 1535: 0x4FD2, 1536: 0x4FDC, 1537: 0x4FE0, 1538: 0x4FE2, 1539: 0x4FF0, 1540: 0x4FF2, 1541: 0x4FFC, 1542: 0x4FFD, 1543: 0x4FFF, 1544: 0x5000, 1545: 0x5001, 1546: 0x5004, 1547: 0x5007, 1548: 0x500A, 1549: 0x500C, 1550: 0x500E, 1551: 0x5010, 1552: 0x5013, 1553: 0x5017, 1554: 0x5018, 1555: 0x501B, 1556: 0x501C, 1557: 0x501D, 1558: 0x501E, 1559: 0x5022, 1560: 0x5027, 1561: 0x502E, 1562: 0x5030, 1563: 0x5032, 1564: 0x5033, 1565: 0x5035, 1566: 0x5040, 1567: 0x5041, 1568: 0x5042, 1569: 0x5045, 1570: 0x5046, 1571: 0x504A, 1572: 0x504C, 1573: 0x504E, 1574: 0x5051, 1575: 0x5052, 1576: 0x5053, 1577: 0x5057, 1578: 0x5059, 1579: 0x505F, 1580: 0x5060, 1581: 0x5062, 1582: 0x5063, 1583: 0x5066, 1584: 0x5067, 1585: 0x506A, 1586: 0x506D, 1587: 0x5070, 1588: 0x5071, 1589: 0x503B, 1590: 0x5081, 1591: 0x5083, 1592: 0x5084, 1593: 0x5086, 1594: 0x508A, 1595: 0x508E, 1596: 0x508F, 1597: 0x5090, 1598: 0x5092, 1599: 0x5093, 1600: 0x5094, 1601: 0x5096, 1602: 0x509B, 1603: 0x509C, 1604: 0x509E, 1605: 0x509F, 1606: 0x50A0, 1607: 0x50A1, 1608: 0x50A2, 1609: 0x50AA, 1610: 0x50AF, 1611: 0x50B0, 1612: 0x50B9, 1613: 0x50BA, 1614: 0x50BD, 1615: 0x50C0, 1616: 0x50C3, 1617: 0x50C4, 1618: 0x50C7, 1619: 0x50CC, 1620: 0x50CE, 1621: 0x50D0, 1622: 0x50D3, 1623: 0x50D4, 1624: 0x50D8, 1625: 0x50DC, 1626: 0x50DD, 1627: 0x50DF, 1628: 0x50E2, 1629: 0x50E4, 1630: 0x50E6, 1631: 0x50E8, 1632: 0x50E9, 1633: 0x50EF, 1634: 0x50F1, 1635: 0x50F6, 1636: 0x50FA, 1637: 0x50FE, 1638: 0x5103, 1639: 0x5106, 1640: 0x5107, 1641: 0x5108, 1642: 0x510B, 1643: 0x510C, 1644: 0x510D, 1645: 0x510E, 1646: 0x50F2, 1647: 0x5110, 1648: 0x5117, 1649: 0x5119, 1650: 0x511B, 1651: 0x511C, 1652: 0x511D, 1653: 0x511E, 1654: 0x5123, 1655: 0x5127, 1656: 0x5128, 1657: 0x512C, 1658: 0x512D, 1659: 0x512F, 1660: 0x5131, 1661: 0x5133, 1662: 0x5134, 1663: 0x5135, 1664: 0x5138, 1665: 0x5139, 1666: 0x5142, 1667: 0x514A, 1668: 0x514F, 1669: 0x5153, 1670: 0x5155, 1671: 0x5157, 1672: 0x5158, 1673: 0x515F, 1674: 0x5164, 1675: 0x5166, 1676: 0x517E, 1677: 0x5183, 1678: 0x5184, 1679: 0x518B, 1680: 0x518E, 1681: 0x5198, 1682: 0x519D, 1683: 0x51A1, 1684: 0x51A3, 1685: 0x51AD, 1686: 0x51B8, 1687: 0x51BA, 1688: 0x51BC, 1689: 0x51BE, 1690: 0x51BF, 1691: 0x51C2, 1692: 0x51C8, 1693: 0x51CF, 1694: 0x51D1, 1695: 0x51D2, 1696: 0x51D3, 1697: 0x51D5, 1698: 0x51D8, 1699: 0x51DE, 1700: 0x51E2, 1701: 0x51E5, 1702: 0x51EE, 1703: 0x51F2, 1704: 0x51F3, 1705: 0x51F4, 1706: 0x51F7, 1707: 0x5201, 1708: 0x5202, 1709: 0x5205, 1710: 0x5212, 1711: 0x5213, 1712: 0x5215, 1713: 0x5216, 1714: 0x5218, 1715: 0x5222, 1716: 0x5228, 1717: 0x5231, 1718: 0x5232, 1719: 0x5235, 1720: 0x523C, 1721: 0x5245, 1722: 0x5249, 1723: 0x5255, 1724: 0x5257, 1725: 0x5258, 1726: 0x525A, 1727: 0x525C, 1728: 0x525F, 1729: 0x5260, 1730: 0x5261, 1731: 0x5266, 1732: 0x526E, 1733: 0x5277, 1734: 0x5278, 1735: 0x5279, 1736: 0x5280, 1737: 0x5282, 1738: 0x5285, 1739: 0x528A, 1740: 0x528C, 1741: 0x5293, 1742: 0x5295, 1743: 0x5296, 1744: 0x5297, 1745: 0x5298, 1746: 0x529A, 1747: 0x529C, 1748: 0x52A4, 1749: 0x52A5, 1750: 0x52A6, 1751: 0x52A7, 1752: 0x52AF, 1753: 0x52B0, 1754: 0x52B6, 1755: 0x52B7, 1756: 0x52B8, 1757: 0x52BA, 1758: 0x52BB, 1759: 0x52BD, 1760: 0x52C0, 1761: 0x52C4, 1762: 0x52C6, 1763: 0x52C8, 1764: 0x52CC, 1765: 0x52CF, 1766: 0x52D1, 1767: 0x52D4, 1768: 0x52D6, 1769: 0x52DB, 1770: 0x52DC, 1771: 0x52E1, 1772: 0x52E5, 1773: 0x52E8, 1774: 0x52E9, 1775: 0x52EA, 1776: 0x52EC, 1777: 0x52F0, 1778: 0x52F1, 1779: 0x52F4, 1780: 0x52F6, 1781: 0x52F7, 1782: 0x5300, 1783: 0x5303, 1784: 0x530A, 1785: 0x530B, 1786: 0x530C, 1787: 0x5311, 1788: 0x5313, 1789: 0x5318, 1790: 0x531B, 1791: 0x531C, 1792: 0x531E, 1793: 0x531F, 1794: 0x5325, 1795: 0x5327, 1796: 0x5328, 1797: 0x5329, 1798: 0x532B, 1799: 0x532C, 1800: 0x532D, 1801: 0x5330, 1802: 0x5332, 1803: 0x5335, 1804: 0x533C, 1805: 0x533D, 1806: 0x533E, 1807: 0x5342, 1808: 0x534C, 1809: 0x534B, 1810: 0x5359, 1811: 0x535B, 1812: 0x5361, 1813: 0x5363, 1814: 0x5365, 1815: 0x536C, 1816: 0x536D, 1817: 0x5372, 1818: 0x5379, 1819: 0x537E, 1820: 0x5383, 1821: 0x5387, 1822: 0x5388, 1823: 0x538E, 1824: 0x5393, 1825: 0x5394, 1826: 0x5399, 1827: 0x539D, 1828: 0x53A1, 1829: 0x53A4, 1830: 0x53AA, 1831: 0x53AB, 1832: 0x53AF, 1833: 0x53B2, 1834: 0x53B4, 1835: 0x53B5, 1836: 0x53B7, 1837: 0x53B8, 1838: 0x53BA, 1839: 0x53BD, 1840: 0x53C0, 1841: 0x53C5, 1842: 0x53CF, 1843: 0x53D2, 1844: 0x53D3, 1845: 0x53D5, 1846: 0x53DA, 1847: 0x53DD, 1848: 0x53DE, 1849: 0x53E0, 1850: 0x53E6, 1851: 0x53E7, 1852: 0x53F5, 1853: 0x5402, 1854: 0x5413, 1855: 0x541A, 1856: 0x5421, 1857: 0x5427, 1858: 0x5428, 1859: 0x542A, 1860: 0x542F, 1861: 0x5431, 1862: 0x5434, 1863: 0x5435, 1864: 0x5443, 1865: 0x5444, 1866: 0x5447, 1867: 0x544D, 1868: 0x544F, 1869: 0x545E, 1870: 0x5462, 1871: 0x5464, 1872: 0x5466, 1873: 0x5467, 1874: 0x5469, 1875: 0x546B, 1876: 0x546D, 1877: 0x546E, 1878: 0x5474, 1879: 0x547F, 1880: 0x5481, 1881: 0x5483, 1882: 0x5485, 1883: 0x5488, 1884: 0x5489, 1885: 0x548D, 1886: 0x5491, 1887: 0x5495, 1888: 0x5496, 1889: 0x549C, 1890: 0x549F, 1891: 0x54A1, 1892: 0x54A6, 1893: 0x54A7, 1894: 0x54A9, 1895: 0x54AA, 1896: 0x54AD, 1897: 0x54AE, 1898: 0x54B1, 1899: 0x54B7, 1900: 0x54B9, 1901: 0x54BA, 1902: 0x54BB, 1903: 0x54BF, 1904: 0x54C6, 1905: 0x54CA, 1906: 0x54CD, 1907: 0x54CE, 1908: 0x54E0, 1909: 0x54EA, 1910: 0x54EC, 1911: 0x54EF, 1912: 0x54F6, 1913: 0x54FC, 1914: 0x54FE, 1915: 0x54FF, 1916: 0x5500, 1917: 0x5501, 1918: 0x5505, 1919: 0x5508, 1920: 0x5509, 1921: 0x550C, 1922: 0x550D, 1923: 0x550E, 1924: 0x5515, 1925: 0x552A, 1926: 0x552B, 1927: 0x5532, 1928: 0x5535, 1929: 0x5536, 1930: 0x553B, 1931: 0x553C, 1932: 0x553D, 1933: 0x5541, 1934: 0x5547, 1935: 0x5549, 1936: 0x554A, 1937: 0x554D, 1938: 0x5550, 1939: 0x5551, 1940: 0x5558, 1941: 0x555A, 1942: 0x555B, 1943: 0x555E, 1944: 0x5560, 1945: 0x5561, 1946: 0x5564, 1947: 0x5566, 1948: 0x557F, 1949: 0x5581, 1950: 0x5582, 1951: 0x5586, 1952: 0x5588, 1953: 0x558E, 1954: 0x558F, 1955: 0x5591, 1956: 0x5592, 1957: 0x5593, 1958: 0x5594, 1959: 0x5597, 1960: 0x55A3, 1961: 0x55A4, 1962: 0x55AD, 1963: 0x55B2, 1964: 0x55BF, 1965: 0x55C1, 1966: 0x55C3, 1967: 0x55C6, 1968: 0x55C9, 1969: 0x55CB, 1970: 0x55CC, 1971: 0x55CE, 1972: 0x55D1, 1973: 0x55D2, 1974: 0x55D3, 1975: 0x55D7, 1976: 0x55D8, 1977: 0x55DB, 1978: 0x55DE, 1979: 0x55E2, 1980: 0x55E9, 1981: 0x55F6, 1982: 0x55FF, 1983: 0x5605, 1984: 0x5608, 1985: 0x560A, 1986: 0x560D, 1987: 0x560E, 1988: 0x560F, 1989: 0x5610, 1990: 0x5611, 1991: 0x5612, 1992: 0x5619, 1993: 0x562C, 1994: 0x5630, 1995: 0x5633, 1996: 0x5635, 1997: 0x5637, 1998: 0x5639, 1999: 0x563B, 2000: 0x563C, 2001: 0x563D, 2002: 0x563F, 2003: 0x5640, 2004: 0x5641, 2005: 0x5643, 2006: 0x5644, 2007: 0x5646, 2008: 0x5649, 2009: 0x564B, 2010: 0x564D, 2011: 0x564F, 2012: 0x5654, 2013: 0x565E, 2014: 0x5660, 2015: 0x5661, 2016: 0x5662, 2017: 0x5663, 2018: 0x5666, 2019: 0x5669, 2020: 0x566D, 2021: 0x566F, 2022: 0x5671, 2023: 0x5672, 2024: 0x5675, 2025: 0x5684, 2026: 0x5685, 2027: 0x5688, 2028: 0x568B, 2029: 0x568C, 2030: 0x5695, 2031: 0x5699, 2032: 0x569A, 2033: 0x569D, 2034: 0x569E, 2035: 0x569F, 2036: 0x56A6, 2037: 0x56A7, 2038: 0x56A8, 2039: 0x56A9, 2040: 0x56AB, 2041: 0x56AC, 2042: 0x56AD, 2043: 0x56B1, 2044: 0x56B3, 2045: 0x56B7, 2046: 0x56BE, 2047: 0x56C5, 2048: 0x56C9, 2049: 0x56CA, 2050: 0x56CB, 2051: 0x56CF, 2052: 0x56D0, 2053: 0x56CC, 2054: 0x56CD, 2055: 0x56D9, 2056: 0x56DC, 2057: 0x56DD, 2058: 0x56DF, 2059: 0x56E1, 2060: 0x56E4, 2061: 0x56E5, 2062: 0x56E6, 2063: 0x56E7, 2064: 0x56E8, 2065: 0x56F1, 2066: 0x56EB, 2067: 0x56ED, 2068: 0x56F6, 2069: 0x56F7, 2070: 0x5701, 2071: 0x5702, 2072: 0x5707, 2073: 0x570A, 2074: 0x570C, 2075: 0x5711, 2076: 0x5715, 2077: 0x571A, 2078: 0x571B, 2079: 0x571D, 2080: 0x5720, 2081: 0x5722, 2082: 0x5723, 2083: 0x5724, 2084: 0x5725, 2085: 0x5729, 2086: 0x572A, 2087: 0x572C, 2088: 0x572E, 2089: 0x572F, 2090: 0x5733, 2091: 0x5734, 2092: 0x573D, 2093: 0x573E, 2094: 0x573F, 2095: 0x5745, 2096: 0x5746, 2097: 0x574C, 2098: 0x574D, 2099: 0x5752, 2100: 0x5762, 2101: 0x5765, 2102: 0x5767, 2103: 0x5768, 2104: 0x576B, 2105: 0x576D, 2106: 0x576E, 2107: 0x576F, 2108: 0x5770, 2109: 0x5771, 2110: 0x5773, 2111: 0x5774, 2112: 0x5775, 2113: 0x5777, 2114: 0x5779, 2115: 0x577A, 2116: 0x577B, 2117: 0x577C, 2118: 0x577E, 2119: 0x5781, 2120: 0x5783, 2121: 0x578C, 2122: 0x5794, 2123: 0x5797, 2124: 0x5799, 2125: 0x579A, 2126: 0x579C, 2127: 0x579D, 2128: 0x579E, 2129: 0x579F, 2130: 0x57A1, 2131: 0x5795, 2132: 0x57A7, 2133: 0x57A8, 2134: 0x57A9, 2135: 0x57AC, 2136: 0x57B8, 2137: 0x57BD, 2138: 0x57C7, 2139: 0x57C8, 2140: 0x57CC, 2141: 0x57CF, 2142: 0x57D5, 2143: 0x57DD, 2144: 0x57DE, 2145: 0x57E4, 2146: 0x57E6, 2147: 0x57E7, 2148: 0x57E9, 2149: 0x57ED, 2150: 0x57F0, 2151: 0x57F5, 2152: 0x57F6, 2153: 0x57F8, 2154: 0x57FD, 2155: 0x57FE, 2156: 0x57FF, 2157: 0x5803, 2158: 0x5804, 2159: 0x5808, 2160: 0x5809, 2161: 0x57E1, 2162: 0x580C, 2163: 0x580D, 2164: 0x581B, 2165: 0x581E, 2166: 0x581F, 2167: 0x5820, 2168: 0x5826, 2169: 0x5827, 2170: 0x582D, 2171: 0x5832, 2172: 0x5839, 2173: 0x583F, 2174: 0x5849, 2175: 0x584C, 2176: 0x584D, 2177: 0x584F, 2178: 0x5850, 2179: 0x5855, 2180: 0x585F, 2181: 0x5861, 2182: 0x5864, 2183: 0x5867, 2184: 0x5868, 2185: 0x5878, 2186: 0x587C, 2187: 0x587F, 2188: 0x5880, 2189: 0x5881, 2190: 0x5887, 2191: 0x5888, 2192: 0x5889, 2193: 0x588A, 2194: 0x588C, 2195: 0x588D, 2196: 0x588F, 2197: 0x5890, 2198: 0x5894, 2199: 0x5896, 2200: 0x589D, 2201: 0x58A0, 2202: 0x58A1, 2203: 0x58A2, 2204: 0x58A6, 2205: 0x58A9, 2206: 0x58B1, 2207: 0x58B2, 2208: 0x58C4, 2209: 0x58BC, 2210: 0x58C2, 2211: 0x58C8, 2212: 0x58CD, 2213: 0x58CE, 2214: 0x58D0, 2215: 0x58D2, 2216: 0x58D4, 2217: 0x58D6, 2218: 0x58DA, 2219: 0x58DD, 2220: 0x58E1, 2221: 0x58E2, 2222: 0x58E9, 2223: 0x58F3, 2224: 0x5905, 2225: 0x5906, 2226: 0x590B, 2227: 0x590C, 2228: 0x5912, 2229: 0x5913, 2230: 0x5914, 2231: 0x8641, 2232: 0x591D, 2233: 0x5921, 2234: 0x5923, 2235: 0x5924, 2236: 0x5928, 2237: 0x592F, 2238: 0x5930, 2239: 0x5933, 2240: 0x5935, 2241: 0x5936, 2242: 0x593F, 2243: 0x5943, 2244: 0x5946, 2245: 0x5952, 2246: 0x5953, 2247: 0x5959, 2248: 0x595B, 2249: 0x595D, 2250: 0x595E, 2251: 0x595F, 2252: 0x5961, 2253: 0x5963, 2254: 0x596B, 2255: 0x596D, 2256: 0x596F, 2257: 0x5972, 2258: 0x5975, 2259: 0x5976, 2260: 0x5979, 2261: 0x597B, 2262: 0x597C, 2263: 0x598B, 2264: 0x598C, 2265: 0x598E, 2266: 0x5992, 2267: 0x5995, 2268: 0x5997, 2269: 0x599F, 2270: 0x59A4, 2271: 0x59A7, 2272: 0x59AD, 2273: 0x59AE, 2274: 0x59AF, 2275: 0x59B0, 2276: 0x59B3, 2277: 0x59B7, 2278: 0x59BA, 2279: 0x59BC, 2280: 0x59C1, 2281: 0x59C3, 2282: 0x59C4, 2283: 0x59C8, 2284: 0x59CA, 2285: 0x59CD, 2286: 0x59D2, 2287: 0x59DD, 2288: 0x59DE, 2289: 0x59DF, 2290: 0x59E3, 2291: 0x59E4, 2292: 0x59E7, 2293: 0x59EE, 2294: 0x59EF, 2295: 0x59F1, 2296: 0x59F2, 2297: 0x59F4, 2298: 0x59F7, 2299: 0x5A00, 2300: 0x5A04, 2301: 0x5A0C, 2302: 0x5A0D, 2303: 0x5A0E, 2304: 0x5A12, 2305: 0x5A13, 2306: 0x5A1E, 2307: 0x5A23, 2308: 0x5A24, 2309: 0x5A27, 2310: 0x5A28, 2311: 0x5A2A, 2312: 0x5A2D, 2313: 0x5A30, 2314: 0x5A44, 2315: 0x5A45, 2316: 0x5A47, 2317: 0x5A48, 2318: 0x5A4C, 2319: 0x5A50, 2320: 0x5A55, 2321: 0x5A5E, 2322: 0x5A63, 2323: 0x5A65, 2324: 0x5A67, 2325: 0x5A6D, 2326: 0x5A77, 2327: 0x5A7A, 2328: 0x5A7B, 2329: 0x5A7E, 2330: 0x5A8B, 2331: 0x5A90, 2332: 0x5A93, 2333: 0x5A96, 2334: 0x5A99, 2335: 0x5A9C, 2336: 0x5A9E, 2337: 0x5A9F, 2338: 0x5AA0, 2339: 0x5AA2, 2340: 0x5AA7, 2341: 0x5AAC, 2342: 0x5AB1, 2343: 0x5AB2, 2344: 0x5AB3, 2345: 0x5AB5, 2346: 0x5AB8, 2347: 0x5ABA, 2348: 0x5ABB, 2349: 0x5ABF, 2350: 0x5AC4, 2351: 0x5AC6, 2352: 0x5AC8, 2353: 0x5ACF, 2354: 0x5ADA, 2355: 0x5ADC, 2356: 0x5AE0, 2357: 0x5AE5, 2358: 0x5AEA, 2359: 0x5AEE, 2360: 0x5AF5, 2361: 0x5AF6, 2362: 0x5AFD, 2363: 0x5B00, 2364: 0x5B01, 2365: 0x5B08, 2366: 0x5B17, 2367: 0x5B34, 2368: 0x5B19, 2369: 0x5B1B, 2370: 0x5B1D, 2371: 0x5B21, 2372: 0x5B25, 2373: 0x5B2D, 2374: 0x5B38, 2375: 0x5B41, 2376: 0x5B4B, 2377: 0x5B4C, 2378: 0x5B52, 2379: 0x5B56, 2380: 0x5B5E, 2381: 0x5B68, 2382: 0x5B6E, 2383: 0x5B6F, 2384: 0x5B7C, 2385: 0x5B7D, 2386: 0x5B7E, 2387: 0x5B7F, 2388: 0x5B81, 2389: 0x5B84, 2390: 0x5B86, 2391: 0x5B8A, 2392: 0x5B8E, 2393: 0x5B90, 2394: 0x5B91, 2395: 0x5B93, 2396: 0x5B94, 2397: 0x5B96, 2398: 0x5BA8, 2399: 0x5BA9, 2400: 0x5BAC, 2401: 0x5BAD, 2402: 0x5BAF, 2403: 0x5BB1, 2404: 0x5BB2, 2405: 0x5BB7, 2406: 0x5BBA, 2407: 0x5BBC, 2408: 0x5BC0, 2409: 0x5BC1, 2410: 0x5BCD, 2411: 0x5BCF, 2412: 0x5BD6, 2413: 0x5BD7, 2414: 0x5BD8, 2415: 0x5BD9, 2416: 0x5BDA, 2417: 0x5BE0, 2418: 0x5BEF, 2419: 0x5BF1, 2420: 0x5BF4, 2421: 0x5BFD, 2422: 0x5C0C, 2423: 0x5C17, 2424: 0x5C1E, 2425: 0x5C1F, 2426: 0x5C23, 2427: 0x5C26, 2428: 0x5C29, 2429: 0x5C2B, 2430: 0x5C2C, 2431: 0x5C2E, 2432: 0x5C30, 2433: 0x5C32, 2434: 0x5C35, 2435: 0x5C36, 2436: 0x5C59, 2437: 0x5C5A, 2438: 0x5C5C, 2439: 0x5C62, 2440: 0x5C63, 2441: 0x5C67, 2442: 0x5C68, 2443: 0x5C69, 2444: 0x5C6D, 2445: 0x5C70, 2446: 0x5C74, 2447: 0x5C75, 2448: 0x5C7A, 2449: 0x5C7B, 2450: 0x5C7C, 2451: 0x5C7D, 2452: 0x5C87, 2453: 0x5C88, 2454: 0x5C8A, 2455: 0x5C8F, 2456: 0x5C92, 2457: 0x5C9D, 2458: 0x5C9F, 2459: 0x5CA0, 2460: 0x5CA2, 2461: 0x5CA3, 2462: 0x5CA6, 2463: 0x5CAA, 2464: 0x5CB2, 2465: 0x5CB4, 2466: 0x5CB5, 2467: 0x5CBA, 2468: 0x5CC9, 2469: 0x5CCB, 2470: 0x5CD2, 2471: 0x5CDD, 2472: 0x5CD7, 2473: 0x5CEE, 2474: 0x5CF1, 2475: 0x5CF2, 2476: 0x5CF4, 2477: 0x5D01, 2478: 0x5D06, 2479: 0x5D0D, 2480: 0x5D12, 2481: 0x5D2B, 2482: 0x5D23, 2483: 0x5D24, 2484: 0x5D26, 2485: 0x5D27, 2486: 0x5D31, 2487: 0x5D34, 2488: 0x5D39, 2489: 0x5D3D, 2490: 0x5D3F, 2491: 0x5D42, 2492: 0x5D43, 2493: 0x5D46, 2494: 0x5D48, 2495: 0x5D55, 2496: 0x5D51, 2497: 0x5D59, 2498: 0x5D4A, 2499: 0x5D5F, 2500: 0x5D60, 2501: 0x5D61, 2502: 0x5D62, 2503: 0x5D64, 2504: 0x5D6A, 2505: 0x5D6D, 2506: 0x5D70, 2507: 0x5D79, 2508: 0x5D7A, 2509: 0x5D7E, 2510: 0x5D7F, 2511: 0x5D81, 2512: 0x5D83, 2513: 0x5D88, 2514: 0x5D8A, 2515: 0x5D92, 2516: 0x5D93, 2517: 0x5D94, 2518: 0x5D95, 2519: 0x5D99, 2520: 0x5D9B, 2521: 0x5D9F, 2522: 0x5DA0, 2523: 0x5DA7, 2524: 0x5DAB, 2525: 0x5DB0, 2526: 0x5DB4, 2527: 0x5DB8, 2528: 0x5DB9, 2529: 0x5DC3, 2530: 0x5DC7, 2531: 0x5DCB, 2532: 0x5DD0, 2533: 0x5DCE, 2534: 0x5DD8, 2535: 0x5DD9, 2536: 0x5DE0, 2537: 0x5DE4, 2538: 0x5DE9, 2539: 0x5DF8, 2540: 0x5DF9, 2541: 0x5E00, 2542: 0x5E07, 2543: 0x5E0D, 2544: 0x5E12, 2545: 0x5E14, 2546: 0x5E15, 2547: 0x5E18, 2548: 0x5E1F, 2549: 0x5E20, 2550: 0x5E2E, 2551: 0x5E28, 2552: 0x5E32, 2553: 0x5E35, 2554: 0x5E3E, 2555: 0x5E4B, 2556: 0x5E50, 2557: 0x5E49, 2558: 0x5E51, 2559: 0x5E56, 2560: 0x5E58, 2561: 0x5E5B, 2562: 0x5E5C, 2563: 0x5E5E, 2564: 0x5E68, 2565: 0x5E6A, 2566: 0x5E6B, 2567: 0x5E6C, 2568: 0x5E6D, 2569: 0x5E6E, 2570: 0x5E70, 2571: 0x5E80, 2572: 0x5E8B, 2573: 0x5E8E, 2574: 0x5EA2, 2575: 0x5EA4, 2576: 0x5EA5, 2577: 0x5EA8, 2578: 0x5EAA, 2579: 0x5EAC, 2580: 0x5EB1, 2581: 0x5EB3, 2582: 0x5EBD, 2583: 0x5EBE, 2584: 0x5EBF, 2585: 0x5EC6, 2586: 0x5ECC, 2587: 0x5ECB, 2588: 0x5ECE, 2589: 0x5ED1, 2590: 0x5ED2, 2591: 0x5ED4, 2592: 0x5ED5, 2593: 0x5EDC, 2594: 0x5EDE, 2595: 0x5EE5, 2596: 0x5EEB, 2597: 0x5F02, 2598: 0x5F06, 2599: 0x5F07, 2600: 0x5F08, 2601: 0x5F0E, 2602: 0x5F19, 2603: 0x5F1C, 2604: 0x5F1D, 2605: 0x5F21, 2606: 0x5F22, 2607: 0x5F23, 2608: 0x5F24, 2609: 0x5F28, 2610: 0x5F2B, 2611: 0x5F2C, 2612: 0x5F2E, 2613: 0x5F30, 2614: 0x5F34, 2615: 0x5F36, 2616: 0x5F3B, 2617: 0x5F3D, 2618: 0x5F3F, 2619: 0x5F40, 2620: 0x5F44, 2621: 0x5F45, 2622: 0x5F47, 2623: 0x5F4D, 2624: 0x5F50, 2625: 0x5F54, 2626: 0x5F58, 2627: 0x5F5B, 2628: 0x5F60, 2629: 0x5F63, 2630: 0x5F64, 2631: 0x5F67, 2632: 0x5F6F, 2633: 0x5F72, 2634: 0x5F74, 2635: 0x5F75, 2636: 0x5F78, 2637: 0x5F7A, 2638: 0x5F7D, 2639: 0x5F7E, 2640: 0x5F89, 2641: 0x5F8D, 2642: 0x5F8F, 2643: 0x5F96, 2644: 0x5F9C, 2645: 0x5F9D, 2646: 0x5FA2, 2647: 0x5FA7, 2648: 0x5FAB, 2649: 0x5FA4, 2650: 0x5FAC, 2651: 0x5FAF, 2652: 0x5FB0, 2653: 0x5FB1, 2654: 0x5FB8, 2655: 0x5FC4, 2656: 0x5FC7, 2657: 0x5FC8, 2658: 0x5FC9, 2659: 0x5FCB, 2660: 0x5FD0, 2661: 0x5FD1, 2662: 0x5FD2, 2663: 0x5FD3, 2664: 0x5FD4, 2665: 0x5FDE, 2666: 0x5FE1, 2667: 0x5FE2, 2668: 0x5FE8, 2669: 0x5FE9, 2670: 0x5FEA, 2671: 0x5FEC, 2672: 0x5FED, 2673: 0x5FEE, 2674: 0x5FEF, 2675: 0x5FF2, 2676: 0x5FF3, 2677: 0x5FF6, 2678: 0x5FFA, 2679: 0x5FFC, 2680: 0x6007, 2681: 0x600A, 2682: 0x600D, 2683: 0x6013, 2684: 0x6014, 2685: 0x6017, 2686: 0x6018, 2687: 0x601A, 2688: 0x601F, 2689: 0x6024, 2690: 0x602D, 2691: 0x6033, 2692: 0x6035, 2693: 0x6040, 2694: 0x6047, 2695: 0x6048, 2696: 0x6049, 2697: 0x604C, 2698: 0x6051, 2699: 0x6054, 2700: 0x6056, 2701: 0x6057, 2702: 0x605D, 2703: 0x6061, 2704: 0x6067, 2705: 0x6071, 2706: 0x607E, 2707: 0x607F, 2708: 0x6082, 2709: 0x6086, 2710: 0x6088, 2711: 0x608A, 2712: 0x608E, 2713: 0x6091, 2714: 0x6093, 2715: 0x6095, 2716: 0x6098, 2717: 0x609D, 2718: 0x609E, 2719: 0x60A2, 2720: 0x60A4, 2721: 0x60A5, 2722: 0x60A8, 2723: 0x60B0, 2724: 0x60B1, 2725: 0x60B7, 2726: 0x60BB, 2727: 0x60BE, 2728: 0x60C2, 2729: 0x60C4, 2730: 0x60C8, 2731: 0x60C9, 2732: 0x60CA, 2733: 0x60CB, 2734: 0x60CE, 2735: 0x60CF, 2736: 0x60D4, 2737: 0x60D5, 2738: 0x60D9, 2739: 0x60DB, 2740: 0x60DD, 2741: 0x60DE, 2742: 0x60E2, 2743: 0x60E5, 2744: 0x60F2, 2745: 0x60F5, 2746: 0x60F8, 2747: 0x60FC, 2748: 0x60FD, 2749: 0x6102, 2750: 0x6107, 2751: 0x610A, 2752: 0x610C, 2753: 0x6110, 2754: 0x6111, 2755: 0x6112, 2756: 0x6113, 2757: 0x6114, 2758: 0x6116, 2759: 0x6117, 2760: 0x6119, 2761: 0x611C, 2762: 0x611E, 2763: 0x6122, 2764: 0x612A, 2765: 0x612B, 2766: 0x6130, 2767: 0x6131, 2768: 0x6135, 2769: 0x6136, 2770: 0x6137, 2771: 0x6139, 2772: 0x6141, 2773: 0x6145, 2774: 0x6146, 2775: 0x6149, 2776: 0x615E, 2777: 0x6160, 2778: 0x616C, 2779: 0x6172, 2780: 0x6178, 2781: 0x617B, 2782: 0x617C, 2783: 0x617F, 2784: 0x6180, 2785: 0x6181, 2786: 0x6183, 2787: 0x6184, 2788: 0x618B, 2789: 0x618D, 2790: 0x6192, 2791: 0x6193, 2792: 0x6197, 2793: 0x6198, 2794: 0x619C, 2795: 0x619D, 2796: 0x619F, 2797: 0x61A0, 2798: 0x61A5, 2799: 0x61A8, 2800: 0x61AA, 2801: 0x61AD, 2802: 0x61B8, 2803: 0x61B9, 2804: 0x61BC, 2805: 0x61C0, 2806: 0x61C1, 2807: 0x61C2, 2808: 0x61CE, 2809: 0x61CF, 2810: 0x61D5, 2811: 0x61DC, 2812: 0x61DD, 2813: 0x61DE, 2814: 0x61DF, 2815: 0x61E1, 2816: 0x61E2, 2817: 0x61E7, 2818: 0x61E9, 2819: 0x61E5, 2820: 0x61EC, 2821: 0x61ED, 2822: 0x61EF, 2823: 0x6201, 2824: 0x6203, 2825: 0x6204, 2826: 0x6207, 2827: 0x6213, 2828: 0x6215, 2829: 0x621C, 2830: 0x6220, 2831: 0x6222, 2832: 0x6223, 2833: 0x6227, 2834: 0x6229, 2835: 0x622B, 2836: 0x6239, 2837: 0x623D, 2838: 0x6242, 2839: 0x6243, 2840: 0x6244, 2841: 0x6246, 2842: 0x624C, 2843: 0x6250, 2844: 0x6251, 2845: 0x6252, 2846: 0x6254, 2847: 0x6256, 2848: 0x625A, 2849: 0x625C, 2850: 0x6264, 2851: 0x626D, 2852: 0x626F, 2853: 0x6273, 2854: 0x627A, 2855: 0x627D, 2856: 0x628D, 2857: 0x628E, 2858: 0x628F, 2859: 0x6290, 2860: 0x62A6, 2861: 0x62A8, 2862: 0x62B3, 2863: 0x62B6, 2864: 0x62B7, 2865: 0x62BA, 2866: 0x62BE, 2867: 0x62BF, 2868: 0x62C4, 2869: 0x62CE, 2870: 0x62D5, 2871: 0x62D6, 2872: 0x62DA, 2873: 0x62EA, 2874: 0x62F2, 2875: 0x62F4, 2876: 0x62FC, 2877: 0x62FD, 2878: 0x6303, 2879: 0x6304, 2880: 0x630A, 2881: 0x630B, 2882: 0x630D, 2883: 0x6310, 2884: 0x6313, 2885: 0x6316, 2886: 0x6318, 2887: 0x6329, 2888: 0x632A, 2889: 0x632D, 2890: 0x6335, 2891: 0x6336, 2892: 0x6339, 2893: 0x633C, 2894: 0x6341, 2895: 0x6342, 2896: 0x6343, 2897: 0x6344, 2898: 0x6346, 2899: 0x634A, 2900: 0x634B, 2901: 0x634E, 2902: 0x6352, 2903: 0x6353, 2904: 0x6354, 2905: 0x6358, 2906: 0x635B, 2907: 0x6365, 2908: 0x6366, 2909: 0x636C, 2910: 0x636D, 2911: 0x6371, 2912: 0x6374, 2913: 0x6375, 2914: 0x6378, 2915: 0x637C, 2916: 0x637D, 2917: 0x637F, 2918: 0x6382, 2919: 0x6384, 2920: 0x6387, 2921: 0x638A, 2922: 0x6390, 2923: 0x6394, 2924: 0x6395, 2925: 0x6399, 2926: 0x639A, 2927: 0x639E, 2928: 0x63A4, 2929: 0x63A6, 2930: 0x63AD, 2931: 0x63AE, 2932: 0x63AF, 2933: 0x63BD, 2934: 0x63C1, 2935: 0x63C5, 2936: 0x63C8, 2937: 0x63CE, 2938: 0x63D1, 2939: 0x63D3, 2940: 0x63D4, 2941: 0x63D5, 2942: 0x63DC, 2943: 0x63E0, 2944: 0x63E5, 2945: 0x63EA, 2946: 0x63EC, 2947: 0x63F2, 2948: 0x63F3, 2949: 0x63F5, 2950: 0x63F8, 2951: 0x63F9, 2952: 0x6409, 2953: 0x640A, 2954: 0x6410, 2955: 0x6412, 2956: 0x6414, 2957: 0x6418, 2958: 0x641E, 2959: 0x6420, 2960: 0x6422, 2961: 0x6424, 2962: 0x6425, 2963: 0x6429, 2964: 0x642A, 2965: 0x642F, 2966: 0x6430, 2967: 0x6435, 2968: 0x643D, 2969: 0x643F, 2970: 0x644B, 2971: 0x644F, 2972: 0x6451, 2973: 0x6452, 2974: 0x6453, 2975: 0x6454, 2976: 0x645A, 2977: 0x645B, 2978: 0x645C, 2979: 0x645D, 2980: 0x645F, 2981: 0x6460, 2982: 0x6461, 2983: 0x6463, 2984: 0x646D, 2985: 0x6473, 2986: 0x6474, 2987: 0x647B, 2988: 0x647D, 2989: 0x6485, 2990: 0x6487, 2991: 0x648F, 2992: 0x6490, 2993: 0x6491, 2994: 0x6498, 2995: 0x6499, 2996: 0x649B, 2997: 0x649D, 2998: 0x649F, 2999: 0x64A1, 3000: 0x64A3, 3001: 0x64A6, 3002: 0x64A8, 3003: 0x64AC, 3004: 0x64B3, 3005: 0x64BD, 3006: 0x64BE, 3007: 0x64BF, 3008: 0x64C4, 3009: 0x64C9, 3010: 0x64CA, 3011: 0x64CB, 3012: 0x64CC, 3013: 0x64CE, 3014: 0x64D0, 3015: 0x64D1, 3016: 0x64D5, 3017: 0x64D7, 3018: 0x64E4, 3019: 0x64E5, 3020: 0x64E9, 3021: 0x64EA, 3022: 0x64ED, 3023: 0x64F0, 3024: 0x64F5, 3025: 0x64F7, 3026: 0x64FB, 3027: 0x64FF, 3028: 0x6501, 3029: 0x6504, 3030: 0x6508, 3031: 0x6509, 3032: 0x650A, 3033: 0x650F, 3034: 0x6513, 3035: 0x6514, 3036: 0x6516, 3037: 0x6519, 3038: 0x651B, 3039: 0x651E, 3040: 0x651F, 3041: 0x6522, 3042: 0x6526, 3043: 0x6529, 3044: 0x652E, 3045: 0x6531, 3046: 0x653A, 3047: 0x653C, 3048: 0x653D, 3049: 0x6543, 3050: 0x6547, 3051: 0x6549, 3052: 0x6550, 3053: 0x6552, 3054: 0x6554, 3055: 0x655F, 3056: 0x6560, 3057: 0x6567, 3058: 0x656B, 3059: 0x657A, 3060: 0x657D, 3061: 0x6581, 3062: 0x6585, 3063: 0x658A, 3064: 0x6592, 3065: 0x6595, 3066: 0x6598, 3067: 0x659D, 3068: 0x65A0, 3069: 0x65A3, 3070: 0x65A6, 3071: 0x65AE, 3072: 0x65B2, 3073: 0x65B3, 3074: 0x65B4, 3075: 0x65BF, 3076: 0x65C2, 3077: 0x65C8, 3078: 0x65C9, 3079: 0x65CE, 3080: 0x65D0, 3081: 0x65D4, 3082: 0x65D6, 3083: 0x65D8, 3084: 0x65DF, 3085: 0x65F0, 3086: 0x65F2, 3087: 0x65F4, 3088: 0x65F5, 3089: 0x65F9, 3090: 0x65FE, 3091: 0x65FF, 3092: 0x6600, 3093: 0x6604, 3094: 0x6608, 3095: 0x6609, 3096: 0x660D, 3097: 0x6611, 3098: 0x6612, 3099: 0x6615, 3100: 0x6616, 3101: 0x661D, 3102: 0x661E, 3103: 0x6621, 3104: 0x6622, 3105: 0x6623, 3106: 0x6624, 3107: 0x6626, 3108: 0x6629, 3109: 0x662A, 3110: 0x662B, 3111: 0x662C, 3112: 0x662E, 3113: 0x6630, 3114: 0x6631, 3115: 0x6633, 3116: 0x6639, 3117: 0x6637, 3118: 0x6640, 3119: 0x6645, 3120: 0x6646, 3121: 0x664A, 3122: 0x664C, 3123: 0x6651, 3124: 0x664E, 3125: 0x6657, 3126: 0x6658, 3127: 0x6659, 3128: 0x665B, 3129: 0x665C, 3130: 0x6660, 3131: 0x6661, 3132: 0x66FB, 3133: 0x666A, 3134: 0x666B, 3135: 0x666C, 3136: 0x667E, 3137: 0x6673, 3138: 0x6675, 3139: 0x667F, 3140: 0x6677, 3141: 0x6678, 3142: 0x6679, 3143: 0x667B, 3144: 0x6680, 3145: 0x667C, 3146: 0x668B, 3147: 0x668C, 3148: 0x668D, 3149: 0x6690, 3150: 0x6692, 3151: 0x6699, 3152: 0x669A, 3153: 0x669B, 3154: 0x669C, 3155: 0x669F, 3156: 0x66A0, 3157: 0x66A4, 3158: 0x66AD, 3159: 0x66B1, 3160: 0x66B2, 3161: 0x66B5, 3162: 0x66BB, 3163: 0x66BF, 3164: 0x66C0, 3165: 0x66C2, 3166: 0x66C3, 3167: 0x66C8, 3168: 0x66CC, 3169: 0x66CE, 3170: 0x66CF, 3171: 0x66D4, 3172: 0x66DB, 3173: 0x66DF, 3174: 0x66E8, 3175: 0x66EB, 3176: 0x66EC, 3177: 0x66EE, 3178: 0x66FA, 3179: 0x6705, 3180: 0x6707, 3181: 0x670E, 3182: 0x6713, 3183: 0x6719, 3184: 0x671C, 3185: 0x6720, 3186: 0x6722, 3187: 0x6733, 3188: 0x673E, 3189: 0x6745, 3190: 0x6747, 3191: 0x6748, 3192: 0x674C, 3193: 0x6754, 3194: 0x6755, 3195: 0x675D, 3196: 0x6766, 3197: 0x676C, 3198: 0x676E, 3199: 0x6774, 3200: 0x6776, 3201: 0x677B, 3202: 0x6781, 3203: 0x6784, 3204: 0x678E, 3205: 0x678F, 3206: 0x6791, 3207: 0x6793, 3208: 0x6796, 3209: 0x6798, 3210: 0x6799, 3211: 0x679B, 3212: 0x67B0, 3213: 0x67B1, 3214: 0x67B2, 3215: 0x67B5, 3216: 0x67BB, 3217: 0x67BC, 3218: 0x67BD, 3219: 0x67F9, 3220: 0x67C0, 3221: 0x67C2, 3222: 0x67C3, 3223: 0x67C5, 3224: 0x67C8, 3225: 0x67C9, 3226: 0x67D2, 3227: 0x67D7, 3228: 0x67D9, 3229: 0x67DC, 3230: 0x67E1, 3231: 0x67E6, 3232: 0x67F0, 3233: 0x67F2, 3234: 0x67F6, 3235: 0x67F7, 3236: 0x6852, 3237: 0x6814, 3238: 0x6819, 3239: 0x681D, 3240: 0x681F, 3241: 0x6828, 3242: 0x6827, 3243: 0x682C, 3244: 0x682D, 3245: 0x682F, 3246: 0x6830, 3247: 0x6831, 3248: 0x6833, 3249: 0x683B, 3250: 0x683F, 3251: 0x6844, 3252: 0x6845, 3253: 0x684A, 3254: 0x684C, 3255: 0x6855, 3256: 0x6857, 3257: 0x6858, 3258: 0x685B, 3259: 0x686B, 3260: 0x686E, 3261: 0x686F, 3262: 0x6870, 3263: 0x6871, 3264: 0x6872, 3265: 0x6875, 3266: 0x6879, 3267: 0x687A, 3268: 0x687B, 3269: 0x687C, 3270: 0x6882, 3271: 0x6884, 3272: 0x6886, 3273: 0x6888, 3274: 0x6896, 3275: 0x6898, 3276: 0x689A, 3277: 0x689C, 3278: 0x68A1, 3279: 0x68A3, 3280: 0x68A5, 3281: 0x68A9, 3282: 0x68AA, 3283: 0x68AE, 3284: 0x68B2, 3285: 0x68BB, 3286: 0x68C5, 3287: 0x68C8, 3288: 0x68CC, 3289: 0x68CF, 3290: 0x68D0, 3291: 0x68D1, 3292: 0x68D3, 3293: 0x68D6, 3294: 0x68D9, 3295: 0x68DC, 3296: 0x68DD, 3297: 0x68E5, 3298: 0x68E8, 3299: 0x68EA, 3300: 0x68EB, 3301: 0x68EC, 3302: 0x68ED, 3303: 0x68F0, 3304: 0x68F1, 3305: 0x68F5, 3306: 0x68F6, 3307: 0x68FB, 3308: 0x68FC, 3309: 0x68FD, 3310: 0x6906, 3311: 0x6909, 3312: 0x690A, 3313: 0x6910, 3314: 0x6911, 3315: 0x6913, 3316: 0x6916, 3317: 0x6917, 3318: 0x6931, 3319: 0x6933, 3320: 0x6935, 3321: 0x6938, 3322: 0x693B, 3323: 0x6942, 3324: 0x6945, 3325: 0x6949, 3326: 0x694E, 3327: 0x6957, 3328: 0x695B, 3329: 0x6963, 3330: 0x6964, 3331: 0x6965, 3332: 0x6966, 3333: 0x6968, 3334: 0x6969, 3335: 0x696C, 3336: 0x6970, 3337: 0x6971, 3338: 0x6972, 3339: 0x697A, 3340: 0x697B, 3341: 0x697F, 3342: 0x6980, 3343: 0x698D, 3344: 0x6992, 3345: 0x6996, 3346: 0x6998, 3347: 0x69A1, 3348: 0x69A5, 3349: 0x69A6, 3350: 0x69A8, 3351: 0x69AB, 3352: 0x69AD, 3353: 0x69AF, 3354: 0x69B7, 3355: 0x69B8, 3356: 0x69BA, 3357: 0x69BC, 3358: 0x69C5, 3359: 0x69C8, 3360: 0x69D1, 3361: 0x69D6, 3362: 0x69D7, 3363: 0x69E2, 3364: 0x69E5, 3365: 0x69EE, 3366: 0x69EF, 3367: 0x69F1, 3368: 0x69F3, 3369: 0x69F5, 3370: 0x69FE, 3371: 0x6A00, 3372: 0x6A01, 3373: 0x6A03, 3374: 0x6A0F, 3375: 0x6A11, 3376: 0x6A15, 3377: 0x6A1A, 3378: 0x6A1D, 3379: 0x6A20, 3380: 0x6A24, 3381: 0x6A28, 3382: 0x6A30, 3383: 0x6A32, 3384: 0x6A34, 3385: 0x6A37, 3386: 0x6A3B, 3387: 0x6A3E, 3388: 0x6A3F, 3389: 0x6A45, 3390: 0x6A46, 3391: 0x6A49, 3392: 0x6A4A, 3393: 0x6A4E, 3394: 0x6A50, 3395: 0x6A51, 3396: 0x6A52, 3397: 0x6A55, 3398: 0x6A56, 3399: 0x6A5B, 3400: 0x6A64, 3401: 0x6A67, 3402: 0x6A6A, 3403: 0x6A71, 3404: 0x6A73, 3405: 0x6A7E, 3406: 0x6A81, 3407: 0x6A83, 3408: 0x6A86, 3409: 0x6A87, 3410: 0x6A89, 3411: 0x6A8B, 3412: 0x6A91, 3413: 0x6A9B, 3414: 0x6A9D, 3415: 0x6A9E, 3416: 0x6A9F, 3417: 0x6AA5, 3418: 0x6AAB, 3419: 0x6AAF, 3420: 0x6AB0, 3421: 0x6AB1, 3422: 0x6AB4, 3423: 0x6ABD, 3424: 0x6ABE, 3425: 0x6ABF, 3426: 0x6AC6, 3427: 0x6AC9, 3428: 0x6AC8, 3429: 0x6ACC, 3430: 0x6AD0, 3431: 0x6AD4, 3432: 0x6AD5, 3433: 0x6AD6, 3434: 0x6ADC, 3435: 0x6ADD, 3436: 0x6AE4, 3437: 0x6AE7, 3438: 0x6AEC, 3439: 0x6AF0, 3440: 0x6AF1, 3441: 0x6AF2, 3442: 0x6AFC, 3443: 0x6AFD, 3444: 0x6B02, 3445: 0x6B03, 3446: 0x6B06, 3447: 0x6B07, 3448: 0x6B09, 3449: 0x6B0F, 3450: 0x6B10, 3451: 0x6B11, 3452: 0x6B17, 3453: 0x6B1B, 3454: 0x6B1E, 3455: 0x6B24, 3456: 0x6B28, 3457: 0x6B2B, 3458: 0x6B2C, 3459: 0x6B2F, 3460: 0x6B35, 3461: 0x6B36, 3462: 0x6B3B, 3463: 0x6B3F, 3464: 0x6B46, 3465: 0x6B4A, 3466: 0x6B4D, 3467: 0x6B52, 3468: 0x6B56, 3469: 0x6B58, 3470: 0x6B5D, 3471: 0x6B60, 3472: 0x6B67, 3473: 0x6B6B, 3474: 0x6B6E, 3475: 0x6B70, 3476: 0x6B75, 3477: 0x6B7D, 3478: 0x6B7E, 3479: 0x6B82, 3480: 0x6B85, 3481: 0x6B97, 3482: 0x6B9B, 3483: 0x6B9F, 3484: 0x6BA0, 3485: 0x6BA2, 3486: 0x6BA3, 3487: 0x6BA8, 3488: 0x6BA9, 3489: 0x6BAC, 3490: 0x6BAD, 3491: 0x6BAE, 3492: 0x6BB0, 3493: 0x6BB8, 3494: 0x6BB9, 3495: 0x6BBD, 3496: 0x6BBE, 3497: 0x6BC3, 3498: 0x6BC4, 3499: 0x6BC9, 3500: 0x6BCC, 3501: 0x6BD6, 3502: 0x6BDA, 3503: 0x6BE1, 3504: 0x6BE3, 3505: 0x6BE6, 3506: 0x6BE7, 3507: 0x6BEE, 3508: 0x6BF1, 3509: 0x6BF7, 3510: 0x6BF9, 3511: 0x6BFF, 3512: 0x6C02, 3513: 0x6C04, 3514: 0x6C05, 3515: 0x6C09, 3516: 0x6C0D, 3517: 0x6C0E, 3518: 0x6C10, 3519: 0x6C12, 3520: 0x6C19, 3521: 0x6C1F, 3522: 0x6C26, 3523: 0x6C27, 3524: 0x6C28, 3525: 0x6C2C, 3526: 0x6C2E, 3527: 0x6C33, 3528: 0x6C35, 3529: 0x6C36, 3530: 0x6C3A, 3531: 0x6C3B, 3532: 0x6C3F, 3533: 0x6C4A, 3534: 0x6C4B, 3535: 0x6C4D, 3536: 0x6C4F, 3537: 0x6C52, 3538: 0x6C54, 3539: 0x6C59, 3540: 0x6C5B, 3541: 0x6C5C, 3542: 0x6C6B, 3543: 0x6C6D, 3544: 0x6C6F, 3545: 0x6C74, 3546: 0x6C76, 3547: 0x6C78, 3548: 0x6C79, 3549: 0x6C7B, 3550: 0x6C85, 3551: 0x6C86, 3552: 0x6C87, 3553: 0x6C89, 3554: 0x6C94, 3555: 0x6C95, 3556: 0x6C97, 3557: 0x6C98, 3558: 0x6C9C, 3559: 0x6C9F, 3560: 0x6CB0, 3561: 0x6CB2, 3562: 0x6CB4, 3563: 0x6CC2, 3564: 0x6CC6, 3565: 0x6CCD, 3566: 0x6CCF, 3567: 0x6CD0, 3568: 0x6CD1, 3569: 0x6CD2, 3570: 0x6CD4, 3571: 0x6CD6, 3572: 0x6CDA, 3573: 0x6CDC, 3574: 0x6CE0, 3575: 0x6CE7, 3576: 0x6CE9, 3577: 0x6CEB, 3578: 0x6CEC, 3579: 0x6CEE, 3580: 0x6CF2, 3581: 0x6CF4, 3582: 0x6D04, 3583: 0x6D07, 3584: 0x6D0A, 3585: 0x6D0E, 3586: 0x6D0F, 3587: 0x6D11, 3588: 0x6D13, 3589: 0x6D1A, 3590: 0x6D26, 3591: 0x6D27, 3592: 0x6D28, 3593: 0x6C67, 3594: 0x6D2E, 3595: 0x6D2F, 3596: 0x6D31, 3597: 0x6D39, 3598: 0x6D3C, 3599: 0x6D3F, 3600: 0x6D57, 3601: 0x6D5E, 3602: 0x6D5F, 3603: 0x6D61, 3604: 0x6D65, 3605: 0x6D67, 3606: 0x6D6F, 3607: 0x6D70, 3608: 0x6D7C, 3609: 0x6D82, 3610: 0x6D87, 3611: 0x6D91, 3612: 0x6D92, 3613: 0x6D94, 3614: 0x6D96, 3615: 0x6D97, 3616: 0x6D98, 3617: 0x6DAA, 3618: 0x6DAC, 3619: 0x6DB4, 3620: 0x6DB7, 3621: 0x6DB9, 3622: 0x6DBD, 3623: 0x6DBF, 3624: 0x6DC4, 3625: 0x6DC8, 3626: 0x6DCA, 3627: 0x6DCE, 3628: 0x6DCF, 3629: 0x6DD6, 3630: 0x6DDB, 3631: 0x6DDD, 3632: 0x6DDF, 3633: 0x6DE0, 3634: 0x6DE2, 3635: 0x6DE5, 3636: 0x6DE9, 3637: 0x6DEF, 3638: 0x6DF0, 3639: 0x6DF4, 3640: 0x6DF6, 3641: 0x6DFC, 3642: 0x6E00, 3643: 0x6E04, 3644: 0x6E1E, 3645: 0x6E22, 3646: 0x6E27, 3647: 0x6E32, 3648: 0x6E36, 3649: 0x6E39, 3650: 0x6E3B, 3651: 0x6E3C, 3652: 0x6E44, 3653: 0x6E45, 3654: 0x6E48, 3655: 0x6E49, 3656: 0x6E4B, 3657: 0x6E4F, 3658: 0x6E51, 3659: 0x6E52, 3660: 0x6E53, 3661: 0x6E54, 3662: 0x6E57, 3663: 0x6E5C, 3664: 0x6E5D, 3665: 0x6E5E, 3666: 0x6E62, 3667: 0x6E63, 3668: 0x6E68, 3669: 0x6E73, 3670: 0x6E7B, 3671: 0x6E7D, 3672: 0x6E8D, 3673: 0x6E93, 3674: 0x6E99, 3675: 0x6EA0, 3676: 0x6EA7, 3677: 0x6EAD, 3678: 0x6EAE, 3679: 0x6EB1, 3680: 0x6EB3, 3681: 0x6EBB, 3682: 0x6EBF, 3683: 0x6EC0, 3684: 0x6EC1, 3685: 0x6EC3, 3686: 0x6EC7, 3687: 0x6EC8, 3688: 0x6ECA, 3689: 0x6ECD, 3690: 0x6ECE, 3691: 0x6ECF, 3692: 0x6EEB, 3693: 0x6EED, 3694: 0x6EEE, 3695: 0x6EF9, 3696: 0x6EFB, 3697: 0x6EFD, 3698: 0x6F04, 3699: 0x6F08, 3700: 0x6F0A, 3701: 0x6F0C, 3702: 0x6F0D, 3703: 0x6F16, 3704: 0x6F18, 3705: 0x6F1A, 3706: 0x6F1B, 3707: 0x6F26, 3708: 0x6F29, 3709: 0x6F2A, 3710: 0x6F2F, 3711: 0x6F30, 3712: 0x6F33, 3713: 0x6F36, 3714: 0x6F3B, 3715: 0x6F3C, 3716: 0x6F2D, 3717: 0x6F4F, 3718: 0x6F51, 3719: 0x6F52, 3720: 0x6F53, 3721: 0x6F57, 3722: 0x6F59, 3723: 0x6F5A, 3724: 0x6F5D, 3725: 0x6F5E, 3726: 0x6F61, 3727: 0x6F62, 3728: 0x6F68, 3729: 0x6F6C, 3730: 0x6F7D, 3731: 0x6F7E, 3732: 0x6F83, 3733: 0x6F87, 3734: 0x6F88, 3735: 0x6F8B, 3736: 0x6F8C, 3737: 0x6F8D, 3738: 0x6F90, 3739: 0x6F92, 3740: 0x6F93, 3741: 0x6F94, 3742: 0x6F96, 3743: 0x6F9A, 3744: 0x6F9F, 3745: 0x6FA0, 3746: 0x6FA5, 3747: 0x6FA6, 3748: 0x6FA7, 3749: 0x6FA8, 3750: 0x6FAE, 3751: 0x6FAF, 3752: 0x6FB0, 3753: 0x6FB5, 3754: 0x6FB6, 3755: 0x6FBC, 3756: 0x6FC5, 3757: 0x6FC7, 3758: 0x6FC8, 3759: 0x6FCA, 3760: 0x6FDA, 3761: 0x6FDE, 3762: 0x6FE8, 3763: 0x6FE9, 3764: 0x6FF0, 3765: 0x6FF5, 3766: 0x6FF9, 3767: 0x6FFC, 3768: 0x6FFD, 3769: 0x7000, 3770: 0x7005, 3771: 0x7006, 3772: 0x7007, 3773: 0x700D, 3774: 0x7017, 3775: 0x7020, 3776: 0x7023, 3777: 0x702F, 3778: 0x7034, 3779: 0x7037, 3780: 0x7039, 3781: 0x703C, 3782: 0x7043, 3783: 0x7044, 3784: 0x7048, 3785: 0x7049, 3786: 0x704A, 3787: 0x704B, 3788: 0x7054, 3789: 0x7055, 3790: 0x705D, 3791: 0x705E, 3792: 0x704E, 3793: 0x7064, 3794: 0x7065, 3795: 0x706C, 3796: 0x706E, 3797: 0x7075, 3798: 0x7076, 3799: 0x707E, 3800: 0x7081, 3801: 0x7085, 3802: 0x7086, 3803: 0x7094, 3804: 0x7095, 3805: 0x7096, 3806: 0x7097, 3807: 0x7098, 3808: 0x709B, 3809: 0x70A4, 3810: 0x70AB, 3811: 0x70B0, 3812: 0x70B1, 3813: 0x70B4, 3814: 0x70B7, 3815: 0x70CA, 3816: 0x70D1, 3817: 0x70D3, 3818: 0x70D4, 3819: 0x70D5, 3820: 0x70D6, 3821: 0x70D8, 3822: 0x70DC, 3823: 0x70E4, 3824: 0x70FA, 3825: 0x7103, 3826: 0x7104, 3827: 0x7105, 3828: 0x7106, 3829: 0x7107, 3830: 0x710B, 3831: 0x710C, 3832: 0x710F, 3833: 0x711E, 3834: 0x7120, 3835: 0x712B, 3836: 0x712D, 3837: 0x712F, 3838: 0x7130, 3839: 0x7131, 3840: 0x7138, 3841: 0x7141, 3842: 0x7145, 3843: 0x7146, 3844: 0x7147, 3845: 0x714A, 3846: 0x714B, 3847: 0x7150, 3848: 0x7152, 3849: 0x7157, 3850: 0x715A, 3851: 0x715C, 3852: 0x715E, 3853: 0x7160, 3854: 0x7168, 3855: 0x7179, 3856: 0x7180, 3857: 0x7185, 3858: 0x7187, 3859: 0x718C, 3860: 0x7192, 3861: 0x719A, 3862: 0x719B, 3863: 0x71A0, 3864: 0x71A2, 3865: 0x71AF, 3866: 0x71B0, 3867: 0x71B2, 3868: 0x71B3, 3869: 0x71BA, 3870: 0x71BF, 3871: 0x71C0, 3872: 0x71C1, 3873: 0x71C4, 3874: 0x71CB, 3875: 0x71CC, 3876: 0x71D3, 3877: 0x71D6, 3878: 0x71D9, 3879: 0x71DA, 3880: 0x71DC, 3881: 0x71F8, 3882: 0x71FE, 3883: 0x7200, 3884: 0x7207, 3885: 0x7208, 3886: 0x7209, 3887: 0x7213, 3888: 0x7217, 3889: 0x721A, 3890: 0x721D, 3891: 0x721F, 3892: 0x7224, 3893: 0x722B, 3894: 0x722F, 3895: 0x7234, 3896: 0x7238, 3897: 0x7239, 3898: 0x7241, 3899: 0x7242, 3900: 0x7243, 3901: 0x7245, 3902: 0x724E, 3903: 0x724F, 3904: 0x7250, 3905: 0x7253, 3906: 0x7255, 3907: 0x7256, 3908: 0x725A, 3909: 0x725C, 3910: 0x725E, 3911: 0x7260, 3912: 0x7263, 3913: 0x7268, 3914: 0x726B, 3915: 0x726E, 3916: 0x726F, 3917: 0x7271, 3918: 0x7277, 3919: 0x7278, 3920: 0x727B, 3921: 0x727C, 3922: 0x727F, 3923: 0x7284, 3924: 0x7289, 3925: 0x728D, 3926: 0x728E, 3927: 0x7293, 3928: 0x729B, 3929: 0x72A8, 3930: 0x72AD, 3931: 0x72AE, 3932: 0x72B1, 3933: 0x72B4, 3934: 0x72BE, 3935: 0x72C1, 3936: 0x72C7, 3937: 0x72C9, 3938: 0x72CC, 3939: 0x72D5, 3940: 0x72D6, 3941: 0x72D8, 3942: 0x72DF, 3943: 0x72E5, 3944: 0x72F3, 3945: 0x72F4, 3946: 0x72FA, 3947: 0x72FB, 3948: 0x72FE, 3949: 0x7302, 3950: 0x7304, 3951: 0x7305, 3952: 0x7307, 3953: 0x730B, 3954: 0x730D, 3955: 0x7312, 3956: 0x7313, 3957: 0x7318, 3958: 0x7319, 3959: 0x731E, 3960: 0x7322, 3961: 0x7324, 3962: 0x7327, 3963: 0x7328, 3964: 0x732C, 3965: 0x7331, 3966: 0x7332, 3967: 0x7335, 3968: 0x733A, 3969: 0x733B, 3970: 0x733D, 3971: 0x7343, 3972: 0x734D, 3973: 0x7350, 3974: 0x7352, 3975: 0x7356, 3976: 0x7358, 3977: 0x735D, 3978: 0x735E, 3979: 0x735F, 3980: 0x7360, 3981: 0x7366, 3982: 0x7367, 3983: 0x7369, 3984: 0x736B, 3985: 0x736C, 3986: 0x736E, 3987: 0x736F, 3988: 0x7371, 3989: 0x7377, 3990: 0x7379, 3991: 0x737C, 3992: 0x7380, 3993: 0x7381, 3994: 0x7383, 3995: 0x7385, 3996: 0x7386, 3997: 0x738E, 3998: 0x7390, 3999: 0x7393, 4000: 0x7395, 4001: 0x7397, 4002: 0x7398, 4003: 0x739C, 4004: 0x739E, 4005: 0x739F, 4006: 0x73A0, 4007: 0x73A2, 4008: 0x73A5, 4009: 0x73A6, 4010: 0x73AA, 4011: 0x73AB, 4012: 0x73AD, 4013: 0x73B5, 4014: 0x73B7, 4015: 0x73B9, 4016: 0x73BC, 4017: 0x73BD, 4018: 0x73BF, 4019: 0x73C5, 4020: 0x73C6, 4021: 0x73C9, 4022: 0x73CB, 4023: 0x73CC, 4024: 0x73CF, 4025: 0x73D2, 4026: 0x73D3, 4027: 0x73D6, 4028: 0x73D9, 4029: 0x73DD, 4030: 0x73E1, 4031: 0x73E3, 4032: 0x73E6, 4033: 0x73E7, 4034: 0x73E9, 4035: 0x73F4, 4036: 0x73F5, 4037: 0x73F7, 4038: 0x73F9, 4039: 0x73FA, 4040: 0x73FB, 4041: 0x73FD, 4042: 0x73FF, 4043: 0x7400, 4044: 0x7401, 4045: 0x7404, 4046: 0x7407, 4047: 0x740A, 4048: 0x7411, 4049: 0x741A, 4050: 0x741B, 4051: 0x7424, 4052: 0x7426, 4053: 0x7428, 4054: 0x7429, 4055: 0x742A, 4056: 0x742B, 4057: 0x742C, 4058: 0x742D, 4059: 0x742E, 4060: 0x742F, 4061: 0x7430, 4062: 0x7431, 4063: 0x7439, 4064: 0x7440, 4065: 0x7443, 4066: 0x7444, 4067: 0x7446, 4068: 0x7447, 4069: 0x744B, 4070: 0x744D, 4071: 0x7451, 4072: 0x7452, 4073: 0x7457, 4074: 0x745D, 4075: 0x7462, 4076: 0x7466, 4077: 0x7467, 4078: 0x7468, 4079: 0x746B, 4080: 0x746D, 4081: 0x746E, 4082: 0x7471, 4083: 0x7472, 4084: 0x7480, 4085: 0x7481, 4086: 0x7485, 4087: 0x7486, 4088: 0x7487, 4089: 0x7489, 4090: 0x748F, 4091: 0x7490, 4092: 0x7491, 4093: 0x7492, 4094: 0x7498, 4095: 0x7499, 4096: 0x749A, 4097: 0x749C, 4098: 0x749F, 4099: 0x74A0, 4100: 0x74A1, 4101: 0x74A3, 4102: 0x74A6, 4103: 0x74A8, 4104: 0x74A9, 4105: 0x74AA, 4106: 0x74AB, 4107: 0x74AE, 4108: 0x74AF, 4109: 0x74B1, 4110: 0x74B2, 4111: 0x74B5, 4112: 0x74B9, 4113: 0x74BB, 4114: 0x74BF, 4115: 0x74C8, 4116: 0x74C9, 4117: 0x74CC, 4118: 0x74D0, 4119: 0x74D3, 4120: 0x74D8, 4121: 0x74DA, 4122: 0x74DB, 4123: 0x74DE, 4124: 0x74DF, 4125: 0x74E4, 4126: 0x74E8, 4127: 0x74EA, 4128: 0x74EB, 4129: 0x74EF, 4130: 0x74F4, 4131: 0x74FA, 4132: 0x74FB, 4133: 0x74FC, 4134: 0x74FF, 4135: 0x7506, 4136: 0x7512, 4137: 0x7516, 4138: 0x7517, 4139: 0x7520, 4140: 0x7521, 4141: 0x7524, 4142: 0x7527, 4143: 0x7529, 4144: 0x752A, 4145: 0x752F, 4146: 0x7536, 4147: 0x7539, 4148: 0x753D, 4149: 0x753E, 4150: 0x753F, 4151: 0x7540, 4152: 0x7543, 4153: 0x7547, 4154: 0x7548, 4155: 0x754E, 4156: 0x7550, 4157: 0x7552, 4158: 0x7557, 4159: 0x755E, 4160: 0x755F, 4161: 0x7561, 4162: 0x756F, 4163: 0x7571, 4164: 0x7579, 4165: 0x757A, 4166: 0x757B, 4167: 0x757C, 4168: 0x757D, 4169: 0x757E, 4170: 0x7581, 4171: 0x7585, 4172: 0x7590, 4173: 0x7592, 4174: 0x7593, 4175: 0x7595, 4176: 0x7599, 4177: 0x759C, 4178: 0x75A2, 4179: 0x75A4, 4180: 0x75B4, 4181: 0x75BA, 4182: 0x75BF, 4183: 0x75C0, 4184: 0x75C1, 4185: 0x75C4, 4186: 0x75C6, 4187: 0x75CC, 4188: 0x75CE, 4189: 0x75CF, 4190: 0x75D7, 4191: 0x75DC, 4192: 0x75DF, 4193: 0x75E0, 4194: 0x75E1, 4195: 0x75E4, 4196: 0x75E7, 4197: 0x75EC, 4198: 0x75EE, 4199: 0x75EF, 4200: 0x75F1, 4201: 0x75F9, 4202: 0x7600, 4203: 0x7602, 4204: 0x7603, 4205: 0x7604, 4206: 0x7607, 4207: 0x7608, 4208: 0x760A, 4209: 0x760C, 4210: 0x760F, 4211: 0x7612, 4212: 0x7613, 4213: 0x7615, 4214: 0x7616, 4215: 0x7619, 4216: 0x761B, 4217: 0x761C, 4218: 0x761D, 4219: 0x761E, 4220: 0x7623, 4221: 0x7625, 4222: 0x7626, 4223: 0x7629, 4224: 0x762D, 4225: 0x7632, 4226: 0x7633, 4227: 0x7635, 4228: 0x7638, 4229: 0x7639, 4230: 0x763A, 4231: 0x763C, 4232: 0x764A, 4233: 0x7640, 4234: 0x7641, 4235: 0x7643, 4236: 0x7644, 4237: 0x7645, 4238: 0x7649, 4239: 0x764B, 4240: 0x7655, 4241: 0x7659, 4242: 0x765F, 4243: 0x7664, 4244: 0x7665, 4245: 0x766D, 4246: 0x766E, 4247: 0x766F, 4248: 0x7671, 4249: 0x7674, 4250: 0x7681, 4251: 0x7685, 4252: 0x768C, 4253: 0x768D, 4254: 0x7695, 4255: 0x769B, 4256: 0x769C, 4257: 0x769D, 4258: 0x769F, 4259: 0x76A0, 4260: 0x76A2, 4261: 0x76A3, 4262: 0x76A4, 4263: 0x76A5, 4264: 0x76A6, 4265: 0x76A7, 4266: 0x76A8, 4267: 0x76AA, 4268: 0x76AD, 4269: 0x76BD, 4270: 0x76C1, 4271: 0x76C5, 4272: 0x76C9, 4273: 0x76CB, 4274: 0x76CC, 4275: 0x76CE, 4276: 0x76D4, 4277: 0x76D9, 4278: 0x76E0, 4279: 0x76E6, 4280: 0x76E8, 4281: 0x76EC, 4282: 0x76F0, 4283: 0x76F1, 4284: 0x76F6, 4285: 0x76F9, 4286: 0x76FC, 4287: 0x7700, 4288: 0x7706, 4289: 0x770A, 4290: 0x770E, 4291: 0x7712, 4292: 0x7714, 4293: 0x7715, 4294: 0x7717, 4295: 0x7719, 4296: 0x771A, 4297: 0x771C, 4298: 0x7722, 4299: 0x7728, 4300: 0x772D, 4301: 0x772E, 4302: 0x772F, 4303: 0x7734, 4304: 0x7735, 4305: 0x7736, 4306: 0x7739, 4307: 0x773D, 4308: 0x773E, 4309: 0x7742, 4310: 0x7745, 4311: 0x7746, 4312: 0x774A, 4313: 0x774D, 4314: 0x774E, 4315: 0x774F, 4316: 0x7752, 4317: 0x7756, 4318: 0x7757, 4319: 0x775C, 4320: 0x775E, 4321: 0x775F, 4322: 0x7760, 4323: 0x7762, 4324: 0x7764, 4325: 0x7767, 4326: 0x776A, 4327: 0x776C, 4328: 0x7770, 4329: 0x7772, 4330: 0x7773, 4331: 0x7774, 4332: 0x777A, 4333: 0x777D, 4334: 0x7780, 4335: 0x7784, 4336: 0x778C, 4337: 0x778D, 4338: 0x7794, 4339: 0x7795, 4340: 0x7796, 4341: 0x779A, 4342: 0x779F, 4343: 0x77A2, 4344: 0x77A7, 4345: 0x77AA, 4346: 0x77AE, 4347: 0x77AF, 4348: 0x77B1, 4349: 0x77B5, 4350: 0x77BE, 4351: 0x77C3, 4352: 0x77C9, 4353: 0x77D1, 4354: 0x77D2, 4355: 0x77D5, 4356: 0x77D9, 4357: 0x77DE, 4358: 0x77DF, 4359: 0x77E0, 4360: 0x77E4, 4361: 0x77E6, 4362: 0x77EA, 4363: 0x77EC, 4364: 0x77F0, 4365: 0x77F1, 4366: 0x77F4, 4367: 0x77F8, 4368: 0x77FB, 4369: 0x7805, 4370: 0x7806, 4371: 0x7809, 4372: 0x780D, 4373: 0x780E, 4374: 0x7811, 4375: 0x781D, 4376: 0x7821, 4377: 0x7822, 4378: 0x7823, 4379: 0x782D, 4380: 0x782E, 4381: 0x7830, 4382: 0x7835, 4383: 0x7837, 4384: 0x7843, 4385: 0x7844, 4386: 0x7847, 4387: 0x7848, 4388: 0x784C, 4389: 0x784E, 4390: 0x7852, 4391: 0x785C, 4392: 0x785E, 4393: 0x7860, 4394: 0x7861, 4395: 0x7863, 4396: 0x7864, 4397: 0x7868, 4398: 0x786A, 4399: 0x786E, 4400: 0x787A, 4401: 0x787E, 4402: 0x788A, 4403: 0x788F, 4404: 0x7894, 4405: 0x7898, 4406: 0x78A1, 4407: 0x789D, 4408: 0x789E, 4409: 0x789F, 4410: 0x78A4, 4411: 0x78A8, 4412: 0x78AC, 4413: 0x78AD, 4414: 0x78B0, 4415: 0x78B1, 4416: 0x78B2, 4417: 0x78B3, 4418: 0x78BB, 4419: 0x78BD, 4420: 0x78BF, 4421: 0x78C7, 4422: 0x78C8, 4423: 0x78C9, 4424: 0x78CC, 4425: 0x78CE, 4426: 0x78D2, 4427: 0x78D3, 4428: 0x78D5, 4429: 0x78D6, 4430: 0x78E4, 4431: 0x78DB, 4432: 0x78DF, 4433: 0x78E0, 4434: 0x78E1, 4435: 0x78E6, 4436: 0x78EA, 4437: 0x78F2, 4438: 0x78F3, 4439: 0x7900, 4440: 0x78F6, 4441: 0x78F7, 4442: 0x78FA, 4443: 0x78FB, 4444: 0x78FF, 4445: 0x7906, 4446: 0x790C, 4447: 0x7910, 4448: 0x791A, 4449: 0x791C, 4450: 0x791E, 4451: 0x791F, 4452: 0x7920, 4453: 0x7925, 4454: 0x7927, 4455: 0x7929, 4456: 0x792D, 4457: 0x7931, 4458: 0x7934, 4459: 0x7935, 4460: 0x793B, 4461: 0x793D, 4462: 0x793F, 4463: 0x7944, 4464: 0x7945, 4465: 0x7946, 4466: 0x794A, 4467: 0x794B, 4468: 0x794F, 4469: 0x7951, 4470: 0x7954, 4471: 0x7958, 4472: 0x795B, 4473: 0x795C, 4474: 0x7967, 4475: 0x7969, 4476: 0x796B, 4477: 0x7972, 4478: 0x7979, 4479: 0x797B, 4480: 0x797C, 4481: 0x797E, 4482: 0x798B, 4483: 0x798C, 4484: 0x7991, 4485: 0x7993, 4486: 0x7994, 4487: 0x7995, 4488: 0x7996, 4489: 0x7998, 4490: 0x799B, 4491: 0x799C, 4492: 0x79A1, 4493: 0x79A8, 4494: 0x79A9, 4495: 0x79AB, 4496: 0x79AF, 4497: 0x79B1, 4498: 0x79B4, 4499: 0x79B8, 4500: 0x79BB, 4501: 0x79C2, 4502: 0x79C4, 4503: 0x79C7, 4504: 0x79C8, 4505: 0x79CA, 4506: 0x79CF, 4507: 0x79D4, 4508: 0x79D6, 4509: 0x79DA, 4510: 0x79DD, 4511: 0x79DE, 4512: 0x79E0, 4513: 0x79E2, 4514: 0x79E5, 4515: 0x79EA, 4516: 0x79EB, 4517: 0x79ED, 4518: 0x79F1, 4519: 0x79F8, 4520: 0x79FC, 4521: 0x7A02, 4522: 0x7A03, 4523: 0x7A07, 4524: 0x7A09, 4525: 0x7A0A, 4526: 0x7A0C, 4527: 0x7A11, 4528: 0x7A15, 4529: 0x7A1B, 4530: 0x7A1E, 4531: 0x7A21, 4532: 0x7A27, 4533: 0x7A2B, 4534: 0x7A2D, 4535: 0x7A2F, 4536: 0x7A30, 4537: 0x7A34, 4538: 0x7A35, 4539: 0x7A38, 4540: 0x7A39, 4541: 0x7A3A, 4542: 0x7A44, 4543: 0x7A45, 4544: 0x7A47, 4545: 0x7A48, 4546: 0x7A4C, 4547: 0x7A55, 4548: 0x7A56, 4549: 0x7A59, 4550: 0x7A5C, 4551: 0x7A5D, 4552: 0x7A5F, 4553: 0x7A60, 4554: 0x7A65, 4555: 0x7A67, 4556: 0x7A6A, 4557: 0x7A6D, 4558: 0x7A75, 4559: 0x7A78, 4560: 0x7A7E, 4561: 0x7A80, 4562: 0x7A82, 4563: 0x7A85, 4564: 0x7A86, 4565: 0x7A8A, 4566: 0x7A8B, 4567: 0x7A90, 4568: 0x7A91, 4569: 0x7A94, 4570: 0x7A9E, 4571: 0x7AA0, 4572: 0x7AA3, 4573: 0x7AAC, 4574: 0x7AB3, 4575: 0x7AB5, 4576: 0x7AB9, 4577: 0x7ABB, 4578: 0x7ABC, 4579: 0x7AC6, 4580: 0x7AC9, 4581: 0x7ACC, 4582: 0x7ACE, 4583: 0x7AD1, 4584: 0x7ADB, 4585: 0x7AE8, 4586: 0x7AE9, 4587: 0x7AEB, 4588: 0x7AEC, 4589: 0x7AF1, 4590: 0x7AF4, 4591: 0x7AFB, 4592: 0x7AFD, 4593: 0x7AFE, 4594: 0x7B07, 4595: 0x7B14, 4596: 0x7B1F, 4597: 0x7B23, 4598: 0x7B27, 4599: 0x7B29, 4600: 0x7B2A, 4601: 0x7B2B, 4602: 0x7B2D, 4603: 0x7B2E, 4604: 0x7B2F, 4605: 0x7B30, 4606: 0x7B31, 4607: 0x7B34, 4608: 0x7B3D, 4609: 0x7B3F, 4610: 0x7B40, 4611: 0x7B41, 4612: 0x7B47, 4613: 0x7B4E, 4614: 0x7B55, 4615: 0x7B60, 4616: 0x7B64, 4617: 0x7B66, 4618: 0x7B69, 4619: 0x7B6A, 4620: 0x7B6D, 4621: 0x7B6F, 4622: 0x7B72, 4623: 0x7B73, 4624: 0x7B77, 4625: 0x7B84, 4626: 0x7B89, 4627: 0x7B8E, 4628: 0x7B90, 4629: 0x7B91, 4630: 0x7B96, 4631: 0x7B9B, 4632: 0x7B9E, 4633: 0x7BA0, 4634: 0x7BA5, 4635: 0x7BAC, 4636: 0x7BAF, 4637: 0x7BB0, 4638: 0x7BB2, 4639: 0x7BB5, 4640: 0x7BB6, 4641: 0x7BBA, 4642: 0x7BBB, 4643: 0x7BBC, 4644: 0x7BBD, 4645: 0x7BC2, 4646: 0x7BC5, 4647: 0x7BC8, 4648: 0x7BCA, 4649: 0x7BD4, 4650: 0x7BD6, 4651: 0x7BD7, 4652: 0x7BD9, 4653: 0x7BDA, 4654: 0x7BDB, 4655: 0x7BE8, 4656: 0x7BEA, 4657: 0x7BF2, 4658: 0x7BF4, 4659: 0x7BF5, 4660: 0x7BF8, 4661: 0x7BF9, 4662: 0x7BFA, 4663: 0x7BFC, 4664: 0x7BFE, 4665: 0x7C01, 4666: 0x7C02, 4667: 0x7C03, 4668: 0x7C04, 4669: 0x7C06, 4670: 0x7C09, 4671: 0x7C0B, 4672: 0x7C0C, 4673: 0x7C0E, 4674: 0x7C0F, 4675: 0x7C19, 4676: 0x7C1B, 4677: 0x7C20, 4678: 0x7C25, 4679: 0x7C26, 4680: 0x7C28, 4681: 0x7C2C, 4682: 0x7C31, 4683: 0x7C33, 4684: 0x7C34, 4685: 0x7C36, 4686: 0x7C39, 4687: 0x7C3A, 4688: 0x7C46, 4689: 0x7C4A, 4690: 0x7C55, 4691: 0x7C51, 4692: 0x7C52, 4693: 0x7C53, 4694: 0x7C59, 4695: 0x7C5A, 4696: 0x7C5B, 4697: 0x7C5C, 4698: 0x7C5D, 4699: 0x7C5E, 4700: 0x7C61, 4701: 0x7C63, 4702: 0x7C67, 4703: 0x7C69, 4704: 0x7C6D, 4705: 0x7C6E, 4706: 0x7C70, 4707: 0x7C72, 4708: 0x7C79, 4709: 0x7C7C, 4710: 0x7C7D, 4711: 0x7C86, 4712: 0x7C87, 4713: 0x7C8F, 4714: 0x7C94, 4715: 0x7C9E, 4716: 0x7CA0, 4717: 0x7CA6, 4718: 0x7CB0, 4719: 0x7CB6, 4720: 0x7CB7, 4721: 0x7CBA, 4722: 0x7CBB, 4723: 0x7CBC, 4724: 0x7CBF, 4725: 0x7CC4, 4726: 0x7CC7, 4727: 0x7CC8, 4728: 0x7CC9, 4729: 0x7CCD, 4730: 0x7CCF, 4731: 0x7CD3, 4732: 0x7CD4, 4733: 0x7CD5, 4734: 0x7CD7, 4735: 0x7CD9, 4736: 0x7CDA, 4737: 0x7CDD, 4738: 0x7CE6, 4739: 0x7CE9, 4740: 0x7CEB, 4741: 0x7CF5, 4742: 0x7D03, 4743: 0x7D07, 4744: 0x7D08, 4745: 0x7D09, 4746: 0x7D0F, 4747: 0x7D11, 4748: 0x7D12, 4749: 0x7D13, 4750: 0x7D16, 4751: 0x7D1D, 4752: 0x7D1E, 4753: 0x7D23, 4754: 0x7D26, 4755: 0x7D2A, 4756: 0x7D2D, 4757: 0x7D31, 4758: 0x7D3C, 4759: 0x7D3D, 4760: 0x7D3E, 4761: 0x7D40, 4762: 0x7D41, 4763: 0x7D47, 4764: 0x7D48, 4765: 0x7D4D, 4766: 0x7D51, 4767: 0x7D53, 4768: 0x7D57, 4769: 0x7D59, 4770: 0x7D5A, 4771: 0x7D5C, 4772: 0x7D5D, 4773: 0x7D65, 4774: 0x7D67, 4775: 0x7D6A, 4776: 0x7D70, 4777: 0x7D78, 4778: 0x7D7A, 4779: 0x7D7B, 4780: 0x7D7F, 4781: 0x7D81, 4782: 0x7D82, 4783: 0x7D83, 4784: 0x7D85, 4785: 0x7D86, 4786: 0x7D88, 4787: 0x7D8B, 4788: 0x7D8C, 4789: 0x7D8D, 4790: 0x7D91, 4791: 0x7D96, 4792: 0x7D97, 4793: 0x7D9D, 4794: 0x7D9E, 4795: 0x7DA6, 4796: 0x7DA7, 4797: 0x7DAA, 4798: 0x7DB3, 4799: 0x7DB6, 4800: 0x7DB7, 4801: 0x7DB9, 4802: 0x7DC2, 4803: 0x7DC3, 4804: 0x7DC4, 4805: 0x7DC5, 4806: 0x7DC6, 4807: 0x7DCC, 4808: 0x7DCD, 4809: 0x7DCE, 4810: 0x7DD7, 4811: 0x7DD9, 4812: 0x7E00, 4813: 0x7DE2, 4814: 0x7DE5, 4815: 0x7DE6, 4816: 0x7DEA, 4817: 0x7DEB, 4818: 0x7DED, 4819: 0x7DF1, 4820: 0x7DF5, 4821: 0x7DF6, 4822: 0x7DF9, 4823: 0x7DFA, 4824: 0x7E08, 4825: 0x7E10, 4826: 0x7E11, 4827: 0x7E15, 4828: 0x7E17, 4829: 0x7E1C, 4830: 0x7E1D, 4831: 0x7E20, 4832: 0x7E27, 4833: 0x7E28, 4834: 0x7E2C, 4835: 0x7E2D, 4836: 0x7E2F, 4837: 0x7E33, 4838: 0x7E36, 4839: 0x7E3F, 4840: 0x7E44, 4841: 0x7E45, 4842: 0x7E47, 4843: 0x7E4E, 4844: 0x7E50, 4845: 0x7E52, 4846: 0x7E58, 4847: 0x7E5F, 4848: 0x7E61, 4849: 0x7E62, 4850: 0x7E65, 4851: 0x7E6B, 4852: 0x7E6E, 4853: 0x7E6F, 4854: 0x7E73, 4855: 0x7E78, 4856: 0x7E7E, 4857: 0x7E81, 4858: 0x7E86, 4859: 0x7E87, 4860: 0x7E8A, 4861: 0x7E8D, 4862: 0x7E91, 4863: 0x7E95, 4864: 0x7E98, 4865: 0x7E9A, 4866: 0x7E9D, 4867: 0x7E9E, 4868: 0x7F3C, 4869: 0x7F3B, 4870: 0x7F3D, 4871: 0x7F3E, 4872: 0x7F3F, 4873: 0x7F43, 4874: 0x7F44, 4875: 0x7F47, 4876: 0x7F4F, 4877: 0x7F52, 4878: 0x7F53, 4879: 0x7F5B, 4880: 0x7F5C, 4881: 0x7F5D, 4882: 0x7F61, 4883: 0x7F63, 4884: 0x7F64, 4885: 0x7F65, 4886: 0x7F66, 4887: 0x7F6D, 4888: 0x7F71, 4889: 0x7F7D, 4890: 0x7F7E, 4891: 0x7F7F, 4892: 0x7F80, 4893: 0x7F8B, 4894: 0x7F8D, 4895: 0x7F8F, 4896: 0x7F90, 4897: 0x7F91, 4898: 0x7F96, 4899: 0x7F97, 4900: 0x7F9C, 4901: 0x7FA1, 4902: 0x7FA2, 4903: 0x7FA6, 4904: 0x7FAA, 4905: 0x7FAD, 4906: 0x7FB4, 4907: 0x7FBC, 4908: 0x7FBF, 4909: 0x7FC0, 4910: 0x7FC3, 4911: 0x7FC8, 4912: 0x7FCE, 4913: 0x7FCF, 4914: 0x7FDB, 4915: 0x7FDF, 4916: 0x7FE3, 4917: 0x7FE5, 4918: 0x7FE8, 4919: 0x7FEC, 4920: 0x7FEE, 4921: 0x7FEF, 4922: 0x7FF2, 4923: 0x7FFA, 4924: 0x7FFD, 4925: 0x7FFE, 4926: 0x7FFF, 4927: 0x8007, 4928: 0x8008, 4929: 0x800A, 4930: 0x800D, 4931: 0x800E, 4932: 0x800F, 4933: 0x8011, 4934: 0x8013, 4935: 0x8014, 4936: 0x8016, 4937: 0x801D, 4938: 0x801E, 4939: 0x801F, 4940: 0x8020, 4941: 0x8024, 4942: 0x8026, 4943: 0x802C, 4944: 0x802E, 4945: 0x8030, 4946: 0x8034, 4947: 0x8035, 4948: 0x8037, 4949: 0x8039, 4950: 0x803A, 4951: 0x803C, 4952: 0x803E, 4953: 0x8040, 4954: 0x8044, 4955: 0x8060, 4956: 0x8064, 4957: 0x8066, 4958: 0x806D, 4959: 0x8071, 4960: 0x8075, 4961: 0x8081, 4962: 0x8088, 4963: 0x808E, 4964: 0x809C, 4965: 0x809E, 4966: 0x80A6, 4967: 0x80A7, 4968: 0x80AB, 4969: 0x80B8, 4970: 0x80B9, 4971: 0x80C8, 4972: 0x80CD, 4973: 0x80CF, 4974: 0x80D2, 4975: 0x80D4, 4976: 0x80D5, 4977: 0x80D7, 4978: 0x80D8, 4979: 0x80E0, 4980: 0x80ED, 4981: 0x80EE, 4982: 0x80F0, 4983: 0x80F2, 4984: 0x80F3, 4985: 0x80F6, 4986: 0x80F9, 4987: 0x80FA, 4988: 0x80FE, 4989: 0x8103, 4990: 0x810B, 4991: 0x8116, 4992: 0x8117, 4993: 0x8118, 4994: 0x811C, 4995: 0x811E, 4996: 0x8120, 4997: 0x8124, 4998: 0x8127, 4999: 0x812C, 5000: 0x8130, 5001: 0x8135, 5002: 0x813A, 5003: 0x813C, 5004: 0x8145, 5005: 0x8147, 5006: 0x814A, 5007: 0x814C, 5008: 0x8152, 5009: 0x8157, 5010: 0x8160, 5011: 0x8161, 5012: 0x8167, 5013: 0x8168, 5014: 0x8169, 5015: 0x816D, 5016: 0x816F, 5017: 0x8177, 5018: 0x8181, 5019: 0x8190, 5020: 0x8184, 5021: 0x8185, 5022: 0x8186, 5023: 0x818B, 5024: 0x818E, 5025: 0x8196, 5026: 0x8198, 5027: 0x819B, 5028: 0x819E, 5029: 0x81A2, 5030: 0x81AE, 5031: 0x81B2, 5032: 0x81B4, 5033: 0x81BB, 5034: 0x81CB, 5035: 0x81C3, 5036: 0x81C5, 5037: 0x81CA, 5038: 0x81CE, 5039: 0x81CF, 5040: 0x81D5, 5041: 0x81D7, 5042: 0x81DB, 5043: 0x81DD, 5044: 0x81DE, 5045: 0x81E1, 5046: 0x81E4, 5047: 0x81EB, 5048: 0x81EC, 5049: 0x81F0, 5050: 0x81F1, 5051: 0x81F2, 5052: 0x81F5, 5053: 0x81F6, 5054: 0x81F8, 5055: 0x81F9, 5056: 0x81FD, 5057: 0x81FF, 5058: 0x8200, 5059: 0x8203, 5060: 0x820F, 5061: 0x8213, 5062: 0x8214, 5063: 0x8219, 5064: 0x821A, 5065: 0x821D, 5066: 0x8221, 5067: 0x8222, 5068: 0x8228, 5069: 0x8232, 5070: 0x8234, 5071: 0x823A, 5072: 0x8243, 5073: 0x8244, 5074: 0x8245, 5075: 0x8246, 5076: 0x824B, 5077: 0x824E, 5078: 0x824F, 5079: 0x8251, 5080: 0x8256, 5081: 0x825C, 5082: 0x8260, 5083: 0x8263, 5084: 0x8267, 5085: 0x826D, 5086: 0x8274, 5087: 0x827B, 5088: 0x827D, 5089: 0x827F, 5090: 0x8280, 5091: 0x8281, 5092: 0x8283, 5093: 0x8284, 5094: 0x8287, 5095: 0x8289, 5096: 0x828A, 5097: 0x828E, 5098: 0x8291, 5099: 0x8294, 5100: 0x8296, 5101: 0x8298, 5102: 0x829A, 5103: 0x829B, 5104: 0x82A0, 5105: 0x82A1, 5106: 0x82A3, 5107: 0x82A4, 5108: 0x82A7, 5109: 0x82A8, 5110: 0x82A9, 5111: 0x82AA, 5112: 0x82AE, 5113: 0x82B0, 5114: 0x82B2, 5115: 0x82B4, 5116: 0x82B7, 5117: 0x82BA, 5118: 0x82BC, 5119: 0x82BE, 5120: 0x82BF, 5121: 0x82C6, 5122: 0x82D0, 5123: 0x82D5, 5124: 0x82DA, 5125: 0x82E0, 5126: 0x82E2, 5127: 0x82E4, 5128: 0x82E8, 5129: 0x82EA, 5130: 0x82ED, 5131: 0x82EF, 5132: 0x82F6, 5133: 0x82F7, 5134: 0x82FD, 5135: 0x82FE, 5136: 0x8300, 5137: 0x8301, 5138: 0x8307, 5139: 0x8308, 5140: 0x830A, 5141: 0x830B, 5142: 0x8354, 5143: 0x831B, 5144: 0x831D, 5145: 0x831E, 5146: 0x831F, 5147: 0x8321, 5148: 0x8322, 5149: 0x832C, 5150: 0x832D, 5151: 0x832E, 5152: 0x8330, 5153: 0x8333, 5154: 0x8337, 5155: 0x833A, 5156: 0x833C, 5157: 0x833D, 5158: 0x8342, 5159: 0x8343, 5160: 0x8344, 5161: 0x8347, 5162: 0x834D, 5163: 0x834E, 5164: 0x8351, 5165: 0x8355, 5166: 0x8356, 5167: 0x8357, 5168: 0x8370, 5169: 0x8378, 5170: 0x837D, 5171: 0x837F, 5172: 0x8380, 5173: 0x8382, 5174: 0x8384, 5175: 0x8386, 5176: 0x838D, 5177: 0x8392, 5178: 0x8394, 5179: 0x8395, 5180: 0x8398, 5181: 0x8399, 5182: 0x839B, 5183: 0x839C, 5184: 0x839D, 5185: 0x83A6, 5186: 0x83A7, 5187: 0x83A9, 5188: 0x83AC, 5189: 0x83BE, 5190: 0x83BF, 5191: 0x83C0, 5192: 0x83C7, 5193: 0x83C9, 5194: 0x83CF, 5195: 0x83D0, 5196: 0x83D1, 5197: 0x83D4, 5198: 0x83DD, 5199: 0x8353, 5200: 0x83E8, 5201: 0x83EA, 5202: 0x83F6, 5203: 0x83F8, 5204: 0x83F9, 5205: 0x83FC, 5206: 0x8401, 5207: 0x8406, 5208: 0x840A, 5209: 0x840F, 5210: 0x8411, 5211: 0x8415, 5212: 0x8419, 5213: 0x83AD, 5214: 0x842F, 5215: 0x8439, 5216: 0x8445, 5217: 0x8447, 5218: 0x8448, 5219: 0x844A, 5220: 0x844D, 5221: 0x844F, 5222: 0x8451, 5223: 0x8452, 5224: 0x8456, 5225: 0x8458, 5226: 0x8459, 5227: 0x845A, 5228: 0x845C, 5229: 0x8460, 5230: 0x8464, 5231: 0x8465, 5232: 0x8467, 5233: 0x846A, 5234: 0x8470, 5235: 0x8473, 5236: 0x8474, 5237: 0x8476, 5238: 0x8478, 5239: 0x847C, 5240: 0x847D, 5241: 0x8481, 5242: 0x8485, 5243: 0x8492, 5244: 0x8493, 5245: 0x8495, 5246: 0x849E, 5247: 0x84A6, 5248: 0x84A8, 5249: 0x84A9, 5250: 0x84AA, 5251: 0x84AF, 5252: 0x84B1, 5253: 0x84B4, 5254: 0x84BA, 5255: 0x84BD, 5256: 0x84BE, 5257: 0x84C0, 5258: 0x84C2, 5259: 0x84C7, 5260: 0x84C8, 5261: 0x84CC, 5262: 0x84CF, 5263: 0x84D3, 5264: 0x84DC, 5265: 0x84E7, 5266: 0x84EA, 5267: 0x84EF, 5268: 0x84F0, 5269: 0x84F1, 5270: 0x84F2, 5271: 0x84F7, 5272: 0x8532, 5273: 0x84FA, 5274: 0x84FB, 5275: 0x84FD, 5276: 0x8502, 5277: 0x8503, 5278: 0x8507, 5279: 0x850C, 5280: 0x850E, 5281: 0x8510, 5282: 0x851C, 5283: 0x851E, 5284: 0x8522, 5285: 0x8523, 5286: 0x8524, 5287: 0x8525, 5288: 0x8527, 5289: 0x852A, 5290: 0x852B, 5291: 0x852F, 5292: 0x8533, 5293: 0x8534, 5294: 0x8536, 5295: 0x853F, 5296: 0x8546, 5297: 0x854F, 5298: 0x8550, 5299: 0x8551, 5300: 0x8552, 5301: 0x8553, 5302: 0x8556, 5303: 0x8559, 5304: 0x855C, 5305: 0x855D, 5306: 0x855E, 5307: 0x855F, 5308: 0x8560, 5309: 0x8561, 5310: 0x8562, 5311: 0x8564, 5312: 0x856B, 5313: 0x856F, 5314: 0x8579, 5315: 0x857A, 5316: 0x857B, 5317: 0x857D, 5318: 0x857F, 5319: 0x8581, 5320: 0x8585, 5321: 0x8586, 5322: 0x8589, 5323: 0x858B, 5324: 0x858C, 5325: 0x858F, 5326: 0x8593, 5327: 0x8598, 5328: 0x859D, 5329: 0x859F, 5330: 0x85A0, 5331: 0x85A2, 5332: 0x85A5, 5333: 0x85A7, 5334: 0x85B4, 5335: 0x85B6, 5336: 0x85B7, 5337: 0x85B8, 5338: 0x85BC, 5339: 0x85BD, 5340: 0x85BE, 5341: 0x85BF, 5342: 0x85C2, 5343: 0x85C7, 5344: 0x85CA, 5345: 0x85CB, 5346: 0x85CE, 5347: 0x85AD, 5348: 0x85D8, 5349: 0x85DA, 5350: 0x85DF, 5351: 0x85E0, 5352: 0x85E6, 5353: 0x85E8, 5354: 0x85ED, 5355: 0x85F3, 5356: 0x85F6, 5357: 0x85FC, 5358: 0x85FF, 5359: 0x8600, 5360: 0x8604, 5361: 0x8605, 5362: 0x860D, 5363: 0x860E, 5364: 0x8610, 5365: 0x8611, 5366: 0x8612, 5367: 0x8618, 5368: 0x8619, 5369: 0x861B, 5370: 0x861E, 5371: 0x8621, 5372: 0x8627, 5373: 0x8629, 5374: 0x8636, 5375: 0x8638, 5376: 0x863A, 5377: 0x863C, 5378: 0x863D, 5379: 0x8640, 5380: 0x8642, 5381: 0x8646, 5382: 0x8652, 5383: 0x8653, 5384: 0x8656, 5385: 0x8657, 5386: 0x8658, 5387: 0x8659, 5388: 0x865D, 5389: 0x8660, 5390: 0x8661, 5391: 0x8662, 5392: 0x8663, 5393: 0x8664, 5394: 0x8669, 5395: 0x866C, 5396: 0x866F, 5397: 0x8675, 5398: 0x8676, 5399: 0x8677, 5400: 0x867A, 5401: 0x868D, 5402: 0x8691, 5403: 0x8696, 5404: 0x8698, 5405: 0x869A, 5406: 0x869C, 5407: 0x86A1, 5408: 0x86A6, 5409: 0x86A7, 5410: 0x86A8, 5411: 0x86AD, 5412: 0x86B1, 5413: 0x86B3, 5414: 0x86B4, 5415: 0x86B5, 5416: 0x86B7, 5417: 0x86B8, 5418: 0x86B9, 5419: 0x86BF, 5420: 0x86C0, 5421: 0x86C1, 5422: 0x86C3, 5423: 0x86C5, 5424: 0x86D1, 5425: 0x86D2, 5426: 0x86D5, 5427: 0x86D7, 5428: 0x86DA, 5429: 0x86DC, 5430: 0x86E0, 5431: 0x86E3, 5432: 0x86E5, 5433: 0x86E7, 5434: 0x8688, 5435: 0x86FA, 5436: 0x86FC, 5437: 0x86FD, 5438: 0x8704, 5439: 0x8705, 5440: 0x8707, 5441: 0x870B, 5442: 0x870E, 5443: 0x870F, 5444: 0x8710, 5445: 0x8713, 5446: 0x8714, 5447: 0x8719, 5448: 0x871E, 5449: 0x871F, 5450: 0x8721, 5451: 0x8723, 5452: 0x8728, 5453: 0x872E, 5454: 0x872F, 5455: 0x8731, 5456: 0x8732, 5457: 0x8739, 5458: 0x873A, 5459: 0x873C, 5460: 0x873D, 5461: 0x873E, 5462: 0x8740, 5463: 0x8743, 5464: 0x8745, 5465: 0x874D, 5466: 0x8758, 5467: 0x875D, 5468: 0x8761, 5469: 0x8764, 5470: 0x8765, 5471: 0x876F, 5472: 0x8771, 5473: 0x8772, 5474: 0x877B, 5475: 0x8783, 5476: 0x8784, 5477: 0x8785, 5478: 0x8786, 5479: 0x8787, 5480: 0x8788, 5481: 0x8789, 5482: 0x878B, 5483: 0x878C, 5484: 0x8790, 5485: 0x8793, 5486: 0x8795, 5487: 0x8797, 5488: 0x8798, 5489: 0x8799, 5490: 0x879E, 5491: 0x87A0, 5492: 0x87A3, 5493: 0x87A7, 5494: 0x87AC, 5495: 0x87AD, 5496: 0x87AE, 5497: 0x87B1, 5498: 0x87B5, 5499: 0x87BE, 5500: 0x87BF, 5501: 0x87C1, 5502: 0x87C8, 5503: 0x87C9, 5504: 0x87CA, 5505: 0x87CE, 5506: 0x87D5, 5507: 0x87D6, 5508: 0x87D9, 5509: 0x87DA, 5510: 0x87DC, 5511: 0x87DF, 5512: 0x87E2, 5513: 0x87E3, 5514: 0x87E4, 5515: 0x87EA, 5516: 0x87EB, 5517: 0x87ED, 5518: 0x87F1, 5519: 0x87F3, 5520: 0x87F8, 5521: 0x87FA, 5522: 0x87FF, 5523: 0x8801, 5524: 0x8803, 5525: 0x8806, 5526: 0x8809, 5527: 0x880A, 5528: 0x880B, 5529: 0x8810, 5530: 0x8819, 5531: 0x8812, 5532: 0x8813, 5533: 0x8814, 5534: 0x8818, 5535: 0x881A, 5536: 0x881B, 5537: 0x881C, 5538: 0x881E, 5539: 0x881F, 5540: 0x8828, 5541: 0x882D, 5542: 0x882E, 5543: 0x8830, 5544: 0x8832, 5545: 0x8835, 5546: 0x883A, 5547: 0x883C, 5548: 0x8841, 5549: 0x8843, 5550: 0x8845, 5551: 0x8848, 5552: 0x8849, 5553: 0x884A, 5554: 0x884B, 5555: 0x884E, 5556: 0x8851, 5557: 0x8855, 5558: 0x8856, 5559: 0x8858, 5560: 0x885A, 5561: 0x885C, 5562: 0x885F, 5563: 0x8860, 5564: 0x8864, 5565: 0x8869, 5566: 0x8871, 5567: 0x8879, 5568: 0x887B, 5569: 0x8880, 5570: 0x8898, 5571: 0x889A, 5572: 0x889B, 5573: 0x889C, 5574: 0x889F, 5575: 0x88A0, 5576: 0x88A8, 5577: 0x88AA, 5578: 0x88BA, 5579: 0x88BD, 5580: 0x88BE, 5581: 0x88C0, 5582: 0x88CA, 5583: 0x88CB, 5584: 0x88CC, 5585: 0x88CD, 5586: 0x88CE, 5587: 0x88D1, 5588: 0x88D2, 5589: 0x88D3, 5590: 0x88DB, 5591: 0x88DE, 5592: 0x88E7, 5593: 0x88EF, 5594: 0x88F0, 5595: 0x88F1, 5596: 0x88F5, 5597: 0x88F7, 5598: 0x8901, 5599: 0x8906, 5600: 0x890D, 5601: 0x890E, 5602: 0x890F, 5603: 0x8915, 5604: 0x8916, 5605: 0x8918, 5606: 0x8919, 5607: 0x891A, 5608: 0x891C, 5609: 0x8920, 5610: 0x8926, 5611: 0x8927, 5612: 0x8928, 5613: 0x8930, 5614: 0x8931, 5615: 0x8932, 5616: 0x8935, 5617: 0x8939, 5618: 0x893A, 5619: 0x893E, 5620: 0x8940, 5621: 0x8942, 5622: 0x8945, 5623: 0x8946, 5624: 0x8949, 5625: 0x894F, 5626: 0x8952, 5627: 0x8957, 5628: 0x895A, 5629: 0x895B, 5630: 0x895C, 5631: 0x8961, 5632: 0x8962, 5633: 0x8963, 5634: 0x896B, 5635: 0x896E, 5636: 0x8970, 5637: 0x8973, 5638: 0x8975, 5639: 0x897A, 5640: 0x897B, 5641: 0x897C, 5642: 0x897D, 5643: 0x8989, 5644: 0x898D, 5645: 0x8990, 5646: 0x8994, 5647: 0x8995, 5648: 0x899B, 5649: 0x899C, 5650: 0x899F, 5651: 0x89A0, 5652: 0x89A5, 5653: 0x89B0, 5654: 0x89B4, 5655: 0x89B5, 5656: 0x89B6, 5657: 0x89B7, 5658: 0x89BC, 5659: 0x89D4, 5660: 0x89D5, 5661: 0x89D6, 5662: 0x89D7, 5663: 0x89D8, 5664: 0x89E5, 5665: 0x89E9, 5666: 0x89EB, 5667: 0x89ED, 5668: 0x89F1, 5669: 0x89F3, 5670: 0x89F6, 5671: 0x89F9, 5672: 0x89FD, 5673: 0x89FF, 5674: 0x8A04, 5675: 0x8A05, 5676: 0x8A07, 5677: 0x8A0F, 5678: 0x8A11, 5679: 0x8A12, 5680: 0x8A14, 5681: 0x8A15, 5682: 0x8A1E, 5683: 0x8A20, 5684: 0x8A22, 5685: 0x8A24, 5686: 0x8A26, 5687: 0x8A2B, 5688: 0x8A2C, 5689: 0x8A2F, 5690: 0x8A35, 5691: 0x8A37, 5692: 0x8A3D, 5693: 0x8A3E, 5694: 0x8A40, 5695: 0x8A43, 5696: 0x8A45, 5697: 0x8A47, 5698: 0x8A49, 5699: 0x8A4D, 5700: 0x8A4E, 5701: 0x8A53, 5702: 0x8A56, 5703: 0x8A57, 5704: 0x8A58, 5705: 0x8A5C, 5706: 0x8A5D, 5707: 0x8A61, 5708: 0x8A65, 5709: 0x8A67, 5710: 0x8A75, 5711: 0x8A76, 5712: 0x8A77, 5713: 0x8A79, 5714: 0x8A7A, 5715: 0x8A7B, 5716: 0x8A7E, 5717: 0x8A7F, 5718: 0x8A80, 5719: 0x8A83, 5720: 0x8A86, 5721: 0x8A8B, 5722: 0x8A8F, 5723: 0x8A90, 5724: 0x8A92, 5725: 0x8A96, 5726: 0x8A97, 5727: 0x8A99, 5728: 0x8A9F, 5729: 0x8AA7, 5730: 0x8AA9, 5731: 0x8AAE, 5732: 0x8AAF, 5733: 0x8AB3, 5734: 0x8AB6, 5735: 0x8AB7, 5736: 0x8ABB, 5737: 0x8ABE, 5738: 0x8AC3, 5739: 0x8AC6, 5740: 0x8AC8, 5741: 0x8AC9, 5742: 0x8ACA, 5743: 0x8AD1, 5744: 0x8AD3, 5745: 0x8AD4, 5746: 0x8AD5, 5747: 0x8AD7, 5748: 0x8ADD, 5749: 0x8ADF, 5750: 0x8AEC, 5751: 0x8AF0, 5752: 0x8AF4, 5753: 0x8AF5, 5754: 0x8AF6, 5755: 0x8AFC, 5756: 0x8AFF, 5757: 0x8B05, 5758: 0x8B06, 5759: 0x8B0B, 5760: 0x8B11, 5761: 0x8B1C, 5762: 0x8B1E, 5763: 0x8B1F, 5764: 0x8B0A, 5765: 0x8B2D, 5766: 0x8B30, 5767: 0x8B37, 5768: 0x8B3C, 5769: 0x8B42, 5770: 0x8B43, 5771: 0x8B44, 5772: 0x8B45, 5773: 0x8B46, 5774: 0x8B48, 5775: 0x8B52, 5776: 0x8B53, 5777: 0x8B54, 5778: 0x8B59, 5779: 0x8B4D, 5780: 0x8B5E, 5781: 0x8B63, 5782: 0x8B6D, 5783: 0x8B76, 5784: 0x8B78, 5785: 0x8B79, 5786: 0x8B7C, 5787: 0x8B7E, 5788: 0x8B81, 5789: 0x8B84, 5790: 0x8B85, 5791: 0x8B8B, 5792: 0x8B8D, 5793: 0x8B8F, 5794: 0x8B94, 5795: 0x8B95, 5796: 0x8B9C, 5797: 0x8B9E, 5798: 0x8B9F, 5799: 0x8C38, 5800: 0x8C39, 5801: 0x8C3D, 5802: 0x8C3E, 5803: 0x8C45, 5804: 0x8C47, 5805: 0x8C49, 5806: 0x8C4B, 5807: 0x8C4F, 5808: 0x8C51, 5809: 0x8C53, 5810: 0x8C54, 5811: 0x8C57, 5812: 0x8C58, 5813: 0x8C5B, 5814: 0x8C5D, 5815: 0x8C59, 5816: 0x8C63, 5817: 0x8C64, 5818: 0x8C66, 5819: 0x8C68, 5820: 0x8C69, 5821: 0x8C6D, 5822: 0x8C73, 5823: 0x8C75, 5824: 0x8C76, 5825: 0x8C7B, 5826: 0x8C7E, 5827: 0x8C86, 5828: 0x8C87, 5829: 0x8C8B, 5830: 0x8C90, 5831: 0x8C92, 5832: 0x8C93, 5833: 0x8C99, 5834: 0x8C9B, 5835: 0x8C9C, 5836: 0x8CA4, 5837: 0x8CB9, 5838: 0x8CBA, 5839: 0x8CC5, 5840: 0x8CC6, 5841: 0x8CC9, 5842: 0x8CCB, 5843: 0x8CCF, 5844: 0x8CD6, 5845: 0x8CD5, 5846: 0x8CD9, 5847: 0x8CDD, 5848: 0x8CE1, 5849: 0x8CE8, 5850: 0x8CEC, 5851: 0x8CEF, 5852: 0x8CF0, 5853: 0x8CF2, 5854: 0x8CF5, 5855: 0x8CF7, 5856: 0x8CF8, 5857: 0x8CFE, 5858: 0x8CFF, 5859: 0x8D01, 5860: 0x8D03, 5861: 0x8D09, 5862: 0x8D12, 5863: 0x8D17, 5864: 0x8D1B, 5865: 0x8D65, 5866: 0x8D69, 5867: 0x8D6C, 5868: 0x8D6E, 5869: 0x8D7F, 5870: 0x8D82, 5871: 0x8D84, 5872: 0x8D88, 5873: 0x8D8D, 5874: 0x8D90, 5875: 0x8D91, 5876: 0x8D95, 5877: 0x8D9E, 5878: 0x8D9F, 5879: 0x8DA0, 5880: 0x8DA6, 5881: 0x8DAB, 5882: 0x8DAC, 5883: 0x8DAF, 5884: 0x8DB2, 5885: 0x8DB5, 5886: 0x8DB7, 5887: 0x8DB9, 5888: 0x8DBB, 5889: 0x8DC0, 5890: 0x8DC5, 5891: 0x8DC6, 5892: 0x8DC7, 5893: 0x8DC8, 5894: 0x8DCA, 5895: 0x8DCE, 5896: 0x8DD1, 5897: 0x8DD4, 5898: 0x8DD5, 5899: 0x8DD7, 5900: 0x8DD9, 5901: 0x8DE4, 5902: 0x8DE5, 5903: 0x8DE7, 5904: 0x8DEC, 5905: 0x8DF0, 5906: 0x8DBC, 5907: 0x8DF1, 5908: 0x8DF2, 5909: 0x8DF4, 5910: 0x8DFD, 5911: 0x8E01, 5912: 0x8E04, 5913: 0x8E05, 5914: 0x8E06, 5915: 0x8E0B, 5916: 0x8E11, 5917: 0x8E14, 5918: 0x8E16, 5919: 0x8E20, 5920: 0x8E21, 5921: 0x8E22, 5922: 0x8E23, 5923: 0x8E26, 5924: 0x8E27, 5925: 0x8E31, 5926: 0x8E33, 5927: 0x8E36, 5928: 0x8E37, 5929: 0x8E38, 5930: 0x8E39, 5931: 0x8E3D, 5932: 0x8E40, 5933: 0x8E41, 5934: 0x8E4B, 5935: 0x8E4D, 5936: 0x8E4E, 5937: 0x8E4F, 5938: 0x8E54, 5939: 0x8E5B, 5940: 0x8E5C, 5941: 0x8E5D, 5942: 0x8E5E, 5943: 0x8E61, 5944: 0x8E62, 5945: 0x8E69, 5946: 0x8E6C, 5947: 0x8E6D, 5948: 0x8E6F, 5949: 0x8E70, 5950: 0x8E71, 5951: 0x8E79, 5952: 0x8E7A, 5953: 0x8E7B, 5954: 0x8E82, 5955: 0x8E83, 5956: 0x8E89, 5957: 0x8E90, 5958: 0x8E92, 5959: 0x8E95, 5960: 0x8E9A, 5961: 0x8E9B, 5962: 0x8E9D, 5963: 0x8E9E, 5964: 0x8EA2, 5965: 0x8EA7, 5966: 0x8EA9, 5967: 0x8EAD, 5968: 0x8EAE, 5969: 0x8EB3, 5970: 0x8EB5, 5971: 0x8EBA, 5972: 0x8EBB, 5973: 0x8EC0, 5974: 0x8EC1, 5975: 0x8EC3, 5976: 0x8EC4, 5977: 0x8EC7, 5978: 0x8ECF, 5979: 0x8ED1, 5980: 0x8ED4, 5981: 0x8EDC, 5982: 0x8EE8, 5983: 0x8EEE, 5984: 0x8EF0, 5985: 0x8EF1, 5986: 0x8EF7, 5987: 0x8EF9, 5988: 0x8EFA, 5989: 0x8EED, 5990: 0x8F00, 5991: 0x8F02, 5992: 0x8F07, 5993: 0x8F08, 5994: 0x8F0F, 5995: 0x8F10, 5996: 0x8F16, 5997: 0x8F17, 5998: 0x8F18, 5999: 0x8F1E, 6000: 0x8F20, 6001: 0x8F21, 6002: 0x8F23, 6003: 0x8F25, 6004: 0x8F27, 6005: 0x8F28, 6006: 0x8F2C, 6007: 0x8F2D, 6008: 0x8F2E, 6009: 0x8F34, 6010: 0x8F35, 6011: 0x8F36, 6012: 0x8F37, 6013: 0x8F3A, 6014: 0x8F40, 6015: 0x8F41, 6016: 0x8F43, 6017: 0x8F47, 6018: 0x8F4F, 6019: 0x8F51, 6020: 0x8F52, 6021: 0x8F53, 6022: 0x8F54, 6023: 0x8F55, 6024: 0x8F58, 6025: 0x8F5D, 6026: 0x8F5E, 6027: 0x8F65, 6028: 0x8F9D, 6029: 0x8FA0, 6030: 0x8FA1, 6031: 0x8FA4, 6032: 0x8FA5, 6033: 0x8FA6, 6034: 0x8FB5, 6035: 0x8FB6, 6036: 0x8FB8, 6037: 0x8FBE, 6038: 0x8FC0, 6039: 0x8FC1, 6040: 0x8FC6, 6041: 0x8FCA, 6042: 0x8FCB, 6043: 0x8FCD, 6044: 0x8FD0, 6045: 0x8FD2, 6046: 0x8FD3, 6047: 0x8FD5, 6048: 0x8FE0, 6049: 0x8FE3, 6050: 0x8FE4, 6051: 0x8FE8, 6052: 0x8FEE, 6053: 0x8FF1, 6054: 0x8FF5, 6055: 0x8FF6, 6056: 0x8FFB, 6057: 0x8FFE, 6058: 0x9002, 6059: 0x9004, 6060: 0x9008, 6061: 0x900C, 6062: 0x9018, 6063: 0x901B, 6064: 0x9028, 6065: 0x9029, 6066: 0x902F, 6067: 0x902A, 6068: 0x902C, 6069: 0x902D, 6070: 0x9033, 6071: 0x9034, 6072: 0x9037, 6073: 0x903F, 6074: 0x9043, 6075: 0x9044, 6076: 0x904C, 6077: 0x905B, 6078: 0x905D, 6079: 0x9062, 6080: 0x9066, 6081: 0x9067, 6082: 0x906C, 6083: 0x9070, 6084: 0x9074, 6085: 0x9079, 6086: 0x9085, 6087: 0x9088, 6088: 0x908B, 6089: 0x908C, 6090: 0x908E, 6091: 0x9090, 6092: 0x9095, 6093: 0x9097, 6094: 0x9098, 6095: 0x9099, 6096: 0x909B, 6097: 0x90A0, 6098: 0x90A1, 6099: 0x90A2, 6100: 0x90A5, 6101: 0x90B0, 6102: 0x90B2, 6103: 0x90B3, 6104: 0x90B4, 6105: 0x90B6, 6106: 0x90BD, 6107: 0x90CC, 6108: 0x90BE, 6109: 0x90C3, 6110: 0x90C4, 6111: 0x90C5, 6112: 0x90C7, 6113: 0x90C8, 6114: 0x90D5, 6115: 0x90D7, 6116: 0x90D8, 6117: 0x90D9, 6118: 0x90DC, 6119: 0x90DD, 6120: 0x90DF, 6121: 0x90E5, 6122: 0x90D2, 6123: 0x90F6, 6124: 0x90EB, 6125: 0x90EF, 6126: 0x90F0, 6127: 0x90F4, 6128: 0x90FE, 6129: 0x90FF, 6130: 0x9100, 6131: 0x9104, 6132: 0x9105, 6133: 0x9106, 6134: 0x9108, 6135: 0x910D, 6136: 0x9110, 6137: 0x9114, 6138: 0x9116, 6139: 0x9117, 6140: 0x9118, 6141: 0x911A, 6142: 0x911C, 6143: 0x911E, 6144: 0x9120, 6145: 0x9125, 6146: 0x9122, 6147: 0x9123, 6148: 0x9127, 6149: 0x9129, 6150: 0x912E, 6151: 0x912F, 6152: 0x9131, 6153: 0x9134, 6154: 0x9136, 6155: 0x9137, 6156: 0x9139, 6157: 0x913A, 6158: 0x913C, 6159: 0x913D, 6160: 0x9143, 6161: 0x9147, 6162: 0x9148, 6163: 0x914F, 6164: 0x9153, 6165: 0x9157, 6166: 0x9159, 6167: 0x915A, 6168: 0x915B, 6169: 0x9161, 6170: 0x9164, 6171: 0x9167, 6172: 0x916D, 6173: 0x9174, 6174: 0x9179, 6175: 0x917A, 6176: 0x917B, 6177: 0x9181, 6178: 0x9183, 6179: 0x9185, 6180: 0x9186, 6181: 0x918A, 6182: 0x918E, 6183: 0x9191, 6184: 0x9193, 6185: 0x9194, 6186: 0x9195, 6187: 0x9198, 6188: 0x919E, 6189: 0x91A1, 6190: 0x91A6, 6191: 0x91A8, 6192: 0x91AC, 6193: 0x91AD, 6194: 0x91AE, 6195: 0x91B0, 6196: 0x91B1, 6197: 0x91B2, 6198: 0x91B3, 6199: 0x91B6, 6200: 0x91BB, 6201: 0x91BC, 6202: 0x91BD, 6203: 0x91BF, 6204: 0x91C2, 6205: 0x91C3, 6206: 0x91C5, 6207: 0x91D3, 6208: 0x91D4, 6209: 0x91D7, 6210: 0x91D9, 6211: 0x91DA, 6212: 0x91DE, 6213: 0x91E4, 6214: 0x91E5, 6215: 0x91E9, 6216: 0x91EA, 6217: 0x91EC, 6218: 0x91ED, 6219: 0x91EE, 6220: 0x91EF, 6221: 0x91F0, 6222: 0x91F1, 6223: 0x91F7, 6224: 0x91F9, 6225: 0x91FB, 6226: 0x91FD, 6227: 0x9200, 6228: 0x9201, 6229: 0x9204, 6230: 0x9205, 6231: 0x9206, 6232: 0x9207, 6233: 0x9209, 6234: 0x920A, 6235: 0x920C, 6236: 0x9210, 6237: 0x9212, 6238: 0x9213, 6239: 0x9216, 6240: 0x9218, 6241: 0x921C, 6242: 0x921D, 6243: 0x9223, 6244: 0x9224, 6245: 0x9225, 6246: 0x9226, 6247: 0x9228, 6248: 0x922E, 6249: 0x922F, 6250: 0x9230, 6251: 0x9233, 6252: 0x9235, 6253: 0x9236, 6254: 0x9238, 6255: 0x9239, 6256: 0x923A, 6257: 0x923C, 6258: 0x923E, 6259: 0x9240, 6260: 0x9242, 6261: 0x9243, 6262: 0x9246, 6263: 0x9247, 6264: 0x924A, 6265: 0x924D, 6266: 0x924E, 6267: 0x924F, 6268: 0x9251, 6269: 0x9258, 6270: 0x9259, 6271: 0x925C, 6272: 0x925D, 6273: 0x9260, 6274: 0x9261, 6275: 0x9265, 6276: 0x9267, 6277: 0x9268, 6278: 0x9269, 6279: 0x926E, 6280: 0x926F, 6281: 0x9270, 6282: 0x9275, 6283: 0x9276, 6284: 0x9277, 6285: 0x9278, 6286: 0x9279, 6287: 0x927B, 6288: 0x927C, 6289: 0x927D, 6290: 0x927F, 6291: 0x9288, 6292: 0x9289, 6293: 0x928A, 6294: 0x928D, 6295: 0x928E, 6296: 0x9292, 6297: 0x9297, 6298: 0x9299, 6299: 0x929F, 6300: 0x92A0, 6301: 0x92A4, 6302: 0x92A5, 6303: 0x92A7, 6304: 0x92A8, 6305: 0x92AB, 6306: 0x92AF, 6307: 0x92B2, 6308: 0x92B6, 6309: 0x92B8, 6310: 0x92BA, 6311: 0x92BB, 6312: 0x92BC, 6313: 0x92BD, 6314: 0x92BF, 6315: 0x92C0, 6316: 0x92C1, 6317: 0x92C2, 6318: 0x92C3, 6319: 0x92C5, 6320: 0x92C6, 6321: 0x92C7, 6322: 0x92C8, 6323: 0x92CB, 6324: 0x92CC, 6325: 0x92CD, 6326: 0x92CE, 6327: 0x92D0, 6328: 0x92D3, 6329: 0x92D5, 6330: 0x92D7, 6331: 0x92D8, 6332: 0x92D9, 6333: 0x92DC, 6334: 0x92DD, 6335: 0x92DF, 6336: 0x92E0, 6337: 0x92E1, 6338: 0x92E3, 6339: 0x92E5, 6340: 0x92E7, 6341: 0x92E8, 6342: 0x92EC, 6343: 0x92EE, 6344: 0x92F0, 6345: 0x92F9, 6346: 0x92FB, 6347: 0x92FF, 6348: 0x9300, 6349: 0x9302, 6350: 0x9308, 6351: 0x930D, 6352: 0x9311, 6353: 0x9314, 6354: 0x9315, 6355: 0x931C, 6356: 0x931D, 6357: 0x931E, 6358: 0x931F, 6359: 0x9321, 6360: 0x9324, 6361: 0x9325, 6362: 0x9327, 6363: 0x9329, 6364: 0x932A, 6365: 0x9333, 6366: 0x9334, 6367: 0x9336, 6368: 0x9337, 6369: 0x9347, 6370: 0x9348, 6371: 0x9349, 6372: 0x9350, 6373: 0x9351, 6374: 0x9352, 6375: 0x9355, 6376: 0x9357, 6377: 0x9358, 6378: 0x935A, 6379: 0x935E, 6380: 0x9364, 6381: 0x9365, 6382: 0x9367, 6383: 0x9369, 6384: 0x936A, 6385: 0x936D, 6386: 0x936F, 6387: 0x9370, 6388: 0x9371, 6389: 0x9373, 6390: 0x9374, 6391: 0x9376, 6392: 0x937A, 6393: 0x937D, 6394: 0x937F, 6395: 0x9380, 6396: 0x9381, 6397: 0x9382, 6398: 0x9388, 6399: 0x938A, 6400: 0x938B, 6401: 0x938D, 6402: 0x938F, 6403: 0x9392, 6404: 0x9395, 6405: 0x9398, 6406: 0x939B, 6407: 0x939E, 6408: 0x93A1, 6409: 0x93A3, 6410: 0x93A4, 6411: 0x93A6, 6412: 0x93A8, 6413: 0x93AB, 6414: 0x93B4, 6415: 0x93B5, 6416: 0x93B6, 6417: 0x93BA, 6418: 0x93A9, 6419: 0x93C1, 6420: 0x93C4, 6421: 0x93C5, 6422: 0x93C6, 6423: 0x93C7, 6424: 0x93C9, 6425: 0x93CA, 6426: 0x93CB, 6427: 0x93CC, 6428: 0x93CD, 6429: 0x93D3, 6430: 0x93D9, 6431: 0x93DC, 6432: 0x93DE, 6433: 0x93DF, 6434: 0x93E2, 6435: 0x93E6, 6436: 0x93E7, 6437: 0x93F9, 6438: 0x93F7, 6439: 0x93F8, 6440: 0x93FA, 6441: 0x93FB, 6442: 0x93FD, 6443: 0x9401, 6444: 0x9402, 6445: 0x9404, 6446: 0x9408, 6447: 0x9409, 6448: 0x940D, 6449: 0x940E, 6450: 0x940F, 6451: 0x9415, 6452: 0x9416, 6453: 0x9417, 6454: 0x941F, 6455: 0x942E, 6456: 0x942F, 6457: 0x9431, 6458: 0x9432, 6459: 0x9433, 6460: 0x9434, 6461: 0x943B, 6462: 0x943F, 6463: 0x943D, 6464: 0x9443, 6465: 0x9445, 6466: 0x9448, 6467: 0x944A, 6468: 0x944C, 6469: 0x9455, 6470: 0x9459, 6471: 0x945C, 6472: 0x945F, 6473: 0x9461, 6474: 0x9463, 6475: 0x9468, 6476: 0x946B, 6477: 0x946D, 6478: 0x946E, 6479: 0x946F, 6480: 0x9471, 6481: 0x9472, 6482: 0x9484, 6483: 0x9483, 6484: 0x9578, 6485: 0x9579, 6486: 0x957E, 6487: 0x9584, 6488: 0x9588, 6489: 0x958C, 6490: 0x958D, 6491: 0x958E, 6492: 0x959D, 6493: 0x959E, 6494: 0x959F, 6495: 0x95A1, 6496: 0x95A6, 6497: 0x95A9, 6498: 0x95AB, 6499: 0x95AC, 6500: 0x95B4, 6501: 0x95B6, 6502: 0x95BA, 6503: 0x95BD, 6504: 0x95BF, 6505: 0x95C6, 6506: 0x95C8, 6507: 0x95C9, 6508: 0x95CB, 6509: 0x95D0, 6510: 0x95D1, 6511: 0x95D2, 6512: 0x95D3, 6513: 0x95D9, 6514: 0x95DA, 6515: 0x95DD, 6516: 0x95DE, 6517: 0x95DF, 6518: 0x95E0, 6519: 0x95E4, 6520: 0x95E6, 6521: 0x961D, 6522: 0x961E, 6523: 0x9622, 6524: 0x9624, 6525: 0x9625, 6526: 0x9626, 6527: 0x962C, 6528: 0x9631, 6529: 0x9633, 6530: 0x9637, 6531: 0x9638, 6532: 0x9639, 6533: 0x963A, 6534: 0x963C, 6535: 0x963D, 6536: 0x9641, 6537: 0x9652, 6538: 0x9654, 6539: 0x9656, 6540: 0x9657, 6541: 0x9658, 6542: 0x9661, 6543: 0x966E, 6544: 0x9674, 6545: 0x967B, 6546: 0x967C, 6547: 0x967E, 6548: 0x967F, 6549: 0x9681, 6550: 0x9682, 6551: 0x9683, 6552: 0x9684, 6553: 0x9689, 6554: 0x9691, 6555: 0x9696, 6556: 0x969A, 6557: 0x969D, 6558: 0x969F, 6559: 0x96A4, 6560: 0x96A5, 6561: 0x96A6, 6562: 0x96A9, 6563: 0x96AE, 6564: 0x96AF, 6565: 0x96B3, 6566: 0x96BA, 6567: 0x96CA, 6568: 0x96D2, 6569: 0x5DB2, 6570: 0x96D8, 6571: 0x96DA, 6572: 0x96DD, 6573: 0x96DE, 6574: 0x96DF, 6575: 0x96E9, 6576: 0x96EF, 6577: 0x96F1, 6578: 0x96FA, 6579: 0x9702, 6580: 0x9703, 6581: 0x9705, 6582: 0x9709, 6583: 0x971A, 6584: 0x971B, 6585: 0x971D, 6586: 0x9721, 6587: 0x9722, 6588: 0x9723, 6589: 0x9728, 6590: 0x9731, 6591: 0x9733, 6592: 0x9741, 6593: 0x9743, 6594: 0x974A, 6595: 0x974E, 6596: 0x974F, 6597: 0x9755, 6598: 0x9757, 6599: 0x9758, 6600: 0x975A, 6601: 0x975B, 6602: 0x9763, 6603: 0x9767, 6604: 0x976A, 6605: 0x976E, 6606: 0x9773, 6607: 0x9776, 6608: 0x9777, 6609: 0x9778, 6610: 0x977B, 6611: 0x977D, 6612: 0x977F, 6613: 0x9780, 6614: 0x9789, 6615: 0x9795, 6616: 0x9796, 6617: 0x9797, 6618: 0x9799, 6619: 0x979A, 6620: 0x979E, 6621: 0x979F, 6622: 0x97A2, 6623: 0x97AC, 6624: 0x97AE, 6625: 0x97B1, 6626: 0x97B2, 6627: 0x97B5, 6628: 0x97B6, 6629: 0x97B8, 6630: 0x97B9, 6631: 0x97BA, 6632: 0x97BC, 6633: 0x97BE, 6634: 0x97BF, 6635: 0x97C1, 6636: 0x97C4, 6637: 0x97C5, 6638: 0x97C7, 6639: 0x97C9, 6640: 0x97CA, 6641: 0x97CC, 6642: 0x97CD, 6643: 0x97CE, 6644: 0x97D0, 6645: 0x97D1, 6646: 0x97D4, 6647: 0x97D7, 6648: 0x97D8, 6649: 0x97D9, 6650: 0x97DD, 6651: 0x97DE, 6652: 0x97E0, 6653: 0x97DB, 6654: 0x97E1, 6655: 0x97E4, 6656: 0x97EF, 6657: 0x97F1, 6658: 0x97F4, 6659: 0x97F7, 6660: 0x97F8, 6661: 0x97FA, 6662: 0x9807, 6663: 0x980A, 6664: 0x9819, 6665: 0x980D, 6666: 0x980E, 6667: 0x9814, 6668: 0x9816, 6669: 0x981C, 6670: 0x981E, 6671: 0x9820, 6672: 0x9823, 6673: 0x9826, 6674: 0x982B, 6675: 0x982E, 6676: 0x982F, 6677: 0x9830, 6678: 0x9832, 6679: 0x9833, 6680: 0x9835, 6681: 0x9825, 6682: 0x983E, 6683: 0x9844, 6684: 0x9847, 6685: 0x984A, 6686: 0x9851, 6687: 0x9852, 6688: 0x9853, 6689: 0x9856, 6690: 0x9857, 6691: 0x9859, 6692: 0x985A, 6693: 0x9862, 6694: 0x9863, 6695: 0x9865, 6696: 0x9866, 6697: 0x986A, 6698: 0x986C, 6699: 0x98AB, 6700: 0x98AD, 6701: 0x98AE, 6702: 0x98B0, 6703: 0x98B4, 6704: 0x98B7, 6705: 0x98B8, 6706: 0x98BA, 6707: 0x98BB, 6708: 0x98BF, 6709: 0x98C2, 6710: 0x98C5, 6711: 0x98C8, 6712: 0x98CC, 6713: 0x98E1, 6714: 0x98E3, 6715: 0x98E5, 6716: 0x98E6, 6717: 0x98E7, 6718: 0x98EA, 6719: 0x98F3, 6720: 0x98F6, 6721: 0x9902, 6722: 0x9907, 6723: 0x9908, 6724: 0x9911, 6725: 0x9915, 6726: 0x9916, 6727: 0x9917, 6728: 0x991A, 6729: 0x991B, 6730: 0x991C, 6731: 0x991F, 6732: 0x9922, 6733: 0x9926, 6734: 0x9927, 6735: 0x992B, 6736: 0x9931, 6737: 0x9932, 6738: 0x9933, 6739: 0x9934, 6740: 0x9935, 6741: 0x9939, 6742: 0x993A, 6743: 0x993B, 6744: 0x993C, 6745: 0x9940, 6746: 0x9941, 6747: 0x9946, 6748: 0x9947, 6749: 0x9948, 6750: 0x994D, 6751: 0x994E, 6752: 0x9954, 6753: 0x9958, 6754: 0x9959, 6755: 0x995B, 6756: 0x995C, 6757: 0x995E, 6758: 0x995F, 6759: 0x9960, 6760: 0x999B, 6761: 0x999D, 6762: 0x999F, 6763: 0x99A6, 6764: 0x99B0, 6765: 0x99B1, 6766: 0x99B2, 6767: 0x99B5, 6768: 0x99B9, 6769: 0x99BA, 6770: 0x99BD, 6771: 0x99BF, 6772: 0x99C3, 6773: 0x99C9, 6774: 0x99D3, 6775: 0x99D4, 6776: 0x99D9, 6777: 0x99DA, 6778: 0x99DC, 6779: 0x99DE, 6780: 0x99E7, 6781: 0x99EA, 6782: 0x99EB, 6783: 0x99EC, 6784: 0x99F0, 6785: 0x99F4, 6786: 0x99F5, 6787: 0x99F9, 6788: 0x99FD, 6789: 0x99FE, 6790: 0x9A02, 6791: 0x9A03, 6792: 0x9A04, 6793: 0x9A0B, 6794: 0x9A0C, 6795: 0x9A10, 6796: 0x9A11, 6797: 0x9A16, 6798: 0x9A1E, 6799: 0x9A20, 6800: 0x9A22, 6801: 0x9A23, 6802: 0x9A24, 6803: 0x9A27, 6804: 0x9A2D, 6805: 0x9A2E, 6806: 0x9A33, 6807: 0x9A35, 6808: 0x9A36, 6809: 0x9A38, 6810: 0x9A47, 6811: 0x9A41, 6812: 0x9A44, 6813: 0x9A4A, 6814: 0x9A4B, 6815: 0x9A4C, 6816: 0x9A4E, 6817: 0x9A51, 6818: 0x9A54, 6819: 0x9A56, 6820: 0x9A5D, 6821: 0x9AAA, 6822: 0x9AAC, 6823: 0x9AAE, 6824: 0x9AAF, 6825: 0x9AB2, 6826: 0x9AB4, 6827: 0x9AB5, 6828: 0x9AB6, 6829: 0x9AB9, 6830: 0x9ABB, 6831: 0x9ABE, 6832: 0x9ABF, 6833: 0x9AC1, 6834: 0x9AC3, 6835: 0x9AC6, 6836: 0x9AC8, 6837: 0x9ACE, 6838: 0x9AD0, 6839: 0x9AD2, 6840: 0x9AD5, 6841: 0x9AD6, 6842: 0x9AD7, 6843: 0x9ADB, 6844: 0x9ADC, 6845: 0x9AE0, 6846: 0x9AE4, 6847: 0x9AE5, 6848: 0x9AE7, 6849: 0x9AE9, 6850: 0x9AEC, 6851: 0x9AF2, 6852: 0x9AF3, 6853: 0x9AF5, 6854: 0x9AF9, 6855: 0x9AFA, 6856: 0x9AFD, 6857: 0x9AFF, 6858: 0x9B00, 6859: 0x9B01, 6860: 0x9B02, 6861: 0x9B03, 6862: 0x9B04, 6863: 0x9B05, 6864: 0x9B08, 6865: 0x9B09, 6866: 0x9B0B, 6867: 0x9B0C, 6868: 0x9B0D, 6869: 0x9B0E, 6870: 0x9B10, 6871: 0x9B12, 6872: 0x9B16, 6873: 0x9B19, 6874: 0x9B1B, 6875: 0x9B1C, 6876: 0x9B20, 6877: 0x9B26, 6878: 0x9B2B, 6879: 0x9B2D, 6880: 0x9B33, 6881: 0x9B34, 6882: 0x9B35, 6883: 0x9B37, 6884: 0x9B39, 6885: 0x9B3A, 6886: 0x9B3D, 6887: 0x9B48, 6888: 0x9B4B, 6889: 0x9B4C, 6890: 0x9B55, 6891: 0x9B56, 6892: 0x9B57, 6893: 0x9B5B, 6894: 0x9B5E, 6895: 0x9B61, 6896: 0x9B63, 6897: 0x9B65, 6898: 0x9B66, 6899: 0x9B68, 6900: 0x9B6A, 6901: 0x9B6B, 6902: 0x9B6C, 6903: 0x9B6D, 6904: 0x9B6E, 6905: 0x9B73, 6906: 0x9B75, 6907: 0x9B77, 6908: 0x9B78, 6909: 0x9B79, 6910: 0x9B7F, 6911: 0x9B80, 6912: 0x9B84, 6913: 0x9B85, 6914: 0x9B86, 6915: 0x9B87, 6916: 0x9B89, 6917: 0x9B8A, 6918: 0x9B8B, 6919: 0x9B8D, 6920: 0x9B8F, 6921: 0x9B90, 6922: 0x9B94, 6923: 0x9B9A, 6924: 0x9B9D, 6925: 0x9B9E, 6926: 0x9BA6, 6927: 0x9BA7, 6928: 0x9BA9, 6929: 0x9BAC, 6930: 0x9BB0, 6931: 0x9BB1, 6932: 0x9BB2, 6933: 0x9BB7, 6934: 0x9BB8, 6935: 0x9BBB, 6936: 0x9BBC, 6937: 0x9BBE, 6938: 0x9BBF, 6939: 0x9BC1, 6940: 0x9BC7, 6941: 0x9BC8, 6942: 0x9BCE, 6943: 0x9BD0, 6944: 0x9BD7, 6945: 0x9BD8, 6946: 0x9BDD, 6947: 0x9BDF, 6948: 0x9BE5, 6949: 0x9BE7, 6950: 0x9BEA, 6951: 0x9BEB, 6952: 0x9BEF, 6953: 0x9BF3, 6954: 0x9BF7, 6955: 0x9BF8, 6956: 0x9BF9, 6957: 0x9BFA, 6958: 0x9BFD, 6959: 0x9BFF, 6960: 0x9C00, 6961: 0x9C02, 6962: 0x9C0B, 6963: 0x9C0F, 6964: 0x9C11, 6965: 0x9C16, 6966: 0x9C18, 6967: 0x9C19, 6968: 0x9C1A, 6969: 0x9C1C, 6970: 0x9C1E, 6971: 0x9C22, 6972: 0x9C23, 6973: 0x9C26, 6974: 0x9C27, 6975: 0x9C28, 6976: 0x9C29, 6977: 0x9C2A, 6978: 0x9C31, 6979: 0x9C35, 6980: 0x9C36, 6981: 0x9C37, 6982: 0x9C3D, 6983: 0x9C41, 6984: 0x9C43, 6985: 0x9C44, 6986: 0x9C45, 6987: 0x9C49, 6988: 0x9C4A, 6989: 0x9C4E, 6990: 0x9C4F, 6991: 0x9C50, 6992: 0x9C53, 6993: 0x9C54, 6994: 0x9C56, 6995: 0x9C58, 6996: 0x9C5B, 6997: 0x9C5D, 6998: 0x9C5E, 6999: 0x9C5F, 7000: 0x9C63, 7001: 0x9C69, 7002: 0x9C6A, 7003: 0x9C5C, 7004: 0x9C6B, 7005: 0x9C68, 7006: 0x9C6E, 7007: 0x9C70, 7008: 0x9C72, 7009: 0x9C75, 7010: 0x9C77, 7011: 0x9C7B, 7012: 0x9CE6, 7013: 0x9CF2, 7014: 0x9CF7, 7015: 0x9CF9, 7016: 0x9D0B, 7017: 0x9D02, 7018: 0x9D11, 7019: 0x9D17, 7020: 0x9D18, 7021: 0x9D1C, 7022: 0x9D1D, 7023: 0x9D1E, 7024: 0x9D2F, 7025: 0x9D30, 7026: 0x9D32, 7027: 0x9D33, 7028: 0x9D34, 7029: 0x9D3A, 7030: 0x9D3C, 7031: 0x9D45, 7032: 0x9D3D, 7033: 0x9D42, 7034: 0x9D43, 7035: 0x9D47, 7036: 0x9D4A, 7037: 0x9D53, 7038: 0x9D54, 7039: 0x9D5F, 7040: 0x9D63, 7041: 0x9D62, 7042: 0x9D65, 7043: 0x9D69, 7044: 0x9D6A, 7045: 0x9D6B, 7046: 0x9D70, 7047: 0x9D76, 7048: 0x9D77, 7049: 0x9D7B, 7050: 0x9D7C, 7051: 0x9D7E, 7052: 0x9D83, 7053: 0x9D84, 7054: 0x9D86, 7055: 0x9D8A, 7056: 0x9D8D, 7057: 0x9D8E, 7058: 0x9D92, 7059: 0x9D93, 7060: 0x9D95, 7061: 0x9D96, 7062: 0x9D97, 7063: 0x9D98, 7064: 0x9DA1, 7065: 0x9DAA, 7066: 0x9DAC, 7067: 0x9DAE, 7068: 0x9DB1, 7069: 0x9DB5, 7070: 0x9DB9, 7071: 0x9DBC, 7072: 0x9DBF, 7073: 0x9DC3, 7074: 0x9DC7, 7075: 0x9DC9, 7076: 0x9DCA, 7077: 0x9DD4, 7078: 0x9DD5, 7079: 0x9DD6, 7080: 0x9DD7, 7081: 0x9DDA, 7082: 0x9DDE, 7083: 0x9DDF, 7084: 0x9DE0, 7085: 0x9DE5, 7086: 0x9DE7, 7087: 0x9DE9, 7088: 0x9DEB, 7089: 0x9DEE, 7090: 0x9DF0, 7091: 0x9DF3, 7092: 0x9DF4, 7093: 0x9DFE, 7094: 0x9E0A, 7095: 0x9E02, 7096: 0x9E07, 7097: 0x9E0E, 7098: 0x9E10, 7099: 0x9E11, 7100: 0x9E12, 7101: 0x9E15, 7102: 0x9E16, 7103: 0x9E19, 7104: 0x9E1C, 7105: 0x9E1D, 7106: 0x9E7A, 7107: 0x9E7B, 7108: 0x9E7C, 7109: 0x9E80, 7110: 0x9E82, 7111: 0x9E83, 7112: 0x9E84, 7113: 0x9E85, 7114: 0x9E87, 7115: 0x9E8E, 7116: 0x9E8F, 7117: 0x9E96, 7118: 0x9E98, 7119: 0x9E9B, 7120: 0x9E9E, 7121: 0x9EA4, 7122: 0x9EA8, 7123: 0x9EAC, 7124: 0x9EAE, 7125: 0x9EAF, 7126: 0x9EB0, 7127: 0x9EB3, 7128: 0x9EB4, 7129: 0x9EB5, 7130: 0x9EC6, 7131: 0x9EC8, 7132: 0x9ECB, 7133: 0x9ED5, 7134: 0x9EDF, 7135: 0x9EE4, 7136: 0x9EE7, 7137: 0x9EEC, 7138: 0x9EED, 7139: 0x9EEE, 7140: 0x9EF0, 7141: 0x9EF1, 7142: 0x9EF2, 7143: 0x9EF5, 7144: 0x9EF8, 7145: 0x9EFF, 7146: 0x9F02, 7147: 0x9F03, 7148: 0x9F09, 7149: 0x9F0F, 7150: 0x9F10, 7151: 0x9F11, 7152: 0x9F12, 7153: 0x9F14, 7154: 0x9F16, 7155: 0x9F17, 7156: 0x9F19, 7157: 0x9F1A, 7158: 0x9F1B, 7159: 0x9F1F, 7160: 0x9F22, 7161: 0x9F26, 7162: 0x9F2A, 7163: 0x9F2B, 7164: 0x9F2F, 7165: 0x9F31, 7166: 0x9F32, 7167: 0x9F34, 7168: 0x9F37, 7169: 0x9F39, 7170: 0x9F3A, 7171: 0x9F3C, 7172: 0x9F3D, 7173: 0x9F3F, 7174: 0x9F41, 7175: 0x9F43, 7176: 0x9F44, 7177: 0x9F45, 7178: 0x9F46, 7179: 0x9F47, 7180: 0x9F53, 7181: 0x9F55, 7182: 0x9F56, 7183: 0x9F57, 7184: 0x9F58, 7185: 0x9F5A, 7186: 0x9F5D, 7187: 0x9F5E, 7188: 0x9F68, 7189: 0x9F69, 7190: 0x9F6D, 7191: 0x9F6E, 7192: 0x9F6F, 7193: 0x9F70, 7194: 0x9F71, 7195: 0x9F73, 7196: 0x9F75, 7197: 0x9F7A, 7198: 0x9F7D, 7199: 0x9F8F, 7200: 0x9F90, 7201: 0x9F91, 7202: 0x9F92, 7203: 0x9F94, 7204: 0x9F96, 7205: 0x9F97, 7206: 0x9F9E, 7207: 0x9FA1, 7208: 0x9FA2, 7209: 0x9FA3, 7210: 0x9FA5, } const ( jis0208 = 1 jis0212 = 2 codeMask = 0x7f codeShift = 7 tableShift = 14 ) const numEncodeTables = 6 // encodeX are the encoding tables from Unicode to JIS code, // sorted by decreasing length. // encode0: 20902 entries for runes in [19968, 40870). // encode1: 1632 entries for runes in [ 8208, 9840). // encode2: 974 entries for runes in [12288, 13262). // encode3: 959 entries for runes in [ 161, 1120). // encode4: 261 entries for runes in [63785, 64046). // encode5: 229 entries for runes in [65281, 65510). // // The high two bits of the value record whether the JIS code comes from the // JIS0208 table (high bits == 1) or the JIS0212 table (high bits == 2). // The low 14 bits are two 7-bit unsigned integers j1 and j2 that form the // JIS code (94*j1 + j2) within that table. const encode0Low, encode0High = 19968, 40870 var encode0 = [...]uint16{ 19968 - 19968: jis0208<<14 | 0x0F<<7 | 0x4B, 19969 - 19968: jis0208<<14 | 0x22<<7 | 0x59, 19970 - 19968: jis0212<<14 | 0x0F<<7 | 0x00, 19971 - 19968: jis0208<<14 | 0x1B<<7 | 0x16, 19972 - 19968: jis0212<<14 | 0x0F<<7 | 0x01, 19973 - 19968: jis0212<<14 | 0x0F<<7 | 0x02, 19975 - 19968: jis0208<<14 | 0x2A<<7 | 0x5B, 19976 - 19968: jis0208<<14 | 0x1D<<7 | 0x45, 19977 - 19968: jis0208<<14 | 0x1A<<7 | 0x0F, 19978 - 19968: jis0208<<14 | 0x1D<<7 | 0x44, 19979 - 19968: jis0208<<14 | 0x11<<7 | 0x1B, 19980 - 19968: jis0212<<14 | 0x0F<<7 | 0x03, 19981 - 19968: jis0208<<14 | 0x28<<7 | 0x33, 19982 - 19968: jis0208<<14 | 0x2C<<7 | 0x1E, 19984 - 19968: jis0208<<14 | 0x2F<<7 | 0x01, 19985 - 19968: jis0208<<14 | 0x10<<7 | 0x0E, 19986 - 19968: jis0212<<14 | 0x0F<<7 | 0x04, 19988 - 19968: jis0208<<14 | 0x12<<7 | 0x4D, 19989 - 19968: jis0208<<14 | 0x2F<<7 | 0x02, 19990 - 19968: jis0208<<14 | 0x1F<<7 | 0x03, 19991 - 19968: jis0208<<14 | 0x31<<7 | 0x21, 19992 - 19968: jis0208<<14 | 0x14<<7 | 0x35, 19993 - 19968: jis0208<<14 | 0x29<<7 | 0x19, 19998 - 19968: jis0208<<14 | 0x1D<<7 | 0x46, 19999 - 19968: jis0212<<14 | 0x0F<<7 | 0x05, 20001 - 19968: jis0208<<14 | 0x2D<<7 | 0x1D, 20003 - 19968: jis0212<<14 | 0x0F<<7 | 0x06, 20004 - 19968: jis0212<<14 | 0x0F<<7 | 0x07, 20006 - 19968: jis0208<<14 | 0x29<<7 | 0x21, 20008 - 19968: jis0208<<14 | 0x58<<7 | 0x0C, 20010 - 19968: jis0208<<14 | 0x2F<<7 | 0x03, 20011 - 19968: jis0212<<14 | 0x0F<<7 | 0x09, 20013 - 19968: jis0208<<14 | 0x22<<7 | 0x45, 20014 - 19968: jis0212<<14 | 0x0F<<7 | 0x0A, 20015 - 19968: jis0212<<14 | 0x0F<<7 | 0x0B, 20016 - 19968: jis0212<<14 | 0x0F<<7 | 0x0C, 20017 - 19968: jis0208<<14 | 0x2F<<7 | 0x04, 20018 - 19968: jis0208<<14 | 0x15<<7 | 0x59, 20021 - 19968: jis0212<<14 | 0x0F<<7 | 0x0D, 20022 - 19968: jis0208<<14 | 0x2F<<7 | 0x05, 20024 - 19968: jis0208<<14 | 0x13<<7 | 0x3C, 20025 - 19968: jis0208<<14 | 0x22<<7 | 0x0F, 20027 - 19968: jis0208<<14 | 0x1B<<7 | 0x46, 20028 - 19968: jis0208<<14 | 0x2F<<7 | 0x06, 20031 - 19968: jis0208<<14 | 0x2F<<7 | 0x07, 20032 - 19968: jis0212<<14 | 0x0F<<7 | 0x0E, 20033 - 19968: jis0212<<14 | 0x0F<<7 | 0x0F, 20034 - 19968: jis0208<<14 | 0x2F<<7 | 0x08, 20035 - 19968: jis0208<<14 | 0x26<<7 | 0x14, 20036 - 19968: jis0212<<14 | 0x0F<<7 | 0x10, 20037 - 19968: jis0208<<14 | 0x14<<7 | 0x36, 20039 - 19968: jis0212<<14 | 0x0F<<7 | 0x11, 20043 - 19968: jis0208<<14 | 0x26<<7 | 0x16, 20045 - 19968: jis0208<<14 | 0x25<<7 | 0x42, 20046 - 19968: jis0208<<14 | 0x17<<7 | 0x22, 20047 - 19968: jis0208<<14 | 0x2A<<7 | 0x12, 20049 - 19968: jis0212<<14 | 0x0F<<7 | 0x12, 20053 - 19968: jis0208<<14 | 0x48<<7 | 0x28, 20054 - 19968: jis0208<<14 | 0x2F<<7 | 0x09, 20055 - 19968: jis0208<<14 | 0x1D<<7 | 0x47, 20056 - 19968: jis0208<<14 | 0x2F<<7 | 0x0A, 20057 - 19968: jis0208<<14 | 0x11<<7 | 0x14, 20058 - 19968: jis0212<<14 | 0x0F<<7 | 0x13, 20060 - 19968: jis0212<<14 | 0x0F<<7 | 0x14, 20061 - 19968: jis0208<<14 | 0x15<<7 | 0x44, 20062 - 19968: jis0208<<14 | 0x17<<7 | 0x4F, 20063 - 19968: jis0208<<14 | 0x2B<<7 | 0x48, 20066 - 19968: jis0208<<14 | 0x35<<7 | 0x05, 20067 - 19968: jis0212<<14 | 0x0F<<7 | 0x15, 20072 - 19968: jis0212<<14 | 0x0F<<7 | 0x16, 20073 - 19968: jis0212<<14 | 0x0F<<7 | 0x17, 20081 - 19968: jis0208<<14 | 0x2C<<7 | 0x4F, 20083 - 19968: jis0208<<14 | 0x25<<7 | 0x5C, 20084 - 19968: jis0212<<14 | 0x0F<<7 | 0x18, 20085 - 19968: jis0212<<14 | 0x0F<<7 | 0x19, 20089 - 19968: jis0212<<14 | 0x0F<<7 | 0x1A, 20094 - 19968: jis0208<<14 | 0x13<<7 | 0x04, 20095 - 19968: jis0212<<14 | 0x0F<<7 | 0x1B, 20096 - 19968: jis0208<<14 | 0x14<<7 | 0x14, 20098 - 19968: jis0208<<14 | 0x2F<<7 | 0x0B, 20101 - 19968: jis0208<<14 | 0x2F<<7 | 0x0C, 20102 - 19968: jis0208<<14 | 0x2D<<7 | 0x1A, 20104 - 19968: jis0208<<14 | 0x2C<<7 | 0x1C, 20105 - 19968: jis0208<<14 | 0x20<<7 | 0x47, 20106 - 19968: jis0208<<14 | 0x2F<<7 | 0x0E, 20107 - 19968: jis0208<<14 | 0x1A<<7 | 0x55, 20108 - 19968: jis0208<<14 | 0x25<<7 | 0x52, 20109 - 19968: jis0212<<14 | 0x0F<<7 | 0x1C, 20110 - 19968: jis0208<<14 | 0x2F<<7 | 0x11, 20113 - 19968: jis0208<<14 | 0x10<<7 | 0x1D, 20114 - 19968: jis0208<<14 | 0x17<<7 | 0x3E, 20116 - 19968: jis0208<<14 | 0x17<<7 | 0x3D, 20117 - 19968: jis0208<<14 | 0x0F<<7 | 0x45, 20118 - 19968: jis0212<<14 | 0x0F<<7 | 0x1D, 20119 - 19968: jis0212<<14 | 0x0F<<7 | 0x1E, 20120 - 19968: jis0208<<14 | 0x2E<<7 | 0x2A, 20121 - 19968: jis0208<<14 | 0x2E<<7 | 0x29, 20123 - 19968: jis0208<<14 | 0x19<<7 | 0x12, 20124 - 19968: jis0208<<14 | 0x0F<<7 | 0x00, 20125 - 19968: jis0212<<14 | 0x0F<<7 | 0x1F, 20126 - 19968: jis0208<<14 | 0x2F<<7 | 0x12, 20127 - 19968: jis0208<<14 | 0x2F<<7 | 0x13, 20128 - 19968: jis0208<<14 | 0x2F<<7 | 0x14, 20129 - 19968: jis0208<<14 | 0x2A<<7 | 0x13, 20130 - 19968: jis0208<<14 | 0x2F<<7 | 0x15, 20132 - 19968: jis0208<<14 | 0x17<<7 | 0x51, 20133 - 19968: jis0208<<14 | 0x0F<<7 | 0x46, 20134 - 19968: jis0208<<14 | 0x2A<<7 | 0x51, 20136 - 19968: jis0208<<14 | 0x14<<7 | 0x5B, 20139 - 19968: jis0208<<14 | 0x14<<7 | 0x5C, 20140 - 19968: jis0208<<14 | 0x14<<7 | 0x5D, 20141 - 19968: jis0208<<14 | 0x23<<7 | 0x41, 20142 - 19968: jis0208<<14 | 0x2D<<7 | 0x1B, 20143 - 19968: jis0212<<14 | 0x0F<<7 | 0x20, 20144 - 19968: jis0208<<14 | 0x2F<<7 | 0x16, 20147 - 19968: jis0208<<14 | 0x2F<<7 | 0x17, 20150 - 19968: jis0208<<14 | 0x2F<<7 | 0x18, 20153 - 19968: jis0212<<14 | 0x0F<<7 | 0x21, 20154 - 19968: jis0208<<14 | 0x1E<<7 | 0x2C, 20160 - 19968: jis0208<<14 | 0x1C<<7 | 0x19, 20161 - 19968: jis0208<<14 | 0x1E<<7 | 0x2D, 20162 - 19968: jis0208<<14 | 0x2F<<7 | 0x1D, 20163 - 19968: jis0212<<14 | 0x0F<<7 | 0x22, 20164 - 19968: jis0208<<14 | 0x2F<<7 | 0x1B, 20166 - 19968: jis0208<<14 | 0x2F<<7 | 0x1C, 20167 - 19968: jis0208<<14 | 0x14<<7 | 0x37, 20170 - 19968: jis0208<<14 | 0x19<<7 | 0x02, 20171 - 19968: jis0208<<14 | 0x11<<7 | 0x4F, 20173 - 19968: jis0208<<14 | 0x2F<<7 | 0x1A, 20174 - 19968: jis0208<<14 | 0x2F<<7 | 0x19, 20175 - 19968: jis0208<<14 | 0x29<<7 | 0x08, 20176 - 19968: jis0212<<14 | 0x0F<<7 | 0x23, 20180 - 19968: jis0208<<14 | 0x1A<<7 | 0x25, 20181 - 19968: jis0208<<14 | 0x1A<<7 | 0x24, 20182 - 19968: jis0208<<14 | 0x21<<7 | 0x1D, 20183 - 19968: jis0208<<14 | 0x2F<<7 | 0x1E, 20184 - 19968: jis0208<<14 | 0x28<<7 | 0x34, 20185 - 19968: jis0208<<14 | 0x1F<<7 | 0x46, 20186 - 19968: jis0212<<14 | 0x0F<<7 | 0x24, 20187 - 19968: jis0212<<14 | 0x0F<<7 | 0x25, 20189 - 19968: jis0208<<14 | 0x00<<7 | 0x17, 20190 - 19968: jis0208<<14 | 0x2F<<7 | 0x1F, 20191 - 19968: jis0208<<14 | 0x2F<<7 | 0x21, 20192 - 19968: jis0212<<14 | 0x0F<<7 | 0x26, 20193 - 19968: jis0208<<14 | 0x58<<7 | 0x0D, 20194 - 19968: jis0212<<14 | 0x0F<<7 | 0x28, 20195 - 19968: jis0208<<14 | 0x21<<7 | 0x44, 20196 - 19968: jis0208<<14 | 0x2D<<7 | 0x40, 20197 - 19968: jis0208<<14 | 0x0F<<7 | 0x29, 20200 - 19968: jis0212<<14 | 0x0F<<7 | 0x29, 20205 - 19968: jis0208<<14 | 0x2F<<7 | 0x20, 20206 - 19968: jis0208<<14 | 0x11<<7 | 0x1D, 20207 - 19968: jis0212<<14 | 0x0F<<7 | 0x2A, 20208 - 19968: jis0208<<14 | 0x15<<7 | 0x23, 20209 - 19968: jis0212<<14 | 0x0F<<7 | 0x2B, 20210 - 19968: jis0208<<14 | 0x22<<7 | 0x46, 20211 - 19968: jis0212<<14 | 0x0F<<7 | 0x2C, 20213 - 19968: jis0212<<14 | 0x0F<<7 | 0x2D, 20214 - 19968: jis0208<<14 | 0x16<<7 | 0x4E, 20215 - 19968: jis0208<<14 | 0x2F<<7 | 0x22, 20219 - 19968: jis0208<<14 | 0x26<<7 | 0x03, 20220 - 19968: jis0208<<14 | 0x58<<7 | 0x0E, 20221 - 19968: jis0212<<14 | 0x0F<<7 | 0x2E, 20222 - 19968: jis0212<<14 | 0x0F<<7 | 0x2F, 20223 - 19968: jis0212<<14 | 0x0F<<7 | 0x30, 20224 - 19968: jis0208<<14 | 0x58<<7 | 0x0F, 20225 - 19968: jis0208<<14 | 0x13<<7 | 0x4A, 20226 - 19968: jis0212<<14 | 0x0F<<7 | 0x32, 20227 - 19968: jis0208<<14 | 0x58<<7 | 0x10, 20232 - 19968: jis0212<<14 | 0x0F<<7 | 0x34, 20233 - 19968: jis0208<<14 | 0x2F<<7 | 0x23, 20234 - 19968: jis0208<<14 | 0x0F<<7 | 0x2A, 20235 - 19968: jis0212<<14 | 0x0F<<7 | 0x35, 20236 - 19968: jis0212<<14 | 0x0F<<7 | 0x36, 20237 - 19968: jis0208<<14 | 0x17<<7 | 0x3F, 20238 - 19968: jis0208<<14 | 0x13<<7 | 0x4B, 20239 - 19968: jis0208<<14 | 0x28<<7 | 0x59, 20240 - 19968: jis0208<<14 | 0x27<<7 | 0x11, 20241 - 19968: jis0208<<14 | 0x14<<7 | 0x38, 20242 - 19968: jis0212<<14 | 0x0F<<7 | 0x37, 20245 - 19968: jis0212<<14 | 0x0F<<7 | 0x38, 20246 - 19968: jis0212<<14 | 0x0F<<7 | 0x39, 20247 - 19968: jis0212<<14 | 0x0F<<7 | 0x3A, 20249 - 19968: jis0212<<14 | 0x0F<<7 | 0x3B, 20250 - 19968: jis0208<<14 | 0x11<<7 | 0x50, 20252 - 19968: jis0208<<14 | 0x2F<<7 | 0x46, 20253 - 19968: jis0208<<14 | 0x24<<7 | 0x20, 20270 - 19968: jis0212<<14 | 0x0F<<7 | 0x3C, 20271 - 19968: jis0208<<14 | 0x26<<7 | 0x4B, 20272 - 19968: jis0208<<14 | 0x2F<<7 | 0x25, 20273 - 19968: jis0212<<14 | 0x0F<<7 | 0x3D, 20275 - 19968: jis0212<<14 | 0x0F<<7 | 0x3F, 20276 - 19968: jis0208<<14 | 0x27<<7 | 0x1B, 20277 - 19968: jis0212<<14 | 0x0F<<7 | 0x40, 20278 - 19968: jis0208<<14 | 0x2D<<7 | 0x41, 20279 - 19968: jis0212<<14 | 0x0F<<7 | 0x41, 20280 - 19968: jis0208<<14 | 0x1E<<7 | 0x0C, 20281 - 19968: jis0208<<14 | 0x58<<7 | 0x11, 20282 - 19968: jis0208<<14 | 0x1A<<7 | 0x26, 20283 - 19968: jis0212<<14 | 0x0F<<7 | 0x43, 20284 - 19968: jis0208<<14 | 0x1A<<7 | 0x56, 20285 - 19968: jis0208<<14 | 0x11<<7 | 0x1F, 20286 - 19968: jis0212<<14 | 0x0F<<7 | 0x44, 20288 - 19968: jis0212<<14 | 0x0F<<7 | 0x45, 20290 - 19968: jis0212<<14 | 0x0F<<7 | 0x46, 20291 - 19968: jis0208<<14 | 0x23<<7 | 0x30, 20294 - 19968: jis0208<<14 | 0x22<<7 | 0x01, 20295 - 19968: jis0208<<14 | 0x2F<<7 | 0x29, 20296 - 19968: jis0212<<14 | 0x0F<<7 | 0x47, 20297 - 19968: jis0212<<14 | 0x0F<<7 | 0x48, 20299 - 19968: jis0212<<14 | 0x0F<<7 | 0x49, 20300 - 19968: jis0212<<14 | 0x0F<<7 | 0x4A, 20301 - 19968: jis0208<<14 | 0x0F<<7 | 0x2B, 20302 - 19968: jis0208<<14 | 0x23<<7 | 0x42, 20303 - 19968: jis0208<<14 | 0x1C<<7 | 0x1A, 20304 - 19968: jis0208<<14 | 0x19<<7 | 0x13, 20305 - 19968: jis0208<<14 | 0x2C<<7 | 0x03, 20306 - 19968: jis0212<<14 | 0x0F<<7 | 0x4B, 20307 - 19968: jis0208<<14 | 0x21<<7 | 0x2D, 20308 - 19968: jis0212<<14 | 0x0F<<7 | 0x4C, 20309 - 19968: jis0208<<14 | 0x11<<7 | 0x1E, 20310 - 19968: jis0208<<14 | 0x58<<7 | 0x12, 20311 - 19968: jis0208<<14 | 0x2F<<7 | 0x28, 20312 - 19968: jis0212<<14 | 0x0F<<7 | 0x4E, 20313 - 19968: jis0208<<14 | 0x2C<<7 | 0x1D, 20314 - 19968: jis0208<<14 | 0x2F<<7 | 0x24, 20315 - 19968: jis0208<<14 | 0x2F<<7 | 0x26, 20316 - 19968: jis0208<<14 | 0x19<<7 | 0x4D, 20317 - 19968: jis0208<<14 | 0x2F<<7 | 0x27, 20318 - 19968: jis0208<<14 | 0x34<<7 | 0x03, 20319 - 19968: jis0212<<14 | 0x0F<<7 | 0x4F, 20320 - 19968: jis0212<<14 | 0x0F<<7 | 0x3E, 20323 - 19968: jis0212<<14 | 0x0F<<7 | 0x50, 20329 - 19968: jis0208<<14 | 0x2F<<7 | 0x2F, 20330 - 19968: jis0212<<14 | 0x0F<<7 | 0x51, 20332 - 19968: jis0212<<14 | 0x0F<<7 | 0x52, 20334 - 19968: jis0212<<14 | 0x0F<<7 | 0x53, 20335 - 19968: jis0208<<14 | 0x2F<<7 | 0x32, 20336 - 19968: jis0208<<14 | 0x2F<<7 | 0x30, 20337 - 19968: jis0212<<14 | 0x0F<<7 | 0x54, 20339 - 19968: jis0208<<14 | 0x11<<7 | 0x21, 20341 - 19968: jis0208<<14 | 0x29<<7 | 0x1A, 20342 - 19968: jis0208<<14 | 0x2F<<7 | 0x2A, 20343 - 19968: jis0212<<14 | 0x0F<<7 | 0x55, 20344 - 19968: jis0212<<14 | 0x0F<<7 | 0x56, 20345 - 19968: jis0212<<14 | 0x0F<<7 | 0x57, 20346 - 19968: jis0212<<14 | 0x0F<<7 | 0x58, 20347 - 19968: jis0208<<14 | 0x2F<<7 | 0x2E, 20348 - 19968: jis0208<<14 | 0x17<<7 | 0x52, 20349 - 19968: jis0212<<14 | 0x0F<<7 | 0x59, 20350 - 19968: jis0212<<14 | 0x0F<<7 | 0x5A, 20351 - 19968: jis0208<<14 | 0x1A<<7 | 0x27, 20353 - 19968: jis0212<<14 | 0x0F<<7 | 0x5B, 20354 - 19968: jis0212<<14 | 0x0F<<7 | 0x5C, 20355 - 19968: jis0208<<14 | 0x13<<7 | 0x05, 20356 - 19968: jis0212<<14 | 0x0F<<7 | 0x5D, 20357 - 19968: jis0212<<14 | 0x10<<7 | 0x00, 20358 - 19968: jis0208<<14 | 0x2F<<7 | 0x33, 20360 - 19968: jis0208<<14 | 0x2F<<7 | 0x2B, 20361 - 19968: jis0212<<14 | 0x10<<7 | 0x01, 20362 - 19968: jis0208<<14 | 0x58<<7 | 0x14, 20363 - 19968: jis0208<<14 | 0x2D<<7 | 0x42, 20364 - 19968: jis0212<<14 | 0x10<<7 | 0x03, 20365 - 19968: jis0208<<14 | 0x1A<<7 | 0x57, 20366 - 19968: jis0212<<14 | 0x10<<7 | 0x04, 20367 - 19968: jis0208<<14 | 0x2F<<7 | 0x2C, 20368 - 19968: jis0212<<14 | 0x10<<7 | 0x05, 20369 - 19968: jis0208<<14 | 0x2F<<7 | 0x31, 20370 - 19968: jis0208<<14 | 0x58<<7 | 0x13, 20371 - 19968: jis0212<<14 | 0x10<<7 | 0x07, 20372 - 19968: jis0208<<14 | 0x58<<7 | 0x16, 20374 - 19968: jis0208<<14 | 0x2F<<7 | 0x34, 20375 - 19968: jis0212<<14 | 0x10<<7 | 0x09, 20376 - 19968: jis0208<<14 | 0x2F<<7 | 0x2D, 20377 - 19968: jis0212<<14 | 0x10<<7 | 0x0A, 20378 - 19968: jis0208<<14 | 0x58<<7 | 0x15, 20379 - 19968: jis0208<<14 | 0x15<<7 | 0x00, 20381 - 19968: jis0208<<14 | 0x0F<<7 | 0x2C, 20382 - 19968: jis0212<<14 | 0x10<<7 | 0x0C, 20383 - 19968: jis0212<<14 | 0x10<<7 | 0x0D, 20384 - 19968: jis0208<<14 | 0x15<<7 | 0x01, 20385 - 19968: jis0208<<14 | 0x11<<7 | 0x20, 20395 - 19968: jis0208<<14 | 0x34<<7 | 0x04, 20397 - 19968: jis0208<<14 | 0x2A<<7 | 0x58, 20398 - 19968: jis0208<<14 | 0x28<<7 | 0x4D, 20399 - 19968: jis0208<<14 | 0x17<<7 | 0x53, 20402 - 19968: jis0212<<14 | 0x10<<7 | 0x0E, 20405 - 19968: jis0208<<14 | 0x1E<<7 | 0x0E, 20406 - 19968: jis0208<<14 | 0x2D<<7 | 0x16, 20407 - 19968: jis0212<<14 | 0x10<<7 | 0x0F, 20409 - 19968: jis0212<<14 | 0x10<<7 | 0x10, 20411 - 19968: jis0212<<14 | 0x10<<7 | 0x11, 20412 - 19968: jis0212<<14 | 0x10<<7 | 0x12, 20413 - 19968: jis0212<<14 | 0x10<<7 | 0x13, 20414 - 19968: jis0212<<14 | 0x10<<7 | 0x14, 20415 - 19968: jis0208<<14 | 0x29<<7 | 0x37, 20416 - 19968: jis0212<<14 | 0x10<<7 | 0x15, 20417 - 19968: jis0212<<14 | 0x10<<7 | 0x16, 20418 - 19968: jis0208<<14 | 0x16<<7 | 0x17, 20419 - 19968: jis0208<<14 | 0x21<<7 | 0x04, 20420 - 19968: jis0208<<14 | 0x11<<7 | 0x43, 20421 - 19968: jis0212<<14 | 0x10<<7 | 0x17, 20422 - 19968: jis0212<<14 | 0x10<<7 | 0x18, 20424 - 19968: jis0212<<14 | 0x10<<7 | 0x19, 20425 - 19968: jis0208<<14 | 0x58<<7 | 0x05, 20426 - 19968: jis0208<<14 | 0x1C<<7 | 0x32, 20427 - 19968: jis0212<<14 | 0x10<<7 | 0x1B, 20428 - 19968: jis0212<<14 | 0x10<<7 | 0x1C, 20429 - 19968: jis0208<<14 | 0x58<<7 | 0x17, 20430 - 19968: jis0208<<14 | 0x2F<<7 | 0x38, 20431 - 19968: jis0212<<14 | 0x10<<7 | 0x1E, 20432 - 19968: jis0208<<14 | 0x2F<<7 | 0x3D, 20433 - 19968: jis0208<<14 | 0x2F<<7 | 0x3B, 20434 - 19968: jis0212<<14 | 0x10<<7 | 0x1F, 20436 - 19968: jis0208<<14 | 0x2F<<7 | 0x36, 20439 - 19968: jis0208<<14 | 0x21<<7 | 0x0E, 20440 - 19968: jis0208<<14 | 0x2F<<7 | 0x39, 20442 - 19968: jis0208<<14 | 0x2F<<7 | 0x3C, 20443 - 19968: jis0208<<14 | 0x2F<<7 | 0x3A, 20444 - 19968: jis0212<<14 | 0x10<<7 | 0x20, 20445 - 19968: jis0208<<14 | 0x29<<7 | 0x3C, 20447 - 19968: jis0208<<14 | 0x2F<<7 | 0x37, 20448 - 19968: jis0212<<14 | 0x10<<7 | 0x21, 20449 - 19968: jis0208<<14 | 0x1E<<7 | 0x0D, 20450 - 19968: jis0212<<14 | 0x10<<7 | 0x22, 20451 - 19968: jis0208<<14 | 0x2A<<7 | 0x52, 20452 - 19968: jis0208<<14 | 0x2F<<7 | 0x3E, 20453 - 19968: jis0208<<14 | 0x2F<<7 | 0x3F, 20462 - 19968: jis0208<<14 | 0x1C<<7 | 0x03, 20463 - 19968: jis0208<<14 | 0x2F<<7 | 0x4C, 20464 - 19968: jis0212<<14 | 0x10<<7 | 0x23, 20466 - 19968: jis0212<<14 | 0x10<<7 | 0x24, 20467 - 19968: jis0208<<14 | 0x26<<7 | 0x2F, 20469 - 19968: jis0208<<14 | 0x28<<7 | 0x15, 20470 - 19968: jis0208<<14 | 0x2F<<7 | 0x47, 20472 - 19968: jis0208<<14 | 0x29<<7 | 0x4F, 20474 - 19968: jis0208<<14 | 0x11<<7 | 0x15, 20476 - 19968: jis0212<<14 | 0x10<<7 | 0x25, 20477 - 19968: jis0212<<14 | 0x10<<7 | 0x26, 20478 - 19968: jis0208<<14 | 0x2F<<7 | 0x4B, 20479 - 19968: jis0208<<14 | 0x58<<7 | 0x1A, 20480 - 19968: jis0212<<14 | 0x10<<7 | 0x28, 20481 - 19968: jis0212<<14 | 0x10<<7 | 0x29, 20484 - 19968: jis0212<<14 | 0x10<<7 | 0x2A, 20485 - 19968: jis0208<<14 | 0x2F<<7 | 0x45, 20486 - 19968: jis0208<<14 | 0x2F<<7 | 0x4E, 20487 - 19968: jis0212<<14 | 0x10<<7 | 0x2B, 20489 - 19968: jis0208<<14 | 0x20<<7 | 0x31, 20490 - 19968: jis0212<<14 | 0x10<<7 | 0x2C, 20491 - 19968: jis0208<<14 | 0x17<<7 | 0x23, 20492 - 19968: jis0212<<14 | 0x10<<7 | 0x2D, 20493 - 19968: jis0208<<14 | 0x26<<7 | 0x3B, 20494 - 19968: jis0212<<14 | 0x10<<7 | 0x2E, 20495 - 19968: jis0208<<14 | 0x3F<<7 | 0x26, 20496 - 19968: jis0212<<14 | 0x10<<7 | 0x2F, 20497 - 19968: jis0208<<14 | 0x2F<<7 | 0x4D, 20498 - 19968: jis0208<<14 | 0x24<<7 | 0x3C, 20499 - 19968: jis0212<<14 | 0x10<<7 | 0x30, 20500 - 19968: jis0208<<14 | 0x2F<<7 | 0x42, 20502 - 19968: jis0208<<14 | 0x17<<7 | 0x55, 20503 - 19968: jis0212<<14 | 0x10<<7 | 0x31, 20504 - 19968: jis0212<<14 | 0x10<<7 | 0x32, 20505 - 19968: jis0208<<14 | 0x17<<7 | 0x54, 20506 - 19968: jis0208<<14 | 0x2F<<7 | 0x40, 20507 - 19968: jis0212<<14 | 0x10<<7 | 0x33, 20508 - 19968: jis0212<<14 | 0x10<<7 | 0x34, 20509 - 19968: jis0212<<14 | 0x10<<7 | 0x35, 20510 - 19968: jis0208<<14 | 0x58<<7 | 0x1B, 20511 - 19968: jis0208<<14 | 0x1B<<7 | 0x39, 20513 - 19968: jis0208<<14 | 0x2F<<7 | 0x48, 20514 - 19968: jis0208<<14 | 0x58<<7 | 0x19, 20515 - 19968: jis0208<<14 | 0x29<<7 | 0x4E, 20516 - 19968: jis0208<<14 | 0x22<<7 | 0x2C, 20517 - 19968: jis0208<<14 | 0x2F<<7 | 0x44, 20518 - 19968: jis0208<<14 | 0x16<<7 | 0x50, 20519 - 19968: jis0212<<14 | 0x10<<7 | 0x38, 20520 - 19968: jis0208<<14 | 0x2F<<7 | 0x41, 20521 - 19968: jis0208<<14 | 0x2F<<7 | 0x49, 20522 - 19968: jis0208<<14 | 0x2F<<7 | 0x43, 20523 - 19968: jis0208<<14 | 0x2D<<7 | 0x30, 20524 - 19968: jis0208<<14 | 0x2F<<7 | 0x4A, 20525 - 19968: jis0208<<14 | 0x2E<<7 | 0x20, 20526 - 19968: jis0212<<14 | 0x10<<7 | 0x39, 20528 - 19968: jis0212<<14 | 0x10<<7 | 0x3A, 20530 - 19968: jis0212<<14 | 0x10<<7 | 0x3B, 20531 - 19968: jis0212<<14 | 0x10<<7 | 0x3C, 20533 - 19968: jis0212<<14 | 0x10<<7 | 0x3D, 20534 - 19968: jis0208<<14 | 0x15<<7 | 0x45, 20537 - 19968: jis0208<<14 | 0x16<<7 | 0x4F, 20539 - 19968: jis0212<<14 | 0x10<<7 | 0x55, 20544 - 19968: jis0208<<14 | 0x58<<7 | 0x18, 20545 - 19968: jis0212<<14 | 0x10<<7 | 0x3F, 20546 - 19968: jis0208<<14 | 0x58<<7 | 0x1E, 20547 - 19968: jis0208<<14 | 0x2F<<7 | 0x4F, 20549 - 19968: jis0212<<14 | 0x10<<7 | 0x41, 20550 - 19968: jis0208<<14 | 0x58<<7 | 0x1C, 20551 - 19968: jis0208<<14 | 0x2F<<7 | 0x50, 20552 - 19968: jis0208<<14 | 0x2F<<7 | 0x54, 20553 - 19968: jis0208<<14 | 0x0F<<7 | 0x2D, 20554 - 19968: jis0212<<14 | 0x10<<7 | 0x43, 20556 - 19968: jis0212<<14 | 0x10<<7 | 0x44, 20558 - 19968: jis0212<<14 | 0x10<<7 | 0x45, 20559 - 19968: jis0208<<14 | 0x29<<7 | 0x2F, 20560 - 19968: jis0208<<14 | 0x2F<<7 | 0x53, 20561 - 19968: jis0212<<14 | 0x10<<7 | 0x46, 20562 - 19968: jis0212<<14 | 0x10<<7 | 0x47, 20563 - 19968: jis0212<<14 | 0x10<<7 | 0x48, 20565 - 19968: jis0208<<14 | 0x2F<<7 | 0x52, 20566 - 19968: jis0208<<14 | 0x2F<<7 | 0x56, 20567 - 19968: jis0212<<14 | 0x10<<7 | 0x49, 20569 - 19968: jis0212<<14 | 0x10<<7 | 0x4A, 20570 - 19968: jis0208<<14 | 0x2F<<7 | 0x55, 20572 - 19968: jis0208<<14 | 0x23<<7 | 0x43, 20575 - 19968: jis0212<<14 | 0x10<<7 | 0x4B, 20576 - 19968: jis0212<<14 | 0x10<<7 | 0x4C, 20578 - 19968: jis0212<<14 | 0x10<<7 | 0x4D, 20579 - 19968: jis0212<<14 | 0x10<<7 | 0x4E, 20581 - 19968: jis0208<<14 | 0x16<<7 | 0x51, 20582 - 19968: jis0212<<14 | 0x10<<7 | 0x4F, 20583 - 19968: jis0212<<14 | 0x10<<7 | 0x50, 20586 - 19968: jis0212<<14 | 0x10<<7 | 0x51, 20588 - 19968: jis0208<<14 | 0x2F<<7 | 0x57, 20589 - 19968: jis0212<<14 | 0x10<<7 | 0x52, 20592 - 19968: jis0208<<14 | 0x58<<7 | 0x1D, 20593 - 19968: jis0212<<14 | 0x10<<7 | 0x54, 20594 - 19968: jis0208<<14 | 0x1B<<7 | 0x24, 20596 - 19968: jis0208<<14 | 0x21<<7 | 0x05, 20597 - 19968: jis0208<<14 | 0x23<<7 | 0x44, 20598 - 19968: jis0208<<14 | 0x15<<7 | 0x55, 20600 - 19968: jis0208<<14 | 0x2F<<7 | 0x58, 20605 - 19968: jis0208<<14 | 0x14<<7 | 0x15, 20608 - 19968: jis0208<<14 | 0x2F<<7 | 0x59, 20609 - 19968: jis0212<<14 | 0x10<<7 | 0x56, 20611 - 19968: jis0212<<14 | 0x10<<7 | 0x57, 20612 - 19968: jis0212<<14 | 0x10<<7 | 0x58, 20613 - 19968: jis0208<<14 | 0x2F<<7 | 0x5B, 20614 - 19968: jis0212<<14 | 0x10<<7 | 0x59, 20618 - 19968: jis0212<<14 | 0x10<<7 | 0x5A, 20621 - 19968: jis0208<<14 | 0x2A<<7 | 0x14, 20622 - 19968: jis0212<<14 | 0x10<<7 | 0x5B, 20623 - 19968: jis0212<<14 | 0x10<<7 | 0x5C, 20624 - 19968: jis0212<<14 | 0x10<<7 | 0x5D, 20625 - 19968: jis0208<<14 | 0x16<<7 | 0x45, 20626 - 19968: jis0212<<14 | 0x11<<7 | 0x00, 20627 - 19968: jis0212<<14 | 0x11<<7 | 0x01, 20628 - 19968: jis0208<<14 | 0x58<<7 | 0x1F, 20630 - 19968: jis0212<<14 | 0x11<<7 | 0x03, 20632 - 19968: jis0208<<14 | 0x1A<<7 | 0x10, 20633 - 19968: jis0208<<14 | 0x27<<7 | 0x56, 20634 - 19968: jis0208<<14 | 0x2F<<7 | 0x5A, 20635 - 19968: jis0212<<14 | 0x11<<7 | 0x04, 20636 - 19968: jis0212<<14 | 0x11<<7 | 0x05, 20638 - 19968: jis0212<<14 | 0x11<<7 | 0x06, 20639 - 19968: jis0212<<14 | 0x11<<7 | 0x07, 20640 - 19968: jis0212<<14 | 0x11<<7 | 0x08, 20641 - 19968: jis0212<<14 | 0x11<<7 | 0x09, 20642 - 19968: jis0212<<14 | 0x11<<7 | 0x0A, 20650 - 19968: jis0212<<14 | 0x11<<7 | 0x0B, 20652 - 19968: jis0208<<14 | 0x19<<7 | 0x24, 20653 - 19968: jis0208<<14 | 0x2C<<7 | 0x22, 20655 - 19968: jis0212<<14 | 0x11<<7 | 0x0C, 20656 - 19968: jis0212<<14 | 0x11<<7 | 0x0D, 20658 - 19968: jis0208<<14 | 0x2F<<7 | 0x5D, 20659 - 19968: jis0208<<14 | 0x30<<7 | 0x02, 20660 - 19968: jis0208<<14 | 0x2F<<7 | 0x5C, 20661 - 19968: jis0208<<14 | 0x19<<7 | 0x23, 20663 - 19968: jis0208<<14 | 0x1C<<7 | 0x5C, 20665 - 19968: jis0212<<14 | 0x11<<7 | 0x0E, 20666 - 19968: jis0212<<14 | 0x11<<7 | 0x0F, 20669 - 19968: jis0212<<14 | 0x11<<7 | 0x10, 20670 - 19968: jis0208<<14 | 0x16<<7 | 0x18, 20672 - 19968: jis0212<<14 | 0x11<<7 | 0x11, 20674 - 19968: jis0208<<14 | 0x30<<7 | 0x03, 20675 - 19968: jis0212<<14 | 0x11<<7 | 0x12, 20676 - 19968: jis0212<<14 | 0x11<<7 | 0x13, 20677 - 19968: jis0208<<14 | 0x15<<7 | 0x2E, 20679 - 19968: jis0212<<14 | 0x11<<7 | 0x14, 20681 - 19968: jis0208<<14 | 0x30<<7 | 0x00, 20682 - 19968: jis0208<<14 | 0x30<<7 | 0x01, 20684 - 19968: jis0212<<14 | 0x11<<7 | 0x15, 20685 - 19968: jis0208<<14 | 0x25<<7 | 0x0E, 20686 - 19968: jis0212<<14 | 0x11<<7 | 0x16, 20687 - 19968: jis0208<<14 | 0x20<<7 | 0x5B, 20688 - 19968: jis0212<<14 | 0x11<<7 | 0x17, 20689 - 19968: jis0208<<14 | 0x15<<7 | 0x02, 20691 - 19968: jis0212<<14 | 0x11<<7 | 0x18, 20692 - 19968: jis0212<<14 | 0x11<<7 | 0x19, 20693 - 19968: jis0208<<14 | 0x2A<<7 | 0x2C, 20694 - 19968: jis0208<<14 | 0x30<<7 | 0x04, 20696 - 19968: jis0208<<14 | 0x58<<7 | 0x21, 20698 - 19968: jis0208<<14 | 0x2D<<7 | 0x1C, 20700 - 19968: jis0212<<14 | 0x11<<7 | 0x1B, 20701 - 19968: jis0212<<14 | 0x11<<7 | 0x1C, 20702 - 19968: jis0208<<14 | 0x30<<7 | 0x05, 20703 - 19968: jis0212<<14 | 0x11<<7 | 0x1D, 20706 - 19968: jis0212<<14 | 0x11<<7 | 0x1E, 20707 - 19968: jis0208<<14 | 0x30<<7 | 0x08, 20708 - 19968: jis0212<<14 | 0x11<<7 | 0x1F, 20709 - 19968: jis0208<<14 | 0x30<<7 | 0x06, 20710 - 19968: jis0212<<14 | 0x11<<7 | 0x20, 20711 - 19968: jis0208<<14 | 0x20<<7 | 0x2D, 20712 - 19968: jis0212<<14 | 0x11<<7 | 0x21, 20713 - 19968: jis0212<<14 | 0x11<<7 | 0x22, 20717 - 19968: jis0208<<14 | 0x30<<7 | 0x07, 20718 - 19968: jis0208<<14 | 0x30<<7 | 0x09, 20719 - 19968: jis0212<<14 | 0x11<<7 | 0x23, 20721 - 19968: jis0212<<14 | 0x11<<7 | 0x24, 20722 - 19968: jis0212<<14 | 0x11<<7 | 0x30, 20724 - 19968: jis0208<<14 | 0x58<<7 | 0x20, 20725 - 19968: jis0208<<14 | 0x30<<7 | 0x0B, 20726 - 19968: jis0212<<14 | 0x11<<7 | 0x25, 20729 - 19968: jis0208<<14 | 0x30<<7 | 0x0A, 20730 - 19968: jis0212<<14 | 0x11<<7 | 0x26, 20731 - 19968: jis0208<<14 | 0x29<<7 | 0x27, 20734 - 19968: jis0212<<14 | 0x11<<7 | 0x27, 20736 - 19968: jis0208<<14 | 0x14<<7 | 0x16, 20737 - 19968: jis0208<<14 | 0x30<<7 | 0x0D, 20738 - 19968: jis0208<<14 | 0x30<<7 | 0x0E, 20739 - 19968: jis0212<<14 | 0x11<<7 | 0x28, 20740 - 19968: jis0208<<14 | 0x11<<7 | 0x0E, 20742 - 19968: jis0212<<14 | 0x11<<7 | 0x29, 20743 - 19968: jis0212<<14 | 0x11<<7 | 0x2A, 20744 - 19968: jis0212<<14 | 0x11<<7 | 0x2B, 20745 - 19968: jis0208<<14 | 0x30<<7 | 0x0C, 20747 - 19968: jis0212<<14 | 0x11<<7 | 0x2C, 20748 - 19968: jis0212<<14 | 0x11<<7 | 0x2D, 20749 - 19968: jis0212<<14 | 0x11<<7 | 0x2E, 20750 - 19968: jis0212<<14 | 0x11<<7 | 0x2F, 20752 - 19968: jis0212<<14 | 0x11<<7 | 0x31, 20754 - 19968: jis0208<<14 | 0x1B<<7 | 0x53, 20756 - 19968: jis0208<<14 | 0x30<<7 | 0x11, 20757 - 19968: jis0208<<14 | 0x30<<7 | 0x10, 20758 - 19968: jis0208<<14 | 0x30<<7 | 0x0F, 20759 - 19968: jis0212<<14 | 0x11<<7 | 0x32, 20760 - 19968: jis0208<<14 | 0x2F<<7 | 0x35, 20761 - 19968: jis0212<<14 | 0x11<<7 | 0x33, 20762 - 19968: jis0208<<14 | 0x30<<7 | 0x12, 20763 - 19968: jis0212<<14 | 0x11<<7 | 0x34, 20764 - 19968: jis0212<<14 | 0x11<<7 | 0x35, 20765 - 19968: jis0212<<14 | 0x11<<7 | 0x36, 20766 - 19968: jis0212<<14 | 0x11<<7 | 0x37, 20767 - 19968: jis0208<<14 | 0x1C<<7 | 0x5D, 20769 - 19968: jis0208<<14 | 0x30<<7 | 0x13, 20771 - 19968: jis0212<<14 | 0x11<<7 | 0x38, 20775 - 19968: jis0212<<14 | 0x11<<7 | 0x39, 20776 - 19968: jis0212<<14 | 0x11<<7 | 0x3A, 20778 - 19968: jis0208<<14 | 0x2C<<7 | 0x04, 20780 - 19968: jis0212<<14 | 0x11<<7 | 0x3B, 20781 - 19968: jis0212<<14 | 0x11<<7 | 0x3C, 20783 - 19968: jis0212<<14 | 0x11<<7 | 0x3D, 20785 - 19968: jis0212<<14 | 0x11<<7 | 0x3E, 20786 - 19968: jis0208<<14 | 0x2B<<7 | 0x38, 20787 - 19968: jis0212<<14 | 0x11<<7 | 0x3F, 20788 - 19968: jis0212<<14 | 0x11<<7 | 0x40, 20789 - 19968: jis0212<<14 | 0x11<<7 | 0x41, 20791 - 19968: jis0208<<14 | 0x30<<7 | 0x15, 20792 - 19968: jis0212<<14 | 0x11<<7 | 0x42, 20793 - 19968: jis0212<<14 | 0x11<<7 | 0x43, 20794 - 19968: jis0208<<14 | 0x30<<7 | 0x14, 20795 - 19968: jis0208<<14 | 0x30<<7 | 0x17, 20796 - 19968: jis0208<<14 | 0x30<<7 | 0x16, 20799 - 19968: jis0208<<14 | 0x30<<7 | 0x18, 20800 - 19968: jis0208<<14 | 0x30<<7 | 0x19, 20801 - 19968: jis0208<<14 | 0x0F<<7 | 0x53, 20802 - 19968: jis0212<<14 | 0x11<<7 | 0x44, 20803 - 19968: jis0208<<14 | 0x17<<7 | 0x14, 20804 - 19968: jis0208<<14 | 0x16<<7 | 0x1A, 20805 - 19968: jis0208<<14 | 0x1C<<7 | 0x1B, 20806 - 19968: jis0208<<14 | 0x22<<7 | 0x5A, 20807 - 19968: jis0208<<14 | 0x15<<7 | 0x03, 20808 - 19968: jis0208<<14 | 0x1F<<7 | 0x47, 20809 - 19968: jis0208<<14 | 0x17<<7 | 0x56, 20810 - 19968: jis0208<<14 | 0x58<<7 | 0x22, 20811 - 19968: jis0208<<14 | 0x18<<7 | 0x4D, 20812 - 19968: jis0208<<14 | 0x30<<7 | 0x1B, 20813 - 19968: jis0208<<14 | 0x2B<<7 | 0x27, 20814 - 19968: jis0208<<14 | 0x24<<7 | 0x25, 20815 - 19968: jis0212<<14 | 0x11<<7 | 0x46, 20816 - 19968: jis0208<<14 | 0x1A<<7 | 0x58, 20818 - 19968: jis0208<<14 | 0x30<<7 | 0x1A, 20819 - 19968: jis0212<<14 | 0x11<<7 | 0x47, 20820 - 19968: jis0208<<14 | 0x30<<7 | 0x1C, 20821 - 19968: jis0212<<14 | 0x11<<7 | 0x48, 20823 - 19968: jis0212<<14 | 0x11<<7 | 0x49, 20824 - 19968: jis0212<<14 | 0x11<<7 | 0x4A, 20826 - 19968: jis0208<<14 | 0x24<<7 | 0x3D, 20828 - 19968: jis0208<<14 | 0x12<<7 | 0x54, 20831 - 19968: jis0212<<14 | 0x11<<7 | 0x4B, 20834 - 19968: jis0208<<14 | 0x30<<7 | 0x1D, 20836 - 19968: jis0208<<14 | 0x58<<7 | 0x23, 20837 - 19968: jis0208<<14 | 0x25<<7 | 0x5D, 20838 - 19968: jis0212<<14 | 0x11<<7 | 0x4D, 20840 - 19968: jis0208<<14 | 0x20<<7 | 0x13, 20841 - 19968: jis0208<<14 | 0x30<<7 | 0x1F, 20842 - 19968: jis0208<<14 | 0x30<<7 | 0x20, 20843 - 19968: jis0208<<14 | 0x27<<7 | 0x0B, 20844 - 19968: jis0208<<14 | 0x17<<7 | 0x57, 20845 - 19968: jis0208<<14 | 0x2E<<7 | 0x1A, 20846 - 19968: jis0208<<14 | 0x30<<7 | 0x21, 20849 - 19968: jis0208<<14 | 0x15<<7 | 0x05, 20853 - 19968: jis0208<<14 | 0x29<<7 | 0x1B, 20854 - 19968: jis0208<<14 | 0x21<<7 | 0x15, 20855 - 19968: jis0208<<14 | 0x15<<7 | 0x50, 20856 - 19968: jis0208<<14 | 0x24<<7 | 0x14, 20860 - 19968: jis0208<<14 | 0x16<<7 | 0x52, 20862 - 19968: jis0212<<14 | 0x11<<7 | 0x4E, 20864 - 19968: jis0208<<14 | 0x30<<7 | 0x22, 20866 - 19968: jis0208<<14 | 0x30<<7 | 0x23, 20867 - 19968: jis0212<<14 | 0x11<<7 | 0x4F, 20868 - 19968: jis0212<<14 | 0x11<<7 | 0x50, 20869 - 19968: jis0208<<14 | 0x25<<7 | 0x41, 20870 - 19968: jis0208<<14 | 0x10<<7 | 0x3E, 20873 - 19968: jis0208<<14 | 0x30<<7 | 0x26, 20874 - 19968: jis0208<<14 | 0x19<<7 | 0x5C, 20875 - 19968: jis0212<<14 | 0x11<<7 | 0x51, 20876 - 19968: jis0208<<14 | 0x30<<7 | 0x25, 20877 - 19968: jis0208<<14 | 0x19<<7 | 0x25, 20878 - 19968: jis0212<<14 | 0x11<<7 | 0x52, 20879 - 19968: jis0208<<14 | 0x30<<7 | 0x27, 20880 - 19968: jis0208<<14 | 0x45<<7 | 0x4D, 20881 - 19968: jis0208<<14 | 0x30<<7 | 0x28, 20882 - 19968: jis0208<<14 | 0x2A<<7 | 0x20, 20883 - 19968: jis0208<<14 | 0x30<<7 | 0x29, 20885 - 19968: jis0208<<14 | 0x30<<7 | 0x2A, 20886 - 19968: jis0208<<14 | 0x30<<7 | 0x2B, 20887 - 19968: jis0208<<14 | 0x1D<<7 | 0x48, 20888 - 19968: jis0212<<14 | 0x11<<7 | 0x53, 20889 - 19968: jis0208<<14 | 0x1B<<7 | 0x2B, 20893 - 19968: jis0208<<14 | 0x58<<7 | 0x24, 20896 - 19968: jis0208<<14 | 0x13<<7 | 0x06, 20897 - 19968: jis0212<<14 | 0x11<<7 | 0x55, 20898 - 19968: jis0208<<14 | 0x30<<7 | 0x2E, 20899 - 19968: jis0212<<14 | 0x11<<7 | 0x56, 20900 - 19968: jis0208<<14 | 0x30<<7 | 0x2C, 20901 - 19968: jis0208<<14 | 0x2B<<7 | 0x1C, 20902 - 19968: jis0208<<14 | 0x30<<7 | 0x2D, 20904 - 19968: jis0208<<14 | 0x28<<7 | 0x39, 20905 - 19968: jis0208<<14 | 0x30<<7 | 0x2F, 20906 - 19968: jis0208<<14 | 0x30<<7 | 0x30, 20907 - 19968: jis0208<<14 | 0x30<<7 | 0x31, 20908 - 19968: jis0208<<14 | 0x24<<7 | 0x3E, 20909 - 19968: jis0212<<14 | 0x11<<7 | 0x57, 20912 - 19968: jis0208<<14 | 0x30<<7 | 0x35, 20913 - 19968: jis0208<<14 | 0x30<<7 | 0x33, 20914 - 19968: jis0208<<14 | 0x30<<7 | 0x34, 20915 - 19968: jis0208<<14 | 0x30<<7 | 0x32, 20916 - 19968: jis0208<<14 | 0x19<<7 | 0x42, 20917 - 19968: jis0208<<14 | 0x30<<7 | 0x36, 20918 - 19968: jis0208<<14 | 0x2B<<7 | 0x49, 20919 - 19968: jis0208<<14 | 0x2D<<7 | 0x43, 20920 - 19968: jis0212<<14 | 0x11<<7 | 0x58, 20922 - 19968: jis0212<<14 | 0x11<<7 | 0x59, 20924 - 19968: jis0212<<14 | 0x11<<7 | 0x5A, 20925 - 19968: jis0208<<14 | 0x30<<7 | 0x37, 20926 - 19968: jis0208<<14 | 0x58<<7 | 0x25, 20927 - 19968: jis0212<<14 | 0x11<<7 | 0x5C, 20930 - 19968: jis0212<<14 | 0x11<<7 | 0x5D, 20932 - 19968: jis0208<<14 | 0x1F<<7 | 0x07, 20933 - 19968: jis0208<<14 | 0x30<<7 | 0x38, 20934 - 19968: jis0208<<14 | 0x1C<<7 | 0x39, 20936 - 19968: jis0212<<14 | 0x12<<7 | 0x00, 20937 - 19968: jis0208<<14 | 0x30<<7 | 0x39, 20939 - 19968: jis0208<<14 | 0x22<<7 | 0x5B, 20940 - 19968: jis0208<<14 | 0x2D<<7 | 0x1E, 20941 - 19968: jis0208<<14 | 0x24<<7 | 0x3F, 20943 - 19968: jis0212<<14 | 0x12<<7 | 0x01, 20945 - 19968: jis0212<<14 | 0x12<<7 | 0x02, 20946 - 19968: jis0212<<14 | 0x12<<7 | 0x03, 20947 - 19968: jis0212<<14 | 0x12<<7 | 0x04, 20949 - 19968: jis0212<<14 | 0x12<<7 | 0x05, 20950 - 19968: jis0208<<14 | 0x31<<7 | 0x24, 20952 - 19968: jis0212<<14 | 0x12<<7 | 0x06, 20955 - 19968: jis0208<<14 | 0x30<<7 | 0x3A, 20956 - 19968: jis0208<<14 | 0x53<<7 | 0x04, 20957 - 19968: jis0208<<14 | 0x15<<7 | 0x24, 20958 - 19968: jis0212<<14 | 0x12<<7 | 0x07, 20960 - 19968: jis0208<<14 | 0x30<<7 | 0x3B, 20961 - 19968: jis0208<<14 | 0x2A<<7 | 0x3D, 20962 - 19968: jis0212<<14 | 0x12<<7 | 0x08, 20965 - 19968: jis0212<<14 | 0x12<<7 | 0x09, 20966 - 19968: jis0208<<14 | 0x1C<<7 | 0x47, 20967 - 19968: jis0208<<14 | 0x21<<7 | 0x5B, 20969 - 19968: jis0208<<14 | 0x30<<7 | 0x3D, 20970 - 19968: jis0208<<14 | 0x25<<7 | 0x43, 20972 - 19968: jis0208<<14 | 0x58<<7 | 0x26, 20973 - 19968: jis0208<<14 | 0x30<<7 | 0x3E, 20974 - 19968: jis0212<<14 | 0x12<<7 | 0x0A, 20976 - 19968: jis0208<<14 | 0x30<<7 | 0x3F, 20977 - 19968: jis0208<<14 | 0x12<<7 | 0x0D, 20978 - 19968: jis0212<<14 | 0x12<<7 | 0x0B, 20979 - 19968: jis0212<<14 | 0x12<<7 | 0x0C, 20980 - 19968: jis0212<<14 | 0x12<<7 | 0x0D, 20981 - 19968: jis0208<<14 | 0x30<<7 | 0x40, 20982 - 19968: jis0208<<14 | 0x15<<7 | 0x06, 20983 - 19968: jis0212<<14 | 0x12<<7 | 0x0E, 20984 - 19968: jis0208<<14 | 0x25<<7 | 0x2B, 20985 - 19968: jis0208<<14 | 0x10<<7 | 0x59, 20986 - 19968: jis0208<<14 | 0x1C<<7 | 0x2F, 20989 - 19968: jis0208<<14 | 0x27<<7 | 0x00, 20990 - 19968: jis0208<<14 | 0x30<<7 | 0x41, 20992 - 19968: jis0208<<14 | 0x24<<7 | 0x40, 20993 - 19968: jis0212<<14 | 0x12<<7 | 0x0F, 20994 - 19968: jis0212<<14 | 0x12<<7 | 0x10, 20995 - 19968: jis0208<<14 | 0x1E<<7 | 0x2E, 20996 - 19968: jis0208<<14 | 0x30<<7 | 0x42, 20997 - 19968: jis0212<<14 | 0x12<<7 | 0x11, 20998 - 19968: jis0208<<14 | 0x29<<7 | 0x0B, 20999 - 19968: jis0208<<14 | 0x1F<<7 | 0x39, 21000 - 19968: jis0208<<14 | 0x13<<7 | 0x01, 21002 - 19968: jis0208<<14 | 0x13<<7 | 0x08, 21003 - 19968: jis0208<<14 | 0x30<<7 | 0x43, 21006 - 19968: jis0208<<14 | 0x30<<7 | 0x45, 21009 - 19968: jis0208<<14 | 0x16<<7 | 0x19, 21010 - 19968: jis0212<<14 | 0x12<<7 | 0x12, 21011 - 19968: jis0212<<14 | 0x12<<7 | 0x13, 21012 - 19968: jis0208<<14 | 0x30<<7 | 0x44, 21013 - 19968: jis0208<<14 | 0x58<<7 | 0x27, 21014 - 19968: jis0212<<14 | 0x12<<7 | 0x15, 21015 - 19968: jis0208<<14 | 0x2D<<7 | 0x52, 21016 - 19968: jis0212<<14 | 0x12<<7 | 0x16, 21021 - 19968: jis0208<<14 | 0x1C<<7 | 0x48, 21026 - 19968: jis0212<<14 | 0x12<<7 | 0x17, 21028 - 19968: jis0208<<14 | 0x27<<7 | 0x1C, 21029 - 19968: jis0208<<14 | 0x29<<7 | 0x2B, 21031 - 19968: jis0208<<14 | 0x30<<7 | 0x46, 21032 - 19968: jis0212<<14 | 0x12<<7 | 0x18, 21033 - 19968: jis0208<<14 | 0x2C<<7 | 0x57, 21034 - 19968: jis0208<<14 | 0x30<<7 | 0x47, 21038 - 19968: jis0208<<14 | 0x30<<7 | 0x48, 21040 - 19968: jis0208<<14 | 0x24<<7 | 0x5D, 21041 - 19968: jis0212<<14 | 0x12<<7 | 0x19, 21042 - 19968: jis0212<<14 | 0x12<<7 | 0x1A, 21043 - 19968: jis0208<<14 | 0x30<<7 | 0x49, 21045 - 19968: jis0212<<14 | 0x12<<7 | 0x1B, 21046 - 19968: jis0208<<14 | 0x1F<<7 | 0x08, 21047 - 19968: jis0208<<14 | 0x19<<7 | 0x5D, 21048 - 19968: jis0208<<14 | 0x16<<7 | 0x53, 21049 - 19968: jis0208<<14 | 0x30<<7 | 0x4A, 21050 - 19968: jis0208<<14 | 0x1A<<7 | 0x28, 21051 - 19968: jis0208<<14 | 0x18<<7 | 0x4E, 21052 - 19968: jis0212<<14 | 0x12<<7 | 0x1C, 21059 - 19968: jis0208<<14 | 0x23<<7 | 0x45, 21060 - 19968: jis0208<<14 | 0x30<<7 | 0x4C, 21061 - 19968: jis0212<<14 | 0x12<<7 | 0x1D, 21063 - 19968: jis0208<<14 | 0x21<<7 | 0x06, 21065 - 19968: jis0212<<14 | 0x12<<7 | 0x1E, 21066 - 19968: jis0208<<14 | 0x19<<7 | 0x4E, 21067 - 19968: jis0208<<14 | 0x30<<7 | 0x4D, 21068 - 19968: jis0208<<14 | 0x30<<7 | 0x4E, 21069 - 19968: jis0208<<14 | 0x20<<7 | 0x0F, 21071 - 19968: jis0208<<14 | 0x30<<7 | 0x4B, 21076 - 19968: jis0208<<14 | 0x30<<7 | 0x50, 21077 - 19968: jis0212<<14 | 0x12<<7 | 0x1F, 21078 - 19968: jis0208<<14 | 0x2A<<7 | 0x15, 21079 - 19968: jis0212<<14 | 0x12<<7 | 0x20, 21080 - 19968: jis0212<<14 | 0x12<<7 | 0x21, 21082 - 19968: jis0212<<14 | 0x12<<7 | 0x22, 21083 - 19968: jis0208<<14 | 0x18<<7 | 0x43, 21084 - 19968: jis0212<<14 | 0x12<<7 | 0x23, 21086 - 19968: jis0208<<14 | 0x30<<7 | 0x4F, 21087 - 19968: jis0212<<14 | 0x12<<7 | 0x24, 21088 - 19968: jis0212<<14 | 0x12<<7 | 0x25, 21089 - 19968: jis0212<<14 | 0x12<<7 | 0x26, 21091 - 19968: jis0208<<14 | 0x16<<7 | 0x54, 21092 - 19968: jis0208<<14 | 0x19<<7 | 0x3D, 21093 - 19968: jis0208<<14 | 0x26<<7 | 0x4C, 21094 - 19968: jis0212<<14 | 0x12<<7 | 0x27, 21097 - 19968: jis0208<<14 | 0x30<<7 | 0x53, 21098 - 19968: jis0208<<14 | 0x30<<7 | 0x51, 21102 - 19968: jis0212<<14 | 0x12<<7 | 0x28, 21103 - 19968: jis0208<<14 | 0x28<<7 | 0x5A, 21104 - 19968: jis0208<<14 | 0x1D<<7 | 0x49, 21105 - 19968: jis0208<<14 | 0x30<<7 | 0x5A, 21106 - 19968: jis0208<<14 | 0x12<<7 | 0x43, 21107 - 19968: jis0208<<14 | 0x30<<7 | 0x54, 21108 - 19968: jis0208<<14 | 0x30<<7 | 0x52, 21109 - 19968: jis0208<<14 | 0x20<<7 | 0x2E, 21111 - 19968: jis0212<<14 | 0x12<<7 | 0x29, 21112 - 19968: jis0212<<14 | 0x12<<7 | 0x2A, 21113 - 19968: jis0212<<14 | 0x12<<7 | 0x2B, 21117 - 19968: jis0208<<14 | 0x30<<7 | 0x56, 21119 - 19968: jis0208<<14 | 0x30<<7 | 0x55, 21120 - 19968: jis0212<<14 | 0x12<<7 | 0x2C, 21122 - 19968: jis0212<<14 | 0x12<<7 | 0x2D, 21123 - 19968: jis0208<<14 | 0x12<<7 | 0x23, 21125 - 19968: jis0212<<14 | 0x12<<7 | 0x2E, 21127 - 19968: jis0208<<14 | 0x16<<7 | 0x3F, 21128 - 19968: jis0208<<14 | 0x30<<7 | 0x5B, 21129 - 19968: jis0208<<14 | 0x2D<<7 | 0x0C, 21130 - 19968: jis0212<<14 | 0x12<<7 | 0x2F, 21132 - 19968: jis0212<<14 | 0x12<<7 | 0x30, 21133 - 19968: jis0208<<14 | 0x30<<7 | 0x57, 21137 - 19968: jis0208<<14 | 0x30<<7 | 0x5C, 21138 - 19968: jis0208<<14 | 0x30<<7 | 0x59, 21139 - 19968: jis0212<<14 | 0x12<<7 | 0x31, 21140 - 19968: jis0208<<14 | 0x30<<7 | 0x58, 21141 - 19968: jis0212<<14 | 0x12<<7 | 0x32, 21142 - 19968: jis0212<<14 | 0x12<<7 | 0x33, 21143 - 19968: jis0212<<14 | 0x12<<7 | 0x34, 21144 - 19968: jis0212<<14 | 0x12<<7 | 0x35, 21146 - 19968: jis0212<<14 | 0x12<<7 | 0x36, 21147 - 19968: jis0208<<14 | 0x2D<<7 | 0x2E, 21148 - 19968: jis0208<<14 | 0x58<<7 | 0x28, 21151 - 19968: jis0208<<14 | 0x17<<7 | 0x58, 21152 - 19968: jis0208<<14 | 0x11<<7 | 0x22, 21155 - 19968: jis0208<<14 | 0x2D<<7 | 0x53, 21156 - 19968: jis0212<<14 | 0x12<<7 | 0x38, 21157 - 19968: jis0212<<14 | 0x12<<7 | 0x39, 21158 - 19968: jis0208<<14 | 0x58<<7 | 0x29, 21159 - 19968: jis0212<<14 | 0x12<<7 | 0x3B, 21161 - 19968: jis0208<<14 | 0x1C<<7 | 0x54, 21162 - 19968: jis0208<<14 | 0x24<<7 | 0x37, 21163 - 19968: jis0208<<14 | 0x18<<7 | 0x44, 21164 - 19968: jis0208<<14 | 0x31<<7 | 0x01, 21165 - 19968: jis0208<<14 | 0x31<<7 | 0x02, 21167 - 19968: jis0208<<14 | 0x5A<<7 | 0x1B, 21168 - 19968: jis0212<<14 | 0x12<<7 | 0x3D, 21169 - 19968: jis0208<<14 | 0x2D<<7 | 0x44, 21172 - 19968: jis0208<<14 | 0x2E<<7 | 0x0A, 21173 - 19968: jis0208<<14 | 0x31<<7 | 0x04, 21174 - 19968: jis0212<<14 | 0x12<<7 | 0x3E, 21175 - 19968: jis0212<<14 | 0x12<<7 | 0x3F, 21176 - 19968: jis0212<<14 | 0x12<<7 | 0x40, 21177 - 19968: jis0208<<14 | 0x17<<7 | 0x59, 21178 - 19968: jis0212<<14 | 0x12<<7 | 0x41, 21179 - 19968: jis0212<<14 | 0x12<<7 | 0x42, 21180 - 19968: jis0208<<14 | 0x31<<7 | 0x03, 21181 - 19968: jis0212<<14 | 0x12<<7 | 0x43, 21182 - 19968: jis0208<<14 | 0x12<<7 | 0x0E, 21184 - 19968: jis0208<<14 | 0x58<<7 | 0x2A, 21185 - 19968: jis0208<<14 | 0x31<<7 | 0x05, 21187 - 19968: jis0208<<14 | 0x2A<<7 | 0x35, 21188 - 19968: jis0212<<14 | 0x12<<7 | 0x45, 21189 - 19968: jis0208<<14 | 0x23<<7 | 0x1B, 21190 - 19968: jis0212<<14 | 0x12<<7 | 0x46, 21191 - 19968: jis0208<<14 | 0x2C<<7 | 0x05, 21192 - 19968: jis0212<<14 | 0x12<<7 | 0x47, 21193 - 19968: jis0208<<14 | 0x29<<7 | 0x38, 21196 - 19968: jis0212<<14 | 0x12<<7 | 0x48, 21197 - 19968: jis0208<<14 | 0x31<<7 | 0x06, 21199 - 19968: jis0212<<14 | 0x12<<7 | 0x49, 21201 - 19968: jis0212<<14 | 0x12<<7 | 0x4A, 21202 - 19968: jis0208<<14 | 0x4F<<7 | 0x34, 21204 - 19968: jis0212<<14 | 0x12<<7 | 0x4B, 21205 - 19968: jis0208<<14 | 0x25<<7 | 0x0F, 21206 - 19968: jis0212<<14 | 0x12<<7 | 0x4C, 21207 - 19968: jis0208<<14 | 0x31<<7 | 0x07, 21208 - 19968: jis0208<<14 | 0x13<<7 | 0x09, 21209 - 19968: jis0208<<14 | 0x2B<<7 | 0x12, 21211 - 19968: jis0208<<14 | 0x58<<7 | 0x2B, 21212 - 19968: jis0212<<14 | 0x12<<7 | 0x4E, 21213 - 19968: jis0208<<14 | 0x1D<<7 | 0x00, 21214 - 19968: jis0208<<14 | 0x31<<7 | 0x08, 21215 - 19968: jis0208<<14 | 0x29<<7 | 0x46, 21216 - 19968: jis0208<<14 | 0x31<<7 | 0x0C, 21217 - 19968: jis0212<<14 | 0x12<<7 | 0x4F, 21218 - 19968: jis0208<<14 | 0x1F<<7 | 0x09, 21219 - 19968: jis0208<<14 | 0x31<<7 | 0x09, 21220 - 19968: jis0208<<14 | 0x15<<7 | 0x2F, 21221 - 19968: jis0212<<14 | 0x12<<7 | 0x50, 21222 - 19968: jis0208<<14 | 0x31<<7 | 0x0A, 21223 - 19968: jis0208<<14 | 0x13<<7 | 0x0A, 21224 - 19968: jis0212<<14 | 0x12<<7 | 0x51, 21225 - 19968: jis0212<<14 | 0x12<<7 | 0x52, 21226 - 19968: jis0212<<14 | 0x12<<7 | 0x53, 21228 - 19968: jis0212<<14 | 0x12<<7 | 0x54, 21232 - 19968: jis0212<<14 | 0x12<<7 | 0x55, 21233 - 19968: jis0212<<14 | 0x12<<7 | 0x56, 21234 - 19968: jis0208<<14 | 0x16<<7 | 0x0D, 21235 - 19968: jis0208<<14 | 0x31<<7 | 0x0D, 21236 - 19968: jis0212<<14 | 0x12<<7 | 0x57, 21237 - 19968: jis0208<<14 | 0x31<<7 | 0x0E, 21238 - 19968: jis0212<<14 | 0x12<<7 | 0x58, 21239 - 19968: jis0212<<14 | 0x12<<7 | 0x59, 21240 - 19968: jis0208<<14 | 0x31<<7 | 0x0F, 21241 - 19968: jis0208<<14 | 0x31<<7 | 0x10, 21242 - 19968: jis0208<<14 | 0x1B<<7 | 0x3A, 21246 - 19968: jis0208<<14 | 0x17<<7 | 0x5A, 21247 - 19968: jis0208<<14 | 0x2B<<7 | 0x3D, 21248 - 19968: jis0208<<14 | 0x58<<7 | 0x2C, 21249 - 19968: jis0208<<14 | 0x2B<<7 | 0x47, 21250 - 19968: jis0208<<14 | 0x25<<7 | 0x56, 21251 - 19968: jis0212<<14 | 0x12<<7 | 0x5B, 21253 - 19968: jis0208<<14 | 0x29<<7 | 0x50, 21254 - 19968: jis0208<<14 | 0x31<<7 | 0x11, 21255 - 19968: jis0208<<14 | 0x58<<7 | 0x2D, 21256 - 19968: jis0208<<14 | 0x31<<7 | 0x12, 21258 - 19968: jis0212<<14 | 0x12<<7 | 0x5C, 21259 - 19968: jis0212<<14 | 0x12<<7 | 0x5D, 21260 - 19968: jis0212<<14 | 0x13<<7 | 0x00, 21261 - 19968: jis0208<<14 | 0x31<<7 | 0x14, 21263 - 19968: jis0208<<14 | 0x31<<7 | 0x16, 21264 - 19968: jis0208<<14 | 0x31<<7 | 0x15, 21265 - 19968: jis0212<<14 | 0x13<<7 | 0x01, 21267 - 19968: jis0212<<14 | 0x13<<7 | 0x02, 21269 - 19968: jis0208<<14 | 0x31<<7 | 0x17, 21270 - 19968: jis0208<<14 | 0x11<<7 | 0x1C, 21271 - 19968: jis0208<<14 | 0x2A<<7 | 0x2B, 21272 - 19968: jis0212<<14 | 0x13<<7 | 0x03, 21273 - 19968: jis0208<<14 | 0x19<<7 | 0x5B, 21274 - 19968: jis0208<<14 | 0x31<<7 | 0x18, 21275 - 19968: jis0212<<14 | 0x13<<7 | 0x04, 21276 - 19968: jis0212<<14 | 0x13<<7 | 0x05, 21277 - 19968: jis0208<<14 | 0x20<<7 | 0x38, 21278 - 19968: jis0212<<14 | 0x13<<7 | 0x06, 21279 - 19968: jis0212<<14 | 0x13<<7 | 0x07, 21280 - 19968: jis0208<<14 | 0x1D<<7 | 0x01, 21281 - 19968: jis0208<<14 | 0x15<<7 | 0x08, 21283 - 19968: jis0208<<14 | 0x31<<7 | 0x19, 21284 - 19968: jis0208<<14 | 0x58<<7 | 0x2E, 21285 - 19968: jis0212<<14 | 0x13<<7 | 0x08, 21287 - 19968: jis0212<<14 | 0x13<<7 | 0x09, 21288 - 19968: jis0212<<14 | 0x13<<7 | 0x0A, 21289 - 19968: jis0212<<14 | 0x13<<7 | 0x0B, 21290 - 19968: jis0208<<14 | 0x27<<7 | 0x3A, 21291 - 19968: jis0212<<14 | 0x13<<7 | 0x0C, 21292 - 19968: jis0212<<14 | 0x13<<7 | 0x0D, 21293 - 19968: jis0212<<14 | 0x13<<7 | 0x0E, 21295 - 19968: jis0208<<14 | 0x31<<7 | 0x1A, 21296 - 19968: jis0212<<14 | 0x13<<7 | 0x0F, 21297 - 19968: jis0208<<14 | 0x31<<7 | 0x1B, 21298 - 19968: jis0212<<14 | 0x13<<7 | 0x10, 21299 - 19968: jis0208<<14 | 0x31<<7 | 0x1C, 21301 - 19968: jis0212<<14 | 0x13<<7 | 0x11, 21304 - 19968: jis0208<<14 | 0x31<<7 | 0x1D, 21305 - 19968: jis0208<<14 | 0x28<<7 | 0x03, 21306 - 19968: jis0208<<14 | 0x15<<7 | 0x47, 21307 - 19968: jis0208<<14 | 0x0F<<7 | 0x44, 21308 - 19968: jis0212<<14 | 0x13<<7 | 0x12, 21309 - 19968: jis0212<<14 | 0x13<<7 | 0x13, 21310 - 19968: jis0212<<14 | 0x13<<7 | 0x14, 21311 - 19968: jis0208<<14 | 0x25<<7 | 0x1E, 21312 - 19968: jis0208<<14 | 0x31<<7 | 0x1E, 21313 - 19968: jis0208<<14 | 0x1C<<7 | 0x1C, 21314 - 19968: jis0212<<14 | 0x13<<7 | 0x15, 21315 - 19968: jis0208<<14 | 0x1F<<7 | 0x48, 21317 - 19968: jis0208<<14 | 0x31<<7 | 0x20, 21318 - 19968: jis0208<<14 | 0x31<<7 | 0x1F, 21319 - 19968: jis0208<<14 | 0x1D<<7 | 0x02, 21320 - 19968: jis0208<<14 | 0x17<<7 | 0x40, 21321 - 19968: jis0208<<14 | 0x31<<7 | 0x22, 21322 - 19968: jis0208<<14 | 0x27<<7 | 0x1D, 21323 - 19968: jis0212<<14 | 0x13<<7 | 0x17, 21324 - 19968: jis0212<<14 | 0x13<<7 | 0x16, 21325 - 19968: jis0208<<14 | 0x31<<7 | 0x23, 21329 - 19968: jis0208<<14 | 0x27<<7 | 0x3B, 21330 - 19968: jis0208<<14 | 0x21<<7 | 0x13, 21331 - 19968: jis0208<<14 | 0x21<<7 | 0x4D, 21332 - 19968: jis0208<<14 | 0x15<<7 | 0x07, 21335 - 19968: jis0208<<14 | 0x25<<7 | 0x4D, 21336 - 19968: jis0208<<14 | 0x22<<7 | 0x10, 21337 - 19968: jis0212<<14 | 0x13<<7 | 0x18, 21338 - 19968: jis0208<<14 | 0x26<<7 | 0x4D, 21339 - 19968: jis0212<<14 | 0x13<<7 | 0x19, 21340 - 19968: jis0208<<14 | 0x2A<<7 | 0x2D, 21342 - 19968: jis0208<<14 | 0x31<<7 | 0x25, 21344 - 19968: jis0208<<14 | 0x1F<<7 | 0x49, 21345 - 19968: jis0212<<14 | 0x13<<7 | 0x1A, 21347 - 19968: jis0212<<14 | 0x13<<7 | 0x1B, 21349 - 19968: jis0212<<14 | 0x13<<7 | 0x1C, 21350 - 19968: jis0208<<14 | 0x16<<7 | 0x14, 21353 - 19968: jis0208<<14 | 0x31<<7 | 0x26, 21356 - 19968: jis0212<<14 | 0x13<<7 | 0x1D, 21357 - 19968: jis0212<<14 | 0x13<<7 | 0x1E, 21358 - 19968: jis0208<<14 | 0x31<<7 | 0x27, 21359 - 19968: jis0208<<14 | 0x10<<7 | 0x0B, 21360 - 19968: jis0208<<14 | 0x0F<<7 | 0x54, 21361 - 19968: jis0208<<14 | 0x13<<7 | 0x4C, 21362 - 19968: jis0208<<14 | 0x58<<7 | 0x2F, 21363 - 19968: jis0208<<14 | 0x21<<7 | 0x07, 21364 - 19968: jis0208<<14 | 0x14<<7 | 0x30, 21365 - 19968: jis0208<<14 | 0x2C<<7 | 0x50, 21367 - 19968: jis0208<<14 | 0x31<<7 | 0x2A, 21368 - 19968: jis0208<<14 | 0x11<<7 | 0x16, 21369 - 19968: jis0212<<14 | 0x13<<7 | 0x20, 21371 - 19968: jis0208<<14 | 0x31<<7 | 0x29, 21374 - 19968: jis0212<<14 | 0x13<<7 | 0x21, 21375 - 19968: jis0208<<14 | 0x15<<7 | 0x09, 21378 - 19968: jis0208<<14 | 0x31<<7 | 0x2B, 21379 - 19968: jis0212<<14 | 0x13<<7 | 0x22, 21380 - 19968: jis0208<<14 | 0x2B<<7 | 0x50, 21383 - 19968: jis0212<<14 | 0x13<<7 | 0x23, 21384 - 19968: jis0212<<14 | 0x13<<7 | 0x24, 21390 - 19968: jis0212<<14 | 0x13<<7 | 0x25, 21395 - 19968: jis0208<<14 | 0x58<<7 | 0x30, 21396 - 19968: jis0212<<14 | 0x13<<7 | 0x27, 21398 - 19968: jis0208<<14 | 0x31<<7 | 0x2C, 21400 - 19968: jis0208<<14 | 0x2D<<7 | 0x31, 21401 - 19968: jis0212<<14 | 0x13<<7 | 0x28, 21402 - 19968: jis0208<<14 | 0x17<<7 | 0x5B, 21405 - 19968: jis0212<<14 | 0x13<<7 | 0x29, 21407 - 19968: jis0208<<14 | 0x17<<7 | 0x15, 21408 - 19968: jis0208<<14 | 0x31<<7 | 0x2D, 21409 - 19968: jis0212<<14 | 0x13<<7 | 0x2A, 21412 - 19968: jis0212<<14 | 0x13<<7 | 0x2B, 21413 - 19968: jis0208<<14 | 0x31<<7 | 0x2F, 21414 - 19968: jis0208<<14 | 0x31<<7 | 0x2E, 21416 - 19968: jis0208<<14 | 0x1E<<7 | 0x3E, 21417 - 19968: jis0208<<14 | 0x10<<7 | 0x18, 21418 - 19968: jis0212<<14 | 0x13<<7 | 0x2C, 21419 - 19968: jis0212<<14 | 0x13<<7 | 0x2D, 21421 - 19968: jis0208<<14 | 0x10<<7 | 0x3D, 21422 - 19968: jis0208<<14 | 0x31<<7 | 0x30, 21423 - 19968: jis0212<<14 | 0x13<<7 | 0x2E, 21424 - 19968: jis0208<<14 | 0x31<<7 | 0x31, 21426 - 19968: jis0208<<14 | 0x58<<7 | 0x31, 21427 - 19968: jis0208<<14 | 0x17<<7 | 0x16, 21428 - 19968: jis0212<<14 | 0x13<<7 | 0x30, 21429 - 19968: jis0212<<14 | 0x13<<7 | 0x31, 21430 - 19968: jis0208<<14 | 0x31<<7 | 0x32, 21431 - 19968: jis0212<<14 | 0x13<<7 | 0x32, 21432 - 19968: jis0212<<14 | 0x13<<7 | 0x33, 21434 - 19968: jis0212<<14 | 0x13<<7 | 0x34, 21435 - 19968: jis0208<<14 | 0x14<<7 | 0x4D, 21437 - 19968: jis0212<<14 | 0x13<<7 | 0x35, 21440 - 19968: jis0212<<14 | 0x13<<7 | 0x36, 21442 - 19968: jis0208<<14 | 0x1A<<7 | 0x11, 21443 - 19968: jis0208<<14 | 0x31<<7 | 0x33, 21445 - 19968: jis0212<<14 | 0x13<<7 | 0x37, 21448 - 19968: jis0208<<14 | 0x2A<<7 | 0x53, 21449 - 19968: jis0208<<14 | 0x19<<7 | 0x14, 21450 - 19968: jis0208<<14 | 0x14<<7 | 0x39, 21451 - 19968: jis0208<<14 | 0x2C<<7 | 0x06, 21452 - 19968: jis0208<<14 | 0x20<<7 | 0x2F, 21453 - 19968: jis0208<<14 | 0x27<<7 | 0x1E, 21454 - 19968: jis0208<<14 | 0x1B<<7 | 0x5C, 21455 - 19968: jis0212<<14 | 0x13<<7 | 0x38, 21458 - 19968: jis0212<<14 | 0x13<<7 | 0x39, 21459 - 19968: jis0212<<14 | 0x13<<7 | 0x3A, 21460 - 19968: jis0208<<14 | 0x1C<<7 | 0x26, 21461 - 19968: jis0212<<14 | 0x13<<7 | 0x3B, 21462 - 19968: jis0208<<14 | 0x1B<<7 | 0x47, 21463 - 19968: jis0208<<14 | 0x1B<<7 | 0x54, 21465 - 19968: jis0208<<14 | 0x1C<<7 | 0x55, 21466 - 19968: jis0212<<14 | 0x13<<7 | 0x3C, 21467 - 19968: jis0208<<14 | 0x27<<7 | 0x1F, 21469 - 19968: jis0208<<14 | 0x58<<7 | 0x32, 21470 - 19968: jis0212<<14 | 0x13<<7 | 0x3E, 21471 - 19968: jis0208<<14 | 0x31<<7 | 0x36, 21472 - 19968: jis0212<<14 | 0x13<<7 | 0x3F, 21473 - 19968: jis0208<<14 | 0x10<<7 | 0x22, 21474 - 19968: jis0208<<14 | 0x20<<7 | 0x30, 21475 - 19968: jis0208<<14 | 0x17<<7 | 0x5C, 21476 - 19968: jis0208<<14 | 0x17<<7 | 0x24, 21477 - 19968: jis0208<<14 | 0x15<<7 | 0x46, 21478 - 19968: jis0212<<14 | 0x13<<7 | 0x40, 21479 - 19968: jis0212<<14 | 0x13<<7 | 0x41, 21480 - 19968: jis0208<<14 | 0x31<<7 | 0x3A, 21481 - 19968: jis0208<<14 | 0x22<<7 | 0x00, 21482 - 19968: jis0208<<14 | 0x21<<7 | 0x5D, 21483 - 19968: jis0208<<14 | 0x15<<7 | 0x0A, 21484 - 19968: jis0208<<14 | 0x1D<<7 | 0x03, 21485 - 19968: jis0208<<14 | 0x31<<7 | 0x3B, 21486 - 19968: jis0208<<14 | 0x31<<7 | 0x39, 21487 - 19968: jis0208<<14 | 0x11<<7 | 0x23, 21488 - 19968: jis0208<<14 | 0x21<<7 | 0x45, 21489 - 19968: jis0208<<14 | 0x1B<<7 | 0x17, 21490 - 19968: jis0208<<14 | 0x1A<<7 | 0x2A, 21491 - 19968: jis0208<<14 | 0x10<<7 | 0x05, 21493 - 19968: jis0212<<14 | 0x13<<7 | 0x42, 21494 - 19968: jis0208<<14 | 0x12<<7 | 0x4F, 21495 - 19968: jis0208<<14 | 0x18<<7 | 0x45, 21496 - 19968: jis0208<<14 | 0x1A<<7 | 0x29, 21498 - 19968: jis0208<<14 | 0x31<<7 | 0x3C, 21505 - 19968: jis0208<<14 | 0x31<<7 | 0x3D, 21506 - 19968: jis0212<<14 | 0x13<<7 | 0x43, 21507 - 19968: jis0208<<14 | 0x14<<7 | 0x28, 21508 - 19968: jis0208<<14 | 0x12<<7 | 0x25, 21512 - 19968: jis0208<<14 | 0x18<<7 | 0x46, 21513 - 19968: jis0208<<14 | 0x14<<7 | 0x27, 21514 - 19968: jis0208<<14 | 0x23<<7 | 0x3E, 21515 - 19968: jis0208<<14 | 0x10<<7 | 0x04, 21516 - 19968: jis0208<<14 | 0x25<<7 | 0x10, 21517 - 19968: jis0208<<14 | 0x2B<<7 | 0x1D, 21518 - 19968: jis0208<<14 | 0x18<<7 | 0x00, 21519 - 19968: jis0208<<14 | 0x2C<<7 | 0x58, 21520 - 19968: jis0208<<14 | 0x24<<7 | 0x26, 21521 - 19968: jis0208<<14 | 0x17<<7 | 0x5D, 21523 - 19968: jis0212<<14 | 0x13<<7 | 0x44, 21530 - 19968: jis0212<<14 | 0x13<<7 | 0x45, 21531 - 19968: jis0208<<14 | 0x16<<7 | 0x0E, 21533 - 19968: jis0208<<14 | 0x31<<7 | 0x46, 21535 - 19968: jis0208<<14 | 0x15<<7 | 0x42, 21536 - 19968: jis0208<<14 | 0x2A<<7 | 0x29, 21537 - 19968: jis0212<<14 | 0x13<<7 | 0x46, 21542 - 19968: jis0208<<14 | 0x27<<7 | 0x3C, 21543 - 19968: jis0212<<14 | 0x13<<7 | 0x47, 21544 - 19968: jis0212<<14 | 0x13<<7 | 0x48, 21545 - 19968: jis0208<<14 | 0x31<<7 | 0x45, 21546 - 19968: jis0212<<14 | 0x13<<7 | 0x49, 21547 - 19968: jis0208<<14 | 0x13<<7 | 0x3D, 21548 - 19968: jis0208<<14 | 0x31<<7 | 0x40, 21549 - 19968: jis0208<<14 | 0x31<<7 | 0x41, 21550 - 19968: jis0208<<14 | 0x31<<7 | 0x43, 21551 - 19968: jis0212<<14 | 0x13<<7 | 0x4A, 21553 - 19968: jis0212<<14 | 0x13<<7 | 0x4B, 21556 - 19968: jis0212<<14 | 0x13<<7 | 0x4C, 21557 - 19968: jis0212<<14 | 0x13<<7 | 0x4D, 21558 - 19968: jis0208<<14 | 0x31<<7 | 0x44, 21560 - 19968: jis0208<<14 | 0x14<<7 | 0x3A, 21561 - 19968: jis0208<<14 | 0x1E<<7 | 0x40, 21563 - 19968: jis0208<<14 | 0x29<<7 | 0x0C, 21564 - 19968: jis0208<<14 | 0x31<<7 | 0x42, 21565 - 19968: jis0208<<14 | 0x31<<7 | 0x3E, 21566 - 19968: jis0208<<14 | 0x17<<7 | 0x42, 21568 - 19968: jis0208<<14 | 0x31<<7 | 0x3F, 21570 - 19968: jis0208<<14 | 0x2E<<7 | 0x03, 21571 - 19968: jis0212<<14 | 0x13<<7 | 0x4E, 21572 - 19968: jis0212<<14 | 0x13<<7 | 0x4F, 21574 - 19968: jis0208<<14 | 0x29<<7 | 0x51, 21575 - 19968: jis0212<<14 | 0x13<<7 | 0x50, 21576 - 19968: jis0208<<14 | 0x23<<7 | 0x47, 21577 - 19968: jis0208<<14 | 0x17<<7 | 0x41, 21578 - 19968: jis0208<<14 | 0x18<<7 | 0x4F, 21581 - 19968: jis0212<<14 | 0x13<<7 | 0x51, 21582 - 19968: jis0208<<14 | 0x31<<7 | 0x47, 21583 - 19968: jis0212<<14 | 0x13<<7 | 0x52, 21585 - 19968: jis0208<<14 | 0x25<<7 | 0x3C, 21598 - 19968: jis0212<<14 | 0x13<<7 | 0x53, 21599 - 19968: jis0208<<14 | 0x31<<7 | 0x4B, 21602 - 19968: jis0212<<14 | 0x13<<7 | 0x54, 21604 - 19968: jis0212<<14 | 0x13<<7 | 0x55, 21606 - 19968: jis0212<<14 | 0x13<<7 | 0x56, 21607 - 19968: jis0212<<14 | 0x13<<7 | 0x57, 21608 - 19968: jis0208<<14 | 0x1B<<7 | 0x5D, 21609 - 19968: jis0212<<14 | 0x13<<7 | 0x58, 21610 - 19968: jis0208<<14 | 0x1B<<7 | 0x55, 21611 - 19968: jis0212<<14 | 0x13<<7 | 0x59, 21613 - 19968: jis0212<<14 | 0x13<<7 | 0x5A, 21614 - 19968: jis0212<<14 | 0x13<<7 | 0x5B, 21616 - 19968: jis0208<<14 | 0x31<<7 | 0x4E, 21617 - 19968: jis0208<<14 | 0x31<<7 | 0x4C, 21619 - 19968: jis0208<<14 | 0x2B<<7 | 0x02, 21620 - 19968: jis0212<<14 | 0x13<<7 | 0x5C, 21621 - 19968: jis0208<<14 | 0x31<<7 | 0x49, 21622 - 19968: jis0208<<14 | 0x31<<7 | 0x52, 21623 - 19968: jis0208<<14 | 0x31<<7 | 0x4D, 21627 - 19968: jis0208<<14 | 0x31<<7 | 0x50, 21628 - 19968: jis0208<<14 | 0x17<<7 | 0x25, 21629 - 19968: jis0208<<14 | 0x2B<<7 | 0x1E, 21631 - 19968: jis0212<<14 | 0x13<<7 | 0x5D, 21632 - 19968: jis0208<<14 | 0x31<<7 | 0x51, 21633 - 19968: jis0212<<14 | 0x14<<7 | 0x00, 21635 - 19968: jis0212<<14 | 0x14<<7 | 0x01, 21636 - 19968: jis0208<<14 | 0x31<<7 | 0x53, 21637 - 19968: jis0212<<14 | 0x14<<7 | 0x02, 21638 - 19968: jis0208<<14 | 0x31<<7 | 0x55, 21640 - 19968: jis0212<<14 | 0x14<<7 | 0x03, 21641 - 19968: jis0212<<14 | 0x14<<7 | 0x04, 21642 - 19968: jis0208<<14 | 0x58<<7 | 0x35, 21643 - 19968: jis0208<<14 | 0x19<<7 | 0x4F, 21644 - 19968: jis0208<<14 | 0x2E<<7 | 0x21, 21645 - 19968: jis0212<<14 | 0x14<<7 | 0x05, 21646 - 19968: jis0208<<14 | 0x31<<7 | 0x4A, 21647 - 19968: jis0208<<14 | 0x31<<7 | 0x48, 21648 - 19968: jis0208<<14 | 0x31<<7 | 0x54, 21649 - 19968: jis0212<<14 | 0x14<<7 | 0x06, 21650 - 19968: jis0208<<14 | 0x31<<7 | 0x4F, 21653 - 19968: jis0212<<14 | 0x14<<7 | 0x07, 21654 - 19968: jis0212<<14 | 0x14<<7 | 0x08, 21660 - 19968: jis0208<<14 | 0x58<<7 | 0x34, 21663 - 19968: jis0212<<14 | 0x14<<7 | 0x0A, 21665 - 19968: jis0212<<14 | 0x14<<7 | 0x0B, 21666 - 19968: jis0208<<14 | 0x31<<7 | 0x57, 21668 - 19968: jis0208<<14 | 0x32<<7 | 0x02, 21669 - 19968: jis0208<<14 | 0x31<<7 | 0x59, 21670 - 19968: jis0212<<14 | 0x14<<7 | 0x0C, 21671 - 19968: jis0212<<14 | 0x14<<7 | 0x0D, 21672 - 19968: jis0208<<14 | 0x31<<7 | 0x5D, 21673 - 19968: jis0208<<14 | 0x58<<7 | 0x36, 21674 - 19968: jis0212<<14 | 0x14<<7 | 0x0F, 21675 - 19968: jis0208<<14 | 0x32<<7 | 0x00, 21676 - 19968: jis0208<<14 | 0x31<<7 | 0x5A, 21677 - 19968: jis0212<<14 | 0x14<<7 | 0x10, 21678 - 19968: jis0212<<14 | 0x14<<7 | 0x11, 21679 - 19968: jis0208<<14 | 0x32<<7 | 0x1D, 21681 - 19968: jis0212<<14 | 0x14<<7 | 0x12, 21682 - 19968: jis0208<<14 | 0x19<<7 | 0x48, 21683 - 19968: jis0208<<14 | 0x12<<7 | 0x10, 21687 - 19968: jis0212<<14 | 0x14<<7 | 0x13, 21688 - 19968: jis0208<<14 | 0x31<<7 | 0x58, 21689 - 19968: jis0212<<14 | 0x14<<7 | 0x14, 21690 - 19968: jis0212<<14 | 0x14<<7 | 0x15, 21691 - 19968: jis0212<<14 | 0x14<<7 | 0x16, 21692 - 19968: jis0208<<14 | 0x32<<7 | 0x04, 21693 - 19968: jis0208<<14 | 0x0F<<7 | 0x55, 21694 - 19968: jis0208<<14 | 0x32<<7 | 0x03, 21695 - 19968: jis0212<<14 | 0x14<<7 | 0x17, 21696 - 19968: jis0208<<14 | 0x0F<<7 | 0x04, 21697 - 19968: jis0208<<14 | 0x28<<7 | 0x29, 21698 - 19968: jis0208<<14 | 0x32<<7 | 0x01, 21700 - 19968: jis0208<<14 | 0x31<<7 | 0x5B, 21702 - 19968: jis0212<<14 | 0x14<<7 | 0x18, 21703 - 19968: jis0208<<14 | 0x31<<7 | 0x56, 21704 - 19968: jis0208<<14 | 0x31<<7 | 0x5C, 21705 - 19968: jis0208<<14 | 0x19<<7 | 0x27, 21706 - 19968: jis0212<<14 | 0x14<<7 | 0x19, 21709 - 19968: jis0212<<14 | 0x14<<7 | 0x1A, 21710 - 19968: jis0212<<14 | 0x14<<7 | 0x1B, 21720 - 19968: jis0208<<14 | 0x32<<7 | 0x05, 21728 - 19968: jis0212<<14 | 0x14<<7 | 0x1C, 21729 - 19968: jis0208<<14 | 0x0F<<7 | 0x56, 21730 - 19968: jis0208<<14 | 0x32<<7 | 0x0E, 21733 - 19968: jis0208<<14 | 0x32<<7 | 0x06, 21734 - 19968: jis0208<<14 | 0x32<<7 | 0x07, 21736 - 19968: jis0208<<14 | 0x1D<<7 | 0x04, 21737 - 19968: jis0208<<14 | 0x2A<<7 | 0x48, 21738 - 19968: jis0212<<14 | 0x14<<7 | 0x1D, 21740 - 19968: jis0212<<14 | 0x14<<7 | 0x1E, 21741 - 19968: jis0208<<14 | 0x32<<7 | 0x0C, 21742 - 19968: jis0208<<14 | 0x32<<7 | 0x0B, 21743 - 19968: jis0212<<14 | 0x14<<7 | 0x1F, 21746 - 19968: jis0208<<14 | 0x24<<7 | 0x0E, 21750 - 19968: jis0212<<14 | 0x14<<7 | 0x20, 21754 - 19968: jis0208<<14 | 0x32<<7 | 0x0D, 21756 - 19968: jis0212<<14 | 0x14<<7 | 0x21, 21757 - 19968: jis0208<<14 | 0x32<<7 | 0x0A, 21758 - 19968: jis0212<<14 | 0x14<<7 | 0x22, 21759 - 19968: jis0208<<14 | 0x58<<7 | 0x37, 21760 - 19968: jis0212<<14 | 0x14<<7 | 0x24, 21761 - 19968: jis0212<<14 | 0x14<<7 | 0x25, 21764 - 19968: jis0208<<14 | 0x10<<7 | 0x13, 21765 - 19968: jis0212<<14 | 0x14<<7 | 0x26, 21766 - 19968: jis0208<<14 | 0x19<<7 | 0x15, 21767 - 19968: jis0208<<14 | 0x1E<<7 | 0x0F, 21768 - 19968: jis0212<<14 | 0x14<<7 | 0x27, 21769 - 19968: jis0212<<14 | 0x14<<7 | 0x28, 21772 - 19968: jis0212<<14 | 0x14<<7 | 0x29, 21773 - 19968: jis0212<<14 | 0x14<<7 | 0x2A, 21774 - 19968: jis0212<<14 | 0x14<<7 | 0x2B, 21775 - 19968: jis0208<<14 | 0x32<<7 | 0x08, 21776 - 19968: jis0208<<14 | 0x24<<7 | 0x41, 21780 - 19968: jis0208<<14 | 0x32<<7 | 0x09, 21781 - 19968: jis0212<<14 | 0x14<<7 | 0x2C, 21782 - 19968: jis0208<<14 | 0x0F<<7 | 0x01, 21802 - 19968: jis0212<<14 | 0x14<<7 | 0x2D, 21803 - 19968: jis0212<<14 | 0x14<<7 | 0x2E, 21806 - 19968: jis0208<<14 | 0x32<<7 | 0x13, 21807 - 19968: jis0208<<14 | 0x2C<<7 | 0x02, 21809 - 19968: jis0208<<14 | 0x1D<<7 | 0x06, 21810 - 19968: jis0212<<14 | 0x14<<7 | 0x2F, 21811 - 19968: jis0208<<14 | 0x32<<7 | 0x19, 21813 - 19968: jis0212<<14 | 0x14<<7 | 0x30, 21814 - 19968: jis0212<<14 | 0x14<<7 | 0x31, 21816 - 19968: jis0208<<14 | 0x32<<7 | 0x18, 21817 - 19968: jis0208<<14 | 0x32<<7 | 0x0F, 21819 - 19968: jis0212<<14 | 0x14<<7 | 0x32, 21820 - 19968: jis0212<<14 | 0x14<<7 | 0x33, 21821 - 19968: jis0212<<14 | 0x14<<7 | 0x34, 21822 - 19968: jis0208<<14 | 0x21<<7 | 0x22, 21824 - 19968: jis0208<<14 | 0x32<<7 | 0x10, 21825 - 19968: jis0212<<14 | 0x14<<7 | 0x35, 21828 - 19968: jis0208<<14 | 0x21<<7 | 0x4E, 21829 - 19968: jis0208<<14 | 0x32<<7 | 0x15, 21830 - 19968: jis0208<<14 | 0x1D<<7 | 0x05, 21831 - 19968: jis0212<<14 | 0x14<<7 | 0x36, 21833 - 19968: jis0212<<14 | 0x14<<7 | 0x37, 21834 - 19968: jis0212<<14 | 0x14<<7 | 0x38, 21836 - 19968: jis0208<<14 | 0x32<<7 | 0x12, 21837 - 19968: jis0212<<14 | 0x14<<7 | 0x39, 21839 - 19968: jis0208<<14 | 0x2B<<7 | 0x43, 21840 - 19968: jis0212<<14 | 0x14<<7 | 0x3A, 21841 - 19968: jis0212<<14 | 0x14<<7 | 0x3B, 21843 - 19968: jis0208<<14 | 0x16<<7 | 0x1B, 21846 - 19968: jis0208<<14 | 0x32<<7 | 0x16, 21847 - 19968: jis0208<<14 | 0x32<<7 | 0x17, 21848 - 19968: jis0212<<14 | 0x14<<7 | 0x3C, 21850 - 19968: jis0212<<14 | 0x14<<7 | 0x3D, 21851 - 19968: jis0212<<14 | 0x14<<7 | 0x3E, 21852 - 19968: jis0208<<14 | 0x32<<7 | 0x14, 21853 - 19968: jis0208<<14 | 0x32<<7 | 0x1A, 21854 - 19968: jis0212<<14 | 0x14<<7 | 0x3F, 21856 - 19968: jis0212<<14 | 0x14<<7 | 0x40, 21857 - 19968: jis0212<<14 | 0x14<<7 | 0x41, 21859 - 19968: jis0208<<14 | 0x32<<7 | 0x11, 21860 - 19968: jis0212<<14 | 0x14<<7 | 0x42, 21862 - 19968: jis0212<<14 | 0x14<<7 | 0x43, 21883 - 19968: jis0208<<14 | 0x32<<7 | 0x20, 21884 - 19968: jis0208<<14 | 0x32<<7 | 0x25, 21886 - 19968: jis0208<<14 | 0x32<<7 | 0x21, 21887 - 19968: jis0212<<14 | 0x14<<7 | 0x44, 21888 - 19968: jis0208<<14 | 0x32<<7 | 0x1C, 21889 - 19968: jis0212<<14 | 0x14<<7 | 0x45, 21890 - 19968: jis0212<<14 | 0x14<<7 | 0x46, 21891 - 19968: jis0208<<14 | 0x32<<7 | 0x26, 21892 - 19968: jis0208<<14 | 0x20<<7 | 0x10, 21894 - 19968: jis0208<<14 | 0x58<<7 | 0x38, 21895 - 19968: jis0208<<14 | 0x32<<7 | 0x28, 21896 - 19968: jis0212<<14 | 0x14<<7 | 0x48, 21897 - 19968: jis0208<<14 | 0x18<<7 | 0x01, 21898 - 19968: jis0208<<14 | 0x32<<7 | 0x1E, 21899 - 19968: jis0208<<14 | 0x22<<7 | 0x5C, 21902 - 19968: jis0212<<14 | 0x14<<7 | 0x49, 21903 - 19968: jis0212<<14 | 0x14<<7 | 0x4A, 21905 - 19968: jis0212<<14 | 0x14<<7 | 0x4B, 21906 - 19968: jis0212<<14 | 0x14<<7 | 0x4C, 21907 - 19968: jis0212<<14 | 0x14<<7 | 0x4D, 21908 - 19968: jis0212<<14 | 0x14<<7 | 0x4E, 21911 - 19968: jis0212<<14 | 0x14<<7 | 0x4F, 21912 - 19968: jis0208<<14 | 0x32<<7 | 0x22, 21913 - 19968: jis0208<<14 | 0x32<<7 | 0x1B, 21914 - 19968: jis0208<<14 | 0x13<<7 | 0x0C, 21916 - 19968: jis0208<<14 | 0x13<<7 | 0x4D, 21917 - 19968: jis0208<<14 | 0x12<<7 | 0x44, 21918 - 19968: jis0208<<14 | 0x32<<7 | 0x23, 21919 - 19968: jis0208<<14 | 0x32<<7 | 0x1F, 21923 - 19968: jis0212<<14 | 0x14<<7 | 0x50, 21924 - 19968: jis0212<<14 | 0x14<<7 | 0x51, 21927 - 19968: jis0208<<14 | 0x16<<7 | 0x55, 21928 - 19968: jis0208<<14 | 0x32<<7 | 0x29, 21929 - 19968: jis0208<<14 | 0x32<<7 | 0x27, 21930 - 19968: jis0208<<14 | 0x20<<7 | 0x32, 21931 - 19968: jis0208<<14 | 0x14<<7 | 0x29, 21932 - 19968: jis0208<<14 | 0x15<<7 | 0x0B, 21933 - 19968: jis0212<<14 | 0x14<<7 | 0x52, 21934 - 19968: jis0208<<14 | 0x32<<7 | 0x24, 21936 - 19968: jis0208<<14 | 0x15<<7 | 0x53, 21938 - 19968: jis0212<<14 | 0x14<<7 | 0x53, 21942 - 19968: jis0208<<14 | 0x10<<7 | 0x23, 21951 - 19968: jis0212<<14 | 0x14<<7 | 0x54, 21953 - 19968: jis0212<<14 | 0x14<<7 | 0x55, 21955 - 19968: jis0212<<14 | 0x14<<7 | 0x56, 21956 - 19968: jis0208<<14 | 0x32<<7 | 0x2D, 21957 - 19968: jis0208<<14 | 0x32<<7 | 0x2B, 21958 - 19968: jis0212<<14 | 0x14<<7 | 0x57, 21959 - 19968: jis0208<<14 | 0x33<<7 | 0x06, 21961 - 19968: jis0212<<14 | 0x14<<7 | 0x58, 21963 - 19968: jis0212<<14 | 0x14<<7 | 0x59, 21964 - 19968: jis0212<<14 | 0x14<<7 | 0x5A, 21966 - 19968: jis0212<<14 | 0x14<<7 | 0x5B, 21969 - 19968: jis0212<<14 | 0x14<<7 | 0x5C, 21970 - 19968: jis0212<<14 | 0x14<<7 | 0x5D, 21971 - 19968: jis0212<<14 | 0x15<<7 | 0x00, 21972 - 19968: jis0208<<14 | 0x32<<7 | 0x30, 21975 - 19968: jis0212<<14 | 0x15<<7 | 0x01, 21976 - 19968: jis0212<<14 | 0x15<<7 | 0x02, 21978 - 19968: jis0208<<14 | 0x32<<7 | 0x2A, 21979 - 19968: jis0212<<14 | 0x15<<7 | 0x03, 21980 - 19968: jis0208<<14 | 0x32<<7 | 0x2E, 21982 - 19968: jis0212<<14 | 0x15<<7 | 0x04, 21983 - 19968: jis0208<<14 | 0x32<<7 | 0x2C, 21986 - 19968: jis0212<<14 | 0x15<<7 | 0x05, 21987 - 19968: jis0208<<14 | 0x1A<<7 | 0x2B, 21988 - 19968: jis0208<<14 | 0x32<<7 | 0x2F, 21993 - 19968: jis0212<<14 | 0x15<<7 | 0x06, 22006 - 19968: jis0212<<14 | 0x15<<7 | 0x07, 22007 - 19968: jis0208<<14 | 0x32<<7 | 0x32, 22009 - 19968: jis0208<<14 | 0x32<<7 | 0x37, 22013 - 19968: jis0208<<14 | 0x32<<7 | 0x35, 22014 - 19968: jis0208<<14 | 0x32<<7 | 0x34, 22015 - 19968: jis0212<<14 | 0x15<<7 | 0x08, 22021 - 19968: jis0212<<14 | 0x15<<7 | 0x09, 22022 - 19968: jis0208<<14 | 0x22<<7 | 0x11, 22024 - 19968: jis0212<<14 | 0x15<<7 | 0x0A, 22025 - 19968: jis0208<<14 | 0x11<<7 | 0x24, 22026 - 19968: jis0212<<14 | 0x15<<7 | 0x0B, 22029 - 19968: jis0212<<14 | 0x15<<7 | 0x0C, 22030 - 19968: jis0212<<14 | 0x15<<7 | 0x0D, 22031 - 19968: jis0212<<14 | 0x15<<7 | 0x0E, 22032 - 19968: jis0212<<14 | 0x15<<7 | 0x0F, 22033 - 19968: jis0212<<14 | 0x15<<7 | 0x10, 22034 - 19968: jis0212<<14 | 0x15<<7 | 0x11, 22036 - 19968: jis0208<<14 | 0x32<<7 | 0x31, 22038 - 19968: jis0208<<14 | 0x32<<7 | 0x33, 22039 - 19968: jis0208<<14 | 0x1D<<7 | 0x07, 22040 - 19968: jis0208<<14 | 0x10<<7 | 0x12, 22041 - 19968: jis0212<<14 | 0x15<<7 | 0x12, 22043 - 19968: jis0208<<14 | 0x32<<7 | 0x36, 22057 - 19968: jis0208<<14 | 0x11<<7 | 0x3D, 22060 - 19968: jis0212<<14 | 0x15<<7 | 0x13, 22063 - 19968: jis0208<<14 | 0x32<<7 | 0x41, 22064 - 19968: jis0212<<14 | 0x15<<7 | 0x14, 22065 - 19968: jis0208<<14 | 0x1D<<7 | 0x5B, 22066 - 19968: jis0208<<14 | 0x32<<7 | 0x3D, 22067 - 19968: jis0212<<14 | 0x15<<7 | 0x15, 22068 - 19968: jis0208<<14 | 0x32<<7 | 0x3B, 22069 - 19968: jis0212<<14 | 0x15<<7 | 0x16, 22070 - 19968: jis0208<<14 | 0x32<<7 | 0x3C, 22071 - 19968: jis0212<<14 | 0x15<<7 | 0x17, 22072 - 19968: jis0208<<14 | 0x32<<7 | 0x3E, 22073 - 19968: jis0212<<14 | 0x15<<7 | 0x18, 22075 - 19968: jis0212<<14 | 0x15<<7 | 0x19, 22076 - 19968: jis0212<<14 | 0x15<<7 | 0x1A, 22077 - 19968: jis0212<<14 | 0x15<<7 | 0x1B, 22079 - 19968: jis0212<<14 | 0x15<<7 | 0x1C, 22080 - 19968: jis0212<<14 | 0x15<<7 | 0x1D, 22081 - 19968: jis0212<<14 | 0x15<<7 | 0x1E, 22082 - 19968: jis0208<<14 | 0x10<<7 | 0x1C, 22083 - 19968: jis0212<<14 | 0x15<<7 | 0x1F, 22084 - 19968: jis0212<<14 | 0x15<<7 | 0x20, 22086 - 19968: jis0212<<14 | 0x15<<7 | 0x21, 22089 - 19968: jis0212<<14 | 0x15<<7 | 0x22, 22091 - 19968: jis0212<<14 | 0x15<<7 | 0x23, 22092 - 19968: jis0208<<14 | 0x20<<7 | 0x18, 22093 - 19968: jis0212<<14 | 0x15<<7 | 0x24, 22094 - 19968: jis0208<<14 | 0x32<<7 | 0x38, 22095 - 19968: jis0212<<14 | 0x15<<7 | 0x25, 22096 - 19968: jis0208<<14 | 0x32<<7 | 0x39, 22100 - 19968: jis0212<<14 | 0x15<<7 | 0x26, 22107 - 19968: jis0208<<14 | 0x12<<7 | 0x59, 22110 - 19968: jis0212<<14 | 0x15<<7 | 0x27, 22112 - 19968: jis0212<<14 | 0x15<<7 | 0x28, 22113 - 19968: jis0212<<14 | 0x15<<7 | 0x29, 22114 - 19968: jis0212<<14 | 0x15<<7 | 0x2A, 22115 - 19968: jis0212<<14 | 0x15<<7 | 0x2B, 22116 - 19968: jis0208<<14 | 0x32<<7 | 0x40, 22118 - 19968: jis0212<<14 | 0x15<<7 | 0x2C, 22120 - 19968: jis0208<<14 | 0x13<<7 | 0x4E, 22121 - 19968: jis0212<<14 | 0x15<<7 | 0x2D, 22122 - 19968: jis0208<<14 | 0x32<<7 | 0x43, 22123 - 19968: jis0208<<14 | 0x32<<7 | 0x3F, 22124 - 19968: jis0208<<14 | 0x32<<7 | 0x42, 22125 - 19968: jis0212<<14 | 0x15<<7 | 0x2E, 22127 - 19968: jis0212<<14 | 0x15<<7 | 0x2F, 22129 - 19968: jis0212<<14 | 0x15<<7 | 0x30, 22130 - 19968: jis0212<<14 | 0x15<<7 | 0x31, 22132 - 19968: jis0208<<14 | 0x29<<7 | 0x0D, 22133 - 19968: jis0212<<14 | 0x15<<7 | 0x32, 22136 - 19968: jis0208<<14 | 0x25<<7 | 0x34, 22138 - 19968: jis0208<<14 | 0x27<<7 | 0x17, 22144 - 19968: jis0208<<14 | 0x32<<7 | 0x45, 22148 - 19968: jis0212<<14 | 0x15<<7 | 0x33, 22149 - 19968: jis0212<<14 | 0x15<<7 | 0x34, 22150 - 19968: jis0208<<14 | 0x32<<7 | 0x44, 22151 - 19968: jis0208<<14 | 0x12<<7 | 0x24, 22152 - 19968: jis0212<<14 | 0x15<<7 | 0x35, 22154 - 19968: jis0208<<14 | 0x32<<7 | 0x46, 22155 - 19968: jis0212<<14 | 0x15<<7 | 0x36, 22156 - 19968: jis0212<<14 | 0x15<<7 | 0x37, 22159 - 19968: jis0208<<14 | 0x32<<7 | 0x49, 22164 - 19968: jis0208<<14 | 0x32<<7 | 0x48, 22165 - 19968: jis0212<<14 | 0x15<<7 | 0x38, 22169 - 19968: jis0212<<14 | 0x15<<7 | 0x39, 22170 - 19968: jis0212<<14 | 0x15<<7 | 0x3A, 22173 - 19968: jis0212<<14 | 0x15<<7 | 0x3B, 22174 - 19968: jis0212<<14 | 0x15<<7 | 0x3C, 22175 - 19968: jis0212<<14 | 0x15<<7 | 0x3D, 22176 - 19968: jis0208<<14 | 0x32<<7 | 0x47, 22178 - 19968: jis0208<<14 | 0x26<<7 | 0x18, 22181 - 19968: jis0208<<14 | 0x32<<7 | 0x4A, 22182 - 19968: jis0212<<14 | 0x15<<7 | 0x3E, 22183 - 19968: jis0212<<14 | 0x15<<7 | 0x3F, 22184 - 19968: jis0212<<14 | 0x15<<7 | 0x40, 22185 - 19968: jis0212<<14 | 0x15<<7 | 0x41, 22187 - 19968: jis0212<<14 | 0x15<<7 | 0x42, 22188 - 19968: jis0212<<14 | 0x15<<7 | 0x43, 22189 - 19968: jis0212<<14 | 0x15<<7 | 0x44, 22190 - 19968: jis0208<<14 | 0x32<<7 | 0x4B, 22193 - 19968: jis0212<<14 | 0x15<<7 | 0x45, 22195 - 19968: jis0212<<14 | 0x15<<7 | 0x46, 22196 - 19968: jis0208<<14 | 0x32<<7 | 0x4D, 22198 - 19968: jis0208<<14 | 0x32<<7 | 0x4C, 22199 - 19968: jis0212<<14 | 0x15<<7 | 0x47, 22204 - 19968: jis0208<<14 | 0x32<<7 | 0x4F, 22206 - 19968: jis0212<<14 | 0x15<<7 | 0x48, 22208 - 19968: jis0208<<14 | 0x32<<7 | 0x52, 22209 - 19968: jis0208<<14 | 0x32<<7 | 0x50, 22210 - 19968: jis0208<<14 | 0x32<<7 | 0x4E, 22211 - 19968: jis0208<<14 | 0x32<<7 | 0x51, 22213 - 19968: jis0212<<14 | 0x15<<7 | 0x49, 22216 - 19968: jis0208<<14 | 0x32<<7 | 0x53, 22217 - 19968: jis0212<<14 | 0x15<<7 | 0x4A, 22218 - 19968: jis0212<<14 | 0x15<<7 | 0x4B, 22219 - 19968: jis0212<<14 | 0x15<<7 | 0x4C, 22220 - 19968: jis0212<<14 | 0x15<<7 | 0x4F, 22221 - 19968: jis0212<<14 | 0x15<<7 | 0x50, 22222 - 19968: jis0208<<14 | 0x32<<7 | 0x54, 22223 - 19968: jis0212<<14 | 0x15<<7 | 0x4D, 22224 - 19968: jis0212<<14 | 0x15<<7 | 0x4E, 22225 - 19968: jis0208<<14 | 0x32<<7 | 0x55, 22227 - 19968: jis0208<<14 | 0x32<<7 | 0x56, 22231 - 19968: jis0208<<14 | 0x32<<7 | 0x57, 22232 - 19968: jis0208<<14 | 0x30<<7 | 0x24, 22233 - 19968: jis0212<<14 | 0x15<<7 | 0x51, 22234 - 19968: jis0208<<14 | 0x1B<<7 | 0x5B, 22235 - 19968: jis0208<<14 | 0x1A<<7 | 0x2C, 22236 - 19968: jis0212<<14 | 0x15<<7 | 0x52, 22237 - 19968: jis0212<<14 | 0x15<<7 | 0x53, 22238 - 19968: jis0208<<14 | 0x11<<7 | 0x52, 22239 - 19968: jis0212<<14 | 0x15<<7 | 0x54, 22240 - 19968: jis0208<<14 | 0x0F<<7 | 0x57, 22241 - 19968: jis0212<<14 | 0x15<<7 | 0x55, 22243 - 19968: jis0208<<14 | 0x22<<7 | 0x23, 22244 - 19968: jis0212<<14 | 0x15<<7 | 0x56, 22245 - 19968: jis0212<<14 | 0x15<<7 | 0x57, 22246 - 19968: jis0212<<14 | 0x15<<7 | 0x58, 22247 - 19968: jis0212<<14 | 0x15<<7 | 0x59, 22248 - 19968: jis0212<<14 | 0x15<<7 | 0x5A, 22251 - 19968: jis0212<<14 | 0x15<<7 | 0x5C, 22253 - 19968: jis0212<<14 | 0x15<<7 | 0x5D, 22254 - 19968: jis0208<<14 | 0x32<<7 | 0x58, 22256 - 19968: jis0208<<14 | 0x19<<7 | 0x03, 22257 - 19968: jis0212<<14 | 0x15<<7 | 0x5B, 22258 - 19968: jis0208<<14 | 0x0F<<7 | 0x2E, 22259 - 19968: jis0208<<14 | 0x1E<<7 | 0x3D, 22262 - 19968: jis0212<<14 | 0x16<<7 | 0x00, 22263 - 19968: jis0212<<14 | 0x16<<7 | 0x01, 22265 - 19968: jis0208<<14 | 0x32<<7 | 0x59, 22266 - 19968: jis0208<<14 | 0x17<<7 | 0x26, 22269 - 19968: jis0208<<14 | 0x18<<7 | 0x50, 22271 - 19968: jis0208<<14 | 0x32<<7 | 0x5B, 22272 - 19968: jis0208<<14 | 0x32<<7 | 0x5A, 22273 - 19968: jis0212<<14 | 0x16<<7 | 0x02, 22274 - 19968: jis0212<<14 | 0x16<<7 | 0x03, 22275 - 19968: jis0208<<14 | 0x29<<7 | 0x3F, 22276 - 19968: jis0208<<14 | 0x32<<7 | 0x5C, 22279 - 19968: jis0212<<14 | 0x16<<7 | 0x04, 22280 - 19968: jis0208<<14 | 0x33<<7 | 0x00, 22281 - 19968: jis0208<<14 | 0x32<<7 | 0x5D, 22282 - 19968: jis0212<<14 | 0x16<<7 | 0x05, 22283 - 19968: jis0208<<14 | 0x33<<7 | 0x01, 22284 - 19968: jis0212<<14 | 0x16<<7 | 0x06, 22285 - 19968: jis0208<<14 | 0x33<<7 | 0x02, 22287 - 19968: jis0208<<14 | 0x16<<7 | 0x56, 22289 - 19968: jis0212<<14 | 0x16<<7 | 0x07, 22290 - 19968: jis0208<<14 | 0x10<<7 | 0x3F, 22291 - 19968: jis0208<<14 | 0x33<<7 | 0x03, 22293 - 19968: jis0212<<14 | 0x16<<7 | 0x08, 22294 - 19968: jis0208<<14 | 0x33<<7 | 0x05, 22296 - 19968: jis0208<<14 | 0x33<<7 | 0x04, 22298 - 19968: jis0212<<14 | 0x16<<7 | 0x09, 22299 - 19968: jis0212<<14 | 0x16<<7 | 0x0A, 22300 - 19968: jis0208<<14 | 0x33<<7 | 0x07, 22301 - 19968: jis0212<<14 | 0x16<<7 | 0x0B, 22303 - 19968: jis0208<<14 | 0x24<<7 | 0x39, 22304 - 19968: jis0212<<14 | 0x16<<7 | 0x0C, 22306 - 19968: jis0212<<14 | 0x16<<7 | 0x0D, 22307 - 19968: jis0212<<14 | 0x16<<7 | 0x0E, 22308 - 19968: jis0212<<14 | 0x16<<7 | 0x0F, 22309 - 19968: jis0212<<14 | 0x16<<7 | 0x10, 22310 - 19968: jis0208<<14 | 0x33<<7 | 0x08, 22311 - 19968: jis0208<<14 | 0x0F<<7 | 0x14, 22312 - 19968: jis0208<<14 | 0x19<<7 | 0x3E, 22313 - 19968: jis0212<<14 | 0x16<<7 | 0x11, 22314 - 19968: jis0212<<14 | 0x16<<7 | 0x12, 22316 - 19968: jis0212<<14 | 0x16<<7 | 0x13, 22317 - 19968: jis0208<<14 | 0x16<<7 | 0x1C, 22318 - 19968: jis0212<<14 | 0x16<<7 | 0x14, 22319 - 19968: jis0212<<14 | 0x16<<7 | 0x15, 22320 - 19968: jis0208<<14 | 0x22<<7 | 0x2E, 22323 - 19968: jis0212<<14 | 0x16<<7 | 0x16, 22324 - 19968: jis0212<<14 | 0x16<<7 | 0x17, 22327 - 19968: jis0208<<14 | 0x33<<7 | 0x09, 22328 - 19968: jis0208<<14 | 0x33<<7 | 0x0A, 22331 - 19968: jis0208<<14 | 0x33<<7 | 0x0C, 22333 - 19968: jis0212<<14 | 0x16<<7 | 0x18, 22334 - 19968: jis0212<<14 | 0x16<<7 | 0x19, 22335 - 19968: jis0212<<14 | 0x16<<7 | 0x1A, 22336 - 19968: jis0208<<14 | 0x33<<7 | 0x0D, 22338 - 19968: jis0208<<14 | 0x19<<7 | 0x43, 22341 - 19968: jis0212<<14 | 0x16<<7 | 0x1B, 22342 - 19968: jis0212<<14 | 0x16<<7 | 0x1C, 22343 - 19968: jis0208<<14 | 0x15<<7 | 0x30, 22346 - 19968: jis0208<<14 | 0x2A<<7 | 0x16, 22348 - 19968: jis0212<<14 | 0x16<<7 | 0x1D, 22349 - 19968: jis0212<<14 | 0x16<<7 | 0x1E, 22350 - 19968: jis0208<<14 | 0x33<<7 | 0x0B, 22351 - 19968: jis0208<<14 | 0x33<<7 | 0x0E, 22352 - 19968: jis0208<<14 | 0x19<<7 | 0x20, 22353 - 19968: jis0208<<14 | 0x18<<7 | 0x02, 22354 - 19968: jis0212<<14 | 0x16<<7 | 0x1F, 22361 - 19968: jis0208<<14 | 0x58<<7 | 0x39, 22369 - 19968: jis0208<<14 | 0x33<<7 | 0x12, 22370 - 19968: jis0212<<14 | 0x16<<7 | 0x20, 22372 - 19968: jis0208<<14 | 0x19<<7 | 0x04, 22373 - 19968: jis0208<<14 | 0x58<<7 | 0x3A, 22374 - 19968: jis0208<<14 | 0x22<<7 | 0x12, 22375 - 19968: jis0212<<14 | 0x16<<7 | 0x22, 22376 - 19968: jis0212<<14 | 0x16<<7 | 0x23, 22377 - 19968: jis0208<<14 | 0x33<<7 | 0x0F, 22378 - 19968: jis0208<<14 | 0x23<<7 | 0x39, 22379 - 19968: jis0212<<14 | 0x16<<7 | 0x24, 22381 - 19968: jis0212<<14 | 0x16<<7 | 0x25, 22382 - 19968: jis0212<<14 | 0x16<<7 | 0x26, 22383 - 19968: jis0212<<14 | 0x16<<7 | 0x27, 22384 - 19968: jis0212<<14 | 0x16<<7 | 0x28, 22385 - 19968: jis0212<<14 | 0x16<<7 | 0x29, 22387 - 19968: jis0212<<14 | 0x16<<7 | 0x2A, 22388 - 19968: jis0212<<14 | 0x16<<7 | 0x2B, 22389 - 19968: jis0212<<14 | 0x16<<7 | 0x2C, 22391 - 19968: jis0212<<14 | 0x16<<7 | 0x2D, 22393 - 19968: jis0212<<14 | 0x16<<7 | 0x2E, 22394 - 19968: jis0212<<14 | 0x16<<7 | 0x2F, 22395 - 19968: jis0212<<14 | 0x16<<7 | 0x30, 22396 - 19968: jis0212<<14 | 0x16<<7 | 0x31, 22398 - 19968: jis0212<<14 | 0x16<<7 | 0x32, 22399 - 19968: jis0208<<14 | 0x33<<7 | 0x13, 22401 - 19968: jis0212<<14 | 0x16<<7 | 0x33, 22402 - 19968: jis0208<<14 | 0x1E<<7 | 0x41, 22403 - 19968: jis0212<<14 | 0x16<<7 | 0x34, 22408 - 19968: jis0208<<14 | 0x33<<7 | 0x11, 22409 - 19968: jis0208<<14 | 0x33<<7 | 0x14, 22411 - 19968: jis0208<<14 | 0x16<<7 | 0x1E, 22412 - 19968: jis0212<<14 | 0x16<<7 | 0x35, 22419 - 19968: jis0208<<14 | 0x33<<7 | 0x15, 22420 - 19968: jis0212<<14 | 0x16<<7 | 0x36, 22421 - 19968: jis0212<<14 | 0x16<<7 | 0x3F, 22423 - 19968: jis0212<<14 | 0x16<<7 | 0x37, 22425 - 19968: jis0212<<14 | 0x16<<7 | 0x38, 22426 - 19968: jis0212<<14 | 0x16<<7 | 0x39, 22428 - 19968: jis0212<<14 | 0x16<<7 | 0x3A, 22429 - 19968: jis0212<<14 | 0x16<<7 | 0x3B, 22430 - 19968: jis0212<<14 | 0x16<<7 | 0x3C, 22431 - 19968: jis0212<<14 | 0x16<<7 | 0x3D, 22432 - 19968: jis0208<<14 | 0x33<<7 | 0x16, 22433 - 19968: jis0212<<14 | 0x16<<7 | 0x3E, 22434 - 19968: jis0208<<14 | 0x18<<7 | 0x03, 22435 - 19968: jis0208<<14 | 0x12<<7 | 0x1F, 22436 - 19968: jis0208<<14 | 0x33<<7 | 0x18, 22439 - 19968: jis0212<<14 | 0x16<<7 | 0x40, 22440 - 19968: jis0212<<14 | 0x16<<7 | 0x41, 22441 - 19968: jis0212<<14 | 0x16<<7 | 0x42, 22442 - 19968: jis0208<<14 | 0x33<<7 | 0x19, 22444 - 19968: jis0208<<14 | 0x58<<7 | 0x3B, 22448 - 19968: jis0208<<14 | 0x33<<7 | 0x1A, 22451 - 19968: jis0208<<14 | 0x33<<7 | 0x17, 22456 - 19968: jis0212<<14 | 0x16<<7 | 0x44, 22461 - 19968: jis0212<<14 | 0x16<<7 | 0x45, 22464 - 19968: jis0208<<14 | 0x33<<7 | 0x10, 22467 - 19968: jis0208<<14 | 0x33<<7 | 0x1B, 22470 - 19968: jis0208<<14 | 0x33<<7 | 0x1C, 22471 - 19968: jis0208<<14 | 0x58<<7 | 0x3D, 22472 - 19968: jis0208<<14 | 0x58<<7 | 0x3C, 22475 - 19968: jis0208<<14 | 0x2A<<7 | 0x43, 22476 - 19968: jis0212<<14 | 0x16<<7 | 0x48, 22478 - 19968: jis0208<<14 | 0x1D<<7 | 0x4A, 22479 - 19968: jis0212<<14 | 0x16<<7 | 0x49, 22482 - 19968: jis0208<<14 | 0x33<<7 | 0x1E, 22483 - 19968: jis0208<<14 | 0x33<<7 | 0x1F, 22484 - 19968: jis0208<<14 | 0x33<<7 | 0x1D, 22485 - 19968: jis0212<<14 | 0x16<<7 | 0x4A, 22486 - 19968: jis0208<<14 | 0x33<<7 | 0x21, 22492 - 19968: jis0208<<14 | 0x26<<7 | 0x17, 22493 - 19968: jis0212<<14 | 0x16<<7 | 0x4B, 22494 - 19968: jis0212<<14 | 0x16<<7 | 0x4C, 22495 - 19968: jis0208<<14 | 0x0F<<7 | 0x47, 22496 - 19968: jis0208<<14 | 0x28<<7 | 0x35, 22497 - 19968: jis0212<<14 | 0x16<<7 | 0x5D, 22499 - 19968: jis0208<<14 | 0x33<<7 | 0x22, 22500 - 19968: jis0212<<14 | 0x16<<7 | 0x4D, 22502 - 19968: jis0212<<14 | 0x16<<7 | 0x4E, 22503 - 19968: jis0212<<14 | 0x16<<7 | 0x4F, 22505 - 19968: jis0212<<14 | 0x16<<7 | 0x50, 22509 - 19968: jis0212<<14 | 0x16<<7 | 0x51, 22512 - 19968: jis0212<<14 | 0x16<<7 | 0x52, 22516 - 19968: jis0208<<14 | 0x1D<<7 | 0x5C, 22517 - 19968: jis0212<<14 | 0x16<<7 | 0x53, 22518 - 19968: jis0212<<14 | 0x16<<7 | 0x54, 22519 - 19968: jis0208<<14 | 0x1B<<7 | 0x18, 22520 - 19968: jis0212<<14 | 0x16<<7 | 0x55, 22521 - 19968: jis0208<<14 | 0x26<<7 | 0x3C, 22522 - 19968: jis0208<<14 | 0x13<<7 | 0x4F, 22524 - 19968: jis0208<<14 | 0x19<<7 | 0x4A, 22525 - 19968: jis0212<<14 | 0x16<<7 | 0x56, 22526 - 19968: jis0212<<14 | 0x16<<7 | 0x57, 22527 - 19968: jis0212<<14 | 0x16<<7 | 0x58, 22528 - 19968: jis0208<<14 | 0x2A<<7 | 0x38, 22530 - 19968: jis0208<<14 | 0x25<<7 | 0x11, 22531 - 19968: jis0212<<14 | 0x16<<7 | 0x59, 22532 - 19968: jis0212<<14 | 0x16<<7 | 0x5A, 22533 - 19968: jis0208<<14 | 0x16<<7 | 0x57, 22534 - 19968: jis0208<<14 | 0x21<<7 | 0x2E, 22536 - 19968: jis0212<<14 | 0x16<<7 | 0x5B, 22537 - 19968: jis0212<<14 | 0x16<<7 | 0x5C, 22538 - 19968: jis0208<<14 | 0x33<<7 | 0x20, 22539 - 19968: jis0208<<14 | 0x33<<7 | 0x23, 22540 - 19968: jis0212<<14 | 0x17<<7 | 0x00, 22541 - 19968: jis0212<<14 | 0x17<<7 | 0x01, 22549 - 19968: jis0208<<14 | 0x21<<7 | 0x23, 22553 - 19968: jis0208<<14 | 0x33<<7 | 0x24, 22555 - 19968: jis0212<<14 | 0x17<<7 | 0x02, 22557 - 19968: jis0208<<14 | 0x33<<7 | 0x25, 22558 - 19968: jis0212<<14 | 0x17<<7 | 0x03, 22559 - 19968: jis0212<<14 | 0x17<<7 | 0x04, 22560 - 19968: jis0212<<14 | 0x17<<7 | 0x05, 22561 - 19968: jis0208<<14 | 0x33<<7 | 0x27, 22564 - 19968: jis0208<<14 | 0x23<<7 | 0x48, 22566 - 19968: jis0212<<14 | 0x17<<7 | 0x06, 22567 - 19968: jis0212<<14 | 0x17<<7 | 0x07, 22570 - 19968: jis0208<<14 | 0x13<<7 | 0x0D, 22573 - 19968: jis0212<<14 | 0x17<<7 | 0x08, 22575 - 19968: jis0208<<14 | 0x53<<7 | 0x00, 22576 - 19968: jis0208<<14 | 0x10<<7 | 0x40, 22577 - 19968: jis0208<<14 | 0x29<<7 | 0x52, 22578 - 19968: jis0212<<14 | 0x17<<7 | 0x09, 22580 - 19968: jis0208<<14 | 0x1D<<7 | 0x4B, 22581 - 19968: jis0208<<14 | 0x24<<7 | 0x27, 22585 - 19968: jis0212<<14 | 0x17<<7 | 0x0A, 22586 - 19968: jis0208<<14 | 0x19<<7 | 0x45, 22589 - 19968: jis0208<<14 | 0x33<<7 | 0x2D, 22591 - 19968: jis0212<<14 | 0x17<<7 | 0x0B, 22592 - 19968: jis0208<<14 | 0x29<<7 | 0x1C, 22593 - 19968: jis0208<<14 | 0x2D<<7 | 0x3C, 22601 - 19968: jis0212<<14 | 0x17<<7 | 0x0C, 22602 - 19968: jis0208<<14 | 0x11<<7 | 0x53, 22603 - 19968: jis0208<<14 | 0x33<<7 | 0x29, 22604 - 19968: jis0212<<14 | 0x17<<7 | 0x0D, 22605 - 19968: jis0212<<14 | 0x17<<7 | 0x0E, 22607 - 19968: jis0212<<14 | 0x17<<7 | 0x0F, 22608 - 19968: jis0212<<14 | 0x17<<7 | 0x10, 22609 - 19968: jis0208<<14 | 0x20<<7 | 0x19, 22610 - 19968: jis0208<<14 | 0x33<<7 | 0x2C, 22612 - 19968: jis0208<<14 | 0x24<<7 | 0x42, 22613 - 19968: jis0212<<14 | 0x17<<7 | 0x11, 22615 - 19968: jis0208<<14 | 0x24<<7 | 0x28, 22616 - 19968: jis0208<<14 | 0x24<<7 | 0x43, 22617 - 19968: jis0208<<14 | 0x27<<7 | 0x18, 22618 - 19968: jis0208<<14 | 0x23<<7 | 0x2C, 22622 - 19968: jis0208<<14 | 0x19<<7 | 0x28, 22623 - 19968: jis0212<<14 | 0x17<<7 | 0x12, 22625 - 19968: jis0212<<14 | 0x17<<7 | 0x13, 22626 - 19968: jis0208<<14 | 0x33<<7 | 0x28, 22628 - 19968: jis0212<<14 | 0x17<<7 | 0x14, 22631 - 19968: jis0212<<14 | 0x17<<7 | 0x15, 22632 - 19968: jis0212<<14 | 0x17<<7 | 0x16, 22633 - 19968: jis0208<<14 | 0x10<<7 | 0x55, 22635 - 19968: jis0208<<14 | 0x24<<7 | 0x15, 22640 - 19968: jis0208<<14 | 0x33<<7 | 0x2A, 22642 - 19968: jis0208<<14 | 0x33<<7 | 0x26, 22645 - 19968: jis0208<<14 | 0x1E<<7 | 0x2F, 22648 - 19968: jis0212<<14 | 0x17<<7 | 0x17, 22649 - 19968: jis0208<<14 | 0x33<<7 | 0x2E, 22652 - 19968: jis0212<<14 | 0x17<<7 | 0x18, 22654 - 19968: jis0208<<14 | 0x1C<<7 | 0x2D, 22655 - 19968: jis0212<<14 | 0x17<<7 | 0x19, 22656 - 19968: jis0212<<14 | 0x17<<7 | 0x1A, 22657 - 19968: jis0212<<14 | 0x17<<7 | 0x1B, 22659 - 19968: jis0208<<14 | 0x15<<7 | 0x0C, 22661 - 19968: jis0208<<14 | 0x33<<7 | 0x2F, 22663 - 19968: jis0212<<14 | 0x17<<7 | 0x1C, 22664 - 19968: jis0212<<14 | 0x17<<7 | 0x1D, 22665 - 19968: jis0212<<14 | 0x17<<7 | 0x1E, 22666 - 19968: jis0212<<14 | 0x17<<7 | 0x1F, 22668 - 19968: jis0212<<14 | 0x17<<7 | 0x20, 22669 - 19968: jis0212<<14 | 0x17<<7 | 0x21, 22671 - 19968: jis0212<<14 | 0x17<<7 | 0x22, 22672 - 19968: jis0212<<14 | 0x17<<7 | 0x23, 22675 - 19968: jis0208<<14 | 0x29<<7 | 0x47, 22676 - 19968: jis0212<<14 | 0x17<<7 | 0x24, 22678 - 19968: jis0212<<14 | 0x17<<7 | 0x25, 22679 - 19968: jis0208<<14 | 0x20<<7 | 0x5C, 22684 - 19968: jis0208<<14 | 0x23<<7 | 0x25, 22685 - 19968: jis0212<<14 | 0x17<<7 | 0x26, 22686 - 19968: jis0208<<14 | 0x58<<7 | 0x40, 22687 - 19968: jis0208<<14 | 0x33<<7 | 0x31, 22688 - 19968: jis0212<<14 | 0x17<<7 | 0x27, 22689 - 19968: jis0212<<14 | 0x17<<7 | 0x28, 22690 - 19968: jis0212<<14 | 0x17<<7 | 0x29, 22694 - 19968: jis0212<<14 | 0x17<<7 | 0x2A, 22696 - 19968: jis0208<<14 | 0x2A<<7 | 0x2E, 22697 - 19968: jis0212<<14 | 0x17<<7 | 0x2B, 22699 - 19968: jis0208<<14 | 0x33<<7 | 0x32, 22702 - 19968: jis0208<<14 | 0x33<<7 | 0x37, 22705 - 19968: jis0212<<14 | 0x17<<7 | 0x2C, 22706 - 19968: jis0208<<14 | 0x58<<7 | 0x41, 22707 - 19968: jis0208<<14 | 0x29<<7 | 0x0E, 22712 - 19968: jis0208<<14 | 0x33<<7 | 0x36, 22713 - 19968: jis0208<<14 | 0x33<<7 | 0x30, 22714 - 19968: jis0208<<14 | 0x33<<7 | 0x33, 22715 - 19968: jis0208<<14 | 0x33<<7 | 0x35, 22716 - 19968: jis0212<<14 | 0x17<<7 | 0x2F, 22718 - 19968: jis0208<<14 | 0x19<<7 | 0x05, 22721 - 19968: jis0208<<14 | 0x29<<7 | 0x28, 22722 - 19968: jis0212<<14 | 0x17<<7 | 0x30, 22724 - 19968: jis0212<<14 | 0x17<<7 | 0x2E, 22725 - 19968: jis0208<<14 | 0x33<<7 | 0x38, 22727 - 19968: jis0208<<14 | 0x22<<7 | 0x24, 22728 - 19968: jis0212<<14 | 0x17<<7 | 0x31, 22730 - 19968: jis0208<<14 | 0x11<<7 | 0x54, 22732 - 19968: jis0208<<14 | 0x1D<<7 | 0x4C, 22733 - 19968: jis0212<<14 | 0x17<<7 | 0x32, 22734 - 19968: jis0212<<14 | 0x17<<7 | 0x33, 22736 - 19968: jis0212<<14 | 0x17<<7 | 0x34, 22737 - 19968: jis0208<<14 | 0x33<<7 | 0x3A, 22738 - 19968: jis0212<<14 | 0x17<<7 | 0x35, 22739 - 19968: jis0208<<14 | 0x33<<7 | 0x39, 22740 - 19968: jis0212<<14 | 0x17<<7 | 0x36, 22741 - 19968: jis0208<<14 | 0x18<<7 | 0x47, 22742 - 19968: jis0212<<14 | 0x17<<7 | 0x37, 22743 - 19968: jis0208<<14 | 0x33<<7 | 0x3B, 22744 - 19968: jis0208<<14 | 0x33<<7 | 0x3D, 22745 - 19968: jis0208<<14 | 0x33<<7 | 0x3C, 22746 - 19968: jis0212<<14 | 0x17<<7 | 0x38, 22748 - 19968: jis0208<<14 | 0x33<<7 | 0x3F, 22749 - 19968: jis0212<<14 | 0x17<<7 | 0x39, 22750 - 19968: jis0208<<14 | 0x33<<7 | 0x34, 22751 - 19968: jis0208<<14 | 0x33<<7 | 0x41, 22753 - 19968: jis0212<<14 | 0x17<<7 | 0x3A, 22754 - 19968: jis0212<<14 | 0x17<<7 | 0x3B, 22756 - 19968: jis0208<<14 | 0x33<<7 | 0x40, 22757 - 19968: jis0208<<14 | 0x33<<7 | 0x3E, 22761 - 19968: jis0212<<14 | 0x17<<7 | 0x3C, 22763 - 19968: jis0208<<14 | 0x1A<<7 | 0x2D, 22764 - 19968: jis0208<<14 | 0x1E<<7 | 0x30, 22766 - 19968: jis0208<<14 | 0x20<<7 | 0x33, 22767 - 19968: jis0208<<14 | 0x33<<7 | 0x42, 22768 - 19968: jis0208<<14 | 0x1F<<7 | 0x1B, 22769 - 19968: jis0208<<14 | 0x0F<<7 | 0x4C, 22770 - 19968: jis0208<<14 | 0x26<<7 | 0x43, 22771 - 19968: jis0212<<14 | 0x17<<7 | 0x3D, 22775 - 19968: jis0208<<14 | 0x23<<7 | 0x3A, 22777 - 19968: jis0208<<14 | 0x33<<7 | 0x44, 22778 - 19968: jis0208<<14 | 0x33<<7 | 0x43, 22779 - 19968: jis0208<<14 | 0x33<<7 | 0x45, 22780 - 19968: jis0208<<14 | 0x33<<7 | 0x46, 22781 - 19968: jis0208<<14 | 0x33<<7 | 0x47, 22786 - 19968: jis0208<<14 | 0x33<<7 | 0x48, 22789 - 19968: jis0212<<14 | 0x17<<7 | 0x3E, 22790 - 19968: jis0212<<14 | 0x17<<7 | 0x3F, 22793 - 19968: jis0208<<14 | 0x29<<7 | 0x30, 22794 - 19968: jis0208<<14 | 0x33<<7 | 0x49, 22795 - 19968: jis0208<<14 | 0x58<<7 | 0x42, 22796 - 19968: jis0212<<14 | 0x17<<7 | 0x41, 22799 - 19968: jis0208<<14 | 0x11<<7 | 0x25, 22800 - 19968: jis0208<<14 | 0x33<<7 | 0x4A, 22802 - 19968: jis0212<<14 | 0x17<<7 | 0x42, 22803 - 19968: jis0212<<14 | 0x17<<7 | 0x43, 22804 - 19968: jis0212<<14 | 0x17<<7 | 0x44, 22805 - 19968: jis0208<<14 | 0x2C<<7 | 0x1B, 22806 - 19968: jis0208<<14 | 0x12<<7 | 0x0F, 22808 - 19968: jis0208<<14 | 0x31<<7 | 0x28, 22809 - 19968: jis0208<<14 | 0x1C<<7 | 0x27, 22810 - 19968: jis0208<<14 | 0x21<<7 | 0x1E, 22811 - 19968: jis0208<<14 | 0x33<<7 | 0x4B, 22812 - 19968: jis0208<<14 | 0x2B<<7 | 0x4A, 22813 - 19968: jis0212<<14 | 0x17<<7 | 0x46, 22817 - 19968: jis0212<<14 | 0x17<<7 | 0x47, 22818 - 19968: jis0208<<14 | 0x2B<<7 | 0x13, 22819 - 19968: jis0212<<14 | 0x17<<7 | 0x48, 22820 - 19968: jis0212<<14 | 0x17<<7 | 0x49, 22821 - 19968: jis0208<<14 | 0x33<<7 | 0x4D, 22823 - 19968: jis0208<<14 | 0x21<<7 | 0x46, 22824 - 19968: jis0212<<14 | 0x17<<7 | 0x4A, 22825 - 19968: jis0208<<14 | 0x24<<7 | 0x16, 22826 - 19968: jis0208<<14 | 0x21<<7 | 0x1F, 22827 - 19968: jis0208<<14 | 0x28<<7 | 0x36, 22828 - 19968: jis0208<<14 | 0x33<<7 | 0x4E, 22829 - 19968: jis0208<<14 | 0x33<<7 | 0x4F, 22830 - 19968: jis0208<<14 | 0x10<<7 | 0x5A, 22831 - 19968: jis0212<<14 | 0x17<<7 | 0x4B, 22832 - 19968: jis0212<<14 | 0x17<<7 | 0x4C, 22833 - 19968: jis0208<<14 | 0x1B<<7 | 0x19, 22834 - 19968: jis0208<<14 | 0x33<<7 | 0x50, 22835 - 19968: jis0212<<14 | 0x17<<7 | 0x4D, 22837 - 19968: jis0212<<14 | 0x17<<7 | 0x4E, 22838 - 19968: jis0212<<14 | 0x17<<7 | 0x4F, 22839 - 19968: jis0208<<14 | 0x0F<<7 | 0x2F, 22840 - 19968: jis0208<<14 | 0x33<<7 | 0x51, 22846 - 19968: jis0208<<14 | 0x33<<7 | 0x52, 22847 - 19968: jis0212<<14 | 0x17<<7 | 0x50, 22851 - 19968: jis0212<<14 | 0x17<<7 | 0x51, 22852 - 19968: jis0208<<14 | 0x10<<7 | 0x41, 22854 - 19968: jis0212<<14 | 0x17<<7 | 0x52, 22855 - 19968: jis0208<<14 | 0x13<<7 | 0x50, 22856 - 19968: jis0208<<14 | 0x25<<7 | 0x3F, 22857 - 19968: jis0208<<14 | 0x29<<7 | 0x53, 22862 - 19968: jis0208<<14 | 0x33<<7 | 0x56, 22863 - 19968: jis0208<<14 | 0x20<<7 | 0x34, 22864 - 19968: jis0208<<14 | 0x33<<7 | 0x55, 22865 - 19968: jis0208<<14 | 0x16<<7 | 0x1F, 22866 - 19968: jis0212<<14 | 0x17<<7 | 0x53, 22867 - 19968: jis0208<<14 | 0x58<<7 | 0x43, 22868 - 19968: jis0208<<14 | 0x2A<<7 | 0x3A, 22869 - 19968: jis0208<<14 | 0x33<<7 | 0x54, 22871 - 19968: jis0208<<14 | 0x24<<7 | 0x44, 22872 - 19968: jis0208<<14 | 0x33<<7 | 0x58, 22873 - 19968: jis0212<<14 | 0x17<<7 | 0x55, 22874 - 19968: jis0208<<14 | 0x33<<7 | 0x57, 22875 - 19968: jis0208<<14 | 0x58<<7 | 0x44, 22877 - 19968: jis0208<<14 | 0x58<<7 | 0x45, 22878 - 19968: jis0212<<14 | 0x17<<7 | 0x58, 22879 - 19968: jis0212<<14 | 0x17<<7 | 0x59, 22880 - 19968: jis0208<<14 | 0x33<<7 | 0x5A, 22881 - 19968: jis0212<<14 | 0x17<<7 | 0x5A, 22882 - 19968: jis0208<<14 | 0x33<<7 | 0x59, 22883 - 19968: jis0208<<14 | 0x58<<7 | 0x46, 22885 - 19968: jis0208<<14 | 0x10<<7 | 0x5B, 22887 - 19968: jis0208<<14 | 0x33<<7 | 0x5B, 22888 - 19968: jis0208<<14 | 0x1D<<7 | 0x08, 22889 - 19968: jis0208<<14 | 0x33<<7 | 0x5D, 22890 - 19968: jis0208<<14 | 0x22<<7 | 0x04, 22891 - 19968: jis0212<<14 | 0x17<<7 | 0x5C, 22892 - 19968: jis0208<<14 | 0x33<<7 | 0x5C, 22893 - 19968: jis0212<<14 | 0x17<<7 | 0x5D, 22894 - 19968: jis0208<<14 | 0x29<<7 | 0x12, 22895 - 19968: jis0212<<14 | 0x18<<7 | 0x00, 22898 - 19968: jis0212<<14 | 0x18<<7 | 0x01, 22899 - 19968: jis0208<<14 | 0x1C<<7 | 0x56, 22900 - 19968: jis0208<<14 | 0x24<<7 | 0x3A, 22901 - 19968: jis0212<<14 | 0x18<<7 | 0x02, 22902 - 19968: jis0212<<14 | 0x18<<7 | 0x03, 22904 - 19968: jis0208<<14 | 0x34<<7 | 0x00, 22905 - 19968: jis0212<<14 | 0x18<<7 | 0x04, 22907 - 19968: jis0212<<14 | 0x18<<7 | 0x05, 22908 - 19968: jis0212<<14 | 0x18<<7 | 0x06, 22909 - 19968: jis0208<<14 | 0x18<<7 | 0x04, 22913 - 19968: jis0208<<14 | 0x34<<7 | 0x01, 22914 - 19968: jis0208<<14 | 0x26<<7 | 0x00, 22915 - 19968: jis0208<<14 | 0x27<<7 | 0x3D, 22916 - 19968: jis0208<<14 | 0x2B<<7 | 0x30, 22922 - 19968: jis0208<<14 | 0x26<<7 | 0x04, 22923 - 19968: jis0212<<14 | 0x18<<7 | 0x07, 22924 - 19968: jis0212<<14 | 0x18<<7 | 0x08, 22925 - 19968: jis0208<<14 | 0x34<<7 | 0x0A, 22926 - 19968: jis0212<<14 | 0x18<<7 | 0x09, 22930 - 19968: jis0212<<14 | 0x18<<7 | 0x0A, 22931 - 19968: jis0208<<14 | 0x14<<7 | 0x17, 22933 - 19968: jis0212<<14 | 0x18<<7 | 0x0B, 22934 - 19968: jis0208<<14 | 0x2C<<7 | 0x24, 22935 - 19968: jis0212<<14 | 0x18<<7 | 0x0C, 22937 - 19968: jis0208<<14 | 0x2B<<7 | 0x0E, 22939 - 19968: jis0208<<14 | 0x35<<7 | 0x0B, 22941 - 19968: jis0208<<14 | 0x34<<7 | 0x02, 22943 - 19968: jis0212<<14 | 0x18<<7 | 0x0D, 22947 - 19968: jis0208<<14 | 0x34<<7 | 0x05, 22948 - 19968: jis0208<<14 | 0x58<<7 | 0x47, 22949 - 19968: jis0208<<14 | 0x21<<7 | 0x24, 22951 - 19968: jis0212<<14 | 0x18<<7 | 0x0F, 22952 - 19968: jis0208<<14 | 0x2A<<7 | 0x17, 22956 - 19968: jis0208<<14 | 0x24<<7 | 0x29, 22957 - 19968: jis0212<<14 | 0x18<<7 | 0x10, 22958 - 19968: jis0212<<14 | 0x18<<7 | 0x11, 22959 - 19968: jis0212<<14 | 0x18<<7 | 0x12, 22960 - 19968: jis0212<<14 | 0x18<<7 | 0x13, 22962 - 19968: jis0208<<14 | 0x34<<7 | 0x06, 22963 - 19968: jis0212<<14 | 0x18<<7 | 0x14, 22967 - 19968: jis0212<<14 | 0x18<<7 | 0x15, 22969 - 19968: jis0208<<14 | 0x2A<<7 | 0x44, 22970 - 19968: jis0208<<14 | 0x58<<7 | 0x48, 22971 - 19968: jis0208<<14 | 0x19<<7 | 0x29, 22972 - 19968: jis0212<<14 | 0x18<<7 | 0x17, 22974 - 19968: jis0208<<14 | 0x1D<<7 | 0x09, 22977 - 19968: jis0212<<14 | 0x18<<7 | 0x18, 22979 - 19968: jis0212<<14 | 0x18<<7 | 0x19, 22980 - 19968: jis0212<<14 | 0x18<<7 | 0x1A, 22982 - 19968: jis0208<<14 | 0x34<<7 | 0x07, 22984 - 19968: jis0212<<14 | 0x18<<7 | 0x1B, 22985 - 19968: jis0208<<14 | 0x1A<<7 | 0x2F, 22986 - 19968: jis0212<<14 | 0x18<<7 | 0x1C, 22987 - 19968: jis0208<<14 | 0x1A<<7 | 0x2E, 22989 - 19968: jis0212<<14 | 0x18<<7 | 0x1D, 22992 - 19968: jis0208<<14 | 0x0F<<7 | 0x18, 22993 - 19968: jis0208<<14 | 0x17<<7 | 0x27, 22994 - 19968: jis0212<<14 | 0x18<<7 | 0x1E, 22995 - 19968: jis0208<<14 | 0x1F<<7 | 0x0A, 22996 - 19968: jis0208<<14 | 0x0F<<7 | 0x30, 23001 - 19968: jis0208<<14 | 0x34<<7 | 0x0B, 23002 - 19968: jis0208<<14 | 0x34<<7 | 0x0C, 23004 - 19968: jis0208<<14 | 0x34<<7 | 0x09, 23005 - 19968: jis0212<<14 | 0x18<<7 | 0x1F, 23006 - 19968: jis0212<<14 | 0x18<<7 | 0x20, 23007 - 19968: jis0212<<14 | 0x18<<7 | 0x21, 23011 - 19968: jis0212<<14 | 0x18<<7 | 0x22, 23012 - 19968: jis0212<<14 | 0x18<<7 | 0x23, 23013 - 19968: jis0208<<14 | 0x10<<7 | 0x17, 23014 - 19968: jis0208<<14 | 0x13<<7 | 0x0E, 23015 - 19968: jis0212<<14 | 0x18<<7 | 0x24, 23016 - 19968: jis0208<<14 | 0x34<<7 | 0x08, 23018 - 19968: jis0208<<14 | 0x2B<<7 | 0x24, 23019 - 19968: jis0208<<14 | 0x28<<7 | 0x10, 23022 - 19968: jis0212<<14 | 0x18<<7 | 0x25, 23023 - 19968: jis0212<<14 | 0x18<<7 | 0x26, 23025 - 19968: jis0212<<14 | 0x18<<7 | 0x27, 23026 - 19968: jis0212<<14 | 0x18<<7 | 0x28, 23028 - 19968: jis0212<<14 | 0x18<<7 | 0x29, 23030 - 19968: jis0208<<14 | 0x0F<<7 | 0x07, 23031 - 19968: jis0212<<14 | 0x18<<7 | 0x2A, 23035 - 19968: jis0208<<14 | 0x0F<<7 | 0x58, 23039 - 19968: jis0208<<14 | 0x1A<<7 | 0x30, 23040 - 19968: jis0212<<14 | 0x18<<7 | 0x2B, 23041 - 19968: jis0208<<14 | 0x0F<<7 | 0x31, 23043 - 19968: jis0208<<14 | 0x0F<<7 | 0x02, 23044 - 19968: jis0212<<14 | 0x18<<7 | 0x2C, 23049 - 19968: jis0208<<14 | 0x34<<7 | 0x11, 23052 - 19968: jis0212<<14 | 0x18<<7 | 0x2D, 23053 - 19968: jis0212<<14 | 0x18<<7 | 0x2E, 23054 - 19968: jis0212<<14 | 0x18<<7 | 0x2F, 23057 - 19968: jis0208<<14 | 0x34<<7 | 0x0F, 23058 - 19968: jis0212<<14 | 0x18<<7 | 0x30, 23059 - 19968: jis0212<<14 | 0x18<<7 | 0x31, 23064 - 19968: jis0208<<14 | 0x2B<<7 | 0x1B, 23066 - 19968: jis0208<<14 | 0x34<<7 | 0x12, 23068 - 19968: jis0208<<14 | 0x34<<7 | 0x10, 23070 - 19968: jis0212<<14 | 0x18<<7 | 0x32, 23071 - 19968: jis0208<<14 | 0x34<<7 | 0x0E, 23072 - 19968: jis0208<<14 | 0x1E<<7 | 0x10, 23075 - 19968: jis0212<<14 | 0x18<<7 | 0x33, 23076 - 19968: jis0212<<14 | 0x18<<7 | 0x34, 23077 - 19968: jis0208<<14 | 0x34<<7 | 0x0D, 23079 - 19968: jis0212<<14 | 0x18<<7 | 0x35, 23080 - 19968: jis0212<<14 | 0x18<<7 | 0x36, 23081 - 19968: jis0208<<14 | 0x29<<7 | 0x39, 23082 - 19968: jis0212<<14 | 0x18<<7 | 0x37, 23085 - 19968: jis0212<<14 | 0x18<<7 | 0x38, 23087 - 19968: jis0208<<14 | 0x17<<7 | 0x43, 23088 - 19968: jis0212<<14 | 0x18<<7 | 0x39, 23093 - 19968: jis0208<<14 | 0x34<<7 | 0x16, 23094 - 19968: jis0208<<14 | 0x34<<7 | 0x17, 23100 - 19968: jis0208<<14 | 0x1D<<7 | 0x0A, 23104 - 19968: jis0208<<14 | 0x34<<7 | 0x13, 23105 - 19968: jis0208<<14 | 0x2E<<7 | 0x0B, 23108 - 19968: jis0212<<14 | 0x18<<7 | 0x3A, 23109 - 19968: jis0212<<14 | 0x18<<7 | 0x3B, 23110 - 19968: jis0208<<14 | 0x26<<7 | 0x2B, 23111 - 19968: jis0212<<14 | 0x18<<7 | 0x3C, 23112 - 19968: jis0212<<14 | 0x18<<7 | 0x3D, 23113 - 19968: jis0208<<14 | 0x34<<7 | 0x15, 23116 - 19968: jis0212<<14 | 0x18<<7 | 0x3E, 23120 - 19968: jis0212<<14 | 0x18<<7 | 0x3F, 23125 - 19968: jis0212<<14 | 0x18<<7 | 0x40, 23130 - 19968: jis0208<<14 | 0x19<<7 | 0x06, 23134 - 19968: jis0212<<14 | 0x18<<7 | 0x41, 23138 - 19968: jis0208<<14 | 0x34<<7 | 0x18, 23139 - 19968: jis0212<<14 | 0x18<<7 | 0x42, 23141 - 19968: jis0212<<14 | 0x18<<7 | 0x43, 23142 - 19968: jis0208<<14 | 0x28<<7 | 0x37, 23143 - 19968: jis0212<<14 | 0x18<<7 | 0x44, 23146 - 19968: jis0208<<14 | 0x34<<7 | 0x19, 23148 - 19968: jis0208<<14 | 0x34<<7 | 0x14, 23149 - 19968: jis0212<<14 | 0x18<<7 | 0x45, 23159 - 19968: jis0212<<14 | 0x18<<7 | 0x46, 23162 - 19968: jis0212<<14 | 0x18<<7 | 0x47, 23163 - 19968: jis0212<<14 | 0x18<<7 | 0x48, 23166 - 19968: jis0212<<14 | 0x18<<7 | 0x49, 23167 - 19968: jis0208<<14 | 0x2B<<7 | 0x1A, 23179 - 19968: jis0212<<14 | 0x18<<7 | 0x4A, 23184 - 19968: jis0212<<14 | 0x18<<7 | 0x4B, 23186 - 19968: jis0208<<14 | 0x26<<7 | 0x3D, 23187 - 19968: jis0212<<14 | 0x18<<7 | 0x4C, 23190 - 19968: jis0212<<14 | 0x18<<7 | 0x4D, 23193 - 19968: jis0212<<14 | 0x18<<7 | 0x4E, 23194 - 19968: jis0208<<14 | 0x34<<7 | 0x1A, 23195 - 19968: jis0208<<14 | 0x28<<7 | 0x11, 23196 - 19968: jis0212<<14 | 0x18<<7 | 0x4F, 23198 - 19968: jis0212<<14 | 0x18<<7 | 0x50, 23199 - 19968: jis0212<<14 | 0x18<<7 | 0x51, 23200 - 19968: jis0212<<14 | 0x18<<7 | 0x52, 23202 - 19968: jis0212<<14 | 0x18<<7 | 0x53, 23207 - 19968: jis0212<<14 | 0x18<<7 | 0x54, 23212 - 19968: jis0212<<14 | 0x18<<7 | 0x55, 23217 - 19968: jis0212<<14 | 0x18<<7 | 0x56, 23218 - 19968: jis0212<<14 | 0x18<<7 | 0x57, 23219 - 19968: jis0212<<14 | 0x18<<7 | 0x58, 23221 - 19968: jis0212<<14 | 0x18<<7 | 0x59, 23224 - 19968: jis0212<<14 | 0x18<<7 | 0x5A, 23226 - 19968: jis0212<<14 | 0x18<<7 | 0x5B, 23227 - 19968: jis0212<<14 | 0x18<<7 | 0x5C, 23228 - 19968: jis0208<<14 | 0x34<<7 | 0x1B, 23229 - 19968: jis0208<<14 | 0x34<<7 | 0x1F, 23230 - 19968: jis0208<<14 | 0x34<<7 | 0x1C, 23231 - 19968: jis0212<<14 | 0x18<<7 | 0x5D, 23233 - 19968: jis0208<<14 | 0x11<<7 | 0x26, 23234 - 19968: jis0208<<14 | 0x34<<7 | 0x1E, 23236 - 19968: jis0212<<14 | 0x19<<7 | 0x00, 23238 - 19968: jis0212<<14 | 0x19<<7 | 0x01, 23240 - 19968: jis0212<<14 | 0x19<<7 | 0x02, 23241 - 19968: jis0208<<14 | 0x1B<<7 | 0x1A, 23243 - 19968: jis0208<<14 | 0x34<<7 | 0x1D, 23244 - 19968: jis0208<<14 | 0x16<<7 | 0x58, 23247 - 19968: jis0212<<14 | 0x19<<7 | 0x03, 23248 - 19968: jis0208<<14 | 0x34<<7 | 0x2B, 23254 - 19968: jis0208<<14 | 0x34<<7 | 0x24, 23255 - 19968: jis0208<<14 | 0x34<<7 | 0x21, 23258 - 19968: jis0212<<14 | 0x19<<7 | 0x04, 23260 - 19968: jis0212<<14 | 0x19<<7 | 0x05, 23264 - 19968: jis0212<<14 | 0x19<<7 | 0x06, 23265 - 19968: jis0208<<14 | 0x22<<7 | 0x43, 23267 - 19968: jis0208<<14 | 0x34<<7 | 0x20, 23269 - 19968: jis0212<<14 | 0x19<<7 | 0x07, 23270 - 19968: jis0208<<14 | 0x34<<7 | 0x22, 23273 - 19968: jis0208<<14 | 0x34<<7 | 0x23, 23274 - 19968: jis0212<<14 | 0x19<<7 | 0x08, 23278 - 19968: jis0212<<14 | 0x19<<7 | 0x09, 23285 - 19968: jis0212<<14 | 0x19<<7 | 0x0A, 23286 - 19968: jis0212<<14 | 0x19<<7 | 0x0B, 23290 - 19968: jis0208<<14 | 0x34<<7 | 0x25, 23291 - 19968: jis0208<<14 | 0x34<<7 | 0x26, 23293 - 19968: jis0212<<14 | 0x19<<7 | 0x0C, 23296 - 19968: jis0212<<14 | 0x19<<7 | 0x0D, 23297 - 19968: jis0212<<14 | 0x19<<7 | 0x0E, 23304 - 19968: jis0212<<14 | 0x19<<7 | 0x0F, 23305 - 19968: jis0208<<14 | 0x13<<7 | 0x51, 23307 - 19968: jis0208<<14 | 0x34<<7 | 0x28, 23308 - 19968: jis0208<<14 | 0x34<<7 | 0x27, 23318 - 19968: jis0208<<14 | 0x34<<7 | 0x29, 23319 - 19968: jis0212<<14 | 0x19<<7 | 0x10, 23321 - 19968: jis0212<<14 | 0x19<<7 | 0x12, 23323 - 19968: jis0212<<14 | 0x19<<7 | 0x13, 23325 - 19968: jis0212<<14 | 0x19<<7 | 0x14, 23329 - 19968: jis0212<<14 | 0x19<<7 | 0x15, 23330 - 19968: jis0208<<14 | 0x1D<<7 | 0x4D, 23333 - 19968: jis0212<<14 | 0x19<<7 | 0x16, 23338 - 19968: jis0208<<14 | 0x34<<7 | 0x2C, 23340 - 19968: jis0208<<14 | 0x23<<7 | 0x3B, 23341 - 19968: jis0212<<14 | 0x19<<7 | 0x17, 23344 - 19968: jis0208<<14 | 0x10<<7 | 0x24, 23346 - 19968: jis0208<<14 | 0x34<<7 | 0x2A, 23348 - 19968: jis0212<<14 | 0x19<<7 | 0x11, 23350 - 19968: jis0208<<14 | 0x34<<7 | 0x2D, 23352 - 19968: jis0212<<14 | 0x19<<7 | 0x18, 23358 - 19968: jis0208<<14 | 0x34<<7 | 0x2E, 23360 - 19968: jis0208<<14 | 0x34<<7 | 0x31, 23361 - 19968: jis0212<<14 | 0x19<<7 | 0x19, 23363 - 19968: jis0208<<14 | 0x34<<7 | 0x2F, 23365 - 19968: jis0208<<14 | 0x34<<7 | 0x30, 23371 - 19968: jis0212<<14 | 0x19<<7 | 0x1A, 23372 - 19968: jis0212<<14 | 0x19<<7 | 0x1B, 23376 - 19968: jis0208<<14 | 0x1A<<7 | 0x31, 23377 - 19968: jis0208<<14 | 0x34<<7 | 0x32, 23378 - 19968: jis0212<<14 | 0x19<<7 | 0x1C, 23380 - 19968: jis0208<<14 | 0x18<<7 | 0x05, 23381 - 19968: jis0208<<14 | 0x34<<7 | 0x33, 23382 - 19968: jis0208<<14 | 0x58<<7 | 0x49, 23383 - 19968: jis0208<<14 | 0x1A<<7 | 0x59, 23384 - 19968: jis0208<<14 | 0x21<<7 | 0x17, 23386 - 19968: jis0208<<14 | 0x34<<7 | 0x34, 23387 - 19968: jis0208<<14 | 0x34<<7 | 0x35, 23388 - 19968: jis0208<<14 | 0x1A<<7 | 0x39, 23389 - 19968: jis0208<<14 | 0x18<<7 | 0x06, 23390 - 19968: jis0212<<14 | 0x19<<7 | 0x1E, 23391 - 19968: jis0208<<14 | 0x2B<<7 | 0x31, 23395 - 19968: jis0208<<14 | 0x14<<7 | 0x07, 23396 - 19968: jis0208<<14 | 0x17<<7 | 0x28, 23397 - 19968: jis0208<<14 | 0x34<<7 | 0x36, 23398 - 19968: jis0208<<14 | 0x12<<7 | 0x37, 23400 - 19968: jis0212<<14 | 0x19<<7 | 0x1F, 23401 - 19968: jis0208<<14 | 0x34<<7 | 0x37, 23403 - 19968: jis0208<<14 | 0x21<<7 | 0x18, 23406 - 19968: jis0212<<14 | 0x19<<7 | 0x20, 23407 - 19968: jis0212<<14 | 0x19<<7 | 0x21, 23408 - 19968: jis0208<<14 | 0x34<<7 | 0x38, 23409 - 19968: jis0208<<14 | 0x35<<7 | 0x02, 23411 - 19968: jis0208<<14 | 0x34<<7 | 0x39, 23413 - 19968: jis0208<<14 | 0x34<<7 | 0x3A, 23416 - 19968: jis0208<<14 | 0x34<<7 | 0x3B, 23418 - 19968: jis0208<<14 | 0x34<<7 | 0x3D, 23420 - 19968: jis0212<<14 | 0x19<<7 | 0x22, 23421 - 19968: jis0212<<14 | 0x19<<7 | 0x23, 23422 - 19968: jis0212<<14 | 0x19<<7 | 0x24, 23423 - 19968: jis0212<<14 | 0x19<<7 | 0x25, 23424 - 19968: jis0208<<14 | 0x34<<7 | 0x3E, 23425 - 19968: jis0212<<14 | 0x19<<7 | 0x26, 23427 - 19968: jis0208<<14 | 0x34<<7 | 0x3F, 23428 - 19968: jis0212<<14 | 0x19<<7 | 0x27, 23429 - 19968: jis0208<<14 | 0x21<<7 | 0x4F, 23430 - 19968: jis0212<<14 | 0x19<<7 | 0x28, 23431 - 19968: jis0208<<14 | 0x10<<7 | 0x06, 23432 - 19968: jis0208<<14 | 0x1B<<7 | 0x48, 23433 - 19968: jis0208<<14 | 0x0F<<7 | 0x21, 23434 - 19968: jis0212<<14 | 0x19<<7 | 0x29, 23435 - 19968: jis0208<<14 | 0x20<<7 | 0x36, 23436 - 19968: jis0208<<14 | 0x13<<7 | 0x0F, 23437 - 19968: jis0208<<14 | 0x1B<<7 | 0x14, 23438 - 19968: jis0212<<14 | 0x19<<7 | 0x2A, 23439 - 19968: jis0208<<14 | 0x18<<7 | 0x07, 23440 - 19968: jis0212<<14 | 0x19<<7 | 0x2B, 23441 - 19968: jis0212<<14 | 0x19<<7 | 0x2C, 23443 - 19968: jis0212<<14 | 0x19<<7 | 0x2D, 23444 - 19968: jis0212<<14 | 0x19<<7 | 0x2E, 23445 - 19968: jis0208<<14 | 0x24<<7 | 0x45, 23446 - 19968: jis0212<<14 | 0x19<<7 | 0x2F, 23447 - 19968: jis0208<<14 | 0x1C<<7 | 0x00, 23448 - 19968: jis0208<<14 | 0x13<<7 | 0x10, 23449 - 19968: jis0208<<14 | 0x22<<7 | 0x47, 23450 - 19968: jis0208<<14 | 0x23<<7 | 0x49, 23451 - 19968: jis0208<<14 | 0x0F<<7 | 0x17, 23452 - 19968: jis0208<<14 | 0x14<<7 | 0x18, 23453 - 19968: jis0208<<14 | 0x29<<7 | 0x54, 23455 - 19968: jis0208<<14 | 0x1B<<7 | 0x21, 23458 - 19968: jis0208<<14 | 0x14<<7 | 0x31, 23459 - 19968: jis0208<<14 | 0x1F<<7 | 0x4A, 23460 - 19968: jis0208<<14 | 0x1B<<7 | 0x1B, 23461 - 19968: jis0208<<14 | 0x2C<<7 | 0x07, 23462 - 19968: jis0208<<14 | 0x34<<7 | 0x40, 23464 - 19968: jis0212<<14 | 0x19<<7 | 0x30, 23465 - 19968: jis0212<<14 | 0x19<<7 | 0x31, 23468 - 19968: jis0212<<14 | 0x19<<7 | 0x32, 23469 - 19968: jis0212<<14 | 0x19<<7 | 0x33, 23470 - 19968: jis0208<<14 | 0x14<<7 | 0x3B, 23471 - 19968: jis0212<<14 | 0x19<<7 | 0x34, 23472 - 19968: jis0208<<14 | 0x19<<7 | 0x2A, 23473 - 19968: jis0212<<14 | 0x19<<7 | 0x35, 23474 - 19968: jis0212<<14 | 0x19<<7 | 0x36, 23475 - 19968: jis0208<<14 | 0x12<<7 | 0x11, 23476 - 19968: jis0208<<14 | 0x10<<7 | 0x42, 23477 - 19968: jis0208<<14 | 0x1D<<7 | 0x0B, 23478 - 19968: jis0208<<14 | 0x11<<7 | 0x27, 23479 - 19968: jis0212<<14 | 0x19<<7 | 0x37, 23480 - 19968: jis0208<<14 | 0x34<<7 | 0x41, 23481 - 19968: jis0208<<14 | 0x2C<<7 | 0x25, 23482 - 19968: jis0212<<14 | 0x19<<7 | 0x38, 23484 - 19968: jis0212<<14 | 0x19<<7 | 0x39, 23487 - 19968: jis0208<<14 | 0x1C<<7 | 0x28, 23488 - 19968: jis0208<<14 | 0x58<<7 | 0x4A, 23489 - 19968: jis0212<<14 | 0x19<<7 | 0x3B, 23490 - 19968: jis0208<<14 | 0x1B<<7 | 0x43, 23491 - 19968: jis0208<<14 | 0x34<<7 | 0x42, 23492 - 19968: jis0208<<14 | 0x13<<7 | 0x52, 23493 - 19968: jis0208<<14 | 0x25<<7 | 0x31, 23494 - 19968: jis0208<<14 | 0x2B<<7 | 0x08, 23495 - 19968: jis0208<<14 | 0x34<<7 | 0x43, 23497 - 19968: jis0208<<14 | 0x34<<7 | 0x44, 23500 - 19968: jis0208<<14 | 0x28<<7 | 0x38, 23501 - 19968: jis0212<<14 | 0x19<<7 | 0x3C, 23503 - 19968: jis0212<<14 | 0x19<<7 | 0x3D, 23504 - 19968: jis0208<<14 | 0x34<<7 | 0x46, 23506 - 19968: jis0208<<14 | 0x13<<7 | 0x07, 23507 - 19968: jis0208<<14 | 0x15<<7 | 0x56, 23508 - 19968: jis0208<<14 | 0x34<<7 | 0x45, 23510 - 19968: jis0212<<14 | 0x19<<7 | 0x3E, 23511 - 19968: jis0212<<14 | 0x19<<7 | 0x3F, 23512 - 19968: jis0208<<14 | 0x58<<7 | 0x4C, 23513 - 19968: jis0212<<14 | 0x19<<7 | 0x41, 23514 - 19968: jis0212<<14 | 0x19<<7 | 0x42, 23515 - 19968: jis0208<<14 | 0x13<<7 | 0x11, 23517 - 19968: jis0208<<14 | 0x1E<<7 | 0x11, 23518 - 19968: jis0208<<14 | 0x34<<7 | 0x4A, 23519 - 19968: jis0208<<14 | 0x1A<<7 | 0x00, 23520 - 19968: jis0212<<14 | 0x19<<7 | 0x43, 23521 - 19968: jis0208<<14 | 0x11<<7 | 0x28, 23522 - 19968: jis0208<<14 | 0x34<<7 | 0x49, 23524 - 19968: jis0208<<14 | 0x34<<7 | 0x47, 23525 - 19968: jis0208<<14 | 0x34<<7 | 0x4B, 23526 - 19968: jis0208<<14 | 0x34<<7 | 0x48, 23527 - 19968: jis0208<<14 | 0x26<<7 | 0x0A, 23528 - 19968: jis0208<<14 | 0x3B<<7 | 0x2C, 23529 - 19968: jis0208<<14 | 0x1E<<7 | 0x12, 23531 - 19968: jis0208<<14 | 0x34<<7 | 0x4C, 23532 - 19968: jis0208<<14 | 0x58<<7 | 0x4D, 23534 - 19968: jis0208<<14 | 0x2D<<7 | 0x1F, 23535 - 19968: jis0212<<14 | 0x19<<7 | 0x44, 23536 - 19968: jis0208<<14 | 0x34<<7 | 0x4D, 23537 - 19968: jis0212<<14 | 0x19<<7 | 0x45, 23539 - 19968: jis0208<<14 | 0x34<<7 | 0x4F, 23540 - 19968: jis0212<<14 | 0x19<<7 | 0x46, 23541 - 19968: jis0208<<14 | 0x22<<7 | 0x5D, 23542 - 19968: jis0208<<14 | 0x34<<7 | 0x4E, 23544 - 19968: jis0208<<14 | 0x1F<<7 | 0x02, 23546 - 19968: jis0208<<14 | 0x1A<<7 | 0x5A, 23549 - 19968: jis0212<<14 | 0x19<<7 | 0x47, 23550 - 19968: jis0208<<14 | 0x21<<7 | 0x2F, 23551 - 19968: jis0208<<14 | 0x1B<<7 | 0x56, 23553 - 19968: jis0208<<14 | 0x28<<7 | 0x54, 23554 - 19968: jis0208<<14 | 0x1F<<7 | 0x4B, 23556 - 19968: jis0208<<14 | 0x1B<<7 | 0x2C, 23557 - 19968: jis0208<<14 | 0x34<<7 | 0x50, 23558 - 19968: jis0208<<14 | 0x1D<<7 | 0x0C, 23559 - 19968: jis0208<<14 | 0x34<<7 | 0x51, 23560 - 19968: jis0208<<14 | 0x34<<7 | 0x52, 23561 - 19968: jis0208<<14 | 0x0F<<7 | 0x32, 23562 - 19968: jis0208<<14 | 0x21<<7 | 0x19, 23563 - 19968: jis0208<<14 | 0x1E<<7 | 0x31, 23564 - 19968: jis0212<<14 | 0x19<<7 | 0x48, 23565 - 19968: jis0208<<14 | 0x34<<7 | 0x53, 23566 - 19968: jis0208<<14 | 0x25<<7 | 0x12, 23567 - 19968: jis0208<<14 | 0x1D<<7 | 0x0D, 23569 - 19968: jis0208<<14 | 0x1D<<7 | 0x0E, 23571 - 19968: jis0208<<14 | 0x34<<7 | 0x54, 23574 - 19968: jis0208<<14 | 0x1F<<7 | 0x4C, 23575 - 19968: jis0212<<14 | 0x19<<7 | 0x49, 23578 - 19968: jis0208<<14 | 0x1D<<7 | 0x0F, 23582 - 19968: jis0208<<14 | 0x58<<7 | 0x4E, 23583 - 19968: jis0212<<14 | 0x19<<7 | 0x4B, 23584 - 19968: jis0208<<14 | 0x34<<7 | 0x55, 23586 - 19968: jis0208<<14 | 0x34<<7 | 0x56, 23587 - 19968: jis0212<<14 | 0x19<<7 | 0x4C, 23588 - 19968: jis0208<<14 | 0x2B<<7 | 0x3F, 23590 - 19968: jis0212<<14 | 0x19<<7 | 0x4D, 23592 - 19968: jis0208<<14 | 0x34<<7 | 0x57, 23593 - 19968: jis0212<<14 | 0x19<<7 | 0x4E, 23595 - 19968: jis0212<<14 | 0x19<<7 | 0x4F, 23596 - 19968: jis0212<<14 | 0x19<<7 | 0x50, 23597 - 19968: jis0208<<14 | 0x15<<7 | 0x25, 23598 - 19968: jis0212<<14 | 0x19<<7 | 0x51, 23600 - 19968: jis0212<<14 | 0x19<<7 | 0x52, 23601 - 19968: jis0208<<14 | 0x1C<<7 | 0x01, 23602 - 19968: jis0212<<14 | 0x19<<7 | 0x53, 23605 - 19968: jis0212<<14 | 0x19<<7 | 0x54, 23606 - 19968: jis0212<<14 | 0x19<<7 | 0x55, 23608 - 19968: jis0208<<14 | 0x34<<7 | 0x58, 23609 - 19968: jis0208<<14 | 0x34<<7 | 0x59, 23610 - 19968: jis0208<<14 | 0x1B<<7 | 0x3B, 23611 - 19968: jis0208<<14 | 0x1E<<7 | 0x0B, 23612 - 19968: jis0208<<14 | 0x25<<7 | 0x53, 23613 - 19968: jis0208<<14 | 0x1E<<7 | 0x33, 23614 - 19968: jis0208<<14 | 0x27<<7 | 0x57, 23615 - 19968: jis0208<<14 | 0x26<<7 | 0x01, 23616 - 19968: jis0208<<14 | 0x15<<7 | 0x28, 23617 - 19968: jis0208<<14 | 0x34<<7 | 0x5A, 23621 - 19968: jis0208<<14 | 0x14<<7 | 0x4E, 23622 - 19968: jis0208<<14 | 0x34<<7 | 0x5B, 23624 - 19968: jis0208<<14 | 0x15<<7 | 0x5D, 23626 - 19968: jis0208<<14 | 0x25<<7 | 0x2E, 23627 - 19968: jis0208<<14 | 0x11<<7 | 0x0F, 23629 - 19968: jis0208<<14 | 0x1A<<7 | 0x32, 23630 - 19968: jis0208<<14 | 0x34<<7 | 0x5C, 23631 - 19968: jis0208<<14 | 0x35<<7 | 0x01, 23632 - 19968: jis0208<<14 | 0x35<<7 | 0x00, 23633 - 19968: jis0208<<14 | 0x15<<7 | 0x5C, 23635 - 19968: jis0208<<14 | 0x34<<7 | 0x5D, 23637 - 19968: jis0208<<14 | 0x24<<7 | 0x17, 23641 - 19968: jis0212<<14 | 0x19<<7 | 0x56, 23642 - 19968: jis0212<<14 | 0x19<<7 | 0x57, 23644 - 19968: jis0212<<14 | 0x19<<7 | 0x58, 23646 - 19968: jis0208<<14 | 0x21<<7 | 0x0F, 23648 - 19968: jis0208<<14 | 0x24<<7 | 0x2A, 23649 - 19968: jis0208<<14 | 0x1B<<7 | 0x27, 23650 - 19968: jis0212<<14 | 0x19<<7 | 0x59, 23651 - 19968: jis0212<<14 | 0x19<<7 | 0x5A, 23652 - 19968: jis0208<<14 | 0x20<<7 | 0x37, 23653 - 19968: jis0208<<14 | 0x2C<<7 | 0x59, 23655 - 19968: jis0212<<14 | 0x19<<7 | 0x5B, 23656 - 19968: jis0212<<14 | 0x19<<7 | 0x5C, 23657 - 19968: jis0212<<14 | 0x19<<7 | 0x5D, 23660 - 19968: jis0208<<14 | 0x35<<7 | 0x03, 23661 - 19968: jis0212<<14 | 0x1A<<7 | 0x00, 23662 - 19968: jis0208<<14 | 0x35<<7 | 0x04, 23663 - 19968: jis0208<<14 | 0x25<<7 | 0x35, 23664 - 19968: jis0212<<14 | 0x1A<<7 | 0x01, 23665 - 19968: jis0208<<14 | 0x1A<<7 | 0x12, 23668 - 19968: jis0212<<14 | 0x1A<<7 | 0x02, 23669 - 19968: jis0212<<14 | 0x1A<<7 | 0x03, 23670 - 19968: jis0208<<14 | 0x35<<7 | 0x06, 23673 - 19968: jis0208<<14 | 0x35<<7 | 0x07, 23674 - 19968: jis0212<<14 | 0x1A<<7 | 0x04, 23675 - 19968: jis0212<<14 | 0x1A<<7 | 0x05, 23676 - 19968: jis0212<<14 | 0x1A<<7 | 0x06, 23677 - 19968: jis0212<<14 | 0x1A<<7 | 0x07, 23687 - 19968: jis0212<<14 | 0x1A<<7 | 0x08, 23688 - 19968: jis0212<<14 | 0x1A<<7 | 0x09, 23690 - 19968: jis0212<<14 | 0x1A<<7 | 0x0A, 23692 - 19968: jis0208<<14 | 0x35<<7 | 0x08, 23695 - 19968: jis0212<<14 | 0x1A<<7 | 0x0B, 23696 - 19968: jis0208<<14 | 0x13<<7 | 0x53, 23697 - 19968: jis0208<<14 | 0x35<<7 | 0x09, 23698 - 19968: jis0212<<14 | 0x1A<<7 | 0x0C, 23700 - 19968: jis0208<<14 | 0x35<<7 | 0x0A, 23709 - 19968: jis0212<<14 | 0x1A<<7 | 0x0D, 23711 - 19968: jis0212<<14 | 0x1A<<7 | 0x0E, 23712 - 19968: jis0212<<14 | 0x1A<<7 | 0x0F, 23713 - 19968: jis0208<<14 | 0x11<<7 | 0x0B, 23714 - 19968: jis0212<<14 | 0x1A<<7 | 0x10, 23715 - 19968: jis0212<<14 | 0x1A<<7 | 0x11, 23718 - 19968: jis0208<<14 | 0x58<<7 | 0x4F, 23720 - 19968: jis0208<<14 | 0x20<<7 | 0x1A, 23721 - 19968: jis0208<<14 | 0x13<<7 | 0x43, 23722 - 19968: jis0212<<14 | 0x1A<<7 | 0x13, 23723 - 19968: jis0208<<14 | 0x35<<7 | 0x0C, 23724 - 19968: jis0208<<14 | 0x2B<<7 | 0x07, 23729 - 19968: jis0208<<14 | 0x21<<7 | 0x31, 23730 - 19968: jis0212<<14 | 0x1A<<7 | 0x14, 23731 - 19968: jis0208<<14 | 0x12<<7 | 0x38, 23732 - 19968: jis0212<<14 | 0x1A<<7 | 0x15, 23733 - 19968: jis0212<<14 | 0x1A<<7 | 0x16, 23734 - 19968: jis0208<<14 | 0x35<<7 | 0x0E, 23735 - 19968: jis0208<<14 | 0x35<<7 | 0x10, 23736 - 19968: jis0208<<14 | 0x13<<7 | 0x3E, 23738 - 19968: jis0208<<14 | 0x58<<7 | 0x50, 23739 - 19968: jis0208<<14 | 0x35<<7 | 0x0D, 23740 - 19968: jis0208<<14 | 0x35<<7 | 0x0F, 23742 - 19968: jis0208<<14 | 0x35<<7 | 0x12, 23749 - 19968: jis0208<<14 | 0x35<<7 | 0x11, 23751 - 19968: jis0208<<14 | 0x35<<7 | 0x13, 23753 - 19968: jis0212<<14 | 0x1A<<7 | 0x18, 23755 - 19968: jis0212<<14 | 0x1A<<7 | 0x19, 23762 - 19968: jis0212<<14 | 0x1A<<7 | 0x1A, 23767 - 19968: jis0212<<14 | 0x1A<<7 | 0x1C, 23769 - 19968: jis0208<<14 | 0x35<<7 | 0x14, 23773 - 19968: jis0212<<14 | 0x1A<<7 | 0x1B, 23776 - 19968: jis0208<<14 | 0x25<<7 | 0x1C, 23777 - 19968: jis0208<<14 | 0x15<<7 | 0x0D, 23784 - 19968: jis0208<<14 | 0x11<<7 | 0x44, 23785 - 19968: jis0208<<14 | 0x35<<7 | 0x15, 23786 - 19968: jis0208<<14 | 0x35<<7 | 0x1A, 23789 - 19968: jis0208<<14 | 0x35<<7 | 0x18, 23790 - 19968: jis0212<<14 | 0x1A<<7 | 0x1D, 23791 - 19968: jis0208<<14 | 0x29<<7 | 0x56, 23792 - 19968: jis0208<<14 | 0x29<<7 | 0x55, 23793 - 19968: jis0212<<14 | 0x1A<<7 | 0x1E, 23794 - 19968: jis0212<<14 | 0x1A<<7 | 0x1F, 23796 - 19968: jis0212<<14 | 0x1A<<7 | 0x20, 23797 - 19968: jis0208<<14 | 0x58<<7 | 0x51, 23798 - 19968: jis0208<<14 | 0x24<<7 | 0x46, 23802 - 19968: jis0208<<14 | 0x35<<7 | 0x17, 23803 - 19968: jis0208<<14 | 0x1C<<7 | 0x33, 23805 - 19968: jis0208<<14 | 0x35<<7 | 0x16, 23809 - 19968: jis0212<<14 | 0x1A<<7 | 0x21, 23814 - 19968: jis0212<<14 | 0x1A<<7 | 0x22, 23815 - 19968: jis0208<<14 | 0x1E<<7 | 0x51, 23819 - 19968: jis0208<<14 | 0x35<<7 | 0x1B, 23821 - 19968: jis0212<<14 | 0x1A<<7 | 0x23, 23822 - 19968: jis0208<<14 | 0x19<<7 | 0x49, 23825 - 19968: jis0208<<14 | 0x35<<7 | 0x21, 23826 - 19968: jis0212<<14 | 0x1A<<7 | 0x24, 23828 - 19968: jis0208<<14 | 0x35<<7 | 0x22, 23829 - 19968: jis0208<<14 | 0x35<<7 | 0x1C, 23830 - 19968: jis0208<<14 | 0x12<<7 | 0x12, 23831 - 19968: jis0208<<14 | 0x35<<7 | 0x1D, 23832 - 19968: jis0208<<14 | 0x35<<7 | 0x26, 23833 - 19968: jis0208<<14 | 0x35<<7 | 0x25, 23834 - 19968: jis0208<<14 | 0x35<<7 | 0x24, 23835 - 19968: jis0208<<14 | 0x35<<7 | 0x20, 23839 - 19968: jis0208<<14 | 0x35<<7 | 0x1F, 23842 - 19968: jis0208<<14 | 0x35<<7 | 0x23, 23843 - 19968: jis0212<<14 | 0x1A<<7 | 0x26, 23844 - 19968: jis0212<<14 | 0x1A<<7 | 0x27, 23846 - 19968: jis0212<<14 | 0x1A<<7 | 0x28, 23847 - 19968: jis0208<<14 | 0x58<<7 | 0x52, 23849 - 19968: jis0208<<14 | 0x29<<7 | 0x57, 23851 - 19968: jis0212<<14 | 0x1A<<7 | 0x25, 23857 - 19968: jis0212<<14 | 0x1A<<7 | 0x2A, 23860 - 19968: jis0212<<14 | 0x1A<<7 | 0x2B, 23865 - 19968: jis0212<<14 | 0x1A<<7 | 0x2C, 23869 - 19968: jis0212<<14 | 0x1A<<7 | 0x2D, 23871 - 19968: jis0212<<14 | 0x1A<<7 | 0x2E, 23874 - 19968: jis0208<<14 | 0x58<<7 | 0x55, 23875 - 19968: jis0212<<14 | 0x1A<<7 | 0x30, 23878 - 19968: jis0212<<14 | 0x1A<<7 | 0x31, 23880 - 19968: jis0212<<14 | 0x1A<<7 | 0x32, 23882 - 19968: jis0212<<14 | 0x1A<<7 | 0x36, 23883 - 19968: jis0208<<14 | 0x35<<7 | 0x2A, 23884 - 19968: jis0208<<14 | 0x35<<7 | 0x27, 23886 - 19968: jis0208<<14 | 0x35<<7 | 0x29, 23888 - 19968: jis0208<<14 | 0x2C<<7 | 0x51, 23889 - 19968: jis0212<<14 | 0x1A<<7 | 0x34, 23890 - 19968: jis0208<<14 | 0x35<<7 | 0x28, 23891 - 19968: jis0208<<14 | 0x58<<7 | 0x53, 23893 - 19968: jis0212<<14 | 0x1A<<7 | 0x33, 23897 - 19968: jis0212<<14 | 0x1A<<7 | 0x35, 23900 - 19968: jis0208<<14 | 0x35<<7 | 0x1E, 23903 - 19968: jis0212<<14 | 0x1A<<7 | 0x37, 23904 - 19968: jis0212<<14 | 0x1A<<7 | 0x38, 23905 - 19968: jis0212<<14 | 0x1A<<7 | 0x39, 23906 - 19968: jis0212<<14 | 0x1A<<7 | 0x3A, 23908 - 19968: jis0212<<14 | 0x1A<<7 | 0x3B, 23913 - 19968: jis0208<<14 | 0x1E<<7 | 0x52, 23914 - 19968: jis0212<<14 | 0x1A<<7 | 0x3C, 23916 - 19968: jis0208<<14 | 0x35<<7 | 0x2B, 23917 - 19968: jis0208<<14 | 0x58<<7 | 0x56, 23919 - 19968: jis0208<<14 | 0x19<<7 | 0x16, 23920 - 19968: jis0212<<14 | 0x1A<<7 | 0x3E, 23923 - 19968: jis0208<<14 | 0x35<<7 | 0x2C, 23926 - 19968: jis0208<<14 | 0x35<<7 | 0x2D, 23929 - 19968: jis0212<<14 | 0x1A<<7 | 0x3F, 23930 - 19968: jis0212<<14 | 0x1A<<7 | 0x40, 23934 - 19968: jis0212<<14 | 0x1A<<7 | 0x41, 23935 - 19968: jis0212<<14 | 0x1A<<7 | 0x42, 23937 - 19968: jis0212<<14 | 0x1A<<7 | 0x43, 23938 - 19968: jis0208<<14 | 0x35<<7 | 0x30, 23939 - 19968: jis0212<<14 | 0x1A<<7 | 0x44, 23940 - 19968: jis0208<<14 | 0x35<<7 | 0x2F, 23943 - 19968: jis0208<<14 | 0x35<<7 | 0x2E, 23944 - 19968: jis0212<<14 | 0x1A<<7 | 0x45, 23946 - 19968: jis0212<<14 | 0x1A<<7 | 0x46, 23947 - 19968: jis0208<<14 | 0x24<<7 | 0x47, 23948 - 19968: jis0208<<14 | 0x35<<7 | 0x19, 23952 - 19968: jis0208<<14 | 0x35<<7 | 0x36, 23954 - 19968: jis0212<<14 | 0x1A<<7 | 0x47, 23955 - 19968: jis0212<<14 | 0x1A<<7 | 0x48, 23956 - 19968: jis0212<<14 | 0x1A<<7 | 0x49, 23957 - 19968: jis0212<<14 | 0x1A<<7 | 0x4A, 23961 - 19968: jis0212<<14 | 0x1A<<7 | 0x4B, 23963 - 19968: jis0212<<14 | 0x1A<<7 | 0x4C, 23965 - 19968: jis0208<<14 | 0x35<<7 | 0x32, 23967 - 19968: jis0212<<14 | 0x1A<<7 | 0x4D, 23968 - 19968: jis0212<<14 | 0x1A<<7 | 0x4E, 23970 - 19968: jis0208<<14 | 0x35<<7 | 0x31, 23975 - 19968: jis0212<<14 | 0x1A<<7 | 0x4F, 23979 - 19968: jis0212<<14 | 0x1A<<7 | 0x50, 23980 - 19968: jis0208<<14 | 0x35<<7 | 0x33, 23982 - 19968: jis0208<<14 | 0x35<<7 | 0x34, 23984 - 19968: jis0212<<14 | 0x1A<<7 | 0x51, 23986 - 19968: jis0212<<14 | 0x45<<7 | 0x53, 23988 - 19968: jis0212<<14 | 0x1A<<7 | 0x52, 23991 - 19968: jis0208<<14 | 0x35<<7 | 0x37, 23992 - 19968: jis0208<<14 | 0x58<<7 | 0x57, 23993 - 19968: jis0208<<14 | 0x58<<7 | 0x58, 23994 - 19968: jis0208<<14 | 0x2D<<7 | 0x45, 23996 - 19968: jis0208<<14 | 0x35<<7 | 0x38, 23997 - 19968: jis0208<<14 | 0x35<<7 | 0x35, 24003 - 19968: jis0212<<14 | 0x1A<<7 | 0x55, 24007 - 19968: jis0212<<14 | 0x1A<<7 | 0x56, 24009 - 19968: jis0208<<14 | 0x35<<7 | 0x39, 24011 - 19968: jis0212<<14 | 0x1A<<7 | 0x57, 24012 - 19968: jis0208<<14 | 0x13<<7 | 0x3F, 24013 - 19968: jis0208<<14 | 0x35<<7 | 0x3A, 24014 - 19968: jis0212<<14 | 0x1A<<7 | 0x59, 24016 - 19968: jis0208<<14 | 0x58<<7 | 0x59, 24018 - 19968: jis0208<<14 | 0x35<<7 | 0x3C, 24019 - 19968: jis0208<<14 | 0x35<<7 | 0x3B, 24022 - 19968: jis0208<<14 | 0x35<<7 | 0x3D, 24024 - 19968: jis0212<<14 | 0x1A<<7 | 0x5A, 24025 - 19968: jis0212<<14 | 0x1A<<7 | 0x5B, 24027 - 19968: jis0208<<14 | 0x35<<7 | 0x3E, 24029 - 19968: jis0208<<14 | 0x1F<<7 | 0x4D, 24030 - 19968: jis0208<<14 | 0x1C<<7 | 0x02, 24032 - 19968: jis0212<<14 | 0x1A<<7 | 0x5C, 24033 - 19968: jis0208<<14 | 0x1C<<7 | 0x43, 24035 - 19968: jis0208<<14 | 0x20<<7 | 0x42, 24036 - 19968: jis0212<<14 | 0x1A<<7 | 0x5D, 24037 - 19968: jis0208<<14 | 0x18<<7 | 0x08, 24038 - 19968: jis0208<<14 | 0x19<<7 | 0x17, 24039 - 19968: jis0208<<14 | 0x18<<7 | 0x09, 24040 - 19968: jis0208<<14 | 0x14<<7 | 0x4F, 24041 - 19968: jis0212<<14 | 0x1B<<7 | 0x00, 24043 - 19968: jis0208<<14 | 0x35<<7 | 0x3F, 24046 - 19968: jis0208<<14 | 0x19<<7 | 0x18, 24049 - 19968: jis0208<<14 | 0x17<<7 | 0x29, 24050 - 19968: jis0208<<14 | 0x35<<7 | 0x40, 24051 - 19968: jis0208<<14 | 0x2B<<7 | 0x05, 24052 - 19968: jis0208<<14 | 0x26<<7 | 0x22, 24053 - 19968: jis0208<<14 | 0x35<<7 | 0x41, 24055 - 19968: jis0208<<14 | 0x18<<7 | 0x0A, 24056 - 19968: jis0212<<14 | 0x1B<<7 | 0x01, 24057 - 19968: jis0212<<14 | 0x1B<<7 | 0x02, 24059 - 19968: jis0208<<14 | 0x13<<7 | 0x0B, 24061 - 19968: jis0208<<14 | 0x22<<7 | 0x06, 24062 - 19968: jis0208<<14 | 0x15<<7 | 0x31, 24064 - 19968: jis0212<<14 | 0x1B<<7 | 0x03, 24066 - 19968: jis0208<<14 | 0x1A<<7 | 0x33, 24067 - 19968: jis0208<<14 | 0x28<<7 | 0x3A, 24070 - 19968: jis0208<<14 | 0x27<<7 | 0x20, 24071 - 19968: jis0212<<14 | 0x1B<<7 | 0x04, 24075 - 19968: jis0208<<14 | 0x35<<7 | 0x42, 24076 - 19968: jis0208<<14 | 0x13<<7 | 0x54, 24077 - 19968: jis0212<<14 | 0x1B<<7 | 0x05, 24081 - 19968: jis0208<<14 | 0x35<<7 | 0x45, 24082 - 19968: jis0212<<14 | 0x1B<<7 | 0x06, 24084 - 19968: jis0212<<14 | 0x1B<<7 | 0x07, 24085 - 19968: jis0212<<14 | 0x1B<<7 | 0x08, 24086 - 19968: jis0208<<14 | 0x23<<7 | 0x00, 24088 - 19968: jis0212<<14 | 0x1B<<7 | 0x09, 24089 - 19968: jis0208<<14 | 0x35<<7 | 0x44, 24090 - 19968: jis0208<<14 | 0x35<<7 | 0x43, 24091 - 19968: jis0208<<14 | 0x35<<7 | 0x46, 24093 - 19968: jis0208<<14 | 0x23<<7 | 0x4A, 24095 - 19968: jis0212<<14 | 0x1B<<7 | 0x0A, 24096 - 19968: jis0212<<14 | 0x1B<<7 | 0x0B, 24101 - 19968: jis0208<<14 | 0x1E<<7 | 0x42, 24104 - 19968: jis0212<<14 | 0x1B<<7 | 0x0D, 24107 - 19968: jis0208<<14 | 0x1A<<7 | 0x34, 24109 - 19968: jis0208<<14 | 0x1F<<7 | 0x29, 24110 - 19968: jis0212<<14 | 0x1B<<7 | 0x0C, 24111 - 19968: jis0208<<14 | 0x21<<7 | 0x32, 24112 - 19968: jis0208<<14 | 0x14<<7 | 0x01, 24114 - 19968: jis0212<<14 | 0x1B<<7 | 0x0E, 24115 - 19968: jis0208<<14 | 0x23<<7 | 0x01, 24117 - 19968: jis0212<<14 | 0x1B<<7 | 0x0F, 24118 - 19968: jis0208<<14 | 0x35<<7 | 0x47, 24119 - 19968: jis0208<<14 | 0x35<<7 | 0x48, 24120 - 19968: jis0208<<14 | 0x1D<<7 | 0x4E, 24125 - 19968: jis0208<<14 | 0x2A<<7 | 0x18, 24126 - 19968: jis0212<<14 | 0x1B<<7 | 0x10, 24128 - 19968: jis0208<<14 | 0x35<<7 | 0x4B, 24131 - 19968: jis0208<<14 | 0x35<<7 | 0x4A, 24132 - 19968: jis0208<<14 | 0x35<<7 | 0x49, 24133 - 19968: jis0208<<14 | 0x28<<7 | 0x5C, 24135 - 19968: jis0208<<14 | 0x35<<7 | 0x52, 24137 - 19968: jis0212<<14 | 0x1B<<7 | 0x13, 24139 - 19968: jis0212<<14 | 0x1B<<7 | 0x11, 24140 - 19968: jis0208<<14 | 0x2A<<7 | 0x39, 24142 - 19968: jis0208<<14 | 0x35<<7 | 0x4C, 24144 - 19968: jis0212<<14 | 0x1B<<7 | 0x12, 24145 - 19968: jis0212<<14 | 0x1B<<7 | 0x14, 24148 - 19968: jis0208<<14 | 0x35<<7 | 0x4E, 24149 - 19968: jis0208<<14 | 0x2A<<7 | 0x4A, 24150 - 19968: jis0212<<14 | 0x1B<<7 | 0x15, 24151 - 19968: jis0208<<14 | 0x35<<7 | 0x4D, 24152 - 19968: jis0212<<14 | 0x1B<<7 | 0x16, 24155 - 19968: jis0212<<14 | 0x1B<<7 | 0x17, 24156 - 19968: jis0212<<14 | 0x1B<<7 | 0x18, 24158 - 19968: jis0212<<14 | 0x1B<<7 | 0x19, 24159 - 19968: jis0208<<14 | 0x35<<7 | 0x4F, 24161 - 19968: jis0208<<14 | 0x27<<7 | 0x07, 24162 - 19968: jis0208<<14 | 0x35<<7 | 0x50, 24163 - 19968: jis0208<<14 | 0x29<<7 | 0x1D, 24164 - 19968: jis0208<<14 | 0x35<<7 | 0x51, 24168 - 19968: jis0212<<14 | 0x1B<<7 | 0x1A, 24170 - 19968: jis0212<<14 | 0x1B<<7 | 0x1B, 24171 - 19968: jis0212<<14 | 0x1B<<7 | 0x1C, 24172 - 19968: jis0212<<14 | 0x1B<<7 | 0x1D, 24173 - 19968: jis0212<<14 | 0x1B<<7 | 0x1E, 24174 - 19968: jis0212<<14 | 0x1B<<7 | 0x1F, 24176 - 19968: jis0212<<14 | 0x1B<<7 | 0x20, 24178 - 19968: jis0208<<14 | 0x13<<7 | 0x12, 24179 - 19968: jis0208<<14 | 0x29<<7 | 0x1E, 24180 - 19968: jis0208<<14 | 0x26<<7 | 0x0E, 24181 - 19968: jis0208<<14 | 0x35<<7 | 0x53, 24182 - 19968: jis0208<<14 | 0x35<<7 | 0x54, 24184 - 19968: jis0208<<14 | 0x18<<7 | 0x0B, 24185 - 19968: jis0208<<14 | 0x13<<7 | 0x13, 24186 - 19968: jis0208<<14 | 0x35<<7 | 0x55, 24187 - 19968: jis0208<<14 | 0x17<<7 | 0x17, 24188 - 19968: jis0208<<14 | 0x2C<<7 | 0x23, 24189 - 19968: jis0208<<14 | 0x2C<<7 | 0x08, 24190 - 19968: jis0208<<14 | 0x13<<7 | 0x55, 24191 - 19968: jis0208<<14 | 0x35<<7 | 0x57, 24192 - 19968: jis0212<<14 | 0x1B<<7 | 0x21, 24193 - 19968: jis0208<<14 | 0x23<<7 | 0x02, 24195 - 19968: jis0208<<14 | 0x18<<7 | 0x0C, 24196 - 19968: jis0208<<14 | 0x1D<<7 | 0x10, 24199 - 19968: jis0208<<14 | 0x27<<7 | 0x3E, 24202 - 19968: jis0208<<14 | 0x1D<<7 | 0x11, 24203 - 19968: jis0212<<14 | 0x1B<<7 | 0x22, 24206 - 19968: jis0212<<14 | 0x1B<<7 | 0x23, 24207 - 19968: jis0208<<14 | 0x1C<<7 | 0x57, 24213 - 19968: jis0208<<14 | 0x23<<7 | 0x4B, 24214 - 19968: jis0208<<14 | 0x29<<7 | 0x58, 24215 - 19968: jis0208<<14 | 0x24<<7 | 0x18, 24218 - 19968: jis0208<<14 | 0x18<<7 | 0x0D, 24220 - 19968: jis0208<<14 | 0x28<<7 | 0x3B, 24224 - 19968: jis0208<<14 | 0x35<<7 | 0x58, 24226 - 19968: jis0212<<14 | 0x1B<<7 | 0x24, 24228 - 19968: jis0212<<14 | 0x1B<<7 | 0x25, 24229 - 19968: jis0212<<14 | 0x1B<<7 | 0x26, 24230 - 19968: jis0208<<14 | 0x24<<7 | 0x38, 24231 - 19968: jis0208<<14 | 0x19<<7 | 0x21, 24232 - 19968: jis0212<<14 | 0x1B<<7 | 0x27, 24234 - 19968: jis0212<<14 | 0x1B<<7 | 0x28, 24235 - 19968: jis0208<<14 | 0x17<<7 | 0x2A, 24236 - 19968: jis0212<<14 | 0x1B<<7 | 0x29, 24237 - 19968: jis0208<<14 | 0x23<<7 | 0x4C, 24241 - 19968: jis0212<<14 | 0x1B<<7 | 0x2A, 24243 - 19968: jis0212<<14 | 0x1B<<7 | 0x2B, 24245 - 19968: jis0208<<14 | 0x0F<<7 | 0x22, 24246 - 19968: jis0208<<14 | 0x1C<<7 | 0x4D, 24247 - 19968: jis0208<<14 | 0x18<<7 | 0x0E, 24248 - 19968: jis0208<<14 | 0x2C<<7 | 0x26, 24253 - 19968: jis0212<<14 | 0x1B<<7 | 0x2C, 24254 - 19968: jis0212<<14 | 0x1B<<7 | 0x2D, 24255 - 19968: jis0212<<14 | 0x1B<<7 | 0x2E, 24257 - 19968: jis0208<<14 | 0x35<<7 | 0x59, 24258 - 19968: jis0208<<14 | 0x35<<7 | 0x5A, 24259 - 19968: jis0208<<14 | 0x26<<7 | 0x30, 24262 - 19968: jis0212<<14 | 0x1B<<7 | 0x2F, 24264 - 19968: jis0208<<14 | 0x35<<7 | 0x5B, 24265 - 19968: jis0208<<14 | 0x2D<<7 | 0x56, 24266 - 19968: jis0208<<14 | 0x2E<<7 | 0x0C, 24267 - 19968: jis0212<<14 | 0x1B<<7 | 0x31, 24268 - 19968: jis0212<<14 | 0x1B<<7 | 0x30, 24270 - 19968: jis0212<<14 | 0x1B<<7 | 0x32, 24271 - 19968: jis0208<<14 | 0x35<<7 | 0x5D, 24272 - 19968: jis0208<<14 | 0x35<<7 | 0x5C, 24273 - 19968: jis0212<<14 | 0x1B<<7 | 0x33, 24274 - 19968: jis0212<<14 | 0x1B<<7 | 0x34, 24275 - 19968: jis0208<<14 | 0x12<<7 | 0x26, 24276 - 19968: jis0212<<14 | 0x1B<<7 | 0x35, 24277 - 19968: jis0212<<14 | 0x1B<<7 | 0x36, 24278 - 19968: jis0208<<14 | 0x36<<7 | 0x00, 24282 - 19968: jis0208<<14 | 0x36<<7 | 0x03, 24283 - 19968: jis0208<<14 | 0x36<<7 | 0x04, 24284 - 19968: jis0212<<14 | 0x1B<<7 | 0x37, 24285 - 19968: jis0208<<14 | 0x36<<7 | 0x02, 24286 - 19968: jis0212<<14 | 0x1B<<7 | 0x38, 24287 - 19968: jis0208<<14 | 0x28<<7 | 0x1F, 24288 - 19968: jis0208<<14 | 0x1D<<7 | 0x12, 24289 - 19968: jis0208<<14 | 0x36<<7 | 0x06, 24290 - 19968: jis0208<<14 | 0x36<<7 | 0x05, 24291 - 19968: jis0208<<14 | 0x36<<7 | 0x01, 24293 - 19968: jis0212<<14 | 0x1B<<7 | 0x39, 24296 - 19968: jis0208<<14 | 0x36<<7 | 0x07, 24297 - 19968: jis0208<<14 | 0x36<<7 | 0x08, 24299 - 19968: jis0212<<14 | 0x1B<<7 | 0x3A, 24300 - 19968: jis0208<<14 | 0x36<<7 | 0x09, 24304 - 19968: jis0208<<14 | 0x36<<7 | 0x0C, 24305 - 19968: jis0208<<14 | 0x36<<7 | 0x0A, 24307 - 19968: jis0208<<14 | 0x36<<7 | 0x0B, 24308 - 19968: jis0208<<14 | 0x36<<7 | 0x0D, 24310 - 19968: jis0208<<14 | 0x10<<7 | 0x43, 24311 - 19968: jis0208<<14 | 0x23<<7 | 0x4D, 24312 - 19968: jis0208<<14 | 0x36<<7 | 0x0E, 24314 - 19968: jis0208<<14 | 0x16<<7 | 0x59, 24315 - 19968: jis0208<<14 | 0x11<<7 | 0x55, 24316 - 19968: jis0208<<14 | 0x26<<7 | 0x15, 24318 - 19968: jis0208<<14 | 0x36<<7 | 0x0F, 24319 - 19968: jis0208<<14 | 0x25<<7 | 0x5A, 24321 - 19968: jis0208<<14 | 0x29<<7 | 0x3A, 24322 - 19968: jis0212<<14 | 0x1B<<7 | 0x3B, 24323 - 19968: jis0208<<14 | 0x36<<7 | 0x10, 24324 - 19968: jis0208<<14 | 0x2E<<7 | 0x0D, 24326 - 19968: jis0212<<14 | 0x1B<<7 | 0x3C, 24327 - 19968: jis0212<<14 | 0x1B<<7 | 0x3D, 24328 - 19968: jis0212<<14 | 0x1B<<7 | 0x3E, 24329 - 19968: jis0208<<14 | 0x36<<7 | 0x11, 24330 - 19968: jis0208<<14 | 0x29<<7 | 0x1F, 24331 - 19968: jis0208<<14 | 0x36<<7 | 0x14, 24332 - 19968: jis0208<<14 | 0x2F<<7 | 0x00, 24333 - 19968: jis0208<<14 | 0x2F<<7 | 0x10, 24334 - 19968: jis0212<<14 | 0x1B<<7 | 0x3F, 24335 - 19968: jis0208<<14 | 0x1B<<7 | 0x0F, 24336 - 19968: jis0208<<14 | 0x25<<7 | 0x54, 24337 - 19968: jis0208<<14 | 0x36<<7 | 0x15, 24339 - 19968: jis0208<<14 | 0x14<<7 | 0x3C, 24340 - 19968: jis0208<<14 | 0x23<<7 | 0x03, 24341 - 19968: jis0208<<14 | 0x0F<<7 | 0x59, 24342 - 19968: jis0208<<14 | 0x36<<7 | 0x16, 24343 - 19968: jis0208<<14 | 0x29<<7 | 0x05, 24344 - 19968: jis0208<<14 | 0x18<<7 | 0x0F, 24345 - 19968: jis0212<<14 | 0x1B<<7 | 0x40, 24347 - 19968: jis0208<<14 | 0x22<<7 | 0x2F, 24348 - 19968: jis0212<<14 | 0x1B<<7 | 0x41, 24349 - 19968: jis0212<<14 | 0x1B<<7 | 0x42, 24351 - 19968: jis0208<<14 | 0x23<<7 | 0x4E, 24353 - 19968: jis0208<<14 | 0x58<<7 | 0x5A, 24354 - 19968: jis0212<<14 | 0x1B<<7 | 0x44, 24355 - 19968: jis0212<<14 | 0x1B<<7 | 0x45, 24356 - 19968: jis0212<<14 | 0x1B<<7 | 0x46, 24357 - 19968: jis0208<<14 | 0x2B<<7 | 0x4E, 24358 - 19968: jis0208<<14 | 0x17<<7 | 0x18, 24359 - 19968: jis0208<<14 | 0x17<<7 | 0x2B, 24360 - 19968: jis0212<<14 | 0x1B<<7 | 0x47, 24361 - 19968: jis0208<<14 | 0x36<<7 | 0x17, 24363 - 19968: jis0212<<14 | 0x1B<<7 | 0x48, 24364 - 19968: jis0212<<14 | 0x1B<<7 | 0x49, 24365 - 19968: jis0208<<14 | 0x36<<7 | 0x18, 24366 - 19968: jis0212<<14 | 0x1B<<7 | 0x4A, 24367 - 19968: jis0208<<14 | 0x36<<7 | 0x1E, 24368 - 19968: jis0212<<14 | 0x1B<<7 | 0x4B, 24369 - 19968: jis0208<<14 | 0x1B<<7 | 0x44, 24372 - 19968: jis0208<<14 | 0x58<<7 | 0x5B, 24373 - 19968: jis0208<<14 | 0x23<<7 | 0x04, 24374 - 19968: jis0212<<14 | 0x1B<<7 | 0x4D, 24375 - 19968: jis0208<<14 | 0x15<<7 | 0x0E, 24376 - 19968: jis0208<<14 | 0x36<<7 | 0x19, 24379 - 19968: jis0212<<14 | 0x1B<<7 | 0x4E, 24380 - 19968: jis0208<<14 | 0x28<<7 | 0x0A, 24381 - 19968: jis0212<<14 | 0x1B<<7 | 0x4F, 24382 - 19968: jis0208<<14 | 0x22<<7 | 0x25, 24383 - 19968: jis0212<<14 | 0x1B<<7 | 0x50, 24384 - 19968: jis0212<<14 | 0x1B<<7 | 0x51, 24385 - 19968: jis0208<<14 | 0x36<<7 | 0x1A, 24388 - 19968: jis0212<<14 | 0x1B<<7 | 0x52, 24389 - 19968: jis0208<<14 | 0x58<<7 | 0x0B, 24391 - 19968: jis0212<<14 | 0x1B<<7 | 0x54, 24392 - 19968: jis0208<<14 | 0x36<<7 | 0x1B, 24394 - 19968: jis0208<<14 | 0x15<<7 | 0x0F, 24396 - 19968: jis0208<<14 | 0x36<<7 | 0x1C, 24397 - 19968: jis0212<<14 | 0x1B<<7 | 0x55, 24398 - 19968: jis0208<<14 | 0x36<<7 | 0x1D, 24400 - 19968: jis0212<<14 | 0x1B<<7 | 0x56, 24401 - 19968: jis0208<<14 | 0x36<<7 | 0x1F, 24403 - 19968: jis0208<<14 | 0x24<<7 | 0x55, 24404 - 19968: jis0212<<14 | 0x1B<<7 | 0x57, 24406 - 19968: jis0208<<14 | 0x36<<7 | 0x20, 24407 - 19968: jis0208<<14 | 0x36<<7 | 0x21, 24408 - 19968: jis0212<<14 | 0x1B<<7 | 0x58, 24409 - 19968: jis0208<<14 | 0x36<<7 | 0x22, 24411 - 19968: jis0212<<14 | 0x1B<<7 | 0x59, 24412 - 19968: jis0208<<14 | 0x36<<7 | 0x13, 24413 - 19968: jis0208<<14 | 0x36<<7 | 0x12, 24416 - 19968: jis0212<<14 | 0x1B<<7 | 0x5A, 24417 - 19968: jis0208<<14 | 0x36<<7 | 0x23, 24418 - 19968: jis0208<<14 | 0x16<<7 | 0x20, 24419 - 19968: jis0212<<14 | 0x1B<<7 | 0x5B, 24420 - 19968: jis0212<<14 | 0x1B<<7 | 0x5C, 24422 - 19968: jis0208<<14 | 0x28<<7 | 0x06, 24423 - 19968: jis0208<<14 | 0x58<<7 | 0x5C, 24425 - 19968: jis0208<<14 | 0x19<<7 | 0x2B, 24426 - 19968: jis0208<<14 | 0x28<<7 | 0x16, 24427 - 19968: jis0208<<14 | 0x23<<7 | 0x05, 24428 - 19968: jis0208<<14 | 0x28<<7 | 0x2A, 24429 - 19968: jis0208<<14 | 0x36<<7 | 0x24, 24431 - 19968: jis0212<<14 | 0x1C<<7 | 0x00, 24432 - 19968: jis0208<<14 | 0x1D<<7 | 0x13, 24433 - 19968: jis0208<<14 | 0x10<<7 | 0x25, 24434 - 19968: jis0212<<14 | 0x1C<<7 | 0x01, 24435 - 19968: jis0208<<14 | 0x36<<7 | 0x25, 24436 - 19968: jis0212<<14 | 0x1C<<7 | 0x02, 24437 - 19968: jis0212<<14 | 0x1C<<7 | 0x03, 24439 - 19968: jis0208<<14 | 0x36<<7 | 0x26, 24440 - 19968: jis0212<<14 | 0x1C<<7 | 0x04, 24441 - 19968: jis0208<<14 | 0x2B<<7 | 0x51, 24442 - 19968: jis0212<<14 | 0x1C<<7 | 0x05, 24444 - 19968: jis0208<<14 | 0x27<<7 | 0x3F, 24445 - 19968: jis0212<<14 | 0x1C<<7 | 0x06, 24446 - 19968: jis0212<<14 | 0x1C<<7 | 0x07, 24447 - 19968: jis0208<<14 | 0x36<<7 | 0x29, 24448 - 19968: jis0208<<14 | 0x10<<7 | 0x5C, 24449 - 19968: jis0208<<14 | 0x1F<<7 | 0x0B, 24450 - 19968: jis0208<<14 | 0x36<<7 | 0x28, 24451 - 19968: jis0208<<14 | 0x36<<7 | 0x27, 24452 - 19968: jis0208<<14 | 0x16<<7 | 0x21, 24453 - 19968: jis0208<<14 | 0x21<<7 | 0x33, 24455 - 19968: jis0208<<14 | 0x36<<7 | 0x2D, 24456 - 19968: jis0208<<14 | 0x36<<7 | 0x2B, 24457 - 19968: jis0212<<14 | 0x1C<<7 | 0x08, 24458 - 19968: jis0208<<14 | 0x36<<7 | 0x2A, 24459 - 19968: jis0208<<14 | 0x2D<<7 | 0x06, 24460 - 19968: jis0208<<14 | 0x17<<7 | 0x44, 24461 - 19968: jis0212<<14 | 0x1C<<7 | 0x09, 24463 - 19968: jis0212<<14 | 0x1C<<7 | 0x0A, 24464 - 19968: jis0208<<14 | 0x1C<<7 | 0x58, 24465 - 19968: jis0208<<14 | 0x36<<7 | 0x2C, 24466 - 19968: jis0208<<14 | 0x24<<7 | 0x2B, 24467 - 19968: jis0208<<14 | 0x1C<<7 | 0x1D, 24470 - 19968: jis0212<<14 | 0x1C<<7 | 0x0B, 24471 - 19968: jis0208<<14 | 0x25<<7 | 0x1F, 24472 - 19968: jis0208<<14 | 0x36<<7 | 0x30, 24473 - 19968: jis0208<<14 | 0x36<<7 | 0x2F, 24476 - 19968: jis0212<<14 | 0x1C<<7 | 0x0C, 24477 - 19968: jis0212<<14 | 0x1C<<7 | 0x0D, 24478 - 19968: jis0208<<14 | 0x36<<7 | 0x2E, 24480 - 19968: jis0208<<14 | 0x36<<7 | 0x31, 24481 - 19968: jis0208<<14 | 0x17<<7 | 0x45, 24482 - 19968: jis0212<<14 | 0x1C<<7 | 0x0E, 24484 - 19968: jis0212<<14 | 0x1C<<7 | 0x11, 24487 - 19968: jis0212<<14 | 0x1C<<7 | 0x0F, 24488 - 19968: jis0208<<14 | 0x36<<7 | 0x32, 24489 - 19968: jis0208<<14 | 0x28<<7 | 0x5B, 24490 - 19968: jis0208<<14 | 0x1C<<7 | 0x3A, 24491 - 19968: jis0212<<14 | 0x1C<<7 | 0x10, 24492 - 19968: jis0212<<14 | 0x1C<<7 | 0x12, 24493 - 19968: jis0208<<14 | 0x36<<7 | 0x33, 24494 - 19968: jis0208<<14 | 0x27<<7 | 0x58, 24495 - 19968: jis0212<<14 | 0x1C<<7 | 0x13, 24496 - 19968: jis0212<<14 | 0x1C<<7 | 0x14, 24497 - 19968: jis0212<<14 | 0x1C<<7 | 0x15, 24499 - 19968: jis0208<<14 | 0x25<<7 | 0x20, 24500 - 19968: jis0208<<14 | 0x23<<7 | 0x06, 24503 - 19968: jis0208<<14 | 0x58<<7 | 0x5D, 24504 - 19968: jis0212<<14 | 0x1C<<7 | 0x16, 24505 - 19968: jis0208<<14 | 0x24<<7 | 0x0F, 24508 - 19968: jis0208<<14 | 0x36<<7 | 0x34, 24509 - 19968: jis0208<<14 | 0x14<<7 | 0x0A, 24515 - 19968: jis0208<<14 | 0x1E<<7 | 0x13, 24516 - 19968: jis0212<<14 | 0x1C<<7 | 0x17, 24517 - 19968: jis0208<<14 | 0x28<<7 | 0x0B, 24519 - 19968: jis0212<<14 | 0x1C<<7 | 0x18, 24520 - 19968: jis0212<<14 | 0x1C<<7 | 0x19, 24521 - 19968: jis0212<<14 | 0x1C<<7 | 0x1A, 24523 - 19968: jis0212<<14 | 0x1C<<7 | 0x1B, 24524 - 19968: jis0208<<14 | 0x13<<7 | 0x56, 24525 - 19968: jis0208<<14 | 0x26<<7 | 0x05, 24528 - 19968: jis0212<<14 | 0x1C<<7 | 0x1C, 24529 - 19968: jis0212<<14 | 0x1C<<7 | 0x1D, 24530 - 19968: jis0212<<14 | 0x1C<<7 | 0x1E, 24531 - 19968: jis0212<<14 | 0x1C<<7 | 0x1F, 24532 - 19968: jis0212<<14 | 0x1C<<7 | 0x20, 24534 - 19968: jis0208<<14 | 0x36<<7 | 0x35, 24535 - 19968: jis0208<<14 | 0x1A<<7 | 0x35, 24536 - 19968: jis0208<<14 | 0x2A<<7 | 0x19, 24537 - 19968: jis0208<<14 | 0x2A<<7 | 0x1A, 24540 - 19968: jis0208<<14 | 0x10<<7 | 0x5D, 24541 - 19968: jis0208<<14 | 0x36<<7 | 0x3A, 24542 - 19968: jis0208<<14 | 0x59<<7 | 0x00, 24544 - 19968: jis0208<<14 | 0x22<<7 | 0x48, 24545 - 19968: jis0212<<14 | 0x1C<<7 | 0x22, 24546 - 19968: jis0212<<14 | 0x1C<<7 | 0x23, 24548 - 19968: jis0208<<14 | 0x36<<7 | 0x37, 24552 - 19968: jis0212<<14 | 0x1C<<7 | 0x24, 24553 - 19968: jis0212<<14 | 0x1C<<7 | 0x25, 24554 - 19968: jis0212<<14 | 0x1C<<7 | 0x26, 24555 - 19968: jis0208<<14 | 0x11<<7 | 0x56, 24556 - 19968: jis0212<<14 | 0x1C<<7 | 0x27, 24557 - 19968: jis0212<<14 | 0x1C<<7 | 0x28, 24558 - 19968: jis0212<<14 | 0x1C<<7 | 0x29, 24559 - 19968: jis0212<<14 | 0x1C<<7 | 0x2A, 24560 - 19968: jis0208<<14 | 0x37<<7 | 0x0C, 24561 - 19968: jis0208<<14 | 0x36<<7 | 0x39, 24562 - 19968: jis0212<<14 | 0x1C<<7 | 0x2B, 24563 - 19968: jis0212<<14 | 0x1C<<7 | 0x2C, 24565 - 19968: jis0208<<14 | 0x26<<7 | 0x0F, 24566 - 19968: jis0212<<14 | 0x1C<<7 | 0x2D, 24568 - 19968: jis0208<<14 | 0x36<<7 | 0x38, 24570 - 19968: jis0212<<14 | 0x1C<<7 | 0x2E, 24571 - 19968: jis0208<<14 | 0x36<<7 | 0x36, 24572 - 19968: jis0212<<14 | 0x1C<<7 | 0x2F, 24573 - 19968: jis0208<<14 | 0x18<<7 | 0x59, 24575 - 19968: jis0208<<14 | 0x36<<7 | 0x3C, 24583 - 19968: jis0212<<14 | 0x1C<<7 | 0x30, 24586 - 19968: jis0212<<14 | 0x1C<<7 | 0x31, 24589 - 19968: jis0212<<14 | 0x1C<<7 | 0x32, 24590 - 19968: jis0208<<14 | 0x36<<7 | 0x42, 24591 - 19968: jis0208<<14 | 0x36<<7 | 0x48, 24592 - 19968: jis0208<<14 | 0x36<<7 | 0x40, 24594 - 19968: jis0208<<14 | 0x24<<7 | 0x3B, 24595 - 19968: jis0212<<14 | 0x1C<<7 | 0x33, 24596 - 19968: jis0212<<14 | 0x1C<<7 | 0x34, 24597 - 19968: jis0208<<14 | 0x36<<7 | 0x45, 24598 - 19968: jis0208<<14 | 0x28<<7 | 0x3C, 24599 - 19968: jis0212<<14 | 0x1C<<7 | 0x35, 24600 - 19968: jis0212<<14 | 0x1C<<7 | 0x36, 24601 - 19968: jis0208<<14 | 0x36<<7 | 0x3F, 24602 - 19968: jis0212<<14 | 0x1C<<7 | 0x37, 24603 - 19968: jis0208<<14 | 0x36<<7 | 0x44, 24604 - 19968: jis0208<<14 | 0x2D<<7 | 0x46, 24605 - 19968: jis0208<<14 | 0x1A<<7 | 0x36, 24607 - 19968: jis0212<<14 | 0x1C<<7 | 0x38, 24608 - 19968: jis0208<<14 | 0x21<<7 | 0x34, 24609 - 19968: jis0208<<14 | 0x36<<7 | 0x3D, 24612 - 19968: jis0212<<14 | 0x1C<<7 | 0x39, 24613 - 19968: jis0208<<14 | 0x14<<7 | 0x3D, 24614 - 19968: jis0208<<14 | 0x36<<7 | 0x47, 24615 - 19968: jis0208<<14 | 0x1F<<7 | 0x0C, 24616 - 19968: jis0208<<14 | 0x10<<7 | 0x44, 24617 - 19968: jis0208<<14 | 0x36<<7 | 0x41, 24618 - 19968: jis0208<<14 | 0x11<<7 | 0x57, 24619 - 19968: jis0208<<14 | 0x36<<7 | 0x46, 24621 - 19968: jis0212<<14 | 0x1C<<7 | 0x3A, 24623 - 19968: jis0208<<14 | 0x15<<7 | 0x10, 24625 - 19968: jis0208<<14 | 0x36<<7 | 0x43, 24627 - 19968: jis0212<<14 | 0x1C<<7 | 0x3B, 24629 - 19968: jis0212<<14 | 0x1C<<7 | 0x3C, 24634 - 19968: jis0208<<14 | 0x36<<7 | 0x49, 24640 - 19968: jis0212<<14 | 0x1C<<7 | 0x3D, 24641 - 19968: jis0208<<14 | 0x36<<7 | 0x4B, 24642 - 19968: jis0208<<14 | 0x36<<7 | 0x55, 24643 - 19968: jis0208<<14 | 0x36<<7 | 0x53, 24646 - 19968: jis0208<<14 | 0x36<<7 | 0x50, 24647 - 19968: jis0212<<14 | 0x1C<<7 | 0x3E, 24648 - 19968: jis0212<<14 | 0x1C<<7 | 0x3F, 24649 - 19968: jis0212<<14 | 0x1C<<7 | 0x40, 24650 - 19968: jis0208<<14 | 0x36<<7 | 0x4F, 24651 - 19968: jis0208<<14 | 0x2D<<7 | 0x57, 24652 - 19968: jis0212<<14 | 0x1C<<7 | 0x41, 24653 - 19968: jis0208<<14 | 0x36<<7 | 0x51, 24656 - 19968: jis0208<<14 | 0x15<<7 | 0x11, 24657 - 19968: jis0212<<14 | 0x1C<<7 | 0x42, 24658 - 19968: jis0208<<14 | 0x18<<7 | 0x10, 24660 - 19968: jis0212<<14 | 0x1C<<7 | 0x43, 24661 - 19968: jis0208<<14 | 0x1C<<7 | 0x59, 24662 - 19968: jis0212<<14 | 0x1C<<7 | 0x44, 24663 - 19968: jis0212<<14 | 0x1C<<7 | 0x45, 24665 - 19968: jis0208<<14 | 0x36<<7 | 0x58, 24666 - 19968: jis0208<<14 | 0x36<<7 | 0x4A, 24669 - 19968: jis0208<<14 | 0x59<<7 | 0x01, 24671 - 19968: jis0208<<14 | 0x36<<7 | 0x4E, 24672 - 19968: jis0208<<14 | 0x36<<7 | 0x3E, 24673 - 19968: jis0212<<14 | 0x1C<<7 | 0x47, 24674 - 19968: jis0208<<14 | 0x11<<7 | 0x59, 24675 - 19968: jis0208<<14 | 0x36<<7 | 0x52, 24676 - 19968: jis0208<<14 | 0x36<<7 | 0x54, 24677 - 19968: jis0208<<14 | 0x22<<7 | 0x30, 24679 - 19968: jis0212<<14 | 0x1C<<7 | 0x48, 24680 - 19968: jis0208<<14 | 0x19<<7 | 0x07, 24681 - 19968: jis0208<<14 | 0x11<<7 | 0x17, 24682 - 19968: jis0208<<14 | 0x36<<7 | 0x4C, 24683 - 19968: jis0208<<14 | 0x36<<7 | 0x57, 24684 - 19968: jis0208<<14 | 0x36<<7 | 0x56, 24685 - 19968: jis0208<<14 | 0x15<<7 | 0x12, 24687 - 19968: jis0208<<14 | 0x21<<7 | 0x08, 24688 - 19968: jis0208<<14 | 0x12<<7 | 0x45, 24689 - 19968: jis0212<<14 | 0x1C<<7 | 0x49, 24693 - 19968: jis0208<<14 | 0x16<<7 | 0x22, 24695 - 19968: jis0208<<14 | 0x36<<7 | 0x4D, 24702 - 19968: jis0212<<14 | 0x1C<<7 | 0x4A, 24703 - 19968: jis0212<<14 | 0x1C<<7 | 0x4B, 24705 - 19968: jis0208<<14 | 0x36<<7 | 0x59, 24706 - 19968: jis0212<<14 | 0x1C<<7 | 0x4C, 24707 - 19968: jis0208<<14 | 0x36<<7 | 0x5C, 24708 - 19968: jis0208<<14 | 0x37<<7 | 0x00, 24709 - 19968: jis0208<<14 | 0x59<<7 | 0x02, 24710 - 19968: jis0212<<14 | 0x1C<<7 | 0x4D, 24712 - 19968: jis0212<<14 | 0x1C<<7 | 0x4E, 24713 - 19968: jis0208<<14 | 0x1B<<7 | 0x1C, 24714 - 19968: jis0208<<14 | 0x59<<7 | 0x03, 24715 - 19968: jis0208<<14 | 0x37<<7 | 0x06, 24716 - 19968: jis0208<<14 | 0x23<<7 | 0x4F, 24717 - 19968: jis0208<<14 | 0x36<<7 | 0x5A, 24718 - 19968: jis0212<<14 | 0x1C<<7 | 0x50, 24721 - 19968: jis0212<<14 | 0x1C<<7 | 0x51, 24722 - 19968: jis0208<<14 | 0x37<<7 | 0x04, 24723 - 19968: jis0212<<14 | 0x1C<<7 | 0x52, 24724 - 19968: jis0208<<14 | 0x11<<7 | 0x58, 24725 - 19968: jis0212<<14 | 0x1C<<7 | 0x53, 24726 - 19968: jis0208<<14 | 0x37<<7 | 0x02, 24727 - 19968: jis0208<<14 | 0x37<<7 | 0x03, 24728 - 19968: jis0212<<14 | 0x1C<<7 | 0x54, 24730 - 19968: jis0208<<14 | 0x36<<7 | 0x5D, 24731 - 19968: jis0208<<14 | 0x37<<7 | 0x01, 24733 - 19968: jis0212<<14 | 0x1C<<7 | 0x55, 24734 - 19968: jis0212<<14 | 0x1C<<7 | 0x56, 24735 - 19968: jis0208<<14 | 0x17<<7 | 0x46, 24736 - 19968: jis0208<<14 | 0x2C<<7 | 0x09, 24738 - 19968: jis0212<<14 | 0x1C<<7 | 0x57, 24739 - 19968: jis0208<<14 | 0x13<<7 | 0x14, 24740 - 19968: jis0212<<14 | 0x1C<<7 | 0x58, 24741 - 19968: jis0212<<14 | 0x1C<<7 | 0x59, 24742 - 19968: jis0208<<14 | 0x10<<7 | 0x38, 24743 - 19968: jis0208<<14 | 0x37<<7 | 0x05, 24744 - 19968: jis0212<<14 | 0x1C<<7 | 0x5A, 24745 - 19968: jis0208<<14 | 0x26<<7 | 0x19, 24746 - 19968: jis0208<<14 | 0x0F<<7 | 0x0C, 24752 - 19968: jis0212<<14 | 0x1C<<7 | 0x5B, 24753 - 19968: jis0212<<14 | 0x1C<<7 | 0x5C, 24754 - 19968: jis0208<<14 | 0x27<<7 | 0x40, 24755 - 19968: jis0208<<14 | 0x36<<7 | 0x3B, 24756 - 19968: jis0208<<14 | 0x37<<7 | 0x0B, 24757 - 19968: jis0208<<14 | 0x37<<7 | 0x0F, 24758 - 19968: jis0208<<14 | 0x2B<<7 | 0x44, 24759 - 19968: jis0212<<14 | 0x1C<<7 | 0x5D, 24760 - 19968: jis0208<<14 | 0x37<<7 | 0x08, 24763 - 19968: jis0212<<14 | 0x1D<<7 | 0x00, 24764 - 19968: jis0208<<14 | 0x24<<7 | 0x48, 24765 - 19968: jis0208<<14 | 0x37<<7 | 0x0D, 24766 - 19968: jis0212<<14 | 0x1D<<7 | 0x01, 24770 - 19968: jis0212<<14 | 0x1D<<7 | 0x02, 24772 - 19968: jis0212<<14 | 0x1D<<7 | 0x03, 24773 - 19968: jis0208<<14 | 0x1D<<7 | 0x4F, 24774 - 19968: jis0208<<14 | 0x37<<7 | 0x0E, 24775 - 19968: jis0208<<14 | 0x25<<7 | 0x36, 24776 - 19968: jis0212<<14 | 0x1D<<7 | 0x04, 24777 - 19968: jis0212<<14 | 0x1D<<7 | 0x05, 24778 - 19968: jis0212<<14 | 0x1D<<7 | 0x06, 24779 - 19968: jis0212<<14 | 0x1D<<7 | 0x07, 24782 - 19968: jis0212<<14 | 0x1D<<7 | 0x08, 24783 - 19968: jis0212<<14 | 0x1D<<7 | 0x09, 24785 - 19968: jis0208<<14 | 0x2E<<7 | 0x26, 24787 - 19968: jis0208<<14 | 0x37<<7 | 0x0A, 24788 - 19968: jis0212<<14 | 0x1D<<7 | 0x0A, 24789 - 19968: jis0208<<14 | 0x59<<7 | 0x05, 24792 - 19968: jis0208<<14 | 0x37<<7 | 0x10, 24793 - 19968: jis0212<<14 | 0x1D<<7 | 0x0C, 24794 - 19968: jis0208<<14 | 0x18<<7 | 0x5A, 24795 - 19968: jis0212<<14 | 0x1D<<7 | 0x0D, 24796 - 19968: jis0208<<14 | 0x1F<<7 | 0x2A, 24797 - 19968: jis0212<<14 | 0x1D<<7 | 0x0E, 24798 - 19968: jis0208<<14 | 0x59<<7 | 0x04, 24799 - 19968: jis0208<<14 | 0x0F<<7 | 0x33, 24800 - 19968: jis0208<<14 | 0x37<<7 | 0x09, 24801 - 19968: jis0208<<14 | 0x37<<7 | 0x07, 24802 - 19968: jis0212<<14 | 0x1D<<7 | 0x10, 24803 - 19968: jis0208<<14 | 0x20<<7 | 0x39, 24805 - 19968: jis0212<<14 | 0x1D<<7 | 0x11, 24807 - 19968: jis0208<<14 | 0x36<<7 | 0x5B, 24808 - 19968: jis0208<<14 | 0x1A<<7 | 0x13, 24816 - 19968: jis0208<<14 | 0x21<<7 | 0x25, 24817 - 19968: jis0208<<14 | 0x37<<7 | 0x1C, 24818 - 19968: jis0208<<14 | 0x59<<7 | 0x07, 24819 - 19968: jis0208<<14 | 0x20<<7 | 0x3A, 24820 - 19968: jis0208<<14 | 0x37<<7 | 0x17, 24821 - 19968: jis0212<<14 | 0x1D<<7 | 0x13, 24822 - 19968: jis0208<<14 | 0x37<<7 | 0x14, 24823 - 19968: jis0208<<14 | 0x37<<7 | 0x15, 24824 - 19968: jis0212<<14 | 0x1D<<7 | 0x14, 24825 - 19968: jis0208<<14 | 0x1B<<7 | 0x45, 24826 - 19968: jis0208<<14 | 0x37<<7 | 0x18, 24827 - 19968: jis0208<<14 | 0x37<<7 | 0x1B, 24828 - 19968: jis0212<<14 | 0x1D<<7 | 0x15, 24829 - 19968: jis0212<<14 | 0x1D<<7 | 0x16, 24832 - 19968: jis0208<<14 | 0x37<<7 | 0x16, 24833 - 19968: jis0208<<14 | 0x1C<<7 | 0x04, 24834 - 19968: jis0212<<14 | 0x1D<<7 | 0x17, 24835 - 19968: jis0208<<14 | 0x37<<7 | 0x19, 24838 - 19968: jis0208<<14 | 0x37<<7 | 0x13, 24839 - 19968: jis0212<<14 | 0x1D<<7 | 0x18, 24840 - 19968: jis0208<<14 | 0x2B<<7 | 0x5B, 24841 - 19968: jis0208<<14 | 0x2B<<7 | 0x5A, 24842 - 19968: jis0212<<14 | 0x1D<<7 | 0x19, 24844 - 19968: jis0212<<14 | 0x1D<<7 | 0x1A, 24845 - 19968: jis0208<<14 | 0x37<<7 | 0x1D, 24846 - 19968: jis0208<<14 | 0x37<<7 | 0x1E, 24847 - 19968: jis0208<<14 | 0x0F<<7 | 0x34, 24848 - 19968: jis0212<<14 | 0x1D<<7 | 0x1B, 24849 - 19968: jis0208<<14 | 0x59<<7 | 0x08, 24850 - 19968: jis0212<<14 | 0x1D<<7 | 0x1D, 24851 - 19968: jis0212<<14 | 0x1D<<7 | 0x1E, 24852 - 19968: jis0212<<14 | 0x1D<<7 | 0x1F, 24853 - 19968: jis0208<<14 | 0x37<<7 | 0x12, 24854 - 19968: jis0212<<14 | 0x1D<<7 | 0x20, 24855 - 19968: jis0212<<14 | 0x1D<<7 | 0x21, 24857 - 19968: jis0212<<14 | 0x1D<<7 | 0x22, 24858 - 19968: jis0208<<14 | 0x15<<7 | 0x51, 24859 - 19968: jis0208<<14 | 0x0F<<7 | 0x05, 24860 - 19968: jis0212<<14 | 0x1D<<7 | 0x23, 24862 - 19968: jis0212<<14 | 0x1D<<7 | 0x24, 24863 - 19968: jis0208<<14 | 0x13<<7 | 0x15, 24864 - 19968: jis0208<<14 | 0x59<<7 | 0x06, 24865 - 19968: jis0208<<14 | 0x37<<7 | 0x1A, 24866 - 19968: jis0212<<14 | 0x1D<<7 | 0x25, 24871 - 19968: jis0208<<14 | 0x37<<7 | 0x22, 24872 - 19968: jis0208<<14 | 0x37<<7 | 0x21, 24874 - 19968: jis0212<<14 | 0x1D<<7 | 0x26, 24875 - 19968: jis0212<<14 | 0x1D<<7 | 0x27, 24876 - 19968: jis0208<<14 | 0x37<<7 | 0x26, 24880 - 19968: jis0208<<14 | 0x59<<7 | 0x0A, 24881 - 19968: jis0212<<14 | 0x1D<<7 | 0x29, 24884 - 19968: jis0208<<14 | 0x37<<7 | 0x27, 24885 - 19968: jis0212<<14 | 0x1D<<7 | 0x2A, 24886 - 19968: jis0212<<14 | 0x1D<<7 | 0x2B, 24887 - 19968: jis0208<<14 | 0x59<<7 | 0x09, 24889 - 19968: jis0212<<14 | 0x1D<<7 | 0x2D, 24892 - 19968: jis0208<<14 | 0x37<<7 | 0x25, 24893 - 19968: jis0208<<14 | 0x37<<7 | 0x28, 24894 - 19968: jis0208<<14 | 0x37<<7 | 0x20, 24895 - 19968: jis0208<<14 | 0x37<<7 | 0x24, 24897 - 19968: jis0212<<14 | 0x1D<<7 | 0x2E, 24898 - 19968: jis0208<<14 | 0x37<<7 | 0x29, 24900 - 19968: jis0208<<14 | 0x37<<7 | 0x2A, 24901 - 19968: jis0212<<14 | 0x1D<<7 | 0x2F, 24902 - 19968: jis0212<<14 | 0x1D<<7 | 0x30, 24903 - 19968: jis0208<<14 | 0x37<<7 | 0x1F, 24904 - 19968: jis0208<<14 | 0x1A<<7 | 0x5B, 24905 - 19968: jis0212<<14 | 0x1D<<7 | 0x31, 24906 - 19968: jis0208<<14 | 0x37<<7 | 0x23, 24907 - 19968: jis0208<<14 | 0x21<<7 | 0x35, 24908 - 19968: jis0208<<14 | 0x18<<7 | 0x11, 24909 - 19968: jis0208<<14 | 0x37<<7 | 0x11, 24910 - 19968: jis0208<<14 | 0x1E<<7 | 0x14, 24915 - 19968: jis0208<<14 | 0x37<<7 | 0x37, 24917 - 19968: jis0208<<14 | 0x29<<7 | 0x48, 24920 - 19968: jis0208<<14 | 0x37<<7 | 0x2D, 24921 - 19968: jis0208<<14 | 0x37<<7 | 0x2E, 24922 - 19968: jis0208<<14 | 0x37<<7 | 0x2F, 24925 - 19968: jis0208<<14 | 0x37<<7 | 0x36, 24926 - 19968: jis0212<<14 | 0x1D<<7 | 0x32, 24927 - 19968: jis0208<<14 | 0x37<<7 | 0x35, 24928 - 19968: jis0212<<14 | 0x1D<<7 | 0x33, 24930 - 19968: jis0208<<14 | 0x2A<<7 | 0x5C, 24931 - 19968: jis0208<<14 | 0x13<<7 | 0x16, 24933 - 19968: jis0208<<14 | 0x37<<7 | 0x33, 24935 - 19968: jis0208<<14 | 0x16<<7 | 0x24, 24936 - 19968: jis0208<<14 | 0x12<<7 | 0x13, 24939 - 19968: jis0208<<14 | 0x37<<7 | 0x30, 24940 - 19968: jis0212<<14 | 0x1D<<7 | 0x34, 24942 - 19968: jis0208<<14 | 0x2D<<7 | 0x17, 24943 - 19968: jis0208<<14 | 0x37<<7 | 0x32, 24944 - 19968: jis0208<<14 | 0x0F<<7 | 0x35, 24945 - 19968: jis0208<<14 | 0x37<<7 | 0x34, 24946 - 19968: jis0212<<14 | 0x1D<<7 | 0x35, 24947 - 19968: jis0208<<14 | 0x37<<7 | 0x2B, 24948 - 19968: jis0208<<14 | 0x37<<7 | 0x31, 24949 - 19968: jis0208<<14 | 0x37<<7 | 0x38, 24950 - 19968: jis0208<<14 | 0x16<<7 | 0x23, 24951 - 19968: jis0208<<14 | 0x37<<7 | 0x2C, 24952 - 19968: jis0212<<14 | 0x1D<<7 | 0x36, 24955 - 19968: jis0212<<14 | 0x1D<<7 | 0x37, 24956 - 19968: jis0212<<14 | 0x1D<<7 | 0x38, 24958 - 19968: jis0208<<14 | 0x2C<<7 | 0x3C, 24959 - 19968: jis0212<<14 | 0x1D<<7 | 0x39, 24960 - 19968: jis0212<<14 | 0x1D<<7 | 0x3A, 24961 - 19968: jis0212<<14 | 0x1D<<7 | 0x3B, 24962 - 19968: jis0208<<14 | 0x2C<<7 | 0x0A, 24963 - 19968: jis0212<<14 | 0x1D<<7 | 0x3C, 24964 - 19968: jis0212<<14 | 0x1D<<7 | 0x3D, 24967 - 19968: jis0208<<14 | 0x37<<7 | 0x3B, 24970 - 19968: jis0208<<14 | 0x37<<7 | 0x3F, 24971 - 19968: jis0212<<14 | 0x1D<<7 | 0x3E, 24973 - 19968: jis0212<<14 | 0x1D<<7 | 0x3F, 24974 - 19968: jis0208<<14 | 0x20<<7 | 0x5D, 24976 - 19968: jis0208<<14 | 0x2D<<7 | 0x58, 24977 - 19968: jis0208<<14 | 0x37<<7 | 0x40, 24978 - 19968: jis0212<<14 | 0x1D<<7 | 0x40, 24979 - 19968: jis0212<<14 | 0x1D<<7 | 0x41, 24980 - 19968: jis0208<<14 | 0x37<<7 | 0x3D, 24982 - 19968: jis0208<<14 | 0x37<<7 | 0x3A, 24983 - 19968: jis0212<<14 | 0x1D<<7 | 0x42, 24984 - 19968: jis0208<<14 | 0x59<<7 | 0x0B, 24985 - 19968: jis0208<<14 | 0x37<<7 | 0x39, 24986 - 19968: jis0208<<14 | 0x37<<7 | 0x3E, 24988 - 19968: jis0212<<14 | 0x1D<<7 | 0x44, 24989 - 19968: jis0212<<14 | 0x1D<<7 | 0x45, 24991 - 19968: jis0212<<14 | 0x1D<<7 | 0x46, 24992 - 19968: jis0212<<14 | 0x1D<<7 | 0x47, 24996 - 19968: jis0208<<14 | 0x29<<7 | 0x0F, 24997 - 19968: jis0212<<14 | 0x1D<<7 | 0x48, 24999 - 19968: jis0208<<14 | 0x25<<7 | 0x13, 25000 - 19968: jis0212<<14 | 0x1D<<7 | 0x49, 25001 - 19968: jis0208<<14 | 0x16<<7 | 0x25, 25002 - 19968: jis0212<<14 | 0x1D<<7 | 0x4A, 25003 - 19968: jis0208<<14 | 0x37<<7 | 0x41, 25004 - 19968: jis0208<<14 | 0x37<<7 | 0x3C, 25005 - 19968: jis0212<<14 | 0x1D<<7 | 0x4B, 25006 - 19968: jis0208<<14 | 0x37<<7 | 0x42, 25010 - 19968: jis0208<<14 | 0x16<<7 | 0x5A, 25014 - 19968: jis0208<<14 | 0x11<<7 | 0x10, 25016 - 19968: jis0212<<14 | 0x1D<<7 | 0x4C, 25017 - 19968: jis0212<<14 | 0x1D<<7 | 0x4D, 25018 - 19968: jis0208<<14 | 0x37<<7 | 0x4A, 25020 - 19968: jis0212<<14 | 0x1D<<7 | 0x4E, 25022 - 19968: jis0208<<14 | 0x13<<7 | 0x17, 25024 - 19968: jis0212<<14 | 0x1D<<7 | 0x4F, 25025 - 19968: jis0212<<14 | 0x1D<<7 | 0x50, 25026 - 19968: jis0212<<14 | 0x1D<<7 | 0x51, 25027 - 19968: jis0208<<14 | 0x37<<7 | 0x48, 25030 - 19968: jis0208<<14 | 0x37<<7 | 0x49, 25031 - 19968: jis0208<<14 | 0x19<<7 | 0x08, 25032 - 19968: jis0208<<14 | 0x37<<7 | 0x47, 25033 - 19968: jis0208<<14 | 0x37<<7 | 0x45, 25034 - 19968: jis0208<<14 | 0x37<<7 | 0x44, 25035 - 19968: jis0208<<14 | 0x37<<7 | 0x4B, 25036 - 19968: jis0208<<14 | 0x37<<7 | 0x43, 25037 - 19968: jis0208<<14 | 0x37<<7 | 0x4D, 25038 - 19968: jis0212<<14 | 0x1D<<7 | 0x52, 25039 - 19968: jis0212<<14 | 0x1D<<7 | 0x53, 25040 - 19968: jis0208<<14 | 0x11<<7 | 0x5A, 25045 - 19968: jis0212<<14 | 0x1D<<7 | 0x54, 25052 - 19968: jis0212<<14 | 0x1D<<7 | 0x55, 25053 - 19968: jis0212<<14 | 0x1D<<7 | 0x56, 25054 - 19968: jis0212<<14 | 0x1D<<7 | 0x57, 25055 - 19968: jis0212<<14 | 0x1D<<7 | 0x58, 25057 - 19968: jis0212<<14 | 0x1D<<7 | 0x59, 25058 - 19968: jis0212<<14 | 0x1D<<7 | 0x5A, 25059 - 19968: jis0208<<14 | 0x37<<7 | 0x4F, 25061 - 19968: jis0212<<14 | 0x1D<<7 | 0x5D, 25062 - 19968: jis0208<<14 | 0x37<<7 | 0x4E, 25063 - 19968: jis0212<<14 | 0x1D<<7 | 0x5B, 25065 - 19968: jis0212<<14 | 0x1D<<7 | 0x5C, 25068 - 19968: jis0212<<14 | 0x1E<<7 | 0x00, 25069 - 19968: jis0212<<14 | 0x1E<<7 | 0x01, 25071 - 19968: jis0212<<14 | 0x1E<<7 | 0x02, 25074 - 19968: jis0208<<14 | 0x23<<7 | 0x07, 25076 - 19968: jis0208<<14 | 0x37<<7 | 0x52, 25078 - 19968: jis0208<<14 | 0x37<<7 | 0x50, 25079 - 19968: jis0208<<14 | 0x37<<7 | 0x46, 25080 - 19968: jis0208<<14 | 0x16<<7 | 0x5B, 25082 - 19968: jis0208<<14 | 0x37<<7 | 0x51, 25084 - 19968: jis0208<<14 | 0x37<<7 | 0x55, 25085 - 19968: jis0208<<14 | 0x37<<7 | 0x54, 25086 - 19968: jis0208<<14 | 0x37<<7 | 0x56, 25087 - 19968: jis0208<<14 | 0x37<<7 | 0x53, 25088 - 19968: jis0208<<14 | 0x37<<7 | 0x57, 25089 - 19968: jis0212<<14 | 0x1E<<7 | 0x03, 25091 - 19968: jis0212<<14 | 0x1E<<7 | 0x04, 25092 - 19968: jis0212<<14 | 0x1E<<7 | 0x05, 25095 - 19968: jis0212<<14 | 0x1E<<7 | 0x06, 25096 - 19968: jis0208<<14 | 0x37<<7 | 0x58, 25097 - 19968: jis0208<<14 | 0x37<<7 | 0x59, 25098 - 19968: jis0208<<14 | 0x29<<7 | 0x49, 25100 - 19968: jis0208<<14 | 0x37<<7 | 0x5B, 25101 - 19968: jis0208<<14 | 0x37<<7 | 0x5A, 25102 - 19968: jis0208<<14 | 0x1C<<7 | 0x1E, 25104 - 19968: jis0208<<14 | 0x1F<<7 | 0x0D, 25105 - 19968: jis0208<<14 | 0x11<<7 | 0x45, 25106 - 19968: jis0208<<14 | 0x11<<7 | 0x5B, 25107 - 19968: jis0208<<14 | 0x59<<7 | 0x0C, 25108 - 19968: jis0208<<14 | 0x37<<7 | 0x5C, 25109 - 19968: jis0212<<14 | 0x1E<<7 | 0x08, 25110 - 19968: jis0208<<14 | 0x0F<<7 | 0x1E, 25114 - 19968: jis0208<<14 | 0x1F<<7 | 0x2B, 25115 - 19968: jis0208<<14 | 0x37<<7 | 0x5D, 25116 - 19968: jis0212<<14 | 0x1E<<7 | 0x09, 25117 - 19968: jis0208<<14 | 0x4B<<7 | 0x22, 25118 - 19968: jis0208<<14 | 0x38<<7 | 0x00, 25119 - 19968: jis0208<<14 | 0x16<<7 | 0x40, 25120 - 19968: jis0212<<14 | 0x1E<<7 | 0x0A, 25121 - 19968: jis0208<<14 | 0x38<<7 | 0x01, 25122 - 19968: jis0212<<14 | 0x1E<<7 | 0x0B, 25123 - 19968: jis0212<<14 | 0x1E<<7 | 0x0C, 25126 - 19968: jis0208<<14 | 0x1F<<7 | 0x4E, 25127 - 19968: jis0212<<14 | 0x1E<<7 | 0x0D, 25129 - 19968: jis0212<<14 | 0x1E<<7 | 0x0E, 25130 - 19968: jis0208<<14 | 0x38<<7 | 0x02, 25131 - 19968: jis0212<<14 | 0x1E<<7 | 0x0F, 25134 - 19968: jis0208<<14 | 0x38<<7 | 0x03, 25135 - 19968: jis0208<<14 | 0x14<<7 | 0x19, 25136 - 19968: jis0208<<14 | 0x38<<7 | 0x04, 25138 - 19968: jis0208<<14 | 0x38<<7 | 0x05, 25139 - 19968: jis0208<<14 | 0x38<<7 | 0x06, 25140 - 19968: jis0208<<14 | 0x21<<7 | 0x36, 25144 - 19968: jis0208<<14 | 0x17<<7 | 0x2C, 25145 - 19968: jis0212<<14 | 0x1E<<7 | 0x10, 25147 - 19968: jis0208<<14 | 0x2B<<7 | 0x40, 25149 - 19968: jis0212<<14 | 0x1E<<7 | 0x11, 25151 - 19968: jis0208<<14 | 0x2A<<7 | 0x1B, 25152 - 19968: jis0208<<14 | 0x1C<<7 | 0x49, 25153 - 19968: jis0208<<14 | 0x38<<7 | 0x07, 25154 - 19968: jis0212<<14 | 0x1E<<7 | 0x12, 25155 - 19968: jis0212<<14 | 0x1E<<7 | 0x13, 25156 - 19968: jis0212<<14 | 0x1E<<7 | 0x14, 25158 - 19968: jis0212<<14 | 0x1E<<7 | 0x15, 25159 - 19968: jis0208<<14 | 0x1F<<7 | 0x4F, 25160 - 19968: jis0208<<14 | 0x4D<<7 | 0x1C, 25161 - 19968: jis0208<<14 | 0x27<<7 | 0x41, 25163 - 19968: jis0208<<14 | 0x1B<<7 | 0x49, 25164 - 19968: jis0212<<14 | 0x1E<<7 | 0x16, 25165 - 19968: jis0208<<14 | 0x19<<7 | 0x2C, 25166 - 19968: jis0208<<14 | 0x38<<7 | 0x08, 25168 - 19968: jis0212<<14 | 0x1E<<7 | 0x17, 25169 - 19968: jis0212<<14 | 0x1E<<7 | 0x18, 25170 - 19968: jis0212<<14 | 0x1E<<7 | 0x19, 25171 - 19968: jis0208<<14 | 0x21<<7 | 0x26, 25172 - 19968: jis0212<<14 | 0x1E<<7 | 0x1A, 25173 - 19968: jis0208<<14 | 0x29<<7 | 0x06, 25174 - 19968: jis0212<<14 | 0x1E<<7 | 0x1B, 25176 - 19968: jis0208<<14 | 0x21<<7 | 0x50, 25178 - 19968: jis0212<<14 | 0x1E<<7 | 0x1C, 25179 - 19968: jis0208<<14 | 0x38<<7 | 0x0B, 25180 - 19968: jis0212<<14 | 0x1E<<7 | 0x1D, 25182 - 19968: jis0208<<14 | 0x38<<7 | 0x09, 25184 - 19968: jis0208<<14 | 0x38<<7 | 0x0C, 25187 - 19968: jis0208<<14 | 0x38<<7 | 0x0A, 25188 - 19968: jis0212<<14 | 0x1E<<7 | 0x1E, 25192 - 19968: jis0208<<14 | 0x38<<7 | 0x0D, 25197 - 19968: jis0212<<14 | 0x1E<<7 | 0x1F, 25198 - 19968: jis0208<<14 | 0x29<<7 | 0x10, 25199 - 19968: jis0212<<14 | 0x1E<<7 | 0x20, 25201 - 19968: jis0208<<14 | 0x0F<<7 | 0x16, 25203 - 19968: jis0212<<14 | 0x1E<<7 | 0x21, 25206 - 19968: jis0208<<14 | 0x28<<7 | 0x3D, 25209 - 19968: jis0208<<14 | 0x27<<7 | 0x42, 25210 - 19968: jis0212<<14 | 0x1E<<7 | 0x22, 25212 - 19968: jis0208<<14 | 0x38<<7 | 0x0E, 25213 - 19968: jis0212<<14 | 0x1E<<7 | 0x23, 25214 - 19968: jis0208<<14 | 0x38<<7 | 0x11, 25215 - 19968: jis0208<<14 | 0x1D<<7 | 0x14, 25216 - 19968: jis0208<<14 | 0x14<<7 | 0x1A, 25218 - 19968: jis0208<<14 | 0x38<<7 | 0x0F, 25219 - 19968: jis0208<<14 | 0x38<<7 | 0x16, 25220 - 19968: jis0208<<14 | 0x1D<<7 | 0x15, 25225 - 19968: jis0208<<14 | 0x38<<7 | 0x10, 25226 - 19968: jis0208<<14 | 0x26<<7 | 0x23, 25229 - 19968: jis0212<<14 | 0x1E<<7 | 0x24, 25230 - 19968: jis0212<<14 | 0x1E<<7 | 0x25, 25231 - 19968: jis0212<<14 | 0x1E<<7 | 0x26, 25232 - 19968: jis0212<<14 | 0x1E<<7 | 0x27, 25233 - 19968: jis0208<<14 | 0x2C<<7 | 0x3D, 25234 - 19968: jis0208<<14 | 0x38<<7 | 0x12, 25235 - 19968: jis0208<<14 | 0x38<<7 | 0x13, 25236 - 19968: jis0208<<14 | 0x38<<7 | 0x17, 25237 - 19968: jis0208<<14 | 0x24<<7 | 0x49, 25238 - 19968: jis0208<<14 | 0x38<<7 | 0x14, 25239 - 19968: jis0208<<14 | 0x18<<7 | 0x12, 25240 - 19968: jis0208<<14 | 0x1F<<7 | 0x3D, 25243 - 19968: jis0208<<14 | 0x38<<7 | 0x25, 25244 - 19968: jis0208<<14 | 0x27<<7 | 0x13, 25246 - 19968: jis0208<<14 | 0x21<<7 | 0x51, 25254 - 19968: jis0208<<14 | 0x59<<7 | 0x0D, 25256 - 19968: jis0212<<14 | 0x1E<<7 | 0x29, 25259 - 19968: jis0208<<14 | 0x27<<7 | 0x43, 25260 - 19968: jis0208<<14 | 0x39<<7 | 0x0C, 25265 - 19968: jis0208<<14 | 0x29<<7 | 0x59, 25267 - 19968: jis0212<<14 | 0x1E<<7 | 0x2A, 25269 - 19968: jis0208<<14 | 0x23<<7 | 0x50, 25270 - 19968: jis0212<<14 | 0x1E<<7 | 0x2B, 25271 - 19968: jis0212<<14 | 0x1E<<7 | 0x2C, 25273 - 19968: jis0208<<14 | 0x2A<<7 | 0x54, 25274 - 19968: jis0212<<14 | 0x1E<<7 | 0x2D, 25275 - 19968: jis0208<<14 | 0x38<<7 | 0x1A, 25276 - 19968: jis0208<<14 | 0x11<<7 | 0x00, 25277 - 19968: jis0208<<14 | 0x22<<7 | 0x49, 25278 - 19968: jis0212<<14 | 0x1E<<7 | 0x2E, 25279 - 19968: jis0212<<14 | 0x1E<<7 | 0x2F, 25282 - 19968: jis0208<<14 | 0x38<<7 | 0x23, 25284 - 19968: jis0212<<14 | 0x1E<<7 | 0x30, 25285 - 19968: jis0208<<14 | 0x22<<7 | 0x13, 25286 - 19968: jis0208<<14 | 0x38<<7 | 0x1D, 25287 - 19968: jis0208<<14 | 0x38<<7 | 0x24, 25288 - 19968: jis0208<<14 | 0x38<<7 | 0x1F, 25289 - 19968: jis0208<<14 | 0x38<<7 | 0x26, 25290 - 19968: jis0208<<14 | 0x38<<7 | 0x22, 25292 - 19968: jis0208<<14 | 0x38<<7 | 0x21, 25293 - 19968: jis0208<<14 | 0x26<<7 | 0x4E, 25294 - 19968: jis0212<<14 | 0x1E<<7 | 0x31, 25295 - 19968: jis0208<<14 | 0x38<<7 | 0x1B, 25296 - 19968: jis0208<<14 | 0x11<<7 | 0x5C, 25297 - 19968: jis0208<<14 | 0x38<<7 | 0x19, 25298 - 19968: jis0208<<14 | 0x14<<7 | 0x50, 25299 - 19968: jis0208<<14 | 0x21<<7 | 0x52, 25300 - 19968: jis0208<<14 | 0x38<<7 | 0x15, 25301 - 19968: jis0212<<14 | 0x1E<<7 | 0x32, 25302 - 19968: jis0212<<14 | 0x1E<<7 | 0x33, 25303 - 19968: jis0208<<14 | 0x38<<7 | 0x18, 25304 - 19968: jis0208<<14 | 0x18<<7 | 0x13, 25305 - 19968: jis0208<<14 | 0x1F<<7 | 0x3A, 25306 - 19968: jis0212<<14 | 0x1E<<7 | 0x34, 25307 - 19968: jis0208<<14 | 0x1D<<7 | 0x16, 25308 - 19968: jis0208<<14 | 0x38<<7 | 0x20, 25309 - 19968: jis0208<<14 | 0x26<<7 | 0x31, 25312 - 19968: jis0208<<14 | 0x14<<7 | 0x51, 25313 - 19968: jis0208<<14 | 0x12<<7 | 0x27, 25322 - 19968: jis0212<<14 | 0x1E<<7 | 0x35, 25324 - 19968: jis0208<<14 | 0x12<<7 | 0x46, 25325 - 19968: jis0208<<14 | 0x1E<<7 | 0x00, 25326 - 19968: jis0208<<14 | 0x38<<7 | 0x28, 25327 - 19968: jis0208<<14 | 0x38<<7 | 0x2D, 25329 - 19968: jis0208<<14 | 0x38<<7 | 0x29, 25330 - 19968: jis0212<<14 | 0x1E<<7 | 0x36, 25331 - 19968: jis0208<<14 | 0x16<<7 | 0x5C, 25332 - 19968: jis0212<<14 | 0x1E<<7 | 0x37, 25333 - 19968: jis0208<<14 | 0x38<<7 | 0x2E, 25334 - 19968: jis0208<<14 | 0x1A<<7 | 0x01, 25335 - 19968: jis0208<<14 | 0x18<<7 | 0x48, 25340 - 19968: jis0212<<14 | 0x1E<<7 | 0x38, 25341 - 19968: jis0212<<14 | 0x1E<<7 | 0x39, 25342 - 19968: jis0208<<14 | 0x1C<<7 | 0x05, 25343 - 19968: jis0208<<14 | 0x38<<7 | 0x1C, 25345 - 19968: jis0208<<14 | 0x1A<<7 | 0x5C, 25346 - 19968: jis0208<<14 | 0x38<<7 | 0x2B, 25347 - 19968: jis0212<<14 | 0x1E<<7 | 0x3A, 25348 - 19968: jis0212<<14 | 0x1E<<7 | 0x3B, 25351 - 19968: jis0208<<14 | 0x1A<<7 | 0x37, 25352 - 19968: jis0208<<14 | 0x38<<7 | 0x2C, 25353 - 19968: jis0208<<14 | 0x0F<<7 | 0x23, 25354 - 19968: jis0212<<14 | 0x1E<<7 | 0x3C, 25355 - 19968: jis0212<<14 | 0x1E<<7 | 0x3D, 25356 - 19968: jis0208<<14 | 0x38<<7 | 0x27, 25357 - 19968: jis0212<<14 | 0x1E<<7 | 0x3E, 25360 - 19968: jis0212<<14 | 0x1E<<7 | 0x3F, 25361 - 19968: jis0208<<14 | 0x23<<7 | 0x08, 25363 - 19968: jis0212<<14 | 0x1E<<7 | 0x40, 25366 - 19968: jis0212<<14 | 0x1E<<7 | 0x41, 25368 - 19968: jis0212<<14 | 0x1E<<7 | 0x42, 25369 - 19968: jis0208<<14 | 0x14<<7 | 0x52, 25375 - 19968: jis0208<<14 | 0x15<<7 | 0x13, 25383 - 19968: jis0208<<14 | 0x38<<7 | 0x2A, 25384 - 19968: jis0208<<14 | 0x0F<<7 | 0x06, 25385 - 19968: jis0212<<14 | 0x1E<<7 | 0x43, 25386 - 19968: jis0212<<14 | 0x1E<<7 | 0x44, 25387 - 19968: jis0208<<14 | 0x19<<7 | 0x22, 25389 - 19968: jis0212<<14 | 0x1E<<7 | 0x45, 25391 - 19968: jis0208<<14 | 0x1E<<7 | 0x15, 25397 - 19968: jis0212<<14 | 0x1E<<7 | 0x46, 25398 - 19968: jis0212<<14 | 0x1E<<7 | 0x47, 25401 - 19968: jis0212<<14 | 0x1E<<7 | 0x48, 25402 - 19968: jis0208<<14 | 0x23<<7 | 0x51, 25404 - 19968: jis0212<<14 | 0x1E<<7 | 0x49, 25405 - 19968: jis0208<<14 | 0x27<<7 | 0x33, 25406 - 19968: jis0208<<14 | 0x38<<7 | 0x30, 25407 - 19968: jis0208<<14 | 0x20<<7 | 0x3D, 25409 - 19968: jis0212<<14 | 0x1E<<7 | 0x4A, 25410 - 19968: jis0212<<14 | 0x1E<<7 | 0x4B, 25411 - 19968: jis0212<<14 | 0x1E<<7 | 0x4C, 25412 - 19968: jis0212<<14 | 0x1E<<7 | 0x4D, 25414 - 19968: jis0212<<14 | 0x1E<<7 | 0x4E, 25417 - 19968: jis0208<<14 | 0x21<<7 | 0x09, 25418 - 19968: jis0212<<14 | 0x1E<<7 | 0x4F, 25419 - 19968: jis0212<<14 | 0x1E<<7 | 0x50, 25420 - 19968: jis0208<<14 | 0x1A<<7 | 0x0A, 25421 - 19968: jis0208<<14 | 0x38<<7 | 0x31, 25422 - 19968: jis0212<<14 | 0x1E<<7 | 0x51, 25423 - 19968: jis0208<<14 | 0x38<<7 | 0x33, 25424 - 19968: jis0208<<14 | 0x38<<7 | 0x2F, 25426 - 19968: jis0212<<14 | 0x1E<<7 | 0x52, 25427 - 19968: jis0212<<14 | 0x1E<<7 | 0x53, 25428 - 19968: jis0212<<14 | 0x1E<<7 | 0x54, 25429 - 19968: jis0208<<14 | 0x29<<7 | 0x40, 25431 - 19968: jis0208<<14 | 0x23<<7 | 0x1C, 25432 - 19968: jis0212<<14 | 0x1E<<7 | 0x55, 25435 - 19968: jis0212<<14 | 0x1E<<7 | 0x56, 25436 - 19968: jis0208<<14 | 0x20<<7 | 0x3B, 25445 - 19968: jis0212<<14 | 0x1E<<7 | 0x57, 25446 - 19968: jis0212<<14 | 0x1E<<7 | 0x58, 25447 - 19968: jis0208<<14 | 0x29<<7 | 0x5A, 25448 - 19968: jis0208<<14 | 0x1B<<7 | 0x2D, 25449 - 19968: jis0208<<14 | 0x38<<7 | 0x3F, 25451 - 19968: jis0208<<14 | 0x38<<7 | 0x3E, 25452 - 19968: jis0212<<14 | 0x1E<<7 | 0x59, 25453 - 19968: jis0212<<14 | 0x1E<<7 | 0x5A, 25454 - 19968: jis0208<<14 | 0x1E<<7 | 0x57, 25457 - 19968: jis0212<<14 | 0x1E<<7 | 0x5B, 25458 - 19968: jis0208<<14 | 0x16<<7 | 0x5D, 25460 - 19968: jis0212<<14 | 0x1E<<7 | 0x5C, 25461 - 19968: jis0212<<14 | 0x1E<<7 | 0x5D, 25462 - 19968: jis0208<<14 | 0x38<<7 | 0x38, 25463 - 19968: jis0208<<14 | 0x1D<<7 | 0x18, 25464 - 19968: jis0212<<14 | 0x1F<<7 | 0x00, 25466 - 19968: jis0208<<14 | 0x25<<7 | 0x47, 25467 - 19968: jis0208<<14 | 0x26<<7 | 0x10, 25468 - 19968: jis0212<<14 | 0x1F<<7 | 0x01, 25469 - 19968: jis0212<<14 | 0x1F<<7 | 0x02, 25471 - 19968: jis0212<<14 | 0x1F<<7 | 0x03, 25472 - 19968: jis0208<<14 | 0x38<<7 | 0x36, 25474 - 19968: jis0212<<14 | 0x1F<<7 | 0x04, 25475 - 19968: jis0208<<14 | 0x20<<7 | 0x3C, 25476 - 19968: jis0212<<14 | 0x1F<<7 | 0x05, 25479 - 19968: jis0212<<14 | 0x1F<<7 | 0x06, 25480 - 19968: jis0208<<14 | 0x1B<<7 | 0x57, 25481 - 19968: jis0208<<14 | 0x38<<7 | 0x3B, 25482 - 19968: jis0212<<14 | 0x1F<<7 | 0x07, 25484 - 19968: jis0208<<14 | 0x1D<<7 | 0x17, 25486 - 19968: jis0208<<14 | 0x38<<7 | 0x35, 25487 - 19968: jis0208<<14 | 0x38<<7 | 0x3A, 25488 - 19968: jis0212<<14 | 0x1F<<7 | 0x08, 25490 - 19968: jis0208<<14 | 0x26<<7 | 0x32, 25492 - 19968: jis0212<<14 | 0x1F<<7 | 0x09, 25493 - 19968: jis0212<<14 | 0x1F<<7 | 0x0A, 25494 - 19968: jis0208<<14 | 0x38<<7 | 0x34, 25496 - 19968: jis0208<<14 | 0x16<<7 | 0x00, 25497 - 19968: jis0212<<14 | 0x1F<<7 | 0x0B, 25498 - 19968: jis0212<<14 | 0x1F<<7 | 0x0C, 25499 - 19968: jis0208<<14 | 0x12<<7 | 0x3C, 25502 - 19968: jis0212<<14 | 0x1F<<7 | 0x0D, 25503 - 19968: jis0208<<14 | 0x38<<7 | 0x3C, 25504 - 19968: jis0208<<14 | 0x2D<<7 | 0x0A, 25505 - 19968: jis0208<<14 | 0x19<<7 | 0x2D, 25506 - 19968: jis0208<<14 | 0x22<<7 | 0x14, 25507 - 19968: jis0208<<14 | 0x38<<7 | 0x39, 25508 - 19968: jis0212<<14 | 0x1F<<7 | 0x0E, 25509 - 19968: jis0208<<14 | 0x1F<<7 | 0x3B, 25510 - 19968: jis0212<<14 | 0x1F<<7 | 0x0F, 25511 - 19968: jis0208<<14 | 0x18<<7 | 0x14, 25512 - 19968: jis0208<<14 | 0x1E<<7 | 0x43, 25513 - 19968: jis0208<<14 | 0x10<<7 | 0x45, 25514 - 19968: jis0208<<14 | 0x20<<7 | 0x1B, 25515 - 19968: jis0208<<14 | 0x38<<7 | 0x37, 25516 - 19968: jis0208<<14 | 0x14<<7 | 0x24, 25517 - 19968: jis0212<<14 | 0x1F<<7 | 0x10, 25518 - 19968: jis0212<<14 | 0x1F<<7 | 0x11, 25519 - 19968: jis0212<<14 | 0x1F<<7 | 0x12, 25522 - 19968: jis0208<<14 | 0x16<<7 | 0x26, 25524 - 19968: jis0208<<14 | 0x23<<7 | 0x2E, 25525 - 19968: jis0208<<14 | 0x38<<7 | 0x3D, 25531 - 19968: jis0208<<14 | 0x20<<7 | 0x3E, 25533 - 19968: jis0212<<14 | 0x1F<<7 | 0x13, 25534 - 19968: jis0208<<14 | 0x38<<7 | 0x40, 25536 - 19968: jis0208<<14 | 0x38<<7 | 0x42, 25537 - 19968: jis0212<<14 | 0x1F<<7 | 0x14, 25539 - 19968: jis0208<<14 | 0x21<<7 | 0x16, 25540 - 19968: jis0208<<14 | 0x38<<7 | 0x48, 25541 - 19968: jis0212<<14 | 0x1F<<7 | 0x15, 25542 - 19968: jis0208<<14 | 0x38<<7 | 0x43, 25544 - 19968: jis0212<<14 | 0x1F<<7 | 0x16, 25545 - 19968: jis0208<<14 | 0x38<<7 | 0x45, 25550 - 19968: jis0212<<14 | 0x1F<<7 | 0x17, 25551 - 19968: jis0208<<14 | 0x28<<7 | 0x20, 25552 - 19968: jis0208<<14 | 0x23<<7 | 0x52, 25553 - 19968: jis0212<<14 | 0x1F<<7 | 0x18, 25554 - 19968: jis0208<<14 | 0x38<<7 | 0x46, 25555 - 19968: jis0212<<14 | 0x1F<<7 | 0x19, 25556 - 19968: jis0212<<14 | 0x1F<<7 | 0x1A, 25557 - 19968: jis0212<<14 | 0x1F<<7 | 0x1B, 25558 - 19968: jis0208<<14 | 0x2C<<7 | 0x0B, 25562 - 19968: jis0208<<14 | 0x2C<<7 | 0x27, 25563 - 19968: jis0208<<14 | 0x13<<7 | 0x18, 25564 - 19968: jis0212<<14 | 0x1F<<7 | 0x1C, 25568 - 19968: jis0212<<14 | 0x1F<<7 | 0x1D, 25569 - 19968: jis0208<<14 | 0x0F<<7 | 0x0D, 25571 - 19968: jis0208<<14 | 0x38<<7 | 0x44, 25573 - 19968: jis0212<<14 | 0x1F<<7 | 0x1E, 25577 - 19968: jis0208<<14 | 0x38<<7 | 0x41, 25578 - 19968: jis0212<<14 | 0x1F<<7 | 0x1F, 25580 - 19968: jis0212<<14 | 0x1F<<7 | 0x20, 25582 - 19968: jis0208<<14 | 0x13<<7 | 0x57, 25586 - 19968: jis0212<<14 | 0x1F<<7 | 0x21, 25587 - 19968: jis0212<<14 | 0x1F<<7 | 0x22, 25588 - 19968: jis0208<<14 | 0x10<<7 | 0x46, 25589 - 19968: jis0208<<14 | 0x59<<7 | 0x0E, 25590 - 19968: jis0208<<14 | 0x38<<7 | 0x47, 25592 - 19968: jis0212<<14 | 0x1F<<7 | 0x24, 25593 - 19968: jis0212<<14 | 0x1F<<7 | 0x25, 25594 - 19968: jis0208<<14 | 0x2C<<7 | 0x28, 25606 - 19968: jis0208<<14 | 0x38<<7 | 0x4B, 25609 - 19968: jis0212<<14 | 0x1F<<7 | 0x26, 25610 - 19968: jis0212<<14 | 0x1F<<7 | 0x27, 25613 - 19968: jis0208<<14 | 0x21<<7 | 0x1A, 25615 - 19968: jis0208<<14 | 0x38<<7 | 0x52, 25616 - 19968: jis0212<<14 | 0x1F<<7 | 0x28, 25618 - 19968: jis0212<<14 | 0x1F<<7 | 0x29, 25619 - 19968: jis0208<<14 | 0x38<<7 | 0x4C, 25620 - 19968: jis0212<<14 | 0x1F<<7 | 0x2A, 25622 - 19968: jis0208<<14 | 0x38<<7 | 0x49, 25623 - 19968: jis0208<<14 | 0x38<<7 | 0x50, 25624 - 19968: jis0212<<14 | 0x1F<<7 | 0x2B, 25628 - 19968: jis0208<<14 | 0x38<<7 | 0x32, 25630 - 19968: jis0212<<14 | 0x1F<<7 | 0x2C, 25632 - 19968: jis0212<<14 | 0x1F<<7 | 0x2D, 25634 - 19968: jis0212<<14 | 0x1F<<7 | 0x2E, 25636 - 19968: jis0212<<14 | 0x1F<<7 | 0x2F, 25637 - 19968: jis0212<<14 | 0x1F<<7 | 0x30, 25638 - 19968: jis0208<<14 | 0x38<<7 | 0x4D, 25640 - 19968: jis0208<<14 | 0x38<<7 | 0x51, 25641 - 19968: jis0212<<14 | 0x1F<<7 | 0x31, 25642 - 19968: jis0212<<14 | 0x1F<<7 | 0x32, 25644 - 19968: jis0208<<14 | 0x27<<7 | 0x21, 25645 - 19968: jis0208<<14 | 0x24<<7 | 0x4A, 25647 - 19968: jis0212<<14 | 0x1F<<7 | 0x33, 25648 - 19968: jis0212<<14 | 0x1F<<7 | 0x34, 25652 - 19968: jis0208<<14 | 0x38<<7 | 0x4A, 25653 - 19968: jis0212<<14 | 0x1F<<7 | 0x35, 25654 - 19968: jis0208<<14 | 0x38<<7 | 0x4E, 25658 - 19968: jis0208<<14 | 0x16<<7 | 0x27, 25661 - 19968: jis0212<<14 | 0x1F<<7 | 0x36, 25662 - 19968: jis0208<<14 | 0x19<<7 | 0x50, 25663 - 19968: jis0212<<14 | 0x1F<<7 | 0x37, 25666 - 19968: jis0208<<14 | 0x1F<<7 | 0x3C, 25675 - 19968: jis0212<<14 | 0x1F<<7 | 0x38, 25678 - 19968: jis0208<<14 | 0x38<<7 | 0x56, 25679 - 19968: jis0212<<14 | 0x1F<<7 | 0x39, 25681 - 19968: jis0212<<14 | 0x1F<<7 | 0x3A, 25682 - 19968: jis0212<<14 | 0x1F<<7 | 0x3B, 25683 - 19968: jis0212<<14 | 0x1F<<7 | 0x3C, 25684 - 19968: jis0212<<14 | 0x1F<<7 | 0x3D, 25688 - 19968: jis0208<<14 | 0x24<<7 | 0x05, 25690 - 19968: jis0212<<14 | 0x1F<<7 | 0x3E, 25691 - 19968: jis0212<<14 | 0x1F<<7 | 0x3F, 25692 - 19968: jis0212<<14 | 0x1F<<7 | 0x40, 25693 - 19968: jis0212<<14 | 0x1F<<7 | 0x41, 25695 - 19968: jis0212<<14 | 0x1F<<7 | 0x42, 25696 - 19968: jis0208<<14 | 0x59<<7 | 0x0F, 25697 - 19968: jis0212<<14 | 0x1F<<7 | 0x44, 25699 - 19968: jis0212<<14 | 0x1F<<7 | 0x45, 25703 - 19968: jis0208<<14 | 0x38<<7 | 0x53, 25705 - 19968: jis0208<<14 | 0x2A<<7 | 0x3F, 25709 - 19968: jis0212<<14 | 0x1F<<7 | 0x46, 25711 - 19968: jis0208<<14 | 0x38<<7 | 0x54, 25715 - 19968: jis0212<<14 | 0x1F<<7 | 0x47, 25716 - 19968: jis0212<<14 | 0x1F<<7 | 0x48, 25718 - 19968: jis0208<<14 | 0x38<<7 | 0x55, 25720 - 19968: jis0208<<14 | 0x2B<<7 | 0x2D, 25722 - 19968: jis0208<<14 | 0x1F<<7 | 0x01, 25723 - 19968: jis0212<<14 | 0x1F<<7 | 0x49, 25725 - 19968: jis0212<<14 | 0x1F<<7 | 0x4A, 25731 - 19968: jis0208<<14 | 0x16<<7 | 0x41, 25733 - 19968: jis0212<<14 | 0x1F<<7 | 0x4B, 25735 - 19968: jis0212<<14 | 0x1F<<7 | 0x4C, 25736 - 19968: jis0208<<14 | 0x38<<7 | 0x5C, 25743 - 19968: jis0212<<14 | 0x1F<<7 | 0x4D, 25744 - 19968: jis0212<<14 | 0x1F<<7 | 0x4E, 25745 - 19968: jis0212<<14 | 0x1F<<7 | 0x4F, 25746 - 19968: jis0208<<14 | 0x1A<<7 | 0x14, 25747 - 19968: jis0208<<14 | 0x38<<7 | 0x59, 25749 - 19968: jis0208<<14 | 0x38<<7 | 0x58, 25752 - 19968: jis0212<<14 | 0x1F<<7 | 0x50, 25753 - 19968: jis0212<<14 | 0x1F<<7 | 0x51, 25754 - 19968: jis0208<<14 | 0x26<<7 | 0x11, 25755 - 19968: jis0212<<14 | 0x1F<<7 | 0x52, 25757 - 19968: jis0208<<14 | 0x59<<7 | 0x10, 25758 - 19968: jis0208<<14 | 0x25<<7 | 0x14, 25759 - 19968: jis0212<<14 | 0x1F<<7 | 0x54, 25761 - 19968: jis0212<<14 | 0x1F<<7 | 0x55, 25763 - 19968: jis0212<<14 | 0x1F<<7 | 0x56, 25764 - 19968: jis0208<<14 | 0x24<<7 | 0x10, 25765 - 19968: jis0208<<14 | 0x38<<7 | 0x5A, 25766 - 19968: jis0212<<14 | 0x1F<<7 | 0x57, 25768 - 19968: jis0212<<14 | 0x1F<<7 | 0x58, 25769 - 19968: jis0208<<14 | 0x38<<7 | 0x5B, 25771 - 19968: jis0208<<14 | 0x28<<7 | 0x4E, 25772 - 19968: jis0212<<14 | 0x1F<<7 | 0x59, 25773 - 19968: jis0208<<14 | 0x26<<7 | 0x24, 25774 - 19968: jis0208<<14 | 0x1A<<7 | 0x02, 25776 - 19968: jis0208<<14 | 0x1F<<7 | 0x50, 25778 - 19968: jis0208<<14 | 0x2A<<7 | 0x2F, 25779 - 19968: jis0212<<14 | 0x1F<<7 | 0x5A, 25785 - 19968: jis0208<<14 | 0x12<<7 | 0x28, 25787 - 19968: jis0208<<14 | 0x39<<7 | 0x04, 25788 - 19968: jis0208<<14 | 0x38<<7 | 0x5D, 25789 - 19968: jis0212<<14 | 0x1F<<7 | 0x5B, 25790 - 19968: jis0212<<14 | 0x1F<<7 | 0x5C, 25791 - 19968: jis0212<<14 | 0x1F<<7 | 0x5D, 25793 - 19968: jis0208<<14 | 0x2C<<7 | 0x29, 25794 - 19968: jis0208<<14 | 0x39<<7 | 0x06, 25796 - 19968: jis0212<<14 | 0x20<<7 | 0x00, 25797 - 19968: jis0208<<14 | 0x39<<7 | 0x02, 25799 - 19968: jis0208<<14 | 0x39<<7 | 0x03, 25801 - 19968: jis0212<<14 | 0x20<<7 | 0x01, 25802 - 19968: jis0212<<14 | 0x20<<7 | 0x02, 25803 - 19968: jis0212<<14 | 0x20<<7 | 0x03, 25804 - 19968: jis0212<<14 | 0x20<<7 | 0x04, 25805 - 19968: jis0208<<14 | 0x20<<7 | 0x3F, 25806 - 19968: jis0208<<14 | 0x59<<7 | 0x11, 25808 - 19968: jis0212<<14 | 0x20<<7 | 0x06, 25809 - 19968: jis0212<<14 | 0x20<<7 | 0x07, 25810 - 19968: jis0208<<14 | 0x39<<7 | 0x01, 25812 - 19968: jis0208<<14 | 0x38<<7 | 0x1E, 25813 - 19968: jis0212<<14 | 0x20<<7 | 0x08, 25815 - 19968: jis0212<<14 | 0x20<<7 | 0x09, 25816 - 19968: jis0208<<14 | 0x39<<7 | 0x05, 25818 - 19968: jis0208<<14 | 0x39<<7 | 0x00, 25824 - 19968: jis0208<<14 | 0x39<<7 | 0x0A, 25825 - 19968: jis0208<<14 | 0x39<<7 | 0x0B, 25826 - 19968: jis0208<<14 | 0x24<<7 | 0x06, 25827 - 19968: jis0208<<14 | 0x39<<7 | 0x0D, 25828 - 19968: jis0212<<14 | 0x20<<7 | 0x0A, 25829 - 19968: jis0212<<14 | 0x20<<7 | 0x0B, 25830 - 19968: jis0208<<14 | 0x1A<<7 | 0x03, 25831 - 19968: jis0208<<14 | 0x39<<7 | 0x08, 25833 - 19968: jis0212<<14 | 0x20<<7 | 0x0C, 25834 - 19968: jis0212<<14 | 0x20<<7 | 0x0D, 25836 - 19968: jis0208<<14 | 0x14<<7 | 0x1B, 25837 - 19968: jis0212<<14 | 0x20<<7 | 0x0E, 25839 - 19968: jis0208<<14 | 0x39<<7 | 0x0E, 25840 - 19968: jis0212<<14 | 0x20<<7 | 0x0F, 25841 - 19968: jis0208<<14 | 0x39<<7 | 0x07, 25842 - 19968: jis0208<<14 | 0x39<<7 | 0x12, 25844 - 19968: jis0208<<14 | 0x39<<7 | 0x11, 25845 - 19968: jis0212<<14 | 0x20<<7 | 0x10, 25846 - 19968: jis0208<<14 | 0x39<<7 | 0x10, 25847 - 19968: jis0212<<14 | 0x20<<7 | 0x11, 25850 - 19968: jis0208<<14 | 0x39<<7 | 0x13, 25851 - 19968: jis0212<<14 | 0x20<<7 | 0x12, 25853 - 19968: jis0208<<14 | 0x39<<7 | 0x15, 25854 - 19968: jis0208<<14 | 0x1D<<7 | 0x50, 25855 - 19968: jis0212<<14 | 0x20<<7 | 0x13, 25856 - 19968: jis0208<<14 | 0x39<<7 | 0x14, 25857 - 19968: jis0212<<14 | 0x20<<7 | 0x14, 25860 - 19968: jis0212<<14 | 0x20<<7 | 0x15, 25861 - 19968: jis0208<<14 | 0x39<<7 | 0x18, 25864 - 19968: jis0212<<14 | 0x20<<7 | 0x16, 25865 - 19968: jis0212<<14 | 0x20<<7 | 0x17, 25866 - 19968: jis0212<<14 | 0x20<<7 | 0x18, 25871 - 19968: jis0212<<14 | 0x20<<7 | 0x19, 25875 - 19968: jis0212<<14 | 0x20<<7 | 0x1A, 25876 - 19968: jis0212<<14 | 0x20<<7 | 0x1B, 25878 - 19968: jis0212<<14 | 0x20<<7 | 0x1C, 25880 - 19968: jis0208<<14 | 0x39<<7 | 0x16, 25881 - 19968: jis0212<<14 | 0x20<<7 | 0x1D, 25883 - 19968: jis0212<<14 | 0x20<<7 | 0x1E, 25884 - 19968: jis0208<<14 | 0x39<<7 | 0x17, 25885 - 19968: jis0208<<14 | 0x38<<7 | 0x4F, 25886 - 19968: jis0212<<14 | 0x20<<7 | 0x1F, 25887 - 19968: jis0212<<14 | 0x20<<7 | 0x20, 25890 - 19968: jis0212<<14 | 0x20<<7 | 0x21, 25891 - 19968: jis0208<<14 | 0x39<<7 | 0x1A, 25892 - 19968: jis0208<<14 | 0x39<<7 | 0x19, 25894 - 19968: jis0212<<14 | 0x20<<7 | 0x22, 25897 - 19968: jis0212<<14 | 0x20<<7 | 0x23, 25898 - 19968: jis0208<<14 | 0x38<<7 | 0x57, 25899 - 19968: jis0208<<14 | 0x39<<7 | 0x1B, 25900 - 19968: jis0208<<14 | 0x39<<7 | 0x0F, 25902 - 19968: jis0212<<14 | 0x20<<7 | 0x24, 25903 - 19968: jis0208<<14 | 0x1A<<7 | 0x38, 25905 - 19968: jis0212<<14 | 0x20<<7 | 0x25, 25908 - 19968: jis0208<<14 | 0x39<<7 | 0x1C, 25909 - 19968: jis0208<<14 | 0x39<<7 | 0x1D, 25910 - 19968: jis0208<<14 | 0x39<<7 | 0x1F, 25911 - 19968: jis0208<<14 | 0x39<<7 | 0x1E, 25912 - 19968: jis0208<<14 | 0x39<<7 | 0x20, 25913 - 19968: jis0208<<14 | 0x11<<7 | 0x5D, 25914 - 19968: jis0212<<14 | 0x20<<7 | 0x26, 25915 - 19968: jis0208<<14 | 0x18<<7 | 0x15, 25916 - 19968: jis0212<<14 | 0x20<<7 | 0x27, 25917 - 19968: jis0212<<14 | 0x20<<7 | 0x28, 25918 - 19968: jis0208<<14 | 0x29<<7 | 0x5B, 25919 - 19968: jis0208<<14 | 0x1F<<7 | 0x0E, 25923 - 19968: jis0212<<14 | 0x20<<7 | 0x29, 25925 - 19968: jis0208<<14 | 0x17<<7 | 0x2D, 25927 - 19968: jis0212<<14 | 0x20<<7 | 0x2A, 25928 - 19968: jis0208<<14 | 0x39<<7 | 0x22, 25929 - 19968: jis0212<<14 | 0x20<<7 | 0x2B, 25933 - 19968: jis0208<<14 | 0x39<<7 | 0x25, 25934 - 19968: jis0208<<14 | 0x59<<7 | 0x12, 25935 - 19968: jis0208<<14 | 0x28<<7 | 0x31, 25936 - 19968: jis0212<<14 | 0x20<<7 | 0x2C, 25937 - 19968: jis0208<<14 | 0x14<<7 | 0x3E, 25938 - 19968: jis0212<<14 | 0x20<<7 | 0x2D, 25940 - 19968: jis0212<<14 | 0x20<<7 | 0x2E, 25941 - 19968: jis0208<<14 | 0x39<<7 | 0x24, 25942 - 19968: jis0208<<14 | 0x39<<7 | 0x23, 25943 - 19968: jis0208<<14 | 0x26<<7 | 0x33, 25944 - 19968: jis0208<<14 | 0x39<<7 | 0x26, 25945 - 19968: jis0208<<14 | 0x15<<7 | 0x14, 25949 - 19968: jis0208<<14 | 0x39<<7 | 0x28, 25950 - 19968: jis0208<<14 | 0x39<<7 | 0x27, 25951 - 19968: jis0212<<14 | 0x20<<7 | 0x2F, 25952 - 19968: jis0212<<14 | 0x20<<7 | 0x30, 25954 - 19968: jis0208<<14 | 0x13<<7 | 0x19, 25955 - 19968: jis0208<<14 | 0x1A<<7 | 0x15, 25958 - 19968: jis0208<<14 | 0x25<<7 | 0x37, 25959 - 19968: jis0212<<14 | 0x20<<7 | 0x31, 25963 - 19968: jis0212<<14 | 0x20<<7 | 0x32, 25964 - 19968: jis0208<<14 | 0x16<<7 | 0x28, 25968 - 19968: jis0208<<14 | 0x1E<<7 | 0x53, 25970 - 19968: jis0208<<14 | 0x39<<7 | 0x29, 25972 - 19968: jis0208<<14 | 0x1F<<7 | 0x0F, 25973 - 19968: jis0208<<14 | 0x24<<7 | 0x07, 25975 - 19968: jis0208<<14 | 0x28<<7 | 0x3E, 25976 - 19968: jis0208<<14 | 0x39<<7 | 0x2A, 25978 - 19968: jis0212<<14 | 0x20<<7 | 0x33, 25981 - 19968: jis0212<<14 | 0x20<<7 | 0x34, 25985 - 19968: jis0212<<14 | 0x20<<7 | 0x35, 25986 - 19968: jis0208<<14 | 0x39<<7 | 0x2B, 25987 - 19968: jis0208<<14 | 0x39<<7 | 0x2C, 25989 - 19968: jis0212<<14 | 0x20<<7 | 0x36, 25991 - 19968: jis0208<<14 | 0x29<<7 | 0x17, 25992 - 19968: jis0208<<14 | 0x34<<7 | 0x3C, 25993 - 19968: jis0208<<14 | 0x1F<<7 | 0x25, 25994 - 19968: jis0212<<14 | 0x20<<7 | 0x37, 25996 - 19968: jis0208<<14 | 0x28<<7 | 0x2B, 25998 - 19968: jis0208<<14 | 0x19<<7 | 0x37, 26000 - 19968: jis0208<<14 | 0x27<<7 | 0x44, 26001 - 19968: jis0208<<14 | 0x27<<7 | 0x22, 26002 - 19968: jis0212<<14 | 0x20<<7 | 0x38, 26005 - 19968: jis0212<<14 | 0x20<<7 | 0x39, 26007 - 19968: jis0208<<14 | 0x24<<7 | 0x2C, 26008 - 19968: jis0212<<14 | 0x20<<7 | 0x3A, 26009 - 19968: jis0208<<14 | 0x2D<<7 | 0x20, 26011 - 19968: jis0208<<14 | 0x39<<7 | 0x2E, 26012 - 19968: jis0208<<14 | 0x1B<<7 | 0x2F, 26013 - 19968: jis0212<<14 | 0x20<<7 | 0x3B, 26015 - 19968: jis0208<<14 | 0x39<<7 | 0x2F, 26016 - 19968: jis0212<<14 | 0x20<<7 | 0x3C, 26017 - 19968: jis0208<<14 | 0x0F<<7 | 0x15, 26019 - 19968: jis0212<<14 | 0x20<<7 | 0x3D, 26020 - 19968: jis0208<<14 | 0x15<<7 | 0x33, 26021 - 19968: jis0208<<14 | 0x1F<<7 | 0x2C, 26022 - 19968: jis0212<<14 | 0x20<<7 | 0x3E, 26023 - 19968: jis0208<<14 | 0x28<<7 | 0x3F, 26027 - 19968: jis0208<<14 | 0x39<<7 | 0x30, 26028 - 19968: jis0208<<14 | 0x1A<<7 | 0x21, 26029 - 19968: jis0208<<14 | 0x22<<7 | 0x26, 26030 - 19968: jis0212<<14 | 0x20<<7 | 0x3F, 26031 - 19968: jis0208<<14 | 0x1A<<7 | 0x3A, 26032 - 19968: jis0208<<14 | 0x1E<<7 | 0x16, 26034 - 19968: jis0212<<14 | 0x20<<7 | 0x40, 26035 - 19968: jis0212<<14 | 0x20<<7 | 0x41, 26036 - 19968: jis0212<<14 | 0x20<<7 | 0x42, 26039 - 19968: jis0208<<14 | 0x39<<7 | 0x31, 26041 - 19968: jis0208<<14 | 0x29<<7 | 0x5C, 26044 - 19968: jis0208<<14 | 0x10<<7 | 0x56, 26045 - 19968: jis0208<<14 | 0x1A<<7 | 0x3B, 26047 - 19968: jis0212<<14 | 0x20<<7 | 0x43, 26049 - 19968: jis0208<<14 | 0x39<<7 | 0x34, 26050 - 19968: jis0212<<14 | 0x20<<7 | 0x44, 26051 - 19968: jis0208<<14 | 0x39<<7 | 0x32, 26052 - 19968: jis0208<<14 | 0x39<<7 | 0x35, 26053 - 19968: jis0208<<14 | 0x2D<<7 | 0x18, 26054 - 19968: jis0208<<14 | 0x39<<7 | 0x33, 26056 - 19968: jis0212<<14 | 0x20<<7 | 0x45, 26057 - 19968: jis0212<<14 | 0x20<<7 | 0x46, 26059 - 19968: jis0208<<14 | 0x1F<<7 | 0x5A, 26060 - 19968: jis0208<<14 | 0x39<<7 | 0x36, 26062 - 19968: jis0212<<14 | 0x20<<7 | 0x47, 26063 - 19968: jis0208<<14 | 0x21<<7 | 0x11, 26064 - 19968: jis0212<<14 | 0x20<<7 | 0x48, 26066 - 19968: jis0208<<14 | 0x39<<7 | 0x37, 26068 - 19968: jis0212<<14 | 0x20<<7 | 0x49, 26070 - 19968: jis0212<<14 | 0x20<<7 | 0x4A, 26071 - 19968: jis0208<<14 | 0x13<<7 | 0x59, 26072 - 19968: jis0212<<14 | 0x20<<7 | 0x4B, 26073 - 19968: jis0208<<14 | 0x39<<7 | 0x39, 26075 - 19968: jis0208<<14 | 0x39<<7 | 0x38, 26079 - 19968: jis0212<<14 | 0x20<<7 | 0x4C, 26080 - 19968: jis0208<<14 | 0x39<<7 | 0x3A, 26081 - 19968: jis0208<<14 | 0x39<<7 | 0x3B, 26082 - 19968: jis0208<<14 | 0x13<<7 | 0x5A, 26085 - 19968: jis0208<<14 | 0x25<<7 | 0x5B, 26086 - 19968: jis0208<<14 | 0x22<<7 | 0x15, 26087 - 19968: jis0208<<14 | 0x14<<7 | 0x4B, 26088 - 19968: jis0208<<14 | 0x1A<<7 | 0x3C, 26089 - 19968: jis0208<<14 | 0x20<<7 | 0x40, 26092 - 19968: jis0208<<14 | 0x1C<<7 | 0x3B, 26093 - 19968: jis0208<<14 | 0x0F<<7 | 0x0F, 26096 - 19968: jis0212<<14 | 0x20<<7 | 0x4D, 26097 - 19968: jis0208<<14 | 0x39<<7 | 0x3C, 26098 - 19968: jis0212<<14 | 0x20<<7 | 0x4E, 26100 - 19968: jis0212<<14 | 0x20<<7 | 0x4F, 26101 - 19968: jis0212<<14 | 0x20<<7 | 0x50, 26105 - 19968: jis0212<<14 | 0x20<<7 | 0x51, 26106 - 19968: jis0208<<14 | 0x11<<7 | 0x01, 26107 - 19968: jis0208<<14 | 0x39<<7 | 0x40, 26110 - 19968: jis0212<<14 | 0x20<<7 | 0x52, 26111 - 19968: jis0212<<14 | 0x20<<7 | 0x53, 26112 - 19968: jis0208<<14 | 0x59<<7 | 0x13, 26114 - 19968: jis0208<<14 | 0x18<<7 | 0x16, 26115 - 19968: jis0208<<14 | 0x39<<7 | 0x3F, 26116 - 19968: jis0212<<14 | 0x20<<7 | 0x55, 26118 - 19968: jis0208<<14 | 0x19<<7 | 0x0A, 26119 - 19968: jis0208<<14 | 0x1D<<7 | 0x19, 26120 - 19968: jis0212<<14 | 0x20<<7 | 0x56, 26121 - 19968: jis0208<<14 | 0x59<<7 | 0x16, 26122 - 19968: jis0208<<14 | 0x39<<7 | 0x3E, 26124 - 19968: jis0208<<14 | 0x1D<<7 | 0x1A, 26125 - 19968: jis0212<<14 | 0x20<<7 | 0x58, 26126 - 19968: jis0208<<14 | 0x2B<<7 | 0x1F, 26127 - 19968: jis0208<<14 | 0x19<<7 | 0x09, 26129 - 19968: jis0212<<14 | 0x20<<7 | 0x59, 26130 - 19968: jis0212<<14 | 0x20<<7 | 0x5A, 26131 - 19968: jis0208<<14 | 0x0F<<7 | 0x36, 26132 - 19968: jis0208<<14 | 0x1F<<7 | 0x2D, 26133 - 19968: jis0208<<14 | 0x59<<7 | 0x14, 26134 - 19968: jis0212<<14 | 0x20<<7 | 0x5C, 26140 - 19968: jis0208<<14 | 0x39<<7 | 0x45, 26141 - 19968: jis0212<<14 | 0x20<<7 | 0x5D, 26142 - 19968: jis0208<<14 | 0x59<<7 | 0x18, 26143 - 19968: jis0208<<14 | 0x1F<<7 | 0x10, 26144 - 19968: jis0208<<14 | 0x10<<7 | 0x26, 26145 - 19968: jis0212<<14 | 0x21<<7 | 0x01, 26146 - 19968: jis0212<<14 | 0x21<<7 | 0x02, 26147 - 19968: jis0212<<14 | 0x21<<7 | 0x03, 26148 - 19968: jis0208<<14 | 0x59<<7 | 0x19, 26149 - 19968: jis0208<<14 | 0x1C<<7 | 0x34, 26150 - 19968: jis0212<<14 | 0x21<<7 | 0x05, 26151 - 19968: jis0208<<14 | 0x2A<<7 | 0x45, 26152 - 19968: jis0208<<14 | 0x19<<7 | 0x51, 26153 - 19968: jis0212<<14 | 0x21<<7 | 0x06, 26154 - 19968: jis0212<<14 | 0x21<<7 | 0x07, 26155 - 19968: jis0212<<14 | 0x21<<7 | 0x08, 26156 - 19968: jis0212<<14 | 0x21<<7 | 0x09, 26157 - 19968: jis0208<<14 | 0x1D<<7 | 0x1B, 26158 - 19968: jis0208<<14 | 0x59<<7 | 0x17, 26159 - 19968: jis0208<<14 | 0x1F<<7 | 0x06, 26160 - 19968: jis0212<<14 | 0x21<<7 | 0x0B, 26161 - 19968: jis0208<<14 | 0x58<<7 | 0x07, 26163 - 19968: jis0212<<14 | 0x21<<7 | 0x0D, 26164 - 19968: jis0208<<14 | 0x39<<7 | 0x44, 26165 - 19968: jis0208<<14 | 0x39<<7 | 0x42, 26166 - 19968: jis0208<<14 | 0x39<<7 | 0x43, 26167 - 19968: jis0212<<14 | 0x21<<7 | 0x0F, 26169 - 19968: jis0212<<14 | 0x21<<7 | 0x0E, 26171 - 19968: jis0208<<14 | 0x59<<7 | 0x15, 26172 - 19968: jis0208<<14 | 0x22<<7 | 0x4A, 26175 - 19968: jis0208<<14 | 0x3A<<7 | 0x05, 26176 - 19968: jis0212<<14 | 0x21<<7 | 0x10, 26177 - 19968: jis0208<<14 | 0x39<<7 | 0x49, 26178 - 19968: jis0208<<14 | 0x1A<<7 | 0x5D, 26179 - 19968: jis0208<<14 | 0x18<<7 | 0x17, 26180 - 19968: jis0208<<14 | 0x39<<7 | 0x47, 26181 - 19968: jis0212<<14 | 0x21<<7 | 0x11, 26182 - 19968: jis0212<<14 | 0x21<<7 | 0x12, 26185 - 19968: jis0208<<14 | 0x39<<7 | 0x48, 26186 - 19968: jis0212<<14 | 0x21<<7 | 0x13, 26187 - 19968: jis0208<<14 | 0x1E<<7 | 0x17, 26188 - 19968: jis0212<<14 | 0x21<<7 | 0x14, 26190 - 19968: jis0212<<14 | 0x21<<7 | 0x16, 26191 - 19968: jis0208<<14 | 0x39<<7 | 0x46, 26193 - 19968: jis0212<<14 | 0x21<<7 | 0x15, 26194 - 19968: jis0208<<14 | 0x1A<<7 | 0x0E, 26199 - 19968: jis0208<<14 | 0x59<<7 | 0x1B, 26200 - 19968: jis0212<<14 | 0x21<<7 | 0x18, 26201 - 19968: jis0208<<14 | 0x59<<7 | 0x1C, 26203 - 19968: jis0212<<14 | 0x21<<7 | 0x1A, 26204 - 19968: jis0212<<14 | 0x21<<7 | 0x1B, 26205 - 19968: jis0208<<14 | 0x39<<7 | 0x4B, 26206 - 19968: jis0208<<14 | 0x39<<7 | 0x4A, 26207 - 19968: jis0208<<14 | 0x39<<7 | 0x4F, 26208 - 19968: jis0212<<14 | 0x21<<7 | 0x1C, 26209 - 19968: jis0212<<14 | 0x21<<7 | 0x1D, 26210 - 19968: jis0208<<14 | 0x39<<7 | 0x50, 26212 - 19968: jis0208<<14 | 0x39<<7 | 0x4C, 26213 - 19968: jis0208<<14 | 0x59<<7 | 0x1A, 26214 - 19968: jis0208<<14 | 0x12<<7 | 0x01, 26215 - 19968: jis0208<<14 | 0x39<<7 | 0x4D, 26216 - 19968: jis0208<<14 | 0x39<<7 | 0x4E, 26217 - 19968: jis0208<<14 | 0x27<<7 | 0x34, 26218 - 19968: jis0212<<14 | 0x21<<7 | 0x1F, 26219 - 19968: jis0212<<14 | 0x21<<7 | 0x20, 26220 - 19968: jis0212<<14 | 0x21<<7 | 0x21, 26222 - 19968: jis0208<<14 | 0x28<<7 | 0x40, 26223 - 19968: jis0208<<14 | 0x16<<7 | 0x29, 26224 - 19968: jis0208<<14 | 0x39<<7 | 0x51, 26227 - 19968: jis0208<<14 | 0x59<<7 | 0x1E, 26228 - 19968: jis0208<<14 | 0x1F<<7 | 0x11, 26229 - 19968: jis0212<<14 | 0x21<<7 | 0x24, 26230 - 19968: jis0208<<14 | 0x1D<<7 | 0x1C, 26231 - 19968: jis0212<<14 | 0x21<<7 | 0x26, 26232 - 19968: jis0212<<14 | 0x21<<7 | 0x27, 26233 - 19968: jis0212<<14 | 0x21<<7 | 0x28, 26234 - 19968: jis0208<<14 | 0x22<<7 | 0x31, 26235 - 19968: jis0212<<14 | 0x21<<7 | 0x29, 26236 - 19968: jis0212<<14 | 0x21<<7 | 0x2B, 26238 - 19968: jis0212<<14 | 0x21<<7 | 0x22, 26239 - 19968: jis0212<<14 | 0x21<<7 | 0x25, 26240 - 19968: jis0212<<14 | 0x21<<7 | 0x2A, 26241 - 19968: jis0208<<14 | 0x15<<7 | 0x26, 26243 - 19968: jis0208<<14 | 0x39<<7 | 0x52, 26244 - 19968: jis0208<<14 | 0x39<<7 | 0x56, 26247 - 19968: jis0208<<14 | 0x11<<7 | 0x2A, 26248 - 19968: jis0208<<14 | 0x39<<7 | 0x53, 26249 - 19968: jis0208<<14 | 0x39<<7 | 0x55, 26251 - 19968: jis0212<<14 | 0x21<<7 | 0x2C, 26252 - 19968: jis0212<<14 | 0x21<<7 | 0x2D, 26253 - 19968: jis0212<<14 | 0x21<<7 | 0x2E, 26254 - 19968: jis0208<<14 | 0x39<<7 | 0x54, 26256 - 19968: jis0212<<14 | 0x21<<7 | 0x2F, 26257 - 19968: jis0208<<14 | 0x1C<<7 | 0x4A, 26258 - 19968: jis0212<<14 | 0x21<<7 | 0x30, 26262 - 19968: jis0208<<14 | 0x22<<7 | 0x27, 26263 - 19968: jis0208<<14 | 0x0F<<7 | 0x24, 26264 - 19968: jis0208<<14 | 0x39<<7 | 0x57, 26265 - 19968: jis0208<<14 | 0x59<<7 | 0x1F, 26266 - 19968: jis0212<<14 | 0x21<<7 | 0x32, 26267 - 19968: jis0212<<14 | 0x21<<7 | 0x33, 26268 - 19968: jis0212<<14 | 0x21<<7 | 0x34, 26269 - 19968: jis0208<<14 | 0x39<<7 | 0x58, 26271 - 19968: jis0212<<14 | 0x21<<7 | 0x35, 26272 - 19968: jis0208<<14 | 0x59<<7 | 0x20, 26274 - 19968: jis0208<<14 | 0x23<<7 | 0x09, 26276 - 19968: jis0212<<14 | 0x21<<7 | 0x37, 26278 - 19968: jis0208<<14 | 0x2D<<7 | 0x50, 26283 - 19968: jis0208<<14 | 0x1A<<7 | 0x22, 26285 - 19968: jis0212<<14 | 0x21<<7 | 0x38, 26286 - 19968: jis0208<<14 | 0x29<<7 | 0x4A, 26289 - 19968: jis0212<<14 | 0x21<<7 | 0x39, 26290 - 19968: jis0208<<14 | 0x59<<7 | 0x21, 26292 - 19968: jis0208<<14 | 0x2A<<7 | 0x1C, 26293 - 19968: jis0212<<14 | 0x21<<7 | 0x3B, 26296 - 19968: jis0208<<14 | 0x3A<<7 | 0x01, 26297 - 19968: jis0208<<14 | 0x39<<7 | 0x5A, 26299 - 19968: jis0212<<14 | 0x21<<7 | 0x3C, 26300 - 19968: jis0208<<14 | 0x39<<7 | 0x5D, 26302 - 19968: jis0208<<14 | 0x39<<7 | 0x5C, 26303 - 19968: jis0208<<14 | 0x59<<7 | 0x22, 26304 - 19968: jis0212<<14 | 0x21<<7 | 0x3E, 26305 - 19968: jis0208<<14 | 0x39<<7 | 0x59, 26306 - 19968: jis0212<<14 | 0x21<<7 | 0x3F, 26307 - 19968: jis0212<<14 | 0x21<<7 | 0x40, 26308 - 19968: jis0208<<14 | 0x3A<<7 | 0x00, 26311 - 19968: jis0208<<14 | 0x25<<7 | 0x3D, 26312 - 19968: jis0212<<14 | 0x21<<7 | 0x41, 26313 - 19968: jis0208<<14 | 0x39<<7 | 0x5B, 26316 - 19968: jis0212<<14 | 0x21<<7 | 0x42, 26318 - 19968: jis0212<<14 | 0x21<<7 | 0x43, 26319 - 19968: jis0212<<14 | 0x21<<7 | 0x44, 26324 - 19968: jis0212<<14 | 0x21<<7 | 0x45, 26326 - 19968: jis0208<<14 | 0x3A<<7 | 0x02, 26329 - 19968: jis0208<<14 | 0x1C<<7 | 0x4B, 26330 - 19968: jis0208<<14 | 0x3A<<7 | 0x03, 26331 - 19968: jis0212<<14 | 0x21<<7 | 0x46, 26332 - 19968: jis0208<<14 | 0x2C<<7 | 0x2A, 26333 - 19968: jis0208<<14 | 0x26<<7 | 0x57, 26335 - 19968: jis0212<<14 | 0x21<<7 | 0x47, 26336 - 19968: jis0208<<14 | 0x3A<<7 | 0x04, 26342 - 19968: jis0208<<14 | 0x3A<<7 | 0x06, 26344 - 19968: jis0212<<14 | 0x21<<7 | 0x48, 26345 - 19968: jis0208<<14 | 0x3A<<7 | 0x07, 26347 - 19968: jis0212<<14 | 0x21<<7 | 0x49, 26348 - 19968: jis0212<<14 | 0x21<<7 | 0x4A, 26350 - 19968: jis0212<<14 | 0x21<<7 | 0x4B, 26352 - 19968: jis0208<<14 | 0x3A<<7 | 0x08, 26354 - 19968: jis0208<<14 | 0x15<<7 | 0x29, 26355 - 19968: jis0208<<14 | 0x10<<7 | 0x27, 26356 - 19968: jis0208<<14 | 0x18<<7 | 0x18, 26357 - 19968: jis0208<<14 | 0x3A<<7 | 0x09, 26359 - 19968: jis0208<<14 | 0x3A<<7 | 0x0A, 26360 - 19968: jis0208<<14 | 0x1C<<7 | 0x50, 26361 - 19968: jis0208<<14 | 0x20<<7 | 0x41, 26362 - 19968: jis0208<<14 | 0x59<<7 | 0x23, 26363 - 19968: jis0208<<14 | 0x58<<7 | 0x0A, 26364 - 19968: jis0208<<14 | 0x31<<7 | 0x37, 26365 - 19968: jis0208<<14 | 0x20<<7 | 0x1D, 26366 - 19968: jis0208<<14 | 0x20<<7 | 0x1C, 26367 - 19968: jis0208<<14 | 0x21<<7 | 0x37, 26368 - 19968: jis0208<<14 | 0x19<<7 | 0x26, 26371 - 19968: jis0208<<14 | 0x2F<<7 | 0x51, 26373 - 19968: jis0212<<14 | 0x21<<7 | 0x4D, 26375 - 19968: jis0212<<14 | 0x21<<7 | 0x4E, 26376 - 19968: jis0208<<14 | 0x16<<7 | 0x4D, 26377 - 19968: jis0208<<14 | 0x2C<<7 | 0x0C, 26379 - 19968: jis0208<<14 | 0x29<<7 | 0x5D, 26381 - 19968: jis0208<<14 | 0x28<<7 | 0x5D, 26382 - 19968: jis0208<<14 | 0x59<<7 | 0x24, 26383 - 19968: jis0208<<14 | 0x3A<<7 | 0x0B, 26387 - 19968: jis0212<<14 | 0x21<<7 | 0x50, 26388 - 19968: jis0208<<14 | 0x19<<7 | 0x52, 26389 - 19968: jis0208<<14 | 0x23<<7 | 0x1E, 26390 - 19968: jis0208<<14 | 0x3A<<7 | 0x0C, 26391 - 19968: jis0208<<14 | 0x2E<<7 | 0x0E, 26393 - 19968: jis0212<<14 | 0x21<<7 | 0x51, 26395 - 19968: jis0208<<14 | 0x2A<<7 | 0x1D, 26396 - 19968: jis0212<<14 | 0x21<<7 | 0x52, 26397 - 19968: jis0208<<14 | 0x23<<7 | 0x0A, 26398 - 19968: jis0208<<14 | 0x3A<<7 | 0x0D, 26399 - 19968: jis0208<<14 | 0x13<<7 | 0x5B, 26400 - 19968: jis0212<<14 | 0x21<<7 | 0x53, 26402 - 19968: jis0212<<14 | 0x21<<7 | 0x54, 26406 - 19968: jis0208<<14 | 0x3A<<7 | 0x0E, 26407 - 19968: jis0208<<14 | 0x3A<<7 | 0x0F, 26408 - 19968: jis0208<<14 | 0x2B<<7 | 0x39, 26410 - 19968: jis0208<<14 | 0x2B<<7 | 0x03, 26411 - 19968: jis0208<<14 | 0x2A<<7 | 0x55, 26412 - 19968: jis0208<<14 | 0x2A<<7 | 0x3B, 26413 - 19968: jis0208<<14 | 0x1A<<7 | 0x04, 26414 - 19968: jis0208<<14 | 0x3A<<7 | 0x11, 26417 - 19968: jis0208<<14 | 0x1B<<7 | 0x4A, 26419 - 19968: jis0212<<14 | 0x21<<7 | 0x55, 26420 - 19968: jis0208<<14 | 0x2A<<7 | 0x30, 26422 - 19968: jis0208<<14 | 0x3A<<7 | 0x13, 26423 - 19968: jis0208<<14 | 0x3A<<7 | 0x16, 26424 - 19968: jis0208<<14 | 0x3A<<7 | 0x15, 26426 - 19968: jis0208<<14 | 0x13<<7 | 0x58, 26429 - 19968: jis0208<<14 | 0x14<<7 | 0x3F, 26430 - 19968: jis0212<<14 | 0x21<<7 | 0x56, 26431 - 19968: jis0208<<14 | 0x3A<<7 | 0x12, 26433 - 19968: jis0208<<14 | 0x3A<<7 | 0x14, 26437 - 19968: jis0212<<14 | 0x21<<7 | 0x57, 26438 - 19968: jis0208<<14 | 0x3A<<7 | 0x17, 26439 - 19968: jis0212<<14 | 0x21<<7 | 0x58, 26440 - 19968: jis0212<<14 | 0x21<<7 | 0x59, 26441 - 19968: jis0208<<14 | 0x1E<<7 | 0x58, 26444 - 19968: jis0212<<14 | 0x21<<7 | 0x5A, 26446 - 19968: jis0208<<14 | 0x2C<<7 | 0x5A, 26447 - 19968: jis0208<<14 | 0x0F<<7 | 0x28, 26448 - 19968: jis0208<<14 | 0x19<<7 | 0x3F, 26449 - 19968: jis0208<<14 | 0x21<<7 | 0x1B, 26451 - 19968: jis0208<<14 | 0x1B<<7 | 0x3C, 26452 - 19968: jis0212<<14 | 0x21<<7 | 0x5B, 26453 - 19968: jis0212<<14 | 0x21<<7 | 0x5C, 26454 - 19968: jis0208<<14 | 0x1D<<7 | 0x52, 26457 - 19968: jis0208<<14 | 0x3A<<7 | 0x1A, 26460 - 19968: jis0208<<14 | 0x24<<7 | 0x2D, 26461 - 19968: jis0212<<14 | 0x21<<7 | 0x5D, 26462 - 19968: jis0208<<14 | 0x3A<<7 | 0x18, 26463 - 19968: jis0208<<14 | 0x21<<7 | 0x0A, 26464 - 19968: jis0208<<14 | 0x3A<<7 | 0x19, 26465 - 19968: jis0208<<14 | 0x1D<<7 | 0x51, 26466 - 19968: jis0208<<14 | 0x2B<<7 | 0x3C, 26467 - 19968: jis0208<<14 | 0x3A<<7 | 0x1B, 26468 - 19968: jis0208<<14 | 0x3A<<7 | 0x1C, 26469 - 19968: jis0208<<14 | 0x2C<<7 | 0x47, 26470 - 19968: jis0208<<14 | 0x59<<7 | 0x26, 26474 - 19968: jis0208<<14 | 0x3A<<7 | 0x21, 26476 - 19968: jis0212<<14 | 0x22<<7 | 0x01, 26477 - 19968: jis0208<<14 | 0x18<<7 | 0x19, 26478 - 19968: jis0212<<14 | 0x22<<7 | 0x02, 26479 - 19968: jis0208<<14 | 0x26<<7 | 0x34, 26480 - 19968: jis0208<<14 | 0x3A<<7 | 0x1E, 26481 - 19968: jis0208<<14 | 0x24<<7 | 0x4B, 26482 - 19968: jis0208<<14 | 0x39<<7 | 0x3D, 26483 - 19968: jis0208<<14 | 0x39<<7 | 0x41, 26484 - 19968: jis0212<<14 | 0x22<<7 | 0x03, 26485 - 19968: jis0208<<14 | 0x14<<7 | 0x2E, 26486 - 19968: jis0212<<14 | 0x22<<7 | 0x04, 26487 - 19968: jis0208<<14 | 0x26<<7 | 0x26, 26491 - 19968: jis0212<<14 | 0x22<<7 | 0x05, 26492 - 19968: jis0208<<14 | 0x3A<<7 | 0x20, 26494 - 19968: jis0208<<14 | 0x1D<<7 | 0x1D, 26495 - 19968: jis0208<<14 | 0x27<<7 | 0x23, 26497 - 19968: jis0212<<14 | 0x22<<7 | 0x06, 26500 - 19968: jis0212<<14 | 0x22<<7 | 0x07, 26501 - 19968: jis0208<<14 | 0x3A<<7 | 0x26, 26503 - 19968: jis0208<<14 | 0x27<<7 | 0x59, 26505 - 19968: jis0208<<14 | 0x3A<<7 | 0x1D, 26507 - 19968: jis0208<<14 | 0x3A<<7 | 0x23, 26508 - 19968: jis0208<<14 | 0x3A<<7 | 0x22, 26510 - 19968: jis0212<<14 | 0x22<<7 | 0x08, 26511 - 19968: jis0212<<14 | 0x22<<7 | 0x09, 26512 - 19968: jis0208<<14 | 0x1F<<7 | 0x2E, 26513 - 19968: jis0212<<14 | 0x22<<7 | 0x0A, 26515 - 19968: jis0212<<14 | 0x22<<7 | 0x0B, 26517 - 19968: jis0208<<14 | 0x2A<<7 | 0x4C, 26518 - 19968: jis0212<<14 | 0x22<<7 | 0x0C, 26519 - 19968: jis0208<<14 | 0x2D<<7 | 0x32, 26520 - 19968: jis0212<<14 | 0x22<<7 | 0x0D, 26521 - 19968: jis0212<<14 | 0x22<<7 | 0x0E, 26522 - 19968: jis0208<<14 | 0x2A<<7 | 0x46, 26523 - 19968: jis0212<<14 | 0x22<<7 | 0x0F, 26524 - 19968: jis0208<<14 | 0x11<<7 | 0x2B, 26525 - 19968: jis0208<<14 | 0x1A<<7 | 0x3D, 26528 - 19968: jis0208<<14 | 0x2E<<7 | 0x27, 26529 - 19968: jis0208<<14 | 0x3A<<7 | 0x25, 26530 - 19968: jis0208<<14 | 0x1E<<7 | 0x54, 26534 - 19968: jis0208<<14 | 0x3A<<7 | 0x24, 26537 - 19968: jis0208<<14 | 0x3A<<7 | 0x1F, 26543 - 19968: jis0208<<14 | 0x17<<7 | 0x2E, 26544 - 19968: jis0212<<14 | 0x22<<7 | 0x10, 26545 - 19968: jis0212<<14 | 0x22<<7 | 0x11, 26546 - 19968: jis0212<<14 | 0x22<<7 | 0x12, 26547 - 19968: jis0208<<14 | 0x3A<<7 | 0x2B, 26548 - 19968: jis0208<<14 | 0x3A<<7 | 0x29, 26549 - 19968: jis0212<<14 | 0x22<<7 | 0x13, 26550 - 19968: jis0208<<14 | 0x11<<7 | 0x2C, 26551 - 19968: jis0208<<14 | 0x3A<<7 | 0x27, 26552 - 19968: jis0208<<14 | 0x3A<<7 | 0x2D, 26553 - 19968: jis0208<<14 | 0x3A<<7 | 0x33, 26555 - 19968: jis0208<<14 | 0x59<<7 | 0x27, 26556 - 19968: jis0212<<14 | 0x22<<7 | 0x15, 26557 - 19968: jis0212<<14 | 0x22<<7 | 0x16, 26560 - 19968: jis0208<<14 | 0x59<<7 | 0x29, 26561 - 19968: jis0208<<14 | 0x21<<7 | 0x27, 26562 - 19968: jis0212<<14 | 0x22<<7 | 0x19, 26563 - 19968: jis0212<<14 | 0x22<<7 | 0x1A, 26564 - 19968: jis0208<<14 | 0x29<<7 | 0x20, 26565 - 19968: jis0212<<14 | 0x22<<7 | 0x1B, 26566 - 19968: jis0208<<14 | 0x3A<<7 | 0x35, 26568 - 19968: jis0212<<14 | 0x22<<7 | 0x1C, 26569 - 19968: jis0212<<14 | 0x22<<7 | 0x1D, 26570 - 19968: jis0208<<14 | 0x28<<7 | 0x01, 26574 - 19968: jis0208<<14 | 0x3A<<7 | 0x34, 26575 - 19968: jis0208<<14 | 0x26<<7 | 0x4F, 26576 - 19968: jis0208<<14 | 0x2A<<7 | 0x1E, 26577 - 19968: jis0208<<14 | 0x13<<7 | 0x1A, 26578 - 19968: jis0212<<14 | 0x22<<7 | 0x1E, 26579 - 19968: jis0208<<14 | 0x1F<<7 | 0x56, 26580 - 19968: jis0208<<14 | 0x1C<<7 | 0x1F, 26583 - 19968: jis0212<<14 | 0x22<<7 | 0x1F, 26584 - 19968: jis0208<<14 | 0x23<<7 | 0x32, 26585 - 19968: jis0212<<14 | 0x22<<7 | 0x20, 26586 - 19968: jis0208<<14 | 0x2C<<7 | 0x0D, 26588 - 19968: jis0212<<14 | 0x22<<7 | 0x21, 26589 - 19968: jis0208<<14 | 0x3A<<7 | 0x30, 26590 - 19968: jis0208<<14 | 0x3A<<7 | 0x2F, 26593 - 19968: jis0212<<14 | 0x22<<7 | 0x22, 26594 - 19968: jis0208<<14 | 0x3A<<7 | 0x31, 26596 - 19968: jis0208<<14 | 0x3A<<7 | 0x2E, 26598 - 19968: jis0212<<14 | 0x22<<7 | 0x23, 26599 - 19968: jis0208<<14 | 0x3A<<7 | 0x36, 26601 - 19968: jis0208<<14 | 0x3A<<7 | 0x2C, 26604 - 19968: jis0208<<14 | 0x3A<<7 | 0x2A, 26606 - 19968: jis0208<<14 | 0x3A<<7 | 0x32, 26607 - 19968: jis0208<<14 | 0x3A<<7 | 0x28, 26608 - 19968: jis0212<<14 | 0x22<<7 | 0x24, 26609 - 19968: jis0208<<14 | 0x22<<7 | 0x4B, 26610 - 19968: jis0212<<14 | 0x22<<7 | 0x25, 26611 - 19968: jis0208<<14 | 0x2B<<7 | 0x57, 26612 - 19968: jis0208<<14 | 0x1B<<7 | 0x25, 26613 - 19968: jis0208<<14 | 0x19<<7 | 0x53, 26614 - 19968: jis0212<<14 | 0x22<<7 | 0x26, 26615 - 19968: jis0212<<14 | 0x22<<7 | 0x27, 26617 - 19968: jis0212<<14 | 0x22<<7 | 0x17, 26619 - 19968: jis0208<<14 | 0x19<<7 | 0x19, 26622 - 19968: jis0208<<14 | 0x2A<<7 | 0x4E, 26623 - 19968: jis0208<<14 | 0x12<<7 | 0x20, 26625 - 19968: jis0208<<14 | 0x59<<7 | 0x2A, 26626 - 19968: jis0208<<14 | 0x23<<7 | 0x2D, 26627 - 19968: jis0208<<14 | 0x25<<7 | 0x29, 26628 - 19968: jis0208<<14 | 0x10<<7 | 0x28, 26643 - 19968: jis0208<<14 | 0x1F<<7 | 0x51, 26644 - 19968: jis0212<<14 | 0x22<<7 | 0x29, 26646 - 19968: jis0208<<14 | 0x1F<<7 | 0x13, 26647 - 19968: jis0208<<14 | 0x16<<7 | 0x09, 26649 - 19968: jis0212<<14 | 0x22<<7 | 0x2A, 26653 - 19968: jis0212<<14 | 0x22<<7 | 0x2B, 26654 - 19968: jis0208<<14 | 0x3A<<7 | 0x38, 26655 - 19968: jis0212<<14 | 0x22<<7 | 0x2C, 26657 - 19968: jis0208<<14 | 0x18<<7 | 0x1A, 26658 - 19968: jis0208<<14 | 0x12<<7 | 0x5B, 26663 - 19968: jis0212<<14 | 0x22<<7 | 0x2E, 26664 - 19968: jis0212<<14 | 0x22<<7 | 0x2D, 26665 - 19968: jis0208<<14 | 0x3A<<7 | 0x3A, 26666 - 19968: jis0208<<14 | 0x12<<7 | 0x53, 26667 - 19968: jis0208<<14 | 0x3A<<7 | 0x40, 26668 - 19968: jis0212<<14 | 0x22<<7 | 0x2F, 26669 - 19968: jis0212<<14 | 0x22<<7 | 0x30, 26671 - 19968: jis0212<<14 | 0x22<<7 | 0x31, 26672 - 19968: jis0212<<14 | 0x22<<7 | 0x32, 26673 - 19968: jis0212<<14 | 0x22<<7 | 0x33, 26674 - 19968: jis0208<<14 | 0x3A<<7 | 0x3D, 26675 - 19968: jis0212<<14 | 0x22<<7 | 0x34, 26676 - 19968: jis0208<<14 | 0x1F<<7 | 0x52, 26680 - 19968: jis0208<<14 | 0x12<<7 | 0x2A, 26681 - 19968: jis0208<<14 | 0x19<<7 | 0x0B, 26683 - 19968: jis0212<<14 | 0x22<<7 | 0x35, 26684 - 19968: jis0208<<14 | 0x12<<7 | 0x29, 26685 - 19968: jis0208<<14 | 0x19<<7 | 0x2E, 26687 - 19968: jis0212<<14 | 0x22<<7 | 0x36, 26688 - 19968: jis0208<<14 | 0x3A<<7 | 0x3B, 26689 - 19968: jis0208<<14 | 0x16<<7 | 0x44, 26690 - 19968: jis0208<<14 | 0x16<<7 | 0x2A, 26691 - 19968: jis0208<<14 | 0x24<<7 | 0x4C, 26692 - 19968: jis0208<<14 | 0x59<<7 | 0x2B, 26693 - 19968: jis0212<<14 | 0x22<<7 | 0x38, 26694 - 19968: jis0208<<14 | 0x3A<<7 | 0x39, 26696 - 19968: jis0208<<14 | 0x0F<<7 | 0x25, 26698 - 19968: jis0212<<14 | 0x22<<7 | 0x39, 26700 - 19968: jis0212<<14 | 0x22<<7 | 0x3A, 26701 - 19968: jis0208<<14 | 0x3A<<7 | 0x3C, 26702 - 19968: jis0208<<14 | 0x3A<<7 | 0x3E, 26704 - 19968: jis0208<<14 | 0x15<<7 | 0x2C, 26705 - 19968: jis0208<<14 | 0x16<<7 | 0x0B, 26706 - 19968: jis0208<<14 | 0x59<<7 | 0x28, 26707 - 19968: jis0208<<14 | 0x13<<7 | 0x1B, 26708 - 19968: jis0208<<14 | 0x14<<7 | 0x2A, 26709 - 19968: jis0212<<14 | 0x22<<7 | 0x3B, 26711 - 19968: jis0212<<14 | 0x22<<7 | 0x3C, 26712 - 19968: jis0212<<14 | 0x22<<7 | 0x3D, 26713 - 19968: jis0208<<14 | 0x3A<<7 | 0x41, 26715 - 19968: jis0212<<14 | 0x22<<7 | 0x3E, 26716 - 19968: jis0208<<14 | 0x19<<7 | 0x58, 26717 - 19968: jis0208<<14 | 0x2A<<7 | 0x50, 26719 - 19968: jis0208<<14 | 0x1A<<7 | 0x16, 26723 - 19968: jis0208<<14 | 0x3A<<7 | 0x42, 26727 - 19968: jis0208<<14 | 0x28<<7 | 0x0F, 26731 - 19968: jis0212<<14 | 0x22<<7 | 0x3F, 26734 - 19968: jis0212<<14 | 0x22<<7 | 0x40, 26735 - 19968: jis0212<<14 | 0x22<<7 | 0x41, 26736 - 19968: jis0212<<14 | 0x22<<7 | 0x42, 26737 - 19968: jis0212<<14 | 0x22<<7 | 0x43, 26738 - 19968: jis0212<<14 | 0x22<<7 | 0x44, 26740 - 19968: jis0208<<14 | 0x3A<<7 | 0x4E, 26741 - 19968: jis0212<<14 | 0x22<<7 | 0x45, 26742 - 19968: jis0208<<14 | 0x11<<7 | 0x12, 26743 - 19968: jis0208<<14 | 0x3A<<7 | 0x43, 26745 - 19968: jis0212<<14 | 0x22<<7 | 0x46, 26746 - 19968: jis0212<<14 | 0x22<<7 | 0x47, 26747 - 19968: jis0212<<14 | 0x22<<7 | 0x48, 26748 - 19968: jis0212<<14 | 0x22<<7 | 0x49, 26750 - 19968: jis0208<<14 | 0x3A<<7 | 0x54, 26751 - 19968: jis0208<<14 | 0x3A<<7 | 0x44, 26753 - 19968: jis0208<<14 | 0x2D<<7 | 0x21, 26754 - 19968: jis0212<<14 | 0x22<<7 | 0x4A, 26755 - 19968: jis0208<<14 | 0x3A<<7 | 0x4B, 26756 - 19968: jis0212<<14 | 0x22<<7 | 0x4B, 26757 - 19968: jis0208<<14 | 0x26<<7 | 0x3E, 26758 - 19968: jis0212<<14 | 0x22<<7 | 0x4C, 26760 - 19968: jis0212<<14 | 0x22<<7 | 0x4D, 26765 - 19968: jis0208<<14 | 0x3A<<7 | 0x53, 26767 - 19968: jis0208<<14 | 0x3A<<7 | 0x46, 26771 - 19968: jis0208<<14 | 0x0F<<7 | 0x13, 26772 - 19968: jis0208<<14 | 0x3A<<7 | 0x48, 26774 - 19968: jis0212<<14 | 0x22<<7 | 0x4E, 26775 - 19968: jis0208<<14 | 0x18<<7 | 0x1B, 26776 - 19968: jis0212<<14 | 0x22<<7 | 0x4F, 26778 - 19968: jis0212<<14 | 0x22<<7 | 0x50, 26779 - 19968: jis0208<<14 | 0x3A<<7 | 0x4A, 26780 - 19968: jis0212<<14 | 0x22<<7 | 0x51, 26781 - 19968: jis0208<<14 | 0x3A<<7 | 0x49, 26783 - 19968: jis0208<<14 | 0x3A<<7 | 0x45, 26784 - 19968: jis0208<<14 | 0x3A<<7 | 0x50, 26785 - 19968: jis0212<<14 | 0x22<<7 | 0x52, 26786 - 19968: jis0208<<14 | 0x1D<<7 | 0x1E, 26787 - 19968: jis0212<<14 | 0x22<<7 | 0x53, 26789 - 19968: jis0212<<14 | 0x22<<7 | 0x54, 26790 - 19968: jis0208<<14 | 0x33<<7 | 0x4C, 26791 - 19968: jis0208<<14 | 0x17<<7 | 0x47, 26792 - 19968: jis0208<<14 | 0x2C<<7 | 0x5B, 26793 - 19968: jis0212<<14 | 0x22<<7 | 0x55, 26794 - 19968: jis0212<<14 | 0x22<<7 | 0x56, 26797 - 19968: jis0208<<14 | 0x3A<<7 | 0x47, 26798 - 19968: jis0212<<14 | 0x22<<7 | 0x57, 26799 - 19968: jis0208<<14 | 0x23<<7 | 0x53, 26800 - 19968: jis0208<<14 | 0x12<<7 | 0x02, 26801 - 19968: jis0208<<14 | 0x19<<7 | 0x0C, 26802 - 19968: jis0212<<14 | 0x22<<7 | 0x58, 26803 - 19968: jis0208<<14 | 0x3A<<7 | 0x3F, 26805 - 19968: jis0208<<14 | 0x3A<<7 | 0x4F, 26806 - 19968: jis0208<<14 | 0x12<<7 | 0x40, 26809 - 19968: jis0208<<14 | 0x3A<<7 | 0x4D, 26810 - 19968: jis0208<<14 | 0x3A<<7 | 0x51, 26811 - 19968: jis0212<<14 | 0x22<<7 | 0x59, 26812 - 19968: jis0208<<14 | 0x24<<7 | 0x4D, 26820 - 19968: jis0208<<14 | 0x13<<7 | 0x5D, 26821 - 19968: jis0212<<14 | 0x22<<7 | 0x5A, 26822 - 19968: jis0208<<14 | 0x3B<<7 | 0x11, 26824 - 19968: jis0208<<14 | 0x58<<7 | 0x08, 26825 - 19968: jis0208<<14 | 0x2B<<7 | 0x28, 26826 - 19968: jis0208<<14 | 0x3A<<7 | 0x56, 26827 - 19968: jis0208<<14 | 0x13<<7 | 0x5C, 26828 - 19968: jis0212<<14 | 0x22<<7 | 0x5C, 26829 - 19968: jis0208<<14 | 0x3A<<7 | 0x5D, 26831 - 19968: jis0208<<14 | 0x59<<7 | 0x2C, 26832 - 19968: jis0212<<14 | 0x23<<7 | 0x00, 26833 - 19968: jis0212<<14 | 0x23<<7 | 0x01, 26834 - 19968: jis0208<<14 | 0x2A<<7 | 0x1F, 26835 - 19968: jis0212<<14 | 0x23<<7 | 0x02, 26836 - 19968: jis0208<<14 | 0x3B<<7 | 0x00, 26837 - 19968: jis0208<<14 | 0x3B<<7 | 0x02, 26838 - 19968: jis0212<<14 | 0x23<<7 | 0x03, 26839 - 19968: jis0208<<14 | 0x3B<<7 | 0x06, 26840 - 19968: jis0208<<14 | 0x3A<<7 | 0x58, 26841 - 19968: jis0212<<14 | 0x23<<7 | 0x04, 26842 - 19968: jis0208<<14 | 0x22<<7 | 0x09, 26844 - 19968: jis0212<<14 | 0x23<<7 | 0x05, 26845 - 19968: jis0212<<14 | 0x23<<7 | 0x06, 26847 - 19968: jis0208<<14 | 0x24<<7 | 0x4E, 26848 - 19968: jis0208<<14 | 0x3B<<7 | 0x0A, 26849 - 19968: jis0208<<14 | 0x3A<<7 | 0x5B, 26851 - 19968: jis0208<<14 | 0x3B<<7 | 0x07, 26853 - 19968: jis0212<<14 | 0x23<<7 | 0x07, 26855 - 19968: jis0208<<14 | 0x3B<<7 | 0x01, 26856 - 19968: jis0212<<14 | 0x23<<7 | 0x08, 26858 - 19968: jis0212<<14 | 0x23<<7 | 0x09, 26859 - 19968: jis0212<<14 | 0x23<<7 | 0x0A, 26860 - 19968: jis0212<<14 | 0x23<<7 | 0x0B, 26861 - 19968: jis0212<<14 | 0x23<<7 | 0x0C, 26862 - 19968: jis0208<<14 | 0x1E<<7 | 0x18, 26863 - 19968: jis0208<<14 | 0x3B<<7 | 0x0B, 26864 - 19968: jis0212<<14 | 0x23<<7 | 0x0D, 26865 - 19968: jis0212<<14 | 0x23<<7 | 0x0E, 26866 - 19968: jis0208<<14 | 0x1F<<7 | 0x12, 26869 - 19968: jis0212<<14 | 0x23<<7 | 0x0F, 26870 - 19968: jis0212<<14 | 0x23<<7 | 0x10, 26873 - 19968: jis0208<<14 | 0x3B<<7 | 0x09, 26874 - 19968: jis0208<<14 | 0x13<<7 | 0x1C, 26875 - 19968: jis0212<<14 | 0x23<<7 | 0x11, 26876 - 19968: jis0212<<14 | 0x23<<7 | 0x12, 26877 - 19968: jis0212<<14 | 0x23<<7 | 0x13, 26880 - 19968: jis0208<<14 | 0x2E<<7 | 0x2F, 26881 - 19968: jis0208<<14 | 0x3A<<7 | 0x55, 26884 - 19968: jis0208<<14 | 0x3B<<7 | 0x05, 26885 - 19968: jis0208<<14 | 0x0F<<7 | 0x37, 26886 - 19968: jis0212<<14 | 0x23<<7 | 0x14, 26888 - 19968: jis0208<<14 | 0x3A<<7 | 0x57, 26889 - 19968: jis0212<<14 | 0x23<<7 | 0x15, 26890 - 19968: jis0212<<14 | 0x23<<7 | 0x16, 26891 - 19968: jis0208<<14 | 0x2B<<7 | 0x19, 26892 - 19968: jis0208<<14 | 0x3A<<7 | 0x5C, 26893 - 19968: jis0208<<14 | 0x1E<<7 | 0x01, 26894 - 19968: jis0208<<14 | 0x23<<7 | 0x26, 26895 - 19968: jis0208<<14 | 0x3A<<7 | 0x52, 26896 - 19968: jis0212<<14 | 0x23<<7 | 0x17, 26897 - 19968: jis0212<<14 | 0x23<<7 | 0x18, 26898 - 19968: jis0208<<14 | 0x3B<<7 | 0x04, 26899 - 19968: jis0212<<14 | 0x23<<7 | 0x19, 26902 - 19968: jis0212<<14 | 0x23<<7 | 0x1A, 26903 - 19968: jis0212<<14 | 0x23<<7 | 0x1B, 26905 - 19968: jis0208<<14 | 0x1E<<7 | 0x59, 26906 - 19968: jis0208<<14 | 0x3B<<7 | 0x0E, 26907 - 19968: jis0208<<14 | 0x12<<7 | 0x50, 26908 - 19968: jis0208<<14 | 0x17<<7 | 0x00, 26913 - 19968: jis0208<<14 | 0x3B<<7 | 0x10, 26914 - 19968: jis0208<<14 | 0x3A<<7 | 0x59, 26915 - 19968: jis0208<<14 | 0x3B<<7 | 0x0F, 26917 - 19968: jis0208<<14 | 0x3B<<7 | 0x08, 26918 - 19968: jis0208<<14 | 0x3A<<7 | 0x5A, 26920 - 19968: jis0208<<14 | 0x3B<<7 | 0x0C, 26922 - 19968: jis0208<<14 | 0x3B<<7 | 0x0D, 26928 - 19968: jis0208<<14 | 0x3B<<7 | 0x1E, 26929 - 19968: jis0212<<14 | 0x23<<7 | 0x1C, 26931 - 19968: jis0212<<14 | 0x23<<7 | 0x1D, 26932 - 19968: jis0208<<14 | 0x25<<7 | 0x2D, 26933 - 19968: jis0212<<14 | 0x23<<7 | 0x1E, 26934 - 19968: jis0208<<14 | 0x3B<<7 | 0x03, 26936 - 19968: jis0212<<14 | 0x23<<7 | 0x1F, 26937 - 19968: jis0208<<14 | 0x3B<<7 | 0x1A, 26939 - 19968: jis0212<<14 | 0x23<<7 | 0x20, 26941 - 19968: jis0208<<14 | 0x3B<<7 | 0x1C, 26943 - 19968: jis0208<<14 | 0x23<<7 | 0x37, 26946 - 19968: jis0212<<14 | 0x23<<7 | 0x21, 26949 - 19968: jis0212<<14 | 0x23<<7 | 0x22, 26953 - 19968: jis0212<<14 | 0x23<<7 | 0x23, 26954 - 19968: jis0208<<14 | 0x2C<<7 | 0x2B, 26958 - 19968: jis0212<<14 | 0x23<<7 | 0x24, 26963 - 19968: jis0208<<14 | 0x28<<7 | 0x55, 26964 - 19968: jis0208<<14 | 0x3B<<7 | 0x17, 26965 - 19968: jis0208<<14 | 0x21<<7 | 0x29, 26967 - 19968: jis0212<<14 | 0x23<<7 | 0x25, 26969 - 19968: jis0208<<14 | 0x3B<<7 | 0x1D, 26970 - 19968: jis0208<<14 | 0x20<<7 | 0x1E, 26971 - 19968: jis0212<<14 | 0x23<<7 | 0x26, 26972 - 19968: jis0208<<14 | 0x3B<<7 | 0x14, 26973 - 19968: jis0208<<14 | 0x3B<<7 | 0x21, 26974 - 19968: jis0208<<14 | 0x3B<<7 | 0x20, 26976 - 19968: jis0208<<14 | 0x25<<7 | 0x4E, 26977 - 19968: jis0208<<14 | 0x3B<<7 | 0x1F, 26978 - 19968: jis0208<<14 | 0x25<<7 | 0x49, 26979 - 19968: jis0212<<14 | 0x23<<7 | 0x27, 26980 - 19968: jis0212<<14 | 0x23<<7 | 0x28, 26981 - 19968: jis0212<<14 | 0x23<<7 | 0x29, 26982 - 19968: jis0212<<14 | 0x23<<7 | 0x2A, 26984 - 19968: jis0208<<14 | 0x59<<7 | 0x2E, 26985 - 19968: jis0212<<14 | 0x23<<7 | 0x2C, 26986 - 19968: jis0208<<14 | 0x3B<<7 | 0x23, 26987 - 19968: jis0208<<14 | 0x3B<<7 | 0x16, 26988 - 19968: jis0212<<14 | 0x23<<7 | 0x2D, 26989 - 19968: jis0208<<14 | 0x15<<7 | 0x27, 26990 - 19968: jis0208<<14 | 0x3B<<7 | 0x19, 26991 - 19968: jis0208<<14 | 0x1C<<7 | 0x3C, 26992 - 19968: jis0212<<14 | 0x23<<7 | 0x2E, 26993 - 19968: jis0212<<14 | 0x23<<7 | 0x2F, 26994 - 19968: jis0212<<14 | 0x23<<7 | 0x30, 26995 - 19968: jis0208<<14 | 0x26<<7 | 0x3F, 26996 - 19968: jis0208<<14 | 0x3B<<7 | 0x1B, 26997 - 19968: jis0208<<14 | 0x15<<7 | 0x2A, 26999 - 19968: jis0208<<14 | 0x3B<<7 | 0x13, 27000 - 19968: jis0208<<14 | 0x3B<<7 | 0x15, 27001 - 19968: jis0208<<14 | 0x3B<<7 | 0x12, 27002 - 19968: jis0212<<14 | 0x23<<7 | 0x31, 27003 - 19968: jis0212<<14 | 0x23<<7 | 0x32, 27004 - 19968: jis0208<<14 | 0x2E<<7 | 0x0F, 27005 - 19968: jis0208<<14 | 0x12<<7 | 0x39, 27006 - 19968: jis0208<<14 | 0x3B<<7 | 0x18, 27007 - 19968: jis0212<<14 | 0x23<<7 | 0x33, 27008 - 19968: jis0212<<14 | 0x23<<7 | 0x34, 27009 - 19968: jis0208<<14 | 0x3B<<7 | 0x22, 27010 - 19968: jis0208<<14 | 0x12<<7 | 0x14, 27018 - 19968: jis0208<<14 | 0x19<<7 | 0x46, 27021 - 19968: jis0212<<14 | 0x23<<7 | 0x35, 27022 - 19968: jis0208<<14 | 0x10<<7 | 0x3C, 27025 - 19968: jis0208<<14 | 0x3B<<7 | 0x33, 27026 - 19968: jis0212<<14 | 0x23<<7 | 0x36, 27028 - 19968: jis0208<<14 | 0x2E<<7 | 0x10, 27029 - 19968: jis0208<<14 | 0x3B<<7 | 0x36, 27030 - 19968: jis0212<<14 | 0x23<<7 | 0x37, 27032 - 19968: jis0208<<14 | 0x59<<7 | 0x30, 27035 - 19968: jis0208<<14 | 0x1E<<7 | 0x19, 27036 - 19968: jis0208<<14 | 0x3B<<7 | 0x35, 27040 - 19968: jis0208<<14 | 0x3B<<7 | 0x34, 27041 - 19968: jis0212<<14 | 0x23<<7 | 0x39, 27045 - 19968: jis0212<<14 | 0x23<<7 | 0x3A, 27046 - 19968: jis0212<<14 | 0x23<<7 | 0x3B, 27047 - 19968: jis0208<<14 | 0x3B<<7 | 0x31, 27048 - 19968: jis0212<<14 | 0x23<<7 | 0x3C, 27051 - 19968: jis0212<<14 | 0x23<<7 | 0x3D, 27053 - 19968: jis0212<<14 | 0x23<<7 | 0x3E, 27054 - 19968: jis0208<<14 | 0x3B<<7 | 0x25, 27055 - 19968: jis0212<<14 | 0x23<<7 | 0x3F, 27057 - 19968: jis0208<<14 | 0x3B<<7 | 0x42, 27058 - 19968: jis0208<<14 | 0x3B<<7 | 0x24, 27060 - 19968: jis0208<<14 | 0x3B<<7 | 0x37, 27063 - 19968: jis0212<<14 | 0x23<<7 | 0x40, 27064 - 19968: jis0212<<14 | 0x23<<7 | 0x41, 27066 - 19968: jis0212<<14 | 0x23<<7 | 0x42, 27067 - 19968: jis0208<<14 | 0x3B<<7 | 0x2F, 27068 - 19968: jis0212<<14 | 0x23<<7 | 0x43, 27070 - 19968: jis0208<<14 | 0x3B<<7 | 0x2A, 27071 - 19968: jis0208<<14 | 0x3B<<7 | 0x27, 27073 - 19968: jis0208<<14 | 0x3B<<7 | 0x28, 27075 - 19968: jis0208<<14 | 0x3B<<7 | 0x30, 27077 - 19968: jis0212<<14 | 0x23<<7 | 0x44, 27079 - 19968: jis0208<<14 | 0x53<<7 | 0x01, 27080 - 19968: jis0212<<14 | 0x23<<7 | 0x45, 27082 - 19968: jis0208<<14 | 0x3B<<7 | 0x2D, 27083 - 19968: jis0208<<14 | 0x18<<7 | 0x1C, 27084 - 19968: jis0208<<14 | 0x23<<7 | 0x27, 27085 - 19968: jis0208<<14 | 0x20<<7 | 0x43, 27086 - 19968: jis0208<<14 | 0x3B<<7 | 0x2B, 27088 - 19968: jis0208<<14 | 0x3B<<7 | 0x26, 27089 - 19968: jis0212<<14 | 0x23<<7 | 0x46, 27091 - 19968: jis0208<<14 | 0x3B<<7 | 0x29, 27094 - 19968: jis0212<<14 | 0x23<<7 | 0x47, 27095 - 19968: jis0212<<14 | 0x23<<7 | 0x48, 27096 - 19968: jis0208<<14 | 0x2C<<7 | 0x2C, 27097 - 19968: jis0208<<14 | 0x2A<<7 | 0x49, 27101 - 19968: jis0208<<14 | 0x3B<<7 | 0x2E, 27102 - 19968: jis0208<<14 | 0x3B<<7 | 0x38, 27106 - 19968: jis0208<<14 | 0x59<<7 | 0x31, 27109 - 19968: jis0212<<14 | 0x23<<7 | 0x4A, 27111 - 19968: jis0208<<14 | 0x3B<<7 | 0x40, 27112 - 19968: jis0208<<14 | 0x3B<<7 | 0x39, 27115 - 19968: jis0208<<14 | 0x3B<<7 | 0x46, 27117 - 19968: jis0208<<14 | 0x3B<<7 | 0x44, 27118 - 19968: jis0212<<14 | 0x23<<7 | 0x4B, 27119 - 19968: jis0212<<14 | 0x23<<7 | 0x4C, 27121 - 19968: jis0212<<14 | 0x23<<7 | 0x4D, 27122 - 19968: jis0208<<14 | 0x3B<<7 | 0x3F, 27123 - 19968: jis0212<<14 | 0x23<<7 | 0x4E, 27125 - 19968: jis0212<<14 | 0x23<<7 | 0x4F, 27129 - 19968: jis0208<<14 | 0x3B<<7 | 0x3E, 27131 - 19968: jis0208<<14 | 0x23<<7 | 0x2F, 27133 - 19968: jis0208<<14 | 0x20<<7 | 0x44, 27134 - 19968: jis0212<<14 | 0x23<<7 | 0x50, 27135 - 19968: jis0208<<14 | 0x3B<<7 | 0x3C, 27136 - 19968: jis0212<<14 | 0x23<<7 | 0x51, 27137 - 19968: jis0212<<14 | 0x23<<7 | 0x52, 27138 - 19968: jis0208<<14 | 0x3B<<7 | 0x3A, 27139 - 19968: jis0212<<14 | 0x23<<7 | 0x53, 27141 - 19968: jis0208<<14 | 0x3B<<7 | 0x41, 27146 - 19968: jis0208<<14 | 0x3B<<7 | 0x47, 27147 - 19968: jis0208<<14 | 0x27<<7 | 0x54, 27148 - 19968: jis0208<<14 | 0x3B<<7 | 0x4D, 27151 - 19968: jis0212<<14 | 0x23<<7 | 0x54, 27153 - 19968: jis0212<<14 | 0x23<<7 | 0x55, 27154 - 19968: jis0208<<14 | 0x3B<<7 | 0x48, 27155 - 19968: jis0208<<14 | 0x3B<<7 | 0x4B, 27156 - 19968: jis0208<<14 | 0x3B<<7 | 0x45, 27157 - 19968: jis0212<<14 | 0x23<<7 | 0x56, 27159 - 19968: jis0208<<14 | 0x22<<7 | 0x53, 27161 - 19968: jis0208<<14 | 0x28<<7 | 0x17, 27162 - 19968: jis0212<<14 | 0x23<<7 | 0x57, 27163 - 19968: jis0208<<14 | 0x3B<<7 | 0x3B, 27165 - 19968: jis0212<<14 | 0x23<<7 | 0x58, 27166 - 19968: jis0208<<14 | 0x3B<<7 | 0x43, 27167 - 19968: jis0208<<14 | 0x1D<<7 | 0x1F, 27168 - 19968: jis0212<<14 | 0x23<<7 | 0x59, 27169 - 19968: jis0208<<14 | 0x2B<<7 | 0x2E, 27170 - 19968: jis0208<<14 | 0x3B<<7 | 0x57, 27171 - 19968: jis0208<<14 | 0x3B<<7 | 0x4A, 27172 - 19968: jis0212<<14 | 0x23<<7 | 0x5A, 27176 - 19968: jis0212<<14 | 0x23<<7 | 0x5B, 27177 - 19968: jis0208<<14 | 0x17<<7 | 0x01, 27178 - 19968: jis0208<<14 | 0x11<<7 | 0x02, 27179 - 19968: jis0208<<14 | 0x12<<7 | 0x3E, 27182 - 19968: jis0208<<14 | 0x3B<<7 | 0x32, 27184 - 19968: jis0208<<14 | 0x59<<7 | 0x32, 27186 - 19968: jis0212<<14 | 0x23<<7 | 0x5D, 27188 - 19968: jis0212<<14 | 0x24<<7 | 0x00, 27189 - 19968: jis0208<<14 | 0x1D<<7 | 0x20, 27190 - 19968: jis0208<<14 | 0x3B<<7 | 0x4F, 27191 - 19968: jis0212<<14 | 0x24<<7 | 0x01, 27192 - 19968: jis0208<<14 | 0x3B<<7 | 0x56, 27193 - 19968: jis0208<<14 | 0x1B<<7 | 0x58, 27194 - 19968: jis0208<<14 | 0x12<<7 | 0x51, 27195 - 19968: jis0212<<14 | 0x24<<7 | 0x02, 27197 - 19968: jis0208<<14 | 0x22<<7 | 0x0D, 27198 - 19968: jis0212<<14 | 0x24<<7 | 0x03, 27199 - 19968: jis0212<<14 | 0x24<<7 | 0x04, 27204 - 19968: jis0208<<14 | 0x3B<<7 | 0x4C, 27205 - 19968: jis0212<<14 | 0x24<<7 | 0x05, 27206 - 19968: jis0208<<14 | 0x59<<7 | 0x34, 27207 - 19968: jis0208<<14 | 0x3B<<7 | 0x51, 27208 - 19968: jis0208<<14 | 0x3B<<7 | 0x55, 27209 - 19968: jis0212<<14 | 0x24<<7 | 0x07, 27210 - 19968: jis0212<<14 | 0x24<<7 | 0x08, 27211 - 19968: jis0208<<14 | 0x15<<7 | 0x15, 27214 - 19968: jis0212<<14 | 0x24<<7 | 0x09, 27216 - 19968: jis0212<<14 | 0x24<<7 | 0x0A, 27217 - 19968: jis0212<<14 | 0x24<<7 | 0x0B, 27218 - 19968: jis0212<<14 | 0x24<<7 | 0x0C, 27221 - 19968: jis0212<<14 | 0x24<<7 | 0x0D, 27222 - 19968: jis0212<<14 | 0x24<<7 | 0x0E, 27224 - 19968: jis0208<<14 | 0x14<<7 | 0x2B, 27225 - 19968: jis0208<<14 | 0x3B<<7 | 0x53, 27227 - 19968: jis0212<<14 | 0x24<<7 | 0x0F, 27231 - 19968: jis0208<<14 | 0x14<<7 | 0x00, 27233 - 19968: jis0208<<14 | 0x25<<7 | 0x2A, 27234 - 19968: jis0208<<14 | 0x3B<<7 | 0x52, 27236 - 19968: jis0212<<14 | 0x24<<7 | 0x10, 27238 - 19968: jis0208<<14 | 0x3B<<7 | 0x54, 27239 - 19968: jis0212<<14 | 0x24<<7 | 0x11, 27242 - 19968: jis0212<<14 | 0x24<<7 | 0x12, 27243 - 19968: jis0208<<14 | 0x59<<7 | 0x33, 27249 - 19968: jis0212<<14 | 0x24<<7 | 0x13, 27250 - 19968: jis0208<<14 | 0x3B<<7 | 0x4E, 27251 - 19968: jis0208<<14 | 0x59<<7 | 0x35, 27256 - 19968: jis0208<<14 | 0x3B<<7 | 0x50, 27262 - 19968: jis0208<<14 | 0x59<<7 | 0x36, 27263 - 19968: jis0208<<14 | 0x12<<7 | 0x3F, 27264 - 19968: jis0208<<14 | 0x22<<7 | 0x28, 27265 - 19968: jis0212<<14 | 0x24<<7 | 0x16, 27267 - 19968: jis0212<<14 | 0x24<<7 | 0x17, 27268 - 19968: jis0208<<14 | 0x3B<<7 | 0x5B, 27270 - 19968: jis0212<<14 | 0x24<<7 | 0x18, 27271 - 19968: jis0212<<14 | 0x24<<7 | 0x19, 27273 - 19968: jis0212<<14 | 0x24<<7 | 0x1A, 27275 - 19968: jis0212<<14 | 0x24<<7 | 0x1B, 27277 - 19968: jis0208<<14 | 0x3B<<7 | 0x59, 27278 - 19968: jis0208<<14 | 0x17<<7 | 0x48, 27280 - 19968: jis0208<<14 | 0x3B<<7 | 0x58, 27281 - 19968: jis0212<<14 | 0x24<<7 | 0x1C, 27287 - 19968: jis0208<<14 | 0x3C<<7 | 0x00, 27291 - 19968: jis0212<<14 | 0x24<<7 | 0x1D, 27292 - 19968: jis0208<<14 | 0x3A<<7 | 0x37, 27293 - 19968: jis0212<<14 | 0x24<<7 | 0x1E, 27294 - 19968: jis0212<<14 | 0x24<<7 | 0x1F, 27295 - 19968: jis0212<<14 | 0x24<<7 | 0x20, 27296 - 19968: jis0208<<14 | 0x3B<<7 | 0x5A, 27298 - 19968: jis0208<<14 | 0x3B<<7 | 0x5C, 27299 - 19968: jis0208<<14 | 0x3B<<7 | 0x5D, 27301 - 19968: jis0212<<14 | 0x24<<7 | 0x21, 27306 - 19968: jis0208<<14 | 0x3C<<7 | 0x0B, 27307 - 19968: jis0212<<14 | 0x24<<7 | 0x22, 27308 - 19968: jis0208<<14 | 0x3C<<7 | 0x07, 27310 - 19968: jis0208<<14 | 0x3A<<7 | 0x4C, 27311 - 19968: jis0212<<14 | 0x24<<7 | 0x23, 27312 - 19968: jis0212<<14 | 0x24<<7 | 0x24, 27313 - 19968: jis0212<<14 | 0x24<<7 | 0x25, 27315 - 19968: jis0208<<14 | 0x3C<<7 | 0x06, 27316 - 19968: jis0212<<14 | 0x24<<7 | 0x26, 27320 - 19968: jis0208<<14 | 0x3C<<7 | 0x05, 27323 - 19968: jis0208<<14 | 0x3C<<7 | 0x02, 27325 - 19968: jis0212<<14 | 0x24<<7 | 0x27, 27326 - 19968: jis0212<<14 | 0x24<<7 | 0x28, 27327 - 19968: jis0212<<14 | 0x24<<7 | 0x29, 27329 - 19968: jis0208<<14 | 0x3B<<7 | 0x49, 27330 - 19968: jis0208<<14 | 0x3C<<7 | 0x04, 27331 - 19968: jis0208<<14 | 0x3C<<7 | 0x03, 27334 - 19968: jis0212<<14 | 0x24<<7 | 0x2A, 27336 - 19968: jis0212<<14 | 0x24<<7 | 0x2C, 27337 - 19968: jis0212<<14 | 0x24<<7 | 0x2B, 27340 - 19968: jis0212<<14 | 0x24<<7 | 0x2D, 27344 - 19968: jis0212<<14 | 0x24<<7 | 0x2E, 27345 - 19968: jis0208<<14 | 0x3C<<7 | 0x09, 27347 - 19968: jis0208<<14 | 0x2E<<7 | 0x05, 27348 - 19968: jis0212<<14 | 0x24<<7 | 0x2F, 27349 - 19968: jis0212<<14 | 0x24<<7 | 0x30, 27350 - 19968: jis0212<<14 | 0x24<<7 | 0x31, 27354 - 19968: jis0208<<14 | 0x3C<<7 | 0x0C, 27355 - 19968: jis0208<<14 | 0x15<<7 | 0x5A, 27356 - 19968: jis0212<<14 | 0x24<<7 | 0x32, 27357 - 19968: jis0212<<14 | 0x24<<7 | 0x33, 27358 - 19968: jis0208<<14 | 0x3C<<7 | 0x08, 27359 - 19968: jis0208<<14 | 0x3C<<7 | 0x0A, 27362 - 19968: jis0208<<14 | 0x59<<7 | 0x37, 27364 - 19968: jis0208<<14 | 0x59<<7 | 0x38, 27367 - 19968: jis0212<<14 | 0x24<<7 | 0x35, 27368 - 19968: jis0208<<14 | 0x27<<7 | 0x06, 27370 - 19968: jis0208<<14 | 0x3C<<7 | 0x0D, 27372 - 19968: jis0212<<14 | 0x24<<7 | 0x36, 27376 - 19968: jis0212<<14 | 0x24<<7 | 0x37, 27377 - 19968: jis0212<<14 | 0x24<<7 | 0x38, 27378 - 19968: jis0212<<14 | 0x24<<7 | 0x39, 27386 - 19968: jis0208<<14 | 0x3C<<7 | 0x11, 27387 - 19968: jis0208<<14 | 0x3C<<7 | 0x0E, 27388 - 19968: jis0212<<14 | 0x24<<7 | 0x3A, 27389 - 19968: jis0212<<14 | 0x24<<7 | 0x3B, 27394 - 19968: jis0212<<14 | 0x24<<7 | 0x3C, 27395 - 19968: jis0212<<14 | 0x24<<7 | 0x3D, 27396 - 19968: jis0208<<14 | 0x2C<<7 | 0x52, 27397 - 19968: jis0208<<14 | 0x3C<<7 | 0x0F, 27398 - 19968: jis0212<<14 | 0x24<<7 | 0x3E, 27399 - 19968: jis0212<<14 | 0x24<<7 | 0x3F, 27401 - 19968: jis0212<<14 | 0x24<<7 | 0x40, 27402 - 19968: jis0208<<14 | 0x3B<<7 | 0x3D, 27407 - 19968: jis0212<<14 | 0x24<<7 | 0x41, 27408 - 19968: jis0212<<14 | 0x24<<7 | 0x42, 27409 - 19968: jis0212<<14 | 0x24<<7 | 0x43, 27410 - 19968: jis0208<<14 | 0x3C<<7 | 0x12, 27414 - 19968: jis0208<<14 | 0x3C<<7 | 0x13, 27415 - 19968: jis0212<<14 | 0x24<<7 | 0x44, 27419 - 19968: jis0212<<14 | 0x24<<7 | 0x45, 27421 - 19968: jis0208<<14 | 0x10<<7 | 0x14, 27422 - 19968: jis0212<<14 | 0x24<<7 | 0x46, 27423 - 19968: jis0208<<14 | 0x3C<<7 | 0x15, 27424 - 19968: jis0208<<14 | 0x16<<7 | 0x46, 27425 - 19968: jis0208<<14 | 0x1B<<7 | 0x00, 27427 - 19968: jis0208<<14 | 0x15<<7 | 0x34, 27428 - 19968: jis0212<<14 | 0x24<<7 | 0x47, 27431 - 19968: jis0208<<14 | 0x11<<7 | 0x03, 27432 - 19968: jis0212<<14 | 0x24<<7 | 0x48, 27435 - 19968: jis0212<<14 | 0x24<<7 | 0x49, 27436 - 19968: jis0212<<14 | 0x24<<7 | 0x4A, 27439 - 19968: jis0212<<14 | 0x24<<7 | 0x4B, 27442 - 19968: jis0208<<14 | 0x2C<<7 | 0x3E, 27445 - 19968: jis0212<<14 | 0x24<<7 | 0x4C, 27446 - 19968: jis0212<<14 | 0x24<<7 | 0x4D, 27447 - 19968: jis0208<<14 | 0x3C<<7 | 0x17, 27448 - 19968: jis0208<<14 | 0x3C<<7 | 0x16, 27449 - 19968: jis0208<<14 | 0x3C<<7 | 0x19, 27450 - 19968: jis0208<<14 | 0x14<<7 | 0x1C, 27451 - 19968: jis0212<<14 | 0x24<<7 | 0x4E, 27453 - 19968: jis0208<<14 | 0x15<<7 | 0x35, 27454 - 19968: jis0208<<14 | 0x13<<7 | 0x1D, 27455 - 19968: jis0212<<14 | 0x24<<7 | 0x4F, 27459 - 19968: jis0208<<14 | 0x3C<<7 | 0x1C, 27462 - 19968: jis0212<<14 | 0x24<<7 | 0x50, 27463 - 19968: jis0208<<14 | 0x3C<<7 | 0x1B, 27465 - 19968: jis0208<<14 | 0x3C<<7 | 0x1D, 27466 - 19968: jis0212<<14 | 0x24<<7 | 0x51, 27468 - 19968: jis0208<<14 | 0x11<<7 | 0x2D, 27469 - 19968: jis0212<<14 | 0x24<<7 | 0x52, 27470 - 19968: jis0208<<14 | 0x22<<7 | 0x16, 27472 - 19968: jis0208<<14 | 0x3C<<7 | 0x1E, 27474 - 19968: jis0212<<14 | 0x24<<7 | 0x53, 27475 - 19968: jis0208<<14 | 0x13<<7 | 0x1E, 27476 - 19968: jis0208<<14 | 0x3C<<7 | 0x20, 27478 - 19968: jis0212<<14 | 0x24<<7 | 0x54, 27480 - 19968: jis0212<<14 | 0x24<<7 | 0x55, 27481 - 19968: jis0208<<14 | 0x3C<<7 | 0x1F, 27483 - 19968: jis0208<<14 | 0x3C<<7 | 0x21, 27485 - 19968: jis0212<<14 | 0x24<<7 | 0x56, 27487 - 19968: jis0208<<14 | 0x3C<<7 | 0x22, 27488 - 19968: jis0212<<14 | 0x24<<7 | 0x57, 27489 - 19968: jis0208<<14 | 0x3C<<7 | 0x23, 27490 - 19968: jis0208<<14 | 0x1A<<7 | 0x3E, 27491 - 19968: jis0208<<14 | 0x1F<<7 | 0x14, 27492 - 19968: jis0208<<14 | 0x19<<7 | 0x00, 27494 - 19968: jis0208<<14 | 0x28<<7 | 0x4F, 27495 - 19968: jis0212<<14 | 0x24<<7 | 0x58, 27497 - 19968: jis0208<<14 | 0x29<<7 | 0x41, 27498 - 19968: jis0208<<14 | 0x2E<<7 | 0x23, 27499 - 19968: jis0212<<14 | 0x24<<7 | 0x59, 27502 - 19968: jis0212<<14 | 0x24<<7 | 0x5A, 27503 - 19968: jis0208<<14 | 0x1A<<7 | 0x54, 27504 - 19968: jis0212<<14 | 0x24<<7 | 0x5B, 27507 - 19968: jis0208<<14 | 0x19<<7 | 0x2F, 27508 - 19968: jis0208<<14 | 0x2D<<7 | 0x51, 27509 - 19968: jis0212<<14 | 0x24<<7 | 0x5C, 27512 - 19968: jis0208<<14 | 0x3C<<7 | 0x24, 27513 - 19968: jis0208<<14 | 0x3C<<7 | 0x25, 27515 - 19968: jis0208<<14 | 0x1A<<7 | 0x3F, 27517 - 19968: jis0212<<14 | 0x24<<7 | 0x5D, 27518 - 19968: jis0212<<14 | 0x25<<7 | 0x00, 27519 - 19968: jis0208<<14 | 0x3C<<7 | 0x26, 27520 - 19968: jis0208<<14 | 0x3C<<7 | 0x27, 27522 - 19968: jis0212<<14 | 0x25<<7 | 0x01, 27523 - 19968: jis0208<<14 | 0x3C<<7 | 0x29, 27524 - 19968: jis0208<<14 | 0x3C<<7 | 0x28, 27525 - 19968: jis0212<<14 | 0x25<<7 | 0x02, 27526 - 19968: jis0208<<14 | 0x2A<<7 | 0x37, 27529 - 19968: jis0208<<14 | 0x1C<<7 | 0x3D, 27530 - 19968: jis0208<<14 | 0x1B<<7 | 0x4B, 27531 - 19968: jis0208<<14 | 0x1A<<7 | 0x23, 27533 - 19968: jis0208<<14 | 0x3C<<7 | 0x2A, 27541 - 19968: jis0208<<14 | 0x3C<<7 | 0x2C, 27542 - 19968: jis0208<<14 | 0x1E<<7 | 0x02, 27543 - 19968: jis0212<<14 | 0x25<<7 | 0x03, 27544 - 19968: jis0208<<14 | 0x3C<<7 | 0x2B, 27547 - 19968: jis0212<<14 | 0x25<<7 | 0x04, 27550 - 19968: jis0208<<14 | 0x3C<<7 | 0x2D, 27551 - 19968: jis0212<<14 | 0x25<<7 | 0x05, 27552 - 19968: jis0212<<14 | 0x25<<7 | 0x06, 27554 - 19968: jis0212<<14 | 0x25<<7 | 0x07, 27555 - 19968: jis0212<<14 | 0x25<<7 | 0x08, 27556 - 19968: jis0208<<14 | 0x3C<<7 | 0x2E, 27560 - 19968: jis0212<<14 | 0x25<<7 | 0x09, 27561 - 19968: jis0212<<14 | 0x25<<7 | 0x0A, 27562 - 19968: jis0208<<14 | 0x3C<<7 | 0x2F, 27563 - 19968: jis0208<<14 | 0x3C<<7 | 0x30, 27564 - 19968: jis0212<<14 | 0x25<<7 | 0x0B, 27565 - 19968: jis0212<<14 | 0x25<<7 | 0x0C, 27566 - 19968: jis0212<<14 | 0x25<<7 | 0x0D, 27567 - 19968: jis0208<<14 | 0x3C<<7 | 0x31, 27568 - 19968: jis0212<<14 | 0x25<<7 | 0x0E, 27569 - 19968: jis0208<<14 | 0x3C<<7 | 0x33, 27570 - 19968: jis0208<<14 | 0x3C<<7 | 0x32, 27571 - 19968: jis0208<<14 | 0x3C<<7 | 0x34, 27572 - 19968: jis0208<<14 | 0x11<<7 | 0x04, 27573 - 19968: jis0208<<14 | 0x22<<7 | 0x29, 27575 - 19968: jis0208<<14 | 0x3C<<7 | 0x35, 27576 - 19968: jis0212<<14 | 0x25<<7 | 0x0F, 27577 - 19968: jis0212<<14 | 0x25<<7 | 0x10, 27578 - 19968: jis0208<<14 | 0x1A<<7 | 0x05, 27579 - 19968: jis0208<<14 | 0x12<<7 | 0x2B, 27580 - 19968: jis0208<<14 | 0x3C<<7 | 0x36, 27581 - 19968: jis0212<<14 | 0x25<<7 | 0x11, 27582 - 19968: jis0212<<14 | 0x25<<7 | 0x12, 27583 - 19968: jis0208<<14 | 0x24<<7 | 0x21, 27584 - 19968: jis0208<<14 | 0x33<<7 | 0x2B, 27587 - 19968: jis0212<<14 | 0x25<<7 | 0x13, 27588 - 19968: jis0212<<14 | 0x25<<7 | 0x14, 27589 - 19968: jis0208<<14 | 0x14<<7 | 0x02, 27590 - 19968: jis0208<<14 | 0x3C<<7 | 0x37, 27593 - 19968: jis0212<<14 | 0x25<<7 | 0x15, 27595 - 19968: jis0208<<14 | 0x3C<<7 | 0x38, 27596 - 19968: jis0212<<14 | 0x25<<7 | 0x16, 27597 - 19968: jis0208<<14 | 0x29<<7 | 0x4B, 27598 - 19968: jis0208<<14 | 0x2A<<7 | 0x47, 27602 - 19968: jis0208<<14 | 0x25<<7 | 0x26, 27603 - 19968: jis0208<<14 | 0x3C<<7 | 0x39, 27604 - 19968: jis0208<<14 | 0x27<<7 | 0x45, 27606 - 19968: jis0208<<14 | 0x59<<7 | 0x39, 27608 - 19968: jis0208<<14 | 0x27<<7 | 0x5A, 27610 - 19968: jis0212<<14 | 0x25<<7 | 0x18, 27611 - 19968: jis0208<<14 | 0x2B<<7 | 0x32, 27615 - 19968: jis0208<<14 | 0x3C<<7 | 0x3A, 27617 - 19968: jis0212<<14 | 0x25<<7 | 0x19, 27619 - 19968: jis0212<<14 | 0x25<<7 | 0x1A, 27622 - 19968: jis0212<<14 | 0x25<<7 | 0x1B, 27623 - 19968: jis0212<<14 | 0x25<<7 | 0x1C, 27627 - 19968: jis0208<<14 | 0x3C<<7 | 0x3C, 27628 - 19968: jis0208<<14 | 0x3C<<7 | 0x3B, 27630 - 19968: jis0212<<14 | 0x25<<7 | 0x1D, 27631 - 19968: jis0208<<14 | 0x3C<<7 | 0x3E, 27633 - 19968: jis0212<<14 | 0x25<<7 | 0x1E, 27635 - 19968: jis0208<<14 | 0x3C<<7 | 0x3D, 27639 - 19968: jis0212<<14 | 0x25<<7 | 0x1F, 27641 - 19968: jis0212<<14 | 0x25<<7 | 0x20, 27647 - 19968: jis0212<<14 | 0x25<<7 | 0x21, 27650 - 19968: jis0212<<14 | 0x25<<7 | 0x22, 27652 - 19968: jis0212<<14 | 0x25<<7 | 0x23, 27653 - 19968: jis0212<<14 | 0x25<<7 | 0x24, 27656 - 19968: jis0208<<14 | 0x3C<<7 | 0x40, 27657 - 19968: jis0212<<14 | 0x25<<7 | 0x25, 27661 - 19968: jis0212<<14 | 0x25<<7 | 0x26, 27662 - 19968: jis0212<<14 | 0x25<<7 | 0x27, 27663 - 19968: jis0208<<14 | 0x1A<<7 | 0x40, 27664 - 19968: jis0212<<14 | 0x25<<7 | 0x28, 27665 - 19968: jis0208<<14 | 0x2B<<7 | 0x10, 27666 - 19968: jis0212<<14 | 0x25<<7 | 0x29, 27667 - 19968: jis0208<<14 | 0x3C<<7 | 0x41, 27668 - 19968: jis0208<<14 | 0x3C<<7 | 0x42, 27671 - 19968: jis0208<<14 | 0x14<<7 | 0x03, 27673 - 19968: jis0212<<14 | 0x25<<7 | 0x2A, 27675 - 19968: jis0208<<14 | 0x3C<<7 | 0x43, 27679 - 19968: jis0212<<14 | 0x25<<7 | 0x2B, 27683 - 19968: jis0208<<14 | 0x3C<<7 | 0x45, 27684 - 19968: jis0208<<14 | 0x3C<<7 | 0x44, 27686 - 19968: jis0212<<14 | 0x25<<7 | 0x2C, 27687 - 19968: jis0212<<14 | 0x25<<7 | 0x2D, 27688 - 19968: jis0212<<14 | 0x25<<7 | 0x2E, 27692 - 19968: jis0212<<14 | 0x25<<7 | 0x2F, 27694 - 19968: jis0212<<14 | 0x25<<7 | 0x30, 27699 - 19968: jis0212<<14 | 0x25<<7 | 0x31, 27700 - 19968: jis0208<<14 | 0x1E<<7 | 0x44, 27701 - 19968: jis0212<<14 | 0x25<<7 | 0x32, 27702 - 19968: jis0212<<14 | 0x25<<7 | 0x33, 27703 - 19968: jis0208<<14 | 0x28<<7 | 0x18, 27704 - 19968: jis0208<<14 | 0x10<<7 | 0x29, 27706 - 19968: jis0212<<14 | 0x25<<7 | 0x34, 27707 - 19968: jis0212<<14 | 0x25<<7 | 0x35, 27710 - 19968: jis0208<<14 | 0x27<<7 | 0x24, 27711 - 19968: jis0208<<14 | 0x59<<7 | 0x3A, 27712 - 19968: jis0208<<14 | 0x23<<7 | 0x54, 27713 - 19968: jis0208<<14 | 0x1C<<7 | 0x20, 27714 - 19968: jis0208<<14 | 0x14<<7 | 0x40, 27722 - 19968: jis0212<<14 | 0x25<<7 | 0x37, 27723 - 19968: jis0212<<14 | 0x25<<7 | 0x38, 27725 - 19968: jis0212<<14 | 0x25<<7 | 0x39, 27726 - 19968: jis0208<<14 | 0x27<<7 | 0x25, 27727 - 19968: jis0212<<14 | 0x25<<7 | 0x3A, 27728 - 19968: jis0208<<14 | 0x1B<<7 | 0x0D, 27730 - 19968: jis0212<<14 | 0x25<<7 | 0x3B, 27732 - 19968: jis0212<<14 | 0x25<<7 | 0x3C, 27733 - 19968: jis0208<<14 | 0x3C<<7 | 0x47, 27735 - 19968: jis0208<<14 | 0x13<<7 | 0x1F, 27737 - 19968: jis0212<<14 | 0x25<<7 | 0x3D, 27738 - 19968: jis0208<<14 | 0x10<<7 | 0x57, 27739 - 19968: jis0212<<14 | 0x25<<7 | 0x3E, 27740 - 19968: jis0208<<14 | 0x59<<7 | 0x3B, 27741 - 19968: jis0208<<14 | 0x25<<7 | 0x51, 27742 - 19968: jis0208<<14 | 0x3C<<7 | 0x46, 27743 - 19968: jis0208<<14 | 0x18<<7 | 0x1D, 27744 - 19968: jis0208<<14 | 0x22<<7 | 0x32, 27746 - 19968: jis0208<<14 | 0x3C<<7 | 0x48, 27751 - 19968: jis0212<<14 | 0x26<<7 | 0x15, 27752 - 19968: jis0208<<14 | 0x3C<<7 | 0x50, 27754 - 19968: jis0208<<14 | 0x3C<<7 | 0x49, 27755 - 19968: jis0212<<14 | 0x25<<7 | 0x40, 27757 - 19968: jis0212<<14 | 0x25<<7 | 0x41, 27759 - 19968: jis0208<<14 | 0x59<<7 | 0x3D, 27760 - 19968: jis0208<<14 | 0x21<<7 | 0x20, 27762 - 19968: jis0208<<14 | 0x14<<7 | 0x41, 27763 - 19968: jis0208<<14 | 0x3C<<7 | 0x51, 27764 - 19968: jis0212<<14 | 0x25<<7 | 0x43, 27766 - 19968: jis0212<<14 | 0x25<<7 | 0x44, 27768 - 19968: jis0212<<14 | 0x25<<7 | 0x45, 27769 - 19968: jis0212<<14 | 0x25<<7 | 0x46, 27770 - 19968: jis0208<<14 | 0x16<<7 | 0x47, 27771 - 19968: jis0212<<14 | 0x25<<7 | 0x47, 27773 - 19968: jis0208<<14 | 0x14<<7 | 0x04, 27774 - 19968: jis0208<<14 | 0x3C<<7 | 0x4F, 27777 - 19968: jis0208<<14 | 0x3C<<7 | 0x4D, 27778 - 19968: jis0208<<14 | 0x3C<<7 | 0x4A, 27779 - 19968: jis0208<<14 | 0x2C<<7 | 0x3F, 27781 - 19968: jis0212<<14 | 0x25<<7 | 0x48, 27782 - 19968: jis0208<<14 | 0x59<<7 | 0x3C, 27783 - 19968: jis0212<<14 | 0x25<<7 | 0x4A, 27784 - 19968: jis0208<<14 | 0x23<<7 | 0x1F, 27785 - 19968: jis0212<<14 | 0x25<<7 | 0x4B, 27788 - 19968: jis0208<<14 | 0x25<<7 | 0x38, 27789 - 19968: jis0208<<14 | 0x3C<<7 | 0x4B, 27792 - 19968: jis0208<<14 | 0x3C<<7 | 0x53, 27794 - 19968: jis0208<<14 | 0x3C<<7 | 0x52, 27795 - 19968: jis0208<<14 | 0x16<<7 | 0x02, 27796 - 19968: jis0212<<14 | 0x25<<7 | 0x4C, 27797 - 19968: jis0212<<14 | 0x25<<7 | 0x4D, 27798 - 19968: jis0208<<14 | 0x11<<7 | 0x0C, 27799 - 19968: jis0212<<14 | 0x25<<7 | 0x4E, 27800 - 19968: jis0212<<14 | 0x25<<7 | 0x4F, 27801 - 19968: jis0208<<14 | 0x19<<7 | 0x1A, 27802 - 19968: jis0208<<14 | 0x3C<<7 | 0x4C, 27803 - 19968: jis0208<<14 | 0x3C<<7 | 0x4E, 27804 - 19968: jis0212<<14 | 0x25<<7 | 0x50, 27807 - 19968: jis0212<<14 | 0x25<<7 | 0x51, 27809 - 19968: jis0208<<14 | 0x2A<<7 | 0x36, 27810 - 19968: jis0208<<14 | 0x21<<7 | 0x53, 27819 - 19968: jis0208<<14 | 0x2A<<7 | 0x56, 27822 - 19968: jis0208<<14 | 0x3C<<7 | 0x5B, 27824 - 19968: jis0212<<14 | 0x25<<7 | 0x52, 27825 - 19968: jis0208<<14 | 0x3C<<7 | 0x5C, 27826 - 19968: jis0212<<14 | 0x25<<7 | 0x53, 27827 - 19968: jis0208<<14 | 0x11<<7 | 0x2E, 27828 - 19968: jis0212<<14 | 0x25<<7 | 0x54, 27832 - 19968: jis0208<<14 | 0x29<<7 | 0x07, 27833 - 19968: jis0208<<14 | 0x2B<<7 | 0x5C, 27834 - 19968: jis0208<<14 | 0x3D<<7 | 0x00, 27835 - 19968: jis0208<<14 | 0x1B<<7 | 0x02, 27836 - 19968: jis0208<<14 | 0x1D<<7 | 0x21, 27837 - 19968: jis0208<<14 | 0x3C<<7 | 0x57, 27838 - 19968: jis0208<<14 | 0x3C<<7 | 0x5D, 27839 - 19968: jis0208<<14 | 0x10<<7 | 0x47, 27841 - 19968: jis0208<<14 | 0x15<<7 | 0x16, 27842 - 19968: jis0212<<14 | 0x25<<7 | 0x55, 27844 - 19968: jis0208<<14 | 0x3C<<7 | 0x54, 27845 - 19968: jis0208<<14 | 0x3C<<7 | 0x59, 27846 - 19968: jis0212<<14 | 0x25<<7 | 0x56, 27849 - 19968: jis0208<<14 | 0x1F<<7 | 0x53, 27850 - 19968: jis0208<<14 | 0x26<<7 | 0x50, 27852 - 19968: jis0208<<14 | 0x27<<7 | 0x46, 27853 - 19968: jis0212<<14 | 0x25<<7 | 0x57, 27855 - 19968: jis0212<<14 | 0x25<<7 | 0x58, 27856 - 19968: jis0212<<14 | 0x25<<7 | 0x59, 27857 - 19968: jis0212<<14 | 0x25<<7 | 0x5A, 27858 - 19968: jis0212<<14 | 0x25<<7 | 0x5B, 27859 - 19968: jis0208<<14 | 0x3C<<7 | 0x56, 27860 - 19968: jis0212<<14 | 0x25<<7 | 0x5C, 27861 - 19968: jis0208<<14 | 0x2A<<7 | 0x00, 27862 - 19968: jis0212<<14 | 0x25<<7 | 0x5D, 27863 - 19968: jis0208<<14 | 0x3C<<7 | 0x58, 27865 - 19968: jis0208<<14 | 0x3D<<7 | 0x03, 27866 - 19968: jis0208<<14 | 0x59<<7 | 0x3E, 27867 - 19968: jis0208<<14 | 0x3D<<7 | 0x01, 27868 - 19968: jis0212<<14 | 0x26<<7 | 0x01, 27869 - 19968: jis0208<<14 | 0x3C<<7 | 0x5A, 27872 - 19968: jis0212<<14 | 0x26<<7 | 0x02, 27873 - 19968: jis0208<<14 | 0x2A<<7 | 0x01, 27874 - 19968: jis0208<<14 | 0x26<<7 | 0x27, 27875 - 19968: jis0208<<14 | 0x14<<7 | 0x42, 27877 - 19968: jis0208<<14 | 0x24<<7 | 0x04, 27879 - 19968: jis0212<<14 | 0x26<<7 | 0x03, 27880 - 19968: jis0208<<14 | 0x22<<7 | 0x4C, 27881 - 19968: jis0212<<14 | 0x26<<7 | 0x04, 27882 - 19968: jis0208<<14 | 0x3D<<7 | 0x04, 27883 - 19968: jis0212<<14 | 0x26<<7 | 0x05, 27884 - 19968: jis0212<<14 | 0x26<<7 | 0x06, 27886 - 19968: jis0212<<14 | 0x26<<7 | 0x07, 27887 - 19968: jis0208<<14 | 0x3D<<7 | 0x02, 27888 - 19968: jis0208<<14 | 0x21<<7 | 0x38, 27889 - 19968: jis0208<<14 | 0x3C<<7 | 0x55, 27890 - 19968: jis0212<<14 | 0x26<<7 | 0x08, 27891 - 19968: jis0208<<14 | 0x10<<7 | 0x2A, 27892 - 19968: jis0212<<14 | 0x26<<7 | 0x09, 27908 - 19968: jis0208<<14 | 0x59<<7 | 0x3F, 27911 - 19968: jis0212<<14 | 0x26<<7 | 0x0B, 27914 - 19968: jis0212<<14 | 0x26<<7 | 0x0C, 27915 - 19968: jis0208<<14 | 0x2C<<7 | 0x2D, 27916 - 19968: jis0208<<14 | 0x3D<<7 | 0x0F, 27918 - 19968: jis0212<<14 | 0x26<<7 | 0x0D, 27919 - 19968: jis0212<<14 | 0x26<<7 | 0x0E, 27921 - 19968: jis0212<<14 | 0x26<<7 | 0x0F, 27922 - 19968: jis0208<<14 | 0x3D<<7 | 0x0E, 27923 - 19968: jis0212<<14 | 0x26<<7 | 0x10, 27927 - 19968: jis0208<<14 | 0x1F<<7 | 0x55, 27929 - 19968: jis0208<<14 | 0x3D<<7 | 0x0B, 27930 - 19968: jis0212<<14 | 0x26<<7 | 0x11, 27931 - 19968: jis0208<<14 | 0x2C<<7 | 0x4B, 27934 - 19968: jis0208<<14 | 0x25<<7 | 0x15, 27935 - 19968: jis0208<<14 | 0x3D<<7 | 0x05, 27941 - 19968: jis0208<<14 | 0x23<<7 | 0x24, 27942 - 19968: jis0212<<14 | 0x26<<7 | 0x12, 27943 - 19968: jis0212<<14 | 0x26<<7 | 0x13, 27944 - 19968: jis0212<<14 | 0x26<<7 | 0x14, 27945 - 19968: jis0208<<14 | 0x10<<7 | 0x2B, 27946 - 19968: jis0208<<14 | 0x18<<7 | 0x1E, 27947 - 19968: jis0208<<14 | 0x3D<<7 | 0x08, 27950 - 19968: jis0212<<14 | 0x26<<7 | 0x16, 27951 - 19968: jis0212<<14 | 0x26<<7 | 0x17, 27953 - 19968: jis0212<<14 | 0x26<<7 | 0x18, 27954 - 19968: jis0208<<14 | 0x1C<<7 | 0x06, 27955 - 19968: jis0208<<14 | 0x3D<<7 | 0x0D, 27957 - 19968: jis0208<<14 | 0x3D<<7 | 0x0C, 27958 - 19968: jis0208<<14 | 0x3D<<7 | 0x07, 27960 - 19968: jis0208<<14 | 0x3D<<7 | 0x0A, 27961 - 19968: jis0212<<14 | 0x26<<7 | 0x19, 27963 - 19968: jis0208<<14 | 0x12<<7 | 0x47, 27964 - 19968: jis0212<<14 | 0x26<<7 | 0x1A, 27965 - 19968: jis0208<<14 | 0x3D<<7 | 0x09, 27966 - 19968: jis0208<<14 | 0x26<<7 | 0x28, 27967 - 19968: jis0212<<14 | 0x26<<7 | 0x1B, 27969 - 19968: jis0208<<14 | 0x2D<<7 | 0x0D, 27972 - 19968: jis0208<<14 | 0x1D<<7 | 0x53, 27973 - 19968: jis0208<<14 | 0x1F<<7 | 0x54, 27991 - 19968: jis0212<<14 | 0x26<<7 | 0x1C, 27993 - 19968: jis0208<<14 | 0x3D<<7 | 0x15, 27994 - 19968: jis0208<<14 | 0x3D<<7 | 0x13, 27996 - 19968: jis0208<<14 | 0x28<<7 | 0x2C, 27998 - 19968: jis0212<<14 | 0x26<<7 | 0x1D, 27999 - 19968: jis0212<<14 | 0x26<<7 | 0x1E, 28001 - 19968: jis0212<<14 | 0x26<<7 | 0x1F, 28003 - 19968: jis0208<<14 | 0x3D<<7 | 0x10, 28004 - 19968: jis0208<<14 | 0x3D<<7 | 0x12, 28005 - 19968: jis0212<<14 | 0x26<<7 | 0x20, 28006 - 19968: jis0208<<14 | 0x10<<7 | 0x19, 28007 - 19968: jis0212<<14 | 0x26<<7 | 0x21, 28009 - 19968: jis0208<<14 | 0x18<<7 | 0x1F, 28010 - 19968: jis0208<<14 | 0x2E<<7 | 0x11, 28012 - 19968: jis0208<<14 | 0x12<<7 | 0x1C, 28014 - 19968: jis0208<<14 | 0x28<<7 | 0x41, 28015 - 19968: jis0208<<14 | 0x59<<7 | 0x41, 28016 - 19968: jis0212<<14 | 0x26<<7 | 0x23, 28020 - 19968: jis0208<<14 | 0x2C<<7 | 0x40, 28023 - 19968: jis0208<<14 | 0x12<<7 | 0x03, 28024 - 19968: jis0208<<14 | 0x1E<<7 | 0x1A, 28025 - 19968: jis0208<<14 | 0x3D<<7 | 0x14, 28028 - 19968: jis0212<<14 | 0x26<<7 | 0x24, 28034 - 19968: jis0212<<14 | 0x26<<7 | 0x25, 28037 - 19968: jis0208<<14 | 0x3D<<7 | 0x19, 28039 - 19968: jis0208<<14 | 0x59<<7 | 0x40, 28040 - 19968: jis0208<<14 | 0x1D<<7 | 0x22, 28044 - 19968: jis0208<<14 | 0x2C<<7 | 0x0F, 28046 - 19968: jis0208<<14 | 0x3D<<7 | 0x16, 28049 - 19968: jis0212<<14 | 0x26<<7 | 0x27, 28050 - 19968: jis0212<<14 | 0x26<<7 | 0x28, 28051 - 19968: jis0208<<14 | 0x3D<<7 | 0x11, 28052 - 19968: jis0212<<14 | 0x26<<7 | 0x29, 28053 - 19968: jis0208<<14 | 0x3D<<7 | 0x17, 28054 - 19968: jis0208<<14 | 0x59<<7 | 0x42, 28055 - 19968: jis0212<<14 | 0x26<<7 | 0x2B, 28056 - 19968: jis0212<<14 | 0x26<<7 | 0x2C, 28057 - 19968: jis0208<<14 | 0x2D<<7 | 0x3D, 28059 - 19968: jis0208<<14 | 0x24<<7 | 0x52, 28060 - 19968: jis0208<<14 | 0x25<<7 | 0x21, 28074 - 19968: jis0212<<14 | 0x26<<7 | 0x2D, 28076 - 19968: jis0208<<14 | 0x59<<7 | 0x43, 28079 - 19968: jis0208<<14 | 0x12<<7 | 0x15, 28082 - 19968: jis0208<<14 | 0x10<<7 | 0x34, 28084 - 19968: jis0212<<14 | 0x26<<7 | 0x2F, 28085 - 19968: jis0208<<14 | 0x3D<<7 | 0x1D, 28087 - 19968: jis0212<<14 | 0x26<<7 | 0x30, 28088 - 19968: jis0208<<14 | 0x3D<<7 | 0x20, 28089 - 19968: jis0212<<14 | 0x26<<7 | 0x31, 28092 - 19968: jis0208<<14 | 0x2D<<7 | 0x22, 28093 - 19968: jis0212<<14 | 0x26<<7 | 0x32, 28095 - 19968: jis0212<<14 | 0x26<<7 | 0x33, 28096 - 19968: jis0208<<14 | 0x2C<<7 | 0x43, 28100 - 19968: jis0212<<14 | 0x26<<7 | 0x34, 28101 - 19968: jis0208<<14 | 0x3D<<7 | 0x27, 28102 - 19968: jis0208<<14 | 0x3D<<7 | 0x21, 28103 - 19968: jis0208<<14 | 0x3D<<7 | 0x1E, 28104 - 19968: jis0212<<14 | 0x26<<7 | 0x35, 28106 - 19968: jis0212<<14 | 0x26<<7 | 0x36, 28107 - 19968: jis0208<<14 | 0x2D<<7 | 0x33, 28108 - 19968: jis0208<<14 | 0x3D<<7 | 0x24, 28110 - 19968: jis0212<<14 | 0x26<<7 | 0x37, 28111 - 19968: jis0208<<14 | 0x59<<7 | 0x44, 28113 - 19968: jis0208<<14 | 0x1C<<7 | 0x29, 28114 - 19968: jis0208<<14 | 0x3D<<7 | 0x26, 28117 - 19968: jis0208<<14 | 0x3D<<7 | 0x2B, 28118 - 19968: jis0212<<14 | 0x26<<7 | 0x39, 28120 - 19968: jis0208<<14 | 0x24<<7 | 0x50, 28121 - 19968: jis0208<<14 | 0x3D<<7 | 0x29, 28123 - 19968: jis0212<<14 | 0x26<<7 | 0x3A, 28125 - 19968: jis0212<<14 | 0x26<<7 | 0x3B, 28126 - 19968: jis0208<<14 | 0x3D<<7 | 0x23, 28127 - 19968: jis0212<<14 | 0x26<<7 | 0x3C, 28128 - 19968: jis0212<<14 | 0x26<<7 | 0x3D, 28129 - 19968: jis0208<<14 | 0x22<<7 | 0x17, 28130 - 19968: jis0212<<14 | 0x26<<7 | 0x3E, 28132 - 19968: jis0208<<14 | 0x3D<<7 | 0x2A, 28133 - 19968: jis0212<<14 | 0x26<<7 | 0x3F, 28134 - 19968: jis0208<<14 | 0x3D<<7 | 0x1F, 28136 - 19968: jis0208<<14 | 0x3D<<7 | 0x25, 28137 - 19968: jis0212<<14 | 0x26<<7 | 0x40, 28138 - 19968: jis0208<<14 | 0x3D<<7 | 0x2C, 28139 - 19968: jis0208<<14 | 0x0F<<7 | 0x5B, 28140 - 19968: jis0208<<14 | 0x3D<<7 | 0x22, 28142 - 19968: jis0208<<14 | 0x3D<<7 | 0x2D, 28143 - 19968: jis0212<<14 | 0x26<<7 | 0x41, 28144 - 19968: jis0212<<14 | 0x26<<7 | 0x42, 28145 - 19968: jis0208<<14 | 0x1E<<7 | 0x1B, 28146 - 19968: jis0208<<14 | 0x59<<7 | 0x46, 28147 - 19968: jis0208<<14 | 0x1C<<7 | 0x3E, 28148 - 19968: jis0212<<14 | 0x26<<7 | 0x43, 28149 - 19968: jis0208<<14 | 0x29<<7 | 0x04, 28150 - 19968: jis0212<<14 | 0x26<<7 | 0x44, 28151 - 19968: jis0208<<14 | 0x19<<7 | 0x0D, 28152 - 19968: jis0208<<14 | 0x59<<7 | 0x45, 28153 - 19968: jis0208<<14 | 0x3D<<7 | 0x1A, 28154 - 19968: jis0208<<14 | 0x3D<<7 | 0x28, 28155 - 19968: jis0208<<14 | 0x24<<7 | 0x19, 28156 - 19968: jis0208<<14 | 0x59<<7 | 0x47, 28160 - 19968: jis0212<<14 | 0x26<<7 | 0x46, 28164 - 19968: jis0212<<14 | 0x26<<7 | 0x47, 28165 - 19968: jis0208<<14 | 0x1F<<7 | 0x15, 28167 - 19968: jis0208<<14 | 0x12<<7 | 0x48, 28168 - 19968: jis0208<<14 | 0x19<<7 | 0x30, 28169 - 19968: jis0208<<14 | 0x1D<<7 | 0x23, 28170 - 19968: jis0208<<14 | 0x3D<<7 | 0x1C, 28171 - 19968: jis0208<<14 | 0x1C<<7 | 0x21, 28179 - 19968: jis0208<<14 | 0x16<<7 | 0x2B, 28181 - 19968: jis0208<<14 | 0x3D<<7 | 0x1B, 28185 - 19968: jis0208<<14 | 0x3D<<7 | 0x31, 28186 - 19968: jis0208<<14 | 0x1C<<7 | 0x4C, 28187 - 19968: jis0208<<14 | 0x17<<7 | 0x19, 28189 - 19968: jis0208<<14 | 0x3D<<7 | 0x40, 28190 - 19968: jis0212<<14 | 0x26<<7 | 0x48, 28191 - 19968: jis0208<<14 | 0x3D<<7 | 0x3A, 28192 - 19968: jis0208<<14 | 0x14<<7 | 0x53, 28193 - 19968: jis0208<<14 | 0x24<<7 | 0x2E, 28194 - 19968: jis0212<<14 | 0x26<<7 | 0x49, 28195 - 19968: jis0208<<14 | 0x3D<<7 | 0x35, 28196 - 19968: jis0208<<14 | 0x3D<<7 | 0x3E, 28197 - 19968: jis0208<<14 | 0x0F<<7 | 0x0E, 28198 - 19968: jis0208<<14 | 0x10<<7 | 0x11, 28199 - 19968: jis0208<<14 | 0x59<<7 | 0x4A, 28201 - 19968: jis0208<<14 | 0x11<<7 | 0x18, 28203 - 19968: jis0208<<14 | 0x3D<<7 | 0x37, 28204 - 19968: jis0208<<14 | 0x21<<7 | 0x0B, 28205 - 19968: jis0208<<14 | 0x3D<<7 | 0x2E, 28206 - 19968: jis0208<<14 | 0x3D<<7 | 0x30, 28207 - 19968: jis0208<<14 | 0x18<<7 | 0x20, 28210 - 19968: jis0212<<14 | 0x26<<7 | 0x4B, 28214 - 19968: jis0212<<14 | 0x26<<7 | 0x4C, 28216 - 19968: jis0208<<14 | 0x3D<<7 | 0x41, 28217 - 19968: jis0208<<14 | 0x59<<7 | 0x48, 28218 - 19968: jis0208<<14 | 0x3D<<7 | 0x3C, 28219 - 19968: jis0212<<14 | 0x26<<7 | 0x4E, 28220 - 19968: jis0208<<14 | 0x59<<7 | 0x4B, 28222 - 19968: jis0208<<14 | 0x3D<<7 | 0x34, 28227 - 19968: jis0208<<14 | 0x3D<<7 | 0x3B, 28228 - 19968: jis0212<<14 | 0x26<<7 | 0x50, 28229 - 19968: jis0212<<14 | 0x26<<7 | 0x51, 28232 - 19968: jis0212<<14 | 0x26<<7 | 0x52, 28233 - 19968: jis0212<<14 | 0x26<<7 | 0x53, 28234 - 19968: jis0208<<14 | 0x2B<<7 | 0x0A, 28235 - 19968: jis0212<<14 | 0x26<<7 | 0x54, 28237 - 19968: jis0208<<14 | 0x3D<<7 | 0x39, 28238 - 19968: jis0208<<14 | 0x3D<<7 | 0x3D, 28239 - 19968: jis0212<<14 | 0x26<<7 | 0x55, 28241 - 19968: jis0212<<14 | 0x26<<7 | 0x56, 28242 - 19968: jis0212<<14 | 0x26<<7 | 0x57, 28243 - 19968: jis0212<<14 | 0x26<<7 | 0x58, 28244 - 19968: jis0212<<14 | 0x26<<7 | 0x59, 28246 - 19968: jis0208<<14 | 0x17<<7 | 0x2F, 28247 - 19968: jis0212<<14 | 0x26<<7 | 0x5A, 28248 - 19968: jis0208<<14 | 0x1D<<7 | 0x24, 28251 - 19968: jis0208<<14 | 0x22<<7 | 0x18, 28252 - 19968: jis0208<<14 | 0x59<<7 | 0x49, 28253 - 19968: jis0212<<14 | 0x26<<7 | 0x5C, 28254 - 19968: jis0212<<14 | 0x26<<7 | 0x5D, 28255 - 19968: jis0208<<14 | 0x3D<<7 | 0x33, 28258 - 19968: jis0212<<14 | 0x27<<7 | 0x00, 28259 - 19968: jis0212<<14 | 0x27<<7 | 0x01, 28263 - 19968: jis0208<<14 | 0x2C<<7 | 0x0E, 28264 - 19968: jis0212<<14 | 0x27<<7 | 0x02, 28267 - 19968: jis0208<<14 | 0x3D<<7 | 0x36, 28270 - 19968: jis0208<<14 | 0x3D<<7 | 0x2F, 28271 - 19968: jis0208<<14 | 0x24<<7 | 0x51, 28274 - 19968: jis0208<<14 | 0x3D<<7 | 0x32, 28275 - 19968: jis0212<<14 | 0x27<<7 | 0x03, 28278 - 19968: jis0208<<14 | 0x3D<<7 | 0x38, 28283 - 19968: jis0212<<14 | 0x27<<7 | 0x04, 28285 - 19968: jis0212<<14 | 0x27<<7 | 0x05, 28286 - 19968: jis0208<<14 | 0x2E<<7 | 0x30, 28287 - 19968: jis0208<<14 | 0x1B<<7 | 0x1D, 28288 - 19968: jis0208<<14 | 0x2A<<7 | 0x5D, 28290 - 19968: jis0208<<14 | 0x3D<<7 | 0x42, 28300 - 19968: jis0208<<14 | 0x27<<7 | 0x0D, 28301 - 19968: jis0212<<14 | 0x27<<7 | 0x06, 28303 - 19968: jis0208<<14 | 0x3D<<7 | 0x4E, 28304 - 19968: jis0208<<14 | 0x17<<7 | 0x1A, 28307 - 19968: jis0212<<14 | 0x27<<7 | 0x07, 28310 - 19968: jis0208<<14 | 0x1C<<7 | 0x3F, 28312 - 19968: jis0208<<14 | 0x3D<<7 | 0x44, 28313 - 19968: jis0212<<14 | 0x27<<7 | 0x08, 28316 - 19968: jis0208<<14 | 0x2D<<7 | 0x0E, 28317 - 19968: jis0208<<14 | 0x18<<7 | 0x21, 28319 - 19968: jis0208<<14 | 0x3D<<7 | 0x51, 28320 - 19968: jis0212<<14 | 0x27<<7 | 0x09, 28322 - 19968: jis0208<<14 | 0x0F<<7 | 0x4D, 28325 - 19968: jis0208<<14 | 0x3D<<7 | 0x4F, 28327 - 19968: jis0212<<14 | 0x27<<7 | 0x0A, 28330 - 19968: jis0208<<14 | 0x3D<<7 | 0x43, 28333 - 19968: jis0212<<14 | 0x27<<7 | 0x0B, 28334 - 19968: jis0212<<14 | 0x27<<7 | 0x0C, 28335 - 19968: jis0208<<14 | 0x3D<<7 | 0x49, 28337 - 19968: jis0212<<14 | 0x27<<7 | 0x0D, 28338 - 19968: jis0208<<14 | 0x3D<<7 | 0x4B, 28339 - 19968: jis0212<<14 | 0x27<<7 | 0x0E, 28342 - 19968: jis0208<<14 | 0x2C<<7 | 0x2E, 28343 - 19968: jis0208<<14 | 0x3D<<7 | 0x46, 28346 - 19968: jis0208<<14 | 0x24<<7 | 0x0D, 28347 - 19968: jis0212<<14 | 0x27<<7 | 0x0F, 28349 - 19968: jis0208<<14 | 0x3D<<7 | 0x48, 28351 - 19968: jis0208<<14 | 0x59<<7 | 0x4C, 28352 - 19968: jis0212<<14 | 0x27<<7 | 0x11, 28353 - 19968: jis0212<<14 | 0x27<<7 | 0x12, 28354 - 19968: jis0208<<14 | 0x3D<<7 | 0x50, 28355 - 19968: jis0212<<14 | 0x27<<7 | 0x13, 28356 - 19968: jis0208<<14 | 0x3D<<7 | 0x4A, 28357 - 19968: jis0208<<14 | 0x2B<<7 | 0x26, 28359 - 19968: jis0212<<14 | 0x27<<7 | 0x14, 28360 - 19968: jis0212<<14 | 0x27<<7 | 0x15, 28361 - 19968: jis0208<<14 | 0x3D<<7 | 0x45, 28362 - 19968: jis0212<<14 | 0x27<<7 | 0x16, 28363 - 19968: jis0208<<14 | 0x1B<<7 | 0x01, 28364 - 19968: jis0208<<14 | 0x3D<<7 | 0x5D, 28365 - 19968: jis0212<<14 | 0x27<<7 | 0x17, 28366 - 19968: jis0212<<14 | 0x27<<7 | 0x18, 28367 - 19968: jis0212<<14 | 0x27<<7 | 0x19, 28369 - 19968: jis0208<<14 | 0x12<<7 | 0x49, 28371 - 19968: jis0208<<14 | 0x3D<<7 | 0x47, 28372 - 19968: jis0208<<14 | 0x3D<<7 | 0x4C, 28373 - 19968: jis0208<<14 | 0x3D<<7 | 0x4D, 28381 - 19968: jis0208<<14 | 0x21<<7 | 0x4B, 28382 - 19968: jis0208<<14 | 0x21<<7 | 0x39, 28395 - 19968: jis0212<<14 | 0x27<<7 | 0x1A, 28396 - 19968: jis0208<<14 | 0x3D<<7 | 0x55, 28397 - 19968: jis0212<<14 | 0x27<<7 | 0x1B, 28398 - 19968: jis0212<<14 | 0x27<<7 | 0x1C, 28399 - 19968: jis0208<<14 | 0x3D<<7 | 0x5B, 28402 - 19968: jis0208<<14 | 0x3D<<7 | 0x59, 28404 - 19968: jis0208<<14 | 0x24<<7 | 0x08, 28407 - 19968: jis0208<<14 | 0x3E<<7 | 0x02, 28408 - 19968: jis0208<<14 | 0x3D<<7 | 0x56, 28409 - 19968: jis0212<<14 | 0x27<<7 | 0x1D, 28411 - 19968: jis0212<<14 | 0x27<<7 | 0x1E, 28413 - 19968: jis0212<<14 | 0x27<<7 | 0x1F, 28414 - 19968: jis0208<<14 | 0x3D<<7 | 0x57, 28415 - 19968: jis0208<<14 | 0x3D<<7 | 0x3F, 28417 - 19968: jis0208<<14 | 0x14<<7 | 0x58, 28418 - 19968: jis0208<<14 | 0x28<<7 | 0x19, 28420 - 19968: jis0212<<14 | 0x27<<7 | 0x20, 28422 - 19968: jis0208<<14 | 0x1B<<7 | 0x1E, 28424 - 19968: jis0212<<14 | 0x27<<7 | 0x21, 28425 - 19968: jis0208<<14 | 0x18<<7 | 0x56, 28426 - 19968: jis0212<<14 | 0x27<<7 | 0x22, 28428 - 19968: jis0212<<14 | 0x27<<7 | 0x23, 28429 - 19968: jis0212<<14 | 0x27<<7 | 0x24, 28431 - 19968: jis0208<<14 | 0x2E<<7 | 0x12, 28433 - 19968: jis0208<<14 | 0x3D<<7 | 0x53, 28435 - 19968: jis0208<<14 | 0x3E<<7 | 0x01, 28436 - 19968: jis0208<<14 | 0x10<<7 | 0x48, 28437 - 19968: jis0208<<14 | 0x20<<7 | 0x45, 28438 - 19968: jis0212<<14 | 0x27<<7 | 0x25, 28440 - 19968: jis0212<<14 | 0x27<<7 | 0x26, 28442 - 19968: jis0212<<14 | 0x27<<7 | 0x27, 28443 - 19968: jis0212<<14 | 0x27<<7 | 0x28, 28448 - 19968: jis0208<<14 | 0x26<<7 | 0x58, 28450 - 19968: jis0208<<14 | 0x13<<7 | 0x20, 28451 - 19968: jis0208<<14 | 0x2D<<7 | 0x59, 28454 - 19968: jis0212<<14 | 0x27<<7 | 0x29, 28457 - 19968: jis0212<<14 | 0x27<<7 | 0x2A, 28458 - 19968: jis0212<<14 | 0x27<<7 | 0x2B, 28459 - 19968: jis0208<<14 | 0x2B<<7 | 0x00, 28460 - 19968: jis0208<<14 | 0x23<<7 | 0x31, 28461 - 19968: jis0212<<14 | 0x27<<7 | 0x32, 28463 - 19968: jis0212<<14 | 0x27<<7 | 0x2C, 28464 - 19968: jis0212<<14 | 0x27<<7 | 0x2D, 28465 - 19968: jis0208<<14 | 0x3D<<7 | 0x5A, 28466 - 19968: jis0208<<14 | 0x3D<<7 | 0x5C, 28467 - 19968: jis0212<<14 | 0x27<<7 | 0x2E, 28470 - 19968: jis0212<<14 | 0x27<<7 | 0x2F, 28472 - 19968: jis0208<<14 | 0x20<<7 | 0x11, 28475 - 19968: jis0212<<14 | 0x27<<7 | 0x30, 28476 - 19968: jis0212<<14 | 0x27<<7 | 0x31, 28478 - 19968: jis0208<<14 | 0x3E<<7 | 0x00, 28479 - 19968: jis0208<<14 | 0x3D<<7 | 0x58, 28481 - 19968: jis0208<<14 | 0x3D<<7 | 0x52, 28485 - 19968: jis0208<<14 | 0x13<<7 | 0x22, 28495 - 19968: jis0212<<14 | 0x27<<7 | 0x33, 28497 - 19968: jis0212<<14 | 0x27<<7 | 0x34, 28498 - 19968: jis0212<<14 | 0x27<<7 | 0x35, 28499 - 19968: jis0212<<14 | 0x27<<7 | 0x36, 28500 - 19968: jis0208<<14 | 0x16<<7 | 0x48, 28503 - 19968: jis0212<<14 | 0x27<<7 | 0x37, 28504 - 19968: jis0208<<14 | 0x3E<<7 | 0x0E, 28505 - 19968: jis0212<<14 | 0x27<<7 | 0x38, 28506 - 19968: jis0212<<14 | 0x27<<7 | 0x39, 28507 - 19968: jis0208<<14 | 0x3E<<7 | 0x09, 28508 - 19968: jis0208<<14 | 0x1F<<7 | 0x57, 28509 - 19968: jis0212<<14 | 0x27<<7 | 0x3A, 28510 - 19968: jis0212<<14 | 0x27<<7 | 0x3B, 28511 - 19968: jis0208<<14 | 0x12<<7 | 0x42, 28513 - 19968: jis0212<<14 | 0x27<<7 | 0x3C, 28514 - 19968: jis0212<<14 | 0x27<<7 | 0x3D, 28516 - 19968: jis0208<<14 | 0x1C<<7 | 0x40, 28518 - 19968: jis0208<<14 | 0x3E<<7 | 0x12, 28520 - 19968: jis0212<<14 | 0x27<<7 | 0x3E, 28524 - 19968: jis0212<<14 | 0x27<<7 | 0x3F, 28525 - 19968: jis0208<<14 | 0x3E<<7 | 0x0B, 28526 - 19968: jis0208<<14 | 0x23<<7 | 0x0B, 28527 - 19968: jis0208<<14 | 0x3E<<7 | 0x08, 28528 - 19968: jis0208<<14 | 0x23<<7 | 0x38, 28532 - 19968: jis0208<<14 | 0x3E<<7 | 0x2B, 28536 - 19968: jis0208<<14 | 0x3E<<7 | 0x05, 28538 - 19968: jis0208<<14 | 0x3E<<7 | 0x04, 28540 - 19968: jis0208<<14 | 0x3E<<7 | 0x0D, 28541 - 19968: jis0212<<14 | 0x27<<7 | 0x40, 28542 - 19968: jis0212<<14 | 0x27<<7 | 0x41, 28544 - 19968: jis0208<<14 | 0x3E<<7 | 0x07, 28545 - 19968: jis0208<<14 | 0x3E<<7 | 0x06, 28546 - 19968: jis0208<<14 | 0x3E<<7 | 0x0C, 28547 - 19968: jis0212<<14 | 0x27<<7 | 0x42, 28548 - 19968: jis0208<<14 | 0x1F<<7 | 0x00, 28550 - 19968: jis0208<<14 | 0x3E<<7 | 0x03, 28551 - 19968: jis0212<<14 | 0x27<<7 | 0x43, 28552 - 19968: jis0208<<14 | 0x59<<7 | 0x4D, 28555 - 19968: jis0212<<14 | 0x27<<7 | 0x45, 28556 - 19968: jis0212<<14 | 0x27<<7 | 0x46, 28557 - 19968: jis0212<<14 | 0x27<<7 | 0x47, 28558 - 19968: jis0208<<14 | 0x3E<<7 | 0x0F, 28560 - 19968: jis0212<<14 | 0x27<<7 | 0x48, 28561 - 19968: jis0208<<14 | 0x3E<<7 | 0x10, 28562 - 19968: jis0212<<14 | 0x27<<7 | 0x49, 28563 - 19968: jis0212<<14 | 0x27<<7 | 0x4A, 28564 - 19968: jis0212<<14 | 0x27<<7 | 0x4B, 28566 - 19968: jis0212<<14 | 0x27<<7 | 0x4C, 28567 - 19968: jis0208<<14 | 0x13<<7 | 0x21, 28570 - 19968: jis0212<<14 | 0x27<<7 | 0x4D, 28575 - 19968: jis0212<<14 | 0x27<<7 | 0x4E, 28576 - 19968: jis0212<<14 | 0x27<<7 | 0x4F, 28577 - 19968: jis0208<<14 | 0x3E<<7 | 0x15, 28579 - 19968: jis0208<<14 | 0x3E<<7 | 0x14, 28580 - 19968: jis0208<<14 | 0x3E<<7 | 0x16, 28581 - 19968: jis0212<<14 | 0x27<<7 | 0x50, 28582 - 19968: jis0212<<14 | 0x27<<7 | 0x51, 28583 - 19968: jis0212<<14 | 0x27<<7 | 0x52, 28584 - 19968: jis0212<<14 | 0x27<<7 | 0x53, 28586 - 19968: jis0208<<14 | 0x3E<<7 | 0x19, 28590 - 19968: jis0212<<14 | 0x27<<7 | 0x54, 28591 - 19968: jis0212<<14 | 0x27<<7 | 0x55, 28592 - 19968: jis0212<<14 | 0x27<<7 | 0x56, 28593 - 19968: jis0208<<14 | 0x24<<7 | 0x22, 28595 - 19968: jis0208<<14 | 0x3E<<7 | 0x13, 28597 - 19968: jis0208<<14 | 0x59<<7 | 0x4E, 28598 - 19968: jis0212<<14 | 0x27<<7 | 0x58, 28601 - 19968: jis0208<<14 | 0x3E<<7 | 0x17, 28604 - 19968: jis0212<<14 | 0x27<<7 | 0x59, 28608 - 19968: jis0208<<14 | 0x16<<7 | 0x42, 28609 - 19968: jis0208<<14 | 0x21<<7 | 0x58, 28610 - 19968: jis0208<<14 | 0x3E<<7 | 0x11, 28611 - 19968: jis0208<<14 | 0x26<<7 | 0x1A, 28613 - 19968: jis0212<<14 | 0x27<<7 | 0x5A, 28614 - 19968: jis0208<<14 | 0x3E<<7 | 0x18, 28615 - 19968: jis0212<<14 | 0x27<<7 | 0x5B, 28616 - 19968: jis0212<<14 | 0x27<<7 | 0x5C, 28618 - 19968: jis0212<<14 | 0x27<<7 | 0x5D, 28628 - 19968: jis0208<<14 | 0x3E<<7 | 0x1D, 28629 - 19968: jis0208<<14 | 0x3E<<7 | 0x1B, 28632 - 19968: jis0208<<14 | 0x3E<<7 | 0x1E, 28634 - 19968: jis0212<<14 | 0x28<<7 | 0x00, 28635 - 19968: jis0208<<14 | 0x3E<<7 | 0x21, 28638 - 19968: jis0212<<14 | 0x28<<7 | 0x01, 28639 - 19968: jis0208<<14 | 0x3E<<7 | 0x1A, 28640 - 19968: jis0208<<14 | 0x18<<7 | 0x49, 28641 - 19968: jis0208<<14 | 0x26<<7 | 0x07, 28644 - 19968: jis0208<<14 | 0x3D<<7 | 0x18, 28648 - 19968: jis0212<<14 | 0x28<<7 | 0x02, 28649 - 19968: jis0212<<14 | 0x28<<7 | 0x03, 28651 - 19968: jis0208<<14 | 0x2C<<7 | 0x53, 28652 - 19968: jis0208<<14 | 0x3E<<7 | 0x1C, 28654 - 19968: jis0208<<14 | 0x3E<<7 | 0x20, 28655 - 19968: jis0208<<14 | 0x21<<7 | 0x54, 28656 - 19968: jis0212<<14 | 0x28<<7 | 0x04, 28657 - 19968: jis0208<<14 | 0x3E<<7 | 0x1F, 28659 - 19968: jis0208<<14 | 0x3E<<7 | 0x0A, 28661 - 19968: jis0208<<14 | 0x59<<7 | 0x4F, 28662 - 19968: jis0208<<14 | 0x4E<<7 | 0x48, 28665 - 19968: jis0212<<14 | 0x28<<7 | 0x06, 28666 - 19968: jis0208<<14 | 0x3E<<7 | 0x24, 28668 - 19968: jis0212<<14 | 0x28<<7 | 0x07, 28669 - 19968: jis0212<<14 | 0x28<<7 | 0x08, 28670 - 19968: jis0208<<14 | 0x3E<<7 | 0x28, 28672 - 19968: jis0212<<14 | 0x28<<7 | 0x09, 28673 - 19968: jis0208<<14 | 0x3E<<7 | 0x26, 28677 - 19968: jis0208<<14 | 0x59<<7 | 0x50, 28678 - 19968: jis0212<<14 | 0x28<<7 | 0x0B, 28679 - 19968: jis0208<<14 | 0x59<<7 | 0x51, 28681 - 19968: jis0208<<14 | 0x3E<<7 | 0x22, 28683 - 19968: jis0208<<14 | 0x3E<<7 | 0x23, 28685 - 19968: jis0212<<14 | 0x28<<7 | 0x0D, 28687 - 19968: jis0208<<14 | 0x3E<<7 | 0x27, 28689 - 19968: jis0208<<14 | 0x3E<<7 | 0x25, 28693 - 19968: jis0208<<14 | 0x28<<7 | 0x2D, 28695 - 19968: jis0212<<14 | 0x28<<7 | 0x0E, 28696 - 19968: jis0208<<14 | 0x3E<<7 | 0x2D, 28698 - 19968: jis0208<<14 | 0x3E<<7 | 0x2A, 28699 - 19968: jis0208<<14 | 0x3E<<7 | 0x29, 28701 - 19968: jis0208<<14 | 0x3E<<7 | 0x2C, 28702 - 19968: jis0208<<14 | 0x25<<7 | 0x33, 28703 - 19968: jis0208<<14 | 0x3E<<7 | 0x2E, 28704 - 19968: jis0212<<14 | 0x28<<7 | 0x0F, 28707 - 19968: jis0212<<14 | 0x28<<7 | 0x10, 28710 - 19968: jis0208<<14 | 0x22<<7 | 0x54, 28711 - 19968: jis0208<<14 | 0x21<<7 | 0x4C, 28712 - 19968: jis0208<<14 | 0x59<<7 | 0x52, 28716 - 19968: jis0208<<14 | 0x1F<<7 | 0x04, 28719 - 19968: jis0212<<14 | 0x28<<7 | 0x11, 28720 - 19968: jis0208<<14 | 0x3E<<7 | 0x2F, 28722 - 19968: jis0208<<14 | 0x3E<<7 | 0x31, 28724 - 19968: jis0212<<14 | 0x28<<7 | 0x12, 28727 - 19968: jis0212<<14 | 0x28<<7 | 0x13, 28729 - 19968: jis0212<<14 | 0x28<<7 | 0x14, 28732 - 19968: jis0212<<14 | 0x28<<7 | 0x15, 28734 - 19968: jis0208<<14 | 0x3E<<7 | 0x30, 28739 - 19968: jis0212<<14 | 0x28<<7 | 0x16, 28740 - 19968: jis0212<<14 | 0x28<<7 | 0x17, 28744 - 19968: jis0212<<14 | 0x28<<7 | 0x18, 28745 - 19968: jis0212<<14 | 0x28<<7 | 0x19, 28746 - 19968: jis0212<<14 | 0x28<<7 | 0x1A, 28747 - 19968: jis0212<<14 | 0x28<<7 | 0x1B, 28748 - 19968: jis0208<<14 | 0x3D<<7 | 0x54, 28750 - 19968: jis0212<<14 | 0x28<<7 | 0x20, 28753 - 19968: jis0208<<14 | 0x3E<<7 | 0x32, 28756 - 19968: jis0212<<14 | 0x28<<7 | 0x1C, 28757 - 19968: jis0212<<14 | 0x28<<7 | 0x1D, 28760 - 19968: jis0208<<14 | 0x25<<7 | 0x46, 28765 - 19968: jis0212<<14 | 0x28<<7 | 0x1E, 28766 - 19968: jis0212<<14 | 0x28<<7 | 0x1F, 28771 - 19968: jis0208<<14 | 0x3E<<7 | 0x33, 28772 - 19968: jis0212<<14 | 0x28<<7 | 0x21, 28773 - 19968: jis0212<<14 | 0x28<<7 | 0x22, 28779 - 19968: jis0208<<14 | 0x11<<7 | 0x2F, 28780 - 19968: jis0212<<14 | 0x28<<7 | 0x23, 28782 - 19968: jis0212<<14 | 0x28<<7 | 0x24, 28783 - 19968: jis0208<<14 | 0x24<<7 | 0x53, 28784 - 19968: jis0208<<14 | 0x12<<7 | 0x04, 28789 - 19968: jis0212<<14 | 0x28<<7 | 0x25, 28790 - 19968: jis0212<<14 | 0x28<<7 | 0x26, 28792 - 19968: jis0208<<14 | 0x14<<7 | 0x43, 28796 - 19968: jis0208<<14 | 0x1B<<7 | 0x3D, 28797 - 19968: jis0208<<14 | 0x19<<7 | 0x31, 28798 - 19968: jis0212<<14 | 0x28<<7 | 0x27, 28801 - 19968: jis0212<<14 | 0x28<<7 | 0x28, 28805 - 19968: jis0208<<14 | 0x59<<7 | 0x53, 28806 - 19968: jis0212<<14 | 0x28<<7 | 0x2A, 28809 - 19968: jis0208<<14 | 0x2E<<7 | 0x06, 28810 - 19968: jis0208<<14 | 0x1E<<7 | 0x45, 28814 - 19968: jis0208<<14 | 0x10<<7 | 0x49, 28818 - 19968: jis0208<<14 | 0x3E<<7 | 0x35, 28820 - 19968: jis0212<<14 | 0x28<<7 | 0x2B, 28821 - 19968: jis0212<<14 | 0x28<<7 | 0x2C, 28822 - 19968: jis0212<<14 | 0x28<<7 | 0x2D, 28823 - 19968: jis0212<<14 | 0x28<<7 | 0x2E, 28824 - 19968: jis0212<<14 | 0x28<<7 | 0x2F, 28825 - 19968: jis0208<<14 | 0x3E<<7 | 0x34, 28827 - 19968: jis0212<<14 | 0x28<<7 | 0x30, 28836 - 19968: jis0212<<14 | 0x28<<7 | 0x31, 28843 - 19968: jis0208<<14 | 0x59<<7 | 0x54, 28844 - 19968: jis0208<<14 | 0x3E<<7 | 0x38, 28845 - 19968: jis0208<<14 | 0x22<<7 | 0x19, 28846 - 19968: jis0208<<14 | 0x3E<<7 | 0x3B, 28847 - 19968: jis0208<<14 | 0x3E<<7 | 0x36, 28848 - 19968: jis0212<<14 | 0x28<<7 | 0x33, 28849 - 19968: jis0212<<14 | 0x28<<7 | 0x34, 28851 - 19968: jis0208<<14 | 0x3E<<7 | 0x3A, 28852 - 19968: jis0212<<14 | 0x28<<7 | 0x35, 28855 - 19968: jis0212<<14 | 0x28<<7 | 0x36, 28856 - 19968: jis0208<<14 | 0x3E<<7 | 0x39, 28857 - 19968: jis0208<<14 | 0x24<<7 | 0x1F, 28858 - 19968: jis0208<<14 | 0x0F<<7 | 0x38, 28859 - 19968: jis0208<<14 | 0x58<<7 | 0x06, 28872 - 19968: jis0208<<14 | 0x2D<<7 | 0x54, 28874 - 19968: jis0212<<14 | 0x28<<7 | 0x37, 28875 - 19968: jis0208<<14 | 0x3E<<7 | 0x3D, 28879 - 19968: jis0208<<14 | 0x10<<7 | 0x07, 28881 - 19968: jis0212<<14 | 0x28<<7 | 0x38, 28883 - 19968: jis0212<<14 | 0x28<<7 | 0x39, 28884 - 19968: jis0212<<14 | 0x28<<7 | 0x3A, 28885 - 19968: jis0212<<14 | 0x28<<7 | 0x3B, 28886 - 19968: jis0212<<14 | 0x28<<7 | 0x3C, 28888 - 19968: jis0212<<14 | 0x28<<7 | 0x3D, 28889 - 19968: jis0208<<14 | 0x3E<<7 | 0x3F, 28892 - 19968: jis0212<<14 | 0x28<<7 | 0x3E, 28893 - 19968: jis0208<<14 | 0x3E<<7 | 0x3E, 28895 - 19968: jis0208<<14 | 0x3E<<7 | 0x3C, 28900 - 19968: jis0212<<14 | 0x28<<7 | 0x3F, 28913 - 19968: jis0208<<14 | 0x3E<<7 | 0x37, 28921 - 19968: jis0208<<14 | 0x2A<<7 | 0x02, 28922 - 19968: jis0212<<14 | 0x28<<7 | 0x40, 28925 - 19968: jis0208<<14 | 0x3E<<7 | 0x41, 28931 - 19968: jis0212<<14 | 0x28<<7 | 0x41, 28932 - 19968: jis0208<<14 | 0x59<<7 | 0x56, 28933 - 19968: jis0212<<14 | 0x28<<7 | 0x43, 28934 - 19968: jis0212<<14 | 0x28<<7 | 0x44, 28935 - 19968: jis0212<<14 | 0x28<<7 | 0x45, 28937 - 19968: jis0208<<14 | 0x3E<<7 | 0x40, 28939 - 19968: jis0212<<14 | 0x28<<7 | 0x46, 28940 - 19968: jis0212<<14 | 0x28<<7 | 0x47, 28943 - 19968: jis0208<<14 | 0x59<<7 | 0x55, 28948 - 19968: jis0208<<14 | 0x10<<7 | 0x4A, 28953 - 19968: jis0208<<14 | 0x3E<<7 | 0x43, 28954 - 19968: jis0208<<14 | 0x29<<7 | 0x11, 28956 - 19968: jis0208<<14 | 0x3E<<7 | 0x42, 28958 - 19968: jis0212<<14 | 0x28<<7 | 0x49, 28960 - 19968: jis0212<<14 | 0x28<<7 | 0x4A, 28961 - 19968: jis0208<<14 | 0x2B<<7 | 0x14, 28966 - 19968: jis0208<<14 | 0x1D<<7 | 0x26, 28971 - 19968: jis0212<<14 | 0x28<<7 | 0x4B, 28973 - 19968: jis0212<<14 | 0x28<<7 | 0x4C, 28975 - 19968: jis0212<<14 | 0x28<<7 | 0x4D, 28976 - 19968: jis0212<<14 | 0x28<<7 | 0x4E, 28977 - 19968: jis0212<<14 | 0x28<<7 | 0x4F, 28982 - 19968: jis0208<<14 | 0x20<<7 | 0x12, 28984 - 19968: jis0212<<14 | 0x28<<7 | 0x50, 28988 - 19968: jis0208<<14 | 0x1D<<7 | 0x25, 28993 - 19968: jis0212<<14 | 0x28<<7 | 0x51, 28997 - 19968: jis0212<<14 | 0x28<<7 | 0x52, 28998 - 19968: jis0208<<14 | 0x59<<7 | 0x58, 28999 - 19968: jis0208<<14 | 0x59<<7 | 0x59, 29001 - 19968: jis0208<<14 | 0x2D<<7 | 0x5A, 29002 - 19968: jis0212<<14 | 0x28<<7 | 0x55, 29003 - 19968: jis0212<<14 | 0x28<<7 | 0x56, 29004 - 19968: jis0208<<14 | 0x3E<<7 | 0x49, 29006 - 19968: jis0208<<14 | 0x1F<<7 | 0x58, 29008 - 19968: jis0212<<14 | 0x28<<7 | 0x57, 29010 - 19968: jis0212<<14 | 0x28<<7 | 0x58, 29013 - 19968: jis0208<<14 | 0x3E<<7 | 0x45, 29014 - 19968: jis0208<<14 | 0x3E<<7 | 0x4A, 29015 - 19968: jis0212<<14 | 0x28<<7 | 0x59, 29017 - 19968: jis0208<<14 | 0x10<<7 | 0x4B, 29018 - 19968: jis0212<<14 | 0x28<<7 | 0x5A, 29020 - 19968: jis0208<<14 | 0x59<<7 | 0x57, 29022 - 19968: jis0212<<14 | 0x28<<7 | 0x5C, 29024 - 19968: jis0212<<14 | 0x28<<7 | 0x5D, 29026 - 19968: jis0208<<14 | 0x3E<<7 | 0x48, 29028 - 19968: jis0208<<14 | 0x26<<7 | 0x40, 29029 - 19968: jis0208<<14 | 0x3E<<7 | 0x44, 29030 - 19968: jis0208<<14 | 0x3E<<7 | 0x47, 29031 - 19968: jis0208<<14 | 0x1D<<7 | 0x27, 29032 - 19968: jis0212<<14 | 0x29<<7 | 0x00, 29033 - 19968: jis0208<<14 | 0x27<<7 | 0x30, 29036 - 19968: jis0208<<14 | 0x3E<<7 | 0x4B, 29038 - 19968: jis0208<<14 | 0x1B<<7 | 0x30, 29049 - 19968: jis0212<<14 | 0x29<<7 | 0x01, 29053 - 19968: jis0208<<14 | 0x1F<<7 | 0x59, 29056 - 19968: jis0212<<14 | 0x29<<7 | 0x02, 29060 - 19968: jis0208<<14 | 0x3E<<7 | 0x4E, 29061 - 19968: jis0212<<14 | 0x29<<7 | 0x03, 29063 - 19968: jis0212<<14 | 0x29<<7 | 0x04, 29064 - 19968: jis0208<<14 | 0x3E<<7 | 0x46, 29066 - 19968: jis0208<<14 | 0x16<<7 | 0x06, 29068 - 19968: jis0212<<14 | 0x29<<7 | 0x05, 29071 - 19968: jis0208<<14 | 0x3E<<7 | 0x4C, 29074 - 19968: jis0212<<14 | 0x29<<7 | 0x06, 29076 - 19968: jis0208<<14 | 0x2C<<7 | 0x2F, 29077 - 19968: jis0208<<14 | 0x3E<<7 | 0x4F, 29081 - 19968: jis0208<<14 | 0x53<<7 | 0x05, 29082 - 19968: jis0212<<14 | 0x29<<7 | 0x07, 29083 - 19968: jis0212<<14 | 0x29<<7 | 0x08, 29087 - 19968: jis0208<<14 | 0x1C<<7 | 0x2E, 29088 - 19968: jis0212<<14 | 0x29<<7 | 0x09, 29090 - 19968: jis0212<<14 | 0x29<<7 | 0x0A, 29096 - 19968: jis0208<<14 | 0x3E<<7 | 0x50, 29100 - 19968: jis0208<<14 | 0x3E<<7 | 0x51, 29103 - 19968: jis0212<<14 | 0x29<<7 | 0x0B, 29104 - 19968: jis0212<<14 | 0x29<<7 | 0x0C, 29105 - 19968: jis0208<<14 | 0x26<<7 | 0x0D, 29106 - 19968: jis0212<<14 | 0x29<<7 | 0x0D, 29107 - 19968: jis0212<<14 | 0x29<<7 | 0x0E, 29113 - 19968: jis0208<<14 | 0x3E<<7 | 0x53, 29114 - 19968: jis0212<<14 | 0x29<<7 | 0x0F, 29118 - 19968: jis0208<<14 | 0x3E<<7 | 0x54, 29119 - 19968: jis0212<<14 | 0x29<<7 | 0x10, 29120 - 19968: jis0212<<14 | 0x29<<7 | 0x11, 29121 - 19968: jis0208<<14 | 0x59<<7 | 0x5B, 29123 - 19968: jis0208<<14 | 0x26<<7 | 0x12, 29124 - 19968: jis0212<<14 | 0x29<<7 | 0x13, 29128 - 19968: jis0208<<14 | 0x24<<7 | 0x54, 29129 - 19968: jis0208<<14 | 0x3E<<7 | 0x56, 29131 - 19968: jis0212<<14 | 0x29<<7 | 0x14, 29132 - 19968: jis0212<<14 | 0x29<<7 | 0x15, 29134 - 19968: jis0208<<14 | 0x3E<<7 | 0x58, 29136 - 19968: jis0208<<14 | 0x2D<<7 | 0x34, 29138 - 19968: jis0208<<14 | 0x3E<<7 | 0x55, 29139 - 19968: jis0212<<14 | 0x29<<7 | 0x16, 29140 - 19968: jis0208<<14 | 0x3E<<7 | 0x57, 29141 - 19968: jis0208<<14 | 0x10<<7 | 0x4C, 29142 - 19968: jis0212<<14 | 0x29<<7 | 0x17, 29143 - 19968: jis0208<<14 | 0x3E<<7 | 0x52, 29145 - 19968: jis0212<<14 | 0x29<<7 | 0x18, 29146 - 19968: jis0212<<14 | 0x29<<7 | 0x19, 29148 - 19968: jis0212<<14 | 0x29<<7 | 0x1A, 29151 - 19968: jis0208<<14 | 0x32<<7 | 0x3A, 29152 - 19968: jis0208<<14 | 0x3E<<7 | 0x59, 29157 - 19968: jis0208<<14 | 0x20<<7 | 0x46, 29158 - 19968: jis0208<<14 | 0x1A<<7 | 0x17, 29159 - 19968: jis0208<<14 | 0x3E<<7 | 0x5B, 29164 - 19968: jis0208<<14 | 0x3E<<7 | 0x5A, 29165 - 19968: jis0208<<14 | 0x1E<<7 | 0x03, 29166 - 19968: jis0208<<14 | 0x31<<7 | 0x38, 29173 - 19968: jis0208<<14 | 0x3E<<7 | 0x5C, 29176 - 19968: jis0212<<14 | 0x29<<7 | 0x1B, 29177 - 19968: jis0208<<14 | 0x3F<<7 | 0x00, 29179 - 19968: jis0208<<14 | 0x3E<<7 | 0x4D, 29180 - 19968: jis0208<<14 | 0x3E<<7 | 0x5D, 29182 - 19968: jis0208<<14 | 0x59<<7 | 0x5C, 29183 - 19968: jis0208<<14 | 0x3F<<7 | 0x01, 29184 - 19968: jis0212<<14 | 0x29<<7 | 0x1D, 29190 - 19968: jis0208<<14 | 0x26<<7 | 0x59, 29191 - 19968: jis0212<<14 | 0x29<<7 | 0x1E, 29192 - 19968: jis0212<<14 | 0x29<<7 | 0x1F, 29193 - 19968: jis0212<<14 | 0x29<<7 | 0x20, 29197 - 19968: jis0208<<14 | 0x3F<<7 | 0x02, 29200 - 19968: jis0208<<14 | 0x3F<<7 | 0x03, 29203 - 19968: jis0212<<14 | 0x29<<7 | 0x21, 29207 - 19968: jis0212<<14 | 0x29<<7 | 0x22, 29210 - 19968: jis0212<<14 | 0x29<<7 | 0x23, 29211 - 19968: jis0208<<14 | 0x3F<<7 | 0x04, 29213 - 19968: jis0212<<14 | 0x29<<7 | 0x24, 29215 - 19968: jis0212<<14 | 0x29<<7 | 0x25, 29220 - 19968: jis0212<<14 | 0x29<<7 | 0x26, 29224 - 19968: jis0208<<14 | 0x3F<<7 | 0x05, 29226 - 19968: jis0208<<14 | 0x23<<7 | 0x3D, 29227 - 19968: jis0212<<14 | 0x29<<7 | 0x27, 29228 - 19968: jis0208<<14 | 0x3F<<7 | 0x07, 29229 - 19968: jis0208<<14 | 0x3F<<7 | 0x06, 29231 - 19968: jis0212<<14 | 0x29<<7 | 0x28, 29232 - 19968: jis0208<<14 | 0x3F<<7 | 0x08, 29234 - 19968: jis0208<<14 | 0x3F<<7 | 0x09, 29236 - 19968: jis0212<<14 | 0x29<<7 | 0x29, 29237 - 19968: jis0208<<14 | 0x1B<<7 | 0x3E, 29238 - 19968: jis0208<<14 | 0x28<<7 | 0x42, 29240 - 19968: jis0212<<14 | 0x29<<7 | 0x2A, 29241 - 19968: jis0212<<14 | 0x29<<7 | 0x2B, 29242 - 19968: jis0208<<14 | 0x2B<<7 | 0x4B, 29243 - 19968: jis0208<<14 | 0x3F<<7 | 0x0A, 29244 - 19968: jis0208<<14 | 0x3F<<7 | 0x0B, 29245 - 19968: jis0208<<14 | 0x20<<7 | 0x35, 29246 - 19968: jis0208<<14 | 0x1B<<7 | 0x03, 29247 - 19968: jis0208<<14 | 0x3F<<7 | 0x0C, 29248 - 19968: jis0208<<14 | 0x3F<<7 | 0x0D, 29249 - 19968: jis0212<<14 | 0x29<<7 | 0x2C, 29250 - 19968: jis0212<<14 | 0x29<<7 | 0x2D, 29251 - 19968: jis0212<<14 | 0x29<<7 | 0x2E, 29253 - 19968: jis0212<<14 | 0x29<<7 | 0x2F, 29254 - 19968: jis0208<<14 | 0x3F<<7 | 0x0E, 29255 - 19968: jis0208<<14 | 0x29<<7 | 0x31, 29256 - 19968: jis0208<<14 | 0x27<<7 | 0x26, 29259 - 19968: jis0208<<14 | 0x3F<<7 | 0x0F, 29260 - 19968: jis0208<<14 | 0x26<<7 | 0x36, 29262 - 19968: jis0212<<14 | 0x29<<7 | 0x30, 29263 - 19968: jis0212<<14 | 0x29<<7 | 0x31, 29264 - 19968: jis0212<<14 | 0x29<<7 | 0x32, 29266 - 19968: jis0208<<14 | 0x23<<7 | 0x0C, 29267 - 19968: jis0212<<14 | 0x29<<7 | 0x33, 29269 - 19968: jis0212<<14 | 0x29<<7 | 0x34, 29270 - 19968: jis0212<<14 | 0x29<<7 | 0x35, 29272 - 19968: jis0208<<14 | 0x3F<<7 | 0x10, 29273 - 19968: jis0208<<14 | 0x11<<7 | 0x46, 29274 - 19968: jis0212<<14 | 0x29<<7 | 0x36, 29275 - 19968: jis0208<<14 | 0x14<<7 | 0x4C, 29276 - 19968: jis0212<<14 | 0x29<<7 | 0x37, 29277 - 19968: jis0208<<14 | 0x2B<<7 | 0x25, 29278 - 19968: jis0212<<14 | 0x29<<7 | 0x38, 29279 - 19968: jis0208<<14 | 0x2B<<7 | 0x15, 29280 - 19968: jis0212<<14 | 0x29<<7 | 0x39, 29281 - 19968: jis0208<<14 | 0x11<<7 | 0x13, 29282 - 19968: jis0208<<14 | 0x2E<<7 | 0x13, 29283 - 19968: jis0212<<14 | 0x29<<7 | 0x3A, 29287 - 19968: jis0208<<14 | 0x2A<<7 | 0x31, 29288 - 19968: jis0212<<14 | 0x29<<7 | 0x3B, 29289 - 19968: jis0208<<14 | 0x29<<7 | 0x09, 29291 - 19968: jis0212<<14 | 0x29<<7 | 0x3C, 29294 - 19968: jis0212<<14 | 0x29<<7 | 0x3D, 29295 - 19968: jis0212<<14 | 0x29<<7 | 0x3E, 29297 - 19968: jis0212<<14 | 0x29<<7 | 0x3F, 29298 - 19968: jis0208<<14 | 0x1F<<7 | 0x16, 29300 - 19968: jis0208<<14 | 0x3F<<7 | 0x11, 29303 - 19968: jis0212<<14 | 0x29<<7 | 0x40, 29304 - 19968: jis0212<<14 | 0x29<<7 | 0x41, 29305 - 19968: jis0208<<14 | 0x25<<7 | 0x22, 29307 - 19968: jis0212<<14 | 0x29<<7 | 0x42, 29308 - 19968: jis0212<<14 | 0x29<<7 | 0x43, 29309 - 19968: jis0208<<14 | 0x17<<7 | 0x02, 29310 - 19968: jis0208<<14 | 0x3F<<7 | 0x12, 29311 - 19968: jis0212<<14 | 0x29<<7 | 0x44, 29312 - 19968: jis0208<<14 | 0x19<<7 | 0x33, 29313 - 19968: jis0208<<14 | 0x3F<<7 | 0x14, 29314 - 19968: jis0208<<14 | 0x3F<<7 | 0x13, 29316 - 19968: jis0212<<14 | 0x29<<7 | 0x45, 29319 - 19968: jis0208<<14 | 0x3F<<7 | 0x15, 29321 - 19968: jis0212<<14 | 0x29<<7 | 0x46, 29325 - 19968: jis0212<<14 | 0x29<<7 | 0x47, 29326 - 19968: jis0212<<14 | 0x29<<7 | 0x48, 29330 - 19968: jis0208<<14 | 0x3F<<7 | 0x16, 29331 - 19968: jis0212<<14 | 0x29<<7 | 0x49, 29334 - 19968: jis0208<<14 | 0x3F<<7 | 0x17, 29339 - 19968: jis0212<<14 | 0x29<<7 | 0x4A, 29344 - 19968: jis0208<<14 | 0x14<<7 | 0x1D, 29346 - 19968: jis0208<<14 | 0x3F<<7 | 0x18, 29351 - 19968: jis0208<<14 | 0x3F<<7 | 0x19, 29352 - 19968: jis0212<<14 | 0x29<<7 | 0x4B, 29356 - 19968: jis0208<<14 | 0x17<<7 | 0x03, 29357 - 19968: jis0212<<14 | 0x29<<7 | 0x4C, 29358 - 19968: jis0212<<14 | 0x29<<7 | 0x4D, 29359 - 19968: jis0208<<14 | 0x27<<7 | 0x27, 29361 - 19968: jis0208<<14 | 0x59<<7 | 0x5D, 29362 - 19968: jis0208<<14 | 0x3F<<7 | 0x1B, 29364 - 19968: jis0212<<14 | 0x29<<7 | 0x4F, 29366 - 19968: jis0208<<14 | 0x1D<<7 | 0x54, 29369 - 19968: jis0208<<14 | 0x3F<<7 | 0x1A, 29374 - 19968: jis0208<<14 | 0x5A<<7 | 0x00, 29377 - 19968: jis0212<<14 | 0x29<<7 | 0x51, 29378 - 19968: jis0208<<14 | 0x15<<7 | 0x17, 29379 - 19968: jis0208<<14 | 0x3F<<7 | 0x1C, 29380 - 19968: jis0208<<14 | 0x3F<<7 | 0x1E, 29382 - 19968: jis0208<<14 | 0x3F<<7 | 0x1D, 29383 - 19968: jis0212<<14 | 0x29<<7 | 0x52, 29385 - 19968: jis0212<<14 | 0x29<<7 | 0x53, 29388 - 19968: jis0212<<14 | 0x29<<7 | 0x54, 29390 - 19968: jis0208<<14 | 0x3F<<7 | 0x1F, 29392 - 19968: jis0208<<14 | 0x17<<7 | 0x30, 29394 - 19968: jis0208<<14 | 0x3F<<7 | 0x20, 29397 - 19968: jis0212<<14 | 0x29<<7 | 0x55, 29398 - 19968: jis0212<<14 | 0x29<<7 | 0x56, 29399 - 19968: jis0208<<14 | 0x15<<7 | 0x48, 29400 - 19968: jis0212<<14 | 0x29<<7 | 0x57, 29401 - 19968: jis0208<<14 | 0x20<<7 | 0x1F, 29403 - 19968: jis0208<<14 | 0x18<<7 | 0x5C, 29407 - 19968: jis0212<<14 | 0x29<<7 | 0x58, 29408 - 19968: jis0208<<14 | 0x3F<<7 | 0x22, 29409 - 19968: jis0208<<14 | 0x3F<<7 | 0x23, 29410 - 19968: jis0208<<14 | 0x3F<<7 | 0x21, 29413 - 19968: jis0212<<14 | 0x29<<7 | 0x59, 29417 - 19968: jis0208<<14 | 0x1B<<7 | 0x4C, 29420 - 19968: jis0208<<14 | 0x25<<7 | 0x27, 29421 - 19968: jis0208<<14 | 0x15<<7 | 0x18, 29427 - 19968: jis0212<<14 | 0x29<<7 | 0x5A, 29428 - 19968: jis0212<<14 | 0x29<<7 | 0x5B, 29431 - 19968: jis0208<<14 | 0x3F<<7 | 0x25, 29432 - 19968: jis0208<<14 | 0x22<<7 | 0x0B, 29433 - 19968: jis0208<<14 | 0x3F<<7 | 0x24, 29434 - 19968: jis0212<<14 | 0x29<<7 | 0x5C, 29435 - 19968: jis0212<<14 | 0x29<<7 | 0x5D, 29436 - 19968: jis0208<<14 | 0x2E<<7 | 0x14, 29437 - 19968: jis0208<<14 | 0x26<<7 | 0x41, 29438 - 19968: jis0212<<14 | 0x2A<<7 | 0x00, 29442 - 19968: jis0212<<14 | 0x2A<<7 | 0x01, 29444 - 19968: jis0212<<14 | 0x2A<<7 | 0x02, 29445 - 19968: jis0212<<14 | 0x2A<<7 | 0x03, 29447 - 19968: jis0212<<14 | 0x2A<<7 | 0x04, 29450 - 19968: jis0208<<14 | 0x3F<<7 | 0x28, 29451 - 19968: jis0212<<14 | 0x2A<<7 | 0x05, 29453 - 19968: jis0212<<14 | 0x2A<<7 | 0x06, 29458 - 19968: jis0212<<14 | 0x2A<<7 | 0x07, 29459 - 19968: jis0212<<14 | 0x2A<<7 | 0x08, 29462 - 19968: jis0208<<14 | 0x3F<<7 | 0x2A, 29463 - 19968: jis0208<<14 | 0x3F<<7 | 0x27, 29464 - 19968: jis0212<<14 | 0x2A<<7 | 0x09, 29465 - 19968: jis0212<<14 | 0x2A<<7 | 0x0A, 29467 - 19968: jis0208<<14 | 0x2B<<7 | 0x33, 29468 - 19968: jis0208<<14 | 0x3F<<7 | 0x29, 29469 - 19968: jis0208<<14 | 0x3F<<7 | 0x2B, 29470 - 19968: jis0212<<14 | 0x2A<<7 | 0x0B, 29471 - 19968: jis0208<<14 | 0x2D<<7 | 0x23, 29474 - 19968: jis0212<<14 | 0x2A<<7 | 0x0C, 29476 - 19968: jis0208<<14 | 0x5A<<7 | 0x01, 29477 - 19968: jis0208<<14 | 0x3F<<7 | 0x2F, 29479 - 19968: jis0212<<14 | 0x2A<<7 | 0x0E, 29480 - 19968: jis0212<<14 | 0x2A<<7 | 0x0F, 29481 - 19968: jis0208<<14 | 0x3F<<7 | 0x2E, 29482 - 19968: jis0208<<14 | 0x22<<7 | 0x55, 29483 - 19968: jis0208<<14 | 0x26<<7 | 0x0C, 29484 - 19968: jis0212<<14 | 0x2A<<7 | 0x10, 29486 - 19968: jis0208<<14 | 0x17<<7 | 0x04, 29487 - 19968: jis0208<<14 | 0x3F<<7 | 0x2D, 29489 - 19968: jis0212<<14 | 0x2A<<7 | 0x11, 29490 - 19968: jis0212<<14 | 0x2A<<7 | 0x12, 29492 - 19968: jis0208<<14 | 0x3F<<7 | 0x2C, 29493 - 19968: jis0212<<14 | 0x2A<<7 | 0x13, 29494 - 19968: jis0208<<14 | 0x2C<<7 | 0x10, 29495 - 19968: jis0208<<14 | 0x2C<<7 | 0x11, 29498 - 19968: jis0212<<14 | 0x2A<<7 | 0x14, 29499 - 19968: jis0212<<14 | 0x2A<<7 | 0x15, 29501 - 19968: jis0212<<14 | 0x2A<<7 | 0x16, 29502 - 19968: jis0208<<14 | 0x3F<<7 | 0x30, 29503 - 19968: jis0208<<14 | 0x10<<7 | 0x4D, 29507 - 19968: jis0212<<14 | 0x2A<<7 | 0x17, 29508 - 19968: jis0208<<14 | 0x18<<7 | 0x55, 29509 - 19968: jis0208<<14 | 0x1A<<7 | 0x41, 29517 - 19968: jis0212<<14 | 0x2A<<7 | 0x18, 29518 - 19968: jis0208<<14 | 0x3F<<7 | 0x31, 29519 - 19968: jis0208<<14 | 0x3F<<7 | 0x32, 29520 - 19968: jis0212<<14 | 0x2A<<7 | 0x19, 29522 - 19968: jis0212<<14 | 0x2A<<7 | 0x1A, 29526 - 19968: jis0212<<14 | 0x2A<<7 | 0x1B, 29527 - 19968: jis0208<<14 | 0x3F<<7 | 0x34, 29528 - 19968: jis0212<<14 | 0x2A<<7 | 0x1C, 29533 - 19968: jis0212<<14 | 0x2A<<7 | 0x1D, 29534 - 19968: jis0212<<14 | 0x2A<<7 | 0x1E, 29535 - 19968: jis0212<<14 | 0x2A<<7 | 0x1F, 29536 - 19968: jis0212<<14 | 0x2A<<7 | 0x20, 29539 - 19968: jis0208<<14 | 0x1C<<7 | 0x22, 29542 - 19968: jis0212<<14 | 0x2A<<7 | 0x21, 29543 - 19968: jis0212<<14 | 0x2A<<7 | 0x22, 29544 - 19968: jis0208<<14 | 0x3F<<7 | 0x36, 29545 - 19968: jis0212<<14 | 0x2A<<7 | 0x23, 29546 - 19968: jis0208<<14 | 0x3F<<7 | 0x35, 29547 - 19968: jis0212<<14 | 0x2A<<7 | 0x24, 29548 - 19968: jis0212<<14 | 0x2A<<7 | 0x25, 29550 - 19968: jis0212<<14 | 0x2A<<7 | 0x26, 29551 - 19968: jis0212<<14 | 0x2A<<7 | 0x27, 29552 - 19968: jis0208<<14 | 0x3F<<7 | 0x37, 29553 - 19968: jis0212<<14 | 0x2A<<7 | 0x28, 29554 - 19968: jis0208<<14 | 0x12<<7 | 0x2C, 29557 - 19968: jis0208<<14 | 0x3F<<7 | 0x39, 29559 - 19968: jis0208<<14 | 0x5A<<7 | 0x03, 29560 - 19968: jis0208<<14 | 0x3F<<7 | 0x38, 29561 - 19968: jis0212<<14 | 0x2A<<7 | 0x2A, 29562 - 19968: jis0208<<14 | 0x3F<<7 | 0x3B, 29563 - 19968: jis0208<<14 | 0x3F<<7 | 0x3A, 29564 - 19968: jis0212<<14 | 0x2A<<7 | 0x2B, 29568 - 19968: jis0212<<14 | 0x2A<<7 | 0x2C, 29569 - 19968: jis0212<<14 | 0x2A<<7 | 0x2D, 29571 - 19968: jis0212<<14 | 0x2A<<7 | 0x2E, 29572 - 19968: jis0208<<14 | 0x17<<7 | 0x1B, 29573 - 19968: jis0212<<14 | 0x2A<<7 | 0x2F, 29574 - 19968: jis0212<<14 | 0x2A<<7 | 0x30, 29575 - 19968: jis0208<<14 | 0x2D<<7 | 0x07, 29577 - 19968: jis0208<<14 | 0x15<<7 | 0x2B, 29579 - 19968: jis0208<<14 | 0x11<<7 | 0x05, 29582 - 19968: jis0212<<14 | 0x2A<<7 | 0x31, 29584 - 19968: jis0212<<14 | 0x2A<<7 | 0x32, 29587 - 19968: jis0212<<14 | 0x2A<<7 | 0x33, 29589 - 19968: jis0212<<14 | 0x2A<<7 | 0x34, 29590 - 19968: jis0208<<14 | 0x15<<7 | 0x49, 29591 - 19968: jis0212<<14 | 0x2A<<7 | 0x35, 29592 - 19968: jis0212<<14 | 0x2A<<7 | 0x36, 29596 - 19968: jis0212<<14 | 0x2A<<7 | 0x37, 29598 - 19968: jis0212<<14 | 0x2A<<7 | 0x38, 29599 - 19968: jis0212<<14 | 0x2A<<7 | 0x39, 29600 - 19968: jis0212<<14 | 0x2A<<7 | 0x3A, 29602 - 19968: jis0212<<14 | 0x2A<<7 | 0x3B, 29605 - 19968: jis0212<<14 | 0x2A<<7 | 0x3C, 29606 - 19968: jis0212<<14 | 0x2A<<7 | 0x3D, 29609 - 19968: jis0208<<14 | 0x13<<7 | 0x40, 29610 - 19968: jis0212<<14 | 0x2A<<7 | 0x3E, 29611 - 19968: jis0212<<14 | 0x2A<<7 | 0x3F, 29613 - 19968: jis0212<<14 | 0x2A<<7 | 0x40, 29618 - 19968: jis0208<<14 | 0x2D<<7 | 0x47, 29619 - 19968: jis0208<<14 | 0x3F<<7 | 0x3D, 29621 - 19968: jis0212<<14 | 0x2A<<7 | 0x41, 29623 - 19968: jis0212<<14 | 0x2A<<7 | 0x42, 29625 - 19968: jis0212<<14 | 0x2A<<7 | 0x43, 29627 - 19968: jis0208<<14 | 0x3F<<7 | 0x3F, 29628 - 19968: jis0212<<14 | 0x2A<<7 | 0x44, 29629 - 19968: jis0208<<14 | 0x5A<<7 | 0x04, 29631 - 19968: jis0212<<14 | 0x2A<<7 | 0x46, 29632 - 19968: jis0208<<14 | 0x3F<<7 | 0x40, 29634 - 19968: jis0208<<14 | 0x11<<7 | 0x30, 29637 - 19968: jis0212<<14 | 0x2A<<7 | 0x47, 29638 - 19968: jis0212<<14 | 0x2A<<7 | 0x48, 29640 - 19968: jis0208<<14 | 0x3F<<7 | 0x3C, 29641 - 19968: jis0208<<14 | 0x5A<<7 | 0x05, 29642 - 19968: jis0208<<14 | 0x1A<<7 | 0x18, 29643 - 19968: jis0212<<14 | 0x2A<<7 | 0x4A, 29644 - 19968: jis0212<<14 | 0x2A<<7 | 0x4B, 29645 - 19968: jis0208<<14 | 0x23<<7 | 0x20, 29646 - 19968: jis0208<<14 | 0x3F<<7 | 0x3E, 29647 - 19968: jis0212<<14 | 0x2A<<7 | 0x4C, 29650 - 19968: jis0208<<14 | 0x5A<<7 | 0x08, 29651 - 19968: jis0212<<14 | 0x2A<<7 | 0x4E, 29654 - 19968: jis0208<<14 | 0x5A<<7 | 0x06, 29657 - 19968: jis0212<<14 | 0x2A<<7 | 0x50, 29661 - 19968: jis0212<<14 | 0x2A<<7 | 0x51, 29662 - 19968: jis0208<<14 | 0x3F<<7 | 0x43, 29664 - 19968: jis0208<<14 | 0x1B<<7 | 0x4D, 29665 - 19968: jis0212<<14 | 0x2A<<7 | 0x52, 29667 - 19968: jis0208<<14 | 0x5A<<7 | 0x07, 29669 - 19968: jis0208<<14 | 0x3F<<7 | 0x41, 29670 - 19968: jis0212<<14 | 0x2A<<7 | 0x54, 29671 - 19968: jis0212<<14 | 0x2A<<7 | 0x55, 29673 - 19968: jis0212<<14 | 0x2A<<7 | 0x56, 29674 - 19968: jis0208<<14 | 0x16<<7 | 0x1D, 29677 - 19968: jis0208<<14 | 0x27<<7 | 0x28, 29678 - 19968: jis0208<<14 | 0x3F<<7 | 0x42, 29681 - 19968: jis0208<<14 | 0x3F<<7 | 0x5D, 29684 - 19968: jis0212<<14 | 0x2A<<7 | 0x57, 29685 - 19968: jis0208<<14 | 0x5A<<7 | 0x0A, 29687 - 19968: jis0212<<14 | 0x2A<<7 | 0x59, 29688 - 19968: jis0208<<14 | 0x3F<<7 | 0x48, 29689 - 19968: jis0212<<14 | 0x2A<<7 | 0x5A, 29690 - 19968: jis0212<<14 | 0x2A<<7 | 0x5B, 29691 - 19968: jis0212<<14 | 0x2A<<7 | 0x5C, 29693 - 19968: jis0212<<14 | 0x2A<<7 | 0x5D, 29694 - 19968: jis0208<<14 | 0x17<<7 | 0x1C, 29695 - 19968: jis0212<<14 | 0x2B<<7 | 0x00, 29696 - 19968: jis0212<<14 | 0x2B<<7 | 0x01, 29697 - 19968: jis0212<<14 | 0x2B<<7 | 0x02, 29699 - 19968: jis0208<<14 | 0x14<<7 | 0x44, 29700 - 19968: jis0212<<14 | 0x2B<<7 | 0x03, 29701 - 19968: jis0208<<14 | 0x3F<<7 | 0x45, 29702 - 19968: jis0208<<14 | 0x2C<<7 | 0x5C, 29703 - 19968: jis0208<<14 | 0x5A<<7 | 0x09, 29705 - 19968: jis0208<<14 | 0x2D<<7 | 0x0F, 29706 - 19968: jis0212<<14 | 0x2B<<7 | 0x05, 29713 - 19968: jis0212<<14 | 0x2B<<7 | 0x06, 29722 - 19968: jis0212<<14 | 0x2B<<7 | 0x07, 29723 - 19968: jis0212<<14 | 0x2B<<7 | 0x08, 29730 - 19968: jis0208<<14 | 0x21<<7 | 0x55, 29732 - 19968: jis0212<<14 | 0x2B<<7 | 0x09, 29733 - 19968: jis0208<<14 | 0x3F<<7 | 0x47, 29734 - 19968: jis0208<<14 | 0x5A<<7 | 0x0B, 29736 - 19968: jis0212<<14 | 0x2B<<7 | 0x0B, 29737 - 19968: jis0208<<14 | 0x5A<<7 | 0x0D, 29738 - 19968: jis0208<<14 | 0x5A<<7 | 0x0C, 29739 - 19968: jis0212<<14 | 0x2B<<7 | 0x0E, 29740 - 19968: jis0212<<14 | 0x2B<<7 | 0x0F, 29741 - 19968: jis0212<<14 | 0x2B<<7 | 0x10, 29742 - 19968: jis0208<<14 | 0x5A<<7 | 0x0E, 29743 - 19968: jis0212<<14 | 0x2B<<7 | 0x12, 29744 - 19968: jis0212<<14 | 0x2B<<7 | 0x13, 29745 - 19968: jis0212<<14 | 0x2B<<7 | 0x14, 29746 - 19968: jis0208<<14 | 0x3F<<7 | 0x49, 29747 - 19968: jis0208<<14 | 0x2D<<7 | 0x35, 29748 - 19968: jis0208<<14 | 0x15<<7 | 0x36, 29749 - 19968: jis0208<<14 | 0x27<<7 | 0x5B, 29750 - 19968: jis0208<<14 | 0x26<<7 | 0x29, 29753 - 19968: jis0212<<14 | 0x2B<<7 | 0x15, 29754 - 19968: jis0208<<14 | 0x3F<<7 | 0x4A, 29759 - 19968: jis0208<<14 | 0x3F<<7 | 0x4C, 29760 - 19968: jis0212<<14 | 0x2B<<7 | 0x16, 29761 - 19968: jis0208<<14 | 0x3F<<7 | 0x4F, 29763 - 19968: jis0212<<14 | 0x2B<<7 | 0x17, 29764 - 19968: jis0212<<14 | 0x2B<<7 | 0x18, 29766 - 19968: jis0212<<14 | 0x2B<<7 | 0x19, 29767 - 19968: jis0212<<14 | 0x2B<<7 | 0x1A, 29771 - 19968: jis0212<<14 | 0x2B<<7 | 0x1B, 29773 - 19968: jis0212<<14 | 0x2B<<7 | 0x1C, 29777 - 19968: jis0212<<14 | 0x2B<<7 | 0x1D, 29778 - 19968: jis0212<<14 | 0x2B<<7 | 0x1E, 29781 - 19968: jis0208<<14 | 0x3F<<7 | 0x4B, 29783 - 19968: jis0212<<14 | 0x2B<<7 | 0x1F, 29785 - 19968: jis0208<<14 | 0x3F<<7 | 0x4E, 29786 - 19968: jis0208<<14 | 0x17<<7 | 0x49, 29787 - 19968: jis0208<<14 | 0x10<<7 | 0x2C, 29788 - 19968: jis0208<<14 | 0x3F<<7 | 0x50, 29789 - 19968: jis0212<<14 | 0x2B<<7 | 0x20, 29790 - 19968: jis0208<<14 | 0x1E<<7 | 0x4F, 29791 - 19968: jis0208<<14 | 0x3F<<7 | 0x4D, 29792 - 19968: jis0208<<14 | 0x2D<<7 | 0x3B, 29794 - 19968: jis0208<<14 | 0x5A<<7 | 0x0F, 29795 - 19968: jis0208<<14 | 0x3F<<7 | 0x53, 29796 - 19968: jis0208<<14 | 0x53<<7 | 0x03, 29798 - 19968: jis0212<<14 | 0x2B<<7 | 0x22, 29799 - 19968: jis0212<<14 | 0x2B<<7 | 0x23, 29800 - 19968: jis0212<<14 | 0x2B<<7 | 0x24, 29801 - 19968: jis0208<<14 | 0x3F<<7 | 0x51, 29802 - 19968: jis0208<<14 | 0x3F<<7 | 0x54, 29803 - 19968: jis0212<<14 | 0x2B<<7 | 0x25, 29805 - 19968: jis0212<<14 | 0x2B<<7 | 0x26, 29806 - 19968: jis0212<<14 | 0x2B<<7 | 0x27, 29807 - 19968: jis0208<<14 | 0x3F<<7 | 0x46, 29808 - 19968: jis0208<<14 | 0x3F<<7 | 0x52, 29809 - 19968: jis0212<<14 | 0x2B<<7 | 0x28, 29810 - 19968: jis0212<<14 | 0x2B<<7 | 0x29, 29811 - 19968: jis0208<<14 | 0x19<<7 | 0x1B, 29814 - 19968: jis0208<<14 | 0x3F<<7 | 0x55, 29822 - 19968: jis0208<<14 | 0x3F<<7 | 0x56, 29824 - 19968: jis0212<<14 | 0x2B<<7 | 0x2A, 29825 - 19968: jis0212<<14 | 0x2B<<7 | 0x2B, 29827 - 19968: jis0208<<14 | 0x2C<<7 | 0x5D, 29829 - 19968: jis0212<<14 | 0x2B<<7 | 0x2C, 29830 - 19968: jis0212<<14 | 0x2B<<7 | 0x2D, 29831 - 19968: jis0212<<14 | 0x2B<<7 | 0x2E, 29833 - 19968: jis0208<<14 | 0x5A<<7 | 0x10, 29835 - 19968: jis0208<<14 | 0x3F<<7 | 0x57, 29839 - 19968: jis0212<<14 | 0x2B<<7 | 0x30, 29840 - 19968: jis0212<<14 | 0x2B<<7 | 0x31, 29841 - 19968: jis0212<<14 | 0x2B<<7 | 0x32, 29842 - 19968: jis0212<<14 | 0x2B<<7 | 0x33, 29848 - 19968: jis0212<<14 | 0x2B<<7 | 0x34, 29849 - 19968: jis0212<<14 | 0x2B<<7 | 0x35, 29850 - 19968: jis0212<<14 | 0x2B<<7 | 0x36, 29852 - 19968: jis0212<<14 | 0x2B<<7 | 0x37, 29854 - 19968: jis0208<<14 | 0x3F<<7 | 0x58, 29855 - 19968: jis0208<<14 | 0x5A<<7 | 0x11, 29856 - 19968: jis0212<<14 | 0x2B<<7 | 0x39, 29857 - 19968: jis0212<<14 | 0x2B<<7 | 0x3A, 29858 - 19968: jis0208<<14 | 0x3F<<7 | 0x44, 29859 - 19968: jis0212<<14 | 0x2B<<7 | 0x3B, 29862 - 19968: jis0212<<14 | 0x2B<<7 | 0x3C, 29863 - 19968: jis0208<<14 | 0x3F<<7 | 0x59, 29864 - 19968: jis0212<<14 | 0x2B<<7 | 0x3D, 29865 - 19968: jis0212<<14 | 0x2B<<7 | 0x3E, 29866 - 19968: jis0212<<14 | 0x2B<<7 | 0x3F, 29867 - 19968: jis0212<<14 | 0x2B<<7 | 0x40, 29870 - 19968: jis0212<<14 | 0x2B<<7 | 0x41, 29871 - 19968: jis0212<<14 | 0x2B<<7 | 0x42, 29872 - 19968: jis0208<<14 | 0x13<<7 | 0x23, 29873 - 19968: jis0212<<14 | 0x2B<<7 | 0x43, 29874 - 19968: jis0212<<14 | 0x2B<<7 | 0x44, 29877 - 19968: jis0212<<14 | 0x2B<<7 | 0x45, 29881 - 19968: jis0212<<14 | 0x2B<<7 | 0x46, 29883 - 19968: jis0212<<14 | 0x2B<<7 | 0x47, 29885 - 19968: jis0208<<14 | 0x1B<<7 | 0x04, 29887 - 19968: jis0212<<14 | 0x2B<<7 | 0x48, 29896 - 19968: jis0212<<14 | 0x2B<<7 | 0x49, 29897 - 19968: jis0212<<14 | 0x2B<<7 | 0x4A, 29898 - 19968: jis0208<<14 | 0x3F<<7 | 0x5A, 29900 - 19968: jis0212<<14 | 0x2B<<7 | 0x4B, 29903 - 19968: jis0208<<14 | 0x3F<<7 | 0x5B, 29904 - 19968: jis0212<<14 | 0x2B<<7 | 0x4C, 29907 - 19968: jis0212<<14 | 0x2B<<7 | 0x4D, 29908 - 19968: jis0208<<14 | 0x3F<<7 | 0x5C, 29912 - 19968: jis0212<<14 | 0x2B<<7 | 0x4E, 29914 - 19968: jis0212<<14 | 0x2B<<7 | 0x4F, 29915 - 19968: jis0212<<14 | 0x2B<<7 | 0x50, 29916 - 19968: jis0208<<14 | 0x10<<7 | 0x1A, 29918 - 19968: jis0212<<14 | 0x2B<<7 | 0x51, 29919 - 19968: jis0212<<14 | 0x2B<<7 | 0x52, 29920 - 19968: jis0208<<14 | 0x40<<7 | 0x00, 29922 - 19968: jis0208<<14 | 0x28<<7 | 0x1A, 29923 - 19968: jis0208<<14 | 0x40<<7 | 0x01, 29924 - 19968: jis0212<<14 | 0x2B<<7 | 0x53, 29926 - 19968: jis0208<<14 | 0x13<<7 | 0x03, 29927 - 19968: jis0208<<14 | 0x40<<7 | 0x02, 29928 - 19968: jis0212<<14 | 0x2B<<7 | 0x54, 29929 - 19968: jis0208<<14 | 0x40<<7 | 0x03, 29930 - 19968: jis0212<<14 | 0x2B<<7 | 0x55, 29931 - 19968: jis0212<<14 | 0x2B<<7 | 0x56, 29934 - 19968: jis0208<<14 | 0x40<<7 | 0x04, 29935 - 19968: jis0212<<14 | 0x2B<<7 | 0x57, 29936 - 19968: jis0208<<14 | 0x40<<7 | 0x06, 29937 - 19968: jis0208<<14 | 0x40<<7 | 0x07, 29938 - 19968: jis0208<<14 | 0x40<<7 | 0x05, 29940 - 19968: jis0212<<14 | 0x2B<<7 | 0x58, 29942 - 19968: jis0208<<14 | 0x28<<7 | 0x32, 29943 - 19968: jis0208<<14 | 0x40<<7 | 0x09, 29944 - 19968: jis0208<<14 | 0x40<<7 | 0x08, 29946 - 19968: jis0212<<14 | 0x2B<<7 | 0x59, 29947 - 19968: jis0212<<14 | 0x2B<<7 | 0x5A, 29948 - 19968: jis0212<<14 | 0x2B<<7 | 0x5B, 29951 - 19968: jis0212<<14 | 0x2B<<7 | 0x5C, 29953 - 19968: jis0208<<14 | 0x5A<<7 | 0x12, 29955 - 19968: jis0208<<14 | 0x40<<7 | 0x0B, 29956 - 19968: jis0208<<14 | 0x40<<7 | 0x0A, 29957 - 19968: jis0208<<14 | 0x40<<7 | 0x0C, 29958 - 19968: jis0212<<14 | 0x2B<<7 | 0x5D, 29964 - 19968: jis0208<<14 | 0x40<<7 | 0x0D, 29965 - 19968: jis0208<<14 | 0x40<<7 | 0x0F, 29966 - 19968: jis0208<<14 | 0x40<<7 | 0x0E, 29969 - 19968: jis0208<<14 | 0x18<<7 | 0x58, 29970 - 19968: jis0212<<14 | 0x2C<<7 | 0x00, 29971 - 19968: jis0208<<14 | 0x40<<7 | 0x11, 29973 - 19968: jis0208<<14 | 0x40<<7 | 0x10, 29974 - 19968: jis0212<<14 | 0x2C<<7 | 0x01, 29975 - 19968: jis0212<<14 | 0x2C<<7 | 0x02, 29976 - 19968: jis0208<<14 | 0x13<<7 | 0x24, 29978 - 19968: jis0208<<14 | 0x1E<<7 | 0x32, 29980 - 19968: jis0208<<14 | 0x24<<7 | 0x1B, 29982 - 19968: jis0208<<14 | 0x40<<7 | 0x12, 29983 - 19968: jis0208<<14 | 0x1F<<7 | 0x17, 29984 - 19968: jis0212<<14 | 0x2C<<7 | 0x03, 29985 - 19968: jis0212<<14 | 0x2C<<7 | 0x04, 29987 - 19968: jis0208<<14 | 0x1A<<7 | 0x19, 29988 - 19968: jis0212<<14 | 0x2C<<7 | 0x05, 29989 - 19968: jis0208<<14 | 0x10<<7 | 0x58, 29990 - 19968: jis0208<<14 | 0x40<<7 | 0x13, 29991 - 19968: jis0212<<14 | 0x2C<<7 | 0x06, 29992 - 19968: jis0208<<14 | 0x2C<<7 | 0x30, 29993 - 19968: jis0212<<14 | 0x2C<<7 | 0x07, 29994 - 19968: jis0212<<14 | 0x2C<<7 | 0x08, 29995 - 19968: jis0208<<14 | 0x29<<7 | 0x42, 29996 - 19968: jis0208<<14 | 0x40<<7 | 0x14, 29999 - 19968: jis0208<<14 | 0x58<<7 | 0x4B, 30000 - 19968: jis0208<<14 | 0x24<<7 | 0x23, 30001 - 19968: jis0208<<14 | 0x2C<<7 | 0x12, 30002 - 19968: jis0208<<14 | 0x18<<7 | 0x22, 30003 - 19968: jis0208<<14 | 0x1E<<7 | 0x1C, 30006 - 19968: jis0212<<14 | 0x2C<<7 | 0x0A, 30007 - 19968: jis0208<<14 | 0x22<<7 | 0x2A, 30008 - 19968: jis0208<<14 | 0x31<<7 | 0x13, 30009 - 19968: jis0212<<14 | 0x2C<<7 | 0x0B, 30010 - 19968: jis0208<<14 | 0x23<<7 | 0x0D, 30011 - 19968: jis0208<<14 | 0x11<<7 | 0x47, 30012 - 19968: jis0208<<14 | 0x40<<7 | 0x15, 30013 - 19968: jis0212<<14 | 0x2C<<7 | 0x0C, 30014 - 19968: jis0212<<14 | 0x2C<<7 | 0x0D, 30015 - 19968: jis0212<<14 | 0x2C<<7 | 0x0E, 30016 - 19968: jis0212<<14 | 0x2C<<7 | 0x0F, 30019 - 19968: jis0212<<14 | 0x2C<<7 | 0x10, 30020 - 19968: jis0208<<14 | 0x40<<7 | 0x16, 30022 - 19968: jis0208<<14 | 0x40<<7 | 0x1B, 30023 - 19968: jis0212<<14 | 0x2C<<7 | 0x11, 30024 - 19968: jis0212<<14 | 0x2C<<7 | 0x12, 30025 - 19968: jis0208<<14 | 0x40<<7 | 0x19, 30026 - 19968: jis0208<<14 | 0x40<<7 | 0x18, 30027 - 19968: jis0208<<14 | 0x39<<7 | 0x21, 30028 - 19968: jis0208<<14 | 0x12<<7 | 0x05, 30029 - 19968: jis0208<<14 | 0x40<<7 | 0x17, 30030 - 19968: jis0212<<14 | 0x2C<<7 | 0x13, 30031 - 19968: jis0208<<14 | 0x0F<<7 | 0x39, 30032 - 19968: jis0212<<14 | 0x2C<<7 | 0x14, 30033 - 19968: jis0208<<14 | 0x27<<7 | 0x09, 30034 - 19968: jis0212<<14 | 0x2C<<7 | 0x15, 30036 - 19968: jis0208<<14 | 0x27<<7 | 0x29, 30039 - 19968: jis0212<<14 | 0x2C<<7 | 0x16, 30041 - 19968: jis0208<<14 | 0x2D<<7 | 0x10, 30042 - 19968: jis0208<<14 | 0x40<<7 | 0x1C, 30043 - 19968: jis0208<<14 | 0x40<<7 | 0x1A, 30044 - 19968: jis0208<<14 | 0x22<<7 | 0x3B, 30045 - 19968: jis0208<<14 | 0x1F<<7 | 0x05, 30046 - 19968: jis0212<<14 | 0x2C<<7 | 0x17, 30047 - 19968: jis0212<<14 | 0x2C<<7 | 0x18, 30048 - 19968: jis0208<<14 | 0x27<<7 | 0x0A, 30049 - 19968: jis0212<<14 | 0x2C<<7 | 0x19, 30050 - 19968: jis0208<<14 | 0x28<<7 | 0x0C, 30052 - 19968: jis0208<<14 | 0x40<<7 | 0x1E, 30053 - 19968: jis0208<<14 | 0x2D<<7 | 0x0B, 30054 - 19968: jis0208<<14 | 0x16<<7 | 0x2C, 30055 - 19968: jis0208<<14 | 0x40<<7 | 0x1F, 30057 - 19968: jis0208<<14 | 0x40<<7 | 0x1D, 30058 - 19968: jis0208<<14 | 0x27<<7 | 0x35, 30059 - 19968: jis0208<<14 | 0x40<<7 | 0x20, 30061 - 19968: jis0208<<14 | 0x40<<7 | 0x21, 30063 - 19968: jis0208<<14 | 0x5A<<7 | 0x13, 30064 - 19968: jis0208<<14 | 0x0F<<7 | 0x3A, 30065 - 19968: jis0212<<14 | 0x2C<<7 | 0x1B, 30067 - 19968: jis0208<<14 | 0x1D<<7 | 0x55, 30068 - 19968: jis0208<<14 | 0x40<<7 | 0x26, 30070 - 19968: jis0208<<14 | 0x40<<7 | 0x23, 30071 - 19968: jis0208<<14 | 0x25<<7 | 0x4C, 30072 - 19968: jis0208<<14 | 0x40<<7 | 0x22, 30073 - 19968: jis0212<<14 | 0x2C<<7 | 0x1C, 30074 - 19968: jis0212<<14 | 0x2C<<7 | 0x1D, 30075 - 19968: jis0212<<14 | 0x2C<<7 | 0x1E, 30076 - 19968: jis0212<<14 | 0x2C<<7 | 0x1F, 30077 - 19968: jis0212<<14 | 0x2C<<7 | 0x20, 30078 - 19968: jis0212<<14 | 0x2C<<7 | 0x21, 30079 - 19968: jis0208<<14 | 0x14<<7 | 0x05, 30081 - 19968: jis0212<<14 | 0x2C<<7 | 0x22, 30082 - 19968: jis0208<<14 | 0x40<<7 | 0x29, 30085 - 19968: jis0212<<14 | 0x2C<<7 | 0x23, 30086 - 19968: jis0208<<14 | 0x40<<7 | 0x24, 30087 - 19968: jis0208<<14 | 0x40<<7 | 0x25, 30089 - 19968: jis0208<<14 | 0x40<<7 | 0x28, 30090 - 19968: jis0208<<14 | 0x40<<7 | 0x27, 30091 - 19968: jis0208<<14 | 0x28<<7 | 0x04, 30094 - 19968: jis0208<<14 | 0x20<<7 | 0x21, 30095 - 19968: jis0208<<14 | 0x20<<7 | 0x20, 30096 - 19968: jis0212<<14 | 0x2C<<7 | 0x24, 30097 - 19968: jis0208<<14 | 0x14<<7 | 0x1E, 30098 - 19968: jis0212<<14 | 0x2C<<7 | 0x25, 30099 - 19968: jis0212<<14 | 0x2C<<7 | 0x26, 30100 - 19968: jis0208<<14 | 0x40<<7 | 0x2A, 30101 - 19968: jis0212<<14 | 0x2C<<7 | 0x27, 30105 - 19968: jis0212<<14 | 0x2C<<7 | 0x28, 30106 - 19968: jis0208<<14 | 0x40<<7 | 0x2B, 30108 - 19968: jis0212<<14 | 0x2C<<7 | 0x29, 30109 - 19968: jis0208<<14 | 0x40<<7 | 0x2C, 30114 - 19968: jis0212<<14 | 0x2C<<7 | 0x2A, 30115 - 19968: jis0208<<14 | 0x40<<7 | 0x2E, 30116 - 19968: jis0212<<14 | 0x2C<<7 | 0x2B, 30117 - 19968: jis0208<<14 | 0x40<<7 | 0x2D, 30123 - 19968: jis0208<<14 | 0x10<<7 | 0x35, 30129 - 19968: jis0208<<14 | 0x40<<7 | 0x36, 30130 - 19968: jis0208<<14 | 0x27<<7 | 0x47, 30131 - 19968: jis0208<<14 | 0x40<<7 | 0x30, 30132 - 19968: jis0212<<14 | 0x2C<<7 | 0x2C, 30133 - 19968: jis0208<<14 | 0x40<<7 | 0x32, 30136 - 19968: jis0208<<14 | 0x40<<7 | 0x34, 30137 - 19968: jis0208<<14 | 0x1E<<7 | 0x1D, 30138 - 19968: jis0212<<14 | 0x2C<<7 | 0x2D, 30140 - 19968: jis0208<<14 | 0x40<<7 | 0x35, 30141 - 19968: jis0208<<14 | 0x40<<7 | 0x33, 30142 - 19968: jis0208<<14 | 0x1B<<7 | 0x1F, 30143 - 19968: jis0212<<14 | 0x2C<<7 | 0x2E, 30144 - 19968: jis0212<<14 | 0x2C<<7 | 0x2F, 30145 - 19968: jis0212<<14 | 0x2C<<7 | 0x30, 30146 - 19968: jis0208<<14 | 0x40<<7 | 0x2F, 30147 - 19968: jis0208<<14 | 0x40<<7 | 0x31, 30148 - 19968: jis0212<<14 | 0x2C<<7 | 0x31, 30149 - 19968: jis0208<<14 | 0x28<<7 | 0x21, 30150 - 19968: jis0212<<14 | 0x2C<<7 | 0x32, 30151 - 19968: jis0208<<14 | 0x1D<<7 | 0x28, 30154 - 19968: jis0208<<14 | 0x40<<7 | 0x38, 30156 - 19968: jis0212<<14 | 0x2C<<7 | 0x33, 30157 - 19968: jis0208<<14 | 0x40<<7 | 0x37, 30158 - 19968: jis0212<<14 | 0x2C<<7 | 0x34, 30159 - 19968: jis0212<<14 | 0x2C<<7 | 0x35, 30162 - 19968: jis0208<<14 | 0x40<<7 | 0x39, 30164 - 19968: jis0208<<14 | 0x1B<<7 | 0x05, 30165 - 19968: jis0208<<14 | 0x19<<7 | 0x0E, 30167 - 19968: jis0212<<14 | 0x2C<<7 | 0x36, 30168 - 19968: jis0208<<14 | 0x24<<7 | 0x56, 30169 - 19968: jis0208<<14 | 0x40<<7 | 0x3A, 30171 - 19968: jis0208<<14 | 0x23<<7 | 0x2A, 30172 - 19968: jis0212<<14 | 0x2C<<7 | 0x37, 30174 - 19968: jis0208<<14 | 0x40<<7 | 0x3C, 30175 - 19968: jis0212<<14 | 0x2C<<7 | 0x38, 30176 - 19968: jis0212<<14 | 0x2C<<7 | 0x39, 30177 - 19968: jis0212<<14 | 0x2C<<7 | 0x3A, 30178 - 19968: jis0208<<14 | 0x2D<<7 | 0x00, 30179 - 19968: jis0208<<14 | 0x40<<7 | 0x3B, 30180 - 19968: jis0212<<14 | 0x2C<<7 | 0x3B, 30183 - 19968: jis0212<<14 | 0x2C<<7 | 0x3C, 30185 - 19968: jis0208<<14 | 0x20<<7 | 0x48, 30188 - 19968: jis0212<<14 | 0x2C<<7 | 0x3D, 30190 - 19968: jis0212<<14 | 0x2C<<7 | 0x3E, 30191 - 19968: jis0212<<14 | 0x2C<<7 | 0x3F, 30192 - 19968: jis0208<<14 | 0x40<<7 | 0x41, 30193 - 19968: jis0212<<14 | 0x2C<<7 | 0x40, 30194 - 19968: jis0208<<14 | 0x40<<7 | 0x43, 30195 - 19968: jis0208<<14 | 0x40<<7 | 0x44, 30196 - 19968: jis0208<<14 | 0x22<<7 | 0x33, 30201 - 19968: jis0212<<14 | 0x2C<<7 | 0x41, 30202 - 19968: jis0208<<14 | 0x40<<7 | 0x42, 30204 - 19968: jis0208<<14 | 0x40<<7 | 0x3F, 30206 - 19968: jis0208<<14 | 0x40<<7 | 0x3D, 30207 - 19968: jis0208<<14 | 0x40<<7 | 0x3E, 30208 - 19968: jis0212<<14 | 0x2C<<7 | 0x42, 30209 - 19968: jis0208<<14 | 0x40<<7 | 0x40, 30210 - 19968: jis0212<<14 | 0x2C<<7 | 0x43, 30211 - 19968: jis0212<<14 | 0x2C<<7 | 0x44, 30212 - 19968: jis0212<<14 | 0x2C<<7 | 0x45, 30215 - 19968: jis0212<<14 | 0x2C<<7 | 0x46, 30216 - 19968: jis0212<<14 | 0x2C<<7 | 0x47, 30217 - 19968: jis0208<<14 | 0x40<<7 | 0x47, 30218 - 19968: jis0212<<14 | 0x2C<<7 | 0x48, 30219 - 19968: jis0208<<14 | 0x40<<7 | 0x45, 30220 - 19968: jis0212<<14 | 0x2C<<7 | 0x49, 30221 - 19968: jis0208<<14 | 0x40<<7 | 0x46, 30223 - 19968: jis0212<<14 | 0x2C<<7 | 0x4A, 30226 - 19968: jis0212<<14 | 0x2C<<7 | 0x4B, 30227 - 19968: jis0212<<14 | 0x2C<<7 | 0x4C, 30229 - 19968: jis0212<<14 | 0x2C<<7 | 0x4D, 30230 - 19968: jis0212<<14 | 0x2C<<7 | 0x4E, 30233 - 19968: jis0212<<14 | 0x2C<<7 | 0x4F, 30235 - 19968: jis0212<<14 | 0x2C<<7 | 0x50, 30236 - 19968: jis0212<<14 | 0x2C<<7 | 0x51, 30237 - 19968: jis0212<<14 | 0x2C<<7 | 0x52, 30238 - 19968: jis0212<<14 | 0x2C<<7 | 0x53, 30239 - 19968: jis0208<<14 | 0x40<<7 | 0x48, 30240 - 19968: jis0208<<14 | 0x40<<7 | 0x4A, 30241 - 19968: jis0208<<14 | 0x40<<7 | 0x4B, 30242 - 19968: jis0208<<14 | 0x40<<7 | 0x4C, 30243 - 19968: jis0212<<14 | 0x2C<<7 | 0x54, 30244 - 19968: jis0208<<14 | 0x40<<7 | 0x4D, 30245 - 19968: jis0212<<14 | 0x2C<<7 | 0x55, 30246 - 19968: jis0212<<14 | 0x2C<<7 | 0x56, 30247 - 19968: jis0208<<14 | 0x40<<7 | 0x49, 30249 - 19968: jis0212<<14 | 0x2C<<7 | 0x57, 30253 - 19968: jis0212<<14 | 0x2C<<7 | 0x58, 30256 - 19968: jis0208<<14 | 0x40<<7 | 0x4F, 30258 - 19968: jis0212<<14 | 0x2C<<7 | 0x59, 30259 - 19968: jis0212<<14 | 0x2C<<7 | 0x5A, 30260 - 19968: jis0208<<14 | 0x40<<7 | 0x4E, 30261 - 19968: jis0212<<14 | 0x2C<<7 | 0x5B, 30264 - 19968: jis0212<<14 | 0x2C<<7 | 0x5C, 30265 - 19968: jis0212<<14 | 0x2C<<7 | 0x5D, 30266 - 19968: jis0212<<14 | 0x2D<<7 | 0x00, 30267 - 19968: jis0208<<14 | 0x40<<7 | 0x50, 30268 - 19968: jis0212<<14 | 0x2D<<7 | 0x01, 30272 - 19968: jis0212<<14 | 0x2D<<7 | 0x03, 30273 - 19968: jis0212<<14 | 0x2D<<7 | 0x04, 30274 - 19968: jis0208<<14 | 0x2D<<7 | 0x24, 30275 - 19968: jis0212<<14 | 0x2D<<7 | 0x05, 30276 - 19968: jis0212<<14 | 0x2D<<7 | 0x06, 30277 - 19968: jis0212<<14 | 0x2D<<7 | 0x07, 30278 - 19968: jis0208<<14 | 0x40<<7 | 0x53, 30279 - 19968: jis0208<<14 | 0x40<<7 | 0x51, 30280 - 19968: jis0208<<14 | 0x40<<7 | 0x52, 30281 - 19968: jis0212<<14 | 0x2D<<7 | 0x08, 30282 - 19968: jis0212<<14 | 0x2D<<7 | 0x02, 30283 - 19968: jis0212<<14 | 0x2D<<7 | 0x09, 30284 - 19968: jis0208<<14 | 0x13<<7 | 0x41, 30290 - 19968: jis0208<<14 | 0x2B<<7 | 0x5D, 30293 - 19968: jis0212<<14 | 0x2D<<7 | 0x0A, 30294 - 19968: jis0208<<14 | 0x29<<7 | 0x29, 30296 - 19968: jis0208<<14 | 0x40<<7 | 0x55, 30297 - 19968: jis0212<<14 | 0x2D<<7 | 0x0B, 30300 - 19968: jis0208<<14 | 0x40<<7 | 0x54, 30303 - 19968: jis0212<<14 | 0x2D<<7 | 0x0C, 30305 - 19968: jis0208<<14 | 0x40<<7 | 0x56, 30306 - 19968: jis0208<<14 | 0x40<<7 | 0x57, 30308 - 19968: jis0212<<14 | 0x2D<<7 | 0x0D, 30309 - 19968: jis0212<<14 | 0x2D<<7 | 0x0E, 30311 - 19968: jis0208<<14 | 0x40<<7 | 0x5B, 30312 - 19968: jis0208<<14 | 0x40<<7 | 0x58, 30313 - 19968: jis0208<<14 | 0x40<<7 | 0x59, 30314 - 19968: jis0208<<14 | 0x40<<7 | 0x5A, 30316 - 19968: jis0208<<14 | 0x40<<7 | 0x5C, 30317 - 19968: jis0212<<14 | 0x2D<<7 | 0x0F, 30318 - 19968: jis0212<<14 | 0x2D<<7 | 0x10, 30319 - 19968: jis0212<<14 | 0x2D<<7 | 0x11, 30320 - 19968: jis0208<<14 | 0x40<<7 | 0x5D, 30321 - 19968: jis0212<<14 | 0x2D<<7 | 0x12, 30322 - 19968: jis0208<<14 | 0x41<<7 | 0x00, 30324 - 19968: jis0212<<14 | 0x2D<<7 | 0x13, 30326 - 19968: jis0208<<14 | 0x41<<7 | 0x01, 30328 - 19968: jis0208<<14 | 0x41<<7 | 0x02, 30330 - 19968: jis0208<<14 | 0x27<<7 | 0x0E, 30331 - 19968: jis0208<<14 | 0x24<<7 | 0x2F, 30332 - 19968: jis0208<<14 | 0x41<<7 | 0x03, 30333 - 19968: jis0208<<14 | 0x26<<7 | 0x51, 30334 - 19968: jis0208<<14 | 0x28<<7 | 0x13, 30336 - 19968: jis0208<<14 | 0x41<<7 | 0x04, 30337 - 19968: jis0212<<14 | 0x2D<<7 | 0x14, 30338 - 19968: jis0208<<14 | 0x5A<<7 | 0x14, 30339 - 19968: jis0208<<14 | 0x41<<7 | 0x05, 30340 - 19968: jis0208<<14 | 0x24<<7 | 0x09, 30341 - 19968: jis0212<<14 | 0x2D<<7 | 0x15, 30342 - 19968: jis0208<<14 | 0x12<<7 | 0x06, 30343 - 19968: jis0208<<14 | 0x18<<7 | 0x23, 30344 - 19968: jis0208<<14 | 0x41<<7 | 0x06, 30347 - 19968: jis0208<<14 | 0x41<<7 | 0x07, 30348 - 19968: jis0212<<14 | 0x2D<<7 | 0x16, 30349 - 19968: jis0212<<14 | 0x2D<<7 | 0x17, 30350 - 19968: jis0208<<14 | 0x41<<7 | 0x08, 30352 - 19968: jis0208<<14 | 0x1A<<7 | 0x08, 30355 - 19968: jis0208<<14 | 0x41<<7 | 0x0A, 30357 - 19968: jis0212<<14 | 0x2D<<7 | 0x18, 30358 - 19968: jis0208<<14 | 0x41<<7 | 0x09, 30361 - 19968: jis0208<<14 | 0x41<<7 | 0x0B, 30362 - 19968: jis0208<<14 | 0x41<<7 | 0x0C, 30363 - 19968: jis0208<<14 | 0x5A<<7 | 0x17, 30364 - 19968: jis0208<<14 | 0x5A<<7 | 0x15, 30365 - 19968: jis0212<<14 | 0x2D<<7 | 0x1B, 30366 - 19968: jis0208<<14 | 0x5A<<7 | 0x16, 30367 - 19968: jis0212<<14 | 0x2D<<7 | 0x1C, 30368 - 19968: jis0212<<14 | 0x2D<<7 | 0x1D, 30370 - 19968: jis0212<<14 | 0x2D<<7 | 0x1E, 30371 - 19968: jis0212<<14 | 0x2D<<7 | 0x1F, 30372 - 19968: jis0212<<14 | 0x2D<<7 | 0x20, 30373 - 19968: jis0212<<14 | 0x2D<<7 | 0x21, 30374 - 19968: jis0208<<14 | 0x5A<<7 | 0x18, 30375 - 19968: jis0212<<14 | 0x2D<<7 | 0x23, 30376 - 19968: jis0212<<14 | 0x2D<<7 | 0x24, 30378 - 19968: jis0212<<14 | 0x2D<<7 | 0x25, 30381 - 19968: jis0212<<14 | 0x2D<<7 | 0x26, 30382 - 19968: jis0208<<14 | 0x27<<7 | 0x48, 30384 - 19968: jis0208<<14 | 0x41<<7 | 0x0D, 30388 - 19968: jis0208<<14 | 0x41<<7 | 0x0E, 30391 - 19968: jis0208<<14 | 0x52<<7 | 0x48, 30392 - 19968: jis0208<<14 | 0x41<<7 | 0x0F, 30393 - 19968: jis0208<<14 | 0x41<<7 | 0x10, 30394 - 19968: jis0208<<14 | 0x41<<7 | 0x11, 30397 - 19968: jis0212<<14 | 0x2D<<7 | 0x27, 30399 - 19968: jis0208<<14 | 0x1A<<7 | 0x0D, 30401 - 19968: jis0212<<14 | 0x2D<<7 | 0x28, 30402 - 19968: jis0208<<14 | 0x41<<7 | 0x12, 30403 - 19968: jis0208<<14 | 0x26<<7 | 0x35, 30405 - 19968: jis0212<<14 | 0x2D<<7 | 0x29, 30406 - 19968: jis0208<<14 | 0x2A<<7 | 0x3E, 30408 - 19968: jis0208<<14 | 0x10<<7 | 0x2D, 30409 - 19968: jis0212<<14 | 0x2D<<7 | 0x2A, 30410 - 19968: jis0208<<14 | 0x10<<7 | 0x36, 30411 - 19968: jis0212<<14 | 0x2D<<7 | 0x2B, 30412 - 19968: jis0212<<14 | 0x2D<<7 | 0x2C, 30413 - 19968: jis0208<<14 | 0x41<<7 | 0x13, 30414 - 19968: jis0212<<14 | 0x2D<<7 | 0x2D, 30418 - 19968: jis0208<<14 | 0x41<<7 | 0x15, 30420 - 19968: jis0212<<14 | 0x2D<<7 | 0x2E, 30422 - 19968: jis0208<<14 | 0x41<<7 | 0x14, 30423 - 19968: jis0208<<14 | 0x24<<7 | 0x4F, 30425 - 19968: jis0212<<14 | 0x2D<<7 | 0x2F, 30427 - 19968: jis0208<<14 | 0x1F<<7 | 0x18, 30428 - 19968: jis0208<<14 | 0x3C<<7 | 0x18, 30430 - 19968: jis0208<<14 | 0x41<<7 | 0x16, 30431 - 19968: jis0208<<14 | 0x2B<<7 | 0x20, 30432 - 19968: jis0212<<14 | 0x2D<<7 | 0x30, 30433 - 19968: jis0208<<14 | 0x41<<7 | 0x17, 30435 - 19968: jis0208<<14 | 0x13<<7 | 0x25, 30436 - 19968: jis0208<<14 | 0x27<<7 | 0x36, 30437 - 19968: jis0208<<14 | 0x41<<7 | 0x18, 30438 - 19968: jis0212<<14 | 0x2D<<7 | 0x31, 30439 - 19968: jis0208<<14 | 0x41<<7 | 0x19, 30440 - 19968: jis0212<<14 | 0x2D<<7 | 0x32, 30442 - 19968: jis0208<<14 | 0x41<<7 | 0x1A, 30444 - 19968: jis0212<<14 | 0x2D<<7 | 0x33, 30446 - 19968: jis0208<<14 | 0x2B<<7 | 0x3B, 30448 - 19968: jis0212<<14 | 0x2D<<7 | 0x34, 30449 - 19968: jis0212<<14 | 0x2D<<7 | 0x35, 30450 - 19968: jis0208<<14 | 0x2B<<7 | 0x34, 30452 - 19968: jis0208<<14 | 0x23<<7 | 0x1D, 30454 - 19968: jis0212<<14 | 0x2D<<7 | 0x36, 30456 - 19968: jis0208<<14 | 0x20<<7 | 0x49, 30457 - 19968: jis0212<<14 | 0x2D<<7 | 0x37, 30459 - 19968: jis0208<<14 | 0x41<<7 | 0x1C, 30460 - 19968: jis0212<<14 | 0x2D<<7 | 0x38, 30462 - 19968: jis0208<<14 | 0x1C<<7 | 0x41, 30464 - 19968: jis0212<<14 | 0x2D<<7 | 0x39, 30465 - 19968: jis0208<<14 | 0x1D<<7 | 0x29, 30468 - 19968: jis0208<<14 | 0x41<<7 | 0x1F, 30470 - 19968: jis0212<<14 | 0x2D<<7 | 0x3A, 30471 - 19968: jis0208<<14 | 0x41<<7 | 0x1E, 30472 - 19968: jis0208<<14 | 0x41<<7 | 0x1D, 30473 - 19968: jis0208<<14 | 0x27<<7 | 0x5C, 30474 - 19968: jis0212<<14 | 0x2D<<7 | 0x3B, 30475 - 19968: jis0208<<14 | 0x13<<7 | 0x26, 30476 - 19968: jis0208<<14 | 0x17<<7 | 0x08, 30478 - 19968: jis0212<<14 | 0x2D<<7 | 0x3C, 30482 - 19968: jis0212<<14 | 0x2D<<7 | 0x3D, 30484 - 19968: jis0212<<14 | 0x2D<<7 | 0x3E, 30485 - 19968: jis0212<<14 | 0x2D<<7 | 0x3F, 30487 - 19968: jis0212<<14 | 0x2D<<7 | 0x40, 30489 - 19968: jis0212<<14 | 0x2D<<7 | 0x41, 30490 - 19968: jis0212<<14 | 0x2D<<7 | 0x42, 30491 - 19968: jis0208<<14 | 0x41<<7 | 0x25, 30492 - 19968: jis0212<<14 | 0x2D<<7 | 0x43, 30494 - 19968: jis0208<<14 | 0x41<<7 | 0x22, 30495 - 19968: jis0208<<14 | 0x1E<<7 | 0x1E, 30496 - 19968: jis0208<<14 | 0x2B<<7 | 0x11, 30498 - 19968: jis0212<<14 | 0x2D<<7 | 0x44, 30500 - 19968: jis0208<<14 | 0x41<<7 | 0x21, 30501 - 19968: jis0208<<14 | 0x41<<7 | 0x23, 30502 - 19968: jis0208<<14 | 0x41<<7 | 0x24, 30504 - 19968: jis0212<<14 | 0x2D<<7 | 0x45, 30505 - 19968: jis0208<<14 | 0x41<<7 | 0x20, 30509 - 19968: jis0212<<14 | 0x2D<<7 | 0x46, 30510 - 19968: jis0212<<14 | 0x2D<<7 | 0x47, 30511 - 19968: jis0212<<14 | 0x2D<<7 | 0x48, 30516 - 19968: jis0212<<14 | 0x2D<<7 | 0x49, 30517 - 19968: jis0212<<14 | 0x2D<<7 | 0x4A, 30518 - 19968: jis0212<<14 | 0x2D<<7 | 0x4B, 30519 - 19968: jis0208<<14 | 0x41<<7 | 0x26, 30520 - 19968: jis0208<<14 | 0x41<<7 | 0x27, 30521 - 19968: jis0212<<14 | 0x2D<<7 | 0x4C, 30522 - 19968: jis0208<<14 | 0x23<<7 | 0x0E, 30524 - 19968: jis0208<<14 | 0x13<<7 | 0x42, 30525 - 19968: jis0212<<14 | 0x2D<<7 | 0x4D, 30526 - 19968: jis0212<<14 | 0x2D<<7 | 0x4E, 30528 - 19968: jis0208<<14 | 0x22<<7 | 0x44, 30530 - 19968: jis0212<<14 | 0x2D<<7 | 0x4F, 30533 - 19968: jis0212<<14 | 0x2D<<7 | 0x50, 30534 - 19968: jis0208<<14 | 0x5A<<7 | 0x1A, 30535 - 19968: jis0208<<14 | 0x41<<7 | 0x28, 30538 - 19968: jis0212<<14 | 0x2D<<7 | 0x52, 30541 - 19968: jis0212<<14 | 0x2D<<7 | 0x53, 30542 - 19968: jis0212<<14 | 0x2D<<7 | 0x54, 30543 - 19968: jis0212<<14 | 0x2D<<7 | 0x55, 30546 - 19968: jis0212<<14 | 0x2D<<7 | 0x56, 30550 - 19968: jis0212<<14 | 0x2D<<7 | 0x57, 30551 - 19968: jis0212<<14 | 0x2D<<7 | 0x58, 30554 - 19968: jis0208<<14 | 0x41<<7 | 0x29, 30555 - 19968: jis0208<<14 | 0x41<<7 | 0x2C, 30556 - 19968: jis0212<<14 | 0x2D<<7 | 0x59, 30558 - 19968: jis0212<<14 | 0x2D<<7 | 0x5A, 30559 - 19968: jis0212<<14 | 0x2D<<7 | 0x5B, 30560 - 19968: jis0212<<14 | 0x2D<<7 | 0x5C, 30561 - 19968: jis0208<<14 | 0x1E<<7 | 0x46, 30562 - 19968: jis0212<<14 | 0x2D<<7 | 0x5D, 30563 - 19968: jis0208<<14 | 0x25<<7 | 0x23, 30564 - 19968: jis0212<<14 | 0x2E<<7 | 0x00, 30565 - 19968: jis0208<<14 | 0x41<<7 | 0x2D, 30566 - 19968: jis0208<<14 | 0x2A<<7 | 0x32, 30567 - 19968: jis0212<<14 | 0x2E<<7 | 0x01, 30568 - 19968: jis0208<<14 | 0x41<<7 | 0x2A, 30570 - 19968: jis0212<<14 | 0x2E<<7 | 0x02, 30571 - 19968: jis0208<<14 | 0x41<<7 | 0x2B, 30572 - 19968: jis0212<<14 | 0x2E<<7 | 0x03, 30576 - 19968: jis0212<<14 | 0x2E<<7 | 0x04, 30578 - 19968: jis0212<<14 | 0x2E<<7 | 0x05, 30579 - 19968: jis0212<<14 | 0x2E<<7 | 0x06, 30580 - 19968: jis0212<<14 | 0x2E<<7 | 0x07, 30585 - 19968: jis0208<<14 | 0x41<<7 | 0x30, 30586 - 19968: jis0212<<14 | 0x2E<<7 | 0x08, 30589 - 19968: jis0212<<14 | 0x2E<<7 | 0x09, 30590 - 19968: jis0208<<14 | 0x41<<7 | 0x2F, 30591 - 19968: jis0208<<14 | 0x41<<7 | 0x2E, 30592 - 19968: jis0212<<14 | 0x2E<<7 | 0x0A, 30596 - 19968: jis0212<<14 | 0x2E<<7 | 0x0B, 30603 - 19968: jis0208<<14 | 0x41<<7 | 0x32, 30604 - 19968: jis0212<<14 | 0x2E<<7 | 0x0C, 30605 - 19968: jis0212<<14 | 0x2E<<7 | 0x0D, 30606 - 19968: jis0208<<14 | 0x41<<7 | 0x31, 30609 - 19968: jis0208<<14 | 0x41<<7 | 0x33, 30612 - 19968: jis0212<<14 | 0x2E<<7 | 0x0E, 30613 - 19968: jis0212<<14 | 0x2E<<7 | 0x0F, 30614 - 19968: jis0212<<14 | 0x2E<<7 | 0x10, 30618 - 19968: jis0212<<14 | 0x2E<<7 | 0x11, 30622 - 19968: jis0208<<14 | 0x41<<7 | 0x35, 30623 - 19968: jis0212<<14 | 0x2E<<7 | 0x12, 30624 - 19968: jis0208<<14 | 0x41<<7 | 0x34, 30626 - 19968: jis0212<<14 | 0x2E<<7 | 0x13, 30629 - 19968: jis0208<<14 | 0x29<<7 | 0x2C, 30631 - 19968: jis0212<<14 | 0x2E<<7 | 0x14, 30634 - 19968: jis0212<<14 | 0x2E<<7 | 0x15, 30636 - 19968: jis0208<<14 | 0x1C<<7 | 0x35, 30637 - 19968: jis0208<<14 | 0x2D<<7 | 0x25, 30638 - 19968: jis0212<<14 | 0x2E<<7 | 0x16, 30639 - 19968: jis0212<<14 | 0x2E<<7 | 0x17, 30640 - 19968: jis0208<<14 | 0x41<<7 | 0x36, 30641 - 19968: jis0212<<14 | 0x2E<<7 | 0x18, 30643 - 19968: jis0208<<14 | 0x25<<7 | 0x16, 30645 - 19968: jis0212<<14 | 0x2E<<7 | 0x19, 30646 - 19968: jis0208<<14 | 0x41<<7 | 0x37, 30649 - 19968: jis0208<<14 | 0x41<<7 | 0x38, 30651 - 19968: jis0208<<14 | 0x41<<7 | 0x3C, 30652 - 19968: jis0208<<14 | 0x41<<7 | 0x3A, 30653 - 19968: jis0208<<14 | 0x41<<7 | 0x3B, 30654 - 19968: jis0212<<14 | 0x2E<<7 | 0x1A, 30655 - 19968: jis0208<<14 | 0x41<<7 | 0x39, 30659 - 19968: jis0212<<14 | 0x2E<<7 | 0x1B, 30663 - 19968: jis0208<<14 | 0x41<<7 | 0x3D, 30665 - 19968: jis0212<<14 | 0x2E<<7 | 0x1C, 30669 - 19968: jis0208<<14 | 0x41<<7 | 0x3E, 30673 - 19968: jis0212<<14 | 0x2E<<7 | 0x1D, 30674 - 19968: jis0212<<14 | 0x2E<<7 | 0x1E, 30677 - 19968: jis0212<<14 | 0x2E<<7 | 0x1F, 30679 - 19968: jis0208<<14 | 0x41<<7 | 0x3F, 30681 - 19968: jis0212<<14 | 0x2E<<7 | 0x20, 30682 - 19968: jis0208<<14 | 0x41<<7 | 0x40, 30683 - 19968: jis0208<<14 | 0x2B<<7 | 0x16, 30684 - 19968: jis0208<<14 | 0x41<<7 | 0x41, 30686 - 19968: jis0212<<14 | 0x2E<<7 | 0x21, 30687 - 19968: jis0212<<14 | 0x2E<<7 | 0x22, 30688 - 19968: jis0212<<14 | 0x2E<<7 | 0x23, 30690 - 19968: jis0208<<14 | 0x2B<<7 | 0x4F, 30691 - 19968: jis0208<<14 | 0x41<<7 | 0x42, 30692 - 19968: jis0212<<14 | 0x2E<<7 | 0x24, 30693 - 19968: jis0208<<14 | 0x22<<7 | 0x2D, 30694 - 19968: jis0212<<14 | 0x2E<<7 | 0x25, 30695 - 19968: jis0208<<14 | 0x26<<7 | 0x49, 30697 - 19968: jis0208<<14 | 0x15<<7 | 0x4A, 30698 - 19968: jis0212<<14 | 0x2E<<7 | 0x26, 30700 - 19968: jis0212<<14 | 0x2E<<7 | 0x27, 30701 - 19968: jis0208<<14 | 0x22<<7 | 0x1A, 30702 - 19968: jis0208<<14 | 0x41<<7 | 0x43, 30703 - 19968: jis0208<<14 | 0x15<<7 | 0x19, 30704 - 19968: jis0212<<14 | 0x2E<<7 | 0x28, 30705 - 19968: jis0212<<14 | 0x2E<<7 | 0x29, 30707 - 19968: jis0208<<14 | 0x1F<<7 | 0x2F, 30708 - 19968: jis0212<<14 | 0x2E<<7 | 0x2A, 30712 - 19968: jis0212<<14 | 0x2E<<7 | 0x2B, 30715 - 19968: jis0212<<14 | 0x2E<<7 | 0x2C, 30716 - 19968: jis0208<<14 | 0x41<<7 | 0x44, 30722 - 19968: jis0208<<14 | 0x19<<7 | 0x1C, 30725 - 19968: jis0212<<14 | 0x2E<<7 | 0x2D, 30726 - 19968: jis0212<<14 | 0x2E<<7 | 0x2E, 30729 - 19968: jis0212<<14 | 0x2E<<7 | 0x2F, 30732 - 19968: jis0208<<14 | 0x41<<7 | 0x45, 30733 - 19968: jis0212<<14 | 0x2E<<7 | 0x30, 30734 - 19968: jis0212<<14 | 0x2E<<7 | 0x31, 30737 - 19968: jis0212<<14 | 0x2E<<7 | 0x32, 30738 - 19968: jis0208<<14 | 0x41<<7 | 0x46, 30740 - 19968: jis0208<<14 | 0x17<<7 | 0x05, 30741 - 19968: jis0208<<14 | 0x19<<7 | 0x34, 30749 - 19968: jis0212<<14 | 0x2E<<7 | 0x33, 30752 - 19968: jis0208<<14 | 0x41<<7 | 0x48, 30753 - 19968: jis0208<<14 | 0x5A<<7 | 0x1C, 30754 - 19968: jis0212<<14 | 0x2E<<7 | 0x35, 30755 - 19968: jis0212<<14 | 0x2E<<7 | 0x36, 30757 - 19968: jis0208<<14 | 0x24<<7 | 0x35, 30758 - 19968: jis0208<<14 | 0x19<<7 | 0x35, 30759 - 19968: jis0208<<14 | 0x14<<7 | 0x2D, 30765 - 19968: jis0212<<14 | 0x2E<<7 | 0x37, 30766 - 19968: jis0212<<14 | 0x2E<<7 | 0x38, 30768 - 19968: jis0212<<14 | 0x2E<<7 | 0x39, 30770 - 19968: jis0208<<14 | 0x2A<<7 | 0x03, 30772 - 19968: jis0208<<14 | 0x26<<7 | 0x2A, 30773 - 19968: jis0212<<14 | 0x2E<<7 | 0x3A, 30775 - 19968: jis0212<<14 | 0x2E<<7 | 0x3B, 30778 - 19968: jis0208<<14 | 0x24<<7 | 0x36, 30783 - 19968: jis0208<<14 | 0x18<<7 | 0x3B, 30787 - 19968: jis0212<<14 | 0x2E<<7 | 0x3C, 30788 - 19968: jis0212<<14 | 0x2E<<7 | 0x3D, 30789 - 19968: jis0208<<14 | 0x41<<7 | 0x4A, 30791 - 19968: jis0212<<14 | 0x2E<<7 | 0x3E, 30792 - 19968: jis0212<<14 | 0x2E<<7 | 0x3F, 30796 - 19968: jis0212<<14 | 0x2E<<7 | 0x40, 30798 - 19968: jis0208<<14 | 0x5A<<7 | 0x1D, 30802 - 19968: jis0212<<14 | 0x2E<<7 | 0x42, 30812 - 19968: jis0212<<14 | 0x2E<<7 | 0x43, 30813 - 19968: jis0208<<14 | 0x1D<<7 | 0x2A, 30814 - 19968: jis0212<<14 | 0x2E<<7 | 0x44, 30816 - 19968: jis0212<<14 | 0x2E<<7 | 0x45, 30817 - 19968: jis0212<<14 | 0x2E<<7 | 0x46, 30819 - 19968: jis0212<<14 | 0x2E<<7 | 0x47, 30820 - 19968: jis0208<<14 | 0x5A<<7 | 0x1E, 30824 - 19968: jis0212<<14 | 0x2E<<7 | 0x49, 30826 - 19968: jis0212<<14 | 0x2E<<7 | 0x4A, 30827 - 19968: jis0208<<14 | 0x2D<<7 | 0x11, 30828 - 19968: jis0208<<14 | 0x18<<7 | 0x24, 30830 - 19968: jis0212<<14 | 0x2E<<7 | 0x4B, 30831 - 19968: jis0208<<14 | 0x17<<7 | 0x06, 30834 - 19968: jis0208<<14 | 0x27<<7 | 0x02, 30836 - 19968: jis0208<<14 | 0x41<<7 | 0x4C, 30842 - 19968: jis0208<<14 | 0x5A<<7 | 0x1F, 30844 - 19968: jis0208<<14 | 0x41<<7 | 0x4E, 30846 - 19968: jis0212<<14 | 0x2E<<7 | 0x4D, 30849 - 19968: jis0208<<14 | 0x17<<7 | 0x4A, 30854 - 19968: jis0208<<14 | 0x41<<7 | 0x4D, 30855 - 19968: jis0208<<14 | 0x23<<7 | 0x55, 30858 - 19968: jis0212<<14 | 0x2E<<7 | 0x4E, 30860 - 19968: jis0208<<14 | 0x41<<7 | 0x50, 30861 - 19968: jis0208<<14 | 0x12<<7 | 0x16, 30862 - 19968: jis0208<<14 | 0x41<<7 | 0x4B, 30863 - 19968: jis0212<<14 | 0x2E<<7 | 0x4F, 30865 - 19968: jis0208<<14 | 0x27<<7 | 0x49, 30867 - 19968: jis0208<<14 | 0x10<<7 | 0x0F, 30868 - 19968: jis0212<<14 | 0x2E<<7 | 0x50, 30869 - 19968: jis0208<<14 | 0x19<<7 | 0x4B, 30871 - 19968: jis0208<<14 | 0x2E<<7 | 0x31, 30872 - 19968: jis0212<<14 | 0x2E<<7 | 0x51, 30874 - 19968: jis0208<<14 | 0x41<<7 | 0x4F, 30877 - 19968: jis0212<<14 | 0x2E<<7 | 0x53, 30878 - 19968: jis0212<<14 | 0x2E<<7 | 0x54, 30879 - 19968: jis0212<<14 | 0x2E<<7 | 0x55, 30881 - 19968: jis0212<<14 | 0x2E<<7 | 0x52, 30883 - 19968: jis0208<<14 | 0x41<<7 | 0x51, 30884 - 19968: jis0212<<14 | 0x2E<<7 | 0x56, 30887 - 19968: jis0208<<14 | 0x29<<7 | 0x2A, 30888 - 19968: jis0212<<14 | 0x2E<<7 | 0x57, 30889 - 19968: jis0208<<14 | 0x1F<<7 | 0x38, 30890 - 19968: jis0208<<14 | 0x41<<7 | 0x53, 30892 - 19968: jis0212<<14 | 0x2E<<7 | 0x58, 30893 - 19968: jis0212<<14 | 0x2E<<7 | 0x59, 30895 - 19968: jis0208<<14 | 0x41<<7 | 0x54, 30896 - 19968: jis0212<<14 | 0x2E<<7 | 0x5A, 30897 - 19968: jis0212<<14 | 0x2E<<7 | 0x5B, 30898 - 19968: jis0212<<14 | 0x2E<<7 | 0x5C, 30899 - 19968: jis0212<<14 | 0x2E<<7 | 0x5D, 30901 - 19968: jis0208<<14 | 0x41<<7 | 0x52, 30906 - 19968: jis0208<<14 | 0x12<<7 | 0x2D, 30907 - 19968: jis0212<<14 | 0x2F<<7 | 0x00, 30908 - 19968: jis0208<<14 | 0x41<<7 | 0x5A, 30909 - 19968: jis0212<<14 | 0x2F<<7 | 0x01, 30910 - 19968: jis0208<<14 | 0x41<<7 | 0x59, 30911 - 19968: jis0212<<14 | 0x2F<<7 | 0x02, 30913 - 19968: jis0208<<14 | 0x1B<<7 | 0x06, 30917 - 19968: jis0208<<14 | 0x41<<7 | 0x5B, 30918 - 19968: jis0208<<14 | 0x41<<7 | 0x56, 30919 - 19968: jis0212<<14 | 0x2F<<7 | 0x03, 30920 - 19968: jis0212<<14 | 0x2F<<7 | 0x04, 30921 - 19968: jis0212<<14 | 0x2F<<7 | 0x05, 30922 - 19968: jis0208<<14 | 0x41<<7 | 0x5C, 30923 - 19968: jis0208<<14 | 0x41<<7 | 0x57, 30924 - 19968: jis0212<<14 | 0x2F<<7 | 0x06, 30926 - 19968: jis0212<<14 | 0x2F<<7 | 0x07, 30928 - 19968: jis0208<<14 | 0x27<<7 | 0x37, 30929 - 19968: jis0208<<14 | 0x41<<7 | 0x55, 30930 - 19968: jis0212<<14 | 0x2F<<7 | 0x08, 30931 - 19968: jis0212<<14 | 0x2F<<7 | 0x09, 30932 - 19968: jis0208<<14 | 0x41<<7 | 0x58, 30933 - 19968: jis0212<<14 | 0x2F<<7 | 0x0A, 30934 - 19968: jis0212<<14 | 0x2F<<7 | 0x0B, 30938 - 19968: jis0208<<14 | 0x42<<7 | 0x01, 30939 - 19968: jis0212<<14 | 0x2F<<7 | 0x0D, 30943 - 19968: jis0212<<14 | 0x2F<<7 | 0x0E, 30944 - 19968: jis0212<<14 | 0x2F<<7 | 0x0F, 30945 - 19968: jis0212<<14 | 0x2F<<7 | 0x10, 30948 - 19968: jis0212<<14 | 0x2F<<7 | 0x0C, 30950 - 19968: jis0212<<14 | 0x2F<<7 | 0x11, 30951 - 19968: jis0208<<14 | 0x42<<7 | 0x00, 30952 - 19968: jis0208<<14 | 0x2A<<7 | 0x40, 30954 - 19968: jis0212<<14 | 0x2F<<7 | 0x12, 30956 - 19968: jis0208<<14 | 0x41<<7 | 0x5D, 30959 - 19968: jis0208<<14 | 0x0F<<7 | 0x4A, 30962 - 19968: jis0212<<14 | 0x2F<<7 | 0x13, 30963 - 19968: jis0212<<14 | 0x2F<<7 | 0x14, 30964 - 19968: jis0208<<14 | 0x42<<7 | 0x03, 30966 - 19968: jis0212<<14 | 0x2F<<7 | 0x16, 30967 - 19968: jis0212<<14 | 0x2F<<7 | 0x17, 30970 - 19968: jis0212<<14 | 0x2F<<7 | 0x18, 30971 - 19968: jis0212<<14 | 0x2F<<7 | 0x19, 30973 - 19968: jis0208<<14 | 0x42<<7 | 0x02, 30975 - 19968: jis0212<<14 | 0x2F<<7 | 0x1A, 30976 - 19968: jis0212<<14 | 0x2F<<7 | 0x15, 30977 - 19968: jis0208<<14 | 0x1D<<7 | 0x2B, 30982 - 19968: jis0212<<14 | 0x2F<<7 | 0x1B, 30983 - 19968: jis0208<<14 | 0x42<<7 | 0x04, 30988 - 19968: jis0212<<14 | 0x2F<<7 | 0x1C, 30990 - 19968: jis0208<<14 | 0x20<<7 | 0x22, 30992 - 19968: jis0212<<14 | 0x2F<<7 | 0x1D, 30993 - 19968: jis0208<<14 | 0x42<<7 | 0x06, 30994 - 19968: jis0208<<14 | 0x42<<7 | 0x05, 31001 - 19968: jis0208<<14 | 0x42<<7 | 0x07, 31002 - 19968: jis0212<<14 | 0x2F<<7 | 0x1E, 31004 - 19968: jis0212<<14 | 0x2F<<7 | 0x1F, 31006 - 19968: jis0212<<14 | 0x2F<<7 | 0x20, 31007 - 19968: jis0212<<14 | 0x2F<<7 | 0x21, 31008 - 19968: jis0212<<14 | 0x2F<<7 | 0x22, 31013 - 19968: jis0212<<14 | 0x2F<<7 | 0x23, 31014 - 19968: jis0208<<14 | 0x41<<7 | 0x47, 31015 - 19968: jis0212<<14 | 0x2F<<7 | 0x24, 31017 - 19968: jis0212<<14 | 0x2F<<7 | 0x25, 31018 - 19968: jis0208<<14 | 0x41<<7 | 0x49, 31019 - 19968: jis0208<<14 | 0x42<<7 | 0x09, 31020 - 19968: jis0208<<14 | 0x42<<7 | 0x08, 31021 - 19968: jis0212<<14 | 0x2F<<7 | 0x26, 31024 - 19968: jis0208<<14 | 0x5A<<7 | 0x20, 31025 - 19968: jis0212<<14 | 0x2F<<7 | 0x27, 31028 - 19968: jis0212<<14 | 0x2F<<7 | 0x28, 31029 - 19968: jis0212<<14 | 0x2F<<7 | 0x29, 31034 - 19968: jis0208<<14 | 0x1B<<7 | 0x07, 31035 - 19968: jis0212<<14 | 0x2F<<7 | 0x2A, 31036 - 19968: jis0208<<14 | 0x2D<<7 | 0x48, 31037 - 19968: jis0212<<14 | 0x2F<<7 | 0x2B, 31038 - 19968: jis0208<<14 | 0x1B<<7 | 0x31, 31039 - 19968: jis0212<<14 | 0x2F<<7 | 0x2C, 31040 - 19968: jis0208<<14 | 0x42<<7 | 0x0A, 31041 - 19968: jis0208<<14 | 0x16<<7 | 0x16, 31044 - 19968: jis0212<<14 | 0x2F<<7 | 0x2D, 31045 - 19968: jis0212<<14 | 0x2F<<7 | 0x2E, 31046 - 19968: jis0212<<14 | 0x2F<<7 | 0x2F, 31047 - 19968: jis0208<<14 | 0x14<<7 | 0x1F, 31048 - 19968: jis0208<<14 | 0x14<<7 | 0x06, 31049 - 19968: jis0208<<14 | 0x1A<<7 | 0x42, 31050 - 19968: jis0212<<14 | 0x2F<<7 | 0x30, 31051 - 19968: jis0212<<14 | 0x2F<<7 | 0x31, 31055 - 19968: jis0212<<14 | 0x2F<<7 | 0x32, 31056 - 19968: jis0208<<14 | 0x2C<<7 | 0x13, 31057 - 19968: jis0212<<14 | 0x2F<<7 | 0x33, 31059 - 19968: jis0208<<14 | 0x42<<7 | 0x10, 31060 - 19968: jis0212<<14 | 0x2F<<7 | 0x34, 31061 - 19968: jis0208<<14 | 0x42<<7 | 0x0F, 31062 - 19968: jis0208<<14 | 0x20<<7 | 0x23, 31063 - 19968: jis0208<<14 | 0x42<<7 | 0x0C, 31064 - 19968: jis0212<<14 | 0x2F<<7 | 0x35, 31066 - 19968: jis0208<<14 | 0x42<<7 | 0x0E, 31067 - 19968: jis0212<<14 | 0x2F<<7 | 0x36, 31068 - 19968: jis0212<<14 | 0x2F<<7 | 0x37, 31069 - 19968: jis0208<<14 | 0x1C<<7 | 0x2A, 31070 - 19968: jis0208<<14 | 0x1E<<7 | 0x1F, 31071 - 19968: jis0208<<14 | 0x42<<7 | 0x0D, 31072 - 19968: jis0208<<14 | 0x42<<7 | 0x0B, 31074 - 19968: jis0208<<14 | 0x26<<7 | 0x09, 31077 - 19968: jis0208<<14 | 0x1D<<7 | 0x2C, 31079 - 19968: jis0212<<14 | 0x2F<<7 | 0x38, 31080 - 19968: jis0208<<14 | 0x28<<7 | 0x1B, 31081 - 19968: jis0212<<14 | 0x2F<<7 | 0x39, 31083 - 19968: jis0212<<14 | 0x2F<<7 | 0x3A, 31085 - 19968: jis0208<<14 | 0x19<<7 | 0x36, 31090 - 19968: jis0212<<14 | 0x2F<<7 | 0x3B, 31095 - 19968: jis0208<<14 | 0x24<<7 | 0x57, 31097 - 19968: jis0212<<14 | 0x2F<<7 | 0x3C, 31098 - 19968: jis0208<<14 | 0x42<<7 | 0x11, 31099 - 19968: jis0212<<14 | 0x2F<<7 | 0x3D, 31100 - 19968: jis0212<<14 | 0x2F<<7 | 0x3E, 31102 - 19968: jis0212<<14 | 0x2F<<7 | 0x3F, 31103 - 19968: jis0208<<14 | 0x42<<7 | 0x12, 31104 - 19968: jis0208<<14 | 0x42<<7 | 0x28, 31105 - 19968: jis0208<<14 | 0x15<<7 | 0x37, 31108 - 19968: jis0208<<14 | 0x2E<<7 | 0x1C, 31109 - 19968: jis0208<<14 | 0x20<<7 | 0x14, 31114 - 19968: jis0208<<14 | 0x42<<7 | 0x13, 31115 - 19968: jis0212<<14 | 0x2F<<7 | 0x40, 31116 - 19968: jis0212<<14 | 0x2F<<7 | 0x41, 31117 - 19968: jis0208<<14 | 0x11<<7 | 0x31, 31118 - 19968: jis0208<<14 | 0x23<<7 | 0x56, 31119 - 19968: jis0208<<14 | 0x29<<7 | 0x00, 31121 - 19968: jis0212<<14 | 0x2F<<7 | 0x42, 31123 - 19968: jis0212<<14 | 0x2F<<7 | 0x43, 31124 - 19968: jis0208<<14 | 0x5A<<7 | 0x24, 31125 - 19968: jis0212<<14 | 0x2F<<7 | 0x45, 31126 - 19968: jis0212<<14 | 0x2F<<7 | 0x46, 31128 - 19968: jis0212<<14 | 0x2F<<7 | 0x47, 31131 - 19968: jis0208<<14 | 0x5A<<7 | 0x26, 31132 - 19968: jis0212<<14 | 0x2F<<7 | 0x49, 31133 - 19968: jis0208<<14 | 0x42<<7 | 0x14, 31137 - 19968: jis0212<<14 | 0x2F<<7 | 0x4A, 31142 - 19968: jis0208<<14 | 0x14<<7 | 0x59, 31143 - 19968: jis0208<<14 | 0x42<<7 | 0x15, 31144 - 19968: jis0212<<14 | 0x2F<<7 | 0x4B, 31145 - 19968: jis0212<<14 | 0x2F<<7 | 0x4C, 31146 - 19968: jis0208<<14 | 0x42<<7 | 0x17, 31147 - 19968: jis0212<<14 | 0x2F<<7 | 0x4D, 31150 - 19968: jis0208<<14 | 0x42<<7 | 0x18, 31151 - 19968: jis0212<<14 | 0x2F<<7 | 0x4E, 31152 - 19968: jis0208<<14 | 0x26<<7 | 0x08, 31153 - 19968: jis0212<<14 | 0x2F<<7 | 0x4F, 31155 - 19968: jis0208<<14 | 0x42<<7 | 0x19, 31156 - 19968: jis0212<<14 | 0x2F<<7 | 0x50, 31160 - 19968: jis0212<<14 | 0x2F<<7 | 0x51, 31161 - 19968: jis0208<<14 | 0x42<<7 | 0x1A, 31162 - 19968: jis0208<<14 | 0x42<<7 | 0x1B, 31163 - 19968: jis0212<<14 | 0x2F<<7 | 0x52, 31165 - 19968: jis0208<<14 | 0x15<<7 | 0x38, 31166 - 19968: jis0208<<14 | 0x11<<7 | 0x32, 31167 - 19968: jis0208<<14 | 0x25<<7 | 0x24, 31168 - 19968: jis0208<<14 | 0x1C<<7 | 0x07, 31169 - 19968: jis0208<<14 | 0x1A<<7 | 0x43, 31170 - 19968: jis0212<<14 | 0x2F<<7 | 0x53, 31172 - 19968: jis0212<<14 | 0x2F<<7 | 0x54, 31175 - 19968: jis0212<<14 | 0x2F<<7 | 0x55, 31176 - 19968: jis0212<<14 | 0x2F<<7 | 0x56, 31177 - 19968: jis0208<<14 | 0x42<<7 | 0x1C, 31178 - 19968: jis0212<<14 | 0x2F<<7 | 0x57, 31179 - 19968: jis0208<<14 | 0x1C<<7 | 0x08, 31183 - 19968: jis0212<<14 | 0x2F<<7 | 0x58, 31185 - 19968: jis0208<<14 | 0x11<<7 | 0x29, 31186 - 19968: jis0208<<14 | 0x28<<7 | 0x22, 31188 - 19968: jis0212<<14 | 0x2F<<7 | 0x59, 31189 - 19968: jis0208<<14 | 0x42<<7 | 0x1D, 31190 - 19968: jis0212<<14 | 0x2F<<7 | 0x5A, 31192 - 19968: jis0208<<14 | 0x27<<7 | 0x4A, 31194 - 19968: jis0212<<14 | 0x2F<<7 | 0x5B, 31197 - 19968: jis0212<<14 | 0x2F<<7 | 0x5C, 31198 - 19968: jis0212<<14 | 0x2F<<7 | 0x5D, 31199 - 19968: jis0208<<14 | 0x20<<7 | 0x24, 31200 - 19968: jis0212<<14 | 0x30<<7 | 0x00, 31201 - 19968: jis0208<<14 | 0x42<<7 | 0x20, 31202 - 19968: jis0212<<14 | 0x30<<7 | 0x01, 31203 - 19968: jis0208<<14 | 0x42<<7 | 0x21, 31204 - 19968: jis0208<<14 | 0x26<<7 | 0x48, 31205 - 19968: jis0212<<14 | 0x30<<7 | 0x02, 31206 - 19968: jis0208<<14 | 0x1E<<7 | 0x20, 31207 - 19968: jis0208<<14 | 0x42<<7 | 0x1E, 31209 - 19968: jis0208<<14 | 0x22<<7 | 0x40, 31210 - 19968: jis0212<<14 | 0x30<<7 | 0x03, 31211 - 19968: jis0212<<14 | 0x30<<7 | 0x04, 31212 - 19968: jis0208<<14 | 0x42<<7 | 0x1F, 31213 - 19968: jis0212<<14 | 0x30<<7 | 0x05, 31216 - 19968: jis0208<<14 | 0x1D<<7 | 0x2D, 31217 - 19968: jis0212<<14 | 0x30<<7 | 0x06, 31224 - 19968: jis0212<<14 | 0x30<<7 | 0x07, 31227 - 19968: jis0208<<14 | 0x0F<<7 | 0x3B, 31228 - 19968: jis0212<<14 | 0x30<<7 | 0x08, 31232 - 19968: jis0208<<14 | 0x14<<7 | 0x08, 31234 - 19968: jis0212<<14 | 0x30<<7 | 0x09, 31235 - 19968: jis0212<<14 | 0x30<<7 | 0x0A, 31239 - 19968: jis0212<<14 | 0x30<<7 | 0x0B, 31240 - 19968: jis0208<<14 | 0x42<<7 | 0x22, 31241 - 19968: jis0212<<14 | 0x30<<7 | 0x0C, 31242 - 19968: jis0212<<14 | 0x30<<7 | 0x0D, 31243 - 19968: jis0208<<14 | 0x23<<7 | 0x57, 31244 - 19968: jis0212<<14 | 0x30<<7 | 0x0E, 31245 - 19968: jis0208<<14 | 0x42<<7 | 0x23, 31246 - 19968: jis0208<<14 | 0x1F<<7 | 0x26, 31249 - 19968: jis0212<<14 | 0x30<<7 | 0x0F, 31252 - 19968: jis0208<<14 | 0x2B<<7 | 0x0C, 31253 - 19968: jis0212<<14 | 0x30<<7 | 0x10, 31255 - 19968: jis0208<<14 | 0x28<<7 | 0x02, 31256 - 19968: jis0208<<14 | 0x42<<7 | 0x24, 31257 - 19968: jis0208<<14 | 0x42<<7 | 0x25, 31258 - 19968: jis0208<<14 | 0x22<<7 | 0x34, 31259 - 19968: jis0212<<14 | 0x30<<7 | 0x11, 31260 - 19968: jis0208<<14 | 0x2D<<7 | 0x26, 31262 - 19968: jis0212<<14 | 0x30<<7 | 0x12, 31263 - 19968: jis0208<<14 | 0x42<<7 | 0x27, 31264 - 19968: jis0208<<14 | 0x42<<7 | 0x26, 31265 - 19968: jis0212<<14 | 0x30<<7 | 0x13, 31271 - 19968: jis0212<<14 | 0x30<<7 | 0x14, 31275 - 19968: jis0212<<14 | 0x30<<7 | 0x15, 31277 - 19968: jis0212<<14 | 0x30<<7 | 0x16, 31278 - 19968: jis0208<<14 | 0x1B<<7 | 0x4E, 31279 - 19968: jis0212<<14 | 0x30<<7 | 0x17, 31280 - 19968: jis0212<<14 | 0x30<<7 | 0x18, 31281 - 19968: jis0208<<14 | 0x42<<7 | 0x29, 31282 - 19968: jis0208<<14 | 0x0F<<7 | 0x4F, 31284 - 19968: jis0212<<14 | 0x30<<7 | 0x19, 31285 - 19968: jis0212<<14 | 0x30<<7 | 0x1A, 31287 - 19968: jis0208<<14 | 0x42<<7 | 0x2C, 31288 - 19968: jis0212<<14 | 0x30<<7 | 0x1B, 31289 - 19968: jis0212<<14 | 0x30<<7 | 0x1C, 31290 - 19968: jis0212<<14 | 0x30<<7 | 0x1D, 31291 - 19968: jis0208<<14 | 0x42<<7 | 0x2A, 31292 - 19968: jis0208<<14 | 0x11<<7 | 0x33, 31293 - 19968: jis0208<<14 | 0x16<<7 | 0x2D, 31294 - 19968: jis0208<<14 | 0x42<<7 | 0x2B, 31295 - 19968: jis0208<<14 | 0x18<<7 | 0x25, 31296 - 19968: jis0208<<14 | 0x18<<7 | 0x51, 31298 - 19968: jis0208<<14 | 0x29<<7 | 0x45, 31299 - 19968: jis0208<<14 | 0x42<<7 | 0x2D, 31300 - 19968: jis0212<<14 | 0x30<<7 | 0x1E, 31301 - 19968: jis0212<<14 | 0x30<<7 | 0x1F, 31302 - 19968: jis0208<<14 | 0x2A<<7 | 0x33, 31303 - 19968: jis0212<<14 | 0x30<<7 | 0x20, 31304 - 19968: jis0212<<14 | 0x30<<7 | 0x21, 31305 - 19968: jis0208<<14 | 0x42<<7 | 0x2F, 31308 - 19968: jis0212<<14 | 0x30<<7 | 0x22, 31309 - 19968: jis0208<<14 | 0x1F<<7 | 0x30, 31310 - 19968: jis0208<<14 | 0x10<<7 | 0x2E, 31311 - 19968: jis0208<<14 | 0x11<<7 | 0x19, 31312 - 19968: jis0208<<14 | 0x0F<<7 | 0x0B, 31317 - 19968: jis0212<<14 | 0x30<<7 | 0x23, 31318 - 19968: jis0212<<14 | 0x30<<7 | 0x24, 31319 - 19968: jis0208<<14 | 0x42<<7 | 0x2E, 31321 - 19968: jis0212<<14 | 0x30<<7 | 0x25, 31324 - 19968: jis0212<<14 | 0x30<<7 | 0x26, 31325 - 19968: jis0212<<14 | 0x30<<7 | 0x27, 31327 - 19968: jis0212<<14 | 0x30<<7 | 0x28, 31328 - 19968: jis0212<<14 | 0x30<<7 | 0x29, 31329 - 19968: jis0208<<14 | 0x42<<7 | 0x30, 31330 - 19968: jis0208<<14 | 0x42<<7 | 0x31, 31331 - 19968: jis0208<<14 | 0x1D<<7 | 0x56, 31333 - 19968: jis0212<<14 | 0x30<<7 | 0x2A, 31335 - 19968: jis0212<<14 | 0x30<<7 | 0x2B, 31337 - 19968: jis0208<<14 | 0x42<<7 | 0x32, 31338 - 19968: jis0212<<14 | 0x30<<7 | 0x2C, 31339 - 19968: jis0208<<14 | 0x12<<7 | 0x2E, 31341 - 19968: jis0212<<14 | 0x30<<7 | 0x2D, 31344 - 19968: jis0208<<14 | 0x42<<7 | 0x34, 31348 - 19968: jis0208<<14 | 0x16<<7 | 0x49, 31349 - 19968: jis0212<<14 | 0x30<<7 | 0x2E, 31350 - 19968: jis0208<<14 | 0x14<<7 | 0x45, 31352 - 19968: jis0212<<14 | 0x30<<7 | 0x2F, 31353 - 19968: jis0208<<14 | 0x42<<7 | 0x35, 31354 - 19968: jis0208<<14 | 0x15<<7 | 0x54, 31357 - 19968: jis0208<<14 | 0x42<<7 | 0x36, 31358 - 19968: jis0212<<14 | 0x30<<7 | 0x30, 31359 - 19968: jis0208<<14 | 0x1F<<7 | 0x5B, 31360 - 19968: jis0212<<14 | 0x30<<7 | 0x31, 31361 - 19968: jis0208<<14 | 0x25<<7 | 0x2C, 31362 - 19968: jis0212<<14 | 0x30<<7 | 0x32, 31363 - 19968: jis0208<<14 | 0x1F<<7 | 0x3F, 31364 - 19968: jis0208<<14 | 0x19<<7 | 0x54, 31365 - 19968: jis0212<<14 | 0x30<<7 | 0x33, 31366 - 19968: jis0212<<14 | 0x30<<7 | 0x34, 31368 - 19968: jis0208<<14 | 0x42<<7 | 0x37, 31370 - 19968: jis0212<<14 | 0x30<<7 | 0x35, 31371 - 19968: jis0212<<14 | 0x30<<7 | 0x36, 31376 - 19968: jis0212<<14 | 0x30<<7 | 0x37, 31377 - 19968: jis0212<<14 | 0x30<<7 | 0x38, 31378 - 19968: jis0208<<14 | 0x22<<7 | 0x41, 31379 - 19968: jis0208<<14 | 0x20<<7 | 0x4A, 31380 - 19968: jis0212<<14 | 0x30<<7 | 0x39, 31381 - 19968: jis0208<<14 | 0x42<<7 | 0x39, 31382 - 19968: jis0208<<14 | 0x42<<7 | 0x3B, 31383 - 19968: jis0208<<14 | 0x42<<7 | 0x38, 31384 - 19968: jis0208<<14 | 0x42<<7 | 0x3A, 31390 - 19968: jis0212<<14 | 0x30<<7 | 0x3A, 31391 - 19968: jis0208<<14 | 0x16<<7 | 0x01, 31392 - 19968: jis0212<<14 | 0x30<<7 | 0x3B, 31395 - 19968: jis0212<<14 | 0x30<<7 | 0x3C, 31401 - 19968: jis0208<<14 | 0x42<<7 | 0x3C, 31402 - 19968: jis0208<<14 | 0x16<<7 | 0x05, 31404 - 19968: jis0212<<14 | 0x30<<7 | 0x3D, 31406 - 19968: jis0208<<14 | 0x14<<7 | 0x46, 31407 - 19968: jis0208<<14 | 0x2C<<7 | 0x31, 31408 - 19968: jis0208<<14 | 0x42<<7 | 0x3E, 31411 - 19968: jis0212<<14 | 0x30<<7 | 0x3E, 31413 - 19968: jis0212<<14 | 0x30<<7 | 0x3F, 31414 - 19968: jis0208<<14 | 0x42<<7 | 0x3F, 31417 - 19968: jis0212<<14 | 0x30<<7 | 0x40, 31418 - 19968: jis0208<<14 | 0x10<<7 | 0x0D, 31419 - 19968: jis0212<<14 | 0x30<<7 | 0x41, 31420 - 19968: jis0212<<14 | 0x30<<7 | 0x42, 31423 - 19968: jis0208<<14 | 0x42<<7 | 0x42, 31427 - 19968: jis0208<<14 | 0x12<<7 | 0x55, 31428 - 19968: jis0208<<14 | 0x42<<7 | 0x41, 31429 - 19968: jis0208<<14 | 0x42<<7 | 0x40, 31430 - 19968: jis0212<<14 | 0x30<<7 | 0x43, 31431 - 19968: jis0208<<14 | 0x42<<7 | 0x44, 31432 - 19968: jis0208<<14 | 0x42<<7 | 0x3D, 31433 - 19968: jis0212<<14 | 0x30<<7 | 0x44, 31434 - 19968: jis0208<<14 | 0x42<<7 | 0x45, 31435 - 19968: jis0208<<14 | 0x2D<<7 | 0x08, 31436 - 19968: jis0212<<14 | 0x30<<7 | 0x45, 31437 - 19968: jis0208<<14 | 0x42<<7 | 0x46, 31438 - 19968: jis0212<<14 | 0x30<<7 | 0x46, 31439 - 19968: jis0208<<14 | 0x42<<7 | 0x47, 31441 - 19968: jis0208<<14 | 0x5A<<7 | 0x27, 31442 - 19968: jis0208<<14 | 0x33<<7 | 0x53, 31443 - 19968: jis0208<<14 | 0x42<<7 | 0x49, 31445 - 19968: jis0208<<14 | 0x42<<7 | 0x48, 31449 - 19968: jis0208<<14 | 0x42<<7 | 0x4A, 31450 - 19968: jis0208<<14 | 0x42<<7 | 0x4B, 31451 - 19968: jis0212<<14 | 0x30<<7 | 0x48, 31452 - 19968: jis0208<<14 | 0x2D<<7 | 0x14, 31453 - 19968: jis0208<<14 | 0x42<<7 | 0x4C, 31455 - 19968: jis0208<<14 | 0x4F<<7 | 0x4E, 31456 - 19968: jis0208<<14 | 0x1D<<7 | 0x2E, 31457 - 19968: jis0208<<14 | 0x42<<7 | 0x4D, 31458 - 19968: jis0208<<14 | 0x42<<7 | 0x4E, 31459 - 19968: jis0208<<14 | 0x1C<<7 | 0x36, 31461 - 19968: jis0208<<14 | 0x25<<7 | 0x17, 31462 - 19968: jis0208<<14 | 0x42<<7 | 0x4F, 31463 - 19968: jis0208<<14 | 0x5A<<7 | 0x28, 31464 - 19968: jis0212<<14 | 0x30<<7 | 0x49, 31465 - 19968: jis0212<<14 | 0x30<<7 | 0x4A, 31466 - 19968: jis0208<<14 | 0x22<<7 | 0x07, 31467 - 19968: jis0208<<14 | 0x5A<<7 | 0x2A, 31468 - 19968: jis0212<<14 | 0x30<<7 | 0x4C, 31469 - 19968: jis0208<<14 | 0x42<<7 | 0x50, 31471 - 19968: jis0208<<14 | 0x22<<7 | 0x1B, 31472 - 19968: jis0208<<14 | 0x42<<7 | 0x51, 31473 - 19968: jis0212<<14 | 0x30<<7 | 0x4D, 31476 - 19968: jis0212<<14 | 0x30<<7 | 0x4E, 31478 - 19968: jis0208<<14 | 0x15<<7 | 0x04, 31480 - 19968: jis0208<<14 | 0x30<<7 | 0x1E, 31481 - 19968: jis0208<<14 | 0x22<<7 | 0x3C, 31482 - 19968: jis0208<<14 | 0x1B<<7 | 0x12, 31483 - 19968: jis0212<<14 | 0x30<<7 | 0x4F, 31485 - 19968: jis0212<<14 | 0x30<<7 | 0x50, 31486 - 19968: jis0212<<14 | 0x30<<7 | 0x51, 31487 - 19968: jis0208<<14 | 0x13<<7 | 0x27, 31490 - 19968: jis0208<<14 | 0x42<<7 | 0x52, 31492 - 19968: jis0208<<14 | 0x43<<7 | 0x01, 31494 - 19968: jis0208<<14 | 0x42<<7 | 0x55, 31495 - 19968: jis0212<<14 | 0x30<<7 | 0x52, 31496 - 19968: jis0208<<14 | 0x14<<7 | 0x47, 31498 - 19968: jis0208<<14 | 0x42<<7 | 0x54, 31499 - 19968: jis0208<<14 | 0x43<<7 | 0x03, 31503 - 19968: jis0208<<14 | 0x42<<7 | 0x53, 31505 - 19968: jis0208<<14 | 0x1D<<7 | 0x2F, 31508 - 19968: jis0212<<14 | 0x30<<7 | 0x53, 31512 - 19968: jis0208<<14 | 0x42<<7 | 0x57, 31513 - 19968: jis0208<<14 | 0x42<<7 | 0x58, 31515 - 19968: jis0208<<14 | 0x24<<7 | 0x0A, 31518 - 19968: jis0208<<14 | 0x42<<7 | 0x59, 31519 - 19968: jis0212<<14 | 0x30<<7 | 0x54, 31520 - 19968: jis0208<<14 | 0x12<<7 | 0x3D, 31523 - 19968: jis0212<<14 | 0x30<<7 | 0x55, 31525 - 19968: jis0208<<14 | 0x1E<<7 | 0x39, 31526 - 19968: jis0208<<14 | 0x28<<7 | 0x43, 31527 - 19968: jis0212<<14 | 0x30<<7 | 0x56, 31528 - 19968: jis0208<<14 | 0x42<<7 | 0x5B, 31529 - 19968: jis0212<<14 | 0x30<<7 | 0x57, 31530 - 19968: jis0212<<14 | 0x30<<7 | 0x58, 31531 - 19968: jis0212<<14 | 0x30<<7 | 0x59, 31532 - 19968: jis0208<<14 | 0x21<<7 | 0x47, 31533 - 19968: jis0212<<14 | 0x30<<7 | 0x5A, 31534 - 19968: jis0212<<14 | 0x30<<7 | 0x5B, 31535 - 19968: jis0212<<14 | 0x30<<7 | 0x5C, 31536 - 19968: jis0212<<14 | 0x30<<7 | 0x5D, 31537 - 19968: jis0212<<14 | 0x31<<7 | 0x00, 31539 - 19968: jis0208<<14 | 0x42<<7 | 0x56, 31540 - 19968: jis0212<<14 | 0x31<<7 | 0x01, 31541 - 19968: jis0208<<14 | 0x42<<7 | 0x5A, 31542 - 19968: jis0208<<14 | 0x42<<7 | 0x5C, 31545 - 19968: jis0208<<14 | 0x19<<7 | 0x5A, 31549 - 19968: jis0212<<14 | 0x31<<7 | 0x02, 31551 - 19968: jis0212<<14 | 0x31<<7 | 0x03, 31552 - 19968: jis0212<<14 | 0x31<<7 | 0x04, 31553 - 19968: jis0212<<14 | 0x31<<7 | 0x05, 31557 - 19968: jis0208<<14 | 0x43<<7 | 0x05, 31558 - 19968: jis0208<<14 | 0x28<<7 | 0x0D, 31559 - 19968: jis0212<<14 | 0x31<<7 | 0x06, 31560 - 19968: jis0208<<14 | 0x27<<7 | 0x05, 31561 - 19968: jis0208<<14 | 0x24<<7 | 0x58, 31563 - 19968: jis0208<<14 | 0x15<<7 | 0x39, 31564 - 19968: jis0208<<14 | 0x43<<7 | 0x04, 31565 - 19968: jis0208<<14 | 0x43<<7 | 0x02, 31566 - 19968: jis0212<<14 | 0x31<<7 | 0x07, 31567 - 19968: jis0208<<14 | 0x27<<7 | 0x14, 31568 - 19968: jis0208<<14 | 0x42<<7 | 0x5D, 31569 - 19968: jis0208<<14 | 0x22<<7 | 0x3D, 31570 - 19968: jis0208<<14 | 0x24<<7 | 0x5A, 31572 - 19968: jis0208<<14 | 0x24<<7 | 0x59, 31573 - 19968: jis0212<<14 | 0x31<<7 | 0x08, 31574 - 19968: jis0208<<14 | 0x19<<7 | 0x55, 31581 - 19968: jis0208<<14 | 0x43<<7 | 0x17, 31584 - 19968: jis0212<<14 | 0x31<<7 | 0x09, 31588 - 19968: jis0212<<14 | 0x31<<7 | 0x0A, 31589 - 19968: jis0208<<14 | 0x43<<7 | 0x07, 31590 - 19968: jis0212<<14 | 0x31<<7 | 0x0B, 31591 - 19968: jis0208<<14 | 0x43<<7 | 0x09, 31593 - 19968: jis0212<<14 | 0x31<<7 | 0x0C, 31594 - 19968: jis0212<<14 | 0x31<<7 | 0x0D, 31596 - 19968: jis0208<<14 | 0x43<<7 | 0x0C, 31597 - 19968: jis0212<<14 | 0x31<<7 | 0x0E, 31598 - 19968: jis0208<<14 | 0x43<<7 | 0x0D, 31599 - 19968: jis0212<<14 | 0x31<<7 | 0x0F, 31600 - 19968: jis0208<<14 | 0x43<<7 | 0x0A, 31601 - 19968: jis0208<<14 | 0x43<<7 | 0x0B, 31602 - 19968: jis0212<<14 | 0x31<<7 | 0x10, 31603 - 19968: jis0212<<14 | 0x31<<7 | 0x11, 31604 - 19968: jis0208<<14 | 0x43<<7 | 0x08, 31605 - 19968: jis0208<<14 | 0x43<<7 | 0x06, 31607 - 19968: jis0212<<14 | 0x31<<7 | 0x12, 31610 - 19968: jis0208<<14 | 0x43<<7 | 0x00, 31620 - 19968: jis0212<<14 | 0x31<<7 | 0x13, 31622 - 19968: jis0208<<14 | 0x29<<7 | 0x2E, 31623 - 19968: jis0208<<14 | 0x11<<7 | 0x34, 31625 - 19968: jis0212<<14 | 0x31<<7 | 0x14, 31627 - 19968: jis0208<<14 | 0x43<<7 | 0x14, 31629 - 19968: jis0208<<14 | 0x43<<7 | 0x11, 31630 - 19968: jis0212<<14 | 0x31<<7 | 0x15, 31631 - 19968: jis0208<<14 | 0x43<<7 | 0x16, 31632 - 19968: jis0212<<14 | 0x31<<7 | 0x16, 31633 - 19968: jis0212<<14 | 0x31<<7 | 0x17, 31634 - 19968: jis0208<<14 | 0x43<<7 | 0x15, 31636 - 19968: jis0208<<14 | 0x26<<7 | 0x52, 31637 - 19968: jis0208<<14 | 0x2B<<7 | 0x06, 31638 - 19968: jis0212<<14 | 0x31<<7 | 0x18, 31639 - 19968: jis0208<<14 | 0x1A<<7 | 0x1A, 31640 - 19968: jis0208<<14 | 0x43<<7 | 0x0F, 31641 - 19968: jis0208<<14 | 0x43<<7 | 0x18, 31642 - 19968: jis0208<<14 | 0x43<<7 | 0x13, 31643 - 19968: jis0212<<14 | 0x31<<7 | 0x19, 31644 - 19968: jis0208<<14 | 0x43<<7 | 0x12, 31645 - 19968: jis0208<<14 | 0x43<<7 | 0x0E, 31646 - 19968: jis0208<<14 | 0x5A<<7 | 0x2B, 31647 - 19968: jis0208<<14 | 0x43<<7 | 0x10, 31648 - 19968: jis0212<<14 | 0x31<<7 | 0x1B, 31649 - 19968: jis0208<<14 | 0x13<<7 | 0x28, 31653 - 19968: jis0212<<14 | 0x31<<7 | 0x1C, 31658 - 19968: jis0208<<14 | 0x22<<7 | 0x1C, 31660 - 19968: jis0212<<14 | 0x31<<7 | 0x1D, 31661 - 19968: jis0208<<14 | 0x1F<<7 | 0x5C, 31663 - 19968: jis0212<<14 | 0x31<<7 | 0x1E, 31664 - 19968: jis0212<<14 | 0x31<<7 | 0x1F, 31665 - 19968: jis0208<<14 | 0x27<<7 | 0x01, 31666 - 19968: jis0212<<14 | 0x31<<7 | 0x20, 31668 - 19968: jis0208<<14 | 0x43<<7 | 0x1D, 31669 - 19968: jis0212<<14 | 0x31<<7 | 0x21, 31670 - 19968: jis0212<<14 | 0x31<<7 | 0x22, 31672 - 19968: jis0208<<14 | 0x27<<7 | 0x03, 31674 - 19968: jis0212<<14 | 0x31<<7 | 0x23, 31675 - 19968: jis0212<<14 | 0x31<<7 | 0x24, 31676 - 19968: jis0212<<14 | 0x31<<7 | 0x25, 31677 - 19968: jis0212<<14 | 0x31<<7 | 0x26, 31680 - 19968: jis0208<<14 | 0x1F<<7 | 0x40, 31681 - 19968: jis0208<<14 | 0x43<<7 | 0x1A, 31682 - 19968: jis0212<<14 | 0x31<<7 | 0x27, 31684 - 19968: jis0208<<14 | 0x27<<7 | 0x2E, 31685 - 19968: jis0212<<14 | 0x31<<7 | 0x28, 31686 - 19968: jis0208<<14 | 0x43<<7 | 0x1E, 31687 - 19968: jis0208<<14 | 0x29<<7 | 0x32, 31688 - 19968: jis0212<<14 | 0x31<<7 | 0x29, 31689 - 19968: jis0208<<14 | 0x22<<7 | 0x3A, 31690 - 19968: jis0212<<14 | 0x31<<7 | 0x2A, 31691 - 19968: jis0208<<14 | 0x43<<7 | 0x19, 31692 - 19968: jis0208<<14 | 0x43<<7 | 0x1B, 31695 - 19968: jis0208<<14 | 0x43<<7 | 0x1C, 31700 - 19968: jis0212<<14 | 0x31<<7 | 0x2B, 31702 - 19968: jis0212<<14 | 0x31<<7 | 0x2C, 31703 - 19968: jis0212<<14 | 0x31<<7 | 0x2D, 31705 - 19968: jis0212<<14 | 0x31<<7 | 0x2E, 31706 - 19968: jis0212<<14 | 0x31<<7 | 0x2F, 31707 - 19968: jis0212<<14 | 0x31<<7 | 0x30, 31709 - 19968: jis0208<<14 | 0x43<<7 | 0x1F, 31712 - 19968: jis0208<<14 | 0x1B<<7 | 0x23, 31716 - 19968: jis0208<<14 | 0x25<<7 | 0x25, 31717 - 19968: jis0208<<14 | 0x43<<7 | 0x24, 31718 - 19968: jis0208<<14 | 0x43<<7 | 0x23, 31720 - 19968: jis0212<<14 | 0x31<<7 | 0x31, 31721 - 19968: jis0208<<14 | 0x43<<7 | 0x20, 31722 - 19968: jis0212<<14 | 0x31<<7 | 0x32, 31725 - 19968: jis0208<<14 | 0x2E<<7 | 0x15, 31730 - 19968: jis0212<<14 | 0x31<<7 | 0x33, 31731 - 19968: jis0208<<14 | 0x43<<7 | 0x29, 31732 - 19968: jis0212<<14 | 0x31<<7 | 0x34, 31733 - 19968: jis0212<<14 | 0x31<<7 | 0x35, 31734 - 19968: jis0208<<14 | 0x43<<7 | 0x2D, 31735 - 19968: jis0208<<14 | 0x43<<7 | 0x2A, 31736 - 19968: jis0212<<14 | 0x31<<7 | 0x36, 31737 - 19968: jis0212<<14 | 0x31<<7 | 0x37, 31738 - 19968: jis0212<<14 | 0x31<<7 | 0x38, 31740 - 19968: jis0212<<14 | 0x31<<7 | 0x39, 31742 - 19968: jis0212<<14 | 0x31<<7 | 0x3A, 31744 - 19968: jis0208<<14 | 0x43<<7 | 0x26, 31745 - 19968: jis0212<<14 | 0x31<<7 | 0x3B, 31746 - 19968: jis0212<<14 | 0x31<<7 | 0x3C, 31747 - 19968: jis0212<<14 | 0x31<<7 | 0x3D, 31748 - 19968: jis0212<<14 | 0x31<<7 | 0x3E, 31750 - 19968: jis0212<<14 | 0x31<<7 | 0x3F, 31751 - 19968: jis0208<<14 | 0x43<<7 | 0x27, 31753 - 19968: jis0212<<14 | 0x31<<7 | 0x40, 31755 - 19968: jis0212<<14 | 0x31<<7 | 0x41, 31756 - 19968: jis0212<<14 | 0x31<<7 | 0x42, 31757 - 19968: jis0208<<14 | 0x43<<7 | 0x2C, 31758 - 19968: jis0212<<14 | 0x31<<7 | 0x43, 31759 - 19968: jis0212<<14 | 0x31<<7 | 0x44, 31761 - 19968: jis0208<<14 | 0x43<<7 | 0x21, 31762 - 19968: jis0208<<14 | 0x31<<7 | 0x34, 31763 - 19968: jis0208<<14 | 0x43<<7 | 0x28, 31764 - 19968: jis0208<<14 | 0x43<<7 | 0x22, 31767 - 19968: jis0208<<14 | 0x43<<7 | 0x2B, 31769 - 19968: jis0212<<14 | 0x31<<7 | 0x45, 31771 - 19968: jis0212<<14 | 0x31<<7 | 0x46, 31775 - 19968: jis0208<<14 | 0x43<<7 | 0x31, 31776 - 19968: jis0212<<14 | 0x31<<7 | 0x47, 31777 - 19968: jis0208<<14 | 0x13<<7 | 0x29, 31779 - 19968: jis0208<<14 | 0x43<<7 | 0x2E, 31781 - 19968: jis0212<<14 | 0x31<<7 | 0x48, 31782 - 19968: jis0212<<14 | 0x31<<7 | 0x49, 31783 - 19968: jis0208<<14 | 0x43<<7 | 0x2F, 31784 - 19968: jis0212<<14 | 0x31<<7 | 0x4A, 31786 - 19968: jis0208<<14 | 0x43<<7 | 0x30, 31787 - 19968: jis0208<<14 | 0x43<<7 | 0x33, 31788 - 19968: jis0212<<14 | 0x31<<7 | 0x4B, 31793 - 19968: jis0212<<14 | 0x31<<7 | 0x4C, 31795 - 19968: jis0212<<14 | 0x31<<7 | 0x4D, 31796 - 19968: jis0212<<14 | 0x31<<7 | 0x4E, 31798 - 19968: jis0212<<14 | 0x31<<7 | 0x4F, 31799 - 19968: jis0208<<14 | 0x43<<7 | 0x32, 31800 - 19968: jis0208<<14 | 0x27<<7 | 0x55, 31801 - 19968: jis0212<<14 | 0x31<<7 | 0x50, 31802 - 19968: jis0212<<14 | 0x31<<7 | 0x51, 31805 - 19968: jis0208<<14 | 0x43<<7 | 0x34, 31806 - 19968: jis0208<<14 | 0x2D<<7 | 0x5B, 31807 - 19968: jis0208<<14 | 0x29<<7 | 0x4C, 31808 - 19968: jis0208<<14 | 0x43<<7 | 0x39, 31811 - 19968: jis0208<<14 | 0x43<<7 | 0x36, 31814 - 19968: jis0212<<14 | 0x31<<7 | 0x52, 31818 - 19968: jis0212<<14 | 0x31<<7 | 0x53, 31820 - 19968: jis0208<<14 | 0x43<<7 | 0x35, 31821 - 19968: jis0208<<14 | 0x1F<<7 | 0x31, 31823 - 19968: jis0208<<14 | 0x43<<7 | 0x38, 31824 - 19968: jis0208<<14 | 0x43<<7 | 0x3A, 31825 - 19968: jis0212<<14 | 0x31<<7 | 0x55, 31826 - 19968: jis0212<<14 | 0x31<<7 | 0x56, 31827 - 19968: jis0212<<14 | 0x31<<7 | 0x57, 31828 - 19968: jis0208<<14 | 0x43<<7 | 0x37, 31829 - 19968: jis0212<<14 | 0x31<<7 | 0x54, 31830 - 19968: jis0208<<14 | 0x43<<7 | 0x3E, 31832 - 19968: jis0208<<14 | 0x43<<7 | 0x3B, 31833 - 19968: jis0212<<14 | 0x31<<7 | 0x58, 31834 - 19968: jis0212<<14 | 0x31<<7 | 0x59, 31835 - 19968: jis0212<<14 | 0x31<<7 | 0x5A, 31836 - 19968: jis0212<<14 | 0x31<<7 | 0x5B, 31837 - 19968: jis0212<<14 | 0x31<<7 | 0x5C, 31838 - 19968: jis0212<<14 | 0x31<<7 | 0x5D, 31839 - 19968: jis0208<<14 | 0x43<<7 | 0x3C, 31840 - 19968: jis0208<<14 | 0x43<<7 | 0x25, 31841 - 19968: jis0212<<14 | 0x32<<7 | 0x00, 31843 - 19968: jis0212<<14 | 0x32<<7 | 0x01, 31844 - 19968: jis0208<<14 | 0x43<<7 | 0x3D, 31845 - 19968: jis0208<<14 | 0x43<<7 | 0x3F, 31847 - 19968: jis0212<<14 | 0x32<<7 | 0x02, 31849 - 19968: jis0212<<14 | 0x32<<7 | 0x03, 31852 - 19968: jis0208<<14 | 0x43<<7 | 0x40, 31853 - 19968: jis0212<<14 | 0x32<<7 | 0x04, 31854 - 19968: jis0212<<14 | 0x32<<7 | 0x05, 31856 - 19968: jis0212<<14 | 0x32<<7 | 0x06, 31858 - 19968: jis0212<<14 | 0x32<<7 | 0x07, 31859 - 19968: jis0208<<14 | 0x29<<7 | 0x25, 31861 - 19968: jis0208<<14 | 0x43<<7 | 0x41, 31865 - 19968: jis0212<<14 | 0x32<<7 | 0x08, 31868 - 19968: jis0212<<14 | 0x32<<7 | 0x09, 31869 - 19968: jis0212<<14 | 0x32<<7 | 0x0A, 31870 - 19968: jis0208<<14 | 0x2B<<7 | 0x41, 31873 - 19968: jis0208<<14 | 0x15<<7 | 0x2D, 31874 - 19968: jis0208<<14 | 0x16<<7 | 0x08, 31875 - 19968: jis0208<<14 | 0x43<<7 | 0x42, 31878 - 19968: jis0212<<14 | 0x32<<7 | 0x0B, 31879 - 19968: jis0212<<14 | 0x32<<7 | 0x0C, 31881 - 19968: jis0208<<14 | 0x29<<7 | 0x13, 31883 - 19968: jis0208<<14 | 0x1E<<7 | 0x47, 31885 - 19968: jis0208<<14 | 0x2B<<7 | 0x0F, 31887 - 19968: jis0212<<14 | 0x32<<7 | 0x0D, 31888 - 19968: jis0208<<14 | 0x43<<7 | 0x43, 31890 - 19968: jis0208<<14 | 0x2D<<7 | 0x12, 31892 - 19968: jis0212<<14 | 0x32<<7 | 0x0E, 31893 - 19968: jis0208<<14 | 0x26<<7 | 0x53, 31895 - 19968: jis0208<<14 | 0x20<<7 | 0x25, 31896 - 19968: jis0208<<14 | 0x26<<7 | 0x13, 31899 - 19968: jis0208<<14 | 0x1C<<7 | 0x2C, 31902 - 19968: jis0212<<14 | 0x32<<7 | 0x0F, 31903 - 19968: jis0208<<14 | 0x0F<<7 | 0x1F, 31904 - 19968: jis0212<<14 | 0x32<<7 | 0x10, 31905 - 19968: jis0208<<14 | 0x43<<7 | 0x48, 31906 - 19968: jis0208<<14 | 0x43<<7 | 0x46, 31908 - 19968: jis0208<<14 | 0x43<<7 | 0x44, 31909 - 19968: jis0208<<14 | 0x13<<7 | 0x00, 31910 - 19968: jis0212<<14 | 0x32<<7 | 0x11, 31911 - 19968: jis0208<<14 | 0x1D<<7 | 0x30, 31912 - 19968: jis0208<<14 | 0x43<<7 | 0x49, 31915 - 19968: jis0208<<14 | 0x43<<7 | 0x47, 31917 - 19968: jis0208<<14 | 0x43<<7 | 0x45, 31918 - 19968: jis0208<<14 | 0x43<<7 | 0x4D, 31920 - 19968: jis0212<<14 | 0x32<<7 | 0x12, 31921 - 19968: jis0208<<14 | 0x43<<7 | 0x4C, 31922 - 19968: jis0208<<14 | 0x43<<7 | 0x4B, 31923 - 19968: jis0208<<14 | 0x43<<7 | 0x4A, 31926 - 19968: jis0212<<14 | 0x32<<7 | 0x13, 31927 - 19968: jis0212<<14 | 0x32<<7 | 0x14, 31929 - 19968: jis0208<<14 | 0x43<<7 | 0x4E, 31930 - 19968: jis0212<<14 | 0x32<<7 | 0x15, 31931 - 19968: jis0212<<14 | 0x32<<7 | 0x16, 31932 - 19968: jis0212<<14 | 0x32<<7 | 0x17, 31933 - 19968: jis0208<<14 | 0x43<<7 | 0x4F, 31934 - 19968: jis0208<<14 | 0x1F<<7 | 0x19, 31935 - 19968: jis0212<<14 | 0x32<<7 | 0x18, 31936 - 19968: jis0208<<14 | 0x43<<7 | 0x50, 31938 - 19968: jis0208<<14 | 0x43<<7 | 0x52, 31940 - 19968: jis0212<<14 | 0x32<<7 | 0x19, 31941 - 19968: jis0208<<14 | 0x43<<7 | 0x51, 31943 - 19968: jis0212<<14 | 0x32<<7 | 0x1A, 31944 - 19968: jis0212<<14 | 0x32<<7 | 0x1B, 31945 - 19968: jis0212<<14 | 0x32<<7 | 0x1C, 31946 - 19968: jis0208<<14 | 0x17<<7 | 0x31, 31949 - 19968: jis0212<<14 | 0x32<<7 | 0x1D, 31950 - 19968: jis0208<<14 | 0x20<<7 | 0x17, 31951 - 19968: jis0212<<14 | 0x32<<7 | 0x1E, 31954 - 19968: jis0208<<14 | 0x43<<7 | 0x54, 31955 - 19968: jis0212<<14 | 0x32<<7 | 0x1F, 31956 - 19968: jis0212<<14 | 0x32<<7 | 0x20, 31957 - 19968: jis0212<<14 | 0x32<<7 | 0x21, 31958 - 19968: jis0208<<14 | 0x24<<7 | 0x5B, 31959 - 19968: jis0212<<14 | 0x32<<7 | 0x22, 31960 - 19968: jis0208<<14 | 0x43<<7 | 0x53, 31961 - 19968: jis0212<<14 | 0x32<<7 | 0x23, 31962 - 19968: jis0212<<14 | 0x32<<7 | 0x24, 31964 - 19968: jis0208<<14 | 0x43<<7 | 0x55, 31965 - 19968: jis0212<<14 | 0x32<<7 | 0x25, 31966 - 19968: jis0208<<14 | 0x29<<7 | 0x14, 31967 - 19968: jis0208<<14 | 0x20<<7 | 0x4B, 31968 - 19968: jis0208<<14 | 0x18<<7 | 0x26, 31970 - 19968: jis0208<<14 | 0x43<<7 | 0x56, 31974 - 19968: jis0212<<14 | 0x32<<7 | 0x26, 31975 - 19968: jis0208<<14 | 0x2D<<7 | 0x27, 31977 - 19968: jis0212<<14 | 0x32<<7 | 0x27, 31979 - 19968: jis0212<<14 | 0x32<<7 | 0x28, 31983 - 19968: jis0208<<14 | 0x43<<7 | 0x58, 31986 - 19968: jis0208<<14 | 0x43<<7 | 0x59, 31988 - 19968: jis0208<<14 | 0x43<<7 | 0x5A, 31989 - 19968: jis0212<<14 | 0x32<<7 | 0x29, 31990 - 19968: jis0208<<14 | 0x43<<7 | 0x5B, 31992 - 19968: jis0208<<14 | 0x1A<<7 | 0x44, 31994 - 19968: jis0208<<14 | 0x43<<7 | 0x5C, 31995 - 19968: jis0208<<14 | 0x16<<7 | 0x2E, 31998 - 19968: jis0208<<14 | 0x14<<7 | 0x49, 32000 - 19968: jis0208<<14 | 0x14<<7 | 0x09, 32002 - 19968: jis0208<<14 | 0x44<<7 | 0x00, 32003 - 19968: jis0212<<14 | 0x32<<7 | 0x2A, 32004 - 19968: jis0208<<14 | 0x2B<<7 | 0x52, 32005 - 19968: jis0208<<14 | 0x18<<7 | 0x27, 32006 - 19968: jis0208<<14 | 0x43<<7 | 0x5D, 32007 - 19968: jis0212<<14 | 0x32<<7 | 0x2B, 32008 - 19968: jis0212<<14 | 0x32<<7 | 0x2C, 32009 - 19968: jis0212<<14 | 0x32<<7 | 0x2D, 32010 - 19968: jis0208<<14 | 0x44<<7 | 0x03, 32011 - 19968: jis0208<<14 | 0x2B<<7 | 0x45, 32013 - 19968: jis0208<<14 | 0x26<<7 | 0x1B, 32015 - 19968: jis0212<<14 | 0x32<<7 | 0x2E, 32016 - 19968: jis0208<<14 | 0x28<<7 | 0x12, 32017 - 19968: jis0212<<14 | 0x32<<7 | 0x2F, 32018 - 19968: jis0212<<14 | 0x32<<7 | 0x30, 32019 - 19968: jis0212<<14 | 0x32<<7 | 0x31, 32020 - 19968: jis0208<<14 | 0x1C<<7 | 0x42, 32021 - 19968: jis0208<<14 | 0x44<<7 | 0x02, 32022 - 19968: jis0212<<14 | 0x32<<7 | 0x32, 32023 - 19968: jis0208<<14 | 0x1B<<7 | 0x32, 32024 - 19968: jis0208<<14 | 0x18<<7 | 0x28, 32025 - 19968: jis0208<<14 | 0x1A<<7 | 0x45, 32026 - 19968: jis0208<<14 | 0x14<<7 | 0x48, 32027 - 19968: jis0208<<14 | 0x29<<7 | 0x15, 32028 - 19968: jis0208<<14 | 0x44<<7 | 0x01, 32029 - 19968: jis0212<<14 | 0x32<<7 | 0x33, 32030 - 19968: jis0212<<14 | 0x32<<7 | 0x34, 32032 - 19968: jis0208<<14 | 0x20<<7 | 0x26, 32033 - 19968: jis0208<<14 | 0x2A<<7 | 0x21, 32034 - 19968: jis0208<<14 | 0x19<<7 | 0x56, 32035 - 19968: jis0212<<14 | 0x32<<7 | 0x35, 32038 - 19968: jis0212<<14 | 0x32<<7 | 0x36, 32042 - 19968: jis0212<<14 | 0x32<<7 | 0x37, 32043 - 19968: jis0208<<14 | 0x1A<<7 | 0x46, 32044 - 19968: jis0208<<14 | 0x23<<7 | 0x3C, 32045 - 19968: jis0212<<14 | 0x32<<7 | 0x38, 32046 - 19968: jis0208<<14 | 0x44<<7 | 0x06, 32047 - 19968: jis0208<<14 | 0x2D<<7 | 0x3E, 32048 - 19968: jis0208<<14 | 0x19<<7 | 0x38, 32049 - 19968: jis0212<<14 | 0x32<<7 | 0x39, 32050 - 19968: jis0208<<14 | 0x44<<7 | 0x07, 32051 - 19968: jis0208<<14 | 0x1E<<7 | 0x21, 32053 - 19968: jis0208<<14 | 0x44<<7 | 0x09, 32057 - 19968: jis0208<<14 | 0x1D<<7 | 0x31, 32058 - 19968: jis0208<<14 | 0x19<<7 | 0x0F, 32060 - 19968: jis0212<<14 | 0x32<<7 | 0x3A, 32061 - 19968: jis0212<<14 | 0x32<<7 | 0x3B, 32062 - 19968: jis0212<<14 | 0x32<<7 | 0x3C, 32063 - 19968: jis0208<<14 | 0x44<<7 | 0x08, 32064 - 19968: jis0212<<14 | 0x32<<7 | 0x3D, 32065 - 19968: jis0212<<14 | 0x32<<7 | 0x3E, 32066 - 19968: jis0208<<14 | 0x1C<<7 | 0x09, 32067 - 19968: jis0208<<14 | 0x17<<7 | 0x1D, 32068 - 19968: jis0208<<14 | 0x20<<7 | 0x27, 32069 - 19968: jis0208<<14 | 0x44<<7 | 0x04, 32070 - 19968: jis0208<<14 | 0x44<<7 | 0x0A, 32071 - 19968: jis0212<<14 | 0x32<<7 | 0x3F, 32072 - 19968: jis0208<<14 | 0x5A<<7 | 0x2D, 32075 - 19968: jis0208<<14 | 0x44<<7 | 0x05, 32076 - 19968: jis0208<<14 | 0x16<<7 | 0x2F, 32077 - 19968: jis0212<<14 | 0x32<<7 | 0x41, 32078 - 19968: jis0208<<14 | 0x44<<7 | 0x0D, 32079 - 19968: jis0208<<14 | 0x44<<7 | 0x11, 32080 - 19968: jis0208<<14 | 0x16<<7 | 0x4A, 32081 - 19968: jis0212<<14 | 0x32<<7 | 0x42, 32083 - 19968: jis0212<<14 | 0x32<<7 | 0x43, 32086 - 19968: jis0208<<14 | 0x44<<7 | 0x0C, 32087 - 19968: jis0212<<14 | 0x32<<7 | 0x44, 32089 - 19968: jis0212<<14 | 0x32<<7 | 0x45, 32090 - 19968: jis0212<<14 | 0x32<<7 | 0x46, 32091 - 19968: jis0208<<14 | 0x44<<7 | 0x15, 32092 - 19968: jis0208<<14 | 0x5A<<7 | 0x2E, 32093 - 19968: jis0212<<14 | 0x32<<7 | 0x48, 32094 - 19968: jis0208<<14 | 0x18<<7 | 0x29, 32097 - 19968: jis0208<<14 | 0x2C<<7 | 0x4C, 32098 - 19968: jis0208<<14 | 0x0F<<7 | 0x1B, 32099 - 19968: jis0208<<14 | 0x44<<7 | 0x12, 32101 - 19968: jis0212<<14 | 0x32<<7 | 0x49, 32102 - 19968: jis0208<<14 | 0x14<<7 | 0x4A, 32103 - 19968: jis0212<<14 | 0x32<<7 | 0x4A, 32104 - 19968: jis0208<<14 | 0x44<<7 | 0x0F, 32106 - 19968: jis0212<<14 | 0x32<<7 | 0x4B, 32110 - 19968: jis0208<<14 | 0x44<<7 | 0x10, 32112 - 19968: jis0212<<14 | 0x32<<7 | 0x4C, 32113 - 19968: jis0208<<14 | 0x24<<7 | 0x5C, 32114 - 19968: jis0208<<14 | 0x44<<7 | 0x0E, 32115 - 19968: jis0208<<14 | 0x44<<7 | 0x0B, 32117 - 19968: jis0208<<14 | 0x12<<7 | 0x07, 32118 - 19968: jis0208<<14 | 0x1F<<7 | 0x43, 32120 - 19968: jis0212<<14 | 0x32<<7 | 0x4D, 32121 - 19968: jis0208<<14 | 0x17<<7 | 0x07, 32122 - 19968: jis0212<<14 | 0x32<<7 | 0x4E, 32123 - 19968: jis0212<<14 | 0x32<<7 | 0x4F, 32125 - 19968: jis0208<<14 | 0x44<<7 | 0x17, 32127 - 19968: jis0212<<14 | 0x32<<7 | 0x50, 32129 - 19968: jis0212<<14 | 0x32<<7 | 0x51, 32130 - 19968: jis0212<<14 | 0x32<<7 | 0x52, 32131 - 19968: jis0212<<14 | 0x32<<7 | 0x53, 32133 - 19968: jis0212<<14 | 0x32<<7 | 0x54, 32134 - 19968: jis0212<<14 | 0x32<<7 | 0x55, 32136 - 19968: jis0212<<14 | 0x32<<7 | 0x56, 32137 - 19968: jis0208<<14 | 0x44<<7 | 0x14, 32139 - 19968: jis0212<<14 | 0x32<<7 | 0x57, 32140 - 19968: jis0212<<14 | 0x32<<7 | 0x58, 32141 - 19968: jis0212<<14 | 0x32<<7 | 0x59, 32143 - 19968: jis0208<<14 | 0x44<<7 | 0x16, 32145 - 19968: jis0212<<14 | 0x32<<7 | 0x5A, 32147 - 19968: jis0208<<14 | 0x44<<7 | 0x13, 32150 - 19968: jis0212<<14 | 0x32<<7 | 0x5B, 32151 - 19968: jis0212<<14 | 0x32<<7 | 0x5C, 32153 - 19968: jis0208<<14 | 0x16<<7 | 0x30, 32154 - 19968: jis0208<<14 | 0x21<<7 | 0x12, 32155 - 19968: jis0208<<14 | 0x44<<7 | 0x18, 32156 - 19968: jis0208<<14 | 0x20<<7 | 0x4D, 32157 - 19968: jis0212<<14 | 0x32<<7 | 0x5D, 32158 - 19968: jis0212<<14 | 0x33<<7 | 0x00, 32159 - 19968: jis0208<<14 | 0x44<<7 | 0x25, 32160 - 19968: jis0208<<14 | 0x5A<<7 | 0x30, 32162 - 19968: jis0208<<14 | 0x44<<7 | 0x21, 32163 - 19968: jis0208<<14 | 0x44<<7 | 0x1B, 32166 - 19968: jis0212<<14 | 0x33<<7 | 0x01, 32167 - 19968: jis0212<<14 | 0x33<<7 | 0x02, 32170 - 19968: jis0212<<14 | 0x33<<7 | 0x03, 32171 - 19968: jis0208<<14 | 0x44<<7 | 0x1F, 32172 - 19968: jis0208<<14 | 0x1B<<7 | 0x59, 32173 - 19968: jis0208<<14 | 0x0F<<7 | 0x3C, 32174 - 19968: jis0208<<14 | 0x44<<7 | 0x1A, 32175 - 19968: jis0208<<14 | 0x44<<7 | 0x22, 32176 - 19968: jis0208<<14 | 0x44<<7 | 0x26, 32177 - 19968: jis0208<<14 | 0x18<<7 | 0x2A, 32178 - 19968: jis0208<<14 | 0x2B<<7 | 0x35, 32179 - 19968: jis0212<<14 | 0x33<<7 | 0x04, 32180 - 19968: jis0208<<14 | 0x23<<7 | 0x35, 32181 - 19968: jis0208<<14 | 0x44<<7 | 0x1C, 32182 - 19968: jis0212<<14 | 0x33<<7 | 0x05, 32183 - 19968: jis0208<<14 | 0x5A<<7 | 0x2F, 32184 - 19968: jis0208<<14 | 0x44<<7 | 0x24, 32185 - 19968: jis0212<<14 | 0x33<<7 | 0x07, 32186 - 19968: jis0208<<14 | 0x44<<7 | 0x19, 32187 - 19968: jis0208<<14 | 0x22<<7 | 0x1D, 32189 - 19968: jis0208<<14 | 0x44<<7 | 0x1E, 32190 - 19968: jis0208<<14 | 0x0F<<7 | 0x1C, 32191 - 19968: jis0208<<14 | 0x2B<<7 | 0x29, 32194 - 19968: jis0212<<14 | 0x33<<7 | 0x08, 32195 - 19968: jis0212<<14 | 0x33<<7 | 0x09, 32196 - 19968: jis0212<<14 | 0x33<<7 | 0x0A, 32197 - 19968: jis0212<<14 | 0x33<<7 | 0x0B, 32198 - 19968: jis0212<<14 | 0x33<<7 | 0x0C, 32199 - 19968: jis0208<<14 | 0x44<<7 | 0x1D, 32202 - 19968: jis0208<<14 | 0x15<<7 | 0x3A, 32203 - 19968: jis0208<<14 | 0x27<<7 | 0x4B, 32204 - 19968: jis0212<<14 | 0x33<<7 | 0x0D, 32205 - 19968: jis0212<<14 | 0x33<<7 | 0x0E, 32206 - 19968: jis0212<<14 | 0x33<<7 | 0x0F, 32207 - 19968: jis0208<<14 | 0x20<<7 | 0x4C, 32209 - 19968: jis0208<<14 | 0x2D<<7 | 0x2F, 32210 - 19968: jis0208<<14 | 0x1C<<7 | 0x4E, 32213 - 19968: jis0208<<14 | 0x44<<7 | 0x4D, 32214 - 19968: jis0208<<14 | 0x5A<<7 | 0x31, 32215 - 19968: jis0212<<14 | 0x33<<7 | 0x10, 32216 - 19968: jis0208<<14 | 0x44<<7 | 0x27, 32217 - 19968: jis0212<<14 | 0x33<<7 | 0x11, 32218 - 19968: jis0208<<14 | 0x1F<<7 | 0x5D, 32220 - 19968: jis0208<<14 | 0x44<<7 | 0x23, 32221 - 19968: jis0208<<14 | 0x44<<7 | 0x28, 32222 - 19968: jis0208<<14 | 0x44<<7 | 0x2A, 32224 - 19968: jis0208<<14 | 0x23<<7 | 0x58, 32225 - 19968: jis0208<<14 | 0x44<<7 | 0x2D, 32226 - 19968: jis0212<<14 | 0x33<<7 | 0x13, 32228 - 19968: jis0208<<14 | 0x44<<7 | 0x29, 32229 - 19968: jis0212<<14 | 0x33<<7 | 0x14, 32230 - 19968: jis0212<<14 | 0x33<<7 | 0x15, 32232 - 19968: jis0208<<14 | 0x29<<7 | 0x33, 32233 - 19968: jis0208<<14 | 0x13<<7 | 0x2A, 32234 - 19968: jis0212<<14 | 0x33<<7 | 0x16, 32235 - 19968: jis0212<<14 | 0x33<<7 | 0x17, 32236 - 19968: jis0208<<14 | 0x2B<<7 | 0x2A, 32237 - 19968: jis0212<<14 | 0x33<<7 | 0x18, 32239 - 19968: jis0208<<14 | 0x0F<<7 | 0x3D, 32241 - 19968: jis0212<<14 | 0x33<<7 | 0x19, 32242 - 19968: jis0208<<14 | 0x44<<7 | 0x2C, 32244 - 19968: jis0208<<14 | 0x2D<<7 | 0x5C, 32245 - 19968: jis0212<<14 | 0x33<<7 | 0x1A, 32246 - 19968: jis0212<<14 | 0x33<<7 | 0x1B, 32249 - 19968: jis0212<<14 | 0x33<<7 | 0x1C, 32250 - 19968: jis0212<<14 | 0x33<<7 | 0x1D, 32251 - 19968: jis0208<<14 | 0x44<<7 | 0x2B, 32256 - 19968: jis0212<<14 | 0x33<<7 | 0x12, 32257 - 19968: jis0208<<14 | 0x10<<7 | 0x4E, 32260 - 19968: jis0208<<14 | 0x25<<7 | 0x4B, 32261 - 19968: jis0208<<14 | 0x44<<7 | 0x2E, 32264 - 19968: jis0212<<14 | 0x33<<7 | 0x1E, 32265 - 19968: jis0208<<14 | 0x44<<7 | 0x35, 32266 - 19968: jis0208<<14 | 0x44<<7 | 0x2F, 32267 - 19968: jis0208<<14 | 0x44<<7 | 0x36, 32272 - 19968: jis0212<<14 | 0x33<<7 | 0x1F, 32273 - 19968: jis0212<<14 | 0x33<<7 | 0x20, 32274 - 19968: jis0208<<14 | 0x44<<7 | 0x32, 32277 - 19968: jis0212<<14 | 0x33<<7 | 0x21, 32279 - 19968: jis0212<<14 | 0x33<<7 | 0x22, 32283 - 19968: jis0208<<14 | 0x26<<7 | 0x5A, 32284 - 19968: jis0212<<14 | 0x33<<7 | 0x23, 32285 - 19968: jis0212<<14 | 0x33<<7 | 0x24, 32286 - 19968: jis0208<<14 | 0x1B<<7 | 0x29, 32287 - 19968: jis0208<<14 | 0x44<<7 | 0x34, 32288 - 19968: jis0212<<14 | 0x33<<7 | 0x25, 32289 - 19968: jis0208<<14 | 0x44<<7 | 0x31, 32290 - 19968: jis0208<<14 | 0x44<<7 | 0x37, 32291 - 19968: jis0208<<14 | 0x44<<7 | 0x30, 32294 - 19968: jis0208<<14 | 0x1C<<7 | 0x23, 32295 - 19968: jis0212<<14 | 0x33<<7 | 0x26, 32296 - 19968: jis0212<<14 | 0x33<<7 | 0x27, 32299 - 19968: jis0208<<14 | 0x2A<<7 | 0x04, 32300 - 19968: jis0212<<14 | 0x33<<7 | 0x28, 32301 - 19968: jis0212<<14 | 0x33<<7 | 0x29, 32302 - 19968: jis0208<<14 | 0x1C<<7 | 0x2B, 32303 - 19968: jis0212<<14 | 0x33<<7 | 0x2A, 32305 - 19968: jis0208<<14 | 0x44<<7 | 0x33, 32306 - 19968: jis0208<<14 | 0x44<<7 | 0x3F, 32307 - 19968: jis0212<<14 | 0x33<<7 | 0x2B, 32309 - 19968: jis0208<<14 | 0x44<<7 | 0x3B, 32310 - 19968: jis0212<<14 | 0x33<<7 | 0x2C, 32311 - 19968: jis0208<<14 | 0x44<<7 | 0x3E, 32313 - 19968: jis0208<<14 | 0x44<<7 | 0x3C, 32314 - 19968: jis0208<<14 | 0x44<<7 | 0x40, 32315 - 19968: jis0208<<14 | 0x44<<7 | 0x3A, 32317 - 19968: jis0208<<14 | 0x44<<7 | 0x20, 32318 - 19968: jis0208<<14 | 0x1F<<7 | 0x32, 32319 - 19968: jis0212<<14 | 0x33<<7 | 0x2D, 32321 - 19968: jis0208<<14 | 0x27<<7 | 0x2A, 32323 - 19968: jis0208<<14 | 0x44<<7 | 0x3D, 32324 - 19968: jis0212<<14 | 0x33<<7 | 0x2E, 32325 - 19968: jis0212<<14 | 0x33<<7 | 0x2F, 32326 - 19968: jis0208<<14 | 0x44<<7 | 0x38, 32327 - 19968: jis0212<<14 | 0x33<<7 | 0x30, 32330 - 19968: jis0208<<14 | 0x20<<7 | 0x00, 32331 - 19968: jis0208<<14 | 0x16<<7 | 0x31, 32333 - 19968: jis0208<<14 | 0x1C<<7 | 0x0A, 32334 - 19968: jis0212<<14 | 0x33<<7 | 0x31, 32336 - 19968: jis0212<<14 | 0x33<<7 | 0x32, 32338 - 19968: jis0208<<14 | 0x5A<<7 | 0x32, 32340 - 19968: jis0208<<14 | 0x1E<<7 | 0x04, 32341 - 19968: jis0208<<14 | 0x20<<7 | 0x15, 32342 - 19968: jis0208<<14 | 0x44<<7 | 0x43, 32344 - 19968: jis0212<<14 | 0x33<<7 | 0x34, 32345 - 19968: jis0208<<14 | 0x44<<7 | 0x45, 32346 - 19968: jis0208<<14 | 0x44<<7 | 0x46, 32349 - 19968: jis0208<<14 | 0x44<<7 | 0x42, 32350 - 19968: jis0208<<14 | 0x44<<7 | 0x44, 32351 - 19968: jis0212<<14 | 0x33<<7 | 0x35, 32353 - 19968: jis0212<<14 | 0x33<<7 | 0x36, 32354 - 19968: jis0212<<14 | 0x33<<7 | 0x37, 32357 - 19968: jis0212<<14 | 0x33<<7 | 0x38, 32358 - 19968: jis0208<<14 | 0x44<<7 | 0x39, 32359 - 19968: jis0208<<14 | 0x44<<7 | 0x41, 32361 - 19968: jis0208<<14 | 0x44<<7 | 0x49, 32362 - 19968: jis0208<<14 | 0x44<<7 | 0x48, 32363 - 19968: jis0212<<14 | 0x33<<7 | 0x39, 32365 - 19968: jis0208<<14 | 0x2A<<7 | 0x59, 32366 - 19968: jis0212<<14 | 0x33<<7 | 0x3A, 32367 - 19968: jis0212<<14 | 0x33<<7 | 0x3B, 32368 - 19968: jis0208<<14 | 0x16<<7 | 0x0A, 32371 - 19968: jis0212<<14 | 0x33<<7 | 0x3C, 32376 - 19968: jis0212<<14 | 0x33<<7 | 0x3D, 32377 - 19968: jis0208<<14 | 0x44<<7 | 0x47, 32379 - 19968: jis0208<<14 | 0x44<<7 | 0x4B, 32380 - 19968: jis0208<<14 | 0x44<<7 | 0x4A, 32381 - 19968: jis0208<<14 | 0x44<<7 | 0x4E, 32382 - 19968: jis0212<<14 | 0x33<<7 | 0x3E, 32383 - 19968: jis0208<<14 | 0x44<<7 | 0x50, 32385 - 19968: jis0212<<14 | 0x33<<7 | 0x3F, 32386 - 19968: jis0208<<14 | 0x1A<<7 | 0x1B, 32387 - 19968: jis0208<<14 | 0x44<<7 | 0x4C, 32390 - 19968: jis0212<<14 | 0x33<<7 | 0x40, 32391 - 19968: jis0212<<14 | 0x33<<7 | 0x41, 32392 - 19968: jis0208<<14 | 0x44<<7 | 0x51, 32393 - 19968: jis0208<<14 | 0x44<<7 | 0x52, 32394 - 19968: jis0208<<14 | 0x58<<7 | 0x00, 32396 - 19968: jis0208<<14 | 0x44<<7 | 0x53, 32397 - 19968: jis0212<<14 | 0x33<<7 | 0x43, 32398 - 19968: jis0208<<14 | 0x44<<7 | 0x59, 32399 - 19968: jis0208<<14 | 0x24<<7 | 0x1A, 32400 - 19968: jis0208<<14 | 0x44<<7 | 0x55, 32401 - 19968: jis0212<<14 | 0x33<<7 | 0x44, 32402 - 19968: jis0208<<14 | 0x44<<7 | 0x54, 32403 - 19968: jis0208<<14 | 0x44<<7 | 0x56, 32404 - 19968: jis0208<<14 | 0x44<<7 | 0x57, 32405 - 19968: jis0212<<14 | 0x33<<7 | 0x45, 32406 - 19968: jis0208<<14 | 0x44<<7 | 0x58, 32408 - 19968: jis0212<<14 | 0x33<<7 | 0x46, 32410 - 19968: jis0212<<14 | 0x33<<7 | 0x47, 32411 - 19968: jis0208<<14 | 0x44<<7 | 0x5A, 32412 - 19968: jis0208<<14 | 0x44<<7 | 0x5B, 32413 - 19968: jis0212<<14 | 0x33<<7 | 0x48, 32414 - 19968: jis0212<<14 | 0x33<<7 | 0x49, 32566 - 19968: jis0208<<14 | 0x13<<7 | 0x2B, 32568 - 19968: jis0208<<14 | 0x44<<7 | 0x5C, 32570 - 19968: jis0208<<14 | 0x44<<7 | 0x5D, 32571 - 19968: jis0212<<14 | 0x33<<7 | 0x4B, 32572 - 19968: jis0212<<14 | 0x33<<7 | 0x4A, 32573 - 19968: jis0212<<14 | 0x33<<7 | 0x4C, 32574 - 19968: jis0212<<14 | 0x33<<7 | 0x4D, 32575 - 19968: jis0212<<14 | 0x33<<7 | 0x4E, 32579 - 19968: jis0212<<14 | 0x33<<7 | 0x4F, 32580 - 19968: jis0212<<14 | 0x33<<7 | 0x50, 32581 - 19968: jis0208<<14 | 0x45<<7 | 0x00, 32583 - 19968: jis0208<<14 | 0x5A<<7 | 0x33, 32588 - 19968: jis0208<<14 | 0x45<<7 | 0x01, 32589 - 19968: jis0208<<14 | 0x45<<7 | 0x02, 32590 - 19968: jis0208<<14 | 0x45<<7 | 0x03, 32591 - 19968: jis0212<<14 | 0x33<<7 | 0x52, 32592 - 19968: jis0208<<14 | 0x45<<7 | 0x04, 32593 - 19968: jis0208<<14 | 0x45<<7 | 0x05, 32594 - 19968: jis0212<<14 | 0x33<<7 | 0x53, 32595 - 19968: jis0212<<14 | 0x33<<7 | 0x54, 32596 - 19968: jis0208<<14 | 0x45<<7 | 0x07, 32597 - 19968: jis0208<<14 | 0x45<<7 | 0x06, 32600 - 19968: jis0208<<14 | 0x45<<7 | 0x08, 32603 - 19968: jis0212<<14 | 0x33<<7 | 0x55, 32604 - 19968: jis0212<<14 | 0x33<<7 | 0x56, 32605 - 19968: jis0212<<14 | 0x33<<7 | 0x57, 32607 - 19968: jis0208<<14 | 0x45<<7 | 0x09, 32608 - 19968: jis0208<<14 | 0x45<<7 | 0x0A, 32609 - 19968: jis0212<<14 | 0x33<<7 | 0x58, 32611 - 19968: jis0212<<14 | 0x33<<7 | 0x59, 32612 - 19968: jis0212<<14 | 0x33<<7 | 0x5A, 32613 - 19968: jis0212<<14 | 0x33<<7 | 0x5B, 32614 - 19968: jis0212<<14 | 0x33<<7 | 0x5C, 32615 - 19968: jis0208<<14 | 0x45<<7 | 0x0D, 32616 - 19968: jis0208<<14 | 0x45<<7 | 0x0B, 32617 - 19968: jis0208<<14 | 0x45<<7 | 0x0C, 32618 - 19968: jis0208<<14 | 0x19<<7 | 0x40, 32619 - 19968: jis0208<<14 | 0x16<<7 | 0x32, 32621 - 19968: jis0212<<14 | 0x33<<7 | 0x5D, 32622 - 19968: jis0208<<14 | 0x22<<7 | 0x35, 32624 - 19968: jis0208<<14 | 0x27<<7 | 0x12, 32625 - 19968: jis0212<<14 | 0x34<<7 | 0x00, 32626 - 19968: jis0208<<14 | 0x1C<<7 | 0x4F, 32629 - 19968: jis0208<<14 | 0x26<<7 | 0x2C, 32631 - 19968: jis0208<<14 | 0x27<<7 | 0x4C, 32632 - 19968: jis0208<<14 | 0x45<<7 | 0x0E, 32633 - 19968: jis0208<<14 | 0x37<<7 | 0x4C, 32637 - 19968: jis0212<<14 | 0x34<<7 | 0x01, 32638 - 19968: jis0212<<14 | 0x34<<7 | 0x02, 32639 - 19968: jis0212<<14 | 0x34<<7 | 0x03, 32640 - 19968: jis0212<<14 | 0x34<<7 | 0x04, 32642 - 19968: jis0208<<14 | 0x45<<7 | 0x0F, 32643 - 19968: jis0208<<14 | 0x45<<7 | 0x11, 32645 - 19968: jis0208<<14 | 0x2C<<7 | 0x44, 32646 - 19968: jis0208<<14 | 0x45<<7 | 0x10, 32647 - 19968: jis0208<<14 | 0x45<<7 | 0x13, 32648 - 19968: jis0208<<14 | 0x45<<7 | 0x12, 32650 - 19968: jis0208<<14 | 0x2C<<7 | 0x32, 32651 - 19968: jis0212<<14 | 0x34<<7 | 0x05, 32652 - 19968: jis0208<<14 | 0x45<<7 | 0x14, 32653 - 19968: jis0212<<14 | 0x34<<7 | 0x06, 32654 - 19968: jis0208<<14 | 0x27<<7 | 0x5D, 32655 - 19968: jis0212<<14 | 0x34<<7 | 0x07, 32656 - 19968: jis0212<<14 | 0x34<<7 | 0x08, 32657 - 19968: jis0212<<14 | 0x34<<7 | 0x09, 32660 - 19968: jis0208<<14 | 0x45<<7 | 0x15, 32662 - 19968: jis0212<<14 | 0x34<<7 | 0x0A, 32663 - 19968: jis0212<<14 | 0x34<<7 | 0x0B, 32666 - 19968: jis0208<<14 | 0x45<<7 | 0x18, 32668 - 19968: jis0212<<14 | 0x34<<7 | 0x0C, 32669 - 19968: jis0208<<14 | 0x45<<7 | 0x17, 32670 - 19968: jis0208<<14 | 0x45<<7 | 0x16, 32673 - 19968: jis0208<<14 | 0x5A<<7 | 0x34, 32674 - 19968: jis0212<<14 | 0x34<<7 | 0x0E, 32675 - 19968: jis0208<<14 | 0x45<<7 | 0x19, 32676 - 19968: jis0208<<14 | 0x16<<7 | 0x11, 32678 - 19968: jis0212<<14 | 0x34<<7 | 0x0F, 32680 - 19968: jis0208<<14 | 0x20<<7 | 0x01, 32681 - 19968: jis0208<<14 | 0x14<<7 | 0x20, 32682 - 19968: jis0212<<14 | 0x34<<7 | 0x10, 32685 - 19968: jis0212<<14 | 0x34<<7 | 0x11, 32686 - 19968: jis0208<<14 | 0x45<<7 | 0x1D, 32687 - 19968: jis0208<<14 | 0x45<<7 | 0x1A, 32690 - 19968: jis0208<<14 | 0x45<<7 | 0x1B, 32692 - 19968: jis0212<<14 | 0x34<<7 | 0x12, 32694 - 19968: jis0208<<14 | 0x45<<7 | 0x1E, 32696 - 19968: jis0208<<14 | 0x45<<7 | 0x1F, 32697 - 19968: jis0208<<14 | 0x45<<7 | 0x1C, 32700 - 19968: jis0212<<14 | 0x34<<7 | 0x13, 32701 - 19968: jis0208<<14 | 0x10<<7 | 0x08, 32703 - 19968: jis0212<<14 | 0x34<<7 | 0x14, 32704 - 19968: jis0212<<14 | 0x34<<7 | 0x15, 32705 - 19968: jis0208<<14 | 0x11<<7 | 0x06, 32707 - 19968: jis0212<<14 | 0x34<<7 | 0x16, 32709 - 19968: jis0208<<14 | 0x45<<7 | 0x21, 32710 - 19968: jis0208<<14 | 0x45<<7 | 0x22, 32712 - 19968: jis0212<<14 | 0x34<<7 | 0x17, 32714 - 19968: jis0208<<14 | 0x45<<7 | 0x23, 32716 - 19968: jis0208<<14 | 0x2C<<7 | 0x41, 32718 - 19968: jis0212<<14 | 0x34<<7 | 0x18, 32719 - 19968: jis0212<<14 | 0x34<<7 | 0x19, 32722 - 19968: jis0208<<14 | 0x1C<<7 | 0x0B, 32724 - 19968: jis0208<<14 | 0x45<<7 | 0x25, 32725 - 19968: jis0208<<14 | 0x45<<7 | 0x24, 32731 - 19968: jis0212<<14 | 0x34<<7 | 0x1A, 32735 - 19968: jis0212<<14 | 0x34<<7 | 0x1B, 32736 - 19968: jis0208<<14 | 0x1E<<7 | 0x48, 32737 - 19968: jis0208<<14 | 0x45<<7 | 0x26, 32739 - 19968: jis0212<<14 | 0x34<<7 | 0x1C, 32741 - 19968: jis0212<<14 | 0x34<<7 | 0x1D, 32742 - 19968: jis0208<<14 | 0x45<<7 | 0x27, 32744 - 19968: jis0212<<14 | 0x34<<7 | 0x1E, 32745 - 19968: jis0208<<14 | 0x45<<7 | 0x28, 32747 - 19968: jis0208<<14 | 0x13<<7 | 0x44, 32748 - 19968: jis0212<<14 | 0x34<<7 | 0x1F, 32750 - 19968: jis0212<<14 | 0x34<<7 | 0x20, 32751 - 19968: jis0212<<14 | 0x34<<7 | 0x21, 32752 - 19968: jis0208<<14 | 0x13<<7 | 0x2C, 32754 - 19968: jis0212<<14 | 0x34<<7 | 0x22, 32755 - 19968: jis0208<<14 | 0x45<<7 | 0x29, 32761 - 19968: jis0208<<14 | 0x45<<7 | 0x2A, 32762 - 19968: jis0212<<14 | 0x34<<7 | 0x23, 32763 - 19968: jis0208<<14 | 0x2A<<7 | 0x3C, 32764 - 19968: jis0208<<14 | 0x2C<<7 | 0x42, 32765 - 19968: jis0212<<14 | 0x34<<7 | 0x24, 32766 - 19968: jis0212<<14 | 0x34<<7 | 0x25, 32767 - 19968: jis0212<<14 | 0x34<<7 | 0x26, 32768 - 19968: jis0208<<14 | 0x2C<<7 | 0x33, 32769 - 19968: jis0208<<14 | 0x2E<<7 | 0x16, 32771 - 19968: jis0208<<14 | 0x18<<7 | 0x2C, 32772 - 19968: jis0208<<14 | 0x45<<7 | 0x2D, 32773 - 19968: jis0208<<14 | 0x1B<<7 | 0x33, 32774 - 19968: jis0208<<14 | 0x45<<7 | 0x2C, 32775 - 19968: jis0212<<14 | 0x34<<7 | 0x27, 32776 - 19968: jis0212<<14 | 0x34<<7 | 0x28, 32778 - 19968: jis0212<<14 | 0x34<<7 | 0x29, 32779 - 19968: jis0208<<14 | 0x45<<7 | 0x2E, 32780 - 19968: jis0208<<14 | 0x1B<<7 | 0x08, 32781 - 19968: jis0212<<14 | 0x34<<7 | 0x2A, 32782 - 19968: jis0212<<14 | 0x34<<7 | 0x2B, 32783 - 19968: jis0212<<14 | 0x34<<7 | 0x2C, 32784 - 19968: jis0208<<14 | 0x21<<7 | 0x30, 32785 - 19968: jis0212<<14 | 0x34<<7 | 0x2D, 32786 - 19968: jis0208<<14 | 0x45<<7 | 0x2F, 32787 - 19968: jis0212<<14 | 0x34<<7 | 0x2E, 32788 - 19968: jis0212<<14 | 0x34<<7 | 0x2F, 32789 - 19968: jis0208<<14 | 0x18<<7 | 0x2B, 32790 - 19968: jis0212<<14 | 0x34<<7 | 0x30, 32791 - 19968: jis0208<<14 | 0x2B<<7 | 0x36, 32792 - 19968: jis0208<<14 | 0x45<<7 | 0x30, 32793 - 19968: jis0208<<14 | 0x45<<7 | 0x31, 32796 - 19968: jis0208<<14 | 0x45<<7 | 0x32, 32797 - 19968: jis0212<<14 | 0x34<<7 | 0x31, 32798 - 19968: jis0212<<14 | 0x34<<7 | 0x32, 32799 - 19968: jis0212<<14 | 0x34<<7 | 0x33, 32800 - 19968: jis0212<<14 | 0x34<<7 | 0x34, 32801 - 19968: jis0208<<14 | 0x45<<7 | 0x33, 32804 - 19968: jis0212<<14 | 0x34<<7 | 0x35, 32806 - 19968: jis0212<<14 | 0x34<<7 | 0x36, 32808 - 19968: jis0208<<14 | 0x45<<7 | 0x34, 32812 - 19968: jis0212<<14 | 0x34<<7 | 0x37, 32814 - 19968: jis0212<<14 | 0x34<<7 | 0x38, 32816 - 19968: jis0212<<14 | 0x34<<7 | 0x39, 32819 - 19968: jis0208<<14 | 0x1B<<7 | 0x09, 32820 - 19968: jis0212<<14 | 0x34<<7 | 0x3A, 32821 - 19968: jis0212<<14 | 0x34<<7 | 0x3B, 32822 - 19968: jis0208<<14 | 0x2B<<7 | 0x4C, 32823 - 19968: jis0212<<14 | 0x34<<7 | 0x3C, 32825 - 19968: jis0212<<14 | 0x34<<7 | 0x3D, 32826 - 19968: jis0212<<14 | 0x34<<7 | 0x3E, 32827 - 19968: jis0208<<14 | 0x45<<7 | 0x36, 32828 - 19968: jis0212<<14 | 0x34<<7 | 0x3F, 32829 - 19968: jis0208<<14 | 0x22<<7 | 0x1E, 32830 - 19968: jis0212<<14 | 0x34<<7 | 0x40, 32831 - 19968: jis0208<<14 | 0x45<<7 | 0x35, 32832 - 19968: jis0212<<14 | 0x34<<7 | 0x41, 32836 - 19968: jis0212<<14 | 0x34<<7 | 0x42, 32838 - 19968: jis0208<<14 | 0x45<<7 | 0x38, 32842 - 19968: jis0208<<14 | 0x45<<7 | 0x37, 32850 - 19968: jis0208<<14 | 0x45<<7 | 0x39, 32854 - 19968: jis0208<<14 | 0x1F<<7 | 0x1A, 32856 - 19968: jis0208<<14 | 0x45<<7 | 0x3A, 32858 - 19968: jis0208<<14 | 0x45<<7 | 0x3B, 32862 - 19968: jis0208<<14 | 0x29<<7 | 0x18, 32863 - 19968: jis0208<<14 | 0x45<<7 | 0x3C, 32864 - 19968: jis0212<<14 | 0x34<<7 | 0x43, 32865 - 19968: jis0208<<14 | 0x20<<7 | 0x4E, 32866 - 19968: jis0208<<14 | 0x45<<7 | 0x3D, 32868 - 19968: jis0212<<14 | 0x34<<7 | 0x44, 32870 - 19968: jis0212<<14 | 0x34<<7 | 0x45, 32872 - 19968: jis0208<<14 | 0x45<<7 | 0x3E, 32877 - 19968: jis0212<<14 | 0x34<<7 | 0x46, 32879 - 19968: jis0208<<14 | 0x2D<<7 | 0x5D, 32880 - 19968: jis0208<<14 | 0x45<<7 | 0x41, 32881 - 19968: jis0212<<14 | 0x34<<7 | 0x47, 32882 - 19968: jis0208<<14 | 0x45<<7 | 0x40, 32883 - 19968: jis0208<<14 | 0x45<<7 | 0x3F, 32884 - 19968: jis0208<<14 | 0x23<<7 | 0x0F, 32885 - 19968: jis0212<<14 | 0x34<<7 | 0x48, 32886 - 19968: jis0208<<14 | 0x45<<7 | 0x42, 32887 - 19968: jis0208<<14 | 0x1E<<7 | 0x05, 32889 - 19968: jis0208<<14 | 0x45<<7 | 0x43, 32893 - 19968: jis0208<<14 | 0x45<<7 | 0x44, 32894 - 19968: jis0208<<14 | 0x2E<<7 | 0x17, 32895 - 19968: jis0208<<14 | 0x45<<7 | 0x45, 32897 - 19968: jis0212<<14 | 0x34<<7 | 0x49, 32900 - 19968: jis0208<<14 | 0x45<<7 | 0x46, 32901 - 19968: jis0208<<14 | 0x45<<7 | 0x48, 32902 - 19968: jis0208<<14 | 0x45<<7 | 0x47, 32903 - 19968: jis0208<<14 | 0x27<<7 | 0x04, 32904 - 19968: jis0212<<14 | 0x34<<7 | 0x4A, 32905 - 19968: jis0208<<14 | 0x25<<7 | 0x58, 32907 - 19968: jis0208<<14 | 0x2E<<7 | 0x1D, 32908 - 19968: jis0208<<14 | 0x27<<7 | 0x08, 32910 - 19968: jis0212<<14 | 0x34<<7 | 0x4B, 32915 - 19968: jis0208<<14 | 0x45<<7 | 0x4A, 32918 - 19968: jis0208<<14 | 0x1D<<7 | 0x32, 32920 - 19968: jis0208<<14 | 0x28<<7 | 0x09, 32922 - 19968: jis0208<<14 | 0x45<<7 | 0x4B, 32923 - 19968: jis0208<<14 | 0x45<<7 | 0x49, 32924 - 19968: jis0212<<14 | 0x34<<7 | 0x4C, 32925 - 19968: jis0208<<14 | 0x13<<7 | 0x2D, 32926 - 19968: jis0212<<14 | 0x34<<7 | 0x4D, 32929 - 19968: jis0208<<14 | 0x17<<7 | 0x33, 32930 - 19968: jis0208<<14 | 0x1A<<7 | 0x47, 32933 - 19968: jis0208<<14 | 0x27<<7 | 0x4D, 32934 - 19968: jis0212<<14 | 0x34<<7 | 0x4E, 32935 - 19968: jis0212<<14 | 0x34<<7 | 0x4F, 32937 - 19968: jis0208<<14 | 0x17<<7 | 0x09, 32938 - 19968: jis0208<<14 | 0x2A<<7 | 0x22, 32939 - 19968: jis0212<<14 | 0x34<<7 | 0x50, 32940 - 19968: jis0208<<14 | 0x45<<7 | 0x4E, 32941 - 19968: jis0208<<14 | 0x45<<7 | 0x4C, 32943 - 19968: jis0208<<14 | 0x18<<7 | 0x2D, 32945 - 19968: jis0208<<14 | 0x18<<7 | 0x2E, 32946 - 19968: jis0208<<14 | 0x0F<<7 | 0x48, 32948 - 19968: jis0208<<14 | 0x19<<7 | 0x47, 32952 - 19968: jis0212<<14 | 0x34<<7 | 0x51, 32953 - 19968: jis0212<<14 | 0x34<<7 | 0x52, 32954 - 19968: jis0208<<14 | 0x26<<7 | 0x38, 32963 - 19968: jis0208<<14 | 0x0F<<7 | 0x3E, 32964 - 19968: jis0208<<14 | 0x45<<7 | 0x53, 32966 - 19968: jis0208<<14 | 0x22<<7 | 0x1F, 32968 - 19968: jis0212<<14 | 0x34<<7 | 0x53, 32972 - 19968: jis0208<<14 | 0x26<<7 | 0x37, 32973 - 19968: jis0212<<14 | 0x34<<7 | 0x54, 32974 - 19968: jis0208<<14 | 0x21<<7 | 0x3A, 32975 - 19968: jis0212<<14 | 0x34<<7 | 0x55, 32978 - 19968: jis0212<<14 | 0x34<<7 | 0x56, 32980 - 19968: jis0212<<14 | 0x34<<7 | 0x57, 32981 - 19968: jis0212<<14 | 0x34<<7 | 0x58, 32982 - 19968: jis0208<<14 | 0x45<<7 | 0x55, 32983 - 19968: jis0212<<14 | 0x34<<7 | 0x59, 32984 - 19968: jis0212<<14 | 0x34<<7 | 0x5A, 32985 - 19968: jis0208<<14 | 0x45<<7 | 0x51, 32986 - 19968: jis0208<<14 | 0x45<<7 | 0x54, 32987 - 19968: jis0208<<14 | 0x45<<7 | 0x4F, 32989 - 19968: jis0208<<14 | 0x45<<7 | 0x52, 32990 - 19968: jis0208<<14 | 0x2A<<7 | 0x05, 32992 - 19968: jis0212<<14 | 0x34<<7 | 0x5B, 32993 - 19968: jis0208<<14 | 0x17<<7 | 0x34, 32996 - 19968: jis0208<<14 | 0x0F<<7 | 0x5C, 32997 - 19968: jis0208<<14 | 0x45<<7 | 0x50, 33005 - 19968: jis0212<<14 | 0x34<<7 | 0x5C, 33006 - 19968: jis0212<<14 | 0x34<<7 | 0x5D, 33007 - 19968: jis0208<<14 | 0x45<<7 | 0x57, 33008 - 19968: jis0212<<14 | 0x35<<7 | 0x00, 33009 - 19968: jis0208<<14 | 0x45<<7 | 0x58, 33010 - 19968: jis0212<<14 | 0x35<<7 | 0x01, 33011 - 19968: jis0212<<14 | 0x35<<7 | 0x02, 33012 - 19968: jis0208<<14 | 0x25<<7 | 0x18, 33014 - 19968: jis0212<<14 | 0x35<<7 | 0x03, 33016 - 19968: jis0208<<14 | 0x15<<7 | 0x1A, 33017 - 19968: jis0212<<14 | 0x35<<7 | 0x04, 33018 - 19968: jis0212<<14 | 0x35<<7 | 0x05, 33020 - 19968: jis0208<<14 | 0x46<<7 | 0x05, 33021 - 19968: jis0208<<14 | 0x26<<7 | 0x1C, 33022 - 19968: jis0212<<14 | 0x35<<7 | 0x06, 33026 - 19968: jis0208<<14 | 0x1A<<7 | 0x48, 33027 - 19968: jis0212<<14 | 0x35<<7 | 0x07, 33029 - 19968: jis0208<<14 | 0x15<<7 | 0x1B, 33030 - 19968: jis0208<<14 | 0x1F<<7 | 0x27, 33031 - 19968: jis0208<<14 | 0x2E<<7 | 0x25, 33032 - 19968: jis0208<<14 | 0x2B<<7 | 0x0D, 33033 - 19968: jis0208<<14 | 0x45<<7 | 0x56, 33034 - 19968: jis0208<<14 | 0x1F<<7 | 0x33, 33035 - 19968: jis0212<<14 | 0x35<<7 | 0x08, 33046 - 19968: jis0212<<14 | 0x35<<7 | 0x09, 33047 - 19968: jis0212<<14 | 0x35<<7 | 0x0A, 33048 - 19968: jis0212<<14 | 0x35<<7 | 0x0B, 33050 - 19968: jis0208<<14 | 0x14<<7 | 0x32, 33051 - 19968: jis0208<<14 | 0x45<<7 | 0x59, 33052 - 19968: jis0212<<14 | 0x35<<7 | 0x0C, 33054 - 19968: jis0212<<14 | 0x35<<7 | 0x0D, 33056 - 19968: jis0212<<14 | 0x35<<7 | 0x0E, 33059 - 19968: jis0208<<14 | 0x45<<7 | 0x5B, 33060 - 19968: jis0212<<14 | 0x35<<7 | 0x0F, 33063 - 19968: jis0212<<14 | 0x35<<7 | 0x10, 33065 - 19968: jis0208<<14 | 0x45<<7 | 0x5A, 33068 - 19968: jis0212<<14 | 0x35<<7 | 0x11, 33071 - 19968: jis0208<<14 | 0x45<<7 | 0x5C, 33072 - 19968: jis0212<<14 | 0x35<<7 | 0x12, 33073 - 19968: jis0208<<14 | 0x22<<7 | 0x05, 33075 - 19968: jis0208<<14 | 0x26<<7 | 0x1D, 33077 - 19968: jis0212<<14 | 0x35<<7 | 0x13, 33081 - 19968: jis0208<<14 | 0x23<<7 | 0x10, 33082 - 19968: jis0212<<14 | 0x35<<7 | 0x14, 33084 - 19968: jis0212<<14 | 0x35<<7 | 0x15, 33086 - 19968: jis0208<<14 | 0x46<<7 | 0x02, 33093 - 19968: jis0212<<14 | 0x35<<7 | 0x16, 33094 - 19968: jis0208<<14 | 0x46<<7 | 0x01, 33095 - 19968: jis0212<<14 | 0x35<<7 | 0x17, 33098 - 19968: jis0212<<14 | 0x35<<7 | 0x18, 33099 - 19968: jis0208<<14 | 0x45<<7 | 0x5D, 33100 - 19968: jis0212<<14 | 0x35<<7 | 0x19, 33102 - 19968: jis0208<<14 | 0x1E<<7 | 0x34, 33104 - 19968: jis0208<<14 | 0x28<<7 | 0x44, 33105 - 19968: jis0208<<14 | 0x46<<7 | 0x04, 33106 - 19968: jis0212<<14 | 0x35<<7 | 0x1A, 33107 - 19968: jis0208<<14 | 0x46<<7 | 0x03, 33108 - 19968: jis0208<<14 | 0x18<<7 | 0x2F, 33109 - 19968: jis0208<<14 | 0x2E<<7 | 0x32, 33111 - 19968: jis0212<<14 | 0x35<<7 | 0x1B, 33119 - 19968: jis0208<<14 | 0x46<<7 | 0x14, 33120 - 19968: jis0212<<14 | 0x35<<7 | 0x1C, 33121 - 19968: jis0212<<14 | 0x35<<7 | 0x1D, 33125 - 19968: jis0208<<14 | 0x46<<7 | 0x08, 33126 - 19968: jis0208<<14 | 0x46<<7 | 0x09, 33127 - 19968: jis0212<<14 | 0x35<<7 | 0x1E, 33128 - 19968: jis0212<<14 | 0x35<<7 | 0x1F, 33129 - 19968: jis0212<<14 | 0x35<<7 | 0x20, 33131 - 19968: jis0208<<14 | 0x1B<<7 | 0x4F, 33133 - 19968: jis0212<<14 | 0x35<<7 | 0x21, 33134 - 19968: jis0208<<14 | 0x46<<7 | 0x07, 33135 - 19968: jis0212<<14 | 0x35<<7 | 0x22, 33136 - 19968: jis0208<<14 | 0x18<<7 | 0x57, 33137 - 19968: jis0208<<14 | 0x46<<7 | 0x06, 33140 - 19968: jis0208<<14 | 0x46<<7 | 0x0A, 33143 - 19968: jis0212<<14 | 0x35<<7 | 0x23, 33144 - 19968: jis0208<<14 | 0x23<<7 | 0x11, 33145 - 19968: jis0208<<14 | 0x29<<7 | 0x01, 33146 - 19968: jis0208<<14 | 0x20<<7 | 0x02, 33151 - 19968: jis0208<<14 | 0x21<<7 | 0x3B, 33152 - 19968: jis0208<<14 | 0x46<<7 | 0x0E, 33153 - 19968: jis0212<<14 | 0x35<<7 | 0x24, 33154 - 19968: jis0208<<14 | 0x46<<7 | 0x0F, 33155 - 19968: jis0208<<14 | 0x46<<7 | 0x0B, 33156 - 19968: jis0212<<14 | 0x35<<7 | 0x26, 33157 - 19968: jis0212<<14 | 0x35<<7 | 0x27, 33158 - 19968: jis0212<<14 | 0x35<<7 | 0x28, 33160 - 19968: jis0208<<14 | 0x46<<7 | 0x0C, 33162 - 19968: jis0208<<14 | 0x46<<7 | 0x0D, 33163 - 19968: jis0212<<14 | 0x35<<7 | 0x29, 33166 - 19968: jis0212<<14 | 0x35<<7 | 0x2A, 33167 - 19968: jis0208<<14 | 0x18<<7 | 0x30, 33168 - 19968: jis0212<<14 | 0x35<<7 | 0x25, 33171 - 19968: jis0208<<14 | 0x46<<7 | 0x15, 33173 - 19968: jis0208<<14 | 0x46<<7 | 0x11, 33174 - 19968: jis0212<<14 | 0x35<<7 | 0x2B, 33176 - 19968: jis0212<<14 | 0x35<<7 | 0x2C, 33178 - 19968: jis0208<<14 | 0x28<<7 | 0x45, 33179 - 19968: jis0212<<14 | 0x35<<7 | 0x2D, 33180 - 19968: jis0208<<14 | 0x2A<<7 | 0x4B, 33181 - 19968: jis0208<<14 | 0x28<<7 | 0x07, 33182 - 19968: jis0212<<14 | 0x35<<7 | 0x2E, 33184 - 19968: jis0208<<14 | 0x46<<7 | 0x10, 33186 - 19968: jis0212<<14 | 0x35<<7 | 0x2F, 33187 - 19968: jis0208<<14 | 0x46<<7 | 0x13, 33188 - 19968: jis0208<<14 | 0x46<<7 | 0x12, 33192 - 19968: jis0208<<14 | 0x2A<<7 | 0x23, 33193 - 19968: jis0208<<14 | 0x46<<7 | 0x16, 33198 - 19968: jis0212<<14 | 0x35<<7 | 0x30, 33200 - 19968: jis0208<<14 | 0x46<<7 | 0x17, 33202 - 19968: jis0212<<14 | 0x35<<7 | 0x31, 33203 - 19968: jis0208<<14 | 0x20<<7 | 0x16, 33204 - 19968: jis0212<<14 | 0x35<<7 | 0x32, 33205 - 19968: jis0208<<14 | 0x46<<7 | 0x18, 33208 - 19968: jis0208<<14 | 0x46<<7 | 0x1A, 33210 - 19968: jis0208<<14 | 0x46<<7 | 0x1E, 33211 - 19968: jis0212<<14 | 0x35<<7 | 0x33, 33213 - 19968: jis0208<<14 | 0x46<<7 | 0x1B, 33214 - 19968: jis0208<<14 | 0x46<<7 | 0x19, 33215 - 19968: jis0208<<14 | 0x26<<7 | 0x1E, 33216 - 19968: jis0208<<14 | 0x46<<7 | 0x1C, 33218 - 19968: jis0208<<14 | 0x46<<7 | 0x1D, 33219 - 19968: jis0212<<14 | 0x35<<7 | 0x35, 33221 - 19968: jis0212<<14 | 0x35<<7 | 0x36, 33222 - 19968: jis0208<<14 | 0x11<<7 | 0x11, 33224 - 19968: jis0208<<14 | 0x46<<7 | 0x24, 33225 - 19968: jis0208<<14 | 0x46<<7 | 0x1F, 33226 - 19968: jis0212<<14 | 0x35<<7 | 0x37, 33227 - 19968: jis0212<<14 | 0x35<<7 | 0x34, 33229 - 19968: jis0208<<14 | 0x46<<7 | 0x20, 33230 - 19968: jis0212<<14 | 0x35<<7 | 0x38, 33231 - 19968: jis0212<<14 | 0x35<<7 | 0x39, 33233 - 19968: jis0208<<14 | 0x46<<7 | 0x21, 33235 - 19968: jis0208<<14 | 0x21<<7 | 0x00, 33237 - 19968: jis0212<<14 | 0x35<<7 | 0x3A, 33239 - 19968: jis0212<<14 | 0x35<<7 | 0x3B, 33240 - 19968: jis0208<<14 | 0x46<<7 | 0x23, 33241 - 19968: jis0208<<14 | 0x46<<7 | 0x22, 33242 - 19968: jis0208<<14 | 0x46<<7 | 0x25, 33243 - 19968: jis0212<<14 | 0x35<<7 | 0x3C, 33245 - 19968: jis0212<<14 | 0x35<<7 | 0x3D, 33246 - 19968: jis0212<<14 | 0x35<<7 | 0x3E, 33247 - 19968: jis0208<<14 | 0x46<<7 | 0x26, 33248 - 19968: jis0208<<14 | 0x46<<7 | 0x27, 33249 - 19968: jis0212<<14 | 0x35<<7 | 0x3F, 33251 - 19968: jis0208<<14 | 0x1E<<7 | 0x22, 33252 - 19968: jis0212<<14 | 0x35<<7 | 0x40, 33253 - 19968: jis0208<<14 | 0x11<<7 | 0x48, 33255 - 19968: jis0208<<14 | 0x46<<7 | 0x28, 33256 - 19968: jis0208<<14 | 0x2D<<7 | 0x36, 33258 - 19968: jis0208<<14 | 0x1B<<7 | 0x0A, 33259 - 19968: jis0212<<14 | 0x35<<7 | 0x41, 33260 - 19968: jis0212<<14 | 0x35<<7 | 0x42, 33261 - 19968: jis0208<<14 | 0x1C<<7 | 0x0C, 33264 - 19968: jis0212<<14 | 0x35<<7 | 0x43, 33265 - 19968: jis0212<<14 | 0x35<<7 | 0x44, 33266 - 19968: jis0212<<14 | 0x35<<7 | 0x45, 33267 - 19968: jis0208<<14 | 0x1A<<7 | 0x49, 33268 - 19968: jis0208<<14 | 0x22<<7 | 0x36, 33269 - 19968: jis0212<<14 | 0x35<<7 | 0x46, 33270 - 19968: jis0212<<14 | 0x35<<7 | 0x47, 33272 - 19968: jis0212<<14 | 0x35<<7 | 0x48, 33273 - 19968: jis0212<<14 | 0x35<<7 | 0x49, 33274 - 19968: jis0208<<14 | 0x46<<7 | 0x29, 33275 - 19968: jis0208<<14 | 0x46<<7 | 0x2A, 33276 - 19968: jis0208<<14 | 0x10<<7 | 0x10, 33277 - 19968: jis0212<<14 | 0x35<<7 | 0x4A, 33278 - 19968: jis0208<<14 | 0x46<<7 | 0x2B, 33279 - 19968: jis0212<<14 | 0x35<<7 | 0x4B, 33280 - 19968: jis0212<<14 | 0x35<<7 | 0x4C, 33281 - 19968: jis0208<<14 | 0x46<<7 | 0x2C, 33282 - 19968: jis0208<<14 | 0x46<<7 | 0x2D, 33283 - 19968: jis0212<<14 | 0x35<<7 | 0x4D, 33285 - 19968: jis0208<<14 | 0x46<<7 | 0x2E, 33287 - 19968: jis0208<<14 | 0x46<<7 | 0x2F, 33288 - 19968: jis0208<<14 | 0x15<<7 | 0x1C, 33289 - 19968: jis0208<<14 | 0x39<<7 | 0x09, 33290 - 19968: jis0208<<14 | 0x46<<7 | 0x30, 33292 - 19968: jis0208<<14 | 0x1F<<7 | 0x44, 33293 - 19968: jis0208<<14 | 0x46<<7 | 0x31, 33294 - 19968: jis0208<<14 | 0x1B<<7 | 0x2A, 33295 - 19968: jis0212<<14 | 0x35<<7 | 0x4E, 33296 - 19968: jis0208<<14 | 0x46<<7 | 0x32, 33298 - 19968: jis0208<<14 | 0x2F<<7 | 0x0F, 33299 - 19968: jis0212<<14 | 0x35<<7 | 0x4F, 33300 - 19968: jis0212<<14 | 0x35<<7 | 0x50, 33302 - 19968: jis0208<<14 | 0x46<<7 | 0x33, 33303 - 19968: jis0208<<14 | 0x29<<7 | 0x3D, 33304 - 19968: jis0208<<14 | 0x13<<7 | 0x3B, 33305 - 19968: jis0212<<14 | 0x35<<7 | 0x51, 33306 - 19968: jis0212<<14 | 0x35<<7 | 0x52, 33307 - 19968: jis0208<<14 | 0x20<<7 | 0x03, 33308 - 19968: jis0208<<14 | 0x1C<<7 | 0x37, 33309 - 19968: jis0212<<14 | 0x35<<7 | 0x53, 33310 - 19968: jis0208<<14 | 0x28<<7 | 0x50, 33311 - 19968: jis0208<<14 | 0x1C<<7 | 0x0D, 33313 - 19968: jis0212<<14 | 0x35<<7 | 0x54, 33314 - 19968: jis0212<<14 | 0x35<<7 | 0x55, 33320 - 19968: jis0212<<14 | 0x35<<7 | 0x56, 33321 - 19968: jis0208<<14 | 0x46<<7 | 0x34, 33322 - 19968: jis0208<<14 | 0x18<<7 | 0x31, 33323 - 19968: jis0208<<14 | 0x46<<7 | 0x35, 33324 - 19968: jis0208<<14 | 0x27<<7 | 0x2B, 33326 - 19968: jis0208<<14 | 0x46<<7 | 0x43, 33330 - 19968: jis0212<<14 | 0x35<<7 | 0x57, 33331 - 19968: jis0208<<14 | 0x46<<7 | 0x37, 33332 - 19968: jis0212<<14 | 0x35<<7 | 0x58, 33333 - 19968: jis0208<<14 | 0x21<<7 | 0x28, 33334 - 19968: jis0208<<14 | 0x26<<7 | 0x54, 33335 - 19968: jis0208<<14 | 0x17<<7 | 0x1E, 33336 - 19968: jis0208<<14 | 0x46<<7 | 0x36, 33337 - 19968: jis0208<<14 | 0x20<<7 | 0x04, 33338 - 19968: jis0212<<14 | 0x35<<7 | 0x59, 33344 - 19968: jis0208<<14 | 0x46<<7 | 0x38, 33347 - 19968: jis0212<<14 | 0x35<<7 | 0x5A, 33348 - 19968: jis0212<<14 | 0x35<<7 | 0x5B, 33349 - 19968: jis0212<<14 | 0x35<<7 | 0x5C, 33350 - 19968: jis0212<<14 | 0x35<<7 | 0x5D, 33351 - 19968: jis0208<<14 | 0x23<<7 | 0x59, 33355 - 19968: jis0212<<14 | 0x36<<7 | 0x00, 33358 - 19968: jis0212<<14 | 0x36<<7 | 0x01, 33359 - 19968: jis0212<<14 | 0x36<<7 | 0x02, 33361 - 19968: jis0212<<14 | 0x36<<7 | 0x03, 33366 - 19968: jis0212<<14 | 0x36<<7 | 0x04, 33368 - 19968: jis0208<<14 | 0x46<<7 | 0x3A, 33369 - 19968: jis0208<<14 | 0x46<<7 | 0x39, 33370 - 19968: jis0208<<14 | 0x46<<7 | 0x3C, 33372 - 19968: jis0212<<14 | 0x36<<7 | 0x05, 33373 - 19968: jis0208<<14 | 0x46<<7 | 0x3B, 33375 - 19968: jis0208<<14 | 0x46<<7 | 0x3D, 33376 - 19968: jis0212<<14 | 0x36<<7 | 0x06, 33378 - 19968: jis0208<<14 | 0x46<<7 | 0x3F, 33379 - 19968: jis0212<<14 | 0x36<<7 | 0x07, 33380 - 19968: jis0208<<14 | 0x46<<7 | 0x3E, 33382 - 19968: jis0208<<14 | 0x13<<7 | 0x2E, 33383 - 19968: jis0212<<14 | 0x36<<7 | 0x08, 33384 - 19968: jis0208<<14 | 0x46<<7 | 0x40, 33386 - 19968: jis0208<<14 | 0x46<<7 | 0x41, 33387 - 19968: jis0208<<14 | 0x46<<7 | 0x42, 33389 - 19968: jis0212<<14 | 0x36<<7 | 0x09, 33390 - 19968: jis0208<<14 | 0x19<<7 | 0x10, 33391 - 19968: jis0208<<14 | 0x2D<<7 | 0x28, 33393 - 19968: jis0208<<14 | 0x46<<7 | 0x44, 33394 - 19968: jis0208<<14 | 0x1E<<7 | 0x06, 33396 - 19968: jis0212<<14 | 0x36<<7 | 0x0A, 33398 - 19968: jis0208<<14 | 0x10<<7 | 0x4F, 33399 - 19968: jis0208<<14 | 0x46<<7 | 0x45, 33400 - 19968: jis0208<<14 | 0x46<<7 | 0x46, 33403 - 19968: jis0212<<14 | 0x36<<7 | 0x0B, 33405 - 19968: jis0212<<14 | 0x36<<7 | 0x0C, 33406 - 19968: jis0208<<14 | 0x46<<7 | 0x47, 33407 - 19968: jis0212<<14 | 0x36<<7 | 0x0D, 33408 - 19968: jis0212<<14 | 0x36<<7 | 0x0E, 33409 - 19968: jis0212<<14 | 0x36<<7 | 0x0F, 33411 - 19968: jis0212<<14 | 0x36<<7 | 0x10, 33412 - 19968: jis0212<<14 | 0x36<<7 | 0x11, 33415 - 19968: jis0212<<14 | 0x36<<7 | 0x12, 33417 - 19968: jis0212<<14 | 0x36<<7 | 0x13, 33418 - 19968: jis0212<<14 | 0x36<<7 | 0x14, 33419 - 19968: jis0208<<14 | 0x0F<<7 | 0x51, 33421 - 19968: jis0208<<14 | 0x46<<7 | 0x48, 33422 - 19968: jis0212<<14 | 0x36<<7 | 0x15, 33425 - 19968: jis0212<<14 | 0x36<<7 | 0x16, 33426 - 19968: jis0208<<14 | 0x46<<7 | 0x49, 33428 - 19968: jis0212<<14 | 0x36<<7 | 0x17, 33430 - 19968: jis0212<<14 | 0x36<<7 | 0x18, 33432 - 19968: jis0212<<14 | 0x36<<7 | 0x19, 33433 - 19968: jis0208<<14 | 0x28<<7 | 0x46, 33434 - 19968: jis0212<<14 | 0x36<<7 | 0x1A, 33435 - 19968: jis0212<<14 | 0x36<<7 | 0x1B, 33437 - 19968: jis0208<<14 | 0x1B<<7 | 0x26, 33439 - 19968: jis0208<<14 | 0x46<<7 | 0x4B, 33440 - 19968: jis0212<<14 | 0x36<<7 | 0x1C, 33441 - 19968: jis0212<<14 | 0x36<<7 | 0x1D, 33443 - 19968: jis0212<<14 | 0x36<<7 | 0x1E, 33444 - 19968: jis0212<<14 | 0x36<<7 | 0x1F, 33445 - 19968: jis0208<<14 | 0x12<<7 | 0x08, 33446 - 19968: jis0208<<14 | 0x0F<<7 | 0x11, 33447 - 19968: jis0212<<14 | 0x36<<7 | 0x20, 33448 - 19968: jis0212<<14 | 0x36<<7 | 0x21, 33449 - 19968: jis0212<<14 | 0x36<<7 | 0x22, 33450 - 19968: jis0212<<14 | 0x36<<7 | 0x23, 33451 - 19968: jis0208<<14 | 0x46<<7 | 0x4A, 33452 - 19968: jis0208<<14 | 0x46<<7 | 0x4D, 33453 - 19968: jis0208<<14 | 0x26<<7 | 0x2D, 33454 - 19968: jis0212<<14 | 0x36<<7 | 0x24, 33455 - 19968: jis0208<<14 | 0x1E<<7 | 0x23, 33456 - 19968: jis0212<<14 | 0x36<<7 | 0x25, 33457 - 19968: jis0208<<14 | 0x11<<7 | 0x35, 33458 - 19968: jis0212<<14 | 0x36<<7 | 0x26, 33459 - 19968: jis0208<<14 | 0x2A<<7 | 0x06, 33460 - 19968: jis0212<<14 | 0x36<<7 | 0x27, 33463 - 19968: jis0212<<14 | 0x36<<7 | 0x28, 33464 - 19968: jis0208<<14 | 0x16<<7 | 0x3C, 33465 - 19968: jis0208<<14 | 0x15<<7 | 0x3B, 33466 - 19968: jis0212<<14 | 0x36<<7 | 0x29, 33467 - 19968: jis0208<<14 | 0x46<<7 | 0x4C, 33468 - 19968: jis0212<<14 | 0x36<<7 | 0x2A, 33469 - 19968: jis0208<<14 | 0x11<<7 | 0x49, 33470 - 19968: jis0212<<14 | 0x36<<7 | 0x2B, 33471 - 19968: jis0212<<14 | 0x36<<7 | 0x2C, 33477 - 19968: jis0208<<14 | 0x13<<7 | 0x02, 33478 - 19968: jis0212<<14 | 0x36<<7 | 0x2D, 33488 - 19968: jis0212<<14 | 0x36<<7 | 0x2E, 33489 - 19968: jis0208<<14 | 0x10<<7 | 0x50, 33490 - 19968: jis0208<<14 | 0x46<<7 | 0x51, 33491 - 19968: jis0208<<14 | 0x2D<<7 | 0x49, 33492 - 19968: jis0208<<14 | 0x21<<7 | 0x3C, 33493 - 19968: jis0212<<14 | 0x36<<7 | 0x2F, 33495 - 19968: jis0208<<14 | 0x28<<7 | 0x23, 33497 - 19968: jis0208<<14 | 0x46<<7 | 0x5D, 33498 - 19968: jis0212<<14 | 0x36<<7 | 0x30, 33499 - 19968: jis0208<<14 | 0x11<<7 | 0x36, 33500 - 19968: jis0208<<14 | 0x46<<7 | 0x5B, 33502 - 19968: jis0208<<14 | 0x46<<7 | 0x59, 33503 - 19968: jis0208<<14 | 0x46<<7 | 0x50, 33504 - 19968: jis0212<<14 | 0x36<<7 | 0x31, 33505 - 19968: jis0208<<14 | 0x46<<7 | 0x4E, 33506 - 19968: jis0212<<14 | 0x36<<7 | 0x32, 33507 - 19968: jis0208<<14 | 0x46<<7 | 0x4F, 33508 - 19968: jis0212<<14 | 0x36<<7 | 0x33, 33509 - 19968: jis0208<<14 | 0x1B<<7 | 0x42, 33510 - 19968: jis0208<<14 | 0x15<<7 | 0x4B, 33511 - 19968: jis0208<<14 | 0x22<<7 | 0x56, 33512 - 19968: jis0212<<14 | 0x36<<7 | 0x34, 33514 - 19968: jis0212<<14 | 0x36<<7 | 0x35, 33515 - 19968: jis0208<<14 | 0x25<<7 | 0x30, 33517 - 19968: jis0212<<14 | 0x36<<7 | 0x36, 33519 - 19968: jis0212<<14 | 0x36<<7 | 0x37, 33521 - 19968: jis0208<<14 | 0x10<<7 | 0x30, 33523 - 19968: jis0208<<14 | 0x46<<7 | 0x53, 33524 - 19968: jis0208<<14 | 0x46<<7 | 0x52, 33526 - 19968: jis0212<<14 | 0x36<<7 | 0x38, 33527 - 19968: jis0212<<14 | 0x36<<7 | 0x39, 33529 - 19968: jis0208<<14 | 0x46<<7 | 0x58, 33530 - 19968: jis0208<<14 | 0x46<<7 | 0x54, 33531 - 19968: jis0208<<14 | 0x46<<7 | 0x57, 33533 - 19968: jis0212<<14 | 0x36<<7 | 0x3A, 33534 - 19968: jis0212<<14 | 0x36<<7 | 0x3B, 33536 - 19968: jis0212<<14 | 0x36<<7 | 0x3C, 33537 - 19968: jis0208<<14 | 0x5A<<7 | 0x36, 33538 - 19968: jis0208<<14 | 0x2B<<7 | 0x2F, 33539 - 19968: jis0208<<14 | 0x46<<7 | 0x56, 33540 - 19968: jis0208<<14 | 0x11<<7 | 0x37, 33541 - 19968: jis0208<<14 | 0x12<<7 | 0x5C, 33542 - 19968: jis0208<<14 | 0x46<<7 | 0x5A, 33543 - 19968: jis0212<<14 | 0x36<<7 | 0x3E, 33544 - 19968: jis0212<<14 | 0x36<<7 | 0x3F, 33545 - 19968: jis0208<<14 | 0x46<<7 | 0x5C, 33546 - 19968: jis0212<<14 | 0x36<<7 | 0x40, 33547 - 19968: jis0212<<14 | 0x36<<7 | 0x41, 33550 - 19968: jis0208<<14 | 0x16<<7 | 0x33, 33558 - 19968: jis0208<<14 | 0x47<<7 | 0x02, 33559 - 19968: jis0208<<14 | 0x47<<7 | 0x0B, 33560 - 19968: jis0208<<14 | 0x47<<7 | 0x0C, 33563 - 19968: jis0212<<14 | 0x36<<7 | 0x43, 33564 - 19968: jis0208<<14 | 0x0F<<7 | 0x0A, 33565 - 19968: jis0212<<14 | 0x36<<7 | 0x44, 33566 - 19968: jis0212<<14 | 0x36<<7 | 0x45, 33567 - 19968: jis0212<<14 | 0x36<<7 | 0x46, 33569 - 19968: jis0212<<14 | 0x36<<7 | 0x47, 33570 - 19968: jis0212<<14 | 0x36<<7 | 0x48, 33571 - 19968: jis0208<<14 | 0x47<<7 | 0x13, 33576 - 19968: jis0208<<14 | 0x0F<<7 | 0x50, 33579 - 19968: jis0208<<14 | 0x47<<7 | 0x0A, 33580 - 19968: jis0212<<14 | 0x36<<7 | 0x49, 33581 - 19968: jis0212<<14 | 0x36<<7 | 0x4A, 33582 - 19968: jis0212<<14 | 0x36<<7 | 0x4B, 33583 - 19968: jis0208<<14 | 0x47<<7 | 0x09, 33584 - 19968: jis0212<<14 | 0x36<<7 | 0x4C, 33585 - 19968: jis0208<<14 | 0x47<<7 | 0x04, 33586 - 19968: jis0208<<14 | 0x47<<7 | 0x03, 33587 - 19968: jis0212<<14 | 0x36<<7 | 0x4D, 33588 - 19968: jis0208<<14 | 0x47<<7 | 0x01, 33589 - 19968: jis0208<<14 | 0x47<<7 | 0x00, 33590 - 19968: jis0208<<14 | 0x22<<7 | 0x42, 33591 - 19968: jis0212<<14 | 0x36<<7 | 0x4E, 33592 - 19968: jis0208<<14 | 0x21<<7 | 0x5A, 33593 - 19968: jis0208<<14 | 0x47<<7 | 0x06, 33594 - 19968: jis0212<<14 | 0x36<<7 | 0x4F, 33596 - 19968: jis0212<<14 | 0x36<<7 | 0x50, 33597 - 19968: jis0212<<14 | 0x36<<7 | 0x51, 33600 - 19968: jis0208<<14 | 0x47<<7 | 0x05, 33602 - 19968: jis0212<<14 | 0x36<<7 | 0x52, 33603 - 19968: jis0212<<14 | 0x36<<7 | 0x53, 33604 - 19968: jis0212<<14 | 0x36<<7 | 0x54, 33605 - 19968: jis0208<<14 | 0x47<<7 | 0x08, 33607 - 19968: jis0212<<14 | 0x36<<7 | 0x55, 33609 - 19968: jis0208<<14 | 0x20<<7 | 0x4F, 33610 - 19968: jis0208<<14 | 0x16<<7 | 0x34, 33613 - 19968: jis0212<<14 | 0x36<<7 | 0x56, 33614 - 19968: jis0212<<14 | 0x36<<7 | 0x57, 33615 - 19968: jis0208<<14 | 0x10<<7 | 0x20, 33616 - 19968: jis0208<<14 | 0x47<<7 | 0x07, 33617 - 19968: jis0212<<14 | 0x36<<7 | 0x58, 33618 - 19968: jis0208<<14 | 0x18<<7 | 0x32, 33619 - 19968: jis0212<<14 | 0x37<<7 | 0x1D, 33620 - 19968: jis0212<<14 | 0x36<<7 | 0x42, 33621 - 19968: jis0212<<14 | 0x36<<7 | 0x59, 33622 - 19968: jis0212<<14 | 0x36<<7 | 0x5A, 33623 - 19968: jis0212<<14 | 0x36<<7 | 0x5B, 33624 - 19968: jis0208<<14 | 0x20<<7 | 0x50, 33634 - 19968: jis0208<<14 | 0x5A<<7 | 0x37, 33648 - 19968: jis0212<<14 | 0x36<<7 | 0x5C, 33651 - 19968: jis0208<<14 | 0x47<<7 | 0x19, 33653 - 19968: jis0208<<14 | 0x47<<7 | 0x1A, 33655 - 19968: jis0208<<14 | 0x11<<7 | 0x38, 33656 - 19968: jis0212<<14 | 0x36<<7 | 0x5D, 33659 - 19968: jis0208<<14 | 0x11<<7 | 0x0D, 33660 - 19968: jis0208<<14 | 0x47<<7 | 0x17, 33661 - 19968: jis0212<<14 | 0x37<<7 | 0x00, 33663 - 19968: jis0208<<14 | 0x5A<<7 | 0x38, 33664 - 19968: jis0212<<14 | 0x37<<7 | 0x02, 33666 - 19968: jis0212<<14 | 0x37<<7 | 0x03, 33668 - 19968: jis0212<<14 | 0x37<<7 | 0x04, 33669 - 19968: jis0208<<14 | 0x47<<7 | 0x0D, 33670 - 19968: jis0212<<14 | 0x37<<7 | 0x05, 33671 - 19968: jis0208<<14 | 0x47<<7 | 0x15, 33673 - 19968: jis0208<<14 | 0x47<<7 | 0x1C, 33674 - 19968: jis0208<<14 | 0x47<<7 | 0x16, 33677 - 19968: jis0212<<14 | 0x37<<7 | 0x06, 33678 - 19968: jis0208<<14 | 0x47<<7 | 0x14, 33682 - 19968: jis0212<<14 | 0x37<<7 | 0x07, 33683 - 19968: jis0208<<14 | 0x46<<7 | 0x55, 33684 - 19968: jis0212<<14 | 0x37<<7 | 0x08, 33685 - 19968: jis0212<<14 | 0x37<<7 | 0x09, 33686 - 19968: jis0208<<14 | 0x47<<7 | 0x12, 33688 - 19968: jis0212<<14 | 0x37<<7 | 0x0A, 33689 - 19968: jis0212<<14 | 0x37<<7 | 0x0B, 33690 - 19968: jis0208<<14 | 0x47<<7 | 0x0E, 33691 - 19968: jis0212<<14 | 0x37<<7 | 0x0C, 33692 - 19968: jis0212<<14 | 0x37<<7 | 0x0D, 33693 - 19968: jis0212<<14 | 0x37<<7 | 0x0E, 33694 - 19968: jis0208<<14 | 0x13<<7 | 0x2F, 33695 - 19968: jis0208<<14 | 0x47<<7 | 0x10, 33696 - 19968: jis0208<<14 | 0x47<<7 | 0x1B, 33698 - 19968: jis0208<<14 | 0x47<<7 | 0x11, 33702 - 19968: jis0212<<14 | 0x37<<7 | 0x0F, 33703 - 19968: jis0212<<14 | 0x37<<7 | 0x10, 33704 - 19968: jis0208<<14 | 0x47<<7 | 0x1D, 33705 - 19968: jis0212<<14 | 0x37<<7 | 0x11, 33706 - 19968: jis0208<<14 | 0x47<<7 | 0x0F, 33707 - 19968: jis0208<<14 | 0x26<<7 | 0x5B, 33708 - 19968: jis0212<<14 | 0x37<<7 | 0x12, 33709 - 19968: jis0212<<14 | 0x37<<7 | 0x2B, 33713 - 19968: jis0208<<14 | 0x2C<<7 | 0x48, 33717 - 19968: jis0208<<14 | 0x47<<7 | 0x18, 33725 - 19968: jis0208<<14 | 0x47<<7 | 0x2E, 33726 - 19968: jis0212<<14 | 0x37<<7 | 0x13, 33727 - 19968: jis0212<<14 | 0x37<<7 | 0x14, 33728 - 19968: jis0212<<14 | 0x37<<7 | 0x15, 33729 - 19968: jis0208<<14 | 0x47<<7 | 0x26, 33733 - 19968: jis0208<<14 | 0x1E<<7 | 0x5A, 33735 - 19968: jis0208<<14 | 0x5A<<7 | 0x39, 33737 - 19968: jis0212<<14 | 0x37<<7 | 0x17, 33738 - 19968: jis0208<<14 | 0x14<<7 | 0x25, 33740 - 19968: jis0208<<14 | 0x15<<7 | 0x3C, 33742 - 19968: jis0208<<14 | 0x47<<7 | 0x21, 33743 - 19968: jis0212<<14 | 0x37<<7 | 0x18, 33744 - 19968: jis0212<<14 | 0x37<<7 | 0x19, 33745 - 19968: jis0212<<14 | 0x37<<7 | 0x1A, 33747 - 19968: jis0208<<14 | 0x11<<7 | 0x3A, 33748 - 19968: jis0212<<14 | 0x37<<7 | 0x1B, 33750 - 19968: jis0208<<14 | 0x1D<<7 | 0x33, 33752 - 19968: jis0208<<14 | 0x47<<7 | 0x24, 33756 - 19968: jis0208<<14 | 0x19<<7 | 0x39, 33757 - 19968: jis0212<<14 | 0x37<<7 | 0x1C, 33759 - 19968: jis0208<<14 | 0x24<<7 | 0x30, 33760 - 19968: jis0208<<14 | 0x47<<7 | 0x29, 33768 - 19968: jis0212<<14 | 0x37<<7 | 0x1E, 33769 - 19968: jis0208<<14 | 0x29<<7 | 0x4D, 33770 - 19968: jis0212<<14 | 0x37<<7 | 0x1F, 33771 - 19968: jis0208<<14 | 0x47<<7 | 0x20, 33775 - 19968: jis0208<<14 | 0x11<<7 | 0x39, 33776 - 19968: jis0208<<14 | 0x17<<7 | 0x35, 33777 - 19968: jis0208<<14 | 0x28<<7 | 0x08, 33778 - 19968: jis0208<<14 | 0x47<<7 | 0x2A, 33780 - 19968: jis0208<<14 | 0x47<<7 | 0x1E, 33782 - 19968: jis0208<<14 | 0x5A<<7 | 0x3A, 33783 - 19968: jis0208<<14 | 0x47<<7 | 0x27, 33784 - 19968: jis0212<<14 | 0x37<<7 | 0x21, 33785 - 19968: jis0212<<14 | 0x37<<7 | 0x22, 33787 - 19968: jis0208<<14 | 0x47<<7 | 0x31, 33788 - 19968: jis0212<<14 | 0x37<<7 | 0x23, 33789 - 19968: jis0208<<14 | 0x47<<7 | 0x22, 33793 - 19968: jis0212<<14 | 0x37<<7 | 0x24, 33795 - 19968: jis0208<<14 | 0x47<<7 | 0x23, 33796 - 19968: jis0208<<14 | 0x25<<7 | 0x19, 33798 - 19968: jis0212<<14 | 0x37<<7 | 0x25, 33799 - 19968: jis0208<<14 | 0x47<<7 | 0x28, 33802 - 19968: jis0212<<14 | 0x37<<7 | 0x26, 33803 - 19968: jis0208<<14 | 0x47<<7 | 0x25, 33804 - 19968: jis0208<<14 | 0x2A<<7 | 0x07, 33805 - 19968: jis0208<<14 | 0x47<<7 | 0x2B, 33806 - 19968: jis0208<<14 | 0x0F<<7 | 0x3F, 33807 - 19968: jis0212<<14 | 0x37<<7 | 0x27, 33809 - 19968: jis0212<<14 | 0x37<<7 | 0x28, 33811 - 19968: jis0208<<14 | 0x47<<7 | 0x1F, 33813 - 19968: jis0212<<14 | 0x37<<7 | 0x29, 33817 - 19968: jis0212<<14 | 0x37<<7 | 0x2A, 33824 - 19968: jis0208<<14 | 0x47<<7 | 0x2D, 33826 - 19968: jis0208<<14 | 0x47<<7 | 0x2C, 33833 - 19968: jis0208<<14 | 0x26<<7 | 0x4A, 33834 - 19968: jis0208<<14 | 0x47<<7 | 0x33, 33836 - 19968: jis0208<<14 | 0x47<<7 | 0x3E, 33839 - 19968: jis0212<<14 | 0x37<<7 | 0x2C, 33841 - 19968: jis0208<<14 | 0x12<<7 | 0x5D, 33845 - 19968: jis0208<<14 | 0x47<<7 | 0x41, 33848 - 19968: jis0208<<14 | 0x47<<7 | 0x2F, 33849 - 19968: jis0212<<14 | 0x37<<7 | 0x2D, 33852 - 19968: jis0208<<14 | 0x47<<7 | 0x34, 33853 - 19968: jis0208<<14 | 0x2C<<7 | 0x4D, 33861 - 19968: jis0212<<14 | 0x37<<7 | 0x2E, 33862 - 19968: jis0208<<14 | 0x47<<7 | 0x3D, 33863 - 19968: jis0212<<14 | 0x37<<7 | 0x2F, 33864 - 19968: jis0208<<14 | 0x5A<<7 | 0x3B, 33865 - 19968: jis0208<<14 | 0x2C<<7 | 0x34, 33866 - 19968: jis0212<<14 | 0x37<<7 | 0x31, 33869 - 19968: jis0212<<14 | 0x37<<7 | 0x32, 33870 - 19968: jis0208<<14 | 0x2D<<7 | 0x09, 33871 - 19968: jis0212<<14 | 0x37<<7 | 0x33, 33873 - 19968: jis0212<<14 | 0x37<<7 | 0x34, 33874 - 19968: jis0212<<14 | 0x37<<7 | 0x35, 33878 - 19968: jis0212<<14 | 0x37<<7 | 0x36, 33879 - 19968: jis0208<<14 | 0x22<<7 | 0x57, 33880 - 19968: jis0212<<14 | 0x37<<7 | 0x37, 33881 - 19968: jis0212<<14 | 0x37<<7 | 0x38, 33882 - 19968: jis0212<<14 | 0x37<<7 | 0x39, 33883 - 19968: jis0208<<14 | 0x12<<7 | 0x4A, 33884 - 19968: jis0212<<14 | 0x37<<7 | 0x3A, 33888 - 19968: jis0212<<14 | 0x37<<7 | 0x3B, 33889 - 19968: jis0208<<14 | 0x28<<7 | 0x51, 33890 - 19968: jis0208<<14 | 0x47<<7 | 0x43, 33891 - 19968: jis0208<<14 | 0x25<<7 | 0x00, 33892 - 19968: jis0212<<14 | 0x37<<7 | 0x3C, 33893 - 19968: jis0212<<14 | 0x37<<7 | 0x3D, 33894 - 19968: jis0208<<14 | 0x0F<<7 | 0x10, 33895 - 19968: jis0212<<14 | 0x37<<7 | 0x3E, 33897 - 19968: jis0208<<14 | 0x47<<7 | 0x3C, 33898 - 19968: jis0212<<14 | 0x37<<7 | 0x3F, 33899 - 19968: jis0208<<14 | 0x47<<7 | 0x38, 33900 - 19968: jis0208<<14 | 0x20<<7 | 0x51, 33901 - 19968: jis0208<<14 | 0x47<<7 | 0x32, 33902 - 19968: jis0208<<14 | 0x47<<7 | 0x3A, 33903 - 19968: jis0208<<14 | 0x47<<7 | 0x3F, 33904 - 19968: jis0212<<14 | 0x37<<7 | 0x40, 33905 - 19968: jis0208<<14 | 0x26<<7 | 0x0B, 33907 - 19968: jis0212<<14 | 0x37<<7 | 0x41, 33908 - 19968: jis0212<<14 | 0x37<<7 | 0x42, 33909 - 19968: jis0208<<14 | 0x0F<<7 | 0x09, 33910 - 19968: jis0212<<14 | 0x37<<7 | 0x43, 33911 - 19968: jis0208<<14 | 0x47<<7 | 0x37, 33912 - 19968: jis0212<<14 | 0x37<<7 | 0x44, 33913 - 19968: jis0208<<14 | 0x47<<7 | 0x40, 33914 - 19968: jis0208<<14 | 0x28<<7 | 0x57, 33916 - 19968: jis0212<<14 | 0x37<<7 | 0x45, 33917 - 19968: jis0212<<14 | 0x37<<7 | 0x46, 33921 - 19968: jis0212<<14 | 0x37<<7 | 0x47, 33922 - 19968: jis0208<<14 | 0x47<<7 | 0x3B, 33924 - 19968: jis0208<<14 | 0x47<<7 | 0x36, 33925 - 19968: jis0212<<14 | 0x37<<7 | 0x48, 33931 - 19968: jis0208<<14 | 0x1D<<7 | 0x34, 33936 - 19968: jis0208<<14 | 0x1C<<7 | 0x0E, 33938 - 19968: jis0212<<14 | 0x37<<7 | 0x49, 33939 - 19968: jis0212<<14 | 0x37<<7 | 0x4A, 33940 - 19968: jis0208<<14 | 0x1B<<7 | 0x0B, 33941 - 19968: jis0212<<14 | 0x37<<7 | 0x4B, 33945 - 19968: jis0208<<14 | 0x2B<<7 | 0x37, 33948 - 19968: jis0208<<14 | 0x28<<7 | 0x26, 33950 - 19968: jis0212<<14 | 0x37<<7 | 0x4C, 33951 - 19968: jis0208<<14 | 0x47<<7 | 0x46, 33953 - 19968: jis0208<<14 | 0x47<<7 | 0x4F, 33958 - 19968: jis0212<<14 | 0x37<<7 | 0x4D, 33960 - 19968: jis0212<<14 | 0x37<<7 | 0x4E, 33961 - 19968: jis0212<<14 | 0x37<<7 | 0x4F, 33962 - 19968: jis0212<<14 | 0x37<<7 | 0x50, 33965 - 19968: jis0208<<14 | 0x47<<7 | 0x39, 33967 - 19968: jis0212<<14 | 0x37<<7 | 0x51, 33969 - 19968: jis0212<<14 | 0x37<<7 | 0x52, 33970 - 19968: jis0208<<14 | 0x12<<7 | 0x56, 33972 - 19968: jis0208<<14 | 0x5A<<7 | 0x3C, 33976 - 19968: jis0208<<14 | 0x1D<<7 | 0x57, 33977 - 19968: jis0208<<14 | 0x47<<7 | 0x44, 33978 - 19968: jis0212<<14 | 0x37<<7 | 0x54, 33979 - 19968: jis0208<<14 | 0x47<<7 | 0x49, 33980 - 19968: jis0208<<14 | 0x20<<7 | 0x52, 33981 - 19968: jis0212<<14 | 0x37<<7 | 0x55, 33982 - 19968: jis0212<<14 | 0x37<<7 | 0x56, 33983 - 19968: jis0208<<14 | 0x47<<7 | 0x45, 33984 - 19968: jis0212<<14 | 0x37<<7 | 0x57, 33985 - 19968: jis0208<<14 | 0x47<<7 | 0x4C, 33986 - 19968: jis0212<<14 | 0x37<<7 | 0x58, 33988 - 19968: jis0208<<14 | 0x22<<7 | 0x3E, 33990 - 19968: jis0208<<14 | 0x47<<7 | 0x4D, 33991 - 19968: jis0212<<14 | 0x37<<7 | 0x59, 33992 - 19968: jis0212<<14 | 0x37<<7 | 0x5A, 33993 - 19968: jis0208<<14 | 0x2C<<7 | 0x35, 33994 - 19968: jis0208<<14 | 0x47<<7 | 0x42, 33995 - 19968: jis0208<<14 | 0x12<<7 | 0x17, 33996 - 19968: jis0212<<14 | 0x37<<7 | 0x5B, 33997 - 19968: jis0208<<14 | 0x47<<7 | 0x48, 33999 - 19968: jis0212<<14 | 0x37<<7 | 0x5C, 34000 - 19968: jis0208<<14 | 0x47<<7 | 0x4B, 34001 - 19968: jis0208<<14 | 0x2B<<7 | 0x0B, 34003 - 19968: jis0212<<14 | 0x37<<7 | 0x5D, 34006 - 19968: jis0208<<14 | 0x47<<7 | 0x4E, 34009 - 19968: jis0208<<14 | 0x47<<7 | 0x47, 34010 - 19968: jis0208<<14 | 0x47<<7 | 0x4A, 34012 - 19968: jis0208<<14 | 0x58<<7 | 0x04, 34023 - 19968: jis0212<<14 | 0x38<<7 | 0x01, 34026 - 19968: jis0212<<14 | 0x38<<7 | 0x02, 34028 - 19968: jis0208<<14 | 0x2A<<7 | 0x08, 34030 - 19968: jis0208<<14 | 0x2E<<7 | 0x00, 34031 - 19968: jis0212<<14 | 0x38<<7 | 0x03, 34032 - 19968: jis0212<<14 | 0x38<<7 | 0x04, 34033 - 19968: jis0212<<14 | 0x38<<7 | 0x05, 34034 - 19968: jis0212<<14 | 0x38<<7 | 0x06, 34036 - 19968: jis0208<<14 | 0x47<<7 | 0x52, 34039 - 19968: jis0212<<14 | 0x38<<7 | 0x07, 34042 - 19968: jis0212<<14 | 0x38<<7 | 0x09, 34043 - 19968: jis0212<<14 | 0x38<<7 | 0x0A, 34044 - 19968: jis0208<<14 | 0x47<<7 | 0x59, 34045 - 19968: jis0212<<14 | 0x38<<7 | 0x0B, 34047 - 19968: jis0208<<14 | 0x47<<7 | 0x51, 34048 - 19968: jis0208<<14 | 0x1B<<7 | 0x22, 34050 - 19968: jis0212<<14 | 0x38<<7 | 0x0C, 34051 - 19968: jis0212<<14 | 0x38<<7 | 0x0D, 34054 - 19968: jis0208<<14 | 0x47<<7 | 0x30, 34055 - 19968: jis0212<<14 | 0x38<<7 | 0x0E, 34060 - 19968: jis0212<<14 | 0x38<<7 | 0x0F, 34062 - 19968: jis0212<<14 | 0x38<<7 | 0x10, 34064 - 19968: jis0212<<14 | 0x38<<7 | 0x11, 34065 - 19968: jis0208<<14 | 0x29<<7 | 0x2D, 34067 - 19968: jis0208<<14 | 0x2B<<7 | 0x01, 34068 - 19968: jis0208<<14 | 0x47<<7 | 0x58, 34069 - 19968: jis0208<<14 | 0x47<<7 | 0x57, 34071 - 19968: jis0208<<14 | 0x47<<7 | 0x53, 34072 - 19968: jis0208<<14 | 0x47<<7 | 0x54, 34074 - 19968: jis0208<<14 | 0x10<<7 | 0x15, 34076 - 19968: jis0212<<14 | 0x38<<7 | 0x12, 34078 - 19968: jis0212<<14 | 0x38<<7 | 0x13, 34079 - 19968: jis0208<<14 | 0x47<<7 | 0x56, 34081 - 19968: jis0208<<14 | 0x47<<7 | 0x50, 34082 - 19968: jis0212<<14 | 0x38<<7 | 0x14, 34083 - 19968: jis0212<<14 | 0x38<<7 | 0x15, 34084 - 19968: jis0212<<14 | 0x38<<7 | 0x16, 34085 - 19968: jis0212<<14 | 0x38<<7 | 0x17, 34086 - 19968: jis0208<<14 | 0x23<<7 | 0x34, 34087 - 19968: jis0212<<14 | 0x38<<7 | 0x18, 34090 - 19968: jis0212<<14 | 0x38<<7 | 0x19, 34091 - 19968: jis0212<<14 | 0x38<<7 | 0x1A, 34092 - 19968: jis0208<<14 | 0x47<<7 | 0x55, 34093 - 19968: jis0208<<14 | 0x0F<<7 | 0x5D, 34095 - 19968: jis0212<<14 | 0x38<<7 | 0x1B, 34098 - 19968: jis0212<<14 | 0x38<<7 | 0x08, 34099 - 19968: jis0212<<14 | 0x38<<7 | 0x1C, 34100 - 19968: jis0212<<14 | 0x38<<7 | 0x1D, 34101 - 19968: jis0208<<14 | 0x21<<7 | 0x01, 34102 - 19968: jis0212<<14 | 0x38<<7 | 0x1E, 34109 - 19968: jis0208<<14 | 0x29<<7 | 0x22, 34111 - 19968: jis0212<<14 | 0x38<<7 | 0x1F, 34112 - 19968: jis0208<<14 | 0x47<<7 | 0x5A, 34113 - 19968: jis0208<<14 | 0x48<<7 | 0x00, 34115 - 19968: jis0208<<14 | 0x27<<7 | 0x38, 34118 - 19968: jis0212<<14 | 0x38<<7 | 0x20, 34120 - 19968: jis0208<<14 | 0x47<<7 | 0x5D, 34121 - 19968: jis0208<<14 | 0x1D<<7 | 0x35, 34122 - 19968: jis0208<<14 | 0x1B<<7 | 0x28, 34123 - 19968: jis0208<<14 | 0x48<<7 | 0x02, 34126 - 19968: jis0208<<14 | 0x15<<7 | 0x1D, 34127 - 19968: jis0212<<14 | 0x38<<7 | 0x21, 34128 - 19968: jis0212<<14 | 0x38<<7 | 0x22, 34129 - 19968: jis0212<<14 | 0x38<<7 | 0x23, 34130 - 19968: jis0212<<14 | 0x38<<7 | 0x24, 34131 - 19968: jis0208<<14 | 0x5A<<7 | 0x3D, 34133 - 19968: jis0208<<14 | 0x48<<7 | 0x03, 34134 - 19968: jis0212<<14 | 0x38<<7 | 0x26, 34135 - 19968: jis0208<<14 | 0x28<<7 | 0x58, 34136 - 19968: jis0208<<14 | 0x47<<7 | 0x5C, 34137 - 19968: jis0208<<14 | 0x5A<<7 | 0x3E, 34138 - 19968: jis0208<<14 | 0x47<<7 | 0x35, 34140 - 19968: jis0212<<14 | 0x38<<7 | 0x28, 34141 - 19968: jis0212<<14 | 0x38<<7 | 0x29, 34142 - 19968: jis0212<<14 | 0x38<<7 | 0x2A, 34143 - 19968: jis0212<<14 | 0x38<<7 | 0x2B, 34144 - 19968: jis0212<<14 | 0x38<<7 | 0x2C, 34145 - 19968: jis0212<<14 | 0x38<<7 | 0x2D, 34146 - 19968: jis0212<<14 | 0x38<<7 | 0x2E, 34147 - 19968: jis0208<<14 | 0x47<<7 | 0x5B, 34148 - 19968: jis0212<<14 | 0x38<<7 | 0x2F, 34152 - 19968: jis0208<<14 | 0x2E<<7 | 0x2E, 34153 - 19968: jis0208<<14 | 0x25<<7 | 0x01, 34154 - 19968: jis0208<<14 | 0x28<<7 | 0x52, 34155 - 19968: jis0208<<14 | 0x5A<<7 | 0x3F, 34157 - 19968: jis0208<<14 | 0x48<<7 | 0x0A, 34159 - 19968: jis0212<<14 | 0x38<<7 | 0x31, 34167 - 19968: jis0208<<14 | 0x48<<7 | 0x10, 34169 - 19968: jis0212<<14 | 0x38<<7 | 0x32, 34170 - 19968: jis0212<<14 | 0x38<<7 | 0x33, 34171 - 19968: jis0212<<14 | 0x38<<7 | 0x34, 34173 - 19968: jis0212<<14 | 0x38<<7 | 0x35, 34174 - 19968: jis0208<<14 | 0x48<<7 | 0x11, 34175 - 19968: jis0212<<14 | 0x38<<7 | 0x36, 34176 - 19968: jis0208<<14 | 0x48<<7 | 0x04, 34177 - 19968: jis0212<<14 | 0x38<<7 | 0x37, 34180 - 19968: jis0208<<14 | 0x26<<7 | 0x55, 34181 - 19968: jis0212<<14 | 0x38<<7 | 0x38, 34182 - 19968: jis0212<<14 | 0x38<<7 | 0x39, 34183 - 19968: jis0208<<14 | 0x48<<7 | 0x0E, 34184 - 19968: jis0208<<14 | 0x48<<7 | 0x06, 34185 - 19968: jis0212<<14 | 0x38<<7 | 0x3A, 34186 - 19968: jis0208<<14 | 0x48<<7 | 0x08, 34187 - 19968: jis0212<<14 | 0x38<<7 | 0x3B, 34188 - 19968: jis0212<<14 | 0x38<<7 | 0x3C, 34191 - 19968: jis0212<<14 | 0x38<<7 | 0x3D, 34192 - 19968: jis0208<<14 | 0x48<<7 | 0x12, 34193 - 19968: jis0208<<14 | 0x48<<7 | 0x07, 34195 - 19968: jis0212<<14 | 0x38<<7 | 0x3E, 34196 - 19968: jis0208<<14 | 0x48<<7 | 0x0B, 34199 - 19968: jis0208<<14 | 0x10<<7 | 0x51, 34200 - 19968: jis0212<<14 | 0x38<<7 | 0x3F, 34201 - 19968: jis0208<<14 | 0x25<<7 | 0x44, 34203 - 19968: jis0208<<14 | 0x48<<7 | 0x0C, 34204 - 19968: jis0208<<14 | 0x48<<7 | 0x0F, 34205 - 19968: jis0212<<14 | 0x38<<7 | 0x40, 34207 - 19968: jis0212<<14 | 0x38<<7 | 0x41, 34208 - 19968: jis0212<<14 | 0x38<<7 | 0x42, 34210 - 19968: jis0212<<14 | 0x38<<7 | 0x43, 34212 - 19968: jis0208<<14 | 0x48<<7 | 0x05, 34213 - 19968: jis0212<<14 | 0x38<<7 | 0x44, 34214 - 19968: jis0208<<14 | 0x20<<7 | 0x05, 34215 - 19968: jis0212<<14 | 0x38<<7 | 0x45, 34216 - 19968: jis0208<<14 | 0x48<<7 | 0x09, 34217 - 19968: jis0208<<14 | 0x1A<<7 | 0x06, 34218 - 19968: jis0208<<14 | 0x1E<<7 | 0x24, 34219 - 19968: jis0208<<14 | 0x16<<7 | 0x0F, 34220 - 19968: jis0208<<14 | 0x2B<<7 | 0x53, 34221 - 19968: jis0212<<14 | 0x38<<7 | 0x53, 34222 - 19968: jis0208<<14 | 0x2B<<7 | 0x58, 34223 - 19968: jis0208<<14 | 0x1C<<7 | 0x51, 34224 - 19968: jis0208<<14 | 0x5A<<7 | 0x41, 34228 - 19968: jis0212<<14 | 0x38<<7 | 0x46, 34230 - 19968: jis0212<<14 | 0x38<<7 | 0x47, 34231 - 19968: jis0212<<14 | 0x38<<7 | 0x48, 34232 - 19968: jis0212<<14 | 0x38<<7 | 0x49, 34233 - 19968: jis0208<<14 | 0x48<<7 | 0x16, 34234 - 19968: jis0208<<14 | 0x48<<7 | 0x14, 34236 - 19968: jis0212<<14 | 0x38<<7 | 0x4A, 34237 - 19968: jis0212<<14 | 0x38<<7 | 0x4B, 34238 - 19968: jis0212<<14 | 0x38<<7 | 0x4C, 34239 - 19968: jis0212<<14 | 0x38<<7 | 0x4D, 34241 - 19968: jis0208<<14 | 0x2E<<7 | 0x2D, 34242 - 19968: jis0212<<14 | 0x38<<7 | 0x4E, 34247 - 19968: jis0212<<14 | 0x38<<7 | 0x4F, 34249 - 19968: jis0208<<14 | 0x48<<7 | 0x13, 34250 - 19968: jis0212<<14 | 0x38<<7 | 0x50, 34251 - 19968: jis0212<<14 | 0x38<<7 | 0x51, 34253 - 19968: jis0208<<14 | 0x2C<<7 | 0x54, 34254 - 19968: jis0212<<14 | 0x38<<7 | 0x52, 34255 - 19968: jis0208<<14 | 0x48<<7 | 0x15, 34256 - 19968: jis0208<<14 | 0x48<<7 | 0x17, 34261 - 19968: jis0208<<14 | 0x48<<7 | 0x18, 34264 - 19968: jis0212<<14 | 0x38<<7 | 0x54, 34266 - 19968: jis0212<<14 | 0x38<<7 | 0x55, 34268 - 19968: jis0208<<14 | 0x48<<7 | 0x1B, 34269 - 19968: jis0208<<14 | 0x48<<7 | 0x19, 34271 - 19968: jis0212<<14 | 0x38<<7 | 0x56, 34272 - 19968: jis0212<<14 | 0x38<<7 | 0x57, 34276 - 19968: jis0208<<14 | 0x25<<7 | 0x02, 34277 - 19968: jis0208<<14 | 0x48<<7 | 0x1A, 34278 - 19968: jis0212<<14 | 0x38<<7 | 0x58, 34280 - 19968: jis0212<<14 | 0x38<<7 | 0x59, 34281 - 19968: jis0208<<14 | 0x27<<7 | 0x2C, 34282 - 19968: jis0208<<14 | 0x48<<7 | 0x0D, 34285 - 19968: jis0212<<14 | 0x38<<7 | 0x5A, 34291 - 19968: jis0212<<14 | 0x38<<7 | 0x5B, 34294 - 19968: jis0212<<14 | 0x38<<7 | 0x5C, 34295 - 19968: jis0208<<14 | 0x1C<<7 | 0x52, 34297 - 19968: jis0208<<14 | 0x48<<7 | 0x1C, 34298 - 19968: jis0208<<14 | 0x48<<7 | 0x21, 34299 - 19968: jis0208<<14 | 0x20<<7 | 0x53, 34300 - 19968: jis0212<<14 | 0x38<<7 | 0x5D, 34302 - 19968: jis0208<<14 | 0x48<<7 | 0x20, 34303 - 19968: jis0212<<14 | 0x39<<7 | 0x00, 34304 - 19968: jis0212<<14 | 0x39<<7 | 0x01, 34306 - 19968: jis0208<<14 | 0x48<<7 | 0x01, 34308 - 19968: jis0212<<14 | 0x39<<7 | 0x02, 34309 - 19968: jis0212<<14 | 0x39<<7 | 0x03, 34310 - 19968: jis0208<<14 | 0x48<<7 | 0x22, 34311 - 19968: jis0208<<14 | 0x20<<7 | 0x28, 34314 - 19968: jis0208<<14 | 0x48<<7 | 0x1D, 34315 - 19968: jis0208<<14 | 0x48<<7 | 0x1F, 34317 - 19968: jis0212<<14 | 0x39<<7 | 0x04, 34318 - 19968: jis0212<<14 | 0x39<<7 | 0x05, 34320 - 19968: jis0212<<14 | 0x39<<7 | 0x06, 34321 - 19968: jis0212<<14 | 0x39<<7 | 0x07, 34322 - 19968: jis0212<<14 | 0x39<<7 | 0x08, 34323 - 19968: jis0208<<14 | 0x48<<7 | 0x1E, 34326 - 19968: jis0208<<14 | 0x3C<<7 | 0x10, 34327 - 19968: jis0208<<14 | 0x3C<<7 | 0x01, 34328 - 19968: jis0212<<14 | 0x39<<7 | 0x09, 34329 - 19968: jis0212<<14 | 0x39<<7 | 0x0A, 34330 - 19968: jis0208<<14 | 0x48<<7 | 0x24, 34331 - 19968: jis0212<<14 | 0x39<<7 | 0x0B, 34334 - 19968: jis0212<<14 | 0x39<<7 | 0x0C, 34337 - 19968: jis0212<<14 | 0x39<<7 | 0x0D, 34338 - 19968: jis0208<<14 | 0x48<<7 | 0x23, 34343 - 19968: jis0212<<14 | 0x39<<7 | 0x0E, 34345 - 19968: jis0212<<14 | 0x39<<7 | 0x0F, 34349 - 19968: jis0208<<14 | 0x2C<<7 | 0x55, 34351 - 19968: jis0208<<14 | 0x41<<7 | 0x1B, 34352 - 19968: jis0208<<14 | 0x48<<7 | 0x25, 34358 - 19968: jis0212<<14 | 0x39<<7 | 0x10, 34360 - 19968: jis0212<<14 | 0x39<<7 | 0x11, 34362 - 19968: jis0212<<14 | 0x39<<7 | 0x12, 34364 - 19968: jis0212<<14 | 0x39<<7 | 0x13, 34365 - 19968: jis0212<<14 | 0x39<<7 | 0x14, 34367 - 19968: jis0208<<14 | 0x48<<7 | 0x26, 34368 - 19968: jis0212<<14 | 0x39<<7 | 0x15, 34369 - 19968: jis0212<<14 | 0x17<<7 | 0x45, 34370 - 19968: jis0212<<14 | 0x39<<7 | 0x16, 34374 - 19968: jis0212<<14 | 0x39<<7 | 0x17, 34381 - 19968: jis0208<<14 | 0x48<<7 | 0x27, 34382 - 19968: jis0208<<14 | 0x17<<7 | 0x36, 34384 - 19968: jis0208<<14 | 0x14<<7 | 0x33, 34386 - 19968: jis0212<<14 | 0x39<<7 | 0x18, 34387 - 19968: jis0212<<14 | 0x39<<7 | 0x19, 34388 - 19968: jis0208<<14 | 0x48<<7 | 0x29, 34389 - 19968: jis0208<<14 | 0x30<<7 | 0x3C, 34390 - 19968: jis0212<<14 | 0x39<<7 | 0x1A, 34391 - 19968: jis0212<<14 | 0x39<<7 | 0x1B, 34392 - 19968: jis0212<<14 | 0x39<<7 | 0x1C, 34393 - 19968: jis0212<<14 | 0x39<<7 | 0x1D, 34394 - 19968: jis0208<<14 | 0x14<<7 | 0x54, 34396 - 19968: jis0208<<14 | 0x2D<<7 | 0x19, 34397 - 19968: jis0212<<14 | 0x39<<7 | 0x1E, 34398 - 19968: jis0208<<14 | 0x15<<7 | 0x52, 34399 - 19968: jis0208<<14 | 0x48<<7 | 0x2A, 34400 - 19968: jis0212<<14 | 0x39<<7 | 0x1F, 34401 - 19968: jis0212<<14 | 0x39<<7 | 0x20, 34402 - 19968: jis0212<<14 | 0x39<<7 | 0x21, 34403 - 19968: jis0212<<14 | 0x39<<7 | 0x22, 34404 - 19968: jis0212<<14 | 0x39<<7 | 0x23, 34407 - 19968: jis0208<<14 | 0x48<<7 | 0x2B, 34409 - 19968: jis0212<<14 | 0x39<<7 | 0x24, 34411 - 19968: jis0208<<14 | 0x22<<7 | 0x4D, 34412 - 19968: jis0212<<14 | 0x39<<7 | 0x25, 34415 - 19968: jis0212<<14 | 0x39<<7 | 0x26, 34417 - 19968: jis0208<<14 | 0x48<<7 | 0x2C, 34421 - 19968: jis0212<<14 | 0x39<<7 | 0x27, 34422 - 19968: jis0212<<14 | 0x39<<7 | 0x28, 34423 - 19968: jis0212<<14 | 0x39<<7 | 0x29, 34425 - 19968: jis0208<<14 | 0x25<<7 | 0x59, 34426 - 19968: jis0212<<14 | 0x39<<7 | 0x2A, 34427 - 19968: jis0208<<14 | 0x0F<<7 | 0x19, 34440 - 19968: jis0212<<14 | 0x39<<7 | 0x4C, 34442 - 19968: jis0208<<14 | 0x11<<7 | 0x42, 34443 - 19968: jis0208<<14 | 0x48<<7 | 0x31, 34444 - 19968: jis0208<<14 | 0x48<<7 | 0x32, 34445 - 19968: jis0212<<14 | 0x39<<7 | 0x2B, 34449 - 19968: jis0212<<14 | 0x39<<7 | 0x2C, 34451 - 19968: jis0208<<14 | 0x48<<7 | 0x2D, 34453 - 19968: jis0208<<14 | 0x1A<<7 | 0x1C, 34454 - 19968: jis0212<<14 | 0x39<<7 | 0x2D, 34456 - 19968: jis0212<<14 | 0x39<<7 | 0x2E, 34458 - 19968: jis0212<<14 | 0x39<<7 | 0x2F, 34460 - 19968: jis0212<<14 | 0x39<<7 | 0x30, 34465 - 19968: jis0212<<14 | 0x39<<7 | 0x31, 34467 - 19968: jis0208<<14 | 0x48<<7 | 0x2E, 34468 - 19968: jis0208<<14 | 0x26<<7 | 0x21, 34470 - 19968: jis0212<<14 | 0x39<<7 | 0x32, 34471 - 19968: jis0212<<14 | 0x39<<7 | 0x33, 34472 - 19968: jis0212<<14 | 0x39<<7 | 0x34, 34473 - 19968: jis0208<<14 | 0x48<<7 | 0x2F, 34474 - 19968: jis0208<<14 | 0x48<<7 | 0x30, 34475 - 19968: jis0208<<14 | 0x48<<7 | 0x3A, 34477 - 19968: jis0212<<14 | 0x39<<7 | 0x35, 34479 - 19968: jis0208<<14 | 0x48<<7 | 0x34, 34480 - 19968: jis0208<<14 | 0x48<<7 | 0x37, 34481 - 19968: jis0212<<14 | 0x39<<7 | 0x36, 34483 - 19968: jis0212<<14 | 0x39<<7 | 0x37, 34484 - 19968: jis0212<<14 | 0x39<<7 | 0x38, 34485 - 19968: jis0212<<14 | 0x39<<7 | 0x39, 34486 - 19968: jis0208<<14 | 0x48<<7 | 0x33, 34487 - 19968: jis0212<<14 | 0x39<<7 | 0x3A, 34488 - 19968: jis0212<<14 | 0x39<<7 | 0x3B, 34489 - 19968: jis0212<<14 | 0x39<<7 | 0x3C, 34495 - 19968: jis0212<<14 | 0x39<<7 | 0x3D, 34496 - 19968: jis0212<<14 | 0x39<<7 | 0x3E, 34497 - 19968: jis0212<<14 | 0x39<<7 | 0x3F, 34499 - 19968: jis0212<<14 | 0x39<<7 | 0x40, 34500 - 19968: jis0208<<14 | 0x48<<7 | 0x35, 34501 - 19968: jis0212<<14 | 0x39<<7 | 0x41, 34502 - 19968: jis0208<<14 | 0x48<<7 | 0x36, 34503 - 19968: jis0208<<14 | 0x1B<<7 | 0x37, 34505 - 19968: jis0208<<14 | 0x48<<7 | 0x38, 34507 - 19968: jis0208<<14 | 0x22<<7 | 0x20, 34509 - 19968: jis0208<<14 | 0x16<<7 | 0x35, 34510 - 19968: jis0208<<14 | 0x12<<7 | 0x21, 34513 - 19968: jis0212<<14 | 0x39<<7 | 0x42, 34514 - 19968: jis0212<<14 | 0x39<<7 | 0x43, 34516 - 19968: jis0208<<14 | 0x48<<7 | 0x3B, 34517 - 19968: jis0212<<14 | 0x39<<7 | 0x44, 34519 - 19968: jis0212<<14 | 0x39<<7 | 0x45, 34521 - 19968: jis0208<<14 | 0x12<<7 | 0x1E, 34522 - 19968: jis0212<<14 | 0x39<<7 | 0x46, 34523 - 19968: jis0208<<14 | 0x48<<7 | 0x40, 34524 - 19968: jis0212<<14 | 0x39<<7 | 0x47, 34526 - 19968: jis0208<<14 | 0x48<<7 | 0x3C, 34527 - 19968: jis0208<<14 | 0x48<<7 | 0x3F, 34528 - 19968: jis0212<<14 | 0x39<<7 | 0x48, 34531 - 19968: jis0212<<14 | 0x39<<7 | 0x49, 34532 - 19968: jis0208<<14 | 0x27<<7 | 0x19, 34533 - 19968: jis0212<<14 | 0x39<<7 | 0x4A, 34535 - 19968: jis0212<<14 | 0x39<<7 | 0x4B, 34537 - 19968: jis0208<<14 | 0x48<<7 | 0x3D, 34540 - 19968: jis0208<<14 | 0x48<<7 | 0x3E, 34541 - 19968: jis0208<<14 | 0x28<<7 | 0x27, 34542 - 19968: jis0208<<14 | 0x27<<7 | 0x39, 34543 - 19968: jis0208<<14 | 0x48<<7 | 0x41, 34552 - 19968: jis0208<<14 | 0x21<<7 | 0x5C, 34553 - 19968: jis0208<<14 | 0x48<<7 | 0x4B, 34554 - 19968: jis0212<<14 | 0x39<<7 | 0x4D, 34555 - 19968: jis0208<<14 | 0x48<<7 | 0x47, 34556 - 19968: jis0212<<14 | 0x39<<7 | 0x4E, 34557 - 19968: jis0212<<14 | 0x39<<7 | 0x4F, 34558 - 19968: jis0208<<14 | 0x11<<7 | 0x4A, 34560 - 19968: jis0208<<14 | 0x48<<7 | 0x45, 34562 - 19968: jis0208<<14 | 0x2A<<7 | 0x09, 34563 - 19968: jis0208<<14 | 0x48<<7 | 0x46, 34564 - 19968: jis0212<<14 | 0x39<<7 | 0x50, 34565 - 19968: jis0212<<14 | 0x39<<7 | 0x51, 34566 - 19968: jis0208<<14 | 0x48<<7 | 0x43, 34567 - 19968: jis0212<<14 | 0x39<<7 | 0x52, 34568 - 19968: jis0208<<14 | 0x48<<7 | 0x44, 34569 - 19968: jis0208<<14 | 0x48<<7 | 0x49, 34570 - 19968: jis0208<<14 | 0x48<<7 | 0x4C, 34571 - 19968: jis0212<<14 | 0x39<<7 | 0x53, 34573 - 19968: jis0208<<14 | 0x48<<7 | 0x4A, 34574 - 19968: jis0212<<14 | 0x39<<7 | 0x54, 34575 - 19968: jis0212<<14 | 0x39<<7 | 0x55, 34576 - 19968: jis0212<<14 | 0x39<<7 | 0x56, 34577 - 19968: jis0208<<14 | 0x48<<7 | 0x48, 34578 - 19968: jis0208<<14 | 0x48<<7 | 0x42, 34579 - 19968: jis0212<<14 | 0x39<<7 | 0x57, 34580 - 19968: jis0212<<14 | 0x39<<7 | 0x58, 34584 - 19968: jis0208<<14 | 0x22<<7 | 0x37, 34585 - 19968: jis0212<<14 | 0x39<<7 | 0x59, 34586 - 19968: jis0208<<14 | 0x48<<7 | 0x53, 34588 - 19968: jis0208<<14 | 0x2B<<7 | 0x09, 34590 - 19968: jis0212<<14 | 0x39<<7 | 0x5A, 34591 - 19968: jis0212<<14 | 0x39<<7 | 0x5B, 34593 - 19968: jis0212<<14 | 0x39<<7 | 0x5C, 34595 - 19968: jis0212<<14 | 0x39<<7 | 0x5D, 34597 - 19968: jis0208<<14 | 0x48<<7 | 0x51, 34600 - 19968: jis0212<<14 | 0x3A<<7 | 0x00, 34601 - 19968: jis0208<<14 | 0x48<<7 | 0x52, 34606 - 19968: jis0212<<14 | 0x3A<<7 | 0x01, 34607 - 19968: jis0212<<14 | 0x3A<<7 | 0x02, 34609 - 19968: jis0212<<14 | 0x3A<<7 | 0x03, 34610 - 19968: jis0212<<14 | 0x3A<<7 | 0x04, 34612 - 19968: jis0208<<14 | 0x48<<7 | 0x4D, 34615 - 19968: jis0208<<14 | 0x48<<7 | 0x4F, 34617 - 19968: jis0212<<14 | 0x3A<<7 | 0x05, 34618 - 19968: jis0212<<14 | 0x3A<<7 | 0x06, 34619 - 19968: jis0208<<14 | 0x48<<7 | 0x50, 34620 - 19968: jis0212<<14 | 0x3A<<7 | 0x07, 34621 - 19968: jis0212<<14 | 0x3A<<7 | 0x08, 34622 - 19968: jis0212<<14 | 0x3A<<7 | 0x09, 34623 - 19968: jis0208<<14 | 0x48<<7 | 0x4E, 34624 - 19968: jis0212<<14 | 0x3A<<7 | 0x0A, 34627 - 19968: jis0212<<14 | 0x3A<<7 | 0x0B, 34629 - 19968: jis0212<<14 | 0x3A<<7 | 0x0C, 34633 - 19968: jis0208<<14 | 0x1F<<7 | 0x45, 34635 - 19968: jis0208<<14 | 0x2E<<7 | 0x18, 34636 - 19968: jis0208<<14 | 0x48<<7 | 0x57, 34637 - 19968: jis0212<<14 | 0x3A<<7 | 0x0D, 34638 - 19968: jis0208<<14 | 0x48<<7 | 0x58, 34643 - 19968: jis0208<<14 | 0x49<<7 | 0x00, 34645 - 19968: jis0208<<14 | 0x1E<<7 | 0x09, 34647 - 19968: jis0208<<14 | 0x48<<7 | 0x5A, 34648 - 19968: jis0212<<14 | 0x3A<<7 | 0x0E, 34649 - 19968: jis0208<<14 | 0x48<<7 | 0x5D, 34653 - 19968: jis0212<<14 | 0x3A<<7 | 0x0F, 34655 - 19968: jis0208<<14 | 0x48<<7 | 0x55, 34656 - 19968: jis0208<<14 | 0x48<<7 | 0x54, 34657 - 19968: jis0212<<14 | 0x3A<<7 | 0x10, 34659 - 19968: jis0208<<14 | 0x49<<7 | 0x01, 34660 - 19968: jis0212<<14 | 0x3A<<7 | 0x11, 34661 - 19968: jis0212<<14 | 0x3A<<7 | 0x12, 34662 - 19968: jis0208<<14 | 0x11<<7 | 0x3B, 34664 - 19968: jis0208<<14 | 0x48<<7 | 0x5B, 34666 - 19968: jis0208<<14 | 0x49<<7 | 0x02, 34670 - 19968: jis0208<<14 | 0x48<<7 | 0x5C, 34671 - 19968: jis0212<<14 | 0x3A<<7 | 0x13, 34673 - 19968: jis0212<<14 | 0x3A<<7 | 0x14, 34674 - 19968: jis0212<<14 | 0x3A<<7 | 0x15, 34676 - 19968: jis0208<<14 | 0x48<<7 | 0x59, 34678 - 19968: jis0208<<14 | 0x23<<7 | 0x12, 34680 - 19968: jis0208<<14 | 0x48<<7 | 0x56, 34683 - 19968: jis0212<<14 | 0x3A<<7 | 0x16, 34687 - 19968: jis0208<<14 | 0x26<<7 | 0x47, 34690 - 19968: jis0208<<14 | 0x49<<7 | 0x06, 34691 - 19968: jis0212<<14 | 0x3A<<7 | 0x17, 34692 - 19968: jis0212<<14 | 0x3A<<7 | 0x18, 34693 - 19968: jis0212<<14 | 0x3A<<7 | 0x19, 34694 - 19968: jis0212<<14 | 0x3A<<7 | 0x1A, 34695 - 19968: jis0212<<14 | 0x3A<<7 | 0x1B, 34696 - 19968: jis0212<<14 | 0x3A<<7 | 0x1C, 34697 - 19968: jis0212<<14 | 0x3A<<7 | 0x1D, 34699 - 19968: jis0212<<14 | 0x3A<<7 | 0x1E, 34700 - 19968: jis0212<<14 | 0x3A<<7 | 0x1F, 34701 - 19968: jis0208<<14 | 0x2C<<7 | 0x1A, 34704 - 19968: jis0212<<14 | 0x3A<<7 | 0x20, 34707 - 19968: jis0212<<14 | 0x3A<<7 | 0x21, 34709 - 19968: jis0212<<14 | 0x3A<<7 | 0x22, 34711 - 19968: jis0212<<14 | 0x3A<<7 | 0x23, 34712 - 19968: jis0212<<14 | 0x3A<<7 | 0x24, 34713 - 19968: jis0212<<14 | 0x3A<<7 | 0x25, 34718 - 19968: jis0212<<14 | 0x3A<<7 | 0x26, 34719 - 19968: jis0208<<14 | 0x49<<7 | 0x05, 34720 - 19968: jis0212<<14 | 0x3A<<7 | 0x27, 34722 - 19968: jis0208<<14 | 0x49<<7 | 0x04, 34723 - 19968: jis0212<<14 | 0x3A<<7 | 0x28, 34727 - 19968: jis0212<<14 | 0x3A<<7 | 0x29, 34731 - 19968: jis0208<<14 | 0x49<<7 | 0x0D, 34732 - 19968: jis0212<<14 | 0x3A<<7 | 0x2A, 34733 - 19968: jis0212<<14 | 0x3A<<7 | 0x2B, 34734 - 19968: jis0212<<14 | 0x3A<<7 | 0x2C, 34735 - 19968: jis0208<<14 | 0x49<<7 | 0x07, 34737 - 19968: jis0212<<14 | 0x3A<<7 | 0x2D, 34739 - 19968: jis0208<<14 | 0x49<<7 | 0x0F, 34741 - 19968: jis0212<<14 | 0x3A<<7 | 0x2E, 34746 - 19968: jis0208<<14 | 0x2C<<7 | 0x45, 34747 - 19968: jis0208<<14 | 0x49<<7 | 0x12, 34749 - 19968: jis0208<<14 | 0x49<<7 | 0x09, 34750 - 19968: jis0212<<14 | 0x3A<<7 | 0x2F, 34751 - 19968: jis0212<<14 | 0x3A<<7 | 0x30, 34752 - 19968: jis0208<<14 | 0x49<<7 | 0x0A, 34753 - 19968: jis0212<<14 | 0x3A<<7 | 0x31, 34756 - 19968: jis0208<<14 | 0x49<<7 | 0x0E, 34758 - 19968: jis0208<<14 | 0x49<<7 | 0x11, 34759 - 19968: jis0208<<14 | 0x49<<7 | 0x10, 34760 - 19968: jis0212<<14 | 0x3A<<7 | 0x32, 34761 - 19968: jis0212<<14 | 0x3A<<7 | 0x33, 34762 - 19968: jis0212<<14 | 0x3A<<7 | 0x34, 34763 - 19968: jis0208<<14 | 0x49<<7 | 0x08, 34766 - 19968: jis0212<<14 | 0x3A<<7 | 0x35, 34768 - 19968: jis0208<<14 | 0x49<<7 | 0x0B, 34770 - 19968: jis0208<<14 | 0x49<<7 | 0x1C, 34773 - 19968: jis0212<<14 | 0x3A<<7 | 0x36, 34774 - 19968: jis0212<<14 | 0x3A<<7 | 0x37, 34777 - 19968: jis0212<<14 | 0x3A<<7 | 0x38, 34778 - 19968: jis0212<<14 | 0x3A<<7 | 0x39, 34780 - 19968: jis0212<<14 | 0x3A<<7 | 0x3A, 34783 - 19968: jis0212<<14 | 0x3A<<7 | 0x3B, 34784 - 19968: jis0208<<14 | 0x49<<7 | 0x15, 34786 - 19968: jis0212<<14 | 0x3A<<7 | 0x3C, 34787 - 19968: jis0212<<14 | 0x3A<<7 | 0x3D, 34788 - 19968: jis0212<<14 | 0x3A<<7 | 0x3E, 34794 - 19968: jis0212<<14 | 0x3A<<7 | 0x3F, 34795 - 19968: jis0212<<14 | 0x3A<<7 | 0x40, 34797 - 19968: jis0212<<14 | 0x3A<<7 | 0x41, 34799 - 19968: jis0208<<14 | 0x49<<7 | 0x13, 34801 - 19968: jis0212<<14 | 0x3A<<7 | 0x42, 34802 - 19968: jis0208<<14 | 0x49<<7 | 0x14, 34803 - 19968: jis0212<<14 | 0x3A<<7 | 0x43, 34806 - 19968: jis0208<<14 | 0x49<<7 | 0x19, 34807 - 19968: jis0208<<14 | 0x49<<7 | 0x1A, 34808 - 19968: jis0212<<14 | 0x3A<<7 | 0x44, 34809 - 19968: jis0208<<14 | 0x12<<7 | 0x09, 34810 - 19968: jis0212<<14 | 0x3A<<7 | 0x45, 34811 - 19968: jis0208<<14 | 0x14<<7 | 0x21, 34814 - 19968: jis0208<<14 | 0x49<<7 | 0x18, 34815 - 19968: jis0212<<14 | 0x3A<<7 | 0x46, 34817 - 19968: jis0212<<14 | 0x3A<<7 | 0x47, 34819 - 19968: jis0212<<14 | 0x3A<<7 | 0x48, 34821 - 19968: jis0208<<14 | 0x49<<7 | 0x03, 34822 - 19968: jis0212<<14 | 0x3A<<7 | 0x49, 34823 - 19968: jis0208<<14 | 0x5A<<7 | 0x44, 34825 - 19968: jis0212<<14 | 0x3A<<7 | 0x4A, 34826 - 19968: jis0212<<14 | 0x3A<<7 | 0x4B, 34827 - 19968: jis0212<<14 | 0x3A<<7 | 0x4C, 34829 - 19968: jis0208<<14 | 0x49<<7 | 0x17, 34830 - 19968: jis0208<<14 | 0x49<<7 | 0x1B, 34831 - 19968: jis0208<<14 | 0x49<<7 | 0x16, 34832 - 19968: jis0212<<14 | 0x3A<<7 | 0x4D, 34833 - 19968: jis0208<<14 | 0x49<<7 | 0x1D, 34834 - 19968: jis0212<<14 | 0x3A<<7 | 0x4F, 34835 - 19968: jis0212<<14 | 0x3A<<7 | 0x50, 34836 - 19968: jis0212<<14 | 0x3A<<7 | 0x51, 34837 - 19968: jis0208<<14 | 0x49<<7 | 0x1F, 34838 - 19968: jis0208<<14 | 0x49<<7 | 0x1E, 34840 - 19968: jis0212<<14 | 0x3A<<7 | 0x52, 34841 - 19968: jis0212<<14 | 0x3A<<7 | 0x4E, 34842 - 19968: jis0212<<14 | 0x3A<<7 | 0x53, 34843 - 19968: jis0212<<14 | 0x3A<<7 | 0x54, 34844 - 19968: jis0212<<14 | 0x3A<<7 | 0x55, 34846 - 19968: jis0212<<14 | 0x3A<<7 | 0x56, 34847 - 19968: jis0212<<14 | 0x3A<<7 | 0x57, 34849 - 19968: jis0208<<14 | 0x49<<7 | 0x21, 34850 - 19968: jis0208<<14 | 0x49<<7 | 0x20, 34851 - 19968: jis0208<<14 | 0x48<<7 | 0x39, 34855 - 19968: jis0208<<14 | 0x49<<7 | 0x25, 34856 - 19968: jis0212<<14 | 0x3A<<7 | 0x58, 34861 - 19968: jis0212<<14 | 0x3A<<7 | 0x59, 34862 - 19968: jis0212<<14 | 0x3A<<7 | 0x5A, 34864 - 19968: jis0212<<14 | 0x3A<<7 | 0x5B, 34865 - 19968: jis0208<<14 | 0x49<<7 | 0x22, 34866 - 19968: jis0212<<14 | 0x3A<<7 | 0x5C, 34869 - 19968: jis0212<<14 | 0x3A<<7 | 0x5D, 34870 - 19968: jis0208<<14 | 0x49<<7 | 0x23, 34873 - 19968: jis0208<<14 | 0x49<<7 | 0x24, 34874 - 19968: jis0212<<14 | 0x3B<<7 | 0x00, 34875 - 19968: jis0208<<14 | 0x49<<7 | 0x26, 34876 - 19968: jis0212<<14 | 0x3B<<7 | 0x01, 34880 - 19968: jis0208<<14 | 0x16<<7 | 0x4B, 34881 - 19968: jis0212<<14 | 0x3B<<7 | 0x02, 34882 - 19968: jis0208<<14 | 0x49<<7 | 0x28, 34883 - 19968: jis0212<<14 | 0x3B<<7 | 0x03, 34884 - 19968: jis0208<<14 | 0x49<<7 | 0x27, 34885 - 19968: jis0212<<14 | 0x3B<<7 | 0x04, 34886 - 19968: jis0208<<14 | 0x1C<<7 | 0x0F, 34888 - 19968: jis0212<<14 | 0x3B<<7 | 0x05, 34889 - 19968: jis0212<<14 | 0x3B<<7 | 0x06, 34890 - 19968: jis0212<<14 | 0x3B<<7 | 0x07, 34891 - 19968: jis0212<<14 | 0x3B<<7 | 0x08, 34892 - 19968: jis0208<<14 | 0x18<<7 | 0x33, 34893 - 19968: jis0208<<14 | 0x3D<<7 | 0x06, 34894 - 19968: jis0212<<14 | 0x3B<<7 | 0x09, 34897 - 19968: jis0212<<14 | 0x3B<<7 | 0x0A, 34898 - 19968: jis0208<<14 | 0x49<<7 | 0x29, 34899 - 19968: jis0208<<14 | 0x1C<<7 | 0x30, 34901 - 19968: jis0212<<14 | 0x3B<<7 | 0x0B, 34902 - 19968: jis0212<<14 | 0x3B<<7 | 0x0C, 34903 - 19968: jis0208<<14 | 0x12<<7 | 0x18, 34904 - 19968: jis0212<<14 | 0x3B<<7 | 0x0D, 34905 - 19968: jis0208<<14 | 0x49<<7 | 0x2A, 34906 - 19968: jis0212<<14 | 0x3B<<7 | 0x0E, 34907 - 19968: jis0208<<14 | 0x10<<7 | 0x31, 34908 - 19968: jis0212<<14 | 0x3B<<7 | 0x0F, 34909 - 19968: jis0208<<14 | 0x1D<<7 | 0x36, 34910 - 19968: jis0208<<14 | 0x49<<7 | 0x2B, 34911 - 19968: jis0212<<14 | 0x3B<<7 | 0x10, 34912 - 19968: jis0212<<14 | 0x3B<<7 | 0x11, 34913 - 19968: jis0208<<14 | 0x18<<7 | 0x34, 34914 - 19968: jis0208<<14 | 0x49<<7 | 0x2C, 34915 - 19968: jis0208<<14 | 0x0F<<7 | 0x40, 34916 - 19968: jis0212<<14 | 0x3B<<7 | 0x12, 34920 - 19968: jis0208<<14 | 0x28<<7 | 0x1C, 34921 - 19968: jis0212<<14 | 0x3B<<7 | 0x13, 34923 - 19968: jis0208<<14 | 0x49<<7 | 0x2D, 34928 - 19968: jis0208<<14 | 0x1E<<7 | 0x49, 34929 - 19968: jis0212<<14 | 0x3B<<7 | 0x14, 34930 - 19968: jis0208<<14 | 0x49<<7 | 0x34, 34933 - 19968: jis0208<<14 | 0x49<<7 | 0x31, 34935 - 19968: jis0208<<14 | 0x22<<7 | 0x4E, 34937 - 19968: jis0212<<14 | 0x3B<<7 | 0x15, 34939 - 19968: jis0212<<14 | 0x3B<<7 | 0x16, 34941 - 19968: jis0208<<14 | 0x49<<7 | 0x32, 34942 - 19968: jis0208<<14 | 0x49<<7 | 0x2F, 34943 - 19968: jis0208<<14 | 0x15<<7 | 0x3D, 34944 - 19968: jis0212<<14 | 0x3B<<7 | 0x17, 34945 - 19968: jis0208<<14 | 0x49<<7 | 0x2E, 34946 - 19968: jis0208<<14 | 0x49<<7 | 0x35, 34952 - 19968: jis0208<<14 | 0x16<<7 | 0x15, 34955 - 19968: jis0208<<14 | 0x21<<7 | 0x3D, 34957 - 19968: jis0208<<14 | 0x49<<7 | 0x3B, 34962 - 19968: jis0208<<14 | 0x49<<7 | 0x37, 34966 - 19968: jis0208<<14 | 0x21<<7 | 0x14, 34967 - 19968: jis0208<<14 | 0x49<<7 | 0x36, 34968 - 19968: jis0212<<14 | 0x3B<<7 | 0x18, 34969 - 19968: jis0208<<14 | 0x49<<7 | 0x39, 34970 - 19968: jis0212<<14 | 0x3B<<7 | 0x19, 34971 - 19968: jis0212<<14 | 0x3B<<7 | 0x1A, 34972 - 19968: jis0212<<14 | 0x3B<<7 | 0x1B, 34974 - 19968: jis0208<<14 | 0x49<<7 | 0x30, 34975 - 19968: jis0212<<14 | 0x3B<<7 | 0x1C, 34976 - 19968: jis0212<<14 | 0x3B<<7 | 0x1D, 34978 - 19968: jis0208<<14 | 0x49<<7 | 0x3A, 34980 - 19968: jis0208<<14 | 0x49<<7 | 0x3C, 34984 - 19968: jis0212<<14 | 0x3B<<7 | 0x1E, 34986 - 19968: jis0212<<14 | 0x3B<<7 | 0x1F, 34987 - 19968: jis0208<<14 | 0x27<<7 | 0x4E, 34990 - 19968: jis0208<<14 | 0x49<<7 | 0x38, 34992 - 19968: jis0208<<14 | 0x49<<7 | 0x3D, 34993 - 19968: jis0208<<14 | 0x49<<7 | 0x3F, 34996 - 19968: jis0208<<14 | 0x17<<7 | 0x32, 34997 - 19968: jis0208<<14 | 0x49<<7 | 0x33, 34999 - 19968: jis0208<<14 | 0x0F<<7 | 0x20, 35002 - 19968: jis0212<<14 | 0x3B<<7 | 0x20, 35005 - 19968: jis0212<<14 | 0x3B<<7 | 0x21, 35006 - 19968: jis0212<<14 | 0x3B<<7 | 0x22, 35007 - 19968: jis0208<<14 | 0x49<<7 | 0x3E, 35008 - 19968: jis0212<<14 | 0x3B<<7 | 0x23, 35009 - 19968: jis0208<<14 | 0x19<<7 | 0x3A, 35010 - 19968: jis0208<<14 | 0x2D<<7 | 0x55, 35011 - 19968: jis0208<<14 | 0x49<<7 | 0x40, 35012 - 19968: jis0208<<14 | 0x49<<7 | 0x41, 35013 - 19968: jis0208<<14 | 0x20<<7 | 0x54, 35018 - 19968: jis0212<<14 | 0x3B<<7 | 0x24, 35019 - 19968: jis0212<<14 | 0x3B<<7 | 0x25, 35020 - 19968: jis0212<<14 | 0x3B<<7 | 0x26, 35021 - 19968: jis0212<<14 | 0x3B<<7 | 0x27, 35022 - 19968: jis0212<<14 | 0x3B<<7 | 0x28, 35023 - 19968: jis0208<<14 | 0x2D<<7 | 0x01, 35025 - 19968: jis0212<<14 | 0x3B<<7 | 0x29, 35026 - 19968: jis0212<<14 | 0x3B<<7 | 0x2A, 35027 - 19968: jis0212<<14 | 0x3B<<7 | 0x2B, 35028 - 19968: jis0208<<14 | 0x49<<7 | 0x42, 35029 - 19968: jis0208<<14 | 0x2C<<7 | 0x14, 35032 - 19968: jis0208<<14 | 0x49<<7 | 0x43, 35033 - 19968: jis0208<<14 | 0x49<<7 | 0x44, 35035 - 19968: jis0212<<14 | 0x3B<<7 | 0x2C, 35036 - 19968: jis0208<<14 | 0x29<<7 | 0x43, 35037 - 19968: jis0208<<14 | 0x49<<7 | 0x45, 35038 - 19968: jis0212<<14 | 0x3B<<7 | 0x2D, 35039 - 19968: jis0208<<14 | 0x19<<7 | 0x1F, 35041 - 19968: jis0208<<14 | 0x2D<<7 | 0x02, 35047 - 19968: jis0212<<14 | 0x3B<<7 | 0x2E, 35048 - 19968: jis0208<<14 | 0x49<<7 | 0x4A, 35055 - 19968: jis0212<<14 | 0x3B<<7 | 0x2F, 35056 - 19968: jis0212<<14 | 0x3B<<7 | 0x30, 35057 - 19968: jis0212<<14 | 0x3B<<7 | 0x31, 35058 - 19968: jis0208<<14 | 0x49<<7 | 0x4B, 35059 - 19968: jis0208<<14 | 0x1D<<7 | 0x37, 35060 - 19968: jis0208<<14 | 0x49<<7 | 0x49, 35061 - 19968: jis0208<<14 | 0x5A<<7 | 0x45, 35063 - 19968: jis0212<<14 | 0x3B<<7 | 0x33, 35064 - 19968: jis0208<<14 | 0x2C<<7 | 0x46, 35065 - 19968: jis0208<<14 | 0x49<<7 | 0x46, 35068 - 19968: jis0208<<14 | 0x49<<7 | 0x48, 35069 - 19968: jis0208<<14 | 0x1F<<7 | 0x1C, 35070 - 19968: jis0208<<14 | 0x1E<<7 | 0x5D, 35073 - 19968: jis0212<<14 | 0x3B<<7 | 0x34, 35074 - 19968: jis0208<<14 | 0x49<<7 | 0x47, 35076 - 19968: jis0208<<14 | 0x49<<7 | 0x4C, 35078 - 19968: jis0212<<14 | 0x3B<<7 | 0x35, 35079 - 19968: jis0208<<14 | 0x29<<7 | 0x02, 35082 - 19968: jis0208<<14 | 0x49<<7 | 0x4E, 35084 - 19968: jis0208<<14 | 0x49<<7 | 0x4D, 35085 - 19968: jis0212<<14 | 0x3B<<7 | 0x36, 35086 - 19968: jis0212<<14 | 0x3B<<7 | 0x37, 35087 - 19968: jis0212<<14 | 0x3B<<7 | 0x38, 35088 - 19968: jis0208<<14 | 0x12<<7 | 0x4B, 35090 - 19968: jis0208<<14 | 0x2A<<7 | 0x0A, 35091 - 19968: jis0208<<14 | 0x49<<7 | 0x4F, 35093 - 19968: jis0212<<14 | 0x3B<<7 | 0x39, 35094 - 19968: jis0212<<14 | 0x3B<<7 | 0x3A, 35096 - 19968: jis0212<<14 | 0x3B<<7 | 0x3B, 35097 - 19968: jis0212<<14 | 0x3B<<7 | 0x3C, 35098 - 19968: jis0212<<14 | 0x3B<<7 | 0x3D, 35100 - 19968: jis0208<<14 | 0x58<<7 | 0x01, 35101 - 19968: jis0208<<14 | 0x49<<7 | 0x5B, 35102 - 19968: jis0208<<14 | 0x49<<7 | 0x51, 35104 - 19968: jis0212<<14 | 0x3B<<7 | 0x3F, 35109 - 19968: jis0208<<14 | 0x49<<7 | 0x52, 35110 - 19968: jis0212<<14 | 0x3B<<7 | 0x40, 35111 - 19968: jis0212<<14 | 0x3B<<7 | 0x41, 35112 - 19968: jis0212<<14 | 0x3B<<7 | 0x42, 35114 - 19968: jis0208<<14 | 0x49<<7 | 0x53, 35115 - 19968: jis0208<<14 | 0x49<<7 | 0x54, 35120 - 19968: jis0212<<14 | 0x3B<<7 | 0x43, 35121 - 19968: jis0212<<14 | 0x3B<<7 | 0x44, 35122 - 19968: jis0212<<14 | 0x3B<<7 | 0x45, 35125 - 19968: jis0212<<14 | 0x3B<<7 | 0x46, 35126 - 19968: jis0208<<14 | 0x49<<7 | 0x58, 35128 - 19968: jis0208<<14 | 0x49<<7 | 0x59, 35129 - 19968: jis0212<<14 | 0x3B<<7 | 0x47, 35130 - 19968: jis0212<<14 | 0x3B<<7 | 0x48, 35131 - 19968: jis0208<<14 | 0x49<<7 | 0x57, 35134 - 19968: jis0212<<14 | 0x3B<<7 | 0x49, 35136 - 19968: jis0212<<14 | 0x3B<<7 | 0x4A, 35137 - 19968: jis0208<<14 | 0x49<<7 | 0x55, 35138 - 19968: jis0212<<14 | 0x3B<<7 | 0x4B, 35139 - 19968: jis0208<<14 | 0x49<<7 | 0x50, 35140 - 19968: jis0208<<14 | 0x49<<7 | 0x56, 35141 - 19968: jis0212<<14 | 0x3B<<7 | 0x4C, 35142 - 19968: jis0212<<14 | 0x3B<<7 | 0x4D, 35145 - 19968: jis0212<<14 | 0x3B<<7 | 0x4E, 35148 - 19968: jis0208<<14 | 0x49<<7 | 0x5A, 35149 - 19968: jis0208<<14 | 0x4F<<7 | 0x16, 35151 - 19968: jis0212<<14 | 0x3B<<7 | 0x4F, 35154 - 19968: jis0212<<14 | 0x3B<<7 | 0x50, 35158 - 19968: jis0208<<14 | 0x11<<7 | 0x07, 35159 - 19968: jis0212<<14 | 0x3B<<7 | 0x51, 35162 - 19968: jis0212<<14 | 0x3B<<7 | 0x52, 35163 - 19968: jis0212<<14 | 0x3B<<7 | 0x53, 35164 - 19968: jis0212<<14 | 0x3B<<7 | 0x54, 35166 - 19968: jis0208<<14 | 0x49<<7 | 0x5D, 35167 - 19968: jis0208<<14 | 0x15<<7 | 0x3E, 35168 - 19968: jis0208<<14 | 0x49<<7 | 0x5C, 35169 - 19968: jis0212<<14 | 0x3B<<7 | 0x55, 35170 - 19968: jis0212<<14 | 0x3B<<7 | 0x56, 35171 - 19968: jis0212<<14 | 0x3B<<7 | 0x57, 35172 - 19968: jis0208<<14 | 0x4A<<7 | 0x01, 35174 - 19968: jis0208<<14 | 0x4A<<7 | 0x00, 35178 - 19968: jis0208<<14 | 0x4A<<7 | 0x03, 35179 - 19968: jis0212<<14 | 0x3B<<7 | 0x58, 35181 - 19968: jis0208<<14 | 0x4A<<7 | 0x02, 35182 - 19968: jis0212<<14 | 0x3B<<7 | 0x59, 35183 - 19968: jis0208<<14 | 0x4A<<7 | 0x04, 35184 - 19968: jis0212<<14 | 0x3B<<7 | 0x5A, 35186 - 19968: jis0208<<14 | 0x1C<<7 | 0x10, 35187 - 19968: jis0212<<14 | 0x3B<<7 | 0x5B, 35188 - 19968: jis0208<<14 | 0x4A<<7 | 0x05, 35189 - 19968: jis0212<<14 | 0x3B<<7 | 0x5C, 35191 - 19968: jis0208<<14 | 0x4A<<7 | 0x06, 35194 - 19968: jis0212<<14 | 0x3B<<7 | 0x5D, 35195 - 19968: jis0212<<14 | 0x3C<<7 | 0x00, 35196 - 19968: jis0212<<14 | 0x3C<<7 | 0x01, 35197 - 19968: jis0212<<14 | 0x3C<<7 | 0x02, 35198 - 19968: jis0208<<14 | 0x4A<<7 | 0x07, 35199 - 19968: jis0208<<14 | 0x1F<<7 | 0x1D, 35201 - 19968: jis0208<<14 | 0x2C<<7 | 0x36, 35203 - 19968: jis0208<<14 | 0x4A<<7 | 0x08, 35206 - 19968: jis0208<<14 | 0x29<<7 | 0x03, 35207 - 19968: jis0208<<14 | 0x26<<7 | 0x25, 35208 - 19968: jis0208<<14 | 0x4A<<7 | 0x09, 35209 - 19968: jis0212<<14 | 0x3C<<7 | 0x03, 35210 - 19968: jis0208<<14 | 0x4A<<7 | 0x0A, 35211 - 19968: jis0208<<14 | 0x17<<7 | 0x0A, 35213 - 19968: jis0212<<14 | 0x3C<<7 | 0x04, 35215 - 19968: jis0208<<14 | 0x14<<7 | 0x0B, 35216 - 19968: jis0212<<14 | 0x3C<<7 | 0x05, 35219 - 19968: jis0208<<14 | 0x4A<<7 | 0x0B, 35220 - 19968: jis0212<<14 | 0x3C<<7 | 0x06, 35221 - 19968: jis0212<<14 | 0x3C<<7 | 0x07, 35222 - 19968: jis0208<<14 | 0x1A<<7 | 0x4A, 35223 - 19968: jis0208<<14 | 0x26<<7 | 0x20, 35224 - 19968: jis0208<<14 | 0x4A<<7 | 0x0C, 35226 - 19968: jis0208<<14 | 0x12<<7 | 0x2F, 35227 - 19968: jis0212<<14 | 0x3C<<7 | 0x08, 35228 - 19968: jis0212<<14 | 0x3C<<7 | 0x09, 35231 - 19968: jis0212<<14 | 0x3C<<7 | 0x0A, 35232 - 19968: jis0212<<14 | 0x3C<<7 | 0x0B, 35233 - 19968: jis0208<<14 | 0x4A<<7 | 0x0D, 35237 - 19968: jis0212<<14 | 0x3C<<7 | 0x0C, 35238 - 19968: jis0208<<14 | 0x4A<<7 | 0x0F, 35239 - 19968: jis0208<<14 | 0x2C<<7 | 0x56, 35241 - 19968: jis0208<<14 | 0x4A<<7 | 0x0E, 35242 - 19968: jis0208<<14 | 0x1E<<7 | 0x25, 35244 - 19968: jis0208<<14 | 0x4A<<7 | 0x10, 35247 - 19968: jis0208<<14 | 0x4A<<7 | 0x11, 35248 - 19968: jis0212<<14 | 0x3C<<7 | 0x0D, 35250 - 19968: jis0208<<14 | 0x4A<<7 | 0x12, 35251 - 19968: jis0208<<14 | 0x13<<7 | 0x30, 35252 - 19968: jis0212<<14 | 0x3C<<7 | 0x0E, 35253 - 19968: jis0212<<14 | 0x3C<<7 | 0x0F, 35254 - 19968: jis0212<<14 | 0x3C<<7 | 0x10, 35255 - 19968: jis0212<<14 | 0x3C<<7 | 0x11, 35258 - 19968: jis0208<<14 | 0x4A<<7 | 0x13, 35260 - 19968: jis0212<<14 | 0x3C<<7 | 0x12, 35261 - 19968: jis0208<<14 | 0x4A<<7 | 0x14, 35263 - 19968: jis0208<<14 | 0x4A<<7 | 0x15, 35264 - 19968: jis0208<<14 | 0x4A<<7 | 0x16, 35282 - 19968: jis0208<<14 | 0x12<<7 | 0x30, 35284 - 19968: jis0212<<14 | 0x3C<<7 | 0x13, 35285 - 19968: jis0212<<14 | 0x3C<<7 | 0x14, 35286 - 19968: jis0212<<14 | 0x3C<<7 | 0x15, 35287 - 19968: jis0212<<14 | 0x3C<<7 | 0x16, 35288 - 19968: jis0212<<14 | 0x3C<<7 | 0x17, 35290 - 19968: jis0208<<14 | 0x4A<<7 | 0x17, 35292 - 19968: jis0208<<14 | 0x4A<<7 | 0x18, 35293 - 19968: jis0208<<14 | 0x4A<<7 | 0x19, 35299 - 19968: jis0208<<14 | 0x11<<7 | 0x51, 35301 - 19968: jis0212<<14 | 0x3C<<7 | 0x18, 35302 - 19968: jis0208<<14 | 0x1E<<7 | 0x07, 35303 - 19968: jis0208<<14 | 0x4A<<7 | 0x1A, 35305 - 19968: jis0212<<14 | 0x3C<<7 | 0x19, 35307 - 19968: jis0212<<14 | 0x3C<<7 | 0x1A, 35309 - 19968: jis0212<<14 | 0x3C<<7 | 0x1B, 35313 - 19968: jis0212<<14 | 0x3C<<7 | 0x1C, 35315 - 19968: jis0212<<14 | 0x3C<<7 | 0x1D, 35316 - 19968: jis0208<<14 | 0x4A<<7 | 0x1B, 35318 - 19968: jis0212<<14 | 0x3C<<7 | 0x1E, 35320 - 19968: jis0208<<14 | 0x4A<<7 | 0x1C, 35321 - 19968: jis0212<<14 | 0x3C<<7 | 0x1F, 35325 - 19968: jis0212<<14 | 0x3C<<7 | 0x20, 35327 - 19968: jis0212<<14 | 0x3C<<7 | 0x21, 35328 - 19968: jis0208<<14 | 0x17<<7 | 0x1F, 35330 - 19968: jis0208<<14 | 0x23<<7 | 0x5A, 35331 - 19968: jis0208<<14 | 0x4A<<7 | 0x1D, 35332 - 19968: jis0212<<14 | 0x3C<<7 | 0x22, 35333 - 19968: jis0212<<14 | 0x3C<<7 | 0x23, 35335 - 19968: jis0212<<14 | 0x3C<<7 | 0x24, 35336 - 19968: jis0208<<14 | 0x16<<7 | 0x36, 35338 - 19968: jis0208<<14 | 0x1E<<7 | 0x35, 35340 - 19968: jis0208<<14 | 0x4A<<7 | 0x20, 35342 - 19968: jis0208<<14 | 0x25<<7 | 0x03, 35343 - 19968: jis0212<<14 | 0x3C<<7 | 0x25, 35344 - 19968: jis0208<<14 | 0x4A<<7 | 0x1F, 35345 - 19968: jis0212<<14 | 0x3C<<7 | 0x26, 35346 - 19968: jis0208<<14 | 0x5A<<7 | 0x46, 35347 - 19968: jis0208<<14 | 0x16<<7 | 0x10, 35348 - 19968: jis0212<<14 | 0x3C<<7 | 0x28, 35349 - 19968: jis0212<<14 | 0x3C<<7 | 0x29, 35350 - 19968: jis0208<<14 | 0x4A<<7 | 0x1E, 35351 - 19968: jis0208<<14 | 0x21<<7 | 0x56, 35352 - 19968: jis0208<<14 | 0x14<<7 | 0x0C, 35355 - 19968: jis0208<<14 | 0x4A<<7 | 0x21, 35357 - 19968: jis0208<<14 | 0x4A<<7 | 0x22, 35358 - 19968: jis0212<<14 | 0x3C<<7 | 0x2A, 35359 - 19968: jis0208<<14 | 0x1D<<7 | 0x38, 35360 - 19968: jis0212<<14 | 0x3C<<7 | 0x2B, 35362 - 19968: jis0212<<14 | 0x3C<<7 | 0x2C, 35363 - 19968: jis0208<<14 | 0x16<<7 | 0x4C, 35364 - 19968: jis0212<<14 | 0x3C<<7 | 0x2D, 35365 - 19968: jis0208<<14 | 0x4A<<7 | 0x23, 35366 - 19968: jis0212<<14 | 0x3C<<7 | 0x2E, 35370 - 19968: jis0208<<14 | 0x2A<<7 | 0x0B, 35371 - 19968: jis0212<<14 | 0x3C<<7 | 0x2F, 35372 - 19968: jis0212<<14 | 0x3C<<7 | 0x30, 35373 - 19968: jis0208<<14 | 0x1F<<7 | 0x3E, 35375 - 19968: jis0212<<14 | 0x3C<<7 | 0x31, 35377 - 19968: jis0208<<14 | 0x14<<7 | 0x55, 35379 - 19968: jis0208<<14 | 0x2B<<7 | 0x54, 35380 - 19968: jis0208<<14 | 0x20<<7 | 0x29, 35381 - 19968: jis0212<<14 | 0x3C<<7 | 0x32, 35382 - 19968: jis0208<<14 | 0x4A<<7 | 0x24, 35383 - 19968: jis0208<<14 | 0x5A<<7 | 0x47, 35386 - 19968: jis0208<<14 | 0x1E<<7 | 0x26, 35387 - 19968: jis0208<<14 | 0x22<<7 | 0x4F, 35388 - 19968: jis0208<<14 | 0x1D<<7 | 0x39, 35389 - 19968: jis0212<<14 | 0x3C<<7 | 0x34, 35390 - 19968: jis0212<<14 | 0x3C<<7 | 0x35, 35392 - 19968: jis0212<<14 | 0x3C<<7 | 0x36, 35393 - 19968: jis0208<<14 | 0x4A<<7 | 0x25, 35395 - 19968: jis0212<<14 | 0x3C<<7 | 0x37, 35397 - 19968: jis0212<<14 | 0x3C<<7 | 0x38, 35398 - 19968: jis0208<<14 | 0x4A<<7 | 0x28, 35399 - 19968: jis0212<<14 | 0x3C<<7 | 0x39, 35400 - 19968: jis0208<<14 | 0x4A<<7 | 0x29, 35401 - 19968: jis0212<<14 | 0x3C<<7 | 0x3A, 35405 - 19968: jis0212<<14 | 0x3C<<7 | 0x3B, 35406 - 19968: jis0212<<14 | 0x3C<<7 | 0x3C, 35408 - 19968: jis0208<<14 | 0x19<<7 | 0x1D, 35409 - 19968: jis0208<<14 | 0x21<<7 | 0x21, 35410 - 19968: jis0208<<14 | 0x4A<<7 | 0x27, 35411 - 19968: jis0212<<14 | 0x3C<<7 | 0x3D, 35412 - 19968: jis0208<<14 | 0x1D<<7 | 0x3A, 35413 - 19968: jis0208<<14 | 0x28<<7 | 0x1D, 35414 - 19968: jis0212<<14 | 0x3C<<7 | 0x3E, 35415 - 19968: jis0212<<14 | 0x3C<<7 | 0x3F, 35416 - 19968: jis0212<<14 | 0x3C<<7 | 0x40, 35419 - 19968: jis0208<<14 | 0x4A<<7 | 0x26, 35420 - 19968: jis0212<<14 | 0x3C<<7 | 0x41, 35421 - 19968: jis0212<<14 | 0x3C<<7 | 0x42, 35422 - 19968: jis0208<<14 | 0x1A<<7 | 0x4B, 35424 - 19968: jis0208<<14 | 0x10<<7 | 0x32, 35425 - 19968: jis0212<<14 | 0x3C<<7 | 0x43, 35426 - 19968: jis0208<<14 | 0x4A<<7 | 0x2D, 35427 - 19968: jis0208<<14 | 0x16<<7 | 0x37, 35429 - 19968: jis0212<<14 | 0x3C<<7 | 0x44, 35430 - 19968: jis0208<<14 | 0x1A<<7 | 0x4D, 35431 - 19968: jis0212<<14 | 0x3C<<7 | 0x45, 35433 - 19968: jis0208<<14 | 0x1A<<7 | 0x4C, 35435 - 19968: jis0208<<14 | 0x2E<<7 | 0x2C, 35436 - 19968: jis0208<<14 | 0x4A<<7 | 0x2C, 35437 - 19968: jis0208<<14 | 0x4A<<7 | 0x2B, 35438 - 19968: jis0208<<14 | 0x20<<7 | 0x06, 35440 - 19968: jis0208<<14 | 0x14<<7 | 0x2C, 35441 - 19968: jis0208<<14 | 0x2E<<7 | 0x22, 35442 - 19968: jis0208<<14 | 0x12<<7 | 0x19, 35443 - 19968: jis0208<<14 | 0x1D<<7 | 0x3B, 35445 - 19968: jis0212<<14 | 0x3C<<7 | 0x46, 35446 - 19968: jis0212<<14 | 0x3C<<7 | 0x47, 35447 - 19968: jis0212<<14 | 0x3C<<7 | 0x48, 35449 - 19968: jis0208<<14 | 0x5A<<7 | 0x48, 35450 - 19968: jis0212<<14 | 0x3C<<7 | 0x4A, 35451 - 19968: jis0212<<14 | 0x3C<<7 | 0x4B, 35452 - 19968: jis0208<<14 | 0x4A<<7 | 0x2A, 35454 - 19968: jis0212<<14 | 0x3C<<7 | 0x4C, 35455 - 19968: jis0212<<14 | 0x3C<<7 | 0x4D, 35456 - 19968: jis0212<<14 | 0x3C<<7 | 0x4E, 35458 - 19968: jis0208<<14 | 0x4A<<7 | 0x2F, 35459 - 19968: jis0212<<14 | 0x3C<<7 | 0x4F, 35460 - 19968: jis0208<<14 | 0x4A<<7 | 0x30, 35461 - 19968: jis0208<<14 | 0x4A<<7 | 0x2E, 35462 - 19968: jis0212<<14 | 0x3C<<7 | 0x50, 35463 - 19968: jis0208<<14 | 0x17<<7 | 0x37, 35465 - 19968: jis0208<<14 | 0x2C<<7 | 0x1F, 35467 - 19968: jis0212<<14 | 0x3C<<7 | 0x51, 35468 - 19968: jis0208<<14 | 0x1A<<7 | 0x4E, 35469 - 19968: jis0208<<14 | 0x26<<7 | 0x06, 35471 - 19968: jis0212<<14 | 0x3C<<7 | 0x52, 35472 - 19968: jis0212<<14 | 0x3C<<7 | 0x53, 35473 - 19968: jis0208<<14 | 0x4A<<7 | 0x33, 35474 - 19968: jis0212<<14 | 0x3C<<7 | 0x54, 35475 - 19968: jis0208<<14 | 0x1F<<7 | 0x1F, 35477 - 19968: jis0208<<14 | 0x22<<7 | 0x21, 35478 - 19968: jis0212<<14 | 0x3C<<7 | 0x55, 35479 - 19968: jis0212<<14 | 0x3C<<7 | 0x56, 35480 - 19968: jis0208<<14 | 0x2C<<7 | 0x15, 35481 - 19968: jis0212<<14 | 0x3C<<7 | 0x57, 35482 - 19968: jis0208<<14 | 0x4A<<7 | 0x36, 35486 - 19968: jis0208<<14 | 0x17<<7 | 0x4B, 35487 - 19968: jis0212<<14 | 0x3C<<7 | 0x58, 35488 - 19968: jis0208<<14 | 0x1F<<7 | 0x1E, 35489 - 19968: jis0208<<14 | 0x4A<<7 | 0x32, 35491 - 19968: jis0208<<14 | 0x4A<<7 | 0x37, 35492 - 19968: jis0208<<14 | 0x17<<7 | 0x4C, 35493 - 19968: jis0208<<14 | 0x4A<<7 | 0x34, 35494 - 19968: jis0208<<14 | 0x4A<<7 | 0x35, 35495 - 19968: jis0208<<14 | 0x5A<<7 | 0x49, 35496 - 19968: jis0208<<14 | 0x4A<<7 | 0x31, 35497 - 19968: jis0212<<14 | 0x3C<<7 | 0x5A, 35500 - 19968: jis0208<<14 | 0x1F<<7 | 0x41, 35501 - 19968: jis0208<<14 | 0x25<<7 | 0x28, 35502 - 19968: jis0212<<14 | 0x3C<<7 | 0x5B, 35503 - 19968: jis0212<<14 | 0x3C<<7 | 0x5C, 35504 - 19968: jis0208<<14 | 0x22<<7 | 0x0E, 35506 - 19968: jis0208<<14 | 0x11<<7 | 0x3C, 35507 - 19968: jis0212<<14 | 0x3C<<7 | 0x5D, 35510 - 19968: jis0212<<14 | 0x3D<<7 | 0x00, 35511 - 19968: jis0212<<14 | 0x3D<<7 | 0x01, 35513 - 19968: jis0208<<14 | 0x27<<7 | 0x4F, 35515 - 19968: jis0212<<14 | 0x3D<<7 | 0x02, 35516 - 19968: jis0208<<14 | 0x14<<7 | 0x22, 35518 - 19968: jis0208<<14 | 0x5A<<7 | 0x4A, 35519 - 19968: jis0208<<14 | 0x23<<7 | 0x13, 35522 - 19968: jis0208<<14 | 0x4A<<7 | 0x3A, 35523 - 19968: jis0212<<14 | 0x3D<<7 | 0x04, 35524 - 19968: jis0208<<14 | 0x4A<<7 | 0x38, 35526 - 19968: jis0212<<14 | 0x3D<<7 | 0x05, 35527 - 19968: jis0208<<14 | 0x22<<7 | 0x2B, 35528 - 19968: jis0212<<14 | 0x3D<<7 | 0x06, 35529 - 19968: jis0212<<14 | 0x3D<<7 | 0x07, 35530 - 19968: jis0212<<14 | 0x3D<<7 | 0x08, 35531 - 19968: jis0208<<14 | 0x1F<<7 | 0x20, 35532 - 19968: jis0208<<14 | 0x13<<7 | 0x31, 35533 - 19968: jis0208<<14 | 0x4A<<7 | 0x39, 35535 - 19968: jis0208<<14 | 0x1E<<7 | 0x3A, 35537 - 19968: jis0212<<14 | 0x3D<<7 | 0x09, 35538 - 19968: jis0208<<14 | 0x2D<<7 | 0x29, 35539 - 19968: jis0212<<14 | 0x3D<<7 | 0x0A, 35540 - 19968: jis0212<<14 | 0x3D<<7 | 0x0B, 35541 - 19968: jis0212<<14 | 0x3D<<7 | 0x0C, 35542 - 19968: jis0208<<14 | 0x2E<<7 | 0x1F, 35543 - 19968: jis0212<<14 | 0x3D<<7 | 0x0D, 35546 - 19968: jis0208<<14 | 0x4A<<7 | 0x3B, 35547 - 19968: jis0208<<14 | 0x4A<<7 | 0x46, 35548 - 19968: jis0208<<14 | 0x23<<7 | 0x14, 35549 - 19968: jis0212<<14 | 0x3D<<7 | 0x0E, 35550 - 19968: jis0208<<14 | 0x4A<<7 | 0x45, 35551 - 19968: jis0208<<14 | 0x5A<<7 | 0x4B, 35552 - 19968: jis0208<<14 | 0x4A<<7 | 0x42, 35553 - 19968: jis0208<<14 | 0x4A<<7 | 0x4A, 35554 - 19968: jis0208<<14 | 0x4A<<7 | 0x43, 35556 - 19968: jis0208<<14 | 0x4A<<7 | 0x3F, 35558 - 19968: jis0208<<14 | 0x23<<7 | 0x5B, 35559 - 19968: jis0208<<14 | 0x4A<<7 | 0x3E, 35563 - 19968: jis0208<<14 | 0x4A<<7 | 0x3C, 35564 - 19968: jis0212<<14 | 0x3D<<7 | 0x10, 35565 - 19968: jis0208<<14 | 0x2C<<7 | 0x00, 35566 - 19968: jis0208<<14 | 0x1A<<7 | 0x4F, 35568 - 19968: jis0212<<14 | 0x3D<<7 | 0x11, 35569 - 19968: jis0208<<14 | 0x4A<<7 | 0x40, 35571 - 19968: jis0208<<14 | 0x4A<<7 | 0x3D, 35572 - 19968: jis0212<<14 | 0x3D<<7 | 0x12, 35573 - 19968: jis0212<<14 | 0x3D<<7 | 0x13, 35574 - 19968: jis0208<<14 | 0x5A<<7 | 0x4D, 35575 - 19968: jis0208<<14 | 0x4A<<7 | 0x44, 35576 - 19968: jis0208<<14 | 0x1C<<7 | 0x53, 35578 - 19968: jis0208<<14 | 0x17<<7 | 0x20, 35580 - 19968: jis0212<<14 | 0x3D<<7 | 0x15, 35582 - 19968: jis0208<<14 | 0x21<<7 | 0x59, 35583 - 19968: jis0212<<14 | 0x3D<<7 | 0x16, 35584 - 19968: jis0208<<14 | 0x2A<<7 | 0x24, 35585 - 19968: jis0208<<14 | 0x10<<7 | 0x39, 35586 - 19968: jis0208<<14 | 0x0F<<7 | 0x41, 35588 - 19968: jis0208<<14 | 0x25<<7 | 0x04, 35589 - 19968: jis0212<<14 | 0x3D<<7 | 0x17, 35590 - 19968: jis0212<<14 | 0x3D<<7 | 0x18, 35591 - 19968: jis0208<<14 | 0x4A<<7 | 0x48, 35594 - 19968: jis0212<<14 | 0x3D<<7 | 0x1E, 35595 - 19968: jis0212<<14 | 0x3D<<7 | 0x19, 35596 - 19968: jis0208<<14 | 0x4A<<7 | 0x47, 35598 - 19968: jis0208<<14 | 0x25<<7 | 0x45, 35600 - 19968: jis0208<<14 | 0x4A<<7 | 0x4C, 35601 - 19968: jis0212<<14 | 0x3D<<7 | 0x1A, 35604 - 19968: jis0208<<14 | 0x4A<<7 | 0x41, 35606 - 19968: jis0208<<14 | 0x4A<<7 | 0x4B, 35607 - 19968: jis0208<<14 | 0x4A<<7 | 0x4D, 35609 - 19968: jis0208<<14 | 0x17<<7 | 0x0B, 35610 - 19968: jis0208<<14 | 0x4A<<7 | 0x49, 35611 - 19968: jis0208<<14 | 0x18<<7 | 0x35, 35612 - 19968: jis0212<<14 | 0x3D<<7 | 0x1B, 35613 - 19968: jis0208<<14 | 0x1B<<7 | 0x34, 35614 - 19968: jis0212<<14 | 0x3D<<7 | 0x1C, 35615 - 19968: jis0212<<14 | 0x3D<<7 | 0x1D, 35616 - 19968: jis0208<<14 | 0x4A<<7 | 0x4E, 35617 - 19968: jis0208<<14 | 0x2C<<7 | 0x37, 35622 - 19968: jis0208<<14 | 0x4A<<7 | 0x51, 35624 - 19968: jis0208<<14 | 0x4A<<7 | 0x54, 35627 - 19968: jis0208<<14 | 0x4A<<7 | 0x52, 35628 - 19968: jis0208<<14 | 0x28<<7 | 0x14, 35629 - 19968: jis0212<<14 | 0x3D<<7 | 0x1F, 35632 - 19968: jis0212<<14 | 0x3D<<7 | 0x20, 35635 - 19968: jis0208<<14 | 0x4A<<7 | 0x4F, 35639 - 19968: jis0212<<14 | 0x3D<<7 | 0x21, 35641 - 19968: jis0208<<14 | 0x15<<7 | 0x3F, 35644 - 19968: jis0212<<14 | 0x3D<<7 | 0x22, 35646 - 19968: jis0208<<14 | 0x4A<<7 | 0x53, 35649 - 19968: jis0208<<14 | 0x4A<<7 | 0x55, 35650 - 19968: jis0212<<14 | 0x3D<<7 | 0x23, 35651 - 19968: jis0212<<14 | 0x3D<<7 | 0x24, 35652 - 19968: jis0212<<14 | 0x3D<<7 | 0x25, 35653 - 19968: jis0212<<14 | 0x3D<<7 | 0x26, 35654 - 19968: jis0212<<14 | 0x3D<<7 | 0x27, 35656 - 19968: jis0212<<14 | 0x3D<<7 | 0x28, 35657 - 19968: jis0208<<14 | 0x4A<<7 | 0x59, 35660 - 19968: jis0208<<14 | 0x4A<<7 | 0x56, 35661 - 19968: jis0212<<14 | 0x3D<<7 | 0x2D, 35662 - 19968: jis0208<<14 | 0x4A<<7 | 0x58, 35663 - 19968: jis0208<<14 | 0x4A<<7 | 0x57, 35666 - 19968: jis0212<<14 | 0x3D<<7 | 0x29, 35667 - 19968: jis0208<<14 | 0x5A<<7 | 0x4E, 35668 - 19968: jis0212<<14 | 0x3D<<7 | 0x2B, 35670 - 19968: jis0208<<14 | 0x4A<<7 | 0x5A, 35672 - 19968: jis0208<<14 | 0x1B<<7 | 0x10, 35673 - 19968: jis0212<<14 | 0x3D<<7 | 0x2C, 35674 - 19968: jis0208<<14 | 0x4A<<7 | 0x5C, 35675 - 19968: jis0208<<14 | 0x4A<<7 | 0x5B, 35676 - 19968: jis0208<<14 | 0x28<<7 | 0x47, 35678 - 19968: jis0212<<14 | 0x3D<<7 | 0x2E, 35679 - 19968: jis0208<<14 | 0x4B<<7 | 0x00, 35683 - 19968: jis0212<<14 | 0x3D<<7 | 0x2F, 35686 - 19968: jis0208<<14 | 0x16<<7 | 0x38, 35691 - 19968: jis0208<<14 | 0x4A<<7 | 0x5D, 35692 - 19968: jis0208<<14 | 0x4B<<7 | 0x01, 35693 - 19968: jis0212<<14 | 0x3D<<7 | 0x30, 35695 - 19968: jis0208<<14 | 0x4B<<7 | 0x02, 35696 - 19968: jis0208<<14 | 0x14<<7 | 0x23, 35697 - 19968: jis0208<<14 | 0x45<<7 | 0x20, 35698 - 19968: jis0208<<14 | 0x1D<<7 | 0x58, 35700 - 19968: jis0208<<14 | 0x4B<<7 | 0x03, 35702 - 19968: jis0212<<14 | 0x3D<<7 | 0x31, 35703 - 19968: jis0208<<14 | 0x17<<7 | 0x4D, 35704 - 19968: jis0212<<14 | 0x3D<<7 | 0x32, 35705 - 19968: jis0212<<14 | 0x3D<<7 | 0x33, 35708 - 19968: jis0212<<14 | 0x3D<<7 | 0x34, 35709 - 19968: jis0208<<14 | 0x4B<<7 | 0x04, 35710 - 19968: jis0212<<14 | 0x3D<<7 | 0x35, 35711 - 19968: jis0208<<14 | 0x5A<<7 | 0x4F, 35712 - 19968: jis0208<<14 | 0x4B<<7 | 0x05, 35713 - 19968: jis0212<<14 | 0x3D<<7 | 0x36, 35715 - 19968: jis0208<<14 | 0x1A<<7 | 0x1D, 35716 - 19968: jis0212<<14 | 0x3D<<7 | 0x37, 35717 - 19968: jis0212<<14 | 0x3D<<7 | 0x38, 35722 - 19968: jis0208<<14 | 0x39<<7 | 0x2D, 35723 - 19968: jis0212<<14 | 0x3D<<7 | 0x39, 35724 - 19968: jis0208<<14 | 0x4B<<7 | 0x06, 35725 - 19968: jis0212<<14 | 0x3D<<7 | 0x3A, 35726 - 19968: jis0208<<14 | 0x4B<<7 | 0x07, 35727 - 19968: jis0212<<14 | 0x3D<<7 | 0x3B, 35728 - 19968: jis0208<<14 | 0x1C<<7 | 0x11, 35730 - 19968: jis0208<<14 | 0x4B<<7 | 0x08, 35731 - 19968: jis0208<<14 | 0x4B<<7 | 0x09, 35732 - 19968: jis0212<<14 | 0x3D<<7 | 0x3C, 35733 - 19968: jis0212<<14 | 0x3D<<7 | 0x3D, 35734 - 19968: jis0208<<14 | 0x4B<<7 | 0x0A, 35737 - 19968: jis0208<<14 | 0x4B<<7 | 0x0B, 35738 - 19968: jis0208<<14 | 0x4B<<7 | 0x0C, 35740 - 19968: jis0212<<14 | 0x3D<<7 | 0x3E, 35742 - 19968: jis0212<<14 | 0x3D<<7 | 0x3F, 35743 - 19968: jis0212<<14 | 0x3D<<7 | 0x40, 35895 - 19968: jis0208<<14 | 0x22<<7 | 0x0A, 35896 - 19968: jis0212<<14 | 0x3D<<7 | 0x41, 35897 - 19968: jis0212<<14 | 0x3D<<7 | 0x42, 35898 - 19968: jis0208<<14 | 0x4B<<7 | 0x0D, 35901 - 19968: jis0212<<14 | 0x3D<<7 | 0x43, 35902 - 19968: jis0212<<14 | 0x3D<<7 | 0x44, 35903 - 19968: jis0208<<14 | 0x4B<<7 | 0x0F, 35905 - 19968: jis0208<<14 | 0x4B<<7 | 0x0E, 35909 - 19968: jis0212<<14 | 0x3D<<7 | 0x45, 35910 - 19968: jis0208<<14 | 0x25<<7 | 0x05, 35911 - 19968: jis0212<<14 | 0x3D<<7 | 0x46, 35912 - 19968: jis0208<<14 | 0x4B<<7 | 0x10, 35913 - 19968: jis0212<<14 | 0x3D<<7 | 0x47, 35914 - 19968: jis0208<<14 | 0x2A<<7 | 0x0C, 35915 - 19968: jis0212<<14 | 0x3D<<7 | 0x48, 35916 - 19968: jis0208<<14 | 0x4B<<7 | 0x11, 35918 - 19968: jis0208<<14 | 0x4B<<7 | 0x12, 35919 - 19968: jis0212<<14 | 0x3D<<7 | 0x49, 35920 - 19968: jis0208<<14 | 0x4B<<7 | 0x13, 35921 - 19968: jis0212<<14 | 0x3D<<7 | 0x4A, 35923 - 19968: jis0212<<14 | 0x3D<<7 | 0x4B, 35924 - 19968: jis0212<<14 | 0x3D<<7 | 0x4C, 35925 - 19968: jis0208<<14 | 0x4B<<7 | 0x14, 35927 - 19968: jis0212<<14 | 0x3D<<7 | 0x4D, 35928 - 19968: jis0212<<14 | 0x3D<<7 | 0x4E, 35929 - 19968: jis0212<<14 | 0x3D<<7 | 0x51, 35930 - 19968: jis0208<<14 | 0x25<<7 | 0x39, 35931 - 19968: jis0212<<14 | 0x3D<<7 | 0x4F, 35933 - 19968: jis0212<<14 | 0x3D<<7 | 0x50, 35937 - 19968: jis0208<<14 | 0x1D<<7 | 0x3C, 35938 - 19968: jis0208<<14 | 0x4B<<7 | 0x15, 35939 - 19968: jis0212<<14 | 0x3D<<7 | 0x52, 35940 - 19968: jis0212<<14 | 0x3D<<7 | 0x53, 35942 - 19968: jis0212<<14 | 0x3D<<7 | 0x54, 35944 - 19968: jis0212<<14 | 0x3D<<7 | 0x55, 35945 - 19968: jis0212<<14 | 0x3D<<7 | 0x56, 35946 - 19968: jis0208<<14 | 0x18<<7 | 0x4A, 35947 - 19968: jis0208<<14 | 0x2F<<7 | 0x0D, 35948 - 19968: jis0208<<14 | 0x4B<<7 | 0x16, 35949 - 19968: jis0212<<14 | 0x3D<<7 | 0x57, 35955 - 19968: jis0212<<14 | 0x3D<<7 | 0x58, 35957 - 19968: jis0212<<14 | 0x3D<<7 | 0x59, 35958 - 19968: jis0212<<14 | 0x3D<<7 | 0x5A, 35960 - 19968: jis0208<<14 | 0x4B<<7 | 0x17, 35961 - 19968: jis0208<<14 | 0x28<<7 | 0x1E, 35962 - 19968: jis0208<<14 | 0x4B<<7 | 0x18, 35963 - 19968: jis0212<<14 | 0x3D<<7 | 0x5B, 35964 - 19968: jis0208<<14 | 0x4B<<7 | 0x20, 35966 - 19968: jis0212<<14 | 0x3D<<7 | 0x5C, 35970 - 19968: jis0208<<14 | 0x4B<<7 | 0x19, 35973 - 19968: jis0208<<14 | 0x4B<<7 | 0x1B, 35974 - 19968: jis0212<<14 | 0x3D<<7 | 0x5D, 35975 - 19968: jis0212<<14 | 0x3E<<7 | 0x00, 35977 - 19968: jis0208<<14 | 0x4B<<7 | 0x1A, 35978 - 19968: jis0208<<14 | 0x4B<<7 | 0x1C, 35979 - 19968: jis0212<<14 | 0x3E<<7 | 0x01, 35980 - 19968: jis0208<<14 | 0x2A<<7 | 0x25, 35981 - 19968: jis0208<<14 | 0x4B<<7 | 0x1D, 35982 - 19968: jis0208<<14 | 0x4B<<7 | 0x1E, 35984 - 19968: jis0212<<14 | 0x3E<<7 | 0x02, 35986 - 19968: jis0212<<14 | 0x3E<<7 | 0x03, 35987 - 19968: jis0212<<14 | 0x3E<<7 | 0x04, 35988 - 19968: jis0208<<14 | 0x4B<<7 | 0x1F, 35992 - 19968: jis0208<<14 | 0x4B<<7 | 0x21, 35993 - 19968: jis0212<<14 | 0x3E<<7 | 0x05, 35995 - 19968: jis0212<<14 | 0x3E<<7 | 0x06, 35996 - 19968: jis0212<<14 | 0x3E<<7 | 0x07, 35997 - 19968: jis0208<<14 | 0x12<<7 | 0x0C, 35998 - 19968: jis0208<<14 | 0x23<<7 | 0x46, 36000 - 19968: jis0208<<14 | 0x28<<7 | 0x48, 36001 - 19968: jis0208<<14 | 0x19<<7 | 0x41, 36002 - 19968: jis0208<<14 | 0x18<<7 | 0x36, 36004 - 19968: jis0212<<14 | 0x3E<<7 | 0x08, 36007 - 19968: jis0208<<14 | 0x28<<7 | 0x2E, 36008 - 19968: jis0208<<14 | 0x11<<7 | 0x3E, 36009 - 19968: jis0208<<14 | 0x27<<7 | 0x2D, 36010 - 19968: jis0208<<14 | 0x4B<<7 | 0x24, 36011 - 19968: jis0208<<14 | 0x13<<7 | 0x32, 36012 - 19968: jis0208<<14 | 0x1F<<7 | 0x34, 36013 - 19968: jis0208<<14 | 0x4B<<7 | 0x23, 36014 - 19968: jis0208<<14 | 0x4B<<7 | 0x28, 36015 - 19968: jis0208<<14 | 0x22<<7 | 0x58, 36016 - 19968: jis0208<<14 | 0x2B<<7 | 0x42, 36018 - 19968: jis0208<<14 | 0x4B<<7 | 0x26, 36019 - 19968: jis0208<<14 | 0x4B<<7 | 0x27, 36020 - 19968: jis0208<<14 | 0x14<<7 | 0x0D, 36022 - 19968: jis0208<<14 | 0x4B<<7 | 0x29, 36023 - 19968: jis0208<<14 | 0x26<<7 | 0x42, 36024 - 19968: jis0208<<14 | 0x21<<7 | 0x3E, 36025 - 19968: jis0212<<14 | 0x3E<<7 | 0x09, 36026 - 19968: jis0212<<14 | 0x3E<<7 | 0x0A, 36027 - 19968: jis0208<<14 | 0x27<<7 | 0x50, 36028 - 19968: jis0208<<14 | 0x24<<7 | 0x1C, 36029 - 19968: jis0208<<14 | 0x4B<<7 | 0x25, 36031 - 19968: jis0208<<14 | 0x2A<<7 | 0x26, 36032 - 19968: jis0208<<14 | 0x11<<7 | 0x4B, 36033 - 19968: jis0208<<14 | 0x4B<<7 | 0x2B, 36034 - 19968: jis0208<<14 | 0x2E<<7 | 0x07, 36035 - 19968: jis0208<<14 | 0x23<<7 | 0x21, 36036 - 19968: jis0208<<14 | 0x2E<<7 | 0x24, 36037 - 19968: jis0212<<14 | 0x3E<<7 | 0x0B, 36038 - 19968: jis0212<<14 | 0x3E<<7 | 0x0C, 36039 - 19968: jis0208<<14 | 0x1A<<7 | 0x50, 36040 - 19968: jis0208<<14 | 0x4B<<7 | 0x2A, 36041 - 19968: jis0212<<14 | 0x3E<<7 | 0x0D, 36042 - 19968: jis0208<<14 | 0x21<<7 | 0x10, 36043 - 19968: jis0212<<14 | 0x3E<<7 | 0x0E, 36045 - 19968: jis0208<<14 | 0x4B<<7 | 0x3B, 36046 - 19968: jis0208<<14 | 0x20<<7 | 0x07, 36047 - 19968: jis0212<<14 | 0x3E<<7 | 0x0F, 36049 - 19968: jis0208<<14 | 0x25<<7 | 0x57, 36051 - 19968: jis0208<<14 | 0x28<<7 | 0x2F, 36053 - 19968: jis0212<<14 | 0x3E<<7 | 0x11, 36054 - 19968: jis0212<<14 | 0x3E<<7 | 0x10, 36057 - 19968: jis0212<<14 | 0x3E<<7 | 0x12, 36058 - 19968: jis0208<<14 | 0x4B<<7 | 0x2E, 36059 - 19968: jis0208<<14 | 0x1A<<7 | 0x1E, 36060 - 19968: jis0208<<14 | 0x1A<<7 | 0x51, 36061 - 19968: jis0212<<14 | 0x3E<<7 | 0x13, 36062 - 19968: jis0208<<14 | 0x1D<<7 | 0x3D, 36064 - 19968: jis0208<<14 | 0x26<<7 | 0x44, 36065 - 19968: jis0212<<14 | 0x3E<<7 | 0x14, 36066 - 19968: jis0208<<14 | 0x17<<7 | 0x0C, 36067 - 19968: jis0208<<14 | 0x4B<<7 | 0x2D, 36068 - 19968: jis0208<<14 | 0x4B<<7 | 0x2C, 36070 - 19968: jis0208<<14 | 0x28<<7 | 0x49, 36072 - 19968: jis0212<<14 | 0x3E<<7 | 0x15, 36074 - 19968: jis0208<<14 | 0x1B<<7 | 0x20, 36076 - 19968: jis0212<<14 | 0x3E<<7 | 0x16, 36077 - 19968: jis0208<<14 | 0x24<<7 | 0x31, 36079 - 19968: jis0212<<14 | 0x3E<<7 | 0x17, 36080 - 19968: jis0208<<14 | 0x5A<<7 | 0x50, 36082 - 19968: jis0212<<14 | 0x3E<<7 | 0x19, 36084 - 19968: jis0208<<14 | 0x5A<<7 | 0x51, 36085 - 19968: jis0212<<14 | 0x3E<<7 | 0x1A, 36087 - 19968: jis0212<<14 | 0x3E<<7 | 0x1B, 36088 - 19968: jis0212<<14 | 0x3E<<7 | 0x1C, 36090 - 19968: jis0208<<14 | 0x4B<<7 | 0x30, 36091 - 19968: jis0208<<14 | 0x4B<<7 | 0x31, 36092 - 19968: jis0208<<14 | 0x18<<7 | 0x37, 36093 - 19968: jis0208<<14 | 0x4B<<7 | 0x2F, 36094 - 19968: jis0212<<14 | 0x3E<<7 | 0x1D, 36095 - 19968: jis0212<<14 | 0x3E<<7 | 0x1E, 36097 - 19968: jis0212<<14 | 0x3E<<7 | 0x1F, 36099 - 19968: jis0212<<14 | 0x3E<<7 | 0x20, 36100 - 19968: jis0208<<14 | 0x4B<<7 | 0x32, 36101 - 19968: jis0208<<14 | 0x4B<<7 | 0x33, 36103 - 19968: jis0208<<14 | 0x4B<<7 | 0x35, 36104 - 19968: jis0208<<14 | 0x21<<7 | 0x02, 36105 - 19968: jis0212<<14 | 0x3E<<7 | 0x21, 36106 - 19968: jis0208<<14 | 0x4B<<7 | 0x34, 36107 - 19968: jis0208<<14 | 0x13<<7 | 0x45, 36109 - 19968: jis0208<<14 | 0x4B<<7 | 0x37, 36111 - 19968: jis0208<<14 | 0x4B<<7 | 0x36, 36112 - 19968: jis0208<<14 | 0x4B<<7 | 0x38, 36114 - 19968: jis0208<<14 | 0x5A<<7 | 0x52, 36115 - 19968: jis0208<<14 | 0x4B<<7 | 0x3A, 36116 - 19968: jis0208<<14 | 0x4B<<7 | 0x3C, 36118 - 19968: jis0208<<14 | 0x4B<<7 | 0x3D, 36119 - 19968: jis0212<<14 | 0x3E<<7 | 0x23, 36123 - 19968: jis0212<<14 | 0x3E<<7 | 0x24, 36196 - 19968: jis0208<<14 | 0x1F<<7 | 0x35, 36197 - 19968: jis0212<<14 | 0x3E<<7 | 0x25, 36198 - 19968: jis0208<<14 | 0x1B<<7 | 0x2E, 36199 - 19968: jis0208<<14 | 0x4B<<7 | 0x3E, 36201 - 19968: jis0212<<14 | 0x3E<<7 | 0x26, 36203 - 19968: jis0208<<14 | 0x12<<7 | 0x31, 36204 - 19968: jis0212<<14 | 0x3E<<7 | 0x27, 36205 - 19968: jis0208<<14 | 0x4B<<7 | 0x3F, 36206 - 19968: jis0212<<14 | 0x3E<<7 | 0x28, 36208 - 19968: jis0208<<14 | 0x20<<7 | 0x55, 36209 - 19968: jis0208<<14 | 0x4B<<7 | 0x40, 36211 - 19968: jis0208<<14 | 0x4B<<7 | 0x41, 36212 - 19968: jis0208<<14 | 0x28<<7 | 0x4A, 36214 - 19968: jis0208<<14 | 0x5A<<7 | 0x53, 36215 - 19968: jis0208<<14 | 0x14<<7 | 0x0E, 36223 - 19968: jis0212<<14 | 0x3E<<7 | 0x29, 36225 - 19968: jis0208<<14 | 0x4B<<7 | 0x42, 36226 - 19968: jis0212<<14 | 0x3E<<7 | 0x2A, 36228 - 19968: jis0212<<14 | 0x3E<<7 | 0x2B, 36229 - 19968: jis0208<<14 | 0x23<<7 | 0x15, 36232 - 19968: jis0212<<14 | 0x3E<<7 | 0x2C, 36234 - 19968: jis0208<<14 | 0x10<<7 | 0x3A, 36237 - 19968: jis0212<<14 | 0x3E<<7 | 0x2D, 36240 - 19968: jis0212<<14 | 0x3E<<7 | 0x2E, 36241 - 19968: jis0212<<14 | 0x3E<<7 | 0x2F, 36245 - 19968: jis0212<<14 | 0x3E<<7 | 0x30, 36249 - 19968: jis0208<<14 | 0x4B<<7 | 0x43, 36254 - 19968: jis0212<<14 | 0x3E<<7 | 0x31, 36255 - 19968: jis0212<<14 | 0x3E<<7 | 0x32, 36256 - 19968: jis0212<<14 | 0x3E<<7 | 0x33, 36259 - 19968: jis0208<<14 | 0x1B<<7 | 0x50, 36262 - 19968: jis0212<<14 | 0x3E<<7 | 0x34, 36264 - 19968: jis0208<<14 | 0x1E<<7 | 0x55, 36267 - 19968: jis0212<<14 | 0x3E<<7 | 0x35, 36268 - 19968: jis0212<<14 | 0x3E<<7 | 0x36, 36271 - 19968: jis0212<<14 | 0x3E<<7 | 0x37, 36274 - 19968: jis0212<<14 | 0x3E<<7 | 0x38, 36275 - 19968: jis0208<<14 | 0x21<<7 | 0x0C, 36277 - 19968: jis0212<<14 | 0x3E<<7 | 0x39, 36279 - 19968: jis0212<<14 | 0x3E<<7 | 0x3A, 36281 - 19968: jis0212<<14 | 0x3E<<7 | 0x3B, 36282 - 19968: jis0208<<14 | 0x4B<<7 | 0x46, 36283 - 19968: jis0212<<14 | 0x3E<<7 | 0x3C, 36284 - 19968: jis0212<<14 | 0x3E<<7 | 0x4E, 36286 - 19968: jis0208<<14 | 0x4B<<7 | 0x45, 36288 - 19968: jis0212<<14 | 0x3E<<7 | 0x3D, 36290 - 19968: jis0208<<14 | 0x4B<<7 | 0x44, 36293 - 19968: jis0212<<14 | 0x3E<<7 | 0x3E, 36294 - 19968: jis0212<<14 | 0x3E<<7 | 0x3F, 36295 - 19968: jis0212<<14 | 0x3E<<7 | 0x40, 36296 - 19968: jis0212<<14 | 0x3E<<7 | 0x41, 36298 - 19968: jis0212<<14 | 0x3E<<7 | 0x42, 36299 - 19968: jis0208<<14 | 0x4B<<7 | 0x4C, 36300 - 19968: jis0208<<14 | 0x4B<<7 | 0x4A, 36302 - 19968: jis0212<<14 | 0x3E<<7 | 0x43, 36303 - 19968: jis0208<<14 | 0x4B<<7 | 0x47, 36305 - 19968: jis0212<<14 | 0x3E<<7 | 0x44, 36308 - 19968: jis0212<<14 | 0x3E<<7 | 0x45, 36309 - 19968: jis0212<<14 | 0x3E<<7 | 0x46, 36310 - 19968: jis0208<<14 | 0x4B<<7 | 0x49, 36311 - 19968: jis0212<<14 | 0x3E<<7 | 0x47, 36313 - 19968: jis0212<<14 | 0x3E<<7 | 0x48, 36314 - 19968: jis0208<<14 | 0x4B<<7 | 0x48, 36315 - 19968: jis0208<<14 | 0x4B<<7 | 0x4B, 36317 - 19968: jis0208<<14 | 0x14<<7 | 0x56, 36319 - 19968: jis0208<<14 | 0x4B<<7 | 0x4F, 36321 - 19968: jis0208<<14 | 0x1F<<7 | 0x36, 36323 - 19968: jis0208<<14 | 0x4B<<7 | 0x50, 36324 - 19968: jis0212<<14 | 0x3E<<7 | 0x49, 36325 - 19968: jis0212<<14 | 0x3E<<7 | 0x4A, 36327 - 19968: jis0212<<14 | 0x3E<<7 | 0x4B, 36328 - 19968: jis0208<<14 | 0x17<<7 | 0x38, 36330 - 19968: jis0208<<14 | 0x4B<<7 | 0x4D, 36331 - 19968: jis0208<<14 | 0x4B<<7 | 0x4E, 36332 - 19968: jis0212<<14 | 0x3E<<7 | 0x4C, 36335 - 19968: jis0208<<14 | 0x2E<<7 | 0x08, 36336 - 19968: jis0212<<14 | 0x3E<<7 | 0x4D, 36337 - 19968: jis0212<<14 | 0x3E<<7 | 0x4F, 36338 - 19968: jis0212<<14 | 0x3E<<7 | 0x50, 36339 - 19968: jis0208<<14 | 0x23<<7 | 0x16, 36340 - 19968: jis0212<<14 | 0x3E<<7 | 0x51, 36341 - 19968: jis0208<<14 | 0x20<<7 | 0x08, 36348 - 19968: jis0208<<14 | 0x4B<<7 | 0x51, 36349 - 19968: jis0212<<14 | 0x3E<<7 | 0x52, 36351 - 19968: jis0208<<14 | 0x4B<<7 | 0x54, 36353 - 19968: jis0212<<14 | 0x3E<<7 | 0x53, 36356 - 19968: jis0212<<14 | 0x3E<<7 | 0x54, 36357 - 19968: jis0212<<14 | 0x3E<<7 | 0x55, 36358 - 19968: jis0212<<14 | 0x3E<<7 | 0x56, 36360 - 19968: jis0208<<14 | 0x4B<<7 | 0x52, 36361 - 19968: jis0208<<14 | 0x4B<<7 | 0x53, 36362 - 19968: jis0208<<14 | 0x2C<<7 | 0x38, 36363 - 19968: jis0212<<14 | 0x3E<<7 | 0x57, 36367 - 19968: jis0208<<14 | 0x25<<7 | 0x06, 36368 - 19968: jis0208<<14 | 0x4B<<7 | 0x57, 36369 - 19968: jis0212<<14 | 0x3E<<7 | 0x58, 36372 - 19968: jis0212<<14 | 0x3E<<7 | 0x59, 36374 - 19968: jis0212<<14 | 0x3E<<7 | 0x5A, 36381 - 19968: jis0208<<14 | 0x4B<<7 | 0x55, 36382 - 19968: jis0208<<14 | 0x4B<<7 | 0x56, 36383 - 19968: jis0208<<14 | 0x4B<<7 | 0x58, 36384 - 19968: jis0212<<14 | 0x3E<<7 | 0x5B, 36385 - 19968: jis0212<<14 | 0x3E<<7 | 0x5C, 36386 - 19968: jis0212<<14 | 0x3E<<7 | 0x5D, 36387 - 19968: jis0212<<14 | 0x3F<<7 | 0x00, 36390 - 19968: jis0212<<14 | 0x3F<<7 | 0x01, 36391 - 19968: jis0212<<14 | 0x3F<<7 | 0x02, 36394 - 19968: jis0208<<14 | 0x4C<<7 | 0x08, 36400 - 19968: jis0208<<14 | 0x4B<<7 | 0x5B, 36401 - 19968: jis0212<<14 | 0x3F<<7 | 0x03, 36403 - 19968: jis0212<<14 | 0x3F<<7 | 0x04, 36404 - 19968: jis0208<<14 | 0x4B<<7 | 0x5C, 36405 - 19968: jis0208<<14 | 0x4B<<7 | 0x5A, 36406 - 19968: jis0212<<14 | 0x3F<<7 | 0x05, 36407 - 19968: jis0212<<14 | 0x3F<<7 | 0x06, 36408 - 19968: jis0212<<14 | 0x3F<<7 | 0x07, 36409 - 19968: jis0212<<14 | 0x3F<<7 | 0x08, 36413 - 19968: jis0212<<14 | 0x3F<<7 | 0x09, 36416 - 19968: jis0212<<14 | 0x3F<<7 | 0x0A, 36417 - 19968: jis0212<<14 | 0x3F<<7 | 0x0B, 36418 - 19968: jis0208<<14 | 0x4B<<7 | 0x59, 36420 - 19968: jis0208<<14 | 0x23<<7 | 0x5C, 36423 - 19968: jis0208<<14 | 0x4C<<7 | 0x00, 36424 - 19968: jis0208<<14 | 0x4C<<7 | 0x04, 36425 - 19968: jis0208<<14 | 0x4C<<7 | 0x01, 36426 - 19968: jis0208<<14 | 0x4B<<7 | 0x5D, 36427 - 19968: jis0212<<14 | 0x3F<<7 | 0x0C, 36428 - 19968: jis0208<<14 | 0x4C<<7 | 0x02, 36429 - 19968: jis0212<<14 | 0x3F<<7 | 0x0D, 36430 - 19968: jis0212<<14 | 0x3F<<7 | 0x0E, 36431 - 19968: jis0212<<14 | 0x3F<<7 | 0x0F, 36432 - 19968: jis0208<<14 | 0x4C<<7 | 0x03, 36436 - 19968: jis0212<<14 | 0x3F<<7 | 0x10, 36437 - 19968: jis0208<<14 | 0x4C<<7 | 0x0A, 36441 - 19968: jis0208<<14 | 0x4C<<7 | 0x05, 36443 - 19968: jis0212<<14 | 0x3F<<7 | 0x11, 36444 - 19968: jis0212<<14 | 0x3F<<7 | 0x12, 36445 - 19968: jis0212<<14 | 0x3F<<7 | 0x13, 36446 - 19968: jis0212<<14 | 0x3F<<7 | 0x14, 36447 - 19968: jis0208<<14 | 0x1F<<7 | 0x37, 36448 - 19968: jis0208<<14 | 0x4C<<7 | 0x07, 36449 - 19968: jis0212<<14 | 0x3F<<7 | 0x15, 36450 - 19968: jis0212<<14 | 0x3F<<7 | 0x16, 36451 - 19968: jis0208<<14 | 0x4C<<7 | 0x09, 36452 - 19968: jis0208<<14 | 0x4C<<7 | 0x06, 36457 - 19968: jis0212<<14 | 0x3F<<7 | 0x17, 36460 - 19968: jis0212<<14 | 0x3F<<7 | 0x18, 36461 - 19968: jis0212<<14 | 0x3F<<7 | 0x19, 36463 - 19968: jis0212<<14 | 0x3F<<7 | 0x1A, 36464 - 19968: jis0212<<14 | 0x3F<<7 | 0x1B, 36465 - 19968: jis0212<<14 | 0x3F<<7 | 0x1C, 36466 - 19968: jis0208<<14 | 0x4C<<7 | 0x0C, 36468 - 19968: jis0208<<14 | 0x1C<<7 | 0x12, 36470 - 19968: jis0208<<14 | 0x4C<<7 | 0x0B, 36473 - 19968: jis0212<<14 | 0x3F<<7 | 0x1D, 36474 - 19968: jis0212<<14 | 0x3F<<7 | 0x1E, 36475 - 19968: jis0212<<14 | 0x3F<<7 | 0x1F, 36476 - 19968: jis0208<<14 | 0x4C<<7 | 0x0D, 36481 - 19968: jis0208<<14 | 0x4C<<7 | 0x0E, 36482 - 19968: jis0212<<14 | 0x3F<<7 | 0x20, 36483 - 19968: jis0212<<14 | 0x3F<<7 | 0x21, 36484 - 19968: jis0208<<14 | 0x4C<<7 | 0x11, 36485 - 19968: jis0208<<14 | 0x4C<<7 | 0x10, 36487 - 19968: jis0208<<14 | 0x4C<<7 | 0x0F, 36489 - 19968: jis0212<<14 | 0x3F<<7 | 0x22, 36490 - 19968: jis0208<<14 | 0x4C<<7 | 0x13, 36491 - 19968: jis0208<<14 | 0x4C<<7 | 0x12, 36493 - 19968: jis0208<<14 | 0x2B<<7 | 0x55, 36496 - 19968: jis0212<<14 | 0x3F<<7 | 0x23, 36497 - 19968: jis0208<<14 | 0x4C<<7 | 0x15, 36498 - 19968: jis0212<<14 | 0x3F<<7 | 0x24, 36499 - 19968: jis0208<<14 | 0x4C<<7 | 0x14, 36500 - 19968: jis0208<<14 | 0x4C<<7 | 0x16, 36501 - 19968: jis0212<<14 | 0x3F<<7 | 0x25, 36505 - 19968: jis0208<<14 | 0x4C<<7 | 0x17, 36506 - 19968: jis0212<<14 | 0x3F<<7 | 0x26, 36507 - 19968: jis0212<<14 | 0x3F<<7 | 0x27, 36509 - 19968: jis0212<<14 | 0x3F<<7 | 0x28, 36510 - 19968: jis0212<<14 | 0x3F<<7 | 0x29, 36513 - 19968: jis0208<<14 | 0x4C<<7 | 0x19, 36514 - 19968: jis0212<<14 | 0x3F<<7 | 0x2A, 36519 - 19968: jis0212<<14 | 0x3F<<7 | 0x2B, 36521 - 19968: jis0212<<14 | 0x3F<<7 | 0x2C, 36522 - 19968: jis0208<<14 | 0x4C<<7 | 0x18, 36523 - 19968: jis0208<<14 | 0x1E<<7 | 0x27, 36524 - 19968: jis0208<<14 | 0x4C<<7 | 0x1A, 36525 - 19968: jis0212<<14 | 0x3F<<7 | 0x2D, 36526 - 19968: jis0212<<14 | 0x3F<<7 | 0x2E, 36527 - 19968: jis0208<<14 | 0x15<<7 | 0x4C, 36528 - 19968: jis0208<<14 | 0x4C<<7 | 0x1B, 36529 - 19968: jis0208<<14 | 0x4C<<7 | 0x1D, 36531 - 19968: jis0212<<14 | 0x3F<<7 | 0x2F, 36533 - 19968: jis0212<<14 | 0x3F<<7 | 0x30, 36538 - 19968: jis0212<<14 | 0x3F<<7 | 0x31, 36539 - 19968: jis0212<<14 | 0x3F<<7 | 0x32, 36542 - 19968: jis0208<<14 | 0x4C<<7 | 0x1E, 36544 - 19968: jis0212<<14 | 0x3F<<7 | 0x33, 36545 - 19968: jis0212<<14 | 0x3F<<7 | 0x34, 36547 - 19968: jis0212<<14 | 0x3F<<7 | 0x35, 36548 - 19968: jis0212<<14 | 0x3F<<7 | 0x36, 36549 - 19968: jis0208<<14 | 0x4C<<7 | 0x1F, 36550 - 19968: jis0208<<14 | 0x4C<<7 | 0x1C, 36551 - 19968: jis0212<<14 | 0x3F<<7 | 0x37, 36552 - 19968: jis0208<<14 | 0x4C<<7 | 0x20, 36554 - 19968: jis0208<<14 | 0x1B<<7 | 0x35, 36555 - 19968: jis0208<<14 | 0x4C<<7 | 0x21, 36556 - 19968: jis0208<<14 | 0x14<<7 | 0x0F, 36557 - 19968: jis0208<<14 | 0x16<<7 | 0x12, 36559 - 19968: jis0208<<14 | 0x5A<<7 | 0x55, 36561 - 19968: jis0212<<14 | 0x3F<<7 | 0x39, 36562 - 19968: jis0208<<14 | 0x17<<7 | 0x0D, 36564 - 19968: jis0212<<14 | 0x3F<<7 | 0x3A, 36571 - 19968: jis0208<<14 | 0x4C<<7 | 0x22, 36572 - 19968: jis0212<<14 | 0x3F<<7 | 0x3B, 36575 - 19968: jis0208<<14 | 0x25<<7 | 0x4F, 36578 - 19968: jis0208<<14 | 0x24<<7 | 0x1D, 36579 - 19968: jis0208<<14 | 0x4C<<7 | 0x23, 36584 - 19968: jis0212<<14 | 0x3F<<7 | 0x3C, 36587 - 19968: jis0208<<14 | 0x4C<<7 | 0x26, 36589 - 19968: jis0212<<14 | 0x3F<<7 | 0x43, 36590 - 19968: jis0212<<14 | 0x3F<<7 | 0x3D, 36592 - 19968: jis0212<<14 | 0x3F<<7 | 0x3E, 36593 - 19968: jis0212<<14 | 0x3F<<7 | 0x3F, 36599 - 19968: jis0212<<14 | 0x3F<<7 | 0x40, 36600 - 19968: jis0208<<14 | 0x1B<<7 | 0x13, 36601 - 19968: jis0212<<14 | 0x3F<<7 | 0x41, 36602 - 19968: jis0212<<14 | 0x3F<<7 | 0x42, 36603 - 19968: jis0208<<14 | 0x4C<<7 | 0x25, 36604 - 19968: jis0208<<14 | 0x4C<<7 | 0x24, 36605 - 19968: jis0208<<14 | 0x16<<7 | 0x39, 36606 - 19968: jis0208<<14 | 0x4C<<7 | 0x27, 36608 - 19968: jis0212<<14 | 0x3F<<7 | 0x44, 36610 - 19968: jis0212<<14 | 0x3F<<7 | 0x45, 36611 - 19968: jis0208<<14 | 0x12<<7 | 0x32, 36613 - 19968: jis0208<<14 | 0x4C<<7 | 0x29, 36615 - 19968: jis0212<<14 | 0x3F<<7 | 0x46, 36616 - 19968: jis0212<<14 | 0x3F<<7 | 0x47, 36617 - 19968: jis0208<<14 | 0x19<<7 | 0x3B, 36618 - 19968: jis0208<<14 | 0x4C<<7 | 0x28, 36620 - 19968: jis0208<<14 | 0x4C<<7 | 0x31, 36623 - 19968: jis0212<<14 | 0x3F<<7 | 0x48, 36624 - 19968: jis0212<<14 | 0x3F<<7 | 0x49, 36626 - 19968: jis0208<<14 | 0x4C<<7 | 0x2B, 36627 - 19968: jis0208<<14 | 0x4C<<7 | 0x2D, 36628 - 19968: jis0208<<14 | 0x29<<7 | 0x44, 36629 - 19968: jis0208<<14 | 0x4C<<7 | 0x2A, 36630 - 19968: jis0212<<14 | 0x3F<<7 | 0x4A, 36631 - 19968: jis0212<<14 | 0x3F<<7 | 0x4B, 36632 - 19968: jis0212<<14 | 0x3F<<7 | 0x4C, 36633 - 19968: jis0208<<14 | 0x4C<<7 | 0x2C, 36635 - 19968: jis0208<<14 | 0x4C<<7 | 0x30, 36636 - 19968: jis0208<<14 | 0x4C<<7 | 0x2E, 36637 - 19968: jis0208<<14 | 0x14<<7 | 0x10, 36638 - 19968: jis0212<<14 | 0x3F<<7 | 0x4D, 36639 - 19968: jis0208<<14 | 0x4C<<7 | 0x2F, 36640 - 19968: jis0212<<14 | 0x3F<<7 | 0x4E, 36641 - 19968: jis0212<<14 | 0x3F<<7 | 0x4F, 36643 - 19968: jis0212<<14 | 0x3F<<7 | 0x50, 36645 - 19968: jis0212<<14 | 0x3F<<7 | 0x51, 36646 - 19968: jis0208<<14 | 0x4C<<7 | 0x32, 36647 - 19968: jis0212<<14 | 0x3F<<7 | 0x52, 36648 - 19968: jis0212<<14 | 0x3F<<7 | 0x53, 36649 - 19968: jis0208<<14 | 0x26<<7 | 0x39, 36650 - 19968: jis0208<<14 | 0x2D<<7 | 0x37, 36652 - 19968: jis0212<<14 | 0x3F<<7 | 0x54, 36653 - 19968: jis0212<<14 | 0x3F<<7 | 0x55, 36654 - 19968: jis0212<<14 | 0x3F<<7 | 0x56, 36655 - 19968: jis0208<<14 | 0x1C<<7 | 0x13, 36659 - 19968: jis0208<<14 | 0x4C<<7 | 0x33, 36660 - 19968: jis0212<<14 | 0x3F<<7 | 0x57, 36661 - 19968: jis0212<<14 | 0x3F<<7 | 0x58, 36662 - 19968: jis0212<<14 | 0x3F<<7 | 0x59, 36663 - 19968: jis0212<<14 | 0x3F<<7 | 0x5A, 36664 - 19968: jis0208<<14 | 0x2C<<7 | 0x01, 36665 - 19968: jis0208<<14 | 0x4C<<7 | 0x35, 36666 - 19968: jis0212<<14 | 0x3F<<7 | 0x5B, 36667 - 19968: jis0208<<14 | 0x4C<<7 | 0x34, 36670 - 19968: jis0208<<14 | 0x4C<<7 | 0x38, 36671 - 19968: jis0208<<14 | 0x2C<<7 | 0x20, 36672 - 19968: jis0212<<14 | 0x3F<<7 | 0x5C, 36673 - 19968: jis0212<<14 | 0x3F<<7 | 0x5D, 36674 - 19968: jis0208<<14 | 0x4C<<7 | 0x37, 36675 - 19968: jis0212<<14 | 0x40<<7 | 0x00, 36676 - 19968: jis0208<<14 | 0x12<<7 | 0x4C, 36677 - 19968: jis0208<<14 | 0x4C<<7 | 0x36, 36678 - 19968: jis0208<<14 | 0x4C<<7 | 0x3B, 36679 - 19968: jis0212<<14 | 0x40<<7 | 0x01, 36681 - 19968: jis0208<<14 | 0x4C<<7 | 0x3A, 36684 - 19968: jis0208<<14 | 0x4C<<7 | 0x39, 36685 - 19968: jis0208<<14 | 0x24<<7 | 0x11, 36686 - 19968: jis0208<<14 | 0x4C<<7 | 0x3C, 36687 - 19968: jis0212<<14 | 0x40<<7 | 0x02, 36689 - 19968: jis0212<<14 | 0x40<<7 | 0x03, 36690 - 19968: jis0212<<14 | 0x40<<7 | 0x04, 36691 - 19968: jis0212<<14 | 0x40<<7 | 0x05, 36692 - 19968: jis0212<<14 | 0x40<<7 | 0x06, 36693 - 19968: jis0212<<14 | 0x40<<7 | 0x07, 36695 - 19968: jis0208<<14 | 0x4C<<7 | 0x3D, 36696 - 19968: jis0212<<14 | 0x40<<7 | 0x08, 36700 - 19968: jis0208<<14 | 0x4C<<7 | 0x3E, 36701 - 19968: jis0212<<14 | 0x40<<7 | 0x09, 36702 - 19968: jis0212<<14 | 0x40<<7 | 0x0A, 36703 - 19968: jis0208<<14 | 0x18<<7 | 0x4B, 36705 - 19968: jis0208<<14 | 0x16<<7 | 0x04, 36706 - 19968: jis0208<<14 | 0x4C<<7 | 0x3F, 36707 - 19968: jis0208<<14 | 0x4C<<7 | 0x40, 36708 - 19968: jis0208<<14 | 0x4C<<7 | 0x41, 36709 - 19968: jis0212<<14 | 0x40<<7 | 0x0B, 36763 - 19968: jis0208<<14 | 0x1E<<7 | 0x28, 36764 - 19968: jis0208<<14 | 0x4C<<7 | 0x42, 36765 - 19968: jis0212<<14 | 0x40<<7 | 0x0C, 36766 - 19968: jis0208<<14 | 0x1B<<7 | 0x0C, 36767 - 19968: jis0208<<14 | 0x4C<<7 | 0x43, 36768 - 19968: jis0212<<14 | 0x40<<7 | 0x0D, 36769 - 19968: jis0212<<14 | 0x40<<7 | 0x0E, 36771 - 19968: jis0208<<14 | 0x4C<<7 | 0x44, 36772 - 19968: jis0212<<14 | 0x40<<7 | 0x0F, 36773 - 19968: jis0212<<14 | 0x40<<7 | 0x10, 36774 - 19968: jis0212<<14 | 0x40<<7 | 0x11, 36775 - 19968: jis0208<<14 | 0x31<<7 | 0x00, 36776 - 19968: jis0208<<14 | 0x30<<7 | 0x5D, 36781 - 19968: jis0208<<14 | 0x4C<<7 | 0x45, 36782 - 19968: jis0208<<14 | 0x44<<7 | 0x4F, 36783 - 19968: jis0208<<14 | 0x4C<<7 | 0x46, 36784 - 19968: jis0208<<14 | 0x22<<7 | 0x03, 36785 - 19968: jis0208<<14 | 0x1E<<7 | 0x0A, 36786 - 19968: jis0208<<14 | 0x26<<7 | 0x1F, 36789 - 19968: jis0212<<14 | 0x40<<7 | 0x12, 36790 - 19968: jis0212<<14 | 0x40<<7 | 0x13, 36791 - 19968: jis0208<<14 | 0x4C<<7 | 0x47, 36792 - 19968: jis0212<<14 | 0x40<<7 | 0x14, 36794 - 19968: jis0208<<14 | 0x29<<7 | 0x34, 36795 - 19968: jis0208<<14 | 0x23<<7 | 0x33, 36796 - 19968: jis0208<<14 | 0x18<<7 | 0x5D, 36798 - 19968: jis0212<<14 | 0x40<<7 | 0x15, 36799 - 19968: jis0208<<14 | 0x22<<7 | 0x08, 36800 - 19968: jis0212<<14 | 0x40<<7 | 0x16, 36801 - 19968: jis0212<<14 | 0x40<<7 | 0x17, 36802 - 19968: jis0208<<14 | 0x10<<7 | 0x09, 36804 - 19968: jis0208<<14 | 0x2A<<7 | 0x57, 36805 - 19968: jis0208<<14 | 0x1E<<7 | 0x36, 36806 - 19968: jis0212<<14 | 0x40<<7 | 0x18, 36810 - 19968: jis0212<<14 | 0x40<<7 | 0x19, 36811 - 19968: jis0212<<14 | 0x40<<7 | 0x1A, 36813 - 19968: jis0212<<14 | 0x40<<7 | 0x1B, 36814 - 19968: jis0208<<14 | 0x16<<7 | 0x3D, 36816 - 19968: jis0212<<14 | 0x40<<7 | 0x1C, 36817 - 19968: jis0208<<14 | 0x15<<7 | 0x40, 36818 - 19968: jis0212<<14 | 0x40<<7 | 0x1D, 36819 - 19968: jis0212<<14 | 0x40<<7 | 0x1E, 36820 - 19968: jis0208<<14 | 0x29<<7 | 0x35, 36821 - 19968: jis0212<<14 | 0x40<<7 | 0x1F, 36826 - 19968: jis0208<<14 | 0x4C<<7 | 0x48, 36832 - 19968: jis0212<<14 | 0x40<<7 | 0x20, 36834 - 19968: jis0208<<14 | 0x4C<<7 | 0x4A, 36835 - 19968: jis0212<<14 | 0x40<<7 | 0x21, 36836 - 19968: jis0212<<14 | 0x40<<7 | 0x22, 36837 - 19968: jis0208<<14 | 0x4C<<7 | 0x49, 36838 - 19968: jis0208<<14 | 0x11<<7 | 0x3F, 36840 - 19968: jis0212<<14 | 0x40<<7 | 0x23, 36841 - 19968: jis0208<<14 | 0x25<<7 | 0x55, 36842 - 19968: jis0208<<14 | 0x4C<<7 | 0x4B, 36843 - 19968: jis0208<<14 | 0x26<<7 | 0x56, 36845 - 19968: jis0208<<14 | 0x24<<7 | 0x12, 36846 - 19968: jis0212<<14 | 0x40<<7 | 0x24, 36847 - 19968: jis0208<<14 | 0x4C<<7 | 0x4C, 36848 - 19968: jis0208<<14 | 0x1C<<7 | 0x31, 36849 - 19968: jis0212<<14 | 0x40<<7 | 0x25, 36852 - 19968: jis0208<<14 | 0x4C<<7 | 0x4E, 36853 - 19968: jis0212<<14 | 0x40<<7 | 0x26, 36854 - 19968: jis0212<<14 | 0x40<<7 | 0x27, 36855 - 19968: jis0208<<14 | 0x2B<<7 | 0x21, 36856 - 19968: jis0208<<14 | 0x4C<<7 | 0x5D, 36857 - 19968: jis0208<<14 | 0x4C<<7 | 0x50, 36858 - 19968: jis0208<<14 | 0x4C<<7 | 0x51, 36859 - 19968: jis0212<<14 | 0x40<<7 | 0x28, 36861 - 19968: jis0208<<14 | 0x23<<7 | 0x28, 36862 - 19968: jis0212<<14 | 0x40<<7 | 0x29, 36864 - 19968: jis0208<<14 | 0x21<<7 | 0x3F, 36865 - 19968: jis0208<<14 | 0x20<<7 | 0x56, 36866 - 19968: jis0212<<14 | 0x40<<7 | 0x2A, 36867 - 19968: jis0208<<14 | 0x25<<7 | 0x07, 36868 - 19968: jis0212<<14 | 0x40<<7 | 0x2B, 36869 - 19968: jis0208<<14 | 0x4C<<7 | 0x4F, 36870 - 19968: jis0208<<14 | 0x14<<7 | 0x34, 36872 - 19968: jis0212<<14 | 0x40<<7 | 0x2C, 36875 - 19968: jis0208<<14 | 0x4C<<7 | 0x58, 36876 - 19968: jis0212<<14 | 0x40<<7 | 0x2D, 36877 - 19968: jis0208<<14 | 0x4C<<7 | 0x55, 36878 - 19968: jis0208<<14 | 0x4D<<7 | 0x04, 36879 - 19968: jis0208<<14 | 0x25<<7 | 0x08, 36880 - 19968: jis0208<<14 | 0x22<<7 | 0x3F, 36881 - 19968: jis0208<<14 | 0x4C<<7 | 0x52, 36883 - 19968: jis0208<<14 | 0x23<<7 | 0x5D, 36884 - 19968: jis0208<<14 | 0x24<<7 | 0x32, 36885 - 19968: jis0208<<14 | 0x4C<<7 | 0x53, 36886 - 19968: jis0208<<14 | 0x4C<<7 | 0x57, 36887 - 19968: jis0208<<14 | 0x1E<<7 | 0x3F, 36888 - 19968: jis0212<<14 | 0x40<<7 | 0x2E, 36889 - 19968: jis0208<<14 | 0x26<<7 | 0x46, 36890 - 19968: jis0208<<14 | 0x23<<7 | 0x2B, 36891 - 19968: jis0212<<14 | 0x40<<7 | 0x2F, 36893 - 19968: jis0208<<14 | 0x1F<<7 | 0x21, 36894 - 19968: jis0208<<14 | 0x4C<<7 | 0x56, 36895 - 19968: jis0208<<14 | 0x21<<7 | 0x0D, 36896 - 19968: jis0208<<14 | 0x21<<7 | 0x03, 36897 - 19968: jis0208<<14 | 0x4C<<7 | 0x54, 36898 - 19968: jis0208<<14 | 0x0F<<7 | 0x08, 36899 - 19968: jis0208<<14 | 0x2E<<7 | 0x01, 36903 - 19968: jis0208<<14 | 0x4C<<7 | 0x59, 36904 - 19968: jis0212<<14 | 0x40<<7 | 0x30, 36905 - 19968: jis0212<<14 | 0x40<<7 | 0x31, 36906 - 19968: jis0212<<14 | 0x40<<7 | 0x33, 36908 - 19968: jis0212<<14 | 0x40<<7 | 0x34, 36909 - 19968: jis0212<<14 | 0x40<<7 | 0x35, 36910 - 19968: jis0208<<14 | 0x21<<7 | 0x40, 36911 - 19968: jis0212<<14 | 0x40<<7 | 0x32, 36913 - 19968: jis0208<<14 | 0x1C<<7 | 0x14, 36914 - 19968: jis0208<<14 | 0x1E<<7 | 0x29, 36915 - 19968: jis0212<<14 | 0x40<<7 | 0x36, 36916 - 19968: jis0212<<14 | 0x40<<7 | 0x37, 36917 - 19968: jis0208<<14 | 0x4C<<7 | 0x5B, 36918 - 19968: jis0208<<14 | 0x4C<<7 | 0x5A, 36919 - 19968: jis0212<<14 | 0x40<<7 | 0x38, 36920 - 19968: jis0208<<14 | 0x0F<<7 | 0x4E, 36921 - 19968: jis0208<<14 | 0x4C<<7 | 0x5C, 36924 - 19968: jis0208<<14 | 0x28<<7 | 0x0E, 36926 - 19968: jis0208<<14 | 0x4D<<7 | 0x06, 36927 - 19968: jis0212<<14 | 0x40<<7 | 0x39, 36929 - 19968: jis0208<<14 | 0x25<<7 | 0x3A, 36930 - 19968: jis0208<<14 | 0x1E<<7 | 0x4A, 36931 - 19968: jis0212<<14 | 0x40<<7 | 0x3A, 36932 - 19968: jis0212<<14 | 0x40<<7 | 0x3B, 36933 - 19968: jis0208<<14 | 0x22<<7 | 0x38, 36935 - 19968: jis0208<<14 | 0x15<<7 | 0x57, 36937 - 19968: jis0208<<14 | 0x4D<<7 | 0x05, 36938 - 19968: jis0208<<14 | 0x2C<<7 | 0x16, 36939 - 19968: jis0208<<14 | 0x10<<7 | 0x1E, 36940 - 19968: jis0212<<14 | 0x40<<7 | 0x3C, 36941 - 19968: jis0208<<14 | 0x29<<7 | 0x36, 36942 - 19968: jis0208<<14 | 0x11<<7 | 0x40, 36943 - 19968: jis0208<<14 | 0x4D<<7 | 0x00, 36944 - 19968: jis0208<<14 | 0x4D<<7 | 0x01, 36945 - 19968: jis0208<<14 | 0x4D<<7 | 0x02, 36946 - 19968: jis0208<<14 | 0x4D<<7 | 0x03, 36947 - 19968: jis0208<<14 | 0x25<<7 | 0x1A, 36948 - 19968: jis0208<<14 | 0x22<<7 | 0x02, 36949 - 19968: jis0208<<14 | 0x0F<<7 | 0x42, 36950 - 19968: jis0208<<14 | 0x4D<<7 | 0x07, 36952 - 19968: jis0208<<14 | 0x4D<<7 | 0x08, 36953 - 19968: jis0208<<14 | 0x53<<7 | 0x02, 36955 - 19968: jis0212<<14 | 0x40<<7 | 0x3D, 36956 - 19968: jis0208<<14 | 0x21<<7 | 0x1C, 36957 - 19968: jis0212<<14 | 0x40<<7 | 0x3E, 36958 - 19968: jis0208<<14 | 0x4D<<7 | 0x09, 36960 - 19968: jis0208<<14 | 0x10<<7 | 0x52, 36961 - 19968: jis0208<<14 | 0x20<<7 | 0x2B, 36962 - 19968: jis0212<<14 | 0x40<<7 | 0x3F, 36963 - 19968: jis0208<<14 | 0x17<<7 | 0x0E, 36965 - 19968: jis0208<<14 | 0x2C<<7 | 0x39, 36966 - 19968: jis0212<<14 | 0x40<<7 | 0x40, 36967 - 19968: jis0208<<14 | 0x5A<<7 | 0x58, 36968 - 19968: jis0208<<14 | 0x4D<<7 | 0x0A, 36969 - 19968: jis0208<<14 | 0x24<<7 | 0x0B, 36972 - 19968: jis0212<<14 | 0x40<<7 | 0x42, 36973 - 19968: jis0208<<14 | 0x20<<7 | 0x57, 36974 - 19968: jis0208<<14 | 0x1B<<7 | 0x36, 36975 - 19968: jis0208<<14 | 0x4D<<7 | 0x0B, 36976 - 19968: jis0212<<14 | 0x40<<7 | 0x43, 36978 - 19968: jis0208<<14 | 0x4D<<7 | 0x0E, 36980 - 19968: jis0212<<14 | 0x40<<7 | 0x44, 36981 - 19968: jis0208<<14 | 0x1C<<7 | 0x44, 36982 - 19968: jis0208<<14 | 0x4D<<7 | 0x0C, 36983 - 19968: jis0208<<14 | 0x20<<7 | 0x0A, 36984 - 19968: jis0208<<14 | 0x20<<7 | 0x09, 36985 - 19968: jis0212<<14 | 0x40<<7 | 0x45, 36986 - 19968: jis0208<<14 | 0x0F<<7 | 0x43, 36988 - 19968: jis0208<<14 | 0x2D<<7 | 0x2A, 36989 - 19968: jis0208<<14 | 0x4D<<7 | 0x10, 36991 - 19968: jis0208<<14 | 0x27<<7 | 0x51, 36992 - 19968: jis0208<<14 | 0x4D<<7 | 0x12, 36993 - 19968: jis0208<<14 | 0x4D<<7 | 0x11, 36994 - 19968: jis0208<<14 | 0x4D<<7 | 0x0F, 36995 - 19968: jis0208<<14 | 0x42<<7 | 0x43, 36996 - 19968: jis0208<<14 | 0x13<<7 | 0x33, 36997 - 19968: jis0212<<14 | 0x40<<7 | 0x46, 36999 - 19968: jis0208<<14 | 0x4C<<7 | 0x4D, 37000 - 19968: jis0212<<14 | 0x40<<7 | 0x47, 37001 - 19968: jis0208<<14 | 0x4D<<7 | 0x14, 37002 - 19968: jis0208<<14 | 0x4D<<7 | 0x13, 37003 - 19968: jis0212<<14 | 0x40<<7 | 0x48, 37004 - 19968: jis0212<<14 | 0x40<<7 | 0x49, 37006 - 19968: jis0212<<14 | 0x40<<7 | 0x4A, 37007 - 19968: jis0208<<14 | 0x4D<<7 | 0x15, 37008 - 19968: jis0212<<14 | 0x40<<7 | 0x4B, 37009 - 19968: jis0208<<14 | 0x2C<<7 | 0x17, 37013 - 19968: jis0212<<14 | 0x40<<7 | 0x4C, 37015 - 19968: jis0212<<14 | 0x40<<7 | 0x4D, 37016 - 19968: jis0212<<14 | 0x40<<7 | 0x4E, 37017 - 19968: jis0212<<14 | 0x40<<7 | 0x4F, 37019 - 19968: jis0212<<14 | 0x40<<7 | 0x50, 37024 - 19968: jis0212<<14 | 0x40<<7 | 0x51, 37025 - 19968: jis0212<<14 | 0x40<<7 | 0x52, 37026 - 19968: jis0212<<14 | 0x40<<7 | 0x53, 37027 - 19968: jis0208<<14 | 0x25<<7 | 0x40, 37029 - 19968: jis0212<<14 | 0x40<<7 | 0x54, 37030 - 19968: jis0208<<14 | 0x2A<<7 | 0x0D, 37032 - 19968: jis0208<<14 | 0x4D<<7 | 0x16, 37034 - 19968: jis0208<<14 | 0x1B<<7 | 0x38, 37039 - 19968: jis0208<<14 | 0x4D<<7 | 0x17, 37040 - 19968: jis0212<<14 | 0x40<<7 | 0x55, 37041 - 19968: jis0208<<14 | 0x4D<<7 | 0x18, 37042 - 19968: jis0212<<14 | 0x40<<7 | 0x56, 37043 - 19968: jis0212<<14 | 0x40<<7 | 0x57, 37044 - 19968: jis0212<<14 | 0x40<<7 | 0x58, 37045 - 19968: jis0208<<14 | 0x4D<<7 | 0x19, 37046 - 19968: jis0212<<14 | 0x40<<7 | 0x59, 37048 - 19968: jis0208<<14 | 0x24<<7 | 0x00, 37053 - 19968: jis0212<<14 | 0x40<<7 | 0x5A, 37054 - 19968: jis0212<<14 | 0x40<<7 | 0x5C, 37057 - 19968: jis0208<<14 | 0x0F<<7 | 0x49, 37059 - 19968: jis0212<<14 | 0x40<<7 | 0x5D, 37060 - 19968: jis0212<<14 | 0x41<<7 | 0x00, 37061 - 19968: jis0212<<14 | 0x41<<7 | 0x01, 37063 - 19968: jis0212<<14 | 0x41<<7 | 0x02, 37064 - 19968: jis0212<<14 | 0x41<<7 | 0x03, 37066 - 19968: jis0208<<14 | 0x18<<7 | 0x38, 37068 - 19968: jis0212<<14 | 0x40<<7 | 0x5B, 37070 - 19968: jis0208<<14 | 0x2E<<7 | 0x19, 37074 - 19968: jis0212<<14 | 0x41<<7 | 0x0C, 37077 - 19968: jis0212<<14 | 0x41<<7 | 0x04, 37079 - 19968: jis0212<<14 | 0x41<<7 | 0x05, 37080 - 19968: jis0212<<14 | 0x41<<7 | 0x06, 37081 - 19968: jis0212<<14 | 0x41<<7 | 0x07, 37083 - 19968: jis0208<<14 | 0x4D<<7 | 0x1D, 37084 - 19968: jis0212<<14 | 0x41<<7 | 0x08, 37085 - 19968: jis0212<<14 | 0x41<<7 | 0x09, 37086 - 19968: jis0208<<14 | 0x5A<<7 | 0x59, 37087 - 19968: jis0212<<14 | 0x41<<7 | 0x0A, 37089 - 19968: jis0208<<14 | 0x16<<7 | 0x13, 37090 - 19968: jis0208<<14 | 0x4D<<7 | 0x1A, 37092 - 19968: jis0208<<14 | 0x4D<<7 | 0x1B, 37093 - 19968: jis0212<<14 | 0x41<<7 | 0x0B, 37096 - 19968: jis0208<<14 | 0x28<<7 | 0x53, 37099 - 19968: jis0212<<14 | 0x41<<7 | 0x0E, 37101 - 19968: jis0208<<14 | 0x12<<7 | 0x33, 37103 - 19968: jis0212<<14 | 0x41<<7 | 0x0F, 37104 - 19968: jis0212<<14 | 0x41<<7 | 0x10, 37108 - 19968: jis0212<<14 | 0x41<<7 | 0x11, 37109 - 19968: jis0208<<14 | 0x2C<<7 | 0x18, 37110 - 19968: jis0212<<14 | 0x41<<7 | 0x0D, 37111 - 19968: jis0208<<14 | 0x15<<7 | 0x1E, 37117 - 19968: jis0208<<14 | 0x24<<7 | 0x33, 37118 - 19968: jis0212<<14 | 0x41<<7 | 0x12, 37119 - 19968: jis0212<<14 | 0x41<<7 | 0x13, 37120 - 19968: jis0212<<14 | 0x41<<7 | 0x14, 37122 - 19968: jis0208<<14 | 0x4D<<7 | 0x1E, 37124 - 19968: jis0212<<14 | 0x41<<7 | 0x15, 37125 - 19968: jis0212<<14 | 0x41<<7 | 0x16, 37126 - 19968: jis0212<<14 | 0x41<<7 | 0x17, 37128 - 19968: jis0212<<14 | 0x41<<7 | 0x18, 37133 - 19968: jis0212<<14 | 0x41<<7 | 0x19, 37136 - 19968: jis0212<<14 | 0x41<<7 | 0x1A, 37138 - 19968: jis0208<<14 | 0x4D<<7 | 0x1F, 37140 - 19968: jis0212<<14 | 0x41<<7 | 0x1B, 37141 - 19968: jis0208<<14 | 0x5A<<7 | 0x5B, 37142 - 19968: jis0212<<14 | 0x41<<7 | 0x1C, 37143 - 19968: jis0212<<14 | 0x41<<7 | 0x1D, 37144 - 19968: jis0212<<14 | 0x41<<7 | 0x1E, 37145 - 19968: jis0208<<14 | 0x4D<<7 | 0x20, 37146 - 19968: jis0212<<14 | 0x41<<7 | 0x1F, 37148 - 19968: jis0212<<14 | 0x41<<7 | 0x20, 37150 - 19968: jis0212<<14 | 0x41<<7 | 0x21, 37152 - 19968: jis0212<<14 | 0x41<<7 | 0x22, 37154 - 19968: jis0212<<14 | 0x41<<7 | 0x24, 37155 - 19968: jis0212<<14 | 0x41<<7 | 0x25, 37157 - 19968: jis0212<<14 | 0x41<<7 | 0x23, 37159 - 19968: jis0208<<14 | 0x5A<<7 | 0x5C, 37161 - 19968: jis0212<<14 | 0x41<<7 | 0x27, 37165 - 19968: jis0208<<14 | 0x24<<7 | 0x01, 37166 - 19968: jis0212<<14 | 0x41<<7 | 0x28, 37167 - 19968: jis0212<<14 | 0x41<<7 | 0x29, 37168 - 19968: jis0208<<14 | 0x4D<<7 | 0x22, 37169 - 19968: jis0212<<14 | 0x41<<7 | 0x2A, 37170 - 19968: jis0208<<14 | 0x4D<<7 | 0x21, 37172 - 19968: jis0212<<14 | 0x41<<7 | 0x2B, 37174 - 19968: jis0212<<14 | 0x41<<7 | 0x2C, 37175 - 19968: jis0212<<14 | 0x41<<7 | 0x2D, 37177 - 19968: jis0212<<14 | 0x41<<7 | 0x2E, 37178 - 19968: jis0212<<14 | 0x41<<7 | 0x2F, 37180 - 19968: jis0212<<14 | 0x41<<7 | 0x30, 37181 - 19968: jis0212<<14 | 0x41<<7 | 0x31, 37187 - 19968: jis0212<<14 | 0x41<<7 | 0x32, 37191 - 19968: jis0212<<14 | 0x41<<7 | 0x33, 37192 - 19968: jis0212<<14 | 0x41<<7 | 0x34, 37193 - 19968: jis0208<<14 | 0x25<<7 | 0x32, 37194 - 19968: jis0208<<14 | 0x4D<<7 | 0x23, 37195 - 19968: jis0208<<14 | 0x1C<<7 | 0x15, 37196 - 19968: jis0208<<14 | 0x1B<<7 | 0x3F, 37197 - 19968: jis0208<<14 | 0x26<<7 | 0x3A, 37198 - 19968: jis0208<<14 | 0x22<<7 | 0x50, 37199 - 19968: jis0212<<14 | 0x41<<7 | 0x35, 37202 - 19968: jis0208<<14 | 0x1B<<7 | 0x51, 37203 - 19968: jis0212<<14 | 0x41<<7 | 0x36, 37204 - 19968: jis0208<<14 | 0x1E<<7 | 0x4B, 37206 - 19968: jis0208<<14 | 0x4D<<7 | 0x24, 37207 - 19968: jis0212<<14 | 0x41<<7 | 0x37, 37208 - 19968: jis0208<<14 | 0x4D<<7 | 0x25, 37209 - 19968: jis0212<<14 | 0x41<<7 | 0x38, 37210 - 19968: jis0212<<14 | 0x41<<7 | 0x39, 37211 - 19968: jis0212<<14 | 0x41<<7 | 0x3A, 37217 - 19968: jis0212<<14 | 0x41<<7 | 0x3B, 37218 - 19968: jis0208<<14 | 0x1E<<7 | 0x3C, 37219 - 19968: jis0208<<14 | 0x4D<<7 | 0x26, 37220 - 19968: jis0212<<14 | 0x41<<7 | 0x3C, 37221 - 19968: jis0208<<14 | 0x4D<<7 | 0x27, 37223 - 19968: jis0212<<14 | 0x41<<7 | 0x3D, 37225 - 19968: jis0208<<14 | 0x4D<<7 | 0x28, 37226 - 19968: jis0208<<14 | 0x2C<<7 | 0x4E, 37228 - 19968: jis0208<<14 | 0x1C<<7 | 0x16, 37229 - 19968: jis0212<<14 | 0x41<<7 | 0x3E, 37234 - 19968: jis0208<<14 | 0x4D<<7 | 0x2A, 37235 - 19968: jis0208<<14 | 0x4D<<7 | 0x29, 37236 - 19968: jis0212<<14 | 0x41<<7 | 0x3F, 37237 - 19968: jis0208<<14 | 0x18<<7 | 0x39, 37239 - 19968: jis0208<<14 | 0x18<<7 | 0x52, 37240 - 19968: jis0208<<14 | 0x1A<<7 | 0x1F, 37241 - 19968: jis0212<<14 | 0x41<<7 | 0x40, 37242 - 19968: jis0212<<14 | 0x41<<7 | 0x41, 37243 - 19968: jis0212<<14 | 0x41<<7 | 0x42, 37249 - 19968: jis0212<<14 | 0x41<<7 | 0x43, 37250 - 19968: jis0208<<14 | 0x4D<<7 | 0x2D, 37251 - 19968: jis0212<<14 | 0x41<<7 | 0x44, 37253 - 19968: jis0212<<14 | 0x41<<7 | 0x45, 37254 - 19968: jis0212<<14 | 0x41<<7 | 0x46, 37255 - 19968: jis0208<<14 | 0x1C<<7 | 0x45, 37257 - 19968: jis0208<<14 | 0x4D<<7 | 0x2C, 37258 - 19968: jis0212<<14 | 0x41<<7 | 0x47, 37259 - 19968: jis0208<<14 | 0x4D<<7 | 0x2B, 37261 - 19968: jis0208<<14 | 0x21<<7 | 0x48, 37262 - 19968: jis0212<<14 | 0x41<<7 | 0x48, 37264 - 19968: jis0208<<14 | 0x17<<7 | 0x4E, 37265 - 19968: jis0212<<14 | 0x41<<7 | 0x49, 37266 - 19968: jis0208<<14 | 0x1F<<7 | 0x22, 37267 - 19968: jis0212<<14 | 0x41<<7 | 0x4A, 37268 - 19968: jis0212<<14 | 0x41<<7 | 0x4B, 37269 - 19968: jis0212<<14 | 0x41<<7 | 0x4C, 37271 - 19968: jis0208<<14 | 0x27<<7 | 0x0F, 37272 - 19968: jis0212<<14 | 0x41<<7 | 0x4D, 37276 - 19968: jis0208<<14 | 0x1C<<7 | 0x18, 37278 - 19968: jis0212<<14 | 0x41<<7 | 0x4E, 37281 - 19968: jis0212<<14 | 0x41<<7 | 0x4F, 37282 - 19968: jis0208<<14 | 0x4D<<7 | 0x2E, 37284 - 19968: jis0208<<14 | 0x1D<<7 | 0x3E, 37286 - 19968: jis0212<<14 | 0x41<<7 | 0x50, 37288 - 19968: jis0212<<14 | 0x41<<7 | 0x51, 37290 - 19968: jis0208<<14 | 0x4D<<7 | 0x31, 37291 - 19968: jis0208<<14 | 0x4D<<7 | 0x2F, 37292 - 19968: jis0212<<14 | 0x41<<7 | 0x52, 37293 - 19968: jis0212<<14 | 0x41<<7 | 0x53, 37294 - 19968: jis0212<<14 | 0x41<<7 | 0x54, 37295 - 19968: jis0208<<14 | 0x4D<<7 | 0x30, 37296 - 19968: jis0212<<14 | 0x41<<7 | 0x55, 37297 - 19968: jis0212<<14 | 0x41<<7 | 0x56, 37298 - 19968: jis0212<<14 | 0x41<<7 | 0x57, 37299 - 19968: jis0212<<14 | 0x41<<7 | 0x58, 37300 - 19968: jis0208<<14 | 0x4D<<7 | 0x33, 37301 - 19968: jis0208<<14 | 0x4D<<7 | 0x32, 37302 - 19968: jis0212<<14 | 0x41<<7 | 0x59, 37304 - 19968: jis0208<<14 | 0x1D<<7 | 0x59, 37306 - 19968: jis0208<<14 | 0x4D<<7 | 0x34, 37307 - 19968: jis0212<<14 | 0x41<<7 | 0x5A, 37308 - 19968: jis0212<<14 | 0x41<<7 | 0x5B, 37309 - 19968: jis0212<<14 | 0x41<<7 | 0x5C, 37311 - 19968: jis0212<<14 | 0x41<<7 | 0x5D, 37312 - 19968: jis0208<<14 | 0x4D<<7 | 0x35, 37313 - 19968: jis0208<<14 | 0x4D<<7 | 0x36, 37314 - 19968: jis0212<<14 | 0x42<<7 | 0x00, 37315 - 19968: jis0212<<14 | 0x42<<7 | 0x01, 37317 - 19968: jis0212<<14 | 0x42<<7 | 0x02, 37318 - 19968: jis0208<<14 | 0x27<<7 | 0x2F, 37319 - 19968: jis0208<<14 | 0x19<<7 | 0x32, 37320 - 19968: jis0208<<14 | 0x1B<<7 | 0x40, 37321 - 19968: jis0208<<14 | 0x4D<<7 | 0x37, 37323 - 19968: jis0208<<14 | 0x4D<<7 | 0x38, 37324 - 19968: jis0208<<14 | 0x2D<<7 | 0x03, 37325 - 19968: jis0208<<14 | 0x1C<<7 | 0x24, 37326 - 19968: jis0208<<14 | 0x2B<<7 | 0x4D, 37327 - 19968: jis0208<<14 | 0x2D<<7 | 0x2B, 37328 - 19968: jis0208<<14 | 0x4D<<7 | 0x39, 37329 - 19968: jis0208<<14 | 0x15<<7 | 0x41, 37331 - 19968: jis0212<<14 | 0x42<<7 | 0x03, 37332 - 19968: jis0212<<14 | 0x42<<7 | 0x04, 37334 - 19968: jis0208<<14 | 0x4D<<7 | 0x3A, 37335 - 19968: jis0208<<14 | 0x5B<<7 | 0x00, 37336 - 19968: jis0208<<14 | 0x24<<7 | 0x02, 37337 - 19968: jis0212<<14 | 0x42<<7 | 0x06, 37338 - 19968: jis0208<<14 | 0x5A<<7 | 0x5D, 37339 - 19968: jis0208<<14 | 0x4D<<7 | 0x3D, 37340 - 19968: jis0208<<14 | 0x12<<7 | 0x57, 37341 - 19968: jis0208<<14 | 0x1E<<7 | 0x2A, 37342 - 19968: jis0208<<14 | 0x5B<<7 | 0x01, 37343 - 19968: jis0208<<14 | 0x4D<<7 | 0x3B, 37345 - 19968: jis0208<<14 | 0x4D<<7 | 0x3C, 37347 - 19968: jis0208<<14 | 0x23<<7 | 0x3F, 37348 - 19968: jis0208<<14 | 0x5B<<7 | 0x04, 37349 - 19968: jis0208<<14 | 0x5B<<7 | 0x05, 37350 - 19968: jis0208<<14 | 0x2A<<7 | 0x34, 37351 - 19968: jis0208<<14 | 0x15<<7 | 0x5B, 37353 - 19968: jis0212<<14 | 0x42<<7 | 0x0B, 37354 - 19968: jis0212<<14 | 0x42<<7 | 0x0C, 37356 - 19968: jis0212<<14 | 0x42<<7 | 0x0D, 37357 - 19968: jis0208<<14 | 0x5B<<7 | 0x02, 37358 - 19968: jis0208<<14 | 0x5B<<7 | 0x03, 37359 - 19968: jis0212<<14 | 0x42<<7 | 0x10, 37360 - 19968: jis0212<<14 | 0x42<<7 | 0x11, 37361 - 19968: jis0212<<14 | 0x42<<7 | 0x12, 37365 - 19968: jis0208<<14 | 0x4D<<7 | 0x3F, 37366 - 19968: jis0208<<14 | 0x4D<<7 | 0x40, 37367 - 19968: jis0212<<14 | 0x42<<7 | 0x13, 37369 - 19968: jis0212<<14 | 0x42<<7 | 0x14, 37371 - 19968: jis0212<<14 | 0x42<<7 | 0x15, 37372 - 19968: jis0208<<14 | 0x4D<<7 | 0x3E, 37373 - 19968: jis0212<<14 | 0x42<<7 | 0x16, 37375 - 19968: jis0208<<14 | 0x4D<<7 | 0x42, 37376 - 19968: jis0212<<14 | 0x42<<7 | 0x17, 37377 - 19968: jis0212<<14 | 0x42<<7 | 0x18, 37380 - 19968: jis0212<<14 | 0x42<<7 | 0x19, 37381 - 19968: jis0212<<14 | 0x42<<7 | 0x1A, 37382 - 19968: jis0208<<14 | 0x5B<<7 | 0x06, 37383 - 19968: jis0212<<14 | 0x42<<7 | 0x1C, 37385 - 19968: jis0212<<14 | 0x42<<7 | 0x1D, 37386 - 19968: jis0208<<14 | 0x5B<<7 | 0x08, 37388 - 19968: jis0212<<14 | 0x42<<7 | 0x1F, 37389 - 19968: jis0208<<14 | 0x25<<7 | 0x3E, 37390 - 19968: jis0208<<14 | 0x12<<7 | 0x22, 37392 - 19968: jis0208<<14 | 0x5B<<7 | 0x07, 37393 - 19968: jis0208<<14 | 0x4D<<7 | 0x46, 37394 - 19968: jis0212<<14 | 0x42<<7 | 0x21, 37395 - 19968: jis0212<<14 | 0x42<<7 | 0x22, 37396 - 19968: jis0208<<14 | 0x4D<<7 | 0x43, 37397 - 19968: jis0208<<14 | 0x4D<<7 | 0x45, 37398 - 19968: jis0212<<14 | 0x42<<7 | 0x23, 37400 - 19968: jis0212<<14 | 0x42<<7 | 0x24, 37404 - 19968: jis0212<<14 | 0x42<<7 | 0x25, 37405 - 19968: jis0212<<14 | 0x42<<7 | 0x26, 37406 - 19968: jis0208<<14 | 0x4D<<7 | 0x41, 37411 - 19968: jis0212<<14 | 0x42<<7 | 0x27, 37412 - 19968: jis0212<<14 | 0x42<<7 | 0x28, 37413 - 19968: jis0212<<14 | 0x42<<7 | 0x29, 37414 - 19968: jis0212<<14 | 0x42<<7 | 0x2A, 37416 - 19968: jis0212<<14 | 0x42<<7 | 0x2B, 37417 - 19968: jis0208<<14 | 0x4E<<7 | 0x2E, 37420 - 19968: jis0208<<14 | 0x4D<<7 | 0x44, 37422 - 19968: jis0212<<14 | 0x42<<7 | 0x2C, 37423 - 19968: jis0212<<14 | 0x42<<7 | 0x2D, 37424 - 19968: jis0212<<14 | 0x42<<7 | 0x2E, 37427 - 19968: jis0212<<14 | 0x42<<7 | 0x2F, 37428 - 19968: jis0208<<14 | 0x2D<<7 | 0x4A, 37429 - 19968: jis0212<<14 | 0x42<<7 | 0x30, 37430 - 19968: jis0212<<14 | 0x42<<7 | 0x31, 37431 - 19968: jis0208<<14 | 0x17<<7 | 0x39, 37432 - 19968: jis0212<<14 | 0x42<<7 | 0x32, 37433 - 19968: jis0208<<14 | 0x5B<<7 | 0x0F, 37434 - 19968: jis0208<<14 | 0x5B<<7 | 0x09, 37436 - 19968: jis0208<<14 | 0x5B<<7 | 0x0B, 37438 - 19968: jis0212<<14 | 0x42<<7 | 0x36, 37439 - 19968: jis0208<<14 | 0x4D<<7 | 0x4E, 37440 - 19968: jis0208<<14 | 0x5B<<7 | 0x0A, 37442 - 19968: jis0212<<14 | 0x42<<7 | 0x38, 37443 - 19968: jis0212<<14 | 0x42<<7 | 0x39, 37444 - 19968: jis0208<<14 | 0x24<<7 | 0x13, 37445 - 19968: jis0208<<14 | 0x4D<<7 | 0x49, 37446 - 19968: jis0212<<14 | 0x42<<7 | 0x3A, 37447 - 19968: jis0212<<14 | 0x42<<7 | 0x3B, 37448 - 19968: jis0208<<14 | 0x4D<<7 | 0x4C, 37449 - 19968: jis0208<<14 | 0x4D<<7 | 0x4A, 37450 - 19968: jis0212<<14 | 0x42<<7 | 0x3C, 37451 - 19968: jis0208<<14 | 0x4D<<7 | 0x4F, 37453 - 19968: jis0212<<14 | 0x42<<7 | 0x3D, 37454 - 19968: jis0208<<14 | 0x5B<<7 | 0x0C, 37455 - 19968: jis0212<<14 | 0x42<<7 | 0x3F, 37456 - 19968: jis0208<<14 | 0x4D<<7 | 0x50, 37457 - 19968: jis0208<<14 | 0x5B<<7 | 0x0E, 37463 - 19968: jis0208<<14 | 0x4D<<7 | 0x48, 37464 - 19968: jis0212<<14 | 0x42<<7 | 0x41, 37465 - 19968: jis0208<<14 | 0x5B<<7 | 0x0D, 37466 - 19968: jis0208<<14 | 0x4D<<7 | 0x55, 37467 - 19968: jis0208<<14 | 0x10<<7 | 0x53, 37468 - 19968: jis0212<<14 | 0x42<<7 | 0x43, 37469 - 19968: jis0212<<14 | 0x42<<7 | 0x44, 37470 - 19968: jis0208<<14 | 0x4D<<7 | 0x47, 37472 - 19968: jis0212<<14 | 0x42<<7 | 0x45, 37473 - 19968: jis0212<<14 | 0x42<<7 | 0x46, 37474 - 19968: jis0208<<14 | 0x27<<7 | 0x0C, 37476 - 19968: jis0208<<14 | 0x4D<<7 | 0x4B, 37477 - 19968: jis0212<<14 | 0x42<<7 | 0x47, 37478 - 19968: jis0208<<14 | 0x1D<<7 | 0x3F, 37479 - 19968: jis0208<<14 | 0x5B<<7 | 0x10, 37480 - 19968: jis0212<<14 | 0x42<<7 | 0x49, 37481 - 19968: jis0212<<14 | 0x42<<7 | 0x4A, 37486 - 19968: jis0212<<14 | 0x42<<7 | 0x4B, 37487 - 19968: jis0212<<14 | 0x42<<7 | 0x4C, 37488 - 19968: jis0212<<14 | 0x42<<7 | 0x4D, 37489 - 19968: jis0208<<14 | 0x18<<7 | 0x3A, 37493 - 19968: jis0212<<14 | 0x42<<7 | 0x4E, 37494 - 19968: jis0212<<14 | 0x42<<7 | 0x4F, 37495 - 19968: jis0208<<14 | 0x5B<<7 | 0x12, 37496 - 19968: jis0208<<14 | 0x5B<<7 | 0x13, 37497 - 19968: jis0212<<14 | 0x42<<7 | 0x52, 37499 - 19968: jis0212<<14 | 0x42<<7 | 0x53, 37500 - 19968: jis0212<<14 | 0x42<<7 | 0x54, 37501 - 19968: jis0212<<14 | 0x42<<7 | 0x55, 37502 - 19968: jis0208<<14 | 0x2A<<7 | 0x27, 37503 - 19968: jis0212<<14 | 0x42<<7 | 0x56, 37504 - 19968: jis0208<<14 | 0x15<<7 | 0x43, 37507 - 19968: jis0208<<14 | 0x1C<<7 | 0x25, 37509 - 19968: jis0208<<14 | 0x25<<7 | 0x1B, 37512 - 19968: jis0208<<14 | 0x58<<7 | 0x03, 37513 - 19968: jis0212<<14 | 0x42<<7 | 0x58, 37514 - 19968: jis0212<<14 | 0x42<<7 | 0x59, 37517 - 19968: jis0212<<14 | 0x42<<7 | 0x5A, 37518 - 19968: jis0212<<14 | 0x42<<7 | 0x5B, 37521 - 19968: jis0208<<14 | 0x20<<7 | 0x0C, 37522 - 19968: jis0212<<14 | 0x42<<7 | 0x5C, 37523 - 19968: jis0208<<14 | 0x4D<<7 | 0x53, 37525 - 19968: jis0208<<14 | 0x4D<<7 | 0x4D, 37526 - 19968: jis0208<<14 | 0x4D<<7 | 0x52, 37527 - 19968: jis0212<<14 | 0x42<<7 | 0x5D, 37528 - 19968: jis0208<<14 | 0x2B<<7 | 0x22, 37529 - 19968: jis0212<<14 | 0x43<<7 | 0x00, 37530 - 19968: jis0208<<14 | 0x23<<7 | 0x17, 37531 - 19968: jis0208<<14 | 0x4D<<7 | 0x54, 37532 - 19968: jis0208<<14 | 0x4D<<7 | 0x51, 37535 - 19968: jis0212<<14 | 0x43<<7 | 0x01, 37536 - 19968: jis0212<<14 | 0x43<<7 | 0x02, 37540 - 19968: jis0212<<14 | 0x43<<7 | 0x03, 37541 - 19968: jis0212<<14 | 0x43<<7 | 0x04, 37543 - 19968: jis0208<<14 | 0x5B<<7 | 0x11, 37544 - 19968: jis0212<<14 | 0x43<<7 | 0x06, 37547 - 19968: jis0212<<14 | 0x43<<7 | 0x07, 37549 - 19968: jis0208<<14 | 0x20<<7 | 0x0B, 37551 - 19968: jis0212<<14 | 0x43<<7 | 0x08, 37554 - 19968: jis0212<<14 | 0x43<<7 | 0x09, 37558 - 19968: jis0212<<14 | 0x43<<7 | 0x0A, 37559 - 19968: jis0208<<14 | 0x4D<<7 | 0x58, 37560 - 19968: jis0212<<14 | 0x43<<7 | 0x0B, 37561 - 19968: jis0208<<14 | 0x4D<<7 | 0x57, 37562 - 19968: jis0212<<14 | 0x43<<7 | 0x0C, 37563 - 19968: jis0212<<14 | 0x43<<7 | 0x0D, 37564 - 19968: jis0212<<14 | 0x43<<7 | 0x0E, 37565 - 19968: jis0212<<14 | 0x43<<7 | 0x0F, 37567 - 19968: jis0212<<14 | 0x43<<7 | 0x10, 37568 - 19968: jis0212<<14 | 0x43<<7 | 0x11, 37569 - 19968: jis0212<<14 | 0x43<<7 | 0x12, 37570 - 19968: jis0212<<14 | 0x43<<7 | 0x13, 37571 - 19968: jis0212<<14 | 0x43<<7 | 0x14, 37573 - 19968: jis0212<<14 | 0x43<<7 | 0x15, 37574 - 19968: jis0212<<14 | 0x43<<7 | 0x16, 37575 - 19968: jis0212<<14 | 0x43<<7 | 0x17, 37576 - 19968: jis0212<<14 | 0x43<<7 | 0x18, 37579 - 19968: jis0212<<14 | 0x43<<7 | 0x19, 37580 - 19968: jis0212<<14 | 0x43<<7 | 0x1A, 37581 - 19968: jis0212<<14 | 0x43<<7 | 0x1B, 37582 - 19968: jis0212<<14 | 0x43<<7 | 0x1C, 37583 - 19968: jis0208<<14 | 0x4D<<7 | 0x56, 37584 - 19968: jis0208<<14 | 0x5B<<7 | 0x17, 37586 - 19968: jis0208<<14 | 0x2A<<7 | 0x0E, 37587 - 19968: jis0208<<14 | 0x5B<<7 | 0x1B, 37589 - 19968: jis0208<<14 | 0x5B<<7 | 0x19, 37591 - 19968: jis0208<<14 | 0x5B<<7 | 0x15, 37592 - 19968: jis0212<<14 | 0x43<<7 | 0x21, 37593 - 19968: jis0208<<14 | 0x5B<<7 | 0x16, 37596 - 19968: jis0212<<14 | 0x43<<7 | 0x23, 37597 - 19968: jis0212<<14 | 0x43<<7 | 0x24, 37599 - 19968: jis0212<<14 | 0x43<<7 | 0x25, 37600 - 19968: jis0208<<14 | 0x5B<<7 | 0x1A, 37601 - 19968: jis0212<<14 | 0x43<<7 | 0x27, 37603 - 19968: jis0212<<14 | 0x43<<7 | 0x28, 37604 - 19968: jis0208<<14 | 0x1C<<7 | 0x5A, 37605 - 19968: jis0212<<14 | 0x43<<7 | 0x29, 37607 - 19968: jis0208<<14 | 0x5B<<7 | 0x14, 37608 - 19968: jis0212<<14 | 0x43<<7 | 0x2B, 37609 - 19968: jis0208<<14 | 0x4D<<7 | 0x59, 37610 - 19968: jis0208<<14 | 0x29<<7 | 0x3E, 37612 - 19968: jis0212<<14 | 0x43<<7 | 0x2C, 37613 - 19968: jis0208<<14 | 0x10<<7 | 0x33, 37614 - 19968: jis0212<<14 | 0x43<<7 | 0x2D, 37616 - 19968: jis0212<<14 | 0x43<<7 | 0x2E, 37618 - 19968: jis0208<<14 | 0x28<<7 | 0x25, 37619 - 19968: jis0208<<14 | 0x22<<7 | 0x51, 37624 - 19968: jis0208<<14 | 0x14<<7 | 0x57, 37625 - 19968: jis0208<<14 | 0x58<<7 | 0x09, 37626 - 19968: jis0208<<14 | 0x4D<<7 | 0x5B, 37627 - 19968: jis0208<<14 | 0x5B<<7 | 0x1E, 37628 - 19968: jis0208<<14 | 0x18<<7 | 0x3C, 37631 - 19968: jis0208<<14 | 0x5B<<7 | 0x21, 37632 - 19968: jis0212<<14 | 0x43<<7 | 0x32, 37634 - 19968: jis0208<<14 | 0x5B<<7 | 0x23, 37638 - 19968: jis0208<<14 | 0x1A<<7 | 0x0B, 37640 - 19968: jis0212<<14 | 0x43<<7 | 0x34, 37645 - 19968: jis0212<<14 | 0x43<<7 | 0x35, 37647 - 19968: jis0208<<14 | 0x4D<<7 | 0x5A, 37648 - 19968: jis0208<<14 | 0x1E<<7 | 0x4C, 37649 - 19968: jis0212<<14 | 0x43<<7 | 0x36, 37652 - 19968: jis0212<<14 | 0x43<<7 | 0x37, 37653 - 19968: jis0212<<14 | 0x43<<7 | 0x38, 37656 - 19968: jis0208<<14 | 0x1E<<7 | 0x4D, 37657 - 19968: jis0208<<14 | 0x4E<<7 | 0x00, 37658 - 19968: jis0208<<14 | 0x4E<<7 | 0x02, 37660 - 19968: jis0212<<14 | 0x43<<7 | 0x39, 37661 - 19968: jis0208<<14 | 0x5B<<7 | 0x22, 37662 - 19968: jis0208<<14 | 0x5B<<7 | 0x20, 37663 - 19968: jis0212<<14 | 0x43<<7 | 0x3C, 37664 - 19968: jis0208<<14 | 0x1D<<7 | 0x5A, 37665 - 19968: jis0208<<14 | 0x5B<<7 | 0x1D, 37666 - 19968: jis0208<<14 | 0x4E<<7 | 0x01, 37667 - 19968: jis0208<<14 | 0x4E<<7 | 0x03, 37668 - 19968: jis0212<<14 | 0x43<<7 | 0x3E, 37669 - 19968: jis0208<<14 | 0x5B<<7 | 0x1C, 37670 - 19968: jis0208<<14 | 0x15<<7 | 0x32, 37671 - 19968: jis0212<<14 | 0x43<<7 | 0x40, 37672 - 19968: jis0208<<14 | 0x28<<7 | 0x24, 37673 - 19968: jis0212<<14 | 0x43<<7 | 0x41, 37674 - 19968: jis0212<<14 | 0x43<<7 | 0x42, 37675 - 19968: jis0208<<14 | 0x1B<<7 | 0x41, 37676 - 19968: jis0208<<14 | 0x2E<<7 | 0x02, 37678 - 19968: jis0208<<14 | 0x4D<<7 | 0x5D, 37679 - 19968: jis0208<<14 | 0x19<<7 | 0x57, 37682 - 19968: jis0208<<14 | 0x2E<<7 | 0x1E, 37683 - 19968: jis0212<<14 | 0x43<<7 | 0x43, 37684 - 19968: jis0212<<14 | 0x43<<7 | 0x44, 37685 - 19968: jis0208<<14 | 0x4E<<7 | 0x05, 37686 - 19968: jis0212<<14 | 0x43<<7 | 0x45, 37687 - 19968: jis0212<<14 | 0x43<<7 | 0x46, 37690 - 19968: jis0208<<14 | 0x4E<<7 | 0x04, 37691 - 19968: jis0208<<14 | 0x4E<<7 | 0x06, 37700 - 19968: jis0208<<14 | 0x4D<<7 | 0x5C, 37703 - 19968: jis0212<<14 | 0x43<<7 | 0x47, 37704 - 19968: jis0208<<14 | 0x58<<7 | 0x02, 37705 - 19968: jis0212<<14 | 0x43<<7 | 0x49, 37707 - 19968: jis0208<<14 | 0x25<<7 | 0x48, 37709 - 19968: jis0208<<14 | 0x24<<7 | 0x34, 37712 - 19968: jis0212<<14 | 0x43<<7 | 0x4A, 37713 - 19968: jis0212<<14 | 0x43<<7 | 0x4B, 37714 - 19968: jis0212<<14 | 0x43<<7 | 0x4C, 37716 - 19968: jis0208<<14 | 0x23<<7 | 0x36, 37717 - 19968: jis0212<<14 | 0x43<<7 | 0x4D, 37718 - 19968: jis0208<<14 | 0x4E<<7 | 0x0B, 37719 - 19968: jis0208<<14 | 0x5B<<7 | 0x25, 37720 - 19968: jis0212<<14 | 0x43<<7 | 0x4F, 37722 - 19968: jis0212<<14 | 0x43<<7 | 0x50, 37723 - 19968: jis0208<<14 | 0x22<<7 | 0x22, 37724 - 19968: jis0208<<14 | 0x4E<<7 | 0x07, 37726 - 19968: jis0212<<14 | 0x43<<7 | 0x51, 37728 - 19968: jis0208<<14 | 0x4E<<7 | 0x08, 37732 - 19968: jis0212<<14 | 0x43<<7 | 0x52, 37733 - 19968: jis0212<<14 | 0x43<<7 | 0x53, 37735 - 19968: jis0212<<14 | 0x43<<7 | 0x54, 37737 - 19968: jis0212<<14 | 0x43<<7 | 0x55, 37738 - 19968: jis0212<<14 | 0x43<<7 | 0x56, 37740 - 19968: jis0208<<14 | 0x16<<7 | 0x0C, 37741 - 19968: jis0212<<14 | 0x43<<7 | 0x57, 37742 - 19968: jis0208<<14 | 0x4E<<7 | 0x0A, 37743 - 19968: jis0212<<14 | 0x43<<7 | 0x58, 37744 - 19968: jis0208<<14 | 0x5B<<7 | 0x24, 37745 - 19968: jis0212<<14 | 0x43<<7 | 0x5A, 37747 - 19968: jis0212<<14 | 0x43<<7 | 0x5B, 37748 - 19968: jis0212<<14 | 0x43<<7 | 0x5C, 37749 - 19968: jis0208<<14 | 0x17<<7 | 0x0F, 37750 - 19968: jis0212<<14 | 0x43<<7 | 0x5D, 37754 - 19968: jis0212<<14 | 0x44<<7 | 0x00, 37756 - 19968: jis0208<<14 | 0x4E<<7 | 0x09, 37757 - 19968: jis0212<<14 | 0x44<<7 | 0x01, 37758 - 19968: jis0208<<14 | 0x1D<<7 | 0x40, 37759 - 19968: jis0212<<14 | 0x44<<7 | 0x02, 37760 - 19968: jis0212<<14 | 0x44<<7 | 0x03, 37761 - 19968: jis0212<<14 | 0x44<<7 | 0x04, 37762 - 19968: jis0212<<14 | 0x44<<7 | 0x05, 37768 - 19968: jis0212<<14 | 0x44<<7 | 0x06, 37770 - 19968: jis0212<<14 | 0x44<<7 | 0x07, 37771 - 19968: jis0212<<14 | 0x44<<7 | 0x08, 37772 - 19968: jis0208<<14 | 0x12<<7 | 0x58, 37773 - 19968: jis0212<<14 | 0x44<<7 | 0x09, 37775 - 19968: jis0212<<14 | 0x44<<7 | 0x0A, 37778 - 19968: jis0212<<14 | 0x44<<7 | 0x0B, 37780 - 19968: jis0208<<14 | 0x4E<<7 | 0x0F, 37781 - 19968: jis0212<<14 | 0x44<<7 | 0x0C, 37782 - 19968: jis0208<<14 | 0x19<<7 | 0x1E, 37783 - 19968: jis0208<<14 | 0x20<<7 | 0x58, 37784 - 19968: jis0212<<14 | 0x44<<7 | 0x0D, 37786 - 19968: jis0208<<14 | 0x23<<7 | 0x29, 37787 - 19968: jis0212<<14 | 0x44<<7 | 0x0E, 37790 - 19968: jis0212<<14 | 0x44<<7 | 0x0F, 37793 - 19968: jis0212<<14 | 0x44<<7 | 0x10, 37795 - 19968: jis0212<<14 | 0x44<<7 | 0x11, 37796 - 19968: jis0208<<14 | 0x5B<<7 | 0x26, 37798 - 19968: jis0212<<14 | 0x44<<7 | 0x13, 37799 - 19968: jis0208<<14 | 0x12<<7 | 0x1A, 37800 - 19968: jis0212<<14 | 0x44<<7 | 0x14, 37801 - 19968: jis0212<<14 | 0x44<<7 | 0x1A, 37803 - 19968: jis0212<<14 | 0x44<<7 | 0x15, 37804 - 19968: jis0208<<14 | 0x4E<<7 | 0x0D, 37805 - 19968: jis0208<<14 | 0x4E<<7 | 0x0E, 37806 - 19968: jis0208<<14 | 0x23<<7 | 0x22, 37808 - 19968: jis0208<<14 | 0x4E<<7 | 0x0C, 37812 - 19968: jis0212<<14 | 0x44<<7 | 0x16, 37813 - 19968: jis0212<<14 | 0x44<<7 | 0x17, 37814 - 19968: jis0212<<14 | 0x44<<7 | 0x18, 37817 - 19968: jis0208<<14 | 0x4E<<7 | 0x10, 37818 - 19968: jis0212<<14 | 0x44<<7 | 0x19, 37825 - 19968: jis0212<<14 | 0x44<<7 | 0x1B, 37827 - 19968: jis0208<<14 | 0x4E<<7 | 0x16, 37828 - 19968: jis0212<<14 | 0x44<<7 | 0x1C, 37829 - 19968: jis0212<<14 | 0x44<<7 | 0x1D, 37830 - 19968: jis0208<<14 | 0x5B<<7 | 0x27, 37831 - 19968: jis0212<<14 | 0x44<<7 | 0x1F, 37832 - 19968: jis0208<<14 | 0x4E<<7 | 0x19, 37833 - 19968: jis0212<<14 | 0x44<<7 | 0x20, 37834 - 19968: jis0212<<14 | 0x44<<7 | 0x21, 37835 - 19968: jis0212<<14 | 0x44<<7 | 0x22, 37836 - 19968: jis0212<<14 | 0x44<<7 | 0x23, 37837 - 19968: jis0212<<14 | 0x44<<7 | 0x24, 37840 - 19968: jis0208<<14 | 0x4E<<7 | 0x18, 37841 - 19968: jis0208<<14 | 0x24<<7 | 0x0C, 37843 - 19968: jis0212<<14 | 0x44<<7 | 0x25, 37846 - 19968: jis0208<<14 | 0x4E<<7 | 0x11, 37847 - 19968: jis0208<<14 | 0x4E<<7 | 0x12, 37848 - 19968: jis0208<<14 | 0x4E<<7 | 0x15, 37849 - 19968: jis0212<<14 | 0x44<<7 | 0x26, 37852 - 19968: jis0212<<14 | 0x44<<7 | 0x27, 37853 - 19968: jis0208<<14 | 0x4E<<7 | 0x17, 37854 - 19968: jis0208<<14 | 0x5B<<7 | 0x28, 37855 - 19968: jis0212<<14 | 0x44<<7 | 0x29, 37857 - 19968: jis0208<<14 | 0x15<<7 | 0x1F, 37858 - 19968: jis0212<<14 | 0x44<<7 | 0x2A, 37860 - 19968: jis0208<<14 | 0x4E<<7 | 0x1A, 37861 - 19968: jis0208<<14 | 0x4E<<7 | 0x14, 37862 - 19968: jis0212<<14 | 0x44<<7 | 0x2B, 37863 - 19968: jis0212<<14 | 0x44<<7 | 0x2C, 37864 - 19968: jis0208<<14 | 0x4E<<7 | 0x13, 37879 - 19968: jis0212<<14 | 0x44<<7 | 0x2E, 37880 - 19968: jis0208<<14 | 0x5B<<7 | 0x29, 37881 - 19968: jis0212<<14 | 0x44<<7 | 0x2D, 37882 - 19968: jis0212<<14 | 0x44<<7 | 0x30, 37883 - 19968: jis0212<<14 | 0x44<<7 | 0x31, 37885 - 19968: jis0212<<14 | 0x44<<7 | 0x32, 37889 - 19968: jis0212<<14 | 0x44<<7 | 0x33, 37890 - 19968: jis0212<<14 | 0x44<<7 | 0x34, 37891 - 19968: jis0208<<14 | 0x4E<<7 | 0x1E, 37892 - 19968: jis0212<<14 | 0x44<<7 | 0x35, 37895 - 19968: jis0208<<14 | 0x4E<<7 | 0x1F, 37896 - 19968: jis0212<<14 | 0x44<<7 | 0x36, 37897 - 19968: jis0212<<14 | 0x44<<7 | 0x37, 37901 - 19968: jis0212<<14 | 0x44<<7 | 0x38, 37902 - 19968: jis0212<<14 | 0x44<<7 | 0x39, 37903 - 19968: jis0212<<14 | 0x44<<7 | 0x3A, 37904 - 19968: jis0208<<14 | 0x4E<<7 | 0x20, 37907 - 19968: jis0208<<14 | 0x4E<<7 | 0x1D, 37908 - 19968: jis0208<<14 | 0x4E<<7 | 0x1C, 37909 - 19968: jis0212<<14 | 0x44<<7 | 0x3B, 37910 - 19968: jis0212<<14 | 0x44<<7 | 0x3C, 37911 - 19968: jis0212<<14 | 0x44<<7 | 0x3D, 37912 - 19968: jis0208<<14 | 0x1D<<7 | 0x41, 37913 - 19968: jis0208<<14 | 0x25<<7 | 0x09, 37914 - 19968: jis0208<<14 | 0x4E<<7 | 0x1B, 37919 - 19968: jis0212<<14 | 0x44<<7 | 0x3E, 37921 - 19968: jis0208<<14 | 0x4E<<7 | 0x24, 37931 - 19968: jis0208<<14 | 0x4E<<7 | 0x22, 37934 - 19968: jis0212<<14 | 0x44<<7 | 0x3F, 37935 - 19968: jis0212<<14 | 0x44<<7 | 0x40, 37937 - 19968: jis0208<<14 | 0x5B<<7 | 0x2A, 37938 - 19968: jis0212<<14 | 0x44<<7 | 0x42, 37939 - 19968: jis0212<<14 | 0x44<<7 | 0x43, 37940 - 19968: jis0212<<14 | 0x44<<7 | 0x44, 37941 - 19968: jis0208<<14 | 0x4E<<7 | 0x23, 37942 - 19968: jis0208<<14 | 0x4E<<7 | 0x21, 37944 - 19968: jis0208<<14 | 0x21<<7 | 0x57, 37946 - 19968: jis0208<<14 | 0x4E<<7 | 0x25, 37947 - 19968: jis0212<<14 | 0x44<<7 | 0x45, 37949 - 19968: jis0212<<14 | 0x44<<7 | 0x47, 37951 - 19968: jis0212<<14 | 0x44<<7 | 0x46, 37953 - 19968: jis0208<<14 | 0x4E<<7 | 0x26, 37955 - 19968: jis0212<<14 | 0x44<<7 | 0x48, 37956 - 19968: jis0208<<14 | 0x4E<<7 | 0x28, 37957 - 19968: jis0208<<14 | 0x5B<<7 | 0x2B, 37960 - 19968: jis0208<<14 | 0x5B<<7 | 0x2C, 37962 - 19968: jis0212<<14 | 0x44<<7 | 0x4B, 37964 - 19968: jis0212<<14 | 0x44<<7 | 0x4C, 37969 - 19968: jis0208<<14 | 0x13<<7 | 0x34, 37970 - 19968: jis0208<<14 | 0x4E<<7 | 0x27, 37971 - 19968: jis0208<<14 | 0x2B<<7 | 0x59, 37973 - 19968: jis0212<<14 | 0x44<<7 | 0x4D, 37977 - 19968: jis0212<<14 | 0x44<<7 | 0x4E, 37978 - 19968: jis0208<<14 | 0x4E<<7 | 0x33, 37979 - 19968: jis0208<<14 | 0x4E<<7 | 0x29, 37980 - 19968: jis0212<<14 | 0x44<<7 | 0x4F, 37982 - 19968: jis0208<<14 | 0x4E<<7 | 0x2C, 37983 - 19968: jis0212<<14 | 0x44<<7 | 0x50, 37984 - 19968: jis0208<<14 | 0x4E<<7 | 0x2A, 37985 - 19968: jis0212<<14 | 0x44<<7 | 0x51, 37986 - 19968: jis0208<<14 | 0x4E<<7 | 0x2B, 37987 - 19968: jis0212<<14 | 0x44<<7 | 0x52, 37992 - 19968: jis0212<<14 | 0x44<<7 | 0x53, 37994 - 19968: jis0208<<14 | 0x4E<<7 | 0x2D, 37995 - 19968: jis0212<<14 | 0x44<<7 | 0x54, 37997 - 19968: jis0212<<14 | 0x44<<7 | 0x55, 37998 - 19968: jis0212<<14 | 0x44<<7 | 0x56, 37999 - 19968: jis0212<<14 | 0x44<<7 | 0x57, 38000 - 19968: jis0208<<14 | 0x4E<<7 | 0x2F, 38001 - 19968: jis0212<<14 | 0x44<<7 | 0x58, 38002 - 19968: jis0212<<14 | 0x44<<7 | 0x59, 38005 - 19968: jis0208<<14 | 0x4E<<7 | 0x30, 38007 - 19968: jis0208<<14 | 0x4E<<7 | 0x31, 38012 - 19968: jis0208<<14 | 0x4E<<7 | 0x34, 38013 - 19968: jis0208<<14 | 0x4E<<7 | 0x32, 38014 - 19968: jis0208<<14 | 0x4E<<7 | 0x35, 38015 - 19968: jis0208<<14 | 0x4E<<7 | 0x37, 38017 - 19968: jis0208<<14 | 0x4E<<7 | 0x36, 38019 - 19968: jis0212<<14 | 0x44<<7 | 0x5B, 38020 - 19968: jis0212<<14 | 0x44<<7 | 0x5A, 38263 - 19968: jis0208<<14 | 0x23<<7 | 0x18, 38264 - 19968: jis0212<<14 | 0x44<<7 | 0x5C, 38265 - 19968: jis0212<<14 | 0x44<<7 | 0x5D, 38270 - 19968: jis0212<<14 | 0x45<<7 | 0x00, 38272 - 19968: jis0208<<14 | 0x2B<<7 | 0x46, 38274 - 19968: jis0208<<14 | 0x4E<<7 | 0x38, 38275 - 19968: jis0208<<14 | 0x20<<7 | 0x0D, 38276 - 19968: jis0212<<14 | 0x45<<7 | 0x01, 38279 - 19968: jis0208<<14 | 0x4E<<7 | 0x39, 38280 - 19968: jis0212<<14 | 0x45<<7 | 0x02, 38281 - 19968: jis0208<<14 | 0x29<<7 | 0x23, 38282 - 19968: jis0208<<14 | 0x4E<<7 | 0x3A, 38283 - 19968: jis0208<<14 | 0x12<<7 | 0x0A, 38284 - 19968: jis0212<<14 | 0x45<<7 | 0x03, 38285 - 19968: jis0212<<14 | 0x45<<7 | 0x04, 38286 - 19968: jis0212<<14 | 0x45<<7 | 0x05, 38287 - 19968: jis0208<<14 | 0x10<<7 | 0x1B, 38289 - 19968: jis0208<<14 | 0x13<<7 | 0x36, 38290 - 19968: jis0208<<14 | 0x5B<<7 | 0x2D, 38291 - 19968: jis0208<<14 | 0x13<<7 | 0x35, 38292 - 19968: jis0208<<14 | 0x4E<<7 | 0x3B, 38294 - 19968: jis0208<<14 | 0x4E<<7 | 0x3C, 38296 - 19968: jis0208<<14 | 0x4E<<7 | 0x3D, 38297 - 19968: jis0208<<14 | 0x4E<<7 | 0x3E, 38301 - 19968: jis0212<<14 | 0x45<<7 | 0x06, 38302 - 19968: jis0212<<14 | 0x45<<7 | 0x07, 38303 - 19968: jis0212<<14 | 0x45<<7 | 0x08, 38304 - 19968: jis0208<<14 | 0x4E<<7 | 0x3F, 38305 - 19968: jis0212<<14 | 0x45<<7 | 0x09, 38306 - 19968: jis0208<<14 | 0x13<<7 | 0x37, 38307 - 19968: jis0208<<14 | 0x12<<7 | 0x34, 38308 - 19968: jis0208<<14 | 0x18<<7 | 0x3D, 38309 - 19968: jis0208<<14 | 0x27<<7 | 0x15, 38310 - 19968: jis0212<<14 | 0x45<<7 | 0x0A, 38311 - 19968: jis0208<<14 | 0x4E<<7 | 0x41, 38312 - 19968: jis0208<<14 | 0x4E<<7 | 0x40, 38313 - 19968: jis0212<<14 | 0x45<<7 | 0x0B, 38315 - 19968: jis0212<<14 | 0x45<<7 | 0x0C, 38316 - 19968: jis0212<<14 | 0x45<<7 | 0x0D, 38317 - 19968: jis0208<<14 | 0x4E<<7 | 0x42, 38322 - 19968: jis0208<<14 | 0x10<<7 | 0x3B, 38324 - 19968: jis0212<<14 | 0x45<<7 | 0x0E, 38326 - 19968: jis0212<<14 | 0x45<<7 | 0x0F, 38329 - 19968: jis0208<<14 | 0x4E<<7 | 0x45, 38330 - 19968: jis0212<<14 | 0x45<<7 | 0x10, 38331 - 19968: jis0208<<14 | 0x4E<<7 | 0x44, 38332 - 19968: jis0208<<14 | 0x4E<<7 | 0x43, 38333 - 19968: jis0212<<14 | 0x45<<7 | 0x11, 38334 - 19968: jis0208<<14 | 0x4E<<7 | 0x46, 38335 - 19968: jis0212<<14 | 0x45<<7 | 0x12, 38339 - 19968: jis0208<<14 | 0x4E<<7 | 0x49, 38342 - 19968: jis0212<<14 | 0x45<<7 | 0x13, 38343 - 19968: jis0208<<14 | 0x0F<<7 | 0x26, 38344 - 19968: jis0212<<14 | 0x45<<7 | 0x14, 38345 - 19968: jis0212<<14 | 0x45<<7 | 0x15, 38346 - 19968: jis0208<<14 | 0x4E<<7 | 0x47, 38347 - 19968: jis0212<<14 | 0x45<<7 | 0x16, 38348 - 19968: jis0208<<14 | 0x4E<<7 | 0x4B, 38349 - 19968: jis0208<<14 | 0x4E<<7 | 0x4A, 38352 - 19968: jis0212<<14 | 0x45<<7 | 0x17, 38353 - 19968: jis0212<<14 | 0x45<<7 | 0x18, 38354 - 19968: jis0212<<14 | 0x45<<7 | 0x19, 38355 - 19968: jis0212<<14 | 0x45<<7 | 0x1A, 38356 - 19968: jis0208<<14 | 0x4E<<7 | 0x4D, 38357 - 19968: jis0208<<14 | 0x4E<<7 | 0x4C, 38358 - 19968: jis0208<<14 | 0x4E<<7 | 0x4E, 38360 - 19968: jis0208<<14 | 0x25<<7 | 0x0D, 38361 - 19968: jis0212<<14 | 0x45<<7 | 0x1B, 38362 - 19968: jis0212<<14 | 0x45<<7 | 0x1C, 38364 - 19968: jis0208<<14 | 0x4E<<7 | 0x4F, 38365 - 19968: jis0212<<14 | 0x45<<7 | 0x1D, 38366 - 19968: jis0212<<14 | 0x45<<7 | 0x1E, 38367 - 19968: jis0212<<14 | 0x45<<7 | 0x1F, 38368 - 19968: jis0212<<14 | 0x45<<7 | 0x20, 38369 - 19968: jis0208<<14 | 0x4E<<7 | 0x50, 38370 - 19968: jis0208<<14 | 0x4E<<7 | 0x52, 38372 - 19968: jis0212<<14 | 0x45<<7 | 0x21, 38373 - 19968: jis0208<<14 | 0x4E<<7 | 0x51, 38374 - 19968: jis0212<<14 | 0x45<<7 | 0x22, 38428 - 19968: jis0208<<14 | 0x28<<7 | 0x4B, 38429 - 19968: jis0212<<14 | 0x45<<7 | 0x23, 38430 - 19968: jis0212<<14 | 0x45<<7 | 0x24, 38433 - 19968: jis0208<<14 | 0x4E<<7 | 0x53, 38434 - 19968: jis0212<<14 | 0x45<<7 | 0x25, 38436 - 19968: jis0212<<14 | 0x45<<7 | 0x26, 38437 - 19968: jis0212<<14 | 0x45<<7 | 0x27, 38438 - 19968: jis0212<<14 | 0x45<<7 | 0x28, 38440 - 19968: jis0208<<14 | 0x4E<<7 | 0x54, 38442 - 19968: jis0208<<14 | 0x19<<7 | 0x44, 38444 - 19968: jis0212<<14 | 0x45<<7 | 0x29, 38446 - 19968: jis0208<<14 | 0x4E<<7 | 0x55, 38447 - 19968: jis0208<<14 | 0x4E<<7 | 0x56, 38449 - 19968: jis0212<<14 | 0x45<<7 | 0x2A, 38450 - 19968: jis0208<<14 | 0x2A<<7 | 0x28, 38451 - 19968: jis0212<<14 | 0x45<<7 | 0x2B, 38455 - 19968: jis0212<<14 | 0x45<<7 | 0x2C, 38456 - 19968: jis0212<<14 | 0x45<<7 | 0x2D, 38457 - 19968: jis0212<<14 | 0x45<<7 | 0x2E, 38458 - 19968: jis0212<<14 | 0x45<<7 | 0x2F, 38459 - 19968: jis0208<<14 | 0x20<<7 | 0x2A, 38460 - 19968: jis0212<<14 | 0x45<<7 | 0x30, 38461 - 19968: jis0212<<14 | 0x45<<7 | 0x31, 38463 - 19968: jis0208<<14 | 0x0F<<7 | 0x03, 38464 - 19968: jis0208<<14 | 0x21<<7 | 0x2A, 38465 - 19968: jis0212<<14 | 0x45<<7 | 0x32, 38466 - 19968: jis0208<<14 | 0x4E<<7 | 0x57, 38468 - 19968: jis0208<<14 | 0x28<<7 | 0x4C, 38475 - 19968: jis0208<<14 | 0x4E<<7 | 0x5A, 38476 - 19968: jis0208<<14 | 0x4E<<7 | 0x58, 38477 - 19968: jis0208<<14 | 0x18<<7 | 0x3E, 38479 - 19968: jis0208<<14 | 0x4E<<7 | 0x59, 38480 - 19968: jis0208<<14 | 0x17<<7 | 0x21, 38482 - 19968: jis0212<<14 | 0x45<<7 | 0x33, 38484 - 19968: jis0212<<14 | 0x45<<7 | 0x34, 38486 - 19968: jis0212<<14 | 0x45<<7 | 0x35, 38487 - 19968: jis0212<<14 | 0x45<<7 | 0x36, 38488 - 19968: jis0212<<14 | 0x45<<7 | 0x37, 38491 - 19968: jis0208<<14 | 0x29<<7 | 0x24, 38492 - 19968: jis0208<<14 | 0x4E<<7 | 0x5C, 38493 - 19968: jis0208<<14 | 0x4F<<7 | 0x00, 38494 - 19968: jis0208<<14 | 0x4E<<7 | 0x5D, 38495 - 19968: jis0208<<14 | 0x4F<<7 | 0x01, 38497 - 19968: jis0212<<14 | 0x45<<7 | 0x38, 38498 - 19968: jis0208<<14 | 0x10<<7 | 0x00, 38499 - 19968: jis0208<<14 | 0x1E<<7 | 0x37, 38500 - 19968: jis0208<<14 | 0x1C<<7 | 0x5B, 38501 - 19968: jis0208<<14 | 0x13<<7 | 0x38, 38502 - 19968: jis0208<<14 | 0x4F<<7 | 0x02, 38506 - 19968: jis0208<<14 | 0x26<<7 | 0x45, 38508 - 19968: jis0208<<14 | 0x4F<<7 | 0x04, 38510 - 19968: jis0212<<14 | 0x45<<7 | 0x39, 38512 - 19968: jis0208<<14 | 0x10<<7 | 0x01, 38514 - 19968: jis0208<<14 | 0x4F<<7 | 0x03, 38515 - 19968: jis0208<<14 | 0x23<<7 | 0x23, 38516 - 19968: jis0212<<14 | 0x45<<7 | 0x3A, 38517 - 19968: jis0208<<14 | 0x2D<<7 | 0x2C, 38518 - 19968: jis0208<<14 | 0x25<<7 | 0x0A, 38519 - 19968: jis0208<<14 | 0x4E<<7 | 0x5B, 38520 - 19968: jis0208<<14 | 0x2D<<7 | 0x05, 38522 - 19968: jis0208<<14 | 0x17<<7 | 0x10, 38523 - 19968: jis0212<<14 | 0x45<<7 | 0x3B, 38524 - 19968: jis0212<<14 | 0x45<<7 | 0x3C, 38525 - 19968: jis0208<<14 | 0x2C<<7 | 0x3A, 38526 - 19968: jis0212<<14 | 0x45<<7 | 0x3D, 38527 - 19968: jis0212<<14 | 0x45<<7 | 0x3E, 38529 - 19968: jis0212<<14 | 0x45<<7 | 0x3F, 38530 - 19968: jis0212<<14 | 0x45<<7 | 0x40, 38531 - 19968: jis0212<<14 | 0x45<<7 | 0x41, 38532 - 19968: jis0212<<14 | 0x45<<7 | 0x42, 38533 - 19968: jis0208<<14 | 0x15<<7 | 0x58, 38534 - 19968: jis0208<<14 | 0x2D<<7 | 0x13, 38536 - 19968: jis0208<<14 | 0x16<<7 | 0x07, 38537 - 19968: jis0212<<14 | 0x45<<7 | 0x43, 38538 - 19968: jis0208<<14 | 0x21<<7 | 0x41, 38539 - 19968: jis0208<<14 | 0x46<<7 | 0x00, 38541 - 19968: jis0208<<14 | 0x4F<<7 | 0x05, 38542 - 19968: jis0208<<14 | 0x12<<7 | 0x0B, 38543 - 19968: jis0208<<14 | 0x1E<<7 | 0x4E, 38545 - 19968: jis0212<<14 | 0x45<<7 | 0x44, 38548 - 19968: jis0208<<14 | 0x12<<7 | 0x35, 38549 - 19968: jis0208<<14 | 0x4F<<7 | 0x07, 38550 - 19968: jis0212<<14 | 0x45<<7 | 0x45, 38551 - 19968: jis0208<<14 | 0x4F<<7 | 0x08, 38552 - 19968: jis0208<<14 | 0x4F<<7 | 0x06, 38553 - 19968: jis0208<<14 | 0x16<<7 | 0x43, 38554 - 19968: jis0212<<14 | 0x45<<7 | 0x46, 38555 - 19968: jis0208<<14 | 0x19<<7 | 0x3C, 38556 - 19968: jis0208<<14 | 0x1D<<7 | 0x42, 38557 - 19968: jis0208<<14 | 0x5B<<7 | 0x30, 38559 - 19968: jis0212<<14 | 0x45<<7 | 0x48, 38560 - 19968: jis0208<<14 | 0x10<<7 | 0x02, 38563 - 19968: jis0208<<14 | 0x2D<<7 | 0x38, 38564 - 19968: jis0212<<14 | 0x45<<7 | 0x49, 38565 - 19968: jis0212<<14 | 0x45<<7 | 0x4A, 38566 - 19968: jis0212<<14 | 0x45<<7 | 0x4B, 38567 - 19968: jis0208<<14 | 0x4F<<7 | 0x0A, 38568 - 19968: jis0208<<14 | 0x4D<<7 | 0x0D, 38569 - 19968: jis0212<<14 | 0x45<<7 | 0x4C, 38570 - 19968: jis0208<<14 | 0x4F<<7 | 0x09, 38574 - 19968: jis0212<<14 | 0x45<<7 | 0x4D, 38575 - 19968: jis0208<<14 | 0x5B<<7 | 0x31, 38576 - 19968: jis0208<<14 | 0x4F<<7 | 0x0D, 38577 - 19968: jis0208<<14 | 0x4F<<7 | 0x0B, 38578 - 19968: jis0208<<14 | 0x4F<<7 | 0x0C, 38579 - 19968: jis0212<<14 | 0x45<<7 | 0x4F, 38580 - 19968: jis0208<<14 | 0x4F<<7 | 0x0E, 38582 - 19968: jis0208<<14 | 0x4F<<7 | 0x0F, 38583 - 19968: jis0208<<14 | 0x2D<<7 | 0x4B, 38584 - 19968: jis0208<<14 | 0x4F<<7 | 0x10, 38585 - 19968: jis0208<<14 | 0x4F<<7 | 0x11, 38586 - 19968: jis0212<<14 | 0x45<<7 | 0x50, 38587 - 19968: jis0208<<14 | 0x1F<<7 | 0x28, 38588 - 19968: jis0208<<14 | 0x27<<7 | 0x1A, 38592 - 19968: jis0208<<14 | 0x1E<<7 | 0x5C, 38593 - 19968: jis0208<<14 | 0x13<<7 | 0x46, 38596 - 19968: jis0208<<14 | 0x2C<<7 | 0x19, 38597 - 19968: jis0208<<14 | 0x11<<7 | 0x4C, 38598 - 19968: jis0208<<14 | 0x1C<<7 | 0x17, 38599 - 19968: jis0208<<14 | 0x17<<7 | 0x3A, 38601 - 19968: jis0208<<14 | 0x4F<<7 | 0x14, 38602 - 19968: jis0212<<14 | 0x45<<7 | 0x51, 38603 - 19968: jis0208<<14 | 0x4F<<7 | 0x13, 38604 - 19968: jis0208<<14 | 0x1A<<7 | 0x52, 38605 - 19968: jis0208<<14 | 0x4F<<7 | 0x15, 38606 - 19968: jis0208<<14 | 0x4F<<7 | 0x12, 38609 - 19968: jis0208<<14 | 0x1A<<7 | 0x07, 38610 - 19968: jis0212<<14 | 0x45<<7 | 0x52, 38613 - 19968: jis0208<<14 | 0x4F<<7 | 0x19, 38614 - 19968: jis0208<<14 | 0x49<<7 | 0x0C, 38616 - 19968: jis0212<<14 | 0x45<<7 | 0x54, 38617 - 19968: jis0208<<14 | 0x31<<7 | 0x35, 38618 - 19968: jis0212<<14 | 0x45<<7 | 0x55, 38619 - 19968: jis0208<<14 | 0x1E<<7 | 0x56, 38620 - 19968: jis0208<<14 | 0x4F<<7 | 0x17, 38621 - 19968: jis0212<<14 | 0x45<<7 | 0x56, 38622 - 19968: jis0212<<14 | 0x45<<7 | 0x57, 38623 - 19968: jis0212<<14 | 0x45<<7 | 0x58, 38626 - 19968: jis0208<<14 | 0x2D<<7 | 0x04, 38627 - 19968: jis0208<<14 | 0x25<<7 | 0x50, 38632 - 19968: jis0208<<14 | 0x10<<7 | 0x0A, 38633 - 19968: jis0212<<14 | 0x45<<7 | 0x59, 38634 - 19968: jis0208<<14 | 0x1F<<7 | 0x42, 38635 - 19968: jis0208<<14 | 0x1B<<7 | 0x15, 38639 - 19968: jis0212<<14 | 0x45<<7 | 0x5A, 38640 - 19968: jis0208<<14 | 0x29<<7 | 0x16, 38641 - 19968: jis0212<<14 | 0x45<<7 | 0x5B, 38642 - 19968: jis0208<<14 | 0x10<<7 | 0x1F, 38646 - 19968: jis0208<<14 | 0x2D<<7 | 0x4C, 38647 - 19968: jis0208<<14 | 0x2C<<7 | 0x4A, 38649 - 19968: jis0208<<14 | 0x4F<<7 | 0x1A, 38650 - 19968: jis0212<<14 | 0x45<<7 | 0x5C, 38651 - 19968: jis0208<<14 | 0x24<<7 | 0x24, 38656 - 19968: jis0208<<14 | 0x1B<<7 | 0x5A, 38658 - 19968: jis0212<<14 | 0x45<<7 | 0x5D, 38659 - 19968: jis0212<<14 | 0x46<<7 | 0x00, 38660 - 19968: jis0208<<14 | 0x4F<<7 | 0x1B, 38661 - 19968: jis0212<<14 | 0x46<<7 | 0x01, 38662 - 19968: jis0208<<14 | 0x4F<<7 | 0x1C, 38663 - 19968: jis0208<<14 | 0x1E<<7 | 0x2B, 38664 - 19968: jis0208<<14 | 0x4F<<7 | 0x1D, 38665 - 19968: jis0212<<14 | 0x46<<7 | 0x02, 38666 - 19968: jis0208<<14 | 0x2D<<7 | 0x4D, 38669 - 19968: jis0208<<14 | 0x4F<<7 | 0x18, 38670 - 19968: jis0208<<14 | 0x4F<<7 | 0x1F, 38671 - 19968: jis0208<<14 | 0x4F<<7 | 0x21, 38673 - 19968: jis0208<<14 | 0x4F<<7 | 0x20, 38675 - 19968: jis0208<<14 | 0x4F<<7 | 0x1E, 38678 - 19968: jis0208<<14 | 0x4F<<7 | 0x22, 38681 - 19968: jis0208<<14 | 0x4F<<7 | 0x23, 38682 - 19968: jis0212<<14 | 0x46<<7 | 0x03, 38683 - 19968: jis0212<<14 | 0x46<<7 | 0x04, 38684 - 19968: jis0208<<14 | 0x20<<7 | 0x59, 38685 - 19968: jis0212<<14 | 0x46<<7 | 0x05, 38686 - 19968: jis0208<<14 | 0x11<<7 | 0x41, 38689 - 19968: jis0212<<14 | 0x46<<7 | 0x06, 38690 - 19968: jis0212<<14 | 0x46<<7 | 0x07, 38691 - 19968: jis0212<<14 | 0x46<<7 | 0x08, 38692 - 19968: jis0208<<14 | 0x4F<<7 | 0x24, 38695 - 19968: jis0208<<14 | 0x2B<<7 | 0x17, 38696 - 19968: jis0212<<14 | 0x46<<7 | 0x09, 38698 - 19968: jis0208<<14 | 0x4F<<7 | 0x25, 38704 - 19968: jis0208<<14 | 0x4F<<7 | 0x26, 38705 - 19968: jis0212<<14 | 0x46<<7 | 0x0A, 38706 - 19968: jis0208<<14 | 0x2E<<7 | 0x09, 38707 - 19968: jis0208<<14 | 0x5B<<7 | 0x32, 38712 - 19968: jis0208<<14 | 0x3A<<7 | 0x10, 38713 - 19968: jis0208<<14 | 0x4F<<7 | 0x27, 38715 - 19968: jis0208<<14 | 0x5B<<7 | 0x33, 38717 - 19968: jis0208<<14 | 0x4F<<7 | 0x28, 38718 - 19968: jis0208<<14 | 0x4F<<7 | 0x29, 38721 - 19968: jis0212<<14 | 0x46<<7 | 0x0C, 38722 - 19968: jis0208<<14 | 0x4F<<7 | 0x2D, 38723 - 19968: jis0208<<14 | 0x5B<<7 | 0x34, 38724 - 19968: jis0208<<14 | 0x4F<<7 | 0x2A, 38726 - 19968: jis0208<<14 | 0x4F<<7 | 0x2B, 38728 - 19968: jis0208<<14 | 0x4F<<7 | 0x2C, 38729 - 19968: jis0208<<14 | 0x4F<<7 | 0x2E, 38730 - 19968: jis0212<<14 | 0x46<<7 | 0x0E, 38733 - 19968: jis0208<<14 | 0x5B<<7 | 0x35, 38734 - 19968: jis0212<<14 | 0x46<<7 | 0x0F, 38735 - 19968: jis0208<<14 | 0x5B<<7 | 0x36, 38737 - 19968: jis0208<<14 | 0x5B<<7 | 0x37, 38738 - 19968: jis0208<<14 | 0x1F<<7 | 0x23, 38741 - 19968: jis0208<<14 | 0x5B<<7 | 0x38, 38742 - 19968: jis0208<<14 | 0x2B<<7 | 0x56, 38743 - 19968: jis0212<<14 | 0x46<<7 | 0x12, 38744 - 19968: jis0212<<14 | 0x46<<7 | 0x13, 38745 - 19968: jis0208<<14 | 0x1F<<7 | 0x24, 38746 - 19968: jis0212<<14 | 0x46<<7 | 0x14, 38747 - 19968: jis0212<<14 | 0x46<<7 | 0x15, 38748 - 19968: jis0208<<14 | 0x4F<<7 | 0x2F, 38750 - 19968: jis0208<<14 | 0x27<<7 | 0x52, 38752 - 19968: jis0208<<14 | 0x4F<<7 | 0x30, 38753 - 19968: jis0208<<14 | 0x52<<7 | 0x32, 38754 - 19968: jis0208<<14 | 0x2B<<7 | 0x2B, 38755 - 19968: jis0212<<14 | 0x46<<7 | 0x16, 38756 - 19968: jis0208<<14 | 0x4F<<7 | 0x31, 38758 - 19968: jis0208<<14 | 0x4F<<7 | 0x32, 38759 - 19968: jis0212<<14 | 0x46<<7 | 0x17, 38760 - 19968: jis0208<<14 | 0x4F<<7 | 0x33, 38761 - 19968: jis0208<<14 | 0x12<<7 | 0x36, 38762 - 19968: jis0212<<14 | 0x46<<7 | 0x18, 38763 - 19968: jis0208<<14 | 0x4F<<7 | 0x35, 38765 - 19968: jis0208<<14 | 0x1E<<7 | 0x38, 38766 - 19968: jis0212<<14 | 0x46<<7 | 0x19, 38769 - 19968: jis0208<<14 | 0x4F<<7 | 0x36, 38771 - 19968: jis0212<<14 | 0x46<<7 | 0x1A, 38772 - 19968: jis0208<<14 | 0x16<<7 | 0x03, 38774 - 19968: jis0212<<14 | 0x46<<7 | 0x1B, 38775 - 19968: jis0212<<14 | 0x46<<7 | 0x1C, 38776 - 19968: jis0212<<14 | 0x46<<7 | 0x1D, 38777 - 19968: jis0208<<14 | 0x4F<<7 | 0x37, 38778 - 19968: jis0208<<14 | 0x4F<<7 | 0x3B, 38779 - 19968: jis0212<<14 | 0x46<<7 | 0x1E, 38780 - 19968: jis0208<<14 | 0x4F<<7 | 0x39, 38781 - 19968: jis0212<<14 | 0x46<<7 | 0x1F, 38783 - 19968: jis0212<<14 | 0x46<<7 | 0x20, 38784 - 19968: jis0212<<14 | 0x46<<7 | 0x21, 38785 - 19968: jis0208<<14 | 0x4F<<7 | 0x3A, 38788 - 19968: jis0208<<14 | 0x12<<7 | 0x52, 38789 - 19968: jis0208<<14 | 0x4F<<7 | 0x38, 38790 - 19968: jis0208<<14 | 0x4F<<7 | 0x3C, 38793 - 19968: jis0212<<14 | 0x46<<7 | 0x22, 38795 - 19968: jis0208<<14 | 0x4F<<7 | 0x3D, 38797 - 19968: jis0208<<14 | 0x0F<<7 | 0x27, 38799 - 19968: jis0208<<14 | 0x4F<<7 | 0x3E, 38800 - 19968: jis0208<<14 | 0x4F<<7 | 0x3F, 38805 - 19968: jis0212<<14 | 0x46<<7 | 0x23, 38806 - 19968: jis0212<<14 | 0x46<<7 | 0x24, 38807 - 19968: jis0212<<14 | 0x46<<7 | 0x25, 38808 - 19968: jis0208<<14 | 0x1D<<7 | 0x43, 38809 - 19968: jis0212<<14 | 0x46<<7 | 0x26, 38810 - 19968: jis0212<<14 | 0x46<<7 | 0x27, 38812 - 19968: jis0208<<14 | 0x4F<<7 | 0x40, 38814 - 19968: jis0212<<14 | 0x46<<7 | 0x28, 38815 - 19968: jis0212<<14 | 0x46<<7 | 0x29, 38816 - 19968: jis0208<<14 | 0x14<<7 | 0x26, 38818 - 19968: jis0212<<14 | 0x46<<7 | 0x2A, 38819 - 19968: jis0208<<14 | 0x4F<<7 | 0x43, 38822 - 19968: jis0208<<14 | 0x4F<<7 | 0x42, 38824 - 19968: jis0208<<14 | 0x4F<<7 | 0x41, 38827 - 19968: jis0208<<14 | 0x4A<<7 | 0x50, 38828 - 19968: jis0212<<14 | 0x46<<7 | 0x2B, 38829 - 19968: jis0208<<14 | 0x29<<7 | 0x3B, 38830 - 19968: jis0212<<14 | 0x46<<7 | 0x2C, 38833 - 19968: jis0212<<14 | 0x46<<7 | 0x2D, 38834 - 19968: jis0212<<14 | 0x46<<7 | 0x2E, 38835 - 19968: jis0208<<14 | 0x4F<<7 | 0x44, 38836 - 19968: jis0208<<14 | 0x4F<<7 | 0x45, 38837 - 19968: jis0212<<14 | 0x46<<7 | 0x2F, 38838 - 19968: jis0212<<14 | 0x46<<7 | 0x30, 38840 - 19968: jis0212<<14 | 0x46<<7 | 0x31, 38841 - 19968: jis0212<<14 | 0x46<<7 | 0x32, 38842 - 19968: jis0212<<14 | 0x46<<7 | 0x33, 38844 - 19968: jis0212<<14 | 0x46<<7 | 0x34, 38846 - 19968: jis0212<<14 | 0x46<<7 | 0x35, 38847 - 19968: jis0212<<14 | 0x46<<7 | 0x36, 38849 - 19968: jis0212<<14 | 0x46<<7 | 0x37, 38851 - 19968: jis0208<<14 | 0x4F<<7 | 0x46, 38852 - 19968: jis0212<<14 | 0x46<<7 | 0x38, 38853 - 19968: jis0212<<14 | 0x46<<7 | 0x39, 38854 - 19968: jis0208<<14 | 0x4F<<7 | 0x47, 38855 - 19968: jis0212<<14 | 0x46<<7 | 0x3A, 38856 - 19968: jis0208<<14 | 0x4F<<7 | 0x48, 38857 - 19968: jis0212<<14 | 0x46<<7 | 0x3B, 38858 - 19968: jis0212<<14 | 0x46<<7 | 0x3C, 38859 - 19968: jis0208<<14 | 0x4F<<7 | 0x49, 38860 - 19968: jis0212<<14 | 0x46<<7 | 0x3D, 38861 - 19968: jis0212<<14 | 0x46<<7 | 0x3E, 38862 - 19968: jis0212<<14 | 0x46<<7 | 0x3F, 38864 - 19968: jis0212<<14 | 0x46<<7 | 0x40, 38865 - 19968: jis0212<<14 | 0x46<<7 | 0x41, 38867 - 19968: jis0208<<14 | 0x13<<7 | 0x39, 38868 - 19968: jis0212<<14 | 0x46<<7 | 0x42, 38871 - 19968: jis0212<<14 | 0x46<<7 | 0x43, 38872 - 19968: jis0212<<14 | 0x46<<7 | 0x44, 38873 - 19968: jis0212<<14 | 0x46<<7 | 0x45, 38875 - 19968: jis0212<<14 | 0x46<<7 | 0x49, 38876 - 19968: jis0208<<14 | 0x4F<<7 | 0x4A, 38877 - 19968: jis0212<<14 | 0x46<<7 | 0x46, 38878 - 19968: jis0212<<14 | 0x46<<7 | 0x47, 38880 - 19968: jis0212<<14 | 0x46<<7 | 0x48, 38881 - 19968: jis0212<<14 | 0x46<<7 | 0x4A, 38884 - 19968: jis0212<<14 | 0x46<<7 | 0x4B, 38893 - 19968: jis0208<<14 | 0x4F<<7 | 0x4B, 38894 - 19968: jis0208<<14 | 0x26<<7 | 0x02, 38895 - 19968: jis0212<<14 | 0x46<<7 | 0x4C, 38897 - 19968: jis0212<<14 | 0x46<<7 | 0x4D, 38898 - 19968: jis0208<<14 | 0x4F<<7 | 0x4D, 38899 - 19968: jis0208<<14 | 0x11<<7 | 0x1A, 38900 - 19968: jis0212<<14 | 0x46<<7 | 0x4E, 38901 - 19968: jis0208<<14 | 0x4F<<7 | 0x50, 38902 - 19968: jis0208<<14 | 0x4F<<7 | 0x4F, 38903 - 19968: jis0212<<14 | 0x46<<7 | 0x4F, 38904 - 19968: jis0212<<14 | 0x46<<7 | 0x50, 38906 - 19968: jis0212<<14 | 0x46<<7 | 0x51, 38907 - 19968: jis0208<<14 | 0x10<<7 | 0x03, 38911 - 19968: jis0208<<14 | 0x15<<7 | 0x20, 38913 - 19968: jis0208<<14 | 0x29<<7 | 0x26, 38914 - 19968: jis0208<<14 | 0x23<<7 | 0x19, 38915 - 19968: jis0208<<14 | 0x19<<7 | 0x01, 38917 - 19968: jis0208<<14 | 0x18<<7 | 0x3F, 38918 - 19968: jis0208<<14 | 0x1C<<7 | 0x46, 38919 - 19968: jis0212<<14 | 0x46<<7 | 0x52, 38920 - 19968: jis0208<<14 | 0x1E<<7 | 0x3B, 38922 - 19968: jis0212<<14 | 0x46<<7 | 0x53, 38924 - 19968: jis0208<<14 | 0x4F<<7 | 0x52, 38925 - 19968: jis0212<<14 | 0x46<<7 | 0x55, 38926 - 19968: jis0212<<14 | 0x46<<7 | 0x56, 38927 - 19968: jis0208<<14 | 0x4F<<7 | 0x51, 38928 - 19968: jis0208<<14 | 0x2C<<7 | 0x21, 38929 - 19968: jis0208<<14 | 0x13<<7 | 0x47, 38930 - 19968: jis0208<<14 | 0x27<<7 | 0x31, 38931 - 19968: jis0208<<14 | 0x25<<7 | 0x3B, 38932 - 19968: jis0212<<14 | 0x46<<7 | 0x57, 38934 - 19968: jis0212<<14 | 0x46<<7 | 0x58, 38935 - 19968: jis0208<<14 | 0x1E<<7 | 0x5B, 38936 - 19968: jis0208<<14 | 0x2D<<7 | 0x2D, 38937 - 19968: jis0212<<14 | 0x46<<7 | 0x54, 38938 - 19968: jis0208<<14 | 0x16<<7 | 0x3A, 38940 - 19968: jis0212<<14 | 0x46<<7 | 0x59, 38942 - 19968: jis0212<<14 | 0x46<<7 | 0x5A, 38944 - 19968: jis0212<<14 | 0x46<<7 | 0x5B, 38945 - 19968: jis0208<<14 | 0x4F<<7 | 0x55, 38947 - 19968: jis0212<<14 | 0x46<<7 | 0x5C, 38948 - 19968: jis0208<<14 | 0x4F<<7 | 0x54, 38949 - 19968: jis0212<<14 | 0x47<<7 | 0x07, 38950 - 19968: jis0212<<14 | 0x46<<7 | 0x5D, 38955 - 19968: jis0212<<14 | 0x47<<7 | 0x00, 38956 - 19968: jis0208<<14 | 0x2A<<7 | 0x2A, 38957 - 19968: jis0208<<14 | 0x25<<7 | 0x0B, 38958 - 19968: jis0212<<14 | 0x47<<7 | 0x01, 38959 - 19968: jis0212<<14 | 0x47<<7 | 0x02, 38960 - 19968: jis0212<<14 | 0x47<<7 | 0x03, 38962 - 19968: jis0212<<14 | 0x47<<7 | 0x04, 38963 - 19968: jis0212<<14 | 0x47<<7 | 0x05, 38964 - 19968: jis0208<<14 | 0x10<<7 | 0x2F, 38965 - 19968: jis0212<<14 | 0x47<<7 | 0x06, 38967 - 19968: jis0208<<14 | 0x4F<<7 | 0x56, 38968 - 19968: jis0208<<14 | 0x4F<<7 | 0x53, 38971 - 19968: jis0208<<14 | 0x28<<7 | 0x30, 38972 - 19968: jis0208<<14 | 0x2C<<7 | 0x49, 38973 - 19968: jis0208<<14 | 0x4F<<7 | 0x57, 38974 - 19968: jis0212<<14 | 0x47<<7 | 0x08, 38980 - 19968: jis0212<<14 | 0x47<<7 | 0x09, 38982 - 19968: jis0208<<14 | 0x4F<<7 | 0x58, 38983 - 19968: jis0212<<14 | 0x47<<7 | 0x0A, 38986 - 19968: jis0212<<14 | 0x47<<7 | 0x0B, 38987 - 19968: jis0208<<14 | 0x4F<<7 | 0x5A, 38988 - 19968: jis0208<<14 | 0x21<<7 | 0x49, 38989 - 19968: jis0208<<14 | 0x12<<7 | 0x3A, 38990 - 19968: jis0208<<14 | 0x12<<7 | 0x3B, 38991 - 19968: jis0208<<14 | 0x4F<<7 | 0x59, 38993 - 19968: jis0212<<14 | 0x47<<7 | 0x0C, 38994 - 19968: jis0212<<14 | 0x47<<7 | 0x0D, 38995 - 19968: jis0212<<14 | 0x47<<7 | 0x0E, 38996 - 19968: jis0208<<14 | 0x13<<7 | 0x48, 38997 - 19968: jis0208<<14 | 0x17<<7 | 0x11, 38998 - 19968: jis0212<<14 | 0x47<<7 | 0x0F, 38999 - 19968: jis0208<<14 | 0x5B<<7 | 0x39, 39000 - 19968: jis0208<<14 | 0x13<<7 | 0x49, 39001 - 19968: jis0212<<14 | 0x47<<7 | 0x11, 39002 - 19968: jis0212<<14 | 0x47<<7 | 0x12, 39003 - 19968: jis0208<<14 | 0x24<<7 | 0x1E, 39006 - 19968: jis0208<<14 | 0x2D<<7 | 0x3F, 39010 - 19968: jis0212<<14 | 0x47<<7 | 0x13, 39011 - 19968: jis0212<<14 | 0x47<<7 | 0x14, 39013 - 19968: jis0208<<14 | 0x5B<<7 | 0x3A, 39014 - 19968: jis0212<<14 | 0x47<<7 | 0x16, 39015 - 19968: jis0208<<14 | 0x17<<7 | 0x3B, 39018 - 19968: jis0212<<14 | 0x47<<7 | 0x17, 39019 - 19968: jis0208<<14 | 0x4F<<7 | 0x5B, 39020 - 19968: jis0212<<14 | 0x47<<7 | 0x18, 39023 - 19968: jis0208<<14 | 0x4F<<7 | 0x5C, 39024 - 19968: jis0208<<14 | 0x4F<<7 | 0x5D, 39025 - 19968: jis0208<<14 | 0x50<<7 | 0x00, 39027 - 19968: jis0208<<14 | 0x50<<7 | 0x02, 39028 - 19968: jis0208<<14 | 0x50<<7 | 0x01, 39080 - 19968: jis0208<<14 | 0x28<<7 | 0x56, 39082 - 19968: jis0208<<14 | 0x50<<7 | 0x03, 39083 - 19968: jis0212<<14 | 0x47<<7 | 0x19, 39085 - 19968: jis0212<<14 | 0x47<<7 | 0x1A, 39086 - 19968: jis0212<<14 | 0x47<<7 | 0x1B, 39087 - 19968: jis0208<<14 | 0x50<<7 | 0x04, 39088 - 19968: jis0212<<14 | 0x47<<7 | 0x1C, 39089 - 19968: jis0208<<14 | 0x50<<7 | 0x05, 39092 - 19968: jis0212<<14 | 0x47<<7 | 0x1D, 39094 - 19968: jis0208<<14 | 0x50<<7 | 0x06, 39095 - 19968: jis0212<<14 | 0x47<<7 | 0x1E, 39096 - 19968: jis0212<<14 | 0x47<<7 | 0x1F, 39098 - 19968: jis0212<<14 | 0x47<<7 | 0x20, 39099 - 19968: jis0212<<14 | 0x47<<7 | 0x21, 39103 - 19968: jis0212<<14 | 0x47<<7 | 0x22, 39106 - 19968: jis0212<<14 | 0x47<<7 | 0x23, 39107 - 19968: jis0208<<14 | 0x50<<7 | 0x08, 39108 - 19968: jis0208<<14 | 0x50<<7 | 0x07, 39109 - 19968: jis0212<<14 | 0x47<<7 | 0x24, 39110 - 19968: jis0208<<14 | 0x50<<7 | 0x09, 39112 - 19968: jis0212<<14 | 0x47<<7 | 0x25, 39116 - 19968: jis0212<<14 | 0x47<<7 | 0x26, 39131 - 19968: jis0208<<14 | 0x27<<7 | 0x53, 39132 - 19968: jis0208<<14 | 0x45<<7 | 0x2B, 39135 - 19968: jis0208<<14 | 0x1E<<7 | 0x08, 39137 - 19968: jis0212<<14 | 0x47<<7 | 0x27, 39138 - 19968: jis0208<<14 | 0x14<<7 | 0x11, 39139 - 19968: jis0212<<14 | 0x47<<7 | 0x28, 39141 - 19968: jis0212<<14 | 0x47<<7 | 0x29, 39142 - 19968: jis0212<<14 | 0x47<<7 | 0x2A, 39143 - 19968: jis0212<<14 | 0x47<<7 | 0x2B, 39145 - 19968: jis0208<<14 | 0x50<<7 | 0x0A, 39146 - 19968: jis0212<<14 | 0x47<<7 | 0x2C, 39147 - 19968: jis0208<<14 | 0x50<<7 | 0x0B, 39149 - 19968: jis0208<<14 | 0x31<<7 | 0x0B, 39150 - 19968: jis0208<<14 | 0x3C<<7 | 0x1A, 39151 - 19968: jis0208<<14 | 0x27<<7 | 0x32, 39154 - 19968: jis0208<<14 | 0x0F<<7 | 0x5A, 39155 - 19968: jis0212<<14 | 0x47<<7 | 0x2D, 39156 - 19968: jis0208<<14 | 0x0F<<7 | 0x1A, 39158 - 19968: jis0212<<14 | 0x47<<7 | 0x2E, 39164 - 19968: jis0208<<14 | 0x1A<<7 | 0x53, 39165 - 19968: jis0208<<14 | 0x2A<<7 | 0x0F, 39166 - 19968: jis0208<<14 | 0x1D<<7 | 0x5D, 39170 - 19968: jis0212<<14 | 0x47<<7 | 0x2F, 39171 - 19968: jis0208<<14 | 0x50<<7 | 0x0C, 39173 - 19968: jis0208<<14 | 0x2B<<7 | 0x3E, 39175 - 19968: jis0212<<14 | 0x47<<7 | 0x30, 39176 - 19968: jis0212<<14 | 0x47<<7 | 0x31, 39177 - 19968: jis0208<<14 | 0x50<<7 | 0x0D, 39178 - 19968: jis0208<<14 | 0x2C<<7 | 0x3B, 39180 - 19968: jis0208<<14 | 0x10<<7 | 0x21, 39184 - 19968: jis0208<<14 | 0x1A<<7 | 0x20, 39185 - 19968: jis0212<<14 | 0x47<<7 | 0x32, 39186 - 19968: jis0208<<14 | 0x50<<7 | 0x0E, 39187 - 19968: jis0208<<14 | 0x11<<7 | 0x4D, 39188 - 19968: jis0208<<14 | 0x50<<7 | 0x0F, 39189 - 19968: jis0212<<14 | 0x47<<7 | 0x33, 39190 - 19968: jis0212<<14 | 0x47<<7 | 0x34, 39191 - 19968: jis0212<<14 | 0x47<<7 | 0x35, 39192 - 19968: jis0208<<14 | 0x50<<7 | 0x10, 39194 - 19968: jis0212<<14 | 0x47<<7 | 0x36, 39195 - 19968: jis0212<<14 | 0x47<<7 | 0x37, 39196 - 19968: jis0212<<14 | 0x47<<7 | 0x38, 39197 - 19968: jis0208<<14 | 0x50<<7 | 0x12, 39198 - 19968: jis0208<<14 | 0x50<<7 | 0x13, 39199 - 19968: jis0212<<14 | 0x47<<7 | 0x39, 39200 - 19968: jis0208<<14 | 0x50<<7 | 0x15, 39201 - 19968: jis0208<<14 | 0x50<<7 | 0x11, 39202 - 19968: jis0212<<14 | 0x47<<7 | 0x3A, 39204 - 19968: jis0208<<14 | 0x50<<7 | 0x14, 39206 - 19968: jis0212<<14 | 0x47<<7 | 0x3B, 39207 - 19968: jis0208<<14 | 0x5B<<7 | 0x3D, 39208 - 19968: jis0208<<14 | 0x13<<7 | 0x3A, 39211 - 19968: jis0212<<14 | 0x47<<7 | 0x3D, 39212 - 19968: jis0208<<14 | 0x50<<7 | 0x16, 39214 - 19968: jis0208<<14 | 0x50<<7 | 0x17, 39217 - 19968: jis0212<<14 | 0x47<<7 | 0x3E, 39218 - 19968: jis0212<<14 | 0x47<<7 | 0x3F, 39219 - 19968: jis0212<<14 | 0x47<<7 | 0x40, 39220 - 19968: jis0212<<14 | 0x47<<7 | 0x41, 39221 - 19968: jis0212<<14 | 0x47<<7 | 0x42, 39225 - 19968: jis0212<<14 | 0x47<<7 | 0x43, 39226 - 19968: jis0212<<14 | 0x47<<7 | 0x44, 39227 - 19968: jis0212<<14 | 0x47<<7 | 0x45, 39228 - 19968: jis0212<<14 | 0x47<<7 | 0x46, 39229 - 19968: jis0208<<14 | 0x50<<7 | 0x18, 39230 - 19968: jis0208<<14 | 0x50<<7 | 0x19, 39232 - 19968: jis0212<<14 | 0x47<<7 | 0x47, 39233 - 19968: jis0212<<14 | 0x47<<7 | 0x48, 39234 - 19968: jis0208<<14 | 0x50<<7 | 0x1A, 39237 - 19968: jis0208<<14 | 0x50<<7 | 0x1C, 39238 - 19968: jis0212<<14 | 0x47<<7 | 0x49, 39239 - 19968: jis0212<<14 | 0x47<<7 | 0x4A, 39240 - 19968: jis0212<<14 | 0x47<<7 | 0x4B, 39241 - 19968: jis0208<<14 | 0x50<<7 | 0x1B, 39243 - 19968: jis0208<<14 | 0x50<<7 | 0x1E, 39244 - 19968: jis0208<<14 | 0x50<<7 | 0x21, 39245 - 19968: jis0212<<14 | 0x47<<7 | 0x4C, 39246 - 19968: jis0212<<14 | 0x47<<7 | 0x4D, 39248 - 19968: jis0208<<14 | 0x50<<7 | 0x1D, 39249 - 19968: jis0208<<14 | 0x50<<7 | 0x1F, 39250 - 19968: jis0208<<14 | 0x50<<7 | 0x20, 39252 - 19968: jis0212<<14 | 0x47<<7 | 0x4E, 39253 - 19968: jis0208<<14 | 0x50<<7 | 0x22, 39255 - 19968: jis0208<<14 | 0x15<<7 | 0x21, 39256 - 19968: jis0212<<14 | 0x47<<7 | 0x4F, 39257 - 19968: jis0212<<14 | 0x47<<7 | 0x50, 39259 - 19968: jis0212<<14 | 0x47<<7 | 0x51, 39260 - 19968: jis0212<<14 | 0x47<<7 | 0x52, 39262 - 19968: jis0212<<14 | 0x47<<7 | 0x53, 39263 - 19968: jis0212<<14 | 0x47<<7 | 0x54, 39264 - 19968: jis0212<<14 | 0x47<<7 | 0x55, 39318 - 19968: jis0208<<14 | 0x1B<<7 | 0x52, 39319 - 19968: jis0208<<14 | 0x50<<7 | 0x23, 39320 - 19968: jis0208<<14 | 0x50<<7 | 0x24, 39321 - 19968: jis0208<<14 | 0x18<<7 | 0x40, 39323 - 19968: jis0212<<14 | 0x47<<7 | 0x56, 39325 - 19968: jis0212<<14 | 0x47<<7 | 0x57, 39326 - 19968: jis0208<<14 | 0x5B<<7 | 0x3F, 39327 - 19968: jis0212<<14 | 0x47<<7 | 0x58, 39333 - 19968: jis0208<<14 | 0x50<<7 | 0x25, 39334 - 19968: jis0212<<14 | 0x47<<7 | 0x59, 39336 - 19968: jis0208<<14 | 0x12<<7 | 0x1D, 39340 - 19968: jis0208<<14 | 0x26<<7 | 0x2E, 39341 - 19968: jis0208<<14 | 0x50<<7 | 0x26, 39342 - 19968: jis0208<<14 | 0x50<<7 | 0x27, 39344 - 19968: jis0212<<14 | 0x47<<7 | 0x5A, 39345 - 19968: jis0212<<14 | 0x47<<7 | 0x5B, 39346 - 19968: jis0212<<14 | 0x47<<7 | 0x5C, 39347 - 19968: jis0208<<14 | 0x22<<7 | 0x39, 39348 - 19968: jis0208<<14 | 0x25<<7 | 0x4A, 39349 - 19968: jis0212<<14 | 0x47<<7 | 0x5D, 39353 - 19968: jis0212<<14 | 0x48<<7 | 0x00, 39354 - 19968: jis0212<<14 | 0x48<<7 | 0x01, 39356 - 19968: jis0208<<14 | 0x50<<7 | 0x28, 39357 - 19968: jis0212<<14 | 0x48<<7 | 0x02, 39359 - 19968: jis0212<<14 | 0x48<<7 | 0x03, 39361 - 19968: jis0208<<14 | 0x26<<7 | 0x5C, 39363 - 19968: jis0212<<14 | 0x48<<7 | 0x04, 39364 - 19968: jis0208<<14 | 0x21<<7 | 0x2B, 39365 - 19968: jis0208<<14 | 0x10<<7 | 0x37, 39366 - 19968: jis0208<<14 | 0x15<<7 | 0x4D, 39368 - 19968: jis0208<<14 | 0x15<<7 | 0x4E, 39369 - 19968: jis0212<<14 | 0x48<<7 | 0x05, 39376 - 19968: jis0208<<14 | 0x22<<7 | 0x52, 39377 - 19968: jis0208<<14 | 0x50<<7 | 0x2D, 39378 - 19968: jis0208<<14 | 0x15<<7 | 0x4F, 39379 - 19968: jis0212<<14 | 0x48<<7 | 0x06, 39380 - 19968: jis0212<<14 | 0x48<<7 | 0x07, 39381 - 19968: jis0208<<14 | 0x11<<7 | 0x4E, 39384 - 19968: jis0208<<14 | 0x50<<7 | 0x2C, 39385 - 19968: jis0212<<14 | 0x48<<7 | 0x08, 39386 - 19968: jis0212<<14 | 0x48<<7 | 0x09, 39387 - 19968: jis0208<<14 | 0x50<<7 | 0x2A, 39388 - 19968: jis0212<<14 | 0x48<<7 | 0x0A, 39389 - 19968: jis0208<<14 | 0x50<<7 | 0x2B, 39390 - 19968: jis0212<<14 | 0x48<<7 | 0x0B, 39391 - 19968: jis0208<<14 | 0x50<<7 | 0x29, 39394 - 19968: jis0208<<14 | 0x50<<7 | 0x37, 39399 - 19968: jis0212<<14 | 0x48<<7 | 0x0C, 39402 - 19968: jis0212<<14 | 0x48<<7 | 0x0D, 39403 - 19968: jis0212<<14 | 0x48<<7 | 0x0E, 39404 - 19968: jis0212<<14 | 0x48<<7 | 0x0F, 39405 - 19968: jis0208<<14 | 0x50<<7 | 0x2E, 39406 - 19968: jis0208<<14 | 0x50<<7 | 0x2F, 39408 - 19968: jis0212<<14 | 0x48<<7 | 0x10, 39409 - 19968: jis0208<<14 | 0x50<<7 | 0x30, 39410 - 19968: jis0208<<14 | 0x50<<7 | 0x31, 39412 - 19968: jis0212<<14 | 0x48<<7 | 0x11, 39413 - 19968: jis0212<<14 | 0x48<<7 | 0x12, 39416 - 19968: jis0208<<14 | 0x50<<7 | 0x33, 39417 - 19968: jis0212<<14 | 0x48<<7 | 0x13, 39419 - 19968: jis0208<<14 | 0x50<<7 | 0x32, 39421 - 19968: jis0212<<14 | 0x48<<7 | 0x14, 39422 - 19968: jis0212<<14 | 0x48<<7 | 0x15, 39423 - 19968: jis0208<<14 | 0x1C<<7 | 0x38, 39425 - 19968: jis0208<<14 | 0x50<<7 | 0x34, 39426 - 19968: jis0212<<14 | 0x48<<7 | 0x16, 39427 - 19968: jis0212<<14 | 0x48<<7 | 0x17, 39428 - 19968: jis0212<<14 | 0x48<<7 | 0x18, 39429 - 19968: jis0208<<14 | 0x50<<7 | 0x36, 39435 - 19968: jis0212<<14 | 0x48<<7 | 0x19, 39436 - 19968: jis0212<<14 | 0x48<<7 | 0x1A, 39438 - 19968: jis0208<<14 | 0x14<<7 | 0x12, 39439 - 19968: jis0208<<14 | 0x50<<7 | 0x35, 39440 - 19968: jis0212<<14 | 0x48<<7 | 0x1B, 39441 - 19968: jis0212<<14 | 0x48<<7 | 0x1C, 39442 - 19968: jis0208<<14 | 0x20<<7 | 0x5A, 39443 - 19968: jis0208<<14 | 0x17<<7 | 0x12, 39446 - 19968: jis0212<<14 | 0x48<<7 | 0x1D, 39449 - 19968: jis0208<<14 | 0x50<<7 | 0x38, 39454 - 19968: jis0212<<14 | 0x48<<7 | 0x1E, 39456 - 19968: jis0212<<14 | 0x48<<7 | 0x1F, 39458 - 19968: jis0212<<14 | 0x48<<7 | 0x20, 39459 - 19968: jis0212<<14 | 0x48<<7 | 0x21, 39460 - 19968: jis0212<<14 | 0x48<<7 | 0x22, 39463 - 19968: jis0212<<14 | 0x48<<7 | 0x23, 39464 - 19968: jis0208<<14 | 0x21<<7 | 0x2C, 39467 - 19968: jis0208<<14 | 0x50<<7 | 0x39, 39469 - 19968: jis0212<<14 | 0x48<<7 | 0x24, 39470 - 19968: jis0212<<14 | 0x48<<7 | 0x25, 39472 - 19968: jis0208<<14 | 0x25<<7 | 0x0C, 39475 - 19968: jis0212<<14 | 0x48<<7 | 0x26, 39477 - 19968: jis0212<<14 | 0x48<<7 | 0x27, 39478 - 19968: jis0212<<14 | 0x48<<7 | 0x28, 39479 - 19968: jis0208<<14 | 0x50<<7 | 0x3A, 39480 - 19968: jis0212<<14 | 0x48<<7 | 0x29, 39486 - 19968: jis0208<<14 | 0x50<<7 | 0x3F, 39488 - 19968: jis0208<<14 | 0x50<<7 | 0x3D, 39489 - 19968: jis0212<<14 | 0x48<<7 | 0x2B, 39490 - 19968: jis0208<<14 | 0x50<<7 | 0x3C, 39491 - 19968: jis0208<<14 | 0x50<<7 | 0x3E, 39492 - 19968: jis0212<<14 | 0x48<<7 | 0x2C, 39493 - 19968: jis0208<<14 | 0x50<<7 | 0x3B, 39495 - 19968: jis0212<<14 | 0x48<<7 | 0x2A, 39498 - 19968: jis0212<<14 | 0x48<<7 | 0x2D, 39499 - 19968: jis0212<<14 | 0x48<<7 | 0x2E, 39500 - 19968: jis0212<<14 | 0x48<<7 | 0x2F, 39501 - 19968: jis0208<<14 | 0x50<<7 | 0x41, 39502 - 19968: jis0208<<14 | 0x5B<<7 | 0x40, 39505 - 19968: jis0212<<14 | 0x48<<7 | 0x31, 39508 - 19968: jis0212<<14 | 0x48<<7 | 0x32, 39509 - 19968: jis0208<<14 | 0x50<<7 | 0x40, 39510 - 19968: jis0212<<14 | 0x48<<7 | 0x33, 39511 - 19968: jis0208<<14 | 0x50<<7 | 0x43, 39514 - 19968: jis0208<<14 | 0x15<<7 | 0x22, 39515 - 19968: jis0208<<14 | 0x50<<7 | 0x42, 39517 - 19968: jis0212<<14 | 0x48<<7 | 0x34, 39519 - 19968: jis0208<<14 | 0x50<<7 | 0x44, 39522 - 19968: jis0208<<14 | 0x50<<7 | 0x45, 39524 - 19968: jis0208<<14 | 0x50<<7 | 0x47, 39525 - 19968: jis0208<<14 | 0x50<<7 | 0x46, 39529 - 19968: jis0208<<14 | 0x50<<7 | 0x48, 39530 - 19968: jis0208<<14 | 0x50<<7 | 0x4A, 39531 - 19968: jis0208<<14 | 0x50<<7 | 0x49, 39592 - 19968: jis0208<<14 | 0x18<<7 | 0x5B, 39594 - 19968: jis0212<<14 | 0x48<<7 | 0x35, 39596 - 19968: jis0212<<14 | 0x48<<7 | 0x36, 39597 - 19968: jis0208<<14 | 0x50<<7 | 0x4B, 39598 - 19968: jis0212<<14 | 0x48<<7 | 0x37, 39599 - 19968: jis0212<<14 | 0x48<<7 | 0x38, 39600 - 19968: jis0208<<14 | 0x50<<7 | 0x4C, 39602 - 19968: jis0212<<14 | 0x48<<7 | 0x39, 39604 - 19968: jis0212<<14 | 0x48<<7 | 0x3A, 39605 - 19968: jis0212<<14 | 0x48<<7 | 0x3B, 39606 - 19968: jis0212<<14 | 0x48<<7 | 0x3C, 39608 - 19968: jis0208<<14 | 0x12<<7 | 0x1B, 39609 - 19968: jis0212<<14 | 0x48<<7 | 0x3D, 39611 - 19968: jis0212<<14 | 0x48<<7 | 0x3E, 39612 - 19968: jis0208<<14 | 0x50<<7 | 0x4D, 39614 - 19968: jis0212<<14 | 0x48<<7 | 0x3F, 39615 - 19968: jis0212<<14 | 0x48<<7 | 0x40, 39616 - 19968: jis0208<<14 | 0x50<<7 | 0x4E, 39617 - 19968: jis0212<<14 | 0x48<<7 | 0x41, 39619 - 19968: jis0212<<14 | 0x48<<7 | 0x42, 39620 - 19968: jis0208<<14 | 0x1E<<7 | 0x50, 39622 - 19968: jis0212<<14 | 0x48<<7 | 0x43, 39624 - 19968: jis0212<<14 | 0x48<<7 | 0x44, 39630 - 19968: jis0212<<14 | 0x48<<7 | 0x45, 39631 - 19968: jis0208<<14 | 0x50<<7 | 0x4F, 39632 - 19968: jis0212<<14 | 0x48<<7 | 0x46, 39633 - 19968: jis0208<<14 | 0x50<<7 | 0x50, 39634 - 19968: jis0212<<14 | 0x48<<7 | 0x47, 39635 - 19968: jis0208<<14 | 0x50<<7 | 0x51, 39636 - 19968: jis0208<<14 | 0x50<<7 | 0x52, 39637 - 19968: jis0212<<14 | 0x48<<7 | 0x48, 39638 - 19968: jis0212<<14 | 0x48<<7 | 0x49, 39639 - 19968: jis0212<<14 | 0x48<<7 | 0x4A, 39640 - 19968: jis0208<<14 | 0x18<<7 | 0x41, 39641 - 19968: jis0208<<14 | 0x5B<<7 | 0x41, 39643 - 19968: jis0212<<14 | 0x48<<7 | 0x4B, 39644 - 19968: jis0208<<14 | 0x5B<<7 | 0x42, 39646 - 19968: jis0208<<14 | 0x50<<7 | 0x53, 39647 - 19968: jis0208<<14 | 0x50<<7 | 0x54, 39648 - 19968: jis0212<<14 | 0x48<<7 | 0x4D, 39650 - 19968: jis0208<<14 | 0x50<<7 | 0x55, 39651 - 19968: jis0208<<14 | 0x50<<7 | 0x56, 39652 - 19968: jis0212<<14 | 0x48<<7 | 0x4E, 39653 - 19968: jis0212<<14 | 0x48<<7 | 0x4F, 39654 - 19968: jis0208<<14 | 0x50<<7 | 0x57, 39655 - 19968: jis0212<<14 | 0x48<<7 | 0x50, 39657 - 19968: jis0212<<14 | 0x48<<7 | 0x51, 39658 - 19968: jis0208<<14 | 0x27<<7 | 0x10, 39659 - 19968: jis0208<<14 | 0x50<<7 | 0x59, 39660 - 19968: jis0212<<14 | 0x48<<7 | 0x52, 39661 - 19968: jis0208<<14 | 0x28<<7 | 0x05, 39662 - 19968: jis0208<<14 | 0x50<<7 | 0x5A, 39663 - 19968: jis0208<<14 | 0x50<<7 | 0x58, 39665 - 19968: jis0208<<14 | 0x50<<7 | 0x5C, 39666 - 19968: jis0212<<14 | 0x48<<7 | 0x53, 39667 - 19968: jis0212<<14 | 0x48<<7 | 0x54, 39668 - 19968: jis0208<<14 | 0x50<<7 | 0x5B, 39669 - 19968: jis0212<<14 | 0x48<<7 | 0x55, 39671 - 19968: jis0208<<14 | 0x50<<7 | 0x5D, 39673 - 19968: jis0212<<14 | 0x48<<7 | 0x56, 39674 - 19968: jis0212<<14 | 0x48<<7 | 0x57, 39675 - 19968: jis0208<<14 | 0x51<<7 | 0x00, 39677 - 19968: jis0212<<14 | 0x48<<7 | 0x58, 39679 - 19968: jis0212<<14 | 0x48<<7 | 0x59, 39680 - 19968: jis0212<<14 | 0x48<<7 | 0x5A, 39681 - 19968: jis0212<<14 | 0x48<<7 | 0x5B, 39682 - 19968: jis0212<<14 | 0x48<<7 | 0x5C, 39683 - 19968: jis0212<<14 | 0x48<<7 | 0x5D, 39684 - 19968: jis0212<<14 | 0x49<<7 | 0x00, 39685 - 19968: jis0212<<14 | 0x49<<7 | 0x01, 39686 - 19968: jis0208<<14 | 0x51<<7 | 0x01, 39688 - 19968: jis0212<<14 | 0x49<<7 | 0x02, 39689 - 19968: jis0212<<14 | 0x49<<7 | 0x03, 39691 - 19968: jis0212<<14 | 0x49<<7 | 0x04, 39692 - 19968: jis0212<<14 | 0x49<<7 | 0x05, 39693 - 19968: jis0212<<14 | 0x49<<7 | 0x06, 39694 - 19968: jis0212<<14 | 0x49<<7 | 0x07, 39696 - 19968: jis0212<<14 | 0x49<<7 | 0x08, 39698 - 19968: jis0212<<14 | 0x49<<7 | 0x09, 39702 - 19968: jis0212<<14 | 0x49<<7 | 0x0A, 39704 - 19968: jis0208<<14 | 0x51<<7 | 0x02, 39705 - 19968: jis0212<<14 | 0x49<<7 | 0x0B, 39706 - 19968: jis0208<<14 | 0x51<<7 | 0x03, 39707 - 19968: jis0212<<14 | 0x49<<7 | 0x0C, 39708 - 19968: jis0212<<14 | 0x49<<7 | 0x0D, 39711 - 19968: jis0208<<14 | 0x51<<7 | 0x04, 39712 - 19968: jis0212<<14 | 0x49<<7 | 0x0E, 39714 - 19968: jis0208<<14 | 0x51<<7 | 0x05, 39715 - 19968: jis0208<<14 | 0x51<<7 | 0x06, 39717 - 19968: jis0208<<14 | 0x51<<7 | 0x07, 39718 - 19968: jis0212<<14 | 0x49<<7 | 0x0F, 39719 - 19968: jis0208<<14 | 0x51<<7 | 0x08, 39720 - 19968: jis0208<<14 | 0x51<<7 | 0x09, 39721 - 19968: jis0208<<14 | 0x51<<7 | 0x0A, 39722 - 19968: jis0208<<14 | 0x51<<7 | 0x0B, 39723 - 19968: jis0212<<14 | 0x49<<7 | 0x10, 39725 - 19968: jis0212<<14 | 0x49<<7 | 0x11, 39726 - 19968: jis0208<<14 | 0x51<<7 | 0x0C, 39727 - 19968: jis0208<<14 | 0x51<<7 | 0x0D, 39729 - 19968: jis0208<<14 | 0x3C<<7 | 0x14, 39730 - 19968: jis0208<<14 | 0x51<<7 | 0x0E, 39731 - 19968: jis0212<<14 | 0x49<<7 | 0x12, 39732 - 19968: jis0212<<14 | 0x49<<7 | 0x13, 39733 - 19968: jis0212<<14 | 0x49<<7 | 0x14, 39735 - 19968: jis0212<<14 | 0x49<<7 | 0x15, 39737 - 19968: jis0212<<14 | 0x49<<7 | 0x16, 39738 - 19968: jis0212<<14 | 0x49<<7 | 0x17, 39739 - 19968: jis0208<<14 | 0x43<<7 | 0x57, 39740 - 19968: jis0208<<14 | 0x14<<7 | 0x13, 39741 - 19968: jis0212<<14 | 0x49<<7 | 0x18, 39745 - 19968: jis0208<<14 | 0x12<<7 | 0x00, 39746 - 19968: jis0208<<14 | 0x19<<7 | 0x11, 39747 - 19968: jis0208<<14 | 0x51<<7 | 0x10, 39748 - 19968: jis0208<<14 | 0x51<<7 | 0x0F, 39749 - 19968: jis0208<<14 | 0x2B<<7 | 0x04, 39752 - 19968: jis0212<<14 | 0x49<<7 | 0x19, 39755 - 19968: jis0212<<14 | 0x49<<7 | 0x1A, 39756 - 19968: jis0212<<14 | 0x49<<7 | 0x1B, 39757 - 19968: jis0208<<14 | 0x51<<7 | 0x12, 39758 - 19968: jis0208<<14 | 0x51<<7 | 0x13, 39759 - 19968: jis0208<<14 | 0x51<<7 | 0x11, 39761 - 19968: jis0208<<14 | 0x51<<7 | 0x14, 39764 - 19968: jis0208<<14 | 0x2A<<7 | 0x41, 39765 - 19968: jis0212<<14 | 0x49<<7 | 0x1C, 39766 - 19968: jis0212<<14 | 0x49<<7 | 0x1D, 39767 - 19968: jis0212<<14 | 0x49<<7 | 0x1E, 39768 - 19968: jis0208<<14 | 0x51<<7 | 0x15, 39770 - 19968: jis0208<<14 | 0x14<<7 | 0x5A, 39771 - 19968: jis0212<<14 | 0x49<<7 | 0x1F, 39774 - 19968: jis0212<<14 | 0x49<<7 | 0x20, 39777 - 19968: jis0212<<14 | 0x49<<7 | 0x21, 39779 - 19968: jis0212<<14 | 0x49<<7 | 0x22, 39781 - 19968: jis0212<<14 | 0x49<<7 | 0x23, 39782 - 19968: jis0212<<14 | 0x49<<7 | 0x24, 39784 - 19968: jis0212<<14 | 0x49<<7 | 0x25, 39786 - 19968: jis0212<<14 | 0x49<<7 | 0x26, 39787 - 19968: jis0212<<14 | 0x49<<7 | 0x27, 39788 - 19968: jis0212<<14 | 0x49<<7 | 0x28, 39789 - 19968: jis0212<<14 | 0x49<<7 | 0x29, 39790 - 19968: jis0212<<14 | 0x49<<7 | 0x2A, 39791 - 19968: jis0208<<14 | 0x2E<<7 | 0x04, 39794 - 19968: jis0208<<14 | 0x5B<<7 | 0x44, 39795 - 19968: jis0212<<14 | 0x49<<7 | 0x2B, 39796 - 19968: jis0208<<14 | 0x51<<7 | 0x16, 39797 - 19968: jis0208<<14 | 0x5B<<7 | 0x43, 39799 - 19968: jis0212<<14 | 0x49<<7 | 0x2D, 39800 - 19968: jis0212<<14 | 0x49<<7 | 0x2E, 39801 - 19968: jis0212<<14 | 0x49<<7 | 0x2F, 39807 - 19968: jis0212<<14 | 0x49<<7 | 0x30, 39808 - 19968: jis0212<<14 | 0x49<<7 | 0x31, 39811 - 19968: jis0208<<14 | 0x51<<7 | 0x18, 39812 - 19968: jis0212<<14 | 0x49<<7 | 0x32, 39813 - 19968: jis0212<<14 | 0x49<<7 | 0x33, 39814 - 19968: jis0212<<14 | 0x49<<7 | 0x34, 39815 - 19968: jis0212<<14 | 0x49<<7 | 0x35, 39817 - 19968: jis0212<<14 | 0x49<<7 | 0x36, 39818 - 19968: jis0212<<14 | 0x49<<7 | 0x37, 39819 - 19968: jis0212<<14 | 0x49<<7 | 0x38, 39821 - 19968: jis0212<<14 | 0x49<<7 | 0x39, 39822 - 19968: jis0208<<14 | 0x0F<<7 | 0x1D, 39823 - 19968: jis0208<<14 | 0x5B<<7 | 0x45, 39824 - 19968: jis0212<<14 | 0x49<<7 | 0x3B, 39825 - 19968: jis0208<<14 | 0x51<<7 | 0x19, 39826 - 19968: jis0208<<14 | 0x29<<7 | 0x0A, 39827 - 19968: jis0208<<14 | 0x51<<7 | 0x17, 39828 - 19968: jis0212<<14 | 0x49<<7 | 0x3C, 39830 - 19968: jis0208<<14 | 0x51<<7 | 0x1A, 39831 - 19968: jis0208<<14 | 0x51<<7 | 0x1B, 39834 - 19968: jis0212<<14 | 0x49<<7 | 0x3D, 39837 - 19968: jis0212<<14 | 0x49<<7 | 0x3E, 39838 - 19968: jis0212<<14 | 0x49<<7 | 0x3F, 39839 - 19968: jis0208<<14 | 0x51<<7 | 0x1C, 39840 - 19968: jis0208<<14 | 0x51<<7 | 0x1D, 39846 - 19968: jis0212<<14 | 0x49<<7 | 0x40, 39847 - 19968: jis0212<<14 | 0x49<<7 | 0x41, 39848 - 19968: jis0208<<14 | 0x51<<7 | 0x1E, 39849 - 19968: jis0212<<14 | 0x49<<7 | 0x42, 39850 - 19968: jis0208<<14 | 0x2A<<7 | 0x4D, 39851 - 19968: jis0208<<14 | 0x1A<<7 | 0x0C, 39852 - 19968: jis0212<<14 | 0x49<<7 | 0x43, 39853 - 19968: jis0208<<14 | 0x19<<7 | 0x59, 39854 - 19968: jis0208<<14 | 0x20<<7 | 0x0E, 39856 - 19968: jis0212<<14 | 0x49<<7 | 0x44, 39857 - 19968: jis0208<<14 | 0x5B<<7 | 0x46, 39858 - 19968: jis0212<<14 | 0x49<<7 | 0x46, 39860 - 19968: jis0208<<14 | 0x51<<7 | 0x1F, 39863 - 19968: jis0212<<14 | 0x49<<7 | 0x47, 39864 - 19968: jis0212<<14 | 0x49<<7 | 0x48, 39865 - 19968: jis0208<<14 | 0x51<<7 | 0x22, 39867 - 19968: jis0208<<14 | 0x5B<<7 | 0x47, 39868 - 19968: jis0212<<14 | 0x49<<7 | 0x4A, 39870 - 19968: jis0212<<14 | 0x49<<7 | 0x4B, 39871 - 19968: jis0212<<14 | 0x49<<7 | 0x4C, 39872 - 19968: jis0208<<14 | 0x51<<7 | 0x20, 39873 - 19968: jis0212<<14 | 0x49<<7 | 0x4D, 39878 - 19968: jis0208<<14 | 0x51<<7 | 0x23, 39879 - 19968: jis0212<<14 | 0x49<<7 | 0x4E, 39880 - 19968: jis0212<<14 | 0x49<<7 | 0x4F, 39881 - 19968: jis0208<<14 | 0x17<<7 | 0x50, 39882 - 19968: jis0208<<14 | 0x51<<7 | 0x21, 39886 - 19968: jis0212<<14 | 0x49<<7 | 0x50, 39887 - 19968: jis0208<<14 | 0x51<<7 | 0x24, 39888 - 19968: jis0212<<14 | 0x49<<7 | 0x51, 39889 - 19968: jis0208<<14 | 0x51<<7 | 0x25, 39890 - 19968: jis0208<<14 | 0x51<<7 | 0x26, 39892 - 19968: jis0208<<14 | 0x51<<7 | 0x2A, 39894 - 19968: jis0208<<14 | 0x1A<<7 | 0x09, 39895 - 19968: jis0212<<14 | 0x49<<7 | 0x52, 39896 - 19968: jis0212<<14 | 0x49<<7 | 0x53, 39899 - 19968: jis0208<<14 | 0x21<<7 | 0x43, 39901 - 19968: jis0212<<14 | 0x49<<7 | 0x54, 39903 - 19968: jis0212<<14 | 0x49<<7 | 0x55, 39905 - 19968: jis0208<<14 | 0x51<<7 | 0x2B, 39906 - 19968: jis0208<<14 | 0x51<<7 | 0x28, 39907 - 19968: jis0208<<14 | 0x51<<7 | 0x27, 39908 - 19968: jis0208<<14 | 0x51<<7 | 0x29, 39909 - 19968: jis0212<<14 | 0x49<<7 | 0x56, 39911 - 19968: jis0212<<14 | 0x49<<7 | 0x57, 39912 - 19968: jis0208<<14 | 0x16<<7 | 0x3E, 39914 - 19968: jis0212<<14 | 0x49<<7 | 0x58, 39915 - 19968: jis0212<<14 | 0x49<<7 | 0x59, 39919 - 19968: jis0212<<14 | 0x49<<7 | 0x5A, 39920 - 19968: jis0208<<14 | 0x51<<7 | 0x2F, 39921 - 19968: jis0208<<14 | 0x51<<7 | 0x2E, 39922 - 19968: jis0208<<14 | 0x51<<7 | 0x2D, 39923 - 19968: jis0212<<14 | 0x49<<7 | 0x5B, 39925 - 19968: jis0208<<14 | 0x0F<<7 | 0x12, 39927 - 19968: jis0212<<14 | 0x49<<7 | 0x5C, 39928 - 19968: jis0212<<14 | 0x49<<7 | 0x5D, 39929 - 19968: jis0212<<14 | 0x4A<<7 | 0x00, 39930 - 19968: jis0212<<14 | 0x4A<<7 | 0x01, 39933 - 19968: jis0212<<14 | 0x4A<<7 | 0x02, 39935 - 19968: jis0212<<14 | 0x4A<<7 | 0x03, 39936 - 19968: jis0208<<14 | 0x5B<<7 | 0x48, 39938 - 19968: jis0212<<14 | 0x4A<<7 | 0x05, 39940 - 19968: jis0208<<14 | 0x51<<7 | 0x39, 39942 - 19968: jis0208<<14 | 0x51<<7 | 0x35, 39944 - 19968: jis0208<<14 | 0x51<<7 | 0x36, 39945 - 19968: jis0208<<14 | 0x51<<7 | 0x32, 39946 - 19968: jis0208<<14 | 0x51<<7 | 0x38, 39947 - 19968: jis0212<<14 | 0x4A<<7 | 0x06, 39948 - 19968: jis0208<<14 | 0x51<<7 | 0x34, 39949 - 19968: jis0208<<14 | 0x12<<7 | 0x41, 39951 - 19968: jis0212<<14 | 0x4A<<7 | 0x07, 39952 - 19968: jis0208<<14 | 0x2E<<7 | 0x2B, 39953 - 19968: jis0212<<14 | 0x4A<<7 | 0x08, 39954 - 19968: jis0208<<14 | 0x51<<7 | 0x37, 39955 - 19968: jis0208<<14 | 0x51<<7 | 0x33, 39956 - 19968: jis0208<<14 | 0x51<<7 | 0x31, 39957 - 19968: jis0208<<14 | 0x51<<7 | 0x30, 39958 - 19968: jis0212<<14 | 0x4A<<7 | 0x09, 39960 - 19968: jis0212<<14 | 0x4A<<7 | 0x0A, 39961 - 19968: jis0212<<14 | 0x4A<<7 | 0x0B, 39962 - 19968: jis0212<<14 | 0x4A<<7 | 0x0C, 39963 - 19968: jis0208<<14 | 0x51<<7 | 0x3B, 39964 - 19968: jis0212<<14 | 0x4A<<7 | 0x0D, 39966 - 19968: jis0212<<14 | 0x4A<<7 | 0x0E, 39969 - 19968: jis0208<<14 | 0x51<<7 | 0x3E, 39970 - 19968: jis0212<<14 | 0x4A<<7 | 0x0F, 39971 - 19968: jis0212<<14 | 0x4A<<7 | 0x10, 39972 - 19968: jis0208<<14 | 0x51<<7 | 0x3D, 39973 - 19968: jis0208<<14 | 0x51<<7 | 0x3C, 39974 - 19968: jis0212<<14 | 0x4A<<7 | 0x11, 39975 - 19968: jis0212<<14 | 0x4A<<7 | 0x12, 39976 - 19968: jis0212<<14 | 0x4A<<7 | 0x13, 39977 - 19968: jis0212<<14 | 0x4A<<7 | 0x14, 39978 - 19968: jis0212<<14 | 0x4A<<7 | 0x15, 39981 - 19968: jis0208<<14 | 0x28<<7 | 0x28, 39982 - 19968: jis0208<<14 | 0x51<<7 | 0x3A, 39983 - 19968: jis0208<<14 | 0x0F<<7 | 0x52, 39984 - 19968: jis0208<<14 | 0x51<<7 | 0x3F, 39985 - 19968: jis0212<<14 | 0x4A<<7 | 0x16, 39986 - 19968: jis0208<<14 | 0x51<<7 | 0x41, 39989 - 19968: jis0212<<14 | 0x4A<<7 | 0x17, 39990 - 19968: jis0212<<14 | 0x4A<<7 | 0x18, 39991 - 19968: jis0212<<14 | 0x4A<<7 | 0x19, 39993 - 19968: jis0208<<14 | 0x12<<7 | 0x4E, 39994 - 19968: jis0208<<14 | 0x51<<7 | 0x2C, 39995 - 19968: jis0208<<14 | 0x10<<7 | 0x16, 39997 - 19968: jis0212<<14 | 0x4A<<7 | 0x1A, 39998 - 19968: jis0208<<14 | 0x51<<7 | 0x43, 40001 - 19968: jis0212<<14 | 0x4A<<7 | 0x1B, 40003 - 19968: jis0212<<14 | 0x4A<<7 | 0x1C, 40004 - 19968: jis0212<<14 | 0x4A<<7 | 0x1D, 40005 - 19968: jis0212<<14 | 0x4A<<7 | 0x1E, 40006 - 19968: jis0208<<14 | 0x51<<7 | 0x42, 40007 - 19968: jis0208<<14 | 0x51<<7 | 0x40, 40008 - 19968: jis0208<<14 | 0x22<<7 | 0x0C, 40009 - 19968: jis0212<<14 | 0x4A<<7 | 0x1F, 40010 - 19968: jis0212<<14 | 0x4A<<7 | 0x20, 40014 - 19968: jis0212<<14 | 0x4A<<7 | 0x21, 40015 - 19968: jis0212<<14 | 0x4A<<7 | 0x22, 40016 - 19968: jis0212<<14 | 0x4A<<7 | 0x23, 40018 - 19968: jis0208<<14 | 0x2A<<7 | 0x4F, 40019 - 19968: jis0212<<14 | 0x4A<<7 | 0x24, 40020 - 19968: jis0212<<14 | 0x4A<<7 | 0x25, 40022 - 19968: jis0212<<14 | 0x4A<<7 | 0x26, 40023 - 19968: jis0208<<14 | 0x2D<<7 | 0x39, 40024 - 19968: jis0212<<14 | 0x4A<<7 | 0x27, 40026 - 19968: jis0208<<14 | 0x51<<7 | 0x44, 40027 - 19968: jis0212<<14 | 0x4A<<7 | 0x28, 40028 - 19968: jis0212<<14 | 0x4A<<7 | 0x2F, 40029 - 19968: jis0212<<14 | 0x4A<<7 | 0x29, 40030 - 19968: jis0212<<14 | 0x4A<<7 | 0x2A, 40031 - 19968: jis0212<<14 | 0x4A<<7 | 0x2B, 40032 - 19968: jis0208<<14 | 0x51<<7 | 0x45, 40035 - 19968: jis0212<<14 | 0x4A<<7 | 0x2C, 40039 - 19968: jis0208<<14 | 0x51<<7 | 0x46, 40040 - 19968: jis0212<<14 | 0x4A<<7 | 0x31, 40041 - 19968: jis0212<<14 | 0x4A<<7 | 0x2D, 40042 - 19968: jis0212<<14 | 0x4A<<7 | 0x2E, 40043 - 19968: jis0212<<14 | 0x4A<<7 | 0x30, 40046 - 19968: jis0212<<14 | 0x4A<<7 | 0x32, 40048 - 19968: jis0212<<14 | 0x4A<<7 | 0x33, 40050 - 19968: jis0212<<14 | 0x4A<<7 | 0x34, 40053 - 19968: jis0212<<14 | 0x4A<<7 | 0x35, 40054 - 19968: jis0208<<14 | 0x51<<7 | 0x47, 40055 - 19968: jis0212<<14 | 0x4A<<7 | 0x36, 40056 - 19968: jis0208<<14 | 0x51<<7 | 0x48, 40059 - 19968: jis0212<<14 | 0x4A<<7 | 0x37, 40165 - 19968: jis0208<<14 | 0x23<<7 | 0x1A, 40166 - 19968: jis0212<<14 | 0x4A<<7 | 0x38, 40167 - 19968: jis0208<<14 | 0x51<<7 | 0x49, 40169 - 19968: jis0208<<14 | 0x27<<7 | 0x16, 40171 - 19968: jis0208<<14 | 0x51<<7 | 0x4E, 40172 - 19968: jis0208<<14 | 0x51<<7 | 0x4A, 40176 - 19968: jis0208<<14 | 0x51<<7 | 0x4B, 40178 - 19968: jis0212<<14 | 0x4A<<7 | 0x39, 40179 - 19968: jis0208<<14 | 0x2A<<7 | 0x10, 40180 - 19968: jis0208<<14 | 0x2B<<7 | 0x23, 40182 - 19968: jis0208<<14 | 0x25<<7 | 0x2F, 40183 - 19968: jis0212<<14 | 0x4A<<7 | 0x3A, 40185 - 19968: jis0212<<14 | 0x4A<<7 | 0x3B, 40194 - 19968: jis0212<<14 | 0x4A<<7 | 0x3D, 40195 - 19968: jis0208<<14 | 0x51<<7 | 0x4F, 40198 - 19968: jis0208<<14 | 0x51<<7 | 0x50, 40199 - 19968: jis0208<<14 | 0x25<<7 | 0x1D, 40200 - 19968: jis0208<<14 | 0x51<<7 | 0x4D, 40201 - 19968: jis0208<<14 | 0x51<<7 | 0x4C, 40203 - 19968: jis0212<<14 | 0x4A<<7 | 0x3C, 40206 - 19968: jis0208<<14 | 0x11<<7 | 0x09, 40209 - 19968: jis0212<<14 | 0x4A<<7 | 0x3E, 40210 - 19968: jis0208<<14 | 0x51<<7 | 0x58, 40213 - 19968: jis0208<<14 | 0x51<<7 | 0x57, 40215 - 19968: jis0212<<14 | 0x4A<<7 | 0x3F, 40216 - 19968: jis0212<<14 | 0x4A<<7 | 0x40, 40219 - 19968: jis0208<<14 | 0x10<<7 | 0x54, 40220 - 19968: jis0212<<14 | 0x4A<<7 | 0x41, 40221 - 19968: jis0212<<14 | 0x4A<<7 | 0x42, 40222 - 19968: jis0212<<14 | 0x4A<<7 | 0x43, 40223 - 19968: jis0208<<14 | 0x51<<7 | 0x55, 40227 - 19968: jis0208<<14 | 0x51<<7 | 0x54, 40230 - 19968: jis0208<<14 | 0x51<<7 | 0x52, 40232 - 19968: jis0208<<14 | 0x12<<7 | 0x5A, 40234 - 19968: jis0208<<14 | 0x51<<7 | 0x51, 40235 - 19968: jis0208<<14 | 0x1B<<7 | 0x11, 40236 - 19968: jis0208<<14 | 0x11<<7 | 0x08, 40239 - 19968: jis0212<<14 | 0x4A<<7 | 0x44, 40240 - 19968: jis0212<<14 | 0x4A<<7 | 0x45, 40242 - 19968: jis0212<<14 | 0x4A<<7 | 0x46, 40243 - 19968: jis0212<<14 | 0x4A<<7 | 0x47, 40244 - 19968: jis0212<<14 | 0x4A<<7 | 0x48, 40250 - 19968: jis0212<<14 | 0x4A<<7 | 0x49, 40251 - 19968: jis0208<<14 | 0x18<<7 | 0x42, 40252 - 19968: jis0212<<14 | 0x4A<<7 | 0x4A, 40253 - 19968: jis0212<<14 | 0x4A<<7 | 0x4C, 40254 - 19968: jis0208<<14 | 0x51<<7 | 0x5B, 40255 - 19968: jis0208<<14 | 0x51<<7 | 0x5A, 40257 - 19968: jis0208<<14 | 0x51<<7 | 0x59, 40258 - 19968: jis0212<<14 | 0x4A<<7 | 0x4D, 40259 - 19968: jis0212<<14 | 0x4A<<7 | 0x4E, 40260 - 19968: jis0208<<14 | 0x51<<7 | 0x56, 40261 - 19968: jis0212<<14 | 0x4A<<7 | 0x4B, 40262 - 19968: jis0208<<14 | 0x51<<7 | 0x5C, 40263 - 19968: jis0212<<14 | 0x4A<<7 | 0x4F, 40264 - 19968: jis0208<<14 | 0x51<<7 | 0x5D, 40266 - 19968: jis0212<<14 | 0x4A<<7 | 0x50, 40272 - 19968: jis0208<<14 | 0x52<<7 | 0x04, 40273 - 19968: jis0208<<14 | 0x52<<7 | 0x03, 40275 - 19968: jis0212<<14 | 0x4A<<7 | 0x51, 40276 - 19968: jis0212<<14 | 0x4A<<7 | 0x52, 40281 - 19968: jis0208<<14 | 0x52<<7 | 0x05, 40284 - 19968: jis0208<<14 | 0x10<<7 | 0x0C, 40285 - 19968: jis0208<<14 | 0x52<<7 | 0x00, 40286 - 19968: jis0208<<14 | 0x52<<7 | 0x01, 40287 - 19968: jis0212<<14 | 0x4A<<7 | 0x53, 40288 - 19968: jis0208<<14 | 0x18<<7 | 0x53, 40289 - 19968: jis0208<<14 | 0x2B<<7 | 0x18, 40290 - 19968: jis0212<<14 | 0x4A<<7 | 0x55, 40291 - 19968: jis0212<<14 | 0x4A<<7 | 0x54, 40292 - 19968: jis0208<<14 | 0x52<<7 | 0x02, 40293 - 19968: jis0212<<14 | 0x4A<<7 | 0x56, 40297 - 19968: jis0212<<14 | 0x4A<<7 | 0x57, 40298 - 19968: jis0212<<14 | 0x4A<<7 | 0x58, 40299 - 19968: jis0208<<14 | 0x5B<<7 | 0x4A, 40300 - 19968: jis0208<<14 | 0x2A<<7 | 0x11, 40303 - 19968: jis0208<<14 | 0x52<<7 | 0x0A, 40304 - 19968: jis0208<<14 | 0x5B<<7 | 0x49, 40306 - 19968: jis0208<<14 | 0x52<<7 | 0x06, 40310 - 19968: jis0212<<14 | 0x4A<<7 | 0x5B, 40311 - 19968: jis0212<<14 | 0x4A<<7 | 0x5C, 40314 - 19968: jis0208<<14 | 0x52<<7 | 0x0B, 40315 - 19968: jis0212<<14 | 0x4A<<7 | 0x5D, 40316 - 19968: jis0212<<14 | 0x4B<<7 | 0x00, 40318 - 19968: jis0212<<14 | 0x4B<<7 | 0x01, 40323 - 19968: jis0212<<14 | 0x4B<<7 | 0x02, 40324 - 19968: jis0212<<14 | 0x4B<<7 | 0x03, 40326 - 19968: jis0212<<14 | 0x4B<<7 | 0x04, 40327 - 19968: jis0208<<14 | 0x52<<7 | 0x08, 40329 - 19968: jis0208<<14 | 0x52<<7 | 0x07, 40330 - 19968: jis0212<<14 | 0x4B<<7 | 0x05, 40333 - 19968: jis0212<<14 | 0x4B<<7 | 0x06, 40334 - 19968: jis0212<<14 | 0x4B<<7 | 0x07, 40335 - 19968: jis0208<<14 | 0x16<<7 | 0x3B, 40338 - 19968: jis0212<<14 | 0x4B<<7 | 0x08, 40339 - 19968: jis0212<<14 | 0x4B<<7 | 0x09, 40341 - 19968: jis0212<<14 | 0x4B<<7 | 0x0A, 40342 - 19968: jis0212<<14 | 0x4B<<7 | 0x0B, 40343 - 19968: jis0212<<14 | 0x4B<<7 | 0x0C, 40344 - 19968: jis0212<<14 | 0x4B<<7 | 0x0D, 40346 - 19968: jis0208<<14 | 0x52<<7 | 0x0C, 40353 - 19968: jis0212<<14 | 0x4B<<7 | 0x0E, 40356 - 19968: jis0208<<14 | 0x52<<7 | 0x0D, 40361 - 19968: jis0208<<14 | 0x52<<7 | 0x0E, 40362 - 19968: jis0212<<14 | 0x4B<<7 | 0x0F, 40363 - 19968: jis0208<<14 | 0x52<<7 | 0x09, 40364 - 19968: jis0212<<14 | 0x4B<<7 | 0x10, 40366 - 19968: jis0212<<14 | 0x4B<<7 | 0x11, 40367 - 19968: jis0208<<14 | 0x51<<7 | 0x53, 40369 - 19968: jis0212<<14 | 0x4B<<7 | 0x12, 40370 - 19968: jis0208<<14 | 0x52<<7 | 0x0F, 40372 - 19968: jis0208<<14 | 0x23<<7 | 0x40, 40373 - 19968: jis0212<<14 | 0x4B<<7 | 0x13, 40376 - 19968: jis0208<<14 | 0x52<<7 | 0x13, 40377 - 19968: jis0212<<14 | 0x4B<<7 | 0x14, 40378 - 19968: jis0208<<14 | 0x52<<7 | 0x14, 40379 - 19968: jis0208<<14 | 0x52<<7 | 0x12, 40380 - 19968: jis0212<<14 | 0x4B<<7 | 0x15, 40383 - 19968: jis0212<<14 | 0x4B<<7 | 0x16, 40385 - 19968: jis0208<<14 | 0x52<<7 | 0x11, 40386 - 19968: jis0208<<14 | 0x52<<7 | 0x17, 40387 - 19968: jis0212<<14 | 0x4B<<7 | 0x17, 40388 - 19968: jis0208<<14 | 0x52<<7 | 0x10, 40390 - 19968: jis0208<<14 | 0x52<<7 | 0x15, 40391 - 19968: jis0212<<14 | 0x4B<<7 | 0x18, 40393 - 19968: jis0212<<14 | 0x4B<<7 | 0x19, 40394 - 19968: jis0212<<14 | 0x4B<<7 | 0x1A, 40399 - 19968: jis0208<<14 | 0x52<<7 | 0x16, 40403 - 19968: jis0208<<14 | 0x52<<7 | 0x19, 40404 - 19968: jis0212<<14 | 0x4B<<7 | 0x1B, 40405 - 19968: jis0212<<14 | 0x4B<<7 | 0x1C, 40406 - 19968: jis0212<<14 | 0x4B<<7 | 0x1D, 40407 - 19968: jis0212<<14 | 0x4B<<7 | 0x1E, 40409 - 19968: jis0208<<14 | 0x52<<7 | 0x18, 40410 - 19968: jis0212<<14 | 0x4B<<7 | 0x1F, 40414 - 19968: jis0212<<14 | 0x4B<<7 | 0x20, 40415 - 19968: jis0212<<14 | 0x4B<<7 | 0x21, 40416 - 19968: jis0212<<14 | 0x4B<<7 | 0x22, 40421 - 19968: jis0212<<14 | 0x4B<<7 | 0x23, 40422 - 19968: jis0208<<14 | 0x52<<7 | 0x1B, 40423 - 19968: jis0212<<14 | 0x4B<<7 | 0x24, 40425 - 19968: jis0212<<14 | 0x4B<<7 | 0x25, 40427 - 19968: jis0212<<14 | 0x4B<<7 | 0x26, 40429 - 19968: jis0208<<14 | 0x52<<7 | 0x1C, 40430 - 19968: jis0212<<14 | 0x4B<<7 | 0x27, 40431 - 19968: jis0208<<14 | 0x52<<7 | 0x1D, 40432 - 19968: jis0212<<14 | 0x4B<<7 | 0x28, 40434 - 19968: jis0208<<14 | 0x2E<<7 | 0x28, 40435 - 19968: jis0212<<14 | 0x4B<<7 | 0x29, 40436 - 19968: jis0212<<14 | 0x4B<<7 | 0x2A, 40440 - 19968: jis0208<<14 | 0x52<<7 | 0x1A, 40441 - 19968: jis0208<<14 | 0x21<<7 | 0x4A, 40442 - 19968: jis0208<<14 | 0x19<<7 | 0x4C, 40445 - 19968: jis0208<<14 | 0x52<<7 | 0x1E, 40446 - 19968: jis0212<<14 | 0x4B<<7 | 0x2B, 40450 - 19968: jis0212<<14 | 0x4B<<7 | 0x2D, 40455 - 19968: jis0212<<14 | 0x4B<<7 | 0x2E, 40458 - 19968: jis0212<<14 | 0x4B<<7 | 0x2C, 40462 - 19968: jis0212<<14 | 0x4B<<7 | 0x2F, 40464 - 19968: jis0212<<14 | 0x4B<<7 | 0x30, 40465 - 19968: jis0212<<14 | 0x4B<<7 | 0x31, 40466 - 19968: jis0212<<14 | 0x4B<<7 | 0x32, 40469 - 19968: jis0212<<14 | 0x4B<<7 | 0x33, 40470 - 19968: jis0212<<14 | 0x4B<<7 | 0x34, 40473 - 19968: jis0208<<14 | 0x5B<<7 | 0x4C, 40474 - 19968: jis0208<<14 | 0x52<<7 | 0x1F, 40475 - 19968: jis0208<<14 | 0x52<<7 | 0x20, 40476 - 19968: jis0212<<14 | 0x4B<<7 | 0x36, 40477 - 19968: jis0212<<14 | 0x4B<<7 | 0x37, 40478 - 19968: jis0208<<14 | 0x52<<7 | 0x21, 40565 - 19968: jis0208<<14 | 0x52<<7 | 0x22, 40568 - 19968: jis0208<<14 | 0x17<<7 | 0x13, 40569 - 19968: jis0208<<14 | 0x52<<7 | 0x23, 40570 - 19968: jis0212<<14 | 0x4B<<7 | 0x38, 40571 - 19968: jis0212<<14 | 0x4B<<7 | 0x39, 40572 - 19968: jis0212<<14 | 0x4B<<7 | 0x3A, 40573 - 19968: jis0208<<14 | 0x52<<7 | 0x24, 40575 - 19968: jis0208<<14 | 0x1B<<7 | 0x0E, 40576 - 19968: jis0212<<14 | 0x4B<<7 | 0x3B, 40577 - 19968: jis0208<<14 | 0x52<<7 | 0x25, 40578 - 19968: jis0212<<14 | 0x4B<<7 | 0x3C, 40579 - 19968: jis0212<<14 | 0x4B<<7 | 0x3D, 40580 - 19968: jis0212<<14 | 0x4B<<7 | 0x3E, 40581 - 19968: jis0212<<14 | 0x4B<<7 | 0x3F, 40583 - 19968: jis0212<<14 | 0x4B<<7 | 0x40, 40584 - 19968: jis0208<<14 | 0x52<<7 | 0x26, 40587 - 19968: jis0208<<14 | 0x52<<7 | 0x27, 40588 - 19968: jis0208<<14 | 0x52<<7 | 0x28, 40590 - 19968: jis0212<<14 | 0x4B<<7 | 0x41, 40591 - 19968: jis0212<<14 | 0x4B<<7 | 0x42, 40593 - 19968: jis0208<<14 | 0x52<<7 | 0x2B, 40594 - 19968: jis0208<<14 | 0x52<<7 | 0x29, 40595 - 19968: jis0208<<14 | 0x2E<<7 | 0x1B, 40597 - 19968: jis0208<<14 | 0x52<<7 | 0x2A, 40598 - 19968: jis0212<<14 | 0x4B<<7 | 0x43, 40599 - 19968: jis0208<<14 | 0x2D<<7 | 0x4E, 40600 - 19968: jis0212<<14 | 0x4B<<7 | 0x44, 40603 - 19968: jis0212<<14 | 0x4B<<7 | 0x45, 40605 - 19968: jis0208<<14 | 0x52<<7 | 0x2C, 40606 - 19968: jis0212<<14 | 0x4B<<7 | 0x46, 40607 - 19968: jis0208<<14 | 0x2D<<7 | 0x3A, 40612 - 19968: jis0212<<14 | 0x4B<<7 | 0x47, 40613 - 19968: jis0208<<14 | 0x52<<7 | 0x2D, 40614 - 19968: jis0208<<14 | 0x26<<7 | 0x5D, 40616 - 19968: jis0212<<14 | 0x4B<<7 | 0x48, 40617 - 19968: jis0208<<14 | 0x52<<7 | 0x2E, 40618 - 19968: jis0208<<14 | 0x52<<7 | 0x30, 40620 - 19968: jis0212<<14 | 0x4B<<7 | 0x49, 40621 - 19968: jis0208<<14 | 0x52<<7 | 0x31, 40622 - 19968: jis0212<<14 | 0x4B<<7 | 0x4A, 40623 - 19968: jis0212<<14 | 0x4B<<7 | 0x4B, 40624 - 19968: jis0212<<14 | 0x4B<<7 | 0x4C, 40627 - 19968: jis0212<<14 | 0x4B<<7 | 0x4D, 40628 - 19968: jis0212<<14 | 0x4B<<7 | 0x4E, 40629 - 19968: jis0212<<14 | 0x4B<<7 | 0x4F, 40632 - 19968: jis0208<<14 | 0x52<<7 | 0x2F, 40633 - 19968: jis0208<<14 | 0x18<<7 | 0x4C, 40634 - 19968: jis0208<<14 | 0x2B<<7 | 0x2C, 40635 - 19968: jis0208<<14 | 0x2A<<7 | 0x42, 40636 - 19968: jis0208<<14 | 0x35<<7 | 0x56, 40638 - 19968: jis0208<<14 | 0x3C<<7 | 0x3F, 40639 - 19968: jis0208<<14 | 0x2A<<7 | 0x5A, 40644 - 19968: jis0208<<14 | 0x11<<7 | 0x0A, 40646 - 19968: jis0212<<14 | 0x4B<<7 | 0x50, 40648 - 19968: jis0212<<14 | 0x4B<<7 | 0x51, 40651 - 19968: jis0212<<14 | 0x4B<<7 | 0x52, 40652 - 19968: jis0208<<14 | 0x52<<7 | 0x33, 40653 - 19968: jis0208<<14 | 0x14<<7 | 0x2F, 40654 - 19968: jis0208<<14 | 0x52<<7 | 0x34, 40655 - 19968: jis0208<<14 | 0x52<<7 | 0x35, 40656 - 19968: jis0208<<14 | 0x52<<7 | 0x36, 40657 - 19968: jis0208<<14 | 0x5B<<7 | 0x4D, 40658 - 19968: jis0208<<14 | 0x18<<7 | 0x54, 40660 - 19968: jis0208<<14 | 0x52<<7 | 0x37, 40661 - 19968: jis0212<<14 | 0x4B<<7 | 0x53, 40664 - 19968: jis0208<<14 | 0x3F<<7 | 0x33, 40665 - 19968: jis0208<<14 | 0x2B<<7 | 0x3A, 40667 - 19968: jis0208<<14 | 0x21<<7 | 0x42, 40668 - 19968: jis0208<<14 | 0x52<<7 | 0x38, 40669 - 19968: jis0208<<14 | 0x52<<7 | 0x3A, 40670 - 19968: jis0208<<14 | 0x52<<7 | 0x39, 40671 - 19968: jis0212<<14 | 0x4B<<7 | 0x54, 40672 - 19968: jis0208<<14 | 0x52<<7 | 0x3B, 40676 - 19968: jis0212<<14 | 0x4B<<7 | 0x55, 40677 - 19968: jis0208<<14 | 0x52<<7 | 0x3C, 40679 - 19968: jis0212<<14 | 0x4B<<7 | 0x56, 40680 - 19968: jis0208<<14 | 0x52<<7 | 0x3D, 40684 - 19968: jis0212<<14 | 0x4B<<7 | 0x57, 40685 - 19968: jis0212<<14 | 0x4B<<7 | 0x58, 40686 - 19968: jis0212<<14 | 0x4B<<7 | 0x59, 40687 - 19968: jis0208<<14 | 0x52<<7 | 0x3E, 40688 - 19968: jis0212<<14 | 0x4B<<7 | 0x5A, 40689 - 19968: jis0212<<14 | 0x4B<<7 | 0x5B, 40690 - 19968: jis0212<<14 | 0x4B<<7 | 0x5C, 40692 - 19968: jis0208<<14 | 0x52<<7 | 0x3F, 40693 - 19968: jis0212<<14 | 0x4B<<7 | 0x5D, 40694 - 19968: jis0208<<14 | 0x52<<7 | 0x40, 40695 - 19968: jis0208<<14 | 0x52<<7 | 0x41, 40696 - 19968: jis0212<<14 | 0x4C<<7 | 0x00, 40697 - 19968: jis0208<<14 | 0x52<<7 | 0x42, 40699 - 19968: jis0208<<14 | 0x52<<7 | 0x43, 40700 - 19968: jis0208<<14 | 0x52<<7 | 0x44, 40701 - 19968: jis0208<<14 | 0x52<<7 | 0x45, 40703 - 19968: jis0212<<14 | 0x4C<<7 | 0x01, 40706 - 19968: jis0212<<14 | 0x4C<<7 | 0x02, 40707 - 19968: jis0212<<14 | 0x4C<<7 | 0x03, 40711 - 19968: jis0208<<14 | 0x52<<7 | 0x46, 40712 - 19968: jis0208<<14 | 0x52<<7 | 0x47, 40713 - 19968: jis0212<<14 | 0x4C<<7 | 0x04, 40718 - 19968: jis0208<<14 | 0x24<<7 | 0x03, 40719 - 19968: jis0212<<14 | 0x4C<<7 | 0x05, 40720 - 19968: jis0212<<14 | 0x4C<<7 | 0x06, 40721 - 19968: jis0212<<14 | 0x4C<<7 | 0x07, 40722 - 19968: jis0212<<14 | 0x4C<<7 | 0x08, 40723 - 19968: jis0208<<14 | 0x17<<7 | 0x3C, 40724 - 19968: jis0212<<14 | 0x4C<<7 | 0x09, 40725 - 19968: jis0208<<14 | 0x52<<7 | 0x49, 40726 - 19968: jis0212<<14 | 0x4C<<7 | 0x0A, 40727 - 19968: jis0212<<14 | 0x4C<<7 | 0x0B, 40729 - 19968: jis0212<<14 | 0x4C<<7 | 0x0C, 40730 - 19968: jis0212<<14 | 0x4C<<7 | 0x0D, 40731 - 19968: jis0212<<14 | 0x4C<<7 | 0x0E, 40735 - 19968: jis0212<<14 | 0x4C<<7 | 0x0F, 40736 - 19968: jis0208<<14 | 0x20<<7 | 0x2C, 40737 - 19968: jis0208<<14 | 0x52<<7 | 0x4A, 40738 - 19968: jis0212<<14 | 0x4C<<7 | 0x10, 40742 - 19968: jis0212<<14 | 0x4C<<7 | 0x11, 40746 - 19968: jis0212<<14 | 0x4C<<7 | 0x12, 40747 - 19968: jis0212<<14 | 0x4C<<7 | 0x13, 40748 - 19968: jis0208<<14 | 0x52<<7 | 0x4B, 40751 - 19968: jis0212<<14 | 0x4C<<7 | 0x14, 40753 - 19968: jis0212<<14 | 0x4C<<7 | 0x15, 40754 - 19968: jis0212<<14 | 0x4C<<7 | 0x16, 40756 - 19968: jis0212<<14 | 0x4C<<7 | 0x17, 40759 - 19968: jis0212<<14 | 0x4C<<7 | 0x18, 40761 - 19968: jis0212<<14 | 0x4C<<7 | 0x19, 40762 - 19968: jis0212<<14 | 0x4C<<7 | 0x1A, 40763 - 19968: jis0208<<14 | 0x28<<7 | 0x00, 40764 - 19968: jis0212<<14 | 0x4C<<7 | 0x1B, 40765 - 19968: jis0212<<14 | 0x4C<<7 | 0x1C, 40766 - 19968: jis0208<<14 | 0x52<<7 | 0x4C, 40767 - 19968: jis0212<<14 | 0x4C<<7 | 0x1D, 40769 - 19968: jis0212<<14 | 0x4C<<7 | 0x1E, 40771 - 19968: jis0212<<14 | 0x4C<<7 | 0x1F, 40772 - 19968: jis0212<<14 | 0x4C<<7 | 0x20, 40773 - 19968: jis0212<<14 | 0x4C<<7 | 0x21, 40774 - 19968: jis0212<<14 | 0x4C<<7 | 0x22, 40775 - 19968: jis0212<<14 | 0x4C<<7 | 0x23, 40778 - 19968: jis0208<<14 | 0x52<<7 | 0x4D, 40779 - 19968: jis0208<<14 | 0x42<<7 | 0x16, 40782 - 19968: jis0208<<14 | 0x4B<<7 | 0x39, 40783 - 19968: jis0208<<14 | 0x4F<<7 | 0x4C, 40786 - 19968: jis0208<<14 | 0x52<<7 | 0x4E, 40787 - 19968: jis0212<<14 | 0x4C<<7 | 0x24, 40788 - 19968: jis0208<<14 | 0x52<<7 | 0x4F, 40789 - 19968: jis0212<<14 | 0x4C<<7 | 0x25, 40790 - 19968: jis0212<<14 | 0x4C<<7 | 0x26, 40791 - 19968: jis0212<<14 | 0x4C<<7 | 0x27, 40792 - 19968: jis0212<<14 | 0x4C<<7 | 0x28, 40794 - 19968: jis0212<<14 | 0x4C<<7 | 0x29, 40797 - 19968: jis0212<<14 | 0x4C<<7 | 0x2A, 40798 - 19968: jis0212<<14 | 0x4C<<7 | 0x2B, 40799 - 19968: jis0208<<14 | 0x52<<7 | 0x51, 40800 - 19968: jis0208<<14 | 0x52<<7 | 0x52, 40801 - 19968: jis0208<<14 | 0x52<<7 | 0x53, 40802 - 19968: jis0208<<14 | 0x2D<<7 | 0x4F, 40803 - 19968: jis0208<<14 | 0x52<<7 | 0x50, 40806 - 19968: jis0208<<14 | 0x52<<7 | 0x54, 40807 - 19968: jis0208<<14 | 0x52<<7 | 0x55, 40808 - 19968: jis0212<<14 | 0x4C<<7 | 0x2C, 40809 - 19968: jis0212<<14 | 0x4C<<7 | 0x2D, 40810 - 19968: jis0208<<14 | 0x52<<7 | 0x57, 40812 - 19968: jis0208<<14 | 0x52<<7 | 0x56, 40813 - 19968: jis0212<<14 | 0x4C<<7 | 0x2E, 40814 - 19968: jis0212<<14 | 0x4C<<7 | 0x2F, 40815 - 19968: jis0212<<14 | 0x4C<<7 | 0x30, 40816 - 19968: jis0212<<14 | 0x4C<<7 | 0x31, 40817 - 19968: jis0212<<14 | 0x4C<<7 | 0x32, 40818 - 19968: jis0208<<14 | 0x52<<7 | 0x59, 40819 - 19968: jis0212<<14 | 0x4C<<7 | 0x33, 40821 - 19968: jis0212<<14 | 0x4C<<7 | 0x34, 40822 - 19968: jis0208<<14 | 0x52<<7 | 0x5A, 40823 - 19968: jis0208<<14 | 0x52<<7 | 0x58, 40826 - 19968: jis0212<<14 | 0x4C<<7 | 0x35, 40829 - 19968: jis0212<<14 | 0x4C<<7 | 0x36, 40845 - 19968: jis0208<<14 | 0x2D<<7 | 0x15, 40847 - 19968: jis0212<<14 | 0x4C<<7 | 0x37, 40848 - 19968: jis0212<<14 | 0x4C<<7 | 0x38, 40849 - 19968: jis0212<<14 | 0x4C<<7 | 0x39, 40850 - 19968: jis0212<<14 | 0x4C<<7 | 0x3A, 40852 - 19968: jis0212<<14 | 0x4C<<7 | 0x3B, 40853 - 19968: jis0208<<14 | 0x52<<7 | 0x5B, 40854 - 19968: jis0212<<14 | 0x4C<<7 | 0x3C, 40855 - 19968: jis0212<<14 | 0x4C<<7 | 0x3D, 40860 - 19968: jis0208<<14 | 0x52<<7 | 0x5C, 40861 - 19968: jis0208<<14 | 0x42<<7 | 0x33, 40862 - 19968: jis0212<<14 | 0x4C<<7 | 0x3E, 40864 - 19968: jis0208<<14 | 0x52<<7 | 0x5D, 40865 - 19968: jis0212<<14 | 0x4C<<7 | 0x3F, 40866 - 19968: jis0212<<14 | 0x4C<<7 | 0x40, 40867 - 19968: jis0212<<14 | 0x4C<<7 | 0x41, 40869 - 19968: jis0212<<14 | 0x4C<<7 | 0x42, } const encode1Low, encode1High = 8208, 9840 var encode1 = [...]uint16{ 8208 - 8208: jis0208<<14 | 0x00<<7 | 0x1D, 8213 - 8208: jis0208<<14 | 0x00<<7 | 0x1C, 8216 - 8208: jis0208<<14 | 0x00<<7 | 0x25, 8217 - 8208: jis0208<<14 | 0x00<<7 | 0x26, 8220 - 8208: jis0208<<14 | 0x00<<7 | 0x27, 8221 - 8208: jis0208<<14 | 0x00<<7 | 0x28, 8224 - 8208: jis0208<<14 | 0x01<<7 | 0x56, 8225 - 8208: jis0208<<14 | 0x01<<7 | 0x57, 8229 - 8208: jis0208<<14 | 0x00<<7 | 0x24, 8230 - 8208: jis0208<<14 | 0x00<<7 | 0x23, 8240 - 8208: jis0208<<14 | 0x01<<7 | 0x52, 8242 - 8208: jis0208<<14 | 0x00<<7 | 0x4B, 8243 - 8208: jis0208<<14 | 0x00<<7 | 0x4C, 8251 - 8208: jis0208<<14 | 0x01<<7 | 0x07, 8451 - 8208: jis0208<<14 | 0x00<<7 | 0x4D, 8470 - 8208: jis0208<<14 | 0x0C<<7 | 0x41, 8481 - 8208: jis0208<<14 | 0x0C<<7 | 0x43, 8482 - 8208: jis0212<<14 | 0x01<<7 | 0x4E, 8491 - 8208: jis0208<<14 | 0x01<<7 | 0x51, 8544 - 8208: jis0208<<14 | 0x0C<<7 | 0x14, 8545 - 8208: jis0208<<14 | 0x0C<<7 | 0x15, 8546 - 8208: jis0208<<14 | 0x0C<<7 | 0x16, 8547 - 8208: jis0208<<14 | 0x0C<<7 | 0x17, 8548 - 8208: jis0208<<14 | 0x0C<<7 | 0x18, 8549 - 8208: jis0208<<14 | 0x0C<<7 | 0x19, 8550 - 8208: jis0208<<14 | 0x0C<<7 | 0x1A, 8551 - 8208: jis0208<<14 | 0x0C<<7 | 0x1B, 8552 - 8208: jis0208<<14 | 0x0C<<7 | 0x1C, 8553 - 8208: jis0208<<14 | 0x0C<<7 | 0x1D, 8560 - 8208: jis0208<<14 | 0x5B<<7 | 0x50, 8561 - 8208: jis0208<<14 | 0x5B<<7 | 0x51, 8562 - 8208: jis0208<<14 | 0x5B<<7 | 0x52, 8563 - 8208: jis0208<<14 | 0x5B<<7 | 0x53, 8564 - 8208: jis0208<<14 | 0x5B<<7 | 0x54, 8565 - 8208: jis0208<<14 | 0x5B<<7 | 0x55, 8566 - 8208: jis0208<<14 | 0x5B<<7 | 0x56, 8567 - 8208: jis0208<<14 | 0x5B<<7 | 0x57, 8568 - 8208: jis0208<<14 | 0x5B<<7 | 0x58, 8569 - 8208: jis0208<<14 | 0x5B<<7 | 0x59, 8592 - 8208: jis0208<<14 | 0x01<<7 | 0x0A, 8593 - 8208: jis0208<<14 | 0x01<<7 | 0x0B, 8594 - 8208: jis0208<<14 | 0x01<<7 | 0x09, 8595 - 8208: jis0208<<14 | 0x01<<7 | 0x0C, 8658 - 8208: jis0208<<14 | 0x01<<7 | 0x2C, 8660 - 8208: jis0208<<14 | 0x01<<7 | 0x2D, 8704 - 8208: jis0208<<14 | 0x01<<7 | 0x2E, 8706 - 8208: jis0208<<14 | 0x01<<7 | 0x3E, 8707 - 8208: jis0208<<14 | 0x01<<7 | 0x2F, 8711 - 8208: jis0208<<14 | 0x01<<7 | 0x3F, 8712 - 8208: jis0208<<14 | 0x01<<7 | 0x19, 8715 - 8208: jis0208<<14 | 0x01<<7 | 0x1A, 8721 - 8208: jis0208<<14 | 0x0C<<7 | 0x53, 8730 - 8208: jis0208<<14 | 0x01<<7 | 0x44, 8733 - 8208: jis0208<<14 | 0x01<<7 | 0x46, 8734 - 8208: jis0208<<14 | 0x00<<7 | 0x46, 8735 - 8208: jis0208<<14 | 0x0C<<7 | 0x57, 8736 - 8208: jis0208<<14 | 0x01<<7 | 0x3B, 8741 - 8208: jis0208<<14 | 0x00<<7 | 0x21, 8743 - 8208: jis0208<<14 | 0x01<<7 | 0x29, 8744 - 8208: jis0208<<14 | 0x01<<7 | 0x2A, 8745 - 8208: jis0208<<14 | 0x01<<7 | 0x20, 8746 - 8208: jis0208<<14 | 0x01<<7 | 0x1F, 8747 - 8208: jis0208<<14 | 0x01<<7 | 0x48, 8748 - 8208: jis0208<<14 | 0x01<<7 | 0x49, 8750 - 8208: jis0208<<14 | 0x0C<<7 | 0x52, 8756 - 8208: jis0208<<14 | 0x00<<7 | 0x47, 8757 - 8208: jis0208<<14 | 0x01<<7 | 0x47, 8765 - 8208: jis0208<<14 | 0x01<<7 | 0x45, 8786 - 8208: jis0208<<14 | 0x01<<7 | 0x41, 8800 - 8208: jis0208<<14 | 0x00<<7 | 0x41, 8801 - 8208: jis0208<<14 | 0x01<<7 | 0x40, 8806 - 8208: jis0208<<14 | 0x00<<7 | 0x44, 8807 - 8208: jis0208<<14 | 0x00<<7 | 0x45, 8810 - 8208: jis0208<<14 | 0x01<<7 | 0x42, 8811 - 8208: jis0208<<14 | 0x01<<7 | 0x43, 8834 - 8208: jis0208<<14 | 0x01<<7 | 0x1D, 8835 - 8208: jis0208<<14 | 0x01<<7 | 0x1E, 8838 - 8208: jis0208<<14 | 0x01<<7 | 0x1B, 8839 - 8208: jis0208<<14 | 0x01<<7 | 0x1C, 8869 - 8208: jis0208<<14 | 0x01<<7 | 0x3C, 8895 - 8208: jis0208<<14 | 0x0C<<7 | 0x58, 8978 - 8208: jis0208<<14 | 0x01<<7 | 0x3D, 9312 - 8208: jis0208<<14 | 0x0C<<7 | 0x00, 9313 - 8208: jis0208<<14 | 0x0C<<7 | 0x01, 9314 - 8208: jis0208<<14 | 0x0C<<7 | 0x02, 9315 - 8208: jis0208<<14 | 0x0C<<7 | 0x03, 9316 - 8208: jis0208<<14 | 0x0C<<7 | 0x04, 9317 - 8208: jis0208<<14 | 0x0C<<7 | 0x05, 9318 - 8208: jis0208<<14 | 0x0C<<7 | 0x06, 9319 - 8208: jis0208<<14 | 0x0C<<7 | 0x07, 9320 - 8208: jis0208<<14 | 0x0C<<7 | 0x08, 9321 - 8208: jis0208<<14 | 0x0C<<7 | 0x09, 9322 - 8208: jis0208<<14 | 0x0C<<7 | 0x0A, 9323 - 8208: jis0208<<14 | 0x0C<<7 | 0x0B, 9324 - 8208: jis0208<<14 | 0x0C<<7 | 0x0C, 9325 - 8208: jis0208<<14 | 0x0C<<7 | 0x0D, 9326 - 8208: jis0208<<14 | 0x0C<<7 | 0x0E, 9327 - 8208: jis0208<<14 | 0x0C<<7 | 0x0F, 9328 - 8208: jis0208<<14 | 0x0C<<7 | 0x10, 9329 - 8208: jis0208<<14 | 0x0C<<7 | 0x11, 9330 - 8208: jis0208<<14 | 0x0C<<7 | 0x12, 9331 - 8208: jis0208<<14 | 0x0C<<7 | 0x13, 9472 - 8208: jis0208<<14 | 0x07<<7 | 0x00, 9473 - 8208: jis0208<<14 | 0x07<<7 | 0x0B, 9474 - 8208: jis0208<<14 | 0x07<<7 | 0x01, 9475 - 8208: jis0208<<14 | 0x07<<7 | 0x0C, 9484 - 8208: jis0208<<14 | 0x07<<7 | 0x02, 9487 - 8208: jis0208<<14 | 0x07<<7 | 0x0D, 9488 - 8208: jis0208<<14 | 0x07<<7 | 0x03, 9491 - 8208: jis0208<<14 | 0x07<<7 | 0x0E, 9492 - 8208: jis0208<<14 | 0x07<<7 | 0x05, 9495 - 8208: jis0208<<14 | 0x07<<7 | 0x10, 9496 - 8208: jis0208<<14 | 0x07<<7 | 0x04, 9499 - 8208: jis0208<<14 | 0x07<<7 | 0x0F, 9500 - 8208: jis0208<<14 | 0x07<<7 | 0x06, 9501 - 8208: jis0208<<14 | 0x07<<7 | 0x1B, 9504 - 8208: jis0208<<14 | 0x07<<7 | 0x16, 9507 - 8208: jis0208<<14 | 0x07<<7 | 0x11, 9508 - 8208: jis0208<<14 | 0x07<<7 | 0x08, 9509 - 8208: jis0208<<14 | 0x07<<7 | 0x1D, 9512 - 8208: jis0208<<14 | 0x07<<7 | 0x18, 9515 - 8208: jis0208<<14 | 0x07<<7 | 0x13, 9516 - 8208: jis0208<<14 | 0x07<<7 | 0x07, 9519 - 8208: jis0208<<14 | 0x07<<7 | 0x17, 9520 - 8208: jis0208<<14 | 0x07<<7 | 0x1C, 9523 - 8208: jis0208<<14 | 0x07<<7 | 0x12, 9524 - 8208: jis0208<<14 | 0x07<<7 | 0x09, 9527 - 8208: jis0208<<14 | 0x07<<7 | 0x19, 9528 - 8208: jis0208<<14 | 0x07<<7 | 0x1E, 9531 - 8208: jis0208<<14 | 0x07<<7 | 0x14, 9532 - 8208: jis0208<<14 | 0x07<<7 | 0x0A, 9535 - 8208: jis0208<<14 | 0x07<<7 | 0x1A, 9538 - 8208: jis0208<<14 | 0x07<<7 | 0x1F, 9547 - 8208: jis0208<<14 | 0x07<<7 | 0x15, 9632 - 8208: jis0208<<14 | 0x01<<7 | 0x02, 9633 - 8208: jis0208<<14 | 0x01<<7 | 0x01, 9650 - 8208: jis0208<<14 | 0x01<<7 | 0x04, 9651 - 8208: jis0208<<14 | 0x01<<7 | 0x03, 9660 - 8208: jis0208<<14 | 0x01<<7 | 0x06, 9661 - 8208: jis0208<<14 | 0x01<<7 | 0x05, 9670 - 8208: jis0208<<14 | 0x01<<7 | 0x00, 9671 - 8208: jis0208<<14 | 0x00<<7 | 0x5D, 9675 - 8208: jis0208<<14 | 0x00<<7 | 0x5A, 9678 - 8208: jis0208<<14 | 0x00<<7 | 0x5C, 9679 - 8208: jis0208<<14 | 0x00<<7 | 0x5B, 9711 - 8208: jis0208<<14 | 0x01<<7 | 0x5D, 9733 - 8208: jis0208<<14 | 0x00<<7 | 0x59, 9734 - 8208: jis0208<<14 | 0x00<<7 | 0x58, 9792 - 8208: jis0208<<14 | 0x00<<7 | 0x49, 9794 - 8208: jis0208<<14 | 0x00<<7 | 0x48, 9834 - 8208: jis0208<<14 | 0x01<<7 | 0x55, 9837 - 8208: jis0208<<14 | 0x01<<7 | 0x54, 9839 - 8208: jis0208<<14 | 0x01<<7 | 0x53, } const encode2Low, encode2High = 12288, 13262 var encode2 = [...]uint16{ 12288 - 12288: jis0208<<14 | 0x00<<7 | 0x00, 12289 - 12288: jis0208<<14 | 0x00<<7 | 0x01, 12290 - 12288: jis0208<<14 | 0x00<<7 | 0x02, 12291 - 12288: jis0208<<14 | 0x00<<7 | 0x16, 12293 - 12288: jis0208<<14 | 0x00<<7 | 0x18, 12294 - 12288: jis0208<<14 | 0x00<<7 | 0x19, 12295 - 12288: jis0208<<14 | 0x00<<7 | 0x1A, 12296 - 12288: jis0208<<14 | 0x00<<7 | 0x31, 12297 - 12288: jis0208<<14 | 0x00<<7 | 0x32, 12298 - 12288: jis0208<<14 | 0x00<<7 | 0x33, 12299 - 12288: jis0208<<14 | 0x00<<7 | 0x34, 12300 - 12288: jis0208<<14 | 0x00<<7 | 0x35, 12301 - 12288: jis0208<<14 | 0x00<<7 | 0x36, 12302 - 12288: jis0208<<14 | 0x00<<7 | 0x37, 12303 - 12288: jis0208<<14 | 0x00<<7 | 0x38, 12304 - 12288: jis0208<<14 | 0x00<<7 | 0x39, 12305 - 12288: jis0208<<14 | 0x00<<7 | 0x3A, 12306 - 12288: jis0208<<14 | 0x01<<7 | 0x08, 12307 - 12288: jis0208<<14 | 0x01<<7 | 0x0D, 12308 - 12288: jis0208<<14 | 0x00<<7 | 0x2B, 12309 - 12288: jis0208<<14 | 0x00<<7 | 0x2C, 12317 - 12288: jis0208<<14 | 0x0C<<7 | 0x3F, 12319 - 12288: jis0208<<14 | 0x0C<<7 | 0x40, 12353 - 12288: jis0208<<14 | 0x03<<7 | 0x00, 12354 - 12288: jis0208<<14 | 0x03<<7 | 0x01, 12355 - 12288: jis0208<<14 | 0x03<<7 | 0x02, 12356 - 12288: jis0208<<14 | 0x03<<7 | 0x03, 12357 - 12288: jis0208<<14 | 0x03<<7 | 0x04, 12358 - 12288: jis0208<<14 | 0x03<<7 | 0x05, 12359 - 12288: jis0208<<14 | 0x03<<7 | 0x06, 12360 - 12288: jis0208<<14 | 0x03<<7 | 0x07, 12361 - 12288: jis0208<<14 | 0x03<<7 | 0x08, 12362 - 12288: jis0208<<14 | 0x03<<7 | 0x09, 12363 - 12288: jis0208<<14 | 0x03<<7 | 0x0A, 12364 - 12288: jis0208<<14 | 0x03<<7 | 0x0B, 12365 - 12288: jis0208<<14 | 0x03<<7 | 0x0C, 12366 - 12288: jis0208<<14 | 0x03<<7 | 0x0D, 12367 - 12288: jis0208<<14 | 0x03<<7 | 0x0E, 12368 - 12288: jis0208<<14 | 0x03<<7 | 0x0F, 12369 - 12288: jis0208<<14 | 0x03<<7 | 0x10, 12370 - 12288: jis0208<<14 | 0x03<<7 | 0x11, 12371 - 12288: jis0208<<14 | 0x03<<7 | 0x12, 12372 - 12288: jis0208<<14 | 0x03<<7 | 0x13, 12373 - 12288: jis0208<<14 | 0x03<<7 | 0x14, 12374 - 12288: jis0208<<14 | 0x03<<7 | 0x15, 12375 - 12288: jis0208<<14 | 0x03<<7 | 0x16, 12376 - 12288: jis0208<<14 | 0x03<<7 | 0x17, 12377 - 12288: jis0208<<14 | 0x03<<7 | 0x18, 12378 - 12288: jis0208<<14 | 0x03<<7 | 0x19, 12379 - 12288: jis0208<<14 | 0x03<<7 | 0x1A, 12380 - 12288: jis0208<<14 | 0x03<<7 | 0x1B, 12381 - 12288: jis0208<<14 | 0x03<<7 | 0x1C, 12382 - 12288: jis0208<<14 | 0x03<<7 | 0x1D, 12383 - 12288: jis0208<<14 | 0x03<<7 | 0x1E, 12384 - 12288: jis0208<<14 | 0x03<<7 | 0x1F, 12385 - 12288: jis0208<<14 | 0x03<<7 | 0x20, 12386 - 12288: jis0208<<14 | 0x03<<7 | 0x21, 12387 - 12288: jis0208<<14 | 0x03<<7 | 0x22, 12388 - 12288: jis0208<<14 | 0x03<<7 | 0x23, 12389 - 12288: jis0208<<14 | 0x03<<7 | 0x24, 12390 - 12288: jis0208<<14 | 0x03<<7 | 0x25, 12391 - 12288: jis0208<<14 | 0x03<<7 | 0x26, 12392 - 12288: jis0208<<14 | 0x03<<7 | 0x27, 12393 - 12288: jis0208<<14 | 0x03<<7 | 0x28, 12394 - 12288: jis0208<<14 | 0x03<<7 | 0x29, 12395 - 12288: jis0208<<14 | 0x03<<7 | 0x2A, 12396 - 12288: jis0208<<14 | 0x03<<7 | 0x2B, 12397 - 12288: jis0208<<14 | 0x03<<7 | 0x2C, 12398 - 12288: jis0208<<14 | 0x03<<7 | 0x2D, 12399 - 12288: jis0208<<14 | 0x03<<7 | 0x2E, 12400 - 12288: jis0208<<14 | 0x03<<7 | 0x2F, 12401 - 12288: jis0208<<14 | 0x03<<7 | 0x30, 12402 - 12288: jis0208<<14 | 0x03<<7 | 0x31, 12403 - 12288: jis0208<<14 | 0x03<<7 | 0x32, 12404 - 12288: jis0208<<14 | 0x03<<7 | 0x33, 12405 - 12288: jis0208<<14 | 0x03<<7 | 0x34, 12406 - 12288: jis0208<<14 | 0x03<<7 | 0x35, 12407 - 12288: jis0208<<14 | 0x03<<7 | 0x36, 12408 - 12288: jis0208<<14 | 0x03<<7 | 0x37, 12409 - 12288: jis0208<<14 | 0x03<<7 | 0x38, 12410 - 12288: jis0208<<14 | 0x03<<7 | 0x39, 12411 - 12288: jis0208<<14 | 0x03<<7 | 0x3A, 12412 - 12288: jis0208<<14 | 0x03<<7 | 0x3B, 12413 - 12288: jis0208<<14 | 0x03<<7 | 0x3C, 12414 - 12288: jis0208<<14 | 0x03<<7 | 0x3D, 12415 - 12288: jis0208<<14 | 0x03<<7 | 0x3E, 12416 - 12288: jis0208<<14 | 0x03<<7 | 0x3F, 12417 - 12288: jis0208<<14 | 0x03<<7 | 0x40, 12418 - 12288: jis0208<<14 | 0x03<<7 | 0x41, 12419 - 12288: jis0208<<14 | 0x03<<7 | 0x42, 12420 - 12288: jis0208<<14 | 0x03<<7 | 0x43, 12421 - 12288: jis0208<<14 | 0x03<<7 | 0x44, 12422 - 12288: jis0208<<14 | 0x03<<7 | 0x45, 12423 - 12288: jis0208<<14 | 0x03<<7 | 0x46, 12424 - 12288: jis0208<<14 | 0x03<<7 | 0x47, 12425 - 12288: jis0208<<14 | 0x03<<7 | 0x48, 12426 - 12288: jis0208<<14 | 0x03<<7 | 0x49, 12427 - 12288: jis0208<<14 | 0x03<<7 | 0x4A, 12428 - 12288: jis0208<<14 | 0x03<<7 | 0x4B, 12429 - 12288: jis0208<<14 | 0x03<<7 | 0x4C, 12430 - 12288: jis0208<<14 | 0x03<<7 | 0x4D, 12431 - 12288: jis0208<<14 | 0x03<<7 | 0x4E, 12432 - 12288: jis0208<<14 | 0x03<<7 | 0x4F, 12433 - 12288: jis0208<<14 | 0x03<<7 | 0x50, 12434 - 12288: jis0208<<14 | 0x03<<7 | 0x51, 12435 - 12288: jis0208<<14 | 0x03<<7 | 0x52, 12443 - 12288: jis0208<<14 | 0x00<<7 | 0x0A, 12444 - 12288: jis0208<<14 | 0x00<<7 | 0x0B, 12445 - 12288: jis0208<<14 | 0x00<<7 | 0x14, 12446 - 12288: jis0208<<14 | 0x00<<7 | 0x15, 12449 - 12288: jis0208<<14 | 0x04<<7 | 0x00, 12450 - 12288: jis0208<<14 | 0x04<<7 | 0x01, 12451 - 12288: jis0208<<14 | 0x04<<7 | 0x02, 12452 - 12288: jis0208<<14 | 0x04<<7 | 0x03, 12453 - 12288: jis0208<<14 | 0x04<<7 | 0x04, 12454 - 12288: jis0208<<14 | 0x04<<7 | 0x05, 12455 - 12288: jis0208<<14 | 0x04<<7 | 0x06, 12456 - 12288: jis0208<<14 | 0x04<<7 | 0x07, 12457 - 12288: jis0208<<14 | 0x04<<7 | 0x08, 12458 - 12288: jis0208<<14 | 0x04<<7 | 0x09, 12459 - 12288: jis0208<<14 | 0x04<<7 | 0x0A, 12460 - 12288: jis0208<<14 | 0x04<<7 | 0x0B, 12461 - 12288: jis0208<<14 | 0x04<<7 | 0x0C, 12462 - 12288: jis0208<<14 | 0x04<<7 | 0x0D, 12463 - 12288: jis0208<<14 | 0x04<<7 | 0x0E, 12464 - 12288: jis0208<<14 | 0x04<<7 | 0x0F, 12465 - 12288: jis0208<<14 | 0x04<<7 | 0x10, 12466 - 12288: jis0208<<14 | 0x04<<7 | 0x11, 12467 - 12288: jis0208<<14 | 0x04<<7 | 0x12, 12468 - 12288: jis0208<<14 | 0x04<<7 | 0x13, 12469 - 12288: jis0208<<14 | 0x04<<7 | 0x14, 12470 - 12288: jis0208<<14 | 0x04<<7 | 0x15, 12471 - 12288: jis0208<<14 | 0x04<<7 | 0x16, 12472 - 12288: jis0208<<14 | 0x04<<7 | 0x17, 12473 - 12288: jis0208<<14 | 0x04<<7 | 0x18, 12474 - 12288: jis0208<<14 | 0x04<<7 | 0x19, 12475 - 12288: jis0208<<14 | 0x04<<7 | 0x1A, 12476 - 12288: jis0208<<14 | 0x04<<7 | 0x1B, 12477 - 12288: jis0208<<14 | 0x04<<7 | 0x1C, 12478 - 12288: jis0208<<14 | 0x04<<7 | 0x1D, 12479 - 12288: jis0208<<14 | 0x04<<7 | 0x1E, 12480 - 12288: jis0208<<14 | 0x04<<7 | 0x1F, 12481 - 12288: jis0208<<14 | 0x04<<7 | 0x20, 12482 - 12288: jis0208<<14 | 0x04<<7 | 0x21, 12483 - 12288: jis0208<<14 | 0x04<<7 | 0x22, 12484 - 12288: jis0208<<14 | 0x04<<7 | 0x23, 12485 - 12288: jis0208<<14 | 0x04<<7 | 0x24, 12486 - 12288: jis0208<<14 | 0x04<<7 | 0x25, 12487 - 12288: jis0208<<14 | 0x04<<7 | 0x26, 12488 - 12288: jis0208<<14 | 0x04<<7 | 0x27, 12489 - 12288: jis0208<<14 | 0x04<<7 | 0x28, 12490 - 12288: jis0208<<14 | 0x04<<7 | 0x29, 12491 - 12288: jis0208<<14 | 0x04<<7 | 0x2A, 12492 - 12288: jis0208<<14 | 0x04<<7 | 0x2B, 12493 - 12288: jis0208<<14 | 0x04<<7 | 0x2C, 12494 - 12288: jis0208<<14 | 0x04<<7 | 0x2D, 12495 - 12288: jis0208<<14 | 0x04<<7 | 0x2E, 12496 - 12288: jis0208<<14 | 0x04<<7 | 0x2F, 12497 - 12288: jis0208<<14 | 0x04<<7 | 0x30, 12498 - 12288: jis0208<<14 | 0x04<<7 | 0x31, 12499 - 12288: jis0208<<14 | 0x04<<7 | 0x32, 12500 - 12288: jis0208<<14 | 0x04<<7 | 0x33, 12501 - 12288: jis0208<<14 | 0x04<<7 | 0x34, 12502 - 12288: jis0208<<14 | 0x04<<7 | 0x35, 12503 - 12288: jis0208<<14 | 0x04<<7 | 0x36, 12504 - 12288: jis0208<<14 | 0x04<<7 | 0x37, 12505 - 12288: jis0208<<14 | 0x04<<7 | 0x38, 12506 - 12288: jis0208<<14 | 0x04<<7 | 0x39, 12507 - 12288: jis0208<<14 | 0x04<<7 | 0x3A, 12508 - 12288: jis0208<<14 | 0x04<<7 | 0x3B, 12509 - 12288: jis0208<<14 | 0x04<<7 | 0x3C, 12510 - 12288: jis0208<<14 | 0x04<<7 | 0x3D, 12511 - 12288: jis0208<<14 | 0x04<<7 | 0x3E, 12512 - 12288: jis0208<<14 | 0x04<<7 | 0x3F, 12513 - 12288: jis0208<<14 | 0x04<<7 | 0x40, 12514 - 12288: jis0208<<14 | 0x04<<7 | 0x41, 12515 - 12288: jis0208<<14 | 0x04<<7 | 0x42, 12516 - 12288: jis0208<<14 | 0x04<<7 | 0x43, 12517 - 12288: jis0208<<14 | 0x04<<7 | 0x44, 12518 - 12288: jis0208<<14 | 0x04<<7 | 0x45, 12519 - 12288: jis0208<<14 | 0x04<<7 | 0x46, 12520 - 12288: jis0208<<14 | 0x04<<7 | 0x47, 12521 - 12288: jis0208<<14 | 0x04<<7 | 0x48, 12522 - 12288: jis0208<<14 | 0x04<<7 | 0x49, 12523 - 12288: jis0208<<14 | 0x04<<7 | 0x4A, 12524 - 12288: jis0208<<14 | 0x04<<7 | 0x4B, 12525 - 12288: jis0208<<14 | 0x04<<7 | 0x4C, 12526 - 12288: jis0208<<14 | 0x04<<7 | 0x4D, 12527 - 12288: jis0208<<14 | 0x04<<7 | 0x4E, 12528 - 12288: jis0208<<14 | 0x04<<7 | 0x4F, 12529 - 12288: jis0208<<14 | 0x04<<7 | 0x50, 12530 - 12288: jis0208<<14 | 0x04<<7 | 0x51, 12531 - 12288: jis0208<<14 | 0x04<<7 | 0x52, 12532 - 12288: jis0208<<14 | 0x04<<7 | 0x53, 12533 - 12288: jis0208<<14 | 0x04<<7 | 0x54, 12534 - 12288: jis0208<<14 | 0x04<<7 | 0x55, 12539 - 12288: jis0208<<14 | 0x00<<7 | 0x05, 12540 - 12288: jis0208<<14 | 0x00<<7 | 0x1B, 12541 - 12288: jis0208<<14 | 0x00<<7 | 0x12, 12542 - 12288: jis0208<<14 | 0x00<<7 | 0x13, 12849 - 12288: jis0208<<14 | 0x0C<<7 | 0x49, 12850 - 12288: jis0208<<14 | 0x0C<<7 | 0x4A, 12857 - 12288: jis0208<<14 | 0x0C<<7 | 0x4B, 12964 - 12288: jis0208<<14 | 0x0C<<7 | 0x44, 12965 - 12288: jis0208<<14 | 0x0C<<7 | 0x45, 12966 - 12288: jis0208<<14 | 0x0C<<7 | 0x46, 12967 - 12288: jis0208<<14 | 0x0C<<7 | 0x47, 12968 - 12288: jis0208<<14 | 0x0C<<7 | 0x48, 13059 - 12288: jis0208<<14 | 0x0C<<7 | 0x25, 13069 - 12288: jis0208<<14 | 0x0C<<7 | 0x29, 13076 - 12288: jis0208<<14 | 0x0C<<7 | 0x20, 13080 - 12288: jis0208<<14 | 0x0C<<7 | 0x23, 13090 - 12288: jis0208<<14 | 0x0C<<7 | 0x21, 13091 - 12288: jis0208<<14 | 0x0C<<7 | 0x2B, 13094 - 12288: jis0208<<14 | 0x0C<<7 | 0x2A, 13095 - 12288: jis0208<<14 | 0x0C<<7 | 0x24, 13099 - 12288: jis0208<<14 | 0x0C<<7 | 0x2C, 13110 - 12288: jis0208<<14 | 0x0C<<7 | 0x26, 13115 - 12288: jis0208<<14 | 0x0C<<7 | 0x2E, 13129 - 12288: jis0208<<14 | 0x0C<<7 | 0x1F, 13130 - 12288: jis0208<<14 | 0x0C<<7 | 0x2D, 13133 - 12288: jis0208<<14 | 0x0C<<7 | 0x22, 13137 - 12288: jis0208<<14 | 0x0C<<7 | 0x27, 13143 - 12288: jis0208<<14 | 0x0C<<7 | 0x28, 13179 - 12288: jis0208<<14 | 0x0C<<7 | 0x3E, 13180 - 12288: jis0208<<14 | 0x0C<<7 | 0x4E, 13181 - 12288: jis0208<<14 | 0x0C<<7 | 0x4D, 13182 - 12288: jis0208<<14 | 0x0C<<7 | 0x4C, 13198 - 12288: jis0208<<14 | 0x0C<<7 | 0x32, 13199 - 12288: jis0208<<14 | 0x0C<<7 | 0x33, 13212 - 12288: jis0208<<14 | 0x0C<<7 | 0x2F, 13213 - 12288: jis0208<<14 | 0x0C<<7 | 0x30, 13214 - 12288: jis0208<<14 | 0x0C<<7 | 0x31, 13217 - 12288: jis0208<<14 | 0x0C<<7 | 0x35, 13252 - 12288: jis0208<<14 | 0x0C<<7 | 0x34, 13261 - 12288: jis0208<<14 | 0x0C<<7 | 0x42, } const encode3Low, encode3High = 161, 1120 var encode3 = [...]uint16{ 161 - 161: jis0212<<14 | 0x01<<7 | 0x21, 164 - 161: jis0212<<14 | 0x01<<7 | 0x4F, 166 - 161: jis0212<<14 | 0x01<<7 | 0x22, 167 - 161: jis0208<<14 | 0x00<<7 | 0x57, 168 - 161: jis0208<<14 | 0x00<<7 | 0x0E, 169 - 161: jis0212<<14 | 0x01<<7 | 0x4C, 170 - 161: jis0212<<14 | 0x01<<7 | 0x4B, 174 - 161: jis0212<<14 | 0x01<<7 | 0x4D, 175 - 161: jis0212<<14 | 0x01<<7 | 0x13, 176 - 161: jis0208<<14 | 0x00<<7 | 0x4A, 177 - 161: jis0208<<14 | 0x00<<7 | 0x3D, 180 - 161: jis0208<<14 | 0x00<<7 | 0x0C, 182 - 161: jis0208<<14 | 0x01<<7 | 0x58, 184 - 161: jis0212<<14 | 0x01<<7 | 0x10, 186 - 161: jis0212<<14 | 0x01<<7 | 0x4A, 191 - 161: jis0212<<14 | 0x01<<7 | 0x23, 192 - 161: jis0212<<14 | 0x09<<7 | 0x01, 193 - 161: jis0212<<14 | 0x09<<7 | 0x00, 194 - 161: jis0212<<14 | 0x09<<7 | 0x03, 195 - 161: jis0212<<14 | 0x09<<7 | 0x09, 196 - 161: jis0212<<14 | 0x09<<7 | 0x02, 197 - 161: jis0212<<14 | 0x09<<7 | 0x08, 198 - 161: jis0212<<14 | 0x08<<7 | 0x00, 199 - 161: jis0212<<14 | 0x09<<7 | 0x0D, 200 - 161: jis0212<<14 | 0x09<<7 | 0x11, 201 - 161: jis0212<<14 | 0x09<<7 | 0x10, 202 - 161: jis0212<<14 | 0x09<<7 | 0x13, 203 - 161: jis0212<<14 | 0x09<<7 | 0x12, 204 - 161: jis0212<<14 | 0x09<<7 | 0x1F, 205 - 161: jis0212<<14 | 0x09<<7 | 0x1E, 206 - 161: jis0212<<14 | 0x09<<7 | 0x21, 207 - 161: jis0212<<14 | 0x09<<7 | 0x20, 209 - 161: jis0212<<14 | 0x09<<7 | 0x2F, 210 - 161: jis0212<<14 | 0x09<<7 | 0x31, 211 - 161: jis0212<<14 | 0x09<<7 | 0x30, 212 - 161: jis0212<<14 | 0x09<<7 | 0x33, 213 - 161: jis0212<<14 | 0x09<<7 | 0x37, 214 - 161: jis0212<<14 | 0x09<<7 | 0x32, 215 - 161: jis0208<<14 | 0x00<<7 | 0x3E, 216 - 161: jis0212<<14 | 0x08<<7 | 0x0B, 217 - 161: jis0212<<14 | 0x09<<7 | 0x42, 218 - 161: jis0212<<14 | 0x09<<7 | 0x41, 219 - 161: jis0212<<14 | 0x09<<7 | 0x44, 220 - 161: jis0212<<14 | 0x09<<7 | 0x43, 221 - 161: jis0212<<14 | 0x09<<7 | 0x51, 222 - 161: jis0212<<14 | 0x08<<7 | 0x0F, 223 - 161: jis0212<<14 | 0x08<<7 | 0x2D, 224 - 161: jis0212<<14 | 0x0A<<7 | 0x01, 225 - 161: jis0212<<14 | 0x0A<<7 | 0x00, 226 - 161: jis0212<<14 | 0x0A<<7 | 0x03, 227 - 161: jis0212<<14 | 0x0A<<7 | 0x09, 228 - 161: jis0212<<14 | 0x0A<<7 | 0x02, 229 - 161: jis0212<<14 | 0x0A<<7 | 0x08, 230 - 161: jis0212<<14 | 0x08<<7 | 0x20, 231 - 161: jis0212<<14 | 0x0A<<7 | 0x0D, 232 - 161: jis0212<<14 | 0x0A<<7 | 0x11, 233 - 161: jis0212<<14 | 0x0A<<7 | 0x10, 234 - 161: jis0212<<14 | 0x0A<<7 | 0x13, 235 - 161: jis0212<<14 | 0x0A<<7 | 0x12, 236 - 161: jis0212<<14 | 0x0A<<7 | 0x1F, 237 - 161: jis0212<<14 | 0x0A<<7 | 0x1E, 238 - 161: jis0212<<14 | 0x0A<<7 | 0x21, 239 - 161: jis0212<<14 | 0x0A<<7 | 0x20, 240 - 161: jis0212<<14 | 0x08<<7 | 0x22, 241 - 161: jis0212<<14 | 0x0A<<7 | 0x2F, 242 - 161: jis0212<<14 | 0x0A<<7 | 0x31, 243 - 161: jis0212<<14 | 0x0A<<7 | 0x30, 244 - 161: jis0212<<14 | 0x0A<<7 | 0x33, 245 - 161: jis0212<<14 | 0x0A<<7 | 0x37, 246 - 161: jis0212<<14 | 0x0A<<7 | 0x32, 247 - 161: jis0208<<14 | 0x00<<7 | 0x3F, 248 - 161: jis0212<<14 | 0x08<<7 | 0x2B, 249 - 161: jis0212<<14 | 0x0A<<7 | 0x42, 250 - 161: jis0212<<14 | 0x0A<<7 | 0x41, 251 - 161: jis0212<<14 | 0x0A<<7 | 0x44, 252 - 161: jis0212<<14 | 0x0A<<7 | 0x43, 253 - 161: jis0212<<14 | 0x0A<<7 | 0x51, 254 - 161: jis0212<<14 | 0x08<<7 | 0x2F, 255 - 161: jis0212<<14 | 0x0A<<7 | 0x52, 256 - 161: jis0212<<14 | 0x09<<7 | 0x06, 257 - 161: jis0212<<14 | 0x0A<<7 | 0x06, 258 - 161: jis0212<<14 | 0x09<<7 | 0x04, 259 - 161: jis0212<<14 | 0x0A<<7 | 0x04, 260 - 161: jis0212<<14 | 0x09<<7 | 0x07, 261 - 161: jis0212<<14 | 0x0A<<7 | 0x07, 262 - 161: jis0212<<14 | 0x09<<7 | 0x0A, 263 - 161: jis0212<<14 | 0x0A<<7 | 0x0A, 264 - 161: jis0212<<14 | 0x09<<7 | 0x0B, 265 - 161: jis0212<<14 | 0x0A<<7 | 0x0B, 266 - 161: jis0212<<14 | 0x09<<7 | 0x0E, 267 - 161: jis0212<<14 | 0x0A<<7 | 0x0E, 268 - 161: jis0212<<14 | 0x09<<7 | 0x0C, 269 - 161: jis0212<<14 | 0x0A<<7 | 0x0C, 270 - 161: jis0212<<14 | 0x09<<7 | 0x0F, 271 - 161: jis0212<<14 | 0x0A<<7 | 0x0F, 272 - 161: jis0212<<14 | 0x08<<7 | 0x01, 273 - 161: jis0212<<14 | 0x08<<7 | 0x21, 274 - 161: jis0212<<14 | 0x09<<7 | 0x16, 275 - 161: jis0212<<14 | 0x0A<<7 | 0x16, 278 - 161: jis0212<<14 | 0x09<<7 | 0x15, 279 - 161: jis0212<<14 | 0x0A<<7 | 0x15, 280 - 161: jis0212<<14 | 0x09<<7 | 0x17, 281 - 161: jis0212<<14 | 0x0A<<7 | 0x17, 282 - 161: jis0212<<14 | 0x09<<7 | 0x14, 283 - 161: jis0212<<14 | 0x0A<<7 | 0x14, 284 - 161: jis0212<<14 | 0x09<<7 | 0x19, 285 - 161: jis0212<<14 | 0x0A<<7 | 0x19, 286 - 161: jis0212<<14 | 0x09<<7 | 0x1A, 287 - 161: jis0212<<14 | 0x0A<<7 | 0x1A, 288 - 161: jis0212<<14 | 0x09<<7 | 0x1C, 289 - 161: jis0212<<14 | 0x0A<<7 | 0x1C, 290 - 161: jis0212<<14 | 0x09<<7 | 0x1B, 292 - 161: jis0212<<14 | 0x09<<7 | 0x1D, 293 - 161: jis0212<<14 | 0x0A<<7 | 0x1D, 294 - 161: jis0212<<14 | 0x08<<7 | 0x03, 295 - 161: jis0212<<14 | 0x08<<7 | 0x23, 296 - 161: jis0212<<14 | 0x09<<7 | 0x26, 297 - 161: jis0212<<14 | 0x0A<<7 | 0x26, 298 - 161: jis0212<<14 | 0x09<<7 | 0x24, 299 - 161: jis0212<<14 | 0x0A<<7 | 0x24, 302 - 161: jis0212<<14 | 0x09<<7 | 0x25, 303 - 161: jis0212<<14 | 0x0A<<7 | 0x25, 304 - 161: jis0212<<14 | 0x09<<7 | 0x23, 305 - 161: jis0212<<14 | 0x08<<7 | 0x24, 306 - 161: jis0212<<14 | 0x08<<7 | 0x05, 307 - 161: jis0212<<14 | 0x08<<7 | 0x25, 308 - 161: jis0212<<14 | 0x09<<7 | 0x27, 309 - 161: jis0212<<14 | 0x0A<<7 | 0x27, 310 - 161: jis0212<<14 | 0x09<<7 | 0x28, 311 - 161: jis0212<<14 | 0x0A<<7 | 0x28, 312 - 161: jis0212<<14 | 0x08<<7 | 0x26, 313 - 161: jis0212<<14 | 0x09<<7 | 0x29, 314 - 161: jis0212<<14 | 0x0A<<7 | 0x29, 315 - 161: jis0212<<14 | 0x09<<7 | 0x2B, 316 - 161: jis0212<<14 | 0x0A<<7 | 0x2B, 317 - 161: jis0212<<14 | 0x09<<7 | 0x2A, 318 - 161: jis0212<<14 | 0x0A<<7 | 0x2A, 319 - 161: jis0212<<14 | 0x08<<7 | 0x08, 320 - 161: jis0212<<14 | 0x08<<7 | 0x28, 321 - 161: jis0212<<14 | 0x08<<7 | 0x07, 322 - 161: jis0212<<14 | 0x08<<7 | 0x27, 323 - 161: jis0212<<14 | 0x09<<7 | 0x2C, 324 - 161: jis0212<<14 | 0x0A<<7 | 0x2C, 325 - 161: jis0212<<14 | 0x09<<7 | 0x2E, 326 - 161: jis0212<<14 | 0x0A<<7 | 0x2E, 327 - 161: jis0212<<14 | 0x09<<7 | 0x2D, 328 - 161: jis0212<<14 | 0x0A<<7 | 0x2D, 329 - 161: jis0212<<14 | 0x08<<7 | 0x29, 330 - 161: jis0212<<14 | 0x08<<7 | 0x0A, 331 - 161: jis0212<<14 | 0x08<<7 | 0x2A, 332 - 161: jis0212<<14 | 0x09<<7 | 0x36, 333 - 161: jis0212<<14 | 0x0A<<7 | 0x36, 336 - 161: jis0212<<14 | 0x09<<7 | 0x35, 337 - 161: jis0212<<14 | 0x0A<<7 | 0x35, 338 - 161: jis0212<<14 | 0x08<<7 | 0x0C, 339 - 161: jis0212<<14 | 0x08<<7 | 0x2C, 340 - 161: jis0212<<14 | 0x09<<7 | 0x38, 341 - 161: jis0212<<14 | 0x0A<<7 | 0x38, 342 - 161: jis0212<<14 | 0x09<<7 | 0x3A, 343 - 161: jis0212<<14 | 0x0A<<7 | 0x3A, 344 - 161: jis0212<<14 | 0x09<<7 | 0x39, 345 - 161: jis0212<<14 | 0x0A<<7 | 0x39, 346 - 161: jis0212<<14 | 0x09<<7 | 0x3B, 347 - 161: jis0212<<14 | 0x0A<<7 | 0x3B, 348 - 161: jis0212<<14 | 0x09<<7 | 0x3C, 349 - 161: jis0212<<14 | 0x0A<<7 | 0x3C, 350 - 161: jis0212<<14 | 0x09<<7 | 0x3E, 351 - 161: jis0212<<14 | 0x0A<<7 | 0x3E, 352 - 161: jis0212<<14 | 0x09<<7 | 0x3D, 353 - 161: jis0212<<14 | 0x0A<<7 | 0x3D, 354 - 161: jis0212<<14 | 0x09<<7 | 0x40, 355 - 161: jis0212<<14 | 0x0A<<7 | 0x40, 356 - 161: jis0212<<14 | 0x09<<7 | 0x3F, 357 - 161: jis0212<<14 | 0x0A<<7 | 0x3F, 358 - 161: jis0212<<14 | 0x08<<7 | 0x0E, 359 - 161: jis0212<<14 | 0x08<<7 | 0x2E, 360 - 161: jis0212<<14 | 0x09<<7 | 0x4B, 361 - 161: jis0212<<14 | 0x0A<<7 | 0x4B, 362 - 161: jis0212<<14 | 0x09<<7 | 0x48, 363 - 161: jis0212<<14 | 0x0A<<7 | 0x48, 364 - 161: jis0212<<14 | 0x09<<7 | 0x45, 365 - 161: jis0212<<14 | 0x0A<<7 | 0x45, 366 - 161: jis0212<<14 | 0x09<<7 | 0x4A, 367 - 161: jis0212<<14 | 0x0A<<7 | 0x4A, 368 - 161: jis0212<<14 | 0x09<<7 | 0x47, 369 - 161: jis0212<<14 | 0x0A<<7 | 0x47, 370 - 161: jis0212<<14 | 0x09<<7 | 0x49, 371 - 161: jis0212<<14 | 0x0A<<7 | 0x49, 372 - 161: jis0212<<14 | 0x09<<7 | 0x50, 373 - 161: jis0212<<14 | 0x0A<<7 | 0x50, 374 - 161: jis0212<<14 | 0x09<<7 | 0x53, 375 - 161: jis0212<<14 | 0x0A<<7 | 0x53, 376 - 161: jis0212<<14 | 0x09<<7 | 0x52, 377 - 161: jis0212<<14 | 0x09<<7 | 0x54, 378 - 161: jis0212<<14 | 0x0A<<7 | 0x54, 379 - 161: jis0212<<14 | 0x09<<7 | 0x56, 380 - 161: jis0212<<14 | 0x0A<<7 | 0x56, 381 - 161: jis0212<<14 | 0x09<<7 | 0x55, 382 - 161: jis0212<<14 | 0x0A<<7 | 0x55, 461 - 161: jis0212<<14 | 0x09<<7 | 0x05, 462 - 161: jis0212<<14 | 0x0A<<7 | 0x05, 463 - 161: jis0212<<14 | 0x09<<7 | 0x22, 464 - 161: jis0212<<14 | 0x0A<<7 | 0x22, 465 - 161: jis0212<<14 | 0x09<<7 | 0x34, 466 - 161: jis0212<<14 | 0x0A<<7 | 0x34, 467 - 161: jis0212<<14 | 0x09<<7 | 0x46, 468 - 161: jis0212<<14 | 0x0A<<7 | 0x46, 469 - 161: jis0212<<14 | 0x09<<7 | 0x4F, 470 - 161: jis0212<<14 | 0x0A<<7 | 0x4F, 471 - 161: jis0212<<14 | 0x09<<7 | 0x4C, 472 - 161: jis0212<<14 | 0x0A<<7 | 0x4C, 473 - 161: jis0212<<14 | 0x09<<7 | 0x4E, 474 - 161: jis0212<<14 | 0x0A<<7 | 0x4E, 475 - 161: jis0212<<14 | 0x09<<7 | 0x4D, 476 - 161: jis0212<<14 | 0x0A<<7 | 0x4D, 501 - 161: jis0212<<14 | 0x0A<<7 | 0x18, 711 - 161: jis0212<<14 | 0x01<<7 | 0x0F, 728 - 161: jis0212<<14 | 0x01<<7 | 0x0E, 729 - 161: jis0212<<14 | 0x01<<7 | 0x11, 730 - 161: jis0212<<14 | 0x01<<7 | 0x15, 731 - 161: jis0212<<14 | 0x01<<7 | 0x14, 733 - 161: jis0212<<14 | 0x01<<7 | 0x12, 900 - 161: jis0212<<14 | 0x01<<7 | 0x17, 901 - 161: jis0212<<14 | 0x01<<7 | 0x18, 902 - 161: jis0212<<14 | 0x05<<7 | 0x40, 904 - 161: jis0212<<14 | 0x05<<7 | 0x41, 905 - 161: jis0212<<14 | 0x05<<7 | 0x42, 906 - 161: jis0212<<14 | 0x05<<7 | 0x43, 908 - 161: jis0212<<14 | 0x05<<7 | 0x46, 910 - 161: jis0212<<14 | 0x05<<7 | 0x48, 911 - 161: jis0212<<14 | 0x05<<7 | 0x4B, 912 - 161: jis0212<<14 | 0x05<<7 | 0x55, 913 - 161: jis0208<<14 | 0x05<<7 | 0x00, 914 - 161: jis0208<<14 | 0x05<<7 | 0x01, 915 - 161: jis0208<<14 | 0x05<<7 | 0x02, 916 - 161: jis0208<<14 | 0x05<<7 | 0x03, 917 - 161: jis0208<<14 | 0x05<<7 | 0x04, 918 - 161: jis0208<<14 | 0x05<<7 | 0x05, 919 - 161: jis0208<<14 | 0x05<<7 | 0x06, 920 - 161: jis0208<<14 | 0x05<<7 | 0x07, 921 - 161: jis0208<<14 | 0x05<<7 | 0x08, 922 - 161: jis0208<<14 | 0x05<<7 | 0x09, 923 - 161: jis0208<<14 | 0x05<<7 | 0x0A, 924 - 161: jis0208<<14 | 0x05<<7 | 0x0B, 925 - 161: jis0208<<14 | 0x05<<7 | 0x0C, 926 - 161: jis0208<<14 | 0x05<<7 | 0x0D, 927 - 161: jis0208<<14 | 0x05<<7 | 0x0E, 928 - 161: jis0208<<14 | 0x05<<7 | 0x0F, 929 - 161: jis0208<<14 | 0x05<<7 | 0x10, 931 - 161: jis0208<<14 | 0x05<<7 | 0x11, 932 - 161: jis0208<<14 | 0x05<<7 | 0x12, 933 - 161: jis0208<<14 | 0x05<<7 | 0x13, 934 - 161: jis0208<<14 | 0x05<<7 | 0x14, 935 - 161: jis0208<<14 | 0x05<<7 | 0x15, 936 - 161: jis0208<<14 | 0x05<<7 | 0x16, 937 - 161: jis0208<<14 | 0x05<<7 | 0x17, 938 - 161: jis0212<<14 | 0x05<<7 | 0x44, 939 - 161: jis0212<<14 | 0x05<<7 | 0x49, 940 - 161: jis0212<<14 | 0x05<<7 | 0x50, 941 - 161: jis0212<<14 | 0x05<<7 | 0x51, 942 - 161: jis0212<<14 | 0x05<<7 | 0x52, 943 - 161: jis0212<<14 | 0x05<<7 | 0x53, 944 - 161: jis0212<<14 | 0x05<<7 | 0x5A, 945 - 161: jis0208<<14 | 0x05<<7 | 0x20, 946 - 161: jis0208<<14 | 0x05<<7 | 0x21, 947 - 161: jis0208<<14 | 0x05<<7 | 0x22, 948 - 161: jis0208<<14 | 0x05<<7 | 0x23, 949 - 161: jis0208<<14 | 0x05<<7 | 0x24, 950 - 161: jis0208<<14 | 0x05<<7 | 0x25, 951 - 161: jis0208<<14 | 0x05<<7 | 0x26, 952 - 161: jis0208<<14 | 0x05<<7 | 0x27, 953 - 161: jis0208<<14 | 0x05<<7 | 0x28, 954 - 161: jis0208<<14 | 0x05<<7 | 0x29, 955 - 161: jis0208<<14 | 0x05<<7 | 0x2A, 956 - 161: jis0208<<14 | 0x05<<7 | 0x2B, 957 - 161: jis0208<<14 | 0x05<<7 | 0x2C, 958 - 161: jis0208<<14 | 0x05<<7 | 0x2D, 959 - 161: jis0208<<14 | 0x05<<7 | 0x2E, 960 - 161: jis0208<<14 | 0x05<<7 | 0x2F, 961 - 161: jis0208<<14 | 0x05<<7 | 0x30, 962 - 161: jis0212<<14 | 0x05<<7 | 0x57, 963 - 161: jis0208<<14 | 0x05<<7 | 0x31, 964 - 161: jis0208<<14 | 0x05<<7 | 0x32, 965 - 161: jis0208<<14 | 0x05<<7 | 0x33, 966 - 161: jis0208<<14 | 0x05<<7 | 0x34, 967 - 161: jis0208<<14 | 0x05<<7 | 0x35, 968 - 161: jis0208<<14 | 0x05<<7 | 0x36, 969 - 161: jis0208<<14 | 0x05<<7 | 0x37, 970 - 161: jis0212<<14 | 0x05<<7 | 0x54, 971 - 161: jis0212<<14 | 0x05<<7 | 0x59, 972 - 161: jis0212<<14 | 0x05<<7 | 0x56, 973 - 161: jis0212<<14 | 0x05<<7 | 0x58, 974 - 161: jis0212<<14 | 0x05<<7 | 0x5B, 1025 - 161: jis0208<<14 | 0x06<<7 | 0x06, 1026 - 161: jis0212<<14 | 0x06<<7 | 0x21, 1027 - 161: jis0212<<14 | 0x06<<7 | 0x22, 1028 - 161: jis0212<<14 | 0x06<<7 | 0x23, 1029 - 161: jis0212<<14 | 0x06<<7 | 0x24, 1030 - 161: jis0212<<14 | 0x06<<7 | 0x25, 1031 - 161: jis0212<<14 | 0x06<<7 | 0x26, 1032 - 161: jis0212<<14 | 0x06<<7 | 0x27, 1033 - 161: jis0212<<14 | 0x06<<7 | 0x28, 1034 - 161: jis0212<<14 | 0x06<<7 | 0x29, 1035 - 161: jis0212<<14 | 0x06<<7 | 0x2A, 1036 - 161: jis0212<<14 | 0x06<<7 | 0x2B, 1038 - 161: jis0212<<14 | 0x06<<7 | 0x2C, 1039 - 161: jis0212<<14 | 0x06<<7 | 0x2D, 1040 - 161: jis0208<<14 | 0x06<<7 | 0x00, 1041 - 161: jis0208<<14 | 0x06<<7 | 0x01, 1042 - 161: jis0208<<14 | 0x06<<7 | 0x02, 1043 - 161: jis0208<<14 | 0x06<<7 | 0x03, 1044 - 161: jis0208<<14 | 0x06<<7 | 0x04, 1045 - 161: jis0208<<14 | 0x06<<7 | 0x05, 1046 - 161: jis0208<<14 | 0x06<<7 | 0x07, 1047 - 161: jis0208<<14 | 0x06<<7 | 0x08, 1048 - 161: jis0208<<14 | 0x06<<7 | 0x09, 1049 - 161: jis0208<<14 | 0x06<<7 | 0x0A, 1050 - 161: jis0208<<14 | 0x06<<7 | 0x0B, 1051 - 161: jis0208<<14 | 0x06<<7 | 0x0C, 1052 - 161: jis0208<<14 | 0x06<<7 | 0x0D, 1053 - 161: jis0208<<14 | 0x06<<7 | 0x0E, 1054 - 161: jis0208<<14 | 0x06<<7 | 0x0F, 1055 - 161: jis0208<<14 | 0x06<<7 | 0x10, 1056 - 161: jis0208<<14 | 0x06<<7 | 0x11, 1057 - 161: jis0208<<14 | 0x06<<7 | 0x12, 1058 - 161: jis0208<<14 | 0x06<<7 | 0x13, 1059 - 161: jis0208<<14 | 0x06<<7 | 0x14, 1060 - 161: jis0208<<14 | 0x06<<7 | 0x15, 1061 - 161: jis0208<<14 | 0x06<<7 | 0x16, 1062 - 161: jis0208<<14 | 0x06<<7 | 0x17, 1063 - 161: jis0208<<14 | 0x06<<7 | 0x18, 1064 - 161: jis0208<<14 | 0x06<<7 | 0x19, 1065 - 161: jis0208<<14 | 0x06<<7 | 0x1A, 1066 - 161: jis0208<<14 | 0x06<<7 | 0x1B, 1067 - 161: jis0208<<14 | 0x06<<7 | 0x1C, 1068 - 161: jis0208<<14 | 0x06<<7 | 0x1D, 1069 - 161: jis0208<<14 | 0x06<<7 | 0x1E, 1070 - 161: jis0208<<14 | 0x06<<7 | 0x1F, 1071 - 161: jis0208<<14 | 0x06<<7 | 0x20, 1072 - 161: jis0208<<14 | 0x06<<7 | 0x30, 1073 - 161: jis0208<<14 | 0x06<<7 | 0x31, 1074 - 161: jis0208<<14 | 0x06<<7 | 0x32, 1075 - 161: jis0208<<14 | 0x06<<7 | 0x33, 1076 - 161: jis0208<<14 | 0x06<<7 | 0x34, 1077 - 161: jis0208<<14 | 0x06<<7 | 0x35, 1078 - 161: jis0208<<14 | 0x06<<7 | 0x37, 1079 - 161: jis0208<<14 | 0x06<<7 | 0x38, 1080 - 161: jis0208<<14 | 0x06<<7 | 0x39, 1081 - 161: jis0208<<14 | 0x06<<7 | 0x3A, 1082 - 161: jis0208<<14 | 0x06<<7 | 0x3B, 1083 - 161: jis0208<<14 | 0x06<<7 | 0x3C, 1084 - 161: jis0208<<14 | 0x06<<7 | 0x3D, 1085 - 161: jis0208<<14 | 0x06<<7 | 0x3E, 1086 - 161: jis0208<<14 | 0x06<<7 | 0x3F, 1087 - 161: jis0208<<14 | 0x06<<7 | 0x40, 1088 - 161: jis0208<<14 | 0x06<<7 | 0x41, 1089 - 161: jis0208<<14 | 0x06<<7 | 0x42, 1090 - 161: jis0208<<14 | 0x06<<7 | 0x43, 1091 - 161: jis0208<<14 | 0x06<<7 | 0x44, 1092 - 161: jis0208<<14 | 0x06<<7 | 0x45, 1093 - 161: jis0208<<14 | 0x06<<7 | 0x46, 1094 - 161: jis0208<<14 | 0x06<<7 | 0x47, 1095 - 161: jis0208<<14 | 0x06<<7 | 0x48, 1096 - 161: jis0208<<14 | 0x06<<7 | 0x49, 1097 - 161: jis0208<<14 | 0x06<<7 | 0x4A, 1098 - 161: jis0208<<14 | 0x06<<7 | 0x4B, 1099 - 161: jis0208<<14 | 0x06<<7 | 0x4C, 1100 - 161: jis0208<<14 | 0x06<<7 | 0x4D, 1101 - 161: jis0208<<14 | 0x06<<7 | 0x4E, 1102 - 161: jis0208<<14 | 0x06<<7 | 0x4F, 1103 - 161: jis0208<<14 | 0x06<<7 | 0x50, 1105 - 161: jis0208<<14 | 0x06<<7 | 0x36, 1106 - 161: jis0212<<14 | 0x06<<7 | 0x51, 1107 - 161: jis0212<<14 | 0x06<<7 | 0x52, 1108 - 161: jis0212<<14 | 0x06<<7 | 0x53, 1109 - 161: jis0212<<14 | 0x06<<7 | 0x54, 1110 - 161: jis0212<<14 | 0x06<<7 | 0x55, 1111 - 161: jis0212<<14 | 0x06<<7 | 0x56, 1112 - 161: jis0212<<14 | 0x06<<7 | 0x57, 1113 - 161: jis0212<<14 | 0x06<<7 | 0x58, 1114 - 161: jis0212<<14 | 0x06<<7 | 0x59, 1115 - 161: jis0212<<14 | 0x06<<7 | 0x5A, 1116 - 161: jis0212<<14 | 0x06<<7 | 0x5B, 1118 - 161: jis0212<<14 | 0x06<<7 | 0x5C, 1119 - 161: jis0212<<14 | 0x06<<7 | 0x5D, } const encode4Low, encode4High = 63785, 64046 var encode4 = [...]uint16{ 63785 - 63785: jis0208<<14 | 0x59<<7 | 0x25, 63964 - 63785: jis0208<<14 | 0x5B<<7 | 0x2E, 64014 - 63785: jis0208<<14 | 0x58<<7 | 0x33, 64015 - 63785: jis0208<<14 | 0x58<<7 | 0x3E, 64016 - 63785: jis0208<<14 | 0x58<<7 | 0x3F, 64017 - 63785: jis0208<<14 | 0x58<<7 | 0x54, 64018 - 63785: jis0208<<14 | 0x59<<7 | 0x1D, 64019 - 63785: jis0208<<14 | 0x59<<7 | 0x2D, 64020 - 63785: jis0208<<14 | 0x59<<7 | 0x2F, 64021 - 63785: jis0208<<14 | 0x59<<7 | 0x5A, 64022 - 63785: jis0208<<14 | 0x5A<<7 | 0x02, 64023 - 63785: jis0208<<14 | 0x5A<<7 | 0x19, 64024 - 63785: jis0208<<14 | 0x5A<<7 | 0x21, 64025 - 63785: jis0208<<14 | 0x5A<<7 | 0x22, 64026 - 63785: jis0208<<14 | 0x5A<<7 | 0x23, 64027 - 63785: jis0208<<14 | 0x5A<<7 | 0x25, 64028 - 63785: jis0208<<14 | 0x5A<<7 | 0x29, 64029 - 63785: jis0208<<14 | 0x5A<<7 | 0x2C, 64030 - 63785: jis0208<<14 | 0x5A<<7 | 0x35, 64031 - 63785: jis0208<<14 | 0x5A<<7 | 0x40, 64032 - 63785: jis0208<<14 | 0x5A<<7 | 0x42, 64033 - 63785: jis0208<<14 | 0x5A<<7 | 0x43, 64034 - 63785: jis0208<<14 | 0x5A<<7 | 0x4C, 64035 - 63785: jis0208<<14 | 0x5A<<7 | 0x54, 64036 - 63785: jis0208<<14 | 0x5A<<7 | 0x56, 64037 - 63785: jis0208<<14 | 0x5A<<7 | 0x57, 64038 - 63785: jis0208<<14 | 0x5A<<7 | 0x5A, 64039 - 63785: jis0208<<14 | 0x5B<<7 | 0x18, 64040 - 63785: jis0208<<14 | 0x5B<<7 | 0x1F, 64041 - 63785: jis0208<<14 | 0x5B<<7 | 0x2F, 64042 - 63785: jis0208<<14 | 0x5B<<7 | 0x3B, 64043 - 63785: jis0208<<14 | 0x5B<<7 | 0x3C, 64044 - 63785: jis0208<<14 | 0x5B<<7 | 0x3E, 64045 - 63785: jis0208<<14 | 0x5B<<7 | 0x4B, } const encode5Low, encode5High = 65281, 65510 var encode5 = [...]uint16{ 65281 - 65281: jis0208<<14 | 0x00<<7 | 0x09, 65282 - 65281: jis0208<<14 | 0x5B<<7 | 0x5D, 65283 - 65281: jis0208<<14 | 0x00<<7 | 0x53, 65284 - 65281: jis0208<<14 | 0x00<<7 | 0x4F, 65285 - 65281: jis0208<<14 | 0x00<<7 | 0x52, 65286 - 65281: jis0208<<14 | 0x00<<7 | 0x54, 65287 - 65281: jis0208<<14 | 0x5B<<7 | 0x5C, 65288 - 65281: jis0208<<14 | 0x00<<7 | 0x29, 65289 - 65281: jis0208<<14 | 0x00<<7 | 0x2A, 65290 - 65281: jis0208<<14 | 0x00<<7 | 0x55, 65291 - 65281: jis0208<<14 | 0x00<<7 | 0x3B, 65292 - 65281: jis0208<<14 | 0x00<<7 | 0x03, 65293 - 65281: jis0208<<14 | 0x00<<7 | 0x3C, 65294 - 65281: jis0208<<14 | 0x00<<7 | 0x04, 65295 - 65281: jis0208<<14 | 0x00<<7 | 0x1E, 65296 - 65281: jis0208<<14 | 0x02<<7 | 0x0F, 65297 - 65281: jis0208<<14 | 0x02<<7 | 0x10, 65298 - 65281: jis0208<<14 | 0x02<<7 | 0x11, 65299 - 65281: jis0208<<14 | 0x02<<7 | 0x12, 65300 - 65281: jis0208<<14 | 0x02<<7 | 0x13, 65301 - 65281: jis0208<<14 | 0x02<<7 | 0x14, 65302 - 65281: jis0208<<14 | 0x02<<7 | 0x15, 65303 - 65281: jis0208<<14 | 0x02<<7 | 0x16, 65304 - 65281: jis0208<<14 | 0x02<<7 | 0x17, 65305 - 65281: jis0208<<14 | 0x02<<7 | 0x18, 65306 - 65281: jis0208<<14 | 0x00<<7 | 0x06, 65307 - 65281: jis0208<<14 | 0x00<<7 | 0x07, 65308 - 65281: jis0208<<14 | 0x00<<7 | 0x42, 65309 - 65281: jis0208<<14 | 0x00<<7 | 0x40, 65310 - 65281: jis0208<<14 | 0x00<<7 | 0x43, 65311 - 65281: jis0208<<14 | 0x00<<7 | 0x08, 65312 - 65281: jis0208<<14 | 0x00<<7 | 0x56, 65313 - 65281: jis0208<<14 | 0x02<<7 | 0x20, 65314 - 65281: jis0208<<14 | 0x02<<7 | 0x21, 65315 - 65281: jis0208<<14 | 0x02<<7 | 0x22, 65316 - 65281: jis0208<<14 | 0x02<<7 | 0x23, 65317 - 65281: jis0208<<14 | 0x02<<7 | 0x24, 65318 - 65281: jis0208<<14 | 0x02<<7 | 0x25, 65319 - 65281: jis0208<<14 | 0x02<<7 | 0x26, 65320 - 65281: jis0208<<14 | 0x02<<7 | 0x27, 65321 - 65281: jis0208<<14 | 0x02<<7 | 0x28, 65322 - 65281: jis0208<<14 | 0x02<<7 | 0x29, 65323 - 65281: jis0208<<14 | 0x02<<7 | 0x2A, 65324 - 65281: jis0208<<14 | 0x02<<7 | 0x2B, 65325 - 65281: jis0208<<14 | 0x02<<7 | 0x2C, 65326 - 65281: jis0208<<14 | 0x02<<7 | 0x2D, 65327 - 65281: jis0208<<14 | 0x02<<7 | 0x2E, 65328 - 65281: jis0208<<14 | 0x02<<7 | 0x2F, 65329 - 65281: jis0208<<14 | 0x02<<7 | 0x30, 65330 - 65281: jis0208<<14 | 0x02<<7 | 0x31, 65331 - 65281: jis0208<<14 | 0x02<<7 | 0x32, 65332 - 65281: jis0208<<14 | 0x02<<7 | 0x33, 65333 - 65281: jis0208<<14 | 0x02<<7 | 0x34, 65334 - 65281: jis0208<<14 | 0x02<<7 | 0x35, 65335 - 65281: jis0208<<14 | 0x02<<7 | 0x36, 65336 - 65281: jis0208<<14 | 0x02<<7 | 0x37, 65337 - 65281: jis0208<<14 | 0x02<<7 | 0x38, 65338 - 65281: jis0208<<14 | 0x02<<7 | 0x39, 65339 - 65281: jis0208<<14 | 0x00<<7 | 0x2D, 65340 - 65281: jis0208<<14 | 0x00<<7 | 0x1F, 65341 - 65281: jis0208<<14 | 0x00<<7 | 0x2E, 65342 - 65281: jis0208<<14 | 0x00<<7 | 0x0F, 65343 - 65281: jis0208<<14 | 0x00<<7 | 0x11, 65344 - 65281: jis0208<<14 | 0x00<<7 | 0x0D, 65345 - 65281: jis0208<<14 | 0x02<<7 | 0x40, 65346 - 65281: jis0208<<14 | 0x02<<7 | 0x41, 65347 - 65281: jis0208<<14 | 0x02<<7 | 0x42, 65348 - 65281: jis0208<<14 | 0x02<<7 | 0x43, 65349 - 65281: jis0208<<14 | 0x02<<7 | 0x44, 65350 - 65281: jis0208<<14 | 0x02<<7 | 0x45, 65351 - 65281: jis0208<<14 | 0x02<<7 | 0x46, 65352 - 65281: jis0208<<14 | 0x02<<7 | 0x47, 65353 - 65281: jis0208<<14 | 0x02<<7 | 0x48, 65354 - 65281: jis0208<<14 | 0x02<<7 | 0x49, 65355 - 65281: jis0208<<14 | 0x02<<7 | 0x4A, 65356 - 65281: jis0208<<14 | 0x02<<7 | 0x4B, 65357 - 65281: jis0208<<14 | 0x02<<7 | 0x4C, 65358 - 65281: jis0208<<14 | 0x02<<7 | 0x4D, 65359 - 65281: jis0208<<14 | 0x02<<7 | 0x4E, 65360 - 65281: jis0208<<14 | 0x02<<7 | 0x4F, 65361 - 65281: jis0208<<14 | 0x02<<7 | 0x50, 65362 - 65281: jis0208<<14 | 0x02<<7 | 0x51, 65363 - 65281: jis0208<<14 | 0x02<<7 | 0x52, 65364 - 65281: jis0208<<14 | 0x02<<7 | 0x53, 65365 - 65281: jis0208<<14 | 0x02<<7 | 0x54, 65366 - 65281: jis0208<<14 | 0x02<<7 | 0x55, 65367 - 65281: jis0208<<14 | 0x02<<7 | 0x56, 65368 - 65281: jis0208<<14 | 0x02<<7 | 0x57, 65369 - 65281: jis0208<<14 | 0x02<<7 | 0x58, 65370 - 65281: jis0208<<14 | 0x02<<7 | 0x59, 65371 - 65281: jis0208<<14 | 0x00<<7 | 0x2F, 65372 - 65281: jis0208<<14 | 0x00<<7 | 0x22, 65373 - 65281: jis0208<<14 | 0x00<<7 | 0x30, 65374 - 65281: jis0208<<14 | 0x00<<7 | 0x20, 65504 - 65281: jis0208<<14 | 0x00<<7 | 0x50, 65505 - 65281: jis0208<<14 | 0x00<<7 | 0x51, 65506 - 65281: jis0208<<14 | 0x01<<7 | 0x2B, 65507 - 65281: jis0208<<14 | 0x00<<7 | 0x10, 65508 - 65281: jis0208<<14 | 0x5B<<7 | 0x5B, 65509 - 65281: jis0208<<14 | 0x00<<7 | 0x4E, } ================================================ FILE: vendor/golang.org/x/text/encoding/korean/euckr.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package korean import ( "errors" "unicode/utf8" "golang.org/x/text/encoding" "golang.org/x/text/encoding/internal" "golang.org/x/text/encoding/internal/identifier" "golang.org/x/text/transform" ) // All is a list of all defined encodings in this package. var All = []encoding.Encoding{EUCKR} // EUCKR is the EUC-KR encoding, also known as Code Page 949. var EUCKR encoding.Encoding = &eucKR var eucKR = internal.Encoding{ &internal.SimpleEncoding{eucKRDecoder{}, eucKREncoder{}}, "EUC-KR", identifier.EUCKR, } var errInvalidEUCKR = errors.New("korean: invalid EUC-KR encoding") type eucKRDecoder struct{ transform.NopResetter } func (eucKRDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { r, size := rune(0), 0 loop: for ; nSrc < len(src); nSrc += size { switch c0 := src[nSrc]; { case c0 < utf8.RuneSelf: r, size = rune(c0), 1 case 0x81 <= c0 && c0 < 0xff: if nSrc+1 >= len(src) { err = transform.ErrShortSrc break loop } c1 := src[nSrc+1] if c0 < 0xc7 { r = 178 * rune(c0-0x81) switch { case 0x41 <= c1 && c1 < 0x5b: r += rune(c1) - (0x41 - 0*26) case 0x61 <= c1 && c1 < 0x7b: r += rune(c1) - (0x61 - 1*26) case 0x81 <= c1 && c1 < 0xff: r += rune(c1) - (0x81 - 2*26) default: err = errInvalidEUCKR break loop } } else if 0xa1 <= c1 && c1 < 0xff { r = 178*(0xc7-0x81) + rune(c0-0xc7)*94 + rune(c1-0xa1) } else { err = errInvalidEUCKR break loop } if int(r) < len(decode) { r = rune(decode[r]) if r == 0 { r = '\ufffd' } } else { r = '\ufffd' } size = 2 default: err = errInvalidEUCKR break loop } if nDst+utf8.RuneLen(r) > len(dst) { err = transform.ErrShortDst break loop } nDst += utf8.EncodeRune(dst[nDst:], r) } if atEOF && err == transform.ErrShortSrc { err = errInvalidEUCKR } return nDst, nSrc, err } type eucKREncoder struct{ transform.NopResetter } func (eucKREncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { r, size := rune(0), 0 for ; nSrc < len(src); nSrc += size { r = rune(src[nSrc]) // Decode a 1-byte rune. if r < utf8.RuneSelf { size = 1 if nDst >= len(dst) { err = transform.ErrShortDst break } dst[nDst] = uint8(r) nDst++ continue } else { // Decode a multi-byte rune. r, size = utf8.DecodeRune(src[nSrc:]) if size == 1 { // All valid runes of size 1 (those below utf8.RuneSelf) were // handled above. We have invalid UTF-8 or we haven't seen the // full character yet. if !atEOF && !utf8.FullRune(src[nSrc:]) { err = transform.ErrShortSrc break } } // func init checks that the switch covers all tables. switch { case encode0Low <= r && r < encode0High: if r = rune(encode0[r-encode0Low]); r != 0 { goto write2 } case encode1Low <= r && r < encode1High: if r = rune(encode1[r-encode1Low]); r != 0 { goto write2 } case encode2Low <= r && r < encode2High: if r = rune(encode2[r-encode2Low]); r != 0 { goto write2 } case encode3Low <= r && r < encode3High: if r = rune(encode3[r-encode3Low]); r != 0 { goto write2 } case encode4Low <= r && r < encode4High: if r = rune(encode4[r-encode4Low]); r != 0 { goto write2 } case encode5Low <= r && r < encode5High: if r = rune(encode5[r-encode5Low]); r != 0 { goto write2 } case encode6Low <= r && r < encode6High: if r = rune(encode6[r-encode6Low]); r != 0 { goto write2 } } err = internal.ErrASCIIReplacement break } write2: if nDst+2 > len(dst) { err = transform.ErrShortDst break } dst[nDst+0] = uint8(r >> 8) dst[nDst+1] = uint8(r) nDst += 2 continue } return nDst, nSrc, err } func init() { // Check that the hard-coded encode switch covers all tables. if numEncodeTables != 7 { panic("bad numEncodeTables") } } ================================================ FILE: vendor/golang.org/x/text/encoding/korean/maketables.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build ignore package main // This program generates tables.go: // go run maketables.go | gofmt > tables.go import ( "bufio" "fmt" "log" "net/http" "sort" "strings" ) func main() { fmt.Printf("// generated by go run maketables.go; DO NOT EDIT\n\n") fmt.Printf("// Package korean provides Korean encodings such as EUC-KR.\n") fmt.Printf(`package korean // import "golang.org/x/text/encoding/korean"` + "\n\n") res, err := http.Get("http://encoding.spec.whatwg.org/index-euc-kr.txt") if err != nil { log.Fatalf("Get: %v", err) } defer res.Body.Close() mapping := [65536]uint16{} reverse := [65536]uint16{} scanner := bufio.NewScanner(res.Body) for scanner.Scan() { s := strings.TrimSpace(scanner.Text()) if s == "" || s[0] == '#' { continue } x, y := uint16(0), uint16(0) if _, err := fmt.Sscanf(s, "%d 0x%x", &x, &y); err != nil { log.Fatalf("could not parse %q", s) } if x < 0 || 178*(0xc7-0x81)+(0xfe-0xc7)*94+(0xff-0xa1) <= x { log.Fatalf("EUC-KR code %d is out of range", x) } mapping[x] = y if reverse[y] == 0 { c0, c1 := uint16(0), uint16(0) if x < 178*(0xc7-0x81) { c0 = uint16(x/178) + 0x81 c1 = uint16(x % 178) switch { case c1 < 1*26: c1 += 0x41 case c1 < 2*26: c1 += 0x47 default: c1 += 0x4d } } else { x -= 178 * (0xc7 - 0x81) c0 = uint16(x/94) + 0xc7 c1 = uint16(x%94) + 0xa1 } reverse[y] = c0<<8 | c1 } } if err := scanner.Err(); err != nil { log.Fatalf("scanner error: %v", err) } fmt.Printf("// decode is the decoding table from EUC-KR code to Unicode.\n") fmt.Printf("// It is defined at http://encoding.spec.whatwg.org/index-euc-kr.txt\n") fmt.Printf("var decode = [...]uint16{\n") for i, v := range mapping { if v != 0 { fmt.Printf("\t%d: 0x%04X,\n", i, v) } } fmt.Printf("}\n\n") // Any run of at least separation continuous zero entries in the reverse map will // be a separate encode table. const separation = 1024 intervals := []interval(nil) low, high := -1, -1 for i, v := range reverse { if v == 0 { continue } if low < 0 { low = i } else if i-high >= separation { if high >= 0 { intervals = append(intervals, interval{low, high}) } low = i } high = i + 1 } if high >= 0 { intervals = append(intervals, interval{low, high}) } sort.Sort(byDecreasingLength(intervals)) fmt.Printf("const numEncodeTables = %d\n\n", len(intervals)) fmt.Printf("// encodeX are the encoding tables from Unicode to EUC-KR code,\n") fmt.Printf("// sorted by decreasing length.\n") for i, v := range intervals { fmt.Printf("// encode%d: %5d entries for runes in [%5d, %5d).\n", i, v.len(), v.low, v.high) } fmt.Printf("\n") for i, v := range intervals { fmt.Printf("const encode%dLow, encode%dHigh = %d, %d\n\n", i, i, v.low, v.high) fmt.Printf("var encode%d = [...]uint16{\n", i) for j := v.low; j < v.high; j++ { x := reverse[j] if x == 0 { continue } fmt.Printf("\t%d-%d: 0x%04X,\n", j, v.low, x) } fmt.Printf("}\n\n") } } // interval is a half-open interval [low, high). type interval struct { low, high int } func (i interval) len() int { return i.high - i.low } // byDecreasingLength sorts intervals by decreasing length. type byDecreasingLength []interval func (b byDecreasingLength) Len() int { return len(b) } func (b byDecreasingLength) Less(i, j int) bool { return b[i].len() > b[j].len() } func (b byDecreasingLength) Swap(i, j int) { b[i], b[j] = b[j], b[i] } ================================================ FILE: vendor/golang.org/x/text/encoding/korean/tables.go ================================================ // generated by go run maketables.go; DO NOT EDIT // Package korean provides Korean encodings such as EUC-KR. package korean // import "golang.org/x/text/encoding/korean" // decode is the decoding table from EUC-KR code to Unicode. // It is defined at http://encoding.spec.whatwg.org/index-euc-kr.txt var decode = [...]uint16{ 0: 0xAC02, 1: 0xAC03, 2: 0xAC05, 3: 0xAC06, 4: 0xAC0B, 5: 0xAC0C, 6: 0xAC0D, 7: 0xAC0E, 8: 0xAC0F, 9: 0xAC18, 10: 0xAC1E, 11: 0xAC1F, 12: 0xAC21, 13: 0xAC22, 14: 0xAC23, 15: 0xAC25, 16: 0xAC26, 17: 0xAC27, 18: 0xAC28, 19: 0xAC29, 20: 0xAC2A, 21: 0xAC2B, 22: 0xAC2E, 23: 0xAC32, 24: 0xAC33, 25: 0xAC34, 26: 0xAC35, 27: 0xAC36, 28: 0xAC37, 29: 0xAC3A, 30: 0xAC3B, 31: 0xAC3D, 32: 0xAC3E, 33: 0xAC3F, 34: 0xAC41, 35: 0xAC42, 36: 0xAC43, 37: 0xAC44, 38: 0xAC45, 39: 0xAC46, 40: 0xAC47, 41: 0xAC48, 42: 0xAC49, 43: 0xAC4A, 44: 0xAC4C, 45: 0xAC4E, 46: 0xAC4F, 47: 0xAC50, 48: 0xAC51, 49: 0xAC52, 50: 0xAC53, 51: 0xAC55, 52: 0xAC56, 53: 0xAC57, 54: 0xAC59, 55: 0xAC5A, 56: 0xAC5B, 57: 0xAC5D, 58: 0xAC5E, 59: 0xAC5F, 60: 0xAC60, 61: 0xAC61, 62: 0xAC62, 63: 0xAC63, 64: 0xAC64, 65: 0xAC65, 66: 0xAC66, 67: 0xAC67, 68: 0xAC68, 69: 0xAC69, 70: 0xAC6A, 71: 0xAC6B, 72: 0xAC6C, 73: 0xAC6D, 74: 0xAC6E, 75: 0xAC6F, 76: 0xAC72, 77: 0xAC73, 78: 0xAC75, 79: 0xAC76, 80: 0xAC79, 81: 0xAC7B, 82: 0xAC7C, 83: 0xAC7D, 84: 0xAC7E, 85: 0xAC7F, 86: 0xAC82, 87: 0xAC87, 88: 0xAC88, 89: 0xAC8D, 90: 0xAC8E, 91: 0xAC8F, 92: 0xAC91, 93: 0xAC92, 94: 0xAC93, 95: 0xAC95, 96: 0xAC96, 97: 0xAC97, 98: 0xAC98, 99: 0xAC99, 100: 0xAC9A, 101: 0xAC9B, 102: 0xAC9E, 103: 0xACA2, 104: 0xACA3, 105: 0xACA4, 106: 0xACA5, 107: 0xACA6, 108: 0xACA7, 109: 0xACAB, 110: 0xACAD, 111: 0xACAE, 112: 0xACB1, 113: 0xACB2, 114: 0xACB3, 115: 0xACB4, 116: 0xACB5, 117: 0xACB6, 118: 0xACB7, 119: 0xACBA, 120: 0xACBE, 121: 0xACBF, 122: 0xACC0, 123: 0xACC2, 124: 0xACC3, 125: 0xACC5, 126: 0xACC6, 127: 0xACC7, 128: 0xACC9, 129: 0xACCA, 130: 0xACCB, 131: 0xACCD, 132: 0xACCE, 133: 0xACCF, 134: 0xACD0, 135: 0xACD1, 136: 0xACD2, 137: 0xACD3, 138: 0xACD4, 139: 0xACD6, 140: 0xACD8, 141: 0xACD9, 142: 0xACDA, 143: 0xACDB, 144: 0xACDC, 145: 0xACDD, 146: 0xACDE, 147: 0xACDF, 148: 0xACE2, 149: 0xACE3, 150: 0xACE5, 151: 0xACE6, 152: 0xACE9, 153: 0xACEB, 154: 0xACED, 155: 0xACEE, 156: 0xACF2, 157: 0xACF4, 158: 0xACF7, 159: 0xACF8, 160: 0xACF9, 161: 0xACFA, 162: 0xACFB, 163: 0xACFE, 164: 0xACFF, 165: 0xAD01, 166: 0xAD02, 167: 0xAD03, 168: 0xAD05, 169: 0xAD07, 170: 0xAD08, 171: 0xAD09, 172: 0xAD0A, 173: 0xAD0B, 174: 0xAD0E, 175: 0xAD10, 176: 0xAD12, 177: 0xAD13, 178: 0xAD14, 179: 0xAD15, 180: 0xAD16, 181: 0xAD17, 182: 0xAD19, 183: 0xAD1A, 184: 0xAD1B, 185: 0xAD1D, 186: 0xAD1E, 187: 0xAD1F, 188: 0xAD21, 189: 0xAD22, 190: 0xAD23, 191: 0xAD24, 192: 0xAD25, 193: 0xAD26, 194: 0xAD27, 195: 0xAD28, 196: 0xAD2A, 197: 0xAD2B, 198: 0xAD2E, 199: 0xAD2F, 200: 0xAD30, 201: 0xAD31, 202: 0xAD32, 203: 0xAD33, 204: 0xAD36, 205: 0xAD37, 206: 0xAD39, 207: 0xAD3A, 208: 0xAD3B, 209: 0xAD3D, 210: 0xAD3E, 211: 0xAD3F, 212: 0xAD40, 213: 0xAD41, 214: 0xAD42, 215: 0xAD43, 216: 0xAD46, 217: 0xAD48, 218: 0xAD4A, 219: 0xAD4B, 220: 0xAD4C, 221: 0xAD4D, 222: 0xAD4E, 223: 0xAD4F, 224: 0xAD51, 225: 0xAD52, 226: 0xAD53, 227: 0xAD55, 228: 0xAD56, 229: 0xAD57, 230: 0xAD59, 231: 0xAD5A, 232: 0xAD5B, 233: 0xAD5C, 234: 0xAD5D, 235: 0xAD5E, 236: 0xAD5F, 237: 0xAD60, 238: 0xAD62, 239: 0xAD64, 240: 0xAD65, 241: 0xAD66, 242: 0xAD67, 243: 0xAD68, 244: 0xAD69, 245: 0xAD6A, 246: 0xAD6B, 247: 0xAD6E, 248: 0xAD6F, 249: 0xAD71, 250: 0xAD72, 251: 0xAD77, 252: 0xAD78, 253: 0xAD79, 254: 0xAD7A, 255: 0xAD7E, 256: 0xAD80, 257: 0xAD83, 258: 0xAD84, 259: 0xAD85, 260: 0xAD86, 261: 0xAD87, 262: 0xAD8A, 263: 0xAD8B, 264: 0xAD8D, 265: 0xAD8E, 266: 0xAD8F, 267: 0xAD91, 268: 0xAD92, 269: 0xAD93, 270: 0xAD94, 271: 0xAD95, 272: 0xAD96, 273: 0xAD97, 274: 0xAD98, 275: 0xAD99, 276: 0xAD9A, 277: 0xAD9B, 278: 0xAD9E, 279: 0xAD9F, 280: 0xADA0, 281: 0xADA1, 282: 0xADA2, 283: 0xADA3, 284: 0xADA5, 285: 0xADA6, 286: 0xADA7, 287: 0xADA8, 288: 0xADA9, 289: 0xADAA, 290: 0xADAB, 291: 0xADAC, 292: 0xADAD, 293: 0xADAE, 294: 0xADAF, 295: 0xADB0, 296: 0xADB1, 297: 0xADB2, 298: 0xADB3, 299: 0xADB4, 300: 0xADB5, 301: 0xADB6, 302: 0xADB8, 303: 0xADB9, 304: 0xADBA, 305: 0xADBB, 306: 0xADBC, 307: 0xADBD, 308: 0xADBE, 309: 0xADBF, 310: 0xADC2, 311: 0xADC3, 312: 0xADC5, 313: 0xADC6, 314: 0xADC7, 315: 0xADC9, 316: 0xADCA, 317: 0xADCB, 318: 0xADCC, 319: 0xADCD, 320: 0xADCE, 321: 0xADCF, 322: 0xADD2, 323: 0xADD4, 324: 0xADD5, 325: 0xADD6, 326: 0xADD7, 327: 0xADD8, 328: 0xADD9, 329: 0xADDA, 330: 0xADDB, 331: 0xADDD, 332: 0xADDE, 333: 0xADDF, 334: 0xADE1, 335: 0xADE2, 336: 0xADE3, 337: 0xADE5, 338: 0xADE6, 339: 0xADE7, 340: 0xADE8, 341: 0xADE9, 342: 0xADEA, 343: 0xADEB, 344: 0xADEC, 345: 0xADED, 346: 0xADEE, 347: 0xADEF, 348: 0xADF0, 349: 0xADF1, 350: 0xADF2, 351: 0xADF3, 352: 0xADF4, 353: 0xADF5, 354: 0xADF6, 355: 0xADF7, 356: 0xADFA, 357: 0xADFB, 358: 0xADFD, 359: 0xADFE, 360: 0xAE02, 361: 0xAE03, 362: 0xAE04, 363: 0xAE05, 364: 0xAE06, 365: 0xAE07, 366: 0xAE0A, 367: 0xAE0C, 368: 0xAE0E, 369: 0xAE0F, 370: 0xAE10, 371: 0xAE11, 372: 0xAE12, 373: 0xAE13, 374: 0xAE15, 375: 0xAE16, 376: 0xAE17, 377: 0xAE18, 378: 0xAE19, 379: 0xAE1A, 380: 0xAE1B, 381: 0xAE1C, 382: 0xAE1D, 383: 0xAE1E, 384: 0xAE1F, 385: 0xAE20, 386: 0xAE21, 387: 0xAE22, 388: 0xAE23, 389: 0xAE24, 390: 0xAE25, 391: 0xAE26, 392: 0xAE27, 393: 0xAE28, 394: 0xAE29, 395: 0xAE2A, 396: 0xAE2B, 397: 0xAE2C, 398: 0xAE2D, 399: 0xAE2E, 400: 0xAE2F, 401: 0xAE32, 402: 0xAE33, 403: 0xAE35, 404: 0xAE36, 405: 0xAE39, 406: 0xAE3B, 407: 0xAE3C, 408: 0xAE3D, 409: 0xAE3E, 410: 0xAE3F, 411: 0xAE42, 412: 0xAE44, 413: 0xAE47, 414: 0xAE48, 415: 0xAE49, 416: 0xAE4B, 417: 0xAE4F, 418: 0xAE51, 419: 0xAE52, 420: 0xAE53, 421: 0xAE55, 422: 0xAE57, 423: 0xAE58, 424: 0xAE59, 425: 0xAE5A, 426: 0xAE5B, 427: 0xAE5E, 428: 0xAE62, 429: 0xAE63, 430: 0xAE64, 431: 0xAE66, 432: 0xAE67, 433: 0xAE6A, 434: 0xAE6B, 435: 0xAE6D, 436: 0xAE6E, 437: 0xAE6F, 438: 0xAE71, 439: 0xAE72, 440: 0xAE73, 441: 0xAE74, 442: 0xAE75, 443: 0xAE76, 444: 0xAE77, 445: 0xAE7A, 446: 0xAE7E, 447: 0xAE7F, 448: 0xAE80, 449: 0xAE81, 450: 0xAE82, 451: 0xAE83, 452: 0xAE86, 453: 0xAE87, 454: 0xAE88, 455: 0xAE89, 456: 0xAE8A, 457: 0xAE8B, 458: 0xAE8D, 459: 0xAE8E, 460: 0xAE8F, 461: 0xAE90, 462: 0xAE91, 463: 0xAE92, 464: 0xAE93, 465: 0xAE94, 466: 0xAE95, 467: 0xAE96, 468: 0xAE97, 469: 0xAE98, 470: 0xAE99, 471: 0xAE9A, 472: 0xAE9B, 473: 0xAE9C, 474: 0xAE9D, 475: 0xAE9E, 476: 0xAE9F, 477: 0xAEA0, 478: 0xAEA1, 479: 0xAEA2, 480: 0xAEA3, 481: 0xAEA4, 482: 0xAEA5, 483: 0xAEA6, 484: 0xAEA7, 485: 0xAEA8, 486: 0xAEA9, 487: 0xAEAA, 488: 0xAEAB, 489: 0xAEAC, 490: 0xAEAD, 491: 0xAEAE, 492: 0xAEAF, 493: 0xAEB0, 494: 0xAEB1, 495: 0xAEB2, 496: 0xAEB3, 497: 0xAEB4, 498: 0xAEB5, 499: 0xAEB6, 500: 0xAEB7, 501: 0xAEB8, 502: 0xAEB9, 503: 0xAEBA, 504: 0xAEBB, 505: 0xAEBF, 506: 0xAEC1, 507: 0xAEC2, 508: 0xAEC3, 509: 0xAEC5, 510: 0xAEC6, 511: 0xAEC7, 512: 0xAEC8, 513: 0xAEC9, 514: 0xAECA, 515: 0xAECB, 516: 0xAECE, 517: 0xAED2, 518: 0xAED3, 519: 0xAED4, 520: 0xAED5, 521: 0xAED6, 522: 0xAED7, 523: 0xAEDA, 524: 0xAEDB, 525: 0xAEDD, 526: 0xAEDE, 527: 0xAEDF, 528: 0xAEE0, 529: 0xAEE1, 530: 0xAEE2, 531: 0xAEE3, 532: 0xAEE4, 533: 0xAEE5, 534: 0xAEE6, 535: 0xAEE7, 536: 0xAEE9, 537: 0xAEEA, 538: 0xAEEC, 539: 0xAEEE, 540: 0xAEEF, 541: 0xAEF0, 542: 0xAEF1, 543: 0xAEF2, 544: 0xAEF3, 545: 0xAEF5, 546: 0xAEF6, 547: 0xAEF7, 548: 0xAEF9, 549: 0xAEFA, 550: 0xAEFB, 551: 0xAEFD, 552: 0xAEFE, 553: 0xAEFF, 554: 0xAF00, 555: 0xAF01, 556: 0xAF02, 557: 0xAF03, 558: 0xAF04, 559: 0xAF05, 560: 0xAF06, 561: 0xAF09, 562: 0xAF0A, 563: 0xAF0B, 564: 0xAF0C, 565: 0xAF0E, 566: 0xAF0F, 567: 0xAF11, 568: 0xAF12, 569: 0xAF13, 570: 0xAF14, 571: 0xAF15, 572: 0xAF16, 573: 0xAF17, 574: 0xAF18, 575: 0xAF19, 576: 0xAF1A, 577: 0xAF1B, 578: 0xAF1C, 579: 0xAF1D, 580: 0xAF1E, 581: 0xAF1F, 582: 0xAF20, 583: 0xAF21, 584: 0xAF22, 585: 0xAF23, 586: 0xAF24, 587: 0xAF25, 588: 0xAF26, 589: 0xAF27, 590: 0xAF28, 591: 0xAF29, 592: 0xAF2A, 593: 0xAF2B, 594: 0xAF2E, 595: 0xAF2F, 596: 0xAF31, 597: 0xAF33, 598: 0xAF35, 599: 0xAF36, 600: 0xAF37, 601: 0xAF38, 602: 0xAF39, 603: 0xAF3A, 604: 0xAF3B, 605: 0xAF3E, 606: 0xAF40, 607: 0xAF44, 608: 0xAF45, 609: 0xAF46, 610: 0xAF47, 611: 0xAF4A, 612: 0xAF4B, 613: 0xAF4C, 614: 0xAF4D, 615: 0xAF4E, 616: 0xAF4F, 617: 0xAF51, 618: 0xAF52, 619: 0xAF53, 620: 0xAF54, 621: 0xAF55, 622: 0xAF56, 623: 0xAF57, 624: 0xAF58, 625: 0xAF59, 626: 0xAF5A, 627: 0xAF5B, 628: 0xAF5E, 629: 0xAF5F, 630: 0xAF60, 631: 0xAF61, 632: 0xAF62, 633: 0xAF63, 634: 0xAF66, 635: 0xAF67, 636: 0xAF68, 637: 0xAF69, 638: 0xAF6A, 639: 0xAF6B, 640: 0xAF6C, 641: 0xAF6D, 642: 0xAF6E, 643: 0xAF6F, 644: 0xAF70, 645: 0xAF71, 646: 0xAF72, 647: 0xAF73, 648: 0xAF74, 649: 0xAF75, 650: 0xAF76, 651: 0xAF77, 652: 0xAF78, 653: 0xAF7A, 654: 0xAF7B, 655: 0xAF7C, 656: 0xAF7D, 657: 0xAF7E, 658: 0xAF7F, 659: 0xAF81, 660: 0xAF82, 661: 0xAF83, 662: 0xAF85, 663: 0xAF86, 664: 0xAF87, 665: 0xAF89, 666: 0xAF8A, 667: 0xAF8B, 668: 0xAF8C, 669: 0xAF8D, 670: 0xAF8E, 671: 0xAF8F, 672: 0xAF92, 673: 0xAF93, 674: 0xAF94, 675: 0xAF96, 676: 0xAF97, 677: 0xAF98, 678: 0xAF99, 679: 0xAF9A, 680: 0xAF9B, 681: 0xAF9D, 682: 0xAF9E, 683: 0xAF9F, 684: 0xAFA0, 685: 0xAFA1, 686: 0xAFA2, 687: 0xAFA3, 688: 0xAFA4, 689: 0xAFA5, 690: 0xAFA6, 691: 0xAFA7, 692: 0xAFA8, 693: 0xAFA9, 694: 0xAFAA, 695: 0xAFAB, 696: 0xAFAC, 697: 0xAFAD, 698: 0xAFAE, 699: 0xAFAF, 700: 0xAFB0, 701: 0xAFB1, 702: 0xAFB2, 703: 0xAFB3, 704: 0xAFB4, 705: 0xAFB5, 706: 0xAFB6, 707: 0xAFB7, 708: 0xAFBA, 709: 0xAFBB, 710: 0xAFBD, 711: 0xAFBE, 712: 0xAFBF, 713: 0xAFC1, 714: 0xAFC2, 715: 0xAFC3, 716: 0xAFC4, 717: 0xAFC5, 718: 0xAFC6, 719: 0xAFCA, 720: 0xAFCC, 721: 0xAFCF, 722: 0xAFD0, 723: 0xAFD1, 724: 0xAFD2, 725: 0xAFD3, 726: 0xAFD5, 727: 0xAFD6, 728: 0xAFD7, 729: 0xAFD8, 730: 0xAFD9, 731: 0xAFDA, 732: 0xAFDB, 733: 0xAFDD, 734: 0xAFDE, 735: 0xAFDF, 736: 0xAFE0, 737: 0xAFE1, 738: 0xAFE2, 739: 0xAFE3, 740: 0xAFE4, 741: 0xAFE5, 742: 0xAFE6, 743: 0xAFE7, 744: 0xAFEA, 745: 0xAFEB, 746: 0xAFEC, 747: 0xAFED, 748: 0xAFEE, 749: 0xAFEF, 750: 0xAFF2, 751: 0xAFF3, 752: 0xAFF5, 753: 0xAFF6, 754: 0xAFF7, 755: 0xAFF9, 756: 0xAFFA, 757: 0xAFFB, 758: 0xAFFC, 759: 0xAFFD, 760: 0xAFFE, 761: 0xAFFF, 762: 0xB002, 763: 0xB003, 764: 0xB005, 765: 0xB006, 766: 0xB007, 767: 0xB008, 768: 0xB009, 769: 0xB00A, 770: 0xB00B, 771: 0xB00D, 772: 0xB00E, 773: 0xB00F, 774: 0xB011, 775: 0xB012, 776: 0xB013, 777: 0xB015, 778: 0xB016, 779: 0xB017, 780: 0xB018, 781: 0xB019, 782: 0xB01A, 783: 0xB01B, 784: 0xB01E, 785: 0xB01F, 786: 0xB020, 787: 0xB021, 788: 0xB022, 789: 0xB023, 790: 0xB024, 791: 0xB025, 792: 0xB026, 793: 0xB027, 794: 0xB029, 795: 0xB02A, 796: 0xB02B, 797: 0xB02C, 798: 0xB02D, 799: 0xB02E, 800: 0xB02F, 801: 0xB030, 802: 0xB031, 803: 0xB032, 804: 0xB033, 805: 0xB034, 806: 0xB035, 807: 0xB036, 808: 0xB037, 809: 0xB038, 810: 0xB039, 811: 0xB03A, 812: 0xB03B, 813: 0xB03C, 814: 0xB03D, 815: 0xB03E, 816: 0xB03F, 817: 0xB040, 818: 0xB041, 819: 0xB042, 820: 0xB043, 821: 0xB046, 822: 0xB047, 823: 0xB049, 824: 0xB04B, 825: 0xB04D, 826: 0xB04F, 827: 0xB050, 828: 0xB051, 829: 0xB052, 830: 0xB056, 831: 0xB058, 832: 0xB05A, 833: 0xB05B, 834: 0xB05C, 835: 0xB05E, 836: 0xB05F, 837: 0xB060, 838: 0xB061, 839: 0xB062, 840: 0xB063, 841: 0xB064, 842: 0xB065, 843: 0xB066, 844: 0xB067, 845: 0xB068, 846: 0xB069, 847: 0xB06A, 848: 0xB06B, 849: 0xB06C, 850: 0xB06D, 851: 0xB06E, 852: 0xB06F, 853: 0xB070, 854: 0xB071, 855: 0xB072, 856: 0xB073, 857: 0xB074, 858: 0xB075, 859: 0xB076, 860: 0xB077, 861: 0xB078, 862: 0xB079, 863: 0xB07A, 864: 0xB07B, 865: 0xB07E, 866: 0xB07F, 867: 0xB081, 868: 0xB082, 869: 0xB083, 870: 0xB085, 871: 0xB086, 872: 0xB087, 873: 0xB088, 874: 0xB089, 875: 0xB08A, 876: 0xB08B, 877: 0xB08E, 878: 0xB090, 879: 0xB092, 880: 0xB093, 881: 0xB094, 882: 0xB095, 883: 0xB096, 884: 0xB097, 885: 0xB09B, 886: 0xB09D, 887: 0xB09E, 888: 0xB0A3, 889: 0xB0A4, 890: 0xB0A5, 891: 0xB0A6, 892: 0xB0A7, 893: 0xB0AA, 894: 0xB0B0, 895: 0xB0B2, 896: 0xB0B6, 897: 0xB0B7, 898: 0xB0B9, 899: 0xB0BA, 900: 0xB0BB, 901: 0xB0BD, 902: 0xB0BE, 903: 0xB0BF, 904: 0xB0C0, 905: 0xB0C1, 906: 0xB0C2, 907: 0xB0C3, 908: 0xB0C6, 909: 0xB0CA, 910: 0xB0CB, 911: 0xB0CC, 912: 0xB0CD, 913: 0xB0CE, 914: 0xB0CF, 915: 0xB0D2, 916: 0xB0D3, 917: 0xB0D5, 918: 0xB0D6, 919: 0xB0D7, 920: 0xB0D9, 921: 0xB0DA, 922: 0xB0DB, 923: 0xB0DC, 924: 0xB0DD, 925: 0xB0DE, 926: 0xB0DF, 927: 0xB0E1, 928: 0xB0E2, 929: 0xB0E3, 930: 0xB0E4, 931: 0xB0E6, 932: 0xB0E7, 933: 0xB0E8, 934: 0xB0E9, 935: 0xB0EA, 936: 0xB0EB, 937: 0xB0EC, 938: 0xB0ED, 939: 0xB0EE, 940: 0xB0EF, 941: 0xB0F0, 942: 0xB0F1, 943: 0xB0F2, 944: 0xB0F3, 945: 0xB0F4, 946: 0xB0F5, 947: 0xB0F6, 948: 0xB0F7, 949: 0xB0F8, 950: 0xB0F9, 951: 0xB0FA, 952: 0xB0FB, 953: 0xB0FC, 954: 0xB0FD, 955: 0xB0FE, 956: 0xB0FF, 957: 0xB100, 958: 0xB101, 959: 0xB102, 960: 0xB103, 961: 0xB104, 962: 0xB105, 963: 0xB106, 964: 0xB107, 965: 0xB10A, 966: 0xB10D, 967: 0xB10E, 968: 0xB10F, 969: 0xB111, 970: 0xB114, 971: 0xB115, 972: 0xB116, 973: 0xB117, 974: 0xB11A, 975: 0xB11E, 976: 0xB11F, 977: 0xB120, 978: 0xB121, 979: 0xB122, 980: 0xB126, 981: 0xB127, 982: 0xB129, 983: 0xB12A, 984: 0xB12B, 985: 0xB12D, 986: 0xB12E, 987: 0xB12F, 988: 0xB130, 989: 0xB131, 990: 0xB132, 991: 0xB133, 992: 0xB136, 993: 0xB13A, 994: 0xB13B, 995: 0xB13C, 996: 0xB13D, 997: 0xB13E, 998: 0xB13F, 999: 0xB142, 1000: 0xB143, 1001: 0xB145, 1002: 0xB146, 1003: 0xB147, 1004: 0xB149, 1005: 0xB14A, 1006: 0xB14B, 1007: 0xB14C, 1008: 0xB14D, 1009: 0xB14E, 1010: 0xB14F, 1011: 0xB152, 1012: 0xB153, 1013: 0xB156, 1014: 0xB157, 1015: 0xB159, 1016: 0xB15A, 1017: 0xB15B, 1018: 0xB15D, 1019: 0xB15E, 1020: 0xB15F, 1021: 0xB161, 1022: 0xB162, 1023: 0xB163, 1024: 0xB164, 1025: 0xB165, 1026: 0xB166, 1027: 0xB167, 1028: 0xB168, 1029: 0xB169, 1030: 0xB16A, 1031: 0xB16B, 1032: 0xB16C, 1033: 0xB16D, 1034: 0xB16E, 1035: 0xB16F, 1036: 0xB170, 1037: 0xB171, 1038: 0xB172, 1039: 0xB173, 1040: 0xB174, 1041: 0xB175, 1042: 0xB176, 1043: 0xB177, 1044: 0xB17A, 1045: 0xB17B, 1046: 0xB17D, 1047: 0xB17E, 1048: 0xB17F, 1049: 0xB181, 1050: 0xB183, 1051: 0xB184, 1052: 0xB185, 1053: 0xB186, 1054: 0xB187, 1055: 0xB18A, 1056: 0xB18C, 1057: 0xB18E, 1058: 0xB18F, 1059: 0xB190, 1060: 0xB191, 1061: 0xB195, 1062: 0xB196, 1063: 0xB197, 1064: 0xB199, 1065: 0xB19A, 1066: 0xB19B, 1067: 0xB19D, 1068: 0xB19E, 1069: 0xB19F, 1070: 0xB1A0, 1071: 0xB1A1, 1072: 0xB1A2, 1073: 0xB1A3, 1074: 0xB1A4, 1075: 0xB1A5, 1076: 0xB1A6, 1077: 0xB1A7, 1078: 0xB1A9, 1079: 0xB1AA, 1080: 0xB1AB, 1081: 0xB1AC, 1082: 0xB1AD, 1083: 0xB1AE, 1084: 0xB1AF, 1085: 0xB1B0, 1086: 0xB1B1, 1087: 0xB1B2, 1088: 0xB1B3, 1089: 0xB1B4, 1090: 0xB1B5, 1091: 0xB1B6, 1092: 0xB1B7, 1093: 0xB1B8, 1094: 0xB1B9, 1095: 0xB1BA, 1096: 0xB1BB, 1097: 0xB1BC, 1098: 0xB1BD, 1099: 0xB1BE, 1100: 0xB1BF, 1101: 0xB1C0, 1102: 0xB1C1, 1103: 0xB1C2, 1104: 0xB1C3, 1105: 0xB1C4, 1106: 0xB1C5, 1107: 0xB1C6, 1108: 0xB1C7, 1109: 0xB1C8, 1110: 0xB1C9, 1111: 0xB1CA, 1112: 0xB1CB, 1113: 0xB1CD, 1114: 0xB1CE, 1115: 0xB1CF, 1116: 0xB1D1, 1117: 0xB1D2, 1118: 0xB1D3, 1119: 0xB1D5, 1120: 0xB1D6, 1121: 0xB1D7, 1122: 0xB1D8, 1123: 0xB1D9, 1124: 0xB1DA, 1125: 0xB1DB, 1126: 0xB1DE, 1127: 0xB1E0, 1128: 0xB1E1, 1129: 0xB1E2, 1130: 0xB1E3, 1131: 0xB1E4, 1132: 0xB1E5, 1133: 0xB1E6, 1134: 0xB1E7, 1135: 0xB1EA, 1136: 0xB1EB, 1137: 0xB1ED, 1138: 0xB1EE, 1139: 0xB1EF, 1140: 0xB1F1, 1141: 0xB1F2, 1142: 0xB1F3, 1143: 0xB1F4, 1144: 0xB1F5, 1145: 0xB1F6, 1146: 0xB1F7, 1147: 0xB1F8, 1148: 0xB1FA, 1149: 0xB1FC, 1150: 0xB1FE, 1151: 0xB1FF, 1152: 0xB200, 1153: 0xB201, 1154: 0xB202, 1155: 0xB203, 1156: 0xB206, 1157: 0xB207, 1158: 0xB209, 1159: 0xB20A, 1160: 0xB20D, 1161: 0xB20E, 1162: 0xB20F, 1163: 0xB210, 1164: 0xB211, 1165: 0xB212, 1166: 0xB213, 1167: 0xB216, 1168: 0xB218, 1169: 0xB21A, 1170: 0xB21B, 1171: 0xB21C, 1172: 0xB21D, 1173: 0xB21E, 1174: 0xB21F, 1175: 0xB221, 1176: 0xB222, 1177: 0xB223, 1178: 0xB224, 1179: 0xB225, 1180: 0xB226, 1181: 0xB227, 1182: 0xB228, 1183: 0xB229, 1184: 0xB22A, 1185: 0xB22B, 1186: 0xB22C, 1187: 0xB22D, 1188: 0xB22E, 1189: 0xB22F, 1190: 0xB230, 1191: 0xB231, 1192: 0xB232, 1193: 0xB233, 1194: 0xB235, 1195: 0xB236, 1196: 0xB237, 1197: 0xB238, 1198: 0xB239, 1199: 0xB23A, 1200: 0xB23B, 1201: 0xB23D, 1202: 0xB23E, 1203: 0xB23F, 1204: 0xB240, 1205: 0xB241, 1206: 0xB242, 1207: 0xB243, 1208: 0xB244, 1209: 0xB245, 1210: 0xB246, 1211: 0xB247, 1212: 0xB248, 1213: 0xB249, 1214: 0xB24A, 1215: 0xB24B, 1216: 0xB24C, 1217: 0xB24D, 1218: 0xB24E, 1219: 0xB24F, 1220: 0xB250, 1221: 0xB251, 1222: 0xB252, 1223: 0xB253, 1224: 0xB254, 1225: 0xB255, 1226: 0xB256, 1227: 0xB257, 1228: 0xB259, 1229: 0xB25A, 1230: 0xB25B, 1231: 0xB25D, 1232: 0xB25E, 1233: 0xB25F, 1234: 0xB261, 1235: 0xB262, 1236: 0xB263, 1237: 0xB264, 1238: 0xB265, 1239: 0xB266, 1240: 0xB267, 1241: 0xB26A, 1242: 0xB26B, 1243: 0xB26C, 1244: 0xB26D, 1245: 0xB26E, 1246: 0xB26F, 1247: 0xB270, 1248: 0xB271, 1249: 0xB272, 1250: 0xB273, 1251: 0xB276, 1252: 0xB277, 1253: 0xB278, 1254: 0xB279, 1255: 0xB27A, 1256: 0xB27B, 1257: 0xB27D, 1258: 0xB27E, 1259: 0xB27F, 1260: 0xB280, 1261: 0xB281, 1262: 0xB282, 1263: 0xB283, 1264: 0xB286, 1265: 0xB287, 1266: 0xB288, 1267: 0xB28A, 1268: 0xB28B, 1269: 0xB28C, 1270: 0xB28D, 1271: 0xB28E, 1272: 0xB28F, 1273: 0xB292, 1274: 0xB293, 1275: 0xB295, 1276: 0xB296, 1277: 0xB297, 1278: 0xB29B, 1279: 0xB29C, 1280: 0xB29D, 1281: 0xB29E, 1282: 0xB29F, 1283: 0xB2A2, 1284: 0xB2A4, 1285: 0xB2A7, 1286: 0xB2A8, 1287: 0xB2A9, 1288: 0xB2AB, 1289: 0xB2AD, 1290: 0xB2AE, 1291: 0xB2AF, 1292: 0xB2B1, 1293: 0xB2B2, 1294: 0xB2B3, 1295: 0xB2B5, 1296: 0xB2B6, 1297: 0xB2B7, 1298: 0xB2B8, 1299: 0xB2B9, 1300: 0xB2BA, 1301: 0xB2BB, 1302: 0xB2BC, 1303: 0xB2BD, 1304: 0xB2BE, 1305: 0xB2BF, 1306: 0xB2C0, 1307: 0xB2C1, 1308: 0xB2C2, 1309: 0xB2C3, 1310: 0xB2C4, 1311: 0xB2C5, 1312: 0xB2C6, 1313: 0xB2C7, 1314: 0xB2CA, 1315: 0xB2CB, 1316: 0xB2CD, 1317: 0xB2CE, 1318: 0xB2CF, 1319: 0xB2D1, 1320: 0xB2D3, 1321: 0xB2D4, 1322: 0xB2D5, 1323: 0xB2D6, 1324: 0xB2D7, 1325: 0xB2DA, 1326: 0xB2DC, 1327: 0xB2DE, 1328: 0xB2DF, 1329: 0xB2E0, 1330: 0xB2E1, 1331: 0xB2E3, 1332: 0xB2E7, 1333: 0xB2E9, 1334: 0xB2EA, 1335: 0xB2F0, 1336: 0xB2F1, 1337: 0xB2F2, 1338: 0xB2F6, 1339: 0xB2FC, 1340: 0xB2FD, 1341: 0xB2FE, 1342: 0xB302, 1343: 0xB303, 1344: 0xB305, 1345: 0xB306, 1346: 0xB307, 1347: 0xB309, 1348: 0xB30A, 1349: 0xB30B, 1350: 0xB30C, 1351: 0xB30D, 1352: 0xB30E, 1353: 0xB30F, 1354: 0xB312, 1355: 0xB316, 1356: 0xB317, 1357: 0xB318, 1358: 0xB319, 1359: 0xB31A, 1360: 0xB31B, 1361: 0xB31D, 1362: 0xB31E, 1363: 0xB31F, 1364: 0xB320, 1365: 0xB321, 1366: 0xB322, 1367: 0xB323, 1368: 0xB324, 1369: 0xB325, 1370: 0xB326, 1371: 0xB327, 1372: 0xB328, 1373: 0xB329, 1374: 0xB32A, 1375: 0xB32B, 1376: 0xB32C, 1377: 0xB32D, 1378: 0xB32E, 1379: 0xB32F, 1380: 0xB330, 1381: 0xB331, 1382: 0xB332, 1383: 0xB333, 1384: 0xB334, 1385: 0xB335, 1386: 0xB336, 1387: 0xB337, 1388: 0xB338, 1389: 0xB339, 1390: 0xB33A, 1391: 0xB33B, 1392: 0xB33C, 1393: 0xB33D, 1394: 0xB33E, 1395: 0xB33F, 1396: 0xB340, 1397: 0xB341, 1398: 0xB342, 1399: 0xB343, 1400: 0xB344, 1401: 0xB345, 1402: 0xB346, 1403: 0xB347, 1404: 0xB348, 1405: 0xB349, 1406: 0xB34A, 1407: 0xB34B, 1408: 0xB34C, 1409: 0xB34D, 1410: 0xB34E, 1411: 0xB34F, 1412: 0xB350, 1413: 0xB351, 1414: 0xB352, 1415: 0xB353, 1416: 0xB357, 1417: 0xB359, 1418: 0xB35A, 1419: 0xB35D, 1420: 0xB360, 1421: 0xB361, 1422: 0xB362, 1423: 0xB363, 1424: 0xB366, 1425: 0xB368, 1426: 0xB36A, 1427: 0xB36C, 1428: 0xB36D, 1429: 0xB36F, 1430: 0xB372, 1431: 0xB373, 1432: 0xB375, 1433: 0xB376, 1434: 0xB377, 1435: 0xB379, 1436: 0xB37A, 1437: 0xB37B, 1438: 0xB37C, 1439: 0xB37D, 1440: 0xB37E, 1441: 0xB37F, 1442: 0xB382, 1443: 0xB386, 1444: 0xB387, 1445: 0xB388, 1446: 0xB389, 1447: 0xB38A, 1448: 0xB38B, 1449: 0xB38D, 1450: 0xB38E, 1451: 0xB38F, 1452: 0xB391, 1453: 0xB392, 1454: 0xB393, 1455: 0xB395, 1456: 0xB396, 1457: 0xB397, 1458: 0xB398, 1459: 0xB399, 1460: 0xB39A, 1461: 0xB39B, 1462: 0xB39C, 1463: 0xB39D, 1464: 0xB39E, 1465: 0xB39F, 1466: 0xB3A2, 1467: 0xB3A3, 1468: 0xB3A4, 1469: 0xB3A5, 1470: 0xB3A6, 1471: 0xB3A7, 1472: 0xB3A9, 1473: 0xB3AA, 1474: 0xB3AB, 1475: 0xB3AD, 1476: 0xB3AE, 1477: 0xB3AF, 1478: 0xB3B0, 1479: 0xB3B1, 1480: 0xB3B2, 1481: 0xB3B3, 1482: 0xB3B4, 1483: 0xB3B5, 1484: 0xB3B6, 1485: 0xB3B7, 1486: 0xB3B8, 1487: 0xB3B9, 1488: 0xB3BA, 1489: 0xB3BB, 1490: 0xB3BC, 1491: 0xB3BD, 1492: 0xB3BE, 1493: 0xB3BF, 1494: 0xB3C0, 1495: 0xB3C1, 1496: 0xB3C2, 1497: 0xB3C3, 1498: 0xB3C6, 1499: 0xB3C7, 1500: 0xB3C9, 1501: 0xB3CA, 1502: 0xB3CD, 1503: 0xB3CF, 1504: 0xB3D1, 1505: 0xB3D2, 1506: 0xB3D3, 1507: 0xB3D6, 1508: 0xB3D8, 1509: 0xB3DA, 1510: 0xB3DC, 1511: 0xB3DE, 1512: 0xB3DF, 1513: 0xB3E1, 1514: 0xB3E2, 1515: 0xB3E3, 1516: 0xB3E5, 1517: 0xB3E6, 1518: 0xB3E7, 1519: 0xB3E9, 1520: 0xB3EA, 1521: 0xB3EB, 1522: 0xB3EC, 1523: 0xB3ED, 1524: 0xB3EE, 1525: 0xB3EF, 1526: 0xB3F0, 1527: 0xB3F1, 1528: 0xB3F2, 1529: 0xB3F3, 1530: 0xB3F4, 1531: 0xB3F5, 1532: 0xB3F6, 1533: 0xB3F7, 1534: 0xB3F8, 1535: 0xB3F9, 1536: 0xB3FA, 1537: 0xB3FB, 1538: 0xB3FD, 1539: 0xB3FE, 1540: 0xB3FF, 1541: 0xB400, 1542: 0xB401, 1543: 0xB402, 1544: 0xB403, 1545: 0xB404, 1546: 0xB405, 1547: 0xB406, 1548: 0xB407, 1549: 0xB408, 1550: 0xB409, 1551: 0xB40A, 1552: 0xB40B, 1553: 0xB40C, 1554: 0xB40D, 1555: 0xB40E, 1556: 0xB40F, 1557: 0xB411, 1558: 0xB412, 1559: 0xB413, 1560: 0xB414, 1561: 0xB415, 1562: 0xB416, 1563: 0xB417, 1564: 0xB419, 1565: 0xB41A, 1566: 0xB41B, 1567: 0xB41D, 1568: 0xB41E, 1569: 0xB41F, 1570: 0xB421, 1571: 0xB422, 1572: 0xB423, 1573: 0xB424, 1574: 0xB425, 1575: 0xB426, 1576: 0xB427, 1577: 0xB42A, 1578: 0xB42C, 1579: 0xB42D, 1580: 0xB42E, 1581: 0xB42F, 1582: 0xB430, 1583: 0xB431, 1584: 0xB432, 1585: 0xB433, 1586: 0xB435, 1587: 0xB436, 1588: 0xB437, 1589: 0xB438, 1590: 0xB439, 1591: 0xB43A, 1592: 0xB43B, 1593: 0xB43C, 1594: 0xB43D, 1595: 0xB43E, 1596: 0xB43F, 1597: 0xB440, 1598: 0xB441, 1599: 0xB442, 1600: 0xB443, 1601: 0xB444, 1602: 0xB445, 1603: 0xB446, 1604: 0xB447, 1605: 0xB448, 1606: 0xB449, 1607: 0xB44A, 1608: 0xB44B, 1609: 0xB44C, 1610: 0xB44D, 1611: 0xB44E, 1612: 0xB44F, 1613: 0xB452, 1614: 0xB453, 1615: 0xB455, 1616: 0xB456, 1617: 0xB457, 1618: 0xB459, 1619: 0xB45A, 1620: 0xB45B, 1621: 0xB45C, 1622: 0xB45D, 1623: 0xB45E, 1624: 0xB45F, 1625: 0xB462, 1626: 0xB464, 1627: 0xB466, 1628: 0xB467, 1629: 0xB468, 1630: 0xB469, 1631: 0xB46A, 1632: 0xB46B, 1633: 0xB46D, 1634: 0xB46E, 1635: 0xB46F, 1636: 0xB470, 1637: 0xB471, 1638: 0xB472, 1639: 0xB473, 1640: 0xB474, 1641: 0xB475, 1642: 0xB476, 1643: 0xB477, 1644: 0xB478, 1645: 0xB479, 1646: 0xB47A, 1647: 0xB47B, 1648: 0xB47C, 1649: 0xB47D, 1650: 0xB47E, 1651: 0xB47F, 1652: 0xB481, 1653: 0xB482, 1654: 0xB483, 1655: 0xB484, 1656: 0xB485, 1657: 0xB486, 1658: 0xB487, 1659: 0xB489, 1660: 0xB48A, 1661: 0xB48B, 1662: 0xB48C, 1663: 0xB48D, 1664: 0xB48E, 1665: 0xB48F, 1666: 0xB490, 1667: 0xB491, 1668: 0xB492, 1669: 0xB493, 1670: 0xB494, 1671: 0xB495, 1672: 0xB496, 1673: 0xB497, 1674: 0xB498, 1675: 0xB499, 1676: 0xB49A, 1677: 0xB49B, 1678: 0xB49C, 1679: 0xB49E, 1680: 0xB49F, 1681: 0xB4A0, 1682: 0xB4A1, 1683: 0xB4A2, 1684: 0xB4A3, 1685: 0xB4A5, 1686: 0xB4A6, 1687: 0xB4A7, 1688: 0xB4A9, 1689: 0xB4AA, 1690: 0xB4AB, 1691: 0xB4AD, 1692: 0xB4AE, 1693: 0xB4AF, 1694: 0xB4B0, 1695: 0xB4B1, 1696: 0xB4B2, 1697: 0xB4B3, 1698: 0xB4B4, 1699: 0xB4B6, 1700: 0xB4B8, 1701: 0xB4BA, 1702: 0xB4BB, 1703: 0xB4BC, 1704: 0xB4BD, 1705: 0xB4BE, 1706: 0xB4BF, 1707: 0xB4C1, 1708: 0xB4C2, 1709: 0xB4C3, 1710: 0xB4C5, 1711: 0xB4C6, 1712: 0xB4C7, 1713: 0xB4C9, 1714: 0xB4CA, 1715: 0xB4CB, 1716: 0xB4CC, 1717: 0xB4CD, 1718: 0xB4CE, 1719: 0xB4CF, 1720: 0xB4D1, 1721: 0xB4D2, 1722: 0xB4D3, 1723: 0xB4D4, 1724: 0xB4D6, 1725: 0xB4D7, 1726: 0xB4D8, 1727: 0xB4D9, 1728: 0xB4DA, 1729: 0xB4DB, 1730: 0xB4DE, 1731: 0xB4DF, 1732: 0xB4E1, 1733: 0xB4E2, 1734: 0xB4E5, 1735: 0xB4E7, 1736: 0xB4E8, 1737: 0xB4E9, 1738: 0xB4EA, 1739: 0xB4EB, 1740: 0xB4EE, 1741: 0xB4F0, 1742: 0xB4F2, 1743: 0xB4F3, 1744: 0xB4F4, 1745: 0xB4F5, 1746: 0xB4F6, 1747: 0xB4F7, 1748: 0xB4F9, 1749: 0xB4FA, 1750: 0xB4FB, 1751: 0xB4FC, 1752: 0xB4FD, 1753: 0xB4FE, 1754: 0xB4FF, 1755: 0xB500, 1756: 0xB501, 1757: 0xB502, 1758: 0xB503, 1759: 0xB504, 1760: 0xB505, 1761: 0xB506, 1762: 0xB507, 1763: 0xB508, 1764: 0xB509, 1765: 0xB50A, 1766: 0xB50B, 1767: 0xB50C, 1768: 0xB50D, 1769: 0xB50E, 1770: 0xB50F, 1771: 0xB510, 1772: 0xB511, 1773: 0xB512, 1774: 0xB513, 1775: 0xB516, 1776: 0xB517, 1777: 0xB519, 1778: 0xB51A, 1779: 0xB51D, 1780: 0xB51E, 1781: 0xB51F, 1782: 0xB520, 1783: 0xB521, 1784: 0xB522, 1785: 0xB523, 1786: 0xB526, 1787: 0xB52B, 1788: 0xB52C, 1789: 0xB52D, 1790: 0xB52E, 1791: 0xB52F, 1792: 0xB532, 1793: 0xB533, 1794: 0xB535, 1795: 0xB536, 1796: 0xB537, 1797: 0xB539, 1798: 0xB53A, 1799: 0xB53B, 1800: 0xB53C, 1801: 0xB53D, 1802: 0xB53E, 1803: 0xB53F, 1804: 0xB542, 1805: 0xB546, 1806: 0xB547, 1807: 0xB548, 1808: 0xB549, 1809: 0xB54A, 1810: 0xB54E, 1811: 0xB54F, 1812: 0xB551, 1813: 0xB552, 1814: 0xB553, 1815: 0xB555, 1816: 0xB556, 1817: 0xB557, 1818: 0xB558, 1819: 0xB559, 1820: 0xB55A, 1821: 0xB55B, 1822: 0xB55E, 1823: 0xB562, 1824: 0xB563, 1825: 0xB564, 1826: 0xB565, 1827: 0xB566, 1828: 0xB567, 1829: 0xB568, 1830: 0xB569, 1831: 0xB56A, 1832: 0xB56B, 1833: 0xB56C, 1834: 0xB56D, 1835: 0xB56E, 1836: 0xB56F, 1837: 0xB570, 1838: 0xB571, 1839: 0xB572, 1840: 0xB573, 1841: 0xB574, 1842: 0xB575, 1843: 0xB576, 1844: 0xB577, 1845: 0xB578, 1846: 0xB579, 1847: 0xB57A, 1848: 0xB57B, 1849: 0xB57C, 1850: 0xB57D, 1851: 0xB57E, 1852: 0xB57F, 1853: 0xB580, 1854: 0xB581, 1855: 0xB582, 1856: 0xB583, 1857: 0xB584, 1858: 0xB585, 1859: 0xB586, 1860: 0xB587, 1861: 0xB588, 1862: 0xB589, 1863: 0xB58A, 1864: 0xB58B, 1865: 0xB58C, 1866: 0xB58D, 1867: 0xB58E, 1868: 0xB58F, 1869: 0xB590, 1870: 0xB591, 1871: 0xB592, 1872: 0xB593, 1873: 0xB594, 1874: 0xB595, 1875: 0xB596, 1876: 0xB597, 1877: 0xB598, 1878: 0xB599, 1879: 0xB59A, 1880: 0xB59B, 1881: 0xB59C, 1882: 0xB59D, 1883: 0xB59E, 1884: 0xB59F, 1885: 0xB5A2, 1886: 0xB5A3, 1887: 0xB5A5, 1888: 0xB5A6, 1889: 0xB5A7, 1890: 0xB5A9, 1891: 0xB5AC, 1892: 0xB5AD, 1893: 0xB5AE, 1894: 0xB5AF, 1895: 0xB5B2, 1896: 0xB5B6, 1897: 0xB5B7, 1898: 0xB5B8, 1899: 0xB5B9, 1900: 0xB5BA, 1901: 0xB5BE, 1902: 0xB5BF, 1903: 0xB5C1, 1904: 0xB5C2, 1905: 0xB5C3, 1906: 0xB5C5, 1907: 0xB5C6, 1908: 0xB5C7, 1909: 0xB5C8, 1910: 0xB5C9, 1911: 0xB5CA, 1912: 0xB5CB, 1913: 0xB5CE, 1914: 0xB5D2, 1915: 0xB5D3, 1916: 0xB5D4, 1917: 0xB5D5, 1918: 0xB5D6, 1919: 0xB5D7, 1920: 0xB5D9, 1921: 0xB5DA, 1922: 0xB5DB, 1923: 0xB5DC, 1924: 0xB5DD, 1925: 0xB5DE, 1926: 0xB5DF, 1927: 0xB5E0, 1928: 0xB5E1, 1929: 0xB5E2, 1930: 0xB5E3, 1931: 0xB5E4, 1932: 0xB5E5, 1933: 0xB5E6, 1934: 0xB5E7, 1935: 0xB5E8, 1936: 0xB5E9, 1937: 0xB5EA, 1938: 0xB5EB, 1939: 0xB5ED, 1940: 0xB5EE, 1941: 0xB5EF, 1942: 0xB5F0, 1943: 0xB5F1, 1944: 0xB5F2, 1945: 0xB5F3, 1946: 0xB5F4, 1947: 0xB5F5, 1948: 0xB5F6, 1949: 0xB5F7, 1950: 0xB5F8, 1951: 0xB5F9, 1952: 0xB5FA, 1953: 0xB5FB, 1954: 0xB5FC, 1955: 0xB5FD, 1956: 0xB5FE, 1957: 0xB5FF, 1958: 0xB600, 1959: 0xB601, 1960: 0xB602, 1961: 0xB603, 1962: 0xB604, 1963: 0xB605, 1964: 0xB606, 1965: 0xB607, 1966: 0xB608, 1967: 0xB609, 1968: 0xB60A, 1969: 0xB60B, 1970: 0xB60C, 1971: 0xB60D, 1972: 0xB60E, 1973: 0xB60F, 1974: 0xB612, 1975: 0xB613, 1976: 0xB615, 1977: 0xB616, 1978: 0xB617, 1979: 0xB619, 1980: 0xB61A, 1981: 0xB61B, 1982: 0xB61C, 1983: 0xB61D, 1984: 0xB61E, 1985: 0xB61F, 1986: 0xB620, 1987: 0xB621, 1988: 0xB622, 1989: 0xB623, 1990: 0xB624, 1991: 0xB626, 1992: 0xB627, 1993: 0xB628, 1994: 0xB629, 1995: 0xB62A, 1996: 0xB62B, 1997: 0xB62D, 1998: 0xB62E, 1999: 0xB62F, 2000: 0xB630, 2001: 0xB631, 2002: 0xB632, 2003: 0xB633, 2004: 0xB635, 2005: 0xB636, 2006: 0xB637, 2007: 0xB638, 2008: 0xB639, 2009: 0xB63A, 2010: 0xB63B, 2011: 0xB63C, 2012: 0xB63D, 2013: 0xB63E, 2014: 0xB63F, 2015: 0xB640, 2016: 0xB641, 2017: 0xB642, 2018: 0xB643, 2019: 0xB644, 2020: 0xB645, 2021: 0xB646, 2022: 0xB647, 2023: 0xB649, 2024: 0xB64A, 2025: 0xB64B, 2026: 0xB64C, 2027: 0xB64D, 2028: 0xB64E, 2029: 0xB64F, 2030: 0xB650, 2031: 0xB651, 2032: 0xB652, 2033: 0xB653, 2034: 0xB654, 2035: 0xB655, 2036: 0xB656, 2037: 0xB657, 2038: 0xB658, 2039: 0xB659, 2040: 0xB65A, 2041: 0xB65B, 2042: 0xB65C, 2043: 0xB65D, 2044: 0xB65E, 2045: 0xB65F, 2046: 0xB660, 2047: 0xB661, 2048: 0xB662, 2049: 0xB663, 2050: 0xB665, 2051: 0xB666, 2052: 0xB667, 2053: 0xB669, 2054: 0xB66A, 2055: 0xB66B, 2056: 0xB66C, 2057: 0xB66D, 2058: 0xB66E, 2059: 0xB66F, 2060: 0xB670, 2061: 0xB671, 2062: 0xB672, 2063: 0xB673, 2064: 0xB674, 2065: 0xB675, 2066: 0xB676, 2067: 0xB677, 2068: 0xB678, 2069: 0xB679, 2070: 0xB67A, 2071: 0xB67B, 2072: 0xB67C, 2073: 0xB67D, 2074: 0xB67E, 2075: 0xB67F, 2076: 0xB680, 2077: 0xB681, 2078: 0xB682, 2079: 0xB683, 2080: 0xB684, 2081: 0xB685, 2082: 0xB686, 2083: 0xB687, 2084: 0xB688, 2085: 0xB689, 2086: 0xB68A, 2087: 0xB68B, 2088: 0xB68C, 2089: 0xB68D, 2090: 0xB68E, 2091: 0xB68F, 2092: 0xB690, 2093: 0xB691, 2094: 0xB692, 2095: 0xB693, 2096: 0xB694, 2097: 0xB695, 2098: 0xB696, 2099: 0xB697, 2100: 0xB698, 2101: 0xB699, 2102: 0xB69A, 2103: 0xB69B, 2104: 0xB69E, 2105: 0xB69F, 2106: 0xB6A1, 2107: 0xB6A2, 2108: 0xB6A3, 2109: 0xB6A5, 2110: 0xB6A6, 2111: 0xB6A7, 2112: 0xB6A8, 2113: 0xB6A9, 2114: 0xB6AA, 2115: 0xB6AD, 2116: 0xB6AE, 2117: 0xB6AF, 2118: 0xB6B0, 2119: 0xB6B2, 2120: 0xB6B3, 2121: 0xB6B4, 2122: 0xB6B5, 2123: 0xB6B6, 2124: 0xB6B7, 2125: 0xB6B8, 2126: 0xB6B9, 2127: 0xB6BA, 2128: 0xB6BB, 2129: 0xB6BC, 2130: 0xB6BD, 2131: 0xB6BE, 2132: 0xB6BF, 2133: 0xB6C0, 2134: 0xB6C1, 2135: 0xB6C2, 2136: 0xB6C3, 2137: 0xB6C4, 2138: 0xB6C5, 2139: 0xB6C6, 2140: 0xB6C7, 2141: 0xB6C8, 2142: 0xB6C9, 2143: 0xB6CA, 2144: 0xB6CB, 2145: 0xB6CC, 2146: 0xB6CD, 2147: 0xB6CE, 2148: 0xB6CF, 2149: 0xB6D0, 2150: 0xB6D1, 2151: 0xB6D2, 2152: 0xB6D3, 2153: 0xB6D5, 2154: 0xB6D6, 2155: 0xB6D7, 2156: 0xB6D8, 2157: 0xB6D9, 2158: 0xB6DA, 2159: 0xB6DB, 2160: 0xB6DC, 2161: 0xB6DD, 2162: 0xB6DE, 2163: 0xB6DF, 2164: 0xB6E0, 2165: 0xB6E1, 2166: 0xB6E2, 2167: 0xB6E3, 2168: 0xB6E4, 2169: 0xB6E5, 2170: 0xB6E6, 2171: 0xB6E7, 2172: 0xB6E8, 2173: 0xB6E9, 2174: 0xB6EA, 2175: 0xB6EB, 2176: 0xB6EC, 2177: 0xB6ED, 2178: 0xB6EE, 2179: 0xB6EF, 2180: 0xB6F1, 2181: 0xB6F2, 2182: 0xB6F3, 2183: 0xB6F5, 2184: 0xB6F6, 2185: 0xB6F7, 2186: 0xB6F9, 2187: 0xB6FA, 2188: 0xB6FB, 2189: 0xB6FC, 2190: 0xB6FD, 2191: 0xB6FE, 2192: 0xB6FF, 2193: 0xB702, 2194: 0xB703, 2195: 0xB704, 2196: 0xB706, 2197: 0xB707, 2198: 0xB708, 2199: 0xB709, 2200: 0xB70A, 2201: 0xB70B, 2202: 0xB70C, 2203: 0xB70D, 2204: 0xB70E, 2205: 0xB70F, 2206: 0xB710, 2207: 0xB711, 2208: 0xB712, 2209: 0xB713, 2210: 0xB714, 2211: 0xB715, 2212: 0xB716, 2213: 0xB717, 2214: 0xB718, 2215: 0xB719, 2216: 0xB71A, 2217: 0xB71B, 2218: 0xB71C, 2219: 0xB71D, 2220: 0xB71E, 2221: 0xB71F, 2222: 0xB720, 2223: 0xB721, 2224: 0xB722, 2225: 0xB723, 2226: 0xB724, 2227: 0xB725, 2228: 0xB726, 2229: 0xB727, 2230: 0xB72A, 2231: 0xB72B, 2232: 0xB72D, 2233: 0xB72E, 2234: 0xB731, 2235: 0xB732, 2236: 0xB733, 2237: 0xB734, 2238: 0xB735, 2239: 0xB736, 2240: 0xB737, 2241: 0xB73A, 2242: 0xB73C, 2243: 0xB73D, 2244: 0xB73E, 2245: 0xB73F, 2246: 0xB740, 2247: 0xB741, 2248: 0xB742, 2249: 0xB743, 2250: 0xB745, 2251: 0xB746, 2252: 0xB747, 2253: 0xB749, 2254: 0xB74A, 2255: 0xB74B, 2256: 0xB74D, 2257: 0xB74E, 2258: 0xB74F, 2259: 0xB750, 2260: 0xB751, 2261: 0xB752, 2262: 0xB753, 2263: 0xB756, 2264: 0xB757, 2265: 0xB758, 2266: 0xB759, 2267: 0xB75A, 2268: 0xB75B, 2269: 0xB75C, 2270: 0xB75D, 2271: 0xB75E, 2272: 0xB75F, 2273: 0xB761, 2274: 0xB762, 2275: 0xB763, 2276: 0xB765, 2277: 0xB766, 2278: 0xB767, 2279: 0xB769, 2280: 0xB76A, 2281: 0xB76B, 2282: 0xB76C, 2283: 0xB76D, 2284: 0xB76E, 2285: 0xB76F, 2286: 0xB772, 2287: 0xB774, 2288: 0xB776, 2289: 0xB777, 2290: 0xB778, 2291: 0xB779, 2292: 0xB77A, 2293: 0xB77B, 2294: 0xB77E, 2295: 0xB77F, 2296: 0xB781, 2297: 0xB782, 2298: 0xB783, 2299: 0xB785, 2300: 0xB786, 2301: 0xB787, 2302: 0xB788, 2303: 0xB789, 2304: 0xB78A, 2305: 0xB78B, 2306: 0xB78E, 2307: 0xB793, 2308: 0xB794, 2309: 0xB795, 2310: 0xB79A, 2311: 0xB79B, 2312: 0xB79D, 2313: 0xB79E, 2314: 0xB79F, 2315: 0xB7A1, 2316: 0xB7A2, 2317: 0xB7A3, 2318: 0xB7A4, 2319: 0xB7A5, 2320: 0xB7A6, 2321: 0xB7A7, 2322: 0xB7AA, 2323: 0xB7AE, 2324: 0xB7AF, 2325: 0xB7B0, 2326: 0xB7B1, 2327: 0xB7B2, 2328: 0xB7B3, 2329: 0xB7B6, 2330: 0xB7B7, 2331: 0xB7B9, 2332: 0xB7BA, 2333: 0xB7BB, 2334: 0xB7BC, 2335: 0xB7BD, 2336: 0xB7BE, 2337: 0xB7BF, 2338: 0xB7C0, 2339: 0xB7C1, 2340: 0xB7C2, 2341: 0xB7C3, 2342: 0xB7C4, 2343: 0xB7C5, 2344: 0xB7C6, 2345: 0xB7C8, 2346: 0xB7CA, 2347: 0xB7CB, 2348: 0xB7CC, 2349: 0xB7CD, 2350: 0xB7CE, 2351: 0xB7CF, 2352: 0xB7D0, 2353: 0xB7D1, 2354: 0xB7D2, 2355: 0xB7D3, 2356: 0xB7D4, 2357: 0xB7D5, 2358: 0xB7D6, 2359: 0xB7D7, 2360: 0xB7D8, 2361: 0xB7D9, 2362: 0xB7DA, 2363: 0xB7DB, 2364: 0xB7DC, 2365: 0xB7DD, 2366: 0xB7DE, 2367: 0xB7DF, 2368: 0xB7E0, 2369: 0xB7E1, 2370: 0xB7E2, 2371: 0xB7E3, 2372: 0xB7E4, 2373: 0xB7E5, 2374: 0xB7E6, 2375: 0xB7E7, 2376: 0xB7E8, 2377: 0xB7E9, 2378: 0xB7EA, 2379: 0xB7EB, 2380: 0xB7EE, 2381: 0xB7EF, 2382: 0xB7F1, 2383: 0xB7F2, 2384: 0xB7F3, 2385: 0xB7F5, 2386: 0xB7F6, 2387: 0xB7F7, 2388: 0xB7F8, 2389: 0xB7F9, 2390: 0xB7FA, 2391: 0xB7FB, 2392: 0xB7FE, 2393: 0xB802, 2394: 0xB803, 2395: 0xB804, 2396: 0xB805, 2397: 0xB806, 2398: 0xB80A, 2399: 0xB80B, 2400: 0xB80D, 2401: 0xB80E, 2402: 0xB80F, 2403: 0xB811, 2404: 0xB812, 2405: 0xB813, 2406: 0xB814, 2407: 0xB815, 2408: 0xB816, 2409: 0xB817, 2410: 0xB81A, 2411: 0xB81C, 2412: 0xB81E, 2413: 0xB81F, 2414: 0xB820, 2415: 0xB821, 2416: 0xB822, 2417: 0xB823, 2418: 0xB826, 2419: 0xB827, 2420: 0xB829, 2421: 0xB82A, 2422: 0xB82B, 2423: 0xB82D, 2424: 0xB82E, 2425: 0xB82F, 2426: 0xB830, 2427: 0xB831, 2428: 0xB832, 2429: 0xB833, 2430: 0xB836, 2431: 0xB83A, 2432: 0xB83B, 2433: 0xB83C, 2434: 0xB83D, 2435: 0xB83E, 2436: 0xB83F, 2437: 0xB841, 2438: 0xB842, 2439: 0xB843, 2440: 0xB845, 2441: 0xB846, 2442: 0xB847, 2443: 0xB848, 2444: 0xB849, 2445: 0xB84A, 2446: 0xB84B, 2447: 0xB84C, 2448: 0xB84D, 2449: 0xB84E, 2450: 0xB84F, 2451: 0xB850, 2452: 0xB852, 2453: 0xB854, 2454: 0xB855, 2455: 0xB856, 2456: 0xB857, 2457: 0xB858, 2458: 0xB859, 2459: 0xB85A, 2460: 0xB85B, 2461: 0xB85E, 2462: 0xB85F, 2463: 0xB861, 2464: 0xB862, 2465: 0xB863, 2466: 0xB865, 2467: 0xB866, 2468: 0xB867, 2469: 0xB868, 2470: 0xB869, 2471: 0xB86A, 2472: 0xB86B, 2473: 0xB86E, 2474: 0xB870, 2475: 0xB872, 2476: 0xB873, 2477: 0xB874, 2478: 0xB875, 2479: 0xB876, 2480: 0xB877, 2481: 0xB879, 2482: 0xB87A, 2483: 0xB87B, 2484: 0xB87D, 2485: 0xB87E, 2486: 0xB87F, 2487: 0xB880, 2488: 0xB881, 2489: 0xB882, 2490: 0xB883, 2491: 0xB884, 2492: 0xB885, 2493: 0xB886, 2494: 0xB887, 2495: 0xB888, 2496: 0xB889, 2497: 0xB88A, 2498: 0xB88B, 2499: 0xB88C, 2500: 0xB88E, 2501: 0xB88F, 2502: 0xB890, 2503: 0xB891, 2504: 0xB892, 2505: 0xB893, 2506: 0xB894, 2507: 0xB895, 2508: 0xB896, 2509: 0xB897, 2510: 0xB898, 2511: 0xB899, 2512: 0xB89A, 2513: 0xB89B, 2514: 0xB89C, 2515: 0xB89D, 2516: 0xB89E, 2517: 0xB89F, 2518: 0xB8A0, 2519: 0xB8A1, 2520: 0xB8A2, 2521: 0xB8A3, 2522: 0xB8A4, 2523: 0xB8A5, 2524: 0xB8A6, 2525: 0xB8A7, 2526: 0xB8A9, 2527: 0xB8AA, 2528: 0xB8AB, 2529: 0xB8AC, 2530: 0xB8AD, 2531: 0xB8AE, 2532: 0xB8AF, 2533: 0xB8B1, 2534: 0xB8B2, 2535: 0xB8B3, 2536: 0xB8B5, 2537: 0xB8B6, 2538: 0xB8B7, 2539: 0xB8B9, 2540: 0xB8BA, 2541: 0xB8BB, 2542: 0xB8BC, 2543: 0xB8BD, 2544: 0xB8BE, 2545: 0xB8BF, 2546: 0xB8C2, 2547: 0xB8C4, 2548: 0xB8C6, 2549: 0xB8C7, 2550: 0xB8C8, 2551: 0xB8C9, 2552: 0xB8CA, 2553: 0xB8CB, 2554: 0xB8CD, 2555: 0xB8CE, 2556: 0xB8CF, 2557: 0xB8D1, 2558: 0xB8D2, 2559: 0xB8D3, 2560: 0xB8D5, 2561: 0xB8D6, 2562: 0xB8D7, 2563: 0xB8D8, 2564: 0xB8D9, 2565: 0xB8DA, 2566: 0xB8DB, 2567: 0xB8DC, 2568: 0xB8DE, 2569: 0xB8E0, 2570: 0xB8E2, 2571: 0xB8E3, 2572: 0xB8E4, 2573: 0xB8E5, 2574: 0xB8E6, 2575: 0xB8E7, 2576: 0xB8EA, 2577: 0xB8EB, 2578: 0xB8ED, 2579: 0xB8EE, 2580: 0xB8EF, 2581: 0xB8F1, 2582: 0xB8F2, 2583: 0xB8F3, 2584: 0xB8F4, 2585: 0xB8F5, 2586: 0xB8F6, 2587: 0xB8F7, 2588: 0xB8FA, 2589: 0xB8FC, 2590: 0xB8FE, 2591: 0xB8FF, 2592: 0xB900, 2593: 0xB901, 2594: 0xB902, 2595: 0xB903, 2596: 0xB905, 2597: 0xB906, 2598: 0xB907, 2599: 0xB908, 2600: 0xB909, 2601: 0xB90A, 2602: 0xB90B, 2603: 0xB90C, 2604: 0xB90D, 2605: 0xB90E, 2606: 0xB90F, 2607: 0xB910, 2608: 0xB911, 2609: 0xB912, 2610: 0xB913, 2611: 0xB914, 2612: 0xB915, 2613: 0xB916, 2614: 0xB917, 2615: 0xB919, 2616: 0xB91A, 2617: 0xB91B, 2618: 0xB91C, 2619: 0xB91D, 2620: 0xB91E, 2621: 0xB91F, 2622: 0xB921, 2623: 0xB922, 2624: 0xB923, 2625: 0xB924, 2626: 0xB925, 2627: 0xB926, 2628: 0xB927, 2629: 0xB928, 2630: 0xB929, 2631: 0xB92A, 2632: 0xB92B, 2633: 0xB92C, 2634: 0xB92D, 2635: 0xB92E, 2636: 0xB92F, 2637: 0xB930, 2638: 0xB931, 2639: 0xB932, 2640: 0xB933, 2641: 0xB934, 2642: 0xB935, 2643: 0xB936, 2644: 0xB937, 2645: 0xB938, 2646: 0xB939, 2647: 0xB93A, 2648: 0xB93B, 2649: 0xB93E, 2650: 0xB93F, 2651: 0xB941, 2652: 0xB942, 2653: 0xB943, 2654: 0xB945, 2655: 0xB946, 2656: 0xB947, 2657: 0xB948, 2658: 0xB949, 2659: 0xB94A, 2660: 0xB94B, 2661: 0xB94D, 2662: 0xB94E, 2663: 0xB950, 2664: 0xB952, 2665: 0xB953, 2666: 0xB954, 2667: 0xB955, 2668: 0xB956, 2669: 0xB957, 2670: 0xB95A, 2671: 0xB95B, 2672: 0xB95D, 2673: 0xB95E, 2674: 0xB95F, 2675: 0xB961, 2676: 0xB962, 2677: 0xB963, 2678: 0xB964, 2679: 0xB965, 2680: 0xB966, 2681: 0xB967, 2682: 0xB96A, 2683: 0xB96C, 2684: 0xB96E, 2685: 0xB96F, 2686: 0xB970, 2687: 0xB971, 2688: 0xB972, 2689: 0xB973, 2690: 0xB976, 2691: 0xB977, 2692: 0xB979, 2693: 0xB97A, 2694: 0xB97B, 2695: 0xB97D, 2696: 0xB97E, 2697: 0xB97F, 2698: 0xB980, 2699: 0xB981, 2700: 0xB982, 2701: 0xB983, 2702: 0xB986, 2703: 0xB988, 2704: 0xB98B, 2705: 0xB98C, 2706: 0xB98F, 2707: 0xB990, 2708: 0xB991, 2709: 0xB992, 2710: 0xB993, 2711: 0xB994, 2712: 0xB995, 2713: 0xB996, 2714: 0xB997, 2715: 0xB998, 2716: 0xB999, 2717: 0xB99A, 2718: 0xB99B, 2719: 0xB99C, 2720: 0xB99D, 2721: 0xB99E, 2722: 0xB99F, 2723: 0xB9A0, 2724: 0xB9A1, 2725: 0xB9A2, 2726: 0xB9A3, 2727: 0xB9A4, 2728: 0xB9A5, 2729: 0xB9A6, 2730: 0xB9A7, 2731: 0xB9A8, 2732: 0xB9A9, 2733: 0xB9AA, 2734: 0xB9AB, 2735: 0xB9AE, 2736: 0xB9AF, 2737: 0xB9B1, 2738: 0xB9B2, 2739: 0xB9B3, 2740: 0xB9B5, 2741: 0xB9B6, 2742: 0xB9B7, 2743: 0xB9B8, 2744: 0xB9B9, 2745: 0xB9BA, 2746: 0xB9BB, 2747: 0xB9BE, 2748: 0xB9C0, 2749: 0xB9C2, 2750: 0xB9C3, 2751: 0xB9C4, 2752: 0xB9C5, 2753: 0xB9C6, 2754: 0xB9C7, 2755: 0xB9CA, 2756: 0xB9CB, 2757: 0xB9CD, 2758: 0xB9D3, 2759: 0xB9D4, 2760: 0xB9D5, 2761: 0xB9D6, 2762: 0xB9D7, 2763: 0xB9DA, 2764: 0xB9DC, 2765: 0xB9DF, 2766: 0xB9E0, 2767: 0xB9E2, 2768: 0xB9E6, 2769: 0xB9E7, 2770: 0xB9E9, 2771: 0xB9EA, 2772: 0xB9EB, 2773: 0xB9ED, 2774: 0xB9EE, 2775: 0xB9EF, 2776: 0xB9F0, 2777: 0xB9F1, 2778: 0xB9F2, 2779: 0xB9F3, 2780: 0xB9F6, 2781: 0xB9FB, 2782: 0xB9FC, 2783: 0xB9FD, 2784: 0xB9FE, 2785: 0xB9FF, 2786: 0xBA02, 2787: 0xBA03, 2788: 0xBA04, 2789: 0xBA05, 2790: 0xBA06, 2791: 0xBA07, 2792: 0xBA09, 2793: 0xBA0A, 2794: 0xBA0B, 2795: 0xBA0C, 2796: 0xBA0D, 2797: 0xBA0E, 2798: 0xBA0F, 2799: 0xBA10, 2800: 0xBA11, 2801: 0xBA12, 2802: 0xBA13, 2803: 0xBA14, 2804: 0xBA16, 2805: 0xBA17, 2806: 0xBA18, 2807: 0xBA19, 2808: 0xBA1A, 2809: 0xBA1B, 2810: 0xBA1C, 2811: 0xBA1D, 2812: 0xBA1E, 2813: 0xBA1F, 2814: 0xBA20, 2815: 0xBA21, 2816: 0xBA22, 2817: 0xBA23, 2818: 0xBA24, 2819: 0xBA25, 2820: 0xBA26, 2821: 0xBA27, 2822: 0xBA28, 2823: 0xBA29, 2824: 0xBA2A, 2825: 0xBA2B, 2826: 0xBA2C, 2827: 0xBA2D, 2828: 0xBA2E, 2829: 0xBA2F, 2830: 0xBA30, 2831: 0xBA31, 2832: 0xBA32, 2833: 0xBA33, 2834: 0xBA34, 2835: 0xBA35, 2836: 0xBA36, 2837: 0xBA37, 2838: 0xBA3A, 2839: 0xBA3B, 2840: 0xBA3D, 2841: 0xBA3E, 2842: 0xBA3F, 2843: 0xBA41, 2844: 0xBA43, 2845: 0xBA44, 2846: 0xBA45, 2847: 0xBA46, 2848: 0xBA47, 2849: 0xBA4A, 2850: 0xBA4C, 2851: 0xBA4F, 2852: 0xBA50, 2853: 0xBA51, 2854: 0xBA52, 2855: 0xBA56, 2856: 0xBA57, 2857: 0xBA59, 2858: 0xBA5A, 2859: 0xBA5B, 2860: 0xBA5D, 2861: 0xBA5E, 2862: 0xBA5F, 2863: 0xBA60, 2864: 0xBA61, 2865: 0xBA62, 2866: 0xBA63, 2867: 0xBA66, 2868: 0xBA6A, 2869: 0xBA6B, 2870: 0xBA6C, 2871: 0xBA6D, 2872: 0xBA6E, 2873: 0xBA6F, 2874: 0xBA72, 2875: 0xBA73, 2876: 0xBA75, 2877: 0xBA76, 2878: 0xBA77, 2879: 0xBA79, 2880: 0xBA7A, 2881: 0xBA7B, 2882: 0xBA7C, 2883: 0xBA7D, 2884: 0xBA7E, 2885: 0xBA7F, 2886: 0xBA80, 2887: 0xBA81, 2888: 0xBA82, 2889: 0xBA86, 2890: 0xBA88, 2891: 0xBA89, 2892: 0xBA8A, 2893: 0xBA8B, 2894: 0xBA8D, 2895: 0xBA8E, 2896: 0xBA8F, 2897: 0xBA90, 2898: 0xBA91, 2899: 0xBA92, 2900: 0xBA93, 2901: 0xBA94, 2902: 0xBA95, 2903: 0xBA96, 2904: 0xBA97, 2905: 0xBA98, 2906: 0xBA99, 2907: 0xBA9A, 2908: 0xBA9B, 2909: 0xBA9C, 2910: 0xBA9D, 2911: 0xBA9E, 2912: 0xBA9F, 2913: 0xBAA0, 2914: 0xBAA1, 2915: 0xBAA2, 2916: 0xBAA3, 2917: 0xBAA4, 2918: 0xBAA5, 2919: 0xBAA6, 2920: 0xBAA7, 2921: 0xBAAA, 2922: 0xBAAD, 2923: 0xBAAE, 2924: 0xBAAF, 2925: 0xBAB1, 2926: 0xBAB3, 2927: 0xBAB4, 2928: 0xBAB5, 2929: 0xBAB6, 2930: 0xBAB7, 2931: 0xBABA, 2932: 0xBABC, 2933: 0xBABE, 2934: 0xBABF, 2935: 0xBAC0, 2936: 0xBAC1, 2937: 0xBAC2, 2938: 0xBAC3, 2939: 0xBAC5, 2940: 0xBAC6, 2941: 0xBAC7, 2942: 0xBAC9, 2943: 0xBACA, 2944: 0xBACB, 2945: 0xBACC, 2946: 0xBACD, 2947: 0xBACE, 2948: 0xBACF, 2949: 0xBAD0, 2950: 0xBAD1, 2951: 0xBAD2, 2952: 0xBAD3, 2953: 0xBAD4, 2954: 0xBAD5, 2955: 0xBAD6, 2956: 0xBAD7, 2957: 0xBADA, 2958: 0xBADB, 2959: 0xBADC, 2960: 0xBADD, 2961: 0xBADE, 2962: 0xBADF, 2963: 0xBAE0, 2964: 0xBAE1, 2965: 0xBAE2, 2966: 0xBAE3, 2967: 0xBAE4, 2968: 0xBAE5, 2969: 0xBAE6, 2970: 0xBAE7, 2971: 0xBAE8, 2972: 0xBAE9, 2973: 0xBAEA, 2974: 0xBAEB, 2975: 0xBAEC, 2976: 0xBAED, 2977: 0xBAEE, 2978: 0xBAEF, 2979: 0xBAF0, 2980: 0xBAF1, 2981: 0xBAF2, 2982: 0xBAF3, 2983: 0xBAF4, 2984: 0xBAF5, 2985: 0xBAF6, 2986: 0xBAF7, 2987: 0xBAF8, 2988: 0xBAF9, 2989: 0xBAFA, 2990: 0xBAFB, 2991: 0xBAFD, 2992: 0xBAFE, 2993: 0xBAFF, 2994: 0xBB01, 2995: 0xBB02, 2996: 0xBB03, 2997: 0xBB05, 2998: 0xBB06, 2999: 0xBB07, 3000: 0xBB08, 3001: 0xBB09, 3002: 0xBB0A, 3003: 0xBB0B, 3004: 0xBB0C, 3005: 0xBB0E, 3006: 0xBB10, 3007: 0xBB12, 3008: 0xBB13, 3009: 0xBB14, 3010: 0xBB15, 3011: 0xBB16, 3012: 0xBB17, 3013: 0xBB19, 3014: 0xBB1A, 3015: 0xBB1B, 3016: 0xBB1D, 3017: 0xBB1E, 3018: 0xBB1F, 3019: 0xBB21, 3020: 0xBB22, 3021: 0xBB23, 3022: 0xBB24, 3023: 0xBB25, 3024: 0xBB26, 3025: 0xBB27, 3026: 0xBB28, 3027: 0xBB2A, 3028: 0xBB2C, 3029: 0xBB2D, 3030: 0xBB2E, 3031: 0xBB2F, 3032: 0xBB30, 3033: 0xBB31, 3034: 0xBB32, 3035: 0xBB33, 3036: 0xBB37, 3037: 0xBB39, 3038: 0xBB3A, 3039: 0xBB3F, 3040: 0xBB40, 3041: 0xBB41, 3042: 0xBB42, 3043: 0xBB43, 3044: 0xBB46, 3045: 0xBB48, 3046: 0xBB4A, 3047: 0xBB4B, 3048: 0xBB4C, 3049: 0xBB4E, 3050: 0xBB51, 3051: 0xBB52, 3052: 0xBB53, 3053: 0xBB55, 3054: 0xBB56, 3055: 0xBB57, 3056: 0xBB59, 3057: 0xBB5A, 3058: 0xBB5B, 3059: 0xBB5C, 3060: 0xBB5D, 3061: 0xBB5E, 3062: 0xBB5F, 3063: 0xBB60, 3064: 0xBB62, 3065: 0xBB64, 3066: 0xBB65, 3067: 0xBB66, 3068: 0xBB67, 3069: 0xBB68, 3070: 0xBB69, 3071: 0xBB6A, 3072: 0xBB6B, 3073: 0xBB6D, 3074: 0xBB6E, 3075: 0xBB6F, 3076: 0xBB70, 3077: 0xBB71, 3078: 0xBB72, 3079: 0xBB73, 3080: 0xBB74, 3081: 0xBB75, 3082: 0xBB76, 3083: 0xBB77, 3084: 0xBB78, 3085: 0xBB79, 3086: 0xBB7A, 3087: 0xBB7B, 3088: 0xBB7C, 3089: 0xBB7D, 3090: 0xBB7E, 3091: 0xBB7F, 3092: 0xBB80, 3093: 0xBB81, 3094: 0xBB82, 3095: 0xBB83, 3096: 0xBB84, 3097: 0xBB85, 3098: 0xBB86, 3099: 0xBB87, 3100: 0xBB89, 3101: 0xBB8A, 3102: 0xBB8B, 3103: 0xBB8D, 3104: 0xBB8E, 3105: 0xBB8F, 3106: 0xBB91, 3107: 0xBB92, 3108: 0xBB93, 3109: 0xBB94, 3110: 0xBB95, 3111: 0xBB96, 3112: 0xBB97, 3113: 0xBB98, 3114: 0xBB99, 3115: 0xBB9A, 3116: 0xBB9B, 3117: 0xBB9C, 3118: 0xBB9D, 3119: 0xBB9E, 3120: 0xBB9F, 3121: 0xBBA0, 3122: 0xBBA1, 3123: 0xBBA2, 3124: 0xBBA3, 3125: 0xBBA5, 3126: 0xBBA6, 3127: 0xBBA7, 3128: 0xBBA9, 3129: 0xBBAA, 3130: 0xBBAB, 3131: 0xBBAD, 3132: 0xBBAE, 3133: 0xBBAF, 3134: 0xBBB0, 3135: 0xBBB1, 3136: 0xBBB2, 3137: 0xBBB3, 3138: 0xBBB5, 3139: 0xBBB6, 3140: 0xBBB8, 3141: 0xBBB9, 3142: 0xBBBA, 3143: 0xBBBB, 3144: 0xBBBC, 3145: 0xBBBD, 3146: 0xBBBE, 3147: 0xBBBF, 3148: 0xBBC1, 3149: 0xBBC2, 3150: 0xBBC3, 3151: 0xBBC5, 3152: 0xBBC6, 3153: 0xBBC7, 3154: 0xBBC9, 3155: 0xBBCA, 3156: 0xBBCB, 3157: 0xBBCC, 3158: 0xBBCD, 3159: 0xBBCE, 3160: 0xBBCF, 3161: 0xBBD1, 3162: 0xBBD2, 3163: 0xBBD4, 3164: 0xBBD5, 3165: 0xBBD6, 3166: 0xBBD7, 3167: 0xBBD8, 3168: 0xBBD9, 3169: 0xBBDA, 3170: 0xBBDB, 3171: 0xBBDC, 3172: 0xBBDD, 3173: 0xBBDE, 3174: 0xBBDF, 3175: 0xBBE0, 3176: 0xBBE1, 3177: 0xBBE2, 3178: 0xBBE3, 3179: 0xBBE4, 3180: 0xBBE5, 3181: 0xBBE6, 3182: 0xBBE7, 3183: 0xBBE8, 3184: 0xBBE9, 3185: 0xBBEA, 3186: 0xBBEB, 3187: 0xBBEC, 3188: 0xBBED, 3189: 0xBBEE, 3190: 0xBBEF, 3191: 0xBBF0, 3192: 0xBBF1, 3193: 0xBBF2, 3194: 0xBBF3, 3195: 0xBBF4, 3196: 0xBBF5, 3197: 0xBBF6, 3198: 0xBBF7, 3199: 0xBBFA, 3200: 0xBBFB, 3201: 0xBBFD, 3202: 0xBBFE, 3203: 0xBC01, 3204: 0xBC03, 3205: 0xBC04, 3206: 0xBC05, 3207: 0xBC06, 3208: 0xBC07, 3209: 0xBC0A, 3210: 0xBC0E, 3211: 0xBC10, 3212: 0xBC12, 3213: 0xBC13, 3214: 0xBC19, 3215: 0xBC1A, 3216: 0xBC20, 3217: 0xBC21, 3218: 0xBC22, 3219: 0xBC23, 3220: 0xBC26, 3221: 0xBC28, 3222: 0xBC2A, 3223: 0xBC2B, 3224: 0xBC2C, 3225: 0xBC2E, 3226: 0xBC2F, 3227: 0xBC32, 3228: 0xBC33, 3229: 0xBC35, 3230: 0xBC36, 3231: 0xBC37, 3232: 0xBC39, 3233: 0xBC3A, 3234: 0xBC3B, 3235: 0xBC3C, 3236: 0xBC3D, 3237: 0xBC3E, 3238: 0xBC3F, 3239: 0xBC42, 3240: 0xBC46, 3241: 0xBC47, 3242: 0xBC48, 3243: 0xBC4A, 3244: 0xBC4B, 3245: 0xBC4E, 3246: 0xBC4F, 3247: 0xBC51, 3248: 0xBC52, 3249: 0xBC53, 3250: 0xBC54, 3251: 0xBC55, 3252: 0xBC56, 3253: 0xBC57, 3254: 0xBC58, 3255: 0xBC59, 3256: 0xBC5A, 3257: 0xBC5B, 3258: 0xBC5C, 3259: 0xBC5E, 3260: 0xBC5F, 3261: 0xBC60, 3262: 0xBC61, 3263: 0xBC62, 3264: 0xBC63, 3265: 0xBC64, 3266: 0xBC65, 3267: 0xBC66, 3268: 0xBC67, 3269: 0xBC68, 3270: 0xBC69, 3271: 0xBC6A, 3272: 0xBC6B, 3273: 0xBC6C, 3274: 0xBC6D, 3275: 0xBC6E, 3276: 0xBC6F, 3277: 0xBC70, 3278: 0xBC71, 3279: 0xBC72, 3280: 0xBC73, 3281: 0xBC74, 3282: 0xBC75, 3283: 0xBC76, 3284: 0xBC77, 3285: 0xBC78, 3286: 0xBC79, 3287: 0xBC7A, 3288: 0xBC7B, 3289: 0xBC7C, 3290: 0xBC7D, 3291: 0xBC7E, 3292: 0xBC7F, 3293: 0xBC80, 3294: 0xBC81, 3295: 0xBC82, 3296: 0xBC83, 3297: 0xBC86, 3298: 0xBC87, 3299: 0xBC89, 3300: 0xBC8A, 3301: 0xBC8D, 3302: 0xBC8F, 3303: 0xBC90, 3304: 0xBC91, 3305: 0xBC92, 3306: 0xBC93, 3307: 0xBC96, 3308: 0xBC98, 3309: 0xBC9B, 3310: 0xBC9C, 3311: 0xBC9D, 3312: 0xBC9E, 3313: 0xBC9F, 3314: 0xBCA2, 3315: 0xBCA3, 3316: 0xBCA5, 3317: 0xBCA6, 3318: 0xBCA9, 3319: 0xBCAA, 3320: 0xBCAB, 3321: 0xBCAC, 3322: 0xBCAD, 3323: 0xBCAE, 3324: 0xBCAF, 3325: 0xBCB2, 3326: 0xBCB6, 3327: 0xBCB7, 3328: 0xBCB8, 3329: 0xBCB9, 3330: 0xBCBA, 3331: 0xBCBB, 3332: 0xBCBE, 3333: 0xBCBF, 3334: 0xBCC1, 3335: 0xBCC2, 3336: 0xBCC3, 3337: 0xBCC5, 3338: 0xBCC6, 3339: 0xBCC7, 3340: 0xBCC8, 3341: 0xBCC9, 3342: 0xBCCA, 3343: 0xBCCB, 3344: 0xBCCC, 3345: 0xBCCE, 3346: 0xBCD2, 3347: 0xBCD3, 3348: 0xBCD4, 3349: 0xBCD6, 3350: 0xBCD7, 3351: 0xBCD9, 3352: 0xBCDA, 3353: 0xBCDB, 3354: 0xBCDD, 3355: 0xBCDE, 3356: 0xBCDF, 3357: 0xBCE0, 3358: 0xBCE1, 3359: 0xBCE2, 3360: 0xBCE3, 3361: 0xBCE4, 3362: 0xBCE5, 3363: 0xBCE6, 3364: 0xBCE7, 3365: 0xBCE8, 3366: 0xBCE9, 3367: 0xBCEA, 3368: 0xBCEB, 3369: 0xBCEC, 3370: 0xBCED, 3371: 0xBCEE, 3372: 0xBCEF, 3373: 0xBCF0, 3374: 0xBCF1, 3375: 0xBCF2, 3376: 0xBCF3, 3377: 0xBCF7, 3378: 0xBCF9, 3379: 0xBCFA, 3380: 0xBCFB, 3381: 0xBCFD, 3382: 0xBCFE, 3383: 0xBCFF, 3384: 0xBD00, 3385: 0xBD01, 3386: 0xBD02, 3387: 0xBD03, 3388: 0xBD06, 3389: 0xBD08, 3390: 0xBD0A, 3391: 0xBD0B, 3392: 0xBD0C, 3393: 0xBD0D, 3394: 0xBD0E, 3395: 0xBD0F, 3396: 0xBD11, 3397: 0xBD12, 3398: 0xBD13, 3399: 0xBD15, 3400: 0xBD16, 3401: 0xBD17, 3402: 0xBD18, 3403: 0xBD19, 3404: 0xBD1A, 3405: 0xBD1B, 3406: 0xBD1C, 3407: 0xBD1D, 3408: 0xBD1E, 3409: 0xBD1F, 3410: 0xBD20, 3411: 0xBD21, 3412: 0xBD22, 3413: 0xBD23, 3414: 0xBD25, 3415: 0xBD26, 3416: 0xBD27, 3417: 0xBD28, 3418: 0xBD29, 3419: 0xBD2A, 3420: 0xBD2B, 3421: 0xBD2D, 3422: 0xBD2E, 3423: 0xBD2F, 3424: 0xBD30, 3425: 0xBD31, 3426: 0xBD32, 3427: 0xBD33, 3428: 0xBD34, 3429: 0xBD35, 3430: 0xBD36, 3431: 0xBD37, 3432: 0xBD38, 3433: 0xBD39, 3434: 0xBD3A, 3435: 0xBD3B, 3436: 0xBD3C, 3437: 0xBD3D, 3438: 0xBD3E, 3439: 0xBD3F, 3440: 0xBD41, 3441: 0xBD42, 3442: 0xBD43, 3443: 0xBD44, 3444: 0xBD45, 3445: 0xBD46, 3446: 0xBD47, 3447: 0xBD4A, 3448: 0xBD4B, 3449: 0xBD4D, 3450: 0xBD4E, 3451: 0xBD4F, 3452: 0xBD51, 3453: 0xBD52, 3454: 0xBD53, 3455: 0xBD54, 3456: 0xBD55, 3457: 0xBD56, 3458: 0xBD57, 3459: 0xBD5A, 3460: 0xBD5B, 3461: 0xBD5C, 3462: 0xBD5D, 3463: 0xBD5E, 3464: 0xBD5F, 3465: 0xBD60, 3466: 0xBD61, 3467: 0xBD62, 3468: 0xBD63, 3469: 0xBD65, 3470: 0xBD66, 3471: 0xBD67, 3472: 0xBD69, 3473: 0xBD6A, 3474: 0xBD6B, 3475: 0xBD6C, 3476: 0xBD6D, 3477: 0xBD6E, 3478: 0xBD6F, 3479: 0xBD70, 3480: 0xBD71, 3481: 0xBD72, 3482: 0xBD73, 3483: 0xBD74, 3484: 0xBD75, 3485: 0xBD76, 3486: 0xBD77, 3487: 0xBD78, 3488: 0xBD79, 3489: 0xBD7A, 3490: 0xBD7B, 3491: 0xBD7C, 3492: 0xBD7D, 3493: 0xBD7E, 3494: 0xBD7F, 3495: 0xBD82, 3496: 0xBD83, 3497: 0xBD85, 3498: 0xBD86, 3499: 0xBD8B, 3500: 0xBD8C, 3501: 0xBD8D, 3502: 0xBD8E, 3503: 0xBD8F, 3504: 0xBD92, 3505: 0xBD94, 3506: 0xBD96, 3507: 0xBD97, 3508: 0xBD98, 3509: 0xBD9B, 3510: 0xBD9D, 3511: 0xBD9E, 3512: 0xBD9F, 3513: 0xBDA0, 3514: 0xBDA1, 3515: 0xBDA2, 3516: 0xBDA3, 3517: 0xBDA5, 3518: 0xBDA6, 3519: 0xBDA7, 3520: 0xBDA8, 3521: 0xBDA9, 3522: 0xBDAA, 3523: 0xBDAB, 3524: 0xBDAC, 3525: 0xBDAD, 3526: 0xBDAE, 3527: 0xBDAF, 3528: 0xBDB1, 3529: 0xBDB2, 3530: 0xBDB3, 3531: 0xBDB4, 3532: 0xBDB5, 3533: 0xBDB6, 3534: 0xBDB7, 3535: 0xBDB9, 3536: 0xBDBA, 3537: 0xBDBB, 3538: 0xBDBC, 3539: 0xBDBD, 3540: 0xBDBE, 3541: 0xBDBF, 3542: 0xBDC0, 3543: 0xBDC1, 3544: 0xBDC2, 3545: 0xBDC3, 3546: 0xBDC4, 3547: 0xBDC5, 3548: 0xBDC6, 3549: 0xBDC7, 3550: 0xBDC8, 3551: 0xBDC9, 3552: 0xBDCA, 3553: 0xBDCB, 3554: 0xBDCC, 3555: 0xBDCD, 3556: 0xBDCE, 3557: 0xBDCF, 3558: 0xBDD0, 3559: 0xBDD1, 3560: 0xBDD2, 3561: 0xBDD3, 3562: 0xBDD6, 3563: 0xBDD7, 3564: 0xBDD9, 3565: 0xBDDA, 3566: 0xBDDB, 3567: 0xBDDD, 3568: 0xBDDE, 3569: 0xBDDF, 3570: 0xBDE0, 3571: 0xBDE1, 3572: 0xBDE2, 3573: 0xBDE3, 3574: 0xBDE4, 3575: 0xBDE5, 3576: 0xBDE6, 3577: 0xBDE7, 3578: 0xBDE8, 3579: 0xBDEA, 3580: 0xBDEB, 3581: 0xBDEC, 3582: 0xBDED, 3583: 0xBDEE, 3584: 0xBDEF, 3585: 0xBDF1, 3586: 0xBDF2, 3587: 0xBDF3, 3588: 0xBDF5, 3589: 0xBDF6, 3590: 0xBDF7, 3591: 0xBDF9, 3592: 0xBDFA, 3593: 0xBDFB, 3594: 0xBDFC, 3595: 0xBDFD, 3596: 0xBDFE, 3597: 0xBDFF, 3598: 0xBE01, 3599: 0xBE02, 3600: 0xBE04, 3601: 0xBE06, 3602: 0xBE07, 3603: 0xBE08, 3604: 0xBE09, 3605: 0xBE0A, 3606: 0xBE0B, 3607: 0xBE0E, 3608: 0xBE0F, 3609: 0xBE11, 3610: 0xBE12, 3611: 0xBE13, 3612: 0xBE15, 3613: 0xBE16, 3614: 0xBE17, 3615: 0xBE18, 3616: 0xBE19, 3617: 0xBE1A, 3618: 0xBE1B, 3619: 0xBE1E, 3620: 0xBE20, 3621: 0xBE21, 3622: 0xBE22, 3623: 0xBE23, 3624: 0xBE24, 3625: 0xBE25, 3626: 0xBE26, 3627: 0xBE27, 3628: 0xBE28, 3629: 0xBE29, 3630: 0xBE2A, 3631: 0xBE2B, 3632: 0xBE2C, 3633: 0xBE2D, 3634: 0xBE2E, 3635: 0xBE2F, 3636: 0xBE30, 3637: 0xBE31, 3638: 0xBE32, 3639: 0xBE33, 3640: 0xBE34, 3641: 0xBE35, 3642: 0xBE36, 3643: 0xBE37, 3644: 0xBE38, 3645: 0xBE39, 3646: 0xBE3A, 3647: 0xBE3B, 3648: 0xBE3C, 3649: 0xBE3D, 3650: 0xBE3E, 3651: 0xBE3F, 3652: 0xBE40, 3653: 0xBE41, 3654: 0xBE42, 3655: 0xBE43, 3656: 0xBE46, 3657: 0xBE47, 3658: 0xBE49, 3659: 0xBE4A, 3660: 0xBE4B, 3661: 0xBE4D, 3662: 0xBE4F, 3663: 0xBE50, 3664: 0xBE51, 3665: 0xBE52, 3666: 0xBE53, 3667: 0xBE56, 3668: 0xBE58, 3669: 0xBE5C, 3670: 0xBE5D, 3671: 0xBE5E, 3672: 0xBE5F, 3673: 0xBE62, 3674: 0xBE63, 3675: 0xBE65, 3676: 0xBE66, 3677: 0xBE67, 3678: 0xBE69, 3679: 0xBE6B, 3680: 0xBE6C, 3681: 0xBE6D, 3682: 0xBE6E, 3683: 0xBE6F, 3684: 0xBE72, 3685: 0xBE76, 3686: 0xBE77, 3687: 0xBE78, 3688: 0xBE79, 3689: 0xBE7A, 3690: 0xBE7E, 3691: 0xBE7F, 3692: 0xBE81, 3693: 0xBE82, 3694: 0xBE83, 3695: 0xBE85, 3696: 0xBE86, 3697: 0xBE87, 3698: 0xBE88, 3699: 0xBE89, 3700: 0xBE8A, 3701: 0xBE8B, 3702: 0xBE8E, 3703: 0xBE92, 3704: 0xBE93, 3705: 0xBE94, 3706: 0xBE95, 3707: 0xBE96, 3708: 0xBE97, 3709: 0xBE9A, 3710: 0xBE9B, 3711: 0xBE9C, 3712: 0xBE9D, 3713: 0xBE9E, 3714: 0xBE9F, 3715: 0xBEA0, 3716: 0xBEA1, 3717: 0xBEA2, 3718: 0xBEA3, 3719: 0xBEA4, 3720: 0xBEA5, 3721: 0xBEA6, 3722: 0xBEA7, 3723: 0xBEA9, 3724: 0xBEAA, 3725: 0xBEAB, 3726: 0xBEAC, 3727: 0xBEAD, 3728: 0xBEAE, 3729: 0xBEAF, 3730: 0xBEB0, 3731: 0xBEB1, 3732: 0xBEB2, 3733: 0xBEB3, 3734: 0xBEB4, 3735: 0xBEB5, 3736: 0xBEB6, 3737: 0xBEB7, 3738: 0xBEB8, 3739: 0xBEB9, 3740: 0xBEBA, 3741: 0xBEBB, 3742: 0xBEBC, 3743: 0xBEBD, 3744: 0xBEBE, 3745: 0xBEBF, 3746: 0xBEC0, 3747: 0xBEC1, 3748: 0xBEC2, 3749: 0xBEC3, 3750: 0xBEC4, 3751: 0xBEC5, 3752: 0xBEC6, 3753: 0xBEC7, 3754: 0xBEC8, 3755: 0xBEC9, 3756: 0xBECA, 3757: 0xBECB, 3758: 0xBECC, 3759: 0xBECD, 3760: 0xBECE, 3761: 0xBECF, 3762: 0xBED2, 3763: 0xBED3, 3764: 0xBED5, 3765: 0xBED6, 3766: 0xBED9, 3767: 0xBEDA, 3768: 0xBEDB, 3769: 0xBEDC, 3770: 0xBEDD, 3771: 0xBEDE, 3772: 0xBEDF, 3773: 0xBEE1, 3774: 0xBEE2, 3775: 0xBEE6, 3776: 0xBEE7, 3777: 0xBEE8, 3778: 0xBEE9, 3779: 0xBEEA, 3780: 0xBEEB, 3781: 0xBEED, 3782: 0xBEEE, 3783: 0xBEEF, 3784: 0xBEF0, 3785: 0xBEF1, 3786: 0xBEF2, 3787: 0xBEF3, 3788: 0xBEF4, 3789: 0xBEF5, 3790: 0xBEF6, 3791: 0xBEF7, 3792: 0xBEF8, 3793: 0xBEF9, 3794: 0xBEFA, 3795: 0xBEFB, 3796: 0xBEFC, 3797: 0xBEFD, 3798: 0xBEFE, 3799: 0xBEFF, 3800: 0xBF00, 3801: 0xBF02, 3802: 0xBF03, 3803: 0xBF04, 3804: 0xBF05, 3805: 0xBF06, 3806: 0xBF07, 3807: 0xBF0A, 3808: 0xBF0B, 3809: 0xBF0C, 3810: 0xBF0D, 3811: 0xBF0E, 3812: 0xBF0F, 3813: 0xBF10, 3814: 0xBF11, 3815: 0xBF12, 3816: 0xBF13, 3817: 0xBF14, 3818: 0xBF15, 3819: 0xBF16, 3820: 0xBF17, 3821: 0xBF1A, 3822: 0xBF1E, 3823: 0xBF1F, 3824: 0xBF20, 3825: 0xBF21, 3826: 0xBF22, 3827: 0xBF23, 3828: 0xBF24, 3829: 0xBF25, 3830: 0xBF26, 3831: 0xBF27, 3832: 0xBF28, 3833: 0xBF29, 3834: 0xBF2A, 3835: 0xBF2B, 3836: 0xBF2C, 3837: 0xBF2D, 3838: 0xBF2E, 3839: 0xBF2F, 3840: 0xBF30, 3841: 0xBF31, 3842: 0xBF32, 3843: 0xBF33, 3844: 0xBF34, 3845: 0xBF35, 3846: 0xBF36, 3847: 0xBF37, 3848: 0xBF38, 3849: 0xBF39, 3850: 0xBF3A, 3851: 0xBF3B, 3852: 0xBF3C, 3853: 0xBF3D, 3854: 0xBF3E, 3855: 0xBF3F, 3856: 0xBF42, 3857: 0xBF43, 3858: 0xBF45, 3859: 0xBF46, 3860: 0xBF47, 3861: 0xBF49, 3862: 0xBF4A, 3863: 0xBF4B, 3864: 0xBF4C, 3865: 0xBF4D, 3866: 0xBF4E, 3867: 0xBF4F, 3868: 0xBF52, 3869: 0xBF53, 3870: 0xBF54, 3871: 0xBF56, 3872: 0xBF57, 3873: 0xBF58, 3874: 0xBF59, 3875: 0xBF5A, 3876: 0xBF5B, 3877: 0xBF5C, 3878: 0xBF5D, 3879: 0xBF5E, 3880: 0xBF5F, 3881: 0xBF60, 3882: 0xBF61, 3883: 0xBF62, 3884: 0xBF63, 3885: 0xBF64, 3886: 0xBF65, 3887: 0xBF66, 3888: 0xBF67, 3889: 0xBF68, 3890: 0xBF69, 3891: 0xBF6A, 3892: 0xBF6B, 3893: 0xBF6C, 3894: 0xBF6D, 3895: 0xBF6E, 3896: 0xBF6F, 3897: 0xBF70, 3898: 0xBF71, 3899: 0xBF72, 3900: 0xBF73, 3901: 0xBF74, 3902: 0xBF75, 3903: 0xBF76, 3904: 0xBF77, 3905: 0xBF78, 3906: 0xBF79, 3907: 0xBF7A, 3908: 0xBF7B, 3909: 0xBF7C, 3910: 0xBF7D, 3911: 0xBF7E, 3912: 0xBF7F, 3913: 0xBF80, 3914: 0xBF81, 3915: 0xBF82, 3916: 0xBF83, 3917: 0xBF84, 3918: 0xBF85, 3919: 0xBF86, 3920: 0xBF87, 3921: 0xBF88, 3922: 0xBF89, 3923: 0xBF8A, 3924: 0xBF8B, 3925: 0xBF8C, 3926: 0xBF8D, 3927: 0xBF8E, 3928: 0xBF8F, 3929: 0xBF90, 3930: 0xBF91, 3931: 0xBF92, 3932: 0xBF93, 3933: 0xBF95, 3934: 0xBF96, 3935: 0xBF97, 3936: 0xBF98, 3937: 0xBF99, 3938: 0xBF9A, 3939: 0xBF9B, 3940: 0xBF9C, 3941: 0xBF9D, 3942: 0xBF9E, 3943: 0xBF9F, 3944: 0xBFA0, 3945: 0xBFA1, 3946: 0xBFA2, 3947: 0xBFA3, 3948: 0xBFA4, 3949: 0xBFA5, 3950: 0xBFA6, 3951: 0xBFA7, 3952: 0xBFA8, 3953: 0xBFA9, 3954: 0xBFAA, 3955: 0xBFAB, 3956: 0xBFAC, 3957: 0xBFAD, 3958: 0xBFAE, 3959: 0xBFAF, 3960: 0xBFB1, 3961: 0xBFB2, 3962: 0xBFB3, 3963: 0xBFB4, 3964: 0xBFB5, 3965: 0xBFB6, 3966: 0xBFB7, 3967: 0xBFB8, 3968: 0xBFB9, 3969: 0xBFBA, 3970: 0xBFBB, 3971: 0xBFBC, 3972: 0xBFBD, 3973: 0xBFBE, 3974: 0xBFBF, 3975: 0xBFC0, 3976: 0xBFC1, 3977: 0xBFC2, 3978: 0xBFC3, 3979: 0xBFC4, 3980: 0xBFC6, 3981: 0xBFC7, 3982: 0xBFC8, 3983: 0xBFC9, 3984: 0xBFCA, 3985: 0xBFCB, 3986: 0xBFCE, 3987: 0xBFCF, 3988: 0xBFD1, 3989: 0xBFD2, 3990: 0xBFD3, 3991: 0xBFD5, 3992: 0xBFD6, 3993: 0xBFD7, 3994: 0xBFD8, 3995: 0xBFD9, 3996: 0xBFDA, 3997: 0xBFDB, 3998: 0xBFDD, 3999: 0xBFDE, 4000: 0xBFE0, 4001: 0xBFE2, 4002: 0xBFE3, 4003: 0xBFE4, 4004: 0xBFE5, 4005: 0xBFE6, 4006: 0xBFE7, 4007: 0xBFE8, 4008: 0xBFE9, 4009: 0xBFEA, 4010: 0xBFEB, 4011: 0xBFEC, 4012: 0xBFED, 4013: 0xBFEE, 4014: 0xBFEF, 4015: 0xBFF0, 4016: 0xBFF1, 4017: 0xBFF2, 4018: 0xBFF3, 4019: 0xBFF4, 4020: 0xBFF5, 4021: 0xBFF6, 4022: 0xBFF7, 4023: 0xBFF8, 4024: 0xBFF9, 4025: 0xBFFA, 4026: 0xBFFB, 4027: 0xBFFC, 4028: 0xBFFD, 4029: 0xBFFE, 4030: 0xBFFF, 4031: 0xC000, 4032: 0xC001, 4033: 0xC002, 4034: 0xC003, 4035: 0xC004, 4036: 0xC005, 4037: 0xC006, 4038: 0xC007, 4039: 0xC008, 4040: 0xC009, 4041: 0xC00A, 4042: 0xC00B, 4043: 0xC00C, 4044: 0xC00D, 4045: 0xC00E, 4046: 0xC00F, 4047: 0xC010, 4048: 0xC011, 4049: 0xC012, 4050: 0xC013, 4051: 0xC014, 4052: 0xC015, 4053: 0xC016, 4054: 0xC017, 4055: 0xC018, 4056: 0xC019, 4057: 0xC01A, 4058: 0xC01B, 4059: 0xC01C, 4060: 0xC01D, 4061: 0xC01E, 4062: 0xC01F, 4063: 0xC020, 4064: 0xC021, 4065: 0xC022, 4066: 0xC023, 4067: 0xC024, 4068: 0xC025, 4069: 0xC026, 4070: 0xC027, 4071: 0xC028, 4072: 0xC029, 4073: 0xC02A, 4074: 0xC02B, 4075: 0xC02C, 4076: 0xC02D, 4077: 0xC02E, 4078: 0xC02F, 4079: 0xC030, 4080: 0xC031, 4081: 0xC032, 4082: 0xC033, 4083: 0xC034, 4084: 0xC035, 4085: 0xC036, 4086: 0xC037, 4087: 0xC038, 4088: 0xC039, 4089: 0xC03A, 4090: 0xC03B, 4091: 0xC03D, 4092: 0xC03E, 4093: 0xC03F, 4094: 0xC040, 4095: 0xC041, 4096: 0xC042, 4097: 0xC043, 4098: 0xC044, 4099: 0xC045, 4100: 0xC046, 4101: 0xC047, 4102: 0xC048, 4103: 0xC049, 4104: 0xC04A, 4105: 0xC04B, 4106: 0xC04C, 4107: 0xC04D, 4108: 0xC04E, 4109: 0xC04F, 4110: 0xC050, 4111: 0xC052, 4112: 0xC053, 4113: 0xC054, 4114: 0xC055, 4115: 0xC056, 4116: 0xC057, 4117: 0xC059, 4118: 0xC05A, 4119: 0xC05B, 4120: 0xC05D, 4121: 0xC05E, 4122: 0xC05F, 4123: 0xC061, 4124: 0xC062, 4125: 0xC063, 4126: 0xC064, 4127: 0xC065, 4128: 0xC066, 4129: 0xC067, 4130: 0xC06A, 4131: 0xC06B, 4132: 0xC06C, 4133: 0xC06D, 4134: 0xC06E, 4135: 0xC06F, 4136: 0xC070, 4137: 0xC071, 4138: 0xC072, 4139: 0xC073, 4140: 0xC074, 4141: 0xC075, 4142: 0xC076, 4143: 0xC077, 4144: 0xC078, 4145: 0xC079, 4146: 0xC07A, 4147: 0xC07B, 4148: 0xC07C, 4149: 0xC07D, 4150: 0xC07E, 4151: 0xC07F, 4152: 0xC080, 4153: 0xC081, 4154: 0xC082, 4155: 0xC083, 4156: 0xC084, 4157: 0xC085, 4158: 0xC086, 4159: 0xC087, 4160: 0xC088, 4161: 0xC089, 4162: 0xC08A, 4163: 0xC08B, 4164: 0xC08C, 4165: 0xC08D, 4166: 0xC08E, 4167: 0xC08F, 4168: 0xC092, 4169: 0xC093, 4170: 0xC095, 4171: 0xC096, 4172: 0xC097, 4173: 0xC099, 4174: 0xC09A, 4175: 0xC09B, 4176: 0xC09C, 4177: 0xC09D, 4178: 0xC09E, 4179: 0xC09F, 4180: 0xC0A2, 4181: 0xC0A4, 4182: 0xC0A6, 4183: 0xC0A7, 4184: 0xC0A8, 4185: 0xC0A9, 4186: 0xC0AA, 4187: 0xC0AB, 4188: 0xC0AE, 4189: 0xC0B1, 4190: 0xC0B2, 4191: 0xC0B7, 4192: 0xC0B8, 4193: 0xC0B9, 4194: 0xC0BA, 4195: 0xC0BB, 4196: 0xC0BE, 4197: 0xC0C2, 4198: 0xC0C3, 4199: 0xC0C4, 4200: 0xC0C6, 4201: 0xC0C7, 4202: 0xC0CA, 4203: 0xC0CB, 4204: 0xC0CD, 4205: 0xC0CE, 4206: 0xC0CF, 4207: 0xC0D1, 4208: 0xC0D2, 4209: 0xC0D3, 4210: 0xC0D4, 4211: 0xC0D5, 4212: 0xC0D6, 4213: 0xC0D7, 4214: 0xC0DA, 4215: 0xC0DE, 4216: 0xC0DF, 4217: 0xC0E0, 4218: 0xC0E1, 4219: 0xC0E2, 4220: 0xC0E3, 4221: 0xC0E6, 4222: 0xC0E7, 4223: 0xC0E9, 4224: 0xC0EA, 4225: 0xC0EB, 4226: 0xC0ED, 4227: 0xC0EE, 4228: 0xC0EF, 4229: 0xC0F0, 4230: 0xC0F1, 4231: 0xC0F2, 4232: 0xC0F3, 4233: 0xC0F6, 4234: 0xC0F8, 4235: 0xC0FA, 4236: 0xC0FB, 4237: 0xC0FC, 4238: 0xC0FD, 4239: 0xC0FE, 4240: 0xC0FF, 4241: 0xC101, 4242: 0xC102, 4243: 0xC103, 4244: 0xC105, 4245: 0xC106, 4246: 0xC107, 4247: 0xC109, 4248: 0xC10A, 4249: 0xC10B, 4250: 0xC10C, 4251: 0xC10D, 4252: 0xC10E, 4253: 0xC10F, 4254: 0xC111, 4255: 0xC112, 4256: 0xC113, 4257: 0xC114, 4258: 0xC116, 4259: 0xC117, 4260: 0xC118, 4261: 0xC119, 4262: 0xC11A, 4263: 0xC11B, 4264: 0xC121, 4265: 0xC122, 4266: 0xC125, 4267: 0xC128, 4268: 0xC129, 4269: 0xC12A, 4270: 0xC12B, 4271: 0xC12E, 4272: 0xC132, 4273: 0xC133, 4274: 0xC134, 4275: 0xC135, 4276: 0xC137, 4277: 0xC13A, 4278: 0xC13B, 4279: 0xC13D, 4280: 0xC13E, 4281: 0xC13F, 4282: 0xC141, 4283: 0xC142, 4284: 0xC143, 4285: 0xC144, 4286: 0xC145, 4287: 0xC146, 4288: 0xC147, 4289: 0xC14A, 4290: 0xC14E, 4291: 0xC14F, 4292: 0xC150, 4293: 0xC151, 4294: 0xC152, 4295: 0xC153, 4296: 0xC156, 4297: 0xC157, 4298: 0xC159, 4299: 0xC15A, 4300: 0xC15B, 4301: 0xC15D, 4302: 0xC15E, 4303: 0xC15F, 4304: 0xC160, 4305: 0xC161, 4306: 0xC162, 4307: 0xC163, 4308: 0xC166, 4309: 0xC16A, 4310: 0xC16B, 4311: 0xC16C, 4312: 0xC16D, 4313: 0xC16E, 4314: 0xC16F, 4315: 0xC171, 4316: 0xC172, 4317: 0xC173, 4318: 0xC175, 4319: 0xC176, 4320: 0xC177, 4321: 0xC179, 4322: 0xC17A, 4323: 0xC17B, 4324: 0xC17C, 4325: 0xC17D, 4326: 0xC17E, 4327: 0xC17F, 4328: 0xC180, 4329: 0xC181, 4330: 0xC182, 4331: 0xC183, 4332: 0xC184, 4333: 0xC186, 4334: 0xC187, 4335: 0xC188, 4336: 0xC189, 4337: 0xC18A, 4338: 0xC18B, 4339: 0xC18F, 4340: 0xC191, 4341: 0xC192, 4342: 0xC193, 4343: 0xC195, 4344: 0xC197, 4345: 0xC198, 4346: 0xC199, 4347: 0xC19A, 4348: 0xC19B, 4349: 0xC19E, 4350: 0xC1A0, 4351: 0xC1A2, 4352: 0xC1A3, 4353: 0xC1A4, 4354: 0xC1A6, 4355: 0xC1A7, 4356: 0xC1AA, 4357: 0xC1AB, 4358: 0xC1AD, 4359: 0xC1AE, 4360: 0xC1AF, 4361: 0xC1B1, 4362: 0xC1B2, 4363: 0xC1B3, 4364: 0xC1B4, 4365: 0xC1B5, 4366: 0xC1B6, 4367: 0xC1B7, 4368: 0xC1B8, 4369: 0xC1B9, 4370: 0xC1BA, 4371: 0xC1BB, 4372: 0xC1BC, 4373: 0xC1BE, 4374: 0xC1BF, 4375: 0xC1C0, 4376: 0xC1C1, 4377: 0xC1C2, 4378: 0xC1C3, 4379: 0xC1C5, 4380: 0xC1C6, 4381: 0xC1C7, 4382: 0xC1C9, 4383: 0xC1CA, 4384: 0xC1CB, 4385: 0xC1CD, 4386: 0xC1CE, 4387: 0xC1CF, 4388: 0xC1D0, 4389: 0xC1D1, 4390: 0xC1D2, 4391: 0xC1D3, 4392: 0xC1D5, 4393: 0xC1D6, 4394: 0xC1D9, 4395: 0xC1DA, 4396: 0xC1DB, 4397: 0xC1DC, 4398: 0xC1DD, 4399: 0xC1DE, 4400: 0xC1DF, 4401: 0xC1E1, 4402: 0xC1E2, 4403: 0xC1E3, 4404: 0xC1E5, 4405: 0xC1E6, 4406: 0xC1E7, 4407: 0xC1E9, 4408: 0xC1EA, 4409: 0xC1EB, 4410: 0xC1EC, 4411: 0xC1ED, 4412: 0xC1EE, 4413: 0xC1EF, 4414: 0xC1F2, 4415: 0xC1F4, 4416: 0xC1F5, 4417: 0xC1F6, 4418: 0xC1F7, 4419: 0xC1F8, 4420: 0xC1F9, 4421: 0xC1FA, 4422: 0xC1FB, 4423: 0xC1FE, 4424: 0xC1FF, 4425: 0xC201, 4426: 0xC202, 4427: 0xC203, 4428: 0xC205, 4429: 0xC206, 4430: 0xC207, 4431: 0xC208, 4432: 0xC209, 4433: 0xC20A, 4434: 0xC20B, 4435: 0xC20E, 4436: 0xC210, 4437: 0xC212, 4438: 0xC213, 4439: 0xC214, 4440: 0xC215, 4441: 0xC216, 4442: 0xC217, 4443: 0xC21A, 4444: 0xC21B, 4445: 0xC21D, 4446: 0xC21E, 4447: 0xC221, 4448: 0xC222, 4449: 0xC223, 4450: 0xC224, 4451: 0xC225, 4452: 0xC226, 4453: 0xC227, 4454: 0xC22A, 4455: 0xC22C, 4456: 0xC22E, 4457: 0xC230, 4458: 0xC233, 4459: 0xC235, 4460: 0xC236, 4461: 0xC237, 4462: 0xC238, 4463: 0xC239, 4464: 0xC23A, 4465: 0xC23B, 4466: 0xC23C, 4467: 0xC23D, 4468: 0xC23E, 4469: 0xC23F, 4470: 0xC240, 4471: 0xC241, 4472: 0xC242, 4473: 0xC243, 4474: 0xC244, 4475: 0xC245, 4476: 0xC246, 4477: 0xC247, 4478: 0xC249, 4479: 0xC24A, 4480: 0xC24B, 4481: 0xC24C, 4482: 0xC24D, 4483: 0xC24E, 4484: 0xC24F, 4485: 0xC252, 4486: 0xC253, 4487: 0xC255, 4488: 0xC256, 4489: 0xC257, 4490: 0xC259, 4491: 0xC25A, 4492: 0xC25B, 4493: 0xC25C, 4494: 0xC25D, 4495: 0xC25E, 4496: 0xC25F, 4497: 0xC261, 4498: 0xC262, 4499: 0xC263, 4500: 0xC264, 4501: 0xC266, 4502: 0xC267, 4503: 0xC268, 4504: 0xC269, 4505: 0xC26A, 4506: 0xC26B, 4507: 0xC26E, 4508: 0xC26F, 4509: 0xC271, 4510: 0xC272, 4511: 0xC273, 4512: 0xC275, 4513: 0xC276, 4514: 0xC277, 4515: 0xC278, 4516: 0xC279, 4517: 0xC27A, 4518: 0xC27B, 4519: 0xC27E, 4520: 0xC280, 4521: 0xC282, 4522: 0xC283, 4523: 0xC284, 4524: 0xC285, 4525: 0xC286, 4526: 0xC287, 4527: 0xC28A, 4528: 0xC28B, 4529: 0xC28C, 4530: 0xC28D, 4531: 0xC28E, 4532: 0xC28F, 4533: 0xC291, 4534: 0xC292, 4535: 0xC293, 4536: 0xC294, 4537: 0xC295, 4538: 0xC296, 4539: 0xC297, 4540: 0xC299, 4541: 0xC29A, 4542: 0xC29C, 4543: 0xC29E, 4544: 0xC29F, 4545: 0xC2A0, 4546: 0xC2A1, 4547: 0xC2A2, 4548: 0xC2A3, 4549: 0xC2A6, 4550: 0xC2A7, 4551: 0xC2A9, 4552: 0xC2AA, 4553: 0xC2AB, 4554: 0xC2AE, 4555: 0xC2AF, 4556: 0xC2B0, 4557: 0xC2B1, 4558: 0xC2B2, 4559: 0xC2B3, 4560: 0xC2B6, 4561: 0xC2B8, 4562: 0xC2BA, 4563: 0xC2BB, 4564: 0xC2BC, 4565: 0xC2BD, 4566: 0xC2BE, 4567: 0xC2BF, 4568: 0xC2C0, 4569: 0xC2C1, 4570: 0xC2C2, 4571: 0xC2C3, 4572: 0xC2C4, 4573: 0xC2C5, 4574: 0xC2C6, 4575: 0xC2C7, 4576: 0xC2C8, 4577: 0xC2C9, 4578: 0xC2CA, 4579: 0xC2CB, 4580: 0xC2CC, 4581: 0xC2CD, 4582: 0xC2CE, 4583: 0xC2CF, 4584: 0xC2D0, 4585: 0xC2D1, 4586: 0xC2D2, 4587: 0xC2D3, 4588: 0xC2D4, 4589: 0xC2D5, 4590: 0xC2D6, 4591: 0xC2D7, 4592: 0xC2D8, 4593: 0xC2D9, 4594: 0xC2DA, 4595: 0xC2DB, 4596: 0xC2DE, 4597: 0xC2DF, 4598: 0xC2E1, 4599: 0xC2E2, 4600: 0xC2E5, 4601: 0xC2E6, 4602: 0xC2E7, 4603: 0xC2E8, 4604: 0xC2E9, 4605: 0xC2EA, 4606: 0xC2EE, 4607: 0xC2F0, 4608: 0xC2F2, 4609: 0xC2F3, 4610: 0xC2F4, 4611: 0xC2F5, 4612: 0xC2F7, 4613: 0xC2FA, 4614: 0xC2FD, 4615: 0xC2FE, 4616: 0xC2FF, 4617: 0xC301, 4618: 0xC302, 4619: 0xC303, 4620: 0xC304, 4621: 0xC305, 4622: 0xC306, 4623: 0xC307, 4624: 0xC30A, 4625: 0xC30B, 4626: 0xC30E, 4627: 0xC30F, 4628: 0xC310, 4629: 0xC311, 4630: 0xC312, 4631: 0xC316, 4632: 0xC317, 4633: 0xC319, 4634: 0xC31A, 4635: 0xC31B, 4636: 0xC31D, 4637: 0xC31E, 4638: 0xC31F, 4639: 0xC320, 4640: 0xC321, 4641: 0xC322, 4642: 0xC323, 4643: 0xC326, 4644: 0xC327, 4645: 0xC32A, 4646: 0xC32B, 4647: 0xC32C, 4648: 0xC32D, 4649: 0xC32E, 4650: 0xC32F, 4651: 0xC330, 4652: 0xC331, 4653: 0xC332, 4654: 0xC333, 4655: 0xC334, 4656: 0xC335, 4657: 0xC336, 4658: 0xC337, 4659: 0xC338, 4660: 0xC339, 4661: 0xC33A, 4662: 0xC33B, 4663: 0xC33C, 4664: 0xC33D, 4665: 0xC33E, 4666: 0xC33F, 4667: 0xC340, 4668: 0xC341, 4669: 0xC342, 4670: 0xC343, 4671: 0xC344, 4672: 0xC346, 4673: 0xC347, 4674: 0xC348, 4675: 0xC349, 4676: 0xC34A, 4677: 0xC34B, 4678: 0xC34C, 4679: 0xC34D, 4680: 0xC34E, 4681: 0xC34F, 4682: 0xC350, 4683: 0xC351, 4684: 0xC352, 4685: 0xC353, 4686: 0xC354, 4687: 0xC355, 4688: 0xC356, 4689: 0xC357, 4690: 0xC358, 4691: 0xC359, 4692: 0xC35A, 4693: 0xC35B, 4694: 0xC35C, 4695: 0xC35D, 4696: 0xC35E, 4697: 0xC35F, 4698: 0xC360, 4699: 0xC361, 4700: 0xC362, 4701: 0xC363, 4702: 0xC364, 4703: 0xC365, 4704: 0xC366, 4705: 0xC367, 4706: 0xC36A, 4707: 0xC36B, 4708: 0xC36D, 4709: 0xC36E, 4710: 0xC36F, 4711: 0xC371, 4712: 0xC373, 4713: 0xC374, 4714: 0xC375, 4715: 0xC376, 4716: 0xC377, 4717: 0xC37A, 4718: 0xC37B, 4719: 0xC37E, 4720: 0xC37F, 4721: 0xC380, 4722: 0xC381, 4723: 0xC382, 4724: 0xC383, 4725: 0xC385, 4726: 0xC386, 4727: 0xC387, 4728: 0xC389, 4729: 0xC38A, 4730: 0xC38B, 4731: 0xC38D, 4732: 0xC38E, 4733: 0xC38F, 4734: 0xC390, 4735: 0xC391, 4736: 0xC392, 4737: 0xC393, 4738: 0xC394, 4739: 0xC395, 4740: 0xC396, 4741: 0xC397, 4742: 0xC398, 4743: 0xC399, 4744: 0xC39A, 4745: 0xC39B, 4746: 0xC39C, 4747: 0xC39D, 4748: 0xC39E, 4749: 0xC39F, 4750: 0xC3A0, 4751: 0xC3A1, 4752: 0xC3A2, 4753: 0xC3A3, 4754: 0xC3A4, 4755: 0xC3A5, 4756: 0xC3A6, 4757: 0xC3A7, 4758: 0xC3A8, 4759: 0xC3A9, 4760: 0xC3AA, 4761: 0xC3AB, 4762: 0xC3AC, 4763: 0xC3AD, 4764: 0xC3AE, 4765: 0xC3AF, 4766: 0xC3B0, 4767: 0xC3B1, 4768: 0xC3B2, 4769: 0xC3B3, 4770: 0xC3B4, 4771: 0xC3B5, 4772: 0xC3B6, 4773: 0xC3B7, 4774: 0xC3B8, 4775: 0xC3B9, 4776: 0xC3BA, 4777: 0xC3BB, 4778: 0xC3BC, 4779: 0xC3BD, 4780: 0xC3BE, 4781: 0xC3BF, 4782: 0xC3C1, 4783: 0xC3C2, 4784: 0xC3C3, 4785: 0xC3C4, 4786: 0xC3C5, 4787: 0xC3C6, 4788: 0xC3C7, 4789: 0xC3C8, 4790: 0xC3C9, 4791: 0xC3CA, 4792: 0xC3CB, 4793: 0xC3CC, 4794: 0xC3CD, 4795: 0xC3CE, 4796: 0xC3CF, 4797: 0xC3D0, 4798: 0xC3D1, 4799: 0xC3D2, 4800: 0xC3D3, 4801: 0xC3D4, 4802: 0xC3D5, 4803: 0xC3D6, 4804: 0xC3D7, 4805: 0xC3DA, 4806: 0xC3DB, 4807: 0xC3DD, 4808: 0xC3DE, 4809: 0xC3E1, 4810: 0xC3E3, 4811: 0xC3E4, 4812: 0xC3E5, 4813: 0xC3E6, 4814: 0xC3E7, 4815: 0xC3EA, 4816: 0xC3EB, 4817: 0xC3EC, 4818: 0xC3EE, 4819: 0xC3EF, 4820: 0xC3F0, 4821: 0xC3F1, 4822: 0xC3F2, 4823: 0xC3F3, 4824: 0xC3F6, 4825: 0xC3F7, 4826: 0xC3F9, 4827: 0xC3FA, 4828: 0xC3FB, 4829: 0xC3FC, 4830: 0xC3FD, 4831: 0xC3FE, 4832: 0xC3FF, 4833: 0xC400, 4834: 0xC401, 4835: 0xC402, 4836: 0xC403, 4837: 0xC404, 4838: 0xC405, 4839: 0xC406, 4840: 0xC407, 4841: 0xC409, 4842: 0xC40A, 4843: 0xC40B, 4844: 0xC40C, 4845: 0xC40D, 4846: 0xC40E, 4847: 0xC40F, 4848: 0xC411, 4849: 0xC412, 4850: 0xC413, 4851: 0xC414, 4852: 0xC415, 4853: 0xC416, 4854: 0xC417, 4855: 0xC418, 4856: 0xC419, 4857: 0xC41A, 4858: 0xC41B, 4859: 0xC41C, 4860: 0xC41D, 4861: 0xC41E, 4862: 0xC41F, 4863: 0xC420, 4864: 0xC421, 4865: 0xC422, 4866: 0xC423, 4867: 0xC425, 4868: 0xC426, 4869: 0xC427, 4870: 0xC428, 4871: 0xC429, 4872: 0xC42A, 4873: 0xC42B, 4874: 0xC42D, 4875: 0xC42E, 4876: 0xC42F, 4877: 0xC431, 4878: 0xC432, 4879: 0xC433, 4880: 0xC435, 4881: 0xC436, 4882: 0xC437, 4883: 0xC438, 4884: 0xC439, 4885: 0xC43A, 4886: 0xC43B, 4887: 0xC43E, 4888: 0xC43F, 4889: 0xC440, 4890: 0xC441, 4891: 0xC442, 4892: 0xC443, 4893: 0xC444, 4894: 0xC445, 4895: 0xC446, 4896: 0xC447, 4897: 0xC449, 4898: 0xC44A, 4899: 0xC44B, 4900: 0xC44C, 4901: 0xC44D, 4902: 0xC44E, 4903: 0xC44F, 4904: 0xC450, 4905: 0xC451, 4906: 0xC452, 4907: 0xC453, 4908: 0xC454, 4909: 0xC455, 4910: 0xC456, 4911: 0xC457, 4912: 0xC458, 4913: 0xC459, 4914: 0xC45A, 4915: 0xC45B, 4916: 0xC45C, 4917: 0xC45D, 4918: 0xC45E, 4919: 0xC45F, 4920: 0xC460, 4921: 0xC461, 4922: 0xC462, 4923: 0xC463, 4924: 0xC466, 4925: 0xC467, 4926: 0xC469, 4927: 0xC46A, 4928: 0xC46B, 4929: 0xC46D, 4930: 0xC46E, 4931: 0xC46F, 4932: 0xC470, 4933: 0xC471, 4934: 0xC472, 4935: 0xC473, 4936: 0xC476, 4937: 0xC477, 4938: 0xC478, 4939: 0xC47A, 4940: 0xC47B, 4941: 0xC47C, 4942: 0xC47D, 4943: 0xC47E, 4944: 0xC47F, 4945: 0xC481, 4946: 0xC482, 4947: 0xC483, 4948: 0xC484, 4949: 0xC485, 4950: 0xC486, 4951: 0xC487, 4952: 0xC488, 4953: 0xC489, 4954: 0xC48A, 4955: 0xC48B, 4956: 0xC48C, 4957: 0xC48D, 4958: 0xC48E, 4959: 0xC48F, 4960: 0xC490, 4961: 0xC491, 4962: 0xC492, 4963: 0xC493, 4964: 0xC495, 4965: 0xC496, 4966: 0xC497, 4967: 0xC498, 4968: 0xC499, 4969: 0xC49A, 4970: 0xC49B, 4971: 0xC49D, 4972: 0xC49E, 4973: 0xC49F, 4974: 0xC4A0, 4975: 0xC4A1, 4976: 0xC4A2, 4977: 0xC4A3, 4978: 0xC4A4, 4979: 0xC4A5, 4980: 0xC4A6, 4981: 0xC4A7, 4982: 0xC4A8, 4983: 0xC4A9, 4984: 0xC4AA, 4985: 0xC4AB, 4986: 0xC4AC, 4987: 0xC4AD, 4988: 0xC4AE, 4989: 0xC4AF, 4990: 0xC4B0, 4991: 0xC4B1, 4992: 0xC4B2, 4993: 0xC4B3, 4994: 0xC4B4, 4995: 0xC4B5, 4996: 0xC4B6, 4997: 0xC4B7, 4998: 0xC4B9, 4999: 0xC4BA, 5000: 0xC4BB, 5001: 0xC4BD, 5002: 0xC4BE, 5003: 0xC4BF, 5004: 0xC4C0, 5005: 0xC4C1, 5006: 0xC4C2, 5007: 0xC4C3, 5008: 0xC4C4, 5009: 0xC4C5, 5010: 0xC4C6, 5011: 0xC4C7, 5012: 0xC4C8, 5013: 0xC4C9, 5014: 0xC4CA, 5015: 0xC4CB, 5016: 0xC4CC, 5017: 0xC4CD, 5018: 0xC4CE, 5019: 0xC4CF, 5020: 0xC4D0, 5021: 0xC4D1, 5022: 0xC4D2, 5023: 0xC4D3, 5024: 0xC4D4, 5025: 0xC4D5, 5026: 0xC4D6, 5027: 0xC4D7, 5028: 0xC4D8, 5029: 0xC4D9, 5030: 0xC4DA, 5031: 0xC4DB, 5032: 0xC4DC, 5033: 0xC4DD, 5034: 0xC4DE, 5035: 0xC4DF, 5036: 0xC4E0, 5037: 0xC4E1, 5038: 0xC4E2, 5039: 0xC4E3, 5040: 0xC4E4, 5041: 0xC4E5, 5042: 0xC4E6, 5043: 0xC4E7, 5044: 0xC4E8, 5045: 0xC4EA, 5046: 0xC4EB, 5047: 0xC4EC, 5048: 0xC4ED, 5049: 0xC4EE, 5050: 0xC4EF, 5051: 0xC4F2, 5052: 0xC4F3, 5053: 0xC4F5, 5054: 0xC4F6, 5055: 0xC4F7, 5056: 0xC4F9, 5057: 0xC4FB, 5058: 0xC4FC, 5059: 0xC4FD, 5060: 0xC4FE, 5061: 0xC502, 5062: 0xC503, 5063: 0xC504, 5064: 0xC505, 5065: 0xC506, 5066: 0xC507, 5067: 0xC508, 5068: 0xC509, 5069: 0xC50A, 5070: 0xC50B, 5071: 0xC50D, 5072: 0xC50E, 5073: 0xC50F, 5074: 0xC511, 5075: 0xC512, 5076: 0xC513, 5077: 0xC515, 5078: 0xC516, 5079: 0xC517, 5080: 0xC518, 5081: 0xC519, 5082: 0xC51A, 5083: 0xC51B, 5084: 0xC51D, 5085: 0xC51E, 5086: 0xC51F, 5087: 0xC520, 5088: 0xC521, 5089: 0xC522, 5090: 0xC523, 5091: 0xC524, 5092: 0xC525, 5093: 0xC526, 5094: 0xC527, 5095: 0xC52A, 5096: 0xC52B, 5097: 0xC52D, 5098: 0xC52E, 5099: 0xC52F, 5100: 0xC531, 5101: 0xC532, 5102: 0xC533, 5103: 0xC534, 5104: 0xC535, 5105: 0xC536, 5106: 0xC537, 5107: 0xC53A, 5108: 0xC53C, 5109: 0xC53E, 5110: 0xC53F, 5111: 0xC540, 5112: 0xC541, 5113: 0xC542, 5114: 0xC543, 5115: 0xC546, 5116: 0xC547, 5117: 0xC54B, 5118: 0xC54F, 5119: 0xC550, 5120: 0xC551, 5121: 0xC552, 5122: 0xC556, 5123: 0xC55A, 5124: 0xC55B, 5125: 0xC55C, 5126: 0xC55F, 5127: 0xC562, 5128: 0xC563, 5129: 0xC565, 5130: 0xC566, 5131: 0xC567, 5132: 0xC569, 5133: 0xC56A, 5134: 0xC56B, 5135: 0xC56C, 5136: 0xC56D, 5137: 0xC56E, 5138: 0xC56F, 5139: 0xC572, 5140: 0xC576, 5141: 0xC577, 5142: 0xC578, 5143: 0xC579, 5144: 0xC57A, 5145: 0xC57B, 5146: 0xC57E, 5147: 0xC57F, 5148: 0xC581, 5149: 0xC582, 5150: 0xC583, 5151: 0xC585, 5152: 0xC586, 5153: 0xC588, 5154: 0xC589, 5155: 0xC58A, 5156: 0xC58B, 5157: 0xC58E, 5158: 0xC590, 5159: 0xC592, 5160: 0xC593, 5161: 0xC594, 5162: 0xC596, 5163: 0xC599, 5164: 0xC59A, 5165: 0xC59B, 5166: 0xC59D, 5167: 0xC59E, 5168: 0xC59F, 5169: 0xC5A1, 5170: 0xC5A2, 5171: 0xC5A3, 5172: 0xC5A4, 5173: 0xC5A5, 5174: 0xC5A6, 5175: 0xC5A7, 5176: 0xC5A8, 5177: 0xC5AA, 5178: 0xC5AB, 5179: 0xC5AC, 5180: 0xC5AD, 5181: 0xC5AE, 5182: 0xC5AF, 5183: 0xC5B0, 5184: 0xC5B1, 5185: 0xC5B2, 5186: 0xC5B3, 5187: 0xC5B6, 5188: 0xC5B7, 5189: 0xC5BA, 5190: 0xC5BF, 5191: 0xC5C0, 5192: 0xC5C1, 5193: 0xC5C2, 5194: 0xC5C3, 5195: 0xC5CB, 5196: 0xC5CD, 5197: 0xC5CF, 5198: 0xC5D2, 5199: 0xC5D3, 5200: 0xC5D5, 5201: 0xC5D6, 5202: 0xC5D7, 5203: 0xC5D9, 5204: 0xC5DA, 5205: 0xC5DB, 5206: 0xC5DC, 5207: 0xC5DD, 5208: 0xC5DE, 5209: 0xC5DF, 5210: 0xC5E2, 5211: 0xC5E4, 5212: 0xC5E6, 5213: 0xC5E7, 5214: 0xC5E8, 5215: 0xC5E9, 5216: 0xC5EA, 5217: 0xC5EB, 5218: 0xC5EF, 5219: 0xC5F1, 5220: 0xC5F2, 5221: 0xC5F3, 5222: 0xC5F5, 5223: 0xC5F8, 5224: 0xC5F9, 5225: 0xC5FA, 5226: 0xC5FB, 5227: 0xC602, 5228: 0xC603, 5229: 0xC604, 5230: 0xC609, 5231: 0xC60A, 5232: 0xC60B, 5233: 0xC60D, 5234: 0xC60E, 5235: 0xC60F, 5236: 0xC611, 5237: 0xC612, 5238: 0xC613, 5239: 0xC614, 5240: 0xC615, 5241: 0xC616, 5242: 0xC617, 5243: 0xC61A, 5244: 0xC61D, 5245: 0xC61E, 5246: 0xC61F, 5247: 0xC620, 5248: 0xC621, 5249: 0xC622, 5250: 0xC623, 5251: 0xC626, 5252: 0xC627, 5253: 0xC629, 5254: 0xC62A, 5255: 0xC62B, 5256: 0xC62F, 5257: 0xC631, 5258: 0xC632, 5259: 0xC636, 5260: 0xC638, 5261: 0xC63A, 5262: 0xC63C, 5263: 0xC63D, 5264: 0xC63E, 5265: 0xC63F, 5266: 0xC642, 5267: 0xC643, 5268: 0xC645, 5269: 0xC646, 5270: 0xC647, 5271: 0xC649, 5272: 0xC64A, 5273: 0xC64B, 5274: 0xC64C, 5275: 0xC64D, 5276: 0xC64E, 5277: 0xC64F, 5278: 0xC652, 5279: 0xC656, 5280: 0xC657, 5281: 0xC658, 5282: 0xC659, 5283: 0xC65A, 5284: 0xC65B, 5285: 0xC65E, 5286: 0xC65F, 5287: 0xC661, 5288: 0xC662, 5289: 0xC663, 5290: 0xC664, 5291: 0xC665, 5292: 0xC666, 5293: 0xC667, 5294: 0xC668, 5295: 0xC669, 5296: 0xC66A, 5297: 0xC66B, 5298: 0xC66D, 5299: 0xC66E, 5300: 0xC670, 5301: 0xC672, 5302: 0xC673, 5303: 0xC674, 5304: 0xC675, 5305: 0xC676, 5306: 0xC677, 5307: 0xC67A, 5308: 0xC67B, 5309: 0xC67D, 5310: 0xC67E, 5311: 0xC67F, 5312: 0xC681, 5313: 0xC682, 5314: 0xC683, 5315: 0xC684, 5316: 0xC685, 5317: 0xC686, 5318: 0xC687, 5319: 0xC68A, 5320: 0xC68C, 5321: 0xC68E, 5322: 0xC68F, 5323: 0xC690, 5324: 0xC691, 5325: 0xC692, 5326: 0xC693, 5327: 0xC696, 5328: 0xC697, 5329: 0xC699, 5330: 0xC69A, 5331: 0xC69B, 5332: 0xC69D, 5333: 0xC69E, 5334: 0xC69F, 5335: 0xC6A0, 5336: 0xC6A1, 5337: 0xC6A2, 5338: 0xC6A3, 5339: 0xC6A6, 5340: 0xC6A8, 5341: 0xC6AA, 5342: 0xC6AB, 5343: 0xC6AC, 5344: 0xC6AD, 5345: 0xC6AE, 5346: 0xC6AF, 5347: 0xC6B2, 5348: 0xC6B3, 5349: 0xC6B5, 5350: 0xC6B6, 5351: 0xC6B7, 5352: 0xC6BB, 5353: 0xC6BC, 5354: 0xC6BD, 5355: 0xC6BE, 5356: 0xC6BF, 5357: 0xC6C2, 5358: 0xC6C4, 5359: 0xC6C6, 5360: 0xC6C7, 5361: 0xC6C8, 5362: 0xC6C9, 5363: 0xC6CA, 5364: 0xC6CB, 5365: 0xC6CE, 5366: 0xC6CF, 5367: 0xC6D1, 5368: 0xC6D2, 5369: 0xC6D3, 5370: 0xC6D5, 5371: 0xC6D6, 5372: 0xC6D7, 5373: 0xC6D8, 5374: 0xC6D9, 5375: 0xC6DA, 5376: 0xC6DB, 5377: 0xC6DE, 5378: 0xC6DF, 5379: 0xC6E2, 5380: 0xC6E3, 5381: 0xC6E4, 5382: 0xC6E5, 5383: 0xC6E6, 5384: 0xC6E7, 5385: 0xC6EA, 5386: 0xC6EB, 5387: 0xC6ED, 5388: 0xC6EE, 5389: 0xC6EF, 5390: 0xC6F1, 5391: 0xC6F2, 5392: 0xC6F3, 5393: 0xC6F4, 5394: 0xC6F5, 5395: 0xC6F6, 5396: 0xC6F7, 5397: 0xC6FA, 5398: 0xC6FB, 5399: 0xC6FC, 5400: 0xC6FE, 5401: 0xC6FF, 5402: 0xC700, 5403: 0xC701, 5404: 0xC702, 5405: 0xC703, 5406: 0xC706, 5407: 0xC707, 5408: 0xC709, 5409: 0xC70A, 5410: 0xC70B, 5411: 0xC70D, 5412: 0xC70E, 5413: 0xC70F, 5414: 0xC710, 5415: 0xC711, 5416: 0xC712, 5417: 0xC713, 5418: 0xC716, 5419: 0xC718, 5420: 0xC71A, 5421: 0xC71B, 5422: 0xC71C, 5423: 0xC71D, 5424: 0xC71E, 5425: 0xC71F, 5426: 0xC722, 5427: 0xC723, 5428: 0xC725, 5429: 0xC726, 5430: 0xC727, 5431: 0xC729, 5432: 0xC72A, 5433: 0xC72B, 5434: 0xC72C, 5435: 0xC72D, 5436: 0xC72E, 5437: 0xC72F, 5438: 0xC732, 5439: 0xC734, 5440: 0xC736, 5441: 0xC738, 5442: 0xC739, 5443: 0xC73A, 5444: 0xC73B, 5445: 0xC73E, 5446: 0xC73F, 5447: 0xC741, 5448: 0xC742, 5449: 0xC743, 5450: 0xC745, 5451: 0xC746, 5452: 0xC747, 5453: 0xC748, 5454: 0xC749, 5455: 0xC74B, 5456: 0xC74E, 5457: 0xC750, 5458: 0xC759, 5459: 0xC75A, 5460: 0xC75B, 5461: 0xC75D, 5462: 0xC75E, 5463: 0xC75F, 5464: 0xC761, 5465: 0xC762, 5466: 0xC763, 5467: 0xC764, 5468: 0xC765, 5469: 0xC766, 5470: 0xC767, 5471: 0xC769, 5472: 0xC76A, 5473: 0xC76C, 5474: 0xC76D, 5475: 0xC76E, 5476: 0xC76F, 5477: 0xC770, 5478: 0xC771, 5479: 0xC772, 5480: 0xC773, 5481: 0xC776, 5482: 0xC777, 5483: 0xC779, 5484: 0xC77A, 5485: 0xC77B, 5486: 0xC77F, 5487: 0xC780, 5488: 0xC781, 5489: 0xC782, 5490: 0xC786, 5491: 0xC78B, 5492: 0xC78C, 5493: 0xC78D, 5494: 0xC78F, 5495: 0xC792, 5496: 0xC793, 5497: 0xC795, 5498: 0xC799, 5499: 0xC79B, 5500: 0xC79C, 5501: 0xC79D, 5502: 0xC79E, 5503: 0xC79F, 5504: 0xC7A2, 5505: 0xC7A7, 5506: 0xC7A8, 5507: 0xC7A9, 5508: 0xC7AA, 5509: 0xC7AB, 5510: 0xC7AE, 5511: 0xC7AF, 5512: 0xC7B1, 5513: 0xC7B2, 5514: 0xC7B3, 5515: 0xC7B5, 5516: 0xC7B6, 5517: 0xC7B7, 5518: 0xC7B8, 5519: 0xC7B9, 5520: 0xC7BA, 5521: 0xC7BB, 5522: 0xC7BE, 5523: 0xC7C2, 5524: 0xC7C3, 5525: 0xC7C4, 5526: 0xC7C5, 5527: 0xC7C6, 5528: 0xC7C7, 5529: 0xC7CA, 5530: 0xC7CB, 5531: 0xC7CD, 5532: 0xC7CF, 5533: 0xC7D1, 5534: 0xC7D2, 5535: 0xC7D3, 5536: 0xC7D4, 5537: 0xC7D5, 5538: 0xC7D6, 5539: 0xC7D7, 5540: 0xC7D9, 5541: 0xC7DA, 5542: 0xC7DB, 5543: 0xC7DC, 5544: 0xC7DE, 5545: 0xC7DF, 5546: 0xC7E0, 5547: 0xC7E1, 5548: 0xC7E2, 5549: 0xC7E3, 5550: 0xC7E5, 5551: 0xC7E6, 5552: 0xC7E7, 5553: 0xC7E9, 5554: 0xC7EA, 5555: 0xC7EB, 5556: 0xC7ED, 5557: 0xC7EE, 5558: 0xC7EF, 5559: 0xC7F0, 5560: 0xC7F1, 5561: 0xC7F2, 5562: 0xC7F3, 5563: 0xC7F4, 5564: 0xC7F5, 5565: 0xC7F6, 5566: 0xC7F7, 5567: 0xC7F8, 5568: 0xC7F9, 5569: 0xC7FA, 5570: 0xC7FB, 5571: 0xC7FC, 5572: 0xC7FD, 5573: 0xC7FE, 5574: 0xC7FF, 5575: 0xC802, 5576: 0xC803, 5577: 0xC805, 5578: 0xC806, 5579: 0xC807, 5580: 0xC809, 5581: 0xC80B, 5582: 0xC80C, 5583: 0xC80D, 5584: 0xC80E, 5585: 0xC80F, 5586: 0xC812, 5587: 0xC814, 5588: 0xC817, 5589: 0xC818, 5590: 0xC819, 5591: 0xC81A, 5592: 0xC81B, 5593: 0xC81E, 5594: 0xC81F, 5595: 0xC821, 5596: 0xC822, 5597: 0xC823, 5598: 0xC825, 5599: 0xC826, 5600: 0xC827, 5601: 0xC828, 5602: 0xC829, 5603: 0xC82A, 5604: 0xC82B, 5605: 0xC82E, 5606: 0xC830, 5607: 0xC832, 5608: 0xC833, 5609: 0xC834, 5610: 0xC835, 5611: 0xC836, 5612: 0xC837, 5613: 0xC839, 5614: 0xC83A, 5615: 0xC83B, 5616: 0xC83D, 5617: 0xC83E, 5618: 0xC83F, 5619: 0xC841, 5620: 0xC842, 5621: 0xC843, 5622: 0xC844, 5623: 0xC845, 5624: 0xC846, 5625: 0xC847, 5626: 0xC84A, 5627: 0xC84B, 5628: 0xC84E, 5629: 0xC84F, 5630: 0xC850, 5631: 0xC851, 5632: 0xC852, 5633: 0xC853, 5634: 0xC855, 5635: 0xC856, 5636: 0xC857, 5637: 0xC858, 5638: 0xC859, 5639: 0xC85A, 5640: 0xC85B, 5641: 0xC85C, 5642: 0xC85D, 5643: 0xC85E, 5644: 0xC85F, 5645: 0xC860, 5646: 0xC861, 5647: 0xC862, 5648: 0xC863, 5649: 0xC864, 5650: 0xC865, 5651: 0xC866, 5652: 0xC867, 5653: 0xC868, 5654: 0xC869, 5655: 0xC86A, 5656: 0xC86B, 5657: 0xC86C, 5658: 0xC86D, 5659: 0xC86E, 5660: 0xC86F, 5661: 0xC872, 5662: 0xC873, 5663: 0xC875, 5664: 0xC876, 5665: 0xC877, 5666: 0xC879, 5667: 0xC87B, 5668: 0xC87C, 5669: 0xC87D, 5670: 0xC87E, 5671: 0xC87F, 5672: 0xC882, 5673: 0xC884, 5674: 0xC888, 5675: 0xC889, 5676: 0xC88A, 5677: 0xC88E, 5678: 0xC88F, 5679: 0xC890, 5680: 0xC891, 5681: 0xC892, 5682: 0xC893, 5683: 0xC895, 5684: 0xC896, 5685: 0xC897, 5686: 0xC898, 5687: 0xC899, 5688: 0xC89A, 5689: 0xC89B, 5690: 0xC89C, 5691: 0xC89E, 5692: 0xC8A0, 5693: 0xC8A2, 5694: 0xC8A3, 5695: 0xC8A4, 5696: 0xC8A5, 5697: 0xC8A6, 5698: 0xC8A7, 5699: 0xC8A9, 5700: 0xC8AA, 5701: 0xC8AB, 5702: 0xC8AC, 5703: 0xC8AD, 5704: 0xC8AE, 5705: 0xC8AF, 5706: 0xC8B0, 5707: 0xC8B1, 5708: 0xC8B2, 5709: 0xC8B3, 5710: 0xC8B4, 5711: 0xC8B5, 5712: 0xC8B6, 5713: 0xC8B7, 5714: 0xC8B8, 5715: 0xC8B9, 5716: 0xC8BA, 5717: 0xC8BB, 5718: 0xC8BE, 5719: 0xC8BF, 5720: 0xC8C0, 5721: 0xC8C1, 5722: 0xC8C2, 5723: 0xC8C3, 5724: 0xC8C5, 5725: 0xC8C6, 5726: 0xC8C7, 5727: 0xC8C9, 5728: 0xC8CA, 5729: 0xC8CB, 5730: 0xC8CD, 5731: 0xC8CE, 5732: 0xC8CF, 5733: 0xC8D0, 5734: 0xC8D1, 5735: 0xC8D2, 5736: 0xC8D3, 5737: 0xC8D6, 5738: 0xC8D8, 5739: 0xC8DA, 5740: 0xC8DB, 5741: 0xC8DC, 5742: 0xC8DD, 5743: 0xC8DE, 5744: 0xC8DF, 5745: 0xC8E2, 5746: 0xC8E3, 5747: 0xC8E5, 5748: 0xC8E6, 5749: 0xC8E7, 5750: 0xC8E8, 5751: 0xC8E9, 5752: 0xC8EA, 5753: 0xC8EB, 5754: 0xC8EC, 5755: 0xC8ED, 5756: 0xC8EE, 5757: 0xC8EF, 5758: 0xC8F0, 5759: 0xC8F1, 5760: 0xC8F2, 5761: 0xC8F3, 5762: 0xC8F4, 5763: 0xC8F6, 5764: 0xC8F7, 5765: 0xC8F8, 5766: 0xC8F9, 5767: 0xC8FA, 5768: 0xC8FB, 5769: 0xC8FE, 5770: 0xC8FF, 5771: 0xC901, 5772: 0xC902, 5773: 0xC903, 5774: 0xC907, 5775: 0xC908, 5776: 0xC909, 5777: 0xC90A, 5778: 0xC90B, 5779: 0xC90E, 5780: 0x3000, 5781: 0x3001, 5782: 0x3002, 5783: 0x00B7, 5784: 0x2025, 5785: 0x2026, 5786: 0x00A8, 5787: 0x3003, 5788: 0x00AD, 5789: 0x2015, 5790: 0x2225, 5791: 0xFF3C, 5792: 0x223C, 5793: 0x2018, 5794: 0x2019, 5795: 0x201C, 5796: 0x201D, 5797: 0x3014, 5798: 0x3015, 5799: 0x3008, 5800: 0x3009, 5801: 0x300A, 5802: 0x300B, 5803: 0x300C, 5804: 0x300D, 5805: 0x300E, 5806: 0x300F, 5807: 0x3010, 5808: 0x3011, 5809: 0x00B1, 5810: 0x00D7, 5811: 0x00F7, 5812: 0x2260, 5813: 0x2264, 5814: 0x2265, 5815: 0x221E, 5816: 0x2234, 5817: 0x00B0, 5818: 0x2032, 5819: 0x2033, 5820: 0x2103, 5821: 0x212B, 5822: 0xFFE0, 5823: 0xFFE1, 5824: 0xFFE5, 5825: 0x2642, 5826: 0x2640, 5827: 0x2220, 5828: 0x22A5, 5829: 0x2312, 5830: 0x2202, 5831: 0x2207, 5832: 0x2261, 5833: 0x2252, 5834: 0x00A7, 5835: 0x203B, 5836: 0x2606, 5837: 0x2605, 5838: 0x25CB, 5839: 0x25CF, 5840: 0x25CE, 5841: 0x25C7, 5842: 0x25C6, 5843: 0x25A1, 5844: 0x25A0, 5845: 0x25B3, 5846: 0x25B2, 5847: 0x25BD, 5848: 0x25BC, 5849: 0x2192, 5850: 0x2190, 5851: 0x2191, 5852: 0x2193, 5853: 0x2194, 5854: 0x3013, 5855: 0x226A, 5856: 0x226B, 5857: 0x221A, 5858: 0x223D, 5859: 0x221D, 5860: 0x2235, 5861: 0x222B, 5862: 0x222C, 5863: 0x2208, 5864: 0x220B, 5865: 0x2286, 5866: 0x2287, 5867: 0x2282, 5868: 0x2283, 5869: 0x222A, 5870: 0x2229, 5871: 0x2227, 5872: 0x2228, 5873: 0xFFE2, 5874: 0xC910, 5875: 0xC912, 5876: 0xC913, 5877: 0xC914, 5878: 0xC915, 5879: 0xC916, 5880: 0xC917, 5881: 0xC919, 5882: 0xC91A, 5883: 0xC91B, 5884: 0xC91C, 5885: 0xC91D, 5886: 0xC91E, 5887: 0xC91F, 5888: 0xC920, 5889: 0xC921, 5890: 0xC922, 5891: 0xC923, 5892: 0xC924, 5893: 0xC925, 5894: 0xC926, 5895: 0xC927, 5896: 0xC928, 5897: 0xC929, 5898: 0xC92A, 5899: 0xC92B, 5900: 0xC92D, 5901: 0xC92E, 5902: 0xC92F, 5903: 0xC930, 5904: 0xC931, 5905: 0xC932, 5906: 0xC933, 5907: 0xC935, 5908: 0xC936, 5909: 0xC937, 5910: 0xC938, 5911: 0xC939, 5912: 0xC93A, 5913: 0xC93B, 5914: 0xC93C, 5915: 0xC93D, 5916: 0xC93E, 5917: 0xC93F, 5918: 0xC940, 5919: 0xC941, 5920: 0xC942, 5921: 0xC943, 5922: 0xC944, 5923: 0xC945, 5924: 0xC946, 5925: 0xC947, 5926: 0xC948, 5927: 0xC949, 5928: 0xC94A, 5929: 0xC94B, 5930: 0xC94C, 5931: 0xC94D, 5932: 0xC94E, 5933: 0xC94F, 5934: 0xC952, 5935: 0xC953, 5936: 0xC955, 5937: 0xC956, 5938: 0xC957, 5939: 0xC959, 5940: 0xC95A, 5941: 0xC95B, 5942: 0xC95C, 5943: 0xC95D, 5944: 0xC95E, 5945: 0xC95F, 5946: 0xC962, 5947: 0xC964, 5948: 0xC965, 5949: 0xC966, 5950: 0xC967, 5951: 0xC968, 5952: 0xC969, 5953: 0xC96A, 5954: 0xC96B, 5955: 0xC96D, 5956: 0xC96E, 5957: 0xC96F, 5958: 0x21D2, 5959: 0x21D4, 5960: 0x2200, 5961: 0x2203, 5962: 0x00B4, 5963: 0xFF5E, 5964: 0x02C7, 5965: 0x02D8, 5966: 0x02DD, 5967: 0x02DA, 5968: 0x02D9, 5969: 0x00B8, 5970: 0x02DB, 5971: 0x00A1, 5972: 0x00BF, 5973: 0x02D0, 5974: 0x222E, 5975: 0x2211, 5976: 0x220F, 5977: 0x00A4, 5978: 0x2109, 5979: 0x2030, 5980: 0x25C1, 5981: 0x25C0, 5982: 0x25B7, 5983: 0x25B6, 5984: 0x2664, 5985: 0x2660, 5986: 0x2661, 5987: 0x2665, 5988: 0x2667, 5989: 0x2663, 5990: 0x2299, 5991: 0x25C8, 5992: 0x25A3, 5993: 0x25D0, 5994: 0x25D1, 5995: 0x2592, 5996: 0x25A4, 5997: 0x25A5, 5998: 0x25A8, 5999: 0x25A7, 6000: 0x25A6, 6001: 0x25A9, 6002: 0x2668, 6003: 0x260F, 6004: 0x260E, 6005: 0x261C, 6006: 0x261E, 6007: 0x00B6, 6008: 0x2020, 6009: 0x2021, 6010: 0x2195, 6011: 0x2197, 6012: 0x2199, 6013: 0x2196, 6014: 0x2198, 6015: 0x266D, 6016: 0x2669, 6017: 0x266A, 6018: 0x266C, 6019: 0x327F, 6020: 0x321C, 6021: 0x2116, 6022: 0x33C7, 6023: 0x2122, 6024: 0x33C2, 6025: 0x33D8, 6026: 0x2121, 6027: 0x20AC, 6028: 0x00AE, 6052: 0xC971, 6053: 0xC972, 6054: 0xC973, 6055: 0xC975, 6056: 0xC976, 6057: 0xC977, 6058: 0xC978, 6059: 0xC979, 6060: 0xC97A, 6061: 0xC97B, 6062: 0xC97D, 6063: 0xC97E, 6064: 0xC97F, 6065: 0xC980, 6066: 0xC981, 6067: 0xC982, 6068: 0xC983, 6069: 0xC984, 6070: 0xC985, 6071: 0xC986, 6072: 0xC987, 6073: 0xC98A, 6074: 0xC98B, 6075: 0xC98D, 6076: 0xC98E, 6077: 0xC98F, 6078: 0xC991, 6079: 0xC992, 6080: 0xC993, 6081: 0xC994, 6082: 0xC995, 6083: 0xC996, 6084: 0xC997, 6085: 0xC99A, 6086: 0xC99C, 6087: 0xC99E, 6088: 0xC99F, 6089: 0xC9A0, 6090: 0xC9A1, 6091: 0xC9A2, 6092: 0xC9A3, 6093: 0xC9A4, 6094: 0xC9A5, 6095: 0xC9A6, 6096: 0xC9A7, 6097: 0xC9A8, 6098: 0xC9A9, 6099: 0xC9AA, 6100: 0xC9AB, 6101: 0xC9AC, 6102: 0xC9AD, 6103: 0xC9AE, 6104: 0xC9AF, 6105: 0xC9B0, 6106: 0xC9B1, 6107: 0xC9B2, 6108: 0xC9B3, 6109: 0xC9B4, 6110: 0xC9B5, 6111: 0xC9B6, 6112: 0xC9B7, 6113: 0xC9B8, 6114: 0xC9B9, 6115: 0xC9BA, 6116: 0xC9BB, 6117: 0xC9BC, 6118: 0xC9BD, 6119: 0xC9BE, 6120: 0xC9BF, 6121: 0xC9C2, 6122: 0xC9C3, 6123: 0xC9C5, 6124: 0xC9C6, 6125: 0xC9C9, 6126: 0xC9CB, 6127: 0xC9CC, 6128: 0xC9CD, 6129: 0xC9CE, 6130: 0xC9CF, 6131: 0xC9D2, 6132: 0xC9D4, 6133: 0xC9D7, 6134: 0xC9D8, 6135: 0xC9DB, 6136: 0xFF01, 6137: 0xFF02, 6138: 0xFF03, 6139: 0xFF04, 6140: 0xFF05, 6141: 0xFF06, 6142: 0xFF07, 6143: 0xFF08, 6144: 0xFF09, 6145: 0xFF0A, 6146: 0xFF0B, 6147: 0xFF0C, 6148: 0xFF0D, 6149: 0xFF0E, 6150: 0xFF0F, 6151: 0xFF10, 6152: 0xFF11, 6153: 0xFF12, 6154: 0xFF13, 6155: 0xFF14, 6156: 0xFF15, 6157: 0xFF16, 6158: 0xFF17, 6159: 0xFF18, 6160: 0xFF19, 6161: 0xFF1A, 6162: 0xFF1B, 6163: 0xFF1C, 6164: 0xFF1D, 6165: 0xFF1E, 6166: 0xFF1F, 6167: 0xFF20, 6168: 0xFF21, 6169: 0xFF22, 6170: 0xFF23, 6171: 0xFF24, 6172: 0xFF25, 6173: 0xFF26, 6174: 0xFF27, 6175: 0xFF28, 6176: 0xFF29, 6177: 0xFF2A, 6178: 0xFF2B, 6179: 0xFF2C, 6180: 0xFF2D, 6181: 0xFF2E, 6182: 0xFF2F, 6183: 0xFF30, 6184: 0xFF31, 6185: 0xFF32, 6186: 0xFF33, 6187: 0xFF34, 6188: 0xFF35, 6189: 0xFF36, 6190: 0xFF37, 6191: 0xFF38, 6192: 0xFF39, 6193: 0xFF3A, 6194: 0xFF3B, 6195: 0xFFE6, 6196: 0xFF3D, 6197: 0xFF3E, 6198: 0xFF3F, 6199: 0xFF40, 6200: 0xFF41, 6201: 0xFF42, 6202: 0xFF43, 6203: 0xFF44, 6204: 0xFF45, 6205: 0xFF46, 6206: 0xFF47, 6207: 0xFF48, 6208: 0xFF49, 6209: 0xFF4A, 6210: 0xFF4B, 6211: 0xFF4C, 6212: 0xFF4D, 6213: 0xFF4E, 6214: 0xFF4F, 6215: 0xFF50, 6216: 0xFF51, 6217: 0xFF52, 6218: 0xFF53, 6219: 0xFF54, 6220: 0xFF55, 6221: 0xFF56, 6222: 0xFF57, 6223: 0xFF58, 6224: 0xFF59, 6225: 0xFF5A, 6226: 0xFF5B, 6227: 0xFF5C, 6228: 0xFF5D, 6229: 0xFFE3, 6230: 0xC9DE, 6231: 0xC9DF, 6232: 0xC9E1, 6233: 0xC9E3, 6234: 0xC9E5, 6235: 0xC9E6, 6236: 0xC9E8, 6237: 0xC9E9, 6238: 0xC9EA, 6239: 0xC9EB, 6240: 0xC9EE, 6241: 0xC9F2, 6242: 0xC9F3, 6243: 0xC9F4, 6244: 0xC9F5, 6245: 0xC9F6, 6246: 0xC9F7, 6247: 0xC9FA, 6248: 0xC9FB, 6249: 0xC9FD, 6250: 0xC9FE, 6251: 0xC9FF, 6252: 0xCA01, 6253: 0xCA02, 6254: 0xCA03, 6255: 0xCA04, 6256: 0xCA05, 6257: 0xCA06, 6258: 0xCA07, 6259: 0xCA0A, 6260: 0xCA0E, 6261: 0xCA0F, 6262: 0xCA10, 6263: 0xCA11, 6264: 0xCA12, 6265: 0xCA13, 6266: 0xCA15, 6267: 0xCA16, 6268: 0xCA17, 6269: 0xCA19, 6270: 0xCA1A, 6271: 0xCA1B, 6272: 0xCA1C, 6273: 0xCA1D, 6274: 0xCA1E, 6275: 0xCA1F, 6276: 0xCA20, 6277: 0xCA21, 6278: 0xCA22, 6279: 0xCA23, 6280: 0xCA24, 6281: 0xCA25, 6282: 0xCA26, 6283: 0xCA27, 6284: 0xCA28, 6285: 0xCA2A, 6286: 0xCA2B, 6287: 0xCA2C, 6288: 0xCA2D, 6289: 0xCA2E, 6290: 0xCA2F, 6291: 0xCA30, 6292: 0xCA31, 6293: 0xCA32, 6294: 0xCA33, 6295: 0xCA34, 6296: 0xCA35, 6297: 0xCA36, 6298: 0xCA37, 6299: 0xCA38, 6300: 0xCA39, 6301: 0xCA3A, 6302: 0xCA3B, 6303: 0xCA3C, 6304: 0xCA3D, 6305: 0xCA3E, 6306: 0xCA3F, 6307: 0xCA40, 6308: 0xCA41, 6309: 0xCA42, 6310: 0xCA43, 6311: 0xCA44, 6312: 0xCA45, 6313: 0xCA46, 6314: 0x3131, 6315: 0x3132, 6316: 0x3133, 6317: 0x3134, 6318: 0x3135, 6319: 0x3136, 6320: 0x3137, 6321: 0x3138, 6322: 0x3139, 6323: 0x313A, 6324: 0x313B, 6325: 0x313C, 6326: 0x313D, 6327: 0x313E, 6328: 0x313F, 6329: 0x3140, 6330: 0x3141, 6331: 0x3142, 6332: 0x3143, 6333: 0x3144, 6334: 0x3145, 6335: 0x3146, 6336: 0x3147, 6337: 0x3148, 6338: 0x3149, 6339: 0x314A, 6340: 0x314B, 6341: 0x314C, 6342: 0x314D, 6343: 0x314E, 6344: 0x314F, 6345: 0x3150, 6346: 0x3151, 6347: 0x3152, 6348: 0x3153, 6349: 0x3154, 6350: 0x3155, 6351: 0x3156, 6352: 0x3157, 6353: 0x3158, 6354: 0x3159, 6355: 0x315A, 6356: 0x315B, 6357: 0x315C, 6358: 0x315D, 6359: 0x315E, 6360: 0x315F, 6361: 0x3160, 6362: 0x3161, 6363: 0x3162, 6364: 0x3163, 6365: 0x3164, 6366: 0x3165, 6367: 0x3166, 6368: 0x3167, 6369: 0x3168, 6370: 0x3169, 6371: 0x316A, 6372: 0x316B, 6373: 0x316C, 6374: 0x316D, 6375: 0x316E, 6376: 0x316F, 6377: 0x3170, 6378: 0x3171, 6379: 0x3172, 6380: 0x3173, 6381: 0x3174, 6382: 0x3175, 6383: 0x3176, 6384: 0x3177, 6385: 0x3178, 6386: 0x3179, 6387: 0x317A, 6388: 0x317B, 6389: 0x317C, 6390: 0x317D, 6391: 0x317E, 6392: 0x317F, 6393: 0x3180, 6394: 0x3181, 6395: 0x3182, 6396: 0x3183, 6397: 0x3184, 6398: 0x3185, 6399: 0x3186, 6400: 0x3187, 6401: 0x3188, 6402: 0x3189, 6403: 0x318A, 6404: 0x318B, 6405: 0x318C, 6406: 0x318D, 6407: 0x318E, 6408: 0xCA47, 6409: 0xCA48, 6410: 0xCA49, 6411: 0xCA4A, 6412: 0xCA4B, 6413: 0xCA4E, 6414: 0xCA4F, 6415: 0xCA51, 6416: 0xCA52, 6417: 0xCA53, 6418: 0xCA55, 6419: 0xCA56, 6420: 0xCA57, 6421: 0xCA58, 6422: 0xCA59, 6423: 0xCA5A, 6424: 0xCA5B, 6425: 0xCA5E, 6426: 0xCA62, 6427: 0xCA63, 6428: 0xCA64, 6429: 0xCA65, 6430: 0xCA66, 6431: 0xCA67, 6432: 0xCA69, 6433: 0xCA6A, 6434: 0xCA6B, 6435: 0xCA6C, 6436: 0xCA6D, 6437: 0xCA6E, 6438: 0xCA6F, 6439: 0xCA70, 6440: 0xCA71, 6441: 0xCA72, 6442: 0xCA73, 6443: 0xCA74, 6444: 0xCA75, 6445: 0xCA76, 6446: 0xCA77, 6447: 0xCA78, 6448: 0xCA79, 6449: 0xCA7A, 6450: 0xCA7B, 6451: 0xCA7C, 6452: 0xCA7E, 6453: 0xCA7F, 6454: 0xCA80, 6455: 0xCA81, 6456: 0xCA82, 6457: 0xCA83, 6458: 0xCA85, 6459: 0xCA86, 6460: 0xCA87, 6461: 0xCA88, 6462: 0xCA89, 6463: 0xCA8A, 6464: 0xCA8B, 6465: 0xCA8C, 6466: 0xCA8D, 6467: 0xCA8E, 6468: 0xCA8F, 6469: 0xCA90, 6470: 0xCA91, 6471: 0xCA92, 6472: 0xCA93, 6473: 0xCA94, 6474: 0xCA95, 6475: 0xCA96, 6476: 0xCA97, 6477: 0xCA99, 6478: 0xCA9A, 6479: 0xCA9B, 6480: 0xCA9C, 6481: 0xCA9D, 6482: 0xCA9E, 6483: 0xCA9F, 6484: 0xCAA0, 6485: 0xCAA1, 6486: 0xCAA2, 6487: 0xCAA3, 6488: 0xCAA4, 6489: 0xCAA5, 6490: 0xCAA6, 6491: 0xCAA7, 6492: 0x2170, 6493: 0x2171, 6494: 0x2172, 6495: 0x2173, 6496: 0x2174, 6497: 0x2175, 6498: 0x2176, 6499: 0x2177, 6500: 0x2178, 6501: 0x2179, 6507: 0x2160, 6508: 0x2161, 6509: 0x2162, 6510: 0x2163, 6511: 0x2164, 6512: 0x2165, 6513: 0x2166, 6514: 0x2167, 6515: 0x2168, 6516: 0x2169, 6524: 0x0391, 6525: 0x0392, 6526: 0x0393, 6527: 0x0394, 6528: 0x0395, 6529: 0x0396, 6530: 0x0397, 6531: 0x0398, 6532: 0x0399, 6533: 0x039A, 6534: 0x039B, 6535: 0x039C, 6536: 0x039D, 6537: 0x039E, 6538: 0x039F, 6539: 0x03A0, 6540: 0x03A1, 6541: 0x03A3, 6542: 0x03A4, 6543: 0x03A5, 6544: 0x03A6, 6545: 0x03A7, 6546: 0x03A8, 6547: 0x03A9, 6556: 0x03B1, 6557: 0x03B2, 6558: 0x03B3, 6559: 0x03B4, 6560: 0x03B5, 6561: 0x03B6, 6562: 0x03B7, 6563: 0x03B8, 6564: 0x03B9, 6565: 0x03BA, 6566: 0x03BB, 6567: 0x03BC, 6568: 0x03BD, 6569: 0x03BE, 6570: 0x03BF, 6571: 0x03C0, 6572: 0x03C1, 6573: 0x03C3, 6574: 0x03C4, 6575: 0x03C5, 6576: 0x03C6, 6577: 0x03C7, 6578: 0x03C8, 6579: 0x03C9, 6586: 0xCAA8, 6587: 0xCAA9, 6588: 0xCAAA, 6589: 0xCAAB, 6590: 0xCAAC, 6591: 0xCAAD, 6592: 0xCAAE, 6593: 0xCAAF, 6594: 0xCAB0, 6595: 0xCAB1, 6596: 0xCAB2, 6597: 0xCAB3, 6598: 0xCAB4, 6599: 0xCAB5, 6600: 0xCAB6, 6601: 0xCAB7, 6602: 0xCAB8, 6603: 0xCAB9, 6604: 0xCABA, 6605: 0xCABB, 6606: 0xCABE, 6607: 0xCABF, 6608: 0xCAC1, 6609: 0xCAC2, 6610: 0xCAC3, 6611: 0xCAC5, 6612: 0xCAC6, 6613: 0xCAC7, 6614: 0xCAC8, 6615: 0xCAC9, 6616: 0xCACA, 6617: 0xCACB, 6618: 0xCACE, 6619: 0xCAD0, 6620: 0xCAD2, 6621: 0xCAD4, 6622: 0xCAD5, 6623: 0xCAD6, 6624: 0xCAD7, 6625: 0xCADA, 6626: 0xCADB, 6627: 0xCADC, 6628: 0xCADD, 6629: 0xCADE, 6630: 0xCADF, 6631: 0xCAE1, 6632: 0xCAE2, 6633: 0xCAE3, 6634: 0xCAE4, 6635: 0xCAE5, 6636: 0xCAE6, 6637: 0xCAE7, 6638: 0xCAE8, 6639: 0xCAE9, 6640: 0xCAEA, 6641: 0xCAEB, 6642: 0xCAED, 6643: 0xCAEE, 6644: 0xCAEF, 6645: 0xCAF0, 6646: 0xCAF1, 6647: 0xCAF2, 6648: 0xCAF3, 6649: 0xCAF5, 6650: 0xCAF6, 6651: 0xCAF7, 6652: 0xCAF8, 6653: 0xCAF9, 6654: 0xCAFA, 6655: 0xCAFB, 6656: 0xCAFC, 6657: 0xCAFD, 6658: 0xCAFE, 6659: 0xCAFF, 6660: 0xCB00, 6661: 0xCB01, 6662: 0xCB02, 6663: 0xCB03, 6664: 0xCB04, 6665: 0xCB05, 6666: 0xCB06, 6667: 0xCB07, 6668: 0xCB09, 6669: 0xCB0A, 6670: 0x2500, 6671: 0x2502, 6672: 0x250C, 6673: 0x2510, 6674: 0x2518, 6675: 0x2514, 6676: 0x251C, 6677: 0x252C, 6678: 0x2524, 6679: 0x2534, 6680: 0x253C, 6681: 0x2501, 6682: 0x2503, 6683: 0x250F, 6684: 0x2513, 6685: 0x251B, 6686: 0x2517, 6687: 0x2523, 6688: 0x2533, 6689: 0x252B, 6690: 0x253B, 6691: 0x254B, 6692: 0x2520, 6693: 0x252F, 6694: 0x2528, 6695: 0x2537, 6696: 0x253F, 6697: 0x251D, 6698: 0x2530, 6699: 0x2525, 6700: 0x2538, 6701: 0x2542, 6702: 0x2512, 6703: 0x2511, 6704: 0x251A, 6705: 0x2519, 6706: 0x2516, 6707: 0x2515, 6708: 0x250E, 6709: 0x250D, 6710: 0x251E, 6711: 0x251F, 6712: 0x2521, 6713: 0x2522, 6714: 0x2526, 6715: 0x2527, 6716: 0x2529, 6717: 0x252A, 6718: 0x252D, 6719: 0x252E, 6720: 0x2531, 6721: 0x2532, 6722: 0x2535, 6723: 0x2536, 6724: 0x2539, 6725: 0x253A, 6726: 0x253D, 6727: 0x253E, 6728: 0x2540, 6729: 0x2541, 6730: 0x2543, 6731: 0x2544, 6732: 0x2545, 6733: 0x2546, 6734: 0x2547, 6735: 0x2548, 6736: 0x2549, 6737: 0x254A, 6764: 0xCB0B, 6765: 0xCB0C, 6766: 0xCB0D, 6767: 0xCB0E, 6768: 0xCB0F, 6769: 0xCB11, 6770: 0xCB12, 6771: 0xCB13, 6772: 0xCB15, 6773: 0xCB16, 6774: 0xCB17, 6775: 0xCB19, 6776: 0xCB1A, 6777: 0xCB1B, 6778: 0xCB1C, 6779: 0xCB1D, 6780: 0xCB1E, 6781: 0xCB1F, 6782: 0xCB22, 6783: 0xCB23, 6784: 0xCB24, 6785: 0xCB25, 6786: 0xCB26, 6787: 0xCB27, 6788: 0xCB28, 6789: 0xCB29, 6790: 0xCB2A, 6791: 0xCB2B, 6792: 0xCB2C, 6793: 0xCB2D, 6794: 0xCB2E, 6795: 0xCB2F, 6796: 0xCB30, 6797: 0xCB31, 6798: 0xCB32, 6799: 0xCB33, 6800: 0xCB34, 6801: 0xCB35, 6802: 0xCB36, 6803: 0xCB37, 6804: 0xCB38, 6805: 0xCB39, 6806: 0xCB3A, 6807: 0xCB3B, 6808: 0xCB3C, 6809: 0xCB3D, 6810: 0xCB3E, 6811: 0xCB3F, 6812: 0xCB40, 6813: 0xCB42, 6814: 0xCB43, 6815: 0xCB44, 6816: 0xCB45, 6817: 0xCB46, 6818: 0xCB47, 6819: 0xCB4A, 6820: 0xCB4B, 6821: 0xCB4D, 6822: 0xCB4E, 6823: 0xCB4F, 6824: 0xCB51, 6825: 0xCB52, 6826: 0xCB53, 6827: 0xCB54, 6828: 0xCB55, 6829: 0xCB56, 6830: 0xCB57, 6831: 0xCB5A, 6832: 0xCB5B, 6833: 0xCB5C, 6834: 0xCB5E, 6835: 0xCB5F, 6836: 0xCB60, 6837: 0xCB61, 6838: 0xCB62, 6839: 0xCB63, 6840: 0xCB65, 6841: 0xCB66, 6842: 0xCB67, 6843: 0xCB68, 6844: 0xCB69, 6845: 0xCB6A, 6846: 0xCB6B, 6847: 0xCB6C, 6848: 0x3395, 6849: 0x3396, 6850: 0x3397, 6851: 0x2113, 6852: 0x3398, 6853: 0x33C4, 6854: 0x33A3, 6855: 0x33A4, 6856: 0x33A5, 6857: 0x33A6, 6858: 0x3399, 6859: 0x339A, 6860: 0x339B, 6861: 0x339C, 6862: 0x339D, 6863: 0x339E, 6864: 0x339F, 6865: 0x33A0, 6866: 0x33A1, 6867: 0x33A2, 6868: 0x33CA, 6869: 0x338D, 6870: 0x338E, 6871: 0x338F, 6872: 0x33CF, 6873: 0x3388, 6874: 0x3389, 6875: 0x33C8, 6876: 0x33A7, 6877: 0x33A8, 6878: 0x33B0, 6879: 0x33B1, 6880: 0x33B2, 6881: 0x33B3, 6882: 0x33B4, 6883: 0x33B5, 6884: 0x33B6, 6885: 0x33B7, 6886: 0x33B8, 6887: 0x33B9, 6888: 0x3380, 6889: 0x3381, 6890: 0x3382, 6891: 0x3383, 6892: 0x3384, 6893: 0x33BA, 6894: 0x33BB, 6895: 0x33BC, 6896: 0x33BD, 6897: 0x33BE, 6898: 0x33BF, 6899: 0x3390, 6900: 0x3391, 6901: 0x3392, 6902: 0x3393, 6903: 0x3394, 6904: 0x2126, 6905: 0x33C0, 6906: 0x33C1, 6907: 0x338A, 6908: 0x338B, 6909: 0x338C, 6910: 0x33D6, 6911: 0x33C5, 6912: 0x33AD, 6913: 0x33AE, 6914: 0x33AF, 6915: 0x33DB, 6916: 0x33A9, 6917: 0x33AA, 6918: 0x33AB, 6919: 0x33AC, 6920: 0x33DD, 6921: 0x33D0, 6922: 0x33D3, 6923: 0x33C3, 6924: 0x33C9, 6925: 0x33DC, 6926: 0x33C6, 6942: 0xCB6D, 6943: 0xCB6E, 6944: 0xCB6F, 6945: 0xCB70, 6946: 0xCB71, 6947: 0xCB72, 6948: 0xCB73, 6949: 0xCB74, 6950: 0xCB75, 6951: 0xCB76, 6952: 0xCB77, 6953: 0xCB7A, 6954: 0xCB7B, 6955: 0xCB7C, 6956: 0xCB7D, 6957: 0xCB7E, 6958: 0xCB7F, 6959: 0xCB80, 6960: 0xCB81, 6961: 0xCB82, 6962: 0xCB83, 6963: 0xCB84, 6964: 0xCB85, 6965: 0xCB86, 6966: 0xCB87, 6967: 0xCB88, 6968: 0xCB89, 6969: 0xCB8A, 6970: 0xCB8B, 6971: 0xCB8C, 6972: 0xCB8D, 6973: 0xCB8E, 6974: 0xCB8F, 6975: 0xCB90, 6976: 0xCB91, 6977: 0xCB92, 6978: 0xCB93, 6979: 0xCB94, 6980: 0xCB95, 6981: 0xCB96, 6982: 0xCB97, 6983: 0xCB98, 6984: 0xCB99, 6985: 0xCB9A, 6986: 0xCB9B, 6987: 0xCB9D, 6988: 0xCB9E, 6989: 0xCB9F, 6990: 0xCBA0, 6991: 0xCBA1, 6992: 0xCBA2, 6993: 0xCBA3, 6994: 0xCBA4, 6995: 0xCBA5, 6996: 0xCBA6, 6997: 0xCBA7, 6998: 0xCBA8, 6999: 0xCBA9, 7000: 0xCBAA, 7001: 0xCBAB, 7002: 0xCBAC, 7003: 0xCBAD, 7004: 0xCBAE, 7005: 0xCBAF, 7006: 0xCBB0, 7007: 0xCBB1, 7008: 0xCBB2, 7009: 0xCBB3, 7010: 0xCBB4, 7011: 0xCBB5, 7012: 0xCBB6, 7013: 0xCBB7, 7014: 0xCBB9, 7015: 0xCBBA, 7016: 0xCBBB, 7017: 0xCBBC, 7018: 0xCBBD, 7019: 0xCBBE, 7020: 0xCBBF, 7021: 0xCBC0, 7022: 0xCBC1, 7023: 0xCBC2, 7024: 0xCBC3, 7025: 0xCBC4, 7026: 0x00C6, 7027: 0x00D0, 7028: 0x00AA, 7029: 0x0126, 7031: 0x0132, 7033: 0x013F, 7034: 0x0141, 7035: 0x00D8, 7036: 0x0152, 7037: 0x00BA, 7038: 0x00DE, 7039: 0x0166, 7040: 0x014A, 7042: 0x3260, 7043: 0x3261, 7044: 0x3262, 7045: 0x3263, 7046: 0x3264, 7047: 0x3265, 7048: 0x3266, 7049: 0x3267, 7050: 0x3268, 7051: 0x3269, 7052: 0x326A, 7053: 0x326B, 7054: 0x326C, 7055: 0x326D, 7056: 0x326E, 7057: 0x326F, 7058: 0x3270, 7059: 0x3271, 7060: 0x3272, 7061: 0x3273, 7062: 0x3274, 7063: 0x3275, 7064: 0x3276, 7065: 0x3277, 7066: 0x3278, 7067: 0x3279, 7068: 0x327A, 7069: 0x327B, 7070: 0x24D0, 7071: 0x24D1, 7072: 0x24D2, 7073: 0x24D3, 7074: 0x24D4, 7075: 0x24D5, 7076: 0x24D6, 7077: 0x24D7, 7078: 0x24D8, 7079: 0x24D9, 7080: 0x24DA, 7081: 0x24DB, 7082: 0x24DC, 7083: 0x24DD, 7084: 0x24DE, 7085: 0x24DF, 7086: 0x24E0, 7087: 0x24E1, 7088: 0x24E2, 7089: 0x24E3, 7090: 0x24E4, 7091: 0x24E5, 7092: 0x24E6, 7093: 0x24E7, 7094: 0x24E8, 7095: 0x24E9, 7096: 0x2460, 7097: 0x2461, 7098: 0x2462, 7099: 0x2463, 7100: 0x2464, 7101: 0x2465, 7102: 0x2466, 7103: 0x2467, 7104: 0x2468, 7105: 0x2469, 7106: 0x246A, 7107: 0x246B, 7108: 0x246C, 7109: 0x246D, 7110: 0x246E, 7111: 0x00BD, 7112: 0x2153, 7113: 0x2154, 7114: 0x00BC, 7115: 0x00BE, 7116: 0x215B, 7117: 0x215C, 7118: 0x215D, 7119: 0x215E, 7120: 0xCBC5, 7121: 0xCBC6, 7122: 0xCBC7, 7123: 0xCBC8, 7124: 0xCBC9, 7125: 0xCBCA, 7126: 0xCBCB, 7127: 0xCBCC, 7128: 0xCBCD, 7129: 0xCBCE, 7130: 0xCBCF, 7131: 0xCBD0, 7132: 0xCBD1, 7133: 0xCBD2, 7134: 0xCBD3, 7135: 0xCBD5, 7136: 0xCBD6, 7137: 0xCBD7, 7138: 0xCBD8, 7139: 0xCBD9, 7140: 0xCBDA, 7141: 0xCBDB, 7142: 0xCBDC, 7143: 0xCBDD, 7144: 0xCBDE, 7145: 0xCBDF, 7146: 0xCBE0, 7147: 0xCBE1, 7148: 0xCBE2, 7149: 0xCBE3, 7150: 0xCBE5, 7151: 0xCBE6, 7152: 0xCBE8, 7153: 0xCBEA, 7154: 0xCBEB, 7155: 0xCBEC, 7156: 0xCBED, 7157: 0xCBEE, 7158: 0xCBEF, 7159: 0xCBF0, 7160: 0xCBF1, 7161: 0xCBF2, 7162: 0xCBF3, 7163: 0xCBF4, 7164: 0xCBF5, 7165: 0xCBF6, 7166: 0xCBF7, 7167: 0xCBF8, 7168: 0xCBF9, 7169: 0xCBFA, 7170: 0xCBFB, 7171: 0xCBFC, 7172: 0xCBFD, 7173: 0xCBFE, 7174: 0xCBFF, 7175: 0xCC00, 7176: 0xCC01, 7177: 0xCC02, 7178: 0xCC03, 7179: 0xCC04, 7180: 0xCC05, 7181: 0xCC06, 7182: 0xCC07, 7183: 0xCC08, 7184: 0xCC09, 7185: 0xCC0A, 7186: 0xCC0B, 7187: 0xCC0E, 7188: 0xCC0F, 7189: 0xCC11, 7190: 0xCC12, 7191: 0xCC13, 7192: 0xCC15, 7193: 0xCC16, 7194: 0xCC17, 7195: 0xCC18, 7196: 0xCC19, 7197: 0xCC1A, 7198: 0xCC1B, 7199: 0xCC1E, 7200: 0xCC1F, 7201: 0xCC20, 7202: 0xCC23, 7203: 0xCC24, 7204: 0x00E6, 7205: 0x0111, 7206: 0x00F0, 7207: 0x0127, 7208: 0x0131, 7209: 0x0133, 7210: 0x0138, 7211: 0x0140, 7212: 0x0142, 7213: 0x00F8, 7214: 0x0153, 7215: 0x00DF, 7216: 0x00FE, 7217: 0x0167, 7218: 0x014B, 7219: 0x0149, 7220: 0x3200, 7221: 0x3201, 7222: 0x3202, 7223: 0x3203, 7224: 0x3204, 7225: 0x3205, 7226: 0x3206, 7227: 0x3207, 7228: 0x3208, 7229: 0x3209, 7230: 0x320A, 7231: 0x320B, 7232: 0x320C, 7233: 0x320D, 7234: 0x320E, 7235: 0x320F, 7236: 0x3210, 7237: 0x3211, 7238: 0x3212, 7239: 0x3213, 7240: 0x3214, 7241: 0x3215, 7242: 0x3216, 7243: 0x3217, 7244: 0x3218, 7245: 0x3219, 7246: 0x321A, 7247: 0x321B, 7248: 0x249C, 7249: 0x249D, 7250: 0x249E, 7251: 0x249F, 7252: 0x24A0, 7253: 0x24A1, 7254: 0x24A2, 7255: 0x24A3, 7256: 0x24A4, 7257: 0x24A5, 7258: 0x24A6, 7259: 0x24A7, 7260: 0x24A8, 7261: 0x24A9, 7262: 0x24AA, 7263: 0x24AB, 7264: 0x24AC, 7265: 0x24AD, 7266: 0x24AE, 7267: 0x24AF, 7268: 0x24B0, 7269: 0x24B1, 7270: 0x24B2, 7271: 0x24B3, 7272: 0x24B4, 7273: 0x24B5, 7274: 0x2474, 7275: 0x2475, 7276: 0x2476, 7277: 0x2477, 7278: 0x2478, 7279: 0x2479, 7280: 0x247A, 7281: 0x247B, 7282: 0x247C, 7283: 0x247D, 7284: 0x247E, 7285: 0x247F, 7286: 0x2480, 7287: 0x2481, 7288: 0x2482, 7289: 0x00B9, 7290: 0x00B2, 7291: 0x00B3, 7292: 0x2074, 7293: 0x207F, 7294: 0x2081, 7295: 0x2082, 7296: 0x2083, 7297: 0x2084, 7298: 0xCC25, 7299: 0xCC26, 7300: 0xCC2A, 7301: 0xCC2B, 7302: 0xCC2D, 7303: 0xCC2F, 7304: 0xCC31, 7305: 0xCC32, 7306: 0xCC33, 7307: 0xCC34, 7308: 0xCC35, 7309: 0xCC36, 7310: 0xCC37, 7311: 0xCC3A, 7312: 0xCC3F, 7313: 0xCC40, 7314: 0xCC41, 7315: 0xCC42, 7316: 0xCC43, 7317: 0xCC46, 7318: 0xCC47, 7319: 0xCC49, 7320: 0xCC4A, 7321: 0xCC4B, 7322: 0xCC4D, 7323: 0xCC4E, 7324: 0xCC4F, 7325: 0xCC50, 7326: 0xCC51, 7327: 0xCC52, 7328: 0xCC53, 7329: 0xCC56, 7330: 0xCC5A, 7331: 0xCC5B, 7332: 0xCC5C, 7333: 0xCC5D, 7334: 0xCC5E, 7335: 0xCC5F, 7336: 0xCC61, 7337: 0xCC62, 7338: 0xCC63, 7339: 0xCC65, 7340: 0xCC67, 7341: 0xCC69, 7342: 0xCC6A, 7343: 0xCC6B, 7344: 0xCC6C, 7345: 0xCC6D, 7346: 0xCC6E, 7347: 0xCC6F, 7348: 0xCC71, 7349: 0xCC72, 7350: 0xCC73, 7351: 0xCC74, 7352: 0xCC76, 7353: 0xCC77, 7354: 0xCC78, 7355: 0xCC79, 7356: 0xCC7A, 7357: 0xCC7B, 7358: 0xCC7C, 7359: 0xCC7D, 7360: 0xCC7E, 7361: 0xCC7F, 7362: 0xCC80, 7363: 0xCC81, 7364: 0xCC82, 7365: 0xCC83, 7366: 0xCC84, 7367: 0xCC85, 7368: 0xCC86, 7369: 0xCC87, 7370: 0xCC88, 7371: 0xCC89, 7372: 0xCC8A, 7373: 0xCC8B, 7374: 0xCC8C, 7375: 0xCC8D, 7376: 0xCC8E, 7377: 0xCC8F, 7378: 0xCC90, 7379: 0xCC91, 7380: 0xCC92, 7381: 0xCC93, 7382: 0x3041, 7383: 0x3042, 7384: 0x3043, 7385: 0x3044, 7386: 0x3045, 7387: 0x3046, 7388: 0x3047, 7389: 0x3048, 7390: 0x3049, 7391: 0x304A, 7392: 0x304B, 7393: 0x304C, 7394: 0x304D, 7395: 0x304E, 7396: 0x304F, 7397: 0x3050, 7398: 0x3051, 7399: 0x3052, 7400: 0x3053, 7401: 0x3054, 7402: 0x3055, 7403: 0x3056, 7404: 0x3057, 7405: 0x3058, 7406: 0x3059, 7407: 0x305A, 7408: 0x305B, 7409: 0x305C, 7410: 0x305D, 7411: 0x305E, 7412: 0x305F, 7413: 0x3060, 7414: 0x3061, 7415: 0x3062, 7416: 0x3063, 7417: 0x3064, 7418: 0x3065, 7419: 0x3066, 7420: 0x3067, 7421: 0x3068, 7422: 0x3069, 7423: 0x306A, 7424: 0x306B, 7425: 0x306C, 7426: 0x306D, 7427: 0x306E, 7428: 0x306F, 7429: 0x3070, 7430: 0x3071, 7431: 0x3072, 7432: 0x3073, 7433: 0x3074, 7434: 0x3075, 7435: 0x3076, 7436: 0x3077, 7437: 0x3078, 7438: 0x3079, 7439: 0x307A, 7440: 0x307B, 7441: 0x307C, 7442: 0x307D, 7443: 0x307E, 7444: 0x307F, 7445: 0x3080, 7446: 0x3081, 7447: 0x3082, 7448: 0x3083, 7449: 0x3084, 7450: 0x3085, 7451: 0x3086, 7452: 0x3087, 7453: 0x3088, 7454: 0x3089, 7455: 0x308A, 7456: 0x308B, 7457: 0x308C, 7458: 0x308D, 7459: 0x308E, 7460: 0x308F, 7461: 0x3090, 7462: 0x3091, 7463: 0x3092, 7464: 0x3093, 7476: 0xCC94, 7477: 0xCC95, 7478: 0xCC96, 7479: 0xCC97, 7480: 0xCC9A, 7481: 0xCC9B, 7482: 0xCC9D, 7483: 0xCC9E, 7484: 0xCC9F, 7485: 0xCCA1, 7486: 0xCCA2, 7487: 0xCCA3, 7488: 0xCCA4, 7489: 0xCCA5, 7490: 0xCCA6, 7491: 0xCCA7, 7492: 0xCCAA, 7493: 0xCCAE, 7494: 0xCCAF, 7495: 0xCCB0, 7496: 0xCCB1, 7497: 0xCCB2, 7498: 0xCCB3, 7499: 0xCCB6, 7500: 0xCCB7, 7501: 0xCCB9, 7502: 0xCCBA, 7503: 0xCCBB, 7504: 0xCCBD, 7505: 0xCCBE, 7506: 0xCCBF, 7507: 0xCCC0, 7508: 0xCCC1, 7509: 0xCCC2, 7510: 0xCCC3, 7511: 0xCCC6, 7512: 0xCCC8, 7513: 0xCCCA, 7514: 0xCCCB, 7515: 0xCCCC, 7516: 0xCCCD, 7517: 0xCCCE, 7518: 0xCCCF, 7519: 0xCCD1, 7520: 0xCCD2, 7521: 0xCCD3, 7522: 0xCCD5, 7523: 0xCCD6, 7524: 0xCCD7, 7525: 0xCCD8, 7526: 0xCCD9, 7527: 0xCCDA, 7528: 0xCCDB, 7529: 0xCCDC, 7530: 0xCCDD, 7531: 0xCCDE, 7532: 0xCCDF, 7533: 0xCCE0, 7534: 0xCCE1, 7535: 0xCCE2, 7536: 0xCCE3, 7537: 0xCCE5, 7538: 0xCCE6, 7539: 0xCCE7, 7540: 0xCCE8, 7541: 0xCCE9, 7542: 0xCCEA, 7543: 0xCCEB, 7544: 0xCCED, 7545: 0xCCEE, 7546: 0xCCEF, 7547: 0xCCF1, 7548: 0xCCF2, 7549: 0xCCF3, 7550: 0xCCF4, 7551: 0xCCF5, 7552: 0xCCF6, 7553: 0xCCF7, 7554: 0xCCF8, 7555: 0xCCF9, 7556: 0xCCFA, 7557: 0xCCFB, 7558: 0xCCFC, 7559: 0xCCFD, 7560: 0x30A1, 7561: 0x30A2, 7562: 0x30A3, 7563: 0x30A4, 7564: 0x30A5, 7565: 0x30A6, 7566: 0x30A7, 7567: 0x30A8, 7568: 0x30A9, 7569: 0x30AA, 7570: 0x30AB, 7571: 0x30AC, 7572: 0x30AD, 7573: 0x30AE, 7574: 0x30AF, 7575: 0x30B0, 7576: 0x30B1, 7577: 0x30B2, 7578: 0x30B3, 7579: 0x30B4, 7580: 0x30B5, 7581: 0x30B6, 7582: 0x30B7, 7583: 0x30B8, 7584: 0x30B9, 7585: 0x30BA, 7586: 0x30BB, 7587: 0x30BC, 7588: 0x30BD, 7589: 0x30BE, 7590: 0x30BF, 7591: 0x30C0, 7592: 0x30C1, 7593: 0x30C2, 7594: 0x30C3, 7595: 0x30C4, 7596: 0x30C5, 7597: 0x30C6, 7598: 0x30C7, 7599: 0x30C8, 7600: 0x30C9, 7601: 0x30CA, 7602: 0x30CB, 7603: 0x30CC, 7604: 0x30CD, 7605: 0x30CE, 7606: 0x30CF, 7607: 0x30D0, 7608: 0x30D1, 7609: 0x30D2, 7610: 0x30D3, 7611: 0x30D4, 7612: 0x30D5, 7613: 0x30D6, 7614: 0x30D7, 7615: 0x30D8, 7616: 0x30D9, 7617: 0x30DA, 7618: 0x30DB, 7619: 0x30DC, 7620: 0x30DD, 7621: 0x30DE, 7622: 0x30DF, 7623: 0x30E0, 7624: 0x30E1, 7625: 0x30E2, 7626: 0x30E3, 7627: 0x30E4, 7628: 0x30E5, 7629: 0x30E6, 7630: 0x30E7, 7631: 0x30E8, 7632: 0x30E9, 7633: 0x30EA, 7634: 0x30EB, 7635: 0x30EC, 7636: 0x30ED, 7637: 0x30EE, 7638: 0x30EF, 7639: 0x30F0, 7640: 0x30F1, 7641: 0x30F2, 7642: 0x30F3, 7643: 0x30F4, 7644: 0x30F5, 7645: 0x30F6, 7654: 0xCCFE, 7655: 0xCCFF, 7656: 0xCD00, 7657: 0xCD02, 7658: 0xCD03, 7659: 0xCD04, 7660: 0xCD05, 7661: 0xCD06, 7662: 0xCD07, 7663: 0xCD0A, 7664: 0xCD0B, 7665: 0xCD0D, 7666: 0xCD0E, 7667: 0xCD0F, 7668: 0xCD11, 7669: 0xCD12, 7670: 0xCD13, 7671: 0xCD14, 7672: 0xCD15, 7673: 0xCD16, 7674: 0xCD17, 7675: 0xCD1A, 7676: 0xCD1C, 7677: 0xCD1E, 7678: 0xCD1F, 7679: 0xCD20, 7680: 0xCD21, 7681: 0xCD22, 7682: 0xCD23, 7683: 0xCD25, 7684: 0xCD26, 7685: 0xCD27, 7686: 0xCD29, 7687: 0xCD2A, 7688: 0xCD2B, 7689: 0xCD2D, 7690: 0xCD2E, 7691: 0xCD2F, 7692: 0xCD30, 7693: 0xCD31, 7694: 0xCD32, 7695: 0xCD33, 7696: 0xCD34, 7697: 0xCD35, 7698: 0xCD36, 7699: 0xCD37, 7700: 0xCD38, 7701: 0xCD3A, 7702: 0xCD3B, 7703: 0xCD3C, 7704: 0xCD3D, 7705: 0xCD3E, 7706: 0xCD3F, 7707: 0xCD40, 7708: 0xCD41, 7709: 0xCD42, 7710: 0xCD43, 7711: 0xCD44, 7712: 0xCD45, 7713: 0xCD46, 7714: 0xCD47, 7715: 0xCD48, 7716: 0xCD49, 7717: 0xCD4A, 7718: 0xCD4B, 7719: 0xCD4C, 7720: 0xCD4D, 7721: 0xCD4E, 7722: 0xCD4F, 7723: 0xCD50, 7724: 0xCD51, 7725: 0xCD52, 7726: 0xCD53, 7727: 0xCD54, 7728: 0xCD55, 7729: 0xCD56, 7730: 0xCD57, 7731: 0xCD58, 7732: 0xCD59, 7733: 0xCD5A, 7734: 0xCD5B, 7735: 0xCD5D, 7736: 0xCD5E, 7737: 0xCD5F, 7738: 0x0410, 7739: 0x0411, 7740: 0x0412, 7741: 0x0413, 7742: 0x0414, 7743: 0x0415, 7744: 0x0401, 7745: 0x0416, 7746: 0x0417, 7747: 0x0418, 7748: 0x0419, 7749: 0x041A, 7750: 0x041B, 7751: 0x041C, 7752: 0x041D, 7753: 0x041E, 7754: 0x041F, 7755: 0x0420, 7756: 0x0421, 7757: 0x0422, 7758: 0x0423, 7759: 0x0424, 7760: 0x0425, 7761: 0x0426, 7762: 0x0427, 7763: 0x0428, 7764: 0x0429, 7765: 0x042A, 7766: 0x042B, 7767: 0x042C, 7768: 0x042D, 7769: 0x042E, 7770: 0x042F, 7786: 0x0430, 7787: 0x0431, 7788: 0x0432, 7789: 0x0433, 7790: 0x0434, 7791: 0x0435, 7792: 0x0451, 7793: 0x0436, 7794: 0x0437, 7795: 0x0438, 7796: 0x0439, 7797: 0x043A, 7798: 0x043B, 7799: 0x043C, 7800: 0x043D, 7801: 0x043E, 7802: 0x043F, 7803: 0x0440, 7804: 0x0441, 7805: 0x0442, 7806: 0x0443, 7807: 0x0444, 7808: 0x0445, 7809: 0x0446, 7810: 0x0447, 7811: 0x0448, 7812: 0x0449, 7813: 0x044A, 7814: 0x044B, 7815: 0x044C, 7816: 0x044D, 7817: 0x044E, 7818: 0x044F, 7832: 0xCD61, 7833: 0xCD62, 7834: 0xCD63, 7835: 0xCD65, 7836: 0xCD66, 7837: 0xCD67, 7838: 0xCD68, 7839: 0xCD69, 7840: 0xCD6A, 7841: 0xCD6B, 7842: 0xCD6E, 7843: 0xCD70, 7844: 0xCD72, 7845: 0xCD73, 7846: 0xCD74, 7847: 0xCD75, 7848: 0xCD76, 7849: 0xCD77, 7850: 0xCD79, 7851: 0xCD7A, 7852: 0xCD7B, 7853: 0xCD7C, 7854: 0xCD7D, 7855: 0xCD7E, 7856: 0xCD7F, 7857: 0xCD80, 7858: 0xCD81, 7859: 0xCD82, 7860: 0xCD83, 7861: 0xCD84, 7862: 0xCD85, 7863: 0xCD86, 7864: 0xCD87, 7865: 0xCD89, 7866: 0xCD8A, 7867: 0xCD8B, 7868: 0xCD8C, 7869: 0xCD8D, 7870: 0xCD8E, 7871: 0xCD8F, 7872: 0xCD90, 7873: 0xCD91, 7874: 0xCD92, 7875: 0xCD93, 7876: 0xCD96, 7877: 0xCD97, 7878: 0xCD99, 7879: 0xCD9A, 7880: 0xCD9B, 7881: 0xCD9D, 7882: 0xCD9E, 7883: 0xCD9F, 7884: 0xCDA0, 7885: 0xCDA1, 7886: 0xCDA2, 7887: 0xCDA3, 7888: 0xCDA6, 7889: 0xCDA8, 7890: 0xCDAA, 7891: 0xCDAB, 7892: 0xCDAC, 7893: 0xCDAD, 7894: 0xCDAE, 7895: 0xCDAF, 7896: 0xCDB1, 7897: 0xCDB2, 7898: 0xCDB3, 7899: 0xCDB4, 7900: 0xCDB5, 7901: 0xCDB6, 7902: 0xCDB7, 7903: 0xCDB8, 7904: 0xCDB9, 7905: 0xCDBA, 7906: 0xCDBB, 7907: 0xCDBC, 7908: 0xCDBD, 7909: 0xCDBE, 7910: 0xCDBF, 7911: 0xCDC0, 7912: 0xCDC1, 7913: 0xCDC2, 7914: 0xCDC3, 7915: 0xCDC5, 8010: 0xCDC6, 8011: 0xCDC7, 8012: 0xCDC8, 8013: 0xCDC9, 8014: 0xCDCA, 8015: 0xCDCB, 8016: 0xCDCD, 8017: 0xCDCE, 8018: 0xCDCF, 8019: 0xCDD1, 8020: 0xCDD2, 8021: 0xCDD3, 8022: 0xCDD4, 8023: 0xCDD5, 8024: 0xCDD6, 8025: 0xCDD7, 8026: 0xCDD8, 8027: 0xCDD9, 8028: 0xCDDA, 8029: 0xCDDB, 8030: 0xCDDC, 8031: 0xCDDD, 8032: 0xCDDE, 8033: 0xCDDF, 8034: 0xCDE0, 8035: 0xCDE1, 8036: 0xCDE2, 8037: 0xCDE3, 8038: 0xCDE4, 8039: 0xCDE5, 8040: 0xCDE6, 8041: 0xCDE7, 8042: 0xCDE9, 8043: 0xCDEA, 8044: 0xCDEB, 8045: 0xCDED, 8046: 0xCDEE, 8047: 0xCDEF, 8048: 0xCDF1, 8049: 0xCDF2, 8050: 0xCDF3, 8051: 0xCDF4, 8052: 0xCDF5, 8053: 0xCDF6, 8054: 0xCDF7, 8055: 0xCDFA, 8056: 0xCDFC, 8057: 0xCDFE, 8058: 0xCDFF, 8059: 0xCE00, 8060: 0xCE01, 8061: 0xCE02, 8062: 0xCE03, 8063: 0xCE05, 8064: 0xCE06, 8065: 0xCE07, 8066: 0xCE09, 8067: 0xCE0A, 8068: 0xCE0B, 8069: 0xCE0D, 8070: 0xCE0E, 8071: 0xCE0F, 8072: 0xCE10, 8073: 0xCE11, 8074: 0xCE12, 8075: 0xCE13, 8076: 0xCE15, 8077: 0xCE16, 8078: 0xCE17, 8079: 0xCE18, 8080: 0xCE1A, 8081: 0xCE1B, 8082: 0xCE1C, 8083: 0xCE1D, 8084: 0xCE1E, 8085: 0xCE1F, 8086: 0xCE22, 8087: 0xCE23, 8088: 0xCE25, 8089: 0xCE26, 8090: 0xCE27, 8091: 0xCE29, 8092: 0xCE2A, 8093: 0xCE2B, 8188: 0xCE2C, 8189: 0xCE2D, 8190: 0xCE2E, 8191: 0xCE2F, 8192: 0xCE32, 8193: 0xCE34, 8194: 0xCE36, 8195: 0xCE37, 8196: 0xCE38, 8197: 0xCE39, 8198: 0xCE3A, 8199: 0xCE3B, 8200: 0xCE3C, 8201: 0xCE3D, 8202: 0xCE3E, 8203: 0xCE3F, 8204: 0xCE40, 8205: 0xCE41, 8206: 0xCE42, 8207: 0xCE43, 8208: 0xCE44, 8209: 0xCE45, 8210: 0xCE46, 8211: 0xCE47, 8212: 0xCE48, 8213: 0xCE49, 8214: 0xCE4A, 8215: 0xCE4B, 8216: 0xCE4C, 8217: 0xCE4D, 8218: 0xCE4E, 8219: 0xCE4F, 8220: 0xCE50, 8221: 0xCE51, 8222: 0xCE52, 8223: 0xCE53, 8224: 0xCE54, 8225: 0xCE55, 8226: 0xCE56, 8227: 0xCE57, 8228: 0xCE5A, 8229: 0xCE5B, 8230: 0xCE5D, 8231: 0xCE5E, 8232: 0xCE62, 8233: 0xCE63, 8234: 0xCE64, 8235: 0xCE65, 8236: 0xCE66, 8237: 0xCE67, 8238: 0xCE6A, 8239: 0xCE6C, 8240: 0xCE6E, 8241: 0xCE6F, 8242: 0xCE70, 8243: 0xCE71, 8244: 0xCE72, 8245: 0xCE73, 8246: 0xCE76, 8247: 0xCE77, 8248: 0xCE79, 8249: 0xCE7A, 8250: 0xCE7B, 8251: 0xCE7D, 8252: 0xCE7E, 8253: 0xCE7F, 8254: 0xCE80, 8255: 0xCE81, 8256: 0xCE82, 8257: 0xCE83, 8258: 0xCE86, 8259: 0xCE88, 8260: 0xCE8A, 8261: 0xCE8B, 8262: 0xCE8C, 8263: 0xCE8D, 8264: 0xCE8E, 8265: 0xCE8F, 8266: 0xCE92, 8267: 0xCE93, 8268: 0xCE95, 8269: 0xCE96, 8270: 0xCE97, 8271: 0xCE99, 8366: 0xCE9A, 8367: 0xCE9B, 8368: 0xCE9C, 8369: 0xCE9D, 8370: 0xCE9E, 8371: 0xCE9F, 8372: 0xCEA2, 8373: 0xCEA6, 8374: 0xCEA7, 8375: 0xCEA8, 8376: 0xCEA9, 8377: 0xCEAA, 8378: 0xCEAB, 8379: 0xCEAE, 8380: 0xCEAF, 8381: 0xCEB0, 8382: 0xCEB1, 8383: 0xCEB2, 8384: 0xCEB3, 8385: 0xCEB4, 8386: 0xCEB5, 8387: 0xCEB6, 8388: 0xCEB7, 8389: 0xCEB8, 8390: 0xCEB9, 8391: 0xCEBA, 8392: 0xCEBB, 8393: 0xCEBC, 8394: 0xCEBD, 8395: 0xCEBE, 8396: 0xCEBF, 8397: 0xCEC0, 8398: 0xCEC2, 8399: 0xCEC3, 8400: 0xCEC4, 8401: 0xCEC5, 8402: 0xCEC6, 8403: 0xCEC7, 8404: 0xCEC8, 8405: 0xCEC9, 8406: 0xCECA, 8407: 0xCECB, 8408: 0xCECC, 8409: 0xCECD, 8410: 0xCECE, 8411: 0xCECF, 8412: 0xCED0, 8413: 0xCED1, 8414: 0xCED2, 8415: 0xCED3, 8416: 0xCED4, 8417: 0xCED5, 8418: 0xCED6, 8419: 0xCED7, 8420: 0xCED8, 8421: 0xCED9, 8422: 0xCEDA, 8423: 0xCEDB, 8424: 0xCEDC, 8425: 0xCEDD, 8426: 0xCEDE, 8427: 0xCEDF, 8428: 0xCEE0, 8429: 0xCEE1, 8430: 0xCEE2, 8431: 0xCEE3, 8432: 0xCEE6, 8433: 0xCEE7, 8434: 0xCEE9, 8435: 0xCEEA, 8436: 0xCEED, 8437: 0xCEEE, 8438: 0xCEEF, 8439: 0xCEF0, 8440: 0xCEF1, 8441: 0xCEF2, 8442: 0xCEF3, 8443: 0xCEF6, 8444: 0xCEFA, 8445: 0xCEFB, 8446: 0xCEFC, 8447: 0xCEFD, 8448: 0xCEFE, 8449: 0xCEFF, 8450: 0xAC00, 8451: 0xAC01, 8452: 0xAC04, 8453: 0xAC07, 8454: 0xAC08, 8455: 0xAC09, 8456: 0xAC0A, 8457: 0xAC10, 8458: 0xAC11, 8459: 0xAC12, 8460: 0xAC13, 8461: 0xAC14, 8462: 0xAC15, 8463: 0xAC16, 8464: 0xAC17, 8465: 0xAC19, 8466: 0xAC1A, 8467: 0xAC1B, 8468: 0xAC1C, 8469: 0xAC1D, 8470: 0xAC20, 8471: 0xAC24, 8472: 0xAC2C, 8473: 0xAC2D, 8474: 0xAC2F, 8475: 0xAC30, 8476: 0xAC31, 8477: 0xAC38, 8478: 0xAC39, 8479: 0xAC3C, 8480: 0xAC40, 8481: 0xAC4B, 8482: 0xAC4D, 8483: 0xAC54, 8484: 0xAC58, 8485: 0xAC5C, 8486: 0xAC70, 8487: 0xAC71, 8488: 0xAC74, 8489: 0xAC77, 8490: 0xAC78, 8491: 0xAC7A, 8492: 0xAC80, 8493: 0xAC81, 8494: 0xAC83, 8495: 0xAC84, 8496: 0xAC85, 8497: 0xAC86, 8498: 0xAC89, 8499: 0xAC8A, 8500: 0xAC8B, 8501: 0xAC8C, 8502: 0xAC90, 8503: 0xAC94, 8504: 0xAC9C, 8505: 0xAC9D, 8506: 0xAC9F, 8507: 0xACA0, 8508: 0xACA1, 8509: 0xACA8, 8510: 0xACA9, 8511: 0xACAA, 8512: 0xACAC, 8513: 0xACAF, 8514: 0xACB0, 8515: 0xACB8, 8516: 0xACB9, 8517: 0xACBB, 8518: 0xACBC, 8519: 0xACBD, 8520: 0xACC1, 8521: 0xACC4, 8522: 0xACC8, 8523: 0xACCC, 8524: 0xACD5, 8525: 0xACD7, 8526: 0xACE0, 8527: 0xACE1, 8528: 0xACE4, 8529: 0xACE7, 8530: 0xACE8, 8531: 0xACEA, 8532: 0xACEC, 8533: 0xACEF, 8534: 0xACF0, 8535: 0xACF1, 8536: 0xACF3, 8537: 0xACF5, 8538: 0xACF6, 8539: 0xACFC, 8540: 0xACFD, 8541: 0xAD00, 8542: 0xAD04, 8543: 0xAD06, 8544: 0xCF02, 8545: 0xCF03, 8546: 0xCF05, 8547: 0xCF06, 8548: 0xCF07, 8549: 0xCF09, 8550: 0xCF0A, 8551: 0xCF0B, 8552: 0xCF0C, 8553: 0xCF0D, 8554: 0xCF0E, 8555: 0xCF0F, 8556: 0xCF12, 8557: 0xCF14, 8558: 0xCF16, 8559: 0xCF17, 8560: 0xCF18, 8561: 0xCF19, 8562: 0xCF1A, 8563: 0xCF1B, 8564: 0xCF1D, 8565: 0xCF1E, 8566: 0xCF1F, 8567: 0xCF21, 8568: 0xCF22, 8569: 0xCF23, 8570: 0xCF25, 8571: 0xCF26, 8572: 0xCF27, 8573: 0xCF28, 8574: 0xCF29, 8575: 0xCF2A, 8576: 0xCF2B, 8577: 0xCF2E, 8578: 0xCF32, 8579: 0xCF33, 8580: 0xCF34, 8581: 0xCF35, 8582: 0xCF36, 8583: 0xCF37, 8584: 0xCF39, 8585: 0xCF3A, 8586: 0xCF3B, 8587: 0xCF3C, 8588: 0xCF3D, 8589: 0xCF3E, 8590: 0xCF3F, 8591: 0xCF40, 8592: 0xCF41, 8593: 0xCF42, 8594: 0xCF43, 8595: 0xCF44, 8596: 0xCF45, 8597: 0xCF46, 8598: 0xCF47, 8599: 0xCF48, 8600: 0xCF49, 8601: 0xCF4A, 8602: 0xCF4B, 8603: 0xCF4C, 8604: 0xCF4D, 8605: 0xCF4E, 8606: 0xCF4F, 8607: 0xCF50, 8608: 0xCF51, 8609: 0xCF52, 8610: 0xCF53, 8611: 0xCF56, 8612: 0xCF57, 8613: 0xCF59, 8614: 0xCF5A, 8615: 0xCF5B, 8616: 0xCF5D, 8617: 0xCF5E, 8618: 0xCF5F, 8619: 0xCF60, 8620: 0xCF61, 8621: 0xCF62, 8622: 0xCF63, 8623: 0xCF66, 8624: 0xCF68, 8625: 0xCF6A, 8626: 0xCF6B, 8627: 0xCF6C, 8628: 0xAD0C, 8629: 0xAD0D, 8630: 0xAD0F, 8631: 0xAD11, 8632: 0xAD18, 8633: 0xAD1C, 8634: 0xAD20, 8635: 0xAD29, 8636: 0xAD2C, 8637: 0xAD2D, 8638: 0xAD34, 8639: 0xAD35, 8640: 0xAD38, 8641: 0xAD3C, 8642: 0xAD44, 8643: 0xAD45, 8644: 0xAD47, 8645: 0xAD49, 8646: 0xAD50, 8647: 0xAD54, 8648: 0xAD58, 8649: 0xAD61, 8650: 0xAD63, 8651: 0xAD6C, 8652: 0xAD6D, 8653: 0xAD70, 8654: 0xAD73, 8655: 0xAD74, 8656: 0xAD75, 8657: 0xAD76, 8658: 0xAD7B, 8659: 0xAD7C, 8660: 0xAD7D, 8661: 0xAD7F, 8662: 0xAD81, 8663: 0xAD82, 8664: 0xAD88, 8665: 0xAD89, 8666: 0xAD8C, 8667: 0xAD90, 8668: 0xAD9C, 8669: 0xAD9D, 8670: 0xADA4, 8671: 0xADB7, 8672: 0xADC0, 8673: 0xADC1, 8674: 0xADC4, 8675: 0xADC8, 8676: 0xADD0, 8677: 0xADD1, 8678: 0xADD3, 8679: 0xADDC, 8680: 0xADE0, 8681: 0xADE4, 8682: 0xADF8, 8683: 0xADF9, 8684: 0xADFC, 8685: 0xADFF, 8686: 0xAE00, 8687: 0xAE01, 8688: 0xAE08, 8689: 0xAE09, 8690: 0xAE0B, 8691: 0xAE0D, 8692: 0xAE14, 8693: 0xAE30, 8694: 0xAE31, 8695: 0xAE34, 8696: 0xAE37, 8697: 0xAE38, 8698: 0xAE3A, 8699: 0xAE40, 8700: 0xAE41, 8701: 0xAE43, 8702: 0xAE45, 8703: 0xAE46, 8704: 0xAE4A, 8705: 0xAE4C, 8706: 0xAE4D, 8707: 0xAE4E, 8708: 0xAE50, 8709: 0xAE54, 8710: 0xAE56, 8711: 0xAE5C, 8712: 0xAE5D, 8713: 0xAE5F, 8714: 0xAE60, 8715: 0xAE61, 8716: 0xAE65, 8717: 0xAE68, 8718: 0xAE69, 8719: 0xAE6C, 8720: 0xAE70, 8721: 0xAE78, 8722: 0xCF6D, 8723: 0xCF6E, 8724: 0xCF6F, 8725: 0xCF72, 8726: 0xCF73, 8727: 0xCF75, 8728: 0xCF76, 8729: 0xCF77, 8730: 0xCF79, 8731: 0xCF7A, 8732: 0xCF7B, 8733: 0xCF7C, 8734: 0xCF7D, 8735: 0xCF7E, 8736: 0xCF7F, 8737: 0xCF81, 8738: 0xCF82, 8739: 0xCF83, 8740: 0xCF84, 8741: 0xCF86, 8742: 0xCF87, 8743: 0xCF88, 8744: 0xCF89, 8745: 0xCF8A, 8746: 0xCF8B, 8747: 0xCF8D, 8748: 0xCF8E, 8749: 0xCF8F, 8750: 0xCF90, 8751: 0xCF91, 8752: 0xCF92, 8753: 0xCF93, 8754: 0xCF94, 8755: 0xCF95, 8756: 0xCF96, 8757: 0xCF97, 8758: 0xCF98, 8759: 0xCF99, 8760: 0xCF9A, 8761: 0xCF9B, 8762: 0xCF9C, 8763: 0xCF9D, 8764: 0xCF9E, 8765: 0xCF9F, 8766: 0xCFA0, 8767: 0xCFA2, 8768: 0xCFA3, 8769: 0xCFA4, 8770: 0xCFA5, 8771: 0xCFA6, 8772: 0xCFA7, 8773: 0xCFA9, 8774: 0xCFAA, 8775: 0xCFAB, 8776: 0xCFAC, 8777: 0xCFAD, 8778: 0xCFAE, 8779: 0xCFAF, 8780: 0xCFB1, 8781: 0xCFB2, 8782: 0xCFB3, 8783: 0xCFB4, 8784: 0xCFB5, 8785: 0xCFB6, 8786: 0xCFB7, 8787: 0xCFB8, 8788: 0xCFB9, 8789: 0xCFBA, 8790: 0xCFBB, 8791: 0xCFBC, 8792: 0xCFBD, 8793: 0xCFBE, 8794: 0xCFBF, 8795: 0xCFC0, 8796: 0xCFC1, 8797: 0xCFC2, 8798: 0xCFC3, 8799: 0xCFC5, 8800: 0xCFC6, 8801: 0xCFC7, 8802: 0xCFC8, 8803: 0xCFC9, 8804: 0xCFCA, 8805: 0xCFCB, 8806: 0xAE79, 8807: 0xAE7B, 8808: 0xAE7C, 8809: 0xAE7D, 8810: 0xAE84, 8811: 0xAE85, 8812: 0xAE8C, 8813: 0xAEBC, 8814: 0xAEBD, 8815: 0xAEBE, 8816: 0xAEC0, 8817: 0xAEC4, 8818: 0xAECC, 8819: 0xAECD, 8820: 0xAECF, 8821: 0xAED0, 8822: 0xAED1, 8823: 0xAED8, 8824: 0xAED9, 8825: 0xAEDC, 8826: 0xAEE8, 8827: 0xAEEB, 8828: 0xAEED, 8829: 0xAEF4, 8830: 0xAEF8, 8831: 0xAEFC, 8832: 0xAF07, 8833: 0xAF08, 8834: 0xAF0D, 8835: 0xAF10, 8836: 0xAF2C, 8837: 0xAF2D, 8838: 0xAF30, 8839: 0xAF32, 8840: 0xAF34, 8841: 0xAF3C, 8842: 0xAF3D, 8843: 0xAF3F, 8844: 0xAF41, 8845: 0xAF42, 8846: 0xAF43, 8847: 0xAF48, 8848: 0xAF49, 8849: 0xAF50, 8850: 0xAF5C, 8851: 0xAF5D, 8852: 0xAF64, 8853: 0xAF65, 8854: 0xAF79, 8855: 0xAF80, 8856: 0xAF84, 8857: 0xAF88, 8858: 0xAF90, 8859: 0xAF91, 8860: 0xAF95, 8861: 0xAF9C, 8862: 0xAFB8, 8863: 0xAFB9, 8864: 0xAFBC, 8865: 0xAFC0, 8866: 0xAFC7, 8867: 0xAFC8, 8868: 0xAFC9, 8869: 0xAFCB, 8870: 0xAFCD, 8871: 0xAFCE, 8872: 0xAFD4, 8873: 0xAFDC, 8874: 0xAFE8, 8875: 0xAFE9, 8876: 0xAFF0, 8877: 0xAFF1, 8878: 0xAFF4, 8879: 0xAFF8, 8880: 0xB000, 8881: 0xB001, 8882: 0xB004, 8883: 0xB00C, 8884: 0xB010, 8885: 0xB014, 8886: 0xB01C, 8887: 0xB01D, 8888: 0xB028, 8889: 0xB044, 8890: 0xB045, 8891: 0xB048, 8892: 0xB04A, 8893: 0xB04C, 8894: 0xB04E, 8895: 0xB053, 8896: 0xB054, 8897: 0xB055, 8898: 0xB057, 8899: 0xB059, 8900: 0xCFCC, 8901: 0xCFCD, 8902: 0xCFCE, 8903: 0xCFCF, 8904: 0xCFD0, 8905: 0xCFD1, 8906: 0xCFD2, 8907: 0xCFD3, 8908: 0xCFD4, 8909: 0xCFD5, 8910: 0xCFD6, 8911: 0xCFD7, 8912: 0xCFD8, 8913: 0xCFD9, 8914: 0xCFDA, 8915: 0xCFDB, 8916: 0xCFDC, 8917: 0xCFDD, 8918: 0xCFDE, 8919: 0xCFDF, 8920: 0xCFE2, 8921: 0xCFE3, 8922: 0xCFE5, 8923: 0xCFE6, 8924: 0xCFE7, 8925: 0xCFE9, 8926: 0xCFEA, 8927: 0xCFEB, 8928: 0xCFEC, 8929: 0xCFED, 8930: 0xCFEE, 8931: 0xCFEF, 8932: 0xCFF2, 8933: 0xCFF4, 8934: 0xCFF6, 8935: 0xCFF7, 8936: 0xCFF8, 8937: 0xCFF9, 8938: 0xCFFA, 8939: 0xCFFB, 8940: 0xCFFD, 8941: 0xCFFE, 8942: 0xCFFF, 8943: 0xD001, 8944: 0xD002, 8945: 0xD003, 8946: 0xD005, 8947: 0xD006, 8948: 0xD007, 8949: 0xD008, 8950: 0xD009, 8951: 0xD00A, 8952: 0xD00B, 8953: 0xD00C, 8954: 0xD00D, 8955: 0xD00E, 8956: 0xD00F, 8957: 0xD010, 8958: 0xD012, 8959: 0xD013, 8960: 0xD014, 8961: 0xD015, 8962: 0xD016, 8963: 0xD017, 8964: 0xD019, 8965: 0xD01A, 8966: 0xD01B, 8967: 0xD01C, 8968: 0xD01D, 8969: 0xD01E, 8970: 0xD01F, 8971: 0xD020, 8972: 0xD021, 8973: 0xD022, 8974: 0xD023, 8975: 0xD024, 8976: 0xD025, 8977: 0xD026, 8978: 0xD027, 8979: 0xD028, 8980: 0xD029, 8981: 0xD02A, 8982: 0xD02B, 8983: 0xD02C, 8984: 0xB05D, 8985: 0xB07C, 8986: 0xB07D, 8987: 0xB080, 8988: 0xB084, 8989: 0xB08C, 8990: 0xB08D, 8991: 0xB08F, 8992: 0xB091, 8993: 0xB098, 8994: 0xB099, 8995: 0xB09A, 8996: 0xB09C, 8997: 0xB09F, 8998: 0xB0A0, 8999: 0xB0A1, 9000: 0xB0A2, 9001: 0xB0A8, 9002: 0xB0A9, 9003: 0xB0AB, 9004: 0xB0AC, 9005: 0xB0AD, 9006: 0xB0AE, 9007: 0xB0AF, 9008: 0xB0B1, 9009: 0xB0B3, 9010: 0xB0B4, 9011: 0xB0B5, 9012: 0xB0B8, 9013: 0xB0BC, 9014: 0xB0C4, 9015: 0xB0C5, 9016: 0xB0C7, 9017: 0xB0C8, 9018: 0xB0C9, 9019: 0xB0D0, 9020: 0xB0D1, 9021: 0xB0D4, 9022: 0xB0D8, 9023: 0xB0E0, 9024: 0xB0E5, 9025: 0xB108, 9026: 0xB109, 9027: 0xB10B, 9028: 0xB10C, 9029: 0xB110, 9030: 0xB112, 9031: 0xB113, 9032: 0xB118, 9033: 0xB119, 9034: 0xB11B, 9035: 0xB11C, 9036: 0xB11D, 9037: 0xB123, 9038: 0xB124, 9039: 0xB125, 9040: 0xB128, 9041: 0xB12C, 9042: 0xB134, 9043: 0xB135, 9044: 0xB137, 9045: 0xB138, 9046: 0xB139, 9047: 0xB140, 9048: 0xB141, 9049: 0xB144, 9050: 0xB148, 9051: 0xB150, 9052: 0xB151, 9053: 0xB154, 9054: 0xB155, 9055: 0xB158, 9056: 0xB15C, 9057: 0xB160, 9058: 0xB178, 9059: 0xB179, 9060: 0xB17C, 9061: 0xB180, 9062: 0xB182, 9063: 0xB188, 9064: 0xB189, 9065: 0xB18B, 9066: 0xB18D, 9067: 0xB192, 9068: 0xB193, 9069: 0xB194, 9070: 0xB198, 9071: 0xB19C, 9072: 0xB1A8, 9073: 0xB1CC, 9074: 0xB1D0, 9075: 0xB1D4, 9076: 0xB1DC, 9077: 0xB1DD, 9078: 0xD02E, 9079: 0xD02F, 9080: 0xD030, 9081: 0xD031, 9082: 0xD032, 9083: 0xD033, 9084: 0xD036, 9085: 0xD037, 9086: 0xD039, 9087: 0xD03A, 9088: 0xD03B, 9089: 0xD03D, 9090: 0xD03E, 9091: 0xD03F, 9092: 0xD040, 9093: 0xD041, 9094: 0xD042, 9095: 0xD043, 9096: 0xD046, 9097: 0xD048, 9098: 0xD04A, 9099: 0xD04B, 9100: 0xD04C, 9101: 0xD04D, 9102: 0xD04E, 9103: 0xD04F, 9104: 0xD051, 9105: 0xD052, 9106: 0xD053, 9107: 0xD055, 9108: 0xD056, 9109: 0xD057, 9110: 0xD059, 9111: 0xD05A, 9112: 0xD05B, 9113: 0xD05C, 9114: 0xD05D, 9115: 0xD05E, 9116: 0xD05F, 9117: 0xD061, 9118: 0xD062, 9119: 0xD063, 9120: 0xD064, 9121: 0xD065, 9122: 0xD066, 9123: 0xD067, 9124: 0xD068, 9125: 0xD069, 9126: 0xD06A, 9127: 0xD06B, 9128: 0xD06E, 9129: 0xD06F, 9130: 0xD071, 9131: 0xD072, 9132: 0xD073, 9133: 0xD075, 9134: 0xD076, 9135: 0xD077, 9136: 0xD078, 9137: 0xD079, 9138: 0xD07A, 9139: 0xD07B, 9140: 0xD07E, 9141: 0xD07F, 9142: 0xD080, 9143: 0xD082, 9144: 0xD083, 9145: 0xD084, 9146: 0xD085, 9147: 0xD086, 9148: 0xD087, 9149: 0xD088, 9150: 0xD089, 9151: 0xD08A, 9152: 0xD08B, 9153: 0xD08C, 9154: 0xD08D, 9155: 0xD08E, 9156: 0xD08F, 9157: 0xD090, 9158: 0xD091, 9159: 0xD092, 9160: 0xD093, 9161: 0xD094, 9162: 0xB1DF, 9163: 0xB1E8, 9164: 0xB1E9, 9165: 0xB1EC, 9166: 0xB1F0, 9167: 0xB1F9, 9168: 0xB1FB, 9169: 0xB1FD, 9170: 0xB204, 9171: 0xB205, 9172: 0xB208, 9173: 0xB20B, 9174: 0xB20C, 9175: 0xB214, 9176: 0xB215, 9177: 0xB217, 9178: 0xB219, 9179: 0xB220, 9180: 0xB234, 9181: 0xB23C, 9182: 0xB258, 9183: 0xB25C, 9184: 0xB260, 9185: 0xB268, 9186: 0xB269, 9187: 0xB274, 9188: 0xB275, 9189: 0xB27C, 9190: 0xB284, 9191: 0xB285, 9192: 0xB289, 9193: 0xB290, 9194: 0xB291, 9195: 0xB294, 9196: 0xB298, 9197: 0xB299, 9198: 0xB29A, 9199: 0xB2A0, 9200: 0xB2A1, 9201: 0xB2A3, 9202: 0xB2A5, 9203: 0xB2A6, 9204: 0xB2AA, 9205: 0xB2AC, 9206: 0xB2B0, 9207: 0xB2B4, 9208: 0xB2C8, 9209: 0xB2C9, 9210: 0xB2CC, 9211: 0xB2D0, 9212: 0xB2D2, 9213: 0xB2D8, 9214: 0xB2D9, 9215: 0xB2DB, 9216: 0xB2DD, 9217: 0xB2E2, 9218: 0xB2E4, 9219: 0xB2E5, 9220: 0xB2E6, 9221: 0xB2E8, 9222: 0xB2EB, 9223: 0xB2EC, 9224: 0xB2ED, 9225: 0xB2EE, 9226: 0xB2EF, 9227: 0xB2F3, 9228: 0xB2F4, 9229: 0xB2F5, 9230: 0xB2F7, 9231: 0xB2F8, 9232: 0xB2F9, 9233: 0xB2FA, 9234: 0xB2FB, 9235: 0xB2FF, 9236: 0xB300, 9237: 0xB301, 9238: 0xB304, 9239: 0xB308, 9240: 0xB310, 9241: 0xB311, 9242: 0xB313, 9243: 0xB314, 9244: 0xB315, 9245: 0xB31C, 9246: 0xB354, 9247: 0xB355, 9248: 0xB356, 9249: 0xB358, 9250: 0xB35B, 9251: 0xB35C, 9252: 0xB35E, 9253: 0xB35F, 9254: 0xB364, 9255: 0xB365, 9256: 0xD095, 9257: 0xD096, 9258: 0xD097, 9259: 0xD098, 9260: 0xD099, 9261: 0xD09A, 9262: 0xD09B, 9263: 0xD09C, 9264: 0xD09D, 9265: 0xD09E, 9266: 0xD09F, 9267: 0xD0A0, 9268: 0xD0A1, 9269: 0xD0A2, 9270: 0xD0A3, 9271: 0xD0A6, 9272: 0xD0A7, 9273: 0xD0A9, 9274: 0xD0AA, 9275: 0xD0AB, 9276: 0xD0AD, 9277: 0xD0AE, 9278: 0xD0AF, 9279: 0xD0B0, 9280: 0xD0B1, 9281: 0xD0B2, 9282: 0xD0B3, 9283: 0xD0B6, 9284: 0xD0B8, 9285: 0xD0BA, 9286: 0xD0BB, 9287: 0xD0BC, 9288: 0xD0BD, 9289: 0xD0BE, 9290: 0xD0BF, 9291: 0xD0C2, 9292: 0xD0C3, 9293: 0xD0C5, 9294: 0xD0C6, 9295: 0xD0C7, 9296: 0xD0CA, 9297: 0xD0CB, 9298: 0xD0CC, 9299: 0xD0CD, 9300: 0xD0CE, 9301: 0xD0CF, 9302: 0xD0D2, 9303: 0xD0D6, 9304: 0xD0D7, 9305: 0xD0D8, 9306: 0xD0D9, 9307: 0xD0DA, 9308: 0xD0DB, 9309: 0xD0DE, 9310: 0xD0DF, 9311: 0xD0E1, 9312: 0xD0E2, 9313: 0xD0E3, 9314: 0xD0E5, 9315: 0xD0E6, 9316: 0xD0E7, 9317: 0xD0E8, 9318: 0xD0E9, 9319: 0xD0EA, 9320: 0xD0EB, 9321: 0xD0EE, 9322: 0xD0F2, 9323: 0xD0F3, 9324: 0xD0F4, 9325: 0xD0F5, 9326: 0xD0F6, 9327: 0xD0F7, 9328: 0xD0F9, 9329: 0xD0FA, 9330: 0xD0FB, 9331: 0xD0FC, 9332: 0xD0FD, 9333: 0xD0FE, 9334: 0xD0FF, 9335: 0xD100, 9336: 0xD101, 9337: 0xD102, 9338: 0xD103, 9339: 0xD104, 9340: 0xB367, 9341: 0xB369, 9342: 0xB36B, 9343: 0xB36E, 9344: 0xB370, 9345: 0xB371, 9346: 0xB374, 9347: 0xB378, 9348: 0xB380, 9349: 0xB381, 9350: 0xB383, 9351: 0xB384, 9352: 0xB385, 9353: 0xB38C, 9354: 0xB390, 9355: 0xB394, 9356: 0xB3A0, 9357: 0xB3A1, 9358: 0xB3A8, 9359: 0xB3AC, 9360: 0xB3C4, 9361: 0xB3C5, 9362: 0xB3C8, 9363: 0xB3CB, 9364: 0xB3CC, 9365: 0xB3CE, 9366: 0xB3D0, 9367: 0xB3D4, 9368: 0xB3D5, 9369: 0xB3D7, 9370: 0xB3D9, 9371: 0xB3DB, 9372: 0xB3DD, 9373: 0xB3E0, 9374: 0xB3E4, 9375: 0xB3E8, 9376: 0xB3FC, 9377: 0xB410, 9378: 0xB418, 9379: 0xB41C, 9380: 0xB420, 9381: 0xB428, 9382: 0xB429, 9383: 0xB42B, 9384: 0xB434, 9385: 0xB450, 9386: 0xB451, 9387: 0xB454, 9388: 0xB458, 9389: 0xB460, 9390: 0xB461, 9391: 0xB463, 9392: 0xB465, 9393: 0xB46C, 9394: 0xB480, 9395: 0xB488, 9396: 0xB49D, 9397: 0xB4A4, 9398: 0xB4A8, 9399: 0xB4AC, 9400: 0xB4B5, 9401: 0xB4B7, 9402: 0xB4B9, 9403: 0xB4C0, 9404: 0xB4C4, 9405: 0xB4C8, 9406: 0xB4D0, 9407: 0xB4D5, 9408: 0xB4DC, 9409: 0xB4DD, 9410: 0xB4E0, 9411: 0xB4E3, 9412: 0xB4E4, 9413: 0xB4E6, 9414: 0xB4EC, 9415: 0xB4ED, 9416: 0xB4EF, 9417: 0xB4F1, 9418: 0xB4F8, 9419: 0xB514, 9420: 0xB515, 9421: 0xB518, 9422: 0xB51B, 9423: 0xB51C, 9424: 0xB524, 9425: 0xB525, 9426: 0xB527, 9427: 0xB528, 9428: 0xB529, 9429: 0xB52A, 9430: 0xB530, 9431: 0xB531, 9432: 0xB534, 9433: 0xB538, 9434: 0xD105, 9435: 0xD106, 9436: 0xD107, 9437: 0xD108, 9438: 0xD109, 9439: 0xD10A, 9440: 0xD10B, 9441: 0xD10C, 9442: 0xD10E, 9443: 0xD10F, 9444: 0xD110, 9445: 0xD111, 9446: 0xD112, 9447: 0xD113, 9448: 0xD114, 9449: 0xD115, 9450: 0xD116, 9451: 0xD117, 9452: 0xD118, 9453: 0xD119, 9454: 0xD11A, 9455: 0xD11B, 9456: 0xD11C, 9457: 0xD11D, 9458: 0xD11E, 9459: 0xD11F, 9460: 0xD120, 9461: 0xD121, 9462: 0xD122, 9463: 0xD123, 9464: 0xD124, 9465: 0xD125, 9466: 0xD126, 9467: 0xD127, 9468: 0xD128, 9469: 0xD129, 9470: 0xD12A, 9471: 0xD12B, 9472: 0xD12C, 9473: 0xD12D, 9474: 0xD12E, 9475: 0xD12F, 9476: 0xD132, 9477: 0xD133, 9478: 0xD135, 9479: 0xD136, 9480: 0xD137, 9481: 0xD139, 9482: 0xD13B, 9483: 0xD13C, 9484: 0xD13D, 9485: 0xD13E, 9486: 0xD13F, 9487: 0xD142, 9488: 0xD146, 9489: 0xD147, 9490: 0xD148, 9491: 0xD149, 9492: 0xD14A, 9493: 0xD14B, 9494: 0xD14E, 9495: 0xD14F, 9496: 0xD151, 9497: 0xD152, 9498: 0xD153, 9499: 0xD155, 9500: 0xD156, 9501: 0xD157, 9502: 0xD158, 9503: 0xD159, 9504: 0xD15A, 9505: 0xD15B, 9506: 0xD15E, 9507: 0xD160, 9508: 0xD162, 9509: 0xD163, 9510: 0xD164, 9511: 0xD165, 9512: 0xD166, 9513: 0xD167, 9514: 0xD169, 9515: 0xD16A, 9516: 0xD16B, 9517: 0xD16D, 9518: 0xB540, 9519: 0xB541, 9520: 0xB543, 9521: 0xB544, 9522: 0xB545, 9523: 0xB54B, 9524: 0xB54C, 9525: 0xB54D, 9526: 0xB550, 9527: 0xB554, 9528: 0xB55C, 9529: 0xB55D, 9530: 0xB55F, 9531: 0xB560, 9532: 0xB561, 9533: 0xB5A0, 9534: 0xB5A1, 9535: 0xB5A4, 9536: 0xB5A8, 9537: 0xB5AA, 9538: 0xB5AB, 9539: 0xB5B0, 9540: 0xB5B1, 9541: 0xB5B3, 9542: 0xB5B4, 9543: 0xB5B5, 9544: 0xB5BB, 9545: 0xB5BC, 9546: 0xB5BD, 9547: 0xB5C0, 9548: 0xB5C4, 9549: 0xB5CC, 9550: 0xB5CD, 9551: 0xB5CF, 9552: 0xB5D0, 9553: 0xB5D1, 9554: 0xB5D8, 9555: 0xB5EC, 9556: 0xB610, 9557: 0xB611, 9558: 0xB614, 9559: 0xB618, 9560: 0xB625, 9561: 0xB62C, 9562: 0xB634, 9563: 0xB648, 9564: 0xB664, 9565: 0xB668, 9566: 0xB69C, 9567: 0xB69D, 9568: 0xB6A0, 9569: 0xB6A4, 9570: 0xB6AB, 9571: 0xB6AC, 9572: 0xB6B1, 9573: 0xB6D4, 9574: 0xB6F0, 9575: 0xB6F4, 9576: 0xB6F8, 9577: 0xB700, 9578: 0xB701, 9579: 0xB705, 9580: 0xB728, 9581: 0xB729, 9582: 0xB72C, 9583: 0xB72F, 9584: 0xB730, 9585: 0xB738, 9586: 0xB739, 9587: 0xB73B, 9588: 0xB744, 9589: 0xB748, 9590: 0xB74C, 9591: 0xB754, 9592: 0xB755, 9593: 0xB760, 9594: 0xB764, 9595: 0xB768, 9596: 0xB770, 9597: 0xB771, 9598: 0xB773, 9599: 0xB775, 9600: 0xB77C, 9601: 0xB77D, 9602: 0xB780, 9603: 0xB784, 9604: 0xB78C, 9605: 0xB78D, 9606: 0xB78F, 9607: 0xB790, 9608: 0xB791, 9609: 0xB792, 9610: 0xB796, 9611: 0xB797, 9612: 0xD16E, 9613: 0xD16F, 9614: 0xD170, 9615: 0xD171, 9616: 0xD172, 9617: 0xD173, 9618: 0xD174, 9619: 0xD175, 9620: 0xD176, 9621: 0xD177, 9622: 0xD178, 9623: 0xD179, 9624: 0xD17A, 9625: 0xD17B, 9626: 0xD17D, 9627: 0xD17E, 9628: 0xD17F, 9629: 0xD180, 9630: 0xD181, 9631: 0xD182, 9632: 0xD183, 9633: 0xD185, 9634: 0xD186, 9635: 0xD187, 9636: 0xD189, 9637: 0xD18A, 9638: 0xD18B, 9639: 0xD18C, 9640: 0xD18D, 9641: 0xD18E, 9642: 0xD18F, 9643: 0xD190, 9644: 0xD191, 9645: 0xD192, 9646: 0xD193, 9647: 0xD194, 9648: 0xD195, 9649: 0xD196, 9650: 0xD197, 9651: 0xD198, 9652: 0xD199, 9653: 0xD19A, 9654: 0xD19B, 9655: 0xD19C, 9656: 0xD19D, 9657: 0xD19E, 9658: 0xD19F, 9659: 0xD1A2, 9660: 0xD1A3, 9661: 0xD1A5, 9662: 0xD1A6, 9663: 0xD1A7, 9664: 0xD1A9, 9665: 0xD1AA, 9666: 0xD1AB, 9667: 0xD1AC, 9668: 0xD1AD, 9669: 0xD1AE, 9670: 0xD1AF, 9671: 0xD1B2, 9672: 0xD1B4, 9673: 0xD1B6, 9674: 0xD1B7, 9675: 0xD1B8, 9676: 0xD1B9, 9677: 0xD1BB, 9678: 0xD1BD, 9679: 0xD1BE, 9680: 0xD1BF, 9681: 0xD1C1, 9682: 0xD1C2, 9683: 0xD1C3, 9684: 0xD1C4, 9685: 0xD1C5, 9686: 0xD1C6, 9687: 0xD1C7, 9688: 0xD1C8, 9689: 0xD1C9, 9690: 0xD1CA, 9691: 0xD1CB, 9692: 0xD1CC, 9693: 0xD1CD, 9694: 0xD1CE, 9695: 0xD1CF, 9696: 0xB798, 9697: 0xB799, 9698: 0xB79C, 9699: 0xB7A0, 9700: 0xB7A8, 9701: 0xB7A9, 9702: 0xB7AB, 9703: 0xB7AC, 9704: 0xB7AD, 9705: 0xB7B4, 9706: 0xB7B5, 9707: 0xB7B8, 9708: 0xB7C7, 9709: 0xB7C9, 9710: 0xB7EC, 9711: 0xB7ED, 9712: 0xB7F0, 9713: 0xB7F4, 9714: 0xB7FC, 9715: 0xB7FD, 9716: 0xB7FF, 9717: 0xB800, 9718: 0xB801, 9719: 0xB807, 9720: 0xB808, 9721: 0xB809, 9722: 0xB80C, 9723: 0xB810, 9724: 0xB818, 9725: 0xB819, 9726: 0xB81B, 9727: 0xB81D, 9728: 0xB824, 9729: 0xB825, 9730: 0xB828, 9731: 0xB82C, 9732: 0xB834, 9733: 0xB835, 9734: 0xB837, 9735: 0xB838, 9736: 0xB839, 9737: 0xB840, 9738: 0xB844, 9739: 0xB851, 9740: 0xB853, 9741: 0xB85C, 9742: 0xB85D, 9743: 0xB860, 9744: 0xB864, 9745: 0xB86C, 9746: 0xB86D, 9747: 0xB86F, 9748: 0xB871, 9749: 0xB878, 9750: 0xB87C, 9751: 0xB88D, 9752: 0xB8A8, 9753: 0xB8B0, 9754: 0xB8B4, 9755: 0xB8B8, 9756: 0xB8C0, 9757: 0xB8C1, 9758: 0xB8C3, 9759: 0xB8C5, 9760: 0xB8CC, 9761: 0xB8D0, 9762: 0xB8D4, 9763: 0xB8DD, 9764: 0xB8DF, 9765: 0xB8E1, 9766: 0xB8E8, 9767: 0xB8E9, 9768: 0xB8EC, 9769: 0xB8F0, 9770: 0xB8F8, 9771: 0xB8F9, 9772: 0xB8FB, 9773: 0xB8FD, 9774: 0xB904, 9775: 0xB918, 9776: 0xB920, 9777: 0xB93C, 9778: 0xB93D, 9779: 0xB940, 9780: 0xB944, 9781: 0xB94C, 9782: 0xB94F, 9783: 0xB951, 9784: 0xB958, 9785: 0xB959, 9786: 0xB95C, 9787: 0xB960, 9788: 0xB968, 9789: 0xB969, 9790: 0xD1D0, 9791: 0xD1D1, 9792: 0xD1D2, 9793: 0xD1D3, 9794: 0xD1D4, 9795: 0xD1D5, 9796: 0xD1D6, 9797: 0xD1D7, 9798: 0xD1D9, 9799: 0xD1DA, 9800: 0xD1DB, 9801: 0xD1DC, 9802: 0xD1DD, 9803: 0xD1DE, 9804: 0xD1DF, 9805: 0xD1E0, 9806: 0xD1E1, 9807: 0xD1E2, 9808: 0xD1E3, 9809: 0xD1E4, 9810: 0xD1E5, 9811: 0xD1E6, 9812: 0xD1E7, 9813: 0xD1E8, 9814: 0xD1E9, 9815: 0xD1EA, 9816: 0xD1EB, 9817: 0xD1EC, 9818: 0xD1ED, 9819: 0xD1EE, 9820: 0xD1EF, 9821: 0xD1F0, 9822: 0xD1F1, 9823: 0xD1F2, 9824: 0xD1F3, 9825: 0xD1F5, 9826: 0xD1F6, 9827: 0xD1F7, 9828: 0xD1F9, 9829: 0xD1FA, 9830: 0xD1FB, 9831: 0xD1FC, 9832: 0xD1FD, 9833: 0xD1FE, 9834: 0xD1FF, 9835: 0xD200, 9836: 0xD201, 9837: 0xD202, 9838: 0xD203, 9839: 0xD204, 9840: 0xD205, 9841: 0xD206, 9842: 0xD208, 9843: 0xD20A, 9844: 0xD20B, 9845: 0xD20C, 9846: 0xD20D, 9847: 0xD20E, 9848: 0xD20F, 9849: 0xD211, 9850: 0xD212, 9851: 0xD213, 9852: 0xD214, 9853: 0xD215, 9854: 0xD216, 9855: 0xD217, 9856: 0xD218, 9857: 0xD219, 9858: 0xD21A, 9859: 0xD21B, 9860: 0xD21C, 9861: 0xD21D, 9862: 0xD21E, 9863: 0xD21F, 9864: 0xD220, 9865: 0xD221, 9866: 0xD222, 9867: 0xD223, 9868: 0xD224, 9869: 0xD225, 9870: 0xD226, 9871: 0xD227, 9872: 0xD228, 9873: 0xD229, 9874: 0xB96B, 9875: 0xB96D, 9876: 0xB974, 9877: 0xB975, 9878: 0xB978, 9879: 0xB97C, 9880: 0xB984, 9881: 0xB985, 9882: 0xB987, 9883: 0xB989, 9884: 0xB98A, 9885: 0xB98D, 9886: 0xB98E, 9887: 0xB9AC, 9888: 0xB9AD, 9889: 0xB9B0, 9890: 0xB9B4, 9891: 0xB9BC, 9892: 0xB9BD, 9893: 0xB9BF, 9894: 0xB9C1, 9895: 0xB9C8, 9896: 0xB9C9, 9897: 0xB9CC, 9898: 0xB9CE, 9899: 0xB9CF, 9900: 0xB9D0, 9901: 0xB9D1, 9902: 0xB9D2, 9903: 0xB9D8, 9904: 0xB9D9, 9905: 0xB9DB, 9906: 0xB9DD, 9907: 0xB9DE, 9908: 0xB9E1, 9909: 0xB9E3, 9910: 0xB9E4, 9911: 0xB9E5, 9912: 0xB9E8, 9913: 0xB9EC, 9914: 0xB9F4, 9915: 0xB9F5, 9916: 0xB9F7, 9917: 0xB9F8, 9918: 0xB9F9, 9919: 0xB9FA, 9920: 0xBA00, 9921: 0xBA01, 9922: 0xBA08, 9923: 0xBA15, 9924: 0xBA38, 9925: 0xBA39, 9926: 0xBA3C, 9927: 0xBA40, 9928: 0xBA42, 9929: 0xBA48, 9930: 0xBA49, 9931: 0xBA4B, 9932: 0xBA4D, 9933: 0xBA4E, 9934: 0xBA53, 9935: 0xBA54, 9936: 0xBA55, 9937: 0xBA58, 9938: 0xBA5C, 9939: 0xBA64, 9940: 0xBA65, 9941: 0xBA67, 9942: 0xBA68, 9943: 0xBA69, 9944: 0xBA70, 9945: 0xBA71, 9946: 0xBA74, 9947: 0xBA78, 9948: 0xBA83, 9949: 0xBA84, 9950: 0xBA85, 9951: 0xBA87, 9952: 0xBA8C, 9953: 0xBAA8, 9954: 0xBAA9, 9955: 0xBAAB, 9956: 0xBAAC, 9957: 0xBAB0, 9958: 0xBAB2, 9959: 0xBAB8, 9960: 0xBAB9, 9961: 0xBABB, 9962: 0xBABD, 9963: 0xBAC4, 9964: 0xBAC8, 9965: 0xBAD8, 9966: 0xBAD9, 9967: 0xBAFC, 9968: 0xD22A, 9969: 0xD22B, 9970: 0xD22E, 9971: 0xD22F, 9972: 0xD231, 9973: 0xD232, 9974: 0xD233, 9975: 0xD235, 9976: 0xD236, 9977: 0xD237, 9978: 0xD238, 9979: 0xD239, 9980: 0xD23A, 9981: 0xD23B, 9982: 0xD23E, 9983: 0xD240, 9984: 0xD242, 9985: 0xD243, 9986: 0xD244, 9987: 0xD245, 9988: 0xD246, 9989: 0xD247, 9990: 0xD249, 9991: 0xD24A, 9992: 0xD24B, 9993: 0xD24C, 9994: 0xD24D, 9995: 0xD24E, 9996: 0xD24F, 9997: 0xD250, 9998: 0xD251, 9999: 0xD252, 10000: 0xD253, 10001: 0xD254, 10002: 0xD255, 10003: 0xD256, 10004: 0xD257, 10005: 0xD258, 10006: 0xD259, 10007: 0xD25A, 10008: 0xD25B, 10009: 0xD25D, 10010: 0xD25E, 10011: 0xD25F, 10012: 0xD260, 10013: 0xD261, 10014: 0xD262, 10015: 0xD263, 10016: 0xD265, 10017: 0xD266, 10018: 0xD267, 10019: 0xD268, 10020: 0xD269, 10021: 0xD26A, 10022: 0xD26B, 10023: 0xD26C, 10024: 0xD26D, 10025: 0xD26E, 10026: 0xD26F, 10027: 0xD270, 10028: 0xD271, 10029: 0xD272, 10030: 0xD273, 10031: 0xD274, 10032: 0xD275, 10033: 0xD276, 10034: 0xD277, 10035: 0xD278, 10036: 0xD279, 10037: 0xD27A, 10038: 0xD27B, 10039: 0xD27C, 10040: 0xD27D, 10041: 0xD27E, 10042: 0xD27F, 10043: 0xD282, 10044: 0xD283, 10045: 0xD285, 10046: 0xD286, 10047: 0xD287, 10048: 0xD289, 10049: 0xD28A, 10050: 0xD28B, 10051: 0xD28C, 10052: 0xBB00, 10053: 0xBB04, 10054: 0xBB0D, 10055: 0xBB0F, 10056: 0xBB11, 10057: 0xBB18, 10058: 0xBB1C, 10059: 0xBB20, 10060: 0xBB29, 10061: 0xBB2B, 10062: 0xBB34, 10063: 0xBB35, 10064: 0xBB36, 10065: 0xBB38, 10066: 0xBB3B, 10067: 0xBB3C, 10068: 0xBB3D, 10069: 0xBB3E, 10070: 0xBB44, 10071: 0xBB45, 10072: 0xBB47, 10073: 0xBB49, 10074: 0xBB4D, 10075: 0xBB4F, 10076: 0xBB50, 10077: 0xBB54, 10078: 0xBB58, 10079: 0xBB61, 10080: 0xBB63, 10081: 0xBB6C, 10082: 0xBB88, 10083: 0xBB8C, 10084: 0xBB90, 10085: 0xBBA4, 10086: 0xBBA8, 10087: 0xBBAC, 10088: 0xBBB4, 10089: 0xBBB7, 10090: 0xBBC0, 10091: 0xBBC4, 10092: 0xBBC8, 10093: 0xBBD0, 10094: 0xBBD3, 10095: 0xBBF8, 10096: 0xBBF9, 10097: 0xBBFC, 10098: 0xBBFF, 10099: 0xBC00, 10100: 0xBC02, 10101: 0xBC08, 10102: 0xBC09, 10103: 0xBC0B, 10104: 0xBC0C, 10105: 0xBC0D, 10106: 0xBC0F, 10107: 0xBC11, 10108: 0xBC14, 10109: 0xBC15, 10110: 0xBC16, 10111: 0xBC17, 10112: 0xBC18, 10113: 0xBC1B, 10114: 0xBC1C, 10115: 0xBC1D, 10116: 0xBC1E, 10117: 0xBC1F, 10118: 0xBC24, 10119: 0xBC25, 10120: 0xBC27, 10121: 0xBC29, 10122: 0xBC2D, 10123: 0xBC30, 10124: 0xBC31, 10125: 0xBC34, 10126: 0xBC38, 10127: 0xBC40, 10128: 0xBC41, 10129: 0xBC43, 10130: 0xBC44, 10131: 0xBC45, 10132: 0xBC49, 10133: 0xBC4C, 10134: 0xBC4D, 10135: 0xBC50, 10136: 0xBC5D, 10137: 0xBC84, 10138: 0xBC85, 10139: 0xBC88, 10140: 0xBC8B, 10141: 0xBC8C, 10142: 0xBC8E, 10143: 0xBC94, 10144: 0xBC95, 10145: 0xBC97, 10146: 0xD28D, 10147: 0xD28E, 10148: 0xD28F, 10149: 0xD292, 10150: 0xD293, 10151: 0xD294, 10152: 0xD296, 10153: 0xD297, 10154: 0xD298, 10155: 0xD299, 10156: 0xD29A, 10157: 0xD29B, 10158: 0xD29D, 10159: 0xD29E, 10160: 0xD29F, 10161: 0xD2A1, 10162: 0xD2A2, 10163: 0xD2A3, 10164: 0xD2A5, 10165: 0xD2A6, 10166: 0xD2A7, 10167: 0xD2A8, 10168: 0xD2A9, 10169: 0xD2AA, 10170: 0xD2AB, 10171: 0xD2AD, 10172: 0xD2AE, 10173: 0xD2AF, 10174: 0xD2B0, 10175: 0xD2B2, 10176: 0xD2B3, 10177: 0xD2B4, 10178: 0xD2B5, 10179: 0xD2B6, 10180: 0xD2B7, 10181: 0xD2BA, 10182: 0xD2BB, 10183: 0xD2BD, 10184: 0xD2BE, 10185: 0xD2C1, 10186: 0xD2C3, 10187: 0xD2C4, 10188: 0xD2C5, 10189: 0xD2C6, 10190: 0xD2C7, 10191: 0xD2CA, 10192: 0xD2CC, 10193: 0xD2CD, 10194: 0xD2CE, 10195: 0xD2CF, 10196: 0xD2D0, 10197: 0xD2D1, 10198: 0xD2D2, 10199: 0xD2D3, 10200: 0xD2D5, 10201: 0xD2D6, 10202: 0xD2D7, 10203: 0xD2D9, 10204: 0xD2DA, 10205: 0xD2DB, 10206: 0xD2DD, 10207: 0xD2DE, 10208: 0xD2DF, 10209: 0xD2E0, 10210: 0xD2E1, 10211: 0xD2E2, 10212: 0xD2E3, 10213: 0xD2E6, 10214: 0xD2E7, 10215: 0xD2E8, 10216: 0xD2E9, 10217: 0xD2EA, 10218: 0xD2EB, 10219: 0xD2EC, 10220: 0xD2ED, 10221: 0xD2EE, 10222: 0xD2EF, 10223: 0xD2F2, 10224: 0xD2F3, 10225: 0xD2F5, 10226: 0xD2F6, 10227: 0xD2F7, 10228: 0xD2F9, 10229: 0xD2FA, 10230: 0xBC99, 10231: 0xBC9A, 10232: 0xBCA0, 10233: 0xBCA1, 10234: 0xBCA4, 10235: 0xBCA7, 10236: 0xBCA8, 10237: 0xBCB0, 10238: 0xBCB1, 10239: 0xBCB3, 10240: 0xBCB4, 10241: 0xBCB5, 10242: 0xBCBC, 10243: 0xBCBD, 10244: 0xBCC0, 10245: 0xBCC4, 10246: 0xBCCD, 10247: 0xBCCF, 10248: 0xBCD0, 10249: 0xBCD1, 10250: 0xBCD5, 10251: 0xBCD8, 10252: 0xBCDC, 10253: 0xBCF4, 10254: 0xBCF5, 10255: 0xBCF6, 10256: 0xBCF8, 10257: 0xBCFC, 10258: 0xBD04, 10259: 0xBD05, 10260: 0xBD07, 10261: 0xBD09, 10262: 0xBD10, 10263: 0xBD14, 10264: 0xBD24, 10265: 0xBD2C, 10266: 0xBD40, 10267: 0xBD48, 10268: 0xBD49, 10269: 0xBD4C, 10270: 0xBD50, 10271: 0xBD58, 10272: 0xBD59, 10273: 0xBD64, 10274: 0xBD68, 10275: 0xBD80, 10276: 0xBD81, 10277: 0xBD84, 10278: 0xBD87, 10279: 0xBD88, 10280: 0xBD89, 10281: 0xBD8A, 10282: 0xBD90, 10283: 0xBD91, 10284: 0xBD93, 10285: 0xBD95, 10286: 0xBD99, 10287: 0xBD9A, 10288: 0xBD9C, 10289: 0xBDA4, 10290: 0xBDB0, 10291: 0xBDB8, 10292: 0xBDD4, 10293: 0xBDD5, 10294: 0xBDD8, 10295: 0xBDDC, 10296: 0xBDE9, 10297: 0xBDF0, 10298: 0xBDF4, 10299: 0xBDF8, 10300: 0xBE00, 10301: 0xBE03, 10302: 0xBE05, 10303: 0xBE0C, 10304: 0xBE0D, 10305: 0xBE10, 10306: 0xBE14, 10307: 0xBE1C, 10308: 0xBE1D, 10309: 0xBE1F, 10310: 0xBE44, 10311: 0xBE45, 10312: 0xBE48, 10313: 0xBE4C, 10314: 0xBE4E, 10315: 0xBE54, 10316: 0xBE55, 10317: 0xBE57, 10318: 0xBE59, 10319: 0xBE5A, 10320: 0xBE5B, 10321: 0xBE60, 10322: 0xBE61, 10323: 0xBE64, 10324: 0xD2FB, 10325: 0xD2FC, 10326: 0xD2FD, 10327: 0xD2FE, 10328: 0xD2FF, 10329: 0xD302, 10330: 0xD304, 10331: 0xD306, 10332: 0xD307, 10333: 0xD308, 10334: 0xD309, 10335: 0xD30A, 10336: 0xD30B, 10337: 0xD30F, 10338: 0xD311, 10339: 0xD312, 10340: 0xD313, 10341: 0xD315, 10342: 0xD317, 10343: 0xD318, 10344: 0xD319, 10345: 0xD31A, 10346: 0xD31B, 10347: 0xD31E, 10348: 0xD322, 10349: 0xD323, 10350: 0xD324, 10351: 0xD326, 10352: 0xD327, 10353: 0xD32A, 10354: 0xD32B, 10355: 0xD32D, 10356: 0xD32E, 10357: 0xD32F, 10358: 0xD331, 10359: 0xD332, 10360: 0xD333, 10361: 0xD334, 10362: 0xD335, 10363: 0xD336, 10364: 0xD337, 10365: 0xD33A, 10366: 0xD33E, 10367: 0xD33F, 10368: 0xD340, 10369: 0xD341, 10370: 0xD342, 10371: 0xD343, 10372: 0xD346, 10373: 0xD347, 10374: 0xD348, 10375: 0xD349, 10376: 0xD34A, 10377: 0xD34B, 10378: 0xD34C, 10379: 0xD34D, 10380: 0xD34E, 10381: 0xD34F, 10382: 0xD350, 10383: 0xD351, 10384: 0xD352, 10385: 0xD353, 10386: 0xD354, 10387: 0xD355, 10388: 0xD356, 10389: 0xD357, 10390: 0xD358, 10391: 0xD359, 10392: 0xD35A, 10393: 0xD35B, 10394: 0xD35C, 10395: 0xD35D, 10396: 0xD35E, 10397: 0xD35F, 10398: 0xD360, 10399: 0xD361, 10400: 0xD362, 10401: 0xD363, 10402: 0xD364, 10403: 0xD365, 10404: 0xD366, 10405: 0xD367, 10406: 0xD368, 10407: 0xD369, 10408: 0xBE68, 10409: 0xBE6A, 10410: 0xBE70, 10411: 0xBE71, 10412: 0xBE73, 10413: 0xBE74, 10414: 0xBE75, 10415: 0xBE7B, 10416: 0xBE7C, 10417: 0xBE7D, 10418: 0xBE80, 10419: 0xBE84, 10420: 0xBE8C, 10421: 0xBE8D, 10422: 0xBE8F, 10423: 0xBE90, 10424: 0xBE91, 10425: 0xBE98, 10426: 0xBE99, 10427: 0xBEA8, 10428: 0xBED0, 10429: 0xBED1, 10430: 0xBED4, 10431: 0xBED7, 10432: 0xBED8, 10433: 0xBEE0, 10434: 0xBEE3, 10435: 0xBEE4, 10436: 0xBEE5, 10437: 0xBEEC, 10438: 0xBF01, 10439: 0xBF08, 10440: 0xBF09, 10441: 0xBF18, 10442: 0xBF19, 10443: 0xBF1B, 10444: 0xBF1C, 10445: 0xBF1D, 10446: 0xBF40, 10447: 0xBF41, 10448: 0xBF44, 10449: 0xBF48, 10450: 0xBF50, 10451: 0xBF51, 10452: 0xBF55, 10453: 0xBF94, 10454: 0xBFB0, 10455: 0xBFC5, 10456: 0xBFCC, 10457: 0xBFCD, 10458: 0xBFD0, 10459: 0xBFD4, 10460: 0xBFDC, 10461: 0xBFDF, 10462: 0xBFE1, 10463: 0xC03C, 10464: 0xC051, 10465: 0xC058, 10466: 0xC05C, 10467: 0xC060, 10468: 0xC068, 10469: 0xC069, 10470: 0xC090, 10471: 0xC091, 10472: 0xC094, 10473: 0xC098, 10474: 0xC0A0, 10475: 0xC0A1, 10476: 0xC0A3, 10477: 0xC0A5, 10478: 0xC0AC, 10479: 0xC0AD, 10480: 0xC0AF, 10481: 0xC0B0, 10482: 0xC0B3, 10483: 0xC0B4, 10484: 0xC0B5, 10485: 0xC0B6, 10486: 0xC0BC, 10487: 0xC0BD, 10488: 0xC0BF, 10489: 0xC0C0, 10490: 0xC0C1, 10491: 0xC0C5, 10492: 0xC0C8, 10493: 0xC0C9, 10494: 0xC0CC, 10495: 0xC0D0, 10496: 0xC0D8, 10497: 0xC0D9, 10498: 0xC0DB, 10499: 0xC0DC, 10500: 0xC0DD, 10501: 0xC0E4, 10502: 0xD36A, 10503: 0xD36B, 10504: 0xD36C, 10505: 0xD36D, 10506: 0xD36E, 10507: 0xD36F, 10508: 0xD370, 10509: 0xD371, 10510: 0xD372, 10511: 0xD373, 10512: 0xD374, 10513: 0xD375, 10514: 0xD376, 10515: 0xD377, 10516: 0xD378, 10517: 0xD379, 10518: 0xD37A, 10519: 0xD37B, 10520: 0xD37E, 10521: 0xD37F, 10522: 0xD381, 10523: 0xD382, 10524: 0xD383, 10525: 0xD385, 10526: 0xD386, 10527: 0xD387, 10528: 0xD388, 10529: 0xD389, 10530: 0xD38A, 10531: 0xD38B, 10532: 0xD38E, 10533: 0xD392, 10534: 0xD393, 10535: 0xD394, 10536: 0xD395, 10537: 0xD396, 10538: 0xD397, 10539: 0xD39A, 10540: 0xD39B, 10541: 0xD39D, 10542: 0xD39E, 10543: 0xD39F, 10544: 0xD3A1, 10545: 0xD3A2, 10546: 0xD3A3, 10547: 0xD3A4, 10548: 0xD3A5, 10549: 0xD3A6, 10550: 0xD3A7, 10551: 0xD3AA, 10552: 0xD3AC, 10553: 0xD3AE, 10554: 0xD3AF, 10555: 0xD3B0, 10556: 0xD3B1, 10557: 0xD3B2, 10558: 0xD3B3, 10559: 0xD3B5, 10560: 0xD3B6, 10561: 0xD3B7, 10562: 0xD3B9, 10563: 0xD3BA, 10564: 0xD3BB, 10565: 0xD3BD, 10566: 0xD3BE, 10567: 0xD3BF, 10568: 0xD3C0, 10569: 0xD3C1, 10570: 0xD3C2, 10571: 0xD3C3, 10572: 0xD3C6, 10573: 0xD3C7, 10574: 0xD3CA, 10575: 0xD3CB, 10576: 0xD3CC, 10577: 0xD3CD, 10578: 0xD3CE, 10579: 0xD3CF, 10580: 0xD3D1, 10581: 0xD3D2, 10582: 0xD3D3, 10583: 0xD3D4, 10584: 0xD3D5, 10585: 0xD3D6, 10586: 0xC0E5, 10587: 0xC0E8, 10588: 0xC0EC, 10589: 0xC0F4, 10590: 0xC0F5, 10591: 0xC0F7, 10592: 0xC0F9, 10593: 0xC100, 10594: 0xC104, 10595: 0xC108, 10596: 0xC110, 10597: 0xC115, 10598: 0xC11C, 10599: 0xC11D, 10600: 0xC11E, 10601: 0xC11F, 10602: 0xC120, 10603: 0xC123, 10604: 0xC124, 10605: 0xC126, 10606: 0xC127, 10607: 0xC12C, 10608: 0xC12D, 10609: 0xC12F, 10610: 0xC130, 10611: 0xC131, 10612: 0xC136, 10613: 0xC138, 10614: 0xC139, 10615: 0xC13C, 10616: 0xC140, 10617: 0xC148, 10618: 0xC149, 10619: 0xC14B, 10620: 0xC14C, 10621: 0xC14D, 10622: 0xC154, 10623: 0xC155, 10624: 0xC158, 10625: 0xC15C, 10626: 0xC164, 10627: 0xC165, 10628: 0xC167, 10629: 0xC168, 10630: 0xC169, 10631: 0xC170, 10632: 0xC174, 10633: 0xC178, 10634: 0xC185, 10635: 0xC18C, 10636: 0xC18D, 10637: 0xC18E, 10638: 0xC190, 10639: 0xC194, 10640: 0xC196, 10641: 0xC19C, 10642: 0xC19D, 10643: 0xC19F, 10644: 0xC1A1, 10645: 0xC1A5, 10646: 0xC1A8, 10647: 0xC1A9, 10648: 0xC1AC, 10649: 0xC1B0, 10650: 0xC1BD, 10651: 0xC1C4, 10652: 0xC1C8, 10653: 0xC1CC, 10654: 0xC1D4, 10655: 0xC1D7, 10656: 0xC1D8, 10657: 0xC1E0, 10658: 0xC1E4, 10659: 0xC1E8, 10660: 0xC1F0, 10661: 0xC1F1, 10662: 0xC1F3, 10663: 0xC1FC, 10664: 0xC1FD, 10665: 0xC200, 10666: 0xC204, 10667: 0xC20C, 10668: 0xC20D, 10669: 0xC20F, 10670: 0xC211, 10671: 0xC218, 10672: 0xC219, 10673: 0xC21C, 10674: 0xC21F, 10675: 0xC220, 10676: 0xC228, 10677: 0xC229, 10678: 0xC22B, 10679: 0xC22D, 10680: 0xD3D7, 10681: 0xD3D9, 10682: 0xD3DA, 10683: 0xD3DB, 10684: 0xD3DC, 10685: 0xD3DD, 10686: 0xD3DE, 10687: 0xD3DF, 10688: 0xD3E0, 10689: 0xD3E2, 10690: 0xD3E4, 10691: 0xD3E5, 10692: 0xD3E6, 10693: 0xD3E7, 10694: 0xD3E8, 10695: 0xD3E9, 10696: 0xD3EA, 10697: 0xD3EB, 10698: 0xD3EE, 10699: 0xD3EF, 10700: 0xD3F1, 10701: 0xD3F2, 10702: 0xD3F3, 10703: 0xD3F5, 10704: 0xD3F6, 10705: 0xD3F7, 10706: 0xD3F8, 10707: 0xD3F9, 10708: 0xD3FA, 10709: 0xD3FB, 10710: 0xD3FE, 10711: 0xD400, 10712: 0xD402, 10713: 0xD403, 10714: 0xD404, 10715: 0xD405, 10716: 0xD406, 10717: 0xD407, 10718: 0xD409, 10719: 0xD40A, 10720: 0xD40B, 10721: 0xD40C, 10722: 0xD40D, 10723: 0xD40E, 10724: 0xD40F, 10725: 0xD410, 10726: 0xD411, 10727: 0xD412, 10728: 0xD413, 10729: 0xD414, 10730: 0xD415, 10731: 0xD416, 10732: 0xD417, 10733: 0xD418, 10734: 0xD419, 10735: 0xD41A, 10736: 0xD41B, 10737: 0xD41C, 10738: 0xD41E, 10739: 0xD41F, 10740: 0xD420, 10741: 0xD421, 10742: 0xD422, 10743: 0xD423, 10744: 0xD424, 10745: 0xD425, 10746: 0xD426, 10747: 0xD427, 10748: 0xD428, 10749: 0xD429, 10750: 0xD42A, 10751: 0xD42B, 10752: 0xD42C, 10753: 0xD42D, 10754: 0xD42E, 10755: 0xD42F, 10756: 0xD430, 10757: 0xD431, 10758: 0xD432, 10759: 0xD433, 10760: 0xD434, 10761: 0xD435, 10762: 0xD436, 10763: 0xD437, 10764: 0xC22F, 10765: 0xC231, 10766: 0xC232, 10767: 0xC234, 10768: 0xC248, 10769: 0xC250, 10770: 0xC251, 10771: 0xC254, 10772: 0xC258, 10773: 0xC260, 10774: 0xC265, 10775: 0xC26C, 10776: 0xC26D, 10777: 0xC270, 10778: 0xC274, 10779: 0xC27C, 10780: 0xC27D, 10781: 0xC27F, 10782: 0xC281, 10783: 0xC288, 10784: 0xC289, 10785: 0xC290, 10786: 0xC298, 10787: 0xC29B, 10788: 0xC29D, 10789: 0xC2A4, 10790: 0xC2A5, 10791: 0xC2A8, 10792: 0xC2AC, 10793: 0xC2AD, 10794: 0xC2B4, 10795: 0xC2B5, 10796: 0xC2B7, 10797: 0xC2B9, 10798: 0xC2DC, 10799: 0xC2DD, 10800: 0xC2E0, 10801: 0xC2E3, 10802: 0xC2E4, 10803: 0xC2EB, 10804: 0xC2EC, 10805: 0xC2ED, 10806: 0xC2EF, 10807: 0xC2F1, 10808: 0xC2F6, 10809: 0xC2F8, 10810: 0xC2F9, 10811: 0xC2FB, 10812: 0xC2FC, 10813: 0xC300, 10814: 0xC308, 10815: 0xC309, 10816: 0xC30C, 10817: 0xC30D, 10818: 0xC313, 10819: 0xC314, 10820: 0xC315, 10821: 0xC318, 10822: 0xC31C, 10823: 0xC324, 10824: 0xC325, 10825: 0xC328, 10826: 0xC329, 10827: 0xC345, 10828: 0xC368, 10829: 0xC369, 10830: 0xC36C, 10831: 0xC370, 10832: 0xC372, 10833: 0xC378, 10834: 0xC379, 10835: 0xC37C, 10836: 0xC37D, 10837: 0xC384, 10838: 0xC388, 10839: 0xC38C, 10840: 0xC3C0, 10841: 0xC3D8, 10842: 0xC3D9, 10843: 0xC3DC, 10844: 0xC3DF, 10845: 0xC3E0, 10846: 0xC3E2, 10847: 0xC3E8, 10848: 0xC3E9, 10849: 0xC3ED, 10850: 0xC3F4, 10851: 0xC3F5, 10852: 0xC3F8, 10853: 0xC408, 10854: 0xC410, 10855: 0xC424, 10856: 0xC42C, 10857: 0xC430, 10858: 0xD438, 10859: 0xD439, 10860: 0xD43A, 10861: 0xD43B, 10862: 0xD43C, 10863: 0xD43D, 10864: 0xD43E, 10865: 0xD43F, 10866: 0xD441, 10867: 0xD442, 10868: 0xD443, 10869: 0xD445, 10870: 0xD446, 10871: 0xD447, 10872: 0xD448, 10873: 0xD449, 10874: 0xD44A, 10875: 0xD44B, 10876: 0xD44C, 10877: 0xD44D, 10878: 0xD44E, 10879: 0xD44F, 10880: 0xD450, 10881: 0xD451, 10882: 0xD452, 10883: 0xD453, 10884: 0xD454, 10885: 0xD455, 10886: 0xD456, 10887: 0xD457, 10888: 0xD458, 10889: 0xD459, 10890: 0xD45A, 10891: 0xD45B, 10892: 0xD45D, 10893: 0xD45E, 10894: 0xD45F, 10895: 0xD461, 10896: 0xD462, 10897: 0xD463, 10898: 0xD465, 10899: 0xD466, 10900: 0xD467, 10901: 0xD468, 10902: 0xD469, 10903: 0xD46A, 10904: 0xD46B, 10905: 0xD46C, 10906: 0xD46E, 10907: 0xD470, 10908: 0xD471, 10909: 0xD472, 10910: 0xD473, 10911: 0xD474, 10912: 0xD475, 10913: 0xD476, 10914: 0xD477, 10915: 0xD47A, 10916: 0xD47B, 10917: 0xD47D, 10918: 0xD47E, 10919: 0xD481, 10920: 0xD483, 10921: 0xD484, 10922: 0xD485, 10923: 0xD486, 10924: 0xD487, 10925: 0xD48A, 10926: 0xD48C, 10927: 0xD48E, 10928: 0xD48F, 10929: 0xD490, 10930: 0xD491, 10931: 0xD492, 10932: 0xD493, 10933: 0xD495, 10934: 0xD496, 10935: 0xD497, 10936: 0xD498, 10937: 0xD499, 10938: 0xD49A, 10939: 0xD49B, 10940: 0xD49C, 10941: 0xD49D, 10942: 0xC434, 10943: 0xC43C, 10944: 0xC43D, 10945: 0xC448, 10946: 0xC464, 10947: 0xC465, 10948: 0xC468, 10949: 0xC46C, 10950: 0xC474, 10951: 0xC475, 10952: 0xC479, 10953: 0xC480, 10954: 0xC494, 10955: 0xC49C, 10956: 0xC4B8, 10957: 0xC4BC, 10958: 0xC4E9, 10959: 0xC4F0, 10960: 0xC4F1, 10961: 0xC4F4, 10962: 0xC4F8, 10963: 0xC4FA, 10964: 0xC4FF, 10965: 0xC500, 10966: 0xC501, 10967: 0xC50C, 10968: 0xC510, 10969: 0xC514, 10970: 0xC51C, 10971: 0xC528, 10972: 0xC529, 10973: 0xC52C, 10974: 0xC530, 10975: 0xC538, 10976: 0xC539, 10977: 0xC53B, 10978: 0xC53D, 10979: 0xC544, 10980: 0xC545, 10981: 0xC548, 10982: 0xC549, 10983: 0xC54A, 10984: 0xC54C, 10985: 0xC54D, 10986: 0xC54E, 10987: 0xC553, 10988: 0xC554, 10989: 0xC555, 10990: 0xC557, 10991: 0xC558, 10992: 0xC559, 10993: 0xC55D, 10994: 0xC55E, 10995: 0xC560, 10996: 0xC561, 10997: 0xC564, 10998: 0xC568, 10999: 0xC570, 11000: 0xC571, 11001: 0xC573, 11002: 0xC574, 11003: 0xC575, 11004: 0xC57C, 11005: 0xC57D, 11006: 0xC580, 11007: 0xC584, 11008: 0xC587, 11009: 0xC58C, 11010: 0xC58D, 11011: 0xC58F, 11012: 0xC591, 11013: 0xC595, 11014: 0xC597, 11015: 0xC598, 11016: 0xC59C, 11017: 0xC5A0, 11018: 0xC5A9, 11019: 0xC5B4, 11020: 0xC5B5, 11021: 0xC5B8, 11022: 0xC5B9, 11023: 0xC5BB, 11024: 0xC5BC, 11025: 0xC5BD, 11026: 0xC5BE, 11027: 0xC5C4, 11028: 0xC5C5, 11029: 0xC5C6, 11030: 0xC5C7, 11031: 0xC5C8, 11032: 0xC5C9, 11033: 0xC5CA, 11034: 0xC5CC, 11035: 0xC5CE, 11036: 0xD49E, 11037: 0xD49F, 11038: 0xD4A0, 11039: 0xD4A1, 11040: 0xD4A2, 11041: 0xD4A3, 11042: 0xD4A4, 11043: 0xD4A5, 11044: 0xD4A6, 11045: 0xD4A7, 11046: 0xD4A8, 11047: 0xD4AA, 11048: 0xD4AB, 11049: 0xD4AC, 11050: 0xD4AD, 11051: 0xD4AE, 11052: 0xD4AF, 11053: 0xD4B0, 11054: 0xD4B1, 11055: 0xD4B2, 11056: 0xD4B3, 11057: 0xD4B4, 11058: 0xD4B5, 11059: 0xD4B6, 11060: 0xD4B7, 11061: 0xD4B8, 11062: 0xD4B9, 11063: 0xD4BA, 11064: 0xD4BB, 11065: 0xD4BC, 11066: 0xD4BD, 11067: 0xD4BE, 11068: 0xD4BF, 11069: 0xD4C0, 11070: 0xD4C1, 11071: 0xD4C2, 11072: 0xD4C3, 11073: 0xD4C4, 11074: 0xD4C5, 11075: 0xD4C6, 11076: 0xD4C7, 11077: 0xD4C8, 11078: 0xD4C9, 11079: 0xD4CA, 11080: 0xD4CB, 11081: 0xD4CD, 11082: 0xD4CE, 11083: 0xD4CF, 11084: 0xD4D1, 11085: 0xD4D2, 11086: 0xD4D3, 11087: 0xD4D5, 11088: 0xD4D6, 11089: 0xD4D7, 11090: 0xD4D8, 11091: 0xD4D9, 11092: 0xD4DA, 11093: 0xD4DB, 11094: 0xD4DD, 11095: 0xD4DE, 11096: 0xD4E0, 11097: 0xD4E1, 11098: 0xD4E2, 11099: 0xD4E3, 11100: 0xD4E4, 11101: 0xD4E5, 11102: 0xD4E6, 11103: 0xD4E7, 11104: 0xD4E9, 11105: 0xD4EA, 11106: 0xD4EB, 11107: 0xD4ED, 11108: 0xD4EE, 11109: 0xD4EF, 11110: 0xD4F1, 11111: 0xD4F2, 11112: 0xD4F3, 11113: 0xD4F4, 11114: 0xD4F5, 11115: 0xD4F6, 11116: 0xD4F7, 11117: 0xD4F9, 11118: 0xD4FA, 11119: 0xD4FC, 11120: 0xC5D0, 11121: 0xC5D1, 11122: 0xC5D4, 11123: 0xC5D8, 11124: 0xC5E0, 11125: 0xC5E1, 11126: 0xC5E3, 11127: 0xC5E5, 11128: 0xC5EC, 11129: 0xC5ED, 11130: 0xC5EE, 11131: 0xC5F0, 11132: 0xC5F4, 11133: 0xC5F6, 11134: 0xC5F7, 11135: 0xC5FC, 11136: 0xC5FD, 11137: 0xC5FE, 11138: 0xC5FF, 11139: 0xC600, 11140: 0xC601, 11141: 0xC605, 11142: 0xC606, 11143: 0xC607, 11144: 0xC608, 11145: 0xC60C, 11146: 0xC610, 11147: 0xC618, 11148: 0xC619, 11149: 0xC61B, 11150: 0xC61C, 11151: 0xC624, 11152: 0xC625, 11153: 0xC628, 11154: 0xC62C, 11155: 0xC62D, 11156: 0xC62E, 11157: 0xC630, 11158: 0xC633, 11159: 0xC634, 11160: 0xC635, 11161: 0xC637, 11162: 0xC639, 11163: 0xC63B, 11164: 0xC640, 11165: 0xC641, 11166: 0xC644, 11167: 0xC648, 11168: 0xC650, 11169: 0xC651, 11170: 0xC653, 11171: 0xC654, 11172: 0xC655, 11173: 0xC65C, 11174: 0xC65D, 11175: 0xC660, 11176: 0xC66C, 11177: 0xC66F, 11178: 0xC671, 11179: 0xC678, 11180: 0xC679, 11181: 0xC67C, 11182: 0xC680, 11183: 0xC688, 11184: 0xC689, 11185: 0xC68B, 11186: 0xC68D, 11187: 0xC694, 11188: 0xC695, 11189: 0xC698, 11190: 0xC69C, 11191: 0xC6A4, 11192: 0xC6A5, 11193: 0xC6A7, 11194: 0xC6A9, 11195: 0xC6B0, 11196: 0xC6B1, 11197: 0xC6B4, 11198: 0xC6B8, 11199: 0xC6B9, 11200: 0xC6BA, 11201: 0xC6C0, 11202: 0xC6C1, 11203: 0xC6C3, 11204: 0xC6C5, 11205: 0xC6CC, 11206: 0xC6CD, 11207: 0xC6D0, 11208: 0xC6D4, 11209: 0xC6DC, 11210: 0xC6DD, 11211: 0xC6E0, 11212: 0xC6E1, 11213: 0xC6E8, 11214: 0xD4FE, 11215: 0xD4FF, 11216: 0xD500, 11217: 0xD501, 11218: 0xD502, 11219: 0xD503, 11220: 0xD505, 11221: 0xD506, 11222: 0xD507, 11223: 0xD509, 11224: 0xD50A, 11225: 0xD50B, 11226: 0xD50D, 11227: 0xD50E, 11228: 0xD50F, 11229: 0xD510, 11230: 0xD511, 11231: 0xD512, 11232: 0xD513, 11233: 0xD516, 11234: 0xD518, 11235: 0xD519, 11236: 0xD51A, 11237: 0xD51B, 11238: 0xD51C, 11239: 0xD51D, 11240: 0xD51E, 11241: 0xD51F, 11242: 0xD520, 11243: 0xD521, 11244: 0xD522, 11245: 0xD523, 11246: 0xD524, 11247: 0xD525, 11248: 0xD526, 11249: 0xD527, 11250: 0xD528, 11251: 0xD529, 11252: 0xD52A, 11253: 0xD52B, 11254: 0xD52C, 11255: 0xD52D, 11256: 0xD52E, 11257: 0xD52F, 11258: 0xD530, 11259: 0xD531, 11260: 0xD532, 11261: 0xD533, 11262: 0xD534, 11263: 0xD535, 11264: 0xD536, 11265: 0xD537, 11266: 0xD538, 11267: 0xD539, 11268: 0xD53A, 11269: 0xD53B, 11270: 0xD53E, 11271: 0xD53F, 11272: 0xD541, 11273: 0xD542, 11274: 0xD543, 11275: 0xD545, 11276: 0xD546, 11277: 0xD547, 11278: 0xD548, 11279: 0xD549, 11280: 0xD54A, 11281: 0xD54B, 11282: 0xD54E, 11283: 0xD550, 11284: 0xD552, 11285: 0xD553, 11286: 0xD554, 11287: 0xD555, 11288: 0xD556, 11289: 0xD557, 11290: 0xD55A, 11291: 0xD55B, 11292: 0xD55D, 11293: 0xD55E, 11294: 0xD55F, 11295: 0xD561, 11296: 0xD562, 11297: 0xD563, 11298: 0xC6E9, 11299: 0xC6EC, 11300: 0xC6F0, 11301: 0xC6F8, 11302: 0xC6F9, 11303: 0xC6FD, 11304: 0xC704, 11305: 0xC705, 11306: 0xC708, 11307: 0xC70C, 11308: 0xC714, 11309: 0xC715, 11310: 0xC717, 11311: 0xC719, 11312: 0xC720, 11313: 0xC721, 11314: 0xC724, 11315: 0xC728, 11316: 0xC730, 11317: 0xC731, 11318: 0xC733, 11319: 0xC735, 11320: 0xC737, 11321: 0xC73C, 11322: 0xC73D, 11323: 0xC740, 11324: 0xC744, 11325: 0xC74A, 11326: 0xC74C, 11327: 0xC74D, 11328: 0xC74F, 11329: 0xC751, 11330: 0xC752, 11331: 0xC753, 11332: 0xC754, 11333: 0xC755, 11334: 0xC756, 11335: 0xC757, 11336: 0xC758, 11337: 0xC75C, 11338: 0xC760, 11339: 0xC768, 11340: 0xC76B, 11341: 0xC774, 11342: 0xC775, 11343: 0xC778, 11344: 0xC77C, 11345: 0xC77D, 11346: 0xC77E, 11347: 0xC783, 11348: 0xC784, 11349: 0xC785, 11350: 0xC787, 11351: 0xC788, 11352: 0xC789, 11353: 0xC78A, 11354: 0xC78E, 11355: 0xC790, 11356: 0xC791, 11357: 0xC794, 11358: 0xC796, 11359: 0xC797, 11360: 0xC798, 11361: 0xC79A, 11362: 0xC7A0, 11363: 0xC7A1, 11364: 0xC7A3, 11365: 0xC7A4, 11366: 0xC7A5, 11367: 0xC7A6, 11368: 0xC7AC, 11369: 0xC7AD, 11370: 0xC7B0, 11371: 0xC7B4, 11372: 0xC7BC, 11373: 0xC7BD, 11374: 0xC7BF, 11375: 0xC7C0, 11376: 0xC7C1, 11377: 0xC7C8, 11378: 0xC7C9, 11379: 0xC7CC, 11380: 0xC7CE, 11381: 0xC7D0, 11382: 0xC7D8, 11383: 0xC7DD, 11384: 0xC7E4, 11385: 0xC7E8, 11386: 0xC7EC, 11387: 0xC800, 11388: 0xC801, 11389: 0xC804, 11390: 0xC808, 11391: 0xC80A, 11392: 0xD564, 11393: 0xD566, 11394: 0xD567, 11395: 0xD56A, 11396: 0xD56C, 11397: 0xD56E, 11398: 0xD56F, 11399: 0xD570, 11400: 0xD571, 11401: 0xD572, 11402: 0xD573, 11403: 0xD576, 11404: 0xD577, 11405: 0xD579, 11406: 0xD57A, 11407: 0xD57B, 11408: 0xD57D, 11409: 0xD57E, 11410: 0xD57F, 11411: 0xD580, 11412: 0xD581, 11413: 0xD582, 11414: 0xD583, 11415: 0xD586, 11416: 0xD58A, 11417: 0xD58B, 11418: 0xD58C, 11419: 0xD58D, 11420: 0xD58E, 11421: 0xD58F, 11422: 0xD591, 11423: 0xD592, 11424: 0xD593, 11425: 0xD594, 11426: 0xD595, 11427: 0xD596, 11428: 0xD597, 11429: 0xD598, 11430: 0xD599, 11431: 0xD59A, 11432: 0xD59B, 11433: 0xD59C, 11434: 0xD59D, 11435: 0xD59E, 11436: 0xD59F, 11437: 0xD5A0, 11438: 0xD5A1, 11439: 0xD5A2, 11440: 0xD5A3, 11441: 0xD5A4, 11442: 0xD5A6, 11443: 0xD5A7, 11444: 0xD5A8, 11445: 0xD5A9, 11446: 0xD5AA, 11447: 0xD5AB, 11448: 0xD5AC, 11449: 0xD5AD, 11450: 0xD5AE, 11451: 0xD5AF, 11452: 0xD5B0, 11453: 0xD5B1, 11454: 0xD5B2, 11455: 0xD5B3, 11456: 0xD5B4, 11457: 0xD5B5, 11458: 0xD5B6, 11459: 0xD5B7, 11460: 0xD5B8, 11461: 0xD5B9, 11462: 0xD5BA, 11463: 0xD5BB, 11464: 0xD5BC, 11465: 0xD5BD, 11466: 0xD5BE, 11467: 0xD5BF, 11468: 0xD5C0, 11469: 0xD5C1, 11470: 0xD5C2, 11471: 0xD5C3, 11472: 0xD5C4, 11473: 0xD5C5, 11474: 0xD5C6, 11475: 0xD5C7, 11476: 0xC810, 11477: 0xC811, 11478: 0xC813, 11479: 0xC815, 11480: 0xC816, 11481: 0xC81C, 11482: 0xC81D, 11483: 0xC820, 11484: 0xC824, 11485: 0xC82C, 11486: 0xC82D, 11487: 0xC82F, 11488: 0xC831, 11489: 0xC838, 11490: 0xC83C, 11491: 0xC840, 11492: 0xC848, 11493: 0xC849, 11494: 0xC84C, 11495: 0xC84D, 11496: 0xC854, 11497: 0xC870, 11498: 0xC871, 11499: 0xC874, 11500: 0xC878, 11501: 0xC87A, 11502: 0xC880, 11503: 0xC881, 11504: 0xC883, 11505: 0xC885, 11506: 0xC886, 11507: 0xC887, 11508: 0xC88B, 11509: 0xC88C, 11510: 0xC88D, 11511: 0xC894, 11512: 0xC89D, 11513: 0xC89F, 11514: 0xC8A1, 11515: 0xC8A8, 11516: 0xC8BC, 11517: 0xC8BD, 11518: 0xC8C4, 11519: 0xC8C8, 11520: 0xC8CC, 11521: 0xC8D4, 11522: 0xC8D5, 11523: 0xC8D7, 11524: 0xC8D9, 11525: 0xC8E0, 11526: 0xC8E1, 11527: 0xC8E4, 11528: 0xC8F5, 11529: 0xC8FC, 11530: 0xC8FD, 11531: 0xC900, 11532: 0xC904, 11533: 0xC905, 11534: 0xC906, 11535: 0xC90C, 11536: 0xC90D, 11537: 0xC90F, 11538: 0xC911, 11539: 0xC918, 11540: 0xC92C, 11541: 0xC934, 11542: 0xC950, 11543: 0xC951, 11544: 0xC954, 11545: 0xC958, 11546: 0xC960, 11547: 0xC961, 11548: 0xC963, 11549: 0xC96C, 11550: 0xC970, 11551: 0xC974, 11552: 0xC97C, 11553: 0xC988, 11554: 0xC989, 11555: 0xC98C, 11556: 0xC990, 11557: 0xC998, 11558: 0xC999, 11559: 0xC99B, 11560: 0xC99D, 11561: 0xC9C0, 11562: 0xC9C1, 11563: 0xC9C4, 11564: 0xC9C7, 11565: 0xC9C8, 11566: 0xC9CA, 11567: 0xC9D0, 11568: 0xC9D1, 11569: 0xC9D3, 11570: 0xD5CA, 11571: 0xD5CB, 11572: 0xD5CD, 11573: 0xD5CE, 11574: 0xD5CF, 11575: 0xD5D1, 11576: 0xD5D3, 11577: 0xD5D4, 11578: 0xD5D5, 11579: 0xD5D6, 11580: 0xD5D7, 11581: 0xD5DA, 11582: 0xD5DC, 11583: 0xD5DE, 11584: 0xD5DF, 11585: 0xD5E0, 11586: 0xD5E1, 11587: 0xD5E2, 11588: 0xD5E3, 11589: 0xD5E6, 11590: 0xD5E7, 11591: 0xD5E9, 11592: 0xD5EA, 11593: 0xD5EB, 11594: 0xD5ED, 11595: 0xD5EE, 11596: 0xD5EF, 11597: 0xD5F0, 11598: 0xD5F1, 11599: 0xD5F2, 11600: 0xD5F3, 11601: 0xD5F6, 11602: 0xD5F8, 11603: 0xD5FA, 11604: 0xD5FB, 11605: 0xD5FC, 11606: 0xD5FD, 11607: 0xD5FE, 11608: 0xD5FF, 11609: 0xD602, 11610: 0xD603, 11611: 0xD605, 11612: 0xD606, 11613: 0xD607, 11614: 0xD609, 11615: 0xD60A, 11616: 0xD60B, 11617: 0xD60C, 11618: 0xD60D, 11619: 0xD60E, 11620: 0xD60F, 11621: 0xD612, 11622: 0xD616, 11623: 0xD617, 11624: 0xD618, 11625: 0xD619, 11626: 0xD61A, 11627: 0xD61B, 11628: 0xD61D, 11629: 0xD61E, 11630: 0xD61F, 11631: 0xD621, 11632: 0xD622, 11633: 0xD623, 11634: 0xD625, 11635: 0xD626, 11636: 0xD627, 11637: 0xD628, 11638: 0xD629, 11639: 0xD62A, 11640: 0xD62B, 11641: 0xD62C, 11642: 0xD62E, 11643: 0xD62F, 11644: 0xD630, 11645: 0xD631, 11646: 0xD632, 11647: 0xD633, 11648: 0xD634, 11649: 0xD635, 11650: 0xD636, 11651: 0xD637, 11652: 0xD63A, 11653: 0xD63B, 11654: 0xC9D5, 11655: 0xC9D6, 11656: 0xC9D9, 11657: 0xC9DA, 11658: 0xC9DC, 11659: 0xC9DD, 11660: 0xC9E0, 11661: 0xC9E2, 11662: 0xC9E4, 11663: 0xC9E7, 11664: 0xC9EC, 11665: 0xC9ED, 11666: 0xC9EF, 11667: 0xC9F0, 11668: 0xC9F1, 11669: 0xC9F8, 11670: 0xC9F9, 11671: 0xC9FC, 11672: 0xCA00, 11673: 0xCA08, 11674: 0xCA09, 11675: 0xCA0B, 11676: 0xCA0C, 11677: 0xCA0D, 11678: 0xCA14, 11679: 0xCA18, 11680: 0xCA29, 11681: 0xCA4C, 11682: 0xCA4D, 11683: 0xCA50, 11684: 0xCA54, 11685: 0xCA5C, 11686: 0xCA5D, 11687: 0xCA5F, 11688: 0xCA60, 11689: 0xCA61, 11690: 0xCA68, 11691: 0xCA7D, 11692: 0xCA84, 11693: 0xCA98, 11694: 0xCABC, 11695: 0xCABD, 11696: 0xCAC0, 11697: 0xCAC4, 11698: 0xCACC, 11699: 0xCACD, 11700: 0xCACF, 11701: 0xCAD1, 11702: 0xCAD3, 11703: 0xCAD8, 11704: 0xCAD9, 11705: 0xCAE0, 11706: 0xCAEC, 11707: 0xCAF4, 11708: 0xCB08, 11709: 0xCB10, 11710: 0xCB14, 11711: 0xCB18, 11712: 0xCB20, 11713: 0xCB21, 11714: 0xCB41, 11715: 0xCB48, 11716: 0xCB49, 11717: 0xCB4C, 11718: 0xCB50, 11719: 0xCB58, 11720: 0xCB59, 11721: 0xCB5D, 11722: 0xCB64, 11723: 0xCB78, 11724: 0xCB79, 11725: 0xCB9C, 11726: 0xCBB8, 11727: 0xCBD4, 11728: 0xCBE4, 11729: 0xCBE7, 11730: 0xCBE9, 11731: 0xCC0C, 11732: 0xCC0D, 11733: 0xCC10, 11734: 0xCC14, 11735: 0xCC1C, 11736: 0xCC1D, 11737: 0xCC21, 11738: 0xCC22, 11739: 0xCC27, 11740: 0xCC28, 11741: 0xCC29, 11742: 0xCC2C, 11743: 0xCC2E, 11744: 0xCC30, 11745: 0xCC38, 11746: 0xCC39, 11747: 0xCC3B, 11748: 0xD63D, 11749: 0xD63E, 11750: 0xD63F, 11751: 0xD641, 11752: 0xD642, 11753: 0xD643, 11754: 0xD644, 11755: 0xD646, 11756: 0xD647, 11757: 0xD64A, 11758: 0xD64C, 11759: 0xD64E, 11760: 0xD64F, 11761: 0xD650, 11762: 0xD652, 11763: 0xD653, 11764: 0xD656, 11765: 0xD657, 11766: 0xD659, 11767: 0xD65A, 11768: 0xD65B, 11769: 0xD65D, 11770: 0xD65E, 11771: 0xD65F, 11772: 0xD660, 11773: 0xD661, 11774: 0xD662, 11775: 0xD663, 11776: 0xD664, 11777: 0xD665, 11778: 0xD666, 11779: 0xD668, 11780: 0xD66A, 11781: 0xD66B, 11782: 0xD66C, 11783: 0xD66D, 11784: 0xD66E, 11785: 0xD66F, 11786: 0xD672, 11787: 0xD673, 11788: 0xD675, 11789: 0xD676, 11790: 0xD677, 11791: 0xD678, 11792: 0xD679, 11793: 0xD67A, 11794: 0xD67B, 11795: 0xD67C, 11796: 0xD67D, 11797: 0xD67E, 11798: 0xD67F, 11799: 0xD680, 11800: 0xD681, 11801: 0xD682, 11802: 0xD684, 11803: 0xD686, 11804: 0xD687, 11805: 0xD688, 11806: 0xD689, 11807: 0xD68A, 11808: 0xD68B, 11809: 0xD68E, 11810: 0xD68F, 11811: 0xD691, 11812: 0xD692, 11813: 0xD693, 11814: 0xD695, 11815: 0xD696, 11816: 0xD697, 11817: 0xD698, 11818: 0xD699, 11819: 0xD69A, 11820: 0xD69B, 11821: 0xD69C, 11822: 0xD69E, 11823: 0xD6A0, 11824: 0xD6A2, 11825: 0xD6A3, 11826: 0xD6A4, 11827: 0xD6A5, 11828: 0xD6A6, 11829: 0xD6A7, 11830: 0xD6A9, 11831: 0xD6AA, 11832: 0xCC3C, 11833: 0xCC3D, 11834: 0xCC3E, 11835: 0xCC44, 11836: 0xCC45, 11837: 0xCC48, 11838: 0xCC4C, 11839: 0xCC54, 11840: 0xCC55, 11841: 0xCC57, 11842: 0xCC58, 11843: 0xCC59, 11844: 0xCC60, 11845: 0xCC64, 11846: 0xCC66, 11847: 0xCC68, 11848: 0xCC70, 11849: 0xCC75, 11850: 0xCC98, 11851: 0xCC99, 11852: 0xCC9C, 11853: 0xCCA0, 11854: 0xCCA8, 11855: 0xCCA9, 11856: 0xCCAB, 11857: 0xCCAC, 11858: 0xCCAD, 11859: 0xCCB4, 11860: 0xCCB5, 11861: 0xCCB8, 11862: 0xCCBC, 11863: 0xCCC4, 11864: 0xCCC5, 11865: 0xCCC7, 11866: 0xCCC9, 11867: 0xCCD0, 11868: 0xCCD4, 11869: 0xCCE4, 11870: 0xCCEC, 11871: 0xCCF0, 11872: 0xCD01, 11873: 0xCD08, 11874: 0xCD09, 11875: 0xCD0C, 11876: 0xCD10, 11877: 0xCD18, 11878: 0xCD19, 11879: 0xCD1B, 11880: 0xCD1D, 11881: 0xCD24, 11882: 0xCD28, 11883: 0xCD2C, 11884: 0xCD39, 11885: 0xCD5C, 11886: 0xCD60, 11887: 0xCD64, 11888: 0xCD6C, 11889: 0xCD6D, 11890: 0xCD6F, 11891: 0xCD71, 11892: 0xCD78, 11893: 0xCD88, 11894: 0xCD94, 11895: 0xCD95, 11896: 0xCD98, 11897: 0xCD9C, 11898: 0xCDA4, 11899: 0xCDA5, 11900: 0xCDA7, 11901: 0xCDA9, 11902: 0xCDB0, 11903: 0xCDC4, 11904: 0xCDCC, 11905: 0xCDD0, 11906: 0xCDE8, 11907: 0xCDEC, 11908: 0xCDF0, 11909: 0xCDF8, 11910: 0xCDF9, 11911: 0xCDFB, 11912: 0xCDFD, 11913: 0xCE04, 11914: 0xCE08, 11915: 0xCE0C, 11916: 0xCE14, 11917: 0xCE19, 11918: 0xCE20, 11919: 0xCE21, 11920: 0xCE24, 11921: 0xCE28, 11922: 0xCE30, 11923: 0xCE31, 11924: 0xCE33, 11925: 0xCE35, 11926: 0xD6AB, 11927: 0xD6AD, 11928: 0xD6AE, 11929: 0xD6AF, 11930: 0xD6B1, 11931: 0xD6B2, 11932: 0xD6B3, 11933: 0xD6B4, 11934: 0xD6B5, 11935: 0xD6B6, 11936: 0xD6B7, 11937: 0xD6B8, 11938: 0xD6BA, 11939: 0xD6BC, 11940: 0xD6BD, 11941: 0xD6BE, 11942: 0xD6BF, 11943: 0xD6C0, 11944: 0xD6C1, 11945: 0xD6C2, 11946: 0xD6C3, 11947: 0xD6C6, 11948: 0xD6C7, 11949: 0xD6C9, 11950: 0xD6CA, 11951: 0xD6CB, 11952: 0xD6CD, 11953: 0xD6CE, 11954: 0xD6CF, 11955: 0xD6D0, 11956: 0xD6D2, 11957: 0xD6D3, 11958: 0xD6D5, 11959: 0xD6D6, 11960: 0xD6D8, 11961: 0xD6DA, 11962: 0xD6DB, 11963: 0xD6DC, 11964: 0xD6DD, 11965: 0xD6DE, 11966: 0xD6DF, 11967: 0xD6E1, 11968: 0xD6E2, 11969: 0xD6E3, 11970: 0xD6E5, 11971: 0xD6E6, 11972: 0xD6E7, 11973: 0xD6E9, 11974: 0xD6EA, 11975: 0xD6EB, 11976: 0xD6EC, 11977: 0xD6ED, 11978: 0xD6EE, 11979: 0xD6EF, 11980: 0xD6F1, 11981: 0xD6F2, 11982: 0xD6F3, 11983: 0xD6F4, 11984: 0xD6F6, 11985: 0xD6F7, 11986: 0xD6F8, 11987: 0xD6F9, 11988: 0xD6FA, 11989: 0xD6FB, 11990: 0xD6FE, 11991: 0xD6FF, 11992: 0xD701, 11993: 0xD702, 11994: 0xD703, 11995: 0xD705, 11996: 0xD706, 11997: 0xD707, 11998: 0xD708, 11999: 0xD709, 12000: 0xD70A, 12001: 0xD70B, 12002: 0xD70C, 12003: 0xD70D, 12004: 0xD70E, 12005: 0xD70F, 12006: 0xD710, 12007: 0xD712, 12008: 0xD713, 12009: 0xD714, 12010: 0xCE58, 12011: 0xCE59, 12012: 0xCE5C, 12013: 0xCE5F, 12014: 0xCE60, 12015: 0xCE61, 12016: 0xCE68, 12017: 0xCE69, 12018: 0xCE6B, 12019: 0xCE6D, 12020: 0xCE74, 12021: 0xCE75, 12022: 0xCE78, 12023: 0xCE7C, 12024: 0xCE84, 12025: 0xCE85, 12026: 0xCE87, 12027: 0xCE89, 12028: 0xCE90, 12029: 0xCE91, 12030: 0xCE94, 12031: 0xCE98, 12032: 0xCEA0, 12033: 0xCEA1, 12034: 0xCEA3, 12035: 0xCEA4, 12036: 0xCEA5, 12037: 0xCEAC, 12038: 0xCEAD, 12039: 0xCEC1, 12040: 0xCEE4, 12041: 0xCEE5, 12042: 0xCEE8, 12043: 0xCEEB, 12044: 0xCEEC, 12045: 0xCEF4, 12046: 0xCEF5, 12047: 0xCEF7, 12048: 0xCEF8, 12049: 0xCEF9, 12050: 0xCF00, 12051: 0xCF01, 12052: 0xCF04, 12053: 0xCF08, 12054: 0xCF10, 12055: 0xCF11, 12056: 0xCF13, 12057: 0xCF15, 12058: 0xCF1C, 12059: 0xCF20, 12060: 0xCF24, 12061: 0xCF2C, 12062: 0xCF2D, 12063: 0xCF2F, 12064: 0xCF30, 12065: 0xCF31, 12066: 0xCF38, 12067: 0xCF54, 12068: 0xCF55, 12069: 0xCF58, 12070: 0xCF5C, 12071: 0xCF64, 12072: 0xCF65, 12073: 0xCF67, 12074: 0xCF69, 12075: 0xCF70, 12076: 0xCF71, 12077: 0xCF74, 12078: 0xCF78, 12079: 0xCF80, 12080: 0xCF85, 12081: 0xCF8C, 12082: 0xCFA1, 12083: 0xCFA8, 12084: 0xCFB0, 12085: 0xCFC4, 12086: 0xCFE0, 12087: 0xCFE1, 12088: 0xCFE4, 12089: 0xCFE8, 12090: 0xCFF0, 12091: 0xCFF1, 12092: 0xCFF3, 12093: 0xCFF5, 12094: 0xCFFC, 12095: 0xD000, 12096: 0xD004, 12097: 0xD011, 12098: 0xD018, 12099: 0xD02D, 12100: 0xD034, 12101: 0xD035, 12102: 0xD038, 12103: 0xD03C, 12104: 0xD715, 12105: 0xD716, 12106: 0xD717, 12107: 0xD71A, 12108: 0xD71B, 12109: 0xD71D, 12110: 0xD71E, 12111: 0xD71F, 12112: 0xD721, 12113: 0xD722, 12114: 0xD723, 12115: 0xD724, 12116: 0xD725, 12117: 0xD726, 12118: 0xD727, 12119: 0xD72A, 12120: 0xD72C, 12121: 0xD72E, 12122: 0xD72F, 12123: 0xD730, 12124: 0xD731, 12125: 0xD732, 12126: 0xD733, 12127: 0xD736, 12128: 0xD737, 12129: 0xD739, 12130: 0xD73A, 12131: 0xD73B, 12132: 0xD73D, 12133: 0xD73E, 12134: 0xD73F, 12135: 0xD740, 12136: 0xD741, 12137: 0xD742, 12138: 0xD743, 12139: 0xD745, 12140: 0xD746, 12141: 0xD748, 12142: 0xD74A, 12143: 0xD74B, 12144: 0xD74C, 12145: 0xD74D, 12146: 0xD74E, 12147: 0xD74F, 12148: 0xD752, 12149: 0xD753, 12150: 0xD755, 12151: 0xD75A, 12152: 0xD75B, 12153: 0xD75C, 12154: 0xD75D, 12155: 0xD75E, 12156: 0xD75F, 12157: 0xD762, 12158: 0xD764, 12159: 0xD766, 12160: 0xD767, 12161: 0xD768, 12162: 0xD76A, 12163: 0xD76B, 12164: 0xD76D, 12165: 0xD76E, 12166: 0xD76F, 12167: 0xD771, 12168: 0xD772, 12169: 0xD773, 12170: 0xD775, 12171: 0xD776, 12172: 0xD777, 12173: 0xD778, 12174: 0xD779, 12175: 0xD77A, 12176: 0xD77B, 12177: 0xD77E, 12178: 0xD77F, 12179: 0xD780, 12180: 0xD782, 12181: 0xD783, 12182: 0xD784, 12183: 0xD785, 12184: 0xD786, 12185: 0xD787, 12186: 0xD78A, 12187: 0xD78B, 12188: 0xD044, 12189: 0xD045, 12190: 0xD047, 12191: 0xD049, 12192: 0xD050, 12193: 0xD054, 12194: 0xD058, 12195: 0xD060, 12196: 0xD06C, 12197: 0xD06D, 12198: 0xD070, 12199: 0xD074, 12200: 0xD07C, 12201: 0xD07D, 12202: 0xD081, 12203: 0xD0A4, 12204: 0xD0A5, 12205: 0xD0A8, 12206: 0xD0AC, 12207: 0xD0B4, 12208: 0xD0B5, 12209: 0xD0B7, 12210: 0xD0B9, 12211: 0xD0C0, 12212: 0xD0C1, 12213: 0xD0C4, 12214: 0xD0C8, 12215: 0xD0C9, 12216: 0xD0D0, 12217: 0xD0D1, 12218: 0xD0D3, 12219: 0xD0D4, 12220: 0xD0D5, 12221: 0xD0DC, 12222: 0xD0DD, 12223: 0xD0E0, 12224: 0xD0E4, 12225: 0xD0EC, 12226: 0xD0ED, 12227: 0xD0EF, 12228: 0xD0F0, 12229: 0xD0F1, 12230: 0xD0F8, 12231: 0xD10D, 12232: 0xD130, 12233: 0xD131, 12234: 0xD134, 12235: 0xD138, 12236: 0xD13A, 12237: 0xD140, 12238: 0xD141, 12239: 0xD143, 12240: 0xD144, 12241: 0xD145, 12242: 0xD14C, 12243: 0xD14D, 12244: 0xD150, 12245: 0xD154, 12246: 0xD15C, 12247: 0xD15D, 12248: 0xD15F, 12249: 0xD161, 12250: 0xD168, 12251: 0xD16C, 12252: 0xD17C, 12253: 0xD184, 12254: 0xD188, 12255: 0xD1A0, 12256: 0xD1A1, 12257: 0xD1A4, 12258: 0xD1A8, 12259: 0xD1B0, 12260: 0xD1B1, 12261: 0xD1B3, 12262: 0xD1B5, 12263: 0xD1BA, 12264: 0xD1BC, 12265: 0xD1C0, 12266: 0xD1D8, 12267: 0xD1F4, 12268: 0xD1F8, 12269: 0xD207, 12270: 0xD209, 12271: 0xD210, 12272: 0xD22C, 12273: 0xD22D, 12274: 0xD230, 12275: 0xD234, 12276: 0xD23C, 12277: 0xD23D, 12278: 0xD23F, 12279: 0xD241, 12280: 0xD248, 12281: 0xD25C, 12282: 0xD78D, 12283: 0xD78E, 12284: 0xD78F, 12285: 0xD791, 12286: 0xD792, 12287: 0xD793, 12288: 0xD794, 12289: 0xD795, 12290: 0xD796, 12291: 0xD797, 12292: 0xD79A, 12293: 0xD79C, 12294: 0xD79E, 12295: 0xD79F, 12296: 0xD7A0, 12297: 0xD7A1, 12298: 0xD7A2, 12299: 0xD7A3, 12366: 0xD264, 12367: 0xD280, 12368: 0xD281, 12369: 0xD284, 12370: 0xD288, 12371: 0xD290, 12372: 0xD291, 12373: 0xD295, 12374: 0xD29C, 12375: 0xD2A0, 12376: 0xD2A4, 12377: 0xD2AC, 12378: 0xD2B1, 12379: 0xD2B8, 12380: 0xD2B9, 12381: 0xD2BC, 12382: 0xD2BF, 12383: 0xD2C0, 12384: 0xD2C2, 12385: 0xD2C8, 12386: 0xD2C9, 12387: 0xD2CB, 12388: 0xD2D4, 12389: 0xD2D8, 12390: 0xD2DC, 12391: 0xD2E4, 12392: 0xD2E5, 12393: 0xD2F0, 12394: 0xD2F1, 12395: 0xD2F4, 12396: 0xD2F8, 12397: 0xD300, 12398: 0xD301, 12399: 0xD303, 12400: 0xD305, 12401: 0xD30C, 12402: 0xD30D, 12403: 0xD30E, 12404: 0xD310, 12405: 0xD314, 12406: 0xD316, 12407: 0xD31C, 12408: 0xD31D, 12409: 0xD31F, 12410: 0xD320, 12411: 0xD321, 12412: 0xD325, 12413: 0xD328, 12414: 0xD329, 12415: 0xD32C, 12416: 0xD330, 12417: 0xD338, 12418: 0xD339, 12419: 0xD33B, 12420: 0xD33C, 12421: 0xD33D, 12422: 0xD344, 12423: 0xD345, 12424: 0xD37C, 12425: 0xD37D, 12426: 0xD380, 12427: 0xD384, 12428: 0xD38C, 12429: 0xD38D, 12430: 0xD38F, 12431: 0xD390, 12432: 0xD391, 12433: 0xD398, 12434: 0xD399, 12435: 0xD39C, 12436: 0xD3A0, 12437: 0xD3A8, 12438: 0xD3A9, 12439: 0xD3AB, 12440: 0xD3AD, 12441: 0xD3B4, 12442: 0xD3B8, 12443: 0xD3BC, 12444: 0xD3C4, 12445: 0xD3C5, 12446: 0xD3C8, 12447: 0xD3C9, 12448: 0xD3D0, 12449: 0xD3D8, 12450: 0xD3E1, 12451: 0xD3E3, 12452: 0xD3EC, 12453: 0xD3ED, 12454: 0xD3F0, 12455: 0xD3F4, 12456: 0xD3FC, 12457: 0xD3FD, 12458: 0xD3FF, 12459: 0xD401, 12460: 0xD408, 12461: 0xD41D, 12462: 0xD440, 12463: 0xD444, 12464: 0xD45C, 12465: 0xD460, 12466: 0xD464, 12467: 0xD46D, 12468: 0xD46F, 12469: 0xD478, 12470: 0xD479, 12471: 0xD47C, 12472: 0xD47F, 12473: 0xD480, 12474: 0xD482, 12475: 0xD488, 12476: 0xD489, 12477: 0xD48B, 12478: 0xD48D, 12479: 0xD494, 12480: 0xD4A9, 12481: 0xD4CC, 12482: 0xD4D0, 12483: 0xD4D4, 12484: 0xD4DC, 12485: 0xD4DF, 12486: 0xD4E8, 12487: 0xD4EC, 12488: 0xD4F0, 12489: 0xD4F8, 12490: 0xD4FB, 12491: 0xD4FD, 12492: 0xD504, 12493: 0xD508, 12494: 0xD50C, 12495: 0xD514, 12496: 0xD515, 12497: 0xD517, 12498: 0xD53C, 12499: 0xD53D, 12500: 0xD540, 12501: 0xD544, 12502: 0xD54C, 12503: 0xD54D, 12504: 0xD54F, 12505: 0xD551, 12506: 0xD558, 12507: 0xD559, 12508: 0xD55C, 12509: 0xD560, 12510: 0xD565, 12511: 0xD568, 12512: 0xD569, 12513: 0xD56B, 12514: 0xD56D, 12515: 0xD574, 12516: 0xD575, 12517: 0xD578, 12518: 0xD57C, 12519: 0xD584, 12520: 0xD585, 12521: 0xD587, 12522: 0xD588, 12523: 0xD589, 12524: 0xD590, 12525: 0xD5A5, 12526: 0xD5C8, 12527: 0xD5C9, 12528: 0xD5CC, 12529: 0xD5D0, 12530: 0xD5D2, 12531: 0xD5D8, 12532: 0xD5D9, 12533: 0xD5DB, 12534: 0xD5DD, 12535: 0xD5E4, 12536: 0xD5E5, 12537: 0xD5E8, 12538: 0xD5EC, 12539: 0xD5F4, 12540: 0xD5F5, 12541: 0xD5F7, 12542: 0xD5F9, 12543: 0xD600, 12544: 0xD601, 12545: 0xD604, 12546: 0xD608, 12547: 0xD610, 12548: 0xD611, 12549: 0xD613, 12550: 0xD614, 12551: 0xD615, 12552: 0xD61C, 12553: 0xD620, 12554: 0xD624, 12555: 0xD62D, 12556: 0xD638, 12557: 0xD639, 12558: 0xD63C, 12559: 0xD640, 12560: 0xD645, 12561: 0xD648, 12562: 0xD649, 12563: 0xD64B, 12564: 0xD64D, 12565: 0xD651, 12566: 0xD654, 12567: 0xD655, 12568: 0xD658, 12569: 0xD65C, 12570: 0xD667, 12571: 0xD669, 12572: 0xD670, 12573: 0xD671, 12574: 0xD674, 12575: 0xD683, 12576: 0xD685, 12577: 0xD68C, 12578: 0xD68D, 12579: 0xD690, 12580: 0xD694, 12581: 0xD69D, 12582: 0xD69F, 12583: 0xD6A1, 12584: 0xD6A8, 12585: 0xD6AC, 12586: 0xD6B0, 12587: 0xD6B9, 12588: 0xD6BB, 12589: 0xD6C4, 12590: 0xD6C5, 12591: 0xD6C8, 12592: 0xD6CC, 12593: 0xD6D1, 12594: 0xD6D4, 12595: 0xD6D7, 12596: 0xD6D9, 12597: 0xD6E0, 12598: 0xD6E4, 12599: 0xD6E8, 12600: 0xD6F0, 12601: 0xD6F5, 12602: 0xD6FC, 12603: 0xD6FD, 12604: 0xD700, 12605: 0xD704, 12606: 0xD711, 12607: 0xD718, 12608: 0xD719, 12609: 0xD71C, 12610: 0xD720, 12611: 0xD728, 12612: 0xD729, 12613: 0xD72B, 12614: 0xD72D, 12615: 0xD734, 12616: 0xD735, 12617: 0xD738, 12618: 0xD73C, 12619: 0xD744, 12620: 0xD747, 12621: 0xD749, 12622: 0xD750, 12623: 0xD751, 12624: 0xD754, 12625: 0xD756, 12626: 0xD757, 12627: 0xD758, 12628: 0xD759, 12629: 0xD760, 12630: 0xD761, 12631: 0xD763, 12632: 0xD765, 12633: 0xD769, 12634: 0xD76C, 12635: 0xD770, 12636: 0xD774, 12637: 0xD77C, 12638: 0xD77D, 12639: 0xD781, 12640: 0xD788, 12641: 0xD789, 12642: 0xD78C, 12643: 0xD790, 12644: 0xD798, 12645: 0xD799, 12646: 0xD79B, 12647: 0xD79D, 12742: 0x4F3D, 12743: 0x4F73, 12744: 0x5047, 12745: 0x50F9, 12746: 0x52A0, 12747: 0x53EF, 12748: 0x5475, 12749: 0x54E5, 12750: 0x5609, 12751: 0x5AC1, 12752: 0x5BB6, 12753: 0x6687, 12754: 0x67B6, 12755: 0x67B7, 12756: 0x67EF, 12757: 0x6B4C, 12758: 0x73C2, 12759: 0x75C2, 12760: 0x7A3C, 12761: 0x82DB, 12762: 0x8304, 12763: 0x8857, 12764: 0x8888, 12765: 0x8A36, 12766: 0x8CC8, 12767: 0x8DCF, 12768: 0x8EFB, 12769: 0x8FE6, 12770: 0x99D5, 12771: 0x523B, 12772: 0x5374, 12773: 0x5404, 12774: 0x606A, 12775: 0x6164, 12776: 0x6BBC, 12777: 0x73CF, 12778: 0x811A, 12779: 0x89BA, 12780: 0x89D2, 12781: 0x95A3, 12782: 0x4F83, 12783: 0x520A, 12784: 0x58BE, 12785: 0x5978, 12786: 0x59E6, 12787: 0x5E72, 12788: 0x5E79, 12789: 0x61C7, 12790: 0x63C0, 12791: 0x6746, 12792: 0x67EC, 12793: 0x687F, 12794: 0x6F97, 12795: 0x764E, 12796: 0x770B, 12797: 0x78F5, 12798: 0x7A08, 12799: 0x7AFF, 12800: 0x7C21, 12801: 0x809D, 12802: 0x826E, 12803: 0x8271, 12804: 0x8AEB, 12805: 0x9593, 12806: 0x4E6B, 12807: 0x559D, 12808: 0x66F7, 12809: 0x6E34, 12810: 0x78A3, 12811: 0x7AED, 12812: 0x845B, 12813: 0x8910, 12814: 0x874E, 12815: 0x97A8, 12816: 0x52D8, 12817: 0x574E, 12818: 0x582A, 12819: 0x5D4C, 12820: 0x611F, 12821: 0x61BE, 12822: 0x6221, 12823: 0x6562, 12824: 0x67D1, 12825: 0x6A44, 12826: 0x6E1B, 12827: 0x7518, 12828: 0x75B3, 12829: 0x76E3, 12830: 0x77B0, 12831: 0x7D3A, 12832: 0x90AF, 12833: 0x9451, 12834: 0x9452, 12835: 0x9F95, 12836: 0x5323, 12837: 0x5CAC, 12838: 0x7532, 12839: 0x80DB, 12840: 0x9240, 12841: 0x9598, 12842: 0x525B, 12843: 0x5808, 12844: 0x59DC, 12845: 0x5CA1, 12846: 0x5D17, 12847: 0x5EB7, 12848: 0x5F3A, 12849: 0x5F4A, 12850: 0x6177, 12851: 0x6C5F, 12852: 0x757A, 12853: 0x7586, 12854: 0x7CE0, 12855: 0x7D73, 12856: 0x7DB1, 12857: 0x7F8C, 12858: 0x8154, 12859: 0x8221, 12860: 0x8591, 12861: 0x8941, 12862: 0x8B1B, 12863: 0x92FC, 12864: 0x964D, 12865: 0x9C47, 12866: 0x4ECB, 12867: 0x4EF7, 12868: 0x500B, 12869: 0x51F1, 12870: 0x584F, 12871: 0x6137, 12872: 0x613E, 12873: 0x6168, 12874: 0x6539, 12875: 0x69EA, 12876: 0x6F11, 12877: 0x75A5, 12878: 0x7686, 12879: 0x76D6, 12880: 0x7B87, 12881: 0x82A5, 12882: 0x84CB, 12883: 0xF900, 12884: 0x93A7, 12885: 0x958B, 12886: 0x5580, 12887: 0x5BA2, 12888: 0x5751, 12889: 0xF901, 12890: 0x7CB3, 12891: 0x7FB9, 12892: 0x91B5, 12893: 0x5028, 12894: 0x53BB, 12895: 0x5C45, 12896: 0x5DE8, 12897: 0x62D2, 12898: 0x636E, 12899: 0x64DA, 12900: 0x64E7, 12901: 0x6E20, 12902: 0x70AC, 12903: 0x795B, 12904: 0x8DDD, 12905: 0x8E1E, 12906: 0xF902, 12907: 0x907D, 12908: 0x9245, 12909: 0x92F8, 12910: 0x4E7E, 12911: 0x4EF6, 12912: 0x5065, 12913: 0x5DFE, 12914: 0x5EFA, 12915: 0x6106, 12916: 0x6957, 12917: 0x8171, 12918: 0x8654, 12919: 0x8E47, 12920: 0x9375, 12921: 0x9A2B, 12922: 0x4E5E, 12923: 0x5091, 12924: 0x6770, 12925: 0x6840, 12926: 0x5109, 12927: 0x528D, 12928: 0x5292, 12929: 0x6AA2, 12930: 0x77BC, 12931: 0x9210, 12932: 0x9ED4, 12933: 0x52AB, 12934: 0x602F, 12935: 0x8FF2, 12936: 0x5048, 12937: 0x61A9, 12938: 0x63ED, 12939: 0x64CA, 12940: 0x683C, 12941: 0x6A84, 12942: 0x6FC0, 12943: 0x8188, 12944: 0x89A1, 12945: 0x9694, 12946: 0x5805, 12947: 0x727D, 12948: 0x72AC, 12949: 0x7504, 12950: 0x7D79, 12951: 0x7E6D, 12952: 0x80A9, 12953: 0x898B, 12954: 0x8B74, 12955: 0x9063, 12956: 0x9D51, 12957: 0x6289, 12958: 0x6C7A, 12959: 0x6F54, 12960: 0x7D50, 12961: 0x7F3A, 12962: 0x8A23, 12963: 0x517C, 12964: 0x614A, 12965: 0x7B9D, 12966: 0x8B19, 12967: 0x9257, 12968: 0x938C, 12969: 0x4EAC, 12970: 0x4FD3, 12971: 0x501E, 12972: 0x50BE, 12973: 0x5106, 12974: 0x52C1, 12975: 0x52CD, 12976: 0x537F, 12977: 0x5770, 12978: 0x5883, 12979: 0x5E9A, 12980: 0x5F91, 12981: 0x6176, 12982: 0x61AC, 12983: 0x64CE, 12984: 0x656C, 12985: 0x666F, 12986: 0x66BB, 12987: 0x66F4, 12988: 0x6897, 12989: 0x6D87, 12990: 0x7085, 12991: 0x70F1, 12992: 0x749F, 12993: 0x74A5, 12994: 0x74CA, 12995: 0x75D9, 12996: 0x786C, 12997: 0x78EC, 12998: 0x7ADF, 12999: 0x7AF6, 13000: 0x7D45, 13001: 0x7D93, 13002: 0x8015, 13003: 0x803F, 13004: 0x811B, 13005: 0x8396, 13006: 0x8B66, 13007: 0x8F15, 13008: 0x9015, 13009: 0x93E1, 13010: 0x9803, 13011: 0x9838, 13012: 0x9A5A, 13013: 0x9BE8, 13014: 0x4FC2, 13015: 0x5553, 13016: 0x583A, 13017: 0x5951, 13018: 0x5B63, 13019: 0x5C46, 13020: 0x60B8, 13021: 0x6212, 13022: 0x6842, 13023: 0x68B0, 13024: 0x68E8, 13025: 0x6EAA, 13026: 0x754C, 13027: 0x7678, 13028: 0x78CE, 13029: 0x7A3D, 13030: 0x7CFB, 13031: 0x7E6B, 13032: 0x7E7C, 13033: 0x8A08, 13034: 0x8AA1, 13035: 0x8C3F, 13036: 0x968E, 13037: 0x9DC4, 13038: 0x53E4, 13039: 0x53E9, 13040: 0x544A, 13041: 0x5471, 13042: 0x56FA, 13043: 0x59D1, 13044: 0x5B64, 13045: 0x5C3B, 13046: 0x5EAB, 13047: 0x62F7, 13048: 0x6537, 13049: 0x6545, 13050: 0x6572, 13051: 0x66A0, 13052: 0x67AF, 13053: 0x69C1, 13054: 0x6CBD, 13055: 0x75FC, 13056: 0x7690, 13057: 0x777E, 13058: 0x7A3F, 13059: 0x7F94, 13060: 0x8003, 13061: 0x80A1, 13062: 0x818F, 13063: 0x82E6, 13064: 0x82FD, 13065: 0x83F0, 13066: 0x85C1, 13067: 0x8831, 13068: 0x88B4, 13069: 0x8AA5, 13070: 0xF903, 13071: 0x8F9C, 13072: 0x932E, 13073: 0x96C7, 13074: 0x9867, 13075: 0x9AD8, 13076: 0x9F13, 13077: 0x54ED, 13078: 0x659B, 13079: 0x66F2, 13080: 0x688F, 13081: 0x7A40, 13082: 0x8C37, 13083: 0x9D60, 13084: 0x56F0, 13085: 0x5764, 13086: 0x5D11, 13087: 0x6606, 13088: 0x68B1, 13089: 0x68CD, 13090: 0x6EFE, 13091: 0x7428, 13092: 0x889E, 13093: 0x9BE4, 13094: 0x6C68, 13095: 0xF904, 13096: 0x9AA8, 13097: 0x4F9B, 13098: 0x516C, 13099: 0x5171, 13100: 0x529F, 13101: 0x5B54, 13102: 0x5DE5, 13103: 0x6050, 13104: 0x606D, 13105: 0x62F1, 13106: 0x63A7, 13107: 0x653B, 13108: 0x73D9, 13109: 0x7A7A, 13110: 0x86A3, 13111: 0x8CA2, 13112: 0x978F, 13113: 0x4E32, 13114: 0x5BE1, 13115: 0x6208, 13116: 0x679C, 13117: 0x74DC, 13118: 0x79D1, 13119: 0x83D3, 13120: 0x8A87, 13121: 0x8AB2, 13122: 0x8DE8, 13123: 0x904E, 13124: 0x934B, 13125: 0x9846, 13126: 0x5ED3, 13127: 0x69E8, 13128: 0x85FF, 13129: 0x90ED, 13130: 0xF905, 13131: 0x51A0, 13132: 0x5B98, 13133: 0x5BEC, 13134: 0x6163, 13135: 0x68FA, 13136: 0x6B3E, 13137: 0x704C, 13138: 0x742F, 13139: 0x74D8, 13140: 0x7BA1, 13141: 0x7F50, 13142: 0x83C5, 13143: 0x89C0, 13144: 0x8CAB, 13145: 0x95DC, 13146: 0x9928, 13147: 0x522E, 13148: 0x605D, 13149: 0x62EC, 13150: 0x9002, 13151: 0x4F8A, 13152: 0x5149, 13153: 0x5321, 13154: 0x58D9, 13155: 0x5EE3, 13156: 0x66E0, 13157: 0x6D38, 13158: 0x709A, 13159: 0x72C2, 13160: 0x73D6, 13161: 0x7B50, 13162: 0x80F1, 13163: 0x945B, 13164: 0x5366, 13165: 0x639B, 13166: 0x7F6B, 13167: 0x4E56, 13168: 0x5080, 13169: 0x584A, 13170: 0x58DE, 13171: 0x602A, 13172: 0x6127, 13173: 0x62D0, 13174: 0x69D0, 13175: 0x9B41, 13176: 0x5B8F, 13177: 0x7D18, 13178: 0x80B1, 13179: 0x8F5F, 13180: 0x4EA4, 13181: 0x50D1, 13182: 0x54AC, 13183: 0x55AC, 13184: 0x5B0C, 13185: 0x5DA0, 13186: 0x5DE7, 13187: 0x652A, 13188: 0x654E, 13189: 0x6821, 13190: 0x6A4B, 13191: 0x72E1, 13192: 0x768E, 13193: 0x77EF, 13194: 0x7D5E, 13195: 0x7FF9, 13196: 0x81A0, 13197: 0x854E, 13198: 0x86DF, 13199: 0x8F03, 13200: 0x8F4E, 13201: 0x90CA, 13202: 0x9903, 13203: 0x9A55, 13204: 0x9BAB, 13205: 0x4E18, 13206: 0x4E45, 13207: 0x4E5D, 13208: 0x4EC7, 13209: 0x4FF1, 13210: 0x5177, 13211: 0x52FE, 13212: 0x5340, 13213: 0x53E3, 13214: 0x53E5, 13215: 0x548E, 13216: 0x5614, 13217: 0x5775, 13218: 0x57A2, 13219: 0x5BC7, 13220: 0x5D87, 13221: 0x5ED0, 13222: 0x61FC, 13223: 0x62D8, 13224: 0x6551, 13225: 0x67B8, 13226: 0x67E9, 13227: 0x69CB, 13228: 0x6B50, 13229: 0x6BC6, 13230: 0x6BEC, 13231: 0x6C42, 13232: 0x6E9D, 13233: 0x7078, 13234: 0x72D7, 13235: 0x7396, 13236: 0x7403, 13237: 0x77BF, 13238: 0x77E9, 13239: 0x7A76, 13240: 0x7D7F, 13241: 0x8009, 13242: 0x81FC, 13243: 0x8205, 13244: 0x820A, 13245: 0x82DF, 13246: 0x8862, 13247: 0x8B33, 13248: 0x8CFC, 13249: 0x8EC0, 13250: 0x9011, 13251: 0x90B1, 13252: 0x9264, 13253: 0x92B6, 13254: 0x99D2, 13255: 0x9A45, 13256: 0x9CE9, 13257: 0x9DD7, 13258: 0x9F9C, 13259: 0x570B, 13260: 0x5C40, 13261: 0x83CA, 13262: 0x97A0, 13263: 0x97AB, 13264: 0x9EB4, 13265: 0x541B, 13266: 0x7A98, 13267: 0x7FA4, 13268: 0x88D9, 13269: 0x8ECD, 13270: 0x90E1, 13271: 0x5800, 13272: 0x5C48, 13273: 0x6398, 13274: 0x7A9F, 13275: 0x5BAE, 13276: 0x5F13, 13277: 0x7A79, 13278: 0x7AAE, 13279: 0x828E, 13280: 0x8EAC, 13281: 0x5026, 13282: 0x5238, 13283: 0x52F8, 13284: 0x5377, 13285: 0x5708, 13286: 0x62F3, 13287: 0x6372, 13288: 0x6B0A, 13289: 0x6DC3, 13290: 0x7737, 13291: 0x53A5, 13292: 0x7357, 13293: 0x8568, 13294: 0x8E76, 13295: 0x95D5, 13296: 0x673A, 13297: 0x6AC3, 13298: 0x6F70, 13299: 0x8A6D, 13300: 0x8ECC, 13301: 0x994B, 13302: 0xF906, 13303: 0x6677, 13304: 0x6B78, 13305: 0x8CB4, 13306: 0x9B3C, 13307: 0xF907, 13308: 0x53EB, 13309: 0x572D, 13310: 0x594E, 13311: 0x63C6, 13312: 0x69FB, 13313: 0x73EA, 13314: 0x7845, 13315: 0x7ABA, 13316: 0x7AC5, 13317: 0x7CFE, 13318: 0x8475, 13319: 0x898F, 13320: 0x8D73, 13321: 0x9035, 13322: 0x95A8, 13323: 0x52FB, 13324: 0x5747, 13325: 0x7547, 13326: 0x7B60, 13327: 0x83CC, 13328: 0x921E, 13329: 0xF908, 13330: 0x6A58, 13331: 0x514B, 13332: 0x524B, 13333: 0x5287, 13334: 0x621F, 13335: 0x68D8, 13336: 0x6975, 13337: 0x9699, 13338: 0x50C5, 13339: 0x52A4, 13340: 0x52E4, 13341: 0x61C3, 13342: 0x65A4, 13343: 0x6839, 13344: 0x69FF, 13345: 0x747E, 13346: 0x7B4B, 13347: 0x82B9, 13348: 0x83EB, 13349: 0x89B2, 13350: 0x8B39, 13351: 0x8FD1, 13352: 0x9949, 13353: 0xF909, 13354: 0x4ECA, 13355: 0x5997, 13356: 0x64D2, 13357: 0x6611, 13358: 0x6A8E, 13359: 0x7434, 13360: 0x7981, 13361: 0x79BD, 13362: 0x82A9, 13363: 0x887E, 13364: 0x887F, 13365: 0x895F, 13366: 0xF90A, 13367: 0x9326, 13368: 0x4F0B, 13369: 0x53CA, 13370: 0x6025, 13371: 0x6271, 13372: 0x6C72, 13373: 0x7D1A, 13374: 0x7D66, 13375: 0x4E98, 13376: 0x5162, 13377: 0x77DC, 13378: 0x80AF, 13379: 0x4F01, 13380: 0x4F0E, 13381: 0x5176, 13382: 0x5180, 13383: 0x55DC, 13384: 0x5668, 13385: 0x573B, 13386: 0x57FA, 13387: 0x57FC, 13388: 0x5914, 13389: 0x5947, 13390: 0x5993, 13391: 0x5BC4, 13392: 0x5C90, 13393: 0x5D0E, 13394: 0x5DF1, 13395: 0x5E7E, 13396: 0x5FCC, 13397: 0x6280, 13398: 0x65D7, 13399: 0x65E3, 13400: 0x671E, 13401: 0x671F, 13402: 0x675E, 13403: 0x68CB, 13404: 0x68C4, 13405: 0x6A5F, 13406: 0x6B3A, 13407: 0x6C23, 13408: 0x6C7D, 13409: 0x6C82, 13410: 0x6DC7, 13411: 0x7398, 13412: 0x7426, 13413: 0x742A, 13414: 0x7482, 13415: 0x74A3, 13416: 0x7578, 13417: 0x757F, 13418: 0x7881, 13419: 0x78EF, 13420: 0x7941, 13421: 0x7947, 13422: 0x7948, 13423: 0x797A, 13424: 0x7B95, 13425: 0x7D00, 13426: 0x7DBA, 13427: 0x7F88, 13428: 0x8006, 13429: 0x802D, 13430: 0x808C, 13431: 0x8A18, 13432: 0x8B4F, 13433: 0x8C48, 13434: 0x8D77, 13435: 0x9321, 13436: 0x9324, 13437: 0x98E2, 13438: 0x9951, 13439: 0x9A0E, 13440: 0x9A0F, 13441: 0x9A65, 13442: 0x9E92, 13443: 0x7DCA, 13444: 0x4F76, 13445: 0x5409, 13446: 0x62EE, 13447: 0x6854, 13448: 0x91D1, 13449: 0x55AB, 13450: 0x513A, 13451: 0xF90B, 13452: 0xF90C, 13453: 0x5A1C, 13454: 0x61E6, 13455: 0xF90D, 13456: 0x62CF, 13457: 0x62FF, 13458: 0xF90E, 13459: 0xF90F, 13460: 0xF910, 13461: 0xF911, 13462: 0xF912, 13463: 0xF913, 13464: 0x90A3, 13465: 0xF914, 13466: 0xF915, 13467: 0xF916, 13468: 0xF917, 13469: 0xF918, 13470: 0x8AFE, 13471: 0xF919, 13472: 0xF91A, 13473: 0xF91B, 13474: 0xF91C, 13475: 0x6696, 13476: 0xF91D, 13477: 0x7156, 13478: 0xF91E, 13479: 0xF91F, 13480: 0x96E3, 13481: 0xF920, 13482: 0x634F, 13483: 0x637A, 13484: 0x5357, 13485: 0xF921, 13486: 0x678F, 13487: 0x6960, 13488: 0x6E73, 13489: 0xF922, 13490: 0x7537, 13491: 0xF923, 13492: 0xF924, 13493: 0xF925, 13494: 0x7D0D, 13495: 0xF926, 13496: 0xF927, 13497: 0x8872, 13498: 0x56CA, 13499: 0x5A18, 13500: 0xF928, 13501: 0xF929, 13502: 0xF92A, 13503: 0xF92B, 13504: 0xF92C, 13505: 0x4E43, 13506: 0xF92D, 13507: 0x5167, 13508: 0x5948, 13509: 0x67F0, 13510: 0x8010, 13511: 0xF92E, 13512: 0x5973, 13513: 0x5E74, 13514: 0x649A, 13515: 0x79CA, 13516: 0x5FF5, 13517: 0x606C, 13518: 0x62C8, 13519: 0x637B, 13520: 0x5BE7, 13521: 0x5BD7, 13522: 0x52AA, 13523: 0xF92F, 13524: 0x5974, 13525: 0x5F29, 13526: 0x6012, 13527: 0xF930, 13528: 0xF931, 13529: 0xF932, 13530: 0x7459, 13531: 0xF933, 13532: 0xF934, 13533: 0xF935, 13534: 0xF936, 13535: 0xF937, 13536: 0xF938, 13537: 0x99D1, 13538: 0xF939, 13539: 0xF93A, 13540: 0xF93B, 13541: 0xF93C, 13542: 0xF93D, 13543: 0xF93E, 13544: 0xF93F, 13545: 0xF940, 13546: 0xF941, 13547: 0xF942, 13548: 0xF943, 13549: 0x6FC3, 13550: 0xF944, 13551: 0xF945, 13552: 0x81BF, 13553: 0x8FB2, 13554: 0x60F1, 13555: 0xF946, 13556: 0xF947, 13557: 0x8166, 13558: 0xF948, 13559: 0xF949, 13560: 0x5C3F, 13561: 0xF94A, 13562: 0xF94B, 13563: 0xF94C, 13564: 0xF94D, 13565: 0xF94E, 13566: 0xF94F, 13567: 0xF950, 13568: 0xF951, 13569: 0x5AE9, 13570: 0x8A25, 13571: 0x677B, 13572: 0x7D10, 13573: 0xF952, 13574: 0xF953, 13575: 0xF954, 13576: 0xF955, 13577: 0xF956, 13578: 0xF957, 13579: 0x80FD, 13580: 0xF958, 13581: 0xF959, 13582: 0x5C3C, 13583: 0x6CE5, 13584: 0x533F, 13585: 0x6EBA, 13586: 0x591A, 13587: 0x8336, 13588: 0x4E39, 13589: 0x4EB6, 13590: 0x4F46, 13591: 0x55AE, 13592: 0x5718, 13593: 0x58C7, 13594: 0x5F56, 13595: 0x65B7, 13596: 0x65E6, 13597: 0x6A80, 13598: 0x6BB5, 13599: 0x6E4D, 13600: 0x77ED, 13601: 0x7AEF, 13602: 0x7C1E, 13603: 0x7DDE, 13604: 0x86CB, 13605: 0x8892, 13606: 0x9132, 13607: 0x935B, 13608: 0x64BB, 13609: 0x6FBE, 13610: 0x737A, 13611: 0x75B8, 13612: 0x9054, 13613: 0x5556, 13614: 0x574D, 13615: 0x61BA, 13616: 0x64D4, 13617: 0x66C7, 13618: 0x6DE1, 13619: 0x6E5B, 13620: 0x6F6D, 13621: 0x6FB9, 13622: 0x75F0, 13623: 0x8043, 13624: 0x81BD, 13625: 0x8541, 13626: 0x8983, 13627: 0x8AC7, 13628: 0x8B5A, 13629: 0x931F, 13630: 0x6C93, 13631: 0x7553, 13632: 0x7B54, 13633: 0x8E0F, 13634: 0x905D, 13635: 0x5510, 13636: 0x5802, 13637: 0x5858, 13638: 0x5E62, 13639: 0x6207, 13640: 0x649E, 13641: 0x68E0, 13642: 0x7576, 13643: 0x7CD6, 13644: 0x87B3, 13645: 0x9EE8, 13646: 0x4EE3, 13647: 0x5788, 13648: 0x576E, 13649: 0x5927, 13650: 0x5C0D, 13651: 0x5CB1, 13652: 0x5E36, 13653: 0x5F85, 13654: 0x6234, 13655: 0x64E1, 13656: 0x73B3, 13657: 0x81FA, 13658: 0x888B, 13659: 0x8CB8, 13660: 0x968A, 13661: 0x9EDB, 13662: 0x5B85, 13663: 0x5FB7, 13664: 0x60B3, 13665: 0x5012, 13666: 0x5200, 13667: 0x5230, 13668: 0x5716, 13669: 0x5835, 13670: 0x5857, 13671: 0x5C0E, 13672: 0x5C60, 13673: 0x5CF6, 13674: 0x5D8B, 13675: 0x5EA6, 13676: 0x5F92, 13677: 0x60BC, 13678: 0x6311, 13679: 0x6389, 13680: 0x6417, 13681: 0x6843, 13682: 0x68F9, 13683: 0x6AC2, 13684: 0x6DD8, 13685: 0x6E21, 13686: 0x6ED4, 13687: 0x6FE4, 13688: 0x71FE, 13689: 0x76DC, 13690: 0x7779, 13691: 0x79B1, 13692: 0x7A3B, 13693: 0x8404, 13694: 0x89A9, 13695: 0x8CED, 13696: 0x8DF3, 13697: 0x8E48, 13698: 0x9003, 13699: 0x9014, 13700: 0x9053, 13701: 0x90FD, 13702: 0x934D, 13703: 0x9676, 13704: 0x97DC, 13705: 0x6BD2, 13706: 0x7006, 13707: 0x7258, 13708: 0x72A2, 13709: 0x7368, 13710: 0x7763, 13711: 0x79BF, 13712: 0x7BE4, 13713: 0x7E9B, 13714: 0x8B80, 13715: 0x58A9, 13716: 0x60C7, 13717: 0x6566, 13718: 0x65FD, 13719: 0x66BE, 13720: 0x6C8C, 13721: 0x711E, 13722: 0x71C9, 13723: 0x8C5A, 13724: 0x9813, 13725: 0x4E6D, 13726: 0x7A81, 13727: 0x4EDD, 13728: 0x51AC, 13729: 0x51CD, 13730: 0x52D5, 13731: 0x540C, 13732: 0x61A7, 13733: 0x6771, 13734: 0x6850, 13735: 0x68DF, 13736: 0x6D1E, 13737: 0x6F7C, 13738: 0x75BC, 13739: 0x77B3, 13740: 0x7AE5, 13741: 0x80F4, 13742: 0x8463, 13743: 0x9285, 13744: 0x515C, 13745: 0x6597, 13746: 0x675C, 13747: 0x6793, 13748: 0x75D8, 13749: 0x7AC7, 13750: 0x8373, 13751: 0xF95A, 13752: 0x8C46, 13753: 0x9017, 13754: 0x982D, 13755: 0x5C6F, 13756: 0x81C0, 13757: 0x829A, 13758: 0x9041, 13759: 0x906F, 13760: 0x920D, 13761: 0x5F97, 13762: 0x5D9D, 13763: 0x6A59, 13764: 0x71C8, 13765: 0x767B, 13766: 0x7B49, 13767: 0x85E4, 13768: 0x8B04, 13769: 0x9127, 13770: 0x9A30, 13771: 0x5587, 13772: 0x61F6, 13773: 0xF95B, 13774: 0x7669, 13775: 0x7F85, 13776: 0x863F, 13777: 0x87BA, 13778: 0x88F8, 13779: 0x908F, 13780: 0xF95C, 13781: 0x6D1B, 13782: 0x70D9, 13783: 0x73DE, 13784: 0x7D61, 13785: 0x843D, 13786: 0xF95D, 13787: 0x916A, 13788: 0x99F1, 13789: 0xF95E, 13790: 0x4E82, 13791: 0x5375, 13792: 0x6B04, 13793: 0x6B12, 13794: 0x703E, 13795: 0x721B, 13796: 0x862D, 13797: 0x9E1E, 13798: 0x524C, 13799: 0x8FA3, 13800: 0x5D50, 13801: 0x64E5, 13802: 0x652C, 13803: 0x6B16, 13804: 0x6FEB, 13805: 0x7C43, 13806: 0x7E9C, 13807: 0x85CD, 13808: 0x8964, 13809: 0x89BD, 13810: 0x62C9, 13811: 0x81D8, 13812: 0x881F, 13813: 0x5ECA, 13814: 0x6717, 13815: 0x6D6A, 13816: 0x72FC, 13817: 0x7405, 13818: 0x746F, 13819: 0x8782, 13820: 0x90DE, 13821: 0x4F86, 13822: 0x5D0D, 13823: 0x5FA0, 13824: 0x840A, 13825: 0x51B7, 13826: 0x63A0, 13827: 0x7565, 13828: 0x4EAE, 13829: 0x5006, 13830: 0x5169, 13831: 0x51C9, 13832: 0x6881, 13833: 0x6A11, 13834: 0x7CAE, 13835: 0x7CB1, 13836: 0x7CE7, 13837: 0x826F, 13838: 0x8AD2, 13839: 0x8F1B, 13840: 0x91CF, 13841: 0x4FB6, 13842: 0x5137, 13843: 0x52F5, 13844: 0x5442, 13845: 0x5EEC, 13846: 0x616E, 13847: 0x623E, 13848: 0x65C5, 13849: 0x6ADA, 13850: 0x6FFE, 13851: 0x792A, 13852: 0x85DC, 13853: 0x8823, 13854: 0x95AD, 13855: 0x9A62, 13856: 0x9A6A, 13857: 0x9E97, 13858: 0x9ECE, 13859: 0x529B, 13860: 0x66C6, 13861: 0x6B77, 13862: 0x701D, 13863: 0x792B, 13864: 0x8F62, 13865: 0x9742, 13866: 0x6190, 13867: 0x6200, 13868: 0x6523, 13869: 0x6F23, 13870: 0x7149, 13871: 0x7489, 13872: 0x7DF4, 13873: 0x806F, 13874: 0x84EE, 13875: 0x8F26, 13876: 0x9023, 13877: 0x934A, 13878: 0x51BD, 13879: 0x5217, 13880: 0x52A3, 13881: 0x6D0C, 13882: 0x70C8, 13883: 0x88C2, 13884: 0x5EC9, 13885: 0x6582, 13886: 0x6BAE, 13887: 0x6FC2, 13888: 0x7C3E, 13889: 0x7375, 13890: 0x4EE4, 13891: 0x4F36, 13892: 0x56F9, 13893: 0xF95F, 13894: 0x5CBA, 13895: 0x5DBA, 13896: 0x601C, 13897: 0x73B2, 13898: 0x7B2D, 13899: 0x7F9A, 13900: 0x7FCE, 13901: 0x8046, 13902: 0x901E, 13903: 0x9234, 13904: 0x96F6, 13905: 0x9748, 13906: 0x9818, 13907: 0x9F61, 13908: 0x4F8B, 13909: 0x6FA7, 13910: 0x79AE, 13911: 0x91B4, 13912: 0x96B7, 13913: 0x52DE, 13914: 0xF960, 13915: 0x6488, 13916: 0x64C4, 13917: 0x6AD3, 13918: 0x6F5E, 13919: 0x7018, 13920: 0x7210, 13921: 0x76E7, 13922: 0x8001, 13923: 0x8606, 13924: 0x865C, 13925: 0x8DEF, 13926: 0x8F05, 13927: 0x9732, 13928: 0x9B6F, 13929: 0x9DFA, 13930: 0x9E75, 13931: 0x788C, 13932: 0x797F, 13933: 0x7DA0, 13934: 0x83C9, 13935: 0x9304, 13936: 0x9E7F, 13937: 0x9E93, 13938: 0x8AD6, 13939: 0x58DF, 13940: 0x5F04, 13941: 0x6727, 13942: 0x7027, 13943: 0x74CF, 13944: 0x7C60, 13945: 0x807E, 13946: 0x5121, 13947: 0x7028, 13948: 0x7262, 13949: 0x78CA, 13950: 0x8CC2, 13951: 0x8CDA, 13952: 0x8CF4, 13953: 0x96F7, 13954: 0x4E86, 13955: 0x50DA, 13956: 0x5BEE, 13957: 0x5ED6, 13958: 0x6599, 13959: 0x71CE, 13960: 0x7642, 13961: 0x77AD, 13962: 0x804A, 13963: 0x84FC, 13964: 0x907C, 13965: 0x9B27, 13966: 0x9F8D, 13967: 0x58D8, 13968: 0x5A41, 13969: 0x5C62, 13970: 0x6A13, 13971: 0x6DDA, 13972: 0x6F0F, 13973: 0x763B, 13974: 0x7D2F, 13975: 0x7E37, 13976: 0x851E, 13977: 0x8938, 13978: 0x93E4, 13979: 0x964B, 13980: 0x5289, 13981: 0x65D2, 13982: 0x67F3, 13983: 0x69B4, 13984: 0x6D41, 13985: 0x6E9C, 13986: 0x700F, 13987: 0x7409, 13988: 0x7460, 13989: 0x7559, 13990: 0x7624, 13991: 0x786B, 13992: 0x8B2C, 13993: 0x985E, 13994: 0x516D, 13995: 0x622E, 13996: 0x9678, 13997: 0x4F96, 13998: 0x502B, 13999: 0x5D19, 14000: 0x6DEA, 14001: 0x7DB8, 14002: 0x8F2A, 14003: 0x5F8B, 14004: 0x6144, 14005: 0x6817, 14006: 0xF961, 14007: 0x9686, 14008: 0x52D2, 14009: 0x808B, 14010: 0x51DC, 14011: 0x51CC, 14012: 0x695E, 14013: 0x7A1C, 14014: 0x7DBE, 14015: 0x83F1, 14016: 0x9675, 14017: 0x4FDA, 14018: 0x5229, 14019: 0x5398, 14020: 0x540F, 14021: 0x550E, 14022: 0x5C65, 14023: 0x60A7, 14024: 0x674E, 14025: 0x68A8, 14026: 0x6D6C, 14027: 0x7281, 14028: 0x72F8, 14029: 0x7406, 14030: 0x7483, 14031: 0xF962, 14032: 0x75E2, 14033: 0x7C6C, 14034: 0x7F79, 14035: 0x7FB8, 14036: 0x8389, 14037: 0x88CF, 14038: 0x88E1, 14039: 0x91CC, 14040: 0x91D0, 14041: 0x96E2, 14042: 0x9BC9, 14043: 0x541D, 14044: 0x6F7E, 14045: 0x71D0, 14046: 0x7498, 14047: 0x85FA, 14048: 0x8EAA, 14049: 0x96A3, 14050: 0x9C57, 14051: 0x9E9F, 14052: 0x6797, 14053: 0x6DCB, 14054: 0x7433, 14055: 0x81E8, 14056: 0x9716, 14057: 0x782C, 14058: 0x7ACB, 14059: 0x7B20, 14060: 0x7C92, 14061: 0x6469, 14062: 0x746A, 14063: 0x75F2, 14064: 0x78BC, 14065: 0x78E8, 14066: 0x99AC, 14067: 0x9B54, 14068: 0x9EBB, 14069: 0x5BDE, 14070: 0x5E55, 14071: 0x6F20, 14072: 0x819C, 14073: 0x83AB, 14074: 0x9088, 14075: 0x4E07, 14076: 0x534D, 14077: 0x5A29, 14078: 0x5DD2, 14079: 0x5F4E, 14080: 0x6162, 14081: 0x633D, 14082: 0x6669, 14083: 0x66FC, 14084: 0x6EFF, 14085: 0x6F2B, 14086: 0x7063, 14087: 0x779E, 14088: 0x842C, 14089: 0x8513, 14090: 0x883B, 14091: 0x8F13, 14092: 0x9945, 14093: 0x9C3B, 14094: 0x551C, 14095: 0x62B9, 14096: 0x672B, 14097: 0x6CAB, 14098: 0x8309, 14099: 0x896A, 14100: 0x977A, 14101: 0x4EA1, 14102: 0x5984, 14103: 0x5FD8, 14104: 0x5FD9, 14105: 0x671B, 14106: 0x7DB2, 14107: 0x7F54, 14108: 0x8292, 14109: 0x832B, 14110: 0x83BD, 14111: 0x8F1E, 14112: 0x9099, 14113: 0x57CB, 14114: 0x59B9, 14115: 0x5A92, 14116: 0x5BD0, 14117: 0x6627, 14118: 0x679A, 14119: 0x6885, 14120: 0x6BCF, 14121: 0x7164, 14122: 0x7F75, 14123: 0x8CB7, 14124: 0x8CE3, 14125: 0x9081, 14126: 0x9B45, 14127: 0x8108, 14128: 0x8C8A, 14129: 0x964C, 14130: 0x9A40, 14131: 0x9EA5, 14132: 0x5B5F, 14133: 0x6C13, 14134: 0x731B, 14135: 0x76F2, 14136: 0x76DF, 14137: 0x840C, 14138: 0x51AA, 14139: 0x8993, 14140: 0x514D, 14141: 0x5195, 14142: 0x52C9, 14143: 0x68C9, 14144: 0x6C94, 14145: 0x7704, 14146: 0x7720, 14147: 0x7DBF, 14148: 0x7DEC, 14149: 0x9762, 14150: 0x9EB5, 14151: 0x6EC5, 14152: 0x8511, 14153: 0x51A5, 14154: 0x540D, 14155: 0x547D, 14156: 0x660E, 14157: 0x669D, 14158: 0x6927, 14159: 0x6E9F, 14160: 0x76BF, 14161: 0x7791, 14162: 0x8317, 14163: 0x84C2, 14164: 0x879F, 14165: 0x9169, 14166: 0x9298, 14167: 0x9CF4, 14168: 0x8882, 14169: 0x4FAE, 14170: 0x5192, 14171: 0x52DF, 14172: 0x59C6, 14173: 0x5E3D, 14174: 0x6155, 14175: 0x6478, 14176: 0x6479, 14177: 0x66AE, 14178: 0x67D0, 14179: 0x6A21, 14180: 0x6BCD, 14181: 0x6BDB, 14182: 0x725F, 14183: 0x7261, 14184: 0x7441, 14185: 0x7738, 14186: 0x77DB, 14187: 0x8017, 14188: 0x82BC, 14189: 0x8305, 14190: 0x8B00, 14191: 0x8B28, 14192: 0x8C8C, 14193: 0x6728, 14194: 0x6C90, 14195: 0x7267, 14196: 0x76EE, 14197: 0x7766, 14198: 0x7A46, 14199: 0x9DA9, 14200: 0x6B7F, 14201: 0x6C92, 14202: 0x5922, 14203: 0x6726, 14204: 0x8499, 14205: 0x536F, 14206: 0x5893, 14207: 0x5999, 14208: 0x5EDF, 14209: 0x63CF, 14210: 0x6634, 14211: 0x6773, 14212: 0x6E3A, 14213: 0x732B, 14214: 0x7AD7, 14215: 0x82D7, 14216: 0x9328, 14217: 0x52D9, 14218: 0x5DEB, 14219: 0x61AE, 14220: 0x61CB, 14221: 0x620A, 14222: 0x62C7, 14223: 0x64AB, 14224: 0x65E0, 14225: 0x6959, 14226: 0x6B66, 14227: 0x6BCB, 14228: 0x7121, 14229: 0x73F7, 14230: 0x755D, 14231: 0x7E46, 14232: 0x821E, 14233: 0x8302, 14234: 0x856A, 14235: 0x8AA3, 14236: 0x8CBF, 14237: 0x9727, 14238: 0x9D61, 14239: 0x58A8, 14240: 0x9ED8, 14241: 0x5011, 14242: 0x520E, 14243: 0x543B, 14244: 0x554F, 14245: 0x6587, 14246: 0x6C76, 14247: 0x7D0A, 14248: 0x7D0B, 14249: 0x805E, 14250: 0x868A, 14251: 0x9580, 14252: 0x96EF, 14253: 0x52FF, 14254: 0x6C95, 14255: 0x7269, 14256: 0x5473, 14257: 0x5A9A, 14258: 0x5C3E, 14259: 0x5D4B, 14260: 0x5F4C, 14261: 0x5FAE, 14262: 0x672A, 14263: 0x68B6, 14264: 0x6963, 14265: 0x6E3C, 14266: 0x6E44, 14267: 0x7709, 14268: 0x7C73, 14269: 0x7F8E, 14270: 0x8587, 14271: 0x8B0E, 14272: 0x8FF7, 14273: 0x9761, 14274: 0x9EF4, 14275: 0x5CB7, 14276: 0x60B6, 14277: 0x610D, 14278: 0x61AB, 14279: 0x654F, 14280: 0x65FB, 14281: 0x65FC, 14282: 0x6C11, 14283: 0x6CEF, 14284: 0x739F, 14285: 0x73C9, 14286: 0x7DE1, 14287: 0x9594, 14288: 0x5BC6, 14289: 0x871C, 14290: 0x8B10, 14291: 0x525D, 14292: 0x535A, 14293: 0x62CD, 14294: 0x640F, 14295: 0x64B2, 14296: 0x6734, 14297: 0x6A38, 14298: 0x6CCA, 14299: 0x73C0, 14300: 0x749E, 14301: 0x7B94, 14302: 0x7C95, 14303: 0x7E1B, 14304: 0x818A, 14305: 0x8236, 14306: 0x8584, 14307: 0x8FEB, 14308: 0x96F9, 14309: 0x99C1, 14310: 0x4F34, 14311: 0x534A, 14312: 0x53CD, 14313: 0x53DB, 14314: 0x62CC, 14315: 0x642C, 14316: 0x6500, 14317: 0x6591, 14318: 0x69C3, 14319: 0x6CEE, 14320: 0x6F58, 14321: 0x73ED, 14322: 0x7554, 14323: 0x7622, 14324: 0x76E4, 14325: 0x76FC, 14326: 0x78D0, 14327: 0x78FB, 14328: 0x792C, 14329: 0x7D46, 14330: 0x822C, 14331: 0x87E0, 14332: 0x8FD4, 14333: 0x9812, 14334: 0x98EF, 14335: 0x52C3, 14336: 0x62D4, 14337: 0x64A5, 14338: 0x6E24, 14339: 0x6F51, 14340: 0x767C, 14341: 0x8DCB, 14342: 0x91B1, 14343: 0x9262, 14344: 0x9AEE, 14345: 0x9B43, 14346: 0x5023, 14347: 0x508D, 14348: 0x574A, 14349: 0x59A8, 14350: 0x5C28, 14351: 0x5E47, 14352: 0x5F77, 14353: 0x623F, 14354: 0x653E, 14355: 0x65B9, 14356: 0x65C1, 14357: 0x6609, 14358: 0x678B, 14359: 0x699C, 14360: 0x6EC2, 14361: 0x78C5, 14362: 0x7D21, 14363: 0x80AA, 14364: 0x8180, 14365: 0x822B, 14366: 0x82B3, 14367: 0x84A1, 14368: 0x868C, 14369: 0x8A2A, 14370: 0x8B17, 14371: 0x90A6, 14372: 0x9632, 14373: 0x9F90, 14374: 0x500D, 14375: 0x4FF3, 14376: 0xF963, 14377: 0x57F9, 14378: 0x5F98, 14379: 0x62DC, 14380: 0x6392, 14381: 0x676F, 14382: 0x6E43, 14383: 0x7119, 14384: 0x76C3, 14385: 0x80CC, 14386: 0x80DA, 14387: 0x88F4, 14388: 0x88F5, 14389: 0x8919, 14390: 0x8CE0, 14391: 0x8F29, 14392: 0x914D, 14393: 0x966A, 14394: 0x4F2F, 14395: 0x4F70, 14396: 0x5E1B, 14397: 0x67CF, 14398: 0x6822, 14399: 0x767D, 14400: 0x767E, 14401: 0x9B44, 14402: 0x5E61, 14403: 0x6A0A, 14404: 0x7169, 14405: 0x71D4, 14406: 0x756A, 14407: 0xF964, 14408: 0x7E41, 14409: 0x8543, 14410: 0x85E9, 14411: 0x98DC, 14412: 0x4F10, 14413: 0x7B4F, 14414: 0x7F70, 14415: 0x95A5, 14416: 0x51E1, 14417: 0x5E06, 14418: 0x68B5, 14419: 0x6C3E, 14420: 0x6C4E, 14421: 0x6CDB, 14422: 0x72AF, 14423: 0x7BC4, 14424: 0x8303, 14425: 0x6CD5, 14426: 0x743A, 14427: 0x50FB, 14428: 0x5288, 14429: 0x58C1, 14430: 0x64D8, 14431: 0x6A97, 14432: 0x74A7, 14433: 0x7656, 14434: 0x78A7, 14435: 0x8617, 14436: 0x95E2, 14437: 0x9739, 14438: 0xF965, 14439: 0x535E, 14440: 0x5F01, 14441: 0x8B8A, 14442: 0x8FA8, 14443: 0x8FAF, 14444: 0x908A, 14445: 0x5225, 14446: 0x77A5, 14447: 0x9C49, 14448: 0x9F08, 14449: 0x4E19, 14450: 0x5002, 14451: 0x5175, 14452: 0x5C5B, 14453: 0x5E77, 14454: 0x661E, 14455: 0x663A, 14456: 0x67C4, 14457: 0x68C5, 14458: 0x70B3, 14459: 0x7501, 14460: 0x75C5, 14461: 0x79C9, 14462: 0x7ADD, 14463: 0x8F27, 14464: 0x9920, 14465: 0x9A08, 14466: 0x4FDD, 14467: 0x5821, 14468: 0x5831, 14469: 0x5BF6, 14470: 0x666E, 14471: 0x6B65, 14472: 0x6D11, 14473: 0x6E7A, 14474: 0x6F7D, 14475: 0x73E4, 14476: 0x752B, 14477: 0x83E9, 14478: 0x88DC, 14479: 0x8913, 14480: 0x8B5C, 14481: 0x8F14, 14482: 0x4F0F, 14483: 0x50D5, 14484: 0x5310, 14485: 0x535C, 14486: 0x5B93, 14487: 0x5FA9, 14488: 0x670D, 14489: 0x798F, 14490: 0x8179, 14491: 0x832F, 14492: 0x8514, 14493: 0x8907, 14494: 0x8986, 14495: 0x8F39, 14496: 0x8F3B, 14497: 0x99A5, 14498: 0x9C12, 14499: 0x672C, 14500: 0x4E76, 14501: 0x4FF8, 14502: 0x5949, 14503: 0x5C01, 14504: 0x5CEF, 14505: 0x5CF0, 14506: 0x6367, 14507: 0x68D2, 14508: 0x70FD, 14509: 0x71A2, 14510: 0x742B, 14511: 0x7E2B, 14512: 0x84EC, 14513: 0x8702, 14514: 0x9022, 14515: 0x92D2, 14516: 0x9CF3, 14517: 0x4E0D, 14518: 0x4ED8, 14519: 0x4FEF, 14520: 0x5085, 14521: 0x5256, 14522: 0x526F, 14523: 0x5426, 14524: 0x5490, 14525: 0x57E0, 14526: 0x592B, 14527: 0x5A66, 14528: 0x5B5A, 14529: 0x5B75, 14530: 0x5BCC, 14531: 0x5E9C, 14532: 0xF966, 14533: 0x6276, 14534: 0x6577, 14535: 0x65A7, 14536: 0x6D6E, 14537: 0x6EA5, 14538: 0x7236, 14539: 0x7B26, 14540: 0x7C3F, 14541: 0x7F36, 14542: 0x8150, 14543: 0x8151, 14544: 0x819A, 14545: 0x8240, 14546: 0x8299, 14547: 0x83A9, 14548: 0x8A03, 14549: 0x8CA0, 14550: 0x8CE6, 14551: 0x8CFB, 14552: 0x8D74, 14553: 0x8DBA, 14554: 0x90E8, 14555: 0x91DC, 14556: 0x961C, 14557: 0x9644, 14558: 0x99D9, 14559: 0x9CE7, 14560: 0x5317, 14561: 0x5206, 14562: 0x5429, 14563: 0x5674, 14564: 0x58B3, 14565: 0x5954, 14566: 0x596E, 14567: 0x5FFF, 14568: 0x61A4, 14569: 0x626E, 14570: 0x6610, 14571: 0x6C7E, 14572: 0x711A, 14573: 0x76C6, 14574: 0x7C89, 14575: 0x7CDE, 14576: 0x7D1B, 14577: 0x82AC, 14578: 0x8CC1, 14579: 0x96F0, 14580: 0xF967, 14581: 0x4F5B, 14582: 0x5F17, 14583: 0x5F7F, 14584: 0x62C2, 14585: 0x5D29, 14586: 0x670B, 14587: 0x68DA, 14588: 0x787C, 14589: 0x7E43, 14590: 0x9D6C, 14591: 0x4E15, 14592: 0x5099, 14593: 0x5315, 14594: 0x532A, 14595: 0x5351, 14596: 0x5983, 14597: 0x5A62, 14598: 0x5E87, 14599: 0x60B2, 14600: 0x618A, 14601: 0x6249, 14602: 0x6279, 14603: 0x6590, 14604: 0x6787, 14605: 0x69A7, 14606: 0x6BD4, 14607: 0x6BD6, 14608: 0x6BD7, 14609: 0x6BD8, 14610: 0x6CB8, 14611: 0xF968, 14612: 0x7435, 14613: 0x75FA, 14614: 0x7812, 14615: 0x7891, 14616: 0x79D5, 14617: 0x79D8, 14618: 0x7C83, 14619: 0x7DCB, 14620: 0x7FE1, 14621: 0x80A5, 14622: 0x813E, 14623: 0x81C2, 14624: 0x83F2, 14625: 0x871A, 14626: 0x88E8, 14627: 0x8AB9, 14628: 0x8B6C, 14629: 0x8CBB, 14630: 0x9119, 14631: 0x975E, 14632: 0x98DB, 14633: 0x9F3B, 14634: 0x56AC, 14635: 0x5B2A, 14636: 0x5F6C, 14637: 0x658C, 14638: 0x6AB3, 14639: 0x6BAF, 14640: 0x6D5C, 14641: 0x6FF1, 14642: 0x7015, 14643: 0x725D, 14644: 0x73AD, 14645: 0x8CA7, 14646: 0x8CD3, 14647: 0x983B, 14648: 0x6191, 14649: 0x6C37, 14650: 0x8058, 14651: 0x9A01, 14652: 0x4E4D, 14653: 0x4E8B, 14654: 0x4E9B, 14655: 0x4ED5, 14656: 0x4F3A, 14657: 0x4F3C, 14658: 0x4F7F, 14659: 0x4FDF, 14660: 0x50FF, 14661: 0x53F2, 14662: 0x53F8, 14663: 0x5506, 14664: 0x55E3, 14665: 0x56DB, 14666: 0x58EB, 14667: 0x5962, 14668: 0x5A11, 14669: 0x5BEB, 14670: 0x5BFA, 14671: 0x5C04, 14672: 0x5DF3, 14673: 0x5E2B, 14674: 0x5F99, 14675: 0x601D, 14676: 0x6368, 14677: 0x659C, 14678: 0x65AF, 14679: 0x67F6, 14680: 0x67FB, 14681: 0x68AD, 14682: 0x6B7B, 14683: 0x6C99, 14684: 0x6CD7, 14685: 0x6E23, 14686: 0x7009, 14687: 0x7345, 14688: 0x7802, 14689: 0x793E, 14690: 0x7940, 14691: 0x7960, 14692: 0x79C1, 14693: 0x7BE9, 14694: 0x7D17, 14695: 0x7D72, 14696: 0x8086, 14697: 0x820D, 14698: 0x838E, 14699: 0x84D1, 14700: 0x86C7, 14701: 0x88DF, 14702: 0x8A50, 14703: 0x8A5E, 14704: 0x8B1D, 14705: 0x8CDC, 14706: 0x8D66, 14707: 0x8FAD, 14708: 0x90AA, 14709: 0x98FC, 14710: 0x99DF, 14711: 0x9E9D, 14712: 0x524A, 14713: 0xF969, 14714: 0x6714, 14715: 0xF96A, 14716: 0x5098, 14717: 0x522A, 14718: 0x5C71, 14719: 0x6563, 14720: 0x6C55, 14721: 0x73CA, 14722: 0x7523, 14723: 0x759D, 14724: 0x7B97, 14725: 0x849C, 14726: 0x9178, 14727: 0x9730, 14728: 0x4E77, 14729: 0x6492, 14730: 0x6BBA, 14731: 0x715E, 14732: 0x85A9, 14733: 0x4E09, 14734: 0xF96B, 14735: 0x6749, 14736: 0x68EE, 14737: 0x6E17, 14738: 0x829F, 14739: 0x8518, 14740: 0x886B, 14741: 0x63F7, 14742: 0x6F81, 14743: 0x9212, 14744: 0x98AF, 14745: 0x4E0A, 14746: 0x50B7, 14747: 0x50CF, 14748: 0x511F, 14749: 0x5546, 14750: 0x55AA, 14751: 0x5617, 14752: 0x5B40, 14753: 0x5C19, 14754: 0x5CE0, 14755: 0x5E38, 14756: 0x5E8A, 14757: 0x5EA0, 14758: 0x5EC2, 14759: 0x60F3, 14760: 0x6851, 14761: 0x6A61, 14762: 0x6E58, 14763: 0x723D, 14764: 0x7240, 14765: 0x72C0, 14766: 0x76F8, 14767: 0x7965, 14768: 0x7BB1, 14769: 0x7FD4, 14770: 0x88F3, 14771: 0x89F4, 14772: 0x8A73, 14773: 0x8C61, 14774: 0x8CDE, 14775: 0x971C, 14776: 0x585E, 14777: 0x74BD, 14778: 0x8CFD, 14779: 0x55C7, 14780: 0xF96C, 14781: 0x7A61, 14782: 0x7D22, 14783: 0x8272, 14784: 0x7272, 14785: 0x751F, 14786: 0x7525, 14787: 0xF96D, 14788: 0x7B19, 14789: 0x5885, 14790: 0x58FB, 14791: 0x5DBC, 14792: 0x5E8F, 14793: 0x5EB6, 14794: 0x5F90, 14795: 0x6055, 14796: 0x6292, 14797: 0x637F, 14798: 0x654D, 14799: 0x6691, 14800: 0x66D9, 14801: 0x66F8, 14802: 0x6816, 14803: 0x68F2, 14804: 0x7280, 14805: 0x745E, 14806: 0x7B6E, 14807: 0x7D6E, 14808: 0x7DD6, 14809: 0x7F72, 14810: 0x80E5, 14811: 0x8212, 14812: 0x85AF, 14813: 0x897F, 14814: 0x8A93, 14815: 0x901D, 14816: 0x92E4, 14817: 0x9ECD, 14818: 0x9F20, 14819: 0x5915, 14820: 0x596D, 14821: 0x5E2D, 14822: 0x60DC, 14823: 0x6614, 14824: 0x6673, 14825: 0x6790, 14826: 0x6C50, 14827: 0x6DC5, 14828: 0x6F5F, 14829: 0x77F3, 14830: 0x78A9, 14831: 0x84C6, 14832: 0x91CB, 14833: 0x932B, 14834: 0x4ED9, 14835: 0x50CA, 14836: 0x5148, 14837: 0x5584, 14838: 0x5B0B, 14839: 0x5BA3, 14840: 0x6247, 14841: 0x657E, 14842: 0x65CB, 14843: 0x6E32, 14844: 0x717D, 14845: 0x7401, 14846: 0x7444, 14847: 0x7487, 14848: 0x74BF, 14849: 0x766C, 14850: 0x79AA, 14851: 0x7DDA, 14852: 0x7E55, 14853: 0x7FA8, 14854: 0x817A, 14855: 0x81B3, 14856: 0x8239, 14857: 0x861A, 14858: 0x87EC, 14859: 0x8A75, 14860: 0x8DE3, 14861: 0x9078, 14862: 0x9291, 14863: 0x9425, 14864: 0x994D, 14865: 0x9BAE, 14866: 0x5368, 14867: 0x5C51, 14868: 0x6954, 14869: 0x6CC4, 14870: 0x6D29, 14871: 0x6E2B, 14872: 0x820C, 14873: 0x859B, 14874: 0x893B, 14875: 0x8A2D, 14876: 0x8AAA, 14877: 0x96EA, 14878: 0x9F67, 14879: 0x5261, 14880: 0x66B9, 14881: 0x6BB2, 14882: 0x7E96, 14883: 0x87FE, 14884: 0x8D0D, 14885: 0x9583, 14886: 0x965D, 14887: 0x651D, 14888: 0x6D89, 14889: 0x71EE, 14890: 0xF96E, 14891: 0x57CE, 14892: 0x59D3, 14893: 0x5BAC, 14894: 0x6027, 14895: 0x60FA, 14896: 0x6210, 14897: 0x661F, 14898: 0x665F, 14899: 0x7329, 14900: 0x73F9, 14901: 0x76DB, 14902: 0x7701, 14903: 0x7B6C, 14904: 0x8056, 14905: 0x8072, 14906: 0x8165, 14907: 0x8AA0, 14908: 0x9192, 14909: 0x4E16, 14910: 0x52E2, 14911: 0x6B72, 14912: 0x6D17, 14913: 0x7A05, 14914: 0x7B39, 14915: 0x7D30, 14916: 0xF96F, 14917: 0x8CB0, 14918: 0x53EC, 14919: 0x562F, 14920: 0x5851, 14921: 0x5BB5, 14922: 0x5C0F, 14923: 0x5C11, 14924: 0x5DE2, 14925: 0x6240, 14926: 0x6383, 14927: 0x6414, 14928: 0x662D, 14929: 0x68B3, 14930: 0x6CBC, 14931: 0x6D88, 14932: 0x6EAF, 14933: 0x701F, 14934: 0x70A4, 14935: 0x71D2, 14936: 0x7526, 14937: 0x758F, 14938: 0x758E, 14939: 0x7619, 14940: 0x7B11, 14941: 0x7BE0, 14942: 0x7C2B, 14943: 0x7D20, 14944: 0x7D39, 14945: 0x852C, 14946: 0x856D, 14947: 0x8607, 14948: 0x8A34, 14949: 0x900D, 14950: 0x9061, 14951: 0x90B5, 14952: 0x92B7, 14953: 0x97F6, 14954: 0x9A37, 14955: 0x4FD7, 14956: 0x5C6C, 14957: 0x675F, 14958: 0x6D91, 14959: 0x7C9F, 14960: 0x7E8C, 14961: 0x8B16, 14962: 0x8D16, 14963: 0x901F, 14964: 0x5B6B, 14965: 0x5DFD, 14966: 0x640D, 14967: 0x84C0, 14968: 0x905C, 14969: 0x98E1, 14970: 0x7387, 14971: 0x5B8B, 14972: 0x609A, 14973: 0x677E, 14974: 0x6DDE, 14975: 0x8A1F, 14976: 0x8AA6, 14977: 0x9001, 14978: 0x980C, 14979: 0x5237, 14980: 0xF970, 14981: 0x7051, 14982: 0x788E, 14983: 0x9396, 14984: 0x8870, 14985: 0x91D7, 14986: 0x4FEE, 14987: 0x53D7, 14988: 0x55FD, 14989: 0x56DA, 14990: 0x5782, 14991: 0x58FD, 14992: 0x5AC2, 14993: 0x5B88, 14994: 0x5CAB, 14995: 0x5CC0, 14996: 0x5E25, 14997: 0x6101, 14998: 0x620D, 14999: 0x624B, 15000: 0x6388, 15001: 0x641C, 15002: 0x6536, 15003: 0x6578, 15004: 0x6A39, 15005: 0x6B8A, 15006: 0x6C34, 15007: 0x6D19, 15008: 0x6F31, 15009: 0x71E7, 15010: 0x72E9, 15011: 0x7378, 15012: 0x7407, 15013: 0x74B2, 15014: 0x7626, 15015: 0x7761, 15016: 0x79C0, 15017: 0x7A57, 15018: 0x7AEA, 15019: 0x7CB9, 15020: 0x7D8F, 15021: 0x7DAC, 15022: 0x7E61, 15023: 0x7F9E, 15024: 0x8129, 15025: 0x8331, 15026: 0x8490, 15027: 0x84DA, 15028: 0x85EA, 15029: 0x8896, 15030: 0x8AB0, 15031: 0x8B90, 15032: 0x8F38, 15033: 0x9042, 15034: 0x9083, 15035: 0x916C, 15036: 0x9296, 15037: 0x92B9, 15038: 0x968B, 15039: 0x96A7, 15040: 0x96A8, 15041: 0x96D6, 15042: 0x9700, 15043: 0x9808, 15044: 0x9996, 15045: 0x9AD3, 15046: 0x9B1A, 15047: 0x53D4, 15048: 0x587E, 15049: 0x5919, 15050: 0x5B70, 15051: 0x5BBF, 15052: 0x6DD1, 15053: 0x6F5A, 15054: 0x719F, 15055: 0x7421, 15056: 0x74B9, 15057: 0x8085, 15058: 0x83FD, 15059: 0x5DE1, 15060: 0x5F87, 15061: 0x5FAA, 15062: 0x6042, 15063: 0x65EC, 15064: 0x6812, 15065: 0x696F, 15066: 0x6A53, 15067: 0x6B89, 15068: 0x6D35, 15069: 0x6DF3, 15070: 0x73E3, 15071: 0x76FE, 15072: 0x77AC, 15073: 0x7B4D, 15074: 0x7D14, 15075: 0x8123, 15076: 0x821C, 15077: 0x8340, 15078: 0x84F4, 15079: 0x8563, 15080: 0x8A62, 15081: 0x8AC4, 15082: 0x9187, 15083: 0x931E, 15084: 0x9806, 15085: 0x99B4, 15086: 0x620C, 15087: 0x8853, 15088: 0x8FF0, 15089: 0x9265, 15090: 0x5D07, 15091: 0x5D27, 15092: 0x5D69, 15093: 0x745F, 15094: 0x819D, 15095: 0x8768, 15096: 0x6FD5, 15097: 0x62FE, 15098: 0x7FD2, 15099: 0x8936, 15100: 0x8972, 15101: 0x4E1E, 15102: 0x4E58, 15103: 0x50E7, 15104: 0x52DD, 15105: 0x5347, 15106: 0x627F, 15107: 0x6607, 15108: 0x7E69, 15109: 0x8805, 15110: 0x965E, 15111: 0x4F8D, 15112: 0x5319, 15113: 0x5636, 15114: 0x59CB, 15115: 0x5AA4, 15116: 0x5C38, 15117: 0x5C4E, 15118: 0x5C4D, 15119: 0x5E02, 15120: 0x5F11, 15121: 0x6043, 15122: 0x65BD, 15123: 0x662F, 15124: 0x6642, 15125: 0x67BE, 15126: 0x67F4, 15127: 0x731C, 15128: 0x77E2, 15129: 0x793A, 15130: 0x7FC5, 15131: 0x8494, 15132: 0x84CD, 15133: 0x8996, 15134: 0x8A66, 15135: 0x8A69, 15136: 0x8AE1, 15137: 0x8C55, 15138: 0x8C7A, 15139: 0x57F4, 15140: 0x5BD4, 15141: 0x5F0F, 15142: 0x606F, 15143: 0x62ED, 15144: 0x690D, 15145: 0x6B96, 15146: 0x6E5C, 15147: 0x7184, 15148: 0x7BD2, 15149: 0x8755, 15150: 0x8B58, 15151: 0x8EFE, 15152: 0x98DF, 15153: 0x98FE, 15154: 0x4F38, 15155: 0x4F81, 15156: 0x4FE1, 15157: 0x547B, 15158: 0x5A20, 15159: 0x5BB8, 15160: 0x613C, 15161: 0x65B0, 15162: 0x6668, 15163: 0x71FC, 15164: 0x7533, 15165: 0x795E, 15166: 0x7D33, 15167: 0x814E, 15168: 0x81E3, 15169: 0x8398, 15170: 0x85AA, 15171: 0x85CE, 15172: 0x8703, 15173: 0x8A0A, 15174: 0x8EAB, 15175: 0x8F9B, 15176: 0xF971, 15177: 0x8FC5, 15178: 0x5931, 15179: 0x5BA4, 15180: 0x5BE6, 15181: 0x6089, 15182: 0x5BE9, 15183: 0x5C0B, 15184: 0x5FC3, 15185: 0x6C81, 15186: 0xF972, 15187: 0x6DF1, 15188: 0x700B, 15189: 0x751A, 15190: 0x82AF, 15191: 0x8AF6, 15192: 0x4EC0, 15193: 0x5341, 15194: 0xF973, 15195: 0x96D9, 15196: 0x6C0F, 15197: 0x4E9E, 15198: 0x4FC4, 15199: 0x5152, 15200: 0x555E, 15201: 0x5A25, 15202: 0x5CE8, 15203: 0x6211, 15204: 0x7259, 15205: 0x82BD, 15206: 0x83AA, 15207: 0x86FE, 15208: 0x8859, 15209: 0x8A1D, 15210: 0x963F, 15211: 0x96C5, 15212: 0x9913, 15213: 0x9D09, 15214: 0x9D5D, 15215: 0x580A, 15216: 0x5CB3, 15217: 0x5DBD, 15218: 0x5E44, 15219: 0x60E1, 15220: 0x6115, 15221: 0x63E1, 15222: 0x6A02, 15223: 0x6E25, 15224: 0x9102, 15225: 0x9354, 15226: 0x984E, 15227: 0x9C10, 15228: 0x9F77, 15229: 0x5B89, 15230: 0x5CB8, 15231: 0x6309, 15232: 0x664F, 15233: 0x6848, 15234: 0x773C, 15235: 0x96C1, 15236: 0x978D, 15237: 0x9854, 15238: 0x9B9F, 15239: 0x65A1, 15240: 0x8B01, 15241: 0x8ECB, 15242: 0x95BC, 15243: 0x5535, 15244: 0x5CA9, 15245: 0x5DD6, 15246: 0x5EB5, 15247: 0x6697, 15248: 0x764C, 15249: 0x83F4, 15250: 0x95C7, 15251: 0x58D3, 15252: 0x62BC, 15253: 0x72CE, 15254: 0x9D28, 15255: 0x4EF0, 15256: 0x592E, 15257: 0x600F, 15258: 0x663B, 15259: 0x6B83, 15260: 0x79E7, 15261: 0x9D26, 15262: 0x5393, 15263: 0x54C0, 15264: 0x57C3, 15265: 0x5D16, 15266: 0x611B, 15267: 0x66D6, 15268: 0x6DAF, 15269: 0x788D, 15270: 0x827E, 15271: 0x9698, 15272: 0x9744, 15273: 0x5384, 15274: 0x627C, 15275: 0x6396, 15276: 0x6DB2, 15277: 0x7E0A, 15278: 0x814B, 15279: 0x984D, 15280: 0x6AFB, 15281: 0x7F4C, 15282: 0x9DAF, 15283: 0x9E1A, 15284: 0x4E5F, 15285: 0x503B, 15286: 0x51B6, 15287: 0x591C, 15288: 0x60F9, 15289: 0x63F6, 15290: 0x6930, 15291: 0x723A, 15292: 0x8036, 15293: 0xF974, 15294: 0x91CE, 15295: 0x5F31, 15296: 0xF975, 15297: 0xF976, 15298: 0x7D04, 15299: 0x82E5, 15300: 0x846F, 15301: 0x84BB, 15302: 0x85E5, 15303: 0x8E8D, 15304: 0xF977, 15305: 0x4F6F, 15306: 0xF978, 15307: 0xF979, 15308: 0x58E4, 15309: 0x5B43, 15310: 0x6059, 15311: 0x63DA, 15312: 0x6518, 15313: 0x656D, 15314: 0x6698, 15315: 0xF97A, 15316: 0x694A, 15317: 0x6A23, 15318: 0x6D0B, 15319: 0x7001, 15320: 0x716C, 15321: 0x75D2, 15322: 0x760D, 15323: 0x79B3, 15324: 0x7A70, 15325: 0xF97B, 15326: 0x7F8A, 15327: 0xF97C, 15328: 0x8944, 15329: 0xF97D, 15330: 0x8B93, 15331: 0x91C0, 15332: 0x967D, 15333: 0xF97E, 15334: 0x990A, 15335: 0x5704, 15336: 0x5FA1, 15337: 0x65BC, 15338: 0x6F01, 15339: 0x7600, 15340: 0x79A6, 15341: 0x8A9E, 15342: 0x99AD, 15343: 0x9B5A, 15344: 0x9F6C, 15345: 0x5104, 15346: 0x61B6, 15347: 0x6291, 15348: 0x6A8D, 15349: 0x81C6, 15350: 0x5043, 15351: 0x5830, 15352: 0x5F66, 15353: 0x7109, 15354: 0x8A00, 15355: 0x8AFA, 15356: 0x5B7C, 15357: 0x8616, 15358: 0x4FFA, 15359: 0x513C, 15360: 0x56B4, 15361: 0x5944, 15362: 0x63A9, 15363: 0x6DF9, 15364: 0x5DAA, 15365: 0x696D, 15366: 0x5186, 15367: 0x4E88, 15368: 0x4F59, 15369: 0xF97F, 15370: 0xF980, 15371: 0xF981, 15372: 0x5982, 15373: 0xF982, 15374: 0xF983, 15375: 0x6B5F, 15376: 0x6C5D, 15377: 0xF984, 15378: 0x74B5, 15379: 0x7916, 15380: 0xF985, 15381: 0x8207, 15382: 0x8245, 15383: 0x8339, 15384: 0x8F3F, 15385: 0x8F5D, 15386: 0xF986, 15387: 0x9918, 15388: 0xF987, 15389: 0xF988, 15390: 0xF989, 15391: 0x4EA6, 15392: 0xF98A, 15393: 0x57DF, 15394: 0x5F79, 15395: 0x6613, 15396: 0xF98B, 15397: 0xF98C, 15398: 0x75AB, 15399: 0x7E79, 15400: 0x8B6F, 15401: 0xF98D, 15402: 0x9006, 15403: 0x9A5B, 15404: 0x56A5, 15405: 0x5827, 15406: 0x59F8, 15407: 0x5A1F, 15408: 0x5BB4, 15409: 0xF98E, 15410: 0x5EF6, 15411: 0xF98F, 15412: 0xF990, 15413: 0x6350, 15414: 0x633B, 15415: 0xF991, 15416: 0x693D, 15417: 0x6C87, 15418: 0x6CBF, 15419: 0x6D8E, 15420: 0x6D93, 15421: 0x6DF5, 15422: 0x6F14, 15423: 0xF992, 15424: 0x70DF, 15425: 0x7136, 15426: 0x7159, 15427: 0xF993, 15428: 0x71C3, 15429: 0x71D5, 15430: 0xF994, 15431: 0x784F, 15432: 0x786F, 15433: 0xF995, 15434: 0x7B75, 15435: 0x7DE3, 15436: 0xF996, 15437: 0x7E2F, 15438: 0xF997, 15439: 0x884D, 15440: 0x8EDF, 15441: 0xF998, 15442: 0xF999, 15443: 0xF99A, 15444: 0x925B, 15445: 0xF99B, 15446: 0x9CF6, 15447: 0xF99C, 15448: 0xF99D, 15449: 0xF99E, 15450: 0x6085, 15451: 0x6D85, 15452: 0xF99F, 15453: 0x71B1, 15454: 0xF9A0, 15455: 0xF9A1, 15456: 0x95B1, 15457: 0x53AD, 15458: 0xF9A2, 15459: 0xF9A3, 15460: 0xF9A4, 15461: 0x67D3, 15462: 0xF9A5, 15463: 0x708E, 15464: 0x7130, 15465: 0x7430, 15466: 0x8276, 15467: 0x82D2, 15468: 0xF9A6, 15469: 0x95BB, 15470: 0x9AE5, 15471: 0x9E7D, 15472: 0x66C4, 15473: 0xF9A7, 15474: 0x71C1, 15475: 0x8449, 15476: 0xF9A8, 15477: 0xF9A9, 15478: 0x584B, 15479: 0xF9AA, 15480: 0xF9AB, 15481: 0x5DB8, 15482: 0x5F71, 15483: 0xF9AC, 15484: 0x6620, 15485: 0x668E, 15486: 0x6979, 15487: 0x69AE, 15488: 0x6C38, 15489: 0x6CF3, 15490: 0x6E36, 15491: 0x6F41, 15492: 0x6FDA, 15493: 0x701B, 15494: 0x702F, 15495: 0x7150, 15496: 0x71DF, 15497: 0x7370, 15498: 0xF9AD, 15499: 0x745B, 15500: 0xF9AE, 15501: 0x74D4, 15502: 0x76C8, 15503: 0x7A4E, 15504: 0x7E93, 15505: 0xF9AF, 15506: 0xF9B0, 15507: 0x82F1, 15508: 0x8A60, 15509: 0x8FCE, 15510: 0xF9B1, 15511: 0x9348, 15512: 0xF9B2, 15513: 0x9719, 15514: 0xF9B3, 15515: 0xF9B4, 15516: 0x4E42, 15517: 0x502A, 15518: 0xF9B5, 15519: 0x5208, 15520: 0x53E1, 15521: 0x66F3, 15522: 0x6C6D, 15523: 0x6FCA, 15524: 0x730A, 15525: 0x777F, 15526: 0x7A62, 15527: 0x82AE, 15528: 0x85DD, 15529: 0x8602, 15530: 0xF9B6, 15531: 0x88D4, 15532: 0x8A63, 15533: 0x8B7D, 15534: 0x8C6B, 15535: 0xF9B7, 15536: 0x92B3, 15537: 0xF9B8, 15538: 0x9713, 15539: 0x9810, 15540: 0x4E94, 15541: 0x4F0D, 15542: 0x4FC9, 15543: 0x50B2, 15544: 0x5348, 15545: 0x543E, 15546: 0x5433, 15547: 0x55DA, 15548: 0x5862, 15549: 0x58BA, 15550: 0x5967, 15551: 0x5A1B, 15552: 0x5BE4, 15553: 0x609F, 15554: 0xF9B9, 15555: 0x61CA, 15556: 0x6556, 15557: 0x65FF, 15558: 0x6664, 15559: 0x68A7, 15560: 0x6C5A, 15561: 0x6FB3, 15562: 0x70CF, 15563: 0x71AC, 15564: 0x7352, 15565: 0x7B7D, 15566: 0x8708, 15567: 0x8AA4, 15568: 0x9C32, 15569: 0x9F07, 15570: 0x5C4B, 15571: 0x6C83, 15572: 0x7344, 15573: 0x7389, 15574: 0x923A, 15575: 0x6EAB, 15576: 0x7465, 15577: 0x761F, 15578: 0x7A69, 15579: 0x7E15, 15580: 0x860A, 15581: 0x5140, 15582: 0x58C5, 15583: 0x64C1, 15584: 0x74EE, 15585: 0x7515, 15586: 0x7670, 15587: 0x7FC1, 15588: 0x9095, 15589: 0x96CD, 15590: 0x9954, 15591: 0x6E26, 15592: 0x74E6, 15593: 0x7AA9, 15594: 0x7AAA, 15595: 0x81E5, 15596: 0x86D9, 15597: 0x8778, 15598: 0x8A1B, 15599: 0x5A49, 15600: 0x5B8C, 15601: 0x5B9B, 15602: 0x68A1, 15603: 0x6900, 15604: 0x6D63, 15605: 0x73A9, 15606: 0x7413, 15607: 0x742C, 15608: 0x7897, 15609: 0x7DE9, 15610: 0x7FEB, 15611: 0x8118, 15612: 0x8155, 15613: 0x839E, 15614: 0x8C4C, 15615: 0x962E, 15616: 0x9811, 15617: 0x66F0, 15618: 0x5F80, 15619: 0x65FA, 15620: 0x6789, 15621: 0x6C6A, 15622: 0x738B, 15623: 0x502D, 15624: 0x5A03, 15625: 0x6B6A, 15626: 0x77EE, 15627: 0x5916, 15628: 0x5D6C, 15629: 0x5DCD, 15630: 0x7325, 15631: 0x754F, 15632: 0xF9BA, 15633: 0xF9BB, 15634: 0x50E5, 15635: 0x51F9, 15636: 0x582F, 15637: 0x592D, 15638: 0x5996, 15639: 0x59DA, 15640: 0x5BE5, 15641: 0xF9BC, 15642: 0xF9BD, 15643: 0x5DA2, 15644: 0x62D7, 15645: 0x6416, 15646: 0x6493, 15647: 0x64FE, 15648: 0xF9BE, 15649: 0x66DC, 15650: 0xF9BF, 15651: 0x6A48, 15652: 0xF9C0, 15653: 0x71FF, 15654: 0x7464, 15655: 0xF9C1, 15656: 0x7A88, 15657: 0x7AAF, 15658: 0x7E47, 15659: 0x7E5E, 15660: 0x8000, 15661: 0x8170, 15662: 0xF9C2, 15663: 0x87EF, 15664: 0x8981, 15665: 0x8B20, 15666: 0x9059, 15667: 0xF9C3, 15668: 0x9080, 15669: 0x9952, 15670: 0x617E, 15671: 0x6B32, 15672: 0x6D74, 15673: 0x7E1F, 15674: 0x8925, 15675: 0x8FB1, 15676: 0x4FD1, 15677: 0x50AD, 15678: 0x5197, 15679: 0x52C7, 15680: 0x57C7, 15681: 0x5889, 15682: 0x5BB9, 15683: 0x5EB8, 15684: 0x6142, 15685: 0x6995, 15686: 0x6D8C, 15687: 0x6E67, 15688: 0x6EB6, 15689: 0x7194, 15690: 0x7462, 15691: 0x7528, 15692: 0x752C, 15693: 0x8073, 15694: 0x8338, 15695: 0x84C9, 15696: 0x8E0A, 15697: 0x9394, 15698: 0x93DE, 15699: 0xF9C4, 15700: 0x4E8E, 15701: 0x4F51, 15702: 0x5076, 15703: 0x512A, 15704: 0x53C8, 15705: 0x53CB, 15706: 0x53F3, 15707: 0x5B87, 15708: 0x5BD3, 15709: 0x5C24, 15710: 0x611A, 15711: 0x6182, 15712: 0x65F4, 15713: 0x725B, 15714: 0x7397, 15715: 0x7440, 15716: 0x76C2, 15717: 0x7950, 15718: 0x7991, 15719: 0x79B9, 15720: 0x7D06, 15721: 0x7FBD, 15722: 0x828B, 15723: 0x85D5, 15724: 0x865E, 15725: 0x8FC2, 15726: 0x9047, 15727: 0x90F5, 15728: 0x91EA, 15729: 0x9685, 15730: 0x96E8, 15731: 0x96E9, 15732: 0x52D6, 15733: 0x5F67, 15734: 0x65ED, 15735: 0x6631, 15736: 0x682F, 15737: 0x715C, 15738: 0x7A36, 15739: 0x90C1, 15740: 0x980A, 15741: 0x4E91, 15742: 0xF9C5, 15743: 0x6A52, 15744: 0x6B9E, 15745: 0x6F90, 15746: 0x7189, 15747: 0x8018, 15748: 0x82B8, 15749: 0x8553, 15750: 0x904B, 15751: 0x9695, 15752: 0x96F2, 15753: 0x97FB, 15754: 0x851A, 15755: 0x9B31, 15756: 0x4E90, 15757: 0x718A, 15758: 0x96C4, 15759: 0x5143, 15760: 0x539F, 15761: 0x54E1, 15762: 0x5713, 15763: 0x5712, 15764: 0x57A3, 15765: 0x5A9B, 15766: 0x5AC4, 15767: 0x5BC3, 15768: 0x6028, 15769: 0x613F, 15770: 0x63F4, 15771: 0x6C85, 15772: 0x6D39, 15773: 0x6E72, 15774: 0x6E90, 15775: 0x7230, 15776: 0x733F, 15777: 0x7457, 15778: 0x82D1, 15779: 0x8881, 15780: 0x8F45, 15781: 0x9060, 15782: 0xF9C6, 15783: 0x9662, 15784: 0x9858, 15785: 0x9D1B, 15786: 0x6708, 15787: 0x8D8A, 15788: 0x925E, 15789: 0x4F4D, 15790: 0x5049, 15791: 0x50DE, 15792: 0x5371, 15793: 0x570D, 15794: 0x59D4, 15795: 0x5A01, 15796: 0x5C09, 15797: 0x6170, 15798: 0x6690, 15799: 0x6E2D, 15800: 0x7232, 15801: 0x744B, 15802: 0x7DEF, 15803: 0x80C3, 15804: 0x840E, 15805: 0x8466, 15806: 0x853F, 15807: 0x875F, 15808: 0x885B, 15809: 0x8918, 15810: 0x8B02, 15811: 0x9055, 15812: 0x97CB, 15813: 0x9B4F, 15814: 0x4E73, 15815: 0x4F91, 15816: 0x5112, 15817: 0x516A, 15818: 0xF9C7, 15819: 0x552F, 15820: 0x55A9, 15821: 0x5B7A, 15822: 0x5BA5, 15823: 0x5E7C, 15824: 0x5E7D, 15825: 0x5EBE, 15826: 0x60A0, 15827: 0x60DF, 15828: 0x6108, 15829: 0x6109, 15830: 0x63C4, 15831: 0x6538, 15832: 0x6709, 15833: 0xF9C8, 15834: 0x67D4, 15835: 0x67DA, 15836: 0xF9C9, 15837: 0x6961, 15838: 0x6962, 15839: 0x6CB9, 15840: 0x6D27, 15841: 0xF9CA, 15842: 0x6E38, 15843: 0xF9CB, 15844: 0x6FE1, 15845: 0x7336, 15846: 0x7337, 15847: 0xF9CC, 15848: 0x745C, 15849: 0x7531, 15850: 0xF9CD, 15851: 0x7652, 15852: 0xF9CE, 15853: 0xF9CF, 15854: 0x7DAD, 15855: 0x81FE, 15856: 0x8438, 15857: 0x88D5, 15858: 0x8A98, 15859: 0x8ADB, 15860: 0x8AED, 15861: 0x8E30, 15862: 0x8E42, 15863: 0x904A, 15864: 0x903E, 15865: 0x907A, 15866: 0x9149, 15867: 0x91C9, 15868: 0x936E, 15869: 0xF9D0, 15870: 0xF9D1, 15871: 0x5809, 15872: 0xF9D2, 15873: 0x6BD3, 15874: 0x8089, 15875: 0x80B2, 15876: 0xF9D3, 15877: 0xF9D4, 15878: 0x5141, 15879: 0x596B, 15880: 0x5C39, 15881: 0xF9D5, 15882: 0xF9D6, 15883: 0x6F64, 15884: 0x73A7, 15885: 0x80E4, 15886: 0x8D07, 15887: 0xF9D7, 15888: 0x9217, 15889: 0x958F, 15890: 0xF9D8, 15891: 0xF9D9, 15892: 0xF9DA, 15893: 0xF9DB, 15894: 0x807F, 15895: 0x620E, 15896: 0x701C, 15897: 0x7D68, 15898: 0x878D, 15899: 0xF9DC, 15900: 0x57A0, 15901: 0x6069, 15902: 0x6147, 15903: 0x6BB7, 15904: 0x8ABE, 15905: 0x9280, 15906: 0x96B1, 15907: 0x4E59, 15908: 0x541F, 15909: 0x6DEB, 15910: 0x852D, 15911: 0x9670, 15912: 0x97F3, 15913: 0x98EE, 15914: 0x63D6, 15915: 0x6CE3, 15916: 0x9091, 15917: 0x51DD, 15918: 0x61C9, 15919: 0x81BA, 15920: 0x9DF9, 15921: 0x4F9D, 15922: 0x501A, 15923: 0x5100, 15924: 0x5B9C, 15925: 0x610F, 15926: 0x61FF, 15927: 0x64EC, 15928: 0x6905, 15929: 0x6BC5, 15930: 0x7591, 15931: 0x77E3, 15932: 0x7FA9, 15933: 0x8264, 15934: 0x858F, 15935: 0x87FB, 15936: 0x8863, 15937: 0x8ABC, 15938: 0x8B70, 15939: 0x91AB, 15940: 0x4E8C, 15941: 0x4EE5, 15942: 0x4F0A, 15943: 0xF9DD, 15944: 0xF9DE, 15945: 0x5937, 15946: 0x59E8, 15947: 0xF9DF, 15948: 0x5DF2, 15949: 0x5F1B, 15950: 0x5F5B, 15951: 0x6021, 15952: 0xF9E0, 15953: 0xF9E1, 15954: 0xF9E2, 15955: 0xF9E3, 15956: 0x723E, 15957: 0x73E5, 15958: 0xF9E4, 15959: 0x7570, 15960: 0x75CD, 15961: 0xF9E5, 15962: 0x79FB, 15963: 0xF9E6, 15964: 0x800C, 15965: 0x8033, 15966: 0x8084, 15967: 0x82E1, 15968: 0x8351, 15969: 0xF9E7, 15970: 0xF9E8, 15971: 0x8CBD, 15972: 0x8CB3, 15973: 0x9087, 15974: 0xF9E9, 15975: 0xF9EA, 15976: 0x98F4, 15977: 0x990C, 15978: 0xF9EB, 15979: 0xF9EC, 15980: 0x7037, 15981: 0x76CA, 15982: 0x7FCA, 15983: 0x7FCC, 15984: 0x7FFC, 15985: 0x8B1A, 15986: 0x4EBA, 15987: 0x4EC1, 15988: 0x5203, 15989: 0x5370, 15990: 0xF9ED, 15991: 0x54BD, 15992: 0x56E0, 15993: 0x59FB, 15994: 0x5BC5, 15995: 0x5F15, 15996: 0x5FCD, 15997: 0x6E6E, 15998: 0xF9EE, 15999: 0xF9EF, 16000: 0x7D6A, 16001: 0x8335, 16002: 0xF9F0, 16003: 0x8693, 16004: 0x8A8D, 16005: 0xF9F1, 16006: 0x976D, 16007: 0x9777, 16008: 0xF9F2, 16009: 0xF9F3, 16010: 0x4E00, 16011: 0x4F5A, 16012: 0x4F7E, 16013: 0x58F9, 16014: 0x65E5, 16015: 0x6EA2, 16016: 0x9038, 16017: 0x93B0, 16018: 0x99B9, 16019: 0x4EFB, 16020: 0x58EC, 16021: 0x598A, 16022: 0x59D9, 16023: 0x6041, 16024: 0xF9F4, 16025: 0xF9F5, 16026: 0x7A14, 16027: 0xF9F6, 16028: 0x834F, 16029: 0x8CC3, 16030: 0x5165, 16031: 0x5344, 16032: 0xF9F7, 16033: 0xF9F8, 16034: 0xF9F9, 16035: 0x4ECD, 16036: 0x5269, 16037: 0x5B55, 16038: 0x82BF, 16039: 0x4ED4, 16040: 0x523A, 16041: 0x54A8, 16042: 0x59C9, 16043: 0x59FF, 16044: 0x5B50, 16045: 0x5B57, 16046: 0x5B5C, 16047: 0x6063, 16048: 0x6148, 16049: 0x6ECB, 16050: 0x7099, 16051: 0x716E, 16052: 0x7386, 16053: 0x74F7, 16054: 0x75B5, 16055: 0x78C1, 16056: 0x7D2B, 16057: 0x8005, 16058: 0x81EA, 16059: 0x8328, 16060: 0x8517, 16061: 0x85C9, 16062: 0x8AEE, 16063: 0x8CC7, 16064: 0x96CC, 16065: 0x4F5C, 16066: 0x52FA, 16067: 0x56BC, 16068: 0x65AB, 16069: 0x6628, 16070: 0x707C, 16071: 0x70B8, 16072: 0x7235, 16073: 0x7DBD, 16074: 0x828D, 16075: 0x914C, 16076: 0x96C0, 16077: 0x9D72, 16078: 0x5B71, 16079: 0x68E7, 16080: 0x6B98, 16081: 0x6F7A, 16082: 0x76DE, 16083: 0x5C91, 16084: 0x66AB, 16085: 0x6F5B, 16086: 0x7BB4, 16087: 0x7C2A, 16088: 0x8836, 16089: 0x96DC, 16090: 0x4E08, 16091: 0x4ED7, 16092: 0x5320, 16093: 0x5834, 16094: 0x58BB, 16095: 0x58EF, 16096: 0x596C, 16097: 0x5C07, 16098: 0x5E33, 16099: 0x5E84, 16100: 0x5F35, 16101: 0x638C, 16102: 0x66B2, 16103: 0x6756, 16104: 0x6A1F, 16105: 0x6AA3, 16106: 0x6B0C, 16107: 0x6F3F, 16108: 0x7246, 16109: 0xF9FA, 16110: 0x7350, 16111: 0x748B, 16112: 0x7AE0, 16113: 0x7CA7, 16114: 0x8178, 16115: 0x81DF, 16116: 0x81E7, 16117: 0x838A, 16118: 0x846C, 16119: 0x8523, 16120: 0x8594, 16121: 0x85CF, 16122: 0x88DD, 16123: 0x8D13, 16124: 0x91AC, 16125: 0x9577, 16126: 0x969C, 16127: 0x518D, 16128: 0x54C9, 16129: 0x5728, 16130: 0x5BB0, 16131: 0x624D, 16132: 0x6750, 16133: 0x683D, 16134: 0x6893, 16135: 0x6E3D, 16136: 0x6ED3, 16137: 0x707D, 16138: 0x7E21, 16139: 0x88C1, 16140: 0x8CA1, 16141: 0x8F09, 16142: 0x9F4B, 16143: 0x9F4E, 16144: 0x722D, 16145: 0x7B8F, 16146: 0x8ACD, 16147: 0x931A, 16148: 0x4F47, 16149: 0x4F4E, 16150: 0x5132, 16151: 0x5480, 16152: 0x59D0, 16153: 0x5E95, 16154: 0x62B5, 16155: 0x6775, 16156: 0x696E, 16157: 0x6A17, 16158: 0x6CAE, 16159: 0x6E1A, 16160: 0x72D9, 16161: 0x732A, 16162: 0x75BD, 16163: 0x7BB8, 16164: 0x7D35, 16165: 0x82E7, 16166: 0x83F9, 16167: 0x8457, 16168: 0x85F7, 16169: 0x8A5B, 16170: 0x8CAF, 16171: 0x8E87, 16172: 0x9019, 16173: 0x90B8, 16174: 0x96CE, 16175: 0x9F5F, 16176: 0x52E3, 16177: 0x540A, 16178: 0x5AE1, 16179: 0x5BC2, 16180: 0x6458, 16181: 0x6575, 16182: 0x6EF4, 16183: 0x72C4, 16184: 0xF9FB, 16185: 0x7684, 16186: 0x7A4D, 16187: 0x7B1B, 16188: 0x7C4D, 16189: 0x7E3E, 16190: 0x7FDF, 16191: 0x837B, 16192: 0x8B2B, 16193: 0x8CCA, 16194: 0x8D64, 16195: 0x8DE1, 16196: 0x8E5F, 16197: 0x8FEA, 16198: 0x8FF9, 16199: 0x9069, 16200: 0x93D1, 16201: 0x4F43, 16202: 0x4F7A, 16203: 0x50B3, 16204: 0x5168, 16205: 0x5178, 16206: 0x524D, 16207: 0x526A, 16208: 0x5861, 16209: 0x587C, 16210: 0x5960, 16211: 0x5C08, 16212: 0x5C55, 16213: 0x5EDB, 16214: 0x609B, 16215: 0x6230, 16216: 0x6813, 16217: 0x6BBF, 16218: 0x6C08, 16219: 0x6FB1, 16220: 0x714E, 16221: 0x7420, 16222: 0x7530, 16223: 0x7538, 16224: 0x7551, 16225: 0x7672, 16226: 0x7B4C, 16227: 0x7B8B, 16228: 0x7BAD, 16229: 0x7BC6, 16230: 0x7E8F, 16231: 0x8A6E, 16232: 0x8F3E, 16233: 0x8F49, 16234: 0x923F, 16235: 0x9293, 16236: 0x9322, 16237: 0x942B, 16238: 0x96FB, 16239: 0x985A, 16240: 0x986B, 16241: 0x991E, 16242: 0x5207, 16243: 0x622A, 16244: 0x6298, 16245: 0x6D59, 16246: 0x7664, 16247: 0x7ACA, 16248: 0x7BC0, 16249: 0x7D76, 16250: 0x5360, 16251: 0x5CBE, 16252: 0x5E97, 16253: 0x6F38, 16254: 0x70B9, 16255: 0x7C98, 16256: 0x9711, 16257: 0x9B8E, 16258: 0x9EDE, 16259: 0x63A5, 16260: 0x647A, 16261: 0x8776, 16262: 0x4E01, 16263: 0x4E95, 16264: 0x4EAD, 16265: 0x505C, 16266: 0x5075, 16267: 0x5448, 16268: 0x59C3, 16269: 0x5B9A, 16270: 0x5E40, 16271: 0x5EAD, 16272: 0x5EF7, 16273: 0x5F81, 16274: 0x60C5, 16275: 0x633A, 16276: 0x653F, 16277: 0x6574, 16278: 0x65CC, 16279: 0x6676, 16280: 0x6678, 16281: 0x67FE, 16282: 0x6968, 16283: 0x6A89, 16284: 0x6B63, 16285: 0x6C40, 16286: 0x6DC0, 16287: 0x6DE8, 16288: 0x6E1F, 16289: 0x6E5E, 16290: 0x701E, 16291: 0x70A1, 16292: 0x738E, 16293: 0x73FD, 16294: 0x753A, 16295: 0x775B, 16296: 0x7887, 16297: 0x798E, 16298: 0x7A0B, 16299: 0x7A7D, 16300: 0x7CBE, 16301: 0x7D8E, 16302: 0x8247, 16303: 0x8A02, 16304: 0x8AEA, 16305: 0x8C9E, 16306: 0x912D, 16307: 0x914A, 16308: 0x91D8, 16309: 0x9266, 16310: 0x92CC, 16311: 0x9320, 16312: 0x9706, 16313: 0x9756, 16314: 0x975C, 16315: 0x9802, 16316: 0x9F0E, 16317: 0x5236, 16318: 0x5291, 16319: 0x557C, 16320: 0x5824, 16321: 0x5E1D, 16322: 0x5F1F, 16323: 0x608C, 16324: 0x63D0, 16325: 0x68AF, 16326: 0x6FDF, 16327: 0x796D, 16328: 0x7B2C, 16329: 0x81CD, 16330: 0x85BA, 16331: 0x88FD, 16332: 0x8AF8, 16333: 0x8E44, 16334: 0x918D, 16335: 0x9664, 16336: 0x969B, 16337: 0x973D, 16338: 0x984C, 16339: 0x9F4A, 16340: 0x4FCE, 16341: 0x5146, 16342: 0x51CB, 16343: 0x52A9, 16344: 0x5632, 16345: 0x5F14, 16346: 0x5F6B, 16347: 0x63AA, 16348: 0x64CD, 16349: 0x65E9, 16350: 0x6641, 16351: 0x66FA, 16352: 0x66F9, 16353: 0x671D, 16354: 0x689D, 16355: 0x68D7, 16356: 0x69FD, 16357: 0x6F15, 16358: 0x6F6E, 16359: 0x7167, 16360: 0x71E5, 16361: 0x722A, 16362: 0x74AA, 16363: 0x773A, 16364: 0x7956, 16365: 0x795A, 16366: 0x79DF, 16367: 0x7A20, 16368: 0x7A95, 16369: 0x7C97, 16370: 0x7CDF, 16371: 0x7D44, 16372: 0x7E70, 16373: 0x8087, 16374: 0x85FB, 16375: 0x86A4, 16376: 0x8A54, 16377: 0x8ABF, 16378: 0x8D99, 16379: 0x8E81, 16380: 0x9020, 16381: 0x906D, 16382: 0x91E3, 16383: 0x963B, 16384: 0x96D5, 16385: 0x9CE5, 16386: 0x65CF, 16387: 0x7C07, 16388: 0x8DB3, 16389: 0x93C3, 16390: 0x5B58, 16391: 0x5C0A, 16392: 0x5352, 16393: 0x62D9, 16394: 0x731D, 16395: 0x5027, 16396: 0x5B97, 16397: 0x5F9E, 16398: 0x60B0, 16399: 0x616B, 16400: 0x68D5, 16401: 0x6DD9, 16402: 0x742E, 16403: 0x7A2E, 16404: 0x7D42, 16405: 0x7D9C, 16406: 0x7E31, 16407: 0x816B, 16408: 0x8E2A, 16409: 0x8E35, 16410: 0x937E, 16411: 0x9418, 16412: 0x4F50, 16413: 0x5750, 16414: 0x5DE6, 16415: 0x5EA7, 16416: 0x632B, 16417: 0x7F6A, 16418: 0x4E3B, 16419: 0x4F4F, 16420: 0x4F8F, 16421: 0x505A, 16422: 0x59DD, 16423: 0x80C4, 16424: 0x546A, 16425: 0x5468, 16426: 0x55FE, 16427: 0x594F, 16428: 0x5B99, 16429: 0x5DDE, 16430: 0x5EDA, 16431: 0x665D, 16432: 0x6731, 16433: 0x67F1, 16434: 0x682A, 16435: 0x6CE8, 16436: 0x6D32, 16437: 0x6E4A, 16438: 0x6F8D, 16439: 0x70B7, 16440: 0x73E0, 16441: 0x7587, 16442: 0x7C4C, 16443: 0x7D02, 16444: 0x7D2C, 16445: 0x7DA2, 16446: 0x821F, 16447: 0x86DB, 16448: 0x8A3B, 16449: 0x8A85, 16450: 0x8D70, 16451: 0x8E8A, 16452: 0x8F33, 16453: 0x9031, 16454: 0x914E, 16455: 0x9152, 16456: 0x9444, 16457: 0x99D0, 16458: 0x7AF9, 16459: 0x7CA5, 16460: 0x4FCA, 16461: 0x5101, 16462: 0x51C6, 16463: 0x57C8, 16464: 0x5BEF, 16465: 0x5CFB, 16466: 0x6659, 16467: 0x6A3D, 16468: 0x6D5A, 16469: 0x6E96, 16470: 0x6FEC, 16471: 0x710C, 16472: 0x756F, 16473: 0x7AE3, 16474: 0x8822, 16475: 0x9021, 16476: 0x9075, 16477: 0x96CB, 16478: 0x99FF, 16479: 0x8301, 16480: 0x4E2D, 16481: 0x4EF2, 16482: 0x8846, 16483: 0x91CD, 16484: 0x537D, 16485: 0x6ADB, 16486: 0x696B, 16487: 0x6C41, 16488: 0x847A, 16489: 0x589E, 16490: 0x618E, 16491: 0x66FE, 16492: 0x62EF, 16493: 0x70DD, 16494: 0x7511, 16495: 0x75C7, 16496: 0x7E52, 16497: 0x84B8, 16498: 0x8B49, 16499: 0x8D08, 16500: 0x4E4B, 16501: 0x53EA, 16502: 0x54AB, 16503: 0x5730, 16504: 0x5740, 16505: 0x5FD7, 16506: 0x6301, 16507: 0x6307, 16508: 0x646F, 16509: 0x652F, 16510: 0x65E8, 16511: 0x667A, 16512: 0x679D, 16513: 0x67B3, 16514: 0x6B62, 16515: 0x6C60, 16516: 0x6C9A, 16517: 0x6F2C, 16518: 0x77E5, 16519: 0x7825, 16520: 0x7949, 16521: 0x7957, 16522: 0x7D19, 16523: 0x80A2, 16524: 0x8102, 16525: 0x81F3, 16526: 0x829D, 16527: 0x82B7, 16528: 0x8718, 16529: 0x8A8C, 16530: 0xF9FC, 16531: 0x8D04, 16532: 0x8DBE, 16533: 0x9072, 16534: 0x76F4, 16535: 0x7A19, 16536: 0x7A37, 16537: 0x7E54, 16538: 0x8077, 16539: 0x5507, 16540: 0x55D4, 16541: 0x5875, 16542: 0x632F, 16543: 0x6422, 16544: 0x6649, 16545: 0x664B, 16546: 0x686D, 16547: 0x699B, 16548: 0x6B84, 16549: 0x6D25, 16550: 0x6EB1, 16551: 0x73CD, 16552: 0x7468, 16553: 0x74A1, 16554: 0x755B, 16555: 0x75B9, 16556: 0x76E1, 16557: 0x771E, 16558: 0x778B, 16559: 0x79E6, 16560: 0x7E09, 16561: 0x7E1D, 16562: 0x81FB, 16563: 0x852F, 16564: 0x8897, 16565: 0x8A3A, 16566: 0x8CD1, 16567: 0x8EEB, 16568: 0x8FB0, 16569: 0x9032, 16570: 0x93AD, 16571: 0x9663, 16572: 0x9673, 16573: 0x9707, 16574: 0x4F84, 16575: 0x53F1, 16576: 0x59EA, 16577: 0x5AC9, 16578: 0x5E19, 16579: 0x684E, 16580: 0x74C6, 16581: 0x75BE, 16582: 0x79E9, 16583: 0x7A92, 16584: 0x81A3, 16585: 0x86ED, 16586: 0x8CEA, 16587: 0x8DCC, 16588: 0x8FED, 16589: 0x659F, 16590: 0x6715, 16591: 0xF9FD, 16592: 0x57F7, 16593: 0x6F57, 16594: 0x7DDD, 16595: 0x8F2F, 16596: 0x93F6, 16597: 0x96C6, 16598: 0x5FB5, 16599: 0x61F2, 16600: 0x6F84, 16601: 0x4E14, 16602: 0x4F98, 16603: 0x501F, 16604: 0x53C9, 16605: 0x55DF, 16606: 0x5D6F, 16607: 0x5DEE, 16608: 0x6B21, 16609: 0x6B64, 16610: 0x78CB, 16611: 0x7B9A, 16612: 0xF9FE, 16613: 0x8E49, 16614: 0x8ECA, 16615: 0x906E, 16616: 0x6349, 16617: 0x643E, 16618: 0x7740, 16619: 0x7A84, 16620: 0x932F, 16621: 0x947F, 16622: 0x9F6A, 16623: 0x64B0, 16624: 0x6FAF, 16625: 0x71E6, 16626: 0x74A8, 16627: 0x74DA, 16628: 0x7AC4, 16629: 0x7C12, 16630: 0x7E82, 16631: 0x7CB2, 16632: 0x7E98, 16633: 0x8B9A, 16634: 0x8D0A, 16635: 0x947D, 16636: 0x9910, 16637: 0x994C, 16638: 0x5239, 16639: 0x5BDF, 16640: 0x64E6, 16641: 0x672D, 16642: 0x7D2E, 16643: 0x50ED, 16644: 0x53C3, 16645: 0x5879, 16646: 0x6158, 16647: 0x6159, 16648: 0x61FA, 16649: 0x65AC, 16650: 0x7AD9, 16651: 0x8B92, 16652: 0x8B96, 16653: 0x5009, 16654: 0x5021, 16655: 0x5275, 16656: 0x5531, 16657: 0x5A3C, 16658: 0x5EE0, 16659: 0x5F70, 16660: 0x6134, 16661: 0x655E, 16662: 0x660C, 16663: 0x6636, 16664: 0x66A2, 16665: 0x69CD, 16666: 0x6EC4, 16667: 0x6F32, 16668: 0x7316, 16669: 0x7621, 16670: 0x7A93, 16671: 0x8139, 16672: 0x8259, 16673: 0x83D6, 16674: 0x84BC, 16675: 0x50B5, 16676: 0x57F0, 16677: 0x5BC0, 16678: 0x5BE8, 16679: 0x5F69, 16680: 0x63A1, 16681: 0x7826, 16682: 0x7DB5, 16683: 0x83DC, 16684: 0x8521, 16685: 0x91C7, 16686: 0x91F5, 16687: 0x518A, 16688: 0x67F5, 16689: 0x7B56, 16690: 0x8CAC, 16691: 0x51C4, 16692: 0x59BB, 16693: 0x60BD, 16694: 0x8655, 16695: 0x501C, 16696: 0xF9FF, 16697: 0x5254, 16698: 0x5C3A, 16699: 0x617D, 16700: 0x621A, 16701: 0x62D3, 16702: 0x64F2, 16703: 0x65A5, 16704: 0x6ECC, 16705: 0x7620, 16706: 0x810A, 16707: 0x8E60, 16708: 0x965F, 16709: 0x96BB, 16710: 0x4EDF, 16711: 0x5343, 16712: 0x5598, 16713: 0x5929, 16714: 0x5DDD, 16715: 0x64C5, 16716: 0x6CC9, 16717: 0x6DFA, 16718: 0x7394, 16719: 0x7A7F, 16720: 0x821B, 16721: 0x85A6, 16722: 0x8CE4, 16723: 0x8E10, 16724: 0x9077, 16725: 0x91E7, 16726: 0x95E1, 16727: 0x9621, 16728: 0x97C6, 16729: 0x51F8, 16730: 0x54F2, 16731: 0x5586, 16732: 0x5FB9, 16733: 0x64A4, 16734: 0x6F88, 16735: 0x7DB4, 16736: 0x8F1F, 16737: 0x8F4D, 16738: 0x9435, 16739: 0x50C9, 16740: 0x5C16, 16741: 0x6CBE, 16742: 0x6DFB, 16743: 0x751B, 16744: 0x77BB, 16745: 0x7C3D, 16746: 0x7C64, 16747: 0x8A79, 16748: 0x8AC2, 16749: 0x581E, 16750: 0x59BE, 16751: 0x5E16, 16752: 0x6377, 16753: 0x7252, 16754: 0x758A, 16755: 0x776B, 16756: 0x8ADC, 16757: 0x8CBC, 16758: 0x8F12, 16759: 0x5EF3, 16760: 0x6674, 16761: 0x6DF8, 16762: 0x807D, 16763: 0x83C1, 16764: 0x8ACB, 16765: 0x9751, 16766: 0x9BD6, 16767: 0xFA00, 16768: 0x5243, 16769: 0x66FF, 16770: 0x6D95, 16771: 0x6EEF, 16772: 0x7DE0, 16773: 0x8AE6, 16774: 0x902E, 16775: 0x905E, 16776: 0x9AD4, 16777: 0x521D, 16778: 0x527F, 16779: 0x54E8, 16780: 0x6194, 16781: 0x6284, 16782: 0x62DB, 16783: 0x68A2, 16784: 0x6912, 16785: 0x695A, 16786: 0x6A35, 16787: 0x7092, 16788: 0x7126, 16789: 0x785D, 16790: 0x7901, 16791: 0x790E, 16792: 0x79D2, 16793: 0x7A0D, 16794: 0x8096, 16795: 0x8278, 16796: 0x82D5, 16797: 0x8349, 16798: 0x8549, 16799: 0x8C82, 16800: 0x8D85, 16801: 0x9162, 16802: 0x918B, 16803: 0x91AE, 16804: 0x4FC3, 16805: 0x56D1, 16806: 0x71ED, 16807: 0x77D7, 16808: 0x8700, 16809: 0x89F8, 16810: 0x5BF8, 16811: 0x5FD6, 16812: 0x6751, 16813: 0x90A8, 16814: 0x53E2, 16815: 0x585A, 16816: 0x5BF5, 16817: 0x60A4, 16818: 0x6181, 16819: 0x6460, 16820: 0x7E3D, 16821: 0x8070, 16822: 0x8525, 16823: 0x9283, 16824: 0x64AE, 16825: 0x50AC, 16826: 0x5D14, 16827: 0x6700, 16828: 0x589C, 16829: 0x62BD, 16830: 0x63A8, 16831: 0x690E, 16832: 0x6978, 16833: 0x6A1E, 16834: 0x6E6B, 16835: 0x76BA, 16836: 0x79CB, 16837: 0x82BB, 16838: 0x8429, 16839: 0x8ACF, 16840: 0x8DA8, 16841: 0x8FFD, 16842: 0x9112, 16843: 0x914B, 16844: 0x919C, 16845: 0x9310, 16846: 0x9318, 16847: 0x939A, 16848: 0x96DB, 16849: 0x9A36, 16850: 0x9C0D, 16851: 0x4E11, 16852: 0x755C, 16853: 0x795D, 16854: 0x7AFA, 16855: 0x7B51, 16856: 0x7BC9, 16857: 0x7E2E, 16858: 0x84C4, 16859: 0x8E59, 16860: 0x8E74, 16861: 0x8EF8, 16862: 0x9010, 16863: 0x6625, 16864: 0x693F, 16865: 0x7443, 16866: 0x51FA, 16867: 0x672E, 16868: 0x9EDC, 16869: 0x5145, 16870: 0x5FE0, 16871: 0x6C96, 16872: 0x87F2, 16873: 0x885D, 16874: 0x8877, 16875: 0x60B4, 16876: 0x81B5, 16877: 0x8403, 16878: 0x8D05, 16879: 0x53D6, 16880: 0x5439, 16881: 0x5634, 16882: 0x5A36, 16883: 0x5C31, 16884: 0x708A, 16885: 0x7FE0, 16886: 0x805A, 16887: 0x8106, 16888: 0x81ED, 16889: 0x8DA3, 16890: 0x9189, 16891: 0x9A5F, 16892: 0x9DF2, 16893: 0x5074, 16894: 0x4EC4, 16895: 0x53A0, 16896: 0x60FB, 16897: 0x6E2C, 16898: 0x5C64, 16899: 0x4F88, 16900: 0x5024, 16901: 0x55E4, 16902: 0x5CD9, 16903: 0x5E5F, 16904: 0x6065, 16905: 0x6894, 16906: 0x6CBB, 16907: 0x6DC4, 16908: 0x71BE, 16909: 0x75D4, 16910: 0x75F4, 16911: 0x7661, 16912: 0x7A1A, 16913: 0x7A49, 16914: 0x7DC7, 16915: 0x7DFB, 16916: 0x7F6E, 16917: 0x81F4, 16918: 0x86A9, 16919: 0x8F1C, 16920: 0x96C9, 16921: 0x99B3, 16922: 0x9F52, 16923: 0x5247, 16924: 0x52C5, 16925: 0x98ED, 16926: 0x89AA, 16927: 0x4E03, 16928: 0x67D2, 16929: 0x6F06, 16930: 0x4FB5, 16931: 0x5BE2, 16932: 0x6795, 16933: 0x6C88, 16934: 0x6D78, 16935: 0x741B, 16936: 0x7827, 16937: 0x91DD, 16938: 0x937C, 16939: 0x87C4, 16940: 0x79E4, 16941: 0x7A31, 16942: 0x5FEB, 16943: 0x4ED6, 16944: 0x54A4, 16945: 0x553E, 16946: 0x58AE, 16947: 0x59A5, 16948: 0x60F0, 16949: 0x6253, 16950: 0x62D6, 16951: 0x6736, 16952: 0x6955, 16953: 0x8235, 16954: 0x9640, 16955: 0x99B1, 16956: 0x99DD, 16957: 0x502C, 16958: 0x5353, 16959: 0x5544, 16960: 0x577C, 16961: 0xFA01, 16962: 0x6258, 16963: 0xFA02, 16964: 0x64E2, 16965: 0x666B, 16966: 0x67DD, 16967: 0x6FC1, 16968: 0x6FEF, 16969: 0x7422, 16970: 0x7438, 16971: 0x8A17, 16972: 0x9438, 16973: 0x5451, 16974: 0x5606, 16975: 0x5766, 16976: 0x5F48, 16977: 0x619A, 16978: 0x6B4E, 16979: 0x7058, 16980: 0x70AD, 16981: 0x7DBB, 16982: 0x8A95, 16983: 0x596A, 16984: 0x812B, 16985: 0x63A2, 16986: 0x7708, 16987: 0x803D, 16988: 0x8CAA, 16989: 0x5854, 16990: 0x642D, 16991: 0x69BB, 16992: 0x5B95, 16993: 0x5E11, 16994: 0x6E6F, 16995: 0xFA03, 16996: 0x8569, 16997: 0x514C, 16998: 0x53F0, 16999: 0x592A, 17000: 0x6020, 17001: 0x614B, 17002: 0x6B86, 17003: 0x6C70, 17004: 0x6CF0, 17005: 0x7B1E, 17006: 0x80CE, 17007: 0x82D4, 17008: 0x8DC6, 17009: 0x90B0, 17010: 0x98B1, 17011: 0xFA04, 17012: 0x64C7, 17013: 0x6FA4, 17014: 0x6491, 17015: 0x6504, 17016: 0x514E, 17017: 0x5410, 17018: 0x571F, 17019: 0x8A0E, 17020: 0x615F, 17021: 0x6876, 17022: 0xFA05, 17023: 0x75DB, 17024: 0x7B52, 17025: 0x7D71, 17026: 0x901A, 17027: 0x5806, 17028: 0x69CC, 17029: 0x817F, 17030: 0x892A, 17031: 0x9000, 17032: 0x9839, 17033: 0x5078, 17034: 0x5957, 17035: 0x59AC, 17036: 0x6295, 17037: 0x900F, 17038: 0x9B2A, 17039: 0x615D, 17040: 0x7279, 17041: 0x95D6, 17042: 0x5761, 17043: 0x5A46, 17044: 0x5DF4, 17045: 0x628A, 17046: 0x64AD, 17047: 0x64FA, 17048: 0x6777, 17049: 0x6CE2, 17050: 0x6D3E, 17051: 0x722C, 17052: 0x7436, 17053: 0x7834, 17054: 0x7F77, 17055: 0x82AD, 17056: 0x8DDB, 17057: 0x9817, 17058: 0x5224, 17059: 0x5742, 17060: 0x677F, 17061: 0x7248, 17062: 0x74E3, 17063: 0x8CA9, 17064: 0x8FA6, 17065: 0x9211, 17066: 0x962A, 17067: 0x516B, 17068: 0x53ED, 17069: 0x634C, 17070: 0x4F69, 17071: 0x5504, 17072: 0x6096, 17073: 0x6557, 17074: 0x6C9B, 17075: 0x6D7F, 17076: 0x724C, 17077: 0x72FD, 17078: 0x7A17, 17079: 0x8987, 17080: 0x8C9D, 17081: 0x5F6D, 17082: 0x6F8E, 17083: 0x70F9, 17084: 0x81A8, 17085: 0x610E, 17086: 0x4FBF, 17087: 0x504F, 17088: 0x6241, 17089: 0x7247, 17090: 0x7BC7, 17091: 0x7DE8, 17092: 0x7FE9, 17093: 0x904D, 17094: 0x97AD, 17095: 0x9A19, 17096: 0x8CB6, 17097: 0x576A, 17098: 0x5E73, 17099: 0x67B0, 17100: 0x840D, 17101: 0x8A55, 17102: 0x5420, 17103: 0x5B16, 17104: 0x5E63, 17105: 0x5EE2, 17106: 0x5F0A, 17107: 0x6583, 17108: 0x80BA, 17109: 0x853D, 17110: 0x9589, 17111: 0x965B, 17112: 0x4F48, 17113: 0x5305, 17114: 0x530D, 17115: 0x530F, 17116: 0x5486, 17117: 0x54FA, 17118: 0x5703, 17119: 0x5E03, 17120: 0x6016, 17121: 0x629B, 17122: 0x62B1, 17123: 0x6355, 17124: 0xFA06, 17125: 0x6CE1, 17126: 0x6D66, 17127: 0x75B1, 17128: 0x7832, 17129: 0x80DE, 17130: 0x812F, 17131: 0x82DE, 17132: 0x8461, 17133: 0x84B2, 17134: 0x888D, 17135: 0x8912, 17136: 0x900B, 17137: 0x92EA, 17138: 0x98FD, 17139: 0x9B91, 17140: 0x5E45, 17141: 0x66B4, 17142: 0x66DD, 17143: 0x7011, 17144: 0x7206, 17145: 0xFA07, 17146: 0x4FF5, 17147: 0x527D, 17148: 0x5F6A, 17149: 0x6153, 17150: 0x6753, 17151: 0x6A19, 17152: 0x6F02, 17153: 0x74E2, 17154: 0x7968, 17155: 0x8868, 17156: 0x8C79, 17157: 0x98C7, 17158: 0x98C4, 17159: 0x9A43, 17160: 0x54C1, 17161: 0x7A1F, 17162: 0x6953, 17163: 0x8AF7, 17164: 0x8C4A, 17165: 0x98A8, 17166: 0x99AE, 17167: 0x5F7C, 17168: 0x62AB, 17169: 0x75B2, 17170: 0x76AE, 17171: 0x88AB, 17172: 0x907F, 17173: 0x9642, 17174: 0x5339, 17175: 0x5F3C, 17176: 0x5FC5, 17177: 0x6CCC, 17178: 0x73CC, 17179: 0x7562, 17180: 0x758B, 17181: 0x7B46, 17182: 0x82FE, 17183: 0x999D, 17184: 0x4E4F, 17185: 0x903C, 17186: 0x4E0B, 17187: 0x4F55, 17188: 0x53A6, 17189: 0x590F, 17190: 0x5EC8, 17191: 0x6630, 17192: 0x6CB3, 17193: 0x7455, 17194: 0x8377, 17195: 0x8766, 17196: 0x8CC0, 17197: 0x9050, 17198: 0x971E, 17199: 0x9C15, 17200: 0x58D1, 17201: 0x5B78, 17202: 0x8650, 17203: 0x8B14, 17204: 0x9DB4, 17205: 0x5BD2, 17206: 0x6068, 17207: 0x608D, 17208: 0x65F1, 17209: 0x6C57, 17210: 0x6F22, 17211: 0x6FA3, 17212: 0x701A, 17213: 0x7F55, 17214: 0x7FF0, 17215: 0x9591, 17216: 0x9592, 17217: 0x9650, 17218: 0x97D3, 17219: 0x5272, 17220: 0x8F44, 17221: 0x51FD, 17222: 0x542B, 17223: 0x54B8, 17224: 0x5563, 17225: 0x558A, 17226: 0x6ABB, 17227: 0x6DB5, 17228: 0x7DD8, 17229: 0x8266, 17230: 0x929C, 17231: 0x9677, 17232: 0x9E79, 17233: 0x5408, 17234: 0x54C8, 17235: 0x76D2, 17236: 0x86E4, 17237: 0x95A4, 17238: 0x95D4, 17239: 0x965C, 17240: 0x4EA2, 17241: 0x4F09, 17242: 0x59EE, 17243: 0x5AE6, 17244: 0x5DF7, 17245: 0x6052, 17246: 0x6297, 17247: 0x676D, 17248: 0x6841, 17249: 0x6C86, 17250: 0x6E2F, 17251: 0x7F38, 17252: 0x809B, 17253: 0x822A, 17254: 0xFA08, 17255: 0xFA09, 17256: 0x9805, 17257: 0x4EA5, 17258: 0x5055, 17259: 0x54B3, 17260: 0x5793, 17261: 0x595A, 17262: 0x5B69, 17263: 0x5BB3, 17264: 0x61C8, 17265: 0x6977, 17266: 0x6D77, 17267: 0x7023, 17268: 0x87F9, 17269: 0x89E3, 17270: 0x8A72, 17271: 0x8AE7, 17272: 0x9082, 17273: 0x99ED, 17274: 0x9AB8, 17275: 0x52BE, 17276: 0x6838, 17277: 0x5016, 17278: 0x5E78, 17279: 0x674F, 17280: 0x8347, 17281: 0x884C, 17282: 0x4EAB, 17283: 0x5411, 17284: 0x56AE, 17285: 0x73E6, 17286: 0x9115, 17287: 0x97FF, 17288: 0x9909, 17289: 0x9957, 17290: 0x9999, 17291: 0x5653, 17292: 0x589F, 17293: 0x865B, 17294: 0x8A31, 17295: 0x61B2, 17296: 0x6AF6, 17297: 0x737B, 17298: 0x8ED2, 17299: 0x6B47, 17300: 0x96AA, 17301: 0x9A57, 17302: 0x5955, 17303: 0x7200, 17304: 0x8D6B, 17305: 0x9769, 17306: 0x4FD4, 17307: 0x5CF4, 17308: 0x5F26, 17309: 0x61F8, 17310: 0x665B, 17311: 0x6CEB, 17312: 0x70AB, 17313: 0x7384, 17314: 0x73B9, 17315: 0x73FE, 17316: 0x7729, 17317: 0x774D, 17318: 0x7D43, 17319: 0x7D62, 17320: 0x7E23, 17321: 0x8237, 17322: 0x8852, 17323: 0xFA0A, 17324: 0x8CE2, 17325: 0x9249, 17326: 0x986F, 17327: 0x5B51, 17328: 0x7A74, 17329: 0x8840, 17330: 0x9801, 17331: 0x5ACC, 17332: 0x4FE0, 17333: 0x5354, 17334: 0x593E, 17335: 0x5CFD, 17336: 0x633E, 17337: 0x6D79, 17338: 0x72F9, 17339: 0x8105, 17340: 0x8107, 17341: 0x83A2, 17342: 0x92CF, 17343: 0x9830, 17344: 0x4EA8, 17345: 0x5144, 17346: 0x5211, 17347: 0x578B, 17348: 0x5F62, 17349: 0x6CC2, 17350: 0x6ECE, 17351: 0x7005, 17352: 0x7050, 17353: 0x70AF, 17354: 0x7192, 17355: 0x73E9, 17356: 0x7469, 17357: 0x834A, 17358: 0x87A2, 17359: 0x8861, 17360: 0x9008, 17361: 0x90A2, 17362: 0x93A3, 17363: 0x99A8, 17364: 0x516E, 17365: 0x5F57, 17366: 0x60E0, 17367: 0x6167, 17368: 0x66B3, 17369: 0x8559, 17370: 0x8E4A, 17371: 0x91AF, 17372: 0x978B, 17373: 0x4E4E, 17374: 0x4E92, 17375: 0x547C, 17376: 0x58D5, 17377: 0x58FA, 17378: 0x597D, 17379: 0x5CB5, 17380: 0x5F27, 17381: 0x6236, 17382: 0x6248, 17383: 0x660A, 17384: 0x6667, 17385: 0x6BEB, 17386: 0x6D69, 17387: 0x6DCF, 17388: 0x6E56, 17389: 0x6EF8, 17390: 0x6F94, 17391: 0x6FE0, 17392: 0x6FE9, 17393: 0x705D, 17394: 0x72D0, 17395: 0x7425, 17396: 0x745A, 17397: 0x74E0, 17398: 0x7693, 17399: 0x795C, 17400: 0x7CCA, 17401: 0x7E1E, 17402: 0x80E1, 17403: 0x82A6, 17404: 0x846B, 17405: 0x84BF, 17406: 0x864E, 17407: 0x865F, 17408: 0x8774, 17409: 0x8B77, 17410: 0x8C6A, 17411: 0x93AC, 17412: 0x9800, 17413: 0x9865, 17414: 0x60D1, 17415: 0x6216, 17416: 0x9177, 17417: 0x5A5A, 17418: 0x660F, 17419: 0x6DF7, 17420: 0x6E3E, 17421: 0x743F, 17422: 0x9B42, 17423: 0x5FFD, 17424: 0x60DA, 17425: 0x7B0F, 17426: 0x54C4, 17427: 0x5F18, 17428: 0x6C5E, 17429: 0x6CD3, 17430: 0x6D2A, 17431: 0x70D8, 17432: 0x7D05, 17433: 0x8679, 17434: 0x8A0C, 17435: 0x9D3B, 17436: 0x5316, 17437: 0x548C, 17438: 0x5B05, 17439: 0x6A3A, 17440: 0x706B, 17441: 0x7575, 17442: 0x798D, 17443: 0x79BE, 17444: 0x82B1, 17445: 0x83EF, 17446: 0x8A71, 17447: 0x8B41, 17448: 0x8CA8, 17449: 0x9774, 17450: 0xFA0B, 17451: 0x64F4, 17452: 0x652B, 17453: 0x78BA, 17454: 0x78BB, 17455: 0x7A6B, 17456: 0x4E38, 17457: 0x559A, 17458: 0x5950, 17459: 0x5BA6, 17460: 0x5E7B, 17461: 0x60A3, 17462: 0x63DB, 17463: 0x6B61, 17464: 0x6665, 17465: 0x6853, 17466: 0x6E19, 17467: 0x7165, 17468: 0x74B0, 17469: 0x7D08, 17470: 0x9084, 17471: 0x9A69, 17472: 0x9C25, 17473: 0x6D3B, 17474: 0x6ED1, 17475: 0x733E, 17476: 0x8C41, 17477: 0x95CA, 17478: 0x51F0, 17479: 0x5E4C, 17480: 0x5FA8, 17481: 0x604D, 17482: 0x60F6, 17483: 0x6130, 17484: 0x614C, 17485: 0x6643, 17486: 0x6644, 17487: 0x69A5, 17488: 0x6CC1, 17489: 0x6E5F, 17490: 0x6EC9, 17491: 0x6F62, 17492: 0x714C, 17493: 0x749C, 17494: 0x7687, 17495: 0x7BC1, 17496: 0x7C27, 17497: 0x8352, 17498: 0x8757, 17499: 0x9051, 17500: 0x968D, 17501: 0x9EC3, 17502: 0x532F, 17503: 0x56DE, 17504: 0x5EFB, 17505: 0x5F8A, 17506: 0x6062, 17507: 0x6094, 17508: 0x61F7, 17509: 0x6666, 17510: 0x6703, 17511: 0x6A9C, 17512: 0x6DEE, 17513: 0x6FAE, 17514: 0x7070, 17515: 0x736A, 17516: 0x7E6A, 17517: 0x81BE, 17518: 0x8334, 17519: 0x86D4, 17520: 0x8AA8, 17521: 0x8CC4, 17522: 0x5283, 17523: 0x7372, 17524: 0x5B96, 17525: 0x6A6B, 17526: 0x9404, 17527: 0x54EE, 17528: 0x5686, 17529: 0x5B5D, 17530: 0x6548, 17531: 0x6585, 17532: 0x66C9, 17533: 0x689F, 17534: 0x6D8D, 17535: 0x6DC6, 17536: 0x723B, 17537: 0x80B4, 17538: 0x9175, 17539: 0x9A4D, 17540: 0x4FAF, 17541: 0x5019, 17542: 0x539A, 17543: 0x540E, 17544: 0x543C, 17545: 0x5589, 17546: 0x55C5, 17547: 0x5E3F, 17548: 0x5F8C, 17549: 0x673D, 17550: 0x7166, 17551: 0x73DD, 17552: 0x9005, 17553: 0x52DB, 17554: 0x52F3, 17555: 0x5864, 17556: 0x58CE, 17557: 0x7104, 17558: 0x718F, 17559: 0x71FB, 17560: 0x85B0, 17561: 0x8A13, 17562: 0x6688, 17563: 0x85A8, 17564: 0x55A7, 17565: 0x6684, 17566: 0x714A, 17567: 0x8431, 17568: 0x5349, 17569: 0x5599, 17570: 0x6BC1, 17571: 0x5F59, 17572: 0x5FBD, 17573: 0x63EE, 17574: 0x6689, 17575: 0x7147, 17576: 0x8AF1, 17577: 0x8F1D, 17578: 0x9EBE, 17579: 0x4F11, 17580: 0x643A, 17581: 0x70CB, 17582: 0x7566, 17583: 0x8667, 17584: 0x6064, 17585: 0x8B4E, 17586: 0x9DF8, 17587: 0x5147, 17588: 0x51F6, 17589: 0x5308, 17590: 0x6D36, 17591: 0x80F8, 17592: 0x9ED1, 17593: 0x6615, 17594: 0x6B23, 17595: 0x7098, 17596: 0x75D5, 17597: 0x5403, 17598: 0x5C79, 17599: 0x7D07, 17600: 0x8A16, 17601: 0x6B20, 17602: 0x6B3D, 17603: 0x6B46, 17604: 0x5438, 17605: 0x6070, 17606: 0x6D3D, 17607: 0x7FD5, 17608: 0x8208, 17609: 0x50D6, 17610: 0x51DE, 17611: 0x559C, 17612: 0x566B, 17613: 0x56CD, 17614: 0x59EC, 17615: 0x5B09, 17616: 0x5E0C, 17617: 0x6199, 17618: 0x6198, 17619: 0x6231, 17620: 0x665E, 17621: 0x66E6, 17622: 0x7199, 17623: 0x71B9, 17624: 0x71BA, 17625: 0x72A7, 17626: 0x79A7, 17627: 0x7A00, 17628: 0x7FB2, 17629: 0x8A70, } const numEncodeTables = 7 // encodeX are the encoding tables from Unicode to EUC-KR code, // sorted by decreasing length. // encode0: 20893 entries for runes in [19968, 40861). // encode1: 11172 entries for runes in [44032, 55204). // encode2: 1625 entries for runes in [ 8213, 9838). // encode3: 990 entries for runes in [12288, 13278). // encode4: 945 entries for runes in [ 161, 1106). // encode5: 268 entries for runes in [63744, 64012). // encode6: 230 entries for runes in [65281, 65511). const encode0Low, encode0High = 19968, 40861 var encode0 = [...]uint16{ 19968 - 19968: 0xECE9, 19969 - 19968: 0xEFCB, 19971 - 19968: 0xF6D2, 19975 - 19968: 0xD8B2, 19976 - 19968: 0xEDDB, 19977 - 19968: 0xDFB2, 19978 - 19968: 0xDFBE, 19979 - 19968: 0xF9BB, 19981 - 19968: 0xDCF4, 19985 - 19968: 0xF5E4, 19988 - 19968: 0xF3A6, 19989 - 19968: 0xDDE0, 19990 - 19968: 0xE1A6, 19992 - 19968: 0xCEF8, 19993 - 19968: 0xDCB0, 19998 - 19968: 0xE3AA, 20013 - 19968: 0xF1E9, 20018 - 19968: 0xCDFA, 20024 - 19968: 0xFCAF, 20025 - 19968: 0xD3A1, 20027 - 19968: 0xF1AB, 20034 - 19968: 0xE7D1, 20035 - 19968: 0xD2AC, 20037 - 19968: 0xCEF9, 20043 - 19968: 0xF1FD, 20045 - 19968: 0xDEBF, 20046 - 19968: 0xFBBA, 20047 - 19968: 0xF9B9, 20054 - 19968: 0xCED2, 20056 - 19968: 0xE3AB, 20057 - 19968: 0xEBE0, 20061 - 19968: 0xCEFA, 20062 - 19968: 0xCBF7, 20063 - 19968: 0xE5A5, 20075 - 19968: 0xCAE1, 20077 - 19968: 0xD4CC, 20083 - 19968: 0xEAE1, 20086 - 19968: 0xDCE3, 20087 - 19968: 0xDFAD, 20094 - 19968: 0xCBEB, 20098 - 19968: 0xD5AF, 20102 - 19968: 0xD6F5, 20104 - 19968: 0xE5F8, 20107 - 19968: 0xDEC0, 20108 - 19968: 0xECA3, 20110 - 19968: 0xE9CD, 20112 - 19968: 0xEAA7, 20113 - 19968: 0xE9F6, 20114 - 19968: 0xFBBB, 20116 - 19968: 0xE7E9, 20117 - 19968: 0xEFCC, 20120 - 19968: 0xD0E6, 20123 - 19968: 0xDEC1, 20126 - 19968: 0xE4AC, 20129 - 19968: 0xD8CC, 20130 - 19968: 0xF9F1, 20132 - 19968: 0xCEDF, 20133 - 19968: 0xFAA4, 20134 - 19968: 0xE6B2, 20136 - 19968: 0xFAFB, 20139 - 19968: 0xFABD, 20140 - 19968: 0xCCC8, 20141 - 19968: 0xEFCD, 20142 - 19968: 0xD5D5, 20150 - 19968: 0xD3A2, 20154 - 19968: 0xECD1, 20160 - 19968: 0xE4A7, 20161 - 19968: 0xECD2, 20164 - 19968: 0xF6B1, 20167 - 19968: 0xCEFB, 20170 - 19968: 0xD0D1, 20171 - 19968: 0xCBBF, 20173 - 19968: 0xEDA4, 20180 - 19968: 0xEDA8, 20181 - 19968: 0xDEC2, 20182 - 19968: 0xF6E2, 20183 - 19968: 0xEDDC, 20184 - 19968: 0xDCF5, 20185 - 19968: 0xE0B9, 20189 - 19968: 0xD4CE, 20191 - 19968: 0xF4B5, 20195 - 19968: 0xD3DB, 20196 - 19968: 0xD6B5, 20197 - 19968: 0xECA4, 20208 - 19968: 0xE4E6, 20210 - 19968: 0xF1EA, 20214 - 19968: 0xCBEC, 20215 - 19968: 0xCBC0, 20219 - 19968: 0xECF2, 20225 - 19968: 0xD0EA, 20233 - 19968: 0xF9F2, 20234 - 19968: 0xECA5, 20235 - 19968: 0xD0DF, 20237 - 19968: 0xE7EA, 20238 - 19968: 0xD0EB, 20239 - 19968: 0xDCD1, 20240 - 19968: 0xDBE9, 20241 - 19968: 0xFDCC, 20271 - 19968: 0xDBD7, 20276 - 19968: 0xDAE1, 20278 - 19968: 0xD6B6, 20280 - 19968: 0xE3DF, 20282 - 19968: 0xDEC3, 20284 - 19968: 0xDEC4, 20285 - 19968: 0xCAA1, 20291 - 19968: 0xEEEC, 20294 - 19968: 0xD3A3, 20295 - 19968: 0xEEB7, 20296 - 19968: 0xF8CF, 20301 - 19968: 0xEAC8, 20302 - 19968: 0xEEB8, 20303 - 19968: 0xF1AC, 20304 - 19968: 0xF1A5, 20305 - 19968: 0xE9CE, 20309 - 19968: 0xF9BC, 20313 - 19968: 0xE5F9, 20314 - 19968: 0xECEA, 20315 - 19968: 0xDDD6, 20316 - 19968: 0xEDC2, 20329 - 19968: 0xF8A5, 20335 - 19968: 0xE5BA, 20336 - 19968: 0xDBD8, 20339 - 19968: 0xCAA2, 20342 - 19968: 0xD1CD, 20346 - 19968: 0xEEED, 20350 - 19968: 0xECEB, 20351 - 19968: 0xDEC5, 20353 - 19968: 0xE3E0, 20355 - 19968: 0xCAC9, 20356 - 19968: 0xF2E9, 20358 - 19968: 0xD5CE, 20360 - 19968: 0xF6B6, 20362 - 19968: 0xCEC2, 20363 - 19968: 0xD6C7, 20365 - 19968: 0xE3B4, 20367 - 19968: 0xF1AD, 20369 - 19968: 0xEAE2, 20374 - 19968: 0xD7C2, 20376 - 19968: 0xF3A7, 20379 - 19968: 0xCDEA, 20381 - 19968: 0xEBEE, 20398 - 19968: 0xD9B2, 20399 - 19968: 0xFDA5, 20405 - 19968: 0xF6D5, 20406 - 19968: 0xD5E2, 20415 - 19968: 0xF8B5, 20418 - 19968: 0xCCF5, 20419 - 19968: 0xF5B5, 20420 - 19968: 0xE4AD, 20425 - 19968: 0xE7EB, 20426 - 19968: 0xF1D5, 20430 - 19968: 0xF0BB, 20433 - 19968: 0xE9B5, 20435 - 19968: 0xCCC9, 20436 - 19968: 0xFAD5, 20439 - 19968: 0xE1D4, 20442 - 19968: 0xD7D6, 20445 - 19968: 0xDCC1, 20447 - 19968: 0xDEC6, 20448 - 19968: 0xFAEF, 20449 - 19968: 0xE3E1, 20462 - 19968: 0xE1F3, 20463 - 19968: 0xDCF6, 20465 - 19968: 0xCEFC, 20467 - 19968: 0xDBC4, 20469 - 19968: 0xF8F1, 20472 - 19968: 0xDCE4, 20474 - 19968: 0xE5EF, 20482 - 19968: 0xDCB1, 20486 - 19968: 0xD5D6, 20489 - 19968: 0xF3DA, 20491 - 19968: 0xCBC1, 20493 - 19968: 0xDBC3, 20497 - 19968: 0xD9FA, 20498 - 19968: 0xD3EE, 20502 - 19968: 0xFAB8, 20505 - 19968: 0xFDA6, 20506 - 19968: 0xEBEF, 20508 - 19968: 0xF4A6, 20510 - 19968: 0xCCCA, 20511 - 19968: 0xF3A8, 20513 - 19968: 0xF3DB, 20515 - 19968: 0xDBA7, 20516 - 19968: 0xF6B7, 20518 - 19968: 0xCFE6, 20519 - 19968: 0xF0F2, 20520 - 19968: 0xCBDA, 20522 - 19968: 0xE7D2, 20523 - 19968: 0xD7C3, 20524 - 19968: 0xF6F0, 20525 - 19968: 0xE8DE, 20539 - 19968: 0xE5A6, 20547 - 19968: 0xE5E7, 20551 - 19968: 0xCAA3, 20552 - 19968: 0xCCA7, 20553 - 19968: 0xEAC9, 20559 - 19968: 0xF8B6, 20565 - 19968: 0xFAA5, 20570 - 19968: 0xF1AE, 20572 - 19968: 0xEFCE, 20581 - 19968: 0xCBED, 20596 - 19968: 0xF6B0, 20597 - 19968: 0xEFCF, 20598 - 19968: 0xE9CF, 20600 - 19968: 0xF7DE, 20608 - 19968: 0xCED3, 20613 - 19968: 0xDCF7, 20621 - 19968: 0xDBA8, 20625 - 19968: 0xCBF8, 20632 - 19968: 0xDFA1, 20633 - 19968: 0xDDE1, 20652 - 19968: 0xF5CA, 20653 - 19968: 0xE9B6, 20658 - 19968: 0xE7EC, 20659 - 19968: 0xEEEE, 20661 - 19968: 0xF3F0, 20663 - 19968: 0xDFBF, 20670 - 19968: 0xCCCB, 20677 - 19968: 0xD0C1, 20681 - 19968: 0xF4D2, 20682 - 19968: 0xE0BA, 20687 - 19968: 0xDFC0, 20689 - 19968: 0xCEE0, 20693 - 19968: 0xDCD2, 20694 - 19968: 0xFDEA, 20698 - 19968: 0xD6F6, 20702 - 19968: 0xEACA, 20709 - 19968: 0xE8E9, 20711 - 19968: 0xE3AC, 20717 - 19968: 0xF3D0, 20729 - 19968: 0xCAA4, 20731 - 19968: 0xDBF8, 20735 - 19968: 0xDEC7, 20736 - 19968: 0xEBF0, 20737 - 19968: 0xF1D6, 20740 - 19968: 0xE5E2, 20742 - 19968: 0xCCCC, 20745 - 19968: 0xCBFB, 20754 - 19968: 0xEAE3, 20767 - 19968: 0xDFC1, 20769 - 19968: 0xD6ED, 20778 - 19968: 0xE9D0, 20786 - 19968: 0xEEB9, 20791 - 19968: 0xD5E3, 20794 - 19968: 0xD1D3, 20796 - 19968: 0xE5F0, 20800 - 19968: 0xE8B4, 20801 - 19968: 0xEBC3, 20803 - 19968: 0xEAAA, 20804 - 19968: 0xFAFC, 20805 - 19968: 0xF5F6, 20806 - 19968: 0xF0BC, 20807 - 19968: 0xFDD4, 20808 - 19968: 0xE0BB, 20809 - 19968: 0xCEC3, 20811 - 19968: 0xD0BA, 20812 - 19968: 0xF7BA, 20813 - 19968: 0xD8F3, 20814 - 19968: 0xF7CD, 20818 - 19968: 0xE4AE, 20828 - 19968: 0xD4DF, 20834 - 19968: 0xD0E7, 20837 - 19968: 0xECFD, 20839 - 19968: 0xD2AE, 20840 - 19968: 0xEEEF, 20841 - 19968: 0xD5D7, 20842 - 19968: 0xEAE4, 20843 - 19968: 0xF8A2, 20844 - 19968: 0xCDEB, 20845 - 19968: 0xD7BF, 20846 - 19968: 0xFBB1, 20849 - 19968: 0xCDEC, 20853 - 19968: 0xDCB2, 20854 - 19968: 0xD0EC, 20855 - 19968: 0xCEFD, 20856 - 19968: 0xEEF0, 20860 - 19968: 0xCCC2, 20864 - 19968: 0xD0ED, 20870 - 19968: 0xE5F7, 20874 - 19968: 0xF3FC, 20877 - 19968: 0xEEA2, 20882 - 19968: 0xD9B3, 20885 - 19968: 0xD8F4, 20887 - 19968: 0xE9B7, 20896 - 19968: 0xCEAE, 20901 - 19968: 0xD9A2, 20906 - 19968: 0xD8F1, 20908 - 19968: 0xD4CF, 20918 - 19968: 0xE5A7, 20919 - 19968: 0xD5D2, 20925 - 19968: 0xD6A9, 20932 - 19968: 0xF4A2, 20934 - 19968: 0xF1D7, 20937 - 19968: 0xD5D8, 20939 - 19968: 0xF0BD, 20940 - 19968: 0xD7D0, 20941 - 19968: 0xD4D0, 20956 - 19968: 0xD7CF, 20957 - 19968: 0xEBEA, 20958 - 19968: 0xFDEB, 20961 - 19968: 0xDBED, 20976 - 19968: 0xFCC5, 20977 - 19968: 0xCBC2, 20982 - 19968: 0xFDD5, 20984 - 19968: 0xF4C8, 20985 - 19968: 0xE8EA, 20986 - 19968: 0xF5F3, 20989 - 19968: 0xF9DE, 20992 - 19968: 0xD3EF, 20995 - 19968: 0xECD3, 20998 - 19968: 0xDDC2, 20999 - 19968: 0xEFB7, 21000 - 19968: 0xE7D4, 21002 - 19968: 0xCACA, 21006 - 19968: 0xD9FB, 21009 - 19968: 0xFAFD, 21015 - 19968: 0xD6AA, 21021 - 19968: 0xF4F8, 21028 - 19968: 0xF7F7, 21029 - 19968: 0xDCAC, 21033 - 19968: 0xD7D7, 21034 - 19968: 0xDFA2, 21038 - 19968: 0xCEBE, 21040 - 19968: 0xD3F0, 21046 - 19968: 0xF0A4, 21047 - 19968: 0xE1EC, 21048 - 19968: 0xCFE7, 21049 - 19968: 0xF3CB, 21050 - 19968: 0xEDA9, 21051 - 19968: 0xCABE, 21059 - 19968: 0xF4EF, 21063 - 19968: 0xF6CE, 21066 - 19968: 0xDEFB, 21067 - 19968: 0xD0BB, 21068 - 19968: 0xD5B7, 21069 - 19968: 0xEEF1, 21076 - 19968: 0xF4A8, 21078 - 19968: 0xDCF8, 21083 - 19968: 0xCBA7, 21085 - 19968: 0xDACE, 21089 - 19968: 0xE0E6, 21097 - 19968: 0xEDA5, 21098 - 19968: 0xEEF2, 21103 - 19968: 0xDCF9, 21106 - 19968: 0xF9DC, 21109 - 19968: 0xF3DC, 21117 - 19968: 0xF8F2, 21119 - 19968: 0xF4F9, 21123 - 19968: 0xFCF1, 21127 - 19968: 0xD0BC, 21128 - 19968: 0xDBF9, 21129 - 19968: 0xD7B1, 21133 - 19968: 0xCBFC, 21137 - 19968: 0xF0A5, 21138 - 19968: 0xCBFD, 21147 - 19968: 0xD5F4, 21151 - 19968: 0xCDED, 21152 - 19968: 0xCAA5, 21155 - 19968: 0xD6AB, 21156 - 19968: 0xD0C2, 21161 - 19968: 0xF0BE, 21162 - 19968: 0xD2BD, 21163 - 19968: 0xCCA4, 21182 - 19968: 0xFAB6, 21185 - 19968: 0xCCCD, 21187 - 19968: 0xDAFA, 21189 - 19968: 0xF6CF, 21191 - 19968: 0xE9B8, 21193 - 19968: 0xD8F5, 21197 - 19968: 0xCCCE, 21202 - 19968: 0xD7CD, 21205 - 19968: 0xD4D1, 21206 - 19968: 0xE9ED, 21208 - 19968: 0xCAEB, 21209 - 19968: 0xD9E2, 21211 - 19968: 0xFDB2, 21213 - 19968: 0xE3AD, 21214 - 19968: 0xD6CC, 21215 - 19968: 0xD9B4, 21218 - 19968: 0xE1A7, 21219 - 19968: 0xEED3, 21220 - 19968: 0xD0C3, 21235 - 19968: 0xFDB3, 21237 - 19968: 0xD5E4, 21240 - 19968: 0xCFE8, 21242 - 19968: 0xEDC3, 21243 - 19968: 0xD0B2, 21246 - 19968: 0xCEFE, 21247 - 19968: 0xDAA8, 21253 - 19968: 0xF8D0, 21256 - 19968: 0xFDD6, 21261 - 19968: 0xF8D1, 21263 - 19968: 0xF8D2, 21264 - 19968: 0xDCD3, 21269 - 19968: 0xDDE2, 21270 - 19968: 0xFBF9, 21271 - 19968: 0xDDC1, 21273 - 19968: 0xE3B5, 21280 - 19968: 0xEDDD, 21281 - 19968: 0xCEC4, 21283 - 19968: 0xCBA1, 21290 - 19968: 0xDDE3, 21295 - 19968: 0xFCDD, 21305 - 19968: 0xF9AF, 21311 - 19968: 0xD2FB, 21312 - 19968: 0xCFA1, 21313 - 19968: 0xE4A8, 21315 - 19968: 0xF4B6, 21316 - 19968: 0xECFE, 21319 - 19968: 0xE3AE, 21320 - 19968: 0xE7ED, 21321 - 19968: 0xFDC1, 21322 - 19968: 0xDAE2, 21325 - 19968: 0xD8B3, 21329 - 19968: 0xDDE4, 21330 - 19968: 0xF0EF, 21331 - 19968: 0xF6F1, 21332 - 19968: 0xFAF0, 21335 - 19968: 0xD1F5, 21338 - 19968: 0xDACF, 21340 - 19968: 0xDCD4, 21342 - 19968: 0xDCA6, 21344 - 19968: 0xEFBF, 21350 - 19968: 0xCECF, 21352 - 19968: 0xE0D9, 21359 - 19968: 0xD9D6, 21360 - 19968: 0xECD4, 21361 - 19968: 0xEACB, 21364 - 19968: 0xCABF, 21365 - 19968: 0xD5B0, 21367 - 19968: 0xCFE9, 21373 - 19968: 0xF1ED, 21375 - 19968: 0xCCCF, 21380 - 19968: 0xE4F8, 21395 - 19968: 0xE4ED, 21400 - 19968: 0xD7D8, 21402 - 19968: 0xFDA7, 21407 - 19968: 0xEAAB, 21408 - 19968: 0xF6B2, 21413 - 19968: 0xCFF0, 21414 - 19968: 0xF9BD, 21421 - 19968: 0xE6F4, 21435 - 19968: 0xCBDB, 21443 - 19968: 0xF3D1, 21448 - 19968: 0xE9D1, 21449 - 19968: 0xF3A9, 21450 - 19968: 0xD0E0, 21451 - 19968: 0xE9D2, 21453 - 19968: 0xDAE3, 21460 - 19968: 0xE2D2, 21462 - 19968: 0xF6A2, 21463 - 19968: 0xE1F4, 21467 - 19968: 0xDAE4, 21473 - 19968: 0xE7D5, 21474 - 19968: 0xF5BF, 21475 - 19968: 0xCFA2, 21476 - 19968: 0xCDAF, 21477 - 19968: 0xCFA3, 21481 - 19968: 0xCDB0, 21482 - 19968: 0xF1FE, 21483 - 19968: 0xD0A3, 21484 - 19968: 0xE1AF, 21485 - 19968: 0xF8A3, 21487 - 19968: 0xCAA6, 21488 - 19968: 0xF7BB, 21489 - 19968: 0xF2EA, 21490 - 19968: 0xDEC8, 21491 - 19968: 0xE9D3, 21496 - 19968: 0xDEC9, 21507 - 19968: 0xFDDE, 21508 - 19968: 0xCAC0, 21512 - 19968: 0xF9EA, 21513 - 19968: 0xD1CE, 21514 - 19968: 0xEED4, 21516 - 19968: 0xD4D2, 21517 - 19968: 0xD9A3, 21518 - 19968: 0xFDA8, 21519 - 19968: 0xD7D9, 21520 - 19968: 0xF7CE, 21521 - 19968: 0xFABE, 21531 - 19968: 0xCFD6, 21533 - 19968: 0xD7F0, 21535 - 19968: 0xEBE1, 21536 - 19968: 0xF8C5, 21542 - 19968: 0xDCFA, 21545 - 19968: 0xDDC3, 21547 - 19968: 0xF9DF, 21555 - 19968: 0xE7EF, 21560 - 19968: 0xFDE5, 21561 - 19968: 0xF6A3, 21563 - 19968: 0xD9FC, 21564 - 19968: 0xFDA9, 21566 - 19968: 0xE7EE, 21570 - 19968: 0xD5E5, 21576 - 19968: 0xEFD0, 21578 - 19968: 0xCDB1, 21585 - 19968: 0xF7A2, 21608 - 19968: 0xF1B2, 21610 - 19968: 0xF1B1, 21617 - 19968: 0xCDB2, 21619 - 19968: 0xDAAB, 21621 - 19968: 0xCAA7, 21627 - 19968: 0xE3E2, 21628 - 19968: 0xFBBC, 21629 - 19968: 0xD9A4, 21632 - 19968: 0xEEBA, 21638 - 19968: 0xF8D3, 21644 - 19968: 0xFBFA, 21646 - 19968: 0xCFA4, 21648 - 19968: 0xDCFB, 21668 - 19968: 0xF6E3, 21672 - 19968: 0xEDAA, 21675 - 19968: 0xF2A1, 21676 - 19968: 0xCEE1, 21683 - 19968: 0xFAA6, 21688 - 19968: 0xF9E0, 21693 - 19968: 0xECD6, 21696 - 19968: 0xE4EE, 21697 - 19968: 0xF9A1, 21700 - 19968: 0xFBEF, 21704 - 19968: 0xF9EB, 21705 - 19968: 0xEEA3, 21729 - 19968: 0xEAAC, 21733 - 19968: 0xCAA8, 21736 - 19968: 0xF4FA, 21741 - 19968: 0xCDD6, 21742 - 19968: 0xFCF6, 21746 - 19968: 0xF4C9, 21754 - 19968: 0xF8D4, 21764 - 19968: 0xF8A6, 21766 - 19968: 0xDECA, 21767 - 19968: 0xF2C6, 21774 - 19968: 0xD7DA, 21776 - 19968: 0xD3D0, 21788 - 19968: 0xD8C5, 21807 - 19968: 0xEAE6, 21809 - 19968: 0xF3DD, 21813 - 19968: 0xE4DA, 21822 - 19968: 0xF6E4, 21828 - 19968: 0xF6F2, 21830 - 19968: 0xDFC2, 21839 - 19968: 0xD9FD, 21843 - 19968: 0xCCF6, 21846 - 19968: 0xD3BA, 21854 - 19968: 0xE4AF, 21859 - 19968: 0xF9E1, 21884 - 19968: 0xF0A6, 21888 - 19968: 0xCBD3, 21892 - 19968: 0xE0BC, 21894 - 19968: 0xF4CA, 21895 - 19968: 0xD4FA, 21897 - 19968: 0xFDAA, 21898 - 19968: 0xF9E2, 21912 - 19968: 0xF4B7, 21913 - 19968: 0xFDC2, 21914 - 19968: 0xFCB0, 21916 - 19968: 0xFDEC, 21917 - 19968: 0xCAE2, 21927 - 19968: 0xFDBD, 21929 - 19968: 0xEAE7, 21930 - 19968: 0xDFC3, 21931 - 19968: 0xD1D2, 21932 - 19968: 0xCEE2, 21934 - 19968: 0xD3A4, 21957 - 19968: 0xFDAB, 21959 - 19968: 0xDFE0, 21972 - 19968: 0xF2C7, 21978 - 19968: 0xE7F0, 21980 - 19968: 0xD0EE, 21983 - 19968: 0xF3AA, 21987 - 19968: 0xDECB, 21988 - 19968: 0xF6B8, 22013 - 19968: 0xE1F5, 22014 - 19968: 0xF1B3, 22022 - 19968: 0xF7A3, 22025 - 19968: 0xCAA9, 22036 - 19968: 0xCFA5, 22039 - 19968: 0xDFC4, 22063 - 19968: 0xE1B0, 22066 - 19968: 0xF0BF, 22068 - 19968: 0xF6A4, 22070 - 19968: 0xE3B6, 22099 - 19968: 0xFAC6, 22120 - 19968: 0xD0EF, 22123 - 19968: 0xFDED, 22132 - 19968: 0xDDC4, 22150 - 19968: 0xFCF7, 22181 - 19968: 0xE6BF, 22188 - 19968: 0xDEAD, 22190 - 19968: 0xFABF, 22196 - 19968: 0xE5F1, 22204 - 19968: 0xEDC4, 22218 - 19968: 0xD2A5, 22221 - 19968: 0xFDEE, 22225 - 19968: 0xF5B6, 22234 - 19968: 0xE1F6, 22235 - 19968: 0xDECC, 22238 - 19968: 0xFCDE, 22240 - 19968: 0xECD7, 22256 - 19968: 0xCDDD, 22265 - 19968: 0xD6B7, 22266 - 19968: 0xCDB3, 22275 - 19968: 0xF8D5, 22276 - 19968: 0xE5D8, 22280 - 19968: 0xCFEA, 22283 - 19968: 0xCFD0, 22285 - 19968: 0xEACC, 22290 - 19968: 0xEAAE, 22291 - 19968: 0xEAAD, 22294 - 19968: 0xD3F1, 22296 - 19968: 0xD3A5, 22303 - 19968: 0xF7CF, 22312 - 19968: 0xEEA4, 22317 - 19968: 0xD0A4, 22320 - 19968: 0xF2A2, 22331 - 19968: 0xD0F0, 22336 - 19968: 0xF2A3, 22338 - 19968: 0xF7F8, 22343 - 19968: 0xD0B3, 22346 - 19968: 0xDBA9, 22349 - 19968: 0xD3BB, 22350 - 19968: 0xCAEC, 22352 - 19968: 0xF1A6, 22353 - 19968: 0xCBD5, 22369 - 19968: 0xF7E7, 22372 - 19968: 0xCDDE, 22374 - 19968: 0xF7A4, 22378 - 19968: 0xF8C0, 22382 - 19968: 0xD3DD, 22384 - 19968: 0xCCD0, 22389 - 19968: 0xCFA6, 22396 - 19968: 0xF6F3, 22402 - 19968: 0xE1F7, 22408 - 19968: 0xD3DC, 22411 - 19968: 0xFAFE, 22419 - 19968: 0xFAA7, 22432 - 19968: 0xEBD9, 22434 - 19968: 0xCFA7, 22435 - 19968: 0xEAAF, 22467 - 19968: 0xE4EF, 22471 - 19968: 0xE9B9, 22472 - 19968: 0xF1D8, 22475 - 19968: 0xD8D8, 22478 - 19968: 0xE0F2, 22495 - 19968: 0xE6B4, 22496 - 19968: 0xDCFC, 22512 - 19968: 0xF3F1, 22516 - 19968: 0xE3D0, 22519 - 19968: 0xF2FB, 22521 - 19968: 0xDBC6, 22522 - 19968: 0xD0F1, 22524 - 19968: 0xD0F2, 22528 - 19968: 0xCFDC, 22530 - 19968: 0xD3D1, 22533 - 19968: 0xCCB1, 22534 - 19968: 0xF7D8, 22536 - 19968: 0xCBA8, 22537 - 19968: 0xEBBC, 22538 - 19968: 0xE4BE, 22558 - 19968: 0xF4DC, 22561 - 19968: 0xDCC2, 22564 - 19968: 0xF0A7, 22567 - 19968: 0xE6C0, 22570 - 19968: 0xCAED, 22575 - 19968: 0xE8EB, 22576 - 19968: 0xE5E8, 22577 - 19968: 0xDCC3, 22580 - 19968: 0xEDDE, 22581 - 19968: 0xD3F2, 22586 - 19968: 0xCCF7, 22602 - 19968: 0xCED4, 22603 - 19968: 0xE7AB, 22607 - 19968: 0xCBC3, 22609 - 19968: 0xE1B1, 22612 - 19968: 0xF7B2, 22615 - 19968: 0xD3F3, 22616 - 19968: 0xD3D2, 22618 - 19968: 0xF5C0, 22622 - 19968: 0xDFDD, 22625 - 19968: 0xEEF3, 22626 - 19968: 0xE7F1, 22628 - 19968: 0xFDB4, 22645 - 19968: 0xF2C8, 22649 - 19968: 0xF3D2, 22652 - 19968: 0xEEF4, 22654 - 19968: 0xE2D3, 22659 - 19968: 0xCCD1, 22661 - 19968: 0xDFEA, 22665 - 19968: 0xE9BA, 22675 - 19968: 0xD9D7, 22684 - 19968: 0xF5CD, 22686 - 19968: 0xF1F2, 22687 - 19968: 0xFAC7, 22696 - 19968: 0xD9F8, 22697 - 19968: 0xD4C2, 22702 - 19968: 0xF6E5, 22707 - 19968: 0xDDC5, 22714 - 19968: 0xE7F2, 22715 - 19968: 0xEDDF, 22718 - 19968: 0xCACB, 22721 - 19968: 0xDBFA, 22725 - 19968: 0xE8B5, 22727 - 19968: 0xD3A6, 22734 - 19968: 0xFDB5, 22737 - 19968: 0xF9C9, 22739 - 19968: 0xE4E2, 22741 - 19968: 0xFBBD, 22744 - 19968: 0xD7A4, 22745 - 19968: 0xCEC5, 22750 - 19968: 0xCED5, 22751 - 19968: 0xD6E6, 22756 - 19968: 0xE5BD, 22763 - 19968: 0xDECD, 22764 - 19968: 0xECF3, 22767 - 19968: 0xEDE0, 22777 - 19968: 0xECEC, 22778 - 19968: 0xFBBE, 22779 - 19968: 0xDFEB, 22781 - 19968: 0xE1F8, 22799 - 19968: 0xF9BE, 22804 - 19968: 0xD0F3, 22805 - 19968: 0xE0AA, 22806 - 19968: 0xE8E2, 22809 - 19968: 0xE2D4, 22810 - 19968: 0xD2FD, 22812 - 19968: 0xE5A8, 22818 - 19968: 0xD9D3, 22823 - 19968: 0xD3DE, 22825 - 19968: 0xF4B8, 22826 - 19968: 0xF7BC, 22827 - 19968: 0xDCFD, 22829 - 19968: 0xE8EC, 22830 - 19968: 0xE4E7, 22833 - 19968: 0xE3F7, 22839 - 19968: 0xECA8, 22846 - 19968: 0xFAF1, 22852 - 19968: 0xE5F2, 22855 - 19968: 0xD0F4, 22856 - 19968: 0xD2AF, 22857 - 19968: 0xDCE5, 22862 - 19968: 0xD0A5, 22863 - 19968: 0xF1B4, 22864 - 19968: 0xFCB1, 22865 - 19968: 0xCCF8, 22868 - 19968: 0xDDC6, 22869 - 19968: 0xFAD1, 22871 - 19968: 0xF7DF, 22874 - 19968: 0xFAA8, 22880 - 19968: 0xEEF5, 22882 - 19968: 0xDECE, 22887 - 19968: 0xE7F3, 22890 - 19968: 0xF7AC, 22891 - 19968: 0xEBC4, 22892 - 19968: 0xEDE1, 22893 - 19968: 0xE0AB, 22894 - 19968: 0xDDC7, 22899 - 19968: 0xD2B3, 22900 - 19968: 0xD2BF, 22904 - 19968: 0xCACC, 22909 - 19968: 0xFBBF, 22914 - 19968: 0xE5FD, 22915 - 19968: 0xDDE5, 22916 - 19968: 0xD8CD, 22922 - 19968: 0xECF4, 22931 - 19968: 0xD0F5, 22934 - 19968: 0xE8ED, 22935 - 19968: 0xD0D2, 22937 - 19968: 0xD9D8, 22949 - 19968: 0xF6E6, 22952 - 19968: 0xDBAA, 22956 - 19968: 0xF7E0, 22969 - 19968: 0xD8D9, 22971 - 19968: 0xF4A3, 22974 - 19968: 0xF4DD, 22979 - 19968: 0xEFD1, 22982 - 19968: 0xD9B5, 22985 - 19968: 0xEDAB, 22987 - 19968: 0xE3B7, 22992 - 19968: 0xEEBB, 22993 - 19968: 0xCDB4, 22995 - 19968: 0xE0F3, 22996 - 19968: 0xEACD, 23001 - 19968: 0xECF5, 23002 - 19968: 0xE8EE, 23004 - 19968: 0xCBA9, 23005 - 19968: 0xF1AF, 23014 - 19968: 0xCACD, 23016 - 19968: 0xECA9, 23018 - 19968: 0xF2EB, 23020 - 19968: 0xFDEF, 23022 - 19968: 0xF9F3, 23032 - 19968: 0xE6C1, 23035 - 19968: 0xECD8, 23039 - 19968: 0xEDAC, 23041 - 19968: 0xEACE, 23043 - 19968: 0xE8DF, 23057 - 19968: 0xDECF, 23064 - 19968: 0xD2A6, 23067 - 19968: 0xE7F4, 23068 - 19968: 0xD1D6, 23071 - 19968: 0xE6C2, 23072 - 19968: 0xE3E3, 23077 - 19968: 0xE4B0, 23081 - 19968: 0xD8B4, 23094 - 19968: 0xF6A5, 23100 - 19968: 0xF3DE, 23105 - 19968: 0xD7A5, 23110 - 19968: 0xF7E8, 23113 - 19968: 0xE8C6, 23130 - 19968: 0xFBE6, 23138 - 19968: 0xDDE6, 23142 - 19968: 0xDCFE, 23186 - 19968: 0xD8DA, 23194 - 19968: 0xDAAC, 23195 - 19968: 0xEAB0, 23204 - 19968: 0xE3B8, 23233 - 19968: 0xCAAA, 23234 - 19968: 0xE1F9, 23236 - 19968: 0xEAB1, 23241 - 19968: 0xF2EC, 23244 - 19968: 0xFAEE, 23265 - 19968: 0xEED5, 23270 - 19968: 0xF9F4, 23273 - 19968: 0xD2EC, 23301 - 19968: 0xFBFB, 23305 - 19968: 0xFDF0, 23307 - 19968: 0xE0BD, 23308 - 19968: 0xCEE3, 23318 - 19968: 0xF8C6, 23338 - 19968: 0xDEAE, 23360 - 19968: 0xDFC5, 23363 - 19968: 0xE5BE, 23376 - 19968: 0xEDAD, 23377 - 19968: 0xFAEA, 23380 - 19968: 0xCDEE, 23381 - 19968: 0xEDA6, 23383 - 19968: 0xEDAE, 23384 - 19968: 0xF0ED, 23386 - 19968: 0xDDA1, 23388 - 19968: 0xEDAF, 23389 - 19968: 0xFCF8, 23391 - 19968: 0xD8EB, 23395 - 19968: 0xCCF9, 23396 - 19968: 0xCDB5, 23401 - 19968: 0xFAA9, 23403 - 19968: 0xE1DD, 23408 - 19968: 0xE2D5, 23409 - 19968: 0xEDCF, 23413 - 19968: 0xDDA2, 23416 - 19968: 0xF9CA, 23418 - 19968: 0xEAE8, 23420 - 19968: 0xE5ED, 23429 - 19968: 0xD3EB, 23431 - 19968: 0xE9D4, 23432 - 19968: 0xE1FA, 23433 - 19968: 0xE4CC, 23435 - 19968: 0xE1E4, 23436 - 19968: 0xE8C7, 23439 - 19968: 0xCEDB, 23443 - 19968: 0xDCD5, 23445 - 19968: 0xF7B5, 23446 - 19968: 0xFCF3, 23447 - 19968: 0xF0F3, 23448 - 19968: 0xCEAF, 23449 - 19968: 0xF1B5, 23450 - 19968: 0xEFD2, 23451 - 19968: 0xE8C8, 23452 - 19968: 0xEBF1, 23458 - 19968: 0xCBD4, 23459 - 19968: 0xE0BE, 23460 - 19968: 0xE3F8, 23461 - 19968: 0xEAE9, 23462 - 19968: 0xFCB2, 23468 - 19968: 0xE0F4, 23470 - 19968: 0xCFE0, 23472 - 19968: 0xEEA5, 23475 - 19968: 0xFAAA, 23476 - 19968: 0xE6C3, 23477 - 19968: 0xE1B2, 23478 - 19968: 0xCAAB, 23480 - 19968: 0xE3E4, 23481 - 19968: 0xE9BB, 23487 - 19968: 0xE2D6, 23488 - 19968: 0xF3F2, 23490 - 19968: 0xEED6, 23491 - 19968: 0xEAB2, 23492 - 19968: 0xD0F6, 23493 - 19968: 0xECD9, 23494 - 19968: 0xDACB, 23495 - 19968: 0xCFA8, 23500 - 19968: 0xDDA3, 23504 - 19968: 0xD8DB, 23506 - 19968: 0xF9CE, 23507 - 19968: 0xE9D5, 23508 - 19968: 0xE3D1, 23511 - 19968: 0xD2BC, 23518 - 19968: 0xD8AC, 23519 - 19968: 0xF3CC, 23521 - 19968: 0xCDFB, 23522 - 19968: 0xF6D6, 23524 - 19968: 0xE7F5, 23525 - 19968: 0xE8EF, 23526 - 19968: 0xE3F9, 23527 - 19968: 0xD2BB, 23528 - 19968: 0xF3F3, 23529 - 19968: 0xE3FB, 23531 - 19968: 0xDED0, 23532 - 19968: 0xCEB0, 23534 - 19968: 0xD6F7, 23535 - 19968: 0xF1D9, 23541 - 19968: 0xF5C1, 23542 - 19968: 0xDCC4, 23544 - 19968: 0xF5BB, 23546 - 19968: 0xDED1, 23553 - 19968: 0xDCE6, 23556 - 19968: 0xDED2, 23559 - 19968: 0xEDE2, 23560 - 19968: 0xEEF6, 23561 - 19968: 0xEACF, 23562 - 19968: 0xF0EE, 23563 - 19968: 0xE3FC, 23565 - 19968: 0xD3DF, 23566 - 19968: 0xD3F4, 23567 - 19968: 0xE1B3, 23569 - 19968: 0xE1B4, 23574 - 19968: 0xF4D3, 23577 - 19968: 0xDFC6, 23588 - 19968: 0xE9D6, 23592 - 19968: 0xDBAB, 23601 - 19968: 0xF6A6, 23608 - 19968: 0xE3B9, 23609 - 19968: 0xEBC5, 23610 - 19968: 0xF4A9, 23611 - 19968: 0xCDB6, 23612 - 19968: 0xD2F9, 23614 - 19968: 0xDAAD, 23615 - 19968: 0xD2E3, 23616 - 19968: 0xCFD1, 23621 - 19968: 0xCBDC, 23622 - 19968: 0xCCFA, 23624 - 19968: 0xCFDD, 23627 - 19968: 0xE8A9, 23629 - 19968: 0xE3BB, 23630 - 19968: 0xE3BA, 23633 - 19968: 0xE0DA, 23637 - 19968: 0xEEF7, 23643 - 19968: 0xDCB3, 23648 - 19968: 0xD3F5, 23650 - 19968: 0xD7A6, 23652 - 19968: 0xF6B5, 23653 - 19968: 0xD7DB, 23660 - 19968: 0xE1D5, 23663 - 19968: 0xD4EA, 23665 - 19968: 0xDFA3, 23673 - 19968: 0xFDDF, 23696 - 19968: 0xD0F7, 23697 - 19968: 0xEDD4, 23713 - 19968: 0xCBAA, 23721 - 19968: 0xE4DB, 23723 - 19968: 0xE1FB, 23724 - 19968: 0xCBA2, 23729 - 19968: 0xD3E0, 23731 - 19968: 0xE4BF, 23733 - 19968: 0xFBC0, 23735 - 19968: 0xDABE, 23736 - 19968: 0xE4CD, 23738 - 19968: 0xD6B9, 23742 - 19968: 0xEFC0, 23744 - 19968: 0xE1FC, 23769 - 19968: 0xF6B9, 23776 - 19968: 0xDFC7, 23784 - 19968: 0xE4B1, 23791 - 19968: 0xDCE7, 23792 - 19968: 0xDCE8, 23796 - 19968: 0xFAD6, 23798 - 19968: 0xD3F6, 23803 - 19968: 0xF1DA, 23805 - 19968: 0xFAF2, 23815 - 19968: 0xE2FD, 23821 - 19968: 0xD5CF, 23822 - 19968: 0xD0F8, 23825 - 19968: 0xCDDF, 23828 - 19968: 0xF5CB, 23830 - 19968: 0xE4F0, 23831 - 19968: 0xCBAB, 23833 - 19968: 0xD7C4, 23847 - 19968: 0xE2FE, 23849 - 19968: 0xDDDA, 23883 - 19968: 0xDAAE, 23884 - 19968: 0xCAEE, 23888 - 19968: 0xD5B9, 23913 - 19968: 0xE3A1, 23916 - 19968: 0xE8E3, 23919 - 19968: 0xF3AB, 23943 - 19968: 0xCFA9, 23947 - 19968: 0xD3F7, 23965 - 19968: 0xD4F1, 23968 - 19968: 0xCEE4, 23970 - 19968: 0xE8F2, 23978 - 19968: 0xE5F5, 23992 - 19968: 0xE7AE, 23994 - 19968: 0xD6BA, 23996 - 19968: 0xDFEC, 23997 - 19968: 0xE4C0, 24013 - 19968: 0xE8E4, 24018 - 19968: 0xD8B5, 24022 - 19968: 0xE4DC, 24029 - 19968: 0xF4B9, 24030 - 19968: 0xF1B6, 24033 - 19968: 0xE2DE, 24034 - 19968: 0xE1B5, 24037 - 19968: 0xCDEF, 24038 - 19968: 0xF1A7, 24039 - 19968: 0xCEE5, 24040 - 19968: 0xCBDD, 24043 - 19968: 0xD9E3, 24046 - 19968: 0xF3AC, 24049 - 19968: 0xD0F9, 24050 - 19968: 0xECAB, 24051 - 19968: 0xDED3, 24052 - 19968: 0xF7E9, 24055 - 19968: 0xF9F5, 24061 - 19968: 0xE1DE, 24062 - 19968: 0xCBEE, 24066 - 19968: 0xE3BC, 24067 - 19968: 0xF8D6, 24070 - 19968: 0xDBEE, 24076 - 19968: 0xFDF1, 24081 - 19968: 0xF7B6, 24086 - 19968: 0xF4DE, 24089 - 19968: 0xF2ED, 24091 - 19968: 0xDBD9, 24093 - 19968: 0xF0A8, 24101 - 19968: 0xE1FD, 24107 - 19968: 0xDED4, 24109 - 19968: 0xE0AC, 24115 - 19968: 0xEDE3, 24118 - 19968: 0xD3E1, 24120 - 19968: 0xDFC8, 24125 - 19968: 0xD9B6, 24127 - 19968: 0xFDAC, 24128 - 19968: 0xEFD3, 24132 - 19968: 0xE4C1, 24133 - 19968: 0xF8EB, 24135 - 19968: 0xDBAC, 24140 - 19968: 0xFCC6, 24149 - 19968: 0xD8AD, 24159 - 19968: 0xF6BA, 24161 - 19968: 0xDBDF, 24162 - 19968: 0xD3D3, 24163 - 19968: 0xF8C7, 24178 - 19968: 0xCACE, 24179 - 19968: 0xF8C1, 24180 - 19968: 0xD2B4, 24183 - 19968: 0xDCB4, 24184 - 19968: 0xFAB9, 24185 - 19968: 0xCACF, 24187 - 19968: 0xFCB3, 24188 - 19968: 0xEAEA, 24189 - 19968: 0xEAEB, 24190 - 19968: 0xD0FA, 24196 - 19968: 0xEDE4, 24199 - 19968: 0xDDE7, 24202 - 19968: 0xDFC9, 24207 - 19968: 0xDFED, 24213 - 19968: 0xEEBC, 24215 - 19968: 0xEFC1, 24218 - 19968: 0xCCD2, 24220 - 19968: 0xDDA4, 24224 - 19968: 0xDFCA, 24230 - 19968: 0xD3F8, 24231 - 19968: 0xF1A8, 24235 - 19968: 0xCDB7, 24237 - 19968: 0xEFD4, 24245 - 19968: 0xE4DD, 24246 - 19968: 0xDFEE, 24247 - 19968: 0xCBAC, 24248 - 19968: 0xE9BC, 24254 - 19968: 0xEAEC, 24258 - 19968: 0xDFCB, 24264 - 19968: 0xF9BF, 24265 - 19968: 0xD6AF, 24266 - 19968: 0xD5C6, 24272 - 19968: 0xCFAA, 24275 - 19968: 0xCEA9, 24278 - 19968: 0xD6F8, 24282 - 19968: 0xF1B7, 24283 - 19968: 0xEEF8, 24287 - 19968: 0xD9D9, 24288 - 19968: 0xF3DF, 24290 - 19968: 0xF8C8, 24291 - 19968: 0xCEC6, 24300 - 19968: 0xD5E6, 24307 - 19968: 0xF4E6, 24310 - 19968: 0xE6C5, 24311 - 19968: 0xEFD5, 24314 - 19968: 0xCBEF, 24315 - 19968: 0xFCDF, 24321 - 19968: 0xDCA7, 24324 - 19968: 0xD6E7, 24330 - 19968: 0xF8C9, 24335 - 19968: 0xE3D2, 24337 - 19968: 0xE3BD, 24339 - 19968: 0xCFE1, 24340 - 19968: 0xF0C0, 24341 - 19968: 0xECDA, 24343 - 19968: 0xDDD7, 24344 - 19968: 0xFBF0, 24347 - 19968: 0xECAC, 24351 - 19968: 0xF0A9, 24358 - 19968: 0xFAD7, 24359 - 19968: 0xFBC1, 24361 - 19968: 0xD2C0, 24369 - 19968: 0xE5B0, 24373 - 19968: 0xEDE5, 24378 - 19968: 0xCBAD, 24380 - 19968: 0xF9B0, 24392 - 19968: 0xF7A5, 24394 - 19968: 0xCBAE, 24396 - 19968: 0xDAAF, 24398 - 19968: 0xD8B6, 24406 - 19968: 0xD3A7, 24407 - 19968: 0xFBB2, 24409 - 19968: 0xFDC4, 24411 - 19968: 0xECAD, 24418 - 19968: 0xFBA1, 24422 - 19968: 0xE5E9, 24423 - 19968: 0xE9EE, 24425 - 19968: 0xF3F4, 24426 - 19968: 0xF8F3, 24427 - 19968: 0xF0C1, 24428 - 19968: 0xDEAF, 24429 - 19968: 0xF8B0, 24432 - 19968: 0xF3E0, 24433 - 19968: 0xE7AF, 24439 - 19968: 0xDBAD, 24441 - 19968: 0xE6B5, 24444 - 19968: 0xF9A8, 24447 - 19968: 0xDDD8, 24448 - 19968: 0xE8D9, 24449 - 19968: 0xEFD6, 24453 - 19968: 0xD3E2, 24455 - 19968: 0xE2DF, 24458 - 19968: 0xFCE0, 24459 - 19968: 0xD7C8, 24460 - 19968: 0xFDAD, 24464 - 19968: 0xDFEF, 24465 - 19968: 0xCCD3, 24466 - 19968: 0xD3F9, 24471 - 19968: 0xD4F0, 24472 - 19968: 0xDBC7, 24473 - 19968: 0xDED5, 24478 - 19968: 0xF0F4, 24480 - 19968: 0xD5D0, 24481 - 19968: 0xE5D9, 24488 - 19968: 0xFCC7, 24489 - 19968: 0xDCD6, 24490 - 19968: 0xE2E0, 24494 - 19968: 0xDAB0, 24501 - 19968: 0xF3A3, 24503 - 19968: 0xD3EC, 24505 - 19968: 0xF4CB, 24509 - 19968: 0xFDC5, 24515 - 19968: 0xE3FD, 24517 - 19968: 0xF9B1, 24524 - 19968: 0xD0FB, 24525 - 19968: 0xECDB, 24534 - 19968: 0xF5BC, 24535 - 19968: 0xF2A4, 24536 - 19968: 0xD8CE, 24537 - 19968: 0xD8CF, 24544 - 19968: 0xF5F7, 24555 - 19968: 0xF6E1, 24565 - 19968: 0xD2B7, 24573 - 19968: 0xFBEC, 24575 - 19968: 0xDDC8, 24591 - 19968: 0xE4E8, 24594 - 19968: 0xD2C1, 24598 - 19968: 0xF8D7, 24604 - 19968: 0xD6BB, 24605 - 19968: 0xDED6, 24608 - 19968: 0xF7BD, 24609 - 19968: 0xECAE, 24613 - 19968: 0xD0E1, 24615 - 19968: 0xE0F5, 24616 - 19968: 0xEAB3, 24618 - 19968: 0xCED6, 24623 - 19968: 0xCCA5, 24641 - 19968: 0xECF6, 24642 - 19968: 0xE2E1, 24643 - 19968: 0xE3BE, 24653 - 19968: 0xFCC8, 24656 - 19968: 0xCDF0, 24658 - 19968: 0xF9F6, 24661 - 19968: 0xDFF0, 24665 - 19968: 0xE5BF, 24669 - 19968: 0xCEBF, 24674 - 19968: 0xFCE1, 24675 - 19968: 0xEDB0, 24676 - 19968: 0xFDD1, 24677 - 19968: 0xF6BB, 24680 - 19968: 0xF9CF, 24681 - 19968: 0xEBDA, 24682 - 19968: 0xCAC1, 24684 - 19968: 0xD2B8, 24685 - 19968: 0xCDF1, 24687 - 19968: 0xE3D3, 24688 - 19968: 0xFDE6, 24709 - 19968: 0xE6ED, 24713 - 19968: 0xE3FA, 24716 - 19968: 0xF0AA, 24717 - 19968: 0xF9D0, 24724 - 19968: 0xFCE2, 24726 - 19968: 0xF8A7, 24730 - 19968: 0xE1E5, 24731 - 19968: 0xEEF9, 24735 - 19968: 0xE7F6, 24736 - 19968: 0xEAED, 24739 - 19968: 0xFCB4, 24740 - 19968: 0xF5C2, 24743 - 19968: 0xD7DC, 24752 - 19968: 0xF0F5, 24754 - 19968: 0xDDE8, 24755 - 19968: 0xD3ED, 24756 - 19968: 0xF5FC, 24758 - 19968: 0xDABF, 24760 - 19968: 0xCCFB, 24764 - 19968: 0xD3FA, 24765 - 19968: 0xF4A4, 24773 - 19968: 0xEFD7, 24775 - 19968: 0xD4C3, 24785 - 19968: 0xFBE3, 24794 - 19968: 0xFBED, 24796 - 19968: 0xE0AD, 24799 - 19968: 0xEAEE, 24800 - 19968: 0xFBB3, 24801 - 19968: 0xE4C2, 24816 - 19968: 0xF6E7, 24817 - 19968: 0xD2DD, 24819 - 19968: 0xDFCC, 24822 - 19968: 0xFCC9, 24825 - 19968: 0xE5A9, 24826 - 19968: 0xE0F6, 24827 - 19968: 0xF6B3, 24833 - 19968: 0xE1FE, 24838 - 19968: 0xCBF0, 24840 - 19968: 0xEAEF, 24841 - 19968: 0xEAF0, 24845 - 19968: 0xDAC0, 24846 - 19968: 0xF8B4, 24847 - 19968: 0xEBF2, 24853 - 19968: 0xE4C3, 24858 - 19968: 0xE9D7, 24859 - 19968: 0xE4F1, 24863 - 19968: 0xCAEF, 24871 - 19968: 0xCED7, 24880 - 19968: 0xFCCA, 24884 - 19968: 0xF3E1, 24887 - 19968: 0xCBC4, 24892 - 19968: 0xE3E5, 24894 - 19968: 0xCBC5, 24895 - 19968: 0xEAB4, 24898 - 19968: 0xE9BD, 24900 - 19968: 0xD7C9, 24903 - 19968: 0xEBDB, 24904 - 19968: 0xEDB1, 24906 - 19968: 0xCCC3, 24907 - 19968: 0xF7BE, 24908 - 19968: 0xFCCB, 24915 - 19968: 0xF8F4, 24917 - 19968: 0xD9B7, 24920 - 19968: 0xF3D3, 24921 - 19968: 0xF3D4, 24925 - 19968: 0xF7E4, 24927 - 19968: 0xF7D1, 24930 - 19968: 0xD8B7, 24931 - 19968: 0xCEB1, 24932 - 19968: 0xCAC2, 24935 - 19968: 0xFBB4, 24936 - 19968: 0xCBC6, 24939 - 19968: 0xF0F6, 24942 - 19968: 0xD5E7, 24944 - 19968: 0xEAD0, 24950 - 19968: 0xCCD4, 24951 - 19968: 0xCBAF, 24957 - 19968: 0xF4AA, 24958 - 19968: 0xE9AF, 24961 - 19968: 0xF5C3, 24962 - 19968: 0xE9D8, 24970 - 19968: 0xDDE9, 24974 - 19968: 0xF1F3, 24976 - 19968: 0xD5FB, 24977 - 19968: 0xDEBB, 24980 - 19968: 0xF4FB, 24984 - 19968: 0xFDF3, 24985 - 19968: 0xFDF2, 24986 - 19968: 0xF7A6, 24996 - 19968: 0xDDC9, 24999 - 19968: 0xD4D3, 25001 - 19968: 0xCCA8, 25003 - 19968: 0xDAC1, 25004 - 19968: 0xCCD5, 25006 - 19968: 0xD9E4, 25010 - 19968: 0xFACA, 25014 - 19968: 0xE5E3, 25018 - 19968: 0xD3BC, 25022 - 19968: 0xCAF0, 25027 - 19968: 0xD0C4, 25031 - 19968: 0xCAD0, 25032 - 19968: 0xFAAB, 25033 - 19968: 0xEBEB, 25034 - 19968: 0xE7F8, 25035 - 19968: 0xD9E5, 25062 - 19968: 0xD1D7, 25074 - 19968: 0xF3A4, 25078 - 19968: 0xD4FB, 25079 - 19968: 0xFCE3, 25080 - 19968: 0xFAD8, 25082 - 19968: 0xF3D5, 25084 - 19968: 0xCFAB, 25087 - 19968: 0xEBF3, 25088 - 19968: 0xD5FC, 25095 - 19968: 0xD3D4, 25096 - 19968: 0xCDFC, 25098 - 19968: 0xD9E6, 25100 - 19968: 0xE2F9, 25101 - 19968: 0xE2A1, 25102 - 19968: 0xEBD4, 25104 - 19968: 0xE0F7, 25105 - 19968: 0xE4B2, 25106 - 19968: 0xCCFC, 25110 - 19968: 0xFBE4, 25114 - 19968: 0xF4AB, 25119 - 19968: 0xD0BD, 25121 - 19968: 0xCAF1, 25130 - 19968: 0xEFB8, 25134 - 19968: 0xD7C0, 25136 - 19968: 0xEEFA, 25137 - 19968: 0xFDF4, 25140 - 19968: 0xD3E3, 25142 - 19968: 0xFBC2, 25150 - 19968: 0xD5E8, 25151 - 19968: 0xDBAE, 25152 - 19968: 0xE1B6, 25153 - 19968: 0xF8B7, 25159 - 19968: 0xE0BF, 25160 - 19968: 0xFBC3, 25161 - 19968: 0xDDEA, 25163 - 19968: 0xE2A2, 25165 - 19968: 0xEEA6, 25171 - 19968: 0xF6E8, 25176 - 19968: 0xF6F5, 25198 - 19968: 0xDDCA, 25201 - 19968: 0xD0E2, 25206 - 19968: 0xDDA6, 25209 - 19968: 0xDDEB, 25212 - 19968: 0xE4F9, 25215 - 19968: 0xE3AF, 25216 - 19968: 0xD0FC, 25220 - 19968: 0xF4FC, 25225 - 19968: 0xCCBC, 25226 - 19968: 0xF7EA, 25233 - 19968: 0xE5E4, 25234 - 19968: 0xDFF1, 25237 - 19968: 0xF7E1, 25239 - 19968: 0xF9F7, 25240 - 19968: 0xEFB9, 25243 - 19968: 0xF8D8, 25259 - 19968: 0xF9A9, 25265 - 19968: 0xF8D9, 25269 - 19968: 0xEEBD, 25273 - 19968: 0xD8C6, 25276 - 19968: 0xE4E3, 25277 - 19968: 0xF5CE, 25282 - 19968: 0xDDD9, 25287 - 19968: 0xD9E7, 25288 - 19968: 0xD2B9, 25289 - 19968: 0xD5C3, 25292 - 19968: 0xDAE5, 25293 - 19968: 0xDAD0, 25295 - 19968: 0xD1D9, 25296 - 19968: 0xCED8, 25298 - 19968: 0xCBDE, 25299 - 19968: 0xF4AC, 25300 - 19968: 0xDAFB, 25302 - 19968: 0xF6E9, 25303 - 19968: 0xE8F3, 25304 - 19968: 0xCFAC, 25305 - 19968: 0xF0F0, 25307 - 19968: 0xF4FD, 25308 - 19968: 0xDBC8, 25324 - 19968: 0xCEC0, 25325 - 19968: 0xE3D4, 25326 - 19968: 0xD1CF, 25327 - 19968: 0xF1F5, 25329 - 19968: 0xCDF2, 25331 - 19968: 0xCFEB, 25335 - 19968: 0xCDB8, 25342 - 19968: 0xE3A6, 25343 - 19968: 0xD1DA, 25345 - 19968: 0xF2A5, 25351 - 19968: 0xF2A6, 25353 - 19968: 0xE4CE, 25361 - 19968: 0xD3FB, 25387 - 19968: 0xF1A9, 25391 - 19968: 0xF2C9, 25402 - 19968: 0xEFD8, 25403 - 19968: 0xE6C9, 25405 - 19968: 0xD8B8, 25406 - 19968: 0xFAF3, 25417 - 19968: 0xF3B5, 25420 - 19968: 0xF8A4, 25423 - 19968: 0xD1F3, 25424 - 19968: 0xE6C8, 25429 - 19968: 0xF8DA, 25447 - 19968: 0xDCE9, 25448 - 19968: 0xDED7, 25454 - 19968: 0xCBDF, 25458 - 19968: 0xCFEC, 25463 - 19968: 0xF4DF, 25466 - 19968: 0xD1F4, 25467 - 19968: 0xD2BA, 25471 - 19968: 0xDFF2, 25475 - 19968: 0xE1B7, 25480 - 19968: 0xE2A3, 25481 - 19968: 0xD3FC, 25484 - 19968: 0xEDE6, 25490 - 19968: 0xDBC9, 25494 - 19968: 0xE4FA, 25496 - 19968: 0xCFDE, 25499 - 19968: 0xCED0, 25504 - 19968: 0xD5D3, 25505 - 19968: 0xF3F5, 25506 - 19968: 0xF7AE, 25509 - 19968: 0xEFC8, 25511 - 19968: 0xCDF3, 25512 - 19968: 0xF5CF, 25513 - 19968: 0xE5F3, 25514 - 19968: 0xF0C2, 25536 - 19968: 0xCAD1, 25540 - 19968: 0xEAF1, 25542 - 19968: 0xD0A6, 25551 - 19968: 0xD9DA, 25552 - 19968: 0xF0AB, 25558 - 19968: 0xEBE7, 25562 - 19968: 0xE5C0, 25563 - 19968: 0xFCB5, 25569 - 19968: 0xE4C4, 25581 - 19968: 0xCCA9, 25582 - 19968: 0xFDC6, 25588 - 19968: 0xEAB5, 25590 - 19968: 0xE5AA, 25591 - 19968: 0xDFBA, 25613 - 19968: 0xE1DF, 25615 - 19968: 0xDAD1, 25620 - 19968: 0xE1B8, 25622 - 19968: 0xE8F4, 25623 - 19968: 0xD3FD, 25628 - 19968: 0xE2A4, 25634 - 19968: 0xF2CA, 25644 - 19968: 0xDAE6, 25645 - 19968: 0xF7B3, 25658 - 19968: 0xFDCD, 25662 - 19968: 0xF3B6, 25688 - 19968: 0xEED7, 25696 - 19968: 0xF5C4, 25705 - 19968: 0xD8A4, 25711 - 19968: 0xF2A7, 25720 - 19968: 0xD9B8, 25721 - 19968: 0xD9B9, 25722 - 19968: 0xEFC9, 25736 - 19968: 0xD6CE, 25745 - 19968: 0xF7CB, 25746 - 19968: 0xDFAE, 25747 - 19968: 0xE8F5, 25754 - 19968: 0xD2B5, 25758 - 19968: 0xD3D5, 25764 - 19968: 0xF4CC, 25765 - 19968: 0xDAFC, 25771 - 19968: 0xD9E8, 25773 - 19968: 0xF7EB, 25774 - 19968: 0xF5C9, 25776 - 19968: 0xF3BC, 25778 - 19968: 0xDAD2, 25787 - 19968: 0xD3B5, 25793 - 19968: 0xE8B6, 25796 - 19968: 0xD6CF, 25797 - 19968: 0xF4BA, 25799 - 19968: 0xF7C9, 25802 - 19968: 0xCCAA, 25805 - 19968: 0xF0C3, 25806 - 19968: 0xCCD6, 25810 - 19968: 0xD0D3, 25812 - 19968: 0xD3BD, 25816 - 19968: 0xDBFB, 25818 - 19968: 0xCBE0, 25825 - 19968: 0xD3E4, 25826 - 19968: 0xF6F7, 25829 - 19968: 0xD5BA, 25830 - 19968: 0xF3CD, 25831 - 19968: 0xCBE1, 25836 - 19968: 0xEBF4, 25842 - 19968: 0xF4AD, 25844 - 19968: 0xFCAA, 25850 - 19968: 0xF7EC, 25854 - 19968: 0xE8F6, 25856 - 19968: 0xDAE7, 25860 - 19968: 0xF7CC, 25880 - 19968: 0xE5C1, 25885 - 19968: 0xE0EE, 25891 - 19968: 0xD5FD, 25898 - 19968: 0xCEE6, 25899 - 19968: 0xFCAB, 25900 - 19968: 0xD5BB, 25903 - 19968: 0xF2A8, 25910 - 19968: 0xE2A5, 25911 - 19968: 0xCDB9, 25912 - 19968: 0xEAF2, 25913 - 19968: 0xCBC7, 25915 - 19968: 0xCDF4, 25918 - 19968: 0xDBAF, 25919 - 19968: 0xEFD9, 25925 - 19968: 0xCDBA, 25928 - 19968: 0xFCF9, 25933 - 19968: 0xDFF3, 25934 - 19968: 0xCEE7, 25935 - 19968: 0xDAC2, 25937 - 19968: 0xCFAD, 25942 - 19968: 0xE7F9, 25943 - 19968: 0xF8A8, 25950 - 19968: 0xF3E2, 25954 - 19968: 0xCAF2, 25955 - 19968: 0xDFA4, 25958 - 19968: 0xD4C4, 25964 - 19968: 0xCCD7, 25965 - 19968: 0xE5C2, 25970 - 19968: 0xCDBB, 25972 - 19968: 0xEFDA, 25973 - 19968: 0xEED8, 25975 - 19968: 0xDDA7, 25976 - 19968: 0xE2A6, 25982 - 19968: 0xE0C0, 25986 - 19968: 0xD6B0, 25987 - 19968: 0xF8CA, 25989 - 19968: 0xFCFA, 25991 - 19968: 0xD9FE, 25996 - 19968: 0xDEB0, 26000 - 19968: 0xDDEC, 26001 - 19968: 0xDAE8, 26007 - 19968: 0xD4E0, 26009 - 19968: 0xD6F9, 26011 - 19968: 0xCDD7, 26012 - 19968: 0xDED8, 26015 - 19968: 0xF2F8, 26017 - 19968: 0xE4D6, 26020 - 19968: 0xD0C5, 26021 - 19968: 0xF4AE, 26023 - 19968: 0xDDA8, 26027 - 19968: 0xEDC5, 26028 - 19968: 0xF3D6, 26031 - 19968: 0xDED9, 26032 - 19968: 0xE3E6, 26039 - 19968: 0xD3A8, 26041 - 19968: 0xDBB0, 26044 - 19968: 0xE5DA, 26045 - 19968: 0xE3BF, 26049 - 19968: 0xDBB1, 26053 - 19968: 0xD5E9, 26059 - 19968: 0xE0C1, 26060 - 19968: 0xEFDB, 26063 - 19968: 0xF0E9, 26066 - 19968: 0xD7B2, 26071 - 19968: 0xD0FD, 26080 - 19968: 0xD9E9, 26083 - 19968: 0xD0FE, 26085 - 19968: 0xECED, 26086 - 19968: 0xD3A9, 26088 - 19968: 0xF2A9, 26089 - 19968: 0xF0C4, 26092 - 19968: 0xE2E2, 26093 - 19968: 0xE9EF, 26097 - 19968: 0xF9D1, 26100 - 19968: 0xE9D9, 26106 - 19968: 0xE8DA, 26107 - 19968: 0xDAC3, 26108 - 19968: 0xDAC4, 26109 - 19968: 0xD4C5, 26111 - 19968: 0xE7FA, 26118 - 19968: 0xCDE0, 26119 - 19968: 0xE3B0, 26121 - 19968: 0xDBB2, 26122 - 19968: 0xFBC4, 26124 - 19968: 0xF3E3, 26126 - 19968: 0xD9A5, 26127 - 19968: 0xFBE7, 26128 - 19968: 0xDDCB, 26129 - 19968: 0xD0D4, 26131 - 19968: 0xE6B6, 26132 - 19968: 0xE0AE, 26133 - 19968: 0xFDDA, 26142 - 19968: 0xDCB5, 26143 - 19968: 0xE0F8, 26144 - 19968: 0xE7B1, 26149 - 19968: 0xF5F0, 26151 - 19968: 0xD8DC, 26152 - 19968: 0xEDC6, 26157 - 19968: 0xE1B9, 26159 - 19968: 0xE3C0, 26160 - 19968: 0xF9C0, 26161 - 19968: 0xE9F0, 26164 - 19968: 0xD9DB, 26166 - 19968: 0xF3E4, 26170 - 19968: 0xDCB6, 26171 - 19968: 0xE4E9, 26177 - 19968: 0xF0C5, 26178 - 19968: 0xE3C1, 26179 - 19968: 0xFCCC, 26180 - 19968: 0xFCCD, 26185 - 19968: 0xF2CB, 26187 - 19968: 0xF2CC, 26191 - 19968: 0xE4CF, 26201 - 19968: 0xF1DB, 26203 - 19968: 0xFAD9, 26205 - 19968: 0xF1B8, 26206 - 19968: 0xFDF5, 26207 - 19968: 0xE0F9, 26212 - 19968: 0xE7FB, 26213 - 19968: 0xFCB7, 26214 - 19968: 0xFCE4, 26215 - 19968: 0xFBC5, 26216 - 19968: 0xE3E7, 26217 - 19968: 0xD8B9, 26219 - 19968: 0xF6F8, 26222 - 19968: 0xDCC5, 26223 - 19968: 0xCCD8, 26227 - 19968: 0xE0AF, 26228 - 19968: 0xF4E7, 26230 - 19968: 0xEFDC, 26231 - 19968: 0xCFFC, 26232 - 19968: 0xEFDD, 26234 - 19968: 0xF2AA, 26244 - 19968: 0xFDBE, 26247 - 19968: 0xCAAC, 26248 - 19968: 0xFDBB, 26249 - 19968: 0xFDC7, 26254 - 19968: 0xE7B2, 26256 - 19968: 0xEAD1, 26257 - 19968: 0xDFF4, 26262 - 19968: 0xD1EC, 26263 - 19968: 0xE4DE, 26264 - 19968: 0xE5C3, 26269 - 19968: 0xD9A6, 26272 - 19968: 0xCDBC, 26274 - 19968: 0xF3E5, 26283 - 19968: 0xEDD5, 26286 - 19968: 0xD9BA, 26290 - 19968: 0xEDE7, 26291 - 19968: 0xFBB5, 26292 - 19968: 0xF8EC, 26297 - 19968: 0xE0E7, 26299 - 19968: 0xCCD9, 26302 - 19968: 0xD4C6, 26308 - 19968: 0xE7A5, 26310 - 19968: 0xD5F5, 26311 - 19968: 0xD3BE, 26313 - 19968: 0xFCFB, 26326 - 19968: 0xE4F2, 26329 - 19968: 0xDFF5, 26332 - 19968: 0xE8F8, 26333 - 19968: 0xF8ED, 26336 - 19968: 0xCEC7, 26342 - 19968: 0xFDF6, 26352 - 19968: 0xE8D8, 26354 - 19968: 0xCDD8, 26355 - 19968: 0xE7D6, 26356 - 19968: 0xCCDA, 26359 - 19968: 0xCAE3, 26360 - 19968: 0xDFF6, 26361 - 19968: 0xF0C7, 26362 - 19968: 0xF0C6, 26364 - 19968: 0xD8BA, 26366 - 19968: 0xF1F4, 26367 - 19968: 0xF4F0, 26368 - 19968: 0xF5CC, 26371 - 19968: 0xFCE5, 26376 - 19968: 0xEAC5, 26377 - 19968: 0xEAF3, 26379 - 19968: 0xDDDB, 26381 - 19968: 0xDCD7, 26388 - 19968: 0xDEFD, 26389 - 19968: 0xF2F9, 26391 - 19968: 0xD5C7, 26395 - 19968: 0xD8D0, 26397 - 19968: 0xF0C8, 26398 - 19968: 0xD1A1, 26399 - 19968: 0xD1A2, 26406 - 19968: 0xD9D4, 26407 - 19968: 0xD6E8, 26408 - 19968: 0xD9CA, 26410 - 19968: 0xDAB1, 26411 - 19968: 0xD8C7, 26412 - 19968: 0xDCE2, 26413 - 19968: 0xF3CE, 26414 - 19968: 0xF5F4, 26417 - 19968: 0xF1B9, 26420 - 19968: 0xDAD3, 26422 - 19968: 0xF6EA, 26426 - 19968: 0xCFF5, 26429 - 19968: 0xFDAE, 26438 - 19968: 0xCAD2, 26441 - 19968: 0xDFB4, 26446 - 19968: 0xD7DD, 26447 - 19968: 0xFABA, 26448 - 19968: 0xEEA7, 26449 - 19968: 0xF5BD, 26451 - 19968: 0xF8F5, 26454 - 19968: 0xEDE8, 26460 - 19968: 0xD4E1, 26462 - 19968: 0xD1A3, 26463 - 19968: 0xE1D6, 26477 - 19968: 0xF9F8, 26479 - 19968: 0xDBCA, 26480 - 19968: 0xCBF9, 26481 - 19968: 0xD4D4, 26483 - 19968: 0xD9DC, 26485 - 19968: 0xEEBE, 26487 - 19968: 0xF7ED, 26491 - 19968: 0xD2EE, 26494 - 19968: 0xE1E6, 26495 - 19968: 0xF7F9, 26503 - 19968: 0xDDED, 26505 - 19968: 0xE8DB, 26507 - 19968: 0xDBB3, 26511 - 19968: 0xD1F7, 26512 - 19968: 0xE0B0, 26515 - 19968: 0xD4E2, 26517 - 19968: 0xF6D7, 26519 - 19968: 0xD7F9, 26522 - 19968: 0xD8DD, 26524 - 19968: 0xCDFD, 26525 - 19968: 0xF2AB, 26543 - 19968: 0xCDBD, 26544 - 19968: 0xF8C2, 26547 - 19968: 0xF2AC, 26550 - 19968: 0xCAAD, 26551 - 19968: 0xCAAE, 26552 - 19968: 0xCFAE, 26558 - 19968: 0xE3C2, 26564 - 19968: 0xDCB7, 26575 - 19968: 0xDBDA, 26576 - 19968: 0xD9BB, 26577 - 19968: 0xCAF3, 26578 - 19968: 0xF6D3, 26579 - 19968: 0xE6F8, 26580 - 19968: 0xEAF5, 26586 - 19968: 0xEAF6, 26589 - 19968: 0xF6F9, 26601 - 19968: 0xCFAF, 26604 - 19968: 0xCAD3, 26607 - 19968: 0xCAAF, 26608 - 19968: 0xD2B0, 26609 - 19968: 0xF1BA, 26611 - 19968: 0xD7B3, 26612 - 19968: 0xE3C3, 26613 - 19968: 0xF3FD, 26614 - 19968: 0xDEDA, 26619 - 19968: 0xDEDB, 26622 - 19968: 0xEFDE, 26642 - 19968: 0xE2E3, 26643 - 19968: 0xEEFB, 26646 - 19968: 0xDFF7, 26647 - 19968: 0xD7CA, 26657 - 19968: 0xCEE8, 26658 - 19968: 0xDBDB, 26666 - 19968: 0xF1BB, 26671 - 19968: 0xE9F1, 26680 - 19968: 0xFAB7, 26681 - 19968: 0xD0C6, 26684 - 19968: 0xCCAB, 26685 - 19968: 0xEEA8, 26688 - 19968: 0xCBFA, 26689 - 19968: 0xF9F9, 26690 - 19968: 0xCCFD, 26691 - 19968: 0xD3FE, 26696 - 19968: 0xE4D0, 26702 - 19968: 0xF2EE, 26704 - 19968: 0xD4D5, 26705 - 19968: 0xDFCD, 26707 - 19968: 0xFCB8, 26708 - 19968: 0xD1D0, 26733 - 19968: 0xF2CD, 26742 - 19968: 0xF7D2, 26751 - 19968: 0xCAD4, 26753 - 19968: 0xD5D9, 26757 - 19968: 0xD8DE, 26767 - 19968: 0xCDD9, 26771 - 19968: 0xEEA9, 26772 - 19968: 0xF6BC, 26775 - 19968: 0xCCDB, 26781 - 19968: 0xF0C9, 26783 - 19968: 0xFCFC, 26785 - 19968: 0xE8C9, 26786 - 19968: 0xF4FE, 26791 - 19968: 0xE7FC, 26792 - 19968: 0xD7DE, 26797 - 19968: 0xDEDC, 26799 - 19968: 0xF0AC, 26800 - 19968: 0xCCFE, 26801 - 19968: 0xCDE1, 26803 - 19968: 0xE1BA, 26805 - 19968: 0xDBEF, 26806 - 19968: 0xDAB2, 26820 - 19968: 0xD1A5, 26821 - 19968: 0xDCB8, 26825 - 19968: 0xD8F6, 26827 - 19968: 0xD1A4, 26829 - 19968: 0xCDE2, 26834 - 19968: 0xDCEA, 26837 - 19968: 0xF0F7, 26839 - 19968: 0xF0CA, 26840 - 19968: 0xD0BE, 26842 - 19968: 0xDDDC, 26847 - 19968: 0xD4D6, 26848 - 19968: 0xD3D6, 26855 - 19968: 0xEDD0, 26856 - 19968: 0xCDA1, 26862 - 19968: 0xDFB5, 26866 - 19968: 0xDFF8, 26873 - 19968: 0xD4A1, 26874 - 19968: 0xCEB2, 26880 - 19968: 0xE8CA, 26885 - 19968: 0xEBF5, 26893 - 19968: 0xE3D5, 26894 - 19968: 0xF5D0, 26898 - 19968: 0xF5A1, 26919 - 19968: 0xD9A7, 26928 - 19968: 0xE5AB, 26941 - 19968: 0xE6CB, 26943 - 19968: 0xF5F1, 26954 - 19968: 0xE5C5, 26963 - 19968: 0xF9A3, 26964 - 19968: 0xE0DB, 26965 - 19968: 0xF6EB, 26967 - 19968: 0xCBF1, 26969 - 19968: 0xD9EA, 26970 - 19968: 0xF5A2, 26974 - 19968: 0xD7D1, 26976 - 19968: 0xD1F8, 26977 - 19968: 0xEAF8, 26978 - 19968: 0xEAF9, 26979 - 19968: 0xDAB3, 26984 - 19968: 0xEFDF, 26987 - 19968: 0xF1EF, 26989 - 19968: 0xE5F6, 26990 - 19968: 0xEEBF, 26991 - 19968: 0xE2E4, 26997 - 19968: 0xD0BF, 26999 - 19968: 0xFAAC, 27000 - 19968: 0xF5D1, 27001 - 19968: 0xE7B3, 27029 - 19968: 0xE9BE, 27035 - 19968: 0xF2CE, 27036 - 19968: 0xDBB4, 27045 - 19968: 0xFCCE, 27047 - 19968: 0xDDEE, 27054 - 19968: 0xE7B4, 27060 - 19968: 0xD7B4, 27067 - 19968: 0xF7B4, 27073 - 19968: 0xCDBE, 27075 - 19968: 0xDAE9, 27083 - 19968: 0xCFB0, 27084 - 19968: 0xF7D9, 27085 - 19968: 0xF3E6, 27088 - 19968: 0xCED9, 27112 - 19968: 0xCEAA, 27114 - 19968: 0xCBC8, 27131 - 19968: 0xD0A7, 27133 - 19968: 0xF0CB, 27135 - 19968: 0xD0C7, 27138 - 19968: 0xE4C5, 27146 - 19968: 0xDBE0, 27153 - 19968: 0xD5DA, 27155 - 19968: 0xD7A7, 27159 - 19968: 0xEEC0, 27161 - 19968: 0xF8F6, 27166 - 19968: 0xF5D2, 27167 - 19968: 0xEDE9, 27169 - 19968: 0xD9BC, 27171 - 19968: 0xE5C6, 27189 - 19968: 0xF5A3, 27192 - 19968: 0xDAD4, 27193 - 19968: 0xE2A7, 27194 - 19968: 0xFBFC, 27197 - 19968: 0xF1DC, 27204 - 19968: 0xCAF4, 27208 - 19968: 0xE8FA, 27211 - 19968: 0xCEE9, 27218 - 19968: 0xE9F8, 27219 - 19968: 0xE2E5, 27224 - 19968: 0xD0B9, 27225 - 19968: 0xD4F2, 27231 - 19968: 0xD1A6, 27233 - 19968: 0xDFCE, 27243 - 19968: 0xFCF4, 27264 - 19968: 0xD3AA, 27268 - 19968: 0xCCAC, 27273 - 19968: 0xEFE0, 27277 - 19968: 0xE5E5, 27278 - 19968: 0xD0D5, 27287 - 19968: 0xDBFC, 27292 - 19968: 0xFCE6, 27298 - 19968: 0xCBFE, 27299 - 19968: 0xEDEA, 27315 - 19968: 0xDEB1, 27323 - 19968: 0xF9E3, 27330 - 19968: 0xD4A2, 27331 - 19968: 0xCFF6, 27347 - 19968: 0xD6D0, 27354 - 19968: 0xD5EA, 27355 - 19968: 0xF1EE, 27382 - 19968: 0xFACB, 27387 - 19968: 0xE5A1, 27396 - 19968: 0xD5B1, 27402 - 19968: 0xCFED, 27404 - 19968: 0xEDEB, 27410 - 19968: 0xD5B2, 27414 - 19968: 0xD5BC, 27424 - 19968: 0xFDE2, 27425 - 19968: 0xF3AD, 27427 - 19968: 0xFDDB, 27442 - 19968: 0xE9B0, 27450 - 19968: 0xD1A7, 27453 - 19968: 0xFDE3, 27454 - 19968: 0xCEB3, 27462 - 19968: 0xFDE4, 27463 - 19968: 0xFACE, 27468 - 19968: 0xCAB0, 27470 - 19968: 0xF7A7, 27472 - 19968: 0xCFB1, 27487 - 19968: 0xE6A2, 27489 - 19968: 0xFCB6, 27490 - 19968: 0xF2AD, 27491 - 19968: 0xEFE1, 27492 - 19968: 0xF3AE, 27493 - 19968: 0xDCC6, 27494 - 19968: 0xD9EB, 27498 - 19968: 0xE8E0, 27506 - 19968: 0xE1A8, 27511 - 19968: 0xD5F6, 27512 - 19968: 0xCFFD, 27515 - 19968: 0xDEDD, 27519 - 19968: 0xD9D1, 27523 - 19968: 0xE4EA, 27524 - 19968: 0xF2CF, 27526 - 19968: 0xF7BF, 27529 - 19968: 0xE2E6, 27530 - 19968: 0xE2A8, 27542 - 19968: 0xE3D6, 27544 - 19968: 0xEDD1, 27550 - 19968: 0xE9F9, 27566 - 19968: 0xD6B1, 27567 - 19968: 0xDEB2, 27570 - 19968: 0xE0E8, 27573 - 19968: 0xD3AB, 27575 - 19968: 0xEBDC, 27578 - 19968: 0xDFAF, 27580 - 19968: 0xCAC3, 27583 - 19968: 0xEEFC, 27585 - 19968: 0xFDC3, 27589 - 19968: 0xEBF6, 27590 - 19968: 0xCFB2, 27595 - 19968: 0xD9EC, 27597 - 19968: 0xD9BD, 27599 - 19968: 0xD8DF, 27602 - 19968: 0xD4B8, 27603 - 19968: 0xEBBE, 27604 - 19968: 0xDDEF, 27606 - 19968: 0xDDF0, 27607 - 19968: 0xDDF1, 27608 - 19968: 0xDDF2, 27611 - 19968: 0xD9BE, 27627 - 19968: 0xFBC6, 27628 - 19968: 0xCFB3, 27656 - 19968: 0xEEFD, 27663 - 19968: 0xE4AB, 27665 - 19968: 0xDAC5, 27667 - 19968: 0xD8EC, 27683 - 19968: 0xD1A8, 27700 - 19968: 0xE2A9, 27703 - 19968: 0xDEBC, 27704 - 19968: 0xE7B5, 27710 - 19968: 0xDBF0, 27712 - 19968: 0xEFE2, 27713 - 19968: 0xF1F0, 27714 - 19968: 0xCFB4, 27726 - 19968: 0xDBF1, 27728 - 19968: 0xE0B1, 27733 - 19968: 0xDFA5, 27735 - 19968: 0xF9D2, 27738 - 19968: 0xE7FD, 27741 - 19968: 0xE6A3, 27742 - 19968: 0xFBF1, 27743 - 19968: 0xCBB0, 27744 - 19968: 0xF2AE, 27752 - 19968: 0xCDE7, 27754 - 19968: 0xE8DC, 27757 - 19968: 0xE7D7, 27760 - 19968: 0xF7C0, 27762 - 19968: 0xD0E3, 27766 - 19968: 0xDAA1, 27770 - 19968: 0xCCBD, 27773 - 19968: 0xD1A9, 27774 - 19968: 0xDDCC, 27777 - 19968: 0xE3FE, 27778 - 19968: 0xD1AA, 27779 - 19968: 0xE8AA, 27781 - 19968: 0xEAB6, 27782 - 19968: 0xF9FA, 27783 - 19968: 0xE6CC, 27784 - 19968: 0xF6D8, 27788 - 19968: 0xD4C7, 27792 - 19968: 0xD9CB, 27794 - 19968: 0xD9D2, 27795 - 19968: 0xD3CB, 27796 - 19968: 0xD8F7, 27797 - 19968: 0xDAA9, 27798 - 19968: 0xF5F8, 27801 - 19968: 0xDEDE, 27802 - 19968: 0xF2AF, 27803 - 19968: 0xF8A9, 27819 - 19968: 0xD8C8, 27822 - 19968: 0xEEC1, 27827 - 19968: 0xF9C1, 27832 - 19968: 0xDDF3, 27833 - 19968: 0xEAFA, 27835 - 19968: 0xF6BD, 27836 - 19968: 0xE1BB, 27837 - 19968: 0xCDBF, 27838 - 19968: 0xF4D4, 27839 - 19968: 0xE6CD, 27841 - 19968: 0xFCCF, 27842 - 19968: 0xFBA2, 27844 - 19968: 0xE0DC, 27849 - 19968: 0xF4BB, 27850 - 19968: 0xDAD5, 27852 - 19968: 0xF9B2, 27859 - 19968: 0xFBF2, 27861 - 19968: 0xDBF6, 27863 - 19968: 0xDEDF, 27867 - 19968: 0xDBF2, 27873 - 19968: 0xF8DC, 27874 - 19968: 0xF7EE, 27875 - 19968: 0xEBE8, 27877 - 19968: 0xD2FA, 27880 - 19968: 0xF1BC, 27883 - 19968: 0xFADA, 27886 - 19968: 0xDAEA, 27887 - 19968: 0xDAC6, 27888 - 19968: 0xF7C1, 27891 - 19968: 0xE7B6, 27915 - 19968: 0xE5C7, 27916 - 19968: 0xD6AC, 27921 - 19968: 0xDCC7, 27927 - 19968: 0xE1A9, 27929 - 19968: 0xE2AA, 27931 - 19968: 0xD5A6, 27934 - 19968: 0xD4D7, 27941 - 19968: 0xF2D0, 27943 - 19968: 0xEAFB, 27945 - 19968: 0xE0DD, 27946 - 19968: 0xFBF3, 27954 - 19968: 0xF1BD, 27957 - 19968: 0xE2E7, 27958 - 19968: 0xFDD7, 27960 - 19968: 0xCEC8, 27961 - 19968: 0xEAB7, 27963 - 19968: 0xFCC0, 27965 - 19968: 0xFDE7, 27966 - 19968: 0xF7EF, 27969 - 19968: 0xD7B5, 27993 - 19968: 0xEFBA, 27994 - 19968: 0xF1DD, 27996 - 19968: 0xDEB3, 28003 - 19968: 0xE8CB, 28006 - 19968: 0xF8DD, 28009 - 19968: 0xFBC7, 28010 - 19968: 0xD5C8, 28012 - 19968: 0xD7DF, 28014 - 19968: 0xDDA9, 28020 - 19968: 0xE9B1, 28023 - 19968: 0xFAAD, 28024 - 19968: 0xF6D9, 28025 - 19968: 0xFAF4, 28031 - 19968: 0xF8AA, 28037 - 19968: 0xE6EE, 28039 - 19968: 0xCCDC, 28040 - 19968: 0xE1BC, 28041 - 19968: 0xE0EF, 28044 - 19968: 0xE9BF, 28045 - 19968: 0xFCFD, 28046 - 19968: 0xE6CE, 28049 - 19968: 0xE1D7, 28051 - 19968: 0xE6CF, 28053 - 19968: 0xF4F1, 28079 - 19968: 0xE4F3, 28082 - 19968: 0xE4FB, 28085 - 19968: 0xF9E4, 28096 - 19968: 0xEFE3, 28099 - 19968: 0xCFEE, 28100 - 19968: 0xF6BE, 28101 - 19968: 0xE0B2, 28102 - 19968: 0xFCFE, 28103 - 19968: 0xD1AB, 28107 - 19968: 0xD7FA, 28111 - 19968: 0xFBC8, 28113 - 19968: 0xE2D7, 28120 - 19968: 0xD4A3, 28121 - 19968: 0xF0F8, 28122 - 19968: 0xD7A8, 28126 - 19968: 0xE1E7, 28129 - 19968: 0xD3BF, 28136 - 19968: 0xEFE4, 28138 - 19968: 0xD7C5, 28139 - 19968: 0xEBE2, 28142 - 19968: 0xFCE7, 28145 - 19968: 0xE4A2, 28147 - 19968: 0xE2E8, 28149 - 19968: 0xE6D0, 28151 - 19968: 0xFBE8, 28152 - 19968: 0xF4E8, 28153 - 19968: 0xE5F4, 28154 - 19968: 0xF4BC, 28155 - 19968: 0xF4D5, 28183 - 19968: 0xDFB6, 28185 - 19968: 0xFCB9, 28186 - 19968: 0xEEC2, 28187 - 19968: 0xCAF5, 28191 - 19968: 0xEFE5, 28192 - 19968: 0xCBE2, 28193 - 19968: 0xD4A4, 28195 - 19968: 0xDEE0, 28196 - 19968: 0xDAFD, 28197 - 19968: 0xE4C6, 28198 - 19968: 0xE8BE, 28203 - 19968: 0xE0DE, 28204 - 19968: 0xF6B4, 28205 - 19968: 0xEAD2, 28207 - 19968: 0xF9FB, 28210 - 19968: 0xE0C2, 28212 - 19968: 0xCAE4, 28214 - 19968: 0xE7B7, 28216 - 19968: 0xEAFD, 28218 - 19968: 0xD9DD, 28220 - 19968: 0xDAB4, 28221 - 19968: 0xEEAA, 28222 - 19968: 0xFBE9, 28227 - 19968: 0xDBCB, 28228 - 19968: 0xDAB5, 28234 - 19968: 0xF1BE, 28237 - 19968: 0xD3AC, 28246 - 19968: 0xFBC9, 28248 - 19968: 0xDFCF, 28251 - 19968: 0xD3C0, 28252 - 19968: 0xE3D7, 28254 - 19968: 0xEFE6, 28255 - 19968: 0xFCD0, 28263 - 19968: 0xE9C0, 28267 - 19968: 0xF5D3, 28270 - 19968: 0xECDC, 28271 - 19968: 0xF7B7, 28274 - 19968: 0xEAB8, 28275 - 19968: 0xD1F9, 28282 - 19968: 0xDCC8, 28304 - 19968: 0xEAB9, 28310 - 19968: 0xF1DE, 28316 - 19968: 0xD7B6, 28317 - 19968: 0xCFB5, 28319 - 19968: 0xD9A8, 28322 - 19968: 0xECEE, 28325 - 19968: 0xDDAA, 28330 - 19968: 0xCDA2, 28331 - 19968: 0xE8AE, 28335 - 19968: 0xE1BD, 28337 - 19968: 0xF2D1, 28342 - 19968: 0xE9C1, 28346 - 19968: 0xD2FC, 28354 - 19968: 0xDBB5, 28356 - 19968: 0xF3E7, 28357 - 19968: 0xD8FE, 28361 - 19968: 0xFCD1, 28363 - 19968: 0xEDB2, 28364 - 19968: 0xF4AF, 28366 - 19968: 0xFBA3, 28369 - 19968: 0xFCC1, 28371 - 19968: 0xEEAB, 28372 - 19968: 0xD4A5, 28399 - 19968: 0xF4F2, 28404 - 19968: 0xEED9, 28408 - 19968: 0xFBCA, 28414 - 19968: 0xCDE3, 28415 - 19968: 0xD8BB, 28417 - 19968: 0xE5DB, 28418 - 19968: 0xF8F7, 28422 - 19968: 0xF6D4, 28431 - 19968: 0xD7A9, 28433 - 19968: 0xCBC9, 28436 - 19968: 0xE6D1, 28437 - 19968: 0xF0CC, 28448 - 19968: 0xD8AE, 28450 - 19968: 0xF9D3, 28451 - 19968: 0xD5FE, 28459 - 19968: 0xD8BC, 28460 - 19968: 0xF2B0, 28465 - 19968: 0xE2AB, 28466 - 19968: 0xF3E8, 28472 - 19968: 0xEFC2, 28479 - 19968: 0xEDEC, 28481 - 19968: 0xE7B8, 28497 - 19968: 0xDAFE, 28500 - 19968: 0xCCBE, 28503 - 19968: 0xF2FC, 28504 - 19968: 0xDAEB, 28506 - 19968: 0xE2D8, 28507 - 19968: 0xEDD6, 28510 - 19968: 0xD6D1, 28511 - 19968: 0xE0B3, 28514 - 19968: 0xFCD2, 28516 - 19968: 0xEBC8, 28525 - 19968: 0xD3C1, 28526 - 19968: 0xF0CD, 28528 - 19968: 0xCFF7, 28538 - 19968: 0xEDD2, 28540 - 19968: 0xD4D8, 28541 - 19968: 0xDCC9, 28542 - 19968: 0xD7F1, 28545 - 19968: 0xDFBB, 28548 - 19968: 0xF3A5, 28552 - 19968: 0xF4CD, 28557 - 19968: 0xF1BF, 28558 - 19968: 0xF8B1, 28560 - 19968: 0xE9FA, 28564 - 19968: 0xFBCB, 28567 - 19968: 0xCAD5, 28579 - 19968: 0xF9D4, 28580 - 19968: 0xF7CA, 28583 - 19968: 0xD6C8, 28590 - 19968: 0xFCE8, 28591 - 19968: 0xF3BD, 28593 - 19968: 0xEEFE, 28595 - 19968: 0xE7FE, 28601 - 19968: 0xD3C2, 28606 - 19968: 0xD3B6, 28608 - 19968: 0xCCAD, 28609 - 19968: 0xF6FA, 28610 - 19968: 0xD6B2, 28611 - 19968: 0xD2D8, 28618 - 19968: 0xE7D8, 28629 - 19968: 0xE3A5, 28634 - 19968: 0xE7B9, 28639 - 19968: 0xF0AD, 28640 - 19968: 0xFBCC, 28641 - 19968: 0xEBA1, 28644 - 19968: 0xD4A6, 28649 - 19968: 0xFBCD, 28651 - 19968: 0xD5BD, 28652 - 19968: 0xF1DF, 28655 - 19968: 0xF6FB, 28657 - 19968: 0xDEB4, 28670 - 19968: 0xD5EB, 28673 - 19968: 0xE5C8, 28677 - 19968: 0xFBA4, 28678 - 19968: 0xD4B9, 28681 - 19968: 0xDEE1, 28683 - 19968: 0xE4A3, 28687 - 19968: 0xD7B7, 28689 - 19968: 0xF8EE, 28693 - 19968: 0xDEB5, 28696 - 19968: 0xD6D2, 28698 - 19968: 0xF9D5, 28699 - 19968: 0xE7BA, 28700 - 19968: 0xEBD5, 28701 - 19968: 0xD5F7, 28702 - 19968: 0xEFE7, 28703 - 19968: 0xE1BE, 28707 - 19968: 0xFAAE, 28711 - 19968: 0xD6E9, 28712 - 19968: 0xD6EE, 28719 - 19968: 0xE7BB, 28727 - 19968: 0xECCB, 28734 - 19968: 0xD5B3, 28748 - 19968: 0xCEB4, 28752 - 19968: 0xFBA5, 28753 - 19968: 0xE1EE, 28760 - 19968: 0xF7A8, 28765 - 19968: 0xFBCE, 28771 - 19968: 0xD8BD, 28779 - 19968: 0xFBFD, 28784 - 19968: 0xFCE9, 28792 - 19968: 0xCFB6, 28796 - 19968: 0xEDC7, 28797 - 19968: 0xEEAC, 28805 - 19968: 0xCCDD, 28810 - 19968: 0xF6A7, 28814 - 19968: 0xE6FA, 28818 - 19968: 0xF5A4, 28824 - 19968: 0xFDDC, 28825 - 19968: 0xEDB3, 28826 - 19968: 0xCEC9, 28833 - 19968: 0xEFE8, 28836 - 19968: 0xE1BF, 28843 - 19968: 0xFADB, 28844 - 19968: 0xCBE3, 28845 - 19968: 0xF7A9, 28847 - 19968: 0xFBA6, 28851 - 19968: 0xDCB9, 28855 - 19968: 0xF1C0, 28856 - 19968: 0xEDC8, 28857 - 19968: 0xEFC3, 28872 - 19968: 0xD6AD, 28875 - 19968: 0xFDCE, 28879 - 19968: 0xE8A1, 28888 - 19968: 0xFBF4, 28889 - 19968: 0xD5A7, 28893 - 19968: 0xF1F6, 28895 - 19968: 0xE6D3, 28913 - 19968: 0xCCDE, 28921 - 19968: 0xF8B2, 28925 - 19968: 0xDCEB, 28932 - 19968: 0xFDB6, 28937 - 19968: 0xE5EA, 28940 - 19968: 0xF1E0, 28953 - 19968: 0xDBCC, 28954 - 19968: 0xDDCD, 28958 - 19968: 0xD4C8, 28961 - 19968: 0xD9ED, 28966 - 19968: 0xF5A5, 28976 - 19968: 0xE6FB, 28982 - 19968: 0xE6D4, 28999 - 19968: 0xFDC8, 29001 - 19968: 0xD6A1, 29002 - 19968: 0xFDBF, 29004 - 19968: 0xFCD3, 29006 - 19968: 0xEFA1, 29008 - 19968: 0xE7BC, 29014 - 19968: 0xD1EE, 29017 - 19968: 0xE6D5, 29020 - 19968: 0xE9F2, 29022 - 19968: 0xDFB0, 29028 - 19968: 0xD8E0, 29029 - 19968: 0xFCBA, 29030 - 19968: 0xFDAF, 29031 - 19968: 0xF0CE, 29033 - 19968: 0xDBE1, 29036 - 19968: 0xE5C9, 29038 - 19968: 0xEDB4, 29053 - 19968: 0xE0C3, 29060 - 19968: 0xE3D8, 29065 - 19968: 0xE9FB, 29066 - 19968: 0xEAA8, 29071 - 19968: 0xFDB7, 29074 - 19968: 0xFBA7, 29076 - 19968: 0xE9C2, 29081 - 19968: 0xFDF7, 29087 - 19968: 0xE2D9, 29090 - 19968: 0xDCEC, 29100 - 19968: 0xE8A2, 29105 - 19968: 0xE6F0, 29113 - 19968: 0xFDF8, 29114 - 19968: 0xFDF9, 29118 - 19968: 0xF6BF, 29121 - 19968: 0xE7A7, 29123 - 19968: 0xE6D7, 29128 - 19968: 0xD4F3, 29129 - 19968: 0xD4C9, 29134 - 19968: 0xD6FA, 29136 - 19968: 0xD7F2, 29138 - 19968: 0xE1C0, 29140 - 19968: 0xDBE2, 29141 - 19968: 0xE6D8, 29151 - 19968: 0xE7BD, 29157 - 19968: 0xF0CF, 29158 - 19968: 0xF3BE, 29159 - 19968: 0xE2AC, 29165 - 19968: 0xF5B7, 29166 - 19968: 0xE0F0, 29179 - 19968: 0xFDB8, 29180 - 19968: 0xE3E8, 29182 - 19968: 0xD4A7, 29183 - 19968: 0xE8FC, 29184 - 19968: 0xFAD2, 29190 - 19968: 0xF8EF, 29200 - 19968: 0xD6D3, 29211 - 19968: 0xD5B4, 29226 - 19968: 0xF0D0, 29228 - 19968: 0xF7F0, 29229 - 19968: 0xEEB3, 29232 - 19968: 0xEABA, 29234 - 19968: 0xEAD3, 29237 - 19968: 0xEDC9, 29238 - 19968: 0xDDAB, 29242 - 19968: 0xE5AC, 29243 - 19968: 0xFDA1, 29245 - 19968: 0xDFD0, 29246 - 19968: 0xECB3, 29248 - 19968: 0xDFD1, 29254 - 19968: 0xEDED, 29255 - 19968: 0xF8B8, 29256 - 19968: 0xF7FA, 29260 - 19968: 0xF8AB, 29266 - 19968: 0xF4E0, 29272 - 19968: 0xD4BA, 29273 - 19968: 0xE4B3, 29275 - 19968: 0xE9DA, 29277 - 19968: 0xDEB6, 29279 - 19968: 0xD9BF, 29281 - 19968: 0xD9C0, 29282 - 19968: 0xD6EF, 29287 - 19968: 0xD9CC, 29289 - 19968: 0xDAAA, 29298 - 19968: 0xDFE5, 29305 - 19968: 0xF7E5, 29309 - 19968: 0xCCB2, 29312 - 19968: 0xDFF9, 29313 - 19968: 0xD7E0, 29346 - 19968: 0xD4BB, 29351 - 19968: 0xFDFA, 29356 - 19968: 0xCCB3, 29359 - 19968: 0xDBF3, 29376 - 19968: 0xDFD2, 29378 - 19968: 0xCECA, 29380 - 19968: 0xEEDA, 29390 - 19968: 0xE4E4, 29392 - 19968: 0xFBCF, 29399 - 19968: 0xCFB7, 29401 - 19968: 0xEEC3, 29409 - 19968: 0xCEEA, 29417 - 19968: 0xE2AD, 29432 - 19968: 0xD7E1, 29433 - 19968: 0xFAF5, 29436 - 19968: 0xD5C9, 29437 - 19968: 0xF8AC, 29450 - 19968: 0xE7D9, 29462 - 19968: 0xF3E9, 29467 - 19968: 0xD8ED, 29468 - 19968: 0xE3C4, 29469 - 19968: 0xF0F1, 29477 - 19968: 0xE8E5, 29481 - 19968: 0xE0FA, 29482 - 19968: 0xEEC4, 29483 - 19968: 0xD9DE, 29494 - 19968: 0xEBA2, 29495 - 19968: 0xEBA3, 29502 - 19968: 0xFCC2, 29503 - 19968: 0xEABB, 29508 - 19968: 0xE8AB, 29509 - 19968: 0xDEE2, 29520 - 19968: 0xEDEF, 29522 - 19968: 0xE8A3, 29527 - 19968: 0xCFF1, 29544 - 19968: 0xD4BC, 29546 - 19968: 0xFCEA, 29552 - 19968: 0xE7BE, 29554 - 19968: 0xFCF2, 29557 - 19968: 0xD6B4, 29560 - 19968: 0xE2AE, 29562 - 19968: 0xD3B7, 29563 - 19968: 0xFACC, 29572 - 19968: 0xFADC, 29574 - 19968: 0xEDB5, 29575 - 19968: 0xE1E3, 29577 - 19968: 0xE8AC, 29579 - 19968: 0xE8DD, 29582 - 19968: 0xEFE9, 29588 - 19968: 0xF4BD, 29590 - 19968: 0xCFB8, 29591 - 19968: 0xE9DB, 29592 - 19968: 0xD1AC, 29599 - 19968: 0xDAC7, 29607 - 19968: 0xEBC9, 29609 - 19968: 0xE8CC, 29613 - 19968: 0xDEB7, 29618 - 19968: 0xD6BC, 29619 - 19968: 0xD3E5, 29625 - 19968: 0xFADD, 29632 - 19968: 0xDAD6, 29634 - 19968: 0xCAB1, 29641 - 19968: 0xDAC8, 29642 - 19968: 0xDFA6, 29644 - 19968: 0xF9B3, 29645 - 19968: 0xF2D2, 29647 - 19968: 0xCAC4, 29654 - 19968: 0xCECB, 29657 - 19968: 0xCDF5, 29661 - 19968: 0xFDB0, 29662 - 19968: 0xD5A8, 29664 - 19968: 0xF1C1, 29667 - 19968: 0xE2E9, 29668 - 19968: 0xDCCA, 29669 - 19968: 0xECB4, 29670 - 19968: 0xFAC0, 29673 - 19968: 0xFBA8, 29674 - 19968: 0xD0A8, 29677 - 19968: 0xDAEC, 29687 - 19968: 0xD9EE, 29689 - 19968: 0xE0FB, 29693 - 19968: 0xEFEA, 29694 - 19968: 0xFADE, 29697 - 19968: 0xE0C4, 29699 - 19968: 0xCFB9, 29701 - 19968: 0xD5CA, 29702 - 19968: 0xD7E2, 29703 - 19968: 0xE2AF, 29705 - 19968: 0xD7B8, 29715 - 19968: 0xE8CD, 29723 - 19968: 0xF6DA, 29728 - 19968: 0xEFA2, 29729 - 19968: 0xE2DA, 29730 - 19968: 0xF6FC, 29733 - 19968: 0xFBD0, 29734 - 19968: 0xD1AD, 29736 - 19968: 0xCDE4, 29738 - 19968: 0xD1AE, 29739 - 19968: 0xDCED, 29740 - 19968: 0xE8CE, 29742 - 19968: 0xF0F9, 29743 - 19968: 0xCEB5, 29744 - 19968: 0xE6FC, 29747 - 19968: 0xD7FB, 29748 - 19968: 0xD0D6, 29749 - 19968: 0xDDF5, 29750 - 19968: 0xF7F1, 29752 - 19968: 0xF6FD, 29754 - 19968: 0xDBF7, 29759 - 19968: 0xFBEA, 29760 - 19968: 0xE9DC, 29761 - 19968: 0xD9C1, 29763 - 19968: 0xF5F2, 29764 - 19968: 0xE0C5, 29771 - 19968: 0xEAD4, 29781 - 19968: 0xF9C2, 29783 - 19968: 0xEABC, 29785 - 19968: 0xD2C5, 29786 - 19968: 0xFBD1, 29787 - 19968: 0xE7C0, 29788 - 19968: 0xEBA5, 29790 - 19968: 0xDFFA, 29791 - 19968: 0xE3A2, 29792 - 19968: 0xD7B9, 29794 - 19968: 0xE9C3, 29796 - 19968: 0xE8FD, 29797 - 19968: 0xE8AF, 29800 - 19968: 0xF2D3, 29801 - 19968: 0xFBA9, 29802 - 19968: 0xD8A5, 29807 - 19968: 0xD5CB, 29822 - 19968: 0xD0C8, 29826 - 19968: 0xD1AF, 29827 - 19968: 0xD7E3, 29831 - 19968: 0xE0C6, 29833 - 19968: 0xD6A2, 29835 - 19968: 0xEDF0, 29848 - 19968: 0xD7F3, 29852 - 19968: 0xFCD4, 29854 - 19968: 0xDAD7, 29855 - 19968: 0xCCDF, 29857 - 19968: 0xF2D4, 29859 - 19968: 0xD1B0, 29861 - 19968: 0xCCE0, 29863 - 19968: 0xDBFD, 29864 - 19968: 0xF3BF, 29866 - 19968: 0xF0D1, 29872 - 19968: 0xFCBB, 29874 - 19968: 0xE2B0, 29877 - 19968: 0xE6A5, 29881 - 19968: 0xE2DB, 29885 - 19968: 0xDFDE, 29887 - 19968: 0xE0C7, 29894 - 19968: 0xF2EF, 29898 - 19968: 0xCCE1, 29903 - 19968: 0xD6EA, 29908 - 19968: 0xE7C2, 29912 - 19968: 0xCEB6, 29914 - 19968: 0xF3C0, 29916 - 19968: 0xCDFE, 29920 - 19968: 0xFBD2, 29922 - 19968: 0xF8F8, 29923 - 19968: 0xF7FB, 29926 - 19968: 0xE8BF, 29934 - 19968: 0xE8B7, 29943 - 19968: 0xEDB6, 29953 - 19968: 0xDCBA, 29956 - 19968: 0xCCB4, 29969 - 19968: 0xF1F7, 29973 - 19968: 0xE8B8, 29976 - 19968: 0xCAF6, 29978 - 19968: 0xE4A4, 29979 - 19968: 0xF4D6, 29983 - 19968: 0xDFE6, 29987 - 19968: 0xDFA7, 29989 - 19968: 0xDFE7, 29990 - 19968: 0xE1C1, 29992 - 19968: 0xE9C4, 29995 - 19968: 0xDCCB, 29996 - 19968: 0xE9C5, 30000 - 19968: 0xEFA3, 30001 - 19968: 0xEBA6, 30002 - 19968: 0xCBA3, 30003 - 19968: 0xE3E9, 30007 - 19968: 0xD1FB, 30008 - 19968: 0xEFA4, 30010 - 19968: 0xEFEB, 30023 - 19968: 0xD0B4, 30028 - 19968: 0xCDA3, 30031 - 19968: 0xE8E6, 30033 - 19968: 0xEFA5, 30035 - 19968: 0xD3CC, 30036 - 19968: 0xDAED, 30041 - 19968: 0xD7BA, 30043 - 19968: 0xF2D5, 30044 - 19968: 0xF5E5, 30045 - 19968: 0xD9EF, 30050 - 19968: 0xF9B4, 30053 - 19968: 0xD5D4, 30054 - 19968: 0xFDCF, 30058 - 19968: 0xDBE3, 30063 - 19968: 0xF1E1, 30064 - 19968: 0xECB6, 30069 - 19968: 0xFBFE, 30070 - 19968: 0xD3D7, 30072 - 19968: 0xD1B1, 30074 - 19968: 0xCBB1, 30079 - 19968: 0xD1B2, 30086 - 19968: 0xCBB2, 30087 - 19968: 0xF1C2, 30090 - 19968: 0xF4E1, 30091 - 19968: 0xF9B5, 30094 - 19968: 0xE1C3, 30095 - 19968: 0xE1C2, 30097 - 19968: 0xEBF7, 30109 - 19968: 0xDFA8, 30117 - 19968: 0xCBCA, 30123 - 19968: 0xE6B9, 30129 - 19968: 0xF8DE, 30130 - 19968: 0xF9AA, 30131 - 19968: 0xCAF7, 30133 - 19968: 0xEDB7, 30136 - 19968: 0xD3B8, 30137 - 19968: 0xF2D6, 30140 - 19968: 0xD4D9, 30141 - 19968: 0xEEC5, 30142 - 19968: 0xF2F0, 30146 - 19968: 0xCAB2, 30149 - 19968: 0xDCBB, 30151 - 19968: 0xF1F8, 30157 - 19968: 0xECB7, 30162 - 19968: 0xE5CA, 30164 - 19968: 0xF6C0, 30165 - 19968: 0xFDDD, 30168 - 19968: 0xD4E3, 30169 - 19968: 0xCCE2, 30171 - 19968: 0xF7D4, 30178 - 19968: 0xD7E5, 30192 - 19968: 0xD3C3, 30194 - 19968: 0xD8A6, 30196 - 19968: 0xF6C1, 30202 - 19968: 0xDDF6, 30204 - 19968: 0xCDC0, 30208 - 19968: 0xE5DC, 30221 - 19968: 0xE5CB, 30233 - 19968: 0xE1C4, 30239 - 19968: 0xE8B0, 30240 - 19968: 0xF4B0, 30241 - 19968: 0xF3EA, 30242 - 19968: 0xDAEE, 30244 - 19968: 0xD7BB, 30246 - 19968: 0xE2B1, 30267 - 19968: 0xD7AA, 30274 - 19968: 0xD6FB, 30284 - 19968: 0xE4DF, 30286 - 19968: 0xCAD6, 30290 - 19968: 0xEBA8, 30294 - 19968: 0xDBFE, 30305 - 19968: 0xF6C2, 30308 - 19968: 0xEFBB, 30313 - 19968: 0xD4FD, 30316 - 19968: 0xE0C8, 30320 - 19968: 0xE8B9, 30322 - 19968: 0xEFA6, 30328 - 19968: 0xCDA4, 30331 - 19968: 0xD4F4, 30332 - 19968: 0xDBA1, 30333 - 19968: 0xDBDC, 30334 - 19968: 0xDBDD, 30340 - 19968: 0xEEDC, 30342 - 19968: 0xCBCB, 30343 - 19968: 0xFCD5, 30350 - 19968: 0xCEEB, 30352 - 19968: 0xCDC1, 30355 - 19968: 0xFBD3, 30382 - 19968: 0xF9AB, 30394 - 19968: 0xF5D4, 30399 - 19968: 0xD9A9, 30402 - 19968: 0xE9DD, 30403 - 19968: 0xDBCD, 30406 - 19968: 0xDDCE, 30408 - 19968: 0xE7C3, 30410 - 19968: 0xECCC, 30418 - 19968: 0xF9EC, 30422 - 19968: 0xCBCC, 30427 - 19968: 0xE0FC, 30428 - 19968: 0xD4A8, 30430 - 19968: 0xEDD3, 30431 - 19968: 0xD8EF, 30433 - 19968: 0xF2D7, 30435 - 19968: 0xCAF8, 30436 - 19968: 0xDAEF, 30439 - 19968: 0xD6D4, 30446 - 19968: 0xD9CD, 30450 - 19968: 0xD8EE, 30452 - 19968: 0xF2C1, 30456 - 19968: 0xDFD3, 30460 - 19968: 0xDAF0, 30462 - 19968: 0xE2EA, 30465 - 19968: 0xE0FD, 30468 - 19968: 0xD8F8, 30472 - 19968: 0xF7AF, 30473 - 19968: 0xDAB6, 30475 - 19968: 0xCAD7, 30494 - 19968: 0xF2D8, 30496 - 19968: 0xD8F9, 30505 - 19968: 0xFADF, 30519 - 19968: 0xCFEF, 30520 - 19968: 0xD9C2, 30522 - 19968: 0xF0D2, 30524 - 19968: 0xE4D1, 30528 - 19968: 0xF3B7, 30541 - 19968: 0xFAE0, 30555 - 19968: 0xEFEC, 30561 - 19968: 0xE2B2, 30563 - 19968: 0xD4BD, 30566 - 19968: 0xD9CE, 30571 - 19968: 0xF4E2, 30585 - 19968: 0xD4A9, 30590 - 19968: 0xCDC2, 30591 - 19968: 0xE7DA, 30603 - 19968: 0xF2D9, 30609 - 19968: 0xD9AA, 30622 - 19968: 0xD8BE, 30629 - 19968: 0xDCAD, 30636 - 19968: 0xE2EB, 30637 - 19968: 0xD6FC, 30640 - 19968: 0xCAF9, 30643 - 19968: 0xD4DA, 30651 - 19968: 0xF4D7, 30652 - 19968: 0xCCA1, 30655 - 19968: 0xCFBA, 30679 - 19968: 0xF5B8, 30683 - 19968: 0xD9C3, 30684 - 19968: 0xD0E8, 30690 - 19968: 0xE3C5, 30691 - 19968: 0xEBF8, 30693 - 19968: 0xF2B1, 30697 - 19968: 0xCFBB, 30701 - 19968: 0xD3AD, 30702 - 19968: 0xE8E1, 30703 - 19968: 0xCEEC, 30707 - 19968: 0xE0B4, 30722 - 19968: 0xDEE3, 30738 - 19968: 0xDDF7, 30757 - 19968: 0xF2B2, 30758 - 19968: 0xF3F6, 30759 - 19968: 0xF6DB, 30764 - 19968: 0xD7FE, 30770 - 19968: 0xF8DF, 30772 - 19968: 0xF7F2, 30789 - 19968: 0xD0A9, 30799 - 19968: 0xE6DA, 30813 - 19968: 0xF5A6, 30827 - 19968: 0xD7BC, 30828 - 19968: 0xCCE3, 30831 - 19968: 0xE6DB, 30844 - 19968: 0xDDDD, 30849 - 19968: 0xD1B3, 30855 - 19968: 0xEFED, 30860 - 19968: 0xD6DE, 30861 - 19968: 0xE4F4, 30862 - 19968: 0xE1EF, 30865 - 19968: 0xDDF8, 30871 - 19968: 0xE8CF, 30883 - 19968: 0xCAE5, 30887 - 19968: 0xDCA1, 30889 - 19968: 0xE0B5, 30906 - 19968: 0xFCAC, 30907 - 19968: 0xFCAD, 30908 - 19968: 0xD8A7, 30913 - 19968: 0xEDB8, 30917 - 19968: 0xDBB6, 30922 - 19968: 0xD6F0, 30923 - 19968: 0xF3AF, 30926 - 19968: 0xCDA5, 30928 - 19968: 0xDAF1, 30952 - 19968: 0xD8A8, 30956 - 19968: 0xCCE4, 30959 - 19968: 0xD1B4, 30965 - 19968: 0xCAD8, 30971 - 19968: 0xDAF2, 30977 - 19968: 0xF5A7, 30990 - 19968: 0xF5A8, 30998 - 19968: 0xE6A6, 31018 - 19968: 0xD5EC, 31019 - 19968: 0xD5F8, 31020 - 19968: 0xDAF3, 31034 - 19968: 0xE3C6, 31038 - 19968: 0xDEE4, 31040 - 19968: 0xDEE5, 31041 - 19968: 0xD1B5, 31047 - 19968: 0xD1B6, 31048 - 19968: 0xD1B7, 31049 - 19968: 0xF2B3, 31056 - 19968: 0xE9DE, 31062 - 19968: 0xF0D3, 31063 - 19968: 0xF2B4, 31066 - 19968: 0xF0D4, 31067 - 19968: 0xCBE4, 31068 - 19968: 0xFBD4, 31069 - 19968: 0xF5E6, 31070 - 19968: 0xE3EA, 31072 - 19968: 0xDEE6, 31077 - 19968: 0xDFD4, 31080 - 19968: 0xF8F9, 31085 - 19968: 0xF0AE, 31098 - 19968: 0xD1B8, 31103 - 19968: 0xD6DF, 31105 - 19968: 0xD0D7, 31117 - 19968: 0xFCA1, 31118 - 19968: 0xEFEE, 31119 - 19968: 0xDCD8, 31121 - 19968: 0xE9DF, 31142 - 19968: 0xE5DD, 31143 - 19968: 0xFDFB, 31146 - 19968: 0xE0C9, 31150 - 19968: 0xD6C9, 31153 - 19968: 0xD4AA, 31155 - 19968: 0xE5CC, 31161 - 19968: 0xE9E0, 31165 - 19968: 0xD0D8, 31166 - 19968: 0xFCA2, 31167 - 19968: 0xD4BE, 31168 - 19968: 0xE2B3, 31169 - 19968: 0xDEE7, 31177 - 19968: 0xDCBC, 31178 - 19968: 0xD2B6, 31179 - 19968: 0xF5D5, 31185 - 19968: 0xCEA1, 31186 - 19968: 0xF5A9, 31189 - 19968: 0xDDF9, 31192 - 19968: 0xDDFA, 31199 - 19968: 0xF0D5, 31204 - 19968: 0xF6DF, 31206 - 19968: 0xF2DA, 31207 - 19968: 0xE4EB, 31209 - 19968: 0xF2F1, 31227 - 19968: 0xECB9, 31232 - 19968: 0xFDFC, 31237 - 19968: 0xE1AA, 31240 - 19968: 0xCAD9, 31243 - 19968: 0xEFEF, 31245 - 19968: 0xF5AA, 31252 - 19968: 0xECF9, 31255 - 19968: 0xF8AD, 31257 - 19968: 0xF2C2, 31258 - 19968: 0xF6C3, 31260 - 19968: 0xD7D2, 31263 - 19968: 0xF9A2, 31264 - 19968: 0xF0D6, 31278 - 19968: 0xF0FA, 31281 - 19968: 0xF6E0, 31286 - 19968: 0xE9F3, 31287 - 19968: 0xF2C3, 31291 - 19968: 0xD4AB, 31292 - 19968: 0xCAB3, 31293 - 19968: 0xCDA6, 31295 - 19968: 0xCDC3, 31296 - 19968: 0xCDDA, 31302 - 19968: 0xD9CF, 31305 - 19968: 0xF6C4, 31309 - 19968: 0xEEDD, 31310 - 19968: 0xE7C4, 31319 - 19968: 0xE2B4, 31329 - 19968: 0xDFE2, 31330 - 19968: 0xE7DB, 31337 - 19968: 0xE8B1, 31339 - 19968: 0xFCAE, 31344 - 19968: 0xE5CD, 31348 - 19968: 0xFAEB, 31350 - 19968: 0xCFBC, 31353 - 19968: 0xCFE2, 31354 - 19968: 0xCDF6, 31357 - 19968: 0xEFF0, 31359 - 19968: 0xF4BE, 31361 - 19968: 0xD4CD, 31364 - 19968: 0xF3B8, 31368 - 19968: 0xE9A1, 31378 - 19968: 0xF2F2, 31379 - 19968: 0xF3EB, 31381 - 19968: 0xF0D7, 31384 - 19968: 0xCFD7, 31391 - 19968: 0xCFDF, 31401 - 19968: 0xE8C0, 31402 - 19968: 0xE8C1, 31406 - 19968: 0xCFE3, 31407 - 19968: 0xE9A2, 31418 - 19968: 0xD0AA, 31428 - 19968: 0xF3C1, 31429 - 19968: 0xD0AB, 31431 - 19968: 0xD4E4, 31434 - 19968: 0xEFBC, 31435 - 19968: 0xD8A1, 31447 - 19968: 0xD9DF, 31449 - 19968: 0xF3D7, 31453 - 19968: 0xDCBD, 31455 - 19968: 0xCCE5, 31456 - 19968: 0xEDF1, 31459 - 19968: 0xF1E2, 31461 - 19968: 0xD4DB, 31466 - 19968: 0xE2B5, 31469 - 19968: 0xCAE6, 31471 - 19968: 0xD3AE, 31478 - 19968: 0xCCE6, 31481 - 19968: 0xF1D3, 31482 - 19968: 0xF5E7, 31487 - 19968: 0xCADA, 31503 - 19968: 0xFBEE, 31505 - 19968: 0xE1C5, 31513 - 19968: 0xDFE9, 31515 - 19968: 0xEEDE, 31518 - 19968: 0xF7C2, 31520 - 19968: 0xD8A2, 31526 - 19968: 0xDDAC, 31532 - 19968: 0xF0AF, 31533 - 19968: 0xD6BD, 31545 - 19968: 0xE1AB, 31558 - 19968: 0xF9B6, 31561 - 19968: 0xD4F5, 31563 - 19968: 0xD0C9, 31564 - 19968: 0xEFA7, 31565 - 19968: 0xE2EC, 31567 - 19968: 0xDBEA, 31568 - 19968: 0xCECC, 31569 - 19968: 0xF5E8, 31570 - 19968: 0xF7D5, 31572 - 19968: 0xD3CD, 31574 - 19968: 0xF3FE, 31584 - 19968: 0xD0B5, 31596 - 19968: 0xE0FE, 31598 - 19968: 0xDFFB, 31605 - 19968: 0xE6DD, 31613 - 19968: 0xE8A4, 31623 - 19968: 0xCBCD, 31627 - 19968: 0xEFA8, 31631 - 19968: 0xEEB4, 31636 - 19968: 0xDAD8, 31637 - 19968: 0xD1B9, 31639 - 19968: 0xDFA9, 31642 - 19968: 0xF3B0, 31645 - 19968: 0xCCC4, 31649 - 19968: 0xCEB7, 31661 - 19968: 0xEFA9, 31665 - 19968: 0xDFD5, 31668 - 19968: 0xEDD7, 31672 - 19968: 0xEEC6, 31680 - 19968: 0xEFBD, 31681 - 19968: 0xFCD6, 31684 - 19968: 0xDBF4, 31686 - 19968: 0xEFAA, 31687 - 19968: 0xF8B9, 31689 - 19968: 0xF5E9, 31698 - 19968: 0xE3D9, 31712 - 19968: 0xE1C6, 31716 - 19968: 0xD4BF, 31721 - 19968: 0xDEE8, 31751 - 19968: 0xF0EA, 31762 - 19968: 0xF3C2, 31774 - 19968: 0xD3AF, 31777 - 19968: 0xCADB, 31783 - 19968: 0xFCD7, 31786 - 19968: 0xEDD8, 31787 - 19968: 0xE1C7, 31805 - 19968: 0xF4D8, 31806 - 19968: 0xD6B3, 31807 - 19968: 0xDDAD, 31811 - 19968: 0xD5BE, 31820 - 19968: 0xF1C3, 31821 - 19968: 0xEEDF, 31840 - 19968: 0xD6EB, 31844 - 19968: 0xF4D9, 31852 - 19968: 0xD7E6, 31859 - 19968: 0xDAB7, 31875 - 19968: 0xDDFB, 31881 - 19968: 0xDDCF, 31890 - 19968: 0xD8A3, 31893 - 19968: 0xDAD9, 31895 - 19968: 0xF0D8, 31896 - 19968: 0xEFC4, 31903 - 19968: 0xE1D8, 31909 - 19968: 0xF1D4, 31911 - 19968: 0xEDF2, 31918 - 19968: 0xD5DB, 31921 - 19968: 0xD5DC, 31922 - 19968: 0xF3C4, 31923 - 19968: 0xCBD7, 31929 - 19968: 0xE2B6, 31934 - 19968: 0xEFF1, 31946 - 19968: 0xFBD5, 31958 - 19968: 0xD3D8, 31966 - 19968: 0xDDD0, 31967 - 19968: 0xF0D9, 31968 - 19968: 0xCBB3, 31975 - 19968: 0xD5DD, 31995 - 19968: 0xCDA7, 31998 - 19968: 0xD0AC, 32000 - 19968: 0xD1BA, 32002 - 19968: 0xF1C4, 32004 - 19968: 0xE5B3, 32005 - 19968: 0xFBF5, 32006 - 19968: 0xE9E1, 32007 - 19968: 0xFDE0, 32008 - 19968: 0xFCBC, 32010 - 19968: 0xDAA2, 32011 - 19968: 0xDAA3, 32013 - 19968: 0xD2A1, 32016 - 19968: 0xD2EF, 32020 - 19968: 0xE2ED, 32023 - 19968: 0xDEE9, 32024 - 19968: 0xCEDC, 32025 - 19968: 0xF2B5, 32026 - 19968: 0xD0E4, 32027 - 19968: 0xDDD1, 32032 - 19968: 0xE1C8, 32033 - 19968: 0xDBB7, 32034 - 19968: 0xDFE3, 32043 - 19968: 0xEDB9, 32044 - 19968: 0xF1C5, 32046 - 19968: 0xF3CF, 32047 - 19968: 0xD7AB, 32048 - 19968: 0xE1AC, 32051 - 19968: 0xE3EB, 32053 - 19968: 0xEEC7, 32057 - 19968: 0xE1C9, 32058 - 19968: 0xCAFA, 32066 - 19968: 0xF0FB, 32067 - 19968: 0xFAE1, 32068 - 19968: 0xF0DA, 32069 - 19968: 0xCCE7, 32070 - 19968: 0xDAF4, 32080 - 19968: 0xCCBF, 32094 - 19968: 0xCEED, 32097 - 19968: 0xD5A9, 32098 - 19968: 0xFAE2, 32102 - 19968: 0xD0E5, 32104 - 19968: 0xEBD6, 32106 - 19968: 0xECDF, 32110 - 19968: 0xDFFC, 32113 - 19968: 0xF7D6, 32114 - 19968: 0xDEEA, 32115 - 19968: 0xCBB4, 32118 - 19968: 0xEFBE, 32121 - 19968: 0xCCB5, 32127 - 19968: 0xCFBD, 32142 - 19968: 0xEFF2, 32143 - 19968: 0xE2B7, 32147 - 19968: 0xCCE8, 32156 - 19968: 0xF0FC, 32160 - 19968: 0xD6E0, 32162 - 19968: 0xF1C6, 32172 - 19968: 0xE2B8, 32173 - 19968: 0xEBAB, 32177 - 19968: 0xCBB5, 32178 - 19968: 0xD8D1, 32180 - 19968: 0xF4CE, 32181 - 19968: 0xF3F7, 32184 - 19968: 0xD7C6, 32186 - 19968: 0xD1BB, 32187 - 19968: 0xF7AA, 32189 - 19968: 0xEDCA, 32190 - 19968: 0xD7D3, 32191 - 19968: 0xD8FA, 32199 - 19968: 0xF6C5, 32202 - 19968: 0xD1CC, 32203 - 19968: 0xDDFC, 32214 - 19968: 0xDFFD, 32216 - 19968: 0xF9E5, 32218 - 19968: 0xE0CA, 32221 - 19968: 0xF2FD, 32222 - 19968: 0xD3B0, 32224 - 19968: 0xF4F3, 32225 - 19968: 0xDAC9, 32227 - 19968: 0xE6DE, 32232 - 19968: 0xF8BA, 32233 - 19968: 0xE8D0, 32236 - 19968: 0xD8FB, 32239 - 19968: 0xEAD5, 32244 - 19968: 0xD6A3, 32251 - 19968: 0xF6C6, 32265 - 19968: 0xF2DB, 32266 - 19968: 0xE4FC, 32277 - 19968: 0xE8B2, 32283 - 19968: 0xDADA, 32285 - 19968: 0xF2DC, 32286 - 19968: 0xFBD6, 32287 - 19968: 0xE9B2, 32289 - 19968: 0xEEAD, 32291 - 19968: 0xFAE3, 32299 - 19968: 0xDCEE, 32302 - 19968: 0xF5EA, 32303 - 19968: 0xE6E0, 32305 - 19968: 0xF0FD, 32311 - 19968: 0xD7AC, 32317 - 19968: 0xF5C5, 32318 - 19968: 0xEEE0, 32321 - 19968: 0xDBE5, 32323 - 19968: 0xDDDE, 32326 - 19968: 0xD9F0, 32327 - 19968: 0xE9A3, 32338 - 19968: 0xF1F9, 32340 - 19968: 0xF2C4, 32341 - 19968: 0xE0CB, 32350 - 19968: 0xE9A4, 32353 - 19968: 0xE2B9, 32361 - 19968: 0xE3B1, 32362 - 19968: 0xFCEB, 32363 - 19968: 0xCDA8, 32365 - 19968: 0xCCB6, 32368 - 19968: 0xF0DB, 32377 - 19968: 0xE6BA, 32380 - 19968: 0xCDA9, 32386 - 19968: 0xF3C3, 32396 - 19968: 0xE1D9, 32399 - 19968: 0xEFAB, 32403 - 19968: 0xE7C5, 32406 - 19968: 0xE0E9, 32408 - 19968: 0xF3C5, 32411 - 19968: 0xD4C0, 32412 - 19968: 0xD5BF, 32566 - 19968: 0xDDAE, 32568 - 19968: 0xF9FC, 32570 - 19968: 0xCCC0, 32588 - 19968: 0xE5A2, 32592 - 19968: 0xCEB8, 32596 - 19968: 0xD8D2, 32597 - 19968: 0xF9D6, 32618 - 19968: 0xF1AA, 32619 - 19968: 0xCED1, 32622 - 19968: 0xF6C7, 32624 - 19968: 0xDBEB, 32626 - 19968: 0xDFFE, 32629 - 19968: 0xD8E1, 32631 - 19968: 0xF7F3, 32633 - 19968: 0xD7E7, 32645 - 19968: 0xD4FE, 32648 - 19968: 0xD1BC, 32650 - 19968: 0xE5CF, 32652 - 19968: 0xCBB6, 32654 - 19968: 0xDAB8, 32660 - 19968: 0xCDC4, 32666 - 19968: 0xD6BE, 32670 - 19968: 0xE2BA, 32676 - 19968: 0xCFD8, 32680 - 19968: 0xE0CC, 32681 - 19968: 0xEBF9, 32690 - 19968: 0xFDFD, 32696 - 19968: 0xD7E8, 32697 - 19968: 0xCBD8, 32701 - 19968: 0xE9E2, 32705 - 19968: 0xE8BA, 32709 - 19968: 0xE3C7, 32714 - 19968: 0xECCD, 32716 - 19968: 0xECCE, 32718 - 19968: 0xD6BF, 32722 - 19968: 0xE3A7, 32724 - 19968: 0xDFD6, 32725 - 19968: 0xFDE8, 32735 - 19968: 0xEEE1, 32736 - 19968: 0xF6A8, 32737 - 19968: 0xDDFD, 32745 - 19968: 0xF8BB, 32747 - 19968: 0xE8D1, 32752 - 19968: 0xF9D7, 32761 - 19968: 0xCEEE, 32764 - 19968: 0xECCF, 32768 - 19968: 0xE9A5, 32769 - 19968: 0xD6D5, 32771 - 19968: 0xCDC5, 32773 - 19968: 0xEDBA, 32774 - 19968: 0xD1BD, 32777 - 19968: 0xCFBE, 32780 - 19968: 0xECBB, 32784 - 19968: 0xD2B1, 32789 - 19968: 0xCCE9, 32791 - 19968: 0xD9C4, 32792 - 19968: 0xE9FC, 32813 - 19968: 0xD1BE, 32819 - 19968: 0xECBC, 32822 - 19968: 0xE5AD, 32829 - 19968: 0xF7B0, 32831 - 19968: 0xCCEA, 32835 - 19968: 0xD3C4, 32838 - 19968: 0xD6C0, 32842 - 19968: 0xD6FD, 32854 - 19968: 0xE1A1, 32856 - 19968: 0xDEBD, 32858 - 19968: 0xF6A9, 32862 - 19968: 0xDAA4, 32879 - 19968: 0xD6A4, 32880 - 19968: 0xF5C6, 32882 - 19968: 0xE1A2, 32883 - 19968: 0xE9C6, 32887 - 19968: 0xF2C5, 32893 - 19968: 0xF4E9, 32894 - 19968: 0xD6EC, 32895 - 19968: 0xEBD3, 32900 - 19968: 0xECBD, 32901 - 19968: 0xE2DC, 32902 - 19968: 0xDEEB, 32903 - 19968: 0xF0DC, 32905 - 19968: 0xEBBF, 32907 - 19968: 0xD7CE, 32908 - 19968: 0xD1BF, 32918 - 19968: 0xF5AB, 32923 - 19968: 0xF9FD, 32925 - 19968: 0xCADC, 32929 - 19968: 0xCDC6, 32930 - 19968: 0xF2B6, 32933 - 19968: 0xDDFE, 32937 - 19968: 0xCCB7, 32938 - 19968: 0xDBB8, 32943 - 19968: 0xD0E9, 32945 - 19968: 0xCEDD, 32946 - 19968: 0xEBC0, 32948 - 19968: 0xFDA2, 32954 - 19968: 0xF8CB, 32963 - 19968: 0xEAD6, 32964 - 19968: 0xF1B0, 32972 - 19968: 0xDBCE, 32974 - 19968: 0xF7C3, 32986 - 19968: 0xDBCF, 32987 - 19968: 0xCBA4, 32990 - 19968: 0xF8E0, 32993 - 19968: 0xFBD7, 32996 - 19968: 0xEBCA, 32997 - 19968: 0xE0A1, 33009 - 19968: 0xCECD, 33012 - 19968: 0xD4DC, 33016 - 19968: 0xFDD8, 33021 - 19968: 0xD2F6, 33026 - 19968: 0xF2B7, 33029 - 19968: 0xFAF6, 33030 - 19968: 0xF6AA, 33031 - 19968: 0xFAF7, 33032 - 19968: 0xD8E6, 33034 - 19968: 0xF4B1, 33048 - 19968: 0xE8D2, 33050 - 19968: 0xCAC5, 33051 - 19968: 0xCCEB, 33059 - 19968: 0xE2EE, 33065 - 19968: 0xE2BB, 33067 - 19968: 0xF7AD, 33071 - 19968: 0xF8E1, 33081 - 19968: 0xF3EC, 33086 - 19968: 0xDEA1, 33099 - 19968: 0xE4FD, 33102 - 19968: 0xE3EC, 33104 - 19968: 0xDDAF, 33105 - 19968: 0xDDB0, 33108 - 19968: 0xCBB7, 33109 - 19968: 0xE8D3, 33125 - 19968: 0xE1A3, 33126 - 19968: 0xD2E0, 33131 - 19968: 0xF0FE, 33136 - 19968: 0xE9A6, 33137 - 19968: 0xCBF2, 33144 - 19968: 0xEDF3, 33145 - 19968: 0xDCD9, 33146 - 19968: 0xE0CD, 33151 - 19968: 0xF7DA, 33152 - 19968: 0xDBB9, 33160 - 19968: 0xCCAE, 33162 - 19968: 0xDADB, 33167 - 19968: 0xCDC7, 33178 - 19968: 0xDDB1, 33180 - 19968: 0xD8AF, 33181 - 19968: 0xE3A3, 33184 - 19968: 0xCEEF, 33187 - 19968: 0xF2F3, 33192 - 19968: 0xF8B3, 33203 - 19968: 0xE0CE, 33205 - 19968: 0xF5FD, 33210 - 19968: 0xEBEC, 33213 - 19968: 0xD3C5, 33214 - 19968: 0xFCEC, 33215 - 19968: 0xD2DB, 33216 - 19968: 0xD4EB, 33218 - 19968: 0xDEA2, 33222 - 19968: 0xE5E6, 33229 - 19968: 0xF0B0, 33240 - 19968: 0xD5C4, 33247 - 19968: 0xEDF4, 33251 - 19968: 0xE3ED, 33253 - 19968: 0xE8C2, 33255 - 19968: 0xEDF5, 33256 - 19968: 0xD7FC, 33258 - 19968: 0xEDBB, 33261 - 19968: 0xF6AB, 33267 - 19968: 0xF2B8, 33268 - 19968: 0xF6C8, 33274 - 19968: 0xD3E6, 33275 - 19968: 0xF2DD, 33276 - 19968: 0xCFBF, 33278 - 19968: 0xEBAC, 33285 - 19968: 0xCFC0, 33287 - 19968: 0xE6A8, 33288 - 19968: 0xFDE9, 33290 - 19968: 0xCFC1, 33292 - 19968: 0xE0DF, 33293 - 19968: 0xDEEC, 33298 - 19968: 0xE0A2, 33307 - 19968: 0xF4BF, 33308 - 19968: 0xE2EF, 33310 - 19968: 0xD9F1, 33311 - 19968: 0xF1C7, 33313 - 19968: 0xCBB8, 33322 - 19968: 0xF9FE, 33323 - 19968: 0xDBBA, 33324 - 19968: 0xDAF5, 33333 - 19968: 0xF6EC, 33334 - 19968: 0xDADC, 33335 - 19968: 0xFAE4, 33337 - 19968: 0xE0CF, 33344 - 19968: 0xDDB2, 33349 - 19968: 0xE6A9, 33351 - 19968: 0xEFF3, 33369 - 19968: 0xF3ED, 33380 - 19968: 0xEBFA, 33382 - 19968: 0xF9E6, 33390 - 19968: 0xCADD, 33391 - 19968: 0xD5DE, 33393 - 19968: 0xCADE, 33394 - 19968: 0xDFE4, 33398 - 19968: 0xE6FD, 33400 - 19968: 0xF5AC, 33406 - 19968: 0xE4F5, 33419 - 19968: 0xE9E3, 33421 - 19968: 0xEDCB, 33422 - 19968: 0xCFE4, 33426 - 19968: 0xD8D3, 33433 - 19968: 0xDDB3, 33434 - 19968: 0xD4EC, 33437 - 19968: 0xF2B9, 33439 - 19968: 0xDFB7, 33445 - 19968: 0xCBCE, 33446 - 19968: 0xFBD8, 33449 - 19968: 0xD0D9, 33452 - 19968: 0xDDD2, 33453 - 19968: 0xF7F4, 33454 - 19968: 0xE7DC, 33455 - 19968: 0xE4A5, 33457 - 19968: 0xFCA3, 33459 - 19968: 0xDBBB, 33463 - 19968: 0xF2BA, 33464 - 19968: 0xE9FD, 33465 - 19968: 0xD0CA, 33467 - 19968: 0xF5D6, 33468 - 19968: 0xD9C5, 33469 - 19968: 0xE4B4, 33471 - 19968: 0xEDA7, 33489 - 19968: 0xEABD, 33490 - 19968: 0xE6FE, 33492 - 19968: 0xF7C4, 33493 - 19968: 0xF5AD, 33495 - 19968: 0xD9E0, 33499 - 19968: 0xCAB4, 33502 - 19968: 0xF8E2, 33503 - 19968: 0xCFC2, 33505 - 19968: 0xECBE, 33509 - 19968: 0xE5B4, 33510 - 19968: 0xCDC8, 33511 - 19968: 0xEEC8, 33521 - 19968: 0xE7C8, 33533 - 19968: 0xCDC9, 33534 - 19968: 0xF9B7, 33537 - 19968: 0xF1E8, 33538 - 19968: 0xD9F2, 33539 - 19968: 0xDBF5, 33540 - 19968: 0xCAB5, 33541 - 19968: 0xD9C6, 33545 - 19968: 0xD8C9, 33559 - 19968: 0xD9AB, 33576 - 19968: 0xEDBC, 33579 - 19968: 0xD8D4, 33583 - 19968: 0xDCDA, 33585 - 19968: 0xE2BC, 33588 - 19968: 0xFCED, 33589 - 19968: 0xECE0, 33590 - 19968: 0xD2FE, 33592 - 19968: 0xE9C7, 33593 - 19968: 0xE6AA, 33600 - 19968: 0xE2F0, 33607 - 19968: 0xFABB, 33609 - 19968: 0xF5AE, 33610 - 19968: 0xFBAA, 33615 - 19968: 0xECFB, 33617 - 19968: 0xECBF, 33618 - 19968: 0xFCD8, 33651 - 19968: 0xD4E5, 33655 - 19968: 0xF9C3, 33659 - 19968: 0xEEE2, 33673 - 19968: 0xD7E9, 33674 - 19968: 0xEDF6, 33678 - 19968: 0xDEED, 33686 - 19968: 0xCCEC, 33688 - 19968: 0xE3EE, 33694 - 19968: 0xE8D4, 33698 - 19968: 0xFAF8, 33705 - 19968: 0xDDB4, 33706 - 19968: 0xE4B5, 33707 - 19968: 0xD8B0, 33725 - 19968: 0xD8D5, 33729 - 19968: 0xF4EA, 33733 - 19968: 0xCEB9, 33737 - 19968: 0xD6E1, 33738 - 19968: 0xCFD2, 33740 - 19968: 0xD0B6, 33747 - 19968: 0xCEA2, 33750 - 19968: 0xF3EE, 33756 - 19968: 0xF3F8, 33769 - 19968: 0xDCCC, 33771 - 19968: 0xD0CB, 33775 - 19968: 0xFCA4, 33776 - 19968: 0xCDCA, 33777 - 19968: 0xD7D4, 33778 - 19968: 0xDEA3, 33780 - 19968: 0xE4E0, 33785 - 19968: 0xEEC9, 33789 - 19968: 0xE2DD, 33795 - 19968: 0xF5FE, 33796 - 19968: 0xD4AC, 33802 - 19968: 0xD5D1, 33804 - 19968: 0xD8F0, 33805 - 19968: 0xF8C3, 33806 - 19968: 0xEAD7, 33833 - 19968: 0xF5D7, 33836 - 19968: 0xD8BF, 33841 - 19968: 0xFDC0, 33848 - 19968: 0xEBAD, 33853 - 19968: 0xD5AA, 33865 - 19968: 0xE7A8, 33879 - 19968: 0xEECA, 33883 - 19968: 0xCAE7, 33889 - 19968: 0xF8E3, 33891 - 19968: 0xD4DD, 33894 - 19968: 0xEAD8, 33899 - 19968: 0xFBD9, 33900 - 19968: 0xEDF7, 33903 - 19968: 0xE5B5, 33909 - 19968: 0xD0AD, 33914 - 19968: 0xF1F1, 33936 - 19968: 0xE2BD, 33940 - 19968: 0xE3C8, 33945 - 19968: 0xD9D5, 33948 - 19968: 0xDFAA, 33953 - 19968: 0xDBBC, 33970 - 19968: 0xF8E4, 33976 - 19968: 0xF1FA, 33979 - 19968: 0xE5B6, 33980 - 19968: 0xF3EF, 33983 - 19968: 0xFBDA, 33984 - 19968: 0xE1E0, 33986 - 19968: 0xD9AC, 33988 - 19968: 0xF5EB, 33990 - 19968: 0xE0B6, 33993 - 19968: 0xE9C8, 33995 - 19968: 0xCBCF, 33997 - 19968: 0xE3C9, 34001 - 19968: 0xDEEE, 34010 - 19968: 0xE2BE, 34028 - 19968: 0xDCEF, 34030 - 19968: 0xD6A5, 34036 - 19968: 0xE2F1, 34044 - 19968: 0xD6FE, 34065 - 19968: 0xD9A1, 34067 - 19968: 0xD8C0, 34068 - 19968: 0xDCDB, 34071 - 19968: 0xEDBD, 34072 - 19968: 0xDFB8, 34074 - 19968: 0xEAA5, 34078 - 19968: 0xD7AD, 34081 - 19968: 0xF3F9, 34083 - 19968: 0xEDF8, 34085 - 19968: 0xF5C7, 34092 - 19968: 0xE1CA, 34093 - 19968: 0xEBE3, 34095 - 19968: 0xF2DE, 34109 - 19968: 0xF8CC, 34111 - 19968: 0xEAD9, 34113 - 19968: 0xD3C6, 34115 - 19968: 0xDBE6, 34121 - 19968: 0xF5AF, 34126 - 19968: 0xCEF0, 34131 - 19968: 0xE9FE, 34137 - 19968: 0xFBB6, 34147 - 19968: 0xE2F2, 34152 - 19968: 0xCFF2, 34153 - 19968: 0xF7B9, 34154 - 19968: 0xD9F3, 34157 - 19968: 0xE1CB, 34180 - 19968: 0xDADD, 34183 - 19968: 0xDAB9, 34191 - 19968: 0xEBFB, 34193 - 19968: 0xCBB9, 34196 - 19968: 0xEDF9, 34203 - 19968: 0xE0E0, 34214 - 19968: 0xF4C0, 34216 - 19968: 0xFDBC, 34217 - 19968: 0xDFB1, 34218 - 19968: 0xE3EF, 34223 - 19968: 0xE0A3, 34224 - 19968: 0xFDB9, 34234 - 19968: 0xF0B1, 34241 - 19968: 0xCDCB, 34249 - 19968: 0xEDBE, 34253 - 19968: 0xD5C0, 34254 - 19968: 0xE3F0, 34255 - 19968: 0xEDFA, 34261 - 19968: 0xE9E4, 34268 - 19968: 0xD5ED, 34269 - 19968: 0xE7DD, 34276 - 19968: 0xD4F6, 34277 - 19968: 0xE5B7, 34281 - 19968: 0xDBE7, 34282 - 19968: 0xE2BF, 34295 - 19968: 0xEECB, 34298 - 19968: 0xD7F4, 34299 - 19968: 0xF0DD, 34303 - 19968: 0xCEAB, 34306 - 19968: 0xE7DE, 34310 - 19968: 0xD6D6, 34311 - 19968: 0xE1CC, 34314 - 19968: 0xE8B3, 34326 - 19968: 0xE5EE, 34327 - 19968: 0xDCA2, 34330 - 19968: 0xE0D0, 34349 - 19968: 0xD5B5, 34367 - 19968: 0xD5A1, 34382 - 19968: 0xFBDB, 34384 - 19968: 0xF9CB, 34388 - 19968: 0xCBF3, 34389 - 19968: 0xF4A5, 34395 - 19968: 0xFAC8, 34396 - 19968: 0xD6D7, 34398 - 19968: 0xE9E5, 34399 - 19968: 0xFBDC, 34407 - 19968: 0xFDD0, 34425 - 19968: 0xFBF6, 34442 - 19968: 0xDAA5, 34444 - 19968: 0xDBBD, 34451 - 19968: 0xECE2, 34467 - 19968: 0xCDF7, 34468 - 19968: 0xF0DE, 34473 - 19968: 0xF6C9, 34503 - 19968: 0xDEEF, 34507 - 19968: 0xD3B1, 34516 - 19968: 0xFCEE, 34521 - 19968: 0xE8C3, 34523 - 19968: 0xF1C8, 34527 - 19968: 0xCEF1, 34532 - 19968: 0xF9ED, 34541 - 19968: 0xF2F4, 34558 - 19968: 0xE4B6, 34560 - 19968: 0xF5B9, 34562 - 19968: 0xDCF0, 34563 - 19968: 0xE3F1, 34568 - 19968: 0xE8A5, 34584 - 19968: 0xF2BB, 34586 - 19968: 0xDEA4, 34588 - 19968: 0xDACC, 34638 - 19968: 0xCAE9, 34645 - 19968: 0xE3DA, 34647 - 19968: 0xFCD9, 34655 - 19968: 0xEADA, 34662 - 19968: 0xF9C4, 34664 - 19968: 0xE3A4, 34676 - 19968: 0xFBDD, 34678 - 19968: 0xEFCA, 34680 - 19968: 0xE8C4, 34690 - 19968: 0xD5CC, 34701 - 19968: 0xEBD7, 34719 - 19968: 0xD9AD, 34722 - 19968: 0xFBAB, 34739 - 19968: 0xD3D9, 34746 - 19968: 0xD5A2, 34756 - 19968: 0xF6DE, 34784 - 19968: 0xDAF6, 34796 - 19968: 0xE0D1, 34799 - 19968: 0xE9A8, 34802 - 19968: 0xF5F9, 34809 - 19968: 0xFAAF, 34811 - 19968: 0xEBFC, 34814 - 19968: 0xE0EA, 34821 - 19968: 0xE3B2, 34847 - 19968: 0xD5C5, 34850 - 19968: 0xF1E3, 34851 - 19968: 0xD5EE, 34865 - 19968: 0xCDCC, 34870 - 19968: 0xEDD9, 34875 - 19968: 0xD8C1, 34880 - 19968: 0xFAEC, 34886 - 19968: 0xF1EB, 34892 - 19968: 0xFABC, 34893 - 19968: 0xE6E2, 34898 - 19968: 0xFAE5, 34899 - 19968: 0xE2FA, 34903 - 19968: 0xCAB6, 34905 - 19968: 0xE4B7, 34907 - 19968: 0xEADB, 34909 - 19968: 0xF5FA, 34913 - 19968: 0xFBAC, 34914 - 19968: 0xCFC3, 34915 - 19968: 0xEBFD, 34920 - 19968: 0xF8FA, 34923 - 19968: 0xDFB9, 34928 - 19968: 0xE1F1, 34930 - 19968: 0xD2A4, 34935 - 19968: 0xF5FB, 34942 - 19968: 0xD0DA, 34943 - 19968: 0xD0DB, 34945 - 19968: 0xEABE, 34946 - 19968: 0xD9B1, 34952 - 19968: 0xCAB7, 34955 - 19968: 0xD3E7, 34957 - 19968: 0xF8E5, 34962 - 19968: 0xD3B2, 34966 - 19968: 0xE2C0, 34967 - 19968: 0xF2DF, 34974 - 19968: 0xCDE5, 34987 - 19968: 0xF9AC, 34996 - 19968: 0xCDCD, 35009 - 19968: 0xEEAE, 35010 - 19968: 0xD6AE, 35023 - 19968: 0xD7EA, 35028 - 19968: 0xE7E0, 35029 - 19968: 0xEBAE, 35033 - 19968: 0xCFD9, 35036 - 19968: 0xDCCD, 35037 - 19968: 0xEDFB, 35039 - 19968: 0xDEF0, 35041 - 19968: 0xD7EB, 35048 - 19968: 0xDEA5, 35059 - 19968: 0xDFD7, 35060 - 19968: 0xDBD0, 35061 - 19968: 0xDBD1, 35064 - 19968: 0xD5A3, 35069 - 19968: 0xF0B2, 35079 - 19968: 0xDCDC, 35088 - 19968: 0xCAE8, 35090 - 19968: 0xF8E6, 35091 - 19968: 0xDCCE, 35096 - 19968: 0xEADC, 35097 - 19968: 0xDBD2, 35109 - 19968: 0xE9B3, 35114 - 19968: 0xF7DB, 35126 - 19968: 0xE3A8, 35128 - 19968: 0xD7AE, 35131 - 19968: 0xE0E1, 35137 - 19968: 0xCBBA, 35140 - 19968: 0xE5D1, 35167 - 19968: 0xD0DC, 35172 - 19968: 0xD5C1, 35178 - 19968: 0xD8CA, 35186 - 19968: 0xE3A9, 35199 - 19968: 0xE0A4, 35201 - 19968: 0xE9A9, 35203 - 19968: 0xD3C7, 35206 - 19968: 0xDCDD, 35207 - 19968: 0xF8AE, 35211 - 19968: 0xCCB8, 35215 - 19968: 0xD0AE, 35219 - 19968: 0xD8F2, 35222 - 19968: 0xE3CA, 35233 - 19968: 0xCCAF, 35241 - 19968: 0xD4AD, 35242 - 19968: 0xF6D1, 35250 - 19968: 0xD0CC, 35258 - 19968: 0xCAC6, 35261 - 19968: 0xD5C2, 35264 - 19968: 0xCEBA, 35282 - 19968: 0xCAC7, 35299 - 19968: 0xFAB0, 35316 - 19968: 0xDFD8, 35320 - 19968: 0xF5BA, 35328 - 19968: 0xE5EB, 35330 - 19968: 0xEFF4, 35331 - 19968: 0xDDB5, 35336 - 19968: 0xCDAA, 35338 - 19968: 0xE3F2, 35340 - 19968: 0xFBF7, 35342 - 19968: 0xF7D0, 35347 - 19968: 0xFDBA, 35350 - 19968: 0xFDE1, 35351 - 19968: 0xF6FE, 35352 - 19968: 0xD1C0, 35355 - 19968: 0xE8C5, 35357 - 19968: 0xE4B8, 35359 - 19968: 0xE1E8, 35363 - 19968: 0xCCC1, 35365 - 19968: 0xD2ED, 35370 - 19968: 0xDBBE, 35373 - 19968: 0xE0E2, 35377 - 19968: 0xFAC9, 35380 - 19968: 0xE1CD, 35382 - 19968: 0xCAB8, 35386 - 19968: 0xF2E0, 35387 - 19968: 0xF1C9, 35408 - 19968: 0xDEF1, 35412 - 19968: 0xF0DF, 35413 - 19968: 0xF8C4, 35419 - 19968: 0xEECC, 35422 - 19968: 0xDEF2, 35424 - 19968: 0xE7C9, 35426 - 19968: 0xE2F3, 35427 - 19968: 0xE7E1, 35430 - 19968: 0xE3CB, 35433 - 19968: 0xE3CC, 35437 - 19968: 0xCFF8, 35438 - 19968: 0xEFAC, 35440 - 19968: 0xFDFE, 35441 - 19968: 0xFCA5, 35442 - 19968: 0xFAB1, 35443 - 19968: 0xDFD9, 35445 - 19968: 0xE0D2, 35449 - 19968: 0xF4DA, 35461 - 19968: 0xF1CA, 35463 - 19968: 0xCEA3, 35468 - 19968: 0xF2BC, 35469 - 19968: 0xECE3, 35475 - 19968: 0xE0A5, 35477 - 19968: 0xF7AB, 35480 - 19968: 0xEBAF, 35486 - 19968: 0xE5DE, 35488 - 19968: 0xE1A4, 35489 - 19968: 0xCDAB, 35491 - 19968: 0xD9F4, 35492 - 19968: 0xE8A6, 35493 - 19968: 0xCDCE, 35494 - 19968: 0xE1E9, 35496 - 19968: 0xFCEF, 35498 - 19968: 0xE0E3, 35504 - 19968: 0xE2C1, 35506 - 19968: 0xCEA4, 35513 - 19968: 0xDEA6, 35516 - 19968: 0xEBFE, 35518 - 19968: 0xEBDD, 35519 - 19968: 0xF0E0, 35522 - 19968: 0xF4DB, 35524 - 19968: 0xE2F4, 35527 - 19968: 0xD3C8, 35531 - 19968: 0xF4EB, 35533 - 19968: 0xEEB5, 35535 - 19968: 0xF5D8, 35538 - 19968: 0xD5DF, 35542 - 19968: 0xD6E5, 35547 - 19968: 0xEBB0, 35548 - 19968: 0xF4E3, 35553 - 19968: 0xE3CD, 35558 - 19968: 0xF4F4, 35559 - 19968: 0xFAB2, 35562 - 19968: 0xEFF5, 35563 - 19968: 0xCADF, 35565 - 19968: 0xEBB1, 35566 - 19968: 0xEDBF, 35569 - 19968: 0xFDC9, 35574 - 19968: 0xE4A6, 35575 - 19968: 0xF9A4, 35576 - 19968: 0xF0B3, 35578 - 19968: 0xE5EC, 35582 - 19968: 0xD1E7, 35584 - 19968: 0xD9C7, 35585 - 19968: 0xE4D7, 35586 - 19968: 0xEADD, 35588 - 19968: 0xD4F7, 35598 - 19968: 0xDABA, 35600 - 19968: 0xDACD, 35604 - 19968: 0xF9CC, 35606 - 19968: 0xE1DA, 35607 - 19968: 0xDBBF, 35609 - 19968: 0xCCC5, 35610 - 19968: 0xECD0, 35611 - 19968: 0xCBBB, 35613 - 19968: 0xDEF3, 35616 - 19968: 0xE9AA, 35624 - 19968: 0xD9C8, 35627 - 19968: 0xEEE3, 35628 - 19968: 0xD7BD, 35635 - 19968: 0xCFC4, 35641 - 19968: 0xD0CD, 35649 - 19968: 0xFCA6, 35657 - 19968: 0xF1FB, 35662 - 19968: 0xFDD2, 35663 - 19968: 0xD1C1, 35672 - 19968: 0xE3DB, 35674 - 19968: 0xD3C9, 35676 - 19968: 0xDCCF, 35686 - 19968: 0xCCED, 35692 - 19968: 0xDEA7, 35695 - 19968: 0xE6BB, 35696 - 19968: 0xECA1, 35700 - 19968: 0xCCB9, 35703 - 19968: 0xFBDE, 35709 - 19968: 0xE7E2, 35712 - 19968: 0xD4C1, 35722 - 19968: 0xDCA8, 35728 - 19968: 0xE2C2, 35730 - 19968: 0xF3D8, 35731 - 19968: 0xE5D3, 35734 - 19968: 0xF3D9, 35738 - 19968: 0xF3C6, 35895 - 19968: 0xCDDB, 35903 - 19968: 0xCDAC, 35905 - 19968: 0xFCC3, 35910 - 19968: 0xD4E7, 35912 - 19968: 0xD1C2, 35914 - 19968: 0xF9A5, 35916 - 19968: 0xE8D5, 35925 - 19968: 0xE3CE, 35930 - 19968: 0xD4CA, 35937 - 19968: 0xDFDA, 35946 - 19968: 0xFBDF, 35947 - 19968: 0xE7E3, 35961 - 19968: 0xF8FB, 35962 - 19968: 0xE3CF, 35970 - 19968: 0xF5B0, 35978 - 19968: 0xD8E7, 35980 - 19968: 0xD9C9, 35997 - 19968: 0xF8AF, 35998 - 19968: 0xEFF6, 36000 - 19968: 0xDDB6, 36001 - 19968: 0xEEAF, 36002 - 19968: 0xCDF8, 36007 - 19968: 0xDEB8, 36008 - 19968: 0xFCA7, 36009 - 19968: 0xF7FC, 36010 - 19968: 0xF7B1, 36011 - 19968: 0xCEBB, 36012 - 19968: 0xF4A1, 36015 - 19968: 0xEECD, 36016 - 19968: 0xE1AE, 36019 - 19968: 0xECC3, 36020 - 19968: 0xCFFE, 36022 - 19968: 0xF8BF, 36023 - 19968: 0xD8E2, 36024 - 19968: 0xD3E8, 36027 - 19968: 0xDEA8, 36028 - 19968: 0xF4E4, 36029 - 19968: 0xECC2, 36031 - 19968: 0xD9F5, 36032 - 19968: 0xF9C5, 36033 - 19968: 0xDDD3, 36034 - 19968: 0xD6F1, 36035 - 19968: 0xECFC, 36036 - 19968: 0xFCF0, 36039 - 19968: 0xEDC0, 36040 - 19968: 0xCAB9, 36042 - 19968: 0xEEE4, 36049 - 19968: 0xF2E1, 36051 - 19968: 0xDEB9, 36058 - 19968: 0xD6F2, 36060 - 19968: 0xDEF4, 36062 - 19968: 0xDFDB, 36064 - 19968: 0xDBD3, 36066 - 19968: 0xFAE7, 36067 - 19968: 0xD8E3, 36068 - 19968: 0xF4C1, 36070 - 19968: 0xDDB7, 36074 - 19968: 0xF2F5, 36077 - 19968: 0xD4AE, 36084 - 19968: 0xD6F3, 36091 - 19968: 0xDDB8, 36092 - 19968: 0xCFC5, 36093 - 19968: 0xDFDF, 36100 - 19968: 0xF2BE, 36101 - 19968: 0xF6A1, 36103 - 19968: 0xEBCB, 36104 - 19968: 0xF1FC, 36106 - 19968: 0xF3C7, 36109 - 19968: 0xE0EB, 36115 - 19968: 0xEDFC, 36118 - 19968: 0xE1DB, 36196 - 19968: 0xEEE5, 36198 - 19968: 0xDEF5, 36203 - 19968: 0xFAD3, 36208 - 19968: 0xF1CB, 36211 - 19968: 0xD0AF, 36212 - 19968: 0xDDB9, 36215 - 19968: 0xD1C3, 36229 - 19968: 0xF5B1, 36234 - 19968: 0xEAC6, 36249 - 19968: 0xF0E1, 36259 - 19968: 0xF6AC, 36264 - 19968: 0xF5D9, 36275 - 19968: 0xF0EB, 36282 - 19968: 0xDDBA, 36286 - 19968: 0xF2BF, 36294 - 19968: 0xF7C5, 36299 - 19968: 0xDBA2, 36300 - 19968: 0xF2F6, 36303 - 19968: 0xCABA, 36315 - 19968: 0xF7F5, 36317 - 19968: 0xCBE5, 36321 - 19968: 0xEEE6, 36323 - 19968: 0xE0D3, 36328 - 19968: 0xCEA5, 36335 - 19968: 0xD6D8, 36339 - 19968: 0xD4AF, 36362 - 19968: 0xE9C9, 36367 - 19968: 0xD3CE, 36368 - 19968: 0xF4C2, 36382 - 19968: 0xCBE6, 36394 - 19968: 0xF1A1, 36400 - 19968: 0xEBB2, 36405 - 19968: 0xF1A2, 36418 - 19968: 0xEBB3, 36420 - 19968: 0xF0B4, 36423 - 19968: 0xCBF4, 36424 - 19968: 0xD4B0, 36425 - 19968: 0xF3B2, 36426 - 19968: 0xFBB7, 36441 - 19968: 0xF5EC, 36447 - 19968: 0xEEE7, 36448 - 19968: 0xF4B2, 36468 - 19968: 0xF5ED, 36470 - 19968: 0xCFF3, 36481 - 19968: 0xF0E2, 36487 - 19968: 0xEECE, 36490 - 19968: 0xF1CC, 36493 - 19968: 0xE5B8, 36522 - 19968: 0xD7F5, 36523 - 19968: 0xE3F3, 36524 - 19968: 0xCFE5, 36544 - 19968: 0xCFC6, 36554 - 19968: 0xF3B3, 36555 - 19968: 0xE4D8, 36556 - 19968: 0xCFF9, 36557 - 19968: 0xCFDA, 36562 - 19968: 0xFACD, 36575 - 19968: 0xE6E3, 36587 - 19968: 0xF2E2, 36600 - 19968: 0xF5EE, 36603 - 19968: 0xCABB, 36606 - 19968: 0xE3DC, 36611 - 19968: 0xCEF2, 36613 - 19968: 0xD6D9, 36617 - 19968: 0xEEB0, 36626 - 19968: 0xF4E5, 36627 - 19968: 0xD8C2, 36628 - 19968: 0xDCD0, 36629 - 19968: 0xCCEE, 36635 - 19968: 0xD5E0, 36636 - 19968: 0xF6CA, 36637 - 19968: 0xFDCA, 36638 - 19968: 0xD8D6, 36639 - 19968: 0xF4CF, 36646 - 19968: 0xD6A6, 36647 - 19968: 0xDCBE, 36649 - 19968: 0xDBD4, 36650 - 19968: 0xD7C7, 36655 - 19968: 0xF2FE, 36659 - 19968: 0xF1CD, 36664 - 19968: 0xE2C3, 36665 - 19968: 0xDCDE, 36667 - 19968: 0xDCDF, 36670 - 19968: 0xEFAD, 36671 - 19968: 0xE6AB, 36676 - 19968: 0xF9DD, 36677 - 19968: 0xEABF, 36681 - 19968: 0xEFAE, 36685 - 19968: 0xF4D0, 36686 - 19968: 0xCEF3, 36701 - 19968: 0xE6AC, 36703 - 19968: 0xCEDE, 36706 - 19968: 0xD5F9, 36763 - 19968: 0xE3F4, 36764 - 19968: 0xCDD0, 36771 - 19968: 0xD5B8, 36774 - 19968: 0xF7FD, 36776 - 19968: 0xDCA9, 36781 - 19968: 0xDEF6, 36783 - 19968: 0xDCAA, 36784 - 19968: 0xF2E3, 36785 - 19968: 0xE9B4, 36786 - 19968: 0xD2DC, 36802 - 19968: 0xE9E6, 36805 - 19968: 0xE3F6, 36814 - 19968: 0xE7CA, 36817 - 19968: 0xD0CE, 36820 - 19968: 0xDAF7, 36838 - 19968: 0xCABC, 36842 - 19968: 0xEEE8, 36843 - 19968: 0xDADE, 36845 - 19968: 0xF2F7, 36848 - 19968: 0xE2FB, 36850 - 19968: 0xCCA6, 36855 - 19968: 0xDABB, 36857 - 19968: 0xEEE9, 36861 - 19968: 0xF5DA, 36864 - 19968: 0xF7DC, 36865 - 19968: 0xE1EA, 36866 - 19968: 0xCEC1, 36867 - 19968: 0xD4B1, 36869 - 19968: 0xFDB1, 36870 - 19968: 0xE6BD, 36872 - 19968: 0xFBAD, 36875 - 19968: 0xF8E7, 36877 - 19968: 0xE1CE, 36879 - 19968: 0xF7E2, 36880 - 19968: 0xF5EF, 36881 - 19968: 0xCFC7, 36884 - 19968: 0xD4B2, 36885 - 19968: 0xCCEF, 36887 - 19968: 0xD4E8, 36889 - 19968: 0xEECF, 36890 - 19968: 0xF7D7, 36893 - 19968: 0xE0A6, 36894 - 19968: 0xD6C1, 36895 - 19968: 0xE1DC, 36896 - 19968: 0xF0E3, 36897 - 19968: 0xF1E4, 36898 - 19968: 0xDCF1, 36899 - 19968: 0xD6A7, 36910 - 19968: 0xF4F5, 36913 - 19968: 0xF1CE, 36914 - 19968: 0xF2E4, 36917 - 19968: 0xD0B0, 36920 - 19968: 0xECEF, 36924 - 19968: 0xF9BA, 36926 - 19968: 0xEBB5, 36929 - 19968: 0xD4ED, 36930 - 19968: 0xE2C4, 36935 - 19968: 0xE9E7, 36938 - 19968: 0xEBB4, 36939 - 19968: 0xEAA1, 36941 - 19968: 0xF8BC, 36942 - 19968: 0xCEA6, 36944 - 19968: 0xF9C6, 36945 - 19968: 0xFCDA, 36947 - 19968: 0xD4B3, 36948 - 19968: 0xD3B9, 36949 - 19968: 0xEADE, 36953 - 19968: 0xE9AB, 36956 - 19968: 0xE1E1, 36957 - 19968: 0xD3CF, 36958 - 19968: 0xF4F6, 36960 - 19968: 0xEAC0, 36961 - 19968: 0xE1CF, 36963 - 19968: 0xCCBA, 36969 - 19968: 0xEEEA, 36973 - 19968: 0xF0E4, 36974 - 19968: 0xF3B4, 36975 - 19968: 0xD4EE, 36978 - 19968: 0xF2C0, 36981 - 19968: 0xF1E5, 36983 - 19968: 0xF4C3, 36984 - 19968: 0xE0D4, 36986 - 19968: 0xEBB6, 36988 - 19968: 0xD7A1, 36989 - 19968: 0xCBE8, 36991 - 19968: 0xF9AD, 36992 - 19968: 0xE9AD, 36993 - 19968: 0xD8E4, 36994 - 19968: 0xFAB3, 36995 - 19968: 0xE2C5, 36996 - 19968: 0xFCBD, 36999 - 19968: 0xECC4, 37000 - 19968: 0xD8B1, 37002 - 19968: 0xDCAB, 37007 - 19968: 0xD5A4, 37009 - 19968: 0xEBE9, 37013 - 19968: 0xE8BB, 37017 - 19968: 0xD8D7, 37026 - 19968: 0xFBAE, 37027 - 19968: 0xD1E1, 37030 - 19968: 0xDBC0, 37032 - 19968: 0xF5BE, 37034 - 19968: 0xDEF7, 37039 - 19968: 0xCAFB, 37040 - 19968: 0xF7C6, 37041 - 19968: 0xCFC8, 37045 - 19968: 0xE1D0, 37048 - 19968: 0xEED0, 37057 - 19968: 0xE9F4, 37066 - 19968: 0xCEF4, 37086 - 19968: 0xD5CD, 37089 - 19968: 0xCFDB, 37096 - 19968: 0xDDBB, 37101 - 19968: 0xCEAC, 37109 - 19968: 0xE9E8, 37117 - 19968: 0xD4B4, 37122 - 19968: 0xE4C7, 37138 - 19968: 0xF5DB, 37141 - 19968: 0xFAC1, 37145 - 19968: 0xDEA9, 37159 - 19968: 0xD4F8, 37165 - 19968: 0xEFF7, 37170 - 19968: 0xD3B3, 37193 - 19968: 0xEBB7, 37194 - 19968: 0xEFF8, 37195 - 19968: 0xF5DC, 37196 - 19968: 0xEDCC, 37197 - 19968: 0xDBD5, 37198 - 19968: 0xF1CF, 37202 - 19968: 0xF1D0, 37218 - 19968: 0xF5B2, 37225 - 19968: 0xD9AE, 37226 - 19968: 0xD5AC, 37228 - 19968: 0xE2C6, 37237 - 19968: 0xFDA3, 37239 - 19968: 0xFBE5, 37240 - 19968: 0xDFAB, 37255 - 19968: 0xE2F5, 37257 - 19968: 0xF6AD, 37259 - 19968: 0xF5B3, 37261 - 19968: 0xF0B5, 37266 - 19968: 0xE1A5, 37276 - 19968: 0xF5DD, 37291 - 19968: 0xECA2, 37292 - 19968: 0xEDFD, 37294 - 19968: 0xF5B4, 37295 - 19968: 0xFBB8, 37297 - 19968: 0xDBA3, 37300 - 19968: 0xD6CA, 37301 - 19968: 0xCBD9, 37312 - 19968: 0xE5D4, 37319 - 19968: 0xF3FA, 37321 - 19968: 0xEBB8, 37323 - 19968: 0xE0B7, 37324 - 19968: 0xD7EC, 37325 - 19968: 0xF1EC, 37326 - 19968: 0xE5AF, 37327 - 19968: 0xD5E1, 37328 - 19968: 0xD7ED, 37329 - 19968: 0xD1D1, 37335 - 19968: 0xE1F2, 37336 - 19968: 0xEFF9, 37340 - 19968: 0xDDBC, 37341 - 19968: 0xF6DC, 37347 - 19968: 0xF0E5, 37351 - 19968: 0xF4C4, 37354 - 19968: 0xE9E9, 37365 - 19968: 0xF3FB, 37389 - 19968: 0xD4EF, 37392 - 19968: 0xCCA2, 37393 - 19968: 0xF7FE, 37394 - 19968: 0xDFBC, 37399 - 19968: 0xEBCD, 37406 - 19968: 0xD0B7, 37428 - 19968: 0xD6C2, 37434 - 19968: 0xE8AD, 37439 - 19968: 0xEFAF, 37440 - 19968: 0xCBA5, 37445 - 19968: 0xCBE9, 37449 - 19968: 0xFAE8, 37463 - 19968: 0xCCC6, 37467 - 19968: 0xE6E7, 37470 - 19968: 0xEAC7, 37474 - 19968: 0xDBA4, 37476 - 19968: 0xCFC9, 37477 - 19968: 0xE2FC, 37478 - 19968: 0xEFFA, 37504 - 19968: 0xEBDE, 37507 - 19968: 0xF5C8, 37509 - 19968: 0xD4DE, 37521 - 19968: 0xE0D5, 37523 - 19968: 0xEFB0, 37526 - 19968: 0xE2C7, 37528 - 19968: 0xD9AF, 37532 - 19968: 0xF9E7, 37555 - 19968: 0xE7E5, 37558 - 19968: 0xCFCA, 37559 - 19968: 0xE1D1, 37561 - 19968: 0xE2C8, 37580 - 19968: 0xEFFB, 37583 - 19968: 0xFAF9, 37586 - 19968: 0xDCF2, 37604 - 19968: 0xE0A7, 37610 - 19968: 0xF8E8, 37624 - 19968: 0xCBEA, 37628 - 19968: 0xCBBC, 37636 - 19968: 0xD6E2, 37648 - 19968: 0xF5DE, 37656 - 19968: 0xF5DF, 37658 - 19968: 0xEEB6, 37662 - 19968: 0xE2F6, 37663 - 19968: 0xD3CA, 37664 - 19968: 0xEFFC, 37665 - 19968: 0xD1C4, 37666 - 19968: 0xEFB1, 37668 - 19968: 0xD1C5, 37670 - 19968: 0xD0DE, 37672 - 19968: 0xD9E1, 37675 - 19968: 0xE0B8, 37678 - 19968: 0xCDD1, 37679 - 19968: 0xF3B9, 37704 - 19968: 0xE7CC, 37706 - 19968: 0xD6A8, 37707 - 19968: 0xCEA7, 37709 - 19968: 0xD4B5, 37716 - 19968: 0xE4C8, 37723 - 19968: 0xD3B4, 37742 - 19968: 0xEBB9, 37749 - 19968: 0xCBF5, 37756 - 19968: 0xF6DD, 37758 - 19968: 0xF1A3, 37772 - 19968: 0xCCC7, 37780 - 19968: 0xE9CA, 37782 - 19968: 0xE1F0, 37786 - 19968: 0xF5E0, 37795 - 19968: 0xFBAF, 37799 - 19968: 0xCBD1, 37804 - 19968: 0xFBE0, 37805 - 19968: 0xF2E5, 37808 - 19968: 0xECF0, 37827 - 19968: 0xF0EC, 37841 - 19968: 0xEEEB, 37854 - 19968: 0xE9CB, 37857 - 19968: 0xCCF0, 37860 - 19968: 0xD7AF, 37878 - 19968: 0xF3A1, 37892 - 19968: 0xFCF5, 37912 - 19968: 0xF1A4, 37925 - 19968: 0xE0D6, 37931 - 19968: 0xEFB2, 37941 - 19968: 0xF4D1, 37944 - 19968: 0xF7A1, 37956 - 19968: 0xF1D1, 37969 - 19968: 0xCAFC, 37970 - 19968: 0xCAFD, 37979 - 19968: 0xCECE, 38013 - 19968: 0xF3C8, 38015 - 19968: 0xF3BA, 38263 - 19968: 0xEDFE, 38272 - 19968: 0xDAA6, 38275 - 19968: 0xE0EC, 38281 - 19968: 0xF8CD, 38283 - 19968: 0xCBD2, 38287 - 19968: 0xEBCE, 38289 - 19968: 0xF9D8, 38290 - 19968: 0xF9D9, 38291 - 19968: 0xCAE0, 38292 - 19968: 0xDACA, 38296 - 19968: 0xCBA6, 38307 - 19968: 0xCAC8, 38308 - 19968: 0xF9EE, 38309 - 19968: 0xDBEC, 38312 - 19968: 0xD0B1, 38317 - 19968: 0xD5EF, 38321 - 19968: 0xE6F3, 38331 - 19968: 0xE7A2, 38332 - 19968: 0xE4D9, 38343 - 19968: 0xE4E1, 38346 - 19968: 0xFCC4, 38356 - 19968: 0xF9EF, 38357 - 19968: 0xCFF4, 38358 - 19968: 0xF7E6, 38364 - 19968: 0xCEBC, 38369 - 19968: 0xF4C5, 38370 - 19968: 0xDCA3, 38428 - 19968: 0xDDBD, 38433 - 19968: 0xF4C6, 38442 - 19968: 0xF8A1, 38446 - 19968: 0xE8D6, 38450 - 19968: 0xDBC1, 38459 - 19968: 0xF0E6, 38463 - 19968: 0xE4B9, 38464 - 19968: 0xF6ED, 38466 - 19968: 0xF9AE, 38468 - 19968: 0xDDBE, 38475 - 19968: 0xD7B0, 38476 - 19968: 0xD8E8, 38477 - 19968: 0xCBBD, 38480 - 19968: 0xF9DA, 38491 - 19968: 0xF8CE, 38492 - 19968: 0xF9F0, 38493 - 19968: 0xE0ED, 38494 - 19968: 0xE3B3, 38495 - 19968: 0xF4B3, 38498 - 19968: 0xEAC2, 38499 - 19968: 0xF2E6, 38500 - 19968: 0xF0B6, 38506 - 19968: 0xDBD6, 38512 - 19968: 0xEBE4, 38515 - 19968: 0xF2E7, 38517 - 19968: 0xD7D5, 38518 - 19968: 0xD4B6, 38519 - 19968: 0xF9E8, 38520 - 19968: 0xD7C1, 38525 - 19968: 0xE5D5, 38533 - 19968: 0xE9EA, 38534 - 19968: 0xD7CC, 38538 - 19968: 0xD3E9, 38539 - 19968: 0xE2C9, 38541 - 19968: 0xFCDB, 38542 - 19968: 0xCDAD, 38548 - 19968: 0xCCB0, 38549 - 19968: 0xEAA2, 38552 - 19968: 0xE4F6, 38553 - 19968: 0xD0C0, 38555 - 19968: 0xF0B7, 38556 - 19968: 0xEEA1, 38563 - 19968: 0xD7F6, 38567 - 19968: 0xE2CA, 38568 - 19968: 0xE2CB, 38570 - 19968: 0xFACF, 38577 - 19968: 0xEBDF, 38583 - 19968: 0xD6CB, 38587 - 19968: 0xF4B4, 38592 - 19968: 0xEDCD, 38593 - 19968: 0xE4D2, 38596 - 19968: 0xEAA9, 38597 - 19968: 0xE4BA, 38598 - 19968: 0xF3A2, 38599 - 19968: 0xCDD2, 38601 - 19968: 0xF6CB, 38603 - 19968: 0xF1E6, 38604 - 19968: 0xEDC1, 38605 - 19968: 0xE8BC, 38606 - 19968: 0xEED1, 38613 - 19968: 0xF0E7, 38614 - 19968: 0xE2CC, 38617 - 19968: 0xE4AA, 38619 - 19968: 0xF5E1, 38620 - 19968: 0xEDDA, 38626 - 19968: 0xD7EE, 38627 - 19968: 0xD1F1, 38632 - 19968: 0xE9EB, 38633 - 19968: 0xE9EC, 38634 - 19968: 0xE0E4, 38639 - 19968: 0xDAA7, 38640 - 19968: 0xDDD4, 38642 - 19968: 0xEAA3, 38646 - 19968: 0xD6C3, 38647 - 19968: 0xD6F4, 38649 - 19968: 0xDADF, 38651 - 19968: 0xEFB3, 38656 - 19968: 0xE2CD, 38662 - 19968: 0xEFFD, 38663 - 19968: 0xF2E8, 38673 - 19968: 0xEFC5, 38675 - 19968: 0xE7E7, 38678 - 19968: 0xD7FD, 38681 - 19968: 0xE7CE, 38684 - 19968: 0xDFDC, 38686 - 19968: 0xF9C7, 38695 - 19968: 0xD9F6, 38704 - 19968: 0xDFAC, 38706 - 19968: 0xD6DA, 38713 - 19968: 0xDCA4, 38717 - 19968: 0xF0B8, 38722 - 19968: 0xD5FA, 38724 - 19968: 0xE4F7, 38728 - 19968: 0xD6C4, 38737 - 19968: 0xF4EC, 38742 - 19968: 0xEFFE, 38748 - 19968: 0xF0A1, 38750 - 19968: 0xDEAA, 38753 - 19968: 0xDABC, 38754 - 19968: 0xD8FC, 38761 - 19968: 0xFAD4, 38765 - 19968: 0xECE5, 38772 - 19968: 0xFCA8, 38775 - 19968: 0xECE6, 38778 - 19968: 0xD8CB, 38795 - 19968: 0xFBB9, 38797 - 19968: 0xE4D3, 38799 - 19968: 0xCDF9, 38816 - 19968: 0xCFD3, 38824 - 19968: 0xCAEA, 38827 - 19968: 0xCFD4, 38829 - 19968: 0xF8BD, 38854 - 19968: 0xF4C7, 38859 - 19968: 0xEADF, 38867 - 19968: 0xF9DB, 38876 - 19968: 0xD4B7, 38899 - 19968: 0xEBE5, 38902 - 19968: 0xE1D2, 38907 - 19968: 0xEAA4, 38911 - 19968: 0xFAC2, 38912 - 19968: 0xFBE1, 38913 - 19968: 0xFAED, 38914 - 19968: 0xF0A2, 38915 - 19968: 0xCCF1, 38917 - 19968: 0xFAA3, 38918 - 19968: 0xE2F7, 38920 - 19968: 0xE2CE, 38922 - 19968: 0xE9F5, 38924 - 19968: 0xE1EB, 38928 - 19968: 0xE7E8, 38929 - 19968: 0xE8D7, 38930 - 19968: 0xDAF8, 38931 - 19968: 0xD4CB, 38935 - 19968: 0xF7F6, 38936 - 19968: 0xD6C5, 38957 - 19968: 0xD4E9, 38960 - 19968: 0xFAFA, 38968 - 19968: 0xCCF2, 38969 - 19968: 0xF7DD, 38971 - 19968: 0xDEBA, 38982 - 19968: 0xCEA8, 38988 - 19968: 0xF0B9, 38989 - 19968: 0xE4FE, 38990 - 19968: 0xE4C9, 38996 - 19968: 0xE4D4, 39000 - 19968: 0xEAC3, 39002 - 19968: 0xEFB4, 39006 - 19968: 0xD7BE, 39013 - 19968: 0xFBE2, 39015 - 19968: 0xCDD3, 39019 - 19968: 0xEFB5, 39023 - 19968: 0xFAE9, 39080 - 19968: 0xF9A6, 39087 - 19968: 0xDFBD, 39089 - 19968: 0xF7C7, 39108 - 19968: 0xF8FD, 39111 - 19968: 0xF8FC, 39131 - 19968: 0xDEAB, 39132 - 19968: 0xDBE8, 39135 - 19968: 0xE3DD, 39137 - 19968: 0xE1E2, 39138 - 19968: 0xD1C6, 39149 - 19968: 0xF6D0, 39150 - 19968: 0xEBE6, 39151 - 19968: 0xDAF9, 39156 - 19968: 0xECC7, 39164 - 19968: 0xDEF8, 39165 - 19968: 0xF8E9, 39166 - 19968: 0xE3DE, 39171 - 19968: 0xCEF5, 39177 - 19968: 0xFAC3, 39178 - 19968: 0xE5D7, 39180 - 19968: 0xECC8, 39184 - 19968: 0xF3C9, 39187 - 19968: 0xE4BB, 39192 - 19968: 0xE6AE, 39198 - 19968: 0xEFB6, 39200 - 19968: 0xDCBF, 39208 - 19968: 0xCEBD, 39237 - 19968: 0xD8C3, 39241 - 19968: 0xD0CF, 39243 - 19968: 0xCFFA, 39244 - 19968: 0xF3CA, 39245 - 19968: 0xE0D7, 39249 - 19968: 0xD1C7, 39250 - 19968: 0xE9AE, 39252 - 19968: 0xE8BD, 39255 - 19968: 0xFAC4, 39318 - 19968: 0xE2CF, 39321 - 19968: 0xFAC5, 39325 - 19968: 0xF9B8, 39333 - 19968: 0xDCE0, 39336 - 19968: 0xFBB0, 39340 - 19968: 0xD8A9, 39341 - 19968: 0xE5DF, 39342 - 19968: 0xF9A7, 39345 - 19968: 0xF6EE, 39347 - 19968: 0xF6CC, 39348 - 19968: 0xE2F8, 39353 - 19968: 0xECF1, 39361 - 19968: 0xDAE0, 39376 - 19968: 0xF1D2, 39377 - 19968: 0xD2CC, 39378 - 19968: 0xCFCB, 39381 - 19968: 0xCABD, 39385 - 19968: 0xDDBF, 39389 - 19968: 0xF6EF, 39391 - 19968: 0xDEF9, 39405 - 19968: 0xFAB4, 39409 - 19968: 0xD5AD, 39423 - 19968: 0xF1E7, 39425 - 19968: 0xDEBE, 39432 - 19968: 0xDCC0, 39438 - 19968: 0xD1C8, 39439 - 19968: 0xD1C9, 39449 - 19968: 0xF8BE, 39467 - 19968: 0xCBF6, 39472 - 19968: 0xD4F9, 39478 - 19968: 0xF5E2, 39479 - 19968: 0xE1D3, 39488 - 19968: 0xD8E9, 39491 - 19968: 0xF8FE, 39493 - 19968: 0xCFCC, 39501 - 19968: 0xFDA4, 39509 - 19968: 0xCEF6, 39511 - 19968: 0xFAD0, 39514 - 19968: 0xCCF3, 39515 - 19968: 0xE6BE, 39519 - 19968: 0xF6AE, 39522 - 19968: 0xD5F0, 39525 - 19968: 0xD1CA, 39529 - 19968: 0xFCBE, 39530 - 19968: 0xD5F1, 39592 - 19968: 0xCDE9, 39608 - 19968: 0xFAB5, 39635 - 19968: 0xE2D0, 39636 - 19968: 0xF4F7, 39640 - 19968: 0xCDD4, 39653 - 19968: 0xE7A3, 39662 - 19968: 0xDBA5, 39706 - 19968: 0xE2D1, 39719 - 19968: 0xD7A2, 39722 - 19968: 0xF7E3, 39729 - 19968: 0xEAA6, 39740 - 19968: 0xD0A1, 39745 - 19968: 0xCEDA, 39746 - 19968: 0xFBEB, 39747 - 19968: 0xDBA6, 39748 - 19968: 0xDBDE, 39749 - 19968: 0xD8E5, 39759 - 19968: 0xEAE0, 39764 - 19968: 0xD8AA, 39770 - 19968: 0xE5E0, 39791 - 19968: 0xD6DB, 39822 - 19968: 0xEFC6, 39825 - 19968: 0xF8EA, 39839 - 19968: 0xE4D5, 39851 - 19968: 0xCEF7, 39854 - 19968: 0xE0D8, 39881 - 19968: 0xD7EF, 39894 - 19968: 0xF4ED, 39908 - 19968: 0xCDE6, 39912 - 19968: 0xCCF4, 39949 - 19968: 0xF5E3, 39952 - 19968: 0xE4CA, 39954 - 19968: 0xDCE1, 39957 - 19968: 0xF9C8, 39973 - 19968: 0xFCBF, 39986 - 19968: 0xE8A7, 39995 - 19968: 0xD8C4, 40007 - 19968: 0xCBBE, 40009 - 19968: 0xDCAE, 40023 - 19968: 0xD7F7, 40165 - 19968: 0xF0E8, 40167 - 19968: 0xDDC0, 40169 - 19968: 0xCFCD, 40179 - 19968: 0xDCF3, 40180 - 19968: 0xD9B0, 40182 - 19968: 0xE6E9, 40201 - 19968: 0xE4BC, 40219 - 19968: 0xEAC4, 40230 - 19968: 0xE4EC, 40232 - 19968: 0xE4E5, 40251 - 19968: 0xFBF8, 40273 - 19968: 0xCCBB, 40285 - 19968: 0xE4BD, 40288 - 19968: 0xCDDC, 40289 - 19968: 0xD9F7, 40300 - 19968: 0xDDDF, 40306 - 19968: 0xEDCE, 40361 - 19968: 0xD9D0, 40367 - 19968: 0xE5A3, 40372 - 19968: 0xF9CD, 40388 - 19968: 0xCDAE, 40407 - 19968: 0xCFCE, 40434 - 19968: 0xF6AF, 40440 - 19968: 0xFDD3, 40441 - 19968: 0xEBED, 40442 - 19968: 0xD6DC, 40474 - 19968: 0xE5A4, 40478 - 19968: 0xD5B6, 40565 - 19968: 0xD6DD, 40569 - 19968: 0xF9E9, 40573 - 19968: 0xE7A4, 40575 - 19968: 0xD6E3, 40594 - 19968: 0xD1CB, 40595 - 19968: 0xD6E4, 40599 - 19968: 0xD5F2, 40605 - 19968: 0xDEFA, 40607 - 19968: 0xD7F8, 40613 - 19968: 0xD8EA, 40628 - 19968: 0xCFD5, 40629 - 19968: 0xD8FD, 40635 - 19968: 0xD8AB, 40638 - 19968: 0xFDCB, 40643 - 19968: 0xFCDC, 40653 - 19968: 0xE0A8, 40654 - 19968: 0xD5F3, 40657 - 19968: 0xFDD9, 40660 - 19968: 0xCCA3, 40664 - 19968: 0xD9F9, 40667 - 19968: 0xD3EA, 40668 - 19968: 0xF5F5, 40670 - 19968: 0xEFC7, 40680 - 19968: 0xD3DA, 40692 - 19968: 0xDABD, 40711 - 19968: 0xE8A8, 40712 - 19968: 0xDCAF, 40718 - 19968: 0xF0A3, 40723 - 19968: 0xCDD5, 40736 - 19968: 0xE0A9, 40763 - 19968: 0xDEAC, 40778 - 19968: 0xF0BA, 40779 - 19968: 0xEEB1, 40782 - 19968: 0xEEB2, 40786 - 19968: 0xF6CD, 40799 - 19968: 0xEED2, 40801 - 19968: 0xD6C6, 40807 - 19968: 0xE0E5, 40810 - 19968: 0xF3BB, 40812 - 19968: 0xE5E1, 40823 - 19968: 0xE4CB, 40845 - 19968: 0xD7A3, 40848 - 19968: 0xDBC2, 40853 - 19968: 0xCAFE, 40860 - 19968: 0xCFCF, } const encode1Low, encode1High = 44032, 55204 var encode1 = [...]uint16{ 44032 - 44032: 0xB0A1, 44033 - 44032: 0xB0A2, 44034 - 44032: 0x8141, 44035 - 44032: 0x8142, 44036 - 44032: 0xB0A3, 44037 - 44032: 0x8143, 44038 - 44032: 0x8144, 44039 - 44032: 0xB0A4, 44040 - 44032: 0xB0A5, 44041 - 44032: 0xB0A6, 44042 - 44032: 0xB0A7, 44043 - 44032: 0x8145, 44044 - 44032: 0x8146, 44045 - 44032: 0x8147, 44046 - 44032: 0x8148, 44047 - 44032: 0x8149, 44048 - 44032: 0xB0A8, 44049 - 44032: 0xB0A9, 44050 - 44032: 0xB0AA, 44051 - 44032: 0xB0AB, 44052 - 44032: 0xB0AC, 44053 - 44032: 0xB0AD, 44054 - 44032: 0xB0AE, 44055 - 44032: 0xB0AF, 44056 - 44032: 0x814A, 44057 - 44032: 0xB0B0, 44058 - 44032: 0xB0B1, 44059 - 44032: 0xB0B2, 44060 - 44032: 0xB0B3, 44061 - 44032: 0xB0B4, 44062 - 44032: 0x814B, 44063 - 44032: 0x814C, 44064 - 44032: 0xB0B5, 44065 - 44032: 0x814D, 44066 - 44032: 0x814E, 44067 - 44032: 0x814F, 44068 - 44032: 0xB0B6, 44069 - 44032: 0x8150, 44070 - 44032: 0x8151, 44071 - 44032: 0x8152, 44072 - 44032: 0x8153, 44073 - 44032: 0x8154, 44074 - 44032: 0x8155, 44075 - 44032: 0x8156, 44076 - 44032: 0xB0B7, 44077 - 44032: 0xB0B8, 44078 - 44032: 0x8157, 44079 - 44032: 0xB0B9, 44080 - 44032: 0xB0BA, 44081 - 44032: 0xB0BB, 44082 - 44032: 0x8158, 44083 - 44032: 0x8159, 44084 - 44032: 0x815A, 44085 - 44032: 0x8161, 44086 - 44032: 0x8162, 44087 - 44032: 0x8163, 44088 - 44032: 0xB0BC, 44089 - 44032: 0xB0BD, 44090 - 44032: 0x8164, 44091 - 44032: 0x8165, 44092 - 44032: 0xB0BE, 44093 - 44032: 0x8166, 44094 - 44032: 0x8167, 44095 - 44032: 0x8168, 44096 - 44032: 0xB0BF, 44097 - 44032: 0x8169, 44098 - 44032: 0x816A, 44099 - 44032: 0x816B, 44100 - 44032: 0x816C, 44101 - 44032: 0x816D, 44102 - 44032: 0x816E, 44103 - 44032: 0x816F, 44104 - 44032: 0x8170, 44105 - 44032: 0x8171, 44106 - 44032: 0x8172, 44107 - 44032: 0xB0C0, 44108 - 44032: 0x8173, 44109 - 44032: 0xB0C1, 44110 - 44032: 0x8174, 44111 - 44032: 0x8175, 44112 - 44032: 0x8176, 44113 - 44032: 0x8177, 44114 - 44032: 0x8178, 44115 - 44032: 0x8179, 44116 - 44032: 0xB0C2, 44117 - 44032: 0x817A, 44118 - 44032: 0x8181, 44119 - 44032: 0x8182, 44120 - 44032: 0xB0C3, 44121 - 44032: 0x8183, 44122 - 44032: 0x8184, 44123 - 44032: 0x8185, 44124 - 44032: 0xB0C4, 44125 - 44032: 0x8186, 44126 - 44032: 0x8187, 44127 - 44032: 0x8188, 44128 - 44032: 0x8189, 44129 - 44032: 0x818A, 44130 - 44032: 0x818B, 44131 - 44032: 0x818C, 44132 - 44032: 0x818D, 44133 - 44032: 0x818E, 44134 - 44032: 0x818F, 44135 - 44032: 0x8190, 44136 - 44032: 0x8191, 44137 - 44032: 0x8192, 44138 - 44032: 0x8193, 44139 - 44032: 0x8194, 44140 - 44032: 0x8195, 44141 - 44032: 0x8196, 44142 - 44032: 0x8197, 44143 - 44032: 0x8198, 44144 - 44032: 0xB0C5, 44145 - 44032: 0xB0C6, 44146 - 44032: 0x8199, 44147 - 44032: 0x819A, 44148 - 44032: 0xB0C7, 44149 - 44032: 0x819B, 44150 - 44032: 0x819C, 44151 - 44032: 0xB0C8, 44152 - 44032: 0xB0C9, 44153 - 44032: 0x819D, 44154 - 44032: 0xB0CA, 44155 - 44032: 0x819E, 44156 - 44032: 0x819F, 44157 - 44032: 0x81A0, 44158 - 44032: 0x81A1, 44159 - 44032: 0x81A2, 44160 - 44032: 0xB0CB, 44161 - 44032: 0xB0CC, 44162 - 44032: 0x81A3, 44163 - 44032: 0xB0CD, 44164 - 44032: 0xB0CE, 44165 - 44032: 0xB0CF, 44166 - 44032: 0xB0D0, 44167 - 44032: 0x81A4, 44168 - 44032: 0x81A5, 44169 - 44032: 0xB0D1, 44170 - 44032: 0xB0D2, 44171 - 44032: 0xB0D3, 44172 - 44032: 0xB0D4, 44173 - 44032: 0x81A6, 44174 - 44032: 0x81A7, 44175 - 44032: 0x81A8, 44176 - 44032: 0xB0D5, 44177 - 44032: 0x81A9, 44178 - 44032: 0x81AA, 44179 - 44032: 0x81AB, 44180 - 44032: 0xB0D6, 44181 - 44032: 0x81AC, 44182 - 44032: 0x81AD, 44183 - 44032: 0x81AE, 44184 - 44032: 0x81AF, 44185 - 44032: 0x81B0, 44186 - 44032: 0x81B1, 44187 - 44032: 0x81B2, 44188 - 44032: 0xB0D7, 44189 - 44032: 0xB0D8, 44190 - 44032: 0x81B3, 44191 - 44032: 0xB0D9, 44192 - 44032: 0xB0DA, 44193 - 44032: 0xB0DB, 44194 - 44032: 0x81B4, 44195 - 44032: 0x81B5, 44196 - 44032: 0x81B6, 44197 - 44032: 0x81B7, 44198 - 44032: 0x81B8, 44199 - 44032: 0x81B9, 44200 - 44032: 0xB0DC, 44201 - 44032: 0xB0DD, 44202 - 44032: 0xB0DE, 44203 - 44032: 0x81BA, 44204 - 44032: 0xB0DF, 44205 - 44032: 0x81BB, 44206 - 44032: 0x81BC, 44207 - 44032: 0xB0E0, 44208 - 44032: 0xB0E1, 44209 - 44032: 0x81BD, 44210 - 44032: 0x81BE, 44211 - 44032: 0x81BF, 44212 - 44032: 0x81C0, 44213 - 44032: 0x81C1, 44214 - 44032: 0x81C2, 44215 - 44032: 0x81C3, 44216 - 44032: 0xB0E2, 44217 - 44032: 0xB0E3, 44218 - 44032: 0x81C4, 44219 - 44032: 0xB0E4, 44220 - 44032: 0xB0E5, 44221 - 44032: 0xB0E6, 44222 - 44032: 0x81C5, 44223 - 44032: 0x81C6, 44224 - 44032: 0x81C7, 44225 - 44032: 0xB0E7, 44226 - 44032: 0x81C8, 44227 - 44032: 0x81C9, 44228 - 44032: 0xB0E8, 44229 - 44032: 0x81CA, 44230 - 44032: 0x81CB, 44231 - 44032: 0x81CC, 44232 - 44032: 0xB0E9, 44233 - 44032: 0x81CD, 44234 - 44032: 0x81CE, 44235 - 44032: 0x81CF, 44236 - 44032: 0xB0EA, 44237 - 44032: 0x81D0, 44238 - 44032: 0x81D1, 44239 - 44032: 0x81D2, 44240 - 44032: 0x81D3, 44241 - 44032: 0x81D4, 44242 - 44032: 0x81D5, 44243 - 44032: 0x81D6, 44244 - 44032: 0x81D7, 44245 - 44032: 0xB0EB, 44246 - 44032: 0x81D8, 44247 - 44032: 0xB0EC, 44248 - 44032: 0x81D9, 44249 - 44032: 0x81DA, 44250 - 44032: 0x81DB, 44251 - 44032: 0x81DC, 44252 - 44032: 0x81DD, 44253 - 44032: 0x81DE, 44254 - 44032: 0x81DF, 44255 - 44032: 0x81E0, 44256 - 44032: 0xB0ED, 44257 - 44032: 0xB0EE, 44258 - 44032: 0x81E1, 44259 - 44032: 0x81E2, 44260 - 44032: 0xB0EF, 44261 - 44032: 0x81E3, 44262 - 44032: 0x81E4, 44263 - 44032: 0xB0F0, 44264 - 44032: 0xB0F1, 44265 - 44032: 0x81E5, 44266 - 44032: 0xB0F2, 44267 - 44032: 0x81E6, 44268 - 44032: 0xB0F3, 44269 - 44032: 0x81E7, 44270 - 44032: 0x81E8, 44271 - 44032: 0xB0F4, 44272 - 44032: 0xB0F5, 44273 - 44032: 0xB0F6, 44274 - 44032: 0x81E9, 44275 - 44032: 0xB0F7, 44276 - 44032: 0x81EA, 44277 - 44032: 0xB0F8, 44278 - 44032: 0xB0F9, 44279 - 44032: 0x81EB, 44280 - 44032: 0x81EC, 44281 - 44032: 0x81ED, 44282 - 44032: 0x81EE, 44283 - 44032: 0x81EF, 44284 - 44032: 0xB0FA, 44285 - 44032: 0xB0FB, 44286 - 44032: 0x81F0, 44287 - 44032: 0x81F1, 44288 - 44032: 0xB0FC, 44289 - 44032: 0x81F2, 44290 - 44032: 0x81F3, 44291 - 44032: 0x81F4, 44292 - 44032: 0xB0FD, 44293 - 44032: 0x81F5, 44294 - 44032: 0xB0FE, 44295 - 44032: 0x81F6, 44296 - 44032: 0x81F7, 44297 - 44032: 0x81F8, 44298 - 44032: 0x81F9, 44299 - 44032: 0x81FA, 44300 - 44032: 0xB1A1, 44301 - 44032: 0xB1A2, 44302 - 44032: 0x81FB, 44303 - 44032: 0xB1A3, 44304 - 44032: 0x81FC, 44305 - 44032: 0xB1A4, 44306 - 44032: 0x81FD, 44307 - 44032: 0x81FE, 44308 - 44032: 0x8241, 44309 - 44032: 0x8242, 44310 - 44032: 0x8243, 44311 - 44032: 0x8244, 44312 - 44032: 0xB1A5, 44313 - 44032: 0x8245, 44314 - 44032: 0x8246, 44315 - 44032: 0x8247, 44316 - 44032: 0xB1A6, 44317 - 44032: 0x8248, 44318 - 44032: 0x8249, 44319 - 44032: 0x824A, 44320 - 44032: 0xB1A7, 44321 - 44032: 0x824B, 44322 - 44032: 0x824C, 44323 - 44032: 0x824D, 44324 - 44032: 0x824E, 44325 - 44032: 0x824F, 44326 - 44032: 0x8250, 44327 - 44032: 0x8251, 44328 - 44032: 0x8252, 44329 - 44032: 0xB1A8, 44330 - 44032: 0x8253, 44331 - 44032: 0x8254, 44332 - 44032: 0xB1A9, 44333 - 44032: 0xB1AA, 44334 - 44032: 0x8255, 44335 - 44032: 0x8256, 44336 - 44032: 0x8257, 44337 - 44032: 0x8258, 44338 - 44032: 0x8259, 44339 - 44032: 0x825A, 44340 - 44032: 0xB1AB, 44341 - 44032: 0xB1AC, 44342 - 44032: 0x8261, 44343 - 44032: 0x8262, 44344 - 44032: 0xB1AD, 44345 - 44032: 0x8263, 44346 - 44032: 0x8264, 44347 - 44032: 0x8265, 44348 - 44032: 0xB1AE, 44349 - 44032: 0x8266, 44350 - 44032: 0x8267, 44351 - 44032: 0x8268, 44352 - 44032: 0x8269, 44353 - 44032: 0x826A, 44354 - 44032: 0x826B, 44355 - 44032: 0x826C, 44356 - 44032: 0xB1AF, 44357 - 44032: 0xB1B0, 44358 - 44032: 0x826D, 44359 - 44032: 0xB1B1, 44360 - 44032: 0x826E, 44361 - 44032: 0xB1B2, 44362 - 44032: 0x826F, 44363 - 44032: 0x8270, 44364 - 44032: 0x8271, 44365 - 44032: 0x8272, 44366 - 44032: 0x8273, 44367 - 44032: 0x8274, 44368 - 44032: 0xB1B3, 44369 - 44032: 0x8275, 44370 - 44032: 0x8276, 44371 - 44032: 0x8277, 44372 - 44032: 0xB1B4, 44373 - 44032: 0x8278, 44374 - 44032: 0x8279, 44375 - 44032: 0x827A, 44376 - 44032: 0xB1B5, 44377 - 44032: 0x8281, 44378 - 44032: 0x8282, 44379 - 44032: 0x8283, 44380 - 44032: 0x8284, 44381 - 44032: 0x8285, 44382 - 44032: 0x8286, 44383 - 44032: 0x8287, 44384 - 44032: 0x8288, 44385 - 44032: 0xB1B6, 44386 - 44032: 0x8289, 44387 - 44032: 0xB1B7, 44388 - 44032: 0x828A, 44389 - 44032: 0x828B, 44390 - 44032: 0x828C, 44391 - 44032: 0x828D, 44392 - 44032: 0x828E, 44393 - 44032: 0x828F, 44394 - 44032: 0x8290, 44395 - 44032: 0x8291, 44396 - 44032: 0xB1B8, 44397 - 44032: 0xB1B9, 44398 - 44032: 0x8292, 44399 - 44032: 0x8293, 44400 - 44032: 0xB1BA, 44401 - 44032: 0x8294, 44402 - 44032: 0x8295, 44403 - 44032: 0xB1BB, 44404 - 44032: 0xB1BC, 44405 - 44032: 0xB1BD, 44406 - 44032: 0xB1BE, 44407 - 44032: 0x8296, 44408 - 44032: 0x8297, 44409 - 44032: 0x8298, 44410 - 44032: 0x8299, 44411 - 44032: 0xB1BF, 44412 - 44032: 0xB1C0, 44413 - 44032: 0xB1C1, 44414 - 44032: 0x829A, 44415 - 44032: 0xB1C2, 44416 - 44032: 0x829B, 44417 - 44032: 0xB1C3, 44418 - 44032: 0xB1C4, 44419 - 44032: 0x829C, 44420 - 44032: 0x829D, 44421 - 44032: 0x829E, 44422 - 44032: 0x829F, 44423 - 44032: 0x82A0, 44424 - 44032: 0xB1C5, 44425 - 44032: 0xB1C6, 44426 - 44032: 0x82A1, 44427 - 44032: 0x82A2, 44428 - 44032: 0xB1C7, 44429 - 44032: 0x82A3, 44430 - 44032: 0x82A4, 44431 - 44032: 0x82A5, 44432 - 44032: 0xB1C8, 44433 - 44032: 0x82A6, 44434 - 44032: 0x82A7, 44435 - 44032: 0x82A8, 44436 - 44032: 0x82A9, 44437 - 44032: 0x82AA, 44438 - 44032: 0x82AB, 44439 - 44032: 0x82AC, 44440 - 44032: 0x82AD, 44441 - 44032: 0x82AE, 44442 - 44032: 0x82AF, 44443 - 44032: 0x82B0, 44444 - 44032: 0xB1C9, 44445 - 44032: 0xB1CA, 44446 - 44032: 0x82B1, 44447 - 44032: 0x82B2, 44448 - 44032: 0x82B3, 44449 - 44032: 0x82B4, 44450 - 44032: 0x82B5, 44451 - 44032: 0x82B6, 44452 - 44032: 0xB1CB, 44453 - 44032: 0x82B7, 44454 - 44032: 0x82B8, 44455 - 44032: 0x82B9, 44456 - 44032: 0x82BA, 44457 - 44032: 0x82BB, 44458 - 44032: 0x82BC, 44459 - 44032: 0x82BD, 44460 - 44032: 0x82BE, 44461 - 44032: 0x82BF, 44462 - 44032: 0x82C0, 44463 - 44032: 0x82C1, 44464 - 44032: 0x82C2, 44465 - 44032: 0x82C3, 44466 - 44032: 0x82C4, 44467 - 44032: 0x82C5, 44468 - 44032: 0x82C6, 44469 - 44032: 0x82C7, 44470 - 44032: 0x82C8, 44471 - 44032: 0xB1CC, 44472 - 44032: 0x82C9, 44473 - 44032: 0x82CA, 44474 - 44032: 0x82CB, 44475 - 44032: 0x82CC, 44476 - 44032: 0x82CD, 44477 - 44032: 0x82CE, 44478 - 44032: 0x82CF, 44479 - 44032: 0x82D0, 44480 - 44032: 0xB1CD, 44481 - 44032: 0xB1CE, 44482 - 44032: 0x82D1, 44483 - 44032: 0x82D2, 44484 - 44032: 0xB1CF, 44485 - 44032: 0x82D3, 44486 - 44032: 0x82D4, 44487 - 44032: 0x82D5, 44488 - 44032: 0xB1D0, 44489 - 44032: 0x82D6, 44490 - 44032: 0x82D7, 44491 - 44032: 0x82D8, 44492 - 44032: 0x82D9, 44493 - 44032: 0x82DA, 44494 - 44032: 0x82DB, 44495 - 44032: 0x82DC, 44496 - 44032: 0xB1D1, 44497 - 44032: 0xB1D2, 44498 - 44032: 0x82DD, 44499 - 44032: 0xB1D3, 44500 - 44032: 0x82DE, 44501 - 44032: 0x82DF, 44502 - 44032: 0x82E0, 44503 - 44032: 0x82E1, 44504 - 44032: 0x82E2, 44505 - 44032: 0x82E3, 44506 - 44032: 0x82E4, 44507 - 44032: 0x82E5, 44508 - 44032: 0xB1D4, 44509 - 44032: 0x82E6, 44510 - 44032: 0x82E7, 44511 - 44032: 0x82E8, 44512 - 44032: 0xB1D5, 44513 - 44032: 0x82E9, 44514 - 44032: 0x82EA, 44515 - 44032: 0x82EB, 44516 - 44032: 0xB1D6, 44517 - 44032: 0x82EC, 44518 - 44032: 0x82ED, 44519 - 44032: 0x82EE, 44520 - 44032: 0x82EF, 44521 - 44032: 0x82F0, 44522 - 44032: 0x82F1, 44523 - 44032: 0x82F2, 44524 - 44032: 0x82F3, 44525 - 44032: 0x82F4, 44526 - 44032: 0x82F5, 44527 - 44032: 0x82F6, 44528 - 44032: 0x82F7, 44529 - 44032: 0x82F8, 44530 - 44032: 0x82F9, 44531 - 44032: 0x82FA, 44532 - 44032: 0x82FB, 44533 - 44032: 0x82FC, 44534 - 44032: 0x82FD, 44535 - 44032: 0x82FE, 44536 - 44032: 0xB1D7, 44537 - 44032: 0xB1D8, 44538 - 44032: 0x8341, 44539 - 44032: 0x8342, 44540 - 44032: 0xB1D9, 44541 - 44032: 0x8343, 44542 - 44032: 0x8344, 44543 - 44032: 0xB1DA, 44544 - 44032: 0xB1DB, 44545 - 44032: 0xB1DC, 44546 - 44032: 0x8345, 44547 - 44032: 0x8346, 44548 - 44032: 0x8347, 44549 - 44032: 0x8348, 44550 - 44032: 0x8349, 44551 - 44032: 0x834A, 44552 - 44032: 0xB1DD, 44553 - 44032: 0xB1DE, 44554 - 44032: 0x834B, 44555 - 44032: 0xB1DF, 44556 - 44032: 0x834C, 44557 - 44032: 0xB1E0, 44558 - 44032: 0x834D, 44559 - 44032: 0x834E, 44560 - 44032: 0x834F, 44561 - 44032: 0x8350, 44562 - 44032: 0x8351, 44563 - 44032: 0x8352, 44564 - 44032: 0xB1E1, 44565 - 44032: 0x8353, 44566 - 44032: 0x8354, 44567 - 44032: 0x8355, 44568 - 44032: 0x8356, 44569 - 44032: 0x8357, 44570 - 44032: 0x8358, 44571 - 44032: 0x8359, 44572 - 44032: 0x835A, 44573 - 44032: 0x8361, 44574 - 44032: 0x8362, 44575 - 44032: 0x8363, 44576 - 44032: 0x8364, 44577 - 44032: 0x8365, 44578 - 44032: 0x8366, 44579 - 44032: 0x8367, 44580 - 44032: 0x8368, 44581 - 44032: 0x8369, 44582 - 44032: 0x836A, 44583 - 44032: 0x836B, 44584 - 44032: 0x836C, 44585 - 44032: 0x836D, 44586 - 44032: 0x836E, 44587 - 44032: 0x836F, 44588 - 44032: 0x8370, 44589 - 44032: 0x8371, 44590 - 44032: 0x8372, 44591 - 44032: 0x8373, 44592 - 44032: 0xB1E2, 44593 - 44032: 0xB1E3, 44594 - 44032: 0x8374, 44595 - 44032: 0x8375, 44596 - 44032: 0xB1E4, 44597 - 44032: 0x8376, 44598 - 44032: 0x8377, 44599 - 44032: 0xB1E5, 44600 - 44032: 0xB1E6, 44601 - 44032: 0x8378, 44602 - 44032: 0xB1E7, 44603 - 44032: 0x8379, 44604 - 44032: 0x837A, 44605 - 44032: 0x8381, 44606 - 44032: 0x8382, 44607 - 44032: 0x8383, 44608 - 44032: 0xB1E8, 44609 - 44032: 0xB1E9, 44610 - 44032: 0x8384, 44611 - 44032: 0xB1EA, 44612 - 44032: 0x8385, 44613 - 44032: 0xB1EB, 44614 - 44032: 0xB1EC, 44615 - 44032: 0x8386, 44616 - 44032: 0x8387, 44617 - 44032: 0x8388, 44618 - 44032: 0xB1ED, 44619 - 44032: 0x8389, 44620 - 44032: 0xB1EE, 44621 - 44032: 0xB1EF, 44622 - 44032: 0xB1F0, 44623 - 44032: 0x838A, 44624 - 44032: 0xB1F1, 44625 - 44032: 0x838B, 44626 - 44032: 0x838C, 44627 - 44032: 0x838D, 44628 - 44032: 0xB1F2, 44629 - 44032: 0x838E, 44630 - 44032: 0xB1F3, 44631 - 44032: 0x838F, 44632 - 44032: 0x8390, 44633 - 44032: 0x8391, 44634 - 44032: 0x8392, 44635 - 44032: 0x8393, 44636 - 44032: 0xB1F4, 44637 - 44032: 0xB1F5, 44638 - 44032: 0x8394, 44639 - 44032: 0xB1F6, 44640 - 44032: 0xB1F7, 44641 - 44032: 0xB1F8, 44642 - 44032: 0x8395, 44643 - 44032: 0x8396, 44644 - 44032: 0x8397, 44645 - 44032: 0xB1F9, 44646 - 44032: 0x8398, 44647 - 44032: 0x8399, 44648 - 44032: 0xB1FA, 44649 - 44032: 0xB1FB, 44650 - 44032: 0x839A, 44651 - 44032: 0x839B, 44652 - 44032: 0xB1FC, 44653 - 44032: 0x839C, 44654 - 44032: 0x839D, 44655 - 44032: 0x839E, 44656 - 44032: 0xB1FD, 44657 - 44032: 0x839F, 44658 - 44032: 0x83A0, 44659 - 44032: 0x83A1, 44660 - 44032: 0x83A2, 44661 - 44032: 0x83A3, 44662 - 44032: 0x83A4, 44663 - 44032: 0x83A5, 44664 - 44032: 0xB1FE, 44665 - 44032: 0xB2A1, 44666 - 44032: 0x83A6, 44667 - 44032: 0xB2A2, 44668 - 44032: 0xB2A3, 44669 - 44032: 0xB2A4, 44670 - 44032: 0x83A7, 44671 - 44032: 0x83A8, 44672 - 44032: 0x83A9, 44673 - 44032: 0x83AA, 44674 - 44032: 0x83AB, 44675 - 44032: 0x83AC, 44676 - 44032: 0xB2A5, 44677 - 44032: 0xB2A6, 44678 - 44032: 0x83AD, 44679 - 44032: 0x83AE, 44680 - 44032: 0x83AF, 44681 - 44032: 0x83B0, 44682 - 44032: 0x83B1, 44683 - 44032: 0x83B2, 44684 - 44032: 0xB2A7, 44685 - 44032: 0x83B3, 44686 - 44032: 0x83B4, 44687 - 44032: 0x83B5, 44688 - 44032: 0x83B6, 44689 - 44032: 0x83B7, 44690 - 44032: 0x83B8, 44691 - 44032: 0x83B9, 44692 - 44032: 0x83BA, 44693 - 44032: 0x83BB, 44694 - 44032: 0x83BC, 44695 - 44032: 0x83BD, 44696 - 44032: 0x83BE, 44697 - 44032: 0x83BF, 44698 - 44032: 0x83C0, 44699 - 44032: 0x83C1, 44700 - 44032: 0x83C2, 44701 - 44032: 0x83C3, 44702 - 44032: 0x83C4, 44703 - 44032: 0x83C5, 44704 - 44032: 0x83C6, 44705 - 44032: 0x83C7, 44706 - 44032: 0x83C8, 44707 - 44032: 0x83C9, 44708 - 44032: 0x83CA, 44709 - 44032: 0x83CB, 44710 - 44032: 0x83CC, 44711 - 44032: 0x83CD, 44712 - 44032: 0x83CE, 44713 - 44032: 0x83CF, 44714 - 44032: 0x83D0, 44715 - 44032: 0x83D1, 44716 - 44032: 0x83D2, 44717 - 44032: 0x83D3, 44718 - 44032: 0x83D4, 44719 - 44032: 0x83D5, 44720 - 44032: 0x83D6, 44721 - 44032: 0x83D7, 44722 - 44032: 0x83D8, 44723 - 44032: 0x83D9, 44724 - 44032: 0x83DA, 44725 - 44032: 0x83DB, 44726 - 44032: 0x83DC, 44727 - 44032: 0x83DD, 44728 - 44032: 0x83DE, 44729 - 44032: 0x83DF, 44730 - 44032: 0x83E0, 44731 - 44032: 0x83E1, 44732 - 44032: 0xB2A8, 44733 - 44032: 0xB2A9, 44734 - 44032: 0xB2AA, 44735 - 44032: 0x83E2, 44736 - 44032: 0xB2AB, 44737 - 44032: 0x83E3, 44738 - 44032: 0x83E4, 44739 - 44032: 0x83E5, 44740 - 44032: 0xB2AC, 44741 - 44032: 0x83E6, 44742 - 44032: 0x83E7, 44743 - 44032: 0x83E8, 44744 - 44032: 0x83E9, 44745 - 44032: 0x83EA, 44746 - 44032: 0x83EB, 44747 - 44032: 0x83EC, 44748 - 44032: 0xB2AD, 44749 - 44032: 0xB2AE, 44750 - 44032: 0x83ED, 44751 - 44032: 0xB2AF, 44752 - 44032: 0xB2B0, 44753 - 44032: 0xB2B1, 44754 - 44032: 0x83EE, 44755 - 44032: 0x83EF, 44756 - 44032: 0x83F0, 44757 - 44032: 0x83F1, 44758 - 44032: 0x83F2, 44759 - 44032: 0x83F3, 44760 - 44032: 0xB2B2, 44761 - 44032: 0xB2B3, 44762 - 44032: 0x83F4, 44763 - 44032: 0x83F5, 44764 - 44032: 0xB2B4, 44765 - 44032: 0x83F6, 44766 - 44032: 0x83F7, 44767 - 44032: 0x83F8, 44768 - 44032: 0x83F9, 44769 - 44032: 0x83FA, 44770 - 44032: 0x83FB, 44771 - 44032: 0x83FC, 44772 - 44032: 0x83FD, 44773 - 44032: 0x83FE, 44774 - 44032: 0x8441, 44775 - 44032: 0x8442, 44776 - 44032: 0xB2B5, 44777 - 44032: 0x8443, 44778 - 44032: 0x8444, 44779 - 44032: 0xB2B6, 44780 - 44032: 0x8445, 44781 - 44032: 0xB2B7, 44782 - 44032: 0x8446, 44783 - 44032: 0x8447, 44784 - 44032: 0x8448, 44785 - 44032: 0x8449, 44786 - 44032: 0x844A, 44787 - 44032: 0x844B, 44788 - 44032: 0xB2B8, 44789 - 44032: 0x844C, 44790 - 44032: 0x844D, 44791 - 44032: 0x844E, 44792 - 44032: 0xB2B9, 44793 - 44032: 0x844F, 44794 - 44032: 0x8450, 44795 - 44032: 0x8451, 44796 - 44032: 0xB2BA, 44797 - 44032: 0x8452, 44798 - 44032: 0x8453, 44799 - 44032: 0x8454, 44800 - 44032: 0x8455, 44801 - 44032: 0x8456, 44802 - 44032: 0x8457, 44803 - 44032: 0x8458, 44804 - 44032: 0x8459, 44805 - 44032: 0x845A, 44806 - 44032: 0x8461, 44807 - 44032: 0xB2BB, 44808 - 44032: 0xB2BC, 44809 - 44032: 0x8462, 44810 - 44032: 0x8463, 44811 - 44032: 0x8464, 44812 - 44032: 0x8465, 44813 - 44032: 0xB2BD, 44814 - 44032: 0x8466, 44815 - 44032: 0x8467, 44816 - 44032: 0xB2BE, 44817 - 44032: 0x8468, 44818 - 44032: 0x8469, 44819 - 44032: 0x846A, 44820 - 44032: 0x846B, 44821 - 44032: 0x846C, 44822 - 44032: 0x846D, 44823 - 44032: 0x846E, 44824 - 44032: 0x846F, 44825 - 44032: 0x8470, 44826 - 44032: 0x8471, 44827 - 44032: 0x8472, 44828 - 44032: 0x8473, 44829 - 44032: 0x8474, 44830 - 44032: 0x8475, 44831 - 44032: 0x8476, 44832 - 44032: 0x8477, 44833 - 44032: 0x8478, 44834 - 44032: 0x8479, 44835 - 44032: 0x847A, 44836 - 44032: 0x8481, 44837 - 44032: 0x8482, 44838 - 44032: 0x8483, 44839 - 44032: 0x8484, 44840 - 44032: 0x8485, 44841 - 44032: 0x8486, 44842 - 44032: 0x8487, 44843 - 44032: 0x8488, 44844 - 44032: 0xB2BF, 44845 - 44032: 0xB2C0, 44846 - 44032: 0x8489, 44847 - 44032: 0x848A, 44848 - 44032: 0xB2C1, 44849 - 44032: 0x848B, 44850 - 44032: 0xB2C2, 44851 - 44032: 0x848C, 44852 - 44032: 0xB2C3, 44853 - 44032: 0x848D, 44854 - 44032: 0x848E, 44855 - 44032: 0x848F, 44856 - 44032: 0x8490, 44857 - 44032: 0x8491, 44858 - 44032: 0x8492, 44859 - 44032: 0x8493, 44860 - 44032: 0xB2C4, 44861 - 44032: 0xB2C5, 44862 - 44032: 0x8494, 44863 - 44032: 0xB2C6, 44864 - 44032: 0x8495, 44865 - 44032: 0xB2C7, 44866 - 44032: 0xB2C8, 44867 - 44032: 0xB2C9, 44868 - 44032: 0x8496, 44869 - 44032: 0x8497, 44870 - 44032: 0x8498, 44871 - 44032: 0x8499, 44872 - 44032: 0xB2CA, 44873 - 44032: 0xB2CB, 44874 - 44032: 0x849A, 44875 - 44032: 0x849B, 44876 - 44032: 0x849C, 44877 - 44032: 0x849D, 44878 - 44032: 0x849E, 44879 - 44032: 0x849F, 44880 - 44032: 0xB2CC, 44881 - 44032: 0x84A0, 44882 - 44032: 0x84A1, 44883 - 44032: 0x84A2, 44884 - 44032: 0x84A3, 44885 - 44032: 0x84A4, 44886 - 44032: 0x84A5, 44887 - 44032: 0x84A6, 44888 - 44032: 0x84A7, 44889 - 44032: 0x84A8, 44890 - 44032: 0x84A9, 44891 - 44032: 0x84AA, 44892 - 44032: 0xB2CD, 44893 - 44032: 0xB2CE, 44894 - 44032: 0x84AB, 44895 - 44032: 0x84AC, 44896 - 44032: 0x84AD, 44897 - 44032: 0x84AE, 44898 - 44032: 0x84AF, 44899 - 44032: 0x84B0, 44900 - 44032: 0xB2CF, 44901 - 44032: 0xB2D0, 44902 - 44032: 0x84B1, 44903 - 44032: 0x84B2, 44904 - 44032: 0x84B3, 44905 - 44032: 0x84B4, 44906 - 44032: 0x84B5, 44907 - 44032: 0x84B6, 44908 - 44032: 0x84B7, 44909 - 44032: 0x84B8, 44910 - 44032: 0x84B9, 44911 - 44032: 0x84BA, 44912 - 44032: 0x84BB, 44913 - 44032: 0x84BC, 44914 - 44032: 0x84BD, 44915 - 44032: 0x84BE, 44916 - 44032: 0x84BF, 44917 - 44032: 0x84C0, 44918 - 44032: 0x84C1, 44919 - 44032: 0x84C2, 44920 - 44032: 0x84C3, 44921 - 44032: 0xB2D1, 44922 - 44032: 0x84C4, 44923 - 44032: 0x84C5, 44924 - 44032: 0x84C6, 44925 - 44032: 0x84C7, 44926 - 44032: 0x84C8, 44927 - 44032: 0x84C9, 44928 - 44032: 0xB2D2, 44929 - 44032: 0x84CA, 44930 - 44032: 0x84CB, 44931 - 44032: 0x84CC, 44932 - 44032: 0xB2D3, 44933 - 44032: 0x84CD, 44934 - 44032: 0x84CE, 44935 - 44032: 0x84CF, 44936 - 44032: 0xB2D4, 44937 - 44032: 0x84D0, 44938 - 44032: 0x84D1, 44939 - 44032: 0x84D2, 44940 - 44032: 0x84D3, 44941 - 44032: 0x84D4, 44942 - 44032: 0x84D5, 44943 - 44032: 0x84D6, 44944 - 44032: 0xB2D5, 44945 - 44032: 0xB2D6, 44946 - 44032: 0x84D7, 44947 - 44032: 0x84D8, 44948 - 44032: 0x84D9, 44949 - 44032: 0xB2D7, 44950 - 44032: 0x84DA, 44951 - 44032: 0x84DB, 44952 - 44032: 0x84DC, 44953 - 44032: 0x84DD, 44954 - 44032: 0x84DE, 44955 - 44032: 0x84DF, 44956 - 44032: 0xB2D8, 44957 - 44032: 0x84E0, 44958 - 44032: 0x84E1, 44959 - 44032: 0x84E2, 44960 - 44032: 0x84E3, 44961 - 44032: 0x84E4, 44962 - 44032: 0x84E5, 44963 - 44032: 0x84E6, 44964 - 44032: 0x84E7, 44965 - 44032: 0x84E8, 44966 - 44032: 0x84E9, 44967 - 44032: 0x84EA, 44968 - 44032: 0x84EB, 44969 - 44032: 0x84EC, 44970 - 44032: 0x84ED, 44971 - 44032: 0x84EE, 44972 - 44032: 0x84EF, 44973 - 44032: 0x84F0, 44974 - 44032: 0x84F1, 44975 - 44032: 0x84F2, 44976 - 44032: 0x84F3, 44977 - 44032: 0x84F4, 44978 - 44032: 0x84F5, 44979 - 44032: 0x84F6, 44980 - 44032: 0x84F7, 44981 - 44032: 0x84F8, 44982 - 44032: 0x84F9, 44983 - 44032: 0x84FA, 44984 - 44032: 0xB2D9, 44985 - 44032: 0xB2DA, 44986 - 44032: 0x84FB, 44987 - 44032: 0x84FC, 44988 - 44032: 0xB2DB, 44989 - 44032: 0x84FD, 44990 - 44032: 0x84FE, 44991 - 44032: 0x8541, 44992 - 44032: 0xB2DC, 44993 - 44032: 0x8542, 44994 - 44032: 0x8543, 44995 - 44032: 0x8544, 44996 - 44032: 0x8545, 44997 - 44032: 0x8546, 44998 - 44032: 0x8547, 44999 - 44032: 0xB2DD, 45000 - 44032: 0xB2DE, 45001 - 44032: 0xB2DF, 45002 - 44032: 0x8548, 45003 - 44032: 0xB2E0, 45004 - 44032: 0x8549, 45005 - 44032: 0xB2E1, 45006 - 44032: 0xB2E2, 45007 - 44032: 0x854A, 45008 - 44032: 0x854B, 45009 - 44032: 0x854C, 45010 - 44032: 0x854D, 45011 - 44032: 0x854E, 45012 - 44032: 0xB2E3, 45013 - 44032: 0x854F, 45014 - 44032: 0x8550, 45015 - 44032: 0x8551, 45016 - 44032: 0x8552, 45017 - 44032: 0x8553, 45018 - 44032: 0x8554, 45019 - 44032: 0x8555, 45020 - 44032: 0xB2E4, 45021 - 44032: 0x8556, 45022 - 44032: 0x8557, 45023 - 44032: 0x8558, 45024 - 44032: 0x8559, 45025 - 44032: 0x855A, 45026 - 44032: 0x8561, 45027 - 44032: 0x8562, 45028 - 44032: 0x8563, 45029 - 44032: 0x8564, 45030 - 44032: 0x8565, 45031 - 44032: 0x8566, 45032 - 44032: 0xB2E5, 45033 - 44032: 0xB2E6, 45034 - 44032: 0x8567, 45035 - 44032: 0x8568, 45036 - 44032: 0x8569, 45037 - 44032: 0x856A, 45038 - 44032: 0x856B, 45039 - 44032: 0x856C, 45040 - 44032: 0xB2E7, 45041 - 44032: 0xB2E8, 45042 - 44032: 0x856D, 45043 - 44032: 0x856E, 45044 - 44032: 0xB2E9, 45045 - 44032: 0x856F, 45046 - 44032: 0x8570, 45047 - 44032: 0x8571, 45048 - 44032: 0xB2EA, 45049 - 44032: 0x8572, 45050 - 44032: 0x8573, 45051 - 44032: 0x8574, 45052 - 44032: 0x8575, 45053 - 44032: 0x8576, 45054 - 44032: 0x8577, 45055 - 44032: 0x8578, 45056 - 44032: 0xB2EB, 45057 - 44032: 0xB2EC, 45058 - 44032: 0x8579, 45059 - 44032: 0x857A, 45060 - 44032: 0xB2ED, 45061 - 44032: 0x8581, 45062 - 44032: 0x8582, 45063 - 44032: 0x8583, 45064 - 44032: 0x8584, 45065 - 44032: 0x8585, 45066 - 44032: 0x8586, 45067 - 44032: 0x8587, 45068 - 44032: 0xB2EE, 45069 - 44032: 0x8588, 45070 - 44032: 0x8589, 45071 - 44032: 0x858A, 45072 - 44032: 0xB2EF, 45073 - 44032: 0x858B, 45074 - 44032: 0x858C, 45075 - 44032: 0x858D, 45076 - 44032: 0xB2F0, 45077 - 44032: 0x858E, 45078 - 44032: 0x858F, 45079 - 44032: 0x8590, 45080 - 44032: 0x8591, 45081 - 44032: 0x8592, 45082 - 44032: 0x8593, 45083 - 44032: 0x8594, 45084 - 44032: 0xB2F1, 45085 - 44032: 0xB2F2, 45086 - 44032: 0x8595, 45087 - 44032: 0x8596, 45088 - 44032: 0x8597, 45089 - 44032: 0x8598, 45090 - 44032: 0x8599, 45091 - 44032: 0x859A, 45092 - 44032: 0x859B, 45093 - 44032: 0x859C, 45094 - 44032: 0x859D, 45095 - 44032: 0x859E, 45096 - 44032: 0xB2F3, 45097 - 44032: 0x859F, 45098 - 44032: 0x85A0, 45099 - 44032: 0x85A1, 45100 - 44032: 0x85A2, 45101 - 44032: 0x85A3, 45102 - 44032: 0x85A4, 45103 - 44032: 0x85A5, 45104 - 44032: 0x85A6, 45105 - 44032: 0x85A7, 45106 - 44032: 0x85A8, 45107 - 44032: 0x85A9, 45108 - 44032: 0x85AA, 45109 - 44032: 0x85AB, 45110 - 44032: 0x85AC, 45111 - 44032: 0x85AD, 45112 - 44032: 0x85AE, 45113 - 44032: 0x85AF, 45114 - 44032: 0x85B0, 45115 - 44032: 0x85B1, 45116 - 44032: 0x85B2, 45117 - 44032: 0x85B3, 45118 - 44032: 0x85B4, 45119 - 44032: 0x85B5, 45120 - 44032: 0x85B6, 45121 - 44032: 0x85B7, 45122 - 44032: 0x85B8, 45123 - 44032: 0x85B9, 45124 - 44032: 0xB2F4, 45125 - 44032: 0xB2F5, 45126 - 44032: 0x85BA, 45127 - 44032: 0x85BB, 45128 - 44032: 0xB2F6, 45129 - 44032: 0x85BC, 45130 - 44032: 0xB2F7, 45131 - 44032: 0x85BD, 45132 - 44032: 0xB2F8, 45133 - 44032: 0x85BE, 45134 - 44032: 0xB2F9, 45135 - 44032: 0x85BF, 45136 - 44032: 0x85C0, 45137 - 44032: 0x85C1, 45138 - 44032: 0x85C2, 45139 - 44032: 0xB2FA, 45140 - 44032: 0xB2FB, 45141 - 44032: 0xB2FC, 45142 - 44032: 0x85C3, 45143 - 44032: 0xB2FD, 45144 - 44032: 0x85C4, 45145 - 44032: 0xB2FE, 45146 - 44032: 0x85C5, 45147 - 44032: 0x85C6, 45148 - 44032: 0x85C7, 45149 - 44032: 0xB3A1, 45150 - 44032: 0x85C8, 45151 - 44032: 0x85C9, 45152 - 44032: 0x85CA, 45153 - 44032: 0x85CB, 45154 - 44032: 0x85CC, 45155 - 44032: 0x85CD, 45156 - 44032: 0x85CE, 45157 - 44032: 0x85CF, 45158 - 44032: 0x85D0, 45159 - 44032: 0x85D1, 45160 - 44032: 0x85D2, 45161 - 44032: 0x85D3, 45162 - 44032: 0x85D4, 45163 - 44032: 0x85D5, 45164 - 44032: 0x85D6, 45165 - 44032: 0x85D7, 45166 - 44032: 0x85D8, 45167 - 44032: 0x85D9, 45168 - 44032: 0x85DA, 45169 - 44032: 0x85DB, 45170 - 44032: 0x85DC, 45171 - 44032: 0x85DD, 45172 - 44032: 0x85DE, 45173 - 44032: 0x85DF, 45174 - 44032: 0x85E0, 45175 - 44032: 0x85E1, 45176 - 44032: 0x85E2, 45177 - 44032: 0x85E3, 45178 - 44032: 0x85E4, 45179 - 44032: 0x85E5, 45180 - 44032: 0xB3A2, 45181 - 44032: 0xB3A3, 45182 - 44032: 0x85E6, 45183 - 44032: 0x85E7, 45184 - 44032: 0xB3A4, 45185 - 44032: 0x85E8, 45186 - 44032: 0x85E9, 45187 - 44032: 0x85EA, 45188 - 44032: 0xB3A5, 45189 - 44032: 0x85EB, 45190 - 44032: 0x85EC, 45191 - 44032: 0x85ED, 45192 - 44032: 0x85EE, 45193 - 44032: 0x85EF, 45194 - 44032: 0x85F0, 45195 - 44032: 0x85F1, 45196 - 44032: 0xB3A6, 45197 - 44032: 0xB3A7, 45198 - 44032: 0x85F2, 45199 - 44032: 0xB3A8, 45200 - 44032: 0x85F3, 45201 - 44032: 0xB3A9, 45202 - 44032: 0x85F4, 45203 - 44032: 0x85F5, 45204 - 44032: 0x85F6, 45205 - 44032: 0x85F7, 45206 - 44032: 0x85F8, 45207 - 44032: 0x85F9, 45208 - 44032: 0xB3AA, 45209 - 44032: 0xB3AB, 45210 - 44032: 0xB3AC, 45211 - 44032: 0x85FA, 45212 - 44032: 0xB3AD, 45213 - 44032: 0x85FB, 45214 - 44032: 0x85FC, 45215 - 44032: 0xB3AE, 45216 - 44032: 0xB3AF, 45217 - 44032: 0xB3B0, 45218 - 44032: 0xB3B1, 45219 - 44032: 0x85FD, 45220 - 44032: 0x85FE, 45221 - 44032: 0x8641, 45222 - 44032: 0x8642, 45223 - 44032: 0x8643, 45224 - 44032: 0xB3B2, 45225 - 44032: 0xB3B3, 45226 - 44032: 0x8644, 45227 - 44032: 0xB3B4, 45228 - 44032: 0xB3B5, 45229 - 44032: 0xB3B6, 45230 - 44032: 0xB3B7, 45231 - 44032: 0xB3B8, 45232 - 44032: 0x8645, 45233 - 44032: 0xB3B9, 45234 - 44032: 0x8646, 45235 - 44032: 0xB3BA, 45236 - 44032: 0xB3BB, 45237 - 44032: 0xB3BC, 45238 - 44032: 0x8647, 45239 - 44032: 0x8648, 45240 - 44032: 0xB3BD, 45241 - 44032: 0x8649, 45242 - 44032: 0x864A, 45243 - 44032: 0x864B, 45244 - 44032: 0xB3BE, 45245 - 44032: 0x864C, 45246 - 44032: 0x864D, 45247 - 44032: 0x864E, 45248 - 44032: 0x864F, 45249 - 44032: 0x8650, 45250 - 44032: 0x8651, 45251 - 44032: 0x8652, 45252 - 44032: 0xB3BF, 45253 - 44032: 0xB3C0, 45254 - 44032: 0x8653, 45255 - 44032: 0xB3C1, 45256 - 44032: 0xB3C2, 45257 - 44032: 0xB3C3, 45258 - 44032: 0x8654, 45259 - 44032: 0x8655, 45260 - 44032: 0x8656, 45261 - 44032: 0x8657, 45262 - 44032: 0x8658, 45263 - 44032: 0x8659, 45264 - 44032: 0xB3C4, 45265 - 44032: 0xB3C5, 45266 - 44032: 0x865A, 45267 - 44032: 0x8661, 45268 - 44032: 0xB3C6, 45269 - 44032: 0x8662, 45270 - 44032: 0x8663, 45271 - 44032: 0x8664, 45272 - 44032: 0xB3C7, 45273 - 44032: 0x8665, 45274 - 44032: 0x8666, 45275 - 44032: 0x8667, 45276 - 44032: 0x8668, 45277 - 44032: 0x8669, 45278 - 44032: 0x866A, 45279 - 44032: 0x866B, 45280 - 44032: 0xB3C8, 45281 - 44032: 0x866C, 45282 - 44032: 0x866D, 45283 - 44032: 0x866E, 45284 - 44032: 0x866F, 45285 - 44032: 0xB3C9, 45286 - 44032: 0x8670, 45287 - 44032: 0x8671, 45288 - 44032: 0x8672, 45289 - 44032: 0x8673, 45290 - 44032: 0x8674, 45291 - 44032: 0x8675, 45292 - 44032: 0x8676, 45293 - 44032: 0x8677, 45294 - 44032: 0x8678, 45295 - 44032: 0x8679, 45296 - 44032: 0x867A, 45297 - 44032: 0x8681, 45298 - 44032: 0x8682, 45299 - 44032: 0x8683, 45300 - 44032: 0x8684, 45301 - 44032: 0x8685, 45302 - 44032: 0x8686, 45303 - 44032: 0x8687, 45304 - 44032: 0x8688, 45305 - 44032: 0x8689, 45306 - 44032: 0x868A, 45307 - 44032: 0x868B, 45308 - 44032: 0x868C, 45309 - 44032: 0x868D, 45310 - 44032: 0x868E, 45311 - 44032: 0x868F, 45312 - 44032: 0x8690, 45313 - 44032: 0x8691, 45314 - 44032: 0x8692, 45315 - 44032: 0x8693, 45316 - 44032: 0x8694, 45317 - 44032: 0x8695, 45318 - 44032: 0x8696, 45319 - 44032: 0x8697, 45320 - 44032: 0xB3CA, 45321 - 44032: 0xB3CB, 45322 - 44032: 0x8698, 45323 - 44032: 0xB3CC, 45324 - 44032: 0xB3CD, 45325 - 44032: 0x8699, 45326 - 44032: 0x869A, 45327 - 44032: 0x869B, 45328 - 44032: 0xB3CE, 45329 - 44032: 0x869C, 45330 - 44032: 0xB3CF, 45331 - 44032: 0xB3D0, 45332 - 44032: 0x869D, 45333 - 44032: 0x869E, 45334 - 44032: 0x869F, 45335 - 44032: 0x86A0, 45336 - 44032: 0xB3D1, 45337 - 44032: 0xB3D2, 45338 - 44032: 0x86A1, 45339 - 44032: 0xB3D3, 45340 - 44032: 0xB3D4, 45341 - 44032: 0xB3D5, 45342 - 44032: 0x86A2, 45343 - 44032: 0x86A3, 45344 - 44032: 0x86A4, 45345 - 44032: 0x86A5, 45346 - 44032: 0x86A6, 45347 - 44032: 0xB3D6, 45348 - 44032: 0xB3D7, 45349 - 44032: 0xB3D8, 45350 - 44032: 0x86A7, 45351 - 44032: 0x86A8, 45352 - 44032: 0xB3D9, 45353 - 44032: 0x86A9, 45354 - 44032: 0x86AA, 45355 - 44032: 0x86AB, 45356 - 44032: 0xB3DA, 45357 - 44032: 0x86AC, 45358 - 44032: 0x86AD, 45359 - 44032: 0x86AE, 45360 - 44032: 0x86AF, 45361 - 44032: 0x86B0, 45362 - 44032: 0x86B1, 45363 - 44032: 0x86B2, 45364 - 44032: 0xB3DB, 45365 - 44032: 0xB3DC, 45366 - 44032: 0x86B3, 45367 - 44032: 0xB3DD, 45368 - 44032: 0xB3DE, 45369 - 44032: 0xB3DF, 45370 - 44032: 0x86B4, 45371 - 44032: 0x86B5, 45372 - 44032: 0x86B6, 45373 - 44032: 0x86B7, 45374 - 44032: 0x86B8, 45375 - 44032: 0x86B9, 45376 - 44032: 0xB3E0, 45377 - 44032: 0xB3E1, 45378 - 44032: 0x86BA, 45379 - 44032: 0x86BB, 45380 - 44032: 0xB3E2, 45381 - 44032: 0x86BC, 45382 - 44032: 0x86BD, 45383 - 44032: 0x86BE, 45384 - 44032: 0xB3E3, 45385 - 44032: 0x86BF, 45386 - 44032: 0x86C0, 45387 - 44032: 0x86C1, 45388 - 44032: 0x86C2, 45389 - 44032: 0x86C3, 45390 - 44032: 0x86C4, 45391 - 44032: 0x86C5, 45392 - 44032: 0xB3E4, 45393 - 44032: 0xB3E5, 45394 - 44032: 0x86C6, 45395 - 44032: 0x86C7, 45396 - 44032: 0xB3E6, 45397 - 44032: 0xB3E7, 45398 - 44032: 0x86C8, 45399 - 44032: 0x86C9, 45400 - 44032: 0xB3E8, 45401 - 44032: 0x86CA, 45402 - 44032: 0x86CB, 45403 - 44032: 0x86CC, 45404 - 44032: 0xB3E9, 45405 - 44032: 0x86CD, 45406 - 44032: 0x86CE, 45407 - 44032: 0x86CF, 45408 - 44032: 0xB3EA, 45409 - 44032: 0x86D0, 45410 - 44032: 0x86D1, 45411 - 44032: 0x86D2, 45412 - 44032: 0x86D3, 45413 - 44032: 0x86D4, 45414 - 44032: 0x86D5, 45415 - 44032: 0x86D6, 45416 - 44032: 0x86D7, 45417 - 44032: 0x86D8, 45418 - 44032: 0x86D9, 45419 - 44032: 0x86DA, 45420 - 44032: 0x86DB, 45421 - 44032: 0x86DC, 45422 - 44032: 0x86DD, 45423 - 44032: 0x86DE, 45424 - 44032: 0x86DF, 45425 - 44032: 0x86E0, 45426 - 44032: 0x86E1, 45427 - 44032: 0x86E2, 45428 - 44032: 0x86E3, 45429 - 44032: 0x86E4, 45430 - 44032: 0x86E5, 45431 - 44032: 0x86E6, 45432 - 44032: 0xB3EB, 45433 - 44032: 0xB3EC, 45434 - 44032: 0x86E7, 45435 - 44032: 0x86E8, 45436 - 44032: 0xB3ED, 45437 - 44032: 0x86E9, 45438 - 44032: 0x86EA, 45439 - 44032: 0x86EB, 45440 - 44032: 0xB3EE, 45441 - 44032: 0x86EC, 45442 - 44032: 0xB3EF, 45443 - 44032: 0x86ED, 45444 - 44032: 0x86EE, 45445 - 44032: 0x86EF, 45446 - 44032: 0x86F0, 45447 - 44032: 0x86F1, 45448 - 44032: 0xB3F0, 45449 - 44032: 0xB3F1, 45450 - 44032: 0x86F2, 45451 - 44032: 0xB3F2, 45452 - 44032: 0x86F3, 45453 - 44032: 0xB3F3, 45454 - 44032: 0x86F4, 45455 - 44032: 0x86F5, 45456 - 44032: 0x86F6, 45457 - 44032: 0x86F7, 45458 - 44032: 0xB3F4, 45459 - 44032: 0xB3F5, 45460 - 44032: 0xB3F6, 45461 - 44032: 0x86F8, 45462 - 44032: 0x86F9, 45463 - 44032: 0x86FA, 45464 - 44032: 0xB3F7, 45465 - 44032: 0x86FB, 45466 - 44032: 0x86FC, 45467 - 44032: 0x86FD, 45468 - 44032: 0xB3F8, 45469 - 44032: 0x86FE, 45470 - 44032: 0x8741, 45471 - 44032: 0x8742, 45472 - 44032: 0x8743, 45473 - 44032: 0x8744, 45474 - 44032: 0x8745, 45475 - 44032: 0x8746, 45476 - 44032: 0x8747, 45477 - 44032: 0x8748, 45478 - 44032: 0x8749, 45479 - 44032: 0x874A, 45480 - 44032: 0xB3F9, 45481 - 44032: 0x874B, 45482 - 44032: 0x874C, 45483 - 44032: 0x874D, 45484 - 44032: 0x874E, 45485 - 44032: 0x874F, 45486 - 44032: 0x8750, 45487 - 44032: 0x8751, 45488 - 44032: 0x8752, 45489 - 44032: 0x8753, 45490 - 44032: 0x8754, 45491 - 44032: 0x8755, 45492 - 44032: 0x8756, 45493 - 44032: 0x8757, 45494 - 44032: 0x8758, 45495 - 44032: 0x8759, 45496 - 44032: 0x875A, 45497 - 44032: 0x8761, 45498 - 44032: 0x8762, 45499 - 44032: 0x8763, 45500 - 44032: 0x8764, 45501 - 44032: 0x8765, 45502 - 44032: 0x8766, 45503 - 44032: 0x8767, 45504 - 44032: 0x8768, 45505 - 44032: 0x8769, 45506 - 44032: 0x876A, 45507 - 44032: 0x876B, 45508 - 44032: 0x876C, 45509 - 44032: 0x876D, 45510 - 44032: 0x876E, 45511 - 44032: 0x876F, 45512 - 44032: 0x8770, 45513 - 44032: 0x8771, 45514 - 44032: 0x8772, 45515 - 44032: 0x8773, 45516 - 44032: 0xB3FA, 45517 - 44032: 0x8774, 45518 - 44032: 0x8775, 45519 - 44032: 0x8776, 45520 - 44032: 0xB3FB, 45521 - 44032: 0x8777, 45522 - 44032: 0x8778, 45523 - 44032: 0x8779, 45524 - 44032: 0xB3FC, 45525 - 44032: 0x877A, 45526 - 44032: 0x8781, 45527 - 44032: 0x8782, 45528 - 44032: 0x8783, 45529 - 44032: 0x8784, 45530 - 44032: 0x8785, 45531 - 44032: 0x8786, 45532 - 44032: 0xB3FD, 45533 - 44032: 0xB3FE, 45534 - 44032: 0x8787, 45535 - 44032: 0xB4A1, 45536 - 44032: 0x8788, 45537 - 44032: 0x8789, 45538 - 44032: 0x878A, 45539 - 44032: 0x878B, 45540 - 44032: 0x878C, 45541 - 44032: 0x878D, 45542 - 44032: 0x878E, 45543 - 44032: 0x878F, 45544 - 44032: 0xB4A2, 45545 - 44032: 0xB4A3, 45546 - 44032: 0x8790, 45547 - 44032: 0x8791, 45548 - 44032: 0xB4A4, 45549 - 44032: 0x8792, 45550 - 44032: 0x8793, 45551 - 44032: 0x8794, 45552 - 44032: 0xB4A5, 45553 - 44032: 0x8795, 45554 - 44032: 0x8796, 45555 - 44032: 0x8797, 45556 - 44032: 0x8798, 45557 - 44032: 0x8799, 45558 - 44032: 0x879A, 45559 - 44032: 0x879B, 45560 - 44032: 0x879C, 45561 - 44032: 0xB4A6, 45562 - 44032: 0x879D, 45563 - 44032: 0xB4A7, 45564 - 44032: 0x879E, 45565 - 44032: 0xB4A8, 45566 - 44032: 0x879F, 45567 - 44032: 0x87A0, 45568 - 44032: 0x87A1, 45569 - 44032: 0x87A2, 45570 - 44032: 0x87A3, 45571 - 44032: 0x87A4, 45572 - 44032: 0xB4A9, 45573 - 44032: 0xB4AA, 45574 - 44032: 0x87A5, 45575 - 44032: 0x87A6, 45576 - 44032: 0xB4AB, 45577 - 44032: 0x87A7, 45578 - 44032: 0x87A8, 45579 - 44032: 0xB4AC, 45580 - 44032: 0xB4AD, 45581 - 44032: 0x87A9, 45582 - 44032: 0x87AA, 45583 - 44032: 0x87AB, 45584 - 44032: 0x87AC, 45585 - 44032: 0x87AD, 45586 - 44032: 0x87AE, 45587 - 44032: 0x87AF, 45588 - 44032: 0xB4AE, 45589 - 44032: 0xB4AF, 45590 - 44032: 0x87B0, 45591 - 44032: 0xB4B0, 45592 - 44032: 0x87B1, 45593 - 44032: 0xB4B1, 45594 - 44032: 0x87B2, 45595 - 44032: 0x87B3, 45596 - 44032: 0x87B4, 45597 - 44032: 0x87B5, 45598 - 44032: 0x87B6, 45599 - 44032: 0x87B7, 45600 - 44032: 0xB4B2, 45601 - 44032: 0x87B8, 45602 - 44032: 0x87B9, 45603 - 44032: 0x87BA, 45604 - 44032: 0x87BB, 45605 - 44032: 0x87BC, 45606 - 44032: 0x87BD, 45607 - 44032: 0x87BE, 45608 - 44032: 0x87BF, 45609 - 44032: 0x87C0, 45610 - 44032: 0x87C1, 45611 - 44032: 0x87C2, 45612 - 44032: 0x87C3, 45613 - 44032: 0x87C4, 45614 - 44032: 0x87C5, 45615 - 44032: 0x87C6, 45616 - 44032: 0x87C7, 45617 - 44032: 0x87C8, 45618 - 44032: 0x87C9, 45619 - 44032: 0x87CA, 45620 - 44032: 0xB4B3, 45621 - 44032: 0x87CB, 45622 - 44032: 0x87CC, 45623 - 44032: 0x87CD, 45624 - 44032: 0x87CE, 45625 - 44032: 0x87CF, 45626 - 44032: 0x87D0, 45627 - 44032: 0x87D1, 45628 - 44032: 0xB4B4, 45629 - 44032: 0x87D2, 45630 - 44032: 0x87D3, 45631 - 44032: 0x87D4, 45632 - 44032: 0x87D5, 45633 - 44032: 0x87D6, 45634 - 44032: 0x87D7, 45635 - 44032: 0x87D8, 45636 - 44032: 0x87D9, 45637 - 44032: 0x87DA, 45638 - 44032: 0x87DB, 45639 - 44032: 0x87DC, 45640 - 44032: 0x87DD, 45641 - 44032: 0x87DE, 45642 - 44032: 0x87DF, 45643 - 44032: 0x87E0, 45644 - 44032: 0x87E1, 45645 - 44032: 0x87E2, 45646 - 44032: 0x87E3, 45647 - 44032: 0x87E4, 45648 - 44032: 0x87E5, 45649 - 44032: 0x87E6, 45650 - 44032: 0x87E7, 45651 - 44032: 0x87E8, 45652 - 44032: 0x87E9, 45653 - 44032: 0x87EA, 45654 - 44032: 0x87EB, 45655 - 44032: 0x87EC, 45656 - 44032: 0xB4B5, 45657 - 44032: 0x87ED, 45658 - 44032: 0x87EE, 45659 - 44032: 0x87EF, 45660 - 44032: 0xB4B6, 45661 - 44032: 0x87F0, 45662 - 44032: 0x87F1, 45663 - 44032: 0x87F2, 45664 - 44032: 0xB4B7, 45665 - 44032: 0x87F3, 45666 - 44032: 0x87F4, 45667 - 44032: 0x87F5, 45668 - 44032: 0x87F6, 45669 - 44032: 0x87F7, 45670 - 44032: 0x87F8, 45671 - 44032: 0x87F9, 45672 - 44032: 0xB4B8, 45673 - 44032: 0xB4B9, 45674 - 44032: 0x87FA, 45675 - 44032: 0x87FB, 45676 - 44032: 0x87FC, 45677 - 44032: 0x87FD, 45678 - 44032: 0x87FE, 45679 - 44032: 0x8841, 45680 - 44032: 0x8842, 45681 - 44032: 0x8843, 45682 - 44032: 0x8844, 45683 - 44032: 0x8845, 45684 - 44032: 0xB4BA, 45685 - 44032: 0xB4BB, 45686 - 44032: 0x8846, 45687 - 44032: 0x8847, 45688 - 44032: 0x8848, 45689 - 44032: 0x8849, 45690 - 44032: 0x884A, 45691 - 44032: 0x884B, 45692 - 44032: 0xB4BC, 45693 - 44032: 0x884C, 45694 - 44032: 0x884D, 45695 - 44032: 0x884E, 45696 - 44032: 0x884F, 45697 - 44032: 0x8850, 45698 - 44032: 0x8851, 45699 - 44032: 0x8852, 45700 - 44032: 0xB4BD, 45701 - 44032: 0xB4BE, 45702 - 44032: 0x8853, 45703 - 44032: 0x8854, 45704 - 44032: 0x8855, 45705 - 44032: 0xB4BF, 45706 - 44032: 0x8856, 45707 - 44032: 0x8857, 45708 - 44032: 0x8858, 45709 - 44032: 0x8859, 45710 - 44032: 0x885A, 45711 - 44032: 0x8861, 45712 - 44032: 0xB4C0, 45713 - 44032: 0xB4C1, 45714 - 44032: 0x8862, 45715 - 44032: 0x8863, 45716 - 44032: 0xB4C2, 45717 - 44032: 0x8864, 45718 - 44032: 0x8865, 45719 - 44032: 0x8866, 45720 - 44032: 0xB4C3, 45721 - 44032: 0xB4C4, 45722 - 44032: 0xB4C5, 45723 - 44032: 0x8867, 45724 - 44032: 0x8868, 45725 - 44032: 0x8869, 45726 - 44032: 0x886A, 45727 - 44032: 0x886B, 45728 - 44032: 0xB4C6, 45729 - 44032: 0xB4C7, 45730 - 44032: 0x886C, 45731 - 44032: 0xB4C8, 45732 - 44032: 0x886D, 45733 - 44032: 0xB4C9, 45734 - 44032: 0xB4CA, 45735 - 44032: 0x886E, 45736 - 44032: 0x886F, 45737 - 44032: 0x8870, 45738 - 44032: 0xB4CB, 45739 - 44032: 0x8871, 45740 - 44032: 0xB4CC, 45741 - 44032: 0x8872, 45742 - 44032: 0x8873, 45743 - 44032: 0x8874, 45744 - 44032: 0xB4CD, 45745 - 44032: 0x8875, 45746 - 44032: 0x8876, 45747 - 44032: 0x8877, 45748 - 44032: 0xB4CE, 45749 - 44032: 0x8878, 45750 - 44032: 0x8879, 45751 - 44032: 0x887A, 45752 - 44032: 0x8881, 45753 - 44032: 0x8882, 45754 - 44032: 0x8883, 45755 - 44032: 0x8884, 45756 - 44032: 0x8885, 45757 - 44032: 0x8886, 45758 - 44032: 0x8887, 45759 - 44032: 0x8888, 45760 - 44032: 0x8889, 45761 - 44032: 0x888A, 45762 - 44032: 0x888B, 45763 - 44032: 0x888C, 45764 - 44032: 0x888D, 45765 - 44032: 0x888E, 45766 - 44032: 0x888F, 45767 - 44032: 0x8890, 45768 - 44032: 0xB4CF, 45769 - 44032: 0xB4D0, 45770 - 44032: 0x8891, 45771 - 44032: 0x8892, 45772 - 44032: 0xB4D1, 45773 - 44032: 0x8893, 45774 - 44032: 0x8894, 45775 - 44032: 0x8895, 45776 - 44032: 0xB4D2, 45777 - 44032: 0x8896, 45778 - 44032: 0xB4D3, 45779 - 44032: 0x8897, 45780 - 44032: 0x8898, 45781 - 44032: 0x8899, 45782 - 44032: 0x889A, 45783 - 44032: 0x889B, 45784 - 44032: 0xB4D4, 45785 - 44032: 0xB4D5, 45786 - 44032: 0x889C, 45787 - 44032: 0xB4D6, 45788 - 44032: 0x889D, 45789 - 44032: 0xB4D7, 45790 - 44032: 0x889E, 45791 - 44032: 0x889F, 45792 - 44032: 0x88A0, 45793 - 44032: 0x88A1, 45794 - 44032: 0xB4D8, 45795 - 44032: 0x88A2, 45796 - 44032: 0xB4D9, 45797 - 44032: 0xB4DA, 45798 - 44032: 0xB4DB, 45799 - 44032: 0x88A3, 45800 - 44032: 0xB4DC, 45801 - 44032: 0x88A4, 45802 - 44032: 0x88A5, 45803 - 44032: 0xB4DD, 45804 - 44032: 0xB4DE, 45805 - 44032: 0xB4DF, 45806 - 44032: 0xB4E0, 45807 - 44032: 0xB4E1, 45808 - 44032: 0x88A6, 45809 - 44032: 0x88A7, 45810 - 44032: 0x88A8, 45811 - 44032: 0xB4E2, 45812 - 44032: 0xB4E3, 45813 - 44032: 0xB4E4, 45814 - 44032: 0x88A9, 45815 - 44032: 0xB4E5, 45816 - 44032: 0xB4E6, 45817 - 44032: 0xB4E7, 45818 - 44032: 0xB4E8, 45819 - 44032: 0xB4E9, 45820 - 44032: 0x88AA, 45821 - 44032: 0x88AB, 45822 - 44032: 0x88AC, 45823 - 44032: 0xB4EA, 45824 - 44032: 0xB4EB, 45825 - 44032: 0xB4EC, 45826 - 44032: 0x88AD, 45827 - 44032: 0x88AE, 45828 - 44032: 0xB4ED, 45829 - 44032: 0x88AF, 45830 - 44032: 0x88B0, 45831 - 44032: 0x88B1, 45832 - 44032: 0xB4EE, 45833 - 44032: 0x88B2, 45834 - 44032: 0x88B3, 45835 - 44032: 0x88B4, 45836 - 44032: 0x88B5, 45837 - 44032: 0x88B6, 45838 - 44032: 0x88B7, 45839 - 44032: 0x88B8, 45840 - 44032: 0xB4EF, 45841 - 44032: 0xB4F0, 45842 - 44032: 0x88B9, 45843 - 44032: 0xB4F1, 45844 - 44032: 0xB4F2, 45845 - 44032: 0xB4F3, 45846 - 44032: 0x88BA, 45847 - 44032: 0x88BB, 45848 - 44032: 0x88BC, 45849 - 44032: 0x88BD, 45850 - 44032: 0x88BE, 45851 - 44032: 0x88BF, 45852 - 44032: 0xB4F4, 45853 - 44032: 0x88C0, 45854 - 44032: 0x88C1, 45855 - 44032: 0x88C2, 45856 - 44032: 0x88C3, 45857 - 44032: 0x88C4, 45858 - 44032: 0x88C5, 45859 - 44032: 0x88C6, 45860 - 44032: 0x88C7, 45861 - 44032: 0x88C8, 45862 - 44032: 0x88C9, 45863 - 44032: 0x88CA, 45864 - 44032: 0x88CB, 45865 - 44032: 0x88CC, 45866 - 44032: 0x88CD, 45867 - 44032: 0x88CE, 45868 - 44032: 0x88CF, 45869 - 44032: 0x88D0, 45870 - 44032: 0x88D1, 45871 - 44032: 0x88D2, 45872 - 44032: 0x88D3, 45873 - 44032: 0x88D4, 45874 - 44032: 0x88D5, 45875 - 44032: 0x88D6, 45876 - 44032: 0x88D7, 45877 - 44032: 0x88D8, 45878 - 44032: 0x88D9, 45879 - 44032: 0x88DA, 45880 - 44032: 0x88DB, 45881 - 44032: 0x88DC, 45882 - 44032: 0x88DD, 45883 - 44032: 0x88DE, 45884 - 44032: 0x88DF, 45885 - 44032: 0x88E0, 45886 - 44032: 0x88E1, 45887 - 44032: 0x88E2, 45888 - 44032: 0x88E3, 45889 - 44032: 0x88E4, 45890 - 44032: 0x88E5, 45891 - 44032: 0x88E6, 45892 - 44032: 0x88E7, 45893 - 44032: 0x88E8, 45894 - 44032: 0x88E9, 45895 - 44032: 0x88EA, 45896 - 44032: 0x88EB, 45897 - 44032: 0x88EC, 45898 - 44032: 0x88ED, 45899 - 44032: 0x88EE, 45900 - 44032: 0x88EF, 45901 - 44032: 0x88F0, 45902 - 44032: 0x88F1, 45903 - 44032: 0x88F2, 45904 - 44032: 0x88F3, 45905 - 44032: 0x88F4, 45906 - 44032: 0x88F5, 45907 - 44032: 0x88F6, 45908 - 44032: 0xB4F5, 45909 - 44032: 0xB4F6, 45910 - 44032: 0xB4F7, 45911 - 44032: 0x88F7, 45912 - 44032: 0xB4F8, 45913 - 44032: 0x88F8, 45914 - 44032: 0x88F9, 45915 - 44032: 0xB4F9, 45916 - 44032: 0xB4FA, 45917 - 44032: 0x88FA, 45918 - 44032: 0xB4FB, 45919 - 44032: 0xB4FC, 45920 - 44032: 0x88FB, 45921 - 44032: 0x88FC, 45922 - 44032: 0x88FD, 45923 - 44032: 0x88FE, 45924 - 44032: 0xB4FD, 45925 - 44032: 0xB4FE, 45926 - 44032: 0x8941, 45927 - 44032: 0xB5A1, 45928 - 44032: 0x8942, 45929 - 44032: 0xB5A2, 45930 - 44032: 0x8943, 45931 - 44032: 0xB5A3, 45932 - 44032: 0x8944, 45933 - 44032: 0x8945, 45934 - 44032: 0xB5A4, 45935 - 44032: 0x8946, 45936 - 44032: 0xB5A5, 45937 - 44032: 0xB5A6, 45938 - 44032: 0x8947, 45939 - 44032: 0x8948, 45940 - 44032: 0xB5A7, 45941 - 44032: 0x8949, 45942 - 44032: 0x894A, 45943 - 44032: 0x894B, 45944 - 44032: 0xB5A8, 45945 - 44032: 0x894C, 45946 - 44032: 0x894D, 45947 - 44032: 0x894E, 45948 - 44032: 0x894F, 45949 - 44032: 0x8950, 45950 - 44032: 0x8951, 45951 - 44032: 0x8952, 45952 - 44032: 0xB5A9, 45953 - 44032: 0xB5AA, 45954 - 44032: 0x8953, 45955 - 44032: 0xB5AB, 45956 - 44032: 0xB5AC, 45957 - 44032: 0xB5AD, 45958 - 44032: 0x8954, 45959 - 44032: 0x8955, 45960 - 44032: 0x8956, 45961 - 44032: 0x8957, 45962 - 44032: 0x8958, 45963 - 44032: 0x8959, 45964 - 44032: 0xB5AE, 45965 - 44032: 0x895A, 45966 - 44032: 0x8961, 45967 - 44032: 0x8962, 45968 - 44032: 0xB5AF, 45969 - 44032: 0x8963, 45970 - 44032: 0x8964, 45971 - 44032: 0x8965, 45972 - 44032: 0xB5B0, 45973 - 44032: 0x8966, 45974 - 44032: 0x8967, 45975 - 44032: 0x8968, 45976 - 44032: 0x8969, 45977 - 44032: 0x896A, 45978 - 44032: 0x896B, 45979 - 44032: 0x896C, 45980 - 44032: 0x896D, 45981 - 44032: 0x896E, 45982 - 44032: 0x896F, 45983 - 44032: 0x8970, 45984 - 44032: 0xB5B1, 45985 - 44032: 0xB5B2, 45986 - 44032: 0x8971, 45987 - 44032: 0x8972, 45988 - 44032: 0x8973, 45989 - 44032: 0x8974, 45990 - 44032: 0x8975, 45991 - 44032: 0x8976, 45992 - 44032: 0xB5B3, 45993 - 44032: 0x8977, 45994 - 44032: 0x8978, 45995 - 44032: 0x8979, 45996 - 44032: 0xB5B4, 45997 - 44032: 0x897A, 45998 - 44032: 0x8981, 45999 - 44032: 0x8982, 46000 - 44032: 0x8983, 46001 - 44032: 0x8984, 46002 - 44032: 0x8985, 46003 - 44032: 0x8986, 46004 - 44032: 0x8987, 46005 - 44032: 0x8988, 46006 - 44032: 0x8989, 46007 - 44032: 0x898A, 46008 - 44032: 0x898B, 46009 - 44032: 0x898C, 46010 - 44032: 0x898D, 46011 - 44032: 0x898E, 46012 - 44032: 0x898F, 46013 - 44032: 0x8990, 46014 - 44032: 0x8991, 46015 - 44032: 0x8992, 46016 - 44032: 0x8993, 46017 - 44032: 0x8994, 46018 - 44032: 0x8995, 46019 - 44032: 0x8996, 46020 - 44032: 0xB5B5, 46021 - 44032: 0xB5B6, 46022 - 44032: 0x8997, 46023 - 44032: 0x8998, 46024 - 44032: 0xB5B7, 46025 - 44032: 0x8999, 46026 - 44032: 0x899A, 46027 - 44032: 0xB5B8, 46028 - 44032: 0xB5B9, 46029 - 44032: 0x899B, 46030 - 44032: 0xB5BA, 46031 - 44032: 0x899C, 46032 - 44032: 0xB5BB, 46033 - 44032: 0x899D, 46034 - 44032: 0x899E, 46035 - 44032: 0x899F, 46036 - 44032: 0xB5BC, 46037 - 44032: 0xB5BD, 46038 - 44032: 0x89A0, 46039 - 44032: 0xB5BE, 46040 - 44032: 0x89A1, 46041 - 44032: 0xB5BF, 46042 - 44032: 0x89A2, 46043 - 44032: 0xB5C0, 46044 - 44032: 0x89A3, 46045 - 44032: 0xB5C1, 46046 - 44032: 0x89A4, 46047 - 44032: 0x89A5, 46048 - 44032: 0xB5C2, 46049 - 44032: 0x89A6, 46050 - 44032: 0x89A7, 46051 - 44032: 0x89A8, 46052 - 44032: 0xB5C3, 46053 - 44032: 0x89A9, 46054 - 44032: 0x89AA, 46055 - 44032: 0x89AB, 46056 - 44032: 0xB5C4, 46057 - 44032: 0x89AC, 46058 - 44032: 0x89AD, 46059 - 44032: 0x89AE, 46060 - 44032: 0x89AF, 46061 - 44032: 0x89B0, 46062 - 44032: 0x89B1, 46063 - 44032: 0x89B2, 46064 - 44032: 0x89B3, 46065 - 44032: 0x89B4, 46066 - 44032: 0x89B5, 46067 - 44032: 0x89B6, 46068 - 44032: 0x89B7, 46069 - 44032: 0x89B8, 46070 - 44032: 0x89B9, 46071 - 44032: 0x89BA, 46072 - 44032: 0x89BB, 46073 - 44032: 0x89BC, 46074 - 44032: 0x89BD, 46075 - 44032: 0x89BE, 46076 - 44032: 0xB5C5, 46077 - 44032: 0x89BF, 46078 - 44032: 0x89C0, 46079 - 44032: 0x89C1, 46080 - 44032: 0x89C2, 46081 - 44032: 0x89C3, 46082 - 44032: 0x89C4, 46083 - 44032: 0x89C5, 46084 - 44032: 0x89C6, 46085 - 44032: 0x89C7, 46086 - 44032: 0x89C8, 46087 - 44032: 0x89C9, 46088 - 44032: 0x89CA, 46089 - 44032: 0x89CB, 46090 - 44032: 0x89CC, 46091 - 44032: 0x89CD, 46092 - 44032: 0x89CE, 46093 - 44032: 0x89CF, 46094 - 44032: 0x89D0, 46095 - 44032: 0x89D1, 46096 - 44032: 0xB5C6, 46097 - 44032: 0x89D2, 46098 - 44032: 0x89D3, 46099 - 44032: 0x89D4, 46100 - 44032: 0x89D5, 46101 - 44032: 0x89D6, 46102 - 44032: 0x89D7, 46103 - 44032: 0x89D8, 46104 - 44032: 0xB5C7, 46105 - 44032: 0x89D9, 46106 - 44032: 0x89DA, 46107 - 44032: 0x89DB, 46108 - 44032: 0xB5C8, 46109 - 44032: 0x89DC, 46110 - 44032: 0x89DD, 46111 - 44032: 0x89DE, 46112 - 44032: 0xB5C9, 46113 - 44032: 0x89DF, 46114 - 44032: 0x89E0, 46115 - 44032: 0x89E1, 46116 - 44032: 0x89E2, 46117 - 44032: 0x89E3, 46118 - 44032: 0x89E4, 46119 - 44032: 0x89E5, 46120 - 44032: 0xB5CA, 46121 - 44032: 0xB5CB, 46122 - 44032: 0x89E6, 46123 - 44032: 0xB5CC, 46124 - 44032: 0x89E7, 46125 - 44032: 0x89E8, 46126 - 44032: 0x89E9, 46127 - 44032: 0x89EA, 46128 - 44032: 0x89EB, 46129 - 44032: 0x89EC, 46130 - 44032: 0x89ED, 46131 - 44032: 0x89EE, 46132 - 44032: 0xB5CD, 46133 - 44032: 0x89EF, 46134 - 44032: 0x89F0, 46135 - 44032: 0x89F1, 46136 - 44032: 0x89F2, 46137 - 44032: 0x89F3, 46138 - 44032: 0x89F4, 46139 - 44032: 0x89F5, 46140 - 44032: 0x89F6, 46141 - 44032: 0x89F7, 46142 - 44032: 0x89F8, 46143 - 44032: 0x89F9, 46144 - 44032: 0x89FA, 46145 - 44032: 0x89FB, 46146 - 44032: 0x89FC, 46147 - 44032: 0x89FD, 46148 - 44032: 0x89FE, 46149 - 44032: 0x8A41, 46150 - 44032: 0x8A42, 46151 - 44032: 0x8A43, 46152 - 44032: 0x8A44, 46153 - 44032: 0x8A45, 46154 - 44032: 0x8A46, 46155 - 44032: 0x8A47, 46156 - 44032: 0x8A48, 46157 - 44032: 0x8A49, 46158 - 44032: 0x8A4A, 46159 - 44032: 0x8A4B, 46160 - 44032: 0xB5CE, 46161 - 44032: 0xB5CF, 46162 - 44032: 0x8A4C, 46163 - 44032: 0x8A4D, 46164 - 44032: 0xB5D0, 46165 - 44032: 0x8A4E, 46166 - 44032: 0x8A4F, 46167 - 44032: 0x8A50, 46168 - 44032: 0xB5D1, 46169 - 44032: 0x8A51, 46170 - 44032: 0x8A52, 46171 - 44032: 0x8A53, 46172 - 44032: 0x8A54, 46173 - 44032: 0x8A55, 46174 - 44032: 0x8A56, 46175 - 44032: 0x8A57, 46176 - 44032: 0xB5D2, 46177 - 44032: 0xB5D3, 46178 - 44032: 0x8A58, 46179 - 44032: 0xB5D4, 46180 - 44032: 0x8A59, 46181 - 44032: 0xB5D5, 46182 - 44032: 0x8A5A, 46183 - 44032: 0x8A61, 46184 - 44032: 0x8A62, 46185 - 44032: 0x8A63, 46186 - 44032: 0x8A64, 46187 - 44032: 0x8A65, 46188 - 44032: 0xB5D6, 46189 - 44032: 0x8A66, 46190 - 44032: 0x8A67, 46191 - 44032: 0x8A68, 46192 - 44032: 0x8A69, 46193 - 44032: 0x8A6A, 46194 - 44032: 0x8A6B, 46195 - 44032: 0x8A6C, 46196 - 44032: 0x8A6D, 46197 - 44032: 0x8A6E, 46198 - 44032: 0x8A6F, 46199 - 44032: 0x8A70, 46200 - 44032: 0x8A71, 46201 - 44032: 0x8A72, 46202 - 44032: 0x8A73, 46203 - 44032: 0x8A74, 46204 - 44032: 0x8A75, 46205 - 44032: 0x8A76, 46206 - 44032: 0x8A77, 46207 - 44032: 0x8A78, 46208 - 44032: 0xB5D7, 46209 - 44032: 0x8A79, 46210 - 44032: 0x8A7A, 46211 - 44032: 0x8A81, 46212 - 44032: 0x8A82, 46213 - 44032: 0x8A83, 46214 - 44032: 0x8A84, 46215 - 44032: 0x8A85, 46216 - 44032: 0xB5D8, 46217 - 44032: 0x8A86, 46218 - 44032: 0x8A87, 46219 - 44032: 0x8A88, 46220 - 44032: 0x8A89, 46221 - 44032: 0x8A8A, 46222 - 44032: 0x8A8B, 46223 - 44032: 0x8A8C, 46224 - 44032: 0x8A8D, 46225 - 44032: 0x8A8E, 46226 - 44032: 0x8A8F, 46227 - 44032: 0x8A90, 46228 - 44032: 0x8A91, 46229 - 44032: 0x8A92, 46230 - 44032: 0x8A93, 46231 - 44032: 0x8A94, 46232 - 44032: 0x8A95, 46233 - 44032: 0x8A96, 46234 - 44032: 0x8A97, 46235 - 44032: 0x8A98, 46236 - 44032: 0x8A99, 46237 - 44032: 0xB5D9, 46238 - 44032: 0x8A9A, 46239 - 44032: 0x8A9B, 46240 - 44032: 0x8A9C, 46241 - 44032: 0x8A9D, 46242 - 44032: 0x8A9E, 46243 - 44032: 0x8A9F, 46244 - 44032: 0xB5DA, 46245 - 44032: 0x8AA0, 46246 - 44032: 0x8AA1, 46247 - 44032: 0x8AA2, 46248 - 44032: 0xB5DB, 46249 - 44032: 0x8AA3, 46250 - 44032: 0x8AA4, 46251 - 44032: 0x8AA5, 46252 - 44032: 0xB5DC, 46253 - 44032: 0x8AA6, 46254 - 44032: 0x8AA7, 46255 - 44032: 0x8AA8, 46256 - 44032: 0x8AA9, 46257 - 44032: 0x8AAA, 46258 - 44032: 0x8AAB, 46259 - 44032: 0x8AAC, 46260 - 44032: 0x8AAD, 46261 - 44032: 0xB5DD, 46262 - 44032: 0x8AAE, 46263 - 44032: 0xB5DE, 46264 - 44032: 0x8AAF, 46265 - 44032: 0xB5DF, 46266 - 44032: 0x8AB0, 46267 - 44032: 0x8AB1, 46268 - 44032: 0x8AB2, 46269 - 44032: 0x8AB3, 46270 - 44032: 0x8AB4, 46271 - 44032: 0x8AB5, 46272 - 44032: 0xB5E0, 46273 - 44032: 0x8AB6, 46274 - 44032: 0x8AB7, 46275 - 44032: 0x8AB8, 46276 - 44032: 0xB5E1, 46277 - 44032: 0x8AB9, 46278 - 44032: 0x8ABA, 46279 - 44032: 0x8ABB, 46280 - 44032: 0xB5E2, 46281 - 44032: 0x8ABC, 46282 - 44032: 0x8ABD, 46283 - 44032: 0x8ABE, 46284 - 44032: 0x8ABF, 46285 - 44032: 0x8AC0, 46286 - 44032: 0x8AC1, 46287 - 44032: 0x8AC2, 46288 - 44032: 0xB5E3, 46289 - 44032: 0x8AC3, 46290 - 44032: 0x8AC4, 46291 - 44032: 0x8AC5, 46292 - 44032: 0x8AC6, 46293 - 44032: 0xB5E4, 46294 - 44032: 0x8AC7, 46295 - 44032: 0x8AC8, 46296 - 44032: 0x8AC9, 46297 - 44032: 0x8ACA, 46298 - 44032: 0x8ACB, 46299 - 44032: 0x8ACC, 46300 - 44032: 0xB5E5, 46301 - 44032: 0xB5E6, 46302 - 44032: 0x8ACD, 46303 - 44032: 0x8ACE, 46304 - 44032: 0xB5E7, 46305 - 44032: 0x8ACF, 46306 - 44032: 0x8AD0, 46307 - 44032: 0xB5E8, 46308 - 44032: 0xB5E9, 46309 - 44032: 0x8AD1, 46310 - 44032: 0xB5EA, 46311 - 44032: 0x8AD2, 46312 - 44032: 0x8AD3, 46313 - 44032: 0x8AD4, 46314 - 44032: 0x8AD5, 46315 - 44032: 0x8AD6, 46316 - 44032: 0xB5EB, 46317 - 44032: 0xB5EC, 46318 - 44032: 0x8AD7, 46319 - 44032: 0xB5ED, 46320 - 44032: 0x8AD8, 46321 - 44032: 0xB5EE, 46322 - 44032: 0x8AD9, 46323 - 44032: 0x8ADA, 46324 - 44032: 0x8ADB, 46325 - 44032: 0x8ADC, 46326 - 44032: 0x8ADD, 46327 - 44032: 0x8ADE, 46328 - 44032: 0xB5EF, 46329 - 44032: 0x8ADF, 46330 - 44032: 0x8AE0, 46331 - 44032: 0x8AE1, 46332 - 44032: 0x8AE2, 46333 - 44032: 0x8AE3, 46334 - 44032: 0x8AE4, 46335 - 44032: 0x8AE5, 46336 - 44032: 0x8AE6, 46337 - 44032: 0x8AE7, 46338 - 44032: 0x8AE8, 46339 - 44032: 0x8AE9, 46340 - 44032: 0x8AEA, 46341 - 44032: 0x8AEB, 46342 - 44032: 0x8AEC, 46343 - 44032: 0x8AED, 46344 - 44032: 0x8AEE, 46345 - 44032: 0x8AEF, 46346 - 44032: 0x8AF0, 46347 - 44032: 0x8AF1, 46348 - 44032: 0x8AF2, 46349 - 44032: 0x8AF3, 46350 - 44032: 0x8AF4, 46351 - 44032: 0x8AF5, 46352 - 44032: 0x8AF6, 46353 - 44032: 0x8AF7, 46354 - 44032: 0x8AF8, 46355 - 44032: 0x8AF9, 46356 - 44032: 0xB5F0, 46357 - 44032: 0xB5F1, 46358 - 44032: 0x8AFA, 46359 - 44032: 0x8AFB, 46360 - 44032: 0xB5F2, 46361 - 44032: 0x8AFC, 46362 - 44032: 0x8AFD, 46363 - 44032: 0xB5F3, 46364 - 44032: 0xB5F4, 46365 - 44032: 0x8AFE, 46366 - 44032: 0x8B41, 46367 - 44032: 0x8B42, 46368 - 44032: 0x8B43, 46369 - 44032: 0x8B44, 46370 - 44032: 0x8B45, 46371 - 44032: 0x8B46, 46372 - 44032: 0xB5F5, 46373 - 44032: 0xB5F6, 46374 - 44032: 0x8B47, 46375 - 44032: 0xB5F7, 46376 - 44032: 0xB5F8, 46377 - 44032: 0xB5F9, 46378 - 44032: 0xB5FA, 46379 - 44032: 0x8B48, 46380 - 44032: 0x8B49, 46381 - 44032: 0x8B4A, 46382 - 44032: 0x8B4B, 46383 - 44032: 0x8B4C, 46384 - 44032: 0xB5FB, 46385 - 44032: 0xB5FC, 46386 - 44032: 0x8B4D, 46387 - 44032: 0x8B4E, 46388 - 44032: 0xB5FD, 46389 - 44032: 0x8B4F, 46390 - 44032: 0x8B50, 46391 - 44032: 0x8B51, 46392 - 44032: 0xB5FE, 46393 - 44032: 0x8B52, 46394 - 44032: 0x8B53, 46395 - 44032: 0x8B54, 46396 - 44032: 0x8B55, 46397 - 44032: 0x8B56, 46398 - 44032: 0x8B57, 46399 - 44032: 0x8B58, 46400 - 44032: 0xB6A1, 46401 - 44032: 0xB6A2, 46402 - 44032: 0x8B59, 46403 - 44032: 0xB6A3, 46404 - 44032: 0xB6A4, 46405 - 44032: 0xB6A5, 46406 - 44032: 0x8B5A, 46407 - 44032: 0x8B61, 46408 - 44032: 0x8B62, 46409 - 44032: 0x8B63, 46410 - 44032: 0x8B64, 46411 - 44032: 0xB6A6, 46412 - 44032: 0xB6A7, 46413 - 44032: 0xB6A8, 46414 - 44032: 0x8B65, 46415 - 44032: 0x8B66, 46416 - 44032: 0xB6A9, 46417 - 44032: 0x8B67, 46418 - 44032: 0x8B68, 46419 - 44032: 0x8B69, 46420 - 44032: 0xB6AA, 46421 - 44032: 0x8B6A, 46422 - 44032: 0x8B6B, 46423 - 44032: 0x8B6C, 46424 - 44032: 0x8B6D, 46425 - 44032: 0x8B6E, 46426 - 44032: 0x8B6F, 46427 - 44032: 0x8B70, 46428 - 44032: 0xB6AB, 46429 - 44032: 0xB6AC, 46430 - 44032: 0x8B71, 46431 - 44032: 0xB6AD, 46432 - 44032: 0xB6AE, 46433 - 44032: 0xB6AF, 46434 - 44032: 0x8B72, 46435 - 44032: 0x8B73, 46436 - 44032: 0x8B74, 46437 - 44032: 0x8B75, 46438 - 44032: 0x8B76, 46439 - 44032: 0x8B77, 46440 - 44032: 0x8B78, 46441 - 44032: 0x8B79, 46442 - 44032: 0x8B7A, 46443 - 44032: 0x8B81, 46444 - 44032: 0x8B82, 46445 - 44032: 0x8B83, 46446 - 44032: 0x8B84, 46447 - 44032: 0x8B85, 46448 - 44032: 0x8B86, 46449 - 44032: 0x8B87, 46450 - 44032: 0x8B88, 46451 - 44032: 0x8B89, 46452 - 44032: 0x8B8A, 46453 - 44032: 0x8B8B, 46454 - 44032: 0x8B8C, 46455 - 44032: 0x8B8D, 46456 - 44032: 0x8B8E, 46457 - 44032: 0x8B8F, 46458 - 44032: 0x8B90, 46459 - 44032: 0x8B91, 46460 - 44032: 0x8B92, 46461 - 44032: 0x8B93, 46462 - 44032: 0x8B94, 46463 - 44032: 0x8B95, 46464 - 44032: 0x8B96, 46465 - 44032: 0x8B97, 46466 - 44032: 0x8B98, 46467 - 44032: 0x8B99, 46468 - 44032: 0x8B9A, 46469 - 44032: 0x8B9B, 46470 - 44032: 0x8B9C, 46471 - 44032: 0x8B9D, 46472 - 44032: 0x8B9E, 46473 - 44032: 0x8B9F, 46474 - 44032: 0x8BA0, 46475 - 44032: 0x8BA1, 46476 - 44032: 0x8BA2, 46477 - 44032: 0x8BA3, 46478 - 44032: 0x8BA4, 46479 - 44032: 0x8BA5, 46480 - 44032: 0x8BA6, 46481 - 44032: 0x8BA7, 46482 - 44032: 0x8BA8, 46483 - 44032: 0x8BA9, 46484 - 44032: 0x8BAA, 46485 - 44032: 0x8BAB, 46486 - 44032: 0x8BAC, 46487 - 44032: 0x8BAD, 46488 - 44032: 0x8BAE, 46489 - 44032: 0x8BAF, 46490 - 44032: 0x8BB0, 46491 - 44032: 0x8BB1, 46492 - 44032: 0x8BB2, 46493 - 44032: 0x8BB3, 46494 - 44032: 0x8BB4, 46495 - 44032: 0x8BB5, 46496 - 44032: 0xB6B0, 46497 - 44032: 0xB6B1, 46498 - 44032: 0x8BB6, 46499 - 44032: 0x8BB7, 46500 - 44032: 0xB6B2, 46501 - 44032: 0x8BB8, 46502 - 44032: 0x8BB9, 46503 - 44032: 0x8BBA, 46504 - 44032: 0xB6B3, 46505 - 44032: 0x8BBB, 46506 - 44032: 0xB6B4, 46507 - 44032: 0xB6B5, 46508 - 44032: 0x8BBC, 46509 - 44032: 0x8BBD, 46510 - 44032: 0x8BBE, 46511 - 44032: 0x8BBF, 46512 - 44032: 0xB6B6, 46513 - 44032: 0xB6B7, 46514 - 44032: 0x8BC0, 46515 - 44032: 0xB6B8, 46516 - 44032: 0xB6B9, 46517 - 44032: 0xB6BA, 46518 - 44032: 0x8BC1, 46519 - 44032: 0x8BC2, 46520 - 44032: 0x8BC3, 46521 - 44032: 0x8BC4, 46522 - 44032: 0x8BC5, 46523 - 44032: 0xB6BB, 46524 - 44032: 0xB6BC, 46525 - 44032: 0xB6BD, 46526 - 44032: 0x8BC6, 46527 - 44032: 0x8BC7, 46528 - 44032: 0xB6BE, 46529 - 44032: 0x8BC8, 46530 - 44032: 0x8BC9, 46531 - 44032: 0x8BCA, 46532 - 44032: 0xB6BF, 46533 - 44032: 0x8BCB, 46534 - 44032: 0x8BCC, 46535 - 44032: 0x8BCD, 46536 - 44032: 0x8BCE, 46537 - 44032: 0x8BCF, 46538 - 44032: 0x8BD0, 46539 - 44032: 0x8BD1, 46540 - 44032: 0xB6C0, 46541 - 44032: 0xB6C1, 46542 - 44032: 0x8BD2, 46543 - 44032: 0xB6C2, 46544 - 44032: 0xB6C3, 46545 - 44032: 0xB6C4, 46546 - 44032: 0x8BD3, 46547 - 44032: 0x8BD4, 46548 - 44032: 0x8BD5, 46549 - 44032: 0x8BD6, 46550 - 44032: 0x8BD7, 46551 - 44032: 0x8BD8, 46552 - 44032: 0xB6C5, 46553 - 44032: 0x8BD9, 46554 - 44032: 0x8BDA, 46555 - 44032: 0x8BDB, 46556 - 44032: 0x8BDC, 46557 - 44032: 0x8BDD, 46558 - 44032: 0x8BDE, 46559 - 44032: 0x8BDF, 46560 - 44032: 0x8BE0, 46561 - 44032: 0x8BE1, 46562 - 44032: 0x8BE2, 46563 - 44032: 0x8BE3, 46564 - 44032: 0x8BE4, 46565 - 44032: 0x8BE5, 46566 - 44032: 0x8BE6, 46567 - 44032: 0x8BE7, 46568 - 44032: 0x8BE8, 46569 - 44032: 0x8BE9, 46570 - 44032: 0x8BEA, 46571 - 44032: 0x8BEB, 46572 - 44032: 0xB6C6, 46573 - 44032: 0x8BEC, 46574 - 44032: 0x8BED, 46575 - 44032: 0x8BEE, 46576 - 44032: 0x8BEF, 46577 - 44032: 0x8BF0, 46578 - 44032: 0x8BF1, 46579 - 44032: 0x8BF2, 46580 - 44032: 0x8BF3, 46581 - 44032: 0x8BF4, 46582 - 44032: 0x8BF5, 46583 - 44032: 0x8BF6, 46584 - 44032: 0x8BF7, 46585 - 44032: 0x8BF8, 46586 - 44032: 0x8BF9, 46587 - 44032: 0x8BFA, 46588 - 44032: 0x8BFB, 46589 - 44032: 0x8BFC, 46590 - 44032: 0x8BFD, 46591 - 44032: 0x8BFE, 46592 - 44032: 0x8C41, 46593 - 44032: 0x8C42, 46594 - 44032: 0x8C43, 46595 - 44032: 0x8C44, 46596 - 44032: 0x8C45, 46597 - 44032: 0x8C46, 46598 - 44032: 0x8C47, 46599 - 44032: 0x8C48, 46600 - 44032: 0x8C49, 46601 - 44032: 0x8C4A, 46602 - 44032: 0x8C4B, 46603 - 44032: 0x8C4C, 46604 - 44032: 0x8C4D, 46605 - 44032: 0x8C4E, 46606 - 44032: 0x8C4F, 46607 - 44032: 0x8C50, 46608 - 44032: 0xB6C7, 46609 - 44032: 0xB6C8, 46610 - 44032: 0x8C51, 46611 - 44032: 0x8C52, 46612 - 44032: 0xB6C9, 46613 - 44032: 0x8C53, 46614 - 44032: 0x8C54, 46615 - 44032: 0x8C55, 46616 - 44032: 0xB6CA, 46617 - 44032: 0x8C56, 46618 - 44032: 0x8C57, 46619 - 44032: 0x8C58, 46620 - 44032: 0x8C59, 46621 - 44032: 0x8C5A, 46622 - 44032: 0x8C61, 46623 - 44032: 0x8C62, 46624 - 44032: 0x8C63, 46625 - 44032: 0x8C64, 46626 - 44032: 0x8C65, 46627 - 44032: 0x8C66, 46628 - 44032: 0x8C67, 46629 - 44032: 0xB6CB, 46630 - 44032: 0x8C68, 46631 - 44032: 0x8C69, 46632 - 44032: 0x8C6A, 46633 - 44032: 0x8C6B, 46634 - 44032: 0x8C6C, 46635 - 44032: 0x8C6D, 46636 - 44032: 0xB6CC, 46637 - 44032: 0x8C6E, 46638 - 44032: 0x8C6F, 46639 - 44032: 0x8C70, 46640 - 44032: 0x8C71, 46641 - 44032: 0x8C72, 46642 - 44032: 0x8C73, 46643 - 44032: 0x8C74, 46644 - 44032: 0xB6CD, 46645 - 44032: 0x8C75, 46646 - 44032: 0x8C76, 46647 - 44032: 0x8C77, 46648 - 44032: 0x8C78, 46649 - 44032: 0x8C79, 46650 - 44032: 0x8C7A, 46651 - 44032: 0x8C81, 46652 - 44032: 0x8C82, 46653 - 44032: 0x8C83, 46654 - 44032: 0x8C84, 46655 - 44032: 0x8C85, 46656 - 44032: 0x8C86, 46657 - 44032: 0x8C87, 46658 - 44032: 0x8C88, 46659 - 44032: 0x8C89, 46660 - 44032: 0x8C8A, 46661 - 44032: 0x8C8B, 46662 - 44032: 0x8C8C, 46663 - 44032: 0x8C8D, 46664 - 44032: 0xB6CE, 46665 - 44032: 0x8C8E, 46666 - 44032: 0x8C8F, 46667 - 44032: 0x8C90, 46668 - 44032: 0x8C91, 46669 - 44032: 0x8C92, 46670 - 44032: 0x8C93, 46671 - 44032: 0x8C94, 46672 - 44032: 0x8C95, 46673 - 44032: 0x8C96, 46674 - 44032: 0x8C97, 46675 - 44032: 0x8C98, 46676 - 44032: 0x8C99, 46677 - 44032: 0x8C9A, 46678 - 44032: 0x8C9B, 46679 - 44032: 0x8C9C, 46680 - 44032: 0x8C9D, 46681 - 44032: 0x8C9E, 46682 - 44032: 0x8C9F, 46683 - 44032: 0x8CA0, 46684 - 44032: 0x8CA1, 46685 - 44032: 0x8CA2, 46686 - 44032: 0x8CA3, 46687 - 44032: 0x8CA4, 46688 - 44032: 0x8CA5, 46689 - 44032: 0x8CA6, 46690 - 44032: 0x8CA7, 46691 - 44032: 0x8CA8, 46692 - 44032: 0xB6CF, 46693 - 44032: 0x8CA9, 46694 - 44032: 0x8CAA, 46695 - 44032: 0x8CAB, 46696 - 44032: 0xB6D0, 46697 - 44032: 0x8CAC, 46698 - 44032: 0x8CAD, 46699 - 44032: 0x8CAE, 46700 - 44032: 0x8CAF, 46701 - 44032: 0x8CB0, 46702 - 44032: 0x8CB1, 46703 - 44032: 0x8CB2, 46704 - 44032: 0x8CB3, 46705 - 44032: 0x8CB4, 46706 - 44032: 0x8CB5, 46707 - 44032: 0x8CB6, 46708 - 44032: 0x8CB7, 46709 - 44032: 0x8CB8, 46710 - 44032: 0x8CB9, 46711 - 44032: 0x8CBA, 46712 - 44032: 0x8CBB, 46713 - 44032: 0x8CBC, 46714 - 44032: 0x8CBD, 46715 - 44032: 0x8CBE, 46716 - 44032: 0x8CBF, 46717 - 44032: 0x8CC0, 46718 - 44032: 0x8CC1, 46719 - 44032: 0x8CC2, 46720 - 44032: 0x8CC3, 46721 - 44032: 0x8CC4, 46722 - 44032: 0x8CC5, 46723 - 44032: 0x8CC6, 46724 - 44032: 0x8CC7, 46725 - 44032: 0x8CC8, 46726 - 44032: 0x8CC9, 46727 - 44032: 0x8CCA, 46728 - 44032: 0x8CCB, 46729 - 44032: 0x8CCC, 46730 - 44032: 0x8CCD, 46731 - 44032: 0x8CCE, 46732 - 44032: 0x8CCF, 46733 - 44032: 0x8CD0, 46734 - 44032: 0x8CD1, 46735 - 44032: 0x8CD2, 46736 - 44032: 0x8CD3, 46737 - 44032: 0x8CD4, 46738 - 44032: 0x8CD5, 46739 - 44032: 0x8CD6, 46740 - 44032: 0x8CD7, 46741 - 44032: 0x8CD8, 46742 - 44032: 0x8CD9, 46743 - 44032: 0x8CDA, 46744 - 44032: 0x8CDB, 46745 - 44032: 0x8CDC, 46746 - 44032: 0x8CDD, 46747 - 44032: 0x8CDE, 46748 - 44032: 0xB6D1, 46749 - 44032: 0xB6D2, 46750 - 44032: 0x8CDF, 46751 - 44032: 0x8CE0, 46752 - 44032: 0xB6D3, 46753 - 44032: 0x8CE1, 46754 - 44032: 0x8CE2, 46755 - 44032: 0x8CE3, 46756 - 44032: 0xB6D4, 46757 - 44032: 0x8CE4, 46758 - 44032: 0x8CE5, 46759 - 44032: 0x8CE6, 46760 - 44032: 0x8CE7, 46761 - 44032: 0x8CE8, 46762 - 44032: 0x8CE9, 46763 - 44032: 0xB6D5, 46764 - 44032: 0xB6D6, 46765 - 44032: 0x8CEA, 46766 - 44032: 0x8CEB, 46767 - 44032: 0x8CEC, 46768 - 44032: 0x8CED, 46769 - 44032: 0xB6D7, 46770 - 44032: 0x8CEE, 46771 - 44032: 0x8CEF, 46772 - 44032: 0x8CF0, 46773 - 44032: 0x8CF1, 46774 - 44032: 0x8CF2, 46775 - 44032: 0x8CF3, 46776 - 44032: 0x8CF4, 46777 - 44032: 0x8CF5, 46778 - 44032: 0x8CF6, 46779 - 44032: 0x8CF7, 46780 - 44032: 0x8CF8, 46781 - 44032: 0x8CF9, 46782 - 44032: 0x8CFA, 46783 - 44032: 0x8CFB, 46784 - 44032: 0x8CFC, 46785 - 44032: 0x8CFD, 46786 - 44032: 0x8CFE, 46787 - 44032: 0x8D41, 46788 - 44032: 0x8D42, 46789 - 44032: 0x8D43, 46790 - 44032: 0x8D44, 46791 - 44032: 0x8D45, 46792 - 44032: 0x8D46, 46793 - 44032: 0x8D47, 46794 - 44032: 0x8D48, 46795 - 44032: 0x8D49, 46796 - 44032: 0x8D4A, 46797 - 44032: 0x8D4B, 46798 - 44032: 0x8D4C, 46799 - 44032: 0x8D4D, 46800 - 44032: 0x8D4E, 46801 - 44032: 0x8D4F, 46802 - 44032: 0x8D50, 46803 - 44032: 0x8D51, 46804 - 44032: 0xB6D8, 46805 - 44032: 0x8D52, 46806 - 44032: 0x8D53, 46807 - 44032: 0x8D54, 46808 - 44032: 0x8D55, 46809 - 44032: 0x8D56, 46810 - 44032: 0x8D57, 46811 - 44032: 0x8D58, 46812 - 44032: 0x8D59, 46813 - 44032: 0x8D5A, 46814 - 44032: 0x8D61, 46815 - 44032: 0x8D62, 46816 - 44032: 0x8D63, 46817 - 44032: 0x8D64, 46818 - 44032: 0x8D65, 46819 - 44032: 0x8D66, 46820 - 44032: 0x8D67, 46821 - 44032: 0x8D68, 46822 - 44032: 0x8D69, 46823 - 44032: 0x8D6A, 46824 - 44032: 0x8D6B, 46825 - 44032: 0x8D6C, 46826 - 44032: 0x8D6D, 46827 - 44032: 0x8D6E, 46828 - 44032: 0x8D6F, 46829 - 44032: 0x8D70, 46830 - 44032: 0x8D71, 46831 - 44032: 0x8D72, 46832 - 44032: 0xB6D9, 46833 - 44032: 0x8D73, 46834 - 44032: 0x8D74, 46835 - 44032: 0x8D75, 46836 - 44032: 0xB6DA, 46837 - 44032: 0x8D76, 46838 - 44032: 0x8D77, 46839 - 44032: 0x8D78, 46840 - 44032: 0xB6DB, 46841 - 44032: 0x8D79, 46842 - 44032: 0x8D7A, 46843 - 44032: 0x8D81, 46844 - 44032: 0x8D82, 46845 - 44032: 0x8D83, 46846 - 44032: 0x8D84, 46847 - 44032: 0x8D85, 46848 - 44032: 0xB6DC, 46849 - 44032: 0xB6DD, 46850 - 44032: 0x8D86, 46851 - 44032: 0x8D87, 46852 - 44032: 0x8D88, 46853 - 44032: 0xB6DE, 46854 - 44032: 0x8D89, 46855 - 44032: 0x8D8A, 46856 - 44032: 0x8D8B, 46857 - 44032: 0x8D8C, 46858 - 44032: 0x8D8D, 46859 - 44032: 0x8D8E, 46860 - 44032: 0x8D8F, 46861 - 44032: 0x8D90, 46862 - 44032: 0x8D91, 46863 - 44032: 0x8D92, 46864 - 44032: 0x8D93, 46865 - 44032: 0x8D94, 46866 - 44032: 0x8D95, 46867 - 44032: 0x8D96, 46868 - 44032: 0x8D97, 46869 - 44032: 0x8D98, 46870 - 44032: 0x8D99, 46871 - 44032: 0x8D9A, 46872 - 44032: 0x8D9B, 46873 - 44032: 0x8D9C, 46874 - 44032: 0x8D9D, 46875 - 44032: 0x8D9E, 46876 - 44032: 0x8D9F, 46877 - 44032: 0x8DA0, 46878 - 44032: 0x8DA1, 46879 - 44032: 0x8DA2, 46880 - 44032: 0x8DA3, 46881 - 44032: 0x8DA4, 46882 - 44032: 0x8DA5, 46883 - 44032: 0x8DA6, 46884 - 44032: 0x8DA7, 46885 - 44032: 0x8DA8, 46886 - 44032: 0x8DA9, 46887 - 44032: 0x8DAA, 46888 - 44032: 0xB6DF, 46889 - 44032: 0xB6E0, 46890 - 44032: 0x8DAB, 46891 - 44032: 0x8DAC, 46892 - 44032: 0xB6E1, 46893 - 44032: 0x8DAD, 46894 - 44032: 0x8DAE, 46895 - 44032: 0xB6E2, 46896 - 44032: 0xB6E3, 46897 - 44032: 0x8DAF, 46898 - 44032: 0x8DB0, 46899 - 44032: 0x8DB1, 46900 - 44032: 0x8DB2, 46901 - 44032: 0x8DB3, 46902 - 44032: 0x8DB4, 46903 - 44032: 0x8DB5, 46904 - 44032: 0xB6E4, 46905 - 44032: 0xB6E5, 46906 - 44032: 0x8DB6, 46907 - 44032: 0xB6E6, 46908 - 44032: 0x8DB7, 46909 - 44032: 0x8DB8, 46910 - 44032: 0x8DB9, 46911 - 44032: 0x8DBA, 46912 - 44032: 0x8DBB, 46913 - 44032: 0x8DBC, 46914 - 44032: 0x8DBD, 46915 - 44032: 0x8DBE, 46916 - 44032: 0xB6E7, 46917 - 44032: 0x8DBF, 46918 - 44032: 0x8DC0, 46919 - 44032: 0x8DC1, 46920 - 44032: 0xB6E8, 46921 - 44032: 0x8DC2, 46922 - 44032: 0x8DC3, 46923 - 44032: 0x8DC4, 46924 - 44032: 0xB6E9, 46925 - 44032: 0x8DC5, 46926 - 44032: 0x8DC6, 46927 - 44032: 0x8DC7, 46928 - 44032: 0x8DC8, 46929 - 44032: 0x8DC9, 46930 - 44032: 0x8DCA, 46931 - 44032: 0x8DCB, 46932 - 44032: 0xB6EA, 46933 - 44032: 0xB6EB, 46934 - 44032: 0x8DCC, 46935 - 44032: 0x8DCD, 46936 - 44032: 0x8DCE, 46937 - 44032: 0x8DCF, 46938 - 44032: 0x8DD0, 46939 - 44032: 0x8DD1, 46940 - 44032: 0x8DD2, 46941 - 44032: 0x8DD3, 46942 - 44032: 0x8DD4, 46943 - 44032: 0x8DD5, 46944 - 44032: 0xB6EC, 46945 - 44032: 0x8DD6, 46946 - 44032: 0x8DD7, 46947 - 44032: 0x8DD8, 46948 - 44032: 0xB6ED, 46949 - 44032: 0x8DD9, 46950 - 44032: 0x8DDA, 46951 - 44032: 0x8DDB, 46952 - 44032: 0xB6EE, 46953 - 44032: 0x8DDC, 46954 - 44032: 0x8DDD, 46955 - 44032: 0x8DDE, 46956 - 44032: 0x8DDF, 46957 - 44032: 0x8DE0, 46958 - 44032: 0x8DE1, 46959 - 44032: 0x8DE2, 46960 - 44032: 0xB6EF, 46961 - 44032: 0xB6F0, 46962 - 44032: 0x8DE3, 46963 - 44032: 0xB6F1, 46964 - 44032: 0x8DE4, 46965 - 44032: 0xB6F2, 46966 - 44032: 0x8DE5, 46967 - 44032: 0x8DE6, 46968 - 44032: 0x8DE7, 46969 - 44032: 0x8DE8, 46970 - 44032: 0x8DE9, 46971 - 44032: 0x8DEA, 46972 - 44032: 0xB6F3, 46973 - 44032: 0xB6F4, 46974 - 44032: 0x8DEB, 46975 - 44032: 0x8DEC, 46976 - 44032: 0xB6F5, 46977 - 44032: 0x8DED, 46978 - 44032: 0x8DEE, 46979 - 44032: 0x8DEF, 46980 - 44032: 0xB6F6, 46981 - 44032: 0x8DF0, 46982 - 44032: 0x8DF1, 46983 - 44032: 0x8DF2, 46984 - 44032: 0x8DF3, 46985 - 44032: 0x8DF4, 46986 - 44032: 0x8DF5, 46987 - 44032: 0x8DF6, 46988 - 44032: 0xB6F7, 46989 - 44032: 0xB6F8, 46990 - 44032: 0x8DF7, 46991 - 44032: 0xB6F9, 46992 - 44032: 0xB6FA, 46993 - 44032: 0xB6FB, 46994 - 44032: 0xB6FC, 46995 - 44032: 0x8DF8, 46996 - 44032: 0x8DF9, 46997 - 44032: 0x8DFA, 46998 - 44032: 0xB6FD, 46999 - 44032: 0xB6FE, 47000 - 44032: 0xB7A1, 47001 - 44032: 0xB7A2, 47002 - 44032: 0x8DFB, 47003 - 44032: 0x8DFC, 47004 - 44032: 0xB7A3, 47005 - 44032: 0x8DFD, 47006 - 44032: 0x8DFE, 47007 - 44032: 0x8E41, 47008 - 44032: 0xB7A4, 47009 - 44032: 0x8E42, 47010 - 44032: 0x8E43, 47011 - 44032: 0x8E44, 47012 - 44032: 0x8E45, 47013 - 44032: 0x8E46, 47014 - 44032: 0x8E47, 47015 - 44032: 0x8E48, 47016 - 44032: 0xB7A5, 47017 - 44032: 0xB7A6, 47018 - 44032: 0x8E49, 47019 - 44032: 0xB7A7, 47020 - 44032: 0xB7A8, 47021 - 44032: 0xB7A9, 47022 - 44032: 0x8E4A, 47023 - 44032: 0x8E4B, 47024 - 44032: 0x8E4C, 47025 - 44032: 0x8E4D, 47026 - 44032: 0x8E4E, 47027 - 44032: 0x8E4F, 47028 - 44032: 0xB7AA, 47029 - 44032: 0xB7AB, 47030 - 44032: 0x8E50, 47031 - 44032: 0x8E51, 47032 - 44032: 0xB7AC, 47033 - 44032: 0x8E52, 47034 - 44032: 0x8E53, 47035 - 44032: 0x8E54, 47036 - 44032: 0x8E55, 47037 - 44032: 0x8E56, 47038 - 44032: 0x8E57, 47039 - 44032: 0x8E58, 47040 - 44032: 0x8E59, 47041 - 44032: 0x8E5A, 47042 - 44032: 0x8E61, 47043 - 44032: 0x8E62, 47044 - 44032: 0x8E63, 47045 - 44032: 0x8E64, 47046 - 44032: 0x8E65, 47047 - 44032: 0xB7AD, 47048 - 44032: 0x8E66, 47049 - 44032: 0xB7AE, 47050 - 44032: 0x8E67, 47051 - 44032: 0x8E68, 47052 - 44032: 0x8E69, 47053 - 44032: 0x8E6A, 47054 - 44032: 0x8E6B, 47055 - 44032: 0x8E6C, 47056 - 44032: 0x8E6D, 47057 - 44032: 0x8E6E, 47058 - 44032: 0x8E6F, 47059 - 44032: 0x8E70, 47060 - 44032: 0x8E71, 47061 - 44032: 0x8E72, 47062 - 44032: 0x8E73, 47063 - 44032: 0x8E74, 47064 - 44032: 0x8E75, 47065 - 44032: 0x8E76, 47066 - 44032: 0x8E77, 47067 - 44032: 0x8E78, 47068 - 44032: 0x8E79, 47069 - 44032: 0x8E7A, 47070 - 44032: 0x8E81, 47071 - 44032: 0x8E82, 47072 - 44032: 0x8E83, 47073 - 44032: 0x8E84, 47074 - 44032: 0x8E85, 47075 - 44032: 0x8E86, 47076 - 44032: 0x8E87, 47077 - 44032: 0x8E88, 47078 - 44032: 0x8E89, 47079 - 44032: 0x8E8A, 47080 - 44032: 0x8E8B, 47081 - 44032: 0x8E8C, 47082 - 44032: 0x8E8D, 47083 - 44032: 0x8E8E, 47084 - 44032: 0xB7AF, 47085 - 44032: 0xB7B0, 47086 - 44032: 0x8E8F, 47087 - 44032: 0x8E90, 47088 - 44032: 0xB7B1, 47089 - 44032: 0x8E91, 47090 - 44032: 0x8E92, 47091 - 44032: 0x8E93, 47092 - 44032: 0xB7B2, 47093 - 44032: 0x8E94, 47094 - 44032: 0x8E95, 47095 - 44032: 0x8E96, 47096 - 44032: 0x8E97, 47097 - 44032: 0x8E98, 47098 - 44032: 0x8E99, 47099 - 44032: 0x8E9A, 47100 - 44032: 0xB7B3, 47101 - 44032: 0xB7B4, 47102 - 44032: 0x8E9B, 47103 - 44032: 0xB7B5, 47104 - 44032: 0xB7B6, 47105 - 44032: 0xB7B7, 47106 - 44032: 0x8E9C, 47107 - 44032: 0x8E9D, 47108 - 44032: 0x8E9E, 47109 - 44032: 0x8E9F, 47110 - 44032: 0x8EA0, 47111 - 44032: 0xB7B8, 47112 - 44032: 0xB7B9, 47113 - 44032: 0xB7BA, 47114 - 44032: 0x8EA1, 47115 - 44032: 0x8EA2, 47116 - 44032: 0xB7BB, 47117 - 44032: 0x8EA3, 47118 - 44032: 0x8EA4, 47119 - 44032: 0x8EA5, 47120 - 44032: 0xB7BC, 47121 - 44032: 0x8EA6, 47122 - 44032: 0x8EA7, 47123 - 44032: 0x8EA8, 47124 - 44032: 0x8EA9, 47125 - 44032: 0x8EAA, 47126 - 44032: 0x8EAB, 47127 - 44032: 0x8EAC, 47128 - 44032: 0xB7BD, 47129 - 44032: 0xB7BE, 47130 - 44032: 0x8EAD, 47131 - 44032: 0xB7BF, 47132 - 44032: 0x8EAE, 47133 - 44032: 0xB7C0, 47134 - 44032: 0x8EAF, 47135 - 44032: 0x8EB0, 47136 - 44032: 0x8EB1, 47137 - 44032: 0x8EB2, 47138 - 44032: 0x8EB3, 47139 - 44032: 0x8EB4, 47140 - 44032: 0xB7C1, 47141 - 44032: 0xB7C2, 47142 - 44032: 0x8EB5, 47143 - 44032: 0x8EB6, 47144 - 44032: 0xB7C3, 47145 - 44032: 0x8EB7, 47146 - 44032: 0x8EB8, 47147 - 44032: 0x8EB9, 47148 - 44032: 0xB7C4, 47149 - 44032: 0x8EBA, 47150 - 44032: 0x8EBB, 47151 - 44032: 0x8EBC, 47152 - 44032: 0x8EBD, 47153 - 44032: 0x8EBE, 47154 - 44032: 0x8EBF, 47155 - 44032: 0x8EC0, 47156 - 44032: 0xB7C5, 47157 - 44032: 0xB7C6, 47158 - 44032: 0x8EC1, 47159 - 44032: 0xB7C7, 47160 - 44032: 0xB7C8, 47161 - 44032: 0xB7C9, 47162 - 44032: 0x8EC2, 47163 - 44032: 0x8EC3, 47164 - 44032: 0x8EC4, 47165 - 44032: 0x8EC5, 47166 - 44032: 0x8EC6, 47167 - 44032: 0x8EC7, 47168 - 44032: 0xB7CA, 47169 - 44032: 0x8EC8, 47170 - 44032: 0x8EC9, 47171 - 44032: 0x8ECA, 47172 - 44032: 0xB7CB, 47173 - 44032: 0x8ECB, 47174 - 44032: 0x8ECC, 47175 - 44032: 0x8ECD, 47176 - 44032: 0x8ECE, 47177 - 44032: 0x8ECF, 47178 - 44032: 0x8ED0, 47179 - 44032: 0x8ED1, 47180 - 44032: 0x8ED2, 47181 - 44032: 0x8ED3, 47182 - 44032: 0x8ED4, 47183 - 44032: 0x8ED5, 47184 - 44032: 0x8ED6, 47185 - 44032: 0xB7CC, 47186 - 44032: 0x8ED7, 47187 - 44032: 0xB7CD, 47188 - 44032: 0x8ED8, 47189 - 44032: 0x8ED9, 47190 - 44032: 0x8EDA, 47191 - 44032: 0x8EDB, 47192 - 44032: 0x8EDC, 47193 - 44032: 0x8EDD, 47194 - 44032: 0x8EDE, 47195 - 44032: 0x8EDF, 47196 - 44032: 0xB7CE, 47197 - 44032: 0xB7CF, 47198 - 44032: 0x8EE0, 47199 - 44032: 0x8EE1, 47200 - 44032: 0xB7D0, 47201 - 44032: 0x8EE2, 47202 - 44032: 0x8EE3, 47203 - 44032: 0x8EE4, 47204 - 44032: 0xB7D1, 47205 - 44032: 0x8EE5, 47206 - 44032: 0x8EE6, 47207 - 44032: 0x8EE7, 47208 - 44032: 0x8EE8, 47209 - 44032: 0x8EE9, 47210 - 44032: 0x8EEA, 47211 - 44032: 0x8EEB, 47212 - 44032: 0xB7D2, 47213 - 44032: 0xB7D3, 47214 - 44032: 0x8EEC, 47215 - 44032: 0xB7D4, 47216 - 44032: 0x8EED, 47217 - 44032: 0xB7D5, 47218 - 44032: 0x8EEE, 47219 - 44032: 0x8EEF, 47220 - 44032: 0x8EF0, 47221 - 44032: 0x8EF1, 47222 - 44032: 0x8EF2, 47223 - 44032: 0x8EF3, 47224 - 44032: 0xB7D6, 47225 - 44032: 0x8EF4, 47226 - 44032: 0x8EF5, 47227 - 44032: 0x8EF6, 47228 - 44032: 0xB7D7, 47229 - 44032: 0x8EF7, 47230 - 44032: 0x8EF8, 47231 - 44032: 0x8EF9, 47232 - 44032: 0x8EFA, 47233 - 44032: 0x8EFB, 47234 - 44032: 0x8EFC, 47235 - 44032: 0x8EFD, 47236 - 44032: 0x8EFE, 47237 - 44032: 0x8F41, 47238 - 44032: 0x8F42, 47239 - 44032: 0x8F43, 47240 - 44032: 0x8F44, 47241 - 44032: 0x8F45, 47242 - 44032: 0x8F46, 47243 - 44032: 0x8F47, 47244 - 44032: 0x8F48, 47245 - 44032: 0xB7D8, 47246 - 44032: 0x8F49, 47247 - 44032: 0x8F4A, 47248 - 44032: 0x8F4B, 47249 - 44032: 0x8F4C, 47250 - 44032: 0x8F4D, 47251 - 44032: 0x8F4E, 47252 - 44032: 0x8F4F, 47253 - 44032: 0x8F50, 47254 - 44032: 0x8F51, 47255 - 44032: 0x8F52, 47256 - 44032: 0x8F53, 47257 - 44032: 0x8F54, 47258 - 44032: 0x8F55, 47259 - 44032: 0x8F56, 47260 - 44032: 0x8F57, 47261 - 44032: 0x8F58, 47262 - 44032: 0x8F59, 47263 - 44032: 0x8F5A, 47264 - 44032: 0x8F61, 47265 - 44032: 0x8F62, 47266 - 44032: 0x8F63, 47267 - 44032: 0x8F64, 47268 - 44032: 0x8F65, 47269 - 44032: 0x8F66, 47270 - 44032: 0x8F67, 47271 - 44032: 0x8F68, 47272 - 44032: 0xB7D9, 47273 - 44032: 0x8F69, 47274 - 44032: 0x8F6A, 47275 - 44032: 0x8F6B, 47276 - 44032: 0x8F6C, 47277 - 44032: 0x8F6D, 47278 - 44032: 0x8F6E, 47279 - 44032: 0x8F6F, 47280 - 44032: 0xB7DA, 47281 - 44032: 0x8F70, 47282 - 44032: 0x8F71, 47283 - 44032: 0x8F72, 47284 - 44032: 0xB7DB, 47285 - 44032: 0x8F73, 47286 - 44032: 0x8F74, 47287 - 44032: 0x8F75, 47288 - 44032: 0xB7DC, 47289 - 44032: 0x8F76, 47290 - 44032: 0x8F77, 47291 - 44032: 0x8F78, 47292 - 44032: 0x8F79, 47293 - 44032: 0x8F7A, 47294 - 44032: 0x8F81, 47295 - 44032: 0x8F82, 47296 - 44032: 0xB7DD, 47297 - 44032: 0xB7DE, 47298 - 44032: 0x8F83, 47299 - 44032: 0xB7DF, 47300 - 44032: 0x8F84, 47301 - 44032: 0xB7E0, 47302 - 44032: 0x8F85, 47303 - 44032: 0x8F86, 47304 - 44032: 0x8F87, 47305 - 44032: 0x8F88, 47306 - 44032: 0x8F89, 47307 - 44032: 0x8F8A, 47308 - 44032: 0xB7E1, 47309 - 44032: 0x8F8B, 47310 - 44032: 0x8F8C, 47311 - 44032: 0x8F8D, 47312 - 44032: 0xB7E2, 47313 - 44032: 0x8F8E, 47314 - 44032: 0x8F8F, 47315 - 44032: 0x8F90, 47316 - 44032: 0xB7E3, 47317 - 44032: 0x8F91, 47318 - 44032: 0x8F92, 47319 - 44032: 0x8F93, 47320 - 44032: 0x8F94, 47321 - 44032: 0x8F95, 47322 - 44032: 0x8F96, 47323 - 44032: 0x8F97, 47324 - 44032: 0x8F98, 47325 - 44032: 0xB7E4, 47326 - 44032: 0x8F99, 47327 - 44032: 0xB7E5, 47328 - 44032: 0x8F9A, 47329 - 44032: 0xB7E6, 47330 - 44032: 0x8F9B, 47331 - 44032: 0x8F9C, 47332 - 44032: 0x8F9D, 47333 - 44032: 0x8F9E, 47334 - 44032: 0x8F9F, 47335 - 44032: 0x8FA0, 47336 - 44032: 0xB7E7, 47337 - 44032: 0xB7E8, 47338 - 44032: 0x8FA1, 47339 - 44032: 0x8FA2, 47340 - 44032: 0xB7E9, 47341 - 44032: 0x8FA3, 47342 - 44032: 0x8FA4, 47343 - 44032: 0x8FA5, 47344 - 44032: 0xB7EA, 47345 - 44032: 0x8FA6, 47346 - 44032: 0x8FA7, 47347 - 44032: 0x8FA8, 47348 - 44032: 0x8FA9, 47349 - 44032: 0x8FAA, 47350 - 44032: 0x8FAB, 47351 - 44032: 0x8FAC, 47352 - 44032: 0xB7EB, 47353 - 44032: 0xB7EC, 47354 - 44032: 0x8FAD, 47355 - 44032: 0xB7ED, 47356 - 44032: 0x8FAE, 47357 - 44032: 0xB7EE, 47358 - 44032: 0x8FAF, 47359 - 44032: 0x8FB0, 47360 - 44032: 0x8FB1, 47361 - 44032: 0x8FB2, 47362 - 44032: 0x8FB3, 47363 - 44032: 0x8FB4, 47364 - 44032: 0xB7EF, 47365 - 44032: 0x8FB5, 47366 - 44032: 0x8FB6, 47367 - 44032: 0x8FB7, 47368 - 44032: 0x8FB8, 47369 - 44032: 0x8FB9, 47370 - 44032: 0x8FBA, 47371 - 44032: 0x8FBB, 47372 - 44032: 0x8FBC, 47373 - 44032: 0x8FBD, 47374 - 44032: 0x8FBE, 47375 - 44032: 0x8FBF, 47376 - 44032: 0x8FC0, 47377 - 44032: 0x8FC1, 47378 - 44032: 0x8FC2, 47379 - 44032: 0x8FC3, 47380 - 44032: 0x8FC4, 47381 - 44032: 0x8FC5, 47382 - 44032: 0x8FC6, 47383 - 44032: 0x8FC7, 47384 - 44032: 0xB7F0, 47385 - 44032: 0x8FC8, 47386 - 44032: 0x8FC9, 47387 - 44032: 0x8FCA, 47388 - 44032: 0x8FCB, 47389 - 44032: 0x8FCC, 47390 - 44032: 0x8FCD, 47391 - 44032: 0x8FCE, 47392 - 44032: 0xB7F1, 47393 - 44032: 0x8FCF, 47394 - 44032: 0x8FD0, 47395 - 44032: 0x8FD1, 47396 - 44032: 0x8FD2, 47397 - 44032: 0x8FD3, 47398 - 44032: 0x8FD4, 47399 - 44032: 0x8FD5, 47400 - 44032: 0x8FD6, 47401 - 44032: 0x8FD7, 47402 - 44032: 0x8FD8, 47403 - 44032: 0x8FD9, 47404 - 44032: 0x8FDA, 47405 - 44032: 0x8FDB, 47406 - 44032: 0x8FDC, 47407 - 44032: 0x8FDD, 47408 - 44032: 0x8FDE, 47409 - 44032: 0x8FDF, 47410 - 44032: 0x8FE0, 47411 - 44032: 0x8FE1, 47412 - 44032: 0x8FE2, 47413 - 44032: 0x8FE3, 47414 - 44032: 0x8FE4, 47415 - 44032: 0x8FE5, 47416 - 44032: 0x8FE6, 47417 - 44032: 0x8FE7, 47418 - 44032: 0x8FE8, 47419 - 44032: 0x8FE9, 47420 - 44032: 0xB7F2, 47421 - 44032: 0xB7F3, 47422 - 44032: 0x8FEA, 47423 - 44032: 0x8FEB, 47424 - 44032: 0xB7F4, 47425 - 44032: 0x8FEC, 47426 - 44032: 0x8FED, 47427 - 44032: 0x8FEE, 47428 - 44032: 0xB7F5, 47429 - 44032: 0x8FEF, 47430 - 44032: 0x8FF0, 47431 - 44032: 0x8FF1, 47432 - 44032: 0x8FF2, 47433 - 44032: 0x8FF3, 47434 - 44032: 0x8FF4, 47435 - 44032: 0x8FF5, 47436 - 44032: 0xB7F6, 47437 - 44032: 0x8FF6, 47438 - 44032: 0x8FF7, 47439 - 44032: 0xB7F7, 47440 - 44032: 0x8FF8, 47441 - 44032: 0xB7F8, 47442 - 44032: 0x8FF9, 47443 - 44032: 0x8FFA, 47444 - 44032: 0x8FFB, 47445 - 44032: 0x8FFC, 47446 - 44032: 0x8FFD, 47447 - 44032: 0x8FFE, 47448 - 44032: 0xB7F9, 47449 - 44032: 0xB7FA, 47450 - 44032: 0x9041, 47451 - 44032: 0x9042, 47452 - 44032: 0xB7FB, 47453 - 44032: 0x9043, 47454 - 44032: 0x9044, 47455 - 44032: 0x9045, 47456 - 44032: 0xB7FC, 47457 - 44032: 0x9046, 47458 - 44032: 0x9047, 47459 - 44032: 0x9048, 47460 - 44032: 0x9049, 47461 - 44032: 0x904A, 47462 - 44032: 0x904B, 47463 - 44032: 0x904C, 47464 - 44032: 0xB7FD, 47465 - 44032: 0xB7FE, 47466 - 44032: 0x904D, 47467 - 44032: 0xB8A1, 47468 - 44032: 0x904E, 47469 - 44032: 0xB8A2, 47470 - 44032: 0x904F, 47471 - 44032: 0x9050, 47472 - 44032: 0x9051, 47473 - 44032: 0x9052, 47474 - 44032: 0x9053, 47475 - 44032: 0x9054, 47476 - 44032: 0xB8A3, 47477 - 44032: 0xB8A4, 47478 - 44032: 0x9055, 47479 - 44032: 0x9056, 47480 - 44032: 0xB8A5, 47481 - 44032: 0x9057, 47482 - 44032: 0x9058, 47483 - 44032: 0x9059, 47484 - 44032: 0xB8A6, 47485 - 44032: 0x905A, 47486 - 44032: 0x9061, 47487 - 44032: 0x9062, 47488 - 44032: 0x9063, 47489 - 44032: 0x9064, 47490 - 44032: 0x9065, 47491 - 44032: 0x9066, 47492 - 44032: 0xB8A7, 47493 - 44032: 0xB8A8, 47494 - 44032: 0x9067, 47495 - 44032: 0xB8A9, 47496 - 44032: 0x9068, 47497 - 44032: 0xB8AA, 47498 - 44032: 0xB8AB, 47499 - 44032: 0x9069, 47500 - 44032: 0x906A, 47501 - 44032: 0xB8AC, 47502 - 44032: 0xB8AD, 47503 - 44032: 0x906B, 47504 - 44032: 0x906C, 47505 - 44032: 0x906D, 47506 - 44032: 0x906E, 47507 - 44032: 0x906F, 47508 - 44032: 0x9070, 47509 - 44032: 0x9071, 47510 - 44032: 0x9072, 47511 - 44032: 0x9073, 47512 - 44032: 0x9074, 47513 - 44032: 0x9075, 47514 - 44032: 0x9076, 47515 - 44032: 0x9077, 47516 - 44032: 0x9078, 47517 - 44032: 0x9079, 47518 - 44032: 0x907A, 47519 - 44032: 0x9081, 47520 - 44032: 0x9082, 47521 - 44032: 0x9083, 47522 - 44032: 0x9084, 47523 - 44032: 0x9085, 47524 - 44032: 0x9086, 47525 - 44032: 0x9087, 47526 - 44032: 0x9088, 47527 - 44032: 0x9089, 47528 - 44032: 0x908A, 47529 - 44032: 0x908B, 47530 - 44032: 0x908C, 47531 - 44032: 0x908D, 47532 - 44032: 0xB8AE, 47533 - 44032: 0xB8AF, 47534 - 44032: 0x908E, 47535 - 44032: 0x908F, 47536 - 44032: 0xB8B0, 47537 - 44032: 0x9090, 47538 - 44032: 0x9091, 47539 - 44032: 0x9092, 47540 - 44032: 0xB8B1, 47541 - 44032: 0x9093, 47542 - 44032: 0x9094, 47543 - 44032: 0x9095, 47544 - 44032: 0x9096, 47545 - 44032: 0x9097, 47546 - 44032: 0x9098, 47547 - 44032: 0x9099, 47548 - 44032: 0xB8B2, 47549 - 44032: 0xB8B3, 47550 - 44032: 0x909A, 47551 - 44032: 0xB8B4, 47552 - 44032: 0x909B, 47553 - 44032: 0xB8B5, 47554 - 44032: 0x909C, 47555 - 44032: 0x909D, 47556 - 44032: 0x909E, 47557 - 44032: 0x909F, 47558 - 44032: 0x90A0, 47559 - 44032: 0x90A1, 47560 - 44032: 0xB8B6, 47561 - 44032: 0xB8B7, 47562 - 44032: 0x90A2, 47563 - 44032: 0x90A3, 47564 - 44032: 0xB8B8, 47565 - 44032: 0x90A4, 47566 - 44032: 0xB8B9, 47567 - 44032: 0xB8BA, 47568 - 44032: 0xB8BB, 47569 - 44032: 0xB8BC, 47570 - 44032: 0xB8BD, 47571 - 44032: 0x90A5, 47572 - 44032: 0x90A6, 47573 - 44032: 0x90A7, 47574 - 44032: 0x90A8, 47575 - 44032: 0x90A9, 47576 - 44032: 0xB8BE, 47577 - 44032: 0xB8BF, 47578 - 44032: 0x90AA, 47579 - 44032: 0xB8C0, 47580 - 44032: 0x90AB, 47581 - 44032: 0xB8C1, 47582 - 44032: 0xB8C2, 47583 - 44032: 0x90AC, 47584 - 44032: 0x90AD, 47585 - 44032: 0xB8C3, 47586 - 44032: 0x90AE, 47587 - 44032: 0xB8C4, 47588 - 44032: 0xB8C5, 47589 - 44032: 0xB8C6, 47590 - 44032: 0x90AF, 47591 - 44032: 0x90B0, 47592 - 44032: 0xB8C7, 47593 - 44032: 0x90B1, 47594 - 44032: 0x90B2, 47595 - 44032: 0x90B3, 47596 - 44032: 0xB8C8, 47597 - 44032: 0x90B4, 47598 - 44032: 0x90B5, 47599 - 44032: 0x90B6, 47600 - 44032: 0x90B7, 47601 - 44032: 0x90B8, 47602 - 44032: 0x90B9, 47603 - 44032: 0x90BA, 47604 - 44032: 0xB8C9, 47605 - 44032: 0xB8CA, 47606 - 44032: 0x90BB, 47607 - 44032: 0xB8CB, 47608 - 44032: 0xB8CC, 47609 - 44032: 0xB8CD, 47610 - 44032: 0xB8CE, 47611 - 44032: 0x90BC, 47612 - 44032: 0x90BD, 47613 - 44032: 0x90BE, 47614 - 44032: 0x90BF, 47615 - 44032: 0x90C0, 47616 - 44032: 0xB8CF, 47617 - 44032: 0xB8D0, 47618 - 44032: 0x90C1, 47619 - 44032: 0x90C2, 47620 - 44032: 0x90C3, 47621 - 44032: 0x90C4, 47622 - 44032: 0x90C5, 47623 - 44032: 0x90C6, 47624 - 44032: 0xB8D1, 47625 - 44032: 0x90C7, 47626 - 44032: 0x90C8, 47627 - 44032: 0x90C9, 47628 - 44032: 0x90CA, 47629 - 44032: 0x90CB, 47630 - 44032: 0x90CC, 47631 - 44032: 0x90CD, 47632 - 44032: 0x90CE, 47633 - 44032: 0x90CF, 47634 - 44032: 0x90D0, 47635 - 44032: 0x90D1, 47636 - 44032: 0x90D2, 47637 - 44032: 0xB8D2, 47638 - 44032: 0x90D3, 47639 - 44032: 0x90D4, 47640 - 44032: 0x90D5, 47641 - 44032: 0x90D6, 47642 - 44032: 0x90D7, 47643 - 44032: 0x90D8, 47644 - 44032: 0x90D9, 47645 - 44032: 0x90DA, 47646 - 44032: 0x90DB, 47647 - 44032: 0x90DC, 47648 - 44032: 0x90DD, 47649 - 44032: 0x90DE, 47650 - 44032: 0x90DF, 47651 - 44032: 0x90E0, 47652 - 44032: 0x90E1, 47653 - 44032: 0x90E2, 47654 - 44032: 0x90E3, 47655 - 44032: 0x90E4, 47656 - 44032: 0x90E5, 47657 - 44032: 0x90E6, 47658 - 44032: 0x90E7, 47659 - 44032: 0x90E8, 47660 - 44032: 0x90E9, 47661 - 44032: 0x90EA, 47662 - 44032: 0x90EB, 47663 - 44032: 0x90EC, 47664 - 44032: 0x90ED, 47665 - 44032: 0x90EE, 47666 - 44032: 0x90EF, 47667 - 44032: 0x90F0, 47668 - 44032: 0x90F1, 47669 - 44032: 0x90F2, 47670 - 44032: 0x90F3, 47671 - 44032: 0x90F4, 47672 - 44032: 0xB8D3, 47673 - 44032: 0xB8D4, 47674 - 44032: 0x90F5, 47675 - 44032: 0x90F6, 47676 - 44032: 0xB8D5, 47677 - 44032: 0x90F7, 47678 - 44032: 0x90F8, 47679 - 44032: 0x90F9, 47680 - 44032: 0xB8D6, 47681 - 44032: 0x90FA, 47682 - 44032: 0xB8D7, 47683 - 44032: 0x90FB, 47684 - 44032: 0x90FC, 47685 - 44032: 0x90FD, 47686 - 44032: 0x90FE, 47687 - 44032: 0x9141, 47688 - 44032: 0xB8D8, 47689 - 44032: 0xB8D9, 47690 - 44032: 0x9142, 47691 - 44032: 0xB8DA, 47692 - 44032: 0x9143, 47693 - 44032: 0xB8DB, 47694 - 44032: 0xB8DC, 47695 - 44032: 0x9144, 47696 - 44032: 0x9145, 47697 - 44032: 0x9146, 47698 - 44032: 0x9147, 47699 - 44032: 0xB8DD, 47700 - 44032: 0xB8DE, 47701 - 44032: 0xB8DF, 47702 - 44032: 0x9148, 47703 - 44032: 0x9149, 47704 - 44032: 0xB8E0, 47705 - 44032: 0x914A, 47706 - 44032: 0x914B, 47707 - 44032: 0x914C, 47708 - 44032: 0xB8E1, 47709 - 44032: 0x914D, 47710 - 44032: 0x914E, 47711 - 44032: 0x914F, 47712 - 44032: 0x9150, 47713 - 44032: 0x9151, 47714 - 44032: 0x9152, 47715 - 44032: 0x9153, 47716 - 44032: 0xB8E2, 47717 - 44032: 0xB8E3, 47718 - 44032: 0x9154, 47719 - 44032: 0xB8E4, 47720 - 44032: 0xB8E5, 47721 - 44032: 0xB8E6, 47722 - 44032: 0x9155, 47723 - 44032: 0x9156, 47724 - 44032: 0x9157, 47725 - 44032: 0x9158, 47726 - 44032: 0x9159, 47727 - 44032: 0x915A, 47728 - 44032: 0xB8E7, 47729 - 44032: 0xB8E8, 47730 - 44032: 0x9161, 47731 - 44032: 0x9162, 47732 - 44032: 0xB8E9, 47733 - 44032: 0x9163, 47734 - 44032: 0x9164, 47735 - 44032: 0x9165, 47736 - 44032: 0xB8EA, 47737 - 44032: 0x9166, 47738 - 44032: 0x9167, 47739 - 44032: 0x9168, 47740 - 44032: 0x9169, 47741 - 44032: 0x916A, 47742 - 44032: 0x916B, 47743 - 44032: 0x916C, 47744 - 44032: 0x916D, 47745 - 44032: 0x916E, 47746 - 44032: 0x916F, 47747 - 44032: 0xB8EB, 47748 - 44032: 0xB8EC, 47749 - 44032: 0xB8ED, 47750 - 44032: 0x9170, 47751 - 44032: 0xB8EE, 47752 - 44032: 0x9171, 47753 - 44032: 0x9172, 47754 - 44032: 0x9173, 47755 - 44032: 0x9174, 47756 - 44032: 0xB8EF, 47757 - 44032: 0x9175, 47758 - 44032: 0x9176, 47759 - 44032: 0x9177, 47760 - 44032: 0x9178, 47761 - 44032: 0x9179, 47762 - 44032: 0x917A, 47763 - 44032: 0x9181, 47764 - 44032: 0x9182, 47765 - 44032: 0x9183, 47766 - 44032: 0x9184, 47767 - 44032: 0x9185, 47768 - 44032: 0x9186, 47769 - 44032: 0x9187, 47770 - 44032: 0x9188, 47771 - 44032: 0x9189, 47772 - 44032: 0x918A, 47773 - 44032: 0x918B, 47774 - 44032: 0x918C, 47775 - 44032: 0x918D, 47776 - 44032: 0x918E, 47777 - 44032: 0x918F, 47778 - 44032: 0x9190, 47779 - 44032: 0x9191, 47780 - 44032: 0x9192, 47781 - 44032: 0x9193, 47782 - 44032: 0x9194, 47783 - 44032: 0x9195, 47784 - 44032: 0xB8F0, 47785 - 44032: 0xB8F1, 47786 - 44032: 0x9196, 47787 - 44032: 0xB8F2, 47788 - 44032: 0xB8F3, 47789 - 44032: 0x9197, 47790 - 44032: 0x9198, 47791 - 44032: 0x9199, 47792 - 44032: 0xB8F4, 47793 - 44032: 0x919A, 47794 - 44032: 0xB8F5, 47795 - 44032: 0x919B, 47796 - 44032: 0x919C, 47797 - 44032: 0x919D, 47798 - 44032: 0x919E, 47799 - 44032: 0x919F, 47800 - 44032: 0xB8F6, 47801 - 44032: 0xB8F7, 47802 - 44032: 0x91A0, 47803 - 44032: 0xB8F8, 47804 - 44032: 0x91A1, 47805 - 44032: 0xB8F9, 47806 - 44032: 0x91A2, 47807 - 44032: 0x91A3, 47808 - 44032: 0x91A4, 47809 - 44032: 0x91A5, 47810 - 44032: 0x91A6, 47811 - 44032: 0x91A7, 47812 - 44032: 0xB8FA, 47813 - 44032: 0x91A8, 47814 - 44032: 0x91A9, 47815 - 44032: 0x91AA, 47816 - 44032: 0xB8FB, 47817 - 44032: 0x91AB, 47818 - 44032: 0x91AC, 47819 - 44032: 0x91AD, 47820 - 44032: 0x91AE, 47821 - 44032: 0x91AF, 47822 - 44032: 0x91B0, 47823 - 44032: 0x91B1, 47824 - 44032: 0x91B2, 47825 - 44032: 0x91B3, 47826 - 44032: 0x91B4, 47827 - 44032: 0x91B5, 47828 - 44032: 0x91B6, 47829 - 44032: 0x91B7, 47830 - 44032: 0x91B8, 47831 - 44032: 0x91B9, 47832 - 44032: 0xB8FC, 47833 - 44032: 0xB8FD, 47834 - 44032: 0x91BA, 47835 - 44032: 0x91BB, 47836 - 44032: 0x91BC, 47837 - 44032: 0x91BD, 47838 - 44032: 0x91BE, 47839 - 44032: 0x91BF, 47840 - 44032: 0x91C0, 47841 - 44032: 0x91C1, 47842 - 44032: 0x91C2, 47843 - 44032: 0x91C3, 47844 - 44032: 0x91C4, 47845 - 44032: 0x91C5, 47846 - 44032: 0x91C6, 47847 - 44032: 0x91C7, 47848 - 44032: 0x91C8, 47849 - 44032: 0x91C9, 47850 - 44032: 0x91CA, 47851 - 44032: 0x91CB, 47852 - 44032: 0x91CC, 47853 - 44032: 0x91CD, 47854 - 44032: 0x91CE, 47855 - 44032: 0x91CF, 47856 - 44032: 0x91D0, 47857 - 44032: 0x91D1, 47858 - 44032: 0x91D2, 47859 - 44032: 0x91D3, 47860 - 44032: 0x91D4, 47861 - 44032: 0x91D5, 47862 - 44032: 0x91D6, 47863 - 44032: 0x91D7, 47864 - 44032: 0x91D8, 47865 - 44032: 0x91D9, 47866 - 44032: 0x91DA, 47867 - 44032: 0x91DB, 47868 - 44032: 0xB8FE, 47869 - 44032: 0x91DC, 47870 - 44032: 0x91DD, 47871 - 44032: 0x91DE, 47872 - 44032: 0xB9A1, 47873 - 44032: 0x91DF, 47874 - 44032: 0x91E0, 47875 - 44032: 0x91E1, 47876 - 44032: 0xB9A2, 47877 - 44032: 0x91E2, 47878 - 44032: 0x91E3, 47879 - 44032: 0x91E4, 47880 - 44032: 0x91E5, 47881 - 44032: 0x91E6, 47882 - 44032: 0x91E7, 47883 - 44032: 0x91E8, 47884 - 44032: 0x91E9, 47885 - 44032: 0xB9A3, 47886 - 44032: 0x91EA, 47887 - 44032: 0xB9A4, 47888 - 44032: 0x91EB, 47889 - 44032: 0xB9A5, 47890 - 44032: 0x91EC, 47891 - 44032: 0x91ED, 47892 - 44032: 0x91EE, 47893 - 44032: 0x91EF, 47894 - 44032: 0x91F0, 47895 - 44032: 0x91F1, 47896 - 44032: 0xB9A6, 47897 - 44032: 0x91F2, 47898 - 44032: 0x91F3, 47899 - 44032: 0x91F4, 47900 - 44032: 0xB9A7, 47901 - 44032: 0x91F5, 47902 - 44032: 0x91F6, 47903 - 44032: 0x91F7, 47904 - 44032: 0xB9A8, 47905 - 44032: 0x91F8, 47906 - 44032: 0x91F9, 47907 - 44032: 0x91FA, 47908 - 44032: 0x91FB, 47909 - 44032: 0x91FC, 47910 - 44032: 0x91FD, 47911 - 44032: 0x91FE, 47912 - 44032: 0x9241, 47913 - 44032: 0xB9A9, 47914 - 44032: 0x9242, 47915 - 44032: 0xB9AA, 47916 - 44032: 0x9243, 47917 - 44032: 0x9244, 47918 - 44032: 0x9245, 47919 - 44032: 0x9246, 47920 - 44032: 0x9247, 47921 - 44032: 0x9248, 47922 - 44032: 0x9249, 47923 - 44032: 0x924A, 47924 - 44032: 0xB9AB, 47925 - 44032: 0xB9AC, 47926 - 44032: 0xB9AD, 47927 - 44032: 0x924B, 47928 - 44032: 0xB9AE, 47929 - 44032: 0x924C, 47930 - 44032: 0x924D, 47931 - 44032: 0xB9AF, 47932 - 44032: 0xB9B0, 47933 - 44032: 0xB9B1, 47934 - 44032: 0xB9B2, 47935 - 44032: 0x924E, 47936 - 44032: 0x924F, 47937 - 44032: 0x9250, 47938 - 44032: 0x9251, 47939 - 44032: 0x9252, 47940 - 44032: 0xB9B3, 47941 - 44032: 0xB9B4, 47942 - 44032: 0x9253, 47943 - 44032: 0xB9B5, 47944 - 44032: 0x9254, 47945 - 44032: 0xB9B6, 47946 - 44032: 0x9255, 47947 - 44032: 0x9256, 47948 - 44032: 0x9257, 47949 - 44032: 0xB9B7, 47950 - 44032: 0x9258, 47951 - 44032: 0xB9B8, 47952 - 44032: 0xB9B9, 47953 - 44032: 0x9259, 47954 - 44032: 0x925A, 47955 - 44032: 0x9261, 47956 - 44032: 0xB9BA, 47957 - 44032: 0x9262, 47958 - 44032: 0x9263, 47959 - 44032: 0x9264, 47960 - 44032: 0xB9BB, 47961 - 44032: 0x9265, 47962 - 44032: 0x9266, 47963 - 44032: 0x9267, 47964 - 44032: 0x9268, 47965 - 44032: 0x9269, 47966 - 44032: 0x926A, 47967 - 44032: 0x926B, 47968 - 44032: 0x926C, 47969 - 44032: 0xB9BC, 47970 - 44032: 0x926D, 47971 - 44032: 0xB9BD, 47972 - 44032: 0x926E, 47973 - 44032: 0x926F, 47974 - 44032: 0x9270, 47975 - 44032: 0x9271, 47976 - 44032: 0x9272, 47977 - 44032: 0x9273, 47978 - 44032: 0x9274, 47979 - 44032: 0x9275, 47980 - 44032: 0xB9BE, 47981 - 44032: 0x9276, 47982 - 44032: 0x9277, 47983 - 44032: 0x9278, 47984 - 44032: 0x9279, 47985 - 44032: 0x927A, 47986 - 44032: 0x9281, 47987 - 44032: 0x9282, 47988 - 44032: 0x9283, 47989 - 44032: 0x9284, 47990 - 44032: 0x9285, 47991 - 44032: 0x9286, 47992 - 44032: 0x9287, 47993 - 44032: 0x9288, 47994 - 44032: 0x9289, 47995 - 44032: 0x928A, 47996 - 44032: 0x928B, 47997 - 44032: 0x928C, 47998 - 44032: 0x928D, 47999 - 44032: 0x928E, 48000 - 44032: 0x928F, 48001 - 44032: 0x9290, 48002 - 44032: 0x9291, 48003 - 44032: 0x9292, 48004 - 44032: 0x9293, 48005 - 44032: 0x9294, 48006 - 44032: 0x9295, 48007 - 44032: 0x9296, 48008 - 44032: 0xB9BF, 48009 - 44032: 0x9297, 48010 - 44032: 0x9298, 48011 - 44032: 0x9299, 48012 - 44032: 0xB9C0, 48013 - 44032: 0x929A, 48014 - 44032: 0x929B, 48015 - 44032: 0x929C, 48016 - 44032: 0xB9C1, 48017 - 44032: 0x929D, 48018 - 44032: 0x929E, 48019 - 44032: 0x929F, 48020 - 44032: 0x92A0, 48021 - 44032: 0x92A1, 48022 - 44032: 0x92A2, 48023 - 44032: 0x92A3, 48024 - 44032: 0x92A4, 48025 - 44032: 0x92A5, 48026 - 44032: 0x92A6, 48027 - 44032: 0x92A7, 48028 - 44032: 0x92A8, 48029 - 44032: 0x92A9, 48030 - 44032: 0x92AA, 48031 - 44032: 0x92AB, 48032 - 44032: 0x92AC, 48033 - 44032: 0x92AD, 48034 - 44032: 0x92AE, 48035 - 44032: 0x92AF, 48036 - 44032: 0xB9C2, 48037 - 44032: 0x92B0, 48038 - 44032: 0x92B1, 48039 - 44032: 0x92B2, 48040 - 44032: 0xB9C3, 48041 - 44032: 0x92B3, 48042 - 44032: 0x92B4, 48043 - 44032: 0x92B5, 48044 - 44032: 0xB9C4, 48045 - 44032: 0x92B6, 48046 - 44032: 0x92B7, 48047 - 44032: 0x92B8, 48048 - 44032: 0x92B9, 48049 - 44032: 0x92BA, 48050 - 44032: 0x92BB, 48051 - 44032: 0x92BC, 48052 - 44032: 0xB9C5, 48053 - 44032: 0x92BD, 48054 - 44032: 0x92BE, 48055 - 44032: 0xB9C6, 48056 - 44032: 0x92BF, 48057 - 44032: 0x92C0, 48058 - 44032: 0x92C1, 48059 - 44032: 0x92C2, 48060 - 44032: 0x92C3, 48061 - 44032: 0x92C4, 48062 - 44032: 0x92C5, 48063 - 44032: 0x92C6, 48064 - 44032: 0xB9C7, 48065 - 44032: 0x92C7, 48066 - 44032: 0x92C8, 48067 - 44032: 0x92C9, 48068 - 44032: 0xB9C8, 48069 - 44032: 0x92CA, 48070 - 44032: 0x92CB, 48071 - 44032: 0x92CC, 48072 - 44032: 0xB9C9, 48073 - 44032: 0x92CD, 48074 - 44032: 0x92CE, 48075 - 44032: 0x92CF, 48076 - 44032: 0x92D0, 48077 - 44032: 0x92D1, 48078 - 44032: 0x92D2, 48079 - 44032: 0x92D3, 48080 - 44032: 0xB9CA, 48081 - 44032: 0x92D4, 48082 - 44032: 0x92D5, 48083 - 44032: 0xB9CB, 48084 - 44032: 0x92D6, 48085 - 44032: 0x92D7, 48086 - 44032: 0x92D8, 48087 - 44032: 0x92D9, 48088 - 44032: 0x92DA, 48089 - 44032: 0x92DB, 48090 - 44032: 0x92DC, 48091 - 44032: 0x92DD, 48092 - 44032: 0x92DE, 48093 - 44032: 0x92DF, 48094 - 44032: 0x92E0, 48095 - 44032: 0x92E1, 48096 - 44032: 0x92E2, 48097 - 44032: 0x92E3, 48098 - 44032: 0x92E4, 48099 - 44032: 0x92E5, 48100 - 44032: 0x92E6, 48101 - 44032: 0x92E7, 48102 - 44032: 0x92E8, 48103 - 44032: 0x92E9, 48104 - 44032: 0x92EA, 48105 - 44032: 0x92EB, 48106 - 44032: 0x92EC, 48107 - 44032: 0x92ED, 48108 - 44032: 0x92EE, 48109 - 44032: 0x92EF, 48110 - 44032: 0x92F0, 48111 - 44032: 0x92F1, 48112 - 44032: 0x92F2, 48113 - 44032: 0x92F3, 48114 - 44032: 0x92F4, 48115 - 44032: 0x92F5, 48116 - 44032: 0x92F6, 48117 - 44032: 0x92F7, 48118 - 44032: 0x92F8, 48119 - 44032: 0x92F9, 48120 - 44032: 0xB9CC, 48121 - 44032: 0xB9CD, 48122 - 44032: 0x92FA, 48123 - 44032: 0x92FB, 48124 - 44032: 0xB9CE, 48125 - 44032: 0x92FC, 48126 - 44032: 0x92FD, 48127 - 44032: 0xB9CF, 48128 - 44032: 0xB9D0, 48129 - 44032: 0x92FE, 48130 - 44032: 0xB9D1, 48131 - 44032: 0x9341, 48132 - 44032: 0x9342, 48133 - 44032: 0x9343, 48134 - 44032: 0x9344, 48135 - 44032: 0x9345, 48136 - 44032: 0xB9D2, 48137 - 44032: 0xB9D3, 48138 - 44032: 0x9346, 48139 - 44032: 0xB9D4, 48140 - 44032: 0xB9D5, 48141 - 44032: 0xB9D6, 48142 - 44032: 0x9347, 48143 - 44032: 0xB9D7, 48144 - 44032: 0x9348, 48145 - 44032: 0xB9D8, 48146 - 44032: 0x9349, 48147 - 44032: 0x934A, 48148 - 44032: 0xB9D9, 48149 - 44032: 0xB9DA, 48150 - 44032: 0xB9DB, 48151 - 44032: 0xB9DC, 48152 - 44032: 0xB9DD, 48153 - 44032: 0x934B, 48154 - 44032: 0x934C, 48155 - 44032: 0xB9DE, 48156 - 44032: 0xB9DF, 48157 - 44032: 0xB9E0, 48158 - 44032: 0xB9E1, 48159 - 44032: 0xB9E2, 48160 - 44032: 0x934D, 48161 - 44032: 0x934E, 48162 - 44032: 0x934F, 48163 - 44032: 0x9350, 48164 - 44032: 0xB9E3, 48165 - 44032: 0xB9E4, 48166 - 44032: 0x9351, 48167 - 44032: 0xB9E5, 48168 - 44032: 0x9352, 48169 - 44032: 0xB9E6, 48170 - 44032: 0x9353, 48171 - 44032: 0x9354, 48172 - 44032: 0x9355, 48173 - 44032: 0xB9E7, 48174 - 44032: 0x9356, 48175 - 44032: 0x9357, 48176 - 44032: 0xB9E8, 48177 - 44032: 0xB9E9, 48178 - 44032: 0x9358, 48179 - 44032: 0x9359, 48180 - 44032: 0xB9EA, 48181 - 44032: 0x935A, 48182 - 44032: 0x9361, 48183 - 44032: 0x9362, 48184 - 44032: 0xB9EB, 48185 - 44032: 0x9363, 48186 - 44032: 0x9364, 48187 - 44032: 0x9365, 48188 - 44032: 0x9366, 48189 - 44032: 0x9367, 48190 - 44032: 0x9368, 48191 - 44032: 0x9369, 48192 - 44032: 0xB9EC, 48193 - 44032: 0xB9ED, 48194 - 44032: 0x936A, 48195 - 44032: 0xB9EE, 48196 - 44032: 0xB9EF, 48197 - 44032: 0xB9F0, 48198 - 44032: 0x936B, 48199 - 44032: 0x936C, 48200 - 44032: 0x936D, 48201 - 44032: 0xB9F1, 48202 - 44032: 0x936E, 48203 - 44032: 0x936F, 48204 - 44032: 0xB9F2, 48205 - 44032: 0xB9F3, 48206 - 44032: 0x9370, 48207 - 44032: 0x9371, 48208 - 44032: 0xB9F4, 48209 - 44032: 0x9372, 48210 - 44032: 0x9373, 48211 - 44032: 0x9374, 48212 - 44032: 0x9375, 48213 - 44032: 0x9376, 48214 - 44032: 0x9377, 48215 - 44032: 0x9378, 48216 - 44032: 0x9379, 48217 - 44032: 0x937A, 48218 - 44032: 0x9381, 48219 - 44032: 0x9382, 48220 - 44032: 0x9383, 48221 - 44032: 0xB9F5, 48222 - 44032: 0x9384, 48223 - 44032: 0x9385, 48224 - 44032: 0x9386, 48225 - 44032: 0x9387, 48226 - 44032: 0x9388, 48227 - 44032: 0x9389, 48228 - 44032: 0x938A, 48229 - 44032: 0x938B, 48230 - 44032: 0x938C, 48231 - 44032: 0x938D, 48232 - 44032: 0x938E, 48233 - 44032: 0x938F, 48234 - 44032: 0x9390, 48235 - 44032: 0x9391, 48236 - 44032: 0x9392, 48237 - 44032: 0x9393, 48238 - 44032: 0x9394, 48239 - 44032: 0x9395, 48240 - 44032: 0x9396, 48241 - 44032: 0x9397, 48242 - 44032: 0x9398, 48243 - 44032: 0x9399, 48244 - 44032: 0x939A, 48245 - 44032: 0x939B, 48246 - 44032: 0x939C, 48247 - 44032: 0x939D, 48248 - 44032: 0x939E, 48249 - 44032: 0x939F, 48250 - 44032: 0x93A0, 48251 - 44032: 0x93A1, 48252 - 44032: 0x93A2, 48253 - 44032: 0x93A3, 48254 - 44032: 0x93A4, 48255 - 44032: 0x93A5, 48256 - 44032: 0x93A6, 48257 - 44032: 0x93A7, 48258 - 44032: 0x93A8, 48259 - 44032: 0x93A9, 48260 - 44032: 0xB9F6, 48261 - 44032: 0xB9F7, 48262 - 44032: 0x93AA, 48263 - 44032: 0x93AB, 48264 - 44032: 0xB9F8, 48265 - 44032: 0x93AC, 48266 - 44032: 0x93AD, 48267 - 44032: 0xB9F9, 48268 - 44032: 0xB9FA, 48269 - 44032: 0x93AE, 48270 - 44032: 0xB9FB, 48271 - 44032: 0x93AF, 48272 - 44032: 0x93B0, 48273 - 44032: 0x93B1, 48274 - 44032: 0x93B2, 48275 - 44032: 0x93B3, 48276 - 44032: 0xB9FC, 48277 - 44032: 0xB9FD, 48278 - 44032: 0x93B4, 48279 - 44032: 0xB9FE, 48280 - 44032: 0x93B5, 48281 - 44032: 0xBAA1, 48282 - 44032: 0xBAA2, 48283 - 44032: 0x93B6, 48284 - 44032: 0x93B7, 48285 - 44032: 0x93B8, 48286 - 44032: 0x93B9, 48287 - 44032: 0x93BA, 48288 - 44032: 0xBAA3, 48289 - 44032: 0xBAA4, 48290 - 44032: 0x93BB, 48291 - 44032: 0x93BC, 48292 - 44032: 0xBAA5, 48293 - 44032: 0x93BD, 48294 - 44032: 0x93BE, 48295 - 44032: 0xBAA6, 48296 - 44032: 0xBAA7, 48297 - 44032: 0x93BF, 48298 - 44032: 0x93C0, 48299 - 44032: 0x93C1, 48300 - 44032: 0x93C2, 48301 - 44032: 0x93C3, 48302 - 44032: 0x93C4, 48303 - 44032: 0x93C5, 48304 - 44032: 0xBAA8, 48305 - 44032: 0xBAA9, 48306 - 44032: 0x93C6, 48307 - 44032: 0xBAAA, 48308 - 44032: 0xBAAB, 48309 - 44032: 0xBAAC, 48310 - 44032: 0x93C7, 48311 - 44032: 0x93C8, 48312 - 44032: 0x93C9, 48313 - 44032: 0x93CA, 48314 - 44032: 0x93CB, 48315 - 44032: 0x93CC, 48316 - 44032: 0xBAAD, 48317 - 44032: 0xBAAE, 48318 - 44032: 0x93CD, 48319 - 44032: 0x93CE, 48320 - 44032: 0xBAAF, 48321 - 44032: 0x93CF, 48322 - 44032: 0x93D0, 48323 - 44032: 0x93D1, 48324 - 44032: 0xBAB0, 48325 - 44032: 0x93D2, 48326 - 44032: 0x93D3, 48327 - 44032: 0x93D4, 48328 - 44032: 0x93D5, 48329 - 44032: 0x93D6, 48330 - 44032: 0x93D7, 48331 - 44032: 0x93D8, 48332 - 44032: 0x93D9, 48333 - 44032: 0xBAB1, 48334 - 44032: 0x93DA, 48335 - 44032: 0xBAB2, 48336 - 44032: 0xBAB3, 48337 - 44032: 0xBAB4, 48338 - 44032: 0x93DB, 48339 - 44032: 0x93DC, 48340 - 44032: 0x93DD, 48341 - 44032: 0xBAB5, 48342 - 44032: 0x93DE, 48343 - 44032: 0x93DF, 48344 - 44032: 0xBAB6, 48345 - 44032: 0x93E0, 48346 - 44032: 0x93E1, 48347 - 44032: 0x93E2, 48348 - 44032: 0xBAB7, 48349 - 44032: 0x93E3, 48350 - 44032: 0x93E4, 48351 - 44032: 0x93E5, 48352 - 44032: 0x93E6, 48353 - 44032: 0x93E7, 48354 - 44032: 0x93E8, 48355 - 44032: 0x93E9, 48356 - 44032: 0x93EA, 48357 - 44032: 0x93EB, 48358 - 44032: 0x93EC, 48359 - 44032: 0x93ED, 48360 - 44032: 0x93EE, 48361 - 44032: 0x93EF, 48362 - 44032: 0x93F0, 48363 - 44032: 0x93F1, 48364 - 44032: 0x93F2, 48365 - 44032: 0x93F3, 48366 - 44032: 0x93F4, 48367 - 44032: 0x93F5, 48368 - 44032: 0x93F6, 48369 - 44032: 0x93F7, 48370 - 44032: 0x93F8, 48371 - 44032: 0x93F9, 48372 - 44032: 0xBAB8, 48373 - 44032: 0xBAB9, 48374 - 44032: 0xBABA, 48375 - 44032: 0x93FA, 48376 - 44032: 0xBABB, 48377 - 44032: 0x93FB, 48378 - 44032: 0x93FC, 48379 - 44032: 0x93FD, 48380 - 44032: 0xBABC, 48381 - 44032: 0x93FE, 48382 - 44032: 0x9441, 48383 - 44032: 0x9442, 48384 - 44032: 0x9443, 48385 - 44032: 0x9444, 48386 - 44032: 0x9445, 48387 - 44032: 0x9446, 48388 - 44032: 0xBABD, 48389 - 44032: 0xBABE, 48390 - 44032: 0x9447, 48391 - 44032: 0xBABF, 48392 - 44032: 0x9448, 48393 - 44032: 0xBAC0, 48394 - 44032: 0x9449, 48395 - 44032: 0x944A, 48396 - 44032: 0x944B, 48397 - 44032: 0x944C, 48398 - 44032: 0x944D, 48399 - 44032: 0x944E, 48400 - 44032: 0xBAC1, 48401 - 44032: 0x944F, 48402 - 44032: 0x9450, 48403 - 44032: 0x9451, 48404 - 44032: 0xBAC2, 48405 - 44032: 0x9452, 48406 - 44032: 0x9453, 48407 - 44032: 0x9454, 48408 - 44032: 0x9455, 48409 - 44032: 0x9456, 48410 - 44032: 0x9457, 48411 - 44032: 0x9458, 48412 - 44032: 0x9459, 48413 - 44032: 0x945A, 48414 - 44032: 0x9461, 48415 - 44032: 0x9462, 48416 - 44032: 0x9463, 48417 - 44032: 0x9464, 48418 - 44032: 0x9465, 48419 - 44032: 0x9466, 48420 - 44032: 0xBAC3, 48421 - 44032: 0x9467, 48422 - 44032: 0x9468, 48423 - 44032: 0x9469, 48424 - 44032: 0x946A, 48425 - 44032: 0x946B, 48426 - 44032: 0x946C, 48427 - 44032: 0x946D, 48428 - 44032: 0xBAC4, 48429 - 44032: 0x946E, 48430 - 44032: 0x946F, 48431 - 44032: 0x9470, 48432 - 44032: 0x9471, 48433 - 44032: 0x9472, 48434 - 44032: 0x9473, 48435 - 44032: 0x9474, 48436 - 44032: 0x9475, 48437 - 44032: 0x9476, 48438 - 44032: 0x9477, 48439 - 44032: 0x9478, 48440 - 44032: 0x9479, 48441 - 44032: 0x947A, 48442 - 44032: 0x9481, 48443 - 44032: 0x9482, 48444 - 44032: 0x9483, 48445 - 44032: 0x9484, 48446 - 44032: 0x9485, 48447 - 44032: 0x9486, 48448 - 44032: 0xBAC5, 48449 - 44032: 0x9487, 48450 - 44032: 0x9488, 48451 - 44032: 0x9489, 48452 - 44032: 0x948A, 48453 - 44032: 0x948B, 48454 - 44032: 0x948C, 48455 - 44032: 0x948D, 48456 - 44032: 0xBAC6, 48457 - 44032: 0xBAC7, 48458 - 44032: 0x948E, 48459 - 44032: 0x948F, 48460 - 44032: 0xBAC8, 48461 - 44032: 0x9490, 48462 - 44032: 0x9491, 48463 - 44032: 0x9492, 48464 - 44032: 0xBAC9, 48465 - 44032: 0x9493, 48466 - 44032: 0x9494, 48467 - 44032: 0x9495, 48468 - 44032: 0x9496, 48469 - 44032: 0x9497, 48470 - 44032: 0x9498, 48471 - 44032: 0x9499, 48472 - 44032: 0xBACA, 48473 - 44032: 0xBACB, 48474 - 44032: 0x949A, 48475 - 44032: 0x949B, 48476 - 44032: 0x949C, 48477 - 44032: 0x949D, 48478 - 44032: 0x949E, 48479 - 44032: 0x949F, 48480 - 44032: 0x94A0, 48481 - 44032: 0x94A1, 48482 - 44032: 0x94A2, 48483 - 44032: 0x94A3, 48484 - 44032: 0xBACC, 48485 - 44032: 0x94A4, 48486 - 44032: 0x94A5, 48487 - 44032: 0x94A6, 48488 - 44032: 0xBACD, 48489 - 44032: 0x94A7, 48490 - 44032: 0x94A8, 48491 - 44032: 0x94A9, 48492 - 44032: 0x94AA, 48493 - 44032: 0x94AB, 48494 - 44032: 0x94AC, 48495 - 44032: 0x94AD, 48496 - 44032: 0x94AE, 48497 - 44032: 0x94AF, 48498 - 44032: 0x94B0, 48499 - 44032: 0x94B1, 48500 - 44032: 0x94B2, 48501 - 44032: 0x94B3, 48502 - 44032: 0x94B4, 48503 - 44032: 0x94B5, 48504 - 44032: 0x94B6, 48505 - 44032: 0x94B7, 48506 - 44032: 0x94B8, 48507 - 44032: 0x94B9, 48508 - 44032: 0x94BA, 48509 - 44032: 0x94BB, 48510 - 44032: 0x94BC, 48511 - 44032: 0x94BD, 48512 - 44032: 0xBACE, 48513 - 44032: 0xBACF, 48514 - 44032: 0x94BE, 48515 - 44032: 0x94BF, 48516 - 44032: 0xBAD0, 48517 - 44032: 0x94C0, 48518 - 44032: 0x94C1, 48519 - 44032: 0xBAD1, 48520 - 44032: 0xBAD2, 48521 - 44032: 0xBAD3, 48522 - 44032: 0xBAD4, 48523 - 44032: 0x94C2, 48524 - 44032: 0x94C3, 48525 - 44032: 0x94C4, 48526 - 44032: 0x94C5, 48527 - 44032: 0x94C6, 48528 - 44032: 0xBAD5, 48529 - 44032: 0xBAD6, 48530 - 44032: 0x94C7, 48531 - 44032: 0xBAD7, 48532 - 44032: 0x94C8, 48533 - 44032: 0xBAD8, 48534 - 44032: 0x94C9, 48535 - 44032: 0x94CA, 48536 - 44032: 0x94CB, 48537 - 44032: 0xBAD9, 48538 - 44032: 0xBADA, 48539 - 44032: 0x94CC, 48540 - 44032: 0xBADB, 48541 - 44032: 0x94CD, 48542 - 44032: 0x94CE, 48543 - 44032: 0x94CF, 48544 - 44032: 0x94D0, 48545 - 44032: 0x94D1, 48546 - 44032: 0x94D2, 48547 - 44032: 0x94D3, 48548 - 44032: 0xBADC, 48549 - 44032: 0x94D4, 48550 - 44032: 0x94D5, 48551 - 44032: 0x94D6, 48552 - 44032: 0x94D7, 48553 - 44032: 0x94D8, 48554 - 44032: 0x94D9, 48555 - 44032: 0x94DA, 48556 - 44032: 0x94DB, 48557 - 44032: 0x94DC, 48558 - 44032: 0x94DD, 48559 - 44032: 0x94DE, 48560 - 44032: 0xBADD, 48561 - 44032: 0x94DF, 48562 - 44032: 0x94E0, 48563 - 44032: 0x94E1, 48564 - 44032: 0x94E2, 48565 - 44032: 0x94E3, 48566 - 44032: 0x94E4, 48567 - 44032: 0x94E5, 48568 - 44032: 0xBADE, 48569 - 44032: 0x94E6, 48570 - 44032: 0x94E7, 48571 - 44032: 0x94E8, 48572 - 44032: 0x94E9, 48573 - 44032: 0x94EA, 48574 - 44032: 0x94EB, 48575 - 44032: 0x94EC, 48576 - 44032: 0x94ED, 48577 - 44032: 0x94EE, 48578 - 44032: 0x94EF, 48579 - 44032: 0x94F0, 48580 - 44032: 0x94F1, 48581 - 44032: 0x94F2, 48582 - 44032: 0x94F3, 48583 - 44032: 0x94F4, 48584 - 44032: 0x94F5, 48585 - 44032: 0x94F6, 48586 - 44032: 0x94F7, 48587 - 44032: 0x94F8, 48588 - 44032: 0x94F9, 48589 - 44032: 0x94FA, 48590 - 44032: 0x94FB, 48591 - 44032: 0x94FC, 48592 - 44032: 0x94FD, 48593 - 44032: 0x94FE, 48594 - 44032: 0x9541, 48595 - 44032: 0x9542, 48596 - 44032: 0xBADF, 48597 - 44032: 0xBAE0, 48598 - 44032: 0x9543, 48599 - 44032: 0x9544, 48600 - 44032: 0xBAE1, 48601 - 44032: 0x9545, 48602 - 44032: 0x9546, 48603 - 44032: 0x9547, 48604 - 44032: 0xBAE2, 48605 - 44032: 0x9548, 48606 - 44032: 0x9549, 48607 - 44032: 0x954A, 48608 - 44032: 0x954B, 48609 - 44032: 0x954C, 48610 - 44032: 0x954D, 48611 - 44032: 0x954E, 48612 - 44032: 0x954F, 48613 - 44032: 0x9550, 48614 - 44032: 0x9551, 48615 - 44032: 0x9552, 48616 - 44032: 0x9553, 48617 - 44032: 0xBAE3, 48618 - 44032: 0x9554, 48619 - 44032: 0x9555, 48620 - 44032: 0x9556, 48621 - 44032: 0x9557, 48622 - 44032: 0x9558, 48623 - 44032: 0x9559, 48624 - 44032: 0xBAE4, 48625 - 44032: 0x955A, 48626 - 44032: 0x9561, 48627 - 44032: 0x9562, 48628 - 44032: 0xBAE5, 48629 - 44032: 0x9563, 48630 - 44032: 0x9564, 48631 - 44032: 0x9565, 48632 - 44032: 0xBAE6, 48633 - 44032: 0x9566, 48634 - 44032: 0x9567, 48635 - 44032: 0x9568, 48636 - 44032: 0x9569, 48637 - 44032: 0x956A, 48638 - 44032: 0x956B, 48639 - 44032: 0x956C, 48640 - 44032: 0xBAE7, 48641 - 44032: 0x956D, 48642 - 44032: 0x956E, 48643 - 44032: 0xBAE8, 48644 - 44032: 0x956F, 48645 - 44032: 0xBAE9, 48646 - 44032: 0x9570, 48647 - 44032: 0x9571, 48648 - 44032: 0x9572, 48649 - 44032: 0x9573, 48650 - 44032: 0x9574, 48651 - 44032: 0x9575, 48652 - 44032: 0xBAEA, 48653 - 44032: 0xBAEB, 48654 - 44032: 0x9576, 48655 - 44032: 0x9577, 48656 - 44032: 0xBAEC, 48657 - 44032: 0x9578, 48658 - 44032: 0x9579, 48659 - 44032: 0x957A, 48660 - 44032: 0xBAED, 48661 - 44032: 0x9581, 48662 - 44032: 0x9582, 48663 - 44032: 0x9583, 48664 - 44032: 0x9584, 48665 - 44032: 0x9585, 48666 - 44032: 0x9586, 48667 - 44032: 0x9587, 48668 - 44032: 0xBAEE, 48669 - 44032: 0xBAEF, 48670 - 44032: 0x9588, 48671 - 44032: 0xBAF0, 48672 - 44032: 0x9589, 48673 - 44032: 0x958A, 48674 - 44032: 0x958B, 48675 - 44032: 0x958C, 48676 - 44032: 0x958D, 48677 - 44032: 0x958E, 48678 - 44032: 0x958F, 48679 - 44032: 0x9590, 48680 - 44032: 0x9591, 48681 - 44032: 0x9592, 48682 - 44032: 0x9593, 48683 - 44032: 0x9594, 48684 - 44032: 0x9595, 48685 - 44032: 0x9596, 48686 - 44032: 0x9597, 48687 - 44032: 0x9598, 48688 - 44032: 0x9599, 48689 - 44032: 0x959A, 48690 - 44032: 0x959B, 48691 - 44032: 0x959C, 48692 - 44032: 0x959D, 48693 - 44032: 0x959E, 48694 - 44032: 0x959F, 48695 - 44032: 0x95A0, 48696 - 44032: 0x95A1, 48697 - 44032: 0x95A2, 48698 - 44032: 0x95A3, 48699 - 44032: 0x95A4, 48700 - 44032: 0x95A5, 48701 - 44032: 0x95A6, 48702 - 44032: 0x95A7, 48703 - 44032: 0x95A8, 48704 - 44032: 0x95A9, 48705 - 44032: 0x95AA, 48706 - 44032: 0x95AB, 48707 - 44032: 0x95AC, 48708 - 44032: 0xBAF1, 48709 - 44032: 0xBAF2, 48710 - 44032: 0x95AD, 48711 - 44032: 0x95AE, 48712 - 44032: 0xBAF3, 48713 - 44032: 0x95AF, 48714 - 44032: 0x95B0, 48715 - 44032: 0x95B1, 48716 - 44032: 0xBAF4, 48717 - 44032: 0x95B2, 48718 - 44032: 0xBAF5, 48719 - 44032: 0x95B3, 48720 - 44032: 0x95B4, 48721 - 44032: 0x95B5, 48722 - 44032: 0x95B6, 48723 - 44032: 0x95B7, 48724 - 44032: 0xBAF6, 48725 - 44032: 0xBAF7, 48726 - 44032: 0x95B8, 48727 - 44032: 0xBAF8, 48728 - 44032: 0x95B9, 48729 - 44032: 0xBAF9, 48730 - 44032: 0xBAFA, 48731 - 44032: 0xBAFB, 48732 - 44032: 0x95BA, 48733 - 44032: 0x95BB, 48734 - 44032: 0x95BC, 48735 - 44032: 0x95BD, 48736 - 44032: 0xBAFC, 48737 - 44032: 0xBAFD, 48738 - 44032: 0x95BE, 48739 - 44032: 0x95BF, 48740 - 44032: 0xBAFE, 48741 - 44032: 0x95C0, 48742 - 44032: 0x95C1, 48743 - 44032: 0x95C2, 48744 - 44032: 0xBBA1, 48745 - 44032: 0x95C3, 48746 - 44032: 0xBBA2, 48747 - 44032: 0x95C4, 48748 - 44032: 0x95C5, 48749 - 44032: 0x95C6, 48750 - 44032: 0x95C7, 48751 - 44032: 0x95C8, 48752 - 44032: 0xBBA3, 48753 - 44032: 0xBBA4, 48754 - 44032: 0x95C9, 48755 - 44032: 0xBBA5, 48756 - 44032: 0xBBA6, 48757 - 44032: 0xBBA7, 48758 - 44032: 0x95CA, 48759 - 44032: 0x95CB, 48760 - 44032: 0x95CC, 48761 - 44032: 0x95CD, 48762 - 44032: 0x95CE, 48763 - 44032: 0xBBA8, 48764 - 44032: 0xBBA9, 48765 - 44032: 0xBBAA, 48766 - 44032: 0x95CF, 48767 - 44032: 0x95D0, 48768 - 44032: 0xBBAB, 48769 - 44032: 0x95D1, 48770 - 44032: 0x95D2, 48771 - 44032: 0x95D3, 48772 - 44032: 0xBBAC, 48773 - 44032: 0x95D4, 48774 - 44032: 0x95D5, 48775 - 44032: 0x95D6, 48776 - 44032: 0x95D7, 48777 - 44032: 0x95D8, 48778 - 44032: 0x95D9, 48779 - 44032: 0x95DA, 48780 - 44032: 0xBBAD, 48781 - 44032: 0xBBAE, 48782 - 44032: 0x95DB, 48783 - 44032: 0xBBAF, 48784 - 44032: 0xBBB0, 48785 - 44032: 0xBBB1, 48786 - 44032: 0x95DC, 48787 - 44032: 0x95DD, 48788 - 44032: 0x95DE, 48789 - 44032: 0x95DF, 48790 - 44032: 0x95E0, 48791 - 44032: 0x95E1, 48792 - 44032: 0xBBB2, 48793 - 44032: 0xBBB3, 48794 - 44032: 0x95E2, 48795 - 44032: 0x95E3, 48796 - 44032: 0x95E4, 48797 - 44032: 0x95E5, 48798 - 44032: 0x95E6, 48799 - 44032: 0x95E7, 48800 - 44032: 0x95E8, 48801 - 44032: 0x95E9, 48802 - 44032: 0x95EA, 48803 - 44032: 0x95EB, 48804 - 44032: 0x95EC, 48805 - 44032: 0x95ED, 48806 - 44032: 0x95EE, 48807 - 44032: 0x95EF, 48808 - 44032: 0xBBB4, 48809 - 44032: 0x95F0, 48810 - 44032: 0x95F1, 48811 - 44032: 0x95F2, 48812 - 44032: 0x95F3, 48813 - 44032: 0x95F4, 48814 - 44032: 0x95F5, 48815 - 44032: 0x95F6, 48816 - 44032: 0x95F7, 48817 - 44032: 0x95F8, 48818 - 44032: 0x95F9, 48819 - 44032: 0x95FA, 48820 - 44032: 0x95FB, 48821 - 44032: 0x95FC, 48822 - 44032: 0x95FD, 48823 - 44032: 0x95FE, 48824 - 44032: 0x9641, 48825 - 44032: 0x9642, 48826 - 44032: 0x9643, 48827 - 44032: 0x9644, 48828 - 44032: 0x9645, 48829 - 44032: 0x9646, 48830 - 44032: 0x9647, 48831 - 44032: 0x9648, 48832 - 44032: 0x9649, 48833 - 44032: 0x964A, 48834 - 44032: 0x964B, 48835 - 44032: 0x964C, 48836 - 44032: 0x964D, 48837 - 44032: 0x964E, 48838 - 44032: 0x964F, 48839 - 44032: 0x9650, 48840 - 44032: 0x9651, 48841 - 44032: 0x9652, 48842 - 44032: 0x9653, 48843 - 44032: 0x9654, 48844 - 44032: 0x9655, 48845 - 44032: 0x9656, 48846 - 44032: 0x9657, 48847 - 44032: 0x9658, 48848 - 44032: 0xBBB5, 48849 - 44032: 0xBBB6, 48850 - 44032: 0x9659, 48851 - 44032: 0x965A, 48852 - 44032: 0xBBB7, 48853 - 44032: 0x9661, 48854 - 44032: 0x9662, 48855 - 44032: 0xBBB8, 48856 - 44032: 0xBBB9, 48857 - 44032: 0x9663, 48858 - 44032: 0x9664, 48859 - 44032: 0x9665, 48860 - 44032: 0x9666, 48861 - 44032: 0x9667, 48862 - 44032: 0x9668, 48863 - 44032: 0x9669, 48864 - 44032: 0xBBBA, 48865 - 44032: 0x966A, 48866 - 44032: 0x966B, 48867 - 44032: 0xBBBB, 48868 - 44032: 0xBBBC, 48869 - 44032: 0xBBBD, 48870 - 44032: 0x966C, 48871 - 44032: 0x966D, 48872 - 44032: 0x966E, 48873 - 44032: 0x966F, 48874 - 44032: 0x9670, 48875 - 44032: 0x9671, 48876 - 44032: 0xBBBE, 48877 - 44032: 0x9672, 48878 - 44032: 0x9673, 48879 - 44032: 0x9674, 48880 - 44032: 0x9675, 48881 - 44032: 0x9676, 48882 - 44032: 0x9677, 48883 - 44032: 0x9678, 48884 - 44032: 0x9679, 48885 - 44032: 0x967A, 48886 - 44032: 0x9681, 48887 - 44032: 0x9682, 48888 - 44032: 0x9683, 48889 - 44032: 0x9684, 48890 - 44032: 0x9685, 48891 - 44032: 0x9686, 48892 - 44032: 0x9687, 48893 - 44032: 0x9688, 48894 - 44032: 0x9689, 48895 - 44032: 0x968A, 48896 - 44032: 0x968B, 48897 - 44032: 0xBBBF, 48898 - 44032: 0x968C, 48899 - 44032: 0x968D, 48900 - 44032: 0x968E, 48901 - 44032: 0x968F, 48902 - 44032: 0x9690, 48903 - 44032: 0x9691, 48904 - 44032: 0xBBC0, 48905 - 44032: 0xBBC1, 48906 - 44032: 0x9692, 48907 - 44032: 0x9693, 48908 - 44032: 0x9694, 48909 - 44032: 0x9695, 48910 - 44032: 0x9696, 48911 - 44032: 0x9697, 48912 - 44032: 0x9698, 48913 - 44032: 0x9699, 48914 - 44032: 0x969A, 48915 - 44032: 0x969B, 48916 - 44032: 0x969C, 48917 - 44032: 0x969D, 48918 - 44032: 0x969E, 48919 - 44032: 0x969F, 48920 - 44032: 0xBBC2, 48921 - 44032: 0xBBC3, 48922 - 44032: 0x96A0, 48923 - 44032: 0xBBC4, 48924 - 44032: 0xBBC5, 48925 - 44032: 0xBBC6, 48926 - 44032: 0x96A1, 48927 - 44032: 0x96A2, 48928 - 44032: 0x96A3, 48929 - 44032: 0x96A4, 48930 - 44032: 0x96A5, 48931 - 44032: 0x96A6, 48932 - 44032: 0x96A7, 48933 - 44032: 0x96A8, 48934 - 44032: 0x96A9, 48935 - 44032: 0x96AA, 48936 - 44032: 0x96AB, 48937 - 44032: 0x96AC, 48938 - 44032: 0x96AD, 48939 - 44032: 0x96AE, 48940 - 44032: 0x96AF, 48941 - 44032: 0x96B0, 48942 - 44032: 0x96B1, 48943 - 44032: 0x96B2, 48944 - 44032: 0x96B3, 48945 - 44032: 0x96B4, 48946 - 44032: 0x96B5, 48947 - 44032: 0x96B6, 48948 - 44032: 0x96B7, 48949 - 44032: 0x96B8, 48950 - 44032: 0x96B9, 48951 - 44032: 0x96BA, 48952 - 44032: 0x96BB, 48953 - 44032: 0x96BC, 48954 - 44032: 0x96BD, 48955 - 44032: 0x96BE, 48956 - 44032: 0x96BF, 48957 - 44032: 0x96C0, 48958 - 44032: 0x96C1, 48959 - 44032: 0x96C2, 48960 - 44032: 0xBBC7, 48961 - 44032: 0xBBC8, 48962 - 44032: 0x96C3, 48963 - 44032: 0x96C4, 48964 - 44032: 0xBBC9, 48965 - 44032: 0x96C5, 48966 - 44032: 0x96C6, 48967 - 44032: 0x96C7, 48968 - 44032: 0xBBCA, 48969 - 44032: 0x96C8, 48970 - 44032: 0x96C9, 48971 - 44032: 0x96CA, 48972 - 44032: 0x96CB, 48973 - 44032: 0x96CC, 48974 - 44032: 0x96CD, 48975 - 44032: 0x96CE, 48976 - 44032: 0xBBCB, 48977 - 44032: 0xBBCC, 48978 - 44032: 0x96CF, 48979 - 44032: 0x96D0, 48980 - 44032: 0x96D1, 48981 - 44032: 0xBBCD, 48982 - 44032: 0x96D2, 48983 - 44032: 0x96D3, 48984 - 44032: 0x96D4, 48985 - 44032: 0x96D5, 48986 - 44032: 0x96D6, 48987 - 44032: 0x96D7, 48988 - 44032: 0x96D8, 48989 - 44032: 0x96D9, 48990 - 44032: 0x96DA, 48991 - 44032: 0x96DB, 48992 - 44032: 0x96DC, 48993 - 44032: 0x96DD, 48994 - 44032: 0x96DE, 48995 - 44032: 0x96DF, 48996 - 44032: 0x96E0, 48997 - 44032: 0x96E1, 48998 - 44032: 0x96E2, 48999 - 44032: 0x96E3, 49000 - 44032: 0x96E4, 49001 - 44032: 0x96E5, 49002 - 44032: 0x96E6, 49003 - 44032: 0x96E7, 49004 - 44032: 0x96E8, 49005 - 44032: 0x96E9, 49006 - 44032: 0x96EA, 49007 - 44032: 0x96EB, 49008 - 44032: 0x96EC, 49009 - 44032: 0x96ED, 49010 - 44032: 0x96EE, 49011 - 44032: 0x96EF, 49012 - 44032: 0x96F0, 49013 - 44032: 0x96F1, 49014 - 44032: 0x96F2, 49015 - 44032: 0x96F3, 49016 - 44032: 0x96F4, 49017 - 44032: 0x96F5, 49018 - 44032: 0x96F6, 49019 - 44032: 0x96F7, 49020 - 44032: 0x96F8, 49021 - 44032: 0x96F9, 49022 - 44032: 0x96FA, 49023 - 44032: 0x96FB, 49024 - 44032: 0x96FC, 49025 - 44032: 0x96FD, 49026 - 44032: 0x96FE, 49027 - 44032: 0x9741, 49028 - 44032: 0x9742, 49029 - 44032: 0x9743, 49030 - 44032: 0x9744, 49031 - 44032: 0x9745, 49032 - 44032: 0x9746, 49033 - 44032: 0x9747, 49034 - 44032: 0x9748, 49035 - 44032: 0x9749, 49036 - 44032: 0x974A, 49037 - 44032: 0x974B, 49038 - 44032: 0x974C, 49039 - 44032: 0x974D, 49040 - 44032: 0x974E, 49041 - 44032: 0x974F, 49042 - 44032: 0x9750, 49043 - 44032: 0x9751, 49044 - 44032: 0xBBCE, 49045 - 44032: 0x9752, 49046 - 44032: 0x9753, 49047 - 44032: 0x9754, 49048 - 44032: 0x9755, 49049 - 44032: 0x9756, 49050 - 44032: 0x9757, 49051 - 44032: 0x9758, 49052 - 44032: 0x9759, 49053 - 44032: 0x975A, 49054 - 44032: 0x9761, 49055 - 44032: 0x9762, 49056 - 44032: 0x9763, 49057 - 44032: 0x9764, 49058 - 44032: 0x9765, 49059 - 44032: 0x9766, 49060 - 44032: 0x9767, 49061 - 44032: 0x9768, 49062 - 44032: 0x9769, 49063 - 44032: 0x976A, 49064 - 44032: 0x976B, 49065 - 44032: 0x976C, 49066 - 44032: 0x976D, 49067 - 44032: 0x976E, 49068 - 44032: 0x976F, 49069 - 44032: 0x9770, 49070 - 44032: 0x9771, 49071 - 44032: 0x9772, 49072 - 44032: 0xBBCF, 49073 - 44032: 0x9773, 49074 - 44032: 0x9774, 49075 - 44032: 0x9775, 49076 - 44032: 0x9776, 49077 - 44032: 0x9777, 49078 - 44032: 0x9778, 49079 - 44032: 0x9779, 49080 - 44032: 0x977A, 49081 - 44032: 0x9781, 49082 - 44032: 0x9782, 49083 - 44032: 0x9783, 49084 - 44032: 0x9784, 49085 - 44032: 0x9785, 49086 - 44032: 0x9786, 49087 - 44032: 0x9787, 49088 - 44032: 0x9788, 49089 - 44032: 0x9789, 49090 - 44032: 0x978A, 49091 - 44032: 0x978B, 49092 - 44032: 0x978C, 49093 - 44032: 0xBBD0, 49094 - 44032: 0x978D, 49095 - 44032: 0x978E, 49096 - 44032: 0x978F, 49097 - 44032: 0x9790, 49098 - 44032: 0x9791, 49099 - 44032: 0x9792, 49100 - 44032: 0xBBD1, 49101 - 44032: 0xBBD2, 49102 - 44032: 0x9793, 49103 - 44032: 0x9794, 49104 - 44032: 0xBBD3, 49105 - 44032: 0x9795, 49106 - 44032: 0x9796, 49107 - 44032: 0x9797, 49108 - 44032: 0xBBD4, 49109 - 44032: 0x9798, 49110 - 44032: 0x9799, 49111 - 44032: 0x979A, 49112 - 44032: 0x979B, 49113 - 44032: 0x979C, 49114 - 44032: 0x979D, 49115 - 44032: 0x979E, 49116 - 44032: 0xBBD5, 49117 - 44032: 0x979F, 49118 - 44032: 0x97A0, 49119 - 44032: 0xBBD6, 49120 - 44032: 0x97A1, 49121 - 44032: 0xBBD7, 49122 - 44032: 0x97A2, 49123 - 44032: 0x97A3, 49124 - 44032: 0x97A4, 49125 - 44032: 0x97A5, 49126 - 44032: 0x97A6, 49127 - 44032: 0x97A7, 49128 - 44032: 0x97A8, 49129 - 44032: 0x97A9, 49130 - 44032: 0x97AA, 49131 - 44032: 0x97AB, 49132 - 44032: 0x97AC, 49133 - 44032: 0x97AD, 49134 - 44032: 0x97AE, 49135 - 44032: 0x97AF, 49136 - 44032: 0x97B0, 49137 - 44032: 0x97B1, 49138 - 44032: 0x97B2, 49139 - 44032: 0x97B3, 49140 - 44032: 0x97B4, 49141 - 44032: 0x97B5, 49142 - 44032: 0x97B6, 49143 - 44032: 0x97B7, 49144 - 44032: 0x97B8, 49145 - 44032: 0x97B9, 49146 - 44032: 0x97BA, 49147 - 44032: 0x97BB, 49148 - 44032: 0x97BC, 49149 - 44032: 0x97BD, 49150 - 44032: 0x97BE, 49151 - 44032: 0x97BF, 49152 - 44032: 0x97C0, 49153 - 44032: 0x97C1, 49154 - 44032: 0x97C2, 49155 - 44032: 0x97C3, 49156 - 44032: 0x97C4, 49157 - 44032: 0x97C5, 49158 - 44032: 0x97C6, 49159 - 44032: 0x97C7, 49160 - 44032: 0x97C8, 49161 - 44032: 0x97C9, 49162 - 44032: 0x97CA, 49163 - 44032: 0x97CB, 49164 - 44032: 0x97CC, 49165 - 44032: 0x97CD, 49166 - 44032: 0x97CE, 49167 - 44032: 0x97CF, 49168 - 44032: 0x97D0, 49169 - 44032: 0x97D1, 49170 - 44032: 0x97D2, 49171 - 44032: 0x97D3, 49172 - 44032: 0x97D4, 49173 - 44032: 0x97D5, 49174 - 44032: 0x97D6, 49175 - 44032: 0x97D7, 49176 - 44032: 0x97D8, 49177 - 44032: 0x97D9, 49178 - 44032: 0x97DA, 49179 - 44032: 0x97DB, 49180 - 44032: 0x97DC, 49181 - 44032: 0x97DD, 49182 - 44032: 0x97DE, 49183 - 44032: 0x97DF, 49184 - 44032: 0x97E0, 49185 - 44032: 0x97E1, 49186 - 44032: 0x97E2, 49187 - 44032: 0x97E3, 49188 - 44032: 0x97E4, 49189 - 44032: 0x97E5, 49190 - 44032: 0x97E6, 49191 - 44032: 0x97E7, 49192 - 44032: 0x97E8, 49193 - 44032: 0x97E9, 49194 - 44032: 0x97EA, 49195 - 44032: 0x97EB, 49196 - 44032: 0x97EC, 49197 - 44032: 0x97ED, 49198 - 44032: 0x97EE, 49199 - 44032: 0x97EF, 49200 - 44032: 0x97F0, 49201 - 44032: 0x97F1, 49202 - 44032: 0x97F2, 49203 - 44032: 0x97F3, 49204 - 44032: 0x97F4, 49205 - 44032: 0x97F5, 49206 - 44032: 0x97F6, 49207 - 44032: 0x97F7, 49208 - 44032: 0x97F8, 49209 - 44032: 0x97F9, 49210 - 44032: 0x97FA, 49211 - 44032: 0x97FB, 49212 - 44032: 0xBBD8, 49213 - 44032: 0x97FC, 49214 - 44032: 0x97FD, 49215 - 44032: 0x97FE, 49216 - 44032: 0x9841, 49217 - 44032: 0x9842, 49218 - 44032: 0x9843, 49219 - 44032: 0x9844, 49220 - 44032: 0x9845, 49221 - 44032: 0x9846, 49222 - 44032: 0x9847, 49223 - 44032: 0x9848, 49224 - 44032: 0x9849, 49225 - 44032: 0x984A, 49226 - 44032: 0x984B, 49227 - 44032: 0x984C, 49228 - 44032: 0x984D, 49229 - 44032: 0x984E, 49230 - 44032: 0x984F, 49231 - 44032: 0x9850, 49232 - 44032: 0x9851, 49233 - 44032: 0xBBD9, 49234 - 44032: 0x9852, 49235 - 44032: 0x9853, 49236 - 44032: 0x9854, 49237 - 44032: 0x9855, 49238 - 44032: 0x9856, 49239 - 44032: 0x9857, 49240 - 44032: 0xBBDA, 49241 - 44032: 0x9858, 49242 - 44032: 0x9859, 49243 - 44032: 0x985A, 49244 - 44032: 0xBBDB, 49245 - 44032: 0x9861, 49246 - 44032: 0x9862, 49247 - 44032: 0x9863, 49248 - 44032: 0xBBDC, 49249 - 44032: 0x9864, 49250 - 44032: 0x9865, 49251 - 44032: 0x9866, 49252 - 44032: 0x9867, 49253 - 44032: 0x9868, 49254 - 44032: 0x9869, 49255 - 44032: 0x986A, 49256 - 44032: 0xBBDD, 49257 - 44032: 0xBBDE, 49258 - 44032: 0x986B, 49259 - 44032: 0x986C, 49260 - 44032: 0x986D, 49261 - 44032: 0x986E, 49262 - 44032: 0x986F, 49263 - 44032: 0x9870, 49264 - 44032: 0x9871, 49265 - 44032: 0x9872, 49266 - 44032: 0x9873, 49267 - 44032: 0x9874, 49268 - 44032: 0x9875, 49269 - 44032: 0x9876, 49270 - 44032: 0x9877, 49271 - 44032: 0x9878, 49272 - 44032: 0x9879, 49273 - 44032: 0x987A, 49274 - 44032: 0x9881, 49275 - 44032: 0x9882, 49276 - 44032: 0x9883, 49277 - 44032: 0x9884, 49278 - 44032: 0x9885, 49279 - 44032: 0x9886, 49280 - 44032: 0x9887, 49281 - 44032: 0x9888, 49282 - 44032: 0x9889, 49283 - 44032: 0x988A, 49284 - 44032: 0x988B, 49285 - 44032: 0x988C, 49286 - 44032: 0x988D, 49287 - 44032: 0x988E, 49288 - 44032: 0x988F, 49289 - 44032: 0x9890, 49290 - 44032: 0x9891, 49291 - 44032: 0x9892, 49292 - 44032: 0x9893, 49293 - 44032: 0x9894, 49294 - 44032: 0x9895, 49295 - 44032: 0x9896, 49296 - 44032: 0xBBDF, 49297 - 44032: 0xBBE0, 49298 - 44032: 0x9897, 49299 - 44032: 0x9898, 49300 - 44032: 0xBBE1, 49301 - 44032: 0x9899, 49302 - 44032: 0x989A, 49303 - 44032: 0x989B, 49304 - 44032: 0xBBE2, 49305 - 44032: 0x989C, 49306 - 44032: 0x989D, 49307 - 44032: 0x989E, 49308 - 44032: 0x989F, 49309 - 44032: 0x98A0, 49310 - 44032: 0x98A1, 49311 - 44032: 0x98A2, 49312 - 44032: 0xBBE3, 49313 - 44032: 0xBBE4, 49314 - 44032: 0x98A3, 49315 - 44032: 0xBBE5, 49316 - 44032: 0x98A4, 49317 - 44032: 0xBBE6, 49318 - 44032: 0x98A5, 49319 - 44032: 0x98A6, 49320 - 44032: 0x98A7, 49321 - 44032: 0x98A8, 49322 - 44032: 0x98A9, 49323 - 44032: 0x98AA, 49324 - 44032: 0xBBE7, 49325 - 44032: 0xBBE8, 49326 - 44032: 0x98AB, 49327 - 44032: 0xBBE9, 49328 - 44032: 0xBBEA, 49329 - 44032: 0x98AC, 49330 - 44032: 0x98AD, 49331 - 44032: 0xBBEB, 49332 - 44032: 0xBBEC, 49333 - 44032: 0xBBED, 49334 - 44032: 0xBBEE, 49335 - 44032: 0x98AE, 49336 - 44032: 0x98AF, 49337 - 44032: 0x98B0, 49338 - 44032: 0x98B1, 49339 - 44032: 0x98B2, 49340 - 44032: 0xBBEF, 49341 - 44032: 0xBBF0, 49342 - 44032: 0x98B3, 49343 - 44032: 0xBBF1, 49344 - 44032: 0xBBF2, 49345 - 44032: 0xBBF3, 49346 - 44032: 0x98B4, 49347 - 44032: 0x98B5, 49348 - 44032: 0x98B6, 49349 - 44032: 0xBBF4, 49350 - 44032: 0x98B7, 49351 - 44032: 0x98B8, 49352 - 44032: 0xBBF5, 49353 - 44032: 0xBBF6, 49354 - 44032: 0x98B9, 49355 - 44032: 0x98BA, 49356 - 44032: 0xBBF7, 49357 - 44032: 0x98BB, 49358 - 44032: 0x98BC, 49359 - 44032: 0x98BD, 49360 - 44032: 0xBBF8, 49361 - 44032: 0x98BE, 49362 - 44032: 0x98BF, 49363 - 44032: 0x98C0, 49364 - 44032: 0x98C1, 49365 - 44032: 0x98C2, 49366 - 44032: 0x98C3, 49367 - 44032: 0x98C4, 49368 - 44032: 0xBBF9, 49369 - 44032: 0xBBFA, 49370 - 44032: 0x98C5, 49371 - 44032: 0xBBFB, 49372 - 44032: 0xBBFC, 49373 - 44032: 0xBBFD, 49374 - 44032: 0x98C6, 49375 - 44032: 0x98C7, 49376 - 44032: 0x98C8, 49377 - 44032: 0x98C9, 49378 - 44032: 0x98CA, 49379 - 44032: 0x98CB, 49380 - 44032: 0xBBFE, 49381 - 44032: 0xBCA1, 49382 - 44032: 0x98CC, 49383 - 44032: 0x98CD, 49384 - 44032: 0xBCA2, 49385 - 44032: 0x98CE, 49386 - 44032: 0x98CF, 49387 - 44032: 0x98D0, 49388 - 44032: 0xBCA3, 49389 - 44032: 0x98D1, 49390 - 44032: 0x98D2, 49391 - 44032: 0x98D3, 49392 - 44032: 0x98D4, 49393 - 44032: 0x98D5, 49394 - 44032: 0x98D6, 49395 - 44032: 0x98D7, 49396 - 44032: 0xBCA4, 49397 - 44032: 0xBCA5, 49398 - 44032: 0x98D8, 49399 - 44032: 0xBCA6, 49400 - 44032: 0x98D9, 49401 - 44032: 0xBCA7, 49402 - 44032: 0x98DA, 49403 - 44032: 0x98DB, 49404 - 44032: 0x98DC, 49405 - 44032: 0x98DD, 49406 - 44032: 0x98DE, 49407 - 44032: 0x98DF, 49408 - 44032: 0xBCA8, 49409 - 44032: 0x98E0, 49410 - 44032: 0x98E1, 49411 - 44032: 0x98E2, 49412 - 44032: 0xBCA9, 49413 - 44032: 0x98E3, 49414 - 44032: 0x98E4, 49415 - 44032: 0x98E5, 49416 - 44032: 0xBCAA, 49417 - 44032: 0x98E6, 49418 - 44032: 0x98E7, 49419 - 44032: 0x98E8, 49420 - 44032: 0x98E9, 49421 - 44032: 0x98EA, 49422 - 44032: 0x98EB, 49423 - 44032: 0x98EC, 49424 - 44032: 0xBCAB, 49425 - 44032: 0x98ED, 49426 - 44032: 0x98EE, 49427 - 44032: 0x98EF, 49428 - 44032: 0x98F0, 49429 - 44032: 0xBCAC, 49430 - 44032: 0x98F1, 49431 - 44032: 0x98F2, 49432 - 44032: 0x98F3, 49433 - 44032: 0x98F4, 49434 - 44032: 0x98F5, 49435 - 44032: 0x98F6, 49436 - 44032: 0xBCAD, 49437 - 44032: 0xBCAE, 49438 - 44032: 0xBCAF, 49439 - 44032: 0xBCB0, 49440 - 44032: 0xBCB1, 49441 - 44032: 0x98F7, 49442 - 44032: 0x98F8, 49443 - 44032: 0xBCB2, 49444 - 44032: 0xBCB3, 49445 - 44032: 0x98F9, 49446 - 44032: 0xBCB4, 49447 - 44032: 0xBCB5, 49448 - 44032: 0x98FA, 49449 - 44032: 0x98FB, 49450 - 44032: 0x98FC, 49451 - 44032: 0x98FD, 49452 - 44032: 0xBCB6, 49453 - 44032: 0xBCB7, 49454 - 44032: 0x98FE, 49455 - 44032: 0xBCB8, 49456 - 44032: 0xBCB9, 49457 - 44032: 0xBCBA, 49458 - 44032: 0x9941, 49459 - 44032: 0x9942, 49460 - 44032: 0x9943, 49461 - 44032: 0x9944, 49462 - 44032: 0xBCBB, 49463 - 44032: 0x9945, 49464 - 44032: 0xBCBC, 49465 - 44032: 0xBCBD, 49466 - 44032: 0x9946, 49467 - 44032: 0x9947, 49468 - 44032: 0xBCBE, 49469 - 44032: 0x9948, 49470 - 44032: 0x9949, 49471 - 44032: 0x994A, 49472 - 44032: 0xBCBF, 49473 - 44032: 0x994B, 49474 - 44032: 0x994C, 49475 - 44032: 0x994D, 49476 - 44032: 0x994E, 49477 - 44032: 0x994F, 49478 - 44032: 0x9950, 49479 - 44032: 0x9951, 49480 - 44032: 0xBCC0, 49481 - 44032: 0xBCC1, 49482 - 44032: 0x9952, 49483 - 44032: 0xBCC2, 49484 - 44032: 0xBCC3, 49485 - 44032: 0xBCC4, 49486 - 44032: 0x9953, 49487 - 44032: 0x9954, 49488 - 44032: 0x9955, 49489 - 44032: 0x9956, 49490 - 44032: 0x9957, 49491 - 44032: 0x9958, 49492 - 44032: 0xBCC5, 49493 - 44032: 0xBCC6, 49494 - 44032: 0x9959, 49495 - 44032: 0x995A, 49496 - 44032: 0xBCC7, 49497 - 44032: 0x9961, 49498 - 44032: 0x9962, 49499 - 44032: 0x9963, 49500 - 44032: 0xBCC8, 49501 - 44032: 0x9964, 49502 - 44032: 0x9965, 49503 - 44032: 0x9966, 49504 - 44032: 0x9967, 49505 - 44032: 0x9968, 49506 - 44032: 0x9969, 49507 - 44032: 0x996A, 49508 - 44032: 0xBCC9, 49509 - 44032: 0xBCCA, 49510 - 44032: 0x996B, 49511 - 44032: 0xBCCB, 49512 - 44032: 0xBCCC, 49513 - 44032: 0xBCCD, 49514 - 44032: 0x996C, 49515 - 44032: 0x996D, 49516 - 44032: 0x996E, 49517 - 44032: 0x996F, 49518 - 44032: 0x9970, 49519 - 44032: 0x9971, 49520 - 44032: 0xBCCE, 49521 - 44032: 0x9972, 49522 - 44032: 0x9973, 49523 - 44032: 0x9974, 49524 - 44032: 0xBCCF, 49525 - 44032: 0x9975, 49526 - 44032: 0x9976, 49527 - 44032: 0x9977, 49528 - 44032: 0xBCD0, 49529 - 44032: 0x9978, 49530 - 44032: 0x9979, 49531 - 44032: 0x997A, 49532 - 44032: 0x9981, 49533 - 44032: 0x9982, 49534 - 44032: 0x9983, 49535 - 44032: 0x9984, 49536 - 44032: 0x9985, 49537 - 44032: 0x9986, 49538 - 44032: 0x9987, 49539 - 44032: 0x9988, 49540 - 44032: 0x9989, 49541 - 44032: 0xBCD1, 49542 - 44032: 0x998A, 49543 - 44032: 0x998B, 49544 - 44032: 0x998C, 49545 - 44032: 0x998D, 49546 - 44032: 0x998E, 49547 - 44032: 0x998F, 49548 - 44032: 0xBCD2, 49549 - 44032: 0xBCD3, 49550 - 44032: 0xBCD4, 49551 - 44032: 0x9990, 49552 - 44032: 0xBCD5, 49553 - 44032: 0x9991, 49554 - 44032: 0x9992, 49555 - 44032: 0x9993, 49556 - 44032: 0xBCD6, 49557 - 44032: 0x9994, 49558 - 44032: 0xBCD7, 49559 - 44032: 0x9995, 49560 - 44032: 0x9996, 49561 - 44032: 0x9997, 49562 - 44032: 0x9998, 49563 - 44032: 0x9999, 49564 - 44032: 0xBCD8, 49565 - 44032: 0xBCD9, 49566 - 44032: 0x999A, 49567 - 44032: 0xBCDA, 49568 - 44032: 0x999B, 49569 - 44032: 0xBCDB, 49570 - 44032: 0x999C, 49571 - 44032: 0x999D, 49572 - 44032: 0x999E, 49573 - 44032: 0xBCDC, 49574 - 44032: 0x999F, 49575 - 44032: 0x99A0, 49576 - 44032: 0xBCDD, 49577 - 44032: 0xBCDE, 49578 - 44032: 0x99A1, 49579 - 44032: 0x99A2, 49580 - 44032: 0xBCDF, 49581 - 44032: 0x99A3, 49582 - 44032: 0x99A4, 49583 - 44032: 0x99A5, 49584 - 44032: 0xBCE0, 49585 - 44032: 0x99A6, 49586 - 44032: 0x99A7, 49587 - 44032: 0x99A8, 49588 - 44032: 0x99A9, 49589 - 44032: 0x99AA, 49590 - 44032: 0x99AB, 49591 - 44032: 0x99AC, 49592 - 44032: 0x99AD, 49593 - 44032: 0x99AE, 49594 - 44032: 0x99AF, 49595 - 44032: 0x99B0, 49596 - 44032: 0x99B1, 49597 - 44032: 0xBCE1, 49598 - 44032: 0x99B2, 49599 - 44032: 0x99B3, 49600 - 44032: 0x99B4, 49601 - 44032: 0x99B5, 49602 - 44032: 0x99B6, 49603 - 44032: 0x99B7, 49604 - 44032: 0xBCE2, 49605 - 44032: 0x99B8, 49606 - 44032: 0x99B9, 49607 - 44032: 0x99BA, 49608 - 44032: 0xBCE3, 49609 - 44032: 0x99BB, 49610 - 44032: 0x99BC, 49611 - 44032: 0x99BD, 49612 - 44032: 0xBCE4, 49613 - 44032: 0x99BE, 49614 - 44032: 0x99BF, 49615 - 44032: 0x99C0, 49616 - 44032: 0x99C1, 49617 - 44032: 0x99C2, 49618 - 44032: 0x99C3, 49619 - 44032: 0x99C4, 49620 - 44032: 0xBCE5, 49621 - 44032: 0x99C5, 49622 - 44032: 0x99C6, 49623 - 44032: 0xBCE6, 49624 - 44032: 0xBCE7, 49625 - 44032: 0x99C7, 49626 - 44032: 0x99C8, 49627 - 44032: 0x99C9, 49628 - 44032: 0x99CA, 49629 - 44032: 0x99CB, 49630 - 44032: 0x99CC, 49631 - 44032: 0x99CD, 49632 - 44032: 0xBCE8, 49633 - 44032: 0x99CE, 49634 - 44032: 0x99CF, 49635 - 44032: 0x99D0, 49636 - 44032: 0xBCE9, 49637 - 44032: 0x99D1, 49638 - 44032: 0x99D2, 49639 - 44032: 0x99D3, 49640 - 44032: 0xBCEA, 49641 - 44032: 0x99D4, 49642 - 44032: 0x99D5, 49643 - 44032: 0x99D6, 49644 - 44032: 0x99D7, 49645 - 44032: 0x99D8, 49646 - 44032: 0x99D9, 49647 - 44032: 0x99DA, 49648 - 44032: 0xBCEB, 49649 - 44032: 0xBCEC, 49650 - 44032: 0x99DB, 49651 - 44032: 0xBCED, 49652 - 44032: 0x99DC, 49653 - 44032: 0x99DD, 49654 - 44032: 0x99DE, 49655 - 44032: 0x99DF, 49656 - 44032: 0x99E0, 49657 - 44032: 0x99E1, 49658 - 44032: 0x99E2, 49659 - 44032: 0x99E3, 49660 - 44032: 0xBCEE, 49661 - 44032: 0xBCEF, 49662 - 44032: 0x99E4, 49663 - 44032: 0x99E5, 49664 - 44032: 0xBCF0, 49665 - 44032: 0x99E6, 49666 - 44032: 0x99E7, 49667 - 44032: 0x99E8, 49668 - 44032: 0xBCF1, 49669 - 44032: 0x99E9, 49670 - 44032: 0x99EA, 49671 - 44032: 0x99EB, 49672 - 44032: 0x99EC, 49673 - 44032: 0x99ED, 49674 - 44032: 0x99EE, 49675 - 44032: 0x99EF, 49676 - 44032: 0xBCF2, 49677 - 44032: 0xBCF3, 49678 - 44032: 0x99F0, 49679 - 44032: 0xBCF4, 49680 - 44032: 0x99F1, 49681 - 44032: 0xBCF5, 49682 - 44032: 0x99F2, 49683 - 44032: 0x99F3, 49684 - 44032: 0x99F4, 49685 - 44032: 0x99F5, 49686 - 44032: 0x99F6, 49687 - 44032: 0x99F7, 49688 - 44032: 0xBCF6, 49689 - 44032: 0xBCF7, 49690 - 44032: 0x99F8, 49691 - 44032: 0x99F9, 49692 - 44032: 0xBCF8, 49693 - 44032: 0x99FA, 49694 - 44032: 0x99FB, 49695 - 44032: 0xBCF9, 49696 - 44032: 0xBCFA, 49697 - 44032: 0x99FC, 49698 - 44032: 0x99FD, 49699 - 44032: 0x99FE, 49700 - 44032: 0x9A41, 49701 - 44032: 0x9A42, 49702 - 44032: 0x9A43, 49703 - 44032: 0x9A44, 49704 - 44032: 0xBCFB, 49705 - 44032: 0xBCFC, 49706 - 44032: 0x9A45, 49707 - 44032: 0xBCFD, 49708 - 44032: 0x9A46, 49709 - 44032: 0xBCFE, 49710 - 44032: 0x9A47, 49711 - 44032: 0xBDA1, 49712 - 44032: 0x9A48, 49713 - 44032: 0xBDA2, 49714 - 44032: 0xBDA3, 49715 - 44032: 0x9A49, 49716 - 44032: 0xBDA4, 49717 - 44032: 0x9A4A, 49718 - 44032: 0x9A4B, 49719 - 44032: 0x9A4C, 49720 - 44032: 0x9A4D, 49721 - 44032: 0x9A4E, 49722 - 44032: 0x9A4F, 49723 - 44032: 0x9A50, 49724 - 44032: 0x9A51, 49725 - 44032: 0x9A52, 49726 - 44032: 0x9A53, 49727 - 44032: 0x9A54, 49728 - 44032: 0x9A55, 49729 - 44032: 0x9A56, 49730 - 44032: 0x9A57, 49731 - 44032: 0x9A58, 49732 - 44032: 0x9A59, 49733 - 44032: 0x9A5A, 49734 - 44032: 0x9A61, 49735 - 44032: 0x9A62, 49736 - 44032: 0xBDA5, 49737 - 44032: 0x9A63, 49738 - 44032: 0x9A64, 49739 - 44032: 0x9A65, 49740 - 44032: 0x9A66, 49741 - 44032: 0x9A67, 49742 - 44032: 0x9A68, 49743 - 44032: 0x9A69, 49744 - 44032: 0xBDA6, 49745 - 44032: 0xBDA7, 49746 - 44032: 0x9A6A, 49747 - 44032: 0x9A6B, 49748 - 44032: 0xBDA8, 49749 - 44032: 0x9A6C, 49750 - 44032: 0x9A6D, 49751 - 44032: 0x9A6E, 49752 - 44032: 0xBDA9, 49753 - 44032: 0x9A6F, 49754 - 44032: 0x9A70, 49755 - 44032: 0x9A71, 49756 - 44032: 0x9A72, 49757 - 44032: 0x9A73, 49758 - 44032: 0x9A74, 49759 - 44032: 0x9A75, 49760 - 44032: 0xBDAA, 49761 - 44032: 0x9A76, 49762 - 44032: 0x9A77, 49763 - 44032: 0x9A78, 49764 - 44032: 0x9A79, 49765 - 44032: 0xBDAB, 49766 - 44032: 0x9A7A, 49767 - 44032: 0x9A81, 49768 - 44032: 0x9A82, 49769 - 44032: 0x9A83, 49770 - 44032: 0x9A84, 49771 - 44032: 0x9A85, 49772 - 44032: 0xBDAC, 49773 - 44032: 0xBDAD, 49774 - 44032: 0x9A86, 49775 - 44032: 0x9A87, 49776 - 44032: 0xBDAE, 49777 - 44032: 0x9A88, 49778 - 44032: 0x9A89, 49779 - 44032: 0x9A8A, 49780 - 44032: 0xBDAF, 49781 - 44032: 0x9A8B, 49782 - 44032: 0x9A8C, 49783 - 44032: 0x9A8D, 49784 - 44032: 0x9A8E, 49785 - 44032: 0x9A8F, 49786 - 44032: 0x9A90, 49787 - 44032: 0x9A91, 49788 - 44032: 0xBDB0, 49789 - 44032: 0xBDB1, 49790 - 44032: 0x9A92, 49791 - 44032: 0xBDB2, 49792 - 44032: 0x9A93, 49793 - 44032: 0xBDB3, 49794 - 44032: 0x9A94, 49795 - 44032: 0x9A95, 49796 - 44032: 0x9A96, 49797 - 44032: 0x9A97, 49798 - 44032: 0x9A98, 49799 - 44032: 0x9A99, 49800 - 44032: 0xBDB4, 49801 - 44032: 0xBDB5, 49802 - 44032: 0x9A9A, 49803 - 44032: 0x9A9B, 49804 - 44032: 0x9A9C, 49805 - 44032: 0x9A9D, 49806 - 44032: 0x9A9E, 49807 - 44032: 0x9A9F, 49808 - 44032: 0xBDB6, 49809 - 44032: 0x9AA0, 49810 - 44032: 0x9AA1, 49811 - 44032: 0x9AA2, 49812 - 44032: 0x9AA3, 49813 - 44032: 0x9AA4, 49814 - 44032: 0x9AA5, 49815 - 44032: 0x9AA6, 49816 - 44032: 0xBDB7, 49817 - 44032: 0x9AA7, 49818 - 44032: 0x9AA8, 49819 - 44032: 0xBDB8, 49820 - 44032: 0x9AA9, 49821 - 44032: 0xBDB9, 49822 - 44032: 0x9AAA, 49823 - 44032: 0x9AAB, 49824 - 44032: 0x9AAC, 49825 - 44032: 0x9AAD, 49826 - 44032: 0x9AAE, 49827 - 44032: 0x9AAF, 49828 - 44032: 0xBDBA, 49829 - 44032: 0xBDBB, 49830 - 44032: 0x9AB0, 49831 - 44032: 0x9AB1, 49832 - 44032: 0xBDBC, 49833 - 44032: 0x9AB2, 49834 - 44032: 0x9AB3, 49835 - 44032: 0x9AB4, 49836 - 44032: 0xBDBD, 49837 - 44032: 0xBDBE, 49838 - 44032: 0x9AB5, 49839 - 44032: 0x9AB6, 49840 - 44032: 0x9AB7, 49841 - 44032: 0x9AB8, 49842 - 44032: 0x9AB9, 49843 - 44032: 0x9ABA, 49844 - 44032: 0xBDBF, 49845 - 44032: 0xBDC0, 49846 - 44032: 0x9ABB, 49847 - 44032: 0xBDC1, 49848 - 44032: 0x9ABC, 49849 - 44032: 0xBDC2, 49850 - 44032: 0x9ABD, 49851 - 44032: 0x9ABE, 49852 - 44032: 0x9ABF, 49853 - 44032: 0x9AC0, 49854 - 44032: 0x9AC1, 49855 - 44032: 0x9AC2, 49856 - 44032: 0x9AC3, 49857 - 44032: 0x9AC4, 49858 - 44032: 0x9AC5, 49859 - 44032: 0x9AC6, 49860 - 44032: 0x9AC7, 49861 - 44032: 0x9AC8, 49862 - 44032: 0x9AC9, 49863 - 44032: 0x9ACA, 49864 - 44032: 0x9ACB, 49865 - 44032: 0x9ACC, 49866 - 44032: 0x9ACD, 49867 - 44032: 0x9ACE, 49868 - 44032: 0x9ACF, 49869 - 44032: 0x9AD0, 49870 - 44032: 0x9AD1, 49871 - 44032: 0x9AD2, 49872 - 44032: 0x9AD3, 49873 - 44032: 0x9AD4, 49874 - 44032: 0x9AD5, 49875 - 44032: 0x9AD6, 49876 - 44032: 0x9AD7, 49877 - 44032: 0x9AD8, 49878 - 44032: 0x9AD9, 49879 - 44032: 0x9ADA, 49880 - 44032: 0x9ADB, 49881 - 44032: 0x9ADC, 49882 - 44032: 0x9ADD, 49883 - 44032: 0x9ADE, 49884 - 44032: 0xBDC3, 49885 - 44032: 0xBDC4, 49886 - 44032: 0x9ADF, 49887 - 44032: 0x9AE0, 49888 - 44032: 0xBDC5, 49889 - 44032: 0x9AE1, 49890 - 44032: 0x9AE2, 49891 - 44032: 0xBDC6, 49892 - 44032: 0xBDC7, 49893 - 44032: 0x9AE3, 49894 - 44032: 0x9AE4, 49895 - 44032: 0x9AE5, 49896 - 44032: 0x9AE6, 49897 - 44032: 0x9AE7, 49898 - 44032: 0x9AE8, 49899 - 44032: 0xBDC8, 49900 - 44032: 0xBDC9, 49901 - 44032: 0xBDCA, 49902 - 44032: 0x9AE9, 49903 - 44032: 0xBDCB, 49904 - 44032: 0x9AEA, 49905 - 44032: 0xBDCC, 49906 - 44032: 0x9AEB, 49907 - 44032: 0x9AEC, 49908 - 44032: 0x9AED, 49909 - 44032: 0x9AEE, 49910 - 44032: 0xBDCD, 49911 - 44032: 0x9AEF, 49912 - 44032: 0xBDCE, 49913 - 44032: 0xBDCF, 49914 - 44032: 0x9AF0, 49915 - 44032: 0xBDD0, 49916 - 44032: 0xBDD1, 49917 - 44032: 0x9AF1, 49918 - 44032: 0x9AF2, 49919 - 44032: 0x9AF3, 49920 - 44032: 0xBDD2, 49921 - 44032: 0x9AF4, 49922 - 44032: 0x9AF5, 49923 - 44032: 0x9AF6, 49924 - 44032: 0x9AF7, 49925 - 44032: 0x9AF8, 49926 - 44032: 0x9AF9, 49927 - 44032: 0x9AFA, 49928 - 44032: 0xBDD3, 49929 - 44032: 0xBDD4, 49930 - 44032: 0x9AFB, 49931 - 44032: 0x9AFC, 49932 - 44032: 0xBDD5, 49933 - 44032: 0xBDD6, 49934 - 44032: 0x9AFD, 49935 - 44032: 0x9AFE, 49936 - 44032: 0x9B41, 49937 - 44032: 0x9B42, 49938 - 44032: 0x9B43, 49939 - 44032: 0xBDD7, 49940 - 44032: 0xBDD8, 49941 - 44032: 0xBDD9, 49942 - 44032: 0x9B44, 49943 - 44032: 0x9B45, 49944 - 44032: 0xBDDA, 49945 - 44032: 0x9B46, 49946 - 44032: 0x9B47, 49947 - 44032: 0x9B48, 49948 - 44032: 0xBDDB, 49949 - 44032: 0x9B49, 49950 - 44032: 0x9B4A, 49951 - 44032: 0x9B4B, 49952 - 44032: 0x9B4C, 49953 - 44032: 0x9B4D, 49954 - 44032: 0x9B4E, 49955 - 44032: 0x9B4F, 49956 - 44032: 0xBDDC, 49957 - 44032: 0xBDDD, 49958 - 44032: 0x9B50, 49959 - 44032: 0x9B51, 49960 - 44032: 0xBDDE, 49961 - 44032: 0xBDDF, 49962 - 44032: 0x9B52, 49963 - 44032: 0x9B53, 49964 - 44032: 0x9B54, 49965 - 44032: 0x9B55, 49966 - 44032: 0x9B56, 49967 - 44032: 0x9B57, 49968 - 44032: 0x9B58, 49969 - 44032: 0x9B59, 49970 - 44032: 0x9B5A, 49971 - 44032: 0x9B61, 49972 - 44032: 0x9B62, 49973 - 44032: 0x9B63, 49974 - 44032: 0x9B64, 49975 - 44032: 0x9B65, 49976 - 44032: 0x9B66, 49977 - 44032: 0x9B67, 49978 - 44032: 0x9B68, 49979 - 44032: 0x9B69, 49980 - 44032: 0x9B6A, 49981 - 44032: 0x9B6B, 49982 - 44032: 0x9B6C, 49983 - 44032: 0x9B6D, 49984 - 44032: 0x9B6E, 49985 - 44032: 0x9B6F, 49986 - 44032: 0x9B70, 49987 - 44032: 0x9B71, 49988 - 44032: 0x9B72, 49989 - 44032: 0xBDE0, 49990 - 44032: 0x9B73, 49991 - 44032: 0x9B74, 49992 - 44032: 0x9B75, 49993 - 44032: 0x9B76, 49994 - 44032: 0x9B77, 49995 - 44032: 0x9B78, 49996 - 44032: 0x9B79, 49997 - 44032: 0x9B7A, 49998 - 44032: 0x9B81, 49999 - 44032: 0x9B82, 50000 - 44032: 0x9B83, 50001 - 44032: 0x9B84, 50002 - 44032: 0x9B85, 50003 - 44032: 0x9B86, 50004 - 44032: 0x9B87, 50005 - 44032: 0x9B88, 50006 - 44032: 0x9B89, 50007 - 44032: 0x9B8A, 50008 - 44032: 0x9B8B, 50009 - 44032: 0x9B8C, 50010 - 44032: 0x9B8D, 50011 - 44032: 0x9B8E, 50012 - 44032: 0x9B8F, 50013 - 44032: 0x9B90, 50014 - 44032: 0x9B91, 50015 - 44032: 0x9B92, 50016 - 44032: 0x9B93, 50017 - 44032: 0x9B94, 50018 - 44032: 0x9B95, 50019 - 44032: 0x9B96, 50020 - 44032: 0x9B97, 50021 - 44032: 0x9B98, 50022 - 44032: 0x9B99, 50023 - 44032: 0x9B9A, 50024 - 44032: 0xBDE1, 50025 - 44032: 0xBDE2, 50026 - 44032: 0x9B9B, 50027 - 44032: 0x9B9C, 50028 - 44032: 0xBDE3, 50029 - 44032: 0x9B9D, 50030 - 44032: 0x9B9E, 50031 - 44032: 0x9B9F, 50032 - 44032: 0xBDE4, 50033 - 44032: 0x9BA0, 50034 - 44032: 0xBDE5, 50035 - 44032: 0x9BA1, 50036 - 44032: 0x9BA2, 50037 - 44032: 0x9BA3, 50038 - 44032: 0x9BA4, 50039 - 44032: 0x9BA5, 50040 - 44032: 0xBDE6, 50041 - 44032: 0xBDE7, 50042 - 44032: 0x9BA6, 50043 - 44032: 0x9BA7, 50044 - 44032: 0xBDE8, 50045 - 44032: 0xBDE9, 50046 - 44032: 0x9BA8, 50047 - 44032: 0x9BA9, 50048 - 44032: 0x9BAA, 50049 - 44032: 0x9BAB, 50050 - 44032: 0x9BAC, 50051 - 44032: 0x9BAD, 50052 - 44032: 0xBDEA, 50053 - 44032: 0x9BAE, 50054 - 44032: 0x9BAF, 50055 - 44032: 0x9BB0, 50056 - 44032: 0xBDEB, 50057 - 44032: 0x9BB1, 50058 - 44032: 0x9BB2, 50059 - 44032: 0x9BB3, 50060 - 44032: 0xBDEC, 50061 - 44032: 0x9BB4, 50062 - 44032: 0x9BB5, 50063 - 44032: 0x9BB6, 50064 - 44032: 0x9BB7, 50065 - 44032: 0x9BB8, 50066 - 44032: 0x9BB9, 50067 - 44032: 0x9BBA, 50068 - 44032: 0x9BBB, 50069 - 44032: 0x9BBC, 50070 - 44032: 0x9BBD, 50071 - 44032: 0x9BBE, 50072 - 44032: 0x9BBF, 50073 - 44032: 0x9BC0, 50074 - 44032: 0x9BC1, 50075 - 44032: 0x9BC2, 50076 - 44032: 0x9BC3, 50077 - 44032: 0x9BC4, 50078 - 44032: 0x9BC5, 50079 - 44032: 0x9BC6, 50080 - 44032: 0x9BC7, 50081 - 44032: 0x9BC8, 50082 - 44032: 0x9BC9, 50083 - 44032: 0x9BCA, 50084 - 44032: 0x9BCB, 50085 - 44032: 0x9BCC, 50086 - 44032: 0x9BCD, 50087 - 44032: 0x9BCE, 50088 - 44032: 0x9BCF, 50089 - 44032: 0x9BD0, 50090 - 44032: 0x9BD1, 50091 - 44032: 0x9BD2, 50092 - 44032: 0x9BD3, 50093 - 44032: 0x9BD4, 50094 - 44032: 0x9BD5, 50095 - 44032: 0x9BD6, 50096 - 44032: 0x9BD7, 50097 - 44032: 0x9BD8, 50098 - 44032: 0x9BD9, 50099 - 44032: 0x9BDA, 50100 - 44032: 0x9BDB, 50101 - 44032: 0x9BDC, 50102 - 44032: 0x9BDD, 50103 - 44032: 0x9BDE, 50104 - 44032: 0x9BDF, 50105 - 44032: 0x9BE0, 50106 - 44032: 0x9BE1, 50107 - 44032: 0x9BE2, 50108 - 44032: 0x9BE3, 50109 - 44032: 0x9BE4, 50110 - 44032: 0x9BE5, 50111 - 44032: 0x9BE6, 50112 - 44032: 0xBDED, 50113 - 44032: 0x9BE7, 50114 - 44032: 0x9BE8, 50115 - 44032: 0x9BE9, 50116 - 44032: 0x9BEA, 50117 - 44032: 0x9BEB, 50118 - 44032: 0x9BEC, 50119 - 44032: 0x9BED, 50120 - 44032: 0x9BEE, 50121 - 44032: 0x9BEF, 50122 - 44032: 0x9BF0, 50123 - 44032: 0x9BF1, 50124 - 44032: 0x9BF2, 50125 - 44032: 0x9BF3, 50126 - 44032: 0x9BF4, 50127 - 44032: 0x9BF5, 50128 - 44032: 0x9BF6, 50129 - 44032: 0x9BF7, 50130 - 44032: 0x9BF8, 50131 - 44032: 0x9BF9, 50132 - 44032: 0x9BFA, 50133 - 44032: 0x9BFB, 50134 - 44032: 0x9BFC, 50135 - 44032: 0x9BFD, 50136 - 44032: 0xBDEE, 50137 - 44032: 0xBDEF, 50138 - 44032: 0x9BFE, 50139 - 44032: 0x9C41, 50140 - 44032: 0xBDF0, 50141 - 44032: 0x9C42, 50142 - 44032: 0x9C43, 50143 - 44032: 0xBDF1, 50144 - 44032: 0xBDF2, 50145 - 44032: 0x9C44, 50146 - 44032: 0xBDF3, 50147 - 44032: 0x9C45, 50148 - 44032: 0x9C46, 50149 - 44032: 0x9C47, 50150 - 44032: 0x9C48, 50151 - 44032: 0x9C49, 50152 - 44032: 0xBDF4, 50153 - 44032: 0xBDF5, 50154 - 44032: 0x9C4A, 50155 - 44032: 0x9C4B, 50156 - 44032: 0x9C4C, 50157 - 44032: 0xBDF6, 50158 - 44032: 0x9C4D, 50159 - 44032: 0x9C4E, 50160 - 44032: 0x9C4F, 50161 - 44032: 0x9C50, 50162 - 44032: 0x9C51, 50163 - 44032: 0x9C52, 50164 - 44032: 0xBDF7, 50165 - 44032: 0xBDF8, 50166 - 44032: 0x9C53, 50167 - 44032: 0x9C54, 50168 - 44032: 0xBDF9, 50169 - 44032: 0x9C55, 50170 - 44032: 0x9C56, 50171 - 44032: 0x9C57, 50172 - 44032: 0x9C58, 50173 - 44032: 0x9C59, 50174 - 44032: 0x9C5A, 50175 - 44032: 0x9C61, 50176 - 44032: 0x9C62, 50177 - 44032: 0x9C63, 50178 - 44032: 0x9C64, 50179 - 44032: 0x9C65, 50180 - 44032: 0x9C66, 50181 - 44032: 0x9C67, 50182 - 44032: 0x9C68, 50183 - 44032: 0x9C69, 50184 - 44032: 0xBDFA, 50185 - 44032: 0x9C6A, 50186 - 44032: 0x9C6B, 50187 - 44032: 0x9C6C, 50188 - 44032: 0x9C6D, 50189 - 44032: 0x9C6E, 50190 - 44032: 0x9C6F, 50191 - 44032: 0x9C70, 50192 - 44032: 0xBDFB, 50193 - 44032: 0x9C71, 50194 - 44032: 0x9C72, 50195 - 44032: 0x9C73, 50196 - 44032: 0x9C74, 50197 - 44032: 0x9C75, 50198 - 44032: 0x9C76, 50199 - 44032: 0x9C77, 50200 - 44032: 0x9C78, 50201 - 44032: 0x9C79, 50202 - 44032: 0x9C7A, 50203 - 44032: 0x9C81, 50204 - 44032: 0x9C82, 50205 - 44032: 0x9C83, 50206 - 44032: 0x9C84, 50207 - 44032: 0x9C85, 50208 - 44032: 0x9C86, 50209 - 44032: 0x9C87, 50210 - 44032: 0x9C88, 50211 - 44032: 0x9C89, 50212 - 44032: 0xBDFC, 50213 - 44032: 0x9C8A, 50214 - 44032: 0x9C8B, 50215 - 44032: 0x9C8C, 50216 - 44032: 0x9C8D, 50217 - 44032: 0x9C8E, 50218 - 44032: 0x9C8F, 50219 - 44032: 0x9C90, 50220 - 44032: 0xBDFD, 50221 - 44032: 0x9C91, 50222 - 44032: 0x9C92, 50223 - 44032: 0x9C93, 50224 - 44032: 0xBDFE, 50225 - 44032: 0x9C94, 50226 - 44032: 0x9C95, 50227 - 44032: 0x9C96, 50228 - 44032: 0xBEA1, 50229 - 44032: 0x9C97, 50230 - 44032: 0x9C98, 50231 - 44032: 0x9C99, 50232 - 44032: 0x9C9A, 50233 - 44032: 0x9C9B, 50234 - 44032: 0x9C9C, 50235 - 44032: 0x9C9D, 50236 - 44032: 0xBEA2, 50237 - 44032: 0xBEA3, 50238 - 44032: 0x9C9E, 50239 - 44032: 0x9C9F, 50240 - 44032: 0x9CA0, 50241 - 44032: 0x9CA1, 50242 - 44032: 0x9CA2, 50243 - 44032: 0x9CA3, 50244 - 44032: 0x9CA4, 50245 - 44032: 0x9CA5, 50246 - 44032: 0x9CA6, 50247 - 44032: 0x9CA7, 50248 - 44032: 0xBEA4, 50249 - 44032: 0x9CA8, 50250 - 44032: 0x9CA9, 50251 - 44032: 0x9CAA, 50252 - 44032: 0x9CAB, 50253 - 44032: 0x9CAC, 50254 - 44032: 0x9CAD, 50255 - 44032: 0x9CAE, 50256 - 44032: 0x9CAF, 50257 - 44032: 0x9CB0, 50258 - 44032: 0x9CB1, 50259 - 44032: 0x9CB2, 50260 - 44032: 0x9CB3, 50261 - 44032: 0x9CB4, 50262 - 44032: 0x9CB5, 50263 - 44032: 0x9CB6, 50264 - 44032: 0x9CB7, 50265 - 44032: 0x9CB8, 50266 - 44032: 0x9CB9, 50267 - 44032: 0x9CBA, 50268 - 44032: 0x9CBB, 50269 - 44032: 0x9CBC, 50270 - 44032: 0x9CBD, 50271 - 44032: 0x9CBE, 50272 - 44032: 0x9CBF, 50273 - 44032: 0x9CC0, 50274 - 44032: 0x9CC1, 50275 - 44032: 0x9CC2, 50276 - 44032: 0xBEA5, 50277 - 44032: 0xBEA6, 50278 - 44032: 0x9CC3, 50279 - 44032: 0x9CC4, 50280 - 44032: 0xBEA7, 50281 - 44032: 0x9CC5, 50282 - 44032: 0x9CC6, 50283 - 44032: 0x9CC7, 50284 - 44032: 0xBEA8, 50285 - 44032: 0x9CC8, 50286 - 44032: 0x9CC9, 50287 - 44032: 0x9CCA, 50288 - 44032: 0x9CCB, 50289 - 44032: 0x9CCC, 50290 - 44032: 0x9CCD, 50291 - 44032: 0x9CCE, 50292 - 44032: 0xBEA9, 50293 - 44032: 0xBEAA, 50294 - 44032: 0x9CCF, 50295 - 44032: 0x9CD0, 50296 - 44032: 0x9CD1, 50297 - 44032: 0xBEAB, 50298 - 44032: 0x9CD2, 50299 - 44032: 0x9CD3, 50300 - 44032: 0x9CD4, 50301 - 44032: 0x9CD5, 50302 - 44032: 0x9CD6, 50303 - 44032: 0x9CD7, 50304 - 44032: 0xBEAC, 50305 - 44032: 0x9CD8, 50306 - 44032: 0x9CD9, 50307 - 44032: 0x9CDA, 50308 - 44032: 0x9CDB, 50309 - 44032: 0x9CDC, 50310 - 44032: 0x9CDD, 50311 - 44032: 0x9CDE, 50312 - 44032: 0x9CDF, 50313 - 44032: 0x9CE0, 50314 - 44032: 0x9CE1, 50315 - 44032: 0x9CE2, 50316 - 44032: 0x9CE3, 50317 - 44032: 0x9CE4, 50318 - 44032: 0x9CE5, 50319 - 44032: 0x9CE6, 50320 - 44032: 0x9CE7, 50321 - 44032: 0x9CE8, 50322 - 44032: 0x9CE9, 50323 - 44032: 0x9CEA, 50324 - 44032: 0xBEAD, 50325 - 44032: 0x9CEB, 50326 - 44032: 0x9CEC, 50327 - 44032: 0x9CED, 50328 - 44032: 0x9CEE, 50329 - 44032: 0x9CEF, 50330 - 44032: 0x9CF0, 50331 - 44032: 0x9CF1, 50332 - 44032: 0xBEAE, 50333 - 44032: 0x9CF2, 50334 - 44032: 0x9CF3, 50335 - 44032: 0x9CF4, 50336 - 44032: 0x9CF5, 50337 - 44032: 0x9CF6, 50338 - 44032: 0x9CF7, 50339 - 44032: 0x9CF8, 50340 - 44032: 0x9CF9, 50341 - 44032: 0x9CFA, 50342 - 44032: 0x9CFB, 50343 - 44032: 0x9CFC, 50344 - 44032: 0x9CFD, 50345 - 44032: 0x9CFE, 50346 - 44032: 0x9D41, 50347 - 44032: 0x9D42, 50348 - 44032: 0x9D43, 50349 - 44032: 0x9D44, 50350 - 44032: 0x9D45, 50351 - 44032: 0x9D46, 50352 - 44032: 0x9D47, 50353 - 44032: 0x9D48, 50354 - 44032: 0x9D49, 50355 - 44032: 0x9D4A, 50356 - 44032: 0x9D4B, 50357 - 44032: 0x9D4C, 50358 - 44032: 0x9D4D, 50359 - 44032: 0x9D4E, 50360 - 44032: 0xBEAF, 50361 - 44032: 0x9D4F, 50362 - 44032: 0x9D50, 50363 - 44032: 0x9D51, 50364 - 44032: 0xBEB0, 50365 - 44032: 0x9D52, 50366 - 44032: 0x9D53, 50367 - 44032: 0x9D54, 50368 - 44032: 0x9D55, 50369 - 44032: 0x9D56, 50370 - 44032: 0x9D57, 50371 - 44032: 0x9D58, 50372 - 44032: 0x9D59, 50373 - 44032: 0x9D5A, 50374 - 44032: 0x9D61, 50375 - 44032: 0x9D62, 50376 - 44032: 0x9D63, 50377 - 44032: 0x9D64, 50378 - 44032: 0x9D65, 50379 - 44032: 0x9D66, 50380 - 44032: 0x9D67, 50381 - 44032: 0x9D68, 50382 - 44032: 0x9D69, 50383 - 44032: 0x9D6A, 50384 - 44032: 0x9D6B, 50385 - 44032: 0x9D6C, 50386 - 44032: 0x9D6D, 50387 - 44032: 0x9D6E, 50388 - 44032: 0x9D6F, 50389 - 44032: 0x9D70, 50390 - 44032: 0x9D71, 50391 - 44032: 0x9D72, 50392 - 44032: 0x9D73, 50393 - 44032: 0x9D74, 50394 - 44032: 0x9D75, 50395 - 44032: 0x9D76, 50396 - 44032: 0x9D77, 50397 - 44032: 0x9D78, 50398 - 44032: 0x9D79, 50399 - 44032: 0x9D7A, 50400 - 44032: 0x9D81, 50401 - 44032: 0x9D82, 50402 - 44032: 0x9D83, 50403 - 44032: 0x9D84, 50404 - 44032: 0x9D85, 50405 - 44032: 0x9D86, 50406 - 44032: 0x9D87, 50407 - 44032: 0x9D88, 50408 - 44032: 0x9D89, 50409 - 44032: 0xBEB1, 50410 - 44032: 0x9D8A, 50411 - 44032: 0x9D8B, 50412 - 44032: 0x9D8C, 50413 - 44032: 0x9D8D, 50414 - 44032: 0x9D8E, 50415 - 44032: 0x9D8F, 50416 - 44032: 0xBEB2, 50417 - 44032: 0xBEB3, 50418 - 44032: 0x9D90, 50419 - 44032: 0x9D91, 50420 - 44032: 0xBEB4, 50421 - 44032: 0x9D92, 50422 - 44032: 0x9D93, 50423 - 44032: 0x9D94, 50424 - 44032: 0xBEB5, 50425 - 44032: 0x9D95, 50426 - 44032: 0xBEB6, 50427 - 44032: 0x9D96, 50428 - 44032: 0x9D97, 50429 - 44032: 0x9D98, 50430 - 44032: 0x9D99, 50431 - 44032: 0xBEB7, 50432 - 44032: 0xBEB8, 50433 - 44032: 0xBEB9, 50434 - 44032: 0x9D9A, 50435 - 44032: 0x9D9B, 50436 - 44032: 0x9D9C, 50437 - 44032: 0x9D9D, 50438 - 44032: 0x9D9E, 50439 - 44032: 0x9D9F, 50440 - 44032: 0x9DA0, 50441 - 44032: 0x9DA1, 50442 - 44032: 0x9DA2, 50443 - 44032: 0x9DA3, 50444 - 44032: 0xBEBA, 50445 - 44032: 0x9DA4, 50446 - 44032: 0x9DA5, 50447 - 44032: 0x9DA6, 50448 - 44032: 0xBEBB, 50449 - 44032: 0x9DA7, 50450 - 44032: 0x9DA8, 50451 - 44032: 0x9DA9, 50452 - 44032: 0xBEBC, 50453 - 44032: 0x9DAA, 50454 - 44032: 0x9DAB, 50455 - 44032: 0x9DAC, 50456 - 44032: 0x9DAD, 50457 - 44032: 0x9DAE, 50458 - 44032: 0x9DAF, 50459 - 44032: 0x9DB0, 50460 - 44032: 0xBEBD, 50461 - 44032: 0x9DB1, 50462 - 44032: 0x9DB2, 50463 - 44032: 0x9DB3, 50464 - 44032: 0x9DB4, 50465 - 44032: 0x9DB5, 50466 - 44032: 0x9DB6, 50467 - 44032: 0x9DB7, 50468 - 44032: 0x9DB8, 50469 - 44032: 0x9DB9, 50470 - 44032: 0x9DBA, 50471 - 44032: 0x9DBB, 50472 - 44032: 0xBEBE, 50473 - 44032: 0xBEBF, 50474 - 44032: 0x9DBC, 50475 - 44032: 0x9DBD, 50476 - 44032: 0xBEC0, 50477 - 44032: 0x9DBE, 50478 - 44032: 0x9DBF, 50479 - 44032: 0x9DC0, 50480 - 44032: 0xBEC1, 50481 - 44032: 0x9DC1, 50482 - 44032: 0x9DC2, 50483 - 44032: 0x9DC3, 50484 - 44032: 0x9DC4, 50485 - 44032: 0x9DC5, 50486 - 44032: 0x9DC6, 50487 - 44032: 0x9DC7, 50488 - 44032: 0xBEC2, 50489 - 44032: 0xBEC3, 50490 - 44032: 0x9DC8, 50491 - 44032: 0xBEC4, 50492 - 44032: 0x9DC9, 50493 - 44032: 0xBEC5, 50494 - 44032: 0x9DCA, 50495 - 44032: 0x9DCB, 50496 - 44032: 0x9DCC, 50497 - 44032: 0x9DCD, 50498 - 44032: 0x9DCE, 50499 - 44032: 0x9DCF, 50500 - 44032: 0xBEC6, 50501 - 44032: 0xBEC7, 50502 - 44032: 0x9DD0, 50503 - 44032: 0x9DD1, 50504 - 44032: 0xBEC8, 50505 - 44032: 0xBEC9, 50506 - 44032: 0xBECA, 50507 - 44032: 0x9DD2, 50508 - 44032: 0xBECB, 50509 - 44032: 0xBECC, 50510 - 44032: 0xBECD, 50511 - 44032: 0x9DD3, 50512 - 44032: 0x9DD4, 50513 - 44032: 0x9DD5, 50514 - 44032: 0x9DD6, 50515 - 44032: 0xBECE, 50516 - 44032: 0xBECF, 50517 - 44032: 0xBED0, 50518 - 44032: 0x9DD7, 50519 - 44032: 0xBED1, 50520 - 44032: 0xBED2, 50521 - 44032: 0xBED3, 50522 - 44032: 0x9DD8, 50523 - 44032: 0x9DD9, 50524 - 44032: 0x9DDA, 50525 - 44032: 0xBED4, 50526 - 44032: 0xBED5, 50527 - 44032: 0x9DDB, 50528 - 44032: 0xBED6, 50529 - 44032: 0xBED7, 50530 - 44032: 0x9DDC, 50531 - 44032: 0x9DDD, 50532 - 44032: 0xBED8, 50533 - 44032: 0x9DDE, 50534 - 44032: 0x9DDF, 50535 - 44032: 0x9DE0, 50536 - 44032: 0xBED9, 50537 - 44032: 0x9DE1, 50538 - 44032: 0x9DE2, 50539 - 44032: 0x9DE3, 50540 - 44032: 0x9DE4, 50541 - 44032: 0x9DE5, 50542 - 44032: 0x9DE6, 50543 - 44032: 0x9DE7, 50544 - 44032: 0xBEDA, 50545 - 44032: 0xBEDB, 50546 - 44032: 0x9DE8, 50547 - 44032: 0xBEDC, 50548 - 44032: 0xBEDD, 50549 - 44032: 0xBEDE, 50550 - 44032: 0x9DE9, 50551 - 44032: 0x9DEA, 50552 - 44032: 0x9DEB, 50553 - 44032: 0x9DEC, 50554 - 44032: 0x9DED, 50555 - 44032: 0x9DEE, 50556 - 44032: 0xBEDF, 50557 - 44032: 0xBEE0, 50558 - 44032: 0x9DEF, 50559 - 44032: 0x9DF0, 50560 - 44032: 0xBEE1, 50561 - 44032: 0x9DF1, 50562 - 44032: 0x9DF2, 50563 - 44032: 0x9DF3, 50564 - 44032: 0xBEE2, 50565 - 44032: 0x9DF4, 50566 - 44032: 0x9DF5, 50567 - 44032: 0xBEE3, 50568 - 44032: 0x9DF6, 50569 - 44032: 0x9DF7, 50570 - 44032: 0x9DF8, 50571 - 44032: 0x9DF9, 50572 - 44032: 0xBEE4, 50573 - 44032: 0xBEE5, 50574 - 44032: 0x9DFA, 50575 - 44032: 0xBEE6, 50576 - 44032: 0x9DFB, 50577 - 44032: 0xBEE7, 50578 - 44032: 0x9DFC, 50579 - 44032: 0x9DFD, 50580 - 44032: 0x9DFE, 50581 - 44032: 0xBEE8, 50582 - 44032: 0x9E41, 50583 - 44032: 0xBEE9, 50584 - 44032: 0xBEEA, 50585 - 44032: 0x9E42, 50586 - 44032: 0x9E43, 50587 - 44032: 0x9E44, 50588 - 44032: 0xBEEB, 50589 - 44032: 0x9E45, 50590 - 44032: 0x9E46, 50591 - 44032: 0x9E47, 50592 - 44032: 0xBEEC, 50593 - 44032: 0x9E48, 50594 - 44032: 0x9E49, 50595 - 44032: 0x9E4A, 50596 - 44032: 0x9E4B, 50597 - 44032: 0x9E4C, 50598 - 44032: 0x9E4D, 50599 - 44032: 0x9E4E, 50600 - 44032: 0x9E4F, 50601 - 44032: 0xBEED, 50602 - 44032: 0x9E50, 50603 - 44032: 0x9E51, 50604 - 44032: 0x9E52, 50605 - 44032: 0x9E53, 50606 - 44032: 0x9E54, 50607 - 44032: 0x9E55, 50608 - 44032: 0x9E56, 50609 - 44032: 0x9E57, 50610 - 44032: 0x9E58, 50611 - 44032: 0x9E59, 50612 - 44032: 0xBEEE, 50613 - 44032: 0xBEEF, 50614 - 44032: 0x9E5A, 50615 - 44032: 0x9E61, 50616 - 44032: 0xBEF0, 50617 - 44032: 0xBEF1, 50618 - 44032: 0x9E62, 50619 - 44032: 0xBEF2, 50620 - 44032: 0xBEF3, 50621 - 44032: 0xBEF4, 50622 - 44032: 0xBEF5, 50623 - 44032: 0x9E63, 50624 - 44032: 0x9E64, 50625 - 44032: 0x9E65, 50626 - 44032: 0x9E66, 50627 - 44032: 0x9E67, 50628 - 44032: 0xBEF6, 50629 - 44032: 0xBEF7, 50630 - 44032: 0xBEF8, 50631 - 44032: 0xBEF9, 50632 - 44032: 0xBEFA, 50633 - 44032: 0xBEFB, 50634 - 44032: 0xBEFC, 50635 - 44032: 0x9E68, 50636 - 44032: 0xBEFD, 50637 - 44032: 0x9E69, 50638 - 44032: 0xBEFE, 50639 - 44032: 0x9E6A, 50640 - 44032: 0xBFA1, 50641 - 44032: 0xBFA2, 50642 - 44032: 0x9E6B, 50643 - 44032: 0x9E6C, 50644 - 44032: 0xBFA3, 50645 - 44032: 0x9E6D, 50646 - 44032: 0x9E6E, 50647 - 44032: 0x9E6F, 50648 - 44032: 0xBFA4, 50649 - 44032: 0x9E70, 50650 - 44032: 0x9E71, 50651 - 44032: 0x9E72, 50652 - 44032: 0x9E73, 50653 - 44032: 0x9E74, 50654 - 44032: 0x9E75, 50655 - 44032: 0x9E76, 50656 - 44032: 0xBFA5, 50657 - 44032: 0xBFA6, 50658 - 44032: 0x9E77, 50659 - 44032: 0xBFA7, 50660 - 44032: 0x9E78, 50661 - 44032: 0xBFA8, 50662 - 44032: 0x9E79, 50663 - 44032: 0x9E7A, 50664 - 44032: 0x9E81, 50665 - 44032: 0x9E82, 50666 - 44032: 0x9E83, 50667 - 44032: 0x9E84, 50668 - 44032: 0xBFA9, 50669 - 44032: 0xBFAA, 50670 - 44032: 0xBFAB, 50671 - 44032: 0x9E85, 50672 - 44032: 0xBFAC, 50673 - 44032: 0x9E86, 50674 - 44032: 0x9E87, 50675 - 44032: 0x9E88, 50676 - 44032: 0xBFAD, 50677 - 44032: 0x9E89, 50678 - 44032: 0xBFAE, 50679 - 44032: 0xBFAF, 50680 - 44032: 0x9E8A, 50681 - 44032: 0x9E8B, 50682 - 44032: 0x9E8C, 50683 - 44032: 0x9E8D, 50684 - 44032: 0xBFB0, 50685 - 44032: 0xBFB1, 50686 - 44032: 0xBFB2, 50687 - 44032: 0xBFB3, 50688 - 44032: 0xBFB4, 50689 - 44032: 0xBFB5, 50690 - 44032: 0x9E8E, 50691 - 44032: 0x9E8F, 50692 - 44032: 0x9E90, 50693 - 44032: 0xBFB6, 50694 - 44032: 0xBFB7, 50695 - 44032: 0xBFB8, 50696 - 44032: 0xBFB9, 50697 - 44032: 0x9E91, 50698 - 44032: 0x9E92, 50699 - 44032: 0x9E93, 50700 - 44032: 0xBFBA, 50701 - 44032: 0x9E94, 50702 - 44032: 0x9E95, 50703 - 44032: 0x9E96, 50704 - 44032: 0xBFBB, 50705 - 44032: 0x9E97, 50706 - 44032: 0x9E98, 50707 - 44032: 0x9E99, 50708 - 44032: 0x9E9A, 50709 - 44032: 0x9E9B, 50710 - 44032: 0x9E9C, 50711 - 44032: 0x9E9D, 50712 - 44032: 0xBFBC, 50713 - 44032: 0xBFBD, 50714 - 44032: 0x9E9E, 50715 - 44032: 0xBFBE, 50716 - 44032: 0xBFBF, 50717 - 44032: 0x9E9F, 50718 - 44032: 0x9EA0, 50719 - 44032: 0x9EA1, 50720 - 44032: 0x9EA2, 50721 - 44032: 0x9EA3, 50722 - 44032: 0x9EA4, 50723 - 44032: 0x9EA5, 50724 - 44032: 0xBFC0, 50725 - 44032: 0xBFC1, 50726 - 44032: 0x9EA6, 50727 - 44032: 0x9EA7, 50728 - 44032: 0xBFC2, 50729 - 44032: 0x9EA8, 50730 - 44032: 0x9EA9, 50731 - 44032: 0x9EAA, 50732 - 44032: 0xBFC3, 50733 - 44032: 0xBFC4, 50734 - 44032: 0xBFC5, 50735 - 44032: 0x9EAB, 50736 - 44032: 0xBFC6, 50737 - 44032: 0x9EAC, 50738 - 44032: 0x9EAD, 50739 - 44032: 0xBFC7, 50740 - 44032: 0xBFC8, 50741 - 44032: 0xBFC9, 50742 - 44032: 0x9EAE, 50743 - 44032: 0xBFCA, 50744 - 44032: 0x9EAF, 50745 - 44032: 0xBFCB, 50746 - 44032: 0x9EB0, 50747 - 44032: 0xBFCC, 50748 - 44032: 0x9EB1, 50749 - 44032: 0x9EB2, 50750 - 44032: 0x9EB3, 50751 - 44032: 0x9EB4, 50752 - 44032: 0xBFCD, 50753 - 44032: 0xBFCE, 50754 - 44032: 0x9EB5, 50755 - 44032: 0x9EB6, 50756 - 44032: 0xBFCF, 50757 - 44032: 0x9EB7, 50758 - 44032: 0x9EB8, 50759 - 44032: 0x9EB9, 50760 - 44032: 0xBFD0, 50761 - 44032: 0x9EBA, 50762 - 44032: 0x9EBB, 50763 - 44032: 0x9EBC, 50764 - 44032: 0x9EBD, 50765 - 44032: 0x9EBE, 50766 - 44032: 0x9EBF, 50767 - 44032: 0x9EC0, 50768 - 44032: 0xBFD1, 50769 - 44032: 0xBFD2, 50770 - 44032: 0x9EC1, 50771 - 44032: 0xBFD3, 50772 - 44032: 0xBFD4, 50773 - 44032: 0xBFD5, 50774 - 44032: 0x9EC2, 50775 - 44032: 0x9EC3, 50776 - 44032: 0x9EC4, 50777 - 44032: 0x9EC5, 50778 - 44032: 0x9EC6, 50779 - 44032: 0x9EC7, 50780 - 44032: 0xBFD6, 50781 - 44032: 0xBFD7, 50782 - 44032: 0x9EC8, 50783 - 44032: 0x9EC9, 50784 - 44032: 0xBFD8, 50785 - 44032: 0x9ECA, 50786 - 44032: 0x9ECB, 50787 - 44032: 0x9ECC, 50788 - 44032: 0x9ECD, 50789 - 44032: 0x9ECE, 50790 - 44032: 0x9ECF, 50791 - 44032: 0x9ED0, 50792 - 44032: 0x9ED1, 50793 - 44032: 0x9ED2, 50794 - 44032: 0x9ED3, 50795 - 44032: 0x9ED4, 50796 - 44032: 0xBFD9, 50797 - 44032: 0x9ED5, 50798 - 44032: 0x9ED6, 50799 - 44032: 0xBFDA, 50800 - 44032: 0x9ED7, 50801 - 44032: 0xBFDB, 50802 - 44032: 0x9ED8, 50803 - 44032: 0x9ED9, 50804 - 44032: 0x9EDA, 50805 - 44032: 0x9EDB, 50806 - 44032: 0x9EDC, 50807 - 44032: 0x9EDD, 50808 - 44032: 0xBFDC, 50809 - 44032: 0xBFDD, 50810 - 44032: 0x9EDE, 50811 - 44032: 0x9EDF, 50812 - 44032: 0xBFDE, 50813 - 44032: 0x9EE0, 50814 - 44032: 0x9EE1, 50815 - 44032: 0x9EE2, 50816 - 44032: 0xBFDF, 50817 - 44032: 0x9EE3, 50818 - 44032: 0x9EE4, 50819 - 44032: 0x9EE5, 50820 - 44032: 0x9EE6, 50821 - 44032: 0x9EE7, 50822 - 44032: 0x9EE8, 50823 - 44032: 0x9EE9, 50824 - 44032: 0xBFE0, 50825 - 44032: 0xBFE1, 50826 - 44032: 0x9EEA, 50827 - 44032: 0xBFE2, 50828 - 44032: 0x9EEB, 50829 - 44032: 0xBFE3, 50830 - 44032: 0x9EEC, 50831 - 44032: 0x9EED, 50832 - 44032: 0x9EEE, 50833 - 44032: 0x9EEF, 50834 - 44032: 0x9EF0, 50835 - 44032: 0x9EF1, 50836 - 44032: 0xBFE4, 50837 - 44032: 0xBFE5, 50838 - 44032: 0x9EF2, 50839 - 44032: 0x9EF3, 50840 - 44032: 0xBFE6, 50841 - 44032: 0x9EF4, 50842 - 44032: 0x9EF5, 50843 - 44032: 0x9EF6, 50844 - 44032: 0xBFE7, 50845 - 44032: 0x9EF7, 50846 - 44032: 0x9EF8, 50847 - 44032: 0x9EF9, 50848 - 44032: 0x9EFA, 50849 - 44032: 0x9EFB, 50850 - 44032: 0x9EFC, 50851 - 44032: 0x9EFD, 50852 - 44032: 0xBFE8, 50853 - 44032: 0xBFE9, 50854 - 44032: 0x9EFE, 50855 - 44032: 0xBFEA, 50856 - 44032: 0x9F41, 50857 - 44032: 0xBFEB, 50858 - 44032: 0x9F42, 50859 - 44032: 0x9F43, 50860 - 44032: 0x9F44, 50861 - 44032: 0x9F45, 50862 - 44032: 0x9F46, 50863 - 44032: 0x9F47, 50864 - 44032: 0xBFEC, 50865 - 44032: 0xBFED, 50866 - 44032: 0x9F48, 50867 - 44032: 0x9F49, 50868 - 44032: 0xBFEE, 50869 - 44032: 0x9F4A, 50870 - 44032: 0x9F4B, 50871 - 44032: 0x9F4C, 50872 - 44032: 0xBFEF, 50873 - 44032: 0xBFF0, 50874 - 44032: 0xBFF1, 50875 - 44032: 0x9F4D, 50876 - 44032: 0x9F4E, 50877 - 44032: 0x9F4F, 50878 - 44032: 0x9F50, 50879 - 44032: 0x9F51, 50880 - 44032: 0xBFF2, 50881 - 44032: 0xBFF3, 50882 - 44032: 0x9F52, 50883 - 44032: 0xBFF4, 50884 - 44032: 0x9F53, 50885 - 44032: 0xBFF5, 50886 - 44032: 0x9F54, 50887 - 44032: 0x9F55, 50888 - 44032: 0x9F56, 50889 - 44032: 0x9F57, 50890 - 44032: 0x9F58, 50891 - 44032: 0x9F59, 50892 - 44032: 0xBFF6, 50893 - 44032: 0xBFF7, 50894 - 44032: 0x9F5A, 50895 - 44032: 0x9F61, 50896 - 44032: 0xBFF8, 50897 - 44032: 0x9F62, 50898 - 44032: 0x9F63, 50899 - 44032: 0x9F64, 50900 - 44032: 0xBFF9, 50901 - 44032: 0x9F65, 50902 - 44032: 0x9F66, 50903 - 44032: 0x9F67, 50904 - 44032: 0x9F68, 50905 - 44032: 0x9F69, 50906 - 44032: 0x9F6A, 50907 - 44032: 0x9F6B, 50908 - 44032: 0xBFFA, 50909 - 44032: 0xBFFB, 50910 - 44032: 0x9F6C, 50911 - 44032: 0x9F6D, 50912 - 44032: 0xBFFC, 50913 - 44032: 0xBFFD, 50914 - 44032: 0x9F6E, 50915 - 44032: 0x9F6F, 50916 - 44032: 0x9F70, 50917 - 44032: 0x9F71, 50918 - 44032: 0x9F72, 50919 - 44032: 0x9F73, 50920 - 44032: 0xBFFE, 50921 - 44032: 0xC0A1, 50922 - 44032: 0x9F74, 50923 - 44032: 0x9F75, 50924 - 44032: 0xC0A2, 50925 - 44032: 0x9F76, 50926 - 44032: 0x9F77, 50927 - 44032: 0x9F78, 50928 - 44032: 0xC0A3, 50929 - 44032: 0x9F79, 50930 - 44032: 0x9F7A, 50931 - 44032: 0x9F81, 50932 - 44032: 0x9F82, 50933 - 44032: 0x9F83, 50934 - 44032: 0x9F84, 50935 - 44032: 0x9F85, 50936 - 44032: 0xC0A4, 50937 - 44032: 0xC0A5, 50938 - 44032: 0x9F86, 50939 - 44032: 0x9F87, 50940 - 44032: 0x9F88, 50941 - 44032: 0xC0A6, 50942 - 44032: 0x9F89, 50943 - 44032: 0x9F8A, 50944 - 44032: 0x9F8B, 50945 - 44032: 0x9F8C, 50946 - 44032: 0x9F8D, 50947 - 44032: 0x9F8E, 50948 - 44032: 0xC0A7, 50949 - 44032: 0xC0A8, 50950 - 44032: 0x9F8F, 50951 - 44032: 0x9F90, 50952 - 44032: 0xC0A9, 50953 - 44032: 0x9F91, 50954 - 44032: 0x9F92, 50955 - 44032: 0x9F93, 50956 - 44032: 0xC0AA, 50957 - 44032: 0x9F94, 50958 - 44032: 0x9F95, 50959 - 44032: 0x9F96, 50960 - 44032: 0x9F97, 50961 - 44032: 0x9F98, 50962 - 44032: 0x9F99, 50963 - 44032: 0x9F9A, 50964 - 44032: 0xC0AB, 50965 - 44032: 0xC0AC, 50966 - 44032: 0x9F9B, 50967 - 44032: 0xC0AD, 50968 - 44032: 0x9F9C, 50969 - 44032: 0xC0AE, 50970 - 44032: 0x9F9D, 50971 - 44032: 0x9F9E, 50972 - 44032: 0x9F9F, 50973 - 44032: 0x9FA0, 50974 - 44032: 0x9FA1, 50975 - 44032: 0x9FA2, 50976 - 44032: 0xC0AF, 50977 - 44032: 0xC0B0, 50978 - 44032: 0x9FA3, 50979 - 44032: 0x9FA4, 50980 - 44032: 0xC0B1, 50981 - 44032: 0x9FA5, 50982 - 44032: 0x9FA6, 50983 - 44032: 0x9FA7, 50984 - 44032: 0xC0B2, 50985 - 44032: 0x9FA8, 50986 - 44032: 0x9FA9, 50987 - 44032: 0x9FAA, 50988 - 44032: 0x9FAB, 50989 - 44032: 0x9FAC, 50990 - 44032: 0x9FAD, 50991 - 44032: 0x9FAE, 50992 - 44032: 0xC0B3, 50993 - 44032: 0xC0B4, 50994 - 44032: 0x9FAF, 50995 - 44032: 0xC0B5, 50996 - 44032: 0x9FB0, 50997 - 44032: 0xC0B6, 50998 - 44032: 0x9FB1, 50999 - 44032: 0xC0B7, 51000 - 44032: 0x9FB2, 51001 - 44032: 0x9FB3, 51002 - 44032: 0x9FB4, 51003 - 44032: 0x9FB5, 51004 - 44032: 0xC0B8, 51005 - 44032: 0xC0B9, 51006 - 44032: 0x9FB6, 51007 - 44032: 0x9FB7, 51008 - 44032: 0xC0BA, 51009 - 44032: 0x9FB8, 51010 - 44032: 0x9FB9, 51011 - 44032: 0x9FBA, 51012 - 44032: 0xC0BB, 51013 - 44032: 0x9FBB, 51014 - 44032: 0x9FBC, 51015 - 44032: 0x9FBD, 51016 - 44032: 0x9FBE, 51017 - 44032: 0x9FBF, 51018 - 44032: 0xC0BC, 51019 - 44032: 0x9FC0, 51020 - 44032: 0xC0BD, 51021 - 44032: 0xC0BE, 51022 - 44032: 0x9FC1, 51023 - 44032: 0xC0BF, 51024 - 44032: 0x9FC2, 51025 - 44032: 0xC0C0, 51026 - 44032: 0xC0C1, 51027 - 44032: 0xC0C2, 51028 - 44032: 0xC0C3, 51029 - 44032: 0xC0C4, 51030 - 44032: 0xC0C5, 51031 - 44032: 0xC0C6, 51032 - 44032: 0xC0C7, 51033 - 44032: 0x9FC3, 51034 - 44032: 0x9FC4, 51035 - 44032: 0x9FC5, 51036 - 44032: 0xC0C8, 51037 - 44032: 0x9FC6, 51038 - 44032: 0x9FC7, 51039 - 44032: 0x9FC8, 51040 - 44032: 0xC0C9, 51041 - 44032: 0x9FC9, 51042 - 44032: 0x9FCA, 51043 - 44032: 0x9FCB, 51044 - 44032: 0x9FCC, 51045 - 44032: 0x9FCD, 51046 - 44032: 0x9FCE, 51047 - 44032: 0x9FCF, 51048 - 44032: 0xC0CA, 51049 - 44032: 0x9FD0, 51050 - 44032: 0x9FD1, 51051 - 44032: 0xC0CB, 51052 - 44032: 0x9FD2, 51053 - 44032: 0x9FD3, 51054 - 44032: 0x9FD4, 51055 - 44032: 0x9FD5, 51056 - 44032: 0x9FD6, 51057 - 44032: 0x9FD7, 51058 - 44032: 0x9FD8, 51059 - 44032: 0x9FD9, 51060 - 44032: 0xC0CC, 51061 - 44032: 0xC0CD, 51062 - 44032: 0x9FDA, 51063 - 44032: 0x9FDB, 51064 - 44032: 0xC0CE, 51065 - 44032: 0x9FDC, 51066 - 44032: 0x9FDD, 51067 - 44032: 0x9FDE, 51068 - 44032: 0xC0CF, 51069 - 44032: 0xC0D0, 51070 - 44032: 0xC0D1, 51071 - 44032: 0x9FDF, 51072 - 44032: 0x9FE0, 51073 - 44032: 0x9FE1, 51074 - 44032: 0x9FE2, 51075 - 44032: 0xC0D2, 51076 - 44032: 0xC0D3, 51077 - 44032: 0xC0D4, 51078 - 44032: 0x9FE3, 51079 - 44032: 0xC0D5, 51080 - 44032: 0xC0D6, 51081 - 44032: 0xC0D7, 51082 - 44032: 0xC0D8, 51083 - 44032: 0x9FE4, 51084 - 44032: 0x9FE5, 51085 - 44032: 0x9FE6, 51086 - 44032: 0xC0D9, 51087 - 44032: 0x9FE7, 51088 - 44032: 0xC0DA, 51089 - 44032: 0xC0DB, 51090 - 44032: 0x9FE8, 51091 - 44032: 0x9FE9, 51092 - 44032: 0xC0DC, 51093 - 44032: 0x9FEA, 51094 - 44032: 0xC0DD, 51095 - 44032: 0xC0DE, 51096 - 44032: 0xC0DF, 51097 - 44032: 0x9FEB, 51098 - 44032: 0xC0E0, 51099 - 44032: 0x9FEC, 51100 - 44032: 0x9FED, 51101 - 44032: 0x9FEE, 51102 - 44032: 0x9FEF, 51103 - 44032: 0x9FF0, 51104 - 44032: 0xC0E1, 51105 - 44032: 0xC0E2, 51106 - 44032: 0x9FF1, 51107 - 44032: 0xC0E3, 51108 - 44032: 0xC0E4, 51109 - 44032: 0xC0E5, 51110 - 44032: 0xC0E6, 51111 - 44032: 0x9FF2, 51112 - 44032: 0x9FF3, 51113 - 44032: 0x9FF4, 51114 - 44032: 0x9FF5, 51115 - 44032: 0x9FF6, 51116 - 44032: 0xC0E7, 51117 - 44032: 0xC0E8, 51118 - 44032: 0x9FF7, 51119 - 44032: 0x9FF8, 51120 - 44032: 0xC0E9, 51121 - 44032: 0x9FF9, 51122 - 44032: 0x9FFA, 51123 - 44032: 0x9FFB, 51124 - 44032: 0xC0EA, 51125 - 44032: 0x9FFC, 51126 - 44032: 0x9FFD, 51127 - 44032: 0x9FFE, 51128 - 44032: 0xA041, 51129 - 44032: 0xA042, 51130 - 44032: 0xA043, 51131 - 44032: 0xA044, 51132 - 44032: 0xC0EB, 51133 - 44032: 0xC0EC, 51134 - 44032: 0xA045, 51135 - 44032: 0xC0ED, 51136 - 44032: 0xC0EE, 51137 - 44032: 0xC0EF, 51138 - 44032: 0xA046, 51139 - 44032: 0xA047, 51140 - 44032: 0xA048, 51141 - 44032: 0xA049, 51142 - 44032: 0xA04A, 51143 - 44032: 0xA04B, 51144 - 44032: 0xC0F0, 51145 - 44032: 0xC0F1, 51146 - 44032: 0xA04C, 51147 - 44032: 0xA04D, 51148 - 44032: 0xC0F2, 51149 - 44032: 0xA04E, 51150 - 44032: 0xC0F3, 51151 - 44032: 0xA04F, 51152 - 44032: 0xC0F4, 51153 - 44032: 0xA050, 51154 - 44032: 0xA051, 51155 - 44032: 0xA052, 51156 - 44032: 0xA053, 51157 - 44032: 0xA054, 51158 - 44032: 0xA055, 51159 - 44032: 0xA056, 51160 - 44032: 0xC0F5, 51161 - 44032: 0xA057, 51162 - 44032: 0xA058, 51163 - 44032: 0xA059, 51164 - 44032: 0xA05A, 51165 - 44032: 0xC0F6, 51166 - 44032: 0xA061, 51167 - 44032: 0xA062, 51168 - 44032: 0xA063, 51169 - 44032: 0xA064, 51170 - 44032: 0xA065, 51171 - 44032: 0xA066, 51172 - 44032: 0xC0F7, 51173 - 44032: 0xA067, 51174 - 44032: 0xA068, 51175 - 44032: 0xA069, 51176 - 44032: 0xC0F8, 51177 - 44032: 0xA06A, 51178 - 44032: 0xA06B, 51179 - 44032: 0xA06C, 51180 - 44032: 0xC0F9, 51181 - 44032: 0xA06D, 51182 - 44032: 0xA06E, 51183 - 44032: 0xA06F, 51184 - 44032: 0xA070, 51185 - 44032: 0xA071, 51186 - 44032: 0xA072, 51187 - 44032: 0xA073, 51188 - 44032: 0xA074, 51189 - 44032: 0xA075, 51190 - 44032: 0xA076, 51191 - 44032: 0xA077, 51192 - 44032: 0xA078, 51193 - 44032: 0xA079, 51194 - 44032: 0xA07A, 51195 - 44032: 0xA081, 51196 - 44032: 0xA082, 51197 - 44032: 0xA083, 51198 - 44032: 0xA084, 51199 - 44032: 0xA085, 51200 - 44032: 0xC0FA, 51201 - 44032: 0xC0FB, 51202 - 44032: 0xA086, 51203 - 44032: 0xA087, 51204 - 44032: 0xC0FC, 51205 - 44032: 0xA088, 51206 - 44032: 0xA089, 51207 - 44032: 0xA08A, 51208 - 44032: 0xC0FD, 51209 - 44032: 0xA08B, 51210 - 44032: 0xC0FE, 51211 - 44032: 0xA08C, 51212 - 44032: 0xA08D, 51213 - 44032: 0xA08E, 51214 - 44032: 0xA08F, 51215 - 44032: 0xA090, 51216 - 44032: 0xC1A1, 51217 - 44032: 0xC1A2, 51218 - 44032: 0xA091, 51219 - 44032: 0xC1A3, 51220 - 44032: 0xA092, 51221 - 44032: 0xC1A4, 51222 - 44032: 0xC1A5, 51223 - 44032: 0xA093, 51224 - 44032: 0xA094, 51225 - 44032: 0xA095, 51226 - 44032: 0xA096, 51227 - 44032: 0xA097, 51228 - 44032: 0xC1A6, 51229 - 44032: 0xC1A7, 51230 - 44032: 0xA098, 51231 - 44032: 0xA099, 51232 - 44032: 0xC1A8, 51233 - 44032: 0xA09A, 51234 - 44032: 0xA09B, 51235 - 44032: 0xA09C, 51236 - 44032: 0xC1A9, 51237 - 44032: 0xA09D, 51238 - 44032: 0xA09E, 51239 - 44032: 0xA09F, 51240 - 44032: 0xA0A0, 51241 - 44032: 0xA0A1, 51242 - 44032: 0xA0A2, 51243 - 44032: 0xA0A3, 51244 - 44032: 0xC1AA, 51245 - 44032: 0xC1AB, 51246 - 44032: 0xA0A4, 51247 - 44032: 0xC1AC, 51248 - 44032: 0xA0A5, 51249 - 44032: 0xC1AD, 51250 - 44032: 0xA0A6, 51251 - 44032: 0xA0A7, 51252 - 44032: 0xA0A8, 51253 - 44032: 0xA0A9, 51254 - 44032: 0xA0AA, 51255 - 44032: 0xA0AB, 51256 - 44032: 0xC1AE, 51257 - 44032: 0xA0AC, 51258 - 44032: 0xA0AD, 51259 - 44032: 0xA0AE, 51260 - 44032: 0xC1AF, 51261 - 44032: 0xA0AF, 51262 - 44032: 0xA0B0, 51263 - 44032: 0xA0B1, 51264 - 44032: 0xC1B0, 51265 - 44032: 0xA0B2, 51266 - 44032: 0xA0B3, 51267 - 44032: 0xA0B4, 51268 - 44032: 0xA0B5, 51269 - 44032: 0xA0B6, 51270 - 44032: 0xA0B7, 51271 - 44032: 0xA0B8, 51272 - 44032: 0xC1B1, 51273 - 44032: 0xC1B2, 51274 - 44032: 0xA0B9, 51275 - 44032: 0xA0BA, 51276 - 44032: 0xC1B3, 51277 - 44032: 0xC1B4, 51278 - 44032: 0xA0BB, 51279 - 44032: 0xA0BC, 51280 - 44032: 0xA0BD, 51281 - 44032: 0xA0BE, 51282 - 44032: 0xA0BF, 51283 - 44032: 0xA0C0, 51284 - 44032: 0xC1B5, 51285 - 44032: 0xA0C1, 51286 - 44032: 0xA0C2, 51287 - 44032: 0xA0C3, 51288 - 44032: 0xA0C4, 51289 - 44032: 0xA0C5, 51290 - 44032: 0xA0C6, 51291 - 44032: 0xA0C7, 51292 - 44032: 0xA0C8, 51293 - 44032: 0xA0C9, 51294 - 44032: 0xA0CA, 51295 - 44032: 0xA0CB, 51296 - 44032: 0xA0CC, 51297 - 44032: 0xA0CD, 51298 - 44032: 0xA0CE, 51299 - 44032: 0xA0CF, 51300 - 44032: 0xA0D0, 51301 - 44032: 0xA0D1, 51302 - 44032: 0xA0D2, 51303 - 44032: 0xA0D3, 51304 - 44032: 0xA0D4, 51305 - 44032: 0xA0D5, 51306 - 44032: 0xA0D6, 51307 - 44032: 0xA0D7, 51308 - 44032: 0xA0D8, 51309 - 44032: 0xA0D9, 51310 - 44032: 0xA0DA, 51311 - 44032: 0xA0DB, 51312 - 44032: 0xC1B6, 51313 - 44032: 0xC1B7, 51314 - 44032: 0xA0DC, 51315 - 44032: 0xA0DD, 51316 - 44032: 0xC1B8, 51317 - 44032: 0xA0DE, 51318 - 44032: 0xA0DF, 51319 - 44032: 0xA0E0, 51320 - 44032: 0xC1B9, 51321 - 44032: 0xA0E1, 51322 - 44032: 0xC1BA, 51323 - 44032: 0xA0E2, 51324 - 44032: 0xA0E3, 51325 - 44032: 0xA0E4, 51326 - 44032: 0xA0E5, 51327 - 44032: 0xA0E6, 51328 - 44032: 0xC1BB, 51329 - 44032: 0xC1BC, 51330 - 44032: 0xA0E7, 51331 - 44032: 0xC1BD, 51332 - 44032: 0xA0E8, 51333 - 44032: 0xC1BE, 51334 - 44032: 0xC1BF, 51335 - 44032: 0xC1C0, 51336 - 44032: 0xA0E9, 51337 - 44032: 0xA0EA, 51338 - 44032: 0xA0EB, 51339 - 44032: 0xC1C1, 51340 - 44032: 0xC1C2, 51341 - 44032: 0xC1C3, 51342 - 44032: 0xA0EC, 51343 - 44032: 0xA0ED, 51344 - 44032: 0xA0EE, 51345 - 44032: 0xA0EF, 51346 - 44032: 0xA0F0, 51347 - 44032: 0xA0F1, 51348 - 44032: 0xC1C4, 51349 - 44032: 0xA0F2, 51350 - 44032: 0xA0F3, 51351 - 44032: 0xA0F4, 51352 - 44032: 0xA0F5, 51353 - 44032: 0xA0F6, 51354 - 44032: 0xA0F7, 51355 - 44032: 0xA0F8, 51356 - 44032: 0xA0F9, 51357 - 44032: 0xC1C5, 51358 - 44032: 0xA0FA, 51359 - 44032: 0xC1C6, 51360 - 44032: 0xA0FB, 51361 - 44032: 0xC1C7, 51362 - 44032: 0xA0FC, 51363 - 44032: 0xA0FD, 51364 - 44032: 0xA0FE, 51365 - 44032: 0xA141, 51366 - 44032: 0xA142, 51367 - 44032: 0xA143, 51368 - 44032: 0xC1C8, 51369 - 44032: 0xA144, 51370 - 44032: 0xA145, 51371 - 44032: 0xA146, 51372 - 44032: 0xA147, 51373 - 44032: 0xA148, 51374 - 44032: 0xA149, 51375 - 44032: 0xA14A, 51376 - 44032: 0xA14B, 51377 - 44032: 0xA14C, 51378 - 44032: 0xA14D, 51379 - 44032: 0xA14E, 51380 - 44032: 0xA14F, 51381 - 44032: 0xA150, 51382 - 44032: 0xA151, 51383 - 44032: 0xA152, 51384 - 44032: 0xA153, 51385 - 44032: 0xA154, 51386 - 44032: 0xA155, 51387 - 44032: 0xA156, 51388 - 44032: 0xC1C9, 51389 - 44032: 0xC1CA, 51390 - 44032: 0xA157, 51391 - 44032: 0xA158, 51392 - 44032: 0xA159, 51393 - 44032: 0xA15A, 51394 - 44032: 0xA161, 51395 - 44032: 0xA162, 51396 - 44032: 0xC1CB, 51397 - 44032: 0xA163, 51398 - 44032: 0xA164, 51399 - 44032: 0xA165, 51400 - 44032: 0xC1CC, 51401 - 44032: 0xA166, 51402 - 44032: 0xA167, 51403 - 44032: 0xA168, 51404 - 44032: 0xC1CD, 51405 - 44032: 0xA169, 51406 - 44032: 0xA16A, 51407 - 44032: 0xA16B, 51408 - 44032: 0xA16C, 51409 - 44032: 0xA16D, 51410 - 44032: 0xA16E, 51411 - 44032: 0xA16F, 51412 - 44032: 0xC1CE, 51413 - 44032: 0xC1CF, 51414 - 44032: 0xA170, 51415 - 44032: 0xC1D0, 51416 - 44032: 0xA171, 51417 - 44032: 0xC1D1, 51418 - 44032: 0xA172, 51419 - 44032: 0xA173, 51420 - 44032: 0xA174, 51421 - 44032: 0xA175, 51422 - 44032: 0xA176, 51423 - 44032: 0xA177, 51424 - 44032: 0xC1D2, 51425 - 44032: 0xC1D3, 51426 - 44032: 0xA178, 51427 - 44032: 0xA179, 51428 - 44032: 0xC1D4, 51429 - 44032: 0xA17A, 51430 - 44032: 0xA181, 51431 - 44032: 0xA182, 51432 - 44032: 0xA183, 51433 - 44032: 0xA184, 51434 - 44032: 0xA185, 51435 - 44032: 0xA186, 51436 - 44032: 0xA187, 51437 - 44032: 0xA188, 51438 - 44032: 0xA189, 51439 - 44032: 0xA18A, 51440 - 44032: 0xA18B, 51441 - 44032: 0xA18C, 51442 - 44032: 0xA18D, 51443 - 44032: 0xA18E, 51444 - 44032: 0xA18F, 51445 - 44032: 0xC1D5, 51446 - 44032: 0xA190, 51447 - 44032: 0xA191, 51448 - 44032: 0xA192, 51449 - 44032: 0xA193, 51450 - 44032: 0xA194, 51451 - 44032: 0xA195, 51452 - 44032: 0xC1D6, 51453 - 44032: 0xC1D7, 51454 - 44032: 0xA196, 51455 - 44032: 0xA197, 51456 - 44032: 0xC1D8, 51457 - 44032: 0xA198, 51458 - 44032: 0xA199, 51459 - 44032: 0xA19A, 51460 - 44032: 0xC1D9, 51461 - 44032: 0xC1DA, 51462 - 44032: 0xC1DB, 51463 - 44032: 0xA19B, 51464 - 44032: 0xA19C, 51465 - 44032: 0xA19D, 51466 - 44032: 0xA19E, 51467 - 44032: 0xA19F, 51468 - 44032: 0xC1DC, 51469 - 44032: 0xC1DD, 51470 - 44032: 0xA1A0, 51471 - 44032: 0xC1DE, 51472 - 44032: 0xA241, 51473 - 44032: 0xC1DF, 51474 - 44032: 0xA242, 51475 - 44032: 0xA243, 51476 - 44032: 0xA244, 51477 - 44032: 0xA245, 51478 - 44032: 0xA246, 51479 - 44032: 0xA247, 51480 - 44032: 0xC1E0, 51481 - 44032: 0xA248, 51482 - 44032: 0xA249, 51483 - 44032: 0xA24A, 51484 - 44032: 0xA24B, 51485 - 44032: 0xA24C, 51486 - 44032: 0xA24D, 51487 - 44032: 0xA24E, 51488 - 44032: 0xA24F, 51489 - 44032: 0xA250, 51490 - 44032: 0xA251, 51491 - 44032: 0xA252, 51492 - 44032: 0xA253, 51493 - 44032: 0xA254, 51494 - 44032: 0xA255, 51495 - 44032: 0xA256, 51496 - 44032: 0xA257, 51497 - 44032: 0xA258, 51498 - 44032: 0xA259, 51499 - 44032: 0xA25A, 51500 - 44032: 0xC1E1, 51501 - 44032: 0xA261, 51502 - 44032: 0xA262, 51503 - 44032: 0xA263, 51504 - 44032: 0xA264, 51505 - 44032: 0xA265, 51506 - 44032: 0xA266, 51507 - 44032: 0xA267, 51508 - 44032: 0xC1E2, 51509 - 44032: 0xA268, 51510 - 44032: 0xA269, 51511 - 44032: 0xA26A, 51512 - 44032: 0xA26B, 51513 - 44032: 0xA26C, 51514 - 44032: 0xA26D, 51515 - 44032: 0xA26E, 51516 - 44032: 0xA26F, 51517 - 44032: 0xA270, 51518 - 44032: 0xA271, 51519 - 44032: 0xA272, 51520 - 44032: 0xA273, 51521 - 44032: 0xA274, 51522 - 44032: 0xA275, 51523 - 44032: 0xA276, 51524 - 44032: 0xA277, 51525 - 44032: 0xA278, 51526 - 44032: 0xA279, 51527 - 44032: 0xA27A, 51528 - 44032: 0xA281, 51529 - 44032: 0xA282, 51530 - 44032: 0xA283, 51531 - 44032: 0xA284, 51532 - 44032: 0xA285, 51533 - 44032: 0xA286, 51534 - 44032: 0xA287, 51535 - 44032: 0xA288, 51536 - 44032: 0xC1E3, 51537 - 44032: 0xC1E4, 51538 - 44032: 0xA289, 51539 - 44032: 0xA28A, 51540 - 44032: 0xC1E5, 51541 - 44032: 0xA28B, 51542 - 44032: 0xA28C, 51543 - 44032: 0xA28D, 51544 - 44032: 0xC1E6, 51545 - 44032: 0xA28E, 51546 - 44032: 0xA28F, 51547 - 44032: 0xA290, 51548 - 44032: 0xA291, 51549 - 44032: 0xA292, 51550 - 44032: 0xA293, 51551 - 44032: 0xA294, 51552 - 44032: 0xC1E7, 51553 - 44032: 0xC1E8, 51554 - 44032: 0xA295, 51555 - 44032: 0xC1E9, 51556 - 44032: 0xA296, 51557 - 44032: 0xA297, 51558 - 44032: 0xA298, 51559 - 44032: 0xA299, 51560 - 44032: 0xA29A, 51561 - 44032: 0xA29B, 51562 - 44032: 0xA29C, 51563 - 44032: 0xA29D, 51564 - 44032: 0xC1EA, 51565 - 44032: 0xA29E, 51566 - 44032: 0xA29F, 51567 - 44032: 0xA2A0, 51568 - 44032: 0xC1EB, 51569 - 44032: 0xA341, 51570 - 44032: 0xA342, 51571 - 44032: 0xA343, 51572 - 44032: 0xC1EC, 51573 - 44032: 0xA344, 51574 - 44032: 0xA345, 51575 - 44032: 0xA346, 51576 - 44032: 0xA347, 51577 - 44032: 0xA348, 51578 - 44032: 0xA349, 51579 - 44032: 0xA34A, 51580 - 44032: 0xC1ED, 51581 - 44032: 0xA34B, 51582 - 44032: 0xA34C, 51583 - 44032: 0xA34D, 51584 - 44032: 0xA34E, 51585 - 44032: 0xA34F, 51586 - 44032: 0xA350, 51587 - 44032: 0xA351, 51588 - 44032: 0xA352, 51589 - 44032: 0xA353, 51590 - 44032: 0xA354, 51591 - 44032: 0xA355, 51592 - 44032: 0xC1EE, 51593 - 44032: 0xC1EF, 51594 - 44032: 0xA356, 51595 - 44032: 0xA357, 51596 - 44032: 0xC1F0, 51597 - 44032: 0xA358, 51598 - 44032: 0xA359, 51599 - 44032: 0xA35A, 51600 - 44032: 0xC1F1, 51601 - 44032: 0xA361, 51602 - 44032: 0xA362, 51603 - 44032: 0xA363, 51604 - 44032: 0xA364, 51605 - 44032: 0xA365, 51606 - 44032: 0xA366, 51607 - 44032: 0xA367, 51608 - 44032: 0xC1F2, 51609 - 44032: 0xC1F3, 51610 - 44032: 0xA368, 51611 - 44032: 0xC1F4, 51612 - 44032: 0xA369, 51613 - 44032: 0xC1F5, 51614 - 44032: 0xA36A, 51615 - 44032: 0xA36B, 51616 - 44032: 0xA36C, 51617 - 44032: 0xA36D, 51618 - 44032: 0xA36E, 51619 - 44032: 0xA36F, 51620 - 44032: 0xA370, 51621 - 44032: 0xA371, 51622 - 44032: 0xA372, 51623 - 44032: 0xA373, 51624 - 44032: 0xA374, 51625 - 44032: 0xA375, 51626 - 44032: 0xA376, 51627 - 44032: 0xA377, 51628 - 44032: 0xA378, 51629 - 44032: 0xA379, 51630 - 44032: 0xA37A, 51631 - 44032: 0xA381, 51632 - 44032: 0xA382, 51633 - 44032: 0xA383, 51634 - 44032: 0xA384, 51635 - 44032: 0xA385, 51636 - 44032: 0xA386, 51637 - 44032: 0xA387, 51638 - 44032: 0xA388, 51639 - 44032: 0xA389, 51640 - 44032: 0xA38A, 51641 - 44032: 0xA38B, 51642 - 44032: 0xA38C, 51643 - 44032: 0xA38D, 51644 - 44032: 0xA38E, 51645 - 44032: 0xA38F, 51646 - 44032: 0xA390, 51647 - 44032: 0xA391, 51648 - 44032: 0xC1F6, 51649 - 44032: 0xC1F7, 51650 - 44032: 0xA392, 51651 - 44032: 0xA393, 51652 - 44032: 0xC1F8, 51653 - 44032: 0xA394, 51654 - 44032: 0xA395, 51655 - 44032: 0xC1F9, 51656 - 44032: 0xC1FA, 51657 - 44032: 0xA396, 51658 - 44032: 0xC1FB, 51659 - 44032: 0xA397, 51660 - 44032: 0xA398, 51661 - 44032: 0xA399, 51662 - 44032: 0xA39A, 51663 - 44032: 0xA39B, 51664 - 44032: 0xC1FC, 51665 - 44032: 0xC1FD, 51666 - 44032: 0xA39C, 51667 - 44032: 0xC1FE, 51668 - 44032: 0xA39D, 51669 - 44032: 0xC2A1, 51670 - 44032: 0xC2A2, 51671 - 44032: 0xA39E, 51672 - 44032: 0xA39F, 51673 - 44032: 0xC2A3, 51674 - 44032: 0xC2A4, 51675 - 44032: 0xA3A0, 51676 - 44032: 0xC2A5, 51677 - 44032: 0xC2A6, 51678 - 44032: 0xA441, 51679 - 44032: 0xA442, 51680 - 44032: 0xC2A7, 51681 - 44032: 0xA443, 51682 - 44032: 0xC2A8, 51683 - 44032: 0xA444, 51684 - 44032: 0xC2A9, 51685 - 44032: 0xA445, 51686 - 44032: 0xA446, 51687 - 44032: 0xC2AA, 51688 - 44032: 0xA447, 51689 - 44032: 0xA448, 51690 - 44032: 0xA449, 51691 - 44032: 0xA44A, 51692 - 44032: 0xC2AB, 51693 - 44032: 0xC2AC, 51694 - 44032: 0xA44B, 51695 - 44032: 0xC2AD, 51696 - 44032: 0xC2AE, 51697 - 44032: 0xC2AF, 51698 - 44032: 0xA44C, 51699 - 44032: 0xA44D, 51700 - 44032: 0xA44E, 51701 - 44032: 0xA44F, 51702 - 44032: 0xA450, 51703 - 44032: 0xA451, 51704 - 44032: 0xC2B0, 51705 - 44032: 0xC2B1, 51706 - 44032: 0xA452, 51707 - 44032: 0xA453, 51708 - 44032: 0xC2B2, 51709 - 44032: 0xA454, 51710 - 44032: 0xA455, 51711 - 44032: 0xA456, 51712 - 44032: 0xC2B3, 51713 - 44032: 0xA457, 51714 - 44032: 0xA458, 51715 - 44032: 0xA459, 51716 - 44032: 0xA45A, 51717 - 44032: 0xA461, 51718 - 44032: 0xA462, 51719 - 44032: 0xA463, 51720 - 44032: 0xC2B4, 51721 - 44032: 0xC2B5, 51722 - 44032: 0xA464, 51723 - 44032: 0xC2B6, 51724 - 44032: 0xC2B7, 51725 - 44032: 0xC2B8, 51726 - 44032: 0xA465, 51727 - 44032: 0xA466, 51728 - 44032: 0xA467, 51729 - 44032: 0xA468, 51730 - 44032: 0xA469, 51731 - 44032: 0xA46A, 51732 - 44032: 0xC2B9, 51733 - 44032: 0xA46B, 51734 - 44032: 0xA46C, 51735 - 44032: 0xA46D, 51736 - 44032: 0xC2BA, 51737 - 44032: 0xA46E, 51738 - 44032: 0xA46F, 51739 - 44032: 0xA470, 51740 - 44032: 0xA471, 51741 - 44032: 0xA472, 51742 - 44032: 0xA473, 51743 - 44032: 0xA474, 51744 - 44032: 0xA475, 51745 - 44032: 0xA476, 51746 - 44032: 0xA477, 51747 - 44032: 0xA478, 51748 - 44032: 0xA479, 51749 - 44032: 0xA47A, 51750 - 44032: 0xA481, 51751 - 44032: 0xA482, 51752 - 44032: 0xA483, 51753 - 44032: 0xC2BB, 51754 - 44032: 0xA484, 51755 - 44032: 0xA485, 51756 - 44032: 0xA486, 51757 - 44032: 0xA487, 51758 - 44032: 0xA488, 51759 - 44032: 0xA489, 51760 - 44032: 0xA48A, 51761 - 44032: 0xA48B, 51762 - 44032: 0xA48C, 51763 - 44032: 0xA48D, 51764 - 44032: 0xA48E, 51765 - 44032: 0xA48F, 51766 - 44032: 0xA490, 51767 - 44032: 0xA491, 51768 - 44032: 0xA492, 51769 - 44032: 0xA493, 51770 - 44032: 0xA494, 51771 - 44032: 0xA495, 51772 - 44032: 0xA496, 51773 - 44032: 0xA497, 51774 - 44032: 0xA498, 51775 - 44032: 0xA499, 51776 - 44032: 0xA49A, 51777 - 44032: 0xA49B, 51778 - 44032: 0xA49C, 51779 - 44032: 0xA49D, 51780 - 44032: 0xA49E, 51781 - 44032: 0xA49F, 51782 - 44032: 0xA4A0, 51783 - 44032: 0xA541, 51784 - 44032: 0xA542, 51785 - 44032: 0xA543, 51786 - 44032: 0xA544, 51787 - 44032: 0xA545, 51788 - 44032: 0xC2BC, 51789 - 44032: 0xC2BD, 51790 - 44032: 0xA546, 51791 - 44032: 0xA547, 51792 - 44032: 0xC2BE, 51793 - 44032: 0xA548, 51794 - 44032: 0xA549, 51795 - 44032: 0xA54A, 51796 - 44032: 0xC2BF, 51797 - 44032: 0xA54B, 51798 - 44032: 0xA54C, 51799 - 44032: 0xA54D, 51800 - 44032: 0xA54E, 51801 - 44032: 0xA54F, 51802 - 44032: 0xA550, 51803 - 44032: 0xA551, 51804 - 44032: 0xC2C0, 51805 - 44032: 0xC2C1, 51806 - 44032: 0xA552, 51807 - 44032: 0xC2C2, 51808 - 44032: 0xC2C3, 51809 - 44032: 0xC2C4, 51810 - 44032: 0xA553, 51811 - 44032: 0xA554, 51812 - 44032: 0xA555, 51813 - 44032: 0xA556, 51814 - 44032: 0xA557, 51815 - 44032: 0xA558, 51816 - 44032: 0xC2C5, 51817 - 44032: 0xA559, 51818 - 44032: 0xA55A, 51819 - 44032: 0xA561, 51820 - 44032: 0xA562, 51821 - 44032: 0xA563, 51822 - 44032: 0xA564, 51823 - 44032: 0xA565, 51824 - 44032: 0xA566, 51825 - 44032: 0xA567, 51826 - 44032: 0xA568, 51827 - 44032: 0xA569, 51828 - 44032: 0xA56A, 51829 - 44032: 0xA56B, 51830 - 44032: 0xA56C, 51831 - 44032: 0xA56D, 51832 - 44032: 0xA56E, 51833 - 44032: 0xA56F, 51834 - 44032: 0xA570, 51835 - 44032: 0xA571, 51836 - 44032: 0xA572, 51837 - 44032: 0xC2C6, 51838 - 44032: 0xA573, 51839 - 44032: 0xA574, 51840 - 44032: 0xA575, 51841 - 44032: 0xA576, 51842 - 44032: 0xA577, 51843 - 44032: 0xA578, 51844 - 44032: 0xC2C7, 51845 - 44032: 0xA579, 51846 - 44032: 0xA57A, 51847 - 44032: 0xA581, 51848 - 44032: 0xA582, 51849 - 44032: 0xA583, 51850 - 44032: 0xA584, 51851 - 44032: 0xA585, 51852 - 44032: 0xA586, 51853 - 44032: 0xA587, 51854 - 44032: 0xA588, 51855 - 44032: 0xA589, 51856 - 44032: 0xA58A, 51857 - 44032: 0xA58B, 51858 - 44032: 0xA58C, 51859 - 44032: 0xA58D, 51860 - 44032: 0xA58E, 51861 - 44032: 0xA58F, 51862 - 44032: 0xA590, 51863 - 44032: 0xA591, 51864 - 44032: 0xC2C8, 51865 - 44032: 0xA592, 51866 - 44032: 0xA593, 51867 - 44032: 0xA594, 51868 - 44032: 0xA595, 51869 - 44032: 0xA596, 51870 - 44032: 0xA597, 51871 - 44032: 0xA598, 51872 - 44032: 0xA599, 51873 - 44032: 0xA59A, 51874 - 44032: 0xA59B, 51875 - 44032: 0xA59C, 51876 - 44032: 0xA59D, 51877 - 44032: 0xA59E, 51878 - 44032: 0xA59F, 51879 - 44032: 0xA5A0, 51880 - 44032: 0xA641, 51881 - 44032: 0xA642, 51882 - 44032: 0xA643, 51883 - 44032: 0xA644, 51884 - 44032: 0xA645, 51885 - 44032: 0xA646, 51886 - 44032: 0xA647, 51887 - 44032: 0xA648, 51888 - 44032: 0xA649, 51889 - 44032: 0xA64A, 51890 - 44032: 0xA64B, 51891 - 44032: 0xA64C, 51892 - 44032: 0xA64D, 51893 - 44032: 0xA64E, 51894 - 44032: 0xA64F, 51895 - 44032: 0xA650, 51896 - 44032: 0xA651, 51897 - 44032: 0xA652, 51898 - 44032: 0xA653, 51899 - 44032: 0xA654, 51900 - 44032: 0xC2C9, 51901 - 44032: 0xC2CA, 51902 - 44032: 0xA655, 51903 - 44032: 0xA656, 51904 - 44032: 0xC2CB, 51905 - 44032: 0xA657, 51906 - 44032: 0xA658, 51907 - 44032: 0xA659, 51908 - 44032: 0xC2CC, 51909 - 44032: 0xA65A, 51910 - 44032: 0xA661, 51911 - 44032: 0xA662, 51912 - 44032: 0xA663, 51913 - 44032: 0xA664, 51914 - 44032: 0xA665, 51915 - 44032: 0xA666, 51916 - 44032: 0xC2CD, 51917 - 44032: 0xC2CE, 51918 - 44032: 0xA667, 51919 - 44032: 0xC2CF, 51920 - 44032: 0xA668, 51921 - 44032: 0xC2D0, 51922 - 44032: 0xA669, 51923 - 44032: 0xC2D1, 51924 - 44032: 0xA66A, 51925 - 44032: 0xA66B, 51926 - 44032: 0xA66C, 51927 - 44032: 0xA66D, 51928 - 44032: 0xC2D2, 51929 - 44032: 0xC2D3, 51930 - 44032: 0xA66E, 51931 - 44032: 0xA66F, 51932 - 44032: 0xA670, 51933 - 44032: 0xA671, 51934 - 44032: 0xA672, 51935 - 44032: 0xA673, 51936 - 44032: 0xC2D4, 51937 - 44032: 0xA674, 51938 - 44032: 0xA675, 51939 - 44032: 0xA676, 51940 - 44032: 0xA677, 51941 - 44032: 0xA678, 51942 - 44032: 0xA679, 51943 - 44032: 0xA67A, 51944 - 44032: 0xA681, 51945 - 44032: 0xA682, 51946 - 44032: 0xA683, 51947 - 44032: 0xA684, 51948 - 44032: 0xC2D5, 51949 - 44032: 0xA685, 51950 - 44032: 0xA686, 51951 - 44032: 0xA687, 51952 - 44032: 0xA688, 51953 - 44032: 0xA689, 51954 - 44032: 0xA68A, 51955 - 44032: 0xA68B, 51956 - 44032: 0xC2D6, 51957 - 44032: 0xA68C, 51958 - 44032: 0xA68D, 51959 - 44032: 0xA68E, 51960 - 44032: 0xA68F, 51961 - 44032: 0xA690, 51962 - 44032: 0xA691, 51963 - 44032: 0xA692, 51964 - 44032: 0xA693, 51965 - 44032: 0xA694, 51966 - 44032: 0xA695, 51967 - 44032: 0xA696, 51968 - 44032: 0xA697, 51969 - 44032: 0xA698, 51970 - 44032: 0xA699, 51971 - 44032: 0xA69A, 51972 - 44032: 0xA69B, 51973 - 44032: 0xA69C, 51974 - 44032: 0xA69D, 51975 - 44032: 0xA69E, 51976 - 44032: 0xC2D7, 51977 - 44032: 0xA69F, 51978 - 44032: 0xA6A0, 51979 - 44032: 0xA741, 51980 - 44032: 0xA742, 51981 - 44032: 0xA743, 51982 - 44032: 0xA744, 51983 - 44032: 0xA745, 51984 - 44032: 0xC2D8, 51985 - 44032: 0xA746, 51986 - 44032: 0xA747, 51987 - 44032: 0xA748, 51988 - 44032: 0xC2D9, 51989 - 44032: 0xA749, 51990 - 44032: 0xA74A, 51991 - 44032: 0xA74B, 51992 - 44032: 0xC2DA, 51993 - 44032: 0xA74C, 51994 - 44032: 0xA74D, 51995 - 44032: 0xA74E, 51996 - 44032: 0xA74F, 51997 - 44032: 0xA750, 51998 - 44032: 0xA751, 51999 - 44032: 0xA752, 52000 - 44032: 0xC2DB, 52001 - 44032: 0xC2DC, 52002 - 44032: 0xA753, 52003 - 44032: 0xA754, 52004 - 44032: 0xA755, 52005 - 44032: 0xA756, 52006 - 44032: 0xA757, 52007 - 44032: 0xA758, 52008 - 44032: 0xA759, 52009 - 44032: 0xA75A, 52010 - 44032: 0xA761, 52011 - 44032: 0xA762, 52012 - 44032: 0xA763, 52013 - 44032: 0xA764, 52014 - 44032: 0xA765, 52015 - 44032: 0xA766, 52016 - 44032: 0xA767, 52017 - 44032: 0xA768, 52018 - 44032: 0xA769, 52019 - 44032: 0xA76A, 52020 - 44032: 0xA76B, 52021 - 44032: 0xA76C, 52022 - 44032: 0xA76D, 52023 - 44032: 0xA76E, 52024 - 44032: 0xA76F, 52025 - 44032: 0xA770, 52026 - 44032: 0xA771, 52027 - 44032: 0xA772, 52028 - 44032: 0xA773, 52029 - 44032: 0xA774, 52030 - 44032: 0xA775, 52031 - 44032: 0xA776, 52032 - 44032: 0xA777, 52033 - 44032: 0xC2DD, 52034 - 44032: 0xA778, 52035 - 44032: 0xA779, 52036 - 44032: 0xA77A, 52037 - 44032: 0xA781, 52038 - 44032: 0xA782, 52039 - 44032: 0xA783, 52040 - 44032: 0xC2DE, 52041 - 44032: 0xC2DF, 52042 - 44032: 0xA784, 52043 - 44032: 0xA785, 52044 - 44032: 0xC2E0, 52045 - 44032: 0xA786, 52046 - 44032: 0xA787, 52047 - 44032: 0xA788, 52048 - 44032: 0xC2E1, 52049 - 44032: 0xA789, 52050 - 44032: 0xA78A, 52051 - 44032: 0xA78B, 52052 - 44032: 0xA78C, 52053 - 44032: 0xA78D, 52054 - 44032: 0xA78E, 52055 - 44032: 0xA78F, 52056 - 44032: 0xC2E2, 52057 - 44032: 0xC2E3, 52058 - 44032: 0xA790, 52059 - 44032: 0xA791, 52060 - 44032: 0xA792, 52061 - 44032: 0xC2E4, 52062 - 44032: 0xA793, 52063 - 44032: 0xA794, 52064 - 44032: 0xA795, 52065 - 44032: 0xA796, 52066 - 44032: 0xA797, 52067 - 44032: 0xA798, 52068 - 44032: 0xC2E5, 52069 - 44032: 0xA799, 52070 - 44032: 0xA79A, 52071 - 44032: 0xA79B, 52072 - 44032: 0xA79C, 52073 - 44032: 0xA79D, 52074 - 44032: 0xA79E, 52075 - 44032: 0xA79F, 52076 - 44032: 0xA7A0, 52077 - 44032: 0xA841, 52078 - 44032: 0xA842, 52079 - 44032: 0xA843, 52080 - 44032: 0xA844, 52081 - 44032: 0xA845, 52082 - 44032: 0xA846, 52083 - 44032: 0xA847, 52084 - 44032: 0xA848, 52085 - 44032: 0xA849, 52086 - 44032: 0xA84A, 52087 - 44032: 0xA84B, 52088 - 44032: 0xC2E6, 52089 - 44032: 0xC2E7, 52090 - 44032: 0xA84C, 52091 - 44032: 0xA84D, 52092 - 44032: 0xA84E, 52093 - 44032: 0xA84F, 52094 - 44032: 0xA850, 52095 - 44032: 0xA851, 52096 - 44032: 0xA852, 52097 - 44032: 0xA853, 52098 - 44032: 0xA854, 52099 - 44032: 0xA855, 52100 - 44032: 0xA856, 52101 - 44032: 0xA857, 52102 - 44032: 0xA858, 52103 - 44032: 0xA859, 52104 - 44032: 0xA85A, 52105 - 44032: 0xA861, 52106 - 44032: 0xA862, 52107 - 44032: 0xA863, 52108 - 44032: 0xA864, 52109 - 44032: 0xA865, 52110 - 44032: 0xA866, 52111 - 44032: 0xA867, 52112 - 44032: 0xA868, 52113 - 44032: 0xA869, 52114 - 44032: 0xA86A, 52115 - 44032: 0xA86B, 52116 - 44032: 0xA86C, 52117 - 44032: 0xA86D, 52118 - 44032: 0xA86E, 52119 - 44032: 0xA86F, 52120 - 44032: 0xA870, 52121 - 44032: 0xA871, 52122 - 44032: 0xA872, 52123 - 44032: 0xA873, 52124 - 44032: 0xC2E8, 52125 - 44032: 0xA874, 52126 - 44032: 0xA875, 52127 - 44032: 0xA876, 52128 - 44032: 0xA877, 52129 - 44032: 0xA878, 52130 - 44032: 0xA879, 52131 - 44032: 0xA87A, 52132 - 44032: 0xA881, 52133 - 44032: 0xA882, 52134 - 44032: 0xA883, 52135 - 44032: 0xA884, 52136 - 44032: 0xA885, 52137 - 44032: 0xA886, 52138 - 44032: 0xA887, 52139 - 44032: 0xA888, 52140 - 44032: 0xA889, 52141 - 44032: 0xA88A, 52142 - 44032: 0xA88B, 52143 - 44032: 0xA88C, 52144 - 44032: 0xA88D, 52145 - 44032: 0xA88E, 52146 - 44032: 0xA88F, 52147 - 44032: 0xA890, 52148 - 44032: 0xA891, 52149 - 44032: 0xA892, 52150 - 44032: 0xA893, 52151 - 44032: 0xA894, 52152 - 44032: 0xC2E9, 52153 - 44032: 0xA895, 52154 - 44032: 0xA896, 52155 - 44032: 0xA897, 52156 - 44032: 0xA898, 52157 - 44032: 0xA899, 52158 - 44032: 0xA89A, 52159 - 44032: 0xA89B, 52160 - 44032: 0xA89C, 52161 - 44032: 0xA89D, 52162 - 44032: 0xA89E, 52163 - 44032: 0xA89F, 52164 - 44032: 0xA8A0, 52165 - 44032: 0xA941, 52166 - 44032: 0xA942, 52167 - 44032: 0xA943, 52168 - 44032: 0xA944, 52169 - 44032: 0xA945, 52170 - 44032: 0xA946, 52171 - 44032: 0xA947, 52172 - 44032: 0xA948, 52173 - 44032: 0xA949, 52174 - 44032: 0xA94A, 52175 - 44032: 0xA94B, 52176 - 44032: 0xA94C, 52177 - 44032: 0xA94D, 52178 - 44032: 0xA94E, 52179 - 44032: 0xA94F, 52180 - 44032: 0xC2EA, 52181 - 44032: 0xA950, 52182 - 44032: 0xA951, 52183 - 44032: 0xA952, 52184 - 44032: 0xA953, 52185 - 44032: 0xA954, 52186 - 44032: 0xA955, 52187 - 44032: 0xA956, 52188 - 44032: 0xA957, 52189 - 44032: 0xA958, 52190 - 44032: 0xA959, 52191 - 44032: 0xA95A, 52192 - 44032: 0xA961, 52193 - 44032: 0xA962, 52194 - 44032: 0xA963, 52195 - 44032: 0xA964, 52196 - 44032: 0xC2EB, 52197 - 44032: 0xA965, 52198 - 44032: 0xA966, 52199 - 44032: 0xC2EC, 52200 - 44032: 0xA967, 52201 - 44032: 0xC2ED, 52202 - 44032: 0xA968, 52203 - 44032: 0xA969, 52204 - 44032: 0xA96A, 52205 - 44032: 0xA96B, 52206 - 44032: 0xA96C, 52207 - 44032: 0xA96D, 52208 - 44032: 0xA96E, 52209 - 44032: 0xA96F, 52210 - 44032: 0xA970, 52211 - 44032: 0xA971, 52212 - 44032: 0xA972, 52213 - 44032: 0xA973, 52214 - 44032: 0xA974, 52215 - 44032: 0xA975, 52216 - 44032: 0xA976, 52217 - 44032: 0xA977, 52218 - 44032: 0xA978, 52219 - 44032: 0xA979, 52220 - 44032: 0xA97A, 52221 - 44032: 0xA981, 52222 - 44032: 0xA982, 52223 - 44032: 0xA983, 52224 - 44032: 0xA984, 52225 - 44032: 0xA985, 52226 - 44032: 0xA986, 52227 - 44032: 0xA987, 52228 - 44032: 0xA988, 52229 - 44032: 0xA989, 52230 - 44032: 0xA98A, 52231 - 44032: 0xA98B, 52232 - 44032: 0xA98C, 52233 - 44032: 0xA98D, 52234 - 44032: 0xA98E, 52235 - 44032: 0xA98F, 52236 - 44032: 0xC2EE, 52237 - 44032: 0xC2EF, 52238 - 44032: 0xA990, 52239 - 44032: 0xA991, 52240 - 44032: 0xC2F0, 52241 - 44032: 0xA992, 52242 - 44032: 0xA993, 52243 - 44032: 0xA994, 52244 - 44032: 0xC2F1, 52245 - 44032: 0xA995, 52246 - 44032: 0xA996, 52247 - 44032: 0xA997, 52248 - 44032: 0xA998, 52249 - 44032: 0xA999, 52250 - 44032: 0xA99A, 52251 - 44032: 0xA99B, 52252 - 44032: 0xC2F2, 52253 - 44032: 0xC2F3, 52254 - 44032: 0xA99C, 52255 - 44032: 0xA99D, 52256 - 44032: 0xA99E, 52257 - 44032: 0xC2F4, 52258 - 44032: 0xC2F5, 52259 - 44032: 0xA99F, 52260 - 44032: 0xA9A0, 52261 - 44032: 0xAA41, 52262 - 44032: 0xAA42, 52263 - 44032: 0xC2F6, 52264 - 44032: 0xC2F7, 52265 - 44032: 0xC2F8, 52266 - 44032: 0xAA43, 52267 - 44032: 0xAA44, 52268 - 44032: 0xC2F9, 52269 - 44032: 0xAA45, 52270 - 44032: 0xC2FA, 52271 - 44032: 0xAA46, 52272 - 44032: 0xC2FB, 52273 - 44032: 0xAA47, 52274 - 44032: 0xAA48, 52275 - 44032: 0xAA49, 52276 - 44032: 0xAA4A, 52277 - 44032: 0xAA4B, 52278 - 44032: 0xAA4C, 52279 - 44032: 0xAA4D, 52280 - 44032: 0xC2FC, 52281 - 44032: 0xC2FD, 52282 - 44032: 0xAA4E, 52283 - 44032: 0xC2FE, 52284 - 44032: 0xC3A1, 52285 - 44032: 0xC3A2, 52286 - 44032: 0xC3A3, 52287 - 44032: 0xAA4F, 52288 - 44032: 0xAA50, 52289 - 44032: 0xAA51, 52290 - 44032: 0xAA52, 52291 - 44032: 0xAA53, 52292 - 44032: 0xC3A4, 52293 - 44032: 0xC3A5, 52294 - 44032: 0xAA54, 52295 - 44032: 0xAA55, 52296 - 44032: 0xC3A6, 52297 - 44032: 0xAA56, 52298 - 44032: 0xAA57, 52299 - 44032: 0xAA58, 52300 - 44032: 0xC3A7, 52301 - 44032: 0xAA59, 52302 - 44032: 0xAA5A, 52303 - 44032: 0xAA61, 52304 - 44032: 0xAA62, 52305 - 44032: 0xAA63, 52306 - 44032: 0xAA64, 52307 - 44032: 0xAA65, 52308 - 44032: 0xC3A8, 52309 - 44032: 0xC3A9, 52310 - 44032: 0xAA66, 52311 - 44032: 0xC3AA, 52312 - 44032: 0xC3AB, 52313 - 44032: 0xC3AC, 52314 - 44032: 0xAA67, 52315 - 44032: 0xAA68, 52316 - 44032: 0xAA69, 52317 - 44032: 0xAA6A, 52318 - 44032: 0xAA6B, 52319 - 44032: 0xAA6C, 52320 - 44032: 0xC3AD, 52321 - 44032: 0xAA6D, 52322 - 44032: 0xAA6E, 52323 - 44032: 0xAA6F, 52324 - 44032: 0xC3AE, 52325 - 44032: 0xAA70, 52326 - 44032: 0xC3AF, 52327 - 44032: 0xAA71, 52328 - 44032: 0xC3B0, 52329 - 44032: 0xAA72, 52330 - 44032: 0xAA73, 52331 - 44032: 0xAA74, 52332 - 44032: 0xAA75, 52333 - 44032: 0xAA76, 52334 - 44032: 0xAA77, 52335 - 44032: 0xAA78, 52336 - 44032: 0xC3B1, 52337 - 44032: 0xAA79, 52338 - 44032: 0xAA7A, 52339 - 44032: 0xAA81, 52340 - 44032: 0xAA82, 52341 - 44032: 0xC3B2, 52342 - 44032: 0xAA83, 52343 - 44032: 0xAA84, 52344 - 44032: 0xAA85, 52345 - 44032: 0xAA86, 52346 - 44032: 0xAA87, 52347 - 44032: 0xAA88, 52348 - 44032: 0xAA89, 52349 - 44032: 0xAA8A, 52350 - 44032: 0xAA8B, 52351 - 44032: 0xAA8C, 52352 - 44032: 0xAA8D, 52353 - 44032: 0xAA8E, 52354 - 44032: 0xAA8F, 52355 - 44032: 0xAA90, 52356 - 44032: 0xAA91, 52357 - 44032: 0xAA92, 52358 - 44032: 0xAA93, 52359 - 44032: 0xAA94, 52360 - 44032: 0xAA95, 52361 - 44032: 0xAA96, 52362 - 44032: 0xAA97, 52363 - 44032: 0xAA98, 52364 - 44032: 0xAA99, 52365 - 44032: 0xAA9A, 52366 - 44032: 0xAA9B, 52367 - 44032: 0xAA9C, 52368 - 44032: 0xAA9D, 52369 - 44032: 0xAA9E, 52370 - 44032: 0xAA9F, 52371 - 44032: 0xAAA0, 52372 - 44032: 0xAB41, 52373 - 44032: 0xAB42, 52374 - 44032: 0xAB43, 52375 - 44032: 0xAB44, 52376 - 44032: 0xC3B3, 52377 - 44032: 0xC3B4, 52378 - 44032: 0xAB45, 52379 - 44032: 0xAB46, 52380 - 44032: 0xC3B5, 52381 - 44032: 0xAB47, 52382 - 44032: 0xAB48, 52383 - 44032: 0xAB49, 52384 - 44032: 0xC3B6, 52385 - 44032: 0xAB4A, 52386 - 44032: 0xAB4B, 52387 - 44032: 0xAB4C, 52388 - 44032: 0xAB4D, 52389 - 44032: 0xAB4E, 52390 - 44032: 0xAB4F, 52391 - 44032: 0xAB50, 52392 - 44032: 0xC3B7, 52393 - 44032: 0xC3B8, 52394 - 44032: 0xAB51, 52395 - 44032: 0xC3B9, 52396 - 44032: 0xC3BA, 52397 - 44032: 0xC3BB, 52398 - 44032: 0xAB52, 52399 - 44032: 0xAB53, 52400 - 44032: 0xAB54, 52401 - 44032: 0xAB55, 52402 - 44032: 0xAB56, 52403 - 44032: 0xAB57, 52404 - 44032: 0xC3BC, 52405 - 44032: 0xC3BD, 52406 - 44032: 0xAB58, 52407 - 44032: 0xAB59, 52408 - 44032: 0xC3BE, 52409 - 44032: 0xAB5A, 52410 - 44032: 0xAB61, 52411 - 44032: 0xAB62, 52412 - 44032: 0xC3BF, 52413 - 44032: 0xAB63, 52414 - 44032: 0xAB64, 52415 - 44032: 0xAB65, 52416 - 44032: 0xAB66, 52417 - 44032: 0xAB67, 52418 - 44032: 0xAB68, 52419 - 44032: 0xAB69, 52420 - 44032: 0xC3C0, 52421 - 44032: 0xC3C1, 52422 - 44032: 0xAB6A, 52423 - 44032: 0xC3C2, 52424 - 44032: 0xAB6B, 52425 - 44032: 0xC3C3, 52426 - 44032: 0xAB6C, 52427 - 44032: 0xAB6D, 52428 - 44032: 0xAB6E, 52429 - 44032: 0xAB6F, 52430 - 44032: 0xAB70, 52431 - 44032: 0xAB71, 52432 - 44032: 0xC3C4, 52433 - 44032: 0xAB72, 52434 - 44032: 0xAB73, 52435 - 44032: 0xAB74, 52436 - 44032: 0xC3C5, 52437 - 44032: 0xAB75, 52438 - 44032: 0xAB76, 52439 - 44032: 0xAB77, 52440 - 44032: 0xAB78, 52441 - 44032: 0xAB79, 52442 - 44032: 0xAB7A, 52443 - 44032: 0xAB81, 52444 - 44032: 0xAB82, 52445 - 44032: 0xAB83, 52446 - 44032: 0xAB84, 52447 - 44032: 0xAB85, 52448 - 44032: 0xAB86, 52449 - 44032: 0xAB87, 52450 - 44032: 0xAB88, 52451 - 44032: 0xAB89, 52452 - 44032: 0xC3C6, 52453 - 44032: 0xAB8A, 52454 - 44032: 0xAB8B, 52455 - 44032: 0xAB8C, 52456 - 44032: 0xAB8D, 52457 - 44032: 0xAB8E, 52458 - 44032: 0xAB8F, 52459 - 44032: 0xAB90, 52460 - 44032: 0xC3C7, 52461 - 44032: 0xAB91, 52462 - 44032: 0xAB92, 52463 - 44032: 0xAB93, 52464 - 44032: 0xC3C8, 52465 - 44032: 0xAB94, 52466 - 44032: 0xAB95, 52467 - 44032: 0xAB96, 52468 - 44032: 0xAB97, 52469 - 44032: 0xAB98, 52470 - 44032: 0xAB99, 52471 - 44032: 0xAB9A, 52472 - 44032: 0xAB9B, 52473 - 44032: 0xAB9C, 52474 - 44032: 0xAB9D, 52475 - 44032: 0xAB9E, 52476 - 44032: 0xAB9F, 52477 - 44032: 0xABA0, 52478 - 44032: 0xAC41, 52479 - 44032: 0xAC42, 52480 - 44032: 0xAC43, 52481 - 44032: 0xC3C9, 52482 - 44032: 0xAC44, 52483 - 44032: 0xAC45, 52484 - 44032: 0xAC46, 52485 - 44032: 0xAC47, 52486 - 44032: 0xAC48, 52487 - 44032: 0xAC49, 52488 - 44032: 0xC3CA, 52489 - 44032: 0xC3CB, 52490 - 44032: 0xAC4A, 52491 - 44032: 0xAC4B, 52492 - 44032: 0xC3CC, 52493 - 44032: 0xAC4C, 52494 - 44032: 0xAC4D, 52495 - 44032: 0xAC4E, 52496 - 44032: 0xC3CD, 52497 - 44032: 0xAC4F, 52498 - 44032: 0xAC50, 52499 - 44032: 0xAC51, 52500 - 44032: 0xAC52, 52501 - 44032: 0xAC53, 52502 - 44032: 0xAC54, 52503 - 44032: 0xAC55, 52504 - 44032: 0xC3CE, 52505 - 44032: 0xC3CF, 52506 - 44032: 0xAC56, 52507 - 44032: 0xC3D0, 52508 - 44032: 0xAC57, 52509 - 44032: 0xC3D1, 52510 - 44032: 0xAC58, 52511 - 44032: 0xAC59, 52512 - 44032: 0xAC5A, 52513 - 44032: 0xAC61, 52514 - 44032: 0xAC62, 52515 - 44032: 0xAC63, 52516 - 44032: 0xC3D2, 52517 - 44032: 0xAC64, 52518 - 44032: 0xAC65, 52519 - 44032: 0xAC66, 52520 - 44032: 0xC3D3, 52521 - 44032: 0xAC67, 52522 - 44032: 0xAC68, 52523 - 44032: 0xAC69, 52524 - 44032: 0xC3D4, 52525 - 44032: 0xAC6A, 52526 - 44032: 0xAC6B, 52527 - 44032: 0xAC6C, 52528 - 44032: 0xAC6D, 52529 - 44032: 0xAC6E, 52530 - 44032: 0xAC6F, 52531 - 44032: 0xAC70, 52532 - 44032: 0xAC71, 52533 - 44032: 0xAC72, 52534 - 44032: 0xAC73, 52535 - 44032: 0xAC74, 52536 - 44032: 0xAC75, 52537 - 44032: 0xC3D5, 52538 - 44032: 0xAC76, 52539 - 44032: 0xAC77, 52540 - 44032: 0xAC78, 52541 - 44032: 0xAC79, 52542 - 44032: 0xAC7A, 52543 - 44032: 0xAC81, 52544 - 44032: 0xAC82, 52545 - 44032: 0xAC83, 52546 - 44032: 0xAC84, 52547 - 44032: 0xAC85, 52548 - 44032: 0xAC86, 52549 - 44032: 0xAC87, 52550 - 44032: 0xAC88, 52551 - 44032: 0xAC89, 52552 - 44032: 0xAC8A, 52553 - 44032: 0xAC8B, 52554 - 44032: 0xAC8C, 52555 - 44032: 0xAC8D, 52556 - 44032: 0xAC8E, 52557 - 44032: 0xAC8F, 52558 - 44032: 0xAC90, 52559 - 44032: 0xAC91, 52560 - 44032: 0xAC92, 52561 - 44032: 0xAC93, 52562 - 44032: 0xAC94, 52563 - 44032: 0xAC95, 52564 - 44032: 0xAC96, 52565 - 44032: 0xAC97, 52566 - 44032: 0xAC98, 52567 - 44032: 0xAC99, 52568 - 44032: 0xAC9A, 52569 - 44032: 0xAC9B, 52570 - 44032: 0xAC9C, 52571 - 44032: 0xAC9D, 52572 - 44032: 0xC3D6, 52573 - 44032: 0xAC9E, 52574 - 44032: 0xAC9F, 52575 - 44032: 0xACA0, 52576 - 44032: 0xC3D7, 52577 - 44032: 0xAD41, 52578 - 44032: 0xAD42, 52579 - 44032: 0xAD43, 52580 - 44032: 0xC3D8, 52581 - 44032: 0xAD44, 52582 - 44032: 0xAD45, 52583 - 44032: 0xAD46, 52584 - 44032: 0xAD47, 52585 - 44032: 0xAD48, 52586 - 44032: 0xAD49, 52587 - 44032: 0xAD4A, 52588 - 44032: 0xC3D9, 52589 - 44032: 0xC3DA, 52590 - 44032: 0xAD4B, 52591 - 44032: 0xC3DB, 52592 - 44032: 0xAD4C, 52593 - 44032: 0xC3DC, 52594 - 44032: 0xAD4D, 52595 - 44032: 0xAD4E, 52596 - 44032: 0xAD4F, 52597 - 44032: 0xAD50, 52598 - 44032: 0xAD51, 52599 - 44032: 0xAD52, 52600 - 44032: 0xC3DD, 52601 - 44032: 0xAD53, 52602 - 44032: 0xAD54, 52603 - 44032: 0xAD55, 52604 - 44032: 0xAD56, 52605 - 44032: 0xAD57, 52606 - 44032: 0xAD58, 52607 - 44032: 0xAD59, 52608 - 44032: 0xAD5A, 52609 - 44032: 0xAD61, 52610 - 44032: 0xAD62, 52611 - 44032: 0xAD63, 52612 - 44032: 0xAD64, 52613 - 44032: 0xAD65, 52614 - 44032: 0xAD66, 52615 - 44032: 0xAD67, 52616 - 44032: 0xC3DE, 52617 - 44032: 0xAD68, 52618 - 44032: 0xAD69, 52619 - 44032: 0xAD6A, 52620 - 44032: 0xAD6B, 52621 - 44032: 0xAD6C, 52622 - 44032: 0xAD6D, 52623 - 44032: 0xAD6E, 52624 - 44032: 0xAD6F, 52625 - 44032: 0xAD70, 52626 - 44032: 0xAD71, 52627 - 44032: 0xAD72, 52628 - 44032: 0xC3DF, 52629 - 44032: 0xC3E0, 52630 - 44032: 0xAD73, 52631 - 44032: 0xAD74, 52632 - 44032: 0xC3E1, 52633 - 44032: 0xAD75, 52634 - 44032: 0xAD76, 52635 - 44032: 0xAD77, 52636 - 44032: 0xC3E2, 52637 - 44032: 0xAD78, 52638 - 44032: 0xAD79, 52639 - 44032: 0xAD7A, 52640 - 44032: 0xAD81, 52641 - 44032: 0xAD82, 52642 - 44032: 0xAD83, 52643 - 44032: 0xAD84, 52644 - 44032: 0xC3E3, 52645 - 44032: 0xC3E4, 52646 - 44032: 0xAD85, 52647 - 44032: 0xC3E5, 52648 - 44032: 0xAD86, 52649 - 44032: 0xC3E6, 52650 - 44032: 0xAD87, 52651 - 44032: 0xAD88, 52652 - 44032: 0xAD89, 52653 - 44032: 0xAD8A, 52654 - 44032: 0xAD8B, 52655 - 44032: 0xAD8C, 52656 - 44032: 0xC3E7, 52657 - 44032: 0xAD8D, 52658 - 44032: 0xAD8E, 52659 - 44032: 0xAD8F, 52660 - 44032: 0xAD90, 52661 - 44032: 0xAD91, 52662 - 44032: 0xAD92, 52663 - 44032: 0xAD93, 52664 - 44032: 0xAD94, 52665 - 44032: 0xAD95, 52666 - 44032: 0xAD96, 52667 - 44032: 0xAD97, 52668 - 44032: 0xAD98, 52669 - 44032: 0xAD99, 52670 - 44032: 0xAD9A, 52671 - 44032: 0xAD9B, 52672 - 44032: 0xAD9C, 52673 - 44032: 0xAD9D, 52674 - 44032: 0xAD9E, 52675 - 44032: 0xAD9F, 52676 - 44032: 0xC3E8, 52677 - 44032: 0xADA0, 52678 - 44032: 0xAE41, 52679 - 44032: 0xAE42, 52680 - 44032: 0xAE43, 52681 - 44032: 0xAE44, 52682 - 44032: 0xAE45, 52683 - 44032: 0xAE46, 52684 - 44032: 0xC3E9, 52685 - 44032: 0xAE47, 52686 - 44032: 0xAE48, 52687 - 44032: 0xAE49, 52688 - 44032: 0xC3EA, 52689 - 44032: 0xAE4A, 52690 - 44032: 0xAE4B, 52691 - 44032: 0xAE4C, 52692 - 44032: 0xAE4D, 52693 - 44032: 0xAE4E, 52694 - 44032: 0xAE4F, 52695 - 44032: 0xAE50, 52696 - 44032: 0xAE51, 52697 - 44032: 0xAE52, 52698 - 44032: 0xAE53, 52699 - 44032: 0xAE54, 52700 - 44032: 0xAE55, 52701 - 44032: 0xAE56, 52702 - 44032: 0xAE57, 52703 - 44032: 0xAE58, 52704 - 44032: 0xAE59, 52705 - 44032: 0xAE5A, 52706 - 44032: 0xAE61, 52707 - 44032: 0xAE62, 52708 - 44032: 0xAE63, 52709 - 44032: 0xAE64, 52710 - 44032: 0xAE65, 52711 - 44032: 0xAE66, 52712 - 44032: 0xC3EB, 52713 - 44032: 0xAE67, 52714 - 44032: 0xAE68, 52715 - 44032: 0xAE69, 52716 - 44032: 0xC3EC, 52717 - 44032: 0xAE6A, 52718 - 44032: 0xAE6B, 52719 - 44032: 0xAE6C, 52720 - 44032: 0xC3ED, 52721 - 44032: 0xAE6D, 52722 - 44032: 0xAE6E, 52723 - 44032: 0xAE6F, 52724 - 44032: 0xAE70, 52725 - 44032: 0xAE71, 52726 - 44032: 0xAE72, 52727 - 44032: 0xAE73, 52728 - 44032: 0xC3EE, 52729 - 44032: 0xC3EF, 52730 - 44032: 0xAE74, 52731 - 44032: 0xC3F0, 52732 - 44032: 0xAE75, 52733 - 44032: 0xC3F1, 52734 - 44032: 0xAE76, 52735 - 44032: 0xAE77, 52736 - 44032: 0xAE78, 52737 - 44032: 0xAE79, 52738 - 44032: 0xAE7A, 52739 - 44032: 0xAE81, 52740 - 44032: 0xC3F2, 52741 - 44032: 0xAE82, 52742 - 44032: 0xAE83, 52743 - 44032: 0xAE84, 52744 - 44032: 0xC3F3, 52745 - 44032: 0xAE85, 52746 - 44032: 0xAE86, 52747 - 44032: 0xAE87, 52748 - 44032: 0xC3F4, 52749 - 44032: 0xAE88, 52750 - 44032: 0xAE89, 52751 - 44032: 0xAE8A, 52752 - 44032: 0xAE8B, 52753 - 44032: 0xAE8C, 52754 - 44032: 0xAE8D, 52755 - 44032: 0xAE8E, 52756 - 44032: 0xC3F5, 52757 - 44032: 0xAE8F, 52758 - 44032: 0xAE90, 52759 - 44032: 0xAE91, 52760 - 44032: 0xAE92, 52761 - 44032: 0xC3F6, 52762 - 44032: 0xAE93, 52763 - 44032: 0xAE94, 52764 - 44032: 0xAE95, 52765 - 44032: 0xAE96, 52766 - 44032: 0xAE97, 52767 - 44032: 0xAE98, 52768 - 44032: 0xC3F7, 52769 - 44032: 0xC3F8, 52770 - 44032: 0xAE99, 52771 - 44032: 0xAE9A, 52772 - 44032: 0xC3F9, 52773 - 44032: 0xAE9B, 52774 - 44032: 0xAE9C, 52775 - 44032: 0xAE9D, 52776 - 44032: 0xC3FA, 52777 - 44032: 0xAE9E, 52778 - 44032: 0xAE9F, 52779 - 44032: 0xAEA0, 52780 - 44032: 0xAF41, 52781 - 44032: 0xAF42, 52782 - 44032: 0xAF43, 52783 - 44032: 0xAF44, 52784 - 44032: 0xC3FB, 52785 - 44032: 0xC3FC, 52786 - 44032: 0xAF45, 52787 - 44032: 0xC3FD, 52788 - 44032: 0xAF46, 52789 - 44032: 0xC3FE, 52790 - 44032: 0xAF47, 52791 - 44032: 0xAF48, 52792 - 44032: 0xAF49, 52793 - 44032: 0xAF4A, 52794 - 44032: 0xAF4B, 52795 - 44032: 0xAF4C, 52796 - 44032: 0xAF4D, 52797 - 44032: 0xAF4E, 52798 - 44032: 0xAF4F, 52799 - 44032: 0xAF50, 52800 - 44032: 0xAF51, 52801 - 44032: 0xAF52, 52802 - 44032: 0xAF53, 52803 - 44032: 0xAF54, 52804 - 44032: 0xAF55, 52805 - 44032: 0xAF56, 52806 - 44032: 0xAF57, 52807 - 44032: 0xAF58, 52808 - 44032: 0xAF59, 52809 - 44032: 0xAF5A, 52810 - 44032: 0xAF61, 52811 - 44032: 0xAF62, 52812 - 44032: 0xAF63, 52813 - 44032: 0xAF64, 52814 - 44032: 0xAF65, 52815 - 44032: 0xAF66, 52816 - 44032: 0xAF67, 52817 - 44032: 0xAF68, 52818 - 44032: 0xAF69, 52819 - 44032: 0xAF6A, 52820 - 44032: 0xAF6B, 52821 - 44032: 0xAF6C, 52822 - 44032: 0xAF6D, 52823 - 44032: 0xAF6E, 52824 - 44032: 0xC4A1, 52825 - 44032: 0xC4A2, 52826 - 44032: 0xAF6F, 52827 - 44032: 0xAF70, 52828 - 44032: 0xC4A3, 52829 - 44032: 0xAF71, 52830 - 44032: 0xAF72, 52831 - 44032: 0xC4A4, 52832 - 44032: 0xC4A5, 52833 - 44032: 0xC4A6, 52834 - 44032: 0xAF73, 52835 - 44032: 0xAF74, 52836 - 44032: 0xAF75, 52837 - 44032: 0xAF76, 52838 - 44032: 0xAF77, 52839 - 44032: 0xAF78, 52840 - 44032: 0xC4A7, 52841 - 44032: 0xC4A8, 52842 - 44032: 0xAF79, 52843 - 44032: 0xC4A9, 52844 - 44032: 0xAF7A, 52845 - 44032: 0xC4AA, 52846 - 44032: 0xAF81, 52847 - 44032: 0xAF82, 52848 - 44032: 0xAF83, 52849 - 44032: 0xAF84, 52850 - 44032: 0xAF85, 52851 - 44032: 0xAF86, 52852 - 44032: 0xC4AB, 52853 - 44032: 0xC4AC, 52854 - 44032: 0xAF87, 52855 - 44032: 0xAF88, 52856 - 44032: 0xC4AD, 52857 - 44032: 0xAF89, 52858 - 44032: 0xAF8A, 52859 - 44032: 0xAF8B, 52860 - 44032: 0xC4AE, 52861 - 44032: 0xAF8C, 52862 - 44032: 0xAF8D, 52863 - 44032: 0xAF8E, 52864 - 44032: 0xAF8F, 52865 - 44032: 0xAF90, 52866 - 44032: 0xAF91, 52867 - 44032: 0xAF92, 52868 - 44032: 0xC4AF, 52869 - 44032: 0xC4B0, 52870 - 44032: 0xAF93, 52871 - 44032: 0xC4B1, 52872 - 44032: 0xAF94, 52873 - 44032: 0xC4B2, 52874 - 44032: 0xAF95, 52875 - 44032: 0xAF96, 52876 - 44032: 0xAF97, 52877 - 44032: 0xAF98, 52878 - 44032: 0xAF99, 52879 - 44032: 0xAF9A, 52880 - 44032: 0xC4B3, 52881 - 44032: 0xC4B4, 52882 - 44032: 0xAF9B, 52883 - 44032: 0xAF9C, 52884 - 44032: 0xC4B5, 52885 - 44032: 0xAF9D, 52886 - 44032: 0xAF9E, 52887 - 44032: 0xAF9F, 52888 - 44032: 0xC4B6, 52889 - 44032: 0xAFA0, 52890 - 44032: 0xB041, 52891 - 44032: 0xB042, 52892 - 44032: 0xB043, 52893 - 44032: 0xB044, 52894 - 44032: 0xB045, 52895 - 44032: 0xB046, 52896 - 44032: 0xC4B7, 52897 - 44032: 0xC4B8, 52898 - 44032: 0xB047, 52899 - 44032: 0xC4B9, 52900 - 44032: 0xC4BA, 52901 - 44032: 0xC4BB, 52902 - 44032: 0xB048, 52903 - 44032: 0xB049, 52904 - 44032: 0xB04A, 52905 - 44032: 0xB04B, 52906 - 44032: 0xB04C, 52907 - 44032: 0xB04D, 52908 - 44032: 0xC4BC, 52909 - 44032: 0xC4BD, 52910 - 44032: 0xB04E, 52911 - 44032: 0xB04F, 52912 - 44032: 0xB050, 52913 - 44032: 0xB051, 52914 - 44032: 0xB052, 52915 - 44032: 0xB053, 52916 - 44032: 0xB054, 52917 - 44032: 0xB055, 52918 - 44032: 0xB056, 52919 - 44032: 0xB057, 52920 - 44032: 0xB058, 52921 - 44032: 0xB059, 52922 - 44032: 0xB05A, 52923 - 44032: 0xB061, 52924 - 44032: 0xB062, 52925 - 44032: 0xB063, 52926 - 44032: 0xB064, 52927 - 44032: 0xB065, 52928 - 44032: 0xB066, 52929 - 44032: 0xC4BE, 52930 - 44032: 0xB067, 52931 - 44032: 0xB068, 52932 - 44032: 0xB069, 52933 - 44032: 0xB06A, 52934 - 44032: 0xB06B, 52935 - 44032: 0xB06C, 52936 - 44032: 0xB06D, 52937 - 44032: 0xB06E, 52938 - 44032: 0xB06F, 52939 - 44032: 0xB070, 52940 - 44032: 0xB071, 52941 - 44032: 0xB072, 52942 - 44032: 0xB073, 52943 - 44032: 0xB074, 52944 - 44032: 0xB075, 52945 - 44032: 0xB076, 52946 - 44032: 0xB077, 52947 - 44032: 0xB078, 52948 - 44032: 0xB079, 52949 - 44032: 0xB07A, 52950 - 44032: 0xB081, 52951 - 44032: 0xB082, 52952 - 44032: 0xB083, 52953 - 44032: 0xB084, 52954 - 44032: 0xB085, 52955 - 44032: 0xB086, 52956 - 44032: 0xB087, 52957 - 44032: 0xB088, 52958 - 44032: 0xB089, 52959 - 44032: 0xB08A, 52960 - 44032: 0xB08B, 52961 - 44032: 0xB08C, 52962 - 44032: 0xB08D, 52963 - 44032: 0xB08E, 52964 - 44032: 0xC4BF, 52965 - 44032: 0xC4C0, 52966 - 44032: 0xB08F, 52967 - 44032: 0xB090, 52968 - 44032: 0xC4C1, 52969 - 44032: 0xB091, 52970 - 44032: 0xB092, 52971 - 44032: 0xC4C2, 52972 - 44032: 0xC4C3, 52973 - 44032: 0xB093, 52974 - 44032: 0xB094, 52975 - 44032: 0xB095, 52976 - 44032: 0xB096, 52977 - 44032: 0xB097, 52978 - 44032: 0xB098, 52979 - 44032: 0xB099, 52980 - 44032: 0xC4C4, 52981 - 44032: 0xC4C5, 52982 - 44032: 0xB09A, 52983 - 44032: 0xC4C6, 52984 - 44032: 0xC4C7, 52985 - 44032: 0xC4C8, 52986 - 44032: 0xB09B, 52987 - 44032: 0xB09C, 52988 - 44032: 0xB09D, 52989 - 44032: 0xB09E, 52990 - 44032: 0xB09F, 52991 - 44032: 0xB0A0, 52992 - 44032: 0xC4C9, 52993 - 44032: 0xC4CA, 52994 - 44032: 0xB141, 52995 - 44032: 0xB142, 52996 - 44032: 0xC4CB, 52997 - 44032: 0xB143, 52998 - 44032: 0xB144, 52999 - 44032: 0xB145, 53000 - 44032: 0xC4CC, 53001 - 44032: 0xB146, 53002 - 44032: 0xB147, 53003 - 44032: 0xB148, 53004 - 44032: 0xB149, 53005 - 44032: 0xB14A, 53006 - 44032: 0xB14B, 53007 - 44032: 0xB14C, 53008 - 44032: 0xC4CD, 53009 - 44032: 0xC4CE, 53010 - 44032: 0xB14D, 53011 - 44032: 0xC4CF, 53012 - 44032: 0xB14E, 53013 - 44032: 0xC4D0, 53014 - 44032: 0xB14F, 53015 - 44032: 0xB150, 53016 - 44032: 0xB151, 53017 - 44032: 0xB152, 53018 - 44032: 0xB153, 53019 - 44032: 0xB154, 53020 - 44032: 0xC4D1, 53021 - 44032: 0xB155, 53022 - 44032: 0xB156, 53023 - 44032: 0xB157, 53024 - 44032: 0xC4D2, 53025 - 44032: 0xB158, 53026 - 44032: 0xB159, 53027 - 44032: 0xB15A, 53028 - 44032: 0xC4D3, 53029 - 44032: 0xB161, 53030 - 44032: 0xB162, 53031 - 44032: 0xB163, 53032 - 44032: 0xB164, 53033 - 44032: 0xB165, 53034 - 44032: 0xB166, 53035 - 44032: 0xB167, 53036 - 44032: 0xC4D4, 53037 - 44032: 0xC4D5, 53038 - 44032: 0xB168, 53039 - 44032: 0xC4D6, 53040 - 44032: 0xC4D7, 53041 - 44032: 0xC4D8, 53042 - 44032: 0xB169, 53043 - 44032: 0xB16A, 53044 - 44032: 0xB16B, 53045 - 44032: 0xB16C, 53046 - 44032: 0xB16D, 53047 - 44032: 0xB16E, 53048 - 44032: 0xC4D9, 53049 - 44032: 0xB16F, 53050 - 44032: 0xB170, 53051 - 44032: 0xB171, 53052 - 44032: 0xB172, 53053 - 44032: 0xB173, 53054 - 44032: 0xB174, 53055 - 44032: 0xB175, 53056 - 44032: 0xB176, 53057 - 44032: 0xB177, 53058 - 44032: 0xB178, 53059 - 44032: 0xB179, 53060 - 44032: 0xB17A, 53061 - 44032: 0xB181, 53062 - 44032: 0xB182, 53063 - 44032: 0xB183, 53064 - 44032: 0xB184, 53065 - 44032: 0xB185, 53066 - 44032: 0xB186, 53067 - 44032: 0xB187, 53068 - 44032: 0xB188, 53069 - 44032: 0xB189, 53070 - 44032: 0xB18A, 53071 - 44032: 0xB18B, 53072 - 44032: 0xB18C, 53073 - 44032: 0xB18D, 53074 - 44032: 0xB18E, 53075 - 44032: 0xB18F, 53076 - 44032: 0xC4DA, 53077 - 44032: 0xC4DB, 53078 - 44032: 0xB190, 53079 - 44032: 0xB191, 53080 - 44032: 0xC4DC, 53081 - 44032: 0xB192, 53082 - 44032: 0xB193, 53083 - 44032: 0xB194, 53084 - 44032: 0xC4DD, 53085 - 44032: 0xB195, 53086 - 44032: 0xB196, 53087 - 44032: 0xB197, 53088 - 44032: 0xB198, 53089 - 44032: 0xB199, 53090 - 44032: 0xB19A, 53091 - 44032: 0xB19B, 53092 - 44032: 0xC4DE, 53093 - 44032: 0xC4DF, 53094 - 44032: 0xB19C, 53095 - 44032: 0xC4E0, 53096 - 44032: 0xB19D, 53097 - 44032: 0xC4E1, 53098 - 44032: 0xB19E, 53099 - 44032: 0xB19F, 53100 - 44032: 0xB1A0, 53101 - 44032: 0xB241, 53102 - 44032: 0xB242, 53103 - 44032: 0xB243, 53104 - 44032: 0xC4E2, 53105 - 44032: 0xC4E3, 53106 - 44032: 0xB244, 53107 - 44032: 0xB245, 53108 - 44032: 0xC4E4, 53109 - 44032: 0xB246, 53110 - 44032: 0xB247, 53111 - 44032: 0xB248, 53112 - 44032: 0xC4E5, 53113 - 44032: 0xB249, 53114 - 44032: 0xB24A, 53115 - 44032: 0xB24B, 53116 - 44032: 0xB24C, 53117 - 44032: 0xB24D, 53118 - 44032: 0xB24E, 53119 - 44032: 0xB24F, 53120 - 44032: 0xC4E6, 53121 - 44032: 0xB250, 53122 - 44032: 0xB251, 53123 - 44032: 0xB252, 53124 - 44032: 0xB253, 53125 - 44032: 0xC4E7, 53126 - 44032: 0xB254, 53127 - 44032: 0xB255, 53128 - 44032: 0xB256, 53129 - 44032: 0xB257, 53130 - 44032: 0xB258, 53131 - 44032: 0xB259, 53132 - 44032: 0xC4E8, 53133 - 44032: 0xB25A, 53134 - 44032: 0xB261, 53135 - 44032: 0xB262, 53136 - 44032: 0xB263, 53137 - 44032: 0xB264, 53138 - 44032: 0xB265, 53139 - 44032: 0xB266, 53140 - 44032: 0xB267, 53141 - 44032: 0xB268, 53142 - 44032: 0xB269, 53143 - 44032: 0xB26A, 53144 - 44032: 0xB26B, 53145 - 44032: 0xB26C, 53146 - 44032: 0xB26D, 53147 - 44032: 0xB26E, 53148 - 44032: 0xB26F, 53149 - 44032: 0xB270, 53150 - 44032: 0xB271, 53151 - 44032: 0xB272, 53152 - 44032: 0xB273, 53153 - 44032: 0xC4E9, 53154 - 44032: 0xB274, 53155 - 44032: 0xB275, 53156 - 44032: 0xB276, 53157 - 44032: 0xB277, 53158 - 44032: 0xB278, 53159 - 44032: 0xB279, 53160 - 44032: 0xC4EA, 53161 - 44032: 0xB27A, 53162 - 44032: 0xB281, 53163 - 44032: 0xB282, 53164 - 44032: 0xB283, 53165 - 44032: 0xB284, 53166 - 44032: 0xB285, 53167 - 44032: 0xB286, 53168 - 44032: 0xC4EB, 53169 - 44032: 0xB287, 53170 - 44032: 0xB288, 53171 - 44032: 0xB289, 53172 - 44032: 0xB28A, 53173 - 44032: 0xB28B, 53174 - 44032: 0xB28C, 53175 - 44032: 0xB28D, 53176 - 44032: 0xB28E, 53177 - 44032: 0xB28F, 53178 - 44032: 0xB290, 53179 - 44032: 0xB291, 53180 - 44032: 0xB292, 53181 - 44032: 0xB293, 53182 - 44032: 0xB294, 53183 - 44032: 0xB295, 53184 - 44032: 0xB296, 53185 - 44032: 0xB297, 53186 - 44032: 0xB298, 53187 - 44032: 0xB299, 53188 - 44032: 0xC4EC, 53189 - 44032: 0xB29A, 53190 - 44032: 0xB29B, 53191 - 44032: 0xB29C, 53192 - 44032: 0xB29D, 53193 - 44032: 0xB29E, 53194 - 44032: 0xB29F, 53195 - 44032: 0xB2A0, 53196 - 44032: 0xB341, 53197 - 44032: 0xB342, 53198 - 44032: 0xB343, 53199 - 44032: 0xB344, 53200 - 44032: 0xB345, 53201 - 44032: 0xB346, 53202 - 44032: 0xB347, 53203 - 44032: 0xB348, 53204 - 44032: 0xB349, 53205 - 44032: 0xB34A, 53206 - 44032: 0xB34B, 53207 - 44032: 0xB34C, 53208 - 44032: 0xB34D, 53209 - 44032: 0xB34E, 53210 - 44032: 0xB34F, 53211 - 44032: 0xB350, 53212 - 44032: 0xB351, 53213 - 44032: 0xB352, 53214 - 44032: 0xB353, 53215 - 44032: 0xB354, 53216 - 44032: 0xC4ED, 53217 - 44032: 0xC4EE, 53218 - 44032: 0xB355, 53219 - 44032: 0xB356, 53220 - 44032: 0xC4EF, 53221 - 44032: 0xB357, 53222 - 44032: 0xB358, 53223 - 44032: 0xB359, 53224 - 44032: 0xC4F0, 53225 - 44032: 0xB35A, 53226 - 44032: 0xB361, 53227 - 44032: 0xB362, 53228 - 44032: 0xB363, 53229 - 44032: 0xB364, 53230 - 44032: 0xB365, 53231 - 44032: 0xB366, 53232 - 44032: 0xC4F1, 53233 - 44032: 0xC4F2, 53234 - 44032: 0xB367, 53235 - 44032: 0xC4F3, 53236 - 44032: 0xB368, 53237 - 44032: 0xC4F4, 53238 - 44032: 0xB369, 53239 - 44032: 0xB36A, 53240 - 44032: 0xB36B, 53241 - 44032: 0xB36C, 53242 - 44032: 0xB36D, 53243 - 44032: 0xB36E, 53244 - 44032: 0xC4F5, 53245 - 44032: 0xB36F, 53246 - 44032: 0xB370, 53247 - 44032: 0xB371, 53248 - 44032: 0xC4F6, 53249 - 44032: 0xB372, 53250 - 44032: 0xB373, 53251 - 44032: 0xB374, 53252 - 44032: 0xC4F7, 53253 - 44032: 0xB375, 53254 - 44032: 0xB376, 53255 - 44032: 0xB377, 53256 - 44032: 0xB378, 53257 - 44032: 0xB379, 53258 - 44032: 0xB37A, 53259 - 44032: 0xB381, 53260 - 44032: 0xB382, 53261 - 44032: 0xB383, 53262 - 44032: 0xB384, 53263 - 44032: 0xB385, 53264 - 44032: 0xB386, 53265 - 44032: 0xC4F8, 53266 - 44032: 0xB387, 53267 - 44032: 0xB388, 53268 - 44032: 0xB389, 53269 - 44032: 0xB38A, 53270 - 44032: 0xB38B, 53271 - 44032: 0xB38C, 53272 - 44032: 0xC4F9, 53273 - 44032: 0xB38D, 53274 - 44032: 0xB38E, 53275 - 44032: 0xB38F, 53276 - 44032: 0xB390, 53277 - 44032: 0xB391, 53278 - 44032: 0xB392, 53279 - 44032: 0xB393, 53280 - 44032: 0xB394, 53281 - 44032: 0xB395, 53282 - 44032: 0xB396, 53283 - 44032: 0xB397, 53284 - 44032: 0xB398, 53285 - 44032: 0xB399, 53286 - 44032: 0xB39A, 53287 - 44032: 0xB39B, 53288 - 44032: 0xB39C, 53289 - 44032: 0xB39D, 53290 - 44032: 0xB39E, 53291 - 44032: 0xB39F, 53292 - 44032: 0xB3A0, 53293 - 44032: 0xC4FA, 53294 - 44032: 0xB441, 53295 - 44032: 0xB442, 53296 - 44032: 0xB443, 53297 - 44032: 0xB444, 53298 - 44032: 0xB445, 53299 - 44032: 0xB446, 53300 - 44032: 0xC4FB, 53301 - 44032: 0xC4FC, 53302 - 44032: 0xB447, 53303 - 44032: 0xB448, 53304 - 44032: 0xC4FD, 53305 - 44032: 0xB449, 53306 - 44032: 0xB44A, 53307 - 44032: 0xB44B, 53308 - 44032: 0xC4FE, 53309 - 44032: 0xB44C, 53310 - 44032: 0xB44D, 53311 - 44032: 0xB44E, 53312 - 44032: 0xB44F, 53313 - 44032: 0xB450, 53314 - 44032: 0xB451, 53315 - 44032: 0xB452, 53316 - 44032: 0xC5A1, 53317 - 44032: 0xC5A2, 53318 - 44032: 0xB453, 53319 - 44032: 0xC5A3, 53320 - 44032: 0xB454, 53321 - 44032: 0xC5A4, 53322 - 44032: 0xB455, 53323 - 44032: 0xB456, 53324 - 44032: 0xB457, 53325 - 44032: 0xB458, 53326 - 44032: 0xB459, 53327 - 44032: 0xB45A, 53328 - 44032: 0xC5A5, 53329 - 44032: 0xB461, 53330 - 44032: 0xB462, 53331 - 44032: 0xB463, 53332 - 44032: 0xC5A6, 53333 - 44032: 0xB464, 53334 - 44032: 0xB465, 53335 - 44032: 0xB466, 53336 - 44032: 0xC5A7, 53337 - 44032: 0xB467, 53338 - 44032: 0xB468, 53339 - 44032: 0xB469, 53340 - 44032: 0xB46A, 53341 - 44032: 0xB46B, 53342 - 44032: 0xB46C, 53343 - 44032: 0xB46D, 53344 - 44032: 0xC5A8, 53345 - 44032: 0xB46E, 53346 - 44032: 0xB46F, 53347 - 44032: 0xB470, 53348 - 44032: 0xB471, 53349 - 44032: 0xB472, 53350 - 44032: 0xB473, 53351 - 44032: 0xB474, 53352 - 44032: 0xB475, 53353 - 44032: 0xB476, 53354 - 44032: 0xB477, 53355 - 44032: 0xB478, 53356 - 44032: 0xC5A9, 53357 - 44032: 0xC5AA, 53358 - 44032: 0xB479, 53359 - 44032: 0xB47A, 53360 - 44032: 0xC5AB, 53361 - 44032: 0xB481, 53362 - 44032: 0xB482, 53363 - 44032: 0xB483, 53364 - 44032: 0xC5AC, 53365 - 44032: 0xB484, 53366 - 44032: 0xB485, 53367 - 44032: 0xB486, 53368 - 44032: 0xB487, 53369 - 44032: 0xB488, 53370 - 44032: 0xB489, 53371 - 44032: 0xB48A, 53372 - 44032: 0xC5AD, 53373 - 44032: 0xC5AE, 53374 - 44032: 0xB48B, 53375 - 44032: 0xB48C, 53376 - 44032: 0xB48D, 53377 - 44032: 0xC5AF, 53378 - 44032: 0xB48E, 53379 - 44032: 0xB48F, 53380 - 44032: 0xB490, 53381 - 44032: 0xB491, 53382 - 44032: 0xB492, 53383 - 44032: 0xB493, 53384 - 44032: 0xB494, 53385 - 44032: 0xB495, 53386 - 44032: 0xB496, 53387 - 44032: 0xB497, 53388 - 44032: 0xB498, 53389 - 44032: 0xB499, 53390 - 44032: 0xB49A, 53391 - 44032: 0xB49B, 53392 - 44032: 0xB49C, 53393 - 44032: 0xB49D, 53394 - 44032: 0xB49E, 53395 - 44032: 0xB49F, 53396 - 44032: 0xB4A0, 53397 - 44032: 0xB541, 53398 - 44032: 0xB542, 53399 - 44032: 0xB543, 53400 - 44032: 0xB544, 53401 - 44032: 0xB545, 53402 - 44032: 0xB546, 53403 - 44032: 0xB547, 53404 - 44032: 0xB548, 53405 - 44032: 0xB549, 53406 - 44032: 0xB54A, 53407 - 44032: 0xB54B, 53408 - 44032: 0xB54C, 53409 - 44032: 0xB54D, 53410 - 44032: 0xB54E, 53411 - 44032: 0xB54F, 53412 - 44032: 0xC5B0, 53413 - 44032: 0xC5B1, 53414 - 44032: 0xB550, 53415 - 44032: 0xB551, 53416 - 44032: 0xC5B2, 53417 - 44032: 0xB552, 53418 - 44032: 0xB553, 53419 - 44032: 0xB554, 53420 - 44032: 0xC5B3, 53421 - 44032: 0xB555, 53422 - 44032: 0xB556, 53423 - 44032: 0xB557, 53424 - 44032: 0xB558, 53425 - 44032: 0xB559, 53426 - 44032: 0xB55A, 53427 - 44032: 0xB561, 53428 - 44032: 0xC5B4, 53429 - 44032: 0xC5B5, 53430 - 44032: 0xB562, 53431 - 44032: 0xC5B6, 53432 - 44032: 0xB563, 53433 - 44032: 0xC5B7, 53434 - 44032: 0xB564, 53435 - 44032: 0xB565, 53436 - 44032: 0xB566, 53437 - 44032: 0xB567, 53438 - 44032: 0xB568, 53439 - 44032: 0xB569, 53440 - 44032: 0xC5B8, 53441 - 44032: 0xC5B9, 53442 - 44032: 0xB56A, 53443 - 44032: 0xB56B, 53444 - 44032: 0xC5BA, 53445 - 44032: 0xB56C, 53446 - 44032: 0xB56D, 53447 - 44032: 0xB56E, 53448 - 44032: 0xC5BB, 53449 - 44032: 0xC5BC, 53450 - 44032: 0xB56F, 53451 - 44032: 0xB570, 53452 - 44032: 0xB571, 53453 - 44032: 0xB572, 53454 - 44032: 0xB573, 53455 - 44032: 0xB574, 53456 - 44032: 0xC5BD, 53457 - 44032: 0xC5BE, 53458 - 44032: 0xB575, 53459 - 44032: 0xC5BF, 53460 - 44032: 0xC5C0, 53461 - 44032: 0xC5C1, 53462 - 44032: 0xB576, 53463 - 44032: 0xB577, 53464 - 44032: 0xB578, 53465 - 44032: 0xB579, 53466 - 44032: 0xB57A, 53467 - 44032: 0xB581, 53468 - 44032: 0xC5C2, 53469 - 44032: 0xC5C3, 53470 - 44032: 0xB582, 53471 - 44032: 0xB583, 53472 - 44032: 0xC5C4, 53473 - 44032: 0xB584, 53474 - 44032: 0xB585, 53475 - 44032: 0xB586, 53476 - 44032: 0xC5C5, 53477 - 44032: 0xB587, 53478 - 44032: 0xB588, 53479 - 44032: 0xB589, 53480 - 44032: 0xB58A, 53481 - 44032: 0xB58B, 53482 - 44032: 0xB58C, 53483 - 44032: 0xB58D, 53484 - 44032: 0xC5C6, 53485 - 44032: 0xC5C7, 53486 - 44032: 0xB58E, 53487 - 44032: 0xC5C8, 53488 - 44032: 0xC5C9, 53489 - 44032: 0xC5CA, 53490 - 44032: 0xB58F, 53491 - 44032: 0xB590, 53492 - 44032: 0xB591, 53493 - 44032: 0xB592, 53494 - 44032: 0xB593, 53495 - 44032: 0xB594, 53496 - 44032: 0xC5CB, 53497 - 44032: 0xB595, 53498 - 44032: 0xB596, 53499 - 44032: 0xB597, 53500 - 44032: 0xB598, 53501 - 44032: 0xB599, 53502 - 44032: 0xB59A, 53503 - 44032: 0xB59B, 53504 - 44032: 0xB59C, 53505 - 44032: 0xB59D, 53506 - 44032: 0xB59E, 53507 - 44032: 0xB59F, 53508 - 44032: 0xB5A0, 53509 - 44032: 0xB641, 53510 - 44032: 0xB642, 53511 - 44032: 0xB643, 53512 - 44032: 0xB644, 53513 - 44032: 0xB645, 53514 - 44032: 0xB646, 53515 - 44032: 0xB647, 53516 - 44032: 0xB648, 53517 - 44032: 0xC5CC, 53518 - 44032: 0xB649, 53519 - 44032: 0xB64A, 53520 - 44032: 0xB64B, 53521 - 44032: 0xB64C, 53522 - 44032: 0xB64D, 53523 - 44032: 0xB64E, 53524 - 44032: 0xB64F, 53525 - 44032: 0xB650, 53526 - 44032: 0xB651, 53527 - 44032: 0xB652, 53528 - 44032: 0xB653, 53529 - 44032: 0xB654, 53530 - 44032: 0xB655, 53531 - 44032: 0xB656, 53532 - 44032: 0xB657, 53533 - 44032: 0xB658, 53534 - 44032: 0xB659, 53535 - 44032: 0xB65A, 53536 - 44032: 0xB661, 53537 - 44032: 0xB662, 53538 - 44032: 0xB663, 53539 - 44032: 0xB664, 53540 - 44032: 0xB665, 53541 - 44032: 0xB666, 53542 - 44032: 0xB667, 53543 - 44032: 0xB668, 53544 - 44032: 0xB669, 53545 - 44032: 0xB66A, 53546 - 44032: 0xB66B, 53547 - 44032: 0xB66C, 53548 - 44032: 0xB66D, 53549 - 44032: 0xB66E, 53550 - 44032: 0xB66F, 53551 - 44032: 0xB670, 53552 - 44032: 0xC5CD, 53553 - 44032: 0xC5CE, 53554 - 44032: 0xB671, 53555 - 44032: 0xB672, 53556 - 44032: 0xC5CF, 53557 - 44032: 0xB673, 53558 - 44032: 0xB674, 53559 - 44032: 0xB675, 53560 - 44032: 0xC5D0, 53561 - 44032: 0xB676, 53562 - 44032: 0xC5D1, 53563 - 44032: 0xB677, 53564 - 44032: 0xB678, 53565 - 44032: 0xB679, 53566 - 44032: 0xB67A, 53567 - 44032: 0xB681, 53568 - 44032: 0xC5D2, 53569 - 44032: 0xC5D3, 53570 - 44032: 0xB682, 53571 - 44032: 0xC5D4, 53572 - 44032: 0xC5D5, 53573 - 44032: 0xC5D6, 53574 - 44032: 0xB683, 53575 - 44032: 0xB684, 53576 - 44032: 0xB685, 53577 - 44032: 0xB686, 53578 - 44032: 0xB687, 53579 - 44032: 0xB688, 53580 - 44032: 0xC5D7, 53581 - 44032: 0xC5D8, 53582 - 44032: 0xB689, 53583 - 44032: 0xB68A, 53584 - 44032: 0xC5D9, 53585 - 44032: 0xB68B, 53586 - 44032: 0xB68C, 53587 - 44032: 0xB68D, 53588 - 44032: 0xC5DA, 53589 - 44032: 0xB68E, 53590 - 44032: 0xB68F, 53591 - 44032: 0xB690, 53592 - 44032: 0xB691, 53593 - 44032: 0xB692, 53594 - 44032: 0xB693, 53595 - 44032: 0xB694, 53596 - 44032: 0xC5DB, 53597 - 44032: 0xC5DC, 53598 - 44032: 0xB695, 53599 - 44032: 0xC5DD, 53600 - 44032: 0xB696, 53601 - 44032: 0xC5DE, 53602 - 44032: 0xB697, 53603 - 44032: 0xB698, 53604 - 44032: 0xB699, 53605 - 44032: 0xB69A, 53606 - 44032: 0xB69B, 53607 - 44032: 0xB69C, 53608 - 44032: 0xC5DF, 53609 - 44032: 0xB69D, 53610 - 44032: 0xB69E, 53611 - 44032: 0xB69F, 53612 - 44032: 0xC5E0, 53613 - 44032: 0xB6A0, 53614 - 44032: 0xB741, 53615 - 44032: 0xB742, 53616 - 44032: 0xB743, 53617 - 44032: 0xB744, 53618 - 44032: 0xB745, 53619 - 44032: 0xB746, 53620 - 44032: 0xB747, 53621 - 44032: 0xB748, 53622 - 44032: 0xB749, 53623 - 44032: 0xB74A, 53624 - 44032: 0xB74B, 53625 - 44032: 0xB74C, 53626 - 44032: 0xB74D, 53627 - 44032: 0xB74E, 53628 - 44032: 0xC5E1, 53629 - 44032: 0xB74F, 53630 - 44032: 0xB750, 53631 - 44032: 0xB751, 53632 - 44032: 0xB752, 53633 - 44032: 0xB753, 53634 - 44032: 0xB754, 53635 - 44032: 0xB755, 53636 - 44032: 0xC5E2, 53637 - 44032: 0xB756, 53638 - 44032: 0xB757, 53639 - 44032: 0xB758, 53640 - 44032: 0xC5E3, 53641 - 44032: 0xB759, 53642 - 44032: 0xB75A, 53643 - 44032: 0xB761, 53644 - 44032: 0xB762, 53645 - 44032: 0xB763, 53646 - 44032: 0xB764, 53647 - 44032: 0xB765, 53648 - 44032: 0xB766, 53649 - 44032: 0xB767, 53650 - 44032: 0xB768, 53651 - 44032: 0xB769, 53652 - 44032: 0xB76A, 53653 - 44032: 0xB76B, 53654 - 44032: 0xB76C, 53655 - 44032: 0xB76D, 53656 - 44032: 0xB76E, 53657 - 44032: 0xB76F, 53658 - 44032: 0xB770, 53659 - 44032: 0xB771, 53660 - 44032: 0xB772, 53661 - 44032: 0xB773, 53662 - 44032: 0xB774, 53663 - 44032: 0xB775, 53664 - 44032: 0xC5E4, 53665 - 44032: 0xC5E5, 53666 - 44032: 0xB776, 53667 - 44032: 0xB777, 53668 - 44032: 0xC5E6, 53669 - 44032: 0xB778, 53670 - 44032: 0xB779, 53671 - 44032: 0xB77A, 53672 - 44032: 0xC5E7, 53673 - 44032: 0xB781, 53674 - 44032: 0xB782, 53675 - 44032: 0xB783, 53676 - 44032: 0xB784, 53677 - 44032: 0xB785, 53678 - 44032: 0xB786, 53679 - 44032: 0xB787, 53680 - 44032: 0xC5E8, 53681 - 44032: 0xC5E9, 53682 - 44032: 0xB788, 53683 - 44032: 0xC5EA, 53684 - 44032: 0xB789, 53685 - 44032: 0xC5EB, 53686 - 44032: 0xB78A, 53687 - 44032: 0xB78B, 53688 - 44032: 0xB78C, 53689 - 44032: 0xB78D, 53690 - 44032: 0xC5EC, 53691 - 44032: 0xB78E, 53692 - 44032: 0xC5ED, 53693 - 44032: 0xB78F, 53694 - 44032: 0xB790, 53695 - 44032: 0xB791, 53696 - 44032: 0xC5EE, 53697 - 44032: 0xB792, 53698 - 44032: 0xB793, 53699 - 44032: 0xB794, 53700 - 44032: 0xB795, 53701 - 44032: 0xB796, 53702 - 44032: 0xB797, 53703 - 44032: 0xB798, 53704 - 44032: 0xB799, 53705 - 44032: 0xB79A, 53706 - 44032: 0xB79B, 53707 - 44032: 0xB79C, 53708 - 44032: 0xB79D, 53709 - 44032: 0xB79E, 53710 - 44032: 0xB79F, 53711 - 44032: 0xB7A0, 53712 - 44032: 0xB841, 53713 - 44032: 0xB842, 53714 - 44032: 0xB843, 53715 - 44032: 0xB844, 53716 - 44032: 0xB845, 53717 - 44032: 0xB846, 53718 - 44032: 0xB847, 53719 - 44032: 0xB848, 53720 - 44032: 0xC5EF, 53721 - 44032: 0xB849, 53722 - 44032: 0xB84A, 53723 - 44032: 0xB84B, 53724 - 44032: 0xB84C, 53725 - 44032: 0xB84D, 53726 - 44032: 0xB84E, 53727 - 44032: 0xB84F, 53728 - 44032: 0xB850, 53729 - 44032: 0xB851, 53730 - 44032: 0xB852, 53731 - 44032: 0xB853, 53732 - 44032: 0xB854, 53733 - 44032: 0xB855, 53734 - 44032: 0xB856, 53735 - 44032: 0xB857, 53736 - 44032: 0xB858, 53737 - 44032: 0xB859, 53738 - 44032: 0xB85A, 53739 - 44032: 0xB861, 53740 - 44032: 0xB862, 53741 - 44032: 0xB863, 53742 - 44032: 0xB864, 53743 - 44032: 0xB865, 53744 - 44032: 0xB866, 53745 - 44032: 0xB867, 53746 - 44032: 0xB868, 53747 - 44032: 0xB869, 53748 - 44032: 0xC5F0, 53749 - 44032: 0xB86A, 53750 - 44032: 0xB86B, 53751 - 44032: 0xB86C, 53752 - 44032: 0xC5F1, 53753 - 44032: 0xB86D, 53754 - 44032: 0xB86E, 53755 - 44032: 0xB86F, 53756 - 44032: 0xB870, 53757 - 44032: 0xB871, 53758 - 44032: 0xB872, 53759 - 44032: 0xB873, 53760 - 44032: 0xB874, 53761 - 44032: 0xB875, 53762 - 44032: 0xB876, 53763 - 44032: 0xB877, 53764 - 44032: 0xB878, 53765 - 44032: 0xB879, 53766 - 44032: 0xB87A, 53767 - 44032: 0xC5F2, 53768 - 44032: 0xB881, 53769 - 44032: 0xC5F3, 53770 - 44032: 0xB882, 53771 - 44032: 0xB883, 53772 - 44032: 0xB884, 53773 - 44032: 0xB885, 53774 - 44032: 0xB886, 53775 - 44032: 0xB887, 53776 - 44032: 0xC5F4, 53777 - 44032: 0xB888, 53778 - 44032: 0xB889, 53779 - 44032: 0xB88A, 53780 - 44032: 0xB88B, 53781 - 44032: 0xB88C, 53782 - 44032: 0xB88D, 53783 - 44032: 0xB88E, 53784 - 44032: 0xB88F, 53785 - 44032: 0xB890, 53786 - 44032: 0xB891, 53787 - 44032: 0xB892, 53788 - 44032: 0xB893, 53789 - 44032: 0xB894, 53790 - 44032: 0xB895, 53791 - 44032: 0xB896, 53792 - 44032: 0xB897, 53793 - 44032: 0xB898, 53794 - 44032: 0xB899, 53795 - 44032: 0xB89A, 53796 - 44032: 0xB89B, 53797 - 44032: 0xB89C, 53798 - 44032: 0xB89D, 53799 - 44032: 0xB89E, 53800 - 44032: 0xB89F, 53801 - 44032: 0xB8A0, 53802 - 44032: 0xB941, 53803 - 44032: 0xB942, 53804 - 44032: 0xC5F5, 53805 - 44032: 0xC5F6, 53806 - 44032: 0xB943, 53807 - 44032: 0xB944, 53808 - 44032: 0xC5F7, 53809 - 44032: 0xB945, 53810 - 44032: 0xB946, 53811 - 44032: 0xB947, 53812 - 44032: 0xC5F8, 53813 - 44032: 0xB948, 53814 - 44032: 0xB949, 53815 - 44032: 0xB94A, 53816 - 44032: 0xB94B, 53817 - 44032: 0xB94C, 53818 - 44032: 0xB94D, 53819 - 44032: 0xB94E, 53820 - 44032: 0xC5F9, 53821 - 44032: 0xC5FA, 53822 - 44032: 0xB94F, 53823 - 44032: 0xC5FB, 53824 - 44032: 0xB950, 53825 - 44032: 0xC5FC, 53826 - 44032: 0xB951, 53827 - 44032: 0xB952, 53828 - 44032: 0xB953, 53829 - 44032: 0xB954, 53830 - 44032: 0xB955, 53831 - 44032: 0xB956, 53832 - 44032: 0xC5FD, 53833 - 44032: 0xB957, 53834 - 44032: 0xB958, 53835 - 44032: 0xB959, 53836 - 44032: 0xB95A, 53837 - 44032: 0xB961, 53838 - 44032: 0xB962, 53839 - 44032: 0xB963, 53840 - 44032: 0xB964, 53841 - 44032: 0xB965, 53842 - 44032: 0xB966, 53843 - 44032: 0xB967, 53844 - 44032: 0xB968, 53845 - 44032: 0xB969, 53846 - 44032: 0xB96A, 53847 - 44032: 0xB96B, 53848 - 44032: 0xB96C, 53849 - 44032: 0xB96D, 53850 - 44032: 0xB96E, 53851 - 44032: 0xB96F, 53852 - 44032: 0xC5FE, 53853 - 44032: 0xB970, 53854 - 44032: 0xB971, 53855 - 44032: 0xB972, 53856 - 44032: 0xB973, 53857 - 44032: 0xB974, 53858 - 44032: 0xB975, 53859 - 44032: 0xB976, 53860 - 44032: 0xC6A1, 53861 - 44032: 0xB977, 53862 - 44032: 0xB978, 53863 - 44032: 0xB979, 53864 - 44032: 0xB97A, 53865 - 44032: 0xB981, 53866 - 44032: 0xB982, 53867 - 44032: 0xB983, 53868 - 44032: 0xB984, 53869 - 44032: 0xB985, 53870 - 44032: 0xB986, 53871 - 44032: 0xB987, 53872 - 44032: 0xB988, 53873 - 44032: 0xB989, 53874 - 44032: 0xB98A, 53875 - 44032: 0xB98B, 53876 - 44032: 0xB98C, 53877 - 44032: 0xB98D, 53878 - 44032: 0xB98E, 53879 - 44032: 0xB98F, 53880 - 44032: 0xB990, 53881 - 44032: 0xB991, 53882 - 44032: 0xB992, 53883 - 44032: 0xB993, 53884 - 44032: 0xB994, 53885 - 44032: 0xB995, 53886 - 44032: 0xB996, 53887 - 44032: 0xB997, 53888 - 44032: 0xC6A2, 53889 - 44032: 0xC6A3, 53890 - 44032: 0xB998, 53891 - 44032: 0xB999, 53892 - 44032: 0xC6A4, 53893 - 44032: 0xB99A, 53894 - 44032: 0xB99B, 53895 - 44032: 0xB99C, 53896 - 44032: 0xC6A5, 53897 - 44032: 0xB99D, 53898 - 44032: 0xB99E, 53899 - 44032: 0xB99F, 53900 - 44032: 0xB9A0, 53901 - 44032: 0xBA41, 53902 - 44032: 0xBA42, 53903 - 44032: 0xBA43, 53904 - 44032: 0xC6A6, 53905 - 44032: 0xC6A7, 53906 - 44032: 0xBA44, 53907 - 44032: 0xBA45, 53908 - 44032: 0xBA46, 53909 - 44032: 0xC6A8, 53910 - 44032: 0xBA47, 53911 - 44032: 0xBA48, 53912 - 44032: 0xBA49, 53913 - 44032: 0xBA4A, 53914 - 44032: 0xBA4B, 53915 - 44032: 0xBA4C, 53916 - 44032: 0xC6A9, 53917 - 44032: 0xBA4D, 53918 - 44032: 0xBA4E, 53919 - 44032: 0xBA4F, 53920 - 44032: 0xC6AA, 53921 - 44032: 0xBA50, 53922 - 44032: 0xBA51, 53923 - 44032: 0xBA52, 53924 - 44032: 0xC6AB, 53925 - 44032: 0xBA53, 53926 - 44032: 0xBA54, 53927 - 44032: 0xBA55, 53928 - 44032: 0xBA56, 53929 - 44032: 0xBA57, 53930 - 44032: 0xBA58, 53931 - 44032: 0xBA59, 53932 - 44032: 0xC6AC, 53933 - 44032: 0xBA5A, 53934 - 44032: 0xBA61, 53935 - 44032: 0xBA62, 53936 - 44032: 0xBA63, 53937 - 44032: 0xC6AD, 53938 - 44032: 0xBA64, 53939 - 44032: 0xBA65, 53940 - 44032: 0xBA66, 53941 - 44032: 0xBA67, 53942 - 44032: 0xBA68, 53943 - 44032: 0xBA69, 53944 - 44032: 0xC6AE, 53945 - 44032: 0xC6AF, 53946 - 44032: 0xBA6A, 53947 - 44032: 0xBA6B, 53948 - 44032: 0xC6B0, 53949 - 44032: 0xBA6C, 53950 - 44032: 0xBA6D, 53951 - 44032: 0xC6B1, 53952 - 44032: 0xC6B2, 53953 - 44032: 0xBA6E, 53954 - 44032: 0xC6B3, 53955 - 44032: 0xBA6F, 53956 - 44032: 0xBA70, 53957 - 44032: 0xBA71, 53958 - 44032: 0xBA72, 53959 - 44032: 0xBA73, 53960 - 44032: 0xC6B4, 53961 - 44032: 0xC6B5, 53962 - 44032: 0xBA74, 53963 - 44032: 0xC6B6, 53964 - 44032: 0xBA75, 53965 - 44032: 0xBA76, 53966 - 44032: 0xBA77, 53967 - 44032: 0xBA78, 53968 - 44032: 0xBA79, 53969 - 44032: 0xBA7A, 53970 - 44032: 0xBA81, 53971 - 44032: 0xBA82, 53972 - 44032: 0xC6B7, 53973 - 44032: 0xBA83, 53974 - 44032: 0xBA84, 53975 - 44032: 0xBA85, 53976 - 44032: 0xC6B8, 53977 - 44032: 0xBA86, 53978 - 44032: 0xBA87, 53979 - 44032: 0xBA88, 53980 - 44032: 0xC6B9, 53981 - 44032: 0xBA89, 53982 - 44032: 0xBA8A, 53983 - 44032: 0xBA8B, 53984 - 44032: 0xBA8C, 53985 - 44032: 0xBA8D, 53986 - 44032: 0xBA8E, 53987 - 44032: 0xBA8F, 53988 - 44032: 0xC6BA, 53989 - 44032: 0xC6BB, 53990 - 44032: 0xBA90, 53991 - 44032: 0xBA91, 53992 - 44032: 0xBA92, 53993 - 44032: 0xBA93, 53994 - 44032: 0xBA94, 53995 - 44032: 0xBA95, 53996 - 44032: 0xBA96, 53997 - 44032: 0xBA97, 53998 - 44032: 0xBA98, 53999 - 44032: 0xBA99, 54000 - 44032: 0xC6BC, 54001 - 44032: 0xC6BD, 54002 - 44032: 0xBA9A, 54003 - 44032: 0xBA9B, 54004 - 44032: 0xC6BE, 54005 - 44032: 0xBA9C, 54006 - 44032: 0xBA9D, 54007 - 44032: 0xBA9E, 54008 - 44032: 0xC6BF, 54009 - 44032: 0xBA9F, 54010 - 44032: 0xBAA0, 54011 - 44032: 0xBB41, 54012 - 44032: 0xBB42, 54013 - 44032: 0xBB43, 54014 - 44032: 0xBB44, 54015 - 44032: 0xBB45, 54016 - 44032: 0xC6C0, 54017 - 44032: 0xC6C1, 54018 - 44032: 0xBB46, 54019 - 44032: 0xC6C2, 54020 - 44032: 0xBB47, 54021 - 44032: 0xC6C3, 54022 - 44032: 0xBB48, 54023 - 44032: 0xBB49, 54024 - 44032: 0xBB4A, 54025 - 44032: 0xBB4B, 54026 - 44032: 0xBB4C, 54027 - 44032: 0xBB4D, 54028 - 44032: 0xC6C4, 54029 - 44032: 0xC6C5, 54030 - 44032: 0xC6C6, 54031 - 44032: 0xBB4E, 54032 - 44032: 0xC6C7, 54033 - 44032: 0xBB4F, 54034 - 44032: 0xBB50, 54035 - 44032: 0xBB51, 54036 - 44032: 0xC6C8, 54037 - 44032: 0xBB52, 54038 - 44032: 0xC6C9, 54039 - 44032: 0xBB53, 54040 - 44032: 0xBB54, 54041 - 44032: 0xBB55, 54042 - 44032: 0xBB56, 54043 - 44032: 0xBB57, 54044 - 44032: 0xC6CA, 54045 - 44032: 0xC6CB, 54046 - 44032: 0xBB58, 54047 - 44032: 0xC6CC, 54048 - 44032: 0xC6CD, 54049 - 44032: 0xC6CE, 54050 - 44032: 0xBB59, 54051 - 44032: 0xBB5A, 54052 - 44032: 0xBB61, 54053 - 44032: 0xC6CF, 54054 - 44032: 0xBB62, 54055 - 44032: 0xBB63, 54056 - 44032: 0xC6D0, 54057 - 44032: 0xC6D1, 54058 - 44032: 0xBB64, 54059 - 44032: 0xBB65, 54060 - 44032: 0xC6D2, 54061 - 44032: 0xBB66, 54062 - 44032: 0xBB67, 54063 - 44032: 0xBB68, 54064 - 44032: 0xC6D3, 54065 - 44032: 0xBB69, 54066 - 44032: 0xBB6A, 54067 - 44032: 0xBB6B, 54068 - 44032: 0xBB6C, 54069 - 44032: 0xBB6D, 54070 - 44032: 0xBB6E, 54071 - 44032: 0xBB6F, 54072 - 44032: 0xC6D4, 54073 - 44032: 0xC6D5, 54074 - 44032: 0xBB70, 54075 - 44032: 0xC6D6, 54076 - 44032: 0xC6D7, 54077 - 44032: 0xC6D8, 54078 - 44032: 0xBB71, 54079 - 44032: 0xBB72, 54080 - 44032: 0xBB73, 54081 - 44032: 0xBB74, 54082 - 44032: 0xBB75, 54083 - 44032: 0xBB76, 54084 - 44032: 0xC6D9, 54085 - 44032: 0xC6DA, 54086 - 44032: 0xBB77, 54087 - 44032: 0xBB78, 54088 - 44032: 0xBB79, 54089 - 44032: 0xBB7A, 54090 - 44032: 0xBB81, 54091 - 44032: 0xBB82, 54092 - 44032: 0xBB83, 54093 - 44032: 0xBB84, 54094 - 44032: 0xBB85, 54095 - 44032: 0xBB86, 54096 - 44032: 0xBB87, 54097 - 44032: 0xBB88, 54098 - 44032: 0xBB89, 54099 - 44032: 0xBB8A, 54100 - 44032: 0xBB8B, 54101 - 44032: 0xBB8C, 54102 - 44032: 0xBB8D, 54103 - 44032: 0xBB8E, 54104 - 44032: 0xBB8F, 54105 - 44032: 0xBB90, 54106 - 44032: 0xBB91, 54107 - 44032: 0xBB92, 54108 - 44032: 0xBB93, 54109 - 44032: 0xBB94, 54110 - 44032: 0xBB95, 54111 - 44032: 0xBB96, 54112 - 44032: 0xBB97, 54113 - 44032: 0xBB98, 54114 - 44032: 0xBB99, 54115 - 44032: 0xBB9A, 54116 - 44032: 0xBB9B, 54117 - 44032: 0xBB9C, 54118 - 44032: 0xBB9D, 54119 - 44032: 0xBB9E, 54120 - 44032: 0xBB9F, 54121 - 44032: 0xBBA0, 54122 - 44032: 0xBC41, 54123 - 44032: 0xBC42, 54124 - 44032: 0xBC43, 54125 - 44032: 0xBC44, 54126 - 44032: 0xBC45, 54127 - 44032: 0xBC46, 54128 - 44032: 0xBC47, 54129 - 44032: 0xBC48, 54130 - 44032: 0xBC49, 54131 - 44032: 0xBC4A, 54132 - 44032: 0xBC4B, 54133 - 44032: 0xBC4C, 54134 - 44032: 0xBC4D, 54135 - 44032: 0xBC4E, 54136 - 44032: 0xBC4F, 54137 - 44032: 0xBC50, 54138 - 44032: 0xBC51, 54139 - 44032: 0xBC52, 54140 - 44032: 0xC6DB, 54141 - 44032: 0xC6DC, 54142 - 44032: 0xBC53, 54143 - 44032: 0xBC54, 54144 - 44032: 0xC6DD, 54145 - 44032: 0xBC55, 54146 - 44032: 0xBC56, 54147 - 44032: 0xBC57, 54148 - 44032: 0xC6DE, 54149 - 44032: 0xBC58, 54150 - 44032: 0xBC59, 54151 - 44032: 0xBC5A, 54152 - 44032: 0xBC61, 54153 - 44032: 0xBC62, 54154 - 44032: 0xBC63, 54155 - 44032: 0xBC64, 54156 - 44032: 0xC6DF, 54157 - 44032: 0xC6E0, 54158 - 44032: 0xBC65, 54159 - 44032: 0xC6E1, 54160 - 44032: 0xC6E2, 54161 - 44032: 0xC6E3, 54162 - 44032: 0xBC66, 54163 - 44032: 0xBC67, 54164 - 44032: 0xBC68, 54165 - 44032: 0xBC69, 54166 - 44032: 0xBC6A, 54167 - 44032: 0xBC6B, 54168 - 44032: 0xC6E4, 54169 - 44032: 0xC6E5, 54170 - 44032: 0xBC6C, 54171 - 44032: 0xBC6D, 54172 - 44032: 0xC6E6, 54173 - 44032: 0xBC6E, 54174 - 44032: 0xBC6F, 54175 - 44032: 0xBC70, 54176 - 44032: 0xC6E7, 54177 - 44032: 0xBC71, 54178 - 44032: 0xBC72, 54179 - 44032: 0xBC73, 54180 - 44032: 0xBC74, 54181 - 44032: 0xBC75, 54182 - 44032: 0xBC76, 54183 - 44032: 0xBC77, 54184 - 44032: 0xC6E8, 54185 - 44032: 0xC6E9, 54186 - 44032: 0xBC78, 54187 - 44032: 0xC6EA, 54188 - 44032: 0xBC79, 54189 - 44032: 0xC6EB, 54190 - 44032: 0xBC7A, 54191 - 44032: 0xBC81, 54192 - 44032: 0xBC82, 54193 - 44032: 0xBC83, 54194 - 44032: 0xBC84, 54195 - 44032: 0xBC85, 54196 - 44032: 0xC6EC, 54197 - 44032: 0xBC86, 54198 - 44032: 0xBC87, 54199 - 44032: 0xBC88, 54200 - 44032: 0xC6ED, 54201 - 44032: 0xBC89, 54202 - 44032: 0xBC8A, 54203 - 44032: 0xBC8B, 54204 - 44032: 0xC6EE, 54205 - 44032: 0xBC8C, 54206 - 44032: 0xBC8D, 54207 - 44032: 0xBC8E, 54208 - 44032: 0xBC8F, 54209 - 44032: 0xBC90, 54210 - 44032: 0xBC91, 54211 - 44032: 0xBC92, 54212 - 44032: 0xC6EF, 54213 - 44032: 0xC6F0, 54214 - 44032: 0xBC93, 54215 - 44032: 0xBC94, 54216 - 44032: 0xC6F1, 54217 - 44032: 0xC6F2, 54218 - 44032: 0xBC95, 54219 - 44032: 0xBC96, 54220 - 44032: 0xBC97, 54221 - 44032: 0xBC98, 54222 - 44032: 0xBC99, 54223 - 44032: 0xBC9A, 54224 - 44032: 0xC6F3, 54225 - 44032: 0xBC9B, 54226 - 44032: 0xBC9C, 54227 - 44032: 0xBC9D, 54228 - 44032: 0xBC9E, 54229 - 44032: 0xBC9F, 54230 - 44032: 0xBCA0, 54231 - 44032: 0xBD41, 54232 - 44032: 0xC6F4, 54233 - 44032: 0xBD42, 54234 - 44032: 0xBD43, 54235 - 44032: 0xBD44, 54236 - 44032: 0xBD45, 54237 - 44032: 0xBD46, 54238 - 44032: 0xBD47, 54239 - 44032: 0xBD48, 54240 - 44032: 0xBD49, 54241 - 44032: 0xC6F5, 54242 - 44032: 0xBD4A, 54243 - 44032: 0xC6F6, 54244 - 44032: 0xBD4B, 54245 - 44032: 0xBD4C, 54246 - 44032: 0xBD4D, 54247 - 44032: 0xBD4E, 54248 - 44032: 0xBD4F, 54249 - 44032: 0xBD50, 54250 - 44032: 0xBD51, 54251 - 44032: 0xBD52, 54252 - 44032: 0xC6F7, 54253 - 44032: 0xC6F8, 54254 - 44032: 0xBD53, 54255 - 44032: 0xBD54, 54256 - 44032: 0xC6F9, 54257 - 44032: 0xBD55, 54258 - 44032: 0xBD56, 54259 - 44032: 0xBD57, 54260 - 44032: 0xC6FA, 54261 - 44032: 0xBD58, 54262 - 44032: 0xBD59, 54263 - 44032: 0xBD5A, 54264 - 44032: 0xBD61, 54265 - 44032: 0xBD62, 54266 - 44032: 0xBD63, 54267 - 44032: 0xBD64, 54268 - 44032: 0xC6FB, 54269 - 44032: 0xC6FC, 54270 - 44032: 0xBD65, 54271 - 44032: 0xC6FD, 54272 - 44032: 0xBD66, 54273 - 44032: 0xC6FE, 54274 - 44032: 0xBD67, 54275 - 44032: 0xBD68, 54276 - 44032: 0xBD69, 54277 - 44032: 0xBD6A, 54278 - 44032: 0xBD6B, 54279 - 44032: 0xBD6C, 54280 - 44032: 0xC7A1, 54281 - 44032: 0xBD6D, 54282 - 44032: 0xBD6E, 54283 - 44032: 0xBD6F, 54284 - 44032: 0xBD70, 54285 - 44032: 0xBD71, 54286 - 44032: 0xBD72, 54287 - 44032: 0xBD73, 54288 - 44032: 0xBD74, 54289 - 44032: 0xBD75, 54290 - 44032: 0xBD76, 54291 - 44032: 0xBD77, 54292 - 44032: 0xBD78, 54293 - 44032: 0xBD79, 54294 - 44032: 0xBD7A, 54295 - 44032: 0xBD81, 54296 - 44032: 0xBD82, 54297 - 44032: 0xBD83, 54298 - 44032: 0xBD84, 54299 - 44032: 0xBD85, 54300 - 44032: 0xBD86, 54301 - 44032: 0xC7A2, 54302 - 44032: 0xBD87, 54303 - 44032: 0xBD88, 54304 - 44032: 0xBD89, 54305 - 44032: 0xBD8A, 54306 - 44032: 0xBD8B, 54307 - 44032: 0xBD8C, 54308 - 44032: 0xBD8D, 54309 - 44032: 0xBD8E, 54310 - 44032: 0xBD8F, 54311 - 44032: 0xBD90, 54312 - 44032: 0xBD91, 54313 - 44032: 0xBD92, 54314 - 44032: 0xBD93, 54315 - 44032: 0xBD94, 54316 - 44032: 0xBD95, 54317 - 44032: 0xBD96, 54318 - 44032: 0xBD97, 54319 - 44032: 0xBD98, 54320 - 44032: 0xBD99, 54321 - 44032: 0xBD9A, 54322 - 44032: 0xBD9B, 54323 - 44032: 0xBD9C, 54324 - 44032: 0xBD9D, 54325 - 44032: 0xBD9E, 54326 - 44032: 0xBD9F, 54327 - 44032: 0xBDA0, 54328 - 44032: 0xBE41, 54329 - 44032: 0xBE42, 54330 - 44032: 0xBE43, 54331 - 44032: 0xBE44, 54332 - 44032: 0xBE45, 54333 - 44032: 0xBE46, 54334 - 44032: 0xBE47, 54335 - 44032: 0xBE48, 54336 - 44032: 0xC7A3, 54337 - 44032: 0xBE49, 54338 - 44032: 0xBE4A, 54339 - 44032: 0xBE4B, 54340 - 44032: 0xC7A4, 54341 - 44032: 0xBE4C, 54342 - 44032: 0xBE4D, 54343 - 44032: 0xBE4E, 54344 - 44032: 0xBE4F, 54345 - 44032: 0xBE50, 54346 - 44032: 0xBE51, 54347 - 44032: 0xBE52, 54348 - 44032: 0xBE53, 54349 - 44032: 0xBE54, 54350 - 44032: 0xBE55, 54351 - 44032: 0xBE56, 54352 - 44032: 0xBE57, 54353 - 44032: 0xBE58, 54354 - 44032: 0xBE59, 54355 - 44032: 0xBE5A, 54356 - 44032: 0xBE61, 54357 - 44032: 0xBE62, 54358 - 44032: 0xBE63, 54359 - 44032: 0xBE64, 54360 - 44032: 0xBE65, 54361 - 44032: 0xBE66, 54362 - 44032: 0xBE67, 54363 - 44032: 0xBE68, 54364 - 44032: 0xC7A5, 54365 - 44032: 0xBE69, 54366 - 44032: 0xBE6A, 54367 - 44032: 0xBE6B, 54368 - 44032: 0xC7A6, 54369 - 44032: 0xBE6C, 54370 - 44032: 0xBE6D, 54371 - 44032: 0xBE6E, 54372 - 44032: 0xC7A7, 54373 - 44032: 0xBE6F, 54374 - 44032: 0xBE70, 54375 - 44032: 0xBE71, 54376 - 44032: 0xBE72, 54377 - 44032: 0xBE73, 54378 - 44032: 0xBE74, 54379 - 44032: 0xBE75, 54380 - 44032: 0xBE76, 54381 - 44032: 0xC7A8, 54382 - 44032: 0xBE77, 54383 - 44032: 0xC7A9, 54384 - 44032: 0xBE78, 54385 - 44032: 0xBE79, 54386 - 44032: 0xBE7A, 54387 - 44032: 0xBE81, 54388 - 44032: 0xBE82, 54389 - 44032: 0xBE83, 54390 - 44032: 0xBE84, 54391 - 44032: 0xBE85, 54392 - 44032: 0xC7AA, 54393 - 44032: 0xC7AB, 54394 - 44032: 0xBE86, 54395 - 44032: 0xBE87, 54396 - 44032: 0xC7AC, 54397 - 44032: 0xBE88, 54398 - 44032: 0xBE89, 54399 - 44032: 0xC7AD, 54400 - 44032: 0xC7AE, 54401 - 44032: 0xBE8A, 54402 - 44032: 0xC7AF, 54403 - 44032: 0xBE8B, 54404 - 44032: 0xBE8C, 54405 - 44032: 0xBE8D, 54406 - 44032: 0xBE8E, 54407 - 44032: 0xBE8F, 54408 - 44032: 0xC7B0, 54409 - 44032: 0xC7B1, 54410 - 44032: 0xBE90, 54411 - 44032: 0xC7B2, 54412 - 44032: 0xBE91, 54413 - 44032: 0xC7B3, 54414 - 44032: 0xBE92, 54415 - 44032: 0xBE93, 54416 - 44032: 0xBE94, 54417 - 44032: 0xBE95, 54418 - 44032: 0xBE96, 54419 - 44032: 0xBE97, 54420 - 44032: 0xC7B4, 54421 - 44032: 0xBE98, 54422 - 44032: 0xBE99, 54423 - 44032: 0xBE9A, 54424 - 44032: 0xBE9B, 54425 - 44032: 0xBE9C, 54426 - 44032: 0xBE9D, 54427 - 44032: 0xBE9E, 54428 - 44032: 0xBE9F, 54429 - 44032: 0xBEA0, 54430 - 44032: 0xBF41, 54431 - 44032: 0xBF42, 54432 - 44032: 0xBF43, 54433 - 44032: 0xBF44, 54434 - 44032: 0xBF45, 54435 - 44032: 0xBF46, 54436 - 44032: 0xBF47, 54437 - 44032: 0xBF48, 54438 - 44032: 0xBF49, 54439 - 44032: 0xBF4A, 54440 - 44032: 0xBF4B, 54441 - 44032: 0xC7B5, 54442 - 44032: 0xBF4C, 54443 - 44032: 0xBF4D, 54444 - 44032: 0xBF4E, 54445 - 44032: 0xBF4F, 54446 - 44032: 0xBF50, 54447 - 44032: 0xBF51, 54448 - 44032: 0xBF52, 54449 - 44032: 0xBF53, 54450 - 44032: 0xBF54, 54451 - 44032: 0xBF55, 54452 - 44032: 0xBF56, 54453 - 44032: 0xBF57, 54454 - 44032: 0xBF58, 54455 - 44032: 0xBF59, 54456 - 44032: 0xBF5A, 54457 - 44032: 0xBF61, 54458 - 44032: 0xBF62, 54459 - 44032: 0xBF63, 54460 - 44032: 0xBF64, 54461 - 44032: 0xBF65, 54462 - 44032: 0xBF66, 54463 - 44032: 0xBF67, 54464 - 44032: 0xBF68, 54465 - 44032: 0xBF69, 54466 - 44032: 0xBF6A, 54467 - 44032: 0xBF6B, 54468 - 44032: 0xBF6C, 54469 - 44032: 0xBF6D, 54470 - 44032: 0xBF6E, 54471 - 44032: 0xBF6F, 54472 - 44032: 0xBF70, 54473 - 44032: 0xBF71, 54474 - 44032: 0xBF72, 54475 - 44032: 0xBF73, 54476 - 44032: 0xC7B6, 54477 - 44032: 0xBF74, 54478 - 44032: 0xBF75, 54479 - 44032: 0xBF76, 54480 - 44032: 0xC7B7, 54481 - 44032: 0xBF77, 54482 - 44032: 0xBF78, 54483 - 44032: 0xBF79, 54484 - 44032: 0xC7B8, 54485 - 44032: 0xBF7A, 54486 - 44032: 0xBF81, 54487 - 44032: 0xBF82, 54488 - 44032: 0xBF83, 54489 - 44032: 0xBF84, 54490 - 44032: 0xBF85, 54491 - 44032: 0xBF86, 54492 - 44032: 0xC7B9, 54493 - 44032: 0xBF87, 54494 - 44032: 0xBF88, 54495 - 44032: 0xC7BA, 54496 - 44032: 0xBF89, 54497 - 44032: 0xBF8A, 54498 - 44032: 0xBF8B, 54499 - 44032: 0xBF8C, 54500 - 44032: 0xBF8D, 54501 - 44032: 0xBF8E, 54502 - 44032: 0xBF8F, 54503 - 44032: 0xBF90, 54504 - 44032: 0xC7BB, 54505 - 44032: 0xBF91, 54506 - 44032: 0xBF92, 54507 - 44032: 0xBF93, 54508 - 44032: 0xC7BC, 54509 - 44032: 0xBF94, 54510 - 44032: 0xBF95, 54511 - 44032: 0xBF96, 54512 - 44032: 0xC7BD, 54513 - 44032: 0xBF97, 54514 - 44032: 0xBF98, 54515 - 44032: 0xBF99, 54516 - 44032: 0xBF9A, 54517 - 44032: 0xBF9B, 54518 - 44032: 0xBF9C, 54519 - 44032: 0xBF9D, 54520 - 44032: 0xC7BE, 54521 - 44032: 0xBF9E, 54522 - 44032: 0xBF9F, 54523 - 44032: 0xC7BF, 54524 - 44032: 0xBFA0, 54525 - 44032: 0xC7C0, 54526 - 44032: 0xC041, 54527 - 44032: 0xC042, 54528 - 44032: 0xC043, 54529 - 44032: 0xC044, 54530 - 44032: 0xC045, 54531 - 44032: 0xC046, 54532 - 44032: 0xC7C1, 54533 - 44032: 0xC047, 54534 - 44032: 0xC048, 54535 - 44032: 0xC049, 54536 - 44032: 0xC7C2, 54537 - 44032: 0xC04A, 54538 - 44032: 0xC04B, 54539 - 44032: 0xC04C, 54540 - 44032: 0xC7C3, 54541 - 44032: 0xC04D, 54542 - 44032: 0xC04E, 54543 - 44032: 0xC04F, 54544 - 44032: 0xC050, 54545 - 44032: 0xC051, 54546 - 44032: 0xC052, 54547 - 44032: 0xC053, 54548 - 44032: 0xC7C4, 54549 - 44032: 0xC7C5, 54550 - 44032: 0xC054, 54551 - 44032: 0xC7C6, 54552 - 44032: 0xC055, 54553 - 44032: 0xC056, 54554 - 44032: 0xC057, 54555 - 44032: 0xC058, 54556 - 44032: 0xC059, 54557 - 44032: 0xC05A, 54558 - 44032: 0xC061, 54559 - 44032: 0xC062, 54560 - 44032: 0xC063, 54561 - 44032: 0xC064, 54562 - 44032: 0xC065, 54563 - 44032: 0xC066, 54564 - 44032: 0xC067, 54565 - 44032: 0xC068, 54566 - 44032: 0xC069, 54567 - 44032: 0xC06A, 54568 - 44032: 0xC06B, 54569 - 44032: 0xC06C, 54570 - 44032: 0xC06D, 54571 - 44032: 0xC06E, 54572 - 44032: 0xC06F, 54573 - 44032: 0xC070, 54574 - 44032: 0xC071, 54575 - 44032: 0xC072, 54576 - 44032: 0xC073, 54577 - 44032: 0xC074, 54578 - 44032: 0xC075, 54579 - 44032: 0xC076, 54580 - 44032: 0xC077, 54581 - 44032: 0xC078, 54582 - 44032: 0xC079, 54583 - 44032: 0xC07A, 54584 - 44032: 0xC081, 54585 - 44032: 0xC082, 54586 - 44032: 0xC083, 54587 - 44032: 0xC084, 54588 - 44032: 0xC7C7, 54589 - 44032: 0xC7C8, 54590 - 44032: 0xC085, 54591 - 44032: 0xC086, 54592 - 44032: 0xC7C9, 54593 - 44032: 0xC087, 54594 - 44032: 0xC088, 54595 - 44032: 0xC089, 54596 - 44032: 0xC7CA, 54597 - 44032: 0xC08A, 54598 - 44032: 0xC08B, 54599 - 44032: 0xC08C, 54600 - 44032: 0xC08D, 54601 - 44032: 0xC08E, 54602 - 44032: 0xC08F, 54603 - 44032: 0xC090, 54604 - 44032: 0xC7CB, 54605 - 44032: 0xC7CC, 54606 - 44032: 0xC091, 54607 - 44032: 0xC7CD, 54608 - 44032: 0xC092, 54609 - 44032: 0xC7CE, 54610 - 44032: 0xC093, 54611 - 44032: 0xC094, 54612 - 44032: 0xC095, 54613 - 44032: 0xC096, 54614 - 44032: 0xC097, 54615 - 44032: 0xC098, 54616 - 44032: 0xC7CF, 54617 - 44032: 0xC7D0, 54618 - 44032: 0xC099, 54619 - 44032: 0xC09A, 54620 - 44032: 0xC7D1, 54621 - 44032: 0xC09B, 54622 - 44032: 0xC09C, 54623 - 44032: 0xC09D, 54624 - 44032: 0xC7D2, 54625 - 44032: 0xC09E, 54626 - 44032: 0xC09F, 54627 - 44032: 0xC0A0, 54628 - 44032: 0xC141, 54629 - 44032: 0xC7D3, 54630 - 44032: 0xC142, 54631 - 44032: 0xC143, 54632 - 44032: 0xC7D4, 54633 - 44032: 0xC7D5, 54634 - 44032: 0xC144, 54635 - 44032: 0xC7D6, 54636 - 44032: 0xC145, 54637 - 44032: 0xC7D7, 54638 - 44032: 0xC146, 54639 - 44032: 0xC147, 54640 - 44032: 0xC148, 54641 - 44032: 0xC149, 54642 - 44032: 0xC14A, 54643 - 44032: 0xC14B, 54644 - 44032: 0xC7D8, 54645 - 44032: 0xC7D9, 54646 - 44032: 0xC14C, 54647 - 44032: 0xC14D, 54648 - 44032: 0xC7DA, 54649 - 44032: 0xC14E, 54650 - 44032: 0xC14F, 54651 - 44032: 0xC150, 54652 - 44032: 0xC7DB, 54653 - 44032: 0xC151, 54654 - 44032: 0xC152, 54655 - 44032: 0xC153, 54656 - 44032: 0xC154, 54657 - 44032: 0xC155, 54658 - 44032: 0xC156, 54659 - 44032: 0xC157, 54660 - 44032: 0xC7DC, 54661 - 44032: 0xC7DD, 54662 - 44032: 0xC158, 54663 - 44032: 0xC7DE, 54664 - 44032: 0xC7DF, 54665 - 44032: 0xC7E0, 54666 - 44032: 0xC159, 54667 - 44032: 0xC15A, 54668 - 44032: 0xC161, 54669 - 44032: 0xC162, 54670 - 44032: 0xC163, 54671 - 44032: 0xC164, 54672 - 44032: 0xC7E1, 54673 - 44032: 0xC165, 54674 - 44032: 0xC166, 54675 - 44032: 0xC167, 54676 - 44032: 0xC168, 54677 - 44032: 0xC169, 54678 - 44032: 0xC16A, 54679 - 44032: 0xC16B, 54680 - 44032: 0xC16C, 54681 - 44032: 0xC16D, 54682 - 44032: 0xC16E, 54683 - 44032: 0xC16F, 54684 - 44032: 0xC170, 54685 - 44032: 0xC171, 54686 - 44032: 0xC172, 54687 - 44032: 0xC173, 54688 - 44032: 0xC174, 54689 - 44032: 0xC175, 54690 - 44032: 0xC176, 54691 - 44032: 0xC177, 54692 - 44032: 0xC178, 54693 - 44032: 0xC7E2, 54694 - 44032: 0xC179, 54695 - 44032: 0xC17A, 54696 - 44032: 0xC181, 54697 - 44032: 0xC182, 54698 - 44032: 0xC183, 54699 - 44032: 0xC184, 54700 - 44032: 0xC185, 54701 - 44032: 0xC186, 54702 - 44032: 0xC187, 54703 - 44032: 0xC188, 54704 - 44032: 0xC189, 54705 - 44032: 0xC18A, 54706 - 44032: 0xC18B, 54707 - 44032: 0xC18C, 54708 - 44032: 0xC18D, 54709 - 44032: 0xC18E, 54710 - 44032: 0xC18F, 54711 - 44032: 0xC190, 54712 - 44032: 0xC191, 54713 - 44032: 0xC192, 54714 - 44032: 0xC193, 54715 - 44032: 0xC194, 54716 - 44032: 0xC195, 54717 - 44032: 0xC196, 54718 - 44032: 0xC197, 54719 - 44032: 0xC198, 54720 - 44032: 0xC199, 54721 - 44032: 0xC19A, 54722 - 44032: 0xC19B, 54723 - 44032: 0xC19C, 54724 - 44032: 0xC19D, 54725 - 44032: 0xC19E, 54726 - 44032: 0xC19F, 54727 - 44032: 0xC1A0, 54728 - 44032: 0xC7E3, 54729 - 44032: 0xC7E4, 54730 - 44032: 0xC241, 54731 - 44032: 0xC242, 54732 - 44032: 0xC7E5, 54733 - 44032: 0xC243, 54734 - 44032: 0xC244, 54735 - 44032: 0xC245, 54736 - 44032: 0xC7E6, 54737 - 44032: 0xC246, 54738 - 44032: 0xC7E7, 54739 - 44032: 0xC247, 54740 - 44032: 0xC248, 54741 - 44032: 0xC249, 54742 - 44032: 0xC24A, 54743 - 44032: 0xC24B, 54744 - 44032: 0xC7E8, 54745 - 44032: 0xC7E9, 54746 - 44032: 0xC24C, 54747 - 44032: 0xC7EA, 54748 - 44032: 0xC24D, 54749 - 44032: 0xC7EB, 54750 - 44032: 0xC24E, 54751 - 44032: 0xC24F, 54752 - 44032: 0xC250, 54753 - 44032: 0xC251, 54754 - 44032: 0xC252, 54755 - 44032: 0xC253, 54756 - 44032: 0xC7EC, 54757 - 44032: 0xC7ED, 54758 - 44032: 0xC254, 54759 - 44032: 0xC255, 54760 - 44032: 0xC7EE, 54761 - 44032: 0xC256, 54762 - 44032: 0xC257, 54763 - 44032: 0xC258, 54764 - 44032: 0xC7EF, 54765 - 44032: 0xC259, 54766 - 44032: 0xC25A, 54767 - 44032: 0xC261, 54768 - 44032: 0xC262, 54769 - 44032: 0xC263, 54770 - 44032: 0xC264, 54771 - 44032: 0xC265, 54772 - 44032: 0xC7F0, 54773 - 44032: 0xC7F1, 54774 - 44032: 0xC266, 54775 - 44032: 0xC7F2, 54776 - 44032: 0xC267, 54777 - 44032: 0xC7F3, 54778 - 44032: 0xC268, 54779 - 44032: 0xC269, 54780 - 44032: 0xC26A, 54781 - 44032: 0xC26B, 54782 - 44032: 0xC26C, 54783 - 44032: 0xC26D, 54784 - 44032: 0xC7F4, 54785 - 44032: 0xC7F5, 54786 - 44032: 0xC26E, 54787 - 44032: 0xC26F, 54788 - 44032: 0xC7F6, 54789 - 44032: 0xC270, 54790 - 44032: 0xC271, 54791 - 44032: 0xC272, 54792 - 44032: 0xC7F7, 54793 - 44032: 0xC273, 54794 - 44032: 0xC274, 54795 - 44032: 0xC275, 54796 - 44032: 0xC276, 54797 - 44032: 0xC277, 54798 - 44032: 0xC278, 54799 - 44032: 0xC279, 54800 - 44032: 0xC7F8, 54801 - 44032: 0xC7F9, 54802 - 44032: 0xC27A, 54803 - 44032: 0xC7FA, 54804 - 44032: 0xC7FB, 54805 - 44032: 0xC7FC, 54806 - 44032: 0xC281, 54807 - 44032: 0xC282, 54808 - 44032: 0xC283, 54809 - 44032: 0xC284, 54810 - 44032: 0xC285, 54811 - 44032: 0xC286, 54812 - 44032: 0xC7FD, 54813 - 44032: 0xC287, 54814 - 44032: 0xC288, 54815 - 44032: 0xC289, 54816 - 44032: 0xC7FE, 54817 - 44032: 0xC28A, 54818 - 44032: 0xC28B, 54819 - 44032: 0xC28C, 54820 - 44032: 0xC8A1, 54821 - 44032: 0xC28D, 54822 - 44032: 0xC28E, 54823 - 44032: 0xC28F, 54824 - 44032: 0xC290, 54825 - 44032: 0xC291, 54826 - 44032: 0xC292, 54827 - 44032: 0xC293, 54828 - 44032: 0xC294, 54829 - 44032: 0xC8A2, 54830 - 44032: 0xC295, 54831 - 44032: 0xC296, 54832 - 44032: 0xC297, 54833 - 44032: 0xC298, 54834 - 44032: 0xC299, 54835 - 44032: 0xC29A, 54836 - 44032: 0xC29B, 54837 - 44032: 0xC29C, 54838 - 44032: 0xC29D, 54839 - 44032: 0xC29E, 54840 - 44032: 0xC8A3, 54841 - 44032: 0xC8A4, 54842 - 44032: 0xC29F, 54843 - 44032: 0xC2A0, 54844 - 44032: 0xC8A5, 54845 - 44032: 0xC341, 54846 - 44032: 0xC342, 54847 - 44032: 0xC343, 54848 - 44032: 0xC8A6, 54849 - 44032: 0xC344, 54850 - 44032: 0xC345, 54851 - 44032: 0xC346, 54852 - 44032: 0xC347, 54853 - 44032: 0xC8A7, 54854 - 44032: 0xC348, 54855 - 44032: 0xC349, 54856 - 44032: 0xC8A8, 54857 - 44032: 0xC8A9, 54858 - 44032: 0xC34A, 54859 - 44032: 0xC8AA, 54860 - 44032: 0xC34B, 54861 - 44032: 0xC8AB, 54862 - 44032: 0xC34C, 54863 - 44032: 0xC34D, 54864 - 44032: 0xC34E, 54865 - 44032: 0xC8AC, 54866 - 44032: 0xC34F, 54867 - 44032: 0xC350, 54868 - 44032: 0xC8AD, 54869 - 44032: 0xC8AE, 54870 - 44032: 0xC351, 54871 - 44032: 0xC352, 54872 - 44032: 0xC8AF, 54873 - 44032: 0xC353, 54874 - 44032: 0xC354, 54875 - 44032: 0xC355, 54876 - 44032: 0xC8B0, 54877 - 44032: 0xC356, 54878 - 44032: 0xC357, 54879 - 44032: 0xC358, 54880 - 44032: 0xC359, 54881 - 44032: 0xC35A, 54882 - 44032: 0xC361, 54883 - 44032: 0xC362, 54884 - 44032: 0xC363, 54885 - 44032: 0xC364, 54886 - 44032: 0xC365, 54887 - 44032: 0xC8B1, 54888 - 44032: 0xC366, 54889 - 44032: 0xC8B2, 54890 - 44032: 0xC367, 54891 - 44032: 0xC368, 54892 - 44032: 0xC369, 54893 - 44032: 0xC36A, 54894 - 44032: 0xC36B, 54895 - 44032: 0xC36C, 54896 - 44032: 0xC8B3, 54897 - 44032: 0xC8B4, 54898 - 44032: 0xC36D, 54899 - 44032: 0xC36E, 54900 - 44032: 0xC8B5, 54901 - 44032: 0xC36F, 54902 - 44032: 0xC370, 54903 - 44032: 0xC371, 54904 - 44032: 0xC372, 54905 - 44032: 0xC373, 54906 - 44032: 0xC374, 54907 - 44032: 0xC375, 54908 - 44032: 0xC376, 54909 - 44032: 0xC377, 54910 - 44032: 0xC378, 54911 - 44032: 0xC379, 54912 - 44032: 0xC37A, 54913 - 44032: 0xC381, 54914 - 44032: 0xC382, 54915 - 44032: 0xC8B6, 54916 - 44032: 0xC383, 54917 - 44032: 0xC8B7, 54918 - 44032: 0xC384, 54919 - 44032: 0xC385, 54920 - 44032: 0xC386, 54921 - 44032: 0xC387, 54922 - 44032: 0xC388, 54923 - 44032: 0xC389, 54924 - 44032: 0xC8B8, 54925 - 44032: 0xC8B9, 54926 - 44032: 0xC38A, 54927 - 44032: 0xC38B, 54928 - 44032: 0xC8BA, 54929 - 44032: 0xC38C, 54930 - 44032: 0xC38D, 54931 - 44032: 0xC38E, 54932 - 44032: 0xC8BB, 54933 - 44032: 0xC38F, 54934 - 44032: 0xC390, 54935 - 44032: 0xC391, 54936 - 44032: 0xC392, 54937 - 44032: 0xC393, 54938 - 44032: 0xC394, 54939 - 44032: 0xC395, 54940 - 44032: 0xC396, 54941 - 44032: 0xC8BC, 54942 - 44032: 0xC397, 54943 - 44032: 0xC8BD, 54944 - 44032: 0xC398, 54945 - 44032: 0xC8BE, 54946 - 44032: 0xC399, 54947 - 44032: 0xC39A, 54948 - 44032: 0xC39B, 54949 - 44032: 0xC39C, 54950 - 44032: 0xC39D, 54951 - 44032: 0xC39E, 54952 - 44032: 0xC8BF, 54953 - 44032: 0xC39F, 54954 - 44032: 0xC3A0, 54955 - 44032: 0xC441, 54956 - 44032: 0xC8C0, 54957 - 44032: 0xC442, 54958 - 44032: 0xC443, 54959 - 44032: 0xC444, 54960 - 44032: 0xC8C1, 54961 - 44032: 0xC445, 54962 - 44032: 0xC446, 54963 - 44032: 0xC447, 54964 - 44032: 0xC448, 54965 - 44032: 0xC449, 54966 - 44032: 0xC44A, 54967 - 44032: 0xC44B, 54968 - 44032: 0xC44C, 54969 - 44032: 0xC8C2, 54970 - 44032: 0xC44D, 54971 - 44032: 0xC8C3, 54972 - 44032: 0xC44E, 54973 - 44032: 0xC44F, 54974 - 44032: 0xC450, 54975 - 44032: 0xC451, 54976 - 44032: 0xC452, 54977 - 44032: 0xC453, 54978 - 44032: 0xC454, 54979 - 44032: 0xC455, 54980 - 44032: 0xC8C4, 54981 - 44032: 0xC8C5, 54982 - 44032: 0xC456, 54983 - 44032: 0xC457, 54984 - 44032: 0xC8C6, 54985 - 44032: 0xC458, 54986 - 44032: 0xC459, 54987 - 44032: 0xC45A, 54988 - 44032: 0xC8C7, 54989 - 44032: 0xC461, 54990 - 44032: 0xC462, 54991 - 44032: 0xC463, 54992 - 44032: 0xC464, 54993 - 44032: 0xC8C8, 54994 - 44032: 0xC465, 54995 - 44032: 0xC466, 54996 - 44032: 0xC8C9, 54997 - 44032: 0xC467, 54998 - 44032: 0xC468, 54999 - 44032: 0xC8CA, 55000 - 44032: 0xC469, 55001 - 44032: 0xC8CB, 55002 - 44032: 0xC46A, 55003 - 44032: 0xC46B, 55004 - 44032: 0xC46C, 55005 - 44032: 0xC46D, 55006 - 44032: 0xC46E, 55007 - 44032: 0xC46F, 55008 - 44032: 0xC8CC, 55009 - 44032: 0xC470, 55010 - 44032: 0xC471, 55011 - 44032: 0xC472, 55012 - 44032: 0xC8CD, 55013 - 44032: 0xC473, 55014 - 44032: 0xC474, 55015 - 44032: 0xC475, 55016 - 44032: 0xC8CE, 55017 - 44032: 0xC476, 55018 - 44032: 0xC477, 55019 - 44032: 0xC478, 55020 - 44032: 0xC479, 55021 - 44032: 0xC47A, 55022 - 44032: 0xC481, 55023 - 44032: 0xC482, 55024 - 44032: 0xC8CF, 55025 - 44032: 0xC483, 55026 - 44032: 0xC484, 55027 - 44032: 0xC485, 55028 - 44032: 0xC486, 55029 - 44032: 0xC8D0, 55030 - 44032: 0xC487, 55031 - 44032: 0xC488, 55032 - 44032: 0xC489, 55033 - 44032: 0xC48A, 55034 - 44032: 0xC48B, 55035 - 44032: 0xC48C, 55036 - 44032: 0xC8D1, 55037 - 44032: 0xC8D2, 55038 - 44032: 0xC48D, 55039 - 44032: 0xC48E, 55040 - 44032: 0xC8D3, 55041 - 44032: 0xC48F, 55042 - 44032: 0xC490, 55043 - 44032: 0xC491, 55044 - 44032: 0xC8D4, 55045 - 44032: 0xC492, 55046 - 44032: 0xC493, 55047 - 44032: 0xC494, 55048 - 44032: 0xC495, 55049 - 44032: 0xC496, 55050 - 44032: 0xC497, 55051 - 44032: 0xC498, 55052 - 44032: 0xC499, 55053 - 44032: 0xC49A, 55054 - 44032: 0xC49B, 55055 - 44032: 0xC49C, 55056 - 44032: 0xC49D, 55057 - 44032: 0xC8D5, 55058 - 44032: 0xC49E, 55059 - 44032: 0xC49F, 55060 - 44032: 0xC4A0, 55061 - 44032: 0xC541, 55062 - 44032: 0xC542, 55063 - 44032: 0xC543, 55064 - 44032: 0xC8D6, 55065 - 44032: 0xC8D7, 55066 - 44032: 0xC544, 55067 - 44032: 0xC545, 55068 - 44032: 0xC8D8, 55069 - 44032: 0xC546, 55070 - 44032: 0xC547, 55071 - 44032: 0xC548, 55072 - 44032: 0xC8D9, 55073 - 44032: 0xC549, 55074 - 44032: 0xC54A, 55075 - 44032: 0xC54B, 55076 - 44032: 0xC54C, 55077 - 44032: 0xC54D, 55078 - 44032: 0xC54E, 55079 - 44032: 0xC54F, 55080 - 44032: 0xC8DA, 55081 - 44032: 0xC8DB, 55082 - 44032: 0xC550, 55083 - 44032: 0xC8DC, 55084 - 44032: 0xC551, 55085 - 44032: 0xC8DD, 55086 - 44032: 0xC552, 55087 - 44032: 0xC553, 55088 - 44032: 0xC554, 55089 - 44032: 0xC555, 55090 - 44032: 0xC556, 55091 - 44032: 0xC557, 55092 - 44032: 0xC8DE, 55093 - 44032: 0xC8DF, 55094 - 44032: 0xC558, 55095 - 44032: 0xC559, 55096 - 44032: 0xC8E0, 55097 - 44032: 0xC55A, 55098 - 44032: 0xC561, 55099 - 44032: 0xC562, 55100 - 44032: 0xC8E1, 55101 - 44032: 0xC563, 55102 - 44032: 0xC564, 55103 - 44032: 0xC565, 55104 - 44032: 0xC566, 55105 - 44032: 0xC567, 55106 - 44032: 0xC568, 55107 - 44032: 0xC569, 55108 - 44032: 0xC8E2, 55109 - 44032: 0xC56A, 55110 - 44032: 0xC56B, 55111 - 44032: 0xC8E3, 55112 - 44032: 0xC56C, 55113 - 44032: 0xC8E4, 55114 - 44032: 0xC56D, 55115 - 44032: 0xC56E, 55116 - 44032: 0xC56F, 55117 - 44032: 0xC570, 55118 - 44032: 0xC571, 55119 - 44032: 0xC572, 55120 - 44032: 0xC8E5, 55121 - 44032: 0xC8E6, 55122 - 44032: 0xC573, 55123 - 44032: 0xC574, 55124 - 44032: 0xC8E7, 55125 - 44032: 0xC575, 55126 - 44032: 0xC8E8, 55127 - 44032: 0xC8E9, 55128 - 44032: 0xC8EA, 55129 - 44032: 0xC8EB, 55130 - 44032: 0xC576, 55131 - 44032: 0xC577, 55132 - 44032: 0xC578, 55133 - 44032: 0xC579, 55134 - 44032: 0xC57A, 55135 - 44032: 0xC581, 55136 - 44032: 0xC8EC, 55137 - 44032: 0xC8ED, 55138 - 44032: 0xC582, 55139 - 44032: 0xC8EE, 55140 - 44032: 0xC583, 55141 - 44032: 0xC8EF, 55142 - 44032: 0xC584, 55143 - 44032: 0xC585, 55144 - 44032: 0xC586, 55145 - 44032: 0xC8F0, 55146 - 44032: 0xC587, 55147 - 44032: 0xC588, 55148 - 44032: 0xC8F1, 55149 - 44032: 0xC589, 55150 - 44032: 0xC58A, 55151 - 44032: 0xC58B, 55152 - 44032: 0xC8F2, 55153 - 44032: 0xC58C, 55154 - 44032: 0xC58D, 55155 - 44032: 0xC58E, 55156 - 44032: 0xC8F3, 55157 - 44032: 0xC58F, 55158 - 44032: 0xC590, 55159 - 44032: 0xC591, 55160 - 44032: 0xC592, 55161 - 44032: 0xC593, 55162 - 44032: 0xC594, 55163 - 44032: 0xC595, 55164 - 44032: 0xC8F4, 55165 - 44032: 0xC8F5, 55166 - 44032: 0xC596, 55167 - 44032: 0xC597, 55168 - 44032: 0xC598, 55169 - 44032: 0xC8F6, 55170 - 44032: 0xC599, 55171 - 44032: 0xC59A, 55172 - 44032: 0xC59B, 55173 - 44032: 0xC59C, 55174 - 44032: 0xC59D, 55175 - 44032: 0xC59E, 55176 - 44032: 0xC8F7, 55177 - 44032: 0xC8F8, 55178 - 44032: 0xC59F, 55179 - 44032: 0xC5A0, 55180 - 44032: 0xC8F9, 55181 - 44032: 0xC641, 55182 - 44032: 0xC642, 55183 - 44032: 0xC643, 55184 - 44032: 0xC8FA, 55185 - 44032: 0xC644, 55186 - 44032: 0xC645, 55187 - 44032: 0xC646, 55188 - 44032: 0xC647, 55189 - 44032: 0xC648, 55190 - 44032: 0xC649, 55191 - 44032: 0xC64A, 55192 - 44032: 0xC8FB, 55193 - 44032: 0xC8FC, 55194 - 44032: 0xC64B, 55195 - 44032: 0xC8FD, 55196 - 44032: 0xC64C, 55197 - 44032: 0xC8FE, 55198 - 44032: 0xC64D, 55199 - 44032: 0xC64E, 55200 - 44032: 0xC64F, 55201 - 44032: 0xC650, 55202 - 44032: 0xC651, 55203 - 44032: 0xC652, } const encode2Low, encode2High = 8213, 9838 var encode2 = [...]uint16{ 8213 - 8213: 0xA1AA, 8216 - 8213: 0xA1AE, 8217 - 8213: 0xA1AF, 8220 - 8213: 0xA1B0, 8221 - 8213: 0xA1B1, 8224 - 8213: 0xA2D3, 8225 - 8213: 0xA2D4, 8229 - 8213: 0xA1A5, 8230 - 8213: 0xA1A6, 8240 - 8213: 0xA2B6, 8242 - 8213: 0xA1C7, 8243 - 8213: 0xA1C8, 8251 - 8213: 0xA1D8, 8308 - 8213: 0xA9F9, 8319 - 8213: 0xA9FA, 8321 - 8213: 0xA9FB, 8322 - 8213: 0xA9FC, 8323 - 8213: 0xA9FD, 8324 - 8213: 0xA9FE, 8364 - 8213: 0xA2E6, 8451 - 8213: 0xA1C9, 8457 - 8213: 0xA2B5, 8467 - 8213: 0xA7A4, 8470 - 8213: 0xA2E0, 8481 - 8213: 0xA2E5, 8482 - 8213: 0xA2E2, 8486 - 8213: 0xA7D9, 8491 - 8213: 0xA1CA, 8531 - 8213: 0xA8F7, 8532 - 8213: 0xA8F8, 8539 - 8213: 0xA8FB, 8540 - 8213: 0xA8FC, 8541 - 8213: 0xA8FD, 8542 - 8213: 0xA8FE, 8544 - 8213: 0xA5B0, 8545 - 8213: 0xA5B1, 8546 - 8213: 0xA5B2, 8547 - 8213: 0xA5B3, 8548 - 8213: 0xA5B4, 8549 - 8213: 0xA5B5, 8550 - 8213: 0xA5B6, 8551 - 8213: 0xA5B7, 8552 - 8213: 0xA5B8, 8553 - 8213: 0xA5B9, 8560 - 8213: 0xA5A1, 8561 - 8213: 0xA5A2, 8562 - 8213: 0xA5A3, 8563 - 8213: 0xA5A4, 8564 - 8213: 0xA5A5, 8565 - 8213: 0xA5A6, 8566 - 8213: 0xA5A7, 8567 - 8213: 0xA5A8, 8568 - 8213: 0xA5A9, 8569 - 8213: 0xA5AA, 8592 - 8213: 0xA1E7, 8593 - 8213: 0xA1E8, 8594 - 8213: 0xA1E6, 8595 - 8213: 0xA1E9, 8596 - 8213: 0xA1EA, 8597 - 8213: 0xA2D5, 8598 - 8213: 0xA2D8, 8599 - 8213: 0xA2D6, 8600 - 8213: 0xA2D9, 8601 - 8213: 0xA2D7, 8658 - 8213: 0xA2A1, 8660 - 8213: 0xA2A2, 8704 - 8213: 0xA2A3, 8706 - 8213: 0xA1D3, 8707 - 8213: 0xA2A4, 8711 - 8213: 0xA1D4, 8712 - 8213: 0xA1F4, 8715 - 8213: 0xA1F5, 8719 - 8213: 0xA2B3, 8721 - 8213: 0xA2B2, 8730 - 8213: 0xA1EE, 8733 - 8213: 0xA1F0, 8734 - 8213: 0xA1C4, 8736 - 8213: 0xA1D0, 8741 - 8213: 0xA1AB, 8743 - 8213: 0xA1FC, 8744 - 8213: 0xA1FD, 8745 - 8213: 0xA1FB, 8746 - 8213: 0xA1FA, 8747 - 8213: 0xA1F2, 8748 - 8213: 0xA1F3, 8750 - 8213: 0xA2B1, 8756 - 8213: 0xA1C5, 8757 - 8213: 0xA1F1, 8764 - 8213: 0xA1AD, 8765 - 8213: 0xA1EF, 8786 - 8213: 0xA1D6, 8800 - 8213: 0xA1C1, 8801 - 8213: 0xA1D5, 8804 - 8213: 0xA1C2, 8805 - 8213: 0xA1C3, 8810 - 8213: 0xA1EC, 8811 - 8213: 0xA1ED, 8834 - 8213: 0xA1F8, 8835 - 8213: 0xA1F9, 8838 - 8213: 0xA1F6, 8839 - 8213: 0xA1F7, 8857 - 8213: 0xA2C1, 8869 - 8213: 0xA1D1, 8978 - 8213: 0xA1D2, 9312 - 8213: 0xA8E7, 9313 - 8213: 0xA8E8, 9314 - 8213: 0xA8E9, 9315 - 8213: 0xA8EA, 9316 - 8213: 0xA8EB, 9317 - 8213: 0xA8EC, 9318 - 8213: 0xA8ED, 9319 - 8213: 0xA8EE, 9320 - 8213: 0xA8EF, 9321 - 8213: 0xA8F0, 9322 - 8213: 0xA8F1, 9323 - 8213: 0xA8F2, 9324 - 8213: 0xA8F3, 9325 - 8213: 0xA8F4, 9326 - 8213: 0xA8F5, 9332 - 8213: 0xA9E7, 9333 - 8213: 0xA9E8, 9334 - 8213: 0xA9E9, 9335 - 8213: 0xA9EA, 9336 - 8213: 0xA9EB, 9337 - 8213: 0xA9EC, 9338 - 8213: 0xA9ED, 9339 - 8213: 0xA9EE, 9340 - 8213: 0xA9EF, 9341 - 8213: 0xA9F0, 9342 - 8213: 0xA9F1, 9343 - 8213: 0xA9F2, 9344 - 8213: 0xA9F3, 9345 - 8213: 0xA9F4, 9346 - 8213: 0xA9F5, 9372 - 8213: 0xA9CD, 9373 - 8213: 0xA9CE, 9374 - 8213: 0xA9CF, 9375 - 8213: 0xA9D0, 9376 - 8213: 0xA9D1, 9377 - 8213: 0xA9D2, 9378 - 8213: 0xA9D3, 9379 - 8213: 0xA9D4, 9380 - 8213: 0xA9D5, 9381 - 8213: 0xA9D6, 9382 - 8213: 0xA9D7, 9383 - 8213: 0xA9D8, 9384 - 8213: 0xA9D9, 9385 - 8213: 0xA9DA, 9386 - 8213: 0xA9DB, 9387 - 8213: 0xA9DC, 9388 - 8213: 0xA9DD, 9389 - 8213: 0xA9DE, 9390 - 8213: 0xA9DF, 9391 - 8213: 0xA9E0, 9392 - 8213: 0xA9E1, 9393 - 8213: 0xA9E2, 9394 - 8213: 0xA9E3, 9395 - 8213: 0xA9E4, 9396 - 8213: 0xA9E5, 9397 - 8213: 0xA9E6, 9424 - 8213: 0xA8CD, 9425 - 8213: 0xA8CE, 9426 - 8213: 0xA8CF, 9427 - 8213: 0xA8D0, 9428 - 8213: 0xA8D1, 9429 - 8213: 0xA8D2, 9430 - 8213: 0xA8D3, 9431 - 8213: 0xA8D4, 9432 - 8213: 0xA8D5, 9433 - 8213: 0xA8D6, 9434 - 8213: 0xA8D7, 9435 - 8213: 0xA8D8, 9436 - 8213: 0xA8D9, 9437 - 8213: 0xA8DA, 9438 - 8213: 0xA8DB, 9439 - 8213: 0xA8DC, 9440 - 8213: 0xA8DD, 9441 - 8213: 0xA8DE, 9442 - 8213: 0xA8DF, 9443 - 8213: 0xA8E0, 9444 - 8213: 0xA8E1, 9445 - 8213: 0xA8E2, 9446 - 8213: 0xA8E3, 9447 - 8213: 0xA8E4, 9448 - 8213: 0xA8E5, 9449 - 8213: 0xA8E6, 9472 - 8213: 0xA6A1, 9473 - 8213: 0xA6AC, 9474 - 8213: 0xA6A2, 9475 - 8213: 0xA6AD, 9484 - 8213: 0xA6A3, 9485 - 8213: 0xA6C8, 9486 - 8213: 0xA6C7, 9487 - 8213: 0xA6AE, 9488 - 8213: 0xA6A4, 9489 - 8213: 0xA6C2, 9490 - 8213: 0xA6C1, 9491 - 8213: 0xA6AF, 9492 - 8213: 0xA6A6, 9493 - 8213: 0xA6C6, 9494 - 8213: 0xA6C5, 9495 - 8213: 0xA6B1, 9496 - 8213: 0xA6A5, 9497 - 8213: 0xA6C4, 9498 - 8213: 0xA6C3, 9499 - 8213: 0xA6B0, 9500 - 8213: 0xA6A7, 9501 - 8213: 0xA6BC, 9502 - 8213: 0xA6C9, 9503 - 8213: 0xA6CA, 9504 - 8213: 0xA6B7, 9505 - 8213: 0xA6CB, 9506 - 8213: 0xA6CC, 9507 - 8213: 0xA6B2, 9508 - 8213: 0xA6A9, 9509 - 8213: 0xA6BE, 9510 - 8213: 0xA6CD, 9511 - 8213: 0xA6CE, 9512 - 8213: 0xA6B9, 9513 - 8213: 0xA6CF, 9514 - 8213: 0xA6D0, 9515 - 8213: 0xA6B4, 9516 - 8213: 0xA6A8, 9517 - 8213: 0xA6D1, 9518 - 8213: 0xA6D2, 9519 - 8213: 0xA6B8, 9520 - 8213: 0xA6BD, 9521 - 8213: 0xA6D3, 9522 - 8213: 0xA6D4, 9523 - 8213: 0xA6B3, 9524 - 8213: 0xA6AA, 9525 - 8213: 0xA6D5, 9526 - 8213: 0xA6D6, 9527 - 8213: 0xA6BA, 9528 - 8213: 0xA6BF, 9529 - 8213: 0xA6D7, 9530 - 8213: 0xA6D8, 9531 - 8213: 0xA6B5, 9532 - 8213: 0xA6AB, 9533 - 8213: 0xA6D9, 9534 - 8213: 0xA6DA, 9535 - 8213: 0xA6BB, 9536 - 8213: 0xA6DB, 9537 - 8213: 0xA6DC, 9538 - 8213: 0xA6C0, 9539 - 8213: 0xA6DD, 9540 - 8213: 0xA6DE, 9541 - 8213: 0xA6DF, 9542 - 8213: 0xA6E0, 9543 - 8213: 0xA6E1, 9544 - 8213: 0xA6E2, 9545 - 8213: 0xA6E3, 9546 - 8213: 0xA6E4, 9547 - 8213: 0xA6B6, 9618 - 8213: 0xA2C6, 9632 - 8213: 0xA1E1, 9633 - 8213: 0xA1E0, 9635 - 8213: 0xA2C3, 9636 - 8213: 0xA2C7, 9637 - 8213: 0xA2C8, 9638 - 8213: 0xA2CB, 9639 - 8213: 0xA2CA, 9640 - 8213: 0xA2C9, 9641 - 8213: 0xA2CC, 9650 - 8213: 0xA1E3, 9651 - 8213: 0xA1E2, 9654 - 8213: 0xA2BA, 9655 - 8213: 0xA2B9, 9660 - 8213: 0xA1E5, 9661 - 8213: 0xA1E4, 9664 - 8213: 0xA2B8, 9665 - 8213: 0xA2B7, 9670 - 8213: 0xA1DF, 9671 - 8213: 0xA1DE, 9672 - 8213: 0xA2C2, 9675 - 8213: 0xA1DB, 9678 - 8213: 0xA1DD, 9679 - 8213: 0xA1DC, 9680 - 8213: 0xA2C4, 9681 - 8213: 0xA2C5, 9733 - 8213: 0xA1DA, 9734 - 8213: 0xA1D9, 9742 - 8213: 0xA2CF, 9743 - 8213: 0xA2CE, 9756 - 8213: 0xA2D0, 9758 - 8213: 0xA2D1, 9792 - 8213: 0xA1CF, 9794 - 8213: 0xA1CE, 9824 - 8213: 0xA2BC, 9825 - 8213: 0xA2BD, 9827 - 8213: 0xA2C0, 9828 - 8213: 0xA2BB, 9829 - 8213: 0xA2BE, 9831 - 8213: 0xA2BF, 9832 - 8213: 0xA2CD, 9833 - 8213: 0xA2DB, 9834 - 8213: 0xA2DC, 9836 - 8213: 0xA2DD, 9837 - 8213: 0xA2DA, } const encode3Low, encode3High = 12288, 13278 var encode3 = [...]uint16{ 12288 - 12288: 0xA1A1, 12289 - 12288: 0xA1A2, 12290 - 12288: 0xA1A3, 12291 - 12288: 0xA1A8, 12296 - 12288: 0xA1B4, 12297 - 12288: 0xA1B5, 12298 - 12288: 0xA1B6, 12299 - 12288: 0xA1B7, 12300 - 12288: 0xA1B8, 12301 - 12288: 0xA1B9, 12302 - 12288: 0xA1BA, 12303 - 12288: 0xA1BB, 12304 - 12288: 0xA1BC, 12305 - 12288: 0xA1BD, 12307 - 12288: 0xA1EB, 12308 - 12288: 0xA1B2, 12309 - 12288: 0xA1B3, 12353 - 12288: 0xAAA1, 12354 - 12288: 0xAAA2, 12355 - 12288: 0xAAA3, 12356 - 12288: 0xAAA4, 12357 - 12288: 0xAAA5, 12358 - 12288: 0xAAA6, 12359 - 12288: 0xAAA7, 12360 - 12288: 0xAAA8, 12361 - 12288: 0xAAA9, 12362 - 12288: 0xAAAA, 12363 - 12288: 0xAAAB, 12364 - 12288: 0xAAAC, 12365 - 12288: 0xAAAD, 12366 - 12288: 0xAAAE, 12367 - 12288: 0xAAAF, 12368 - 12288: 0xAAB0, 12369 - 12288: 0xAAB1, 12370 - 12288: 0xAAB2, 12371 - 12288: 0xAAB3, 12372 - 12288: 0xAAB4, 12373 - 12288: 0xAAB5, 12374 - 12288: 0xAAB6, 12375 - 12288: 0xAAB7, 12376 - 12288: 0xAAB8, 12377 - 12288: 0xAAB9, 12378 - 12288: 0xAABA, 12379 - 12288: 0xAABB, 12380 - 12288: 0xAABC, 12381 - 12288: 0xAABD, 12382 - 12288: 0xAABE, 12383 - 12288: 0xAABF, 12384 - 12288: 0xAAC0, 12385 - 12288: 0xAAC1, 12386 - 12288: 0xAAC2, 12387 - 12288: 0xAAC3, 12388 - 12288: 0xAAC4, 12389 - 12288: 0xAAC5, 12390 - 12288: 0xAAC6, 12391 - 12288: 0xAAC7, 12392 - 12288: 0xAAC8, 12393 - 12288: 0xAAC9, 12394 - 12288: 0xAACA, 12395 - 12288: 0xAACB, 12396 - 12288: 0xAACC, 12397 - 12288: 0xAACD, 12398 - 12288: 0xAACE, 12399 - 12288: 0xAACF, 12400 - 12288: 0xAAD0, 12401 - 12288: 0xAAD1, 12402 - 12288: 0xAAD2, 12403 - 12288: 0xAAD3, 12404 - 12288: 0xAAD4, 12405 - 12288: 0xAAD5, 12406 - 12288: 0xAAD6, 12407 - 12288: 0xAAD7, 12408 - 12288: 0xAAD8, 12409 - 12288: 0xAAD9, 12410 - 12288: 0xAADA, 12411 - 12288: 0xAADB, 12412 - 12288: 0xAADC, 12413 - 12288: 0xAADD, 12414 - 12288: 0xAADE, 12415 - 12288: 0xAADF, 12416 - 12288: 0xAAE0, 12417 - 12288: 0xAAE1, 12418 - 12288: 0xAAE2, 12419 - 12288: 0xAAE3, 12420 - 12288: 0xAAE4, 12421 - 12288: 0xAAE5, 12422 - 12288: 0xAAE6, 12423 - 12288: 0xAAE7, 12424 - 12288: 0xAAE8, 12425 - 12288: 0xAAE9, 12426 - 12288: 0xAAEA, 12427 - 12288: 0xAAEB, 12428 - 12288: 0xAAEC, 12429 - 12288: 0xAAED, 12430 - 12288: 0xAAEE, 12431 - 12288: 0xAAEF, 12432 - 12288: 0xAAF0, 12433 - 12288: 0xAAF1, 12434 - 12288: 0xAAF2, 12435 - 12288: 0xAAF3, 12449 - 12288: 0xABA1, 12450 - 12288: 0xABA2, 12451 - 12288: 0xABA3, 12452 - 12288: 0xABA4, 12453 - 12288: 0xABA5, 12454 - 12288: 0xABA6, 12455 - 12288: 0xABA7, 12456 - 12288: 0xABA8, 12457 - 12288: 0xABA9, 12458 - 12288: 0xABAA, 12459 - 12288: 0xABAB, 12460 - 12288: 0xABAC, 12461 - 12288: 0xABAD, 12462 - 12288: 0xABAE, 12463 - 12288: 0xABAF, 12464 - 12288: 0xABB0, 12465 - 12288: 0xABB1, 12466 - 12288: 0xABB2, 12467 - 12288: 0xABB3, 12468 - 12288: 0xABB4, 12469 - 12288: 0xABB5, 12470 - 12288: 0xABB6, 12471 - 12288: 0xABB7, 12472 - 12288: 0xABB8, 12473 - 12288: 0xABB9, 12474 - 12288: 0xABBA, 12475 - 12288: 0xABBB, 12476 - 12288: 0xABBC, 12477 - 12288: 0xABBD, 12478 - 12288: 0xABBE, 12479 - 12288: 0xABBF, 12480 - 12288: 0xABC0, 12481 - 12288: 0xABC1, 12482 - 12288: 0xABC2, 12483 - 12288: 0xABC3, 12484 - 12288: 0xABC4, 12485 - 12288: 0xABC5, 12486 - 12288: 0xABC6, 12487 - 12288: 0xABC7, 12488 - 12288: 0xABC8, 12489 - 12288: 0xABC9, 12490 - 12288: 0xABCA, 12491 - 12288: 0xABCB, 12492 - 12288: 0xABCC, 12493 - 12288: 0xABCD, 12494 - 12288: 0xABCE, 12495 - 12288: 0xABCF, 12496 - 12288: 0xABD0, 12497 - 12288: 0xABD1, 12498 - 12288: 0xABD2, 12499 - 12288: 0xABD3, 12500 - 12288: 0xABD4, 12501 - 12288: 0xABD5, 12502 - 12288: 0xABD6, 12503 - 12288: 0xABD7, 12504 - 12288: 0xABD8, 12505 - 12288: 0xABD9, 12506 - 12288: 0xABDA, 12507 - 12288: 0xABDB, 12508 - 12288: 0xABDC, 12509 - 12288: 0xABDD, 12510 - 12288: 0xABDE, 12511 - 12288: 0xABDF, 12512 - 12288: 0xABE0, 12513 - 12288: 0xABE1, 12514 - 12288: 0xABE2, 12515 - 12288: 0xABE3, 12516 - 12288: 0xABE4, 12517 - 12288: 0xABE5, 12518 - 12288: 0xABE6, 12519 - 12288: 0xABE7, 12520 - 12288: 0xABE8, 12521 - 12288: 0xABE9, 12522 - 12288: 0xABEA, 12523 - 12288: 0xABEB, 12524 - 12288: 0xABEC, 12525 - 12288: 0xABED, 12526 - 12288: 0xABEE, 12527 - 12288: 0xABEF, 12528 - 12288: 0xABF0, 12529 - 12288: 0xABF1, 12530 - 12288: 0xABF2, 12531 - 12288: 0xABF3, 12532 - 12288: 0xABF4, 12533 - 12288: 0xABF5, 12534 - 12288: 0xABF6, 12593 - 12288: 0xA4A1, 12594 - 12288: 0xA4A2, 12595 - 12288: 0xA4A3, 12596 - 12288: 0xA4A4, 12597 - 12288: 0xA4A5, 12598 - 12288: 0xA4A6, 12599 - 12288: 0xA4A7, 12600 - 12288: 0xA4A8, 12601 - 12288: 0xA4A9, 12602 - 12288: 0xA4AA, 12603 - 12288: 0xA4AB, 12604 - 12288: 0xA4AC, 12605 - 12288: 0xA4AD, 12606 - 12288: 0xA4AE, 12607 - 12288: 0xA4AF, 12608 - 12288: 0xA4B0, 12609 - 12288: 0xA4B1, 12610 - 12288: 0xA4B2, 12611 - 12288: 0xA4B3, 12612 - 12288: 0xA4B4, 12613 - 12288: 0xA4B5, 12614 - 12288: 0xA4B6, 12615 - 12288: 0xA4B7, 12616 - 12288: 0xA4B8, 12617 - 12288: 0xA4B9, 12618 - 12288: 0xA4BA, 12619 - 12288: 0xA4BB, 12620 - 12288: 0xA4BC, 12621 - 12288: 0xA4BD, 12622 - 12288: 0xA4BE, 12623 - 12288: 0xA4BF, 12624 - 12288: 0xA4C0, 12625 - 12288: 0xA4C1, 12626 - 12288: 0xA4C2, 12627 - 12288: 0xA4C3, 12628 - 12288: 0xA4C4, 12629 - 12288: 0xA4C5, 12630 - 12288: 0xA4C6, 12631 - 12288: 0xA4C7, 12632 - 12288: 0xA4C8, 12633 - 12288: 0xA4C9, 12634 - 12288: 0xA4CA, 12635 - 12288: 0xA4CB, 12636 - 12288: 0xA4CC, 12637 - 12288: 0xA4CD, 12638 - 12288: 0xA4CE, 12639 - 12288: 0xA4CF, 12640 - 12288: 0xA4D0, 12641 - 12288: 0xA4D1, 12642 - 12288: 0xA4D2, 12643 - 12288: 0xA4D3, 12644 - 12288: 0xA4D4, 12645 - 12288: 0xA4D5, 12646 - 12288: 0xA4D6, 12647 - 12288: 0xA4D7, 12648 - 12288: 0xA4D8, 12649 - 12288: 0xA4D9, 12650 - 12288: 0xA4DA, 12651 - 12288: 0xA4DB, 12652 - 12288: 0xA4DC, 12653 - 12288: 0xA4DD, 12654 - 12288: 0xA4DE, 12655 - 12288: 0xA4DF, 12656 - 12288: 0xA4E0, 12657 - 12288: 0xA4E1, 12658 - 12288: 0xA4E2, 12659 - 12288: 0xA4E3, 12660 - 12288: 0xA4E4, 12661 - 12288: 0xA4E5, 12662 - 12288: 0xA4E6, 12663 - 12288: 0xA4E7, 12664 - 12288: 0xA4E8, 12665 - 12288: 0xA4E9, 12666 - 12288: 0xA4EA, 12667 - 12288: 0xA4EB, 12668 - 12288: 0xA4EC, 12669 - 12288: 0xA4ED, 12670 - 12288: 0xA4EE, 12671 - 12288: 0xA4EF, 12672 - 12288: 0xA4F0, 12673 - 12288: 0xA4F1, 12674 - 12288: 0xA4F2, 12675 - 12288: 0xA4F3, 12676 - 12288: 0xA4F4, 12677 - 12288: 0xA4F5, 12678 - 12288: 0xA4F6, 12679 - 12288: 0xA4F7, 12680 - 12288: 0xA4F8, 12681 - 12288: 0xA4F9, 12682 - 12288: 0xA4FA, 12683 - 12288: 0xA4FB, 12684 - 12288: 0xA4FC, 12685 - 12288: 0xA4FD, 12686 - 12288: 0xA4FE, 12800 - 12288: 0xA9B1, 12801 - 12288: 0xA9B2, 12802 - 12288: 0xA9B3, 12803 - 12288: 0xA9B4, 12804 - 12288: 0xA9B5, 12805 - 12288: 0xA9B6, 12806 - 12288: 0xA9B7, 12807 - 12288: 0xA9B8, 12808 - 12288: 0xA9B9, 12809 - 12288: 0xA9BA, 12810 - 12288: 0xA9BB, 12811 - 12288: 0xA9BC, 12812 - 12288: 0xA9BD, 12813 - 12288: 0xA9BE, 12814 - 12288: 0xA9BF, 12815 - 12288: 0xA9C0, 12816 - 12288: 0xA9C1, 12817 - 12288: 0xA9C2, 12818 - 12288: 0xA9C3, 12819 - 12288: 0xA9C4, 12820 - 12288: 0xA9C5, 12821 - 12288: 0xA9C6, 12822 - 12288: 0xA9C7, 12823 - 12288: 0xA9C8, 12824 - 12288: 0xA9C9, 12825 - 12288: 0xA9CA, 12826 - 12288: 0xA9CB, 12827 - 12288: 0xA9CC, 12828 - 12288: 0xA2DF, 12896 - 12288: 0xA8B1, 12897 - 12288: 0xA8B2, 12898 - 12288: 0xA8B3, 12899 - 12288: 0xA8B4, 12900 - 12288: 0xA8B5, 12901 - 12288: 0xA8B6, 12902 - 12288: 0xA8B7, 12903 - 12288: 0xA8B8, 12904 - 12288: 0xA8B9, 12905 - 12288: 0xA8BA, 12906 - 12288: 0xA8BB, 12907 - 12288: 0xA8BC, 12908 - 12288: 0xA8BD, 12909 - 12288: 0xA8BE, 12910 - 12288: 0xA8BF, 12911 - 12288: 0xA8C0, 12912 - 12288: 0xA8C1, 12913 - 12288: 0xA8C2, 12914 - 12288: 0xA8C3, 12915 - 12288: 0xA8C4, 12916 - 12288: 0xA8C5, 12917 - 12288: 0xA8C6, 12918 - 12288: 0xA8C7, 12919 - 12288: 0xA8C8, 12920 - 12288: 0xA8C9, 12921 - 12288: 0xA8CA, 12922 - 12288: 0xA8CB, 12923 - 12288: 0xA8CC, 12927 - 12288: 0xA2DE, 13184 - 12288: 0xA7C9, 13185 - 12288: 0xA7CA, 13186 - 12288: 0xA7CB, 13187 - 12288: 0xA7CC, 13188 - 12288: 0xA7CD, 13192 - 12288: 0xA7BA, 13193 - 12288: 0xA7BB, 13194 - 12288: 0xA7DC, 13195 - 12288: 0xA7DD, 13196 - 12288: 0xA7DE, 13197 - 12288: 0xA7B6, 13198 - 12288: 0xA7B7, 13199 - 12288: 0xA7B8, 13200 - 12288: 0xA7D4, 13201 - 12288: 0xA7D5, 13202 - 12288: 0xA7D6, 13203 - 12288: 0xA7D7, 13204 - 12288: 0xA7D8, 13205 - 12288: 0xA7A1, 13206 - 12288: 0xA7A2, 13207 - 12288: 0xA7A3, 13208 - 12288: 0xA7A5, 13209 - 12288: 0xA7AB, 13210 - 12288: 0xA7AC, 13211 - 12288: 0xA7AD, 13212 - 12288: 0xA7AE, 13213 - 12288: 0xA7AF, 13214 - 12288: 0xA7B0, 13215 - 12288: 0xA7B1, 13216 - 12288: 0xA7B2, 13217 - 12288: 0xA7B3, 13218 - 12288: 0xA7B4, 13219 - 12288: 0xA7A7, 13220 - 12288: 0xA7A8, 13221 - 12288: 0xA7A9, 13222 - 12288: 0xA7AA, 13223 - 12288: 0xA7BD, 13224 - 12288: 0xA7BE, 13225 - 12288: 0xA7E5, 13226 - 12288: 0xA7E6, 13227 - 12288: 0xA7E7, 13228 - 12288: 0xA7E8, 13229 - 12288: 0xA7E1, 13230 - 12288: 0xA7E2, 13231 - 12288: 0xA7E3, 13232 - 12288: 0xA7BF, 13233 - 12288: 0xA7C0, 13234 - 12288: 0xA7C1, 13235 - 12288: 0xA7C2, 13236 - 12288: 0xA7C3, 13237 - 12288: 0xA7C4, 13238 - 12288: 0xA7C5, 13239 - 12288: 0xA7C6, 13240 - 12288: 0xA7C7, 13241 - 12288: 0xA7C8, 13242 - 12288: 0xA7CE, 13243 - 12288: 0xA7CF, 13244 - 12288: 0xA7D0, 13245 - 12288: 0xA7D1, 13246 - 12288: 0xA7D2, 13247 - 12288: 0xA7D3, 13248 - 12288: 0xA7DA, 13249 - 12288: 0xA7DB, 13250 - 12288: 0xA2E3, 13251 - 12288: 0xA7EC, 13252 - 12288: 0xA7A6, 13253 - 12288: 0xA7E0, 13254 - 12288: 0xA7EF, 13255 - 12288: 0xA2E1, 13256 - 12288: 0xA7BC, 13257 - 12288: 0xA7ED, 13258 - 12288: 0xA7B5, 13263 - 12288: 0xA7B9, 13264 - 12288: 0xA7EA, 13267 - 12288: 0xA7EB, 13270 - 12288: 0xA7DF, 13272 - 12288: 0xA2E4, 13275 - 12288: 0xA7E4, 13276 - 12288: 0xA7EE, 13277 - 12288: 0xA7E9, } const encode4Low, encode4High = 161, 1106 var encode4 = [...]uint16{ 161 - 161: 0xA2AE, 164 - 161: 0xA2B4, 167 - 161: 0xA1D7, 168 - 161: 0xA1A7, 170 - 161: 0xA8A3, 173 - 161: 0xA1A9, 174 - 161: 0xA2E7, 176 - 161: 0xA1C6, 177 - 161: 0xA1BE, 178 - 161: 0xA9F7, 179 - 161: 0xA9F8, 180 - 161: 0xA2A5, 182 - 161: 0xA2D2, 183 - 161: 0xA1A4, 184 - 161: 0xA2AC, 185 - 161: 0xA9F6, 186 - 161: 0xA8AC, 188 - 161: 0xA8F9, 189 - 161: 0xA8F6, 190 - 161: 0xA8FA, 191 - 161: 0xA2AF, 198 - 161: 0xA8A1, 208 - 161: 0xA8A2, 215 - 161: 0xA1BF, 216 - 161: 0xA8AA, 222 - 161: 0xA8AD, 223 - 161: 0xA9AC, 230 - 161: 0xA9A1, 240 - 161: 0xA9A3, 247 - 161: 0xA1C0, 248 - 161: 0xA9AA, 254 - 161: 0xA9AD, 273 - 161: 0xA9A2, 294 - 161: 0xA8A4, 295 - 161: 0xA9A4, 305 - 161: 0xA9A5, 306 - 161: 0xA8A6, 307 - 161: 0xA9A6, 312 - 161: 0xA9A7, 319 - 161: 0xA8A8, 320 - 161: 0xA9A8, 321 - 161: 0xA8A9, 322 - 161: 0xA9A9, 329 - 161: 0xA9B0, 330 - 161: 0xA8AF, 331 - 161: 0xA9AF, 338 - 161: 0xA8AB, 339 - 161: 0xA9AB, 358 - 161: 0xA8AE, 359 - 161: 0xA9AE, 711 - 161: 0xA2A7, 720 - 161: 0xA2B0, 728 - 161: 0xA2A8, 729 - 161: 0xA2AB, 730 - 161: 0xA2AA, 731 - 161: 0xA2AD, 733 - 161: 0xA2A9, 913 - 161: 0xA5C1, 914 - 161: 0xA5C2, 915 - 161: 0xA5C3, 916 - 161: 0xA5C4, 917 - 161: 0xA5C5, 918 - 161: 0xA5C6, 919 - 161: 0xA5C7, 920 - 161: 0xA5C8, 921 - 161: 0xA5C9, 922 - 161: 0xA5CA, 923 - 161: 0xA5CB, 924 - 161: 0xA5CC, 925 - 161: 0xA5CD, 926 - 161: 0xA5CE, 927 - 161: 0xA5CF, 928 - 161: 0xA5D0, 929 - 161: 0xA5D1, 931 - 161: 0xA5D2, 932 - 161: 0xA5D3, 933 - 161: 0xA5D4, 934 - 161: 0xA5D5, 935 - 161: 0xA5D6, 936 - 161: 0xA5D7, 937 - 161: 0xA5D8, 945 - 161: 0xA5E1, 946 - 161: 0xA5E2, 947 - 161: 0xA5E3, 948 - 161: 0xA5E4, 949 - 161: 0xA5E5, 950 - 161: 0xA5E6, 951 - 161: 0xA5E7, 952 - 161: 0xA5E8, 953 - 161: 0xA5E9, 954 - 161: 0xA5EA, 955 - 161: 0xA5EB, 956 - 161: 0xA5EC, 957 - 161: 0xA5ED, 958 - 161: 0xA5EE, 959 - 161: 0xA5EF, 960 - 161: 0xA5F0, 961 - 161: 0xA5F1, 963 - 161: 0xA5F2, 964 - 161: 0xA5F3, 965 - 161: 0xA5F4, 966 - 161: 0xA5F5, 967 - 161: 0xA5F6, 968 - 161: 0xA5F7, 969 - 161: 0xA5F8, 1025 - 161: 0xACA7, 1040 - 161: 0xACA1, 1041 - 161: 0xACA2, 1042 - 161: 0xACA3, 1043 - 161: 0xACA4, 1044 - 161: 0xACA5, 1045 - 161: 0xACA6, 1046 - 161: 0xACA8, 1047 - 161: 0xACA9, 1048 - 161: 0xACAA, 1049 - 161: 0xACAB, 1050 - 161: 0xACAC, 1051 - 161: 0xACAD, 1052 - 161: 0xACAE, 1053 - 161: 0xACAF, 1054 - 161: 0xACB0, 1055 - 161: 0xACB1, 1056 - 161: 0xACB2, 1057 - 161: 0xACB3, 1058 - 161: 0xACB4, 1059 - 161: 0xACB5, 1060 - 161: 0xACB6, 1061 - 161: 0xACB7, 1062 - 161: 0xACB8, 1063 - 161: 0xACB9, 1064 - 161: 0xACBA, 1065 - 161: 0xACBB, 1066 - 161: 0xACBC, 1067 - 161: 0xACBD, 1068 - 161: 0xACBE, 1069 - 161: 0xACBF, 1070 - 161: 0xACC0, 1071 - 161: 0xACC1, 1072 - 161: 0xACD1, 1073 - 161: 0xACD2, 1074 - 161: 0xACD3, 1075 - 161: 0xACD4, 1076 - 161: 0xACD5, 1077 - 161: 0xACD6, 1078 - 161: 0xACD8, 1079 - 161: 0xACD9, 1080 - 161: 0xACDA, 1081 - 161: 0xACDB, 1082 - 161: 0xACDC, 1083 - 161: 0xACDD, 1084 - 161: 0xACDE, 1085 - 161: 0xACDF, 1086 - 161: 0xACE0, 1087 - 161: 0xACE1, 1088 - 161: 0xACE2, 1089 - 161: 0xACE3, 1090 - 161: 0xACE4, 1091 - 161: 0xACE5, 1092 - 161: 0xACE6, 1093 - 161: 0xACE7, 1094 - 161: 0xACE8, 1095 - 161: 0xACE9, 1096 - 161: 0xACEA, 1097 - 161: 0xACEB, 1098 - 161: 0xACEC, 1099 - 161: 0xACED, 1100 - 161: 0xACEE, 1101 - 161: 0xACEF, 1102 - 161: 0xACF0, 1103 - 161: 0xACF1, 1105 - 161: 0xACD7, } const encode5Low, encode5High = 63744, 64012 var encode5 = [...]uint16{ 63744 - 63744: 0xCBD0, 63745 - 63744: 0xCBD6, 63746 - 63744: 0xCBE7, 63747 - 63744: 0xCDCF, 63748 - 63744: 0xCDE8, 63749 - 63744: 0xCEAD, 63750 - 63744: 0xCFFB, 63751 - 63744: 0xD0A2, 63752 - 63744: 0xD0B8, 63753 - 63744: 0xD0D0, 63754 - 63744: 0xD0DD, 63755 - 63744: 0xD1D4, 63756 - 63744: 0xD1D5, 63757 - 63744: 0xD1D8, 63758 - 63744: 0xD1DB, 63759 - 63744: 0xD1DC, 63760 - 63744: 0xD1DD, 63761 - 63744: 0xD1DE, 63762 - 63744: 0xD1DF, 63763 - 63744: 0xD1E0, 63764 - 63744: 0xD1E2, 63765 - 63744: 0xD1E3, 63766 - 63744: 0xD1E4, 63767 - 63744: 0xD1E5, 63768 - 63744: 0xD1E6, 63769 - 63744: 0xD1E8, 63770 - 63744: 0xD1E9, 63771 - 63744: 0xD1EA, 63772 - 63744: 0xD1EB, 63773 - 63744: 0xD1ED, 63774 - 63744: 0xD1EF, 63775 - 63744: 0xD1F0, 63776 - 63744: 0xD1F2, 63777 - 63744: 0xD1F6, 63778 - 63744: 0xD1FA, 63779 - 63744: 0xD1FC, 63780 - 63744: 0xD1FD, 63781 - 63744: 0xD1FE, 63782 - 63744: 0xD2A2, 63783 - 63744: 0xD2A3, 63784 - 63744: 0xD2A7, 63785 - 63744: 0xD2A8, 63786 - 63744: 0xD2A9, 63787 - 63744: 0xD2AA, 63788 - 63744: 0xD2AB, 63789 - 63744: 0xD2AD, 63790 - 63744: 0xD2B2, 63791 - 63744: 0xD2BE, 63792 - 63744: 0xD2C2, 63793 - 63744: 0xD2C3, 63794 - 63744: 0xD2C4, 63795 - 63744: 0xD2C6, 63796 - 63744: 0xD2C7, 63797 - 63744: 0xD2C8, 63798 - 63744: 0xD2C9, 63799 - 63744: 0xD2CA, 63800 - 63744: 0xD2CB, 63801 - 63744: 0xD2CD, 63802 - 63744: 0xD2CE, 63803 - 63744: 0xD2CF, 63804 - 63744: 0xD2D0, 63805 - 63744: 0xD2D1, 63806 - 63744: 0xD2D2, 63807 - 63744: 0xD2D3, 63808 - 63744: 0xD2D4, 63809 - 63744: 0xD2D5, 63810 - 63744: 0xD2D6, 63811 - 63744: 0xD2D7, 63812 - 63744: 0xD2D9, 63813 - 63744: 0xD2DA, 63814 - 63744: 0xD2DE, 63815 - 63744: 0xD2DF, 63816 - 63744: 0xD2E1, 63817 - 63744: 0xD2E2, 63818 - 63744: 0xD2E4, 63819 - 63744: 0xD2E5, 63820 - 63744: 0xD2E6, 63821 - 63744: 0xD2E7, 63822 - 63744: 0xD2E8, 63823 - 63744: 0xD2E9, 63824 - 63744: 0xD2EA, 63825 - 63744: 0xD2EB, 63826 - 63744: 0xD2F0, 63827 - 63744: 0xD2F1, 63828 - 63744: 0xD2F2, 63829 - 63744: 0xD2F3, 63830 - 63744: 0xD2F4, 63831 - 63744: 0xD2F5, 63832 - 63744: 0xD2F7, 63833 - 63744: 0xD2F8, 63834 - 63744: 0xD4E6, 63835 - 63744: 0xD4FC, 63836 - 63744: 0xD5A5, 63837 - 63744: 0xD5AB, 63838 - 63744: 0xD5AE, 63839 - 63744: 0xD6B8, 63840 - 63744: 0xD6CD, 63841 - 63744: 0xD7CB, 63842 - 63744: 0xD7E4, 63843 - 63744: 0xDBC5, 63844 - 63744: 0xDBE4, 63845 - 63744: 0xDCA5, 63846 - 63744: 0xDDA5, 63847 - 63744: 0xDDD5, 63848 - 63744: 0xDDF4, 63849 - 63744: 0xDEFC, 63850 - 63744: 0xDEFE, 63851 - 63744: 0xDFB3, 63852 - 63744: 0xDFE1, 63853 - 63744: 0xDFE8, 63854 - 63744: 0xE0F1, 63855 - 63744: 0xE1AD, 63856 - 63744: 0xE1ED, 63857 - 63744: 0xE3F5, 63858 - 63744: 0xE4A1, 63859 - 63744: 0xE4A9, 63860 - 63744: 0xE5AE, 63861 - 63744: 0xE5B1, 63862 - 63744: 0xE5B2, 63863 - 63744: 0xE5B9, 63864 - 63744: 0xE5BB, 63865 - 63744: 0xE5BC, 63866 - 63744: 0xE5C4, 63867 - 63744: 0xE5CE, 63868 - 63744: 0xE5D0, 63869 - 63744: 0xE5D2, 63870 - 63744: 0xE5D6, 63871 - 63744: 0xE5FA, 63872 - 63744: 0xE5FB, 63873 - 63744: 0xE5FC, 63874 - 63744: 0xE5FE, 63875 - 63744: 0xE6A1, 63876 - 63744: 0xE6A4, 63877 - 63744: 0xE6A7, 63878 - 63744: 0xE6AD, 63879 - 63744: 0xE6AF, 63880 - 63744: 0xE6B0, 63881 - 63744: 0xE6B1, 63882 - 63744: 0xE6B3, 63883 - 63744: 0xE6B7, 63884 - 63744: 0xE6B8, 63885 - 63744: 0xE6BC, 63886 - 63744: 0xE6C4, 63887 - 63744: 0xE6C6, 63888 - 63744: 0xE6C7, 63889 - 63744: 0xE6CA, 63890 - 63744: 0xE6D2, 63891 - 63744: 0xE6D6, 63892 - 63744: 0xE6D9, 63893 - 63744: 0xE6DC, 63894 - 63744: 0xE6DF, 63895 - 63744: 0xE6E1, 63896 - 63744: 0xE6E4, 63897 - 63744: 0xE6E5, 63898 - 63744: 0xE6E6, 63899 - 63744: 0xE6E8, 63900 - 63744: 0xE6EA, 63901 - 63744: 0xE6EB, 63902 - 63744: 0xE6EC, 63903 - 63744: 0xE6EF, 63904 - 63744: 0xE6F1, 63905 - 63744: 0xE6F2, 63906 - 63744: 0xE6F5, 63907 - 63744: 0xE6F6, 63908 - 63744: 0xE6F7, 63909 - 63744: 0xE6F9, 63910 - 63744: 0xE7A1, 63911 - 63744: 0xE7A6, 63912 - 63744: 0xE7A9, 63913 - 63744: 0xE7AA, 63914 - 63744: 0xE7AC, 63915 - 63744: 0xE7AD, 63916 - 63744: 0xE7B0, 63917 - 63744: 0xE7BF, 63918 - 63744: 0xE7C1, 63919 - 63744: 0xE7C6, 63920 - 63744: 0xE7C7, 63921 - 63744: 0xE7CB, 63922 - 63744: 0xE7CD, 63923 - 63744: 0xE7CF, 63924 - 63744: 0xE7D0, 63925 - 63744: 0xE7D3, 63926 - 63744: 0xE7DF, 63927 - 63744: 0xE7E4, 63928 - 63744: 0xE7E6, 63929 - 63744: 0xE7F7, 63930 - 63744: 0xE8E7, 63931 - 63744: 0xE8E8, 63932 - 63744: 0xE8F0, 63933 - 63744: 0xE8F1, 63934 - 63744: 0xE8F7, 63935 - 63744: 0xE8F9, 63936 - 63744: 0xE8FB, 63937 - 63744: 0xE8FE, 63938 - 63744: 0xE9A7, 63939 - 63744: 0xE9AC, 63940 - 63744: 0xE9CC, 63941 - 63744: 0xE9F7, 63942 - 63744: 0xEAC1, 63943 - 63744: 0xEAE5, 63944 - 63744: 0xEAF4, 63945 - 63744: 0xEAF7, 63946 - 63744: 0xEAFC, 63947 - 63744: 0xEAFE, 63948 - 63744: 0xEBA4, 63949 - 63744: 0xEBA7, 63950 - 63744: 0xEBA9, 63951 - 63744: 0xEBAA, 63952 - 63744: 0xEBBA, 63953 - 63744: 0xEBBB, 63954 - 63744: 0xEBBD, 63955 - 63744: 0xEBC1, 63956 - 63744: 0xEBC2, 63957 - 63744: 0xEBC6, 63958 - 63744: 0xEBC7, 63959 - 63744: 0xEBCC, 63960 - 63744: 0xEBCF, 63961 - 63744: 0xEBD0, 63962 - 63744: 0xEBD1, 63963 - 63744: 0xEBD2, 63964 - 63744: 0xEBD8, 63965 - 63744: 0xECA6, 63966 - 63744: 0xECA7, 63967 - 63744: 0xECAA, 63968 - 63744: 0xECAF, 63969 - 63744: 0xECB0, 63970 - 63744: 0xECB1, 63971 - 63744: 0xECB2, 63972 - 63744: 0xECB5, 63973 - 63744: 0xECB8, 63974 - 63744: 0xECBA, 63975 - 63744: 0xECC0, 63976 - 63744: 0xECC1, 63977 - 63744: 0xECC5, 63978 - 63744: 0xECC6, 63979 - 63744: 0xECC9, 63980 - 63744: 0xECCA, 63981 - 63744: 0xECD5, 63982 - 63744: 0xECDD, 63983 - 63744: 0xECDE, 63984 - 63744: 0xECE1, 63985 - 63744: 0xECE4, 63986 - 63744: 0xECE7, 63987 - 63744: 0xECE8, 63988 - 63744: 0xECF7, 63989 - 63744: 0xECF8, 63990 - 63744: 0xECFA, 63991 - 63744: 0xEDA1, 63992 - 63744: 0xEDA2, 63993 - 63744: 0xEDA3, 63994 - 63744: 0xEDEE, 63995 - 63744: 0xEEDB, 63996 - 63744: 0xF2BD, 63997 - 63744: 0xF2FA, 63998 - 63744: 0xF3B1, 63999 - 63744: 0xF4A7, 64000 - 63744: 0xF4EE, 64001 - 63744: 0xF6F4, 64002 - 63744: 0xF6F6, 64003 - 63744: 0xF7B8, 64004 - 63744: 0xF7C8, 64005 - 63744: 0xF7D3, 64006 - 63744: 0xF8DB, 64007 - 63744: 0xF8F0, 64008 - 63744: 0xFAA1, 64009 - 63744: 0xFAA2, 64010 - 63744: 0xFAE6, 64011 - 63744: 0xFCA9, } const encode6Low, encode6High = 65281, 65511 var encode6 = [...]uint16{ 65281 - 65281: 0xA3A1, 65282 - 65281: 0xA3A2, 65283 - 65281: 0xA3A3, 65284 - 65281: 0xA3A4, 65285 - 65281: 0xA3A5, 65286 - 65281: 0xA3A6, 65287 - 65281: 0xA3A7, 65288 - 65281: 0xA3A8, 65289 - 65281: 0xA3A9, 65290 - 65281: 0xA3AA, 65291 - 65281: 0xA3AB, 65292 - 65281: 0xA3AC, 65293 - 65281: 0xA3AD, 65294 - 65281: 0xA3AE, 65295 - 65281: 0xA3AF, 65296 - 65281: 0xA3B0, 65297 - 65281: 0xA3B1, 65298 - 65281: 0xA3B2, 65299 - 65281: 0xA3B3, 65300 - 65281: 0xA3B4, 65301 - 65281: 0xA3B5, 65302 - 65281: 0xA3B6, 65303 - 65281: 0xA3B7, 65304 - 65281: 0xA3B8, 65305 - 65281: 0xA3B9, 65306 - 65281: 0xA3BA, 65307 - 65281: 0xA3BB, 65308 - 65281: 0xA3BC, 65309 - 65281: 0xA3BD, 65310 - 65281: 0xA3BE, 65311 - 65281: 0xA3BF, 65312 - 65281: 0xA3C0, 65313 - 65281: 0xA3C1, 65314 - 65281: 0xA3C2, 65315 - 65281: 0xA3C3, 65316 - 65281: 0xA3C4, 65317 - 65281: 0xA3C5, 65318 - 65281: 0xA3C6, 65319 - 65281: 0xA3C7, 65320 - 65281: 0xA3C8, 65321 - 65281: 0xA3C9, 65322 - 65281: 0xA3CA, 65323 - 65281: 0xA3CB, 65324 - 65281: 0xA3CC, 65325 - 65281: 0xA3CD, 65326 - 65281: 0xA3CE, 65327 - 65281: 0xA3CF, 65328 - 65281: 0xA3D0, 65329 - 65281: 0xA3D1, 65330 - 65281: 0xA3D2, 65331 - 65281: 0xA3D3, 65332 - 65281: 0xA3D4, 65333 - 65281: 0xA3D5, 65334 - 65281: 0xA3D6, 65335 - 65281: 0xA3D7, 65336 - 65281: 0xA3D8, 65337 - 65281: 0xA3D9, 65338 - 65281: 0xA3DA, 65339 - 65281: 0xA3DB, 65340 - 65281: 0xA1AC, 65341 - 65281: 0xA3DD, 65342 - 65281: 0xA3DE, 65343 - 65281: 0xA3DF, 65344 - 65281: 0xA3E0, 65345 - 65281: 0xA3E1, 65346 - 65281: 0xA3E2, 65347 - 65281: 0xA3E3, 65348 - 65281: 0xA3E4, 65349 - 65281: 0xA3E5, 65350 - 65281: 0xA3E6, 65351 - 65281: 0xA3E7, 65352 - 65281: 0xA3E8, 65353 - 65281: 0xA3E9, 65354 - 65281: 0xA3EA, 65355 - 65281: 0xA3EB, 65356 - 65281: 0xA3EC, 65357 - 65281: 0xA3ED, 65358 - 65281: 0xA3EE, 65359 - 65281: 0xA3EF, 65360 - 65281: 0xA3F0, 65361 - 65281: 0xA3F1, 65362 - 65281: 0xA3F2, 65363 - 65281: 0xA3F3, 65364 - 65281: 0xA3F4, 65365 - 65281: 0xA3F5, 65366 - 65281: 0xA3F6, 65367 - 65281: 0xA3F7, 65368 - 65281: 0xA3F8, 65369 - 65281: 0xA3F9, 65370 - 65281: 0xA3FA, 65371 - 65281: 0xA3FB, 65372 - 65281: 0xA3FC, 65373 - 65281: 0xA3FD, 65374 - 65281: 0xA2A6, 65504 - 65281: 0xA1CB, 65505 - 65281: 0xA1CC, 65506 - 65281: 0xA1FE, 65507 - 65281: 0xA3FE, 65509 - 65281: 0xA1CD, 65510 - 65281: 0xA3DC, } ================================================ FILE: vendor/golang.org/x/text/encoding/simplifiedchinese/all.go ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package simplifiedchinese import ( "golang.org/x/text/encoding" ) // All is a list of all defined encodings in this package. var All = []encoding.Encoding{GB18030, GBK, HZGB2312} ================================================ FILE: vendor/golang.org/x/text/encoding/simplifiedchinese/gbk.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package simplifiedchinese import ( "errors" "unicode/utf8" "golang.org/x/text/encoding" "golang.org/x/text/encoding/internal" "golang.org/x/text/encoding/internal/identifier" "golang.org/x/text/transform" ) var ( // GB18030 is the GB18030 encoding. GB18030 encoding.Encoding = &gbk18030 // GBK is the GBK encoding. It encodes an extension of the GB2312 character set // and is also known as Code Page 936. GBK encoding.Encoding = &gbk ) var gbk = internal.Encoding{ &internal.SimpleEncoding{ gbkDecoder{gb18030: false}, gbkEncoder{gb18030: false}, }, "GBK", identifier.GBK, } var gbk18030 = internal.Encoding{ &internal.SimpleEncoding{ gbkDecoder{gb18030: true}, gbkEncoder{gb18030: true}, }, "GB18030", identifier.GB18030, } var ( errInvalidGB18030 = errors.New("simplifiedchinese: invalid GB18030 encoding") errInvalidGBK = errors.New("simplifiedchinese: invalid GBK encoding") ) type gbkDecoder struct { transform.NopResetter gb18030 bool } func (d gbkDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { r, size := rune(0), 0 loop: for ; nSrc < len(src); nSrc += size { switch c0 := src[nSrc]; { case c0 < utf8.RuneSelf: r, size = rune(c0), 1 // Microsoft's Code Page 936 extends GBK 1.0 to encode the euro sign U+20AC // as 0x80. The HTML5 specification at http://encoding.spec.whatwg.org/#gbk // says to treat "gbk" as Code Page 936. case c0 == 0x80: r, size = '€', 1 case c0 < 0xff: if nSrc+1 >= len(src) { err = transform.ErrShortSrc break loop } c1 := src[nSrc+1] switch { case 0x40 <= c1 && c1 < 0x7f: c1 -= 0x40 case 0x80 <= c1 && c1 < 0xff: c1 -= 0x41 case d.gb18030 && 0x30 <= c1 && c1 < 0x40: if nSrc+3 >= len(src) { err = transform.ErrShortSrc break loop } c2 := src[nSrc+2] if c2 < 0x81 || 0xff <= c2 { err = errInvalidGB18030 break loop } c3 := src[nSrc+3] if c3 < 0x30 || 0x3a <= c3 { err = errInvalidGB18030 break loop } size = 4 r = ((rune(c0-0x81)*10+rune(c1-0x30))*126+rune(c2-0x81))*10 + rune(c3-0x30) if r < 39420 { i, j := 0, len(gb18030) for i < j { h := i + (j-i)/2 if r >= rune(gb18030[h][0]) { i = h + 1 } else { j = h } } dec := &gb18030[i-1] r += rune(dec[1]) - rune(dec[0]) goto write } r -= 189000 if 0 <= r && r < 0x100000 { r += 0x10000 goto write } err = errInvalidGB18030 break loop default: if d.gb18030 { err = errInvalidGB18030 } else { err = errInvalidGBK } break loop } r, size = '\ufffd', 2 if i := int(c0-0x81)*190 + int(c1); i < len(decode) { r = rune(decode[i]) if r == 0 { r = '\ufffd' } } default: if d.gb18030 { err = errInvalidGB18030 } else { err = errInvalidGBK } break loop } write: if nDst+utf8.RuneLen(r) > len(dst) { err = transform.ErrShortDst break loop } nDst += utf8.EncodeRune(dst[nDst:], r) } if atEOF && err == transform.ErrShortSrc { if d.gb18030 { err = errInvalidGB18030 } else { err = errInvalidGBK } } return nDst, nSrc, err } type gbkEncoder struct { transform.NopResetter gb18030 bool } func (e gbkEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { r, r2, size := rune(0), rune(0), 0 for ; nSrc < len(src); nSrc += size { r = rune(src[nSrc]) // Decode a 1-byte rune. if r < utf8.RuneSelf { size = 1 } else { // Decode a multi-byte rune. r, size = utf8.DecodeRune(src[nSrc:]) if size == 1 { // All valid runes of size 1 (those below utf8.RuneSelf) were // handled above. We have invalid UTF-8 or we haven't seen the // full character yet. if !atEOF && !utf8.FullRune(src[nSrc:]) { err = transform.ErrShortSrc break } } // func init checks that the switch covers all tables. switch { case encode0Low <= r && r < encode0High: if r2 = rune(encode0[r-encode0Low]); r2 != 0 { goto write2 } case encode1Low <= r && r < encode1High: // Microsoft's Code Page 936 extends GBK 1.0 to encode the euro sign U+20AC // as 0x80. The HTML5 specification at http://encoding.spec.whatwg.org/#gbk // says to treat "gbk" as Code Page 936. if r == '€' { r = 0x80 goto write1 } if r2 = rune(encode1[r-encode1Low]); r2 != 0 { goto write2 } case encode2Low <= r && r < encode2High: if r2 = rune(encode2[r-encode2Low]); r2 != 0 { goto write2 } case encode3Low <= r && r < encode3High: if r2 = rune(encode3[r-encode3Low]); r2 != 0 { goto write2 } case encode4Low <= r && r < encode4High: if r2 = rune(encode4[r-encode4Low]); r2 != 0 { goto write2 } } if e.gb18030 { if r < 0x10000 { i, j := 0, len(gb18030) for i < j { h := i + (j-i)/2 if r >= rune(gb18030[h][1]) { i = h + 1 } else { j = h } } dec := &gb18030[i-1] r += rune(dec[0]) - rune(dec[1]) goto write4 } else if r < 0x110000 { r += 189000 - 0x10000 goto write4 } } err = internal.ErrASCIIReplacement break } write1: if nDst >= len(dst) { err = transform.ErrShortDst break } dst[nDst] = uint8(r) nDst++ continue write2: if nDst+2 > len(dst) { err = transform.ErrShortDst break } dst[nDst+0] = uint8(r2 >> 8) dst[nDst+1] = uint8(r2) nDst += 2 continue write4: if nDst+4 > len(dst) { err = transform.ErrShortDst break } dst[nDst+3] = uint8(r%10 + 0x30) r /= 10 dst[nDst+2] = uint8(r%126 + 0x81) r /= 126 dst[nDst+1] = uint8(r%10 + 0x30) r /= 10 dst[nDst+0] = uint8(r + 0x81) nDst += 4 continue } return nDst, nSrc, err } func init() { // Check that the hard-coded encode switch covers all tables. if numEncodeTables != 5 { panic("bad numEncodeTables") } } ================================================ FILE: vendor/golang.org/x/text/encoding/simplifiedchinese/hzgb2312.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package simplifiedchinese import ( "errors" "unicode/utf8" "golang.org/x/text/encoding" "golang.org/x/text/encoding/internal" "golang.org/x/text/encoding/internal/identifier" "golang.org/x/text/transform" ) // HZGB2312 is the HZ-GB2312 encoding. var HZGB2312 encoding.Encoding = &hzGB2312 var hzGB2312 = internal.Encoding{ internal.FuncEncoding{hzGB2312NewDecoder, hzGB2312NewEncoder}, "HZ-GB2312", identifier.HZGB2312, } func hzGB2312NewDecoder() transform.Transformer { return new(hzGB2312Decoder) } func hzGB2312NewEncoder() transform.Transformer { return new(hzGB2312Encoder) } var errInvalidHZGB2312 = errors.New("simplifiedchinese: invalid HZ-GB2312 encoding") const ( asciiState = iota gbState ) type hzGB2312Decoder int func (d *hzGB2312Decoder) Reset() { *d = asciiState } func (d *hzGB2312Decoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { r, size := rune(0), 0 loop: for ; nSrc < len(src); nSrc += size { c0 := src[nSrc] if c0 >= utf8.RuneSelf { err = errInvalidHZGB2312 break loop } if c0 == '~' { if nSrc+1 >= len(src) { err = transform.ErrShortSrc break loop } size = 2 switch src[nSrc+1] { case '{': *d = gbState continue case '}': *d = asciiState continue case '~': if nDst >= len(dst) { err = transform.ErrShortDst break loop } dst[nDst] = '~' nDst++ continue case '\n': continue default: err = errInvalidHZGB2312 break loop } } if *d == asciiState { r, size = rune(c0), 1 } else { if nSrc+1 >= len(src) { err = transform.ErrShortSrc break loop } c1 := src[nSrc+1] if c0 < 0x21 || 0x7e <= c0 || c1 < 0x21 || 0x7f <= c1 { err = errInvalidHZGB2312 break loop } r, size = '\ufffd', 2 if i := int(c0-0x01)*190 + int(c1+0x3f); i < len(decode) { r = rune(decode[i]) if r == 0 { r = '\ufffd' } } } if nDst+utf8.RuneLen(r) > len(dst) { err = transform.ErrShortDst break loop } nDst += utf8.EncodeRune(dst[nDst:], r) } if atEOF && err == transform.ErrShortSrc { err = errInvalidHZGB2312 } return nDst, nSrc, err } type hzGB2312Encoder int func (d *hzGB2312Encoder) Reset() { *d = asciiState } func (e *hzGB2312Encoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { r, size := rune(0), 0 for ; nSrc < len(src); nSrc += size { r = rune(src[nSrc]) // Decode a 1-byte rune. if r < utf8.RuneSelf { size = 1 if r == '~' { if nDst+2 > len(dst) { err = transform.ErrShortDst break } dst[nDst+0] = '~' dst[nDst+1] = '~' nDst += 2 continue } else if *e != asciiState { if nDst+3 > len(dst) { err = transform.ErrShortDst break } *e = asciiState dst[nDst+0] = '~' dst[nDst+1] = '}' nDst += 2 } else if nDst >= len(dst) { err = transform.ErrShortDst break } dst[nDst] = uint8(r) nDst += 1 continue } // Decode a multi-byte rune. r, size = utf8.DecodeRune(src[nSrc:]) if size == 1 { // All valid runes of size 1 (those below utf8.RuneSelf) were // handled above. We have invalid UTF-8 or we haven't seen the // full character yet. if !atEOF && !utf8.FullRune(src[nSrc:]) { err = transform.ErrShortSrc break } } // func init checks that the switch covers all tables. switch { case encode0Low <= r && r < encode0High: if r = rune(encode0[r-encode0Low]); r != 0 { goto writeGB } case encode1Low <= r && r < encode1High: if r = rune(encode1[r-encode1Low]); r != 0 { goto writeGB } case encode2Low <= r && r < encode2High: if r = rune(encode2[r-encode2Low]); r != 0 { goto writeGB } case encode3Low <= r && r < encode3High: if r = rune(encode3[r-encode3Low]); r != 0 { goto writeGB } case encode4Low <= r && r < encode4High: if r = rune(encode4[r-encode4Low]); r != 0 { goto writeGB } } terminateInASCIIState: // Switch back to ASCII state in case of error so that an ASCII // replacement character can be written in the correct state. if *e != asciiState { if nDst+2 > len(dst) { err = transform.ErrShortDst break } dst[nDst+0] = '~' dst[nDst+1] = '}' nDst += 2 } err = internal.ErrASCIIReplacement break writeGB: c0 := uint8(r>>8) - 0x80 c1 := uint8(r) - 0x80 if c0 < 0x21 || 0x7e <= c0 || c1 < 0x21 || 0x7f <= c1 { goto terminateInASCIIState } if *e == asciiState { if nDst+4 > len(dst) { err = transform.ErrShortDst break } *e = gbState dst[nDst+0] = '~' dst[nDst+1] = '{' nDst += 2 } else if nDst+2 > len(dst) { err = transform.ErrShortDst break } dst[nDst+0] = c0 dst[nDst+1] = c1 nDst += 2 continue } // TODO: should one always terminate in ASCII state to make it safe to // concatenate two HZ-GB2312-encoded strings? return nDst, nSrc, err } ================================================ FILE: vendor/golang.org/x/text/encoding/simplifiedchinese/maketables.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build ignore package main // This program generates tables.go: // go run maketables.go | gofmt > tables.go import ( "bufio" "fmt" "log" "net/http" "sort" "strings" ) func main() { fmt.Printf("// generated by go run maketables.go; DO NOT EDIT\n\n") fmt.Printf("// Package simplifiedchinese provides Simplified Chinese encodings such as GBK.\n") fmt.Printf(`package simplifiedchinese // import "golang.org/x/text/encoding/simplifiedchinese"` + "\n\n") printGB18030() printGBK() } func printGB18030() { res, err := http.Get("http://encoding.spec.whatwg.org/index-gb18030.txt") if err != nil { log.Fatalf("Get: %v", err) } defer res.Body.Close() fmt.Printf("// gb18030 is the table from http://encoding.spec.whatwg.org/index-gb18030.txt\n") fmt.Printf("var gb18030 = [...][2]uint16{\n") scanner := bufio.NewScanner(res.Body) for scanner.Scan() { s := strings.TrimSpace(scanner.Text()) if s == "" || s[0] == '#' { continue } x, y := uint32(0), uint32(0) if _, err := fmt.Sscanf(s, "%d 0x%x", &x, &y); err != nil { log.Fatalf("could not parse %q", s) } if x < 0x10000 && y < 0x10000 { fmt.Printf("\t{0x%04x, 0x%04x},\n", x, y) } } fmt.Printf("}\n\n") } func printGBK() { res, err := http.Get("http://encoding.spec.whatwg.org/index-gbk.txt") if err != nil { log.Fatalf("Get: %v", err) } defer res.Body.Close() mapping := [65536]uint16{} reverse := [65536]uint16{} scanner := bufio.NewScanner(res.Body) for scanner.Scan() { s := strings.TrimSpace(scanner.Text()) if s == "" || s[0] == '#' { continue } x, y := uint16(0), uint16(0) if _, err := fmt.Sscanf(s, "%d 0x%x", &x, &y); err != nil { log.Fatalf("could not parse %q", s) } if x < 0 || 126*190 <= x { log.Fatalf("GBK code %d is out of range", x) } mapping[x] = y if reverse[y] == 0 { c0, c1 := x/190, x%190 if c1 >= 0x3f { c1++ } reverse[y] = (0x81+c0)<<8 | (0x40 + c1) } } if err := scanner.Err(); err != nil { log.Fatalf("scanner error: %v", err) } fmt.Printf("// decode is the decoding table from GBK code to Unicode.\n") fmt.Printf("// It is defined at http://encoding.spec.whatwg.org/index-gbk.txt\n") fmt.Printf("var decode = [...]uint16{\n") for i, v := range mapping { if v != 0 { fmt.Printf("\t%d: 0x%04X,\n", i, v) } } fmt.Printf("}\n\n") // Any run of at least separation continuous zero entries in the reverse map will // be a separate encode table. const separation = 1024 intervals := []interval(nil) low, high := -1, -1 for i, v := range reverse { if v == 0 { continue } if low < 0 { low = i } else if i-high >= separation { if high >= 0 { intervals = append(intervals, interval{low, high}) } low = i } high = i + 1 } if high >= 0 { intervals = append(intervals, interval{low, high}) } sort.Sort(byDecreasingLength(intervals)) fmt.Printf("const numEncodeTables = %d\n\n", len(intervals)) fmt.Printf("// encodeX are the encoding tables from Unicode to GBK code,\n") fmt.Printf("// sorted by decreasing length.\n") for i, v := range intervals { fmt.Printf("// encode%d: %5d entries for runes in [%5d, %5d).\n", i, v.len(), v.low, v.high) } fmt.Printf("\n") for i, v := range intervals { fmt.Printf("const encode%dLow, encode%dHigh = %d, %d\n\n", i, i, v.low, v.high) fmt.Printf("var encode%d = [...]uint16{\n", i) for j := v.low; j < v.high; j++ { x := reverse[j] if x == 0 { continue } fmt.Printf("\t%d-%d: 0x%04X,\n", j, v.low, x) } fmt.Printf("}\n\n") } } // interval is a half-open interval [low, high). type interval struct { low, high int } func (i interval) len() int { return i.high - i.low } // byDecreasingLength sorts intervals by decreasing length. type byDecreasingLength []interval func (b byDecreasingLength) Len() int { return len(b) } func (b byDecreasingLength) Less(i, j int) bool { return b[i].len() > b[j].len() } func (b byDecreasingLength) Swap(i, j int) { b[i], b[j] = b[j], b[i] } ================================================ FILE: vendor/golang.org/x/text/encoding/simplifiedchinese/tables.go ================================================ // generated by go run maketables.go; DO NOT EDIT // Package simplifiedchinese provides Simplified Chinese encodings such as GBK. package simplifiedchinese // import "golang.org/x/text/encoding/simplifiedchinese" // gb18030 is the table from http://encoding.spec.whatwg.org/index-gb18030.txt var gb18030 = [...][2]uint16{ {0x0000, 0x0080}, {0x0024, 0x00a5}, {0x0026, 0x00a9}, {0x002d, 0x00b2}, {0x0032, 0x00b8}, {0x0051, 0x00d8}, {0x0059, 0x00e2}, {0x005f, 0x00eb}, {0x0060, 0x00ee}, {0x0064, 0x00f4}, {0x0067, 0x00f8}, {0x0068, 0x00fb}, {0x0069, 0x00fd}, {0x006d, 0x0102}, {0x007e, 0x0114}, {0x0085, 0x011c}, {0x0094, 0x012c}, {0x00ac, 0x0145}, {0x00af, 0x0149}, {0x00b3, 0x014e}, {0x00d0, 0x016c}, {0x0132, 0x01cf}, {0x0133, 0x01d1}, {0x0134, 0x01d3}, {0x0135, 0x01d5}, {0x0136, 0x01d7}, {0x0137, 0x01d9}, {0x0138, 0x01db}, {0x0139, 0x01dd}, {0x0155, 0x01fa}, {0x01ac, 0x0252}, {0x01bb, 0x0262}, {0x0220, 0x02c8}, {0x0221, 0x02cc}, {0x022e, 0x02da}, {0x02e5, 0x03a2}, {0x02e6, 0x03aa}, {0x02ed, 0x03c2}, {0x02ee, 0x03ca}, {0x0325, 0x0402}, {0x0333, 0x0450}, {0x0334, 0x0452}, {0x1ef2, 0x2011}, {0x1ef4, 0x2017}, {0x1ef5, 0x201a}, {0x1ef7, 0x201e}, {0x1efe, 0x2027}, {0x1f07, 0x2031}, {0x1f08, 0x2034}, {0x1f09, 0x2036}, {0x1f0e, 0x203c}, {0x1f7e, 0x20ad}, {0x1fd4, 0x2104}, {0x1fd5, 0x2106}, {0x1fd8, 0x210a}, {0x1fe4, 0x2117}, {0x1fee, 0x2122}, {0x202c, 0x216c}, {0x2030, 0x217a}, {0x2046, 0x2194}, {0x2048, 0x219a}, {0x20b6, 0x2209}, {0x20bc, 0x2210}, {0x20bd, 0x2212}, {0x20c0, 0x2216}, {0x20c4, 0x221b}, {0x20c6, 0x2221}, {0x20c8, 0x2224}, {0x20c9, 0x2226}, {0x20ca, 0x222c}, {0x20cc, 0x222f}, {0x20d1, 0x2238}, {0x20d6, 0x223e}, {0x20e0, 0x2249}, {0x20e3, 0x224d}, {0x20e8, 0x2253}, {0x20f5, 0x2262}, {0x20f7, 0x2268}, {0x20fd, 0x2270}, {0x2122, 0x2296}, {0x2125, 0x229a}, {0x2130, 0x22a6}, {0x2149, 0x22c0}, {0x219b, 0x2313}, {0x22e8, 0x246a}, {0x22f2, 0x249c}, {0x2356, 0x254c}, {0x235a, 0x2574}, {0x2367, 0x2590}, {0x236a, 0x2596}, {0x2374, 0x25a2}, {0x2384, 0x25b4}, {0x238c, 0x25be}, {0x2394, 0x25c8}, {0x2397, 0x25cc}, {0x2399, 0x25d0}, {0x23ab, 0x25e6}, {0x23ca, 0x2607}, {0x23cc, 0x260a}, {0x2402, 0x2641}, {0x2403, 0x2643}, {0x2c41, 0x2e82}, {0x2c43, 0x2e85}, {0x2c46, 0x2e89}, {0x2c48, 0x2e8d}, {0x2c52, 0x2e98}, {0x2c61, 0x2ea8}, {0x2c63, 0x2eab}, {0x2c66, 0x2eaf}, {0x2c6a, 0x2eb4}, {0x2c6c, 0x2eb8}, {0x2c6f, 0x2ebc}, {0x2c7d, 0x2ecb}, {0x2da2, 0x2ffc}, {0x2da6, 0x3004}, {0x2da7, 0x3018}, {0x2dac, 0x301f}, {0x2dae, 0x302a}, {0x2dc2, 0x303f}, {0x2dc4, 0x3094}, {0x2dcb, 0x309f}, {0x2dcd, 0x30f7}, {0x2dd2, 0x30ff}, {0x2dd8, 0x312a}, {0x2ece, 0x322a}, {0x2ed5, 0x3232}, {0x2f46, 0x32a4}, {0x3030, 0x3390}, {0x303c, 0x339f}, {0x303e, 0x33a2}, {0x3060, 0x33c5}, {0x3069, 0x33cf}, {0x306b, 0x33d3}, {0x306d, 0x33d6}, {0x30de, 0x3448}, {0x3109, 0x3474}, {0x3233, 0x359f}, {0x32a2, 0x360f}, {0x32ad, 0x361b}, {0x35aa, 0x3919}, {0x35ff, 0x396f}, {0x365f, 0x39d1}, {0x366d, 0x39e0}, {0x3700, 0x3a74}, {0x37da, 0x3b4f}, {0x38f9, 0x3c6f}, {0x396a, 0x3ce1}, {0x3cdf, 0x4057}, {0x3de7, 0x4160}, {0x3fbe, 0x4338}, {0x4032, 0x43ad}, {0x4036, 0x43b2}, {0x4061, 0x43de}, {0x4159, 0x44d7}, {0x42ce, 0x464d}, {0x42e2, 0x4662}, {0x43a3, 0x4724}, {0x43a8, 0x472a}, {0x43fa, 0x477d}, {0x440a, 0x478e}, {0x45c3, 0x4948}, {0x45f5, 0x497b}, {0x45f7, 0x497e}, {0x45fb, 0x4984}, {0x45fc, 0x4987}, {0x4610, 0x499c}, {0x4613, 0x49a0}, {0x4629, 0x49b8}, {0x48e8, 0x4c78}, {0x490f, 0x4ca4}, {0x497e, 0x4d1a}, {0x4a12, 0x4daf}, {0x4a63, 0x9fa6}, {0x82bd, 0xe76c}, {0x82be, 0xe7c8}, {0x82bf, 0xe7e7}, {0x82cc, 0xe815}, {0x82cd, 0xe819}, {0x82d2, 0xe81f}, {0x82d9, 0xe827}, {0x82dd, 0xe82d}, {0x82e1, 0xe833}, {0x82e9, 0xe83c}, {0x82f0, 0xe844}, {0x8300, 0xe856}, {0x830e, 0xe865}, {0x93d5, 0xf92d}, {0x9421, 0xf97a}, {0x943c, 0xf996}, {0x948d, 0xf9e8}, {0x9496, 0xf9f2}, {0x94b0, 0xfa10}, {0x94b1, 0xfa12}, {0x94b2, 0xfa15}, {0x94b5, 0xfa19}, {0x94bb, 0xfa22}, {0x94bc, 0xfa25}, {0x94be, 0xfa2a}, {0x98c4, 0xfe32}, {0x98c5, 0xfe45}, {0x98c9, 0xfe53}, {0x98ca, 0xfe58}, {0x98cb, 0xfe67}, {0x98cc, 0xfe6c}, {0x9961, 0xff5f}, {0x99e2, 0xffe6}, } // decode is the decoding table from GBK code to Unicode. // It is defined at http://encoding.spec.whatwg.org/index-gbk.txt var decode = [...]uint16{ 0: 0x4E02, 1: 0x4E04, 2: 0x4E05, 3: 0x4E06, 4: 0x4E0F, 5: 0x4E12, 6: 0x4E17, 7: 0x4E1F, 8: 0x4E20, 9: 0x4E21, 10: 0x4E23, 11: 0x4E26, 12: 0x4E29, 13: 0x4E2E, 14: 0x4E2F, 15: 0x4E31, 16: 0x4E33, 17: 0x4E35, 18: 0x4E37, 19: 0x4E3C, 20: 0x4E40, 21: 0x4E41, 22: 0x4E42, 23: 0x4E44, 24: 0x4E46, 25: 0x4E4A, 26: 0x4E51, 27: 0x4E55, 28: 0x4E57, 29: 0x4E5A, 30: 0x4E5B, 31: 0x4E62, 32: 0x4E63, 33: 0x4E64, 34: 0x4E65, 35: 0x4E67, 36: 0x4E68, 37: 0x4E6A, 38: 0x4E6B, 39: 0x4E6C, 40: 0x4E6D, 41: 0x4E6E, 42: 0x4E6F, 43: 0x4E72, 44: 0x4E74, 45: 0x4E75, 46: 0x4E76, 47: 0x4E77, 48: 0x4E78, 49: 0x4E79, 50: 0x4E7A, 51: 0x4E7B, 52: 0x4E7C, 53: 0x4E7D, 54: 0x4E7F, 55: 0x4E80, 56: 0x4E81, 57: 0x4E82, 58: 0x4E83, 59: 0x4E84, 60: 0x4E85, 61: 0x4E87, 62: 0x4E8A, 63: 0x4E90, 64: 0x4E96, 65: 0x4E97, 66: 0x4E99, 67: 0x4E9C, 68: 0x4E9D, 69: 0x4E9E, 70: 0x4EA3, 71: 0x4EAA, 72: 0x4EAF, 73: 0x4EB0, 74: 0x4EB1, 75: 0x4EB4, 76: 0x4EB6, 77: 0x4EB7, 78: 0x4EB8, 79: 0x4EB9, 80: 0x4EBC, 81: 0x4EBD, 82: 0x4EBE, 83: 0x4EC8, 84: 0x4ECC, 85: 0x4ECF, 86: 0x4ED0, 87: 0x4ED2, 88: 0x4EDA, 89: 0x4EDB, 90: 0x4EDC, 91: 0x4EE0, 92: 0x4EE2, 93: 0x4EE6, 94: 0x4EE7, 95: 0x4EE9, 96: 0x4EED, 97: 0x4EEE, 98: 0x4EEF, 99: 0x4EF1, 100: 0x4EF4, 101: 0x4EF8, 102: 0x4EF9, 103: 0x4EFA, 104: 0x4EFC, 105: 0x4EFE, 106: 0x4F00, 107: 0x4F02, 108: 0x4F03, 109: 0x4F04, 110: 0x4F05, 111: 0x4F06, 112: 0x4F07, 113: 0x4F08, 114: 0x4F0B, 115: 0x4F0C, 116: 0x4F12, 117: 0x4F13, 118: 0x4F14, 119: 0x4F15, 120: 0x4F16, 121: 0x4F1C, 122: 0x4F1D, 123: 0x4F21, 124: 0x4F23, 125: 0x4F28, 126: 0x4F29, 127: 0x4F2C, 128: 0x4F2D, 129: 0x4F2E, 130: 0x4F31, 131: 0x4F33, 132: 0x4F35, 133: 0x4F37, 134: 0x4F39, 135: 0x4F3B, 136: 0x4F3E, 137: 0x4F3F, 138: 0x4F40, 139: 0x4F41, 140: 0x4F42, 141: 0x4F44, 142: 0x4F45, 143: 0x4F47, 144: 0x4F48, 145: 0x4F49, 146: 0x4F4A, 147: 0x4F4B, 148: 0x4F4C, 149: 0x4F52, 150: 0x4F54, 151: 0x4F56, 152: 0x4F61, 153: 0x4F62, 154: 0x4F66, 155: 0x4F68, 156: 0x4F6A, 157: 0x4F6B, 158: 0x4F6D, 159: 0x4F6E, 160: 0x4F71, 161: 0x4F72, 162: 0x4F75, 163: 0x4F77, 164: 0x4F78, 165: 0x4F79, 166: 0x4F7A, 167: 0x4F7D, 168: 0x4F80, 169: 0x4F81, 170: 0x4F82, 171: 0x4F85, 172: 0x4F86, 173: 0x4F87, 174: 0x4F8A, 175: 0x4F8C, 176: 0x4F8E, 177: 0x4F90, 178: 0x4F92, 179: 0x4F93, 180: 0x4F95, 181: 0x4F96, 182: 0x4F98, 183: 0x4F99, 184: 0x4F9A, 185: 0x4F9C, 186: 0x4F9E, 187: 0x4F9F, 188: 0x4FA1, 189: 0x4FA2, 190: 0x4FA4, 191: 0x4FAB, 192: 0x4FAD, 193: 0x4FB0, 194: 0x4FB1, 195: 0x4FB2, 196: 0x4FB3, 197: 0x4FB4, 198: 0x4FB6, 199: 0x4FB7, 200: 0x4FB8, 201: 0x4FB9, 202: 0x4FBA, 203: 0x4FBB, 204: 0x4FBC, 205: 0x4FBD, 206: 0x4FBE, 207: 0x4FC0, 208: 0x4FC1, 209: 0x4FC2, 210: 0x4FC6, 211: 0x4FC7, 212: 0x4FC8, 213: 0x4FC9, 214: 0x4FCB, 215: 0x4FCC, 216: 0x4FCD, 217: 0x4FD2, 218: 0x4FD3, 219: 0x4FD4, 220: 0x4FD5, 221: 0x4FD6, 222: 0x4FD9, 223: 0x4FDB, 224: 0x4FE0, 225: 0x4FE2, 226: 0x4FE4, 227: 0x4FE5, 228: 0x4FE7, 229: 0x4FEB, 230: 0x4FEC, 231: 0x4FF0, 232: 0x4FF2, 233: 0x4FF4, 234: 0x4FF5, 235: 0x4FF6, 236: 0x4FF7, 237: 0x4FF9, 238: 0x4FFB, 239: 0x4FFC, 240: 0x4FFD, 241: 0x4FFF, 242: 0x5000, 243: 0x5001, 244: 0x5002, 245: 0x5003, 246: 0x5004, 247: 0x5005, 248: 0x5006, 249: 0x5007, 250: 0x5008, 251: 0x5009, 252: 0x500A, 253: 0x500B, 254: 0x500E, 255: 0x5010, 256: 0x5011, 257: 0x5013, 258: 0x5015, 259: 0x5016, 260: 0x5017, 261: 0x501B, 262: 0x501D, 263: 0x501E, 264: 0x5020, 265: 0x5022, 266: 0x5023, 267: 0x5024, 268: 0x5027, 269: 0x502B, 270: 0x502F, 271: 0x5030, 272: 0x5031, 273: 0x5032, 274: 0x5033, 275: 0x5034, 276: 0x5035, 277: 0x5036, 278: 0x5037, 279: 0x5038, 280: 0x5039, 281: 0x503B, 282: 0x503D, 283: 0x503F, 284: 0x5040, 285: 0x5041, 286: 0x5042, 287: 0x5044, 288: 0x5045, 289: 0x5046, 290: 0x5049, 291: 0x504A, 292: 0x504B, 293: 0x504D, 294: 0x5050, 295: 0x5051, 296: 0x5052, 297: 0x5053, 298: 0x5054, 299: 0x5056, 300: 0x5057, 301: 0x5058, 302: 0x5059, 303: 0x505B, 304: 0x505D, 305: 0x505E, 306: 0x505F, 307: 0x5060, 308: 0x5061, 309: 0x5062, 310: 0x5063, 311: 0x5064, 312: 0x5066, 313: 0x5067, 314: 0x5068, 315: 0x5069, 316: 0x506A, 317: 0x506B, 318: 0x506D, 319: 0x506E, 320: 0x506F, 321: 0x5070, 322: 0x5071, 323: 0x5072, 324: 0x5073, 325: 0x5074, 326: 0x5075, 327: 0x5078, 328: 0x5079, 329: 0x507A, 330: 0x507C, 331: 0x507D, 332: 0x5081, 333: 0x5082, 334: 0x5083, 335: 0x5084, 336: 0x5086, 337: 0x5087, 338: 0x5089, 339: 0x508A, 340: 0x508B, 341: 0x508C, 342: 0x508E, 343: 0x508F, 344: 0x5090, 345: 0x5091, 346: 0x5092, 347: 0x5093, 348: 0x5094, 349: 0x5095, 350: 0x5096, 351: 0x5097, 352: 0x5098, 353: 0x5099, 354: 0x509A, 355: 0x509B, 356: 0x509C, 357: 0x509D, 358: 0x509E, 359: 0x509F, 360: 0x50A0, 361: 0x50A1, 362: 0x50A2, 363: 0x50A4, 364: 0x50A6, 365: 0x50AA, 366: 0x50AB, 367: 0x50AD, 368: 0x50AE, 369: 0x50AF, 370: 0x50B0, 371: 0x50B1, 372: 0x50B3, 373: 0x50B4, 374: 0x50B5, 375: 0x50B6, 376: 0x50B7, 377: 0x50B8, 378: 0x50B9, 379: 0x50BC, 380: 0x50BD, 381: 0x50BE, 382: 0x50BF, 383: 0x50C0, 384: 0x50C1, 385: 0x50C2, 386: 0x50C3, 387: 0x50C4, 388: 0x50C5, 389: 0x50C6, 390: 0x50C7, 391: 0x50C8, 392: 0x50C9, 393: 0x50CA, 394: 0x50CB, 395: 0x50CC, 396: 0x50CD, 397: 0x50CE, 398: 0x50D0, 399: 0x50D1, 400: 0x50D2, 401: 0x50D3, 402: 0x50D4, 403: 0x50D5, 404: 0x50D7, 405: 0x50D8, 406: 0x50D9, 407: 0x50DB, 408: 0x50DC, 409: 0x50DD, 410: 0x50DE, 411: 0x50DF, 412: 0x50E0, 413: 0x50E1, 414: 0x50E2, 415: 0x50E3, 416: 0x50E4, 417: 0x50E5, 418: 0x50E8, 419: 0x50E9, 420: 0x50EA, 421: 0x50EB, 422: 0x50EF, 423: 0x50F0, 424: 0x50F1, 425: 0x50F2, 426: 0x50F4, 427: 0x50F6, 428: 0x50F7, 429: 0x50F8, 430: 0x50F9, 431: 0x50FA, 432: 0x50FC, 433: 0x50FD, 434: 0x50FE, 435: 0x50FF, 436: 0x5100, 437: 0x5101, 438: 0x5102, 439: 0x5103, 440: 0x5104, 441: 0x5105, 442: 0x5108, 443: 0x5109, 444: 0x510A, 445: 0x510C, 446: 0x510D, 447: 0x510E, 448: 0x510F, 449: 0x5110, 450: 0x5111, 451: 0x5113, 452: 0x5114, 453: 0x5115, 454: 0x5116, 455: 0x5117, 456: 0x5118, 457: 0x5119, 458: 0x511A, 459: 0x511B, 460: 0x511C, 461: 0x511D, 462: 0x511E, 463: 0x511F, 464: 0x5120, 465: 0x5122, 466: 0x5123, 467: 0x5124, 468: 0x5125, 469: 0x5126, 470: 0x5127, 471: 0x5128, 472: 0x5129, 473: 0x512A, 474: 0x512B, 475: 0x512C, 476: 0x512D, 477: 0x512E, 478: 0x512F, 479: 0x5130, 480: 0x5131, 481: 0x5132, 482: 0x5133, 483: 0x5134, 484: 0x5135, 485: 0x5136, 486: 0x5137, 487: 0x5138, 488: 0x5139, 489: 0x513A, 490: 0x513B, 491: 0x513C, 492: 0x513D, 493: 0x513E, 494: 0x5142, 495: 0x5147, 496: 0x514A, 497: 0x514C, 498: 0x514E, 499: 0x514F, 500: 0x5150, 501: 0x5152, 502: 0x5153, 503: 0x5157, 504: 0x5158, 505: 0x5159, 506: 0x515B, 507: 0x515D, 508: 0x515E, 509: 0x515F, 510: 0x5160, 511: 0x5161, 512: 0x5163, 513: 0x5164, 514: 0x5166, 515: 0x5167, 516: 0x5169, 517: 0x516A, 518: 0x516F, 519: 0x5172, 520: 0x517A, 521: 0x517E, 522: 0x517F, 523: 0x5183, 524: 0x5184, 525: 0x5186, 526: 0x5187, 527: 0x518A, 528: 0x518B, 529: 0x518E, 530: 0x518F, 531: 0x5190, 532: 0x5191, 533: 0x5193, 534: 0x5194, 535: 0x5198, 536: 0x519A, 537: 0x519D, 538: 0x519E, 539: 0x519F, 540: 0x51A1, 541: 0x51A3, 542: 0x51A6, 543: 0x51A7, 544: 0x51A8, 545: 0x51A9, 546: 0x51AA, 547: 0x51AD, 548: 0x51AE, 549: 0x51B4, 550: 0x51B8, 551: 0x51B9, 552: 0x51BA, 553: 0x51BE, 554: 0x51BF, 555: 0x51C1, 556: 0x51C2, 557: 0x51C3, 558: 0x51C5, 559: 0x51C8, 560: 0x51CA, 561: 0x51CD, 562: 0x51CE, 563: 0x51D0, 564: 0x51D2, 565: 0x51D3, 566: 0x51D4, 567: 0x51D5, 568: 0x51D6, 569: 0x51D7, 570: 0x51D8, 571: 0x51D9, 572: 0x51DA, 573: 0x51DC, 574: 0x51DE, 575: 0x51DF, 576: 0x51E2, 577: 0x51E3, 578: 0x51E5, 579: 0x51E6, 580: 0x51E7, 581: 0x51E8, 582: 0x51E9, 583: 0x51EA, 584: 0x51EC, 585: 0x51EE, 586: 0x51F1, 587: 0x51F2, 588: 0x51F4, 589: 0x51F7, 590: 0x51FE, 591: 0x5204, 592: 0x5205, 593: 0x5209, 594: 0x520B, 595: 0x520C, 596: 0x520F, 597: 0x5210, 598: 0x5213, 599: 0x5214, 600: 0x5215, 601: 0x521C, 602: 0x521E, 603: 0x521F, 604: 0x5221, 605: 0x5222, 606: 0x5223, 607: 0x5225, 608: 0x5226, 609: 0x5227, 610: 0x522A, 611: 0x522C, 612: 0x522F, 613: 0x5231, 614: 0x5232, 615: 0x5234, 616: 0x5235, 617: 0x523C, 618: 0x523E, 619: 0x5244, 620: 0x5245, 621: 0x5246, 622: 0x5247, 623: 0x5248, 624: 0x5249, 625: 0x524B, 626: 0x524E, 627: 0x524F, 628: 0x5252, 629: 0x5253, 630: 0x5255, 631: 0x5257, 632: 0x5258, 633: 0x5259, 634: 0x525A, 635: 0x525B, 636: 0x525D, 637: 0x525F, 638: 0x5260, 639: 0x5262, 640: 0x5263, 641: 0x5264, 642: 0x5266, 643: 0x5268, 644: 0x526B, 645: 0x526C, 646: 0x526D, 647: 0x526E, 648: 0x5270, 649: 0x5271, 650: 0x5273, 651: 0x5274, 652: 0x5275, 653: 0x5276, 654: 0x5277, 655: 0x5278, 656: 0x5279, 657: 0x527A, 658: 0x527B, 659: 0x527C, 660: 0x527E, 661: 0x5280, 662: 0x5283, 663: 0x5284, 664: 0x5285, 665: 0x5286, 666: 0x5287, 667: 0x5289, 668: 0x528A, 669: 0x528B, 670: 0x528C, 671: 0x528D, 672: 0x528E, 673: 0x528F, 674: 0x5291, 675: 0x5292, 676: 0x5294, 677: 0x5295, 678: 0x5296, 679: 0x5297, 680: 0x5298, 681: 0x5299, 682: 0x529A, 683: 0x529C, 684: 0x52A4, 685: 0x52A5, 686: 0x52A6, 687: 0x52A7, 688: 0x52AE, 689: 0x52AF, 690: 0x52B0, 691: 0x52B4, 692: 0x52B5, 693: 0x52B6, 694: 0x52B7, 695: 0x52B8, 696: 0x52B9, 697: 0x52BA, 698: 0x52BB, 699: 0x52BC, 700: 0x52BD, 701: 0x52C0, 702: 0x52C1, 703: 0x52C2, 704: 0x52C4, 705: 0x52C5, 706: 0x52C6, 707: 0x52C8, 708: 0x52CA, 709: 0x52CC, 710: 0x52CD, 711: 0x52CE, 712: 0x52CF, 713: 0x52D1, 714: 0x52D3, 715: 0x52D4, 716: 0x52D5, 717: 0x52D7, 718: 0x52D9, 719: 0x52DA, 720: 0x52DB, 721: 0x52DC, 722: 0x52DD, 723: 0x52DE, 724: 0x52E0, 725: 0x52E1, 726: 0x52E2, 727: 0x52E3, 728: 0x52E5, 729: 0x52E6, 730: 0x52E7, 731: 0x52E8, 732: 0x52E9, 733: 0x52EA, 734: 0x52EB, 735: 0x52EC, 736: 0x52ED, 737: 0x52EE, 738: 0x52EF, 739: 0x52F1, 740: 0x52F2, 741: 0x52F3, 742: 0x52F4, 743: 0x52F5, 744: 0x52F6, 745: 0x52F7, 746: 0x52F8, 747: 0x52FB, 748: 0x52FC, 749: 0x52FD, 750: 0x5301, 751: 0x5302, 752: 0x5303, 753: 0x5304, 754: 0x5307, 755: 0x5309, 756: 0x530A, 757: 0x530B, 758: 0x530C, 759: 0x530E, 760: 0x5311, 761: 0x5312, 762: 0x5313, 763: 0x5314, 764: 0x5318, 765: 0x531B, 766: 0x531C, 767: 0x531E, 768: 0x531F, 769: 0x5322, 770: 0x5324, 771: 0x5325, 772: 0x5327, 773: 0x5328, 774: 0x5329, 775: 0x532B, 776: 0x532C, 777: 0x532D, 778: 0x532F, 779: 0x5330, 780: 0x5331, 781: 0x5332, 782: 0x5333, 783: 0x5334, 784: 0x5335, 785: 0x5336, 786: 0x5337, 787: 0x5338, 788: 0x533C, 789: 0x533D, 790: 0x5340, 791: 0x5342, 792: 0x5344, 793: 0x5346, 794: 0x534B, 795: 0x534C, 796: 0x534D, 797: 0x5350, 798: 0x5354, 799: 0x5358, 800: 0x5359, 801: 0x535B, 802: 0x535D, 803: 0x5365, 804: 0x5368, 805: 0x536A, 806: 0x536C, 807: 0x536D, 808: 0x5372, 809: 0x5376, 810: 0x5379, 811: 0x537B, 812: 0x537C, 813: 0x537D, 814: 0x537E, 815: 0x5380, 816: 0x5381, 817: 0x5383, 818: 0x5387, 819: 0x5388, 820: 0x538A, 821: 0x538E, 822: 0x538F, 823: 0x5390, 824: 0x5391, 825: 0x5392, 826: 0x5393, 827: 0x5394, 828: 0x5396, 829: 0x5397, 830: 0x5399, 831: 0x539B, 832: 0x539C, 833: 0x539E, 834: 0x53A0, 835: 0x53A1, 836: 0x53A4, 837: 0x53A7, 838: 0x53AA, 839: 0x53AB, 840: 0x53AC, 841: 0x53AD, 842: 0x53AF, 843: 0x53B0, 844: 0x53B1, 845: 0x53B2, 846: 0x53B3, 847: 0x53B4, 848: 0x53B5, 849: 0x53B7, 850: 0x53B8, 851: 0x53B9, 852: 0x53BA, 853: 0x53BC, 854: 0x53BD, 855: 0x53BE, 856: 0x53C0, 857: 0x53C3, 858: 0x53C4, 859: 0x53C5, 860: 0x53C6, 861: 0x53C7, 862: 0x53CE, 863: 0x53CF, 864: 0x53D0, 865: 0x53D2, 866: 0x53D3, 867: 0x53D5, 868: 0x53DA, 869: 0x53DC, 870: 0x53DD, 871: 0x53DE, 872: 0x53E1, 873: 0x53E2, 874: 0x53E7, 875: 0x53F4, 876: 0x53FA, 877: 0x53FE, 878: 0x53FF, 879: 0x5400, 880: 0x5402, 881: 0x5405, 882: 0x5407, 883: 0x540B, 884: 0x5414, 885: 0x5418, 886: 0x5419, 887: 0x541A, 888: 0x541C, 889: 0x5422, 890: 0x5424, 891: 0x5425, 892: 0x542A, 893: 0x5430, 894: 0x5433, 895: 0x5436, 896: 0x5437, 897: 0x543A, 898: 0x543D, 899: 0x543F, 900: 0x5441, 901: 0x5442, 902: 0x5444, 903: 0x5445, 904: 0x5447, 905: 0x5449, 906: 0x544C, 907: 0x544D, 908: 0x544E, 909: 0x544F, 910: 0x5451, 911: 0x545A, 912: 0x545D, 913: 0x545E, 914: 0x545F, 915: 0x5460, 916: 0x5461, 917: 0x5463, 918: 0x5465, 919: 0x5467, 920: 0x5469, 921: 0x546A, 922: 0x546B, 923: 0x546C, 924: 0x546D, 925: 0x546E, 926: 0x546F, 927: 0x5470, 928: 0x5474, 929: 0x5479, 930: 0x547A, 931: 0x547E, 932: 0x547F, 933: 0x5481, 934: 0x5483, 935: 0x5485, 936: 0x5487, 937: 0x5488, 938: 0x5489, 939: 0x548A, 940: 0x548D, 941: 0x5491, 942: 0x5493, 943: 0x5497, 944: 0x5498, 945: 0x549C, 946: 0x549E, 947: 0x549F, 948: 0x54A0, 949: 0x54A1, 950: 0x54A2, 951: 0x54A5, 952: 0x54AE, 953: 0x54B0, 954: 0x54B2, 955: 0x54B5, 956: 0x54B6, 957: 0x54B7, 958: 0x54B9, 959: 0x54BA, 960: 0x54BC, 961: 0x54BE, 962: 0x54C3, 963: 0x54C5, 964: 0x54CA, 965: 0x54CB, 966: 0x54D6, 967: 0x54D8, 968: 0x54DB, 969: 0x54E0, 970: 0x54E1, 971: 0x54E2, 972: 0x54E3, 973: 0x54E4, 974: 0x54EB, 975: 0x54EC, 976: 0x54EF, 977: 0x54F0, 978: 0x54F1, 979: 0x54F4, 980: 0x54F5, 981: 0x54F6, 982: 0x54F7, 983: 0x54F8, 984: 0x54F9, 985: 0x54FB, 986: 0x54FE, 987: 0x5500, 988: 0x5502, 989: 0x5503, 990: 0x5504, 991: 0x5505, 992: 0x5508, 993: 0x550A, 994: 0x550B, 995: 0x550C, 996: 0x550D, 997: 0x550E, 998: 0x5512, 999: 0x5513, 1000: 0x5515, 1001: 0x5516, 1002: 0x5517, 1003: 0x5518, 1004: 0x5519, 1005: 0x551A, 1006: 0x551C, 1007: 0x551D, 1008: 0x551E, 1009: 0x551F, 1010: 0x5521, 1011: 0x5525, 1012: 0x5526, 1013: 0x5528, 1014: 0x5529, 1015: 0x552B, 1016: 0x552D, 1017: 0x5532, 1018: 0x5534, 1019: 0x5535, 1020: 0x5536, 1021: 0x5538, 1022: 0x5539, 1023: 0x553A, 1024: 0x553B, 1025: 0x553D, 1026: 0x5540, 1027: 0x5542, 1028: 0x5545, 1029: 0x5547, 1030: 0x5548, 1031: 0x554B, 1032: 0x554C, 1033: 0x554D, 1034: 0x554E, 1035: 0x554F, 1036: 0x5551, 1037: 0x5552, 1038: 0x5553, 1039: 0x5554, 1040: 0x5557, 1041: 0x5558, 1042: 0x5559, 1043: 0x555A, 1044: 0x555B, 1045: 0x555D, 1046: 0x555E, 1047: 0x555F, 1048: 0x5560, 1049: 0x5562, 1050: 0x5563, 1051: 0x5568, 1052: 0x5569, 1053: 0x556B, 1054: 0x556F, 1055: 0x5570, 1056: 0x5571, 1057: 0x5572, 1058: 0x5573, 1059: 0x5574, 1060: 0x5579, 1061: 0x557A, 1062: 0x557D, 1063: 0x557F, 1064: 0x5585, 1065: 0x5586, 1066: 0x558C, 1067: 0x558D, 1068: 0x558E, 1069: 0x5590, 1070: 0x5592, 1071: 0x5593, 1072: 0x5595, 1073: 0x5596, 1074: 0x5597, 1075: 0x559A, 1076: 0x559B, 1077: 0x559E, 1078: 0x55A0, 1079: 0x55A1, 1080: 0x55A2, 1081: 0x55A3, 1082: 0x55A4, 1083: 0x55A5, 1084: 0x55A6, 1085: 0x55A8, 1086: 0x55A9, 1087: 0x55AA, 1088: 0x55AB, 1089: 0x55AC, 1090: 0x55AD, 1091: 0x55AE, 1092: 0x55AF, 1093: 0x55B0, 1094: 0x55B2, 1095: 0x55B4, 1096: 0x55B6, 1097: 0x55B8, 1098: 0x55BA, 1099: 0x55BC, 1100: 0x55BF, 1101: 0x55C0, 1102: 0x55C1, 1103: 0x55C2, 1104: 0x55C3, 1105: 0x55C6, 1106: 0x55C7, 1107: 0x55C8, 1108: 0x55CA, 1109: 0x55CB, 1110: 0x55CE, 1111: 0x55CF, 1112: 0x55D0, 1113: 0x55D5, 1114: 0x55D7, 1115: 0x55D8, 1116: 0x55D9, 1117: 0x55DA, 1118: 0x55DB, 1119: 0x55DE, 1120: 0x55E0, 1121: 0x55E2, 1122: 0x55E7, 1123: 0x55E9, 1124: 0x55ED, 1125: 0x55EE, 1126: 0x55F0, 1127: 0x55F1, 1128: 0x55F4, 1129: 0x55F6, 1130: 0x55F8, 1131: 0x55F9, 1132: 0x55FA, 1133: 0x55FB, 1134: 0x55FC, 1135: 0x55FF, 1136: 0x5602, 1137: 0x5603, 1138: 0x5604, 1139: 0x5605, 1140: 0x5606, 1141: 0x5607, 1142: 0x560A, 1143: 0x560B, 1144: 0x560D, 1145: 0x5610, 1146: 0x5611, 1147: 0x5612, 1148: 0x5613, 1149: 0x5614, 1150: 0x5615, 1151: 0x5616, 1152: 0x5617, 1153: 0x5619, 1154: 0x561A, 1155: 0x561C, 1156: 0x561D, 1157: 0x5620, 1158: 0x5621, 1159: 0x5622, 1160: 0x5625, 1161: 0x5626, 1162: 0x5628, 1163: 0x5629, 1164: 0x562A, 1165: 0x562B, 1166: 0x562E, 1167: 0x562F, 1168: 0x5630, 1169: 0x5633, 1170: 0x5635, 1171: 0x5637, 1172: 0x5638, 1173: 0x563A, 1174: 0x563C, 1175: 0x563D, 1176: 0x563E, 1177: 0x5640, 1178: 0x5641, 1179: 0x5642, 1180: 0x5643, 1181: 0x5644, 1182: 0x5645, 1183: 0x5646, 1184: 0x5647, 1185: 0x5648, 1186: 0x5649, 1187: 0x564A, 1188: 0x564B, 1189: 0x564F, 1190: 0x5650, 1191: 0x5651, 1192: 0x5652, 1193: 0x5653, 1194: 0x5655, 1195: 0x5656, 1196: 0x565A, 1197: 0x565B, 1198: 0x565D, 1199: 0x565E, 1200: 0x565F, 1201: 0x5660, 1202: 0x5661, 1203: 0x5663, 1204: 0x5665, 1205: 0x5666, 1206: 0x5667, 1207: 0x566D, 1208: 0x566E, 1209: 0x566F, 1210: 0x5670, 1211: 0x5672, 1212: 0x5673, 1213: 0x5674, 1214: 0x5675, 1215: 0x5677, 1216: 0x5678, 1217: 0x5679, 1218: 0x567A, 1219: 0x567D, 1220: 0x567E, 1221: 0x567F, 1222: 0x5680, 1223: 0x5681, 1224: 0x5682, 1225: 0x5683, 1226: 0x5684, 1227: 0x5687, 1228: 0x5688, 1229: 0x5689, 1230: 0x568A, 1231: 0x568B, 1232: 0x568C, 1233: 0x568D, 1234: 0x5690, 1235: 0x5691, 1236: 0x5692, 1237: 0x5694, 1238: 0x5695, 1239: 0x5696, 1240: 0x5697, 1241: 0x5698, 1242: 0x5699, 1243: 0x569A, 1244: 0x569B, 1245: 0x569C, 1246: 0x569D, 1247: 0x569E, 1248: 0x569F, 1249: 0x56A0, 1250: 0x56A1, 1251: 0x56A2, 1252: 0x56A4, 1253: 0x56A5, 1254: 0x56A6, 1255: 0x56A7, 1256: 0x56A8, 1257: 0x56A9, 1258: 0x56AA, 1259: 0x56AB, 1260: 0x56AC, 1261: 0x56AD, 1262: 0x56AE, 1263: 0x56B0, 1264: 0x56B1, 1265: 0x56B2, 1266: 0x56B3, 1267: 0x56B4, 1268: 0x56B5, 1269: 0x56B6, 1270: 0x56B8, 1271: 0x56B9, 1272: 0x56BA, 1273: 0x56BB, 1274: 0x56BD, 1275: 0x56BE, 1276: 0x56BF, 1277: 0x56C0, 1278: 0x56C1, 1279: 0x56C2, 1280: 0x56C3, 1281: 0x56C4, 1282: 0x56C5, 1283: 0x56C6, 1284: 0x56C7, 1285: 0x56C8, 1286: 0x56C9, 1287: 0x56CB, 1288: 0x56CC, 1289: 0x56CD, 1290: 0x56CE, 1291: 0x56CF, 1292: 0x56D0, 1293: 0x56D1, 1294: 0x56D2, 1295: 0x56D3, 1296: 0x56D5, 1297: 0x56D6, 1298: 0x56D8, 1299: 0x56D9, 1300: 0x56DC, 1301: 0x56E3, 1302: 0x56E5, 1303: 0x56E6, 1304: 0x56E7, 1305: 0x56E8, 1306: 0x56E9, 1307: 0x56EA, 1308: 0x56EC, 1309: 0x56EE, 1310: 0x56EF, 1311: 0x56F2, 1312: 0x56F3, 1313: 0x56F6, 1314: 0x56F7, 1315: 0x56F8, 1316: 0x56FB, 1317: 0x56FC, 1318: 0x5700, 1319: 0x5701, 1320: 0x5702, 1321: 0x5705, 1322: 0x5707, 1323: 0x570B, 1324: 0x570C, 1325: 0x570D, 1326: 0x570E, 1327: 0x570F, 1328: 0x5710, 1329: 0x5711, 1330: 0x5712, 1331: 0x5713, 1332: 0x5714, 1333: 0x5715, 1334: 0x5716, 1335: 0x5717, 1336: 0x5718, 1337: 0x5719, 1338: 0x571A, 1339: 0x571B, 1340: 0x571D, 1341: 0x571E, 1342: 0x5720, 1343: 0x5721, 1344: 0x5722, 1345: 0x5724, 1346: 0x5725, 1347: 0x5726, 1348: 0x5727, 1349: 0x572B, 1350: 0x5731, 1351: 0x5732, 1352: 0x5734, 1353: 0x5735, 1354: 0x5736, 1355: 0x5737, 1356: 0x5738, 1357: 0x573C, 1358: 0x573D, 1359: 0x573F, 1360: 0x5741, 1361: 0x5743, 1362: 0x5744, 1363: 0x5745, 1364: 0x5746, 1365: 0x5748, 1366: 0x5749, 1367: 0x574B, 1368: 0x5752, 1369: 0x5753, 1370: 0x5754, 1371: 0x5755, 1372: 0x5756, 1373: 0x5758, 1374: 0x5759, 1375: 0x5762, 1376: 0x5763, 1377: 0x5765, 1378: 0x5767, 1379: 0x576C, 1380: 0x576E, 1381: 0x5770, 1382: 0x5771, 1383: 0x5772, 1384: 0x5774, 1385: 0x5775, 1386: 0x5778, 1387: 0x5779, 1388: 0x577A, 1389: 0x577D, 1390: 0x577E, 1391: 0x577F, 1392: 0x5780, 1393: 0x5781, 1394: 0x5787, 1395: 0x5788, 1396: 0x5789, 1397: 0x578A, 1398: 0x578D, 1399: 0x578E, 1400: 0x578F, 1401: 0x5790, 1402: 0x5791, 1403: 0x5794, 1404: 0x5795, 1405: 0x5796, 1406: 0x5797, 1407: 0x5798, 1408: 0x5799, 1409: 0x579A, 1410: 0x579C, 1411: 0x579D, 1412: 0x579E, 1413: 0x579F, 1414: 0x57A5, 1415: 0x57A8, 1416: 0x57AA, 1417: 0x57AC, 1418: 0x57AF, 1419: 0x57B0, 1420: 0x57B1, 1421: 0x57B3, 1422: 0x57B5, 1423: 0x57B6, 1424: 0x57B7, 1425: 0x57B9, 1426: 0x57BA, 1427: 0x57BB, 1428: 0x57BC, 1429: 0x57BD, 1430: 0x57BE, 1431: 0x57BF, 1432: 0x57C0, 1433: 0x57C1, 1434: 0x57C4, 1435: 0x57C5, 1436: 0x57C6, 1437: 0x57C7, 1438: 0x57C8, 1439: 0x57C9, 1440: 0x57CA, 1441: 0x57CC, 1442: 0x57CD, 1443: 0x57D0, 1444: 0x57D1, 1445: 0x57D3, 1446: 0x57D6, 1447: 0x57D7, 1448: 0x57DB, 1449: 0x57DC, 1450: 0x57DE, 1451: 0x57E1, 1452: 0x57E2, 1453: 0x57E3, 1454: 0x57E5, 1455: 0x57E6, 1456: 0x57E7, 1457: 0x57E8, 1458: 0x57E9, 1459: 0x57EA, 1460: 0x57EB, 1461: 0x57EC, 1462: 0x57EE, 1463: 0x57F0, 1464: 0x57F1, 1465: 0x57F2, 1466: 0x57F3, 1467: 0x57F5, 1468: 0x57F6, 1469: 0x57F7, 1470: 0x57FB, 1471: 0x57FC, 1472: 0x57FE, 1473: 0x57FF, 1474: 0x5801, 1475: 0x5803, 1476: 0x5804, 1477: 0x5805, 1478: 0x5808, 1479: 0x5809, 1480: 0x580A, 1481: 0x580C, 1482: 0x580E, 1483: 0x580F, 1484: 0x5810, 1485: 0x5812, 1486: 0x5813, 1487: 0x5814, 1488: 0x5816, 1489: 0x5817, 1490: 0x5818, 1491: 0x581A, 1492: 0x581B, 1493: 0x581C, 1494: 0x581D, 1495: 0x581F, 1496: 0x5822, 1497: 0x5823, 1498: 0x5825, 1499: 0x5826, 1500: 0x5827, 1501: 0x5828, 1502: 0x5829, 1503: 0x582B, 1504: 0x582C, 1505: 0x582D, 1506: 0x582E, 1507: 0x582F, 1508: 0x5831, 1509: 0x5832, 1510: 0x5833, 1511: 0x5834, 1512: 0x5836, 1513: 0x5837, 1514: 0x5838, 1515: 0x5839, 1516: 0x583A, 1517: 0x583B, 1518: 0x583C, 1519: 0x583D, 1520: 0x583E, 1521: 0x583F, 1522: 0x5840, 1523: 0x5841, 1524: 0x5842, 1525: 0x5843, 1526: 0x5845, 1527: 0x5846, 1528: 0x5847, 1529: 0x5848, 1530: 0x5849, 1531: 0x584A, 1532: 0x584B, 1533: 0x584E, 1534: 0x584F, 1535: 0x5850, 1536: 0x5852, 1537: 0x5853, 1538: 0x5855, 1539: 0x5856, 1540: 0x5857, 1541: 0x5859, 1542: 0x585A, 1543: 0x585B, 1544: 0x585C, 1545: 0x585D, 1546: 0x585F, 1547: 0x5860, 1548: 0x5861, 1549: 0x5862, 1550: 0x5863, 1551: 0x5864, 1552: 0x5866, 1553: 0x5867, 1554: 0x5868, 1555: 0x5869, 1556: 0x586A, 1557: 0x586D, 1558: 0x586E, 1559: 0x586F, 1560: 0x5870, 1561: 0x5871, 1562: 0x5872, 1563: 0x5873, 1564: 0x5874, 1565: 0x5875, 1566: 0x5876, 1567: 0x5877, 1568: 0x5878, 1569: 0x5879, 1570: 0x587A, 1571: 0x587B, 1572: 0x587C, 1573: 0x587D, 1574: 0x587F, 1575: 0x5882, 1576: 0x5884, 1577: 0x5886, 1578: 0x5887, 1579: 0x5888, 1580: 0x588A, 1581: 0x588B, 1582: 0x588C, 1583: 0x588D, 1584: 0x588E, 1585: 0x588F, 1586: 0x5890, 1587: 0x5891, 1588: 0x5894, 1589: 0x5895, 1590: 0x5896, 1591: 0x5897, 1592: 0x5898, 1593: 0x589B, 1594: 0x589C, 1595: 0x589D, 1596: 0x58A0, 1597: 0x58A1, 1598: 0x58A2, 1599: 0x58A3, 1600: 0x58A4, 1601: 0x58A5, 1602: 0x58A6, 1603: 0x58A7, 1604: 0x58AA, 1605: 0x58AB, 1606: 0x58AC, 1607: 0x58AD, 1608: 0x58AE, 1609: 0x58AF, 1610: 0x58B0, 1611: 0x58B1, 1612: 0x58B2, 1613: 0x58B3, 1614: 0x58B4, 1615: 0x58B5, 1616: 0x58B6, 1617: 0x58B7, 1618: 0x58B8, 1619: 0x58B9, 1620: 0x58BA, 1621: 0x58BB, 1622: 0x58BD, 1623: 0x58BE, 1624: 0x58BF, 1625: 0x58C0, 1626: 0x58C2, 1627: 0x58C3, 1628: 0x58C4, 1629: 0x58C6, 1630: 0x58C7, 1631: 0x58C8, 1632: 0x58C9, 1633: 0x58CA, 1634: 0x58CB, 1635: 0x58CC, 1636: 0x58CD, 1637: 0x58CE, 1638: 0x58CF, 1639: 0x58D0, 1640: 0x58D2, 1641: 0x58D3, 1642: 0x58D4, 1643: 0x58D6, 1644: 0x58D7, 1645: 0x58D8, 1646: 0x58D9, 1647: 0x58DA, 1648: 0x58DB, 1649: 0x58DC, 1650: 0x58DD, 1651: 0x58DE, 1652: 0x58DF, 1653: 0x58E0, 1654: 0x58E1, 1655: 0x58E2, 1656: 0x58E3, 1657: 0x58E5, 1658: 0x58E6, 1659: 0x58E7, 1660: 0x58E8, 1661: 0x58E9, 1662: 0x58EA, 1663: 0x58ED, 1664: 0x58EF, 1665: 0x58F1, 1666: 0x58F2, 1667: 0x58F4, 1668: 0x58F5, 1669: 0x58F7, 1670: 0x58F8, 1671: 0x58FA, 1672: 0x58FB, 1673: 0x58FC, 1674: 0x58FD, 1675: 0x58FE, 1676: 0x58FF, 1677: 0x5900, 1678: 0x5901, 1679: 0x5903, 1680: 0x5905, 1681: 0x5906, 1682: 0x5908, 1683: 0x5909, 1684: 0x590A, 1685: 0x590B, 1686: 0x590C, 1687: 0x590E, 1688: 0x5910, 1689: 0x5911, 1690: 0x5912, 1691: 0x5913, 1692: 0x5917, 1693: 0x5918, 1694: 0x591B, 1695: 0x591D, 1696: 0x591E, 1697: 0x5920, 1698: 0x5921, 1699: 0x5922, 1700: 0x5923, 1701: 0x5926, 1702: 0x5928, 1703: 0x592C, 1704: 0x5930, 1705: 0x5932, 1706: 0x5933, 1707: 0x5935, 1708: 0x5936, 1709: 0x593B, 1710: 0x593D, 1711: 0x593E, 1712: 0x593F, 1713: 0x5940, 1714: 0x5943, 1715: 0x5945, 1716: 0x5946, 1717: 0x594A, 1718: 0x594C, 1719: 0x594D, 1720: 0x5950, 1721: 0x5952, 1722: 0x5953, 1723: 0x5959, 1724: 0x595B, 1725: 0x595C, 1726: 0x595D, 1727: 0x595E, 1728: 0x595F, 1729: 0x5961, 1730: 0x5963, 1731: 0x5964, 1732: 0x5966, 1733: 0x5967, 1734: 0x5968, 1735: 0x5969, 1736: 0x596A, 1737: 0x596B, 1738: 0x596C, 1739: 0x596D, 1740: 0x596E, 1741: 0x596F, 1742: 0x5970, 1743: 0x5971, 1744: 0x5972, 1745: 0x5975, 1746: 0x5977, 1747: 0x597A, 1748: 0x597B, 1749: 0x597C, 1750: 0x597E, 1751: 0x597F, 1752: 0x5980, 1753: 0x5985, 1754: 0x5989, 1755: 0x598B, 1756: 0x598C, 1757: 0x598E, 1758: 0x598F, 1759: 0x5990, 1760: 0x5991, 1761: 0x5994, 1762: 0x5995, 1763: 0x5998, 1764: 0x599A, 1765: 0x599B, 1766: 0x599C, 1767: 0x599D, 1768: 0x599F, 1769: 0x59A0, 1770: 0x59A1, 1771: 0x59A2, 1772: 0x59A6, 1773: 0x59A7, 1774: 0x59AC, 1775: 0x59AD, 1776: 0x59B0, 1777: 0x59B1, 1778: 0x59B3, 1779: 0x59B4, 1780: 0x59B5, 1781: 0x59B6, 1782: 0x59B7, 1783: 0x59B8, 1784: 0x59BA, 1785: 0x59BC, 1786: 0x59BD, 1787: 0x59BF, 1788: 0x59C0, 1789: 0x59C1, 1790: 0x59C2, 1791: 0x59C3, 1792: 0x59C4, 1793: 0x59C5, 1794: 0x59C7, 1795: 0x59C8, 1796: 0x59C9, 1797: 0x59CC, 1798: 0x59CD, 1799: 0x59CE, 1800: 0x59CF, 1801: 0x59D5, 1802: 0x59D6, 1803: 0x59D9, 1804: 0x59DB, 1805: 0x59DE, 1806: 0x59DF, 1807: 0x59E0, 1808: 0x59E1, 1809: 0x59E2, 1810: 0x59E4, 1811: 0x59E6, 1812: 0x59E7, 1813: 0x59E9, 1814: 0x59EA, 1815: 0x59EB, 1816: 0x59ED, 1817: 0x59EE, 1818: 0x59EF, 1819: 0x59F0, 1820: 0x59F1, 1821: 0x59F2, 1822: 0x59F3, 1823: 0x59F4, 1824: 0x59F5, 1825: 0x59F6, 1826: 0x59F7, 1827: 0x59F8, 1828: 0x59FA, 1829: 0x59FC, 1830: 0x59FD, 1831: 0x59FE, 1832: 0x5A00, 1833: 0x5A02, 1834: 0x5A0A, 1835: 0x5A0B, 1836: 0x5A0D, 1837: 0x5A0E, 1838: 0x5A0F, 1839: 0x5A10, 1840: 0x5A12, 1841: 0x5A14, 1842: 0x5A15, 1843: 0x5A16, 1844: 0x5A17, 1845: 0x5A19, 1846: 0x5A1A, 1847: 0x5A1B, 1848: 0x5A1D, 1849: 0x5A1E, 1850: 0x5A21, 1851: 0x5A22, 1852: 0x5A24, 1853: 0x5A26, 1854: 0x5A27, 1855: 0x5A28, 1856: 0x5A2A, 1857: 0x5A2B, 1858: 0x5A2C, 1859: 0x5A2D, 1860: 0x5A2E, 1861: 0x5A2F, 1862: 0x5A30, 1863: 0x5A33, 1864: 0x5A35, 1865: 0x5A37, 1866: 0x5A38, 1867: 0x5A39, 1868: 0x5A3A, 1869: 0x5A3B, 1870: 0x5A3D, 1871: 0x5A3E, 1872: 0x5A3F, 1873: 0x5A41, 1874: 0x5A42, 1875: 0x5A43, 1876: 0x5A44, 1877: 0x5A45, 1878: 0x5A47, 1879: 0x5A48, 1880: 0x5A4B, 1881: 0x5A4C, 1882: 0x5A4D, 1883: 0x5A4E, 1884: 0x5A4F, 1885: 0x5A50, 1886: 0x5A51, 1887: 0x5A52, 1888: 0x5A53, 1889: 0x5A54, 1890: 0x5A56, 1891: 0x5A57, 1892: 0x5A58, 1893: 0x5A59, 1894: 0x5A5B, 1895: 0x5A5C, 1896: 0x5A5D, 1897: 0x5A5E, 1898: 0x5A5F, 1899: 0x5A60, 1900: 0x5A61, 1901: 0x5A63, 1902: 0x5A64, 1903: 0x5A65, 1904: 0x5A66, 1905: 0x5A68, 1906: 0x5A69, 1907: 0x5A6B, 1908: 0x5A6C, 1909: 0x5A6D, 1910: 0x5A6E, 1911: 0x5A6F, 1912: 0x5A70, 1913: 0x5A71, 1914: 0x5A72, 1915: 0x5A73, 1916: 0x5A78, 1917: 0x5A79, 1918: 0x5A7B, 1919: 0x5A7C, 1920: 0x5A7D, 1921: 0x5A7E, 1922: 0x5A80, 1923: 0x5A81, 1924: 0x5A82, 1925: 0x5A83, 1926: 0x5A84, 1927: 0x5A85, 1928: 0x5A86, 1929: 0x5A87, 1930: 0x5A88, 1931: 0x5A89, 1932: 0x5A8A, 1933: 0x5A8B, 1934: 0x5A8C, 1935: 0x5A8D, 1936: 0x5A8E, 1937: 0x5A8F, 1938: 0x5A90, 1939: 0x5A91, 1940: 0x5A93, 1941: 0x5A94, 1942: 0x5A95, 1943: 0x5A96, 1944: 0x5A97, 1945: 0x5A98, 1946: 0x5A99, 1947: 0x5A9C, 1948: 0x5A9D, 1949: 0x5A9E, 1950: 0x5A9F, 1951: 0x5AA0, 1952: 0x5AA1, 1953: 0x5AA2, 1954: 0x5AA3, 1955: 0x5AA4, 1956: 0x5AA5, 1957: 0x5AA6, 1958: 0x5AA7, 1959: 0x5AA8, 1960: 0x5AA9, 1961: 0x5AAB, 1962: 0x5AAC, 1963: 0x5AAD, 1964: 0x5AAE, 1965: 0x5AAF, 1966: 0x5AB0, 1967: 0x5AB1, 1968: 0x5AB4, 1969: 0x5AB6, 1970: 0x5AB7, 1971: 0x5AB9, 1972: 0x5ABA, 1973: 0x5ABB, 1974: 0x5ABC, 1975: 0x5ABD, 1976: 0x5ABF, 1977: 0x5AC0, 1978: 0x5AC3, 1979: 0x5AC4, 1980: 0x5AC5, 1981: 0x5AC6, 1982: 0x5AC7, 1983: 0x5AC8, 1984: 0x5ACA, 1985: 0x5ACB, 1986: 0x5ACD, 1987: 0x5ACE, 1988: 0x5ACF, 1989: 0x5AD0, 1990: 0x5AD1, 1991: 0x5AD3, 1992: 0x5AD5, 1993: 0x5AD7, 1994: 0x5AD9, 1995: 0x5ADA, 1996: 0x5ADB, 1997: 0x5ADD, 1998: 0x5ADE, 1999: 0x5ADF, 2000: 0x5AE2, 2001: 0x5AE4, 2002: 0x5AE5, 2003: 0x5AE7, 2004: 0x5AE8, 2005: 0x5AEA, 2006: 0x5AEC, 2007: 0x5AED, 2008: 0x5AEE, 2009: 0x5AEF, 2010: 0x5AF0, 2011: 0x5AF2, 2012: 0x5AF3, 2013: 0x5AF4, 2014: 0x5AF5, 2015: 0x5AF6, 2016: 0x5AF7, 2017: 0x5AF8, 2018: 0x5AF9, 2019: 0x5AFA, 2020: 0x5AFB, 2021: 0x5AFC, 2022: 0x5AFD, 2023: 0x5AFE, 2024: 0x5AFF, 2025: 0x5B00, 2026: 0x5B01, 2027: 0x5B02, 2028: 0x5B03, 2029: 0x5B04, 2030: 0x5B05, 2031: 0x5B06, 2032: 0x5B07, 2033: 0x5B08, 2034: 0x5B0A, 2035: 0x5B0B, 2036: 0x5B0C, 2037: 0x5B0D, 2038: 0x5B0E, 2039: 0x5B0F, 2040: 0x5B10, 2041: 0x5B11, 2042: 0x5B12, 2043: 0x5B13, 2044: 0x5B14, 2045: 0x5B15, 2046: 0x5B18, 2047: 0x5B19, 2048: 0x5B1A, 2049: 0x5B1B, 2050: 0x5B1C, 2051: 0x5B1D, 2052: 0x5B1E, 2053: 0x5B1F, 2054: 0x5B20, 2055: 0x5B21, 2056: 0x5B22, 2057: 0x5B23, 2058: 0x5B24, 2059: 0x5B25, 2060: 0x5B26, 2061: 0x5B27, 2062: 0x5B28, 2063: 0x5B29, 2064: 0x5B2A, 2065: 0x5B2B, 2066: 0x5B2C, 2067: 0x5B2D, 2068: 0x5B2E, 2069: 0x5B2F, 2070: 0x5B30, 2071: 0x5B31, 2072: 0x5B33, 2073: 0x5B35, 2074: 0x5B36, 2075: 0x5B38, 2076: 0x5B39, 2077: 0x5B3A, 2078: 0x5B3B, 2079: 0x5B3C, 2080: 0x5B3D, 2081: 0x5B3E, 2082: 0x5B3F, 2083: 0x5B41, 2084: 0x5B42, 2085: 0x5B43, 2086: 0x5B44, 2087: 0x5B45, 2088: 0x5B46, 2089: 0x5B47, 2090: 0x5B48, 2091: 0x5B49, 2092: 0x5B4A, 2093: 0x5B4B, 2094: 0x5B4C, 2095: 0x5B4D, 2096: 0x5B4E, 2097: 0x5B4F, 2098: 0x5B52, 2099: 0x5B56, 2100: 0x5B5E, 2101: 0x5B60, 2102: 0x5B61, 2103: 0x5B67, 2104: 0x5B68, 2105: 0x5B6B, 2106: 0x5B6D, 2107: 0x5B6E, 2108: 0x5B6F, 2109: 0x5B72, 2110: 0x5B74, 2111: 0x5B76, 2112: 0x5B77, 2113: 0x5B78, 2114: 0x5B79, 2115: 0x5B7B, 2116: 0x5B7C, 2117: 0x5B7E, 2118: 0x5B7F, 2119: 0x5B82, 2120: 0x5B86, 2121: 0x5B8A, 2122: 0x5B8D, 2123: 0x5B8E, 2124: 0x5B90, 2125: 0x5B91, 2126: 0x5B92, 2127: 0x5B94, 2128: 0x5B96, 2129: 0x5B9F, 2130: 0x5BA7, 2131: 0x5BA8, 2132: 0x5BA9, 2133: 0x5BAC, 2134: 0x5BAD, 2135: 0x5BAE, 2136: 0x5BAF, 2137: 0x5BB1, 2138: 0x5BB2, 2139: 0x5BB7, 2140: 0x5BBA, 2141: 0x5BBB, 2142: 0x5BBC, 2143: 0x5BC0, 2144: 0x5BC1, 2145: 0x5BC3, 2146: 0x5BC8, 2147: 0x5BC9, 2148: 0x5BCA, 2149: 0x5BCB, 2150: 0x5BCD, 2151: 0x5BCE, 2152: 0x5BCF, 2153: 0x5BD1, 2154: 0x5BD4, 2155: 0x5BD5, 2156: 0x5BD6, 2157: 0x5BD7, 2158: 0x5BD8, 2159: 0x5BD9, 2160: 0x5BDA, 2161: 0x5BDB, 2162: 0x5BDC, 2163: 0x5BE0, 2164: 0x5BE2, 2165: 0x5BE3, 2166: 0x5BE6, 2167: 0x5BE7, 2168: 0x5BE9, 2169: 0x5BEA, 2170: 0x5BEB, 2171: 0x5BEC, 2172: 0x5BED, 2173: 0x5BEF, 2174: 0x5BF1, 2175: 0x5BF2, 2176: 0x5BF3, 2177: 0x5BF4, 2178: 0x5BF5, 2179: 0x5BF6, 2180: 0x5BF7, 2181: 0x5BFD, 2182: 0x5BFE, 2183: 0x5C00, 2184: 0x5C02, 2185: 0x5C03, 2186: 0x5C05, 2187: 0x5C07, 2188: 0x5C08, 2189: 0x5C0B, 2190: 0x5C0C, 2191: 0x5C0D, 2192: 0x5C0E, 2193: 0x5C10, 2194: 0x5C12, 2195: 0x5C13, 2196: 0x5C17, 2197: 0x5C19, 2198: 0x5C1B, 2199: 0x5C1E, 2200: 0x5C1F, 2201: 0x5C20, 2202: 0x5C21, 2203: 0x5C23, 2204: 0x5C26, 2205: 0x5C28, 2206: 0x5C29, 2207: 0x5C2A, 2208: 0x5C2B, 2209: 0x5C2D, 2210: 0x5C2E, 2211: 0x5C2F, 2212: 0x5C30, 2213: 0x5C32, 2214: 0x5C33, 2215: 0x5C35, 2216: 0x5C36, 2217: 0x5C37, 2218: 0x5C43, 2219: 0x5C44, 2220: 0x5C46, 2221: 0x5C47, 2222: 0x5C4C, 2223: 0x5C4D, 2224: 0x5C52, 2225: 0x5C53, 2226: 0x5C54, 2227: 0x5C56, 2228: 0x5C57, 2229: 0x5C58, 2230: 0x5C5A, 2231: 0x5C5B, 2232: 0x5C5C, 2233: 0x5C5D, 2234: 0x5C5F, 2235: 0x5C62, 2236: 0x5C64, 2237: 0x5C67, 2238: 0x5C68, 2239: 0x5C69, 2240: 0x5C6A, 2241: 0x5C6B, 2242: 0x5C6C, 2243: 0x5C6D, 2244: 0x5C70, 2245: 0x5C72, 2246: 0x5C73, 2247: 0x5C74, 2248: 0x5C75, 2249: 0x5C76, 2250: 0x5C77, 2251: 0x5C78, 2252: 0x5C7B, 2253: 0x5C7C, 2254: 0x5C7D, 2255: 0x5C7E, 2256: 0x5C80, 2257: 0x5C83, 2258: 0x5C84, 2259: 0x5C85, 2260: 0x5C86, 2261: 0x5C87, 2262: 0x5C89, 2263: 0x5C8A, 2264: 0x5C8B, 2265: 0x5C8E, 2266: 0x5C8F, 2267: 0x5C92, 2268: 0x5C93, 2269: 0x5C95, 2270: 0x5C9D, 2271: 0x5C9E, 2272: 0x5C9F, 2273: 0x5CA0, 2274: 0x5CA1, 2275: 0x5CA4, 2276: 0x5CA5, 2277: 0x5CA6, 2278: 0x5CA7, 2279: 0x5CA8, 2280: 0x5CAA, 2281: 0x5CAE, 2282: 0x5CAF, 2283: 0x5CB0, 2284: 0x5CB2, 2285: 0x5CB4, 2286: 0x5CB6, 2287: 0x5CB9, 2288: 0x5CBA, 2289: 0x5CBB, 2290: 0x5CBC, 2291: 0x5CBE, 2292: 0x5CC0, 2293: 0x5CC2, 2294: 0x5CC3, 2295: 0x5CC5, 2296: 0x5CC6, 2297: 0x5CC7, 2298: 0x5CC8, 2299: 0x5CC9, 2300: 0x5CCA, 2301: 0x5CCC, 2302: 0x5CCD, 2303: 0x5CCE, 2304: 0x5CCF, 2305: 0x5CD0, 2306: 0x5CD1, 2307: 0x5CD3, 2308: 0x5CD4, 2309: 0x5CD5, 2310: 0x5CD6, 2311: 0x5CD7, 2312: 0x5CD8, 2313: 0x5CDA, 2314: 0x5CDB, 2315: 0x5CDC, 2316: 0x5CDD, 2317: 0x5CDE, 2318: 0x5CDF, 2319: 0x5CE0, 2320: 0x5CE2, 2321: 0x5CE3, 2322: 0x5CE7, 2323: 0x5CE9, 2324: 0x5CEB, 2325: 0x5CEC, 2326: 0x5CEE, 2327: 0x5CEF, 2328: 0x5CF1, 2329: 0x5CF2, 2330: 0x5CF3, 2331: 0x5CF4, 2332: 0x5CF5, 2333: 0x5CF6, 2334: 0x5CF7, 2335: 0x5CF8, 2336: 0x5CF9, 2337: 0x5CFA, 2338: 0x5CFC, 2339: 0x5CFD, 2340: 0x5CFE, 2341: 0x5CFF, 2342: 0x5D00, 2343: 0x5D01, 2344: 0x5D04, 2345: 0x5D05, 2346: 0x5D08, 2347: 0x5D09, 2348: 0x5D0A, 2349: 0x5D0B, 2350: 0x5D0C, 2351: 0x5D0D, 2352: 0x5D0F, 2353: 0x5D10, 2354: 0x5D11, 2355: 0x5D12, 2356: 0x5D13, 2357: 0x5D15, 2358: 0x5D17, 2359: 0x5D18, 2360: 0x5D19, 2361: 0x5D1A, 2362: 0x5D1C, 2363: 0x5D1D, 2364: 0x5D1F, 2365: 0x5D20, 2366: 0x5D21, 2367: 0x5D22, 2368: 0x5D23, 2369: 0x5D25, 2370: 0x5D28, 2371: 0x5D2A, 2372: 0x5D2B, 2373: 0x5D2C, 2374: 0x5D2F, 2375: 0x5D30, 2376: 0x5D31, 2377: 0x5D32, 2378: 0x5D33, 2379: 0x5D35, 2380: 0x5D36, 2381: 0x5D37, 2382: 0x5D38, 2383: 0x5D39, 2384: 0x5D3A, 2385: 0x5D3B, 2386: 0x5D3C, 2387: 0x5D3F, 2388: 0x5D40, 2389: 0x5D41, 2390: 0x5D42, 2391: 0x5D43, 2392: 0x5D44, 2393: 0x5D45, 2394: 0x5D46, 2395: 0x5D48, 2396: 0x5D49, 2397: 0x5D4D, 2398: 0x5D4E, 2399: 0x5D4F, 2400: 0x5D50, 2401: 0x5D51, 2402: 0x5D52, 2403: 0x5D53, 2404: 0x5D54, 2405: 0x5D55, 2406: 0x5D56, 2407: 0x5D57, 2408: 0x5D59, 2409: 0x5D5A, 2410: 0x5D5C, 2411: 0x5D5E, 2412: 0x5D5F, 2413: 0x5D60, 2414: 0x5D61, 2415: 0x5D62, 2416: 0x5D63, 2417: 0x5D64, 2418: 0x5D65, 2419: 0x5D66, 2420: 0x5D67, 2421: 0x5D68, 2422: 0x5D6A, 2423: 0x5D6D, 2424: 0x5D6E, 2425: 0x5D70, 2426: 0x5D71, 2427: 0x5D72, 2428: 0x5D73, 2429: 0x5D75, 2430: 0x5D76, 2431: 0x5D77, 2432: 0x5D78, 2433: 0x5D79, 2434: 0x5D7A, 2435: 0x5D7B, 2436: 0x5D7C, 2437: 0x5D7D, 2438: 0x5D7E, 2439: 0x5D7F, 2440: 0x5D80, 2441: 0x5D81, 2442: 0x5D83, 2443: 0x5D84, 2444: 0x5D85, 2445: 0x5D86, 2446: 0x5D87, 2447: 0x5D88, 2448: 0x5D89, 2449: 0x5D8A, 2450: 0x5D8B, 2451: 0x5D8C, 2452: 0x5D8D, 2453: 0x5D8E, 2454: 0x5D8F, 2455: 0x5D90, 2456: 0x5D91, 2457: 0x5D92, 2458: 0x5D93, 2459: 0x5D94, 2460: 0x5D95, 2461: 0x5D96, 2462: 0x5D97, 2463: 0x5D98, 2464: 0x5D9A, 2465: 0x5D9B, 2466: 0x5D9C, 2467: 0x5D9E, 2468: 0x5D9F, 2469: 0x5DA0, 2470: 0x5DA1, 2471: 0x5DA2, 2472: 0x5DA3, 2473: 0x5DA4, 2474: 0x5DA5, 2475: 0x5DA6, 2476: 0x5DA7, 2477: 0x5DA8, 2478: 0x5DA9, 2479: 0x5DAA, 2480: 0x5DAB, 2481: 0x5DAC, 2482: 0x5DAD, 2483: 0x5DAE, 2484: 0x5DAF, 2485: 0x5DB0, 2486: 0x5DB1, 2487: 0x5DB2, 2488: 0x5DB3, 2489: 0x5DB4, 2490: 0x5DB5, 2491: 0x5DB6, 2492: 0x5DB8, 2493: 0x5DB9, 2494: 0x5DBA, 2495: 0x5DBB, 2496: 0x5DBC, 2497: 0x5DBD, 2498: 0x5DBE, 2499: 0x5DBF, 2500: 0x5DC0, 2501: 0x5DC1, 2502: 0x5DC2, 2503: 0x5DC3, 2504: 0x5DC4, 2505: 0x5DC6, 2506: 0x5DC7, 2507: 0x5DC8, 2508: 0x5DC9, 2509: 0x5DCA, 2510: 0x5DCB, 2511: 0x5DCC, 2512: 0x5DCE, 2513: 0x5DCF, 2514: 0x5DD0, 2515: 0x5DD1, 2516: 0x5DD2, 2517: 0x5DD3, 2518: 0x5DD4, 2519: 0x5DD5, 2520: 0x5DD6, 2521: 0x5DD7, 2522: 0x5DD8, 2523: 0x5DD9, 2524: 0x5DDA, 2525: 0x5DDC, 2526: 0x5DDF, 2527: 0x5DE0, 2528: 0x5DE3, 2529: 0x5DE4, 2530: 0x5DEA, 2531: 0x5DEC, 2532: 0x5DED, 2533: 0x5DF0, 2534: 0x5DF5, 2535: 0x5DF6, 2536: 0x5DF8, 2537: 0x5DF9, 2538: 0x5DFA, 2539: 0x5DFB, 2540: 0x5DFC, 2541: 0x5DFF, 2542: 0x5E00, 2543: 0x5E04, 2544: 0x5E07, 2545: 0x5E09, 2546: 0x5E0A, 2547: 0x5E0B, 2548: 0x5E0D, 2549: 0x5E0E, 2550: 0x5E12, 2551: 0x5E13, 2552: 0x5E17, 2553: 0x5E1E, 2554: 0x5E1F, 2555: 0x5E20, 2556: 0x5E21, 2557: 0x5E22, 2558: 0x5E23, 2559: 0x5E24, 2560: 0x5E25, 2561: 0x5E28, 2562: 0x5E29, 2563: 0x5E2A, 2564: 0x5E2B, 2565: 0x5E2C, 2566: 0x5E2F, 2567: 0x5E30, 2568: 0x5E32, 2569: 0x5E33, 2570: 0x5E34, 2571: 0x5E35, 2572: 0x5E36, 2573: 0x5E39, 2574: 0x5E3A, 2575: 0x5E3E, 2576: 0x5E3F, 2577: 0x5E40, 2578: 0x5E41, 2579: 0x5E43, 2580: 0x5E46, 2581: 0x5E47, 2582: 0x5E48, 2583: 0x5E49, 2584: 0x5E4A, 2585: 0x5E4B, 2586: 0x5E4D, 2587: 0x5E4E, 2588: 0x5E4F, 2589: 0x5E50, 2590: 0x5E51, 2591: 0x5E52, 2592: 0x5E53, 2593: 0x5E56, 2594: 0x5E57, 2595: 0x5E58, 2596: 0x5E59, 2597: 0x5E5A, 2598: 0x5E5C, 2599: 0x5E5D, 2600: 0x5E5F, 2601: 0x5E60, 2602: 0x5E63, 2603: 0x5E64, 2604: 0x5E65, 2605: 0x5E66, 2606: 0x5E67, 2607: 0x5E68, 2608: 0x5E69, 2609: 0x5E6A, 2610: 0x5E6B, 2611: 0x5E6C, 2612: 0x5E6D, 2613: 0x5E6E, 2614: 0x5E6F, 2615: 0x5E70, 2616: 0x5E71, 2617: 0x5E75, 2618: 0x5E77, 2619: 0x5E79, 2620: 0x5E7E, 2621: 0x5E81, 2622: 0x5E82, 2623: 0x5E83, 2624: 0x5E85, 2625: 0x5E88, 2626: 0x5E89, 2627: 0x5E8C, 2628: 0x5E8D, 2629: 0x5E8E, 2630: 0x5E92, 2631: 0x5E98, 2632: 0x5E9B, 2633: 0x5E9D, 2634: 0x5EA1, 2635: 0x5EA2, 2636: 0x5EA3, 2637: 0x5EA4, 2638: 0x5EA8, 2639: 0x5EA9, 2640: 0x5EAA, 2641: 0x5EAB, 2642: 0x5EAC, 2643: 0x5EAE, 2644: 0x5EAF, 2645: 0x5EB0, 2646: 0x5EB1, 2647: 0x5EB2, 2648: 0x5EB4, 2649: 0x5EBA, 2650: 0x5EBB, 2651: 0x5EBC, 2652: 0x5EBD, 2653: 0x5EBF, 2654: 0x5EC0, 2655: 0x5EC1, 2656: 0x5EC2, 2657: 0x5EC3, 2658: 0x5EC4, 2659: 0x5EC5, 2660: 0x5EC6, 2661: 0x5EC7, 2662: 0x5EC8, 2663: 0x5ECB, 2664: 0x5ECC, 2665: 0x5ECD, 2666: 0x5ECE, 2667: 0x5ECF, 2668: 0x5ED0, 2669: 0x5ED4, 2670: 0x5ED5, 2671: 0x5ED7, 2672: 0x5ED8, 2673: 0x5ED9, 2674: 0x5EDA, 2675: 0x5EDC, 2676: 0x5EDD, 2677: 0x5EDE, 2678: 0x5EDF, 2679: 0x5EE0, 2680: 0x5EE1, 2681: 0x5EE2, 2682: 0x5EE3, 2683: 0x5EE4, 2684: 0x5EE5, 2685: 0x5EE6, 2686: 0x5EE7, 2687: 0x5EE9, 2688: 0x5EEB, 2689: 0x5EEC, 2690: 0x5EED, 2691: 0x5EEE, 2692: 0x5EEF, 2693: 0x5EF0, 2694: 0x5EF1, 2695: 0x5EF2, 2696: 0x5EF3, 2697: 0x5EF5, 2698: 0x5EF8, 2699: 0x5EF9, 2700: 0x5EFB, 2701: 0x5EFC, 2702: 0x5EFD, 2703: 0x5F05, 2704: 0x5F06, 2705: 0x5F07, 2706: 0x5F09, 2707: 0x5F0C, 2708: 0x5F0D, 2709: 0x5F0E, 2710: 0x5F10, 2711: 0x5F12, 2712: 0x5F14, 2713: 0x5F16, 2714: 0x5F19, 2715: 0x5F1A, 2716: 0x5F1C, 2717: 0x5F1D, 2718: 0x5F1E, 2719: 0x5F21, 2720: 0x5F22, 2721: 0x5F23, 2722: 0x5F24, 2723: 0x5F28, 2724: 0x5F2B, 2725: 0x5F2C, 2726: 0x5F2E, 2727: 0x5F30, 2728: 0x5F32, 2729: 0x5F33, 2730: 0x5F34, 2731: 0x5F35, 2732: 0x5F36, 2733: 0x5F37, 2734: 0x5F38, 2735: 0x5F3B, 2736: 0x5F3D, 2737: 0x5F3E, 2738: 0x5F3F, 2739: 0x5F41, 2740: 0x5F42, 2741: 0x5F43, 2742: 0x5F44, 2743: 0x5F45, 2744: 0x5F46, 2745: 0x5F47, 2746: 0x5F48, 2747: 0x5F49, 2748: 0x5F4A, 2749: 0x5F4B, 2750: 0x5F4C, 2751: 0x5F4D, 2752: 0x5F4E, 2753: 0x5F4F, 2754: 0x5F51, 2755: 0x5F54, 2756: 0x5F59, 2757: 0x5F5A, 2758: 0x5F5B, 2759: 0x5F5C, 2760: 0x5F5E, 2761: 0x5F5F, 2762: 0x5F60, 2763: 0x5F63, 2764: 0x5F65, 2765: 0x5F67, 2766: 0x5F68, 2767: 0x5F6B, 2768: 0x5F6E, 2769: 0x5F6F, 2770: 0x5F72, 2771: 0x5F74, 2772: 0x5F75, 2773: 0x5F76, 2774: 0x5F78, 2775: 0x5F7A, 2776: 0x5F7D, 2777: 0x5F7E, 2778: 0x5F7F, 2779: 0x5F83, 2780: 0x5F86, 2781: 0x5F8D, 2782: 0x5F8E, 2783: 0x5F8F, 2784: 0x5F91, 2785: 0x5F93, 2786: 0x5F94, 2787: 0x5F96, 2788: 0x5F9A, 2789: 0x5F9B, 2790: 0x5F9D, 2791: 0x5F9E, 2792: 0x5F9F, 2793: 0x5FA0, 2794: 0x5FA2, 2795: 0x5FA3, 2796: 0x5FA4, 2797: 0x5FA5, 2798: 0x5FA6, 2799: 0x5FA7, 2800: 0x5FA9, 2801: 0x5FAB, 2802: 0x5FAC, 2803: 0x5FAF, 2804: 0x5FB0, 2805: 0x5FB1, 2806: 0x5FB2, 2807: 0x5FB3, 2808: 0x5FB4, 2809: 0x5FB6, 2810: 0x5FB8, 2811: 0x5FB9, 2812: 0x5FBA, 2813: 0x5FBB, 2814: 0x5FBE, 2815: 0x5FBF, 2816: 0x5FC0, 2817: 0x5FC1, 2818: 0x5FC2, 2819: 0x5FC7, 2820: 0x5FC8, 2821: 0x5FCA, 2822: 0x5FCB, 2823: 0x5FCE, 2824: 0x5FD3, 2825: 0x5FD4, 2826: 0x5FD5, 2827: 0x5FDA, 2828: 0x5FDB, 2829: 0x5FDC, 2830: 0x5FDE, 2831: 0x5FDF, 2832: 0x5FE2, 2833: 0x5FE3, 2834: 0x5FE5, 2835: 0x5FE6, 2836: 0x5FE8, 2837: 0x5FE9, 2838: 0x5FEC, 2839: 0x5FEF, 2840: 0x5FF0, 2841: 0x5FF2, 2842: 0x5FF3, 2843: 0x5FF4, 2844: 0x5FF6, 2845: 0x5FF7, 2846: 0x5FF9, 2847: 0x5FFA, 2848: 0x5FFC, 2849: 0x6007, 2850: 0x6008, 2851: 0x6009, 2852: 0x600B, 2853: 0x600C, 2854: 0x6010, 2855: 0x6011, 2856: 0x6013, 2857: 0x6017, 2858: 0x6018, 2859: 0x601A, 2860: 0x601E, 2861: 0x601F, 2862: 0x6022, 2863: 0x6023, 2864: 0x6024, 2865: 0x602C, 2866: 0x602D, 2867: 0x602E, 2868: 0x6030, 2869: 0x6031, 2870: 0x6032, 2871: 0x6033, 2872: 0x6034, 2873: 0x6036, 2874: 0x6037, 2875: 0x6038, 2876: 0x6039, 2877: 0x603A, 2878: 0x603D, 2879: 0x603E, 2880: 0x6040, 2881: 0x6044, 2882: 0x6045, 2883: 0x6046, 2884: 0x6047, 2885: 0x6048, 2886: 0x6049, 2887: 0x604A, 2888: 0x604C, 2889: 0x604E, 2890: 0x604F, 2891: 0x6051, 2892: 0x6053, 2893: 0x6054, 2894: 0x6056, 2895: 0x6057, 2896: 0x6058, 2897: 0x605B, 2898: 0x605C, 2899: 0x605E, 2900: 0x605F, 2901: 0x6060, 2902: 0x6061, 2903: 0x6065, 2904: 0x6066, 2905: 0x606E, 2906: 0x6071, 2907: 0x6072, 2908: 0x6074, 2909: 0x6075, 2910: 0x6077, 2911: 0x607E, 2912: 0x6080, 2913: 0x6081, 2914: 0x6082, 2915: 0x6085, 2916: 0x6086, 2917: 0x6087, 2918: 0x6088, 2919: 0x608A, 2920: 0x608B, 2921: 0x608E, 2922: 0x608F, 2923: 0x6090, 2924: 0x6091, 2925: 0x6093, 2926: 0x6095, 2927: 0x6097, 2928: 0x6098, 2929: 0x6099, 2930: 0x609C, 2931: 0x609E, 2932: 0x60A1, 2933: 0x60A2, 2934: 0x60A4, 2935: 0x60A5, 2936: 0x60A7, 2937: 0x60A9, 2938: 0x60AA, 2939: 0x60AE, 2940: 0x60B0, 2941: 0x60B3, 2942: 0x60B5, 2943: 0x60B6, 2944: 0x60B7, 2945: 0x60B9, 2946: 0x60BA, 2947: 0x60BD, 2948: 0x60BE, 2949: 0x60BF, 2950: 0x60C0, 2951: 0x60C1, 2952: 0x60C2, 2953: 0x60C3, 2954: 0x60C4, 2955: 0x60C7, 2956: 0x60C8, 2957: 0x60C9, 2958: 0x60CC, 2959: 0x60CD, 2960: 0x60CE, 2961: 0x60CF, 2962: 0x60D0, 2963: 0x60D2, 2964: 0x60D3, 2965: 0x60D4, 2966: 0x60D6, 2967: 0x60D7, 2968: 0x60D9, 2969: 0x60DB, 2970: 0x60DE, 2971: 0x60E1, 2972: 0x60E2, 2973: 0x60E3, 2974: 0x60E4, 2975: 0x60E5, 2976: 0x60EA, 2977: 0x60F1, 2978: 0x60F2, 2979: 0x60F5, 2980: 0x60F7, 2981: 0x60F8, 2982: 0x60FB, 2983: 0x60FC, 2984: 0x60FD, 2985: 0x60FE, 2986: 0x60FF, 2987: 0x6102, 2988: 0x6103, 2989: 0x6104, 2990: 0x6105, 2991: 0x6107, 2992: 0x610A, 2993: 0x610B, 2994: 0x610C, 2995: 0x6110, 2996: 0x6111, 2997: 0x6112, 2998: 0x6113, 2999: 0x6114, 3000: 0x6116, 3001: 0x6117, 3002: 0x6118, 3003: 0x6119, 3004: 0x611B, 3005: 0x611C, 3006: 0x611D, 3007: 0x611E, 3008: 0x6121, 3009: 0x6122, 3010: 0x6125, 3011: 0x6128, 3012: 0x6129, 3013: 0x612A, 3014: 0x612C, 3015: 0x612D, 3016: 0x612E, 3017: 0x612F, 3018: 0x6130, 3019: 0x6131, 3020: 0x6132, 3021: 0x6133, 3022: 0x6134, 3023: 0x6135, 3024: 0x6136, 3025: 0x6137, 3026: 0x6138, 3027: 0x6139, 3028: 0x613A, 3029: 0x613B, 3030: 0x613C, 3031: 0x613D, 3032: 0x613E, 3033: 0x6140, 3034: 0x6141, 3035: 0x6142, 3036: 0x6143, 3037: 0x6144, 3038: 0x6145, 3039: 0x6146, 3040: 0x6147, 3041: 0x6149, 3042: 0x614B, 3043: 0x614D, 3044: 0x614F, 3045: 0x6150, 3046: 0x6152, 3047: 0x6153, 3048: 0x6154, 3049: 0x6156, 3050: 0x6157, 3051: 0x6158, 3052: 0x6159, 3053: 0x615A, 3054: 0x615B, 3055: 0x615C, 3056: 0x615E, 3057: 0x615F, 3058: 0x6160, 3059: 0x6161, 3060: 0x6163, 3061: 0x6164, 3062: 0x6165, 3063: 0x6166, 3064: 0x6169, 3065: 0x616A, 3066: 0x616B, 3067: 0x616C, 3068: 0x616D, 3069: 0x616E, 3070: 0x616F, 3071: 0x6171, 3072: 0x6172, 3073: 0x6173, 3074: 0x6174, 3075: 0x6176, 3076: 0x6178, 3077: 0x6179, 3078: 0x617A, 3079: 0x617B, 3080: 0x617C, 3081: 0x617D, 3082: 0x617E, 3083: 0x617F, 3084: 0x6180, 3085: 0x6181, 3086: 0x6182, 3087: 0x6183, 3088: 0x6184, 3089: 0x6185, 3090: 0x6186, 3091: 0x6187, 3092: 0x6188, 3093: 0x6189, 3094: 0x618A, 3095: 0x618C, 3096: 0x618D, 3097: 0x618F, 3098: 0x6190, 3099: 0x6191, 3100: 0x6192, 3101: 0x6193, 3102: 0x6195, 3103: 0x6196, 3104: 0x6197, 3105: 0x6198, 3106: 0x6199, 3107: 0x619A, 3108: 0x619B, 3109: 0x619C, 3110: 0x619E, 3111: 0x619F, 3112: 0x61A0, 3113: 0x61A1, 3114: 0x61A2, 3115: 0x61A3, 3116: 0x61A4, 3117: 0x61A5, 3118: 0x61A6, 3119: 0x61AA, 3120: 0x61AB, 3121: 0x61AD, 3122: 0x61AE, 3123: 0x61AF, 3124: 0x61B0, 3125: 0x61B1, 3126: 0x61B2, 3127: 0x61B3, 3128: 0x61B4, 3129: 0x61B5, 3130: 0x61B6, 3131: 0x61B8, 3132: 0x61B9, 3133: 0x61BA, 3134: 0x61BB, 3135: 0x61BC, 3136: 0x61BD, 3137: 0x61BF, 3138: 0x61C0, 3139: 0x61C1, 3140: 0x61C3, 3141: 0x61C4, 3142: 0x61C5, 3143: 0x61C6, 3144: 0x61C7, 3145: 0x61C9, 3146: 0x61CC, 3147: 0x61CD, 3148: 0x61CE, 3149: 0x61CF, 3150: 0x61D0, 3151: 0x61D3, 3152: 0x61D5, 3153: 0x61D6, 3154: 0x61D7, 3155: 0x61D8, 3156: 0x61D9, 3157: 0x61DA, 3158: 0x61DB, 3159: 0x61DC, 3160: 0x61DD, 3161: 0x61DE, 3162: 0x61DF, 3163: 0x61E0, 3164: 0x61E1, 3165: 0x61E2, 3166: 0x61E3, 3167: 0x61E4, 3168: 0x61E5, 3169: 0x61E7, 3170: 0x61E8, 3171: 0x61E9, 3172: 0x61EA, 3173: 0x61EB, 3174: 0x61EC, 3175: 0x61ED, 3176: 0x61EE, 3177: 0x61EF, 3178: 0x61F0, 3179: 0x61F1, 3180: 0x61F2, 3181: 0x61F3, 3182: 0x61F4, 3183: 0x61F6, 3184: 0x61F7, 3185: 0x61F8, 3186: 0x61F9, 3187: 0x61FA, 3188: 0x61FB, 3189: 0x61FC, 3190: 0x61FD, 3191: 0x61FE, 3192: 0x6200, 3193: 0x6201, 3194: 0x6202, 3195: 0x6203, 3196: 0x6204, 3197: 0x6205, 3198: 0x6207, 3199: 0x6209, 3200: 0x6213, 3201: 0x6214, 3202: 0x6219, 3203: 0x621C, 3204: 0x621D, 3205: 0x621E, 3206: 0x6220, 3207: 0x6223, 3208: 0x6226, 3209: 0x6227, 3210: 0x6228, 3211: 0x6229, 3212: 0x622B, 3213: 0x622D, 3214: 0x622F, 3215: 0x6230, 3216: 0x6231, 3217: 0x6232, 3218: 0x6235, 3219: 0x6236, 3220: 0x6238, 3221: 0x6239, 3222: 0x623A, 3223: 0x623B, 3224: 0x623C, 3225: 0x6242, 3226: 0x6244, 3227: 0x6245, 3228: 0x6246, 3229: 0x624A, 3230: 0x624F, 3231: 0x6250, 3232: 0x6255, 3233: 0x6256, 3234: 0x6257, 3235: 0x6259, 3236: 0x625A, 3237: 0x625C, 3238: 0x625D, 3239: 0x625E, 3240: 0x625F, 3241: 0x6260, 3242: 0x6261, 3243: 0x6262, 3244: 0x6264, 3245: 0x6265, 3246: 0x6268, 3247: 0x6271, 3248: 0x6272, 3249: 0x6274, 3250: 0x6275, 3251: 0x6277, 3252: 0x6278, 3253: 0x627A, 3254: 0x627B, 3255: 0x627D, 3256: 0x6281, 3257: 0x6282, 3258: 0x6283, 3259: 0x6285, 3260: 0x6286, 3261: 0x6287, 3262: 0x6288, 3263: 0x628B, 3264: 0x628C, 3265: 0x628D, 3266: 0x628E, 3267: 0x628F, 3268: 0x6290, 3269: 0x6294, 3270: 0x6299, 3271: 0x629C, 3272: 0x629D, 3273: 0x629E, 3274: 0x62A3, 3275: 0x62A6, 3276: 0x62A7, 3277: 0x62A9, 3278: 0x62AA, 3279: 0x62AD, 3280: 0x62AE, 3281: 0x62AF, 3282: 0x62B0, 3283: 0x62B2, 3284: 0x62B3, 3285: 0x62B4, 3286: 0x62B6, 3287: 0x62B7, 3288: 0x62B8, 3289: 0x62BA, 3290: 0x62BE, 3291: 0x62C0, 3292: 0x62C1, 3293: 0x62C3, 3294: 0x62CB, 3295: 0x62CF, 3296: 0x62D1, 3297: 0x62D5, 3298: 0x62DD, 3299: 0x62DE, 3300: 0x62E0, 3301: 0x62E1, 3302: 0x62E4, 3303: 0x62EA, 3304: 0x62EB, 3305: 0x62F0, 3306: 0x62F2, 3307: 0x62F5, 3308: 0x62F8, 3309: 0x62F9, 3310: 0x62FA, 3311: 0x62FB, 3312: 0x6300, 3313: 0x6303, 3314: 0x6304, 3315: 0x6305, 3316: 0x6306, 3317: 0x630A, 3318: 0x630B, 3319: 0x630C, 3320: 0x630D, 3321: 0x630F, 3322: 0x6310, 3323: 0x6312, 3324: 0x6313, 3325: 0x6314, 3326: 0x6315, 3327: 0x6317, 3328: 0x6318, 3329: 0x6319, 3330: 0x631C, 3331: 0x6326, 3332: 0x6327, 3333: 0x6329, 3334: 0x632C, 3335: 0x632D, 3336: 0x632E, 3337: 0x6330, 3338: 0x6331, 3339: 0x6333, 3340: 0x6334, 3341: 0x6335, 3342: 0x6336, 3343: 0x6337, 3344: 0x6338, 3345: 0x633B, 3346: 0x633C, 3347: 0x633E, 3348: 0x633F, 3349: 0x6340, 3350: 0x6341, 3351: 0x6344, 3352: 0x6347, 3353: 0x6348, 3354: 0x634A, 3355: 0x6351, 3356: 0x6352, 3357: 0x6353, 3358: 0x6354, 3359: 0x6356, 3360: 0x6357, 3361: 0x6358, 3362: 0x6359, 3363: 0x635A, 3364: 0x635B, 3365: 0x635C, 3366: 0x635D, 3367: 0x6360, 3368: 0x6364, 3369: 0x6365, 3370: 0x6366, 3371: 0x6368, 3372: 0x636A, 3373: 0x636B, 3374: 0x636C, 3375: 0x636F, 3376: 0x6370, 3377: 0x6372, 3378: 0x6373, 3379: 0x6374, 3380: 0x6375, 3381: 0x6378, 3382: 0x6379, 3383: 0x637C, 3384: 0x637D, 3385: 0x637E, 3386: 0x637F, 3387: 0x6381, 3388: 0x6383, 3389: 0x6384, 3390: 0x6385, 3391: 0x6386, 3392: 0x638B, 3393: 0x638D, 3394: 0x6391, 3395: 0x6393, 3396: 0x6394, 3397: 0x6395, 3398: 0x6397, 3399: 0x6399, 3400: 0x639A, 3401: 0x639B, 3402: 0x639C, 3403: 0x639D, 3404: 0x639E, 3405: 0x639F, 3406: 0x63A1, 3407: 0x63A4, 3408: 0x63A6, 3409: 0x63AB, 3410: 0x63AF, 3411: 0x63B1, 3412: 0x63B2, 3413: 0x63B5, 3414: 0x63B6, 3415: 0x63B9, 3416: 0x63BB, 3417: 0x63BD, 3418: 0x63BF, 3419: 0x63C0, 3420: 0x63C1, 3421: 0x63C2, 3422: 0x63C3, 3423: 0x63C5, 3424: 0x63C7, 3425: 0x63C8, 3426: 0x63CA, 3427: 0x63CB, 3428: 0x63CC, 3429: 0x63D1, 3430: 0x63D3, 3431: 0x63D4, 3432: 0x63D5, 3433: 0x63D7, 3434: 0x63D8, 3435: 0x63D9, 3436: 0x63DA, 3437: 0x63DB, 3438: 0x63DC, 3439: 0x63DD, 3440: 0x63DF, 3441: 0x63E2, 3442: 0x63E4, 3443: 0x63E5, 3444: 0x63E6, 3445: 0x63E7, 3446: 0x63E8, 3447: 0x63EB, 3448: 0x63EC, 3449: 0x63EE, 3450: 0x63EF, 3451: 0x63F0, 3452: 0x63F1, 3453: 0x63F3, 3454: 0x63F5, 3455: 0x63F7, 3456: 0x63F9, 3457: 0x63FA, 3458: 0x63FB, 3459: 0x63FC, 3460: 0x63FE, 3461: 0x6403, 3462: 0x6404, 3463: 0x6406, 3464: 0x6407, 3465: 0x6408, 3466: 0x6409, 3467: 0x640A, 3468: 0x640D, 3469: 0x640E, 3470: 0x6411, 3471: 0x6412, 3472: 0x6415, 3473: 0x6416, 3474: 0x6417, 3475: 0x6418, 3476: 0x6419, 3477: 0x641A, 3478: 0x641D, 3479: 0x641F, 3480: 0x6422, 3481: 0x6423, 3482: 0x6424, 3483: 0x6425, 3484: 0x6427, 3485: 0x6428, 3486: 0x6429, 3487: 0x642B, 3488: 0x642E, 3489: 0x642F, 3490: 0x6430, 3491: 0x6431, 3492: 0x6432, 3493: 0x6433, 3494: 0x6435, 3495: 0x6436, 3496: 0x6437, 3497: 0x6438, 3498: 0x6439, 3499: 0x643B, 3500: 0x643C, 3501: 0x643E, 3502: 0x6440, 3503: 0x6442, 3504: 0x6443, 3505: 0x6449, 3506: 0x644B, 3507: 0x644C, 3508: 0x644D, 3509: 0x644E, 3510: 0x644F, 3511: 0x6450, 3512: 0x6451, 3513: 0x6453, 3514: 0x6455, 3515: 0x6456, 3516: 0x6457, 3517: 0x6459, 3518: 0x645A, 3519: 0x645B, 3520: 0x645C, 3521: 0x645D, 3522: 0x645F, 3523: 0x6460, 3524: 0x6461, 3525: 0x6462, 3526: 0x6463, 3527: 0x6464, 3528: 0x6465, 3529: 0x6466, 3530: 0x6468, 3531: 0x646A, 3532: 0x646B, 3533: 0x646C, 3534: 0x646E, 3535: 0x646F, 3536: 0x6470, 3537: 0x6471, 3538: 0x6472, 3539: 0x6473, 3540: 0x6474, 3541: 0x6475, 3542: 0x6476, 3543: 0x6477, 3544: 0x647B, 3545: 0x647C, 3546: 0x647D, 3547: 0x647E, 3548: 0x647F, 3549: 0x6480, 3550: 0x6481, 3551: 0x6483, 3552: 0x6486, 3553: 0x6488, 3554: 0x6489, 3555: 0x648A, 3556: 0x648B, 3557: 0x648C, 3558: 0x648D, 3559: 0x648E, 3560: 0x648F, 3561: 0x6490, 3562: 0x6493, 3563: 0x6494, 3564: 0x6497, 3565: 0x6498, 3566: 0x649A, 3567: 0x649B, 3568: 0x649C, 3569: 0x649D, 3570: 0x649F, 3571: 0x64A0, 3572: 0x64A1, 3573: 0x64A2, 3574: 0x64A3, 3575: 0x64A5, 3576: 0x64A6, 3577: 0x64A7, 3578: 0x64A8, 3579: 0x64AA, 3580: 0x64AB, 3581: 0x64AF, 3582: 0x64B1, 3583: 0x64B2, 3584: 0x64B3, 3585: 0x64B4, 3586: 0x64B6, 3587: 0x64B9, 3588: 0x64BB, 3589: 0x64BD, 3590: 0x64BE, 3591: 0x64BF, 3592: 0x64C1, 3593: 0x64C3, 3594: 0x64C4, 3595: 0x64C6, 3596: 0x64C7, 3597: 0x64C8, 3598: 0x64C9, 3599: 0x64CA, 3600: 0x64CB, 3601: 0x64CC, 3602: 0x64CF, 3603: 0x64D1, 3604: 0x64D3, 3605: 0x64D4, 3606: 0x64D5, 3607: 0x64D6, 3608: 0x64D9, 3609: 0x64DA, 3610: 0x64DB, 3611: 0x64DC, 3612: 0x64DD, 3613: 0x64DF, 3614: 0x64E0, 3615: 0x64E1, 3616: 0x64E3, 3617: 0x64E5, 3618: 0x64E7, 3619: 0x64E8, 3620: 0x64E9, 3621: 0x64EA, 3622: 0x64EB, 3623: 0x64EC, 3624: 0x64ED, 3625: 0x64EE, 3626: 0x64EF, 3627: 0x64F0, 3628: 0x64F1, 3629: 0x64F2, 3630: 0x64F3, 3631: 0x64F4, 3632: 0x64F5, 3633: 0x64F6, 3634: 0x64F7, 3635: 0x64F8, 3636: 0x64F9, 3637: 0x64FA, 3638: 0x64FB, 3639: 0x64FC, 3640: 0x64FD, 3641: 0x64FE, 3642: 0x64FF, 3643: 0x6501, 3644: 0x6502, 3645: 0x6503, 3646: 0x6504, 3647: 0x6505, 3648: 0x6506, 3649: 0x6507, 3650: 0x6508, 3651: 0x650A, 3652: 0x650B, 3653: 0x650C, 3654: 0x650D, 3655: 0x650E, 3656: 0x650F, 3657: 0x6510, 3658: 0x6511, 3659: 0x6513, 3660: 0x6514, 3661: 0x6515, 3662: 0x6516, 3663: 0x6517, 3664: 0x6519, 3665: 0x651A, 3666: 0x651B, 3667: 0x651C, 3668: 0x651D, 3669: 0x651E, 3670: 0x651F, 3671: 0x6520, 3672: 0x6521, 3673: 0x6522, 3674: 0x6523, 3675: 0x6524, 3676: 0x6526, 3677: 0x6527, 3678: 0x6528, 3679: 0x6529, 3680: 0x652A, 3681: 0x652C, 3682: 0x652D, 3683: 0x6530, 3684: 0x6531, 3685: 0x6532, 3686: 0x6533, 3687: 0x6537, 3688: 0x653A, 3689: 0x653C, 3690: 0x653D, 3691: 0x6540, 3692: 0x6541, 3693: 0x6542, 3694: 0x6543, 3695: 0x6544, 3696: 0x6546, 3697: 0x6547, 3698: 0x654A, 3699: 0x654B, 3700: 0x654D, 3701: 0x654E, 3702: 0x6550, 3703: 0x6552, 3704: 0x6553, 3705: 0x6554, 3706: 0x6557, 3707: 0x6558, 3708: 0x655A, 3709: 0x655C, 3710: 0x655F, 3711: 0x6560, 3712: 0x6561, 3713: 0x6564, 3714: 0x6565, 3715: 0x6567, 3716: 0x6568, 3717: 0x6569, 3718: 0x656A, 3719: 0x656D, 3720: 0x656E, 3721: 0x656F, 3722: 0x6571, 3723: 0x6573, 3724: 0x6575, 3725: 0x6576, 3726: 0x6578, 3727: 0x6579, 3728: 0x657A, 3729: 0x657B, 3730: 0x657C, 3731: 0x657D, 3732: 0x657E, 3733: 0x657F, 3734: 0x6580, 3735: 0x6581, 3736: 0x6582, 3737: 0x6583, 3738: 0x6584, 3739: 0x6585, 3740: 0x6586, 3741: 0x6588, 3742: 0x6589, 3743: 0x658A, 3744: 0x658D, 3745: 0x658E, 3746: 0x658F, 3747: 0x6592, 3748: 0x6594, 3749: 0x6595, 3750: 0x6596, 3751: 0x6598, 3752: 0x659A, 3753: 0x659D, 3754: 0x659E, 3755: 0x65A0, 3756: 0x65A2, 3757: 0x65A3, 3758: 0x65A6, 3759: 0x65A8, 3760: 0x65AA, 3761: 0x65AC, 3762: 0x65AE, 3763: 0x65B1, 3764: 0x65B2, 3765: 0x65B3, 3766: 0x65B4, 3767: 0x65B5, 3768: 0x65B6, 3769: 0x65B7, 3770: 0x65B8, 3771: 0x65BA, 3772: 0x65BB, 3773: 0x65BE, 3774: 0x65BF, 3775: 0x65C0, 3776: 0x65C2, 3777: 0x65C7, 3778: 0x65C8, 3779: 0x65C9, 3780: 0x65CA, 3781: 0x65CD, 3782: 0x65D0, 3783: 0x65D1, 3784: 0x65D3, 3785: 0x65D4, 3786: 0x65D5, 3787: 0x65D8, 3788: 0x65D9, 3789: 0x65DA, 3790: 0x65DB, 3791: 0x65DC, 3792: 0x65DD, 3793: 0x65DE, 3794: 0x65DF, 3795: 0x65E1, 3796: 0x65E3, 3797: 0x65E4, 3798: 0x65EA, 3799: 0x65EB, 3800: 0x65F2, 3801: 0x65F3, 3802: 0x65F4, 3803: 0x65F5, 3804: 0x65F8, 3805: 0x65F9, 3806: 0x65FB, 3807: 0x65FC, 3808: 0x65FD, 3809: 0x65FE, 3810: 0x65FF, 3811: 0x6601, 3812: 0x6604, 3813: 0x6605, 3814: 0x6607, 3815: 0x6608, 3816: 0x6609, 3817: 0x660B, 3818: 0x660D, 3819: 0x6610, 3820: 0x6611, 3821: 0x6612, 3822: 0x6616, 3823: 0x6617, 3824: 0x6618, 3825: 0x661A, 3826: 0x661B, 3827: 0x661C, 3828: 0x661E, 3829: 0x6621, 3830: 0x6622, 3831: 0x6623, 3832: 0x6624, 3833: 0x6626, 3834: 0x6629, 3835: 0x662A, 3836: 0x662B, 3837: 0x662C, 3838: 0x662E, 3839: 0x6630, 3840: 0x6632, 3841: 0x6633, 3842: 0x6637, 3843: 0x6638, 3844: 0x6639, 3845: 0x663A, 3846: 0x663B, 3847: 0x663D, 3848: 0x663F, 3849: 0x6640, 3850: 0x6642, 3851: 0x6644, 3852: 0x6645, 3853: 0x6646, 3854: 0x6647, 3855: 0x6648, 3856: 0x6649, 3857: 0x664A, 3858: 0x664D, 3859: 0x664E, 3860: 0x6650, 3861: 0x6651, 3862: 0x6658, 3863: 0x6659, 3864: 0x665B, 3865: 0x665C, 3866: 0x665D, 3867: 0x665E, 3868: 0x6660, 3869: 0x6662, 3870: 0x6663, 3871: 0x6665, 3872: 0x6667, 3873: 0x6669, 3874: 0x666A, 3875: 0x666B, 3876: 0x666C, 3877: 0x666D, 3878: 0x6671, 3879: 0x6672, 3880: 0x6673, 3881: 0x6675, 3882: 0x6678, 3883: 0x6679, 3884: 0x667B, 3885: 0x667C, 3886: 0x667D, 3887: 0x667F, 3888: 0x6680, 3889: 0x6681, 3890: 0x6683, 3891: 0x6685, 3892: 0x6686, 3893: 0x6688, 3894: 0x6689, 3895: 0x668A, 3896: 0x668B, 3897: 0x668D, 3898: 0x668E, 3899: 0x668F, 3900: 0x6690, 3901: 0x6692, 3902: 0x6693, 3903: 0x6694, 3904: 0x6695, 3905: 0x6698, 3906: 0x6699, 3907: 0x669A, 3908: 0x669B, 3909: 0x669C, 3910: 0x669E, 3911: 0x669F, 3912: 0x66A0, 3913: 0x66A1, 3914: 0x66A2, 3915: 0x66A3, 3916: 0x66A4, 3917: 0x66A5, 3918: 0x66A6, 3919: 0x66A9, 3920: 0x66AA, 3921: 0x66AB, 3922: 0x66AC, 3923: 0x66AD, 3924: 0x66AF, 3925: 0x66B0, 3926: 0x66B1, 3927: 0x66B2, 3928: 0x66B3, 3929: 0x66B5, 3930: 0x66B6, 3931: 0x66B7, 3932: 0x66B8, 3933: 0x66BA, 3934: 0x66BB, 3935: 0x66BC, 3936: 0x66BD, 3937: 0x66BF, 3938: 0x66C0, 3939: 0x66C1, 3940: 0x66C2, 3941: 0x66C3, 3942: 0x66C4, 3943: 0x66C5, 3944: 0x66C6, 3945: 0x66C7, 3946: 0x66C8, 3947: 0x66C9, 3948: 0x66CA, 3949: 0x66CB, 3950: 0x66CC, 3951: 0x66CD, 3952: 0x66CE, 3953: 0x66CF, 3954: 0x66D0, 3955: 0x66D1, 3956: 0x66D2, 3957: 0x66D3, 3958: 0x66D4, 3959: 0x66D5, 3960: 0x66D6, 3961: 0x66D7, 3962: 0x66D8, 3963: 0x66DA, 3964: 0x66DE, 3965: 0x66DF, 3966: 0x66E0, 3967: 0x66E1, 3968: 0x66E2, 3969: 0x66E3, 3970: 0x66E4, 3971: 0x66E5, 3972: 0x66E7, 3973: 0x66E8, 3974: 0x66EA, 3975: 0x66EB, 3976: 0x66EC, 3977: 0x66ED, 3978: 0x66EE, 3979: 0x66EF, 3980: 0x66F1, 3981: 0x66F5, 3982: 0x66F6, 3983: 0x66F8, 3984: 0x66FA, 3985: 0x66FB, 3986: 0x66FD, 3987: 0x6701, 3988: 0x6702, 3989: 0x6703, 3990: 0x6704, 3991: 0x6705, 3992: 0x6706, 3993: 0x6707, 3994: 0x670C, 3995: 0x670E, 3996: 0x670F, 3997: 0x6711, 3998: 0x6712, 3999: 0x6713, 4000: 0x6716, 4001: 0x6718, 4002: 0x6719, 4003: 0x671A, 4004: 0x671C, 4005: 0x671E, 4006: 0x6720, 4007: 0x6721, 4008: 0x6722, 4009: 0x6723, 4010: 0x6724, 4011: 0x6725, 4012: 0x6727, 4013: 0x6729, 4014: 0x672E, 4015: 0x6730, 4016: 0x6732, 4017: 0x6733, 4018: 0x6736, 4019: 0x6737, 4020: 0x6738, 4021: 0x6739, 4022: 0x673B, 4023: 0x673C, 4024: 0x673E, 4025: 0x673F, 4026: 0x6741, 4027: 0x6744, 4028: 0x6745, 4029: 0x6747, 4030: 0x674A, 4031: 0x674B, 4032: 0x674D, 4033: 0x6752, 4034: 0x6754, 4035: 0x6755, 4036: 0x6757, 4037: 0x6758, 4038: 0x6759, 4039: 0x675A, 4040: 0x675B, 4041: 0x675D, 4042: 0x6762, 4043: 0x6763, 4044: 0x6764, 4045: 0x6766, 4046: 0x6767, 4047: 0x676B, 4048: 0x676C, 4049: 0x676E, 4050: 0x6771, 4051: 0x6774, 4052: 0x6776, 4053: 0x6778, 4054: 0x6779, 4055: 0x677A, 4056: 0x677B, 4057: 0x677D, 4058: 0x6780, 4059: 0x6782, 4060: 0x6783, 4061: 0x6785, 4062: 0x6786, 4063: 0x6788, 4064: 0x678A, 4065: 0x678C, 4066: 0x678D, 4067: 0x678E, 4068: 0x678F, 4069: 0x6791, 4070: 0x6792, 4071: 0x6793, 4072: 0x6794, 4073: 0x6796, 4074: 0x6799, 4075: 0x679B, 4076: 0x679F, 4077: 0x67A0, 4078: 0x67A1, 4079: 0x67A4, 4080: 0x67A6, 4081: 0x67A9, 4082: 0x67AC, 4083: 0x67AE, 4084: 0x67B1, 4085: 0x67B2, 4086: 0x67B4, 4087: 0x67B9, 4088: 0x67BA, 4089: 0x67BB, 4090: 0x67BC, 4091: 0x67BD, 4092: 0x67BE, 4093: 0x67BF, 4094: 0x67C0, 4095: 0x67C2, 4096: 0x67C5, 4097: 0x67C6, 4098: 0x67C7, 4099: 0x67C8, 4100: 0x67C9, 4101: 0x67CA, 4102: 0x67CB, 4103: 0x67CC, 4104: 0x67CD, 4105: 0x67CE, 4106: 0x67D5, 4107: 0x67D6, 4108: 0x67D7, 4109: 0x67DB, 4110: 0x67DF, 4111: 0x67E1, 4112: 0x67E3, 4113: 0x67E4, 4114: 0x67E6, 4115: 0x67E7, 4116: 0x67E8, 4117: 0x67EA, 4118: 0x67EB, 4119: 0x67ED, 4120: 0x67EE, 4121: 0x67F2, 4122: 0x67F5, 4123: 0x67F6, 4124: 0x67F7, 4125: 0x67F8, 4126: 0x67F9, 4127: 0x67FA, 4128: 0x67FB, 4129: 0x67FC, 4130: 0x67FE, 4131: 0x6801, 4132: 0x6802, 4133: 0x6803, 4134: 0x6804, 4135: 0x6806, 4136: 0x680D, 4137: 0x6810, 4138: 0x6812, 4139: 0x6814, 4140: 0x6815, 4141: 0x6818, 4142: 0x6819, 4143: 0x681A, 4144: 0x681B, 4145: 0x681C, 4146: 0x681E, 4147: 0x681F, 4148: 0x6820, 4149: 0x6822, 4150: 0x6823, 4151: 0x6824, 4152: 0x6825, 4153: 0x6826, 4154: 0x6827, 4155: 0x6828, 4156: 0x682B, 4157: 0x682C, 4158: 0x682D, 4159: 0x682E, 4160: 0x682F, 4161: 0x6830, 4162: 0x6831, 4163: 0x6834, 4164: 0x6835, 4165: 0x6836, 4166: 0x683A, 4167: 0x683B, 4168: 0x683F, 4169: 0x6847, 4170: 0x684B, 4171: 0x684D, 4172: 0x684F, 4173: 0x6852, 4174: 0x6856, 4175: 0x6857, 4176: 0x6858, 4177: 0x6859, 4178: 0x685A, 4179: 0x685B, 4180: 0x685C, 4181: 0x685D, 4182: 0x685E, 4183: 0x685F, 4184: 0x686A, 4185: 0x686C, 4186: 0x686D, 4187: 0x686E, 4188: 0x686F, 4189: 0x6870, 4190: 0x6871, 4191: 0x6872, 4192: 0x6873, 4193: 0x6875, 4194: 0x6878, 4195: 0x6879, 4196: 0x687A, 4197: 0x687B, 4198: 0x687C, 4199: 0x687D, 4200: 0x687E, 4201: 0x687F, 4202: 0x6880, 4203: 0x6882, 4204: 0x6884, 4205: 0x6887, 4206: 0x6888, 4207: 0x6889, 4208: 0x688A, 4209: 0x688B, 4210: 0x688C, 4211: 0x688D, 4212: 0x688E, 4213: 0x6890, 4214: 0x6891, 4215: 0x6892, 4216: 0x6894, 4217: 0x6895, 4218: 0x6896, 4219: 0x6898, 4220: 0x6899, 4221: 0x689A, 4222: 0x689B, 4223: 0x689C, 4224: 0x689D, 4225: 0x689E, 4226: 0x689F, 4227: 0x68A0, 4228: 0x68A1, 4229: 0x68A3, 4230: 0x68A4, 4231: 0x68A5, 4232: 0x68A9, 4233: 0x68AA, 4234: 0x68AB, 4235: 0x68AC, 4236: 0x68AE, 4237: 0x68B1, 4238: 0x68B2, 4239: 0x68B4, 4240: 0x68B6, 4241: 0x68B7, 4242: 0x68B8, 4243: 0x68B9, 4244: 0x68BA, 4245: 0x68BB, 4246: 0x68BC, 4247: 0x68BD, 4248: 0x68BE, 4249: 0x68BF, 4250: 0x68C1, 4251: 0x68C3, 4252: 0x68C4, 4253: 0x68C5, 4254: 0x68C6, 4255: 0x68C7, 4256: 0x68C8, 4257: 0x68CA, 4258: 0x68CC, 4259: 0x68CE, 4260: 0x68CF, 4261: 0x68D0, 4262: 0x68D1, 4263: 0x68D3, 4264: 0x68D4, 4265: 0x68D6, 4266: 0x68D7, 4267: 0x68D9, 4268: 0x68DB, 4269: 0x68DC, 4270: 0x68DD, 4271: 0x68DE, 4272: 0x68DF, 4273: 0x68E1, 4274: 0x68E2, 4275: 0x68E4, 4276: 0x68E5, 4277: 0x68E6, 4278: 0x68E7, 4279: 0x68E8, 4280: 0x68E9, 4281: 0x68EA, 4282: 0x68EB, 4283: 0x68EC, 4284: 0x68ED, 4285: 0x68EF, 4286: 0x68F2, 4287: 0x68F3, 4288: 0x68F4, 4289: 0x68F6, 4290: 0x68F7, 4291: 0x68F8, 4292: 0x68FB, 4293: 0x68FD, 4294: 0x68FE, 4295: 0x68FF, 4296: 0x6900, 4297: 0x6902, 4298: 0x6903, 4299: 0x6904, 4300: 0x6906, 4301: 0x6907, 4302: 0x6908, 4303: 0x6909, 4304: 0x690A, 4305: 0x690C, 4306: 0x690F, 4307: 0x6911, 4308: 0x6913, 4309: 0x6914, 4310: 0x6915, 4311: 0x6916, 4312: 0x6917, 4313: 0x6918, 4314: 0x6919, 4315: 0x691A, 4316: 0x691B, 4317: 0x691C, 4318: 0x691D, 4319: 0x691E, 4320: 0x6921, 4321: 0x6922, 4322: 0x6923, 4323: 0x6925, 4324: 0x6926, 4325: 0x6927, 4326: 0x6928, 4327: 0x6929, 4328: 0x692A, 4329: 0x692B, 4330: 0x692C, 4331: 0x692E, 4332: 0x692F, 4333: 0x6931, 4334: 0x6932, 4335: 0x6933, 4336: 0x6935, 4337: 0x6936, 4338: 0x6937, 4339: 0x6938, 4340: 0x693A, 4341: 0x693B, 4342: 0x693C, 4343: 0x693E, 4344: 0x6940, 4345: 0x6941, 4346: 0x6943, 4347: 0x6944, 4348: 0x6945, 4349: 0x6946, 4350: 0x6947, 4351: 0x6948, 4352: 0x6949, 4353: 0x694A, 4354: 0x694B, 4355: 0x694C, 4356: 0x694D, 4357: 0x694E, 4358: 0x694F, 4359: 0x6950, 4360: 0x6951, 4361: 0x6952, 4362: 0x6953, 4363: 0x6955, 4364: 0x6956, 4365: 0x6958, 4366: 0x6959, 4367: 0x695B, 4368: 0x695C, 4369: 0x695F, 4370: 0x6961, 4371: 0x6962, 4372: 0x6964, 4373: 0x6965, 4374: 0x6967, 4375: 0x6968, 4376: 0x6969, 4377: 0x696A, 4378: 0x696C, 4379: 0x696D, 4380: 0x696F, 4381: 0x6970, 4382: 0x6972, 4383: 0x6973, 4384: 0x6974, 4385: 0x6975, 4386: 0x6976, 4387: 0x697A, 4388: 0x697B, 4389: 0x697D, 4390: 0x697E, 4391: 0x697F, 4392: 0x6981, 4393: 0x6983, 4394: 0x6985, 4395: 0x698A, 4396: 0x698B, 4397: 0x698C, 4398: 0x698E, 4399: 0x698F, 4400: 0x6990, 4401: 0x6991, 4402: 0x6992, 4403: 0x6993, 4404: 0x6996, 4405: 0x6997, 4406: 0x6999, 4407: 0x699A, 4408: 0x699D, 4409: 0x699E, 4410: 0x699F, 4411: 0x69A0, 4412: 0x69A1, 4413: 0x69A2, 4414: 0x69A3, 4415: 0x69A4, 4416: 0x69A5, 4417: 0x69A6, 4418: 0x69A9, 4419: 0x69AA, 4420: 0x69AC, 4421: 0x69AE, 4422: 0x69AF, 4423: 0x69B0, 4424: 0x69B2, 4425: 0x69B3, 4426: 0x69B5, 4427: 0x69B6, 4428: 0x69B8, 4429: 0x69B9, 4430: 0x69BA, 4431: 0x69BC, 4432: 0x69BD, 4433: 0x69BE, 4434: 0x69BF, 4435: 0x69C0, 4436: 0x69C2, 4437: 0x69C3, 4438: 0x69C4, 4439: 0x69C5, 4440: 0x69C6, 4441: 0x69C7, 4442: 0x69C8, 4443: 0x69C9, 4444: 0x69CB, 4445: 0x69CD, 4446: 0x69CF, 4447: 0x69D1, 4448: 0x69D2, 4449: 0x69D3, 4450: 0x69D5, 4451: 0x69D6, 4452: 0x69D7, 4453: 0x69D8, 4454: 0x69D9, 4455: 0x69DA, 4456: 0x69DC, 4457: 0x69DD, 4458: 0x69DE, 4459: 0x69E1, 4460: 0x69E2, 4461: 0x69E3, 4462: 0x69E4, 4463: 0x69E5, 4464: 0x69E6, 4465: 0x69E7, 4466: 0x69E8, 4467: 0x69E9, 4468: 0x69EA, 4469: 0x69EB, 4470: 0x69EC, 4471: 0x69EE, 4472: 0x69EF, 4473: 0x69F0, 4474: 0x69F1, 4475: 0x69F3, 4476: 0x69F4, 4477: 0x69F5, 4478: 0x69F6, 4479: 0x69F7, 4480: 0x69F8, 4481: 0x69F9, 4482: 0x69FA, 4483: 0x69FB, 4484: 0x69FC, 4485: 0x69FE, 4486: 0x6A00, 4487: 0x6A01, 4488: 0x6A02, 4489: 0x6A03, 4490: 0x6A04, 4491: 0x6A05, 4492: 0x6A06, 4493: 0x6A07, 4494: 0x6A08, 4495: 0x6A09, 4496: 0x6A0B, 4497: 0x6A0C, 4498: 0x6A0D, 4499: 0x6A0E, 4500: 0x6A0F, 4501: 0x6A10, 4502: 0x6A11, 4503: 0x6A12, 4504: 0x6A13, 4505: 0x6A14, 4506: 0x6A15, 4507: 0x6A16, 4508: 0x6A19, 4509: 0x6A1A, 4510: 0x6A1B, 4511: 0x6A1C, 4512: 0x6A1D, 4513: 0x6A1E, 4514: 0x6A20, 4515: 0x6A22, 4516: 0x6A23, 4517: 0x6A24, 4518: 0x6A25, 4519: 0x6A26, 4520: 0x6A27, 4521: 0x6A29, 4522: 0x6A2B, 4523: 0x6A2C, 4524: 0x6A2D, 4525: 0x6A2E, 4526: 0x6A30, 4527: 0x6A32, 4528: 0x6A33, 4529: 0x6A34, 4530: 0x6A36, 4531: 0x6A37, 4532: 0x6A38, 4533: 0x6A39, 4534: 0x6A3A, 4535: 0x6A3B, 4536: 0x6A3C, 4537: 0x6A3F, 4538: 0x6A40, 4539: 0x6A41, 4540: 0x6A42, 4541: 0x6A43, 4542: 0x6A45, 4543: 0x6A46, 4544: 0x6A48, 4545: 0x6A49, 4546: 0x6A4A, 4547: 0x6A4B, 4548: 0x6A4C, 4549: 0x6A4D, 4550: 0x6A4E, 4551: 0x6A4F, 4552: 0x6A51, 4553: 0x6A52, 4554: 0x6A53, 4555: 0x6A54, 4556: 0x6A55, 4557: 0x6A56, 4558: 0x6A57, 4559: 0x6A5A, 4560: 0x6A5C, 4561: 0x6A5D, 4562: 0x6A5E, 4563: 0x6A5F, 4564: 0x6A60, 4565: 0x6A62, 4566: 0x6A63, 4567: 0x6A64, 4568: 0x6A66, 4569: 0x6A67, 4570: 0x6A68, 4571: 0x6A69, 4572: 0x6A6A, 4573: 0x6A6B, 4574: 0x6A6C, 4575: 0x6A6D, 4576: 0x6A6E, 4577: 0x6A6F, 4578: 0x6A70, 4579: 0x6A72, 4580: 0x6A73, 4581: 0x6A74, 4582: 0x6A75, 4583: 0x6A76, 4584: 0x6A77, 4585: 0x6A78, 4586: 0x6A7A, 4587: 0x6A7B, 4588: 0x6A7D, 4589: 0x6A7E, 4590: 0x6A7F, 4591: 0x6A81, 4592: 0x6A82, 4593: 0x6A83, 4594: 0x6A85, 4595: 0x6A86, 4596: 0x6A87, 4597: 0x6A88, 4598: 0x6A89, 4599: 0x6A8A, 4600: 0x6A8B, 4601: 0x6A8C, 4602: 0x6A8D, 4603: 0x6A8F, 4604: 0x6A92, 4605: 0x6A93, 4606: 0x6A94, 4607: 0x6A95, 4608: 0x6A96, 4609: 0x6A98, 4610: 0x6A99, 4611: 0x6A9A, 4612: 0x6A9B, 4613: 0x6A9C, 4614: 0x6A9D, 4615: 0x6A9E, 4616: 0x6A9F, 4617: 0x6AA1, 4618: 0x6AA2, 4619: 0x6AA3, 4620: 0x6AA4, 4621: 0x6AA5, 4622: 0x6AA6, 4623: 0x6AA7, 4624: 0x6AA8, 4625: 0x6AAA, 4626: 0x6AAD, 4627: 0x6AAE, 4628: 0x6AAF, 4629: 0x6AB0, 4630: 0x6AB1, 4631: 0x6AB2, 4632: 0x6AB3, 4633: 0x6AB4, 4634: 0x6AB5, 4635: 0x6AB6, 4636: 0x6AB7, 4637: 0x6AB8, 4638: 0x6AB9, 4639: 0x6ABA, 4640: 0x6ABB, 4641: 0x6ABC, 4642: 0x6ABD, 4643: 0x6ABE, 4644: 0x6ABF, 4645: 0x6AC0, 4646: 0x6AC1, 4647: 0x6AC2, 4648: 0x6AC3, 4649: 0x6AC4, 4650: 0x6AC5, 4651: 0x6AC6, 4652: 0x6AC7, 4653: 0x6AC8, 4654: 0x6AC9, 4655: 0x6ACA, 4656: 0x6ACB, 4657: 0x6ACC, 4658: 0x6ACD, 4659: 0x6ACE, 4660: 0x6ACF, 4661: 0x6AD0, 4662: 0x6AD1, 4663: 0x6AD2, 4664: 0x6AD3, 4665: 0x6AD4, 4666: 0x6AD5, 4667: 0x6AD6, 4668: 0x6AD7, 4669: 0x6AD8, 4670: 0x6AD9, 4671: 0x6ADA, 4672: 0x6ADB, 4673: 0x6ADC, 4674: 0x6ADD, 4675: 0x6ADE, 4676: 0x6ADF, 4677: 0x6AE0, 4678: 0x6AE1, 4679: 0x6AE2, 4680: 0x6AE3, 4681: 0x6AE4, 4682: 0x6AE5, 4683: 0x6AE6, 4684: 0x6AE7, 4685: 0x6AE8, 4686: 0x6AE9, 4687: 0x6AEA, 4688: 0x6AEB, 4689: 0x6AEC, 4690: 0x6AED, 4691: 0x6AEE, 4692: 0x6AEF, 4693: 0x6AF0, 4694: 0x6AF1, 4695: 0x6AF2, 4696: 0x6AF3, 4697: 0x6AF4, 4698: 0x6AF5, 4699: 0x6AF6, 4700: 0x6AF7, 4701: 0x6AF8, 4702: 0x6AF9, 4703: 0x6AFA, 4704: 0x6AFB, 4705: 0x6AFC, 4706: 0x6AFD, 4707: 0x6AFE, 4708: 0x6AFF, 4709: 0x6B00, 4710: 0x6B01, 4711: 0x6B02, 4712: 0x6B03, 4713: 0x6B04, 4714: 0x6B05, 4715: 0x6B06, 4716: 0x6B07, 4717: 0x6B08, 4718: 0x6B09, 4719: 0x6B0A, 4720: 0x6B0B, 4721: 0x6B0C, 4722: 0x6B0D, 4723: 0x6B0E, 4724: 0x6B0F, 4725: 0x6B10, 4726: 0x6B11, 4727: 0x6B12, 4728: 0x6B13, 4729: 0x6B14, 4730: 0x6B15, 4731: 0x6B16, 4732: 0x6B17, 4733: 0x6B18, 4734: 0x6B19, 4735: 0x6B1A, 4736: 0x6B1B, 4737: 0x6B1C, 4738: 0x6B1D, 4739: 0x6B1E, 4740: 0x6B1F, 4741: 0x6B25, 4742: 0x6B26, 4743: 0x6B28, 4744: 0x6B29, 4745: 0x6B2A, 4746: 0x6B2B, 4747: 0x6B2C, 4748: 0x6B2D, 4749: 0x6B2E, 4750: 0x6B2F, 4751: 0x6B30, 4752: 0x6B31, 4753: 0x6B33, 4754: 0x6B34, 4755: 0x6B35, 4756: 0x6B36, 4757: 0x6B38, 4758: 0x6B3B, 4759: 0x6B3C, 4760: 0x6B3D, 4761: 0x6B3F, 4762: 0x6B40, 4763: 0x6B41, 4764: 0x6B42, 4765: 0x6B44, 4766: 0x6B45, 4767: 0x6B48, 4768: 0x6B4A, 4769: 0x6B4B, 4770: 0x6B4D, 4771: 0x6B4E, 4772: 0x6B4F, 4773: 0x6B50, 4774: 0x6B51, 4775: 0x6B52, 4776: 0x6B53, 4777: 0x6B54, 4778: 0x6B55, 4779: 0x6B56, 4780: 0x6B57, 4781: 0x6B58, 4782: 0x6B5A, 4783: 0x6B5B, 4784: 0x6B5C, 4785: 0x6B5D, 4786: 0x6B5E, 4787: 0x6B5F, 4788: 0x6B60, 4789: 0x6B61, 4790: 0x6B68, 4791: 0x6B69, 4792: 0x6B6B, 4793: 0x6B6C, 4794: 0x6B6D, 4795: 0x6B6E, 4796: 0x6B6F, 4797: 0x6B70, 4798: 0x6B71, 4799: 0x6B72, 4800: 0x6B73, 4801: 0x6B74, 4802: 0x6B75, 4803: 0x6B76, 4804: 0x6B77, 4805: 0x6B78, 4806: 0x6B7A, 4807: 0x6B7D, 4808: 0x6B7E, 4809: 0x6B7F, 4810: 0x6B80, 4811: 0x6B85, 4812: 0x6B88, 4813: 0x6B8C, 4814: 0x6B8E, 4815: 0x6B8F, 4816: 0x6B90, 4817: 0x6B91, 4818: 0x6B94, 4819: 0x6B95, 4820: 0x6B97, 4821: 0x6B98, 4822: 0x6B99, 4823: 0x6B9C, 4824: 0x6B9D, 4825: 0x6B9E, 4826: 0x6B9F, 4827: 0x6BA0, 4828: 0x6BA2, 4829: 0x6BA3, 4830: 0x6BA4, 4831: 0x6BA5, 4832: 0x6BA6, 4833: 0x6BA7, 4834: 0x6BA8, 4835: 0x6BA9, 4836: 0x6BAB, 4837: 0x6BAC, 4838: 0x6BAD, 4839: 0x6BAE, 4840: 0x6BAF, 4841: 0x6BB0, 4842: 0x6BB1, 4843: 0x6BB2, 4844: 0x6BB6, 4845: 0x6BB8, 4846: 0x6BB9, 4847: 0x6BBA, 4848: 0x6BBB, 4849: 0x6BBC, 4850: 0x6BBD, 4851: 0x6BBE, 4852: 0x6BC0, 4853: 0x6BC3, 4854: 0x6BC4, 4855: 0x6BC6, 4856: 0x6BC7, 4857: 0x6BC8, 4858: 0x6BC9, 4859: 0x6BCA, 4860: 0x6BCC, 4861: 0x6BCE, 4862: 0x6BD0, 4863: 0x6BD1, 4864: 0x6BD8, 4865: 0x6BDA, 4866: 0x6BDC, 4867: 0x6BDD, 4868: 0x6BDE, 4869: 0x6BDF, 4870: 0x6BE0, 4871: 0x6BE2, 4872: 0x6BE3, 4873: 0x6BE4, 4874: 0x6BE5, 4875: 0x6BE6, 4876: 0x6BE7, 4877: 0x6BE8, 4878: 0x6BE9, 4879: 0x6BEC, 4880: 0x6BED, 4881: 0x6BEE, 4882: 0x6BF0, 4883: 0x6BF1, 4884: 0x6BF2, 4885: 0x6BF4, 4886: 0x6BF6, 4887: 0x6BF7, 4888: 0x6BF8, 4889: 0x6BFA, 4890: 0x6BFB, 4891: 0x6BFC, 4892: 0x6BFE, 4893: 0x6BFF, 4894: 0x6C00, 4895: 0x6C01, 4896: 0x6C02, 4897: 0x6C03, 4898: 0x6C04, 4899: 0x6C08, 4900: 0x6C09, 4901: 0x6C0A, 4902: 0x6C0B, 4903: 0x6C0C, 4904: 0x6C0E, 4905: 0x6C12, 4906: 0x6C17, 4907: 0x6C1C, 4908: 0x6C1D, 4909: 0x6C1E, 4910: 0x6C20, 4911: 0x6C23, 4912: 0x6C25, 4913: 0x6C2B, 4914: 0x6C2C, 4915: 0x6C2D, 4916: 0x6C31, 4917: 0x6C33, 4918: 0x6C36, 4919: 0x6C37, 4920: 0x6C39, 4921: 0x6C3A, 4922: 0x6C3B, 4923: 0x6C3C, 4924: 0x6C3E, 4925: 0x6C3F, 4926: 0x6C43, 4927: 0x6C44, 4928: 0x6C45, 4929: 0x6C48, 4930: 0x6C4B, 4931: 0x6C4C, 4932: 0x6C4D, 4933: 0x6C4E, 4934: 0x6C4F, 4935: 0x6C51, 4936: 0x6C52, 4937: 0x6C53, 4938: 0x6C56, 4939: 0x6C58, 4940: 0x6C59, 4941: 0x6C5A, 4942: 0x6C62, 4943: 0x6C63, 4944: 0x6C65, 4945: 0x6C66, 4946: 0x6C67, 4947: 0x6C6B, 4948: 0x6C6C, 4949: 0x6C6D, 4950: 0x6C6E, 4951: 0x6C6F, 4952: 0x6C71, 4953: 0x6C73, 4954: 0x6C75, 4955: 0x6C77, 4956: 0x6C78, 4957: 0x6C7A, 4958: 0x6C7B, 4959: 0x6C7C, 4960: 0x6C7F, 4961: 0x6C80, 4962: 0x6C84, 4963: 0x6C87, 4964: 0x6C8A, 4965: 0x6C8B, 4966: 0x6C8D, 4967: 0x6C8E, 4968: 0x6C91, 4969: 0x6C92, 4970: 0x6C95, 4971: 0x6C96, 4972: 0x6C97, 4973: 0x6C98, 4974: 0x6C9A, 4975: 0x6C9C, 4976: 0x6C9D, 4977: 0x6C9E, 4978: 0x6CA0, 4979: 0x6CA2, 4980: 0x6CA8, 4981: 0x6CAC, 4982: 0x6CAF, 4983: 0x6CB0, 4984: 0x6CB4, 4985: 0x6CB5, 4986: 0x6CB6, 4987: 0x6CB7, 4988: 0x6CBA, 4989: 0x6CC0, 4990: 0x6CC1, 4991: 0x6CC2, 4992: 0x6CC3, 4993: 0x6CC6, 4994: 0x6CC7, 4995: 0x6CC8, 4996: 0x6CCB, 4997: 0x6CCD, 4998: 0x6CCE, 4999: 0x6CCF, 5000: 0x6CD1, 5001: 0x6CD2, 5002: 0x6CD8, 5003: 0x6CD9, 5004: 0x6CDA, 5005: 0x6CDC, 5006: 0x6CDD, 5007: 0x6CDF, 5008: 0x6CE4, 5009: 0x6CE6, 5010: 0x6CE7, 5011: 0x6CE9, 5012: 0x6CEC, 5013: 0x6CED, 5014: 0x6CF2, 5015: 0x6CF4, 5016: 0x6CF9, 5017: 0x6CFF, 5018: 0x6D00, 5019: 0x6D02, 5020: 0x6D03, 5021: 0x6D05, 5022: 0x6D06, 5023: 0x6D08, 5024: 0x6D09, 5025: 0x6D0A, 5026: 0x6D0D, 5027: 0x6D0F, 5028: 0x6D10, 5029: 0x6D11, 5030: 0x6D13, 5031: 0x6D14, 5032: 0x6D15, 5033: 0x6D16, 5034: 0x6D18, 5035: 0x6D1C, 5036: 0x6D1D, 5037: 0x6D1F, 5038: 0x6D20, 5039: 0x6D21, 5040: 0x6D22, 5041: 0x6D23, 5042: 0x6D24, 5043: 0x6D26, 5044: 0x6D28, 5045: 0x6D29, 5046: 0x6D2C, 5047: 0x6D2D, 5048: 0x6D2F, 5049: 0x6D30, 5050: 0x6D34, 5051: 0x6D36, 5052: 0x6D37, 5053: 0x6D38, 5054: 0x6D3A, 5055: 0x6D3F, 5056: 0x6D40, 5057: 0x6D42, 5058: 0x6D44, 5059: 0x6D49, 5060: 0x6D4C, 5061: 0x6D50, 5062: 0x6D55, 5063: 0x6D56, 5064: 0x6D57, 5065: 0x6D58, 5066: 0x6D5B, 5067: 0x6D5D, 5068: 0x6D5F, 5069: 0x6D61, 5070: 0x6D62, 5071: 0x6D64, 5072: 0x6D65, 5073: 0x6D67, 5074: 0x6D68, 5075: 0x6D6B, 5076: 0x6D6C, 5077: 0x6D6D, 5078: 0x6D70, 5079: 0x6D71, 5080: 0x6D72, 5081: 0x6D73, 5082: 0x6D75, 5083: 0x6D76, 5084: 0x6D79, 5085: 0x6D7A, 5086: 0x6D7B, 5087: 0x6D7D, 5088: 0x6D7E, 5089: 0x6D7F, 5090: 0x6D80, 5091: 0x6D81, 5092: 0x6D83, 5093: 0x6D84, 5094: 0x6D86, 5095: 0x6D87, 5096: 0x6D8A, 5097: 0x6D8B, 5098: 0x6D8D, 5099: 0x6D8F, 5100: 0x6D90, 5101: 0x6D92, 5102: 0x6D96, 5103: 0x6D97, 5104: 0x6D98, 5105: 0x6D99, 5106: 0x6D9A, 5107: 0x6D9C, 5108: 0x6DA2, 5109: 0x6DA5, 5110: 0x6DAC, 5111: 0x6DAD, 5112: 0x6DB0, 5113: 0x6DB1, 5114: 0x6DB3, 5115: 0x6DB4, 5116: 0x6DB6, 5117: 0x6DB7, 5118: 0x6DB9, 5119: 0x6DBA, 5120: 0x6DBB, 5121: 0x6DBC, 5122: 0x6DBD, 5123: 0x6DBE, 5124: 0x6DC1, 5125: 0x6DC2, 5126: 0x6DC3, 5127: 0x6DC8, 5128: 0x6DC9, 5129: 0x6DCA, 5130: 0x6DCD, 5131: 0x6DCE, 5132: 0x6DCF, 5133: 0x6DD0, 5134: 0x6DD2, 5135: 0x6DD3, 5136: 0x6DD4, 5137: 0x6DD5, 5138: 0x6DD7, 5139: 0x6DDA, 5140: 0x6DDB, 5141: 0x6DDC, 5142: 0x6DDF, 5143: 0x6DE2, 5144: 0x6DE3, 5145: 0x6DE5, 5146: 0x6DE7, 5147: 0x6DE8, 5148: 0x6DE9, 5149: 0x6DEA, 5150: 0x6DED, 5151: 0x6DEF, 5152: 0x6DF0, 5153: 0x6DF2, 5154: 0x6DF4, 5155: 0x6DF5, 5156: 0x6DF6, 5157: 0x6DF8, 5158: 0x6DFA, 5159: 0x6DFD, 5160: 0x6DFE, 5161: 0x6DFF, 5162: 0x6E00, 5163: 0x6E01, 5164: 0x6E02, 5165: 0x6E03, 5166: 0x6E04, 5167: 0x6E06, 5168: 0x6E07, 5169: 0x6E08, 5170: 0x6E09, 5171: 0x6E0B, 5172: 0x6E0F, 5173: 0x6E12, 5174: 0x6E13, 5175: 0x6E15, 5176: 0x6E18, 5177: 0x6E19, 5178: 0x6E1B, 5179: 0x6E1C, 5180: 0x6E1E, 5181: 0x6E1F, 5182: 0x6E22, 5183: 0x6E26, 5184: 0x6E27, 5185: 0x6E28, 5186: 0x6E2A, 5187: 0x6E2C, 5188: 0x6E2E, 5189: 0x6E30, 5190: 0x6E31, 5191: 0x6E33, 5192: 0x6E35, 5193: 0x6E36, 5194: 0x6E37, 5195: 0x6E39, 5196: 0x6E3B, 5197: 0x6E3C, 5198: 0x6E3D, 5199: 0x6E3E, 5200: 0x6E3F, 5201: 0x6E40, 5202: 0x6E41, 5203: 0x6E42, 5204: 0x6E45, 5205: 0x6E46, 5206: 0x6E47, 5207: 0x6E48, 5208: 0x6E49, 5209: 0x6E4A, 5210: 0x6E4B, 5211: 0x6E4C, 5212: 0x6E4F, 5213: 0x6E50, 5214: 0x6E51, 5215: 0x6E52, 5216: 0x6E55, 5217: 0x6E57, 5218: 0x6E59, 5219: 0x6E5A, 5220: 0x6E5C, 5221: 0x6E5D, 5222: 0x6E5E, 5223: 0x6E60, 5224: 0x6E61, 5225: 0x6E62, 5226: 0x6E63, 5227: 0x6E64, 5228: 0x6E65, 5229: 0x6E66, 5230: 0x6E67, 5231: 0x6E68, 5232: 0x6E69, 5233: 0x6E6A, 5234: 0x6E6C, 5235: 0x6E6D, 5236: 0x6E6F, 5237: 0x6E70, 5238: 0x6E71, 5239: 0x6E72, 5240: 0x6E73, 5241: 0x6E74, 5242: 0x6E75, 5243: 0x6E76, 5244: 0x6E77, 5245: 0x6E78, 5246: 0x6E79, 5247: 0x6E7A, 5248: 0x6E7B, 5249: 0x6E7C, 5250: 0x6E7D, 5251: 0x6E80, 5252: 0x6E81, 5253: 0x6E82, 5254: 0x6E84, 5255: 0x6E87, 5256: 0x6E88, 5257: 0x6E8A, 5258: 0x6E8B, 5259: 0x6E8C, 5260: 0x6E8D, 5261: 0x6E8E, 5262: 0x6E91, 5263: 0x6E92, 5264: 0x6E93, 5265: 0x6E94, 5266: 0x6E95, 5267: 0x6E96, 5268: 0x6E97, 5269: 0x6E99, 5270: 0x6E9A, 5271: 0x6E9B, 5272: 0x6E9D, 5273: 0x6E9E, 5274: 0x6EA0, 5275: 0x6EA1, 5276: 0x6EA3, 5277: 0x6EA4, 5278: 0x6EA6, 5279: 0x6EA8, 5280: 0x6EA9, 5281: 0x6EAB, 5282: 0x6EAC, 5283: 0x6EAD, 5284: 0x6EAE, 5285: 0x6EB0, 5286: 0x6EB3, 5287: 0x6EB5, 5288: 0x6EB8, 5289: 0x6EB9, 5290: 0x6EBC, 5291: 0x6EBE, 5292: 0x6EBF, 5293: 0x6EC0, 5294: 0x6EC3, 5295: 0x6EC4, 5296: 0x6EC5, 5297: 0x6EC6, 5298: 0x6EC8, 5299: 0x6EC9, 5300: 0x6ECA, 5301: 0x6ECC, 5302: 0x6ECD, 5303: 0x6ECE, 5304: 0x6ED0, 5305: 0x6ED2, 5306: 0x6ED6, 5307: 0x6ED8, 5308: 0x6ED9, 5309: 0x6EDB, 5310: 0x6EDC, 5311: 0x6EDD, 5312: 0x6EE3, 5313: 0x6EE7, 5314: 0x6EEA, 5315: 0x6EEB, 5316: 0x6EEC, 5317: 0x6EED, 5318: 0x6EEE, 5319: 0x6EEF, 5320: 0x6EF0, 5321: 0x6EF1, 5322: 0x6EF2, 5323: 0x6EF3, 5324: 0x6EF5, 5325: 0x6EF6, 5326: 0x6EF7, 5327: 0x6EF8, 5328: 0x6EFA, 5329: 0x6EFB, 5330: 0x6EFC, 5331: 0x6EFD, 5332: 0x6EFE, 5333: 0x6EFF, 5334: 0x6F00, 5335: 0x6F01, 5336: 0x6F03, 5337: 0x6F04, 5338: 0x6F05, 5339: 0x6F07, 5340: 0x6F08, 5341: 0x6F0A, 5342: 0x6F0B, 5343: 0x6F0C, 5344: 0x6F0D, 5345: 0x6F0E, 5346: 0x6F10, 5347: 0x6F11, 5348: 0x6F12, 5349: 0x6F16, 5350: 0x6F17, 5351: 0x6F18, 5352: 0x6F19, 5353: 0x6F1A, 5354: 0x6F1B, 5355: 0x6F1C, 5356: 0x6F1D, 5357: 0x6F1E, 5358: 0x6F1F, 5359: 0x6F21, 5360: 0x6F22, 5361: 0x6F23, 5362: 0x6F25, 5363: 0x6F26, 5364: 0x6F27, 5365: 0x6F28, 5366: 0x6F2C, 5367: 0x6F2E, 5368: 0x6F30, 5369: 0x6F32, 5370: 0x6F34, 5371: 0x6F35, 5372: 0x6F37, 5373: 0x6F38, 5374: 0x6F39, 5375: 0x6F3A, 5376: 0x6F3B, 5377: 0x6F3C, 5378: 0x6F3D, 5379: 0x6F3F, 5380: 0x6F40, 5381: 0x6F41, 5382: 0x6F42, 5383: 0x6F43, 5384: 0x6F44, 5385: 0x6F45, 5386: 0x6F48, 5387: 0x6F49, 5388: 0x6F4A, 5389: 0x6F4C, 5390: 0x6F4E, 5391: 0x6F4F, 5392: 0x6F50, 5393: 0x6F51, 5394: 0x6F52, 5395: 0x6F53, 5396: 0x6F54, 5397: 0x6F55, 5398: 0x6F56, 5399: 0x6F57, 5400: 0x6F59, 5401: 0x6F5A, 5402: 0x6F5B, 5403: 0x6F5D, 5404: 0x6F5F, 5405: 0x6F60, 5406: 0x6F61, 5407: 0x6F63, 5408: 0x6F64, 5409: 0x6F65, 5410: 0x6F67, 5411: 0x6F68, 5412: 0x6F69, 5413: 0x6F6A, 5414: 0x6F6B, 5415: 0x6F6C, 5416: 0x6F6F, 5417: 0x6F70, 5418: 0x6F71, 5419: 0x6F73, 5420: 0x6F75, 5421: 0x6F76, 5422: 0x6F77, 5423: 0x6F79, 5424: 0x6F7B, 5425: 0x6F7D, 5426: 0x6F7E, 5427: 0x6F7F, 5428: 0x6F80, 5429: 0x6F81, 5430: 0x6F82, 5431: 0x6F83, 5432: 0x6F85, 5433: 0x6F86, 5434: 0x6F87, 5435: 0x6F8A, 5436: 0x6F8B, 5437: 0x6F8F, 5438: 0x6F90, 5439: 0x6F91, 5440: 0x6F92, 5441: 0x6F93, 5442: 0x6F94, 5443: 0x6F95, 5444: 0x6F96, 5445: 0x6F97, 5446: 0x6F98, 5447: 0x6F99, 5448: 0x6F9A, 5449: 0x6F9B, 5450: 0x6F9D, 5451: 0x6F9E, 5452: 0x6F9F, 5453: 0x6FA0, 5454: 0x6FA2, 5455: 0x6FA3, 5456: 0x6FA4, 5457: 0x6FA5, 5458: 0x6FA6, 5459: 0x6FA8, 5460: 0x6FA9, 5461: 0x6FAA, 5462: 0x6FAB, 5463: 0x6FAC, 5464: 0x6FAD, 5465: 0x6FAE, 5466: 0x6FAF, 5467: 0x6FB0, 5468: 0x6FB1, 5469: 0x6FB2, 5470: 0x6FB4, 5471: 0x6FB5, 5472: 0x6FB7, 5473: 0x6FB8, 5474: 0x6FBA, 5475: 0x6FBB, 5476: 0x6FBC, 5477: 0x6FBD, 5478: 0x6FBE, 5479: 0x6FBF, 5480: 0x6FC1, 5481: 0x6FC3, 5482: 0x6FC4, 5483: 0x6FC5, 5484: 0x6FC6, 5485: 0x6FC7, 5486: 0x6FC8, 5487: 0x6FCA, 5488: 0x6FCB, 5489: 0x6FCC, 5490: 0x6FCD, 5491: 0x6FCE, 5492: 0x6FCF, 5493: 0x6FD0, 5494: 0x6FD3, 5495: 0x6FD4, 5496: 0x6FD5, 5497: 0x6FD6, 5498: 0x6FD7, 5499: 0x6FD8, 5500: 0x6FD9, 5501: 0x6FDA, 5502: 0x6FDB, 5503: 0x6FDC, 5504: 0x6FDD, 5505: 0x6FDF, 5506: 0x6FE2, 5507: 0x6FE3, 5508: 0x6FE4, 5509: 0x6FE5, 5510: 0x6FE6, 5511: 0x6FE7, 5512: 0x6FE8, 5513: 0x6FE9, 5514: 0x6FEA, 5515: 0x6FEB, 5516: 0x6FEC, 5517: 0x6FED, 5518: 0x6FF0, 5519: 0x6FF1, 5520: 0x6FF2, 5521: 0x6FF3, 5522: 0x6FF4, 5523: 0x6FF5, 5524: 0x6FF6, 5525: 0x6FF7, 5526: 0x6FF8, 5527: 0x6FF9, 5528: 0x6FFA, 5529: 0x6FFB, 5530: 0x6FFC, 5531: 0x6FFD, 5532: 0x6FFE, 5533: 0x6FFF, 5534: 0x7000, 5535: 0x7001, 5536: 0x7002, 5537: 0x7003, 5538: 0x7004, 5539: 0x7005, 5540: 0x7006, 5541: 0x7007, 5542: 0x7008, 5543: 0x7009, 5544: 0x700A, 5545: 0x700B, 5546: 0x700C, 5547: 0x700D, 5548: 0x700E, 5549: 0x700F, 5550: 0x7010, 5551: 0x7012, 5552: 0x7013, 5553: 0x7014, 5554: 0x7015, 5555: 0x7016, 5556: 0x7017, 5557: 0x7018, 5558: 0x7019, 5559: 0x701C, 5560: 0x701D, 5561: 0x701E, 5562: 0x701F, 5563: 0x7020, 5564: 0x7021, 5565: 0x7022, 5566: 0x7024, 5567: 0x7025, 5568: 0x7026, 5569: 0x7027, 5570: 0x7028, 5571: 0x7029, 5572: 0x702A, 5573: 0x702B, 5574: 0x702C, 5575: 0x702D, 5576: 0x702E, 5577: 0x702F, 5578: 0x7030, 5579: 0x7031, 5580: 0x7032, 5581: 0x7033, 5582: 0x7034, 5583: 0x7036, 5584: 0x7037, 5585: 0x7038, 5586: 0x703A, 5587: 0x703B, 5588: 0x703C, 5589: 0x703D, 5590: 0x703E, 5591: 0x703F, 5592: 0x7040, 5593: 0x7041, 5594: 0x7042, 5595: 0x7043, 5596: 0x7044, 5597: 0x7045, 5598: 0x7046, 5599: 0x7047, 5600: 0x7048, 5601: 0x7049, 5602: 0x704A, 5603: 0x704B, 5604: 0x704D, 5605: 0x704E, 5606: 0x7050, 5607: 0x7051, 5608: 0x7052, 5609: 0x7053, 5610: 0x7054, 5611: 0x7055, 5612: 0x7056, 5613: 0x7057, 5614: 0x7058, 5615: 0x7059, 5616: 0x705A, 5617: 0x705B, 5618: 0x705C, 5619: 0x705D, 5620: 0x705F, 5621: 0x7060, 5622: 0x7061, 5623: 0x7062, 5624: 0x7063, 5625: 0x7064, 5626: 0x7065, 5627: 0x7066, 5628: 0x7067, 5629: 0x7068, 5630: 0x7069, 5631: 0x706A, 5632: 0x706E, 5633: 0x7071, 5634: 0x7072, 5635: 0x7073, 5636: 0x7074, 5637: 0x7077, 5638: 0x7079, 5639: 0x707A, 5640: 0x707B, 5641: 0x707D, 5642: 0x7081, 5643: 0x7082, 5644: 0x7083, 5645: 0x7084, 5646: 0x7086, 5647: 0x7087, 5648: 0x7088, 5649: 0x708B, 5650: 0x708C, 5651: 0x708D, 5652: 0x708F, 5653: 0x7090, 5654: 0x7091, 5655: 0x7093, 5656: 0x7097, 5657: 0x7098, 5658: 0x709A, 5659: 0x709B, 5660: 0x709E, 5661: 0x709F, 5662: 0x70A0, 5663: 0x70A1, 5664: 0x70A2, 5665: 0x70A3, 5666: 0x70A4, 5667: 0x70A5, 5668: 0x70A6, 5669: 0x70A7, 5670: 0x70A8, 5671: 0x70A9, 5672: 0x70AA, 5673: 0x70B0, 5674: 0x70B2, 5675: 0x70B4, 5676: 0x70B5, 5677: 0x70B6, 5678: 0x70BA, 5679: 0x70BE, 5680: 0x70BF, 5681: 0x70C4, 5682: 0x70C5, 5683: 0x70C6, 5684: 0x70C7, 5685: 0x70C9, 5686: 0x70CB, 5687: 0x70CC, 5688: 0x70CD, 5689: 0x70CE, 5690: 0x70CF, 5691: 0x70D0, 5692: 0x70D1, 5693: 0x70D2, 5694: 0x70D3, 5695: 0x70D4, 5696: 0x70D5, 5697: 0x70D6, 5698: 0x70D7, 5699: 0x70DA, 5700: 0x70DC, 5701: 0x70DD, 5702: 0x70DE, 5703: 0x70E0, 5704: 0x70E1, 5705: 0x70E2, 5706: 0x70E3, 5707: 0x70E5, 5708: 0x70EA, 5709: 0x70EE, 5710: 0x70F0, 5711: 0x70F1, 5712: 0x70F2, 5713: 0x70F3, 5714: 0x70F4, 5715: 0x70F5, 5716: 0x70F6, 5717: 0x70F8, 5718: 0x70FA, 5719: 0x70FB, 5720: 0x70FC, 5721: 0x70FE, 5722: 0x70FF, 5723: 0x7100, 5724: 0x7101, 5725: 0x7102, 5726: 0x7103, 5727: 0x7104, 5728: 0x7105, 5729: 0x7106, 5730: 0x7107, 5731: 0x7108, 5732: 0x710B, 5733: 0x710C, 5734: 0x710D, 5735: 0x710E, 5736: 0x710F, 5737: 0x7111, 5738: 0x7112, 5739: 0x7114, 5740: 0x7117, 5741: 0x711B, 5742: 0x711C, 5743: 0x711D, 5744: 0x711E, 5745: 0x711F, 5746: 0x7120, 5747: 0x7121, 5748: 0x7122, 5749: 0x7123, 5750: 0x7124, 5751: 0x7125, 5752: 0x7127, 5753: 0x7128, 5754: 0x7129, 5755: 0x712A, 5756: 0x712B, 5757: 0x712C, 5758: 0x712D, 5759: 0x712E, 5760: 0x7132, 5761: 0x7133, 5762: 0x7134, 5763: 0x7135, 5764: 0x7137, 5765: 0x7138, 5766: 0x7139, 5767: 0x713A, 5768: 0x713B, 5769: 0x713C, 5770: 0x713D, 5771: 0x713E, 5772: 0x713F, 5773: 0x7140, 5774: 0x7141, 5775: 0x7142, 5776: 0x7143, 5777: 0x7144, 5778: 0x7146, 5779: 0x7147, 5780: 0x7148, 5781: 0x7149, 5782: 0x714B, 5783: 0x714D, 5784: 0x714F, 5785: 0x7150, 5786: 0x7151, 5787: 0x7152, 5788: 0x7153, 5789: 0x7154, 5790: 0x7155, 5791: 0x7156, 5792: 0x7157, 5793: 0x7158, 5794: 0x7159, 5795: 0x715A, 5796: 0x715B, 5797: 0x715D, 5798: 0x715F, 5799: 0x7160, 5800: 0x7161, 5801: 0x7162, 5802: 0x7163, 5803: 0x7165, 5804: 0x7169, 5805: 0x716A, 5806: 0x716B, 5807: 0x716C, 5808: 0x716D, 5809: 0x716F, 5810: 0x7170, 5811: 0x7171, 5812: 0x7174, 5813: 0x7175, 5814: 0x7176, 5815: 0x7177, 5816: 0x7179, 5817: 0x717B, 5818: 0x717C, 5819: 0x717E, 5820: 0x717F, 5821: 0x7180, 5822: 0x7181, 5823: 0x7182, 5824: 0x7183, 5825: 0x7185, 5826: 0x7186, 5827: 0x7187, 5828: 0x7188, 5829: 0x7189, 5830: 0x718B, 5831: 0x718C, 5832: 0x718D, 5833: 0x718E, 5834: 0x7190, 5835: 0x7191, 5836: 0x7192, 5837: 0x7193, 5838: 0x7195, 5839: 0x7196, 5840: 0x7197, 5841: 0x719A, 5842: 0x719B, 5843: 0x719C, 5844: 0x719D, 5845: 0x719E, 5846: 0x71A1, 5847: 0x71A2, 5848: 0x71A3, 5849: 0x71A4, 5850: 0x71A5, 5851: 0x71A6, 5852: 0x71A7, 5853: 0x71A9, 5854: 0x71AA, 5855: 0x71AB, 5856: 0x71AD, 5857: 0x71AE, 5858: 0x71AF, 5859: 0x71B0, 5860: 0x71B1, 5861: 0x71B2, 5862: 0x71B4, 5863: 0x71B6, 5864: 0x71B7, 5865: 0x71B8, 5866: 0x71BA, 5867: 0x71BB, 5868: 0x71BC, 5869: 0x71BD, 5870: 0x71BE, 5871: 0x71BF, 5872: 0x71C0, 5873: 0x71C1, 5874: 0x71C2, 5875: 0x71C4, 5876: 0x71C5, 5877: 0x71C6, 5878: 0x71C7, 5879: 0x71C8, 5880: 0x71C9, 5881: 0x71CA, 5882: 0x71CB, 5883: 0x71CC, 5884: 0x71CD, 5885: 0x71CF, 5886: 0x71D0, 5887: 0x71D1, 5888: 0x71D2, 5889: 0x71D3, 5890: 0x71D6, 5891: 0x71D7, 5892: 0x71D8, 5893: 0x71D9, 5894: 0x71DA, 5895: 0x71DB, 5896: 0x71DC, 5897: 0x71DD, 5898: 0x71DE, 5899: 0x71DF, 5900: 0x71E1, 5901: 0x71E2, 5902: 0x71E3, 5903: 0x71E4, 5904: 0x71E6, 5905: 0x71E8, 5906: 0x71E9, 5907: 0x71EA, 5908: 0x71EB, 5909: 0x71EC, 5910: 0x71ED, 5911: 0x71EF, 5912: 0x71F0, 5913: 0x71F1, 5914: 0x71F2, 5915: 0x71F3, 5916: 0x71F4, 5917: 0x71F5, 5918: 0x71F6, 5919: 0x71F7, 5920: 0x71F8, 5921: 0x71FA, 5922: 0x71FB, 5923: 0x71FC, 5924: 0x71FD, 5925: 0x71FE, 5926: 0x71FF, 5927: 0x7200, 5928: 0x7201, 5929: 0x7202, 5930: 0x7203, 5931: 0x7204, 5932: 0x7205, 5933: 0x7207, 5934: 0x7208, 5935: 0x7209, 5936: 0x720A, 5937: 0x720B, 5938: 0x720C, 5939: 0x720D, 5940: 0x720E, 5941: 0x720F, 5942: 0x7210, 5943: 0x7211, 5944: 0x7212, 5945: 0x7213, 5946: 0x7214, 5947: 0x7215, 5948: 0x7216, 5949: 0x7217, 5950: 0x7218, 5951: 0x7219, 5952: 0x721A, 5953: 0x721B, 5954: 0x721C, 5955: 0x721E, 5956: 0x721F, 5957: 0x7220, 5958: 0x7221, 5959: 0x7222, 5960: 0x7223, 5961: 0x7224, 5962: 0x7225, 5963: 0x7226, 5964: 0x7227, 5965: 0x7229, 5966: 0x722B, 5967: 0x722D, 5968: 0x722E, 5969: 0x722F, 5970: 0x7232, 5971: 0x7233, 5972: 0x7234, 5973: 0x723A, 5974: 0x723C, 5975: 0x723E, 5976: 0x7240, 5977: 0x7241, 5978: 0x7242, 5979: 0x7243, 5980: 0x7244, 5981: 0x7245, 5982: 0x7246, 5983: 0x7249, 5984: 0x724A, 5985: 0x724B, 5986: 0x724E, 5987: 0x724F, 5988: 0x7250, 5989: 0x7251, 5990: 0x7253, 5991: 0x7254, 5992: 0x7255, 5993: 0x7257, 5994: 0x7258, 5995: 0x725A, 5996: 0x725C, 5997: 0x725E, 5998: 0x7260, 5999: 0x7263, 6000: 0x7264, 6001: 0x7265, 6002: 0x7268, 6003: 0x726A, 6004: 0x726B, 6005: 0x726C, 6006: 0x726D, 6007: 0x7270, 6008: 0x7271, 6009: 0x7273, 6010: 0x7274, 6011: 0x7276, 6012: 0x7277, 6013: 0x7278, 6014: 0x727B, 6015: 0x727C, 6016: 0x727D, 6017: 0x7282, 6018: 0x7283, 6019: 0x7285, 6020: 0x7286, 6021: 0x7287, 6022: 0x7288, 6023: 0x7289, 6024: 0x728C, 6025: 0x728E, 6026: 0x7290, 6027: 0x7291, 6028: 0x7293, 6029: 0x7294, 6030: 0x7295, 6031: 0x7296, 6032: 0x7297, 6033: 0x7298, 6034: 0x7299, 6035: 0x729A, 6036: 0x729B, 6037: 0x729C, 6038: 0x729D, 6039: 0x729E, 6040: 0x72A0, 6041: 0x72A1, 6042: 0x72A2, 6043: 0x72A3, 6044: 0x72A4, 6045: 0x72A5, 6046: 0x72A6, 6047: 0x72A7, 6048: 0x72A8, 6049: 0x72A9, 6050: 0x72AA, 6051: 0x72AB, 6052: 0x72AE, 6053: 0x72B1, 6054: 0x72B2, 6055: 0x72B3, 6056: 0x72B5, 6057: 0x72BA, 6058: 0x72BB, 6059: 0x72BC, 6060: 0x72BD, 6061: 0x72BE, 6062: 0x72BF, 6063: 0x72C0, 6064: 0x72C5, 6065: 0x72C6, 6066: 0x72C7, 6067: 0x72C9, 6068: 0x72CA, 6069: 0x72CB, 6070: 0x72CC, 6071: 0x72CF, 6072: 0x72D1, 6073: 0x72D3, 6074: 0x72D4, 6075: 0x72D5, 6076: 0x72D6, 6077: 0x72D8, 6078: 0x72DA, 6079: 0x72DB, 6176: 0x3000, 6177: 0x3001, 6178: 0x3002, 6179: 0x00B7, 6180: 0x02C9, 6181: 0x02C7, 6182: 0x00A8, 6183: 0x3003, 6184: 0x3005, 6185: 0x2014, 6186: 0xFF5E, 6187: 0x2016, 6188: 0x2026, 6189: 0x2018, 6190: 0x2019, 6191: 0x201C, 6192: 0x201D, 6193: 0x3014, 6194: 0x3015, 6195: 0x3008, 6196: 0x3009, 6197: 0x300A, 6198: 0x300B, 6199: 0x300C, 6200: 0x300D, 6201: 0x300E, 6202: 0x300F, 6203: 0x3016, 6204: 0x3017, 6205: 0x3010, 6206: 0x3011, 6207: 0x00B1, 6208: 0x00D7, 6209: 0x00F7, 6210: 0x2236, 6211: 0x2227, 6212: 0x2228, 6213: 0x2211, 6214: 0x220F, 6215: 0x222A, 6216: 0x2229, 6217: 0x2208, 6218: 0x2237, 6219: 0x221A, 6220: 0x22A5, 6221: 0x2225, 6222: 0x2220, 6223: 0x2312, 6224: 0x2299, 6225: 0x222B, 6226: 0x222E, 6227: 0x2261, 6228: 0x224C, 6229: 0x2248, 6230: 0x223D, 6231: 0x221D, 6232: 0x2260, 6233: 0x226E, 6234: 0x226F, 6235: 0x2264, 6236: 0x2265, 6237: 0x221E, 6238: 0x2235, 6239: 0x2234, 6240: 0x2642, 6241: 0x2640, 6242: 0x00B0, 6243: 0x2032, 6244: 0x2033, 6245: 0x2103, 6246: 0xFF04, 6247: 0x00A4, 6248: 0xFFE0, 6249: 0xFFE1, 6250: 0x2030, 6251: 0x00A7, 6252: 0x2116, 6253: 0x2606, 6254: 0x2605, 6255: 0x25CB, 6256: 0x25CF, 6257: 0x25CE, 6258: 0x25C7, 6259: 0x25C6, 6260: 0x25A1, 6261: 0x25A0, 6262: 0x25B3, 6263: 0x25B2, 6264: 0x203B, 6265: 0x2192, 6266: 0x2190, 6267: 0x2191, 6268: 0x2193, 6269: 0x3013, 6366: 0x2170, 6367: 0x2171, 6368: 0x2172, 6369: 0x2173, 6370: 0x2174, 6371: 0x2175, 6372: 0x2176, 6373: 0x2177, 6374: 0x2178, 6375: 0x2179, 6382: 0x2488, 6383: 0x2489, 6384: 0x248A, 6385: 0x248B, 6386: 0x248C, 6387: 0x248D, 6388: 0x248E, 6389: 0x248F, 6390: 0x2490, 6391: 0x2491, 6392: 0x2492, 6393: 0x2493, 6394: 0x2494, 6395: 0x2495, 6396: 0x2496, 6397: 0x2497, 6398: 0x2498, 6399: 0x2499, 6400: 0x249A, 6401: 0x249B, 6402: 0x2474, 6403: 0x2475, 6404: 0x2476, 6405: 0x2477, 6406: 0x2478, 6407: 0x2479, 6408: 0x247A, 6409: 0x247B, 6410: 0x247C, 6411: 0x247D, 6412: 0x247E, 6413: 0x247F, 6414: 0x2480, 6415: 0x2481, 6416: 0x2482, 6417: 0x2483, 6418: 0x2484, 6419: 0x2485, 6420: 0x2486, 6421: 0x2487, 6422: 0x2460, 6423: 0x2461, 6424: 0x2462, 6425: 0x2463, 6426: 0x2464, 6427: 0x2465, 6428: 0x2466, 6429: 0x2467, 6430: 0x2468, 6431: 0x2469, 6432: 0x20AC, 6434: 0x3220, 6435: 0x3221, 6436: 0x3222, 6437: 0x3223, 6438: 0x3224, 6439: 0x3225, 6440: 0x3226, 6441: 0x3227, 6442: 0x3228, 6443: 0x3229, 6446: 0x2160, 6447: 0x2161, 6448: 0x2162, 6449: 0x2163, 6450: 0x2164, 6451: 0x2165, 6452: 0x2166, 6453: 0x2167, 6454: 0x2168, 6455: 0x2169, 6456: 0x216A, 6457: 0x216B, 6555: 0x3000, 6556: 0xFF01, 6557: 0xFF02, 6558: 0xFF03, 6559: 0xFFE5, 6560: 0xFF05, 6561: 0xFF06, 6562: 0xFF07, 6563: 0xFF08, 6564: 0xFF09, 6565: 0xFF0A, 6566: 0xFF0B, 6567: 0xFF0C, 6568: 0xFF0D, 6569: 0xFF0E, 6570: 0xFF0F, 6571: 0xFF10, 6572: 0xFF11, 6573: 0xFF12, 6574: 0xFF13, 6575: 0xFF14, 6576: 0xFF15, 6577: 0xFF16, 6578: 0xFF17, 6579: 0xFF18, 6580: 0xFF19, 6581: 0xFF1A, 6582: 0xFF1B, 6583: 0xFF1C, 6584: 0xFF1D, 6585: 0xFF1E, 6586: 0xFF1F, 6587: 0xFF20, 6588: 0xFF21, 6589: 0xFF22, 6590: 0xFF23, 6591: 0xFF24, 6592: 0xFF25, 6593: 0xFF26, 6594: 0xFF27, 6595: 0xFF28, 6596: 0xFF29, 6597: 0xFF2A, 6598: 0xFF2B, 6599: 0xFF2C, 6600: 0xFF2D, 6601: 0xFF2E, 6602: 0xFF2F, 6603: 0xFF30, 6604: 0xFF31, 6605: 0xFF32, 6606: 0xFF33, 6607: 0xFF34, 6608: 0xFF35, 6609: 0xFF36, 6610: 0xFF37, 6611: 0xFF38, 6612: 0xFF39, 6613: 0xFF3A, 6614: 0xFF3B, 6615: 0xFF3C, 6616: 0xFF3D, 6617: 0xFF3E, 6618: 0xFF3F, 6619: 0xFF40, 6620: 0xFF41, 6621: 0xFF42, 6622: 0xFF43, 6623: 0xFF44, 6624: 0xFF45, 6625: 0xFF46, 6626: 0xFF47, 6627: 0xFF48, 6628: 0xFF49, 6629: 0xFF4A, 6630: 0xFF4B, 6631: 0xFF4C, 6632: 0xFF4D, 6633: 0xFF4E, 6634: 0xFF4F, 6635: 0xFF50, 6636: 0xFF51, 6637: 0xFF52, 6638: 0xFF53, 6639: 0xFF54, 6640: 0xFF55, 6641: 0xFF56, 6642: 0xFF57, 6643: 0xFF58, 6644: 0xFF59, 6645: 0xFF5A, 6646: 0xFF5B, 6647: 0xFF5C, 6648: 0xFF5D, 6649: 0xFFE3, 6746: 0x3041, 6747: 0x3042, 6748: 0x3043, 6749: 0x3044, 6750: 0x3045, 6751: 0x3046, 6752: 0x3047, 6753: 0x3048, 6754: 0x3049, 6755: 0x304A, 6756: 0x304B, 6757: 0x304C, 6758: 0x304D, 6759: 0x304E, 6760: 0x304F, 6761: 0x3050, 6762: 0x3051, 6763: 0x3052, 6764: 0x3053, 6765: 0x3054, 6766: 0x3055, 6767: 0x3056, 6768: 0x3057, 6769: 0x3058, 6770: 0x3059, 6771: 0x305A, 6772: 0x305B, 6773: 0x305C, 6774: 0x305D, 6775: 0x305E, 6776: 0x305F, 6777: 0x3060, 6778: 0x3061, 6779: 0x3062, 6780: 0x3063, 6781: 0x3064, 6782: 0x3065, 6783: 0x3066, 6784: 0x3067, 6785: 0x3068, 6786: 0x3069, 6787: 0x306A, 6788: 0x306B, 6789: 0x306C, 6790: 0x306D, 6791: 0x306E, 6792: 0x306F, 6793: 0x3070, 6794: 0x3071, 6795: 0x3072, 6796: 0x3073, 6797: 0x3074, 6798: 0x3075, 6799: 0x3076, 6800: 0x3077, 6801: 0x3078, 6802: 0x3079, 6803: 0x307A, 6804: 0x307B, 6805: 0x307C, 6806: 0x307D, 6807: 0x307E, 6808: 0x307F, 6809: 0x3080, 6810: 0x3081, 6811: 0x3082, 6812: 0x3083, 6813: 0x3084, 6814: 0x3085, 6815: 0x3086, 6816: 0x3087, 6817: 0x3088, 6818: 0x3089, 6819: 0x308A, 6820: 0x308B, 6821: 0x308C, 6822: 0x308D, 6823: 0x308E, 6824: 0x308F, 6825: 0x3090, 6826: 0x3091, 6827: 0x3092, 6828: 0x3093, 6936: 0x30A1, 6937: 0x30A2, 6938: 0x30A3, 6939: 0x30A4, 6940: 0x30A5, 6941: 0x30A6, 6942: 0x30A7, 6943: 0x30A8, 6944: 0x30A9, 6945: 0x30AA, 6946: 0x30AB, 6947: 0x30AC, 6948: 0x30AD, 6949: 0x30AE, 6950: 0x30AF, 6951: 0x30B0, 6952: 0x30B1, 6953: 0x30B2, 6954: 0x30B3, 6955: 0x30B4, 6956: 0x30B5, 6957: 0x30B6, 6958: 0x30B7, 6959: 0x30B8, 6960: 0x30B9, 6961: 0x30BA, 6962: 0x30BB, 6963: 0x30BC, 6964: 0x30BD, 6965: 0x30BE, 6966: 0x30BF, 6967: 0x30C0, 6968: 0x30C1, 6969: 0x30C2, 6970: 0x30C3, 6971: 0x30C4, 6972: 0x30C5, 6973: 0x30C6, 6974: 0x30C7, 6975: 0x30C8, 6976: 0x30C9, 6977: 0x30CA, 6978: 0x30CB, 6979: 0x30CC, 6980: 0x30CD, 6981: 0x30CE, 6982: 0x30CF, 6983: 0x30D0, 6984: 0x30D1, 6985: 0x30D2, 6986: 0x30D3, 6987: 0x30D4, 6988: 0x30D5, 6989: 0x30D6, 6990: 0x30D7, 6991: 0x30D8, 6992: 0x30D9, 6993: 0x30DA, 6994: 0x30DB, 6995: 0x30DC, 6996: 0x30DD, 6997: 0x30DE, 6998: 0x30DF, 6999: 0x30E0, 7000: 0x30E1, 7001: 0x30E2, 7002: 0x30E3, 7003: 0x30E4, 7004: 0x30E5, 7005: 0x30E6, 7006: 0x30E7, 7007: 0x30E8, 7008: 0x30E9, 7009: 0x30EA, 7010: 0x30EB, 7011: 0x30EC, 7012: 0x30ED, 7013: 0x30EE, 7014: 0x30EF, 7015: 0x30F0, 7016: 0x30F1, 7017: 0x30F2, 7018: 0x30F3, 7019: 0x30F4, 7020: 0x30F5, 7021: 0x30F6, 7126: 0x0391, 7127: 0x0392, 7128: 0x0393, 7129: 0x0394, 7130: 0x0395, 7131: 0x0396, 7132: 0x0397, 7133: 0x0398, 7134: 0x0399, 7135: 0x039A, 7136: 0x039B, 7137: 0x039C, 7138: 0x039D, 7139: 0x039E, 7140: 0x039F, 7141: 0x03A0, 7142: 0x03A1, 7143: 0x03A3, 7144: 0x03A4, 7145: 0x03A5, 7146: 0x03A6, 7147: 0x03A7, 7148: 0x03A8, 7149: 0x03A9, 7158: 0x03B1, 7159: 0x03B2, 7160: 0x03B3, 7161: 0x03B4, 7162: 0x03B5, 7163: 0x03B6, 7164: 0x03B7, 7165: 0x03B8, 7166: 0x03B9, 7167: 0x03BA, 7168: 0x03BB, 7169: 0x03BC, 7170: 0x03BD, 7171: 0x03BE, 7172: 0x03BF, 7173: 0x03C0, 7174: 0x03C1, 7175: 0x03C3, 7176: 0x03C4, 7177: 0x03C5, 7178: 0x03C6, 7179: 0x03C7, 7180: 0x03C8, 7181: 0x03C9, 7189: 0xFE35, 7190: 0xFE36, 7191: 0xFE39, 7192: 0xFE3A, 7193: 0xFE3F, 7194: 0xFE40, 7195: 0xFE3D, 7196: 0xFE3E, 7197: 0xFE41, 7198: 0xFE42, 7199: 0xFE43, 7200: 0xFE44, 7203: 0xFE3B, 7204: 0xFE3C, 7205: 0xFE37, 7206: 0xFE38, 7207: 0xFE31, 7209: 0xFE33, 7210: 0xFE34, 7316: 0x0410, 7317: 0x0411, 7318: 0x0412, 7319: 0x0413, 7320: 0x0414, 7321: 0x0415, 7322: 0x0401, 7323: 0x0416, 7324: 0x0417, 7325: 0x0418, 7326: 0x0419, 7327: 0x041A, 7328: 0x041B, 7329: 0x041C, 7330: 0x041D, 7331: 0x041E, 7332: 0x041F, 7333: 0x0420, 7334: 0x0421, 7335: 0x0422, 7336: 0x0423, 7337: 0x0424, 7338: 0x0425, 7339: 0x0426, 7340: 0x0427, 7341: 0x0428, 7342: 0x0429, 7343: 0x042A, 7344: 0x042B, 7345: 0x042C, 7346: 0x042D, 7347: 0x042E, 7348: 0x042F, 7364: 0x0430, 7365: 0x0431, 7366: 0x0432, 7367: 0x0433, 7368: 0x0434, 7369: 0x0435, 7370: 0x0451, 7371: 0x0436, 7372: 0x0437, 7373: 0x0438, 7374: 0x0439, 7375: 0x043A, 7376: 0x043B, 7377: 0x043C, 7378: 0x043D, 7379: 0x043E, 7380: 0x043F, 7381: 0x0440, 7382: 0x0441, 7383: 0x0442, 7384: 0x0443, 7385: 0x0444, 7386: 0x0445, 7387: 0x0446, 7388: 0x0447, 7389: 0x0448, 7390: 0x0449, 7391: 0x044A, 7392: 0x044B, 7393: 0x044C, 7394: 0x044D, 7395: 0x044E, 7396: 0x044F, 7410: 0x02CA, 7411: 0x02CB, 7412: 0x02D9, 7413: 0x2013, 7414: 0x2015, 7415: 0x2025, 7416: 0x2035, 7417: 0x2105, 7418: 0x2109, 7419: 0x2196, 7420: 0x2197, 7421: 0x2198, 7422: 0x2199, 7423: 0x2215, 7424: 0x221F, 7425: 0x2223, 7426: 0x2252, 7427: 0x2266, 7428: 0x2267, 7429: 0x22BF, 7430: 0x2550, 7431: 0x2551, 7432: 0x2552, 7433: 0x2553, 7434: 0x2554, 7435: 0x2555, 7436: 0x2556, 7437: 0x2557, 7438: 0x2558, 7439: 0x2559, 7440: 0x255A, 7441: 0x255B, 7442: 0x255C, 7443: 0x255D, 7444: 0x255E, 7445: 0x255F, 7446: 0x2560, 7447: 0x2561, 7448: 0x2562, 7449: 0x2563, 7450: 0x2564, 7451: 0x2565, 7452: 0x2566, 7453: 0x2567, 7454: 0x2568, 7455: 0x2569, 7456: 0x256A, 7457: 0x256B, 7458: 0x256C, 7459: 0x256D, 7460: 0x256E, 7461: 0x256F, 7462: 0x2570, 7463: 0x2571, 7464: 0x2572, 7465: 0x2573, 7466: 0x2581, 7467: 0x2582, 7468: 0x2583, 7469: 0x2584, 7470: 0x2585, 7471: 0x2586, 7472: 0x2587, 7473: 0x2588, 7474: 0x2589, 7475: 0x258A, 7476: 0x258B, 7477: 0x258C, 7478: 0x258D, 7479: 0x258E, 7480: 0x258F, 7481: 0x2593, 7482: 0x2594, 7483: 0x2595, 7484: 0x25BC, 7485: 0x25BD, 7486: 0x25E2, 7487: 0x25E3, 7488: 0x25E4, 7489: 0x25E5, 7490: 0x2609, 7491: 0x2295, 7492: 0x3012, 7493: 0x301D, 7494: 0x301E, 7506: 0x0101, 7507: 0x00E1, 7508: 0x01CE, 7509: 0x00E0, 7510: 0x0113, 7511: 0x00E9, 7512: 0x011B, 7513: 0x00E8, 7514: 0x012B, 7515: 0x00ED, 7516: 0x01D0, 7517: 0x00EC, 7518: 0x014D, 7519: 0x00F3, 7520: 0x01D2, 7521: 0x00F2, 7522: 0x016B, 7523: 0x00FA, 7524: 0x01D4, 7525: 0x00F9, 7526: 0x01D6, 7527: 0x01D8, 7528: 0x01DA, 7529: 0x01DC, 7530: 0x00FC, 7531: 0x00EA, 7532: 0x0251, 7534: 0x0144, 7535: 0x0148, 7536: 0x01F9, 7537: 0x0261, 7542: 0x3105, 7543: 0x3106, 7544: 0x3107, 7545: 0x3108, 7546: 0x3109, 7547: 0x310A, 7548: 0x310B, 7549: 0x310C, 7550: 0x310D, 7551: 0x310E, 7552: 0x310F, 7553: 0x3110, 7554: 0x3111, 7555: 0x3112, 7556: 0x3113, 7557: 0x3114, 7558: 0x3115, 7559: 0x3116, 7560: 0x3117, 7561: 0x3118, 7562: 0x3119, 7563: 0x311A, 7564: 0x311B, 7565: 0x311C, 7566: 0x311D, 7567: 0x311E, 7568: 0x311F, 7569: 0x3120, 7570: 0x3121, 7571: 0x3122, 7572: 0x3123, 7573: 0x3124, 7574: 0x3125, 7575: 0x3126, 7576: 0x3127, 7577: 0x3128, 7578: 0x3129, 7600: 0x3021, 7601: 0x3022, 7602: 0x3023, 7603: 0x3024, 7604: 0x3025, 7605: 0x3026, 7606: 0x3027, 7607: 0x3028, 7608: 0x3029, 7609: 0x32A3, 7610: 0x338E, 7611: 0x338F, 7612: 0x339C, 7613: 0x339D, 7614: 0x339E, 7615: 0x33A1, 7616: 0x33C4, 7617: 0x33CE, 7618: 0x33D1, 7619: 0x33D2, 7620: 0x33D5, 7621: 0xFE30, 7622: 0xFFE2, 7623: 0xFFE4, 7625: 0x2121, 7626: 0x3231, 7628: 0x2010, 7632: 0x30FC, 7633: 0x309B, 7634: 0x309C, 7635: 0x30FD, 7636: 0x30FE, 7637: 0x3006, 7638: 0x309D, 7639: 0x309E, 7640: 0xFE49, 7641: 0xFE4A, 7642: 0xFE4B, 7643: 0xFE4C, 7644: 0xFE4D, 7645: 0xFE4E, 7646: 0xFE4F, 7647: 0xFE50, 7648: 0xFE51, 7649: 0xFE52, 7650: 0xFE54, 7651: 0xFE55, 7652: 0xFE56, 7653: 0xFE57, 7654: 0xFE59, 7655: 0xFE5A, 7656: 0xFE5B, 7657: 0xFE5C, 7658: 0xFE5D, 7659: 0xFE5E, 7660: 0xFE5F, 7661: 0xFE60, 7662: 0xFE61, 7663: 0xFE62, 7664: 0xFE63, 7665: 0xFE64, 7666: 0xFE65, 7667: 0xFE66, 7668: 0xFE68, 7669: 0xFE69, 7670: 0xFE6A, 7671: 0xFE6B, 7672: 0x303E, 7673: 0x2FF0, 7674: 0x2FF1, 7675: 0x2FF2, 7676: 0x2FF3, 7677: 0x2FF4, 7678: 0x2FF5, 7679: 0x2FF6, 7680: 0x2FF7, 7681: 0x2FF8, 7682: 0x2FF9, 7683: 0x2FFA, 7684: 0x2FFB, 7685: 0x3007, 7699: 0x2500, 7700: 0x2501, 7701: 0x2502, 7702: 0x2503, 7703: 0x2504, 7704: 0x2505, 7705: 0x2506, 7706: 0x2507, 7707: 0x2508, 7708: 0x2509, 7709: 0x250A, 7710: 0x250B, 7711: 0x250C, 7712: 0x250D, 7713: 0x250E, 7714: 0x250F, 7715: 0x2510, 7716: 0x2511, 7717: 0x2512, 7718: 0x2513, 7719: 0x2514, 7720: 0x2515, 7721: 0x2516, 7722: 0x2517, 7723: 0x2518, 7724: 0x2519, 7725: 0x251A, 7726: 0x251B, 7727: 0x251C, 7728: 0x251D, 7729: 0x251E, 7730: 0x251F, 7731: 0x2520, 7732: 0x2521, 7733: 0x2522, 7734: 0x2523, 7735: 0x2524, 7736: 0x2525, 7737: 0x2526, 7738: 0x2527, 7739: 0x2528, 7740: 0x2529, 7741: 0x252A, 7742: 0x252B, 7743: 0x252C, 7744: 0x252D, 7745: 0x252E, 7746: 0x252F, 7747: 0x2530, 7748: 0x2531, 7749: 0x2532, 7750: 0x2533, 7751: 0x2534, 7752: 0x2535, 7753: 0x2536, 7754: 0x2537, 7755: 0x2538, 7756: 0x2539, 7757: 0x253A, 7758: 0x253B, 7759: 0x253C, 7760: 0x253D, 7761: 0x253E, 7762: 0x253F, 7763: 0x2540, 7764: 0x2541, 7765: 0x2542, 7766: 0x2543, 7767: 0x2544, 7768: 0x2545, 7769: 0x2546, 7770: 0x2547, 7771: 0x2548, 7772: 0x2549, 7773: 0x254A, 7774: 0x254B, 7790: 0x72DC, 7791: 0x72DD, 7792: 0x72DF, 7793: 0x72E2, 7794: 0x72E3, 7795: 0x72E4, 7796: 0x72E5, 7797: 0x72E6, 7798: 0x72E7, 7799: 0x72EA, 7800: 0x72EB, 7801: 0x72F5, 7802: 0x72F6, 7803: 0x72F9, 7804: 0x72FD, 7805: 0x72FE, 7806: 0x72FF, 7807: 0x7300, 7808: 0x7302, 7809: 0x7304, 7810: 0x7305, 7811: 0x7306, 7812: 0x7307, 7813: 0x7308, 7814: 0x7309, 7815: 0x730B, 7816: 0x730C, 7817: 0x730D, 7818: 0x730F, 7819: 0x7310, 7820: 0x7311, 7821: 0x7312, 7822: 0x7314, 7823: 0x7318, 7824: 0x7319, 7825: 0x731A, 7826: 0x731F, 7827: 0x7320, 7828: 0x7323, 7829: 0x7324, 7830: 0x7326, 7831: 0x7327, 7832: 0x7328, 7833: 0x732D, 7834: 0x732F, 7835: 0x7330, 7836: 0x7332, 7837: 0x7333, 7838: 0x7335, 7839: 0x7336, 7840: 0x733A, 7841: 0x733B, 7842: 0x733C, 7843: 0x733D, 7844: 0x7340, 7845: 0x7341, 7846: 0x7342, 7847: 0x7343, 7848: 0x7344, 7849: 0x7345, 7850: 0x7346, 7851: 0x7347, 7852: 0x7348, 7853: 0x7349, 7854: 0x734A, 7855: 0x734B, 7856: 0x734C, 7857: 0x734E, 7858: 0x734F, 7859: 0x7351, 7860: 0x7353, 7861: 0x7354, 7862: 0x7355, 7863: 0x7356, 7864: 0x7358, 7865: 0x7359, 7866: 0x735A, 7867: 0x735B, 7868: 0x735C, 7869: 0x735D, 7870: 0x735E, 7871: 0x735F, 7872: 0x7361, 7873: 0x7362, 7874: 0x7363, 7875: 0x7364, 7876: 0x7365, 7877: 0x7366, 7878: 0x7367, 7879: 0x7368, 7880: 0x7369, 7881: 0x736A, 7882: 0x736B, 7883: 0x736E, 7884: 0x7370, 7885: 0x7371, 7980: 0x7372, 7981: 0x7373, 7982: 0x7374, 7983: 0x7375, 7984: 0x7376, 7985: 0x7377, 7986: 0x7378, 7987: 0x7379, 7988: 0x737A, 7989: 0x737B, 7990: 0x737C, 7991: 0x737D, 7992: 0x737F, 7993: 0x7380, 7994: 0x7381, 7995: 0x7382, 7996: 0x7383, 7997: 0x7385, 7998: 0x7386, 7999: 0x7388, 8000: 0x738A, 8001: 0x738C, 8002: 0x738D, 8003: 0x738F, 8004: 0x7390, 8005: 0x7392, 8006: 0x7393, 8007: 0x7394, 8008: 0x7395, 8009: 0x7397, 8010: 0x7398, 8011: 0x7399, 8012: 0x739A, 8013: 0x739C, 8014: 0x739D, 8015: 0x739E, 8016: 0x73A0, 8017: 0x73A1, 8018: 0x73A3, 8019: 0x73A4, 8020: 0x73A5, 8021: 0x73A6, 8022: 0x73A7, 8023: 0x73A8, 8024: 0x73AA, 8025: 0x73AC, 8026: 0x73AD, 8027: 0x73B1, 8028: 0x73B4, 8029: 0x73B5, 8030: 0x73B6, 8031: 0x73B8, 8032: 0x73B9, 8033: 0x73BC, 8034: 0x73BD, 8035: 0x73BE, 8036: 0x73BF, 8037: 0x73C1, 8038: 0x73C3, 8039: 0x73C4, 8040: 0x73C5, 8041: 0x73C6, 8042: 0x73C7, 8043: 0x73CB, 8044: 0x73CC, 8045: 0x73CE, 8046: 0x73D2, 8047: 0x73D3, 8048: 0x73D4, 8049: 0x73D5, 8050: 0x73D6, 8051: 0x73D7, 8052: 0x73D8, 8053: 0x73DA, 8054: 0x73DB, 8055: 0x73DC, 8056: 0x73DD, 8057: 0x73DF, 8058: 0x73E1, 8059: 0x73E2, 8060: 0x73E3, 8061: 0x73E4, 8062: 0x73E6, 8063: 0x73E8, 8064: 0x73EA, 8065: 0x73EB, 8066: 0x73EC, 8067: 0x73EE, 8068: 0x73EF, 8069: 0x73F0, 8070: 0x73F1, 8071: 0x73F3, 8072: 0x73F4, 8073: 0x73F5, 8074: 0x73F6, 8075: 0x73F7, 8170: 0x73F8, 8171: 0x73F9, 8172: 0x73FA, 8173: 0x73FB, 8174: 0x73FC, 8175: 0x73FD, 8176: 0x73FE, 8177: 0x73FF, 8178: 0x7400, 8179: 0x7401, 8180: 0x7402, 8181: 0x7404, 8182: 0x7407, 8183: 0x7408, 8184: 0x740B, 8185: 0x740C, 8186: 0x740D, 8187: 0x740E, 8188: 0x7411, 8189: 0x7412, 8190: 0x7413, 8191: 0x7414, 8192: 0x7415, 8193: 0x7416, 8194: 0x7417, 8195: 0x7418, 8196: 0x7419, 8197: 0x741C, 8198: 0x741D, 8199: 0x741E, 8200: 0x741F, 8201: 0x7420, 8202: 0x7421, 8203: 0x7423, 8204: 0x7424, 8205: 0x7427, 8206: 0x7429, 8207: 0x742B, 8208: 0x742D, 8209: 0x742F, 8210: 0x7431, 8211: 0x7432, 8212: 0x7437, 8213: 0x7438, 8214: 0x7439, 8215: 0x743A, 8216: 0x743B, 8217: 0x743D, 8218: 0x743E, 8219: 0x743F, 8220: 0x7440, 8221: 0x7442, 8222: 0x7443, 8223: 0x7444, 8224: 0x7445, 8225: 0x7446, 8226: 0x7447, 8227: 0x7448, 8228: 0x7449, 8229: 0x744A, 8230: 0x744B, 8231: 0x744C, 8232: 0x744D, 8233: 0x744E, 8234: 0x744F, 8235: 0x7450, 8236: 0x7451, 8237: 0x7452, 8238: 0x7453, 8239: 0x7454, 8240: 0x7456, 8241: 0x7458, 8242: 0x745D, 8243: 0x7460, 8244: 0x7461, 8245: 0x7462, 8246: 0x7463, 8247: 0x7464, 8248: 0x7465, 8249: 0x7466, 8250: 0x7467, 8251: 0x7468, 8252: 0x7469, 8253: 0x746A, 8254: 0x746B, 8255: 0x746C, 8256: 0x746E, 8257: 0x746F, 8258: 0x7471, 8259: 0x7472, 8260: 0x7473, 8261: 0x7474, 8262: 0x7475, 8263: 0x7478, 8264: 0x7479, 8265: 0x747A, 8360: 0x747B, 8361: 0x747C, 8362: 0x747D, 8363: 0x747F, 8364: 0x7482, 8365: 0x7484, 8366: 0x7485, 8367: 0x7486, 8368: 0x7488, 8369: 0x7489, 8370: 0x748A, 8371: 0x748C, 8372: 0x748D, 8373: 0x748F, 8374: 0x7491, 8375: 0x7492, 8376: 0x7493, 8377: 0x7494, 8378: 0x7495, 8379: 0x7496, 8380: 0x7497, 8381: 0x7498, 8382: 0x7499, 8383: 0x749A, 8384: 0x749B, 8385: 0x749D, 8386: 0x749F, 8387: 0x74A0, 8388: 0x74A1, 8389: 0x74A2, 8390: 0x74A3, 8391: 0x74A4, 8392: 0x74A5, 8393: 0x74A6, 8394: 0x74AA, 8395: 0x74AB, 8396: 0x74AC, 8397: 0x74AD, 8398: 0x74AE, 8399: 0x74AF, 8400: 0x74B0, 8401: 0x74B1, 8402: 0x74B2, 8403: 0x74B3, 8404: 0x74B4, 8405: 0x74B5, 8406: 0x74B6, 8407: 0x74B7, 8408: 0x74B8, 8409: 0x74B9, 8410: 0x74BB, 8411: 0x74BC, 8412: 0x74BD, 8413: 0x74BE, 8414: 0x74BF, 8415: 0x74C0, 8416: 0x74C1, 8417: 0x74C2, 8418: 0x74C3, 8419: 0x74C4, 8420: 0x74C5, 8421: 0x74C6, 8422: 0x74C7, 8423: 0x74C8, 8424: 0x74C9, 8425: 0x74CA, 8426: 0x74CB, 8427: 0x74CC, 8428: 0x74CD, 8429: 0x74CE, 8430: 0x74CF, 8431: 0x74D0, 8432: 0x74D1, 8433: 0x74D3, 8434: 0x74D4, 8435: 0x74D5, 8436: 0x74D6, 8437: 0x74D7, 8438: 0x74D8, 8439: 0x74D9, 8440: 0x74DA, 8441: 0x74DB, 8442: 0x74DD, 8443: 0x74DF, 8444: 0x74E1, 8445: 0x74E5, 8446: 0x74E7, 8447: 0x74E8, 8448: 0x74E9, 8449: 0x74EA, 8450: 0x74EB, 8451: 0x74EC, 8452: 0x74ED, 8453: 0x74F0, 8454: 0x74F1, 8455: 0x74F2, 8550: 0x74F3, 8551: 0x74F5, 8552: 0x74F8, 8553: 0x74F9, 8554: 0x74FA, 8555: 0x74FB, 8556: 0x74FC, 8557: 0x74FD, 8558: 0x74FE, 8559: 0x7500, 8560: 0x7501, 8561: 0x7502, 8562: 0x7503, 8563: 0x7505, 8564: 0x7506, 8565: 0x7507, 8566: 0x7508, 8567: 0x7509, 8568: 0x750A, 8569: 0x750B, 8570: 0x750C, 8571: 0x750E, 8572: 0x7510, 8573: 0x7512, 8574: 0x7514, 8575: 0x7515, 8576: 0x7516, 8577: 0x7517, 8578: 0x751B, 8579: 0x751D, 8580: 0x751E, 8581: 0x7520, 8582: 0x7521, 8583: 0x7522, 8584: 0x7523, 8585: 0x7524, 8586: 0x7526, 8587: 0x7527, 8588: 0x752A, 8589: 0x752E, 8590: 0x7534, 8591: 0x7536, 8592: 0x7539, 8593: 0x753C, 8594: 0x753D, 8595: 0x753F, 8596: 0x7541, 8597: 0x7542, 8598: 0x7543, 8599: 0x7544, 8600: 0x7546, 8601: 0x7547, 8602: 0x7549, 8603: 0x754A, 8604: 0x754D, 8605: 0x7550, 8606: 0x7551, 8607: 0x7552, 8608: 0x7553, 8609: 0x7555, 8610: 0x7556, 8611: 0x7557, 8612: 0x7558, 8613: 0x755D, 8614: 0x755E, 8615: 0x755F, 8616: 0x7560, 8617: 0x7561, 8618: 0x7562, 8619: 0x7563, 8620: 0x7564, 8621: 0x7567, 8622: 0x7568, 8623: 0x7569, 8624: 0x756B, 8625: 0x756C, 8626: 0x756D, 8627: 0x756E, 8628: 0x756F, 8629: 0x7570, 8630: 0x7571, 8631: 0x7573, 8632: 0x7575, 8633: 0x7576, 8634: 0x7577, 8635: 0x757A, 8636: 0x757B, 8637: 0x757C, 8638: 0x757D, 8639: 0x757E, 8640: 0x7580, 8641: 0x7581, 8642: 0x7582, 8643: 0x7584, 8644: 0x7585, 8645: 0x7587, 8740: 0x7588, 8741: 0x7589, 8742: 0x758A, 8743: 0x758C, 8744: 0x758D, 8745: 0x758E, 8746: 0x7590, 8747: 0x7593, 8748: 0x7595, 8749: 0x7598, 8750: 0x759B, 8751: 0x759C, 8752: 0x759E, 8753: 0x75A2, 8754: 0x75A6, 8755: 0x75A7, 8756: 0x75A8, 8757: 0x75A9, 8758: 0x75AA, 8759: 0x75AD, 8760: 0x75B6, 8761: 0x75B7, 8762: 0x75BA, 8763: 0x75BB, 8764: 0x75BF, 8765: 0x75C0, 8766: 0x75C1, 8767: 0x75C6, 8768: 0x75CB, 8769: 0x75CC, 8770: 0x75CE, 8771: 0x75CF, 8772: 0x75D0, 8773: 0x75D1, 8774: 0x75D3, 8775: 0x75D7, 8776: 0x75D9, 8777: 0x75DA, 8778: 0x75DC, 8779: 0x75DD, 8780: 0x75DF, 8781: 0x75E0, 8782: 0x75E1, 8783: 0x75E5, 8784: 0x75E9, 8785: 0x75EC, 8786: 0x75ED, 8787: 0x75EE, 8788: 0x75EF, 8789: 0x75F2, 8790: 0x75F3, 8791: 0x75F5, 8792: 0x75F6, 8793: 0x75F7, 8794: 0x75F8, 8795: 0x75FA, 8796: 0x75FB, 8797: 0x75FD, 8798: 0x75FE, 8799: 0x7602, 8800: 0x7604, 8801: 0x7606, 8802: 0x7607, 8803: 0x7608, 8804: 0x7609, 8805: 0x760B, 8806: 0x760D, 8807: 0x760E, 8808: 0x760F, 8809: 0x7611, 8810: 0x7612, 8811: 0x7613, 8812: 0x7614, 8813: 0x7616, 8814: 0x761A, 8815: 0x761C, 8816: 0x761D, 8817: 0x761E, 8818: 0x7621, 8819: 0x7623, 8820: 0x7627, 8821: 0x7628, 8822: 0x762C, 8823: 0x762E, 8824: 0x762F, 8825: 0x7631, 8826: 0x7632, 8827: 0x7636, 8828: 0x7637, 8829: 0x7639, 8830: 0x763A, 8831: 0x763B, 8832: 0x763D, 8833: 0x7641, 8834: 0x7642, 8835: 0x7644, 8930: 0x7645, 8931: 0x7646, 8932: 0x7647, 8933: 0x7648, 8934: 0x7649, 8935: 0x764A, 8936: 0x764B, 8937: 0x764E, 8938: 0x764F, 8939: 0x7650, 8940: 0x7651, 8941: 0x7652, 8942: 0x7653, 8943: 0x7655, 8944: 0x7657, 8945: 0x7658, 8946: 0x7659, 8947: 0x765A, 8948: 0x765B, 8949: 0x765D, 8950: 0x765F, 8951: 0x7660, 8952: 0x7661, 8953: 0x7662, 8954: 0x7664, 8955: 0x7665, 8956: 0x7666, 8957: 0x7667, 8958: 0x7668, 8959: 0x7669, 8960: 0x766A, 8961: 0x766C, 8962: 0x766D, 8963: 0x766E, 8964: 0x7670, 8965: 0x7671, 8966: 0x7672, 8967: 0x7673, 8968: 0x7674, 8969: 0x7675, 8970: 0x7676, 8971: 0x7677, 8972: 0x7679, 8973: 0x767A, 8974: 0x767C, 8975: 0x767F, 8976: 0x7680, 8977: 0x7681, 8978: 0x7683, 8979: 0x7685, 8980: 0x7689, 8981: 0x768A, 8982: 0x768C, 8983: 0x768D, 8984: 0x768F, 8985: 0x7690, 8986: 0x7692, 8987: 0x7694, 8988: 0x7695, 8989: 0x7697, 8990: 0x7698, 8991: 0x769A, 8992: 0x769B, 8993: 0x769C, 8994: 0x769D, 8995: 0x769E, 8996: 0x769F, 8997: 0x76A0, 8998: 0x76A1, 8999: 0x76A2, 9000: 0x76A3, 9001: 0x76A5, 9002: 0x76A6, 9003: 0x76A7, 9004: 0x76A8, 9005: 0x76A9, 9006: 0x76AA, 9007: 0x76AB, 9008: 0x76AC, 9009: 0x76AD, 9010: 0x76AF, 9011: 0x76B0, 9012: 0x76B3, 9013: 0x76B5, 9014: 0x76B6, 9015: 0x76B7, 9016: 0x76B8, 9017: 0x76B9, 9018: 0x76BA, 9019: 0x76BB, 9020: 0x76BC, 9021: 0x76BD, 9022: 0x76BE, 9023: 0x76C0, 9024: 0x76C1, 9025: 0x76C3, 9026: 0x554A, 9027: 0x963F, 9028: 0x57C3, 9029: 0x6328, 9030: 0x54CE, 9031: 0x5509, 9032: 0x54C0, 9033: 0x7691, 9034: 0x764C, 9035: 0x853C, 9036: 0x77EE, 9037: 0x827E, 9038: 0x788D, 9039: 0x7231, 9040: 0x9698, 9041: 0x978D, 9042: 0x6C28, 9043: 0x5B89, 9044: 0x4FFA, 9045: 0x6309, 9046: 0x6697, 9047: 0x5CB8, 9048: 0x80FA, 9049: 0x6848, 9050: 0x80AE, 9051: 0x6602, 9052: 0x76CE, 9053: 0x51F9, 9054: 0x6556, 9055: 0x71AC, 9056: 0x7FF1, 9057: 0x8884, 9058: 0x50B2, 9059: 0x5965, 9060: 0x61CA, 9061: 0x6FB3, 9062: 0x82AD, 9063: 0x634C, 9064: 0x6252, 9065: 0x53ED, 9066: 0x5427, 9067: 0x7B06, 9068: 0x516B, 9069: 0x75A4, 9070: 0x5DF4, 9071: 0x62D4, 9072: 0x8DCB, 9073: 0x9776, 9074: 0x628A, 9075: 0x8019, 9076: 0x575D, 9077: 0x9738, 9078: 0x7F62, 9079: 0x7238, 9080: 0x767D, 9081: 0x67CF, 9082: 0x767E, 9083: 0x6446, 9084: 0x4F70, 9085: 0x8D25, 9086: 0x62DC, 9087: 0x7A17, 9088: 0x6591, 9089: 0x73ED, 9090: 0x642C, 9091: 0x6273, 9092: 0x822C, 9093: 0x9881, 9094: 0x677F, 9095: 0x7248, 9096: 0x626E, 9097: 0x62CC, 9098: 0x4F34, 9099: 0x74E3, 9100: 0x534A, 9101: 0x529E, 9102: 0x7ECA, 9103: 0x90A6, 9104: 0x5E2E, 9105: 0x6886, 9106: 0x699C, 9107: 0x8180, 9108: 0x7ED1, 9109: 0x68D2, 9110: 0x78C5, 9111: 0x868C, 9112: 0x9551, 9113: 0x508D, 9114: 0x8C24, 9115: 0x82DE, 9116: 0x80DE, 9117: 0x5305, 9118: 0x8912, 9119: 0x5265, 9120: 0x76C4, 9121: 0x76C7, 9122: 0x76C9, 9123: 0x76CB, 9124: 0x76CC, 9125: 0x76D3, 9126: 0x76D5, 9127: 0x76D9, 9128: 0x76DA, 9129: 0x76DC, 9130: 0x76DD, 9131: 0x76DE, 9132: 0x76E0, 9133: 0x76E1, 9134: 0x76E2, 9135: 0x76E3, 9136: 0x76E4, 9137: 0x76E6, 9138: 0x76E7, 9139: 0x76E8, 9140: 0x76E9, 9141: 0x76EA, 9142: 0x76EB, 9143: 0x76EC, 9144: 0x76ED, 9145: 0x76F0, 9146: 0x76F3, 9147: 0x76F5, 9148: 0x76F6, 9149: 0x76F7, 9150: 0x76FA, 9151: 0x76FB, 9152: 0x76FD, 9153: 0x76FF, 9154: 0x7700, 9155: 0x7702, 9156: 0x7703, 9157: 0x7705, 9158: 0x7706, 9159: 0x770A, 9160: 0x770C, 9161: 0x770E, 9162: 0x770F, 9163: 0x7710, 9164: 0x7711, 9165: 0x7712, 9166: 0x7713, 9167: 0x7714, 9168: 0x7715, 9169: 0x7716, 9170: 0x7717, 9171: 0x7718, 9172: 0x771B, 9173: 0x771C, 9174: 0x771D, 9175: 0x771E, 9176: 0x7721, 9177: 0x7723, 9178: 0x7724, 9179: 0x7725, 9180: 0x7727, 9181: 0x772A, 9182: 0x772B, 9183: 0x772C, 9184: 0x772E, 9185: 0x7730, 9186: 0x7731, 9187: 0x7732, 9188: 0x7733, 9189: 0x7734, 9190: 0x7739, 9191: 0x773B, 9192: 0x773D, 9193: 0x773E, 9194: 0x773F, 9195: 0x7742, 9196: 0x7744, 9197: 0x7745, 9198: 0x7746, 9199: 0x7748, 9200: 0x7749, 9201: 0x774A, 9202: 0x774B, 9203: 0x774C, 9204: 0x774D, 9205: 0x774E, 9206: 0x774F, 9207: 0x7752, 9208: 0x7753, 9209: 0x7754, 9210: 0x7755, 9211: 0x7756, 9212: 0x7757, 9213: 0x7758, 9214: 0x7759, 9215: 0x775C, 9216: 0x8584, 9217: 0x96F9, 9218: 0x4FDD, 9219: 0x5821, 9220: 0x9971, 9221: 0x5B9D, 9222: 0x62B1, 9223: 0x62A5, 9224: 0x66B4, 9225: 0x8C79, 9226: 0x9C8D, 9227: 0x7206, 9228: 0x676F, 9229: 0x7891, 9230: 0x60B2, 9231: 0x5351, 9232: 0x5317, 9233: 0x8F88, 9234: 0x80CC, 9235: 0x8D1D, 9236: 0x94A1, 9237: 0x500D, 9238: 0x72C8, 9239: 0x5907, 9240: 0x60EB, 9241: 0x7119, 9242: 0x88AB, 9243: 0x5954, 9244: 0x82EF, 9245: 0x672C, 9246: 0x7B28, 9247: 0x5D29, 9248: 0x7EF7, 9249: 0x752D, 9250: 0x6CF5, 9251: 0x8E66, 9252: 0x8FF8, 9253: 0x903C, 9254: 0x9F3B, 9255: 0x6BD4, 9256: 0x9119, 9257: 0x7B14, 9258: 0x5F7C, 9259: 0x78A7, 9260: 0x84D6, 9261: 0x853D, 9262: 0x6BD5, 9263: 0x6BD9, 9264: 0x6BD6, 9265: 0x5E01, 9266: 0x5E87, 9267: 0x75F9, 9268: 0x95ED, 9269: 0x655D, 9270: 0x5F0A, 9271: 0x5FC5, 9272: 0x8F9F, 9273: 0x58C1, 9274: 0x81C2, 9275: 0x907F, 9276: 0x965B, 9277: 0x97AD, 9278: 0x8FB9, 9279: 0x7F16, 9280: 0x8D2C, 9281: 0x6241, 9282: 0x4FBF, 9283: 0x53D8, 9284: 0x535E, 9285: 0x8FA8, 9286: 0x8FA9, 9287: 0x8FAB, 9288: 0x904D, 9289: 0x6807, 9290: 0x5F6A, 9291: 0x8198, 9292: 0x8868, 9293: 0x9CD6, 9294: 0x618B, 9295: 0x522B, 9296: 0x762A, 9297: 0x5F6C, 9298: 0x658C, 9299: 0x6FD2, 9300: 0x6EE8, 9301: 0x5BBE, 9302: 0x6448, 9303: 0x5175, 9304: 0x51B0, 9305: 0x67C4, 9306: 0x4E19, 9307: 0x79C9, 9308: 0x997C, 9309: 0x70B3, 9310: 0x775D, 9311: 0x775E, 9312: 0x775F, 9313: 0x7760, 9314: 0x7764, 9315: 0x7767, 9316: 0x7769, 9317: 0x776A, 9318: 0x776D, 9319: 0x776E, 9320: 0x776F, 9321: 0x7770, 9322: 0x7771, 9323: 0x7772, 9324: 0x7773, 9325: 0x7774, 9326: 0x7775, 9327: 0x7776, 9328: 0x7777, 9329: 0x7778, 9330: 0x777A, 9331: 0x777B, 9332: 0x777C, 9333: 0x7781, 9334: 0x7782, 9335: 0x7783, 9336: 0x7786, 9337: 0x7787, 9338: 0x7788, 9339: 0x7789, 9340: 0x778A, 9341: 0x778B, 9342: 0x778F, 9343: 0x7790, 9344: 0x7793, 9345: 0x7794, 9346: 0x7795, 9347: 0x7796, 9348: 0x7797, 9349: 0x7798, 9350: 0x7799, 9351: 0x779A, 9352: 0x779B, 9353: 0x779C, 9354: 0x779D, 9355: 0x779E, 9356: 0x77A1, 9357: 0x77A3, 9358: 0x77A4, 9359: 0x77A6, 9360: 0x77A8, 9361: 0x77AB, 9362: 0x77AD, 9363: 0x77AE, 9364: 0x77AF, 9365: 0x77B1, 9366: 0x77B2, 9367: 0x77B4, 9368: 0x77B6, 9369: 0x77B7, 9370: 0x77B8, 9371: 0x77B9, 9372: 0x77BA, 9373: 0x77BC, 9374: 0x77BE, 9375: 0x77C0, 9376: 0x77C1, 9377: 0x77C2, 9378: 0x77C3, 9379: 0x77C4, 9380: 0x77C5, 9381: 0x77C6, 9382: 0x77C7, 9383: 0x77C8, 9384: 0x77C9, 9385: 0x77CA, 9386: 0x77CB, 9387: 0x77CC, 9388: 0x77CE, 9389: 0x77CF, 9390: 0x77D0, 9391: 0x77D1, 9392: 0x77D2, 9393: 0x77D3, 9394: 0x77D4, 9395: 0x77D5, 9396: 0x77D6, 9397: 0x77D8, 9398: 0x77D9, 9399: 0x77DA, 9400: 0x77DD, 9401: 0x77DE, 9402: 0x77DF, 9403: 0x77E0, 9404: 0x77E1, 9405: 0x77E4, 9406: 0x75C5, 9407: 0x5E76, 9408: 0x73BB, 9409: 0x83E0, 9410: 0x64AD, 9411: 0x62E8, 9412: 0x94B5, 9413: 0x6CE2, 9414: 0x535A, 9415: 0x52C3, 9416: 0x640F, 9417: 0x94C2, 9418: 0x7B94, 9419: 0x4F2F, 9420: 0x5E1B, 9421: 0x8236, 9422: 0x8116, 9423: 0x818A, 9424: 0x6E24, 9425: 0x6CCA, 9426: 0x9A73, 9427: 0x6355, 9428: 0x535C, 9429: 0x54FA, 9430: 0x8865, 9431: 0x57E0, 9432: 0x4E0D, 9433: 0x5E03, 9434: 0x6B65, 9435: 0x7C3F, 9436: 0x90E8, 9437: 0x6016, 9438: 0x64E6, 9439: 0x731C, 9440: 0x88C1, 9441: 0x6750, 9442: 0x624D, 9443: 0x8D22, 9444: 0x776C, 9445: 0x8E29, 9446: 0x91C7, 9447: 0x5F69, 9448: 0x83DC, 9449: 0x8521, 9450: 0x9910, 9451: 0x53C2, 9452: 0x8695, 9453: 0x6B8B, 9454: 0x60ED, 9455: 0x60E8, 9456: 0x707F, 9457: 0x82CD, 9458: 0x8231, 9459: 0x4ED3, 9460: 0x6CA7, 9461: 0x85CF, 9462: 0x64CD, 9463: 0x7CD9, 9464: 0x69FD, 9465: 0x66F9, 9466: 0x8349, 9467: 0x5395, 9468: 0x7B56, 9469: 0x4FA7, 9470: 0x518C, 9471: 0x6D4B, 9472: 0x5C42, 9473: 0x8E6D, 9474: 0x63D2, 9475: 0x53C9, 9476: 0x832C, 9477: 0x8336, 9478: 0x67E5, 9479: 0x78B4, 9480: 0x643D, 9481: 0x5BDF, 9482: 0x5C94, 9483: 0x5DEE, 9484: 0x8BE7, 9485: 0x62C6, 9486: 0x67F4, 9487: 0x8C7A, 9488: 0x6400, 9489: 0x63BA, 9490: 0x8749, 9491: 0x998B, 9492: 0x8C17, 9493: 0x7F20, 9494: 0x94F2, 9495: 0x4EA7, 9496: 0x9610, 9497: 0x98A4, 9498: 0x660C, 9499: 0x7316, 9500: 0x77E6, 9501: 0x77E8, 9502: 0x77EA, 9503: 0x77EF, 9504: 0x77F0, 9505: 0x77F1, 9506: 0x77F2, 9507: 0x77F4, 9508: 0x77F5, 9509: 0x77F7, 9510: 0x77F9, 9511: 0x77FA, 9512: 0x77FB, 9513: 0x77FC, 9514: 0x7803, 9515: 0x7804, 9516: 0x7805, 9517: 0x7806, 9518: 0x7807, 9519: 0x7808, 9520: 0x780A, 9521: 0x780B, 9522: 0x780E, 9523: 0x780F, 9524: 0x7810, 9525: 0x7813, 9526: 0x7815, 9527: 0x7819, 9528: 0x781B, 9529: 0x781E, 9530: 0x7820, 9531: 0x7821, 9532: 0x7822, 9533: 0x7824, 9534: 0x7828, 9535: 0x782A, 9536: 0x782B, 9537: 0x782E, 9538: 0x782F, 9539: 0x7831, 9540: 0x7832, 9541: 0x7833, 9542: 0x7835, 9543: 0x7836, 9544: 0x783D, 9545: 0x783F, 9546: 0x7841, 9547: 0x7842, 9548: 0x7843, 9549: 0x7844, 9550: 0x7846, 9551: 0x7848, 9552: 0x7849, 9553: 0x784A, 9554: 0x784B, 9555: 0x784D, 9556: 0x784F, 9557: 0x7851, 9558: 0x7853, 9559: 0x7854, 9560: 0x7858, 9561: 0x7859, 9562: 0x785A, 9563: 0x785B, 9564: 0x785C, 9565: 0x785E, 9566: 0x785F, 9567: 0x7860, 9568: 0x7861, 9569: 0x7862, 9570: 0x7863, 9571: 0x7864, 9572: 0x7865, 9573: 0x7866, 9574: 0x7867, 9575: 0x7868, 9576: 0x7869, 9577: 0x786F, 9578: 0x7870, 9579: 0x7871, 9580: 0x7872, 9581: 0x7873, 9582: 0x7874, 9583: 0x7875, 9584: 0x7876, 9585: 0x7878, 9586: 0x7879, 9587: 0x787A, 9588: 0x787B, 9589: 0x787D, 9590: 0x787E, 9591: 0x787F, 9592: 0x7880, 9593: 0x7881, 9594: 0x7882, 9595: 0x7883, 9596: 0x573A, 9597: 0x5C1D, 9598: 0x5E38, 9599: 0x957F, 9600: 0x507F, 9601: 0x80A0, 9602: 0x5382, 9603: 0x655E, 9604: 0x7545, 9605: 0x5531, 9606: 0x5021, 9607: 0x8D85, 9608: 0x6284, 9609: 0x949E, 9610: 0x671D, 9611: 0x5632, 9612: 0x6F6E, 9613: 0x5DE2, 9614: 0x5435, 9615: 0x7092, 9616: 0x8F66, 9617: 0x626F, 9618: 0x64A4, 9619: 0x63A3, 9620: 0x5F7B, 9621: 0x6F88, 9622: 0x90F4, 9623: 0x81E3, 9624: 0x8FB0, 9625: 0x5C18, 9626: 0x6668, 9627: 0x5FF1, 9628: 0x6C89, 9629: 0x9648, 9630: 0x8D81, 9631: 0x886C, 9632: 0x6491, 9633: 0x79F0, 9634: 0x57CE, 9635: 0x6A59, 9636: 0x6210, 9637: 0x5448, 9638: 0x4E58, 9639: 0x7A0B, 9640: 0x60E9, 9641: 0x6F84, 9642: 0x8BDA, 9643: 0x627F, 9644: 0x901E, 9645: 0x9A8B, 9646: 0x79E4, 9647: 0x5403, 9648: 0x75F4, 9649: 0x6301, 9650: 0x5319, 9651: 0x6C60, 9652: 0x8FDF, 9653: 0x5F1B, 9654: 0x9A70, 9655: 0x803B, 9656: 0x9F7F, 9657: 0x4F88, 9658: 0x5C3A, 9659: 0x8D64, 9660: 0x7FC5, 9661: 0x65A5, 9662: 0x70BD, 9663: 0x5145, 9664: 0x51B2, 9665: 0x866B, 9666: 0x5D07, 9667: 0x5BA0, 9668: 0x62BD, 9669: 0x916C, 9670: 0x7574, 9671: 0x8E0C, 9672: 0x7A20, 9673: 0x6101, 9674: 0x7B79, 9675: 0x4EC7, 9676: 0x7EF8, 9677: 0x7785, 9678: 0x4E11, 9679: 0x81ED, 9680: 0x521D, 9681: 0x51FA, 9682: 0x6A71, 9683: 0x53A8, 9684: 0x8E87, 9685: 0x9504, 9686: 0x96CF, 9687: 0x6EC1, 9688: 0x9664, 9689: 0x695A, 9690: 0x7884, 9691: 0x7885, 9692: 0x7886, 9693: 0x7888, 9694: 0x788A, 9695: 0x788B, 9696: 0x788F, 9697: 0x7890, 9698: 0x7892, 9699: 0x7894, 9700: 0x7895, 9701: 0x7896, 9702: 0x7899, 9703: 0x789D, 9704: 0x789E, 9705: 0x78A0, 9706: 0x78A2, 9707: 0x78A4, 9708: 0x78A6, 9709: 0x78A8, 9710: 0x78A9, 9711: 0x78AA, 9712: 0x78AB, 9713: 0x78AC, 9714: 0x78AD, 9715: 0x78AE, 9716: 0x78AF, 9717: 0x78B5, 9718: 0x78B6, 9719: 0x78B7, 9720: 0x78B8, 9721: 0x78BA, 9722: 0x78BB, 9723: 0x78BC, 9724: 0x78BD, 9725: 0x78BF, 9726: 0x78C0, 9727: 0x78C2, 9728: 0x78C3, 9729: 0x78C4, 9730: 0x78C6, 9731: 0x78C7, 9732: 0x78C8, 9733: 0x78CC, 9734: 0x78CD, 9735: 0x78CE, 9736: 0x78CF, 9737: 0x78D1, 9738: 0x78D2, 9739: 0x78D3, 9740: 0x78D6, 9741: 0x78D7, 9742: 0x78D8, 9743: 0x78DA, 9744: 0x78DB, 9745: 0x78DC, 9746: 0x78DD, 9747: 0x78DE, 9748: 0x78DF, 9749: 0x78E0, 9750: 0x78E1, 9751: 0x78E2, 9752: 0x78E3, 9753: 0x78E4, 9754: 0x78E5, 9755: 0x78E6, 9756: 0x78E7, 9757: 0x78E9, 9758: 0x78EA, 9759: 0x78EB, 9760: 0x78ED, 9761: 0x78EE, 9762: 0x78EF, 9763: 0x78F0, 9764: 0x78F1, 9765: 0x78F3, 9766: 0x78F5, 9767: 0x78F6, 9768: 0x78F8, 9769: 0x78F9, 9770: 0x78FB, 9771: 0x78FC, 9772: 0x78FD, 9773: 0x78FE, 9774: 0x78FF, 9775: 0x7900, 9776: 0x7902, 9777: 0x7903, 9778: 0x7904, 9779: 0x7906, 9780: 0x7907, 9781: 0x7908, 9782: 0x7909, 9783: 0x790A, 9784: 0x790B, 9785: 0x790C, 9786: 0x7840, 9787: 0x50A8, 9788: 0x77D7, 9789: 0x6410, 9790: 0x89E6, 9791: 0x5904, 9792: 0x63E3, 9793: 0x5DDD, 9794: 0x7A7F, 9795: 0x693D, 9796: 0x4F20, 9797: 0x8239, 9798: 0x5598, 9799: 0x4E32, 9800: 0x75AE, 9801: 0x7A97, 9802: 0x5E62, 9803: 0x5E8A, 9804: 0x95EF, 9805: 0x521B, 9806: 0x5439, 9807: 0x708A, 9808: 0x6376, 9809: 0x9524, 9810: 0x5782, 9811: 0x6625, 9812: 0x693F, 9813: 0x9187, 9814: 0x5507, 9815: 0x6DF3, 9816: 0x7EAF, 9817: 0x8822, 9818: 0x6233, 9819: 0x7EF0, 9820: 0x75B5, 9821: 0x8328, 9822: 0x78C1, 9823: 0x96CC, 9824: 0x8F9E, 9825: 0x6148, 9826: 0x74F7, 9827: 0x8BCD, 9828: 0x6B64, 9829: 0x523A, 9830: 0x8D50, 9831: 0x6B21, 9832: 0x806A, 9833: 0x8471, 9834: 0x56F1, 9835: 0x5306, 9836: 0x4ECE, 9837: 0x4E1B, 9838: 0x51D1, 9839: 0x7C97, 9840: 0x918B, 9841: 0x7C07, 9842: 0x4FC3, 9843: 0x8E7F, 9844: 0x7BE1, 9845: 0x7A9C, 9846: 0x6467, 9847: 0x5D14, 9848: 0x50AC, 9849: 0x8106, 9850: 0x7601, 9851: 0x7CB9, 9852: 0x6DEC, 9853: 0x7FE0, 9854: 0x6751, 9855: 0x5B58, 9856: 0x5BF8, 9857: 0x78CB, 9858: 0x64AE, 9859: 0x6413, 9860: 0x63AA, 9861: 0x632B, 9862: 0x9519, 9863: 0x642D, 9864: 0x8FBE, 9865: 0x7B54, 9866: 0x7629, 9867: 0x6253, 9868: 0x5927, 9869: 0x5446, 9870: 0x6B79, 9871: 0x50A3, 9872: 0x6234, 9873: 0x5E26, 9874: 0x6B86, 9875: 0x4EE3, 9876: 0x8D37, 9877: 0x888B, 9878: 0x5F85, 9879: 0x902E, 9880: 0x790D, 9881: 0x790E, 9882: 0x790F, 9883: 0x7910, 9884: 0x7911, 9885: 0x7912, 9886: 0x7914, 9887: 0x7915, 9888: 0x7916, 9889: 0x7917, 9890: 0x7918, 9891: 0x7919, 9892: 0x791A, 9893: 0x791B, 9894: 0x791C, 9895: 0x791D, 9896: 0x791F, 9897: 0x7920, 9898: 0x7921, 9899: 0x7922, 9900: 0x7923, 9901: 0x7925, 9902: 0x7926, 9903: 0x7927, 9904: 0x7928, 9905: 0x7929, 9906: 0x792A, 9907: 0x792B, 9908: 0x792C, 9909: 0x792D, 9910: 0x792E, 9911: 0x792F, 9912: 0x7930, 9913: 0x7931, 9914: 0x7932, 9915: 0x7933, 9916: 0x7935, 9917: 0x7936, 9918: 0x7937, 9919: 0x7938, 9920: 0x7939, 9921: 0x793D, 9922: 0x793F, 9923: 0x7942, 9924: 0x7943, 9925: 0x7944, 9926: 0x7945, 9927: 0x7947, 9928: 0x794A, 9929: 0x794B, 9930: 0x794C, 9931: 0x794D, 9932: 0x794E, 9933: 0x794F, 9934: 0x7950, 9935: 0x7951, 9936: 0x7952, 9937: 0x7954, 9938: 0x7955, 9939: 0x7958, 9940: 0x7959, 9941: 0x7961, 9942: 0x7963, 9943: 0x7964, 9944: 0x7966, 9945: 0x7969, 9946: 0x796A, 9947: 0x796B, 9948: 0x796C, 9949: 0x796E, 9950: 0x7970, 9951: 0x7971, 9952: 0x7972, 9953: 0x7973, 9954: 0x7974, 9955: 0x7975, 9956: 0x7976, 9957: 0x7979, 9958: 0x797B, 9959: 0x797C, 9960: 0x797D, 9961: 0x797E, 9962: 0x797F, 9963: 0x7982, 9964: 0x7983, 9965: 0x7986, 9966: 0x7987, 9967: 0x7988, 9968: 0x7989, 9969: 0x798B, 9970: 0x798C, 9971: 0x798D, 9972: 0x798E, 9973: 0x7990, 9974: 0x7991, 9975: 0x7992, 9976: 0x6020, 9977: 0x803D, 9978: 0x62C5, 9979: 0x4E39, 9980: 0x5355, 9981: 0x90F8, 9982: 0x63B8, 9983: 0x80C6, 9984: 0x65E6, 9985: 0x6C2E, 9986: 0x4F46, 9987: 0x60EE, 9988: 0x6DE1, 9989: 0x8BDE, 9990: 0x5F39, 9991: 0x86CB, 9992: 0x5F53, 9993: 0x6321, 9994: 0x515A, 9995: 0x8361, 9996: 0x6863, 9997: 0x5200, 9998: 0x6363, 9999: 0x8E48, 10000: 0x5012, 10001: 0x5C9B, 10002: 0x7977, 10003: 0x5BFC, 10004: 0x5230, 10005: 0x7A3B, 10006: 0x60BC, 10007: 0x9053, 10008: 0x76D7, 10009: 0x5FB7, 10010: 0x5F97, 10011: 0x7684, 10012: 0x8E6C, 10013: 0x706F, 10014: 0x767B, 10015: 0x7B49, 10016: 0x77AA, 10017: 0x51F3, 10018: 0x9093, 10019: 0x5824, 10020: 0x4F4E, 10021: 0x6EF4, 10022: 0x8FEA, 10023: 0x654C, 10024: 0x7B1B, 10025: 0x72C4, 10026: 0x6DA4, 10027: 0x7FDF, 10028: 0x5AE1, 10029: 0x62B5, 10030: 0x5E95, 10031: 0x5730, 10032: 0x8482, 10033: 0x7B2C, 10034: 0x5E1D, 10035: 0x5F1F, 10036: 0x9012, 10037: 0x7F14, 10038: 0x98A0, 10039: 0x6382, 10040: 0x6EC7, 10041: 0x7898, 10042: 0x70B9, 10043: 0x5178, 10044: 0x975B, 10045: 0x57AB, 10046: 0x7535, 10047: 0x4F43, 10048: 0x7538, 10049: 0x5E97, 10050: 0x60E6, 10051: 0x5960, 10052: 0x6DC0, 10053: 0x6BBF, 10054: 0x7889, 10055: 0x53FC, 10056: 0x96D5, 10057: 0x51CB, 10058: 0x5201, 10059: 0x6389, 10060: 0x540A, 10061: 0x9493, 10062: 0x8C03, 10063: 0x8DCC, 10064: 0x7239, 10065: 0x789F, 10066: 0x8776, 10067: 0x8FED, 10068: 0x8C0D, 10069: 0x53E0, 10070: 0x7993, 10071: 0x7994, 10072: 0x7995, 10073: 0x7996, 10074: 0x7997, 10075: 0x7998, 10076: 0x7999, 10077: 0x799B, 10078: 0x799C, 10079: 0x799D, 10080: 0x799E, 10081: 0x799F, 10082: 0x79A0, 10083: 0x79A1, 10084: 0x79A2, 10085: 0x79A3, 10086: 0x79A4, 10087: 0x79A5, 10088: 0x79A6, 10089: 0x79A8, 10090: 0x79A9, 10091: 0x79AA, 10092: 0x79AB, 10093: 0x79AC, 10094: 0x79AD, 10095: 0x79AE, 10096: 0x79AF, 10097: 0x79B0, 10098: 0x79B1, 10099: 0x79B2, 10100: 0x79B4, 10101: 0x79B5, 10102: 0x79B6, 10103: 0x79B7, 10104: 0x79B8, 10105: 0x79BC, 10106: 0x79BF, 10107: 0x79C2, 10108: 0x79C4, 10109: 0x79C5, 10110: 0x79C7, 10111: 0x79C8, 10112: 0x79CA, 10113: 0x79CC, 10114: 0x79CE, 10115: 0x79CF, 10116: 0x79D0, 10117: 0x79D3, 10118: 0x79D4, 10119: 0x79D6, 10120: 0x79D7, 10121: 0x79D9, 10122: 0x79DA, 10123: 0x79DB, 10124: 0x79DC, 10125: 0x79DD, 10126: 0x79DE, 10127: 0x79E0, 10128: 0x79E1, 10129: 0x79E2, 10130: 0x79E5, 10131: 0x79E8, 10132: 0x79EA, 10133: 0x79EC, 10134: 0x79EE, 10135: 0x79F1, 10136: 0x79F2, 10137: 0x79F3, 10138: 0x79F4, 10139: 0x79F5, 10140: 0x79F6, 10141: 0x79F7, 10142: 0x79F9, 10143: 0x79FA, 10144: 0x79FC, 10145: 0x79FE, 10146: 0x79FF, 10147: 0x7A01, 10148: 0x7A04, 10149: 0x7A05, 10150: 0x7A07, 10151: 0x7A08, 10152: 0x7A09, 10153: 0x7A0A, 10154: 0x7A0C, 10155: 0x7A0F, 10156: 0x7A10, 10157: 0x7A11, 10158: 0x7A12, 10159: 0x7A13, 10160: 0x7A15, 10161: 0x7A16, 10162: 0x7A18, 10163: 0x7A19, 10164: 0x7A1B, 10165: 0x7A1C, 10166: 0x4E01, 10167: 0x76EF, 10168: 0x53EE, 10169: 0x9489, 10170: 0x9876, 10171: 0x9F0E, 10172: 0x952D, 10173: 0x5B9A, 10174: 0x8BA2, 10175: 0x4E22, 10176: 0x4E1C, 10177: 0x51AC, 10178: 0x8463, 10179: 0x61C2, 10180: 0x52A8, 10181: 0x680B, 10182: 0x4F97, 10183: 0x606B, 10184: 0x51BB, 10185: 0x6D1E, 10186: 0x515C, 10187: 0x6296, 10188: 0x6597, 10189: 0x9661, 10190: 0x8C46, 10191: 0x9017, 10192: 0x75D8, 10193: 0x90FD, 10194: 0x7763, 10195: 0x6BD2, 10196: 0x728A, 10197: 0x72EC, 10198: 0x8BFB, 10199: 0x5835, 10200: 0x7779, 10201: 0x8D4C, 10202: 0x675C, 10203: 0x9540, 10204: 0x809A, 10205: 0x5EA6, 10206: 0x6E21, 10207: 0x5992, 10208: 0x7AEF, 10209: 0x77ED, 10210: 0x953B, 10211: 0x6BB5, 10212: 0x65AD, 10213: 0x7F0E, 10214: 0x5806, 10215: 0x5151, 10216: 0x961F, 10217: 0x5BF9, 10218: 0x58A9, 10219: 0x5428, 10220: 0x8E72, 10221: 0x6566, 10222: 0x987F, 10223: 0x56E4, 10224: 0x949D, 10225: 0x76FE, 10226: 0x9041, 10227: 0x6387, 10228: 0x54C6, 10229: 0x591A, 10230: 0x593A, 10231: 0x579B, 10232: 0x8EB2, 10233: 0x6735, 10234: 0x8DFA, 10235: 0x8235, 10236: 0x5241, 10237: 0x60F0, 10238: 0x5815, 10239: 0x86FE, 10240: 0x5CE8, 10241: 0x9E45, 10242: 0x4FC4, 10243: 0x989D, 10244: 0x8BB9, 10245: 0x5A25, 10246: 0x6076, 10247: 0x5384, 10248: 0x627C, 10249: 0x904F, 10250: 0x9102, 10251: 0x997F, 10252: 0x6069, 10253: 0x800C, 10254: 0x513F, 10255: 0x8033, 10256: 0x5C14, 10257: 0x9975, 10258: 0x6D31, 10259: 0x4E8C, 10260: 0x7A1D, 10261: 0x7A1F, 10262: 0x7A21, 10263: 0x7A22, 10264: 0x7A24, 10265: 0x7A25, 10266: 0x7A26, 10267: 0x7A27, 10268: 0x7A28, 10269: 0x7A29, 10270: 0x7A2A, 10271: 0x7A2B, 10272: 0x7A2C, 10273: 0x7A2D, 10274: 0x7A2E, 10275: 0x7A2F, 10276: 0x7A30, 10277: 0x7A31, 10278: 0x7A32, 10279: 0x7A34, 10280: 0x7A35, 10281: 0x7A36, 10282: 0x7A38, 10283: 0x7A3A, 10284: 0x7A3E, 10285: 0x7A40, 10286: 0x7A41, 10287: 0x7A42, 10288: 0x7A43, 10289: 0x7A44, 10290: 0x7A45, 10291: 0x7A47, 10292: 0x7A48, 10293: 0x7A49, 10294: 0x7A4A, 10295: 0x7A4B, 10296: 0x7A4C, 10297: 0x7A4D, 10298: 0x7A4E, 10299: 0x7A4F, 10300: 0x7A50, 10301: 0x7A52, 10302: 0x7A53, 10303: 0x7A54, 10304: 0x7A55, 10305: 0x7A56, 10306: 0x7A58, 10307: 0x7A59, 10308: 0x7A5A, 10309: 0x7A5B, 10310: 0x7A5C, 10311: 0x7A5D, 10312: 0x7A5E, 10313: 0x7A5F, 10314: 0x7A60, 10315: 0x7A61, 10316: 0x7A62, 10317: 0x7A63, 10318: 0x7A64, 10319: 0x7A65, 10320: 0x7A66, 10321: 0x7A67, 10322: 0x7A68, 10323: 0x7A69, 10324: 0x7A6A, 10325: 0x7A6B, 10326: 0x7A6C, 10327: 0x7A6D, 10328: 0x7A6E, 10329: 0x7A6F, 10330: 0x7A71, 10331: 0x7A72, 10332: 0x7A73, 10333: 0x7A75, 10334: 0x7A7B, 10335: 0x7A7C, 10336: 0x7A7D, 10337: 0x7A7E, 10338: 0x7A82, 10339: 0x7A85, 10340: 0x7A87, 10341: 0x7A89, 10342: 0x7A8A, 10343: 0x7A8B, 10344: 0x7A8C, 10345: 0x7A8E, 10346: 0x7A8F, 10347: 0x7A90, 10348: 0x7A93, 10349: 0x7A94, 10350: 0x7A99, 10351: 0x7A9A, 10352: 0x7A9B, 10353: 0x7A9E, 10354: 0x7AA1, 10355: 0x7AA2, 10356: 0x8D30, 10357: 0x53D1, 10358: 0x7F5A, 10359: 0x7B4F, 10360: 0x4F10, 10361: 0x4E4F, 10362: 0x9600, 10363: 0x6CD5, 10364: 0x73D0, 10365: 0x85E9, 10366: 0x5E06, 10367: 0x756A, 10368: 0x7FFB, 10369: 0x6A0A, 10370: 0x77FE, 10371: 0x9492, 10372: 0x7E41, 10373: 0x51E1, 10374: 0x70E6, 10375: 0x53CD, 10376: 0x8FD4, 10377: 0x8303, 10378: 0x8D29, 10379: 0x72AF, 10380: 0x996D, 10381: 0x6CDB, 10382: 0x574A, 10383: 0x82B3, 10384: 0x65B9, 10385: 0x80AA, 10386: 0x623F, 10387: 0x9632, 10388: 0x59A8, 10389: 0x4EFF, 10390: 0x8BBF, 10391: 0x7EBA, 10392: 0x653E, 10393: 0x83F2, 10394: 0x975E, 10395: 0x5561, 10396: 0x98DE, 10397: 0x80A5, 10398: 0x532A, 10399: 0x8BFD, 10400: 0x5420, 10401: 0x80BA, 10402: 0x5E9F, 10403: 0x6CB8, 10404: 0x8D39, 10405: 0x82AC, 10406: 0x915A, 10407: 0x5429, 10408: 0x6C1B, 10409: 0x5206, 10410: 0x7EB7, 10411: 0x575F, 10412: 0x711A, 10413: 0x6C7E, 10414: 0x7C89, 10415: 0x594B, 10416: 0x4EFD, 10417: 0x5FFF, 10418: 0x6124, 10419: 0x7CAA, 10420: 0x4E30, 10421: 0x5C01, 10422: 0x67AB, 10423: 0x8702, 10424: 0x5CF0, 10425: 0x950B, 10426: 0x98CE, 10427: 0x75AF, 10428: 0x70FD, 10429: 0x9022, 10430: 0x51AF, 10431: 0x7F1D, 10432: 0x8BBD, 10433: 0x5949, 10434: 0x51E4, 10435: 0x4F5B, 10436: 0x5426, 10437: 0x592B, 10438: 0x6577, 10439: 0x80A4, 10440: 0x5B75, 10441: 0x6276, 10442: 0x62C2, 10443: 0x8F90, 10444: 0x5E45, 10445: 0x6C1F, 10446: 0x7B26, 10447: 0x4F0F, 10448: 0x4FD8, 10449: 0x670D, 10450: 0x7AA3, 10451: 0x7AA4, 10452: 0x7AA7, 10453: 0x7AA9, 10454: 0x7AAA, 10455: 0x7AAB, 10456: 0x7AAE, 10457: 0x7AAF, 10458: 0x7AB0, 10459: 0x7AB1, 10460: 0x7AB2, 10461: 0x7AB4, 10462: 0x7AB5, 10463: 0x7AB6, 10464: 0x7AB7, 10465: 0x7AB8, 10466: 0x7AB9, 10467: 0x7ABA, 10468: 0x7ABB, 10469: 0x7ABC, 10470: 0x7ABD, 10471: 0x7ABE, 10472: 0x7AC0, 10473: 0x7AC1, 10474: 0x7AC2, 10475: 0x7AC3, 10476: 0x7AC4, 10477: 0x7AC5, 10478: 0x7AC6, 10479: 0x7AC7, 10480: 0x7AC8, 10481: 0x7AC9, 10482: 0x7ACA, 10483: 0x7ACC, 10484: 0x7ACD, 10485: 0x7ACE, 10486: 0x7ACF, 10487: 0x7AD0, 10488: 0x7AD1, 10489: 0x7AD2, 10490: 0x7AD3, 10491: 0x7AD4, 10492: 0x7AD5, 10493: 0x7AD7, 10494: 0x7AD8, 10495: 0x7ADA, 10496: 0x7ADB, 10497: 0x7ADC, 10498: 0x7ADD, 10499: 0x7AE1, 10500: 0x7AE2, 10501: 0x7AE4, 10502: 0x7AE7, 10503: 0x7AE8, 10504: 0x7AE9, 10505: 0x7AEA, 10506: 0x7AEB, 10507: 0x7AEC, 10508: 0x7AEE, 10509: 0x7AF0, 10510: 0x7AF1, 10511: 0x7AF2, 10512: 0x7AF3, 10513: 0x7AF4, 10514: 0x7AF5, 10515: 0x7AF6, 10516: 0x7AF7, 10517: 0x7AF8, 10518: 0x7AFB, 10519: 0x7AFC, 10520: 0x7AFE, 10521: 0x7B00, 10522: 0x7B01, 10523: 0x7B02, 10524: 0x7B05, 10525: 0x7B07, 10526: 0x7B09, 10527: 0x7B0C, 10528: 0x7B0D, 10529: 0x7B0E, 10530: 0x7B10, 10531: 0x7B12, 10532: 0x7B13, 10533: 0x7B16, 10534: 0x7B17, 10535: 0x7B18, 10536: 0x7B1A, 10537: 0x7B1C, 10538: 0x7B1D, 10539: 0x7B1F, 10540: 0x7B21, 10541: 0x7B22, 10542: 0x7B23, 10543: 0x7B27, 10544: 0x7B29, 10545: 0x7B2D, 10546: 0x6D6E, 10547: 0x6DAA, 10548: 0x798F, 10549: 0x88B1, 10550: 0x5F17, 10551: 0x752B, 10552: 0x629A, 10553: 0x8F85, 10554: 0x4FEF, 10555: 0x91DC, 10556: 0x65A7, 10557: 0x812F, 10558: 0x8151, 10559: 0x5E9C, 10560: 0x8150, 10561: 0x8D74, 10562: 0x526F, 10563: 0x8986, 10564: 0x8D4B, 10565: 0x590D, 10566: 0x5085, 10567: 0x4ED8, 10568: 0x961C, 10569: 0x7236, 10570: 0x8179, 10571: 0x8D1F, 10572: 0x5BCC, 10573: 0x8BA3, 10574: 0x9644, 10575: 0x5987, 10576: 0x7F1A, 10577: 0x5490, 10578: 0x5676, 10579: 0x560E, 10580: 0x8BE5, 10581: 0x6539, 10582: 0x6982, 10583: 0x9499, 10584: 0x76D6, 10585: 0x6E89, 10586: 0x5E72, 10587: 0x7518, 10588: 0x6746, 10589: 0x67D1, 10590: 0x7AFF, 10591: 0x809D, 10592: 0x8D76, 10593: 0x611F, 10594: 0x79C6, 10595: 0x6562, 10596: 0x8D63, 10597: 0x5188, 10598: 0x521A, 10599: 0x94A2, 10600: 0x7F38, 10601: 0x809B, 10602: 0x7EB2, 10603: 0x5C97, 10604: 0x6E2F, 10605: 0x6760, 10606: 0x7BD9, 10607: 0x768B, 10608: 0x9AD8, 10609: 0x818F, 10610: 0x7F94, 10611: 0x7CD5, 10612: 0x641E, 10613: 0x9550, 10614: 0x7A3F, 10615: 0x544A, 10616: 0x54E5, 10617: 0x6B4C, 10618: 0x6401, 10619: 0x6208, 10620: 0x9E3D, 10621: 0x80F3, 10622: 0x7599, 10623: 0x5272, 10624: 0x9769, 10625: 0x845B, 10626: 0x683C, 10627: 0x86E4, 10628: 0x9601, 10629: 0x9694, 10630: 0x94EC, 10631: 0x4E2A, 10632: 0x5404, 10633: 0x7ED9, 10634: 0x6839, 10635: 0x8DDF, 10636: 0x8015, 10637: 0x66F4, 10638: 0x5E9A, 10639: 0x7FB9, 10640: 0x7B2F, 10641: 0x7B30, 10642: 0x7B32, 10643: 0x7B34, 10644: 0x7B35, 10645: 0x7B36, 10646: 0x7B37, 10647: 0x7B39, 10648: 0x7B3B, 10649: 0x7B3D, 10650: 0x7B3F, 10651: 0x7B40, 10652: 0x7B41, 10653: 0x7B42, 10654: 0x7B43, 10655: 0x7B44, 10656: 0x7B46, 10657: 0x7B48, 10658: 0x7B4A, 10659: 0x7B4D, 10660: 0x7B4E, 10661: 0x7B53, 10662: 0x7B55, 10663: 0x7B57, 10664: 0x7B59, 10665: 0x7B5C, 10666: 0x7B5E, 10667: 0x7B5F, 10668: 0x7B61, 10669: 0x7B63, 10670: 0x7B64, 10671: 0x7B65, 10672: 0x7B66, 10673: 0x7B67, 10674: 0x7B68, 10675: 0x7B69, 10676: 0x7B6A, 10677: 0x7B6B, 10678: 0x7B6C, 10679: 0x7B6D, 10680: 0x7B6F, 10681: 0x7B70, 10682: 0x7B73, 10683: 0x7B74, 10684: 0x7B76, 10685: 0x7B78, 10686: 0x7B7A, 10687: 0x7B7C, 10688: 0x7B7D, 10689: 0x7B7F, 10690: 0x7B81, 10691: 0x7B82, 10692: 0x7B83, 10693: 0x7B84, 10694: 0x7B86, 10695: 0x7B87, 10696: 0x7B88, 10697: 0x7B89, 10698: 0x7B8A, 10699: 0x7B8B, 10700: 0x7B8C, 10701: 0x7B8E, 10702: 0x7B8F, 10703: 0x7B91, 10704: 0x7B92, 10705: 0x7B93, 10706: 0x7B96, 10707: 0x7B98, 10708: 0x7B99, 10709: 0x7B9A, 10710: 0x7B9B, 10711: 0x7B9E, 10712: 0x7B9F, 10713: 0x7BA0, 10714: 0x7BA3, 10715: 0x7BA4, 10716: 0x7BA5, 10717: 0x7BAE, 10718: 0x7BAF, 10719: 0x7BB0, 10720: 0x7BB2, 10721: 0x7BB3, 10722: 0x7BB5, 10723: 0x7BB6, 10724: 0x7BB7, 10725: 0x7BB9, 10726: 0x7BBA, 10727: 0x7BBB, 10728: 0x7BBC, 10729: 0x7BBD, 10730: 0x7BBE, 10731: 0x7BBF, 10732: 0x7BC0, 10733: 0x7BC2, 10734: 0x7BC3, 10735: 0x7BC4, 10736: 0x57C2, 10737: 0x803F, 10738: 0x6897, 10739: 0x5DE5, 10740: 0x653B, 10741: 0x529F, 10742: 0x606D, 10743: 0x9F9A, 10744: 0x4F9B, 10745: 0x8EAC, 10746: 0x516C, 10747: 0x5BAB, 10748: 0x5F13, 10749: 0x5DE9, 10750: 0x6C5E, 10751: 0x62F1, 10752: 0x8D21, 10753: 0x5171, 10754: 0x94A9, 10755: 0x52FE, 10756: 0x6C9F, 10757: 0x82DF, 10758: 0x72D7, 10759: 0x57A2, 10760: 0x6784, 10761: 0x8D2D, 10762: 0x591F, 10763: 0x8F9C, 10764: 0x83C7, 10765: 0x5495, 10766: 0x7B8D, 10767: 0x4F30, 10768: 0x6CBD, 10769: 0x5B64, 10770: 0x59D1, 10771: 0x9F13, 10772: 0x53E4, 10773: 0x86CA, 10774: 0x9AA8, 10775: 0x8C37, 10776: 0x80A1, 10777: 0x6545, 10778: 0x987E, 10779: 0x56FA, 10780: 0x96C7, 10781: 0x522E, 10782: 0x74DC, 10783: 0x5250, 10784: 0x5BE1, 10785: 0x6302, 10786: 0x8902, 10787: 0x4E56, 10788: 0x62D0, 10789: 0x602A, 10790: 0x68FA, 10791: 0x5173, 10792: 0x5B98, 10793: 0x51A0, 10794: 0x89C2, 10795: 0x7BA1, 10796: 0x9986, 10797: 0x7F50, 10798: 0x60EF, 10799: 0x704C, 10800: 0x8D2F, 10801: 0x5149, 10802: 0x5E7F, 10803: 0x901B, 10804: 0x7470, 10805: 0x89C4, 10806: 0x572D, 10807: 0x7845, 10808: 0x5F52, 10809: 0x9F9F, 10810: 0x95FA, 10811: 0x8F68, 10812: 0x9B3C, 10813: 0x8BE1, 10814: 0x7678, 10815: 0x6842, 10816: 0x67DC, 10817: 0x8DEA, 10818: 0x8D35, 10819: 0x523D, 10820: 0x8F8A, 10821: 0x6EDA, 10822: 0x68CD, 10823: 0x9505, 10824: 0x90ED, 10825: 0x56FD, 10826: 0x679C, 10827: 0x88F9, 10828: 0x8FC7, 10829: 0x54C8, 10830: 0x7BC5, 10831: 0x7BC8, 10832: 0x7BC9, 10833: 0x7BCA, 10834: 0x7BCB, 10835: 0x7BCD, 10836: 0x7BCE, 10837: 0x7BCF, 10838: 0x7BD0, 10839: 0x7BD2, 10840: 0x7BD4, 10841: 0x7BD5, 10842: 0x7BD6, 10843: 0x7BD7, 10844: 0x7BD8, 10845: 0x7BDB, 10846: 0x7BDC, 10847: 0x7BDE, 10848: 0x7BDF, 10849: 0x7BE0, 10850: 0x7BE2, 10851: 0x7BE3, 10852: 0x7BE4, 10853: 0x7BE7, 10854: 0x7BE8, 10855: 0x7BE9, 10856: 0x7BEB, 10857: 0x7BEC, 10858: 0x7BED, 10859: 0x7BEF, 10860: 0x7BF0, 10861: 0x7BF2, 10862: 0x7BF3, 10863: 0x7BF4, 10864: 0x7BF5, 10865: 0x7BF6, 10866: 0x7BF8, 10867: 0x7BF9, 10868: 0x7BFA, 10869: 0x7BFB, 10870: 0x7BFD, 10871: 0x7BFF, 10872: 0x7C00, 10873: 0x7C01, 10874: 0x7C02, 10875: 0x7C03, 10876: 0x7C04, 10877: 0x7C05, 10878: 0x7C06, 10879: 0x7C08, 10880: 0x7C09, 10881: 0x7C0A, 10882: 0x7C0D, 10883: 0x7C0E, 10884: 0x7C10, 10885: 0x7C11, 10886: 0x7C12, 10887: 0x7C13, 10888: 0x7C14, 10889: 0x7C15, 10890: 0x7C17, 10891: 0x7C18, 10892: 0x7C19, 10893: 0x7C1A, 10894: 0x7C1B, 10895: 0x7C1C, 10896: 0x7C1D, 10897: 0x7C1E, 10898: 0x7C20, 10899: 0x7C21, 10900: 0x7C22, 10901: 0x7C23, 10902: 0x7C24, 10903: 0x7C25, 10904: 0x7C28, 10905: 0x7C29, 10906: 0x7C2B, 10907: 0x7C2C, 10908: 0x7C2D, 10909: 0x7C2E, 10910: 0x7C2F, 10911: 0x7C30, 10912: 0x7C31, 10913: 0x7C32, 10914: 0x7C33, 10915: 0x7C34, 10916: 0x7C35, 10917: 0x7C36, 10918: 0x7C37, 10919: 0x7C39, 10920: 0x7C3A, 10921: 0x7C3B, 10922: 0x7C3C, 10923: 0x7C3D, 10924: 0x7C3E, 10925: 0x7C42, 10926: 0x9AB8, 10927: 0x5B69, 10928: 0x6D77, 10929: 0x6C26, 10930: 0x4EA5, 10931: 0x5BB3, 10932: 0x9A87, 10933: 0x9163, 10934: 0x61A8, 10935: 0x90AF, 10936: 0x97E9, 10937: 0x542B, 10938: 0x6DB5, 10939: 0x5BD2, 10940: 0x51FD, 10941: 0x558A, 10942: 0x7F55, 10943: 0x7FF0, 10944: 0x64BC, 10945: 0x634D, 10946: 0x65F1, 10947: 0x61BE, 10948: 0x608D, 10949: 0x710A, 10950: 0x6C57, 10951: 0x6C49, 10952: 0x592F, 10953: 0x676D, 10954: 0x822A, 10955: 0x58D5, 10956: 0x568E, 10957: 0x8C6A, 10958: 0x6BEB, 10959: 0x90DD, 10960: 0x597D, 10961: 0x8017, 10962: 0x53F7, 10963: 0x6D69, 10964: 0x5475, 10965: 0x559D, 10966: 0x8377, 10967: 0x83CF, 10968: 0x6838, 10969: 0x79BE, 10970: 0x548C, 10971: 0x4F55, 10972: 0x5408, 10973: 0x76D2, 10974: 0x8C89, 10975: 0x9602, 10976: 0x6CB3, 10977: 0x6DB8, 10978: 0x8D6B, 10979: 0x8910, 10980: 0x9E64, 10981: 0x8D3A, 10982: 0x563F, 10983: 0x9ED1, 10984: 0x75D5, 10985: 0x5F88, 10986: 0x72E0, 10987: 0x6068, 10988: 0x54FC, 10989: 0x4EA8, 10990: 0x6A2A, 10991: 0x8861, 10992: 0x6052, 10993: 0x8F70, 10994: 0x54C4, 10995: 0x70D8, 10996: 0x8679, 10997: 0x9E3F, 10998: 0x6D2A, 10999: 0x5B8F, 11000: 0x5F18, 11001: 0x7EA2, 11002: 0x5589, 11003: 0x4FAF, 11004: 0x7334, 11005: 0x543C, 11006: 0x539A, 11007: 0x5019, 11008: 0x540E, 11009: 0x547C, 11010: 0x4E4E, 11011: 0x5FFD, 11012: 0x745A, 11013: 0x58F6, 11014: 0x846B, 11015: 0x80E1, 11016: 0x8774, 11017: 0x72D0, 11018: 0x7CCA, 11019: 0x6E56, 11020: 0x7C43, 11021: 0x7C44, 11022: 0x7C45, 11023: 0x7C46, 11024: 0x7C47, 11025: 0x7C48, 11026: 0x7C49, 11027: 0x7C4A, 11028: 0x7C4B, 11029: 0x7C4C, 11030: 0x7C4E, 11031: 0x7C4F, 11032: 0x7C50, 11033: 0x7C51, 11034: 0x7C52, 11035: 0x7C53, 11036: 0x7C54, 11037: 0x7C55, 11038: 0x7C56, 11039: 0x7C57, 11040: 0x7C58, 11041: 0x7C59, 11042: 0x7C5A, 11043: 0x7C5B, 11044: 0x7C5C, 11045: 0x7C5D, 11046: 0x7C5E, 11047: 0x7C5F, 11048: 0x7C60, 11049: 0x7C61, 11050: 0x7C62, 11051: 0x7C63, 11052: 0x7C64, 11053: 0x7C65, 11054: 0x7C66, 11055: 0x7C67, 11056: 0x7C68, 11057: 0x7C69, 11058: 0x7C6A, 11059: 0x7C6B, 11060: 0x7C6C, 11061: 0x7C6D, 11062: 0x7C6E, 11063: 0x7C6F, 11064: 0x7C70, 11065: 0x7C71, 11066: 0x7C72, 11067: 0x7C75, 11068: 0x7C76, 11069: 0x7C77, 11070: 0x7C78, 11071: 0x7C79, 11072: 0x7C7A, 11073: 0x7C7E, 11074: 0x7C7F, 11075: 0x7C80, 11076: 0x7C81, 11077: 0x7C82, 11078: 0x7C83, 11079: 0x7C84, 11080: 0x7C85, 11081: 0x7C86, 11082: 0x7C87, 11083: 0x7C88, 11084: 0x7C8A, 11085: 0x7C8B, 11086: 0x7C8C, 11087: 0x7C8D, 11088: 0x7C8E, 11089: 0x7C8F, 11090: 0x7C90, 11091: 0x7C93, 11092: 0x7C94, 11093: 0x7C96, 11094: 0x7C99, 11095: 0x7C9A, 11096: 0x7C9B, 11097: 0x7CA0, 11098: 0x7CA1, 11099: 0x7CA3, 11100: 0x7CA6, 11101: 0x7CA7, 11102: 0x7CA8, 11103: 0x7CA9, 11104: 0x7CAB, 11105: 0x7CAC, 11106: 0x7CAD, 11107: 0x7CAF, 11108: 0x7CB0, 11109: 0x7CB4, 11110: 0x7CB5, 11111: 0x7CB6, 11112: 0x7CB7, 11113: 0x7CB8, 11114: 0x7CBA, 11115: 0x7CBB, 11116: 0x5F27, 11117: 0x864E, 11118: 0x552C, 11119: 0x62A4, 11120: 0x4E92, 11121: 0x6CAA, 11122: 0x6237, 11123: 0x82B1, 11124: 0x54D7, 11125: 0x534E, 11126: 0x733E, 11127: 0x6ED1, 11128: 0x753B, 11129: 0x5212, 11130: 0x5316, 11131: 0x8BDD, 11132: 0x69D0, 11133: 0x5F8A, 11134: 0x6000, 11135: 0x6DEE, 11136: 0x574F, 11137: 0x6B22, 11138: 0x73AF, 11139: 0x6853, 11140: 0x8FD8, 11141: 0x7F13, 11142: 0x6362, 11143: 0x60A3, 11144: 0x5524, 11145: 0x75EA, 11146: 0x8C62, 11147: 0x7115, 11148: 0x6DA3, 11149: 0x5BA6, 11150: 0x5E7B, 11151: 0x8352, 11152: 0x614C, 11153: 0x9EC4, 11154: 0x78FA, 11155: 0x8757, 11156: 0x7C27, 11157: 0x7687, 11158: 0x51F0, 11159: 0x60F6, 11160: 0x714C, 11161: 0x6643, 11162: 0x5E4C, 11163: 0x604D, 11164: 0x8C0E, 11165: 0x7070, 11166: 0x6325, 11167: 0x8F89, 11168: 0x5FBD, 11169: 0x6062, 11170: 0x86D4, 11171: 0x56DE, 11172: 0x6BC1, 11173: 0x6094, 11174: 0x6167, 11175: 0x5349, 11176: 0x60E0, 11177: 0x6666, 11178: 0x8D3F, 11179: 0x79FD, 11180: 0x4F1A, 11181: 0x70E9, 11182: 0x6C47, 11183: 0x8BB3, 11184: 0x8BF2, 11185: 0x7ED8, 11186: 0x8364, 11187: 0x660F, 11188: 0x5A5A, 11189: 0x9B42, 11190: 0x6D51, 11191: 0x6DF7, 11192: 0x8C41, 11193: 0x6D3B, 11194: 0x4F19, 11195: 0x706B, 11196: 0x83B7, 11197: 0x6216, 11198: 0x60D1, 11199: 0x970D, 11200: 0x8D27, 11201: 0x7978, 11202: 0x51FB, 11203: 0x573E, 11204: 0x57FA, 11205: 0x673A, 11206: 0x7578, 11207: 0x7A3D, 11208: 0x79EF, 11209: 0x7B95, 11210: 0x7CBF, 11211: 0x7CC0, 11212: 0x7CC2, 11213: 0x7CC3, 11214: 0x7CC4, 11215: 0x7CC6, 11216: 0x7CC9, 11217: 0x7CCB, 11218: 0x7CCE, 11219: 0x7CCF, 11220: 0x7CD0, 11221: 0x7CD1, 11222: 0x7CD2, 11223: 0x7CD3, 11224: 0x7CD4, 11225: 0x7CD8, 11226: 0x7CDA, 11227: 0x7CDB, 11228: 0x7CDD, 11229: 0x7CDE, 11230: 0x7CE1, 11231: 0x7CE2, 11232: 0x7CE3, 11233: 0x7CE4, 11234: 0x7CE5, 11235: 0x7CE6, 11236: 0x7CE7, 11237: 0x7CE9, 11238: 0x7CEA, 11239: 0x7CEB, 11240: 0x7CEC, 11241: 0x7CED, 11242: 0x7CEE, 11243: 0x7CF0, 11244: 0x7CF1, 11245: 0x7CF2, 11246: 0x7CF3, 11247: 0x7CF4, 11248: 0x7CF5, 11249: 0x7CF6, 11250: 0x7CF7, 11251: 0x7CF9, 11252: 0x7CFA, 11253: 0x7CFC, 11254: 0x7CFD, 11255: 0x7CFE, 11256: 0x7CFF, 11257: 0x7D00, 11258: 0x7D01, 11259: 0x7D02, 11260: 0x7D03, 11261: 0x7D04, 11262: 0x7D05, 11263: 0x7D06, 11264: 0x7D07, 11265: 0x7D08, 11266: 0x7D09, 11267: 0x7D0B, 11268: 0x7D0C, 11269: 0x7D0D, 11270: 0x7D0E, 11271: 0x7D0F, 11272: 0x7D10, 11273: 0x7D11, 11274: 0x7D12, 11275: 0x7D13, 11276: 0x7D14, 11277: 0x7D15, 11278: 0x7D16, 11279: 0x7D17, 11280: 0x7D18, 11281: 0x7D19, 11282: 0x7D1A, 11283: 0x7D1B, 11284: 0x7D1C, 11285: 0x7D1D, 11286: 0x7D1E, 11287: 0x7D1F, 11288: 0x7D21, 11289: 0x7D23, 11290: 0x7D24, 11291: 0x7D25, 11292: 0x7D26, 11293: 0x7D28, 11294: 0x7D29, 11295: 0x7D2A, 11296: 0x7D2C, 11297: 0x7D2D, 11298: 0x7D2E, 11299: 0x7D30, 11300: 0x7D31, 11301: 0x7D32, 11302: 0x7D33, 11303: 0x7D34, 11304: 0x7D35, 11305: 0x7D36, 11306: 0x808C, 11307: 0x9965, 11308: 0x8FF9, 11309: 0x6FC0, 11310: 0x8BA5, 11311: 0x9E21, 11312: 0x59EC, 11313: 0x7EE9, 11314: 0x7F09, 11315: 0x5409, 11316: 0x6781, 11317: 0x68D8, 11318: 0x8F91, 11319: 0x7C4D, 11320: 0x96C6, 11321: 0x53CA, 11322: 0x6025, 11323: 0x75BE, 11324: 0x6C72, 11325: 0x5373, 11326: 0x5AC9, 11327: 0x7EA7, 11328: 0x6324, 11329: 0x51E0, 11330: 0x810A, 11331: 0x5DF1, 11332: 0x84DF, 11333: 0x6280, 11334: 0x5180, 11335: 0x5B63, 11336: 0x4F0E, 11337: 0x796D, 11338: 0x5242, 11339: 0x60B8, 11340: 0x6D4E, 11341: 0x5BC4, 11342: 0x5BC2, 11343: 0x8BA1, 11344: 0x8BB0, 11345: 0x65E2, 11346: 0x5FCC, 11347: 0x9645, 11348: 0x5993, 11349: 0x7EE7, 11350: 0x7EAA, 11351: 0x5609, 11352: 0x67B7, 11353: 0x5939, 11354: 0x4F73, 11355: 0x5BB6, 11356: 0x52A0, 11357: 0x835A, 11358: 0x988A, 11359: 0x8D3E, 11360: 0x7532, 11361: 0x94BE, 11362: 0x5047, 11363: 0x7A3C, 11364: 0x4EF7, 11365: 0x67B6, 11366: 0x9A7E, 11367: 0x5AC1, 11368: 0x6B7C, 11369: 0x76D1, 11370: 0x575A, 11371: 0x5C16, 11372: 0x7B3A, 11373: 0x95F4, 11374: 0x714E, 11375: 0x517C, 11376: 0x80A9, 11377: 0x8270, 11378: 0x5978, 11379: 0x7F04, 11380: 0x8327, 11381: 0x68C0, 11382: 0x67EC, 11383: 0x78B1, 11384: 0x7877, 11385: 0x62E3, 11386: 0x6361, 11387: 0x7B80, 11388: 0x4FED, 11389: 0x526A, 11390: 0x51CF, 11391: 0x8350, 11392: 0x69DB, 11393: 0x9274, 11394: 0x8DF5, 11395: 0x8D31, 11396: 0x89C1, 11397: 0x952E, 11398: 0x7BAD, 11399: 0x4EF6, 11400: 0x7D37, 11401: 0x7D38, 11402: 0x7D39, 11403: 0x7D3A, 11404: 0x7D3B, 11405: 0x7D3C, 11406: 0x7D3D, 11407: 0x7D3E, 11408: 0x7D3F, 11409: 0x7D40, 11410: 0x7D41, 11411: 0x7D42, 11412: 0x7D43, 11413: 0x7D44, 11414: 0x7D45, 11415: 0x7D46, 11416: 0x7D47, 11417: 0x7D48, 11418: 0x7D49, 11419: 0x7D4A, 11420: 0x7D4B, 11421: 0x7D4C, 11422: 0x7D4D, 11423: 0x7D4E, 11424: 0x7D4F, 11425: 0x7D50, 11426: 0x7D51, 11427: 0x7D52, 11428: 0x7D53, 11429: 0x7D54, 11430: 0x7D55, 11431: 0x7D56, 11432: 0x7D57, 11433: 0x7D58, 11434: 0x7D59, 11435: 0x7D5A, 11436: 0x7D5B, 11437: 0x7D5C, 11438: 0x7D5D, 11439: 0x7D5E, 11440: 0x7D5F, 11441: 0x7D60, 11442: 0x7D61, 11443: 0x7D62, 11444: 0x7D63, 11445: 0x7D64, 11446: 0x7D65, 11447: 0x7D66, 11448: 0x7D67, 11449: 0x7D68, 11450: 0x7D69, 11451: 0x7D6A, 11452: 0x7D6B, 11453: 0x7D6C, 11454: 0x7D6D, 11455: 0x7D6F, 11456: 0x7D70, 11457: 0x7D71, 11458: 0x7D72, 11459: 0x7D73, 11460: 0x7D74, 11461: 0x7D75, 11462: 0x7D76, 11463: 0x7D78, 11464: 0x7D79, 11465: 0x7D7A, 11466: 0x7D7B, 11467: 0x7D7C, 11468: 0x7D7D, 11469: 0x7D7E, 11470: 0x7D7F, 11471: 0x7D80, 11472: 0x7D81, 11473: 0x7D82, 11474: 0x7D83, 11475: 0x7D84, 11476: 0x7D85, 11477: 0x7D86, 11478: 0x7D87, 11479: 0x7D88, 11480: 0x7D89, 11481: 0x7D8A, 11482: 0x7D8B, 11483: 0x7D8C, 11484: 0x7D8D, 11485: 0x7D8E, 11486: 0x7D8F, 11487: 0x7D90, 11488: 0x7D91, 11489: 0x7D92, 11490: 0x7D93, 11491: 0x7D94, 11492: 0x7D95, 11493: 0x7D96, 11494: 0x7D97, 11495: 0x7D98, 11496: 0x5065, 11497: 0x8230, 11498: 0x5251, 11499: 0x996F, 11500: 0x6E10, 11501: 0x6E85, 11502: 0x6DA7, 11503: 0x5EFA, 11504: 0x50F5, 11505: 0x59DC, 11506: 0x5C06, 11507: 0x6D46, 11508: 0x6C5F, 11509: 0x7586, 11510: 0x848B, 11511: 0x6868, 11512: 0x5956, 11513: 0x8BB2, 11514: 0x5320, 11515: 0x9171, 11516: 0x964D, 11517: 0x8549, 11518: 0x6912, 11519: 0x7901, 11520: 0x7126, 11521: 0x80F6, 11522: 0x4EA4, 11523: 0x90CA, 11524: 0x6D47, 11525: 0x9A84, 11526: 0x5A07, 11527: 0x56BC, 11528: 0x6405, 11529: 0x94F0, 11530: 0x77EB, 11531: 0x4FA5, 11532: 0x811A, 11533: 0x72E1, 11534: 0x89D2, 11535: 0x997A, 11536: 0x7F34, 11537: 0x7EDE, 11538: 0x527F, 11539: 0x6559, 11540: 0x9175, 11541: 0x8F7F, 11542: 0x8F83, 11543: 0x53EB, 11544: 0x7A96, 11545: 0x63ED, 11546: 0x63A5, 11547: 0x7686, 11548: 0x79F8, 11549: 0x8857, 11550: 0x9636, 11551: 0x622A, 11552: 0x52AB, 11553: 0x8282, 11554: 0x6854, 11555: 0x6770, 11556: 0x6377, 11557: 0x776B, 11558: 0x7AED, 11559: 0x6D01, 11560: 0x7ED3, 11561: 0x89E3, 11562: 0x59D0, 11563: 0x6212, 11564: 0x85C9, 11565: 0x82A5, 11566: 0x754C, 11567: 0x501F, 11568: 0x4ECB, 11569: 0x75A5, 11570: 0x8BEB, 11571: 0x5C4A, 11572: 0x5DFE, 11573: 0x7B4B, 11574: 0x65A4, 11575: 0x91D1, 11576: 0x4ECA, 11577: 0x6D25, 11578: 0x895F, 11579: 0x7D27, 11580: 0x9526, 11581: 0x4EC5, 11582: 0x8C28, 11583: 0x8FDB, 11584: 0x9773, 11585: 0x664B, 11586: 0x7981, 11587: 0x8FD1, 11588: 0x70EC, 11589: 0x6D78, 11590: 0x7D99, 11591: 0x7D9A, 11592: 0x7D9B, 11593: 0x7D9C, 11594: 0x7D9D, 11595: 0x7D9E, 11596: 0x7D9F, 11597: 0x7DA0, 11598: 0x7DA1, 11599: 0x7DA2, 11600: 0x7DA3, 11601: 0x7DA4, 11602: 0x7DA5, 11603: 0x7DA7, 11604: 0x7DA8, 11605: 0x7DA9, 11606: 0x7DAA, 11607: 0x7DAB, 11608: 0x7DAC, 11609: 0x7DAD, 11610: 0x7DAF, 11611: 0x7DB0, 11612: 0x7DB1, 11613: 0x7DB2, 11614: 0x7DB3, 11615: 0x7DB4, 11616: 0x7DB5, 11617: 0x7DB6, 11618: 0x7DB7, 11619: 0x7DB8, 11620: 0x7DB9, 11621: 0x7DBA, 11622: 0x7DBB, 11623: 0x7DBC, 11624: 0x7DBD, 11625: 0x7DBE, 11626: 0x7DBF, 11627: 0x7DC0, 11628: 0x7DC1, 11629: 0x7DC2, 11630: 0x7DC3, 11631: 0x7DC4, 11632: 0x7DC5, 11633: 0x7DC6, 11634: 0x7DC7, 11635: 0x7DC8, 11636: 0x7DC9, 11637: 0x7DCA, 11638: 0x7DCB, 11639: 0x7DCC, 11640: 0x7DCD, 11641: 0x7DCE, 11642: 0x7DCF, 11643: 0x7DD0, 11644: 0x7DD1, 11645: 0x7DD2, 11646: 0x7DD3, 11647: 0x7DD4, 11648: 0x7DD5, 11649: 0x7DD6, 11650: 0x7DD7, 11651: 0x7DD8, 11652: 0x7DD9, 11653: 0x7DDA, 11654: 0x7DDB, 11655: 0x7DDC, 11656: 0x7DDD, 11657: 0x7DDE, 11658: 0x7DDF, 11659: 0x7DE0, 11660: 0x7DE1, 11661: 0x7DE2, 11662: 0x7DE3, 11663: 0x7DE4, 11664: 0x7DE5, 11665: 0x7DE6, 11666: 0x7DE7, 11667: 0x7DE8, 11668: 0x7DE9, 11669: 0x7DEA, 11670: 0x7DEB, 11671: 0x7DEC, 11672: 0x7DED, 11673: 0x7DEE, 11674: 0x7DEF, 11675: 0x7DF0, 11676: 0x7DF1, 11677: 0x7DF2, 11678: 0x7DF3, 11679: 0x7DF4, 11680: 0x7DF5, 11681: 0x7DF6, 11682: 0x7DF7, 11683: 0x7DF8, 11684: 0x7DF9, 11685: 0x7DFA, 11686: 0x5C3D, 11687: 0x52B2, 11688: 0x8346, 11689: 0x5162, 11690: 0x830E, 11691: 0x775B, 11692: 0x6676, 11693: 0x9CB8, 11694: 0x4EAC, 11695: 0x60CA, 11696: 0x7CBE, 11697: 0x7CB3, 11698: 0x7ECF, 11699: 0x4E95, 11700: 0x8B66, 11701: 0x666F, 11702: 0x9888, 11703: 0x9759, 11704: 0x5883, 11705: 0x656C, 11706: 0x955C, 11707: 0x5F84, 11708: 0x75C9, 11709: 0x9756, 11710: 0x7ADF, 11711: 0x7ADE, 11712: 0x51C0, 11713: 0x70AF, 11714: 0x7A98, 11715: 0x63EA, 11716: 0x7A76, 11717: 0x7EA0, 11718: 0x7396, 11719: 0x97ED, 11720: 0x4E45, 11721: 0x7078, 11722: 0x4E5D, 11723: 0x9152, 11724: 0x53A9, 11725: 0x6551, 11726: 0x65E7, 11727: 0x81FC, 11728: 0x8205, 11729: 0x548E, 11730: 0x5C31, 11731: 0x759A, 11732: 0x97A0, 11733: 0x62D8, 11734: 0x72D9, 11735: 0x75BD, 11736: 0x5C45, 11737: 0x9A79, 11738: 0x83CA, 11739: 0x5C40, 11740: 0x5480, 11741: 0x77E9, 11742: 0x4E3E, 11743: 0x6CAE, 11744: 0x805A, 11745: 0x62D2, 11746: 0x636E, 11747: 0x5DE8, 11748: 0x5177, 11749: 0x8DDD, 11750: 0x8E1E, 11751: 0x952F, 11752: 0x4FF1, 11753: 0x53E5, 11754: 0x60E7, 11755: 0x70AC, 11756: 0x5267, 11757: 0x6350, 11758: 0x9E43, 11759: 0x5A1F, 11760: 0x5026, 11761: 0x7737, 11762: 0x5377, 11763: 0x7EE2, 11764: 0x6485, 11765: 0x652B, 11766: 0x6289, 11767: 0x6398, 11768: 0x5014, 11769: 0x7235, 11770: 0x89C9, 11771: 0x51B3, 11772: 0x8BC0, 11773: 0x7EDD, 11774: 0x5747, 11775: 0x83CC, 11776: 0x94A7, 11777: 0x519B, 11778: 0x541B, 11779: 0x5CFB, 11780: 0x7DFB, 11781: 0x7DFC, 11782: 0x7DFD, 11783: 0x7DFE, 11784: 0x7DFF, 11785: 0x7E00, 11786: 0x7E01, 11787: 0x7E02, 11788: 0x7E03, 11789: 0x7E04, 11790: 0x7E05, 11791: 0x7E06, 11792: 0x7E07, 11793: 0x7E08, 11794: 0x7E09, 11795: 0x7E0A, 11796: 0x7E0B, 11797: 0x7E0C, 11798: 0x7E0D, 11799: 0x7E0E, 11800: 0x7E0F, 11801: 0x7E10, 11802: 0x7E11, 11803: 0x7E12, 11804: 0x7E13, 11805: 0x7E14, 11806: 0x7E15, 11807: 0x7E16, 11808: 0x7E17, 11809: 0x7E18, 11810: 0x7E19, 11811: 0x7E1A, 11812: 0x7E1B, 11813: 0x7E1C, 11814: 0x7E1D, 11815: 0x7E1E, 11816: 0x7E1F, 11817: 0x7E20, 11818: 0x7E21, 11819: 0x7E22, 11820: 0x7E23, 11821: 0x7E24, 11822: 0x7E25, 11823: 0x7E26, 11824: 0x7E27, 11825: 0x7E28, 11826: 0x7E29, 11827: 0x7E2A, 11828: 0x7E2B, 11829: 0x7E2C, 11830: 0x7E2D, 11831: 0x7E2E, 11832: 0x7E2F, 11833: 0x7E30, 11834: 0x7E31, 11835: 0x7E32, 11836: 0x7E33, 11837: 0x7E34, 11838: 0x7E35, 11839: 0x7E36, 11840: 0x7E37, 11841: 0x7E38, 11842: 0x7E39, 11843: 0x7E3A, 11844: 0x7E3C, 11845: 0x7E3D, 11846: 0x7E3E, 11847: 0x7E3F, 11848: 0x7E40, 11849: 0x7E42, 11850: 0x7E43, 11851: 0x7E44, 11852: 0x7E45, 11853: 0x7E46, 11854: 0x7E48, 11855: 0x7E49, 11856: 0x7E4A, 11857: 0x7E4B, 11858: 0x7E4C, 11859: 0x7E4D, 11860: 0x7E4E, 11861: 0x7E4F, 11862: 0x7E50, 11863: 0x7E51, 11864: 0x7E52, 11865: 0x7E53, 11866: 0x7E54, 11867: 0x7E55, 11868: 0x7E56, 11869: 0x7E57, 11870: 0x7E58, 11871: 0x7E59, 11872: 0x7E5A, 11873: 0x7E5B, 11874: 0x7E5C, 11875: 0x7E5D, 11876: 0x4FCA, 11877: 0x7AE3, 11878: 0x6D5A, 11879: 0x90E1, 11880: 0x9A8F, 11881: 0x5580, 11882: 0x5496, 11883: 0x5361, 11884: 0x54AF, 11885: 0x5F00, 11886: 0x63E9, 11887: 0x6977, 11888: 0x51EF, 11889: 0x6168, 11890: 0x520A, 11891: 0x582A, 11892: 0x52D8, 11893: 0x574E, 11894: 0x780D, 11895: 0x770B, 11896: 0x5EB7, 11897: 0x6177, 11898: 0x7CE0, 11899: 0x625B, 11900: 0x6297, 11901: 0x4EA2, 11902: 0x7095, 11903: 0x8003, 11904: 0x62F7, 11905: 0x70E4, 11906: 0x9760, 11907: 0x5777, 11908: 0x82DB, 11909: 0x67EF, 11910: 0x68F5, 11911: 0x78D5, 11912: 0x9897, 11913: 0x79D1, 11914: 0x58F3, 11915: 0x54B3, 11916: 0x53EF, 11917: 0x6E34, 11918: 0x514B, 11919: 0x523B, 11920: 0x5BA2, 11921: 0x8BFE, 11922: 0x80AF, 11923: 0x5543, 11924: 0x57A6, 11925: 0x6073, 11926: 0x5751, 11927: 0x542D, 11928: 0x7A7A, 11929: 0x6050, 11930: 0x5B54, 11931: 0x63A7, 11932: 0x62A0, 11933: 0x53E3, 11934: 0x6263, 11935: 0x5BC7, 11936: 0x67AF, 11937: 0x54ED, 11938: 0x7A9F, 11939: 0x82E6, 11940: 0x9177, 11941: 0x5E93, 11942: 0x88E4, 11943: 0x5938, 11944: 0x57AE, 11945: 0x630E, 11946: 0x8DE8, 11947: 0x80EF, 11948: 0x5757, 11949: 0x7B77, 11950: 0x4FA9, 11951: 0x5FEB, 11952: 0x5BBD, 11953: 0x6B3E, 11954: 0x5321, 11955: 0x7B50, 11956: 0x72C2, 11957: 0x6846, 11958: 0x77FF, 11959: 0x7736, 11960: 0x65F7, 11961: 0x51B5, 11962: 0x4E8F, 11963: 0x76D4, 11964: 0x5CBF, 11965: 0x7AA5, 11966: 0x8475, 11967: 0x594E, 11968: 0x9B41, 11969: 0x5080, 11970: 0x7E5E, 11971: 0x7E5F, 11972: 0x7E60, 11973: 0x7E61, 11974: 0x7E62, 11975: 0x7E63, 11976: 0x7E64, 11977: 0x7E65, 11978: 0x7E66, 11979: 0x7E67, 11980: 0x7E68, 11981: 0x7E69, 11982: 0x7E6A, 11983: 0x7E6B, 11984: 0x7E6C, 11985: 0x7E6D, 11986: 0x7E6E, 11987: 0x7E6F, 11988: 0x7E70, 11989: 0x7E71, 11990: 0x7E72, 11991: 0x7E73, 11992: 0x7E74, 11993: 0x7E75, 11994: 0x7E76, 11995: 0x7E77, 11996: 0x7E78, 11997: 0x7E79, 11998: 0x7E7A, 11999: 0x7E7B, 12000: 0x7E7C, 12001: 0x7E7D, 12002: 0x7E7E, 12003: 0x7E7F, 12004: 0x7E80, 12005: 0x7E81, 12006: 0x7E83, 12007: 0x7E84, 12008: 0x7E85, 12009: 0x7E86, 12010: 0x7E87, 12011: 0x7E88, 12012: 0x7E89, 12013: 0x7E8A, 12014: 0x7E8B, 12015: 0x7E8C, 12016: 0x7E8D, 12017: 0x7E8E, 12018: 0x7E8F, 12019: 0x7E90, 12020: 0x7E91, 12021: 0x7E92, 12022: 0x7E93, 12023: 0x7E94, 12024: 0x7E95, 12025: 0x7E96, 12026: 0x7E97, 12027: 0x7E98, 12028: 0x7E99, 12029: 0x7E9A, 12030: 0x7E9C, 12031: 0x7E9D, 12032: 0x7E9E, 12033: 0x7EAE, 12034: 0x7EB4, 12035: 0x7EBB, 12036: 0x7EBC, 12037: 0x7ED6, 12038: 0x7EE4, 12039: 0x7EEC, 12040: 0x7EF9, 12041: 0x7F0A, 12042: 0x7F10, 12043: 0x7F1E, 12044: 0x7F37, 12045: 0x7F39, 12046: 0x7F3B, 12047: 0x7F3C, 12048: 0x7F3D, 12049: 0x7F3E, 12050: 0x7F3F, 12051: 0x7F40, 12052: 0x7F41, 12053: 0x7F43, 12054: 0x7F46, 12055: 0x7F47, 12056: 0x7F48, 12057: 0x7F49, 12058: 0x7F4A, 12059: 0x7F4B, 12060: 0x7F4C, 12061: 0x7F4D, 12062: 0x7F4E, 12063: 0x7F4F, 12064: 0x7F52, 12065: 0x7F53, 12066: 0x9988, 12067: 0x6127, 12068: 0x6E83, 12069: 0x5764, 12070: 0x6606, 12071: 0x6346, 12072: 0x56F0, 12073: 0x62EC, 12074: 0x6269, 12075: 0x5ED3, 12076: 0x9614, 12077: 0x5783, 12078: 0x62C9, 12079: 0x5587, 12080: 0x8721, 12081: 0x814A, 12082: 0x8FA3, 12083: 0x5566, 12084: 0x83B1, 12085: 0x6765, 12086: 0x8D56, 12087: 0x84DD, 12088: 0x5A6A, 12089: 0x680F, 12090: 0x62E6, 12091: 0x7BEE, 12092: 0x9611, 12093: 0x5170, 12094: 0x6F9C, 12095: 0x8C30, 12096: 0x63FD, 12097: 0x89C8, 12098: 0x61D2, 12099: 0x7F06, 12100: 0x70C2, 12101: 0x6EE5, 12102: 0x7405, 12103: 0x6994, 12104: 0x72FC, 12105: 0x5ECA, 12106: 0x90CE, 12107: 0x6717, 12108: 0x6D6A, 12109: 0x635E, 12110: 0x52B3, 12111: 0x7262, 12112: 0x8001, 12113: 0x4F6C, 12114: 0x59E5, 12115: 0x916A, 12116: 0x70D9, 12117: 0x6D9D, 12118: 0x52D2, 12119: 0x4E50, 12120: 0x96F7, 12121: 0x956D, 12122: 0x857E, 12123: 0x78CA, 12124: 0x7D2F, 12125: 0x5121, 12126: 0x5792, 12127: 0x64C2, 12128: 0x808B, 12129: 0x7C7B, 12130: 0x6CEA, 12131: 0x68F1, 12132: 0x695E, 12133: 0x51B7, 12134: 0x5398, 12135: 0x68A8, 12136: 0x7281, 12137: 0x9ECE, 12138: 0x7BF1, 12139: 0x72F8, 12140: 0x79BB, 12141: 0x6F13, 12142: 0x7406, 12143: 0x674E, 12144: 0x91CC, 12145: 0x9CA4, 12146: 0x793C, 12147: 0x8389, 12148: 0x8354, 12149: 0x540F, 12150: 0x6817, 12151: 0x4E3D, 12152: 0x5389, 12153: 0x52B1, 12154: 0x783E, 12155: 0x5386, 12156: 0x5229, 12157: 0x5088, 12158: 0x4F8B, 12159: 0x4FD0, 12160: 0x7F56, 12161: 0x7F59, 12162: 0x7F5B, 12163: 0x7F5C, 12164: 0x7F5D, 12165: 0x7F5E, 12166: 0x7F60, 12167: 0x7F63, 12168: 0x7F64, 12169: 0x7F65, 12170: 0x7F66, 12171: 0x7F67, 12172: 0x7F6B, 12173: 0x7F6C, 12174: 0x7F6D, 12175: 0x7F6F, 12176: 0x7F70, 12177: 0x7F73, 12178: 0x7F75, 12179: 0x7F76, 12180: 0x7F77, 12181: 0x7F78, 12182: 0x7F7A, 12183: 0x7F7B, 12184: 0x7F7C, 12185: 0x7F7D, 12186: 0x7F7F, 12187: 0x7F80, 12188: 0x7F82, 12189: 0x7F83, 12190: 0x7F84, 12191: 0x7F85, 12192: 0x7F86, 12193: 0x7F87, 12194: 0x7F88, 12195: 0x7F89, 12196: 0x7F8B, 12197: 0x7F8D, 12198: 0x7F8F, 12199: 0x7F90, 12200: 0x7F91, 12201: 0x7F92, 12202: 0x7F93, 12203: 0x7F95, 12204: 0x7F96, 12205: 0x7F97, 12206: 0x7F98, 12207: 0x7F99, 12208: 0x7F9B, 12209: 0x7F9C, 12210: 0x7FA0, 12211: 0x7FA2, 12212: 0x7FA3, 12213: 0x7FA5, 12214: 0x7FA6, 12215: 0x7FA8, 12216: 0x7FA9, 12217: 0x7FAA, 12218: 0x7FAB, 12219: 0x7FAC, 12220: 0x7FAD, 12221: 0x7FAE, 12222: 0x7FB1, 12223: 0x7FB3, 12224: 0x7FB4, 12225: 0x7FB5, 12226: 0x7FB6, 12227: 0x7FB7, 12228: 0x7FBA, 12229: 0x7FBB, 12230: 0x7FBE, 12231: 0x7FC0, 12232: 0x7FC2, 12233: 0x7FC3, 12234: 0x7FC4, 12235: 0x7FC6, 12236: 0x7FC7, 12237: 0x7FC8, 12238: 0x7FC9, 12239: 0x7FCB, 12240: 0x7FCD, 12241: 0x7FCF, 12242: 0x7FD0, 12243: 0x7FD1, 12244: 0x7FD2, 12245: 0x7FD3, 12246: 0x7FD6, 12247: 0x7FD7, 12248: 0x7FD9, 12249: 0x7FDA, 12250: 0x7FDB, 12251: 0x7FDC, 12252: 0x7FDD, 12253: 0x7FDE, 12254: 0x7FE2, 12255: 0x7FE3, 12256: 0x75E2, 12257: 0x7ACB, 12258: 0x7C92, 12259: 0x6CA5, 12260: 0x96B6, 12261: 0x529B, 12262: 0x7483, 12263: 0x54E9, 12264: 0x4FE9, 12265: 0x8054, 12266: 0x83B2, 12267: 0x8FDE, 12268: 0x9570, 12269: 0x5EC9, 12270: 0x601C, 12271: 0x6D9F, 12272: 0x5E18, 12273: 0x655B, 12274: 0x8138, 12275: 0x94FE, 12276: 0x604B, 12277: 0x70BC, 12278: 0x7EC3, 12279: 0x7CAE, 12280: 0x51C9, 12281: 0x6881, 12282: 0x7CB1, 12283: 0x826F, 12284: 0x4E24, 12285: 0x8F86, 12286: 0x91CF, 12287: 0x667E, 12288: 0x4EAE, 12289: 0x8C05, 12290: 0x64A9, 12291: 0x804A, 12292: 0x50DA, 12293: 0x7597, 12294: 0x71CE, 12295: 0x5BE5, 12296: 0x8FBD, 12297: 0x6F66, 12298: 0x4E86, 12299: 0x6482, 12300: 0x9563, 12301: 0x5ED6, 12302: 0x6599, 12303: 0x5217, 12304: 0x88C2, 12305: 0x70C8, 12306: 0x52A3, 12307: 0x730E, 12308: 0x7433, 12309: 0x6797, 12310: 0x78F7, 12311: 0x9716, 12312: 0x4E34, 12313: 0x90BB, 12314: 0x9CDE, 12315: 0x6DCB, 12316: 0x51DB, 12317: 0x8D41, 12318: 0x541D, 12319: 0x62CE, 12320: 0x73B2, 12321: 0x83F1, 12322: 0x96F6, 12323: 0x9F84, 12324: 0x94C3, 12325: 0x4F36, 12326: 0x7F9A, 12327: 0x51CC, 12328: 0x7075, 12329: 0x9675, 12330: 0x5CAD, 12331: 0x9886, 12332: 0x53E6, 12333: 0x4EE4, 12334: 0x6E9C, 12335: 0x7409, 12336: 0x69B4, 12337: 0x786B, 12338: 0x998F, 12339: 0x7559, 12340: 0x5218, 12341: 0x7624, 12342: 0x6D41, 12343: 0x67F3, 12344: 0x516D, 12345: 0x9F99, 12346: 0x804B, 12347: 0x5499, 12348: 0x7B3C, 12349: 0x7ABF, 12350: 0x7FE4, 12351: 0x7FE7, 12352: 0x7FE8, 12353: 0x7FEA, 12354: 0x7FEB, 12355: 0x7FEC, 12356: 0x7FED, 12357: 0x7FEF, 12358: 0x7FF2, 12359: 0x7FF4, 12360: 0x7FF5, 12361: 0x7FF6, 12362: 0x7FF7, 12363: 0x7FF8, 12364: 0x7FF9, 12365: 0x7FFA, 12366: 0x7FFD, 12367: 0x7FFE, 12368: 0x7FFF, 12369: 0x8002, 12370: 0x8007, 12371: 0x8008, 12372: 0x8009, 12373: 0x800A, 12374: 0x800E, 12375: 0x800F, 12376: 0x8011, 12377: 0x8013, 12378: 0x801A, 12379: 0x801B, 12380: 0x801D, 12381: 0x801E, 12382: 0x801F, 12383: 0x8021, 12384: 0x8023, 12385: 0x8024, 12386: 0x802B, 12387: 0x802C, 12388: 0x802D, 12389: 0x802E, 12390: 0x802F, 12391: 0x8030, 12392: 0x8032, 12393: 0x8034, 12394: 0x8039, 12395: 0x803A, 12396: 0x803C, 12397: 0x803E, 12398: 0x8040, 12399: 0x8041, 12400: 0x8044, 12401: 0x8045, 12402: 0x8047, 12403: 0x8048, 12404: 0x8049, 12405: 0x804E, 12406: 0x804F, 12407: 0x8050, 12408: 0x8051, 12409: 0x8053, 12410: 0x8055, 12411: 0x8056, 12412: 0x8057, 12413: 0x8059, 12414: 0x805B, 12415: 0x805C, 12416: 0x805D, 12417: 0x805E, 12418: 0x805F, 12419: 0x8060, 12420: 0x8061, 12421: 0x8062, 12422: 0x8063, 12423: 0x8064, 12424: 0x8065, 12425: 0x8066, 12426: 0x8067, 12427: 0x8068, 12428: 0x806B, 12429: 0x806C, 12430: 0x806D, 12431: 0x806E, 12432: 0x806F, 12433: 0x8070, 12434: 0x8072, 12435: 0x8073, 12436: 0x8074, 12437: 0x8075, 12438: 0x8076, 12439: 0x8077, 12440: 0x8078, 12441: 0x8079, 12442: 0x807A, 12443: 0x807B, 12444: 0x807C, 12445: 0x807D, 12446: 0x9686, 12447: 0x5784, 12448: 0x62E2, 12449: 0x9647, 12450: 0x697C, 12451: 0x5A04, 12452: 0x6402, 12453: 0x7BD3, 12454: 0x6F0F, 12455: 0x964B, 12456: 0x82A6, 12457: 0x5362, 12458: 0x9885, 12459: 0x5E90, 12460: 0x7089, 12461: 0x63B3, 12462: 0x5364, 12463: 0x864F, 12464: 0x9C81, 12465: 0x9E93, 12466: 0x788C, 12467: 0x9732, 12468: 0x8DEF, 12469: 0x8D42, 12470: 0x9E7F, 12471: 0x6F5E, 12472: 0x7984, 12473: 0x5F55, 12474: 0x9646, 12475: 0x622E, 12476: 0x9A74, 12477: 0x5415, 12478: 0x94DD, 12479: 0x4FA3, 12480: 0x65C5, 12481: 0x5C65, 12482: 0x5C61, 12483: 0x7F15, 12484: 0x8651, 12485: 0x6C2F, 12486: 0x5F8B, 12487: 0x7387, 12488: 0x6EE4, 12489: 0x7EFF, 12490: 0x5CE6, 12491: 0x631B, 12492: 0x5B6A, 12493: 0x6EE6, 12494: 0x5375, 12495: 0x4E71, 12496: 0x63A0, 12497: 0x7565, 12498: 0x62A1, 12499: 0x8F6E, 12500: 0x4F26, 12501: 0x4ED1, 12502: 0x6CA6, 12503: 0x7EB6, 12504: 0x8BBA, 12505: 0x841D, 12506: 0x87BA, 12507: 0x7F57, 12508: 0x903B, 12509: 0x9523, 12510: 0x7BA9, 12511: 0x9AA1, 12512: 0x88F8, 12513: 0x843D, 12514: 0x6D1B, 12515: 0x9A86, 12516: 0x7EDC, 12517: 0x5988, 12518: 0x9EBB, 12519: 0x739B, 12520: 0x7801, 12521: 0x8682, 12522: 0x9A6C, 12523: 0x9A82, 12524: 0x561B, 12525: 0x5417, 12526: 0x57CB, 12527: 0x4E70, 12528: 0x9EA6, 12529: 0x5356, 12530: 0x8FC8, 12531: 0x8109, 12532: 0x7792, 12533: 0x9992, 12534: 0x86EE, 12535: 0x6EE1, 12536: 0x8513, 12537: 0x66FC, 12538: 0x6162, 12539: 0x6F2B, 12540: 0x807E, 12541: 0x8081, 12542: 0x8082, 12543: 0x8085, 12544: 0x8088, 12545: 0x808A, 12546: 0x808D, 12547: 0x808E, 12548: 0x808F, 12549: 0x8090, 12550: 0x8091, 12551: 0x8092, 12552: 0x8094, 12553: 0x8095, 12554: 0x8097, 12555: 0x8099, 12556: 0x809E, 12557: 0x80A3, 12558: 0x80A6, 12559: 0x80A7, 12560: 0x80A8, 12561: 0x80AC, 12562: 0x80B0, 12563: 0x80B3, 12564: 0x80B5, 12565: 0x80B6, 12566: 0x80B8, 12567: 0x80B9, 12568: 0x80BB, 12569: 0x80C5, 12570: 0x80C7, 12571: 0x80C8, 12572: 0x80C9, 12573: 0x80CA, 12574: 0x80CB, 12575: 0x80CF, 12576: 0x80D0, 12577: 0x80D1, 12578: 0x80D2, 12579: 0x80D3, 12580: 0x80D4, 12581: 0x80D5, 12582: 0x80D8, 12583: 0x80DF, 12584: 0x80E0, 12585: 0x80E2, 12586: 0x80E3, 12587: 0x80E6, 12588: 0x80EE, 12589: 0x80F5, 12590: 0x80F7, 12591: 0x80F9, 12592: 0x80FB, 12593: 0x80FE, 12594: 0x80FF, 12595: 0x8100, 12596: 0x8101, 12597: 0x8103, 12598: 0x8104, 12599: 0x8105, 12600: 0x8107, 12601: 0x8108, 12602: 0x810B, 12603: 0x810C, 12604: 0x8115, 12605: 0x8117, 12606: 0x8119, 12607: 0x811B, 12608: 0x811C, 12609: 0x811D, 12610: 0x811F, 12611: 0x8120, 12612: 0x8121, 12613: 0x8122, 12614: 0x8123, 12615: 0x8124, 12616: 0x8125, 12617: 0x8126, 12618: 0x8127, 12619: 0x8128, 12620: 0x8129, 12621: 0x812A, 12622: 0x812B, 12623: 0x812D, 12624: 0x812E, 12625: 0x8130, 12626: 0x8133, 12627: 0x8134, 12628: 0x8135, 12629: 0x8137, 12630: 0x8139, 12631: 0x813A, 12632: 0x813B, 12633: 0x813C, 12634: 0x813D, 12635: 0x813F, 12636: 0x8C29, 12637: 0x8292, 12638: 0x832B, 12639: 0x76F2, 12640: 0x6C13, 12641: 0x5FD9, 12642: 0x83BD, 12643: 0x732B, 12644: 0x8305, 12645: 0x951A, 12646: 0x6BDB, 12647: 0x77DB, 12648: 0x94C6, 12649: 0x536F, 12650: 0x8302, 12651: 0x5192, 12652: 0x5E3D, 12653: 0x8C8C, 12654: 0x8D38, 12655: 0x4E48, 12656: 0x73AB, 12657: 0x679A, 12658: 0x6885, 12659: 0x9176, 12660: 0x9709, 12661: 0x7164, 12662: 0x6CA1, 12663: 0x7709, 12664: 0x5A92, 12665: 0x9541, 12666: 0x6BCF, 12667: 0x7F8E, 12668: 0x6627, 12669: 0x5BD0, 12670: 0x59B9, 12671: 0x5A9A, 12672: 0x95E8, 12673: 0x95F7, 12674: 0x4EEC, 12675: 0x840C, 12676: 0x8499, 12677: 0x6AAC, 12678: 0x76DF, 12679: 0x9530, 12680: 0x731B, 12681: 0x68A6, 12682: 0x5B5F, 12683: 0x772F, 12684: 0x919A, 12685: 0x9761, 12686: 0x7CDC, 12687: 0x8FF7, 12688: 0x8C1C, 12689: 0x5F25, 12690: 0x7C73, 12691: 0x79D8, 12692: 0x89C5, 12693: 0x6CCC, 12694: 0x871C, 12695: 0x5BC6, 12696: 0x5E42, 12697: 0x68C9, 12698: 0x7720, 12699: 0x7EF5, 12700: 0x5195, 12701: 0x514D, 12702: 0x52C9, 12703: 0x5A29, 12704: 0x7F05, 12705: 0x9762, 12706: 0x82D7, 12707: 0x63CF, 12708: 0x7784, 12709: 0x85D0, 12710: 0x79D2, 12711: 0x6E3A, 12712: 0x5E99, 12713: 0x5999, 12714: 0x8511, 12715: 0x706D, 12716: 0x6C11, 12717: 0x62BF, 12718: 0x76BF, 12719: 0x654F, 12720: 0x60AF, 12721: 0x95FD, 12722: 0x660E, 12723: 0x879F, 12724: 0x9E23, 12725: 0x94ED, 12726: 0x540D, 12727: 0x547D, 12728: 0x8C2C, 12729: 0x6478, 12730: 0x8140, 12731: 0x8141, 12732: 0x8142, 12733: 0x8143, 12734: 0x8144, 12735: 0x8145, 12736: 0x8147, 12737: 0x8149, 12738: 0x814D, 12739: 0x814E, 12740: 0x814F, 12741: 0x8152, 12742: 0x8156, 12743: 0x8157, 12744: 0x8158, 12745: 0x815B, 12746: 0x815C, 12747: 0x815D, 12748: 0x815E, 12749: 0x815F, 12750: 0x8161, 12751: 0x8162, 12752: 0x8163, 12753: 0x8164, 12754: 0x8166, 12755: 0x8168, 12756: 0x816A, 12757: 0x816B, 12758: 0x816C, 12759: 0x816F, 12760: 0x8172, 12761: 0x8173, 12762: 0x8175, 12763: 0x8176, 12764: 0x8177, 12765: 0x8178, 12766: 0x8181, 12767: 0x8183, 12768: 0x8184, 12769: 0x8185, 12770: 0x8186, 12771: 0x8187, 12772: 0x8189, 12773: 0x818B, 12774: 0x818C, 12775: 0x818D, 12776: 0x818E, 12777: 0x8190, 12778: 0x8192, 12779: 0x8193, 12780: 0x8194, 12781: 0x8195, 12782: 0x8196, 12783: 0x8197, 12784: 0x8199, 12785: 0x819A, 12786: 0x819E, 12787: 0x819F, 12788: 0x81A0, 12789: 0x81A1, 12790: 0x81A2, 12791: 0x81A4, 12792: 0x81A5, 12793: 0x81A7, 12794: 0x81A9, 12795: 0x81AB, 12796: 0x81AC, 12797: 0x81AD, 12798: 0x81AE, 12799: 0x81AF, 12800: 0x81B0, 12801: 0x81B1, 12802: 0x81B2, 12803: 0x81B4, 12804: 0x81B5, 12805: 0x81B6, 12806: 0x81B7, 12807: 0x81B8, 12808: 0x81B9, 12809: 0x81BC, 12810: 0x81BD, 12811: 0x81BE, 12812: 0x81BF, 12813: 0x81C4, 12814: 0x81C5, 12815: 0x81C7, 12816: 0x81C8, 12817: 0x81C9, 12818: 0x81CB, 12819: 0x81CD, 12820: 0x81CE, 12821: 0x81CF, 12822: 0x81D0, 12823: 0x81D1, 12824: 0x81D2, 12825: 0x81D3, 12826: 0x6479, 12827: 0x8611, 12828: 0x6A21, 12829: 0x819C, 12830: 0x78E8, 12831: 0x6469, 12832: 0x9B54, 12833: 0x62B9, 12834: 0x672B, 12835: 0x83AB, 12836: 0x58A8, 12837: 0x9ED8, 12838: 0x6CAB, 12839: 0x6F20, 12840: 0x5BDE, 12841: 0x964C, 12842: 0x8C0B, 12843: 0x725F, 12844: 0x67D0, 12845: 0x62C7, 12846: 0x7261, 12847: 0x4EA9, 12848: 0x59C6, 12849: 0x6BCD, 12850: 0x5893, 12851: 0x66AE, 12852: 0x5E55, 12853: 0x52DF, 12854: 0x6155, 12855: 0x6728, 12856: 0x76EE, 12857: 0x7766, 12858: 0x7267, 12859: 0x7A46, 12860: 0x62FF, 12861: 0x54EA, 12862: 0x5450, 12863: 0x94A0, 12864: 0x90A3, 12865: 0x5A1C, 12866: 0x7EB3, 12867: 0x6C16, 12868: 0x4E43, 12869: 0x5976, 12870: 0x8010, 12871: 0x5948, 12872: 0x5357, 12873: 0x7537, 12874: 0x96BE, 12875: 0x56CA, 12876: 0x6320, 12877: 0x8111, 12878: 0x607C, 12879: 0x95F9, 12880: 0x6DD6, 12881: 0x5462, 12882: 0x9981, 12883: 0x5185, 12884: 0x5AE9, 12885: 0x80FD, 12886: 0x59AE, 12887: 0x9713, 12888: 0x502A, 12889: 0x6CE5, 12890: 0x5C3C, 12891: 0x62DF, 12892: 0x4F60, 12893: 0x533F, 12894: 0x817B, 12895: 0x9006, 12896: 0x6EBA, 12897: 0x852B, 12898: 0x62C8, 12899: 0x5E74, 12900: 0x78BE, 12901: 0x64B5, 12902: 0x637B, 12903: 0x5FF5, 12904: 0x5A18, 12905: 0x917F, 12906: 0x9E1F, 12907: 0x5C3F, 12908: 0x634F, 12909: 0x8042, 12910: 0x5B7D, 12911: 0x556E, 12912: 0x954A, 12913: 0x954D, 12914: 0x6D85, 12915: 0x60A8, 12916: 0x67E0, 12917: 0x72DE, 12918: 0x51DD, 12919: 0x5B81, 12920: 0x81D4, 12921: 0x81D5, 12922: 0x81D6, 12923: 0x81D7, 12924: 0x81D8, 12925: 0x81D9, 12926: 0x81DA, 12927: 0x81DB, 12928: 0x81DC, 12929: 0x81DD, 12930: 0x81DE, 12931: 0x81DF, 12932: 0x81E0, 12933: 0x81E1, 12934: 0x81E2, 12935: 0x81E4, 12936: 0x81E5, 12937: 0x81E6, 12938: 0x81E8, 12939: 0x81E9, 12940: 0x81EB, 12941: 0x81EE, 12942: 0x81EF, 12943: 0x81F0, 12944: 0x81F1, 12945: 0x81F2, 12946: 0x81F5, 12947: 0x81F6, 12948: 0x81F7, 12949: 0x81F8, 12950: 0x81F9, 12951: 0x81FA, 12952: 0x81FD, 12953: 0x81FF, 12954: 0x8203, 12955: 0x8207, 12956: 0x8208, 12957: 0x8209, 12958: 0x820A, 12959: 0x820B, 12960: 0x820E, 12961: 0x820F, 12962: 0x8211, 12963: 0x8213, 12964: 0x8215, 12965: 0x8216, 12966: 0x8217, 12967: 0x8218, 12968: 0x8219, 12969: 0x821A, 12970: 0x821D, 12971: 0x8220, 12972: 0x8224, 12973: 0x8225, 12974: 0x8226, 12975: 0x8227, 12976: 0x8229, 12977: 0x822E, 12978: 0x8232, 12979: 0x823A, 12980: 0x823C, 12981: 0x823D, 12982: 0x823F, 12983: 0x8240, 12984: 0x8241, 12985: 0x8242, 12986: 0x8243, 12987: 0x8245, 12988: 0x8246, 12989: 0x8248, 12990: 0x824A, 12991: 0x824C, 12992: 0x824D, 12993: 0x824E, 12994: 0x8250, 12995: 0x8251, 12996: 0x8252, 12997: 0x8253, 12998: 0x8254, 12999: 0x8255, 13000: 0x8256, 13001: 0x8257, 13002: 0x8259, 13003: 0x825B, 13004: 0x825C, 13005: 0x825D, 13006: 0x825E, 13007: 0x8260, 13008: 0x8261, 13009: 0x8262, 13010: 0x8263, 13011: 0x8264, 13012: 0x8265, 13013: 0x8266, 13014: 0x8267, 13015: 0x8269, 13016: 0x62E7, 13017: 0x6CDE, 13018: 0x725B, 13019: 0x626D, 13020: 0x94AE, 13021: 0x7EBD, 13022: 0x8113, 13023: 0x6D53, 13024: 0x519C, 13025: 0x5F04, 13026: 0x5974, 13027: 0x52AA, 13028: 0x6012, 13029: 0x5973, 13030: 0x6696, 13031: 0x8650, 13032: 0x759F, 13033: 0x632A, 13034: 0x61E6, 13035: 0x7CEF, 13036: 0x8BFA, 13037: 0x54E6, 13038: 0x6B27, 13039: 0x9E25, 13040: 0x6BB4, 13041: 0x85D5, 13042: 0x5455, 13043: 0x5076, 13044: 0x6CA4, 13045: 0x556A, 13046: 0x8DB4, 13047: 0x722C, 13048: 0x5E15, 13049: 0x6015, 13050: 0x7436, 13051: 0x62CD, 13052: 0x6392, 13053: 0x724C, 13054: 0x5F98, 13055: 0x6E43, 13056: 0x6D3E, 13057: 0x6500, 13058: 0x6F58, 13059: 0x76D8, 13060: 0x78D0, 13061: 0x76FC, 13062: 0x7554, 13063: 0x5224, 13064: 0x53DB, 13065: 0x4E53, 13066: 0x5E9E, 13067: 0x65C1, 13068: 0x802A, 13069: 0x80D6, 13070: 0x629B, 13071: 0x5486, 13072: 0x5228, 13073: 0x70AE, 13074: 0x888D, 13075: 0x8DD1, 13076: 0x6CE1, 13077: 0x5478, 13078: 0x80DA, 13079: 0x57F9, 13080: 0x88F4, 13081: 0x8D54, 13082: 0x966A, 13083: 0x914D, 13084: 0x4F69, 13085: 0x6C9B, 13086: 0x55B7, 13087: 0x76C6, 13088: 0x7830, 13089: 0x62A8, 13090: 0x70F9, 13091: 0x6F8E, 13092: 0x5F6D, 13093: 0x84EC, 13094: 0x68DA, 13095: 0x787C, 13096: 0x7BF7, 13097: 0x81A8, 13098: 0x670B, 13099: 0x9E4F, 13100: 0x6367, 13101: 0x78B0, 13102: 0x576F, 13103: 0x7812, 13104: 0x9739, 13105: 0x6279, 13106: 0x62AB, 13107: 0x5288, 13108: 0x7435, 13109: 0x6BD7, 13110: 0x826A, 13111: 0x826B, 13112: 0x826C, 13113: 0x826D, 13114: 0x8271, 13115: 0x8275, 13116: 0x8276, 13117: 0x8277, 13118: 0x8278, 13119: 0x827B, 13120: 0x827C, 13121: 0x8280, 13122: 0x8281, 13123: 0x8283, 13124: 0x8285, 13125: 0x8286, 13126: 0x8287, 13127: 0x8289, 13128: 0x828C, 13129: 0x8290, 13130: 0x8293, 13131: 0x8294, 13132: 0x8295, 13133: 0x8296, 13134: 0x829A, 13135: 0x829B, 13136: 0x829E, 13137: 0x82A0, 13138: 0x82A2, 13139: 0x82A3, 13140: 0x82A7, 13141: 0x82B2, 13142: 0x82B5, 13143: 0x82B6, 13144: 0x82BA, 13145: 0x82BB, 13146: 0x82BC, 13147: 0x82BF, 13148: 0x82C0, 13149: 0x82C2, 13150: 0x82C3, 13151: 0x82C5, 13152: 0x82C6, 13153: 0x82C9, 13154: 0x82D0, 13155: 0x82D6, 13156: 0x82D9, 13157: 0x82DA, 13158: 0x82DD, 13159: 0x82E2, 13160: 0x82E7, 13161: 0x82E8, 13162: 0x82E9, 13163: 0x82EA, 13164: 0x82EC, 13165: 0x82ED, 13166: 0x82EE, 13167: 0x82F0, 13168: 0x82F2, 13169: 0x82F3, 13170: 0x82F5, 13171: 0x82F6, 13172: 0x82F8, 13173: 0x82FA, 13174: 0x82FC, 13175: 0x82FD, 13176: 0x82FE, 13177: 0x82FF, 13178: 0x8300, 13179: 0x830A, 13180: 0x830B, 13181: 0x830D, 13182: 0x8310, 13183: 0x8312, 13184: 0x8313, 13185: 0x8316, 13186: 0x8318, 13187: 0x8319, 13188: 0x831D, 13189: 0x831E, 13190: 0x831F, 13191: 0x8320, 13192: 0x8321, 13193: 0x8322, 13194: 0x8323, 13195: 0x8324, 13196: 0x8325, 13197: 0x8326, 13198: 0x8329, 13199: 0x832A, 13200: 0x832E, 13201: 0x8330, 13202: 0x8332, 13203: 0x8337, 13204: 0x833B, 13205: 0x833D, 13206: 0x5564, 13207: 0x813E, 13208: 0x75B2, 13209: 0x76AE, 13210: 0x5339, 13211: 0x75DE, 13212: 0x50FB, 13213: 0x5C41, 13214: 0x8B6C, 13215: 0x7BC7, 13216: 0x504F, 13217: 0x7247, 13218: 0x9A97, 13219: 0x98D8, 13220: 0x6F02, 13221: 0x74E2, 13222: 0x7968, 13223: 0x6487, 13224: 0x77A5, 13225: 0x62FC, 13226: 0x9891, 13227: 0x8D2B, 13228: 0x54C1, 13229: 0x8058, 13230: 0x4E52, 13231: 0x576A, 13232: 0x82F9, 13233: 0x840D, 13234: 0x5E73, 13235: 0x51ED, 13236: 0x74F6, 13237: 0x8BC4, 13238: 0x5C4F, 13239: 0x5761, 13240: 0x6CFC, 13241: 0x9887, 13242: 0x5A46, 13243: 0x7834, 13244: 0x9B44, 13245: 0x8FEB, 13246: 0x7C95, 13247: 0x5256, 13248: 0x6251, 13249: 0x94FA, 13250: 0x4EC6, 13251: 0x8386, 13252: 0x8461, 13253: 0x83E9, 13254: 0x84B2, 13255: 0x57D4, 13256: 0x6734, 13257: 0x5703, 13258: 0x666E, 13259: 0x6D66, 13260: 0x8C31, 13261: 0x66DD, 13262: 0x7011, 13263: 0x671F, 13264: 0x6B3A, 13265: 0x6816, 13266: 0x621A, 13267: 0x59BB, 13268: 0x4E03, 13269: 0x51C4, 13270: 0x6F06, 13271: 0x67D2, 13272: 0x6C8F, 13273: 0x5176, 13274: 0x68CB, 13275: 0x5947, 13276: 0x6B67, 13277: 0x7566, 13278: 0x5D0E, 13279: 0x8110, 13280: 0x9F50, 13281: 0x65D7, 13282: 0x7948, 13283: 0x7941, 13284: 0x9A91, 13285: 0x8D77, 13286: 0x5C82, 13287: 0x4E5E, 13288: 0x4F01, 13289: 0x542F, 13290: 0x5951, 13291: 0x780C, 13292: 0x5668, 13293: 0x6C14, 13294: 0x8FC4, 13295: 0x5F03, 13296: 0x6C7D, 13297: 0x6CE3, 13298: 0x8BAB, 13299: 0x6390, 13300: 0x833E, 13301: 0x833F, 13302: 0x8341, 13303: 0x8342, 13304: 0x8344, 13305: 0x8345, 13306: 0x8348, 13307: 0x834A, 13308: 0x834B, 13309: 0x834C, 13310: 0x834D, 13311: 0x834E, 13312: 0x8353, 13313: 0x8355, 13314: 0x8356, 13315: 0x8357, 13316: 0x8358, 13317: 0x8359, 13318: 0x835D, 13319: 0x8362, 13320: 0x8370, 13321: 0x8371, 13322: 0x8372, 13323: 0x8373, 13324: 0x8374, 13325: 0x8375, 13326: 0x8376, 13327: 0x8379, 13328: 0x837A, 13329: 0x837E, 13330: 0x837F, 13331: 0x8380, 13332: 0x8381, 13333: 0x8382, 13334: 0x8383, 13335: 0x8384, 13336: 0x8387, 13337: 0x8388, 13338: 0x838A, 13339: 0x838B, 13340: 0x838C, 13341: 0x838D, 13342: 0x838F, 13343: 0x8390, 13344: 0x8391, 13345: 0x8394, 13346: 0x8395, 13347: 0x8396, 13348: 0x8397, 13349: 0x8399, 13350: 0x839A, 13351: 0x839D, 13352: 0x839F, 13353: 0x83A1, 13354: 0x83A2, 13355: 0x83A3, 13356: 0x83A4, 13357: 0x83A5, 13358: 0x83A6, 13359: 0x83A7, 13360: 0x83AC, 13361: 0x83AD, 13362: 0x83AE, 13363: 0x83AF, 13364: 0x83B5, 13365: 0x83BB, 13366: 0x83BE, 13367: 0x83BF, 13368: 0x83C2, 13369: 0x83C3, 13370: 0x83C4, 13371: 0x83C6, 13372: 0x83C8, 13373: 0x83C9, 13374: 0x83CB, 13375: 0x83CD, 13376: 0x83CE, 13377: 0x83D0, 13378: 0x83D1, 13379: 0x83D2, 13380: 0x83D3, 13381: 0x83D5, 13382: 0x83D7, 13383: 0x83D9, 13384: 0x83DA, 13385: 0x83DB, 13386: 0x83DE, 13387: 0x83E2, 13388: 0x83E3, 13389: 0x83E4, 13390: 0x83E6, 13391: 0x83E7, 13392: 0x83E8, 13393: 0x83EB, 13394: 0x83EC, 13395: 0x83ED, 13396: 0x6070, 13397: 0x6D3D, 13398: 0x7275, 13399: 0x6266, 13400: 0x948E, 13401: 0x94C5, 13402: 0x5343, 13403: 0x8FC1, 13404: 0x7B7E, 13405: 0x4EDF, 13406: 0x8C26, 13407: 0x4E7E, 13408: 0x9ED4, 13409: 0x94B1, 13410: 0x94B3, 13411: 0x524D, 13412: 0x6F5C, 13413: 0x9063, 13414: 0x6D45, 13415: 0x8C34, 13416: 0x5811, 13417: 0x5D4C, 13418: 0x6B20, 13419: 0x6B49, 13420: 0x67AA, 13421: 0x545B, 13422: 0x8154, 13423: 0x7F8C, 13424: 0x5899, 13425: 0x8537, 13426: 0x5F3A, 13427: 0x62A2, 13428: 0x6A47, 13429: 0x9539, 13430: 0x6572, 13431: 0x6084, 13432: 0x6865, 13433: 0x77A7, 13434: 0x4E54, 13435: 0x4FA8, 13436: 0x5DE7, 13437: 0x9798, 13438: 0x64AC, 13439: 0x7FD8, 13440: 0x5CED, 13441: 0x4FCF, 13442: 0x7A8D, 13443: 0x5207, 13444: 0x8304, 13445: 0x4E14, 13446: 0x602F, 13447: 0x7A83, 13448: 0x94A6, 13449: 0x4FB5, 13450: 0x4EB2, 13451: 0x79E6, 13452: 0x7434, 13453: 0x52E4, 13454: 0x82B9, 13455: 0x64D2, 13456: 0x79BD, 13457: 0x5BDD, 13458: 0x6C81, 13459: 0x9752, 13460: 0x8F7B, 13461: 0x6C22, 13462: 0x503E, 13463: 0x537F, 13464: 0x6E05, 13465: 0x64CE, 13466: 0x6674, 13467: 0x6C30, 13468: 0x60C5, 13469: 0x9877, 13470: 0x8BF7, 13471: 0x5E86, 13472: 0x743C, 13473: 0x7A77, 13474: 0x79CB, 13475: 0x4E18, 13476: 0x90B1, 13477: 0x7403, 13478: 0x6C42, 13479: 0x56DA, 13480: 0x914B, 13481: 0x6CC5, 13482: 0x8D8B, 13483: 0x533A, 13484: 0x86C6, 13485: 0x66F2, 13486: 0x8EAF, 13487: 0x5C48, 13488: 0x9A71, 13489: 0x6E20, 13490: 0x83EE, 13491: 0x83EF, 13492: 0x83F3, 13493: 0x83F4, 13494: 0x83F5, 13495: 0x83F6, 13496: 0x83F7, 13497: 0x83FA, 13498: 0x83FB, 13499: 0x83FC, 13500: 0x83FE, 13501: 0x83FF, 13502: 0x8400, 13503: 0x8402, 13504: 0x8405, 13505: 0x8407, 13506: 0x8408, 13507: 0x8409, 13508: 0x840A, 13509: 0x8410, 13510: 0x8412, 13511: 0x8413, 13512: 0x8414, 13513: 0x8415, 13514: 0x8416, 13515: 0x8417, 13516: 0x8419, 13517: 0x841A, 13518: 0x841B, 13519: 0x841E, 13520: 0x841F, 13521: 0x8420, 13522: 0x8421, 13523: 0x8422, 13524: 0x8423, 13525: 0x8429, 13526: 0x842A, 13527: 0x842B, 13528: 0x842C, 13529: 0x842D, 13530: 0x842E, 13531: 0x842F, 13532: 0x8430, 13533: 0x8432, 13534: 0x8433, 13535: 0x8434, 13536: 0x8435, 13537: 0x8436, 13538: 0x8437, 13539: 0x8439, 13540: 0x843A, 13541: 0x843B, 13542: 0x843E, 13543: 0x843F, 13544: 0x8440, 13545: 0x8441, 13546: 0x8442, 13547: 0x8443, 13548: 0x8444, 13549: 0x8445, 13550: 0x8447, 13551: 0x8448, 13552: 0x8449, 13553: 0x844A, 13554: 0x844B, 13555: 0x844C, 13556: 0x844D, 13557: 0x844E, 13558: 0x844F, 13559: 0x8450, 13560: 0x8452, 13561: 0x8453, 13562: 0x8454, 13563: 0x8455, 13564: 0x8456, 13565: 0x8458, 13566: 0x845D, 13567: 0x845E, 13568: 0x845F, 13569: 0x8460, 13570: 0x8462, 13571: 0x8464, 13572: 0x8465, 13573: 0x8466, 13574: 0x8467, 13575: 0x8468, 13576: 0x846A, 13577: 0x846E, 13578: 0x846F, 13579: 0x8470, 13580: 0x8472, 13581: 0x8474, 13582: 0x8477, 13583: 0x8479, 13584: 0x847B, 13585: 0x847C, 13586: 0x53D6, 13587: 0x5A36, 13588: 0x9F8B, 13589: 0x8DA3, 13590: 0x53BB, 13591: 0x5708, 13592: 0x98A7, 13593: 0x6743, 13594: 0x919B, 13595: 0x6CC9, 13596: 0x5168, 13597: 0x75CA, 13598: 0x62F3, 13599: 0x72AC, 13600: 0x5238, 13601: 0x529D, 13602: 0x7F3A, 13603: 0x7094, 13604: 0x7638, 13605: 0x5374, 13606: 0x9E4A, 13607: 0x69B7, 13608: 0x786E, 13609: 0x96C0, 13610: 0x88D9, 13611: 0x7FA4, 13612: 0x7136, 13613: 0x71C3, 13614: 0x5189, 13615: 0x67D3, 13616: 0x74E4, 13617: 0x58E4, 13618: 0x6518, 13619: 0x56B7, 13620: 0x8BA9, 13621: 0x9976, 13622: 0x6270, 13623: 0x7ED5, 13624: 0x60F9, 13625: 0x70ED, 13626: 0x58EC, 13627: 0x4EC1, 13628: 0x4EBA, 13629: 0x5FCD, 13630: 0x97E7, 13631: 0x4EFB, 13632: 0x8BA4, 13633: 0x5203, 13634: 0x598A, 13635: 0x7EAB, 13636: 0x6254, 13637: 0x4ECD, 13638: 0x65E5, 13639: 0x620E, 13640: 0x8338, 13641: 0x84C9, 13642: 0x8363, 13643: 0x878D, 13644: 0x7194, 13645: 0x6EB6, 13646: 0x5BB9, 13647: 0x7ED2, 13648: 0x5197, 13649: 0x63C9, 13650: 0x67D4, 13651: 0x8089, 13652: 0x8339, 13653: 0x8815, 13654: 0x5112, 13655: 0x5B7A, 13656: 0x5982, 13657: 0x8FB1, 13658: 0x4E73, 13659: 0x6C5D, 13660: 0x5165, 13661: 0x8925, 13662: 0x8F6F, 13663: 0x962E, 13664: 0x854A, 13665: 0x745E, 13666: 0x9510, 13667: 0x95F0, 13668: 0x6DA6, 13669: 0x82E5, 13670: 0x5F31, 13671: 0x6492, 13672: 0x6D12, 13673: 0x8428, 13674: 0x816E, 13675: 0x9CC3, 13676: 0x585E, 13677: 0x8D5B, 13678: 0x4E09, 13679: 0x53C1, 13680: 0x847D, 13681: 0x847E, 13682: 0x847F, 13683: 0x8480, 13684: 0x8481, 13685: 0x8483, 13686: 0x8484, 13687: 0x8485, 13688: 0x8486, 13689: 0x848A, 13690: 0x848D, 13691: 0x848F, 13692: 0x8490, 13693: 0x8491, 13694: 0x8492, 13695: 0x8493, 13696: 0x8494, 13697: 0x8495, 13698: 0x8496, 13699: 0x8498, 13700: 0x849A, 13701: 0x849B, 13702: 0x849D, 13703: 0x849E, 13704: 0x849F, 13705: 0x84A0, 13706: 0x84A2, 13707: 0x84A3, 13708: 0x84A4, 13709: 0x84A5, 13710: 0x84A6, 13711: 0x84A7, 13712: 0x84A8, 13713: 0x84A9, 13714: 0x84AA, 13715: 0x84AB, 13716: 0x84AC, 13717: 0x84AD, 13718: 0x84AE, 13719: 0x84B0, 13720: 0x84B1, 13721: 0x84B3, 13722: 0x84B5, 13723: 0x84B6, 13724: 0x84B7, 13725: 0x84BB, 13726: 0x84BC, 13727: 0x84BE, 13728: 0x84C0, 13729: 0x84C2, 13730: 0x84C3, 13731: 0x84C5, 13732: 0x84C6, 13733: 0x84C7, 13734: 0x84C8, 13735: 0x84CB, 13736: 0x84CC, 13737: 0x84CE, 13738: 0x84CF, 13739: 0x84D2, 13740: 0x84D4, 13741: 0x84D5, 13742: 0x84D7, 13743: 0x84D8, 13744: 0x84D9, 13745: 0x84DA, 13746: 0x84DB, 13747: 0x84DC, 13748: 0x84DE, 13749: 0x84E1, 13750: 0x84E2, 13751: 0x84E4, 13752: 0x84E7, 13753: 0x84E8, 13754: 0x84E9, 13755: 0x84EA, 13756: 0x84EB, 13757: 0x84ED, 13758: 0x84EE, 13759: 0x84EF, 13760: 0x84F1, 13761: 0x84F2, 13762: 0x84F3, 13763: 0x84F4, 13764: 0x84F5, 13765: 0x84F6, 13766: 0x84F7, 13767: 0x84F8, 13768: 0x84F9, 13769: 0x84FA, 13770: 0x84FB, 13771: 0x84FD, 13772: 0x84FE, 13773: 0x8500, 13774: 0x8501, 13775: 0x8502, 13776: 0x4F1E, 13777: 0x6563, 13778: 0x6851, 13779: 0x55D3, 13780: 0x4E27, 13781: 0x6414, 13782: 0x9A9A, 13783: 0x626B, 13784: 0x5AC2, 13785: 0x745F, 13786: 0x8272, 13787: 0x6DA9, 13788: 0x68EE, 13789: 0x50E7, 13790: 0x838E, 13791: 0x7802, 13792: 0x6740, 13793: 0x5239, 13794: 0x6C99, 13795: 0x7EB1, 13796: 0x50BB, 13797: 0x5565, 13798: 0x715E, 13799: 0x7B5B, 13800: 0x6652, 13801: 0x73CA, 13802: 0x82EB, 13803: 0x6749, 13804: 0x5C71, 13805: 0x5220, 13806: 0x717D, 13807: 0x886B, 13808: 0x95EA, 13809: 0x9655, 13810: 0x64C5, 13811: 0x8D61, 13812: 0x81B3, 13813: 0x5584, 13814: 0x6C55, 13815: 0x6247, 13816: 0x7F2E, 13817: 0x5892, 13818: 0x4F24, 13819: 0x5546, 13820: 0x8D4F, 13821: 0x664C, 13822: 0x4E0A, 13823: 0x5C1A, 13824: 0x88F3, 13825: 0x68A2, 13826: 0x634E, 13827: 0x7A0D, 13828: 0x70E7, 13829: 0x828D, 13830: 0x52FA, 13831: 0x97F6, 13832: 0x5C11, 13833: 0x54E8, 13834: 0x90B5, 13835: 0x7ECD, 13836: 0x5962, 13837: 0x8D4A, 13838: 0x86C7, 13839: 0x820C, 13840: 0x820D, 13841: 0x8D66, 13842: 0x6444, 13843: 0x5C04, 13844: 0x6151, 13845: 0x6D89, 13846: 0x793E, 13847: 0x8BBE, 13848: 0x7837, 13849: 0x7533, 13850: 0x547B, 13851: 0x4F38, 13852: 0x8EAB, 13853: 0x6DF1, 13854: 0x5A20, 13855: 0x7EC5, 13856: 0x795E, 13857: 0x6C88, 13858: 0x5BA1, 13859: 0x5A76, 13860: 0x751A, 13861: 0x80BE, 13862: 0x614E, 13863: 0x6E17, 13864: 0x58F0, 13865: 0x751F, 13866: 0x7525, 13867: 0x7272, 13868: 0x5347, 13869: 0x7EF3, 13870: 0x8503, 13871: 0x8504, 13872: 0x8505, 13873: 0x8506, 13874: 0x8507, 13875: 0x8508, 13876: 0x8509, 13877: 0x850A, 13878: 0x850B, 13879: 0x850D, 13880: 0x850E, 13881: 0x850F, 13882: 0x8510, 13883: 0x8512, 13884: 0x8514, 13885: 0x8515, 13886: 0x8516, 13887: 0x8518, 13888: 0x8519, 13889: 0x851B, 13890: 0x851C, 13891: 0x851D, 13892: 0x851E, 13893: 0x8520, 13894: 0x8522, 13895: 0x8523, 13896: 0x8524, 13897: 0x8525, 13898: 0x8526, 13899: 0x8527, 13900: 0x8528, 13901: 0x8529, 13902: 0x852A, 13903: 0x852D, 13904: 0x852E, 13905: 0x852F, 13906: 0x8530, 13907: 0x8531, 13908: 0x8532, 13909: 0x8533, 13910: 0x8534, 13911: 0x8535, 13912: 0x8536, 13913: 0x853E, 13914: 0x853F, 13915: 0x8540, 13916: 0x8541, 13917: 0x8542, 13918: 0x8544, 13919: 0x8545, 13920: 0x8546, 13921: 0x8547, 13922: 0x854B, 13923: 0x854C, 13924: 0x854D, 13925: 0x854E, 13926: 0x854F, 13927: 0x8550, 13928: 0x8551, 13929: 0x8552, 13930: 0x8553, 13931: 0x8554, 13932: 0x8555, 13933: 0x8557, 13934: 0x8558, 13935: 0x855A, 13936: 0x855B, 13937: 0x855C, 13938: 0x855D, 13939: 0x855F, 13940: 0x8560, 13941: 0x8561, 13942: 0x8562, 13943: 0x8563, 13944: 0x8565, 13945: 0x8566, 13946: 0x8567, 13947: 0x8569, 13948: 0x856A, 13949: 0x856B, 13950: 0x856C, 13951: 0x856D, 13952: 0x856E, 13953: 0x856F, 13954: 0x8570, 13955: 0x8571, 13956: 0x8573, 13957: 0x8575, 13958: 0x8576, 13959: 0x8577, 13960: 0x8578, 13961: 0x857C, 13962: 0x857D, 13963: 0x857F, 13964: 0x8580, 13965: 0x8581, 13966: 0x7701, 13967: 0x76DB, 13968: 0x5269, 13969: 0x80DC, 13970: 0x5723, 13971: 0x5E08, 13972: 0x5931, 13973: 0x72EE, 13974: 0x65BD, 13975: 0x6E7F, 13976: 0x8BD7, 13977: 0x5C38, 13978: 0x8671, 13979: 0x5341, 13980: 0x77F3, 13981: 0x62FE, 13982: 0x65F6, 13983: 0x4EC0, 13984: 0x98DF, 13985: 0x8680, 13986: 0x5B9E, 13987: 0x8BC6, 13988: 0x53F2, 13989: 0x77E2, 13990: 0x4F7F, 13991: 0x5C4E, 13992: 0x9A76, 13993: 0x59CB, 13994: 0x5F0F, 13995: 0x793A, 13996: 0x58EB, 13997: 0x4E16, 13998: 0x67FF, 13999: 0x4E8B, 14000: 0x62ED, 14001: 0x8A93, 14002: 0x901D, 14003: 0x52BF, 14004: 0x662F, 14005: 0x55DC, 14006: 0x566C, 14007: 0x9002, 14008: 0x4ED5, 14009: 0x4F8D, 14010: 0x91CA, 14011: 0x9970, 14012: 0x6C0F, 14013: 0x5E02, 14014: 0x6043, 14015: 0x5BA4, 14016: 0x89C6, 14017: 0x8BD5, 14018: 0x6536, 14019: 0x624B, 14020: 0x9996, 14021: 0x5B88, 14022: 0x5BFF, 14023: 0x6388, 14024: 0x552E, 14025: 0x53D7, 14026: 0x7626, 14027: 0x517D, 14028: 0x852C, 14029: 0x67A2, 14030: 0x68B3, 14031: 0x6B8A, 14032: 0x6292, 14033: 0x8F93, 14034: 0x53D4, 14035: 0x8212, 14036: 0x6DD1, 14037: 0x758F, 14038: 0x4E66, 14039: 0x8D4E, 14040: 0x5B70, 14041: 0x719F, 14042: 0x85AF, 14043: 0x6691, 14044: 0x66D9, 14045: 0x7F72, 14046: 0x8700, 14047: 0x9ECD, 14048: 0x9F20, 14049: 0x5C5E, 14050: 0x672F, 14051: 0x8FF0, 14052: 0x6811, 14053: 0x675F, 14054: 0x620D, 14055: 0x7AD6, 14056: 0x5885, 14057: 0x5EB6, 14058: 0x6570, 14059: 0x6F31, 14060: 0x8582, 14061: 0x8583, 14062: 0x8586, 14063: 0x8588, 14064: 0x8589, 14065: 0x858A, 14066: 0x858B, 14067: 0x858C, 14068: 0x858D, 14069: 0x858E, 14070: 0x8590, 14071: 0x8591, 14072: 0x8592, 14073: 0x8593, 14074: 0x8594, 14075: 0x8595, 14076: 0x8596, 14077: 0x8597, 14078: 0x8598, 14079: 0x8599, 14080: 0x859A, 14081: 0x859D, 14082: 0x859E, 14083: 0x859F, 14084: 0x85A0, 14085: 0x85A1, 14086: 0x85A2, 14087: 0x85A3, 14088: 0x85A5, 14089: 0x85A6, 14090: 0x85A7, 14091: 0x85A9, 14092: 0x85AB, 14093: 0x85AC, 14094: 0x85AD, 14095: 0x85B1, 14096: 0x85B2, 14097: 0x85B3, 14098: 0x85B4, 14099: 0x85B5, 14100: 0x85B6, 14101: 0x85B8, 14102: 0x85BA, 14103: 0x85BB, 14104: 0x85BC, 14105: 0x85BD, 14106: 0x85BE, 14107: 0x85BF, 14108: 0x85C0, 14109: 0x85C2, 14110: 0x85C3, 14111: 0x85C4, 14112: 0x85C5, 14113: 0x85C6, 14114: 0x85C7, 14115: 0x85C8, 14116: 0x85CA, 14117: 0x85CB, 14118: 0x85CC, 14119: 0x85CD, 14120: 0x85CE, 14121: 0x85D1, 14122: 0x85D2, 14123: 0x85D4, 14124: 0x85D6, 14125: 0x85D7, 14126: 0x85D8, 14127: 0x85D9, 14128: 0x85DA, 14129: 0x85DB, 14130: 0x85DD, 14131: 0x85DE, 14132: 0x85DF, 14133: 0x85E0, 14134: 0x85E1, 14135: 0x85E2, 14136: 0x85E3, 14137: 0x85E5, 14138: 0x85E6, 14139: 0x85E7, 14140: 0x85E8, 14141: 0x85EA, 14142: 0x85EB, 14143: 0x85EC, 14144: 0x85ED, 14145: 0x85EE, 14146: 0x85EF, 14147: 0x85F0, 14148: 0x85F1, 14149: 0x85F2, 14150: 0x85F3, 14151: 0x85F4, 14152: 0x85F5, 14153: 0x85F6, 14154: 0x85F7, 14155: 0x85F8, 14156: 0x6055, 14157: 0x5237, 14158: 0x800D, 14159: 0x6454, 14160: 0x8870, 14161: 0x7529, 14162: 0x5E05, 14163: 0x6813, 14164: 0x62F4, 14165: 0x971C, 14166: 0x53CC, 14167: 0x723D, 14168: 0x8C01, 14169: 0x6C34, 14170: 0x7761, 14171: 0x7A0E, 14172: 0x542E, 14173: 0x77AC, 14174: 0x987A, 14175: 0x821C, 14176: 0x8BF4, 14177: 0x7855, 14178: 0x6714, 14179: 0x70C1, 14180: 0x65AF, 14181: 0x6495, 14182: 0x5636, 14183: 0x601D, 14184: 0x79C1, 14185: 0x53F8, 14186: 0x4E1D, 14187: 0x6B7B, 14188: 0x8086, 14189: 0x5BFA, 14190: 0x55E3, 14191: 0x56DB, 14192: 0x4F3A, 14193: 0x4F3C, 14194: 0x9972, 14195: 0x5DF3, 14196: 0x677E, 14197: 0x8038, 14198: 0x6002, 14199: 0x9882, 14200: 0x9001, 14201: 0x5B8B, 14202: 0x8BBC, 14203: 0x8BF5, 14204: 0x641C, 14205: 0x8258, 14206: 0x64DE, 14207: 0x55FD, 14208: 0x82CF, 14209: 0x9165, 14210: 0x4FD7, 14211: 0x7D20, 14212: 0x901F, 14213: 0x7C9F, 14214: 0x50F3, 14215: 0x5851, 14216: 0x6EAF, 14217: 0x5BBF, 14218: 0x8BC9, 14219: 0x8083, 14220: 0x9178, 14221: 0x849C, 14222: 0x7B97, 14223: 0x867D, 14224: 0x968B, 14225: 0x968F, 14226: 0x7EE5, 14227: 0x9AD3, 14228: 0x788E, 14229: 0x5C81, 14230: 0x7A57, 14231: 0x9042, 14232: 0x96A7, 14233: 0x795F, 14234: 0x5B59, 14235: 0x635F, 14236: 0x7B0B, 14237: 0x84D1, 14238: 0x68AD, 14239: 0x5506, 14240: 0x7F29, 14241: 0x7410, 14242: 0x7D22, 14243: 0x9501, 14244: 0x6240, 14245: 0x584C, 14246: 0x4ED6, 14247: 0x5B83, 14248: 0x5979, 14249: 0x5854, 14250: 0x85F9, 14251: 0x85FA, 14252: 0x85FC, 14253: 0x85FD, 14254: 0x85FE, 14255: 0x8600, 14256: 0x8601, 14257: 0x8602, 14258: 0x8603, 14259: 0x8604, 14260: 0x8606, 14261: 0x8607, 14262: 0x8608, 14263: 0x8609, 14264: 0x860A, 14265: 0x860B, 14266: 0x860C, 14267: 0x860D, 14268: 0x860E, 14269: 0x860F, 14270: 0x8610, 14271: 0x8612, 14272: 0x8613, 14273: 0x8614, 14274: 0x8615, 14275: 0x8617, 14276: 0x8618, 14277: 0x8619, 14278: 0x861A, 14279: 0x861B, 14280: 0x861C, 14281: 0x861D, 14282: 0x861E, 14283: 0x861F, 14284: 0x8620, 14285: 0x8621, 14286: 0x8622, 14287: 0x8623, 14288: 0x8624, 14289: 0x8625, 14290: 0x8626, 14291: 0x8628, 14292: 0x862A, 14293: 0x862B, 14294: 0x862C, 14295: 0x862D, 14296: 0x862E, 14297: 0x862F, 14298: 0x8630, 14299: 0x8631, 14300: 0x8632, 14301: 0x8633, 14302: 0x8634, 14303: 0x8635, 14304: 0x8636, 14305: 0x8637, 14306: 0x8639, 14307: 0x863A, 14308: 0x863B, 14309: 0x863D, 14310: 0x863E, 14311: 0x863F, 14312: 0x8640, 14313: 0x8641, 14314: 0x8642, 14315: 0x8643, 14316: 0x8644, 14317: 0x8645, 14318: 0x8646, 14319: 0x8647, 14320: 0x8648, 14321: 0x8649, 14322: 0x864A, 14323: 0x864B, 14324: 0x864C, 14325: 0x8652, 14326: 0x8653, 14327: 0x8655, 14328: 0x8656, 14329: 0x8657, 14330: 0x8658, 14331: 0x8659, 14332: 0x865B, 14333: 0x865C, 14334: 0x865D, 14335: 0x865F, 14336: 0x8660, 14337: 0x8661, 14338: 0x8663, 14339: 0x8664, 14340: 0x8665, 14341: 0x8666, 14342: 0x8667, 14343: 0x8668, 14344: 0x8669, 14345: 0x866A, 14346: 0x736D, 14347: 0x631E, 14348: 0x8E4B, 14349: 0x8E0F, 14350: 0x80CE, 14351: 0x82D4, 14352: 0x62AC, 14353: 0x53F0, 14354: 0x6CF0, 14355: 0x915E, 14356: 0x592A, 14357: 0x6001, 14358: 0x6C70, 14359: 0x574D, 14360: 0x644A, 14361: 0x8D2A, 14362: 0x762B, 14363: 0x6EE9, 14364: 0x575B, 14365: 0x6A80, 14366: 0x75F0, 14367: 0x6F6D, 14368: 0x8C2D, 14369: 0x8C08, 14370: 0x5766, 14371: 0x6BEF, 14372: 0x8892, 14373: 0x78B3, 14374: 0x63A2, 14375: 0x53F9, 14376: 0x70AD, 14377: 0x6C64, 14378: 0x5858, 14379: 0x642A, 14380: 0x5802, 14381: 0x68E0, 14382: 0x819B, 14383: 0x5510, 14384: 0x7CD6, 14385: 0x5018, 14386: 0x8EBA, 14387: 0x6DCC, 14388: 0x8D9F, 14389: 0x70EB, 14390: 0x638F, 14391: 0x6D9B, 14392: 0x6ED4, 14393: 0x7EE6, 14394: 0x8404, 14395: 0x6843, 14396: 0x9003, 14397: 0x6DD8, 14398: 0x9676, 14399: 0x8BA8, 14400: 0x5957, 14401: 0x7279, 14402: 0x85E4, 14403: 0x817E, 14404: 0x75BC, 14405: 0x8A8A, 14406: 0x68AF, 14407: 0x5254, 14408: 0x8E22, 14409: 0x9511, 14410: 0x63D0, 14411: 0x9898, 14412: 0x8E44, 14413: 0x557C, 14414: 0x4F53, 14415: 0x66FF, 14416: 0x568F, 14417: 0x60D5, 14418: 0x6D95, 14419: 0x5243, 14420: 0x5C49, 14421: 0x5929, 14422: 0x6DFB, 14423: 0x586B, 14424: 0x7530, 14425: 0x751C, 14426: 0x606C, 14427: 0x8214, 14428: 0x8146, 14429: 0x6311, 14430: 0x6761, 14431: 0x8FE2, 14432: 0x773A, 14433: 0x8DF3, 14434: 0x8D34, 14435: 0x94C1, 14436: 0x5E16, 14437: 0x5385, 14438: 0x542C, 14439: 0x70C3, 14440: 0x866D, 14441: 0x866F, 14442: 0x8670, 14443: 0x8672, 14444: 0x8673, 14445: 0x8674, 14446: 0x8675, 14447: 0x8676, 14448: 0x8677, 14449: 0x8678, 14450: 0x8683, 14451: 0x8684, 14452: 0x8685, 14453: 0x8686, 14454: 0x8687, 14455: 0x8688, 14456: 0x8689, 14457: 0x868E, 14458: 0x868F, 14459: 0x8690, 14460: 0x8691, 14461: 0x8692, 14462: 0x8694, 14463: 0x8696, 14464: 0x8697, 14465: 0x8698, 14466: 0x8699, 14467: 0x869A, 14468: 0x869B, 14469: 0x869E, 14470: 0x869F, 14471: 0x86A0, 14472: 0x86A1, 14473: 0x86A2, 14474: 0x86A5, 14475: 0x86A6, 14476: 0x86AB, 14477: 0x86AD, 14478: 0x86AE, 14479: 0x86B2, 14480: 0x86B3, 14481: 0x86B7, 14482: 0x86B8, 14483: 0x86B9, 14484: 0x86BB, 14485: 0x86BC, 14486: 0x86BD, 14487: 0x86BE, 14488: 0x86BF, 14489: 0x86C1, 14490: 0x86C2, 14491: 0x86C3, 14492: 0x86C5, 14493: 0x86C8, 14494: 0x86CC, 14495: 0x86CD, 14496: 0x86D2, 14497: 0x86D3, 14498: 0x86D5, 14499: 0x86D6, 14500: 0x86D7, 14501: 0x86DA, 14502: 0x86DC, 14503: 0x86DD, 14504: 0x86E0, 14505: 0x86E1, 14506: 0x86E2, 14507: 0x86E3, 14508: 0x86E5, 14509: 0x86E6, 14510: 0x86E7, 14511: 0x86E8, 14512: 0x86EA, 14513: 0x86EB, 14514: 0x86EC, 14515: 0x86EF, 14516: 0x86F5, 14517: 0x86F6, 14518: 0x86F7, 14519: 0x86FA, 14520: 0x86FB, 14521: 0x86FC, 14522: 0x86FD, 14523: 0x86FF, 14524: 0x8701, 14525: 0x8704, 14526: 0x8705, 14527: 0x8706, 14528: 0x870B, 14529: 0x870C, 14530: 0x870E, 14531: 0x870F, 14532: 0x8710, 14533: 0x8711, 14534: 0x8714, 14535: 0x8716, 14536: 0x6C40, 14537: 0x5EF7, 14538: 0x505C, 14539: 0x4EAD, 14540: 0x5EAD, 14541: 0x633A, 14542: 0x8247, 14543: 0x901A, 14544: 0x6850, 14545: 0x916E, 14546: 0x77B3, 14547: 0x540C, 14548: 0x94DC, 14549: 0x5F64, 14550: 0x7AE5, 14551: 0x6876, 14552: 0x6345, 14553: 0x7B52, 14554: 0x7EDF, 14555: 0x75DB, 14556: 0x5077, 14557: 0x6295, 14558: 0x5934, 14559: 0x900F, 14560: 0x51F8, 14561: 0x79C3, 14562: 0x7A81, 14563: 0x56FE, 14564: 0x5F92, 14565: 0x9014, 14566: 0x6D82, 14567: 0x5C60, 14568: 0x571F, 14569: 0x5410, 14570: 0x5154, 14571: 0x6E4D, 14572: 0x56E2, 14573: 0x63A8, 14574: 0x9893, 14575: 0x817F, 14576: 0x8715, 14577: 0x892A, 14578: 0x9000, 14579: 0x541E, 14580: 0x5C6F, 14581: 0x81C0, 14582: 0x62D6, 14583: 0x6258, 14584: 0x8131, 14585: 0x9E35, 14586: 0x9640, 14587: 0x9A6E, 14588: 0x9A7C, 14589: 0x692D, 14590: 0x59A5, 14591: 0x62D3, 14592: 0x553E, 14593: 0x6316, 14594: 0x54C7, 14595: 0x86D9, 14596: 0x6D3C, 14597: 0x5A03, 14598: 0x74E6, 14599: 0x889C, 14600: 0x6B6A, 14601: 0x5916, 14602: 0x8C4C, 14603: 0x5F2F, 14604: 0x6E7E, 14605: 0x73A9, 14606: 0x987D, 14607: 0x4E38, 14608: 0x70F7, 14609: 0x5B8C, 14610: 0x7897, 14611: 0x633D, 14612: 0x665A, 14613: 0x7696, 14614: 0x60CB, 14615: 0x5B9B, 14616: 0x5A49, 14617: 0x4E07, 14618: 0x8155, 14619: 0x6C6A, 14620: 0x738B, 14621: 0x4EA1, 14622: 0x6789, 14623: 0x7F51, 14624: 0x5F80, 14625: 0x65FA, 14626: 0x671B, 14627: 0x5FD8, 14628: 0x5984, 14629: 0x5A01, 14630: 0x8719, 14631: 0x871B, 14632: 0x871D, 14633: 0x871F, 14634: 0x8720, 14635: 0x8724, 14636: 0x8726, 14637: 0x8727, 14638: 0x8728, 14639: 0x872A, 14640: 0x872B, 14641: 0x872C, 14642: 0x872D, 14643: 0x872F, 14644: 0x8730, 14645: 0x8732, 14646: 0x8733, 14647: 0x8735, 14648: 0x8736, 14649: 0x8738, 14650: 0x8739, 14651: 0x873A, 14652: 0x873C, 14653: 0x873D, 14654: 0x8740, 14655: 0x8741, 14656: 0x8742, 14657: 0x8743, 14658: 0x8744, 14659: 0x8745, 14660: 0x8746, 14661: 0x874A, 14662: 0x874B, 14663: 0x874D, 14664: 0x874F, 14665: 0x8750, 14666: 0x8751, 14667: 0x8752, 14668: 0x8754, 14669: 0x8755, 14670: 0x8756, 14671: 0x8758, 14672: 0x875A, 14673: 0x875B, 14674: 0x875C, 14675: 0x875D, 14676: 0x875E, 14677: 0x875F, 14678: 0x8761, 14679: 0x8762, 14680: 0x8766, 14681: 0x8767, 14682: 0x8768, 14683: 0x8769, 14684: 0x876A, 14685: 0x876B, 14686: 0x876C, 14687: 0x876D, 14688: 0x876F, 14689: 0x8771, 14690: 0x8772, 14691: 0x8773, 14692: 0x8775, 14693: 0x8777, 14694: 0x8778, 14695: 0x8779, 14696: 0x877A, 14697: 0x877F, 14698: 0x8780, 14699: 0x8781, 14700: 0x8784, 14701: 0x8786, 14702: 0x8787, 14703: 0x8789, 14704: 0x878A, 14705: 0x878C, 14706: 0x878E, 14707: 0x878F, 14708: 0x8790, 14709: 0x8791, 14710: 0x8792, 14711: 0x8794, 14712: 0x8795, 14713: 0x8796, 14714: 0x8798, 14715: 0x8799, 14716: 0x879A, 14717: 0x879B, 14718: 0x879C, 14719: 0x879D, 14720: 0x879E, 14721: 0x87A0, 14722: 0x87A1, 14723: 0x87A2, 14724: 0x87A3, 14725: 0x87A4, 14726: 0x5DCD, 14727: 0x5FAE, 14728: 0x5371, 14729: 0x97E6, 14730: 0x8FDD, 14731: 0x6845, 14732: 0x56F4, 14733: 0x552F, 14734: 0x60DF, 14735: 0x4E3A, 14736: 0x6F4D, 14737: 0x7EF4, 14738: 0x82C7, 14739: 0x840E, 14740: 0x59D4, 14741: 0x4F1F, 14742: 0x4F2A, 14743: 0x5C3E, 14744: 0x7EAC, 14745: 0x672A, 14746: 0x851A, 14747: 0x5473, 14748: 0x754F, 14749: 0x80C3, 14750: 0x5582, 14751: 0x9B4F, 14752: 0x4F4D, 14753: 0x6E2D, 14754: 0x8C13, 14755: 0x5C09, 14756: 0x6170, 14757: 0x536B, 14758: 0x761F, 14759: 0x6E29, 14760: 0x868A, 14761: 0x6587, 14762: 0x95FB, 14763: 0x7EB9, 14764: 0x543B, 14765: 0x7A33, 14766: 0x7D0A, 14767: 0x95EE, 14768: 0x55E1, 14769: 0x7FC1, 14770: 0x74EE, 14771: 0x631D, 14772: 0x8717, 14773: 0x6DA1, 14774: 0x7A9D, 14775: 0x6211, 14776: 0x65A1, 14777: 0x5367, 14778: 0x63E1, 14779: 0x6C83, 14780: 0x5DEB, 14781: 0x545C, 14782: 0x94A8, 14783: 0x4E4C, 14784: 0x6C61, 14785: 0x8BEC, 14786: 0x5C4B, 14787: 0x65E0, 14788: 0x829C, 14789: 0x68A7, 14790: 0x543E, 14791: 0x5434, 14792: 0x6BCB, 14793: 0x6B66, 14794: 0x4E94, 14795: 0x6342, 14796: 0x5348, 14797: 0x821E, 14798: 0x4F0D, 14799: 0x4FAE, 14800: 0x575E, 14801: 0x620A, 14802: 0x96FE, 14803: 0x6664, 14804: 0x7269, 14805: 0x52FF, 14806: 0x52A1, 14807: 0x609F, 14808: 0x8BEF, 14809: 0x6614, 14810: 0x7199, 14811: 0x6790, 14812: 0x897F, 14813: 0x7852, 14814: 0x77FD, 14815: 0x6670, 14816: 0x563B, 14817: 0x5438, 14818: 0x9521, 14819: 0x727A, 14820: 0x87A5, 14821: 0x87A6, 14822: 0x87A7, 14823: 0x87A9, 14824: 0x87AA, 14825: 0x87AE, 14826: 0x87B0, 14827: 0x87B1, 14828: 0x87B2, 14829: 0x87B4, 14830: 0x87B6, 14831: 0x87B7, 14832: 0x87B8, 14833: 0x87B9, 14834: 0x87BB, 14835: 0x87BC, 14836: 0x87BE, 14837: 0x87BF, 14838: 0x87C1, 14839: 0x87C2, 14840: 0x87C3, 14841: 0x87C4, 14842: 0x87C5, 14843: 0x87C7, 14844: 0x87C8, 14845: 0x87C9, 14846: 0x87CC, 14847: 0x87CD, 14848: 0x87CE, 14849: 0x87CF, 14850: 0x87D0, 14851: 0x87D4, 14852: 0x87D5, 14853: 0x87D6, 14854: 0x87D7, 14855: 0x87D8, 14856: 0x87D9, 14857: 0x87DA, 14858: 0x87DC, 14859: 0x87DD, 14860: 0x87DE, 14861: 0x87DF, 14862: 0x87E1, 14863: 0x87E2, 14864: 0x87E3, 14865: 0x87E4, 14866: 0x87E6, 14867: 0x87E7, 14868: 0x87E8, 14869: 0x87E9, 14870: 0x87EB, 14871: 0x87EC, 14872: 0x87ED, 14873: 0x87EF, 14874: 0x87F0, 14875: 0x87F1, 14876: 0x87F2, 14877: 0x87F3, 14878: 0x87F4, 14879: 0x87F5, 14880: 0x87F6, 14881: 0x87F7, 14882: 0x87F8, 14883: 0x87FA, 14884: 0x87FB, 14885: 0x87FC, 14886: 0x87FD, 14887: 0x87FF, 14888: 0x8800, 14889: 0x8801, 14890: 0x8802, 14891: 0x8804, 14892: 0x8805, 14893: 0x8806, 14894: 0x8807, 14895: 0x8808, 14896: 0x8809, 14897: 0x880B, 14898: 0x880C, 14899: 0x880D, 14900: 0x880E, 14901: 0x880F, 14902: 0x8810, 14903: 0x8811, 14904: 0x8812, 14905: 0x8814, 14906: 0x8817, 14907: 0x8818, 14908: 0x8819, 14909: 0x881A, 14910: 0x881C, 14911: 0x881D, 14912: 0x881E, 14913: 0x881F, 14914: 0x8820, 14915: 0x8823, 14916: 0x7A00, 14917: 0x606F, 14918: 0x5E0C, 14919: 0x6089, 14920: 0x819D, 14921: 0x5915, 14922: 0x60DC, 14923: 0x7184, 14924: 0x70EF, 14925: 0x6EAA, 14926: 0x6C50, 14927: 0x7280, 14928: 0x6A84, 14929: 0x88AD, 14930: 0x5E2D, 14931: 0x4E60, 14932: 0x5AB3, 14933: 0x559C, 14934: 0x94E3, 14935: 0x6D17, 14936: 0x7CFB, 14937: 0x9699, 14938: 0x620F, 14939: 0x7EC6, 14940: 0x778E, 14941: 0x867E, 14942: 0x5323, 14943: 0x971E, 14944: 0x8F96, 14945: 0x6687, 14946: 0x5CE1, 14947: 0x4FA0, 14948: 0x72ED, 14949: 0x4E0B, 14950: 0x53A6, 14951: 0x590F, 14952: 0x5413, 14953: 0x6380, 14954: 0x9528, 14955: 0x5148, 14956: 0x4ED9, 14957: 0x9C9C, 14958: 0x7EA4, 14959: 0x54B8, 14960: 0x8D24, 14961: 0x8854, 14962: 0x8237, 14963: 0x95F2, 14964: 0x6D8E, 14965: 0x5F26, 14966: 0x5ACC, 14967: 0x663E, 14968: 0x9669, 14969: 0x73B0, 14970: 0x732E, 14971: 0x53BF, 14972: 0x817A, 14973: 0x9985, 14974: 0x7FA1, 14975: 0x5BAA, 14976: 0x9677, 14977: 0x9650, 14978: 0x7EBF, 14979: 0x76F8, 14980: 0x53A2, 14981: 0x9576, 14982: 0x9999, 14983: 0x7BB1, 14984: 0x8944, 14985: 0x6E58, 14986: 0x4E61, 14987: 0x7FD4, 14988: 0x7965, 14989: 0x8BE6, 14990: 0x60F3, 14991: 0x54CD, 14992: 0x4EAB, 14993: 0x9879, 14994: 0x5DF7, 14995: 0x6A61, 14996: 0x50CF, 14997: 0x5411, 14998: 0x8C61, 14999: 0x8427, 15000: 0x785D, 15001: 0x9704, 15002: 0x524A, 15003: 0x54EE, 15004: 0x56A3, 15005: 0x9500, 15006: 0x6D88, 15007: 0x5BB5, 15008: 0x6DC6, 15009: 0x6653, 15010: 0x8824, 15011: 0x8825, 15012: 0x8826, 15013: 0x8827, 15014: 0x8828, 15015: 0x8829, 15016: 0x882A, 15017: 0x882B, 15018: 0x882C, 15019: 0x882D, 15020: 0x882E, 15021: 0x882F, 15022: 0x8830, 15023: 0x8831, 15024: 0x8833, 15025: 0x8834, 15026: 0x8835, 15027: 0x8836, 15028: 0x8837, 15029: 0x8838, 15030: 0x883A, 15031: 0x883B, 15032: 0x883D, 15033: 0x883E, 15034: 0x883F, 15035: 0x8841, 15036: 0x8842, 15037: 0x8843, 15038: 0x8846, 15039: 0x8847, 15040: 0x8848, 15041: 0x8849, 15042: 0x884A, 15043: 0x884B, 15044: 0x884E, 15045: 0x884F, 15046: 0x8850, 15047: 0x8851, 15048: 0x8852, 15049: 0x8853, 15050: 0x8855, 15051: 0x8856, 15052: 0x8858, 15053: 0x885A, 15054: 0x885B, 15055: 0x885C, 15056: 0x885D, 15057: 0x885E, 15058: 0x885F, 15059: 0x8860, 15060: 0x8866, 15061: 0x8867, 15062: 0x886A, 15063: 0x886D, 15064: 0x886F, 15065: 0x8871, 15066: 0x8873, 15067: 0x8874, 15068: 0x8875, 15069: 0x8876, 15070: 0x8878, 15071: 0x8879, 15072: 0x887A, 15073: 0x887B, 15074: 0x887C, 15075: 0x8880, 15076: 0x8883, 15077: 0x8886, 15078: 0x8887, 15079: 0x8889, 15080: 0x888A, 15081: 0x888C, 15082: 0x888E, 15083: 0x888F, 15084: 0x8890, 15085: 0x8891, 15086: 0x8893, 15087: 0x8894, 15088: 0x8895, 15089: 0x8897, 15090: 0x8898, 15091: 0x8899, 15092: 0x889A, 15093: 0x889B, 15094: 0x889D, 15095: 0x889E, 15096: 0x889F, 15097: 0x88A0, 15098: 0x88A1, 15099: 0x88A3, 15100: 0x88A5, 15101: 0x88A6, 15102: 0x88A7, 15103: 0x88A8, 15104: 0x88A9, 15105: 0x88AA, 15106: 0x5C0F, 15107: 0x5B5D, 15108: 0x6821, 15109: 0x8096, 15110: 0x5578, 15111: 0x7B11, 15112: 0x6548, 15113: 0x6954, 15114: 0x4E9B, 15115: 0x6B47, 15116: 0x874E, 15117: 0x978B, 15118: 0x534F, 15119: 0x631F, 15120: 0x643A, 15121: 0x90AA, 15122: 0x659C, 15123: 0x80C1, 15124: 0x8C10, 15125: 0x5199, 15126: 0x68B0, 15127: 0x5378, 15128: 0x87F9, 15129: 0x61C8, 15130: 0x6CC4, 15131: 0x6CFB, 15132: 0x8C22, 15133: 0x5C51, 15134: 0x85AA, 15135: 0x82AF, 15136: 0x950C, 15137: 0x6B23, 15138: 0x8F9B, 15139: 0x65B0, 15140: 0x5FFB, 15141: 0x5FC3, 15142: 0x4FE1, 15143: 0x8845, 15144: 0x661F, 15145: 0x8165, 15146: 0x7329, 15147: 0x60FA, 15148: 0x5174, 15149: 0x5211, 15150: 0x578B, 15151: 0x5F62, 15152: 0x90A2, 15153: 0x884C, 15154: 0x9192, 15155: 0x5E78, 15156: 0x674F, 15157: 0x6027, 15158: 0x59D3, 15159: 0x5144, 15160: 0x51F6, 15161: 0x80F8, 15162: 0x5308, 15163: 0x6C79, 15164: 0x96C4, 15165: 0x718A, 15166: 0x4F11, 15167: 0x4FEE, 15168: 0x7F9E, 15169: 0x673D, 15170: 0x55C5, 15171: 0x9508, 15172: 0x79C0, 15173: 0x8896, 15174: 0x7EE3, 15175: 0x589F, 15176: 0x620C, 15177: 0x9700, 15178: 0x865A, 15179: 0x5618, 15180: 0x987B, 15181: 0x5F90, 15182: 0x8BB8, 15183: 0x84C4, 15184: 0x9157, 15185: 0x53D9, 15186: 0x65ED, 15187: 0x5E8F, 15188: 0x755C, 15189: 0x6064, 15190: 0x7D6E, 15191: 0x5A7F, 15192: 0x7EEA, 15193: 0x7EED, 15194: 0x8F69, 15195: 0x55A7, 15196: 0x5BA3, 15197: 0x60AC, 15198: 0x65CB, 15199: 0x7384, 15200: 0x88AC, 15201: 0x88AE, 15202: 0x88AF, 15203: 0x88B0, 15204: 0x88B2, 15205: 0x88B3, 15206: 0x88B4, 15207: 0x88B5, 15208: 0x88B6, 15209: 0x88B8, 15210: 0x88B9, 15211: 0x88BA, 15212: 0x88BB, 15213: 0x88BD, 15214: 0x88BE, 15215: 0x88BF, 15216: 0x88C0, 15217: 0x88C3, 15218: 0x88C4, 15219: 0x88C7, 15220: 0x88C8, 15221: 0x88CA, 15222: 0x88CB, 15223: 0x88CC, 15224: 0x88CD, 15225: 0x88CF, 15226: 0x88D0, 15227: 0x88D1, 15228: 0x88D3, 15229: 0x88D6, 15230: 0x88D7, 15231: 0x88DA, 15232: 0x88DB, 15233: 0x88DC, 15234: 0x88DD, 15235: 0x88DE, 15236: 0x88E0, 15237: 0x88E1, 15238: 0x88E6, 15239: 0x88E7, 15240: 0x88E9, 15241: 0x88EA, 15242: 0x88EB, 15243: 0x88EC, 15244: 0x88ED, 15245: 0x88EE, 15246: 0x88EF, 15247: 0x88F2, 15248: 0x88F5, 15249: 0x88F6, 15250: 0x88F7, 15251: 0x88FA, 15252: 0x88FB, 15253: 0x88FD, 15254: 0x88FF, 15255: 0x8900, 15256: 0x8901, 15257: 0x8903, 15258: 0x8904, 15259: 0x8905, 15260: 0x8906, 15261: 0x8907, 15262: 0x8908, 15263: 0x8909, 15264: 0x890B, 15265: 0x890C, 15266: 0x890D, 15267: 0x890E, 15268: 0x890F, 15269: 0x8911, 15270: 0x8914, 15271: 0x8915, 15272: 0x8916, 15273: 0x8917, 15274: 0x8918, 15275: 0x891C, 15276: 0x891D, 15277: 0x891E, 15278: 0x891F, 15279: 0x8920, 15280: 0x8922, 15281: 0x8923, 15282: 0x8924, 15283: 0x8926, 15284: 0x8927, 15285: 0x8928, 15286: 0x8929, 15287: 0x892C, 15288: 0x892D, 15289: 0x892E, 15290: 0x892F, 15291: 0x8931, 15292: 0x8932, 15293: 0x8933, 15294: 0x8935, 15295: 0x8937, 15296: 0x9009, 15297: 0x7663, 15298: 0x7729, 15299: 0x7EDA, 15300: 0x9774, 15301: 0x859B, 15302: 0x5B66, 15303: 0x7A74, 15304: 0x96EA, 15305: 0x8840, 15306: 0x52CB, 15307: 0x718F, 15308: 0x5FAA, 15309: 0x65EC, 15310: 0x8BE2, 15311: 0x5BFB, 15312: 0x9A6F, 15313: 0x5DE1, 15314: 0x6B89, 15315: 0x6C5B, 15316: 0x8BAD, 15317: 0x8BAF, 15318: 0x900A, 15319: 0x8FC5, 15320: 0x538B, 15321: 0x62BC, 15322: 0x9E26, 15323: 0x9E2D, 15324: 0x5440, 15325: 0x4E2B, 15326: 0x82BD, 15327: 0x7259, 15328: 0x869C, 15329: 0x5D16, 15330: 0x8859, 15331: 0x6DAF, 15332: 0x96C5, 15333: 0x54D1, 15334: 0x4E9A, 15335: 0x8BB6, 15336: 0x7109, 15337: 0x54BD, 15338: 0x9609, 15339: 0x70DF, 15340: 0x6DF9, 15341: 0x76D0, 15342: 0x4E25, 15343: 0x7814, 15344: 0x8712, 15345: 0x5CA9, 15346: 0x5EF6, 15347: 0x8A00, 15348: 0x989C, 15349: 0x960E, 15350: 0x708E, 15351: 0x6CBF, 15352: 0x5944, 15353: 0x63A9, 15354: 0x773C, 15355: 0x884D, 15356: 0x6F14, 15357: 0x8273, 15358: 0x5830, 15359: 0x71D5, 15360: 0x538C, 15361: 0x781A, 15362: 0x96C1, 15363: 0x5501, 15364: 0x5F66, 15365: 0x7130, 15366: 0x5BB4, 15367: 0x8C1A, 15368: 0x9A8C, 15369: 0x6B83, 15370: 0x592E, 15371: 0x9E2F, 15372: 0x79E7, 15373: 0x6768, 15374: 0x626C, 15375: 0x4F6F, 15376: 0x75A1, 15377: 0x7F8A, 15378: 0x6D0B, 15379: 0x9633, 15380: 0x6C27, 15381: 0x4EF0, 15382: 0x75D2, 15383: 0x517B, 15384: 0x6837, 15385: 0x6F3E, 15386: 0x9080, 15387: 0x8170, 15388: 0x5996, 15389: 0x7476, 15390: 0x8938, 15391: 0x8939, 15392: 0x893A, 15393: 0x893B, 15394: 0x893C, 15395: 0x893D, 15396: 0x893E, 15397: 0x893F, 15398: 0x8940, 15399: 0x8942, 15400: 0x8943, 15401: 0x8945, 15402: 0x8946, 15403: 0x8947, 15404: 0x8948, 15405: 0x8949, 15406: 0x894A, 15407: 0x894B, 15408: 0x894C, 15409: 0x894D, 15410: 0x894E, 15411: 0x894F, 15412: 0x8950, 15413: 0x8951, 15414: 0x8952, 15415: 0x8953, 15416: 0x8954, 15417: 0x8955, 15418: 0x8956, 15419: 0x8957, 15420: 0x8958, 15421: 0x8959, 15422: 0x895A, 15423: 0x895B, 15424: 0x895C, 15425: 0x895D, 15426: 0x8960, 15427: 0x8961, 15428: 0x8962, 15429: 0x8963, 15430: 0x8964, 15431: 0x8965, 15432: 0x8967, 15433: 0x8968, 15434: 0x8969, 15435: 0x896A, 15436: 0x896B, 15437: 0x896C, 15438: 0x896D, 15439: 0x896E, 15440: 0x896F, 15441: 0x8970, 15442: 0x8971, 15443: 0x8972, 15444: 0x8973, 15445: 0x8974, 15446: 0x8975, 15447: 0x8976, 15448: 0x8977, 15449: 0x8978, 15450: 0x8979, 15451: 0x897A, 15452: 0x897C, 15453: 0x897D, 15454: 0x897E, 15455: 0x8980, 15456: 0x8982, 15457: 0x8984, 15458: 0x8985, 15459: 0x8987, 15460: 0x8988, 15461: 0x8989, 15462: 0x898A, 15463: 0x898B, 15464: 0x898C, 15465: 0x898D, 15466: 0x898E, 15467: 0x898F, 15468: 0x8990, 15469: 0x8991, 15470: 0x8992, 15471: 0x8993, 15472: 0x8994, 15473: 0x8995, 15474: 0x8996, 15475: 0x8997, 15476: 0x8998, 15477: 0x8999, 15478: 0x899A, 15479: 0x899B, 15480: 0x899C, 15481: 0x899D, 15482: 0x899E, 15483: 0x899F, 15484: 0x89A0, 15485: 0x89A1, 15486: 0x6447, 15487: 0x5C27, 15488: 0x9065, 15489: 0x7A91, 15490: 0x8C23, 15491: 0x59DA, 15492: 0x54AC, 15493: 0x8200, 15494: 0x836F, 15495: 0x8981, 15496: 0x8000, 15497: 0x6930, 15498: 0x564E, 15499: 0x8036, 15500: 0x7237, 15501: 0x91CE, 15502: 0x51B6, 15503: 0x4E5F, 15504: 0x9875, 15505: 0x6396, 15506: 0x4E1A, 15507: 0x53F6, 15508: 0x66F3, 15509: 0x814B, 15510: 0x591C, 15511: 0x6DB2, 15512: 0x4E00, 15513: 0x58F9, 15514: 0x533B, 15515: 0x63D6, 15516: 0x94F1, 15517: 0x4F9D, 15518: 0x4F0A, 15519: 0x8863, 15520: 0x9890, 15521: 0x5937, 15522: 0x9057, 15523: 0x79FB, 15524: 0x4EEA, 15525: 0x80F0, 15526: 0x7591, 15527: 0x6C82, 15528: 0x5B9C, 15529: 0x59E8, 15530: 0x5F5D, 15531: 0x6905, 15532: 0x8681, 15533: 0x501A, 15534: 0x5DF2, 15535: 0x4E59, 15536: 0x77E3, 15537: 0x4EE5, 15538: 0x827A, 15539: 0x6291, 15540: 0x6613, 15541: 0x9091, 15542: 0x5C79, 15543: 0x4EBF, 15544: 0x5F79, 15545: 0x81C6, 15546: 0x9038, 15547: 0x8084, 15548: 0x75AB, 15549: 0x4EA6, 15550: 0x88D4, 15551: 0x610F, 15552: 0x6BC5, 15553: 0x5FC6, 15554: 0x4E49, 15555: 0x76CA, 15556: 0x6EA2, 15557: 0x8BE3, 15558: 0x8BAE, 15559: 0x8C0A, 15560: 0x8BD1, 15561: 0x5F02, 15562: 0x7FFC, 15563: 0x7FCC, 15564: 0x7ECE, 15565: 0x8335, 15566: 0x836B, 15567: 0x56E0, 15568: 0x6BB7, 15569: 0x97F3, 15570: 0x9634, 15571: 0x59FB, 15572: 0x541F, 15573: 0x94F6, 15574: 0x6DEB, 15575: 0x5BC5, 15576: 0x996E, 15577: 0x5C39, 15578: 0x5F15, 15579: 0x9690, 15580: 0x89A2, 15581: 0x89A3, 15582: 0x89A4, 15583: 0x89A5, 15584: 0x89A6, 15585: 0x89A7, 15586: 0x89A8, 15587: 0x89A9, 15588: 0x89AA, 15589: 0x89AB, 15590: 0x89AC, 15591: 0x89AD, 15592: 0x89AE, 15593: 0x89AF, 15594: 0x89B0, 15595: 0x89B1, 15596: 0x89B2, 15597: 0x89B3, 15598: 0x89B4, 15599: 0x89B5, 15600: 0x89B6, 15601: 0x89B7, 15602: 0x89B8, 15603: 0x89B9, 15604: 0x89BA, 15605: 0x89BB, 15606: 0x89BC, 15607: 0x89BD, 15608: 0x89BE, 15609: 0x89BF, 15610: 0x89C0, 15611: 0x89C3, 15612: 0x89CD, 15613: 0x89D3, 15614: 0x89D4, 15615: 0x89D5, 15616: 0x89D7, 15617: 0x89D8, 15618: 0x89D9, 15619: 0x89DB, 15620: 0x89DD, 15621: 0x89DF, 15622: 0x89E0, 15623: 0x89E1, 15624: 0x89E2, 15625: 0x89E4, 15626: 0x89E7, 15627: 0x89E8, 15628: 0x89E9, 15629: 0x89EA, 15630: 0x89EC, 15631: 0x89ED, 15632: 0x89EE, 15633: 0x89F0, 15634: 0x89F1, 15635: 0x89F2, 15636: 0x89F4, 15637: 0x89F5, 15638: 0x89F6, 15639: 0x89F7, 15640: 0x89F8, 15641: 0x89F9, 15642: 0x89FA, 15643: 0x89FB, 15644: 0x89FC, 15645: 0x89FD, 15646: 0x89FE, 15647: 0x89FF, 15648: 0x8A01, 15649: 0x8A02, 15650: 0x8A03, 15651: 0x8A04, 15652: 0x8A05, 15653: 0x8A06, 15654: 0x8A08, 15655: 0x8A09, 15656: 0x8A0A, 15657: 0x8A0B, 15658: 0x8A0C, 15659: 0x8A0D, 15660: 0x8A0E, 15661: 0x8A0F, 15662: 0x8A10, 15663: 0x8A11, 15664: 0x8A12, 15665: 0x8A13, 15666: 0x8A14, 15667: 0x8A15, 15668: 0x8A16, 15669: 0x8A17, 15670: 0x8A18, 15671: 0x8A19, 15672: 0x8A1A, 15673: 0x8A1B, 15674: 0x8A1C, 15675: 0x8A1D, 15676: 0x5370, 15677: 0x82F1, 15678: 0x6A31, 15679: 0x5A74, 15680: 0x9E70, 15681: 0x5E94, 15682: 0x7F28, 15683: 0x83B9, 15684: 0x8424, 15685: 0x8425, 15686: 0x8367, 15687: 0x8747, 15688: 0x8FCE, 15689: 0x8D62, 15690: 0x76C8, 15691: 0x5F71, 15692: 0x9896, 15693: 0x786C, 15694: 0x6620, 15695: 0x54DF, 15696: 0x62E5, 15697: 0x4F63, 15698: 0x81C3, 15699: 0x75C8, 15700: 0x5EB8, 15701: 0x96CD, 15702: 0x8E0A, 15703: 0x86F9, 15704: 0x548F, 15705: 0x6CF3, 15706: 0x6D8C, 15707: 0x6C38, 15708: 0x607F, 15709: 0x52C7, 15710: 0x7528, 15711: 0x5E7D, 15712: 0x4F18, 15713: 0x60A0, 15714: 0x5FE7, 15715: 0x5C24, 15716: 0x7531, 15717: 0x90AE, 15718: 0x94C0, 15719: 0x72B9, 15720: 0x6CB9, 15721: 0x6E38, 15722: 0x9149, 15723: 0x6709, 15724: 0x53CB, 15725: 0x53F3, 15726: 0x4F51, 15727: 0x91C9, 15728: 0x8BF1, 15729: 0x53C8, 15730: 0x5E7C, 15731: 0x8FC2, 15732: 0x6DE4, 15733: 0x4E8E, 15734: 0x76C2, 15735: 0x6986, 15736: 0x865E, 15737: 0x611A, 15738: 0x8206, 15739: 0x4F59, 15740: 0x4FDE, 15741: 0x903E, 15742: 0x9C7C, 15743: 0x6109, 15744: 0x6E1D, 15745: 0x6E14, 15746: 0x9685, 15747: 0x4E88, 15748: 0x5A31, 15749: 0x96E8, 15750: 0x4E0E, 15751: 0x5C7F, 15752: 0x79B9, 15753: 0x5B87, 15754: 0x8BED, 15755: 0x7FBD, 15756: 0x7389, 15757: 0x57DF, 15758: 0x828B, 15759: 0x90C1, 15760: 0x5401, 15761: 0x9047, 15762: 0x55BB, 15763: 0x5CEA, 15764: 0x5FA1, 15765: 0x6108, 15766: 0x6B32, 15767: 0x72F1, 15768: 0x80B2, 15769: 0x8A89, 15770: 0x8A1E, 15771: 0x8A1F, 15772: 0x8A20, 15773: 0x8A21, 15774: 0x8A22, 15775: 0x8A23, 15776: 0x8A24, 15777: 0x8A25, 15778: 0x8A26, 15779: 0x8A27, 15780: 0x8A28, 15781: 0x8A29, 15782: 0x8A2A, 15783: 0x8A2B, 15784: 0x8A2C, 15785: 0x8A2D, 15786: 0x8A2E, 15787: 0x8A2F, 15788: 0x8A30, 15789: 0x8A31, 15790: 0x8A32, 15791: 0x8A33, 15792: 0x8A34, 15793: 0x8A35, 15794: 0x8A36, 15795: 0x8A37, 15796: 0x8A38, 15797: 0x8A39, 15798: 0x8A3A, 15799: 0x8A3B, 15800: 0x8A3C, 15801: 0x8A3D, 15802: 0x8A3F, 15803: 0x8A40, 15804: 0x8A41, 15805: 0x8A42, 15806: 0x8A43, 15807: 0x8A44, 15808: 0x8A45, 15809: 0x8A46, 15810: 0x8A47, 15811: 0x8A49, 15812: 0x8A4A, 15813: 0x8A4B, 15814: 0x8A4C, 15815: 0x8A4D, 15816: 0x8A4E, 15817: 0x8A4F, 15818: 0x8A50, 15819: 0x8A51, 15820: 0x8A52, 15821: 0x8A53, 15822: 0x8A54, 15823: 0x8A55, 15824: 0x8A56, 15825: 0x8A57, 15826: 0x8A58, 15827: 0x8A59, 15828: 0x8A5A, 15829: 0x8A5B, 15830: 0x8A5C, 15831: 0x8A5D, 15832: 0x8A5E, 15833: 0x8A5F, 15834: 0x8A60, 15835: 0x8A61, 15836: 0x8A62, 15837: 0x8A63, 15838: 0x8A64, 15839: 0x8A65, 15840: 0x8A66, 15841: 0x8A67, 15842: 0x8A68, 15843: 0x8A69, 15844: 0x8A6A, 15845: 0x8A6B, 15846: 0x8A6C, 15847: 0x8A6D, 15848: 0x8A6E, 15849: 0x8A6F, 15850: 0x8A70, 15851: 0x8A71, 15852: 0x8A72, 15853: 0x8A73, 15854: 0x8A74, 15855: 0x8A75, 15856: 0x8A76, 15857: 0x8A77, 15858: 0x8A78, 15859: 0x8A7A, 15860: 0x8A7B, 15861: 0x8A7C, 15862: 0x8A7D, 15863: 0x8A7E, 15864: 0x8A7F, 15865: 0x8A80, 15866: 0x6D74, 15867: 0x5BD3, 15868: 0x88D5, 15869: 0x9884, 15870: 0x8C6B, 15871: 0x9A6D, 15872: 0x9E33, 15873: 0x6E0A, 15874: 0x51A4, 15875: 0x5143, 15876: 0x57A3, 15877: 0x8881, 15878: 0x539F, 15879: 0x63F4, 15880: 0x8F95, 15881: 0x56ED, 15882: 0x5458, 15883: 0x5706, 15884: 0x733F, 15885: 0x6E90, 15886: 0x7F18, 15887: 0x8FDC, 15888: 0x82D1, 15889: 0x613F, 15890: 0x6028, 15891: 0x9662, 15892: 0x66F0, 15893: 0x7EA6, 15894: 0x8D8A, 15895: 0x8DC3, 15896: 0x94A5, 15897: 0x5CB3, 15898: 0x7CA4, 15899: 0x6708, 15900: 0x60A6, 15901: 0x9605, 15902: 0x8018, 15903: 0x4E91, 15904: 0x90E7, 15905: 0x5300, 15906: 0x9668, 15907: 0x5141, 15908: 0x8FD0, 15909: 0x8574, 15910: 0x915D, 15911: 0x6655, 15912: 0x97F5, 15913: 0x5B55, 15914: 0x531D, 15915: 0x7838, 15916: 0x6742, 15917: 0x683D, 15918: 0x54C9, 15919: 0x707E, 15920: 0x5BB0, 15921: 0x8F7D, 15922: 0x518D, 15923: 0x5728, 15924: 0x54B1, 15925: 0x6512, 15926: 0x6682, 15927: 0x8D5E, 15928: 0x8D43, 15929: 0x810F, 15930: 0x846C, 15931: 0x906D, 15932: 0x7CDF, 15933: 0x51FF, 15934: 0x85FB, 15935: 0x67A3, 15936: 0x65E9, 15937: 0x6FA1, 15938: 0x86A4, 15939: 0x8E81, 15940: 0x566A, 15941: 0x9020, 15942: 0x7682, 15943: 0x7076, 15944: 0x71E5, 15945: 0x8D23, 15946: 0x62E9, 15947: 0x5219, 15948: 0x6CFD, 15949: 0x8D3C, 15950: 0x600E, 15951: 0x589E, 15952: 0x618E, 15953: 0x66FE, 15954: 0x8D60, 15955: 0x624E, 15956: 0x55B3, 15957: 0x6E23, 15958: 0x672D, 15959: 0x8F67, 15960: 0x8A81, 15961: 0x8A82, 15962: 0x8A83, 15963: 0x8A84, 15964: 0x8A85, 15965: 0x8A86, 15966: 0x8A87, 15967: 0x8A88, 15968: 0x8A8B, 15969: 0x8A8C, 15970: 0x8A8D, 15971: 0x8A8E, 15972: 0x8A8F, 15973: 0x8A90, 15974: 0x8A91, 15975: 0x8A92, 15976: 0x8A94, 15977: 0x8A95, 15978: 0x8A96, 15979: 0x8A97, 15980: 0x8A98, 15981: 0x8A99, 15982: 0x8A9A, 15983: 0x8A9B, 15984: 0x8A9C, 15985: 0x8A9D, 15986: 0x8A9E, 15987: 0x8A9F, 15988: 0x8AA0, 15989: 0x8AA1, 15990: 0x8AA2, 15991: 0x8AA3, 15992: 0x8AA4, 15993: 0x8AA5, 15994: 0x8AA6, 15995: 0x8AA7, 15996: 0x8AA8, 15997: 0x8AA9, 15998: 0x8AAA, 15999: 0x8AAB, 16000: 0x8AAC, 16001: 0x8AAD, 16002: 0x8AAE, 16003: 0x8AAF, 16004: 0x8AB0, 16005: 0x8AB1, 16006: 0x8AB2, 16007: 0x8AB3, 16008: 0x8AB4, 16009: 0x8AB5, 16010: 0x8AB6, 16011: 0x8AB7, 16012: 0x8AB8, 16013: 0x8AB9, 16014: 0x8ABA, 16015: 0x8ABB, 16016: 0x8ABC, 16017: 0x8ABD, 16018: 0x8ABE, 16019: 0x8ABF, 16020: 0x8AC0, 16021: 0x8AC1, 16022: 0x8AC2, 16023: 0x8AC3, 16024: 0x8AC4, 16025: 0x8AC5, 16026: 0x8AC6, 16027: 0x8AC7, 16028: 0x8AC8, 16029: 0x8AC9, 16030: 0x8ACA, 16031: 0x8ACB, 16032: 0x8ACC, 16033: 0x8ACD, 16034: 0x8ACE, 16035: 0x8ACF, 16036: 0x8AD0, 16037: 0x8AD1, 16038: 0x8AD2, 16039: 0x8AD3, 16040: 0x8AD4, 16041: 0x8AD5, 16042: 0x8AD6, 16043: 0x8AD7, 16044: 0x8AD8, 16045: 0x8AD9, 16046: 0x8ADA, 16047: 0x8ADB, 16048: 0x8ADC, 16049: 0x8ADD, 16050: 0x8ADE, 16051: 0x8ADF, 16052: 0x8AE0, 16053: 0x8AE1, 16054: 0x8AE2, 16055: 0x8AE3, 16056: 0x94E1, 16057: 0x95F8, 16058: 0x7728, 16059: 0x6805, 16060: 0x69A8, 16061: 0x548B, 16062: 0x4E4D, 16063: 0x70B8, 16064: 0x8BC8, 16065: 0x6458, 16066: 0x658B, 16067: 0x5B85, 16068: 0x7A84, 16069: 0x503A, 16070: 0x5BE8, 16071: 0x77BB, 16072: 0x6BE1, 16073: 0x8A79, 16074: 0x7C98, 16075: 0x6CBE, 16076: 0x76CF, 16077: 0x65A9, 16078: 0x8F97, 16079: 0x5D2D, 16080: 0x5C55, 16081: 0x8638, 16082: 0x6808, 16083: 0x5360, 16084: 0x6218, 16085: 0x7AD9, 16086: 0x6E5B, 16087: 0x7EFD, 16088: 0x6A1F, 16089: 0x7AE0, 16090: 0x5F70, 16091: 0x6F33, 16092: 0x5F20, 16093: 0x638C, 16094: 0x6DA8, 16095: 0x6756, 16096: 0x4E08, 16097: 0x5E10, 16098: 0x8D26, 16099: 0x4ED7, 16100: 0x80C0, 16101: 0x7634, 16102: 0x969C, 16103: 0x62DB, 16104: 0x662D, 16105: 0x627E, 16106: 0x6CBC, 16107: 0x8D75, 16108: 0x7167, 16109: 0x7F69, 16110: 0x5146, 16111: 0x8087, 16112: 0x53EC, 16113: 0x906E, 16114: 0x6298, 16115: 0x54F2, 16116: 0x86F0, 16117: 0x8F99, 16118: 0x8005, 16119: 0x9517, 16120: 0x8517, 16121: 0x8FD9, 16122: 0x6D59, 16123: 0x73CD, 16124: 0x659F, 16125: 0x771F, 16126: 0x7504, 16127: 0x7827, 16128: 0x81FB, 16129: 0x8D1E, 16130: 0x9488, 16131: 0x4FA6, 16132: 0x6795, 16133: 0x75B9, 16134: 0x8BCA, 16135: 0x9707, 16136: 0x632F, 16137: 0x9547, 16138: 0x9635, 16139: 0x84B8, 16140: 0x6323, 16141: 0x7741, 16142: 0x5F81, 16143: 0x72F0, 16144: 0x4E89, 16145: 0x6014, 16146: 0x6574, 16147: 0x62EF, 16148: 0x6B63, 16149: 0x653F, 16150: 0x8AE4, 16151: 0x8AE5, 16152: 0x8AE6, 16153: 0x8AE7, 16154: 0x8AE8, 16155: 0x8AE9, 16156: 0x8AEA, 16157: 0x8AEB, 16158: 0x8AEC, 16159: 0x8AED, 16160: 0x8AEE, 16161: 0x8AEF, 16162: 0x8AF0, 16163: 0x8AF1, 16164: 0x8AF2, 16165: 0x8AF3, 16166: 0x8AF4, 16167: 0x8AF5, 16168: 0x8AF6, 16169: 0x8AF7, 16170: 0x8AF8, 16171: 0x8AF9, 16172: 0x8AFA, 16173: 0x8AFB, 16174: 0x8AFC, 16175: 0x8AFD, 16176: 0x8AFE, 16177: 0x8AFF, 16178: 0x8B00, 16179: 0x8B01, 16180: 0x8B02, 16181: 0x8B03, 16182: 0x8B04, 16183: 0x8B05, 16184: 0x8B06, 16185: 0x8B08, 16186: 0x8B09, 16187: 0x8B0A, 16188: 0x8B0B, 16189: 0x8B0C, 16190: 0x8B0D, 16191: 0x8B0E, 16192: 0x8B0F, 16193: 0x8B10, 16194: 0x8B11, 16195: 0x8B12, 16196: 0x8B13, 16197: 0x8B14, 16198: 0x8B15, 16199: 0x8B16, 16200: 0x8B17, 16201: 0x8B18, 16202: 0x8B19, 16203: 0x8B1A, 16204: 0x8B1B, 16205: 0x8B1C, 16206: 0x8B1D, 16207: 0x8B1E, 16208: 0x8B1F, 16209: 0x8B20, 16210: 0x8B21, 16211: 0x8B22, 16212: 0x8B23, 16213: 0x8B24, 16214: 0x8B25, 16215: 0x8B27, 16216: 0x8B28, 16217: 0x8B29, 16218: 0x8B2A, 16219: 0x8B2B, 16220: 0x8B2C, 16221: 0x8B2D, 16222: 0x8B2E, 16223: 0x8B2F, 16224: 0x8B30, 16225: 0x8B31, 16226: 0x8B32, 16227: 0x8B33, 16228: 0x8B34, 16229: 0x8B35, 16230: 0x8B36, 16231: 0x8B37, 16232: 0x8B38, 16233: 0x8B39, 16234: 0x8B3A, 16235: 0x8B3B, 16236: 0x8B3C, 16237: 0x8B3D, 16238: 0x8B3E, 16239: 0x8B3F, 16240: 0x8B40, 16241: 0x8B41, 16242: 0x8B42, 16243: 0x8B43, 16244: 0x8B44, 16245: 0x8B45, 16246: 0x5E27, 16247: 0x75C7, 16248: 0x90D1, 16249: 0x8BC1, 16250: 0x829D, 16251: 0x679D, 16252: 0x652F, 16253: 0x5431, 16254: 0x8718, 16255: 0x77E5, 16256: 0x80A2, 16257: 0x8102, 16258: 0x6C41, 16259: 0x4E4B, 16260: 0x7EC7, 16261: 0x804C, 16262: 0x76F4, 16263: 0x690D, 16264: 0x6B96, 16265: 0x6267, 16266: 0x503C, 16267: 0x4F84, 16268: 0x5740, 16269: 0x6307, 16270: 0x6B62, 16271: 0x8DBE, 16272: 0x53EA, 16273: 0x65E8, 16274: 0x7EB8, 16275: 0x5FD7, 16276: 0x631A, 16277: 0x63B7, 16278: 0x81F3, 16279: 0x81F4, 16280: 0x7F6E, 16281: 0x5E1C, 16282: 0x5CD9, 16283: 0x5236, 16284: 0x667A, 16285: 0x79E9, 16286: 0x7A1A, 16287: 0x8D28, 16288: 0x7099, 16289: 0x75D4, 16290: 0x6EDE, 16291: 0x6CBB, 16292: 0x7A92, 16293: 0x4E2D, 16294: 0x76C5, 16295: 0x5FE0, 16296: 0x949F, 16297: 0x8877, 16298: 0x7EC8, 16299: 0x79CD, 16300: 0x80BF, 16301: 0x91CD, 16302: 0x4EF2, 16303: 0x4F17, 16304: 0x821F, 16305: 0x5468, 16306: 0x5DDE, 16307: 0x6D32, 16308: 0x8BCC, 16309: 0x7CA5, 16310: 0x8F74, 16311: 0x8098, 16312: 0x5E1A, 16313: 0x5492, 16314: 0x76B1, 16315: 0x5B99, 16316: 0x663C, 16317: 0x9AA4, 16318: 0x73E0, 16319: 0x682A, 16320: 0x86DB, 16321: 0x6731, 16322: 0x732A, 16323: 0x8BF8, 16324: 0x8BDB, 16325: 0x9010, 16326: 0x7AF9, 16327: 0x70DB, 16328: 0x716E, 16329: 0x62C4, 16330: 0x77A9, 16331: 0x5631, 16332: 0x4E3B, 16333: 0x8457, 16334: 0x67F1, 16335: 0x52A9, 16336: 0x86C0, 16337: 0x8D2E, 16338: 0x94F8, 16339: 0x7B51, 16340: 0x8B46, 16341: 0x8B47, 16342: 0x8B48, 16343: 0x8B49, 16344: 0x8B4A, 16345: 0x8B4B, 16346: 0x8B4C, 16347: 0x8B4D, 16348: 0x8B4E, 16349: 0x8B4F, 16350: 0x8B50, 16351: 0x8B51, 16352: 0x8B52, 16353: 0x8B53, 16354: 0x8B54, 16355: 0x8B55, 16356: 0x8B56, 16357: 0x8B57, 16358: 0x8B58, 16359: 0x8B59, 16360: 0x8B5A, 16361: 0x8B5B, 16362: 0x8B5C, 16363: 0x8B5D, 16364: 0x8B5E, 16365: 0x8B5F, 16366: 0x8B60, 16367: 0x8B61, 16368: 0x8B62, 16369: 0x8B63, 16370: 0x8B64, 16371: 0x8B65, 16372: 0x8B67, 16373: 0x8B68, 16374: 0x8B69, 16375: 0x8B6A, 16376: 0x8B6B, 16377: 0x8B6D, 16378: 0x8B6E, 16379: 0x8B6F, 16380: 0x8B70, 16381: 0x8B71, 16382: 0x8B72, 16383: 0x8B73, 16384: 0x8B74, 16385: 0x8B75, 16386: 0x8B76, 16387: 0x8B77, 16388: 0x8B78, 16389: 0x8B79, 16390: 0x8B7A, 16391: 0x8B7B, 16392: 0x8B7C, 16393: 0x8B7D, 16394: 0x8B7E, 16395: 0x8B7F, 16396: 0x8B80, 16397: 0x8B81, 16398: 0x8B82, 16399: 0x8B83, 16400: 0x8B84, 16401: 0x8B85, 16402: 0x8B86, 16403: 0x8B87, 16404: 0x8B88, 16405: 0x8B89, 16406: 0x8B8A, 16407: 0x8B8B, 16408: 0x8B8C, 16409: 0x8B8D, 16410: 0x8B8E, 16411: 0x8B8F, 16412: 0x8B90, 16413: 0x8B91, 16414: 0x8B92, 16415: 0x8B93, 16416: 0x8B94, 16417: 0x8B95, 16418: 0x8B96, 16419: 0x8B97, 16420: 0x8B98, 16421: 0x8B99, 16422: 0x8B9A, 16423: 0x8B9B, 16424: 0x8B9C, 16425: 0x8B9D, 16426: 0x8B9E, 16427: 0x8B9F, 16428: 0x8BAC, 16429: 0x8BB1, 16430: 0x8BBB, 16431: 0x8BC7, 16432: 0x8BD0, 16433: 0x8BEA, 16434: 0x8C09, 16435: 0x8C1E, 16436: 0x4F4F, 16437: 0x6CE8, 16438: 0x795D, 16439: 0x9A7B, 16440: 0x6293, 16441: 0x722A, 16442: 0x62FD, 16443: 0x4E13, 16444: 0x7816, 16445: 0x8F6C, 16446: 0x64B0, 16447: 0x8D5A, 16448: 0x7BC6, 16449: 0x6869, 16450: 0x5E84, 16451: 0x88C5, 16452: 0x5986, 16453: 0x649E, 16454: 0x58EE, 16455: 0x72B6, 16456: 0x690E, 16457: 0x9525, 16458: 0x8FFD, 16459: 0x8D58, 16460: 0x5760, 16461: 0x7F00, 16462: 0x8C06, 16463: 0x51C6, 16464: 0x6349, 16465: 0x62D9, 16466: 0x5353, 16467: 0x684C, 16468: 0x7422, 16469: 0x8301, 16470: 0x914C, 16471: 0x5544, 16472: 0x7740, 16473: 0x707C, 16474: 0x6D4A, 16475: 0x5179, 16476: 0x54A8, 16477: 0x8D44, 16478: 0x59FF, 16479: 0x6ECB, 16480: 0x6DC4, 16481: 0x5B5C, 16482: 0x7D2B, 16483: 0x4ED4, 16484: 0x7C7D, 16485: 0x6ED3, 16486: 0x5B50, 16487: 0x81EA, 16488: 0x6E0D, 16489: 0x5B57, 16490: 0x9B03, 16491: 0x68D5, 16492: 0x8E2A, 16493: 0x5B97, 16494: 0x7EFC, 16495: 0x603B, 16496: 0x7EB5, 16497: 0x90B9, 16498: 0x8D70, 16499: 0x594F, 16500: 0x63CD, 16501: 0x79DF, 16502: 0x8DB3, 16503: 0x5352, 16504: 0x65CF, 16505: 0x7956, 16506: 0x8BC5, 16507: 0x963B, 16508: 0x7EC4, 16509: 0x94BB, 16510: 0x7E82, 16511: 0x5634, 16512: 0x9189, 16513: 0x6700, 16514: 0x7F6A, 16515: 0x5C0A, 16516: 0x9075, 16517: 0x6628, 16518: 0x5DE6, 16519: 0x4F50, 16520: 0x67DE, 16521: 0x505A, 16522: 0x4F5C, 16523: 0x5750, 16524: 0x5EA7, 16530: 0x8C38, 16531: 0x8C39, 16532: 0x8C3A, 16533: 0x8C3B, 16534: 0x8C3C, 16535: 0x8C3D, 16536: 0x8C3E, 16537: 0x8C3F, 16538: 0x8C40, 16539: 0x8C42, 16540: 0x8C43, 16541: 0x8C44, 16542: 0x8C45, 16543: 0x8C48, 16544: 0x8C4A, 16545: 0x8C4B, 16546: 0x8C4D, 16547: 0x8C4E, 16548: 0x8C4F, 16549: 0x8C50, 16550: 0x8C51, 16551: 0x8C52, 16552: 0x8C53, 16553: 0x8C54, 16554: 0x8C56, 16555: 0x8C57, 16556: 0x8C58, 16557: 0x8C59, 16558: 0x8C5B, 16559: 0x8C5C, 16560: 0x8C5D, 16561: 0x8C5E, 16562: 0x8C5F, 16563: 0x8C60, 16564: 0x8C63, 16565: 0x8C64, 16566: 0x8C65, 16567: 0x8C66, 16568: 0x8C67, 16569: 0x8C68, 16570: 0x8C69, 16571: 0x8C6C, 16572: 0x8C6D, 16573: 0x8C6E, 16574: 0x8C6F, 16575: 0x8C70, 16576: 0x8C71, 16577: 0x8C72, 16578: 0x8C74, 16579: 0x8C75, 16580: 0x8C76, 16581: 0x8C77, 16582: 0x8C7B, 16583: 0x8C7C, 16584: 0x8C7D, 16585: 0x8C7E, 16586: 0x8C7F, 16587: 0x8C80, 16588: 0x8C81, 16589: 0x8C83, 16590: 0x8C84, 16591: 0x8C86, 16592: 0x8C87, 16593: 0x8C88, 16594: 0x8C8B, 16595: 0x8C8D, 16596: 0x8C8E, 16597: 0x8C8F, 16598: 0x8C90, 16599: 0x8C91, 16600: 0x8C92, 16601: 0x8C93, 16602: 0x8C95, 16603: 0x8C96, 16604: 0x8C97, 16605: 0x8C99, 16606: 0x8C9A, 16607: 0x8C9B, 16608: 0x8C9C, 16609: 0x8C9D, 16610: 0x8C9E, 16611: 0x8C9F, 16612: 0x8CA0, 16613: 0x8CA1, 16614: 0x8CA2, 16615: 0x8CA3, 16616: 0x8CA4, 16617: 0x8CA5, 16618: 0x8CA6, 16619: 0x8CA7, 16620: 0x8CA8, 16621: 0x8CA9, 16622: 0x8CAA, 16623: 0x8CAB, 16624: 0x8CAC, 16625: 0x8CAD, 16626: 0x4E8D, 16627: 0x4E0C, 16628: 0x5140, 16629: 0x4E10, 16630: 0x5EFF, 16631: 0x5345, 16632: 0x4E15, 16633: 0x4E98, 16634: 0x4E1E, 16635: 0x9B32, 16636: 0x5B6C, 16637: 0x5669, 16638: 0x4E28, 16639: 0x79BA, 16640: 0x4E3F, 16641: 0x5315, 16642: 0x4E47, 16643: 0x592D, 16644: 0x723B, 16645: 0x536E, 16646: 0x6C10, 16647: 0x56DF, 16648: 0x80E4, 16649: 0x9997, 16650: 0x6BD3, 16651: 0x777E, 16652: 0x9F17, 16653: 0x4E36, 16654: 0x4E9F, 16655: 0x9F10, 16656: 0x4E5C, 16657: 0x4E69, 16658: 0x4E93, 16659: 0x8288, 16660: 0x5B5B, 16661: 0x556C, 16662: 0x560F, 16663: 0x4EC4, 16664: 0x538D, 16665: 0x539D, 16666: 0x53A3, 16667: 0x53A5, 16668: 0x53AE, 16669: 0x9765, 16670: 0x8D5D, 16671: 0x531A, 16672: 0x53F5, 16673: 0x5326, 16674: 0x532E, 16675: 0x533E, 16676: 0x8D5C, 16677: 0x5366, 16678: 0x5363, 16679: 0x5202, 16680: 0x5208, 16681: 0x520E, 16682: 0x522D, 16683: 0x5233, 16684: 0x523F, 16685: 0x5240, 16686: 0x524C, 16687: 0x525E, 16688: 0x5261, 16689: 0x525C, 16690: 0x84AF, 16691: 0x527D, 16692: 0x5282, 16693: 0x5281, 16694: 0x5290, 16695: 0x5293, 16696: 0x5182, 16697: 0x7F54, 16698: 0x4EBB, 16699: 0x4EC3, 16700: 0x4EC9, 16701: 0x4EC2, 16702: 0x4EE8, 16703: 0x4EE1, 16704: 0x4EEB, 16705: 0x4EDE, 16706: 0x4F1B, 16707: 0x4EF3, 16708: 0x4F22, 16709: 0x4F64, 16710: 0x4EF5, 16711: 0x4F25, 16712: 0x4F27, 16713: 0x4F09, 16714: 0x4F2B, 16715: 0x4F5E, 16716: 0x4F67, 16717: 0x6538, 16718: 0x4F5A, 16719: 0x4F5D, 16720: 0x8CAE, 16721: 0x8CAF, 16722: 0x8CB0, 16723: 0x8CB1, 16724: 0x8CB2, 16725: 0x8CB3, 16726: 0x8CB4, 16727: 0x8CB5, 16728: 0x8CB6, 16729: 0x8CB7, 16730: 0x8CB8, 16731: 0x8CB9, 16732: 0x8CBA, 16733: 0x8CBB, 16734: 0x8CBC, 16735: 0x8CBD, 16736: 0x8CBE, 16737: 0x8CBF, 16738: 0x8CC0, 16739: 0x8CC1, 16740: 0x8CC2, 16741: 0x8CC3, 16742: 0x8CC4, 16743: 0x8CC5, 16744: 0x8CC6, 16745: 0x8CC7, 16746: 0x8CC8, 16747: 0x8CC9, 16748: 0x8CCA, 16749: 0x8CCB, 16750: 0x8CCC, 16751: 0x8CCD, 16752: 0x8CCE, 16753: 0x8CCF, 16754: 0x8CD0, 16755: 0x8CD1, 16756: 0x8CD2, 16757: 0x8CD3, 16758: 0x8CD4, 16759: 0x8CD5, 16760: 0x8CD6, 16761: 0x8CD7, 16762: 0x8CD8, 16763: 0x8CD9, 16764: 0x8CDA, 16765: 0x8CDB, 16766: 0x8CDC, 16767: 0x8CDD, 16768: 0x8CDE, 16769: 0x8CDF, 16770: 0x8CE0, 16771: 0x8CE1, 16772: 0x8CE2, 16773: 0x8CE3, 16774: 0x8CE4, 16775: 0x8CE5, 16776: 0x8CE6, 16777: 0x8CE7, 16778: 0x8CE8, 16779: 0x8CE9, 16780: 0x8CEA, 16781: 0x8CEB, 16782: 0x8CEC, 16783: 0x8CED, 16784: 0x8CEE, 16785: 0x8CEF, 16786: 0x8CF0, 16787: 0x8CF1, 16788: 0x8CF2, 16789: 0x8CF3, 16790: 0x8CF4, 16791: 0x8CF5, 16792: 0x8CF6, 16793: 0x8CF7, 16794: 0x8CF8, 16795: 0x8CF9, 16796: 0x8CFA, 16797: 0x8CFB, 16798: 0x8CFC, 16799: 0x8CFD, 16800: 0x8CFE, 16801: 0x8CFF, 16802: 0x8D00, 16803: 0x8D01, 16804: 0x8D02, 16805: 0x8D03, 16806: 0x8D04, 16807: 0x8D05, 16808: 0x8D06, 16809: 0x8D07, 16810: 0x8D08, 16811: 0x8D09, 16812: 0x8D0A, 16813: 0x8D0B, 16814: 0x8D0C, 16815: 0x8D0D, 16816: 0x4F5F, 16817: 0x4F57, 16818: 0x4F32, 16819: 0x4F3D, 16820: 0x4F76, 16821: 0x4F74, 16822: 0x4F91, 16823: 0x4F89, 16824: 0x4F83, 16825: 0x4F8F, 16826: 0x4F7E, 16827: 0x4F7B, 16828: 0x4FAA, 16829: 0x4F7C, 16830: 0x4FAC, 16831: 0x4F94, 16832: 0x4FE6, 16833: 0x4FE8, 16834: 0x4FEA, 16835: 0x4FC5, 16836: 0x4FDA, 16837: 0x4FE3, 16838: 0x4FDC, 16839: 0x4FD1, 16840: 0x4FDF, 16841: 0x4FF8, 16842: 0x5029, 16843: 0x504C, 16844: 0x4FF3, 16845: 0x502C, 16846: 0x500F, 16847: 0x502E, 16848: 0x502D, 16849: 0x4FFE, 16850: 0x501C, 16851: 0x500C, 16852: 0x5025, 16853: 0x5028, 16854: 0x507E, 16855: 0x5043, 16856: 0x5055, 16857: 0x5048, 16858: 0x504E, 16859: 0x506C, 16860: 0x507B, 16861: 0x50A5, 16862: 0x50A7, 16863: 0x50A9, 16864: 0x50BA, 16865: 0x50D6, 16866: 0x5106, 16867: 0x50ED, 16868: 0x50EC, 16869: 0x50E6, 16870: 0x50EE, 16871: 0x5107, 16872: 0x510B, 16873: 0x4EDD, 16874: 0x6C3D, 16875: 0x4F58, 16876: 0x4F65, 16877: 0x4FCE, 16878: 0x9FA0, 16879: 0x6C46, 16880: 0x7C74, 16881: 0x516E, 16882: 0x5DFD, 16883: 0x9EC9, 16884: 0x9998, 16885: 0x5181, 16886: 0x5914, 16887: 0x52F9, 16888: 0x530D, 16889: 0x8A07, 16890: 0x5310, 16891: 0x51EB, 16892: 0x5919, 16893: 0x5155, 16894: 0x4EA0, 16895: 0x5156, 16896: 0x4EB3, 16897: 0x886E, 16898: 0x88A4, 16899: 0x4EB5, 16900: 0x8114, 16901: 0x88D2, 16902: 0x7980, 16903: 0x5B34, 16904: 0x8803, 16905: 0x7FB8, 16906: 0x51AB, 16907: 0x51B1, 16908: 0x51BD, 16909: 0x51BC, 16910: 0x8D0E, 16911: 0x8D0F, 16912: 0x8D10, 16913: 0x8D11, 16914: 0x8D12, 16915: 0x8D13, 16916: 0x8D14, 16917: 0x8D15, 16918: 0x8D16, 16919: 0x8D17, 16920: 0x8D18, 16921: 0x8D19, 16922: 0x8D1A, 16923: 0x8D1B, 16924: 0x8D1C, 16925: 0x8D20, 16926: 0x8D51, 16927: 0x8D52, 16928: 0x8D57, 16929: 0x8D5F, 16930: 0x8D65, 16931: 0x8D68, 16932: 0x8D69, 16933: 0x8D6A, 16934: 0x8D6C, 16935: 0x8D6E, 16936: 0x8D6F, 16937: 0x8D71, 16938: 0x8D72, 16939: 0x8D78, 16940: 0x8D79, 16941: 0x8D7A, 16942: 0x8D7B, 16943: 0x8D7C, 16944: 0x8D7D, 16945: 0x8D7E, 16946: 0x8D7F, 16947: 0x8D80, 16948: 0x8D82, 16949: 0x8D83, 16950: 0x8D86, 16951: 0x8D87, 16952: 0x8D88, 16953: 0x8D89, 16954: 0x8D8C, 16955: 0x8D8D, 16956: 0x8D8E, 16957: 0x8D8F, 16958: 0x8D90, 16959: 0x8D92, 16960: 0x8D93, 16961: 0x8D95, 16962: 0x8D96, 16963: 0x8D97, 16964: 0x8D98, 16965: 0x8D99, 16966: 0x8D9A, 16967: 0x8D9B, 16968: 0x8D9C, 16969: 0x8D9D, 16970: 0x8D9E, 16971: 0x8DA0, 16972: 0x8DA1, 16973: 0x8DA2, 16974: 0x8DA4, 16975: 0x8DA5, 16976: 0x8DA6, 16977: 0x8DA7, 16978: 0x8DA8, 16979: 0x8DA9, 16980: 0x8DAA, 16981: 0x8DAB, 16982: 0x8DAC, 16983: 0x8DAD, 16984: 0x8DAE, 16985: 0x8DAF, 16986: 0x8DB0, 16987: 0x8DB2, 16988: 0x8DB6, 16989: 0x8DB7, 16990: 0x8DB9, 16991: 0x8DBB, 16992: 0x8DBD, 16993: 0x8DC0, 16994: 0x8DC1, 16995: 0x8DC2, 16996: 0x8DC5, 16997: 0x8DC7, 16998: 0x8DC8, 16999: 0x8DC9, 17000: 0x8DCA, 17001: 0x8DCD, 17002: 0x8DD0, 17003: 0x8DD2, 17004: 0x8DD3, 17005: 0x8DD4, 17006: 0x51C7, 17007: 0x5196, 17008: 0x51A2, 17009: 0x51A5, 17010: 0x8BA0, 17011: 0x8BA6, 17012: 0x8BA7, 17013: 0x8BAA, 17014: 0x8BB4, 17015: 0x8BB5, 17016: 0x8BB7, 17017: 0x8BC2, 17018: 0x8BC3, 17019: 0x8BCB, 17020: 0x8BCF, 17021: 0x8BCE, 17022: 0x8BD2, 17023: 0x8BD3, 17024: 0x8BD4, 17025: 0x8BD6, 17026: 0x8BD8, 17027: 0x8BD9, 17028: 0x8BDC, 17029: 0x8BDF, 17030: 0x8BE0, 17031: 0x8BE4, 17032: 0x8BE8, 17033: 0x8BE9, 17034: 0x8BEE, 17035: 0x8BF0, 17036: 0x8BF3, 17037: 0x8BF6, 17038: 0x8BF9, 17039: 0x8BFC, 17040: 0x8BFF, 17041: 0x8C00, 17042: 0x8C02, 17043: 0x8C04, 17044: 0x8C07, 17045: 0x8C0C, 17046: 0x8C0F, 17047: 0x8C11, 17048: 0x8C12, 17049: 0x8C14, 17050: 0x8C15, 17051: 0x8C16, 17052: 0x8C19, 17053: 0x8C1B, 17054: 0x8C18, 17055: 0x8C1D, 17056: 0x8C1F, 17057: 0x8C20, 17058: 0x8C21, 17059: 0x8C25, 17060: 0x8C27, 17061: 0x8C2A, 17062: 0x8C2B, 17063: 0x8C2E, 17064: 0x8C2F, 17065: 0x8C32, 17066: 0x8C33, 17067: 0x8C35, 17068: 0x8C36, 17069: 0x5369, 17070: 0x537A, 17071: 0x961D, 17072: 0x9622, 17073: 0x9621, 17074: 0x9631, 17075: 0x962A, 17076: 0x963D, 17077: 0x963C, 17078: 0x9642, 17079: 0x9649, 17080: 0x9654, 17081: 0x965F, 17082: 0x9667, 17083: 0x966C, 17084: 0x9672, 17085: 0x9674, 17086: 0x9688, 17087: 0x968D, 17088: 0x9697, 17089: 0x96B0, 17090: 0x9097, 17091: 0x909B, 17092: 0x909D, 17093: 0x9099, 17094: 0x90AC, 17095: 0x90A1, 17096: 0x90B4, 17097: 0x90B3, 17098: 0x90B6, 17099: 0x90BA, 17100: 0x8DD5, 17101: 0x8DD8, 17102: 0x8DD9, 17103: 0x8DDC, 17104: 0x8DE0, 17105: 0x8DE1, 17106: 0x8DE2, 17107: 0x8DE5, 17108: 0x8DE6, 17109: 0x8DE7, 17110: 0x8DE9, 17111: 0x8DED, 17112: 0x8DEE, 17113: 0x8DF0, 17114: 0x8DF1, 17115: 0x8DF2, 17116: 0x8DF4, 17117: 0x8DF6, 17118: 0x8DFC, 17119: 0x8DFE, 17120: 0x8DFF, 17121: 0x8E00, 17122: 0x8E01, 17123: 0x8E02, 17124: 0x8E03, 17125: 0x8E04, 17126: 0x8E06, 17127: 0x8E07, 17128: 0x8E08, 17129: 0x8E0B, 17130: 0x8E0D, 17131: 0x8E0E, 17132: 0x8E10, 17133: 0x8E11, 17134: 0x8E12, 17135: 0x8E13, 17136: 0x8E15, 17137: 0x8E16, 17138: 0x8E17, 17139: 0x8E18, 17140: 0x8E19, 17141: 0x8E1A, 17142: 0x8E1B, 17143: 0x8E1C, 17144: 0x8E20, 17145: 0x8E21, 17146: 0x8E24, 17147: 0x8E25, 17148: 0x8E26, 17149: 0x8E27, 17150: 0x8E28, 17151: 0x8E2B, 17152: 0x8E2D, 17153: 0x8E30, 17154: 0x8E32, 17155: 0x8E33, 17156: 0x8E34, 17157: 0x8E36, 17158: 0x8E37, 17159: 0x8E38, 17160: 0x8E3B, 17161: 0x8E3C, 17162: 0x8E3E, 17163: 0x8E3F, 17164: 0x8E43, 17165: 0x8E45, 17166: 0x8E46, 17167: 0x8E4C, 17168: 0x8E4D, 17169: 0x8E4E, 17170: 0x8E4F, 17171: 0x8E50, 17172: 0x8E53, 17173: 0x8E54, 17174: 0x8E55, 17175: 0x8E56, 17176: 0x8E57, 17177: 0x8E58, 17178: 0x8E5A, 17179: 0x8E5B, 17180: 0x8E5C, 17181: 0x8E5D, 17182: 0x8E5E, 17183: 0x8E5F, 17184: 0x8E60, 17185: 0x8E61, 17186: 0x8E62, 17187: 0x8E63, 17188: 0x8E64, 17189: 0x8E65, 17190: 0x8E67, 17191: 0x8E68, 17192: 0x8E6A, 17193: 0x8E6B, 17194: 0x8E6E, 17195: 0x8E71, 17196: 0x90B8, 17197: 0x90B0, 17198: 0x90CF, 17199: 0x90C5, 17200: 0x90BE, 17201: 0x90D0, 17202: 0x90C4, 17203: 0x90C7, 17204: 0x90D3, 17205: 0x90E6, 17206: 0x90E2, 17207: 0x90DC, 17208: 0x90D7, 17209: 0x90DB, 17210: 0x90EB, 17211: 0x90EF, 17212: 0x90FE, 17213: 0x9104, 17214: 0x9122, 17215: 0x911E, 17216: 0x9123, 17217: 0x9131, 17218: 0x912F, 17219: 0x9139, 17220: 0x9143, 17221: 0x9146, 17222: 0x520D, 17223: 0x5942, 17224: 0x52A2, 17225: 0x52AC, 17226: 0x52AD, 17227: 0x52BE, 17228: 0x54FF, 17229: 0x52D0, 17230: 0x52D6, 17231: 0x52F0, 17232: 0x53DF, 17233: 0x71EE, 17234: 0x77CD, 17235: 0x5EF4, 17236: 0x51F5, 17237: 0x51FC, 17238: 0x9B2F, 17239: 0x53B6, 17240: 0x5F01, 17241: 0x755A, 17242: 0x5DEF, 17243: 0x574C, 17244: 0x57A9, 17245: 0x57A1, 17246: 0x587E, 17247: 0x58BC, 17248: 0x58C5, 17249: 0x58D1, 17250: 0x5729, 17251: 0x572C, 17252: 0x572A, 17253: 0x5733, 17254: 0x5739, 17255: 0x572E, 17256: 0x572F, 17257: 0x575C, 17258: 0x573B, 17259: 0x5742, 17260: 0x5769, 17261: 0x5785, 17262: 0x576B, 17263: 0x5786, 17264: 0x577C, 17265: 0x577B, 17266: 0x5768, 17267: 0x576D, 17268: 0x5776, 17269: 0x5773, 17270: 0x57AD, 17271: 0x57A4, 17272: 0x578C, 17273: 0x57B2, 17274: 0x57CF, 17275: 0x57A7, 17276: 0x57B4, 17277: 0x5793, 17278: 0x57A0, 17279: 0x57D5, 17280: 0x57D8, 17281: 0x57DA, 17282: 0x57D9, 17283: 0x57D2, 17284: 0x57B8, 17285: 0x57F4, 17286: 0x57EF, 17287: 0x57F8, 17288: 0x57E4, 17289: 0x57DD, 17290: 0x8E73, 17291: 0x8E75, 17292: 0x8E77, 17293: 0x8E78, 17294: 0x8E79, 17295: 0x8E7A, 17296: 0x8E7B, 17297: 0x8E7D, 17298: 0x8E7E, 17299: 0x8E80, 17300: 0x8E82, 17301: 0x8E83, 17302: 0x8E84, 17303: 0x8E86, 17304: 0x8E88, 17305: 0x8E89, 17306: 0x8E8A, 17307: 0x8E8B, 17308: 0x8E8C, 17309: 0x8E8D, 17310: 0x8E8E, 17311: 0x8E91, 17312: 0x8E92, 17313: 0x8E93, 17314: 0x8E95, 17315: 0x8E96, 17316: 0x8E97, 17317: 0x8E98, 17318: 0x8E99, 17319: 0x8E9A, 17320: 0x8E9B, 17321: 0x8E9D, 17322: 0x8E9F, 17323: 0x8EA0, 17324: 0x8EA1, 17325: 0x8EA2, 17326: 0x8EA3, 17327: 0x8EA4, 17328: 0x8EA5, 17329: 0x8EA6, 17330: 0x8EA7, 17331: 0x8EA8, 17332: 0x8EA9, 17333: 0x8EAA, 17334: 0x8EAD, 17335: 0x8EAE, 17336: 0x8EB0, 17337: 0x8EB1, 17338: 0x8EB3, 17339: 0x8EB4, 17340: 0x8EB5, 17341: 0x8EB6, 17342: 0x8EB7, 17343: 0x8EB8, 17344: 0x8EB9, 17345: 0x8EBB, 17346: 0x8EBC, 17347: 0x8EBD, 17348: 0x8EBE, 17349: 0x8EBF, 17350: 0x8EC0, 17351: 0x8EC1, 17352: 0x8EC2, 17353: 0x8EC3, 17354: 0x8EC4, 17355: 0x8EC5, 17356: 0x8EC6, 17357: 0x8EC7, 17358: 0x8EC8, 17359: 0x8EC9, 17360: 0x8ECA, 17361: 0x8ECB, 17362: 0x8ECC, 17363: 0x8ECD, 17364: 0x8ECF, 17365: 0x8ED0, 17366: 0x8ED1, 17367: 0x8ED2, 17368: 0x8ED3, 17369: 0x8ED4, 17370: 0x8ED5, 17371: 0x8ED6, 17372: 0x8ED7, 17373: 0x8ED8, 17374: 0x8ED9, 17375: 0x8EDA, 17376: 0x8EDB, 17377: 0x8EDC, 17378: 0x8EDD, 17379: 0x8EDE, 17380: 0x8EDF, 17381: 0x8EE0, 17382: 0x8EE1, 17383: 0x8EE2, 17384: 0x8EE3, 17385: 0x8EE4, 17386: 0x580B, 17387: 0x580D, 17388: 0x57FD, 17389: 0x57ED, 17390: 0x5800, 17391: 0x581E, 17392: 0x5819, 17393: 0x5844, 17394: 0x5820, 17395: 0x5865, 17396: 0x586C, 17397: 0x5881, 17398: 0x5889, 17399: 0x589A, 17400: 0x5880, 17401: 0x99A8, 17402: 0x9F19, 17403: 0x61FF, 17404: 0x8279, 17405: 0x827D, 17406: 0x827F, 17407: 0x828F, 17408: 0x828A, 17409: 0x82A8, 17410: 0x8284, 17411: 0x828E, 17412: 0x8291, 17413: 0x8297, 17414: 0x8299, 17415: 0x82AB, 17416: 0x82B8, 17417: 0x82BE, 17418: 0x82B0, 17419: 0x82C8, 17420: 0x82CA, 17421: 0x82E3, 17422: 0x8298, 17423: 0x82B7, 17424: 0x82AE, 17425: 0x82CB, 17426: 0x82CC, 17427: 0x82C1, 17428: 0x82A9, 17429: 0x82B4, 17430: 0x82A1, 17431: 0x82AA, 17432: 0x829F, 17433: 0x82C4, 17434: 0x82CE, 17435: 0x82A4, 17436: 0x82E1, 17437: 0x8309, 17438: 0x82F7, 17439: 0x82E4, 17440: 0x830F, 17441: 0x8307, 17442: 0x82DC, 17443: 0x82F4, 17444: 0x82D2, 17445: 0x82D8, 17446: 0x830C, 17447: 0x82FB, 17448: 0x82D3, 17449: 0x8311, 17450: 0x831A, 17451: 0x8306, 17452: 0x8314, 17453: 0x8315, 17454: 0x82E0, 17455: 0x82D5, 17456: 0x831C, 17457: 0x8351, 17458: 0x835B, 17459: 0x835C, 17460: 0x8308, 17461: 0x8392, 17462: 0x833C, 17463: 0x8334, 17464: 0x8331, 17465: 0x839B, 17466: 0x835E, 17467: 0x832F, 17468: 0x834F, 17469: 0x8347, 17470: 0x8343, 17471: 0x835F, 17472: 0x8340, 17473: 0x8317, 17474: 0x8360, 17475: 0x832D, 17476: 0x833A, 17477: 0x8333, 17478: 0x8366, 17479: 0x8365, 17480: 0x8EE5, 17481: 0x8EE6, 17482: 0x8EE7, 17483: 0x8EE8, 17484: 0x8EE9, 17485: 0x8EEA, 17486: 0x8EEB, 17487: 0x8EEC, 17488: 0x8EED, 17489: 0x8EEE, 17490: 0x8EEF, 17491: 0x8EF0, 17492: 0x8EF1, 17493: 0x8EF2, 17494: 0x8EF3, 17495: 0x8EF4, 17496: 0x8EF5, 17497: 0x8EF6, 17498: 0x8EF7, 17499: 0x8EF8, 17500: 0x8EF9, 17501: 0x8EFA, 17502: 0x8EFB, 17503: 0x8EFC, 17504: 0x8EFD, 17505: 0x8EFE, 17506: 0x8EFF, 17507: 0x8F00, 17508: 0x8F01, 17509: 0x8F02, 17510: 0x8F03, 17511: 0x8F04, 17512: 0x8F05, 17513: 0x8F06, 17514: 0x8F07, 17515: 0x8F08, 17516: 0x8F09, 17517: 0x8F0A, 17518: 0x8F0B, 17519: 0x8F0C, 17520: 0x8F0D, 17521: 0x8F0E, 17522: 0x8F0F, 17523: 0x8F10, 17524: 0x8F11, 17525: 0x8F12, 17526: 0x8F13, 17527: 0x8F14, 17528: 0x8F15, 17529: 0x8F16, 17530: 0x8F17, 17531: 0x8F18, 17532: 0x8F19, 17533: 0x8F1A, 17534: 0x8F1B, 17535: 0x8F1C, 17536: 0x8F1D, 17537: 0x8F1E, 17538: 0x8F1F, 17539: 0x8F20, 17540: 0x8F21, 17541: 0x8F22, 17542: 0x8F23, 17543: 0x8F24, 17544: 0x8F25, 17545: 0x8F26, 17546: 0x8F27, 17547: 0x8F28, 17548: 0x8F29, 17549: 0x8F2A, 17550: 0x8F2B, 17551: 0x8F2C, 17552: 0x8F2D, 17553: 0x8F2E, 17554: 0x8F2F, 17555: 0x8F30, 17556: 0x8F31, 17557: 0x8F32, 17558: 0x8F33, 17559: 0x8F34, 17560: 0x8F35, 17561: 0x8F36, 17562: 0x8F37, 17563: 0x8F38, 17564: 0x8F39, 17565: 0x8F3A, 17566: 0x8F3B, 17567: 0x8F3C, 17568: 0x8F3D, 17569: 0x8F3E, 17570: 0x8F3F, 17571: 0x8F40, 17572: 0x8F41, 17573: 0x8F42, 17574: 0x8F43, 17575: 0x8F44, 17576: 0x8368, 17577: 0x831B, 17578: 0x8369, 17579: 0x836C, 17580: 0x836A, 17581: 0x836D, 17582: 0x836E, 17583: 0x83B0, 17584: 0x8378, 17585: 0x83B3, 17586: 0x83B4, 17587: 0x83A0, 17588: 0x83AA, 17589: 0x8393, 17590: 0x839C, 17591: 0x8385, 17592: 0x837C, 17593: 0x83B6, 17594: 0x83A9, 17595: 0x837D, 17596: 0x83B8, 17597: 0x837B, 17598: 0x8398, 17599: 0x839E, 17600: 0x83A8, 17601: 0x83BA, 17602: 0x83BC, 17603: 0x83C1, 17604: 0x8401, 17605: 0x83E5, 17606: 0x83D8, 17607: 0x5807, 17608: 0x8418, 17609: 0x840B, 17610: 0x83DD, 17611: 0x83FD, 17612: 0x83D6, 17613: 0x841C, 17614: 0x8438, 17615: 0x8411, 17616: 0x8406, 17617: 0x83D4, 17618: 0x83DF, 17619: 0x840F, 17620: 0x8403, 17621: 0x83F8, 17622: 0x83F9, 17623: 0x83EA, 17624: 0x83C5, 17625: 0x83C0, 17626: 0x8426, 17627: 0x83F0, 17628: 0x83E1, 17629: 0x845C, 17630: 0x8451, 17631: 0x845A, 17632: 0x8459, 17633: 0x8473, 17634: 0x8487, 17635: 0x8488, 17636: 0x847A, 17637: 0x8489, 17638: 0x8478, 17639: 0x843C, 17640: 0x8446, 17641: 0x8469, 17642: 0x8476, 17643: 0x848C, 17644: 0x848E, 17645: 0x8431, 17646: 0x846D, 17647: 0x84C1, 17648: 0x84CD, 17649: 0x84D0, 17650: 0x84E6, 17651: 0x84BD, 17652: 0x84D3, 17653: 0x84CA, 17654: 0x84BF, 17655: 0x84BA, 17656: 0x84E0, 17657: 0x84A1, 17658: 0x84B9, 17659: 0x84B4, 17660: 0x8497, 17661: 0x84E5, 17662: 0x84E3, 17663: 0x850C, 17664: 0x750D, 17665: 0x8538, 17666: 0x84F0, 17667: 0x8539, 17668: 0x851F, 17669: 0x853A, 17670: 0x8F45, 17671: 0x8F46, 17672: 0x8F47, 17673: 0x8F48, 17674: 0x8F49, 17675: 0x8F4A, 17676: 0x8F4B, 17677: 0x8F4C, 17678: 0x8F4D, 17679: 0x8F4E, 17680: 0x8F4F, 17681: 0x8F50, 17682: 0x8F51, 17683: 0x8F52, 17684: 0x8F53, 17685: 0x8F54, 17686: 0x8F55, 17687: 0x8F56, 17688: 0x8F57, 17689: 0x8F58, 17690: 0x8F59, 17691: 0x8F5A, 17692: 0x8F5B, 17693: 0x8F5C, 17694: 0x8F5D, 17695: 0x8F5E, 17696: 0x8F5F, 17697: 0x8F60, 17698: 0x8F61, 17699: 0x8F62, 17700: 0x8F63, 17701: 0x8F64, 17702: 0x8F65, 17703: 0x8F6A, 17704: 0x8F80, 17705: 0x8F8C, 17706: 0x8F92, 17707: 0x8F9D, 17708: 0x8FA0, 17709: 0x8FA1, 17710: 0x8FA2, 17711: 0x8FA4, 17712: 0x8FA5, 17713: 0x8FA6, 17714: 0x8FA7, 17715: 0x8FAA, 17716: 0x8FAC, 17717: 0x8FAD, 17718: 0x8FAE, 17719: 0x8FAF, 17720: 0x8FB2, 17721: 0x8FB3, 17722: 0x8FB4, 17723: 0x8FB5, 17724: 0x8FB7, 17725: 0x8FB8, 17726: 0x8FBA, 17727: 0x8FBB, 17728: 0x8FBC, 17729: 0x8FBF, 17730: 0x8FC0, 17731: 0x8FC3, 17732: 0x8FC6, 17733: 0x8FC9, 17734: 0x8FCA, 17735: 0x8FCB, 17736: 0x8FCC, 17737: 0x8FCD, 17738: 0x8FCF, 17739: 0x8FD2, 17740: 0x8FD6, 17741: 0x8FD7, 17742: 0x8FDA, 17743: 0x8FE0, 17744: 0x8FE1, 17745: 0x8FE3, 17746: 0x8FE7, 17747: 0x8FEC, 17748: 0x8FEF, 17749: 0x8FF1, 17750: 0x8FF2, 17751: 0x8FF4, 17752: 0x8FF5, 17753: 0x8FF6, 17754: 0x8FFA, 17755: 0x8FFB, 17756: 0x8FFC, 17757: 0x8FFE, 17758: 0x8FFF, 17759: 0x9007, 17760: 0x9008, 17761: 0x900C, 17762: 0x900E, 17763: 0x9013, 17764: 0x9015, 17765: 0x9018, 17766: 0x8556, 17767: 0x853B, 17768: 0x84FF, 17769: 0x84FC, 17770: 0x8559, 17771: 0x8548, 17772: 0x8568, 17773: 0x8564, 17774: 0x855E, 17775: 0x857A, 17776: 0x77A2, 17777: 0x8543, 17778: 0x8572, 17779: 0x857B, 17780: 0x85A4, 17781: 0x85A8, 17782: 0x8587, 17783: 0x858F, 17784: 0x8579, 17785: 0x85AE, 17786: 0x859C, 17787: 0x8585, 17788: 0x85B9, 17789: 0x85B7, 17790: 0x85B0, 17791: 0x85D3, 17792: 0x85C1, 17793: 0x85DC, 17794: 0x85FF, 17795: 0x8627, 17796: 0x8605, 17797: 0x8629, 17798: 0x8616, 17799: 0x863C, 17800: 0x5EFE, 17801: 0x5F08, 17802: 0x593C, 17803: 0x5941, 17804: 0x8037, 17805: 0x5955, 17806: 0x595A, 17807: 0x5958, 17808: 0x530F, 17809: 0x5C22, 17810: 0x5C25, 17811: 0x5C2C, 17812: 0x5C34, 17813: 0x624C, 17814: 0x626A, 17815: 0x629F, 17816: 0x62BB, 17817: 0x62CA, 17818: 0x62DA, 17819: 0x62D7, 17820: 0x62EE, 17821: 0x6322, 17822: 0x62F6, 17823: 0x6339, 17824: 0x634B, 17825: 0x6343, 17826: 0x63AD, 17827: 0x63F6, 17828: 0x6371, 17829: 0x637A, 17830: 0x638E, 17831: 0x63B4, 17832: 0x636D, 17833: 0x63AC, 17834: 0x638A, 17835: 0x6369, 17836: 0x63AE, 17837: 0x63BC, 17838: 0x63F2, 17839: 0x63F8, 17840: 0x63E0, 17841: 0x63FF, 17842: 0x63C4, 17843: 0x63DE, 17844: 0x63CE, 17845: 0x6452, 17846: 0x63C6, 17847: 0x63BE, 17848: 0x6445, 17849: 0x6441, 17850: 0x640B, 17851: 0x641B, 17852: 0x6420, 17853: 0x640C, 17854: 0x6426, 17855: 0x6421, 17856: 0x645E, 17857: 0x6484, 17858: 0x646D, 17859: 0x6496, 17860: 0x9019, 17861: 0x901C, 17862: 0x9023, 17863: 0x9024, 17864: 0x9025, 17865: 0x9027, 17866: 0x9028, 17867: 0x9029, 17868: 0x902A, 17869: 0x902B, 17870: 0x902C, 17871: 0x9030, 17872: 0x9031, 17873: 0x9032, 17874: 0x9033, 17875: 0x9034, 17876: 0x9037, 17877: 0x9039, 17878: 0x903A, 17879: 0x903D, 17880: 0x903F, 17881: 0x9040, 17882: 0x9043, 17883: 0x9045, 17884: 0x9046, 17885: 0x9048, 17886: 0x9049, 17887: 0x904A, 17888: 0x904B, 17889: 0x904C, 17890: 0x904E, 17891: 0x9054, 17892: 0x9055, 17893: 0x9056, 17894: 0x9059, 17895: 0x905A, 17896: 0x905C, 17897: 0x905D, 17898: 0x905E, 17899: 0x905F, 17900: 0x9060, 17901: 0x9061, 17902: 0x9064, 17903: 0x9066, 17904: 0x9067, 17905: 0x9069, 17906: 0x906A, 17907: 0x906B, 17908: 0x906C, 17909: 0x906F, 17910: 0x9070, 17911: 0x9071, 17912: 0x9072, 17913: 0x9073, 17914: 0x9076, 17915: 0x9077, 17916: 0x9078, 17917: 0x9079, 17918: 0x907A, 17919: 0x907B, 17920: 0x907C, 17921: 0x907E, 17922: 0x9081, 17923: 0x9084, 17924: 0x9085, 17925: 0x9086, 17926: 0x9087, 17927: 0x9089, 17928: 0x908A, 17929: 0x908C, 17930: 0x908D, 17931: 0x908E, 17932: 0x908F, 17933: 0x9090, 17934: 0x9092, 17935: 0x9094, 17936: 0x9096, 17937: 0x9098, 17938: 0x909A, 17939: 0x909C, 17940: 0x909E, 17941: 0x909F, 17942: 0x90A0, 17943: 0x90A4, 17944: 0x90A5, 17945: 0x90A7, 17946: 0x90A8, 17947: 0x90A9, 17948: 0x90AB, 17949: 0x90AD, 17950: 0x90B2, 17951: 0x90B7, 17952: 0x90BC, 17953: 0x90BD, 17954: 0x90BF, 17955: 0x90C0, 17956: 0x647A, 17957: 0x64B7, 17958: 0x64B8, 17959: 0x6499, 17960: 0x64BA, 17961: 0x64C0, 17962: 0x64D0, 17963: 0x64D7, 17964: 0x64E4, 17965: 0x64E2, 17966: 0x6509, 17967: 0x6525, 17968: 0x652E, 17969: 0x5F0B, 17970: 0x5FD2, 17971: 0x7519, 17972: 0x5F11, 17973: 0x535F, 17974: 0x53F1, 17975: 0x53FD, 17976: 0x53E9, 17977: 0x53E8, 17978: 0x53FB, 17979: 0x5412, 17980: 0x5416, 17981: 0x5406, 17982: 0x544B, 17983: 0x5452, 17984: 0x5453, 17985: 0x5454, 17986: 0x5456, 17987: 0x5443, 17988: 0x5421, 17989: 0x5457, 17990: 0x5459, 17991: 0x5423, 17992: 0x5432, 17993: 0x5482, 17994: 0x5494, 17995: 0x5477, 17996: 0x5471, 17997: 0x5464, 17998: 0x549A, 17999: 0x549B, 18000: 0x5484, 18001: 0x5476, 18002: 0x5466, 18003: 0x549D, 18004: 0x54D0, 18005: 0x54AD, 18006: 0x54C2, 18007: 0x54B4, 18008: 0x54D2, 18009: 0x54A7, 18010: 0x54A6, 18011: 0x54D3, 18012: 0x54D4, 18013: 0x5472, 18014: 0x54A3, 18015: 0x54D5, 18016: 0x54BB, 18017: 0x54BF, 18018: 0x54CC, 18019: 0x54D9, 18020: 0x54DA, 18021: 0x54DC, 18022: 0x54A9, 18023: 0x54AA, 18024: 0x54A4, 18025: 0x54DD, 18026: 0x54CF, 18027: 0x54DE, 18028: 0x551B, 18029: 0x54E7, 18030: 0x5520, 18031: 0x54FD, 18032: 0x5514, 18033: 0x54F3, 18034: 0x5522, 18035: 0x5523, 18036: 0x550F, 18037: 0x5511, 18038: 0x5527, 18039: 0x552A, 18040: 0x5567, 18041: 0x558F, 18042: 0x55B5, 18043: 0x5549, 18044: 0x556D, 18045: 0x5541, 18046: 0x5555, 18047: 0x553F, 18048: 0x5550, 18049: 0x553C, 18050: 0x90C2, 18051: 0x90C3, 18052: 0x90C6, 18053: 0x90C8, 18054: 0x90C9, 18055: 0x90CB, 18056: 0x90CC, 18057: 0x90CD, 18058: 0x90D2, 18059: 0x90D4, 18060: 0x90D5, 18061: 0x90D6, 18062: 0x90D8, 18063: 0x90D9, 18064: 0x90DA, 18065: 0x90DE, 18066: 0x90DF, 18067: 0x90E0, 18068: 0x90E3, 18069: 0x90E4, 18070: 0x90E5, 18071: 0x90E9, 18072: 0x90EA, 18073: 0x90EC, 18074: 0x90EE, 18075: 0x90F0, 18076: 0x90F1, 18077: 0x90F2, 18078: 0x90F3, 18079: 0x90F5, 18080: 0x90F6, 18081: 0x90F7, 18082: 0x90F9, 18083: 0x90FA, 18084: 0x90FB, 18085: 0x90FC, 18086: 0x90FF, 18087: 0x9100, 18088: 0x9101, 18089: 0x9103, 18090: 0x9105, 18091: 0x9106, 18092: 0x9107, 18093: 0x9108, 18094: 0x9109, 18095: 0x910A, 18096: 0x910B, 18097: 0x910C, 18098: 0x910D, 18099: 0x910E, 18100: 0x910F, 18101: 0x9110, 18102: 0x9111, 18103: 0x9112, 18104: 0x9113, 18105: 0x9114, 18106: 0x9115, 18107: 0x9116, 18108: 0x9117, 18109: 0x9118, 18110: 0x911A, 18111: 0x911B, 18112: 0x911C, 18113: 0x911D, 18114: 0x911F, 18115: 0x9120, 18116: 0x9121, 18117: 0x9124, 18118: 0x9125, 18119: 0x9126, 18120: 0x9127, 18121: 0x9128, 18122: 0x9129, 18123: 0x912A, 18124: 0x912B, 18125: 0x912C, 18126: 0x912D, 18127: 0x912E, 18128: 0x9130, 18129: 0x9132, 18130: 0x9133, 18131: 0x9134, 18132: 0x9135, 18133: 0x9136, 18134: 0x9137, 18135: 0x9138, 18136: 0x913A, 18137: 0x913B, 18138: 0x913C, 18139: 0x913D, 18140: 0x913E, 18141: 0x913F, 18142: 0x9140, 18143: 0x9141, 18144: 0x9142, 18145: 0x9144, 18146: 0x5537, 18147: 0x5556, 18148: 0x5575, 18149: 0x5576, 18150: 0x5577, 18151: 0x5533, 18152: 0x5530, 18153: 0x555C, 18154: 0x558B, 18155: 0x55D2, 18156: 0x5583, 18157: 0x55B1, 18158: 0x55B9, 18159: 0x5588, 18160: 0x5581, 18161: 0x559F, 18162: 0x557E, 18163: 0x55D6, 18164: 0x5591, 18165: 0x557B, 18166: 0x55DF, 18167: 0x55BD, 18168: 0x55BE, 18169: 0x5594, 18170: 0x5599, 18171: 0x55EA, 18172: 0x55F7, 18173: 0x55C9, 18174: 0x561F, 18175: 0x55D1, 18176: 0x55EB, 18177: 0x55EC, 18178: 0x55D4, 18179: 0x55E6, 18180: 0x55DD, 18181: 0x55C4, 18182: 0x55EF, 18183: 0x55E5, 18184: 0x55F2, 18185: 0x55F3, 18186: 0x55CC, 18187: 0x55CD, 18188: 0x55E8, 18189: 0x55F5, 18190: 0x55E4, 18191: 0x8F94, 18192: 0x561E, 18193: 0x5608, 18194: 0x560C, 18195: 0x5601, 18196: 0x5624, 18197: 0x5623, 18198: 0x55FE, 18199: 0x5600, 18200: 0x5627, 18201: 0x562D, 18202: 0x5658, 18203: 0x5639, 18204: 0x5657, 18205: 0x562C, 18206: 0x564D, 18207: 0x5662, 18208: 0x5659, 18209: 0x565C, 18210: 0x564C, 18211: 0x5654, 18212: 0x5686, 18213: 0x5664, 18214: 0x5671, 18215: 0x566B, 18216: 0x567B, 18217: 0x567C, 18218: 0x5685, 18219: 0x5693, 18220: 0x56AF, 18221: 0x56D4, 18222: 0x56D7, 18223: 0x56DD, 18224: 0x56E1, 18225: 0x56F5, 18226: 0x56EB, 18227: 0x56F9, 18228: 0x56FF, 18229: 0x5704, 18230: 0x570A, 18231: 0x5709, 18232: 0x571C, 18233: 0x5E0F, 18234: 0x5E19, 18235: 0x5E14, 18236: 0x5E11, 18237: 0x5E31, 18238: 0x5E3B, 18239: 0x5E3C, 18240: 0x9145, 18241: 0x9147, 18242: 0x9148, 18243: 0x9151, 18244: 0x9153, 18245: 0x9154, 18246: 0x9155, 18247: 0x9156, 18248: 0x9158, 18249: 0x9159, 18250: 0x915B, 18251: 0x915C, 18252: 0x915F, 18253: 0x9160, 18254: 0x9166, 18255: 0x9167, 18256: 0x9168, 18257: 0x916B, 18258: 0x916D, 18259: 0x9173, 18260: 0x917A, 18261: 0x917B, 18262: 0x917C, 18263: 0x9180, 18264: 0x9181, 18265: 0x9182, 18266: 0x9183, 18267: 0x9184, 18268: 0x9186, 18269: 0x9188, 18270: 0x918A, 18271: 0x918E, 18272: 0x918F, 18273: 0x9193, 18274: 0x9194, 18275: 0x9195, 18276: 0x9196, 18277: 0x9197, 18278: 0x9198, 18279: 0x9199, 18280: 0x919C, 18281: 0x919D, 18282: 0x919E, 18283: 0x919F, 18284: 0x91A0, 18285: 0x91A1, 18286: 0x91A4, 18287: 0x91A5, 18288: 0x91A6, 18289: 0x91A7, 18290: 0x91A8, 18291: 0x91A9, 18292: 0x91AB, 18293: 0x91AC, 18294: 0x91B0, 18295: 0x91B1, 18296: 0x91B2, 18297: 0x91B3, 18298: 0x91B6, 18299: 0x91B7, 18300: 0x91B8, 18301: 0x91B9, 18302: 0x91BB, 18303: 0x91BC, 18304: 0x91BD, 18305: 0x91BE, 18306: 0x91BF, 18307: 0x91C0, 18308: 0x91C1, 18309: 0x91C2, 18310: 0x91C3, 18311: 0x91C4, 18312: 0x91C5, 18313: 0x91C6, 18314: 0x91C8, 18315: 0x91CB, 18316: 0x91D0, 18317: 0x91D2, 18318: 0x91D3, 18319: 0x91D4, 18320: 0x91D5, 18321: 0x91D6, 18322: 0x91D7, 18323: 0x91D8, 18324: 0x91D9, 18325: 0x91DA, 18326: 0x91DB, 18327: 0x91DD, 18328: 0x91DE, 18329: 0x91DF, 18330: 0x91E0, 18331: 0x91E1, 18332: 0x91E2, 18333: 0x91E3, 18334: 0x91E4, 18335: 0x91E5, 18336: 0x5E37, 18337: 0x5E44, 18338: 0x5E54, 18339: 0x5E5B, 18340: 0x5E5E, 18341: 0x5E61, 18342: 0x5C8C, 18343: 0x5C7A, 18344: 0x5C8D, 18345: 0x5C90, 18346: 0x5C96, 18347: 0x5C88, 18348: 0x5C98, 18349: 0x5C99, 18350: 0x5C91, 18351: 0x5C9A, 18352: 0x5C9C, 18353: 0x5CB5, 18354: 0x5CA2, 18355: 0x5CBD, 18356: 0x5CAC, 18357: 0x5CAB, 18358: 0x5CB1, 18359: 0x5CA3, 18360: 0x5CC1, 18361: 0x5CB7, 18362: 0x5CC4, 18363: 0x5CD2, 18364: 0x5CE4, 18365: 0x5CCB, 18366: 0x5CE5, 18367: 0x5D02, 18368: 0x5D03, 18369: 0x5D27, 18370: 0x5D26, 18371: 0x5D2E, 18372: 0x5D24, 18373: 0x5D1E, 18374: 0x5D06, 18375: 0x5D1B, 18376: 0x5D58, 18377: 0x5D3E, 18378: 0x5D34, 18379: 0x5D3D, 18380: 0x5D6C, 18381: 0x5D5B, 18382: 0x5D6F, 18383: 0x5D5D, 18384: 0x5D6B, 18385: 0x5D4B, 18386: 0x5D4A, 18387: 0x5D69, 18388: 0x5D74, 18389: 0x5D82, 18390: 0x5D99, 18391: 0x5D9D, 18392: 0x8C73, 18393: 0x5DB7, 18394: 0x5DC5, 18395: 0x5F73, 18396: 0x5F77, 18397: 0x5F82, 18398: 0x5F87, 18399: 0x5F89, 18400: 0x5F8C, 18401: 0x5F95, 18402: 0x5F99, 18403: 0x5F9C, 18404: 0x5FA8, 18405: 0x5FAD, 18406: 0x5FB5, 18407: 0x5FBC, 18408: 0x8862, 18409: 0x5F61, 18410: 0x72AD, 18411: 0x72B0, 18412: 0x72B4, 18413: 0x72B7, 18414: 0x72B8, 18415: 0x72C3, 18416: 0x72C1, 18417: 0x72CE, 18418: 0x72CD, 18419: 0x72D2, 18420: 0x72E8, 18421: 0x72EF, 18422: 0x72E9, 18423: 0x72F2, 18424: 0x72F4, 18425: 0x72F7, 18426: 0x7301, 18427: 0x72F3, 18428: 0x7303, 18429: 0x72FA, 18430: 0x91E6, 18431: 0x91E7, 18432: 0x91E8, 18433: 0x91E9, 18434: 0x91EA, 18435: 0x91EB, 18436: 0x91EC, 18437: 0x91ED, 18438: 0x91EE, 18439: 0x91EF, 18440: 0x91F0, 18441: 0x91F1, 18442: 0x91F2, 18443: 0x91F3, 18444: 0x91F4, 18445: 0x91F5, 18446: 0x91F6, 18447: 0x91F7, 18448: 0x91F8, 18449: 0x91F9, 18450: 0x91FA, 18451: 0x91FB, 18452: 0x91FC, 18453: 0x91FD, 18454: 0x91FE, 18455: 0x91FF, 18456: 0x9200, 18457: 0x9201, 18458: 0x9202, 18459: 0x9203, 18460: 0x9204, 18461: 0x9205, 18462: 0x9206, 18463: 0x9207, 18464: 0x9208, 18465: 0x9209, 18466: 0x920A, 18467: 0x920B, 18468: 0x920C, 18469: 0x920D, 18470: 0x920E, 18471: 0x920F, 18472: 0x9210, 18473: 0x9211, 18474: 0x9212, 18475: 0x9213, 18476: 0x9214, 18477: 0x9215, 18478: 0x9216, 18479: 0x9217, 18480: 0x9218, 18481: 0x9219, 18482: 0x921A, 18483: 0x921B, 18484: 0x921C, 18485: 0x921D, 18486: 0x921E, 18487: 0x921F, 18488: 0x9220, 18489: 0x9221, 18490: 0x9222, 18491: 0x9223, 18492: 0x9224, 18493: 0x9225, 18494: 0x9226, 18495: 0x9227, 18496: 0x9228, 18497: 0x9229, 18498: 0x922A, 18499: 0x922B, 18500: 0x922C, 18501: 0x922D, 18502: 0x922E, 18503: 0x922F, 18504: 0x9230, 18505: 0x9231, 18506: 0x9232, 18507: 0x9233, 18508: 0x9234, 18509: 0x9235, 18510: 0x9236, 18511: 0x9237, 18512: 0x9238, 18513: 0x9239, 18514: 0x923A, 18515: 0x923B, 18516: 0x923C, 18517: 0x923D, 18518: 0x923E, 18519: 0x923F, 18520: 0x9240, 18521: 0x9241, 18522: 0x9242, 18523: 0x9243, 18524: 0x9244, 18525: 0x9245, 18526: 0x72FB, 18527: 0x7317, 18528: 0x7313, 18529: 0x7321, 18530: 0x730A, 18531: 0x731E, 18532: 0x731D, 18533: 0x7315, 18534: 0x7322, 18535: 0x7339, 18536: 0x7325, 18537: 0x732C, 18538: 0x7338, 18539: 0x7331, 18540: 0x7350, 18541: 0x734D, 18542: 0x7357, 18543: 0x7360, 18544: 0x736C, 18545: 0x736F, 18546: 0x737E, 18547: 0x821B, 18548: 0x5925, 18549: 0x98E7, 18550: 0x5924, 18551: 0x5902, 18552: 0x9963, 18553: 0x9967, 18554: 0x9968, 18555: 0x9969, 18556: 0x996A, 18557: 0x996B, 18558: 0x996C, 18559: 0x9974, 18560: 0x9977, 18561: 0x997D, 18562: 0x9980, 18563: 0x9984, 18564: 0x9987, 18565: 0x998A, 18566: 0x998D, 18567: 0x9990, 18568: 0x9991, 18569: 0x9993, 18570: 0x9994, 18571: 0x9995, 18572: 0x5E80, 18573: 0x5E91, 18574: 0x5E8B, 18575: 0x5E96, 18576: 0x5EA5, 18577: 0x5EA0, 18578: 0x5EB9, 18579: 0x5EB5, 18580: 0x5EBE, 18581: 0x5EB3, 18582: 0x8D53, 18583: 0x5ED2, 18584: 0x5ED1, 18585: 0x5EDB, 18586: 0x5EE8, 18587: 0x5EEA, 18588: 0x81BA, 18589: 0x5FC4, 18590: 0x5FC9, 18591: 0x5FD6, 18592: 0x5FCF, 18593: 0x6003, 18594: 0x5FEE, 18595: 0x6004, 18596: 0x5FE1, 18597: 0x5FE4, 18598: 0x5FFE, 18599: 0x6005, 18600: 0x6006, 18601: 0x5FEA, 18602: 0x5FED, 18603: 0x5FF8, 18604: 0x6019, 18605: 0x6035, 18606: 0x6026, 18607: 0x601B, 18608: 0x600F, 18609: 0x600D, 18610: 0x6029, 18611: 0x602B, 18612: 0x600A, 18613: 0x603F, 18614: 0x6021, 18615: 0x6078, 18616: 0x6079, 18617: 0x607B, 18618: 0x607A, 18619: 0x6042, 18620: 0x9246, 18621: 0x9247, 18622: 0x9248, 18623: 0x9249, 18624: 0x924A, 18625: 0x924B, 18626: 0x924C, 18627: 0x924D, 18628: 0x924E, 18629: 0x924F, 18630: 0x9250, 18631: 0x9251, 18632: 0x9252, 18633: 0x9253, 18634: 0x9254, 18635: 0x9255, 18636: 0x9256, 18637: 0x9257, 18638: 0x9258, 18639: 0x9259, 18640: 0x925A, 18641: 0x925B, 18642: 0x925C, 18643: 0x925D, 18644: 0x925E, 18645: 0x925F, 18646: 0x9260, 18647: 0x9261, 18648: 0x9262, 18649: 0x9263, 18650: 0x9264, 18651: 0x9265, 18652: 0x9266, 18653: 0x9267, 18654: 0x9268, 18655: 0x9269, 18656: 0x926A, 18657: 0x926B, 18658: 0x926C, 18659: 0x926D, 18660: 0x926E, 18661: 0x926F, 18662: 0x9270, 18663: 0x9271, 18664: 0x9272, 18665: 0x9273, 18666: 0x9275, 18667: 0x9276, 18668: 0x9277, 18669: 0x9278, 18670: 0x9279, 18671: 0x927A, 18672: 0x927B, 18673: 0x927C, 18674: 0x927D, 18675: 0x927E, 18676: 0x927F, 18677: 0x9280, 18678: 0x9281, 18679: 0x9282, 18680: 0x9283, 18681: 0x9284, 18682: 0x9285, 18683: 0x9286, 18684: 0x9287, 18685: 0x9288, 18686: 0x9289, 18687: 0x928A, 18688: 0x928B, 18689: 0x928C, 18690: 0x928D, 18691: 0x928F, 18692: 0x9290, 18693: 0x9291, 18694: 0x9292, 18695: 0x9293, 18696: 0x9294, 18697: 0x9295, 18698: 0x9296, 18699: 0x9297, 18700: 0x9298, 18701: 0x9299, 18702: 0x929A, 18703: 0x929B, 18704: 0x929C, 18705: 0x929D, 18706: 0x929E, 18707: 0x929F, 18708: 0x92A0, 18709: 0x92A1, 18710: 0x92A2, 18711: 0x92A3, 18712: 0x92A4, 18713: 0x92A5, 18714: 0x92A6, 18715: 0x92A7, 18716: 0x606A, 18717: 0x607D, 18718: 0x6096, 18719: 0x609A, 18720: 0x60AD, 18721: 0x609D, 18722: 0x6083, 18723: 0x6092, 18724: 0x608C, 18725: 0x609B, 18726: 0x60EC, 18727: 0x60BB, 18728: 0x60B1, 18729: 0x60DD, 18730: 0x60D8, 18731: 0x60C6, 18732: 0x60DA, 18733: 0x60B4, 18734: 0x6120, 18735: 0x6126, 18736: 0x6115, 18737: 0x6123, 18738: 0x60F4, 18739: 0x6100, 18740: 0x610E, 18741: 0x612B, 18742: 0x614A, 18743: 0x6175, 18744: 0x61AC, 18745: 0x6194, 18746: 0x61A7, 18747: 0x61B7, 18748: 0x61D4, 18749: 0x61F5, 18750: 0x5FDD, 18751: 0x96B3, 18752: 0x95E9, 18753: 0x95EB, 18754: 0x95F1, 18755: 0x95F3, 18756: 0x95F5, 18757: 0x95F6, 18758: 0x95FC, 18759: 0x95FE, 18760: 0x9603, 18761: 0x9604, 18762: 0x9606, 18763: 0x9608, 18764: 0x960A, 18765: 0x960B, 18766: 0x960C, 18767: 0x960D, 18768: 0x960F, 18769: 0x9612, 18770: 0x9615, 18771: 0x9616, 18772: 0x9617, 18773: 0x9619, 18774: 0x961A, 18775: 0x4E2C, 18776: 0x723F, 18777: 0x6215, 18778: 0x6C35, 18779: 0x6C54, 18780: 0x6C5C, 18781: 0x6C4A, 18782: 0x6CA3, 18783: 0x6C85, 18784: 0x6C90, 18785: 0x6C94, 18786: 0x6C8C, 18787: 0x6C68, 18788: 0x6C69, 18789: 0x6C74, 18790: 0x6C76, 18791: 0x6C86, 18792: 0x6CA9, 18793: 0x6CD0, 18794: 0x6CD4, 18795: 0x6CAD, 18796: 0x6CF7, 18797: 0x6CF8, 18798: 0x6CF1, 18799: 0x6CD7, 18800: 0x6CB2, 18801: 0x6CE0, 18802: 0x6CD6, 18803: 0x6CFA, 18804: 0x6CEB, 18805: 0x6CEE, 18806: 0x6CB1, 18807: 0x6CD3, 18808: 0x6CEF, 18809: 0x6CFE, 18810: 0x92A8, 18811: 0x92A9, 18812: 0x92AA, 18813: 0x92AB, 18814: 0x92AC, 18815: 0x92AD, 18816: 0x92AF, 18817: 0x92B0, 18818: 0x92B1, 18819: 0x92B2, 18820: 0x92B3, 18821: 0x92B4, 18822: 0x92B5, 18823: 0x92B6, 18824: 0x92B7, 18825: 0x92B8, 18826: 0x92B9, 18827: 0x92BA, 18828: 0x92BB, 18829: 0x92BC, 18830: 0x92BD, 18831: 0x92BE, 18832: 0x92BF, 18833: 0x92C0, 18834: 0x92C1, 18835: 0x92C2, 18836: 0x92C3, 18837: 0x92C4, 18838: 0x92C5, 18839: 0x92C6, 18840: 0x92C7, 18841: 0x92C9, 18842: 0x92CA, 18843: 0x92CB, 18844: 0x92CC, 18845: 0x92CD, 18846: 0x92CE, 18847: 0x92CF, 18848: 0x92D0, 18849: 0x92D1, 18850: 0x92D2, 18851: 0x92D3, 18852: 0x92D4, 18853: 0x92D5, 18854: 0x92D6, 18855: 0x92D7, 18856: 0x92D8, 18857: 0x92D9, 18858: 0x92DA, 18859: 0x92DB, 18860: 0x92DC, 18861: 0x92DD, 18862: 0x92DE, 18863: 0x92DF, 18864: 0x92E0, 18865: 0x92E1, 18866: 0x92E2, 18867: 0x92E3, 18868: 0x92E4, 18869: 0x92E5, 18870: 0x92E6, 18871: 0x92E7, 18872: 0x92E8, 18873: 0x92E9, 18874: 0x92EA, 18875: 0x92EB, 18876: 0x92EC, 18877: 0x92ED, 18878: 0x92EE, 18879: 0x92EF, 18880: 0x92F0, 18881: 0x92F1, 18882: 0x92F2, 18883: 0x92F3, 18884: 0x92F4, 18885: 0x92F5, 18886: 0x92F6, 18887: 0x92F7, 18888: 0x92F8, 18889: 0x92F9, 18890: 0x92FA, 18891: 0x92FB, 18892: 0x92FC, 18893: 0x92FD, 18894: 0x92FE, 18895: 0x92FF, 18896: 0x9300, 18897: 0x9301, 18898: 0x9302, 18899: 0x9303, 18900: 0x9304, 18901: 0x9305, 18902: 0x9306, 18903: 0x9307, 18904: 0x9308, 18905: 0x9309, 18906: 0x6D39, 18907: 0x6D27, 18908: 0x6D0C, 18909: 0x6D43, 18910: 0x6D48, 18911: 0x6D07, 18912: 0x6D04, 18913: 0x6D19, 18914: 0x6D0E, 18915: 0x6D2B, 18916: 0x6D4D, 18917: 0x6D2E, 18918: 0x6D35, 18919: 0x6D1A, 18920: 0x6D4F, 18921: 0x6D52, 18922: 0x6D54, 18923: 0x6D33, 18924: 0x6D91, 18925: 0x6D6F, 18926: 0x6D9E, 18927: 0x6DA0, 18928: 0x6D5E, 18929: 0x6D93, 18930: 0x6D94, 18931: 0x6D5C, 18932: 0x6D60, 18933: 0x6D7C, 18934: 0x6D63, 18935: 0x6E1A, 18936: 0x6DC7, 18937: 0x6DC5, 18938: 0x6DDE, 18939: 0x6E0E, 18940: 0x6DBF, 18941: 0x6DE0, 18942: 0x6E11, 18943: 0x6DE6, 18944: 0x6DDD, 18945: 0x6DD9, 18946: 0x6E16, 18947: 0x6DAB, 18948: 0x6E0C, 18949: 0x6DAE, 18950: 0x6E2B, 18951: 0x6E6E, 18952: 0x6E4E, 18953: 0x6E6B, 18954: 0x6EB2, 18955: 0x6E5F, 18956: 0x6E86, 18957: 0x6E53, 18958: 0x6E54, 18959: 0x6E32, 18960: 0x6E25, 18961: 0x6E44, 18962: 0x6EDF, 18963: 0x6EB1, 18964: 0x6E98, 18965: 0x6EE0, 18966: 0x6F2D, 18967: 0x6EE2, 18968: 0x6EA5, 18969: 0x6EA7, 18970: 0x6EBD, 18971: 0x6EBB, 18972: 0x6EB7, 18973: 0x6ED7, 18974: 0x6EB4, 18975: 0x6ECF, 18976: 0x6E8F, 18977: 0x6EC2, 18978: 0x6E9F, 18979: 0x6F62, 18980: 0x6F46, 18981: 0x6F47, 18982: 0x6F24, 18983: 0x6F15, 18984: 0x6EF9, 18985: 0x6F2F, 18986: 0x6F36, 18987: 0x6F4B, 18988: 0x6F74, 18989: 0x6F2A, 18990: 0x6F09, 18991: 0x6F29, 18992: 0x6F89, 18993: 0x6F8D, 18994: 0x6F8C, 18995: 0x6F78, 18996: 0x6F72, 18997: 0x6F7C, 18998: 0x6F7A, 18999: 0x6FD1, 19000: 0x930A, 19001: 0x930B, 19002: 0x930C, 19003: 0x930D, 19004: 0x930E, 19005: 0x930F, 19006: 0x9310, 19007: 0x9311, 19008: 0x9312, 19009: 0x9313, 19010: 0x9314, 19011: 0x9315, 19012: 0x9316, 19013: 0x9317, 19014: 0x9318, 19015: 0x9319, 19016: 0x931A, 19017: 0x931B, 19018: 0x931C, 19019: 0x931D, 19020: 0x931E, 19021: 0x931F, 19022: 0x9320, 19023: 0x9321, 19024: 0x9322, 19025: 0x9323, 19026: 0x9324, 19027: 0x9325, 19028: 0x9326, 19029: 0x9327, 19030: 0x9328, 19031: 0x9329, 19032: 0x932A, 19033: 0x932B, 19034: 0x932C, 19035: 0x932D, 19036: 0x932E, 19037: 0x932F, 19038: 0x9330, 19039: 0x9331, 19040: 0x9332, 19041: 0x9333, 19042: 0x9334, 19043: 0x9335, 19044: 0x9336, 19045: 0x9337, 19046: 0x9338, 19047: 0x9339, 19048: 0x933A, 19049: 0x933B, 19050: 0x933C, 19051: 0x933D, 19052: 0x933F, 19053: 0x9340, 19054: 0x9341, 19055: 0x9342, 19056: 0x9343, 19057: 0x9344, 19058: 0x9345, 19059: 0x9346, 19060: 0x9347, 19061: 0x9348, 19062: 0x9349, 19063: 0x934A, 19064: 0x934B, 19065: 0x934C, 19066: 0x934D, 19067: 0x934E, 19068: 0x934F, 19069: 0x9350, 19070: 0x9351, 19071: 0x9352, 19072: 0x9353, 19073: 0x9354, 19074: 0x9355, 19075: 0x9356, 19076: 0x9357, 19077: 0x9358, 19078: 0x9359, 19079: 0x935A, 19080: 0x935B, 19081: 0x935C, 19082: 0x935D, 19083: 0x935E, 19084: 0x935F, 19085: 0x9360, 19086: 0x9361, 19087: 0x9362, 19088: 0x9363, 19089: 0x9364, 19090: 0x9365, 19091: 0x9366, 19092: 0x9367, 19093: 0x9368, 19094: 0x9369, 19095: 0x936B, 19096: 0x6FC9, 19097: 0x6FA7, 19098: 0x6FB9, 19099: 0x6FB6, 19100: 0x6FC2, 19101: 0x6FE1, 19102: 0x6FEE, 19103: 0x6FDE, 19104: 0x6FE0, 19105: 0x6FEF, 19106: 0x701A, 19107: 0x7023, 19108: 0x701B, 19109: 0x7039, 19110: 0x7035, 19111: 0x704F, 19112: 0x705E, 19113: 0x5B80, 19114: 0x5B84, 19115: 0x5B95, 19116: 0x5B93, 19117: 0x5BA5, 19118: 0x5BB8, 19119: 0x752F, 19120: 0x9A9E, 19121: 0x6434, 19122: 0x5BE4, 19123: 0x5BEE, 19124: 0x8930, 19125: 0x5BF0, 19126: 0x8E47, 19127: 0x8B07, 19128: 0x8FB6, 19129: 0x8FD3, 19130: 0x8FD5, 19131: 0x8FE5, 19132: 0x8FEE, 19133: 0x8FE4, 19134: 0x8FE9, 19135: 0x8FE6, 19136: 0x8FF3, 19137: 0x8FE8, 19138: 0x9005, 19139: 0x9004, 19140: 0x900B, 19141: 0x9026, 19142: 0x9011, 19143: 0x900D, 19144: 0x9016, 19145: 0x9021, 19146: 0x9035, 19147: 0x9036, 19148: 0x902D, 19149: 0x902F, 19150: 0x9044, 19151: 0x9051, 19152: 0x9052, 19153: 0x9050, 19154: 0x9068, 19155: 0x9058, 19156: 0x9062, 19157: 0x905B, 19158: 0x66B9, 19159: 0x9074, 19160: 0x907D, 19161: 0x9082, 19162: 0x9088, 19163: 0x9083, 19164: 0x908B, 19165: 0x5F50, 19166: 0x5F57, 19167: 0x5F56, 19168: 0x5F58, 19169: 0x5C3B, 19170: 0x54AB, 19171: 0x5C50, 19172: 0x5C59, 19173: 0x5B71, 19174: 0x5C63, 19175: 0x5C66, 19176: 0x7FBC, 19177: 0x5F2A, 19178: 0x5F29, 19179: 0x5F2D, 19180: 0x8274, 19181: 0x5F3C, 19182: 0x9B3B, 19183: 0x5C6E, 19184: 0x5981, 19185: 0x5983, 19186: 0x598D, 19187: 0x59A9, 19188: 0x59AA, 19189: 0x59A3, 19190: 0x936C, 19191: 0x936D, 19192: 0x936E, 19193: 0x936F, 19194: 0x9370, 19195: 0x9371, 19196: 0x9372, 19197: 0x9373, 19198: 0x9374, 19199: 0x9375, 19200: 0x9376, 19201: 0x9377, 19202: 0x9378, 19203: 0x9379, 19204: 0x937A, 19205: 0x937B, 19206: 0x937C, 19207: 0x937D, 19208: 0x937E, 19209: 0x937F, 19210: 0x9380, 19211: 0x9381, 19212: 0x9382, 19213: 0x9383, 19214: 0x9384, 19215: 0x9385, 19216: 0x9386, 19217: 0x9387, 19218: 0x9388, 19219: 0x9389, 19220: 0x938A, 19221: 0x938B, 19222: 0x938C, 19223: 0x938D, 19224: 0x938E, 19225: 0x9390, 19226: 0x9391, 19227: 0x9392, 19228: 0x9393, 19229: 0x9394, 19230: 0x9395, 19231: 0x9396, 19232: 0x9397, 19233: 0x9398, 19234: 0x9399, 19235: 0x939A, 19236: 0x939B, 19237: 0x939C, 19238: 0x939D, 19239: 0x939E, 19240: 0x939F, 19241: 0x93A0, 19242: 0x93A1, 19243: 0x93A2, 19244: 0x93A3, 19245: 0x93A4, 19246: 0x93A5, 19247: 0x93A6, 19248: 0x93A7, 19249: 0x93A8, 19250: 0x93A9, 19251: 0x93AA, 19252: 0x93AB, 19253: 0x93AC, 19254: 0x93AD, 19255: 0x93AE, 19256: 0x93AF, 19257: 0x93B0, 19258: 0x93B1, 19259: 0x93B2, 19260: 0x93B3, 19261: 0x93B4, 19262: 0x93B5, 19263: 0x93B6, 19264: 0x93B7, 19265: 0x93B8, 19266: 0x93B9, 19267: 0x93BA, 19268: 0x93BB, 19269: 0x93BC, 19270: 0x93BD, 19271: 0x93BE, 19272: 0x93BF, 19273: 0x93C0, 19274: 0x93C1, 19275: 0x93C2, 19276: 0x93C3, 19277: 0x93C4, 19278: 0x93C5, 19279: 0x93C6, 19280: 0x93C7, 19281: 0x93C8, 19282: 0x93C9, 19283: 0x93CB, 19284: 0x93CC, 19285: 0x93CD, 19286: 0x5997, 19287: 0x59CA, 19288: 0x59AB, 19289: 0x599E, 19290: 0x59A4, 19291: 0x59D2, 19292: 0x59B2, 19293: 0x59AF, 19294: 0x59D7, 19295: 0x59BE, 19296: 0x5A05, 19297: 0x5A06, 19298: 0x59DD, 19299: 0x5A08, 19300: 0x59E3, 19301: 0x59D8, 19302: 0x59F9, 19303: 0x5A0C, 19304: 0x5A09, 19305: 0x5A32, 19306: 0x5A34, 19307: 0x5A11, 19308: 0x5A23, 19309: 0x5A13, 19310: 0x5A40, 19311: 0x5A67, 19312: 0x5A4A, 19313: 0x5A55, 19314: 0x5A3C, 19315: 0x5A62, 19316: 0x5A75, 19317: 0x80EC, 19318: 0x5AAA, 19319: 0x5A9B, 19320: 0x5A77, 19321: 0x5A7A, 19322: 0x5ABE, 19323: 0x5AEB, 19324: 0x5AB2, 19325: 0x5AD2, 19326: 0x5AD4, 19327: 0x5AB8, 19328: 0x5AE0, 19329: 0x5AE3, 19330: 0x5AF1, 19331: 0x5AD6, 19332: 0x5AE6, 19333: 0x5AD8, 19334: 0x5ADC, 19335: 0x5B09, 19336: 0x5B17, 19337: 0x5B16, 19338: 0x5B32, 19339: 0x5B37, 19340: 0x5B40, 19341: 0x5C15, 19342: 0x5C1C, 19343: 0x5B5A, 19344: 0x5B65, 19345: 0x5B73, 19346: 0x5B51, 19347: 0x5B53, 19348: 0x5B62, 19349: 0x9A75, 19350: 0x9A77, 19351: 0x9A78, 19352: 0x9A7A, 19353: 0x9A7F, 19354: 0x9A7D, 19355: 0x9A80, 19356: 0x9A81, 19357: 0x9A85, 19358: 0x9A88, 19359: 0x9A8A, 19360: 0x9A90, 19361: 0x9A92, 19362: 0x9A93, 19363: 0x9A96, 19364: 0x9A98, 19365: 0x9A9B, 19366: 0x9A9C, 19367: 0x9A9D, 19368: 0x9A9F, 19369: 0x9AA0, 19370: 0x9AA2, 19371: 0x9AA3, 19372: 0x9AA5, 19373: 0x9AA7, 19374: 0x7E9F, 19375: 0x7EA1, 19376: 0x7EA3, 19377: 0x7EA5, 19378: 0x7EA8, 19379: 0x7EA9, 19380: 0x93CE, 19381: 0x93CF, 19382: 0x93D0, 19383: 0x93D1, 19384: 0x93D2, 19385: 0x93D3, 19386: 0x93D4, 19387: 0x93D5, 19388: 0x93D7, 19389: 0x93D8, 19390: 0x93D9, 19391: 0x93DA, 19392: 0x93DB, 19393: 0x93DC, 19394: 0x93DD, 19395: 0x93DE, 19396: 0x93DF, 19397: 0x93E0, 19398: 0x93E1, 19399: 0x93E2, 19400: 0x93E3, 19401: 0x93E4, 19402: 0x93E5, 19403: 0x93E6, 19404: 0x93E7, 19405: 0x93E8, 19406: 0x93E9, 19407: 0x93EA, 19408: 0x93EB, 19409: 0x93EC, 19410: 0x93ED, 19411: 0x93EE, 19412: 0x93EF, 19413: 0x93F0, 19414: 0x93F1, 19415: 0x93F2, 19416: 0x93F3, 19417: 0x93F4, 19418: 0x93F5, 19419: 0x93F6, 19420: 0x93F7, 19421: 0x93F8, 19422: 0x93F9, 19423: 0x93FA, 19424: 0x93FB, 19425: 0x93FC, 19426: 0x93FD, 19427: 0x93FE, 19428: 0x93FF, 19429: 0x9400, 19430: 0x9401, 19431: 0x9402, 19432: 0x9403, 19433: 0x9404, 19434: 0x9405, 19435: 0x9406, 19436: 0x9407, 19437: 0x9408, 19438: 0x9409, 19439: 0x940A, 19440: 0x940B, 19441: 0x940C, 19442: 0x940D, 19443: 0x940E, 19444: 0x940F, 19445: 0x9410, 19446: 0x9411, 19447: 0x9412, 19448: 0x9413, 19449: 0x9414, 19450: 0x9415, 19451: 0x9416, 19452: 0x9417, 19453: 0x9418, 19454: 0x9419, 19455: 0x941A, 19456: 0x941B, 19457: 0x941C, 19458: 0x941D, 19459: 0x941E, 19460: 0x941F, 19461: 0x9420, 19462: 0x9421, 19463: 0x9422, 19464: 0x9423, 19465: 0x9424, 19466: 0x9425, 19467: 0x9426, 19468: 0x9427, 19469: 0x9428, 19470: 0x9429, 19471: 0x942A, 19472: 0x942B, 19473: 0x942C, 19474: 0x942D, 19475: 0x942E, 19476: 0x7EAD, 19477: 0x7EB0, 19478: 0x7EBE, 19479: 0x7EC0, 19480: 0x7EC1, 19481: 0x7EC2, 19482: 0x7EC9, 19483: 0x7ECB, 19484: 0x7ECC, 19485: 0x7ED0, 19486: 0x7ED4, 19487: 0x7ED7, 19488: 0x7EDB, 19489: 0x7EE0, 19490: 0x7EE1, 19491: 0x7EE8, 19492: 0x7EEB, 19493: 0x7EEE, 19494: 0x7EEF, 19495: 0x7EF1, 19496: 0x7EF2, 19497: 0x7F0D, 19498: 0x7EF6, 19499: 0x7EFA, 19500: 0x7EFB, 19501: 0x7EFE, 19502: 0x7F01, 19503: 0x7F02, 19504: 0x7F03, 19505: 0x7F07, 19506: 0x7F08, 19507: 0x7F0B, 19508: 0x7F0C, 19509: 0x7F0F, 19510: 0x7F11, 19511: 0x7F12, 19512: 0x7F17, 19513: 0x7F19, 19514: 0x7F1C, 19515: 0x7F1B, 19516: 0x7F1F, 19517: 0x7F21, 19518: 0x7F22, 19519: 0x7F23, 19520: 0x7F24, 19521: 0x7F25, 19522: 0x7F26, 19523: 0x7F27, 19524: 0x7F2A, 19525: 0x7F2B, 19526: 0x7F2C, 19527: 0x7F2D, 19528: 0x7F2F, 19529: 0x7F30, 19530: 0x7F31, 19531: 0x7F32, 19532: 0x7F33, 19533: 0x7F35, 19534: 0x5E7A, 19535: 0x757F, 19536: 0x5DDB, 19537: 0x753E, 19538: 0x9095, 19539: 0x738E, 19540: 0x7391, 19541: 0x73AE, 19542: 0x73A2, 19543: 0x739F, 19544: 0x73CF, 19545: 0x73C2, 19546: 0x73D1, 19547: 0x73B7, 19548: 0x73B3, 19549: 0x73C0, 19550: 0x73C9, 19551: 0x73C8, 19552: 0x73E5, 19553: 0x73D9, 19554: 0x987C, 19555: 0x740A, 19556: 0x73E9, 19557: 0x73E7, 19558: 0x73DE, 19559: 0x73BA, 19560: 0x73F2, 19561: 0x740F, 19562: 0x742A, 19563: 0x745B, 19564: 0x7426, 19565: 0x7425, 19566: 0x7428, 19567: 0x7430, 19568: 0x742E, 19569: 0x742C, 19570: 0x942F, 19571: 0x9430, 19572: 0x9431, 19573: 0x9432, 19574: 0x9433, 19575: 0x9434, 19576: 0x9435, 19577: 0x9436, 19578: 0x9437, 19579: 0x9438, 19580: 0x9439, 19581: 0x943A, 19582: 0x943B, 19583: 0x943C, 19584: 0x943D, 19585: 0x943F, 19586: 0x9440, 19587: 0x9441, 19588: 0x9442, 19589: 0x9443, 19590: 0x9444, 19591: 0x9445, 19592: 0x9446, 19593: 0x9447, 19594: 0x9448, 19595: 0x9449, 19596: 0x944A, 19597: 0x944B, 19598: 0x944C, 19599: 0x944D, 19600: 0x944E, 19601: 0x944F, 19602: 0x9450, 19603: 0x9451, 19604: 0x9452, 19605: 0x9453, 19606: 0x9454, 19607: 0x9455, 19608: 0x9456, 19609: 0x9457, 19610: 0x9458, 19611: 0x9459, 19612: 0x945A, 19613: 0x945B, 19614: 0x945C, 19615: 0x945D, 19616: 0x945E, 19617: 0x945F, 19618: 0x9460, 19619: 0x9461, 19620: 0x9462, 19621: 0x9463, 19622: 0x9464, 19623: 0x9465, 19624: 0x9466, 19625: 0x9467, 19626: 0x9468, 19627: 0x9469, 19628: 0x946A, 19629: 0x946C, 19630: 0x946D, 19631: 0x946E, 19632: 0x946F, 19633: 0x9470, 19634: 0x9471, 19635: 0x9472, 19636: 0x9473, 19637: 0x9474, 19638: 0x9475, 19639: 0x9476, 19640: 0x9477, 19641: 0x9478, 19642: 0x9479, 19643: 0x947A, 19644: 0x947B, 19645: 0x947C, 19646: 0x947D, 19647: 0x947E, 19648: 0x947F, 19649: 0x9480, 19650: 0x9481, 19651: 0x9482, 19652: 0x9483, 19653: 0x9484, 19654: 0x9491, 19655: 0x9496, 19656: 0x9498, 19657: 0x94C7, 19658: 0x94CF, 19659: 0x94D3, 19660: 0x94D4, 19661: 0x94DA, 19662: 0x94E6, 19663: 0x94FB, 19664: 0x951C, 19665: 0x9520, 19666: 0x741B, 19667: 0x741A, 19668: 0x7441, 19669: 0x745C, 19670: 0x7457, 19671: 0x7455, 19672: 0x7459, 19673: 0x7477, 19674: 0x746D, 19675: 0x747E, 19676: 0x749C, 19677: 0x748E, 19678: 0x7480, 19679: 0x7481, 19680: 0x7487, 19681: 0x748B, 19682: 0x749E, 19683: 0x74A8, 19684: 0x74A9, 19685: 0x7490, 19686: 0x74A7, 19687: 0x74D2, 19688: 0x74BA, 19689: 0x97EA, 19690: 0x97EB, 19691: 0x97EC, 19692: 0x674C, 19693: 0x6753, 19694: 0x675E, 19695: 0x6748, 19696: 0x6769, 19697: 0x67A5, 19698: 0x6787, 19699: 0x676A, 19700: 0x6773, 19701: 0x6798, 19702: 0x67A7, 19703: 0x6775, 19704: 0x67A8, 19705: 0x679E, 19706: 0x67AD, 19707: 0x678B, 19708: 0x6777, 19709: 0x677C, 19710: 0x67F0, 19711: 0x6809, 19712: 0x67D8, 19713: 0x680A, 19714: 0x67E9, 19715: 0x67B0, 19716: 0x680C, 19717: 0x67D9, 19718: 0x67B5, 19719: 0x67DA, 19720: 0x67B3, 19721: 0x67DD, 19722: 0x6800, 19723: 0x67C3, 19724: 0x67B8, 19725: 0x67E2, 19726: 0x680E, 19727: 0x67C1, 19728: 0x67FD, 19729: 0x6832, 19730: 0x6833, 19731: 0x6860, 19732: 0x6861, 19733: 0x684E, 19734: 0x6862, 19735: 0x6844, 19736: 0x6864, 19737: 0x6883, 19738: 0x681D, 19739: 0x6855, 19740: 0x6866, 19741: 0x6841, 19742: 0x6867, 19743: 0x6840, 19744: 0x683E, 19745: 0x684A, 19746: 0x6849, 19747: 0x6829, 19748: 0x68B5, 19749: 0x688F, 19750: 0x6874, 19751: 0x6877, 19752: 0x6893, 19753: 0x686B, 19754: 0x68C2, 19755: 0x696E, 19756: 0x68FC, 19757: 0x691F, 19758: 0x6920, 19759: 0x68F9, 19760: 0x9527, 19761: 0x9533, 19762: 0x953D, 19763: 0x9543, 19764: 0x9548, 19765: 0x954B, 19766: 0x9555, 19767: 0x955A, 19768: 0x9560, 19769: 0x956E, 19770: 0x9574, 19771: 0x9575, 19772: 0x9577, 19773: 0x9578, 19774: 0x9579, 19775: 0x957A, 19776: 0x957B, 19777: 0x957C, 19778: 0x957D, 19779: 0x957E, 19780: 0x9580, 19781: 0x9581, 19782: 0x9582, 19783: 0x9583, 19784: 0x9584, 19785: 0x9585, 19786: 0x9586, 19787: 0x9587, 19788: 0x9588, 19789: 0x9589, 19790: 0x958A, 19791: 0x958B, 19792: 0x958C, 19793: 0x958D, 19794: 0x958E, 19795: 0x958F, 19796: 0x9590, 19797: 0x9591, 19798: 0x9592, 19799: 0x9593, 19800: 0x9594, 19801: 0x9595, 19802: 0x9596, 19803: 0x9597, 19804: 0x9598, 19805: 0x9599, 19806: 0x959A, 19807: 0x959B, 19808: 0x959C, 19809: 0x959D, 19810: 0x959E, 19811: 0x959F, 19812: 0x95A0, 19813: 0x95A1, 19814: 0x95A2, 19815: 0x95A3, 19816: 0x95A4, 19817: 0x95A5, 19818: 0x95A6, 19819: 0x95A7, 19820: 0x95A8, 19821: 0x95A9, 19822: 0x95AA, 19823: 0x95AB, 19824: 0x95AC, 19825: 0x95AD, 19826: 0x95AE, 19827: 0x95AF, 19828: 0x95B0, 19829: 0x95B1, 19830: 0x95B2, 19831: 0x95B3, 19832: 0x95B4, 19833: 0x95B5, 19834: 0x95B6, 19835: 0x95B7, 19836: 0x95B8, 19837: 0x95B9, 19838: 0x95BA, 19839: 0x95BB, 19840: 0x95BC, 19841: 0x95BD, 19842: 0x95BE, 19843: 0x95BF, 19844: 0x95C0, 19845: 0x95C1, 19846: 0x95C2, 19847: 0x95C3, 19848: 0x95C4, 19849: 0x95C5, 19850: 0x95C6, 19851: 0x95C7, 19852: 0x95C8, 19853: 0x95C9, 19854: 0x95CA, 19855: 0x95CB, 19856: 0x6924, 19857: 0x68F0, 19858: 0x690B, 19859: 0x6901, 19860: 0x6957, 19861: 0x68E3, 19862: 0x6910, 19863: 0x6971, 19864: 0x6939, 19865: 0x6960, 19866: 0x6942, 19867: 0x695D, 19868: 0x6984, 19869: 0x696B, 19870: 0x6980, 19871: 0x6998, 19872: 0x6978, 19873: 0x6934, 19874: 0x69CC, 19875: 0x6987, 19876: 0x6988, 19877: 0x69CE, 19878: 0x6989, 19879: 0x6966, 19880: 0x6963, 19881: 0x6979, 19882: 0x699B, 19883: 0x69A7, 19884: 0x69BB, 19885: 0x69AB, 19886: 0x69AD, 19887: 0x69D4, 19888: 0x69B1, 19889: 0x69C1, 19890: 0x69CA, 19891: 0x69DF, 19892: 0x6995, 19893: 0x69E0, 19894: 0x698D, 19895: 0x69FF, 19896: 0x6A2F, 19897: 0x69ED, 19898: 0x6A17, 19899: 0x6A18, 19900: 0x6A65, 19901: 0x69F2, 19902: 0x6A44, 19903: 0x6A3E, 19904: 0x6AA0, 19905: 0x6A50, 19906: 0x6A5B, 19907: 0x6A35, 19908: 0x6A8E, 19909: 0x6A79, 19910: 0x6A3D, 19911: 0x6A28, 19912: 0x6A58, 19913: 0x6A7C, 19914: 0x6A91, 19915: 0x6A90, 19916: 0x6AA9, 19917: 0x6A97, 19918: 0x6AAB, 19919: 0x7337, 19920: 0x7352, 19921: 0x6B81, 19922: 0x6B82, 19923: 0x6B87, 19924: 0x6B84, 19925: 0x6B92, 19926: 0x6B93, 19927: 0x6B8D, 19928: 0x6B9A, 19929: 0x6B9B, 19930: 0x6BA1, 19931: 0x6BAA, 19932: 0x8F6B, 19933: 0x8F6D, 19934: 0x8F71, 19935: 0x8F72, 19936: 0x8F73, 19937: 0x8F75, 19938: 0x8F76, 19939: 0x8F78, 19940: 0x8F77, 19941: 0x8F79, 19942: 0x8F7A, 19943: 0x8F7C, 19944: 0x8F7E, 19945: 0x8F81, 19946: 0x8F82, 19947: 0x8F84, 19948: 0x8F87, 19949: 0x8F8B, 19950: 0x95CC, 19951: 0x95CD, 19952: 0x95CE, 19953: 0x95CF, 19954: 0x95D0, 19955: 0x95D1, 19956: 0x95D2, 19957: 0x95D3, 19958: 0x95D4, 19959: 0x95D5, 19960: 0x95D6, 19961: 0x95D7, 19962: 0x95D8, 19963: 0x95D9, 19964: 0x95DA, 19965: 0x95DB, 19966: 0x95DC, 19967: 0x95DD, 19968: 0x95DE, 19969: 0x95DF, 19970: 0x95E0, 19971: 0x95E1, 19972: 0x95E2, 19973: 0x95E3, 19974: 0x95E4, 19975: 0x95E5, 19976: 0x95E6, 19977: 0x95E7, 19978: 0x95EC, 19979: 0x95FF, 19980: 0x9607, 19981: 0x9613, 19982: 0x9618, 19983: 0x961B, 19984: 0x961E, 19985: 0x9620, 19986: 0x9623, 19987: 0x9624, 19988: 0x9625, 19989: 0x9626, 19990: 0x9627, 19991: 0x9628, 19992: 0x9629, 19993: 0x962B, 19994: 0x962C, 19995: 0x962D, 19996: 0x962F, 19997: 0x9630, 19998: 0x9637, 19999: 0x9638, 20000: 0x9639, 20001: 0x963A, 20002: 0x963E, 20003: 0x9641, 20004: 0x9643, 20005: 0x964A, 20006: 0x964E, 20007: 0x964F, 20008: 0x9651, 20009: 0x9652, 20010: 0x9653, 20011: 0x9656, 20012: 0x9657, 20013: 0x9658, 20014: 0x9659, 20015: 0x965A, 20016: 0x965C, 20017: 0x965D, 20018: 0x965E, 20019: 0x9660, 20020: 0x9663, 20021: 0x9665, 20022: 0x9666, 20023: 0x966B, 20024: 0x966D, 20025: 0x966E, 20026: 0x966F, 20027: 0x9670, 20028: 0x9671, 20029: 0x9673, 20030: 0x9678, 20031: 0x9679, 20032: 0x967A, 20033: 0x967B, 20034: 0x967C, 20035: 0x967D, 20036: 0x967E, 20037: 0x967F, 20038: 0x9680, 20039: 0x9681, 20040: 0x9682, 20041: 0x9683, 20042: 0x9684, 20043: 0x9687, 20044: 0x9689, 20045: 0x968A, 20046: 0x8F8D, 20047: 0x8F8E, 20048: 0x8F8F, 20049: 0x8F98, 20050: 0x8F9A, 20051: 0x8ECE, 20052: 0x620B, 20053: 0x6217, 20054: 0x621B, 20055: 0x621F, 20056: 0x6222, 20057: 0x6221, 20058: 0x6225, 20059: 0x6224, 20060: 0x622C, 20061: 0x81E7, 20062: 0x74EF, 20063: 0x74F4, 20064: 0x74FF, 20065: 0x750F, 20066: 0x7511, 20067: 0x7513, 20068: 0x6534, 20069: 0x65EE, 20070: 0x65EF, 20071: 0x65F0, 20072: 0x660A, 20073: 0x6619, 20074: 0x6772, 20075: 0x6603, 20076: 0x6615, 20077: 0x6600, 20078: 0x7085, 20079: 0x66F7, 20080: 0x661D, 20081: 0x6634, 20082: 0x6631, 20083: 0x6636, 20084: 0x6635, 20085: 0x8006, 20086: 0x665F, 20087: 0x6654, 20088: 0x6641, 20089: 0x664F, 20090: 0x6656, 20091: 0x6661, 20092: 0x6657, 20093: 0x6677, 20094: 0x6684, 20095: 0x668C, 20096: 0x66A7, 20097: 0x669D, 20098: 0x66BE, 20099: 0x66DB, 20100: 0x66DC, 20101: 0x66E6, 20102: 0x66E9, 20103: 0x8D32, 20104: 0x8D33, 20105: 0x8D36, 20106: 0x8D3B, 20107: 0x8D3D, 20108: 0x8D40, 20109: 0x8D45, 20110: 0x8D46, 20111: 0x8D48, 20112: 0x8D49, 20113: 0x8D47, 20114: 0x8D4D, 20115: 0x8D55, 20116: 0x8D59, 20117: 0x89C7, 20118: 0x89CA, 20119: 0x89CB, 20120: 0x89CC, 20121: 0x89CE, 20122: 0x89CF, 20123: 0x89D0, 20124: 0x89D1, 20125: 0x726E, 20126: 0x729F, 20127: 0x725D, 20128: 0x7266, 20129: 0x726F, 20130: 0x727E, 20131: 0x727F, 20132: 0x7284, 20133: 0x728B, 20134: 0x728D, 20135: 0x728F, 20136: 0x7292, 20137: 0x6308, 20138: 0x6332, 20139: 0x63B0, 20140: 0x968C, 20141: 0x968E, 20142: 0x9691, 20143: 0x9692, 20144: 0x9693, 20145: 0x9695, 20146: 0x9696, 20147: 0x969A, 20148: 0x969B, 20149: 0x969D, 20150: 0x969E, 20151: 0x969F, 20152: 0x96A0, 20153: 0x96A1, 20154: 0x96A2, 20155: 0x96A3, 20156: 0x96A4, 20157: 0x96A5, 20158: 0x96A6, 20159: 0x96A8, 20160: 0x96A9, 20161: 0x96AA, 20162: 0x96AB, 20163: 0x96AC, 20164: 0x96AD, 20165: 0x96AE, 20166: 0x96AF, 20167: 0x96B1, 20168: 0x96B2, 20169: 0x96B4, 20170: 0x96B5, 20171: 0x96B7, 20172: 0x96B8, 20173: 0x96BA, 20174: 0x96BB, 20175: 0x96BF, 20176: 0x96C2, 20177: 0x96C3, 20178: 0x96C8, 20179: 0x96CA, 20180: 0x96CB, 20181: 0x96D0, 20182: 0x96D1, 20183: 0x96D3, 20184: 0x96D4, 20185: 0x96D6, 20186: 0x96D7, 20187: 0x96D8, 20188: 0x96D9, 20189: 0x96DA, 20190: 0x96DB, 20191: 0x96DC, 20192: 0x96DD, 20193: 0x96DE, 20194: 0x96DF, 20195: 0x96E1, 20196: 0x96E2, 20197: 0x96E3, 20198: 0x96E4, 20199: 0x96E5, 20200: 0x96E6, 20201: 0x96E7, 20202: 0x96EB, 20203: 0x96EC, 20204: 0x96ED, 20205: 0x96EE, 20206: 0x96F0, 20207: 0x96F1, 20208: 0x96F2, 20209: 0x96F4, 20210: 0x96F5, 20211: 0x96F8, 20212: 0x96FA, 20213: 0x96FB, 20214: 0x96FC, 20215: 0x96FD, 20216: 0x96FF, 20217: 0x9702, 20218: 0x9703, 20219: 0x9705, 20220: 0x970A, 20221: 0x970B, 20222: 0x970C, 20223: 0x9710, 20224: 0x9711, 20225: 0x9712, 20226: 0x9714, 20227: 0x9715, 20228: 0x9717, 20229: 0x9718, 20230: 0x9719, 20231: 0x971A, 20232: 0x971B, 20233: 0x971D, 20234: 0x971F, 20235: 0x9720, 20236: 0x643F, 20237: 0x64D8, 20238: 0x8004, 20239: 0x6BEA, 20240: 0x6BF3, 20241: 0x6BFD, 20242: 0x6BF5, 20243: 0x6BF9, 20244: 0x6C05, 20245: 0x6C07, 20246: 0x6C06, 20247: 0x6C0D, 20248: 0x6C15, 20249: 0x6C18, 20250: 0x6C19, 20251: 0x6C1A, 20252: 0x6C21, 20253: 0x6C29, 20254: 0x6C24, 20255: 0x6C2A, 20256: 0x6C32, 20257: 0x6535, 20258: 0x6555, 20259: 0x656B, 20260: 0x724D, 20261: 0x7252, 20262: 0x7256, 20263: 0x7230, 20264: 0x8662, 20265: 0x5216, 20266: 0x809F, 20267: 0x809C, 20268: 0x8093, 20269: 0x80BC, 20270: 0x670A, 20271: 0x80BD, 20272: 0x80B1, 20273: 0x80AB, 20274: 0x80AD, 20275: 0x80B4, 20276: 0x80B7, 20277: 0x80E7, 20278: 0x80E8, 20279: 0x80E9, 20280: 0x80EA, 20281: 0x80DB, 20282: 0x80C2, 20283: 0x80C4, 20284: 0x80D9, 20285: 0x80CD, 20286: 0x80D7, 20287: 0x6710, 20288: 0x80DD, 20289: 0x80EB, 20290: 0x80F1, 20291: 0x80F4, 20292: 0x80ED, 20293: 0x810D, 20294: 0x810E, 20295: 0x80F2, 20296: 0x80FC, 20297: 0x6715, 20298: 0x8112, 20299: 0x8C5A, 20300: 0x8136, 20301: 0x811E, 20302: 0x812C, 20303: 0x8118, 20304: 0x8132, 20305: 0x8148, 20306: 0x814C, 20307: 0x8153, 20308: 0x8174, 20309: 0x8159, 20310: 0x815A, 20311: 0x8171, 20312: 0x8160, 20313: 0x8169, 20314: 0x817C, 20315: 0x817D, 20316: 0x816D, 20317: 0x8167, 20318: 0x584D, 20319: 0x5AB5, 20320: 0x8188, 20321: 0x8182, 20322: 0x8191, 20323: 0x6ED5, 20324: 0x81A3, 20325: 0x81AA, 20326: 0x81CC, 20327: 0x6726, 20328: 0x81CA, 20329: 0x81BB, 20330: 0x9721, 20331: 0x9722, 20332: 0x9723, 20333: 0x9724, 20334: 0x9725, 20335: 0x9726, 20336: 0x9727, 20337: 0x9728, 20338: 0x9729, 20339: 0x972B, 20340: 0x972C, 20341: 0x972E, 20342: 0x972F, 20343: 0x9731, 20344: 0x9733, 20345: 0x9734, 20346: 0x9735, 20347: 0x9736, 20348: 0x9737, 20349: 0x973A, 20350: 0x973B, 20351: 0x973C, 20352: 0x973D, 20353: 0x973F, 20354: 0x9740, 20355: 0x9741, 20356: 0x9742, 20357: 0x9743, 20358: 0x9744, 20359: 0x9745, 20360: 0x9746, 20361: 0x9747, 20362: 0x9748, 20363: 0x9749, 20364: 0x974A, 20365: 0x974B, 20366: 0x974C, 20367: 0x974D, 20368: 0x974E, 20369: 0x974F, 20370: 0x9750, 20371: 0x9751, 20372: 0x9754, 20373: 0x9755, 20374: 0x9757, 20375: 0x9758, 20376: 0x975A, 20377: 0x975C, 20378: 0x975D, 20379: 0x975F, 20380: 0x9763, 20381: 0x9764, 20382: 0x9766, 20383: 0x9767, 20384: 0x9768, 20385: 0x976A, 20386: 0x976B, 20387: 0x976C, 20388: 0x976D, 20389: 0x976E, 20390: 0x976F, 20391: 0x9770, 20392: 0x9771, 20393: 0x9772, 20394: 0x9775, 20395: 0x9777, 20396: 0x9778, 20397: 0x9779, 20398: 0x977A, 20399: 0x977B, 20400: 0x977D, 20401: 0x977E, 20402: 0x977F, 20403: 0x9780, 20404: 0x9781, 20405: 0x9782, 20406: 0x9783, 20407: 0x9784, 20408: 0x9786, 20409: 0x9787, 20410: 0x9788, 20411: 0x9789, 20412: 0x978A, 20413: 0x978C, 20414: 0x978E, 20415: 0x978F, 20416: 0x9790, 20417: 0x9793, 20418: 0x9795, 20419: 0x9796, 20420: 0x9797, 20421: 0x9799, 20422: 0x979A, 20423: 0x979B, 20424: 0x979C, 20425: 0x979D, 20426: 0x81C1, 20427: 0x81A6, 20428: 0x6B24, 20429: 0x6B37, 20430: 0x6B39, 20431: 0x6B43, 20432: 0x6B46, 20433: 0x6B59, 20434: 0x98D1, 20435: 0x98D2, 20436: 0x98D3, 20437: 0x98D5, 20438: 0x98D9, 20439: 0x98DA, 20440: 0x6BB3, 20441: 0x5F40, 20442: 0x6BC2, 20443: 0x89F3, 20444: 0x6590, 20445: 0x9F51, 20446: 0x6593, 20447: 0x65BC, 20448: 0x65C6, 20449: 0x65C4, 20450: 0x65C3, 20451: 0x65CC, 20452: 0x65CE, 20453: 0x65D2, 20454: 0x65D6, 20455: 0x7080, 20456: 0x709C, 20457: 0x7096, 20458: 0x709D, 20459: 0x70BB, 20460: 0x70C0, 20461: 0x70B7, 20462: 0x70AB, 20463: 0x70B1, 20464: 0x70E8, 20465: 0x70CA, 20466: 0x7110, 20467: 0x7113, 20468: 0x7116, 20469: 0x712F, 20470: 0x7131, 20471: 0x7173, 20472: 0x715C, 20473: 0x7168, 20474: 0x7145, 20475: 0x7172, 20476: 0x714A, 20477: 0x7178, 20478: 0x717A, 20479: 0x7198, 20480: 0x71B3, 20481: 0x71B5, 20482: 0x71A8, 20483: 0x71A0, 20484: 0x71E0, 20485: 0x71D4, 20486: 0x71E7, 20487: 0x71F9, 20488: 0x721D, 20489: 0x7228, 20490: 0x706C, 20491: 0x7118, 20492: 0x7166, 20493: 0x71B9, 20494: 0x623E, 20495: 0x623D, 20496: 0x6243, 20497: 0x6248, 20498: 0x6249, 20499: 0x793B, 20500: 0x7940, 20501: 0x7946, 20502: 0x7949, 20503: 0x795B, 20504: 0x795C, 20505: 0x7953, 20506: 0x795A, 20507: 0x7962, 20508: 0x7957, 20509: 0x7960, 20510: 0x796F, 20511: 0x7967, 20512: 0x797A, 20513: 0x7985, 20514: 0x798A, 20515: 0x799A, 20516: 0x79A7, 20517: 0x79B3, 20518: 0x5FD1, 20519: 0x5FD0, 20520: 0x979E, 20521: 0x979F, 20522: 0x97A1, 20523: 0x97A2, 20524: 0x97A4, 20525: 0x97A5, 20526: 0x97A6, 20527: 0x97A7, 20528: 0x97A8, 20529: 0x97A9, 20530: 0x97AA, 20531: 0x97AC, 20532: 0x97AE, 20533: 0x97B0, 20534: 0x97B1, 20535: 0x97B3, 20536: 0x97B5, 20537: 0x97B6, 20538: 0x97B7, 20539: 0x97B8, 20540: 0x97B9, 20541: 0x97BA, 20542: 0x97BB, 20543: 0x97BC, 20544: 0x97BD, 20545: 0x97BE, 20546: 0x97BF, 20547: 0x97C0, 20548: 0x97C1, 20549: 0x97C2, 20550: 0x97C3, 20551: 0x97C4, 20552: 0x97C5, 20553: 0x97C6, 20554: 0x97C7, 20555: 0x97C8, 20556: 0x97C9, 20557: 0x97CA, 20558: 0x97CB, 20559: 0x97CC, 20560: 0x97CD, 20561: 0x97CE, 20562: 0x97CF, 20563: 0x97D0, 20564: 0x97D1, 20565: 0x97D2, 20566: 0x97D3, 20567: 0x97D4, 20568: 0x97D5, 20569: 0x97D6, 20570: 0x97D7, 20571: 0x97D8, 20572: 0x97D9, 20573: 0x97DA, 20574: 0x97DB, 20575: 0x97DC, 20576: 0x97DD, 20577: 0x97DE, 20578: 0x97DF, 20579: 0x97E0, 20580: 0x97E1, 20581: 0x97E2, 20582: 0x97E3, 20583: 0x97E4, 20584: 0x97E5, 20585: 0x97E8, 20586: 0x97EE, 20587: 0x97EF, 20588: 0x97F0, 20589: 0x97F1, 20590: 0x97F2, 20591: 0x97F4, 20592: 0x97F7, 20593: 0x97F8, 20594: 0x97F9, 20595: 0x97FA, 20596: 0x97FB, 20597: 0x97FC, 20598: 0x97FD, 20599: 0x97FE, 20600: 0x97FF, 20601: 0x9800, 20602: 0x9801, 20603: 0x9802, 20604: 0x9803, 20605: 0x9804, 20606: 0x9805, 20607: 0x9806, 20608: 0x9807, 20609: 0x9808, 20610: 0x9809, 20611: 0x980A, 20612: 0x980B, 20613: 0x980C, 20614: 0x980D, 20615: 0x980E, 20616: 0x603C, 20617: 0x605D, 20618: 0x605A, 20619: 0x6067, 20620: 0x6041, 20621: 0x6059, 20622: 0x6063, 20623: 0x60AB, 20624: 0x6106, 20625: 0x610D, 20626: 0x615D, 20627: 0x61A9, 20628: 0x619D, 20629: 0x61CB, 20630: 0x61D1, 20631: 0x6206, 20632: 0x8080, 20633: 0x807F, 20634: 0x6C93, 20635: 0x6CF6, 20636: 0x6DFC, 20637: 0x77F6, 20638: 0x77F8, 20639: 0x7800, 20640: 0x7809, 20641: 0x7817, 20642: 0x7818, 20643: 0x7811, 20644: 0x65AB, 20645: 0x782D, 20646: 0x781C, 20647: 0x781D, 20648: 0x7839, 20649: 0x783A, 20650: 0x783B, 20651: 0x781F, 20652: 0x783C, 20653: 0x7825, 20654: 0x782C, 20655: 0x7823, 20656: 0x7829, 20657: 0x784E, 20658: 0x786D, 20659: 0x7856, 20660: 0x7857, 20661: 0x7826, 20662: 0x7850, 20663: 0x7847, 20664: 0x784C, 20665: 0x786A, 20666: 0x789B, 20667: 0x7893, 20668: 0x789A, 20669: 0x7887, 20670: 0x789C, 20671: 0x78A1, 20672: 0x78A3, 20673: 0x78B2, 20674: 0x78B9, 20675: 0x78A5, 20676: 0x78D4, 20677: 0x78D9, 20678: 0x78C9, 20679: 0x78EC, 20680: 0x78F2, 20681: 0x7905, 20682: 0x78F4, 20683: 0x7913, 20684: 0x7924, 20685: 0x791E, 20686: 0x7934, 20687: 0x9F9B, 20688: 0x9EF9, 20689: 0x9EFB, 20690: 0x9EFC, 20691: 0x76F1, 20692: 0x7704, 20693: 0x770D, 20694: 0x76F9, 20695: 0x7707, 20696: 0x7708, 20697: 0x771A, 20698: 0x7722, 20699: 0x7719, 20700: 0x772D, 20701: 0x7726, 20702: 0x7735, 20703: 0x7738, 20704: 0x7750, 20705: 0x7751, 20706: 0x7747, 20707: 0x7743, 20708: 0x775A, 20709: 0x7768, 20710: 0x980F, 20711: 0x9810, 20712: 0x9811, 20713: 0x9812, 20714: 0x9813, 20715: 0x9814, 20716: 0x9815, 20717: 0x9816, 20718: 0x9817, 20719: 0x9818, 20720: 0x9819, 20721: 0x981A, 20722: 0x981B, 20723: 0x981C, 20724: 0x981D, 20725: 0x981E, 20726: 0x981F, 20727: 0x9820, 20728: 0x9821, 20729: 0x9822, 20730: 0x9823, 20731: 0x9824, 20732: 0x9825, 20733: 0x9826, 20734: 0x9827, 20735: 0x9828, 20736: 0x9829, 20737: 0x982A, 20738: 0x982B, 20739: 0x982C, 20740: 0x982D, 20741: 0x982E, 20742: 0x982F, 20743: 0x9830, 20744: 0x9831, 20745: 0x9832, 20746: 0x9833, 20747: 0x9834, 20748: 0x9835, 20749: 0x9836, 20750: 0x9837, 20751: 0x9838, 20752: 0x9839, 20753: 0x983A, 20754: 0x983B, 20755: 0x983C, 20756: 0x983D, 20757: 0x983E, 20758: 0x983F, 20759: 0x9840, 20760: 0x9841, 20761: 0x9842, 20762: 0x9843, 20763: 0x9844, 20764: 0x9845, 20765: 0x9846, 20766: 0x9847, 20767: 0x9848, 20768: 0x9849, 20769: 0x984A, 20770: 0x984B, 20771: 0x984C, 20772: 0x984D, 20773: 0x984E, 20774: 0x984F, 20775: 0x9850, 20776: 0x9851, 20777: 0x9852, 20778: 0x9853, 20779: 0x9854, 20780: 0x9855, 20781: 0x9856, 20782: 0x9857, 20783: 0x9858, 20784: 0x9859, 20785: 0x985A, 20786: 0x985B, 20787: 0x985C, 20788: 0x985D, 20789: 0x985E, 20790: 0x985F, 20791: 0x9860, 20792: 0x9861, 20793: 0x9862, 20794: 0x9863, 20795: 0x9864, 20796: 0x9865, 20797: 0x9866, 20798: 0x9867, 20799: 0x9868, 20800: 0x9869, 20801: 0x986A, 20802: 0x986B, 20803: 0x986C, 20804: 0x986D, 20805: 0x986E, 20806: 0x7762, 20807: 0x7765, 20808: 0x777F, 20809: 0x778D, 20810: 0x777D, 20811: 0x7780, 20812: 0x778C, 20813: 0x7791, 20814: 0x779F, 20815: 0x77A0, 20816: 0x77B0, 20817: 0x77B5, 20818: 0x77BD, 20819: 0x753A, 20820: 0x7540, 20821: 0x754E, 20822: 0x754B, 20823: 0x7548, 20824: 0x755B, 20825: 0x7572, 20826: 0x7579, 20827: 0x7583, 20828: 0x7F58, 20829: 0x7F61, 20830: 0x7F5F, 20831: 0x8A48, 20832: 0x7F68, 20833: 0x7F74, 20834: 0x7F71, 20835: 0x7F79, 20836: 0x7F81, 20837: 0x7F7E, 20838: 0x76CD, 20839: 0x76E5, 20840: 0x8832, 20841: 0x9485, 20842: 0x9486, 20843: 0x9487, 20844: 0x948B, 20845: 0x948A, 20846: 0x948C, 20847: 0x948D, 20848: 0x948F, 20849: 0x9490, 20850: 0x9494, 20851: 0x9497, 20852: 0x9495, 20853: 0x949A, 20854: 0x949B, 20855: 0x949C, 20856: 0x94A3, 20857: 0x94A4, 20858: 0x94AB, 20859: 0x94AA, 20860: 0x94AD, 20861: 0x94AC, 20862: 0x94AF, 20863: 0x94B0, 20864: 0x94B2, 20865: 0x94B4, 20866: 0x94B6, 20867: 0x94B7, 20868: 0x94B8, 20869: 0x94B9, 20870: 0x94BA, 20871: 0x94BC, 20872: 0x94BD, 20873: 0x94BF, 20874: 0x94C4, 20875: 0x94C8, 20876: 0x94C9, 20877: 0x94CA, 20878: 0x94CB, 20879: 0x94CC, 20880: 0x94CD, 20881: 0x94CE, 20882: 0x94D0, 20883: 0x94D1, 20884: 0x94D2, 20885: 0x94D5, 20886: 0x94D6, 20887: 0x94D7, 20888: 0x94D9, 20889: 0x94D8, 20890: 0x94DB, 20891: 0x94DE, 20892: 0x94DF, 20893: 0x94E0, 20894: 0x94E2, 20895: 0x94E4, 20896: 0x94E5, 20897: 0x94E7, 20898: 0x94E8, 20899: 0x94EA, 20900: 0x986F, 20901: 0x9870, 20902: 0x9871, 20903: 0x9872, 20904: 0x9873, 20905: 0x9874, 20906: 0x988B, 20907: 0x988E, 20908: 0x9892, 20909: 0x9895, 20910: 0x9899, 20911: 0x98A3, 20912: 0x98A8, 20913: 0x98A9, 20914: 0x98AA, 20915: 0x98AB, 20916: 0x98AC, 20917: 0x98AD, 20918: 0x98AE, 20919: 0x98AF, 20920: 0x98B0, 20921: 0x98B1, 20922: 0x98B2, 20923: 0x98B3, 20924: 0x98B4, 20925: 0x98B5, 20926: 0x98B6, 20927: 0x98B7, 20928: 0x98B8, 20929: 0x98B9, 20930: 0x98BA, 20931: 0x98BB, 20932: 0x98BC, 20933: 0x98BD, 20934: 0x98BE, 20935: 0x98BF, 20936: 0x98C0, 20937: 0x98C1, 20938: 0x98C2, 20939: 0x98C3, 20940: 0x98C4, 20941: 0x98C5, 20942: 0x98C6, 20943: 0x98C7, 20944: 0x98C8, 20945: 0x98C9, 20946: 0x98CA, 20947: 0x98CB, 20948: 0x98CC, 20949: 0x98CD, 20950: 0x98CF, 20951: 0x98D0, 20952: 0x98D4, 20953: 0x98D6, 20954: 0x98D7, 20955: 0x98DB, 20956: 0x98DC, 20957: 0x98DD, 20958: 0x98E0, 20959: 0x98E1, 20960: 0x98E2, 20961: 0x98E3, 20962: 0x98E4, 20963: 0x98E5, 20964: 0x98E6, 20965: 0x98E9, 20966: 0x98EA, 20967: 0x98EB, 20968: 0x98EC, 20969: 0x98ED, 20970: 0x98EE, 20971: 0x98EF, 20972: 0x98F0, 20973: 0x98F1, 20974: 0x98F2, 20975: 0x98F3, 20976: 0x98F4, 20977: 0x98F5, 20978: 0x98F6, 20979: 0x98F7, 20980: 0x98F8, 20981: 0x98F9, 20982: 0x98FA, 20983: 0x98FB, 20984: 0x98FC, 20985: 0x98FD, 20986: 0x98FE, 20987: 0x98FF, 20988: 0x9900, 20989: 0x9901, 20990: 0x9902, 20991: 0x9903, 20992: 0x9904, 20993: 0x9905, 20994: 0x9906, 20995: 0x9907, 20996: 0x94E9, 20997: 0x94EB, 20998: 0x94EE, 20999: 0x94EF, 21000: 0x94F3, 21001: 0x94F4, 21002: 0x94F5, 21003: 0x94F7, 21004: 0x94F9, 21005: 0x94FC, 21006: 0x94FD, 21007: 0x94FF, 21008: 0x9503, 21009: 0x9502, 21010: 0x9506, 21011: 0x9507, 21012: 0x9509, 21013: 0x950A, 21014: 0x950D, 21015: 0x950E, 21016: 0x950F, 21017: 0x9512, 21018: 0x9513, 21019: 0x9514, 21020: 0x9515, 21021: 0x9516, 21022: 0x9518, 21023: 0x951B, 21024: 0x951D, 21025: 0x951E, 21026: 0x951F, 21027: 0x9522, 21028: 0x952A, 21029: 0x952B, 21030: 0x9529, 21031: 0x952C, 21032: 0x9531, 21033: 0x9532, 21034: 0x9534, 21035: 0x9536, 21036: 0x9537, 21037: 0x9538, 21038: 0x953C, 21039: 0x953E, 21040: 0x953F, 21041: 0x9542, 21042: 0x9535, 21043: 0x9544, 21044: 0x9545, 21045: 0x9546, 21046: 0x9549, 21047: 0x954C, 21048: 0x954E, 21049: 0x954F, 21050: 0x9552, 21051: 0x9553, 21052: 0x9554, 21053: 0x9556, 21054: 0x9557, 21055: 0x9558, 21056: 0x9559, 21057: 0x955B, 21058: 0x955E, 21059: 0x955F, 21060: 0x955D, 21061: 0x9561, 21062: 0x9562, 21063: 0x9564, 21064: 0x9565, 21065: 0x9566, 21066: 0x9567, 21067: 0x9568, 21068: 0x9569, 21069: 0x956A, 21070: 0x956B, 21071: 0x956C, 21072: 0x956F, 21073: 0x9571, 21074: 0x9572, 21075: 0x9573, 21076: 0x953A, 21077: 0x77E7, 21078: 0x77EC, 21079: 0x96C9, 21080: 0x79D5, 21081: 0x79ED, 21082: 0x79E3, 21083: 0x79EB, 21084: 0x7A06, 21085: 0x5D47, 21086: 0x7A03, 21087: 0x7A02, 21088: 0x7A1E, 21089: 0x7A14, 21090: 0x9908, 21091: 0x9909, 21092: 0x990A, 21093: 0x990B, 21094: 0x990C, 21095: 0x990E, 21096: 0x990F, 21097: 0x9911, 21098: 0x9912, 21099: 0x9913, 21100: 0x9914, 21101: 0x9915, 21102: 0x9916, 21103: 0x9917, 21104: 0x9918, 21105: 0x9919, 21106: 0x991A, 21107: 0x991B, 21108: 0x991C, 21109: 0x991D, 21110: 0x991E, 21111: 0x991F, 21112: 0x9920, 21113: 0x9921, 21114: 0x9922, 21115: 0x9923, 21116: 0x9924, 21117: 0x9925, 21118: 0x9926, 21119: 0x9927, 21120: 0x9928, 21121: 0x9929, 21122: 0x992A, 21123: 0x992B, 21124: 0x992C, 21125: 0x992D, 21126: 0x992F, 21127: 0x9930, 21128: 0x9931, 21129: 0x9932, 21130: 0x9933, 21131: 0x9934, 21132: 0x9935, 21133: 0x9936, 21134: 0x9937, 21135: 0x9938, 21136: 0x9939, 21137: 0x993A, 21138: 0x993B, 21139: 0x993C, 21140: 0x993D, 21141: 0x993E, 21142: 0x993F, 21143: 0x9940, 21144: 0x9941, 21145: 0x9942, 21146: 0x9943, 21147: 0x9944, 21148: 0x9945, 21149: 0x9946, 21150: 0x9947, 21151: 0x9948, 21152: 0x9949, 21153: 0x994A, 21154: 0x994B, 21155: 0x994C, 21156: 0x994D, 21157: 0x994E, 21158: 0x994F, 21159: 0x9950, 21160: 0x9951, 21161: 0x9952, 21162: 0x9953, 21163: 0x9956, 21164: 0x9957, 21165: 0x9958, 21166: 0x9959, 21167: 0x995A, 21168: 0x995B, 21169: 0x995C, 21170: 0x995D, 21171: 0x995E, 21172: 0x995F, 21173: 0x9960, 21174: 0x9961, 21175: 0x9962, 21176: 0x9964, 21177: 0x9966, 21178: 0x9973, 21179: 0x9978, 21180: 0x9979, 21181: 0x997B, 21182: 0x997E, 21183: 0x9982, 21184: 0x9983, 21185: 0x9989, 21186: 0x7A39, 21187: 0x7A37, 21188: 0x7A51, 21189: 0x9ECF, 21190: 0x99A5, 21191: 0x7A70, 21192: 0x7688, 21193: 0x768E, 21194: 0x7693, 21195: 0x7699, 21196: 0x76A4, 21197: 0x74DE, 21198: 0x74E0, 21199: 0x752C, 21200: 0x9E20, 21201: 0x9E22, 21202: 0x9E28, 21203: 0x9E29, 21204: 0x9E2A, 21205: 0x9E2B, 21206: 0x9E2C, 21207: 0x9E32, 21208: 0x9E31, 21209: 0x9E36, 21210: 0x9E38, 21211: 0x9E37, 21212: 0x9E39, 21213: 0x9E3A, 21214: 0x9E3E, 21215: 0x9E41, 21216: 0x9E42, 21217: 0x9E44, 21218: 0x9E46, 21219: 0x9E47, 21220: 0x9E48, 21221: 0x9E49, 21222: 0x9E4B, 21223: 0x9E4C, 21224: 0x9E4E, 21225: 0x9E51, 21226: 0x9E55, 21227: 0x9E57, 21228: 0x9E5A, 21229: 0x9E5B, 21230: 0x9E5C, 21231: 0x9E5E, 21232: 0x9E63, 21233: 0x9E66, 21234: 0x9E67, 21235: 0x9E68, 21236: 0x9E69, 21237: 0x9E6A, 21238: 0x9E6B, 21239: 0x9E6C, 21240: 0x9E71, 21241: 0x9E6D, 21242: 0x9E73, 21243: 0x7592, 21244: 0x7594, 21245: 0x7596, 21246: 0x75A0, 21247: 0x759D, 21248: 0x75AC, 21249: 0x75A3, 21250: 0x75B3, 21251: 0x75B4, 21252: 0x75B8, 21253: 0x75C4, 21254: 0x75B1, 21255: 0x75B0, 21256: 0x75C3, 21257: 0x75C2, 21258: 0x75D6, 21259: 0x75CD, 21260: 0x75E3, 21261: 0x75E8, 21262: 0x75E6, 21263: 0x75E4, 21264: 0x75EB, 21265: 0x75E7, 21266: 0x7603, 21267: 0x75F1, 21268: 0x75FC, 21269: 0x75FF, 21270: 0x7610, 21271: 0x7600, 21272: 0x7605, 21273: 0x760C, 21274: 0x7617, 21275: 0x760A, 21276: 0x7625, 21277: 0x7618, 21278: 0x7615, 21279: 0x7619, 21280: 0x998C, 21281: 0x998E, 21282: 0x999A, 21283: 0x999B, 21284: 0x999C, 21285: 0x999D, 21286: 0x999E, 21287: 0x999F, 21288: 0x99A0, 21289: 0x99A1, 21290: 0x99A2, 21291: 0x99A3, 21292: 0x99A4, 21293: 0x99A6, 21294: 0x99A7, 21295: 0x99A9, 21296: 0x99AA, 21297: 0x99AB, 21298: 0x99AC, 21299: 0x99AD, 21300: 0x99AE, 21301: 0x99AF, 21302: 0x99B0, 21303: 0x99B1, 21304: 0x99B2, 21305: 0x99B3, 21306: 0x99B4, 21307: 0x99B5, 21308: 0x99B6, 21309: 0x99B7, 21310: 0x99B8, 21311: 0x99B9, 21312: 0x99BA, 21313: 0x99BB, 21314: 0x99BC, 21315: 0x99BD, 21316: 0x99BE, 21317: 0x99BF, 21318: 0x99C0, 21319: 0x99C1, 21320: 0x99C2, 21321: 0x99C3, 21322: 0x99C4, 21323: 0x99C5, 21324: 0x99C6, 21325: 0x99C7, 21326: 0x99C8, 21327: 0x99C9, 21328: 0x99CA, 21329: 0x99CB, 21330: 0x99CC, 21331: 0x99CD, 21332: 0x99CE, 21333: 0x99CF, 21334: 0x99D0, 21335: 0x99D1, 21336: 0x99D2, 21337: 0x99D3, 21338: 0x99D4, 21339: 0x99D5, 21340: 0x99D6, 21341: 0x99D7, 21342: 0x99D8, 21343: 0x99D9, 21344: 0x99DA, 21345: 0x99DB, 21346: 0x99DC, 21347: 0x99DD, 21348: 0x99DE, 21349: 0x99DF, 21350: 0x99E0, 21351: 0x99E1, 21352: 0x99E2, 21353: 0x99E3, 21354: 0x99E4, 21355: 0x99E5, 21356: 0x99E6, 21357: 0x99E7, 21358: 0x99E8, 21359: 0x99E9, 21360: 0x99EA, 21361: 0x99EB, 21362: 0x99EC, 21363: 0x99ED, 21364: 0x99EE, 21365: 0x99EF, 21366: 0x99F0, 21367: 0x99F1, 21368: 0x99F2, 21369: 0x99F3, 21370: 0x99F4, 21371: 0x99F5, 21372: 0x99F6, 21373: 0x99F7, 21374: 0x99F8, 21375: 0x99F9, 21376: 0x761B, 21377: 0x763C, 21378: 0x7622, 21379: 0x7620, 21380: 0x7640, 21381: 0x762D, 21382: 0x7630, 21383: 0x763F, 21384: 0x7635, 21385: 0x7643, 21386: 0x763E, 21387: 0x7633, 21388: 0x764D, 21389: 0x765E, 21390: 0x7654, 21391: 0x765C, 21392: 0x7656, 21393: 0x766B, 21394: 0x766F, 21395: 0x7FCA, 21396: 0x7AE6, 21397: 0x7A78, 21398: 0x7A79, 21399: 0x7A80, 21400: 0x7A86, 21401: 0x7A88, 21402: 0x7A95, 21403: 0x7AA6, 21404: 0x7AA0, 21405: 0x7AAC, 21406: 0x7AA8, 21407: 0x7AAD, 21408: 0x7AB3, 21409: 0x8864, 21410: 0x8869, 21411: 0x8872, 21412: 0x887D, 21413: 0x887F, 21414: 0x8882, 21415: 0x88A2, 21416: 0x88C6, 21417: 0x88B7, 21418: 0x88BC, 21419: 0x88C9, 21420: 0x88E2, 21421: 0x88CE, 21422: 0x88E3, 21423: 0x88E5, 21424: 0x88F1, 21425: 0x891A, 21426: 0x88FC, 21427: 0x88E8, 21428: 0x88FE, 21429: 0x88F0, 21430: 0x8921, 21431: 0x8919, 21432: 0x8913, 21433: 0x891B, 21434: 0x890A, 21435: 0x8934, 21436: 0x892B, 21437: 0x8936, 21438: 0x8941, 21439: 0x8966, 21440: 0x897B, 21441: 0x758B, 21442: 0x80E5, 21443: 0x76B2, 21444: 0x76B4, 21445: 0x77DC, 21446: 0x8012, 21447: 0x8014, 21448: 0x8016, 21449: 0x801C, 21450: 0x8020, 21451: 0x8022, 21452: 0x8025, 21453: 0x8026, 21454: 0x8027, 21455: 0x8029, 21456: 0x8028, 21457: 0x8031, 21458: 0x800B, 21459: 0x8035, 21460: 0x8043, 21461: 0x8046, 21462: 0x804D, 21463: 0x8052, 21464: 0x8069, 21465: 0x8071, 21466: 0x8983, 21467: 0x9878, 21468: 0x9880, 21469: 0x9883, 21470: 0x99FA, 21471: 0x99FB, 21472: 0x99FC, 21473: 0x99FD, 21474: 0x99FE, 21475: 0x99FF, 21476: 0x9A00, 21477: 0x9A01, 21478: 0x9A02, 21479: 0x9A03, 21480: 0x9A04, 21481: 0x9A05, 21482: 0x9A06, 21483: 0x9A07, 21484: 0x9A08, 21485: 0x9A09, 21486: 0x9A0A, 21487: 0x9A0B, 21488: 0x9A0C, 21489: 0x9A0D, 21490: 0x9A0E, 21491: 0x9A0F, 21492: 0x9A10, 21493: 0x9A11, 21494: 0x9A12, 21495: 0x9A13, 21496: 0x9A14, 21497: 0x9A15, 21498: 0x9A16, 21499: 0x9A17, 21500: 0x9A18, 21501: 0x9A19, 21502: 0x9A1A, 21503: 0x9A1B, 21504: 0x9A1C, 21505: 0x9A1D, 21506: 0x9A1E, 21507: 0x9A1F, 21508: 0x9A20, 21509: 0x9A21, 21510: 0x9A22, 21511: 0x9A23, 21512: 0x9A24, 21513: 0x9A25, 21514: 0x9A26, 21515: 0x9A27, 21516: 0x9A28, 21517: 0x9A29, 21518: 0x9A2A, 21519: 0x9A2B, 21520: 0x9A2C, 21521: 0x9A2D, 21522: 0x9A2E, 21523: 0x9A2F, 21524: 0x9A30, 21525: 0x9A31, 21526: 0x9A32, 21527: 0x9A33, 21528: 0x9A34, 21529: 0x9A35, 21530: 0x9A36, 21531: 0x9A37, 21532: 0x9A38, 21533: 0x9A39, 21534: 0x9A3A, 21535: 0x9A3B, 21536: 0x9A3C, 21537: 0x9A3D, 21538: 0x9A3E, 21539: 0x9A3F, 21540: 0x9A40, 21541: 0x9A41, 21542: 0x9A42, 21543: 0x9A43, 21544: 0x9A44, 21545: 0x9A45, 21546: 0x9A46, 21547: 0x9A47, 21548: 0x9A48, 21549: 0x9A49, 21550: 0x9A4A, 21551: 0x9A4B, 21552: 0x9A4C, 21553: 0x9A4D, 21554: 0x9A4E, 21555: 0x9A4F, 21556: 0x9A50, 21557: 0x9A51, 21558: 0x9A52, 21559: 0x9A53, 21560: 0x9A54, 21561: 0x9A55, 21562: 0x9A56, 21563: 0x9A57, 21564: 0x9A58, 21565: 0x9A59, 21566: 0x9889, 21567: 0x988C, 21568: 0x988D, 21569: 0x988F, 21570: 0x9894, 21571: 0x989A, 21572: 0x989B, 21573: 0x989E, 21574: 0x989F, 21575: 0x98A1, 21576: 0x98A2, 21577: 0x98A5, 21578: 0x98A6, 21579: 0x864D, 21580: 0x8654, 21581: 0x866C, 21582: 0x866E, 21583: 0x867F, 21584: 0x867A, 21585: 0x867C, 21586: 0x867B, 21587: 0x86A8, 21588: 0x868D, 21589: 0x868B, 21590: 0x86AC, 21591: 0x869D, 21592: 0x86A7, 21593: 0x86A3, 21594: 0x86AA, 21595: 0x8693, 21596: 0x86A9, 21597: 0x86B6, 21598: 0x86C4, 21599: 0x86B5, 21600: 0x86CE, 21601: 0x86B0, 21602: 0x86BA, 21603: 0x86B1, 21604: 0x86AF, 21605: 0x86C9, 21606: 0x86CF, 21607: 0x86B4, 21608: 0x86E9, 21609: 0x86F1, 21610: 0x86F2, 21611: 0x86ED, 21612: 0x86F3, 21613: 0x86D0, 21614: 0x8713, 21615: 0x86DE, 21616: 0x86F4, 21617: 0x86DF, 21618: 0x86D8, 21619: 0x86D1, 21620: 0x8703, 21621: 0x8707, 21622: 0x86F8, 21623: 0x8708, 21624: 0x870A, 21625: 0x870D, 21626: 0x8709, 21627: 0x8723, 21628: 0x873B, 21629: 0x871E, 21630: 0x8725, 21631: 0x872E, 21632: 0x871A, 21633: 0x873E, 21634: 0x8748, 21635: 0x8734, 21636: 0x8731, 21637: 0x8729, 21638: 0x8737, 21639: 0x873F, 21640: 0x8782, 21641: 0x8722, 21642: 0x877D, 21643: 0x877E, 21644: 0x877B, 21645: 0x8760, 21646: 0x8770, 21647: 0x874C, 21648: 0x876E, 21649: 0x878B, 21650: 0x8753, 21651: 0x8763, 21652: 0x877C, 21653: 0x8764, 21654: 0x8759, 21655: 0x8765, 21656: 0x8793, 21657: 0x87AF, 21658: 0x87A8, 21659: 0x87D2, 21660: 0x9A5A, 21661: 0x9A5B, 21662: 0x9A5C, 21663: 0x9A5D, 21664: 0x9A5E, 21665: 0x9A5F, 21666: 0x9A60, 21667: 0x9A61, 21668: 0x9A62, 21669: 0x9A63, 21670: 0x9A64, 21671: 0x9A65, 21672: 0x9A66, 21673: 0x9A67, 21674: 0x9A68, 21675: 0x9A69, 21676: 0x9A6A, 21677: 0x9A6B, 21678: 0x9A72, 21679: 0x9A83, 21680: 0x9A89, 21681: 0x9A8D, 21682: 0x9A8E, 21683: 0x9A94, 21684: 0x9A95, 21685: 0x9A99, 21686: 0x9AA6, 21687: 0x9AA9, 21688: 0x9AAA, 21689: 0x9AAB, 21690: 0x9AAC, 21691: 0x9AAD, 21692: 0x9AAE, 21693: 0x9AAF, 21694: 0x9AB2, 21695: 0x9AB3, 21696: 0x9AB4, 21697: 0x9AB5, 21698: 0x9AB9, 21699: 0x9ABB, 21700: 0x9ABD, 21701: 0x9ABE, 21702: 0x9ABF, 21703: 0x9AC3, 21704: 0x9AC4, 21705: 0x9AC6, 21706: 0x9AC7, 21707: 0x9AC8, 21708: 0x9AC9, 21709: 0x9ACA, 21710: 0x9ACD, 21711: 0x9ACE, 21712: 0x9ACF, 21713: 0x9AD0, 21714: 0x9AD2, 21715: 0x9AD4, 21716: 0x9AD5, 21717: 0x9AD6, 21718: 0x9AD7, 21719: 0x9AD9, 21720: 0x9ADA, 21721: 0x9ADB, 21722: 0x9ADC, 21723: 0x9ADD, 21724: 0x9ADE, 21725: 0x9AE0, 21726: 0x9AE2, 21727: 0x9AE3, 21728: 0x9AE4, 21729: 0x9AE5, 21730: 0x9AE7, 21731: 0x9AE8, 21732: 0x9AE9, 21733: 0x9AEA, 21734: 0x9AEC, 21735: 0x9AEE, 21736: 0x9AF0, 21737: 0x9AF1, 21738: 0x9AF2, 21739: 0x9AF3, 21740: 0x9AF4, 21741: 0x9AF5, 21742: 0x9AF6, 21743: 0x9AF7, 21744: 0x9AF8, 21745: 0x9AFA, 21746: 0x9AFC, 21747: 0x9AFD, 21748: 0x9AFE, 21749: 0x9AFF, 21750: 0x9B00, 21751: 0x9B01, 21752: 0x9B02, 21753: 0x9B04, 21754: 0x9B05, 21755: 0x9B06, 21756: 0x87C6, 21757: 0x8788, 21758: 0x8785, 21759: 0x87AD, 21760: 0x8797, 21761: 0x8783, 21762: 0x87AB, 21763: 0x87E5, 21764: 0x87AC, 21765: 0x87B5, 21766: 0x87B3, 21767: 0x87CB, 21768: 0x87D3, 21769: 0x87BD, 21770: 0x87D1, 21771: 0x87C0, 21772: 0x87CA, 21773: 0x87DB, 21774: 0x87EA, 21775: 0x87E0, 21776: 0x87EE, 21777: 0x8816, 21778: 0x8813, 21779: 0x87FE, 21780: 0x880A, 21781: 0x881B, 21782: 0x8821, 21783: 0x8839, 21784: 0x883C, 21785: 0x7F36, 21786: 0x7F42, 21787: 0x7F44, 21788: 0x7F45, 21789: 0x8210, 21790: 0x7AFA, 21791: 0x7AFD, 21792: 0x7B08, 21793: 0x7B03, 21794: 0x7B04, 21795: 0x7B15, 21796: 0x7B0A, 21797: 0x7B2B, 21798: 0x7B0F, 21799: 0x7B47, 21800: 0x7B38, 21801: 0x7B2A, 21802: 0x7B19, 21803: 0x7B2E, 21804: 0x7B31, 21805: 0x7B20, 21806: 0x7B25, 21807: 0x7B24, 21808: 0x7B33, 21809: 0x7B3E, 21810: 0x7B1E, 21811: 0x7B58, 21812: 0x7B5A, 21813: 0x7B45, 21814: 0x7B75, 21815: 0x7B4C, 21816: 0x7B5D, 21817: 0x7B60, 21818: 0x7B6E, 21819: 0x7B7B, 21820: 0x7B62, 21821: 0x7B72, 21822: 0x7B71, 21823: 0x7B90, 21824: 0x7BA6, 21825: 0x7BA7, 21826: 0x7BB8, 21827: 0x7BAC, 21828: 0x7B9D, 21829: 0x7BA8, 21830: 0x7B85, 21831: 0x7BAA, 21832: 0x7B9C, 21833: 0x7BA2, 21834: 0x7BAB, 21835: 0x7BB4, 21836: 0x7BD1, 21837: 0x7BC1, 21838: 0x7BCC, 21839: 0x7BDD, 21840: 0x7BDA, 21841: 0x7BE5, 21842: 0x7BE6, 21843: 0x7BEA, 21844: 0x7C0C, 21845: 0x7BFE, 21846: 0x7BFC, 21847: 0x7C0F, 21848: 0x7C16, 21849: 0x7C0B, 21850: 0x9B07, 21851: 0x9B09, 21852: 0x9B0A, 21853: 0x9B0B, 21854: 0x9B0C, 21855: 0x9B0D, 21856: 0x9B0E, 21857: 0x9B10, 21858: 0x9B11, 21859: 0x9B12, 21860: 0x9B14, 21861: 0x9B15, 21862: 0x9B16, 21863: 0x9B17, 21864: 0x9B18, 21865: 0x9B19, 21866: 0x9B1A, 21867: 0x9B1B, 21868: 0x9B1C, 21869: 0x9B1D, 21870: 0x9B1E, 21871: 0x9B20, 21872: 0x9B21, 21873: 0x9B22, 21874: 0x9B24, 21875: 0x9B25, 21876: 0x9B26, 21877: 0x9B27, 21878: 0x9B28, 21879: 0x9B29, 21880: 0x9B2A, 21881: 0x9B2B, 21882: 0x9B2C, 21883: 0x9B2D, 21884: 0x9B2E, 21885: 0x9B30, 21886: 0x9B31, 21887: 0x9B33, 21888: 0x9B34, 21889: 0x9B35, 21890: 0x9B36, 21891: 0x9B37, 21892: 0x9B38, 21893: 0x9B39, 21894: 0x9B3A, 21895: 0x9B3D, 21896: 0x9B3E, 21897: 0x9B3F, 21898: 0x9B40, 21899: 0x9B46, 21900: 0x9B4A, 21901: 0x9B4B, 21902: 0x9B4C, 21903: 0x9B4E, 21904: 0x9B50, 21905: 0x9B52, 21906: 0x9B53, 21907: 0x9B55, 21908: 0x9B56, 21909: 0x9B57, 21910: 0x9B58, 21911: 0x9B59, 21912: 0x9B5A, 21913: 0x9B5B, 21914: 0x9B5C, 21915: 0x9B5D, 21916: 0x9B5E, 21917: 0x9B5F, 21918: 0x9B60, 21919: 0x9B61, 21920: 0x9B62, 21921: 0x9B63, 21922: 0x9B64, 21923: 0x9B65, 21924: 0x9B66, 21925: 0x9B67, 21926: 0x9B68, 21927: 0x9B69, 21928: 0x9B6A, 21929: 0x9B6B, 21930: 0x9B6C, 21931: 0x9B6D, 21932: 0x9B6E, 21933: 0x9B6F, 21934: 0x9B70, 21935: 0x9B71, 21936: 0x9B72, 21937: 0x9B73, 21938: 0x9B74, 21939: 0x9B75, 21940: 0x9B76, 21941: 0x9B77, 21942: 0x9B78, 21943: 0x9B79, 21944: 0x9B7A, 21945: 0x9B7B, 21946: 0x7C1F, 21947: 0x7C2A, 21948: 0x7C26, 21949: 0x7C38, 21950: 0x7C41, 21951: 0x7C40, 21952: 0x81FE, 21953: 0x8201, 21954: 0x8202, 21955: 0x8204, 21956: 0x81EC, 21957: 0x8844, 21958: 0x8221, 21959: 0x8222, 21960: 0x8223, 21961: 0x822D, 21962: 0x822F, 21963: 0x8228, 21964: 0x822B, 21965: 0x8238, 21966: 0x823B, 21967: 0x8233, 21968: 0x8234, 21969: 0x823E, 21970: 0x8244, 21971: 0x8249, 21972: 0x824B, 21973: 0x824F, 21974: 0x825A, 21975: 0x825F, 21976: 0x8268, 21977: 0x887E, 21978: 0x8885, 21979: 0x8888, 21980: 0x88D8, 21981: 0x88DF, 21982: 0x895E, 21983: 0x7F9D, 21984: 0x7F9F, 21985: 0x7FA7, 21986: 0x7FAF, 21987: 0x7FB0, 21988: 0x7FB2, 21989: 0x7C7C, 21990: 0x6549, 21991: 0x7C91, 21992: 0x7C9D, 21993: 0x7C9C, 21994: 0x7C9E, 21995: 0x7CA2, 21996: 0x7CB2, 21997: 0x7CBC, 21998: 0x7CBD, 21999: 0x7CC1, 22000: 0x7CC7, 22001: 0x7CCC, 22002: 0x7CCD, 22003: 0x7CC8, 22004: 0x7CC5, 22005: 0x7CD7, 22006: 0x7CE8, 22007: 0x826E, 22008: 0x66A8, 22009: 0x7FBF, 22010: 0x7FCE, 22011: 0x7FD5, 22012: 0x7FE5, 22013: 0x7FE1, 22014: 0x7FE6, 22015: 0x7FE9, 22016: 0x7FEE, 22017: 0x7FF3, 22018: 0x7CF8, 22019: 0x7D77, 22020: 0x7DA6, 22021: 0x7DAE, 22022: 0x7E47, 22023: 0x7E9B, 22024: 0x9EB8, 22025: 0x9EB4, 22026: 0x8D73, 22027: 0x8D84, 22028: 0x8D94, 22029: 0x8D91, 22030: 0x8DB1, 22031: 0x8D67, 22032: 0x8D6D, 22033: 0x8C47, 22034: 0x8C49, 22035: 0x914A, 22036: 0x9150, 22037: 0x914E, 22038: 0x914F, 22039: 0x9164, 22040: 0x9B7C, 22041: 0x9B7D, 22042: 0x9B7E, 22043: 0x9B7F, 22044: 0x9B80, 22045: 0x9B81, 22046: 0x9B82, 22047: 0x9B83, 22048: 0x9B84, 22049: 0x9B85, 22050: 0x9B86, 22051: 0x9B87, 22052: 0x9B88, 22053: 0x9B89, 22054: 0x9B8A, 22055: 0x9B8B, 22056: 0x9B8C, 22057: 0x9B8D, 22058: 0x9B8E, 22059: 0x9B8F, 22060: 0x9B90, 22061: 0x9B91, 22062: 0x9B92, 22063: 0x9B93, 22064: 0x9B94, 22065: 0x9B95, 22066: 0x9B96, 22067: 0x9B97, 22068: 0x9B98, 22069: 0x9B99, 22070: 0x9B9A, 22071: 0x9B9B, 22072: 0x9B9C, 22073: 0x9B9D, 22074: 0x9B9E, 22075: 0x9B9F, 22076: 0x9BA0, 22077: 0x9BA1, 22078: 0x9BA2, 22079: 0x9BA3, 22080: 0x9BA4, 22081: 0x9BA5, 22082: 0x9BA6, 22083: 0x9BA7, 22084: 0x9BA8, 22085: 0x9BA9, 22086: 0x9BAA, 22087: 0x9BAB, 22088: 0x9BAC, 22089: 0x9BAD, 22090: 0x9BAE, 22091: 0x9BAF, 22092: 0x9BB0, 22093: 0x9BB1, 22094: 0x9BB2, 22095: 0x9BB3, 22096: 0x9BB4, 22097: 0x9BB5, 22098: 0x9BB6, 22099: 0x9BB7, 22100: 0x9BB8, 22101: 0x9BB9, 22102: 0x9BBA, 22103: 0x9BBB, 22104: 0x9BBC, 22105: 0x9BBD, 22106: 0x9BBE, 22107: 0x9BBF, 22108: 0x9BC0, 22109: 0x9BC1, 22110: 0x9BC2, 22111: 0x9BC3, 22112: 0x9BC4, 22113: 0x9BC5, 22114: 0x9BC6, 22115: 0x9BC7, 22116: 0x9BC8, 22117: 0x9BC9, 22118: 0x9BCA, 22119: 0x9BCB, 22120: 0x9BCC, 22121: 0x9BCD, 22122: 0x9BCE, 22123: 0x9BCF, 22124: 0x9BD0, 22125: 0x9BD1, 22126: 0x9BD2, 22127: 0x9BD3, 22128: 0x9BD4, 22129: 0x9BD5, 22130: 0x9BD6, 22131: 0x9BD7, 22132: 0x9BD8, 22133: 0x9BD9, 22134: 0x9BDA, 22135: 0x9BDB, 22136: 0x9162, 22137: 0x9161, 22138: 0x9170, 22139: 0x9169, 22140: 0x916F, 22141: 0x917D, 22142: 0x917E, 22143: 0x9172, 22144: 0x9174, 22145: 0x9179, 22146: 0x918C, 22147: 0x9185, 22148: 0x9190, 22149: 0x918D, 22150: 0x9191, 22151: 0x91A2, 22152: 0x91A3, 22153: 0x91AA, 22154: 0x91AD, 22155: 0x91AE, 22156: 0x91AF, 22157: 0x91B5, 22158: 0x91B4, 22159: 0x91BA, 22160: 0x8C55, 22161: 0x9E7E, 22162: 0x8DB8, 22163: 0x8DEB, 22164: 0x8E05, 22165: 0x8E59, 22166: 0x8E69, 22167: 0x8DB5, 22168: 0x8DBF, 22169: 0x8DBC, 22170: 0x8DBA, 22171: 0x8DC4, 22172: 0x8DD6, 22173: 0x8DD7, 22174: 0x8DDA, 22175: 0x8DDE, 22176: 0x8DCE, 22177: 0x8DCF, 22178: 0x8DDB, 22179: 0x8DC6, 22180: 0x8DEC, 22181: 0x8DF7, 22182: 0x8DF8, 22183: 0x8DE3, 22184: 0x8DF9, 22185: 0x8DFB, 22186: 0x8DE4, 22187: 0x8E09, 22188: 0x8DFD, 22189: 0x8E14, 22190: 0x8E1D, 22191: 0x8E1F, 22192: 0x8E2C, 22193: 0x8E2E, 22194: 0x8E23, 22195: 0x8E2F, 22196: 0x8E3A, 22197: 0x8E40, 22198: 0x8E39, 22199: 0x8E35, 22200: 0x8E3D, 22201: 0x8E31, 22202: 0x8E49, 22203: 0x8E41, 22204: 0x8E42, 22205: 0x8E51, 22206: 0x8E52, 22207: 0x8E4A, 22208: 0x8E70, 22209: 0x8E76, 22210: 0x8E7C, 22211: 0x8E6F, 22212: 0x8E74, 22213: 0x8E85, 22214: 0x8E8F, 22215: 0x8E94, 22216: 0x8E90, 22217: 0x8E9C, 22218: 0x8E9E, 22219: 0x8C78, 22220: 0x8C82, 22221: 0x8C8A, 22222: 0x8C85, 22223: 0x8C98, 22224: 0x8C94, 22225: 0x659B, 22226: 0x89D6, 22227: 0x89DE, 22228: 0x89DA, 22229: 0x89DC, 22230: 0x9BDC, 22231: 0x9BDD, 22232: 0x9BDE, 22233: 0x9BDF, 22234: 0x9BE0, 22235: 0x9BE1, 22236: 0x9BE2, 22237: 0x9BE3, 22238: 0x9BE4, 22239: 0x9BE5, 22240: 0x9BE6, 22241: 0x9BE7, 22242: 0x9BE8, 22243: 0x9BE9, 22244: 0x9BEA, 22245: 0x9BEB, 22246: 0x9BEC, 22247: 0x9BED, 22248: 0x9BEE, 22249: 0x9BEF, 22250: 0x9BF0, 22251: 0x9BF1, 22252: 0x9BF2, 22253: 0x9BF3, 22254: 0x9BF4, 22255: 0x9BF5, 22256: 0x9BF6, 22257: 0x9BF7, 22258: 0x9BF8, 22259: 0x9BF9, 22260: 0x9BFA, 22261: 0x9BFB, 22262: 0x9BFC, 22263: 0x9BFD, 22264: 0x9BFE, 22265: 0x9BFF, 22266: 0x9C00, 22267: 0x9C01, 22268: 0x9C02, 22269: 0x9C03, 22270: 0x9C04, 22271: 0x9C05, 22272: 0x9C06, 22273: 0x9C07, 22274: 0x9C08, 22275: 0x9C09, 22276: 0x9C0A, 22277: 0x9C0B, 22278: 0x9C0C, 22279: 0x9C0D, 22280: 0x9C0E, 22281: 0x9C0F, 22282: 0x9C10, 22283: 0x9C11, 22284: 0x9C12, 22285: 0x9C13, 22286: 0x9C14, 22287: 0x9C15, 22288: 0x9C16, 22289: 0x9C17, 22290: 0x9C18, 22291: 0x9C19, 22292: 0x9C1A, 22293: 0x9C1B, 22294: 0x9C1C, 22295: 0x9C1D, 22296: 0x9C1E, 22297: 0x9C1F, 22298: 0x9C20, 22299: 0x9C21, 22300: 0x9C22, 22301: 0x9C23, 22302: 0x9C24, 22303: 0x9C25, 22304: 0x9C26, 22305: 0x9C27, 22306: 0x9C28, 22307: 0x9C29, 22308: 0x9C2A, 22309: 0x9C2B, 22310: 0x9C2C, 22311: 0x9C2D, 22312: 0x9C2E, 22313: 0x9C2F, 22314: 0x9C30, 22315: 0x9C31, 22316: 0x9C32, 22317: 0x9C33, 22318: 0x9C34, 22319: 0x9C35, 22320: 0x9C36, 22321: 0x9C37, 22322: 0x9C38, 22323: 0x9C39, 22324: 0x9C3A, 22325: 0x9C3B, 22326: 0x89E5, 22327: 0x89EB, 22328: 0x89EF, 22329: 0x8A3E, 22330: 0x8B26, 22331: 0x9753, 22332: 0x96E9, 22333: 0x96F3, 22334: 0x96EF, 22335: 0x9706, 22336: 0x9701, 22337: 0x9708, 22338: 0x970F, 22339: 0x970E, 22340: 0x972A, 22341: 0x972D, 22342: 0x9730, 22343: 0x973E, 22344: 0x9F80, 22345: 0x9F83, 22346: 0x9F85, 22347: 0x9F86, 22348: 0x9F87, 22349: 0x9F88, 22350: 0x9F89, 22351: 0x9F8A, 22352: 0x9F8C, 22353: 0x9EFE, 22354: 0x9F0B, 22355: 0x9F0D, 22356: 0x96B9, 22357: 0x96BC, 22358: 0x96BD, 22359: 0x96CE, 22360: 0x96D2, 22361: 0x77BF, 22362: 0x96E0, 22363: 0x928E, 22364: 0x92AE, 22365: 0x92C8, 22366: 0x933E, 22367: 0x936A, 22368: 0x93CA, 22369: 0x938F, 22370: 0x943E, 22371: 0x946B, 22372: 0x9C7F, 22373: 0x9C82, 22374: 0x9C85, 22375: 0x9C86, 22376: 0x9C87, 22377: 0x9C88, 22378: 0x7A23, 22379: 0x9C8B, 22380: 0x9C8E, 22381: 0x9C90, 22382: 0x9C91, 22383: 0x9C92, 22384: 0x9C94, 22385: 0x9C95, 22386: 0x9C9A, 22387: 0x9C9B, 22388: 0x9C9E, 22389: 0x9C9F, 22390: 0x9CA0, 22391: 0x9CA1, 22392: 0x9CA2, 22393: 0x9CA3, 22394: 0x9CA5, 22395: 0x9CA6, 22396: 0x9CA7, 22397: 0x9CA8, 22398: 0x9CA9, 22399: 0x9CAB, 22400: 0x9CAD, 22401: 0x9CAE, 22402: 0x9CB0, 22403: 0x9CB1, 22404: 0x9CB2, 22405: 0x9CB3, 22406: 0x9CB4, 22407: 0x9CB5, 22408: 0x9CB6, 22409: 0x9CB7, 22410: 0x9CBA, 22411: 0x9CBB, 22412: 0x9CBC, 22413: 0x9CBD, 22414: 0x9CC4, 22415: 0x9CC5, 22416: 0x9CC6, 22417: 0x9CC7, 22418: 0x9CCA, 22419: 0x9CCB, 22420: 0x9C3C, 22421: 0x9C3D, 22422: 0x9C3E, 22423: 0x9C3F, 22424: 0x9C40, 22425: 0x9C41, 22426: 0x9C42, 22427: 0x9C43, 22428: 0x9C44, 22429: 0x9C45, 22430: 0x9C46, 22431: 0x9C47, 22432: 0x9C48, 22433: 0x9C49, 22434: 0x9C4A, 22435: 0x9C4B, 22436: 0x9C4C, 22437: 0x9C4D, 22438: 0x9C4E, 22439: 0x9C4F, 22440: 0x9C50, 22441: 0x9C51, 22442: 0x9C52, 22443: 0x9C53, 22444: 0x9C54, 22445: 0x9C55, 22446: 0x9C56, 22447: 0x9C57, 22448: 0x9C58, 22449: 0x9C59, 22450: 0x9C5A, 22451: 0x9C5B, 22452: 0x9C5C, 22453: 0x9C5D, 22454: 0x9C5E, 22455: 0x9C5F, 22456: 0x9C60, 22457: 0x9C61, 22458: 0x9C62, 22459: 0x9C63, 22460: 0x9C64, 22461: 0x9C65, 22462: 0x9C66, 22463: 0x9C67, 22464: 0x9C68, 22465: 0x9C69, 22466: 0x9C6A, 22467: 0x9C6B, 22468: 0x9C6C, 22469: 0x9C6D, 22470: 0x9C6E, 22471: 0x9C6F, 22472: 0x9C70, 22473: 0x9C71, 22474: 0x9C72, 22475: 0x9C73, 22476: 0x9C74, 22477: 0x9C75, 22478: 0x9C76, 22479: 0x9C77, 22480: 0x9C78, 22481: 0x9C79, 22482: 0x9C7A, 22483: 0x9C7B, 22484: 0x9C7D, 22485: 0x9C7E, 22486: 0x9C80, 22487: 0x9C83, 22488: 0x9C84, 22489: 0x9C89, 22490: 0x9C8A, 22491: 0x9C8C, 22492: 0x9C8F, 22493: 0x9C93, 22494: 0x9C96, 22495: 0x9C97, 22496: 0x9C98, 22497: 0x9C99, 22498: 0x9C9D, 22499: 0x9CAA, 22500: 0x9CAC, 22501: 0x9CAF, 22502: 0x9CB9, 22503: 0x9CBE, 22504: 0x9CBF, 22505: 0x9CC0, 22506: 0x9CC1, 22507: 0x9CC2, 22508: 0x9CC8, 22509: 0x9CC9, 22510: 0x9CD1, 22511: 0x9CD2, 22512: 0x9CDA, 22513: 0x9CDB, 22514: 0x9CE0, 22515: 0x9CE1, 22516: 0x9CCC, 22517: 0x9CCD, 22518: 0x9CCE, 22519: 0x9CCF, 22520: 0x9CD0, 22521: 0x9CD3, 22522: 0x9CD4, 22523: 0x9CD5, 22524: 0x9CD7, 22525: 0x9CD8, 22526: 0x9CD9, 22527: 0x9CDC, 22528: 0x9CDD, 22529: 0x9CDF, 22530: 0x9CE2, 22531: 0x977C, 22532: 0x9785, 22533: 0x9791, 22534: 0x9792, 22535: 0x9794, 22536: 0x97AF, 22537: 0x97AB, 22538: 0x97A3, 22539: 0x97B2, 22540: 0x97B4, 22541: 0x9AB1, 22542: 0x9AB0, 22543: 0x9AB7, 22544: 0x9E58, 22545: 0x9AB6, 22546: 0x9ABA, 22547: 0x9ABC, 22548: 0x9AC1, 22549: 0x9AC0, 22550: 0x9AC5, 22551: 0x9AC2, 22552: 0x9ACB, 22553: 0x9ACC, 22554: 0x9AD1, 22555: 0x9B45, 22556: 0x9B43, 22557: 0x9B47, 22558: 0x9B49, 22559: 0x9B48, 22560: 0x9B4D, 22561: 0x9B51, 22562: 0x98E8, 22563: 0x990D, 22564: 0x992E, 22565: 0x9955, 22566: 0x9954, 22567: 0x9ADF, 22568: 0x9AE1, 22569: 0x9AE6, 22570: 0x9AEF, 22571: 0x9AEB, 22572: 0x9AFB, 22573: 0x9AED, 22574: 0x9AF9, 22575: 0x9B08, 22576: 0x9B0F, 22577: 0x9B13, 22578: 0x9B1F, 22579: 0x9B23, 22580: 0x9EBD, 22581: 0x9EBE, 22582: 0x7E3B, 22583: 0x9E82, 22584: 0x9E87, 22585: 0x9E88, 22586: 0x9E8B, 22587: 0x9E92, 22588: 0x93D6, 22589: 0x9E9D, 22590: 0x9E9F, 22591: 0x9EDB, 22592: 0x9EDC, 22593: 0x9EDD, 22594: 0x9EE0, 22595: 0x9EDF, 22596: 0x9EE2, 22597: 0x9EE9, 22598: 0x9EE7, 22599: 0x9EE5, 22600: 0x9EEA, 22601: 0x9EEF, 22602: 0x9F22, 22603: 0x9F2C, 22604: 0x9F2F, 22605: 0x9F39, 22606: 0x9F37, 22607: 0x9F3D, 22608: 0x9F3E, 22609: 0x9F44, 22610: 0x9CE3, 22611: 0x9CE4, 22612: 0x9CE5, 22613: 0x9CE6, 22614: 0x9CE7, 22615: 0x9CE8, 22616: 0x9CE9, 22617: 0x9CEA, 22618: 0x9CEB, 22619: 0x9CEC, 22620: 0x9CED, 22621: 0x9CEE, 22622: 0x9CEF, 22623: 0x9CF0, 22624: 0x9CF1, 22625: 0x9CF2, 22626: 0x9CF3, 22627: 0x9CF4, 22628: 0x9CF5, 22629: 0x9CF6, 22630: 0x9CF7, 22631: 0x9CF8, 22632: 0x9CF9, 22633: 0x9CFA, 22634: 0x9CFB, 22635: 0x9CFC, 22636: 0x9CFD, 22637: 0x9CFE, 22638: 0x9CFF, 22639: 0x9D00, 22640: 0x9D01, 22641: 0x9D02, 22642: 0x9D03, 22643: 0x9D04, 22644: 0x9D05, 22645: 0x9D06, 22646: 0x9D07, 22647: 0x9D08, 22648: 0x9D09, 22649: 0x9D0A, 22650: 0x9D0B, 22651: 0x9D0C, 22652: 0x9D0D, 22653: 0x9D0E, 22654: 0x9D0F, 22655: 0x9D10, 22656: 0x9D11, 22657: 0x9D12, 22658: 0x9D13, 22659: 0x9D14, 22660: 0x9D15, 22661: 0x9D16, 22662: 0x9D17, 22663: 0x9D18, 22664: 0x9D19, 22665: 0x9D1A, 22666: 0x9D1B, 22667: 0x9D1C, 22668: 0x9D1D, 22669: 0x9D1E, 22670: 0x9D1F, 22671: 0x9D20, 22672: 0x9D21, 22673: 0x9D22, 22674: 0x9D23, 22675: 0x9D24, 22676: 0x9D25, 22677: 0x9D26, 22678: 0x9D27, 22679: 0x9D28, 22680: 0x9D29, 22681: 0x9D2A, 22682: 0x9D2B, 22683: 0x9D2C, 22684: 0x9D2D, 22685: 0x9D2E, 22686: 0x9D2F, 22687: 0x9D30, 22688: 0x9D31, 22689: 0x9D32, 22690: 0x9D33, 22691: 0x9D34, 22692: 0x9D35, 22693: 0x9D36, 22694: 0x9D37, 22695: 0x9D38, 22696: 0x9D39, 22697: 0x9D3A, 22698: 0x9D3B, 22699: 0x9D3C, 22700: 0x9D3D, 22701: 0x9D3E, 22702: 0x9D3F, 22703: 0x9D40, 22704: 0x9D41, 22705: 0x9D42, 22800: 0x9D43, 22801: 0x9D44, 22802: 0x9D45, 22803: 0x9D46, 22804: 0x9D47, 22805: 0x9D48, 22806: 0x9D49, 22807: 0x9D4A, 22808: 0x9D4B, 22809: 0x9D4C, 22810: 0x9D4D, 22811: 0x9D4E, 22812: 0x9D4F, 22813: 0x9D50, 22814: 0x9D51, 22815: 0x9D52, 22816: 0x9D53, 22817: 0x9D54, 22818: 0x9D55, 22819: 0x9D56, 22820: 0x9D57, 22821: 0x9D58, 22822: 0x9D59, 22823: 0x9D5A, 22824: 0x9D5B, 22825: 0x9D5C, 22826: 0x9D5D, 22827: 0x9D5E, 22828: 0x9D5F, 22829: 0x9D60, 22830: 0x9D61, 22831: 0x9D62, 22832: 0x9D63, 22833: 0x9D64, 22834: 0x9D65, 22835: 0x9D66, 22836: 0x9D67, 22837: 0x9D68, 22838: 0x9D69, 22839: 0x9D6A, 22840: 0x9D6B, 22841: 0x9D6C, 22842: 0x9D6D, 22843: 0x9D6E, 22844: 0x9D6F, 22845: 0x9D70, 22846: 0x9D71, 22847: 0x9D72, 22848: 0x9D73, 22849: 0x9D74, 22850: 0x9D75, 22851: 0x9D76, 22852: 0x9D77, 22853: 0x9D78, 22854: 0x9D79, 22855: 0x9D7A, 22856: 0x9D7B, 22857: 0x9D7C, 22858: 0x9D7D, 22859: 0x9D7E, 22860: 0x9D7F, 22861: 0x9D80, 22862: 0x9D81, 22863: 0x9D82, 22864: 0x9D83, 22865: 0x9D84, 22866: 0x9D85, 22867: 0x9D86, 22868: 0x9D87, 22869: 0x9D88, 22870: 0x9D89, 22871: 0x9D8A, 22872: 0x9D8B, 22873: 0x9D8C, 22874: 0x9D8D, 22875: 0x9D8E, 22876: 0x9D8F, 22877: 0x9D90, 22878: 0x9D91, 22879: 0x9D92, 22880: 0x9D93, 22881: 0x9D94, 22882: 0x9D95, 22883: 0x9D96, 22884: 0x9D97, 22885: 0x9D98, 22886: 0x9D99, 22887: 0x9D9A, 22888: 0x9D9B, 22889: 0x9D9C, 22890: 0x9D9D, 22891: 0x9D9E, 22892: 0x9D9F, 22893: 0x9DA0, 22894: 0x9DA1, 22895: 0x9DA2, 22990: 0x9DA3, 22991: 0x9DA4, 22992: 0x9DA5, 22993: 0x9DA6, 22994: 0x9DA7, 22995: 0x9DA8, 22996: 0x9DA9, 22997: 0x9DAA, 22998: 0x9DAB, 22999: 0x9DAC, 23000: 0x9DAD, 23001: 0x9DAE, 23002: 0x9DAF, 23003: 0x9DB0, 23004: 0x9DB1, 23005: 0x9DB2, 23006: 0x9DB3, 23007: 0x9DB4, 23008: 0x9DB5, 23009: 0x9DB6, 23010: 0x9DB7, 23011: 0x9DB8, 23012: 0x9DB9, 23013: 0x9DBA, 23014: 0x9DBB, 23015: 0x9DBC, 23016: 0x9DBD, 23017: 0x9DBE, 23018: 0x9DBF, 23019: 0x9DC0, 23020: 0x9DC1, 23021: 0x9DC2, 23022: 0x9DC3, 23023: 0x9DC4, 23024: 0x9DC5, 23025: 0x9DC6, 23026: 0x9DC7, 23027: 0x9DC8, 23028: 0x9DC9, 23029: 0x9DCA, 23030: 0x9DCB, 23031: 0x9DCC, 23032: 0x9DCD, 23033: 0x9DCE, 23034: 0x9DCF, 23035: 0x9DD0, 23036: 0x9DD1, 23037: 0x9DD2, 23038: 0x9DD3, 23039: 0x9DD4, 23040: 0x9DD5, 23041: 0x9DD6, 23042: 0x9DD7, 23043: 0x9DD8, 23044: 0x9DD9, 23045: 0x9DDA, 23046: 0x9DDB, 23047: 0x9DDC, 23048: 0x9DDD, 23049: 0x9DDE, 23050: 0x9DDF, 23051: 0x9DE0, 23052: 0x9DE1, 23053: 0x9DE2, 23054: 0x9DE3, 23055: 0x9DE4, 23056: 0x9DE5, 23057: 0x9DE6, 23058: 0x9DE7, 23059: 0x9DE8, 23060: 0x9DE9, 23061: 0x9DEA, 23062: 0x9DEB, 23063: 0x9DEC, 23064: 0x9DED, 23065: 0x9DEE, 23066: 0x9DEF, 23067: 0x9DF0, 23068: 0x9DF1, 23069: 0x9DF2, 23070: 0x9DF3, 23071: 0x9DF4, 23072: 0x9DF5, 23073: 0x9DF6, 23074: 0x9DF7, 23075: 0x9DF8, 23076: 0x9DF9, 23077: 0x9DFA, 23078: 0x9DFB, 23079: 0x9DFC, 23080: 0x9DFD, 23081: 0x9DFE, 23082: 0x9DFF, 23083: 0x9E00, 23084: 0x9E01, 23085: 0x9E02, 23180: 0x9E03, 23181: 0x9E04, 23182: 0x9E05, 23183: 0x9E06, 23184: 0x9E07, 23185: 0x9E08, 23186: 0x9E09, 23187: 0x9E0A, 23188: 0x9E0B, 23189: 0x9E0C, 23190: 0x9E0D, 23191: 0x9E0E, 23192: 0x9E0F, 23193: 0x9E10, 23194: 0x9E11, 23195: 0x9E12, 23196: 0x9E13, 23197: 0x9E14, 23198: 0x9E15, 23199: 0x9E16, 23200: 0x9E17, 23201: 0x9E18, 23202: 0x9E19, 23203: 0x9E1A, 23204: 0x9E1B, 23205: 0x9E1C, 23206: 0x9E1D, 23207: 0x9E1E, 23208: 0x9E24, 23209: 0x9E27, 23210: 0x9E2E, 23211: 0x9E30, 23212: 0x9E34, 23213: 0x9E3B, 23214: 0x9E3C, 23215: 0x9E40, 23216: 0x9E4D, 23217: 0x9E50, 23218: 0x9E52, 23219: 0x9E53, 23220: 0x9E54, 23221: 0x9E56, 23222: 0x9E59, 23223: 0x9E5D, 23224: 0x9E5F, 23225: 0x9E60, 23226: 0x9E61, 23227: 0x9E62, 23228: 0x9E65, 23229: 0x9E6E, 23230: 0x9E6F, 23231: 0x9E72, 23232: 0x9E74, 23233: 0x9E75, 23234: 0x9E76, 23235: 0x9E77, 23236: 0x9E78, 23237: 0x9E79, 23238: 0x9E7A, 23239: 0x9E7B, 23240: 0x9E7C, 23241: 0x9E7D, 23242: 0x9E80, 23243: 0x9E81, 23244: 0x9E83, 23245: 0x9E84, 23246: 0x9E85, 23247: 0x9E86, 23248: 0x9E89, 23249: 0x9E8A, 23250: 0x9E8C, 23251: 0x9E8D, 23252: 0x9E8E, 23253: 0x9E8F, 23254: 0x9E90, 23255: 0x9E91, 23256: 0x9E94, 23257: 0x9E95, 23258: 0x9E96, 23259: 0x9E97, 23260: 0x9E98, 23261: 0x9E99, 23262: 0x9E9A, 23263: 0x9E9B, 23264: 0x9E9C, 23265: 0x9E9E, 23266: 0x9EA0, 23267: 0x9EA1, 23268: 0x9EA2, 23269: 0x9EA3, 23270: 0x9EA4, 23271: 0x9EA5, 23272: 0x9EA7, 23273: 0x9EA8, 23274: 0x9EA9, 23275: 0x9EAA, 23370: 0x9EAB, 23371: 0x9EAC, 23372: 0x9EAD, 23373: 0x9EAE, 23374: 0x9EAF, 23375: 0x9EB0, 23376: 0x9EB1, 23377: 0x9EB2, 23378: 0x9EB3, 23379: 0x9EB5, 23380: 0x9EB6, 23381: 0x9EB7, 23382: 0x9EB9, 23383: 0x9EBA, 23384: 0x9EBC, 23385: 0x9EBF, 23386: 0x9EC0, 23387: 0x9EC1, 23388: 0x9EC2, 23389: 0x9EC3, 23390: 0x9EC5, 23391: 0x9EC6, 23392: 0x9EC7, 23393: 0x9EC8, 23394: 0x9ECA, 23395: 0x9ECB, 23396: 0x9ECC, 23397: 0x9ED0, 23398: 0x9ED2, 23399: 0x9ED3, 23400: 0x9ED5, 23401: 0x9ED6, 23402: 0x9ED7, 23403: 0x9ED9, 23404: 0x9EDA, 23405: 0x9EDE, 23406: 0x9EE1, 23407: 0x9EE3, 23408: 0x9EE4, 23409: 0x9EE6, 23410: 0x9EE8, 23411: 0x9EEB, 23412: 0x9EEC, 23413: 0x9EED, 23414: 0x9EEE, 23415: 0x9EF0, 23416: 0x9EF1, 23417: 0x9EF2, 23418: 0x9EF3, 23419: 0x9EF4, 23420: 0x9EF5, 23421: 0x9EF6, 23422: 0x9EF7, 23423: 0x9EF8, 23424: 0x9EFA, 23425: 0x9EFD, 23426: 0x9EFF, 23427: 0x9F00, 23428: 0x9F01, 23429: 0x9F02, 23430: 0x9F03, 23431: 0x9F04, 23432: 0x9F05, 23433: 0x9F06, 23434: 0x9F07, 23435: 0x9F08, 23436: 0x9F09, 23437: 0x9F0A, 23438: 0x9F0C, 23439: 0x9F0F, 23440: 0x9F11, 23441: 0x9F12, 23442: 0x9F14, 23443: 0x9F15, 23444: 0x9F16, 23445: 0x9F18, 23446: 0x9F1A, 23447: 0x9F1B, 23448: 0x9F1C, 23449: 0x9F1D, 23450: 0x9F1E, 23451: 0x9F1F, 23452: 0x9F21, 23453: 0x9F23, 23454: 0x9F24, 23455: 0x9F25, 23456: 0x9F26, 23457: 0x9F27, 23458: 0x9F28, 23459: 0x9F29, 23460: 0x9F2A, 23461: 0x9F2B, 23462: 0x9F2D, 23463: 0x9F2E, 23464: 0x9F30, 23465: 0x9F31, 23560: 0x9F32, 23561: 0x9F33, 23562: 0x9F34, 23563: 0x9F35, 23564: 0x9F36, 23565: 0x9F38, 23566: 0x9F3A, 23567: 0x9F3C, 23568: 0x9F3F, 23569: 0x9F40, 23570: 0x9F41, 23571: 0x9F42, 23572: 0x9F43, 23573: 0x9F45, 23574: 0x9F46, 23575: 0x9F47, 23576: 0x9F48, 23577: 0x9F49, 23578: 0x9F4A, 23579: 0x9F4B, 23580: 0x9F4C, 23581: 0x9F4D, 23582: 0x9F4E, 23583: 0x9F4F, 23584: 0x9F52, 23585: 0x9F53, 23586: 0x9F54, 23587: 0x9F55, 23588: 0x9F56, 23589: 0x9F57, 23590: 0x9F58, 23591: 0x9F59, 23592: 0x9F5A, 23593: 0x9F5B, 23594: 0x9F5C, 23595: 0x9F5D, 23596: 0x9F5E, 23597: 0x9F5F, 23598: 0x9F60, 23599: 0x9F61, 23600: 0x9F62, 23601: 0x9F63, 23602: 0x9F64, 23603: 0x9F65, 23604: 0x9F66, 23605: 0x9F67, 23606: 0x9F68, 23607: 0x9F69, 23608: 0x9F6A, 23609: 0x9F6B, 23610: 0x9F6C, 23611: 0x9F6D, 23612: 0x9F6E, 23613: 0x9F6F, 23614: 0x9F70, 23615: 0x9F71, 23616: 0x9F72, 23617: 0x9F73, 23618: 0x9F74, 23619: 0x9F75, 23620: 0x9F76, 23621: 0x9F77, 23622: 0x9F78, 23623: 0x9F79, 23624: 0x9F7A, 23625: 0x9F7B, 23626: 0x9F7C, 23627: 0x9F7D, 23628: 0x9F7E, 23629: 0x9F81, 23630: 0x9F82, 23631: 0x9F8D, 23632: 0x9F8E, 23633: 0x9F8F, 23634: 0x9F90, 23635: 0x9F91, 23636: 0x9F92, 23637: 0x9F93, 23638: 0x9F94, 23639: 0x9F95, 23640: 0x9F96, 23641: 0x9F97, 23642: 0x9F98, 23643: 0x9F9C, 23644: 0x9F9D, 23645: 0x9F9E, 23646: 0x9FA1, 23647: 0x9FA2, 23648: 0x9FA3, 23649: 0x9FA4, 23650: 0x9FA5, 23651: 0xF92C, 23652: 0xF979, 23653: 0xF995, 23654: 0xF9E7, 23655: 0xF9F1, 23750: 0xFA0C, 23751: 0xFA0D, 23752: 0xFA0E, 23753: 0xFA0F, 23754: 0xFA11, 23755: 0xFA13, 23756: 0xFA14, 23757: 0xFA18, 23758: 0xFA1F, 23759: 0xFA20, 23760: 0xFA21, 23761: 0xFA23, 23762: 0xFA24, 23763: 0xFA27, 23764: 0xFA28, 23765: 0xFA29, 23766: 0x2E81, 23770: 0x2E84, 23771: 0x3473, 23772: 0x3447, 23773: 0x2E88, 23774: 0x2E8B, 23776: 0x359E, 23777: 0x361A, 23778: 0x360E, 23779: 0x2E8C, 23780: 0x2E97, 23781: 0x396E, 23782: 0x3918, 23784: 0x39CF, 23785: 0x39DF, 23786: 0x3A73, 23787: 0x39D0, 23790: 0x3B4E, 23791: 0x3C6E, 23792: 0x3CE0, 23793: 0x2EA7, 23796: 0x2EAA, 23797: 0x4056, 23798: 0x415F, 23799: 0x2EAE, 23800: 0x4337, 23801: 0x2EB3, 23802: 0x2EB6, 23803: 0x2EB7, 23805: 0x43B1, 23806: 0x43AC, 23807: 0x2EBB, 23808: 0x43DD, 23809: 0x44D6, 23810: 0x4661, 23811: 0x464C, 23813: 0x4723, 23814: 0x4729, 23815: 0x477C, 23816: 0x478D, 23817: 0x2ECA, 23818: 0x4947, 23819: 0x497A, 23820: 0x497D, 23821: 0x4982, 23822: 0x4983, 23823: 0x4985, 23824: 0x4986, 23825: 0x499F, 23826: 0x499B, 23827: 0x49B7, 23828: 0x49B6, 23831: 0x4CA3, 23832: 0x4C9F, 23833: 0x4CA0, 23834: 0x4CA1, 23835: 0x4C77, 23836: 0x4CA2, 23837: 0x4D13, 23838: 0x4D14, 23839: 0x4D15, 23840: 0x4D16, 23841: 0x4D17, 23842: 0x4D18, 23843: 0x4D19, 23844: 0x4DAE, } const numEncodeTables = 5 // encodeX are the encoding tables from Unicode to GBK code, // sorted by decreasing length. // encode0: 28965 entries for runes in [11905, 40870). // encode1: 1587 entries for runes in [ 8208, 9795). // encode2: 942 entries for runes in [ 164, 1106). // encode3: 438 entries for runes in [65072, 65510). // encode4: 254 entries for runes in [63788, 64042). const encode0Low, encode0High = 11905, 40870 var encode0 = [...]uint16{ 11905 - 11905: 0xFE50, 11908 - 11905: 0xFE54, 11912 - 11905: 0xFE57, 11915 - 11905: 0xFE58, 11916 - 11905: 0xFE5D, 11927 - 11905: 0xFE5E, 11943 - 11905: 0xFE6B, 11946 - 11905: 0xFE6E, 11950 - 11905: 0xFE71, 11955 - 11905: 0xFE73, 11958 - 11905: 0xFE74, 11959 - 11905: 0xFE75, 11963 - 11905: 0xFE79, 11978 - 11905: 0xFE84, 12272 - 11905: 0xA98A, 12273 - 11905: 0xA98B, 12274 - 11905: 0xA98C, 12275 - 11905: 0xA98D, 12276 - 11905: 0xA98E, 12277 - 11905: 0xA98F, 12278 - 11905: 0xA990, 12279 - 11905: 0xA991, 12280 - 11905: 0xA992, 12281 - 11905: 0xA993, 12282 - 11905: 0xA994, 12283 - 11905: 0xA995, 12288 - 11905: 0xA1A1, 12289 - 11905: 0xA1A2, 12290 - 11905: 0xA1A3, 12291 - 11905: 0xA1A8, 12293 - 11905: 0xA1A9, 12294 - 11905: 0xA965, 12295 - 11905: 0xA996, 12296 - 11905: 0xA1B4, 12297 - 11905: 0xA1B5, 12298 - 11905: 0xA1B6, 12299 - 11905: 0xA1B7, 12300 - 11905: 0xA1B8, 12301 - 11905: 0xA1B9, 12302 - 11905: 0xA1BA, 12303 - 11905: 0xA1BB, 12304 - 11905: 0xA1BE, 12305 - 11905: 0xA1BF, 12306 - 11905: 0xA893, 12307 - 11905: 0xA1FE, 12308 - 11905: 0xA1B2, 12309 - 11905: 0xA1B3, 12310 - 11905: 0xA1BC, 12311 - 11905: 0xA1BD, 12317 - 11905: 0xA894, 12318 - 11905: 0xA895, 12321 - 11905: 0xA940, 12322 - 11905: 0xA941, 12323 - 11905: 0xA942, 12324 - 11905: 0xA943, 12325 - 11905: 0xA944, 12326 - 11905: 0xA945, 12327 - 11905: 0xA946, 12328 - 11905: 0xA947, 12329 - 11905: 0xA948, 12350 - 11905: 0xA989, 12353 - 11905: 0xA4A1, 12354 - 11905: 0xA4A2, 12355 - 11905: 0xA4A3, 12356 - 11905: 0xA4A4, 12357 - 11905: 0xA4A5, 12358 - 11905: 0xA4A6, 12359 - 11905: 0xA4A7, 12360 - 11905: 0xA4A8, 12361 - 11905: 0xA4A9, 12362 - 11905: 0xA4AA, 12363 - 11905: 0xA4AB, 12364 - 11905: 0xA4AC, 12365 - 11905: 0xA4AD, 12366 - 11905: 0xA4AE, 12367 - 11905: 0xA4AF, 12368 - 11905: 0xA4B0, 12369 - 11905: 0xA4B1, 12370 - 11905: 0xA4B2, 12371 - 11905: 0xA4B3, 12372 - 11905: 0xA4B4, 12373 - 11905: 0xA4B5, 12374 - 11905: 0xA4B6, 12375 - 11905: 0xA4B7, 12376 - 11905: 0xA4B8, 12377 - 11905: 0xA4B9, 12378 - 11905: 0xA4BA, 12379 - 11905: 0xA4BB, 12380 - 11905: 0xA4BC, 12381 - 11905: 0xA4BD, 12382 - 11905: 0xA4BE, 12383 - 11905: 0xA4BF, 12384 - 11905: 0xA4C0, 12385 - 11905: 0xA4C1, 12386 - 11905: 0xA4C2, 12387 - 11905: 0xA4C3, 12388 - 11905: 0xA4C4, 12389 - 11905: 0xA4C5, 12390 - 11905: 0xA4C6, 12391 - 11905: 0xA4C7, 12392 - 11905: 0xA4C8, 12393 - 11905: 0xA4C9, 12394 - 11905: 0xA4CA, 12395 - 11905: 0xA4CB, 12396 - 11905: 0xA4CC, 12397 - 11905: 0xA4CD, 12398 - 11905: 0xA4CE, 12399 - 11905: 0xA4CF, 12400 - 11905: 0xA4D0, 12401 - 11905: 0xA4D1, 12402 - 11905: 0xA4D2, 12403 - 11905: 0xA4D3, 12404 - 11905: 0xA4D4, 12405 - 11905: 0xA4D5, 12406 - 11905: 0xA4D6, 12407 - 11905: 0xA4D7, 12408 - 11905: 0xA4D8, 12409 - 11905: 0xA4D9, 12410 - 11905: 0xA4DA, 12411 - 11905: 0xA4DB, 12412 - 11905: 0xA4DC, 12413 - 11905: 0xA4DD, 12414 - 11905: 0xA4DE, 12415 - 11905: 0xA4DF, 12416 - 11905: 0xA4E0, 12417 - 11905: 0xA4E1, 12418 - 11905: 0xA4E2, 12419 - 11905: 0xA4E3, 12420 - 11905: 0xA4E4, 12421 - 11905: 0xA4E5, 12422 - 11905: 0xA4E6, 12423 - 11905: 0xA4E7, 12424 - 11905: 0xA4E8, 12425 - 11905: 0xA4E9, 12426 - 11905: 0xA4EA, 12427 - 11905: 0xA4EB, 12428 - 11905: 0xA4EC, 12429 - 11905: 0xA4ED, 12430 - 11905: 0xA4EE, 12431 - 11905: 0xA4EF, 12432 - 11905: 0xA4F0, 12433 - 11905: 0xA4F1, 12434 - 11905: 0xA4F2, 12435 - 11905: 0xA4F3, 12443 - 11905: 0xA961, 12444 - 11905: 0xA962, 12445 - 11905: 0xA966, 12446 - 11905: 0xA967, 12449 - 11905: 0xA5A1, 12450 - 11905: 0xA5A2, 12451 - 11905: 0xA5A3, 12452 - 11905: 0xA5A4, 12453 - 11905: 0xA5A5, 12454 - 11905: 0xA5A6, 12455 - 11905: 0xA5A7, 12456 - 11905: 0xA5A8, 12457 - 11905: 0xA5A9, 12458 - 11905: 0xA5AA, 12459 - 11905: 0xA5AB, 12460 - 11905: 0xA5AC, 12461 - 11905: 0xA5AD, 12462 - 11905: 0xA5AE, 12463 - 11905: 0xA5AF, 12464 - 11905: 0xA5B0, 12465 - 11905: 0xA5B1, 12466 - 11905: 0xA5B2, 12467 - 11905: 0xA5B3, 12468 - 11905: 0xA5B4, 12469 - 11905: 0xA5B5, 12470 - 11905: 0xA5B6, 12471 - 11905: 0xA5B7, 12472 - 11905: 0xA5B8, 12473 - 11905: 0xA5B9, 12474 - 11905: 0xA5BA, 12475 - 11905: 0xA5BB, 12476 - 11905: 0xA5BC, 12477 - 11905: 0xA5BD, 12478 - 11905: 0xA5BE, 12479 - 11905: 0xA5BF, 12480 - 11905: 0xA5C0, 12481 - 11905: 0xA5C1, 12482 - 11905: 0xA5C2, 12483 - 11905: 0xA5C3, 12484 - 11905: 0xA5C4, 12485 - 11905: 0xA5C5, 12486 - 11905: 0xA5C6, 12487 - 11905: 0xA5C7, 12488 - 11905: 0xA5C8, 12489 - 11905: 0xA5C9, 12490 - 11905: 0xA5CA, 12491 - 11905: 0xA5CB, 12492 - 11905: 0xA5CC, 12493 - 11905: 0xA5CD, 12494 - 11905: 0xA5CE, 12495 - 11905: 0xA5CF, 12496 - 11905: 0xA5D0, 12497 - 11905: 0xA5D1, 12498 - 11905: 0xA5D2, 12499 - 11905: 0xA5D3, 12500 - 11905: 0xA5D4, 12501 - 11905: 0xA5D5, 12502 - 11905: 0xA5D6, 12503 - 11905: 0xA5D7, 12504 - 11905: 0xA5D8, 12505 - 11905: 0xA5D9, 12506 - 11905: 0xA5DA, 12507 - 11905: 0xA5DB, 12508 - 11905: 0xA5DC, 12509 - 11905: 0xA5DD, 12510 - 11905: 0xA5DE, 12511 - 11905: 0xA5DF, 12512 - 11905: 0xA5E0, 12513 - 11905: 0xA5E1, 12514 - 11905: 0xA5E2, 12515 - 11905: 0xA5E3, 12516 - 11905: 0xA5E4, 12517 - 11905: 0xA5E5, 12518 - 11905: 0xA5E6, 12519 - 11905: 0xA5E7, 12520 - 11905: 0xA5E8, 12521 - 11905: 0xA5E9, 12522 - 11905: 0xA5EA, 12523 - 11905: 0xA5EB, 12524 - 11905: 0xA5EC, 12525 - 11905: 0xA5ED, 12526 - 11905: 0xA5EE, 12527 - 11905: 0xA5EF, 12528 - 11905: 0xA5F0, 12529 - 11905: 0xA5F1, 12530 - 11905: 0xA5F2, 12531 - 11905: 0xA5F3, 12532 - 11905: 0xA5F4, 12533 - 11905: 0xA5F5, 12534 - 11905: 0xA5F6, 12540 - 11905: 0xA960, 12541 - 11905: 0xA963, 12542 - 11905: 0xA964, 12549 - 11905: 0xA8C5, 12550 - 11905: 0xA8C6, 12551 - 11905: 0xA8C7, 12552 - 11905: 0xA8C8, 12553 - 11905: 0xA8C9, 12554 - 11905: 0xA8CA, 12555 - 11905: 0xA8CB, 12556 - 11905: 0xA8CC, 12557 - 11905: 0xA8CD, 12558 - 11905: 0xA8CE, 12559 - 11905: 0xA8CF, 12560 - 11905: 0xA8D0, 12561 - 11905: 0xA8D1, 12562 - 11905: 0xA8D2, 12563 - 11905: 0xA8D3, 12564 - 11905: 0xA8D4, 12565 - 11905: 0xA8D5, 12566 - 11905: 0xA8D6, 12567 - 11905: 0xA8D7, 12568 - 11905: 0xA8D8, 12569 - 11905: 0xA8D9, 12570 - 11905: 0xA8DA, 12571 - 11905: 0xA8DB, 12572 - 11905: 0xA8DC, 12573 - 11905: 0xA8DD, 12574 - 11905: 0xA8DE, 12575 - 11905: 0xA8DF, 12576 - 11905: 0xA8E0, 12577 - 11905: 0xA8E1, 12578 - 11905: 0xA8E2, 12579 - 11905: 0xA8E3, 12580 - 11905: 0xA8E4, 12581 - 11905: 0xA8E5, 12582 - 11905: 0xA8E6, 12583 - 11905: 0xA8E7, 12584 - 11905: 0xA8E8, 12585 - 11905: 0xA8E9, 12832 - 11905: 0xA2E5, 12833 - 11905: 0xA2E6, 12834 - 11905: 0xA2E7, 12835 - 11905: 0xA2E8, 12836 - 11905: 0xA2E9, 12837 - 11905: 0xA2EA, 12838 - 11905: 0xA2EB, 12839 - 11905: 0xA2EC, 12840 - 11905: 0xA2ED, 12841 - 11905: 0xA2EE, 12849 - 11905: 0xA95A, 12963 - 11905: 0xA949, 13198 - 11905: 0xA94A, 13199 - 11905: 0xA94B, 13212 - 11905: 0xA94C, 13213 - 11905: 0xA94D, 13214 - 11905: 0xA94E, 13217 - 11905: 0xA94F, 13252 - 11905: 0xA950, 13262 - 11905: 0xA951, 13265 - 11905: 0xA952, 13266 - 11905: 0xA953, 13269 - 11905: 0xA954, 13383 - 11905: 0xFE56, 13427 - 11905: 0xFE55, 13726 - 11905: 0xFE5A, 13838 - 11905: 0xFE5C, 13850 - 11905: 0xFE5B, 14616 - 11905: 0xFE60, 14702 - 11905: 0xFE5F, 14799 - 11905: 0xFE62, 14800 - 11905: 0xFE65, 14815 - 11905: 0xFE63, 14963 - 11905: 0xFE64, 15182 - 11905: 0xFE68, 15470 - 11905: 0xFE69, 15584 - 11905: 0xFE6A, 16470 - 11905: 0xFE6F, 16735 - 11905: 0xFE70, 17207 - 11905: 0xFE72, 17324 - 11905: 0xFE78, 17329 - 11905: 0xFE77, 17373 - 11905: 0xFE7A, 17622 - 11905: 0xFE7B, 17996 - 11905: 0xFE7D, 18017 - 11905: 0xFE7C, 18211 - 11905: 0xFE80, 18217 - 11905: 0xFE81, 18300 - 11905: 0xFE82, 18317 - 11905: 0xFE83, 18759 - 11905: 0xFE85, 18810 - 11905: 0xFE86, 18813 - 11905: 0xFE87, 18818 - 11905: 0xFE88, 18819 - 11905: 0xFE89, 18821 - 11905: 0xFE8A, 18822 - 11905: 0xFE8B, 18843 - 11905: 0xFE8D, 18847 - 11905: 0xFE8C, 18870 - 11905: 0xFE8F, 18871 - 11905: 0xFE8E, 19575 - 11905: 0xFE96, 19615 - 11905: 0xFE93, 19616 - 11905: 0xFE94, 19617 - 11905: 0xFE95, 19618 - 11905: 0xFE97, 19619 - 11905: 0xFE92, 19731 - 11905: 0xFE98, 19732 - 11905: 0xFE99, 19733 - 11905: 0xFE9A, 19734 - 11905: 0xFE9B, 19735 - 11905: 0xFE9C, 19736 - 11905: 0xFE9D, 19737 - 11905: 0xFE9E, 19886 - 11905: 0xFE9F, 19968 - 11905: 0xD2BB, 19969 - 11905: 0xB6A1, 19970 - 11905: 0x8140, 19971 - 11905: 0xC6DF, 19972 - 11905: 0x8141, 19973 - 11905: 0x8142, 19974 - 11905: 0x8143, 19975 - 11905: 0xCDF2, 19976 - 11905: 0xD5C9, 19977 - 11905: 0xC8FD, 19978 - 11905: 0xC9CF, 19979 - 11905: 0xCFC2, 19980 - 11905: 0xD8A2, 19981 - 11905: 0xB2BB, 19982 - 11905: 0xD3EB, 19983 - 11905: 0x8144, 19984 - 11905: 0xD8A4, 19985 - 11905: 0xB3F3, 19986 - 11905: 0x8145, 19987 - 11905: 0xD7A8, 19988 - 11905: 0xC7D2, 19989 - 11905: 0xD8A7, 19990 - 11905: 0xCAC0, 19991 - 11905: 0x8146, 19992 - 11905: 0xC7F0, 19993 - 11905: 0xB1FB, 19994 - 11905: 0xD2B5, 19995 - 11905: 0xB4D4, 19996 - 11905: 0xB6AB, 19997 - 11905: 0xCBBF, 19998 - 11905: 0xD8A9, 19999 - 11905: 0x8147, 20000 - 11905: 0x8148, 20001 - 11905: 0x8149, 20002 - 11905: 0xB6AA, 20003 - 11905: 0x814A, 20004 - 11905: 0xC1BD, 20005 - 11905: 0xD1CF, 20006 - 11905: 0x814B, 20007 - 11905: 0xC9A5, 20008 - 11905: 0xD8AD, 20009 - 11905: 0x814C, 20010 - 11905: 0xB8F6, 20011 - 11905: 0xD1BE, 20012 - 11905: 0xE3DC, 20013 - 11905: 0xD6D0, 20014 - 11905: 0x814D, 20015 - 11905: 0x814E, 20016 - 11905: 0xB7E1, 20017 - 11905: 0x814F, 20018 - 11905: 0xB4AE, 20019 - 11905: 0x8150, 20020 - 11905: 0xC1D9, 20021 - 11905: 0x8151, 20022 - 11905: 0xD8BC, 20023 - 11905: 0x8152, 20024 - 11905: 0xCDE8, 20025 - 11905: 0xB5A4, 20026 - 11905: 0xCEAA, 20027 - 11905: 0xD6F7, 20028 - 11905: 0x8153, 20029 - 11905: 0xC0F6, 20030 - 11905: 0xBED9, 20031 - 11905: 0xD8AF, 20032 - 11905: 0x8154, 20033 - 11905: 0x8155, 20034 - 11905: 0x8156, 20035 - 11905: 0xC4CB, 20036 - 11905: 0x8157, 20037 - 11905: 0xBEC3, 20038 - 11905: 0x8158, 20039 - 11905: 0xD8B1, 20040 - 11905: 0xC3B4, 20041 - 11905: 0xD2E5, 20042 - 11905: 0x8159, 20043 - 11905: 0xD6AE, 20044 - 11905: 0xCEDA, 20045 - 11905: 0xD5A7, 20046 - 11905: 0xBAF5, 20047 - 11905: 0xB7A6, 20048 - 11905: 0xC0D6, 20049 - 11905: 0x815A, 20050 - 11905: 0xC6B9, 20051 - 11905: 0xC5D2, 20052 - 11905: 0xC7C7, 20053 - 11905: 0x815B, 20054 - 11905: 0xB9D4, 20055 - 11905: 0x815C, 20056 - 11905: 0xB3CB, 20057 - 11905: 0xD2D2, 20058 - 11905: 0x815D, 20059 - 11905: 0x815E, 20060 - 11905: 0xD8BF, 20061 - 11905: 0xBEC5, 20062 - 11905: 0xC6F2, 20063 - 11905: 0xD2B2, 20064 - 11905: 0xCFB0, 20065 - 11905: 0xCFE7, 20066 - 11905: 0x815F, 20067 - 11905: 0x8160, 20068 - 11905: 0x8161, 20069 - 11905: 0x8162, 20070 - 11905: 0xCAE9, 20071 - 11905: 0x8163, 20072 - 11905: 0x8164, 20073 - 11905: 0xD8C0, 20074 - 11905: 0x8165, 20075 - 11905: 0x8166, 20076 - 11905: 0x8167, 20077 - 11905: 0x8168, 20078 - 11905: 0x8169, 20079 - 11905: 0x816A, 20080 - 11905: 0xC2F2, 20081 - 11905: 0xC2D2, 20082 - 11905: 0x816B, 20083 - 11905: 0xC8E9, 20084 - 11905: 0x816C, 20085 - 11905: 0x816D, 20086 - 11905: 0x816E, 20087 - 11905: 0x816F, 20088 - 11905: 0x8170, 20089 - 11905: 0x8171, 20090 - 11905: 0x8172, 20091 - 11905: 0x8173, 20092 - 11905: 0x8174, 20093 - 11905: 0x8175, 20094 - 11905: 0xC7AC, 20095 - 11905: 0x8176, 20096 - 11905: 0x8177, 20097 - 11905: 0x8178, 20098 - 11905: 0x8179, 20099 - 11905: 0x817A, 20100 - 11905: 0x817B, 20101 - 11905: 0x817C, 20102 - 11905: 0xC1CB, 20103 - 11905: 0x817D, 20104 - 11905: 0xD3E8, 20105 - 11905: 0xD5F9, 20106 - 11905: 0x817E, 20107 - 11905: 0xCAC2, 20108 - 11905: 0xB6FE, 20109 - 11905: 0xD8A1, 20110 - 11905: 0xD3DA, 20111 - 11905: 0xBFF7, 20112 - 11905: 0x8180, 20113 - 11905: 0xD4C6, 20114 - 11905: 0xBBA5, 20115 - 11905: 0xD8C1, 20116 - 11905: 0xCEE5, 20117 - 11905: 0xBEAE, 20118 - 11905: 0x8181, 20119 - 11905: 0x8182, 20120 - 11905: 0xD8A8, 20121 - 11905: 0x8183, 20122 - 11905: 0xD1C7, 20123 - 11905: 0xD0A9, 20124 - 11905: 0x8184, 20125 - 11905: 0x8185, 20126 - 11905: 0x8186, 20127 - 11905: 0xD8BD, 20128 - 11905: 0xD9EF, 20129 - 11905: 0xCDF6, 20130 - 11905: 0xBFBA, 20131 - 11905: 0x8187, 20132 - 11905: 0xBDBB, 20133 - 11905: 0xBAA5, 20134 - 11905: 0xD2E0, 20135 - 11905: 0xB2FA, 20136 - 11905: 0xBAE0, 20137 - 11905: 0xC4B6, 20138 - 11905: 0x8188, 20139 - 11905: 0xCFED, 20140 - 11905: 0xBEA9, 20141 - 11905: 0xCDA4, 20142 - 11905: 0xC1C1, 20143 - 11905: 0x8189, 20144 - 11905: 0x818A, 20145 - 11905: 0x818B, 20146 - 11905: 0xC7D7, 20147 - 11905: 0xD9F1, 20148 - 11905: 0x818C, 20149 - 11905: 0xD9F4, 20150 - 11905: 0x818D, 20151 - 11905: 0x818E, 20152 - 11905: 0x818F, 20153 - 11905: 0x8190, 20154 - 11905: 0xC8CB, 20155 - 11905: 0xD8E9, 20156 - 11905: 0x8191, 20157 - 11905: 0x8192, 20158 - 11905: 0x8193, 20159 - 11905: 0xD2DA, 20160 - 11905: 0xCAB2, 20161 - 11905: 0xC8CA, 20162 - 11905: 0xD8EC, 20163 - 11905: 0xD8EA, 20164 - 11905: 0xD8C6, 20165 - 11905: 0xBDF6, 20166 - 11905: 0xC6CD, 20167 - 11905: 0xB3F0, 20168 - 11905: 0x8194, 20169 - 11905: 0xD8EB, 20170 - 11905: 0xBDF1, 20171 - 11905: 0xBDE9, 20172 - 11905: 0x8195, 20173 - 11905: 0xC8D4, 20174 - 11905: 0xB4D3, 20175 - 11905: 0x8196, 20176 - 11905: 0x8197, 20177 - 11905: 0xC2D8, 20178 - 11905: 0x8198, 20179 - 11905: 0xB2D6, 20180 - 11905: 0xD7D0, 20181 - 11905: 0xCACB, 20182 - 11905: 0xCBFB, 20183 - 11905: 0xD5CC, 20184 - 11905: 0xB8B6, 20185 - 11905: 0xCFC9, 20186 - 11905: 0x8199, 20187 - 11905: 0x819A, 20188 - 11905: 0x819B, 20189 - 11905: 0xD9DA, 20190 - 11905: 0xD8F0, 20191 - 11905: 0xC7AA, 20192 - 11905: 0x819C, 20193 - 11905: 0xD8EE, 20194 - 11905: 0x819D, 20195 - 11905: 0xB4FA, 20196 - 11905: 0xC1EE, 20197 - 11905: 0xD2D4, 20198 - 11905: 0x819E, 20199 - 11905: 0x819F, 20200 - 11905: 0xD8ED, 20201 - 11905: 0x81A0, 20202 - 11905: 0xD2C7, 20203 - 11905: 0xD8EF, 20204 - 11905: 0xC3C7, 20205 - 11905: 0x81A1, 20206 - 11905: 0x81A2, 20207 - 11905: 0x81A3, 20208 - 11905: 0xD1F6, 20209 - 11905: 0x81A4, 20210 - 11905: 0xD6D9, 20211 - 11905: 0xD8F2, 20212 - 11905: 0x81A5, 20213 - 11905: 0xD8F5, 20214 - 11905: 0xBCFE, 20215 - 11905: 0xBCDB, 20216 - 11905: 0x81A6, 20217 - 11905: 0x81A7, 20218 - 11905: 0x81A8, 20219 - 11905: 0xC8CE, 20220 - 11905: 0x81A9, 20221 - 11905: 0xB7DD, 20222 - 11905: 0x81AA, 20223 - 11905: 0xB7C2, 20224 - 11905: 0x81AB, 20225 - 11905: 0xC6F3, 20226 - 11905: 0x81AC, 20227 - 11905: 0x81AD, 20228 - 11905: 0x81AE, 20229 - 11905: 0x81AF, 20230 - 11905: 0x81B0, 20231 - 11905: 0x81B1, 20232 - 11905: 0x81B2, 20233 - 11905: 0xD8F8, 20234 - 11905: 0xD2C1, 20235 - 11905: 0x81B3, 20236 - 11905: 0x81B4, 20237 - 11905: 0xCEE9, 20238 - 11905: 0xBCBF, 20239 - 11905: 0xB7FC, 20240 - 11905: 0xB7A5, 20241 - 11905: 0xD0DD, 20242 - 11905: 0x81B5, 20243 - 11905: 0x81B6, 20244 - 11905: 0x81B7, 20245 - 11905: 0x81B8, 20246 - 11905: 0x81B9, 20247 - 11905: 0xD6DA, 20248 - 11905: 0xD3C5, 20249 - 11905: 0xBBEF, 20250 - 11905: 0xBBE1, 20251 - 11905: 0xD8F1, 20252 - 11905: 0x81BA, 20253 - 11905: 0x81BB, 20254 - 11905: 0xC9A1, 20255 - 11905: 0xCEB0, 20256 - 11905: 0xB4AB, 20257 - 11905: 0x81BC, 20258 - 11905: 0xD8F3, 20259 - 11905: 0x81BD, 20260 - 11905: 0xC9CB, 20261 - 11905: 0xD8F6, 20262 - 11905: 0xC2D7, 20263 - 11905: 0xD8F7, 20264 - 11905: 0x81BE, 20265 - 11905: 0x81BF, 20266 - 11905: 0xCEB1, 20267 - 11905: 0xD8F9, 20268 - 11905: 0x81C0, 20269 - 11905: 0x81C1, 20270 - 11905: 0x81C2, 20271 - 11905: 0xB2AE, 20272 - 11905: 0xB9C0, 20273 - 11905: 0x81C3, 20274 - 11905: 0xD9A3, 20275 - 11905: 0x81C4, 20276 - 11905: 0xB0E9, 20277 - 11905: 0x81C5, 20278 - 11905: 0xC1E6, 20279 - 11905: 0x81C6, 20280 - 11905: 0xC9EC, 20281 - 11905: 0x81C7, 20282 - 11905: 0xCBC5, 20283 - 11905: 0x81C8, 20284 - 11905: 0xCBC6, 20285 - 11905: 0xD9A4, 20286 - 11905: 0x81C9, 20287 - 11905: 0x81CA, 20288 - 11905: 0x81CB, 20289 - 11905: 0x81CC, 20290 - 11905: 0x81CD, 20291 - 11905: 0xB5E8, 20292 - 11905: 0x81CE, 20293 - 11905: 0x81CF, 20294 - 11905: 0xB5AB, 20295 - 11905: 0x81D0, 20296 - 11905: 0x81D1, 20297 - 11905: 0x81D2, 20298 - 11905: 0x81D3, 20299 - 11905: 0x81D4, 20300 - 11905: 0x81D5, 20301 - 11905: 0xCEBB, 20302 - 11905: 0xB5CD, 20303 - 11905: 0xD7A1, 20304 - 11905: 0xD7F4, 20305 - 11905: 0xD3D3, 20306 - 11905: 0x81D6, 20307 - 11905: 0xCCE5, 20308 - 11905: 0x81D7, 20309 - 11905: 0xBACE, 20310 - 11905: 0x81D8, 20311 - 11905: 0xD9A2, 20312 - 11905: 0xD9DC, 20313 - 11905: 0xD3E0, 20314 - 11905: 0xD8FD, 20315 - 11905: 0xB7F0, 20316 - 11905: 0xD7F7, 20317 - 11905: 0xD8FE, 20318 - 11905: 0xD8FA, 20319 - 11905: 0xD9A1, 20320 - 11905: 0xC4E3, 20321 - 11905: 0x81D9, 20322 - 11905: 0x81DA, 20323 - 11905: 0xD3B6, 20324 - 11905: 0xD8F4, 20325 - 11905: 0xD9DD, 20326 - 11905: 0x81DB, 20327 - 11905: 0xD8FB, 20328 - 11905: 0x81DC, 20329 - 11905: 0xC5E5, 20330 - 11905: 0x81DD, 20331 - 11905: 0x81DE, 20332 - 11905: 0xC0D0, 20333 - 11905: 0x81DF, 20334 - 11905: 0x81E0, 20335 - 11905: 0xD1F0, 20336 - 11905: 0xB0DB, 20337 - 11905: 0x81E1, 20338 - 11905: 0x81E2, 20339 - 11905: 0xBCD1, 20340 - 11905: 0xD9A6, 20341 - 11905: 0x81E3, 20342 - 11905: 0xD9A5, 20343 - 11905: 0x81E4, 20344 - 11905: 0x81E5, 20345 - 11905: 0x81E6, 20346 - 11905: 0x81E7, 20347 - 11905: 0xD9AC, 20348 - 11905: 0xD9AE, 20349 - 11905: 0x81E8, 20350 - 11905: 0xD9AB, 20351 - 11905: 0xCAB9, 20352 - 11905: 0x81E9, 20353 - 11905: 0x81EA, 20354 - 11905: 0x81EB, 20355 - 11905: 0xD9A9, 20356 - 11905: 0xD6B6, 20357 - 11905: 0x81EC, 20358 - 11905: 0x81ED, 20359 - 11905: 0x81EE, 20360 - 11905: 0xB3DE, 20361 - 11905: 0xD9A8, 20362 - 11905: 0x81EF, 20363 - 11905: 0xC0FD, 20364 - 11905: 0x81F0, 20365 - 11905: 0xCACC, 20366 - 11905: 0x81F1, 20367 - 11905: 0xD9AA, 20368 - 11905: 0x81F2, 20369 - 11905: 0xD9A7, 20370 - 11905: 0x81F3, 20371 - 11905: 0x81F4, 20372 - 11905: 0xD9B0, 20373 - 11905: 0x81F5, 20374 - 11905: 0x81F6, 20375 - 11905: 0xB6B1, 20376 - 11905: 0x81F7, 20377 - 11905: 0x81F8, 20378 - 11905: 0x81F9, 20379 - 11905: 0xB9A9, 20380 - 11905: 0x81FA, 20381 - 11905: 0xD2C0, 20382 - 11905: 0x81FB, 20383 - 11905: 0x81FC, 20384 - 11905: 0xCFC0, 20385 - 11905: 0x81FD, 20386 - 11905: 0x81FE, 20387 - 11905: 0xC2C2, 20388 - 11905: 0x8240, 20389 - 11905: 0xBDC4, 20390 - 11905: 0xD5EC, 20391 - 11905: 0xB2E0, 20392 - 11905: 0xC7C8, 20393 - 11905: 0xBFEB, 20394 - 11905: 0xD9AD, 20395 - 11905: 0x8241, 20396 - 11905: 0xD9AF, 20397 - 11905: 0x8242, 20398 - 11905: 0xCEEA, 20399 - 11905: 0xBAEE, 20400 - 11905: 0x8243, 20401 - 11905: 0x8244, 20402 - 11905: 0x8245, 20403 - 11905: 0x8246, 20404 - 11905: 0x8247, 20405 - 11905: 0xC7D6, 20406 - 11905: 0x8248, 20407 - 11905: 0x8249, 20408 - 11905: 0x824A, 20409 - 11905: 0x824B, 20410 - 11905: 0x824C, 20411 - 11905: 0x824D, 20412 - 11905: 0x824E, 20413 - 11905: 0x824F, 20414 - 11905: 0x8250, 20415 - 11905: 0xB1E3, 20416 - 11905: 0x8251, 20417 - 11905: 0x8252, 20418 - 11905: 0x8253, 20419 - 11905: 0xB4D9, 20420 - 11905: 0xB6ED, 20421 - 11905: 0xD9B4, 20422 - 11905: 0x8254, 20423 - 11905: 0x8255, 20424 - 11905: 0x8256, 20425 - 11905: 0x8257, 20426 - 11905: 0xBFA1, 20427 - 11905: 0x8258, 20428 - 11905: 0x8259, 20429 - 11905: 0x825A, 20430 - 11905: 0xD9DE, 20431 - 11905: 0xC7CE, 20432 - 11905: 0xC0FE, 20433 - 11905: 0xD9B8, 20434 - 11905: 0x825B, 20435 - 11905: 0x825C, 20436 - 11905: 0x825D, 20437 - 11905: 0x825E, 20438 - 11905: 0x825F, 20439 - 11905: 0xCBD7, 20440 - 11905: 0xB7FD, 20441 - 11905: 0x8260, 20442 - 11905: 0xD9B5, 20443 - 11905: 0x8261, 20444 - 11905: 0xD9B7, 20445 - 11905: 0xB1A3, 20446 - 11905: 0xD3E1, 20447 - 11905: 0xD9B9, 20448 - 11905: 0x8262, 20449 - 11905: 0xD0C5, 20450 - 11905: 0x8263, 20451 - 11905: 0xD9B6, 20452 - 11905: 0x8264, 20453 - 11905: 0x8265, 20454 - 11905: 0xD9B1, 20455 - 11905: 0x8266, 20456 - 11905: 0xD9B2, 20457 - 11905: 0xC1A9, 20458 - 11905: 0xD9B3, 20459 - 11905: 0x8267, 20460 - 11905: 0x8268, 20461 - 11905: 0xBCF3, 20462 - 11905: 0xD0DE, 20463 - 11905: 0xB8A9, 20464 - 11905: 0x8269, 20465 - 11905: 0xBEE3, 20466 - 11905: 0x826A, 20467 - 11905: 0xD9BD, 20468 - 11905: 0x826B, 20469 - 11905: 0x826C, 20470 - 11905: 0x826D, 20471 - 11905: 0x826E, 20472 - 11905: 0xD9BA, 20473 - 11905: 0x826F, 20474 - 11905: 0xB0B3, 20475 - 11905: 0x8270, 20476 - 11905: 0x8271, 20477 - 11905: 0x8272, 20478 - 11905: 0xD9C2, 20479 - 11905: 0x8273, 20480 - 11905: 0x8274, 20481 - 11905: 0x8275, 20482 - 11905: 0x8276, 20483 - 11905: 0x8277, 20484 - 11905: 0x8278, 20485 - 11905: 0x8279, 20486 - 11905: 0x827A, 20487 - 11905: 0x827B, 20488 - 11905: 0x827C, 20489 - 11905: 0x827D, 20490 - 11905: 0x827E, 20491 - 11905: 0x8280, 20492 - 11905: 0xD9C4, 20493 - 11905: 0xB1B6, 20494 - 11905: 0x8281, 20495 - 11905: 0xD9BF, 20496 - 11905: 0x8282, 20497 - 11905: 0x8283, 20498 - 11905: 0xB5B9, 20499 - 11905: 0x8284, 20500 - 11905: 0xBEF3, 20501 - 11905: 0x8285, 20502 - 11905: 0x8286, 20503 - 11905: 0x8287, 20504 - 11905: 0xCCC8, 20505 - 11905: 0xBAF2, 20506 - 11905: 0xD2D0, 20507 - 11905: 0x8288, 20508 - 11905: 0xD9C3, 20509 - 11905: 0x8289, 20510 - 11905: 0x828A, 20511 - 11905: 0xBDE8, 20512 - 11905: 0x828B, 20513 - 11905: 0xB3AB, 20514 - 11905: 0x828C, 20515 - 11905: 0x828D, 20516 - 11905: 0x828E, 20517 - 11905: 0xD9C5, 20518 - 11905: 0xBEEB, 20519 - 11905: 0x828F, 20520 - 11905: 0xD9C6, 20521 - 11905: 0xD9BB, 20522 - 11905: 0xC4DF, 20523 - 11905: 0x8290, 20524 - 11905: 0xD9BE, 20525 - 11905: 0xD9C1, 20526 - 11905: 0xD9C0, 20527 - 11905: 0x8291, 20528 - 11905: 0x8292, 20529 - 11905: 0x8293, 20530 - 11905: 0x8294, 20531 - 11905: 0x8295, 20532 - 11905: 0x8296, 20533 - 11905: 0x8297, 20534 - 11905: 0x8298, 20535 - 11905: 0x8299, 20536 - 11905: 0x829A, 20537 - 11905: 0x829B, 20538 - 11905: 0xD5AE, 20539 - 11905: 0x829C, 20540 - 11905: 0xD6B5, 20541 - 11905: 0x829D, 20542 - 11905: 0xC7E3, 20543 - 11905: 0x829E, 20544 - 11905: 0x829F, 20545 - 11905: 0x82A0, 20546 - 11905: 0x82A1, 20547 - 11905: 0xD9C8, 20548 - 11905: 0x82A2, 20549 - 11905: 0x82A3, 20550 - 11905: 0x82A4, 20551 - 11905: 0xBCD9, 20552 - 11905: 0xD9CA, 20553 - 11905: 0x82A5, 20554 - 11905: 0x82A6, 20555 - 11905: 0x82A7, 20556 - 11905: 0xD9BC, 20557 - 11905: 0x82A8, 20558 - 11905: 0xD9CB, 20559 - 11905: 0xC6AB, 20560 - 11905: 0x82A9, 20561 - 11905: 0x82AA, 20562 - 11905: 0x82AB, 20563 - 11905: 0x82AC, 20564 - 11905: 0x82AD, 20565 - 11905: 0xD9C9, 20566 - 11905: 0x82AE, 20567 - 11905: 0x82AF, 20568 - 11905: 0x82B0, 20569 - 11905: 0x82B1, 20570 - 11905: 0xD7F6, 20571 - 11905: 0x82B2, 20572 - 11905: 0xCDA3, 20573 - 11905: 0x82B3, 20574 - 11905: 0x82B4, 20575 - 11905: 0x82B5, 20576 - 11905: 0x82B6, 20577 - 11905: 0x82B7, 20578 - 11905: 0x82B8, 20579 - 11905: 0x82B9, 20580 - 11905: 0x82BA, 20581 - 11905: 0xBDA1, 20582 - 11905: 0x82BB, 20583 - 11905: 0x82BC, 20584 - 11905: 0x82BD, 20585 - 11905: 0x82BE, 20586 - 11905: 0x82BF, 20587 - 11905: 0x82C0, 20588 - 11905: 0xD9CC, 20589 - 11905: 0x82C1, 20590 - 11905: 0x82C2, 20591 - 11905: 0x82C3, 20592 - 11905: 0x82C4, 20593 - 11905: 0x82C5, 20594 - 11905: 0x82C6, 20595 - 11905: 0x82C7, 20596 - 11905: 0x82C8, 20597 - 11905: 0x82C9, 20598 - 11905: 0xC5BC, 20599 - 11905: 0xCDB5, 20600 - 11905: 0x82CA, 20601 - 11905: 0x82CB, 20602 - 11905: 0x82CC, 20603 - 11905: 0xD9CD, 20604 - 11905: 0x82CD, 20605 - 11905: 0x82CE, 20606 - 11905: 0xD9C7, 20607 - 11905: 0xB3A5, 20608 - 11905: 0xBFFE, 20609 - 11905: 0x82CF, 20610 - 11905: 0x82D0, 20611 - 11905: 0x82D1, 20612 - 11905: 0x82D2, 20613 - 11905: 0xB8B5, 20614 - 11905: 0x82D3, 20615 - 11905: 0x82D4, 20616 - 11905: 0xC0FC, 20617 - 11905: 0x82D5, 20618 - 11905: 0x82D6, 20619 - 11905: 0x82D7, 20620 - 11905: 0x82D8, 20621 - 11905: 0xB0F8, 20622 - 11905: 0x82D9, 20623 - 11905: 0x82DA, 20624 - 11905: 0x82DB, 20625 - 11905: 0x82DC, 20626 - 11905: 0x82DD, 20627 - 11905: 0x82DE, 20628 - 11905: 0x82DF, 20629 - 11905: 0x82E0, 20630 - 11905: 0x82E1, 20631 - 11905: 0x82E2, 20632 - 11905: 0x82E3, 20633 - 11905: 0x82E4, 20634 - 11905: 0x82E5, 20635 - 11905: 0x82E6, 20636 - 11905: 0x82E7, 20637 - 11905: 0x82E8, 20638 - 11905: 0x82E9, 20639 - 11905: 0x82EA, 20640 - 11905: 0x82EB, 20641 - 11905: 0x82EC, 20642 - 11905: 0x82ED, 20643 - 11905: 0xB4F6, 20644 - 11905: 0x82EE, 20645 - 11905: 0xD9CE, 20646 - 11905: 0x82EF, 20647 - 11905: 0xD9CF, 20648 - 11905: 0xB4A2, 20649 - 11905: 0xD9D0, 20650 - 11905: 0x82F0, 20651 - 11905: 0x82F1, 20652 - 11905: 0xB4DF, 20653 - 11905: 0x82F2, 20654 - 11905: 0x82F3, 20655 - 11905: 0x82F4, 20656 - 11905: 0x82F5, 20657 - 11905: 0x82F6, 20658 - 11905: 0xB0C1, 20659 - 11905: 0x82F7, 20660 - 11905: 0x82F8, 20661 - 11905: 0x82F9, 20662 - 11905: 0x82FA, 20663 - 11905: 0x82FB, 20664 - 11905: 0x82FC, 20665 - 11905: 0x82FD, 20666 - 11905: 0xD9D1, 20667 - 11905: 0xC9B5, 20668 - 11905: 0x82FE, 20669 - 11905: 0x8340, 20670 - 11905: 0x8341, 20671 - 11905: 0x8342, 20672 - 11905: 0x8343, 20673 - 11905: 0x8344, 20674 - 11905: 0x8345, 20675 - 11905: 0x8346, 20676 - 11905: 0x8347, 20677 - 11905: 0x8348, 20678 - 11905: 0x8349, 20679 - 11905: 0x834A, 20680 - 11905: 0x834B, 20681 - 11905: 0x834C, 20682 - 11905: 0x834D, 20683 - 11905: 0x834E, 20684 - 11905: 0x834F, 20685 - 11905: 0x8350, 20686 - 11905: 0x8351, 20687 - 11905: 0xCFF1, 20688 - 11905: 0x8352, 20689 - 11905: 0x8353, 20690 - 11905: 0x8354, 20691 - 11905: 0x8355, 20692 - 11905: 0x8356, 20693 - 11905: 0x8357, 20694 - 11905: 0xD9D2, 20695 - 11905: 0x8358, 20696 - 11905: 0x8359, 20697 - 11905: 0x835A, 20698 - 11905: 0xC1C5, 20699 - 11905: 0x835B, 20700 - 11905: 0x835C, 20701 - 11905: 0x835D, 20702 - 11905: 0x835E, 20703 - 11905: 0x835F, 20704 - 11905: 0x8360, 20705 - 11905: 0x8361, 20706 - 11905: 0x8362, 20707 - 11905: 0x8363, 20708 - 11905: 0x8364, 20709 - 11905: 0x8365, 20710 - 11905: 0xD9D6, 20711 - 11905: 0xC9AE, 20712 - 11905: 0x8366, 20713 - 11905: 0x8367, 20714 - 11905: 0x8368, 20715 - 11905: 0x8369, 20716 - 11905: 0xD9D5, 20717 - 11905: 0xD9D4, 20718 - 11905: 0xD9D7, 20719 - 11905: 0x836A, 20720 - 11905: 0x836B, 20721 - 11905: 0x836C, 20722 - 11905: 0x836D, 20723 - 11905: 0xCBDB, 20724 - 11905: 0x836E, 20725 - 11905: 0xBDA9, 20726 - 11905: 0x836F, 20727 - 11905: 0x8370, 20728 - 11905: 0x8371, 20729 - 11905: 0x8372, 20730 - 11905: 0x8373, 20731 - 11905: 0xC6A7, 20732 - 11905: 0x8374, 20733 - 11905: 0x8375, 20734 - 11905: 0x8376, 20735 - 11905: 0x8377, 20736 - 11905: 0x8378, 20737 - 11905: 0x8379, 20738 - 11905: 0x837A, 20739 - 11905: 0x837B, 20740 - 11905: 0x837C, 20741 - 11905: 0x837D, 20742 - 11905: 0xD9D3, 20743 - 11905: 0xD9D8, 20744 - 11905: 0x837E, 20745 - 11905: 0x8380, 20746 - 11905: 0x8381, 20747 - 11905: 0xD9D9, 20748 - 11905: 0x8382, 20749 - 11905: 0x8383, 20750 - 11905: 0x8384, 20751 - 11905: 0x8385, 20752 - 11905: 0x8386, 20753 - 11905: 0x8387, 20754 - 11905: 0xC8E5, 20755 - 11905: 0x8388, 20756 - 11905: 0x8389, 20757 - 11905: 0x838A, 20758 - 11905: 0x838B, 20759 - 11905: 0x838C, 20760 - 11905: 0x838D, 20761 - 11905: 0x838E, 20762 - 11905: 0x838F, 20763 - 11905: 0x8390, 20764 - 11905: 0x8391, 20765 - 11905: 0x8392, 20766 - 11905: 0x8393, 20767 - 11905: 0x8394, 20768 - 11905: 0x8395, 20769 - 11905: 0xC0DC, 20770 - 11905: 0x8396, 20771 - 11905: 0x8397, 20772 - 11905: 0x8398, 20773 - 11905: 0x8399, 20774 - 11905: 0x839A, 20775 - 11905: 0x839B, 20776 - 11905: 0x839C, 20777 - 11905: 0x839D, 20778 - 11905: 0x839E, 20779 - 11905: 0x839F, 20780 - 11905: 0x83A0, 20781 - 11905: 0x83A1, 20782 - 11905: 0x83A2, 20783 - 11905: 0x83A3, 20784 - 11905: 0x83A4, 20785 - 11905: 0x83A5, 20786 - 11905: 0x83A6, 20787 - 11905: 0x83A7, 20788 - 11905: 0x83A8, 20789 - 11905: 0x83A9, 20790 - 11905: 0x83AA, 20791 - 11905: 0x83AB, 20792 - 11905: 0x83AC, 20793 - 11905: 0x83AD, 20794 - 11905: 0x83AE, 20795 - 11905: 0x83AF, 20796 - 11905: 0x83B0, 20797 - 11905: 0x83B1, 20798 - 11905: 0x83B2, 20799 - 11905: 0xB6F9, 20800 - 11905: 0xD8A3, 20801 - 11905: 0xD4CA, 20802 - 11905: 0x83B3, 20803 - 11905: 0xD4AA, 20804 - 11905: 0xD0D6, 20805 - 11905: 0xB3E4, 20806 - 11905: 0xD5D7, 20807 - 11905: 0x83B4, 20808 - 11905: 0xCFC8, 20809 - 11905: 0xB9E2, 20810 - 11905: 0x83B5, 20811 - 11905: 0xBFCB, 20812 - 11905: 0x83B6, 20813 - 11905: 0xC3E2, 20814 - 11905: 0x83B7, 20815 - 11905: 0x83B8, 20816 - 11905: 0x83B9, 20817 - 11905: 0xB6D2, 20818 - 11905: 0x83BA, 20819 - 11905: 0x83BB, 20820 - 11905: 0xCDC3, 20821 - 11905: 0xD9EE, 20822 - 11905: 0xD9F0, 20823 - 11905: 0x83BC, 20824 - 11905: 0x83BD, 20825 - 11905: 0x83BE, 20826 - 11905: 0xB5B3, 20827 - 11905: 0x83BF, 20828 - 11905: 0xB6B5, 20829 - 11905: 0x83C0, 20830 - 11905: 0x83C1, 20831 - 11905: 0x83C2, 20832 - 11905: 0x83C3, 20833 - 11905: 0x83C4, 20834 - 11905: 0xBEA4, 20835 - 11905: 0x83C5, 20836 - 11905: 0x83C6, 20837 - 11905: 0xC8EB, 20838 - 11905: 0x83C7, 20839 - 11905: 0x83C8, 20840 - 11905: 0xC8AB, 20841 - 11905: 0x83C9, 20842 - 11905: 0x83CA, 20843 - 11905: 0xB0CB, 20844 - 11905: 0xB9AB, 20845 - 11905: 0xC1F9, 20846 - 11905: 0xD9E2, 20847 - 11905: 0x83CB, 20848 - 11905: 0xC0BC, 20849 - 11905: 0xB9B2, 20850 - 11905: 0x83CC, 20851 - 11905: 0xB9D8, 20852 - 11905: 0xD0CB, 20853 - 11905: 0xB1F8, 20854 - 11905: 0xC6E4, 20855 - 11905: 0xBEDF, 20856 - 11905: 0xB5E4, 20857 - 11905: 0xD7C8, 20858 - 11905: 0x83CD, 20859 - 11905: 0xD1F8, 20860 - 11905: 0xBCE6, 20861 - 11905: 0xCADE, 20862 - 11905: 0x83CE, 20863 - 11905: 0x83CF, 20864 - 11905: 0xBCBD, 20865 - 11905: 0xD9E6, 20866 - 11905: 0xD8E7, 20867 - 11905: 0x83D0, 20868 - 11905: 0x83D1, 20869 - 11905: 0xC4DA, 20870 - 11905: 0x83D2, 20871 - 11905: 0x83D3, 20872 - 11905: 0xB8D4, 20873 - 11905: 0xC8BD, 20874 - 11905: 0x83D4, 20875 - 11905: 0x83D5, 20876 - 11905: 0xB2E1, 20877 - 11905: 0xD4D9, 20878 - 11905: 0x83D6, 20879 - 11905: 0x83D7, 20880 - 11905: 0x83D8, 20881 - 11905: 0x83D9, 20882 - 11905: 0xC3B0, 20883 - 11905: 0x83DA, 20884 - 11905: 0x83DB, 20885 - 11905: 0xC3E1, 20886 - 11905: 0xDAA2, 20887 - 11905: 0xC8DF, 20888 - 11905: 0x83DC, 20889 - 11905: 0xD0B4, 20890 - 11905: 0x83DD, 20891 - 11905: 0xBEFC, 20892 - 11905: 0xC5A9, 20893 - 11905: 0x83DE, 20894 - 11905: 0x83DF, 20895 - 11905: 0x83E0, 20896 - 11905: 0xB9DA, 20897 - 11905: 0x83E1, 20898 - 11905: 0xDAA3, 20899 - 11905: 0x83E2, 20900 - 11905: 0xD4A9, 20901 - 11905: 0xDAA4, 20902 - 11905: 0x83E3, 20903 - 11905: 0x83E4, 20904 - 11905: 0x83E5, 20905 - 11905: 0x83E6, 20906 - 11905: 0x83E7, 20907 - 11905: 0xD9FB, 20908 - 11905: 0xB6AC, 20909 - 11905: 0x83E8, 20910 - 11905: 0x83E9, 20911 - 11905: 0xB7EB, 20912 - 11905: 0xB1F9, 20913 - 11905: 0xD9FC, 20914 - 11905: 0xB3E5, 20915 - 11905: 0xBEF6, 20916 - 11905: 0x83EA, 20917 - 11905: 0xBFF6, 20918 - 11905: 0xD2B1, 20919 - 11905: 0xC0E4, 20920 - 11905: 0x83EB, 20921 - 11905: 0x83EC, 20922 - 11905: 0x83ED, 20923 - 11905: 0xB6B3, 20924 - 11905: 0xD9FE, 20925 - 11905: 0xD9FD, 20926 - 11905: 0x83EE, 20927 - 11905: 0x83EF, 20928 - 11905: 0xBEBB, 20929 - 11905: 0x83F0, 20930 - 11905: 0x83F1, 20931 - 11905: 0x83F2, 20932 - 11905: 0xC6E0, 20933 - 11905: 0x83F3, 20934 - 11905: 0xD7BC, 20935 - 11905: 0xDAA1, 20936 - 11905: 0x83F4, 20937 - 11905: 0xC1B9, 20938 - 11905: 0x83F5, 20939 - 11905: 0xB5F2, 20940 - 11905: 0xC1E8, 20941 - 11905: 0x83F6, 20942 - 11905: 0x83F7, 20943 - 11905: 0xBCF5, 20944 - 11905: 0x83F8, 20945 - 11905: 0xB4D5, 20946 - 11905: 0x83F9, 20947 - 11905: 0x83FA, 20948 - 11905: 0x83FB, 20949 - 11905: 0x83FC, 20950 - 11905: 0x83FD, 20951 - 11905: 0x83FE, 20952 - 11905: 0x8440, 20953 - 11905: 0x8441, 20954 - 11905: 0x8442, 20955 - 11905: 0xC1DD, 20956 - 11905: 0x8443, 20957 - 11905: 0xC4FD, 20958 - 11905: 0x8444, 20959 - 11905: 0x8445, 20960 - 11905: 0xBCB8, 20961 - 11905: 0xB7B2, 20962 - 11905: 0x8446, 20963 - 11905: 0x8447, 20964 - 11905: 0xB7EF, 20965 - 11905: 0x8448, 20966 - 11905: 0x8449, 20967 - 11905: 0x844A, 20968 - 11905: 0x844B, 20969 - 11905: 0x844C, 20970 - 11905: 0x844D, 20971 - 11905: 0xD9EC, 20972 - 11905: 0x844E, 20973 - 11905: 0xC6BE, 20974 - 11905: 0x844F, 20975 - 11905: 0xBFAD, 20976 - 11905: 0xBBCB, 20977 - 11905: 0x8450, 20978 - 11905: 0x8451, 20979 - 11905: 0xB5CA, 20980 - 11905: 0x8452, 20981 - 11905: 0xDBC9, 20982 - 11905: 0xD0D7, 20983 - 11905: 0x8453, 20984 - 11905: 0xCDB9, 20985 - 11905: 0xB0BC, 20986 - 11905: 0xB3F6, 20987 - 11905: 0xBBF7, 20988 - 11905: 0xDBCA, 20989 - 11905: 0xBAAF, 20990 - 11905: 0x8454, 20991 - 11905: 0xD4E4, 20992 - 11905: 0xB5B6, 20993 - 11905: 0xB5F3, 20994 - 11905: 0xD8D6, 20995 - 11905: 0xC8D0, 20996 - 11905: 0x8455, 20997 - 11905: 0x8456, 20998 - 11905: 0xB7D6, 20999 - 11905: 0xC7D0, 21000 - 11905: 0xD8D7, 21001 - 11905: 0x8457, 21002 - 11905: 0xBFAF, 21003 - 11905: 0x8458, 21004 - 11905: 0x8459, 21005 - 11905: 0xDBBB, 21006 - 11905: 0xD8D8, 21007 - 11905: 0x845A, 21008 - 11905: 0x845B, 21009 - 11905: 0xD0CC, 21010 - 11905: 0xBBAE, 21011 - 11905: 0x845C, 21012 - 11905: 0x845D, 21013 - 11905: 0x845E, 21014 - 11905: 0xEBBE, 21015 - 11905: 0xC1D0, 21016 - 11905: 0xC1F5, 21017 - 11905: 0xD4F2, 21018 - 11905: 0xB8D5, 21019 - 11905: 0xB4B4, 21020 - 11905: 0x845F, 21021 - 11905: 0xB3F5, 21022 - 11905: 0x8460, 21023 - 11905: 0x8461, 21024 - 11905: 0xC9BE, 21025 - 11905: 0x8462, 21026 - 11905: 0x8463, 21027 - 11905: 0x8464, 21028 - 11905: 0xC5D0, 21029 - 11905: 0x8465, 21030 - 11905: 0x8466, 21031 - 11905: 0x8467, 21032 - 11905: 0xC5D9, 21033 - 11905: 0xC0FB, 21034 - 11905: 0x8468, 21035 - 11905: 0xB1F0, 21036 - 11905: 0x8469, 21037 - 11905: 0xD8D9, 21038 - 11905: 0xB9CE, 21039 - 11905: 0x846A, 21040 - 11905: 0xB5BD, 21041 - 11905: 0x846B, 21042 - 11905: 0x846C, 21043 - 11905: 0xD8DA, 21044 - 11905: 0x846D, 21045 - 11905: 0x846E, 21046 - 11905: 0xD6C6, 21047 - 11905: 0xCBA2, 21048 - 11905: 0xC8AF, 21049 - 11905: 0xC9B2, 21050 - 11905: 0xB4CC, 21051 - 11905: 0xBFCC, 21052 - 11905: 0x846F, 21053 - 11905: 0xB9F4, 21054 - 11905: 0x8470, 21055 - 11905: 0xD8DB, 21056 - 11905: 0xD8DC, 21057 - 11905: 0xB6E7, 21058 - 11905: 0xBCC1, 21059 - 11905: 0xCCEA, 21060 - 11905: 0x8471, 21061 - 11905: 0x8472, 21062 - 11905: 0x8473, 21063 - 11905: 0x8474, 21064 - 11905: 0x8475, 21065 - 11905: 0x8476, 21066 - 11905: 0xCFF7, 21067 - 11905: 0x8477, 21068 - 11905: 0xD8DD, 21069 - 11905: 0xC7B0, 21070 - 11905: 0x8478, 21071 - 11905: 0x8479, 21072 - 11905: 0xB9D0, 21073 - 11905: 0xBDA3, 21074 - 11905: 0x847A, 21075 - 11905: 0x847B, 21076 - 11905: 0xCCDE, 21077 - 11905: 0x847C, 21078 - 11905: 0xC6CA, 21079 - 11905: 0x847D, 21080 - 11905: 0x847E, 21081 - 11905: 0x8480, 21082 - 11905: 0x8481, 21083 - 11905: 0x8482, 21084 - 11905: 0xD8E0, 21085 - 11905: 0x8483, 21086 - 11905: 0xD8DE, 21087 - 11905: 0x8484, 21088 - 11905: 0x8485, 21089 - 11905: 0xD8DF, 21090 - 11905: 0x8486, 21091 - 11905: 0x8487, 21092 - 11905: 0x8488, 21093 - 11905: 0xB0FE, 21094 - 11905: 0x8489, 21095 - 11905: 0xBEE7, 21096 - 11905: 0x848A, 21097 - 11905: 0xCAA3, 21098 - 11905: 0xBCF4, 21099 - 11905: 0x848B, 21100 - 11905: 0x848C, 21101 - 11905: 0x848D, 21102 - 11905: 0x848E, 21103 - 11905: 0xB8B1, 21104 - 11905: 0x848F, 21105 - 11905: 0x8490, 21106 - 11905: 0xB8EE, 21107 - 11905: 0x8491, 21108 - 11905: 0x8492, 21109 - 11905: 0x8493, 21110 - 11905: 0x8494, 21111 - 11905: 0x8495, 21112 - 11905: 0x8496, 21113 - 11905: 0x8497, 21114 - 11905: 0x8498, 21115 - 11905: 0x8499, 21116 - 11905: 0x849A, 21117 - 11905: 0xD8E2, 21118 - 11905: 0x849B, 21119 - 11905: 0xBDCB, 21120 - 11905: 0x849C, 21121 - 11905: 0xD8E4, 21122 - 11905: 0xD8E3, 21123 - 11905: 0x849D, 21124 - 11905: 0x849E, 21125 - 11905: 0x849F, 21126 - 11905: 0x84A0, 21127 - 11905: 0x84A1, 21128 - 11905: 0xC5FC, 21129 - 11905: 0x84A2, 21130 - 11905: 0x84A3, 21131 - 11905: 0x84A4, 21132 - 11905: 0x84A5, 21133 - 11905: 0x84A6, 21134 - 11905: 0x84A7, 21135 - 11905: 0x84A8, 21136 - 11905: 0xD8E5, 21137 - 11905: 0x84A9, 21138 - 11905: 0x84AA, 21139 - 11905: 0xD8E6, 21140 - 11905: 0x84AB, 21141 - 11905: 0x84AC, 21142 - 11905: 0x84AD, 21143 - 11905: 0x84AE, 21144 - 11905: 0x84AF, 21145 - 11905: 0x84B0, 21146 - 11905: 0x84B1, 21147 - 11905: 0xC1A6, 21148 - 11905: 0x84B2, 21149 - 11905: 0xC8B0, 21150 - 11905: 0xB0EC, 21151 - 11905: 0xB9A6, 21152 - 11905: 0xBCD3, 21153 - 11905: 0xCEF1, 21154 - 11905: 0xDBBD, 21155 - 11905: 0xC1D3, 21156 - 11905: 0x84B3, 21157 - 11905: 0x84B4, 21158 - 11905: 0x84B5, 21159 - 11905: 0x84B6, 21160 - 11905: 0xB6AF, 21161 - 11905: 0xD6FA, 21162 - 11905: 0xC5AC, 21163 - 11905: 0xBDD9, 21164 - 11905: 0xDBBE, 21165 - 11905: 0xDBBF, 21166 - 11905: 0x84B7, 21167 - 11905: 0x84B8, 21168 - 11905: 0x84B9, 21169 - 11905: 0xC0F8, 21170 - 11905: 0xBEA2, 21171 - 11905: 0xC0CD, 21172 - 11905: 0x84BA, 21173 - 11905: 0x84BB, 21174 - 11905: 0x84BC, 21175 - 11905: 0x84BD, 21176 - 11905: 0x84BE, 21177 - 11905: 0x84BF, 21178 - 11905: 0x84C0, 21179 - 11905: 0x84C1, 21180 - 11905: 0x84C2, 21181 - 11905: 0x84C3, 21182 - 11905: 0xDBC0, 21183 - 11905: 0xCAC6, 21184 - 11905: 0x84C4, 21185 - 11905: 0x84C5, 21186 - 11905: 0x84C6, 21187 - 11905: 0xB2AA, 21188 - 11905: 0x84C7, 21189 - 11905: 0x84C8, 21190 - 11905: 0x84C9, 21191 - 11905: 0xD3C2, 21192 - 11905: 0x84CA, 21193 - 11905: 0xC3E3, 21194 - 11905: 0x84CB, 21195 - 11905: 0xD1AB, 21196 - 11905: 0x84CC, 21197 - 11905: 0x84CD, 21198 - 11905: 0x84CE, 21199 - 11905: 0x84CF, 21200 - 11905: 0xDBC2, 21201 - 11905: 0x84D0, 21202 - 11905: 0xC0D5, 21203 - 11905: 0x84D1, 21204 - 11905: 0x84D2, 21205 - 11905: 0x84D3, 21206 - 11905: 0xDBC3, 21207 - 11905: 0x84D4, 21208 - 11905: 0xBFB1, 21209 - 11905: 0x84D5, 21210 - 11905: 0x84D6, 21211 - 11905: 0x84D7, 21212 - 11905: 0x84D8, 21213 - 11905: 0x84D9, 21214 - 11905: 0x84DA, 21215 - 11905: 0xC4BC, 21216 - 11905: 0x84DB, 21217 - 11905: 0x84DC, 21218 - 11905: 0x84DD, 21219 - 11905: 0x84DE, 21220 - 11905: 0xC7DA, 21221 - 11905: 0x84DF, 21222 - 11905: 0x84E0, 21223 - 11905: 0x84E1, 21224 - 11905: 0x84E2, 21225 - 11905: 0x84E3, 21226 - 11905: 0x84E4, 21227 - 11905: 0x84E5, 21228 - 11905: 0x84E6, 21229 - 11905: 0x84E7, 21230 - 11905: 0x84E8, 21231 - 11905: 0x84E9, 21232 - 11905: 0xDBC4, 21233 - 11905: 0x84EA, 21234 - 11905: 0x84EB, 21235 - 11905: 0x84EC, 21236 - 11905: 0x84ED, 21237 - 11905: 0x84EE, 21238 - 11905: 0x84EF, 21239 - 11905: 0x84F0, 21240 - 11905: 0x84F1, 21241 - 11905: 0xD9E8, 21242 - 11905: 0xC9D7, 21243 - 11905: 0x84F2, 21244 - 11905: 0x84F3, 21245 - 11905: 0x84F4, 21246 - 11905: 0xB9B4, 21247 - 11905: 0xCEF0, 21248 - 11905: 0xD4C8, 21249 - 11905: 0x84F5, 21250 - 11905: 0x84F6, 21251 - 11905: 0x84F7, 21252 - 11905: 0x84F8, 21253 - 11905: 0xB0FC, 21254 - 11905: 0xB4D2, 21255 - 11905: 0x84F9, 21256 - 11905: 0xD0D9, 21257 - 11905: 0x84FA, 21258 - 11905: 0x84FB, 21259 - 11905: 0x84FC, 21260 - 11905: 0x84FD, 21261 - 11905: 0xD9E9, 21262 - 11905: 0x84FE, 21263 - 11905: 0xDECB, 21264 - 11905: 0xD9EB, 21265 - 11905: 0x8540, 21266 - 11905: 0x8541, 21267 - 11905: 0x8542, 21268 - 11905: 0x8543, 21269 - 11905: 0xD8B0, 21270 - 11905: 0xBBAF, 21271 - 11905: 0xB1B1, 21272 - 11905: 0x8544, 21273 - 11905: 0xB3D7, 21274 - 11905: 0xD8CE, 21275 - 11905: 0x8545, 21276 - 11905: 0x8546, 21277 - 11905: 0xD4D1, 21278 - 11905: 0x8547, 21279 - 11905: 0x8548, 21280 - 11905: 0xBDB3, 21281 - 11905: 0xBFEF, 21282 - 11905: 0x8549, 21283 - 11905: 0xCFBB, 21284 - 11905: 0x854A, 21285 - 11905: 0x854B, 21286 - 11905: 0xD8D0, 21287 - 11905: 0x854C, 21288 - 11905: 0x854D, 21289 - 11905: 0x854E, 21290 - 11905: 0xB7CB, 21291 - 11905: 0x854F, 21292 - 11905: 0x8550, 21293 - 11905: 0x8551, 21294 - 11905: 0xD8D1, 21295 - 11905: 0x8552, 21296 - 11905: 0x8553, 21297 - 11905: 0x8554, 21298 - 11905: 0x8555, 21299 - 11905: 0x8556, 21300 - 11905: 0x8557, 21301 - 11905: 0x8558, 21302 - 11905: 0x8559, 21303 - 11905: 0x855A, 21304 - 11905: 0x855B, 21305 - 11905: 0xC6A5, 21306 - 11905: 0xC7F8, 21307 - 11905: 0xD2BD, 21308 - 11905: 0x855C, 21309 - 11905: 0x855D, 21310 - 11905: 0xD8D2, 21311 - 11905: 0xC4E4, 21312 - 11905: 0x855E, 21313 - 11905: 0xCAAE, 21314 - 11905: 0x855F, 21315 - 11905: 0xC7A7, 21316 - 11905: 0x8560, 21317 - 11905: 0xD8A6, 21318 - 11905: 0x8561, 21319 - 11905: 0xC9FD, 21320 - 11905: 0xCEE7, 21321 - 11905: 0xBBDC, 21322 - 11905: 0xB0EB, 21323 - 11905: 0x8562, 21324 - 11905: 0x8563, 21325 - 11905: 0x8564, 21326 - 11905: 0xBBAA, 21327 - 11905: 0xD0AD, 21328 - 11905: 0x8565, 21329 - 11905: 0xB1B0, 21330 - 11905: 0xD7E4, 21331 - 11905: 0xD7BF, 21332 - 11905: 0x8566, 21333 - 11905: 0xB5A5, 21334 - 11905: 0xC2F4, 21335 - 11905: 0xC4CF, 21336 - 11905: 0x8567, 21337 - 11905: 0x8568, 21338 - 11905: 0xB2A9, 21339 - 11905: 0x8569, 21340 - 11905: 0xB2B7, 21341 - 11905: 0x856A, 21342 - 11905: 0xB1E5, 21343 - 11905: 0xDFB2, 21344 - 11905: 0xD5BC, 21345 - 11905: 0xBFA8, 21346 - 11905: 0xC2AC, 21347 - 11905: 0xD8D5, 21348 - 11905: 0xC2B1, 21349 - 11905: 0x856B, 21350 - 11905: 0xD8D4, 21351 - 11905: 0xCED4, 21352 - 11905: 0x856C, 21353 - 11905: 0xDAE0, 21354 - 11905: 0x856D, 21355 - 11905: 0xCEC0, 21356 - 11905: 0x856E, 21357 - 11905: 0x856F, 21358 - 11905: 0xD8B4, 21359 - 11905: 0xC3AE, 21360 - 11905: 0xD3A1, 21361 - 11905: 0xCEA3, 21362 - 11905: 0x8570, 21363 - 11905: 0xBCB4, 21364 - 11905: 0xC8B4, 21365 - 11905: 0xC2D1, 21366 - 11905: 0x8571, 21367 - 11905: 0xBEED, 21368 - 11905: 0xD0B6, 21369 - 11905: 0x8572, 21370 - 11905: 0xDAE1, 21371 - 11905: 0x8573, 21372 - 11905: 0x8574, 21373 - 11905: 0x8575, 21374 - 11905: 0x8576, 21375 - 11905: 0xC7E4, 21376 - 11905: 0x8577, 21377 - 11905: 0x8578, 21378 - 11905: 0xB3A7, 21379 - 11905: 0x8579, 21380 - 11905: 0xB6F2, 21381 - 11905: 0xCCFC, 21382 - 11905: 0xC0FA, 21383 - 11905: 0x857A, 21384 - 11905: 0x857B, 21385 - 11905: 0xC0F7, 21386 - 11905: 0x857C, 21387 - 11905: 0xD1B9, 21388 - 11905: 0xD1E1, 21389 - 11905: 0xD8C7, 21390 - 11905: 0x857D, 21391 - 11905: 0x857E, 21392 - 11905: 0x8580, 21393 - 11905: 0x8581, 21394 - 11905: 0x8582, 21395 - 11905: 0x8583, 21396 - 11905: 0x8584, 21397 - 11905: 0xB2DE, 21398 - 11905: 0x8585, 21399 - 11905: 0x8586, 21400 - 11905: 0xC0E5, 21401 - 11905: 0x8587, 21402 - 11905: 0xBAF1, 21403 - 11905: 0x8588, 21404 - 11905: 0x8589, 21405 - 11905: 0xD8C8, 21406 - 11905: 0x858A, 21407 - 11905: 0xD4AD, 21408 - 11905: 0x858B, 21409 - 11905: 0x858C, 21410 - 11905: 0xCFE1, 21411 - 11905: 0xD8C9, 21412 - 11905: 0x858D, 21413 - 11905: 0xD8CA, 21414 - 11905: 0xCFC3, 21415 - 11905: 0x858E, 21416 - 11905: 0xB3F8, 21417 - 11905: 0xBEC7, 21418 - 11905: 0x858F, 21419 - 11905: 0x8590, 21420 - 11905: 0x8591, 21421 - 11905: 0x8592, 21422 - 11905: 0xD8CB, 21423 - 11905: 0x8593, 21424 - 11905: 0x8594, 21425 - 11905: 0x8595, 21426 - 11905: 0x8596, 21427 - 11905: 0x8597, 21428 - 11905: 0x8598, 21429 - 11905: 0x8599, 21430 - 11905: 0xDBCC, 21431 - 11905: 0x859A, 21432 - 11905: 0x859B, 21433 - 11905: 0x859C, 21434 - 11905: 0x859D, 21435 - 11905: 0xC8A5, 21436 - 11905: 0x859E, 21437 - 11905: 0x859F, 21438 - 11905: 0x85A0, 21439 - 11905: 0xCFD8, 21440 - 11905: 0x85A1, 21441 - 11905: 0xC8FE, 21442 - 11905: 0xB2CE, 21443 - 11905: 0x85A2, 21444 - 11905: 0x85A3, 21445 - 11905: 0x85A4, 21446 - 11905: 0x85A5, 21447 - 11905: 0x85A6, 21448 - 11905: 0xD3D6, 21449 - 11905: 0xB2E6, 21450 - 11905: 0xBCB0, 21451 - 11905: 0xD3D1, 21452 - 11905: 0xCBAB, 21453 - 11905: 0xB7B4, 21454 - 11905: 0x85A7, 21455 - 11905: 0x85A8, 21456 - 11905: 0x85A9, 21457 - 11905: 0xB7A2, 21458 - 11905: 0x85AA, 21459 - 11905: 0x85AB, 21460 - 11905: 0xCAE5, 21461 - 11905: 0x85AC, 21462 - 11905: 0xC8A1, 21463 - 11905: 0xCADC, 21464 - 11905: 0xB1E4, 21465 - 11905: 0xD0F0, 21466 - 11905: 0x85AD, 21467 - 11905: 0xC5D1, 21468 - 11905: 0x85AE, 21469 - 11905: 0x85AF, 21470 - 11905: 0x85B0, 21471 - 11905: 0xDBC5, 21472 - 11905: 0xB5FE, 21473 - 11905: 0x85B1, 21474 - 11905: 0x85B2, 21475 - 11905: 0xBFDA, 21476 - 11905: 0xB9C5, 21477 - 11905: 0xBEE4, 21478 - 11905: 0xC1ED, 21479 - 11905: 0x85B3, 21480 - 11905: 0xDFB6, 21481 - 11905: 0xDFB5, 21482 - 11905: 0xD6BB, 21483 - 11905: 0xBDD0, 21484 - 11905: 0xD5D9, 21485 - 11905: 0xB0C8, 21486 - 11905: 0xB6A3, 21487 - 11905: 0xBFC9, 21488 - 11905: 0xCCA8, 21489 - 11905: 0xDFB3, 21490 - 11905: 0xCAB7, 21491 - 11905: 0xD3D2, 21492 - 11905: 0x85B4, 21493 - 11905: 0xD8CF, 21494 - 11905: 0xD2B6, 21495 - 11905: 0xBAC5, 21496 - 11905: 0xCBBE, 21497 - 11905: 0xCCBE, 21498 - 11905: 0x85B5, 21499 - 11905: 0xDFB7, 21500 - 11905: 0xB5F0, 21501 - 11905: 0xDFB4, 21502 - 11905: 0x85B6, 21503 - 11905: 0x85B7, 21504 - 11905: 0x85B8, 21505 - 11905: 0xD3F5, 21506 - 11905: 0x85B9, 21507 - 11905: 0xB3D4, 21508 - 11905: 0xB8F7, 21509 - 11905: 0x85BA, 21510 - 11905: 0xDFBA, 21511 - 11905: 0x85BB, 21512 - 11905: 0xBACF, 21513 - 11905: 0xBCAA, 21514 - 11905: 0xB5F5, 21515 - 11905: 0x85BC, 21516 - 11905: 0xCDAC, 21517 - 11905: 0xC3FB, 21518 - 11905: 0xBAF3, 21519 - 11905: 0xC0F4, 21520 - 11905: 0xCDC2, 21521 - 11905: 0xCFF2, 21522 - 11905: 0xDFB8, 21523 - 11905: 0xCFC5, 21524 - 11905: 0x85BD, 21525 - 11905: 0xC2C0, 21526 - 11905: 0xDFB9, 21527 - 11905: 0xC2F0, 21528 - 11905: 0x85BE, 21529 - 11905: 0x85BF, 21530 - 11905: 0x85C0, 21531 - 11905: 0xBEFD, 21532 - 11905: 0x85C1, 21533 - 11905: 0xC1DF, 21534 - 11905: 0xCDCC, 21535 - 11905: 0xD2F7, 21536 - 11905: 0xB7CD, 21537 - 11905: 0xDFC1, 21538 - 11905: 0x85C2, 21539 - 11905: 0xDFC4, 21540 - 11905: 0x85C3, 21541 - 11905: 0x85C4, 21542 - 11905: 0xB7F1, 21543 - 11905: 0xB0C9, 21544 - 11905: 0xB6D6, 21545 - 11905: 0xB7D4, 21546 - 11905: 0x85C5, 21547 - 11905: 0xBAAC, 21548 - 11905: 0xCCFD, 21549 - 11905: 0xBFD4, 21550 - 11905: 0xCBB1, 21551 - 11905: 0xC6F4, 21552 - 11905: 0x85C6, 21553 - 11905: 0xD6A8, 21554 - 11905: 0xDFC5, 21555 - 11905: 0x85C7, 21556 - 11905: 0xCEE2, 21557 - 11905: 0xB3B3, 21558 - 11905: 0x85C8, 21559 - 11905: 0x85C9, 21560 - 11905: 0xCEFC, 21561 - 11905: 0xB4B5, 21562 - 11905: 0x85CA, 21563 - 11905: 0xCEC7, 21564 - 11905: 0xBAF0, 21565 - 11905: 0x85CB, 21566 - 11905: 0xCEE1, 21567 - 11905: 0x85CC, 21568 - 11905: 0xD1BD, 21569 - 11905: 0x85CD, 21570 - 11905: 0x85CE, 21571 - 11905: 0xDFC0, 21572 - 11905: 0x85CF, 21573 - 11905: 0x85D0, 21574 - 11905: 0xB4F4, 21575 - 11905: 0x85D1, 21576 - 11905: 0xB3CA, 21577 - 11905: 0x85D2, 21578 - 11905: 0xB8E6, 21579 - 11905: 0xDFBB, 21580 - 11905: 0x85D3, 21581 - 11905: 0x85D4, 21582 - 11905: 0x85D5, 21583 - 11905: 0x85D6, 21584 - 11905: 0xC4C5, 21585 - 11905: 0x85D7, 21586 - 11905: 0xDFBC, 21587 - 11905: 0xDFBD, 21588 - 11905: 0xDFBE, 21589 - 11905: 0xC5BB, 21590 - 11905: 0xDFBF, 21591 - 11905: 0xDFC2, 21592 - 11905: 0xD4B1, 21593 - 11905: 0xDFC3, 21594 - 11905: 0x85D8, 21595 - 11905: 0xC7BA, 21596 - 11905: 0xCED8, 21597 - 11905: 0x85D9, 21598 - 11905: 0x85DA, 21599 - 11905: 0x85DB, 21600 - 11905: 0x85DC, 21601 - 11905: 0x85DD, 21602 - 11905: 0xC4D8, 21603 - 11905: 0x85DE, 21604 - 11905: 0xDFCA, 21605 - 11905: 0x85DF, 21606 - 11905: 0xDFCF, 21607 - 11905: 0x85E0, 21608 - 11905: 0xD6DC, 21609 - 11905: 0x85E1, 21610 - 11905: 0x85E2, 21611 - 11905: 0x85E3, 21612 - 11905: 0x85E4, 21613 - 11905: 0x85E5, 21614 - 11905: 0x85E6, 21615 - 11905: 0x85E7, 21616 - 11905: 0x85E8, 21617 - 11905: 0xDFC9, 21618 - 11905: 0xDFDA, 21619 - 11905: 0xCEB6, 21620 - 11905: 0x85E9, 21621 - 11905: 0xBAC7, 21622 - 11905: 0xDFCE, 21623 - 11905: 0xDFC8, 21624 - 11905: 0xC5DE, 21625 - 11905: 0x85EA, 21626 - 11905: 0x85EB, 21627 - 11905: 0xC9EB, 21628 - 11905: 0xBAF4, 21629 - 11905: 0xC3FC, 21630 - 11905: 0x85EC, 21631 - 11905: 0x85ED, 21632 - 11905: 0xBED7, 21633 - 11905: 0x85EE, 21634 - 11905: 0xDFC6, 21635 - 11905: 0x85EF, 21636 - 11905: 0xDFCD, 21637 - 11905: 0x85F0, 21638 - 11905: 0xC5D8, 21639 - 11905: 0x85F1, 21640 - 11905: 0x85F2, 21641 - 11905: 0x85F3, 21642 - 11905: 0x85F4, 21643 - 11905: 0xD5A6, 21644 - 11905: 0xBACD, 21645 - 11905: 0x85F5, 21646 - 11905: 0xBECC, 21647 - 11905: 0xD3BD, 21648 - 11905: 0xB8C0, 21649 - 11905: 0x85F6, 21650 - 11905: 0xD6E4, 21651 - 11905: 0x85F7, 21652 - 11905: 0xDFC7, 21653 - 11905: 0xB9BE, 21654 - 11905: 0xBFA7, 21655 - 11905: 0x85F8, 21656 - 11905: 0x85F9, 21657 - 11905: 0xC1FC, 21658 - 11905: 0xDFCB, 21659 - 11905: 0xDFCC, 21660 - 11905: 0x85FA, 21661 - 11905: 0xDFD0, 21662 - 11905: 0x85FB, 21663 - 11905: 0x85FC, 21664 - 11905: 0x85FD, 21665 - 11905: 0x85FE, 21666 - 11905: 0x8640, 21667 - 11905: 0xDFDB, 21668 - 11905: 0xDFE5, 21669 - 11905: 0x8641, 21670 - 11905: 0xDFD7, 21671 - 11905: 0xDFD6, 21672 - 11905: 0xD7C9, 21673 - 11905: 0xDFE3, 21674 - 11905: 0xDFE4, 21675 - 11905: 0xE5EB, 21676 - 11905: 0xD2A7, 21677 - 11905: 0xDFD2, 21678 - 11905: 0x8642, 21679 - 11905: 0xBFA9, 21680 - 11905: 0x8643, 21681 - 11905: 0xD4DB, 21682 - 11905: 0x8644, 21683 - 11905: 0xBFC8, 21684 - 11905: 0xDFD4, 21685 - 11905: 0x8645, 21686 - 11905: 0x8646, 21687 - 11905: 0x8647, 21688 - 11905: 0xCFCC, 21689 - 11905: 0x8648, 21690 - 11905: 0x8649, 21691 - 11905: 0xDFDD, 21692 - 11905: 0x864A, 21693 - 11905: 0xD1CA, 21694 - 11905: 0x864B, 21695 - 11905: 0xDFDE, 21696 - 11905: 0xB0A7, 21697 - 11905: 0xC6B7, 21698 - 11905: 0xDFD3, 21699 - 11905: 0x864C, 21700 - 11905: 0xBAE5, 21701 - 11905: 0x864D, 21702 - 11905: 0xB6DF, 21703 - 11905: 0xCDDB, 21704 - 11905: 0xB9FE, 21705 - 11905: 0xD4D5, 21706 - 11905: 0x864E, 21707 - 11905: 0x864F, 21708 - 11905: 0xDFDF, 21709 - 11905: 0xCFEC, 21710 - 11905: 0xB0A5, 21711 - 11905: 0xDFE7, 21712 - 11905: 0xDFD1, 21713 - 11905: 0xD1C6, 21714 - 11905: 0xDFD5, 21715 - 11905: 0xDFD8, 21716 - 11905: 0xDFD9, 21717 - 11905: 0xDFDC, 21718 - 11905: 0x8650, 21719 - 11905: 0xBBA9, 21720 - 11905: 0x8651, 21721 - 11905: 0xDFE0, 21722 - 11905: 0xDFE1, 21723 - 11905: 0x8652, 21724 - 11905: 0xDFE2, 21725 - 11905: 0xDFE6, 21726 - 11905: 0xDFE8, 21727 - 11905: 0xD3B4, 21728 - 11905: 0x8653, 21729 - 11905: 0x8654, 21730 - 11905: 0x8655, 21731 - 11905: 0x8656, 21732 - 11905: 0x8657, 21733 - 11905: 0xB8E7, 21734 - 11905: 0xC5B6, 21735 - 11905: 0xDFEA, 21736 - 11905: 0xC9DA, 21737 - 11905: 0xC1A8, 21738 - 11905: 0xC4C4, 21739 - 11905: 0x8658, 21740 - 11905: 0x8659, 21741 - 11905: 0xBFDE, 21742 - 11905: 0xCFF8, 21743 - 11905: 0x865A, 21744 - 11905: 0x865B, 21745 - 11905: 0x865C, 21746 - 11905: 0xD5DC, 21747 - 11905: 0xDFEE, 21748 - 11905: 0x865D, 21749 - 11905: 0x865E, 21750 - 11905: 0x865F, 21751 - 11905: 0x8660, 21752 - 11905: 0x8661, 21753 - 11905: 0x8662, 21754 - 11905: 0xB2B8, 21755 - 11905: 0x8663, 21756 - 11905: 0xBADF, 21757 - 11905: 0xDFEC, 21758 - 11905: 0x8664, 21759 - 11905: 0xDBC1, 21760 - 11905: 0x8665, 21761 - 11905: 0xD1E4, 21762 - 11905: 0x8666, 21763 - 11905: 0x8667, 21764 - 11905: 0x8668, 21765 - 11905: 0x8669, 21766 - 11905: 0xCBF4, 21767 - 11905: 0xB4BD, 21768 - 11905: 0x866A, 21769 - 11905: 0xB0A6, 21770 - 11905: 0x866B, 21771 - 11905: 0x866C, 21772 - 11905: 0x866D, 21773 - 11905: 0x866E, 21774 - 11905: 0x866F, 21775 - 11905: 0xDFF1, 21776 - 11905: 0xCCC6, 21777 - 11905: 0xDFF2, 21778 - 11905: 0x8670, 21779 - 11905: 0x8671, 21780 - 11905: 0xDFED, 21781 - 11905: 0x8672, 21782 - 11905: 0x8673, 21783 - 11905: 0x8674, 21784 - 11905: 0x8675, 21785 - 11905: 0x8676, 21786 - 11905: 0x8677, 21787 - 11905: 0xDFE9, 21788 - 11905: 0x8678, 21789 - 11905: 0x8679, 21790 - 11905: 0x867A, 21791 - 11905: 0x867B, 21792 - 11905: 0xDFEB, 21793 - 11905: 0x867C, 21794 - 11905: 0xDFEF, 21795 - 11905: 0xDFF0, 21796 - 11905: 0xBBBD, 21797 - 11905: 0x867D, 21798 - 11905: 0x867E, 21799 - 11905: 0xDFF3, 21800 - 11905: 0x8680, 21801 - 11905: 0x8681, 21802 - 11905: 0xDFF4, 21803 - 11905: 0x8682, 21804 - 11905: 0xBBA3, 21805 - 11905: 0x8683, 21806 - 11905: 0xCADB, 21807 - 11905: 0xCEA8, 21808 - 11905: 0xE0A7, 21809 - 11905: 0xB3AA, 21810 - 11905: 0x8684, 21811 - 11905: 0xE0A6, 21812 - 11905: 0x8685, 21813 - 11905: 0x8686, 21814 - 11905: 0x8687, 21815 - 11905: 0xE0A1, 21816 - 11905: 0x8688, 21817 - 11905: 0x8689, 21818 - 11905: 0x868A, 21819 - 11905: 0x868B, 21820 - 11905: 0xDFFE, 21821 - 11905: 0x868C, 21822 - 11905: 0xCDD9, 21823 - 11905: 0xDFFC, 21824 - 11905: 0x868D, 21825 - 11905: 0xDFFA, 21826 - 11905: 0x868E, 21827 - 11905: 0xBFD0, 21828 - 11905: 0xD7C4, 21829 - 11905: 0x868F, 21830 - 11905: 0xC9CC, 21831 - 11905: 0x8690, 21832 - 11905: 0x8691, 21833 - 11905: 0xDFF8, 21834 - 11905: 0xB0A1, 21835 - 11905: 0x8692, 21836 - 11905: 0x8693, 21837 - 11905: 0x8694, 21838 - 11905: 0x8695, 21839 - 11905: 0x8696, 21840 - 11905: 0xDFFD, 21841 - 11905: 0x8697, 21842 - 11905: 0x8698, 21843 - 11905: 0x8699, 21844 - 11905: 0x869A, 21845 - 11905: 0xDFFB, 21846 - 11905: 0xE0A2, 21847 - 11905: 0x869B, 21848 - 11905: 0x869C, 21849 - 11905: 0x869D, 21850 - 11905: 0x869E, 21851 - 11905: 0x869F, 21852 - 11905: 0xE0A8, 21853 - 11905: 0x86A0, 21854 - 11905: 0x86A1, 21855 - 11905: 0x86A2, 21856 - 11905: 0x86A3, 21857 - 11905: 0xB7C8, 21858 - 11905: 0x86A4, 21859 - 11905: 0x86A5, 21860 - 11905: 0xC6A1, 21861 - 11905: 0xC9B6, 21862 - 11905: 0xC0B2, 21863 - 11905: 0xDFF5, 21864 - 11905: 0x86A6, 21865 - 11905: 0x86A7, 21866 - 11905: 0xC5BE, 21867 - 11905: 0x86A8, 21868 - 11905: 0xD8C4, 21869 - 11905: 0xDFF9, 21870 - 11905: 0xC4F6, 21871 - 11905: 0x86A9, 21872 - 11905: 0x86AA, 21873 - 11905: 0x86AB, 21874 - 11905: 0x86AC, 21875 - 11905: 0x86AD, 21876 - 11905: 0x86AE, 21877 - 11905: 0xE0A3, 21878 - 11905: 0xE0A4, 21879 - 11905: 0xE0A5, 21880 - 11905: 0xD0A5, 21881 - 11905: 0x86AF, 21882 - 11905: 0x86B0, 21883 - 11905: 0xE0B4, 21884 - 11905: 0xCCE4, 21885 - 11905: 0x86B1, 21886 - 11905: 0xE0B1, 21887 - 11905: 0x86B2, 21888 - 11905: 0xBFA6, 21889 - 11905: 0xE0AF, 21890 - 11905: 0xCEB9, 21891 - 11905: 0xE0AB, 21892 - 11905: 0xC9C6, 21893 - 11905: 0x86B3, 21894 - 11905: 0x86B4, 21895 - 11905: 0xC0AE, 21896 - 11905: 0xE0AE, 21897 - 11905: 0xBAED, 21898 - 11905: 0xBAB0, 21899 - 11905: 0xE0A9, 21900 - 11905: 0x86B5, 21901 - 11905: 0x86B6, 21902 - 11905: 0x86B7, 21903 - 11905: 0xDFF6, 21904 - 11905: 0x86B8, 21905 - 11905: 0xE0B3, 21906 - 11905: 0x86B9, 21907 - 11905: 0x86BA, 21908 - 11905: 0xE0B8, 21909 - 11905: 0x86BB, 21910 - 11905: 0x86BC, 21911 - 11905: 0x86BD, 21912 - 11905: 0xB4AD, 21913 - 11905: 0xE0B9, 21914 - 11905: 0x86BE, 21915 - 11905: 0x86BF, 21916 - 11905: 0xCFB2, 21917 - 11905: 0xBAC8, 21918 - 11905: 0x86C0, 21919 - 11905: 0xE0B0, 21920 - 11905: 0x86C1, 21921 - 11905: 0x86C2, 21922 - 11905: 0x86C3, 21923 - 11905: 0x86C4, 21924 - 11905: 0x86C5, 21925 - 11905: 0x86C6, 21926 - 11905: 0x86C7, 21927 - 11905: 0xD0FA, 21928 - 11905: 0x86C8, 21929 - 11905: 0x86C9, 21930 - 11905: 0x86CA, 21931 - 11905: 0x86CB, 21932 - 11905: 0x86CC, 21933 - 11905: 0x86CD, 21934 - 11905: 0x86CE, 21935 - 11905: 0x86CF, 21936 - 11905: 0x86D0, 21937 - 11905: 0xE0AC, 21938 - 11905: 0x86D1, 21939 - 11905: 0xD4FB, 21940 - 11905: 0x86D2, 21941 - 11905: 0xDFF7, 21942 - 11905: 0x86D3, 21943 - 11905: 0xC5E7, 21944 - 11905: 0x86D4, 21945 - 11905: 0xE0AD, 21946 - 11905: 0x86D5, 21947 - 11905: 0xD3F7, 21948 - 11905: 0x86D6, 21949 - 11905: 0xE0B6, 21950 - 11905: 0xE0B7, 21951 - 11905: 0x86D7, 21952 - 11905: 0x86D8, 21953 - 11905: 0x86D9, 21954 - 11905: 0x86DA, 21955 - 11905: 0x86DB, 21956 - 11905: 0xE0C4, 21957 - 11905: 0xD0E1, 21958 - 11905: 0x86DC, 21959 - 11905: 0x86DD, 21960 - 11905: 0x86DE, 21961 - 11905: 0xE0BC, 21962 - 11905: 0x86DF, 21963 - 11905: 0x86E0, 21964 - 11905: 0xE0C9, 21965 - 11905: 0xE0CA, 21966 - 11905: 0x86E1, 21967 - 11905: 0x86E2, 21968 - 11905: 0x86E3, 21969 - 11905: 0xE0BE, 21970 - 11905: 0xE0AA, 21971 - 11905: 0xC9A4, 21972 - 11905: 0xE0C1, 21973 - 11905: 0x86E4, 21974 - 11905: 0xE0B2, 21975 - 11905: 0x86E5, 21976 - 11905: 0x86E6, 21977 - 11905: 0x86E7, 21978 - 11905: 0x86E8, 21979 - 11905: 0x86E9, 21980 - 11905: 0xCAC8, 21981 - 11905: 0xE0C3, 21982 - 11905: 0x86EA, 21983 - 11905: 0xE0B5, 21984 - 11905: 0x86EB, 21985 - 11905: 0xCECB, 21986 - 11905: 0x86EC, 21987 - 11905: 0xCBC3, 21988 - 11905: 0xE0CD, 21989 - 11905: 0xE0C6, 21990 - 11905: 0xE0C2, 21991 - 11905: 0x86ED, 21992 - 11905: 0xE0CB, 21993 - 11905: 0x86EE, 21994 - 11905: 0xE0BA, 21995 - 11905: 0xE0BF, 21996 - 11905: 0xE0C0, 21997 - 11905: 0x86EF, 21998 - 11905: 0x86F0, 21999 - 11905: 0xE0C5, 22000 - 11905: 0x86F1, 22001 - 11905: 0x86F2, 22002 - 11905: 0xE0C7, 22003 - 11905: 0xE0C8, 22004 - 11905: 0x86F3, 22005 - 11905: 0xE0CC, 22006 - 11905: 0x86F4, 22007 - 11905: 0xE0BB, 22008 - 11905: 0x86F5, 22009 - 11905: 0x86F6, 22010 - 11905: 0x86F7, 22011 - 11905: 0x86F8, 22012 - 11905: 0x86F9, 22013 - 11905: 0xCBD4, 22014 - 11905: 0xE0D5, 22015 - 11905: 0x86FA, 22016 - 11905: 0xE0D6, 22017 - 11905: 0xE0D2, 22018 - 11905: 0x86FB, 22019 - 11905: 0x86FC, 22020 - 11905: 0x86FD, 22021 - 11905: 0x86FE, 22022 - 11905: 0x8740, 22023 - 11905: 0x8741, 22024 - 11905: 0xE0D0, 22025 - 11905: 0xBCCE, 22026 - 11905: 0x8742, 22027 - 11905: 0x8743, 22028 - 11905: 0xE0D1, 22029 - 11905: 0x8744, 22030 - 11905: 0xB8C2, 22031 - 11905: 0xD8C5, 22032 - 11905: 0x8745, 22033 - 11905: 0x8746, 22034 - 11905: 0x8747, 22035 - 11905: 0x8748, 22036 - 11905: 0x8749, 22037 - 11905: 0x874A, 22038 - 11905: 0x874B, 22039 - 11905: 0x874C, 22040 - 11905: 0xD0EA, 22041 - 11905: 0x874D, 22042 - 11905: 0x874E, 22043 - 11905: 0xC2EF, 22044 - 11905: 0x874F, 22045 - 11905: 0x8750, 22046 - 11905: 0xE0CF, 22047 - 11905: 0xE0BD, 22048 - 11905: 0x8751, 22049 - 11905: 0x8752, 22050 - 11905: 0x8753, 22051 - 11905: 0xE0D4, 22052 - 11905: 0xE0D3, 22053 - 11905: 0x8754, 22054 - 11905: 0x8755, 22055 - 11905: 0xE0D7, 22056 - 11905: 0x8756, 22057 - 11905: 0x8757, 22058 - 11905: 0x8758, 22059 - 11905: 0x8759, 22060 - 11905: 0xE0DC, 22061 - 11905: 0xE0D8, 22062 - 11905: 0x875A, 22063 - 11905: 0x875B, 22064 - 11905: 0x875C, 22065 - 11905: 0xD6F6, 22066 - 11905: 0xB3B0, 22067 - 11905: 0x875D, 22068 - 11905: 0xD7EC, 22069 - 11905: 0x875E, 22070 - 11905: 0xCBBB, 22071 - 11905: 0x875F, 22072 - 11905: 0x8760, 22073 - 11905: 0xE0DA, 22074 - 11905: 0x8761, 22075 - 11905: 0xCEFB, 22076 - 11905: 0x8762, 22077 - 11905: 0x8763, 22078 - 11905: 0x8764, 22079 - 11905: 0xBAD9, 22080 - 11905: 0x8765, 22081 - 11905: 0x8766, 22082 - 11905: 0x8767, 22083 - 11905: 0x8768, 22084 - 11905: 0x8769, 22085 - 11905: 0x876A, 22086 - 11905: 0x876B, 22087 - 11905: 0x876C, 22088 - 11905: 0x876D, 22089 - 11905: 0x876E, 22090 - 11905: 0x876F, 22091 - 11905: 0x8770, 22092 - 11905: 0xE0E1, 22093 - 11905: 0xE0DD, 22094 - 11905: 0xD2AD, 22095 - 11905: 0x8771, 22096 - 11905: 0x8772, 22097 - 11905: 0x8773, 22098 - 11905: 0x8774, 22099 - 11905: 0x8775, 22100 - 11905: 0xE0E2, 22101 - 11905: 0x8776, 22102 - 11905: 0x8777, 22103 - 11905: 0xE0DB, 22104 - 11905: 0xE0D9, 22105 - 11905: 0xE0DF, 22106 - 11905: 0x8778, 22107 - 11905: 0x8779, 22108 - 11905: 0xE0E0, 22109 - 11905: 0x877A, 22110 - 11905: 0x877B, 22111 - 11905: 0x877C, 22112 - 11905: 0x877D, 22113 - 11905: 0x877E, 22114 - 11905: 0xE0DE, 22115 - 11905: 0x8780, 22116 - 11905: 0xE0E4, 22117 - 11905: 0x8781, 22118 - 11905: 0x8782, 22119 - 11905: 0x8783, 22120 - 11905: 0xC6F7, 22121 - 11905: 0xD8AC, 22122 - 11905: 0xD4EB, 22123 - 11905: 0xE0E6, 22124 - 11905: 0xCAC9, 22125 - 11905: 0x8784, 22126 - 11905: 0x8785, 22127 - 11905: 0x8786, 22128 - 11905: 0x8787, 22129 - 11905: 0xE0E5, 22130 - 11905: 0x8788, 22131 - 11905: 0x8789, 22132 - 11905: 0x878A, 22133 - 11905: 0x878B, 22134 - 11905: 0xB8C1, 22135 - 11905: 0x878C, 22136 - 11905: 0x878D, 22137 - 11905: 0x878E, 22138 - 11905: 0x878F, 22139 - 11905: 0xE0E7, 22140 - 11905: 0xE0E8, 22141 - 11905: 0x8790, 22142 - 11905: 0x8791, 22143 - 11905: 0x8792, 22144 - 11905: 0x8793, 22145 - 11905: 0x8794, 22146 - 11905: 0x8795, 22147 - 11905: 0x8796, 22148 - 11905: 0x8797, 22149 - 11905: 0xE0E9, 22150 - 11905: 0xE0E3, 22151 - 11905: 0x8798, 22152 - 11905: 0x8799, 22153 - 11905: 0x879A, 22154 - 11905: 0x879B, 22155 - 11905: 0x879C, 22156 - 11905: 0x879D, 22157 - 11905: 0x879E, 22158 - 11905: 0xBABF, 22159 - 11905: 0xCCE7, 22160 - 11905: 0x879F, 22161 - 11905: 0x87A0, 22162 - 11905: 0x87A1, 22163 - 11905: 0xE0EA, 22164 - 11905: 0x87A2, 22165 - 11905: 0x87A3, 22166 - 11905: 0x87A4, 22167 - 11905: 0x87A5, 22168 - 11905: 0x87A6, 22169 - 11905: 0x87A7, 22170 - 11905: 0x87A8, 22171 - 11905: 0x87A9, 22172 - 11905: 0x87AA, 22173 - 11905: 0x87AB, 22174 - 11905: 0x87AC, 22175 - 11905: 0x87AD, 22176 - 11905: 0x87AE, 22177 - 11905: 0x87AF, 22178 - 11905: 0x87B0, 22179 - 11905: 0xCFF9, 22180 - 11905: 0x87B1, 22181 - 11905: 0x87B2, 22182 - 11905: 0x87B3, 22183 - 11905: 0x87B4, 22184 - 11905: 0x87B5, 22185 - 11905: 0x87B6, 22186 - 11905: 0x87B7, 22187 - 11905: 0x87B8, 22188 - 11905: 0x87B9, 22189 - 11905: 0x87BA, 22190 - 11905: 0x87BB, 22191 - 11905: 0xE0EB, 22192 - 11905: 0x87BC, 22193 - 11905: 0x87BD, 22194 - 11905: 0x87BE, 22195 - 11905: 0x87BF, 22196 - 11905: 0x87C0, 22197 - 11905: 0x87C1, 22198 - 11905: 0x87C2, 22199 - 11905: 0xC8C2, 22200 - 11905: 0x87C3, 22201 - 11905: 0x87C4, 22202 - 11905: 0x87C5, 22203 - 11905: 0x87C6, 22204 - 11905: 0xBDC0, 22205 - 11905: 0x87C7, 22206 - 11905: 0x87C8, 22207 - 11905: 0x87C9, 22208 - 11905: 0x87CA, 22209 - 11905: 0x87CB, 22210 - 11905: 0x87CC, 22211 - 11905: 0x87CD, 22212 - 11905: 0x87CE, 22213 - 11905: 0x87CF, 22214 - 11905: 0x87D0, 22215 - 11905: 0x87D1, 22216 - 11905: 0x87D2, 22217 - 11905: 0x87D3, 22218 - 11905: 0xC4D2, 22219 - 11905: 0x87D4, 22220 - 11905: 0x87D5, 22221 - 11905: 0x87D6, 22222 - 11905: 0x87D7, 22223 - 11905: 0x87D8, 22224 - 11905: 0x87D9, 22225 - 11905: 0x87DA, 22226 - 11905: 0x87DB, 22227 - 11905: 0x87DC, 22228 - 11905: 0xE0EC, 22229 - 11905: 0x87DD, 22230 - 11905: 0x87DE, 22231 - 11905: 0xE0ED, 22232 - 11905: 0x87DF, 22233 - 11905: 0x87E0, 22234 - 11905: 0xC7F4, 22235 - 11905: 0xCBC4, 22236 - 11905: 0x87E1, 22237 - 11905: 0xE0EE, 22238 - 11905: 0xBBD8, 22239 - 11905: 0xD8B6, 22240 - 11905: 0xD2F2, 22241 - 11905: 0xE0EF, 22242 - 11905: 0xCDC5, 22243 - 11905: 0x87E2, 22244 - 11905: 0xB6DA, 22245 - 11905: 0x87E3, 22246 - 11905: 0x87E4, 22247 - 11905: 0x87E5, 22248 - 11905: 0x87E6, 22249 - 11905: 0x87E7, 22250 - 11905: 0x87E8, 22251 - 11905: 0xE0F1, 22252 - 11905: 0x87E9, 22253 - 11905: 0xD4B0, 22254 - 11905: 0x87EA, 22255 - 11905: 0x87EB, 22256 - 11905: 0xC0A7, 22257 - 11905: 0xB4D1, 22258 - 11905: 0x87EC, 22259 - 11905: 0x87ED, 22260 - 11905: 0xCEA7, 22261 - 11905: 0xE0F0, 22262 - 11905: 0x87EE, 22263 - 11905: 0x87EF, 22264 - 11905: 0x87F0, 22265 - 11905: 0xE0F2, 22266 - 11905: 0xB9CC, 22267 - 11905: 0x87F1, 22268 - 11905: 0x87F2, 22269 - 11905: 0xB9FA, 22270 - 11905: 0xCDBC, 22271 - 11905: 0xE0F3, 22272 - 11905: 0x87F3, 22273 - 11905: 0x87F4, 22274 - 11905: 0x87F5, 22275 - 11905: 0xC6D4, 22276 - 11905: 0xE0F4, 22277 - 11905: 0x87F6, 22278 - 11905: 0xD4B2, 22279 - 11905: 0x87F7, 22280 - 11905: 0xC8A6, 22281 - 11905: 0xE0F6, 22282 - 11905: 0xE0F5, 22283 - 11905: 0x87F8, 22284 - 11905: 0x87F9, 22285 - 11905: 0x87FA, 22286 - 11905: 0x87FB, 22287 - 11905: 0x87FC, 22288 - 11905: 0x87FD, 22289 - 11905: 0x87FE, 22290 - 11905: 0x8840, 22291 - 11905: 0x8841, 22292 - 11905: 0x8842, 22293 - 11905: 0x8843, 22294 - 11905: 0x8844, 22295 - 11905: 0x8845, 22296 - 11905: 0x8846, 22297 - 11905: 0x8847, 22298 - 11905: 0x8848, 22299 - 11905: 0x8849, 22300 - 11905: 0xE0F7, 22301 - 11905: 0x884A, 22302 - 11905: 0x884B, 22303 - 11905: 0xCDC1, 22304 - 11905: 0x884C, 22305 - 11905: 0x884D, 22306 - 11905: 0x884E, 22307 - 11905: 0xCAA5, 22308 - 11905: 0x884F, 22309 - 11905: 0x8850, 22310 - 11905: 0x8851, 22311 - 11905: 0x8852, 22312 - 11905: 0xD4DA, 22313 - 11905: 0xDBD7, 22314 - 11905: 0xDBD9, 22315 - 11905: 0x8853, 22316 - 11905: 0xDBD8, 22317 - 11905: 0xB9E7, 22318 - 11905: 0xDBDC, 22319 - 11905: 0xDBDD, 22320 - 11905: 0xB5D8, 22321 - 11905: 0x8854, 22322 - 11905: 0x8855, 22323 - 11905: 0xDBDA, 22324 - 11905: 0x8856, 22325 - 11905: 0x8857, 22326 - 11905: 0x8858, 22327 - 11905: 0x8859, 22328 - 11905: 0x885A, 22329 - 11905: 0xDBDB, 22330 - 11905: 0xB3A1, 22331 - 11905: 0xDBDF, 22332 - 11905: 0x885B, 22333 - 11905: 0x885C, 22334 - 11905: 0xBBF8, 22335 - 11905: 0x885D, 22336 - 11905: 0xD6B7, 22337 - 11905: 0x885E, 22338 - 11905: 0xDBE0, 22339 - 11905: 0x885F, 22340 - 11905: 0x8860, 22341 - 11905: 0x8861, 22342 - 11905: 0x8862, 22343 - 11905: 0xBEF9, 22344 - 11905: 0x8863, 22345 - 11905: 0x8864, 22346 - 11905: 0xB7BB, 22347 - 11905: 0x8865, 22348 - 11905: 0xDBD0, 22349 - 11905: 0xCCAE, 22350 - 11905: 0xBFB2, 22351 - 11905: 0xBBB5, 22352 - 11905: 0xD7F8, 22353 - 11905: 0xBFD3, 22354 - 11905: 0x8866, 22355 - 11905: 0x8867, 22356 - 11905: 0x8868, 22357 - 11905: 0x8869, 22358 - 11905: 0x886A, 22359 - 11905: 0xBFE9, 22360 - 11905: 0x886B, 22361 - 11905: 0x886C, 22362 - 11905: 0xBCE1, 22363 - 11905: 0xCCB3, 22364 - 11905: 0xDBDE, 22365 - 11905: 0xB0D3, 22366 - 11905: 0xCEEB, 22367 - 11905: 0xB7D8, 22368 - 11905: 0xD7B9, 22369 - 11905: 0xC6C2, 22370 - 11905: 0x886D, 22371 - 11905: 0x886E, 22372 - 11905: 0xC0A4, 22373 - 11905: 0x886F, 22374 - 11905: 0xCCB9, 22375 - 11905: 0x8870, 22376 - 11905: 0xDBE7, 22377 - 11905: 0xDBE1, 22378 - 11905: 0xC6BA, 22379 - 11905: 0xDBE3, 22380 - 11905: 0x8871, 22381 - 11905: 0xDBE8, 22382 - 11905: 0x8872, 22383 - 11905: 0xC5F7, 22384 - 11905: 0x8873, 22385 - 11905: 0x8874, 22386 - 11905: 0x8875, 22387 - 11905: 0xDBEA, 22388 - 11905: 0x8876, 22389 - 11905: 0x8877, 22390 - 11905: 0xDBE9, 22391 - 11905: 0xBFC0, 22392 - 11905: 0x8878, 22393 - 11905: 0x8879, 22394 - 11905: 0x887A, 22395 - 11905: 0xDBE6, 22396 - 11905: 0xDBE5, 22397 - 11905: 0x887B, 22398 - 11905: 0x887C, 22399 - 11905: 0x887D, 22400 - 11905: 0x887E, 22401 - 11905: 0x8880, 22402 - 11905: 0xB4B9, 22403 - 11905: 0xC0AC, 22404 - 11905: 0xC2A2, 22405 - 11905: 0xDBE2, 22406 - 11905: 0xDBE4, 22407 - 11905: 0x8881, 22408 - 11905: 0x8882, 22409 - 11905: 0x8883, 22410 - 11905: 0x8884, 22411 - 11905: 0xD0CD, 22412 - 11905: 0xDBED, 22413 - 11905: 0x8885, 22414 - 11905: 0x8886, 22415 - 11905: 0x8887, 22416 - 11905: 0x8888, 22417 - 11905: 0x8889, 22418 - 11905: 0xC0DD, 22419 - 11905: 0xDBF2, 22420 - 11905: 0x888A, 22421 - 11905: 0x888B, 22422 - 11905: 0x888C, 22423 - 11905: 0x888D, 22424 - 11905: 0x888E, 22425 - 11905: 0x888F, 22426 - 11905: 0x8890, 22427 - 11905: 0xB6E2, 22428 - 11905: 0x8891, 22429 - 11905: 0x8892, 22430 - 11905: 0x8893, 22431 - 11905: 0x8894, 22432 - 11905: 0xDBF3, 22433 - 11905: 0xDBD2, 22434 - 11905: 0xB9B8, 22435 - 11905: 0xD4AB, 22436 - 11905: 0xDBEC, 22437 - 11905: 0x8895, 22438 - 11905: 0xBFD1, 22439 - 11905: 0xDBF0, 22440 - 11905: 0x8896, 22441 - 11905: 0xDBD1, 22442 - 11905: 0x8897, 22443 - 11905: 0xB5E6, 22444 - 11905: 0x8898, 22445 - 11905: 0xDBEB, 22446 - 11905: 0xBFE5, 22447 - 11905: 0x8899, 22448 - 11905: 0x889A, 22449 - 11905: 0x889B, 22450 - 11905: 0xDBEE, 22451 - 11905: 0x889C, 22452 - 11905: 0xDBF1, 22453 - 11905: 0x889D, 22454 - 11905: 0x889E, 22455 - 11905: 0x889F, 22456 - 11905: 0xDBF9, 22457 - 11905: 0x88A0, 22458 - 11905: 0x88A1, 22459 - 11905: 0x88A2, 22460 - 11905: 0x88A3, 22461 - 11905: 0x88A4, 22462 - 11905: 0x88A5, 22463 - 11905: 0x88A6, 22464 - 11905: 0x88A7, 22465 - 11905: 0x88A8, 22466 - 11905: 0xB9A1, 22467 - 11905: 0xB0A3, 22468 - 11905: 0x88A9, 22469 - 11905: 0x88AA, 22470 - 11905: 0x88AB, 22471 - 11905: 0x88AC, 22472 - 11905: 0x88AD, 22473 - 11905: 0x88AE, 22474 - 11905: 0x88AF, 22475 - 11905: 0xC2F1, 22476 - 11905: 0x88B0, 22477 - 11905: 0x88B1, 22478 - 11905: 0xB3C7, 22479 - 11905: 0xDBEF, 22480 - 11905: 0x88B2, 22481 - 11905: 0x88B3, 22482 - 11905: 0xDBF8, 22483 - 11905: 0x88B4, 22484 - 11905: 0xC6D2, 22485 - 11905: 0xDBF4, 22486 - 11905: 0x88B5, 22487 - 11905: 0x88B6, 22488 - 11905: 0xDBF5, 22489 - 11905: 0xDBF7, 22490 - 11905: 0xDBF6, 22491 - 11905: 0x88B7, 22492 - 11905: 0x88B8, 22493 - 11905: 0xDBFE, 22494 - 11905: 0x88B9, 22495 - 11905: 0xD3F2, 22496 - 11905: 0xB2BA, 22497 - 11905: 0x88BA, 22498 - 11905: 0x88BB, 22499 - 11905: 0x88BC, 22500 - 11905: 0xDBFD, 22501 - 11905: 0x88BD, 22502 - 11905: 0x88BE, 22503 - 11905: 0x88BF, 22504 - 11905: 0x88C0, 22505 - 11905: 0x88C1, 22506 - 11905: 0x88C2, 22507 - 11905: 0x88C3, 22508 - 11905: 0x88C4, 22509 - 11905: 0xDCA4, 22510 - 11905: 0x88C5, 22511 - 11905: 0xDBFB, 22512 - 11905: 0x88C6, 22513 - 11905: 0x88C7, 22514 - 11905: 0x88C8, 22515 - 11905: 0x88C9, 22516 - 11905: 0xDBFA, 22517 - 11905: 0x88CA, 22518 - 11905: 0x88CB, 22519 - 11905: 0x88CC, 22520 - 11905: 0xDBFC, 22521 - 11905: 0xC5E0, 22522 - 11905: 0xBBF9, 22523 - 11905: 0x88CD, 22524 - 11905: 0x88CE, 22525 - 11905: 0xDCA3, 22526 - 11905: 0x88CF, 22527 - 11905: 0x88D0, 22528 - 11905: 0xDCA5, 22529 - 11905: 0x88D1, 22530 - 11905: 0xCCC3, 22531 - 11905: 0x88D2, 22532 - 11905: 0x88D3, 22533 - 11905: 0x88D4, 22534 - 11905: 0xB6D1, 22535 - 11905: 0xDDC0, 22536 - 11905: 0x88D5, 22537 - 11905: 0x88D6, 22538 - 11905: 0x88D7, 22539 - 11905: 0xDCA1, 22540 - 11905: 0x88D8, 22541 - 11905: 0xDCA2, 22542 - 11905: 0x88D9, 22543 - 11905: 0x88DA, 22544 - 11905: 0x88DB, 22545 - 11905: 0xC7B5, 22546 - 11905: 0x88DC, 22547 - 11905: 0x88DD, 22548 - 11905: 0x88DE, 22549 - 11905: 0xB6E9, 22550 - 11905: 0x88DF, 22551 - 11905: 0x88E0, 22552 - 11905: 0x88E1, 22553 - 11905: 0xDCA7, 22554 - 11905: 0x88E2, 22555 - 11905: 0x88E3, 22556 - 11905: 0x88E4, 22557 - 11905: 0x88E5, 22558 - 11905: 0xDCA6, 22559 - 11905: 0x88E6, 22560 - 11905: 0xDCA9, 22561 - 11905: 0xB1A4, 22562 - 11905: 0x88E7, 22563 - 11905: 0x88E8, 22564 - 11905: 0xB5CC, 22565 - 11905: 0x88E9, 22566 - 11905: 0x88EA, 22567 - 11905: 0x88EB, 22568 - 11905: 0x88EC, 22569 - 11905: 0x88ED, 22570 - 11905: 0xBFB0, 22571 - 11905: 0x88EE, 22572 - 11905: 0x88EF, 22573 - 11905: 0x88F0, 22574 - 11905: 0x88F1, 22575 - 11905: 0x88F2, 22576 - 11905: 0xD1DF, 22577 - 11905: 0x88F3, 22578 - 11905: 0x88F4, 22579 - 11905: 0x88F5, 22580 - 11905: 0x88F6, 22581 - 11905: 0xB6C2, 22582 - 11905: 0x88F7, 22583 - 11905: 0x88F8, 22584 - 11905: 0x88F9, 22585 - 11905: 0x88FA, 22586 - 11905: 0x88FB, 22587 - 11905: 0x88FC, 22588 - 11905: 0x88FD, 22589 - 11905: 0x88FE, 22590 - 11905: 0x8940, 22591 - 11905: 0x8941, 22592 - 11905: 0x8942, 22593 - 11905: 0x8943, 22594 - 11905: 0x8944, 22595 - 11905: 0x8945, 22596 - 11905: 0xDCA8, 22597 - 11905: 0x8946, 22598 - 11905: 0x8947, 22599 - 11905: 0x8948, 22600 - 11905: 0x8949, 22601 - 11905: 0x894A, 22602 - 11905: 0x894B, 22603 - 11905: 0x894C, 22604 - 11905: 0xCBFA, 22605 - 11905: 0xEBF3, 22606 - 11905: 0x894D, 22607 - 11905: 0x894E, 22608 - 11905: 0x894F, 22609 - 11905: 0xCBDC, 22610 - 11905: 0x8950, 22611 - 11905: 0x8951, 22612 - 11905: 0xCBFE, 22613 - 11905: 0x8952, 22614 - 11905: 0x8953, 22615 - 11905: 0x8954, 22616 - 11905: 0xCCC1, 22617 - 11905: 0x8955, 22618 - 11905: 0x8956, 22619 - 11905: 0x8957, 22620 - 11905: 0x8958, 22621 - 11905: 0x8959, 22622 - 11905: 0xC8FB, 22623 - 11905: 0x895A, 22624 - 11905: 0x895B, 22625 - 11905: 0x895C, 22626 - 11905: 0x895D, 22627 - 11905: 0x895E, 22628 - 11905: 0x895F, 22629 - 11905: 0xDCAA, 22630 - 11905: 0x8960, 22631 - 11905: 0x8961, 22632 - 11905: 0x8962, 22633 - 11905: 0x8963, 22634 - 11905: 0x8964, 22635 - 11905: 0xCCEE, 22636 - 11905: 0xDCAB, 22637 - 11905: 0x8965, 22638 - 11905: 0x8966, 22639 - 11905: 0x8967, 22640 - 11905: 0x8968, 22641 - 11905: 0x8969, 22642 - 11905: 0x896A, 22643 - 11905: 0x896B, 22644 - 11905: 0x896C, 22645 - 11905: 0x896D, 22646 - 11905: 0x896E, 22647 - 11905: 0x896F, 22648 - 11905: 0x8970, 22649 - 11905: 0x8971, 22650 - 11905: 0x8972, 22651 - 11905: 0x8973, 22652 - 11905: 0x8974, 22653 - 11905: 0x8975, 22654 - 11905: 0xDBD3, 22655 - 11905: 0x8976, 22656 - 11905: 0xDCAF, 22657 - 11905: 0xDCAC, 22658 - 11905: 0x8977, 22659 - 11905: 0xBEB3, 22660 - 11905: 0x8978, 22661 - 11905: 0xCAFB, 22662 - 11905: 0x8979, 22663 - 11905: 0x897A, 22664 - 11905: 0x897B, 22665 - 11905: 0xDCAD, 22666 - 11905: 0x897C, 22667 - 11905: 0x897D, 22668 - 11905: 0x897E, 22669 - 11905: 0x8980, 22670 - 11905: 0x8981, 22671 - 11905: 0x8982, 22672 - 11905: 0x8983, 22673 - 11905: 0x8984, 22674 - 11905: 0xC9CA, 22675 - 11905: 0xC4B9, 22676 - 11905: 0x8985, 22677 - 11905: 0x8986, 22678 - 11905: 0x8987, 22679 - 11905: 0x8988, 22680 - 11905: 0x8989, 22681 - 11905: 0xC7BD, 22682 - 11905: 0xDCAE, 22683 - 11905: 0x898A, 22684 - 11905: 0x898B, 22685 - 11905: 0x898C, 22686 - 11905: 0xD4F6, 22687 - 11905: 0xD0E6, 22688 - 11905: 0x898D, 22689 - 11905: 0x898E, 22690 - 11905: 0x898F, 22691 - 11905: 0x8990, 22692 - 11905: 0x8991, 22693 - 11905: 0x8992, 22694 - 11905: 0x8993, 22695 - 11905: 0x8994, 22696 - 11905: 0xC4AB, 22697 - 11905: 0xB6D5, 22698 - 11905: 0x8995, 22699 - 11905: 0x8996, 22700 - 11905: 0x8997, 22701 - 11905: 0x8998, 22702 - 11905: 0x8999, 22703 - 11905: 0x899A, 22704 - 11905: 0x899B, 22705 - 11905: 0x899C, 22706 - 11905: 0x899D, 22707 - 11905: 0x899E, 22708 - 11905: 0x899F, 22709 - 11905: 0x89A0, 22710 - 11905: 0x89A1, 22711 - 11905: 0x89A2, 22712 - 11905: 0x89A3, 22713 - 11905: 0x89A4, 22714 - 11905: 0x89A5, 22715 - 11905: 0x89A6, 22716 - 11905: 0xDBD4, 22717 - 11905: 0x89A7, 22718 - 11905: 0x89A8, 22719 - 11905: 0x89A9, 22720 - 11905: 0x89AA, 22721 - 11905: 0xB1DA, 22722 - 11905: 0x89AB, 22723 - 11905: 0x89AC, 22724 - 11905: 0x89AD, 22725 - 11905: 0xDBD5, 22726 - 11905: 0x89AE, 22727 - 11905: 0x89AF, 22728 - 11905: 0x89B0, 22729 - 11905: 0x89B1, 22730 - 11905: 0x89B2, 22731 - 11905: 0x89B3, 22732 - 11905: 0x89B4, 22733 - 11905: 0x89B5, 22734 - 11905: 0x89B6, 22735 - 11905: 0x89B7, 22736 - 11905: 0x89B8, 22737 - 11905: 0xDBD6, 22738 - 11905: 0x89B9, 22739 - 11905: 0x89BA, 22740 - 11905: 0x89BB, 22741 - 11905: 0xBABE, 22742 - 11905: 0x89BC, 22743 - 11905: 0x89BD, 22744 - 11905: 0x89BE, 22745 - 11905: 0x89BF, 22746 - 11905: 0x89C0, 22747 - 11905: 0x89C1, 22748 - 11905: 0x89C2, 22749 - 11905: 0x89C3, 22750 - 11905: 0x89C4, 22751 - 11905: 0x89C5, 22752 - 11905: 0x89C6, 22753 - 11905: 0x89C7, 22754 - 11905: 0x89C8, 22755 - 11905: 0x89C9, 22756 - 11905: 0xC8C0, 22757 - 11905: 0x89CA, 22758 - 11905: 0x89CB, 22759 - 11905: 0x89CC, 22760 - 11905: 0x89CD, 22761 - 11905: 0x89CE, 22762 - 11905: 0x89CF, 22763 - 11905: 0xCABF, 22764 - 11905: 0xC8C9, 22765 - 11905: 0x89D0, 22766 - 11905: 0xD7B3, 22767 - 11905: 0x89D1, 22768 - 11905: 0xC9F9, 22769 - 11905: 0x89D2, 22770 - 11905: 0x89D3, 22771 - 11905: 0xBFC7, 22772 - 11905: 0x89D4, 22773 - 11905: 0x89D5, 22774 - 11905: 0xBAF8, 22775 - 11905: 0x89D6, 22776 - 11905: 0x89D7, 22777 - 11905: 0xD2BC, 22778 - 11905: 0x89D8, 22779 - 11905: 0x89D9, 22780 - 11905: 0x89DA, 22781 - 11905: 0x89DB, 22782 - 11905: 0x89DC, 22783 - 11905: 0x89DD, 22784 - 11905: 0x89DE, 22785 - 11905: 0x89DF, 22786 - 11905: 0xE2BA, 22787 - 11905: 0x89E0, 22788 - 11905: 0xB4A6, 22789 - 11905: 0x89E1, 22790 - 11905: 0x89E2, 22791 - 11905: 0xB1B8, 22792 - 11905: 0x89E3, 22793 - 11905: 0x89E4, 22794 - 11905: 0x89E5, 22795 - 11905: 0x89E6, 22796 - 11905: 0x89E7, 22797 - 11905: 0xB8B4, 22798 - 11905: 0x89E8, 22799 - 11905: 0xCFC4, 22800 - 11905: 0x89E9, 22801 - 11905: 0x89EA, 22802 - 11905: 0x89EB, 22803 - 11905: 0x89EC, 22804 - 11905: 0xD9E7, 22805 - 11905: 0xCFA6, 22806 - 11905: 0xCDE2, 22807 - 11905: 0x89ED, 22808 - 11905: 0x89EE, 22809 - 11905: 0xD9ED, 22810 - 11905: 0xB6E0, 22811 - 11905: 0x89EF, 22812 - 11905: 0xD2B9, 22813 - 11905: 0x89F0, 22814 - 11905: 0x89F1, 22815 - 11905: 0xB9BB, 22816 - 11905: 0x89F2, 22817 - 11905: 0x89F3, 22818 - 11905: 0x89F4, 22819 - 11905: 0x89F5, 22820 - 11905: 0xE2B9, 22821 - 11905: 0xE2B7, 22822 - 11905: 0x89F6, 22823 - 11905: 0xB4F3, 22824 - 11905: 0x89F7, 22825 - 11905: 0xCCEC, 22826 - 11905: 0xCCAB, 22827 - 11905: 0xB7F2, 22828 - 11905: 0x89F8, 22829 - 11905: 0xD8B2, 22830 - 11905: 0xD1EB, 22831 - 11905: 0xBABB, 22832 - 11905: 0x89F9, 22833 - 11905: 0xCAA7, 22834 - 11905: 0x89FA, 22835 - 11905: 0x89FB, 22836 - 11905: 0xCDB7, 22837 - 11905: 0x89FC, 22838 - 11905: 0x89FD, 22839 - 11905: 0xD2C4, 22840 - 11905: 0xBFE4, 22841 - 11905: 0xBCD0, 22842 - 11905: 0xB6E1, 22843 - 11905: 0x89FE, 22844 - 11905: 0xDEC5, 22845 - 11905: 0x8A40, 22846 - 11905: 0x8A41, 22847 - 11905: 0x8A42, 22848 - 11905: 0x8A43, 22849 - 11905: 0xDEC6, 22850 - 11905: 0xDBBC, 22851 - 11905: 0x8A44, 22852 - 11905: 0xD1D9, 22853 - 11905: 0x8A45, 22854 - 11905: 0x8A46, 22855 - 11905: 0xC6E6, 22856 - 11905: 0xC4CE, 22857 - 11905: 0xB7EE, 22858 - 11905: 0x8A47, 22859 - 11905: 0xB7DC, 22860 - 11905: 0x8A48, 22861 - 11905: 0x8A49, 22862 - 11905: 0xBFFC, 22863 - 11905: 0xD7E0, 22864 - 11905: 0x8A4A, 22865 - 11905: 0xC6F5, 22866 - 11905: 0x8A4B, 22867 - 11905: 0x8A4C, 22868 - 11905: 0xB1BC, 22869 - 11905: 0xDEC8, 22870 - 11905: 0xBDB1, 22871 - 11905: 0xCCD7, 22872 - 11905: 0xDECA, 22873 - 11905: 0x8A4D, 22874 - 11905: 0xDEC9, 22875 - 11905: 0x8A4E, 22876 - 11905: 0x8A4F, 22877 - 11905: 0x8A50, 22878 - 11905: 0x8A51, 22879 - 11905: 0x8A52, 22880 - 11905: 0xB5EC, 22881 - 11905: 0x8A53, 22882 - 11905: 0xC9DD, 22883 - 11905: 0x8A54, 22884 - 11905: 0x8A55, 22885 - 11905: 0xB0C2, 22886 - 11905: 0x8A56, 22887 - 11905: 0x8A57, 22888 - 11905: 0x8A58, 22889 - 11905: 0x8A59, 22890 - 11905: 0x8A5A, 22891 - 11905: 0x8A5B, 22892 - 11905: 0x8A5C, 22893 - 11905: 0x8A5D, 22894 - 11905: 0x8A5E, 22895 - 11905: 0x8A5F, 22896 - 11905: 0x8A60, 22897 - 11905: 0x8A61, 22898 - 11905: 0x8A62, 22899 - 11905: 0xC5AE, 22900 - 11905: 0xC5AB, 22901 - 11905: 0x8A63, 22902 - 11905: 0xC4CC, 22903 - 11905: 0x8A64, 22904 - 11905: 0xBCE9, 22905 - 11905: 0xCBFD, 22906 - 11905: 0x8A65, 22907 - 11905: 0x8A66, 22908 - 11905: 0x8A67, 22909 - 11905: 0xBAC3, 22910 - 11905: 0x8A68, 22911 - 11905: 0x8A69, 22912 - 11905: 0x8A6A, 22913 - 11905: 0xE5F9, 22914 - 11905: 0xC8E7, 22915 - 11905: 0xE5FA, 22916 - 11905: 0xCDFD, 22917 - 11905: 0x8A6B, 22918 - 11905: 0xD7B1, 22919 - 11905: 0xB8BE, 22920 - 11905: 0xC2E8, 22921 - 11905: 0x8A6C, 22922 - 11905: 0xC8D1, 22923 - 11905: 0x8A6D, 22924 - 11905: 0x8A6E, 22925 - 11905: 0xE5FB, 22926 - 11905: 0x8A6F, 22927 - 11905: 0x8A70, 22928 - 11905: 0x8A71, 22929 - 11905: 0x8A72, 22930 - 11905: 0xB6CA, 22931 - 11905: 0xBCCB, 22932 - 11905: 0x8A73, 22933 - 11905: 0x8A74, 22934 - 11905: 0xD1FD, 22935 - 11905: 0xE6A1, 22936 - 11905: 0x8A75, 22937 - 11905: 0xC3EE, 22938 - 11905: 0x8A76, 22939 - 11905: 0x8A77, 22940 - 11905: 0x8A78, 22941 - 11905: 0x8A79, 22942 - 11905: 0xE6A4, 22943 - 11905: 0x8A7A, 22944 - 11905: 0x8A7B, 22945 - 11905: 0x8A7C, 22946 - 11905: 0x8A7D, 22947 - 11905: 0xE5FE, 22948 - 11905: 0xE6A5, 22949 - 11905: 0xCDD7, 22950 - 11905: 0x8A7E, 22951 - 11905: 0x8A80, 22952 - 11905: 0xB7C1, 22953 - 11905: 0xE5FC, 22954 - 11905: 0xE5FD, 22955 - 11905: 0xE6A3, 22956 - 11905: 0x8A81, 22957 - 11905: 0x8A82, 22958 - 11905: 0xC4DD, 22959 - 11905: 0xE6A8, 22960 - 11905: 0x8A83, 22961 - 11905: 0x8A84, 22962 - 11905: 0xE6A7, 22963 - 11905: 0x8A85, 22964 - 11905: 0x8A86, 22965 - 11905: 0x8A87, 22966 - 11905: 0x8A88, 22967 - 11905: 0x8A89, 22968 - 11905: 0x8A8A, 22969 - 11905: 0xC3C3, 22970 - 11905: 0x8A8B, 22971 - 11905: 0xC6DE, 22972 - 11905: 0x8A8C, 22973 - 11905: 0x8A8D, 22974 - 11905: 0xE6AA, 22975 - 11905: 0x8A8E, 22976 - 11905: 0x8A8F, 22977 - 11905: 0x8A90, 22978 - 11905: 0x8A91, 22979 - 11905: 0x8A92, 22980 - 11905: 0x8A93, 22981 - 11905: 0x8A94, 22982 - 11905: 0xC4B7, 22983 - 11905: 0x8A95, 22984 - 11905: 0x8A96, 22985 - 11905: 0x8A97, 22986 - 11905: 0xE6A2, 22987 - 11905: 0xCABC, 22988 - 11905: 0x8A98, 22989 - 11905: 0x8A99, 22990 - 11905: 0x8A9A, 22991 - 11905: 0x8A9B, 22992 - 11905: 0xBDE3, 22993 - 11905: 0xB9C3, 22994 - 11905: 0xE6A6, 22995 - 11905: 0xD0D5, 22996 - 11905: 0xCEAF, 22997 - 11905: 0x8A9C, 22998 - 11905: 0x8A9D, 22999 - 11905: 0xE6A9, 23000 - 11905: 0xE6B0, 23001 - 11905: 0x8A9E, 23002 - 11905: 0xD2A6, 23003 - 11905: 0x8A9F, 23004 - 11905: 0xBDAA, 23005 - 11905: 0xE6AD, 23006 - 11905: 0x8AA0, 23007 - 11905: 0x8AA1, 23008 - 11905: 0x8AA2, 23009 - 11905: 0x8AA3, 23010 - 11905: 0x8AA4, 23011 - 11905: 0xE6AF, 23012 - 11905: 0x8AA5, 23013 - 11905: 0xC0D1, 23014 - 11905: 0x8AA6, 23015 - 11905: 0x8AA7, 23016 - 11905: 0xD2CC, 23017 - 11905: 0x8AA8, 23018 - 11905: 0x8AA9, 23019 - 11905: 0x8AAA, 23020 - 11905: 0xBCA7, 23021 - 11905: 0x8AAB, 23022 - 11905: 0x8AAC, 23023 - 11905: 0x8AAD, 23024 - 11905: 0x8AAE, 23025 - 11905: 0x8AAF, 23026 - 11905: 0x8AB0, 23027 - 11905: 0x8AB1, 23028 - 11905: 0x8AB2, 23029 - 11905: 0x8AB3, 23030 - 11905: 0x8AB4, 23031 - 11905: 0x8AB5, 23032 - 11905: 0x8AB6, 23033 - 11905: 0xE6B1, 23034 - 11905: 0x8AB7, 23035 - 11905: 0xD2F6, 23036 - 11905: 0x8AB8, 23037 - 11905: 0x8AB9, 23038 - 11905: 0x8ABA, 23039 - 11905: 0xD7CB, 23040 - 11905: 0x8ABB, 23041 - 11905: 0xCDFE, 23042 - 11905: 0x8ABC, 23043 - 11905: 0xCDDE, 23044 - 11905: 0xC2A6, 23045 - 11905: 0xE6AB, 23046 - 11905: 0xE6AC, 23047 - 11905: 0xBDBF, 23048 - 11905: 0xE6AE, 23049 - 11905: 0xE6B3, 23050 - 11905: 0x8ABD, 23051 - 11905: 0x8ABE, 23052 - 11905: 0xE6B2, 23053 - 11905: 0x8ABF, 23054 - 11905: 0x8AC0, 23055 - 11905: 0x8AC1, 23056 - 11905: 0x8AC2, 23057 - 11905: 0xE6B6, 23058 - 11905: 0x8AC3, 23059 - 11905: 0xE6B8, 23060 - 11905: 0x8AC4, 23061 - 11905: 0x8AC5, 23062 - 11905: 0x8AC6, 23063 - 11905: 0x8AC7, 23064 - 11905: 0xC4EF, 23065 - 11905: 0x8AC8, 23066 - 11905: 0x8AC9, 23067 - 11905: 0x8ACA, 23068 - 11905: 0xC4C8, 23069 - 11905: 0x8ACB, 23070 - 11905: 0x8ACC, 23071 - 11905: 0xBEEA, 23072 - 11905: 0xC9EF, 23073 - 11905: 0x8ACD, 23074 - 11905: 0x8ACE, 23075 - 11905: 0xE6B7, 23076 - 11905: 0x8ACF, 23077 - 11905: 0xB6F0, 23078 - 11905: 0x8AD0, 23079 - 11905: 0x8AD1, 23080 - 11905: 0x8AD2, 23081 - 11905: 0xC3E4, 23082 - 11905: 0x8AD3, 23083 - 11905: 0x8AD4, 23084 - 11905: 0x8AD5, 23085 - 11905: 0x8AD6, 23086 - 11905: 0x8AD7, 23087 - 11905: 0x8AD8, 23088 - 11905: 0x8AD9, 23089 - 11905: 0xD3E9, 23090 - 11905: 0xE6B4, 23091 - 11905: 0x8ADA, 23092 - 11905: 0xE6B5, 23093 - 11905: 0x8ADB, 23094 - 11905: 0xC8A2, 23095 - 11905: 0x8ADC, 23096 - 11905: 0x8ADD, 23097 - 11905: 0x8ADE, 23098 - 11905: 0x8ADF, 23099 - 11905: 0x8AE0, 23100 - 11905: 0xE6BD, 23101 - 11905: 0x8AE1, 23102 - 11905: 0x8AE2, 23103 - 11905: 0x8AE3, 23104 - 11905: 0xE6B9, 23105 - 11905: 0x8AE4, 23106 - 11905: 0x8AE5, 23107 - 11905: 0x8AE6, 23108 - 11905: 0x8AE7, 23109 - 11905: 0x8AE8, 23110 - 11905: 0xC6C5, 23111 - 11905: 0x8AE9, 23112 - 11905: 0x8AEA, 23113 - 11905: 0xCDF1, 23114 - 11905: 0xE6BB, 23115 - 11905: 0x8AEB, 23116 - 11905: 0x8AEC, 23117 - 11905: 0x8AED, 23118 - 11905: 0x8AEE, 23119 - 11905: 0x8AEF, 23120 - 11905: 0x8AF0, 23121 - 11905: 0x8AF1, 23122 - 11905: 0x8AF2, 23123 - 11905: 0x8AF3, 23124 - 11905: 0x8AF4, 23125 - 11905: 0xE6BC, 23126 - 11905: 0x8AF5, 23127 - 11905: 0x8AF6, 23128 - 11905: 0x8AF7, 23129 - 11905: 0x8AF8, 23130 - 11905: 0xBBE9, 23131 - 11905: 0x8AF9, 23132 - 11905: 0x8AFA, 23133 - 11905: 0x8AFB, 23134 - 11905: 0x8AFC, 23135 - 11905: 0x8AFD, 23136 - 11905: 0x8AFE, 23137 - 11905: 0x8B40, 23138 - 11905: 0xE6BE, 23139 - 11905: 0x8B41, 23140 - 11905: 0x8B42, 23141 - 11905: 0x8B43, 23142 - 11905: 0x8B44, 23143 - 11905: 0xE6BA, 23144 - 11905: 0x8B45, 23145 - 11905: 0x8B46, 23146 - 11905: 0xC0B7, 23147 - 11905: 0x8B47, 23148 - 11905: 0x8B48, 23149 - 11905: 0x8B49, 23150 - 11905: 0x8B4A, 23151 - 11905: 0x8B4B, 23152 - 11905: 0x8B4C, 23153 - 11905: 0x8B4D, 23154 - 11905: 0x8B4E, 23155 - 11905: 0x8B4F, 23156 - 11905: 0xD3A4, 23157 - 11905: 0xE6BF, 23158 - 11905: 0xC9F4, 23159 - 11905: 0xE6C3, 23160 - 11905: 0x8B50, 23161 - 11905: 0x8B51, 23162 - 11905: 0xE6C4, 23163 - 11905: 0x8B52, 23164 - 11905: 0x8B53, 23165 - 11905: 0x8B54, 23166 - 11905: 0x8B55, 23167 - 11905: 0xD0F6, 23168 - 11905: 0x8B56, 23169 - 11905: 0x8B57, 23170 - 11905: 0x8B58, 23171 - 11905: 0x8B59, 23172 - 11905: 0x8B5A, 23173 - 11905: 0x8B5B, 23174 - 11905: 0x8B5C, 23175 - 11905: 0x8B5D, 23176 - 11905: 0x8B5E, 23177 - 11905: 0x8B5F, 23178 - 11905: 0x8B60, 23179 - 11905: 0x8B61, 23180 - 11905: 0x8B62, 23181 - 11905: 0x8B63, 23182 - 11905: 0x8B64, 23183 - 11905: 0x8B65, 23184 - 11905: 0x8B66, 23185 - 11905: 0x8B67, 23186 - 11905: 0xC3BD, 23187 - 11905: 0x8B68, 23188 - 11905: 0x8B69, 23189 - 11905: 0x8B6A, 23190 - 11905: 0x8B6B, 23191 - 11905: 0x8B6C, 23192 - 11905: 0x8B6D, 23193 - 11905: 0x8B6E, 23194 - 11905: 0xC3C4, 23195 - 11905: 0xE6C2, 23196 - 11905: 0x8B6F, 23197 - 11905: 0x8B70, 23198 - 11905: 0x8B71, 23199 - 11905: 0x8B72, 23200 - 11905: 0x8B73, 23201 - 11905: 0x8B74, 23202 - 11905: 0x8B75, 23203 - 11905: 0x8B76, 23204 - 11905: 0x8B77, 23205 - 11905: 0x8B78, 23206 - 11905: 0x8B79, 23207 - 11905: 0x8B7A, 23208 - 11905: 0x8B7B, 23209 - 11905: 0x8B7C, 23210 - 11905: 0xE6C1, 23211 - 11905: 0x8B7D, 23212 - 11905: 0x8B7E, 23213 - 11905: 0x8B80, 23214 - 11905: 0x8B81, 23215 - 11905: 0x8B82, 23216 - 11905: 0x8B83, 23217 - 11905: 0x8B84, 23218 - 11905: 0xE6C7, 23219 - 11905: 0xCFB1, 23220 - 11905: 0x8B85, 23221 - 11905: 0xEBF4, 23222 - 11905: 0x8B86, 23223 - 11905: 0x8B87, 23224 - 11905: 0xE6CA, 23225 - 11905: 0x8B88, 23226 - 11905: 0x8B89, 23227 - 11905: 0x8B8A, 23228 - 11905: 0x8B8B, 23229 - 11905: 0x8B8C, 23230 - 11905: 0xE6C5, 23231 - 11905: 0x8B8D, 23232 - 11905: 0x8B8E, 23233 - 11905: 0xBCDE, 23234 - 11905: 0xC9A9, 23235 - 11905: 0x8B8F, 23236 - 11905: 0x8B90, 23237 - 11905: 0x8B91, 23238 - 11905: 0x8B92, 23239 - 11905: 0x8B93, 23240 - 11905: 0x8B94, 23241 - 11905: 0xBCB5, 23242 - 11905: 0x8B95, 23243 - 11905: 0x8B96, 23244 - 11905: 0xCFD3, 23245 - 11905: 0x8B97, 23246 - 11905: 0x8B98, 23247 - 11905: 0x8B99, 23248 - 11905: 0x8B9A, 23249 - 11905: 0x8B9B, 23250 - 11905: 0xE6C8, 23251 - 11905: 0x8B9C, 23252 - 11905: 0xE6C9, 23253 - 11905: 0x8B9D, 23254 - 11905: 0xE6CE, 23255 - 11905: 0x8B9E, 23256 - 11905: 0xE6D0, 23257 - 11905: 0x8B9F, 23258 - 11905: 0x8BA0, 23259 - 11905: 0x8BA1, 23260 - 11905: 0xE6D1, 23261 - 11905: 0x8BA2, 23262 - 11905: 0x8BA3, 23263 - 11905: 0x8BA4, 23264 - 11905: 0xE6CB, 23265 - 11905: 0xB5D5, 23266 - 11905: 0x8BA5, 23267 - 11905: 0xE6CC, 23268 - 11905: 0x8BA6, 23269 - 11905: 0x8BA7, 23270 - 11905: 0xE6CF, 23271 - 11905: 0x8BA8, 23272 - 11905: 0x8BA9, 23273 - 11905: 0xC4DB, 23274 - 11905: 0x8BAA, 23275 - 11905: 0xE6C6, 23276 - 11905: 0x8BAB, 23277 - 11905: 0x8BAC, 23278 - 11905: 0x8BAD, 23279 - 11905: 0x8BAE, 23280 - 11905: 0x8BAF, 23281 - 11905: 0xE6CD, 23282 - 11905: 0x8BB0, 23283 - 11905: 0x8BB1, 23284 - 11905: 0x8BB2, 23285 - 11905: 0x8BB3, 23286 - 11905: 0x8BB4, 23287 - 11905: 0x8BB5, 23288 - 11905: 0x8BB6, 23289 - 11905: 0x8BB7, 23290 - 11905: 0x8BB8, 23291 - 11905: 0x8BB9, 23292 - 11905: 0x8BBA, 23293 - 11905: 0x8BBB, 23294 - 11905: 0x8BBC, 23295 - 11905: 0x8BBD, 23296 - 11905: 0x8BBE, 23297 - 11905: 0x8BBF, 23298 - 11905: 0x8BC0, 23299 - 11905: 0x8BC1, 23300 - 11905: 0x8BC2, 23301 - 11905: 0x8BC3, 23302 - 11905: 0x8BC4, 23303 - 11905: 0x8BC5, 23304 - 11905: 0x8BC6, 23305 - 11905: 0xE6D2, 23306 - 11905: 0x8BC7, 23307 - 11905: 0x8BC8, 23308 - 11905: 0x8BC9, 23309 - 11905: 0x8BCA, 23310 - 11905: 0x8BCB, 23311 - 11905: 0x8BCC, 23312 - 11905: 0x8BCD, 23313 - 11905: 0x8BCE, 23314 - 11905: 0x8BCF, 23315 - 11905: 0x8BD0, 23316 - 11905: 0x8BD1, 23317 - 11905: 0x8BD2, 23318 - 11905: 0xE6D4, 23319 - 11905: 0xE6D3, 23320 - 11905: 0x8BD3, 23321 - 11905: 0x8BD4, 23322 - 11905: 0x8BD5, 23323 - 11905: 0x8BD6, 23324 - 11905: 0x8BD7, 23325 - 11905: 0x8BD8, 23326 - 11905: 0x8BD9, 23327 - 11905: 0x8BDA, 23328 - 11905: 0x8BDB, 23329 - 11905: 0x8BDC, 23330 - 11905: 0x8BDD, 23331 - 11905: 0x8BDE, 23332 - 11905: 0x8BDF, 23333 - 11905: 0x8BE0, 23334 - 11905: 0x8BE1, 23335 - 11905: 0x8BE2, 23336 - 11905: 0x8BE3, 23337 - 11905: 0x8BE4, 23338 - 11905: 0x8BE5, 23339 - 11905: 0x8BE6, 23340 - 11905: 0x8BE7, 23341 - 11905: 0x8BE8, 23342 - 11905: 0x8BE9, 23343 - 11905: 0x8BEA, 23344 - 11905: 0x8BEB, 23345 - 11905: 0x8BEC, 23346 - 11905: 0xE6D5, 23347 - 11905: 0x8BED, 23348 - 11905: 0xD9F8, 23349 - 11905: 0x8BEE, 23350 - 11905: 0x8BEF, 23351 - 11905: 0xE6D6, 23352 - 11905: 0x8BF0, 23353 - 11905: 0x8BF1, 23354 - 11905: 0x8BF2, 23355 - 11905: 0x8BF3, 23356 - 11905: 0x8BF4, 23357 - 11905: 0x8BF5, 23358 - 11905: 0x8BF6, 23359 - 11905: 0x8BF7, 23360 - 11905: 0xE6D7, 23361 - 11905: 0x8BF8, 23362 - 11905: 0x8BF9, 23363 - 11905: 0x8BFA, 23364 - 11905: 0x8BFB, 23365 - 11905: 0x8BFC, 23366 - 11905: 0x8BFD, 23367 - 11905: 0x8BFE, 23368 - 11905: 0x8C40, 23369 - 11905: 0x8C41, 23370 - 11905: 0x8C42, 23371 - 11905: 0x8C43, 23372 - 11905: 0x8C44, 23373 - 11905: 0x8C45, 23374 - 11905: 0x8C46, 23375 - 11905: 0x8C47, 23376 - 11905: 0xD7D3, 23377 - 11905: 0xE6DD, 23378 - 11905: 0x8C48, 23379 - 11905: 0xE6DE, 23380 - 11905: 0xBFD7, 23381 - 11905: 0xD4D0, 23382 - 11905: 0x8C49, 23383 - 11905: 0xD7D6, 23384 - 11905: 0xB4E6, 23385 - 11905: 0xCBEF, 23386 - 11905: 0xE6DA, 23387 - 11905: 0xD8C3, 23388 - 11905: 0xD7CE, 23389 - 11905: 0xD0A2, 23390 - 11905: 0x8C4A, 23391 - 11905: 0xC3CF, 23392 - 11905: 0x8C4B, 23393 - 11905: 0x8C4C, 23394 - 11905: 0xE6DF, 23395 - 11905: 0xBCBE, 23396 - 11905: 0xB9C2, 23397 - 11905: 0xE6DB, 23398 - 11905: 0xD1A7, 23399 - 11905: 0x8C4D, 23400 - 11905: 0x8C4E, 23401 - 11905: 0xBAA2, 23402 - 11905: 0xC2CF, 23403 - 11905: 0x8C4F, 23404 - 11905: 0xD8AB, 23405 - 11905: 0x8C50, 23406 - 11905: 0x8C51, 23407 - 11905: 0x8C52, 23408 - 11905: 0xCAEB, 23409 - 11905: 0xE5EE, 23410 - 11905: 0x8C53, 23411 - 11905: 0xE6DC, 23412 - 11905: 0x8C54, 23413 - 11905: 0xB7F5, 23414 - 11905: 0x8C55, 23415 - 11905: 0x8C56, 23416 - 11905: 0x8C57, 23417 - 11905: 0x8C58, 23418 - 11905: 0xC8E6, 23419 - 11905: 0x8C59, 23420 - 11905: 0x8C5A, 23421 - 11905: 0xC4F5, 23422 - 11905: 0x8C5B, 23423 - 11905: 0x8C5C, 23424 - 11905: 0xE5B2, 23425 - 11905: 0xC4FE, 23426 - 11905: 0x8C5D, 23427 - 11905: 0xCBFC, 23428 - 11905: 0xE5B3, 23429 - 11905: 0xD5AC, 23430 - 11905: 0x8C5E, 23431 - 11905: 0xD3EE, 23432 - 11905: 0xCAD8, 23433 - 11905: 0xB0B2, 23434 - 11905: 0x8C5F, 23435 - 11905: 0xCBCE, 23436 - 11905: 0xCDEA, 23437 - 11905: 0x8C60, 23438 - 11905: 0x8C61, 23439 - 11905: 0xBAEA, 23440 - 11905: 0x8C62, 23441 - 11905: 0x8C63, 23442 - 11905: 0x8C64, 23443 - 11905: 0xE5B5, 23444 - 11905: 0x8C65, 23445 - 11905: 0xE5B4, 23446 - 11905: 0x8C66, 23447 - 11905: 0xD7DA, 23448 - 11905: 0xB9D9, 23449 - 11905: 0xD6E6, 23450 - 11905: 0xB6A8, 23451 - 11905: 0xCDF0, 23452 - 11905: 0xD2CB, 23453 - 11905: 0xB1A6, 23454 - 11905: 0xCAB5, 23455 - 11905: 0x8C67, 23456 - 11905: 0xB3E8, 23457 - 11905: 0xC9F3, 23458 - 11905: 0xBFCD, 23459 - 11905: 0xD0FB, 23460 - 11905: 0xCAD2, 23461 - 11905: 0xE5B6, 23462 - 11905: 0xBBC2, 23463 - 11905: 0x8C68, 23464 - 11905: 0x8C69, 23465 - 11905: 0x8C6A, 23466 - 11905: 0xCFDC, 23467 - 11905: 0xB9AC, 23468 - 11905: 0x8C6B, 23469 - 11905: 0x8C6C, 23470 - 11905: 0x8C6D, 23471 - 11905: 0x8C6E, 23472 - 11905: 0xD4D7, 23473 - 11905: 0x8C6F, 23474 - 11905: 0x8C70, 23475 - 11905: 0xBAA6, 23476 - 11905: 0xD1E7, 23477 - 11905: 0xCFFC, 23478 - 11905: 0xBCD2, 23479 - 11905: 0x8C71, 23480 - 11905: 0xE5B7, 23481 - 11905: 0xC8DD, 23482 - 11905: 0x8C72, 23483 - 11905: 0x8C73, 23484 - 11905: 0x8C74, 23485 - 11905: 0xBFED, 23486 - 11905: 0xB1F6, 23487 - 11905: 0xCBDE, 23488 - 11905: 0x8C75, 23489 - 11905: 0x8C76, 23490 - 11905: 0xBCC5, 23491 - 11905: 0x8C77, 23492 - 11905: 0xBCC4, 23493 - 11905: 0xD2FA, 23494 - 11905: 0xC3DC, 23495 - 11905: 0xBFDC, 23496 - 11905: 0x8C78, 23497 - 11905: 0x8C79, 23498 - 11905: 0x8C7A, 23499 - 11905: 0x8C7B, 23500 - 11905: 0xB8BB, 23501 - 11905: 0x8C7C, 23502 - 11905: 0x8C7D, 23503 - 11905: 0x8C7E, 23504 - 11905: 0xC3C2, 23505 - 11905: 0x8C80, 23506 - 11905: 0xBAAE, 23507 - 11905: 0xD4A2, 23508 - 11905: 0x8C81, 23509 - 11905: 0x8C82, 23510 - 11905: 0x8C83, 23511 - 11905: 0x8C84, 23512 - 11905: 0x8C85, 23513 - 11905: 0x8C86, 23514 - 11905: 0x8C87, 23515 - 11905: 0x8C88, 23516 - 11905: 0x8C89, 23517 - 11905: 0xC7DE, 23518 - 11905: 0xC4AF, 23519 - 11905: 0xB2EC, 23520 - 11905: 0x8C8A, 23521 - 11905: 0xB9D1, 23522 - 11905: 0x8C8B, 23523 - 11905: 0x8C8C, 23524 - 11905: 0xE5BB, 23525 - 11905: 0xC1C8, 23526 - 11905: 0x8C8D, 23527 - 11905: 0x8C8E, 23528 - 11905: 0xD5AF, 23529 - 11905: 0x8C8F, 23530 - 11905: 0x8C90, 23531 - 11905: 0x8C91, 23532 - 11905: 0x8C92, 23533 - 11905: 0x8C93, 23534 - 11905: 0xE5BC, 23535 - 11905: 0x8C94, 23536 - 11905: 0xE5BE, 23537 - 11905: 0x8C95, 23538 - 11905: 0x8C96, 23539 - 11905: 0x8C97, 23540 - 11905: 0x8C98, 23541 - 11905: 0x8C99, 23542 - 11905: 0x8C9A, 23543 - 11905: 0x8C9B, 23544 - 11905: 0xB4E7, 23545 - 11905: 0xB6D4, 23546 - 11905: 0xCBC2, 23547 - 11905: 0xD1B0, 23548 - 11905: 0xB5BC, 23549 - 11905: 0x8C9C, 23550 - 11905: 0x8C9D, 23551 - 11905: 0xCAD9, 23552 - 11905: 0x8C9E, 23553 - 11905: 0xB7E2, 23554 - 11905: 0x8C9F, 23555 - 11905: 0x8CA0, 23556 - 11905: 0xC9E4, 23557 - 11905: 0x8CA1, 23558 - 11905: 0xBDAB, 23559 - 11905: 0x8CA2, 23560 - 11905: 0x8CA3, 23561 - 11905: 0xCEBE, 23562 - 11905: 0xD7F0, 23563 - 11905: 0x8CA4, 23564 - 11905: 0x8CA5, 23565 - 11905: 0x8CA6, 23566 - 11905: 0x8CA7, 23567 - 11905: 0xD0A1, 23568 - 11905: 0x8CA8, 23569 - 11905: 0xC9D9, 23570 - 11905: 0x8CA9, 23571 - 11905: 0x8CAA, 23572 - 11905: 0xB6FB, 23573 - 11905: 0xE6D8, 23574 - 11905: 0xBCE2, 23575 - 11905: 0x8CAB, 23576 - 11905: 0xB3BE, 23577 - 11905: 0x8CAC, 23578 - 11905: 0xC9D0, 23579 - 11905: 0x8CAD, 23580 - 11905: 0xE6D9, 23581 - 11905: 0xB3A2, 23582 - 11905: 0x8CAE, 23583 - 11905: 0x8CAF, 23584 - 11905: 0x8CB0, 23585 - 11905: 0x8CB1, 23586 - 11905: 0xDECC, 23587 - 11905: 0x8CB2, 23588 - 11905: 0xD3C8, 23589 - 11905: 0xDECD, 23590 - 11905: 0x8CB3, 23591 - 11905: 0xD2A2, 23592 - 11905: 0x8CB4, 23593 - 11905: 0x8CB5, 23594 - 11905: 0x8CB6, 23595 - 11905: 0x8CB7, 23596 - 11905: 0xDECE, 23597 - 11905: 0x8CB8, 23598 - 11905: 0x8CB9, 23599 - 11905: 0x8CBA, 23600 - 11905: 0x8CBB, 23601 - 11905: 0xBECD, 23602 - 11905: 0x8CBC, 23603 - 11905: 0x8CBD, 23604 - 11905: 0xDECF, 23605 - 11905: 0x8CBE, 23606 - 11905: 0x8CBF, 23607 - 11905: 0x8CC0, 23608 - 11905: 0xCAAC, 23609 - 11905: 0xD2FC, 23610 - 11905: 0xB3DF, 23611 - 11905: 0xE5EA, 23612 - 11905: 0xC4E1, 23613 - 11905: 0xBEA1, 23614 - 11905: 0xCEB2, 23615 - 11905: 0xC4F2, 23616 - 11905: 0xBED6, 23617 - 11905: 0xC6A8, 23618 - 11905: 0xB2E3, 23619 - 11905: 0x8CC1, 23620 - 11905: 0x8CC2, 23621 - 11905: 0xBED3, 23622 - 11905: 0x8CC3, 23623 - 11905: 0x8CC4, 23624 - 11905: 0xC7FC, 23625 - 11905: 0xCCEB, 23626 - 11905: 0xBDEC, 23627 - 11905: 0xCEDD, 23628 - 11905: 0x8CC5, 23629 - 11905: 0x8CC6, 23630 - 11905: 0xCABA, 23631 - 11905: 0xC6C1, 23632 - 11905: 0xE5EC, 23633 - 11905: 0xD0BC, 23634 - 11905: 0x8CC7, 23635 - 11905: 0x8CC8, 23636 - 11905: 0x8CC9, 23637 - 11905: 0xD5B9, 23638 - 11905: 0x8CCA, 23639 - 11905: 0x8CCB, 23640 - 11905: 0x8CCC, 23641 - 11905: 0xE5ED, 23642 - 11905: 0x8CCD, 23643 - 11905: 0x8CCE, 23644 - 11905: 0x8CCF, 23645 - 11905: 0x8CD0, 23646 - 11905: 0xCAF4, 23647 - 11905: 0x8CD1, 23648 - 11905: 0xCDC0, 23649 - 11905: 0xC2C5, 23650 - 11905: 0x8CD2, 23651 - 11905: 0xE5EF, 23652 - 11905: 0x8CD3, 23653 - 11905: 0xC2C4, 23654 - 11905: 0xE5F0, 23655 - 11905: 0x8CD4, 23656 - 11905: 0x8CD5, 23657 - 11905: 0x8CD6, 23658 - 11905: 0x8CD7, 23659 - 11905: 0x8CD8, 23660 - 11905: 0x8CD9, 23661 - 11905: 0x8CDA, 23662 - 11905: 0xE5F8, 23663 - 11905: 0xCDCD, 23664 - 11905: 0x8CDB, 23665 - 11905: 0xC9BD, 23666 - 11905: 0x8CDC, 23667 - 11905: 0x8CDD, 23668 - 11905: 0x8CDE, 23669 - 11905: 0x8CDF, 23670 - 11905: 0x8CE0, 23671 - 11905: 0x8CE1, 23672 - 11905: 0x8CE2, 23673 - 11905: 0xD2D9, 23674 - 11905: 0xE1A8, 23675 - 11905: 0x8CE3, 23676 - 11905: 0x8CE4, 23677 - 11905: 0x8CE5, 23678 - 11905: 0x8CE6, 23679 - 11905: 0xD3EC, 23680 - 11905: 0x8CE7, 23681 - 11905: 0xCBEA, 23682 - 11905: 0xC6F1, 23683 - 11905: 0x8CE8, 23684 - 11905: 0x8CE9, 23685 - 11905: 0x8CEA, 23686 - 11905: 0x8CEB, 23687 - 11905: 0x8CEC, 23688 - 11905: 0xE1AC, 23689 - 11905: 0x8CED, 23690 - 11905: 0x8CEE, 23691 - 11905: 0x8CEF, 23692 - 11905: 0xE1A7, 23693 - 11905: 0xE1A9, 23694 - 11905: 0x8CF0, 23695 - 11905: 0x8CF1, 23696 - 11905: 0xE1AA, 23697 - 11905: 0xE1AF, 23698 - 11905: 0x8CF2, 23699 - 11905: 0x8CF3, 23700 - 11905: 0xB2ED, 23701 - 11905: 0x8CF4, 23702 - 11905: 0xE1AB, 23703 - 11905: 0xB8DA, 23704 - 11905: 0xE1AD, 23705 - 11905: 0xE1AE, 23706 - 11905: 0xE1B0, 23707 - 11905: 0xB5BA, 23708 - 11905: 0xE1B1, 23709 - 11905: 0x8CF5, 23710 - 11905: 0x8CF6, 23711 - 11905: 0x8CF7, 23712 - 11905: 0x8CF8, 23713 - 11905: 0x8CF9, 23714 - 11905: 0xE1B3, 23715 - 11905: 0xE1B8, 23716 - 11905: 0x8CFA, 23717 - 11905: 0x8CFB, 23718 - 11905: 0x8CFC, 23719 - 11905: 0x8CFD, 23720 - 11905: 0x8CFE, 23721 - 11905: 0xD1D2, 23722 - 11905: 0x8D40, 23723 - 11905: 0xE1B6, 23724 - 11905: 0xE1B5, 23725 - 11905: 0xC1EB, 23726 - 11905: 0x8D41, 23727 - 11905: 0x8D42, 23728 - 11905: 0x8D43, 23729 - 11905: 0xE1B7, 23730 - 11905: 0x8D44, 23731 - 11905: 0xD4C0, 23732 - 11905: 0x8D45, 23733 - 11905: 0xE1B2, 23734 - 11905: 0x8D46, 23735 - 11905: 0xE1BA, 23736 - 11905: 0xB0B6, 23737 - 11905: 0x8D47, 23738 - 11905: 0x8D48, 23739 - 11905: 0x8D49, 23740 - 11905: 0x8D4A, 23741 - 11905: 0xE1B4, 23742 - 11905: 0x8D4B, 23743 - 11905: 0xBFF9, 23744 - 11905: 0x8D4C, 23745 - 11905: 0xE1B9, 23746 - 11905: 0x8D4D, 23747 - 11905: 0x8D4E, 23748 - 11905: 0xE1BB, 23749 - 11905: 0x8D4F, 23750 - 11905: 0x8D50, 23751 - 11905: 0x8D51, 23752 - 11905: 0x8D52, 23753 - 11905: 0x8D53, 23754 - 11905: 0x8D54, 23755 - 11905: 0xE1BE, 23756 - 11905: 0x8D55, 23757 - 11905: 0x8D56, 23758 - 11905: 0x8D57, 23759 - 11905: 0x8D58, 23760 - 11905: 0x8D59, 23761 - 11905: 0x8D5A, 23762 - 11905: 0xE1BC, 23763 - 11905: 0x8D5B, 23764 - 11905: 0x8D5C, 23765 - 11905: 0x8D5D, 23766 - 11905: 0x8D5E, 23767 - 11905: 0x8D5F, 23768 - 11905: 0x8D60, 23769 - 11905: 0xD6C5, 23770 - 11905: 0x8D61, 23771 - 11905: 0x8D62, 23772 - 11905: 0x8D63, 23773 - 11905: 0x8D64, 23774 - 11905: 0x8D65, 23775 - 11905: 0x8D66, 23776 - 11905: 0x8D67, 23777 - 11905: 0xCFBF, 23778 - 11905: 0x8D68, 23779 - 11905: 0x8D69, 23780 - 11905: 0xE1BD, 23781 - 11905: 0xE1BF, 23782 - 11905: 0xC2CD, 23783 - 11905: 0x8D6A, 23784 - 11905: 0xB6EB, 23785 - 11905: 0x8D6B, 23786 - 11905: 0xD3F8, 23787 - 11905: 0x8D6C, 23788 - 11905: 0x8D6D, 23789 - 11905: 0xC7CD, 23790 - 11905: 0x8D6E, 23791 - 11905: 0x8D6F, 23792 - 11905: 0xB7E5, 23793 - 11905: 0x8D70, 23794 - 11905: 0x8D71, 23795 - 11905: 0x8D72, 23796 - 11905: 0x8D73, 23797 - 11905: 0x8D74, 23798 - 11905: 0x8D75, 23799 - 11905: 0x8D76, 23800 - 11905: 0x8D77, 23801 - 11905: 0x8D78, 23802 - 11905: 0x8D79, 23803 - 11905: 0xBEFE, 23804 - 11905: 0x8D7A, 23805 - 11905: 0x8D7B, 23806 - 11905: 0x8D7C, 23807 - 11905: 0x8D7D, 23808 - 11905: 0x8D7E, 23809 - 11905: 0x8D80, 23810 - 11905: 0xE1C0, 23811 - 11905: 0xE1C1, 23812 - 11905: 0x8D81, 23813 - 11905: 0x8D82, 23814 - 11905: 0xE1C7, 23815 - 11905: 0xB3E7, 23816 - 11905: 0x8D83, 23817 - 11905: 0x8D84, 23818 - 11905: 0x8D85, 23819 - 11905: 0x8D86, 23820 - 11905: 0x8D87, 23821 - 11905: 0x8D88, 23822 - 11905: 0xC6E9, 23823 - 11905: 0x8D89, 23824 - 11905: 0x8D8A, 23825 - 11905: 0x8D8B, 23826 - 11905: 0x8D8C, 23827 - 11905: 0x8D8D, 23828 - 11905: 0xB4DE, 23829 - 11905: 0x8D8E, 23830 - 11905: 0xD1C2, 23831 - 11905: 0x8D8F, 23832 - 11905: 0x8D90, 23833 - 11905: 0x8D91, 23834 - 11905: 0x8D92, 23835 - 11905: 0xE1C8, 23836 - 11905: 0x8D93, 23837 - 11905: 0x8D94, 23838 - 11905: 0xE1C6, 23839 - 11905: 0x8D95, 23840 - 11905: 0x8D96, 23841 - 11905: 0x8D97, 23842 - 11905: 0x8D98, 23843 - 11905: 0x8D99, 23844 - 11905: 0xE1C5, 23845 - 11905: 0x8D9A, 23846 - 11905: 0xE1C3, 23847 - 11905: 0xE1C2, 23848 - 11905: 0x8D9B, 23849 - 11905: 0xB1C0, 23850 - 11905: 0x8D9C, 23851 - 11905: 0x8D9D, 23852 - 11905: 0x8D9E, 23853 - 11905: 0xD5B8, 23854 - 11905: 0xE1C4, 23855 - 11905: 0x8D9F, 23856 - 11905: 0x8DA0, 23857 - 11905: 0x8DA1, 23858 - 11905: 0x8DA2, 23859 - 11905: 0x8DA3, 23860 - 11905: 0xE1CB, 23861 - 11905: 0x8DA4, 23862 - 11905: 0x8DA5, 23863 - 11905: 0x8DA6, 23864 - 11905: 0x8DA7, 23865 - 11905: 0x8DA8, 23866 - 11905: 0x8DA9, 23867 - 11905: 0x8DAA, 23868 - 11905: 0x8DAB, 23869 - 11905: 0xE1CC, 23870 - 11905: 0xE1CA, 23871 - 11905: 0x8DAC, 23872 - 11905: 0x8DAD, 23873 - 11905: 0x8DAE, 23874 - 11905: 0x8DAF, 23875 - 11905: 0x8DB0, 23876 - 11905: 0x8DB1, 23877 - 11905: 0x8DB2, 23878 - 11905: 0x8DB3, 23879 - 11905: 0xEFFA, 23880 - 11905: 0x8DB4, 23881 - 11905: 0x8DB5, 23882 - 11905: 0xE1D3, 23883 - 11905: 0xE1D2, 23884 - 11905: 0xC7B6, 23885 - 11905: 0x8DB6, 23886 - 11905: 0x8DB7, 23887 - 11905: 0x8DB8, 23888 - 11905: 0x8DB9, 23889 - 11905: 0x8DBA, 23890 - 11905: 0x8DBB, 23891 - 11905: 0x8DBC, 23892 - 11905: 0x8DBD, 23893 - 11905: 0x8DBE, 23894 - 11905: 0x8DBF, 23895 - 11905: 0x8DC0, 23896 - 11905: 0xE1C9, 23897 - 11905: 0x8DC1, 23898 - 11905: 0x8DC2, 23899 - 11905: 0xE1CE, 23900 - 11905: 0x8DC3, 23901 - 11905: 0xE1D0, 23902 - 11905: 0x8DC4, 23903 - 11905: 0x8DC5, 23904 - 11905: 0x8DC6, 23905 - 11905: 0x8DC7, 23906 - 11905: 0x8DC8, 23907 - 11905: 0x8DC9, 23908 - 11905: 0x8DCA, 23909 - 11905: 0x8DCB, 23910 - 11905: 0x8DCC, 23911 - 11905: 0x8DCD, 23912 - 11905: 0x8DCE, 23913 - 11905: 0xE1D4, 23914 - 11905: 0x8DCF, 23915 - 11905: 0xE1D1, 23916 - 11905: 0xE1CD, 23917 - 11905: 0x8DD0, 23918 - 11905: 0x8DD1, 23919 - 11905: 0xE1CF, 23920 - 11905: 0x8DD2, 23921 - 11905: 0x8DD3, 23922 - 11905: 0x8DD4, 23923 - 11905: 0x8DD5, 23924 - 11905: 0xE1D5, 23925 - 11905: 0x8DD6, 23926 - 11905: 0x8DD7, 23927 - 11905: 0x8DD8, 23928 - 11905: 0x8DD9, 23929 - 11905: 0x8DDA, 23930 - 11905: 0x8DDB, 23931 - 11905: 0x8DDC, 23932 - 11905: 0x8DDD, 23933 - 11905: 0x8DDE, 23934 - 11905: 0x8DDF, 23935 - 11905: 0x8DE0, 23936 - 11905: 0x8DE1, 23937 - 11905: 0x8DE2, 23938 - 11905: 0xE1D6, 23939 - 11905: 0x8DE3, 23940 - 11905: 0x8DE4, 23941 - 11905: 0x8DE5, 23942 - 11905: 0x8DE6, 23943 - 11905: 0x8DE7, 23944 - 11905: 0x8DE8, 23945 - 11905: 0x8DE9, 23946 - 11905: 0x8DEA, 23947 - 11905: 0x8DEB, 23948 - 11905: 0x8DEC, 23949 - 11905: 0x8DED, 23950 - 11905: 0x8DEE, 23951 - 11905: 0x8DEF, 23952 - 11905: 0x8DF0, 23953 - 11905: 0x8DF1, 23954 - 11905: 0x8DF2, 23955 - 11905: 0x8DF3, 23956 - 11905: 0x8DF4, 23957 - 11905: 0x8DF5, 23958 - 11905: 0x8DF6, 23959 - 11905: 0x8DF7, 23960 - 11905: 0x8DF8, 23961 - 11905: 0xE1D7, 23962 - 11905: 0x8DF9, 23963 - 11905: 0x8DFA, 23964 - 11905: 0x8DFB, 23965 - 11905: 0xE1D8, 23966 - 11905: 0x8DFC, 23967 - 11905: 0x8DFD, 23968 - 11905: 0x8DFE, 23969 - 11905: 0x8E40, 23970 - 11905: 0x8E41, 23971 - 11905: 0x8E42, 23972 - 11905: 0x8E43, 23973 - 11905: 0x8E44, 23974 - 11905: 0x8E45, 23975 - 11905: 0x8E46, 23976 - 11905: 0x8E47, 23977 - 11905: 0x8E48, 23978 - 11905: 0x8E49, 23979 - 11905: 0x8E4A, 23980 - 11905: 0x8E4B, 23981 - 11905: 0x8E4C, 23982 - 11905: 0x8E4D, 23983 - 11905: 0x8E4E, 23984 - 11905: 0x8E4F, 23985 - 11905: 0x8E50, 23986 - 11905: 0x8E51, 23987 - 11905: 0x8E52, 23988 - 11905: 0x8E53, 23989 - 11905: 0x8E54, 23990 - 11905: 0x8E55, 23991 - 11905: 0xE1DA, 23992 - 11905: 0x8E56, 23993 - 11905: 0x8E57, 23994 - 11905: 0x8E58, 23995 - 11905: 0x8E59, 23996 - 11905: 0x8E5A, 23997 - 11905: 0x8E5B, 23998 - 11905: 0x8E5C, 23999 - 11905: 0x8E5D, 24000 - 11905: 0x8E5E, 24001 - 11905: 0x8E5F, 24002 - 11905: 0x8E60, 24003 - 11905: 0x8E61, 24004 - 11905: 0x8E62, 24005 - 11905: 0xE1DB, 24006 - 11905: 0x8E63, 24007 - 11905: 0x8E64, 24008 - 11905: 0x8E65, 24009 - 11905: 0x8E66, 24010 - 11905: 0x8E67, 24011 - 11905: 0x8E68, 24012 - 11905: 0x8E69, 24013 - 11905: 0xCEA1, 24014 - 11905: 0x8E6A, 24015 - 11905: 0x8E6B, 24016 - 11905: 0x8E6C, 24017 - 11905: 0x8E6D, 24018 - 11905: 0x8E6E, 24019 - 11905: 0x8E6F, 24020 - 11905: 0x8E70, 24021 - 11905: 0x8E71, 24022 - 11905: 0x8E72, 24023 - 11905: 0x8E73, 24024 - 11905: 0x8E74, 24025 - 11905: 0x8E75, 24026 - 11905: 0x8E76, 24027 - 11905: 0xE7DD, 24028 - 11905: 0x8E77, 24029 - 11905: 0xB4A8, 24030 - 11905: 0xD6DD, 24031 - 11905: 0x8E78, 24032 - 11905: 0x8E79, 24033 - 11905: 0xD1B2, 24034 - 11905: 0xB3B2, 24035 - 11905: 0x8E7A, 24036 - 11905: 0x8E7B, 24037 - 11905: 0xB9A4, 24038 - 11905: 0xD7F3, 24039 - 11905: 0xC7C9, 24040 - 11905: 0xBEDE, 24041 - 11905: 0xB9AE, 24042 - 11905: 0x8E7C, 24043 - 11905: 0xCED7, 24044 - 11905: 0x8E7D, 24045 - 11905: 0x8E7E, 24046 - 11905: 0xB2EE, 24047 - 11905: 0xDBCF, 24048 - 11905: 0x8E80, 24049 - 11905: 0xBCBA, 24050 - 11905: 0xD2D1, 24051 - 11905: 0xCBC8, 24052 - 11905: 0xB0CD, 24053 - 11905: 0x8E81, 24054 - 11905: 0x8E82, 24055 - 11905: 0xCFEF, 24056 - 11905: 0x8E83, 24057 - 11905: 0x8E84, 24058 - 11905: 0x8E85, 24059 - 11905: 0x8E86, 24060 - 11905: 0x8E87, 24061 - 11905: 0xD9E3, 24062 - 11905: 0xBDED, 24063 - 11905: 0x8E88, 24064 - 11905: 0x8E89, 24065 - 11905: 0xB1D2, 24066 - 11905: 0xCAD0, 24067 - 11905: 0xB2BC, 24068 - 11905: 0x8E8A, 24069 - 11905: 0xCBA7, 24070 - 11905: 0xB7AB, 24071 - 11905: 0x8E8B, 24072 - 11905: 0xCAA6, 24073 - 11905: 0x8E8C, 24074 - 11905: 0x8E8D, 24075 - 11905: 0x8E8E, 24076 - 11905: 0xCFA3, 24077 - 11905: 0x8E8F, 24078 - 11905: 0x8E90, 24079 - 11905: 0xE0F8, 24080 - 11905: 0xD5CA, 24081 - 11905: 0xE0FB, 24082 - 11905: 0x8E91, 24083 - 11905: 0x8E92, 24084 - 11905: 0xE0FA, 24085 - 11905: 0xC5C1, 24086 - 11905: 0xCCFB, 24087 - 11905: 0x8E93, 24088 - 11905: 0xC1B1, 24089 - 11905: 0xE0F9, 24090 - 11905: 0xD6E3, 24091 - 11905: 0xB2AF, 24092 - 11905: 0xD6C4, 24093 - 11905: 0xB5DB, 24094 - 11905: 0x8E94, 24095 - 11905: 0x8E95, 24096 - 11905: 0x8E96, 24097 - 11905: 0x8E97, 24098 - 11905: 0x8E98, 24099 - 11905: 0x8E99, 24100 - 11905: 0x8E9A, 24101 - 11905: 0x8E9B, 24102 - 11905: 0xB4F8, 24103 - 11905: 0xD6A1, 24104 - 11905: 0x8E9C, 24105 - 11905: 0x8E9D, 24106 - 11905: 0x8E9E, 24107 - 11905: 0x8E9F, 24108 - 11905: 0x8EA0, 24109 - 11905: 0xCFAF, 24110 - 11905: 0xB0EF, 24111 - 11905: 0x8EA1, 24112 - 11905: 0x8EA2, 24113 - 11905: 0xE0FC, 24114 - 11905: 0x8EA3, 24115 - 11905: 0x8EA4, 24116 - 11905: 0x8EA5, 24117 - 11905: 0x8EA6, 24118 - 11905: 0x8EA7, 24119 - 11905: 0xE1A1, 24120 - 11905: 0xB3A3, 24121 - 11905: 0x8EA8, 24122 - 11905: 0x8EA9, 24123 - 11905: 0xE0FD, 24124 - 11905: 0xE0FE, 24125 - 11905: 0xC3B1, 24126 - 11905: 0x8EAA, 24127 - 11905: 0x8EAB, 24128 - 11905: 0x8EAC, 24129 - 11905: 0x8EAD, 24130 - 11905: 0xC3DD, 24131 - 11905: 0x8EAE, 24132 - 11905: 0xE1A2, 24133 - 11905: 0xB7F9, 24134 - 11905: 0x8EAF, 24135 - 11905: 0x8EB0, 24136 - 11905: 0x8EB1, 24137 - 11905: 0x8EB2, 24138 - 11905: 0x8EB3, 24139 - 11905: 0x8EB4, 24140 - 11905: 0xBBCF, 24141 - 11905: 0x8EB5, 24142 - 11905: 0x8EB6, 24143 - 11905: 0x8EB7, 24144 - 11905: 0x8EB8, 24145 - 11905: 0x8EB9, 24146 - 11905: 0x8EBA, 24147 - 11905: 0x8EBB, 24148 - 11905: 0xE1A3, 24149 - 11905: 0xC4BB, 24150 - 11905: 0x8EBC, 24151 - 11905: 0x8EBD, 24152 - 11905: 0x8EBE, 24153 - 11905: 0x8EBF, 24154 - 11905: 0x8EC0, 24155 - 11905: 0xE1A4, 24156 - 11905: 0x8EC1, 24157 - 11905: 0x8EC2, 24158 - 11905: 0xE1A5, 24159 - 11905: 0x8EC3, 24160 - 11905: 0x8EC4, 24161 - 11905: 0xE1A6, 24162 - 11905: 0xB4B1, 24163 - 11905: 0x8EC5, 24164 - 11905: 0x8EC6, 24165 - 11905: 0x8EC7, 24166 - 11905: 0x8EC8, 24167 - 11905: 0x8EC9, 24168 - 11905: 0x8ECA, 24169 - 11905: 0x8ECB, 24170 - 11905: 0x8ECC, 24171 - 11905: 0x8ECD, 24172 - 11905: 0x8ECE, 24173 - 11905: 0x8ECF, 24174 - 11905: 0x8ED0, 24175 - 11905: 0x8ED1, 24176 - 11905: 0x8ED2, 24177 - 11905: 0x8ED3, 24178 - 11905: 0xB8C9, 24179 - 11905: 0xC6BD, 24180 - 11905: 0xC4EA, 24181 - 11905: 0x8ED4, 24182 - 11905: 0xB2A2, 24183 - 11905: 0x8ED5, 24184 - 11905: 0xD0D2, 24185 - 11905: 0x8ED6, 24186 - 11905: 0xE7DB, 24187 - 11905: 0xBBC3, 24188 - 11905: 0xD3D7, 24189 - 11905: 0xD3C4, 24190 - 11905: 0x8ED7, 24191 - 11905: 0xB9E3, 24192 - 11905: 0xE2CF, 24193 - 11905: 0x8ED8, 24194 - 11905: 0x8ED9, 24195 - 11905: 0x8EDA, 24196 - 11905: 0xD7AF, 24197 - 11905: 0x8EDB, 24198 - 11905: 0xC7EC, 24199 - 11905: 0xB1D3, 24200 - 11905: 0x8EDC, 24201 - 11905: 0x8EDD, 24202 - 11905: 0xB4B2, 24203 - 11905: 0xE2D1, 24204 - 11905: 0x8EDE, 24205 - 11905: 0x8EDF, 24206 - 11905: 0x8EE0, 24207 - 11905: 0xD0F2, 24208 - 11905: 0xC2AE, 24209 - 11905: 0xE2D0, 24210 - 11905: 0x8EE1, 24211 - 11905: 0xBFE2, 24212 - 11905: 0xD3A6, 24213 - 11905: 0xB5D7, 24214 - 11905: 0xE2D2, 24215 - 11905: 0xB5EA, 24216 - 11905: 0x8EE2, 24217 - 11905: 0xC3ED, 24218 - 11905: 0xB8FD, 24219 - 11905: 0x8EE3, 24220 - 11905: 0xB8AE, 24221 - 11905: 0x8EE4, 24222 - 11905: 0xC5D3, 24223 - 11905: 0xB7CF, 24224 - 11905: 0xE2D4, 24225 - 11905: 0x8EE5, 24226 - 11905: 0x8EE6, 24227 - 11905: 0x8EE7, 24228 - 11905: 0x8EE8, 24229 - 11905: 0xE2D3, 24230 - 11905: 0xB6C8, 24231 - 11905: 0xD7F9, 24232 - 11905: 0x8EE9, 24233 - 11905: 0x8EEA, 24234 - 11905: 0x8EEB, 24235 - 11905: 0x8EEC, 24236 - 11905: 0x8EED, 24237 - 11905: 0xCDA5, 24238 - 11905: 0x8EEE, 24239 - 11905: 0x8EEF, 24240 - 11905: 0x8EF0, 24241 - 11905: 0x8EF1, 24242 - 11905: 0x8EF2, 24243 - 11905: 0xE2D8, 24244 - 11905: 0x8EF3, 24245 - 11905: 0xE2D6, 24246 - 11905: 0xCAFC, 24247 - 11905: 0xBFB5, 24248 - 11905: 0xD3B9, 24249 - 11905: 0xE2D5, 24250 - 11905: 0x8EF4, 24251 - 11905: 0x8EF5, 24252 - 11905: 0x8EF6, 24253 - 11905: 0x8EF7, 24254 - 11905: 0xE2D7, 24255 - 11905: 0x8EF8, 24256 - 11905: 0x8EF9, 24257 - 11905: 0x8EFA, 24258 - 11905: 0x8EFB, 24259 - 11905: 0x8EFC, 24260 - 11905: 0x8EFD, 24261 - 11905: 0x8EFE, 24262 - 11905: 0x8F40, 24263 - 11905: 0x8F41, 24264 - 11905: 0x8F42, 24265 - 11905: 0xC1AE, 24266 - 11905: 0xC0C8, 24267 - 11905: 0x8F43, 24268 - 11905: 0x8F44, 24269 - 11905: 0x8F45, 24270 - 11905: 0x8F46, 24271 - 11905: 0x8F47, 24272 - 11905: 0x8F48, 24273 - 11905: 0xE2DB, 24274 - 11905: 0xE2DA, 24275 - 11905: 0xC0AA, 24276 - 11905: 0x8F49, 24277 - 11905: 0x8F4A, 24278 - 11905: 0xC1CE, 24279 - 11905: 0x8F4B, 24280 - 11905: 0x8F4C, 24281 - 11905: 0x8F4D, 24282 - 11905: 0x8F4E, 24283 - 11905: 0xE2DC, 24284 - 11905: 0x8F4F, 24285 - 11905: 0x8F50, 24286 - 11905: 0x8F51, 24287 - 11905: 0x8F52, 24288 - 11905: 0x8F53, 24289 - 11905: 0x8F54, 24290 - 11905: 0x8F55, 24291 - 11905: 0x8F56, 24292 - 11905: 0x8F57, 24293 - 11905: 0x8F58, 24294 - 11905: 0x8F59, 24295 - 11905: 0x8F5A, 24296 - 11905: 0xE2DD, 24297 - 11905: 0x8F5B, 24298 - 11905: 0xE2DE, 24299 - 11905: 0x8F5C, 24300 - 11905: 0x8F5D, 24301 - 11905: 0x8F5E, 24302 - 11905: 0x8F5F, 24303 - 11905: 0x8F60, 24304 - 11905: 0x8F61, 24305 - 11905: 0x8F62, 24306 - 11905: 0x8F63, 24307 - 11905: 0x8F64, 24308 - 11905: 0xDBC8, 24309 - 11905: 0x8F65, 24310 - 11905: 0xD1D3, 24311 - 11905: 0xCDA2, 24312 - 11905: 0x8F66, 24313 - 11905: 0x8F67, 24314 - 11905: 0xBDA8, 24315 - 11905: 0x8F68, 24316 - 11905: 0x8F69, 24317 - 11905: 0x8F6A, 24318 - 11905: 0xDEC3, 24319 - 11905: 0xD8A5, 24320 - 11905: 0xBFAA, 24321 - 11905: 0xDBCD, 24322 - 11905: 0xD2EC, 24323 - 11905: 0xC6FA, 24324 - 11905: 0xC5AA, 24325 - 11905: 0x8F6B, 24326 - 11905: 0x8F6C, 24327 - 11905: 0x8F6D, 24328 - 11905: 0xDEC4, 24329 - 11905: 0x8F6E, 24330 - 11905: 0xB1D7, 24331 - 11905: 0xDFAE, 24332 - 11905: 0x8F6F, 24333 - 11905: 0x8F70, 24334 - 11905: 0x8F71, 24335 - 11905: 0xCABD, 24336 - 11905: 0x8F72, 24337 - 11905: 0xDFB1, 24338 - 11905: 0x8F73, 24339 - 11905: 0xB9AD, 24340 - 11905: 0x8F74, 24341 - 11905: 0xD2FD, 24342 - 11905: 0x8F75, 24343 - 11905: 0xB8A5, 24344 - 11905: 0xBAEB, 24345 - 11905: 0x8F76, 24346 - 11905: 0x8F77, 24347 - 11905: 0xB3DA, 24348 - 11905: 0x8F78, 24349 - 11905: 0x8F79, 24350 - 11905: 0x8F7A, 24351 - 11905: 0xB5DC, 24352 - 11905: 0xD5C5, 24353 - 11905: 0x8F7B, 24354 - 11905: 0x8F7C, 24355 - 11905: 0x8F7D, 24356 - 11905: 0x8F7E, 24357 - 11905: 0xC3D6, 24358 - 11905: 0xCFD2, 24359 - 11905: 0xBBA1, 24360 - 11905: 0x8F80, 24361 - 11905: 0xE5F3, 24362 - 11905: 0xE5F2, 24363 - 11905: 0x8F81, 24364 - 11905: 0x8F82, 24365 - 11905: 0xE5F4, 24366 - 11905: 0x8F83, 24367 - 11905: 0xCDE4, 24368 - 11905: 0x8F84, 24369 - 11905: 0xC8F5, 24370 - 11905: 0x8F85, 24371 - 11905: 0x8F86, 24372 - 11905: 0x8F87, 24373 - 11905: 0x8F88, 24374 - 11905: 0x8F89, 24375 - 11905: 0x8F8A, 24376 - 11905: 0x8F8B, 24377 - 11905: 0xB5AF, 24378 - 11905: 0xC7BF, 24379 - 11905: 0x8F8C, 24380 - 11905: 0xE5F6, 24381 - 11905: 0x8F8D, 24382 - 11905: 0x8F8E, 24383 - 11905: 0x8F8F, 24384 - 11905: 0xECB0, 24385 - 11905: 0x8F90, 24386 - 11905: 0x8F91, 24387 - 11905: 0x8F92, 24388 - 11905: 0x8F93, 24389 - 11905: 0x8F94, 24390 - 11905: 0x8F95, 24391 - 11905: 0x8F96, 24392 - 11905: 0x8F97, 24393 - 11905: 0x8F98, 24394 - 11905: 0x8F99, 24395 - 11905: 0x8F9A, 24396 - 11905: 0x8F9B, 24397 - 11905: 0x8F9C, 24398 - 11905: 0x8F9D, 24399 - 11905: 0x8F9E, 24400 - 11905: 0xE5E6, 24401 - 11905: 0x8F9F, 24402 - 11905: 0xB9E9, 24403 - 11905: 0xB5B1, 24404 - 11905: 0x8FA0, 24405 - 11905: 0xC2BC, 24406 - 11905: 0xE5E8, 24407 - 11905: 0xE5E7, 24408 - 11905: 0xE5E9, 24409 - 11905: 0x8FA1, 24410 - 11905: 0x8FA2, 24411 - 11905: 0x8FA3, 24412 - 11905: 0x8FA4, 24413 - 11905: 0xD2CD, 24414 - 11905: 0x8FA5, 24415 - 11905: 0x8FA6, 24416 - 11905: 0x8FA7, 24417 - 11905: 0xE1EA, 24418 - 11905: 0xD0CE, 24419 - 11905: 0x8FA8, 24420 - 11905: 0xCDAE, 24421 - 11905: 0x8FA9, 24422 - 11905: 0xD1E5, 24423 - 11905: 0x8FAA, 24424 - 11905: 0x8FAB, 24425 - 11905: 0xB2CA, 24426 - 11905: 0xB1EB, 24427 - 11905: 0x8FAC, 24428 - 11905: 0xB1F2, 24429 - 11905: 0xC5ED, 24430 - 11905: 0x8FAD, 24431 - 11905: 0x8FAE, 24432 - 11905: 0xD5C3, 24433 - 11905: 0xD3B0, 24434 - 11905: 0x8FAF, 24435 - 11905: 0xE1DC, 24436 - 11905: 0x8FB0, 24437 - 11905: 0x8FB1, 24438 - 11905: 0x8FB2, 24439 - 11905: 0xE1DD, 24440 - 11905: 0x8FB3, 24441 - 11905: 0xD2DB, 24442 - 11905: 0x8FB4, 24443 - 11905: 0xB3B9, 24444 - 11905: 0xB1CB, 24445 - 11905: 0x8FB5, 24446 - 11905: 0x8FB6, 24447 - 11905: 0x8FB7, 24448 - 11905: 0xCDF9, 24449 - 11905: 0xD5F7, 24450 - 11905: 0xE1DE, 24451 - 11905: 0x8FB8, 24452 - 11905: 0xBEB6, 24453 - 11905: 0xB4FD, 24454 - 11905: 0x8FB9, 24455 - 11905: 0xE1DF, 24456 - 11905: 0xBADC, 24457 - 11905: 0xE1E0, 24458 - 11905: 0xBBB2, 24459 - 11905: 0xC2C9, 24460 - 11905: 0xE1E1, 24461 - 11905: 0x8FBA, 24462 - 11905: 0x8FBB, 24463 - 11905: 0x8FBC, 24464 - 11905: 0xD0EC, 24465 - 11905: 0x8FBD, 24466 - 11905: 0xCDBD, 24467 - 11905: 0x8FBE, 24468 - 11905: 0x8FBF, 24469 - 11905: 0xE1E2, 24470 - 11905: 0x8FC0, 24471 - 11905: 0xB5C3, 24472 - 11905: 0xC5C7, 24473 - 11905: 0xE1E3, 24474 - 11905: 0x8FC1, 24475 - 11905: 0x8FC2, 24476 - 11905: 0xE1E4, 24477 - 11905: 0x8FC3, 24478 - 11905: 0x8FC4, 24479 - 11905: 0x8FC5, 24480 - 11905: 0x8FC6, 24481 - 11905: 0xD3F9, 24482 - 11905: 0x8FC7, 24483 - 11905: 0x8FC8, 24484 - 11905: 0x8FC9, 24485 - 11905: 0x8FCA, 24486 - 11905: 0x8FCB, 24487 - 11905: 0x8FCC, 24488 - 11905: 0xE1E5, 24489 - 11905: 0x8FCD, 24490 - 11905: 0xD1AD, 24491 - 11905: 0x8FCE, 24492 - 11905: 0x8FCF, 24493 - 11905: 0xE1E6, 24494 - 11905: 0xCEA2, 24495 - 11905: 0x8FD0, 24496 - 11905: 0x8FD1, 24497 - 11905: 0x8FD2, 24498 - 11905: 0x8FD3, 24499 - 11905: 0x8FD4, 24500 - 11905: 0x8FD5, 24501 - 11905: 0xE1E7, 24502 - 11905: 0x8FD6, 24503 - 11905: 0xB5C2, 24504 - 11905: 0x8FD7, 24505 - 11905: 0x8FD8, 24506 - 11905: 0x8FD9, 24507 - 11905: 0x8FDA, 24508 - 11905: 0xE1E8, 24509 - 11905: 0xBBD5, 24510 - 11905: 0x8FDB, 24511 - 11905: 0x8FDC, 24512 - 11905: 0x8FDD, 24513 - 11905: 0x8FDE, 24514 - 11905: 0x8FDF, 24515 - 11905: 0xD0C4, 24516 - 11905: 0xE2E0, 24517 - 11905: 0xB1D8, 24518 - 11905: 0xD2E4, 24519 - 11905: 0x8FE0, 24520 - 11905: 0x8FE1, 24521 - 11905: 0xE2E1, 24522 - 11905: 0x8FE2, 24523 - 11905: 0x8FE3, 24524 - 11905: 0xBCC9, 24525 - 11905: 0xC8CC, 24526 - 11905: 0x8FE4, 24527 - 11905: 0xE2E3, 24528 - 11905: 0xECFE, 24529 - 11905: 0xECFD, 24530 - 11905: 0xDFAF, 24531 - 11905: 0x8FE5, 24532 - 11905: 0x8FE6, 24533 - 11905: 0x8FE7, 24534 - 11905: 0xE2E2, 24535 - 11905: 0xD6BE, 24536 - 11905: 0xCDFC, 24537 - 11905: 0xC3A6, 24538 - 11905: 0x8FE8, 24539 - 11905: 0x8FE9, 24540 - 11905: 0x8FEA, 24541 - 11905: 0xE3C3, 24542 - 11905: 0x8FEB, 24543 - 11905: 0x8FEC, 24544 - 11905: 0xD6D2, 24545 - 11905: 0xE2E7, 24546 - 11905: 0x8FED, 24547 - 11905: 0x8FEE, 24548 - 11905: 0xE2E8, 24549 - 11905: 0x8FEF, 24550 - 11905: 0x8FF0, 24551 - 11905: 0xD3C7, 24552 - 11905: 0x8FF1, 24553 - 11905: 0x8FF2, 24554 - 11905: 0xE2EC, 24555 - 11905: 0xBFEC, 24556 - 11905: 0x8FF3, 24557 - 11905: 0xE2ED, 24558 - 11905: 0xE2E5, 24559 - 11905: 0x8FF4, 24560 - 11905: 0x8FF5, 24561 - 11905: 0xB3C0, 24562 - 11905: 0x8FF6, 24563 - 11905: 0x8FF7, 24564 - 11905: 0x8FF8, 24565 - 11905: 0xC4EE, 24566 - 11905: 0x8FF9, 24567 - 11905: 0x8FFA, 24568 - 11905: 0xE2EE, 24569 - 11905: 0x8FFB, 24570 - 11905: 0x8FFC, 24571 - 11905: 0xD0C3, 24572 - 11905: 0x8FFD, 24573 - 11905: 0xBAF6, 24574 - 11905: 0xE2E9, 24575 - 11905: 0xB7DE, 24576 - 11905: 0xBBB3, 24577 - 11905: 0xCCAC, 24578 - 11905: 0xCBCB, 24579 - 11905: 0xE2E4, 24580 - 11905: 0xE2E6, 24581 - 11905: 0xE2EA, 24582 - 11905: 0xE2EB, 24583 - 11905: 0x8FFE, 24584 - 11905: 0x9040, 24585 - 11905: 0x9041, 24586 - 11905: 0xE2F7, 24587 - 11905: 0x9042, 24588 - 11905: 0x9043, 24589 - 11905: 0xE2F4, 24590 - 11905: 0xD4F5, 24591 - 11905: 0xE2F3, 24592 - 11905: 0x9044, 24593 - 11905: 0x9045, 24594 - 11905: 0xC5AD, 24595 - 11905: 0x9046, 24596 - 11905: 0xD5FA, 24597 - 11905: 0xC5C2, 24598 - 11905: 0xB2C0, 24599 - 11905: 0x9047, 24600 - 11905: 0x9048, 24601 - 11905: 0xE2EF, 24602 - 11905: 0x9049, 24603 - 11905: 0xE2F2, 24604 - 11905: 0xC1AF, 24605 - 11905: 0xCBBC, 24606 - 11905: 0x904A, 24607 - 11905: 0x904B, 24608 - 11905: 0xB5A1, 24609 - 11905: 0xE2F9, 24610 - 11905: 0x904C, 24611 - 11905: 0x904D, 24612 - 11905: 0x904E, 24613 - 11905: 0xBCB1, 24614 - 11905: 0xE2F1, 24615 - 11905: 0xD0D4, 24616 - 11905: 0xD4B9, 24617 - 11905: 0xE2F5, 24618 - 11905: 0xB9D6, 24619 - 11905: 0xE2F6, 24620 - 11905: 0x904F, 24621 - 11905: 0x9050, 24622 - 11905: 0x9051, 24623 - 11905: 0xC7D3, 24624 - 11905: 0x9052, 24625 - 11905: 0x9053, 24626 - 11905: 0x9054, 24627 - 11905: 0x9055, 24628 - 11905: 0x9056, 24629 - 11905: 0xE2F0, 24630 - 11905: 0x9057, 24631 - 11905: 0x9058, 24632 - 11905: 0x9059, 24633 - 11905: 0x905A, 24634 - 11905: 0x905B, 24635 - 11905: 0xD7DC, 24636 - 11905: 0xEDA1, 24637 - 11905: 0x905C, 24638 - 11905: 0x905D, 24639 - 11905: 0xE2F8, 24640 - 11905: 0x905E, 24641 - 11905: 0xEDA5, 24642 - 11905: 0xE2FE, 24643 - 11905: 0xCAD1, 24644 - 11905: 0x905F, 24645 - 11905: 0x9060, 24646 - 11905: 0x9061, 24647 - 11905: 0x9062, 24648 - 11905: 0x9063, 24649 - 11905: 0x9064, 24650 - 11905: 0x9065, 24651 - 11905: 0xC1B5, 24652 - 11905: 0x9066, 24653 - 11905: 0xBBD0, 24654 - 11905: 0x9067, 24655 - 11905: 0x9068, 24656 - 11905: 0xBFD6, 24657 - 11905: 0x9069, 24658 - 11905: 0xBAE3, 24659 - 11905: 0x906A, 24660 - 11905: 0x906B, 24661 - 11905: 0xCBA1, 24662 - 11905: 0x906C, 24663 - 11905: 0x906D, 24664 - 11905: 0x906E, 24665 - 11905: 0xEDA6, 24666 - 11905: 0xEDA3, 24667 - 11905: 0x906F, 24668 - 11905: 0x9070, 24669 - 11905: 0xEDA2, 24670 - 11905: 0x9071, 24671 - 11905: 0x9072, 24672 - 11905: 0x9073, 24673 - 11905: 0x9074, 24674 - 11905: 0xBBD6, 24675 - 11905: 0xEDA7, 24676 - 11905: 0xD0F4, 24677 - 11905: 0x9075, 24678 - 11905: 0x9076, 24679 - 11905: 0xEDA4, 24680 - 11905: 0xBADE, 24681 - 11905: 0xB6F7, 24682 - 11905: 0xE3A1, 24683 - 11905: 0xB6B2, 24684 - 11905: 0xCCF1, 24685 - 11905: 0xB9A7, 24686 - 11905: 0x9077, 24687 - 11905: 0xCFA2, 24688 - 11905: 0xC7A1, 24689 - 11905: 0x9078, 24690 - 11905: 0x9079, 24691 - 11905: 0xBFD2, 24692 - 11905: 0x907A, 24693 - 11905: 0x907B, 24694 - 11905: 0xB6F1, 24695 - 11905: 0x907C, 24696 - 11905: 0xE2FA, 24697 - 11905: 0xE2FB, 24698 - 11905: 0xE2FD, 24699 - 11905: 0xE2FC, 24700 - 11905: 0xC4D5, 24701 - 11905: 0xE3A2, 24702 - 11905: 0x907D, 24703 - 11905: 0xD3C1, 24704 - 11905: 0x907E, 24705 - 11905: 0x9080, 24706 - 11905: 0x9081, 24707 - 11905: 0xE3A7, 24708 - 11905: 0xC7C4, 24709 - 11905: 0x9082, 24710 - 11905: 0x9083, 24711 - 11905: 0x9084, 24712 - 11905: 0x9085, 24713 - 11905: 0xCFA4, 24714 - 11905: 0x9086, 24715 - 11905: 0x9087, 24716 - 11905: 0xE3A9, 24717 - 11905: 0xBAB7, 24718 - 11905: 0x9088, 24719 - 11905: 0x9089, 24720 - 11905: 0x908A, 24721 - 11905: 0x908B, 24722 - 11905: 0xE3A8, 24723 - 11905: 0x908C, 24724 - 11905: 0xBBDA, 24725 - 11905: 0x908D, 24726 - 11905: 0xE3A3, 24727 - 11905: 0x908E, 24728 - 11905: 0x908F, 24729 - 11905: 0x9090, 24730 - 11905: 0xE3A4, 24731 - 11905: 0xE3AA, 24732 - 11905: 0x9091, 24733 - 11905: 0xE3A6, 24734 - 11905: 0x9092, 24735 - 11905: 0xCEF2, 24736 - 11905: 0xD3C6, 24737 - 11905: 0x9093, 24738 - 11905: 0x9094, 24739 - 11905: 0xBBBC, 24740 - 11905: 0x9095, 24741 - 11905: 0x9096, 24742 - 11905: 0xD4C3, 24743 - 11905: 0x9097, 24744 - 11905: 0xC4FA, 24745 - 11905: 0x9098, 24746 - 11905: 0x9099, 24747 - 11905: 0xEDA8, 24748 - 11905: 0xD0FC, 24749 - 11905: 0xE3A5, 24750 - 11905: 0x909A, 24751 - 11905: 0xC3F5, 24752 - 11905: 0x909B, 24753 - 11905: 0xE3AD, 24754 - 11905: 0xB1AF, 24755 - 11905: 0x909C, 24756 - 11905: 0xE3B2, 24757 - 11905: 0x909D, 24758 - 11905: 0x909E, 24759 - 11905: 0x909F, 24760 - 11905: 0xBCC2, 24761 - 11905: 0x90A0, 24762 - 11905: 0x90A1, 24763 - 11905: 0xE3AC, 24764 - 11905: 0xB5BF, 24765 - 11905: 0x90A2, 24766 - 11905: 0x90A3, 24767 - 11905: 0x90A4, 24768 - 11905: 0x90A5, 24769 - 11905: 0x90A6, 24770 - 11905: 0x90A7, 24771 - 11905: 0x90A8, 24772 - 11905: 0x90A9, 24773 - 11905: 0xC7E9, 24774 - 11905: 0xE3B0, 24775 - 11905: 0x90AA, 24776 - 11905: 0x90AB, 24777 - 11905: 0x90AC, 24778 - 11905: 0xBEAA, 24779 - 11905: 0xCDEF, 24780 - 11905: 0x90AD, 24781 - 11905: 0x90AE, 24782 - 11905: 0x90AF, 24783 - 11905: 0x90B0, 24784 - 11905: 0x90B1, 24785 - 11905: 0xBBF3, 24786 - 11905: 0x90B2, 24787 - 11905: 0x90B3, 24788 - 11905: 0x90B4, 24789 - 11905: 0xCCE8, 24790 - 11905: 0x90B5, 24791 - 11905: 0x90B6, 24792 - 11905: 0xE3AF, 24793 - 11905: 0x90B7, 24794 - 11905: 0xE3B1, 24795 - 11905: 0x90B8, 24796 - 11905: 0xCFA7, 24797 - 11905: 0xE3AE, 24798 - 11905: 0x90B9, 24799 - 11905: 0xCEA9, 24800 - 11905: 0xBBDD, 24801 - 11905: 0x90BA, 24802 - 11905: 0x90BB, 24803 - 11905: 0x90BC, 24804 - 11905: 0x90BD, 24805 - 11905: 0x90BE, 24806 - 11905: 0xB5EB, 24807 - 11905: 0xBEE5, 24808 - 11905: 0xB2D2, 24809 - 11905: 0xB3CD, 24810 - 11905: 0x90BF, 24811 - 11905: 0xB1B9, 24812 - 11905: 0xE3AB, 24813 - 11905: 0xB2D1, 24814 - 11905: 0xB5AC, 24815 - 11905: 0xB9DF, 24816 - 11905: 0xB6E8, 24817 - 11905: 0x90C0, 24818 - 11905: 0x90C1, 24819 - 11905: 0xCFEB, 24820 - 11905: 0xE3B7, 24821 - 11905: 0x90C2, 24822 - 11905: 0xBBCC, 24823 - 11905: 0x90C3, 24824 - 11905: 0x90C4, 24825 - 11905: 0xC8C7, 24826 - 11905: 0xD0CA, 24827 - 11905: 0x90C5, 24828 - 11905: 0x90C6, 24829 - 11905: 0x90C7, 24830 - 11905: 0x90C8, 24831 - 11905: 0x90C9, 24832 - 11905: 0xE3B8, 24833 - 11905: 0xB3EE, 24834 - 11905: 0x90CA, 24835 - 11905: 0x90CB, 24836 - 11905: 0x90CC, 24837 - 11905: 0x90CD, 24838 - 11905: 0xEDA9, 24839 - 11905: 0x90CE, 24840 - 11905: 0xD3FA, 24841 - 11905: 0xD3E4, 24842 - 11905: 0x90CF, 24843 - 11905: 0x90D0, 24844 - 11905: 0x90D1, 24845 - 11905: 0xEDAA, 24846 - 11905: 0xE3B9, 24847 - 11905: 0xD2E2, 24848 - 11905: 0x90D2, 24849 - 11905: 0x90D3, 24850 - 11905: 0x90D4, 24851 - 11905: 0x90D5, 24852 - 11905: 0x90D6, 24853 - 11905: 0xE3B5, 24854 - 11905: 0x90D7, 24855 - 11905: 0x90D8, 24856 - 11905: 0x90D9, 24857 - 11905: 0x90DA, 24858 - 11905: 0xD3DE, 24859 - 11905: 0x90DB, 24860 - 11905: 0x90DC, 24861 - 11905: 0x90DD, 24862 - 11905: 0x90DE, 24863 - 11905: 0xB8D0, 24864 - 11905: 0xE3B3, 24865 - 11905: 0x90DF, 24866 - 11905: 0x90E0, 24867 - 11905: 0xE3B6, 24868 - 11905: 0xB7DF, 24869 - 11905: 0x90E1, 24870 - 11905: 0xE3B4, 24871 - 11905: 0xC0A2, 24872 - 11905: 0x90E2, 24873 - 11905: 0x90E3, 24874 - 11905: 0x90E4, 24875 - 11905: 0xE3BA, 24876 - 11905: 0x90E5, 24877 - 11905: 0x90E6, 24878 - 11905: 0x90E7, 24879 - 11905: 0x90E8, 24880 - 11905: 0x90E9, 24881 - 11905: 0x90EA, 24882 - 11905: 0x90EB, 24883 - 11905: 0x90EC, 24884 - 11905: 0x90ED, 24885 - 11905: 0x90EE, 24886 - 11905: 0x90EF, 24887 - 11905: 0x90F0, 24888 - 11905: 0x90F1, 24889 - 11905: 0x90F2, 24890 - 11905: 0x90F3, 24891 - 11905: 0x90F4, 24892 - 11905: 0x90F5, 24893 - 11905: 0x90F6, 24894 - 11905: 0x90F7, 24895 - 11905: 0xD4B8, 24896 - 11905: 0x90F8, 24897 - 11905: 0x90F9, 24898 - 11905: 0x90FA, 24899 - 11905: 0x90FB, 24900 - 11905: 0x90FC, 24901 - 11905: 0x90FD, 24902 - 11905: 0x90FE, 24903 - 11905: 0x9140, 24904 - 11905: 0xB4C8, 24905 - 11905: 0x9141, 24906 - 11905: 0xE3BB, 24907 - 11905: 0x9142, 24908 - 11905: 0xBBC5, 24909 - 11905: 0x9143, 24910 - 11905: 0xC9F7, 24911 - 11905: 0x9144, 24912 - 11905: 0x9145, 24913 - 11905: 0xC9E5, 24914 - 11905: 0x9146, 24915 - 11905: 0x9147, 24916 - 11905: 0x9148, 24917 - 11905: 0xC4BD, 24918 - 11905: 0x9149, 24919 - 11905: 0x914A, 24920 - 11905: 0x914B, 24921 - 11905: 0x914C, 24922 - 11905: 0x914D, 24923 - 11905: 0x914E, 24924 - 11905: 0x914F, 24925 - 11905: 0xEDAB, 24926 - 11905: 0x9150, 24927 - 11905: 0x9151, 24928 - 11905: 0x9152, 24929 - 11905: 0x9153, 24930 - 11905: 0xC2FD, 24931 - 11905: 0x9154, 24932 - 11905: 0x9155, 24933 - 11905: 0x9156, 24934 - 11905: 0x9157, 24935 - 11905: 0xBBDB, 24936 - 11905: 0xBFAE, 24937 - 11905: 0x9158, 24938 - 11905: 0x9159, 24939 - 11905: 0x915A, 24940 - 11905: 0x915B, 24941 - 11905: 0x915C, 24942 - 11905: 0x915D, 24943 - 11905: 0x915E, 24944 - 11905: 0xCEBF, 24945 - 11905: 0x915F, 24946 - 11905: 0x9160, 24947 - 11905: 0x9161, 24948 - 11905: 0x9162, 24949 - 11905: 0xE3BC, 24950 - 11905: 0x9163, 24951 - 11905: 0xBFB6, 24952 - 11905: 0x9164, 24953 - 11905: 0x9165, 24954 - 11905: 0x9166, 24955 - 11905: 0x9167, 24956 - 11905: 0x9168, 24957 - 11905: 0x9169, 24958 - 11905: 0x916A, 24959 - 11905: 0x916B, 24960 - 11905: 0x916C, 24961 - 11905: 0x916D, 24962 - 11905: 0x916E, 24963 - 11905: 0x916F, 24964 - 11905: 0x9170, 24965 - 11905: 0x9171, 24966 - 11905: 0x9172, 24967 - 11905: 0x9173, 24968 - 11905: 0x9174, 24969 - 11905: 0x9175, 24970 - 11905: 0x9176, 24971 - 11905: 0xB1EF, 24972 - 11905: 0x9177, 24973 - 11905: 0x9178, 24974 - 11905: 0xD4F7, 24975 - 11905: 0x9179, 24976 - 11905: 0x917A, 24977 - 11905: 0x917B, 24978 - 11905: 0x917C, 24979 - 11905: 0x917D, 24980 - 11905: 0xE3BE, 24981 - 11905: 0x917E, 24982 - 11905: 0x9180, 24983 - 11905: 0x9181, 24984 - 11905: 0x9182, 24985 - 11905: 0x9183, 24986 - 11905: 0x9184, 24987 - 11905: 0x9185, 24988 - 11905: 0x9186, 24989 - 11905: 0xEDAD, 24990 - 11905: 0x9187, 24991 - 11905: 0x9188, 24992 - 11905: 0x9189, 24993 - 11905: 0x918A, 24994 - 11905: 0x918B, 24995 - 11905: 0x918C, 24996 - 11905: 0x918D, 24997 - 11905: 0x918E, 24998 - 11905: 0x918F, 24999 - 11905: 0xE3BF, 25000 - 11905: 0xBAA9, 25001 - 11905: 0xEDAC, 25002 - 11905: 0x9190, 25003 - 11905: 0x9191, 25004 - 11905: 0xE3BD, 25005 - 11905: 0x9192, 25006 - 11905: 0x9193, 25007 - 11905: 0x9194, 25008 - 11905: 0x9195, 25009 - 11905: 0x9196, 25010 - 11905: 0x9197, 25011 - 11905: 0x9198, 25012 - 11905: 0x9199, 25013 - 11905: 0x919A, 25014 - 11905: 0x919B, 25015 - 11905: 0xE3C0, 25016 - 11905: 0x919C, 25017 - 11905: 0x919D, 25018 - 11905: 0x919E, 25019 - 11905: 0x919F, 25020 - 11905: 0x91A0, 25021 - 11905: 0x91A1, 25022 - 11905: 0xBAB6, 25023 - 11905: 0x91A2, 25024 - 11905: 0x91A3, 25025 - 11905: 0x91A4, 25026 - 11905: 0xB6AE, 25027 - 11905: 0x91A5, 25028 - 11905: 0x91A6, 25029 - 11905: 0x91A7, 25030 - 11905: 0x91A8, 25031 - 11905: 0x91A9, 25032 - 11905: 0xD0B8, 25033 - 11905: 0x91AA, 25034 - 11905: 0xB0C3, 25035 - 11905: 0xEDAE, 25036 - 11905: 0x91AB, 25037 - 11905: 0x91AC, 25038 - 11905: 0x91AD, 25039 - 11905: 0x91AE, 25040 - 11905: 0x91AF, 25041 - 11905: 0xEDAF, 25042 - 11905: 0xC0C1, 25043 - 11905: 0x91B0, 25044 - 11905: 0xE3C1, 25045 - 11905: 0x91B1, 25046 - 11905: 0x91B2, 25047 - 11905: 0x91B3, 25048 - 11905: 0x91B4, 25049 - 11905: 0x91B5, 25050 - 11905: 0x91B6, 25051 - 11905: 0x91B7, 25052 - 11905: 0x91B8, 25053 - 11905: 0x91B9, 25054 - 11905: 0x91BA, 25055 - 11905: 0x91BB, 25056 - 11905: 0x91BC, 25057 - 11905: 0x91BD, 25058 - 11905: 0x91BE, 25059 - 11905: 0x91BF, 25060 - 11905: 0x91C0, 25061 - 11905: 0x91C1, 25062 - 11905: 0xC5B3, 25063 - 11905: 0x91C2, 25064 - 11905: 0x91C3, 25065 - 11905: 0x91C4, 25066 - 11905: 0x91C5, 25067 - 11905: 0x91C6, 25068 - 11905: 0x91C7, 25069 - 11905: 0x91C8, 25070 - 11905: 0x91C9, 25071 - 11905: 0x91CA, 25072 - 11905: 0x91CB, 25073 - 11905: 0x91CC, 25074 - 11905: 0x91CD, 25075 - 11905: 0x91CE, 25076 - 11905: 0x91CF, 25077 - 11905: 0xE3C2, 25078 - 11905: 0x91D0, 25079 - 11905: 0x91D1, 25080 - 11905: 0x91D2, 25081 - 11905: 0x91D3, 25082 - 11905: 0x91D4, 25083 - 11905: 0x91D5, 25084 - 11905: 0x91D6, 25085 - 11905: 0x91D7, 25086 - 11905: 0x91D8, 25087 - 11905: 0xDCB2, 25088 - 11905: 0x91D9, 25089 - 11905: 0x91DA, 25090 - 11905: 0x91DB, 25091 - 11905: 0x91DC, 25092 - 11905: 0x91DD, 25093 - 11905: 0x91DE, 25094 - 11905: 0xEDB0, 25095 - 11905: 0x91DF, 25096 - 11905: 0xB8EA, 25097 - 11905: 0x91E0, 25098 - 11905: 0xCEEC, 25099 - 11905: 0xEAA7, 25100 - 11905: 0xD0E7, 25101 - 11905: 0xCAF9, 25102 - 11905: 0xC8D6, 25103 - 11905: 0xCFB7, 25104 - 11905: 0xB3C9, 25105 - 11905: 0xCED2, 25106 - 11905: 0xBDE4, 25107 - 11905: 0x91E1, 25108 - 11905: 0x91E2, 25109 - 11905: 0xE3DE, 25110 - 11905: 0xBBF2, 25111 - 11905: 0xEAA8, 25112 - 11905: 0xD5BD, 25113 - 11905: 0x91E3, 25114 - 11905: 0xC6DD, 25115 - 11905: 0xEAA9, 25116 - 11905: 0x91E4, 25117 - 11905: 0x91E5, 25118 - 11905: 0x91E6, 25119 - 11905: 0xEAAA, 25120 - 11905: 0x91E7, 25121 - 11905: 0xEAAC, 25122 - 11905: 0xEAAB, 25123 - 11905: 0x91E8, 25124 - 11905: 0xEAAE, 25125 - 11905: 0xEAAD, 25126 - 11905: 0x91E9, 25127 - 11905: 0x91EA, 25128 - 11905: 0x91EB, 25129 - 11905: 0x91EC, 25130 - 11905: 0xBDD8, 25131 - 11905: 0x91ED, 25132 - 11905: 0xEAAF, 25133 - 11905: 0x91EE, 25134 - 11905: 0xC2BE, 25135 - 11905: 0x91EF, 25136 - 11905: 0x91F0, 25137 - 11905: 0x91F1, 25138 - 11905: 0x91F2, 25139 - 11905: 0xB4C1, 25140 - 11905: 0xB4F7, 25141 - 11905: 0x91F3, 25142 - 11905: 0x91F4, 25143 - 11905: 0xBBA7, 25144 - 11905: 0x91F5, 25145 - 11905: 0x91F6, 25146 - 11905: 0x91F7, 25147 - 11905: 0x91F8, 25148 - 11905: 0x91F9, 25149 - 11905: 0xECE6, 25150 - 11905: 0xECE5, 25151 - 11905: 0xB7BF, 25152 - 11905: 0xCBF9, 25153 - 11905: 0xB1E2, 25154 - 11905: 0x91FA, 25155 - 11905: 0xECE7, 25156 - 11905: 0x91FB, 25157 - 11905: 0x91FC, 25158 - 11905: 0x91FD, 25159 - 11905: 0xC9C8, 25160 - 11905: 0xECE8, 25161 - 11905: 0xECE9, 25162 - 11905: 0x91FE, 25163 - 11905: 0xCAD6, 25164 - 11905: 0xDED0, 25165 - 11905: 0xB2C5, 25166 - 11905: 0xD4FA, 25167 - 11905: 0x9240, 25168 - 11905: 0x9241, 25169 - 11905: 0xC6CB, 25170 - 11905: 0xB0C7, 25171 - 11905: 0xB4F2, 25172 - 11905: 0xC8D3, 25173 - 11905: 0x9242, 25174 - 11905: 0x9243, 25175 - 11905: 0x9244, 25176 - 11905: 0xCDD0, 25177 - 11905: 0x9245, 25178 - 11905: 0x9246, 25179 - 11905: 0xBFB8, 25180 - 11905: 0x9247, 25181 - 11905: 0x9248, 25182 - 11905: 0x9249, 25183 - 11905: 0x924A, 25184 - 11905: 0x924B, 25185 - 11905: 0x924C, 25186 - 11905: 0x924D, 25187 - 11905: 0xBFDB, 25188 - 11905: 0x924E, 25189 - 11905: 0x924F, 25190 - 11905: 0xC7A4, 25191 - 11905: 0xD6B4, 25192 - 11905: 0x9250, 25193 - 11905: 0xC0A9, 25194 - 11905: 0xDED1, 25195 - 11905: 0xC9A8, 25196 - 11905: 0xD1EF, 25197 - 11905: 0xC5A4, 25198 - 11905: 0xB0E7, 25199 - 11905: 0xB3B6, 25200 - 11905: 0xC8C5, 25201 - 11905: 0x9251, 25202 - 11905: 0x9252, 25203 - 11905: 0xB0E2, 25204 - 11905: 0x9253, 25205 - 11905: 0x9254, 25206 - 11905: 0xB7F6, 25207 - 11905: 0x9255, 25208 - 11905: 0x9256, 25209 - 11905: 0xC5FA, 25210 - 11905: 0x9257, 25211 - 11905: 0x9258, 25212 - 11905: 0xB6F3, 25213 - 11905: 0x9259, 25214 - 11905: 0xD5D2, 25215 - 11905: 0xB3D0, 25216 - 11905: 0xBCBC, 25217 - 11905: 0x925A, 25218 - 11905: 0x925B, 25219 - 11905: 0x925C, 25220 - 11905: 0xB3AD, 25221 - 11905: 0x925D, 25222 - 11905: 0x925E, 25223 - 11905: 0x925F, 25224 - 11905: 0x9260, 25225 - 11905: 0xBEF1, 25226 - 11905: 0xB0D1, 25227 - 11905: 0x9261, 25228 - 11905: 0x9262, 25229 - 11905: 0x9263, 25230 - 11905: 0x9264, 25231 - 11905: 0x9265, 25232 - 11905: 0x9266, 25233 - 11905: 0xD2D6, 25234 - 11905: 0xCAE3, 25235 - 11905: 0xD7A5, 25236 - 11905: 0x9267, 25237 - 11905: 0xCDB6, 25238 - 11905: 0xB6B6, 25239 - 11905: 0xBFB9, 25240 - 11905: 0xD5DB, 25241 - 11905: 0x9268, 25242 - 11905: 0xB8A7, 25243 - 11905: 0xC5D7, 25244 - 11905: 0x9269, 25245 - 11905: 0x926A, 25246 - 11905: 0x926B, 25247 - 11905: 0xDED2, 25248 - 11905: 0xBFD9, 25249 - 11905: 0xC2D5, 25250 - 11905: 0xC7C0, 25251 - 11905: 0x926C, 25252 - 11905: 0xBBA4, 25253 - 11905: 0xB1A8, 25254 - 11905: 0x926D, 25255 - 11905: 0x926E, 25256 - 11905: 0xC5EA, 25257 - 11905: 0x926F, 25258 - 11905: 0x9270, 25259 - 11905: 0xC5FB, 25260 - 11905: 0xCCA7, 25261 - 11905: 0x9271, 25262 - 11905: 0x9272, 25263 - 11905: 0x9273, 25264 - 11905: 0x9274, 25265 - 11905: 0xB1A7, 25266 - 11905: 0x9275, 25267 - 11905: 0x9276, 25268 - 11905: 0x9277, 25269 - 11905: 0xB5D6, 25270 - 11905: 0x9278, 25271 - 11905: 0x9279, 25272 - 11905: 0x927A, 25273 - 11905: 0xC4A8, 25274 - 11905: 0x927B, 25275 - 11905: 0xDED3, 25276 - 11905: 0xD1BA, 25277 - 11905: 0xB3E9, 25278 - 11905: 0x927C, 25279 - 11905: 0xC3F2, 25280 - 11905: 0x927D, 25281 - 11905: 0x927E, 25282 - 11905: 0xB7F7, 25283 - 11905: 0x9280, 25284 - 11905: 0xD6F4, 25285 - 11905: 0xB5A3, 25286 - 11905: 0xB2F0, 25287 - 11905: 0xC4B4, 25288 - 11905: 0xC4E9, 25289 - 11905: 0xC0AD, 25290 - 11905: 0xDED4, 25291 - 11905: 0x9281, 25292 - 11905: 0xB0E8, 25293 - 11905: 0xC5C4, 25294 - 11905: 0xC1E0, 25295 - 11905: 0x9282, 25296 - 11905: 0xB9D5, 25297 - 11905: 0x9283, 25298 - 11905: 0xBEDC, 25299 - 11905: 0xCDD8, 25300 - 11905: 0xB0CE, 25301 - 11905: 0x9284, 25302 - 11905: 0xCDCF, 25303 - 11905: 0xDED6, 25304 - 11905: 0xBED0, 25305 - 11905: 0xD7BE, 25306 - 11905: 0xDED5, 25307 - 11905: 0xD5D0, 25308 - 11905: 0xB0DD, 25309 - 11905: 0x9285, 25310 - 11905: 0x9286, 25311 - 11905: 0xC4E2, 25312 - 11905: 0x9287, 25313 - 11905: 0x9288, 25314 - 11905: 0xC2A3, 25315 - 11905: 0xBCF0, 25316 - 11905: 0x9289, 25317 - 11905: 0xD3B5, 25318 - 11905: 0xC0B9, 25319 - 11905: 0xC5A1, 25320 - 11905: 0xB2A6, 25321 - 11905: 0xD4F1, 25322 - 11905: 0x928A, 25323 - 11905: 0x928B, 25324 - 11905: 0xC0A8, 25325 - 11905: 0xCAC3, 25326 - 11905: 0xDED7, 25327 - 11905: 0xD5FC, 25328 - 11905: 0x928C, 25329 - 11905: 0xB9B0, 25330 - 11905: 0x928D, 25331 - 11905: 0xC8AD, 25332 - 11905: 0xCBA9, 25333 - 11905: 0x928E, 25334 - 11905: 0xDED9, 25335 - 11905: 0xBFBD, 25336 - 11905: 0x928F, 25337 - 11905: 0x9290, 25338 - 11905: 0x9291, 25339 - 11905: 0x9292, 25340 - 11905: 0xC6B4, 25341 - 11905: 0xD7A7, 25342 - 11905: 0xCAB0, 25343 - 11905: 0xC4C3, 25344 - 11905: 0x9293, 25345 - 11905: 0xB3D6, 25346 - 11905: 0xB9D2, 25347 - 11905: 0x9294, 25348 - 11905: 0x9295, 25349 - 11905: 0x9296, 25350 - 11905: 0x9297, 25351 - 11905: 0xD6B8, 25352 - 11905: 0xEAFC, 25353 - 11905: 0xB0B4, 25354 - 11905: 0x9298, 25355 - 11905: 0x9299, 25356 - 11905: 0x929A, 25357 - 11905: 0x929B, 25358 - 11905: 0xBFE6, 25359 - 11905: 0x929C, 25360 - 11905: 0x929D, 25361 - 11905: 0xCCF4, 25362 - 11905: 0x929E, 25363 - 11905: 0x929F, 25364 - 11905: 0x92A0, 25365 - 11905: 0x92A1, 25366 - 11905: 0xCDDA, 25367 - 11905: 0x92A2, 25368 - 11905: 0x92A3, 25369 - 11905: 0x92A4, 25370 - 11905: 0xD6BF, 25371 - 11905: 0xC2CE, 25372 - 11905: 0x92A5, 25373 - 11905: 0xCECE, 25374 - 11905: 0xCCA2, 25375 - 11905: 0xD0AE, 25376 - 11905: 0xC4D3, 25377 - 11905: 0xB5B2, 25378 - 11905: 0xDED8, 25379 - 11905: 0xD5F5, 25380 - 11905: 0xBCB7, 25381 - 11905: 0xBBD3, 25382 - 11905: 0x92A6, 25383 - 11905: 0x92A7, 25384 - 11905: 0xB0A4, 25385 - 11905: 0x92A8, 25386 - 11905: 0xC5B2, 25387 - 11905: 0xB4EC, 25388 - 11905: 0x92A9, 25389 - 11905: 0x92AA, 25390 - 11905: 0x92AB, 25391 - 11905: 0xD5F1, 25392 - 11905: 0x92AC, 25393 - 11905: 0x92AD, 25394 - 11905: 0xEAFD, 25395 - 11905: 0x92AE, 25396 - 11905: 0x92AF, 25397 - 11905: 0x92B0, 25398 - 11905: 0x92B1, 25399 - 11905: 0x92B2, 25400 - 11905: 0x92B3, 25401 - 11905: 0xDEDA, 25402 - 11905: 0xCDA6, 25403 - 11905: 0x92B4, 25404 - 11905: 0x92B5, 25405 - 11905: 0xCDEC, 25406 - 11905: 0x92B6, 25407 - 11905: 0x92B7, 25408 - 11905: 0x92B8, 25409 - 11905: 0x92B9, 25410 - 11905: 0xCEE6, 25411 - 11905: 0xDEDC, 25412 - 11905: 0x92BA, 25413 - 11905: 0xCDB1, 25414 - 11905: 0xC0A6, 25415 - 11905: 0x92BB, 25416 - 11905: 0x92BC, 25417 - 11905: 0xD7BD, 25418 - 11905: 0x92BD, 25419 - 11905: 0xDEDB, 25420 - 11905: 0xB0C6, 25421 - 11905: 0xBAB4, 25422 - 11905: 0xC9D3, 25423 - 11905: 0xC4F3, 25424 - 11905: 0xBEE8, 25425 - 11905: 0x92BE, 25426 - 11905: 0x92BF, 25427 - 11905: 0x92C0, 25428 - 11905: 0x92C1, 25429 - 11905: 0xB2B6, 25430 - 11905: 0x92C2, 25431 - 11905: 0x92C3, 25432 - 11905: 0x92C4, 25433 - 11905: 0x92C5, 25434 - 11905: 0x92C6, 25435 - 11905: 0x92C7, 25436 - 11905: 0x92C8, 25437 - 11905: 0x92C9, 25438 - 11905: 0xC0CC, 25439 - 11905: 0xCBF0, 25440 - 11905: 0x92CA, 25441 - 11905: 0xBCF1, 25442 - 11905: 0xBBBB, 25443 - 11905: 0xB5B7, 25444 - 11905: 0x92CB, 25445 - 11905: 0x92CC, 25446 - 11905: 0x92CD, 25447 - 11905: 0xC5F5, 25448 - 11905: 0x92CE, 25449 - 11905: 0xDEE6, 25450 - 11905: 0x92CF, 25451 - 11905: 0x92D0, 25452 - 11905: 0x92D1, 25453 - 11905: 0xDEE3, 25454 - 11905: 0xBEDD, 25455 - 11905: 0x92D2, 25456 - 11905: 0x92D3, 25457 - 11905: 0xDEDF, 25458 - 11905: 0x92D4, 25459 - 11905: 0x92D5, 25460 - 11905: 0x92D6, 25461 - 11905: 0x92D7, 25462 - 11905: 0xB4B7, 25463 - 11905: 0xBDDD, 25464 - 11905: 0x92D8, 25465 - 11905: 0x92D9, 25466 - 11905: 0xDEE0, 25467 - 11905: 0xC4ED, 25468 - 11905: 0x92DA, 25469 - 11905: 0x92DB, 25470 - 11905: 0x92DC, 25471 - 11905: 0x92DD, 25472 - 11905: 0xCFC6, 25473 - 11905: 0x92DE, 25474 - 11905: 0xB5E0, 25475 - 11905: 0x92DF, 25476 - 11905: 0x92E0, 25477 - 11905: 0x92E1, 25478 - 11905: 0x92E2, 25479 - 11905: 0xB6DE, 25480 - 11905: 0xCADA, 25481 - 11905: 0xB5F4, 25482 - 11905: 0xDEE5, 25483 - 11905: 0x92E3, 25484 - 11905: 0xD5C6, 25485 - 11905: 0x92E4, 25486 - 11905: 0xDEE1, 25487 - 11905: 0xCCCD, 25488 - 11905: 0xC6FE, 25489 - 11905: 0x92E5, 25490 - 11905: 0xC5C5, 25491 - 11905: 0x92E6, 25492 - 11905: 0x92E7, 25493 - 11905: 0x92E8, 25494 - 11905: 0xD2B4, 25495 - 11905: 0x92E9, 25496 - 11905: 0xBEF2, 25497 - 11905: 0x92EA, 25498 - 11905: 0x92EB, 25499 - 11905: 0x92EC, 25500 - 11905: 0x92ED, 25501 - 11905: 0x92EE, 25502 - 11905: 0x92EF, 25503 - 11905: 0x92F0, 25504 - 11905: 0xC2D3, 25505 - 11905: 0x92F1, 25506 - 11905: 0xCCBD, 25507 - 11905: 0xB3B8, 25508 - 11905: 0x92F2, 25509 - 11905: 0xBDD3, 25510 - 11905: 0x92F3, 25511 - 11905: 0xBFD8, 25512 - 11905: 0xCDC6, 25513 - 11905: 0xD1DA, 25514 - 11905: 0xB4EB, 25515 - 11905: 0x92F4, 25516 - 11905: 0xDEE4, 25517 - 11905: 0xDEDD, 25518 - 11905: 0xDEE7, 25519 - 11905: 0x92F5, 25520 - 11905: 0xEAFE, 25521 - 11905: 0x92F6, 25522 - 11905: 0x92F7, 25523 - 11905: 0xC2B0, 25524 - 11905: 0xDEE2, 25525 - 11905: 0x92F8, 25526 - 11905: 0x92F9, 25527 - 11905: 0xD6C0, 25528 - 11905: 0xB5A7, 25529 - 11905: 0x92FA, 25530 - 11905: 0xB2F4, 25531 - 11905: 0x92FB, 25532 - 11905: 0xDEE8, 25533 - 11905: 0x92FC, 25534 - 11905: 0xDEF2, 25535 - 11905: 0x92FD, 25536 - 11905: 0x92FE, 25537 - 11905: 0x9340, 25538 - 11905: 0x9341, 25539 - 11905: 0x9342, 25540 - 11905: 0xDEED, 25541 - 11905: 0x9343, 25542 - 11905: 0xDEF1, 25543 - 11905: 0x9344, 25544 - 11905: 0x9345, 25545 - 11905: 0xC8E0, 25546 - 11905: 0x9346, 25547 - 11905: 0x9347, 25548 - 11905: 0x9348, 25549 - 11905: 0xD7E1, 25550 - 11905: 0xDEEF, 25551 - 11905: 0xC3E8, 25552 - 11905: 0xCCE1, 25553 - 11905: 0x9349, 25554 - 11905: 0xB2E5, 25555 - 11905: 0x934A, 25556 - 11905: 0x934B, 25557 - 11905: 0x934C, 25558 - 11905: 0xD2BE, 25559 - 11905: 0x934D, 25560 - 11905: 0x934E, 25561 - 11905: 0x934F, 25562 - 11905: 0x9350, 25563 - 11905: 0x9351, 25564 - 11905: 0x9352, 25565 - 11905: 0x9353, 25566 - 11905: 0xDEEE, 25567 - 11905: 0x9354, 25568 - 11905: 0xDEEB, 25569 - 11905: 0xCED5, 25570 - 11905: 0x9355, 25571 - 11905: 0xB4A7, 25572 - 11905: 0x9356, 25573 - 11905: 0x9357, 25574 - 11905: 0x9358, 25575 - 11905: 0x9359, 25576 - 11905: 0x935A, 25577 - 11905: 0xBFAB, 25578 - 11905: 0xBEBE, 25579 - 11905: 0x935B, 25580 - 11905: 0x935C, 25581 - 11905: 0xBDD2, 25582 - 11905: 0x935D, 25583 - 11905: 0x935E, 25584 - 11905: 0x935F, 25585 - 11905: 0x9360, 25586 - 11905: 0xDEE9, 25587 - 11905: 0x9361, 25588 - 11905: 0xD4AE, 25589 - 11905: 0x9362, 25590 - 11905: 0xDEDE, 25591 - 11905: 0x9363, 25592 - 11905: 0xDEEA, 25593 - 11905: 0x9364, 25594 - 11905: 0x9365, 25595 - 11905: 0x9366, 25596 - 11905: 0x9367, 25597 - 11905: 0xC0BF, 25598 - 11905: 0x9368, 25599 - 11905: 0xDEEC, 25600 - 11905: 0xB2F3, 25601 - 11905: 0xB8E9, 25602 - 11905: 0xC2A7, 25603 - 11905: 0x9369, 25604 - 11905: 0x936A, 25605 - 11905: 0xBDC1, 25606 - 11905: 0x936B, 25607 - 11905: 0x936C, 25608 - 11905: 0x936D, 25609 - 11905: 0x936E, 25610 - 11905: 0x936F, 25611 - 11905: 0xDEF5, 25612 - 11905: 0xDEF8, 25613 - 11905: 0x9370, 25614 - 11905: 0x9371, 25615 - 11905: 0xB2AB, 25616 - 11905: 0xB4A4, 25617 - 11905: 0x9372, 25618 - 11905: 0x9373, 25619 - 11905: 0xB4EA, 25620 - 11905: 0xC9A6, 25621 - 11905: 0x9374, 25622 - 11905: 0x9375, 25623 - 11905: 0x9376, 25624 - 11905: 0x9377, 25625 - 11905: 0x9378, 25626 - 11905: 0x9379, 25627 - 11905: 0xDEF6, 25628 - 11905: 0xCBD1, 25629 - 11905: 0x937A, 25630 - 11905: 0xB8E3, 25631 - 11905: 0x937B, 25632 - 11905: 0xDEF7, 25633 - 11905: 0xDEFA, 25634 - 11905: 0x937C, 25635 - 11905: 0x937D, 25636 - 11905: 0x937E, 25637 - 11905: 0x9380, 25638 - 11905: 0xDEF9, 25639 - 11905: 0x9381, 25640 - 11905: 0x9382, 25641 - 11905: 0x9383, 25642 - 11905: 0xCCC2, 25643 - 11905: 0x9384, 25644 - 11905: 0xB0E1, 25645 - 11905: 0xB4EE, 25646 - 11905: 0x9385, 25647 - 11905: 0x9386, 25648 - 11905: 0x9387, 25649 - 11905: 0x9388, 25650 - 11905: 0x9389, 25651 - 11905: 0x938A, 25652 - 11905: 0xE5BA, 25653 - 11905: 0x938B, 25654 - 11905: 0x938C, 25655 - 11905: 0x938D, 25656 - 11905: 0x938E, 25657 - 11905: 0x938F, 25658 - 11905: 0xD0AF, 25659 - 11905: 0x9390, 25660 - 11905: 0x9391, 25661 - 11905: 0xB2EB, 25662 - 11905: 0x9392, 25663 - 11905: 0xEBA1, 25664 - 11905: 0x9393, 25665 - 11905: 0xDEF4, 25666 - 11905: 0x9394, 25667 - 11905: 0x9395, 25668 - 11905: 0xC9E3, 25669 - 11905: 0xDEF3, 25670 - 11905: 0xB0DA, 25671 - 11905: 0xD2A1, 25672 - 11905: 0xB1F7, 25673 - 11905: 0x9396, 25674 - 11905: 0xCCAF, 25675 - 11905: 0x9397, 25676 - 11905: 0x9398, 25677 - 11905: 0x9399, 25678 - 11905: 0x939A, 25679 - 11905: 0x939B, 25680 - 11905: 0x939C, 25681 - 11905: 0x939D, 25682 - 11905: 0xDEF0, 25683 - 11905: 0x939E, 25684 - 11905: 0xCBA4, 25685 - 11905: 0x939F, 25686 - 11905: 0x93A0, 25687 - 11905: 0x93A1, 25688 - 11905: 0xD5AA, 25689 - 11905: 0x93A2, 25690 - 11905: 0x93A3, 25691 - 11905: 0x93A4, 25692 - 11905: 0x93A5, 25693 - 11905: 0x93A6, 25694 - 11905: 0xDEFB, 25695 - 11905: 0x93A7, 25696 - 11905: 0x93A8, 25697 - 11905: 0x93A9, 25698 - 11905: 0x93AA, 25699 - 11905: 0x93AB, 25700 - 11905: 0x93AC, 25701 - 11905: 0x93AD, 25702 - 11905: 0x93AE, 25703 - 11905: 0xB4DD, 25704 - 11905: 0x93AF, 25705 - 11905: 0xC4A6, 25706 - 11905: 0x93B0, 25707 - 11905: 0x93B1, 25708 - 11905: 0x93B2, 25709 - 11905: 0xDEFD, 25710 - 11905: 0x93B3, 25711 - 11905: 0x93B4, 25712 - 11905: 0x93B5, 25713 - 11905: 0x93B6, 25714 - 11905: 0x93B7, 25715 - 11905: 0x93B8, 25716 - 11905: 0x93B9, 25717 - 11905: 0x93BA, 25718 - 11905: 0x93BB, 25719 - 11905: 0x93BC, 25720 - 11905: 0xC3FE, 25721 - 11905: 0xC4A1, 25722 - 11905: 0xDFA1, 25723 - 11905: 0x93BD, 25724 - 11905: 0x93BE, 25725 - 11905: 0x93BF, 25726 - 11905: 0x93C0, 25727 - 11905: 0x93C1, 25728 - 11905: 0x93C2, 25729 - 11905: 0x93C3, 25730 - 11905: 0xC1CC, 25731 - 11905: 0x93C4, 25732 - 11905: 0xDEFC, 25733 - 11905: 0xBEEF, 25734 - 11905: 0x93C5, 25735 - 11905: 0xC6B2, 25736 - 11905: 0x93C6, 25737 - 11905: 0x93C7, 25738 - 11905: 0x93C8, 25739 - 11905: 0x93C9, 25740 - 11905: 0x93CA, 25741 - 11905: 0x93CB, 25742 - 11905: 0x93CC, 25743 - 11905: 0x93CD, 25744 - 11905: 0x93CE, 25745 - 11905: 0xB3C5, 25746 - 11905: 0xC8F6, 25747 - 11905: 0x93CF, 25748 - 11905: 0x93D0, 25749 - 11905: 0xCBBA, 25750 - 11905: 0xDEFE, 25751 - 11905: 0x93D1, 25752 - 11905: 0x93D2, 25753 - 11905: 0xDFA4, 25754 - 11905: 0x93D3, 25755 - 11905: 0x93D4, 25756 - 11905: 0x93D5, 25757 - 11905: 0x93D6, 25758 - 11905: 0xD7B2, 25759 - 11905: 0x93D7, 25760 - 11905: 0x93D8, 25761 - 11905: 0x93D9, 25762 - 11905: 0x93DA, 25763 - 11905: 0x93DB, 25764 - 11905: 0xB3B7, 25765 - 11905: 0x93DC, 25766 - 11905: 0x93DD, 25767 - 11905: 0x93DE, 25768 - 11905: 0x93DF, 25769 - 11905: 0xC1C3, 25770 - 11905: 0x93E0, 25771 - 11905: 0x93E1, 25772 - 11905: 0xC7CB, 25773 - 11905: 0xB2A5, 25774 - 11905: 0xB4E9, 25775 - 11905: 0x93E2, 25776 - 11905: 0xD7AB, 25777 - 11905: 0x93E3, 25778 - 11905: 0x93E4, 25779 - 11905: 0x93E5, 25780 - 11905: 0x93E6, 25781 - 11905: 0xC4EC, 25782 - 11905: 0x93E7, 25783 - 11905: 0xDFA2, 25784 - 11905: 0xDFA3, 25785 - 11905: 0x93E8, 25786 - 11905: 0xDFA5, 25787 - 11905: 0x93E9, 25788 - 11905: 0xBAB3, 25789 - 11905: 0x93EA, 25790 - 11905: 0x93EB, 25791 - 11905: 0x93EC, 25792 - 11905: 0xDFA6, 25793 - 11905: 0x93ED, 25794 - 11905: 0xC0DE, 25795 - 11905: 0x93EE, 25796 - 11905: 0x93EF, 25797 - 11905: 0xC9C3, 25798 - 11905: 0x93F0, 25799 - 11905: 0x93F1, 25800 - 11905: 0x93F2, 25801 - 11905: 0x93F3, 25802 - 11905: 0x93F4, 25803 - 11905: 0x93F5, 25804 - 11905: 0x93F6, 25805 - 11905: 0xB2D9, 25806 - 11905: 0xC7E6, 25807 - 11905: 0x93F7, 25808 - 11905: 0xDFA7, 25809 - 11905: 0x93F8, 25810 - 11905: 0xC7DC, 25811 - 11905: 0x93F9, 25812 - 11905: 0x93FA, 25813 - 11905: 0x93FB, 25814 - 11905: 0x93FC, 25815 - 11905: 0xDFA8, 25816 - 11905: 0xEBA2, 25817 - 11905: 0x93FD, 25818 - 11905: 0x93FE, 25819 - 11905: 0x9440, 25820 - 11905: 0x9441, 25821 - 11905: 0x9442, 25822 - 11905: 0xCBD3, 25823 - 11905: 0x9443, 25824 - 11905: 0x9444, 25825 - 11905: 0x9445, 25826 - 11905: 0xDFAA, 25827 - 11905: 0x9446, 25828 - 11905: 0xDFA9, 25829 - 11905: 0x9447, 25830 - 11905: 0xB2C1, 25831 - 11905: 0x9448, 25832 - 11905: 0x9449, 25833 - 11905: 0x944A, 25834 - 11905: 0x944B, 25835 - 11905: 0x944C, 25836 - 11905: 0x944D, 25837 - 11905: 0x944E, 25838 - 11905: 0x944F, 25839 - 11905: 0x9450, 25840 - 11905: 0x9451, 25841 - 11905: 0x9452, 25842 - 11905: 0x9453, 25843 - 11905: 0x9454, 25844 - 11905: 0x9455, 25845 - 11905: 0x9456, 25846 - 11905: 0x9457, 25847 - 11905: 0x9458, 25848 - 11905: 0x9459, 25849 - 11905: 0x945A, 25850 - 11905: 0x945B, 25851 - 11905: 0x945C, 25852 - 11905: 0x945D, 25853 - 11905: 0x945E, 25854 - 11905: 0x945F, 25855 - 11905: 0x9460, 25856 - 11905: 0xC5CA, 25857 - 11905: 0x9461, 25858 - 11905: 0x9462, 25859 - 11905: 0x9463, 25860 - 11905: 0x9464, 25861 - 11905: 0x9465, 25862 - 11905: 0x9466, 25863 - 11905: 0x9467, 25864 - 11905: 0x9468, 25865 - 11905: 0xDFAB, 25866 - 11905: 0x9469, 25867 - 11905: 0x946A, 25868 - 11905: 0x946B, 25869 - 11905: 0x946C, 25870 - 11905: 0x946D, 25871 - 11905: 0x946E, 25872 - 11905: 0x946F, 25873 - 11905: 0x9470, 25874 - 11905: 0xD4DC, 25875 - 11905: 0x9471, 25876 - 11905: 0x9472, 25877 - 11905: 0x9473, 25878 - 11905: 0x9474, 25879 - 11905: 0x9475, 25880 - 11905: 0xC8C1, 25881 - 11905: 0x9476, 25882 - 11905: 0x9477, 25883 - 11905: 0x9478, 25884 - 11905: 0x9479, 25885 - 11905: 0x947A, 25886 - 11905: 0x947B, 25887 - 11905: 0x947C, 25888 - 11905: 0x947D, 25889 - 11905: 0x947E, 25890 - 11905: 0x9480, 25891 - 11905: 0x9481, 25892 - 11905: 0x9482, 25893 - 11905: 0xDFAC, 25894 - 11905: 0x9483, 25895 - 11905: 0x9484, 25896 - 11905: 0x9485, 25897 - 11905: 0x9486, 25898 - 11905: 0x9487, 25899 - 11905: 0xBEF0, 25900 - 11905: 0x9488, 25901 - 11905: 0x9489, 25902 - 11905: 0xDFAD, 25903 - 11905: 0xD6A7, 25904 - 11905: 0x948A, 25905 - 11905: 0x948B, 25906 - 11905: 0x948C, 25907 - 11905: 0x948D, 25908 - 11905: 0xEAB7, 25909 - 11905: 0xEBB6, 25910 - 11905: 0xCAD5, 25911 - 11905: 0x948E, 25912 - 11905: 0xD8FC, 25913 - 11905: 0xB8C4, 25914 - 11905: 0x948F, 25915 - 11905: 0xB9A5, 25916 - 11905: 0x9490, 25917 - 11905: 0x9491, 25918 - 11905: 0xB7C5, 25919 - 11905: 0xD5FE, 25920 - 11905: 0x9492, 25921 - 11905: 0x9493, 25922 - 11905: 0x9494, 25923 - 11905: 0x9495, 25924 - 11905: 0x9496, 25925 - 11905: 0xB9CA, 25926 - 11905: 0x9497, 25927 - 11905: 0x9498, 25928 - 11905: 0xD0A7, 25929 - 11905: 0xF4CD, 25930 - 11905: 0x9499, 25931 - 11905: 0x949A, 25932 - 11905: 0xB5D0, 25933 - 11905: 0x949B, 25934 - 11905: 0x949C, 25935 - 11905: 0xC3F4, 25936 - 11905: 0x949D, 25937 - 11905: 0xBEC8, 25938 - 11905: 0x949E, 25939 - 11905: 0x949F, 25940 - 11905: 0x94A0, 25941 - 11905: 0xEBB7, 25942 - 11905: 0xB0BD, 25943 - 11905: 0x94A1, 25944 - 11905: 0x94A2, 25945 - 11905: 0xBDCC, 25946 - 11905: 0x94A3, 25947 - 11905: 0xC1B2, 25948 - 11905: 0x94A4, 25949 - 11905: 0xB1D6, 25950 - 11905: 0xB3A8, 25951 - 11905: 0x94A5, 25952 - 11905: 0x94A6, 25953 - 11905: 0x94A7, 25954 - 11905: 0xB8D2, 25955 - 11905: 0xC9A2, 25956 - 11905: 0x94A8, 25957 - 11905: 0x94A9, 25958 - 11905: 0xB6D8, 25959 - 11905: 0x94AA, 25960 - 11905: 0x94AB, 25961 - 11905: 0x94AC, 25962 - 11905: 0x94AD, 25963 - 11905: 0xEBB8, 25964 - 11905: 0xBEB4, 25965 - 11905: 0x94AE, 25966 - 11905: 0x94AF, 25967 - 11905: 0x94B0, 25968 - 11905: 0xCAFD, 25969 - 11905: 0x94B1, 25970 - 11905: 0xC7C3, 25971 - 11905: 0x94B2, 25972 - 11905: 0xD5FB, 25973 - 11905: 0x94B3, 25974 - 11905: 0x94B4, 25975 - 11905: 0xB7F3, 25976 - 11905: 0x94B5, 25977 - 11905: 0x94B6, 25978 - 11905: 0x94B7, 25979 - 11905: 0x94B8, 25980 - 11905: 0x94B9, 25981 - 11905: 0x94BA, 25982 - 11905: 0x94BB, 25983 - 11905: 0x94BC, 25984 - 11905: 0x94BD, 25985 - 11905: 0x94BE, 25986 - 11905: 0x94BF, 25987 - 11905: 0x94C0, 25988 - 11905: 0x94C1, 25989 - 11905: 0x94C2, 25990 - 11905: 0x94C3, 25991 - 11905: 0xCEC4, 25992 - 11905: 0x94C4, 25993 - 11905: 0x94C5, 25994 - 11905: 0x94C6, 25995 - 11905: 0xD5AB, 25996 - 11905: 0xB1F3, 25997 - 11905: 0x94C7, 25998 - 11905: 0x94C8, 25999 - 11905: 0x94C9, 26000 - 11905: 0xECB3, 26001 - 11905: 0xB0DF, 26002 - 11905: 0x94CA, 26003 - 11905: 0xECB5, 26004 - 11905: 0x94CB, 26005 - 11905: 0x94CC, 26006 - 11905: 0x94CD, 26007 - 11905: 0xB6B7, 26008 - 11905: 0x94CE, 26009 - 11905: 0xC1CF, 26010 - 11905: 0x94CF, 26011 - 11905: 0xF5FA, 26012 - 11905: 0xD0B1, 26013 - 11905: 0x94D0, 26014 - 11905: 0x94D1, 26015 - 11905: 0xD5E5, 26016 - 11905: 0x94D2, 26017 - 11905: 0xCED3, 26018 - 11905: 0x94D3, 26019 - 11905: 0x94D4, 26020 - 11905: 0xBDEF, 26021 - 11905: 0xB3E2, 26022 - 11905: 0x94D5, 26023 - 11905: 0xB8AB, 26024 - 11905: 0x94D6, 26025 - 11905: 0xD5B6, 26026 - 11905: 0x94D7, 26027 - 11905: 0xEDBD, 26028 - 11905: 0x94D8, 26029 - 11905: 0xB6CF, 26030 - 11905: 0x94D9, 26031 - 11905: 0xCBB9, 26032 - 11905: 0xD0C2, 26033 - 11905: 0x94DA, 26034 - 11905: 0x94DB, 26035 - 11905: 0x94DC, 26036 - 11905: 0x94DD, 26037 - 11905: 0x94DE, 26038 - 11905: 0x94DF, 26039 - 11905: 0x94E0, 26040 - 11905: 0x94E1, 26041 - 11905: 0xB7BD, 26042 - 11905: 0x94E2, 26043 - 11905: 0x94E3, 26044 - 11905: 0xECB6, 26045 - 11905: 0xCAA9, 26046 - 11905: 0x94E4, 26047 - 11905: 0x94E5, 26048 - 11905: 0x94E6, 26049 - 11905: 0xC5D4, 26050 - 11905: 0x94E7, 26051 - 11905: 0xECB9, 26052 - 11905: 0xECB8, 26053 - 11905: 0xC2C3, 26054 - 11905: 0xECB7, 26055 - 11905: 0x94E8, 26056 - 11905: 0x94E9, 26057 - 11905: 0x94EA, 26058 - 11905: 0x94EB, 26059 - 11905: 0xD0FD, 26060 - 11905: 0xECBA, 26061 - 11905: 0x94EC, 26062 - 11905: 0xECBB, 26063 - 11905: 0xD7E5, 26064 - 11905: 0x94ED, 26065 - 11905: 0x94EE, 26066 - 11905: 0xECBC, 26067 - 11905: 0x94EF, 26068 - 11905: 0x94F0, 26069 - 11905: 0x94F1, 26070 - 11905: 0xECBD, 26071 - 11905: 0xC6EC, 26072 - 11905: 0x94F2, 26073 - 11905: 0x94F3, 26074 - 11905: 0x94F4, 26075 - 11905: 0x94F5, 26076 - 11905: 0x94F6, 26077 - 11905: 0x94F7, 26078 - 11905: 0x94F8, 26079 - 11905: 0x94F9, 26080 - 11905: 0xCEDE, 26081 - 11905: 0x94FA, 26082 - 11905: 0xBCC8, 26083 - 11905: 0x94FB, 26084 - 11905: 0x94FC, 26085 - 11905: 0xC8D5, 26086 - 11905: 0xB5A9, 26087 - 11905: 0xBEC9, 26088 - 11905: 0xD6BC, 26089 - 11905: 0xD4E7, 26090 - 11905: 0x94FD, 26091 - 11905: 0x94FE, 26092 - 11905: 0xD1AE, 26093 - 11905: 0xD0F1, 26094 - 11905: 0xEAB8, 26095 - 11905: 0xEAB9, 26096 - 11905: 0xEABA, 26097 - 11905: 0xBAB5, 26098 - 11905: 0x9540, 26099 - 11905: 0x9541, 26100 - 11905: 0x9542, 26101 - 11905: 0x9543, 26102 - 11905: 0xCAB1, 26103 - 11905: 0xBFF5, 26104 - 11905: 0x9544, 26105 - 11905: 0x9545, 26106 - 11905: 0xCDFA, 26107 - 11905: 0x9546, 26108 - 11905: 0x9547, 26109 - 11905: 0x9548, 26110 - 11905: 0x9549, 26111 - 11905: 0x954A, 26112 - 11905: 0xEAC0, 26113 - 11905: 0x954B, 26114 - 11905: 0xB0BA, 26115 - 11905: 0xEABE, 26116 - 11905: 0x954C, 26117 - 11905: 0x954D, 26118 - 11905: 0xC0A5, 26119 - 11905: 0x954E, 26120 - 11905: 0x954F, 26121 - 11905: 0x9550, 26122 - 11905: 0xEABB, 26123 - 11905: 0x9551, 26124 - 11905: 0xB2FD, 26125 - 11905: 0x9552, 26126 - 11905: 0xC3F7, 26127 - 11905: 0xBBE8, 26128 - 11905: 0x9553, 26129 - 11905: 0x9554, 26130 - 11905: 0x9555, 26131 - 11905: 0xD2D7, 26132 - 11905: 0xCEF4, 26133 - 11905: 0xEABF, 26134 - 11905: 0x9556, 26135 - 11905: 0x9557, 26136 - 11905: 0x9558, 26137 - 11905: 0xEABC, 26138 - 11905: 0x9559, 26139 - 11905: 0x955A, 26140 - 11905: 0x955B, 26141 - 11905: 0xEAC3, 26142 - 11905: 0x955C, 26143 - 11905: 0xD0C7, 26144 - 11905: 0xD3B3, 26145 - 11905: 0x955D, 26146 - 11905: 0x955E, 26147 - 11905: 0x955F, 26148 - 11905: 0x9560, 26149 - 11905: 0xB4BA, 26150 - 11905: 0x9561, 26151 - 11905: 0xC3C1, 26152 - 11905: 0xD7F2, 26153 - 11905: 0x9562, 26154 - 11905: 0x9563, 26155 - 11905: 0x9564, 26156 - 11905: 0x9565, 26157 - 11905: 0xD5D1, 26158 - 11905: 0x9566, 26159 - 11905: 0xCAC7, 26160 - 11905: 0x9567, 26161 - 11905: 0xEAC5, 26162 - 11905: 0x9568, 26163 - 11905: 0x9569, 26164 - 11905: 0xEAC4, 26165 - 11905: 0xEAC7, 26166 - 11905: 0xEAC6, 26167 - 11905: 0x956A, 26168 - 11905: 0x956B, 26169 - 11905: 0x956C, 26170 - 11905: 0x956D, 26171 - 11905: 0x956E, 26172 - 11905: 0xD6E7, 26173 - 11905: 0x956F, 26174 - 11905: 0xCFD4, 26175 - 11905: 0x9570, 26176 - 11905: 0x9571, 26177 - 11905: 0xEACB, 26178 - 11905: 0x9572, 26179 - 11905: 0xBBCE, 26180 - 11905: 0x9573, 26181 - 11905: 0x9574, 26182 - 11905: 0x9575, 26183 - 11905: 0x9576, 26184 - 11905: 0x9577, 26185 - 11905: 0x9578, 26186 - 11905: 0x9579, 26187 - 11905: 0xBDFA, 26188 - 11905: 0xC9CE, 26189 - 11905: 0x957A, 26190 - 11905: 0x957B, 26191 - 11905: 0xEACC, 26192 - 11905: 0x957C, 26193 - 11905: 0x957D, 26194 - 11905: 0xC9B9, 26195 - 11905: 0xCFFE, 26196 - 11905: 0xEACA, 26197 - 11905: 0xD4CE, 26198 - 11905: 0xEACD, 26199 - 11905: 0xEACF, 26200 - 11905: 0x957E, 26201 - 11905: 0x9580, 26202 - 11905: 0xCDED, 26203 - 11905: 0x9581, 26204 - 11905: 0x9582, 26205 - 11905: 0x9583, 26206 - 11905: 0x9584, 26207 - 11905: 0xEAC9, 26208 - 11905: 0x9585, 26209 - 11905: 0xEACE, 26210 - 11905: 0x9586, 26211 - 11905: 0x9587, 26212 - 11905: 0xCEEE, 26213 - 11905: 0x9588, 26214 - 11905: 0xBBDE, 26215 - 11905: 0x9589, 26216 - 11905: 0xB3BF, 26217 - 11905: 0x958A, 26218 - 11905: 0x958B, 26219 - 11905: 0x958C, 26220 - 11905: 0x958D, 26221 - 11905: 0x958E, 26222 - 11905: 0xC6D5, 26223 - 11905: 0xBEB0, 26224 - 11905: 0xCEFA, 26225 - 11905: 0x958F, 26226 - 11905: 0x9590, 26227 - 11905: 0x9591, 26228 - 11905: 0xC7E7, 26229 - 11905: 0x9592, 26230 - 11905: 0xBEA7, 26231 - 11905: 0xEAD0, 26232 - 11905: 0x9593, 26233 - 11905: 0x9594, 26234 - 11905: 0xD6C7, 26235 - 11905: 0x9595, 26236 - 11905: 0x9596, 26237 - 11905: 0x9597, 26238 - 11905: 0xC1C0, 26239 - 11905: 0x9598, 26240 - 11905: 0x9599, 26241 - 11905: 0x959A, 26242 - 11905: 0xD4DD, 26243 - 11905: 0x959B, 26244 - 11905: 0xEAD1, 26245 - 11905: 0x959C, 26246 - 11905: 0x959D, 26247 - 11905: 0xCFBE, 26248 - 11905: 0x959E, 26249 - 11905: 0x959F, 26250 - 11905: 0x95A0, 26251 - 11905: 0x95A1, 26252 - 11905: 0xEAD2, 26253 - 11905: 0x95A2, 26254 - 11905: 0x95A3, 26255 - 11905: 0x95A4, 26256 - 11905: 0x95A5, 26257 - 11905: 0xCAEE, 26258 - 11905: 0x95A6, 26259 - 11905: 0x95A7, 26260 - 11905: 0x95A8, 26261 - 11905: 0x95A9, 26262 - 11905: 0xC5AF, 26263 - 11905: 0xB0B5, 26264 - 11905: 0x95AA, 26265 - 11905: 0x95AB, 26266 - 11905: 0x95AC, 26267 - 11905: 0x95AD, 26268 - 11905: 0x95AE, 26269 - 11905: 0xEAD4, 26270 - 11905: 0x95AF, 26271 - 11905: 0x95B0, 26272 - 11905: 0x95B1, 26273 - 11905: 0x95B2, 26274 - 11905: 0x95B3, 26275 - 11905: 0x95B4, 26276 - 11905: 0x95B5, 26277 - 11905: 0x95B6, 26278 - 11905: 0x95B7, 26279 - 11905: 0xEAD3, 26280 - 11905: 0xF4DF, 26281 - 11905: 0x95B8, 26282 - 11905: 0x95B9, 26283 - 11905: 0x95BA, 26284 - 11905: 0x95BB, 26285 - 11905: 0x95BC, 26286 - 11905: 0xC4BA, 26287 - 11905: 0x95BD, 26288 - 11905: 0x95BE, 26289 - 11905: 0x95BF, 26290 - 11905: 0x95C0, 26291 - 11905: 0x95C1, 26292 - 11905: 0xB1A9, 26293 - 11905: 0x95C2, 26294 - 11905: 0x95C3, 26295 - 11905: 0x95C4, 26296 - 11905: 0x95C5, 26297 - 11905: 0xE5DF, 26298 - 11905: 0x95C6, 26299 - 11905: 0x95C7, 26300 - 11905: 0x95C8, 26301 - 11905: 0x95C9, 26302 - 11905: 0xEAD5, 26303 - 11905: 0x95CA, 26304 - 11905: 0x95CB, 26305 - 11905: 0x95CC, 26306 - 11905: 0x95CD, 26307 - 11905: 0x95CE, 26308 - 11905: 0x95CF, 26309 - 11905: 0x95D0, 26310 - 11905: 0x95D1, 26311 - 11905: 0x95D2, 26312 - 11905: 0x95D3, 26313 - 11905: 0x95D4, 26314 - 11905: 0x95D5, 26315 - 11905: 0x95D6, 26316 - 11905: 0x95D7, 26317 - 11905: 0x95D8, 26318 - 11905: 0x95D9, 26319 - 11905: 0x95DA, 26320 - 11905: 0x95DB, 26321 - 11905: 0x95DC, 26322 - 11905: 0x95DD, 26323 - 11905: 0x95DE, 26324 - 11905: 0x95DF, 26325 - 11905: 0x95E0, 26326 - 11905: 0x95E1, 26327 - 11905: 0x95E2, 26328 - 11905: 0x95E3, 26329 - 11905: 0xCAEF, 26330 - 11905: 0x95E4, 26331 - 11905: 0xEAD6, 26332 - 11905: 0xEAD7, 26333 - 11905: 0xC6D8, 26334 - 11905: 0x95E5, 26335 - 11905: 0x95E6, 26336 - 11905: 0x95E7, 26337 - 11905: 0x95E8, 26338 - 11905: 0x95E9, 26339 - 11905: 0x95EA, 26340 - 11905: 0x95EB, 26341 - 11905: 0x95EC, 26342 - 11905: 0xEAD8, 26343 - 11905: 0x95ED, 26344 - 11905: 0x95EE, 26345 - 11905: 0xEAD9, 26346 - 11905: 0x95EF, 26347 - 11905: 0x95F0, 26348 - 11905: 0x95F1, 26349 - 11905: 0x95F2, 26350 - 11905: 0x95F3, 26351 - 11905: 0x95F4, 26352 - 11905: 0xD4BB, 26353 - 11905: 0x95F5, 26354 - 11905: 0xC7FA, 26355 - 11905: 0xD2B7, 26356 - 11905: 0xB8FC, 26357 - 11905: 0x95F6, 26358 - 11905: 0x95F7, 26359 - 11905: 0xEAC2, 26360 - 11905: 0x95F8, 26361 - 11905: 0xB2DC, 26362 - 11905: 0x95F9, 26363 - 11905: 0x95FA, 26364 - 11905: 0xC2FC, 26365 - 11905: 0x95FB, 26366 - 11905: 0xD4F8, 26367 - 11905: 0xCCE6, 26368 - 11905: 0xD7EE, 26369 - 11905: 0x95FC, 26370 - 11905: 0x95FD, 26371 - 11905: 0x95FE, 26372 - 11905: 0x9640, 26373 - 11905: 0x9641, 26374 - 11905: 0x9642, 26375 - 11905: 0x9643, 26376 - 11905: 0xD4C2, 26377 - 11905: 0xD3D0, 26378 - 11905: 0xEBC3, 26379 - 11905: 0xC5F3, 26380 - 11905: 0x9644, 26381 - 11905: 0xB7FE, 26382 - 11905: 0x9645, 26383 - 11905: 0x9646, 26384 - 11905: 0xEBD4, 26385 - 11905: 0x9647, 26386 - 11905: 0x9648, 26387 - 11905: 0x9649, 26388 - 11905: 0xCBB7, 26389 - 11905: 0xEBDE, 26390 - 11905: 0x964A, 26391 - 11905: 0xC0CA, 26392 - 11905: 0x964B, 26393 - 11905: 0x964C, 26394 - 11905: 0x964D, 26395 - 11905: 0xCDFB, 26396 - 11905: 0x964E, 26397 - 11905: 0xB3AF, 26398 - 11905: 0x964F, 26399 - 11905: 0xC6DA, 26400 - 11905: 0x9650, 26401 - 11905: 0x9651, 26402 - 11905: 0x9652, 26403 - 11905: 0x9653, 26404 - 11905: 0x9654, 26405 - 11905: 0x9655, 26406 - 11905: 0xEBFC, 26407 - 11905: 0x9656, 26408 - 11905: 0xC4BE, 26409 - 11905: 0x9657, 26410 - 11905: 0xCEB4, 26411 - 11905: 0xC4A9, 26412 - 11905: 0xB1BE, 26413 - 11905: 0xD4FD, 26414 - 11905: 0x9658, 26415 - 11905: 0xCAF5, 26416 - 11905: 0x9659, 26417 - 11905: 0xD6EC, 26418 - 11905: 0x965A, 26419 - 11905: 0x965B, 26420 - 11905: 0xC6D3, 26421 - 11905: 0xB6E4, 26422 - 11905: 0x965C, 26423 - 11905: 0x965D, 26424 - 11905: 0x965E, 26425 - 11905: 0x965F, 26426 - 11905: 0xBBFA, 26427 - 11905: 0x9660, 26428 - 11905: 0x9661, 26429 - 11905: 0xD0E0, 26430 - 11905: 0x9662, 26431 - 11905: 0x9663, 26432 - 11905: 0xC9B1, 26433 - 11905: 0x9664, 26434 - 11905: 0xD4D3, 26435 - 11905: 0xC8A8, 26436 - 11905: 0x9665, 26437 - 11905: 0x9666, 26438 - 11905: 0xB8CB, 26439 - 11905: 0x9667, 26440 - 11905: 0xE8BE, 26441 - 11905: 0xC9BC, 26442 - 11905: 0x9668, 26443 - 11905: 0x9669, 26444 - 11905: 0xE8BB, 26445 - 11905: 0x966A, 26446 - 11905: 0xC0EE, 26447 - 11905: 0xD0D3, 26448 - 11905: 0xB2C4, 26449 - 11905: 0xB4E5, 26450 - 11905: 0x966B, 26451 - 11905: 0xE8BC, 26452 - 11905: 0x966C, 26453 - 11905: 0x966D, 26454 - 11905: 0xD5C8, 26455 - 11905: 0x966E, 26456 - 11905: 0x966F, 26457 - 11905: 0x9670, 26458 - 11905: 0x9671, 26459 - 11905: 0x9672, 26460 - 11905: 0xB6C5, 26461 - 11905: 0x9673, 26462 - 11905: 0xE8BD, 26463 - 11905: 0xCAF8, 26464 - 11905: 0xB8DC, 26465 - 11905: 0xCCF5, 26466 - 11905: 0x9674, 26467 - 11905: 0x9675, 26468 - 11905: 0x9676, 26469 - 11905: 0xC0B4, 26470 - 11905: 0x9677, 26471 - 11905: 0x9678, 26472 - 11905: 0xD1EE, 26473 - 11905: 0xE8BF, 26474 - 11905: 0xE8C2, 26475 - 11905: 0x9679, 26476 - 11905: 0x967A, 26477 - 11905: 0xBABC, 26478 - 11905: 0x967B, 26479 - 11905: 0xB1AD, 26480 - 11905: 0xBDDC, 26481 - 11905: 0x967C, 26482 - 11905: 0xEABD, 26483 - 11905: 0xE8C3, 26484 - 11905: 0x967D, 26485 - 11905: 0xE8C6, 26486 - 11905: 0x967E, 26487 - 11905: 0xE8CB, 26488 - 11905: 0x9680, 26489 - 11905: 0x9681, 26490 - 11905: 0x9682, 26491 - 11905: 0x9683, 26492 - 11905: 0xE8CC, 26493 - 11905: 0x9684, 26494 - 11905: 0xCBC9, 26495 - 11905: 0xB0E5, 26496 - 11905: 0x9685, 26497 - 11905: 0xBCAB, 26498 - 11905: 0x9686, 26499 - 11905: 0x9687, 26500 - 11905: 0xB9B9, 26501 - 11905: 0x9688, 26502 - 11905: 0x9689, 26503 - 11905: 0xE8C1, 26504 - 11905: 0x968A, 26505 - 11905: 0xCDF7, 26506 - 11905: 0x968B, 26507 - 11905: 0xE8CA, 26508 - 11905: 0x968C, 26509 - 11905: 0x968D, 26510 - 11905: 0x968E, 26511 - 11905: 0x968F, 26512 - 11905: 0xCEF6, 26513 - 11905: 0x9690, 26514 - 11905: 0x9691, 26515 - 11905: 0x9692, 26516 - 11905: 0x9693, 26517 - 11905: 0xD5ED, 26518 - 11905: 0x9694, 26519 - 11905: 0xC1D6, 26520 - 11905: 0xE8C4, 26521 - 11905: 0x9695, 26522 - 11905: 0xC3B6, 26523 - 11905: 0x9696, 26524 - 11905: 0xB9FB, 26525 - 11905: 0xD6A6, 26526 - 11905: 0xE8C8, 26527 - 11905: 0x9697, 26528 - 11905: 0x9698, 26529 - 11905: 0x9699, 26530 - 11905: 0xCAE0, 26531 - 11905: 0xD4E6, 26532 - 11905: 0x969A, 26533 - 11905: 0xE8C0, 26534 - 11905: 0x969B, 26535 - 11905: 0xE8C5, 26536 - 11905: 0xE8C7, 26537 - 11905: 0x969C, 26538 - 11905: 0xC7B9, 26539 - 11905: 0xB7E3, 26540 - 11905: 0x969D, 26541 - 11905: 0xE8C9, 26542 - 11905: 0x969E, 26543 - 11905: 0xBFDD, 26544 - 11905: 0xE8D2, 26545 - 11905: 0x969F, 26546 - 11905: 0x96A0, 26547 - 11905: 0xE8D7, 26548 - 11905: 0x96A1, 26549 - 11905: 0xE8D5, 26550 - 11905: 0xBCDC, 26551 - 11905: 0xBCCF, 26552 - 11905: 0xE8DB, 26553 - 11905: 0x96A2, 26554 - 11905: 0x96A3, 26555 - 11905: 0x96A4, 26556 - 11905: 0x96A5, 26557 - 11905: 0x96A6, 26558 - 11905: 0x96A7, 26559 - 11905: 0x96A8, 26560 - 11905: 0x96A9, 26561 - 11905: 0xE8DE, 26562 - 11905: 0x96AA, 26563 - 11905: 0xE8DA, 26564 - 11905: 0xB1FA, 26565 - 11905: 0x96AB, 26566 - 11905: 0x96AC, 26567 - 11905: 0x96AD, 26568 - 11905: 0x96AE, 26569 - 11905: 0x96AF, 26570 - 11905: 0x96B0, 26571 - 11905: 0x96B1, 26572 - 11905: 0x96B2, 26573 - 11905: 0x96B3, 26574 - 11905: 0x96B4, 26575 - 11905: 0xB0D8, 26576 - 11905: 0xC4B3, 26577 - 11905: 0xB8CC, 26578 - 11905: 0xC6E2, 26579 - 11905: 0xC8BE, 26580 - 11905: 0xC8E1, 26581 - 11905: 0x96B5, 26582 - 11905: 0x96B6, 26583 - 11905: 0x96B7, 26584 - 11905: 0xE8CF, 26585 - 11905: 0xE8D4, 26586 - 11905: 0xE8D6, 26587 - 11905: 0x96B8, 26588 - 11905: 0xB9F1, 26589 - 11905: 0xE8D8, 26590 - 11905: 0xD7F5, 26591 - 11905: 0x96B9, 26592 - 11905: 0xC4FB, 26593 - 11905: 0x96BA, 26594 - 11905: 0xE8DC, 26595 - 11905: 0x96BB, 26596 - 11905: 0x96BC, 26597 - 11905: 0xB2E9, 26598 - 11905: 0x96BD, 26599 - 11905: 0x96BE, 26600 - 11905: 0x96BF, 26601 - 11905: 0xE8D1, 26602 - 11905: 0x96C0, 26603 - 11905: 0x96C1, 26604 - 11905: 0xBCED, 26605 - 11905: 0x96C2, 26606 - 11905: 0x96C3, 26607 - 11905: 0xBFC2, 26608 - 11905: 0xE8CD, 26609 - 11905: 0xD6F9, 26610 - 11905: 0x96C4, 26611 - 11905: 0xC1F8, 26612 - 11905: 0xB2F1, 26613 - 11905: 0x96C5, 26614 - 11905: 0x96C6, 26615 - 11905: 0x96C7, 26616 - 11905: 0x96C8, 26617 - 11905: 0x96C9, 26618 - 11905: 0x96CA, 26619 - 11905: 0x96CB, 26620 - 11905: 0x96CC, 26621 - 11905: 0xE8DF, 26622 - 11905: 0x96CD, 26623 - 11905: 0xCAC1, 26624 - 11905: 0xE8D9, 26625 - 11905: 0x96CE, 26626 - 11905: 0x96CF, 26627 - 11905: 0x96D0, 26628 - 11905: 0x96D1, 26629 - 11905: 0xD5A4, 26630 - 11905: 0x96D2, 26631 - 11905: 0xB1EA, 26632 - 11905: 0xD5BB, 26633 - 11905: 0xE8CE, 26634 - 11905: 0xE8D0, 26635 - 11905: 0xB6B0, 26636 - 11905: 0xE8D3, 26637 - 11905: 0x96D3, 26638 - 11905: 0xE8DD, 26639 - 11905: 0xC0B8, 26640 - 11905: 0x96D4, 26641 - 11905: 0xCAF7, 26642 - 11905: 0x96D5, 26643 - 11905: 0xCBA8, 26644 - 11905: 0x96D6, 26645 - 11905: 0x96D7, 26646 - 11905: 0xC6DC, 26647 - 11905: 0xC0F5, 26648 - 11905: 0x96D8, 26649 - 11905: 0x96D9, 26650 - 11905: 0x96DA, 26651 - 11905: 0x96DB, 26652 - 11905: 0x96DC, 26653 - 11905: 0xE8E9, 26654 - 11905: 0x96DD, 26655 - 11905: 0x96DE, 26656 - 11905: 0x96DF, 26657 - 11905: 0xD0A3, 26658 - 11905: 0x96E0, 26659 - 11905: 0x96E1, 26660 - 11905: 0x96E2, 26661 - 11905: 0x96E3, 26662 - 11905: 0x96E4, 26663 - 11905: 0x96E5, 26664 - 11905: 0x96E6, 26665 - 11905: 0xE8F2, 26666 - 11905: 0xD6EA, 26667 - 11905: 0x96E7, 26668 - 11905: 0x96E8, 26669 - 11905: 0x96E9, 26670 - 11905: 0x96EA, 26671 - 11905: 0x96EB, 26672 - 11905: 0x96EC, 26673 - 11905: 0x96ED, 26674 - 11905: 0xE8E0, 26675 - 11905: 0xE8E1, 26676 - 11905: 0x96EE, 26677 - 11905: 0x96EF, 26678 - 11905: 0x96F0, 26679 - 11905: 0xD1F9, 26680 - 11905: 0xBACB, 26681 - 11905: 0xB8F9, 26682 - 11905: 0x96F1, 26683 - 11905: 0x96F2, 26684 - 11905: 0xB8F1, 26685 - 11905: 0xD4D4, 26686 - 11905: 0xE8EF, 26687 - 11905: 0x96F3, 26688 - 11905: 0xE8EE, 26689 - 11905: 0xE8EC, 26690 - 11905: 0xB9F0, 26691 - 11905: 0xCCD2, 26692 - 11905: 0xE8E6, 26693 - 11905: 0xCEA6, 26694 - 11905: 0xBFF2, 26695 - 11905: 0x96F4, 26696 - 11905: 0xB0B8, 26697 - 11905: 0xE8F1, 26698 - 11905: 0xE8F0, 26699 - 11905: 0x96F5, 26700 - 11905: 0xD7C0, 26701 - 11905: 0x96F6, 26702 - 11905: 0xE8E4, 26703 - 11905: 0x96F7, 26704 - 11905: 0xCDA9, 26705 - 11905: 0xC9A3, 26706 - 11905: 0x96F8, 26707 - 11905: 0xBBB8, 26708 - 11905: 0xBDDB, 26709 - 11905: 0xE8EA, 26710 - 11905: 0x96F9, 26711 - 11905: 0x96FA, 26712 - 11905: 0x96FB, 26713 - 11905: 0x96FC, 26714 - 11905: 0x96FD, 26715 - 11905: 0x96FE, 26716 - 11905: 0x9740, 26717 - 11905: 0x9741, 26718 - 11905: 0x9742, 26719 - 11905: 0x9743, 26720 - 11905: 0xE8E2, 26721 - 11905: 0xE8E3, 26722 - 11905: 0xE8E5, 26723 - 11905: 0xB5B5, 26724 - 11905: 0xE8E7, 26725 - 11905: 0xC7C5, 26726 - 11905: 0xE8EB, 26727 - 11905: 0xE8ED, 26728 - 11905: 0xBDB0, 26729 - 11905: 0xD7AE, 26730 - 11905: 0x9744, 26731 - 11905: 0xE8F8, 26732 - 11905: 0x9745, 26733 - 11905: 0x9746, 26734 - 11905: 0x9747, 26735 - 11905: 0x9748, 26736 - 11905: 0x9749, 26737 - 11905: 0x974A, 26738 - 11905: 0x974B, 26739 - 11905: 0x974C, 26740 - 11905: 0xE8F5, 26741 - 11905: 0x974D, 26742 - 11905: 0xCDB0, 26743 - 11905: 0xE8F6, 26744 - 11905: 0x974E, 26745 - 11905: 0x974F, 26746 - 11905: 0x9750, 26747 - 11905: 0x9751, 26748 - 11905: 0x9752, 26749 - 11905: 0x9753, 26750 - 11905: 0x9754, 26751 - 11905: 0x9755, 26752 - 11905: 0x9756, 26753 - 11905: 0xC1BA, 26754 - 11905: 0x9757, 26755 - 11905: 0xE8E8, 26756 - 11905: 0x9758, 26757 - 11905: 0xC3B7, 26758 - 11905: 0xB0F0, 26759 - 11905: 0x9759, 26760 - 11905: 0x975A, 26761 - 11905: 0x975B, 26762 - 11905: 0x975C, 26763 - 11905: 0x975D, 26764 - 11905: 0x975E, 26765 - 11905: 0x975F, 26766 - 11905: 0x9760, 26767 - 11905: 0xE8F4, 26768 - 11905: 0x9761, 26769 - 11905: 0x9762, 26770 - 11905: 0x9763, 26771 - 11905: 0xE8F7, 26772 - 11905: 0x9764, 26773 - 11905: 0x9765, 26774 - 11905: 0x9766, 26775 - 11905: 0xB9A3, 26776 - 11905: 0x9767, 26777 - 11905: 0x9768, 26778 - 11905: 0x9769, 26779 - 11905: 0x976A, 26780 - 11905: 0x976B, 26781 - 11905: 0x976C, 26782 - 11905: 0x976D, 26783 - 11905: 0x976E, 26784 - 11905: 0x976F, 26785 - 11905: 0x9770, 26786 - 11905: 0xC9D2, 26787 - 11905: 0x9771, 26788 - 11905: 0x9772, 26789 - 11905: 0x9773, 26790 - 11905: 0xC3CE, 26791 - 11905: 0xCEE0, 26792 - 11905: 0xC0E6, 26793 - 11905: 0x9774, 26794 - 11905: 0x9775, 26795 - 11905: 0x9776, 26796 - 11905: 0x9777, 26797 - 11905: 0xCBF3, 26798 - 11905: 0x9778, 26799 - 11905: 0xCCDD, 26800 - 11905: 0xD0B5, 26801 - 11905: 0x9779, 26802 - 11905: 0x977A, 26803 - 11905: 0xCAE1, 26804 - 11905: 0x977B, 26805 - 11905: 0xE8F3, 26806 - 11905: 0x977C, 26807 - 11905: 0x977D, 26808 - 11905: 0x977E, 26809 - 11905: 0x9780, 26810 - 11905: 0x9781, 26811 - 11905: 0x9782, 26812 - 11905: 0x9783, 26813 - 11905: 0x9784, 26814 - 11905: 0x9785, 26815 - 11905: 0x9786, 26816 - 11905: 0xBCEC, 26817 - 11905: 0x9787, 26818 - 11905: 0xE8F9, 26819 - 11905: 0x9788, 26820 - 11905: 0x9789, 26821 - 11905: 0x978A, 26822 - 11905: 0x978B, 26823 - 11905: 0x978C, 26824 - 11905: 0x978D, 26825 - 11905: 0xC3DE, 26826 - 11905: 0x978E, 26827 - 11905: 0xC6E5, 26828 - 11905: 0x978F, 26829 - 11905: 0xB9F7, 26830 - 11905: 0x9790, 26831 - 11905: 0x9791, 26832 - 11905: 0x9792, 26833 - 11905: 0x9793, 26834 - 11905: 0xB0F4, 26835 - 11905: 0x9794, 26836 - 11905: 0x9795, 26837 - 11905: 0xD7D8, 26838 - 11905: 0x9796, 26839 - 11905: 0x9797, 26840 - 11905: 0xBCAC, 26841 - 11905: 0x9798, 26842 - 11905: 0xC5EF, 26843 - 11905: 0x9799, 26844 - 11905: 0x979A, 26845 - 11905: 0x979B, 26846 - 11905: 0x979C, 26847 - 11905: 0x979D, 26848 - 11905: 0xCCC4, 26849 - 11905: 0x979E, 26850 - 11905: 0x979F, 26851 - 11905: 0xE9A6, 26852 - 11905: 0x97A0, 26853 - 11905: 0x97A1, 26854 - 11905: 0x97A2, 26855 - 11905: 0x97A3, 26856 - 11905: 0x97A4, 26857 - 11905: 0x97A5, 26858 - 11905: 0x97A6, 26859 - 11905: 0x97A7, 26860 - 11905: 0x97A8, 26861 - 11905: 0x97A9, 26862 - 11905: 0xC9AD, 26863 - 11905: 0x97AA, 26864 - 11905: 0xE9A2, 26865 - 11905: 0xC0E2, 26866 - 11905: 0x97AB, 26867 - 11905: 0x97AC, 26868 - 11905: 0x97AD, 26869 - 11905: 0xBFC3, 26870 - 11905: 0x97AE, 26871 - 11905: 0x97AF, 26872 - 11905: 0x97B0, 26873 - 11905: 0xE8FE, 26874 - 11905: 0xB9D7, 26875 - 11905: 0x97B1, 26876 - 11905: 0xE8FB, 26877 - 11905: 0x97B2, 26878 - 11905: 0x97B3, 26879 - 11905: 0x97B4, 26880 - 11905: 0x97B5, 26881 - 11905: 0xE9A4, 26882 - 11905: 0x97B6, 26883 - 11905: 0x97B7, 26884 - 11905: 0x97B8, 26885 - 11905: 0xD2CE, 26886 - 11905: 0x97B9, 26887 - 11905: 0x97BA, 26888 - 11905: 0x97BB, 26889 - 11905: 0x97BC, 26890 - 11905: 0x97BD, 26891 - 11905: 0xE9A3, 26892 - 11905: 0x97BE, 26893 - 11905: 0xD6B2, 26894 - 11905: 0xD7B5, 26895 - 11905: 0x97BF, 26896 - 11905: 0xE9A7, 26897 - 11905: 0x97C0, 26898 - 11905: 0xBDB7, 26899 - 11905: 0x97C1, 26900 - 11905: 0x97C2, 26901 - 11905: 0x97C3, 26902 - 11905: 0x97C4, 26903 - 11905: 0x97C5, 26904 - 11905: 0x97C6, 26905 - 11905: 0x97C7, 26906 - 11905: 0x97C8, 26907 - 11905: 0x97C9, 26908 - 11905: 0x97CA, 26909 - 11905: 0x97CB, 26910 - 11905: 0x97CC, 26911 - 11905: 0xE8FC, 26912 - 11905: 0xE8FD, 26913 - 11905: 0x97CD, 26914 - 11905: 0x97CE, 26915 - 11905: 0x97CF, 26916 - 11905: 0xE9A1, 26917 - 11905: 0x97D0, 26918 - 11905: 0x97D1, 26919 - 11905: 0x97D2, 26920 - 11905: 0x97D3, 26921 - 11905: 0x97D4, 26922 - 11905: 0x97D5, 26923 - 11905: 0x97D6, 26924 - 11905: 0x97D7, 26925 - 11905: 0xCDD6, 26926 - 11905: 0x97D8, 26927 - 11905: 0x97D9, 26928 - 11905: 0xD2AC, 26929 - 11905: 0x97DA, 26930 - 11905: 0x97DB, 26931 - 11905: 0x97DC, 26932 - 11905: 0xE9B2, 26933 - 11905: 0x97DD, 26934 - 11905: 0x97DE, 26935 - 11905: 0x97DF, 26936 - 11905: 0x97E0, 26937 - 11905: 0xE9A9, 26938 - 11905: 0x97E1, 26939 - 11905: 0x97E2, 26940 - 11905: 0x97E3, 26941 - 11905: 0xB4AA, 26942 - 11905: 0x97E4, 26943 - 11905: 0xB4BB, 26944 - 11905: 0x97E5, 26945 - 11905: 0x97E6, 26946 - 11905: 0xE9AB, 26947 - 11905: 0x97E7, 26948 - 11905: 0x97E8, 26949 - 11905: 0x97E9, 26950 - 11905: 0x97EA, 26951 - 11905: 0x97EB, 26952 - 11905: 0x97EC, 26953 - 11905: 0x97ED, 26954 - 11905: 0x97EE, 26955 - 11905: 0x97EF, 26956 - 11905: 0x97F0, 26957 - 11905: 0x97F1, 26958 - 11905: 0x97F2, 26959 - 11905: 0x97F3, 26960 - 11905: 0x97F4, 26961 - 11905: 0x97F5, 26962 - 11905: 0x97F6, 26963 - 11905: 0x97F7, 26964 - 11905: 0xD0A8, 26965 - 11905: 0x97F8, 26966 - 11905: 0x97F9, 26967 - 11905: 0xE9A5, 26968 - 11905: 0x97FA, 26969 - 11905: 0x97FB, 26970 - 11905: 0xB3FE, 26971 - 11905: 0x97FC, 26972 - 11905: 0x97FD, 26973 - 11905: 0xE9AC, 26974 - 11905: 0xC0E3, 26975 - 11905: 0x97FE, 26976 - 11905: 0xE9AA, 26977 - 11905: 0x9840, 26978 - 11905: 0x9841, 26979 - 11905: 0xE9B9, 26980 - 11905: 0x9842, 26981 - 11905: 0x9843, 26982 - 11905: 0xE9B8, 26983 - 11905: 0x9844, 26984 - 11905: 0x9845, 26985 - 11905: 0x9846, 26986 - 11905: 0x9847, 26987 - 11905: 0xE9AE, 26988 - 11905: 0x9848, 26989 - 11905: 0x9849, 26990 - 11905: 0xE8FA, 26991 - 11905: 0x984A, 26992 - 11905: 0x984B, 26993 - 11905: 0xE9A8, 26994 - 11905: 0x984C, 26995 - 11905: 0x984D, 26996 - 11905: 0x984E, 26997 - 11905: 0x984F, 26998 - 11905: 0x9850, 26999 - 11905: 0xBFAC, 27000 - 11905: 0xE9B1, 27001 - 11905: 0xE9BA, 27002 - 11905: 0x9851, 27003 - 11905: 0x9852, 27004 - 11905: 0xC2A5, 27005 - 11905: 0x9853, 27006 - 11905: 0x9854, 27007 - 11905: 0x9855, 27008 - 11905: 0xE9AF, 27009 - 11905: 0x9856, 27010 - 11905: 0xB8C5, 27011 - 11905: 0x9857, 27012 - 11905: 0xE9AD, 27013 - 11905: 0x9858, 27014 - 11905: 0xD3DC, 27015 - 11905: 0xE9B4, 27016 - 11905: 0xE9B5, 27017 - 11905: 0xE9B7, 27018 - 11905: 0x9859, 27019 - 11905: 0x985A, 27020 - 11905: 0x985B, 27021 - 11905: 0xE9C7, 27022 - 11905: 0x985C, 27023 - 11905: 0x985D, 27024 - 11905: 0x985E, 27025 - 11905: 0x985F, 27026 - 11905: 0x9860, 27027 - 11905: 0x9861, 27028 - 11905: 0xC0C6, 27029 - 11905: 0xE9C5, 27030 - 11905: 0x9862, 27031 - 11905: 0x9863, 27032 - 11905: 0xE9B0, 27033 - 11905: 0x9864, 27034 - 11905: 0x9865, 27035 - 11905: 0xE9BB, 27036 - 11905: 0xB0F1, 27037 - 11905: 0x9866, 27038 - 11905: 0x9867, 27039 - 11905: 0x9868, 27040 - 11905: 0x9869, 27041 - 11905: 0x986A, 27042 - 11905: 0x986B, 27043 - 11905: 0x986C, 27044 - 11905: 0x986D, 27045 - 11905: 0x986E, 27046 - 11905: 0x986F, 27047 - 11905: 0xE9BC, 27048 - 11905: 0xD5A5, 27049 - 11905: 0x9870, 27050 - 11905: 0x9871, 27051 - 11905: 0xE9BE, 27052 - 11905: 0x9872, 27053 - 11905: 0xE9BF, 27054 - 11905: 0x9873, 27055 - 11905: 0x9874, 27056 - 11905: 0x9875, 27057 - 11905: 0xE9C1, 27058 - 11905: 0x9876, 27059 - 11905: 0x9877, 27060 - 11905: 0xC1F1, 27061 - 11905: 0x9878, 27062 - 11905: 0x9879, 27063 - 11905: 0xC8B6, 27064 - 11905: 0x987A, 27065 - 11905: 0x987B, 27066 - 11905: 0x987C, 27067 - 11905: 0xE9BD, 27068 - 11905: 0x987D, 27069 - 11905: 0x987E, 27070 - 11905: 0x9880, 27071 - 11905: 0x9881, 27072 - 11905: 0x9882, 27073 - 11905: 0xE9C2, 27074 - 11905: 0x9883, 27075 - 11905: 0x9884, 27076 - 11905: 0x9885, 27077 - 11905: 0x9886, 27078 - 11905: 0x9887, 27079 - 11905: 0x9888, 27080 - 11905: 0x9889, 27081 - 11905: 0x988A, 27082 - 11905: 0xE9C3, 27083 - 11905: 0x988B, 27084 - 11905: 0xE9B3, 27085 - 11905: 0x988C, 27086 - 11905: 0xE9B6, 27087 - 11905: 0x988D, 27088 - 11905: 0xBBB1, 27089 - 11905: 0x988E, 27090 - 11905: 0x988F, 27091 - 11905: 0x9890, 27092 - 11905: 0xE9C0, 27093 - 11905: 0x9891, 27094 - 11905: 0x9892, 27095 - 11905: 0x9893, 27096 - 11905: 0x9894, 27097 - 11905: 0x9895, 27098 - 11905: 0x9896, 27099 - 11905: 0xBCF7, 27100 - 11905: 0x9897, 27101 - 11905: 0x9898, 27102 - 11905: 0x9899, 27103 - 11905: 0xE9C4, 27104 - 11905: 0xE9C6, 27105 - 11905: 0x989A, 27106 - 11905: 0x989B, 27107 - 11905: 0x989C, 27108 - 11905: 0x989D, 27109 - 11905: 0x989E, 27110 - 11905: 0x989F, 27111 - 11905: 0x98A0, 27112 - 11905: 0x98A1, 27113 - 11905: 0x98A2, 27114 - 11905: 0x98A3, 27115 - 11905: 0x98A4, 27116 - 11905: 0x98A5, 27117 - 11905: 0xE9CA, 27118 - 11905: 0x98A6, 27119 - 11905: 0x98A7, 27120 - 11905: 0x98A8, 27121 - 11905: 0x98A9, 27122 - 11905: 0xE9CE, 27123 - 11905: 0x98AA, 27124 - 11905: 0x98AB, 27125 - 11905: 0x98AC, 27126 - 11905: 0x98AD, 27127 - 11905: 0x98AE, 27128 - 11905: 0x98AF, 27129 - 11905: 0x98B0, 27130 - 11905: 0x98B1, 27131 - 11905: 0x98B2, 27132 - 11905: 0x98B3, 27133 - 11905: 0xB2DB, 27134 - 11905: 0x98B4, 27135 - 11905: 0xE9C8, 27136 - 11905: 0x98B5, 27137 - 11905: 0x98B6, 27138 - 11905: 0x98B7, 27139 - 11905: 0x98B8, 27140 - 11905: 0x98B9, 27141 - 11905: 0x98BA, 27142 - 11905: 0x98BB, 27143 - 11905: 0x98BC, 27144 - 11905: 0x98BD, 27145 - 11905: 0x98BE, 27146 - 11905: 0xB7AE, 27147 - 11905: 0x98BF, 27148 - 11905: 0x98C0, 27149 - 11905: 0x98C1, 27150 - 11905: 0x98C2, 27151 - 11905: 0x98C3, 27152 - 11905: 0x98C4, 27153 - 11905: 0x98C5, 27154 - 11905: 0x98C6, 27155 - 11905: 0x98C7, 27156 - 11905: 0x98C8, 27157 - 11905: 0x98C9, 27158 - 11905: 0x98CA, 27159 - 11905: 0xE9CB, 27160 - 11905: 0xE9CC, 27161 - 11905: 0x98CB, 27162 - 11905: 0x98CC, 27163 - 11905: 0x98CD, 27164 - 11905: 0x98CE, 27165 - 11905: 0x98CF, 27166 - 11905: 0x98D0, 27167 - 11905: 0xD5C1, 27168 - 11905: 0x98D1, 27169 - 11905: 0xC4A3, 27170 - 11905: 0x98D2, 27171 - 11905: 0x98D3, 27172 - 11905: 0x98D4, 27173 - 11905: 0x98D5, 27174 - 11905: 0x98D6, 27175 - 11905: 0x98D7, 27176 - 11905: 0xE9D8, 27177 - 11905: 0x98D8, 27178 - 11905: 0xBAE1, 27179 - 11905: 0x98D9, 27180 - 11905: 0x98DA, 27181 - 11905: 0x98DB, 27182 - 11905: 0x98DC, 27183 - 11905: 0xE9C9, 27184 - 11905: 0x98DD, 27185 - 11905: 0xD3A3, 27186 - 11905: 0x98DE, 27187 - 11905: 0x98DF, 27188 - 11905: 0x98E0, 27189 - 11905: 0xE9D4, 27190 - 11905: 0x98E1, 27191 - 11905: 0x98E2, 27192 - 11905: 0x98E3, 27193 - 11905: 0x98E4, 27194 - 11905: 0x98E5, 27195 - 11905: 0x98E6, 27196 - 11905: 0x98E7, 27197 - 11905: 0xE9D7, 27198 - 11905: 0xE9D0, 27199 - 11905: 0x98E8, 27200 - 11905: 0x98E9, 27201 - 11905: 0x98EA, 27202 - 11905: 0x98EB, 27203 - 11905: 0x98EC, 27204 - 11905: 0xE9CF, 27205 - 11905: 0x98ED, 27206 - 11905: 0x98EE, 27207 - 11905: 0xC7C1, 27208 - 11905: 0x98EF, 27209 - 11905: 0x98F0, 27210 - 11905: 0x98F1, 27211 - 11905: 0x98F2, 27212 - 11905: 0x98F3, 27213 - 11905: 0x98F4, 27214 - 11905: 0x98F5, 27215 - 11905: 0x98F6, 27216 - 11905: 0xE9D2, 27217 - 11905: 0x98F7, 27218 - 11905: 0x98F8, 27219 - 11905: 0x98F9, 27220 - 11905: 0x98FA, 27221 - 11905: 0x98FB, 27222 - 11905: 0x98FC, 27223 - 11905: 0x98FD, 27224 - 11905: 0xE9D9, 27225 - 11905: 0xB3C8, 27226 - 11905: 0x98FE, 27227 - 11905: 0xE9D3, 27228 - 11905: 0x9940, 27229 - 11905: 0x9941, 27230 - 11905: 0x9942, 27231 - 11905: 0x9943, 27232 - 11905: 0x9944, 27233 - 11905: 0xCFF0, 27234 - 11905: 0x9945, 27235 - 11905: 0x9946, 27236 - 11905: 0x9947, 27237 - 11905: 0xE9CD, 27238 - 11905: 0x9948, 27239 - 11905: 0x9949, 27240 - 11905: 0x994A, 27241 - 11905: 0x994B, 27242 - 11905: 0x994C, 27243 - 11905: 0x994D, 27244 - 11905: 0x994E, 27245 - 11905: 0x994F, 27246 - 11905: 0x9950, 27247 - 11905: 0x9951, 27248 - 11905: 0x9952, 27249 - 11905: 0xB3F7, 27250 - 11905: 0x9953, 27251 - 11905: 0x9954, 27252 - 11905: 0x9955, 27253 - 11905: 0x9956, 27254 - 11905: 0x9957, 27255 - 11905: 0x9958, 27256 - 11905: 0x9959, 27257 - 11905: 0xE9D6, 27258 - 11905: 0x995A, 27259 - 11905: 0x995B, 27260 - 11905: 0xE9DA, 27261 - 11905: 0x995C, 27262 - 11905: 0x995D, 27263 - 11905: 0x995E, 27264 - 11905: 0xCCB4, 27265 - 11905: 0x995F, 27266 - 11905: 0x9960, 27267 - 11905: 0x9961, 27268 - 11905: 0xCFAD, 27269 - 11905: 0x9962, 27270 - 11905: 0x9963, 27271 - 11905: 0x9964, 27272 - 11905: 0x9965, 27273 - 11905: 0x9966, 27274 - 11905: 0x9967, 27275 - 11905: 0x9968, 27276 - 11905: 0x9969, 27277 - 11905: 0x996A, 27278 - 11905: 0xE9D5, 27279 - 11905: 0x996B, 27280 - 11905: 0xE9DC, 27281 - 11905: 0xE9DB, 27282 - 11905: 0x996C, 27283 - 11905: 0x996D, 27284 - 11905: 0x996E, 27285 - 11905: 0x996F, 27286 - 11905: 0x9970, 27287 - 11905: 0xE9DE, 27288 - 11905: 0x9971, 27289 - 11905: 0x9972, 27290 - 11905: 0x9973, 27291 - 11905: 0x9974, 27292 - 11905: 0x9975, 27293 - 11905: 0x9976, 27294 - 11905: 0x9977, 27295 - 11905: 0x9978, 27296 - 11905: 0xE9D1, 27297 - 11905: 0x9979, 27298 - 11905: 0x997A, 27299 - 11905: 0x997B, 27300 - 11905: 0x997C, 27301 - 11905: 0x997D, 27302 - 11905: 0x997E, 27303 - 11905: 0x9980, 27304 - 11905: 0x9981, 27305 - 11905: 0xE9DD, 27306 - 11905: 0x9982, 27307 - 11905: 0xE9DF, 27308 - 11905: 0xC3CA, 27309 - 11905: 0x9983, 27310 - 11905: 0x9984, 27311 - 11905: 0x9985, 27312 - 11905: 0x9986, 27313 - 11905: 0x9987, 27314 - 11905: 0x9988, 27315 - 11905: 0x9989, 27316 - 11905: 0x998A, 27317 - 11905: 0x998B, 27318 - 11905: 0x998C, 27319 - 11905: 0x998D, 27320 - 11905: 0x998E, 27321 - 11905: 0x998F, 27322 - 11905: 0x9990, 27323 - 11905: 0x9991, 27324 - 11905: 0x9992, 27325 - 11905: 0x9993, 27326 - 11905: 0x9994, 27327 - 11905: 0x9995, 27328 - 11905: 0x9996, 27329 - 11905: 0x9997, 27330 - 11905: 0x9998, 27331 - 11905: 0x9999, 27332 - 11905: 0x999A, 27333 - 11905: 0x999B, 27334 - 11905: 0x999C, 27335 - 11905: 0x999D, 27336 - 11905: 0x999E, 27337 - 11905: 0x999F, 27338 - 11905: 0x99A0, 27339 - 11905: 0x99A1, 27340 - 11905: 0x99A2, 27341 - 11905: 0x99A3, 27342 - 11905: 0x99A4, 27343 - 11905: 0x99A5, 27344 - 11905: 0x99A6, 27345 - 11905: 0x99A7, 27346 - 11905: 0x99A8, 27347 - 11905: 0x99A9, 27348 - 11905: 0x99AA, 27349 - 11905: 0x99AB, 27350 - 11905: 0x99AC, 27351 - 11905: 0x99AD, 27352 - 11905: 0x99AE, 27353 - 11905: 0x99AF, 27354 - 11905: 0x99B0, 27355 - 11905: 0x99B1, 27356 - 11905: 0x99B2, 27357 - 11905: 0x99B3, 27358 - 11905: 0x99B4, 27359 - 11905: 0x99B5, 27360 - 11905: 0x99B6, 27361 - 11905: 0x99B7, 27362 - 11905: 0x99B8, 27363 - 11905: 0x99B9, 27364 - 11905: 0x99BA, 27365 - 11905: 0x99BB, 27366 - 11905: 0x99BC, 27367 - 11905: 0x99BD, 27368 - 11905: 0x99BE, 27369 - 11905: 0x99BF, 27370 - 11905: 0x99C0, 27371 - 11905: 0x99C1, 27372 - 11905: 0x99C2, 27373 - 11905: 0x99C3, 27374 - 11905: 0x99C4, 27375 - 11905: 0x99C5, 27376 - 11905: 0x99C6, 27377 - 11905: 0x99C7, 27378 - 11905: 0x99C8, 27379 - 11905: 0x99C9, 27380 - 11905: 0x99CA, 27381 - 11905: 0x99CB, 27382 - 11905: 0x99CC, 27383 - 11905: 0x99CD, 27384 - 11905: 0x99CE, 27385 - 11905: 0x99CF, 27386 - 11905: 0x99D0, 27387 - 11905: 0x99D1, 27388 - 11905: 0x99D2, 27389 - 11905: 0x99D3, 27390 - 11905: 0x99D4, 27391 - 11905: 0x99D5, 27392 - 11905: 0x99D6, 27393 - 11905: 0x99D7, 27394 - 11905: 0x99D8, 27395 - 11905: 0x99D9, 27396 - 11905: 0x99DA, 27397 - 11905: 0x99DB, 27398 - 11905: 0x99DC, 27399 - 11905: 0x99DD, 27400 - 11905: 0x99DE, 27401 - 11905: 0x99DF, 27402 - 11905: 0x99E0, 27403 - 11905: 0x99E1, 27404 - 11905: 0x99E2, 27405 - 11905: 0x99E3, 27406 - 11905: 0x99E4, 27407 - 11905: 0x99E5, 27408 - 11905: 0x99E6, 27409 - 11905: 0x99E7, 27410 - 11905: 0x99E8, 27411 - 11905: 0x99E9, 27412 - 11905: 0x99EA, 27413 - 11905: 0x99EB, 27414 - 11905: 0x99EC, 27415 - 11905: 0x99ED, 27416 - 11905: 0x99EE, 27417 - 11905: 0x99EF, 27418 - 11905: 0x99F0, 27419 - 11905: 0x99F1, 27420 - 11905: 0x99F2, 27421 - 11905: 0x99F3, 27422 - 11905: 0x99F4, 27423 - 11905: 0x99F5, 27424 - 11905: 0xC7B7, 27425 - 11905: 0xB4CE, 27426 - 11905: 0xBBB6, 27427 - 11905: 0xD0C0, 27428 - 11905: 0xECA3, 27429 - 11905: 0x99F6, 27430 - 11905: 0x99F7, 27431 - 11905: 0xC5B7, 27432 - 11905: 0x99F8, 27433 - 11905: 0x99F9, 27434 - 11905: 0x99FA, 27435 - 11905: 0x99FB, 27436 - 11905: 0x99FC, 27437 - 11905: 0x99FD, 27438 - 11905: 0x99FE, 27439 - 11905: 0x9A40, 27440 - 11905: 0x9A41, 27441 - 11905: 0x9A42, 27442 - 11905: 0xD3FB, 27443 - 11905: 0x9A43, 27444 - 11905: 0x9A44, 27445 - 11905: 0x9A45, 27446 - 11905: 0x9A46, 27447 - 11905: 0xECA4, 27448 - 11905: 0x9A47, 27449 - 11905: 0xECA5, 27450 - 11905: 0xC6DB, 27451 - 11905: 0x9A48, 27452 - 11905: 0x9A49, 27453 - 11905: 0x9A4A, 27454 - 11905: 0xBFEE, 27455 - 11905: 0x9A4B, 27456 - 11905: 0x9A4C, 27457 - 11905: 0x9A4D, 27458 - 11905: 0x9A4E, 27459 - 11905: 0xECA6, 27460 - 11905: 0x9A4F, 27461 - 11905: 0x9A50, 27462 - 11905: 0xECA7, 27463 - 11905: 0xD0AA, 27464 - 11905: 0x9A51, 27465 - 11905: 0xC7B8, 27466 - 11905: 0x9A52, 27467 - 11905: 0x9A53, 27468 - 11905: 0xB8E8, 27469 - 11905: 0x9A54, 27470 - 11905: 0x9A55, 27471 - 11905: 0x9A56, 27472 - 11905: 0x9A57, 27473 - 11905: 0x9A58, 27474 - 11905: 0x9A59, 27475 - 11905: 0x9A5A, 27476 - 11905: 0x9A5B, 27477 - 11905: 0x9A5C, 27478 - 11905: 0x9A5D, 27479 - 11905: 0x9A5E, 27480 - 11905: 0x9A5F, 27481 - 11905: 0xECA8, 27482 - 11905: 0x9A60, 27483 - 11905: 0x9A61, 27484 - 11905: 0x9A62, 27485 - 11905: 0x9A63, 27486 - 11905: 0x9A64, 27487 - 11905: 0x9A65, 27488 - 11905: 0x9A66, 27489 - 11905: 0x9A67, 27490 - 11905: 0xD6B9, 27491 - 11905: 0xD5FD, 27492 - 11905: 0xB4CB, 27493 - 11905: 0xB2BD, 27494 - 11905: 0xCEE4, 27495 - 11905: 0xC6E7, 27496 - 11905: 0x9A68, 27497 - 11905: 0x9A69, 27498 - 11905: 0xCDE1, 27499 - 11905: 0x9A6A, 27500 - 11905: 0x9A6B, 27501 - 11905: 0x9A6C, 27502 - 11905: 0x9A6D, 27503 - 11905: 0x9A6E, 27504 - 11905: 0x9A6F, 27505 - 11905: 0x9A70, 27506 - 11905: 0x9A71, 27507 - 11905: 0x9A72, 27508 - 11905: 0x9A73, 27509 - 11905: 0x9A74, 27510 - 11905: 0x9A75, 27511 - 11905: 0x9A76, 27512 - 11905: 0x9A77, 27513 - 11905: 0xB4F5, 27514 - 11905: 0x9A78, 27515 - 11905: 0xCBC0, 27516 - 11905: 0xBCDF, 27517 - 11905: 0x9A79, 27518 - 11905: 0x9A7A, 27519 - 11905: 0x9A7B, 27520 - 11905: 0x9A7C, 27521 - 11905: 0xE9E2, 27522 - 11905: 0xE9E3, 27523 - 11905: 0xD1EA, 27524 - 11905: 0xE9E5, 27525 - 11905: 0x9A7D, 27526 - 11905: 0xB4F9, 27527 - 11905: 0xE9E4, 27528 - 11905: 0x9A7E, 27529 - 11905: 0xD1B3, 27530 - 11905: 0xCAE2, 27531 - 11905: 0xB2D0, 27532 - 11905: 0x9A80, 27533 - 11905: 0xE9E8, 27534 - 11905: 0x9A81, 27535 - 11905: 0x9A82, 27536 - 11905: 0x9A83, 27537 - 11905: 0x9A84, 27538 - 11905: 0xE9E6, 27539 - 11905: 0xE9E7, 27540 - 11905: 0x9A85, 27541 - 11905: 0x9A86, 27542 - 11905: 0xD6B3, 27543 - 11905: 0x9A87, 27544 - 11905: 0x9A88, 27545 - 11905: 0x9A89, 27546 - 11905: 0xE9E9, 27547 - 11905: 0xE9EA, 27548 - 11905: 0x9A8A, 27549 - 11905: 0x9A8B, 27550 - 11905: 0x9A8C, 27551 - 11905: 0x9A8D, 27552 - 11905: 0x9A8E, 27553 - 11905: 0xE9EB, 27554 - 11905: 0x9A8F, 27555 - 11905: 0x9A90, 27556 - 11905: 0x9A91, 27557 - 11905: 0x9A92, 27558 - 11905: 0x9A93, 27559 - 11905: 0x9A94, 27560 - 11905: 0x9A95, 27561 - 11905: 0x9A96, 27562 - 11905: 0xE9EC, 27563 - 11905: 0x9A97, 27564 - 11905: 0x9A98, 27565 - 11905: 0x9A99, 27566 - 11905: 0x9A9A, 27567 - 11905: 0x9A9B, 27568 - 11905: 0x9A9C, 27569 - 11905: 0x9A9D, 27570 - 11905: 0x9A9E, 27571 - 11905: 0xECAF, 27572 - 11905: 0xC5B9, 27573 - 11905: 0xB6CE, 27574 - 11905: 0x9A9F, 27575 - 11905: 0xD2F3, 27576 - 11905: 0x9AA0, 27577 - 11905: 0x9AA1, 27578 - 11905: 0x9AA2, 27579 - 11905: 0x9AA3, 27580 - 11905: 0x9AA4, 27581 - 11905: 0x9AA5, 27582 - 11905: 0x9AA6, 27583 - 11905: 0xB5EE, 27584 - 11905: 0x9AA7, 27585 - 11905: 0xBBD9, 27586 - 11905: 0xECB1, 27587 - 11905: 0x9AA8, 27588 - 11905: 0x9AA9, 27589 - 11905: 0xD2E3, 27590 - 11905: 0x9AAA, 27591 - 11905: 0x9AAB, 27592 - 11905: 0x9AAC, 27593 - 11905: 0x9AAD, 27594 - 11905: 0x9AAE, 27595 - 11905: 0xCEE3, 27596 - 11905: 0x9AAF, 27597 - 11905: 0xC4B8, 27598 - 11905: 0x9AB0, 27599 - 11905: 0xC3BF, 27600 - 11905: 0x9AB1, 27601 - 11905: 0x9AB2, 27602 - 11905: 0xB6BE, 27603 - 11905: 0xD8B9, 27604 - 11905: 0xB1C8, 27605 - 11905: 0xB1CF, 27606 - 11905: 0xB1D1, 27607 - 11905: 0xC5FE, 27608 - 11905: 0x9AB3, 27609 - 11905: 0xB1D0, 27610 - 11905: 0x9AB4, 27611 - 11905: 0xC3AB, 27612 - 11905: 0x9AB5, 27613 - 11905: 0x9AB6, 27614 - 11905: 0x9AB7, 27615 - 11905: 0x9AB8, 27616 - 11905: 0x9AB9, 27617 - 11905: 0xD5B1, 27618 - 11905: 0x9ABA, 27619 - 11905: 0x9ABB, 27620 - 11905: 0x9ABC, 27621 - 11905: 0x9ABD, 27622 - 11905: 0x9ABE, 27623 - 11905: 0x9ABF, 27624 - 11905: 0x9AC0, 27625 - 11905: 0x9AC1, 27626 - 11905: 0xEBA4, 27627 - 11905: 0xBAC1, 27628 - 11905: 0x9AC2, 27629 - 11905: 0x9AC3, 27630 - 11905: 0x9AC4, 27631 - 11905: 0xCCBA, 27632 - 11905: 0x9AC5, 27633 - 11905: 0x9AC6, 27634 - 11905: 0x9AC7, 27635 - 11905: 0xEBA5, 27636 - 11905: 0x9AC8, 27637 - 11905: 0xEBA7, 27638 - 11905: 0x9AC9, 27639 - 11905: 0x9ACA, 27640 - 11905: 0x9ACB, 27641 - 11905: 0xEBA8, 27642 - 11905: 0x9ACC, 27643 - 11905: 0x9ACD, 27644 - 11905: 0x9ACE, 27645 - 11905: 0xEBA6, 27646 - 11905: 0x9ACF, 27647 - 11905: 0x9AD0, 27648 - 11905: 0x9AD1, 27649 - 11905: 0x9AD2, 27650 - 11905: 0x9AD3, 27651 - 11905: 0x9AD4, 27652 - 11905: 0x9AD5, 27653 - 11905: 0xEBA9, 27654 - 11905: 0xEBAB, 27655 - 11905: 0xEBAA, 27656 - 11905: 0x9AD6, 27657 - 11905: 0x9AD7, 27658 - 11905: 0x9AD8, 27659 - 11905: 0x9AD9, 27660 - 11905: 0x9ADA, 27661 - 11905: 0xEBAC, 27662 - 11905: 0x9ADB, 27663 - 11905: 0xCACF, 27664 - 11905: 0xD8B5, 27665 - 11905: 0xC3F1, 27666 - 11905: 0x9ADC, 27667 - 11905: 0xC3A5, 27668 - 11905: 0xC6F8, 27669 - 11905: 0xEBAD, 27670 - 11905: 0xC4CA, 27671 - 11905: 0x9ADD, 27672 - 11905: 0xEBAE, 27673 - 11905: 0xEBAF, 27674 - 11905: 0xEBB0, 27675 - 11905: 0xB7D5, 27676 - 11905: 0x9ADE, 27677 - 11905: 0x9ADF, 27678 - 11905: 0x9AE0, 27679 - 11905: 0xB7FA, 27680 - 11905: 0x9AE1, 27681 - 11905: 0xEBB1, 27682 - 11905: 0xC7E2, 27683 - 11905: 0x9AE2, 27684 - 11905: 0xEBB3, 27685 - 11905: 0x9AE3, 27686 - 11905: 0xBAA4, 27687 - 11905: 0xD1F5, 27688 - 11905: 0xB0B1, 27689 - 11905: 0xEBB2, 27690 - 11905: 0xEBB4, 27691 - 11905: 0x9AE4, 27692 - 11905: 0x9AE5, 27693 - 11905: 0x9AE6, 27694 - 11905: 0xB5AA, 27695 - 11905: 0xC2C8, 27696 - 11905: 0xC7E8, 27697 - 11905: 0x9AE7, 27698 - 11905: 0xEBB5, 27699 - 11905: 0x9AE8, 27700 - 11905: 0xCBAE, 27701 - 11905: 0xE3DF, 27702 - 11905: 0x9AE9, 27703 - 11905: 0x9AEA, 27704 - 11905: 0xD3C0, 27705 - 11905: 0x9AEB, 27706 - 11905: 0x9AEC, 27707 - 11905: 0x9AED, 27708 - 11905: 0x9AEE, 27709 - 11905: 0xD9DB, 27710 - 11905: 0x9AEF, 27711 - 11905: 0x9AF0, 27712 - 11905: 0xCDA1, 27713 - 11905: 0xD6AD, 27714 - 11905: 0xC7F3, 27715 - 11905: 0x9AF1, 27716 - 11905: 0x9AF2, 27717 - 11905: 0x9AF3, 27718 - 11905: 0xD9E0, 27719 - 11905: 0xBBE3, 27720 - 11905: 0x9AF4, 27721 - 11905: 0xBABA, 27722 - 11905: 0xE3E2, 27723 - 11905: 0x9AF5, 27724 - 11905: 0x9AF6, 27725 - 11905: 0x9AF7, 27726 - 11905: 0x9AF8, 27727 - 11905: 0x9AF9, 27728 - 11905: 0xCFAB, 27729 - 11905: 0x9AFA, 27730 - 11905: 0x9AFB, 27731 - 11905: 0x9AFC, 27732 - 11905: 0xE3E0, 27733 - 11905: 0xC9C7, 27734 - 11905: 0x9AFD, 27735 - 11905: 0xBAB9, 27736 - 11905: 0x9AFE, 27737 - 11905: 0x9B40, 27738 - 11905: 0x9B41, 27739 - 11905: 0xD1B4, 27740 - 11905: 0xE3E1, 27741 - 11905: 0xC8EA, 27742 - 11905: 0xB9AF, 27743 - 11905: 0xBDAD, 27744 - 11905: 0xB3D8, 27745 - 11905: 0xCEDB, 27746 - 11905: 0x9B42, 27747 - 11905: 0x9B43, 27748 - 11905: 0xCCC0, 27749 - 11905: 0x9B44, 27750 - 11905: 0x9B45, 27751 - 11905: 0x9B46, 27752 - 11905: 0xE3E8, 27753 - 11905: 0xE3E9, 27754 - 11905: 0xCDF4, 27755 - 11905: 0x9B47, 27756 - 11905: 0x9B48, 27757 - 11905: 0x9B49, 27758 - 11905: 0x9B4A, 27759 - 11905: 0x9B4B, 27760 - 11905: 0xCCAD, 27761 - 11905: 0x9B4C, 27762 - 11905: 0xBCB3, 27763 - 11905: 0x9B4D, 27764 - 11905: 0xE3EA, 27765 - 11905: 0x9B4E, 27766 - 11905: 0xE3EB, 27767 - 11905: 0x9B4F, 27768 - 11905: 0x9B50, 27769 - 11905: 0xD0DA, 27770 - 11905: 0x9B51, 27771 - 11905: 0x9B52, 27772 - 11905: 0x9B53, 27773 - 11905: 0xC6FB, 27774 - 11905: 0xB7DA, 27775 - 11905: 0x9B54, 27776 - 11905: 0x9B55, 27777 - 11905: 0xC7DF, 27778 - 11905: 0xD2CA, 27779 - 11905: 0xCED6, 27780 - 11905: 0x9B56, 27781 - 11905: 0xE3E4, 27782 - 11905: 0xE3EC, 27783 - 11905: 0x9B57, 27784 - 11905: 0xC9F2, 27785 - 11905: 0xB3C1, 27786 - 11905: 0x9B58, 27787 - 11905: 0x9B59, 27788 - 11905: 0xE3E7, 27789 - 11905: 0x9B5A, 27790 - 11905: 0x9B5B, 27791 - 11905: 0xC6E3, 27792 - 11905: 0xE3E5, 27793 - 11905: 0x9B5C, 27794 - 11905: 0x9B5D, 27795 - 11905: 0xEDB3, 27796 - 11905: 0xE3E6, 27797 - 11905: 0x9B5E, 27798 - 11905: 0x9B5F, 27799 - 11905: 0x9B60, 27800 - 11905: 0x9B61, 27801 - 11905: 0xC9B3, 27802 - 11905: 0x9B62, 27803 - 11905: 0xC5E6, 27804 - 11905: 0x9B63, 27805 - 11905: 0x9B64, 27806 - 11905: 0x9B65, 27807 - 11905: 0xB9B5, 27808 - 11905: 0x9B66, 27809 - 11905: 0xC3BB, 27810 - 11905: 0x9B67, 27811 - 11905: 0xE3E3, 27812 - 11905: 0xC5BD, 27813 - 11905: 0xC1A4, 27814 - 11905: 0xC2D9, 27815 - 11905: 0xB2D7, 27816 - 11905: 0x9B68, 27817 - 11905: 0xE3ED, 27818 - 11905: 0xBBA6, 27819 - 11905: 0xC4AD, 27820 - 11905: 0x9B69, 27821 - 11905: 0xE3F0, 27822 - 11905: 0xBEDA, 27823 - 11905: 0x9B6A, 27824 - 11905: 0x9B6B, 27825 - 11905: 0xE3FB, 27826 - 11905: 0xE3F5, 27827 - 11905: 0xBAD3, 27828 - 11905: 0x9B6C, 27829 - 11905: 0x9B6D, 27830 - 11905: 0x9B6E, 27831 - 11905: 0x9B6F, 27832 - 11905: 0xB7D0, 27833 - 11905: 0xD3CD, 27834 - 11905: 0x9B70, 27835 - 11905: 0xD6CE, 27836 - 11905: 0xD5D3, 27837 - 11905: 0xB9C1, 27838 - 11905: 0xD5B4, 27839 - 11905: 0xD1D8, 27840 - 11905: 0x9B71, 27841 - 11905: 0x9B72, 27842 - 11905: 0x9B73, 27843 - 11905: 0x9B74, 27844 - 11905: 0xD0B9, 27845 - 11905: 0xC7F6, 27846 - 11905: 0x9B75, 27847 - 11905: 0x9B76, 27848 - 11905: 0x9B77, 27849 - 11905: 0xC8AA, 27850 - 11905: 0xB2B4, 27851 - 11905: 0x9B78, 27852 - 11905: 0xC3DA, 27853 - 11905: 0x9B79, 27854 - 11905: 0x9B7A, 27855 - 11905: 0x9B7B, 27856 - 11905: 0xE3EE, 27857 - 11905: 0x9B7C, 27858 - 11905: 0x9B7D, 27859 - 11905: 0xE3FC, 27860 - 11905: 0xE3EF, 27861 - 11905: 0xB7A8, 27862 - 11905: 0xE3F7, 27863 - 11905: 0xE3F4, 27864 - 11905: 0x9B7E, 27865 - 11905: 0x9B80, 27866 - 11905: 0x9B81, 27867 - 11905: 0xB7BA, 27868 - 11905: 0x9B82, 27869 - 11905: 0x9B83, 27870 - 11905: 0xC5A2, 27871 - 11905: 0x9B84, 27872 - 11905: 0xE3F6, 27873 - 11905: 0xC5DD, 27874 - 11905: 0xB2A8, 27875 - 11905: 0xC6FC, 27876 - 11905: 0x9B85, 27877 - 11905: 0xC4E0, 27878 - 11905: 0x9B86, 27879 - 11905: 0x9B87, 27880 - 11905: 0xD7A2, 27881 - 11905: 0x9B88, 27882 - 11905: 0xC0E1, 27883 - 11905: 0xE3F9, 27884 - 11905: 0x9B89, 27885 - 11905: 0x9B8A, 27886 - 11905: 0xE3FA, 27887 - 11905: 0xE3FD, 27888 - 11905: 0xCCA9, 27889 - 11905: 0xE3F3, 27890 - 11905: 0x9B8B, 27891 - 11905: 0xD3BE, 27892 - 11905: 0x9B8C, 27893 - 11905: 0xB1C3, 27894 - 11905: 0xEDB4, 27895 - 11905: 0xE3F1, 27896 - 11905: 0xE3F2, 27897 - 11905: 0x9B8D, 27898 - 11905: 0xE3F8, 27899 - 11905: 0xD0BA, 27900 - 11905: 0xC6C3, 27901 - 11905: 0xD4F3, 27902 - 11905: 0xE3FE, 27903 - 11905: 0x9B8E, 27904 - 11905: 0x9B8F, 27905 - 11905: 0xBDE0, 27906 - 11905: 0x9B90, 27907 - 11905: 0x9B91, 27908 - 11905: 0xE4A7, 27909 - 11905: 0x9B92, 27910 - 11905: 0x9B93, 27911 - 11905: 0xE4A6, 27912 - 11905: 0x9B94, 27913 - 11905: 0x9B95, 27914 - 11905: 0x9B96, 27915 - 11905: 0xD1F3, 27916 - 11905: 0xE4A3, 27917 - 11905: 0x9B97, 27918 - 11905: 0xE4A9, 27919 - 11905: 0x9B98, 27920 - 11905: 0x9B99, 27921 - 11905: 0x9B9A, 27922 - 11905: 0xC8F7, 27923 - 11905: 0x9B9B, 27924 - 11905: 0x9B9C, 27925 - 11905: 0x9B9D, 27926 - 11905: 0x9B9E, 27927 - 11905: 0xCFB4, 27928 - 11905: 0x9B9F, 27929 - 11905: 0xE4A8, 27930 - 11905: 0xE4AE, 27931 - 11905: 0xC2E5, 27932 - 11905: 0x9BA0, 27933 - 11905: 0x9BA1, 27934 - 11905: 0xB6B4, 27935 - 11905: 0x9BA2, 27936 - 11905: 0x9BA3, 27937 - 11905: 0x9BA4, 27938 - 11905: 0x9BA5, 27939 - 11905: 0x9BA6, 27940 - 11905: 0x9BA7, 27941 - 11905: 0xBDF2, 27942 - 11905: 0x9BA8, 27943 - 11905: 0xE4A2, 27944 - 11905: 0x9BA9, 27945 - 11905: 0x9BAA, 27946 - 11905: 0xBAE9, 27947 - 11905: 0xE4AA, 27948 - 11905: 0x9BAB, 27949 - 11905: 0x9BAC, 27950 - 11905: 0xE4AC, 27951 - 11905: 0x9BAD, 27952 - 11905: 0x9BAE, 27953 - 11905: 0xB6FD, 27954 - 11905: 0xD6DE, 27955 - 11905: 0xE4B2, 27956 - 11905: 0x9BAF, 27957 - 11905: 0xE4AD, 27958 - 11905: 0x9BB0, 27959 - 11905: 0x9BB1, 27960 - 11905: 0x9BB2, 27961 - 11905: 0xE4A1, 27962 - 11905: 0x9BB3, 27963 - 11905: 0xBBEE, 27964 - 11905: 0xCDDD, 27965 - 11905: 0xC7A2, 27966 - 11905: 0xC5C9, 27967 - 11905: 0x9BB4, 27968 - 11905: 0x9BB5, 27969 - 11905: 0xC1F7, 27970 - 11905: 0x9BB6, 27971 - 11905: 0xE4A4, 27972 - 11905: 0x9BB7, 27973 - 11905: 0xC7B3, 27974 - 11905: 0xBDAC, 27975 - 11905: 0xBDBD, 27976 - 11905: 0xE4A5, 27977 - 11905: 0x9BB8, 27978 - 11905: 0xD7C7, 27979 - 11905: 0xB2E2, 27980 - 11905: 0x9BB9, 27981 - 11905: 0xE4AB, 27982 - 11905: 0xBCC3, 27983 - 11905: 0xE4AF, 27984 - 11905: 0x9BBA, 27985 - 11905: 0xBBEB, 27986 - 11905: 0xE4B0, 27987 - 11905: 0xC5A8, 27988 - 11905: 0xE4B1, 27989 - 11905: 0x9BBB, 27990 - 11905: 0x9BBC, 27991 - 11905: 0x9BBD, 27992 - 11905: 0x9BBE, 27993 - 11905: 0xD5E3, 27994 - 11905: 0xBFA3, 27995 - 11905: 0x9BBF, 27996 - 11905: 0xE4BA, 27997 - 11905: 0x9BC0, 27998 - 11905: 0xE4B7, 27999 - 11905: 0x9BC1, 28000 - 11905: 0xE4BB, 28001 - 11905: 0x9BC2, 28002 - 11905: 0x9BC3, 28003 - 11905: 0xE4BD, 28004 - 11905: 0x9BC4, 28005 - 11905: 0x9BC5, 28006 - 11905: 0xC6D6, 28007 - 11905: 0x9BC6, 28008 - 11905: 0x9BC7, 28009 - 11905: 0xBAC6, 28010 - 11905: 0xC0CB, 28011 - 11905: 0x9BC8, 28012 - 11905: 0x9BC9, 28013 - 11905: 0x9BCA, 28014 - 11905: 0xB8A1, 28015 - 11905: 0xE4B4, 28016 - 11905: 0x9BCB, 28017 - 11905: 0x9BCC, 28018 - 11905: 0x9BCD, 28019 - 11905: 0x9BCE, 28020 - 11905: 0xD4A1, 28021 - 11905: 0x9BCF, 28022 - 11905: 0x9BD0, 28023 - 11905: 0xBAA3, 28024 - 11905: 0xBDFE, 28025 - 11905: 0x9BD1, 28026 - 11905: 0x9BD2, 28027 - 11905: 0x9BD3, 28028 - 11905: 0xE4BC, 28029 - 11905: 0x9BD4, 28030 - 11905: 0x9BD5, 28031 - 11905: 0x9BD6, 28032 - 11905: 0x9BD7, 28033 - 11905: 0x9BD8, 28034 - 11905: 0xCDBF, 28035 - 11905: 0x9BD9, 28036 - 11905: 0x9BDA, 28037 - 11905: 0xC4F9, 28038 - 11905: 0x9BDB, 28039 - 11905: 0x9BDC, 28040 - 11905: 0xCFFB, 28041 - 11905: 0xC9E6, 28042 - 11905: 0x9BDD, 28043 - 11905: 0x9BDE, 28044 - 11905: 0xD3BF, 28045 - 11905: 0x9BDF, 28046 - 11905: 0xCFD1, 28047 - 11905: 0x9BE0, 28048 - 11905: 0x9BE1, 28049 - 11905: 0xE4B3, 28050 - 11905: 0x9BE2, 28051 - 11905: 0xE4B8, 28052 - 11905: 0xE4B9, 28053 - 11905: 0xCCE9, 28054 - 11905: 0x9BE3, 28055 - 11905: 0x9BE4, 28056 - 11905: 0x9BE5, 28057 - 11905: 0x9BE6, 28058 - 11905: 0x9BE7, 28059 - 11905: 0xCCCE, 28060 - 11905: 0x9BE8, 28061 - 11905: 0xC0D4, 28062 - 11905: 0xE4B5, 28063 - 11905: 0xC1B0, 28064 - 11905: 0xE4B6, 28065 - 11905: 0xCED0, 28066 - 11905: 0x9BE9, 28067 - 11905: 0xBBC1, 28068 - 11905: 0xB5D3, 28069 - 11905: 0x9BEA, 28070 - 11905: 0xC8F3, 28071 - 11905: 0xBDA7, 28072 - 11905: 0xD5C7, 28073 - 11905: 0xC9AC, 28074 - 11905: 0xB8A2, 28075 - 11905: 0xE4CA, 28076 - 11905: 0x9BEB, 28077 - 11905: 0x9BEC, 28078 - 11905: 0xE4CC, 28079 - 11905: 0xD1C4, 28080 - 11905: 0x9BED, 28081 - 11905: 0x9BEE, 28082 - 11905: 0xD2BA, 28083 - 11905: 0x9BEF, 28084 - 11905: 0x9BF0, 28085 - 11905: 0xBAAD, 28086 - 11905: 0x9BF1, 28087 - 11905: 0x9BF2, 28088 - 11905: 0xBAD4, 28089 - 11905: 0x9BF3, 28090 - 11905: 0x9BF4, 28091 - 11905: 0x9BF5, 28092 - 11905: 0x9BF6, 28093 - 11905: 0x9BF7, 28094 - 11905: 0x9BF8, 28095 - 11905: 0xE4C3, 28096 - 11905: 0xB5ED, 28097 - 11905: 0x9BF9, 28098 - 11905: 0x9BFA, 28099 - 11905: 0x9BFB, 28100 - 11905: 0xD7CD, 28101 - 11905: 0xE4C0, 28102 - 11905: 0xCFFD, 28103 - 11905: 0xE4BF, 28104 - 11905: 0x9BFC, 28105 - 11905: 0x9BFD, 28106 - 11905: 0x9BFE, 28107 - 11905: 0xC1DC, 28108 - 11905: 0xCCCA, 28109 - 11905: 0x9C40, 28110 - 11905: 0x9C41, 28111 - 11905: 0x9C42, 28112 - 11905: 0x9C43, 28113 - 11905: 0xCAE7, 28114 - 11905: 0x9C44, 28115 - 11905: 0x9C45, 28116 - 11905: 0x9C46, 28117 - 11905: 0x9C47, 28118 - 11905: 0xC4D7, 28119 - 11905: 0x9C48, 28120 - 11905: 0xCCD4, 28121 - 11905: 0xE4C8, 28122 - 11905: 0x9C49, 28123 - 11905: 0x9C4A, 28124 - 11905: 0x9C4B, 28125 - 11905: 0xE4C7, 28126 - 11905: 0xE4C1, 28127 - 11905: 0x9C4C, 28128 - 11905: 0xE4C4, 28129 - 11905: 0xB5AD, 28130 - 11905: 0x9C4D, 28131 - 11905: 0x9C4E, 28132 - 11905: 0xD3D9, 28133 - 11905: 0x9C4F, 28134 - 11905: 0xE4C6, 28135 - 11905: 0x9C50, 28136 - 11905: 0x9C51, 28137 - 11905: 0x9C52, 28138 - 11905: 0x9C53, 28139 - 11905: 0xD2F9, 28140 - 11905: 0xB4E3, 28141 - 11905: 0x9C54, 28142 - 11905: 0xBBB4, 28143 - 11905: 0x9C55, 28144 - 11905: 0x9C56, 28145 - 11905: 0xC9EE, 28146 - 11905: 0x9C57, 28147 - 11905: 0xB4BE, 28148 - 11905: 0x9C58, 28149 - 11905: 0x9C59, 28150 - 11905: 0x9C5A, 28151 - 11905: 0xBBEC, 28152 - 11905: 0x9C5B, 28153 - 11905: 0xD1CD, 28154 - 11905: 0x9C5C, 28155 - 11905: 0xCCED, 28156 - 11905: 0xEDB5, 28157 - 11905: 0x9C5D, 28158 - 11905: 0x9C5E, 28159 - 11905: 0x9C5F, 28160 - 11905: 0x9C60, 28161 - 11905: 0x9C61, 28162 - 11905: 0x9C62, 28163 - 11905: 0x9C63, 28164 - 11905: 0x9C64, 28165 - 11905: 0xC7E5, 28166 - 11905: 0x9C65, 28167 - 11905: 0x9C66, 28168 - 11905: 0x9C67, 28169 - 11905: 0x9C68, 28170 - 11905: 0xD4A8, 28171 - 11905: 0x9C69, 28172 - 11905: 0xE4CB, 28173 - 11905: 0xD7D5, 28174 - 11905: 0xE4C2, 28175 - 11905: 0x9C6A, 28176 - 11905: 0xBDA5, 28177 - 11905: 0xE4C5, 28178 - 11905: 0x9C6B, 28179 - 11905: 0x9C6C, 28180 - 11905: 0xD3E6, 28181 - 11905: 0x9C6D, 28182 - 11905: 0xE4C9, 28183 - 11905: 0xC9F8, 28184 - 11905: 0x9C6E, 28185 - 11905: 0x9C6F, 28186 - 11905: 0xE4BE, 28187 - 11905: 0x9C70, 28188 - 11905: 0x9C71, 28189 - 11905: 0xD3E5, 28190 - 11905: 0x9C72, 28191 - 11905: 0x9C73, 28192 - 11905: 0xC7FE, 28193 - 11905: 0xB6C9, 28194 - 11905: 0x9C74, 28195 - 11905: 0xD4FC, 28196 - 11905: 0xB2B3, 28197 - 11905: 0xE4D7, 28198 - 11905: 0x9C75, 28199 - 11905: 0x9C76, 28200 - 11905: 0x9C77, 28201 - 11905: 0xCEC2, 28202 - 11905: 0x9C78, 28203 - 11905: 0xE4CD, 28204 - 11905: 0x9C79, 28205 - 11905: 0xCEBC, 28206 - 11905: 0x9C7A, 28207 - 11905: 0xB8DB, 28208 - 11905: 0x9C7B, 28209 - 11905: 0x9C7C, 28210 - 11905: 0xE4D6, 28211 - 11905: 0x9C7D, 28212 - 11905: 0xBFCA, 28213 - 11905: 0x9C7E, 28214 - 11905: 0x9C80, 28215 - 11905: 0x9C81, 28216 - 11905: 0xD3CE, 28217 - 11905: 0x9C82, 28218 - 11905: 0xC3EC, 28219 - 11905: 0x9C83, 28220 - 11905: 0x9C84, 28221 - 11905: 0x9C85, 28222 - 11905: 0x9C86, 28223 - 11905: 0x9C87, 28224 - 11905: 0x9C88, 28225 - 11905: 0x9C89, 28226 - 11905: 0x9C8A, 28227 - 11905: 0xC5C8, 28228 - 11905: 0xE4D8, 28229 - 11905: 0x9C8B, 28230 - 11905: 0x9C8C, 28231 - 11905: 0x9C8D, 28232 - 11905: 0x9C8E, 28233 - 11905: 0x9C8F, 28234 - 11905: 0x9C90, 28235 - 11905: 0x9C91, 28236 - 11905: 0x9C92, 28237 - 11905: 0xCDC4, 28238 - 11905: 0xE4CF, 28239 - 11905: 0x9C93, 28240 - 11905: 0x9C94, 28241 - 11905: 0x9C95, 28242 - 11905: 0x9C96, 28243 - 11905: 0xE4D4, 28244 - 11905: 0xE4D5, 28245 - 11905: 0x9C97, 28246 - 11905: 0xBAFE, 28247 - 11905: 0x9C98, 28248 - 11905: 0xCFE6, 28249 - 11905: 0x9C99, 28250 - 11905: 0x9C9A, 28251 - 11905: 0xD5BF, 28252 - 11905: 0x9C9B, 28253 - 11905: 0x9C9C, 28254 - 11905: 0x9C9D, 28255 - 11905: 0xE4D2, 28256 - 11905: 0x9C9E, 28257 - 11905: 0x9C9F, 28258 - 11905: 0x9CA0, 28259 - 11905: 0x9CA1, 28260 - 11905: 0x9CA2, 28261 - 11905: 0x9CA3, 28262 - 11905: 0x9CA4, 28263 - 11905: 0x9CA5, 28264 - 11905: 0x9CA6, 28265 - 11905: 0x9CA7, 28266 - 11905: 0x9CA8, 28267 - 11905: 0xE4D0, 28268 - 11905: 0x9CA9, 28269 - 11905: 0x9CAA, 28270 - 11905: 0xE4CE, 28271 - 11905: 0x9CAB, 28272 - 11905: 0x9CAC, 28273 - 11905: 0x9CAD, 28274 - 11905: 0x9CAE, 28275 - 11905: 0x9CAF, 28276 - 11905: 0x9CB0, 28277 - 11905: 0x9CB1, 28278 - 11905: 0x9CB2, 28279 - 11905: 0x9CB3, 28280 - 11905: 0x9CB4, 28281 - 11905: 0x9CB5, 28282 - 11905: 0x9CB6, 28283 - 11905: 0x9CB7, 28284 - 11905: 0x9CB8, 28285 - 11905: 0x9CB9, 28286 - 11905: 0xCDE5, 28287 - 11905: 0xCAAA, 28288 - 11905: 0x9CBA, 28289 - 11905: 0x9CBB, 28290 - 11905: 0x9CBC, 28291 - 11905: 0xC0A3, 28292 - 11905: 0x9CBD, 28293 - 11905: 0xBDA6, 28294 - 11905: 0xE4D3, 28295 - 11905: 0x9CBE, 28296 - 11905: 0x9CBF, 28297 - 11905: 0xB8C8, 28298 - 11905: 0x9CC0, 28299 - 11905: 0x9CC1, 28300 - 11905: 0x9CC2, 28301 - 11905: 0x9CC3, 28302 - 11905: 0x9CC4, 28303 - 11905: 0xE4E7, 28304 - 11905: 0xD4B4, 28305 - 11905: 0x9CC5, 28306 - 11905: 0x9CC6, 28307 - 11905: 0x9CC7, 28308 - 11905: 0x9CC8, 28309 - 11905: 0x9CC9, 28310 - 11905: 0x9CCA, 28311 - 11905: 0x9CCB, 28312 - 11905: 0xE4DB, 28313 - 11905: 0x9CCC, 28314 - 11905: 0x9CCD, 28315 - 11905: 0x9CCE, 28316 - 11905: 0xC1EF, 28317 - 11905: 0x9CCF, 28318 - 11905: 0x9CD0, 28319 - 11905: 0xE4E9, 28320 - 11905: 0x9CD1, 28321 - 11905: 0x9CD2, 28322 - 11905: 0xD2E7, 28323 - 11905: 0x9CD3, 28324 - 11905: 0x9CD4, 28325 - 11905: 0xE4DF, 28326 - 11905: 0x9CD5, 28327 - 11905: 0xE4E0, 28328 - 11905: 0x9CD6, 28329 - 11905: 0x9CD7, 28330 - 11905: 0xCFAA, 28331 - 11905: 0x9CD8, 28332 - 11905: 0x9CD9, 28333 - 11905: 0x9CDA, 28334 - 11905: 0x9CDB, 28335 - 11905: 0xCBDD, 28336 - 11905: 0x9CDC, 28337 - 11905: 0xE4DA, 28338 - 11905: 0xE4D1, 28339 - 11905: 0x9CDD, 28340 - 11905: 0xE4E5, 28341 - 11905: 0x9CDE, 28342 - 11905: 0xC8DC, 28343 - 11905: 0xE4E3, 28344 - 11905: 0x9CDF, 28345 - 11905: 0x9CE0, 28346 - 11905: 0xC4E7, 28347 - 11905: 0xE4E2, 28348 - 11905: 0x9CE1, 28349 - 11905: 0xE4E1, 28350 - 11905: 0x9CE2, 28351 - 11905: 0x9CE3, 28352 - 11905: 0x9CE4, 28353 - 11905: 0xB3FC, 28354 - 11905: 0xE4E8, 28355 - 11905: 0x9CE5, 28356 - 11905: 0x9CE6, 28357 - 11905: 0x9CE7, 28358 - 11905: 0x9CE8, 28359 - 11905: 0xB5E1, 28360 - 11905: 0x9CE9, 28361 - 11905: 0x9CEA, 28362 - 11905: 0x9CEB, 28363 - 11905: 0xD7CC, 28364 - 11905: 0x9CEC, 28365 - 11905: 0x9CED, 28366 - 11905: 0x9CEE, 28367 - 11905: 0xE4E6, 28368 - 11905: 0x9CEF, 28369 - 11905: 0xBBAC, 28370 - 11905: 0x9CF0, 28371 - 11905: 0xD7D2, 28372 - 11905: 0xCCCF, 28373 - 11905: 0xEBF8, 28374 - 11905: 0x9CF1, 28375 - 11905: 0xE4E4, 28376 - 11905: 0x9CF2, 28377 - 11905: 0x9CF3, 28378 - 11905: 0xB9F6, 28379 - 11905: 0x9CF4, 28380 - 11905: 0x9CF5, 28381 - 11905: 0x9CF6, 28382 - 11905: 0xD6CD, 28383 - 11905: 0xE4D9, 28384 - 11905: 0xE4DC, 28385 - 11905: 0xC2FA, 28386 - 11905: 0xE4DE, 28387 - 11905: 0x9CF7, 28388 - 11905: 0xC2CB, 28389 - 11905: 0xC0C4, 28390 - 11905: 0xC2D0, 28391 - 11905: 0x9CF8, 28392 - 11905: 0xB1F5, 28393 - 11905: 0xCCB2, 28394 - 11905: 0x9CF9, 28395 - 11905: 0x9CFA, 28396 - 11905: 0x9CFB, 28397 - 11905: 0x9CFC, 28398 - 11905: 0x9CFD, 28399 - 11905: 0x9CFE, 28400 - 11905: 0x9D40, 28401 - 11905: 0x9D41, 28402 - 11905: 0x9D42, 28403 - 11905: 0x9D43, 28404 - 11905: 0xB5CE, 28405 - 11905: 0x9D44, 28406 - 11905: 0x9D45, 28407 - 11905: 0x9D46, 28408 - 11905: 0x9D47, 28409 - 11905: 0xE4EF, 28410 - 11905: 0x9D48, 28411 - 11905: 0x9D49, 28412 - 11905: 0x9D4A, 28413 - 11905: 0x9D4B, 28414 - 11905: 0x9D4C, 28415 - 11905: 0x9D4D, 28416 - 11905: 0x9D4E, 28417 - 11905: 0x9D4F, 28418 - 11905: 0xC6AF, 28419 - 11905: 0x9D50, 28420 - 11905: 0x9D51, 28421 - 11905: 0x9D52, 28422 - 11905: 0xC6E1, 28423 - 11905: 0x9D53, 28424 - 11905: 0x9D54, 28425 - 11905: 0xE4F5, 28426 - 11905: 0x9D55, 28427 - 11905: 0x9D56, 28428 - 11905: 0x9D57, 28429 - 11905: 0x9D58, 28430 - 11905: 0x9D59, 28431 - 11905: 0xC2A9, 28432 - 11905: 0x9D5A, 28433 - 11905: 0x9D5B, 28434 - 11905: 0x9D5C, 28435 - 11905: 0xC0EC, 28436 - 11905: 0xD1DD, 28437 - 11905: 0xE4EE, 28438 - 11905: 0x9D5D, 28439 - 11905: 0x9D5E, 28440 - 11905: 0x9D5F, 28441 - 11905: 0x9D60, 28442 - 11905: 0x9D61, 28443 - 11905: 0x9D62, 28444 - 11905: 0x9D63, 28445 - 11905: 0x9D64, 28446 - 11905: 0x9D65, 28447 - 11905: 0x9D66, 28448 - 11905: 0xC4AE, 28449 - 11905: 0x9D67, 28450 - 11905: 0x9D68, 28451 - 11905: 0x9D69, 28452 - 11905: 0xE4ED, 28453 - 11905: 0x9D6A, 28454 - 11905: 0x9D6B, 28455 - 11905: 0x9D6C, 28456 - 11905: 0x9D6D, 28457 - 11905: 0xE4F6, 28458 - 11905: 0xE4F4, 28459 - 11905: 0xC2FE, 28460 - 11905: 0x9D6E, 28461 - 11905: 0xE4DD, 28462 - 11905: 0x9D6F, 28463 - 11905: 0xE4F0, 28464 - 11905: 0x9D70, 28465 - 11905: 0xCAFE, 28466 - 11905: 0x9D71, 28467 - 11905: 0xD5C4, 28468 - 11905: 0x9D72, 28469 - 11905: 0x9D73, 28470 - 11905: 0xE4F1, 28471 - 11905: 0x9D74, 28472 - 11905: 0x9D75, 28473 - 11905: 0x9D76, 28474 - 11905: 0x9D77, 28475 - 11905: 0x9D78, 28476 - 11905: 0x9D79, 28477 - 11905: 0x9D7A, 28478 - 11905: 0xD1FA, 28479 - 11905: 0x9D7B, 28480 - 11905: 0x9D7C, 28481 - 11905: 0x9D7D, 28482 - 11905: 0x9D7E, 28483 - 11905: 0x9D80, 28484 - 11905: 0x9D81, 28485 - 11905: 0x9D82, 28486 - 11905: 0xE4EB, 28487 - 11905: 0xE4EC, 28488 - 11905: 0x9D83, 28489 - 11905: 0x9D84, 28490 - 11905: 0x9D85, 28491 - 11905: 0xE4F2, 28492 - 11905: 0x9D86, 28493 - 11905: 0xCEAB, 28494 - 11905: 0x9D87, 28495 - 11905: 0x9D88, 28496 - 11905: 0x9D89, 28497 - 11905: 0x9D8A, 28498 - 11905: 0x9D8B, 28499 - 11905: 0x9D8C, 28500 - 11905: 0x9D8D, 28501 - 11905: 0x9D8E, 28502 - 11905: 0x9D8F, 28503 - 11905: 0x9D90, 28504 - 11905: 0xC5CB, 28505 - 11905: 0x9D91, 28506 - 11905: 0x9D92, 28507 - 11905: 0x9D93, 28508 - 11905: 0xC7B1, 28509 - 11905: 0x9D94, 28510 - 11905: 0xC2BA, 28511 - 11905: 0x9D95, 28512 - 11905: 0x9D96, 28513 - 11905: 0x9D97, 28514 - 11905: 0xE4EA, 28515 - 11905: 0x9D98, 28516 - 11905: 0x9D99, 28517 - 11905: 0x9D9A, 28518 - 11905: 0xC1CA, 28519 - 11905: 0x9D9B, 28520 - 11905: 0x9D9C, 28521 - 11905: 0x9D9D, 28522 - 11905: 0x9D9E, 28523 - 11905: 0x9D9F, 28524 - 11905: 0x9DA0, 28525 - 11905: 0xCCB6, 28526 - 11905: 0xB3B1, 28527 - 11905: 0x9DA1, 28528 - 11905: 0x9DA2, 28529 - 11905: 0x9DA3, 28530 - 11905: 0xE4FB, 28531 - 11905: 0x9DA4, 28532 - 11905: 0xE4F3, 28533 - 11905: 0x9DA5, 28534 - 11905: 0x9DA6, 28535 - 11905: 0x9DA7, 28536 - 11905: 0xE4FA, 28537 - 11905: 0x9DA8, 28538 - 11905: 0xE4FD, 28539 - 11905: 0x9DA9, 28540 - 11905: 0xE4FC, 28541 - 11905: 0x9DAA, 28542 - 11905: 0x9DAB, 28543 - 11905: 0x9DAC, 28544 - 11905: 0x9DAD, 28545 - 11905: 0x9DAE, 28546 - 11905: 0x9DAF, 28547 - 11905: 0x9DB0, 28548 - 11905: 0xB3CE, 28549 - 11905: 0x9DB1, 28550 - 11905: 0x9DB2, 28551 - 11905: 0x9DB3, 28552 - 11905: 0xB3BA, 28553 - 11905: 0xE4F7, 28554 - 11905: 0x9DB4, 28555 - 11905: 0x9DB5, 28556 - 11905: 0xE4F9, 28557 - 11905: 0xE4F8, 28558 - 11905: 0xC5EC, 28559 - 11905: 0x9DB6, 28560 - 11905: 0x9DB7, 28561 - 11905: 0x9DB8, 28562 - 11905: 0x9DB9, 28563 - 11905: 0x9DBA, 28564 - 11905: 0x9DBB, 28565 - 11905: 0x9DBC, 28566 - 11905: 0x9DBD, 28567 - 11905: 0x9DBE, 28568 - 11905: 0x9DBF, 28569 - 11905: 0x9DC0, 28570 - 11905: 0x9DC1, 28571 - 11905: 0x9DC2, 28572 - 11905: 0xC0BD, 28573 - 11905: 0x9DC3, 28574 - 11905: 0x9DC4, 28575 - 11905: 0x9DC5, 28576 - 11905: 0x9DC6, 28577 - 11905: 0xD4E8, 28578 - 11905: 0x9DC7, 28579 - 11905: 0x9DC8, 28580 - 11905: 0x9DC9, 28581 - 11905: 0x9DCA, 28582 - 11905: 0x9DCB, 28583 - 11905: 0xE5A2, 28584 - 11905: 0x9DCC, 28585 - 11905: 0x9DCD, 28586 - 11905: 0x9DCE, 28587 - 11905: 0x9DCF, 28588 - 11905: 0x9DD0, 28589 - 11905: 0x9DD1, 28590 - 11905: 0x9DD2, 28591 - 11905: 0x9DD3, 28592 - 11905: 0x9DD4, 28593 - 11905: 0x9DD5, 28594 - 11905: 0x9DD6, 28595 - 11905: 0xB0C4, 28596 - 11905: 0x9DD7, 28597 - 11905: 0x9DD8, 28598 - 11905: 0xE5A4, 28599 - 11905: 0x9DD9, 28600 - 11905: 0x9DDA, 28601 - 11905: 0xE5A3, 28602 - 11905: 0x9DDB, 28603 - 11905: 0x9DDC, 28604 - 11905: 0x9DDD, 28605 - 11905: 0x9DDE, 28606 - 11905: 0x9DDF, 28607 - 11905: 0x9DE0, 28608 - 11905: 0xBCA4, 28609 - 11905: 0x9DE1, 28610 - 11905: 0xE5A5, 28611 - 11905: 0x9DE2, 28612 - 11905: 0x9DE3, 28613 - 11905: 0x9DE4, 28614 - 11905: 0x9DE5, 28615 - 11905: 0x9DE6, 28616 - 11905: 0x9DE7, 28617 - 11905: 0xE5A1, 28618 - 11905: 0x9DE8, 28619 - 11905: 0x9DE9, 28620 - 11905: 0x9DEA, 28621 - 11905: 0x9DEB, 28622 - 11905: 0x9DEC, 28623 - 11905: 0x9DED, 28624 - 11905: 0x9DEE, 28625 - 11905: 0xE4FE, 28626 - 11905: 0xB1F4, 28627 - 11905: 0x9DEF, 28628 - 11905: 0x9DF0, 28629 - 11905: 0x9DF1, 28630 - 11905: 0x9DF2, 28631 - 11905: 0x9DF3, 28632 - 11905: 0x9DF4, 28633 - 11905: 0x9DF5, 28634 - 11905: 0x9DF6, 28635 - 11905: 0x9DF7, 28636 - 11905: 0x9DF8, 28637 - 11905: 0x9DF9, 28638 - 11905: 0xE5A8, 28639 - 11905: 0x9DFA, 28640 - 11905: 0xE5A9, 28641 - 11905: 0xE5A6, 28642 - 11905: 0x9DFB, 28643 - 11905: 0x9DFC, 28644 - 11905: 0x9DFD, 28645 - 11905: 0x9DFE, 28646 - 11905: 0x9E40, 28647 - 11905: 0x9E41, 28648 - 11905: 0x9E42, 28649 - 11905: 0x9E43, 28650 - 11905: 0x9E44, 28651 - 11905: 0x9E45, 28652 - 11905: 0x9E46, 28653 - 11905: 0x9E47, 28654 - 11905: 0xE5A7, 28655 - 11905: 0xE5AA, 28656 - 11905: 0x9E48, 28657 - 11905: 0x9E49, 28658 - 11905: 0x9E4A, 28659 - 11905: 0x9E4B, 28660 - 11905: 0x9E4C, 28661 - 11905: 0x9E4D, 28662 - 11905: 0x9E4E, 28663 - 11905: 0x9E4F, 28664 - 11905: 0x9E50, 28665 - 11905: 0x9E51, 28666 - 11905: 0x9E52, 28667 - 11905: 0x9E53, 28668 - 11905: 0x9E54, 28669 - 11905: 0x9E55, 28670 - 11905: 0x9E56, 28671 - 11905: 0x9E57, 28672 - 11905: 0x9E58, 28673 - 11905: 0x9E59, 28674 - 11905: 0x9E5A, 28675 - 11905: 0x9E5B, 28676 - 11905: 0x9E5C, 28677 - 11905: 0x9E5D, 28678 - 11905: 0x9E5E, 28679 - 11905: 0x9E5F, 28680 - 11905: 0x9E60, 28681 - 11905: 0x9E61, 28682 - 11905: 0x9E62, 28683 - 11905: 0x9E63, 28684 - 11905: 0x9E64, 28685 - 11905: 0x9E65, 28686 - 11905: 0x9E66, 28687 - 11905: 0x9E67, 28688 - 11905: 0x9E68, 28689 - 11905: 0xC6D9, 28690 - 11905: 0x9E69, 28691 - 11905: 0x9E6A, 28692 - 11905: 0x9E6B, 28693 - 11905: 0x9E6C, 28694 - 11905: 0x9E6D, 28695 - 11905: 0x9E6E, 28696 - 11905: 0x9E6F, 28697 - 11905: 0x9E70, 28698 - 11905: 0xE5AB, 28699 - 11905: 0xE5AD, 28700 - 11905: 0x9E71, 28701 - 11905: 0x9E72, 28702 - 11905: 0x9E73, 28703 - 11905: 0x9E74, 28704 - 11905: 0x9E75, 28705 - 11905: 0x9E76, 28706 - 11905: 0x9E77, 28707 - 11905: 0xE5AC, 28708 - 11905: 0x9E78, 28709 - 11905: 0x9E79, 28710 - 11905: 0x9E7A, 28711 - 11905: 0x9E7B, 28712 - 11905: 0x9E7C, 28713 - 11905: 0x9E7D, 28714 - 11905: 0x9E7E, 28715 - 11905: 0x9E80, 28716 - 11905: 0x9E81, 28717 - 11905: 0x9E82, 28718 - 11905: 0x9E83, 28719 - 11905: 0x9E84, 28720 - 11905: 0x9E85, 28721 - 11905: 0x9E86, 28722 - 11905: 0x9E87, 28723 - 11905: 0x9E88, 28724 - 11905: 0x9E89, 28725 - 11905: 0xE5AF, 28726 - 11905: 0x9E8A, 28727 - 11905: 0x9E8B, 28728 - 11905: 0x9E8C, 28729 - 11905: 0xE5AE, 28730 - 11905: 0x9E8D, 28731 - 11905: 0x9E8E, 28732 - 11905: 0x9E8F, 28733 - 11905: 0x9E90, 28734 - 11905: 0x9E91, 28735 - 11905: 0x9E92, 28736 - 11905: 0x9E93, 28737 - 11905: 0x9E94, 28738 - 11905: 0x9E95, 28739 - 11905: 0x9E96, 28740 - 11905: 0x9E97, 28741 - 11905: 0x9E98, 28742 - 11905: 0x9E99, 28743 - 11905: 0x9E9A, 28744 - 11905: 0x9E9B, 28745 - 11905: 0x9E9C, 28746 - 11905: 0x9E9D, 28747 - 11905: 0x9E9E, 28748 - 11905: 0xB9E0, 28749 - 11905: 0x9E9F, 28750 - 11905: 0x9EA0, 28751 - 11905: 0xE5B0, 28752 - 11905: 0x9EA1, 28753 - 11905: 0x9EA2, 28754 - 11905: 0x9EA3, 28755 - 11905: 0x9EA4, 28756 - 11905: 0x9EA5, 28757 - 11905: 0x9EA6, 28758 - 11905: 0x9EA7, 28759 - 11905: 0x9EA8, 28760 - 11905: 0x9EA9, 28761 - 11905: 0x9EAA, 28762 - 11905: 0x9EAB, 28763 - 11905: 0x9EAC, 28764 - 11905: 0x9EAD, 28765 - 11905: 0x9EAE, 28766 - 11905: 0xE5B1, 28767 - 11905: 0x9EAF, 28768 - 11905: 0x9EB0, 28769 - 11905: 0x9EB1, 28770 - 11905: 0x9EB2, 28771 - 11905: 0x9EB3, 28772 - 11905: 0x9EB4, 28773 - 11905: 0x9EB5, 28774 - 11905: 0x9EB6, 28775 - 11905: 0x9EB7, 28776 - 11905: 0x9EB8, 28777 - 11905: 0x9EB9, 28778 - 11905: 0x9EBA, 28779 - 11905: 0xBBF0, 28780 - 11905: 0xECE1, 28781 - 11905: 0xC3F0, 28782 - 11905: 0x9EBB, 28783 - 11905: 0xB5C6, 28784 - 11905: 0xBBD2, 28785 - 11905: 0x9EBC, 28786 - 11905: 0x9EBD, 28787 - 11905: 0x9EBE, 28788 - 11905: 0x9EBF, 28789 - 11905: 0xC1E9, 28790 - 11905: 0xD4EE, 28791 - 11905: 0x9EC0, 28792 - 11905: 0xBEC4, 28793 - 11905: 0x9EC1, 28794 - 11905: 0x9EC2, 28795 - 11905: 0x9EC3, 28796 - 11905: 0xD7C6, 28797 - 11905: 0x9EC4, 28798 - 11905: 0xD4D6, 28799 - 11905: 0xB2D3, 28800 - 11905: 0xECBE, 28801 - 11905: 0x9EC5, 28802 - 11905: 0x9EC6, 28803 - 11905: 0x9EC7, 28804 - 11905: 0x9EC8, 28805 - 11905: 0xEAC1, 28806 - 11905: 0x9EC9, 28807 - 11905: 0x9ECA, 28808 - 11905: 0x9ECB, 28809 - 11905: 0xC2AF, 28810 - 11905: 0xB4B6, 28811 - 11905: 0x9ECC, 28812 - 11905: 0x9ECD, 28813 - 11905: 0x9ECE, 28814 - 11905: 0xD1D7, 28815 - 11905: 0x9ECF, 28816 - 11905: 0x9ED0, 28817 - 11905: 0x9ED1, 28818 - 11905: 0xB3B4, 28819 - 11905: 0x9ED2, 28820 - 11905: 0xC8B2, 28821 - 11905: 0xBFBB, 28822 - 11905: 0xECC0, 28823 - 11905: 0x9ED3, 28824 - 11905: 0x9ED4, 28825 - 11905: 0xD6CB, 28826 - 11905: 0x9ED5, 28827 - 11905: 0x9ED6, 28828 - 11905: 0xECBF, 28829 - 11905: 0xECC1, 28830 - 11905: 0x9ED7, 28831 - 11905: 0x9ED8, 28832 - 11905: 0x9ED9, 28833 - 11905: 0x9EDA, 28834 - 11905: 0x9EDB, 28835 - 11905: 0x9EDC, 28836 - 11905: 0x9EDD, 28837 - 11905: 0x9EDE, 28838 - 11905: 0x9EDF, 28839 - 11905: 0x9EE0, 28840 - 11905: 0x9EE1, 28841 - 11905: 0x9EE2, 28842 - 11905: 0x9EE3, 28843 - 11905: 0xECC5, 28844 - 11905: 0xBEE6, 28845 - 11905: 0xCCBF, 28846 - 11905: 0xC5DA, 28847 - 11905: 0xBEBC, 28848 - 11905: 0x9EE4, 28849 - 11905: 0xECC6, 28850 - 11905: 0x9EE5, 28851 - 11905: 0xB1FE, 28852 - 11905: 0x9EE6, 28853 - 11905: 0x9EE7, 28854 - 11905: 0x9EE8, 28855 - 11905: 0xECC4, 28856 - 11905: 0xD5A8, 28857 - 11905: 0xB5E3, 28858 - 11905: 0x9EE9, 28859 - 11905: 0xECC2, 28860 - 11905: 0xC1B6, 28861 - 11905: 0xB3E3, 28862 - 11905: 0x9EEA, 28863 - 11905: 0x9EEB, 28864 - 11905: 0xECC3, 28865 - 11905: 0xCBB8, 28866 - 11905: 0xC0C3, 28867 - 11905: 0xCCFE, 28868 - 11905: 0x9EEC, 28869 - 11905: 0x9EED, 28870 - 11905: 0x9EEE, 28871 - 11905: 0x9EEF, 28872 - 11905: 0xC1D2, 28873 - 11905: 0x9EF0, 28874 - 11905: 0xECC8, 28875 - 11905: 0x9EF1, 28876 - 11905: 0x9EF2, 28877 - 11905: 0x9EF3, 28878 - 11905: 0x9EF4, 28879 - 11905: 0x9EF5, 28880 - 11905: 0x9EF6, 28881 - 11905: 0x9EF7, 28882 - 11905: 0x9EF8, 28883 - 11905: 0x9EF9, 28884 - 11905: 0x9EFA, 28885 - 11905: 0x9EFB, 28886 - 11905: 0x9EFC, 28887 - 11905: 0x9EFD, 28888 - 11905: 0xBAE6, 28889 - 11905: 0xC0D3, 28890 - 11905: 0x9EFE, 28891 - 11905: 0xD6F2, 28892 - 11905: 0x9F40, 28893 - 11905: 0x9F41, 28894 - 11905: 0x9F42, 28895 - 11905: 0xD1CC, 28896 - 11905: 0x9F43, 28897 - 11905: 0x9F44, 28898 - 11905: 0x9F45, 28899 - 11905: 0x9F46, 28900 - 11905: 0xBFBE, 28901 - 11905: 0x9F47, 28902 - 11905: 0xB7B3, 28903 - 11905: 0xC9D5, 28904 - 11905: 0xECC7, 28905 - 11905: 0xBBE2, 28906 - 11905: 0x9F48, 28907 - 11905: 0xCCCC, 28908 - 11905: 0xBDFD, 28909 - 11905: 0xC8C8, 28910 - 11905: 0x9F49, 28911 - 11905: 0xCFA9, 28912 - 11905: 0x9F4A, 28913 - 11905: 0x9F4B, 28914 - 11905: 0x9F4C, 28915 - 11905: 0x9F4D, 28916 - 11905: 0x9F4E, 28917 - 11905: 0x9F4F, 28918 - 11905: 0x9F50, 28919 - 11905: 0xCDE9, 28920 - 11905: 0x9F51, 28921 - 11905: 0xC5EB, 28922 - 11905: 0x9F52, 28923 - 11905: 0x9F53, 28924 - 11905: 0x9F54, 28925 - 11905: 0xB7E9, 28926 - 11905: 0x9F55, 28927 - 11905: 0x9F56, 28928 - 11905: 0x9F57, 28929 - 11905: 0x9F58, 28930 - 11905: 0x9F59, 28931 - 11905: 0x9F5A, 28932 - 11905: 0x9F5B, 28933 - 11905: 0x9F5C, 28934 - 11905: 0x9F5D, 28935 - 11905: 0x9F5E, 28936 - 11905: 0x9F5F, 28937 - 11905: 0xD1C9, 28938 - 11905: 0xBAB8, 28939 - 11905: 0x9F60, 28940 - 11905: 0x9F61, 28941 - 11905: 0x9F62, 28942 - 11905: 0x9F63, 28943 - 11905: 0x9F64, 28944 - 11905: 0xECC9, 28945 - 11905: 0x9F65, 28946 - 11905: 0x9F66, 28947 - 11905: 0xECCA, 28948 - 11905: 0x9F67, 28949 - 11905: 0xBBC0, 28950 - 11905: 0xECCB, 28951 - 11905: 0x9F68, 28952 - 11905: 0xECE2, 28953 - 11905: 0xB1BA, 28954 - 11905: 0xB7D9, 28955 - 11905: 0x9F69, 28956 - 11905: 0x9F6A, 28957 - 11905: 0x9F6B, 28958 - 11905: 0x9F6C, 28959 - 11905: 0x9F6D, 28960 - 11905: 0x9F6E, 28961 - 11905: 0x9F6F, 28962 - 11905: 0x9F70, 28963 - 11905: 0x9F71, 28964 - 11905: 0x9F72, 28965 - 11905: 0x9F73, 28966 - 11905: 0xBDB9, 28967 - 11905: 0x9F74, 28968 - 11905: 0x9F75, 28969 - 11905: 0x9F76, 28970 - 11905: 0x9F77, 28971 - 11905: 0x9F78, 28972 - 11905: 0x9F79, 28973 - 11905: 0x9F7A, 28974 - 11905: 0x9F7B, 28975 - 11905: 0xECCC, 28976 - 11905: 0xD1E6, 28977 - 11905: 0xECCD, 28978 - 11905: 0x9F7C, 28979 - 11905: 0x9F7D, 28980 - 11905: 0x9F7E, 28981 - 11905: 0x9F80, 28982 - 11905: 0xC8BB, 28983 - 11905: 0x9F81, 28984 - 11905: 0x9F82, 28985 - 11905: 0x9F83, 28986 - 11905: 0x9F84, 28987 - 11905: 0x9F85, 28988 - 11905: 0x9F86, 28989 - 11905: 0x9F87, 28990 - 11905: 0x9F88, 28991 - 11905: 0x9F89, 28992 - 11905: 0x9F8A, 28993 - 11905: 0x9F8B, 28994 - 11905: 0x9F8C, 28995 - 11905: 0x9F8D, 28996 - 11905: 0x9F8E, 28997 - 11905: 0xECD1, 28998 - 11905: 0x9F8F, 28999 - 11905: 0x9F90, 29000 - 11905: 0x9F91, 29001 - 11905: 0x9F92, 29002 - 11905: 0xECD3, 29003 - 11905: 0x9F93, 29004 - 11905: 0xBBCD, 29005 - 11905: 0x9F94, 29006 - 11905: 0xBCE5, 29007 - 11905: 0x9F95, 29008 - 11905: 0x9F96, 29009 - 11905: 0x9F97, 29010 - 11905: 0x9F98, 29011 - 11905: 0x9F99, 29012 - 11905: 0x9F9A, 29013 - 11905: 0x9F9B, 29014 - 11905: 0x9F9C, 29015 - 11905: 0x9F9D, 29016 - 11905: 0x9F9E, 29017 - 11905: 0x9F9F, 29018 - 11905: 0x9FA0, 29019 - 11905: 0x9FA1, 29020 - 11905: 0xECCF, 29021 - 11905: 0x9FA2, 29022 - 11905: 0xC9B7, 29023 - 11905: 0x9FA3, 29024 - 11905: 0x9FA4, 29025 - 11905: 0x9FA5, 29026 - 11905: 0x9FA6, 29027 - 11905: 0x9FA7, 29028 - 11905: 0xC3BA, 29029 - 11905: 0x9FA8, 29030 - 11905: 0xECE3, 29031 - 11905: 0xD5D5, 29032 - 11905: 0xECD0, 29033 - 11905: 0x9FA9, 29034 - 11905: 0x9FAA, 29035 - 11905: 0x9FAB, 29036 - 11905: 0x9FAC, 29037 - 11905: 0x9FAD, 29038 - 11905: 0xD6F3, 29039 - 11905: 0x9FAE, 29040 - 11905: 0x9FAF, 29041 - 11905: 0x9FB0, 29042 - 11905: 0xECD2, 29043 - 11905: 0xECCE, 29044 - 11905: 0x9FB1, 29045 - 11905: 0x9FB2, 29046 - 11905: 0x9FB3, 29047 - 11905: 0x9FB4, 29048 - 11905: 0xECD4, 29049 - 11905: 0x9FB5, 29050 - 11905: 0xECD5, 29051 - 11905: 0x9FB6, 29052 - 11905: 0x9FB7, 29053 - 11905: 0xC9BF, 29054 - 11905: 0x9FB8, 29055 - 11905: 0x9FB9, 29056 - 11905: 0x9FBA, 29057 - 11905: 0x9FBB, 29058 - 11905: 0x9FBC, 29059 - 11905: 0x9FBD, 29060 - 11905: 0xCFA8, 29061 - 11905: 0x9FBE, 29062 - 11905: 0x9FBF, 29063 - 11905: 0x9FC0, 29064 - 11905: 0x9FC1, 29065 - 11905: 0x9FC2, 29066 - 11905: 0xD0DC, 29067 - 11905: 0x9FC3, 29068 - 11905: 0x9FC4, 29069 - 11905: 0x9FC5, 29070 - 11905: 0x9FC6, 29071 - 11905: 0xD1AC, 29072 - 11905: 0x9FC7, 29073 - 11905: 0x9FC8, 29074 - 11905: 0x9FC9, 29075 - 11905: 0x9FCA, 29076 - 11905: 0xC8DB, 29077 - 11905: 0x9FCB, 29078 - 11905: 0x9FCC, 29079 - 11905: 0x9FCD, 29080 - 11905: 0xECD6, 29081 - 11905: 0xCEF5, 29082 - 11905: 0x9FCE, 29083 - 11905: 0x9FCF, 29084 - 11905: 0x9FD0, 29085 - 11905: 0x9FD1, 29086 - 11905: 0x9FD2, 29087 - 11905: 0xCAEC, 29088 - 11905: 0xECDA, 29089 - 11905: 0x9FD3, 29090 - 11905: 0x9FD4, 29091 - 11905: 0x9FD5, 29092 - 11905: 0x9FD6, 29093 - 11905: 0x9FD7, 29094 - 11905: 0x9FD8, 29095 - 11905: 0x9FD9, 29096 - 11905: 0xECD9, 29097 - 11905: 0x9FDA, 29098 - 11905: 0x9FDB, 29099 - 11905: 0x9FDC, 29100 - 11905: 0xB0BE, 29101 - 11905: 0x9FDD, 29102 - 11905: 0x9FDE, 29103 - 11905: 0x9FDF, 29104 - 11905: 0x9FE0, 29105 - 11905: 0x9FE1, 29106 - 11905: 0x9FE2, 29107 - 11905: 0xECD7, 29108 - 11905: 0x9FE3, 29109 - 11905: 0xECD8, 29110 - 11905: 0x9FE4, 29111 - 11905: 0x9FE5, 29112 - 11905: 0x9FE6, 29113 - 11905: 0xECE4, 29114 - 11905: 0x9FE7, 29115 - 11905: 0x9FE8, 29116 - 11905: 0x9FE9, 29117 - 11905: 0x9FEA, 29118 - 11905: 0x9FEB, 29119 - 11905: 0x9FEC, 29120 - 11905: 0x9FED, 29121 - 11905: 0x9FEE, 29122 - 11905: 0x9FEF, 29123 - 11905: 0xC8BC, 29124 - 11905: 0x9FF0, 29125 - 11905: 0x9FF1, 29126 - 11905: 0x9FF2, 29127 - 11905: 0x9FF3, 29128 - 11905: 0x9FF4, 29129 - 11905: 0x9FF5, 29130 - 11905: 0x9FF6, 29131 - 11905: 0x9FF7, 29132 - 11905: 0x9FF8, 29133 - 11905: 0x9FF9, 29134 - 11905: 0xC1C7, 29135 - 11905: 0x9FFA, 29136 - 11905: 0x9FFB, 29137 - 11905: 0x9FFC, 29138 - 11905: 0x9FFD, 29139 - 11905: 0x9FFE, 29140 - 11905: 0xECDC, 29141 - 11905: 0xD1E0, 29142 - 11905: 0xA040, 29143 - 11905: 0xA041, 29144 - 11905: 0xA042, 29145 - 11905: 0xA043, 29146 - 11905: 0xA044, 29147 - 11905: 0xA045, 29148 - 11905: 0xA046, 29149 - 11905: 0xA047, 29150 - 11905: 0xA048, 29151 - 11905: 0xA049, 29152 - 11905: 0xECDB, 29153 - 11905: 0xA04A, 29154 - 11905: 0xA04B, 29155 - 11905: 0xA04C, 29156 - 11905: 0xA04D, 29157 - 11905: 0xD4EF, 29158 - 11905: 0xA04E, 29159 - 11905: 0xECDD, 29160 - 11905: 0xA04F, 29161 - 11905: 0xA050, 29162 - 11905: 0xA051, 29163 - 11905: 0xA052, 29164 - 11905: 0xA053, 29165 - 11905: 0xA054, 29166 - 11905: 0xDBC6, 29167 - 11905: 0xA055, 29168 - 11905: 0xA056, 29169 - 11905: 0xA057, 29170 - 11905: 0xA058, 29171 - 11905: 0xA059, 29172 - 11905: 0xA05A, 29173 - 11905: 0xA05B, 29174 - 11905: 0xA05C, 29175 - 11905: 0xA05D, 29176 - 11905: 0xA05E, 29177 - 11905: 0xECDE, 29178 - 11905: 0xA05F, 29179 - 11905: 0xA060, 29180 - 11905: 0xA061, 29181 - 11905: 0xA062, 29182 - 11905: 0xA063, 29183 - 11905: 0xA064, 29184 - 11905: 0xA065, 29185 - 11905: 0xA066, 29186 - 11905: 0xA067, 29187 - 11905: 0xA068, 29188 - 11905: 0xA069, 29189 - 11905: 0xA06A, 29190 - 11905: 0xB1AC, 29191 - 11905: 0xA06B, 29192 - 11905: 0xA06C, 29193 - 11905: 0xA06D, 29194 - 11905: 0xA06E, 29195 - 11905: 0xA06F, 29196 - 11905: 0xA070, 29197 - 11905: 0xA071, 29198 - 11905: 0xA072, 29199 - 11905: 0xA073, 29200 - 11905: 0xA074, 29201 - 11905: 0xA075, 29202 - 11905: 0xA076, 29203 - 11905: 0xA077, 29204 - 11905: 0xA078, 29205 - 11905: 0xA079, 29206 - 11905: 0xA07A, 29207 - 11905: 0xA07B, 29208 - 11905: 0xA07C, 29209 - 11905: 0xA07D, 29210 - 11905: 0xA07E, 29211 - 11905: 0xA080, 29212 - 11905: 0xA081, 29213 - 11905: 0xECDF, 29214 - 11905: 0xA082, 29215 - 11905: 0xA083, 29216 - 11905: 0xA084, 29217 - 11905: 0xA085, 29218 - 11905: 0xA086, 29219 - 11905: 0xA087, 29220 - 11905: 0xA088, 29221 - 11905: 0xA089, 29222 - 11905: 0xA08A, 29223 - 11905: 0xA08B, 29224 - 11905: 0xECE0, 29225 - 11905: 0xA08C, 29226 - 11905: 0xD7A6, 29227 - 11905: 0xA08D, 29228 - 11905: 0xC5C0, 29229 - 11905: 0xA08E, 29230 - 11905: 0xA08F, 29231 - 11905: 0xA090, 29232 - 11905: 0xEBBC, 29233 - 11905: 0xB0AE, 29234 - 11905: 0xA091, 29235 - 11905: 0xA092, 29236 - 11905: 0xA093, 29237 - 11905: 0xBEF4, 29238 - 11905: 0xB8B8, 29239 - 11905: 0xD2AF, 29240 - 11905: 0xB0D6, 29241 - 11905: 0xB5F9, 29242 - 11905: 0xA094, 29243 - 11905: 0xD8B3, 29244 - 11905: 0xA095, 29245 - 11905: 0xCBAC, 29246 - 11905: 0xA096, 29247 - 11905: 0xE3DD, 29248 - 11905: 0xA097, 29249 - 11905: 0xA098, 29250 - 11905: 0xA099, 29251 - 11905: 0xA09A, 29252 - 11905: 0xA09B, 29253 - 11905: 0xA09C, 29254 - 11905: 0xA09D, 29255 - 11905: 0xC6AC, 29256 - 11905: 0xB0E6, 29257 - 11905: 0xA09E, 29258 - 11905: 0xA09F, 29259 - 11905: 0xA0A0, 29260 - 11905: 0xC5C6, 29261 - 11905: 0xEBB9, 29262 - 11905: 0xA0A1, 29263 - 11905: 0xA0A2, 29264 - 11905: 0xA0A3, 29265 - 11905: 0xA0A4, 29266 - 11905: 0xEBBA, 29267 - 11905: 0xA0A5, 29268 - 11905: 0xA0A6, 29269 - 11905: 0xA0A7, 29270 - 11905: 0xEBBB, 29271 - 11905: 0xA0A8, 29272 - 11905: 0xA0A9, 29273 - 11905: 0xD1C0, 29274 - 11905: 0xA0AA, 29275 - 11905: 0xC5A3, 29276 - 11905: 0xA0AB, 29277 - 11905: 0xEAF2, 29278 - 11905: 0xA0AC, 29279 - 11905: 0xC4B2, 29280 - 11905: 0xA0AD, 29281 - 11905: 0xC4B5, 29282 - 11905: 0xC0CE, 29283 - 11905: 0xA0AE, 29284 - 11905: 0xA0AF, 29285 - 11905: 0xA0B0, 29286 - 11905: 0xEAF3, 29287 - 11905: 0xC4C1, 29288 - 11905: 0xA0B1, 29289 - 11905: 0xCEEF, 29290 - 11905: 0xA0B2, 29291 - 11905: 0xA0B3, 29292 - 11905: 0xA0B4, 29293 - 11905: 0xA0B5, 29294 - 11905: 0xEAF0, 29295 - 11905: 0xEAF4, 29296 - 11905: 0xA0B6, 29297 - 11905: 0xA0B7, 29298 - 11905: 0xC9FC, 29299 - 11905: 0xA0B8, 29300 - 11905: 0xA0B9, 29301 - 11905: 0xC7A3, 29302 - 11905: 0xA0BA, 29303 - 11905: 0xA0BB, 29304 - 11905: 0xA0BC, 29305 - 11905: 0xCCD8, 29306 - 11905: 0xCEFE, 29307 - 11905: 0xA0BD, 29308 - 11905: 0xA0BE, 29309 - 11905: 0xA0BF, 29310 - 11905: 0xEAF5, 29311 - 11905: 0xEAF6, 29312 - 11905: 0xCFAC, 29313 - 11905: 0xC0E7, 29314 - 11905: 0xA0C0, 29315 - 11905: 0xA0C1, 29316 - 11905: 0xEAF7, 29317 - 11905: 0xA0C2, 29318 - 11905: 0xA0C3, 29319 - 11905: 0xA0C4, 29320 - 11905: 0xA0C5, 29321 - 11905: 0xA0C6, 29322 - 11905: 0xB6BF, 29323 - 11905: 0xEAF8, 29324 - 11905: 0xA0C7, 29325 - 11905: 0xEAF9, 29326 - 11905: 0xA0C8, 29327 - 11905: 0xEAFA, 29328 - 11905: 0xA0C9, 29329 - 11905: 0xA0CA, 29330 - 11905: 0xEAFB, 29331 - 11905: 0xA0CB, 29332 - 11905: 0xA0CC, 29333 - 11905: 0xA0CD, 29334 - 11905: 0xA0CE, 29335 - 11905: 0xA0CF, 29336 - 11905: 0xA0D0, 29337 - 11905: 0xA0D1, 29338 - 11905: 0xA0D2, 29339 - 11905: 0xA0D3, 29340 - 11905: 0xA0D4, 29341 - 11905: 0xA0D5, 29342 - 11905: 0xA0D6, 29343 - 11905: 0xEAF1, 29344 - 11905: 0xA0D7, 29345 - 11905: 0xA0D8, 29346 - 11905: 0xA0D9, 29347 - 11905: 0xA0DA, 29348 - 11905: 0xA0DB, 29349 - 11905: 0xA0DC, 29350 - 11905: 0xA0DD, 29351 - 11905: 0xA0DE, 29352 - 11905: 0xA0DF, 29353 - 11905: 0xA0E0, 29354 - 11905: 0xA0E1, 29355 - 11905: 0xA0E2, 29356 - 11905: 0xC8AE, 29357 - 11905: 0xE1EB, 29358 - 11905: 0xA0E3, 29359 - 11905: 0xB7B8, 29360 - 11905: 0xE1EC, 29361 - 11905: 0xA0E4, 29362 - 11905: 0xA0E5, 29363 - 11905: 0xA0E6, 29364 - 11905: 0xE1ED, 29365 - 11905: 0xA0E7, 29366 - 11905: 0xD7B4, 29367 - 11905: 0xE1EE, 29368 - 11905: 0xE1EF, 29369 - 11905: 0xD3CC, 29370 - 11905: 0xA0E8, 29371 - 11905: 0xA0E9, 29372 - 11905: 0xA0EA, 29373 - 11905: 0xA0EB, 29374 - 11905: 0xA0EC, 29375 - 11905: 0xA0ED, 29376 - 11905: 0xA0EE, 29377 - 11905: 0xE1F1, 29378 - 11905: 0xBFF1, 29379 - 11905: 0xE1F0, 29380 - 11905: 0xB5D2, 29381 - 11905: 0xA0EF, 29382 - 11905: 0xA0F0, 29383 - 11905: 0xA0F1, 29384 - 11905: 0xB1B7, 29385 - 11905: 0xA0F2, 29386 - 11905: 0xA0F3, 29387 - 11905: 0xA0F4, 29388 - 11905: 0xA0F5, 29389 - 11905: 0xE1F3, 29390 - 11905: 0xE1F2, 29391 - 11905: 0xA0F6, 29392 - 11905: 0xBAFC, 29393 - 11905: 0xA0F7, 29394 - 11905: 0xE1F4, 29395 - 11905: 0xA0F8, 29396 - 11905: 0xA0F9, 29397 - 11905: 0xA0FA, 29398 - 11905: 0xA0FB, 29399 - 11905: 0xB9B7, 29400 - 11905: 0xA0FC, 29401 - 11905: 0xBED1, 29402 - 11905: 0xA0FD, 29403 - 11905: 0xA0FE, 29404 - 11905: 0xAA40, 29405 - 11905: 0xAA41, 29406 - 11905: 0xC4FC, 29407 - 11905: 0xAA42, 29408 - 11905: 0xBADD, 29409 - 11905: 0xBDC6, 29410 - 11905: 0xAA43, 29411 - 11905: 0xAA44, 29412 - 11905: 0xAA45, 29413 - 11905: 0xAA46, 29414 - 11905: 0xAA47, 29415 - 11905: 0xAA48, 29416 - 11905: 0xE1F5, 29417 - 11905: 0xE1F7, 29418 - 11905: 0xAA49, 29419 - 11905: 0xAA4A, 29420 - 11905: 0xB6C0, 29421 - 11905: 0xCFC1, 29422 - 11905: 0xCAA8, 29423 - 11905: 0xE1F6, 29424 - 11905: 0xD5F8, 29425 - 11905: 0xD3FC, 29426 - 11905: 0xE1F8, 29427 - 11905: 0xE1FC, 29428 - 11905: 0xE1F9, 29429 - 11905: 0xAA4B, 29430 - 11905: 0xAA4C, 29431 - 11905: 0xE1FA, 29432 - 11905: 0xC0EA, 29433 - 11905: 0xAA4D, 29434 - 11905: 0xE1FE, 29435 - 11905: 0xE2A1, 29436 - 11905: 0xC0C7, 29437 - 11905: 0xAA4E, 29438 - 11905: 0xAA4F, 29439 - 11905: 0xAA50, 29440 - 11905: 0xAA51, 29441 - 11905: 0xE1FB, 29442 - 11905: 0xAA52, 29443 - 11905: 0xE1FD, 29444 - 11905: 0xAA53, 29445 - 11905: 0xAA54, 29446 - 11905: 0xAA55, 29447 - 11905: 0xAA56, 29448 - 11905: 0xAA57, 29449 - 11905: 0xAA58, 29450 - 11905: 0xE2A5, 29451 - 11905: 0xAA59, 29452 - 11905: 0xAA5A, 29453 - 11905: 0xAA5B, 29454 - 11905: 0xC1D4, 29455 - 11905: 0xAA5C, 29456 - 11905: 0xAA5D, 29457 - 11905: 0xAA5E, 29458 - 11905: 0xAA5F, 29459 - 11905: 0xE2A3, 29460 - 11905: 0xAA60, 29461 - 11905: 0xE2A8, 29462 - 11905: 0xB2FE, 29463 - 11905: 0xE2A2, 29464 - 11905: 0xAA61, 29465 - 11905: 0xAA62, 29466 - 11905: 0xAA63, 29467 - 11905: 0xC3CD, 29468 - 11905: 0xB2C2, 29469 - 11905: 0xE2A7, 29470 - 11905: 0xE2A6, 29471 - 11905: 0xAA64, 29472 - 11905: 0xAA65, 29473 - 11905: 0xE2A4, 29474 - 11905: 0xE2A9, 29475 - 11905: 0xAA66, 29476 - 11905: 0xAA67, 29477 - 11905: 0xE2AB, 29478 - 11905: 0xAA68, 29479 - 11905: 0xAA69, 29480 - 11905: 0xAA6A, 29481 - 11905: 0xD0C9, 29482 - 11905: 0xD6ED, 29483 - 11905: 0xC3A8, 29484 - 11905: 0xE2AC, 29485 - 11905: 0xAA6B, 29486 - 11905: 0xCFD7, 29487 - 11905: 0xAA6C, 29488 - 11905: 0xAA6D, 29489 - 11905: 0xE2AE, 29490 - 11905: 0xAA6E, 29491 - 11905: 0xAA6F, 29492 - 11905: 0xBAEF, 29493 - 11905: 0xAA70, 29494 - 11905: 0xAA71, 29495 - 11905: 0xE9E0, 29496 - 11905: 0xE2AD, 29497 - 11905: 0xE2AA, 29498 - 11905: 0xAA72, 29499 - 11905: 0xAA73, 29500 - 11905: 0xAA74, 29501 - 11905: 0xAA75, 29502 - 11905: 0xBBAB, 29503 - 11905: 0xD4B3, 29504 - 11905: 0xAA76, 29505 - 11905: 0xAA77, 29506 - 11905: 0xAA78, 29507 - 11905: 0xAA79, 29508 - 11905: 0xAA7A, 29509 - 11905: 0xAA7B, 29510 - 11905: 0xAA7C, 29511 - 11905: 0xAA7D, 29512 - 11905: 0xAA7E, 29513 - 11905: 0xAA80, 29514 - 11905: 0xAA81, 29515 - 11905: 0xAA82, 29516 - 11905: 0xAA83, 29517 - 11905: 0xE2B0, 29518 - 11905: 0xAA84, 29519 - 11905: 0xAA85, 29520 - 11905: 0xE2AF, 29521 - 11905: 0xAA86, 29522 - 11905: 0xE9E1, 29523 - 11905: 0xAA87, 29524 - 11905: 0xAA88, 29525 - 11905: 0xAA89, 29526 - 11905: 0xAA8A, 29527 - 11905: 0xE2B1, 29528 - 11905: 0xAA8B, 29529 - 11905: 0xAA8C, 29530 - 11905: 0xAA8D, 29531 - 11905: 0xAA8E, 29532 - 11905: 0xAA8F, 29533 - 11905: 0xAA90, 29534 - 11905: 0xAA91, 29535 - 11905: 0xAA92, 29536 - 11905: 0xE2B2, 29537 - 11905: 0xAA93, 29538 - 11905: 0xAA94, 29539 - 11905: 0xAA95, 29540 - 11905: 0xAA96, 29541 - 11905: 0xAA97, 29542 - 11905: 0xAA98, 29543 - 11905: 0xAA99, 29544 - 11905: 0xAA9A, 29545 - 11905: 0xAA9B, 29546 - 11905: 0xAA9C, 29547 - 11905: 0xAA9D, 29548 - 11905: 0xE2B3, 29549 - 11905: 0xCCA1, 29550 - 11905: 0xAA9E, 29551 - 11905: 0xE2B4, 29552 - 11905: 0xAA9F, 29553 - 11905: 0xAAA0, 29554 - 11905: 0xAB40, 29555 - 11905: 0xAB41, 29556 - 11905: 0xAB42, 29557 - 11905: 0xAB43, 29558 - 11905: 0xAB44, 29559 - 11905: 0xAB45, 29560 - 11905: 0xAB46, 29561 - 11905: 0xAB47, 29562 - 11905: 0xAB48, 29563 - 11905: 0xAB49, 29564 - 11905: 0xAB4A, 29565 - 11905: 0xAB4B, 29566 - 11905: 0xE2B5, 29567 - 11905: 0xAB4C, 29568 - 11905: 0xAB4D, 29569 - 11905: 0xAB4E, 29570 - 11905: 0xAB4F, 29571 - 11905: 0xAB50, 29572 - 11905: 0xD0FE, 29573 - 11905: 0xAB51, 29574 - 11905: 0xAB52, 29575 - 11905: 0xC2CA, 29576 - 11905: 0xAB53, 29577 - 11905: 0xD3F1, 29578 - 11905: 0xAB54, 29579 - 11905: 0xCDF5, 29580 - 11905: 0xAB55, 29581 - 11905: 0xAB56, 29582 - 11905: 0xE7E0, 29583 - 11905: 0xAB57, 29584 - 11905: 0xAB58, 29585 - 11905: 0xE7E1, 29586 - 11905: 0xAB59, 29587 - 11905: 0xAB5A, 29588 - 11905: 0xAB5B, 29589 - 11905: 0xAB5C, 29590 - 11905: 0xBEC1, 29591 - 11905: 0xAB5D, 29592 - 11905: 0xAB5E, 29593 - 11905: 0xAB5F, 29594 - 11905: 0xAB60, 29595 - 11905: 0xC2EA, 29596 - 11905: 0xAB61, 29597 - 11905: 0xAB62, 29598 - 11905: 0xAB63, 29599 - 11905: 0xE7E4, 29600 - 11905: 0xAB64, 29601 - 11905: 0xAB65, 29602 - 11905: 0xE7E3, 29603 - 11905: 0xAB66, 29604 - 11905: 0xAB67, 29605 - 11905: 0xAB68, 29606 - 11905: 0xAB69, 29607 - 11905: 0xAB6A, 29608 - 11905: 0xAB6B, 29609 - 11905: 0xCDE6, 29610 - 11905: 0xAB6C, 29611 - 11905: 0xC3B5, 29612 - 11905: 0xAB6D, 29613 - 11905: 0xAB6E, 29614 - 11905: 0xE7E2, 29615 - 11905: 0xBBB7, 29616 - 11905: 0xCFD6, 29617 - 11905: 0xAB6F, 29618 - 11905: 0xC1E1, 29619 - 11905: 0xE7E9, 29620 - 11905: 0xAB70, 29621 - 11905: 0xAB71, 29622 - 11905: 0xAB72, 29623 - 11905: 0xE7E8, 29624 - 11905: 0xAB73, 29625 - 11905: 0xAB74, 29626 - 11905: 0xE7F4, 29627 - 11905: 0xB2A3, 29628 - 11905: 0xAB75, 29629 - 11905: 0xAB76, 29630 - 11905: 0xAB77, 29631 - 11905: 0xAB78, 29632 - 11905: 0xE7EA, 29633 - 11905: 0xAB79, 29634 - 11905: 0xE7E6, 29635 - 11905: 0xAB7A, 29636 - 11905: 0xAB7B, 29637 - 11905: 0xAB7C, 29638 - 11905: 0xAB7D, 29639 - 11905: 0xAB7E, 29640 - 11905: 0xE7EC, 29641 - 11905: 0xE7EB, 29642 - 11905: 0xC9BA, 29643 - 11905: 0xAB80, 29644 - 11905: 0xAB81, 29645 - 11905: 0xD5E4, 29646 - 11905: 0xAB82, 29647 - 11905: 0xE7E5, 29648 - 11905: 0xB7A9, 29649 - 11905: 0xE7E7, 29650 - 11905: 0xAB83, 29651 - 11905: 0xAB84, 29652 - 11905: 0xAB85, 29653 - 11905: 0xAB86, 29654 - 11905: 0xAB87, 29655 - 11905: 0xAB88, 29656 - 11905: 0xAB89, 29657 - 11905: 0xE7EE, 29658 - 11905: 0xAB8A, 29659 - 11905: 0xAB8B, 29660 - 11905: 0xAB8C, 29661 - 11905: 0xAB8D, 29662 - 11905: 0xE7F3, 29663 - 11905: 0xAB8E, 29664 - 11905: 0xD6E9, 29665 - 11905: 0xAB8F, 29666 - 11905: 0xAB90, 29667 - 11905: 0xAB91, 29668 - 11905: 0xAB92, 29669 - 11905: 0xE7ED, 29670 - 11905: 0xAB93, 29671 - 11905: 0xE7F2, 29672 - 11905: 0xAB94, 29673 - 11905: 0xE7F1, 29674 - 11905: 0xAB95, 29675 - 11905: 0xAB96, 29676 - 11905: 0xAB97, 29677 - 11905: 0xB0E0, 29678 - 11905: 0xAB98, 29679 - 11905: 0xAB99, 29680 - 11905: 0xAB9A, 29681 - 11905: 0xAB9B, 29682 - 11905: 0xE7F5, 29683 - 11905: 0xAB9C, 29684 - 11905: 0xAB9D, 29685 - 11905: 0xAB9E, 29686 - 11905: 0xAB9F, 29687 - 11905: 0xABA0, 29688 - 11905: 0xAC40, 29689 - 11905: 0xAC41, 29690 - 11905: 0xAC42, 29691 - 11905: 0xAC43, 29692 - 11905: 0xAC44, 29693 - 11905: 0xAC45, 29694 - 11905: 0xAC46, 29695 - 11905: 0xAC47, 29696 - 11905: 0xAC48, 29697 - 11905: 0xAC49, 29698 - 11905: 0xAC4A, 29699 - 11905: 0xC7F2, 29700 - 11905: 0xAC4B, 29701 - 11905: 0xC0C5, 29702 - 11905: 0xC0ED, 29703 - 11905: 0xAC4C, 29704 - 11905: 0xAC4D, 29705 - 11905: 0xC1F0, 29706 - 11905: 0xE7F0, 29707 - 11905: 0xAC4E, 29708 - 11905: 0xAC4F, 29709 - 11905: 0xAC50, 29710 - 11905: 0xAC51, 29711 - 11905: 0xE7F6, 29712 - 11905: 0xCBF6, 29713 - 11905: 0xAC52, 29714 - 11905: 0xAC53, 29715 - 11905: 0xAC54, 29716 - 11905: 0xAC55, 29717 - 11905: 0xAC56, 29718 - 11905: 0xAC57, 29719 - 11905: 0xAC58, 29720 - 11905: 0xAC59, 29721 - 11905: 0xAC5A, 29722 - 11905: 0xE8A2, 29723 - 11905: 0xE8A1, 29724 - 11905: 0xAC5B, 29725 - 11905: 0xAC5C, 29726 - 11905: 0xAC5D, 29727 - 11905: 0xAC5E, 29728 - 11905: 0xAC5F, 29729 - 11905: 0xAC60, 29730 - 11905: 0xD7C1, 29731 - 11905: 0xAC61, 29732 - 11905: 0xAC62, 29733 - 11905: 0xE7FA, 29734 - 11905: 0xE7F9, 29735 - 11905: 0xAC63, 29736 - 11905: 0xE7FB, 29737 - 11905: 0xAC64, 29738 - 11905: 0xE7F7, 29739 - 11905: 0xAC65, 29740 - 11905: 0xE7FE, 29741 - 11905: 0xAC66, 29742 - 11905: 0xE7FD, 29743 - 11905: 0xAC67, 29744 - 11905: 0xE7FC, 29745 - 11905: 0xAC68, 29746 - 11905: 0xAC69, 29747 - 11905: 0xC1D5, 29748 - 11905: 0xC7D9, 29749 - 11905: 0xC5FD, 29750 - 11905: 0xC5C3, 29751 - 11905: 0xAC6A, 29752 - 11905: 0xAC6B, 29753 - 11905: 0xAC6C, 29754 - 11905: 0xAC6D, 29755 - 11905: 0xAC6E, 29756 - 11905: 0xC7ED, 29757 - 11905: 0xAC6F, 29758 - 11905: 0xAC70, 29759 - 11905: 0xAC71, 29760 - 11905: 0xAC72, 29761 - 11905: 0xE8A3, 29762 - 11905: 0xAC73, 29763 - 11905: 0xAC74, 29764 - 11905: 0xAC75, 29765 - 11905: 0xAC76, 29766 - 11905: 0xAC77, 29767 - 11905: 0xAC78, 29768 - 11905: 0xAC79, 29769 - 11905: 0xAC7A, 29770 - 11905: 0xAC7B, 29771 - 11905: 0xAC7C, 29772 - 11905: 0xAC7D, 29773 - 11905: 0xAC7E, 29774 - 11905: 0xAC80, 29775 - 11905: 0xAC81, 29776 - 11905: 0xAC82, 29777 - 11905: 0xAC83, 29778 - 11905: 0xAC84, 29779 - 11905: 0xAC85, 29780 - 11905: 0xAC86, 29781 - 11905: 0xE8A6, 29782 - 11905: 0xAC87, 29783 - 11905: 0xE8A5, 29784 - 11905: 0xAC88, 29785 - 11905: 0xE8A7, 29786 - 11905: 0xBAF7, 29787 - 11905: 0xE7F8, 29788 - 11905: 0xE8A4, 29789 - 11905: 0xAC89, 29790 - 11905: 0xC8F0, 29791 - 11905: 0xC9AA, 29792 - 11905: 0xAC8A, 29793 - 11905: 0xAC8B, 29794 - 11905: 0xAC8C, 29795 - 11905: 0xAC8D, 29796 - 11905: 0xAC8E, 29797 - 11905: 0xAC8F, 29798 - 11905: 0xAC90, 29799 - 11905: 0xAC91, 29800 - 11905: 0xAC92, 29801 - 11905: 0xAC93, 29802 - 11905: 0xAC94, 29803 - 11905: 0xAC95, 29804 - 11905: 0xAC96, 29805 - 11905: 0xE8A9, 29806 - 11905: 0xAC97, 29807 - 11905: 0xAC98, 29808 - 11905: 0xB9E5, 29809 - 11905: 0xAC99, 29810 - 11905: 0xAC9A, 29811 - 11905: 0xAC9B, 29812 - 11905: 0xAC9C, 29813 - 11905: 0xAC9D, 29814 - 11905: 0xD1FE, 29815 - 11905: 0xE8A8, 29816 - 11905: 0xAC9E, 29817 - 11905: 0xAC9F, 29818 - 11905: 0xACA0, 29819 - 11905: 0xAD40, 29820 - 11905: 0xAD41, 29821 - 11905: 0xAD42, 29822 - 11905: 0xE8AA, 29823 - 11905: 0xAD43, 29824 - 11905: 0xE8AD, 29825 - 11905: 0xE8AE, 29826 - 11905: 0xAD44, 29827 - 11905: 0xC1A7, 29828 - 11905: 0xAD45, 29829 - 11905: 0xAD46, 29830 - 11905: 0xAD47, 29831 - 11905: 0xE8AF, 29832 - 11905: 0xAD48, 29833 - 11905: 0xAD49, 29834 - 11905: 0xAD4A, 29835 - 11905: 0xE8B0, 29836 - 11905: 0xAD4B, 29837 - 11905: 0xAD4C, 29838 - 11905: 0xE8AC, 29839 - 11905: 0xAD4D, 29840 - 11905: 0xE8B4, 29841 - 11905: 0xAD4E, 29842 - 11905: 0xAD4F, 29843 - 11905: 0xAD50, 29844 - 11905: 0xAD51, 29845 - 11905: 0xAD52, 29846 - 11905: 0xAD53, 29847 - 11905: 0xAD54, 29848 - 11905: 0xAD55, 29849 - 11905: 0xAD56, 29850 - 11905: 0xAD57, 29851 - 11905: 0xAD58, 29852 - 11905: 0xE8AB, 29853 - 11905: 0xAD59, 29854 - 11905: 0xE8B1, 29855 - 11905: 0xAD5A, 29856 - 11905: 0xAD5B, 29857 - 11905: 0xAD5C, 29858 - 11905: 0xAD5D, 29859 - 11905: 0xAD5E, 29860 - 11905: 0xAD5F, 29861 - 11905: 0xAD60, 29862 - 11905: 0xAD61, 29863 - 11905: 0xE8B5, 29864 - 11905: 0xE8B2, 29865 - 11905: 0xE8B3, 29866 - 11905: 0xAD62, 29867 - 11905: 0xAD63, 29868 - 11905: 0xAD64, 29869 - 11905: 0xAD65, 29870 - 11905: 0xAD66, 29871 - 11905: 0xAD67, 29872 - 11905: 0xAD68, 29873 - 11905: 0xAD69, 29874 - 11905: 0xAD6A, 29875 - 11905: 0xAD6B, 29876 - 11905: 0xAD6C, 29877 - 11905: 0xAD6D, 29878 - 11905: 0xAD6E, 29879 - 11905: 0xAD6F, 29880 - 11905: 0xAD70, 29881 - 11905: 0xAD71, 29882 - 11905: 0xE8B7, 29883 - 11905: 0xAD72, 29884 - 11905: 0xAD73, 29885 - 11905: 0xAD74, 29886 - 11905: 0xAD75, 29887 - 11905: 0xAD76, 29888 - 11905: 0xAD77, 29889 - 11905: 0xAD78, 29890 - 11905: 0xAD79, 29891 - 11905: 0xAD7A, 29892 - 11905: 0xAD7B, 29893 - 11905: 0xAD7C, 29894 - 11905: 0xAD7D, 29895 - 11905: 0xAD7E, 29896 - 11905: 0xAD80, 29897 - 11905: 0xAD81, 29898 - 11905: 0xAD82, 29899 - 11905: 0xAD83, 29900 - 11905: 0xAD84, 29901 - 11905: 0xAD85, 29902 - 11905: 0xAD86, 29903 - 11905: 0xAD87, 29904 - 11905: 0xAD88, 29905 - 11905: 0xAD89, 29906 - 11905: 0xE8B6, 29907 - 11905: 0xAD8A, 29908 - 11905: 0xAD8B, 29909 - 11905: 0xAD8C, 29910 - 11905: 0xAD8D, 29911 - 11905: 0xAD8E, 29912 - 11905: 0xAD8F, 29913 - 11905: 0xAD90, 29914 - 11905: 0xAD91, 29915 - 11905: 0xAD92, 29916 - 11905: 0xB9CF, 29917 - 11905: 0xAD93, 29918 - 11905: 0xF0AC, 29919 - 11905: 0xAD94, 29920 - 11905: 0xF0AD, 29921 - 11905: 0xAD95, 29922 - 11905: 0xC6B0, 29923 - 11905: 0xB0EA, 29924 - 11905: 0xC8BF, 29925 - 11905: 0xAD96, 29926 - 11905: 0xCDDF, 29927 - 11905: 0xAD97, 29928 - 11905: 0xAD98, 29929 - 11905: 0xAD99, 29930 - 11905: 0xAD9A, 29931 - 11905: 0xAD9B, 29932 - 11905: 0xAD9C, 29933 - 11905: 0xAD9D, 29934 - 11905: 0xCECD, 29935 - 11905: 0xEAB1, 29936 - 11905: 0xAD9E, 29937 - 11905: 0xAD9F, 29938 - 11905: 0xADA0, 29939 - 11905: 0xAE40, 29940 - 11905: 0xEAB2, 29941 - 11905: 0xAE41, 29942 - 11905: 0xC6BF, 29943 - 11905: 0xB4C9, 29944 - 11905: 0xAE42, 29945 - 11905: 0xAE43, 29946 - 11905: 0xAE44, 29947 - 11905: 0xAE45, 29948 - 11905: 0xAE46, 29949 - 11905: 0xAE47, 29950 - 11905: 0xAE48, 29951 - 11905: 0xEAB3, 29952 - 11905: 0xAE49, 29953 - 11905: 0xAE4A, 29954 - 11905: 0xAE4B, 29955 - 11905: 0xAE4C, 29956 - 11905: 0xD5E7, 29957 - 11905: 0xAE4D, 29958 - 11905: 0xAE4E, 29959 - 11905: 0xAE4F, 29960 - 11905: 0xAE50, 29961 - 11905: 0xAE51, 29962 - 11905: 0xAE52, 29963 - 11905: 0xAE53, 29964 - 11905: 0xAE54, 29965 - 11905: 0xDDF9, 29966 - 11905: 0xAE55, 29967 - 11905: 0xEAB4, 29968 - 11905: 0xAE56, 29969 - 11905: 0xEAB5, 29970 - 11905: 0xAE57, 29971 - 11905: 0xEAB6, 29972 - 11905: 0xAE58, 29973 - 11905: 0xAE59, 29974 - 11905: 0xAE5A, 29975 - 11905: 0xAE5B, 29976 - 11905: 0xB8CA, 29977 - 11905: 0xDFB0, 29978 - 11905: 0xC9F5, 29979 - 11905: 0xAE5C, 29980 - 11905: 0xCCF0, 29981 - 11905: 0xAE5D, 29982 - 11905: 0xAE5E, 29983 - 11905: 0xC9FA, 29984 - 11905: 0xAE5F, 29985 - 11905: 0xAE60, 29986 - 11905: 0xAE61, 29987 - 11905: 0xAE62, 29988 - 11905: 0xAE63, 29989 - 11905: 0xC9FB, 29990 - 11905: 0xAE64, 29991 - 11905: 0xAE65, 29992 - 11905: 0xD3C3, 29993 - 11905: 0xCBA6, 29994 - 11905: 0xAE66, 29995 - 11905: 0xB8A6, 29996 - 11905: 0xF0AE, 29997 - 11905: 0xB1C2, 29998 - 11905: 0xAE67, 29999 - 11905: 0xE5B8, 30000 - 11905: 0xCCEF, 30001 - 11905: 0xD3C9, 30002 - 11905: 0xBCD7, 30003 - 11905: 0xC9EA, 30004 - 11905: 0xAE68, 30005 - 11905: 0xB5E7, 30006 - 11905: 0xAE69, 30007 - 11905: 0xC4D0, 30008 - 11905: 0xB5E9, 30009 - 11905: 0xAE6A, 30010 - 11905: 0xEEAE, 30011 - 11905: 0xBBAD, 30012 - 11905: 0xAE6B, 30013 - 11905: 0xAE6C, 30014 - 11905: 0xE7DE, 30015 - 11905: 0xAE6D, 30016 - 11905: 0xEEAF, 30017 - 11905: 0xAE6E, 30018 - 11905: 0xAE6F, 30019 - 11905: 0xAE70, 30020 - 11905: 0xAE71, 30021 - 11905: 0xB3A9, 30022 - 11905: 0xAE72, 30023 - 11905: 0xAE73, 30024 - 11905: 0xEEB2, 30025 - 11905: 0xAE74, 30026 - 11905: 0xAE75, 30027 - 11905: 0xEEB1, 30028 - 11905: 0xBDE7, 30029 - 11905: 0xAE76, 30030 - 11905: 0xEEB0, 30031 - 11905: 0xCEB7, 30032 - 11905: 0xAE77, 30033 - 11905: 0xAE78, 30034 - 11905: 0xAE79, 30035 - 11905: 0xAE7A, 30036 - 11905: 0xC5CF, 30037 - 11905: 0xAE7B, 30038 - 11905: 0xAE7C, 30039 - 11905: 0xAE7D, 30040 - 11905: 0xAE7E, 30041 - 11905: 0xC1F4, 30042 - 11905: 0xDBCE, 30043 - 11905: 0xEEB3, 30044 - 11905: 0xD0F3, 30045 - 11905: 0xAE80, 30046 - 11905: 0xAE81, 30047 - 11905: 0xAE82, 30048 - 11905: 0xAE83, 30049 - 11905: 0xAE84, 30050 - 11905: 0xAE85, 30051 - 11905: 0xAE86, 30052 - 11905: 0xAE87, 30053 - 11905: 0xC2D4, 30054 - 11905: 0xC6E8, 30055 - 11905: 0xAE88, 30056 - 11905: 0xAE89, 30057 - 11905: 0xAE8A, 30058 - 11905: 0xB7AC, 30059 - 11905: 0xAE8B, 30060 - 11905: 0xAE8C, 30061 - 11905: 0xAE8D, 30062 - 11905: 0xAE8E, 30063 - 11905: 0xAE8F, 30064 - 11905: 0xAE90, 30065 - 11905: 0xAE91, 30066 - 11905: 0xEEB4, 30067 - 11905: 0xAE92, 30068 - 11905: 0xB3EB, 30069 - 11905: 0xAE93, 30070 - 11905: 0xAE94, 30071 - 11905: 0xAE95, 30072 - 11905: 0xBBFB, 30073 - 11905: 0xEEB5, 30074 - 11905: 0xAE96, 30075 - 11905: 0xAE97, 30076 - 11905: 0xAE98, 30077 - 11905: 0xAE99, 30078 - 11905: 0xAE9A, 30079 - 11905: 0xE7DC, 30080 - 11905: 0xAE9B, 30081 - 11905: 0xAE9C, 30082 - 11905: 0xAE9D, 30083 - 11905: 0xEEB6, 30084 - 11905: 0xAE9E, 30085 - 11905: 0xAE9F, 30086 - 11905: 0xBDAE, 30087 - 11905: 0xAEA0, 30088 - 11905: 0xAF40, 30089 - 11905: 0xAF41, 30090 - 11905: 0xAF42, 30091 - 11905: 0xF1E2, 30092 - 11905: 0xAF43, 30093 - 11905: 0xAF44, 30094 - 11905: 0xAF45, 30095 - 11905: 0xCAE8, 30096 - 11905: 0xAF46, 30097 - 11905: 0xD2C9, 30098 - 11905: 0xF0DA, 30099 - 11905: 0xAF47, 30100 - 11905: 0xF0DB, 30101 - 11905: 0xAF48, 30102 - 11905: 0xF0DC, 30103 - 11905: 0xC1C6, 30104 - 11905: 0xAF49, 30105 - 11905: 0xB8ED, 30106 - 11905: 0xBECE, 30107 - 11905: 0xAF4A, 30108 - 11905: 0xAF4B, 30109 - 11905: 0xF0DE, 30110 - 11905: 0xAF4C, 30111 - 11905: 0xC5B1, 30112 - 11905: 0xF0DD, 30113 - 11905: 0xD1F1, 30114 - 11905: 0xAF4D, 30115 - 11905: 0xF0E0, 30116 - 11905: 0xB0CC, 30117 - 11905: 0xBDEA, 30118 - 11905: 0xAF4E, 30119 - 11905: 0xAF4F, 30120 - 11905: 0xAF50, 30121 - 11905: 0xAF51, 30122 - 11905: 0xAF52, 30123 - 11905: 0xD2DF, 30124 - 11905: 0xF0DF, 30125 - 11905: 0xAF53, 30126 - 11905: 0xB4AF, 30127 - 11905: 0xB7E8, 30128 - 11905: 0xF0E6, 30129 - 11905: 0xF0E5, 30130 - 11905: 0xC6A3, 30131 - 11905: 0xF0E1, 30132 - 11905: 0xF0E2, 30133 - 11905: 0xB4C3, 30134 - 11905: 0xAF54, 30135 - 11905: 0xAF55, 30136 - 11905: 0xF0E3, 30137 - 11905: 0xD5EE, 30138 - 11905: 0xAF56, 30139 - 11905: 0xAF57, 30140 - 11905: 0xCCDB, 30141 - 11905: 0xBED2, 30142 - 11905: 0xBCB2, 30143 - 11905: 0xAF58, 30144 - 11905: 0xAF59, 30145 - 11905: 0xAF5A, 30146 - 11905: 0xF0E8, 30147 - 11905: 0xF0E7, 30148 - 11905: 0xF0E4, 30149 - 11905: 0xB2A1, 30150 - 11905: 0xAF5B, 30151 - 11905: 0xD6A2, 30152 - 11905: 0xD3B8, 30153 - 11905: 0xBEB7, 30154 - 11905: 0xC8AC, 30155 - 11905: 0xAF5C, 30156 - 11905: 0xAF5D, 30157 - 11905: 0xF0EA, 30158 - 11905: 0xAF5E, 30159 - 11905: 0xAF5F, 30160 - 11905: 0xAF60, 30161 - 11905: 0xAF61, 30162 - 11905: 0xD1F7, 30163 - 11905: 0xAF62, 30164 - 11905: 0xD6CC, 30165 - 11905: 0xBADB, 30166 - 11905: 0xF0E9, 30167 - 11905: 0xAF63, 30168 - 11905: 0xB6BB, 30169 - 11905: 0xAF64, 30170 - 11905: 0xAF65, 30171 - 11905: 0xCDB4, 30172 - 11905: 0xAF66, 30173 - 11905: 0xAF67, 30174 - 11905: 0xC6A6, 30175 - 11905: 0xAF68, 30176 - 11905: 0xAF69, 30177 - 11905: 0xAF6A, 30178 - 11905: 0xC1A1, 30179 - 11905: 0xF0EB, 30180 - 11905: 0xF0EE, 30181 - 11905: 0xAF6B, 30182 - 11905: 0xF0ED, 30183 - 11905: 0xF0F0, 30184 - 11905: 0xF0EC, 30185 - 11905: 0xAF6C, 30186 - 11905: 0xBBBE, 30187 - 11905: 0xF0EF, 30188 - 11905: 0xAF6D, 30189 - 11905: 0xAF6E, 30190 - 11905: 0xAF6F, 30191 - 11905: 0xAF70, 30192 - 11905: 0xCCB5, 30193 - 11905: 0xF0F2, 30194 - 11905: 0xAF71, 30195 - 11905: 0xAF72, 30196 - 11905: 0xB3D5, 30197 - 11905: 0xAF73, 30198 - 11905: 0xAF74, 30199 - 11905: 0xAF75, 30200 - 11905: 0xAF76, 30201 - 11905: 0xB1D4, 30202 - 11905: 0xAF77, 30203 - 11905: 0xAF78, 30204 - 11905: 0xF0F3, 30205 - 11905: 0xAF79, 30206 - 11905: 0xAF7A, 30207 - 11905: 0xF0F4, 30208 - 11905: 0xF0F6, 30209 - 11905: 0xB4E1, 30210 - 11905: 0xAF7B, 30211 - 11905: 0xF0F1, 30212 - 11905: 0xAF7C, 30213 - 11905: 0xF0F7, 30214 - 11905: 0xAF7D, 30215 - 11905: 0xAF7E, 30216 - 11905: 0xAF80, 30217 - 11905: 0xAF81, 30218 - 11905: 0xF0FA, 30219 - 11905: 0xAF82, 30220 - 11905: 0xF0F8, 30221 - 11905: 0xAF83, 30222 - 11905: 0xAF84, 30223 - 11905: 0xAF85, 30224 - 11905: 0xF0F5, 30225 - 11905: 0xAF86, 30226 - 11905: 0xAF87, 30227 - 11905: 0xAF88, 30228 - 11905: 0xAF89, 30229 - 11905: 0xF0FD, 30230 - 11905: 0xAF8A, 30231 - 11905: 0xF0F9, 30232 - 11905: 0xF0FC, 30233 - 11905: 0xF0FE, 30234 - 11905: 0xAF8B, 30235 - 11905: 0xF1A1, 30236 - 11905: 0xAF8C, 30237 - 11905: 0xAF8D, 30238 - 11905: 0xAF8E, 30239 - 11905: 0xCEC1, 30240 - 11905: 0xF1A4, 30241 - 11905: 0xAF8F, 30242 - 11905: 0xF1A3, 30243 - 11905: 0xAF90, 30244 - 11905: 0xC1F6, 30245 - 11905: 0xF0FB, 30246 - 11905: 0xCADD, 30247 - 11905: 0xAF91, 30248 - 11905: 0xAF92, 30249 - 11905: 0xB4F1, 30250 - 11905: 0xB1F1, 30251 - 11905: 0xCCB1, 30252 - 11905: 0xAF93, 30253 - 11905: 0xF1A6, 30254 - 11905: 0xAF94, 30255 - 11905: 0xAF95, 30256 - 11905: 0xF1A7, 30257 - 11905: 0xAF96, 30258 - 11905: 0xAF97, 30259 - 11905: 0xF1AC, 30260 - 11905: 0xD5CE, 30261 - 11905: 0xF1A9, 30262 - 11905: 0xAF98, 30263 - 11905: 0xAF99, 30264 - 11905: 0xC8B3, 30265 - 11905: 0xAF9A, 30266 - 11905: 0xAF9B, 30267 - 11905: 0xAF9C, 30268 - 11905: 0xF1A2, 30269 - 11905: 0xAF9D, 30270 - 11905: 0xF1AB, 30271 - 11905: 0xF1A8, 30272 - 11905: 0xF1A5, 30273 - 11905: 0xAF9E, 30274 - 11905: 0xAF9F, 30275 - 11905: 0xF1AA, 30276 - 11905: 0xAFA0, 30277 - 11905: 0xB040, 30278 - 11905: 0xB041, 30279 - 11905: 0xB042, 30280 - 11905: 0xB043, 30281 - 11905: 0xB044, 30282 - 11905: 0xB045, 30283 - 11905: 0xB046, 30284 - 11905: 0xB0A9, 30285 - 11905: 0xF1AD, 30286 - 11905: 0xB047, 30287 - 11905: 0xB048, 30288 - 11905: 0xB049, 30289 - 11905: 0xB04A, 30290 - 11905: 0xB04B, 30291 - 11905: 0xB04C, 30292 - 11905: 0xF1AF, 30293 - 11905: 0xB04D, 30294 - 11905: 0xF1B1, 30295 - 11905: 0xB04E, 30296 - 11905: 0xB04F, 30297 - 11905: 0xB050, 30298 - 11905: 0xB051, 30299 - 11905: 0xB052, 30300 - 11905: 0xF1B0, 30301 - 11905: 0xB053, 30302 - 11905: 0xF1AE, 30303 - 11905: 0xB054, 30304 - 11905: 0xB055, 30305 - 11905: 0xB056, 30306 - 11905: 0xB057, 30307 - 11905: 0xD1A2, 30308 - 11905: 0xB058, 30309 - 11905: 0xB059, 30310 - 11905: 0xB05A, 30311 - 11905: 0xB05B, 30312 - 11905: 0xB05C, 30313 - 11905: 0xB05D, 30314 - 11905: 0xB05E, 30315 - 11905: 0xF1B2, 30316 - 11905: 0xB05F, 30317 - 11905: 0xB060, 30318 - 11905: 0xB061, 30319 - 11905: 0xF1B3, 30320 - 11905: 0xB062, 30321 - 11905: 0xB063, 30322 - 11905: 0xB064, 30323 - 11905: 0xB065, 30324 - 11905: 0xB066, 30325 - 11905: 0xB067, 30326 - 11905: 0xB068, 30327 - 11905: 0xB069, 30328 - 11905: 0xB9EF, 30329 - 11905: 0xB06A, 30330 - 11905: 0xB06B, 30331 - 11905: 0xB5C7, 30332 - 11905: 0xB06C, 30333 - 11905: 0xB0D7, 30334 - 11905: 0xB0D9, 30335 - 11905: 0xB06D, 30336 - 11905: 0xB06E, 30337 - 11905: 0xB06F, 30338 - 11905: 0xD4ED, 30339 - 11905: 0xB070, 30340 - 11905: 0xB5C4, 30341 - 11905: 0xB071, 30342 - 11905: 0xBDD4, 30343 - 11905: 0xBBCA, 30344 - 11905: 0xF0A7, 30345 - 11905: 0xB072, 30346 - 11905: 0xB073, 30347 - 11905: 0xB8DE, 30348 - 11905: 0xB074, 30349 - 11905: 0xB075, 30350 - 11905: 0xF0A8, 30351 - 11905: 0xB076, 30352 - 11905: 0xB077, 30353 - 11905: 0xB0A8, 30354 - 11905: 0xB078, 30355 - 11905: 0xF0A9, 30356 - 11905: 0xB079, 30357 - 11905: 0xB07A, 30358 - 11905: 0xCDEE, 30359 - 11905: 0xB07B, 30360 - 11905: 0xB07C, 30361 - 11905: 0xF0AA, 30362 - 11905: 0xB07D, 30363 - 11905: 0xB07E, 30364 - 11905: 0xB080, 30365 - 11905: 0xB081, 30366 - 11905: 0xB082, 30367 - 11905: 0xB083, 30368 - 11905: 0xB084, 30369 - 11905: 0xB085, 30370 - 11905: 0xB086, 30371 - 11905: 0xB087, 30372 - 11905: 0xF0AB, 30373 - 11905: 0xB088, 30374 - 11905: 0xB089, 30375 - 11905: 0xB08A, 30376 - 11905: 0xB08B, 30377 - 11905: 0xB08C, 30378 - 11905: 0xB08D, 30379 - 11905: 0xB08E, 30380 - 11905: 0xB08F, 30381 - 11905: 0xB090, 30382 - 11905: 0xC6A4, 30383 - 11905: 0xB091, 30384 - 11905: 0xB092, 30385 - 11905: 0xD6E5, 30386 - 11905: 0xF1E4, 30387 - 11905: 0xB093, 30388 - 11905: 0xF1E5, 30389 - 11905: 0xB094, 30390 - 11905: 0xB095, 30391 - 11905: 0xB096, 30392 - 11905: 0xB097, 30393 - 11905: 0xB098, 30394 - 11905: 0xB099, 30395 - 11905: 0xB09A, 30396 - 11905: 0xB09B, 30397 - 11905: 0xB09C, 30398 - 11905: 0xB09D, 30399 - 11905: 0xC3F3, 30400 - 11905: 0xB09E, 30401 - 11905: 0xB09F, 30402 - 11905: 0xD3DB, 30403 - 11905: 0xB0A0, 30404 - 11905: 0xB140, 30405 - 11905: 0xD6D1, 30406 - 11905: 0xC5E8, 30407 - 11905: 0xB141, 30408 - 11905: 0xD3AF, 30409 - 11905: 0xB142, 30410 - 11905: 0xD2E6, 30411 - 11905: 0xB143, 30412 - 11905: 0xB144, 30413 - 11905: 0xEEC1, 30414 - 11905: 0xB0BB, 30415 - 11905: 0xD5B5, 30416 - 11905: 0xD1CE, 30417 - 11905: 0xBCE0, 30418 - 11905: 0xBAD0, 30419 - 11905: 0xB145, 30420 - 11905: 0xBFF8, 30421 - 11905: 0xB146, 30422 - 11905: 0xB8C7, 30423 - 11905: 0xB5C1, 30424 - 11905: 0xC5CC, 30425 - 11905: 0xB147, 30426 - 11905: 0xB148, 30427 - 11905: 0xCAA2, 30428 - 11905: 0xB149, 30429 - 11905: 0xB14A, 30430 - 11905: 0xB14B, 30431 - 11905: 0xC3CB, 30432 - 11905: 0xB14C, 30433 - 11905: 0xB14D, 30434 - 11905: 0xB14E, 30435 - 11905: 0xB14F, 30436 - 11905: 0xB150, 30437 - 11905: 0xEEC2, 30438 - 11905: 0xB151, 30439 - 11905: 0xB152, 30440 - 11905: 0xB153, 30441 - 11905: 0xB154, 30442 - 11905: 0xB155, 30443 - 11905: 0xB156, 30444 - 11905: 0xB157, 30445 - 11905: 0xB158, 30446 - 11905: 0xC4BF, 30447 - 11905: 0xB6A2, 30448 - 11905: 0xB159, 30449 - 11905: 0xEDEC, 30450 - 11905: 0xC3A4, 30451 - 11905: 0xB15A, 30452 - 11905: 0xD6B1, 30453 - 11905: 0xB15B, 30454 - 11905: 0xB15C, 30455 - 11905: 0xB15D, 30456 - 11905: 0xCFE0, 30457 - 11905: 0xEDEF, 30458 - 11905: 0xB15E, 30459 - 11905: 0xB15F, 30460 - 11905: 0xC5CE, 30461 - 11905: 0xB160, 30462 - 11905: 0xB6DC, 30463 - 11905: 0xB161, 30464 - 11905: 0xB162, 30465 - 11905: 0xCAA1, 30466 - 11905: 0xB163, 30467 - 11905: 0xB164, 30468 - 11905: 0xEDED, 30469 - 11905: 0xB165, 30470 - 11905: 0xB166, 30471 - 11905: 0xEDF0, 30472 - 11905: 0xEDF1, 30473 - 11905: 0xC3BC, 30474 - 11905: 0xB167, 30475 - 11905: 0xBFB4, 30476 - 11905: 0xB168, 30477 - 11905: 0xEDEE, 30478 - 11905: 0xB169, 30479 - 11905: 0xB16A, 30480 - 11905: 0xB16B, 30481 - 11905: 0xB16C, 30482 - 11905: 0xB16D, 30483 - 11905: 0xB16E, 30484 - 11905: 0xB16F, 30485 - 11905: 0xB170, 30486 - 11905: 0xB171, 30487 - 11905: 0xB172, 30488 - 11905: 0xB173, 30489 - 11905: 0xEDF4, 30490 - 11905: 0xEDF2, 30491 - 11905: 0xB174, 30492 - 11905: 0xB175, 30493 - 11905: 0xB176, 30494 - 11905: 0xB177, 30495 - 11905: 0xD5E6, 30496 - 11905: 0xC3DF, 30497 - 11905: 0xB178, 30498 - 11905: 0xEDF3, 30499 - 11905: 0xB179, 30500 - 11905: 0xB17A, 30501 - 11905: 0xB17B, 30502 - 11905: 0xEDF6, 30503 - 11905: 0xB17C, 30504 - 11905: 0xD5A3, 30505 - 11905: 0xD1A3, 30506 - 11905: 0xB17D, 30507 - 11905: 0xB17E, 30508 - 11905: 0xB180, 30509 - 11905: 0xEDF5, 30510 - 11905: 0xB181, 30511 - 11905: 0xC3D0, 30512 - 11905: 0xB182, 30513 - 11905: 0xB183, 30514 - 11905: 0xB184, 30515 - 11905: 0xB185, 30516 - 11905: 0xB186, 30517 - 11905: 0xEDF7, 30518 - 11905: 0xBFF4, 30519 - 11905: 0xBEEC, 30520 - 11905: 0xEDF8, 30521 - 11905: 0xB187, 30522 - 11905: 0xCCF7, 30523 - 11905: 0xB188, 30524 - 11905: 0xD1DB, 30525 - 11905: 0xB189, 30526 - 11905: 0xB18A, 30527 - 11905: 0xB18B, 30528 - 11905: 0xD7C5, 30529 - 11905: 0xD5F6, 30530 - 11905: 0xB18C, 30531 - 11905: 0xEDFC, 30532 - 11905: 0xB18D, 30533 - 11905: 0xB18E, 30534 - 11905: 0xB18F, 30535 - 11905: 0xEDFB, 30536 - 11905: 0xB190, 30537 - 11905: 0xB191, 30538 - 11905: 0xB192, 30539 - 11905: 0xB193, 30540 - 11905: 0xB194, 30541 - 11905: 0xB195, 30542 - 11905: 0xB196, 30543 - 11905: 0xB197, 30544 - 11905: 0xEDF9, 30545 - 11905: 0xEDFA, 30546 - 11905: 0xB198, 30547 - 11905: 0xB199, 30548 - 11905: 0xB19A, 30549 - 11905: 0xB19B, 30550 - 11905: 0xB19C, 30551 - 11905: 0xB19D, 30552 - 11905: 0xB19E, 30553 - 11905: 0xB19F, 30554 - 11905: 0xEDFD, 30555 - 11905: 0xBEA6, 30556 - 11905: 0xB1A0, 30557 - 11905: 0xB240, 30558 - 11905: 0xB241, 30559 - 11905: 0xB242, 30560 - 11905: 0xB243, 30561 - 11905: 0xCBAF, 30562 - 11905: 0xEEA1, 30563 - 11905: 0xB6BD, 30564 - 11905: 0xB244, 30565 - 11905: 0xEEA2, 30566 - 11905: 0xC4C0, 30567 - 11905: 0xB245, 30568 - 11905: 0xEDFE, 30569 - 11905: 0xB246, 30570 - 11905: 0xB247, 30571 - 11905: 0xBDDE, 30572 - 11905: 0xB2C7, 30573 - 11905: 0xB248, 30574 - 11905: 0xB249, 30575 - 11905: 0xB24A, 30576 - 11905: 0xB24B, 30577 - 11905: 0xB24C, 30578 - 11905: 0xB24D, 30579 - 11905: 0xB24E, 30580 - 11905: 0xB24F, 30581 - 11905: 0xB250, 30582 - 11905: 0xB251, 30583 - 11905: 0xB252, 30584 - 11905: 0xB253, 30585 - 11905: 0xB6C3, 30586 - 11905: 0xB254, 30587 - 11905: 0xB255, 30588 - 11905: 0xB256, 30589 - 11905: 0xEEA5, 30590 - 11905: 0xD8BA, 30591 - 11905: 0xEEA3, 30592 - 11905: 0xEEA6, 30593 - 11905: 0xB257, 30594 - 11905: 0xB258, 30595 - 11905: 0xB259, 30596 - 11905: 0xC3E9, 30597 - 11905: 0xB3F2, 30598 - 11905: 0xB25A, 30599 - 11905: 0xB25B, 30600 - 11905: 0xB25C, 30601 - 11905: 0xB25D, 30602 - 11905: 0xB25E, 30603 - 11905: 0xB25F, 30604 - 11905: 0xEEA7, 30605 - 11905: 0xEEA4, 30606 - 11905: 0xCFB9, 30607 - 11905: 0xB260, 30608 - 11905: 0xB261, 30609 - 11905: 0xEEA8, 30610 - 11905: 0xC2F7, 30611 - 11905: 0xB262, 30612 - 11905: 0xB263, 30613 - 11905: 0xB264, 30614 - 11905: 0xB265, 30615 - 11905: 0xB266, 30616 - 11905: 0xB267, 30617 - 11905: 0xB268, 30618 - 11905: 0xB269, 30619 - 11905: 0xB26A, 30620 - 11905: 0xB26B, 30621 - 11905: 0xB26C, 30622 - 11905: 0xB26D, 30623 - 11905: 0xEEA9, 30624 - 11905: 0xEEAA, 30625 - 11905: 0xB26E, 30626 - 11905: 0xDEAB, 30627 - 11905: 0xB26F, 30628 - 11905: 0xB270, 30629 - 11905: 0xC6B3, 30630 - 11905: 0xB271, 30631 - 11905: 0xC7C6, 30632 - 11905: 0xB272, 30633 - 11905: 0xD6F5, 30634 - 11905: 0xB5C9, 30635 - 11905: 0xB273, 30636 - 11905: 0xCBB2, 30637 - 11905: 0xB274, 30638 - 11905: 0xB275, 30639 - 11905: 0xB276, 30640 - 11905: 0xEEAB, 30641 - 11905: 0xB277, 30642 - 11905: 0xB278, 30643 - 11905: 0xCDAB, 30644 - 11905: 0xB279, 30645 - 11905: 0xEEAC, 30646 - 11905: 0xB27A, 30647 - 11905: 0xB27B, 30648 - 11905: 0xB27C, 30649 - 11905: 0xB27D, 30650 - 11905: 0xB27E, 30651 - 11905: 0xD5B0, 30652 - 11905: 0xB280, 30653 - 11905: 0xEEAD, 30654 - 11905: 0xB281, 30655 - 11905: 0xF6C4, 30656 - 11905: 0xB282, 30657 - 11905: 0xB283, 30658 - 11905: 0xB284, 30659 - 11905: 0xB285, 30660 - 11905: 0xB286, 30661 - 11905: 0xB287, 30662 - 11905: 0xB288, 30663 - 11905: 0xB289, 30664 - 11905: 0xB28A, 30665 - 11905: 0xB28B, 30666 - 11905: 0xB28C, 30667 - 11905: 0xB28D, 30668 - 11905: 0xB28E, 30669 - 11905: 0xDBC7, 30670 - 11905: 0xB28F, 30671 - 11905: 0xB290, 30672 - 11905: 0xB291, 30673 - 11905: 0xB292, 30674 - 11905: 0xB293, 30675 - 11905: 0xB294, 30676 - 11905: 0xB295, 30677 - 11905: 0xB296, 30678 - 11905: 0xB297, 30679 - 11905: 0xB4A3, 30680 - 11905: 0xB298, 30681 - 11905: 0xB299, 30682 - 11905: 0xB29A, 30683 - 11905: 0xC3AC, 30684 - 11905: 0xF1E6, 30685 - 11905: 0xB29B, 30686 - 11905: 0xB29C, 30687 - 11905: 0xB29D, 30688 - 11905: 0xB29E, 30689 - 11905: 0xB29F, 30690 - 11905: 0xCAB8, 30691 - 11905: 0xD2D3, 30692 - 11905: 0xB2A0, 30693 - 11905: 0xD6AA, 30694 - 11905: 0xB340, 30695 - 11905: 0xEFF2, 30696 - 11905: 0xB341, 30697 - 11905: 0xBED8, 30698 - 11905: 0xB342, 30699 - 11905: 0xBDC3, 30700 - 11905: 0xEFF3, 30701 - 11905: 0xB6CC, 30702 - 11905: 0xB0AB, 30703 - 11905: 0xB343, 30704 - 11905: 0xB344, 30705 - 11905: 0xB345, 30706 - 11905: 0xB346, 30707 - 11905: 0xCAAF, 30708 - 11905: 0xB347, 30709 - 11905: 0xB348, 30710 - 11905: 0xEDB6, 30711 - 11905: 0xB349, 30712 - 11905: 0xEDB7, 30713 - 11905: 0xB34A, 30714 - 11905: 0xB34B, 30715 - 11905: 0xB34C, 30716 - 11905: 0xB34D, 30717 - 11905: 0xCEF9, 30718 - 11905: 0xB7AF, 30719 - 11905: 0xBFF3, 30720 - 11905: 0xEDB8, 30721 - 11905: 0xC2EB, 30722 - 11905: 0xC9B0, 30723 - 11905: 0xB34E, 30724 - 11905: 0xB34F, 30725 - 11905: 0xB350, 30726 - 11905: 0xB351, 30727 - 11905: 0xB352, 30728 - 11905: 0xB353, 30729 - 11905: 0xEDB9, 30730 - 11905: 0xB354, 30731 - 11905: 0xB355, 30732 - 11905: 0xC6F6, 30733 - 11905: 0xBFB3, 30734 - 11905: 0xB356, 30735 - 11905: 0xB357, 30736 - 11905: 0xB358, 30737 - 11905: 0xEDBC, 30738 - 11905: 0xC5F8, 30739 - 11905: 0xB359, 30740 - 11905: 0xD1D0, 30741 - 11905: 0xB35A, 30742 - 11905: 0xD7A9, 30743 - 11905: 0xEDBA, 30744 - 11905: 0xEDBB, 30745 - 11905: 0xB35B, 30746 - 11905: 0xD1E2, 30747 - 11905: 0xB35C, 30748 - 11905: 0xEDBF, 30749 - 11905: 0xEDC0, 30750 - 11905: 0xB35D, 30751 - 11905: 0xEDC4, 30752 - 11905: 0xB35E, 30753 - 11905: 0xB35F, 30754 - 11905: 0xB360, 30755 - 11905: 0xEDC8, 30756 - 11905: 0xB361, 30757 - 11905: 0xEDC6, 30758 - 11905: 0xEDCE, 30759 - 11905: 0xD5E8, 30760 - 11905: 0xB362, 30761 - 11905: 0xEDC9, 30762 - 11905: 0xB363, 30763 - 11905: 0xB364, 30764 - 11905: 0xEDC7, 30765 - 11905: 0xEDBE, 30766 - 11905: 0xB365, 30767 - 11905: 0xB366, 30768 - 11905: 0xC5E9, 30769 - 11905: 0xB367, 30770 - 11905: 0xB368, 30771 - 11905: 0xB369, 30772 - 11905: 0xC6C6, 30773 - 11905: 0xB36A, 30774 - 11905: 0xB36B, 30775 - 11905: 0xC9E9, 30776 - 11905: 0xD4D2, 30777 - 11905: 0xEDC1, 30778 - 11905: 0xEDC2, 30779 - 11905: 0xEDC3, 30780 - 11905: 0xEDC5, 30781 - 11905: 0xB36C, 30782 - 11905: 0xC0F9, 30783 - 11905: 0xB36D, 30784 - 11905: 0xB4A1, 30785 - 11905: 0xB36E, 30786 - 11905: 0xB36F, 30787 - 11905: 0xB370, 30788 - 11905: 0xB371, 30789 - 11905: 0xB9E8, 30790 - 11905: 0xB372, 30791 - 11905: 0xEDD0, 30792 - 11905: 0xB373, 30793 - 11905: 0xB374, 30794 - 11905: 0xB375, 30795 - 11905: 0xB376, 30796 - 11905: 0xEDD1, 30797 - 11905: 0xB377, 30798 - 11905: 0xEDCA, 30799 - 11905: 0xB378, 30800 - 11905: 0xEDCF, 30801 - 11905: 0xB379, 30802 - 11905: 0xCEF8, 30803 - 11905: 0xB37A, 30804 - 11905: 0xB37B, 30805 - 11905: 0xCBB6, 30806 - 11905: 0xEDCC, 30807 - 11905: 0xEDCD, 30808 - 11905: 0xB37C, 30809 - 11905: 0xB37D, 30810 - 11905: 0xB37E, 30811 - 11905: 0xB380, 30812 - 11905: 0xB381, 30813 - 11905: 0xCFF5, 30814 - 11905: 0xB382, 30815 - 11905: 0xB383, 30816 - 11905: 0xB384, 30817 - 11905: 0xB385, 30818 - 11905: 0xB386, 30819 - 11905: 0xB387, 30820 - 11905: 0xB388, 30821 - 11905: 0xB389, 30822 - 11905: 0xB38A, 30823 - 11905: 0xB38B, 30824 - 11905: 0xB38C, 30825 - 11905: 0xB38D, 30826 - 11905: 0xEDD2, 30827 - 11905: 0xC1F2, 30828 - 11905: 0xD3B2, 30829 - 11905: 0xEDCB, 30830 - 11905: 0xC8B7, 30831 - 11905: 0xB38E, 30832 - 11905: 0xB38F, 30833 - 11905: 0xB390, 30834 - 11905: 0xB391, 30835 - 11905: 0xB392, 30836 - 11905: 0xB393, 30837 - 11905: 0xB394, 30838 - 11905: 0xB395, 30839 - 11905: 0xBCEF, 30840 - 11905: 0xB396, 30841 - 11905: 0xB397, 30842 - 11905: 0xB398, 30843 - 11905: 0xB399, 30844 - 11905: 0xC5F0, 30845 - 11905: 0xB39A, 30846 - 11905: 0xB39B, 30847 - 11905: 0xB39C, 30848 - 11905: 0xB39D, 30849 - 11905: 0xB39E, 30850 - 11905: 0xB39F, 30851 - 11905: 0xB3A0, 30852 - 11905: 0xB440, 30853 - 11905: 0xB441, 30854 - 11905: 0xB442, 30855 - 11905: 0xEDD6, 30856 - 11905: 0xB443, 30857 - 11905: 0xB5EF, 30858 - 11905: 0xB444, 30859 - 11905: 0xB445, 30860 - 11905: 0xC2B5, 30861 - 11905: 0xB0AD, 30862 - 11905: 0xCBE9, 30863 - 11905: 0xB446, 30864 - 11905: 0xB447, 30865 - 11905: 0xB1AE, 30866 - 11905: 0xB448, 30867 - 11905: 0xEDD4, 30868 - 11905: 0xB449, 30869 - 11905: 0xB44A, 30870 - 11905: 0xB44B, 30871 - 11905: 0xCDEB, 30872 - 11905: 0xB5E2, 30873 - 11905: 0xB44C, 30874 - 11905: 0xEDD5, 30875 - 11905: 0xEDD3, 30876 - 11905: 0xEDD7, 30877 - 11905: 0xB44D, 30878 - 11905: 0xB44E, 30879 - 11905: 0xB5FA, 30880 - 11905: 0xB44F, 30881 - 11905: 0xEDD8, 30882 - 11905: 0xB450, 30883 - 11905: 0xEDD9, 30884 - 11905: 0xB451, 30885 - 11905: 0xEDDC, 30886 - 11905: 0xB452, 30887 - 11905: 0xB1CC, 30888 - 11905: 0xB453, 30889 - 11905: 0xB454, 30890 - 11905: 0xB455, 30891 - 11905: 0xB456, 30892 - 11905: 0xB457, 30893 - 11905: 0xB458, 30894 - 11905: 0xB459, 30895 - 11905: 0xB45A, 30896 - 11905: 0xC5F6, 30897 - 11905: 0xBCEE, 30898 - 11905: 0xEDDA, 30899 - 11905: 0xCCBC, 30900 - 11905: 0xB2EA, 30901 - 11905: 0xB45B, 30902 - 11905: 0xB45C, 30903 - 11905: 0xB45D, 30904 - 11905: 0xB45E, 30905 - 11905: 0xEDDB, 30906 - 11905: 0xB45F, 30907 - 11905: 0xB460, 30908 - 11905: 0xB461, 30909 - 11905: 0xB462, 30910 - 11905: 0xC4EB, 30911 - 11905: 0xB463, 30912 - 11905: 0xB464, 30913 - 11905: 0xB4C5, 30914 - 11905: 0xB465, 30915 - 11905: 0xB466, 30916 - 11905: 0xB467, 30917 - 11905: 0xB0F5, 30918 - 11905: 0xB468, 30919 - 11905: 0xB469, 30920 - 11905: 0xB46A, 30921 - 11905: 0xEDDF, 30922 - 11905: 0xC0DA, 30923 - 11905: 0xB4E8, 30924 - 11905: 0xB46B, 30925 - 11905: 0xB46C, 30926 - 11905: 0xB46D, 30927 - 11905: 0xB46E, 30928 - 11905: 0xC5CD, 30929 - 11905: 0xB46F, 30930 - 11905: 0xB470, 30931 - 11905: 0xB471, 30932 - 11905: 0xEDDD, 30933 - 11905: 0xBFC4, 30934 - 11905: 0xB472, 30935 - 11905: 0xB473, 30936 - 11905: 0xB474, 30937 - 11905: 0xEDDE, 30938 - 11905: 0xB475, 30939 - 11905: 0xB476, 30940 - 11905: 0xB477, 30941 - 11905: 0xB478, 30942 - 11905: 0xB479, 30943 - 11905: 0xB47A, 30944 - 11905: 0xB47B, 30945 - 11905: 0xB47C, 30946 - 11905: 0xB47D, 30947 - 11905: 0xB47E, 30948 - 11905: 0xB480, 30949 - 11905: 0xB481, 30950 - 11905: 0xB482, 30951 - 11905: 0xB483, 30952 - 11905: 0xC4A5, 30953 - 11905: 0xB484, 30954 - 11905: 0xB485, 30955 - 11905: 0xB486, 30956 - 11905: 0xEDE0, 30957 - 11905: 0xB487, 30958 - 11905: 0xB488, 30959 - 11905: 0xB489, 30960 - 11905: 0xB48A, 30961 - 11905: 0xB48B, 30962 - 11905: 0xEDE1, 30963 - 11905: 0xB48C, 30964 - 11905: 0xEDE3, 30965 - 11905: 0xB48D, 30966 - 11905: 0xB48E, 30967 - 11905: 0xC1D7, 30968 - 11905: 0xB48F, 30969 - 11905: 0xB490, 30970 - 11905: 0xBBC7, 30971 - 11905: 0xB491, 30972 - 11905: 0xB492, 30973 - 11905: 0xB493, 30974 - 11905: 0xB494, 30975 - 11905: 0xB495, 30976 - 11905: 0xB496, 30977 - 11905: 0xBDB8, 30978 - 11905: 0xB497, 30979 - 11905: 0xB498, 30980 - 11905: 0xB499, 30981 - 11905: 0xEDE2, 30982 - 11905: 0xB49A, 30983 - 11905: 0xB49B, 30984 - 11905: 0xB49C, 30985 - 11905: 0xB49D, 30986 - 11905: 0xB49E, 30987 - 11905: 0xB49F, 30988 - 11905: 0xB4A0, 30989 - 11905: 0xB540, 30990 - 11905: 0xB541, 30991 - 11905: 0xB542, 30992 - 11905: 0xB543, 30993 - 11905: 0xB544, 30994 - 11905: 0xB545, 30995 - 11905: 0xEDE4, 30996 - 11905: 0xB546, 30997 - 11905: 0xB547, 30998 - 11905: 0xB548, 30999 - 11905: 0xB549, 31000 - 11905: 0xB54A, 31001 - 11905: 0xB54B, 31002 - 11905: 0xB54C, 31003 - 11905: 0xB54D, 31004 - 11905: 0xB54E, 31005 - 11905: 0xB54F, 31006 - 11905: 0xEDE6, 31007 - 11905: 0xB550, 31008 - 11905: 0xB551, 31009 - 11905: 0xB552, 31010 - 11905: 0xB553, 31011 - 11905: 0xB554, 31012 - 11905: 0xEDE5, 31013 - 11905: 0xB555, 31014 - 11905: 0xB556, 31015 - 11905: 0xB557, 31016 - 11905: 0xB558, 31017 - 11905: 0xB559, 31018 - 11905: 0xB55A, 31019 - 11905: 0xB55B, 31020 - 11905: 0xB55C, 31021 - 11905: 0xB55D, 31022 - 11905: 0xB55E, 31023 - 11905: 0xB55F, 31024 - 11905: 0xB560, 31025 - 11905: 0xB561, 31026 - 11905: 0xB562, 31027 - 11905: 0xB563, 31028 - 11905: 0xEDE7, 31029 - 11905: 0xB564, 31030 - 11905: 0xB565, 31031 - 11905: 0xB566, 31032 - 11905: 0xB567, 31033 - 11905: 0xB568, 31034 - 11905: 0xCABE, 31035 - 11905: 0xECEA, 31036 - 11905: 0xC0F1, 31037 - 11905: 0xB569, 31038 - 11905: 0xC9E7, 31039 - 11905: 0xB56A, 31040 - 11905: 0xECEB, 31041 - 11905: 0xC6EE, 31042 - 11905: 0xB56B, 31043 - 11905: 0xB56C, 31044 - 11905: 0xB56D, 31045 - 11905: 0xB56E, 31046 - 11905: 0xECEC, 31047 - 11905: 0xB56F, 31048 - 11905: 0xC6ED, 31049 - 11905: 0xECED, 31050 - 11905: 0xB570, 31051 - 11905: 0xB571, 31052 - 11905: 0xB572, 31053 - 11905: 0xB573, 31054 - 11905: 0xB574, 31055 - 11905: 0xB575, 31056 - 11905: 0xB576, 31057 - 11905: 0xB577, 31058 - 11905: 0xB578, 31059 - 11905: 0xECF0, 31060 - 11905: 0xB579, 31061 - 11905: 0xB57A, 31062 - 11905: 0xD7E6, 31063 - 11905: 0xECF3, 31064 - 11905: 0xB57B, 31065 - 11905: 0xB57C, 31066 - 11905: 0xECF1, 31067 - 11905: 0xECEE, 31068 - 11905: 0xECEF, 31069 - 11905: 0xD7A3, 31070 - 11905: 0xC9F1, 31071 - 11905: 0xCBEE, 31072 - 11905: 0xECF4, 31073 - 11905: 0xB57D, 31074 - 11905: 0xECF2, 31075 - 11905: 0xB57E, 31076 - 11905: 0xB580, 31077 - 11905: 0xCFE9, 31078 - 11905: 0xB581, 31079 - 11905: 0xECF6, 31080 - 11905: 0xC6B1, 31081 - 11905: 0xB582, 31082 - 11905: 0xB583, 31083 - 11905: 0xB584, 31084 - 11905: 0xB585, 31085 - 11905: 0xBCC0, 31086 - 11905: 0xB586, 31087 - 11905: 0xECF5, 31088 - 11905: 0xB587, 31089 - 11905: 0xB588, 31090 - 11905: 0xB589, 31091 - 11905: 0xB58A, 31092 - 11905: 0xB58B, 31093 - 11905: 0xB58C, 31094 - 11905: 0xB58D, 31095 - 11905: 0xB5BB, 31096 - 11905: 0xBBF6, 31097 - 11905: 0xB58E, 31098 - 11905: 0xECF7, 31099 - 11905: 0xB58F, 31100 - 11905: 0xB590, 31101 - 11905: 0xB591, 31102 - 11905: 0xB592, 31103 - 11905: 0xB593, 31104 - 11905: 0xD9F7, 31105 - 11905: 0xBDFB, 31106 - 11905: 0xB594, 31107 - 11905: 0xB595, 31108 - 11905: 0xC2BB, 31109 - 11905: 0xECF8, 31110 - 11905: 0xB596, 31111 - 11905: 0xB597, 31112 - 11905: 0xB598, 31113 - 11905: 0xB599, 31114 - 11905: 0xECF9, 31115 - 11905: 0xB59A, 31116 - 11905: 0xB59B, 31117 - 11905: 0xB59C, 31118 - 11905: 0xB59D, 31119 - 11905: 0xB8A3, 31120 - 11905: 0xB59E, 31121 - 11905: 0xB59F, 31122 - 11905: 0xB5A0, 31123 - 11905: 0xB640, 31124 - 11905: 0xB641, 31125 - 11905: 0xB642, 31126 - 11905: 0xB643, 31127 - 11905: 0xB644, 31128 - 11905: 0xB645, 31129 - 11905: 0xB646, 31130 - 11905: 0xECFA, 31131 - 11905: 0xB647, 31132 - 11905: 0xB648, 31133 - 11905: 0xB649, 31134 - 11905: 0xB64A, 31135 - 11905: 0xB64B, 31136 - 11905: 0xB64C, 31137 - 11905: 0xB64D, 31138 - 11905: 0xB64E, 31139 - 11905: 0xB64F, 31140 - 11905: 0xB650, 31141 - 11905: 0xB651, 31142 - 11905: 0xB652, 31143 - 11905: 0xECFB, 31144 - 11905: 0xB653, 31145 - 11905: 0xB654, 31146 - 11905: 0xB655, 31147 - 11905: 0xB656, 31148 - 11905: 0xB657, 31149 - 11905: 0xB658, 31150 - 11905: 0xB659, 31151 - 11905: 0xB65A, 31152 - 11905: 0xB65B, 31153 - 11905: 0xB65C, 31154 - 11905: 0xB65D, 31155 - 11905: 0xECFC, 31156 - 11905: 0xB65E, 31157 - 11905: 0xB65F, 31158 - 11905: 0xB660, 31159 - 11905: 0xB661, 31160 - 11905: 0xB662, 31161 - 11905: 0xD3ED, 31162 - 11905: 0xD8AE, 31163 - 11905: 0xC0EB, 31164 - 11905: 0xB663, 31165 - 11905: 0xC7DD, 31166 - 11905: 0xBACC, 31167 - 11905: 0xB664, 31168 - 11905: 0xD0E3, 31169 - 11905: 0xCBBD, 31170 - 11905: 0xB665, 31171 - 11905: 0xCDBA, 31172 - 11905: 0xB666, 31173 - 11905: 0xB667, 31174 - 11905: 0xB8D1, 31175 - 11905: 0xB668, 31176 - 11905: 0xB669, 31177 - 11905: 0xB1FC, 31178 - 11905: 0xB66A, 31179 - 11905: 0xC7EF, 31180 - 11905: 0xB66B, 31181 - 11905: 0xD6D6, 31182 - 11905: 0xB66C, 31183 - 11905: 0xB66D, 31184 - 11905: 0xB66E, 31185 - 11905: 0xBFC6, 31186 - 11905: 0xC3EB, 31187 - 11905: 0xB66F, 31188 - 11905: 0xB670, 31189 - 11905: 0xEFF5, 31190 - 11905: 0xB671, 31191 - 11905: 0xB672, 31192 - 11905: 0xC3D8, 31193 - 11905: 0xB673, 31194 - 11905: 0xB674, 31195 - 11905: 0xB675, 31196 - 11905: 0xB676, 31197 - 11905: 0xB677, 31198 - 11905: 0xB678, 31199 - 11905: 0xD7E2, 31200 - 11905: 0xB679, 31201 - 11905: 0xB67A, 31202 - 11905: 0xB67B, 31203 - 11905: 0xEFF7, 31204 - 11905: 0xB3D3, 31205 - 11905: 0xB67C, 31206 - 11905: 0xC7D8, 31207 - 11905: 0xD1ED, 31208 - 11905: 0xB67D, 31209 - 11905: 0xD6C8, 31210 - 11905: 0xB67E, 31211 - 11905: 0xEFF8, 31212 - 11905: 0xB680, 31213 - 11905: 0xEFF6, 31214 - 11905: 0xB681, 31215 - 11905: 0xBBFD, 31216 - 11905: 0xB3C6, 31217 - 11905: 0xB682, 31218 - 11905: 0xB683, 31219 - 11905: 0xB684, 31220 - 11905: 0xB685, 31221 - 11905: 0xB686, 31222 - 11905: 0xB687, 31223 - 11905: 0xB688, 31224 - 11905: 0xBDD5, 31225 - 11905: 0xB689, 31226 - 11905: 0xB68A, 31227 - 11905: 0xD2C6, 31228 - 11905: 0xB68B, 31229 - 11905: 0xBBE0, 31230 - 11905: 0xB68C, 31231 - 11905: 0xB68D, 31232 - 11905: 0xCFA1, 31233 - 11905: 0xB68E, 31234 - 11905: 0xEFFC, 31235 - 11905: 0xEFFB, 31236 - 11905: 0xB68F, 31237 - 11905: 0xB690, 31238 - 11905: 0xEFF9, 31239 - 11905: 0xB691, 31240 - 11905: 0xB692, 31241 - 11905: 0xB693, 31242 - 11905: 0xB694, 31243 - 11905: 0xB3CC, 31244 - 11905: 0xB695, 31245 - 11905: 0xC9D4, 31246 - 11905: 0xCBB0, 31247 - 11905: 0xB696, 31248 - 11905: 0xB697, 31249 - 11905: 0xB698, 31250 - 11905: 0xB699, 31251 - 11905: 0xB69A, 31252 - 11905: 0xEFFE, 31253 - 11905: 0xB69B, 31254 - 11905: 0xB69C, 31255 - 11905: 0xB0DE, 31256 - 11905: 0xB69D, 31257 - 11905: 0xB69E, 31258 - 11905: 0xD6C9, 31259 - 11905: 0xB69F, 31260 - 11905: 0xB6A0, 31261 - 11905: 0xB740, 31262 - 11905: 0xEFFD, 31263 - 11905: 0xB741, 31264 - 11905: 0xB3ED, 31265 - 11905: 0xB742, 31266 - 11905: 0xB743, 31267 - 11905: 0xF6D5, 31268 - 11905: 0xB744, 31269 - 11905: 0xB745, 31270 - 11905: 0xB746, 31271 - 11905: 0xB747, 31272 - 11905: 0xB748, 31273 - 11905: 0xB749, 31274 - 11905: 0xB74A, 31275 - 11905: 0xB74B, 31276 - 11905: 0xB74C, 31277 - 11905: 0xB74D, 31278 - 11905: 0xB74E, 31279 - 11905: 0xB74F, 31280 - 11905: 0xB750, 31281 - 11905: 0xB751, 31282 - 11905: 0xB752, 31283 - 11905: 0xCEC8, 31284 - 11905: 0xB753, 31285 - 11905: 0xB754, 31286 - 11905: 0xB755, 31287 - 11905: 0xF0A2, 31288 - 11905: 0xB756, 31289 - 11905: 0xF0A1, 31290 - 11905: 0xB757, 31291 - 11905: 0xB5BE, 31292 - 11905: 0xBCDA, 31293 - 11905: 0xBBFC, 31294 - 11905: 0xB758, 31295 - 11905: 0xB8E5, 31296 - 11905: 0xB759, 31297 - 11905: 0xB75A, 31298 - 11905: 0xB75B, 31299 - 11905: 0xB75C, 31300 - 11905: 0xB75D, 31301 - 11905: 0xB75E, 31302 - 11905: 0xC4C2, 31303 - 11905: 0xB75F, 31304 - 11905: 0xB760, 31305 - 11905: 0xB761, 31306 - 11905: 0xB762, 31307 - 11905: 0xB763, 31308 - 11905: 0xB764, 31309 - 11905: 0xB765, 31310 - 11905: 0xB766, 31311 - 11905: 0xB767, 31312 - 11905: 0xB768, 31313 - 11905: 0xF0A3, 31314 - 11905: 0xB769, 31315 - 11905: 0xB76A, 31316 - 11905: 0xB76B, 31317 - 11905: 0xB76C, 31318 - 11905: 0xB76D, 31319 - 11905: 0xCBEB, 31320 - 11905: 0xB76E, 31321 - 11905: 0xB76F, 31322 - 11905: 0xB770, 31323 - 11905: 0xB771, 31324 - 11905: 0xB772, 31325 - 11905: 0xB773, 31326 - 11905: 0xB774, 31327 - 11905: 0xB775, 31328 - 11905: 0xB776, 31329 - 11905: 0xB777, 31330 - 11905: 0xB778, 31331 - 11905: 0xB779, 31332 - 11905: 0xB77A, 31333 - 11905: 0xB77B, 31334 - 11905: 0xB77C, 31335 - 11905: 0xB77D, 31336 - 11905: 0xB77E, 31337 - 11905: 0xB780, 31338 - 11905: 0xB781, 31339 - 11905: 0xB782, 31340 - 11905: 0xB783, 31341 - 11905: 0xB784, 31342 - 11905: 0xB785, 31343 - 11905: 0xB786, 31344 - 11905: 0xF0A6, 31345 - 11905: 0xB787, 31346 - 11905: 0xB788, 31347 - 11905: 0xB789, 31348 - 11905: 0xD1A8, 31349 - 11905: 0xB78A, 31350 - 11905: 0xBEBF, 31351 - 11905: 0xC7EE, 31352 - 11905: 0xF1B6, 31353 - 11905: 0xF1B7, 31354 - 11905: 0xBFD5, 31355 - 11905: 0xB78B, 31356 - 11905: 0xB78C, 31357 - 11905: 0xB78D, 31358 - 11905: 0xB78E, 31359 - 11905: 0xB4A9, 31360 - 11905: 0xF1B8, 31361 - 11905: 0xCDBB, 31362 - 11905: 0xB78F, 31363 - 11905: 0xC7D4, 31364 - 11905: 0xD5AD, 31365 - 11905: 0xB790, 31366 - 11905: 0xF1B9, 31367 - 11905: 0xB791, 31368 - 11905: 0xF1BA, 31369 - 11905: 0xB792, 31370 - 11905: 0xB793, 31371 - 11905: 0xB794, 31372 - 11905: 0xB795, 31373 - 11905: 0xC7CF, 31374 - 11905: 0xB796, 31375 - 11905: 0xB797, 31376 - 11905: 0xB798, 31377 - 11905: 0xD2A4, 31378 - 11905: 0xD6CF, 31379 - 11905: 0xB799, 31380 - 11905: 0xB79A, 31381 - 11905: 0xF1BB, 31382 - 11905: 0xBDD1, 31383 - 11905: 0xB4B0, 31384 - 11905: 0xBEBD, 31385 - 11905: 0xB79B, 31386 - 11905: 0xB79C, 31387 - 11905: 0xB79D, 31388 - 11905: 0xB4DC, 31389 - 11905: 0xCED1, 31390 - 11905: 0xB79E, 31391 - 11905: 0xBFDF, 31392 - 11905: 0xF1BD, 31393 - 11905: 0xB79F, 31394 - 11905: 0xB7A0, 31395 - 11905: 0xB840, 31396 - 11905: 0xB841, 31397 - 11905: 0xBFFA, 31398 - 11905: 0xF1BC, 31399 - 11905: 0xB842, 31400 - 11905: 0xF1BF, 31401 - 11905: 0xB843, 31402 - 11905: 0xB844, 31403 - 11905: 0xB845, 31404 - 11905: 0xF1BE, 31405 - 11905: 0xF1C0, 31406 - 11905: 0xB846, 31407 - 11905: 0xB847, 31408 - 11905: 0xB848, 31409 - 11905: 0xB849, 31410 - 11905: 0xB84A, 31411 - 11905: 0xF1C1, 31412 - 11905: 0xB84B, 31413 - 11905: 0xB84C, 31414 - 11905: 0xB84D, 31415 - 11905: 0xB84E, 31416 - 11905: 0xB84F, 31417 - 11905: 0xB850, 31418 - 11905: 0xB851, 31419 - 11905: 0xB852, 31420 - 11905: 0xB853, 31421 - 11905: 0xB854, 31422 - 11905: 0xB855, 31423 - 11905: 0xC1FE, 31424 - 11905: 0xB856, 31425 - 11905: 0xB857, 31426 - 11905: 0xB858, 31427 - 11905: 0xB859, 31428 - 11905: 0xB85A, 31429 - 11905: 0xB85B, 31430 - 11905: 0xB85C, 31431 - 11905: 0xB85D, 31432 - 11905: 0xB85E, 31433 - 11905: 0xB85F, 31434 - 11905: 0xB860, 31435 - 11905: 0xC1A2, 31436 - 11905: 0xB861, 31437 - 11905: 0xB862, 31438 - 11905: 0xB863, 31439 - 11905: 0xB864, 31440 - 11905: 0xB865, 31441 - 11905: 0xB866, 31442 - 11905: 0xB867, 31443 - 11905: 0xB868, 31444 - 11905: 0xB869, 31445 - 11905: 0xB86A, 31446 - 11905: 0xCAFA, 31447 - 11905: 0xB86B, 31448 - 11905: 0xB86C, 31449 - 11905: 0xD5BE, 31450 - 11905: 0xB86D, 31451 - 11905: 0xB86E, 31452 - 11905: 0xB86F, 31453 - 11905: 0xB870, 31454 - 11905: 0xBEBA, 31455 - 11905: 0xBEB9, 31456 - 11905: 0xD5C2, 31457 - 11905: 0xB871, 31458 - 11905: 0xB872, 31459 - 11905: 0xBFA2, 31460 - 11905: 0xB873, 31461 - 11905: 0xCDAF, 31462 - 11905: 0xF1B5, 31463 - 11905: 0xB874, 31464 - 11905: 0xB875, 31465 - 11905: 0xB876, 31466 - 11905: 0xB877, 31467 - 11905: 0xB878, 31468 - 11905: 0xB879, 31469 - 11905: 0xBDDF, 31470 - 11905: 0xB87A, 31471 - 11905: 0xB6CB, 31472 - 11905: 0xB87B, 31473 - 11905: 0xB87C, 31474 - 11905: 0xB87D, 31475 - 11905: 0xB87E, 31476 - 11905: 0xB880, 31477 - 11905: 0xB881, 31478 - 11905: 0xB882, 31479 - 11905: 0xB883, 31480 - 11905: 0xB884, 31481 - 11905: 0xD6F1, 31482 - 11905: 0xF3C3, 31483 - 11905: 0xB885, 31484 - 11905: 0xB886, 31485 - 11905: 0xF3C4, 31486 - 11905: 0xB887, 31487 - 11905: 0xB8CD, 31488 - 11905: 0xB888, 31489 - 11905: 0xB889, 31490 - 11905: 0xB88A, 31491 - 11905: 0xF3C6, 31492 - 11905: 0xF3C7, 31493 - 11905: 0xB88B, 31494 - 11905: 0xB0CA, 31495 - 11905: 0xB88C, 31496 - 11905: 0xF3C5, 31497 - 11905: 0xB88D, 31498 - 11905: 0xF3C9, 31499 - 11905: 0xCBF1, 31500 - 11905: 0xB88E, 31501 - 11905: 0xB88F, 31502 - 11905: 0xB890, 31503 - 11905: 0xF3CB, 31504 - 11905: 0xB891, 31505 - 11905: 0xD0A6, 31506 - 11905: 0xB892, 31507 - 11905: 0xB893, 31508 - 11905: 0xB1CA, 31509 - 11905: 0xF3C8, 31510 - 11905: 0xB894, 31511 - 11905: 0xB895, 31512 - 11905: 0xB896, 31513 - 11905: 0xF3CF, 31514 - 11905: 0xB897, 31515 - 11905: 0xB5D1, 31516 - 11905: 0xB898, 31517 - 11905: 0xB899, 31518 - 11905: 0xF3D7, 31519 - 11905: 0xB89A, 31520 - 11905: 0xF3D2, 31521 - 11905: 0xB89B, 31522 - 11905: 0xB89C, 31523 - 11905: 0xB89D, 31524 - 11905: 0xF3D4, 31525 - 11905: 0xF3D3, 31526 - 11905: 0xB7FB, 31527 - 11905: 0xB89E, 31528 - 11905: 0xB1BF, 31529 - 11905: 0xB89F, 31530 - 11905: 0xF3CE, 31531 - 11905: 0xF3CA, 31532 - 11905: 0xB5DA, 31533 - 11905: 0xB8A0, 31534 - 11905: 0xF3D0, 31535 - 11905: 0xB940, 31536 - 11905: 0xB941, 31537 - 11905: 0xF3D1, 31538 - 11905: 0xB942, 31539 - 11905: 0xF3D5, 31540 - 11905: 0xB943, 31541 - 11905: 0xB944, 31542 - 11905: 0xB945, 31543 - 11905: 0xB946, 31544 - 11905: 0xF3CD, 31545 - 11905: 0xB947, 31546 - 11905: 0xBCE3, 31547 - 11905: 0xB948, 31548 - 11905: 0xC1FD, 31549 - 11905: 0xB949, 31550 - 11905: 0xF3D6, 31551 - 11905: 0xB94A, 31552 - 11905: 0xB94B, 31553 - 11905: 0xB94C, 31554 - 11905: 0xB94D, 31555 - 11905: 0xB94E, 31556 - 11905: 0xB94F, 31557 - 11905: 0xF3DA, 31558 - 11905: 0xB950, 31559 - 11905: 0xF3CC, 31560 - 11905: 0xB951, 31561 - 11905: 0xB5C8, 31562 - 11905: 0xB952, 31563 - 11905: 0xBDEE, 31564 - 11905: 0xF3DC, 31565 - 11905: 0xB953, 31566 - 11905: 0xB954, 31567 - 11905: 0xB7A4, 31568 - 11905: 0xBFF0, 31569 - 11905: 0xD6FE, 31570 - 11905: 0xCDB2, 31571 - 11905: 0xB955, 31572 - 11905: 0xB4F0, 31573 - 11905: 0xB956, 31574 - 11905: 0xB2DF, 31575 - 11905: 0xB957, 31576 - 11905: 0xF3D8, 31577 - 11905: 0xB958, 31578 - 11905: 0xF3D9, 31579 - 11905: 0xC9B8, 31580 - 11905: 0xB959, 31581 - 11905: 0xF3DD, 31582 - 11905: 0xB95A, 31583 - 11905: 0xB95B, 31584 - 11905: 0xF3DE, 31585 - 11905: 0xB95C, 31586 - 11905: 0xF3E1, 31587 - 11905: 0xB95D, 31588 - 11905: 0xB95E, 31589 - 11905: 0xB95F, 31590 - 11905: 0xB960, 31591 - 11905: 0xB961, 31592 - 11905: 0xB962, 31593 - 11905: 0xB963, 31594 - 11905: 0xB964, 31595 - 11905: 0xB965, 31596 - 11905: 0xB966, 31597 - 11905: 0xB967, 31598 - 11905: 0xF3DF, 31599 - 11905: 0xB968, 31600 - 11905: 0xB969, 31601 - 11905: 0xF3E3, 31602 - 11905: 0xF3E2, 31603 - 11905: 0xB96A, 31604 - 11905: 0xB96B, 31605 - 11905: 0xF3DB, 31606 - 11905: 0xB96C, 31607 - 11905: 0xBFEA, 31608 - 11905: 0xB96D, 31609 - 11905: 0xB3EF, 31610 - 11905: 0xB96E, 31611 - 11905: 0xF3E0, 31612 - 11905: 0xB96F, 31613 - 11905: 0xB970, 31614 - 11905: 0xC7A9, 31615 - 11905: 0xB971, 31616 - 11905: 0xBCF2, 31617 - 11905: 0xB972, 31618 - 11905: 0xB973, 31619 - 11905: 0xB974, 31620 - 11905: 0xB975, 31621 - 11905: 0xF3EB, 31622 - 11905: 0xB976, 31623 - 11905: 0xB977, 31624 - 11905: 0xB978, 31625 - 11905: 0xB979, 31626 - 11905: 0xB97A, 31627 - 11905: 0xB97B, 31628 - 11905: 0xB97C, 31629 - 11905: 0xB9BF, 31630 - 11905: 0xB97D, 31631 - 11905: 0xB97E, 31632 - 11905: 0xF3E4, 31633 - 11905: 0xB980, 31634 - 11905: 0xB981, 31635 - 11905: 0xB982, 31636 - 11905: 0xB2AD, 31637 - 11905: 0xBBFE, 31638 - 11905: 0xB983, 31639 - 11905: 0xCBE3, 31640 - 11905: 0xB984, 31641 - 11905: 0xB985, 31642 - 11905: 0xB986, 31643 - 11905: 0xB987, 31644 - 11905: 0xF3ED, 31645 - 11905: 0xF3E9, 31646 - 11905: 0xB988, 31647 - 11905: 0xB989, 31648 - 11905: 0xB98A, 31649 - 11905: 0xB9DC, 31650 - 11905: 0xF3EE, 31651 - 11905: 0xB98B, 31652 - 11905: 0xB98C, 31653 - 11905: 0xB98D, 31654 - 11905: 0xF3E5, 31655 - 11905: 0xF3E6, 31656 - 11905: 0xF3EA, 31657 - 11905: 0xC2E1, 31658 - 11905: 0xF3EC, 31659 - 11905: 0xF3EF, 31660 - 11905: 0xF3E8, 31661 - 11905: 0xBCFD, 31662 - 11905: 0xB98E, 31663 - 11905: 0xB98F, 31664 - 11905: 0xB990, 31665 - 11905: 0xCFE4, 31666 - 11905: 0xB991, 31667 - 11905: 0xB992, 31668 - 11905: 0xF3F0, 31669 - 11905: 0xB993, 31670 - 11905: 0xB994, 31671 - 11905: 0xB995, 31672 - 11905: 0xF3E7, 31673 - 11905: 0xB996, 31674 - 11905: 0xB997, 31675 - 11905: 0xB998, 31676 - 11905: 0xB999, 31677 - 11905: 0xB99A, 31678 - 11905: 0xB99B, 31679 - 11905: 0xB99C, 31680 - 11905: 0xB99D, 31681 - 11905: 0xF3F2, 31682 - 11905: 0xB99E, 31683 - 11905: 0xB99F, 31684 - 11905: 0xB9A0, 31685 - 11905: 0xBA40, 31686 - 11905: 0xD7AD, 31687 - 11905: 0xC6AA, 31688 - 11905: 0xBA41, 31689 - 11905: 0xBA42, 31690 - 11905: 0xBA43, 31691 - 11905: 0xBA44, 31692 - 11905: 0xF3F3, 31693 - 11905: 0xBA45, 31694 - 11905: 0xBA46, 31695 - 11905: 0xBA47, 31696 - 11905: 0xBA48, 31697 - 11905: 0xF3F1, 31698 - 11905: 0xBA49, 31699 - 11905: 0xC2A8, 31700 - 11905: 0xBA4A, 31701 - 11905: 0xBA4B, 31702 - 11905: 0xBA4C, 31703 - 11905: 0xBA4D, 31704 - 11905: 0xBA4E, 31705 - 11905: 0xB8DD, 31706 - 11905: 0xF3F5, 31707 - 11905: 0xBA4F, 31708 - 11905: 0xBA50, 31709 - 11905: 0xF3F4, 31710 - 11905: 0xBA51, 31711 - 11905: 0xBA52, 31712 - 11905: 0xBA53, 31713 - 11905: 0xB4DB, 31714 - 11905: 0xBA54, 31715 - 11905: 0xBA55, 31716 - 11905: 0xBA56, 31717 - 11905: 0xF3F6, 31718 - 11905: 0xF3F7, 31719 - 11905: 0xBA57, 31720 - 11905: 0xBA58, 31721 - 11905: 0xBA59, 31722 - 11905: 0xF3F8, 31723 - 11905: 0xBA5A, 31724 - 11905: 0xBA5B, 31725 - 11905: 0xBA5C, 31726 - 11905: 0xC0BA, 31727 - 11905: 0xBA5D, 31728 - 11905: 0xBA5E, 31729 - 11905: 0xC0E9, 31730 - 11905: 0xBA5F, 31731 - 11905: 0xBA60, 31732 - 11905: 0xBA61, 31733 - 11905: 0xBA62, 31734 - 11905: 0xBA63, 31735 - 11905: 0xC5F1, 31736 - 11905: 0xBA64, 31737 - 11905: 0xBA65, 31738 - 11905: 0xBA66, 31739 - 11905: 0xBA67, 31740 - 11905: 0xF3FB, 31741 - 11905: 0xBA68, 31742 - 11905: 0xF3FA, 31743 - 11905: 0xBA69, 31744 - 11905: 0xBA6A, 31745 - 11905: 0xBA6B, 31746 - 11905: 0xBA6C, 31747 - 11905: 0xBA6D, 31748 - 11905: 0xBA6E, 31749 - 11905: 0xBA6F, 31750 - 11905: 0xBA70, 31751 - 11905: 0xB4D8, 31752 - 11905: 0xBA71, 31753 - 11905: 0xBA72, 31754 - 11905: 0xBA73, 31755 - 11905: 0xF3FE, 31756 - 11905: 0xF3F9, 31757 - 11905: 0xBA74, 31758 - 11905: 0xBA75, 31759 - 11905: 0xF3FC, 31760 - 11905: 0xBA76, 31761 - 11905: 0xBA77, 31762 - 11905: 0xBA78, 31763 - 11905: 0xBA79, 31764 - 11905: 0xBA7A, 31765 - 11905: 0xBA7B, 31766 - 11905: 0xF3FD, 31767 - 11905: 0xBA7C, 31768 - 11905: 0xBA7D, 31769 - 11905: 0xBA7E, 31770 - 11905: 0xBA80, 31771 - 11905: 0xBA81, 31772 - 11905: 0xBA82, 31773 - 11905: 0xBA83, 31774 - 11905: 0xBA84, 31775 - 11905: 0xF4A1, 31776 - 11905: 0xBA85, 31777 - 11905: 0xBA86, 31778 - 11905: 0xBA87, 31779 - 11905: 0xBA88, 31780 - 11905: 0xBA89, 31781 - 11905: 0xBA8A, 31782 - 11905: 0xF4A3, 31783 - 11905: 0xBBC9, 31784 - 11905: 0xBA8B, 31785 - 11905: 0xBA8C, 31786 - 11905: 0xF4A2, 31787 - 11905: 0xBA8D, 31788 - 11905: 0xBA8E, 31789 - 11905: 0xBA8F, 31790 - 11905: 0xBA90, 31791 - 11905: 0xBA91, 31792 - 11905: 0xBA92, 31793 - 11905: 0xBA93, 31794 - 11905: 0xBA94, 31795 - 11905: 0xBA95, 31796 - 11905: 0xBA96, 31797 - 11905: 0xBA97, 31798 - 11905: 0xBA98, 31799 - 11905: 0xBA99, 31800 - 11905: 0xF4A4, 31801 - 11905: 0xBA9A, 31802 - 11905: 0xBA9B, 31803 - 11905: 0xBA9C, 31804 - 11905: 0xBA9D, 31805 - 11905: 0xBA9E, 31806 - 11905: 0xBA9F, 31807 - 11905: 0xB2BE, 31808 - 11905: 0xF4A6, 31809 - 11905: 0xF4A5, 31810 - 11905: 0xBAA0, 31811 - 11905: 0xBB40, 31812 - 11905: 0xBB41, 31813 - 11905: 0xBB42, 31814 - 11905: 0xBB43, 31815 - 11905: 0xBB44, 31816 - 11905: 0xBB45, 31817 - 11905: 0xBB46, 31818 - 11905: 0xBB47, 31819 - 11905: 0xBB48, 31820 - 11905: 0xBB49, 31821 - 11905: 0xBCAE, 31822 - 11905: 0xBB4A, 31823 - 11905: 0xBB4B, 31824 - 11905: 0xBB4C, 31825 - 11905: 0xBB4D, 31826 - 11905: 0xBB4E, 31827 - 11905: 0xBB4F, 31828 - 11905: 0xBB50, 31829 - 11905: 0xBB51, 31830 - 11905: 0xBB52, 31831 - 11905: 0xBB53, 31832 - 11905: 0xBB54, 31833 - 11905: 0xBB55, 31834 - 11905: 0xBB56, 31835 - 11905: 0xBB57, 31836 - 11905: 0xBB58, 31837 - 11905: 0xBB59, 31838 - 11905: 0xBB5A, 31839 - 11905: 0xBB5B, 31840 - 11905: 0xBB5C, 31841 - 11905: 0xBB5D, 31842 - 11905: 0xBB5E, 31843 - 11905: 0xBB5F, 31844 - 11905: 0xBB60, 31845 - 11905: 0xBB61, 31846 - 11905: 0xBB62, 31847 - 11905: 0xBB63, 31848 - 11905: 0xBB64, 31849 - 11905: 0xBB65, 31850 - 11905: 0xBB66, 31851 - 11905: 0xBB67, 31852 - 11905: 0xBB68, 31853 - 11905: 0xBB69, 31854 - 11905: 0xBB6A, 31855 - 11905: 0xBB6B, 31856 - 11905: 0xBB6C, 31857 - 11905: 0xBB6D, 31858 - 11905: 0xBB6E, 31859 - 11905: 0xC3D7, 31860 - 11905: 0xD9E1, 31861 - 11905: 0xBB6F, 31862 - 11905: 0xBB70, 31863 - 11905: 0xBB71, 31864 - 11905: 0xBB72, 31865 - 11905: 0xBB73, 31866 - 11905: 0xBB74, 31867 - 11905: 0xC0E0, 31868 - 11905: 0xF4CC, 31869 - 11905: 0xD7D1, 31870 - 11905: 0xBB75, 31871 - 11905: 0xBB76, 31872 - 11905: 0xBB77, 31873 - 11905: 0xBB78, 31874 - 11905: 0xBB79, 31875 - 11905: 0xBB7A, 31876 - 11905: 0xBB7B, 31877 - 11905: 0xBB7C, 31878 - 11905: 0xBB7D, 31879 - 11905: 0xBB7E, 31880 - 11905: 0xBB80, 31881 - 11905: 0xB7DB, 31882 - 11905: 0xBB81, 31883 - 11905: 0xBB82, 31884 - 11905: 0xBB83, 31885 - 11905: 0xBB84, 31886 - 11905: 0xBB85, 31887 - 11905: 0xBB86, 31888 - 11905: 0xBB87, 31889 - 11905: 0xF4CE, 31890 - 11905: 0xC1A3, 31891 - 11905: 0xBB88, 31892 - 11905: 0xBB89, 31893 - 11905: 0xC6C9, 31894 - 11905: 0xBB8A, 31895 - 11905: 0xB4D6, 31896 - 11905: 0xD5B3, 31897 - 11905: 0xBB8B, 31898 - 11905: 0xBB8C, 31899 - 11905: 0xBB8D, 31900 - 11905: 0xF4D0, 31901 - 11905: 0xF4CF, 31902 - 11905: 0xF4D1, 31903 - 11905: 0xCBDA, 31904 - 11905: 0xBB8E, 31905 - 11905: 0xBB8F, 31906 - 11905: 0xF4D2, 31907 - 11905: 0xBB90, 31908 - 11905: 0xD4C1, 31909 - 11905: 0xD6E0, 31910 - 11905: 0xBB91, 31911 - 11905: 0xBB92, 31912 - 11905: 0xBB93, 31913 - 11905: 0xBB94, 31914 - 11905: 0xB7E0, 31915 - 11905: 0xBB95, 31916 - 11905: 0xBB96, 31917 - 11905: 0xBB97, 31918 - 11905: 0xC1B8, 31919 - 11905: 0xBB98, 31920 - 11905: 0xBB99, 31921 - 11905: 0xC1BB, 31922 - 11905: 0xF4D3, 31923 - 11905: 0xBEAC, 31924 - 11905: 0xBB9A, 31925 - 11905: 0xBB9B, 31926 - 11905: 0xBB9C, 31927 - 11905: 0xBB9D, 31928 - 11905: 0xBB9E, 31929 - 11905: 0xB4E2, 31930 - 11905: 0xBB9F, 31931 - 11905: 0xBBA0, 31932 - 11905: 0xF4D4, 31933 - 11905: 0xF4D5, 31934 - 11905: 0xBEAB, 31935 - 11905: 0xBC40, 31936 - 11905: 0xBC41, 31937 - 11905: 0xF4D6, 31938 - 11905: 0xBC42, 31939 - 11905: 0xBC43, 31940 - 11905: 0xBC44, 31941 - 11905: 0xF4DB, 31942 - 11905: 0xBC45, 31943 - 11905: 0xF4D7, 31944 - 11905: 0xF4DA, 31945 - 11905: 0xBC46, 31946 - 11905: 0xBAFD, 31947 - 11905: 0xBC47, 31948 - 11905: 0xF4D8, 31949 - 11905: 0xF4D9, 31950 - 11905: 0xBC48, 31951 - 11905: 0xBC49, 31952 - 11905: 0xBC4A, 31953 - 11905: 0xBC4B, 31954 - 11905: 0xBC4C, 31955 - 11905: 0xBC4D, 31956 - 11905: 0xBC4E, 31957 - 11905: 0xB8E2, 31958 - 11905: 0xCCC7, 31959 - 11905: 0xF4DC, 31960 - 11905: 0xBC4F, 31961 - 11905: 0xB2DA, 31962 - 11905: 0xBC50, 31963 - 11905: 0xBC51, 31964 - 11905: 0xC3D3, 31965 - 11905: 0xBC52, 31966 - 11905: 0xBC53, 31967 - 11905: 0xD4E3, 31968 - 11905: 0xBFB7, 31969 - 11905: 0xBC54, 31970 - 11905: 0xBC55, 31971 - 11905: 0xBC56, 31972 - 11905: 0xBC57, 31973 - 11905: 0xBC58, 31974 - 11905: 0xBC59, 31975 - 11905: 0xBC5A, 31976 - 11905: 0xF4DD, 31977 - 11905: 0xBC5B, 31978 - 11905: 0xBC5C, 31979 - 11905: 0xBC5D, 31980 - 11905: 0xBC5E, 31981 - 11905: 0xBC5F, 31982 - 11905: 0xBC60, 31983 - 11905: 0xC5B4, 31984 - 11905: 0xBC61, 31985 - 11905: 0xBC62, 31986 - 11905: 0xBC63, 31987 - 11905: 0xBC64, 31988 - 11905: 0xBC65, 31989 - 11905: 0xBC66, 31990 - 11905: 0xBC67, 31991 - 11905: 0xBC68, 31992 - 11905: 0xF4E9, 31993 - 11905: 0xBC69, 31994 - 11905: 0xBC6A, 31995 - 11905: 0xCFB5, 31996 - 11905: 0xBC6B, 31997 - 11905: 0xBC6C, 31998 - 11905: 0xBC6D, 31999 - 11905: 0xBC6E, 32000 - 11905: 0xBC6F, 32001 - 11905: 0xBC70, 32002 - 11905: 0xBC71, 32003 - 11905: 0xBC72, 32004 - 11905: 0xBC73, 32005 - 11905: 0xBC74, 32006 - 11905: 0xBC75, 32007 - 11905: 0xBC76, 32008 - 11905: 0xBC77, 32009 - 11905: 0xBC78, 32010 - 11905: 0xCEC9, 32011 - 11905: 0xBC79, 32012 - 11905: 0xBC7A, 32013 - 11905: 0xBC7B, 32014 - 11905: 0xBC7C, 32015 - 11905: 0xBC7D, 32016 - 11905: 0xBC7E, 32017 - 11905: 0xBC80, 32018 - 11905: 0xBC81, 32019 - 11905: 0xBC82, 32020 - 11905: 0xBC83, 32021 - 11905: 0xBC84, 32022 - 11905: 0xBC85, 32023 - 11905: 0xBC86, 32024 - 11905: 0xBC87, 32025 - 11905: 0xBC88, 32026 - 11905: 0xBC89, 32027 - 11905: 0xBC8A, 32028 - 11905: 0xBC8B, 32029 - 11905: 0xBC8C, 32030 - 11905: 0xBC8D, 32031 - 11905: 0xBC8E, 32032 - 11905: 0xCBD8, 32033 - 11905: 0xBC8F, 32034 - 11905: 0xCBF7, 32035 - 11905: 0xBC90, 32036 - 11905: 0xBC91, 32037 - 11905: 0xBC92, 32038 - 11905: 0xBC93, 32039 - 11905: 0xBDF4, 32040 - 11905: 0xBC94, 32041 - 11905: 0xBC95, 32042 - 11905: 0xBC96, 32043 - 11905: 0xD7CF, 32044 - 11905: 0xBC97, 32045 - 11905: 0xBC98, 32046 - 11905: 0xBC99, 32047 - 11905: 0xC0DB, 32048 - 11905: 0xBC9A, 32049 - 11905: 0xBC9B, 32050 - 11905: 0xBC9C, 32051 - 11905: 0xBC9D, 32052 - 11905: 0xBC9E, 32053 - 11905: 0xBC9F, 32054 - 11905: 0xBCA0, 32055 - 11905: 0xBD40, 32056 - 11905: 0xBD41, 32057 - 11905: 0xBD42, 32058 - 11905: 0xBD43, 32059 - 11905: 0xBD44, 32060 - 11905: 0xBD45, 32061 - 11905: 0xBD46, 32062 - 11905: 0xBD47, 32063 - 11905: 0xBD48, 32064 - 11905: 0xBD49, 32065 - 11905: 0xBD4A, 32066 - 11905: 0xBD4B, 32067 - 11905: 0xBD4C, 32068 - 11905: 0xBD4D, 32069 - 11905: 0xBD4E, 32070 - 11905: 0xBD4F, 32071 - 11905: 0xBD50, 32072 - 11905: 0xBD51, 32073 - 11905: 0xBD52, 32074 - 11905: 0xBD53, 32075 - 11905: 0xBD54, 32076 - 11905: 0xBD55, 32077 - 11905: 0xBD56, 32078 - 11905: 0xBD57, 32079 - 11905: 0xBD58, 32080 - 11905: 0xBD59, 32081 - 11905: 0xBD5A, 32082 - 11905: 0xBD5B, 32083 - 11905: 0xBD5C, 32084 - 11905: 0xBD5D, 32085 - 11905: 0xBD5E, 32086 - 11905: 0xBD5F, 32087 - 11905: 0xBD60, 32088 - 11905: 0xBD61, 32089 - 11905: 0xBD62, 32090 - 11905: 0xBD63, 32091 - 11905: 0xBD64, 32092 - 11905: 0xBD65, 32093 - 11905: 0xBD66, 32094 - 11905: 0xBD67, 32095 - 11905: 0xBD68, 32096 - 11905: 0xBD69, 32097 - 11905: 0xBD6A, 32098 - 11905: 0xBD6B, 32099 - 11905: 0xBD6C, 32100 - 11905: 0xBD6D, 32101 - 11905: 0xBD6E, 32102 - 11905: 0xBD6F, 32103 - 11905: 0xBD70, 32104 - 11905: 0xBD71, 32105 - 11905: 0xBD72, 32106 - 11905: 0xBD73, 32107 - 11905: 0xBD74, 32108 - 11905: 0xBD75, 32109 - 11905: 0xBD76, 32110 - 11905: 0xD0F5, 32111 - 11905: 0xBD77, 32112 - 11905: 0xBD78, 32113 - 11905: 0xBD79, 32114 - 11905: 0xBD7A, 32115 - 11905: 0xBD7B, 32116 - 11905: 0xBD7C, 32117 - 11905: 0xBD7D, 32118 - 11905: 0xBD7E, 32119 - 11905: 0xF4EA, 32120 - 11905: 0xBD80, 32121 - 11905: 0xBD81, 32122 - 11905: 0xBD82, 32123 - 11905: 0xBD83, 32124 - 11905: 0xBD84, 32125 - 11905: 0xBD85, 32126 - 11905: 0xBD86, 32127 - 11905: 0xBD87, 32128 - 11905: 0xBD88, 32129 - 11905: 0xBD89, 32130 - 11905: 0xBD8A, 32131 - 11905: 0xBD8B, 32132 - 11905: 0xBD8C, 32133 - 11905: 0xBD8D, 32134 - 11905: 0xBD8E, 32135 - 11905: 0xBD8F, 32136 - 11905: 0xBD90, 32137 - 11905: 0xBD91, 32138 - 11905: 0xBD92, 32139 - 11905: 0xBD93, 32140 - 11905: 0xBD94, 32141 - 11905: 0xBD95, 32142 - 11905: 0xBD96, 32143 - 11905: 0xBD97, 32144 - 11905: 0xBD98, 32145 - 11905: 0xBD99, 32146 - 11905: 0xBD9A, 32147 - 11905: 0xBD9B, 32148 - 11905: 0xBD9C, 32149 - 11905: 0xBD9D, 32150 - 11905: 0xBD9E, 32151 - 11905: 0xBD9F, 32152 - 11905: 0xBDA0, 32153 - 11905: 0xBE40, 32154 - 11905: 0xBE41, 32155 - 11905: 0xBE42, 32156 - 11905: 0xBE43, 32157 - 11905: 0xBE44, 32158 - 11905: 0xBE45, 32159 - 11905: 0xBE46, 32160 - 11905: 0xBE47, 32161 - 11905: 0xBE48, 32162 - 11905: 0xBE49, 32163 - 11905: 0xBE4A, 32164 - 11905: 0xBE4B, 32165 - 11905: 0xBE4C, 32166 - 11905: 0xF4EB, 32167 - 11905: 0xBE4D, 32168 - 11905: 0xBE4E, 32169 - 11905: 0xBE4F, 32170 - 11905: 0xBE50, 32171 - 11905: 0xBE51, 32172 - 11905: 0xBE52, 32173 - 11905: 0xBE53, 32174 - 11905: 0xF4EC, 32175 - 11905: 0xBE54, 32176 - 11905: 0xBE55, 32177 - 11905: 0xBE56, 32178 - 11905: 0xBE57, 32179 - 11905: 0xBE58, 32180 - 11905: 0xBE59, 32181 - 11905: 0xBE5A, 32182 - 11905: 0xBE5B, 32183 - 11905: 0xBE5C, 32184 - 11905: 0xBE5D, 32185 - 11905: 0xBE5E, 32186 - 11905: 0xBE5F, 32187 - 11905: 0xBE60, 32188 - 11905: 0xBE61, 32189 - 11905: 0xBE62, 32190 - 11905: 0xBE63, 32191 - 11905: 0xBE64, 32192 - 11905: 0xBE65, 32193 - 11905: 0xBE66, 32194 - 11905: 0xBE67, 32195 - 11905: 0xBE68, 32196 - 11905: 0xBE69, 32197 - 11905: 0xBE6A, 32198 - 11905: 0xBE6B, 32199 - 11905: 0xBE6C, 32200 - 11905: 0xBE6D, 32201 - 11905: 0xBE6E, 32202 - 11905: 0xBE6F, 32203 - 11905: 0xBE70, 32204 - 11905: 0xBE71, 32205 - 11905: 0xBE72, 32206 - 11905: 0xBE73, 32207 - 11905: 0xBE74, 32208 - 11905: 0xBE75, 32209 - 11905: 0xBE76, 32210 - 11905: 0xBE77, 32211 - 11905: 0xBE78, 32212 - 11905: 0xBE79, 32213 - 11905: 0xBE7A, 32214 - 11905: 0xBE7B, 32215 - 11905: 0xBE7C, 32216 - 11905: 0xBE7D, 32217 - 11905: 0xBE7E, 32218 - 11905: 0xBE80, 32219 - 11905: 0xBE81, 32220 - 11905: 0xBE82, 32221 - 11905: 0xBE83, 32222 - 11905: 0xBE84, 32223 - 11905: 0xBE85, 32224 - 11905: 0xBE86, 32225 - 11905: 0xBE87, 32226 - 11905: 0xBE88, 32227 - 11905: 0xBE89, 32228 - 11905: 0xBE8A, 32229 - 11905: 0xBE8B, 32230 - 11905: 0xBE8C, 32231 - 11905: 0xBE8D, 32232 - 11905: 0xBE8E, 32233 - 11905: 0xBE8F, 32234 - 11905: 0xBE90, 32235 - 11905: 0xBE91, 32236 - 11905: 0xBE92, 32237 - 11905: 0xBE93, 32238 - 11905: 0xBE94, 32239 - 11905: 0xBE95, 32240 - 11905: 0xBE96, 32241 - 11905: 0xBE97, 32242 - 11905: 0xBE98, 32243 - 11905: 0xBE99, 32244 - 11905: 0xBE9A, 32245 - 11905: 0xBE9B, 32246 - 11905: 0xBE9C, 32247 - 11905: 0xBE9D, 32248 - 11905: 0xBE9E, 32249 - 11905: 0xBE9F, 32250 - 11905: 0xBEA0, 32251 - 11905: 0xBF40, 32252 - 11905: 0xBF41, 32253 - 11905: 0xBF42, 32254 - 11905: 0xBF43, 32255 - 11905: 0xBF44, 32256 - 11905: 0xBF45, 32257 - 11905: 0xBF46, 32258 - 11905: 0xBF47, 32259 - 11905: 0xBF48, 32260 - 11905: 0xBF49, 32261 - 11905: 0xBF4A, 32262 - 11905: 0xBF4B, 32263 - 11905: 0xBF4C, 32264 - 11905: 0xBF4D, 32265 - 11905: 0xBF4E, 32266 - 11905: 0xBF4F, 32267 - 11905: 0xBF50, 32268 - 11905: 0xBF51, 32269 - 11905: 0xBF52, 32270 - 11905: 0xBF53, 32271 - 11905: 0xBF54, 32272 - 11905: 0xBF55, 32273 - 11905: 0xBF56, 32274 - 11905: 0xBF57, 32275 - 11905: 0xBF58, 32276 - 11905: 0xBF59, 32277 - 11905: 0xBF5A, 32278 - 11905: 0xBF5B, 32279 - 11905: 0xBF5C, 32280 - 11905: 0xBF5D, 32281 - 11905: 0xBF5E, 32282 - 11905: 0xBF5F, 32283 - 11905: 0xBF60, 32284 - 11905: 0xBF61, 32285 - 11905: 0xBF62, 32286 - 11905: 0xBF63, 32287 - 11905: 0xBF64, 32288 - 11905: 0xBF65, 32289 - 11905: 0xBF66, 32290 - 11905: 0xBF67, 32291 - 11905: 0xBF68, 32292 - 11905: 0xBF69, 32293 - 11905: 0xBF6A, 32294 - 11905: 0xBF6B, 32295 - 11905: 0xBF6C, 32296 - 11905: 0xBF6D, 32297 - 11905: 0xBF6E, 32298 - 11905: 0xBF6F, 32299 - 11905: 0xBF70, 32300 - 11905: 0xBF71, 32301 - 11905: 0xBF72, 32302 - 11905: 0xBF73, 32303 - 11905: 0xBF74, 32304 - 11905: 0xBF75, 32305 - 11905: 0xBF76, 32306 - 11905: 0xBF77, 32307 - 11905: 0xBF78, 32308 - 11905: 0xBF79, 32309 - 11905: 0xBF7A, 32310 - 11905: 0xBF7B, 32311 - 11905: 0xBF7C, 32312 - 11905: 0xBF7D, 32313 - 11905: 0xBF7E, 32314 - 11905: 0xBF80, 32315 - 11905: 0xF7E3, 32316 - 11905: 0xBF81, 32317 - 11905: 0xBF82, 32318 - 11905: 0xBF83, 32319 - 11905: 0xBF84, 32320 - 11905: 0xBF85, 32321 - 11905: 0xB7B1, 32322 - 11905: 0xBF86, 32323 - 11905: 0xBF87, 32324 - 11905: 0xBF88, 32325 - 11905: 0xBF89, 32326 - 11905: 0xBF8A, 32327 - 11905: 0xF4ED, 32328 - 11905: 0xBF8B, 32329 - 11905: 0xBF8C, 32330 - 11905: 0xBF8D, 32331 - 11905: 0xBF8E, 32332 - 11905: 0xBF8F, 32333 - 11905: 0xBF90, 32334 - 11905: 0xBF91, 32335 - 11905: 0xBF92, 32336 - 11905: 0xBF93, 32337 - 11905: 0xBF94, 32338 - 11905: 0xBF95, 32339 - 11905: 0xBF96, 32340 - 11905: 0xBF97, 32341 - 11905: 0xBF98, 32342 - 11905: 0xBF99, 32343 - 11905: 0xBF9A, 32344 - 11905: 0xBF9B, 32345 - 11905: 0xBF9C, 32346 - 11905: 0xBF9D, 32347 - 11905: 0xBF9E, 32348 - 11905: 0xBF9F, 32349 - 11905: 0xBFA0, 32350 - 11905: 0xC040, 32351 - 11905: 0xC041, 32352 - 11905: 0xC042, 32353 - 11905: 0xC043, 32354 - 11905: 0xC044, 32355 - 11905: 0xC045, 32356 - 11905: 0xC046, 32357 - 11905: 0xC047, 32358 - 11905: 0xC048, 32359 - 11905: 0xC049, 32360 - 11905: 0xC04A, 32361 - 11905: 0xC04B, 32362 - 11905: 0xC04C, 32363 - 11905: 0xC04D, 32364 - 11905: 0xC04E, 32365 - 11905: 0xC04F, 32366 - 11905: 0xC050, 32367 - 11905: 0xC051, 32368 - 11905: 0xC052, 32369 - 11905: 0xC053, 32370 - 11905: 0xC054, 32371 - 11905: 0xC055, 32372 - 11905: 0xC056, 32373 - 11905: 0xC057, 32374 - 11905: 0xC058, 32375 - 11905: 0xC059, 32376 - 11905: 0xC05A, 32377 - 11905: 0xC05B, 32378 - 11905: 0xC05C, 32379 - 11905: 0xC05D, 32380 - 11905: 0xC05E, 32381 - 11905: 0xC05F, 32382 - 11905: 0xC060, 32383 - 11905: 0xC061, 32384 - 11905: 0xC062, 32385 - 11905: 0xC063, 32386 - 11905: 0xD7EB, 32387 - 11905: 0xC064, 32388 - 11905: 0xC065, 32389 - 11905: 0xC066, 32390 - 11905: 0xC067, 32391 - 11905: 0xC068, 32392 - 11905: 0xC069, 32393 - 11905: 0xC06A, 32394 - 11905: 0xC06B, 32395 - 11905: 0xC06C, 32396 - 11905: 0xC06D, 32397 - 11905: 0xC06E, 32398 - 11905: 0xC06F, 32399 - 11905: 0xC070, 32400 - 11905: 0xC071, 32401 - 11905: 0xC072, 32402 - 11905: 0xC073, 32403 - 11905: 0xC074, 32404 - 11905: 0xC075, 32405 - 11905: 0xC076, 32406 - 11905: 0xC077, 32407 - 11905: 0xC078, 32408 - 11905: 0xC079, 32409 - 11905: 0xC07A, 32410 - 11905: 0xC07B, 32411 - 11905: 0xF4EE, 32412 - 11905: 0xC07C, 32413 - 11905: 0xC07D, 32414 - 11905: 0xC07E, 32415 - 11905: 0xE6F9, 32416 - 11905: 0xBEC0, 32417 - 11905: 0xE6FA, 32418 - 11905: 0xBAEC, 32419 - 11905: 0xE6FB, 32420 - 11905: 0xCFCB, 32421 - 11905: 0xE6FC, 32422 - 11905: 0xD4BC, 32423 - 11905: 0xBCB6, 32424 - 11905: 0xE6FD, 32425 - 11905: 0xE6FE, 32426 - 11905: 0xBCCD, 32427 - 11905: 0xC8D2, 32428 - 11905: 0xCEB3, 32429 - 11905: 0xE7A1, 32430 - 11905: 0xC080, 32431 - 11905: 0xB4BF, 32432 - 11905: 0xE7A2, 32433 - 11905: 0xC9B4, 32434 - 11905: 0xB8D9, 32435 - 11905: 0xC4C9, 32436 - 11905: 0xC081, 32437 - 11905: 0xD7DD, 32438 - 11905: 0xC2DA, 32439 - 11905: 0xB7D7, 32440 - 11905: 0xD6BD, 32441 - 11905: 0xCEC6, 32442 - 11905: 0xB7C4, 32443 - 11905: 0xC082, 32444 - 11905: 0xC083, 32445 - 11905: 0xC5A6, 32446 - 11905: 0xE7A3, 32447 - 11905: 0xCFDF, 32448 - 11905: 0xE7A4, 32449 - 11905: 0xE7A5, 32450 - 11905: 0xE7A6, 32451 - 11905: 0xC1B7, 32452 - 11905: 0xD7E9, 32453 - 11905: 0xC9F0, 32454 - 11905: 0xCFB8, 32455 - 11905: 0xD6AF, 32456 - 11905: 0xD6D5, 32457 - 11905: 0xE7A7, 32458 - 11905: 0xB0ED, 32459 - 11905: 0xE7A8, 32460 - 11905: 0xE7A9, 32461 - 11905: 0xC9DC, 32462 - 11905: 0xD2EF, 32463 - 11905: 0xBEAD, 32464 - 11905: 0xE7AA, 32465 - 11905: 0xB0F3, 32466 - 11905: 0xC8DE, 32467 - 11905: 0xBDE1, 32468 - 11905: 0xE7AB, 32469 - 11905: 0xC8C6, 32470 - 11905: 0xC084, 32471 - 11905: 0xE7AC, 32472 - 11905: 0xBBE6, 32473 - 11905: 0xB8F8, 32474 - 11905: 0xD1A4, 32475 - 11905: 0xE7AD, 32476 - 11905: 0xC2E7, 32477 - 11905: 0xBEF8, 32478 - 11905: 0xBDCA, 32479 - 11905: 0xCDB3, 32480 - 11905: 0xE7AE, 32481 - 11905: 0xE7AF, 32482 - 11905: 0xBEEE, 32483 - 11905: 0xD0E5, 32484 - 11905: 0xC085, 32485 - 11905: 0xCBE7, 32486 - 11905: 0xCCD0, 32487 - 11905: 0xBCCC, 32488 - 11905: 0xE7B0, 32489 - 11905: 0xBCA8, 32490 - 11905: 0xD0F7, 32491 - 11905: 0xE7B1, 32492 - 11905: 0xC086, 32493 - 11905: 0xD0F8, 32494 - 11905: 0xE7B2, 32495 - 11905: 0xE7B3, 32496 - 11905: 0xB4C2, 32497 - 11905: 0xE7B4, 32498 - 11905: 0xE7B5, 32499 - 11905: 0xC9FE, 32500 - 11905: 0xCEAC, 32501 - 11905: 0xC3E0, 32502 - 11905: 0xE7B7, 32503 - 11905: 0xB1C1, 32504 - 11905: 0xB3F1, 32505 - 11905: 0xC087, 32506 - 11905: 0xE7B8, 32507 - 11905: 0xE7B9, 32508 - 11905: 0xD7DB, 32509 - 11905: 0xD5C0, 32510 - 11905: 0xE7BA, 32511 - 11905: 0xC2CC, 32512 - 11905: 0xD7BA, 32513 - 11905: 0xE7BB, 32514 - 11905: 0xE7BC, 32515 - 11905: 0xE7BD, 32516 - 11905: 0xBCEA, 32517 - 11905: 0xC3E5, 32518 - 11905: 0xC0C2, 32519 - 11905: 0xE7BE, 32520 - 11905: 0xE7BF, 32521 - 11905: 0xBCA9, 32522 - 11905: 0xC088, 32523 - 11905: 0xE7C0, 32524 - 11905: 0xE7C1, 32525 - 11905: 0xE7B6, 32526 - 11905: 0xB6D0, 32527 - 11905: 0xE7C2, 32528 - 11905: 0xC089, 32529 - 11905: 0xE7C3, 32530 - 11905: 0xE7C4, 32531 - 11905: 0xBBBA, 32532 - 11905: 0xB5DE, 32533 - 11905: 0xC2C6, 32534 - 11905: 0xB1E0, 32535 - 11905: 0xE7C5, 32536 - 11905: 0xD4B5, 32537 - 11905: 0xE7C6, 32538 - 11905: 0xB8BF, 32539 - 11905: 0xE7C8, 32540 - 11905: 0xE7C7, 32541 - 11905: 0xB7EC, 32542 - 11905: 0xC08A, 32543 - 11905: 0xE7C9, 32544 - 11905: 0xB2F8, 32545 - 11905: 0xE7CA, 32546 - 11905: 0xE7CB, 32547 - 11905: 0xE7CC, 32548 - 11905: 0xE7CD, 32549 - 11905: 0xE7CE, 32550 - 11905: 0xE7CF, 32551 - 11905: 0xE7D0, 32552 - 11905: 0xD3A7, 32553 - 11905: 0xCBF5, 32554 - 11905: 0xE7D1, 32555 - 11905: 0xE7D2, 32556 - 11905: 0xE7D3, 32557 - 11905: 0xE7D4, 32558 - 11905: 0xC9C9, 32559 - 11905: 0xE7D5, 32560 - 11905: 0xE7D6, 32561 - 11905: 0xE7D7, 32562 - 11905: 0xE7D8, 32563 - 11905: 0xE7D9, 32564 - 11905: 0xBDC9, 32565 - 11905: 0xE7DA, 32566 - 11905: 0xF3BE, 32567 - 11905: 0xC08B, 32568 - 11905: 0xB8D7, 32569 - 11905: 0xC08C, 32570 - 11905: 0xC8B1, 32571 - 11905: 0xC08D, 32572 - 11905: 0xC08E, 32573 - 11905: 0xC08F, 32574 - 11905: 0xC090, 32575 - 11905: 0xC091, 32576 - 11905: 0xC092, 32577 - 11905: 0xC093, 32578 - 11905: 0xF3BF, 32579 - 11905: 0xC094, 32580 - 11905: 0xF3C0, 32581 - 11905: 0xF3C1, 32582 - 11905: 0xC095, 32583 - 11905: 0xC096, 32584 - 11905: 0xC097, 32585 - 11905: 0xC098, 32586 - 11905: 0xC099, 32587 - 11905: 0xC09A, 32588 - 11905: 0xC09B, 32589 - 11905: 0xC09C, 32590 - 11905: 0xC09D, 32591 - 11905: 0xC09E, 32592 - 11905: 0xB9DE, 32593 - 11905: 0xCDF8, 32594 - 11905: 0xC09F, 32595 - 11905: 0xC0A0, 32596 - 11905: 0xD8E8, 32597 - 11905: 0xBAB1, 32598 - 11905: 0xC140, 32599 - 11905: 0xC2DE, 32600 - 11905: 0xEEB7, 32601 - 11905: 0xC141, 32602 - 11905: 0xB7A3, 32603 - 11905: 0xC142, 32604 - 11905: 0xC143, 32605 - 11905: 0xC144, 32606 - 11905: 0xC145, 32607 - 11905: 0xEEB9, 32608 - 11905: 0xC146, 32609 - 11905: 0xEEB8, 32610 - 11905: 0xB0D5, 32611 - 11905: 0xC147, 32612 - 11905: 0xC148, 32613 - 11905: 0xC149, 32614 - 11905: 0xC14A, 32615 - 11905: 0xC14B, 32616 - 11905: 0xEEBB, 32617 - 11905: 0xD5D6, 32618 - 11905: 0xD7EF, 32619 - 11905: 0xC14C, 32620 - 11905: 0xC14D, 32621 - 11905: 0xC14E, 32622 - 11905: 0xD6C3, 32623 - 11905: 0xC14F, 32624 - 11905: 0xC150, 32625 - 11905: 0xEEBD, 32626 - 11905: 0xCAF0, 32627 - 11905: 0xC151, 32628 - 11905: 0xEEBC, 32629 - 11905: 0xC152, 32630 - 11905: 0xC153, 32631 - 11905: 0xC154, 32632 - 11905: 0xC155, 32633 - 11905: 0xEEBE, 32634 - 11905: 0xC156, 32635 - 11905: 0xC157, 32636 - 11905: 0xC158, 32637 - 11905: 0xC159, 32638 - 11905: 0xEEC0, 32639 - 11905: 0xC15A, 32640 - 11905: 0xC15B, 32641 - 11905: 0xEEBF, 32642 - 11905: 0xC15C, 32643 - 11905: 0xC15D, 32644 - 11905: 0xC15E, 32645 - 11905: 0xC15F, 32646 - 11905: 0xC160, 32647 - 11905: 0xC161, 32648 - 11905: 0xC162, 32649 - 11905: 0xC163, 32650 - 11905: 0xD1F2, 32651 - 11905: 0xC164, 32652 - 11905: 0xC7BC, 32653 - 11905: 0xC165, 32654 - 11905: 0xC3C0, 32655 - 11905: 0xC166, 32656 - 11905: 0xC167, 32657 - 11905: 0xC168, 32658 - 11905: 0xC169, 32659 - 11905: 0xC16A, 32660 - 11905: 0xB8E1, 32661 - 11905: 0xC16B, 32662 - 11905: 0xC16C, 32663 - 11905: 0xC16D, 32664 - 11905: 0xC16E, 32665 - 11905: 0xC16F, 32666 - 11905: 0xC1E7, 32667 - 11905: 0xC170, 32668 - 11905: 0xC171, 32669 - 11905: 0xF4C6, 32670 - 11905: 0xD0DF, 32671 - 11905: 0xF4C7, 32672 - 11905: 0xC172, 32673 - 11905: 0xCFDB, 32674 - 11905: 0xC173, 32675 - 11905: 0xC174, 32676 - 11905: 0xC8BA, 32677 - 11905: 0xC175, 32678 - 11905: 0xC176, 32679 - 11905: 0xF4C8, 32680 - 11905: 0xC177, 32681 - 11905: 0xC178, 32682 - 11905: 0xC179, 32683 - 11905: 0xC17A, 32684 - 11905: 0xC17B, 32685 - 11905: 0xC17C, 32686 - 11905: 0xC17D, 32687 - 11905: 0xF4C9, 32688 - 11905: 0xF4CA, 32689 - 11905: 0xC17E, 32690 - 11905: 0xF4CB, 32691 - 11905: 0xC180, 32692 - 11905: 0xC181, 32693 - 11905: 0xC182, 32694 - 11905: 0xC183, 32695 - 11905: 0xC184, 32696 - 11905: 0xD9FA, 32697 - 11905: 0xB8FE, 32698 - 11905: 0xC185, 32699 - 11905: 0xC186, 32700 - 11905: 0xE5F1, 32701 - 11905: 0xD3F0, 32702 - 11905: 0xC187, 32703 - 11905: 0xF4E0, 32704 - 11905: 0xC188, 32705 - 11905: 0xCECC, 32706 - 11905: 0xC189, 32707 - 11905: 0xC18A, 32708 - 11905: 0xC18B, 32709 - 11905: 0xB3E1, 32710 - 11905: 0xC18C, 32711 - 11905: 0xC18D, 32712 - 11905: 0xC18E, 32713 - 11905: 0xC18F, 32714 - 11905: 0xF1B4, 32715 - 11905: 0xC190, 32716 - 11905: 0xD2EE, 32717 - 11905: 0xC191, 32718 - 11905: 0xF4E1, 32719 - 11905: 0xC192, 32720 - 11905: 0xC193, 32721 - 11905: 0xC194, 32722 - 11905: 0xC195, 32723 - 11905: 0xC196, 32724 - 11905: 0xCFE8, 32725 - 11905: 0xF4E2, 32726 - 11905: 0xC197, 32727 - 11905: 0xC198, 32728 - 11905: 0xC7CC, 32729 - 11905: 0xC199, 32730 - 11905: 0xC19A, 32731 - 11905: 0xC19B, 32732 - 11905: 0xC19C, 32733 - 11905: 0xC19D, 32734 - 11905: 0xC19E, 32735 - 11905: 0xB5D4, 32736 - 11905: 0xB4E4, 32737 - 11905: 0xF4E4, 32738 - 11905: 0xC19F, 32739 - 11905: 0xC1A0, 32740 - 11905: 0xC240, 32741 - 11905: 0xF4E3, 32742 - 11905: 0xF4E5, 32743 - 11905: 0xC241, 32744 - 11905: 0xC242, 32745 - 11905: 0xF4E6, 32746 - 11905: 0xC243, 32747 - 11905: 0xC244, 32748 - 11905: 0xC245, 32749 - 11905: 0xC246, 32750 - 11905: 0xF4E7, 32751 - 11905: 0xC247, 32752 - 11905: 0xBAB2, 32753 - 11905: 0xB0BF, 32754 - 11905: 0xC248, 32755 - 11905: 0xF4E8, 32756 - 11905: 0xC249, 32757 - 11905: 0xC24A, 32758 - 11905: 0xC24B, 32759 - 11905: 0xC24C, 32760 - 11905: 0xC24D, 32761 - 11905: 0xC24E, 32762 - 11905: 0xC24F, 32763 - 11905: 0xB7AD, 32764 - 11905: 0xD2ED, 32765 - 11905: 0xC250, 32766 - 11905: 0xC251, 32767 - 11905: 0xC252, 32768 - 11905: 0xD2AB, 32769 - 11905: 0xC0CF, 32770 - 11905: 0xC253, 32771 - 11905: 0xBFBC, 32772 - 11905: 0xEBA3, 32773 - 11905: 0xD5DF, 32774 - 11905: 0xEAC8, 32775 - 11905: 0xC254, 32776 - 11905: 0xC255, 32777 - 11905: 0xC256, 32778 - 11905: 0xC257, 32779 - 11905: 0xF1F3, 32780 - 11905: 0xB6F8, 32781 - 11905: 0xCBA3, 32782 - 11905: 0xC258, 32783 - 11905: 0xC259, 32784 - 11905: 0xC4CD, 32785 - 11905: 0xC25A, 32786 - 11905: 0xF1E7, 32787 - 11905: 0xC25B, 32788 - 11905: 0xF1E8, 32789 - 11905: 0xB8FB, 32790 - 11905: 0xF1E9, 32791 - 11905: 0xBAC4, 32792 - 11905: 0xD4C5, 32793 - 11905: 0xB0D2, 32794 - 11905: 0xC25C, 32795 - 11905: 0xC25D, 32796 - 11905: 0xF1EA, 32797 - 11905: 0xC25E, 32798 - 11905: 0xC25F, 32799 - 11905: 0xC260, 32800 - 11905: 0xF1EB, 32801 - 11905: 0xC261, 32802 - 11905: 0xF1EC, 32803 - 11905: 0xC262, 32804 - 11905: 0xC263, 32805 - 11905: 0xF1ED, 32806 - 11905: 0xF1EE, 32807 - 11905: 0xF1EF, 32808 - 11905: 0xF1F1, 32809 - 11905: 0xF1F0, 32810 - 11905: 0xC5D5, 32811 - 11905: 0xC264, 32812 - 11905: 0xC265, 32813 - 11905: 0xC266, 32814 - 11905: 0xC267, 32815 - 11905: 0xC268, 32816 - 11905: 0xC269, 32817 - 11905: 0xF1F2, 32818 - 11905: 0xC26A, 32819 - 11905: 0xB6FA, 32820 - 11905: 0xC26B, 32821 - 11905: 0xF1F4, 32822 - 11905: 0xD2AE, 32823 - 11905: 0xDEC7, 32824 - 11905: 0xCBCA, 32825 - 11905: 0xC26C, 32826 - 11905: 0xC26D, 32827 - 11905: 0xB3DC, 32828 - 11905: 0xC26E, 32829 - 11905: 0xB5A2, 32830 - 11905: 0xC26F, 32831 - 11905: 0xB9A2, 32832 - 11905: 0xC270, 32833 - 11905: 0xC271, 32834 - 11905: 0xC4F4, 32835 - 11905: 0xF1F5, 32836 - 11905: 0xC272, 32837 - 11905: 0xC273, 32838 - 11905: 0xF1F6, 32839 - 11905: 0xC274, 32840 - 11905: 0xC275, 32841 - 11905: 0xC276, 32842 - 11905: 0xC1C4, 32843 - 11905: 0xC1FB, 32844 - 11905: 0xD6B0, 32845 - 11905: 0xF1F7, 32846 - 11905: 0xC277, 32847 - 11905: 0xC278, 32848 - 11905: 0xC279, 32849 - 11905: 0xC27A, 32850 - 11905: 0xF1F8, 32851 - 11905: 0xC27B, 32852 - 11905: 0xC1AA, 32853 - 11905: 0xC27C, 32854 - 11905: 0xC27D, 32855 - 11905: 0xC27E, 32856 - 11905: 0xC6B8, 32857 - 11905: 0xC280, 32858 - 11905: 0xBEDB, 32859 - 11905: 0xC281, 32860 - 11905: 0xC282, 32861 - 11905: 0xC283, 32862 - 11905: 0xC284, 32863 - 11905: 0xC285, 32864 - 11905: 0xC286, 32865 - 11905: 0xC287, 32866 - 11905: 0xC288, 32867 - 11905: 0xC289, 32868 - 11905: 0xC28A, 32869 - 11905: 0xC28B, 32870 - 11905: 0xC28C, 32871 - 11905: 0xC28D, 32872 - 11905: 0xC28E, 32873 - 11905: 0xF1F9, 32874 - 11905: 0xB4CF, 32875 - 11905: 0xC28F, 32876 - 11905: 0xC290, 32877 - 11905: 0xC291, 32878 - 11905: 0xC292, 32879 - 11905: 0xC293, 32880 - 11905: 0xC294, 32881 - 11905: 0xF1FA, 32882 - 11905: 0xC295, 32883 - 11905: 0xC296, 32884 - 11905: 0xC297, 32885 - 11905: 0xC298, 32886 - 11905: 0xC299, 32887 - 11905: 0xC29A, 32888 - 11905: 0xC29B, 32889 - 11905: 0xC29C, 32890 - 11905: 0xC29D, 32891 - 11905: 0xC29E, 32892 - 11905: 0xC29F, 32893 - 11905: 0xC2A0, 32894 - 11905: 0xC340, 32895 - 11905: 0xEDB2, 32896 - 11905: 0xEDB1, 32897 - 11905: 0xC341, 32898 - 11905: 0xC342, 32899 - 11905: 0xCBE0, 32900 - 11905: 0xD2DE, 32901 - 11905: 0xC343, 32902 - 11905: 0xCBC1, 32903 - 11905: 0xD5D8, 32904 - 11905: 0xC344, 32905 - 11905: 0xC8E2, 32906 - 11905: 0xC345, 32907 - 11905: 0xC0DF, 32908 - 11905: 0xBCA1, 32909 - 11905: 0xC346, 32910 - 11905: 0xC347, 32911 - 11905: 0xC348, 32912 - 11905: 0xC349, 32913 - 11905: 0xC34A, 32914 - 11905: 0xC34B, 32915 - 11905: 0xEBC1, 32916 - 11905: 0xC34C, 32917 - 11905: 0xC34D, 32918 - 11905: 0xD0A4, 32919 - 11905: 0xC34E, 32920 - 11905: 0xD6E2, 32921 - 11905: 0xC34F, 32922 - 11905: 0xB6C7, 32923 - 11905: 0xB8D8, 32924 - 11905: 0xEBC0, 32925 - 11905: 0xB8CE, 32926 - 11905: 0xC350, 32927 - 11905: 0xEBBF, 32928 - 11905: 0xB3A6, 32929 - 11905: 0xB9C9, 32930 - 11905: 0xD6AB, 32931 - 11905: 0xC351, 32932 - 11905: 0xB7F4, 32933 - 11905: 0xB7CA, 32934 - 11905: 0xC352, 32935 - 11905: 0xC353, 32936 - 11905: 0xC354, 32937 - 11905: 0xBCE7, 32938 - 11905: 0xB7BE, 32939 - 11905: 0xEBC6, 32940 - 11905: 0xC355, 32941 - 11905: 0xEBC7, 32942 - 11905: 0xB0B9, 32943 - 11905: 0xBFCF, 32944 - 11905: 0xC356, 32945 - 11905: 0xEBC5, 32946 - 11905: 0xD3FD, 32947 - 11905: 0xC357, 32948 - 11905: 0xEBC8, 32949 - 11905: 0xC358, 32950 - 11905: 0xC359, 32951 - 11905: 0xEBC9, 32952 - 11905: 0xC35A, 32953 - 11905: 0xC35B, 32954 - 11905: 0xB7CE, 32955 - 11905: 0xC35C, 32956 - 11905: 0xEBC2, 32957 - 11905: 0xEBC4, 32958 - 11905: 0xC9F6, 32959 - 11905: 0xD6D7, 32960 - 11905: 0xD5CD, 32961 - 11905: 0xD0B2, 32962 - 11905: 0xEBCF, 32963 - 11905: 0xCEB8, 32964 - 11905: 0xEBD0, 32965 - 11905: 0xC35D, 32966 - 11905: 0xB5A8, 32967 - 11905: 0xC35E, 32968 - 11905: 0xC35F, 32969 - 11905: 0xC360, 32970 - 11905: 0xC361, 32971 - 11905: 0xC362, 32972 - 11905: 0xB1B3, 32973 - 11905: 0xEBD2, 32974 - 11905: 0xCCA5, 32975 - 11905: 0xC363, 32976 - 11905: 0xC364, 32977 - 11905: 0xC365, 32978 - 11905: 0xC366, 32979 - 11905: 0xC367, 32980 - 11905: 0xC368, 32981 - 11905: 0xC369, 32982 - 11905: 0xC5D6, 32983 - 11905: 0xEBD3, 32984 - 11905: 0xC36A, 32985 - 11905: 0xEBD1, 32986 - 11905: 0xC5DF, 32987 - 11905: 0xEBCE, 32988 - 11905: 0xCAA4, 32989 - 11905: 0xEBD5, 32990 - 11905: 0xB0FB, 32991 - 11905: 0xC36B, 32992 - 11905: 0xC36C, 32993 - 11905: 0xBAFA, 32994 - 11905: 0xC36D, 32995 - 11905: 0xC36E, 32996 - 11905: 0xD8B7, 32997 - 11905: 0xF1E3, 32998 - 11905: 0xC36F, 32999 - 11905: 0xEBCA, 33000 - 11905: 0xEBCB, 33001 - 11905: 0xEBCC, 33002 - 11905: 0xEBCD, 33003 - 11905: 0xEBD6, 33004 - 11905: 0xE6C0, 33005 - 11905: 0xEBD9, 33006 - 11905: 0xC370, 33007 - 11905: 0xBFE8, 33008 - 11905: 0xD2C8, 33009 - 11905: 0xEBD7, 33010 - 11905: 0xEBDC, 33011 - 11905: 0xB8EC, 33012 - 11905: 0xEBD8, 33013 - 11905: 0xC371, 33014 - 11905: 0xBDBA, 33015 - 11905: 0xC372, 33016 - 11905: 0xD0D8, 33017 - 11905: 0xC373, 33018 - 11905: 0xB0B7, 33019 - 11905: 0xC374, 33020 - 11905: 0xEBDD, 33021 - 11905: 0xC4DC, 33022 - 11905: 0xC375, 33023 - 11905: 0xC376, 33024 - 11905: 0xC377, 33025 - 11905: 0xC378, 33026 - 11905: 0xD6AC, 33027 - 11905: 0xC379, 33028 - 11905: 0xC37A, 33029 - 11905: 0xC37B, 33030 - 11905: 0xB4E0, 33031 - 11905: 0xC37C, 33032 - 11905: 0xC37D, 33033 - 11905: 0xC2F6, 33034 - 11905: 0xBCB9, 33035 - 11905: 0xC37E, 33036 - 11905: 0xC380, 33037 - 11905: 0xEBDA, 33038 - 11905: 0xEBDB, 33039 - 11905: 0xD4E0, 33040 - 11905: 0xC6EA, 33041 - 11905: 0xC4D4, 33042 - 11905: 0xEBDF, 33043 - 11905: 0xC5A7, 33044 - 11905: 0xD9F5, 33045 - 11905: 0xC381, 33046 - 11905: 0xB2B1, 33047 - 11905: 0xC382, 33048 - 11905: 0xEBE4, 33049 - 11905: 0xC383, 33050 - 11905: 0xBDC5, 33051 - 11905: 0xC384, 33052 - 11905: 0xC385, 33053 - 11905: 0xC386, 33054 - 11905: 0xEBE2, 33055 - 11905: 0xC387, 33056 - 11905: 0xC388, 33057 - 11905: 0xC389, 33058 - 11905: 0xC38A, 33059 - 11905: 0xC38B, 33060 - 11905: 0xC38C, 33061 - 11905: 0xC38D, 33062 - 11905: 0xC38E, 33063 - 11905: 0xC38F, 33064 - 11905: 0xC390, 33065 - 11905: 0xC391, 33066 - 11905: 0xC392, 33067 - 11905: 0xC393, 33068 - 11905: 0xEBE3, 33069 - 11905: 0xC394, 33070 - 11905: 0xC395, 33071 - 11905: 0xB8AC, 33072 - 11905: 0xC396, 33073 - 11905: 0xCDD1, 33074 - 11905: 0xEBE5, 33075 - 11905: 0xC397, 33076 - 11905: 0xC398, 33077 - 11905: 0xC399, 33078 - 11905: 0xEBE1, 33079 - 11905: 0xC39A, 33080 - 11905: 0xC1B3, 33081 - 11905: 0xC39B, 33082 - 11905: 0xC39C, 33083 - 11905: 0xC39D, 33084 - 11905: 0xC39E, 33085 - 11905: 0xC39F, 33086 - 11905: 0xC6A2, 33087 - 11905: 0xC3A0, 33088 - 11905: 0xC440, 33089 - 11905: 0xC441, 33090 - 11905: 0xC442, 33091 - 11905: 0xC443, 33092 - 11905: 0xC444, 33093 - 11905: 0xC445, 33094 - 11905: 0xCCF3, 33095 - 11905: 0xC446, 33096 - 11905: 0xEBE6, 33097 - 11905: 0xC447, 33098 - 11905: 0xC0B0, 33099 - 11905: 0xD2B8, 33100 - 11905: 0xEBE7, 33101 - 11905: 0xC448, 33102 - 11905: 0xC449, 33103 - 11905: 0xC44A, 33104 - 11905: 0xB8AF, 33105 - 11905: 0xB8AD, 33106 - 11905: 0xC44B, 33107 - 11905: 0xEBE8, 33108 - 11905: 0xC7BB, 33109 - 11905: 0xCDF3, 33110 - 11905: 0xC44C, 33111 - 11905: 0xC44D, 33112 - 11905: 0xC44E, 33113 - 11905: 0xEBEA, 33114 - 11905: 0xEBEB, 33115 - 11905: 0xC44F, 33116 - 11905: 0xC450, 33117 - 11905: 0xC451, 33118 - 11905: 0xC452, 33119 - 11905: 0xC453, 33120 - 11905: 0xEBED, 33121 - 11905: 0xC454, 33122 - 11905: 0xC455, 33123 - 11905: 0xC456, 33124 - 11905: 0xC457, 33125 - 11905: 0xD0C8, 33126 - 11905: 0xC458, 33127 - 11905: 0xEBF2, 33128 - 11905: 0xC459, 33129 - 11905: 0xEBEE, 33130 - 11905: 0xC45A, 33131 - 11905: 0xC45B, 33132 - 11905: 0xC45C, 33133 - 11905: 0xEBF1, 33134 - 11905: 0xC8F9, 33135 - 11905: 0xC45D, 33136 - 11905: 0xD1FC, 33137 - 11905: 0xEBEC, 33138 - 11905: 0xC45E, 33139 - 11905: 0xC45F, 33140 - 11905: 0xEBE9, 33141 - 11905: 0xC460, 33142 - 11905: 0xC461, 33143 - 11905: 0xC462, 33144 - 11905: 0xC463, 33145 - 11905: 0xB8B9, 33146 - 11905: 0xCFD9, 33147 - 11905: 0xC4E5, 33148 - 11905: 0xEBEF, 33149 - 11905: 0xEBF0, 33150 - 11905: 0xCCDA, 33151 - 11905: 0xCDC8, 33152 - 11905: 0xB0F2, 33153 - 11905: 0xC464, 33154 - 11905: 0xEBF6, 33155 - 11905: 0xC465, 33156 - 11905: 0xC466, 33157 - 11905: 0xC467, 33158 - 11905: 0xC468, 33159 - 11905: 0xC469, 33160 - 11905: 0xEBF5, 33161 - 11905: 0xC46A, 33162 - 11905: 0xB2B2, 33163 - 11905: 0xC46B, 33164 - 11905: 0xC46C, 33165 - 11905: 0xC46D, 33166 - 11905: 0xC46E, 33167 - 11905: 0xB8E0, 33168 - 11905: 0xC46F, 33169 - 11905: 0xEBF7, 33170 - 11905: 0xC470, 33171 - 11905: 0xC471, 33172 - 11905: 0xC472, 33173 - 11905: 0xC473, 33174 - 11905: 0xC474, 33175 - 11905: 0xC475, 33176 - 11905: 0xB1EC, 33177 - 11905: 0xC476, 33178 - 11905: 0xC477, 33179 - 11905: 0xCCC5, 33180 - 11905: 0xC4A4, 33181 - 11905: 0xCFA5, 33182 - 11905: 0xC478, 33183 - 11905: 0xC479, 33184 - 11905: 0xC47A, 33185 - 11905: 0xC47B, 33186 - 11905: 0xC47C, 33187 - 11905: 0xEBF9, 33188 - 11905: 0xC47D, 33189 - 11905: 0xC47E, 33190 - 11905: 0xECA2, 33191 - 11905: 0xC480, 33192 - 11905: 0xC5F2, 33193 - 11905: 0xC481, 33194 - 11905: 0xEBFA, 33195 - 11905: 0xC482, 33196 - 11905: 0xC483, 33197 - 11905: 0xC484, 33198 - 11905: 0xC485, 33199 - 11905: 0xC486, 33200 - 11905: 0xC487, 33201 - 11905: 0xC488, 33202 - 11905: 0xC489, 33203 - 11905: 0xC9C5, 33204 - 11905: 0xC48A, 33205 - 11905: 0xC48B, 33206 - 11905: 0xC48C, 33207 - 11905: 0xC48D, 33208 - 11905: 0xC48E, 33209 - 11905: 0xC48F, 33210 - 11905: 0xE2DF, 33211 - 11905: 0xEBFE, 33212 - 11905: 0xC490, 33213 - 11905: 0xC491, 33214 - 11905: 0xC492, 33215 - 11905: 0xC493, 33216 - 11905: 0xCDCE, 33217 - 11905: 0xECA1, 33218 - 11905: 0xB1DB, 33219 - 11905: 0xD3B7, 33220 - 11905: 0xC494, 33221 - 11905: 0xC495, 33222 - 11905: 0xD2DC, 33223 - 11905: 0xC496, 33224 - 11905: 0xC497, 33225 - 11905: 0xC498, 33226 - 11905: 0xEBFD, 33227 - 11905: 0xC499, 33228 - 11905: 0xEBFB, 33229 - 11905: 0xC49A, 33230 - 11905: 0xC49B, 33231 - 11905: 0xC49C, 33232 - 11905: 0xC49D, 33233 - 11905: 0xC49E, 33234 - 11905: 0xC49F, 33235 - 11905: 0xC4A0, 33236 - 11905: 0xC540, 33237 - 11905: 0xC541, 33238 - 11905: 0xC542, 33239 - 11905: 0xC543, 33240 - 11905: 0xC544, 33241 - 11905: 0xC545, 33242 - 11905: 0xC546, 33243 - 11905: 0xC547, 33244 - 11905: 0xC548, 33245 - 11905: 0xC549, 33246 - 11905: 0xC54A, 33247 - 11905: 0xC54B, 33248 - 11905: 0xC54C, 33249 - 11905: 0xC54D, 33250 - 11905: 0xC54E, 33251 - 11905: 0xB3BC, 33252 - 11905: 0xC54F, 33253 - 11905: 0xC550, 33254 - 11905: 0xC551, 33255 - 11905: 0xEAB0, 33256 - 11905: 0xC552, 33257 - 11905: 0xC553, 33258 - 11905: 0xD7D4, 33259 - 11905: 0xC554, 33260 - 11905: 0xF4AB, 33261 - 11905: 0xB3F4, 33262 - 11905: 0xC555, 33263 - 11905: 0xC556, 33264 - 11905: 0xC557, 33265 - 11905: 0xC558, 33266 - 11905: 0xC559, 33267 - 11905: 0xD6C1, 33268 - 11905: 0xD6C2, 33269 - 11905: 0xC55A, 33270 - 11905: 0xC55B, 33271 - 11905: 0xC55C, 33272 - 11905: 0xC55D, 33273 - 11905: 0xC55E, 33274 - 11905: 0xC55F, 33275 - 11905: 0xD5E9, 33276 - 11905: 0xBECA, 33277 - 11905: 0xC560, 33278 - 11905: 0xF4A7, 33279 - 11905: 0xC561, 33280 - 11905: 0xD2A8, 33281 - 11905: 0xF4A8, 33282 - 11905: 0xF4A9, 33283 - 11905: 0xC562, 33284 - 11905: 0xF4AA, 33285 - 11905: 0xBECB, 33286 - 11905: 0xD3DF, 33287 - 11905: 0xC563, 33288 - 11905: 0xC564, 33289 - 11905: 0xC565, 33290 - 11905: 0xC566, 33291 - 11905: 0xC567, 33292 - 11905: 0xC9E0, 33293 - 11905: 0xC9E1, 33294 - 11905: 0xC568, 33295 - 11905: 0xC569, 33296 - 11905: 0xF3C2, 33297 - 11905: 0xC56A, 33298 - 11905: 0xCAE6, 33299 - 11905: 0xC56B, 33300 - 11905: 0xCCF2, 33301 - 11905: 0xC56C, 33302 - 11905: 0xC56D, 33303 - 11905: 0xC56E, 33304 - 11905: 0xC56F, 33305 - 11905: 0xC570, 33306 - 11905: 0xC571, 33307 - 11905: 0xE2B6, 33308 - 11905: 0xCBB4, 33309 - 11905: 0xC572, 33310 - 11905: 0xCEE8, 33311 - 11905: 0xD6DB, 33312 - 11905: 0xC573, 33313 - 11905: 0xF4AD, 33314 - 11905: 0xF4AE, 33315 - 11905: 0xF4AF, 33316 - 11905: 0xC574, 33317 - 11905: 0xC575, 33318 - 11905: 0xC576, 33319 - 11905: 0xC577, 33320 - 11905: 0xF4B2, 33321 - 11905: 0xC578, 33322 - 11905: 0xBABD, 33323 - 11905: 0xF4B3, 33324 - 11905: 0xB0E3, 33325 - 11905: 0xF4B0, 33326 - 11905: 0xC579, 33327 - 11905: 0xF4B1, 33328 - 11905: 0xBDA2, 33329 - 11905: 0xB2D5, 33330 - 11905: 0xC57A, 33331 - 11905: 0xF4B6, 33332 - 11905: 0xF4B7, 33333 - 11905: 0xB6E6, 33334 - 11905: 0xB2B0, 33335 - 11905: 0xCFCF, 33336 - 11905: 0xF4B4, 33337 - 11905: 0xB4AC, 33338 - 11905: 0xC57B, 33339 - 11905: 0xF4B5, 33340 - 11905: 0xC57C, 33341 - 11905: 0xC57D, 33342 - 11905: 0xF4B8, 33343 - 11905: 0xC57E, 33344 - 11905: 0xC580, 33345 - 11905: 0xC581, 33346 - 11905: 0xC582, 33347 - 11905: 0xC583, 33348 - 11905: 0xF4B9, 33349 - 11905: 0xC584, 33350 - 11905: 0xC585, 33351 - 11905: 0xCDA7, 33352 - 11905: 0xC586, 33353 - 11905: 0xF4BA, 33354 - 11905: 0xC587, 33355 - 11905: 0xF4BB, 33356 - 11905: 0xC588, 33357 - 11905: 0xC589, 33358 - 11905: 0xC58A, 33359 - 11905: 0xF4BC, 33360 - 11905: 0xC58B, 33361 - 11905: 0xC58C, 33362 - 11905: 0xC58D, 33363 - 11905: 0xC58E, 33364 - 11905: 0xC58F, 33365 - 11905: 0xC590, 33366 - 11905: 0xC591, 33367 - 11905: 0xC592, 33368 - 11905: 0xCBD2, 33369 - 11905: 0xC593, 33370 - 11905: 0xF4BD, 33371 - 11905: 0xC594, 33372 - 11905: 0xC595, 33373 - 11905: 0xC596, 33374 - 11905: 0xC597, 33375 - 11905: 0xF4BE, 33376 - 11905: 0xC598, 33377 - 11905: 0xC599, 33378 - 11905: 0xC59A, 33379 - 11905: 0xC59B, 33380 - 11905: 0xC59C, 33381 - 11905: 0xC59D, 33382 - 11905: 0xC59E, 33383 - 11905: 0xC59F, 33384 - 11905: 0xF4BF, 33385 - 11905: 0xC5A0, 33386 - 11905: 0xC640, 33387 - 11905: 0xC641, 33388 - 11905: 0xC642, 33389 - 11905: 0xC643, 33390 - 11905: 0xF4DE, 33391 - 11905: 0xC1BC, 33392 - 11905: 0xBCE8, 33393 - 11905: 0xC644, 33394 - 11905: 0xC9AB, 33395 - 11905: 0xD1DE, 33396 - 11905: 0xE5F5, 33397 - 11905: 0xC645, 33398 - 11905: 0xC646, 33399 - 11905: 0xC647, 33400 - 11905: 0xC648, 33401 - 11905: 0xDCB3, 33402 - 11905: 0xD2D5, 33403 - 11905: 0xC649, 33404 - 11905: 0xC64A, 33405 - 11905: 0xDCB4, 33406 - 11905: 0xB0AC, 33407 - 11905: 0xDCB5, 33408 - 11905: 0xC64B, 33409 - 11905: 0xC64C, 33410 - 11905: 0xBDDA, 33411 - 11905: 0xC64D, 33412 - 11905: 0xDCB9, 33413 - 11905: 0xC64E, 33414 - 11905: 0xC64F, 33415 - 11905: 0xC650, 33416 - 11905: 0xD8C2, 33417 - 11905: 0xC651, 33418 - 11905: 0xDCB7, 33419 - 11905: 0xD3F3, 33420 - 11905: 0xC652, 33421 - 11905: 0xC9D6, 33422 - 11905: 0xDCBA, 33423 - 11905: 0xDCB6, 33424 - 11905: 0xC653, 33425 - 11905: 0xDCBB, 33426 - 11905: 0xC3A2, 33427 - 11905: 0xC654, 33428 - 11905: 0xC655, 33429 - 11905: 0xC656, 33430 - 11905: 0xC657, 33431 - 11905: 0xDCBC, 33432 - 11905: 0xDCC5, 33433 - 11905: 0xDCBD, 33434 - 11905: 0xC658, 33435 - 11905: 0xC659, 33436 - 11905: 0xCEDF, 33437 - 11905: 0xD6A5, 33438 - 11905: 0xC65A, 33439 - 11905: 0xDCCF, 33440 - 11905: 0xC65B, 33441 - 11905: 0xDCCD, 33442 - 11905: 0xC65C, 33443 - 11905: 0xC65D, 33444 - 11905: 0xDCD2, 33445 - 11905: 0xBDE6, 33446 - 11905: 0xC2AB, 33447 - 11905: 0xC65E, 33448 - 11905: 0xDCB8, 33449 - 11905: 0xDCCB, 33450 - 11905: 0xDCCE, 33451 - 11905: 0xDCBE, 33452 - 11905: 0xB7D2, 33453 - 11905: 0xB0C5, 33454 - 11905: 0xDCC7, 33455 - 11905: 0xD0BE, 33456 - 11905: 0xDCC1, 33457 - 11905: 0xBBA8, 33458 - 11905: 0xC65F, 33459 - 11905: 0xB7BC, 33460 - 11905: 0xDCCC, 33461 - 11905: 0xC660, 33462 - 11905: 0xC661, 33463 - 11905: 0xDCC6, 33464 - 11905: 0xDCBF, 33465 - 11905: 0xC7DB, 33466 - 11905: 0xC662, 33467 - 11905: 0xC663, 33468 - 11905: 0xC664, 33469 - 11905: 0xD1BF, 33470 - 11905: 0xDCC0, 33471 - 11905: 0xC665, 33472 - 11905: 0xC666, 33473 - 11905: 0xDCCA, 33474 - 11905: 0xC667, 33475 - 11905: 0xC668, 33476 - 11905: 0xDCD0, 33477 - 11905: 0xC669, 33478 - 11905: 0xC66A, 33479 - 11905: 0xCEAD, 33480 - 11905: 0xDCC2, 33481 - 11905: 0xC66B, 33482 - 11905: 0xDCC3, 33483 - 11905: 0xDCC8, 33484 - 11905: 0xDCC9, 33485 - 11905: 0xB2D4, 33486 - 11905: 0xDCD1, 33487 - 11905: 0xCBD5, 33488 - 11905: 0xC66C, 33489 - 11905: 0xD4B7, 33490 - 11905: 0xDCDB, 33491 - 11905: 0xDCDF, 33492 - 11905: 0xCCA6, 33493 - 11905: 0xDCE6, 33494 - 11905: 0xC66D, 33495 - 11905: 0xC3E7, 33496 - 11905: 0xDCDC, 33497 - 11905: 0xC66E, 33498 - 11905: 0xC66F, 33499 - 11905: 0xBFC1, 33500 - 11905: 0xDCD9, 33501 - 11905: 0xC670, 33502 - 11905: 0xB0FA, 33503 - 11905: 0xB9B6, 33504 - 11905: 0xDCE5, 33505 - 11905: 0xDCD3, 33506 - 11905: 0xC671, 33507 - 11905: 0xDCC4, 33508 - 11905: 0xDCD6, 33509 - 11905: 0xC8F4, 33510 - 11905: 0xBFE0, 33511 - 11905: 0xC672, 33512 - 11905: 0xC673, 33513 - 11905: 0xC674, 33514 - 11905: 0xC675, 33515 - 11905: 0xC9BB, 33516 - 11905: 0xC676, 33517 - 11905: 0xC677, 33518 - 11905: 0xC678, 33519 - 11905: 0xB1BD, 33520 - 11905: 0xC679, 33521 - 11905: 0xD3A2, 33522 - 11905: 0xC67A, 33523 - 11905: 0xC67B, 33524 - 11905: 0xDCDA, 33525 - 11905: 0xC67C, 33526 - 11905: 0xC67D, 33527 - 11905: 0xDCD5, 33528 - 11905: 0xC67E, 33529 - 11905: 0xC6BB, 33530 - 11905: 0xC680, 33531 - 11905: 0xDCDE, 33532 - 11905: 0xC681, 33533 - 11905: 0xC682, 33534 - 11905: 0xC683, 33535 - 11905: 0xC684, 33536 - 11905: 0xC685, 33537 - 11905: 0xD7C2, 33538 - 11905: 0xC3AF, 33539 - 11905: 0xB7B6, 33540 - 11905: 0xC7D1, 33541 - 11905: 0xC3A9, 33542 - 11905: 0xDCE2, 33543 - 11905: 0xDCD8, 33544 - 11905: 0xDCEB, 33545 - 11905: 0xDCD4, 33546 - 11905: 0xC686, 33547 - 11905: 0xC687, 33548 - 11905: 0xDCDD, 33549 - 11905: 0xC688, 33550 - 11905: 0xBEA5, 33551 - 11905: 0xDCD7, 33552 - 11905: 0xC689, 33553 - 11905: 0xDCE0, 33554 - 11905: 0xC68A, 33555 - 11905: 0xC68B, 33556 - 11905: 0xDCE3, 33557 - 11905: 0xDCE4, 33558 - 11905: 0xC68C, 33559 - 11905: 0xDCF8, 33560 - 11905: 0xC68D, 33561 - 11905: 0xC68E, 33562 - 11905: 0xDCE1, 33563 - 11905: 0xDDA2, 33564 - 11905: 0xDCE7, 33565 - 11905: 0xC68F, 33566 - 11905: 0xC690, 33567 - 11905: 0xC691, 33568 - 11905: 0xC692, 33569 - 11905: 0xC693, 33570 - 11905: 0xC694, 33571 - 11905: 0xC695, 33572 - 11905: 0xC696, 33573 - 11905: 0xC697, 33574 - 11905: 0xC698, 33575 - 11905: 0xBCEB, 33576 - 11905: 0xB4C4, 33577 - 11905: 0xC699, 33578 - 11905: 0xC69A, 33579 - 11905: 0xC3A3, 33580 - 11905: 0xB2E7, 33581 - 11905: 0xDCFA, 33582 - 11905: 0xC69B, 33583 - 11905: 0xDCF2, 33584 - 11905: 0xC69C, 33585 - 11905: 0xDCEF, 33586 - 11905: 0xC69D, 33587 - 11905: 0xDCFC, 33588 - 11905: 0xDCEE, 33589 - 11905: 0xD2F0, 33590 - 11905: 0xB2E8, 33591 - 11905: 0xC69E, 33592 - 11905: 0xC8D7, 33593 - 11905: 0xC8E3, 33594 - 11905: 0xDCFB, 33595 - 11905: 0xC69F, 33596 - 11905: 0xDCED, 33597 - 11905: 0xC6A0, 33598 - 11905: 0xC740, 33599 - 11905: 0xC741, 33600 - 11905: 0xDCF7, 33601 - 11905: 0xC742, 33602 - 11905: 0xC743, 33603 - 11905: 0xDCF5, 33604 - 11905: 0xC744, 33605 - 11905: 0xC745, 33606 - 11905: 0xBEA3, 33607 - 11905: 0xDCF4, 33608 - 11905: 0xC746, 33609 - 11905: 0xB2DD, 33610 - 11905: 0xC747, 33611 - 11905: 0xC748, 33612 - 11905: 0xC749, 33613 - 11905: 0xC74A, 33614 - 11905: 0xC74B, 33615 - 11905: 0xDCF3, 33616 - 11905: 0xBCF6, 33617 - 11905: 0xDCE8, 33618 - 11905: 0xBBC4, 33619 - 11905: 0xC74C, 33620 - 11905: 0xC0F3, 33621 - 11905: 0xC74D, 33622 - 11905: 0xC74E, 33623 - 11905: 0xC74F, 33624 - 11905: 0xC750, 33625 - 11905: 0xC751, 33626 - 11905: 0xBCD4, 33627 - 11905: 0xDCE9, 33628 - 11905: 0xDCEA, 33629 - 11905: 0xC752, 33630 - 11905: 0xDCF1, 33631 - 11905: 0xDCF6, 33632 - 11905: 0xDCF9, 33633 - 11905: 0xB5B4, 33634 - 11905: 0xC753, 33635 - 11905: 0xC8D9, 33636 - 11905: 0xBBE7, 33637 - 11905: 0xDCFE, 33638 - 11905: 0xDCFD, 33639 - 11905: 0xD3AB, 33640 - 11905: 0xDDA1, 33641 - 11905: 0xDDA3, 33642 - 11905: 0xDDA5, 33643 - 11905: 0xD2F1, 33644 - 11905: 0xDDA4, 33645 - 11905: 0xDDA6, 33646 - 11905: 0xDDA7, 33647 - 11905: 0xD2A9, 33648 - 11905: 0xC754, 33649 - 11905: 0xC755, 33650 - 11905: 0xC756, 33651 - 11905: 0xC757, 33652 - 11905: 0xC758, 33653 - 11905: 0xC759, 33654 - 11905: 0xC75A, 33655 - 11905: 0xBAC9, 33656 - 11905: 0xDDA9, 33657 - 11905: 0xC75B, 33658 - 11905: 0xC75C, 33659 - 11905: 0xDDB6, 33660 - 11905: 0xDDB1, 33661 - 11905: 0xDDB4, 33662 - 11905: 0xC75D, 33663 - 11905: 0xC75E, 33664 - 11905: 0xC75F, 33665 - 11905: 0xC760, 33666 - 11905: 0xC761, 33667 - 11905: 0xC762, 33668 - 11905: 0xC763, 33669 - 11905: 0xDDB0, 33670 - 11905: 0xC6CE, 33671 - 11905: 0xC764, 33672 - 11905: 0xC765, 33673 - 11905: 0xC0F2, 33674 - 11905: 0xC766, 33675 - 11905: 0xC767, 33676 - 11905: 0xC768, 33677 - 11905: 0xC769, 33678 - 11905: 0xC9AF, 33679 - 11905: 0xC76A, 33680 - 11905: 0xC76B, 33681 - 11905: 0xC76C, 33682 - 11905: 0xDCEC, 33683 - 11905: 0xDDAE, 33684 - 11905: 0xC76D, 33685 - 11905: 0xC76E, 33686 - 11905: 0xC76F, 33687 - 11905: 0xC770, 33688 - 11905: 0xDDB7, 33689 - 11905: 0xC771, 33690 - 11905: 0xC772, 33691 - 11905: 0xDCF0, 33692 - 11905: 0xDDAF, 33693 - 11905: 0xC773, 33694 - 11905: 0xDDB8, 33695 - 11905: 0xC774, 33696 - 11905: 0xDDAC, 33697 - 11905: 0xC775, 33698 - 11905: 0xC776, 33699 - 11905: 0xC777, 33700 - 11905: 0xC778, 33701 - 11905: 0xC779, 33702 - 11905: 0xC77A, 33703 - 11905: 0xC77B, 33704 - 11905: 0xDDB9, 33705 - 11905: 0xDDB3, 33706 - 11905: 0xDDAD, 33707 - 11905: 0xC4AA, 33708 - 11905: 0xC77C, 33709 - 11905: 0xC77D, 33710 - 11905: 0xC77E, 33711 - 11905: 0xC780, 33712 - 11905: 0xDDA8, 33713 - 11905: 0xC0B3, 33714 - 11905: 0xC1AB, 33715 - 11905: 0xDDAA, 33716 - 11905: 0xDDAB, 33717 - 11905: 0xC781, 33718 - 11905: 0xDDB2, 33719 - 11905: 0xBBF1, 33720 - 11905: 0xDDB5, 33721 - 11905: 0xD3A8, 33722 - 11905: 0xDDBA, 33723 - 11905: 0xC782, 33724 - 11905: 0xDDBB, 33725 - 11905: 0xC3A7, 33726 - 11905: 0xC783, 33727 - 11905: 0xC784, 33728 - 11905: 0xDDD2, 33729 - 11905: 0xDDBC, 33730 - 11905: 0xC785, 33731 - 11905: 0xC786, 33732 - 11905: 0xC787, 33733 - 11905: 0xDDD1, 33734 - 11905: 0xC788, 33735 - 11905: 0xB9BD, 33736 - 11905: 0xC789, 33737 - 11905: 0xC78A, 33738 - 11905: 0xBED5, 33739 - 11905: 0xC78B, 33740 - 11905: 0xBEFA, 33741 - 11905: 0xC78C, 33742 - 11905: 0xC78D, 33743 - 11905: 0xBACA, 33744 - 11905: 0xC78E, 33745 - 11905: 0xC78F, 33746 - 11905: 0xC790, 33747 - 11905: 0xC791, 33748 - 11905: 0xDDCA, 33749 - 11905: 0xC792, 33750 - 11905: 0xDDC5, 33751 - 11905: 0xC793, 33752 - 11905: 0xDDBF, 33753 - 11905: 0xC794, 33754 - 11905: 0xC795, 33755 - 11905: 0xC796, 33756 - 11905: 0xB2CB, 33757 - 11905: 0xDDC3, 33758 - 11905: 0xC797, 33759 - 11905: 0xDDCB, 33760 - 11905: 0xB2A4, 33761 - 11905: 0xDDD5, 33762 - 11905: 0xC798, 33763 - 11905: 0xC799, 33764 - 11905: 0xC79A, 33765 - 11905: 0xDDBE, 33766 - 11905: 0xC79B, 33767 - 11905: 0xC79C, 33768 - 11905: 0xC79D, 33769 - 11905: 0xC6D0, 33770 - 11905: 0xDDD0, 33771 - 11905: 0xC79E, 33772 - 11905: 0xC79F, 33773 - 11905: 0xC7A0, 33774 - 11905: 0xC840, 33775 - 11905: 0xC841, 33776 - 11905: 0xDDD4, 33777 - 11905: 0xC1E2, 33778 - 11905: 0xB7C6, 33779 - 11905: 0xC842, 33780 - 11905: 0xC843, 33781 - 11905: 0xC844, 33782 - 11905: 0xC845, 33783 - 11905: 0xC846, 33784 - 11905: 0xDDCE, 33785 - 11905: 0xDDCF, 33786 - 11905: 0xC847, 33787 - 11905: 0xC848, 33788 - 11905: 0xC849, 33789 - 11905: 0xDDC4, 33790 - 11905: 0xC84A, 33791 - 11905: 0xC84B, 33792 - 11905: 0xC84C, 33793 - 11905: 0xDDBD, 33794 - 11905: 0xC84D, 33795 - 11905: 0xDDCD, 33796 - 11905: 0xCCD1, 33797 - 11905: 0xC84E, 33798 - 11905: 0xDDC9, 33799 - 11905: 0xC84F, 33800 - 11905: 0xC850, 33801 - 11905: 0xC851, 33802 - 11905: 0xC852, 33803 - 11905: 0xDDC2, 33804 - 11905: 0xC3C8, 33805 - 11905: 0xC6BC, 33806 - 11905: 0xCEAE, 33807 - 11905: 0xDDCC, 33808 - 11905: 0xC853, 33809 - 11905: 0xDDC8, 33810 - 11905: 0xC854, 33811 - 11905: 0xC855, 33812 - 11905: 0xC856, 33813 - 11905: 0xC857, 33814 - 11905: 0xC858, 33815 - 11905: 0xC859, 33816 - 11905: 0xDDC1, 33817 - 11905: 0xC85A, 33818 - 11905: 0xC85B, 33819 - 11905: 0xC85C, 33820 - 11905: 0xDDC6, 33821 - 11905: 0xC2DC, 33822 - 11905: 0xC85D, 33823 - 11905: 0xC85E, 33824 - 11905: 0xC85F, 33825 - 11905: 0xC860, 33826 - 11905: 0xC861, 33827 - 11905: 0xC862, 33828 - 11905: 0xD3A9, 33829 - 11905: 0xD3AA, 33830 - 11905: 0xDDD3, 33831 - 11905: 0xCFF4, 33832 - 11905: 0xC8F8, 33833 - 11905: 0xC863, 33834 - 11905: 0xC864, 33835 - 11905: 0xC865, 33836 - 11905: 0xC866, 33837 - 11905: 0xC867, 33838 - 11905: 0xC868, 33839 - 11905: 0xC869, 33840 - 11905: 0xC86A, 33841 - 11905: 0xDDE6, 33842 - 11905: 0xC86B, 33843 - 11905: 0xC86C, 33844 - 11905: 0xC86D, 33845 - 11905: 0xC86E, 33846 - 11905: 0xC86F, 33847 - 11905: 0xC870, 33848 - 11905: 0xDDC7, 33849 - 11905: 0xC871, 33850 - 11905: 0xC872, 33851 - 11905: 0xC873, 33852 - 11905: 0xDDE0, 33853 - 11905: 0xC2E4, 33854 - 11905: 0xC874, 33855 - 11905: 0xC875, 33856 - 11905: 0xC876, 33857 - 11905: 0xC877, 33858 - 11905: 0xC878, 33859 - 11905: 0xC879, 33860 - 11905: 0xC87A, 33861 - 11905: 0xC87B, 33862 - 11905: 0xDDE1, 33863 - 11905: 0xC87C, 33864 - 11905: 0xC87D, 33865 - 11905: 0xC87E, 33866 - 11905: 0xC880, 33867 - 11905: 0xC881, 33868 - 11905: 0xC882, 33869 - 11905: 0xC883, 33870 - 11905: 0xC884, 33871 - 11905: 0xC885, 33872 - 11905: 0xC886, 33873 - 11905: 0xDDD7, 33874 - 11905: 0xC887, 33875 - 11905: 0xC888, 33876 - 11905: 0xC889, 33877 - 11905: 0xC88A, 33878 - 11905: 0xC88B, 33879 - 11905: 0xD6F8, 33880 - 11905: 0xC88C, 33881 - 11905: 0xDDD9, 33882 - 11905: 0xDDD8, 33883 - 11905: 0xB8F0, 33884 - 11905: 0xDDD6, 33885 - 11905: 0xC88D, 33886 - 11905: 0xC88E, 33887 - 11905: 0xC88F, 33888 - 11905: 0xC890, 33889 - 11905: 0xC6CF, 33890 - 11905: 0xC891, 33891 - 11905: 0xB6AD, 33892 - 11905: 0xC892, 33893 - 11905: 0xC893, 33894 - 11905: 0xC894, 33895 - 11905: 0xC895, 33896 - 11905: 0xC896, 33897 - 11905: 0xDDE2, 33898 - 11905: 0xC897, 33899 - 11905: 0xBAF9, 33900 - 11905: 0xD4E1, 33901 - 11905: 0xDDE7, 33902 - 11905: 0xC898, 33903 - 11905: 0xC899, 33904 - 11905: 0xC89A, 33905 - 11905: 0xB4D0, 33906 - 11905: 0xC89B, 33907 - 11905: 0xDDDA, 33908 - 11905: 0xC89C, 33909 - 11905: 0xBFFB, 33910 - 11905: 0xDDE3, 33911 - 11905: 0xC89D, 33912 - 11905: 0xDDDF, 33913 - 11905: 0xC89E, 33914 - 11905: 0xDDDD, 33915 - 11905: 0xC89F, 33916 - 11905: 0xC8A0, 33917 - 11905: 0xC940, 33918 - 11905: 0xC941, 33919 - 11905: 0xC942, 33920 - 11905: 0xC943, 33921 - 11905: 0xC944, 33922 - 11905: 0xB5D9, 33923 - 11905: 0xC945, 33924 - 11905: 0xC946, 33925 - 11905: 0xC947, 33926 - 11905: 0xC948, 33927 - 11905: 0xDDDB, 33928 - 11905: 0xDDDC, 33929 - 11905: 0xDDDE, 33930 - 11905: 0xC949, 33931 - 11905: 0xBDAF, 33932 - 11905: 0xDDE4, 33933 - 11905: 0xC94A, 33934 - 11905: 0xDDE5, 33935 - 11905: 0xC94B, 33936 - 11905: 0xC94C, 33937 - 11905: 0xC94D, 33938 - 11905: 0xC94E, 33939 - 11905: 0xC94F, 33940 - 11905: 0xC950, 33941 - 11905: 0xC951, 33942 - 11905: 0xC952, 33943 - 11905: 0xDDF5, 33944 - 11905: 0xC953, 33945 - 11905: 0xC3C9, 33946 - 11905: 0xC954, 33947 - 11905: 0xC955, 33948 - 11905: 0xCBE2, 33949 - 11905: 0xC956, 33950 - 11905: 0xC957, 33951 - 11905: 0xC958, 33952 - 11905: 0xC959, 33953 - 11905: 0xDDF2, 33954 - 11905: 0xC95A, 33955 - 11905: 0xC95B, 33956 - 11905: 0xC95C, 33957 - 11905: 0xC95D, 33958 - 11905: 0xC95E, 33959 - 11905: 0xC95F, 33960 - 11905: 0xC960, 33961 - 11905: 0xC961, 33962 - 11905: 0xC962, 33963 - 11905: 0xC963, 33964 - 11905: 0xC964, 33965 - 11905: 0xC965, 33966 - 11905: 0xC966, 33967 - 11905: 0xD8E1, 33968 - 11905: 0xC967, 33969 - 11905: 0xC968, 33970 - 11905: 0xC6D1, 33971 - 11905: 0xC969, 33972 - 11905: 0xDDF4, 33973 - 11905: 0xC96A, 33974 - 11905: 0xC96B, 33975 - 11905: 0xC96C, 33976 - 11905: 0xD5F4, 33977 - 11905: 0xDDF3, 33978 - 11905: 0xDDF0, 33979 - 11905: 0xC96D, 33980 - 11905: 0xC96E, 33981 - 11905: 0xDDEC, 33982 - 11905: 0xC96F, 33983 - 11905: 0xDDEF, 33984 - 11905: 0xC970, 33985 - 11905: 0xDDE8, 33986 - 11905: 0xC971, 33987 - 11905: 0xC972, 33988 - 11905: 0xD0EE, 33989 - 11905: 0xC973, 33990 - 11905: 0xC974, 33991 - 11905: 0xC975, 33992 - 11905: 0xC976, 33993 - 11905: 0xC8D8, 33994 - 11905: 0xDDEE, 33995 - 11905: 0xC977, 33996 - 11905: 0xC978, 33997 - 11905: 0xDDE9, 33998 - 11905: 0xC979, 33999 - 11905: 0xC97A, 34000 - 11905: 0xDDEA, 34001 - 11905: 0xCBF2, 34002 - 11905: 0xC97B, 34003 - 11905: 0xDDED, 34004 - 11905: 0xC97C, 34005 - 11905: 0xC97D, 34006 - 11905: 0xB1CD, 34007 - 11905: 0xC97E, 34008 - 11905: 0xC980, 34009 - 11905: 0xC981, 34010 - 11905: 0xC982, 34011 - 11905: 0xC983, 34012 - 11905: 0xC984, 34013 - 11905: 0xC0B6, 34014 - 11905: 0xC985, 34015 - 11905: 0xBCBB, 34016 - 11905: 0xDDF1, 34017 - 11905: 0xC986, 34018 - 11905: 0xC987, 34019 - 11905: 0xDDF7, 34020 - 11905: 0xC988, 34021 - 11905: 0xDDF6, 34022 - 11905: 0xDDEB, 34023 - 11905: 0xC989, 34024 - 11905: 0xC98A, 34025 - 11905: 0xC98B, 34026 - 11905: 0xC98C, 34027 - 11905: 0xC98D, 34028 - 11905: 0xC5EE, 34029 - 11905: 0xC98E, 34030 - 11905: 0xC98F, 34031 - 11905: 0xC990, 34032 - 11905: 0xDDFB, 34033 - 11905: 0xC991, 34034 - 11905: 0xC992, 34035 - 11905: 0xC993, 34036 - 11905: 0xC994, 34037 - 11905: 0xC995, 34038 - 11905: 0xC996, 34039 - 11905: 0xC997, 34040 - 11905: 0xC998, 34041 - 11905: 0xC999, 34042 - 11905: 0xC99A, 34043 - 11905: 0xC99B, 34044 - 11905: 0xDEA4, 34045 - 11905: 0xC99C, 34046 - 11905: 0xC99D, 34047 - 11905: 0xDEA3, 34048 - 11905: 0xC99E, 34049 - 11905: 0xC99F, 34050 - 11905: 0xC9A0, 34051 - 11905: 0xCA40, 34052 - 11905: 0xCA41, 34053 - 11905: 0xCA42, 34054 - 11905: 0xCA43, 34055 - 11905: 0xCA44, 34056 - 11905: 0xCA45, 34057 - 11905: 0xCA46, 34058 - 11905: 0xCA47, 34059 - 11905: 0xCA48, 34060 - 11905: 0xDDF8, 34061 - 11905: 0xCA49, 34062 - 11905: 0xCA4A, 34063 - 11905: 0xCA4B, 34064 - 11905: 0xCA4C, 34065 - 11905: 0xC3EF, 34066 - 11905: 0xCA4D, 34067 - 11905: 0xC2FB, 34068 - 11905: 0xCA4E, 34069 - 11905: 0xCA4F, 34070 - 11905: 0xCA50, 34071 - 11905: 0xD5E1, 34072 - 11905: 0xCA51, 34073 - 11905: 0xCA52, 34074 - 11905: 0xCEB5, 34075 - 11905: 0xCA53, 34076 - 11905: 0xCA54, 34077 - 11905: 0xCA55, 34078 - 11905: 0xCA56, 34079 - 11905: 0xDDFD, 34080 - 11905: 0xCA57, 34081 - 11905: 0xB2CC, 34082 - 11905: 0xCA58, 34083 - 11905: 0xCA59, 34084 - 11905: 0xCA5A, 34085 - 11905: 0xCA5B, 34086 - 11905: 0xCA5C, 34087 - 11905: 0xCA5D, 34088 - 11905: 0xCA5E, 34089 - 11905: 0xCA5F, 34090 - 11905: 0xCA60, 34091 - 11905: 0xC4E8, 34092 - 11905: 0xCADF, 34093 - 11905: 0xCA61, 34094 - 11905: 0xCA62, 34095 - 11905: 0xCA63, 34096 - 11905: 0xCA64, 34097 - 11905: 0xCA65, 34098 - 11905: 0xCA66, 34099 - 11905: 0xCA67, 34100 - 11905: 0xCA68, 34101 - 11905: 0xCA69, 34102 - 11905: 0xCA6A, 34103 - 11905: 0xC7BE, 34104 - 11905: 0xDDFA, 34105 - 11905: 0xDDFC, 34106 - 11905: 0xDDFE, 34107 - 11905: 0xDEA2, 34108 - 11905: 0xB0AA, 34109 - 11905: 0xB1CE, 34110 - 11905: 0xCA6B, 34111 - 11905: 0xCA6C, 34112 - 11905: 0xCA6D, 34113 - 11905: 0xCA6E, 34114 - 11905: 0xCA6F, 34115 - 11905: 0xDEAC, 34116 - 11905: 0xCA70, 34117 - 11905: 0xCA71, 34118 - 11905: 0xCA72, 34119 - 11905: 0xCA73, 34120 - 11905: 0xDEA6, 34121 - 11905: 0xBDB6, 34122 - 11905: 0xC8EF, 34123 - 11905: 0xCA74, 34124 - 11905: 0xCA75, 34125 - 11905: 0xCA76, 34126 - 11905: 0xCA77, 34127 - 11905: 0xCA78, 34128 - 11905: 0xCA79, 34129 - 11905: 0xCA7A, 34130 - 11905: 0xCA7B, 34131 - 11905: 0xCA7C, 34132 - 11905: 0xCA7D, 34133 - 11905: 0xCA7E, 34134 - 11905: 0xDEA1, 34135 - 11905: 0xCA80, 34136 - 11905: 0xCA81, 34137 - 11905: 0xDEA5, 34138 - 11905: 0xCA82, 34139 - 11905: 0xCA83, 34140 - 11905: 0xCA84, 34141 - 11905: 0xCA85, 34142 - 11905: 0xDEA9, 34143 - 11905: 0xCA86, 34144 - 11905: 0xCA87, 34145 - 11905: 0xCA88, 34146 - 11905: 0xCA89, 34147 - 11905: 0xCA8A, 34148 - 11905: 0xDEA8, 34149 - 11905: 0xCA8B, 34150 - 11905: 0xCA8C, 34151 - 11905: 0xCA8D, 34152 - 11905: 0xDEA7, 34153 - 11905: 0xCA8E, 34154 - 11905: 0xCA8F, 34155 - 11905: 0xCA90, 34156 - 11905: 0xCA91, 34157 - 11905: 0xCA92, 34158 - 11905: 0xCA93, 34159 - 11905: 0xCA94, 34160 - 11905: 0xCA95, 34161 - 11905: 0xCA96, 34162 - 11905: 0xDEAD, 34163 - 11905: 0xCA97, 34164 - 11905: 0xD4CC, 34165 - 11905: 0xCA98, 34166 - 11905: 0xCA99, 34167 - 11905: 0xCA9A, 34168 - 11905: 0xCA9B, 34169 - 11905: 0xDEB3, 34170 - 11905: 0xDEAA, 34171 - 11905: 0xDEAE, 34172 - 11905: 0xCA9C, 34173 - 11905: 0xCA9D, 34174 - 11905: 0xC0D9, 34175 - 11905: 0xCA9E, 34176 - 11905: 0xCA9F, 34177 - 11905: 0xCAA0, 34178 - 11905: 0xCB40, 34179 - 11905: 0xCB41, 34180 - 11905: 0xB1A1, 34181 - 11905: 0xDEB6, 34182 - 11905: 0xCB42, 34183 - 11905: 0xDEB1, 34184 - 11905: 0xCB43, 34185 - 11905: 0xCB44, 34186 - 11905: 0xCB45, 34187 - 11905: 0xCB46, 34188 - 11905: 0xCB47, 34189 - 11905: 0xCB48, 34190 - 11905: 0xCB49, 34191 - 11905: 0xDEB2, 34192 - 11905: 0xCB4A, 34193 - 11905: 0xCB4B, 34194 - 11905: 0xCB4C, 34195 - 11905: 0xCB4D, 34196 - 11905: 0xCB4E, 34197 - 11905: 0xCB4F, 34198 - 11905: 0xCB50, 34199 - 11905: 0xCB51, 34200 - 11905: 0xCB52, 34201 - 11905: 0xCB53, 34202 - 11905: 0xCB54, 34203 - 11905: 0xD1A6, 34204 - 11905: 0xDEB5, 34205 - 11905: 0xCB55, 34206 - 11905: 0xCB56, 34207 - 11905: 0xCB57, 34208 - 11905: 0xCB58, 34209 - 11905: 0xCB59, 34210 - 11905: 0xCB5A, 34211 - 11905: 0xCB5B, 34212 - 11905: 0xDEAF, 34213 - 11905: 0xCB5C, 34214 - 11905: 0xCB5D, 34215 - 11905: 0xCB5E, 34216 - 11905: 0xDEB0, 34217 - 11905: 0xCB5F, 34218 - 11905: 0xD0BD, 34219 - 11905: 0xCB60, 34220 - 11905: 0xCB61, 34221 - 11905: 0xCB62, 34222 - 11905: 0xDEB4, 34223 - 11905: 0xCAED, 34224 - 11905: 0xDEB9, 34225 - 11905: 0xCB63, 34226 - 11905: 0xCB64, 34227 - 11905: 0xCB65, 34228 - 11905: 0xCB66, 34229 - 11905: 0xCB67, 34230 - 11905: 0xCB68, 34231 - 11905: 0xDEB8, 34232 - 11905: 0xCB69, 34233 - 11905: 0xDEB7, 34234 - 11905: 0xCB6A, 34235 - 11905: 0xCB6B, 34236 - 11905: 0xCB6C, 34237 - 11905: 0xCB6D, 34238 - 11905: 0xCB6E, 34239 - 11905: 0xCB6F, 34240 - 11905: 0xCB70, 34241 - 11905: 0xDEBB, 34242 - 11905: 0xCB71, 34243 - 11905: 0xCB72, 34244 - 11905: 0xCB73, 34245 - 11905: 0xCB74, 34246 - 11905: 0xCB75, 34247 - 11905: 0xCB76, 34248 - 11905: 0xCB77, 34249 - 11905: 0xBDE5, 34250 - 11905: 0xCB78, 34251 - 11905: 0xCB79, 34252 - 11905: 0xCB7A, 34253 - 11905: 0xCB7B, 34254 - 11905: 0xCB7C, 34255 - 11905: 0xB2D8, 34256 - 11905: 0xC3EA, 34257 - 11905: 0xCB7D, 34258 - 11905: 0xCB7E, 34259 - 11905: 0xDEBA, 34260 - 11905: 0xCB80, 34261 - 11905: 0xC5BA, 34262 - 11905: 0xCB81, 34263 - 11905: 0xCB82, 34264 - 11905: 0xCB83, 34265 - 11905: 0xCB84, 34266 - 11905: 0xCB85, 34267 - 11905: 0xCB86, 34268 - 11905: 0xDEBC, 34269 - 11905: 0xCB87, 34270 - 11905: 0xCB88, 34271 - 11905: 0xCB89, 34272 - 11905: 0xCB8A, 34273 - 11905: 0xCB8B, 34274 - 11905: 0xCB8C, 34275 - 11905: 0xCB8D, 34276 - 11905: 0xCCD9, 34277 - 11905: 0xCB8E, 34278 - 11905: 0xCB8F, 34279 - 11905: 0xCB90, 34280 - 11905: 0xCB91, 34281 - 11905: 0xB7AA, 34282 - 11905: 0xCB92, 34283 - 11905: 0xCB93, 34284 - 11905: 0xCB94, 34285 - 11905: 0xCB95, 34286 - 11905: 0xCB96, 34287 - 11905: 0xCB97, 34288 - 11905: 0xCB98, 34289 - 11905: 0xCB99, 34290 - 11905: 0xCB9A, 34291 - 11905: 0xCB9B, 34292 - 11905: 0xCB9C, 34293 - 11905: 0xCB9D, 34294 - 11905: 0xCB9E, 34295 - 11905: 0xCB9F, 34296 - 11905: 0xCBA0, 34297 - 11905: 0xCC40, 34298 - 11905: 0xCC41, 34299 - 11905: 0xD4E5, 34300 - 11905: 0xCC42, 34301 - 11905: 0xCC43, 34302 - 11905: 0xCC44, 34303 - 11905: 0xDEBD, 34304 - 11905: 0xCC45, 34305 - 11905: 0xCC46, 34306 - 11905: 0xCC47, 34307 - 11905: 0xCC48, 34308 - 11905: 0xCC49, 34309 - 11905: 0xDEBF, 34310 - 11905: 0xCC4A, 34311 - 11905: 0xCC4B, 34312 - 11905: 0xCC4C, 34313 - 11905: 0xCC4D, 34314 - 11905: 0xCC4E, 34315 - 11905: 0xCC4F, 34316 - 11905: 0xCC50, 34317 - 11905: 0xCC51, 34318 - 11905: 0xCC52, 34319 - 11905: 0xCC53, 34320 - 11905: 0xCC54, 34321 - 11905: 0xC4A2, 34322 - 11905: 0xCC55, 34323 - 11905: 0xCC56, 34324 - 11905: 0xCC57, 34325 - 11905: 0xCC58, 34326 - 11905: 0xDEC1, 34327 - 11905: 0xCC59, 34328 - 11905: 0xCC5A, 34329 - 11905: 0xCC5B, 34330 - 11905: 0xCC5C, 34331 - 11905: 0xCC5D, 34332 - 11905: 0xCC5E, 34333 - 11905: 0xCC5F, 34334 - 11905: 0xCC60, 34335 - 11905: 0xCC61, 34336 - 11905: 0xCC62, 34337 - 11905: 0xCC63, 34338 - 11905: 0xCC64, 34339 - 11905: 0xCC65, 34340 - 11905: 0xCC66, 34341 - 11905: 0xCC67, 34342 - 11905: 0xCC68, 34343 - 11905: 0xDEBE, 34344 - 11905: 0xCC69, 34345 - 11905: 0xDEC0, 34346 - 11905: 0xCC6A, 34347 - 11905: 0xCC6B, 34348 - 11905: 0xCC6C, 34349 - 11905: 0xCC6D, 34350 - 11905: 0xCC6E, 34351 - 11905: 0xCC6F, 34352 - 11905: 0xCC70, 34353 - 11905: 0xCC71, 34354 - 11905: 0xCC72, 34355 - 11905: 0xCC73, 34356 - 11905: 0xCC74, 34357 - 11905: 0xCC75, 34358 - 11905: 0xCC76, 34359 - 11905: 0xCC77, 34360 - 11905: 0xD5BA, 34361 - 11905: 0xCC78, 34362 - 11905: 0xCC79, 34363 - 11905: 0xCC7A, 34364 - 11905: 0xDEC2, 34365 - 11905: 0xCC7B, 34366 - 11905: 0xCC7C, 34367 - 11905: 0xCC7D, 34368 - 11905: 0xCC7E, 34369 - 11905: 0xCC80, 34370 - 11905: 0xCC81, 34371 - 11905: 0xCC82, 34372 - 11905: 0xCC83, 34373 - 11905: 0xCC84, 34374 - 11905: 0xCC85, 34375 - 11905: 0xCC86, 34376 - 11905: 0xCC87, 34377 - 11905: 0xCC88, 34378 - 11905: 0xCC89, 34379 - 11905: 0xCC8A, 34380 - 11905: 0xCC8B, 34381 - 11905: 0xF2AE, 34382 - 11905: 0xBBA2, 34383 - 11905: 0xC2B2, 34384 - 11905: 0xC5B0, 34385 - 11905: 0xC2C7, 34386 - 11905: 0xCC8C, 34387 - 11905: 0xCC8D, 34388 - 11905: 0xF2AF, 34389 - 11905: 0xCC8E, 34390 - 11905: 0xCC8F, 34391 - 11905: 0xCC90, 34392 - 11905: 0xCC91, 34393 - 11905: 0xCC92, 34394 - 11905: 0xD0E9, 34395 - 11905: 0xCC93, 34396 - 11905: 0xCC94, 34397 - 11905: 0xCC95, 34398 - 11905: 0xD3DD, 34399 - 11905: 0xCC96, 34400 - 11905: 0xCC97, 34401 - 11905: 0xCC98, 34402 - 11905: 0xEBBD, 34403 - 11905: 0xCC99, 34404 - 11905: 0xCC9A, 34405 - 11905: 0xCC9B, 34406 - 11905: 0xCC9C, 34407 - 11905: 0xCC9D, 34408 - 11905: 0xCC9E, 34409 - 11905: 0xCC9F, 34410 - 11905: 0xCCA0, 34411 - 11905: 0xB3E6, 34412 - 11905: 0xF2B0, 34413 - 11905: 0xCD40, 34414 - 11905: 0xF2B1, 34415 - 11905: 0xCD41, 34416 - 11905: 0xCD42, 34417 - 11905: 0xCAAD, 34418 - 11905: 0xCD43, 34419 - 11905: 0xCD44, 34420 - 11905: 0xCD45, 34421 - 11905: 0xCD46, 34422 - 11905: 0xCD47, 34423 - 11905: 0xCD48, 34424 - 11905: 0xCD49, 34425 - 11905: 0xBAE7, 34426 - 11905: 0xF2B3, 34427 - 11905: 0xF2B5, 34428 - 11905: 0xF2B4, 34429 - 11905: 0xCBE4, 34430 - 11905: 0xCFBA, 34431 - 11905: 0xF2B2, 34432 - 11905: 0xCAB4, 34433 - 11905: 0xD2CF, 34434 - 11905: 0xC2EC, 34435 - 11905: 0xCD4A, 34436 - 11905: 0xCD4B, 34437 - 11905: 0xCD4C, 34438 - 11905: 0xCD4D, 34439 - 11905: 0xCD4E, 34440 - 11905: 0xCD4F, 34441 - 11905: 0xCD50, 34442 - 11905: 0xCEC3, 34443 - 11905: 0xF2B8, 34444 - 11905: 0xB0F6, 34445 - 11905: 0xF2B7, 34446 - 11905: 0xCD51, 34447 - 11905: 0xCD52, 34448 - 11905: 0xCD53, 34449 - 11905: 0xCD54, 34450 - 11905: 0xCD55, 34451 - 11905: 0xF2BE, 34452 - 11905: 0xCD56, 34453 - 11905: 0xB2CF, 34454 - 11905: 0xCD57, 34455 - 11905: 0xCD58, 34456 - 11905: 0xCD59, 34457 - 11905: 0xCD5A, 34458 - 11905: 0xCD5B, 34459 - 11905: 0xCD5C, 34460 - 11905: 0xD1C1, 34461 - 11905: 0xF2BA, 34462 - 11905: 0xCD5D, 34463 - 11905: 0xCD5E, 34464 - 11905: 0xCD5F, 34465 - 11905: 0xCD60, 34466 - 11905: 0xCD61, 34467 - 11905: 0xF2BC, 34468 - 11905: 0xD4E9, 34469 - 11905: 0xCD62, 34470 - 11905: 0xCD63, 34471 - 11905: 0xF2BB, 34472 - 11905: 0xF2B6, 34473 - 11905: 0xF2BF, 34474 - 11905: 0xF2BD, 34475 - 11905: 0xCD64, 34476 - 11905: 0xF2B9, 34477 - 11905: 0xCD65, 34478 - 11905: 0xCD66, 34479 - 11905: 0xF2C7, 34480 - 11905: 0xF2C4, 34481 - 11905: 0xF2C6, 34482 - 11905: 0xCD67, 34483 - 11905: 0xCD68, 34484 - 11905: 0xF2CA, 34485 - 11905: 0xF2C2, 34486 - 11905: 0xF2C0, 34487 - 11905: 0xCD69, 34488 - 11905: 0xCD6A, 34489 - 11905: 0xCD6B, 34490 - 11905: 0xF2C5, 34491 - 11905: 0xCD6C, 34492 - 11905: 0xCD6D, 34493 - 11905: 0xCD6E, 34494 - 11905: 0xCD6F, 34495 - 11905: 0xCD70, 34496 - 11905: 0xD6FB, 34497 - 11905: 0xCD71, 34498 - 11905: 0xCD72, 34499 - 11905: 0xCD73, 34500 - 11905: 0xF2C1, 34501 - 11905: 0xCD74, 34502 - 11905: 0xC7F9, 34503 - 11905: 0xC9DF, 34504 - 11905: 0xCD75, 34505 - 11905: 0xF2C8, 34506 - 11905: 0xB9C6, 34507 - 11905: 0xB5B0, 34508 - 11905: 0xCD76, 34509 - 11905: 0xCD77, 34510 - 11905: 0xF2C3, 34511 - 11905: 0xF2C9, 34512 - 11905: 0xF2D0, 34513 - 11905: 0xF2D6, 34514 - 11905: 0xCD78, 34515 - 11905: 0xCD79, 34516 - 11905: 0xBBD7, 34517 - 11905: 0xCD7A, 34518 - 11905: 0xCD7B, 34519 - 11905: 0xCD7C, 34520 - 11905: 0xF2D5, 34521 - 11905: 0xCDDC, 34522 - 11905: 0xCD7D, 34523 - 11905: 0xD6EB, 34524 - 11905: 0xCD7E, 34525 - 11905: 0xCD80, 34526 - 11905: 0xF2D2, 34527 - 11905: 0xF2D4, 34528 - 11905: 0xCD81, 34529 - 11905: 0xCD82, 34530 - 11905: 0xCD83, 34531 - 11905: 0xCD84, 34532 - 11905: 0xB8F2, 34533 - 11905: 0xCD85, 34534 - 11905: 0xCD86, 34535 - 11905: 0xCD87, 34536 - 11905: 0xCD88, 34537 - 11905: 0xF2CB, 34538 - 11905: 0xCD89, 34539 - 11905: 0xCD8A, 34540 - 11905: 0xCD8B, 34541 - 11905: 0xF2CE, 34542 - 11905: 0xC2F9, 34543 - 11905: 0xCD8C, 34544 - 11905: 0xD5DD, 34545 - 11905: 0xF2CC, 34546 - 11905: 0xF2CD, 34547 - 11905: 0xF2CF, 34548 - 11905: 0xF2D3, 34549 - 11905: 0xCD8D, 34550 - 11905: 0xCD8E, 34551 - 11905: 0xCD8F, 34552 - 11905: 0xF2D9, 34553 - 11905: 0xD3BC, 34554 - 11905: 0xCD90, 34555 - 11905: 0xCD91, 34556 - 11905: 0xCD92, 34557 - 11905: 0xCD93, 34558 - 11905: 0xB6EA, 34559 - 11905: 0xCD94, 34560 - 11905: 0xCAF1, 34561 - 11905: 0xCD95, 34562 - 11905: 0xB7E4, 34563 - 11905: 0xF2D7, 34564 - 11905: 0xCD96, 34565 - 11905: 0xCD97, 34566 - 11905: 0xCD98, 34567 - 11905: 0xF2D8, 34568 - 11905: 0xF2DA, 34569 - 11905: 0xF2DD, 34570 - 11905: 0xF2DB, 34571 - 11905: 0xCD99, 34572 - 11905: 0xCD9A, 34573 - 11905: 0xF2DC, 34574 - 11905: 0xCD9B, 34575 - 11905: 0xCD9C, 34576 - 11905: 0xCD9D, 34577 - 11905: 0xCD9E, 34578 - 11905: 0xD1D1, 34579 - 11905: 0xF2D1, 34580 - 11905: 0xCD9F, 34581 - 11905: 0xCDC9, 34582 - 11905: 0xCDA0, 34583 - 11905: 0xCECF, 34584 - 11905: 0xD6A9, 34585 - 11905: 0xCE40, 34586 - 11905: 0xF2E3, 34587 - 11905: 0xCE41, 34588 - 11905: 0xC3DB, 34589 - 11905: 0xCE42, 34590 - 11905: 0xF2E0, 34591 - 11905: 0xCE43, 34592 - 11905: 0xCE44, 34593 - 11905: 0xC0AF, 34594 - 11905: 0xF2EC, 34595 - 11905: 0xF2DE, 34596 - 11905: 0xCE45, 34597 - 11905: 0xF2E1, 34598 - 11905: 0xCE46, 34599 - 11905: 0xCE47, 34600 - 11905: 0xCE48, 34601 - 11905: 0xF2E8, 34602 - 11905: 0xCE49, 34603 - 11905: 0xCE4A, 34604 - 11905: 0xCE4B, 34605 - 11905: 0xCE4C, 34606 - 11905: 0xF2E2, 34607 - 11905: 0xCE4D, 34608 - 11905: 0xCE4E, 34609 - 11905: 0xF2E7, 34610 - 11905: 0xCE4F, 34611 - 11905: 0xCE50, 34612 - 11905: 0xF2E6, 34613 - 11905: 0xCE51, 34614 - 11905: 0xCE52, 34615 - 11905: 0xF2E9, 34616 - 11905: 0xCE53, 34617 - 11905: 0xCE54, 34618 - 11905: 0xCE55, 34619 - 11905: 0xF2DF, 34620 - 11905: 0xCE56, 34621 - 11905: 0xCE57, 34622 - 11905: 0xF2E4, 34623 - 11905: 0xF2EA, 34624 - 11905: 0xCE58, 34625 - 11905: 0xCE59, 34626 - 11905: 0xCE5A, 34627 - 11905: 0xCE5B, 34628 - 11905: 0xCE5C, 34629 - 11905: 0xCE5D, 34630 - 11905: 0xCE5E, 34631 - 11905: 0xD3AC, 34632 - 11905: 0xF2E5, 34633 - 11905: 0xB2F5, 34634 - 11905: 0xCE5F, 34635 - 11905: 0xCE60, 34636 - 11905: 0xF2F2, 34637 - 11905: 0xCE61, 34638 - 11905: 0xD0AB, 34639 - 11905: 0xCE62, 34640 - 11905: 0xCE63, 34641 - 11905: 0xCE64, 34642 - 11905: 0xCE65, 34643 - 11905: 0xF2F5, 34644 - 11905: 0xCE66, 34645 - 11905: 0xCE67, 34646 - 11905: 0xCE68, 34647 - 11905: 0xBBC8, 34648 - 11905: 0xCE69, 34649 - 11905: 0xF2F9, 34650 - 11905: 0xCE6A, 34651 - 11905: 0xCE6B, 34652 - 11905: 0xCE6C, 34653 - 11905: 0xCE6D, 34654 - 11905: 0xCE6E, 34655 - 11905: 0xCE6F, 34656 - 11905: 0xF2F0, 34657 - 11905: 0xCE70, 34658 - 11905: 0xCE71, 34659 - 11905: 0xF2F6, 34660 - 11905: 0xF2F8, 34661 - 11905: 0xF2FA, 34662 - 11905: 0xCE72, 34663 - 11905: 0xCE73, 34664 - 11905: 0xCE74, 34665 - 11905: 0xCE75, 34666 - 11905: 0xCE76, 34667 - 11905: 0xCE77, 34668 - 11905: 0xCE78, 34669 - 11905: 0xCE79, 34670 - 11905: 0xF2F3, 34671 - 11905: 0xCE7A, 34672 - 11905: 0xF2F1, 34673 - 11905: 0xCE7B, 34674 - 11905: 0xCE7C, 34675 - 11905: 0xCE7D, 34676 - 11905: 0xBAFB, 34677 - 11905: 0xCE7E, 34678 - 11905: 0xB5FB, 34679 - 11905: 0xCE80, 34680 - 11905: 0xCE81, 34681 - 11905: 0xCE82, 34682 - 11905: 0xCE83, 34683 - 11905: 0xF2EF, 34684 - 11905: 0xF2F7, 34685 - 11905: 0xF2ED, 34686 - 11905: 0xF2EE, 34687 - 11905: 0xCE84, 34688 - 11905: 0xCE85, 34689 - 11905: 0xCE86, 34690 - 11905: 0xF2EB, 34691 - 11905: 0xF3A6, 34692 - 11905: 0xCE87, 34693 - 11905: 0xF3A3, 34694 - 11905: 0xCE88, 34695 - 11905: 0xCE89, 34696 - 11905: 0xF3A2, 34697 - 11905: 0xCE8A, 34698 - 11905: 0xCE8B, 34699 - 11905: 0xF2F4, 34700 - 11905: 0xCE8C, 34701 - 11905: 0xC8DA, 34702 - 11905: 0xCE8D, 34703 - 11905: 0xCE8E, 34704 - 11905: 0xCE8F, 34705 - 11905: 0xCE90, 34706 - 11905: 0xCE91, 34707 - 11905: 0xF2FB, 34708 - 11905: 0xCE92, 34709 - 11905: 0xCE93, 34710 - 11905: 0xCE94, 34711 - 11905: 0xF3A5, 34712 - 11905: 0xCE95, 34713 - 11905: 0xCE96, 34714 - 11905: 0xCE97, 34715 - 11905: 0xCE98, 34716 - 11905: 0xCE99, 34717 - 11905: 0xCE9A, 34718 - 11905: 0xCE9B, 34719 - 11905: 0xC3F8, 34720 - 11905: 0xCE9C, 34721 - 11905: 0xCE9D, 34722 - 11905: 0xCE9E, 34723 - 11905: 0xCE9F, 34724 - 11905: 0xCEA0, 34725 - 11905: 0xCF40, 34726 - 11905: 0xCF41, 34727 - 11905: 0xCF42, 34728 - 11905: 0xF2FD, 34729 - 11905: 0xCF43, 34730 - 11905: 0xCF44, 34731 - 11905: 0xF3A7, 34732 - 11905: 0xF3A9, 34733 - 11905: 0xF3A4, 34734 - 11905: 0xCF45, 34735 - 11905: 0xF2FC, 34736 - 11905: 0xCF46, 34737 - 11905: 0xCF47, 34738 - 11905: 0xCF48, 34739 - 11905: 0xF3AB, 34740 - 11905: 0xCF49, 34741 - 11905: 0xF3AA, 34742 - 11905: 0xCF4A, 34743 - 11905: 0xCF4B, 34744 - 11905: 0xCF4C, 34745 - 11905: 0xCF4D, 34746 - 11905: 0xC2DD, 34747 - 11905: 0xCF4E, 34748 - 11905: 0xCF4F, 34749 - 11905: 0xF3AE, 34750 - 11905: 0xCF50, 34751 - 11905: 0xCF51, 34752 - 11905: 0xF3B0, 34753 - 11905: 0xCF52, 34754 - 11905: 0xCF53, 34755 - 11905: 0xCF54, 34756 - 11905: 0xCF55, 34757 - 11905: 0xCF56, 34758 - 11905: 0xF3A1, 34759 - 11905: 0xCF57, 34760 - 11905: 0xCF58, 34761 - 11905: 0xCF59, 34762 - 11905: 0xF3B1, 34763 - 11905: 0xF3AC, 34764 - 11905: 0xCF5A, 34765 - 11905: 0xCF5B, 34766 - 11905: 0xCF5C, 34767 - 11905: 0xCF5D, 34768 - 11905: 0xCF5E, 34769 - 11905: 0xF3AF, 34770 - 11905: 0xF2FE, 34771 - 11905: 0xF3AD, 34772 - 11905: 0xCF5F, 34773 - 11905: 0xCF60, 34774 - 11905: 0xCF61, 34775 - 11905: 0xCF62, 34776 - 11905: 0xCF63, 34777 - 11905: 0xCF64, 34778 - 11905: 0xCF65, 34779 - 11905: 0xF3B2, 34780 - 11905: 0xCF66, 34781 - 11905: 0xCF67, 34782 - 11905: 0xCF68, 34783 - 11905: 0xCF69, 34784 - 11905: 0xF3B4, 34785 - 11905: 0xCF6A, 34786 - 11905: 0xCF6B, 34787 - 11905: 0xCF6C, 34788 - 11905: 0xCF6D, 34789 - 11905: 0xF3A8, 34790 - 11905: 0xCF6E, 34791 - 11905: 0xCF6F, 34792 - 11905: 0xCF70, 34793 - 11905: 0xCF71, 34794 - 11905: 0xF3B3, 34795 - 11905: 0xCF72, 34796 - 11905: 0xCF73, 34797 - 11905: 0xCF74, 34798 - 11905: 0xF3B5, 34799 - 11905: 0xCF75, 34800 - 11905: 0xCF76, 34801 - 11905: 0xCF77, 34802 - 11905: 0xCF78, 34803 - 11905: 0xCF79, 34804 - 11905: 0xCF7A, 34805 - 11905: 0xCF7B, 34806 - 11905: 0xCF7C, 34807 - 11905: 0xCF7D, 34808 - 11905: 0xCF7E, 34809 - 11905: 0xD0B7, 34810 - 11905: 0xCF80, 34811 - 11905: 0xCF81, 34812 - 11905: 0xCF82, 34813 - 11905: 0xCF83, 34814 - 11905: 0xF3B8, 34815 - 11905: 0xCF84, 34816 - 11905: 0xCF85, 34817 - 11905: 0xCF86, 34818 - 11905: 0xCF87, 34819 - 11905: 0xD9F9, 34820 - 11905: 0xCF88, 34821 - 11905: 0xCF89, 34822 - 11905: 0xCF8A, 34823 - 11905: 0xCF8B, 34824 - 11905: 0xCF8C, 34825 - 11905: 0xCF8D, 34826 - 11905: 0xF3B9, 34827 - 11905: 0xCF8E, 34828 - 11905: 0xCF8F, 34829 - 11905: 0xCF90, 34830 - 11905: 0xCF91, 34831 - 11905: 0xCF92, 34832 - 11905: 0xCF93, 34833 - 11905: 0xCF94, 34834 - 11905: 0xCF95, 34835 - 11905: 0xF3B7, 34836 - 11905: 0xCF96, 34837 - 11905: 0xC8E4, 34838 - 11905: 0xF3B6, 34839 - 11905: 0xCF97, 34840 - 11905: 0xCF98, 34841 - 11905: 0xCF99, 34842 - 11905: 0xCF9A, 34843 - 11905: 0xF3BA, 34844 - 11905: 0xCF9B, 34845 - 11905: 0xCF9C, 34846 - 11905: 0xCF9D, 34847 - 11905: 0xCF9E, 34848 - 11905: 0xCF9F, 34849 - 11905: 0xF3BB, 34850 - 11905: 0xB4C0, 34851 - 11905: 0xCFA0, 34852 - 11905: 0xD040, 34853 - 11905: 0xD041, 34854 - 11905: 0xD042, 34855 - 11905: 0xD043, 34856 - 11905: 0xD044, 34857 - 11905: 0xD045, 34858 - 11905: 0xD046, 34859 - 11905: 0xD047, 34860 - 11905: 0xD048, 34861 - 11905: 0xD049, 34862 - 11905: 0xD04A, 34863 - 11905: 0xD04B, 34864 - 11905: 0xD04C, 34865 - 11905: 0xD04D, 34866 - 11905: 0xEEC3, 34867 - 11905: 0xD04E, 34868 - 11905: 0xD04F, 34869 - 11905: 0xD050, 34870 - 11905: 0xD051, 34871 - 11905: 0xD052, 34872 - 11905: 0xD053, 34873 - 11905: 0xF3BC, 34874 - 11905: 0xD054, 34875 - 11905: 0xD055, 34876 - 11905: 0xF3BD, 34877 - 11905: 0xD056, 34878 - 11905: 0xD057, 34879 - 11905: 0xD058, 34880 - 11905: 0xD1AA, 34881 - 11905: 0xD059, 34882 - 11905: 0xD05A, 34883 - 11905: 0xD05B, 34884 - 11905: 0xF4AC, 34885 - 11905: 0xD0C6, 34886 - 11905: 0xD05C, 34887 - 11905: 0xD05D, 34888 - 11905: 0xD05E, 34889 - 11905: 0xD05F, 34890 - 11905: 0xD060, 34891 - 11905: 0xD061, 34892 - 11905: 0xD0D0, 34893 - 11905: 0xD1DC, 34894 - 11905: 0xD062, 34895 - 11905: 0xD063, 34896 - 11905: 0xD064, 34897 - 11905: 0xD065, 34898 - 11905: 0xD066, 34899 - 11905: 0xD067, 34900 - 11905: 0xCFCE, 34901 - 11905: 0xD068, 34902 - 11905: 0xD069, 34903 - 11905: 0xBDD6, 34904 - 11905: 0xD06A, 34905 - 11905: 0xD1C3, 34906 - 11905: 0xD06B, 34907 - 11905: 0xD06C, 34908 - 11905: 0xD06D, 34909 - 11905: 0xD06E, 34910 - 11905: 0xD06F, 34911 - 11905: 0xD070, 34912 - 11905: 0xD071, 34913 - 11905: 0xBAE2, 34914 - 11905: 0xE1E9, 34915 - 11905: 0xD2C2, 34916 - 11905: 0xF1C2, 34917 - 11905: 0xB2B9, 34918 - 11905: 0xD072, 34919 - 11905: 0xD073, 34920 - 11905: 0xB1ED, 34921 - 11905: 0xF1C3, 34922 - 11905: 0xD074, 34923 - 11905: 0xC9C0, 34924 - 11905: 0xB3C4, 34925 - 11905: 0xD075, 34926 - 11905: 0xD9F2, 34927 - 11905: 0xD076, 34928 - 11905: 0xCBA5, 34929 - 11905: 0xD077, 34930 - 11905: 0xF1C4, 34931 - 11905: 0xD078, 34932 - 11905: 0xD079, 34933 - 11905: 0xD07A, 34934 - 11905: 0xD07B, 34935 - 11905: 0xD6D4, 34936 - 11905: 0xD07C, 34937 - 11905: 0xD07D, 34938 - 11905: 0xD07E, 34939 - 11905: 0xD080, 34940 - 11905: 0xD081, 34941 - 11905: 0xF1C5, 34942 - 11905: 0xF4C0, 34943 - 11905: 0xF1C6, 34944 - 11905: 0xD082, 34945 - 11905: 0xD4AC, 34946 - 11905: 0xF1C7, 34947 - 11905: 0xD083, 34948 - 11905: 0xB0C0, 34949 - 11905: 0xF4C1, 34950 - 11905: 0xD084, 34951 - 11905: 0xD085, 34952 - 11905: 0xF4C2, 34953 - 11905: 0xD086, 34954 - 11905: 0xD087, 34955 - 11905: 0xB4FC, 34956 - 11905: 0xD088, 34957 - 11905: 0xC5DB, 34958 - 11905: 0xD089, 34959 - 11905: 0xD08A, 34960 - 11905: 0xD08B, 34961 - 11905: 0xD08C, 34962 - 11905: 0xCCBB, 34963 - 11905: 0xD08D, 34964 - 11905: 0xD08E, 34965 - 11905: 0xD08F, 34966 - 11905: 0xD0E4, 34967 - 11905: 0xD090, 34968 - 11905: 0xD091, 34969 - 11905: 0xD092, 34970 - 11905: 0xD093, 34971 - 11905: 0xD094, 34972 - 11905: 0xCDE0, 34973 - 11905: 0xD095, 34974 - 11905: 0xD096, 34975 - 11905: 0xD097, 34976 - 11905: 0xD098, 34977 - 11905: 0xD099, 34978 - 11905: 0xF1C8, 34979 - 11905: 0xD09A, 34980 - 11905: 0xD9F3, 34981 - 11905: 0xD09B, 34982 - 11905: 0xD09C, 34983 - 11905: 0xD09D, 34984 - 11905: 0xD09E, 34985 - 11905: 0xD09F, 34986 - 11905: 0xD0A0, 34987 - 11905: 0xB1BB, 34988 - 11905: 0xD140, 34989 - 11905: 0xCFAE, 34990 - 11905: 0xD141, 34991 - 11905: 0xD142, 34992 - 11905: 0xD143, 34993 - 11905: 0xB8A4, 34994 - 11905: 0xD144, 34995 - 11905: 0xD145, 34996 - 11905: 0xD146, 34997 - 11905: 0xD147, 34998 - 11905: 0xD148, 34999 - 11905: 0xF1CA, 35000 - 11905: 0xD149, 35001 - 11905: 0xD14A, 35002 - 11905: 0xD14B, 35003 - 11905: 0xD14C, 35004 - 11905: 0xF1CB, 35005 - 11905: 0xD14D, 35006 - 11905: 0xD14E, 35007 - 11905: 0xD14F, 35008 - 11905: 0xD150, 35009 - 11905: 0xB2C3, 35010 - 11905: 0xC1D1, 35011 - 11905: 0xD151, 35012 - 11905: 0xD152, 35013 - 11905: 0xD7B0, 35014 - 11905: 0xF1C9, 35015 - 11905: 0xD153, 35016 - 11905: 0xD154, 35017 - 11905: 0xF1CC, 35018 - 11905: 0xD155, 35019 - 11905: 0xD156, 35020 - 11905: 0xD157, 35021 - 11905: 0xD158, 35022 - 11905: 0xF1CE, 35023 - 11905: 0xD159, 35024 - 11905: 0xD15A, 35025 - 11905: 0xD15B, 35026 - 11905: 0xD9F6, 35027 - 11905: 0xD15C, 35028 - 11905: 0xD2E1, 35029 - 11905: 0xD4A3, 35030 - 11905: 0xD15D, 35031 - 11905: 0xD15E, 35032 - 11905: 0xF4C3, 35033 - 11905: 0xC8B9, 35034 - 11905: 0xD15F, 35035 - 11905: 0xD160, 35036 - 11905: 0xD161, 35037 - 11905: 0xD162, 35038 - 11905: 0xD163, 35039 - 11905: 0xF4C4, 35040 - 11905: 0xD164, 35041 - 11905: 0xD165, 35042 - 11905: 0xF1CD, 35043 - 11905: 0xF1CF, 35044 - 11905: 0xBFE3, 35045 - 11905: 0xF1D0, 35046 - 11905: 0xD166, 35047 - 11905: 0xD167, 35048 - 11905: 0xF1D4, 35049 - 11905: 0xD168, 35050 - 11905: 0xD169, 35051 - 11905: 0xD16A, 35052 - 11905: 0xD16B, 35053 - 11905: 0xD16C, 35054 - 11905: 0xD16D, 35055 - 11905: 0xD16E, 35056 - 11905: 0xF1D6, 35057 - 11905: 0xF1D1, 35058 - 11905: 0xD16F, 35059 - 11905: 0xC9D1, 35060 - 11905: 0xC5E1, 35061 - 11905: 0xD170, 35062 - 11905: 0xD171, 35063 - 11905: 0xD172, 35064 - 11905: 0xC2E3, 35065 - 11905: 0xB9FC, 35066 - 11905: 0xD173, 35067 - 11905: 0xD174, 35068 - 11905: 0xF1D3, 35069 - 11905: 0xD175, 35070 - 11905: 0xF1D5, 35071 - 11905: 0xD176, 35072 - 11905: 0xD177, 35073 - 11905: 0xD178, 35074 - 11905: 0xB9D3, 35075 - 11905: 0xD179, 35076 - 11905: 0xD17A, 35077 - 11905: 0xD17B, 35078 - 11905: 0xD17C, 35079 - 11905: 0xD17D, 35080 - 11905: 0xD17E, 35081 - 11905: 0xD180, 35082 - 11905: 0xF1DB, 35083 - 11905: 0xD181, 35084 - 11905: 0xD182, 35085 - 11905: 0xD183, 35086 - 11905: 0xD184, 35087 - 11905: 0xD185, 35088 - 11905: 0xBAD6, 35089 - 11905: 0xD186, 35090 - 11905: 0xB0FD, 35091 - 11905: 0xF1D9, 35092 - 11905: 0xD187, 35093 - 11905: 0xD188, 35094 - 11905: 0xD189, 35095 - 11905: 0xD18A, 35096 - 11905: 0xD18B, 35097 - 11905: 0xF1D8, 35098 - 11905: 0xF1D2, 35099 - 11905: 0xF1DA, 35100 - 11905: 0xD18C, 35101 - 11905: 0xD18D, 35102 - 11905: 0xD18E, 35103 - 11905: 0xD18F, 35104 - 11905: 0xD190, 35105 - 11905: 0xF1D7, 35106 - 11905: 0xD191, 35107 - 11905: 0xD192, 35108 - 11905: 0xD193, 35109 - 11905: 0xC8EC, 35110 - 11905: 0xD194, 35111 - 11905: 0xD195, 35112 - 11905: 0xD196, 35113 - 11905: 0xD197, 35114 - 11905: 0xCDCA, 35115 - 11905: 0xF1DD, 35116 - 11905: 0xD198, 35117 - 11905: 0xD199, 35118 - 11905: 0xD19A, 35119 - 11905: 0xD19B, 35120 - 11905: 0xE5BD, 35121 - 11905: 0xD19C, 35122 - 11905: 0xD19D, 35123 - 11905: 0xD19E, 35124 - 11905: 0xF1DC, 35125 - 11905: 0xD19F, 35126 - 11905: 0xF1DE, 35127 - 11905: 0xD1A0, 35128 - 11905: 0xD240, 35129 - 11905: 0xD241, 35130 - 11905: 0xD242, 35131 - 11905: 0xD243, 35132 - 11905: 0xD244, 35133 - 11905: 0xD245, 35134 - 11905: 0xD246, 35135 - 11905: 0xD247, 35136 - 11905: 0xD248, 35137 - 11905: 0xF1DF, 35138 - 11905: 0xD249, 35139 - 11905: 0xD24A, 35140 - 11905: 0xCFE5, 35141 - 11905: 0xD24B, 35142 - 11905: 0xD24C, 35143 - 11905: 0xD24D, 35144 - 11905: 0xD24E, 35145 - 11905: 0xD24F, 35146 - 11905: 0xD250, 35147 - 11905: 0xD251, 35148 - 11905: 0xD252, 35149 - 11905: 0xD253, 35150 - 11905: 0xD254, 35151 - 11905: 0xD255, 35152 - 11905: 0xD256, 35153 - 11905: 0xD257, 35154 - 11905: 0xD258, 35155 - 11905: 0xD259, 35156 - 11905: 0xD25A, 35157 - 11905: 0xD25B, 35158 - 11905: 0xD25C, 35159 - 11905: 0xD25D, 35160 - 11905: 0xD25E, 35161 - 11905: 0xD25F, 35162 - 11905: 0xD260, 35163 - 11905: 0xD261, 35164 - 11905: 0xD262, 35165 - 11905: 0xD263, 35166 - 11905: 0xF4C5, 35167 - 11905: 0xBDF3, 35168 - 11905: 0xD264, 35169 - 11905: 0xD265, 35170 - 11905: 0xD266, 35171 - 11905: 0xD267, 35172 - 11905: 0xD268, 35173 - 11905: 0xD269, 35174 - 11905: 0xF1E0, 35175 - 11905: 0xD26A, 35176 - 11905: 0xD26B, 35177 - 11905: 0xD26C, 35178 - 11905: 0xD26D, 35179 - 11905: 0xD26E, 35180 - 11905: 0xD26F, 35181 - 11905: 0xD270, 35182 - 11905: 0xD271, 35183 - 11905: 0xD272, 35184 - 11905: 0xD273, 35185 - 11905: 0xD274, 35186 - 11905: 0xD275, 35187 - 11905: 0xD276, 35188 - 11905: 0xD277, 35189 - 11905: 0xD278, 35190 - 11905: 0xD279, 35191 - 11905: 0xD27A, 35192 - 11905: 0xD27B, 35193 - 11905: 0xD27C, 35194 - 11905: 0xD27D, 35195 - 11905: 0xF1E1, 35196 - 11905: 0xD27E, 35197 - 11905: 0xD280, 35198 - 11905: 0xD281, 35199 - 11905: 0xCEF7, 35200 - 11905: 0xD282, 35201 - 11905: 0xD2AA, 35202 - 11905: 0xD283, 35203 - 11905: 0xF1FB, 35204 - 11905: 0xD284, 35205 - 11905: 0xD285, 35206 - 11905: 0xB8B2, 35207 - 11905: 0xD286, 35208 - 11905: 0xD287, 35209 - 11905: 0xD288, 35210 - 11905: 0xD289, 35211 - 11905: 0xD28A, 35212 - 11905: 0xD28B, 35213 - 11905: 0xD28C, 35214 - 11905: 0xD28D, 35215 - 11905: 0xD28E, 35216 - 11905: 0xD28F, 35217 - 11905: 0xD290, 35218 - 11905: 0xD291, 35219 - 11905: 0xD292, 35220 - 11905: 0xD293, 35221 - 11905: 0xD294, 35222 - 11905: 0xD295, 35223 - 11905: 0xD296, 35224 - 11905: 0xD297, 35225 - 11905: 0xD298, 35226 - 11905: 0xD299, 35227 - 11905: 0xD29A, 35228 - 11905: 0xD29B, 35229 - 11905: 0xD29C, 35230 - 11905: 0xD29D, 35231 - 11905: 0xD29E, 35232 - 11905: 0xD29F, 35233 - 11905: 0xD2A0, 35234 - 11905: 0xD340, 35235 - 11905: 0xD341, 35236 - 11905: 0xD342, 35237 - 11905: 0xD343, 35238 - 11905: 0xD344, 35239 - 11905: 0xD345, 35240 - 11905: 0xD346, 35241 - 11905: 0xD347, 35242 - 11905: 0xD348, 35243 - 11905: 0xD349, 35244 - 11905: 0xD34A, 35245 - 11905: 0xD34B, 35246 - 11905: 0xD34C, 35247 - 11905: 0xD34D, 35248 - 11905: 0xD34E, 35249 - 11905: 0xD34F, 35250 - 11905: 0xD350, 35251 - 11905: 0xD351, 35252 - 11905: 0xD352, 35253 - 11905: 0xD353, 35254 - 11905: 0xD354, 35255 - 11905: 0xD355, 35256 - 11905: 0xD356, 35257 - 11905: 0xD357, 35258 - 11905: 0xD358, 35259 - 11905: 0xD359, 35260 - 11905: 0xD35A, 35261 - 11905: 0xD35B, 35262 - 11905: 0xD35C, 35263 - 11905: 0xD35D, 35264 - 11905: 0xD35E, 35265 - 11905: 0xBCFB, 35266 - 11905: 0xB9DB, 35267 - 11905: 0xD35F, 35268 - 11905: 0xB9E6, 35269 - 11905: 0xC3D9, 35270 - 11905: 0xCAD3, 35271 - 11905: 0xEAE8, 35272 - 11905: 0xC0C0, 35273 - 11905: 0xBEF5, 35274 - 11905: 0xEAE9, 35275 - 11905: 0xEAEA, 35276 - 11905: 0xEAEB, 35277 - 11905: 0xD360, 35278 - 11905: 0xEAEC, 35279 - 11905: 0xEAED, 35280 - 11905: 0xEAEE, 35281 - 11905: 0xEAEF, 35282 - 11905: 0xBDC7, 35283 - 11905: 0xD361, 35284 - 11905: 0xD362, 35285 - 11905: 0xD363, 35286 - 11905: 0xF5FB, 35287 - 11905: 0xD364, 35288 - 11905: 0xD365, 35289 - 11905: 0xD366, 35290 - 11905: 0xF5FD, 35291 - 11905: 0xD367, 35292 - 11905: 0xF5FE, 35293 - 11905: 0xD368, 35294 - 11905: 0xF5FC, 35295 - 11905: 0xD369, 35296 - 11905: 0xD36A, 35297 - 11905: 0xD36B, 35298 - 11905: 0xD36C, 35299 - 11905: 0xBDE2, 35300 - 11905: 0xD36D, 35301 - 11905: 0xF6A1, 35302 - 11905: 0xB4A5, 35303 - 11905: 0xD36E, 35304 - 11905: 0xD36F, 35305 - 11905: 0xD370, 35306 - 11905: 0xD371, 35307 - 11905: 0xF6A2, 35308 - 11905: 0xD372, 35309 - 11905: 0xD373, 35310 - 11905: 0xD374, 35311 - 11905: 0xF6A3, 35312 - 11905: 0xD375, 35313 - 11905: 0xD376, 35314 - 11905: 0xD377, 35315 - 11905: 0xECB2, 35316 - 11905: 0xD378, 35317 - 11905: 0xD379, 35318 - 11905: 0xD37A, 35319 - 11905: 0xD37B, 35320 - 11905: 0xD37C, 35321 - 11905: 0xD37D, 35322 - 11905: 0xD37E, 35323 - 11905: 0xD380, 35324 - 11905: 0xD381, 35325 - 11905: 0xD382, 35326 - 11905: 0xD383, 35327 - 11905: 0xD384, 35328 - 11905: 0xD1D4, 35329 - 11905: 0xD385, 35330 - 11905: 0xD386, 35331 - 11905: 0xD387, 35332 - 11905: 0xD388, 35333 - 11905: 0xD389, 35334 - 11905: 0xD38A, 35335 - 11905: 0xD9EA, 35336 - 11905: 0xD38B, 35337 - 11905: 0xD38C, 35338 - 11905: 0xD38D, 35339 - 11905: 0xD38E, 35340 - 11905: 0xD38F, 35341 - 11905: 0xD390, 35342 - 11905: 0xD391, 35343 - 11905: 0xD392, 35344 - 11905: 0xD393, 35345 - 11905: 0xD394, 35346 - 11905: 0xD395, 35347 - 11905: 0xD396, 35348 - 11905: 0xD397, 35349 - 11905: 0xD398, 35350 - 11905: 0xD399, 35351 - 11905: 0xD39A, 35352 - 11905: 0xD39B, 35353 - 11905: 0xD39C, 35354 - 11905: 0xD39D, 35355 - 11905: 0xD39E, 35356 - 11905: 0xD39F, 35357 - 11905: 0xD3A0, 35358 - 11905: 0xD440, 35359 - 11905: 0xD441, 35360 - 11905: 0xD442, 35361 - 11905: 0xD443, 35362 - 11905: 0xD444, 35363 - 11905: 0xD445, 35364 - 11905: 0xD446, 35365 - 11905: 0xD447, 35366 - 11905: 0xD448, 35367 - 11905: 0xD449, 35368 - 11905: 0xD44A, 35369 - 11905: 0xD44B, 35370 - 11905: 0xD44C, 35371 - 11905: 0xD44D, 35372 - 11905: 0xD44E, 35373 - 11905: 0xD44F, 35374 - 11905: 0xD450, 35375 - 11905: 0xD451, 35376 - 11905: 0xD452, 35377 - 11905: 0xD453, 35378 - 11905: 0xD454, 35379 - 11905: 0xD455, 35380 - 11905: 0xD456, 35381 - 11905: 0xD457, 35382 - 11905: 0xD458, 35383 - 11905: 0xD459, 35384 - 11905: 0xD45A, 35385 - 11905: 0xD45B, 35386 - 11905: 0xD45C, 35387 - 11905: 0xD45D, 35388 - 11905: 0xD45E, 35389 - 11905: 0xD45F, 35390 - 11905: 0xF6A4, 35391 - 11905: 0xD460, 35392 - 11905: 0xD461, 35393 - 11905: 0xD462, 35394 - 11905: 0xD463, 35395 - 11905: 0xD464, 35396 - 11905: 0xD465, 35397 - 11905: 0xD466, 35398 - 11905: 0xD467, 35399 - 11905: 0xD468, 35400 - 11905: 0xEEBA, 35401 - 11905: 0xD469, 35402 - 11905: 0xD46A, 35403 - 11905: 0xD46B, 35404 - 11905: 0xD46C, 35405 - 11905: 0xD46D, 35406 - 11905: 0xD46E, 35407 - 11905: 0xD46F, 35408 - 11905: 0xD470, 35409 - 11905: 0xD471, 35410 - 11905: 0xD472, 35411 - 11905: 0xD473, 35412 - 11905: 0xD474, 35413 - 11905: 0xD475, 35414 - 11905: 0xD476, 35415 - 11905: 0xD477, 35416 - 11905: 0xD478, 35417 - 11905: 0xD479, 35418 - 11905: 0xD47A, 35419 - 11905: 0xD47B, 35420 - 11905: 0xD47C, 35421 - 11905: 0xD47D, 35422 - 11905: 0xD47E, 35423 - 11905: 0xD480, 35424 - 11905: 0xD481, 35425 - 11905: 0xD482, 35426 - 11905: 0xD483, 35427 - 11905: 0xD484, 35428 - 11905: 0xD485, 35429 - 11905: 0xD486, 35430 - 11905: 0xD487, 35431 - 11905: 0xD488, 35432 - 11905: 0xD489, 35433 - 11905: 0xD48A, 35434 - 11905: 0xD48B, 35435 - 11905: 0xD48C, 35436 - 11905: 0xD48D, 35437 - 11905: 0xD48E, 35438 - 11905: 0xD48F, 35439 - 11905: 0xD490, 35440 - 11905: 0xD491, 35441 - 11905: 0xD492, 35442 - 11905: 0xD493, 35443 - 11905: 0xD494, 35444 - 11905: 0xD495, 35445 - 11905: 0xD496, 35446 - 11905: 0xD497, 35447 - 11905: 0xD498, 35448 - 11905: 0xD499, 35449 - 11905: 0xD5B2, 35450 - 11905: 0xD49A, 35451 - 11905: 0xD49B, 35452 - 11905: 0xD49C, 35453 - 11905: 0xD49D, 35454 - 11905: 0xD49E, 35455 - 11905: 0xD49F, 35456 - 11905: 0xD4A0, 35457 - 11905: 0xD540, 35458 - 11905: 0xD541, 35459 - 11905: 0xD542, 35460 - 11905: 0xD543, 35461 - 11905: 0xD544, 35462 - 11905: 0xD545, 35463 - 11905: 0xD546, 35464 - 11905: 0xD547, 35465 - 11905: 0xD3FE, 35466 - 11905: 0xCCDC, 35467 - 11905: 0xD548, 35468 - 11905: 0xD549, 35469 - 11905: 0xD54A, 35470 - 11905: 0xD54B, 35471 - 11905: 0xD54C, 35472 - 11905: 0xD54D, 35473 - 11905: 0xD54E, 35474 - 11905: 0xD54F, 35475 - 11905: 0xCAC4, 35476 - 11905: 0xD550, 35477 - 11905: 0xD551, 35478 - 11905: 0xD552, 35479 - 11905: 0xD553, 35480 - 11905: 0xD554, 35481 - 11905: 0xD555, 35482 - 11905: 0xD556, 35483 - 11905: 0xD557, 35484 - 11905: 0xD558, 35485 - 11905: 0xD559, 35486 - 11905: 0xD55A, 35487 - 11905: 0xD55B, 35488 - 11905: 0xD55C, 35489 - 11905: 0xD55D, 35490 - 11905: 0xD55E, 35491 - 11905: 0xD55F, 35492 - 11905: 0xD560, 35493 - 11905: 0xD561, 35494 - 11905: 0xD562, 35495 - 11905: 0xD563, 35496 - 11905: 0xD564, 35497 - 11905: 0xD565, 35498 - 11905: 0xD566, 35499 - 11905: 0xD567, 35500 - 11905: 0xD568, 35501 - 11905: 0xD569, 35502 - 11905: 0xD56A, 35503 - 11905: 0xD56B, 35504 - 11905: 0xD56C, 35505 - 11905: 0xD56D, 35506 - 11905: 0xD56E, 35507 - 11905: 0xD56F, 35508 - 11905: 0xD570, 35509 - 11905: 0xD571, 35510 - 11905: 0xD572, 35511 - 11905: 0xD573, 35512 - 11905: 0xD574, 35513 - 11905: 0xD575, 35514 - 11905: 0xD576, 35515 - 11905: 0xD577, 35516 - 11905: 0xD578, 35517 - 11905: 0xD579, 35518 - 11905: 0xD57A, 35519 - 11905: 0xD57B, 35520 - 11905: 0xD57C, 35521 - 11905: 0xD57D, 35522 - 11905: 0xD57E, 35523 - 11905: 0xD580, 35524 - 11905: 0xD581, 35525 - 11905: 0xD582, 35526 - 11905: 0xD583, 35527 - 11905: 0xD584, 35528 - 11905: 0xD585, 35529 - 11905: 0xD586, 35530 - 11905: 0xD587, 35531 - 11905: 0xD588, 35532 - 11905: 0xD589, 35533 - 11905: 0xD58A, 35534 - 11905: 0xD58B, 35535 - 11905: 0xD58C, 35536 - 11905: 0xD58D, 35537 - 11905: 0xD58E, 35538 - 11905: 0xD58F, 35539 - 11905: 0xD590, 35540 - 11905: 0xD591, 35541 - 11905: 0xD592, 35542 - 11905: 0xD593, 35543 - 11905: 0xD594, 35544 - 11905: 0xD595, 35545 - 11905: 0xD596, 35546 - 11905: 0xD597, 35547 - 11905: 0xD598, 35548 - 11905: 0xD599, 35549 - 11905: 0xD59A, 35550 - 11905: 0xD59B, 35551 - 11905: 0xD59C, 35552 - 11905: 0xD59D, 35553 - 11905: 0xD59E, 35554 - 11905: 0xD59F, 35555 - 11905: 0xD5A0, 35556 - 11905: 0xD640, 35557 - 11905: 0xD641, 35558 - 11905: 0xD642, 35559 - 11905: 0xD643, 35560 - 11905: 0xD644, 35561 - 11905: 0xD645, 35562 - 11905: 0xD646, 35563 - 11905: 0xD647, 35564 - 11905: 0xD648, 35565 - 11905: 0xD649, 35566 - 11905: 0xD64A, 35567 - 11905: 0xD64B, 35568 - 11905: 0xD64C, 35569 - 11905: 0xD64D, 35570 - 11905: 0xD64E, 35571 - 11905: 0xD64F, 35572 - 11905: 0xD650, 35573 - 11905: 0xD651, 35574 - 11905: 0xD652, 35575 - 11905: 0xD653, 35576 - 11905: 0xD654, 35577 - 11905: 0xD655, 35578 - 11905: 0xD656, 35579 - 11905: 0xD657, 35580 - 11905: 0xD658, 35581 - 11905: 0xD659, 35582 - 11905: 0xD65A, 35583 - 11905: 0xD65B, 35584 - 11905: 0xD65C, 35585 - 11905: 0xD65D, 35586 - 11905: 0xD65E, 35587 - 11905: 0xD65F, 35588 - 11905: 0xD660, 35589 - 11905: 0xD661, 35590 - 11905: 0xD662, 35591 - 11905: 0xE5C0, 35592 - 11905: 0xD663, 35593 - 11905: 0xD664, 35594 - 11905: 0xD665, 35595 - 11905: 0xD666, 35596 - 11905: 0xD667, 35597 - 11905: 0xD668, 35598 - 11905: 0xD669, 35599 - 11905: 0xD66A, 35600 - 11905: 0xD66B, 35601 - 11905: 0xD66C, 35602 - 11905: 0xD66D, 35603 - 11905: 0xD66E, 35604 - 11905: 0xD66F, 35605 - 11905: 0xD670, 35606 - 11905: 0xD671, 35607 - 11905: 0xD672, 35608 - 11905: 0xD673, 35609 - 11905: 0xD674, 35610 - 11905: 0xD675, 35611 - 11905: 0xD676, 35612 - 11905: 0xD677, 35613 - 11905: 0xD678, 35614 - 11905: 0xD679, 35615 - 11905: 0xD67A, 35616 - 11905: 0xD67B, 35617 - 11905: 0xD67C, 35618 - 11905: 0xD67D, 35619 - 11905: 0xD67E, 35620 - 11905: 0xD680, 35621 - 11905: 0xD681, 35622 - 11905: 0xF6A5, 35623 - 11905: 0xD682, 35624 - 11905: 0xD683, 35625 - 11905: 0xD684, 35626 - 11905: 0xD685, 35627 - 11905: 0xD686, 35628 - 11905: 0xD687, 35629 - 11905: 0xD688, 35630 - 11905: 0xD689, 35631 - 11905: 0xD68A, 35632 - 11905: 0xD68B, 35633 - 11905: 0xD68C, 35634 - 11905: 0xD68D, 35635 - 11905: 0xD68E, 35636 - 11905: 0xD68F, 35637 - 11905: 0xD690, 35638 - 11905: 0xD691, 35639 - 11905: 0xD692, 35640 - 11905: 0xD693, 35641 - 11905: 0xD694, 35642 - 11905: 0xD695, 35643 - 11905: 0xD696, 35644 - 11905: 0xD697, 35645 - 11905: 0xD698, 35646 - 11905: 0xD699, 35647 - 11905: 0xD69A, 35648 - 11905: 0xD69B, 35649 - 11905: 0xD69C, 35650 - 11905: 0xD69D, 35651 - 11905: 0xD69E, 35652 - 11905: 0xD69F, 35653 - 11905: 0xD6A0, 35654 - 11905: 0xD740, 35655 - 11905: 0xD741, 35656 - 11905: 0xD742, 35657 - 11905: 0xD743, 35658 - 11905: 0xD744, 35659 - 11905: 0xD745, 35660 - 11905: 0xD746, 35661 - 11905: 0xD747, 35662 - 11905: 0xD748, 35663 - 11905: 0xD749, 35664 - 11905: 0xD74A, 35665 - 11905: 0xD74B, 35666 - 11905: 0xD74C, 35667 - 11905: 0xD74D, 35668 - 11905: 0xD74E, 35669 - 11905: 0xD74F, 35670 - 11905: 0xD750, 35671 - 11905: 0xD751, 35672 - 11905: 0xD752, 35673 - 11905: 0xD753, 35674 - 11905: 0xD754, 35675 - 11905: 0xD755, 35676 - 11905: 0xD756, 35677 - 11905: 0xD757, 35678 - 11905: 0xD758, 35679 - 11905: 0xD759, 35680 - 11905: 0xD75A, 35681 - 11905: 0xD75B, 35682 - 11905: 0xD75C, 35683 - 11905: 0xD75D, 35684 - 11905: 0xD75E, 35685 - 11905: 0xD75F, 35686 - 11905: 0xBEAF, 35687 - 11905: 0xD760, 35688 - 11905: 0xD761, 35689 - 11905: 0xD762, 35690 - 11905: 0xD763, 35691 - 11905: 0xD764, 35692 - 11905: 0xC6A9, 35693 - 11905: 0xD765, 35694 - 11905: 0xD766, 35695 - 11905: 0xD767, 35696 - 11905: 0xD768, 35697 - 11905: 0xD769, 35698 - 11905: 0xD76A, 35699 - 11905: 0xD76B, 35700 - 11905: 0xD76C, 35701 - 11905: 0xD76D, 35702 - 11905: 0xD76E, 35703 - 11905: 0xD76F, 35704 - 11905: 0xD770, 35705 - 11905: 0xD771, 35706 - 11905: 0xD772, 35707 - 11905: 0xD773, 35708 - 11905: 0xD774, 35709 - 11905: 0xD775, 35710 - 11905: 0xD776, 35711 - 11905: 0xD777, 35712 - 11905: 0xD778, 35713 - 11905: 0xD779, 35714 - 11905: 0xD77A, 35715 - 11905: 0xD77B, 35716 - 11905: 0xD77C, 35717 - 11905: 0xD77D, 35718 - 11905: 0xD77E, 35719 - 11905: 0xD780, 35720 - 11905: 0xD781, 35721 - 11905: 0xD782, 35722 - 11905: 0xD783, 35723 - 11905: 0xD784, 35724 - 11905: 0xD785, 35725 - 11905: 0xD786, 35726 - 11905: 0xD787, 35727 - 11905: 0xD788, 35728 - 11905: 0xD789, 35729 - 11905: 0xD78A, 35730 - 11905: 0xD78B, 35731 - 11905: 0xD78C, 35732 - 11905: 0xD78D, 35733 - 11905: 0xD78E, 35734 - 11905: 0xD78F, 35735 - 11905: 0xD790, 35736 - 11905: 0xD791, 35737 - 11905: 0xD792, 35738 - 11905: 0xD793, 35739 - 11905: 0xD794, 35740 - 11905: 0xD795, 35741 - 11905: 0xD796, 35742 - 11905: 0xD797, 35743 - 11905: 0xD798, 35744 - 11905: 0xDAA5, 35745 - 11905: 0xBCC6, 35746 - 11905: 0xB6A9, 35747 - 11905: 0xB8BC, 35748 - 11905: 0xC8CF, 35749 - 11905: 0xBCA5, 35750 - 11905: 0xDAA6, 35751 - 11905: 0xDAA7, 35752 - 11905: 0xCCD6, 35753 - 11905: 0xC8C3, 35754 - 11905: 0xDAA8, 35755 - 11905: 0xC6FD, 35756 - 11905: 0xD799, 35757 - 11905: 0xD1B5, 35758 - 11905: 0xD2E9, 35759 - 11905: 0xD1B6, 35760 - 11905: 0xBCC7, 35761 - 11905: 0xD79A, 35762 - 11905: 0xBDB2, 35763 - 11905: 0xBBE4, 35764 - 11905: 0xDAA9, 35765 - 11905: 0xDAAA, 35766 - 11905: 0xD1C8, 35767 - 11905: 0xDAAB, 35768 - 11905: 0xD0ED, 35769 - 11905: 0xB6EF, 35770 - 11905: 0xC2DB, 35771 - 11905: 0xD79B, 35772 - 11905: 0xCBCF, 35773 - 11905: 0xB7ED, 35774 - 11905: 0xC9E8, 35775 - 11905: 0xB7C3, 35776 - 11905: 0xBEF7, 35777 - 11905: 0xD6A4, 35778 - 11905: 0xDAAC, 35779 - 11905: 0xDAAD, 35780 - 11905: 0xC6C0, 35781 - 11905: 0xD7E7, 35782 - 11905: 0xCAB6, 35783 - 11905: 0xD79C, 35784 - 11905: 0xD5A9, 35785 - 11905: 0xCBDF, 35786 - 11905: 0xD5EF, 35787 - 11905: 0xDAAE, 35788 - 11905: 0xD6DF, 35789 - 11905: 0xB4CA, 35790 - 11905: 0xDAB0, 35791 - 11905: 0xDAAF, 35792 - 11905: 0xD79D, 35793 - 11905: 0xD2EB, 35794 - 11905: 0xDAB1, 35795 - 11905: 0xDAB2, 35796 - 11905: 0xDAB3, 35797 - 11905: 0xCAD4, 35798 - 11905: 0xDAB4, 35799 - 11905: 0xCAAB, 35800 - 11905: 0xDAB5, 35801 - 11905: 0xDAB6, 35802 - 11905: 0xB3CF, 35803 - 11905: 0xD6EF, 35804 - 11905: 0xDAB7, 35805 - 11905: 0xBBB0, 35806 - 11905: 0xB5AE, 35807 - 11905: 0xDAB8, 35808 - 11905: 0xDAB9, 35809 - 11905: 0xB9EE, 35810 - 11905: 0xD1AF, 35811 - 11905: 0xD2E8, 35812 - 11905: 0xDABA, 35813 - 11905: 0xB8C3, 35814 - 11905: 0xCFEA, 35815 - 11905: 0xB2EF, 35816 - 11905: 0xDABB, 35817 - 11905: 0xDABC, 35818 - 11905: 0xD79E, 35819 - 11905: 0xBDEB, 35820 - 11905: 0xCEDC, 35821 - 11905: 0xD3EF, 35822 - 11905: 0xDABD, 35823 - 11905: 0xCEF3, 35824 - 11905: 0xDABE, 35825 - 11905: 0xD3D5, 35826 - 11905: 0xBBE5, 35827 - 11905: 0xDABF, 35828 - 11905: 0xCBB5, 35829 - 11905: 0xCBD0, 35830 - 11905: 0xDAC0, 35831 - 11905: 0xC7EB, 35832 - 11905: 0xD6EE, 35833 - 11905: 0xDAC1, 35834 - 11905: 0xC5B5, 35835 - 11905: 0xB6C1, 35836 - 11905: 0xDAC2, 35837 - 11905: 0xB7CC, 35838 - 11905: 0xBFCE, 35839 - 11905: 0xDAC3, 35840 - 11905: 0xDAC4, 35841 - 11905: 0xCBAD, 35842 - 11905: 0xDAC5, 35843 - 11905: 0xB5F7, 35844 - 11905: 0xDAC6, 35845 - 11905: 0xC1C2, 35846 - 11905: 0xD7BB, 35847 - 11905: 0xDAC7, 35848 - 11905: 0xCCB8, 35849 - 11905: 0xD79F, 35850 - 11905: 0xD2EA, 35851 - 11905: 0xC4B1, 35852 - 11905: 0xDAC8, 35853 - 11905: 0xB5FD, 35854 - 11905: 0xBBD1, 35855 - 11905: 0xDAC9, 35856 - 11905: 0xD0B3, 35857 - 11905: 0xDACA, 35858 - 11905: 0xDACB, 35859 - 11905: 0xCEBD, 35860 - 11905: 0xDACC, 35861 - 11905: 0xDACD, 35862 - 11905: 0xDACE, 35863 - 11905: 0xB2F7, 35864 - 11905: 0xDAD1, 35865 - 11905: 0xDACF, 35866 - 11905: 0xD1E8, 35867 - 11905: 0xDAD0, 35868 - 11905: 0xC3D5, 35869 - 11905: 0xDAD2, 35870 - 11905: 0xD7A0, 35871 - 11905: 0xDAD3, 35872 - 11905: 0xDAD4, 35873 - 11905: 0xDAD5, 35874 - 11905: 0xD0BB, 35875 - 11905: 0xD2A5, 35876 - 11905: 0xB0F9, 35877 - 11905: 0xDAD6, 35878 - 11905: 0xC7AB, 35879 - 11905: 0xDAD7, 35880 - 11905: 0xBDF7, 35881 - 11905: 0xC3A1, 35882 - 11905: 0xDAD8, 35883 - 11905: 0xDAD9, 35884 - 11905: 0xC3FD, 35885 - 11905: 0xCCB7, 35886 - 11905: 0xDADA, 35887 - 11905: 0xDADB, 35888 - 11905: 0xC0BE, 35889 - 11905: 0xC6D7, 35890 - 11905: 0xDADC, 35891 - 11905: 0xDADD, 35892 - 11905: 0xC7B4, 35893 - 11905: 0xDADE, 35894 - 11905: 0xDADF, 35895 - 11905: 0xB9C8, 35896 - 11905: 0xD840, 35897 - 11905: 0xD841, 35898 - 11905: 0xD842, 35899 - 11905: 0xD843, 35900 - 11905: 0xD844, 35901 - 11905: 0xD845, 35902 - 11905: 0xD846, 35903 - 11905: 0xD847, 35904 - 11905: 0xD848, 35905 - 11905: 0xBBED, 35906 - 11905: 0xD849, 35907 - 11905: 0xD84A, 35908 - 11905: 0xD84B, 35909 - 11905: 0xD84C, 35910 - 11905: 0xB6B9, 35911 - 11905: 0xF4F8, 35912 - 11905: 0xD84D, 35913 - 11905: 0xF4F9, 35914 - 11905: 0xD84E, 35915 - 11905: 0xD84F, 35916 - 11905: 0xCDE3, 35917 - 11905: 0xD850, 35918 - 11905: 0xD851, 35919 - 11905: 0xD852, 35920 - 11905: 0xD853, 35921 - 11905: 0xD854, 35922 - 11905: 0xD855, 35923 - 11905: 0xD856, 35924 - 11905: 0xD857, 35925 - 11905: 0xF5B9, 35926 - 11905: 0xD858, 35927 - 11905: 0xD859, 35928 - 11905: 0xD85A, 35929 - 11905: 0xD85B, 35930 - 11905: 0xEBE0, 35931 - 11905: 0xD85C, 35932 - 11905: 0xD85D, 35933 - 11905: 0xD85E, 35934 - 11905: 0xD85F, 35935 - 11905: 0xD860, 35936 - 11905: 0xD861, 35937 - 11905: 0xCFF3, 35938 - 11905: 0xBBBF, 35939 - 11905: 0xD862, 35940 - 11905: 0xD863, 35941 - 11905: 0xD864, 35942 - 11905: 0xD865, 35943 - 11905: 0xD866, 35944 - 11905: 0xD867, 35945 - 11905: 0xD868, 35946 - 11905: 0xBAC0, 35947 - 11905: 0xD4A5, 35948 - 11905: 0xD869, 35949 - 11905: 0xD86A, 35950 - 11905: 0xD86B, 35951 - 11905: 0xD86C, 35952 - 11905: 0xD86D, 35953 - 11905: 0xD86E, 35954 - 11905: 0xD86F, 35955 - 11905: 0xE1D9, 35956 - 11905: 0xD870, 35957 - 11905: 0xD871, 35958 - 11905: 0xD872, 35959 - 11905: 0xD873, 35960 - 11905: 0xF5F4, 35961 - 11905: 0xB1AA, 35962 - 11905: 0xB2F2, 35963 - 11905: 0xD874, 35964 - 11905: 0xD875, 35965 - 11905: 0xD876, 35966 - 11905: 0xD877, 35967 - 11905: 0xD878, 35968 - 11905: 0xD879, 35969 - 11905: 0xD87A, 35970 - 11905: 0xF5F5, 35971 - 11905: 0xD87B, 35972 - 11905: 0xD87C, 35973 - 11905: 0xF5F7, 35974 - 11905: 0xD87D, 35975 - 11905: 0xD87E, 35976 - 11905: 0xD880, 35977 - 11905: 0xBAD1, 35978 - 11905: 0xF5F6, 35979 - 11905: 0xD881, 35980 - 11905: 0xC3B2, 35981 - 11905: 0xD882, 35982 - 11905: 0xD883, 35983 - 11905: 0xD884, 35984 - 11905: 0xD885, 35985 - 11905: 0xD886, 35986 - 11905: 0xD887, 35987 - 11905: 0xD888, 35988 - 11905: 0xF5F9, 35989 - 11905: 0xD889, 35990 - 11905: 0xD88A, 35991 - 11905: 0xD88B, 35992 - 11905: 0xF5F8, 35993 - 11905: 0xD88C, 35994 - 11905: 0xD88D, 35995 - 11905: 0xD88E, 35996 - 11905: 0xD88F, 35997 - 11905: 0xD890, 35998 - 11905: 0xD891, 35999 - 11905: 0xD892, 36000 - 11905: 0xD893, 36001 - 11905: 0xD894, 36002 - 11905: 0xD895, 36003 - 11905: 0xD896, 36004 - 11905: 0xD897, 36005 - 11905: 0xD898, 36006 - 11905: 0xD899, 36007 - 11905: 0xD89A, 36008 - 11905: 0xD89B, 36009 - 11905: 0xD89C, 36010 - 11905: 0xD89D, 36011 - 11905: 0xD89E, 36012 - 11905: 0xD89F, 36013 - 11905: 0xD8A0, 36014 - 11905: 0xD940, 36015 - 11905: 0xD941, 36016 - 11905: 0xD942, 36017 - 11905: 0xD943, 36018 - 11905: 0xD944, 36019 - 11905: 0xD945, 36020 - 11905: 0xD946, 36021 - 11905: 0xD947, 36022 - 11905: 0xD948, 36023 - 11905: 0xD949, 36024 - 11905: 0xD94A, 36025 - 11905: 0xD94B, 36026 - 11905: 0xD94C, 36027 - 11905: 0xD94D, 36028 - 11905: 0xD94E, 36029 - 11905: 0xD94F, 36030 - 11905: 0xD950, 36031 - 11905: 0xD951, 36032 - 11905: 0xD952, 36033 - 11905: 0xD953, 36034 - 11905: 0xD954, 36035 - 11905: 0xD955, 36036 - 11905: 0xD956, 36037 - 11905: 0xD957, 36038 - 11905: 0xD958, 36039 - 11905: 0xD959, 36040 - 11905: 0xD95A, 36041 - 11905: 0xD95B, 36042 - 11905: 0xD95C, 36043 - 11905: 0xD95D, 36044 - 11905: 0xD95E, 36045 - 11905: 0xD95F, 36046 - 11905: 0xD960, 36047 - 11905: 0xD961, 36048 - 11905: 0xD962, 36049 - 11905: 0xD963, 36050 - 11905: 0xD964, 36051 - 11905: 0xD965, 36052 - 11905: 0xD966, 36053 - 11905: 0xD967, 36054 - 11905: 0xD968, 36055 - 11905: 0xD969, 36056 - 11905: 0xD96A, 36057 - 11905: 0xD96B, 36058 - 11905: 0xD96C, 36059 - 11905: 0xD96D, 36060 - 11905: 0xD96E, 36061 - 11905: 0xD96F, 36062 - 11905: 0xD970, 36063 - 11905: 0xD971, 36064 - 11905: 0xD972, 36065 - 11905: 0xD973, 36066 - 11905: 0xD974, 36067 - 11905: 0xD975, 36068 - 11905: 0xD976, 36069 - 11905: 0xD977, 36070 - 11905: 0xD978, 36071 - 11905: 0xD979, 36072 - 11905: 0xD97A, 36073 - 11905: 0xD97B, 36074 - 11905: 0xD97C, 36075 - 11905: 0xD97D, 36076 - 11905: 0xD97E, 36077 - 11905: 0xD980, 36078 - 11905: 0xD981, 36079 - 11905: 0xD982, 36080 - 11905: 0xD983, 36081 - 11905: 0xD984, 36082 - 11905: 0xD985, 36083 - 11905: 0xD986, 36084 - 11905: 0xD987, 36085 - 11905: 0xD988, 36086 - 11905: 0xD989, 36087 - 11905: 0xD98A, 36088 - 11905: 0xD98B, 36089 - 11905: 0xD98C, 36090 - 11905: 0xD98D, 36091 - 11905: 0xD98E, 36092 - 11905: 0xD98F, 36093 - 11905: 0xD990, 36094 - 11905: 0xD991, 36095 - 11905: 0xD992, 36096 - 11905: 0xD993, 36097 - 11905: 0xD994, 36098 - 11905: 0xD995, 36099 - 11905: 0xD996, 36100 - 11905: 0xD997, 36101 - 11905: 0xD998, 36102 - 11905: 0xD999, 36103 - 11905: 0xD99A, 36104 - 11905: 0xD99B, 36105 - 11905: 0xD99C, 36106 - 11905: 0xD99D, 36107 - 11905: 0xD99E, 36108 - 11905: 0xD99F, 36109 - 11905: 0xD9A0, 36110 - 11905: 0xDA40, 36111 - 11905: 0xDA41, 36112 - 11905: 0xDA42, 36113 - 11905: 0xDA43, 36114 - 11905: 0xDA44, 36115 - 11905: 0xDA45, 36116 - 11905: 0xDA46, 36117 - 11905: 0xDA47, 36118 - 11905: 0xDA48, 36119 - 11905: 0xDA49, 36120 - 11905: 0xDA4A, 36121 - 11905: 0xDA4B, 36122 - 11905: 0xDA4C, 36123 - 11905: 0xDA4D, 36124 - 11905: 0xDA4E, 36125 - 11905: 0xB1B4, 36126 - 11905: 0xD5EA, 36127 - 11905: 0xB8BA, 36128 - 11905: 0xDA4F, 36129 - 11905: 0xB9B1, 36130 - 11905: 0xB2C6, 36131 - 11905: 0xD4F0, 36132 - 11905: 0xCFCD, 36133 - 11905: 0xB0DC, 36134 - 11905: 0xD5CB, 36135 - 11905: 0xBBF5, 36136 - 11905: 0xD6CA, 36137 - 11905: 0xB7B7, 36138 - 11905: 0xCCB0, 36139 - 11905: 0xC6B6, 36140 - 11905: 0xB1E1, 36141 - 11905: 0xB9BA, 36142 - 11905: 0xD6FC, 36143 - 11905: 0xB9E1, 36144 - 11905: 0xB7A1, 36145 - 11905: 0xBCFA, 36146 - 11905: 0xEADA, 36147 - 11905: 0xEADB, 36148 - 11905: 0xCCF9, 36149 - 11905: 0xB9F3, 36150 - 11905: 0xEADC, 36151 - 11905: 0xB4FB, 36152 - 11905: 0xC3B3, 36153 - 11905: 0xB7D1, 36154 - 11905: 0xBAD8, 36155 - 11905: 0xEADD, 36156 - 11905: 0xD4F4, 36157 - 11905: 0xEADE, 36158 - 11905: 0xBCD6, 36159 - 11905: 0xBBDF, 36160 - 11905: 0xEADF, 36161 - 11905: 0xC1DE, 36162 - 11905: 0xC2B8, 36163 - 11905: 0xD4DF, 36164 - 11905: 0xD7CA, 36165 - 11905: 0xEAE0, 36166 - 11905: 0xEAE1, 36167 - 11905: 0xEAE4, 36168 - 11905: 0xEAE2, 36169 - 11905: 0xEAE3, 36170 - 11905: 0xC9DE, 36171 - 11905: 0xB8B3, 36172 - 11905: 0xB6C4, 36173 - 11905: 0xEAE5, 36174 - 11905: 0xCAEA, 36175 - 11905: 0xC9CD, 36176 - 11905: 0xB4CD, 36177 - 11905: 0xDA50, 36178 - 11905: 0xDA51, 36179 - 11905: 0xE2D9, 36180 - 11905: 0xC5E2, 36181 - 11905: 0xEAE6, 36182 - 11905: 0xC0B5, 36183 - 11905: 0xDA52, 36184 - 11905: 0xD7B8, 36185 - 11905: 0xEAE7, 36186 - 11905: 0xD7AC, 36187 - 11905: 0xC8FC, 36188 - 11905: 0xD8D3, 36189 - 11905: 0xD8CD, 36190 - 11905: 0xD4DE, 36191 - 11905: 0xDA53, 36192 - 11905: 0xD4F9, 36193 - 11905: 0xC9C4, 36194 - 11905: 0xD3AE, 36195 - 11905: 0xB8D3, 36196 - 11905: 0xB3E0, 36197 - 11905: 0xDA54, 36198 - 11905: 0xC9E2, 36199 - 11905: 0xF4F6, 36200 - 11905: 0xDA55, 36201 - 11905: 0xDA56, 36202 - 11905: 0xDA57, 36203 - 11905: 0xBAD5, 36204 - 11905: 0xDA58, 36205 - 11905: 0xF4F7, 36206 - 11905: 0xDA59, 36207 - 11905: 0xDA5A, 36208 - 11905: 0xD7DF, 36209 - 11905: 0xDA5B, 36210 - 11905: 0xDA5C, 36211 - 11905: 0xF4F1, 36212 - 11905: 0xB8B0, 36213 - 11905: 0xD5D4, 36214 - 11905: 0xB8CF, 36215 - 11905: 0xC6F0, 36216 - 11905: 0xDA5D, 36217 - 11905: 0xDA5E, 36218 - 11905: 0xDA5F, 36219 - 11905: 0xDA60, 36220 - 11905: 0xDA61, 36221 - 11905: 0xDA62, 36222 - 11905: 0xDA63, 36223 - 11905: 0xDA64, 36224 - 11905: 0xDA65, 36225 - 11905: 0xB3C3, 36226 - 11905: 0xDA66, 36227 - 11905: 0xDA67, 36228 - 11905: 0xF4F2, 36229 - 11905: 0xB3AC, 36230 - 11905: 0xDA68, 36231 - 11905: 0xDA69, 36232 - 11905: 0xDA6A, 36233 - 11905: 0xDA6B, 36234 - 11905: 0xD4BD, 36235 - 11905: 0xC7F7, 36236 - 11905: 0xDA6C, 36237 - 11905: 0xDA6D, 36238 - 11905: 0xDA6E, 36239 - 11905: 0xDA6F, 36240 - 11905: 0xDA70, 36241 - 11905: 0xF4F4, 36242 - 11905: 0xDA71, 36243 - 11905: 0xDA72, 36244 - 11905: 0xF4F3, 36245 - 11905: 0xDA73, 36246 - 11905: 0xDA74, 36247 - 11905: 0xDA75, 36248 - 11905: 0xDA76, 36249 - 11905: 0xDA77, 36250 - 11905: 0xDA78, 36251 - 11905: 0xDA79, 36252 - 11905: 0xDA7A, 36253 - 11905: 0xDA7B, 36254 - 11905: 0xDA7C, 36255 - 11905: 0xCCCB, 36256 - 11905: 0xDA7D, 36257 - 11905: 0xDA7E, 36258 - 11905: 0xDA80, 36259 - 11905: 0xC8A4, 36260 - 11905: 0xDA81, 36261 - 11905: 0xDA82, 36262 - 11905: 0xDA83, 36263 - 11905: 0xDA84, 36264 - 11905: 0xDA85, 36265 - 11905: 0xDA86, 36266 - 11905: 0xDA87, 36267 - 11905: 0xDA88, 36268 - 11905: 0xDA89, 36269 - 11905: 0xDA8A, 36270 - 11905: 0xDA8B, 36271 - 11905: 0xDA8C, 36272 - 11905: 0xDA8D, 36273 - 11905: 0xF4F5, 36274 - 11905: 0xDA8E, 36275 - 11905: 0xD7E3, 36276 - 11905: 0xC5BF, 36277 - 11905: 0xF5C0, 36278 - 11905: 0xDA8F, 36279 - 11905: 0xDA90, 36280 - 11905: 0xF5BB, 36281 - 11905: 0xDA91, 36282 - 11905: 0xF5C3, 36283 - 11905: 0xDA92, 36284 - 11905: 0xF5C2, 36285 - 11905: 0xDA93, 36286 - 11905: 0xD6BA, 36287 - 11905: 0xF5C1, 36288 - 11905: 0xDA94, 36289 - 11905: 0xDA95, 36290 - 11905: 0xDA96, 36291 - 11905: 0xD4BE, 36292 - 11905: 0xF5C4, 36293 - 11905: 0xDA97, 36294 - 11905: 0xF5CC, 36295 - 11905: 0xDA98, 36296 - 11905: 0xDA99, 36297 - 11905: 0xDA9A, 36298 - 11905: 0xDA9B, 36299 - 11905: 0xB0CF, 36300 - 11905: 0xB5F8, 36301 - 11905: 0xDA9C, 36302 - 11905: 0xF5C9, 36303 - 11905: 0xF5CA, 36304 - 11905: 0xDA9D, 36305 - 11905: 0xC5DC, 36306 - 11905: 0xDA9E, 36307 - 11905: 0xDA9F, 36308 - 11905: 0xDAA0, 36309 - 11905: 0xDB40, 36310 - 11905: 0xF5C5, 36311 - 11905: 0xF5C6, 36312 - 11905: 0xDB41, 36313 - 11905: 0xDB42, 36314 - 11905: 0xF5C7, 36315 - 11905: 0xF5CB, 36316 - 11905: 0xDB43, 36317 - 11905: 0xBEE0, 36318 - 11905: 0xF5C8, 36319 - 11905: 0xB8FA, 36320 - 11905: 0xDB44, 36321 - 11905: 0xDB45, 36322 - 11905: 0xDB46, 36323 - 11905: 0xF5D0, 36324 - 11905: 0xF5D3, 36325 - 11905: 0xDB47, 36326 - 11905: 0xDB48, 36327 - 11905: 0xDB49, 36328 - 11905: 0xBFE7, 36329 - 11905: 0xDB4A, 36330 - 11905: 0xB9F2, 36331 - 11905: 0xF5BC, 36332 - 11905: 0xF5CD, 36333 - 11905: 0xDB4B, 36334 - 11905: 0xDB4C, 36335 - 11905: 0xC2B7, 36336 - 11905: 0xDB4D, 36337 - 11905: 0xDB4E, 36338 - 11905: 0xDB4F, 36339 - 11905: 0xCCF8, 36340 - 11905: 0xDB50, 36341 - 11905: 0xBCF9, 36342 - 11905: 0xDB51, 36343 - 11905: 0xF5CE, 36344 - 11905: 0xF5CF, 36345 - 11905: 0xF5D1, 36346 - 11905: 0xB6E5, 36347 - 11905: 0xF5D2, 36348 - 11905: 0xDB52, 36349 - 11905: 0xF5D5, 36350 - 11905: 0xDB53, 36351 - 11905: 0xDB54, 36352 - 11905: 0xDB55, 36353 - 11905: 0xDB56, 36354 - 11905: 0xDB57, 36355 - 11905: 0xDB58, 36356 - 11905: 0xDB59, 36357 - 11905: 0xF5BD, 36358 - 11905: 0xDB5A, 36359 - 11905: 0xDB5B, 36360 - 11905: 0xDB5C, 36361 - 11905: 0xF5D4, 36362 - 11905: 0xD3BB, 36363 - 11905: 0xDB5D, 36364 - 11905: 0xB3EC, 36365 - 11905: 0xDB5E, 36366 - 11905: 0xDB5F, 36367 - 11905: 0xCCA4, 36368 - 11905: 0xDB60, 36369 - 11905: 0xDB61, 36370 - 11905: 0xDB62, 36371 - 11905: 0xDB63, 36372 - 11905: 0xF5D6, 36373 - 11905: 0xDB64, 36374 - 11905: 0xDB65, 36375 - 11905: 0xDB66, 36376 - 11905: 0xDB67, 36377 - 11905: 0xDB68, 36378 - 11905: 0xDB69, 36379 - 11905: 0xDB6A, 36380 - 11905: 0xDB6B, 36381 - 11905: 0xF5D7, 36382 - 11905: 0xBEE1, 36383 - 11905: 0xF5D8, 36384 - 11905: 0xDB6C, 36385 - 11905: 0xDB6D, 36386 - 11905: 0xCCDF, 36387 - 11905: 0xF5DB, 36388 - 11905: 0xDB6E, 36389 - 11905: 0xDB6F, 36390 - 11905: 0xDB70, 36391 - 11905: 0xDB71, 36392 - 11905: 0xDB72, 36393 - 11905: 0xB2C8, 36394 - 11905: 0xD7D9, 36395 - 11905: 0xDB73, 36396 - 11905: 0xF5D9, 36397 - 11905: 0xDB74, 36398 - 11905: 0xF5DA, 36399 - 11905: 0xF5DC, 36400 - 11905: 0xDB75, 36401 - 11905: 0xF5E2, 36402 - 11905: 0xDB76, 36403 - 11905: 0xDB77, 36404 - 11905: 0xDB78, 36405 - 11905: 0xF5E0, 36406 - 11905: 0xDB79, 36407 - 11905: 0xDB7A, 36408 - 11905: 0xDB7B, 36409 - 11905: 0xF5DF, 36410 - 11905: 0xF5DD, 36411 - 11905: 0xDB7C, 36412 - 11905: 0xDB7D, 36413 - 11905: 0xF5E1, 36414 - 11905: 0xDB7E, 36415 - 11905: 0xDB80, 36416 - 11905: 0xF5DE, 36417 - 11905: 0xF5E4, 36418 - 11905: 0xF5E5, 36419 - 11905: 0xDB81, 36420 - 11905: 0xCCE3, 36421 - 11905: 0xDB82, 36422 - 11905: 0xDB83, 36423 - 11905: 0xE5BF, 36424 - 11905: 0xB5B8, 36425 - 11905: 0xF5E3, 36426 - 11905: 0xF5E8, 36427 - 11905: 0xCCA3, 36428 - 11905: 0xDB84, 36429 - 11905: 0xDB85, 36430 - 11905: 0xDB86, 36431 - 11905: 0xDB87, 36432 - 11905: 0xDB88, 36433 - 11905: 0xF5E6, 36434 - 11905: 0xF5E7, 36435 - 11905: 0xDB89, 36436 - 11905: 0xDB8A, 36437 - 11905: 0xDB8B, 36438 - 11905: 0xDB8C, 36439 - 11905: 0xDB8D, 36440 - 11905: 0xDB8E, 36441 - 11905: 0xF5BE, 36442 - 11905: 0xDB8F, 36443 - 11905: 0xDB90, 36444 - 11905: 0xDB91, 36445 - 11905: 0xDB92, 36446 - 11905: 0xDB93, 36447 - 11905: 0xDB94, 36448 - 11905: 0xDB95, 36449 - 11905: 0xDB96, 36450 - 11905: 0xDB97, 36451 - 11905: 0xDB98, 36452 - 11905: 0xDB99, 36453 - 11905: 0xDB9A, 36454 - 11905: 0xB1C4, 36455 - 11905: 0xDB9B, 36456 - 11905: 0xDB9C, 36457 - 11905: 0xF5BF, 36458 - 11905: 0xDB9D, 36459 - 11905: 0xDB9E, 36460 - 11905: 0xB5C5, 36461 - 11905: 0xB2E4, 36462 - 11905: 0xDB9F, 36463 - 11905: 0xF5EC, 36464 - 11905: 0xF5E9, 36465 - 11905: 0xDBA0, 36466 - 11905: 0xB6D7, 36467 - 11905: 0xDC40, 36468 - 11905: 0xF5ED, 36469 - 11905: 0xDC41, 36470 - 11905: 0xF5EA, 36471 - 11905: 0xDC42, 36472 - 11905: 0xDC43, 36473 - 11905: 0xDC44, 36474 - 11905: 0xDC45, 36475 - 11905: 0xDC46, 36476 - 11905: 0xF5EB, 36477 - 11905: 0xDC47, 36478 - 11905: 0xDC48, 36479 - 11905: 0xB4DA, 36480 - 11905: 0xDC49, 36481 - 11905: 0xD4EA, 36482 - 11905: 0xDC4A, 36483 - 11905: 0xDC4B, 36484 - 11905: 0xDC4C, 36485 - 11905: 0xF5EE, 36486 - 11905: 0xDC4D, 36487 - 11905: 0xB3F9, 36488 - 11905: 0xDC4E, 36489 - 11905: 0xDC4F, 36490 - 11905: 0xDC50, 36491 - 11905: 0xDC51, 36492 - 11905: 0xDC52, 36493 - 11905: 0xDC53, 36494 - 11905: 0xDC54, 36495 - 11905: 0xF5EF, 36496 - 11905: 0xF5F1, 36497 - 11905: 0xDC55, 36498 - 11905: 0xDC56, 36499 - 11905: 0xDC57, 36500 - 11905: 0xF5F0, 36501 - 11905: 0xDC58, 36502 - 11905: 0xDC59, 36503 - 11905: 0xDC5A, 36504 - 11905: 0xDC5B, 36505 - 11905: 0xDC5C, 36506 - 11905: 0xDC5D, 36507 - 11905: 0xDC5E, 36508 - 11905: 0xF5F2, 36509 - 11905: 0xDC5F, 36510 - 11905: 0xF5F3, 36511 - 11905: 0xDC60, 36512 - 11905: 0xDC61, 36513 - 11905: 0xDC62, 36514 - 11905: 0xDC63, 36515 - 11905: 0xDC64, 36516 - 11905: 0xDC65, 36517 - 11905: 0xDC66, 36518 - 11905: 0xDC67, 36519 - 11905: 0xDC68, 36520 - 11905: 0xDC69, 36521 - 11905: 0xDC6A, 36522 - 11905: 0xDC6B, 36523 - 11905: 0xC9ED, 36524 - 11905: 0xB9AA, 36525 - 11905: 0xDC6C, 36526 - 11905: 0xDC6D, 36527 - 11905: 0xC7FB, 36528 - 11905: 0xDC6E, 36529 - 11905: 0xDC6F, 36530 - 11905: 0xB6E3, 36531 - 11905: 0xDC70, 36532 - 11905: 0xDC71, 36533 - 11905: 0xDC72, 36534 - 11905: 0xDC73, 36535 - 11905: 0xDC74, 36536 - 11905: 0xDC75, 36537 - 11905: 0xDC76, 36538 - 11905: 0xCCC9, 36539 - 11905: 0xDC77, 36540 - 11905: 0xDC78, 36541 - 11905: 0xDC79, 36542 - 11905: 0xDC7A, 36543 - 11905: 0xDC7B, 36544 - 11905: 0xDC7C, 36545 - 11905: 0xDC7D, 36546 - 11905: 0xDC7E, 36547 - 11905: 0xDC80, 36548 - 11905: 0xDC81, 36549 - 11905: 0xDC82, 36550 - 11905: 0xDC83, 36551 - 11905: 0xDC84, 36552 - 11905: 0xDC85, 36553 - 11905: 0xDC86, 36554 - 11905: 0xDC87, 36555 - 11905: 0xDC88, 36556 - 11905: 0xDC89, 36557 - 11905: 0xDC8A, 36558 - 11905: 0xEAA6, 36559 - 11905: 0xDC8B, 36560 - 11905: 0xDC8C, 36561 - 11905: 0xDC8D, 36562 - 11905: 0xDC8E, 36563 - 11905: 0xDC8F, 36564 - 11905: 0xDC90, 36565 - 11905: 0xDC91, 36566 - 11905: 0xDC92, 36567 - 11905: 0xDC93, 36568 - 11905: 0xDC94, 36569 - 11905: 0xDC95, 36570 - 11905: 0xDC96, 36571 - 11905: 0xDC97, 36572 - 11905: 0xDC98, 36573 - 11905: 0xDC99, 36574 - 11905: 0xDC9A, 36575 - 11905: 0xDC9B, 36576 - 11905: 0xDC9C, 36577 - 11905: 0xDC9D, 36578 - 11905: 0xDC9E, 36579 - 11905: 0xDC9F, 36580 - 11905: 0xDCA0, 36581 - 11905: 0xDD40, 36582 - 11905: 0xDD41, 36583 - 11905: 0xDD42, 36584 - 11905: 0xDD43, 36585 - 11905: 0xDD44, 36586 - 11905: 0xDD45, 36587 - 11905: 0xDD46, 36588 - 11905: 0xDD47, 36589 - 11905: 0xDD48, 36590 - 11905: 0xDD49, 36591 - 11905: 0xDD4A, 36592 - 11905: 0xDD4B, 36593 - 11905: 0xDD4C, 36594 - 11905: 0xDD4D, 36595 - 11905: 0xDD4E, 36596 - 11905: 0xDD4F, 36597 - 11905: 0xDD50, 36598 - 11905: 0xDD51, 36599 - 11905: 0xDD52, 36600 - 11905: 0xDD53, 36601 - 11905: 0xDD54, 36602 - 11905: 0xDD55, 36603 - 11905: 0xDD56, 36604 - 11905: 0xDD57, 36605 - 11905: 0xDD58, 36606 - 11905: 0xDD59, 36607 - 11905: 0xDD5A, 36608 - 11905: 0xDD5B, 36609 - 11905: 0xDD5C, 36610 - 11905: 0xDD5D, 36611 - 11905: 0xDD5E, 36612 - 11905: 0xDD5F, 36613 - 11905: 0xDD60, 36614 - 11905: 0xDD61, 36615 - 11905: 0xDD62, 36616 - 11905: 0xDD63, 36617 - 11905: 0xDD64, 36618 - 11905: 0xDD65, 36619 - 11905: 0xDD66, 36620 - 11905: 0xDD67, 36621 - 11905: 0xDD68, 36622 - 11905: 0xDD69, 36623 - 11905: 0xDD6A, 36624 - 11905: 0xDD6B, 36625 - 11905: 0xDD6C, 36626 - 11905: 0xDD6D, 36627 - 11905: 0xDD6E, 36628 - 11905: 0xDD6F, 36629 - 11905: 0xDD70, 36630 - 11905: 0xDD71, 36631 - 11905: 0xDD72, 36632 - 11905: 0xDD73, 36633 - 11905: 0xDD74, 36634 - 11905: 0xDD75, 36635 - 11905: 0xDD76, 36636 - 11905: 0xDD77, 36637 - 11905: 0xDD78, 36638 - 11905: 0xDD79, 36639 - 11905: 0xDD7A, 36640 - 11905: 0xDD7B, 36641 - 11905: 0xDD7C, 36642 - 11905: 0xDD7D, 36643 - 11905: 0xDD7E, 36644 - 11905: 0xDD80, 36645 - 11905: 0xDD81, 36646 - 11905: 0xDD82, 36647 - 11905: 0xDD83, 36648 - 11905: 0xDD84, 36649 - 11905: 0xDD85, 36650 - 11905: 0xDD86, 36651 - 11905: 0xDD87, 36652 - 11905: 0xDD88, 36653 - 11905: 0xDD89, 36654 - 11905: 0xDD8A, 36655 - 11905: 0xDD8B, 36656 - 11905: 0xDD8C, 36657 - 11905: 0xDD8D, 36658 - 11905: 0xDD8E, 36659 - 11905: 0xDD8F, 36660 - 11905: 0xDD90, 36661 - 11905: 0xDD91, 36662 - 11905: 0xDD92, 36663 - 11905: 0xDD93, 36664 - 11905: 0xDD94, 36665 - 11905: 0xDD95, 36666 - 11905: 0xDD96, 36667 - 11905: 0xDD97, 36668 - 11905: 0xDD98, 36669 - 11905: 0xDD99, 36670 - 11905: 0xDD9A, 36671 - 11905: 0xDD9B, 36672 - 11905: 0xDD9C, 36673 - 11905: 0xDD9D, 36674 - 11905: 0xDD9E, 36675 - 11905: 0xDD9F, 36676 - 11905: 0xDDA0, 36677 - 11905: 0xDE40, 36678 - 11905: 0xDE41, 36679 - 11905: 0xDE42, 36680 - 11905: 0xDE43, 36681 - 11905: 0xDE44, 36682 - 11905: 0xDE45, 36683 - 11905: 0xDE46, 36684 - 11905: 0xDE47, 36685 - 11905: 0xDE48, 36686 - 11905: 0xDE49, 36687 - 11905: 0xDE4A, 36688 - 11905: 0xDE4B, 36689 - 11905: 0xDE4C, 36690 - 11905: 0xDE4D, 36691 - 11905: 0xDE4E, 36692 - 11905: 0xDE4F, 36693 - 11905: 0xDE50, 36694 - 11905: 0xDE51, 36695 - 11905: 0xDE52, 36696 - 11905: 0xDE53, 36697 - 11905: 0xDE54, 36698 - 11905: 0xDE55, 36699 - 11905: 0xDE56, 36700 - 11905: 0xDE57, 36701 - 11905: 0xDE58, 36702 - 11905: 0xDE59, 36703 - 11905: 0xDE5A, 36704 - 11905: 0xDE5B, 36705 - 11905: 0xDE5C, 36706 - 11905: 0xDE5D, 36707 - 11905: 0xDE5E, 36708 - 11905: 0xDE5F, 36709 - 11905: 0xDE60, 36710 - 11905: 0xB3B5, 36711 - 11905: 0xD4FE, 36712 - 11905: 0xB9EC, 36713 - 11905: 0xD0F9, 36714 - 11905: 0xDE61, 36715 - 11905: 0xE9ED, 36716 - 11905: 0xD7AA, 36717 - 11905: 0xE9EE, 36718 - 11905: 0xC2D6, 36719 - 11905: 0xC8ED, 36720 - 11905: 0xBAE4, 36721 - 11905: 0xE9EF, 36722 - 11905: 0xE9F0, 36723 - 11905: 0xE9F1, 36724 - 11905: 0xD6E1, 36725 - 11905: 0xE9F2, 36726 - 11905: 0xE9F3, 36727 - 11905: 0xE9F5, 36728 - 11905: 0xE9F4, 36729 - 11905: 0xE9F6, 36730 - 11905: 0xE9F7, 36731 - 11905: 0xC7E1, 36732 - 11905: 0xE9F8, 36733 - 11905: 0xD4D8, 36734 - 11905: 0xE9F9, 36735 - 11905: 0xBDCE, 36736 - 11905: 0xDE62, 36737 - 11905: 0xE9FA, 36738 - 11905: 0xE9FB, 36739 - 11905: 0xBDCF, 36740 - 11905: 0xE9FC, 36741 - 11905: 0xB8A8, 36742 - 11905: 0xC1BE, 36743 - 11905: 0xE9FD, 36744 - 11905: 0xB1B2, 36745 - 11905: 0xBBD4, 36746 - 11905: 0xB9F5, 36747 - 11905: 0xE9FE, 36748 - 11905: 0xDE63, 36749 - 11905: 0xEAA1, 36750 - 11905: 0xEAA2, 36751 - 11905: 0xEAA3, 36752 - 11905: 0xB7F8, 36753 - 11905: 0xBCAD, 36754 - 11905: 0xDE64, 36755 - 11905: 0xCAE4, 36756 - 11905: 0xE0CE, 36757 - 11905: 0xD4AF, 36758 - 11905: 0xCFBD, 36759 - 11905: 0xD5B7, 36760 - 11905: 0xEAA4, 36761 - 11905: 0xD5DE, 36762 - 11905: 0xEAA5, 36763 - 11905: 0xD0C1, 36764 - 11905: 0xB9BC, 36765 - 11905: 0xDE65, 36766 - 11905: 0xB4C7, 36767 - 11905: 0xB1D9, 36768 - 11905: 0xDE66, 36769 - 11905: 0xDE67, 36770 - 11905: 0xDE68, 36771 - 11905: 0xC0B1, 36772 - 11905: 0xDE69, 36773 - 11905: 0xDE6A, 36774 - 11905: 0xDE6B, 36775 - 11905: 0xDE6C, 36776 - 11905: 0xB1E6, 36777 - 11905: 0xB1E7, 36778 - 11905: 0xDE6D, 36779 - 11905: 0xB1E8, 36780 - 11905: 0xDE6E, 36781 - 11905: 0xDE6F, 36782 - 11905: 0xDE70, 36783 - 11905: 0xDE71, 36784 - 11905: 0xB3BD, 36785 - 11905: 0xC8E8, 36786 - 11905: 0xDE72, 36787 - 11905: 0xDE73, 36788 - 11905: 0xDE74, 36789 - 11905: 0xDE75, 36790 - 11905: 0xE5C1, 36791 - 11905: 0xDE76, 36792 - 11905: 0xDE77, 36793 - 11905: 0xB1DF, 36794 - 11905: 0xDE78, 36795 - 11905: 0xDE79, 36796 - 11905: 0xDE7A, 36797 - 11905: 0xC1C9, 36798 - 11905: 0xB4EF, 36799 - 11905: 0xDE7B, 36800 - 11905: 0xDE7C, 36801 - 11905: 0xC7A8, 36802 - 11905: 0xD3D8, 36803 - 11905: 0xDE7D, 36804 - 11905: 0xC6F9, 36805 - 11905: 0xD1B8, 36806 - 11905: 0xDE7E, 36807 - 11905: 0xB9FD, 36808 - 11905: 0xC2F5, 36809 - 11905: 0xDE80, 36810 - 11905: 0xDE81, 36811 - 11905: 0xDE82, 36812 - 11905: 0xDE83, 36813 - 11905: 0xDE84, 36814 - 11905: 0xD3AD, 36815 - 11905: 0xDE85, 36816 - 11905: 0xD4CB, 36817 - 11905: 0xBDFC, 36818 - 11905: 0xDE86, 36819 - 11905: 0xE5C2, 36820 - 11905: 0xB7B5, 36821 - 11905: 0xE5C3, 36822 - 11905: 0xDE87, 36823 - 11905: 0xDE88, 36824 - 11905: 0xBBB9, 36825 - 11905: 0xD5E2, 36826 - 11905: 0xDE89, 36827 - 11905: 0xBDF8, 36828 - 11905: 0xD4B6, 36829 - 11905: 0xCEA5, 36830 - 11905: 0xC1AC, 36831 - 11905: 0xB3D9, 36832 - 11905: 0xDE8A, 36833 - 11905: 0xDE8B, 36834 - 11905: 0xCCF6, 36835 - 11905: 0xDE8C, 36836 - 11905: 0xE5C6, 36837 - 11905: 0xE5C4, 36838 - 11905: 0xE5C8, 36839 - 11905: 0xDE8D, 36840 - 11905: 0xE5CA, 36841 - 11905: 0xE5C7, 36842 - 11905: 0xB5CF, 36843 - 11905: 0xC6C8, 36844 - 11905: 0xDE8E, 36845 - 11905: 0xB5FC, 36846 - 11905: 0xE5C5, 36847 - 11905: 0xDE8F, 36848 - 11905: 0xCAF6, 36849 - 11905: 0xDE90, 36850 - 11905: 0xDE91, 36851 - 11905: 0xE5C9, 36852 - 11905: 0xDE92, 36853 - 11905: 0xDE93, 36854 - 11905: 0xDE94, 36855 - 11905: 0xC3D4, 36856 - 11905: 0xB1C5, 36857 - 11905: 0xBCA3, 36858 - 11905: 0xDE95, 36859 - 11905: 0xDE96, 36860 - 11905: 0xDE97, 36861 - 11905: 0xD7B7, 36862 - 11905: 0xDE98, 36863 - 11905: 0xDE99, 36864 - 11905: 0xCDCB, 36865 - 11905: 0xCBCD, 36866 - 11905: 0xCACA, 36867 - 11905: 0xCCD3, 36868 - 11905: 0xE5CC, 36869 - 11905: 0xE5CB, 36870 - 11905: 0xC4E6, 36871 - 11905: 0xDE9A, 36872 - 11905: 0xDE9B, 36873 - 11905: 0xD1A1, 36874 - 11905: 0xD1B7, 36875 - 11905: 0xE5CD, 36876 - 11905: 0xDE9C, 36877 - 11905: 0xE5D0, 36878 - 11905: 0xDE9D, 36879 - 11905: 0xCDB8, 36880 - 11905: 0xD6F0, 36881 - 11905: 0xE5CF, 36882 - 11905: 0xB5DD, 36883 - 11905: 0xDE9E, 36884 - 11905: 0xCDBE, 36885 - 11905: 0xDE9F, 36886 - 11905: 0xE5D1, 36887 - 11905: 0xB6BA, 36888 - 11905: 0xDEA0, 36889 - 11905: 0xDF40, 36890 - 11905: 0xCDA8, 36891 - 11905: 0xB9E4, 36892 - 11905: 0xDF41, 36893 - 11905: 0xCAC5, 36894 - 11905: 0xB3D1, 36895 - 11905: 0xCBD9, 36896 - 11905: 0xD4EC, 36897 - 11905: 0xE5D2, 36898 - 11905: 0xB7EA, 36899 - 11905: 0xDF42, 36900 - 11905: 0xDF43, 36901 - 11905: 0xDF44, 36902 - 11905: 0xE5CE, 36903 - 11905: 0xDF45, 36904 - 11905: 0xDF46, 36905 - 11905: 0xDF47, 36906 - 11905: 0xDF48, 36907 - 11905: 0xDF49, 36908 - 11905: 0xDF4A, 36909 - 11905: 0xE5D5, 36910 - 11905: 0xB4FE, 36911 - 11905: 0xE5D6, 36912 - 11905: 0xDF4B, 36913 - 11905: 0xDF4C, 36914 - 11905: 0xDF4D, 36915 - 11905: 0xDF4E, 36916 - 11905: 0xDF4F, 36917 - 11905: 0xE5D3, 36918 - 11905: 0xE5D4, 36919 - 11905: 0xDF50, 36920 - 11905: 0xD2DD, 36921 - 11905: 0xDF51, 36922 - 11905: 0xDF52, 36923 - 11905: 0xC2DF, 36924 - 11905: 0xB1C6, 36925 - 11905: 0xDF53, 36926 - 11905: 0xD3E2, 36927 - 11905: 0xDF54, 36928 - 11905: 0xDF55, 36929 - 11905: 0xB6DD, 36930 - 11905: 0xCBEC, 36931 - 11905: 0xDF56, 36932 - 11905: 0xE5D7, 36933 - 11905: 0xDF57, 36934 - 11905: 0xDF58, 36935 - 11905: 0xD3F6, 36936 - 11905: 0xDF59, 36937 - 11905: 0xDF5A, 36938 - 11905: 0xDF5B, 36939 - 11905: 0xDF5C, 36940 - 11905: 0xDF5D, 36941 - 11905: 0xB1E9, 36942 - 11905: 0xDF5E, 36943 - 11905: 0xB6F4, 36944 - 11905: 0xE5DA, 36945 - 11905: 0xE5D8, 36946 - 11905: 0xE5D9, 36947 - 11905: 0xB5C0, 36948 - 11905: 0xDF5F, 36949 - 11905: 0xDF60, 36950 - 11905: 0xDF61, 36951 - 11905: 0xD2C5, 36952 - 11905: 0xE5DC, 36953 - 11905: 0xDF62, 36954 - 11905: 0xDF63, 36955 - 11905: 0xE5DE, 36956 - 11905: 0xDF64, 36957 - 11905: 0xDF65, 36958 - 11905: 0xDF66, 36959 - 11905: 0xDF67, 36960 - 11905: 0xDF68, 36961 - 11905: 0xDF69, 36962 - 11905: 0xE5DD, 36963 - 11905: 0xC7B2, 36964 - 11905: 0xDF6A, 36965 - 11905: 0xD2A3, 36966 - 11905: 0xDF6B, 36967 - 11905: 0xDF6C, 36968 - 11905: 0xE5DB, 36969 - 11905: 0xDF6D, 36970 - 11905: 0xDF6E, 36971 - 11905: 0xDF6F, 36972 - 11905: 0xDF70, 36973 - 11905: 0xD4E2, 36974 - 11905: 0xD5DA, 36975 - 11905: 0xDF71, 36976 - 11905: 0xDF72, 36977 - 11905: 0xDF73, 36978 - 11905: 0xDF74, 36979 - 11905: 0xDF75, 36980 - 11905: 0xE5E0, 36981 - 11905: 0xD7F1, 36982 - 11905: 0xDF76, 36983 - 11905: 0xDF77, 36984 - 11905: 0xDF78, 36985 - 11905: 0xDF79, 36986 - 11905: 0xDF7A, 36987 - 11905: 0xDF7B, 36988 - 11905: 0xDF7C, 36989 - 11905: 0xE5E1, 36990 - 11905: 0xDF7D, 36991 - 11905: 0xB1DC, 36992 - 11905: 0xD1FB, 36993 - 11905: 0xDF7E, 36994 - 11905: 0xE5E2, 36995 - 11905: 0xE5E4, 36996 - 11905: 0xDF80, 36997 - 11905: 0xDF81, 36998 - 11905: 0xDF82, 36999 - 11905: 0xDF83, 37000 - 11905: 0xE5E3, 37001 - 11905: 0xDF84, 37002 - 11905: 0xDF85, 37003 - 11905: 0xE5E5, 37004 - 11905: 0xDF86, 37005 - 11905: 0xDF87, 37006 - 11905: 0xDF88, 37007 - 11905: 0xDF89, 37008 - 11905: 0xDF8A, 37009 - 11905: 0xD2D8, 37010 - 11905: 0xDF8B, 37011 - 11905: 0xB5CB, 37012 - 11905: 0xDF8C, 37013 - 11905: 0xE7DF, 37014 - 11905: 0xDF8D, 37015 - 11905: 0xDAF5, 37016 - 11905: 0xDF8E, 37017 - 11905: 0xDAF8, 37018 - 11905: 0xDF8F, 37019 - 11905: 0xDAF6, 37020 - 11905: 0xDF90, 37021 - 11905: 0xDAF7, 37022 - 11905: 0xDF91, 37023 - 11905: 0xDF92, 37024 - 11905: 0xDF93, 37025 - 11905: 0xDAFA, 37026 - 11905: 0xD0CF, 37027 - 11905: 0xC4C7, 37028 - 11905: 0xDF94, 37029 - 11905: 0xDF95, 37030 - 11905: 0xB0EE, 37031 - 11905: 0xDF96, 37032 - 11905: 0xDF97, 37033 - 11905: 0xDF98, 37034 - 11905: 0xD0B0, 37035 - 11905: 0xDF99, 37036 - 11905: 0xDAF9, 37037 - 11905: 0xDF9A, 37038 - 11905: 0xD3CA, 37039 - 11905: 0xBAAA, 37040 - 11905: 0xDBA2, 37041 - 11905: 0xC7F1, 37042 - 11905: 0xDF9B, 37043 - 11905: 0xDAFC, 37044 - 11905: 0xDAFB, 37045 - 11905: 0xC9DB, 37046 - 11905: 0xDAFD, 37047 - 11905: 0xDF9C, 37048 - 11905: 0xDBA1, 37049 - 11905: 0xD7DE, 37050 - 11905: 0xDAFE, 37051 - 11905: 0xC1DA, 37052 - 11905: 0xDF9D, 37053 - 11905: 0xDF9E, 37054 - 11905: 0xDBA5, 37055 - 11905: 0xDF9F, 37056 - 11905: 0xDFA0, 37057 - 11905: 0xD3F4, 37058 - 11905: 0xE040, 37059 - 11905: 0xE041, 37060 - 11905: 0xDBA7, 37061 - 11905: 0xDBA4, 37062 - 11905: 0xE042, 37063 - 11905: 0xDBA8, 37064 - 11905: 0xE043, 37065 - 11905: 0xE044, 37066 - 11905: 0xBDBC, 37067 - 11905: 0xE045, 37068 - 11905: 0xE046, 37069 - 11905: 0xE047, 37070 - 11905: 0xC0C9, 37071 - 11905: 0xDBA3, 37072 - 11905: 0xDBA6, 37073 - 11905: 0xD6A3, 37074 - 11905: 0xE048, 37075 - 11905: 0xDBA9, 37076 - 11905: 0xE049, 37077 - 11905: 0xE04A, 37078 - 11905: 0xE04B, 37079 - 11905: 0xDBAD, 37080 - 11905: 0xE04C, 37081 - 11905: 0xE04D, 37082 - 11905: 0xE04E, 37083 - 11905: 0xDBAE, 37084 - 11905: 0xDBAC, 37085 - 11905: 0xBAC2, 37086 - 11905: 0xE04F, 37087 - 11905: 0xE050, 37088 - 11905: 0xE051, 37089 - 11905: 0xBFA4, 37090 - 11905: 0xDBAB, 37091 - 11905: 0xE052, 37092 - 11905: 0xE053, 37093 - 11905: 0xE054, 37094 - 11905: 0xDBAA, 37095 - 11905: 0xD4C7, 37096 - 11905: 0xB2BF, 37097 - 11905: 0xE055, 37098 - 11905: 0xE056, 37099 - 11905: 0xDBAF, 37100 - 11905: 0xE057, 37101 - 11905: 0xB9F9, 37102 - 11905: 0xE058, 37103 - 11905: 0xDBB0, 37104 - 11905: 0xE059, 37105 - 11905: 0xE05A, 37106 - 11905: 0xE05B, 37107 - 11905: 0xE05C, 37108 - 11905: 0xB3BB, 37109 - 11905: 0xE05D, 37110 - 11905: 0xE05E, 37111 - 11905: 0xE05F, 37112 - 11905: 0xB5A6, 37113 - 11905: 0xE060, 37114 - 11905: 0xE061, 37115 - 11905: 0xE062, 37116 - 11905: 0xE063, 37117 - 11905: 0xB6BC, 37118 - 11905: 0xDBB1, 37119 - 11905: 0xE064, 37120 - 11905: 0xE065, 37121 - 11905: 0xE066, 37122 - 11905: 0xB6F5, 37123 - 11905: 0xE067, 37124 - 11905: 0xDBB2, 37125 - 11905: 0xE068, 37126 - 11905: 0xE069, 37127 - 11905: 0xE06A, 37128 - 11905: 0xE06B, 37129 - 11905: 0xE06C, 37130 - 11905: 0xE06D, 37131 - 11905: 0xE06E, 37132 - 11905: 0xE06F, 37133 - 11905: 0xE070, 37134 - 11905: 0xE071, 37135 - 11905: 0xE072, 37136 - 11905: 0xE073, 37137 - 11905: 0xE074, 37138 - 11905: 0xE075, 37139 - 11905: 0xE076, 37140 - 11905: 0xE077, 37141 - 11905: 0xE078, 37142 - 11905: 0xE079, 37143 - 11905: 0xE07A, 37144 - 11905: 0xE07B, 37145 - 11905: 0xB1C9, 37146 - 11905: 0xE07C, 37147 - 11905: 0xE07D, 37148 - 11905: 0xE07E, 37149 - 11905: 0xE080, 37150 - 11905: 0xDBB4, 37151 - 11905: 0xE081, 37152 - 11905: 0xE082, 37153 - 11905: 0xE083, 37154 - 11905: 0xDBB3, 37155 - 11905: 0xDBB5, 37156 - 11905: 0xE084, 37157 - 11905: 0xE085, 37158 - 11905: 0xE086, 37159 - 11905: 0xE087, 37160 - 11905: 0xE088, 37161 - 11905: 0xE089, 37162 - 11905: 0xE08A, 37163 - 11905: 0xE08B, 37164 - 11905: 0xE08C, 37165 - 11905: 0xE08D, 37166 - 11905: 0xE08E, 37167 - 11905: 0xDBB7, 37168 - 11905: 0xE08F, 37169 - 11905: 0xDBB6, 37170 - 11905: 0xE090, 37171 - 11905: 0xE091, 37172 - 11905: 0xE092, 37173 - 11905: 0xE093, 37174 - 11905: 0xE094, 37175 - 11905: 0xE095, 37176 - 11905: 0xE096, 37177 - 11905: 0xDBB8, 37178 - 11905: 0xE097, 37179 - 11905: 0xE098, 37180 - 11905: 0xE099, 37181 - 11905: 0xE09A, 37182 - 11905: 0xE09B, 37183 - 11905: 0xE09C, 37184 - 11905: 0xE09D, 37185 - 11905: 0xE09E, 37186 - 11905: 0xE09F, 37187 - 11905: 0xDBB9, 37188 - 11905: 0xE0A0, 37189 - 11905: 0xE140, 37190 - 11905: 0xDBBA, 37191 - 11905: 0xE141, 37192 - 11905: 0xE142, 37193 - 11905: 0xD3CF, 37194 - 11905: 0xF4FA, 37195 - 11905: 0xC7F5, 37196 - 11905: 0xD7C3, 37197 - 11905: 0xC5E4, 37198 - 11905: 0xF4FC, 37199 - 11905: 0xF4FD, 37200 - 11905: 0xF4FB, 37201 - 11905: 0xE143, 37202 - 11905: 0xBEC6, 37203 - 11905: 0xE144, 37204 - 11905: 0xE145, 37205 - 11905: 0xE146, 37206 - 11905: 0xE147, 37207 - 11905: 0xD0EF, 37208 - 11905: 0xE148, 37209 - 11905: 0xE149, 37210 - 11905: 0xB7D3, 37211 - 11905: 0xE14A, 37212 - 11905: 0xE14B, 37213 - 11905: 0xD4CD, 37214 - 11905: 0xCCAA, 37215 - 11905: 0xE14C, 37216 - 11905: 0xE14D, 37217 - 11905: 0xF5A2, 37218 - 11905: 0xF5A1, 37219 - 11905: 0xBAA8, 37220 - 11905: 0xF4FE, 37221 - 11905: 0xCBD6, 37222 - 11905: 0xE14E, 37223 - 11905: 0xE14F, 37224 - 11905: 0xE150, 37225 - 11905: 0xF5A4, 37226 - 11905: 0xC0D2, 37227 - 11905: 0xE151, 37228 - 11905: 0xB3EA, 37229 - 11905: 0xE152, 37230 - 11905: 0xCDAA, 37231 - 11905: 0xF5A5, 37232 - 11905: 0xF5A3, 37233 - 11905: 0xBDB4, 37234 - 11905: 0xF5A8, 37235 - 11905: 0xE153, 37236 - 11905: 0xF5A9, 37237 - 11905: 0xBDCD, 37238 - 11905: 0xC3B8, 37239 - 11905: 0xBFE1, 37240 - 11905: 0xCBE1, 37241 - 11905: 0xF5AA, 37242 - 11905: 0xE154, 37243 - 11905: 0xE155, 37244 - 11905: 0xE156, 37245 - 11905: 0xF5A6, 37246 - 11905: 0xF5A7, 37247 - 11905: 0xC4F0, 37248 - 11905: 0xE157, 37249 - 11905: 0xE158, 37250 - 11905: 0xE159, 37251 - 11905: 0xE15A, 37252 - 11905: 0xE15B, 37253 - 11905: 0xF5AC, 37254 - 11905: 0xE15C, 37255 - 11905: 0xB4BC, 37256 - 11905: 0xE15D, 37257 - 11905: 0xD7ED, 37258 - 11905: 0xE15E, 37259 - 11905: 0xB4D7, 37260 - 11905: 0xF5AB, 37261 - 11905: 0xF5AE, 37262 - 11905: 0xE15F, 37263 - 11905: 0xE160, 37264 - 11905: 0xF5AD, 37265 - 11905: 0xF5AF, 37266 - 11905: 0xD0D1, 37267 - 11905: 0xE161, 37268 - 11905: 0xE162, 37269 - 11905: 0xE163, 37270 - 11905: 0xE164, 37271 - 11905: 0xE165, 37272 - 11905: 0xE166, 37273 - 11905: 0xE167, 37274 - 11905: 0xC3D1, 37275 - 11905: 0xC8A9, 37276 - 11905: 0xE168, 37277 - 11905: 0xE169, 37278 - 11905: 0xE16A, 37279 - 11905: 0xE16B, 37280 - 11905: 0xE16C, 37281 - 11905: 0xE16D, 37282 - 11905: 0xF5B0, 37283 - 11905: 0xF5B1, 37284 - 11905: 0xE16E, 37285 - 11905: 0xE16F, 37286 - 11905: 0xE170, 37287 - 11905: 0xE171, 37288 - 11905: 0xE172, 37289 - 11905: 0xE173, 37290 - 11905: 0xF5B2, 37291 - 11905: 0xE174, 37292 - 11905: 0xE175, 37293 - 11905: 0xF5B3, 37294 - 11905: 0xF5B4, 37295 - 11905: 0xF5B5, 37296 - 11905: 0xE176, 37297 - 11905: 0xE177, 37298 - 11905: 0xE178, 37299 - 11905: 0xE179, 37300 - 11905: 0xF5B7, 37301 - 11905: 0xF5B6, 37302 - 11905: 0xE17A, 37303 - 11905: 0xE17B, 37304 - 11905: 0xE17C, 37305 - 11905: 0xE17D, 37306 - 11905: 0xF5B8, 37307 - 11905: 0xE17E, 37308 - 11905: 0xE180, 37309 - 11905: 0xE181, 37310 - 11905: 0xE182, 37311 - 11905: 0xE183, 37312 - 11905: 0xE184, 37313 - 11905: 0xE185, 37314 - 11905: 0xE186, 37315 - 11905: 0xE187, 37316 - 11905: 0xE188, 37317 - 11905: 0xE189, 37318 - 11905: 0xE18A, 37319 - 11905: 0xB2C9, 37320 - 11905: 0xE18B, 37321 - 11905: 0xD3D4, 37322 - 11905: 0xCACD, 37323 - 11905: 0xE18C, 37324 - 11905: 0xC0EF, 37325 - 11905: 0xD6D8, 37326 - 11905: 0xD2B0, 37327 - 11905: 0xC1BF, 37328 - 11905: 0xE18D, 37329 - 11905: 0xBDF0, 37330 - 11905: 0xE18E, 37331 - 11905: 0xE18F, 37332 - 11905: 0xE190, 37333 - 11905: 0xE191, 37334 - 11905: 0xE192, 37335 - 11905: 0xE193, 37336 - 11905: 0xE194, 37337 - 11905: 0xE195, 37338 - 11905: 0xE196, 37339 - 11905: 0xE197, 37340 - 11905: 0xB8AA, 37341 - 11905: 0xE198, 37342 - 11905: 0xE199, 37343 - 11905: 0xE19A, 37344 - 11905: 0xE19B, 37345 - 11905: 0xE19C, 37346 - 11905: 0xE19D, 37347 - 11905: 0xE19E, 37348 - 11905: 0xE19F, 37349 - 11905: 0xE1A0, 37350 - 11905: 0xE240, 37351 - 11905: 0xE241, 37352 - 11905: 0xE242, 37353 - 11905: 0xE243, 37354 - 11905: 0xE244, 37355 - 11905: 0xE245, 37356 - 11905: 0xE246, 37357 - 11905: 0xE247, 37358 - 11905: 0xE248, 37359 - 11905: 0xE249, 37360 - 11905: 0xE24A, 37361 - 11905: 0xE24B, 37362 - 11905: 0xE24C, 37363 - 11905: 0xE24D, 37364 - 11905: 0xE24E, 37365 - 11905: 0xE24F, 37366 - 11905: 0xE250, 37367 - 11905: 0xE251, 37368 - 11905: 0xE252, 37369 - 11905: 0xE253, 37370 - 11905: 0xE254, 37371 - 11905: 0xE255, 37372 - 11905: 0xE256, 37373 - 11905: 0xE257, 37374 - 11905: 0xE258, 37375 - 11905: 0xE259, 37376 - 11905: 0xE25A, 37377 - 11905: 0xE25B, 37378 - 11905: 0xE25C, 37379 - 11905: 0xE25D, 37380 - 11905: 0xE25E, 37381 - 11905: 0xE25F, 37382 - 11905: 0xE260, 37383 - 11905: 0xE261, 37384 - 11905: 0xE262, 37385 - 11905: 0xE263, 37386 - 11905: 0xE264, 37387 - 11905: 0xE265, 37388 - 11905: 0xE266, 37389 - 11905: 0xE267, 37390 - 11905: 0xE268, 37391 - 11905: 0xE269, 37392 - 11905: 0xE26A, 37393 - 11905: 0xE26B, 37394 - 11905: 0xE26C, 37395 - 11905: 0xE26D, 37396 - 11905: 0xE26E, 37397 - 11905: 0xE26F, 37398 - 11905: 0xE270, 37399 - 11905: 0xE271, 37400 - 11905: 0xE272, 37401 - 11905: 0xE273, 37402 - 11905: 0xE274, 37403 - 11905: 0xE275, 37404 - 11905: 0xE276, 37405 - 11905: 0xE277, 37406 - 11905: 0xE278, 37407 - 11905: 0xE279, 37408 - 11905: 0xE27A, 37409 - 11905: 0xE27B, 37410 - 11905: 0xE27C, 37411 - 11905: 0xE27D, 37412 - 11905: 0xE27E, 37413 - 11905: 0xE280, 37414 - 11905: 0xE281, 37415 - 11905: 0xE282, 37416 - 11905: 0xE283, 37417 - 11905: 0xE284, 37418 - 11905: 0xE285, 37419 - 11905: 0xE286, 37420 - 11905: 0xE287, 37421 - 11905: 0xE288, 37422 - 11905: 0xE289, 37423 - 11905: 0xE28A, 37424 - 11905: 0xE28B, 37425 - 11905: 0xE28C, 37426 - 11905: 0xE28D, 37427 - 11905: 0xE28E, 37428 - 11905: 0xE28F, 37429 - 11905: 0xE290, 37430 - 11905: 0xE291, 37431 - 11905: 0xE292, 37432 - 11905: 0xE293, 37433 - 11905: 0xE294, 37434 - 11905: 0xE295, 37435 - 11905: 0xE296, 37436 - 11905: 0xE297, 37437 - 11905: 0xE298, 37438 - 11905: 0xE299, 37439 - 11905: 0xE29A, 37440 - 11905: 0xE29B, 37441 - 11905: 0xE29C, 37442 - 11905: 0xE29D, 37443 - 11905: 0xE29E, 37444 - 11905: 0xE29F, 37445 - 11905: 0xE2A0, 37446 - 11905: 0xE340, 37447 - 11905: 0xE341, 37448 - 11905: 0xE342, 37449 - 11905: 0xE343, 37450 - 11905: 0xE344, 37451 - 11905: 0xE345, 37452 - 11905: 0xE346, 37453 - 11905: 0xE347, 37454 - 11905: 0xE348, 37455 - 11905: 0xE349, 37456 - 11905: 0xE34A, 37457 - 11905: 0xE34B, 37458 - 11905: 0xE34C, 37459 - 11905: 0xE34D, 37460 - 11905: 0xE34E, 37461 - 11905: 0xE34F, 37462 - 11905: 0xE350, 37463 - 11905: 0xE351, 37464 - 11905: 0xE352, 37465 - 11905: 0xE353, 37466 - 11905: 0xE354, 37467 - 11905: 0xE355, 37468 - 11905: 0xE356, 37469 - 11905: 0xE357, 37470 - 11905: 0xE358, 37471 - 11905: 0xE359, 37472 - 11905: 0xE35A, 37473 - 11905: 0xE35B, 37474 - 11905: 0xE35C, 37475 - 11905: 0xE35D, 37476 - 11905: 0xE35E, 37477 - 11905: 0xE35F, 37478 - 11905: 0xE360, 37479 - 11905: 0xE361, 37480 - 11905: 0xE362, 37481 - 11905: 0xE363, 37482 - 11905: 0xE364, 37483 - 11905: 0xE365, 37484 - 11905: 0xE366, 37485 - 11905: 0xE367, 37486 - 11905: 0xE368, 37487 - 11905: 0xE369, 37488 - 11905: 0xE36A, 37489 - 11905: 0xE36B, 37490 - 11905: 0xE36C, 37491 - 11905: 0xE36D, 37492 - 11905: 0xBCF8, 37493 - 11905: 0xE36E, 37494 - 11905: 0xE36F, 37495 - 11905: 0xE370, 37496 - 11905: 0xE371, 37497 - 11905: 0xE372, 37498 - 11905: 0xE373, 37499 - 11905: 0xE374, 37500 - 11905: 0xE375, 37501 - 11905: 0xE376, 37502 - 11905: 0xE377, 37503 - 11905: 0xE378, 37504 - 11905: 0xE379, 37505 - 11905: 0xE37A, 37506 - 11905: 0xE37B, 37507 - 11905: 0xE37C, 37508 - 11905: 0xE37D, 37509 - 11905: 0xE37E, 37510 - 11905: 0xE380, 37511 - 11905: 0xE381, 37512 - 11905: 0xE382, 37513 - 11905: 0xE383, 37514 - 11905: 0xE384, 37515 - 11905: 0xE385, 37516 - 11905: 0xE386, 37517 - 11905: 0xE387, 37518 - 11905: 0xF6C6, 37519 - 11905: 0xE388, 37520 - 11905: 0xE389, 37521 - 11905: 0xE38A, 37522 - 11905: 0xE38B, 37523 - 11905: 0xE38C, 37524 - 11905: 0xE38D, 37525 - 11905: 0xE38E, 37526 - 11905: 0xE38F, 37527 - 11905: 0xE390, 37528 - 11905: 0xE391, 37529 - 11905: 0xE392, 37530 - 11905: 0xE393, 37531 - 11905: 0xE394, 37532 - 11905: 0xE395, 37533 - 11905: 0xE396, 37534 - 11905: 0xE397, 37535 - 11905: 0xE398, 37536 - 11905: 0xE399, 37537 - 11905: 0xE39A, 37538 - 11905: 0xE39B, 37539 - 11905: 0xE39C, 37540 - 11905: 0xE39D, 37541 - 11905: 0xE39E, 37542 - 11905: 0xE39F, 37543 - 11905: 0xE3A0, 37544 - 11905: 0xE440, 37545 - 11905: 0xE441, 37546 - 11905: 0xE442, 37547 - 11905: 0xE443, 37548 - 11905: 0xE444, 37549 - 11905: 0xE445, 37550 - 11905: 0xF6C7, 37551 - 11905: 0xE446, 37552 - 11905: 0xE447, 37553 - 11905: 0xE448, 37554 - 11905: 0xE449, 37555 - 11905: 0xE44A, 37556 - 11905: 0xE44B, 37557 - 11905: 0xE44C, 37558 - 11905: 0xE44D, 37559 - 11905: 0xE44E, 37560 - 11905: 0xE44F, 37561 - 11905: 0xE450, 37562 - 11905: 0xE451, 37563 - 11905: 0xE452, 37564 - 11905: 0xE453, 37565 - 11905: 0xE454, 37566 - 11905: 0xE455, 37567 - 11905: 0xE456, 37568 - 11905: 0xE457, 37569 - 11905: 0xE458, 37570 - 11905: 0xE459, 37571 - 11905: 0xE45A, 37572 - 11905: 0xE45B, 37573 - 11905: 0xE45C, 37574 - 11905: 0xE45D, 37575 - 11905: 0xE45E, 37576 - 11905: 0xF6C8, 37577 - 11905: 0xE45F, 37578 - 11905: 0xE460, 37579 - 11905: 0xE461, 37580 - 11905: 0xE462, 37581 - 11905: 0xE463, 37582 - 11905: 0xE464, 37583 - 11905: 0xE465, 37584 - 11905: 0xE466, 37585 - 11905: 0xE467, 37586 - 11905: 0xE468, 37587 - 11905: 0xE469, 37588 - 11905: 0xE46A, 37589 - 11905: 0xE46B, 37590 - 11905: 0xE46C, 37591 - 11905: 0xE46D, 37592 - 11905: 0xE46E, 37593 - 11905: 0xE46F, 37594 - 11905: 0xE470, 37595 - 11905: 0xE471, 37596 - 11905: 0xE472, 37597 - 11905: 0xE473, 37598 - 11905: 0xE474, 37599 - 11905: 0xE475, 37600 - 11905: 0xE476, 37601 - 11905: 0xE477, 37602 - 11905: 0xE478, 37603 - 11905: 0xE479, 37604 - 11905: 0xE47A, 37605 - 11905: 0xE47B, 37606 - 11905: 0xE47C, 37607 - 11905: 0xE47D, 37608 - 11905: 0xE47E, 37609 - 11905: 0xE480, 37610 - 11905: 0xE481, 37611 - 11905: 0xE482, 37612 - 11905: 0xE483, 37613 - 11905: 0xE484, 37614 - 11905: 0xE485, 37615 - 11905: 0xE486, 37616 - 11905: 0xE487, 37617 - 11905: 0xE488, 37618 - 11905: 0xE489, 37619 - 11905: 0xE48A, 37620 - 11905: 0xE48B, 37621 - 11905: 0xE48C, 37622 - 11905: 0xE48D, 37623 - 11905: 0xE48E, 37624 - 11905: 0xE48F, 37625 - 11905: 0xE490, 37626 - 11905: 0xE491, 37627 - 11905: 0xE492, 37628 - 11905: 0xE493, 37629 - 11905: 0xE494, 37630 - 11905: 0xE495, 37631 - 11905: 0xE496, 37632 - 11905: 0xE497, 37633 - 11905: 0xE498, 37634 - 11905: 0xE499, 37635 - 11905: 0xE49A, 37636 - 11905: 0xE49B, 37637 - 11905: 0xE49C, 37638 - 11905: 0xE49D, 37639 - 11905: 0xE49E, 37640 - 11905: 0xE49F, 37641 - 11905: 0xE4A0, 37642 - 11905: 0xE540, 37643 - 11905: 0xE541, 37644 - 11905: 0xE542, 37645 - 11905: 0xE543, 37646 - 11905: 0xE544, 37647 - 11905: 0xE545, 37648 - 11905: 0xE546, 37649 - 11905: 0xE547, 37650 - 11905: 0xE548, 37651 - 11905: 0xE549, 37652 - 11905: 0xE54A, 37653 - 11905: 0xE54B, 37654 - 11905: 0xE54C, 37655 - 11905: 0xE54D, 37656 - 11905: 0xE54E, 37657 - 11905: 0xE54F, 37658 - 11905: 0xE550, 37659 - 11905: 0xE551, 37660 - 11905: 0xE552, 37661 - 11905: 0xE553, 37662 - 11905: 0xE554, 37663 - 11905: 0xE555, 37664 - 11905: 0xE556, 37665 - 11905: 0xE557, 37666 - 11905: 0xE558, 37667 - 11905: 0xE559, 37668 - 11905: 0xE55A, 37669 - 11905: 0xE55B, 37670 - 11905: 0xE55C, 37671 - 11905: 0xE55D, 37672 - 11905: 0xE55E, 37673 - 11905: 0xE55F, 37674 - 11905: 0xE560, 37675 - 11905: 0xE561, 37676 - 11905: 0xE562, 37677 - 11905: 0xE563, 37678 - 11905: 0xE564, 37679 - 11905: 0xE565, 37680 - 11905: 0xE566, 37681 - 11905: 0xE567, 37682 - 11905: 0xE568, 37683 - 11905: 0xE569, 37684 - 11905: 0xE56A, 37685 - 11905: 0xE56B, 37686 - 11905: 0xE56C, 37687 - 11905: 0xE56D, 37688 - 11905: 0xE56E, 37689 - 11905: 0xE56F, 37690 - 11905: 0xE570, 37691 - 11905: 0xE571, 37692 - 11905: 0xE572, 37693 - 11905: 0xE573, 37694 - 11905: 0xF6C9, 37695 - 11905: 0xE574, 37696 - 11905: 0xE575, 37697 - 11905: 0xE576, 37698 - 11905: 0xE577, 37699 - 11905: 0xE578, 37700 - 11905: 0xE579, 37701 - 11905: 0xE57A, 37702 - 11905: 0xE57B, 37703 - 11905: 0xE57C, 37704 - 11905: 0xE57D, 37705 - 11905: 0xE57E, 37706 - 11905: 0xE580, 37707 - 11905: 0xE581, 37708 - 11905: 0xE582, 37709 - 11905: 0xE583, 37710 - 11905: 0xE584, 37711 - 11905: 0xE585, 37712 - 11905: 0xE586, 37713 - 11905: 0xE587, 37714 - 11905: 0xE588, 37715 - 11905: 0xE589, 37716 - 11905: 0xE58A, 37717 - 11905: 0xE58B, 37718 - 11905: 0xE58C, 37719 - 11905: 0xE58D, 37720 - 11905: 0xE58E, 37721 - 11905: 0xE58F, 37722 - 11905: 0xE590, 37723 - 11905: 0xE591, 37724 - 11905: 0xE592, 37725 - 11905: 0xE593, 37726 - 11905: 0xE594, 37727 - 11905: 0xE595, 37728 - 11905: 0xE596, 37729 - 11905: 0xE597, 37730 - 11905: 0xE598, 37731 - 11905: 0xE599, 37732 - 11905: 0xE59A, 37733 - 11905: 0xE59B, 37734 - 11905: 0xE59C, 37735 - 11905: 0xE59D, 37736 - 11905: 0xE59E, 37737 - 11905: 0xE59F, 37738 - 11905: 0xF6CA, 37739 - 11905: 0xE5A0, 37740 - 11905: 0xE640, 37741 - 11905: 0xE641, 37742 - 11905: 0xE642, 37743 - 11905: 0xE643, 37744 - 11905: 0xE644, 37745 - 11905: 0xE645, 37746 - 11905: 0xE646, 37747 - 11905: 0xE647, 37748 - 11905: 0xE648, 37749 - 11905: 0xE649, 37750 - 11905: 0xE64A, 37751 - 11905: 0xE64B, 37752 - 11905: 0xE64C, 37753 - 11905: 0xE64D, 37754 - 11905: 0xE64E, 37755 - 11905: 0xE64F, 37756 - 11905: 0xE650, 37757 - 11905: 0xE651, 37758 - 11905: 0xE652, 37759 - 11905: 0xE653, 37760 - 11905: 0xE654, 37761 - 11905: 0xE655, 37762 - 11905: 0xE656, 37763 - 11905: 0xE657, 37764 - 11905: 0xE658, 37765 - 11905: 0xE659, 37766 - 11905: 0xE65A, 37767 - 11905: 0xE65B, 37768 - 11905: 0xE65C, 37769 - 11905: 0xE65D, 37770 - 11905: 0xE65E, 37771 - 11905: 0xE65F, 37772 - 11905: 0xE660, 37773 - 11905: 0xE661, 37774 - 11905: 0xE662, 37775 - 11905: 0xF6CC, 37776 - 11905: 0xE663, 37777 - 11905: 0xE664, 37778 - 11905: 0xE665, 37779 - 11905: 0xE666, 37780 - 11905: 0xE667, 37781 - 11905: 0xE668, 37782 - 11905: 0xE669, 37783 - 11905: 0xE66A, 37784 - 11905: 0xE66B, 37785 - 11905: 0xE66C, 37786 - 11905: 0xE66D, 37787 - 11905: 0xE66E, 37788 - 11905: 0xE66F, 37789 - 11905: 0xE670, 37790 - 11905: 0xE671, 37791 - 11905: 0xE672, 37792 - 11905: 0xE673, 37793 - 11905: 0xE674, 37794 - 11905: 0xE675, 37795 - 11905: 0xE676, 37796 - 11905: 0xE677, 37797 - 11905: 0xE678, 37798 - 11905: 0xE679, 37799 - 11905: 0xE67A, 37800 - 11905: 0xE67B, 37801 - 11905: 0xE67C, 37802 - 11905: 0xE67D, 37803 - 11905: 0xE67E, 37804 - 11905: 0xE680, 37805 - 11905: 0xE681, 37806 - 11905: 0xE682, 37807 - 11905: 0xE683, 37808 - 11905: 0xE684, 37809 - 11905: 0xE685, 37810 - 11905: 0xE686, 37811 - 11905: 0xE687, 37812 - 11905: 0xE688, 37813 - 11905: 0xE689, 37814 - 11905: 0xE68A, 37815 - 11905: 0xE68B, 37816 - 11905: 0xE68C, 37817 - 11905: 0xE68D, 37818 - 11905: 0xE68E, 37819 - 11905: 0xE68F, 37820 - 11905: 0xE690, 37821 - 11905: 0xE691, 37822 - 11905: 0xE692, 37823 - 11905: 0xE693, 37824 - 11905: 0xE694, 37825 - 11905: 0xE695, 37826 - 11905: 0xE696, 37827 - 11905: 0xE697, 37828 - 11905: 0xE698, 37829 - 11905: 0xE699, 37830 - 11905: 0xE69A, 37831 - 11905: 0xE69B, 37832 - 11905: 0xE69C, 37833 - 11905: 0xE69D, 37834 - 11905: 0xF6CB, 37835 - 11905: 0xE69E, 37836 - 11905: 0xE69F, 37837 - 11905: 0xE6A0, 37838 - 11905: 0xE740, 37839 - 11905: 0xE741, 37840 - 11905: 0xE742, 37841 - 11905: 0xE743, 37842 - 11905: 0xE744, 37843 - 11905: 0xE745, 37844 - 11905: 0xE746, 37845 - 11905: 0xE747, 37846 - 11905: 0xF7E9, 37847 - 11905: 0xE748, 37848 - 11905: 0xE749, 37849 - 11905: 0xE74A, 37850 - 11905: 0xE74B, 37851 - 11905: 0xE74C, 37852 - 11905: 0xE74D, 37853 - 11905: 0xE74E, 37854 - 11905: 0xE74F, 37855 - 11905: 0xE750, 37856 - 11905: 0xE751, 37857 - 11905: 0xE752, 37858 - 11905: 0xE753, 37859 - 11905: 0xE754, 37860 - 11905: 0xE755, 37861 - 11905: 0xE756, 37862 - 11905: 0xE757, 37863 - 11905: 0xE758, 37864 - 11905: 0xE759, 37865 - 11905: 0xE75A, 37866 - 11905: 0xE75B, 37867 - 11905: 0xE75C, 37868 - 11905: 0xE75D, 37869 - 11905: 0xE75E, 37870 - 11905: 0xE75F, 37871 - 11905: 0xE760, 37872 - 11905: 0xE761, 37873 - 11905: 0xE762, 37874 - 11905: 0xE763, 37875 - 11905: 0xE764, 37876 - 11905: 0xE765, 37877 - 11905: 0xE766, 37878 - 11905: 0xE767, 37879 - 11905: 0xE768, 37880 - 11905: 0xE769, 37881 - 11905: 0xE76A, 37882 - 11905: 0xE76B, 37883 - 11905: 0xE76C, 37884 - 11905: 0xE76D, 37885 - 11905: 0xE76E, 37886 - 11905: 0xE76F, 37887 - 11905: 0xE770, 37888 - 11905: 0xE771, 37889 - 11905: 0xE772, 37890 - 11905: 0xE773, 37891 - 11905: 0xE774, 37892 - 11905: 0xE775, 37893 - 11905: 0xE776, 37894 - 11905: 0xE777, 37895 - 11905: 0xE778, 37896 - 11905: 0xE779, 37897 - 11905: 0xE77A, 37898 - 11905: 0xE77B, 37899 - 11905: 0xE77C, 37900 - 11905: 0xE77D, 37901 - 11905: 0xE77E, 37902 - 11905: 0xE780, 37903 - 11905: 0xE781, 37904 - 11905: 0xE782, 37905 - 11905: 0xE783, 37906 - 11905: 0xE784, 37907 - 11905: 0xE785, 37908 - 11905: 0xE786, 37909 - 11905: 0xE787, 37910 - 11905: 0xE788, 37911 - 11905: 0xE789, 37912 - 11905: 0xE78A, 37913 - 11905: 0xE78B, 37914 - 11905: 0xE78C, 37915 - 11905: 0xE78D, 37916 - 11905: 0xE78E, 37917 - 11905: 0xE78F, 37918 - 11905: 0xE790, 37919 - 11905: 0xE791, 37920 - 11905: 0xE792, 37921 - 11905: 0xE793, 37922 - 11905: 0xE794, 37923 - 11905: 0xE795, 37924 - 11905: 0xE796, 37925 - 11905: 0xE797, 37926 - 11905: 0xE798, 37927 - 11905: 0xE799, 37928 - 11905: 0xE79A, 37929 - 11905: 0xE79B, 37930 - 11905: 0xE79C, 37931 - 11905: 0xE79D, 37932 - 11905: 0xE79E, 37933 - 11905: 0xE79F, 37934 - 11905: 0xE7A0, 37935 - 11905: 0xE840, 37936 - 11905: 0xE841, 37937 - 11905: 0xE842, 37938 - 11905: 0xE843, 37939 - 11905: 0xE844, 37940 - 11905: 0xE845, 37941 - 11905: 0xE846, 37942 - 11905: 0xE847, 37943 - 11905: 0xE848, 37944 - 11905: 0xE849, 37945 - 11905: 0xE84A, 37946 - 11905: 0xE84B, 37947 - 11905: 0xE84C, 37948 - 11905: 0xE84D, 37949 - 11905: 0xE84E, 37950 - 11905: 0xF6CD, 37951 - 11905: 0xE84F, 37952 - 11905: 0xE850, 37953 - 11905: 0xE851, 37954 - 11905: 0xE852, 37955 - 11905: 0xE853, 37956 - 11905: 0xE854, 37957 - 11905: 0xE855, 37958 - 11905: 0xE856, 37959 - 11905: 0xE857, 37960 - 11905: 0xE858, 37961 - 11905: 0xE859, 37962 - 11905: 0xE85A, 37963 - 11905: 0xE85B, 37964 - 11905: 0xE85C, 37965 - 11905: 0xE85D, 37966 - 11905: 0xE85E, 37967 - 11905: 0xE85F, 37968 - 11905: 0xE860, 37969 - 11905: 0xE861, 37970 - 11905: 0xE862, 37971 - 11905: 0xE863, 37972 - 11905: 0xE864, 37973 - 11905: 0xE865, 37974 - 11905: 0xE866, 37975 - 11905: 0xE867, 37976 - 11905: 0xE868, 37977 - 11905: 0xE869, 37978 - 11905: 0xE86A, 37979 - 11905: 0xE86B, 37980 - 11905: 0xE86C, 37981 - 11905: 0xE86D, 37982 - 11905: 0xE86E, 37983 - 11905: 0xE86F, 37984 - 11905: 0xE870, 37985 - 11905: 0xE871, 37986 - 11905: 0xE872, 37987 - 11905: 0xE873, 37988 - 11905: 0xE874, 37989 - 11905: 0xE875, 37990 - 11905: 0xE876, 37991 - 11905: 0xE877, 37992 - 11905: 0xE878, 37993 - 11905: 0xE879, 37994 - 11905: 0xE87A, 37995 - 11905: 0xF6CE, 37996 - 11905: 0xE87B, 37997 - 11905: 0xE87C, 37998 - 11905: 0xE87D, 37999 - 11905: 0xE87E, 38000 - 11905: 0xE880, 38001 - 11905: 0xE881, 38002 - 11905: 0xE882, 38003 - 11905: 0xE883, 38004 - 11905: 0xE884, 38005 - 11905: 0xE885, 38006 - 11905: 0xE886, 38007 - 11905: 0xE887, 38008 - 11905: 0xE888, 38009 - 11905: 0xE889, 38010 - 11905: 0xE88A, 38011 - 11905: 0xE88B, 38012 - 11905: 0xE88C, 38013 - 11905: 0xE88D, 38014 - 11905: 0xE88E, 38015 - 11905: 0xE88F, 38016 - 11905: 0xE890, 38017 - 11905: 0xE891, 38018 - 11905: 0xE892, 38019 - 11905: 0xE893, 38020 - 11905: 0xE894, 38021 - 11905: 0xEEC4, 38022 - 11905: 0xEEC5, 38023 - 11905: 0xEEC6, 38024 - 11905: 0xD5EB, 38025 - 11905: 0xB6A4, 38026 - 11905: 0xEEC8, 38027 - 11905: 0xEEC7, 38028 - 11905: 0xEEC9, 38029 - 11905: 0xEECA, 38030 - 11905: 0xC7A5, 38031 - 11905: 0xEECB, 38032 - 11905: 0xEECC, 38033 - 11905: 0xE895, 38034 - 11905: 0xB7B0, 38035 - 11905: 0xB5F6, 38036 - 11905: 0xEECD, 38037 - 11905: 0xEECF, 38038 - 11905: 0xE896, 38039 - 11905: 0xEECE, 38040 - 11905: 0xE897, 38041 - 11905: 0xB8C6, 38042 - 11905: 0xEED0, 38043 - 11905: 0xEED1, 38044 - 11905: 0xEED2, 38045 - 11905: 0xB6DB, 38046 - 11905: 0xB3AE, 38047 - 11905: 0xD6D3, 38048 - 11905: 0xC4C6, 38049 - 11905: 0xB1B5, 38050 - 11905: 0xB8D6, 38051 - 11905: 0xEED3, 38052 - 11905: 0xEED4, 38053 - 11905: 0xD4BF, 38054 - 11905: 0xC7D5, 38055 - 11905: 0xBEFB, 38056 - 11905: 0xCED9, 38057 - 11905: 0xB9B3, 38058 - 11905: 0xEED6, 38059 - 11905: 0xEED5, 38060 - 11905: 0xEED8, 38061 - 11905: 0xEED7, 38062 - 11905: 0xC5A5, 38063 - 11905: 0xEED9, 38064 - 11905: 0xEEDA, 38065 - 11905: 0xC7AE, 38066 - 11905: 0xEEDB, 38067 - 11905: 0xC7AF, 38068 - 11905: 0xEEDC, 38069 - 11905: 0xB2A7, 38070 - 11905: 0xEEDD, 38071 - 11905: 0xEEDE, 38072 - 11905: 0xEEDF, 38073 - 11905: 0xEEE0, 38074 - 11905: 0xEEE1, 38075 - 11905: 0xD7EA, 38076 - 11905: 0xEEE2, 38077 - 11905: 0xEEE3, 38078 - 11905: 0xBCD8, 38079 - 11905: 0xEEE4, 38080 - 11905: 0xD3CB, 38081 - 11905: 0xCCFA, 38082 - 11905: 0xB2AC, 38083 - 11905: 0xC1E5, 38084 - 11905: 0xEEE5, 38085 - 11905: 0xC7A6, 38086 - 11905: 0xC3AD, 38087 - 11905: 0xE898, 38088 - 11905: 0xEEE6, 38089 - 11905: 0xEEE7, 38090 - 11905: 0xEEE8, 38091 - 11905: 0xEEE9, 38092 - 11905: 0xEEEA, 38093 - 11905: 0xEEEB, 38094 - 11905: 0xEEEC, 38095 - 11905: 0xE899, 38096 - 11905: 0xEEED, 38097 - 11905: 0xEEEE, 38098 - 11905: 0xEEEF, 38099 - 11905: 0xE89A, 38100 - 11905: 0xE89B, 38101 - 11905: 0xEEF0, 38102 - 11905: 0xEEF1, 38103 - 11905: 0xEEF2, 38104 - 11905: 0xEEF4, 38105 - 11905: 0xEEF3, 38106 - 11905: 0xE89C, 38107 - 11905: 0xEEF5, 38108 - 11905: 0xCDAD, 38109 - 11905: 0xC2C1, 38110 - 11905: 0xEEF6, 38111 - 11905: 0xEEF7, 38112 - 11905: 0xEEF8, 38113 - 11905: 0xD5A1, 38114 - 11905: 0xEEF9, 38115 - 11905: 0xCFB3, 38116 - 11905: 0xEEFA, 38117 - 11905: 0xEEFB, 38118 - 11905: 0xE89D, 38119 - 11905: 0xEEFC, 38120 - 11905: 0xEEFD, 38121 - 11905: 0xEFA1, 38122 - 11905: 0xEEFE, 38123 - 11905: 0xEFA2, 38124 - 11905: 0xB8F5, 38125 - 11905: 0xC3FA, 38126 - 11905: 0xEFA3, 38127 - 11905: 0xEFA4, 38128 - 11905: 0xBDC2, 38129 - 11905: 0xD2BF, 38130 - 11905: 0xB2F9, 38131 - 11905: 0xEFA5, 38132 - 11905: 0xEFA6, 38133 - 11905: 0xEFA7, 38134 - 11905: 0xD2F8, 38135 - 11905: 0xEFA8, 38136 - 11905: 0xD6FD, 38137 - 11905: 0xEFA9, 38138 - 11905: 0xC6CC, 38139 - 11905: 0xE89E, 38140 - 11905: 0xEFAA, 38141 - 11905: 0xEFAB, 38142 - 11905: 0xC1B4, 38143 - 11905: 0xEFAC, 38144 - 11905: 0xCFFA, 38145 - 11905: 0xCBF8, 38146 - 11905: 0xEFAE, 38147 - 11905: 0xEFAD, 38148 - 11905: 0xB3FA, 38149 - 11905: 0xB9F8, 38150 - 11905: 0xEFAF, 38151 - 11905: 0xEFB0, 38152 - 11905: 0xD0E2, 38153 - 11905: 0xEFB1, 38154 - 11905: 0xEFB2, 38155 - 11905: 0xB7E6, 38156 - 11905: 0xD0BF, 38157 - 11905: 0xEFB3, 38158 - 11905: 0xEFB4, 38159 - 11905: 0xEFB5, 38160 - 11905: 0xC8F1, 38161 - 11905: 0xCCE0, 38162 - 11905: 0xEFB6, 38163 - 11905: 0xEFB7, 38164 - 11905: 0xEFB8, 38165 - 11905: 0xEFB9, 38166 - 11905: 0xEFBA, 38167 - 11905: 0xD5E0, 38168 - 11905: 0xEFBB, 38169 - 11905: 0xB4ED, 38170 - 11905: 0xC3AA, 38171 - 11905: 0xEFBC, 38172 - 11905: 0xE89F, 38173 - 11905: 0xEFBD, 38174 - 11905: 0xEFBE, 38175 - 11905: 0xEFBF, 38176 - 11905: 0xE8A0, 38177 - 11905: 0xCEFD, 38178 - 11905: 0xEFC0, 38179 - 11905: 0xC2E0, 38180 - 11905: 0xB4B8, 38181 - 11905: 0xD7B6, 38182 - 11905: 0xBDF5, 38183 - 11905: 0xE940, 38184 - 11905: 0xCFC7, 38185 - 11905: 0xEFC3, 38186 - 11905: 0xEFC1, 38187 - 11905: 0xEFC2, 38188 - 11905: 0xEFC4, 38189 - 11905: 0xB6A7, 38190 - 11905: 0xBCFC, 38191 - 11905: 0xBEE2, 38192 - 11905: 0xC3CC, 38193 - 11905: 0xEFC5, 38194 - 11905: 0xEFC6, 38195 - 11905: 0xE941, 38196 - 11905: 0xEFC7, 38197 - 11905: 0xEFCF, 38198 - 11905: 0xEFC8, 38199 - 11905: 0xEFC9, 38200 - 11905: 0xEFCA, 38201 - 11905: 0xC7C2, 38202 - 11905: 0xEFF1, 38203 - 11905: 0xB6CD, 38204 - 11905: 0xEFCB, 38205 - 11905: 0xE942, 38206 - 11905: 0xEFCC, 38207 - 11905: 0xEFCD, 38208 - 11905: 0xB6C6, 38209 - 11905: 0xC3BE, 38210 - 11905: 0xEFCE, 38211 - 11905: 0xE943, 38212 - 11905: 0xEFD0, 38213 - 11905: 0xEFD1, 38214 - 11905: 0xEFD2, 38215 - 11905: 0xD5F2, 38216 - 11905: 0xE944, 38217 - 11905: 0xEFD3, 38218 - 11905: 0xC4F7, 38219 - 11905: 0xE945, 38220 - 11905: 0xEFD4, 38221 - 11905: 0xC4F8, 38222 - 11905: 0xEFD5, 38223 - 11905: 0xEFD6, 38224 - 11905: 0xB8E4, 38225 - 11905: 0xB0F7, 38226 - 11905: 0xEFD7, 38227 - 11905: 0xEFD8, 38228 - 11905: 0xEFD9, 38229 - 11905: 0xE946, 38230 - 11905: 0xEFDA, 38231 - 11905: 0xEFDB, 38232 - 11905: 0xEFDC, 38233 - 11905: 0xEFDD, 38234 - 11905: 0xE947, 38235 - 11905: 0xEFDE, 38236 - 11905: 0xBEB5, 38237 - 11905: 0xEFE1, 38238 - 11905: 0xEFDF, 38239 - 11905: 0xEFE0, 38240 - 11905: 0xE948, 38241 - 11905: 0xEFE2, 38242 - 11905: 0xEFE3, 38243 - 11905: 0xC1CD, 38244 - 11905: 0xEFE4, 38245 - 11905: 0xEFE5, 38246 - 11905: 0xEFE6, 38247 - 11905: 0xEFE7, 38248 - 11905: 0xEFE8, 38249 - 11905: 0xEFE9, 38250 - 11905: 0xEFEA, 38251 - 11905: 0xEFEB, 38252 - 11905: 0xEFEC, 38253 - 11905: 0xC0D8, 38254 - 11905: 0xE949, 38255 - 11905: 0xEFED, 38256 - 11905: 0xC1AD, 38257 - 11905: 0xEFEE, 38258 - 11905: 0xEFEF, 38259 - 11905: 0xEFF0, 38260 - 11905: 0xE94A, 38261 - 11905: 0xE94B, 38262 - 11905: 0xCFE2, 38263 - 11905: 0xE94C, 38264 - 11905: 0xE94D, 38265 - 11905: 0xE94E, 38266 - 11905: 0xE94F, 38267 - 11905: 0xE950, 38268 - 11905: 0xE951, 38269 - 11905: 0xE952, 38270 - 11905: 0xE953, 38271 - 11905: 0xB3A4, 38272 - 11905: 0xE954, 38273 - 11905: 0xE955, 38274 - 11905: 0xE956, 38275 - 11905: 0xE957, 38276 - 11905: 0xE958, 38277 - 11905: 0xE959, 38278 - 11905: 0xE95A, 38279 - 11905: 0xE95B, 38280 - 11905: 0xE95C, 38281 - 11905: 0xE95D, 38282 - 11905: 0xE95E, 38283 - 11905: 0xE95F, 38284 - 11905: 0xE960, 38285 - 11905: 0xE961, 38286 - 11905: 0xE962, 38287 - 11905: 0xE963, 38288 - 11905: 0xE964, 38289 - 11905: 0xE965, 38290 - 11905: 0xE966, 38291 - 11905: 0xE967, 38292 - 11905: 0xE968, 38293 - 11905: 0xE969, 38294 - 11905: 0xE96A, 38295 - 11905: 0xE96B, 38296 - 11905: 0xE96C, 38297 - 11905: 0xE96D, 38298 - 11905: 0xE96E, 38299 - 11905: 0xE96F, 38300 - 11905: 0xE970, 38301 - 11905: 0xE971, 38302 - 11905: 0xE972, 38303 - 11905: 0xE973, 38304 - 11905: 0xE974, 38305 - 11905: 0xE975, 38306 - 11905: 0xE976, 38307 - 11905: 0xE977, 38308 - 11905: 0xE978, 38309 - 11905: 0xE979, 38310 - 11905: 0xE97A, 38311 - 11905: 0xE97B, 38312 - 11905: 0xE97C, 38313 - 11905: 0xE97D, 38314 - 11905: 0xE97E, 38315 - 11905: 0xE980, 38316 - 11905: 0xE981, 38317 - 11905: 0xE982, 38318 - 11905: 0xE983, 38319 - 11905: 0xE984, 38320 - 11905: 0xE985, 38321 - 11905: 0xE986, 38322 - 11905: 0xE987, 38323 - 11905: 0xE988, 38324 - 11905: 0xE989, 38325 - 11905: 0xE98A, 38326 - 11905: 0xE98B, 38327 - 11905: 0xE98C, 38328 - 11905: 0xE98D, 38329 - 11905: 0xE98E, 38330 - 11905: 0xE98F, 38331 - 11905: 0xE990, 38332 - 11905: 0xE991, 38333 - 11905: 0xE992, 38334 - 11905: 0xE993, 38335 - 11905: 0xE994, 38336 - 11905: 0xE995, 38337 - 11905: 0xE996, 38338 - 11905: 0xE997, 38339 - 11905: 0xE998, 38340 - 11905: 0xE999, 38341 - 11905: 0xE99A, 38342 - 11905: 0xE99B, 38343 - 11905: 0xE99C, 38344 - 11905: 0xE99D, 38345 - 11905: 0xE99E, 38346 - 11905: 0xE99F, 38347 - 11905: 0xE9A0, 38348 - 11905: 0xEA40, 38349 - 11905: 0xEA41, 38350 - 11905: 0xEA42, 38351 - 11905: 0xEA43, 38352 - 11905: 0xEA44, 38353 - 11905: 0xEA45, 38354 - 11905: 0xEA46, 38355 - 11905: 0xEA47, 38356 - 11905: 0xEA48, 38357 - 11905: 0xEA49, 38358 - 11905: 0xEA4A, 38359 - 11905: 0xEA4B, 38360 - 11905: 0xEA4C, 38361 - 11905: 0xEA4D, 38362 - 11905: 0xEA4E, 38363 - 11905: 0xEA4F, 38364 - 11905: 0xEA50, 38365 - 11905: 0xEA51, 38366 - 11905: 0xEA52, 38367 - 11905: 0xEA53, 38368 - 11905: 0xEA54, 38369 - 11905: 0xEA55, 38370 - 11905: 0xEA56, 38371 - 11905: 0xEA57, 38372 - 11905: 0xEA58, 38373 - 11905: 0xEA59, 38374 - 11905: 0xEA5A, 38375 - 11905: 0xEA5B, 38376 - 11905: 0xC3C5, 38377 - 11905: 0xE3C5, 38378 - 11905: 0xC9C1, 38379 - 11905: 0xE3C6, 38380 - 11905: 0xEA5C, 38381 - 11905: 0xB1D5, 38382 - 11905: 0xCECA, 38383 - 11905: 0xB4B3, 38384 - 11905: 0xC8F2, 38385 - 11905: 0xE3C7, 38386 - 11905: 0xCFD0, 38387 - 11905: 0xE3C8, 38388 - 11905: 0xBCE4, 38389 - 11905: 0xE3C9, 38390 - 11905: 0xE3CA, 38391 - 11905: 0xC3C6, 38392 - 11905: 0xD5A2, 38393 - 11905: 0xC4D6, 38394 - 11905: 0xB9EB, 38395 - 11905: 0xCEC5, 38396 - 11905: 0xE3CB, 38397 - 11905: 0xC3F6, 38398 - 11905: 0xE3CC, 38399 - 11905: 0xEA5D, 38400 - 11905: 0xB7A7, 38401 - 11905: 0xB8F3, 38402 - 11905: 0xBAD2, 38403 - 11905: 0xE3CD, 38404 - 11905: 0xE3CE, 38405 - 11905: 0xD4C4, 38406 - 11905: 0xE3CF, 38407 - 11905: 0xEA5E, 38408 - 11905: 0xE3D0, 38409 - 11905: 0xD1CB, 38410 - 11905: 0xE3D1, 38411 - 11905: 0xE3D2, 38412 - 11905: 0xE3D3, 38413 - 11905: 0xE3D4, 38414 - 11905: 0xD1D6, 38415 - 11905: 0xE3D5, 38416 - 11905: 0xB2FB, 38417 - 11905: 0xC0BB, 38418 - 11905: 0xE3D6, 38419 - 11905: 0xEA5F, 38420 - 11905: 0xC0AB, 38421 - 11905: 0xE3D7, 38422 - 11905: 0xE3D8, 38423 - 11905: 0xE3D9, 38424 - 11905: 0xEA60, 38425 - 11905: 0xE3DA, 38426 - 11905: 0xE3DB, 38427 - 11905: 0xEA61, 38428 - 11905: 0xB8B7, 38429 - 11905: 0xDAE2, 38430 - 11905: 0xEA62, 38431 - 11905: 0xB6D3, 38432 - 11905: 0xEA63, 38433 - 11905: 0xDAE4, 38434 - 11905: 0xDAE3, 38435 - 11905: 0xEA64, 38436 - 11905: 0xEA65, 38437 - 11905: 0xEA66, 38438 - 11905: 0xEA67, 38439 - 11905: 0xEA68, 38440 - 11905: 0xEA69, 38441 - 11905: 0xEA6A, 38442 - 11905: 0xDAE6, 38443 - 11905: 0xEA6B, 38444 - 11905: 0xEA6C, 38445 - 11905: 0xEA6D, 38446 - 11905: 0xC8EE, 38447 - 11905: 0xEA6E, 38448 - 11905: 0xEA6F, 38449 - 11905: 0xDAE5, 38450 - 11905: 0xB7C0, 38451 - 11905: 0xD1F4, 38452 - 11905: 0xD2F5, 38453 - 11905: 0xD5F3, 38454 - 11905: 0xBDD7, 38455 - 11905: 0xEA70, 38456 - 11905: 0xEA71, 38457 - 11905: 0xEA72, 38458 - 11905: 0xEA73, 38459 - 11905: 0xD7E8, 38460 - 11905: 0xDAE8, 38461 - 11905: 0xDAE7, 38462 - 11905: 0xEA74, 38463 - 11905: 0xB0A2, 38464 - 11905: 0xCDD3, 38465 - 11905: 0xEA75, 38466 - 11905: 0xDAE9, 38467 - 11905: 0xEA76, 38468 - 11905: 0xB8BD, 38469 - 11905: 0xBCCA, 38470 - 11905: 0xC2BD, 38471 - 11905: 0xC2A4, 38472 - 11905: 0xB3C2, 38473 - 11905: 0xDAEA, 38474 - 11905: 0xEA77, 38475 - 11905: 0xC2AA, 38476 - 11905: 0xC4B0, 38477 - 11905: 0xBDB5, 38478 - 11905: 0xEA78, 38479 - 11905: 0xEA79, 38480 - 11905: 0xCFDE, 38481 - 11905: 0xEA7A, 38482 - 11905: 0xEA7B, 38483 - 11905: 0xEA7C, 38484 - 11905: 0xDAEB, 38485 - 11905: 0xC9C2, 38486 - 11905: 0xEA7D, 38487 - 11905: 0xEA7E, 38488 - 11905: 0xEA80, 38489 - 11905: 0xEA81, 38490 - 11905: 0xEA82, 38491 - 11905: 0xB1DD, 38492 - 11905: 0xEA83, 38493 - 11905: 0xEA84, 38494 - 11905: 0xEA85, 38495 - 11905: 0xDAEC, 38496 - 11905: 0xEA86, 38497 - 11905: 0xB6B8, 38498 - 11905: 0xD4BA, 38499 - 11905: 0xEA87, 38500 - 11905: 0xB3FD, 38501 - 11905: 0xEA88, 38502 - 11905: 0xEA89, 38503 - 11905: 0xDAED, 38504 - 11905: 0xD4C9, 38505 - 11905: 0xCFD5, 38506 - 11905: 0xC5E3, 38507 - 11905: 0xEA8A, 38508 - 11905: 0xDAEE, 38509 - 11905: 0xEA8B, 38510 - 11905: 0xEA8C, 38511 - 11905: 0xEA8D, 38512 - 11905: 0xEA8E, 38513 - 11905: 0xEA8F, 38514 - 11905: 0xDAEF, 38515 - 11905: 0xEA90, 38516 - 11905: 0xDAF0, 38517 - 11905: 0xC1EA, 38518 - 11905: 0xCCD5, 38519 - 11905: 0xCFDD, 38520 - 11905: 0xEA91, 38521 - 11905: 0xEA92, 38522 - 11905: 0xEA93, 38523 - 11905: 0xEA94, 38524 - 11905: 0xEA95, 38525 - 11905: 0xEA96, 38526 - 11905: 0xEA97, 38527 - 11905: 0xEA98, 38528 - 11905: 0xEA99, 38529 - 11905: 0xEA9A, 38530 - 11905: 0xEA9B, 38531 - 11905: 0xEA9C, 38532 - 11905: 0xEA9D, 38533 - 11905: 0xD3E7, 38534 - 11905: 0xC2A1, 38535 - 11905: 0xEA9E, 38536 - 11905: 0xDAF1, 38537 - 11905: 0xEA9F, 38538 - 11905: 0xEAA0, 38539 - 11905: 0xCBE5, 38540 - 11905: 0xEB40, 38541 - 11905: 0xDAF2, 38542 - 11905: 0xEB41, 38543 - 11905: 0xCBE6, 38544 - 11905: 0xD2FE, 38545 - 11905: 0xEB42, 38546 - 11905: 0xEB43, 38547 - 11905: 0xEB44, 38548 - 11905: 0xB8F4, 38549 - 11905: 0xEB45, 38550 - 11905: 0xEB46, 38551 - 11905: 0xDAF3, 38552 - 11905: 0xB0AF, 38553 - 11905: 0xCFB6, 38554 - 11905: 0xEB47, 38555 - 11905: 0xEB48, 38556 - 11905: 0xD5CF, 38557 - 11905: 0xEB49, 38558 - 11905: 0xEB4A, 38559 - 11905: 0xEB4B, 38560 - 11905: 0xEB4C, 38561 - 11905: 0xEB4D, 38562 - 11905: 0xEB4E, 38563 - 11905: 0xEB4F, 38564 - 11905: 0xEB50, 38565 - 11905: 0xEB51, 38566 - 11905: 0xEB52, 38567 - 11905: 0xCBED, 38568 - 11905: 0xEB53, 38569 - 11905: 0xEB54, 38570 - 11905: 0xEB55, 38571 - 11905: 0xEB56, 38572 - 11905: 0xEB57, 38573 - 11905: 0xEB58, 38574 - 11905: 0xEB59, 38575 - 11905: 0xEB5A, 38576 - 11905: 0xDAF4, 38577 - 11905: 0xEB5B, 38578 - 11905: 0xEB5C, 38579 - 11905: 0xE3C4, 38580 - 11905: 0xEB5D, 38581 - 11905: 0xEB5E, 38582 - 11905: 0xC1A5, 38583 - 11905: 0xEB5F, 38584 - 11905: 0xEB60, 38585 - 11905: 0xF6BF, 38586 - 11905: 0xEB61, 38587 - 11905: 0xEB62, 38588 - 11905: 0xF6C0, 38589 - 11905: 0xF6C1, 38590 - 11905: 0xC4D1, 38591 - 11905: 0xEB63, 38592 - 11905: 0xC8B8, 38593 - 11905: 0xD1E3, 38594 - 11905: 0xEB64, 38595 - 11905: 0xEB65, 38596 - 11905: 0xD0DB, 38597 - 11905: 0xD1C5, 38598 - 11905: 0xBCAF, 38599 - 11905: 0xB9CD, 38600 - 11905: 0xEB66, 38601 - 11905: 0xEFF4, 38602 - 11905: 0xEB67, 38603 - 11905: 0xEB68, 38604 - 11905: 0xB4C6, 38605 - 11905: 0xD3BA, 38606 - 11905: 0xF6C2, 38607 - 11905: 0xB3FB, 38608 - 11905: 0xEB69, 38609 - 11905: 0xEB6A, 38610 - 11905: 0xF6C3, 38611 - 11905: 0xEB6B, 38612 - 11905: 0xEB6C, 38613 - 11905: 0xB5F1, 38614 - 11905: 0xEB6D, 38615 - 11905: 0xEB6E, 38616 - 11905: 0xEB6F, 38617 - 11905: 0xEB70, 38618 - 11905: 0xEB71, 38619 - 11905: 0xEB72, 38620 - 11905: 0xEB73, 38621 - 11905: 0xEB74, 38622 - 11905: 0xEB75, 38623 - 11905: 0xEB76, 38624 - 11905: 0xF6C5, 38625 - 11905: 0xEB77, 38626 - 11905: 0xEB78, 38627 - 11905: 0xEB79, 38628 - 11905: 0xEB7A, 38629 - 11905: 0xEB7B, 38630 - 11905: 0xEB7C, 38631 - 11905: 0xEB7D, 38632 - 11905: 0xD3EA, 38633 - 11905: 0xF6A7, 38634 - 11905: 0xD1A9, 38635 - 11905: 0xEB7E, 38636 - 11905: 0xEB80, 38637 - 11905: 0xEB81, 38638 - 11905: 0xEB82, 38639 - 11905: 0xF6A9, 38640 - 11905: 0xEB83, 38641 - 11905: 0xEB84, 38642 - 11905: 0xEB85, 38643 - 11905: 0xF6A8, 38644 - 11905: 0xEB86, 38645 - 11905: 0xEB87, 38646 - 11905: 0xC1E3, 38647 - 11905: 0xC0D7, 38648 - 11905: 0xEB88, 38649 - 11905: 0xB1A2, 38650 - 11905: 0xEB89, 38651 - 11905: 0xEB8A, 38652 - 11905: 0xEB8B, 38653 - 11905: 0xEB8C, 38654 - 11905: 0xCEED, 38655 - 11905: 0xEB8D, 38656 - 11905: 0xD0E8, 38657 - 11905: 0xF6AB, 38658 - 11905: 0xEB8E, 38659 - 11905: 0xEB8F, 38660 - 11905: 0xCFF6, 38661 - 11905: 0xEB90, 38662 - 11905: 0xF6AA, 38663 - 11905: 0xD5F0, 38664 - 11905: 0xF6AC, 38665 - 11905: 0xC3B9, 38666 - 11905: 0xEB91, 38667 - 11905: 0xEB92, 38668 - 11905: 0xEB93, 38669 - 11905: 0xBBF4, 38670 - 11905: 0xF6AE, 38671 - 11905: 0xF6AD, 38672 - 11905: 0xEB94, 38673 - 11905: 0xEB95, 38674 - 11905: 0xEB96, 38675 - 11905: 0xC4DE, 38676 - 11905: 0xEB97, 38677 - 11905: 0xEB98, 38678 - 11905: 0xC1D8, 38679 - 11905: 0xEB99, 38680 - 11905: 0xEB9A, 38681 - 11905: 0xEB9B, 38682 - 11905: 0xEB9C, 38683 - 11905: 0xEB9D, 38684 - 11905: 0xCBAA, 38685 - 11905: 0xEB9E, 38686 - 11905: 0xCFBC, 38687 - 11905: 0xEB9F, 38688 - 11905: 0xEBA0, 38689 - 11905: 0xEC40, 38690 - 11905: 0xEC41, 38691 - 11905: 0xEC42, 38692 - 11905: 0xEC43, 38693 - 11905: 0xEC44, 38694 - 11905: 0xEC45, 38695 - 11905: 0xEC46, 38696 - 11905: 0xEC47, 38697 - 11905: 0xEC48, 38698 - 11905: 0xF6AF, 38699 - 11905: 0xEC49, 38700 - 11905: 0xEC4A, 38701 - 11905: 0xF6B0, 38702 - 11905: 0xEC4B, 38703 - 11905: 0xEC4C, 38704 - 11905: 0xF6B1, 38705 - 11905: 0xEC4D, 38706 - 11905: 0xC2B6, 38707 - 11905: 0xEC4E, 38708 - 11905: 0xEC4F, 38709 - 11905: 0xEC50, 38710 - 11905: 0xEC51, 38711 - 11905: 0xEC52, 38712 - 11905: 0xB0D4, 38713 - 11905: 0xC5F9, 38714 - 11905: 0xEC53, 38715 - 11905: 0xEC54, 38716 - 11905: 0xEC55, 38717 - 11905: 0xEC56, 38718 - 11905: 0xF6B2, 38719 - 11905: 0xEC57, 38720 - 11905: 0xEC58, 38721 - 11905: 0xEC59, 38722 - 11905: 0xEC5A, 38723 - 11905: 0xEC5B, 38724 - 11905: 0xEC5C, 38725 - 11905: 0xEC5D, 38726 - 11905: 0xEC5E, 38727 - 11905: 0xEC5F, 38728 - 11905: 0xEC60, 38729 - 11905: 0xEC61, 38730 - 11905: 0xEC62, 38731 - 11905: 0xEC63, 38732 - 11905: 0xEC64, 38733 - 11905: 0xEC65, 38734 - 11905: 0xEC66, 38735 - 11905: 0xEC67, 38736 - 11905: 0xEC68, 38737 - 11905: 0xEC69, 38738 - 11905: 0xC7E0, 38739 - 11905: 0xF6A6, 38740 - 11905: 0xEC6A, 38741 - 11905: 0xEC6B, 38742 - 11905: 0xBEB8, 38743 - 11905: 0xEC6C, 38744 - 11905: 0xEC6D, 38745 - 11905: 0xBEB2, 38746 - 11905: 0xEC6E, 38747 - 11905: 0xB5E5, 38748 - 11905: 0xEC6F, 38749 - 11905: 0xEC70, 38750 - 11905: 0xB7C7, 38751 - 11905: 0xEC71, 38752 - 11905: 0xBFBF, 38753 - 11905: 0xC3D2, 38754 - 11905: 0xC3E6, 38755 - 11905: 0xEC72, 38756 - 11905: 0xEC73, 38757 - 11905: 0xD8CC, 38758 - 11905: 0xEC74, 38759 - 11905: 0xEC75, 38760 - 11905: 0xEC76, 38761 - 11905: 0xB8EF, 38762 - 11905: 0xEC77, 38763 - 11905: 0xEC78, 38764 - 11905: 0xEC79, 38765 - 11905: 0xEC7A, 38766 - 11905: 0xEC7B, 38767 - 11905: 0xEC7C, 38768 - 11905: 0xEC7D, 38769 - 11905: 0xEC7E, 38770 - 11905: 0xEC80, 38771 - 11905: 0xBDF9, 38772 - 11905: 0xD1A5, 38773 - 11905: 0xEC81, 38774 - 11905: 0xB0D0, 38775 - 11905: 0xEC82, 38776 - 11905: 0xEC83, 38777 - 11905: 0xEC84, 38778 - 11905: 0xEC85, 38779 - 11905: 0xEC86, 38780 - 11905: 0xF7B0, 38781 - 11905: 0xEC87, 38782 - 11905: 0xEC88, 38783 - 11905: 0xEC89, 38784 - 11905: 0xEC8A, 38785 - 11905: 0xEC8B, 38786 - 11905: 0xEC8C, 38787 - 11905: 0xEC8D, 38788 - 11905: 0xEC8E, 38789 - 11905: 0xF7B1, 38790 - 11905: 0xEC8F, 38791 - 11905: 0xEC90, 38792 - 11905: 0xEC91, 38793 - 11905: 0xEC92, 38794 - 11905: 0xEC93, 38795 - 11905: 0xD0AC, 38796 - 11905: 0xEC94, 38797 - 11905: 0xB0B0, 38798 - 11905: 0xEC95, 38799 - 11905: 0xEC96, 38800 - 11905: 0xEC97, 38801 - 11905: 0xF7B2, 38802 - 11905: 0xF7B3, 38803 - 11905: 0xEC98, 38804 - 11905: 0xF7B4, 38805 - 11905: 0xEC99, 38806 - 11905: 0xEC9A, 38807 - 11905: 0xEC9B, 38808 - 11905: 0xC7CA, 38809 - 11905: 0xEC9C, 38810 - 11905: 0xEC9D, 38811 - 11905: 0xEC9E, 38812 - 11905: 0xEC9F, 38813 - 11905: 0xECA0, 38814 - 11905: 0xED40, 38815 - 11905: 0xED41, 38816 - 11905: 0xBECF, 38817 - 11905: 0xED42, 38818 - 11905: 0xED43, 38819 - 11905: 0xF7B7, 38820 - 11905: 0xED44, 38821 - 11905: 0xED45, 38822 - 11905: 0xED46, 38823 - 11905: 0xED47, 38824 - 11905: 0xED48, 38825 - 11905: 0xED49, 38826 - 11905: 0xED4A, 38827 - 11905: 0xF7B6, 38828 - 11905: 0xED4B, 38829 - 11905: 0xB1DE, 38830 - 11905: 0xED4C, 38831 - 11905: 0xF7B5, 38832 - 11905: 0xED4D, 38833 - 11905: 0xED4E, 38834 - 11905: 0xF7B8, 38835 - 11905: 0xED4F, 38836 - 11905: 0xF7B9, 38837 - 11905: 0xED50, 38838 - 11905: 0xED51, 38839 - 11905: 0xED52, 38840 - 11905: 0xED53, 38841 - 11905: 0xED54, 38842 - 11905: 0xED55, 38843 - 11905: 0xED56, 38844 - 11905: 0xED57, 38845 - 11905: 0xED58, 38846 - 11905: 0xED59, 38847 - 11905: 0xED5A, 38848 - 11905: 0xED5B, 38849 - 11905: 0xED5C, 38850 - 11905: 0xED5D, 38851 - 11905: 0xED5E, 38852 - 11905: 0xED5F, 38853 - 11905: 0xED60, 38854 - 11905: 0xED61, 38855 - 11905: 0xED62, 38856 - 11905: 0xED63, 38857 - 11905: 0xED64, 38858 - 11905: 0xED65, 38859 - 11905: 0xED66, 38860 - 11905: 0xED67, 38861 - 11905: 0xED68, 38862 - 11905: 0xED69, 38863 - 11905: 0xED6A, 38864 - 11905: 0xED6B, 38865 - 11905: 0xED6C, 38866 - 11905: 0xED6D, 38867 - 11905: 0xED6E, 38868 - 11905: 0xED6F, 38869 - 11905: 0xED70, 38870 - 11905: 0xED71, 38871 - 11905: 0xED72, 38872 - 11905: 0xED73, 38873 - 11905: 0xED74, 38874 - 11905: 0xED75, 38875 - 11905: 0xED76, 38876 - 11905: 0xED77, 38877 - 11905: 0xED78, 38878 - 11905: 0xED79, 38879 - 11905: 0xED7A, 38880 - 11905: 0xED7B, 38881 - 11905: 0xED7C, 38882 - 11905: 0xED7D, 38883 - 11905: 0xED7E, 38884 - 11905: 0xED80, 38885 - 11905: 0xED81, 38886 - 11905: 0xCEA4, 38887 - 11905: 0xC8CD, 38888 - 11905: 0xED82, 38889 - 11905: 0xBAAB, 38890 - 11905: 0xE8B8, 38891 - 11905: 0xE8B9, 38892 - 11905: 0xE8BA, 38893 - 11905: 0xBEC2, 38894 - 11905: 0xED83, 38895 - 11905: 0xED84, 38896 - 11905: 0xED85, 38897 - 11905: 0xED86, 38898 - 11905: 0xED87, 38899 - 11905: 0xD2F4, 38900 - 11905: 0xED88, 38901 - 11905: 0xD4CF, 38902 - 11905: 0xC9D8, 38903 - 11905: 0xED89, 38904 - 11905: 0xED8A, 38905 - 11905: 0xED8B, 38906 - 11905: 0xED8C, 38907 - 11905: 0xED8D, 38908 - 11905: 0xED8E, 38909 - 11905: 0xED8F, 38910 - 11905: 0xED90, 38911 - 11905: 0xED91, 38912 - 11905: 0xED92, 38913 - 11905: 0xED93, 38914 - 11905: 0xED94, 38915 - 11905: 0xED95, 38916 - 11905: 0xED96, 38917 - 11905: 0xED97, 38918 - 11905: 0xED98, 38919 - 11905: 0xED99, 38920 - 11905: 0xED9A, 38921 - 11905: 0xED9B, 38922 - 11905: 0xED9C, 38923 - 11905: 0xED9D, 38924 - 11905: 0xED9E, 38925 - 11905: 0xED9F, 38926 - 11905: 0xEDA0, 38927 - 11905: 0xEE40, 38928 - 11905: 0xEE41, 38929 - 11905: 0xEE42, 38930 - 11905: 0xEE43, 38931 - 11905: 0xEE44, 38932 - 11905: 0xEE45, 38933 - 11905: 0xEE46, 38934 - 11905: 0xEE47, 38935 - 11905: 0xEE48, 38936 - 11905: 0xEE49, 38937 - 11905: 0xEE4A, 38938 - 11905: 0xEE4B, 38939 - 11905: 0xEE4C, 38940 - 11905: 0xEE4D, 38941 - 11905: 0xEE4E, 38942 - 11905: 0xEE4F, 38943 - 11905: 0xEE50, 38944 - 11905: 0xEE51, 38945 - 11905: 0xEE52, 38946 - 11905: 0xEE53, 38947 - 11905: 0xEE54, 38948 - 11905: 0xEE55, 38949 - 11905: 0xEE56, 38950 - 11905: 0xEE57, 38951 - 11905: 0xEE58, 38952 - 11905: 0xEE59, 38953 - 11905: 0xEE5A, 38954 - 11905: 0xEE5B, 38955 - 11905: 0xEE5C, 38956 - 11905: 0xEE5D, 38957 - 11905: 0xEE5E, 38958 - 11905: 0xEE5F, 38959 - 11905: 0xEE60, 38960 - 11905: 0xEE61, 38961 - 11905: 0xEE62, 38962 - 11905: 0xEE63, 38963 - 11905: 0xEE64, 38964 - 11905: 0xEE65, 38965 - 11905: 0xEE66, 38966 - 11905: 0xEE67, 38967 - 11905: 0xEE68, 38968 - 11905: 0xEE69, 38969 - 11905: 0xEE6A, 38970 - 11905: 0xEE6B, 38971 - 11905: 0xEE6C, 38972 - 11905: 0xEE6D, 38973 - 11905: 0xEE6E, 38974 - 11905: 0xEE6F, 38975 - 11905: 0xEE70, 38976 - 11905: 0xEE71, 38977 - 11905: 0xEE72, 38978 - 11905: 0xEE73, 38979 - 11905: 0xEE74, 38980 - 11905: 0xEE75, 38981 - 11905: 0xEE76, 38982 - 11905: 0xEE77, 38983 - 11905: 0xEE78, 38984 - 11905: 0xEE79, 38985 - 11905: 0xEE7A, 38986 - 11905: 0xEE7B, 38987 - 11905: 0xEE7C, 38988 - 11905: 0xEE7D, 38989 - 11905: 0xEE7E, 38990 - 11905: 0xEE80, 38991 - 11905: 0xEE81, 38992 - 11905: 0xEE82, 38993 - 11905: 0xEE83, 38994 - 11905: 0xEE84, 38995 - 11905: 0xEE85, 38996 - 11905: 0xEE86, 38997 - 11905: 0xEE87, 38998 - 11905: 0xEE88, 38999 - 11905: 0xEE89, 39000 - 11905: 0xEE8A, 39001 - 11905: 0xEE8B, 39002 - 11905: 0xEE8C, 39003 - 11905: 0xEE8D, 39004 - 11905: 0xEE8E, 39005 - 11905: 0xEE8F, 39006 - 11905: 0xEE90, 39007 - 11905: 0xEE91, 39008 - 11905: 0xEE92, 39009 - 11905: 0xEE93, 39010 - 11905: 0xEE94, 39011 - 11905: 0xEE95, 39012 - 11905: 0xEE96, 39013 - 11905: 0xEE97, 39014 - 11905: 0xEE98, 39015 - 11905: 0xEE99, 39016 - 11905: 0xEE9A, 39017 - 11905: 0xEE9B, 39018 - 11905: 0xEE9C, 39019 - 11905: 0xEE9D, 39020 - 11905: 0xEE9E, 39021 - 11905: 0xEE9F, 39022 - 11905: 0xEEA0, 39023 - 11905: 0xEF40, 39024 - 11905: 0xEF41, 39025 - 11905: 0xEF42, 39026 - 11905: 0xEF43, 39027 - 11905: 0xEF44, 39028 - 11905: 0xEF45, 39029 - 11905: 0xD2B3, 39030 - 11905: 0xB6A5, 39031 - 11905: 0xC7EA, 39032 - 11905: 0xF1FC, 39033 - 11905: 0xCFEE, 39034 - 11905: 0xCBB3, 39035 - 11905: 0xD0EB, 39036 - 11905: 0xE7EF, 39037 - 11905: 0xCDE7, 39038 - 11905: 0xB9CB, 39039 - 11905: 0xB6D9, 39040 - 11905: 0xF1FD, 39041 - 11905: 0xB0E4, 39042 - 11905: 0xCBCC, 39043 - 11905: 0xF1FE, 39044 - 11905: 0xD4A4, 39045 - 11905: 0xC2AD, 39046 - 11905: 0xC1EC, 39047 - 11905: 0xC6C4, 39048 - 11905: 0xBEB1, 39049 - 11905: 0xF2A1, 39050 - 11905: 0xBCD5, 39051 - 11905: 0xEF46, 39052 - 11905: 0xF2A2, 39053 - 11905: 0xF2A3, 39054 - 11905: 0xEF47, 39055 - 11905: 0xF2A4, 39056 - 11905: 0xD2C3, 39057 - 11905: 0xC6B5, 39058 - 11905: 0xEF48, 39059 - 11905: 0xCDC7, 39060 - 11905: 0xF2A5, 39061 - 11905: 0xEF49, 39062 - 11905: 0xD3B1, 39063 - 11905: 0xBFC5, 39064 - 11905: 0xCCE2, 39065 - 11905: 0xEF4A, 39066 - 11905: 0xF2A6, 39067 - 11905: 0xF2A7, 39068 - 11905: 0xD1D5, 39069 - 11905: 0xB6EE, 39070 - 11905: 0xF2A8, 39071 - 11905: 0xF2A9, 39072 - 11905: 0xB5DF, 39073 - 11905: 0xF2AA, 39074 - 11905: 0xF2AB, 39075 - 11905: 0xEF4B, 39076 - 11905: 0xB2FC, 39077 - 11905: 0xF2AC, 39078 - 11905: 0xF2AD, 39079 - 11905: 0xC8A7, 39080 - 11905: 0xEF4C, 39081 - 11905: 0xEF4D, 39082 - 11905: 0xEF4E, 39083 - 11905: 0xEF4F, 39084 - 11905: 0xEF50, 39085 - 11905: 0xEF51, 39086 - 11905: 0xEF52, 39087 - 11905: 0xEF53, 39088 - 11905: 0xEF54, 39089 - 11905: 0xEF55, 39090 - 11905: 0xEF56, 39091 - 11905: 0xEF57, 39092 - 11905: 0xEF58, 39093 - 11905: 0xEF59, 39094 - 11905: 0xEF5A, 39095 - 11905: 0xEF5B, 39096 - 11905: 0xEF5C, 39097 - 11905: 0xEF5D, 39098 - 11905: 0xEF5E, 39099 - 11905: 0xEF5F, 39100 - 11905: 0xEF60, 39101 - 11905: 0xEF61, 39102 - 11905: 0xEF62, 39103 - 11905: 0xEF63, 39104 - 11905: 0xEF64, 39105 - 11905: 0xEF65, 39106 - 11905: 0xEF66, 39107 - 11905: 0xEF67, 39108 - 11905: 0xEF68, 39109 - 11905: 0xEF69, 39110 - 11905: 0xEF6A, 39111 - 11905: 0xEF6B, 39112 - 11905: 0xEF6C, 39113 - 11905: 0xEF6D, 39114 - 11905: 0xEF6E, 39115 - 11905: 0xEF6F, 39116 - 11905: 0xEF70, 39117 - 11905: 0xEF71, 39118 - 11905: 0xB7E7, 39119 - 11905: 0xEF72, 39120 - 11905: 0xEF73, 39121 - 11905: 0xECA9, 39122 - 11905: 0xECAA, 39123 - 11905: 0xECAB, 39124 - 11905: 0xEF74, 39125 - 11905: 0xECAC, 39126 - 11905: 0xEF75, 39127 - 11905: 0xEF76, 39128 - 11905: 0xC6AE, 39129 - 11905: 0xECAD, 39130 - 11905: 0xECAE, 39131 - 11905: 0xEF77, 39132 - 11905: 0xEF78, 39133 - 11905: 0xEF79, 39134 - 11905: 0xB7C9, 39135 - 11905: 0xCAB3, 39136 - 11905: 0xEF7A, 39137 - 11905: 0xEF7B, 39138 - 11905: 0xEF7C, 39139 - 11905: 0xEF7D, 39140 - 11905: 0xEF7E, 39141 - 11905: 0xEF80, 39142 - 11905: 0xEF81, 39143 - 11905: 0xE2B8, 39144 - 11905: 0xF7CF, 39145 - 11905: 0xEF82, 39146 - 11905: 0xEF83, 39147 - 11905: 0xEF84, 39148 - 11905: 0xEF85, 39149 - 11905: 0xEF86, 39150 - 11905: 0xEF87, 39151 - 11905: 0xEF88, 39152 - 11905: 0xEF89, 39153 - 11905: 0xEF8A, 39154 - 11905: 0xEF8B, 39155 - 11905: 0xEF8C, 39156 - 11905: 0xEF8D, 39157 - 11905: 0xEF8E, 39158 - 11905: 0xEF8F, 39159 - 11905: 0xEF90, 39160 - 11905: 0xEF91, 39161 - 11905: 0xEF92, 39162 - 11905: 0xEF93, 39163 - 11905: 0xEF94, 39164 - 11905: 0xEF95, 39165 - 11905: 0xEF96, 39166 - 11905: 0xEF97, 39167 - 11905: 0xEF98, 39168 - 11905: 0xEF99, 39169 - 11905: 0xEF9A, 39170 - 11905: 0xEF9B, 39171 - 11905: 0xEF9C, 39172 - 11905: 0xEF9D, 39173 - 11905: 0xEF9E, 39174 - 11905: 0xEF9F, 39175 - 11905: 0xEFA0, 39176 - 11905: 0xF040, 39177 - 11905: 0xF041, 39178 - 11905: 0xF042, 39179 - 11905: 0xF043, 39180 - 11905: 0xF044, 39181 - 11905: 0xF7D0, 39182 - 11905: 0xF045, 39183 - 11905: 0xF046, 39184 - 11905: 0xB2CD, 39185 - 11905: 0xF047, 39186 - 11905: 0xF048, 39187 - 11905: 0xF049, 39188 - 11905: 0xF04A, 39189 - 11905: 0xF04B, 39190 - 11905: 0xF04C, 39191 - 11905: 0xF04D, 39192 - 11905: 0xF04E, 39193 - 11905: 0xF04F, 39194 - 11905: 0xF050, 39195 - 11905: 0xF051, 39196 - 11905: 0xF052, 39197 - 11905: 0xF053, 39198 - 11905: 0xF054, 39199 - 11905: 0xF055, 39200 - 11905: 0xF056, 39201 - 11905: 0xF057, 39202 - 11905: 0xF058, 39203 - 11905: 0xF059, 39204 - 11905: 0xF05A, 39205 - 11905: 0xF05B, 39206 - 11905: 0xF05C, 39207 - 11905: 0xF05D, 39208 - 11905: 0xF05E, 39209 - 11905: 0xF05F, 39210 - 11905: 0xF060, 39211 - 11905: 0xF061, 39212 - 11905: 0xF062, 39213 - 11905: 0xF063, 39214 - 11905: 0xF7D1, 39215 - 11905: 0xF064, 39216 - 11905: 0xF065, 39217 - 11905: 0xF066, 39218 - 11905: 0xF067, 39219 - 11905: 0xF068, 39220 - 11905: 0xF069, 39221 - 11905: 0xF06A, 39222 - 11905: 0xF06B, 39223 - 11905: 0xF06C, 39224 - 11905: 0xF06D, 39225 - 11905: 0xF06E, 39226 - 11905: 0xF06F, 39227 - 11905: 0xF070, 39228 - 11905: 0xF071, 39229 - 11905: 0xF072, 39230 - 11905: 0xF073, 39231 - 11905: 0xF074, 39232 - 11905: 0xF075, 39233 - 11905: 0xF076, 39234 - 11905: 0xF077, 39235 - 11905: 0xF078, 39236 - 11905: 0xF079, 39237 - 11905: 0xF07A, 39238 - 11905: 0xF07B, 39239 - 11905: 0xF07C, 39240 - 11905: 0xF07D, 39241 - 11905: 0xF07E, 39242 - 11905: 0xF080, 39243 - 11905: 0xF081, 39244 - 11905: 0xF082, 39245 - 11905: 0xF083, 39246 - 11905: 0xF084, 39247 - 11905: 0xF085, 39248 - 11905: 0xF086, 39249 - 11905: 0xF087, 39250 - 11905: 0xF088, 39251 - 11905: 0xF089, 39252 - 11905: 0xF7D3, 39253 - 11905: 0xF7D2, 39254 - 11905: 0xF08A, 39255 - 11905: 0xF08B, 39256 - 11905: 0xF08C, 39257 - 11905: 0xF08D, 39258 - 11905: 0xF08E, 39259 - 11905: 0xF08F, 39260 - 11905: 0xF090, 39261 - 11905: 0xF091, 39262 - 11905: 0xF092, 39263 - 11905: 0xF093, 39264 - 11905: 0xF094, 39265 - 11905: 0xF095, 39266 - 11905: 0xF096, 39267 - 11905: 0xE2BB, 39268 - 11905: 0xF097, 39269 - 11905: 0xBCA2, 39270 - 11905: 0xF098, 39271 - 11905: 0xE2BC, 39272 - 11905: 0xE2BD, 39273 - 11905: 0xE2BE, 39274 - 11905: 0xE2BF, 39275 - 11905: 0xE2C0, 39276 - 11905: 0xE2C1, 39277 - 11905: 0xB7B9, 39278 - 11905: 0xD2FB, 39279 - 11905: 0xBDA4, 39280 - 11905: 0xCACE, 39281 - 11905: 0xB1A5, 39282 - 11905: 0xCBC7, 39283 - 11905: 0xF099, 39284 - 11905: 0xE2C2, 39285 - 11905: 0xB6FC, 39286 - 11905: 0xC8C4, 39287 - 11905: 0xE2C3, 39288 - 11905: 0xF09A, 39289 - 11905: 0xF09B, 39290 - 11905: 0xBDC8, 39291 - 11905: 0xF09C, 39292 - 11905: 0xB1FD, 39293 - 11905: 0xE2C4, 39294 - 11905: 0xF09D, 39295 - 11905: 0xB6F6, 39296 - 11905: 0xE2C5, 39297 - 11905: 0xC4D9, 39298 - 11905: 0xF09E, 39299 - 11905: 0xF09F, 39300 - 11905: 0xE2C6, 39301 - 11905: 0xCFDA, 39302 - 11905: 0xB9DD, 39303 - 11905: 0xE2C7, 39304 - 11905: 0xC0A1, 39305 - 11905: 0xF0A0, 39306 - 11905: 0xE2C8, 39307 - 11905: 0xB2F6, 39308 - 11905: 0xF140, 39309 - 11905: 0xE2C9, 39310 - 11905: 0xF141, 39311 - 11905: 0xC1F3, 39312 - 11905: 0xE2CA, 39313 - 11905: 0xE2CB, 39314 - 11905: 0xC2F8, 39315 - 11905: 0xE2CC, 39316 - 11905: 0xE2CD, 39317 - 11905: 0xE2CE, 39318 - 11905: 0xCAD7, 39319 - 11905: 0xD8B8, 39320 - 11905: 0xD9E5, 39321 - 11905: 0xCFE3, 39322 - 11905: 0xF142, 39323 - 11905: 0xF143, 39324 - 11905: 0xF144, 39325 - 11905: 0xF145, 39326 - 11905: 0xF146, 39327 - 11905: 0xF147, 39328 - 11905: 0xF148, 39329 - 11905: 0xF149, 39330 - 11905: 0xF14A, 39331 - 11905: 0xF14B, 39332 - 11905: 0xF14C, 39333 - 11905: 0xF0A5, 39334 - 11905: 0xF14D, 39335 - 11905: 0xF14E, 39336 - 11905: 0xDCB0, 39337 - 11905: 0xF14F, 39338 - 11905: 0xF150, 39339 - 11905: 0xF151, 39340 - 11905: 0xF152, 39341 - 11905: 0xF153, 39342 - 11905: 0xF154, 39343 - 11905: 0xF155, 39344 - 11905: 0xF156, 39345 - 11905: 0xF157, 39346 - 11905: 0xF158, 39347 - 11905: 0xF159, 39348 - 11905: 0xF15A, 39349 - 11905: 0xF15B, 39350 - 11905: 0xF15C, 39351 - 11905: 0xF15D, 39352 - 11905: 0xF15E, 39353 - 11905: 0xF15F, 39354 - 11905: 0xF160, 39355 - 11905: 0xF161, 39356 - 11905: 0xF162, 39357 - 11905: 0xF163, 39358 - 11905: 0xF164, 39359 - 11905: 0xF165, 39360 - 11905: 0xF166, 39361 - 11905: 0xF167, 39362 - 11905: 0xF168, 39363 - 11905: 0xF169, 39364 - 11905: 0xF16A, 39365 - 11905: 0xF16B, 39366 - 11905: 0xF16C, 39367 - 11905: 0xF16D, 39368 - 11905: 0xF16E, 39369 - 11905: 0xF16F, 39370 - 11905: 0xF170, 39371 - 11905: 0xF171, 39372 - 11905: 0xF172, 39373 - 11905: 0xF173, 39374 - 11905: 0xF174, 39375 - 11905: 0xF175, 39376 - 11905: 0xF176, 39377 - 11905: 0xF177, 39378 - 11905: 0xF178, 39379 - 11905: 0xF179, 39380 - 11905: 0xF17A, 39381 - 11905: 0xF17B, 39382 - 11905: 0xF17C, 39383 - 11905: 0xF17D, 39384 - 11905: 0xF17E, 39385 - 11905: 0xF180, 39386 - 11905: 0xF181, 39387 - 11905: 0xF182, 39388 - 11905: 0xF183, 39389 - 11905: 0xF184, 39390 - 11905: 0xF185, 39391 - 11905: 0xF186, 39392 - 11905: 0xF187, 39393 - 11905: 0xF188, 39394 - 11905: 0xF189, 39395 - 11905: 0xF18A, 39396 - 11905: 0xF18B, 39397 - 11905: 0xF18C, 39398 - 11905: 0xF18D, 39399 - 11905: 0xF18E, 39400 - 11905: 0xF18F, 39401 - 11905: 0xF190, 39402 - 11905: 0xF191, 39403 - 11905: 0xF192, 39404 - 11905: 0xF193, 39405 - 11905: 0xF194, 39406 - 11905: 0xF195, 39407 - 11905: 0xF196, 39408 - 11905: 0xF197, 39409 - 11905: 0xF198, 39410 - 11905: 0xF199, 39411 - 11905: 0xF19A, 39412 - 11905: 0xF19B, 39413 - 11905: 0xF19C, 39414 - 11905: 0xF19D, 39415 - 11905: 0xF19E, 39416 - 11905: 0xF19F, 39417 - 11905: 0xF1A0, 39418 - 11905: 0xF240, 39419 - 11905: 0xF241, 39420 - 11905: 0xF242, 39421 - 11905: 0xF243, 39422 - 11905: 0xF244, 39423 - 11905: 0xF245, 39424 - 11905: 0xF246, 39425 - 11905: 0xF247, 39426 - 11905: 0xF248, 39427 - 11905: 0xF249, 39428 - 11905: 0xF24A, 39429 - 11905: 0xF24B, 39430 - 11905: 0xF24C, 39431 - 11905: 0xF24D, 39432 - 11905: 0xF24E, 39433 - 11905: 0xF24F, 39434 - 11905: 0xF250, 39435 - 11905: 0xF251, 39436 - 11905: 0xF252, 39437 - 11905: 0xF253, 39438 - 11905: 0xF254, 39439 - 11905: 0xF255, 39440 - 11905: 0xF256, 39441 - 11905: 0xF257, 39442 - 11905: 0xF258, 39443 - 11905: 0xF259, 39444 - 11905: 0xF25A, 39445 - 11905: 0xF25B, 39446 - 11905: 0xF25C, 39447 - 11905: 0xF25D, 39448 - 11905: 0xF25E, 39449 - 11905: 0xF25F, 39450 - 11905: 0xF260, 39451 - 11905: 0xF261, 39452 - 11905: 0xF262, 39453 - 11905: 0xF263, 39454 - 11905: 0xF264, 39455 - 11905: 0xF265, 39456 - 11905: 0xF266, 39457 - 11905: 0xF267, 39458 - 11905: 0xF268, 39459 - 11905: 0xF269, 39460 - 11905: 0xF26A, 39461 - 11905: 0xF26B, 39462 - 11905: 0xF26C, 39463 - 11905: 0xF26D, 39464 - 11905: 0xF26E, 39465 - 11905: 0xF26F, 39466 - 11905: 0xF270, 39467 - 11905: 0xF271, 39468 - 11905: 0xF272, 39469 - 11905: 0xF273, 39470 - 11905: 0xF274, 39471 - 11905: 0xF275, 39472 - 11905: 0xF276, 39473 - 11905: 0xF277, 39474 - 11905: 0xF278, 39475 - 11905: 0xF279, 39476 - 11905: 0xF27A, 39477 - 11905: 0xF27B, 39478 - 11905: 0xF27C, 39479 - 11905: 0xF27D, 39480 - 11905: 0xF27E, 39481 - 11905: 0xF280, 39482 - 11905: 0xF281, 39483 - 11905: 0xF282, 39484 - 11905: 0xF283, 39485 - 11905: 0xF284, 39486 - 11905: 0xF285, 39487 - 11905: 0xF286, 39488 - 11905: 0xF287, 39489 - 11905: 0xF288, 39490 - 11905: 0xF289, 39491 - 11905: 0xF28A, 39492 - 11905: 0xF28B, 39493 - 11905: 0xF28C, 39494 - 11905: 0xF28D, 39495 - 11905: 0xF28E, 39496 - 11905: 0xF28F, 39497 - 11905: 0xF290, 39498 - 11905: 0xF291, 39499 - 11905: 0xF292, 39500 - 11905: 0xF293, 39501 - 11905: 0xF294, 39502 - 11905: 0xF295, 39503 - 11905: 0xF296, 39504 - 11905: 0xF297, 39505 - 11905: 0xF298, 39506 - 11905: 0xF299, 39507 - 11905: 0xF29A, 39508 - 11905: 0xF29B, 39509 - 11905: 0xF29C, 39510 - 11905: 0xF29D, 39511 - 11905: 0xF29E, 39512 - 11905: 0xF29F, 39513 - 11905: 0xF2A0, 39514 - 11905: 0xF340, 39515 - 11905: 0xF341, 39516 - 11905: 0xF342, 39517 - 11905: 0xF343, 39518 - 11905: 0xF344, 39519 - 11905: 0xF345, 39520 - 11905: 0xF346, 39521 - 11905: 0xF347, 39522 - 11905: 0xF348, 39523 - 11905: 0xF349, 39524 - 11905: 0xF34A, 39525 - 11905: 0xF34B, 39526 - 11905: 0xF34C, 39527 - 11905: 0xF34D, 39528 - 11905: 0xF34E, 39529 - 11905: 0xF34F, 39530 - 11905: 0xF350, 39531 - 11905: 0xF351, 39532 - 11905: 0xC2ED, 39533 - 11905: 0xD4A6, 39534 - 11905: 0xCDD4, 39535 - 11905: 0xD1B1, 39536 - 11905: 0xB3DB, 39537 - 11905: 0xC7FD, 39538 - 11905: 0xF352, 39539 - 11905: 0xB2B5, 39540 - 11905: 0xC2BF, 39541 - 11905: 0xE6E0, 39542 - 11905: 0xCABB, 39543 - 11905: 0xE6E1, 39544 - 11905: 0xE6E2, 39545 - 11905: 0xBED4, 39546 - 11905: 0xE6E3, 39547 - 11905: 0xD7A4, 39548 - 11905: 0xCDD5, 39549 - 11905: 0xE6E5, 39550 - 11905: 0xBCDD, 39551 - 11905: 0xE6E4, 39552 - 11905: 0xE6E6, 39553 - 11905: 0xE6E7, 39554 - 11905: 0xC2EE, 39555 - 11905: 0xF353, 39556 - 11905: 0xBDBE, 39557 - 11905: 0xE6E8, 39558 - 11905: 0xC2E6, 39559 - 11905: 0xBAA7, 39560 - 11905: 0xE6E9, 39561 - 11905: 0xF354, 39562 - 11905: 0xE6EA, 39563 - 11905: 0xB3D2, 39564 - 11905: 0xD1E9, 39565 - 11905: 0xF355, 39566 - 11905: 0xF356, 39567 - 11905: 0xBFA5, 39568 - 11905: 0xE6EB, 39569 - 11905: 0xC6EF, 39570 - 11905: 0xE6EC, 39571 - 11905: 0xE6ED, 39572 - 11905: 0xF357, 39573 - 11905: 0xF358, 39574 - 11905: 0xE6EE, 39575 - 11905: 0xC6AD, 39576 - 11905: 0xE6EF, 39577 - 11905: 0xF359, 39578 - 11905: 0xC9A7, 39579 - 11905: 0xE6F0, 39580 - 11905: 0xE6F1, 39581 - 11905: 0xE6F2, 39582 - 11905: 0xE5B9, 39583 - 11905: 0xE6F3, 39584 - 11905: 0xE6F4, 39585 - 11905: 0xC2E2, 39586 - 11905: 0xE6F5, 39587 - 11905: 0xE6F6, 39588 - 11905: 0xD6E8, 39589 - 11905: 0xE6F7, 39590 - 11905: 0xF35A, 39591 - 11905: 0xE6F8, 39592 - 11905: 0xB9C7, 39593 - 11905: 0xF35B, 39594 - 11905: 0xF35C, 39595 - 11905: 0xF35D, 39596 - 11905: 0xF35E, 39597 - 11905: 0xF35F, 39598 - 11905: 0xF360, 39599 - 11905: 0xF361, 39600 - 11905: 0xF7BB, 39601 - 11905: 0xF7BA, 39602 - 11905: 0xF362, 39603 - 11905: 0xF363, 39604 - 11905: 0xF364, 39605 - 11905: 0xF365, 39606 - 11905: 0xF7BE, 39607 - 11905: 0xF7BC, 39608 - 11905: 0xBAA1, 39609 - 11905: 0xF366, 39610 - 11905: 0xF7BF, 39611 - 11905: 0xF367, 39612 - 11905: 0xF7C0, 39613 - 11905: 0xF368, 39614 - 11905: 0xF369, 39615 - 11905: 0xF36A, 39616 - 11905: 0xF7C2, 39617 - 11905: 0xF7C1, 39618 - 11905: 0xF7C4, 39619 - 11905: 0xF36B, 39620 - 11905: 0xF36C, 39621 - 11905: 0xF7C3, 39622 - 11905: 0xF36D, 39623 - 11905: 0xF36E, 39624 - 11905: 0xF36F, 39625 - 11905: 0xF370, 39626 - 11905: 0xF371, 39627 - 11905: 0xF7C5, 39628 - 11905: 0xF7C6, 39629 - 11905: 0xF372, 39630 - 11905: 0xF373, 39631 - 11905: 0xF374, 39632 - 11905: 0xF375, 39633 - 11905: 0xF7C7, 39634 - 11905: 0xF376, 39635 - 11905: 0xCBE8, 39636 - 11905: 0xF377, 39637 - 11905: 0xF378, 39638 - 11905: 0xF379, 39639 - 11905: 0xF37A, 39640 - 11905: 0xB8DF, 39641 - 11905: 0xF37B, 39642 - 11905: 0xF37C, 39643 - 11905: 0xF37D, 39644 - 11905: 0xF37E, 39645 - 11905: 0xF380, 39646 - 11905: 0xF381, 39647 - 11905: 0xF7D4, 39648 - 11905: 0xF382, 39649 - 11905: 0xF7D5, 39650 - 11905: 0xF383, 39651 - 11905: 0xF384, 39652 - 11905: 0xF385, 39653 - 11905: 0xF386, 39654 - 11905: 0xF7D6, 39655 - 11905: 0xF387, 39656 - 11905: 0xF388, 39657 - 11905: 0xF389, 39658 - 11905: 0xF38A, 39659 - 11905: 0xF7D8, 39660 - 11905: 0xF38B, 39661 - 11905: 0xF7DA, 39662 - 11905: 0xF38C, 39663 - 11905: 0xF7D7, 39664 - 11905: 0xF38D, 39665 - 11905: 0xF38E, 39666 - 11905: 0xF38F, 39667 - 11905: 0xF390, 39668 - 11905: 0xF391, 39669 - 11905: 0xF392, 39670 - 11905: 0xF393, 39671 - 11905: 0xF394, 39672 - 11905: 0xF395, 39673 - 11905: 0xF7DB, 39674 - 11905: 0xF396, 39675 - 11905: 0xF7D9, 39676 - 11905: 0xF397, 39677 - 11905: 0xF398, 39678 - 11905: 0xF399, 39679 - 11905: 0xF39A, 39680 - 11905: 0xF39B, 39681 - 11905: 0xF39C, 39682 - 11905: 0xF39D, 39683 - 11905: 0xD7D7, 39684 - 11905: 0xF39E, 39685 - 11905: 0xF39F, 39686 - 11905: 0xF3A0, 39687 - 11905: 0xF440, 39688 - 11905: 0xF7DC, 39689 - 11905: 0xF441, 39690 - 11905: 0xF442, 39691 - 11905: 0xF443, 39692 - 11905: 0xF444, 39693 - 11905: 0xF445, 39694 - 11905: 0xF446, 39695 - 11905: 0xF7DD, 39696 - 11905: 0xF447, 39697 - 11905: 0xF448, 39698 - 11905: 0xF449, 39699 - 11905: 0xF7DE, 39700 - 11905: 0xF44A, 39701 - 11905: 0xF44B, 39702 - 11905: 0xF44C, 39703 - 11905: 0xF44D, 39704 - 11905: 0xF44E, 39705 - 11905: 0xF44F, 39706 - 11905: 0xF450, 39707 - 11905: 0xF451, 39708 - 11905: 0xF452, 39709 - 11905: 0xF453, 39710 - 11905: 0xF454, 39711 - 11905: 0xF7DF, 39712 - 11905: 0xF455, 39713 - 11905: 0xF456, 39714 - 11905: 0xF457, 39715 - 11905: 0xF7E0, 39716 - 11905: 0xF458, 39717 - 11905: 0xF459, 39718 - 11905: 0xF45A, 39719 - 11905: 0xF45B, 39720 - 11905: 0xF45C, 39721 - 11905: 0xF45D, 39722 - 11905: 0xF45E, 39723 - 11905: 0xF45F, 39724 - 11905: 0xF460, 39725 - 11905: 0xF461, 39726 - 11905: 0xF462, 39727 - 11905: 0xDBCB, 39728 - 11905: 0xF463, 39729 - 11905: 0xF464, 39730 - 11905: 0xD8AA, 39731 - 11905: 0xF465, 39732 - 11905: 0xF466, 39733 - 11905: 0xF467, 39734 - 11905: 0xF468, 39735 - 11905: 0xF469, 39736 - 11905: 0xF46A, 39737 - 11905: 0xF46B, 39738 - 11905: 0xF46C, 39739 - 11905: 0xE5F7, 39740 - 11905: 0xB9ED, 39741 - 11905: 0xF46D, 39742 - 11905: 0xF46E, 39743 - 11905: 0xF46F, 39744 - 11905: 0xF470, 39745 - 11905: 0xBFFD, 39746 - 11905: 0xBBEA, 39747 - 11905: 0xF7C9, 39748 - 11905: 0xC6C7, 39749 - 11905: 0xF7C8, 39750 - 11905: 0xF471, 39751 - 11905: 0xF7CA, 39752 - 11905: 0xF7CC, 39753 - 11905: 0xF7CB, 39754 - 11905: 0xF472, 39755 - 11905: 0xF473, 39756 - 11905: 0xF474, 39757 - 11905: 0xF7CD, 39758 - 11905: 0xF475, 39759 - 11905: 0xCEBA, 39760 - 11905: 0xF476, 39761 - 11905: 0xF7CE, 39762 - 11905: 0xF477, 39763 - 11905: 0xF478, 39764 - 11905: 0xC4A7, 39765 - 11905: 0xF479, 39766 - 11905: 0xF47A, 39767 - 11905: 0xF47B, 39768 - 11905: 0xF47C, 39769 - 11905: 0xF47D, 39770 - 11905: 0xF47E, 39771 - 11905: 0xF480, 39772 - 11905: 0xF481, 39773 - 11905: 0xF482, 39774 - 11905: 0xF483, 39775 - 11905: 0xF484, 39776 - 11905: 0xF485, 39777 - 11905: 0xF486, 39778 - 11905: 0xF487, 39779 - 11905: 0xF488, 39780 - 11905: 0xF489, 39781 - 11905: 0xF48A, 39782 - 11905: 0xF48B, 39783 - 11905: 0xF48C, 39784 - 11905: 0xF48D, 39785 - 11905: 0xF48E, 39786 - 11905: 0xF48F, 39787 - 11905: 0xF490, 39788 - 11905: 0xF491, 39789 - 11905: 0xF492, 39790 - 11905: 0xF493, 39791 - 11905: 0xF494, 39792 - 11905: 0xF495, 39793 - 11905: 0xF496, 39794 - 11905: 0xF497, 39795 - 11905: 0xF498, 39796 - 11905: 0xF499, 39797 - 11905: 0xF49A, 39798 - 11905: 0xF49B, 39799 - 11905: 0xF49C, 39800 - 11905: 0xF49D, 39801 - 11905: 0xF49E, 39802 - 11905: 0xF49F, 39803 - 11905: 0xF4A0, 39804 - 11905: 0xF540, 39805 - 11905: 0xF541, 39806 - 11905: 0xF542, 39807 - 11905: 0xF543, 39808 - 11905: 0xF544, 39809 - 11905: 0xF545, 39810 - 11905: 0xF546, 39811 - 11905: 0xF547, 39812 - 11905: 0xF548, 39813 - 11905: 0xF549, 39814 - 11905: 0xF54A, 39815 - 11905: 0xF54B, 39816 - 11905: 0xF54C, 39817 - 11905: 0xF54D, 39818 - 11905: 0xF54E, 39819 - 11905: 0xF54F, 39820 - 11905: 0xF550, 39821 - 11905: 0xF551, 39822 - 11905: 0xF552, 39823 - 11905: 0xF553, 39824 - 11905: 0xF554, 39825 - 11905: 0xF555, 39826 - 11905: 0xF556, 39827 - 11905: 0xF557, 39828 - 11905: 0xF558, 39829 - 11905: 0xF559, 39830 - 11905: 0xF55A, 39831 - 11905: 0xF55B, 39832 - 11905: 0xF55C, 39833 - 11905: 0xF55D, 39834 - 11905: 0xF55E, 39835 - 11905: 0xF55F, 39836 - 11905: 0xF560, 39837 - 11905: 0xF561, 39838 - 11905: 0xF562, 39839 - 11905: 0xF563, 39840 - 11905: 0xF564, 39841 - 11905: 0xF565, 39842 - 11905: 0xF566, 39843 - 11905: 0xF567, 39844 - 11905: 0xF568, 39845 - 11905: 0xF569, 39846 - 11905: 0xF56A, 39847 - 11905: 0xF56B, 39848 - 11905: 0xF56C, 39849 - 11905: 0xF56D, 39850 - 11905: 0xF56E, 39851 - 11905: 0xF56F, 39852 - 11905: 0xF570, 39853 - 11905: 0xF571, 39854 - 11905: 0xF572, 39855 - 11905: 0xF573, 39856 - 11905: 0xF574, 39857 - 11905: 0xF575, 39858 - 11905: 0xF576, 39859 - 11905: 0xF577, 39860 - 11905: 0xF578, 39861 - 11905: 0xF579, 39862 - 11905: 0xF57A, 39863 - 11905: 0xF57B, 39864 - 11905: 0xF57C, 39865 - 11905: 0xF57D, 39866 - 11905: 0xF57E, 39867 - 11905: 0xF580, 39868 - 11905: 0xF581, 39869 - 11905: 0xF582, 39870 - 11905: 0xF583, 39871 - 11905: 0xF584, 39872 - 11905: 0xF585, 39873 - 11905: 0xF586, 39874 - 11905: 0xF587, 39875 - 11905: 0xF588, 39876 - 11905: 0xF589, 39877 - 11905: 0xF58A, 39878 - 11905: 0xF58B, 39879 - 11905: 0xF58C, 39880 - 11905: 0xF58D, 39881 - 11905: 0xF58E, 39882 - 11905: 0xF58F, 39883 - 11905: 0xF590, 39884 - 11905: 0xF591, 39885 - 11905: 0xF592, 39886 - 11905: 0xF593, 39887 - 11905: 0xF594, 39888 - 11905: 0xF595, 39889 - 11905: 0xF596, 39890 - 11905: 0xF597, 39891 - 11905: 0xF598, 39892 - 11905: 0xF599, 39893 - 11905: 0xF59A, 39894 - 11905: 0xF59B, 39895 - 11905: 0xF59C, 39896 - 11905: 0xF59D, 39897 - 11905: 0xF59E, 39898 - 11905: 0xF59F, 39899 - 11905: 0xF5A0, 39900 - 11905: 0xF640, 39901 - 11905: 0xF641, 39902 - 11905: 0xF642, 39903 - 11905: 0xF643, 39904 - 11905: 0xF644, 39905 - 11905: 0xF645, 39906 - 11905: 0xF646, 39907 - 11905: 0xF647, 39908 - 11905: 0xF648, 39909 - 11905: 0xF649, 39910 - 11905: 0xF64A, 39911 - 11905: 0xF64B, 39912 - 11905: 0xF64C, 39913 - 11905: 0xF64D, 39914 - 11905: 0xF64E, 39915 - 11905: 0xF64F, 39916 - 11905: 0xF650, 39917 - 11905: 0xF651, 39918 - 11905: 0xF652, 39919 - 11905: 0xF653, 39920 - 11905: 0xF654, 39921 - 11905: 0xF655, 39922 - 11905: 0xF656, 39923 - 11905: 0xF657, 39924 - 11905: 0xF658, 39925 - 11905: 0xF659, 39926 - 11905: 0xF65A, 39927 - 11905: 0xF65B, 39928 - 11905: 0xF65C, 39929 - 11905: 0xF65D, 39930 - 11905: 0xF65E, 39931 - 11905: 0xF65F, 39932 - 11905: 0xF660, 39933 - 11905: 0xF661, 39934 - 11905: 0xF662, 39935 - 11905: 0xF663, 39936 - 11905: 0xF664, 39937 - 11905: 0xF665, 39938 - 11905: 0xF666, 39939 - 11905: 0xF667, 39940 - 11905: 0xF668, 39941 - 11905: 0xF669, 39942 - 11905: 0xF66A, 39943 - 11905: 0xF66B, 39944 - 11905: 0xF66C, 39945 - 11905: 0xF66D, 39946 - 11905: 0xF66E, 39947 - 11905: 0xF66F, 39948 - 11905: 0xF670, 39949 - 11905: 0xF671, 39950 - 11905: 0xF672, 39951 - 11905: 0xF673, 39952 - 11905: 0xF674, 39953 - 11905: 0xF675, 39954 - 11905: 0xF676, 39955 - 11905: 0xF677, 39956 - 11905: 0xF678, 39957 - 11905: 0xF679, 39958 - 11905: 0xF67A, 39959 - 11905: 0xF67B, 39960 - 11905: 0xF67C, 39961 - 11905: 0xF67D, 39962 - 11905: 0xF67E, 39963 - 11905: 0xF680, 39964 - 11905: 0xF681, 39965 - 11905: 0xF682, 39966 - 11905: 0xF683, 39967 - 11905: 0xF684, 39968 - 11905: 0xF685, 39969 - 11905: 0xF686, 39970 - 11905: 0xF687, 39971 - 11905: 0xF688, 39972 - 11905: 0xF689, 39973 - 11905: 0xF68A, 39974 - 11905: 0xF68B, 39975 - 11905: 0xF68C, 39976 - 11905: 0xF68D, 39977 - 11905: 0xF68E, 39978 - 11905: 0xF68F, 39979 - 11905: 0xF690, 39980 - 11905: 0xF691, 39981 - 11905: 0xF692, 39982 - 11905: 0xF693, 39983 - 11905: 0xF694, 39984 - 11905: 0xF695, 39985 - 11905: 0xF696, 39986 - 11905: 0xF697, 39987 - 11905: 0xF698, 39988 - 11905: 0xF699, 39989 - 11905: 0xF69A, 39990 - 11905: 0xF69B, 39991 - 11905: 0xF69C, 39992 - 11905: 0xF69D, 39993 - 11905: 0xF69E, 39994 - 11905: 0xF69F, 39995 - 11905: 0xF6A0, 39996 - 11905: 0xF740, 39997 - 11905: 0xF741, 39998 - 11905: 0xF742, 39999 - 11905: 0xF743, 40000 - 11905: 0xF744, 40001 - 11905: 0xF745, 40002 - 11905: 0xF746, 40003 - 11905: 0xF747, 40004 - 11905: 0xF748, 40005 - 11905: 0xF749, 40006 - 11905: 0xF74A, 40007 - 11905: 0xF74B, 40008 - 11905: 0xF74C, 40009 - 11905: 0xF74D, 40010 - 11905: 0xF74E, 40011 - 11905: 0xF74F, 40012 - 11905: 0xF750, 40013 - 11905: 0xF751, 40014 - 11905: 0xF752, 40015 - 11905: 0xF753, 40016 - 11905: 0xF754, 40017 - 11905: 0xF755, 40018 - 11905: 0xF756, 40019 - 11905: 0xF757, 40020 - 11905: 0xF758, 40021 - 11905: 0xF759, 40022 - 11905: 0xF75A, 40023 - 11905: 0xF75B, 40024 - 11905: 0xF75C, 40025 - 11905: 0xF75D, 40026 - 11905: 0xF75E, 40027 - 11905: 0xF75F, 40028 - 11905: 0xF760, 40029 - 11905: 0xF761, 40030 - 11905: 0xF762, 40031 - 11905: 0xF763, 40032 - 11905: 0xF764, 40033 - 11905: 0xF765, 40034 - 11905: 0xF766, 40035 - 11905: 0xF767, 40036 - 11905: 0xF768, 40037 - 11905: 0xF769, 40038 - 11905: 0xF76A, 40039 - 11905: 0xF76B, 40040 - 11905: 0xF76C, 40041 - 11905: 0xF76D, 40042 - 11905: 0xF76E, 40043 - 11905: 0xF76F, 40044 - 11905: 0xF770, 40045 - 11905: 0xF771, 40046 - 11905: 0xF772, 40047 - 11905: 0xF773, 40048 - 11905: 0xF774, 40049 - 11905: 0xF775, 40050 - 11905: 0xF776, 40051 - 11905: 0xF777, 40052 - 11905: 0xF778, 40053 - 11905: 0xF779, 40054 - 11905: 0xF77A, 40055 - 11905: 0xF77B, 40056 - 11905: 0xF77C, 40057 - 11905: 0xF77D, 40058 - 11905: 0xF77E, 40059 - 11905: 0xF780, 40060 - 11905: 0xD3E3, 40061 - 11905: 0xF781, 40062 - 11905: 0xF782, 40063 - 11905: 0xF6CF, 40064 - 11905: 0xF783, 40065 - 11905: 0xC2B3, 40066 - 11905: 0xF6D0, 40067 - 11905: 0xF784, 40068 - 11905: 0xF785, 40069 - 11905: 0xF6D1, 40070 - 11905: 0xF6D2, 40071 - 11905: 0xF6D3, 40072 - 11905: 0xF6D4, 40073 - 11905: 0xF786, 40074 - 11905: 0xF787, 40075 - 11905: 0xF6D6, 40076 - 11905: 0xF788, 40077 - 11905: 0xB1AB, 40078 - 11905: 0xF6D7, 40079 - 11905: 0xF789, 40080 - 11905: 0xF6D8, 40081 - 11905: 0xF6D9, 40082 - 11905: 0xF6DA, 40083 - 11905: 0xF78A, 40084 - 11905: 0xF6DB, 40085 - 11905: 0xF6DC, 40086 - 11905: 0xF78B, 40087 - 11905: 0xF78C, 40088 - 11905: 0xF78D, 40089 - 11905: 0xF78E, 40090 - 11905: 0xF6DD, 40091 - 11905: 0xF6DE, 40092 - 11905: 0xCFCA, 40093 - 11905: 0xF78F, 40094 - 11905: 0xF6DF, 40095 - 11905: 0xF6E0, 40096 - 11905: 0xF6E1, 40097 - 11905: 0xF6E2, 40098 - 11905: 0xF6E3, 40099 - 11905: 0xF6E4, 40100 - 11905: 0xC0F0, 40101 - 11905: 0xF6E5, 40102 - 11905: 0xF6E6, 40103 - 11905: 0xF6E7, 40104 - 11905: 0xF6E8, 40105 - 11905: 0xF6E9, 40106 - 11905: 0xF790, 40107 - 11905: 0xF6EA, 40108 - 11905: 0xF791, 40109 - 11905: 0xF6EB, 40110 - 11905: 0xF6EC, 40111 - 11905: 0xF792, 40112 - 11905: 0xF6ED, 40113 - 11905: 0xF6EE, 40114 - 11905: 0xF6EF, 40115 - 11905: 0xF6F0, 40116 - 11905: 0xF6F1, 40117 - 11905: 0xF6F2, 40118 - 11905: 0xF6F3, 40119 - 11905: 0xF6F4, 40120 - 11905: 0xBEA8, 40121 - 11905: 0xF793, 40122 - 11905: 0xF6F5, 40123 - 11905: 0xF6F6, 40124 - 11905: 0xF6F7, 40125 - 11905: 0xF6F8, 40126 - 11905: 0xF794, 40127 - 11905: 0xF795, 40128 - 11905: 0xF796, 40129 - 11905: 0xF797, 40130 - 11905: 0xF798, 40131 - 11905: 0xC8FA, 40132 - 11905: 0xF6F9, 40133 - 11905: 0xF6FA, 40134 - 11905: 0xF6FB, 40135 - 11905: 0xF6FC, 40136 - 11905: 0xF799, 40137 - 11905: 0xF79A, 40138 - 11905: 0xF6FD, 40139 - 11905: 0xF6FE, 40140 - 11905: 0xF7A1, 40141 - 11905: 0xF7A2, 40142 - 11905: 0xF7A3, 40143 - 11905: 0xF7A4, 40144 - 11905: 0xF7A5, 40145 - 11905: 0xF79B, 40146 - 11905: 0xF79C, 40147 - 11905: 0xF7A6, 40148 - 11905: 0xF7A7, 40149 - 11905: 0xF7A8, 40150 - 11905: 0xB1EE, 40151 - 11905: 0xF7A9, 40152 - 11905: 0xF7AA, 40153 - 11905: 0xF7AB, 40154 - 11905: 0xF79D, 40155 - 11905: 0xF79E, 40156 - 11905: 0xF7AC, 40157 - 11905: 0xF7AD, 40158 - 11905: 0xC1DB, 40159 - 11905: 0xF7AE, 40160 - 11905: 0xF79F, 40161 - 11905: 0xF7A0, 40162 - 11905: 0xF7AF, 40163 - 11905: 0xF840, 40164 - 11905: 0xF841, 40165 - 11905: 0xF842, 40166 - 11905: 0xF843, 40167 - 11905: 0xF844, 40168 - 11905: 0xF845, 40169 - 11905: 0xF846, 40170 - 11905: 0xF847, 40171 - 11905: 0xF848, 40172 - 11905: 0xF849, 40173 - 11905: 0xF84A, 40174 - 11905: 0xF84B, 40175 - 11905: 0xF84C, 40176 - 11905: 0xF84D, 40177 - 11905: 0xF84E, 40178 - 11905: 0xF84F, 40179 - 11905: 0xF850, 40180 - 11905: 0xF851, 40181 - 11905: 0xF852, 40182 - 11905: 0xF853, 40183 - 11905: 0xF854, 40184 - 11905: 0xF855, 40185 - 11905: 0xF856, 40186 - 11905: 0xF857, 40187 - 11905: 0xF858, 40188 - 11905: 0xF859, 40189 - 11905: 0xF85A, 40190 - 11905: 0xF85B, 40191 - 11905: 0xF85C, 40192 - 11905: 0xF85D, 40193 - 11905: 0xF85E, 40194 - 11905: 0xF85F, 40195 - 11905: 0xF860, 40196 - 11905: 0xF861, 40197 - 11905: 0xF862, 40198 - 11905: 0xF863, 40199 - 11905: 0xF864, 40200 - 11905: 0xF865, 40201 - 11905: 0xF866, 40202 - 11905: 0xF867, 40203 - 11905: 0xF868, 40204 - 11905: 0xF869, 40205 - 11905: 0xF86A, 40206 - 11905: 0xF86B, 40207 - 11905: 0xF86C, 40208 - 11905: 0xF86D, 40209 - 11905: 0xF86E, 40210 - 11905: 0xF86F, 40211 - 11905: 0xF870, 40212 - 11905: 0xF871, 40213 - 11905: 0xF872, 40214 - 11905: 0xF873, 40215 - 11905: 0xF874, 40216 - 11905: 0xF875, 40217 - 11905: 0xF876, 40218 - 11905: 0xF877, 40219 - 11905: 0xF878, 40220 - 11905: 0xF879, 40221 - 11905: 0xF87A, 40222 - 11905: 0xF87B, 40223 - 11905: 0xF87C, 40224 - 11905: 0xF87D, 40225 - 11905: 0xF87E, 40226 - 11905: 0xF880, 40227 - 11905: 0xF881, 40228 - 11905: 0xF882, 40229 - 11905: 0xF883, 40230 - 11905: 0xF884, 40231 - 11905: 0xF885, 40232 - 11905: 0xF886, 40233 - 11905: 0xF887, 40234 - 11905: 0xF888, 40235 - 11905: 0xF889, 40236 - 11905: 0xF88A, 40237 - 11905: 0xF88B, 40238 - 11905: 0xF88C, 40239 - 11905: 0xF88D, 40240 - 11905: 0xF88E, 40241 - 11905: 0xF88F, 40242 - 11905: 0xF890, 40243 - 11905: 0xF891, 40244 - 11905: 0xF892, 40245 - 11905: 0xF893, 40246 - 11905: 0xF894, 40247 - 11905: 0xF895, 40248 - 11905: 0xF896, 40249 - 11905: 0xF897, 40250 - 11905: 0xF898, 40251 - 11905: 0xF899, 40252 - 11905: 0xF89A, 40253 - 11905: 0xF89B, 40254 - 11905: 0xF89C, 40255 - 11905: 0xF89D, 40256 - 11905: 0xF89E, 40257 - 11905: 0xF89F, 40258 - 11905: 0xF8A0, 40259 - 11905: 0xF940, 40260 - 11905: 0xF941, 40261 - 11905: 0xF942, 40262 - 11905: 0xF943, 40263 - 11905: 0xF944, 40264 - 11905: 0xF945, 40265 - 11905: 0xF946, 40266 - 11905: 0xF947, 40267 - 11905: 0xF948, 40268 - 11905: 0xF949, 40269 - 11905: 0xF94A, 40270 - 11905: 0xF94B, 40271 - 11905: 0xF94C, 40272 - 11905: 0xF94D, 40273 - 11905: 0xF94E, 40274 - 11905: 0xF94F, 40275 - 11905: 0xF950, 40276 - 11905: 0xF951, 40277 - 11905: 0xF952, 40278 - 11905: 0xF953, 40279 - 11905: 0xF954, 40280 - 11905: 0xF955, 40281 - 11905: 0xF956, 40282 - 11905: 0xF957, 40283 - 11905: 0xF958, 40284 - 11905: 0xF959, 40285 - 11905: 0xF95A, 40286 - 11905: 0xF95B, 40287 - 11905: 0xF95C, 40288 - 11905: 0xF95D, 40289 - 11905: 0xF95E, 40290 - 11905: 0xF95F, 40291 - 11905: 0xF960, 40292 - 11905: 0xF961, 40293 - 11905: 0xF962, 40294 - 11905: 0xF963, 40295 - 11905: 0xF964, 40296 - 11905: 0xF965, 40297 - 11905: 0xF966, 40298 - 11905: 0xF967, 40299 - 11905: 0xF968, 40300 - 11905: 0xF969, 40301 - 11905: 0xF96A, 40302 - 11905: 0xF96B, 40303 - 11905: 0xF96C, 40304 - 11905: 0xF96D, 40305 - 11905: 0xF96E, 40306 - 11905: 0xF96F, 40307 - 11905: 0xF970, 40308 - 11905: 0xF971, 40309 - 11905: 0xF972, 40310 - 11905: 0xF973, 40311 - 11905: 0xF974, 40312 - 11905: 0xF975, 40313 - 11905: 0xF976, 40314 - 11905: 0xF977, 40315 - 11905: 0xF978, 40316 - 11905: 0xF979, 40317 - 11905: 0xF97A, 40318 - 11905: 0xF97B, 40319 - 11905: 0xF97C, 40320 - 11905: 0xF97D, 40321 - 11905: 0xF97E, 40322 - 11905: 0xF980, 40323 - 11905: 0xF981, 40324 - 11905: 0xF982, 40325 - 11905: 0xF983, 40326 - 11905: 0xF984, 40327 - 11905: 0xF985, 40328 - 11905: 0xF986, 40329 - 11905: 0xF987, 40330 - 11905: 0xF988, 40331 - 11905: 0xF989, 40332 - 11905: 0xF98A, 40333 - 11905: 0xF98B, 40334 - 11905: 0xF98C, 40335 - 11905: 0xF98D, 40336 - 11905: 0xF98E, 40337 - 11905: 0xF98F, 40338 - 11905: 0xF990, 40339 - 11905: 0xF991, 40340 - 11905: 0xF992, 40341 - 11905: 0xF993, 40342 - 11905: 0xF994, 40343 - 11905: 0xF995, 40344 - 11905: 0xF996, 40345 - 11905: 0xF997, 40346 - 11905: 0xF998, 40347 - 11905: 0xF999, 40348 - 11905: 0xF99A, 40349 - 11905: 0xF99B, 40350 - 11905: 0xF99C, 40351 - 11905: 0xF99D, 40352 - 11905: 0xF99E, 40353 - 11905: 0xF99F, 40354 - 11905: 0xF9A0, 40355 - 11905: 0xFA40, 40356 - 11905: 0xFA41, 40357 - 11905: 0xFA42, 40358 - 11905: 0xFA43, 40359 - 11905: 0xFA44, 40360 - 11905: 0xFA45, 40361 - 11905: 0xFA46, 40362 - 11905: 0xFA47, 40363 - 11905: 0xFA48, 40364 - 11905: 0xFA49, 40365 - 11905: 0xFA4A, 40366 - 11905: 0xFA4B, 40367 - 11905: 0xFA4C, 40368 - 11905: 0xFA4D, 40369 - 11905: 0xFA4E, 40370 - 11905: 0xFA4F, 40371 - 11905: 0xFA50, 40372 - 11905: 0xFA51, 40373 - 11905: 0xFA52, 40374 - 11905: 0xFA53, 40375 - 11905: 0xFA54, 40376 - 11905: 0xFA55, 40377 - 11905: 0xFA56, 40378 - 11905: 0xFA57, 40379 - 11905: 0xFA58, 40380 - 11905: 0xFA59, 40381 - 11905: 0xFA5A, 40382 - 11905: 0xFA5B, 40383 - 11905: 0xFA5C, 40384 - 11905: 0xFA5D, 40385 - 11905: 0xFA5E, 40386 - 11905: 0xFA5F, 40387 - 11905: 0xFA60, 40388 - 11905: 0xFA61, 40389 - 11905: 0xFA62, 40390 - 11905: 0xFA63, 40391 - 11905: 0xFA64, 40392 - 11905: 0xFA65, 40393 - 11905: 0xFA66, 40394 - 11905: 0xFA67, 40395 - 11905: 0xFA68, 40396 - 11905: 0xFA69, 40397 - 11905: 0xFA6A, 40398 - 11905: 0xFA6B, 40399 - 11905: 0xFA6C, 40400 - 11905: 0xFA6D, 40401 - 11905: 0xFA6E, 40402 - 11905: 0xFA6F, 40403 - 11905: 0xFA70, 40404 - 11905: 0xFA71, 40405 - 11905: 0xFA72, 40406 - 11905: 0xFA73, 40407 - 11905: 0xFA74, 40408 - 11905: 0xFA75, 40409 - 11905: 0xFA76, 40410 - 11905: 0xFA77, 40411 - 11905: 0xFA78, 40412 - 11905: 0xFA79, 40413 - 11905: 0xFA7A, 40414 - 11905: 0xFA7B, 40415 - 11905: 0xFA7C, 40416 - 11905: 0xFA7D, 40417 - 11905: 0xFA7E, 40418 - 11905: 0xFA80, 40419 - 11905: 0xFA81, 40420 - 11905: 0xFA82, 40421 - 11905: 0xFA83, 40422 - 11905: 0xFA84, 40423 - 11905: 0xFA85, 40424 - 11905: 0xFA86, 40425 - 11905: 0xFA87, 40426 - 11905: 0xFA88, 40427 - 11905: 0xFA89, 40428 - 11905: 0xFA8A, 40429 - 11905: 0xFA8B, 40430 - 11905: 0xFA8C, 40431 - 11905: 0xFA8D, 40432 - 11905: 0xFA8E, 40433 - 11905: 0xFA8F, 40434 - 11905: 0xFA90, 40435 - 11905: 0xFA91, 40436 - 11905: 0xFA92, 40437 - 11905: 0xFA93, 40438 - 11905: 0xFA94, 40439 - 11905: 0xFA95, 40440 - 11905: 0xFA96, 40441 - 11905: 0xFA97, 40442 - 11905: 0xFA98, 40443 - 11905: 0xFA99, 40444 - 11905: 0xFA9A, 40445 - 11905: 0xFA9B, 40446 - 11905: 0xFA9C, 40447 - 11905: 0xFA9D, 40448 - 11905: 0xFA9E, 40449 - 11905: 0xFA9F, 40450 - 11905: 0xFAA0, 40451 - 11905: 0xFB40, 40452 - 11905: 0xFB41, 40453 - 11905: 0xFB42, 40454 - 11905: 0xFB43, 40455 - 11905: 0xFB44, 40456 - 11905: 0xFB45, 40457 - 11905: 0xFB46, 40458 - 11905: 0xFB47, 40459 - 11905: 0xFB48, 40460 - 11905: 0xFB49, 40461 - 11905: 0xFB4A, 40462 - 11905: 0xFB4B, 40463 - 11905: 0xFB4C, 40464 - 11905: 0xFB4D, 40465 - 11905: 0xFB4E, 40466 - 11905: 0xFB4F, 40467 - 11905: 0xFB50, 40468 - 11905: 0xFB51, 40469 - 11905: 0xFB52, 40470 - 11905: 0xFB53, 40471 - 11905: 0xFB54, 40472 - 11905: 0xFB55, 40473 - 11905: 0xFB56, 40474 - 11905: 0xFB57, 40475 - 11905: 0xFB58, 40476 - 11905: 0xFB59, 40477 - 11905: 0xFB5A, 40478 - 11905: 0xFB5B, 40479 - 11905: 0xC4F1, 40480 - 11905: 0xF0AF, 40481 - 11905: 0xBCA6, 40482 - 11905: 0xF0B0, 40483 - 11905: 0xC3F9, 40484 - 11905: 0xFB5C, 40485 - 11905: 0xC5B8, 40486 - 11905: 0xD1BB, 40487 - 11905: 0xFB5D, 40488 - 11905: 0xF0B1, 40489 - 11905: 0xF0B2, 40490 - 11905: 0xF0B3, 40491 - 11905: 0xF0B4, 40492 - 11905: 0xF0B5, 40493 - 11905: 0xD1BC, 40494 - 11905: 0xFB5E, 40495 - 11905: 0xD1EC, 40496 - 11905: 0xFB5F, 40497 - 11905: 0xF0B7, 40498 - 11905: 0xF0B6, 40499 - 11905: 0xD4A7, 40500 - 11905: 0xFB60, 40501 - 11905: 0xCDD2, 40502 - 11905: 0xF0B8, 40503 - 11905: 0xF0BA, 40504 - 11905: 0xF0B9, 40505 - 11905: 0xF0BB, 40506 - 11905: 0xF0BC, 40507 - 11905: 0xFB61, 40508 - 11905: 0xFB62, 40509 - 11905: 0xB8EB, 40510 - 11905: 0xF0BD, 40511 - 11905: 0xBAE8, 40512 - 11905: 0xFB63, 40513 - 11905: 0xF0BE, 40514 - 11905: 0xF0BF, 40515 - 11905: 0xBEE9, 40516 - 11905: 0xF0C0, 40517 - 11905: 0xB6EC, 40518 - 11905: 0xF0C1, 40519 - 11905: 0xF0C2, 40520 - 11905: 0xF0C3, 40521 - 11905: 0xF0C4, 40522 - 11905: 0xC8B5, 40523 - 11905: 0xF0C5, 40524 - 11905: 0xF0C6, 40525 - 11905: 0xFB64, 40526 - 11905: 0xF0C7, 40527 - 11905: 0xC5F4, 40528 - 11905: 0xFB65, 40529 - 11905: 0xF0C8, 40530 - 11905: 0xFB66, 40531 - 11905: 0xFB67, 40532 - 11905: 0xFB68, 40533 - 11905: 0xF0C9, 40534 - 11905: 0xFB69, 40535 - 11905: 0xF0CA, 40536 - 11905: 0xF7BD, 40537 - 11905: 0xFB6A, 40538 - 11905: 0xF0CB, 40539 - 11905: 0xF0CC, 40540 - 11905: 0xF0CD, 40541 - 11905: 0xFB6B, 40542 - 11905: 0xF0CE, 40543 - 11905: 0xFB6C, 40544 - 11905: 0xFB6D, 40545 - 11905: 0xFB6E, 40546 - 11905: 0xFB6F, 40547 - 11905: 0xF0CF, 40548 - 11905: 0xBAD7, 40549 - 11905: 0xFB70, 40550 - 11905: 0xF0D0, 40551 - 11905: 0xF0D1, 40552 - 11905: 0xF0D2, 40553 - 11905: 0xF0D3, 40554 - 11905: 0xF0D4, 40555 - 11905: 0xF0D5, 40556 - 11905: 0xF0D6, 40557 - 11905: 0xF0D8, 40558 - 11905: 0xFB71, 40559 - 11905: 0xFB72, 40560 - 11905: 0xD3A5, 40561 - 11905: 0xF0D7, 40562 - 11905: 0xFB73, 40563 - 11905: 0xF0D9, 40564 - 11905: 0xFB74, 40565 - 11905: 0xFB75, 40566 - 11905: 0xFB76, 40567 - 11905: 0xFB77, 40568 - 11905: 0xFB78, 40569 - 11905: 0xFB79, 40570 - 11905: 0xFB7A, 40571 - 11905: 0xFB7B, 40572 - 11905: 0xFB7C, 40573 - 11905: 0xFB7D, 40574 - 11905: 0xF5BA, 40575 - 11905: 0xC2B9, 40576 - 11905: 0xFB7E, 40577 - 11905: 0xFB80, 40578 - 11905: 0xF7E4, 40579 - 11905: 0xFB81, 40580 - 11905: 0xFB82, 40581 - 11905: 0xFB83, 40582 - 11905: 0xFB84, 40583 - 11905: 0xF7E5, 40584 - 11905: 0xF7E6, 40585 - 11905: 0xFB85, 40586 - 11905: 0xFB86, 40587 - 11905: 0xF7E7, 40588 - 11905: 0xFB87, 40589 - 11905: 0xFB88, 40590 - 11905: 0xFB89, 40591 - 11905: 0xFB8A, 40592 - 11905: 0xFB8B, 40593 - 11905: 0xFB8C, 40594 - 11905: 0xF7E8, 40595 - 11905: 0xC2B4, 40596 - 11905: 0xFB8D, 40597 - 11905: 0xFB8E, 40598 - 11905: 0xFB8F, 40599 - 11905: 0xFB90, 40600 - 11905: 0xFB91, 40601 - 11905: 0xFB92, 40602 - 11905: 0xFB93, 40603 - 11905: 0xFB94, 40604 - 11905: 0xFB95, 40605 - 11905: 0xF7EA, 40606 - 11905: 0xFB96, 40607 - 11905: 0xF7EB, 40608 - 11905: 0xFB97, 40609 - 11905: 0xFB98, 40610 - 11905: 0xFB99, 40611 - 11905: 0xFB9A, 40612 - 11905: 0xFB9B, 40613 - 11905: 0xFB9C, 40614 - 11905: 0xC2F3, 40615 - 11905: 0xFB9D, 40616 - 11905: 0xFB9E, 40617 - 11905: 0xFB9F, 40618 - 11905: 0xFBA0, 40619 - 11905: 0xFC40, 40620 - 11905: 0xFC41, 40621 - 11905: 0xFC42, 40622 - 11905: 0xFC43, 40623 - 11905: 0xFC44, 40624 - 11905: 0xFC45, 40625 - 11905: 0xFC46, 40626 - 11905: 0xFC47, 40627 - 11905: 0xFC48, 40628 - 11905: 0xF4F0, 40629 - 11905: 0xFC49, 40630 - 11905: 0xFC4A, 40631 - 11905: 0xFC4B, 40632 - 11905: 0xF4EF, 40633 - 11905: 0xFC4C, 40634 - 11905: 0xFC4D, 40635 - 11905: 0xC2E9, 40636 - 11905: 0xFC4E, 40637 - 11905: 0xF7E1, 40638 - 11905: 0xF7E2, 40639 - 11905: 0xFC4F, 40640 - 11905: 0xFC50, 40641 - 11905: 0xFC51, 40642 - 11905: 0xFC52, 40643 - 11905: 0xFC53, 40644 - 11905: 0xBBC6, 40645 - 11905: 0xFC54, 40646 - 11905: 0xFC55, 40647 - 11905: 0xFC56, 40648 - 11905: 0xFC57, 40649 - 11905: 0xD9E4, 40650 - 11905: 0xFC58, 40651 - 11905: 0xFC59, 40652 - 11905: 0xFC5A, 40653 - 11905: 0xCAF2, 40654 - 11905: 0xC0E8, 40655 - 11905: 0xF0A4, 40656 - 11905: 0xFC5B, 40657 - 11905: 0xBADA, 40658 - 11905: 0xFC5C, 40659 - 11905: 0xFC5D, 40660 - 11905: 0xC7AD, 40661 - 11905: 0xFC5E, 40662 - 11905: 0xFC5F, 40663 - 11905: 0xFC60, 40664 - 11905: 0xC4AC, 40665 - 11905: 0xFC61, 40666 - 11905: 0xFC62, 40667 - 11905: 0xF7EC, 40668 - 11905: 0xF7ED, 40669 - 11905: 0xF7EE, 40670 - 11905: 0xFC63, 40671 - 11905: 0xF7F0, 40672 - 11905: 0xF7EF, 40673 - 11905: 0xFC64, 40674 - 11905: 0xF7F1, 40675 - 11905: 0xFC65, 40676 - 11905: 0xFC66, 40677 - 11905: 0xF7F4, 40678 - 11905: 0xFC67, 40679 - 11905: 0xF7F3, 40680 - 11905: 0xFC68, 40681 - 11905: 0xF7F2, 40682 - 11905: 0xF7F5, 40683 - 11905: 0xFC69, 40684 - 11905: 0xFC6A, 40685 - 11905: 0xFC6B, 40686 - 11905: 0xFC6C, 40687 - 11905: 0xF7F6, 40688 - 11905: 0xFC6D, 40689 - 11905: 0xFC6E, 40690 - 11905: 0xFC6F, 40691 - 11905: 0xFC70, 40692 - 11905: 0xFC71, 40693 - 11905: 0xFC72, 40694 - 11905: 0xFC73, 40695 - 11905: 0xFC74, 40696 - 11905: 0xFC75, 40697 - 11905: 0xEDE9, 40698 - 11905: 0xFC76, 40699 - 11905: 0xEDEA, 40700 - 11905: 0xEDEB, 40701 - 11905: 0xFC77, 40702 - 11905: 0xF6BC, 40703 - 11905: 0xFC78, 40704 - 11905: 0xFC79, 40705 - 11905: 0xFC7A, 40706 - 11905: 0xFC7B, 40707 - 11905: 0xFC7C, 40708 - 11905: 0xFC7D, 40709 - 11905: 0xFC7E, 40710 - 11905: 0xFC80, 40711 - 11905: 0xFC81, 40712 - 11905: 0xFC82, 40713 - 11905: 0xFC83, 40714 - 11905: 0xFC84, 40715 - 11905: 0xF6BD, 40716 - 11905: 0xFC85, 40717 - 11905: 0xF6BE, 40718 - 11905: 0xB6A6, 40719 - 11905: 0xFC86, 40720 - 11905: 0xD8BE, 40721 - 11905: 0xFC87, 40722 - 11905: 0xFC88, 40723 - 11905: 0xB9C4, 40724 - 11905: 0xFC89, 40725 - 11905: 0xFC8A, 40726 - 11905: 0xFC8B, 40727 - 11905: 0xD8BB, 40728 - 11905: 0xFC8C, 40729 - 11905: 0xDCB1, 40730 - 11905: 0xFC8D, 40731 - 11905: 0xFC8E, 40732 - 11905: 0xFC8F, 40733 - 11905: 0xFC90, 40734 - 11905: 0xFC91, 40735 - 11905: 0xFC92, 40736 - 11905: 0xCAF3, 40737 - 11905: 0xFC93, 40738 - 11905: 0xF7F7, 40739 - 11905: 0xFC94, 40740 - 11905: 0xFC95, 40741 - 11905: 0xFC96, 40742 - 11905: 0xFC97, 40743 - 11905: 0xFC98, 40744 - 11905: 0xFC99, 40745 - 11905: 0xFC9A, 40746 - 11905: 0xFC9B, 40747 - 11905: 0xFC9C, 40748 - 11905: 0xF7F8, 40749 - 11905: 0xFC9D, 40750 - 11905: 0xFC9E, 40751 - 11905: 0xF7F9, 40752 - 11905: 0xFC9F, 40753 - 11905: 0xFCA0, 40754 - 11905: 0xFD40, 40755 - 11905: 0xFD41, 40756 - 11905: 0xFD42, 40757 - 11905: 0xFD43, 40758 - 11905: 0xFD44, 40759 - 11905: 0xF7FB, 40760 - 11905: 0xFD45, 40761 - 11905: 0xF7FA, 40762 - 11905: 0xFD46, 40763 - 11905: 0xB1C7, 40764 - 11905: 0xFD47, 40765 - 11905: 0xF7FC, 40766 - 11905: 0xF7FD, 40767 - 11905: 0xFD48, 40768 - 11905: 0xFD49, 40769 - 11905: 0xFD4A, 40770 - 11905: 0xFD4B, 40771 - 11905: 0xFD4C, 40772 - 11905: 0xF7FE, 40773 - 11905: 0xFD4D, 40774 - 11905: 0xFD4E, 40775 - 11905: 0xFD4F, 40776 - 11905: 0xFD50, 40777 - 11905: 0xFD51, 40778 - 11905: 0xFD52, 40779 - 11905: 0xFD53, 40780 - 11905: 0xFD54, 40781 - 11905: 0xFD55, 40782 - 11905: 0xFD56, 40783 - 11905: 0xFD57, 40784 - 11905: 0xC6EB, 40785 - 11905: 0xECB4, 40786 - 11905: 0xFD58, 40787 - 11905: 0xFD59, 40788 - 11905: 0xFD5A, 40789 - 11905: 0xFD5B, 40790 - 11905: 0xFD5C, 40791 - 11905: 0xFD5D, 40792 - 11905: 0xFD5E, 40793 - 11905: 0xFD5F, 40794 - 11905: 0xFD60, 40795 - 11905: 0xFD61, 40796 - 11905: 0xFD62, 40797 - 11905: 0xFD63, 40798 - 11905: 0xFD64, 40799 - 11905: 0xFD65, 40800 - 11905: 0xFD66, 40801 - 11905: 0xFD67, 40802 - 11905: 0xFD68, 40803 - 11905: 0xFD69, 40804 - 11905: 0xFD6A, 40805 - 11905: 0xFD6B, 40806 - 11905: 0xFD6C, 40807 - 11905: 0xFD6D, 40808 - 11905: 0xFD6E, 40809 - 11905: 0xFD6F, 40810 - 11905: 0xFD70, 40811 - 11905: 0xFD71, 40812 - 11905: 0xFD72, 40813 - 11905: 0xFD73, 40814 - 11905: 0xFD74, 40815 - 11905: 0xFD75, 40816 - 11905: 0xFD76, 40817 - 11905: 0xFD77, 40818 - 11905: 0xFD78, 40819 - 11905: 0xFD79, 40820 - 11905: 0xFD7A, 40821 - 11905: 0xFD7B, 40822 - 11905: 0xFD7C, 40823 - 11905: 0xFD7D, 40824 - 11905: 0xFD7E, 40825 - 11905: 0xFD80, 40826 - 11905: 0xFD81, 40827 - 11905: 0xFD82, 40828 - 11905: 0xFD83, 40829 - 11905: 0xFD84, 40830 - 11905: 0xFD85, 40831 - 11905: 0xB3DD, 40832 - 11905: 0xF6B3, 40833 - 11905: 0xFD86, 40834 - 11905: 0xFD87, 40835 - 11905: 0xF6B4, 40836 - 11905: 0xC1E4, 40837 - 11905: 0xF6B5, 40838 - 11905: 0xF6B6, 40839 - 11905: 0xF6B7, 40840 - 11905: 0xF6B8, 40841 - 11905: 0xF6B9, 40842 - 11905: 0xF6BA, 40843 - 11905: 0xC8A3, 40844 - 11905: 0xF6BB, 40845 - 11905: 0xFD88, 40846 - 11905: 0xFD89, 40847 - 11905: 0xFD8A, 40848 - 11905: 0xFD8B, 40849 - 11905: 0xFD8C, 40850 - 11905: 0xFD8D, 40851 - 11905: 0xFD8E, 40852 - 11905: 0xFD8F, 40853 - 11905: 0xFD90, 40854 - 11905: 0xFD91, 40855 - 11905: 0xFD92, 40856 - 11905: 0xFD93, 40857 - 11905: 0xC1FA, 40858 - 11905: 0xB9A8, 40859 - 11905: 0xEDE8, 40860 - 11905: 0xFD94, 40861 - 11905: 0xFD95, 40862 - 11905: 0xFD96, 40863 - 11905: 0xB9EA, 40864 - 11905: 0xD9DF, 40865 - 11905: 0xFD97, 40866 - 11905: 0xFD98, 40867 - 11905: 0xFD99, 40868 - 11905: 0xFD9A, 40869 - 11905: 0xFD9B, } const encode1Low, encode1High = 8208, 9795 var encode1 = [...]uint16{ 8208 - 8208: 0xA95C, 8211 - 8208: 0xA843, 8212 - 8208: 0xA1AA, 8213 - 8208: 0xA844, 8214 - 8208: 0xA1AC, 8216 - 8208: 0xA1AE, 8217 - 8208: 0xA1AF, 8220 - 8208: 0xA1B0, 8221 - 8208: 0xA1B1, 8229 - 8208: 0xA845, 8230 - 8208: 0xA1AD, 8240 - 8208: 0xA1EB, 8242 - 8208: 0xA1E4, 8243 - 8208: 0xA1E5, 8245 - 8208: 0xA846, 8251 - 8208: 0xA1F9, 8364 - 8208: 0xA2E3, 8451 - 8208: 0xA1E6, 8453 - 8208: 0xA847, 8457 - 8208: 0xA848, 8470 - 8208: 0xA1ED, 8481 - 8208: 0xA959, 8544 - 8208: 0xA2F1, 8545 - 8208: 0xA2F2, 8546 - 8208: 0xA2F3, 8547 - 8208: 0xA2F4, 8548 - 8208: 0xA2F5, 8549 - 8208: 0xA2F6, 8550 - 8208: 0xA2F7, 8551 - 8208: 0xA2F8, 8552 - 8208: 0xA2F9, 8553 - 8208: 0xA2FA, 8554 - 8208: 0xA2FB, 8555 - 8208: 0xA2FC, 8560 - 8208: 0xA2A1, 8561 - 8208: 0xA2A2, 8562 - 8208: 0xA2A3, 8563 - 8208: 0xA2A4, 8564 - 8208: 0xA2A5, 8565 - 8208: 0xA2A6, 8566 - 8208: 0xA2A7, 8567 - 8208: 0xA2A8, 8568 - 8208: 0xA2A9, 8569 - 8208: 0xA2AA, 8592 - 8208: 0xA1FB, 8593 - 8208: 0xA1FC, 8594 - 8208: 0xA1FA, 8595 - 8208: 0xA1FD, 8598 - 8208: 0xA849, 8599 - 8208: 0xA84A, 8600 - 8208: 0xA84B, 8601 - 8208: 0xA84C, 8712 - 8208: 0xA1CA, 8719 - 8208: 0xA1C7, 8721 - 8208: 0xA1C6, 8725 - 8208: 0xA84D, 8730 - 8208: 0xA1CC, 8733 - 8208: 0xA1D8, 8734 - 8208: 0xA1DE, 8735 - 8208: 0xA84E, 8736 - 8208: 0xA1CF, 8739 - 8208: 0xA84F, 8741 - 8208: 0xA1CE, 8743 - 8208: 0xA1C4, 8744 - 8208: 0xA1C5, 8745 - 8208: 0xA1C9, 8746 - 8208: 0xA1C8, 8747 - 8208: 0xA1D2, 8750 - 8208: 0xA1D3, 8756 - 8208: 0xA1E0, 8757 - 8208: 0xA1DF, 8758 - 8208: 0xA1C3, 8759 - 8208: 0xA1CB, 8765 - 8208: 0xA1D7, 8776 - 8208: 0xA1D6, 8780 - 8208: 0xA1D5, 8786 - 8208: 0xA850, 8800 - 8208: 0xA1D9, 8801 - 8208: 0xA1D4, 8804 - 8208: 0xA1DC, 8805 - 8208: 0xA1DD, 8806 - 8208: 0xA851, 8807 - 8208: 0xA852, 8814 - 8208: 0xA1DA, 8815 - 8208: 0xA1DB, 8853 - 8208: 0xA892, 8857 - 8208: 0xA1D1, 8869 - 8208: 0xA1CD, 8895 - 8208: 0xA853, 8978 - 8208: 0xA1D0, 9312 - 8208: 0xA2D9, 9313 - 8208: 0xA2DA, 9314 - 8208: 0xA2DB, 9315 - 8208: 0xA2DC, 9316 - 8208: 0xA2DD, 9317 - 8208: 0xA2DE, 9318 - 8208: 0xA2DF, 9319 - 8208: 0xA2E0, 9320 - 8208: 0xA2E1, 9321 - 8208: 0xA2E2, 9332 - 8208: 0xA2C5, 9333 - 8208: 0xA2C6, 9334 - 8208: 0xA2C7, 9335 - 8208: 0xA2C8, 9336 - 8208: 0xA2C9, 9337 - 8208: 0xA2CA, 9338 - 8208: 0xA2CB, 9339 - 8208: 0xA2CC, 9340 - 8208: 0xA2CD, 9341 - 8208: 0xA2CE, 9342 - 8208: 0xA2CF, 9343 - 8208: 0xA2D0, 9344 - 8208: 0xA2D1, 9345 - 8208: 0xA2D2, 9346 - 8208: 0xA2D3, 9347 - 8208: 0xA2D4, 9348 - 8208: 0xA2D5, 9349 - 8208: 0xA2D6, 9350 - 8208: 0xA2D7, 9351 - 8208: 0xA2D8, 9352 - 8208: 0xA2B1, 9353 - 8208: 0xA2B2, 9354 - 8208: 0xA2B3, 9355 - 8208: 0xA2B4, 9356 - 8208: 0xA2B5, 9357 - 8208: 0xA2B6, 9358 - 8208: 0xA2B7, 9359 - 8208: 0xA2B8, 9360 - 8208: 0xA2B9, 9361 - 8208: 0xA2BA, 9362 - 8208: 0xA2BB, 9363 - 8208: 0xA2BC, 9364 - 8208: 0xA2BD, 9365 - 8208: 0xA2BE, 9366 - 8208: 0xA2BF, 9367 - 8208: 0xA2C0, 9368 - 8208: 0xA2C1, 9369 - 8208: 0xA2C2, 9370 - 8208: 0xA2C3, 9371 - 8208: 0xA2C4, 9472 - 8208: 0xA9A4, 9473 - 8208: 0xA9A5, 9474 - 8208: 0xA9A6, 9475 - 8208: 0xA9A7, 9476 - 8208: 0xA9A8, 9477 - 8208: 0xA9A9, 9478 - 8208: 0xA9AA, 9479 - 8208: 0xA9AB, 9480 - 8208: 0xA9AC, 9481 - 8208: 0xA9AD, 9482 - 8208: 0xA9AE, 9483 - 8208: 0xA9AF, 9484 - 8208: 0xA9B0, 9485 - 8208: 0xA9B1, 9486 - 8208: 0xA9B2, 9487 - 8208: 0xA9B3, 9488 - 8208: 0xA9B4, 9489 - 8208: 0xA9B5, 9490 - 8208: 0xA9B6, 9491 - 8208: 0xA9B7, 9492 - 8208: 0xA9B8, 9493 - 8208: 0xA9B9, 9494 - 8208: 0xA9BA, 9495 - 8208: 0xA9BB, 9496 - 8208: 0xA9BC, 9497 - 8208: 0xA9BD, 9498 - 8208: 0xA9BE, 9499 - 8208: 0xA9BF, 9500 - 8208: 0xA9C0, 9501 - 8208: 0xA9C1, 9502 - 8208: 0xA9C2, 9503 - 8208: 0xA9C3, 9504 - 8208: 0xA9C4, 9505 - 8208: 0xA9C5, 9506 - 8208: 0xA9C6, 9507 - 8208: 0xA9C7, 9508 - 8208: 0xA9C8, 9509 - 8208: 0xA9C9, 9510 - 8208: 0xA9CA, 9511 - 8208: 0xA9CB, 9512 - 8208: 0xA9CC, 9513 - 8208: 0xA9CD, 9514 - 8208: 0xA9CE, 9515 - 8208: 0xA9CF, 9516 - 8208: 0xA9D0, 9517 - 8208: 0xA9D1, 9518 - 8208: 0xA9D2, 9519 - 8208: 0xA9D3, 9520 - 8208: 0xA9D4, 9521 - 8208: 0xA9D5, 9522 - 8208: 0xA9D6, 9523 - 8208: 0xA9D7, 9524 - 8208: 0xA9D8, 9525 - 8208: 0xA9D9, 9526 - 8208: 0xA9DA, 9527 - 8208: 0xA9DB, 9528 - 8208: 0xA9DC, 9529 - 8208: 0xA9DD, 9530 - 8208: 0xA9DE, 9531 - 8208: 0xA9DF, 9532 - 8208: 0xA9E0, 9533 - 8208: 0xA9E1, 9534 - 8208: 0xA9E2, 9535 - 8208: 0xA9E3, 9536 - 8208: 0xA9E4, 9537 - 8208: 0xA9E5, 9538 - 8208: 0xA9E6, 9539 - 8208: 0xA9E7, 9540 - 8208: 0xA9E8, 9541 - 8208: 0xA9E9, 9542 - 8208: 0xA9EA, 9543 - 8208: 0xA9EB, 9544 - 8208: 0xA9EC, 9545 - 8208: 0xA9ED, 9546 - 8208: 0xA9EE, 9547 - 8208: 0xA9EF, 9552 - 8208: 0xA854, 9553 - 8208: 0xA855, 9554 - 8208: 0xA856, 9555 - 8208: 0xA857, 9556 - 8208: 0xA858, 9557 - 8208: 0xA859, 9558 - 8208: 0xA85A, 9559 - 8208: 0xA85B, 9560 - 8208: 0xA85C, 9561 - 8208: 0xA85D, 9562 - 8208: 0xA85E, 9563 - 8208: 0xA85F, 9564 - 8208: 0xA860, 9565 - 8208: 0xA861, 9566 - 8208: 0xA862, 9567 - 8208: 0xA863, 9568 - 8208: 0xA864, 9569 - 8208: 0xA865, 9570 - 8208: 0xA866, 9571 - 8208: 0xA867, 9572 - 8208: 0xA868, 9573 - 8208: 0xA869, 9574 - 8208: 0xA86A, 9575 - 8208: 0xA86B, 9576 - 8208: 0xA86C, 9577 - 8208: 0xA86D, 9578 - 8208: 0xA86E, 9579 - 8208: 0xA86F, 9580 - 8208: 0xA870, 9581 - 8208: 0xA871, 9582 - 8208: 0xA872, 9583 - 8208: 0xA873, 9584 - 8208: 0xA874, 9585 - 8208: 0xA875, 9586 - 8208: 0xA876, 9587 - 8208: 0xA877, 9601 - 8208: 0xA878, 9602 - 8208: 0xA879, 9603 - 8208: 0xA87A, 9604 - 8208: 0xA87B, 9605 - 8208: 0xA87C, 9606 - 8208: 0xA87D, 9607 - 8208: 0xA87E, 9608 - 8208: 0xA880, 9609 - 8208: 0xA881, 9610 - 8208: 0xA882, 9611 - 8208: 0xA883, 9612 - 8208: 0xA884, 9613 - 8208: 0xA885, 9614 - 8208: 0xA886, 9615 - 8208: 0xA887, 9619 - 8208: 0xA888, 9620 - 8208: 0xA889, 9621 - 8208: 0xA88A, 9632 - 8208: 0xA1F6, 9633 - 8208: 0xA1F5, 9650 - 8208: 0xA1F8, 9651 - 8208: 0xA1F7, 9660 - 8208: 0xA88B, 9661 - 8208: 0xA88C, 9670 - 8208: 0xA1F4, 9671 - 8208: 0xA1F3, 9675 - 8208: 0xA1F0, 9678 - 8208: 0xA1F2, 9679 - 8208: 0xA1F1, 9698 - 8208: 0xA88D, 9699 - 8208: 0xA88E, 9700 - 8208: 0xA88F, 9701 - 8208: 0xA890, 9733 - 8208: 0xA1EF, 9734 - 8208: 0xA1EE, 9737 - 8208: 0xA891, 9792 - 8208: 0xA1E2, 9794 - 8208: 0xA1E1, } const encode2Low, encode2High = 164, 1106 var encode2 = [...]uint16{ 164 - 164: 0xA1E8, 167 - 164: 0xA1EC, 168 - 164: 0xA1A7, 176 - 164: 0xA1E3, 177 - 164: 0xA1C0, 183 - 164: 0xA1A4, 215 - 164: 0xA1C1, 224 - 164: 0xA8A4, 225 - 164: 0xA8A2, 232 - 164: 0xA8A8, 233 - 164: 0xA8A6, 234 - 164: 0xA8BA, 236 - 164: 0xA8AC, 237 - 164: 0xA8AA, 242 - 164: 0xA8B0, 243 - 164: 0xA8AE, 247 - 164: 0xA1C2, 249 - 164: 0xA8B4, 250 - 164: 0xA8B2, 252 - 164: 0xA8B9, 257 - 164: 0xA8A1, 275 - 164: 0xA8A5, 283 - 164: 0xA8A7, 299 - 164: 0xA8A9, 324 - 164: 0xA8BD, 328 - 164: 0xA8BE, 333 - 164: 0xA8AD, 363 - 164: 0xA8B1, 462 - 164: 0xA8A3, 464 - 164: 0xA8AB, 466 - 164: 0xA8AF, 468 - 164: 0xA8B3, 470 - 164: 0xA8B5, 472 - 164: 0xA8B6, 474 - 164: 0xA8B7, 476 - 164: 0xA8B8, 505 - 164: 0xA8BF, 593 - 164: 0xA8BB, 609 - 164: 0xA8C0, 711 - 164: 0xA1A6, 713 - 164: 0xA1A5, 714 - 164: 0xA840, 715 - 164: 0xA841, 729 - 164: 0xA842, 913 - 164: 0xA6A1, 914 - 164: 0xA6A2, 915 - 164: 0xA6A3, 916 - 164: 0xA6A4, 917 - 164: 0xA6A5, 918 - 164: 0xA6A6, 919 - 164: 0xA6A7, 920 - 164: 0xA6A8, 921 - 164: 0xA6A9, 922 - 164: 0xA6AA, 923 - 164: 0xA6AB, 924 - 164: 0xA6AC, 925 - 164: 0xA6AD, 926 - 164: 0xA6AE, 927 - 164: 0xA6AF, 928 - 164: 0xA6B0, 929 - 164: 0xA6B1, 931 - 164: 0xA6B2, 932 - 164: 0xA6B3, 933 - 164: 0xA6B4, 934 - 164: 0xA6B5, 935 - 164: 0xA6B6, 936 - 164: 0xA6B7, 937 - 164: 0xA6B8, 945 - 164: 0xA6C1, 946 - 164: 0xA6C2, 947 - 164: 0xA6C3, 948 - 164: 0xA6C4, 949 - 164: 0xA6C5, 950 - 164: 0xA6C6, 951 - 164: 0xA6C7, 952 - 164: 0xA6C8, 953 - 164: 0xA6C9, 954 - 164: 0xA6CA, 955 - 164: 0xA6CB, 956 - 164: 0xA6CC, 957 - 164: 0xA6CD, 958 - 164: 0xA6CE, 959 - 164: 0xA6CF, 960 - 164: 0xA6D0, 961 - 164: 0xA6D1, 963 - 164: 0xA6D2, 964 - 164: 0xA6D3, 965 - 164: 0xA6D4, 966 - 164: 0xA6D5, 967 - 164: 0xA6D6, 968 - 164: 0xA6D7, 969 - 164: 0xA6D8, 1025 - 164: 0xA7A7, 1040 - 164: 0xA7A1, 1041 - 164: 0xA7A2, 1042 - 164: 0xA7A3, 1043 - 164: 0xA7A4, 1044 - 164: 0xA7A5, 1045 - 164: 0xA7A6, 1046 - 164: 0xA7A8, 1047 - 164: 0xA7A9, 1048 - 164: 0xA7AA, 1049 - 164: 0xA7AB, 1050 - 164: 0xA7AC, 1051 - 164: 0xA7AD, 1052 - 164: 0xA7AE, 1053 - 164: 0xA7AF, 1054 - 164: 0xA7B0, 1055 - 164: 0xA7B1, 1056 - 164: 0xA7B2, 1057 - 164: 0xA7B3, 1058 - 164: 0xA7B4, 1059 - 164: 0xA7B5, 1060 - 164: 0xA7B6, 1061 - 164: 0xA7B7, 1062 - 164: 0xA7B8, 1063 - 164: 0xA7B9, 1064 - 164: 0xA7BA, 1065 - 164: 0xA7BB, 1066 - 164: 0xA7BC, 1067 - 164: 0xA7BD, 1068 - 164: 0xA7BE, 1069 - 164: 0xA7BF, 1070 - 164: 0xA7C0, 1071 - 164: 0xA7C1, 1072 - 164: 0xA7D1, 1073 - 164: 0xA7D2, 1074 - 164: 0xA7D3, 1075 - 164: 0xA7D4, 1076 - 164: 0xA7D5, 1077 - 164: 0xA7D6, 1078 - 164: 0xA7D8, 1079 - 164: 0xA7D9, 1080 - 164: 0xA7DA, 1081 - 164: 0xA7DB, 1082 - 164: 0xA7DC, 1083 - 164: 0xA7DD, 1084 - 164: 0xA7DE, 1085 - 164: 0xA7DF, 1086 - 164: 0xA7E0, 1087 - 164: 0xA7E1, 1088 - 164: 0xA7E2, 1089 - 164: 0xA7E3, 1090 - 164: 0xA7E4, 1091 - 164: 0xA7E5, 1092 - 164: 0xA7E6, 1093 - 164: 0xA7E7, 1094 - 164: 0xA7E8, 1095 - 164: 0xA7E9, 1096 - 164: 0xA7EA, 1097 - 164: 0xA7EB, 1098 - 164: 0xA7EC, 1099 - 164: 0xA7ED, 1100 - 164: 0xA7EE, 1101 - 164: 0xA7EF, 1102 - 164: 0xA7F0, 1103 - 164: 0xA7F1, 1105 - 164: 0xA7D7, } const encode3Low, encode3High = 65072, 65510 var encode3 = [...]uint16{ 65072 - 65072: 0xA955, 65073 - 65072: 0xA6F2, 65075 - 65072: 0xA6F4, 65076 - 65072: 0xA6F5, 65077 - 65072: 0xA6E0, 65078 - 65072: 0xA6E1, 65079 - 65072: 0xA6F0, 65080 - 65072: 0xA6F1, 65081 - 65072: 0xA6E2, 65082 - 65072: 0xA6E3, 65083 - 65072: 0xA6EE, 65084 - 65072: 0xA6EF, 65085 - 65072: 0xA6E6, 65086 - 65072: 0xA6E7, 65087 - 65072: 0xA6E4, 65088 - 65072: 0xA6E5, 65089 - 65072: 0xA6E8, 65090 - 65072: 0xA6E9, 65091 - 65072: 0xA6EA, 65092 - 65072: 0xA6EB, 65097 - 65072: 0xA968, 65098 - 65072: 0xA969, 65099 - 65072: 0xA96A, 65100 - 65072: 0xA96B, 65101 - 65072: 0xA96C, 65102 - 65072: 0xA96D, 65103 - 65072: 0xA96E, 65104 - 65072: 0xA96F, 65105 - 65072: 0xA970, 65106 - 65072: 0xA971, 65108 - 65072: 0xA972, 65109 - 65072: 0xA973, 65110 - 65072: 0xA974, 65111 - 65072: 0xA975, 65113 - 65072: 0xA976, 65114 - 65072: 0xA977, 65115 - 65072: 0xA978, 65116 - 65072: 0xA979, 65117 - 65072: 0xA97A, 65118 - 65072: 0xA97B, 65119 - 65072: 0xA97C, 65120 - 65072: 0xA97D, 65121 - 65072: 0xA97E, 65122 - 65072: 0xA980, 65123 - 65072: 0xA981, 65124 - 65072: 0xA982, 65125 - 65072: 0xA983, 65126 - 65072: 0xA984, 65128 - 65072: 0xA985, 65129 - 65072: 0xA986, 65130 - 65072: 0xA987, 65131 - 65072: 0xA988, 65281 - 65072: 0xA3A1, 65282 - 65072: 0xA3A2, 65283 - 65072: 0xA3A3, 65284 - 65072: 0xA1E7, 65285 - 65072: 0xA3A5, 65286 - 65072: 0xA3A6, 65287 - 65072: 0xA3A7, 65288 - 65072: 0xA3A8, 65289 - 65072: 0xA3A9, 65290 - 65072: 0xA3AA, 65291 - 65072: 0xA3AB, 65292 - 65072: 0xA3AC, 65293 - 65072: 0xA3AD, 65294 - 65072: 0xA3AE, 65295 - 65072: 0xA3AF, 65296 - 65072: 0xA3B0, 65297 - 65072: 0xA3B1, 65298 - 65072: 0xA3B2, 65299 - 65072: 0xA3B3, 65300 - 65072: 0xA3B4, 65301 - 65072: 0xA3B5, 65302 - 65072: 0xA3B6, 65303 - 65072: 0xA3B7, 65304 - 65072: 0xA3B8, 65305 - 65072: 0xA3B9, 65306 - 65072: 0xA3BA, 65307 - 65072: 0xA3BB, 65308 - 65072: 0xA3BC, 65309 - 65072: 0xA3BD, 65310 - 65072: 0xA3BE, 65311 - 65072: 0xA3BF, 65312 - 65072: 0xA3C0, 65313 - 65072: 0xA3C1, 65314 - 65072: 0xA3C2, 65315 - 65072: 0xA3C3, 65316 - 65072: 0xA3C4, 65317 - 65072: 0xA3C5, 65318 - 65072: 0xA3C6, 65319 - 65072: 0xA3C7, 65320 - 65072: 0xA3C8, 65321 - 65072: 0xA3C9, 65322 - 65072: 0xA3CA, 65323 - 65072: 0xA3CB, 65324 - 65072: 0xA3CC, 65325 - 65072: 0xA3CD, 65326 - 65072: 0xA3CE, 65327 - 65072: 0xA3CF, 65328 - 65072: 0xA3D0, 65329 - 65072: 0xA3D1, 65330 - 65072: 0xA3D2, 65331 - 65072: 0xA3D3, 65332 - 65072: 0xA3D4, 65333 - 65072: 0xA3D5, 65334 - 65072: 0xA3D6, 65335 - 65072: 0xA3D7, 65336 - 65072: 0xA3D8, 65337 - 65072: 0xA3D9, 65338 - 65072: 0xA3DA, 65339 - 65072: 0xA3DB, 65340 - 65072: 0xA3DC, 65341 - 65072: 0xA3DD, 65342 - 65072: 0xA3DE, 65343 - 65072: 0xA3DF, 65344 - 65072: 0xA3E0, 65345 - 65072: 0xA3E1, 65346 - 65072: 0xA3E2, 65347 - 65072: 0xA3E3, 65348 - 65072: 0xA3E4, 65349 - 65072: 0xA3E5, 65350 - 65072: 0xA3E6, 65351 - 65072: 0xA3E7, 65352 - 65072: 0xA3E8, 65353 - 65072: 0xA3E9, 65354 - 65072: 0xA3EA, 65355 - 65072: 0xA3EB, 65356 - 65072: 0xA3EC, 65357 - 65072: 0xA3ED, 65358 - 65072: 0xA3EE, 65359 - 65072: 0xA3EF, 65360 - 65072: 0xA3F0, 65361 - 65072: 0xA3F1, 65362 - 65072: 0xA3F2, 65363 - 65072: 0xA3F3, 65364 - 65072: 0xA3F4, 65365 - 65072: 0xA3F5, 65366 - 65072: 0xA3F6, 65367 - 65072: 0xA3F7, 65368 - 65072: 0xA3F8, 65369 - 65072: 0xA3F9, 65370 - 65072: 0xA3FA, 65371 - 65072: 0xA3FB, 65372 - 65072: 0xA3FC, 65373 - 65072: 0xA3FD, 65374 - 65072: 0xA1AB, 65504 - 65072: 0xA1E9, 65505 - 65072: 0xA1EA, 65506 - 65072: 0xA956, 65507 - 65072: 0xA3FE, 65508 - 65072: 0xA957, 65509 - 65072: 0xA3A4, } const encode4Low, encode4High = 63788, 64042 var encode4 = [...]uint16{ 63788 - 63788: 0xFD9C, 63865 - 63788: 0xFD9D, 63893 - 63788: 0xFD9E, 63975 - 63788: 0xFD9F, 63985 - 63788: 0xFDA0, 64012 - 63788: 0xFE40, 64013 - 63788: 0xFE41, 64014 - 63788: 0xFE42, 64015 - 63788: 0xFE43, 64017 - 63788: 0xFE44, 64019 - 63788: 0xFE45, 64020 - 63788: 0xFE46, 64024 - 63788: 0xFE47, 64031 - 63788: 0xFE48, 64032 - 63788: 0xFE49, 64033 - 63788: 0xFE4A, 64035 - 63788: 0xFE4B, 64036 - 63788: 0xFE4C, 64039 - 63788: 0xFE4D, 64040 - 63788: 0xFE4E, 64041 - 63788: 0xFE4F, } ================================================ FILE: vendor/golang.org/x/text/encoding/traditionalchinese/big5.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package traditionalchinese import ( "errors" "unicode/utf8" "golang.org/x/text/encoding" "golang.org/x/text/encoding/internal" "golang.org/x/text/encoding/internal/identifier" "golang.org/x/text/transform" ) // All is a list of all defined encodings in this package. var All = []encoding.Encoding{Big5} // Big5 is the Big5 encoding, also known as Code Page 950. var Big5 encoding.Encoding = &big5 var big5 = internal.Encoding{ &internal.SimpleEncoding{big5Decoder{}, big5Encoder{}}, "Big5", identifier.Big5, } var errInvalidBig5 = errors.New("traditionalchinese: invalid Big5 encoding") type big5Decoder struct{ transform.NopResetter } func (big5Decoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { r, size, s := rune(0), 0, "" loop: for ; nSrc < len(src); nSrc += size { switch c0 := src[nSrc]; { case c0 < utf8.RuneSelf: r, size = rune(c0), 1 case 0x81 <= c0 && c0 < 0xff: if nSrc+1 >= len(src) { err = transform.ErrShortSrc break loop } c1 := src[nSrc+1] switch { case 0x40 <= c1 && c1 < 0x7f: c1 -= 0x40 case 0xa1 <= c1 && c1 < 0xff: c1 -= 0x62 default: err = errInvalidBig5 break loop } r, size = '\ufffd', 2 if i := int(c0-0x81)*157 + int(c1); i < len(decode) { if 1133 <= i && i < 1167 { // The two-rune special cases for LATIN CAPITAL / SMALL E WITH CIRCUMFLEX // AND MACRON / CARON are from http://encoding.spec.whatwg.org/#big5 switch i { case 1133: s = "\u00CA\u0304" goto writeStr case 1135: s = "\u00CA\u030C" goto writeStr case 1164: s = "\u00EA\u0304" goto writeStr case 1166: s = "\u00EA\u030C" goto writeStr } } r = rune(decode[i]) if r == 0 { r = '\ufffd' } } default: err = errInvalidBig5 break loop } if nDst+utf8.RuneLen(r) > len(dst) { err = transform.ErrShortDst break loop } nDst += utf8.EncodeRune(dst[nDst:], r) continue loop writeStr: if nDst+len(s) > len(dst) { err = transform.ErrShortDst break loop } nDst += copy(dst[nDst:], s) continue loop } if atEOF && err == transform.ErrShortSrc { err = errInvalidBig5 } return nDst, nSrc, err } type big5Encoder struct{ transform.NopResetter } func (big5Encoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { r, size := rune(0), 0 for ; nSrc < len(src); nSrc += size { r = rune(src[nSrc]) // Decode a 1-byte rune. if r < utf8.RuneSelf { size = 1 if nDst >= len(dst) { err = transform.ErrShortDst break } dst[nDst] = uint8(r) nDst++ continue } else { // Decode a multi-byte rune. r, size = utf8.DecodeRune(src[nSrc:]) if size == 1 { // All valid runes of size 1 (those below utf8.RuneSelf) were // handled above. We have invalid UTF-8 or we haven't seen the // full character yet. if !atEOF && !utf8.FullRune(src[nSrc:]) { err = transform.ErrShortSrc break } } } if r >= utf8.RuneSelf { // func init checks that the switch covers all tables. switch { case encode0Low <= r && r < encode0High: if r = rune(encode0[r-encode0Low]); r != 0 { goto write2 } case encode1Low <= r && r < encode1High: if r = rune(encode1[r-encode1Low]); r != 0 { goto write2 } case encode2Low <= r && r < encode2High: if r = rune(encode2[r-encode2Low]); r != 0 { goto write2 } case encode3Low <= r && r < encode3High: if r = rune(encode3[r-encode3Low]); r != 0 { goto write2 } case encode4Low <= r && r < encode4High: if r = rune(encode4[r-encode4Low]); r != 0 { goto write2 } case encode5Low <= r && r < encode5High: if r = rune(encode5[r-encode5Low]); r != 0 { goto write2 } case encode6Low <= r && r < encode6High: if r = rune(encode6[r-encode6Low]); r != 0 { goto write2 } case encode7Low <= r && r < encode7High: if r = rune(encode7[r-encode7Low]); r != 0 { goto write2 } } err = internal.ErrASCIIReplacement break } write2: if nDst+2 > len(dst) { err = transform.ErrShortDst break } dst[nDst+0] = uint8(r >> 8) dst[nDst+1] = uint8(r) nDst += 2 continue } return nDst, nSrc, err } func init() { // Check that the hard-coded encode switch covers all tables. if numEncodeTables != 8 { panic("bad numEncodeTables") } } ================================================ FILE: vendor/golang.org/x/text/encoding/traditionalchinese/maketables.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build ignore package main // This program generates tables.go: // go run maketables.go | gofmt > tables.go import ( "bufio" "fmt" "log" "net/http" "sort" "strings" ) func main() { fmt.Printf("// generated by go run maketables.go; DO NOT EDIT\n\n") fmt.Printf("// Package traditionalchinese provides Traditional Chinese encodings such as Big5.\n") fmt.Printf(`package traditionalchinese // import "golang.org/x/text/encoding/traditionalchinese"` + "\n\n") res, err := http.Get("http://encoding.spec.whatwg.org/index-big5.txt") if err != nil { log.Fatalf("Get: %v", err) } defer res.Body.Close() mapping := [65536]uint32{} reverse := [65536 * 4]uint16{} scanner := bufio.NewScanner(res.Body) for scanner.Scan() { s := strings.TrimSpace(scanner.Text()) if s == "" || s[0] == '#' { continue } x, y := uint16(0), uint32(0) if _, err := fmt.Sscanf(s, "%d 0x%x", &x, &y); err != nil { log.Fatalf("could not parse %q", s) } if x < 0 || 126*157 <= x { log.Fatalf("Big5 code %d is out of range", x) } mapping[x] = y // The WHATWG spec http://encoding.spec.whatwg.org/#indexes says that // "The index pointer for code point in index is the first pointer // corresponding to code point in index", which would normally mean // that the code below should be guarded by "if reverse[y] == 0", but // last instead of first seems to match the behavior of // "iconv -f UTF-8 -t BIG5". For example, U+8005 者 occurs twice in // http://encoding.spec.whatwg.org/index-big5.txt, as index 2148 // (encoded as "\x8e\xcd") and index 6543 (encoded as "\xaa\xcc") // and "echo 者 | iconv -f UTF-8 -t BIG5 | xxd" gives "\xaa\xcc". c0, c1 := x/157, x%157 if c1 < 0x3f { c1 += 0x40 } else { c1 += 0x62 } reverse[y] = (0x81+c0)<<8 | c1 } if err := scanner.Err(); err != nil { log.Fatalf("scanner error: %v", err) } fmt.Printf("// decode is the decoding table from Big5 code to Unicode.\n") fmt.Printf("// It is defined at http://encoding.spec.whatwg.org/index-big5.txt\n") fmt.Printf("var decode = [...]uint32{\n") for i, v := range mapping { if v != 0 { fmt.Printf("\t%d: 0x%08X,\n", i, v) } } fmt.Printf("}\n\n") // Any run of at least separation continuous zero entries in the reverse map will // be a separate encode table. const separation = 1024 intervals := []interval(nil) low, high := -1, -1 for i, v := range reverse { if v == 0 { continue } if low < 0 { low = i } else if i-high >= separation { if high >= 0 { intervals = append(intervals, interval{low, high}) } low = i } high = i + 1 } if high >= 0 { intervals = append(intervals, interval{low, high}) } sort.Sort(byDecreasingLength(intervals)) fmt.Printf("const numEncodeTables = %d\n\n", len(intervals)) fmt.Printf("// encodeX are the encoding tables from Unicode to Big5 code,\n") fmt.Printf("// sorted by decreasing length.\n") for i, v := range intervals { fmt.Printf("// encode%d: %5d entries for runes in [%6d, %6d).\n", i, v.len(), v.low, v.high) } fmt.Printf("\n") for i, v := range intervals { fmt.Printf("const encode%dLow, encode%dHigh = %d, %d\n\n", i, i, v.low, v.high) fmt.Printf("var encode%d = [...]uint16{\n", i) for j := v.low; j < v.high; j++ { x := reverse[j] if x == 0 { continue } fmt.Printf("\t%d-%d: 0x%04X,\n", j, v.low, x) } fmt.Printf("}\n\n") } } // interval is a half-open interval [low, high). type interval struct { low, high int } func (i interval) len() int { return i.high - i.low } // byDecreasingLength sorts intervals by decreasing length. type byDecreasingLength []interval func (b byDecreasingLength) Len() int { return len(b) } func (b byDecreasingLength) Less(i, j int) bool { return b[i].len() > b[j].len() } func (b byDecreasingLength) Swap(i, j int) { b[i], b[j] = b[j], b[i] } ================================================ FILE: vendor/golang.org/x/text/encoding/traditionalchinese/tables.go ================================================ // generated by go run maketables.go; DO NOT EDIT // Package traditionalchinese provides Traditional Chinese encodings such as Big5. package traditionalchinese // import "golang.org/x/text/encoding/traditionalchinese" // decode is the decoding table from Big5 code to Unicode. // It is defined at http://encoding.spec.whatwg.org/index-big5.txt var decode = [...]uint32{ 942: 0x000043F0, 943: 0x00004C32, 944: 0x00004603, 945: 0x000045A6, 946: 0x00004578, 947: 0x00027267, 948: 0x00004D77, 949: 0x000045B3, 950: 0x00027CB1, 951: 0x00004CE2, 952: 0x00027CC5, 953: 0x00003B95, 954: 0x00004736, 955: 0x00004744, 956: 0x00004C47, 957: 0x00004C40, 958: 0x000242BF, 959: 0x00023617, 960: 0x00027352, 961: 0x00026E8B, 962: 0x000270D2, 963: 0x00004C57, 964: 0x0002A351, 965: 0x0000474F, 966: 0x000045DA, 967: 0x00004C85, 968: 0x00027C6C, 969: 0x00004D07, 970: 0x00004AA4, 971: 0x000046A1, 972: 0x00026B23, 973: 0x00007225, 974: 0x00025A54, 975: 0x00021A63, 976: 0x00023E06, 977: 0x00023F61, 978: 0x0000664D, 979: 0x000056FB, 981: 0x00007D95, 982: 0x0000591D, 983: 0x00028BB9, 984: 0x00003DF4, 985: 0x00009734, 986: 0x00027BEF, 987: 0x00005BDB, 988: 0x00021D5E, 989: 0x00005AA4, 990: 0x00003625, 991: 0x00029EB0, 992: 0x00005AD1, 993: 0x00005BB7, 994: 0x00005CFC, 995: 0x0000676E, 996: 0x00008593, 997: 0x00029945, 998: 0x00007461, 999: 0x0000749D, 1000: 0x00003875, 1001: 0x00021D53, 1002: 0x0002369E, 1003: 0x00026021, 1004: 0x00003EEC, 1005: 0x000258DE, 1006: 0x00003AF5, 1007: 0x00007AFC, 1008: 0x00009F97, 1009: 0x00024161, 1010: 0x0002890D, 1011: 0x000231EA, 1012: 0x00020A8A, 1013: 0x0002325E, 1014: 0x0000430A, 1015: 0x00008484, 1016: 0x00009F96, 1017: 0x0000942F, 1018: 0x00004930, 1019: 0x00008613, 1020: 0x00005896, 1021: 0x0000974A, 1022: 0x00009218, 1023: 0x000079D0, 1024: 0x00007A32, 1025: 0x00006660, 1026: 0x00006A29, 1027: 0x0000889D, 1028: 0x0000744C, 1029: 0x00007BC5, 1030: 0x00006782, 1031: 0x00007A2C, 1032: 0x0000524F, 1033: 0x00009046, 1034: 0x000034E6, 1035: 0x000073C4, 1036: 0x00025DB9, 1037: 0x000074C6, 1038: 0x00009FC7, 1039: 0x000057B3, 1040: 0x0000492F, 1041: 0x0000544C, 1042: 0x00004131, 1043: 0x0002368E, 1044: 0x00005818, 1045: 0x00007A72, 1046: 0x00027B65, 1047: 0x00008B8F, 1048: 0x000046AE, 1049: 0x00026E88, 1050: 0x00004181, 1051: 0x00025D99, 1052: 0x00007BAE, 1053: 0x000224BC, 1054: 0x00009FC8, 1055: 0x000224C1, 1056: 0x000224C9, 1057: 0x000224CC, 1058: 0x00009FC9, 1059: 0x00008504, 1060: 0x000235BB, 1061: 0x000040B4, 1062: 0x00009FCA, 1063: 0x000044E1, 1064: 0x0002ADFF, 1065: 0x000062C1, 1066: 0x0000706E, 1067: 0x00009FCB, 1099: 0x000031C0, 1100: 0x000031C1, 1101: 0x000031C2, 1102: 0x000031C3, 1103: 0x000031C4, 1104: 0x0002010C, 1105: 0x000031C5, 1106: 0x000200D1, 1107: 0x000200CD, 1108: 0x000031C6, 1109: 0x000031C7, 1110: 0x000200CB, 1111: 0x00021FE8, 1112: 0x000031C8, 1113: 0x000200CA, 1114: 0x000031C9, 1115: 0x000031CA, 1116: 0x000031CB, 1117: 0x000031CC, 1118: 0x0002010E, 1119: 0x000031CD, 1120: 0x000031CE, 1121: 0x00000100, 1122: 0x000000C1, 1123: 0x000001CD, 1124: 0x000000C0, 1125: 0x00000112, 1126: 0x000000C9, 1127: 0x0000011A, 1128: 0x000000C8, 1129: 0x0000014C, 1130: 0x000000D3, 1131: 0x000001D1, 1132: 0x000000D2, 1134: 0x00001EBE, 1136: 0x00001EC0, 1137: 0x000000CA, 1138: 0x00000101, 1139: 0x000000E1, 1140: 0x000001CE, 1141: 0x000000E0, 1142: 0x00000251, 1143: 0x00000113, 1144: 0x000000E9, 1145: 0x0000011B, 1146: 0x000000E8, 1147: 0x0000012B, 1148: 0x000000ED, 1149: 0x000001D0, 1150: 0x000000EC, 1151: 0x0000014D, 1152: 0x000000F3, 1153: 0x000001D2, 1154: 0x000000F2, 1155: 0x0000016B, 1156: 0x000000FA, 1157: 0x000001D4, 1158: 0x000000F9, 1159: 0x000001D6, 1160: 0x000001D8, 1161: 0x000001DA, 1162: 0x000001DC, 1163: 0x000000FC, 1165: 0x00001EBF, 1167: 0x00001EC1, 1168: 0x000000EA, 1169: 0x00000261, 1170: 0x000023DA, 1171: 0x000023DB, 1256: 0x0002A3A9, 1257: 0x00021145, 1259: 0x0000650A, 1262: 0x00004E3D, 1263: 0x00006EDD, 1264: 0x00009D4E, 1265: 0x000091DF, 1268: 0x00027735, 1269: 0x00006491, 1270: 0x00004F1A, 1271: 0x00004F28, 1272: 0x00004FA8, 1273: 0x00005156, 1274: 0x00005174, 1275: 0x0000519C, 1276: 0x000051E4, 1277: 0x000052A1, 1278: 0x000052A8, 1279: 0x0000533B, 1280: 0x0000534E, 1281: 0x000053D1, 1282: 0x000053D8, 1283: 0x000056E2, 1284: 0x000058F0, 1285: 0x00005904, 1286: 0x00005907, 1287: 0x00005932, 1288: 0x00005934, 1289: 0x00005B66, 1290: 0x00005B9E, 1291: 0x00005B9F, 1292: 0x00005C9A, 1293: 0x00005E86, 1294: 0x0000603B, 1295: 0x00006589, 1296: 0x000067FE, 1297: 0x00006804, 1298: 0x00006865, 1299: 0x00006D4E, 1300: 0x000070BC, 1301: 0x00007535, 1302: 0x00007EA4, 1303: 0x00007EAC, 1304: 0x00007EBA, 1305: 0x00007EC7, 1306: 0x00007ECF, 1307: 0x00007EDF, 1308: 0x00007F06, 1309: 0x00007F37, 1310: 0x0000827A, 1311: 0x000082CF, 1312: 0x0000836F, 1313: 0x000089C6, 1314: 0x00008BBE, 1315: 0x00008BE2, 1316: 0x00008F66, 1317: 0x00008F67, 1318: 0x00008F6E, 1319: 0x00007411, 1320: 0x00007CFC, 1321: 0x00007DCD, 1322: 0x00006946, 1323: 0x00007AC9, 1324: 0x00005227, 1329: 0x0000918C, 1330: 0x000078B8, 1331: 0x0000915E, 1332: 0x000080BC, 1334: 0x00008D0B, 1335: 0x000080F6, 1336: 0x000209E7, 1339: 0x0000809F, 1340: 0x00009EC7, 1341: 0x00004CCD, 1342: 0x00009DC9, 1343: 0x00009E0C, 1344: 0x00004C3E, 1345: 0x00029DF6, 1346: 0x0002700E, 1347: 0x00009E0A, 1348: 0x0002A133, 1349: 0x000035C1, 1351: 0x00006E9A, 1352: 0x0000823E, 1353: 0x00007519, 1355: 0x00004911, 1356: 0x00009A6C, 1357: 0x00009A8F, 1358: 0x00009F99, 1359: 0x00007987, 1360: 0x0002846C, 1361: 0x00021DCA, 1362: 0x000205D0, 1363: 0x00022AE6, 1364: 0x00004E24, 1365: 0x00004E81, 1366: 0x00004E80, 1367: 0x00004E87, 1368: 0x00004EBF, 1369: 0x00004EEB, 1370: 0x00004F37, 1371: 0x0000344C, 1372: 0x00004FBD, 1373: 0x00003E48, 1374: 0x00005003, 1375: 0x00005088, 1376: 0x0000347D, 1377: 0x00003493, 1378: 0x000034A5, 1379: 0x00005186, 1380: 0x00005905, 1381: 0x000051DB, 1382: 0x000051FC, 1383: 0x00005205, 1384: 0x00004E89, 1385: 0x00005279, 1386: 0x00005290, 1387: 0x00005327, 1388: 0x000035C7, 1389: 0x000053A9, 1390: 0x00003551, 1391: 0x000053B0, 1392: 0x00003553, 1393: 0x000053C2, 1394: 0x00005423, 1395: 0x0000356D, 1396: 0x00003572, 1397: 0x00003681, 1398: 0x00005493, 1399: 0x000054A3, 1400: 0x000054B4, 1401: 0x000054B9, 1402: 0x000054D0, 1403: 0x000054EF, 1404: 0x00005518, 1405: 0x00005523, 1406: 0x00005528, 1407: 0x00003598, 1408: 0x0000553F, 1409: 0x000035A5, 1410: 0x000035BF, 1411: 0x000055D7, 1412: 0x000035C5, 1413: 0x00027D84, 1414: 0x00005525, 1416: 0x00020C42, 1417: 0x00020D15, 1418: 0x0002512B, 1419: 0x00005590, 1420: 0x00022CC6, 1421: 0x000039EC, 1422: 0x00020341, 1423: 0x00008E46, 1424: 0x00024DB8, 1425: 0x000294E5, 1426: 0x00004053, 1427: 0x000280BE, 1428: 0x0000777A, 1429: 0x00022C38, 1430: 0x00003A34, 1431: 0x000047D5, 1432: 0x0002815D, 1433: 0x000269F2, 1434: 0x00024DEA, 1435: 0x000064DD, 1436: 0x00020D7C, 1437: 0x00020FB4, 1438: 0x00020CD5, 1439: 0x000210F4, 1440: 0x0000648D, 1441: 0x00008E7E, 1442: 0x00020E96, 1443: 0x00020C0B, 1444: 0x00020F64, 1445: 0x00022CA9, 1446: 0x00028256, 1447: 0x000244D3, 1449: 0x00020D46, 1450: 0x00029A4D, 1451: 0x000280E9, 1452: 0x000047F4, 1453: 0x00024EA7, 1454: 0x00022CC2, 1455: 0x00009AB2, 1456: 0x00003A67, 1457: 0x000295F4, 1458: 0x00003FED, 1459: 0x00003506, 1460: 0x000252C7, 1461: 0x000297D4, 1462: 0x000278C8, 1463: 0x00022D44, 1464: 0x00009D6E, 1465: 0x00009815, 1467: 0x000043D9, 1468: 0x000260A5, 1469: 0x000064B4, 1470: 0x000054E3, 1471: 0x00022D4C, 1472: 0x00022BCA, 1473: 0x00021077, 1474: 0x000039FB, 1475: 0x0002106F, 1476: 0x000266DA, 1477: 0x00026716, 1478: 0x000279A0, 1479: 0x000064EA, 1480: 0x00025052, 1481: 0x00020C43, 1482: 0x00008E68, 1483: 0x000221A1, 1484: 0x00028B4C, 1485: 0x00020731, 1487: 0x0000480B, 1488: 0x000201A9, 1489: 0x00003FFA, 1490: 0x00005873, 1491: 0x00022D8D, 1493: 0x000245C8, 1494: 0x000204FC, 1495: 0x00026097, 1496: 0x00020F4C, 1497: 0x00020D96, 1498: 0x00005579, 1499: 0x000040BB, 1500: 0x000043BA, 1502: 0x00004AB4, 1503: 0x00022A66, 1504: 0x0002109D, 1505: 0x000081AA, 1506: 0x000098F5, 1507: 0x00020D9C, 1508: 0x00006379, 1509: 0x000039FE, 1510: 0x00022775, 1511: 0x00008DC0, 1512: 0x000056A1, 1513: 0x0000647C, 1514: 0x00003E43, 1516: 0x0002A601, 1517: 0x00020E09, 1518: 0x00022ACF, 1519: 0x00022CC9, 1521: 0x000210C8, 1522: 0x000239C2, 1523: 0x00003992, 1524: 0x00003A06, 1525: 0x0002829B, 1526: 0x00003578, 1527: 0x00025E49, 1528: 0x000220C7, 1529: 0x00005652, 1530: 0x00020F31, 1531: 0x00022CB2, 1532: 0x00029720, 1533: 0x000034BC, 1534: 0x00006C3D, 1535: 0x00024E3B, 1538: 0x00027574, 1539: 0x00022E8B, 1540: 0x00022208, 1541: 0x0002A65B, 1542: 0x00028CCD, 1543: 0x00020E7A, 1544: 0x00020C34, 1545: 0x0002681C, 1546: 0x00007F93, 1547: 0x000210CF, 1548: 0x00022803, 1549: 0x00022939, 1550: 0x000035FB, 1551: 0x000251E3, 1552: 0x00020E8C, 1553: 0x00020F8D, 1554: 0x00020EAA, 1555: 0x00003F93, 1556: 0x00020F30, 1557: 0x00020D47, 1558: 0x0002114F, 1559: 0x00020E4C, 1561: 0x00020EAB, 1562: 0x00020BA9, 1563: 0x00020D48, 1564: 0x000210C0, 1565: 0x0002113D, 1566: 0x00003FF9, 1567: 0x00022696, 1568: 0x00006432, 1569: 0x00020FAD, 1570: 0x000233F4, 1571: 0x00027639, 1572: 0x00022BCE, 1573: 0x00020D7E, 1574: 0x00020D7F, 1575: 0x00022C51, 1576: 0x00022C55, 1577: 0x00003A18, 1578: 0x00020E98, 1579: 0x000210C7, 1580: 0x00020F2E, 1581: 0x0002A632, 1582: 0x00026B50, 1583: 0x00028CD2, 1584: 0x00028D99, 1585: 0x00028CCA, 1586: 0x000095AA, 1587: 0x000054CC, 1588: 0x000082C4, 1589: 0x000055B9, 1591: 0x00029EC3, 1592: 0x00009C26, 1593: 0x00009AB6, 1594: 0x0002775E, 1595: 0x00022DEE, 1596: 0x00007140, 1597: 0x0000816D, 1598: 0x000080EC, 1599: 0x00005C1C, 1600: 0x00026572, 1601: 0x00008134, 1602: 0x00003797, 1603: 0x0000535F, 1604: 0x000280BD, 1605: 0x000091B6, 1606: 0x00020EFA, 1607: 0x00020E0F, 1608: 0x00020E77, 1609: 0x00020EFB, 1610: 0x000035DD, 1611: 0x00024DEB, 1612: 0x00003609, 1613: 0x00020CD6, 1614: 0x000056AF, 1615: 0x000227B5, 1616: 0x000210C9, 1617: 0x00020E10, 1618: 0x00020E78, 1619: 0x00021078, 1620: 0x00021148, 1621: 0x00028207, 1622: 0x00021455, 1623: 0x00020E79, 1624: 0x00024E50, 1625: 0x00022DA4, 1626: 0x00005A54, 1627: 0x0002101D, 1628: 0x0002101E, 1629: 0x000210F5, 1630: 0x000210F6, 1631: 0x0000579C, 1632: 0x00020E11, 1633: 0x00027694, 1634: 0x000282CD, 1635: 0x00020FB5, 1636: 0x00020E7B, 1637: 0x0002517E, 1638: 0x00003703, 1639: 0x00020FB6, 1640: 0x00021180, 1641: 0x000252D8, 1642: 0x0002A2BD, 1643: 0x000249DA, 1644: 0x0002183A, 1645: 0x00024177, 1646: 0x0002827C, 1647: 0x00005899, 1648: 0x00005268, 1649: 0x0000361A, 1650: 0x0002573D, 1651: 0x00007BB2, 1652: 0x00005B68, 1653: 0x00004800, 1654: 0x00004B2C, 1655: 0x00009F27, 1656: 0x000049E7, 1657: 0x00009C1F, 1658: 0x00009B8D, 1659: 0x00025B74, 1660: 0x0002313D, 1661: 0x000055FB, 1662: 0x000035F2, 1663: 0x00005689, 1664: 0x00004E28, 1665: 0x00005902, 1666: 0x00021BC1, 1667: 0x0002F878, 1668: 0x00009751, 1669: 0x00020086, 1670: 0x00004E5B, 1671: 0x00004EBB, 1672: 0x0000353E, 1673: 0x00005C23, 1674: 0x00005F51, 1675: 0x00005FC4, 1676: 0x000038FA, 1677: 0x0000624C, 1678: 0x00006535, 1679: 0x00006B7A, 1680: 0x00006C35, 1681: 0x00006C3A, 1682: 0x0000706C, 1683: 0x0000722B, 1684: 0x00004E2C, 1685: 0x000072AD, 1686: 0x000248E9, 1687: 0x00007F52, 1688: 0x0000793B, 1689: 0x00007CF9, 1690: 0x00007F53, 1691: 0x0002626A, 1692: 0x000034C1, 1694: 0x0002634B, 1695: 0x00008002, 1696: 0x00008080, 1697: 0x00026612, 1698: 0x00026951, 1699: 0x0000535D, 1700: 0x00008864, 1701: 0x000089C1, 1702: 0x000278B2, 1703: 0x00008BA0, 1704: 0x00008D1D, 1705: 0x00009485, 1706: 0x00009578, 1707: 0x0000957F, 1708: 0x000095E8, 1709: 0x00028E0F, 1710: 0x000097E6, 1711: 0x00009875, 1712: 0x000098CE, 1713: 0x000098DE, 1714: 0x00009963, 1715: 0x00029810, 1716: 0x00009C7C, 1717: 0x00009E1F, 1718: 0x00009EC4, 1719: 0x00006B6F, 1720: 0x0000F907, 1721: 0x00004E37, 1722: 0x00020087, 1723: 0x0000961D, 1724: 0x00006237, 1725: 0x000094A2, 1727: 0x0000503B, 1728: 0x00006DFE, 1729: 0x00029C73, 1730: 0x00009FA6, 1731: 0x00003DC9, 1732: 0x0000888F, 1733: 0x0002414E, 1734: 0x00007077, 1735: 0x00005CF5, 1736: 0x00004B20, 1737: 0x000251CD, 1738: 0x00003559, 1739: 0x00025D30, 1740: 0x00006122, 1741: 0x00028A32, 1742: 0x00008FA7, 1743: 0x000091F6, 1744: 0x00007191, 1745: 0x00006719, 1746: 0x000073BA, 1747: 0x00023281, 1748: 0x0002A107, 1749: 0x00003C8B, 1750: 0x00021980, 1751: 0x00004B10, 1752: 0x000078E4, 1753: 0x00007402, 1754: 0x000051AE, 1755: 0x0002870F, 1756: 0x00004009, 1757: 0x00006A63, 1758: 0x0002A2BA, 1759: 0x00004223, 1760: 0x0000860F, 1761: 0x00020A6F, 1762: 0x00007A2A, 1763: 0x00029947, 1764: 0x00028AEA, 1765: 0x00009755, 1766: 0x0000704D, 1767: 0x00005324, 1768: 0x0002207E, 1769: 0x000093F4, 1770: 0x000076D9, 1771: 0x000289E3, 1772: 0x00009FA7, 1773: 0x000077DD, 1774: 0x00004EA3, 1775: 0x00004FF0, 1776: 0x000050BC, 1777: 0x00004E2F, 1778: 0x00004F17, 1779: 0x00009FA8, 1780: 0x00005434, 1781: 0x00007D8B, 1782: 0x00005892, 1783: 0x000058D0, 1784: 0x00021DB6, 1785: 0x00005E92, 1786: 0x00005E99, 1787: 0x00005FC2, 1788: 0x00022712, 1789: 0x0000658B, 1790: 0x000233F9, 1791: 0x00006919, 1792: 0x00006A43, 1793: 0x00023C63, 1794: 0x00006CFF, 1796: 0x00007200, 1797: 0x00024505, 1798: 0x0000738C, 1799: 0x00003EDB, 1800: 0x00024A13, 1801: 0x00005B15, 1802: 0x000074B9, 1803: 0x00008B83, 1804: 0x00025CA4, 1805: 0x00025695, 1806: 0x00007A93, 1807: 0x00007BEC, 1808: 0x00007CC3, 1809: 0x00007E6C, 1810: 0x000082F8, 1811: 0x00008597, 1812: 0x00009FA9, 1813: 0x00008890, 1814: 0x00009FAA, 1815: 0x00008EB9, 1816: 0x00009FAB, 1817: 0x00008FCF, 1818: 0x0000855F, 1819: 0x000099E0, 1820: 0x00009221, 1821: 0x00009FAC, 1822: 0x00028DB9, 1823: 0x0002143F, 1824: 0x00004071, 1825: 0x000042A2, 1826: 0x00005A1A, 1830: 0x00009868, 1831: 0x0000676B, 1832: 0x00004276, 1833: 0x0000573D, 1835: 0x000085D6, 1836: 0x0002497B, 1837: 0x000082BF, 1838: 0x0002710D, 1839: 0x00004C81, 1840: 0x00026D74, 1841: 0x00005D7B, 1842: 0x00026B15, 1843: 0x00026FBE, 1844: 0x00009FAD, 1845: 0x00009FAE, 1846: 0x00005B96, 1847: 0x00009FAF, 1848: 0x000066E7, 1849: 0x00007E5B, 1850: 0x00006E57, 1851: 0x000079CA, 1852: 0x00003D88, 1853: 0x000044C3, 1854: 0x00023256, 1855: 0x00022796, 1856: 0x0000439A, 1857: 0x00004536, 1859: 0x00005CD5, 1860: 0x00023B1A, 1861: 0x00008AF9, 1862: 0x00005C78, 1863: 0x00003D12, 1864: 0x00023551, 1865: 0x00005D78, 1866: 0x00009FB2, 1867: 0x00007157, 1868: 0x00004558, 1869: 0x000240EC, 1870: 0x00021E23, 1871: 0x00004C77, 1872: 0x00003978, 1873: 0x0000344A, 1874: 0x000201A4, 1875: 0x00026C41, 1876: 0x00008ACC, 1877: 0x00004FB4, 1878: 0x00020239, 1879: 0x000059BF, 1880: 0x0000816C, 1881: 0x00009856, 1882: 0x000298FA, 1883: 0x00005F3B, 1884: 0x00020B9F, 1886: 0x000221C1, 1887: 0x0002896D, 1888: 0x00004102, 1889: 0x000046BB, 1890: 0x00029079, 1891: 0x00003F07, 1892: 0x00009FB3, 1893: 0x0002A1B5, 1894: 0x000040F8, 1895: 0x000037D6, 1896: 0x000046F7, 1897: 0x00026C46, 1898: 0x0000417C, 1899: 0x000286B2, 1900: 0x000273FF, 1901: 0x0000456D, 1902: 0x000038D4, 1903: 0x0002549A, 1904: 0x00004561, 1905: 0x0000451B, 1906: 0x00004D89, 1907: 0x00004C7B, 1908: 0x00004D76, 1909: 0x000045EA, 1910: 0x00003FC8, 1911: 0x00024B0F, 1912: 0x00003661, 1913: 0x000044DE, 1914: 0x000044BD, 1915: 0x000041ED, 1916: 0x00005D3E, 1917: 0x00005D48, 1918: 0x00005D56, 1919: 0x00003DFC, 1920: 0x0000380F, 1921: 0x00005DA4, 1922: 0x00005DB9, 1923: 0x00003820, 1924: 0x00003838, 1925: 0x00005E42, 1926: 0x00005EBD, 1927: 0x00005F25, 1928: 0x00005F83, 1929: 0x00003908, 1930: 0x00003914, 1931: 0x0000393F, 1932: 0x0000394D, 1933: 0x000060D7, 1934: 0x0000613D, 1935: 0x00005CE5, 1936: 0x00003989, 1937: 0x000061B7, 1938: 0x000061B9, 1939: 0x000061CF, 1940: 0x000039B8, 1941: 0x0000622C, 1942: 0x00006290, 1943: 0x000062E5, 1944: 0x00006318, 1945: 0x000039F8, 1946: 0x000056B1, 1947: 0x00003A03, 1948: 0x000063E2, 1949: 0x000063FB, 1950: 0x00006407, 1951: 0x0000645A, 1952: 0x00003A4B, 1953: 0x000064C0, 1954: 0x00005D15, 1955: 0x00005621, 1956: 0x00009F9F, 1957: 0x00003A97, 1958: 0x00006586, 1959: 0x00003ABD, 1960: 0x000065FF, 1961: 0x00006653, 1962: 0x00003AF2, 1963: 0x00006692, 1964: 0x00003B22, 1965: 0x00006716, 1966: 0x00003B42, 1967: 0x000067A4, 1968: 0x00006800, 1969: 0x00003B58, 1970: 0x0000684A, 1971: 0x00006884, 1972: 0x00003B72, 1973: 0x00003B71, 1974: 0x00003B7B, 1975: 0x00006909, 1976: 0x00006943, 1977: 0x0000725C, 1978: 0x00006964, 1979: 0x0000699F, 1980: 0x00006985, 1981: 0x00003BBC, 1982: 0x000069D6, 1983: 0x00003BDD, 1984: 0x00006A65, 1985: 0x00006A74, 1986: 0x00006A71, 1987: 0x00006A82, 1988: 0x00003BEC, 1989: 0x00006A99, 1990: 0x00003BF2, 1991: 0x00006AAB, 1992: 0x00006AB5, 1993: 0x00006AD4, 1994: 0x00006AF6, 1995: 0x00006B81, 1996: 0x00006BC1, 1997: 0x00006BEA, 1998: 0x00006C75, 1999: 0x00006CAA, 2000: 0x00003CCB, 2001: 0x00006D02, 2002: 0x00006D06, 2003: 0x00006D26, 2004: 0x00006D81, 2005: 0x00003CEF, 2006: 0x00006DA4, 2007: 0x00006DB1, 2008: 0x00006E15, 2009: 0x00006E18, 2010: 0x00006E29, 2011: 0x00006E86, 2012: 0x000289C0, 2013: 0x00006EBB, 2014: 0x00006EE2, 2015: 0x00006EDA, 2016: 0x00009F7F, 2017: 0x00006EE8, 2018: 0x00006EE9, 2019: 0x00006F24, 2020: 0x00006F34, 2021: 0x00003D46, 2022: 0x00023F41, 2023: 0x00006F81, 2024: 0x00006FBE, 2025: 0x00003D6A, 2026: 0x00003D75, 2027: 0x000071B7, 2028: 0x00005C99, 2029: 0x00003D8A, 2030: 0x0000702C, 2031: 0x00003D91, 2032: 0x00007050, 2033: 0x00007054, 2034: 0x0000706F, 2035: 0x0000707F, 2036: 0x00007089, 2037: 0x00020325, 2038: 0x000043C1, 2039: 0x000035F1, 2040: 0x00020ED8, 2041: 0x00023ED7, 2042: 0x000057BE, 2043: 0x00026ED3, 2044: 0x0000713E, 2045: 0x000257E0, 2046: 0x0000364E, 2047: 0x000069A2, 2048: 0x00028BE9, 2049: 0x00005B74, 2050: 0x00007A49, 2051: 0x000258E1, 2052: 0x000294D9, 2053: 0x00007A65, 2054: 0x00007A7D, 2055: 0x000259AC, 2056: 0x00007ABB, 2057: 0x00007AB0, 2058: 0x00007AC2, 2059: 0x00007AC3, 2060: 0x000071D1, 2061: 0x0002648D, 2062: 0x000041CA, 2063: 0x00007ADA, 2064: 0x00007ADD, 2065: 0x00007AEA, 2066: 0x000041EF, 2067: 0x000054B2, 2068: 0x00025C01, 2069: 0x00007B0B, 2070: 0x00007B55, 2071: 0x00007B29, 2072: 0x0002530E, 2073: 0x00025CFE, 2074: 0x00007BA2, 2075: 0x00007B6F, 2076: 0x0000839C, 2077: 0x00025BB4, 2078: 0x00026C7F, 2079: 0x00007BD0, 2080: 0x00008421, 2081: 0x00007B92, 2082: 0x00007BB8, 2083: 0x00025D20, 2084: 0x00003DAD, 2085: 0x00025C65, 2086: 0x00008492, 2087: 0x00007BFA, 2088: 0x00007C06, 2089: 0x00007C35, 2090: 0x00025CC1, 2091: 0x00007C44, 2092: 0x00007C83, 2093: 0x00024882, 2094: 0x00007CA6, 2095: 0x0000667D, 2096: 0x00024578, 2097: 0x00007CC9, 2098: 0x00007CC7, 2099: 0x00007CE6, 2100: 0x00007C74, 2101: 0x00007CF3, 2102: 0x00007CF5, 2103: 0x00007CCE, 2104: 0x00007E67, 2105: 0x0000451D, 2106: 0x00026E44, 2107: 0x00007D5D, 2108: 0x00026ED6, 2109: 0x0000748D, 2110: 0x00007D89, 2111: 0x00007DAB, 2112: 0x00007135, 2113: 0x00007DB3, 2114: 0x00007DD2, 2115: 0x00024057, 2116: 0x00026029, 2117: 0x00007DE4, 2118: 0x00003D13, 2119: 0x00007DF5, 2120: 0x000217F9, 2121: 0x00007DE5, 2122: 0x0002836D, 2123: 0x00007E1D, 2124: 0x00026121, 2125: 0x0002615A, 2126: 0x00007E6E, 2127: 0x00007E92, 2128: 0x0000432B, 2129: 0x0000946C, 2130: 0x00007E27, 2131: 0x00007F40, 2132: 0x00007F41, 2133: 0x00007F47, 2134: 0x00007936, 2135: 0x000262D0, 2136: 0x000099E1, 2137: 0x00007F97, 2138: 0x00026351, 2139: 0x00007FA3, 2140: 0x00021661, 2141: 0x00020068, 2142: 0x0000455C, 2143: 0x00023766, 2144: 0x00004503, 2145: 0x0002833A, 2146: 0x00007FFA, 2147: 0x00026489, 2148: 0x00008005, 2149: 0x00008008, 2150: 0x0000801D, 2151: 0x00008028, 2152: 0x0000802F, 2153: 0x0002A087, 2154: 0x00026CC3, 2155: 0x0000803B, 2156: 0x0000803C, 2157: 0x00008061, 2158: 0x00022714, 2159: 0x00004989, 2160: 0x00026626, 2161: 0x00023DE3, 2162: 0x000266E8, 2163: 0x00006725, 2164: 0x000080A7, 2165: 0x00028A48, 2166: 0x00008107, 2167: 0x0000811A, 2168: 0x000058B0, 2169: 0x000226F6, 2170: 0x00006C7F, 2171: 0x00026498, 2172: 0x00024FB8, 2173: 0x000064E7, 2174: 0x0002148A, 2175: 0x00008218, 2176: 0x0002185E, 2177: 0x00006A53, 2178: 0x00024A65, 2179: 0x00024A95, 2180: 0x0000447A, 2181: 0x00008229, 2182: 0x00020B0D, 2183: 0x00026A52, 2184: 0x00023D7E, 2185: 0x00004FF9, 2186: 0x000214FD, 2187: 0x000084E2, 2188: 0x00008362, 2189: 0x00026B0A, 2190: 0x000249A7, 2191: 0x00023530, 2192: 0x00021773, 2193: 0x00023DF8, 2194: 0x000082AA, 2195: 0x0000691B, 2196: 0x0002F994, 2197: 0x000041DB, 2198: 0x0000854B, 2199: 0x000082D0, 2200: 0x0000831A, 2201: 0x00020E16, 2202: 0x000217B4, 2203: 0x000036C1, 2204: 0x0002317D, 2205: 0x0002355A, 2206: 0x0000827B, 2207: 0x000082E2, 2208: 0x00008318, 2209: 0x00023E8B, 2210: 0x00026DA3, 2211: 0x00026B05, 2212: 0x00026B97, 2213: 0x000235CE, 2214: 0x00003DBF, 2215: 0x0000831D, 2216: 0x000055EC, 2217: 0x00008385, 2218: 0x0000450B, 2219: 0x00026DA5, 2220: 0x000083AC, 2221: 0x000083C1, 2222: 0x000083D3, 2223: 0x0000347E, 2224: 0x00026ED4, 2225: 0x00006A57, 2226: 0x0000855A, 2227: 0x00003496, 2228: 0x00026E42, 2229: 0x00022EEF, 2230: 0x00008458, 2231: 0x00025BE4, 2232: 0x00008471, 2233: 0x00003DD3, 2234: 0x000044E4, 2235: 0x00006AA7, 2236: 0x0000844A, 2237: 0x00023CB5, 2238: 0x00007958, 2239: 0x000084A8, 2240: 0x00026B96, 2241: 0x00026E77, 2242: 0x00026E43, 2243: 0x000084DE, 2244: 0x0000840F, 2245: 0x00008391, 2246: 0x000044A0, 2247: 0x00008493, 2248: 0x000084E4, 2249: 0x00025C91, 2250: 0x00004240, 2251: 0x00025CC0, 2252: 0x00004543, 2253: 0x00008534, 2254: 0x00005AF2, 2255: 0x00026E99, 2256: 0x00004527, 2257: 0x00008573, 2258: 0x00004516, 2259: 0x000067BF, 2260: 0x00008616, 2261: 0x00028625, 2262: 0x0002863B, 2263: 0x000085C1, 2264: 0x00027088, 2265: 0x00008602, 2266: 0x00021582, 2267: 0x000270CD, 2268: 0x0002F9B2, 2269: 0x0000456A, 2270: 0x00008628, 2271: 0x00003648, 2272: 0x000218A2, 2273: 0x000053F7, 2274: 0x0002739A, 2275: 0x0000867E, 2276: 0x00008771, 2277: 0x0002A0F8, 2278: 0x000087EE, 2279: 0x00022C27, 2280: 0x000087B1, 2281: 0x000087DA, 2282: 0x0000880F, 2283: 0x00005661, 2284: 0x0000866C, 2285: 0x00006856, 2286: 0x0000460F, 2287: 0x00008845, 2288: 0x00008846, 2289: 0x000275E0, 2290: 0x00023DB9, 2291: 0x000275E4, 2292: 0x0000885E, 2293: 0x0000889C, 2294: 0x0000465B, 2295: 0x000088B4, 2296: 0x000088B5, 2297: 0x000063C1, 2298: 0x000088C5, 2299: 0x00007777, 2300: 0x0002770F, 2301: 0x00008987, 2302: 0x0000898A, 2303: 0x000089A6, 2304: 0x000089A9, 2305: 0x000089A7, 2306: 0x000089BC, 2307: 0x00028A25, 2308: 0x000089E7, 2309: 0x00027924, 2310: 0x00027ABD, 2311: 0x00008A9C, 2312: 0x00007793, 2313: 0x000091FE, 2314: 0x00008A90, 2315: 0x00027A59, 2316: 0x00007AE9, 2317: 0x00027B3A, 2318: 0x00023F8F, 2319: 0x00004713, 2320: 0x00027B38, 2321: 0x0000717C, 2322: 0x00008B0C, 2323: 0x00008B1F, 2324: 0x00025430, 2325: 0x00025565, 2326: 0x00008B3F, 2327: 0x00008B4C, 2328: 0x00008B4D, 2329: 0x00008AA9, 2330: 0x00024A7A, 2331: 0x00008B90, 2332: 0x00008B9B, 2333: 0x00008AAF, 2334: 0x000216DF, 2335: 0x00004615, 2336: 0x0000884F, 2337: 0x00008C9B, 2338: 0x00027D54, 2339: 0x00027D8F, 2340: 0x0002F9D4, 2341: 0x00003725, 2342: 0x00027D53, 2343: 0x00008CD6, 2344: 0x00027D98, 2345: 0x00027DBD, 2346: 0x00008D12, 2347: 0x00008D03, 2348: 0x00021910, 2349: 0x00008CDB, 2350: 0x0000705C, 2351: 0x00008D11, 2352: 0x00024CC9, 2353: 0x00003ED0, 2354: 0x00008D77, 2355: 0x00008DA9, 2356: 0x00028002, 2357: 0x00021014, 2358: 0x0002498A, 2359: 0x00003B7C, 2360: 0x000281BC, 2361: 0x0002710C, 2362: 0x00007AE7, 2363: 0x00008EAD, 2364: 0x00008EB6, 2365: 0x00008EC3, 2366: 0x000092D4, 2367: 0x00008F19, 2368: 0x00008F2D, 2369: 0x00028365, 2370: 0x00028412, 2371: 0x00008FA5, 2372: 0x00009303, 2373: 0x0002A29F, 2374: 0x00020A50, 2375: 0x00008FB3, 2376: 0x0000492A, 2377: 0x000289DE, 2378: 0x0002853D, 2379: 0x00023DBB, 2380: 0x00005EF8, 2381: 0x00023262, 2382: 0x00008FF9, 2383: 0x0002A014, 2384: 0x000286BC, 2385: 0x00028501, 2386: 0x00022325, 2387: 0x00003980, 2388: 0x00026ED7, 2389: 0x00009037, 2390: 0x0002853C, 2391: 0x00027ABE, 2392: 0x00009061, 2393: 0x0002856C, 2394: 0x0002860B, 2395: 0x000090A8, 2396: 0x00028713, 2397: 0x000090C4, 2398: 0x000286E6, 2399: 0x000090AE, 2400: 0x000090FD, 2401: 0x00009167, 2402: 0x00003AF0, 2403: 0x000091A9, 2404: 0x000091C4, 2405: 0x00007CAC, 2406: 0x00028933, 2407: 0x00021E89, 2408: 0x0000920E, 2409: 0x00006C9F, 2410: 0x00009241, 2411: 0x00009262, 2412: 0x000255B9, 2413: 0x000092B9, 2414: 0x00028AC6, 2415: 0x00023C9B, 2416: 0x00028B0C, 2417: 0x000255DB, 2418: 0x00020D31, 2419: 0x0000932C, 2420: 0x0000936B, 2421: 0x00028AE1, 2422: 0x00028BEB, 2423: 0x0000708F, 2424: 0x00005AC3, 2425: 0x00028AE2, 2426: 0x00028AE5, 2427: 0x00004965, 2428: 0x00009244, 2429: 0x00028BEC, 2430: 0x00028C39, 2431: 0x00028BFF, 2432: 0x00009373, 2433: 0x0000945B, 2434: 0x00008EBC, 2435: 0x00009585, 2436: 0x000095A6, 2437: 0x00009426, 2438: 0x000095A0, 2439: 0x00006FF6, 2440: 0x000042B9, 2441: 0x0002267A, 2442: 0x000286D8, 2443: 0x0002127C, 2444: 0x00023E2E, 2445: 0x000049DF, 2446: 0x00006C1C, 2447: 0x0000967B, 2448: 0x00009696, 2449: 0x0000416C, 2450: 0x000096A3, 2451: 0x00026ED5, 2452: 0x000061DA, 2453: 0x000096B6, 2454: 0x000078F5, 2455: 0x00028AE0, 2456: 0x000096BD, 2457: 0x000053CC, 2458: 0x000049A1, 2459: 0x00026CB8, 2460: 0x00020274, 2461: 0x00026410, 2462: 0x000290AF, 2463: 0x000290E5, 2464: 0x00024AD1, 2465: 0x00021915, 2466: 0x0002330A, 2467: 0x00009731, 2468: 0x00008642, 2469: 0x00009736, 2470: 0x00004A0F, 2471: 0x0000453D, 2472: 0x00004585, 2473: 0x00024AE9, 2474: 0x00007075, 2475: 0x00005B41, 2476: 0x0000971B, 2477: 0x0000975C, 2478: 0x000291D5, 2479: 0x00009757, 2480: 0x00005B4A, 2481: 0x000291EB, 2482: 0x0000975F, 2483: 0x00009425, 2484: 0x000050D0, 2485: 0x000230B7, 2486: 0x000230BC, 2487: 0x00009789, 2488: 0x0000979F, 2489: 0x000097B1, 2490: 0x000097BE, 2491: 0x000097C0, 2492: 0x000097D2, 2493: 0x000097E0, 2494: 0x0002546C, 2495: 0x000097EE, 2496: 0x0000741C, 2497: 0x00029433, 2498: 0x000097FF, 2499: 0x000097F5, 2500: 0x0002941D, 2501: 0x0002797A, 2502: 0x00004AD1, 2503: 0x00009834, 2504: 0x00009833, 2505: 0x0000984B, 2506: 0x00009866, 2507: 0x00003B0E, 2508: 0x00027175, 2509: 0x00003D51, 2510: 0x00020630, 2511: 0x0002415C, 2512: 0x00025706, 2513: 0x000098CA, 2514: 0x000098B7, 2515: 0x000098C8, 2516: 0x000098C7, 2517: 0x00004AFF, 2518: 0x00026D27, 2519: 0x000216D3, 2520: 0x000055B0, 2521: 0x000098E1, 2522: 0x000098E6, 2523: 0x000098EC, 2524: 0x00009378, 2525: 0x00009939, 2526: 0x00024A29, 2527: 0x00004B72, 2528: 0x00029857, 2529: 0x00029905, 2530: 0x000099F5, 2531: 0x00009A0C, 2532: 0x00009A3B, 2533: 0x00009A10, 2534: 0x00009A58, 2535: 0x00025725, 2536: 0x000036C4, 2537: 0x000290B1, 2538: 0x00029BD5, 2539: 0x00009AE0, 2540: 0x00009AE2, 2541: 0x00029B05, 2542: 0x00009AF4, 2543: 0x00004C0E, 2544: 0x00009B14, 2545: 0x00009B2D, 2546: 0x00028600, 2547: 0x00005034, 2548: 0x00009B34, 2549: 0x000269A8, 2550: 0x000038C3, 2551: 0x0002307D, 2552: 0x00009B50, 2553: 0x00009B40, 2554: 0x00029D3E, 2555: 0x00005A45, 2556: 0x00021863, 2557: 0x00009B8E, 2558: 0x0002424B, 2559: 0x00009C02, 2560: 0x00009BFF, 2561: 0x00009C0C, 2562: 0x00029E68, 2563: 0x00009DD4, 2564: 0x00029FB7, 2565: 0x0002A192, 2566: 0x0002A1AB, 2567: 0x0002A0E1, 2568: 0x0002A123, 2569: 0x0002A1DF, 2570: 0x00009D7E, 2571: 0x00009D83, 2572: 0x0002A134, 2573: 0x00009E0E, 2574: 0x00006888, 2575: 0x00009DC4, 2576: 0x0002215B, 2577: 0x0002A193, 2578: 0x0002A220, 2579: 0x0002193B, 2580: 0x0002A233, 2581: 0x00009D39, 2582: 0x0002A0B9, 2583: 0x0002A2B4, 2584: 0x00009E90, 2585: 0x00009E95, 2586: 0x00009E9E, 2587: 0x00009EA2, 2588: 0x00004D34, 2589: 0x00009EAA, 2590: 0x00009EAF, 2591: 0x00024364, 2592: 0x00009EC1, 2593: 0x00003B60, 2594: 0x000039E5, 2595: 0x00003D1D, 2596: 0x00004F32, 2597: 0x000037BE, 2598: 0x00028C2B, 2599: 0x00009F02, 2600: 0x00009F08, 2601: 0x00004B96, 2602: 0x00009424, 2603: 0x00026DA2, 2604: 0x00009F17, 2605: 0x00009F16, 2606: 0x00009F39, 2607: 0x0000569F, 2608: 0x0000568A, 2609: 0x00009F45, 2610: 0x000099B8, 2611: 0x0002908B, 2612: 0x000097F2, 2613: 0x0000847F, 2614: 0x00009F62, 2615: 0x00009F69, 2616: 0x00007ADC, 2617: 0x00009F8E, 2618: 0x00007216, 2619: 0x00004BBE, 2620: 0x00024975, 2621: 0x000249BB, 2622: 0x00007177, 2623: 0x000249F8, 2624: 0x00024348, 2625: 0x00024A51, 2626: 0x0000739E, 2627: 0x00028BDA, 2628: 0x000218FA, 2629: 0x0000799F, 2630: 0x0002897E, 2631: 0x00028E36, 2632: 0x00009369, 2633: 0x000093F3, 2634: 0x00028A44, 2635: 0x000092EC, 2636: 0x00009381, 2637: 0x000093CB, 2638: 0x0002896C, 2639: 0x000244B9, 2640: 0x00007217, 2641: 0x00003EEB, 2642: 0x00007772, 2643: 0x00007A43, 2644: 0x000070D0, 2645: 0x00024473, 2646: 0x000243F8, 2647: 0x0000717E, 2648: 0x000217EF, 2649: 0x000070A3, 2650: 0x000218BE, 2651: 0x00023599, 2652: 0x00003EC7, 2653: 0x00021885, 2654: 0x0002542F, 2655: 0x000217F8, 2656: 0x00003722, 2657: 0x000216FB, 2658: 0x00021839, 2659: 0x000036E1, 2660: 0x00021774, 2661: 0x000218D1, 2662: 0x00025F4B, 2663: 0x00003723, 2664: 0x000216C0, 2665: 0x0000575B, 2666: 0x00024A25, 2667: 0x000213FE, 2668: 0x000212A8, 2669: 0x000213C6, 2670: 0x000214B6, 2671: 0x00008503, 2672: 0x000236A6, 2673: 0x00008503, 2674: 0x00008455, 2675: 0x00024994, 2676: 0x00027165, 2677: 0x00023E31, 2678: 0x0002555C, 2679: 0x00023EFB, 2680: 0x00027052, 2681: 0x000044F4, 2682: 0x000236EE, 2683: 0x0002999D, 2684: 0x00026F26, 2685: 0x000067F9, 2686: 0x00003733, 2687: 0x00003C15, 2688: 0x00003DE7, 2689: 0x0000586C, 2690: 0x00021922, 2691: 0x00006810, 2692: 0x00004057, 2693: 0x0002373F, 2694: 0x000240E1, 2695: 0x0002408B, 2696: 0x0002410F, 2697: 0x00026C21, 2698: 0x000054CB, 2699: 0x0000569E, 2700: 0x000266B1, 2701: 0x00005692, 2702: 0x00020FDF, 2703: 0x00020BA8, 2704: 0x00020E0D, 2705: 0x000093C6, 2706: 0x00028B13, 2707: 0x0000939C, 2708: 0x00004EF8, 2709: 0x0000512B, 2710: 0x00003819, 2711: 0x00024436, 2712: 0x00004EBC, 2713: 0x00020465, 2714: 0x0002037F, 2715: 0x00004F4B, 2716: 0x00004F8A, 2717: 0x00025651, 2718: 0x00005A68, 2719: 0x000201AB, 2720: 0x000203CB, 2721: 0x00003999, 2722: 0x0002030A, 2723: 0x00020414, 2724: 0x00003435, 2725: 0x00004F29, 2726: 0x000202C0, 2727: 0x00028EB3, 2728: 0x00020275, 2729: 0x00008ADA, 2730: 0x0002020C, 2731: 0x00004E98, 2732: 0x000050CD, 2733: 0x0000510D, 2734: 0x00004FA2, 2735: 0x00004F03, 2736: 0x00024A0E, 2737: 0x00023E8A, 2738: 0x00004F42, 2739: 0x0000502E, 2740: 0x0000506C, 2741: 0x00005081, 2742: 0x00004FCC, 2743: 0x00004FE5, 2744: 0x00005058, 2745: 0x000050FC, 2746: 0x00005159, 2747: 0x0000515B, 2748: 0x0000515D, 2749: 0x0000515E, 2750: 0x00006E76, 2751: 0x00023595, 2752: 0x00023E39, 2753: 0x00023EBF, 2754: 0x00006D72, 2755: 0x00021884, 2756: 0x00023E89, 2757: 0x000051A8, 2758: 0x000051C3, 2759: 0x000205E0, 2760: 0x000044DD, 2761: 0x000204A3, 2762: 0x00020492, 2763: 0x00020491, 2764: 0x00008D7A, 2765: 0x00028A9C, 2766: 0x0002070E, 2767: 0x00005259, 2768: 0x000052A4, 2769: 0x00020873, 2770: 0x000052E1, 2771: 0x0000936E, 2772: 0x0000467A, 2773: 0x0000718C, 2774: 0x0002438C, 2775: 0x00020C20, 2776: 0x000249AC, 2777: 0x000210E4, 2778: 0x000069D1, 2779: 0x00020E1D, 2780: 0x00007479, 2781: 0x00003EDE, 2782: 0x00007499, 2783: 0x00007414, 2784: 0x00007456, 2785: 0x00007398, 2786: 0x00004B8E, 2787: 0x00024ABC, 2788: 0x0002408D, 2789: 0x000053D0, 2790: 0x00003584, 2791: 0x0000720F, 2792: 0x000240C9, 2793: 0x000055B4, 2794: 0x00020345, 2795: 0x000054CD, 2796: 0x00020BC6, 2797: 0x0000571D, 2798: 0x0000925D, 2799: 0x000096F4, 2800: 0x00009366, 2801: 0x000057DD, 2802: 0x0000578D, 2803: 0x0000577F, 2804: 0x0000363E, 2805: 0x000058CB, 2806: 0x00005A99, 2807: 0x00028A46, 2808: 0x000216FA, 2809: 0x0002176F, 2810: 0x00021710, 2811: 0x00005A2C, 2812: 0x000059B8, 2813: 0x0000928F, 2814: 0x00005A7E, 2815: 0x00005ACF, 2816: 0x00005A12, 2817: 0x00025946, 2818: 0x000219F3, 2819: 0x00021861, 2820: 0x00024295, 2821: 0x000036F5, 2822: 0x00006D05, 2823: 0x00007443, 2824: 0x00005A21, 2825: 0x00025E83, 2826: 0x00005A81, 2827: 0x00028BD7, 2828: 0x00020413, 2829: 0x000093E0, 2830: 0x0000748C, 2831: 0x00021303, 2832: 0x00007105, 2833: 0x00004972, 2834: 0x00009408, 2835: 0x000289FB, 2836: 0x000093BD, 2837: 0x000037A0, 2838: 0x00005C1E, 2839: 0x00005C9E, 2840: 0x00005E5E, 2841: 0x00005E48, 2842: 0x00021996, 2843: 0x0002197C, 2844: 0x00023AEE, 2845: 0x00005ECD, 2846: 0x00005B4F, 2847: 0x00021903, 2848: 0x00021904, 2849: 0x00003701, 2850: 0x000218A0, 2851: 0x000036DD, 2852: 0x000216FE, 2853: 0x000036D3, 2854: 0x0000812A, 2855: 0x00028A47, 2856: 0x00021DBA, 2857: 0x00023472, 2858: 0x000289A8, 2859: 0x00005F0C, 2860: 0x00005F0E, 2861: 0x00021927, 2862: 0x000217AB, 2863: 0x00005A6B, 2864: 0x0002173B, 2865: 0x00005B44, 2866: 0x00008614, 2867: 0x000275FD, 2868: 0x00008860, 2869: 0x0000607E, 2870: 0x00022860, 2871: 0x0002262B, 2872: 0x00005FDB, 2873: 0x00003EB8, 2874: 0x000225AF, 2875: 0x000225BE, 2876: 0x00029088, 2877: 0x00026F73, 2878: 0x000061C0, 2879: 0x0002003E, 2880: 0x00020046, 2881: 0x0002261B, 2882: 0x00006199, 2883: 0x00006198, 2884: 0x00006075, 2885: 0x00022C9B, 2886: 0x00022D07, 2887: 0x000246D4, 2888: 0x0002914D, 2889: 0x00006471, 2890: 0x00024665, 2891: 0x00022B6A, 2892: 0x00003A29, 2893: 0x00022B22, 2894: 0x00023450, 2895: 0x000298EA, 2896: 0x00022E78, 2897: 0x00006337, 2898: 0x0002A45B, 2899: 0x000064B6, 2900: 0x00006331, 2901: 0x000063D1, 2902: 0x000249E3, 2903: 0x00022D67, 2904: 0x000062A4, 2905: 0x00022CA1, 2906: 0x0000643B, 2907: 0x0000656B, 2908: 0x00006972, 2909: 0x00003BF4, 2910: 0x0002308E, 2911: 0x000232AD, 2912: 0x00024989, 2913: 0x000232AB, 2914: 0x0000550D, 2915: 0x000232E0, 2916: 0x000218D9, 2917: 0x0002943F, 2918: 0x000066CE, 2919: 0x00023289, 2920: 0x000231B3, 2921: 0x00003AE0, 2922: 0x00004190, 2923: 0x00025584, 2924: 0x00028B22, 2925: 0x0002558F, 2926: 0x000216FC, 2927: 0x0002555B, 2928: 0x00025425, 2929: 0x000078EE, 2930: 0x00023103, 2931: 0x0002182A, 2932: 0x00023234, 2933: 0x00003464, 2934: 0x0002320F, 2935: 0x00023182, 2936: 0x000242C9, 2937: 0x0000668E, 2938: 0x00026D24, 2939: 0x0000666B, 2940: 0x00004B93, 2941: 0x00006630, 2942: 0x00027870, 2943: 0x00021DEB, 2944: 0x00006663, 2945: 0x000232D2, 2946: 0x000232E1, 2947: 0x0000661E, 2948: 0x00025872, 2949: 0x000038D1, 2950: 0x0002383A, 2951: 0x000237BC, 2952: 0x00003B99, 2953: 0x000237A2, 2954: 0x000233FE, 2955: 0x000074D0, 2956: 0x00003B96, 2957: 0x0000678F, 2958: 0x0002462A, 2959: 0x000068B6, 2960: 0x0000681E, 2961: 0x00003BC4, 2962: 0x00006ABE, 2963: 0x00003863, 2964: 0x000237D5, 2965: 0x00024487, 2966: 0x00006A33, 2967: 0x00006A52, 2968: 0x00006AC9, 2969: 0x00006B05, 2970: 0x00021912, 2971: 0x00006511, 2972: 0x00006898, 2973: 0x00006A4C, 2974: 0x00003BD7, 2975: 0x00006A7A, 2976: 0x00006B57, 2977: 0x00023FC0, 2978: 0x00023C9A, 2979: 0x000093A0, 2980: 0x000092F2, 2981: 0x00028BEA, 2982: 0x00028ACB, 2983: 0x00009289, 2984: 0x0002801E, 2985: 0x000289DC, 2986: 0x00009467, 2987: 0x00006DA5, 2988: 0x00006F0B, 2989: 0x000249EC, 2990: 0x00006D67, 2991: 0x00023F7F, 2992: 0x00003D8F, 2993: 0x00006E04, 2994: 0x0002403C, 2995: 0x00005A3D, 2996: 0x00006E0A, 2997: 0x00005847, 2998: 0x00006D24, 2999: 0x00007842, 3000: 0x0000713B, 3001: 0x0002431A, 3002: 0x00024276, 3003: 0x000070F1, 3004: 0x00007250, 3005: 0x00007287, 3006: 0x00007294, 3007: 0x0002478F, 3008: 0x00024725, 3009: 0x00005179, 3010: 0x00024AA4, 3011: 0x000205EB, 3012: 0x0000747A, 3013: 0x00023EF8, 3014: 0x0002365F, 3015: 0x00024A4A, 3016: 0x00024917, 3017: 0x00025FE1, 3018: 0x00003F06, 3019: 0x00003EB1, 3020: 0x00024ADF, 3021: 0x00028C23, 3022: 0x00023F35, 3023: 0x000060A7, 3024: 0x00003EF3, 3025: 0x000074CC, 3026: 0x0000743C, 3027: 0x00009387, 3028: 0x00007437, 3029: 0x0000449F, 3030: 0x00026DEA, 3031: 0x00004551, 3032: 0x00007583, 3033: 0x00003F63, 3034: 0x00024CD9, 3035: 0x00024D06, 3036: 0x00003F58, 3037: 0x00007555, 3038: 0x00007673, 3039: 0x0002A5C6, 3040: 0x00003B19, 3041: 0x00007468, 3042: 0x00028ACC, 3043: 0x000249AB, 3044: 0x0002498E, 3045: 0x00003AFB, 3046: 0x00003DCD, 3047: 0x00024A4E, 3048: 0x00003EFF, 3049: 0x000249C5, 3050: 0x000248F3, 3051: 0x000091FA, 3052: 0x00005732, 3053: 0x00009342, 3054: 0x00028AE3, 3055: 0x00021864, 3056: 0x000050DF, 3057: 0x00025221, 3058: 0x000251E7, 3059: 0x00007778, 3060: 0x00023232, 3061: 0x0000770E, 3062: 0x0000770F, 3063: 0x0000777B, 3064: 0x00024697, 3065: 0x00023781, 3066: 0x00003A5E, 3067: 0x000248F0, 3068: 0x00007438, 3069: 0x0000749B, 3070: 0x00003EBF, 3071: 0x00024ABA, 3072: 0x00024AC7, 3073: 0x000040C8, 3074: 0x00024A96, 3075: 0x000261AE, 3076: 0x00009307, 3077: 0x00025581, 3078: 0x0000781E, 3079: 0x0000788D, 3080: 0x00007888, 3081: 0x000078D2, 3082: 0x000073D0, 3083: 0x00007959, 3084: 0x00027741, 3085: 0x000256E3, 3086: 0x0000410E, 3087: 0x0000799B, 3088: 0x00008496, 3089: 0x000079A5, 3090: 0x00006A2D, 3091: 0x00023EFA, 3092: 0x00007A3A, 3093: 0x000079F4, 3094: 0x0000416E, 3095: 0x000216E6, 3096: 0x00004132, 3097: 0x00009235, 3098: 0x000079F1, 3099: 0x00020D4C, 3100: 0x0002498C, 3101: 0x00020299, 3102: 0x00023DBA, 3103: 0x0002176E, 3104: 0x00003597, 3105: 0x0000556B, 3106: 0x00003570, 3107: 0x000036AA, 3108: 0x000201D4, 3109: 0x00020C0D, 3110: 0x00007AE2, 3111: 0x00005A59, 3112: 0x000226F5, 3113: 0x00025AAF, 3114: 0x00025A9C, 3115: 0x00005A0D, 3116: 0x0002025B, 3117: 0x000078F0, 3118: 0x00005A2A, 3119: 0x00025BC6, 3120: 0x00007AFE, 3121: 0x000041F9, 3122: 0x00007C5D, 3123: 0x00007C6D, 3124: 0x00004211, 3125: 0x00025BB3, 3126: 0x00025EBC, 3127: 0x00025EA6, 3128: 0x00007CCD, 3129: 0x000249F9, 3130: 0x000217B0, 3131: 0x00007C8E, 3132: 0x00007C7C, 3133: 0x00007CAE, 3134: 0x00006AB2, 3135: 0x00007DDC, 3136: 0x00007E07, 3137: 0x00007DD3, 3138: 0x00007F4E, 3139: 0x00026261, 3140: 0x0002615C, 3141: 0x00027B48, 3142: 0x00007D97, 3143: 0x00025E82, 3144: 0x0000426A, 3145: 0x00026B75, 3146: 0x00020916, 3147: 0x000067D6, 3148: 0x0002004E, 3149: 0x000235CF, 3150: 0x000057C4, 3151: 0x00026412, 3152: 0x000263F8, 3153: 0x00024962, 3154: 0x00007FDD, 3155: 0x00007B27, 3156: 0x0002082C, 3157: 0x00025AE9, 3158: 0x00025D43, 3159: 0x00007B0C, 3160: 0x00025E0E, 3161: 0x000099E6, 3162: 0x00008645, 3163: 0x00009A63, 3164: 0x00006A1C, 3165: 0x0002343F, 3166: 0x000039E2, 3167: 0x000249F7, 3168: 0x000265AD, 3169: 0x00009A1F, 3170: 0x000265A0, 3171: 0x00008480, 3172: 0x00027127, 3173: 0x00026CD1, 3174: 0x000044EA, 3175: 0x00008137, 3176: 0x00004402, 3177: 0x000080C6, 3178: 0x00008109, 3179: 0x00008142, 3180: 0x000267B4, 3181: 0x000098C3, 3182: 0x00026A42, 3183: 0x00008262, 3184: 0x00008265, 3185: 0x00026A51, 3186: 0x00008453, 3187: 0x00026DA7, 3188: 0x00008610, 3189: 0x0002721B, 3190: 0x00005A86, 3191: 0x0000417F, 3192: 0x00021840, 3193: 0x00005B2B, 3194: 0x000218A1, 3195: 0x00005AE4, 3196: 0x000218D8, 3197: 0x000086A0, 3198: 0x0002F9BC, 3199: 0x00023D8F, 3200: 0x0000882D, 3201: 0x00027422, 3202: 0x00005A02, 3203: 0x0000886E, 3204: 0x00004F45, 3205: 0x00008887, 3206: 0x000088BF, 3207: 0x000088E6, 3208: 0x00008965, 3209: 0x0000894D, 3210: 0x00025683, 3211: 0x00008954, 3212: 0x00027785, 3213: 0x00027784, 3214: 0x00028BF5, 3215: 0x00028BD9, 3216: 0x00028B9C, 3217: 0x000289F9, 3218: 0x00003EAD, 3219: 0x000084A3, 3220: 0x000046F5, 3221: 0x000046CF, 3222: 0x000037F2, 3223: 0x00008A3D, 3224: 0x00008A1C, 3225: 0x00029448, 3226: 0x00005F4D, 3227: 0x0000922B, 3228: 0x00024284, 3229: 0x000065D4, 3230: 0x00007129, 3231: 0x000070C4, 3232: 0x00021845, 3233: 0x00009D6D, 3234: 0x00008C9F, 3235: 0x00008CE9, 3236: 0x00027DDC, 3237: 0x0000599A, 3238: 0x000077C3, 3239: 0x000059F0, 3240: 0x0000436E, 3241: 0x000036D4, 3242: 0x00008E2A, 3243: 0x00008EA7, 3244: 0x00024C09, 3245: 0x00008F30, 3246: 0x00008F4A, 3247: 0x000042F4, 3248: 0x00006C58, 3249: 0x00006FBB, 3250: 0x00022321, 3251: 0x0000489B, 3252: 0x00006F79, 3253: 0x00006E8B, 3254: 0x000217DA, 3255: 0x00009BE9, 3256: 0x000036B5, 3257: 0x0002492F, 3258: 0x000090BB, 3259: 0x00009097, 3260: 0x00005571, 3261: 0x00004906, 3262: 0x000091BB, 3263: 0x00009404, 3264: 0x00028A4B, 3265: 0x00004062, 3266: 0x00028AFC, 3267: 0x00009427, 3268: 0x00028C1D, 3269: 0x00028C3B, 3270: 0x000084E5, 3271: 0x00008A2B, 3272: 0x00009599, 3273: 0x000095A7, 3274: 0x00009597, 3275: 0x00009596, 3276: 0x00028D34, 3277: 0x00007445, 3278: 0x00003EC2, 3279: 0x000248FF, 3280: 0x00024A42, 3281: 0x000243EA, 3282: 0x00003EE7, 3283: 0x00023225, 3284: 0x0000968F, 3285: 0x00028EE7, 3286: 0x00028E66, 3287: 0x00028E65, 3288: 0x00003ECC, 3289: 0x000249ED, 3290: 0x00024A78, 3291: 0x00023FEE, 3292: 0x00007412, 3293: 0x0000746B, 3294: 0x00003EFC, 3295: 0x00009741, 3296: 0x000290B0, 3297: 0x00006847, 3298: 0x00004A1D, 3299: 0x00029093, 3300: 0x000257DF, 3301: 0x0000975D, 3302: 0x00009368, 3303: 0x00028989, 3304: 0x00028C26, 3305: 0x00028B2F, 3306: 0x000263BE, 3307: 0x000092BA, 3308: 0x00005B11, 3309: 0x00008B69, 3310: 0x0000493C, 3311: 0x000073F9, 3312: 0x0002421B, 3313: 0x0000979B, 3314: 0x00009771, 3315: 0x00009938, 3316: 0x00020F26, 3317: 0x00005DC1, 3318: 0x00028BC5, 3319: 0x00024AB2, 3320: 0x0000981F, 3321: 0x000294DA, 3322: 0x000092F6, 3323: 0x000295D7, 3324: 0x000091E5, 3325: 0x000044C0, 3326: 0x00028B50, 3327: 0x00024A67, 3328: 0x00028B64, 3329: 0x000098DC, 3330: 0x00028A45, 3331: 0x00003F00, 3332: 0x0000922A, 3333: 0x00004925, 3334: 0x00008414, 3335: 0x0000993B, 3336: 0x0000994D, 3337: 0x00027B06, 3338: 0x00003DFD, 3339: 0x0000999B, 3340: 0x00004B6F, 3341: 0x000099AA, 3342: 0x00009A5C, 3343: 0x00028B65, 3344: 0x000258C8, 3345: 0x00006A8F, 3346: 0x00009A21, 3347: 0x00005AFE, 3348: 0x00009A2F, 3349: 0x000298F1, 3350: 0x00004B90, 3351: 0x00029948, 3352: 0x000099BC, 3353: 0x00004BBD, 3354: 0x00004B97, 3355: 0x0000937D, 3356: 0x00005872, 3357: 0x00021302, 3358: 0x00005822, 3359: 0x000249B8, 3360: 0x000214E8, 3361: 0x00007844, 3362: 0x0002271F, 3363: 0x00023DB8, 3364: 0x000068C5, 3365: 0x00003D7D, 3366: 0x00009458, 3367: 0x00003927, 3368: 0x00006150, 3369: 0x00022781, 3370: 0x0002296B, 3371: 0x00006107, 3372: 0x00009C4F, 3373: 0x00009C53, 3374: 0x00009C7B, 3375: 0x00009C35, 3376: 0x00009C10, 3377: 0x00009B7F, 3378: 0x00009BCF, 3379: 0x00029E2D, 3380: 0x00009B9F, 3381: 0x0002A1F5, 3382: 0x0002A0FE, 3383: 0x00009D21, 3384: 0x00004CAE, 3385: 0x00024104, 3386: 0x00009E18, 3387: 0x00004CB0, 3388: 0x00009D0C, 3389: 0x0002A1B4, 3390: 0x0002A0ED, 3391: 0x0002A0F3, 3392: 0x0002992F, 3393: 0x00009DA5, 3394: 0x000084BD, 3395: 0x00026E12, 3396: 0x00026FDF, 3397: 0x00026B82, 3398: 0x000085FC, 3399: 0x00004533, 3400: 0x00026DA4, 3401: 0x00026E84, 3402: 0x00026DF0, 3403: 0x00008420, 3404: 0x000085EE, 3405: 0x00026E00, 3406: 0x000237D7, 3407: 0x00026064, 3408: 0x000079E2, 3409: 0x0002359C, 3410: 0x00023640, 3411: 0x0000492D, 3412: 0x000249DE, 3413: 0x00003D62, 3414: 0x000093DB, 3415: 0x000092BE, 3416: 0x00009348, 3417: 0x000202BF, 3418: 0x000078B9, 3419: 0x00009277, 3420: 0x0000944D, 3421: 0x00004FE4, 3422: 0x00003440, 3423: 0x00009064, 3424: 0x0002555D, 3425: 0x0000783D, 3426: 0x00007854, 3427: 0x000078B6, 3428: 0x0000784B, 3429: 0x00021757, 3430: 0x000231C9, 3431: 0x00024941, 3432: 0x0000369A, 3433: 0x00004F72, 3434: 0x00006FDA, 3435: 0x00006FD9, 3436: 0x0000701E, 3437: 0x0000701E, 3438: 0x00005414, 3439: 0x000241B5, 3440: 0x000057BB, 3441: 0x000058F3, 3442: 0x0000578A, 3443: 0x00009D16, 3444: 0x000057D7, 3445: 0x00007134, 3446: 0x000034AF, 3447: 0x000241AC, 3448: 0x000071EB, 3449: 0x00026C40, 3450: 0x00024F97, 3451: 0x00005B28, 3452: 0x000217B5, 3453: 0x00028A49, 3454: 0x0000610C, 3455: 0x00005ACE, 3456: 0x00005A0B, 3457: 0x000042BC, 3458: 0x00024488, 3459: 0x0000372C, 3460: 0x00004B7B, 3461: 0x000289FC, 3462: 0x000093BB, 3463: 0x000093B8, 3464: 0x000218D6, 3465: 0x00020F1D, 3466: 0x00008472, 3467: 0x00026CC0, 3468: 0x00021413, 3469: 0x000242FA, 3470: 0x00022C26, 3471: 0x000243C1, 3472: 0x00005994, 3473: 0x00023DB7, 3474: 0x00026741, 3475: 0x00007DA8, 3476: 0x0002615B, 3477: 0x000260A4, 3478: 0x000249B9, 3479: 0x0002498B, 3480: 0x000289FA, 3481: 0x000092E5, 3482: 0x000073E2, 3483: 0x00003EE9, 3484: 0x000074B4, 3485: 0x00028B63, 3486: 0x0002189F, 3487: 0x00003EE1, 3488: 0x00024AB3, 3489: 0x00006AD8, 3490: 0x000073F3, 3491: 0x000073FB, 3492: 0x00003ED6, 3493: 0x00024A3E, 3494: 0x00024A94, 3495: 0x000217D9, 3496: 0x00024A66, 3497: 0x000203A7, 3498: 0x00021424, 3499: 0x000249E5, 3500: 0x00007448, 3501: 0x00024916, 3502: 0x000070A5, 3503: 0x00024976, 3504: 0x00009284, 3505: 0x000073E6, 3506: 0x0000935F, 3507: 0x000204FE, 3508: 0x00009331, 3509: 0x00028ACE, 3510: 0x00028A16, 3511: 0x00009386, 3512: 0x00028BE7, 3513: 0x000255D5, 3514: 0x00004935, 3515: 0x00028A82, 3516: 0x0000716B, 3517: 0x00024943, 3518: 0x00020CFF, 3519: 0x000056A4, 3520: 0x0002061A, 3521: 0x00020BEB, 3522: 0x00020CB8, 3523: 0x00005502, 3524: 0x000079C4, 3525: 0x000217FA, 3526: 0x00007DFE, 3527: 0x000216C2, 3528: 0x00024A50, 3529: 0x00021852, 3530: 0x0000452E, 3531: 0x00009401, 3532: 0x0000370A, 3533: 0x00028AC0, 3534: 0x000249AD, 3535: 0x000059B0, 3536: 0x000218BF, 3537: 0x00021883, 3538: 0x00027484, 3539: 0x00005AA1, 3540: 0x000036E2, 3541: 0x00023D5B, 3542: 0x000036B0, 3543: 0x0000925F, 3544: 0x00005A79, 3545: 0x00028A81, 3546: 0x00021862, 3547: 0x00009374, 3548: 0x00003CCD, 3549: 0x00020AB4, 3550: 0x00004A96, 3551: 0x0000398A, 3552: 0x000050F4, 3553: 0x00003D69, 3554: 0x00003D4C, 3555: 0x0002139C, 3556: 0x00007175, 3557: 0x000042FB, 3558: 0x00028218, 3559: 0x00006E0F, 3560: 0x000290E4, 3561: 0x000044EB, 3562: 0x00006D57, 3563: 0x00027E4F, 3564: 0x00007067, 3565: 0x00006CAF, 3566: 0x00003CD6, 3567: 0x00023FED, 3568: 0x00023E2D, 3569: 0x00006E02, 3570: 0x00006F0C, 3571: 0x00003D6F, 3572: 0x000203F5, 3573: 0x00007551, 3574: 0x000036BC, 3575: 0x000034C8, 3576: 0x00004680, 3577: 0x00003EDA, 3578: 0x00004871, 3579: 0x000059C4, 3580: 0x0000926E, 3581: 0x0000493E, 3582: 0x00008F41, 3583: 0x00028C1C, 3584: 0x00026BC0, 3585: 0x00005812, 3586: 0x000057C8, 3587: 0x000036D6, 3588: 0x00021452, 3589: 0x000070FE, 3590: 0x00024362, 3591: 0x00024A71, 3592: 0x00022FE3, 3593: 0x000212B0, 3594: 0x000223BD, 3595: 0x000068B9, 3596: 0x00006967, 3597: 0x00021398, 3598: 0x000234E5, 3599: 0x00027BF4, 3600: 0x000236DF, 3601: 0x00028A83, 3602: 0x000237D6, 3603: 0x000233FA, 3604: 0x00024C9F, 3605: 0x00006A1A, 3606: 0x000236AD, 3607: 0x00026CB7, 3608: 0x0000843E, 3609: 0x000044DF, 3610: 0x000044CE, 3611: 0x00026D26, 3612: 0x00026D51, 3613: 0x00026C82, 3614: 0x00026FDE, 3615: 0x00006F17, 3616: 0x00027109, 3617: 0x0000833D, 3618: 0x0002173A, 3619: 0x000083ED, 3620: 0x00026C80, 3621: 0x00027053, 3622: 0x000217DB, 3623: 0x00005989, 3624: 0x00005A82, 3625: 0x000217B3, 3626: 0x00005A61, 3627: 0x00005A71, 3628: 0x00021905, 3629: 0x000241FC, 3630: 0x0000372D, 3631: 0x000059EF, 3632: 0x0002173C, 3633: 0x000036C7, 3634: 0x0000718E, 3635: 0x00009390, 3636: 0x0000669A, 3637: 0x000242A5, 3638: 0x00005A6E, 3639: 0x00005A2B, 3640: 0x00024293, 3641: 0x00006A2B, 3642: 0x00023EF9, 3643: 0x00027736, 3644: 0x0002445B, 3645: 0x000242CA, 3646: 0x0000711D, 3647: 0x00024259, 3648: 0x000289E1, 3649: 0x00004FB0, 3650: 0x00026D28, 3651: 0x00005CC2, 3652: 0x000244CE, 3653: 0x00027E4D, 3654: 0x000243BD, 3655: 0x00006A0C, 3656: 0x00024256, 3657: 0x00021304, 3658: 0x000070A6, 3659: 0x00007133, 3660: 0x000243E9, 3661: 0x00003DA5, 3662: 0x00006CDF, 3663: 0x0002F825, 3664: 0x00024A4F, 3665: 0x00007E65, 3666: 0x000059EB, 3667: 0x00005D2F, 3668: 0x00003DF3, 3669: 0x00005F5C, 3670: 0x00024A5D, 3671: 0x000217DF, 3672: 0x00007DA4, 3673: 0x00008426, 3674: 0x00005485, 3675: 0x00023AFA, 3676: 0x00023300, 3677: 0x00020214, 3678: 0x0000577E, 3679: 0x000208D5, 3680: 0x00020619, 3681: 0x00003FE5, 3682: 0x00021F9E, 3683: 0x0002A2B6, 3684: 0x00007003, 3685: 0x0002915B, 3686: 0x00005D70, 3687: 0x0000738F, 3688: 0x00007CD3, 3689: 0x00028A59, 3690: 0x00029420, 3691: 0x00004FC8, 3692: 0x00007FE7, 3693: 0x000072CD, 3694: 0x00007310, 3695: 0x00027AF4, 3696: 0x00007338, 3697: 0x00007339, 3698: 0x000256F6, 3699: 0x00007341, 3700: 0x00007348, 3701: 0x00003EA9, 3702: 0x00027B18, 3703: 0x0000906C, 3704: 0x000071F5, 3705: 0x000248F2, 3706: 0x000073E1, 3707: 0x000081F6, 3708: 0x00003ECA, 3709: 0x0000770C, 3710: 0x00003ED1, 3711: 0x00006CA2, 3712: 0x000056FD, 3713: 0x00007419, 3714: 0x0000741E, 3715: 0x0000741F, 3716: 0x00003EE2, 3717: 0x00003EF0, 3718: 0x00003EF4, 3719: 0x00003EFA, 3720: 0x000074D3, 3721: 0x00003F0E, 3722: 0x00003F53, 3723: 0x00007542, 3724: 0x0000756D, 3725: 0x00007572, 3726: 0x0000758D, 3727: 0x00003F7C, 3728: 0x000075C8, 3729: 0x000075DC, 3730: 0x00003FC0, 3731: 0x0000764D, 3732: 0x00003FD7, 3733: 0x00007674, 3734: 0x00003FDC, 3735: 0x0000767A, 3736: 0x00024F5C, 3737: 0x00007188, 3738: 0x00005623, 3739: 0x00008980, 3740: 0x00005869, 3741: 0x0000401D, 3742: 0x00007743, 3743: 0x00004039, 3744: 0x00006761, 3745: 0x00004045, 3746: 0x000035DB, 3747: 0x00007798, 3748: 0x0000406A, 3749: 0x0000406F, 3750: 0x00005C5E, 3751: 0x000077BE, 3752: 0x000077CB, 3753: 0x000058F2, 3754: 0x00007818, 3755: 0x000070B9, 3756: 0x0000781C, 3757: 0x000040A8, 3758: 0x00007839, 3759: 0x00007847, 3760: 0x00007851, 3761: 0x00007866, 3762: 0x00008448, 3763: 0x00025535, 3764: 0x00007933, 3765: 0x00006803, 3766: 0x00007932, 3767: 0x00004103, 3768: 0x00004109, 3769: 0x00007991, 3770: 0x00007999, 3771: 0x00008FBB, 3772: 0x00007A06, 3773: 0x00008FBC, 3774: 0x00004167, 3775: 0x00007A91, 3776: 0x000041B2, 3777: 0x00007ABC, 3778: 0x00008279, 3779: 0x000041C4, 3780: 0x00007ACF, 3781: 0x00007ADB, 3782: 0x000041CF, 3783: 0x00004E21, 3784: 0x00007B62, 3785: 0x00007B6C, 3786: 0x00007B7B, 3787: 0x00007C12, 3788: 0x00007C1B, 3789: 0x00004260, 3790: 0x0000427A, 3791: 0x00007C7B, 3792: 0x00007C9C, 3793: 0x0000428C, 3794: 0x00007CB8, 3795: 0x00004294, 3796: 0x00007CED, 3797: 0x00008F93, 3798: 0x000070C0, 3799: 0x00020CCF, 3800: 0x00007DCF, 3801: 0x00007DD4, 3802: 0x00007DD0, 3803: 0x00007DFD, 3804: 0x00007FAE, 3805: 0x00007FB4, 3806: 0x0000729F, 3807: 0x00004397, 3808: 0x00008020, 3809: 0x00008025, 3810: 0x00007B39, 3811: 0x0000802E, 3812: 0x00008031, 3813: 0x00008054, 3814: 0x00003DCC, 3815: 0x000057B4, 3816: 0x000070A0, 3817: 0x000080B7, 3818: 0x000080E9, 3819: 0x000043ED, 3820: 0x0000810C, 3821: 0x0000732A, 3822: 0x0000810E, 3823: 0x00008112, 3824: 0x00007560, 3825: 0x00008114, 3826: 0x00004401, 3827: 0x00003B39, 3828: 0x00008156, 3829: 0x00008159, 3830: 0x0000815A, 3831: 0x00004413, 3832: 0x0000583A, 3833: 0x0000817C, 3834: 0x00008184, 3835: 0x00004425, 3836: 0x00008193, 3837: 0x0000442D, 3838: 0x000081A5, 3839: 0x000057EF, 3840: 0x000081C1, 3841: 0x000081E4, 3842: 0x00008254, 3843: 0x0000448F, 3844: 0x000082A6, 3845: 0x00008276, 3846: 0x000082CA, 3847: 0x000082D8, 3848: 0x000082FF, 3849: 0x000044B0, 3850: 0x00008357, 3851: 0x00009669, 3852: 0x0000698A, 3853: 0x00008405, 3854: 0x000070F5, 3855: 0x00008464, 3856: 0x000060E3, 3857: 0x00008488, 3858: 0x00004504, 3859: 0x000084BE, 3860: 0x000084E1, 3861: 0x000084F8, 3862: 0x00008510, 3863: 0x00008538, 3864: 0x00008552, 3865: 0x0000453B, 3866: 0x0000856F, 3867: 0x00008570, 3868: 0x000085E0, 3869: 0x00004577, 3870: 0x00008672, 3871: 0x00008692, 3872: 0x000086B2, 3873: 0x000086EF, 3874: 0x00009645, 3875: 0x0000878B, 3876: 0x00004606, 3877: 0x00004617, 3878: 0x000088AE, 3879: 0x000088FF, 3880: 0x00008924, 3881: 0x00008947, 3882: 0x00008991, 3883: 0x00027967, 3884: 0x00008A29, 3885: 0x00008A38, 3886: 0x00008A94, 3887: 0x00008AB4, 3888: 0x00008C51, 3889: 0x00008CD4, 3890: 0x00008CF2, 3891: 0x00008D1C, 3892: 0x00004798, 3893: 0x0000585F, 3894: 0x00008DC3, 3895: 0x000047ED, 3896: 0x00004EEE, 3897: 0x00008E3A, 3898: 0x000055D8, 3899: 0x00005754, 3900: 0x00008E71, 3901: 0x000055F5, 3902: 0x00008EB0, 3903: 0x00004837, 3904: 0x00008ECE, 3905: 0x00008EE2, 3906: 0x00008EE4, 3907: 0x00008EED, 3908: 0x00008EF2, 3909: 0x00008FB7, 3910: 0x00008FC1, 3911: 0x00008FCA, 3912: 0x00008FCC, 3913: 0x00009033, 3914: 0x000099C4, 3915: 0x000048AD, 3916: 0x000098E0, 3917: 0x00009213, 3918: 0x0000491E, 3919: 0x00009228, 3920: 0x00009258, 3921: 0x0000926B, 3922: 0x000092B1, 3923: 0x000092AE, 3924: 0x000092BF, 3925: 0x000092E3, 3926: 0x000092EB, 3927: 0x000092F3, 3928: 0x000092F4, 3929: 0x000092FD, 3930: 0x00009343, 3931: 0x00009384, 3932: 0x000093AD, 3933: 0x00004945, 3934: 0x00004951, 3935: 0x00009EBF, 3936: 0x00009417, 3937: 0x00005301, 3938: 0x0000941D, 3939: 0x0000942D, 3940: 0x0000943E, 3941: 0x0000496A, 3942: 0x00009454, 3943: 0x00009479, 3944: 0x0000952D, 3945: 0x000095A2, 3946: 0x000049A7, 3947: 0x000095F4, 3948: 0x00009633, 3949: 0x000049E5, 3950: 0x000067A0, 3951: 0x00004A24, 3952: 0x00009740, 3953: 0x00004A35, 3954: 0x000097B2, 3955: 0x000097C2, 3956: 0x00005654, 3957: 0x00004AE4, 3958: 0x000060E8, 3959: 0x000098B9, 3960: 0x00004B19, 3961: 0x000098F1, 3962: 0x00005844, 3963: 0x0000990E, 3964: 0x00009919, 3965: 0x000051B4, 3966: 0x0000991C, 3967: 0x00009937, 3968: 0x00009942, 3969: 0x0000995D, 3970: 0x00009962, 3971: 0x00004B70, 3972: 0x000099C5, 3973: 0x00004B9D, 3974: 0x00009A3C, 3975: 0x00009B0F, 3976: 0x00007A83, 3977: 0x00009B69, 3978: 0x00009B81, 3979: 0x00009BDD, 3980: 0x00009BF1, 3981: 0x00009BF4, 3982: 0x00004C6D, 3983: 0x00009C20, 3984: 0x0000376F, 3985: 0x00021BC2, 3986: 0x00009D49, 3987: 0x00009C3A, 3988: 0x00009EFE, 3989: 0x00005650, 3990: 0x00009D93, 3991: 0x00009DBD, 3992: 0x00009DC0, 3993: 0x00009DFC, 3994: 0x000094F6, 3995: 0x00008FB6, 3996: 0x00009E7B, 3997: 0x00009EAC, 3998: 0x00009EB1, 3999: 0x00009EBD, 4000: 0x00009EC6, 4001: 0x000094DC, 4002: 0x00009EE2, 4003: 0x00009EF1, 4004: 0x00009EF8, 4005: 0x00007AC8, 4006: 0x00009F44, 4007: 0x00020094, 4008: 0x000202B7, 4009: 0x000203A0, 4010: 0x0000691A, 4011: 0x000094C3, 4012: 0x000059AC, 4013: 0x000204D7, 4014: 0x00005840, 4015: 0x000094C1, 4016: 0x000037B9, 4017: 0x000205D5, 4018: 0x00020615, 4019: 0x00020676, 4020: 0x000216BA, 4021: 0x00005757, 4022: 0x00007173, 4023: 0x00020AC2, 4024: 0x00020ACD, 4025: 0x00020BBF, 4026: 0x0000546A, 4027: 0x0002F83B, 4028: 0x00020BCB, 4029: 0x0000549E, 4030: 0x00020BFB, 4031: 0x00020C3B, 4032: 0x00020C53, 4033: 0x00020C65, 4034: 0x00020C7C, 4035: 0x000060E7, 4036: 0x00020C8D, 4037: 0x0000567A, 4038: 0x00020CB5, 4039: 0x00020CDD, 4040: 0x00020CED, 4041: 0x00020D6F, 4042: 0x00020DB2, 4043: 0x00020DC8, 4044: 0x00006955, 4045: 0x00009C2F, 4046: 0x000087A5, 4047: 0x00020E04, 4048: 0x00020E0E, 4049: 0x00020ED7, 4050: 0x00020F90, 4051: 0x00020F2D, 4052: 0x00020E73, 4053: 0x00005C20, 4054: 0x00020FBC, 4055: 0x00005E0B, 4056: 0x0002105C, 4057: 0x0002104F, 4058: 0x00021076, 4059: 0x0000671E, 4060: 0x0002107B, 4061: 0x00021088, 4062: 0x00021096, 4063: 0x00003647, 4064: 0x000210BF, 4065: 0x000210D3, 4066: 0x0002112F, 4067: 0x0002113B, 4068: 0x00005364, 4069: 0x000084AD, 4070: 0x000212E3, 4071: 0x00021375, 4072: 0x00021336, 4073: 0x00008B81, 4074: 0x00021577, 4075: 0x00021619, 4076: 0x000217C3, 4077: 0x000217C7, 4078: 0x00004E78, 4079: 0x000070BB, 4080: 0x0002182D, 4081: 0x0002196A, 4082: 0x00021A2D, 4083: 0x00021A45, 4084: 0x00021C2A, 4085: 0x00021C70, 4086: 0x00021CAC, 4087: 0x00021EC8, 4088: 0x000062C3, 4089: 0x00021ED5, 4090: 0x00021F15, 4091: 0x00007198, 4092: 0x00006855, 4093: 0x00022045, 4094: 0x000069E9, 4095: 0x000036C8, 4096: 0x0002227C, 4097: 0x000223D7, 4098: 0x000223FA, 4099: 0x0002272A, 4100: 0x00022871, 4101: 0x0002294F, 4102: 0x000082FD, 4103: 0x00022967, 4104: 0x00022993, 4105: 0x00022AD5, 4106: 0x000089A5, 4107: 0x00022AE8, 4108: 0x00008FA0, 4109: 0x00022B0E, 4110: 0x000097B8, 4111: 0x00022B3F, 4112: 0x00009847, 4113: 0x00009ABD, 4114: 0x00022C4C, 4116: 0x00022C88, 4117: 0x00022CB7, 4118: 0x00025BE8, 4119: 0x00022D08, 4120: 0x00022D12, 4121: 0x00022DB7, 4122: 0x00022D95, 4123: 0x00022E42, 4124: 0x00022F74, 4125: 0x00022FCC, 4126: 0x00023033, 4127: 0x00023066, 4128: 0x0002331F, 4129: 0x000233DE, 4130: 0x00005FB1, 4131: 0x00006648, 4132: 0x000066BF, 4133: 0x00027A79, 4134: 0x00023567, 4135: 0x000235F3, 4136: 0x00007201, 4137: 0x000249BA, 4138: 0x000077D7, 4139: 0x0002361A, 4140: 0x00023716, 4141: 0x00007E87, 4142: 0x00020346, 4143: 0x000058B5, 4144: 0x0000670E, 4145: 0x00006918, 4146: 0x00023AA7, 4147: 0x00027657, 4148: 0x00025FE2, 4149: 0x00023E11, 4150: 0x00023EB9, 4151: 0x000275FE, 4152: 0x0002209A, 4153: 0x000048D0, 4154: 0x00004AB8, 4155: 0x00024119, 4156: 0x00028A9A, 4157: 0x000242EE, 4158: 0x0002430D, 4159: 0x0002403B, 4160: 0x00024334, 4161: 0x00024396, 4162: 0x00024A45, 4163: 0x000205CA, 4164: 0x000051D2, 4165: 0x00020611, 4166: 0x0000599F, 4167: 0x00021EA8, 4168: 0x00003BBE, 4169: 0x00023CFF, 4170: 0x00024404, 4171: 0x000244D6, 4172: 0x00005788, 4173: 0x00024674, 4174: 0x0000399B, 4175: 0x0002472F, 4176: 0x000285E8, 4177: 0x000299C9, 4178: 0x00003762, 4179: 0x000221C3, 4180: 0x00008B5E, 4181: 0x00028B4E, 4182: 0x000099D6, 4183: 0x00024812, 4184: 0x000248FB, 4185: 0x00024A15, 4186: 0x00007209, 4187: 0x00024AC0, 4188: 0x00020C78, 4189: 0x00005965, 4190: 0x00024EA5, 4191: 0x00024F86, 4192: 0x00020779, 4193: 0x00008EDA, 4194: 0x0002502C, 4195: 0x0000528F, 4196: 0x0000573F, 4197: 0x00007171, 4198: 0x00025299, 4199: 0x00025419, 4200: 0x00023F4A, 4201: 0x00024AA7, 4202: 0x000055BC, 4203: 0x00025446, 4204: 0x0002546E, 4205: 0x00026B52, 4206: 0x000091D4, 4207: 0x00003473, 4208: 0x0002553F, 4209: 0x00027632, 4210: 0x0002555E, 4211: 0x00004718, 4212: 0x00025562, 4213: 0x00025566, 4214: 0x000257C7, 4215: 0x0002493F, 4216: 0x0002585D, 4217: 0x00005066, 4218: 0x000034FB, 4219: 0x000233CC, 4220: 0x000060DE, 4221: 0x00025903, 4222: 0x0000477C, 4223: 0x00028948, 4224: 0x00025AAE, 4225: 0x00025B89, 4226: 0x00025C06, 4227: 0x00021D90, 4228: 0x000057A1, 4229: 0x00007151, 4230: 0x00006FB6, 4231: 0x00026102, 4232: 0x00027C12, 4233: 0x00009056, 4234: 0x000261B2, 4235: 0x00024F9A, 4236: 0x00008B62, 4237: 0x00026402, 4238: 0x0002644A, 4239: 0x00005D5B, 4240: 0x00026BF7, 4241: 0x00008F36, 4242: 0x00026484, 4243: 0x0002191C, 4244: 0x00008AEA, 4245: 0x000249F6, 4246: 0x00026488, 4247: 0x00023FEF, 4248: 0x00026512, 4249: 0x00004BC0, 4250: 0x000265BF, 4251: 0x000266B5, 4252: 0x0002271B, 4253: 0x00009465, 4254: 0x000257E1, 4255: 0x00006195, 4256: 0x00005A27, 4257: 0x0002F8CD, 4258: 0x00004FBB, 4259: 0x000056B9, 4260: 0x00024521, 4261: 0x000266FC, 4262: 0x00004E6A, 4263: 0x00024934, 4264: 0x00009656, 4265: 0x00006D8F, 4266: 0x00026CBD, 4267: 0x00003618, 4268: 0x00008977, 4269: 0x00026799, 4270: 0x0002686E, 4271: 0x00026411, 4272: 0x0002685E, 4273: 0x000071DF, 4274: 0x000268C7, 4275: 0x00007B42, 4276: 0x000290C0, 4277: 0x00020A11, 4278: 0x00026926, 4279: 0x00009104, 4280: 0x00026939, 4281: 0x00007A45, 4282: 0x00009DF0, 4283: 0x000269FA, 4284: 0x00009A26, 4285: 0x00026A2D, 4286: 0x0000365F, 4287: 0x00026469, 4288: 0x00020021, 4289: 0x00007983, 4290: 0x00026A34, 4291: 0x00026B5B, 4292: 0x00005D2C, 4293: 0x00023519, 4294: 0x000083CF, 4295: 0x00026B9D, 4296: 0x000046D0, 4297: 0x00026CA4, 4298: 0x0000753B, 4299: 0x00008865, 4300: 0x00026DAE, 4301: 0x000058B6, 4302: 0x0000371C, 4303: 0x0002258D, 4304: 0x0002704B, 4305: 0x000271CD, 4306: 0x00003C54, 4307: 0x00027280, 4308: 0x00027285, 4309: 0x00009281, 4310: 0x0002217A, 4311: 0x0002728B, 4312: 0x00009330, 4313: 0x000272E6, 4314: 0x000249D0, 4315: 0x00006C39, 4316: 0x0000949F, 4317: 0x00027450, 4318: 0x00020EF8, 4319: 0x00008827, 4320: 0x000088F5, 4321: 0x00022926, 4322: 0x00028473, 4323: 0x000217B1, 4324: 0x00006EB8, 4325: 0x00024A2A, 4326: 0x00021820, 4327: 0x000039A4, 4328: 0x000036B9, 4329: 0x00005C10, 4330: 0x000079E3, 4331: 0x0000453F, 4332: 0x000066B6, 4333: 0x00029CAD, 4334: 0x000298A4, 4335: 0x00008943, 4336: 0x000277CC, 4337: 0x00027858, 4338: 0x000056D6, 4339: 0x000040DF, 4340: 0x0002160A, 4341: 0x000039A1, 4342: 0x0002372F, 4343: 0x000280E8, 4344: 0x000213C5, 4345: 0x000071AD, 4346: 0x00008366, 4347: 0x000279DD, 4348: 0x000291A8, 4349: 0x00005A67, 4350: 0x00004CB7, 4351: 0x000270AF, 4352: 0x000289AB, 4353: 0x000279FD, 4354: 0x00027A0A, 4355: 0x00027B0B, 4356: 0x00027D66, 4357: 0x0002417A, 4358: 0x00007B43, 4359: 0x0000797E, 4360: 0x00028009, 4361: 0x00006FB5, 4362: 0x0002A2DF, 4363: 0x00006A03, 4364: 0x00028318, 4365: 0x000053A2, 4366: 0x00026E07, 4367: 0x000093BF, 4368: 0x00006836, 4369: 0x0000975D, 4370: 0x0002816F, 4371: 0x00028023, 4372: 0x000269B5, 4373: 0x000213ED, 4374: 0x0002322F, 4375: 0x00028048, 4376: 0x00005D85, 4377: 0x00028C30, 4378: 0x00028083, 4379: 0x00005715, 4380: 0x00009823, 4381: 0x00028949, 4382: 0x00005DAB, 4383: 0x00024988, 4384: 0x000065BE, 4385: 0x000069D5, 4386: 0x000053D2, 4387: 0x00024AA5, 4388: 0x00023F81, 4389: 0x00003C11, 4390: 0x00006736, 4391: 0x00028090, 4392: 0x000280F4, 4393: 0x0002812E, 4394: 0x00021FA1, 4395: 0x0002814F, 4396: 0x00028189, 4397: 0x000281AF, 4398: 0x0002821A, 4399: 0x00028306, 4400: 0x0002832F, 4401: 0x0002838A, 4402: 0x000035CA, 4403: 0x00028468, 4404: 0x000286AA, 4405: 0x000048FA, 4406: 0x000063E6, 4407: 0x00028956, 4408: 0x00007808, 4409: 0x00009255, 4410: 0x000289B8, 4411: 0x000043F2, 4412: 0x000289E7, 4413: 0x000043DF, 4414: 0x000289E8, 4415: 0x00028B46, 4416: 0x00028BD4, 4417: 0x000059F8, 4418: 0x00028C09, 4419: 0x00008F0B, 4420: 0x00028FC5, 4421: 0x000290EC, 4422: 0x00007B51, 4423: 0x00029110, 4424: 0x0002913C, 4425: 0x00003DF7, 4426: 0x0002915E, 4427: 0x00024ACA, 4428: 0x00008FD0, 4429: 0x0000728F, 4430: 0x0000568B, 4431: 0x000294E7, 4432: 0x000295E9, 4433: 0x000295B0, 4434: 0x000295B8, 4435: 0x00029732, 4436: 0x000298D1, 4437: 0x00029949, 4438: 0x0002996A, 4439: 0x000299C3, 4440: 0x00029A28, 4441: 0x00029B0E, 4442: 0x00029D5A, 4443: 0x00029D9B, 4444: 0x00007E9F, 4445: 0x00029EF8, 4446: 0x00029F23, 4447: 0x00004CA4, 4448: 0x00009547, 4449: 0x0002A293, 4450: 0x000071A2, 4451: 0x0002A2FF, 4452: 0x00004D91, 4453: 0x00009012, 4454: 0x0002A5CB, 4455: 0x00004D9C, 4456: 0x00020C9C, 4457: 0x00008FBE, 4458: 0x000055C1, 4459: 0x00008FBA, 4460: 0x000224B0, 4461: 0x00008FB9, 4462: 0x00024A93, 4463: 0x00004509, 4464: 0x00007E7F, 4465: 0x00006F56, 4466: 0x00006AB1, 4467: 0x00004EEA, 4468: 0x000034E4, 4469: 0x00028B2C, 4470: 0x0002789D, 4471: 0x0000373A, 4472: 0x00008E80, 4473: 0x000217F5, 4474: 0x00028024, 4475: 0x00028B6C, 4476: 0x00028B99, 4477: 0x00027A3E, 4478: 0x000266AF, 4479: 0x00003DEB, 4480: 0x00027655, 4481: 0x00023CB7, 4482: 0x00025635, 4483: 0x00025956, 4484: 0x00004E9A, 4485: 0x00025E81, 4486: 0x00026258, 4487: 0x000056BF, 4488: 0x00020E6D, 4489: 0x00008E0E, 4490: 0x00005B6D, 4491: 0x00023E88, 4492: 0x00024C9E, 4493: 0x000063DE, 4494: 0x000062D0, 4495: 0x000217F6, 4496: 0x0002187B, 4497: 0x00006530, 4498: 0x0000562D, 4499: 0x00025C4A, 4500: 0x0000541A, 4501: 0x00025311, 4502: 0x00003DC6, 4503: 0x00029D98, 4504: 0x00004C7D, 4505: 0x00005622, 4506: 0x0000561E, 4507: 0x00007F49, 4508: 0x00025ED8, 4509: 0x00005975, 4510: 0x00023D40, 4511: 0x00008770, 4512: 0x00004E1C, 4513: 0x00020FEA, 4514: 0x00020D49, 4515: 0x000236BA, 4516: 0x00008117, 4517: 0x00009D5E, 4518: 0x00008D18, 4519: 0x0000763B, 4520: 0x00009C45, 4521: 0x0000764E, 4522: 0x000077B9, 4523: 0x00009345, 4524: 0x00005432, 4525: 0x00008148, 4526: 0x000082F7, 4527: 0x00005625, 4528: 0x00008132, 4529: 0x00008418, 4530: 0x000080BD, 4531: 0x000055EA, 4532: 0x00007962, 4533: 0x00005643, 4534: 0x00005416, 4535: 0x00020E9D, 4536: 0x000035CE, 4537: 0x00005605, 4538: 0x000055F1, 4539: 0x000066F1, 4540: 0x000282E2, 4541: 0x0000362D, 4542: 0x00007534, 4543: 0x000055F0, 4544: 0x000055BA, 4545: 0x00005497, 4546: 0x00005572, 4547: 0x00020C41, 4548: 0x00020C96, 4549: 0x00005ED0, 4550: 0x00025148, 4551: 0x00020E76, 4552: 0x00022C62, 4553: 0x00020EA2, 4554: 0x00009EAB, 4555: 0x00007D5A, 4556: 0x000055DE, 4557: 0x00021075, 4558: 0x0000629D, 4559: 0x0000976D, 4560: 0x00005494, 4561: 0x00008CCD, 4562: 0x000071F6, 4563: 0x00009176, 4564: 0x000063FC, 4565: 0x000063B9, 4566: 0x000063FE, 4567: 0x00005569, 4568: 0x00022B43, 4569: 0x00009C72, 4570: 0x00022EB3, 4571: 0x0000519A, 4572: 0x000034DF, 4573: 0x00020DA7, 4574: 0x000051A7, 4575: 0x0000544D, 4576: 0x0000551E, 4577: 0x00005513, 4578: 0x00007666, 4579: 0x00008E2D, 4580: 0x0002688A, 4581: 0x000075B1, 4582: 0x000080B6, 4583: 0x00008804, 4584: 0x00008786, 4585: 0x000088C7, 4586: 0x000081B6, 4587: 0x0000841C, 4588: 0x000210C1, 4589: 0x000044EC, 4590: 0x00007304, 4591: 0x00024706, 4592: 0x00005B90, 4593: 0x0000830B, 4594: 0x00026893, 4595: 0x0000567B, 4596: 0x000226F4, 4597: 0x00027D2F, 4598: 0x000241A3, 4599: 0x00027D73, 4600: 0x00026ED0, 4601: 0x000272B6, 4602: 0x00009170, 4603: 0x000211D9, 4604: 0x00009208, 4605: 0x00023CFC, 4606: 0x0002A6A9, 4607: 0x00020EAC, 4608: 0x00020EF9, 4609: 0x00007266, 4610: 0x00021CA2, 4611: 0x0000474E, 4612: 0x00024FC2, 4613: 0x00027FF9, 4614: 0x00020FEB, 4615: 0x000040FA, 4616: 0x00009C5D, 4617: 0x0000651F, 4618: 0x00022DA0, 4619: 0x000048F3, 4620: 0x000247E0, 4621: 0x00029D7C, 4622: 0x00020FEC, 4623: 0x00020E0A, 4624: 0x00006062, 4625: 0x000275A3, 4626: 0x00020FED, 4628: 0x00026048, 4629: 0x00021187, 4630: 0x000071A3, 4631: 0x00007E8E, 4632: 0x00009D50, 4633: 0x00004E1A, 4634: 0x00004E04, 4635: 0x00003577, 4636: 0x00005B0D, 4637: 0x00006CB2, 4638: 0x00005367, 4639: 0x000036AC, 4640: 0x000039DC, 4641: 0x0000537D, 4642: 0x000036A5, 4643: 0x00024618, 4644: 0x0000589A, 4645: 0x00024B6E, 4646: 0x0000822D, 4647: 0x0000544B, 4648: 0x000057AA, 4649: 0x00025A95, 4650: 0x00020979, 4652: 0x00003A52, 4653: 0x00022465, 4654: 0x00007374, 4655: 0x00029EAC, 4656: 0x00004D09, 4657: 0x00009BED, 4658: 0x00023CFE, 4659: 0x00029F30, 4660: 0x00004C5B, 4661: 0x00024FA9, 4662: 0x0002959E, 4663: 0x00029FDE, 4664: 0x0000845C, 4665: 0x00023DB6, 4666: 0x000272B2, 4667: 0x000267B3, 4668: 0x00023720, 4669: 0x0000632E, 4670: 0x00007D25, 4671: 0x00023EF7, 4672: 0x00023E2C, 4673: 0x00003A2A, 4674: 0x00009008, 4675: 0x000052CC, 4676: 0x00003E74, 4677: 0x0000367A, 4678: 0x000045E9, 4679: 0x0002048E, 4680: 0x00007640, 4681: 0x00005AF0, 4682: 0x00020EB6, 4683: 0x0000787A, 4684: 0x00027F2E, 4685: 0x000058A7, 4686: 0x000040BF, 4687: 0x0000567C, 4688: 0x00009B8B, 4689: 0x00005D74, 4690: 0x00007654, 4691: 0x0002A434, 4692: 0x00009E85, 4693: 0x00004CE1, 4694: 0x000075F9, 4695: 0x000037FB, 4696: 0x00006119, 4697: 0x000230DA, 4698: 0x000243F2, 4700: 0x0000565D, 4701: 0x000212A9, 4702: 0x000057A7, 4703: 0x00024963, 4704: 0x00029E06, 4705: 0x00005234, 4706: 0x000270AE, 4707: 0x000035AD, 4708: 0x00006C4A, 4709: 0x00009D7C, 4710: 0x00007C56, 4711: 0x00009B39, 4712: 0x000057DE, 4713: 0x0002176C, 4714: 0x00005C53, 4715: 0x000064D3, 4716: 0x000294D0, 4717: 0x00026335, 4718: 0x00027164, 4719: 0x000086AD, 4720: 0x00020D28, 4721: 0x00026D22, 4722: 0x00024AE2, 4723: 0x00020D71, 4725: 0x000051FE, 4726: 0x00021F0F, 4727: 0x00005D8E, 4728: 0x00009703, 4729: 0x00021DD1, 4730: 0x00009E81, 4731: 0x0000904C, 4732: 0x00007B1F, 4733: 0x00009B02, 4734: 0x00005CD1, 4735: 0x00007BA3, 4736: 0x00006268, 4737: 0x00006335, 4738: 0x00009AFF, 4739: 0x00007BCF, 4740: 0x00009B2A, 4741: 0x00007C7E, 4742: 0x00009B2E, 4743: 0x00007C42, 4744: 0x00007C86, 4745: 0x00009C15, 4746: 0x00007BFC, 4747: 0x00009B09, 4748: 0x00009F17, 4749: 0x00009C1B, 4750: 0x0002493E, 4751: 0x00009F5A, 4752: 0x00005573, 4753: 0x00005BC3, 4754: 0x00004FFD, 4755: 0x00009E98, 4756: 0x00004FF2, 4757: 0x00005260, 4758: 0x00003E06, 4759: 0x000052D1, 4760: 0x00005767, 4761: 0x00005056, 4762: 0x000059B7, 4763: 0x00005E12, 4764: 0x000097C8, 4765: 0x00009DAB, 4766: 0x00008F5C, 4767: 0x00005469, 4768: 0x000097B4, 4769: 0x00009940, 4770: 0x000097BA, 4771: 0x0000532C, 4772: 0x00006130, 4773: 0x0000692C, 4774: 0x000053DA, 4775: 0x00009C0A, 4776: 0x00009D02, 4777: 0x00004C3B, 4778: 0x00009641, 4779: 0x00006980, 4780: 0x000050A6, 4781: 0x00007546, 4782: 0x0002176D, 4783: 0x000099DA, 4784: 0x00005273, 4786: 0x00009159, 4787: 0x00009681, 4788: 0x0000915C, 4790: 0x00009151, 4791: 0x00028E97, 4792: 0x0000637F, 4793: 0x00026D23, 4794: 0x00006ACA, 4795: 0x00005611, 4796: 0x0000918E, 4797: 0x0000757A, 4798: 0x00006285, 4799: 0x000203FC, 4800: 0x0000734F, 4801: 0x00007C70, 4802: 0x00025C21, 4803: 0x00023CFD, 4805: 0x00024919, 4806: 0x000076D6, 4807: 0x00009B9D, 4808: 0x00004E2A, 4809: 0x00020CD4, 4810: 0x000083BE, 4811: 0x00008842, 4813: 0x00005C4A, 4814: 0x000069C0, 4815: 0x000050ED, 4816: 0x0000577A, 4817: 0x0000521F, 4818: 0x00005DF5, 4819: 0x00004ECE, 4820: 0x00006C31, 4821: 0x000201F2, 4822: 0x00004F39, 4823: 0x0000549C, 4824: 0x000054DA, 4825: 0x0000529A, 4826: 0x00008D82, 4827: 0x000035FE, 4828: 0x00005F0C, 4829: 0x000035F3, 4831: 0x00006B52, 4832: 0x0000917C, 4833: 0x00009FA5, 4834: 0x00009B97, 4835: 0x0000982E, 4836: 0x000098B4, 4837: 0x00009ABA, 4838: 0x00009EA8, 4839: 0x00009E84, 4840: 0x0000717A, 4841: 0x00007B14, 4843: 0x00006BFA, 4844: 0x00008818, 4845: 0x00007F78, 4847: 0x00005620, 4848: 0x0002A64A, 4849: 0x00008E77, 4850: 0x00009F53, 4852: 0x00008DD4, 4853: 0x00008E4F, 4854: 0x00009E1C, 4855: 0x00008E01, 4856: 0x00006282, 4857: 0x0002837D, 4858: 0x00008E28, 4859: 0x00008E75, 4860: 0x00007AD3, 4861: 0x00024A77, 4862: 0x00007A3E, 4863: 0x000078D8, 4864: 0x00006CEA, 4865: 0x00008A67, 4866: 0x00007607, 4867: 0x00028A5A, 4868: 0x00009F26, 4869: 0x00006CCE, 4870: 0x000087D6, 4871: 0x000075C3, 4872: 0x0002A2B2, 4873: 0x00007853, 4874: 0x0002F840, 4875: 0x00008D0C, 4876: 0x000072E2, 4877: 0x00007371, 4878: 0x00008B2D, 4879: 0x00007302, 4880: 0x000074F1, 4881: 0x00008CEB, 4882: 0x00024ABB, 4883: 0x0000862F, 4884: 0x00005FBA, 4885: 0x000088A0, 4886: 0x000044B7, 4888: 0x0002183B, 4889: 0x00026E05, 4891: 0x00008A7E, 4892: 0x0002251B, 4894: 0x000060FD, 4895: 0x00007667, 4896: 0x00009AD7, 4897: 0x00009D44, 4898: 0x0000936E, 4899: 0x00009B8F, 4900: 0x000087F5, 4902: 0x0000880F, 4903: 0x00008CF7, 4904: 0x0000732C, 4905: 0x00009721, 4906: 0x00009BB0, 4907: 0x000035D6, 4908: 0x000072B2, 4909: 0x00004C07, 4910: 0x00007C51, 4911: 0x0000994A, 4912: 0x00026159, 4913: 0x00006159, 4914: 0x00004C04, 4915: 0x00009E96, 4916: 0x0000617D, 4918: 0x0000575F, 4919: 0x0000616F, 4920: 0x000062A6, 4921: 0x00006239, 4922: 0x000062CE, 4923: 0x00003A5C, 4924: 0x000061E2, 4925: 0x000053AA, 4926: 0x000233F5, 4927: 0x00006364, 4928: 0x00006802, 4929: 0x000035D2, 4930: 0x00005D57, 4931: 0x00028BC2, 4932: 0x00008FDA, 4933: 0x00028E39, 4935: 0x000050D9, 4936: 0x00021D46, 4937: 0x00007906, 4938: 0x00005332, 4939: 0x00009638, 4940: 0x00020F3B, 4941: 0x00004065, 4943: 0x000077FE, 4945: 0x00007CC2, 4946: 0x00025F1A, 4947: 0x00007CDA, 4948: 0x00007A2D, 4949: 0x00008066, 4950: 0x00008063, 4951: 0x00007D4D, 4952: 0x00007505, 4953: 0x000074F2, 4954: 0x00008994, 4955: 0x0000821A, 4956: 0x0000670C, 4957: 0x00008062, 4958: 0x00027486, 4959: 0x0000805B, 4960: 0x000074F0, 4961: 0x00008103, 4962: 0x00007724, 4963: 0x00008989, 4964: 0x000267CC, 4965: 0x00007553, 4966: 0x00026ED1, 4967: 0x000087A9, 4968: 0x000087CE, 4969: 0x000081C8, 4970: 0x0000878C, 4971: 0x00008A49, 4972: 0x00008CAD, 4973: 0x00008B43, 4974: 0x0000772B, 4975: 0x000074F8, 4976: 0x000084DA, 4977: 0x00003635, 4978: 0x000069B2, 4979: 0x00008DA6, 4981: 0x000089A9, 4982: 0x00007468, 4983: 0x00006DB9, 4984: 0x000087C1, 4985: 0x00024011, 4986: 0x000074E7, 4987: 0x00003DDB, 4988: 0x00007176, 4989: 0x000060A4, 4990: 0x0000619C, 4991: 0x00003CD1, 4992: 0x00007162, 4993: 0x00006077, 4995: 0x00007F71, 4996: 0x00028B2D, 4997: 0x00007250, 4998: 0x000060E9, 4999: 0x00004B7E, 5000: 0x00005220, 5001: 0x00003C18, 5002: 0x00023CC7, 5003: 0x00025ED7, 5004: 0x00027656, 5005: 0x00025531, 5006: 0x00021944, 5007: 0x000212FE, 5008: 0x00029903, 5009: 0x00026DDC, 5010: 0x000270AD, 5011: 0x00005CC1, 5012: 0x000261AD, 5013: 0x00028A0F, 5014: 0x00023677, 5015: 0x000200EE, 5016: 0x00026846, 5017: 0x00024F0E, 5018: 0x00004562, 5019: 0x00005B1F, 5020: 0x0002634C, 5021: 0x00009F50, 5022: 0x00009EA6, 5023: 0x0002626B, 5024: 0x00003000, 5025: 0x0000FF0C, 5026: 0x00003001, 5027: 0x00003002, 5028: 0x0000FF0E, 5029: 0x00002027, 5030: 0x0000FF1B, 5031: 0x0000FF1A, 5032: 0x0000FF1F, 5033: 0x0000FF01, 5034: 0x0000FE30, 5035: 0x00002026, 5036: 0x00002025, 5037: 0x0000FE50, 5038: 0x0000FE51, 5039: 0x0000FE52, 5040: 0x000000B7, 5041: 0x0000FE54, 5042: 0x0000FE55, 5043: 0x0000FE56, 5044: 0x0000FE57, 5045: 0x0000FF5C, 5046: 0x00002013, 5047: 0x0000FE31, 5048: 0x00002014, 5049: 0x0000FE33, 5050: 0x00002574, 5051: 0x0000FE34, 5052: 0x0000FE4F, 5053: 0x0000FF08, 5054: 0x0000FF09, 5055: 0x0000FE35, 5056: 0x0000FE36, 5057: 0x0000FF5B, 5058: 0x0000FF5D, 5059: 0x0000FE37, 5060: 0x0000FE38, 5061: 0x00003014, 5062: 0x00003015, 5063: 0x0000FE39, 5064: 0x0000FE3A, 5065: 0x00003010, 5066: 0x00003011, 5067: 0x0000FE3B, 5068: 0x0000FE3C, 5069: 0x0000300A, 5070: 0x0000300B, 5071: 0x0000FE3D, 5072: 0x0000FE3E, 5073: 0x00003008, 5074: 0x00003009, 5075: 0x0000FE3F, 5076: 0x0000FE40, 5077: 0x0000300C, 5078: 0x0000300D, 5079: 0x0000FE41, 5080: 0x0000FE42, 5081: 0x0000300E, 5082: 0x0000300F, 5083: 0x0000FE43, 5084: 0x0000FE44, 5085: 0x0000FE59, 5086: 0x0000FE5A, 5087: 0x0000FE5B, 5088: 0x0000FE5C, 5089: 0x0000FE5D, 5090: 0x0000FE5E, 5091: 0x00002018, 5092: 0x00002019, 5093: 0x0000201C, 5094: 0x0000201D, 5095: 0x0000301D, 5096: 0x0000301E, 5097: 0x00002035, 5098: 0x00002032, 5099: 0x0000FF03, 5100: 0x0000FF06, 5101: 0x0000FF0A, 5102: 0x0000203B, 5103: 0x000000A7, 5104: 0x00003003, 5105: 0x000025CB, 5106: 0x000025CF, 5107: 0x000025B3, 5108: 0x000025B2, 5109: 0x000025CE, 5110: 0x00002606, 5111: 0x00002605, 5112: 0x000025C7, 5113: 0x000025C6, 5114: 0x000025A1, 5115: 0x000025A0, 5116: 0x000025BD, 5117: 0x000025BC, 5118: 0x000032A3, 5119: 0x00002105, 5120: 0x000000AF, 5121: 0x0000FFE3, 5122: 0x0000FF3F, 5123: 0x000002CD, 5124: 0x0000FE49, 5125: 0x0000FE4A, 5126: 0x0000FE4D, 5127: 0x0000FE4E, 5128: 0x0000FE4B, 5129: 0x0000FE4C, 5130: 0x0000FE5F, 5131: 0x0000FE60, 5132: 0x0000FE61, 5133: 0x0000FF0B, 5134: 0x0000FF0D, 5135: 0x000000D7, 5136: 0x000000F7, 5137: 0x000000B1, 5138: 0x0000221A, 5139: 0x0000FF1C, 5140: 0x0000FF1E, 5141: 0x0000FF1D, 5142: 0x00002266, 5143: 0x00002267, 5144: 0x00002260, 5145: 0x0000221E, 5146: 0x00002252, 5147: 0x00002261, 5148: 0x0000FE62, 5149: 0x0000FE63, 5150: 0x0000FE64, 5151: 0x0000FE65, 5152: 0x0000FE66, 5153: 0x0000FF5E, 5154: 0x00002229, 5155: 0x0000222A, 5156: 0x000022A5, 5157: 0x00002220, 5158: 0x0000221F, 5159: 0x000022BF, 5160: 0x000033D2, 5161: 0x000033D1, 5162: 0x0000222B, 5163: 0x0000222E, 5164: 0x00002235, 5165: 0x00002234, 5166: 0x00002640, 5167: 0x00002642, 5168: 0x00002295, 5169: 0x00002299, 5170: 0x00002191, 5171: 0x00002193, 5172: 0x00002190, 5173: 0x00002192, 5174: 0x00002196, 5175: 0x00002197, 5176: 0x00002199, 5177: 0x00002198, 5178: 0x00002225, 5179: 0x00002223, 5180: 0x0000FF0F, 5181: 0x0000FF3C, 5182: 0x00002215, 5183: 0x0000FE68, 5184: 0x0000FF04, 5185: 0x0000FFE5, 5186: 0x00003012, 5187: 0x0000FFE0, 5188: 0x0000FFE1, 5189: 0x0000FF05, 5190: 0x0000FF20, 5191: 0x00002103, 5192: 0x00002109, 5193: 0x0000FE69, 5194: 0x0000FE6A, 5195: 0x0000FE6B, 5196: 0x000033D5, 5197: 0x0000339C, 5198: 0x0000339D, 5199: 0x0000339E, 5200: 0x000033CE, 5201: 0x000033A1, 5202: 0x0000338E, 5203: 0x0000338F, 5204: 0x000033C4, 5205: 0x000000B0, 5206: 0x00005159, 5207: 0x0000515B, 5208: 0x0000515E, 5209: 0x0000515D, 5210: 0x00005161, 5211: 0x00005163, 5212: 0x000055E7, 5213: 0x000074E9, 5214: 0x00007CCE, 5215: 0x00002581, 5216: 0x00002582, 5217: 0x00002583, 5218: 0x00002584, 5219: 0x00002585, 5220: 0x00002586, 5221: 0x00002587, 5222: 0x00002588, 5223: 0x0000258F, 5224: 0x0000258E, 5225: 0x0000258D, 5226: 0x0000258C, 5227: 0x0000258B, 5228: 0x0000258A, 5229: 0x00002589, 5230: 0x0000253C, 5231: 0x00002534, 5232: 0x0000252C, 5233: 0x00002524, 5234: 0x0000251C, 5235: 0x00002594, 5236: 0x00002500, 5237: 0x00002502, 5238: 0x00002595, 5239: 0x0000250C, 5240: 0x00002510, 5241: 0x00002514, 5242: 0x00002518, 5243: 0x0000256D, 5244: 0x0000256E, 5245: 0x00002570, 5246: 0x0000256F, 5247: 0x00002550, 5248: 0x0000255E, 5249: 0x0000256A, 5250: 0x00002561, 5251: 0x000025E2, 5252: 0x000025E3, 5253: 0x000025E5, 5254: 0x000025E4, 5255: 0x00002571, 5256: 0x00002572, 5257: 0x00002573, 5258: 0x0000FF10, 5259: 0x0000FF11, 5260: 0x0000FF12, 5261: 0x0000FF13, 5262: 0x0000FF14, 5263: 0x0000FF15, 5264: 0x0000FF16, 5265: 0x0000FF17, 5266: 0x0000FF18, 5267: 0x0000FF19, 5268: 0x00002160, 5269: 0x00002161, 5270: 0x00002162, 5271: 0x00002163, 5272: 0x00002164, 5273: 0x00002165, 5274: 0x00002166, 5275: 0x00002167, 5276: 0x00002168, 5277: 0x00002169, 5278: 0x00003021, 5279: 0x00003022, 5280: 0x00003023, 5281: 0x00003024, 5282: 0x00003025, 5283: 0x00003026, 5284: 0x00003027, 5285: 0x00003028, 5286: 0x00003029, 5287: 0x00005341, 5288: 0x00005344, 5289: 0x00005345, 5290: 0x0000FF21, 5291: 0x0000FF22, 5292: 0x0000FF23, 5293: 0x0000FF24, 5294: 0x0000FF25, 5295: 0x0000FF26, 5296: 0x0000FF27, 5297: 0x0000FF28, 5298: 0x0000FF29, 5299: 0x0000FF2A, 5300: 0x0000FF2B, 5301: 0x0000FF2C, 5302: 0x0000FF2D, 5303: 0x0000FF2E, 5304: 0x0000FF2F, 5305: 0x0000FF30, 5306: 0x0000FF31, 5307: 0x0000FF32, 5308: 0x0000FF33, 5309: 0x0000FF34, 5310: 0x0000FF35, 5311: 0x0000FF36, 5312: 0x0000FF37, 5313: 0x0000FF38, 5314: 0x0000FF39, 5315: 0x0000FF3A, 5316: 0x0000FF41, 5317: 0x0000FF42, 5318: 0x0000FF43, 5319: 0x0000FF44, 5320: 0x0000FF45, 5321: 0x0000FF46, 5322: 0x0000FF47, 5323: 0x0000FF48, 5324: 0x0000FF49, 5325: 0x0000FF4A, 5326: 0x0000FF4B, 5327: 0x0000FF4C, 5328: 0x0000FF4D, 5329: 0x0000FF4E, 5330: 0x0000FF4F, 5331: 0x0000FF50, 5332: 0x0000FF51, 5333: 0x0000FF52, 5334: 0x0000FF53, 5335: 0x0000FF54, 5336: 0x0000FF55, 5337: 0x0000FF56, 5338: 0x0000FF57, 5339: 0x0000FF58, 5340: 0x0000FF59, 5341: 0x0000FF5A, 5342: 0x00000391, 5343: 0x00000392, 5344: 0x00000393, 5345: 0x00000394, 5346: 0x00000395, 5347: 0x00000396, 5348: 0x00000397, 5349: 0x00000398, 5350: 0x00000399, 5351: 0x0000039A, 5352: 0x0000039B, 5353: 0x0000039C, 5354: 0x0000039D, 5355: 0x0000039E, 5356: 0x0000039F, 5357: 0x000003A0, 5358: 0x000003A1, 5359: 0x000003A3, 5360: 0x000003A4, 5361: 0x000003A5, 5362: 0x000003A6, 5363: 0x000003A7, 5364: 0x000003A8, 5365: 0x000003A9, 5366: 0x000003B1, 5367: 0x000003B2, 5368: 0x000003B3, 5369: 0x000003B4, 5370: 0x000003B5, 5371: 0x000003B6, 5372: 0x000003B7, 5373: 0x000003B8, 5374: 0x000003B9, 5375: 0x000003BA, 5376: 0x000003BB, 5377: 0x000003BC, 5378: 0x000003BD, 5379: 0x000003BE, 5380: 0x000003BF, 5381: 0x000003C0, 5382: 0x000003C1, 5383: 0x000003C3, 5384: 0x000003C4, 5385: 0x000003C5, 5386: 0x000003C6, 5387: 0x000003C7, 5388: 0x000003C8, 5389: 0x000003C9, 5390: 0x00003105, 5391: 0x00003106, 5392: 0x00003107, 5393: 0x00003108, 5394: 0x00003109, 5395: 0x0000310A, 5396: 0x0000310B, 5397: 0x0000310C, 5398: 0x0000310D, 5399: 0x0000310E, 5400: 0x0000310F, 5401: 0x00003110, 5402: 0x00003111, 5403: 0x00003112, 5404: 0x00003113, 5405: 0x00003114, 5406: 0x00003115, 5407: 0x00003116, 5408: 0x00003117, 5409: 0x00003118, 5410: 0x00003119, 5411: 0x0000311A, 5412: 0x0000311B, 5413: 0x0000311C, 5414: 0x0000311D, 5415: 0x0000311E, 5416: 0x0000311F, 5417: 0x00003120, 5418: 0x00003121, 5419: 0x00003122, 5420: 0x00003123, 5421: 0x00003124, 5422: 0x00003125, 5423: 0x00003126, 5424: 0x00003127, 5425: 0x00003128, 5426: 0x00003129, 5427: 0x000002D9, 5428: 0x000002C9, 5429: 0x000002CA, 5430: 0x000002C7, 5431: 0x000002CB, 5432: 0x00002400, 5433: 0x00002401, 5434: 0x00002402, 5435: 0x00002403, 5436: 0x00002404, 5437: 0x00002405, 5438: 0x00002406, 5439: 0x00002407, 5440: 0x00002408, 5441: 0x00002409, 5442: 0x0000240A, 5443: 0x0000240B, 5444: 0x0000240C, 5445: 0x0000240D, 5446: 0x0000240E, 5447: 0x0000240F, 5448: 0x00002410, 5449: 0x00002411, 5450: 0x00002412, 5451: 0x00002413, 5452: 0x00002414, 5453: 0x00002415, 5454: 0x00002416, 5455: 0x00002417, 5456: 0x00002418, 5457: 0x00002419, 5458: 0x0000241A, 5459: 0x0000241B, 5460: 0x0000241C, 5461: 0x0000241D, 5462: 0x0000241E, 5463: 0x0000241F, 5464: 0x00002421, 5465: 0x000020AC, 5495: 0x00004E00, 5496: 0x00004E59, 5497: 0x00004E01, 5498: 0x00004E03, 5499: 0x00004E43, 5500: 0x00004E5D, 5501: 0x00004E86, 5502: 0x00004E8C, 5503: 0x00004EBA, 5504: 0x0000513F, 5505: 0x00005165, 5506: 0x0000516B, 5507: 0x000051E0, 5508: 0x00005200, 5509: 0x00005201, 5510: 0x0000529B, 5511: 0x00005315, 5512: 0x00005341, 5513: 0x0000535C, 5514: 0x000053C8, 5515: 0x00004E09, 5516: 0x00004E0B, 5517: 0x00004E08, 5518: 0x00004E0A, 5519: 0x00004E2B, 5520: 0x00004E38, 5521: 0x000051E1, 5522: 0x00004E45, 5523: 0x00004E48, 5524: 0x00004E5F, 5525: 0x00004E5E, 5526: 0x00004E8E, 5527: 0x00004EA1, 5528: 0x00005140, 5529: 0x00005203, 5530: 0x000052FA, 5531: 0x00005343, 5532: 0x000053C9, 5533: 0x000053E3, 5534: 0x0000571F, 5535: 0x000058EB, 5536: 0x00005915, 5537: 0x00005927, 5538: 0x00005973, 5539: 0x00005B50, 5540: 0x00005B51, 5541: 0x00005B53, 5542: 0x00005BF8, 5543: 0x00005C0F, 5544: 0x00005C22, 5545: 0x00005C38, 5546: 0x00005C71, 5547: 0x00005DDD, 5548: 0x00005DE5, 5549: 0x00005DF1, 5550: 0x00005DF2, 5551: 0x00005DF3, 5552: 0x00005DFE, 5553: 0x00005E72, 5554: 0x00005EFE, 5555: 0x00005F0B, 5556: 0x00005F13, 5557: 0x0000624D, 5558: 0x00004E11, 5559: 0x00004E10, 5560: 0x00004E0D, 5561: 0x00004E2D, 5562: 0x00004E30, 5563: 0x00004E39, 5564: 0x00004E4B, 5565: 0x00005C39, 5566: 0x00004E88, 5567: 0x00004E91, 5568: 0x00004E95, 5569: 0x00004E92, 5570: 0x00004E94, 5571: 0x00004EA2, 5572: 0x00004EC1, 5573: 0x00004EC0, 5574: 0x00004EC3, 5575: 0x00004EC6, 5576: 0x00004EC7, 5577: 0x00004ECD, 5578: 0x00004ECA, 5579: 0x00004ECB, 5580: 0x00004EC4, 5581: 0x00005143, 5582: 0x00005141, 5583: 0x00005167, 5584: 0x0000516D, 5585: 0x0000516E, 5586: 0x0000516C, 5587: 0x00005197, 5588: 0x000051F6, 5589: 0x00005206, 5590: 0x00005207, 5591: 0x00005208, 5592: 0x000052FB, 5593: 0x000052FE, 5594: 0x000052FF, 5595: 0x00005316, 5596: 0x00005339, 5597: 0x00005348, 5598: 0x00005347, 5599: 0x00005345, 5600: 0x0000535E, 5601: 0x00005384, 5602: 0x000053CB, 5603: 0x000053CA, 5604: 0x000053CD, 5605: 0x000058EC, 5606: 0x00005929, 5607: 0x0000592B, 5608: 0x0000592A, 5609: 0x0000592D, 5610: 0x00005B54, 5611: 0x00005C11, 5612: 0x00005C24, 5613: 0x00005C3A, 5614: 0x00005C6F, 5615: 0x00005DF4, 5616: 0x00005E7B, 5617: 0x00005EFF, 5618: 0x00005F14, 5619: 0x00005F15, 5620: 0x00005FC3, 5621: 0x00006208, 5622: 0x00006236, 5623: 0x0000624B, 5624: 0x0000624E, 5625: 0x0000652F, 5626: 0x00006587, 5627: 0x00006597, 5628: 0x000065A4, 5629: 0x000065B9, 5630: 0x000065E5, 5631: 0x000066F0, 5632: 0x00006708, 5633: 0x00006728, 5634: 0x00006B20, 5635: 0x00006B62, 5636: 0x00006B79, 5637: 0x00006BCB, 5638: 0x00006BD4, 5639: 0x00006BDB, 5640: 0x00006C0F, 5641: 0x00006C34, 5642: 0x0000706B, 5643: 0x0000722A, 5644: 0x00007236, 5645: 0x0000723B, 5646: 0x00007247, 5647: 0x00007259, 5648: 0x0000725B, 5649: 0x000072AC, 5650: 0x0000738B, 5651: 0x00004E19, 5652: 0x00004E16, 5653: 0x00004E15, 5654: 0x00004E14, 5655: 0x00004E18, 5656: 0x00004E3B, 5657: 0x00004E4D, 5658: 0x00004E4F, 5659: 0x00004E4E, 5660: 0x00004EE5, 5661: 0x00004ED8, 5662: 0x00004ED4, 5663: 0x00004ED5, 5664: 0x00004ED6, 5665: 0x00004ED7, 5666: 0x00004EE3, 5667: 0x00004EE4, 5668: 0x00004ED9, 5669: 0x00004EDE, 5670: 0x00005145, 5671: 0x00005144, 5672: 0x00005189, 5673: 0x0000518A, 5674: 0x000051AC, 5675: 0x000051F9, 5676: 0x000051FA, 5677: 0x000051F8, 5678: 0x0000520A, 5679: 0x000052A0, 5680: 0x0000529F, 5681: 0x00005305, 5682: 0x00005306, 5683: 0x00005317, 5684: 0x0000531D, 5685: 0x00004EDF, 5686: 0x0000534A, 5687: 0x00005349, 5688: 0x00005361, 5689: 0x00005360, 5690: 0x0000536F, 5691: 0x0000536E, 5692: 0x000053BB, 5693: 0x000053EF, 5694: 0x000053E4, 5695: 0x000053F3, 5696: 0x000053EC, 5697: 0x000053EE, 5698: 0x000053E9, 5699: 0x000053E8, 5700: 0x000053FC, 5701: 0x000053F8, 5702: 0x000053F5, 5703: 0x000053EB, 5704: 0x000053E6, 5705: 0x000053EA, 5706: 0x000053F2, 5707: 0x000053F1, 5708: 0x000053F0, 5709: 0x000053E5, 5710: 0x000053ED, 5711: 0x000053FB, 5712: 0x000056DB, 5713: 0x000056DA, 5714: 0x00005916, 5715: 0x0000592E, 5716: 0x00005931, 5717: 0x00005974, 5718: 0x00005976, 5719: 0x00005B55, 5720: 0x00005B83, 5721: 0x00005C3C, 5722: 0x00005DE8, 5723: 0x00005DE7, 5724: 0x00005DE6, 5725: 0x00005E02, 5726: 0x00005E03, 5727: 0x00005E73, 5728: 0x00005E7C, 5729: 0x00005F01, 5730: 0x00005F18, 5731: 0x00005F17, 5732: 0x00005FC5, 5733: 0x0000620A, 5734: 0x00006253, 5735: 0x00006254, 5736: 0x00006252, 5737: 0x00006251, 5738: 0x000065A5, 5739: 0x000065E6, 5740: 0x0000672E, 5741: 0x0000672C, 5742: 0x0000672A, 5743: 0x0000672B, 5744: 0x0000672D, 5745: 0x00006B63, 5746: 0x00006BCD, 5747: 0x00006C11, 5748: 0x00006C10, 5749: 0x00006C38, 5750: 0x00006C41, 5751: 0x00006C40, 5752: 0x00006C3E, 5753: 0x000072AF, 5754: 0x00007384, 5755: 0x00007389, 5756: 0x000074DC, 5757: 0x000074E6, 5758: 0x00007518, 5759: 0x0000751F, 5760: 0x00007528, 5761: 0x00007529, 5762: 0x00007530, 5763: 0x00007531, 5764: 0x00007532, 5765: 0x00007533, 5766: 0x0000758B, 5767: 0x0000767D, 5768: 0x000076AE, 5769: 0x000076BF, 5770: 0x000076EE, 5771: 0x000077DB, 5772: 0x000077E2, 5773: 0x000077F3, 5774: 0x0000793A, 5775: 0x000079BE, 5776: 0x00007A74, 5777: 0x00007ACB, 5778: 0x00004E1E, 5779: 0x00004E1F, 5780: 0x00004E52, 5781: 0x00004E53, 5782: 0x00004E69, 5783: 0x00004E99, 5784: 0x00004EA4, 5785: 0x00004EA6, 5786: 0x00004EA5, 5787: 0x00004EFF, 5788: 0x00004F09, 5789: 0x00004F19, 5790: 0x00004F0A, 5791: 0x00004F15, 5792: 0x00004F0D, 5793: 0x00004F10, 5794: 0x00004F11, 5795: 0x00004F0F, 5796: 0x00004EF2, 5797: 0x00004EF6, 5798: 0x00004EFB, 5799: 0x00004EF0, 5800: 0x00004EF3, 5801: 0x00004EFD, 5802: 0x00004F01, 5803: 0x00004F0B, 5804: 0x00005149, 5805: 0x00005147, 5806: 0x00005146, 5807: 0x00005148, 5808: 0x00005168, 5809: 0x00005171, 5810: 0x0000518D, 5811: 0x000051B0, 5812: 0x00005217, 5813: 0x00005211, 5814: 0x00005212, 5815: 0x0000520E, 5816: 0x00005216, 5817: 0x000052A3, 5818: 0x00005308, 5819: 0x00005321, 5820: 0x00005320, 5821: 0x00005370, 5822: 0x00005371, 5823: 0x00005409, 5824: 0x0000540F, 5825: 0x0000540C, 5826: 0x0000540A, 5827: 0x00005410, 5828: 0x00005401, 5829: 0x0000540B, 5830: 0x00005404, 5831: 0x00005411, 5832: 0x0000540D, 5833: 0x00005408, 5834: 0x00005403, 5835: 0x0000540E, 5836: 0x00005406, 5837: 0x00005412, 5838: 0x000056E0, 5839: 0x000056DE, 5840: 0x000056DD, 5841: 0x00005733, 5842: 0x00005730, 5843: 0x00005728, 5844: 0x0000572D, 5845: 0x0000572C, 5846: 0x0000572F, 5847: 0x00005729, 5848: 0x00005919, 5849: 0x0000591A, 5850: 0x00005937, 5851: 0x00005938, 5852: 0x00005984, 5853: 0x00005978, 5854: 0x00005983, 5855: 0x0000597D, 5856: 0x00005979, 5857: 0x00005982, 5858: 0x00005981, 5859: 0x00005B57, 5860: 0x00005B58, 5861: 0x00005B87, 5862: 0x00005B88, 5863: 0x00005B85, 5864: 0x00005B89, 5865: 0x00005BFA, 5866: 0x00005C16, 5867: 0x00005C79, 5868: 0x00005DDE, 5869: 0x00005E06, 5870: 0x00005E76, 5871: 0x00005E74, 5872: 0x00005F0F, 5873: 0x00005F1B, 5874: 0x00005FD9, 5875: 0x00005FD6, 5876: 0x0000620E, 5877: 0x0000620C, 5878: 0x0000620D, 5879: 0x00006210, 5880: 0x00006263, 5881: 0x0000625B, 5882: 0x00006258, 5883: 0x00006536, 5884: 0x000065E9, 5885: 0x000065E8, 5886: 0x000065EC, 5887: 0x000065ED, 5888: 0x000066F2, 5889: 0x000066F3, 5890: 0x00006709, 5891: 0x0000673D, 5892: 0x00006734, 5893: 0x00006731, 5894: 0x00006735, 5895: 0x00006B21, 5896: 0x00006B64, 5897: 0x00006B7B, 5898: 0x00006C16, 5899: 0x00006C5D, 5900: 0x00006C57, 5901: 0x00006C59, 5902: 0x00006C5F, 5903: 0x00006C60, 5904: 0x00006C50, 5905: 0x00006C55, 5906: 0x00006C61, 5907: 0x00006C5B, 5908: 0x00006C4D, 5909: 0x00006C4E, 5910: 0x00007070, 5911: 0x0000725F, 5912: 0x0000725D, 5913: 0x0000767E, 5914: 0x00007AF9, 5915: 0x00007C73, 5916: 0x00007CF8, 5917: 0x00007F36, 5918: 0x00007F8A, 5919: 0x00007FBD, 5920: 0x00008001, 5921: 0x00008003, 5922: 0x0000800C, 5923: 0x00008012, 5924: 0x00008033, 5925: 0x0000807F, 5926: 0x00008089, 5927: 0x0000808B, 5928: 0x0000808C, 5929: 0x000081E3, 5930: 0x000081EA, 5931: 0x000081F3, 5932: 0x000081FC, 5933: 0x0000820C, 5934: 0x0000821B, 5935: 0x0000821F, 5936: 0x0000826E, 5937: 0x00008272, 5938: 0x0000827E, 5939: 0x0000866B, 5940: 0x00008840, 5941: 0x0000884C, 5942: 0x00008863, 5943: 0x0000897F, 5944: 0x00009621, 5945: 0x00004E32, 5946: 0x00004EA8, 5947: 0x00004F4D, 5948: 0x00004F4F, 5949: 0x00004F47, 5950: 0x00004F57, 5951: 0x00004F5E, 5952: 0x00004F34, 5953: 0x00004F5B, 5954: 0x00004F55, 5955: 0x00004F30, 5956: 0x00004F50, 5957: 0x00004F51, 5958: 0x00004F3D, 5959: 0x00004F3A, 5960: 0x00004F38, 5961: 0x00004F43, 5962: 0x00004F54, 5963: 0x00004F3C, 5964: 0x00004F46, 5965: 0x00004F63, 5966: 0x00004F5C, 5967: 0x00004F60, 5968: 0x00004F2F, 5969: 0x00004F4E, 5970: 0x00004F36, 5971: 0x00004F59, 5972: 0x00004F5D, 5973: 0x00004F48, 5974: 0x00004F5A, 5975: 0x0000514C, 5976: 0x0000514B, 5977: 0x0000514D, 5978: 0x00005175, 5979: 0x000051B6, 5980: 0x000051B7, 5981: 0x00005225, 5982: 0x00005224, 5983: 0x00005229, 5984: 0x0000522A, 5985: 0x00005228, 5986: 0x000052AB, 5987: 0x000052A9, 5988: 0x000052AA, 5989: 0x000052AC, 5990: 0x00005323, 5991: 0x00005373, 5992: 0x00005375, 5993: 0x0000541D, 5994: 0x0000542D, 5995: 0x0000541E, 5996: 0x0000543E, 5997: 0x00005426, 5998: 0x0000544E, 5999: 0x00005427, 6000: 0x00005446, 6001: 0x00005443, 6002: 0x00005433, 6003: 0x00005448, 6004: 0x00005442, 6005: 0x0000541B, 6006: 0x00005429, 6007: 0x0000544A, 6008: 0x00005439, 6009: 0x0000543B, 6010: 0x00005438, 6011: 0x0000542E, 6012: 0x00005435, 6013: 0x00005436, 6014: 0x00005420, 6015: 0x0000543C, 6016: 0x00005440, 6017: 0x00005431, 6018: 0x0000542B, 6019: 0x0000541F, 6020: 0x0000542C, 6021: 0x000056EA, 6022: 0x000056F0, 6023: 0x000056E4, 6024: 0x000056EB, 6025: 0x0000574A, 6026: 0x00005751, 6027: 0x00005740, 6028: 0x0000574D, 6029: 0x00005747, 6030: 0x0000574E, 6031: 0x0000573E, 6032: 0x00005750, 6033: 0x0000574F, 6034: 0x0000573B, 6035: 0x000058EF, 6036: 0x0000593E, 6037: 0x0000599D, 6038: 0x00005992, 6039: 0x000059A8, 6040: 0x0000599E, 6041: 0x000059A3, 6042: 0x00005999, 6043: 0x00005996, 6044: 0x0000598D, 6045: 0x000059A4, 6046: 0x00005993, 6047: 0x0000598A, 6048: 0x000059A5, 6049: 0x00005B5D, 6050: 0x00005B5C, 6051: 0x00005B5A, 6052: 0x00005B5B, 6053: 0x00005B8C, 6054: 0x00005B8B, 6055: 0x00005B8F, 6056: 0x00005C2C, 6057: 0x00005C40, 6058: 0x00005C41, 6059: 0x00005C3F, 6060: 0x00005C3E, 6061: 0x00005C90, 6062: 0x00005C91, 6063: 0x00005C94, 6064: 0x00005C8C, 6065: 0x00005DEB, 6066: 0x00005E0C, 6067: 0x00005E8F, 6068: 0x00005E87, 6069: 0x00005E8A, 6070: 0x00005EF7, 6071: 0x00005F04, 6072: 0x00005F1F, 6073: 0x00005F64, 6074: 0x00005F62, 6075: 0x00005F77, 6076: 0x00005F79, 6077: 0x00005FD8, 6078: 0x00005FCC, 6079: 0x00005FD7, 6080: 0x00005FCD, 6081: 0x00005FF1, 6082: 0x00005FEB, 6083: 0x00005FF8, 6084: 0x00005FEA, 6085: 0x00006212, 6086: 0x00006211, 6087: 0x00006284, 6088: 0x00006297, 6089: 0x00006296, 6090: 0x00006280, 6091: 0x00006276, 6092: 0x00006289, 6093: 0x0000626D, 6094: 0x0000628A, 6095: 0x0000627C, 6096: 0x0000627E, 6097: 0x00006279, 6098: 0x00006273, 6099: 0x00006292, 6100: 0x0000626F, 6101: 0x00006298, 6102: 0x0000626E, 6103: 0x00006295, 6104: 0x00006293, 6105: 0x00006291, 6106: 0x00006286, 6107: 0x00006539, 6108: 0x0000653B, 6109: 0x00006538, 6110: 0x000065F1, 6111: 0x000066F4, 6112: 0x0000675F, 6113: 0x0000674E, 6114: 0x0000674F, 6115: 0x00006750, 6116: 0x00006751, 6117: 0x0000675C, 6118: 0x00006756, 6119: 0x0000675E, 6120: 0x00006749, 6121: 0x00006746, 6122: 0x00006760, 6123: 0x00006753, 6124: 0x00006757, 6125: 0x00006B65, 6126: 0x00006BCF, 6127: 0x00006C42, 6128: 0x00006C5E, 6129: 0x00006C99, 6130: 0x00006C81, 6131: 0x00006C88, 6132: 0x00006C89, 6133: 0x00006C85, 6134: 0x00006C9B, 6135: 0x00006C6A, 6136: 0x00006C7A, 6137: 0x00006C90, 6138: 0x00006C70, 6139: 0x00006C8C, 6140: 0x00006C68, 6141: 0x00006C96, 6142: 0x00006C92, 6143: 0x00006C7D, 6144: 0x00006C83, 6145: 0x00006C72, 6146: 0x00006C7E, 6147: 0x00006C74, 6148: 0x00006C86, 6149: 0x00006C76, 6150: 0x00006C8D, 6151: 0x00006C94, 6152: 0x00006C98, 6153: 0x00006C82, 6154: 0x00007076, 6155: 0x0000707C, 6156: 0x0000707D, 6157: 0x00007078, 6158: 0x00007262, 6159: 0x00007261, 6160: 0x00007260, 6161: 0x000072C4, 6162: 0x000072C2, 6163: 0x00007396, 6164: 0x0000752C, 6165: 0x0000752B, 6166: 0x00007537, 6167: 0x00007538, 6168: 0x00007682, 6169: 0x000076EF, 6170: 0x000077E3, 6171: 0x000079C1, 6172: 0x000079C0, 6173: 0x000079BF, 6174: 0x00007A76, 6175: 0x00007CFB, 6176: 0x00007F55, 6177: 0x00008096, 6178: 0x00008093, 6179: 0x0000809D, 6180: 0x00008098, 6181: 0x0000809B, 6182: 0x0000809A, 6183: 0x000080B2, 6184: 0x0000826F, 6185: 0x00008292, 6186: 0x0000828B, 6187: 0x0000828D, 6188: 0x0000898B, 6189: 0x000089D2, 6190: 0x00008A00, 6191: 0x00008C37, 6192: 0x00008C46, 6193: 0x00008C55, 6194: 0x00008C9D, 6195: 0x00008D64, 6196: 0x00008D70, 6197: 0x00008DB3, 6198: 0x00008EAB, 6199: 0x00008ECA, 6200: 0x00008F9B, 6201: 0x00008FB0, 6202: 0x00008FC2, 6203: 0x00008FC6, 6204: 0x00008FC5, 6205: 0x00008FC4, 6206: 0x00005DE1, 6207: 0x00009091, 6208: 0x000090A2, 6209: 0x000090AA, 6210: 0x000090A6, 6211: 0x000090A3, 6212: 0x00009149, 6213: 0x000091C6, 6214: 0x000091CC, 6215: 0x00009632, 6216: 0x0000962E, 6217: 0x00009631, 6218: 0x0000962A, 6219: 0x0000962C, 6220: 0x00004E26, 6221: 0x00004E56, 6222: 0x00004E73, 6223: 0x00004E8B, 6224: 0x00004E9B, 6225: 0x00004E9E, 6226: 0x00004EAB, 6227: 0x00004EAC, 6228: 0x00004F6F, 6229: 0x00004F9D, 6230: 0x00004F8D, 6231: 0x00004F73, 6232: 0x00004F7F, 6233: 0x00004F6C, 6234: 0x00004F9B, 6235: 0x00004F8B, 6236: 0x00004F86, 6237: 0x00004F83, 6238: 0x00004F70, 6239: 0x00004F75, 6240: 0x00004F88, 6241: 0x00004F69, 6242: 0x00004F7B, 6243: 0x00004F96, 6244: 0x00004F7E, 6245: 0x00004F8F, 6246: 0x00004F91, 6247: 0x00004F7A, 6248: 0x00005154, 6249: 0x00005152, 6250: 0x00005155, 6251: 0x00005169, 6252: 0x00005177, 6253: 0x00005176, 6254: 0x00005178, 6255: 0x000051BD, 6256: 0x000051FD, 6257: 0x0000523B, 6258: 0x00005238, 6259: 0x00005237, 6260: 0x0000523A, 6261: 0x00005230, 6262: 0x0000522E, 6263: 0x00005236, 6264: 0x00005241, 6265: 0x000052BE, 6266: 0x000052BB, 6267: 0x00005352, 6268: 0x00005354, 6269: 0x00005353, 6270: 0x00005351, 6271: 0x00005366, 6272: 0x00005377, 6273: 0x00005378, 6274: 0x00005379, 6275: 0x000053D6, 6276: 0x000053D4, 6277: 0x000053D7, 6278: 0x00005473, 6279: 0x00005475, 6280: 0x00005496, 6281: 0x00005478, 6282: 0x00005495, 6283: 0x00005480, 6284: 0x0000547B, 6285: 0x00005477, 6286: 0x00005484, 6287: 0x00005492, 6288: 0x00005486, 6289: 0x0000547C, 6290: 0x00005490, 6291: 0x00005471, 6292: 0x00005476, 6293: 0x0000548C, 6294: 0x0000549A, 6295: 0x00005462, 6296: 0x00005468, 6297: 0x0000548B, 6298: 0x0000547D, 6299: 0x0000548E, 6300: 0x000056FA, 6301: 0x00005783, 6302: 0x00005777, 6303: 0x0000576A, 6304: 0x00005769, 6305: 0x00005761, 6306: 0x00005766, 6307: 0x00005764, 6308: 0x0000577C, 6309: 0x0000591C, 6310: 0x00005949, 6311: 0x00005947, 6312: 0x00005948, 6313: 0x00005944, 6314: 0x00005954, 6315: 0x000059BE, 6316: 0x000059BB, 6317: 0x000059D4, 6318: 0x000059B9, 6319: 0x000059AE, 6320: 0x000059D1, 6321: 0x000059C6, 6322: 0x000059D0, 6323: 0x000059CD, 6324: 0x000059CB, 6325: 0x000059D3, 6326: 0x000059CA, 6327: 0x000059AF, 6328: 0x000059B3, 6329: 0x000059D2, 6330: 0x000059C5, 6331: 0x00005B5F, 6332: 0x00005B64, 6333: 0x00005B63, 6334: 0x00005B97, 6335: 0x00005B9A, 6336: 0x00005B98, 6337: 0x00005B9C, 6338: 0x00005B99, 6339: 0x00005B9B, 6340: 0x00005C1A, 6341: 0x00005C48, 6342: 0x00005C45, 6343: 0x00005C46, 6344: 0x00005CB7, 6345: 0x00005CA1, 6346: 0x00005CB8, 6347: 0x00005CA9, 6348: 0x00005CAB, 6349: 0x00005CB1, 6350: 0x00005CB3, 6351: 0x00005E18, 6352: 0x00005E1A, 6353: 0x00005E16, 6354: 0x00005E15, 6355: 0x00005E1B, 6356: 0x00005E11, 6357: 0x00005E78, 6358: 0x00005E9A, 6359: 0x00005E97, 6360: 0x00005E9C, 6361: 0x00005E95, 6362: 0x00005E96, 6363: 0x00005EF6, 6364: 0x00005F26, 6365: 0x00005F27, 6366: 0x00005F29, 6367: 0x00005F80, 6368: 0x00005F81, 6369: 0x00005F7F, 6370: 0x00005F7C, 6371: 0x00005FDD, 6372: 0x00005FE0, 6373: 0x00005FFD, 6374: 0x00005FF5, 6375: 0x00005FFF, 6376: 0x0000600F, 6377: 0x00006014, 6378: 0x0000602F, 6379: 0x00006035, 6380: 0x00006016, 6381: 0x0000602A, 6382: 0x00006015, 6383: 0x00006021, 6384: 0x00006027, 6385: 0x00006029, 6386: 0x0000602B, 6387: 0x0000601B, 6388: 0x00006216, 6389: 0x00006215, 6390: 0x0000623F, 6391: 0x0000623E, 6392: 0x00006240, 6393: 0x0000627F, 6394: 0x000062C9, 6395: 0x000062CC, 6396: 0x000062C4, 6397: 0x000062BF, 6398: 0x000062C2, 6399: 0x000062B9, 6400: 0x000062D2, 6401: 0x000062DB, 6402: 0x000062AB, 6403: 0x000062D3, 6404: 0x000062D4, 6405: 0x000062CB, 6406: 0x000062C8, 6407: 0x000062A8, 6408: 0x000062BD, 6409: 0x000062BC, 6410: 0x000062D0, 6411: 0x000062D9, 6412: 0x000062C7, 6413: 0x000062CD, 6414: 0x000062B5, 6415: 0x000062DA, 6416: 0x000062B1, 6417: 0x000062D8, 6418: 0x000062D6, 6419: 0x000062D7, 6420: 0x000062C6, 6421: 0x000062AC, 6422: 0x000062CE, 6423: 0x0000653E, 6424: 0x000065A7, 6425: 0x000065BC, 6426: 0x000065FA, 6427: 0x00006614, 6428: 0x00006613, 6429: 0x0000660C, 6430: 0x00006606, 6431: 0x00006602, 6432: 0x0000660E, 6433: 0x00006600, 6434: 0x0000660F, 6435: 0x00006615, 6436: 0x0000660A, 6437: 0x00006607, 6438: 0x0000670D, 6439: 0x0000670B, 6440: 0x0000676D, 6441: 0x0000678B, 6442: 0x00006795, 6443: 0x00006771, 6444: 0x0000679C, 6445: 0x00006773, 6446: 0x00006777, 6447: 0x00006787, 6448: 0x0000679D, 6449: 0x00006797, 6450: 0x0000676F, 6451: 0x00006770, 6452: 0x0000677F, 6453: 0x00006789, 6454: 0x0000677E, 6455: 0x00006790, 6456: 0x00006775, 6457: 0x0000679A, 6458: 0x00006793, 6459: 0x0000677C, 6460: 0x0000676A, 6461: 0x00006772, 6462: 0x00006B23, 6463: 0x00006B66, 6464: 0x00006B67, 6465: 0x00006B7F, 6466: 0x00006C13, 6467: 0x00006C1B, 6468: 0x00006CE3, 6469: 0x00006CE8, 6470: 0x00006CF3, 6471: 0x00006CB1, 6472: 0x00006CCC, 6473: 0x00006CE5, 6474: 0x00006CB3, 6475: 0x00006CBD, 6476: 0x00006CBE, 6477: 0x00006CBC, 6478: 0x00006CE2, 6479: 0x00006CAB, 6480: 0x00006CD5, 6481: 0x00006CD3, 6482: 0x00006CB8, 6483: 0x00006CC4, 6484: 0x00006CB9, 6485: 0x00006CC1, 6486: 0x00006CAE, 6487: 0x00006CD7, 6488: 0x00006CC5, 6489: 0x00006CF1, 6490: 0x00006CBF, 6491: 0x00006CBB, 6492: 0x00006CE1, 6493: 0x00006CDB, 6494: 0x00006CCA, 6495: 0x00006CAC, 6496: 0x00006CEF, 6497: 0x00006CDC, 6498: 0x00006CD6, 6499: 0x00006CE0, 6500: 0x00007095, 6501: 0x0000708E, 6502: 0x00007092, 6503: 0x0000708A, 6504: 0x00007099, 6505: 0x0000722C, 6506: 0x0000722D, 6507: 0x00007238, 6508: 0x00007248, 6509: 0x00007267, 6510: 0x00007269, 6511: 0x000072C0, 6512: 0x000072CE, 6513: 0x000072D9, 6514: 0x000072D7, 6515: 0x000072D0, 6516: 0x000073A9, 6517: 0x000073A8, 6518: 0x0000739F, 6519: 0x000073AB, 6520: 0x000073A5, 6521: 0x0000753D, 6522: 0x0000759D, 6523: 0x00007599, 6524: 0x0000759A, 6525: 0x00007684, 6526: 0x000076C2, 6527: 0x000076F2, 6528: 0x000076F4, 6529: 0x000077E5, 6530: 0x000077FD, 6531: 0x0000793E, 6532: 0x00007940, 6533: 0x00007941, 6534: 0x000079C9, 6535: 0x000079C8, 6536: 0x00007A7A, 6537: 0x00007A79, 6538: 0x00007AFA, 6539: 0x00007CFE, 6540: 0x00007F54, 6541: 0x00007F8C, 6542: 0x00007F8B, 6543: 0x00008005, 6544: 0x000080BA, 6545: 0x000080A5, 6546: 0x000080A2, 6547: 0x000080B1, 6548: 0x000080A1, 6549: 0x000080AB, 6550: 0x000080A9, 6551: 0x000080B4, 6552: 0x000080AA, 6553: 0x000080AF, 6554: 0x000081E5, 6555: 0x000081FE, 6556: 0x0000820D, 6557: 0x000082B3, 6558: 0x0000829D, 6559: 0x00008299, 6560: 0x000082AD, 6561: 0x000082BD, 6562: 0x0000829F, 6563: 0x000082B9, 6564: 0x000082B1, 6565: 0x000082AC, 6566: 0x000082A5, 6567: 0x000082AF, 6568: 0x000082B8, 6569: 0x000082A3, 6570: 0x000082B0, 6571: 0x000082BE, 6572: 0x000082B7, 6573: 0x0000864E, 6574: 0x00008671, 6575: 0x0000521D, 6576: 0x00008868, 6577: 0x00008ECB, 6578: 0x00008FCE, 6579: 0x00008FD4, 6580: 0x00008FD1, 6581: 0x000090B5, 6582: 0x000090B8, 6583: 0x000090B1, 6584: 0x000090B6, 6585: 0x000091C7, 6586: 0x000091D1, 6587: 0x00009577, 6588: 0x00009580, 6589: 0x0000961C, 6590: 0x00009640, 6591: 0x0000963F, 6592: 0x0000963B, 6593: 0x00009644, 6594: 0x00009642, 6595: 0x000096B9, 6596: 0x000096E8, 6597: 0x00009752, 6598: 0x0000975E, 6599: 0x00004E9F, 6600: 0x00004EAD, 6601: 0x00004EAE, 6602: 0x00004FE1, 6603: 0x00004FB5, 6604: 0x00004FAF, 6605: 0x00004FBF, 6606: 0x00004FE0, 6607: 0x00004FD1, 6608: 0x00004FCF, 6609: 0x00004FDD, 6610: 0x00004FC3, 6611: 0x00004FB6, 6612: 0x00004FD8, 6613: 0x00004FDF, 6614: 0x00004FCA, 6615: 0x00004FD7, 6616: 0x00004FAE, 6617: 0x00004FD0, 6618: 0x00004FC4, 6619: 0x00004FC2, 6620: 0x00004FDA, 6621: 0x00004FCE, 6622: 0x00004FDE, 6623: 0x00004FB7, 6624: 0x00005157, 6625: 0x00005192, 6626: 0x00005191, 6627: 0x000051A0, 6628: 0x0000524E, 6629: 0x00005243, 6630: 0x0000524A, 6631: 0x0000524D, 6632: 0x0000524C, 6633: 0x0000524B, 6634: 0x00005247, 6635: 0x000052C7, 6636: 0x000052C9, 6637: 0x000052C3, 6638: 0x000052C1, 6639: 0x0000530D, 6640: 0x00005357, 6641: 0x0000537B, 6642: 0x0000539A, 6643: 0x000053DB, 6644: 0x000054AC, 6645: 0x000054C0, 6646: 0x000054A8, 6647: 0x000054CE, 6648: 0x000054C9, 6649: 0x000054B8, 6650: 0x000054A6, 6651: 0x000054B3, 6652: 0x000054C7, 6653: 0x000054C2, 6654: 0x000054BD, 6655: 0x000054AA, 6656: 0x000054C1, 6657: 0x000054C4, 6658: 0x000054C8, 6659: 0x000054AF, 6660: 0x000054AB, 6661: 0x000054B1, 6662: 0x000054BB, 6663: 0x000054A9, 6664: 0x000054A7, 6665: 0x000054BF, 6666: 0x000056FF, 6667: 0x00005782, 6668: 0x0000578B, 6669: 0x000057A0, 6670: 0x000057A3, 6671: 0x000057A2, 6672: 0x000057CE, 6673: 0x000057AE, 6674: 0x00005793, 6675: 0x00005955, 6676: 0x00005951, 6677: 0x0000594F, 6678: 0x0000594E, 6679: 0x00005950, 6680: 0x000059DC, 6681: 0x000059D8, 6682: 0x000059FF, 6683: 0x000059E3, 6684: 0x000059E8, 6685: 0x00005A03, 6686: 0x000059E5, 6687: 0x000059EA, 6688: 0x000059DA, 6689: 0x000059E6, 6690: 0x00005A01, 6691: 0x000059FB, 6692: 0x00005B69, 6693: 0x00005BA3, 6694: 0x00005BA6, 6695: 0x00005BA4, 6696: 0x00005BA2, 6697: 0x00005BA5, 6698: 0x00005C01, 6699: 0x00005C4E, 6700: 0x00005C4F, 6701: 0x00005C4D, 6702: 0x00005C4B, 6703: 0x00005CD9, 6704: 0x00005CD2, 6705: 0x00005DF7, 6706: 0x00005E1D, 6707: 0x00005E25, 6708: 0x00005E1F, 6709: 0x00005E7D, 6710: 0x00005EA0, 6711: 0x00005EA6, 6712: 0x00005EFA, 6713: 0x00005F08, 6714: 0x00005F2D, 6715: 0x00005F65, 6716: 0x00005F88, 6717: 0x00005F85, 6718: 0x00005F8A, 6719: 0x00005F8B, 6720: 0x00005F87, 6721: 0x00005F8C, 6722: 0x00005F89, 6723: 0x00006012, 6724: 0x0000601D, 6725: 0x00006020, 6726: 0x00006025, 6727: 0x0000600E, 6728: 0x00006028, 6729: 0x0000604D, 6730: 0x00006070, 6731: 0x00006068, 6732: 0x00006062, 6733: 0x00006046, 6734: 0x00006043, 6735: 0x0000606C, 6736: 0x0000606B, 6737: 0x0000606A, 6738: 0x00006064, 6739: 0x00006241, 6740: 0x000062DC, 6741: 0x00006316, 6742: 0x00006309, 6743: 0x000062FC, 6744: 0x000062ED, 6745: 0x00006301, 6746: 0x000062EE, 6747: 0x000062FD, 6748: 0x00006307, 6749: 0x000062F1, 6750: 0x000062F7, 6751: 0x000062EF, 6752: 0x000062EC, 6753: 0x000062FE, 6754: 0x000062F4, 6755: 0x00006311, 6756: 0x00006302, 6757: 0x0000653F, 6758: 0x00006545, 6759: 0x000065AB, 6760: 0x000065BD, 6761: 0x000065E2, 6762: 0x00006625, 6763: 0x0000662D, 6764: 0x00006620, 6765: 0x00006627, 6766: 0x0000662F, 6767: 0x0000661F, 6768: 0x00006628, 6769: 0x00006631, 6770: 0x00006624, 6771: 0x000066F7, 6772: 0x000067FF, 6773: 0x000067D3, 6774: 0x000067F1, 6775: 0x000067D4, 6776: 0x000067D0, 6777: 0x000067EC, 6778: 0x000067B6, 6779: 0x000067AF, 6780: 0x000067F5, 6781: 0x000067E9, 6782: 0x000067EF, 6783: 0x000067C4, 6784: 0x000067D1, 6785: 0x000067B4, 6786: 0x000067DA, 6787: 0x000067E5, 6788: 0x000067B8, 6789: 0x000067CF, 6790: 0x000067DE, 6791: 0x000067F3, 6792: 0x000067B0, 6793: 0x000067D9, 6794: 0x000067E2, 6795: 0x000067DD, 6796: 0x000067D2, 6797: 0x00006B6A, 6798: 0x00006B83, 6799: 0x00006B86, 6800: 0x00006BB5, 6801: 0x00006BD2, 6802: 0x00006BD7, 6803: 0x00006C1F, 6804: 0x00006CC9, 6805: 0x00006D0B, 6806: 0x00006D32, 6807: 0x00006D2A, 6808: 0x00006D41, 6809: 0x00006D25, 6810: 0x00006D0C, 6811: 0x00006D31, 6812: 0x00006D1E, 6813: 0x00006D17, 6814: 0x00006D3B, 6815: 0x00006D3D, 6816: 0x00006D3E, 6817: 0x00006D36, 6818: 0x00006D1B, 6819: 0x00006CF5, 6820: 0x00006D39, 6821: 0x00006D27, 6822: 0x00006D38, 6823: 0x00006D29, 6824: 0x00006D2E, 6825: 0x00006D35, 6826: 0x00006D0E, 6827: 0x00006D2B, 6828: 0x000070AB, 6829: 0x000070BA, 6830: 0x000070B3, 6831: 0x000070AC, 6832: 0x000070AF, 6833: 0x000070AD, 6834: 0x000070B8, 6835: 0x000070AE, 6836: 0x000070A4, 6837: 0x00007230, 6838: 0x00007272, 6839: 0x0000726F, 6840: 0x00007274, 6841: 0x000072E9, 6842: 0x000072E0, 6843: 0x000072E1, 6844: 0x000073B7, 6845: 0x000073CA, 6846: 0x000073BB, 6847: 0x000073B2, 6848: 0x000073CD, 6849: 0x000073C0, 6850: 0x000073B3, 6851: 0x0000751A, 6852: 0x0000752D, 6853: 0x0000754F, 6854: 0x0000754C, 6855: 0x0000754E, 6856: 0x0000754B, 6857: 0x000075AB, 6858: 0x000075A4, 6859: 0x000075A5, 6860: 0x000075A2, 6861: 0x000075A3, 6862: 0x00007678, 6863: 0x00007686, 6864: 0x00007687, 6865: 0x00007688, 6866: 0x000076C8, 6867: 0x000076C6, 6868: 0x000076C3, 6869: 0x000076C5, 6870: 0x00007701, 6871: 0x000076F9, 6872: 0x000076F8, 6873: 0x00007709, 6874: 0x0000770B, 6875: 0x000076FE, 6876: 0x000076FC, 6877: 0x00007707, 6878: 0x000077DC, 6879: 0x00007802, 6880: 0x00007814, 6881: 0x0000780C, 6882: 0x0000780D, 6883: 0x00007946, 6884: 0x00007949, 6885: 0x00007948, 6886: 0x00007947, 6887: 0x000079B9, 6888: 0x000079BA, 6889: 0x000079D1, 6890: 0x000079D2, 6891: 0x000079CB, 6892: 0x00007A7F, 6893: 0x00007A81, 6894: 0x00007AFF, 6895: 0x00007AFD, 6896: 0x00007C7D, 6897: 0x00007D02, 6898: 0x00007D05, 6899: 0x00007D00, 6900: 0x00007D09, 6901: 0x00007D07, 6902: 0x00007D04, 6903: 0x00007D06, 6904: 0x00007F38, 6905: 0x00007F8E, 6906: 0x00007FBF, 6907: 0x00008004, 6908: 0x00008010, 6909: 0x0000800D, 6910: 0x00008011, 6911: 0x00008036, 6912: 0x000080D6, 6913: 0x000080E5, 6914: 0x000080DA, 6915: 0x000080C3, 6916: 0x000080C4, 6917: 0x000080CC, 6918: 0x000080E1, 6919: 0x000080DB, 6920: 0x000080CE, 6921: 0x000080DE, 6922: 0x000080E4, 6923: 0x000080DD, 6924: 0x000081F4, 6925: 0x00008222, 6926: 0x000082E7, 6927: 0x00008303, 6928: 0x00008305, 6929: 0x000082E3, 6930: 0x000082DB, 6931: 0x000082E6, 6932: 0x00008304, 6933: 0x000082E5, 6934: 0x00008302, 6935: 0x00008309, 6936: 0x000082D2, 6937: 0x000082D7, 6938: 0x000082F1, 6939: 0x00008301, 6940: 0x000082DC, 6941: 0x000082D4, 6942: 0x000082D1, 6943: 0x000082DE, 6944: 0x000082D3, 6945: 0x000082DF, 6946: 0x000082EF, 6947: 0x00008306, 6948: 0x00008650, 6949: 0x00008679, 6950: 0x0000867B, 6951: 0x0000867A, 6952: 0x0000884D, 6953: 0x0000886B, 6954: 0x00008981, 6955: 0x000089D4, 6956: 0x00008A08, 6957: 0x00008A02, 6958: 0x00008A03, 6959: 0x00008C9E, 6960: 0x00008CA0, 6961: 0x00008D74, 6962: 0x00008D73, 6963: 0x00008DB4, 6964: 0x00008ECD, 6965: 0x00008ECC, 6966: 0x00008FF0, 6967: 0x00008FE6, 6968: 0x00008FE2, 6969: 0x00008FEA, 6970: 0x00008FE5, 6971: 0x00008FED, 6972: 0x00008FEB, 6973: 0x00008FE4, 6974: 0x00008FE8, 6975: 0x000090CA, 6976: 0x000090CE, 6977: 0x000090C1, 6978: 0x000090C3, 6979: 0x0000914B, 6980: 0x0000914A, 6981: 0x000091CD, 6982: 0x00009582, 6983: 0x00009650, 6984: 0x0000964B, 6985: 0x0000964C, 6986: 0x0000964D, 6987: 0x00009762, 6988: 0x00009769, 6989: 0x000097CB, 6990: 0x000097ED, 6991: 0x000097F3, 6992: 0x00009801, 6993: 0x000098A8, 6994: 0x000098DB, 6995: 0x000098DF, 6996: 0x00009996, 6997: 0x00009999, 6998: 0x00004E58, 6999: 0x00004EB3, 7000: 0x0000500C, 7001: 0x0000500D, 7002: 0x00005023, 7003: 0x00004FEF, 7004: 0x00005026, 7005: 0x00005025, 7006: 0x00004FF8, 7007: 0x00005029, 7008: 0x00005016, 7009: 0x00005006, 7010: 0x0000503C, 7011: 0x0000501F, 7012: 0x0000501A, 7013: 0x00005012, 7014: 0x00005011, 7015: 0x00004FFA, 7016: 0x00005000, 7017: 0x00005014, 7018: 0x00005028, 7019: 0x00004FF1, 7020: 0x00005021, 7021: 0x0000500B, 7022: 0x00005019, 7023: 0x00005018, 7024: 0x00004FF3, 7025: 0x00004FEE, 7026: 0x0000502D, 7027: 0x0000502A, 7028: 0x00004FFE, 7029: 0x0000502B, 7030: 0x00005009, 7031: 0x0000517C, 7032: 0x000051A4, 7033: 0x000051A5, 7034: 0x000051A2, 7035: 0x000051CD, 7036: 0x000051CC, 7037: 0x000051C6, 7038: 0x000051CB, 7039: 0x00005256, 7040: 0x0000525C, 7041: 0x00005254, 7042: 0x0000525B, 7043: 0x0000525D, 7044: 0x0000532A, 7045: 0x0000537F, 7046: 0x0000539F, 7047: 0x0000539D, 7048: 0x000053DF, 7049: 0x000054E8, 7050: 0x00005510, 7051: 0x00005501, 7052: 0x00005537, 7053: 0x000054FC, 7054: 0x000054E5, 7055: 0x000054F2, 7056: 0x00005506, 7057: 0x000054FA, 7058: 0x00005514, 7059: 0x000054E9, 7060: 0x000054ED, 7061: 0x000054E1, 7062: 0x00005509, 7063: 0x000054EE, 7064: 0x000054EA, 7065: 0x000054E6, 7066: 0x00005527, 7067: 0x00005507, 7068: 0x000054FD, 7069: 0x0000550F, 7070: 0x00005703, 7071: 0x00005704, 7072: 0x000057C2, 7073: 0x000057D4, 7074: 0x000057CB, 7075: 0x000057C3, 7076: 0x00005809, 7077: 0x0000590F, 7078: 0x00005957, 7079: 0x00005958, 7080: 0x0000595A, 7081: 0x00005A11, 7082: 0x00005A18, 7083: 0x00005A1C, 7084: 0x00005A1F, 7085: 0x00005A1B, 7086: 0x00005A13, 7087: 0x000059EC, 7088: 0x00005A20, 7089: 0x00005A23, 7090: 0x00005A29, 7091: 0x00005A25, 7092: 0x00005A0C, 7093: 0x00005A09, 7094: 0x00005B6B, 7095: 0x00005C58, 7096: 0x00005BB0, 7097: 0x00005BB3, 7098: 0x00005BB6, 7099: 0x00005BB4, 7100: 0x00005BAE, 7101: 0x00005BB5, 7102: 0x00005BB9, 7103: 0x00005BB8, 7104: 0x00005C04, 7105: 0x00005C51, 7106: 0x00005C55, 7107: 0x00005C50, 7108: 0x00005CED, 7109: 0x00005CFD, 7110: 0x00005CFB, 7111: 0x00005CEA, 7112: 0x00005CE8, 7113: 0x00005CF0, 7114: 0x00005CF6, 7115: 0x00005D01, 7116: 0x00005CF4, 7117: 0x00005DEE, 7118: 0x00005E2D, 7119: 0x00005E2B, 7120: 0x00005EAB, 7121: 0x00005EAD, 7122: 0x00005EA7, 7123: 0x00005F31, 7124: 0x00005F92, 7125: 0x00005F91, 7126: 0x00005F90, 7127: 0x00006059, 7128: 0x00006063, 7129: 0x00006065, 7130: 0x00006050, 7131: 0x00006055, 7132: 0x0000606D, 7133: 0x00006069, 7134: 0x0000606F, 7135: 0x00006084, 7136: 0x0000609F, 7137: 0x0000609A, 7138: 0x0000608D, 7139: 0x00006094, 7140: 0x0000608C, 7141: 0x00006085, 7142: 0x00006096, 7143: 0x00006247, 7144: 0x000062F3, 7145: 0x00006308, 7146: 0x000062FF, 7147: 0x0000634E, 7148: 0x0000633E, 7149: 0x0000632F, 7150: 0x00006355, 7151: 0x00006342, 7152: 0x00006346, 7153: 0x0000634F, 7154: 0x00006349, 7155: 0x0000633A, 7156: 0x00006350, 7157: 0x0000633D, 7158: 0x0000632A, 7159: 0x0000632B, 7160: 0x00006328, 7161: 0x0000634D, 7162: 0x0000634C, 7163: 0x00006548, 7164: 0x00006549, 7165: 0x00006599, 7166: 0x000065C1, 7167: 0x000065C5, 7168: 0x00006642, 7169: 0x00006649, 7170: 0x0000664F, 7171: 0x00006643, 7172: 0x00006652, 7173: 0x0000664C, 7174: 0x00006645, 7175: 0x00006641, 7176: 0x000066F8, 7177: 0x00006714, 7178: 0x00006715, 7179: 0x00006717, 7180: 0x00006821, 7181: 0x00006838, 7182: 0x00006848, 7183: 0x00006846, 7184: 0x00006853, 7185: 0x00006839, 7186: 0x00006842, 7187: 0x00006854, 7188: 0x00006829, 7189: 0x000068B3, 7190: 0x00006817, 7191: 0x0000684C, 7192: 0x00006851, 7193: 0x0000683D, 7194: 0x000067F4, 7195: 0x00006850, 7196: 0x00006840, 7197: 0x0000683C, 7198: 0x00006843, 7199: 0x0000682A, 7200: 0x00006845, 7201: 0x00006813, 7202: 0x00006818, 7203: 0x00006841, 7204: 0x00006B8A, 7205: 0x00006B89, 7206: 0x00006BB7, 7207: 0x00006C23, 7208: 0x00006C27, 7209: 0x00006C28, 7210: 0x00006C26, 7211: 0x00006C24, 7212: 0x00006CF0, 7213: 0x00006D6A, 7214: 0x00006D95, 7215: 0x00006D88, 7216: 0x00006D87, 7217: 0x00006D66, 7218: 0x00006D78, 7219: 0x00006D77, 7220: 0x00006D59, 7221: 0x00006D93, 7222: 0x00006D6C, 7223: 0x00006D89, 7224: 0x00006D6E, 7225: 0x00006D5A, 7226: 0x00006D74, 7227: 0x00006D69, 7228: 0x00006D8C, 7229: 0x00006D8A, 7230: 0x00006D79, 7231: 0x00006D85, 7232: 0x00006D65, 7233: 0x00006D94, 7234: 0x000070CA, 7235: 0x000070D8, 7236: 0x000070E4, 7237: 0x000070D9, 7238: 0x000070C8, 7239: 0x000070CF, 7240: 0x00007239, 7241: 0x00007279, 7242: 0x000072FC, 7243: 0x000072F9, 7244: 0x000072FD, 7245: 0x000072F8, 7246: 0x000072F7, 7247: 0x00007386, 7248: 0x000073ED, 7249: 0x00007409, 7250: 0x000073EE, 7251: 0x000073E0, 7252: 0x000073EA, 7253: 0x000073DE, 7254: 0x00007554, 7255: 0x0000755D, 7256: 0x0000755C, 7257: 0x0000755A, 7258: 0x00007559, 7259: 0x000075BE, 7260: 0x000075C5, 7261: 0x000075C7, 7262: 0x000075B2, 7263: 0x000075B3, 7264: 0x000075BD, 7265: 0x000075BC, 7266: 0x000075B9, 7267: 0x000075C2, 7268: 0x000075B8, 7269: 0x0000768B, 7270: 0x000076B0, 7271: 0x000076CA, 7272: 0x000076CD, 7273: 0x000076CE, 7274: 0x00007729, 7275: 0x0000771F, 7276: 0x00007720, 7277: 0x00007728, 7278: 0x000077E9, 7279: 0x00007830, 7280: 0x00007827, 7281: 0x00007838, 7282: 0x0000781D, 7283: 0x00007834, 7284: 0x00007837, 7285: 0x00007825, 7286: 0x0000782D, 7287: 0x00007820, 7288: 0x0000781F, 7289: 0x00007832, 7290: 0x00007955, 7291: 0x00007950, 7292: 0x00007960, 7293: 0x0000795F, 7294: 0x00007956, 7295: 0x0000795E, 7296: 0x0000795D, 7297: 0x00007957, 7298: 0x0000795A, 7299: 0x000079E4, 7300: 0x000079E3, 7301: 0x000079E7, 7302: 0x000079DF, 7303: 0x000079E6, 7304: 0x000079E9, 7305: 0x000079D8, 7306: 0x00007A84, 7307: 0x00007A88, 7308: 0x00007AD9, 7309: 0x00007B06, 7310: 0x00007B11, 7311: 0x00007C89, 7312: 0x00007D21, 7313: 0x00007D17, 7314: 0x00007D0B, 7315: 0x00007D0A, 7316: 0x00007D20, 7317: 0x00007D22, 7318: 0x00007D14, 7319: 0x00007D10, 7320: 0x00007D15, 7321: 0x00007D1A, 7322: 0x00007D1C, 7323: 0x00007D0D, 7324: 0x00007D19, 7325: 0x00007D1B, 7326: 0x00007F3A, 7327: 0x00007F5F, 7328: 0x00007F94, 7329: 0x00007FC5, 7330: 0x00007FC1, 7331: 0x00008006, 7332: 0x00008018, 7333: 0x00008015, 7334: 0x00008019, 7335: 0x00008017, 7336: 0x0000803D, 7337: 0x0000803F, 7338: 0x000080F1, 7339: 0x00008102, 7340: 0x000080F0, 7341: 0x00008105, 7342: 0x000080ED, 7343: 0x000080F4, 7344: 0x00008106, 7345: 0x000080F8, 7346: 0x000080F3, 7347: 0x00008108, 7348: 0x000080FD, 7349: 0x0000810A, 7350: 0x000080FC, 7351: 0x000080EF, 7352: 0x000081ED, 7353: 0x000081EC, 7354: 0x00008200, 7355: 0x00008210, 7356: 0x0000822A, 7357: 0x0000822B, 7358: 0x00008228, 7359: 0x0000822C, 7360: 0x000082BB, 7361: 0x0000832B, 7362: 0x00008352, 7363: 0x00008354, 7364: 0x0000834A, 7365: 0x00008338, 7366: 0x00008350, 7367: 0x00008349, 7368: 0x00008335, 7369: 0x00008334, 7370: 0x0000834F, 7371: 0x00008332, 7372: 0x00008339, 7373: 0x00008336, 7374: 0x00008317, 7375: 0x00008340, 7376: 0x00008331, 7377: 0x00008328, 7378: 0x00008343, 7379: 0x00008654, 7380: 0x0000868A, 7381: 0x000086AA, 7382: 0x00008693, 7383: 0x000086A4, 7384: 0x000086A9, 7385: 0x0000868C, 7386: 0x000086A3, 7387: 0x0000869C, 7388: 0x00008870, 7389: 0x00008877, 7390: 0x00008881, 7391: 0x00008882, 7392: 0x0000887D, 7393: 0x00008879, 7394: 0x00008A18, 7395: 0x00008A10, 7396: 0x00008A0E, 7397: 0x00008A0C, 7398: 0x00008A15, 7399: 0x00008A0A, 7400: 0x00008A17, 7401: 0x00008A13, 7402: 0x00008A16, 7403: 0x00008A0F, 7404: 0x00008A11, 7405: 0x00008C48, 7406: 0x00008C7A, 7407: 0x00008C79, 7408: 0x00008CA1, 7409: 0x00008CA2, 7410: 0x00008D77, 7411: 0x00008EAC, 7412: 0x00008ED2, 7413: 0x00008ED4, 7414: 0x00008ECF, 7415: 0x00008FB1, 7416: 0x00009001, 7417: 0x00009006, 7418: 0x00008FF7, 7419: 0x00009000, 7420: 0x00008FFA, 7421: 0x00008FF4, 7422: 0x00009003, 7423: 0x00008FFD, 7424: 0x00009005, 7425: 0x00008FF8, 7426: 0x00009095, 7427: 0x000090E1, 7428: 0x000090DD, 7429: 0x000090E2, 7430: 0x00009152, 7431: 0x0000914D, 7432: 0x0000914C, 7433: 0x000091D8, 7434: 0x000091DD, 7435: 0x000091D7, 7436: 0x000091DC, 7437: 0x000091D9, 7438: 0x00009583, 7439: 0x00009662, 7440: 0x00009663, 7441: 0x00009661, 7442: 0x0000965B, 7443: 0x0000965D, 7444: 0x00009664, 7445: 0x00009658, 7446: 0x0000965E, 7447: 0x000096BB, 7448: 0x000098E2, 7449: 0x000099AC, 7450: 0x00009AA8, 7451: 0x00009AD8, 7452: 0x00009B25, 7453: 0x00009B32, 7454: 0x00009B3C, 7455: 0x00004E7E, 7456: 0x0000507A, 7457: 0x0000507D, 7458: 0x0000505C, 7459: 0x00005047, 7460: 0x00005043, 7461: 0x0000504C, 7462: 0x0000505A, 7463: 0x00005049, 7464: 0x00005065, 7465: 0x00005076, 7466: 0x0000504E, 7467: 0x00005055, 7468: 0x00005075, 7469: 0x00005074, 7470: 0x00005077, 7471: 0x0000504F, 7472: 0x0000500F, 7473: 0x0000506F, 7474: 0x0000506D, 7475: 0x0000515C, 7476: 0x00005195, 7477: 0x000051F0, 7478: 0x0000526A, 7479: 0x0000526F, 7480: 0x000052D2, 7481: 0x000052D9, 7482: 0x000052D8, 7483: 0x000052D5, 7484: 0x00005310, 7485: 0x0000530F, 7486: 0x00005319, 7487: 0x0000533F, 7488: 0x00005340, 7489: 0x0000533E, 7490: 0x000053C3, 7491: 0x000066FC, 7492: 0x00005546, 7493: 0x0000556A, 7494: 0x00005566, 7495: 0x00005544, 7496: 0x0000555E, 7497: 0x00005561, 7498: 0x00005543, 7499: 0x0000554A, 7500: 0x00005531, 7501: 0x00005556, 7502: 0x0000554F, 7503: 0x00005555, 7504: 0x0000552F, 7505: 0x00005564, 7506: 0x00005538, 7507: 0x0000552E, 7508: 0x0000555C, 7509: 0x0000552C, 7510: 0x00005563, 7511: 0x00005533, 7512: 0x00005541, 7513: 0x00005557, 7514: 0x00005708, 7515: 0x0000570B, 7516: 0x00005709, 7517: 0x000057DF, 7518: 0x00005805, 7519: 0x0000580A, 7520: 0x00005806, 7521: 0x000057E0, 7522: 0x000057E4, 7523: 0x000057FA, 7524: 0x00005802, 7525: 0x00005835, 7526: 0x000057F7, 7527: 0x000057F9, 7528: 0x00005920, 7529: 0x00005962, 7530: 0x00005A36, 7531: 0x00005A41, 7532: 0x00005A49, 7533: 0x00005A66, 7534: 0x00005A6A, 7535: 0x00005A40, 7536: 0x00005A3C, 7537: 0x00005A62, 7538: 0x00005A5A, 7539: 0x00005A46, 7540: 0x00005A4A, 7541: 0x00005B70, 7542: 0x00005BC7, 7543: 0x00005BC5, 7544: 0x00005BC4, 7545: 0x00005BC2, 7546: 0x00005BBF, 7547: 0x00005BC6, 7548: 0x00005C09, 7549: 0x00005C08, 7550: 0x00005C07, 7551: 0x00005C60, 7552: 0x00005C5C, 7553: 0x00005C5D, 7554: 0x00005D07, 7555: 0x00005D06, 7556: 0x00005D0E, 7557: 0x00005D1B, 7558: 0x00005D16, 7559: 0x00005D22, 7560: 0x00005D11, 7561: 0x00005D29, 7562: 0x00005D14, 7563: 0x00005D19, 7564: 0x00005D24, 7565: 0x00005D27, 7566: 0x00005D17, 7567: 0x00005DE2, 7568: 0x00005E38, 7569: 0x00005E36, 7570: 0x00005E33, 7571: 0x00005E37, 7572: 0x00005EB7, 7573: 0x00005EB8, 7574: 0x00005EB6, 7575: 0x00005EB5, 7576: 0x00005EBE, 7577: 0x00005F35, 7578: 0x00005F37, 7579: 0x00005F57, 7580: 0x00005F6C, 7581: 0x00005F69, 7582: 0x00005F6B, 7583: 0x00005F97, 7584: 0x00005F99, 7585: 0x00005F9E, 7586: 0x00005F98, 7587: 0x00005FA1, 7588: 0x00005FA0, 7589: 0x00005F9C, 7590: 0x0000607F, 7591: 0x000060A3, 7592: 0x00006089, 7593: 0x000060A0, 7594: 0x000060A8, 7595: 0x000060CB, 7596: 0x000060B4, 7597: 0x000060E6, 7598: 0x000060BD, 7599: 0x000060C5, 7600: 0x000060BB, 7601: 0x000060B5, 7602: 0x000060DC, 7603: 0x000060BC, 7604: 0x000060D8, 7605: 0x000060D5, 7606: 0x000060C6, 7607: 0x000060DF, 7608: 0x000060B8, 7609: 0x000060DA, 7610: 0x000060C7, 7611: 0x0000621A, 7612: 0x0000621B, 7613: 0x00006248, 7614: 0x000063A0, 7615: 0x000063A7, 7616: 0x00006372, 7617: 0x00006396, 7618: 0x000063A2, 7619: 0x000063A5, 7620: 0x00006377, 7621: 0x00006367, 7622: 0x00006398, 7623: 0x000063AA, 7624: 0x00006371, 7625: 0x000063A9, 7626: 0x00006389, 7627: 0x00006383, 7628: 0x0000639B, 7629: 0x0000636B, 7630: 0x000063A8, 7631: 0x00006384, 7632: 0x00006388, 7633: 0x00006399, 7634: 0x000063A1, 7635: 0x000063AC, 7636: 0x00006392, 7637: 0x0000638F, 7638: 0x00006380, 7639: 0x0000637B, 7640: 0x00006369, 7641: 0x00006368, 7642: 0x0000637A, 7643: 0x0000655D, 7644: 0x00006556, 7645: 0x00006551, 7646: 0x00006559, 7647: 0x00006557, 7648: 0x0000555F, 7649: 0x0000654F, 7650: 0x00006558, 7651: 0x00006555, 7652: 0x00006554, 7653: 0x0000659C, 7654: 0x0000659B, 7655: 0x000065AC, 7656: 0x000065CF, 7657: 0x000065CB, 7658: 0x000065CC, 7659: 0x000065CE, 7660: 0x0000665D, 7661: 0x0000665A, 7662: 0x00006664, 7663: 0x00006668, 7664: 0x00006666, 7665: 0x0000665E, 7666: 0x000066F9, 7667: 0x000052D7, 7668: 0x0000671B, 7669: 0x00006881, 7670: 0x000068AF, 7671: 0x000068A2, 7672: 0x00006893, 7673: 0x000068B5, 7674: 0x0000687F, 7675: 0x00006876, 7676: 0x000068B1, 7677: 0x000068A7, 7678: 0x00006897, 7679: 0x000068B0, 7680: 0x00006883, 7681: 0x000068C4, 7682: 0x000068AD, 7683: 0x00006886, 7684: 0x00006885, 7685: 0x00006894, 7686: 0x0000689D, 7687: 0x000068A8, 7688: 0x0000689F, 7689: 0x000068A1, 7690: 0x00006882, 7691: 0x00006B32, 7692: 0x00006BBA, 7693: 0x00006BEB, 7694: 0x00006BEC, 7695: 0x00006C2B, 7696: 0x00006D8E, 7697: 0x00006DBC, 7698: 0x00006DF3, 7699: 0x00006DD9, 7700: 0x00006DB2, 7701: 0x00006DE1, 7702: 0x00006DCC, 7703: 0x00006DE4, 7704: 0x00006DFB, 7705: 0x00006DFA, 7706: 0x00006E05, 7707: 0x00006DC7, 7708: 0x00006DCB, 7709: 0x00006DAF, 7710: 0x00006DD1, 7711: 0x00006DAE, 7712: 0x00006DDE, 7713: 0x00006DF9, 7714: 0x00006DB8, 7715: 0x00006DF7, 7716: 0x00006DF5, 7717: 0x00006DC5, 7718: 0x00006DD2, 7719: 0x00006E1A, 7720: 0x00006DB5, 7721: 0x00006DDA, 7722: 0x00006DEB, 7723: 0x00006DD8, 7724: 0x00006DEA, 7725: 0x00006DF1, 7726: 0x00006DEE, 7727: 0x00006DE8, 7728: 0x00006DC6, 7729: 0x00006DC4, 7730: 0x00006DAA, 7731: 0x00006DEC, 7732: 0x00006DBF, 7733: 0x00006DE6, 7734: 0x000070F9, 7735: 0x00007109, 7736: 0x0000710A, 7737: 0x000070FD, 7738: 0x000070EF, 7739: 0x0000723D, 7740: 0x0000727D, 7741: 0x00007281, 7742: 0x0000731C, 7743: 0x0000731B, 7744: 0x00007316, 7745: 0x00007313, 7746: 0x00007319, 7747: 0x00007387, 7748: 0x00007405, 7749: 0x0000740A, 7750: 0x00007403, 7751: 0x00007406, 7752: 0x000073FE, 7753: 0x0000740D, 7754: 0x000074E0, 7755: 0x000074F6, 7756: 0x000074F7, 7757: 0x0000751C, 7758: 0x00007522, 7759: 0x00007565, 7760: 0x00007566, 7761: 0x00007562, 7762: 0x00007570, 7763: 0x0000758F, 7764: 0x000075D4, 7765: 0x000075D5, 7766: 0x000075B5, 7767: 0x000075CA, 7768: 0x000075CD, 7769: 0x0000768E, 7770: 0x000076D4, 7771: 0x000076D2, 7772: 0x000076DB, 7773: 0x00007737, 7774: 0x0000773E, 7775: 0x0000773C, 7776: 0x00007736, 7777: 0x00007738, 7778: 0x0000773A, 7779: 0x0000786B, 7780: 0x00007843, 7781: 0x0000784E, 7782: 0x00007965, 7783: 0x00007968, 7784: 0x0000796D, 7785: 0x000079FB, 7786: 0x00007A92, 7787: 0x00007A95, 7788: 0x00007B20, 7789: 0x00007B28, 7790: 0x00007B1B, 7791: 0x00007B2C, 7792: 0x00007B26, 7793: 0x00007B19, 7794: 0x00007B1E, 7795: 0x00007B2E, 7796: 0x00007C92, 7797: 0x00007C97, 7798: 0x00007C95, 7799: 0x00007D46, 7800: 0x00007D43, 7801: 0x00007D71, 7802: 0x00007D2E, 7803: 0x00007D39, 7804: 0x00007D3C, 7805: 0x00007D40, 7806: 0x00007D30, 7807: 0x00007D33, 7808: 0x00007D44, 7809: 0x00007D2F, 7810: 0x00007D42, 7811: 0x00007D32, 7812: 0x00007D31, 7813: 0x00007F3D, 7814: 0x00007F9E, 7815: 0x00007F9A, 7816: 0x00007FCC, 7817: 0x00007FCE, 7818: 0x00007FD2, 7819: 0x0000801C, 7820: 0x0000804A, 7821: 0x00008046, 7822: 0x0000812F, 7823: 0x00008116, 7824: 0x00008123, 7825: 0x0000812B, 7826: 0x00008129, 7827: 0x00008130, 7828: 0x00008124, 7829: 0x00008202, 7830: 0x00008235, 7831: 0x00008237, 7832: 0x00008236, 7833: 0x00008239, 7834: 0x0000838E, 7835: 0x0000839E, 7836: 0x00008398, 7837: 0x00008378, 7838: 0x000083A2, 7839: 0x00008396, 7840: 0x000083BD, 7841: 0x000083AB, 7842: 0x00008392, 7843: 0x0000838A, 7844: 0x00008393, 7845: 0x00008389, 7846: 0x000083A0, 7847: 0x00008377, 7848: 0x0000837B, 7849: 0x0000837C, 7850: 0x00008386, 7851: 0x000083A7, 7852: 0x00008655, 7853: 0x00005F6A, 7854: 0x000086C7, 7855: 0x000086C0, 7856: 0x000086B6, 7857: 0x000086C4, 7858: 0x000086B5, 7859: 0x000086C6, 7860: 0x000086CB, 7861: 0x000086B1, 7862: 0x000086AF, 7863: 0x000086C9, 7864: 0x00008853, 7865: 0x0000889E, 7866: 0x00008888, 7867: 0x000088AB, 7868: 0x00008892, 7869: 0x00008896, 7870: 0x0000888D, 7871: 0x0000888B, 7872: 0x00008993, 7873: 0x0000898F, 7874: 0x00008A2A, 7875: 0x00008A1D, 7876: 0x00008A23, 7877: 0x00008A25, 7878: 0x00008A31, 7879: 0x00008A2D, 7880: 0x00008A1F, 7881: 0x00008A1B, 7882: 0x00008A22, 7883: 0x00008C49, 7884: 0x00008C5A, 7885: 0x00008CA9, 7886: 0x00008CAC, 7887: 0x00008CAB, 7888: 0x00008CA8, 7889: 0x00008CAA, 7890: 0x00008CA7, 7891: 0x00008D67, 7892: 0x00008D66, 7893: 0x00008DBE, 7894: 0x00008DBA, 7895: 0x00008EDB, 7896: 0x00008EDF, 7897: 0x00009019, 7898: 0x0000900D, 7899: 0x0000901A, 7900: 0x00009017, 7901: 0x00009023, 7902: 0x0000901F, 7903: 0x0000901D, 7904: 0x00009010, 7905: 0x00009015, 7906: 0x0000901E, 7907: 0x00009020, 7908: 0x0000900F, 7909: 0x00009022, 7910: 0x00009016, 7911: 0x0000901B, 7912: 0x00009014, 7913: 0x000090E8, 7914: 0x000090ED, 7915: 0x000090FD, 7916: 0x00009157, 7917: 0x000091CE, 7918: 0x000091F5, 7919: 0x000091E6, 7920: 0x000091E3, 7921: 0x000091E7, 7922: 0x000091ED, 7923: 0x000091E9, 7924: 0x00009589, 7925: 0x0000966A, 7926: 0x00009675, 7927: 0x00009673, 7928: 0x00009678, 7929: 0x00009670, 7930: 0x00009674, 7931: 0x00009676, 7932: 0x00009677, 7933: 0x0000966C, 7934: 0x000096C0, 7935: 0x000096EA, 7936: 0x000096E9, 7937: 0x00007AE0, 7938: 0x00007ADF, 7939: 0x00009802, 7940: 0x00009803, 7941: 0x00009B5A, 7942: 0x00009CE5, 7943: 0x00009E75, 7944: 0x00009E7F, 7945: 0x00009EA5, 7946: 0x00009EBB, 7947: 0x000050A2, 7948: 0x0000508D, 7949: 0x00005085, 7950: 0x00005099, 7951: 0x00005091, 7952: 0x00005080, 7953: 0x00005096, 7954: 0x00005098, 7955: 0x0000509A, 7956: 0x00006700, 7957: 0x000051F1, 7958: 0x00005272, 7959: 0x00005274, 7960: 0x00005275, 7961: 0x00005269, 7962: 0x000052DE, 7963: 0x000052DD, 7964: 0x000052DB, 7965: 0x0000535A, 7966: 0x000053A5, 7967: 0x0000557B, 7968: 0x00005580, 7969: 0x000055A7, 7970: 0x0000557C, 7971: 0x0000558A, 7972: 0x0000559D, 7973: 0x00005598, 7974: 0x00005582, 7975: 0x0000559C, 7976: 0x000055AA, 7977: 0x00005594, 7978: 0x00005587, 7979: 0x0000558B, 7980: 0x00005583, 7981: 0x000055B3, 7982: 0x000055AE, 7983: 0x0000559F, 7984: 0x0000553E, 7985: 0x000055B2, 7986: 0x0000559A, 7987: 0x000055BB, 7988: 0x000055AC, 7989: 0x000055B1, 7990: 0x0000557E, 7991: 0x00005589, 7992: 0x000055AB, 7993: 0x00005599, 7994: 0x0000570D, 7995: 0x0000582F, 7996: 0x0000582A, 7997: 0x00005834, 7998: 0x00005824, 7999: 0x00005830, 8000: 0x00005831, 8001: 0x00005821, 8002: 0x0000581D, 8003: 0x00005820, 8004: 0x000058F9, 8005: 0x000058FA, 8006: 0x00005960, 8007: 0x00005A77, 8008: 0x00005A9A, 8009: 0x00005A7F, 8010: 0x00005A92, 8011: 0x00005A9B, 8012: 0x00005AA7, 8013: 0x00005B73, 8014: 0x00005B71, 8015: 0x00005BD2, 8016: 0x00005BCC, 8017: 0x00005BD3, 8018: 0x00005BD0, 8019: 0x00005C0A, 8020: 0x00005C0B, 8021: 0x00005C31, 8022: 0x00005D4C, 8023: 0x00005D50, 8024: 0x00005D34, 8025: 0x00005D47, 8026: 0x00005DFD, 8027: 0x00005E45, 8028: 0x00005E3D, 8029: 0x00005E40, 8030: 0x00005E43, 8031: 0x00005E7E, 8032: 0x00005ECA, 8033: 0x00005EC1, 8034: 0x00005EC2, 8035: 0x00005EC4, 8036: 0x00005F3C, 8037: 0x00005F6D, 8038: 0x00005FA9, 8039: 0x00005FAA, 8040: 0x00005FA8, 8041: 0x000060D1, 8042: 0x000060E1, 8043: 0x000060B2, 8044: 0x000060B6, 8045: 0x000060E0, 8046: 0x0000611C, 8047: 0x00006123, 8048: 0x000060FA, 8049: 0x00006115, 8050: 0x000060F0, 8051: 0x000060FB, 8052: 0x000060F4, 8053: 0x00006168, 8054: 0x000060F1, 8055: 0x0000610E, 8056: 0x000060F6, 8057: 0x00006109, 8058: 0x00006100, 8059: 0x00006112, 8060: 0x0000621F, 8061: 0x00006249, 8062: 0x000063A3, 8063: 0x0000638C, 8064: 0x000063CF, 8065: 0x000063C0, 8066: 0x000063E9, 8067: 0x000063C9, 8068: 0x000063C6, 8069: 0x000063CD, 8070: 0x000063D2, 8071: 0x000063E3, 8072: 0x000063D0, 8073: 0x000063E1, 8074: 0x000063D6, 8075: 0x000063ED, 8076: 0x000063EE, 8077: 0x00006376, 8078: 0x000063F4, 8079: 0x000063EA, 8080: 0x000063DB, 8081: 0x00006452, 8082: 0x000063DA, 8083: 0x000063F9, 8084: 0x0000655E, 8085: 0x00006566, 8086: 0x00006562, 8087: 0x00006563, 8088: 0x00006591, 8089: 0x00006590, 8090: 0x000065AF, 8091: 0x0000666E, 8092: 0x00006670, 8093: 0x00006674, 8094: 0x00006676, 8095: 0x0000666F, 8096: 0x00006691, 8097: 0x0000667A, 8098: 0x0000667E, 8099: 0x00006677, 8100: 0x000066FE, 8101: 0x000066FF, 8102: 0x0000671F, 8103: 0x0000671D, 8104: 0x000068FA, 8105: 0x000068D5, 8106: 0x000068E0, 8107: 0x000068D8, 8108: 0x000068D7, 8109: 0x00006905, 8110: 0x000068DF, 8111: 0x000068F5, 8112: 0x000068EE, 8113: 0x000068E7, 8114: 0x000068F9, 8115: 0x000068D2, 8116: 0x000068F2, 8117: 0x000068E3, 8118: 0x000068CB, 8119: 0x000068CD, 8120: 0x0000690D, 8121: 0x00006912, 8122: 0x0000690E, 8123: 0x000068C9, 8124: 0x000068DA, 8125: 0x0000696E, 8126: 0x000068FB, 8127: 0x00006B3E, 8128: 0x00006B3A, 8129: 0x00006B3D, 8130: 0x00006B98, 8131: 0x00006B96, 8132: 0x00006BBC, 8133: 0x00006BEF, 8134: 0x00006C2E, 8135: 0x00006C2F, 8136: 0x00006C2C, 8137: 0x00006E2F, 8138: 0x00006E38, 8139: 0x00006E54, 8140: 0x00006E21, 8141: 0x00006E32, 8142: 0x00006E67, 8143: 0x00006E4A, 8144: 0x00006E20, 8145: 0x00006E25, 8146: 0x00006E23, 8147: 0x00006E1B, 8148: 0x00006E5B, 8149: 0x00006E58, 8150: 0x00006E24, 8151: 0x00006E56, 8152: 0x00006E6E, 8153: 0x00006E2D, 8154: 0x00006E26, 8155: 0x00006E6F, 8156: 0x00006E34, 8157: 0x00006E4D, 8158: 0x00006E3A, 8159: 0x00006E2C, 8160: 0x00006E43, 8161: 0x00006E1D, 8162: 0x00006E3E, 8163: 0x00006ECB, 8164: 0x00006E89, 8165: 0x00006E19, 8166: 0x00006E4E, 8167: 0x00006E63, 8168: 0x00006E44, 8169: 0x00006E72, 8170: 0x00006E69, 8171: 0x00006E5F, 8172: 0x00007119, 8173: 0x0000711A, 8174: 0x00007126, 8175: 0x00007130, 8176: 0x00007121, 8177: 0x00007136, 8178: 0x0000716E, 8179: 0x0000711C, 8180: 0x0000724C, 8181: 0x00007284, 8182: 0x00007280, 8183: 0x00007336, 8184: 0x00007325, 8185: 0x00007334, 8186: 0x00007329, 8187: 0x0000743A, 8188: 0x0000742A, 8189: 0x00007433, 8190: 0x00007422, 8191: 0x00007425, 8192: 0x00007435, 8193: 0x00007436, 8194: 0x00007434, 8195: 0x0000742F, 8196: 0x0000741B, 8197: 0x00007426, 8198: 0x00007428, 8199: 0x00007525, 8200: 0x00007526, 8201: 0x0000756B, 8202: 0x0000756A, 8203: 0x000075E2, 8204: 0x000075DB, 8205: 0x000075E3, 8206: 0x000075D9, 8207: 0x000075D8, 8208: 0x000075DE, 8209: 0x000075E0, 8210: 0x0000767B, 8211: 0x0000767C, 8212: 0x00007696, 8213: 0x00007693, 8214: 0x000076B4, 8215: 0x000076DC, 8216: 0x0000774F, 8217: 0x000077ED, 8218: 0x0000785D, 8219: 0x0000786C, 8220: 0x0000786F, 8221: 0x00007A0D, 8222: 0x00007A08, 8223: 0x00007A0B, 8224: 0x00007A05, 8225: 0x00007A00, 8226: 0x00007A98, 8227: 0x00007A97, 8228: 0x00007A96, 8229: 0x00007AE5, 8230: 0x00007AE3, 8231: 0x00007B49, 8232: 0x00007B56, 8233: 0x00007B46, 8234: 0x00007B50, 8235: 0x00007B52, 8236: 0x00007B54, 8237: 0x00007B4D, 8238: 0x00007B4B, 8239: 0x00007B4F, 8240: 0x00007B51, 8241: 0x00007C9F, 8242: 0x00007CA5, 8243: 0x00007D5E, 8244: 0x00007D50, 8245: 0x00007D68, 8246: 0x00007D55, 8247: 0x00007D2B, 8248: 0x00007D6E, 8249: 0x00007D72, 8250: 0x00007D61, 8251: 0x00007D66, 8252: 0x00007D62, 8253: 0x00007D70, 8254: 0x00007D73, 8255: 0x00005584, 8256: 0x00007FD4, 8257: 0x00007FD5, 8258: 0x0000800B, 8259: 0x00008052, 8260: 0x00008085, 8261: 0x00008155, 8262: 0x00008154, 8263: 0x0000814B, 8264: 0x00008151, 8265: 0x0000814E, 8266: 0x00008139, 8267: 0x00008146, 8268: 0x0000813E, 8269: 0x0000814C, 8270: 0x00008153, 8271: 0x00008174, 8272: 0x00008212, 8273: 0x0000821C, 8274: 0x000083E9, 8275: 0x00008403, 8276: 0x000083F8, 8277: 0x0000840D, 8278: 0x000083E0, 8279: 0x000083C5, 8280: 0x0000840B, 8281: 0x000083C1, 8282: 0x000083EF, 8283: 0x000083F1, 8284: 0x000083F4, 8285: 0x00008457, 8286: 0x0000840A, 8287: 0x000083F0, 8288: 0x0000840C, 8289: 0x000083CC, 8290: 0x000083FD, 8291: 0x000083F2, 8292: 0x000083CA, 8293: 0x00008438, 8294: 0x0000840E, 8295: 0x00008404, 8296: 0x000083DC, 8297: 0x00008407, 8298: 0x000083D4, 8299: 0x000083DF, 8300: 0x0000865B, 8301: 0x000086DF, 8302: 0x000086D9, 8303: 0x000086ED, 8304: 0x000086D4, 8305: 0x000086DB, 8306: 0x000086E4, 8307: 0x000086D0, 8308: 0x000086DE, 8309: 0x00008857, 8310: 0x000088C1, 8311: 0x000088C2, 8312: 0x000088B1, 8313: 0x00008983, 8314: 0x00008996, 8315: 0x00008A3B, 8316: 0x00008A60, 8317: 0x00008A55, 8318: 0x00008A5E, 8319: 0x00008A3C, 8320: 0x00008A41, 8321: 0x00008A54, 8322: 0x00008A5B, 8323: 0x00008A50, 8324: 0x00008A46, 8325: 0x00008A34, 8326: 0x00008A3A, 8327: 0x00008A36, 8328: 0x00008A56, 8329: 0x00008C61, 8330: 0x00008C82, 8331: 0x00008CAF, 8332: 0x00008CBC, 8333: 0x00008CB3, 8334: 0x00008CBD, 8335: 0x00008CC1, 8336: 0x00008CBB, 8337: 0x00008CC0, 8338: 0x00008CB4, 8339: 0x00008CB7, 8340: 0x00008CB6, 8341: 0x00008CBF, 8342: 0x00008CB8, 8343: 0x00008D8A, 8344: 0x00008D85, 8345: 0x00008D81, 8346: 0x00008DCE, 8347: 0x00008DDD, 8348: 0x00008DCB, 8349: 0x00008DDA, 8350: 0x00008DD1, 8351: 0x00008DCC, 8352: 0x00008DDB, 8353: 0x00008DC6, 8354: 0x00008EFB, 8355: 0x00008EF8, 8356: 0x00008EFC, 8357: 0x00008F9C, 8358: 0x0000902E, 8359: 0x00009035, 8360: 0x00009031, 8361: 0x00009038, 8362: 0x00009032, 8363: 0x00009036, 8364: 0x00009102, 8365: 0x000090F5, 8366: 0x00009109, 8367: 0x000090FE, 8368: 0x00009163, 8369: 0x00009165, 8370: 0x000091CF, 8371: 0x00009214, 8372: 0x00009215, 8373: 0x00009223, 8374: 0x00009209, 8375: 0x0000921E, 8376: 0x0000920D, 8377: 0x00009210, 8378: 0x00009207, 8379: 0x00009211, 8380: 0x00009594, 8381: 0x0000958F, 8382: 0x0000958B, 8383: 0x00009591, 8384: 0x00009593, 8385: 0x00009592, 8386: 0x0000958E, 8387: 0x0000968A, 8388: 0x0000968E, 8389: 0x0000968B, 8390: 0x0000967D, 8391: 0x00009685, 8392: 0x00009686, 8393: 0x0000968D, 8394: 0x00009672, 8395: 0x00009684, 8396: 0x000096C1, 8397: 0x000096C5, 8398: 0x000096C4, 8399: 0x000096C6, 8400: 0x000096C7, 8401: 0x000096EF, 8402: 0x000096F2, 8403: 0x000097CC, 8404: 0x00009805, 8405: 0x00009806, 8406: 0x00009808, 8407: 0x000098E7, 8408: 0x000098EA, 8409: 0x000098EF, 8410: 0x000098E9, 8411: 0x000098F2, 8412: 0x000098ED, 8413: 0x000099AE, 8414: 0x000099AD, 8415: 0x00009EC3, 8416: 0x00009ECD, 8417: 0x00009ED1, 8418: 0x00004E82, 8419: 0x000050AD, 8420: 0x000050B5, 8421: 0x000050B2, 8422: 0x000050B3, 8423: 0x000050C5, 8424: 0x000050BE, 8425: 0x000050AC, 8426: 0x000050B7, 8427: 0x000050BB, 8428: 0x000050AF, 8429: 0x000050C7, 8430: 0x0000527F, 8431: 0x00005277, 8432: 0x0000527D, 8433: 0x000052DF, 8434: 0x000052E6, 8435: 0x000052E4, 8436: 0x000052E2, 8437: 0x000052E3, 8438: 0x0000532F, 8439: 0x000055DF, 8440: 0x000055E8, 8441: 0x000055D3, 8442: 0x000055E6, 8443: 0x000055CE, 8444: 0x000055DC, 8445: 0x000055C7, 8446: 0x000055D1, 8447: 0x000055E3, 8448: 0x000055E4, 8449: 0x000055EF, 8450: 0x000055DA, 8451: 0x000055E1, 8452: 0x000055C5, 8453: 0x000055C6, 8454: 0x000055E5, 8455: 0x000055C9, 8456: 0x00005712, 8457: 0x00005713, 8458: 0x0000585E, 8459: 0x00005851, 8460: 0x00005858, 8461: 0x00005857, 8462: 0x0000585A, 8463: 0x00005854, 8464: 0x0000586B, 8465: 0x0000584C, 8466: 0x0000586D, 8467: 0x0000584A, 8468: 0x00005862, 8469: 0x00005852, 8470: 0x0000584B, 8471: 0x00005967, 8472: 0x00005AC1, 8473: 0x00005AC9, 8474: 0x00005ACC, 8475: 0x00005ABE, 8476: 0x00005ABD, 8477: 0x00005ABC, 8478: 0x00005AB3, 8479: 0x00005AC2, 8480: 0x00005AB2, 8481: 0x00005D69, 8482: 0x00005D6F, 8483: 0x00005E4C, 8484: 0x00005E79, 8485: 0x00005EC9, 8486: 0x00005EC8, 8487: 0x00005F12, 8488: 0x00005F59, 8489: 0x00005FAC, 8490: 0x00005FAE, 8491: 0x0000611A, 8492: 0x0000610F, 8493: 0x00006148, 8494: 0x0000611F, 8495: 0x000060F3, 8496: 0x0000611B, 8497: 0x000060F9, 8498: 0x00006101, 8499: 0x00006108, 8500: 0x0000614E, 8501: 0x0000614C, 8502: 0x00006144, 8503: 0x0000614D, 8504: 0x0000613E, 8505: 0x00006134, 8506: 0x00006127, 8507: 0x0000610D, 8508: 0x00006106, 8509: 0x00006137, 8510: 0x00006221, 8511: 0x00006222, 8512: 0x00006413, 8513: 0x0000643E, 8514: 0x0000641E, 8515: 0x0000642A, 8516: 0x0000642D, 8517: 0x0000643D, 8518: 0x0000642C, 8519: 0x0000640F, 8520: 0x0000641C, 8521: 0x00006414, 8522: 0x0000640D, 8523: 0x00006436, 8524: 0x00006416, 8525: 0x00006417, 8526: 0x00006406, 8527: 0x0000656C, 8528: 0x0000659F, 8529: 0x000065B0, 8530: 0x00006697, 8531: 0x00006689, 8532: 0x00006687, 8533: 0x00006688, 8534: 0x00006696, 8535: 0x00006684, 8536: 0x00006698, 8537: 0x0000668D, 8538: 0x00006703, 8539: 0x00006994, 8540: 0x0000696D, 8541: 0x0000695A, 8542: 0x00006977, 8543: 0x00006960, 8544: 0x00006954, 8545: 0x00006975, 8546: 0x00006930, 8547: 0x00006982, 8548: 0x0000694A, 8549: 0x00006968, 8550: 0x0000696B, 8551: 0x0000695E, 8552: 0x00006953, 8553: 0x00006979, 8554: 0x00006986, 8555: 0x0000695D, 8556: 0x00006963, 8557: 0x0000695B, 8558: 0x00006B47, 8559: 0x00006B72, 8560: 0x00006BC0, 8561: 0x00006BBF, 8562: 0x00006BD3, 8563: 0x00006BFD, 8564: 0x00006EA2, 8565: 0x00006EAF, 8566: 0x00006ED3, 8567: 0x00006EB6, 8568: 0x00006EC2, 8569: 0x00006E90, 8570: 0x00006E9D, 8571: 0x00006EC7, 8572: 0x00006EC5, 8573: 0x00006EA5, 8574: 0x00006E98, 8575: 0x00006EBC, 8576: 0x00006EBA, 8577: 0x00006EAB, 8578: 0x00006ED1, 8579: 0x00006E96, 8580: 0x00006E9C, 8581: 0x00006EC4, 8582: 0x00006ED4, 8583: 0x00006EAA, 8584: 0x00006EA7, 8585: 0x00006EB4, 8586: 0x0000714E, 8587: 0x00007159, 8588: 0x00007169, 8589: 0x00007164, 8590: 0x00007149, 8591: 0x00007167, 8592: 0x0000715C, 8593: 0x0000716C, 8594: 0x00007166, 8595: 0x0000714C, 8596: 0x00007165, 8597: 0x0000715E, 8598: 0x00007146, 8599: 0x00007168, 8600: 0x00007156, 8601: 0x0000723A, 8602: 0x00007252, 8603: 0x00007337, 8604: 0x00007345, 8605: 0x0000733F, 8606: 0x0000733E, 8607: 0x0000746F, 8608: 0x0000745A, 8609: 0x00007455, 8610: 0x0000745F, 8611: 0x0000745E, 8612: 0x00007441, 8613: 0x0000743F, 8614: 0x00007459, 8615: 0x0000745B, 8616: 0x0000745C, 8617: 0x00007576, 8618: 0x00007578, 8619: 0x00007600, 8620: 0x000075F0, 8621: 0x00007601, 8622: 0x000075F2, 8623: 0x000075F1, 8624: 0x000075FA, 8625: 0x000075FF, 8626: 0x000075F4, 8627: 0x000075F3, 8628: 0x000076DE, 8629: 0x000076DF, 8630: 0x0000775B, 8631: 0x0000776B, 8632: 0x00007766, 8633: 0x0000775E, 8634: 0x00007763, 8635: 0x00007779, 8636: 0x0000776A, 8637: 0x0000776C, 8638: 0x0000775C, 8639: 0x00007765, 8640: 0x00007768, 8641: 0x00007762, 8642: 0x000077EE, 8643: 0x0000788E, 8644: 0x000078B0, 8645: 0x00007897, 8646: 0x00007898, 8647: 0x0000788C, 8648: 0x00007889, 8649: 0x0000787C, 8650: 0x00007891, 8651: 0x00007893, 8652: 0x0000787F, 8653: 0x0000797A, 8654: 0x0000797F, 8655: 0x00007981, 8656: 0x0000842C, 8657: 0x000079BD, 8658: 0x00007A1C, 8659: 0x00007A1A, 8660: 0x00007A20, 8661: 0x00007A14, 8662: 0x00007A1F, 8663: 0x00007A1E, 8664: 0x00007A9F, 8665: 0x00007AA0, 8666: 0x00007B77, 8667: 0x00007BC0, 8668: 0x00007B60, 8669: 0x00007B6E, 8670: 0x00007B67, 8671: 0x00007CB1, 8672: 0x00007CB3, 8673: 0x00007CB5, 8674: 0x00007D93, 8675: 0x00007D79, 8676: 0x00007D91, 8677: 0x00007D81, 8678: 0x00007D8F, 8679: 0x00007D5B, 8680: 0x00007F6E, 8681: 0x00007F69, 8682: 0x00007F6A, 8683: 0x00007F72, 8684: 0x00007FA9, 8685: 0x00007FA8, 8686: 0x00007FA4, 8687: 0x00008056, 8688: 0x00008058, 8689: 0x00008086, 8690: 0x00008084, 8691: 0x00008171, 8692: 0x00008170, 8693: 0x00008178, 8694: 0x00008165, 8695: 0x0000816E, 8696: 0x00008173, 8697: 0x0000816B, 8698: 0x00008179, 8699: 0x0000817A, 8700: 0x00008166, 8701: 0x00008205, 8702: 0x00008247, 8703: 0x00008482, 8704: 0x00008477, 8705: 0x0000843D, 8706: 0x00008431, 8707: 0x00008475, 8708: 0x00008466, 8709: 0x0000846B, 8710: 0x00008449, 8711: 0x0000846C, 8712: 0x0000845B, 8713: 0x0000843C, 8714: 0x00008435, 8715: 0x00008461, 8716: 0x00008463, 8717: 0x00008469, 8718: 0x0000846D, 8719: 0x00008446, 8720: 0x0000865E, 8721: 0x0000865C, 8722: 0x0000865F, 8723: 0x000086F9, 8724: 0x00008713, 8725: 0x00008708, 8726: 0x00008707, 8727: 0x00008700, 8728: 0x000086FE, 8729: 0x000086FB, 8730: 0x00008702, 8731: 0x00008703, 8732: 0x00008706, 8733: 0x0000870A, 8734: 0x00008859, 8735: 0x000088DF, 8736: 0x000088D4, 8737: 0x000088D9, 8738: 0x000088DC, 8739: 0x000088D8, 8740: 0x000088DD, 8741: 0x000088E1, 8742: 0x000088CA, 8743: 0x000088D5, 8744: 0x000088D2, 8745: 0x0000899C, 8746: 0x000089E3, 8747: 0x00008A6B, 8748: 0x00008A72, 8749: 0x00008A73, 8750: 0x00008A66, 8751: 0x00008A69, 8752: 0x00008A70, 8753: 0x00008A87, 8754: 0x00008A7C, 8755: 0x00008A63, 8756: 0x00008AA0, 8757: 0x00008A71, 8758: 0x00008A85, 8759: 0x00008A6D, 8760: 0x00008A62, 8761: 0x00008A6E, 8762: 0x00008A6C, 8763: 0x00008A79, 8764: 0x00008A7B, 8765: 0x00008A3E, 8766: 0x00008A68, 8767: 0x00008C62, 8768: 0x00008C8A, 8769: 0x00008C89, 8770: 0x00008CCA, 8771: 0x00008CC7, 8772: 0x00008CC8, 8773: 0x00008CC4, 8774: 0x00008CB2, 8775: 0x00008CC3, 8776: 0x00008CC2, 8777: 0x00008CC5, 8778: 0x00008DE1, 8779: 0x00008DDF, 8780: 0x00008DE8, 8781: 0x00008DEF, 8782: 0x00008DF3, 8783: 0x00008DFA, 8784: 0x00008DEA, 8785: 0x00008DE4, 8786: 0x00008DE6, 8787: 0x00008EB2, 8788: 0x00008F03, 8789: 0x00008F09, 8790: 0x00008EFE, 8791: 0x00008F0A, 8792: 0x00008F9F, 8793: 0x00008FB2, 8794: 0x0000904B, 8795: 0x0000904A, 8796: 0x00009053, 8797: 0x00009042, 8798: 0x00009054, 8799: 0x0000903C, 8800: 0x00009055, 8801: 0x00009050, 8802: 0x00009047, 8803: 0x0000904F, 8804: 0x0000904E, 8805: 0x0000904D, 8806: 0x00009051, 8807: 0x0000903E, 8808: 0x00009041, 8809: 0x00009112, 8810: 0x00009117, 8811: 0x0000916C, 8812: 0x0000916A, 8813: 0x00009169, 8814: 0x000091C9, 8815: 0x00009237, 8816: 0x00009257, 8817: 0x00009238, 8818: 0x0000923D, 8819: 0x00009240, 8820: 0x0000923E, 8821: 0x0000925B, 8822: 0x0000924B, 8823: 0x00009264, 8824: 0x00009251, 8825: 0x00009234, 8826: 0x00009249, 8827: 0x0000924D, 8828: 0x00009245, 8829: 0x00009239, 8830: 0x0000923F, 8831: 0x0000925A, 8832: 0x00009598, 8833: 0x00009698, 8834: 0x00009694, 8835: 0x00009695, 8836: 0x000096CD, 8837: 0x000096CB, 8838: 0x000096C9, 8839: 0x000096CA, 8840: 0x000096F7, 8841: 0x000096FB, 8842: 0x000096F9, 8843: 0x000096F6, 8844: 0x00009756, 8845: 0x00009774, 8846: 0x00009776, 8847: 0x00009810, 8848: 0x00009811, 8849: 0x00009813, 8850: 0x0000980A, 8851: 0x00009812, 8852: 0x0000980C, 8853: 0x000098FC, 8854: 0x000098F4, 8855: 0x000098FD, 8856: 0x000098FE, 8857: 0x000099B3, 8858: 0x000099B1, 8859: 0x000099B4, 8860: 0x00009AE1, 8861: 0x00009CE9, 8862: 0x00009E82, 8863: 0x00009F0E, 8864: 0x00009F13, 8865: 0x00009F20, 8866: 0x000050E7, 8867: 0x000050EE, 8868: 0x000050E5, 8869: 0x000050D6, 8870: 0x000050ED, 8871: 0x000050DA, 8872: 0x000050D5, 8873: 0x000050CF, 8874: 0x000050D1, 8875: 0x000050F1, 8876: 0x000050CE, 8877: 0x000050E9, 8878: 0x00005162, 8879: 0x000051F3, 8880: 0x00005283, 8881: 0x00005282, 8882: 0x00005331, 8883: 0x000053AD, 8884: 0x000055FE, 8885: 0x00005600, 8886: 0x0000561B, 8887: 0x00005617, 8888: 0x000055FD, 8889: 0x00005614, 8890: 0x00005606, 8891: 0x00005609, 8892: 0x0000560D, 8893: 0x0000560E, 8894: 0x000055F7, 8895: 0x00005616, 8896: 0x0000561F, 8897: 0x00005608, 8898: 0x00005610, 8899: 0x000055F6, 8900: 0x00005718, 8901: 0x00005716, 8902: 0x00005875, 8903: 0x0000587E, 8904: 0x00005883, 8905: 0x00005893, 8906: 0x0000588A, 8907: 0x00005879, 8908: 0x00005885, 8909: 0x0000587D, 8910: 0x000058FD, 8911: 0x00005925, 8912: 0x00005922, 8913: 0x00005924, 8914: 0x0000596A, 8915: 0x00005969, 8916: 0x00005AE1, 8917: 0x00005AE6, 8918: 0x00005AE9, 8919: 0x00005AD7, 8920: 0x00005AD6, 8921: 0x00005AD8, 8922: 0x00005AE3, 8923: 0x00005B75, 8924: 0x00005BDE, 8925: 0x00005BE7, 8926: 0x00005BE1, 8927: 0x00005BE5, 8928: 0x00005BE6, 8929: 0x00005BE8, 8930: 0x00005BE2, 8931: 0x00005BE4, 8932: 0x00005BDF, 8933: 0x00005C0D, 8934: 0x00005C62, 8935: 0x00005D84, 8936: 0x00005D87, 8937: 0x00005E5B, 8938: 0x00005E63, 8939: 0x00005E55, 8940: 0x00005E57, 8941: 0x00005E54, 8942: 0x00005ED3, 8943: 0x00005ED6, 8944: 0x00005F0A, 8945: 0x00005F46, 8946: 0x00005F70, 8947: 0x00005FB9, 8948: 0x00006147, 8949: 0x0000613F, 8950: 0x0000614B, 8951: 0x00006177, 8952: 0x00006162, 8953: 0x00006163, 8954: 0x0000615F, 8955: 0x0000615A, 8956: 0x00006158, 8957: 0x00006175, 8958: 0x0000622A, 8959: 0x00006487, 8960: 0x00006458, 8961: 0x00006454, 8962: 0x000064A4, 8963: 0x00006478, 8964: 0x0000645F, 8965: 0x0000647A, 8966: 0x00006451, 8967: 0x00006467, 8968: 0x00006434, 8969: 0x0000646D, 8970: 0x0000647B, 8971: 0x00006572, 8972: 0x000065A1, 8973: 0x000065D7, 8974: 0x000065D6, 8975: 0x000066A2, 8976: 0x000066A8, 8977: 0x0000669D, 8978: 0x0000699C, 8979: 0x000069A8, 8980: 0x00006995, 8981: 0x000069C1, 8982: 0x000069AE, 8983: 0x000069D3, 8984: 0x000069CB, 8985: 0x0000699B, 8986: 0x000069B7, 8987: 0x000069BB, 8988: 0x000069AB, 8989: 0x000069B4, 8990: 0x000069D0, 8991: 0x000069CD, 8992: 0x000069AD, 8993: 0x000069CC, 8994: 0x000069A6, 8995: 0x000069C3, 8996: 0x000069A3, 8997: 0x00006B49, 8998: 0x00006B4C, 8999: 0x00006C33, 9000: 0x00006F33, 9001: 0x00006F14, 9002: 0x00006EFE, 9003: 0x00006F13, 9004: 0x00006EF4, 9005: 0x00006F29, 9006: 0x00006F3E, 9007: 0x00006F20, 9008: 0x00006F2C, 9009: 0x00006F0F, 9010: 0x00006F02, 9011: 0x00006F22, 9012: 0x00006EFF, 9013: 0x00006EEF, 9014: 0x00006F06, 9015: 0x00006F31, 9016: 0x00006F38, 9017: 0x00006F32, 9018: 0x00006F23, 9019: 0x00006F15, 9020: 0x00006F2B, 9021: 0x00006F2F, 9022: 0x00006F88, 9023: 0x00006F2A, 9024: 0x00006EEC, 9025: 0x00006F01, 9026: 0x00006EF2, 9027: 0x00006ECC, 9028: 0x00006EF7, 9029: 0x00007194, 9030: 0x00007199, 9031: 0x0000717D, 9032: 0x0000718A, 9033: 0x00007184, 9034: 0x00007192, 9035: 0x0000723E, 9036: 0x00007292, 9037: 0x00007296, 9038: 0x00007344, 9039: 0x00007350, 9040: 0x00007464, 9041: 0x00007463, 9042: 0x0000746A, 9043: 0x00007470, 9044: 0x0000746D, 9045: 0x00007504, 9046: 0x00007591, 9047: 0x00007627, 9048: 0x0000760D, 9049: 0x0000760B, 9050: 0x00007609, 9051: 0x00007613, 9052: 0x000076E1, 9053: 0x000076E3, 9054: 0x00007784, 9055: 0x0000777D, 9056: 0x0000777F, 9057: 0x00007761, 9058: 0x000078C1, 9059: 0x0000789F, 9060: 0x000078A7, 9061: 0x000078B3, 9062: 0x000078A9, 9063: 0x000078A3, 9064: 0x0000798E, 9065: 0x0000798F, 9066: 0x0000798D, 9067: 0x00007A2E, 9068: 0x00007A31, 9069: 0x00007AAA, 9070: 0x00007AA9, 9071: 0x00007AED, 9072: 0x00007AEF, 9073: 0x00007BA1, 9074: 0x00007B95, 9075: 0x00007B8B, 9076: 0x00007B75, 9077: 0x00007B97, 9078: 0x00007B9D, 9079: 0x00007B94, 9080: 0x00007B8F, 9081: 0x00007BB8, 9082: 0x00007B87, 9083: 0x00007B84, 9084: 0x00007CB9, 9085: 0x00007CBD, 9086: 0x00007CBE, 9087: 0x00007DBB, 9088: 0x00007DB0, 9089: 0x00007D9C, 9090: 0x00007DBD, 9091: 0x00007DBE, 9092: 0x00007DA0, 9093: 0x00007DCA, 9094: 0x00007DB4, 9095: 0x00007DB2, 9096: 0x00007DB1, 9097: 0x00007DBA, 9098: 0x00007DA2, 9099: 0x00007DBF, 9100: 0x00007DB5, 9101: 0x00007DB8, 9102: 0x00007DAD, 9103: 0x00007DD2, 9104: 0x00007DC7, 9105: 0x00007DAC, 9106: 0x00007F70, 9107: 0x00007FE0, 9108: 0x00007FE1, 9109: 0x00007FDF, 9110: 0x0000805E, 9111: 0x0000805A, 9112: 0x00008087, 9113: 0x00008150, 9114: 0x00008180, 9115: 0x0000818F, 9116: 0x00008188, 9117: 0x0000818A, 9118: 0x0000817F, 9119: 0x00008182, 9120: 0x000081E7, 9121: 0x000081FA, 9122: 0x00008207, 9123: 0x00008214, 9124: 0x0000821E, 9125: 0x0000824B, 9126: 0x000084C9, 9127: 0x000084BF, 9128: 0x000084C6, 9129: 0x000084C4, 9130: 0x00008499, 9131: 0x0000849E, 9132: 0x000084B2, 9133: 0x0000849C, 9134: 0x000084CB, 9135: 0x000084B8, 9136: 0x000084C0, 9137: 0x000084D3, 9138: 0x00008490, 9139: 0x000084BC, 9140: 0x000084D1, 9141: 0x000084CA, 9142: 0x0000873F, 9143: 0x0000871C, 9144: 0x0000873B, 9145: 0x00008722, 9146: 0x00008725, 9147: 0x00008734, 9148: 0x00008718, 9149: 0x00008755, 9150: 0x00008737, 9151: 0x00008729, 9152: 0x000088F3, 9153: 0x00008902, 9154: 0x000088F4, 9155: 0x000088F9, 9156: 0x000088F8, 9157: 0x000088FD, 9158: 0x000088E8, 9159: 0x0000891A, 9160: 0x000088EF, 9161: 0x00008AA6, 9162: 0x00008A8C, 9163: 0x00008A9E, 9164: 0x00008AA3, 9165: 0x00008A8D, 9166: 0x00008AA1, 9167: 0x00008A93, 9168: 0x00008AA4, 9169: 0x00008AAA, 9170: 0x00008AA5, 9171: 0x00008AA8, 9172: 0x00008A98, 9173: 0x00008A91, 9174: 0x00008A9A, 9175: 0x00008AA7, 9176: 0x00008C6A, 9177: 0x00008C8D, 9178: 0x00008C8C, 9179: 0x00008CD3, 9180: 0x00008CD1, 9181: 0x00008CD2, 9182: 0x00008D6B, 9183: 0x00008D99, 9184: 0x00008D95, 9185: 0x00008DFC, 9186: 0x00008F14, 9187: 0x00008F12, 9188: 0x00008F15, 9189: 0x00008F13, 9190: 0x00008FA3, 9191: 0x00009060, 9192: 0x00009058, 9193: 0x0000905C, 9194: 0x00009063, 9195: 0x00009059, 9196: 0x0000905E, 9197: 0x00009062, 9198: 0x0000905D, 9199: 0x0000905B, 9200: 0x00009119, 9201: 0x00009118, 9202: 0x0000911E, 9203: 0x00009175, 9204: 0x00009178, 9205: 0x00009177, 9206: 0x00009174, 9207: 0x00009278, 9208: 0x00009280, 9209: 0x00009285, 9210: 0x00009298, 9211: 0x00009296, 9212: 0x0000927B, 9213: 0x00009293, 9214: 0x0000929C, 9215: 0x000092A8, 9216: 0x0000927C, 9217: 0x00009291, 9218: 0x000095A1, 9219: 0x000095A8, 9220: 0x000095A9, 9221: 0x000095A3, 9222: 0x000095A5, 9223: 0x000095A4, 9224: 0x00009699, 9225: 0x0000969C, 9226: 0x0000969B, 9227: 0x000096CC, 9228: 0x000096D2, 9229: 0x00009700, 9230: 0x0000977C, 9231: 0x00009785, 9232: 0x000097F6, 9233: 0x00009817, 9234: 0x00009818, 9235: 0x000098AF, 9236: 0x000098B1, 9237: 0x00009903, 9238: 0x00009905, 9239: 0x0000990C, 9240: 0x00009909, 9241: 0x000099C1, 9242: 0x00009AAF, 9243: 0x00009AB0, 9244: 0x00009AE6, 9245: 0x00009B41, 9246: 0x00009B42, 9247: 0x00009CF4, 9248: 0x00009CF6, 9249: 0x00009CF3, 9250: 0x00009EBC, 9251: 0x00009F3B, 9252: 0x00009F4A, 9253: 0x00005104, 9254: 0x00005100, 9255: 0x000050FB, 9256: 0x000050F5, 9257: 0x000050F9, 9258: 0x00005102, 9259: 0x00005108, 9260: 0x00005109, 9261: 0x00005105, 9262: 0x000051DC, 9263: 0x00005287, 9264: 0x00005288, 9265: 0x00005289, 9266: 0x0000528D, 9267: 0x0000528A, 9268: 0x000052F0, 9269: 0x000053B2, 9270: 0x0000562E, 9271: 0x0000563B, 9272: 0x00005639, 9273: 0x00005632, 9274: 0x0000563F, 9275: 0x00005634, 9276: 0x00005629, 9277: 0x00005653, 9278: 0x0000564E, 9279: 0x00005657, 9280: 0x00005674, 9281: 0x00005636, 9282: 0x0000562F, 9283: 0x00005630, 9284: 0x00005880, 9285: 0x0000589F, 9286: 0x0000589E, 9287: 0x000058B3, 9288: 0x0000589C, 9289: 0x000058AE, 9290: 0x000058A9, 9291: 0x000058A6, 9292: 0x0000596D, 9293: 0x00005B09, 9294: 0x00005AFB, 9295: 0x00005B0B, 9296: 0x00005AF5, 9297: 0x00005B0C, 9298: 0x00005B08, 9299: 0x00005BEE, 9300: 0x00005BEC, 9301: 0x00005BE9, 9302: 0x00005BEB, 9303: 0x00005C64, 9304: 0x00005C65, 9305: 0x00005D9D, 9306: 0x00005D94, 9307: 0x00005E62, 9308: 0x00005E5F, 9309: 0x00005E61, 9310: 0x00005EE2, 9311: 0x00005EDA, 9312: 0x00005EDF, 9313: 0x00005EDD, 9314: 0x00005EE3, 9315: 0x00005EE0, 9316: 0x00005F48, 9317: 0x00005F71, 9318: 0x00005FB7, 9319: 0x00005FB5, 9320: 0x00006176, 9321: 0x00006167, 9322: 0x0000616E, 9323: 0x0000615D, 9324: 0x00006155, 9325: 0x00006182, 9326: 0x0000617C, 9327: 0x00006170, 9328: 0x0000616B, 9329: 0x0000617E, 9330: 0x000061A7, 9331: 0x00006190, 9332: 0x000061AB, 9333: 0x0000618E, 9334: 0x000061AC, 9335: 0x0000619A, 9336: 0x000061A4, 9337: 0x00006194, 9338: 0x000061AE, 9339: 0x0000622E, 9340: 0x00006469, 9341: 0x0000646F, 9342: 0x00006479, 9343: 0x0000649E, 9344: 0x000064B2, 9345: 0x00006488, 9346: 0x00006490, 9347: 0x000064B0, 9348: 0x000064A5, 9349: 0x00006493, 9350: 0x00006495, 9351: 0x000064A9, 9352: 0x00006492, 9353: 0x000064AE, 9354: 0x000064AD, 9355: 0x000064AB, 9356: 0x0000649A, 9357: 0x000064AC, 9358: 0x00006499, 9359: 0x000064A2, 9360: 0x000064B3, 9361: 0x00006575, 9362: 0x00006577, 9363: 0x00006578, 9364: 0x000066AE, 9365: 0x000066AB, 9366: 0x000066B4, 9367: 0x000066B1, 9368: 0x00006A23, 9369: 0x00006A1F, 9370: 0x000069E8, 9371: 0x00006A01, 9372: 0x00006A1E, 9373: 0x00006A19, 9374: 0x000069FD, 9375: 0x00006A21, 9376: 0x00006A13, 9377: 0x00006A0A, 9378: 0x000069F3, 9379: 0x00006A02, 9380: 0x00006A05, 9381: 0x000069ED, 9382: 0x00006A11, 9383: 0x00006B50, 9384: 0x00006B4E, 9385: 0x00006BA4, 9386: 0x00006BC5, 9387: 0x00006BC6, 9388: 0x00006F3F, 9389: 0x00006F7C, 9390: 0x00006F84, 9391: 0x00006F51, 9392: 0x00006F66, 9393: 0x00006F54, 9394: 0x00006F86, 9395: 0x00006F6D, 9396: 0x00006F5B, 9397: 0x00006F78, 9398: 0x00006F6E, 9399: 0x00006F8E, 9400: 0x00006F7A, 9401: 0x00006F70, 9402: 0x00006F64, 9403: 0x00006F97, 9404: 0x00006F58, 9405: 0x00006ED5, 9406: 0x00006F6F, 9407: 0x00006F60, 9408: 0x00006F5F, 9409: 0x0000719F, 9410: 0x000071AC, 9411: 0x000071B1, 9412: 0x000071A8, 9413: 0x00007256, 9414: 0x0000729B, 9415: 0x0000734E, 9416: 0x00007357, 9417: 0x00007469, 9418: 0x0000748B, 9419: 0x00007483, 9420: 0x0000747E, 9421: 0x00007480, 9422: 0x0000757F, 9423: 0x00007620, 9424: 0x00007629, 9425: 0x0000761F, 9426: 0x00007624, 9427: 0x00007626, 9428: 0x00007621, 9429: 0x00007622, 9430: 0x0000769A, 9431: 0x000076BA, 9432: 0x000076E4, 9433: 0x0000778E, 9434: 0x00007787, 9435: 0x0000778C, 9436: 0x00007791, 9437: 0x0000778B, 9438: 0x000078CB, 9439: 0x000078C5, 9440: 0x000078BA, 9441: 0x000078CA, 9442: 0x000078BE, 9443: 0x000078D5, 9444: 0x000078BC, 9445: 0x000078D0, 9446: 0x00007A3F, 9447: 0x00007A3C, 9448: 0x00007A40, 9449: 0x00007A3D, 9450: 0x00007A37, 9451: 0x00007A3B, 9452: 0x00007AAF, 9453: 0x00007AAE, 9454: 0x00007BAD, 9455: 0x00007BB1, 9456: 0x00007BC4, 9457: 0x00007BB4, 9458: 0x00007BC6, 9459: 0x00007BC7, 9460: 0x00007BC1, 9461: 0x00007BA0, 9462: 0x00007BCC, 9463: 0x00007CCA, 9464: 0x00007DE0, 9465: 0x00007DF4, 9466: 0x00007DEF, 9467: 0x00007DFB, 9468: 0x00007DD8, 9469: 0x00007DEC, 9470: 0x00007DDD, 9471: 0x00007DE8, 9472: 0x00007DE3, 9473: 0x00007DDA, 9474: 0x00007DDE, 9475: 0x00007DE9, 9476: 0x00007D9E, 9477: 0x00007DD9, 9478: 0x00007DF2, 9479: 0x00007DF9, 9480: 0x00007F75, 9481: 0x00007F77, 9482: 0x00007FAF, 9483: 0x00007FE9, 9484: 0x00008026, 9485: 0x0000819B, 9486: 0x0000819C, 9487: 0x0000819D, 9488: 0x000081A0, 9489: 0x0000819A, 9490: 0x00008198, 9491: 0x00008517, 9492: 0x0000853D, 9493: 0x0000851A, 9494: 0x000084EE, 9495: 0x0000852C, 9496: 0x0000852D, 9497: 0x00008513, 9498: 0x00008511, 9499: 0x00008523, 9500: 0x00008521, 9501: 0x00008514, 9502: 0x000084EC, 9503: 0x00008525, 9504: 0x000084FF, 9505: 0x00008506, 9506: 0x00008782, 9507: 0x00008774, 9508: 0x00008776, 9509: 0x00008760, 9510: 0x00008766, 9511: 0x00008778, 9512: 0x00008768, 9513: 0x00008759, 9514: 0x00008757, 9515: 0x0000874C, 9516: 0x00008753, 9517: 0x0000885B, 9518: 0x0000885D, 9519: 0x00008910, 9520: 0x00008907, 9521: 0x00008912, 9522: 0x00008913, 9523: 0x00008915, 9524: 0x0000890A, 9525: 0x00008ABC, 9526: 0x00008AD2, 9527: 0x00008AC7, 9528: 0x00008AC4, 9529: 0x00008A95, 9530: 0x00008ACB, 9531: 0x00008AF8, 9532: 0x00008AB2, 9533: 0x00008AC9, 9534: 0x00008AC2, 9535: 0x00008ABF, 9536: 0x00008AB0, 9537: 0x00008AD6, 9538: 0x00008ACD, 9539: 0x00008AB6, 9540: 0x00008AB9, 9541: 0x00008ADB, 9542: 0x00008C4C, 9543: 0x00008C4E, 9544: 0x00008C6C, 9545: 0x00008CE0, 9546: 0x00008CDE, 9547: 0x00008CE6, 9548: 0x00008CE4, 9549: 0x00008CEC, 9550: 0x00008CED, 9551: 0x00008CE2, 9552: 0x00008CE3, 9553: 0x00008CDC, 9554: 0x00008CEA, 9555: 0x00008CE1, 9556: 0x00008D6D, 9557: 0x00008D9F, 9558: 0x00008DA3, 9559: 0x00008E2B, 9560: 0x00008E10, 9561: 0x00008E1D, 9562: 0x00008E22, 9563: 0x00008E0F, 9564: 0x00008E29, 9565: 0x00008E1F, 9566: 0x00008E21, 9567: 0x00008E1E, 9568: 0x00008EBA, 9569: 0x00008F1D, 9570: 0x00008F1B, 9571: 0x00008F1F, 9572: 0x00008F29, 9573: 0x00008F26, 9574: 0x00008F2A, 9575: 0x00008F1C, 9576: 0x00008F1E, 9577: 0x00008F25, 9578: 0x00009069, 9579: 0x0000906E, 9580: 0x00009068, 9581: 0x0000906D, 9582: 0x00009077, 9583: 0x00009130, 9584: 0x0000912D, 9585: 0x00009127, 9586: 0x00009131, 9587: 0x00009187, 9588: 0x00009189, 9589: 0x0000918B, 9590: 0x00009183, 9591: 0x000092C5, 9592: 0x000092BB, 9593: 0x000092B7, 9594: 0x000092EA, 9595: 0x000092AC, 9596: 0x000092E4, 9597: 0x000092C1, 9598: 0x000092B3, 9599: 0x000092BC, 9600: 0x000092D2, 9601: 0x000092C7, 9602: 0x000092F0, 9603: 0x000092B2, 9604: 0x000095AD, 9605: 0x000095B1, 9606: 0x00009704, 9607: 0x00009706, 9608: 0x00009707, 9609: 0x00009709, 9610: 0x00009760, 9611: 0x0000978D, 9612: 0x0000978B, 9613: 0x0000978F, 9614: 0x00009821, 9615: 0x0000982B, 9616: 0x0000981C, 9617: 0x000098B3, 9618: 0x0000990A, 9619: 0x00009913, 9620: 0x00009912, 9621: 0x00009918, 9622: 0x000099DD, 9623: 0x000099D0, 9624: 0x000099DF, 9625: 0x000099DB, 9626: 0x000099D1, 9627: 0x000099D5, 9628: 0x000099D2, 9629: 0x000099D9, 9630: 0x00009AB7, 9631: 0x00009AEE, 9632: 0x00009AEF, 9633: 0x00009B27, 9634: 0x00009B45, 9635: 0x00009B44, 9636: 0x00009B77, 9637: 0x00009B6F, 9638: 0x00009D06, 9639: 0x00009D09, 9640: 0x00009D03, 9641: 0x00009EA9, 9642: 0x00009EBE, 9643: 0x00009ECE, 9644: 0x000058A8, 9645: 0x00009F52, 9646: 0x00005112, 9647: 0x00005118, 9648: 0x00005114, 9649: 0x00005110, 9650: 0x00005115, 9651: 0x00005180, 9652: 0x000051AA, 9653: 0x000051DD, 9654: 0x00005291, 9655: 0x00005293, 9656: 0x000052F3, 9657: 0x00005659, 9658: 0x0000566B, 9659: 0x00005679, 9660: 0x00005669, 9661: 0x00005664, 9662: 0x00005678, 9663: 0x0000566A, 9664: 0x00005668, 9665: 0x00005665, 9666: 0x00005671, 9667: 0x0000566F, 9668: 0x0000566C, 9669: 0x00005662, 9670: 0x00005676, 9671: 0x000058C1, 9672: 0x000058BE, 9673: 0x000058C7, 9674: 0x000058C5, 9675: 0x0000596E, 9676: 0x00005B1D, 9677: 0x00005B34, 9678: 0x00005B78, 9679: 0x00005BF0, 9680: 0x00005C0E, 9681: 0x00005F4A, 9682: 0x000061B2, 9683: 0x00006191, 9684: 0x000061A9, 9685: 0x0000618A, 9686: 0x000061CD, 9687: 0x000061B6, 9688: 0x000061BE, 9689: 0x000061CA, 9690: 0x000061C8, 9691: 0x00006230, 9692: 0x000064C5, 9693: 0x000064C1, 9694: 0x000064CB, 9695: 0x000064BB, 9696: 0x000064BC, 9697: 0x000064DA, 9698: 0x000064C4, 9699: 0x000064C7, 9700: 0x000064C2, 9701: 0x000064CD, 9702: 0x000064BF, 9703: 0x000064D2, 9704: 0x000064D4, 9705: 0x000064BE, 9706: 0x00006574, 9707: 0x000066C6, 9708: 0x000066C9, 9709: 0x000066B9, 9710: 0x000066C4, 9711: 0x000066C7, 9712: 0x000066B8, 9713: 0x00006A3D, 9714: 0x00006A38, 9715: 0x00006A3A, 9716: 0x00006A59, 9717: 0x00006A6B, 9718: 0x00006A58, 9719: 0x00006A39, 9720: 0x00006A44, 9721: 0x00006A62, 9722: 0x00006A61, 9723: 0x00006A4B, 9724: 0x00006A47, 9725: 0x00006A35, 9726: 0x00006A5F, 9727: 0x00006A48, 9728: 0x00006B59, 9729: 0x00006B77, 9730: 0x00006C05, 9731: 0x00006FC2, 9732: 0x00006FB1, 9733: 0x00006FA1, 9734: 0x00006FC3, 9735: 0x00006FA4, 9736: 0x00006FC1, 9737: 0x00006FA7, 9738: 0x00006FB3, 9739: 0x00006FC0, 9740: 0x00006FB9, 9741: 0x00006FB6, 9742: 0x00006FA6, 9743: 0x00006FA0, 9744: 0x00006FB4, 9745: 0x000071BE, 9746: 0x000071C9, 9747: 0x000071D0, 9748: 0x000071D2, 9749: 0x000071C8, 9750: 0x000071D5, 9751: 0x000071B9, 9752: 0x000071CE, 9753: 0x000071D9, 9754: 0x000071DC, 9755: 0x000071C3, 9756: 0x000071C4, 9757: 0x00007368, 9758: 0x0000749C, 9759: 0x000074A3, 9760: 0x00007498, 9761: 0x0000749F, 9762: 0x0000749E, 9763: 0x000074E2, 9764: 0x0000750C, 9765: 0x0000750D, 9766: 0x00007634, 9767: 0x00007638, 9768: 0x0000763A, 9769: 0x000076E7, 9770: 0x000076E5, 9771: 0x000077A0, 9772: 0x0000779E, 9773: 0x0000779F, 9774: 0x000077A5, 9775: 0x000078E8, 9776: 0x000078DA, 9777: 0x000078EC, 9778: 0x000078E7, 9779: 0x000079A6, 9780: 0x00007A4D, 9781: 0x00007A4E, 9782: 0x00007A46, 9783: 0x00007A4C, 9784: 0x00007A4B, 9785: 0x00007ABA, 9786: 0x00007BD9, 9787: 0x00007C11, 9788: 0x00007BC9, 9789: 0x00007BE4, 9790: 0x00007BDB, 9791: 0x00007BE1, 9792: 0x00007BE9, 9793: 0x00007BE6, 9794: 0x00007CD5, 9795: 0x00007CD6, 9796: 0x00007E0A, 9797: 0x00007E11, 9798: 0x00007E08, 9799: 0x00007E1B, 9800: 0x00007E23, 9801: 0x00007E1E, 9802: 0x00007E1D, 9803: 0x00007E09, 9804: 0x00007E10, 9805: 0x00007F79, 9806: 0x00007FB2, 9807: 0x00007FF0, 9808: 0x00007FF1, 9809: 0x00007FEE, 9810: 0x00008028, 9811: 0x000081B3, 9812: 0x000081A9, 9813: 0x000081A8, 9814: 0x000081FB, 9815: 0x00008208, 9816: 0x00008258, 9817: 0x00008259, 9818: 0x0000854A, 9819: 0x00008559, 9820: 0x00008548, 9821: 0x00008568, 9822: 0x00008569, 9823: 0x00008543, 9824: 0x00008549, 9825: 0x0000856D, 9826: 0x0000856A, 9827: 0x0000855E, 9828: 0x00008783, 9829: 0x0000879F, 9830: 0x0000879E, 9831: 0x000087A2, 9832: 0x0000878D, 9833: 0x00008861, 9834: 0x0000892A, 9835: 0x00008932, 9836: 0x00008925, 9837: 0x0000892B, 9838: 0x00008921, 9839: 0x000089AA, 9840: 0x000089A6, 9841: 0x00008AE6, 9842: 0x00008AFA, 9843: 0x00008AEB, 9844: 0x00008AF1, 9845: 0x00008B00, 9846: 0x00008ADC, 9847: 0x00008AE7, 9848: 0x00008AEE, 9849: 0x00008AFE, 9850: 0x00008B01, 9851: 0x00008B02, 9852: 0x00008AF7, 9853: 0x00008AED, 9854: 0x00008AF3, 9855: 0x00008AF6, 9856: 0x00008AFC, 9857: 0x00008C6B, 9858: 0x00008C6D, 9859: 0x00008C93, 9860: 0x00008CF4, 9861: 0x00008E44, 9862: 0x00008E31, 9863: 0x00008E34, 9864: 0x00008E42, 9865: 0x00008E39, 9866: 0x00008E35, 9867: 0x00008F3B, 9868: 0x00008F2F, 9869: 0x00008F38, 9870: 0x00008F33, 9871: 0x00008FA8, 9872: 0x00008FA6, 9873: 0x00009075, 9874: 0x00009074, 9875: 0x00009078, 9876: 0x00009072, 9877: 0x0000907C, 9878: 0x0000907A, 9879: 0x00009134, 9880: 0x00009192, 9881: 0x00009320, 9882: 0x00009336, 9883: 0x000092F8, 9884: 0x00009333, 9885: 0x0000932F, 9886: 0x00009322, 9887: 0x000092FC, 9888: 0x0000932B, 9889: 0x00009304, 9890: 0x0000931A, 9891: 0x00009310, 9892: 0x00009326, 9893: 0x00009321, 9894: 0x00009315, 9895: 0x0000932E, 9896: 0x00009319, 9897: 0x000095BB, 9898: 0x000096A7, 9899: 0x000096A8, 9900: 0x000096AA, 9901: 0x000096D5, 9902: 0x0000970E, 9903: 0x00009711, 9904: 0x00009716, 9905: 0x0000970D, 9906: 0x00009713, 9907: 0x0000970F, 9908: 0x0000975B, 9909: 0x0000975C, 9910: 0x00009766, 9911: 0x00009798, 9912: 0x00009830, 9913: 0x00009838, 9914: 0x0000983B, 9915: 0x00009837, 9916: 0x0000982D, 9917: 0x00009839, 9918: 0x00009824, 9919: 0x00009910, 9920: 0x00009928, 9921: 0x0000991E, 9922: 0x0000991B, 9923: 0x00009921, 9924: 0x0000991A, 9925: 0x000099ED, 9926: 0x000099E2, 9927: 0x000099F1, 9928: 0x00009AB8, 9929: 0x00009ABC, 9930: 0x00009AFB, 9931: 0x00009AED, 9932: 0x00009B28, 9933: 0x00009B91, 9934: 0x00009D15, 9935: 0x00009D23, 9936: 0x00009D26, 9937: 0x00009D28, 9938: 0x00009D12, 9939: 0x00009D1B, 9940: 0x00009ED8, 9941: 0x00009ED4, 9942: 0x00009F8D, 9943: 0x00009F9C, 9944: 0x0000512A, 9945: 0x0000511F, 9946: 0x00005121, 9947: 0x00005132, 9948: 0x000052F5, 9949: 0x0000568E, 9950: 0x00005680, 9951: 0x00005690, 9952: 0x00005685, 9953: 0x00005687, 9954: 0x0000568F, 9955: 0x000058D5, 9956: 0x000058D3, 9957: 0x000058D1, 9958: 0x000058CE, 9959: 0x00005B30, 9960: 0x00005B2A, 9961: 0x00005B24, 9962: 0x00005B7A, 9963: 0x00005C37, 9964: 0x00005C68, 9965: 0x00005DBC, 9966: 0x00005DBA, 9967: 0x00005DBD, 9968: 0x00005DB8, 9969: 0x00005E6B, 9970: 0x00005F4C, 9971: 0x00005FBD, 9972: 0x000061C9, 9973: 0x000061C2, 9974: 0x000061C7, 9975: 0x000061E6, 9976: 0x000061CB, 9977: 0x00006232, 9978: 0x00006234, 9979: 0x000064CE, 9980: 0x000064CA, 9981: 0x000064D8, 9982: 0x000064E0, 9983: 0x000064F0, 9984: 0x000064E6, 9985: 0x000064EC, 9986: 0x000064F1, 9987: 0x000064E2, 9988: 0x000064ED, 9989: 0x00006582, 9990: 0x00006583, 9991: 0x000066D9, 9992: 0x000066D6, 9993: 0x00006A80, 9994: 0x00006A94, 9995: 0x00006A84, 9996: 0x00006AA2, 9997: 0x00006A9C, 9998: 0x00006ADB, 9999: 0x00006AA3, 10000: 0x00006A7E, 10001: 0x00006A97, 10002: 0x00006A90, 10003: 0x00006AA0, 10004: 0x00006B5C, 10005: 0x00006BAE, 10006: 0x00006BDA, 10007: 0x00006C08, 10008: 0x00006FD8, 10009: 0x00006FF1, 10010: 0x00006FDF, 10011: 0x00006FE0, 10012: 0x00006FDB, 10013: 0x00006FE4, 10014: 0x00006FEB, 10015: 0x00006FEF, 10016: 0x00006F80, 10017: 0x00006FEC, 10018: 0x00006FE1, 10019: 0x00006FE9, 10020: 0x00006FD5, 10021: 0x00006FEE, 10022: 0x00006FF0, 10023: 0x000071E7, 10024: 0x000071DF, 10025: 0x000071EE, 10026: 0x000071E6, 10027: 0x000071E5, 10028: 0x000071ED, 10029: 0x000071EC, 10030: 0x000071F4, 10031: 0x000071E0, 10032: 0x00007235, 10033: 0x00007246, 10034: 0x00007370, 10035: 0x00007372, 10036: 0x000074A9, 10037: 0x000074B0, 10038: 0x000074A6, 10039: 0x000074A8, 10040: 0x00007646, 10041: 0x00007642, 10042: 0x0000764C, 10043: 0x000076EA, 10044: 0x000077B3, 10045: 0x000077AA, 10046: 0x000077B0, 10047: 0x000077AC, 10048: 0x000077A7, 10049: 0x000077AD, 10050: 0x000077EF, 10051: 0x000078F7, 10052: 0x000078FA, 10053: 0x000078F4, 10054: 0x000078EF, 10055: 0x00007901, 10056: 0x000079A7, 10057: 0x000079AA, 10058: 0x00007A57, 10059: 0x00007ABF, 10060: 0x00007C07, 10061: 0x00007C0D, 10062: 0x00007BFE, 10063: 0x00007BF7, 10064: 0x00007C0C, 10065: 0x00007BE0, 10066: 0x00007CE0, 10067: 0x00007CDC, 10068: 0x00007CDE, 10069: 0x00007CE2, 10070: 0x00007CDF, 10071: 0x00007CD9, 10072: 0x00007CDD, 10073: 0x00007E2E, 10074: 0x00007E3E, 10075: 0x00007E46, 10076: 0x00007E37, 10077: 0x00007E32, 10078: 0x00007E43, 10079: 0x00007E2B, 10080: 0x00007E3D, 10081: 0x00007E31, 10082: 0x00007E45, 10083: 0x00007E41, 10084: 0x00007E34, 10085: 0x00007E39, 10086: 0x00007E48, 10087: 0x00007E35, 10088: 0x00007E3F, 10089: 0x00007E2F, 10090: 0x00007F44, 10091: 0x00007FF3, 10092: 0x00007FFC, 10093: 0x00008071, 10094: 0x00008072, 10095: 0x00008070, 10096: 0x0000806F, 10097: 0x00008073, 10098: 0x000081C6, 10099: 0x000081C3, 10100: 0x000081BA, 10101: 0x000081C2, 10102: 0x000081C0, 10103: 0x000081BF, 10104: 0x000081BD, 10105: 0x000081C9, 10106: 0x000081BE, 10107: 0x000081E8, 10108: 0x00008209, 10109: 0x00008271, 10110: 0x000085AA, 10111: 0x00008584, 10112: 0x0000857E, 10113: 0x0000859C, 10114: 0x00008591, 10115: 0x00008594, 10116: 0x000085AF, 10117: 0x0000859B, 10118: 0x00008587, 10119: 0x000085A8, 10120: 0x0000858A, 10121: 0x00008667, 10122: 0x000087C0, 10123: 0x000087D1, 10124: 0x000087B3, 10125: 0x000087D2, 10126: 0x000087C6, 10127: 0x000087AB, 10128: 0x000087BB, 10129: 0x000087BA, 10130: 0x000087C8, 10131: 0x000087CB, 10132: 0x0000893B, 10133: 0x00008936, 10134: 0x00008944, 10135: 0x00008938, 10136: 0x0000893D, 10137: 0x000089AC, 10138: 0x00008B0E, 10139: 0x00008B17, 10140: 0x00008B19, 10141: 0x00008B1B, 10142: 0x00008B0A, 10143: 0x00008B20, 10144: 0x00008B1D, 10145: 0x00008B04, 10146: 0x00008B10, 10147: 0x00008C41, 10148: 0x00008C3F, 10149: 0x00008C73, 10150: 0x00008CFA, 10151: 0x00008CFD, 10152: 0x00008CFC, 10153: 0x00008CF8, 10154: 0x00008CFB, 10155: 0x00008DA8, 10156: 0x00008E49, 10157: 0x00008E4B, 10158: 0x00008E48, 10159: 0x00008E4A, 10160: 0x00008F44, 10161: 0x00008F3E, 10162: 0x00008F42, 10163: 0x00008F45, 10164: 0x00008F3F, 10165: 0x0000907F, 10166: 0x0000907D, 10167: 0x00009084, 10168: 0x00009081, 10169: 0x00009082, 10170: 0x00009080, 10171: 0x00009139, 10172: 0x000091A3, 10173: 0x0000919E, 10174: 0x0000919C, 10175: 0x0000934D, 10176: 0x00009382, 10177: 0x00009328, 10178: 0x00009375, 10179: 0x0000934A, 10180: 0x00009365, 10181: 0x0000934B, 10182: 0x00009318, 10183: 0x0000937E, 10184: 0x0000936C, 10185: 0x0000935B, 10186: 0x00009370, 10187: 0x0000935A, 10188: 0x00009354, 10189: 0x000095CA, 10190: 0x000095CB, 10191: 0x000095CC, 10192: 0x000095C8, 10193: 0x000095C6, 10194: 0x000096B1, 10195: 0x000096B8, 10196: 0x000096D6, 10197: 0x0000971C, 10198: 0x0000971E, 10199: 0x000097A0, 10200: 0x000097D3, 10201: 0x00009846, 10202: 0x000098B6, 10203: 0x00009935, 10204: 0x00009A01, 10205: 0x000099FF, 10206: 0x00009BAE, 10207: 0x00009BAB, 10208: 0x00009BAA, 10209: 0x00009BAD, 10210: 0x00009D3B, 10211: 0x00009D3F, 10212: 0x00009E8B, 10213: 0x00009ECF, 10214: 0x00009EDE, 10215: 0x00009EDC, 10216: 0x00009EDD, 10217: 0x00009EDB, 10218: 0x00009F3E, 10219: 0x00009F4B, 10220: 0x000053E2, 10221: 0x00005695, 10222: 0x000056AE, 10223: 0x000058D9, 10224: 0x000058D8, 10225: 0x00005B38, 10226: 0x00005F5D, 10227: 0x000061E3, 10228: 0x00006233, 10229: 0x000064F4, 10230: 0x000064F2, 10231: 0x000064FE, 10232: 0x00006506, 10233: 0x000064FA, 10234: 0x000064FB, 10235: 0x000064F7, 10236: 0x000065B7, 10237: 0x000066DC, 10238: 0x00006726, 10239: 0x00006AB3, 10240: 0x00006AAC, 10241: 0x00006AC3, 10242: 0x00006ABB, 10243: 0x00006AB8, 10244: 0x00006AC2, 10245: 0x00006AAE, 10246: 0x00006AAF, 10247: 0x00006B5F, 10248: 0x00006B78, 10249: 0x00006BAF, 10250: 0x00007009, 10251: 0x0000700B, 10252: 0x00006FFE, 10253: 0x00007006, 10254: 0x00006FFA, 10255: 0x00007011, 10256: 0x0000700F, 10257: 0x000071FB, 10258: 0x000071FC, 10259: 0x000071FE, 10260: 0x000071F8, 10261: 0x00007377, 10262: 0x00007375, 10263: 0x000074A7, 10264: 0x000074BF, 10265: 0x00007515, 10266: 0x00007656, 10267: 0x00007658, 10268: 0x00007652, 10269: 0x000077BD, 10270: 0x000077BF, 10271: 0x000077BB, 10272: 0x000077BC, 10273: 0x0000790E, 10274: 0x000079AE, 10275: 0x00007A61, 10276: 0x00007A62, 10277: 0x00007A60, 10278: 0x00007AC4, 10279: 0x00007AC5, 10280: 0x00007C2B, 10281: 0x00007C27, 10282: 0x00007C2A, 10283: 0x00007C1E, 10284: 0x00007C23, 10285: 0x00007C21, 10286: 0x00007CE7, 10287: 0x00007E54, 10288: 0x00007E55, 10289: 0x00007E5E, 10290: 0x00007E5A, 10291: 0x00007E61, 10292: 0x00007E52, 10293: 0x00007E59, 10294: 0x00007F48, 10295: 0x00007FF9, 10296: 0x00007FFB, 10297: 0x00008077, 10298: 0x00008076, 10299: 0x000081CD, 10300: 0x000081CF, 10301: 0x0000820A, 10302: 0x000085CF, 10303: 0x000085A9, 10304: 0x000085CD, 10305: 0x000085D0, 10306: 0x000085C9, 10307: 0x000085B0, 10308: 0x000085BA, 10309: 0x000085B9, 10310: 0x000085A6, 10311: 0x000087EF, 10312: 0x000087EC, 10313: 0x000087F2, 10314: 0x000087E0, 10315: 0x00008986, 10316: 0x000089B2, 10317: 0x000089F4, 10318: 0x00008B28, 10319: 0x00008B39, 10320: 0x00008B2C, 10321: 0x00008B2B, 10322: 0x00008C50, 10323: 0x00008D05, 10324: 0x00008E59, 10325: 0x00008E63, 10326: 0x00008E66, 10327: 0x00008E64, 10328: 0x00008E5F, 10329: 0x00008E55, 10330: 0x00008EC0, 10331: 0x00008F49, 10332: 0x00008F4D, 10333: 0x00009087, 10334: 0x00009083, 10335: 0x00009088, 10336: 0x000091AB, 10337: 0x000091AC, 10338: 0x000091D0, 10339: 0x00009394, 10340: 0x0000938A, 10341: 0x00009396, 10342: 0x000093A2, 10343: 0x000093B3, 10344: 0x000093AE, 10345: 0x000093AC, 10346: 0x000093B0, 10347: 0x00009398, 10348: 0x0000939A, 10349: 0x00009397, 10350: 0x000095D4, 10351: 0x000095D6, 10352: 0x000095D0, 10353: 0x000095D5, 10354: 0x000096E2, 10355: 0x000096DC, 10356: 0x000096D9, 10357: 0x000096DB, 10358: 0x000096DE, 10359: 0x00009724, 10360: 0x000097A3, 10361: 0x000097A6, 10362: 0x000097AD, 10363: 0x000097F9, 10364: 0x0000984D, 10365: 0x0000984F, 10366: 0x0000984C, 10367: 0x0000984E, 10368: 0x00009853, 10369: 0x000098BA, 10370: 0x0000993E, 10371: 0x0000993F, 10372: 0x0000993D, 10373: 0x0000992E, 10374: 0x000099A5, 10375: 0x00009A0E, 10376: 0x00009AC1, 10377: 0x00009B03, 10378: 0x00009B06, 10379: 0x00009B4F, 10380: 0x00009B4E, 10381: 0x00009B4D, 10382: 0x00009BCA, 10383: 0x00009BC9, 10384: 0x00009BFD, 10385: 0x00009BC8, 10386: 0x00009BC0, 10387: 0x00009D51, 10388: 0x00009D5D, 10389: 0x00009D60, 10390: 0x00009EE0, 10391: 0x00009F15, 10392: 0x00009F2C, 10393: 0x00005133, 10394: 0x000056A5, 10395: 0x000058DE, 10396: 0x000058DF, 10397: 0x000058E2, 10398: 0x00005BF5, 10399: 0x00009F90, 10400: 0x00005EEC, 10401: 0x000061F2, 10402: 0x000061F7, 10403: 0x000061F6, 10404: 0x000061F5, 10405: 0x00006500, 10406: 0x0000650F, 10407: 0x000066E0, 10408: 0x000066DD, 10409: 0x00006AE5, 10410: 0x00006ADD, 10411: 0x00006ADA, 10412: 0x00006AD3, 10413: 0x0000701B, 10414: 0x0000701F, 10415: 0x00007028, 10416: 0x0000701A, 10417: 0x0000701D, 10418: 0x00007015, 10419: 0x00007018, 10420: 0x00007206, 10421: 0x0000720D, 10422: 0x00007258, 10423: 0x000072A2, 10424: 0x00007378, 10425: 0x0000737A, 10426: 0x000074BD, 10427: 0x000074CA, 10428: 0x000074E3, 10429: 0x00007587, 10430: 0x00007586, 10431: 0x0000765F, 10432: 0x00007661, 10433: 0x000077C7, 10434: 0x00007919, 10435: 0x000079B1, 10436: 0x00007A6B, 10437: 0x00007A69, 10438: 0x00007C3E, 10439: 0x00007C3F, 10440: 0x00007C38, 10441: 0x00007C3D, 10442: 0x00007C37, 10443: 0x00007C40, 10444: 0x00007E6B, 10445: 0x00007E6D, 10446: 0x00007E79, 10447: 0x00007E69, 10448: 0x00007E6A, 10449: 0x00007F85, 10450: 0x00007E73, 10451: 0x00007FB6, 10452: 0x00007FB9, 10453: 0x00007FB8, 10454: 0x000081D8, 10455: 0x000085E9, 10456: 0x000085DD, 10457: 0x000085EA, 10458: 0x000085D5, 10459: 0x000085E4, 10460: 0x000085E5, 10461: 0x000085F7, 10462: 0x000087FB, 10463: 0x00008805, 10464: 0x0000880D, 10465: 0x000087F9, 10466: 0x000087FE, 10467: 0x00008960, 10468: 0x0000895F, 10469: 0x00008956, 10470: 0x0000895E, 10471: 0x00008B41, 10472: 0x00008B5C, 10473: 0x00008B58, 10474: 0x00008B49, 10475: 0x00008B5A, 10476: 0x00008B4E, 10477: 0x00008B4F, 10478: 0x00008B46, 10479: 0x00008B59, 10480: 0x00008D08, 10481: 0x00008D0A, 10482: 0x00008E7C, 10483: 0x00008E72, 10484: 0x00008E87, 10485: 0x00008E76, 10486: 0x00008E6C, 10487: 0x00008E7A, 10488: 0x00008E74, 10489: 0x00008F54, 10490: 0x00008F4E, 10491: 0x00008FAD, 10492: 0x0000908A, 10493: 0x0000908B, 10494: 0x000091B1, 10495: 0x000091AE, 10496: 0x000093E1, 10497: 0x000093D1, 10498: 0x000093DF, 10499: 0x000093C3, 10500: 0x000093C8, 10501: 0x000093DC, 10502: 0x000093DD, 10503: 0x000093D6, 10504: 0x000093E2, 10505: 0x000093CD, 10506: 0x000093D8, 10507: 0x000093E4, 10508: 0x000093D7, 10509: 0x000093E8, 10510: 0x000095DC, 10511: 0x000096B4, 10512: 0x000096E3, 10513: 0x0000972A, 10514: 0x00009727, 10515: 0x00009761, 10516: 0x000097DC, 10517: 0x000097FB, 10518: 0x0000985E, 10519: 0x00009858, 10520: 0x0000985B, 10521: 0x000098BC, 10522: 0x00009945, 10523: 0x00009949, 10524: 0x00009A16, 10525: 0x00009A19, 10526: 0x00009B0D, 10527: 0x00009BE8, 10528: 0x00009BE7, 10529: 0x00009BD6, 10530: 0x00009BDB, 10531: 0x00009D89, 10532: 0x00009D61, 10533: 0x00009D72, 10534: 0x00009D6A, 10535: 0x00009D6C, 10536: 0x00009E92, 10537: 0x00009E97, 10538: 0x00009E93, 10539: 0x00009EB4, 10540: 0x000052F8, 10541: 0x000056A8, 10542: 0x000056B7, 10543: 0x000056B6, 10544: 0x000056B4, 10545: 0x000056BC, 10546: 0x000058E4, 10547: 0x00005B40, 10548: 0x00005B43, 10549: 0x00005B7D, 10550: 0x00005BF6, 10551: 0x00005DC9, 10552: 0x000061F8, 10553: 0x000061FA, 10554: 0x00006518, 10555: 0x00006514, 10556: 0x00006519, 10557: 0x000066E6, 10558: 0x00006727, 10559: 0x00006AEC, 10560: 0x0000703E, 10561: 0x00007030, 10562: 0x00007032, 10563: 0x00007210, 10564: 0x0000737B, 10565: 0x000074CF, 10566: 0x00007662, 10567: 0x00007665, 10568: 0x00007926, 10569: 0x0000792A, 10570: 0x0000792C, 10571: 0x0000792B, 10572: 0x00007AC7, 10573: 0x00007AF6, 10574: 0x00007C4C, 10575: 0x00007C43, 10576: 0x00007C4D, 10577: 0x00007CEF, 10578: 0x00007CF0, 10579: 0x00008FAE, 10580: 0x00007E7D, 10581: 0x00007E7C, 10582: 0x00007E82, 10583: 0x00007F4C, 10584: 0x00008000, 10585: 0x000081DA, 10586: 0x00008266, 10587: 0x000085FB, 10588: 0x000085F9, 10589: 0x00008611, 10590: 0x000085FA, 10591: 0x00008606, 10592: 0x0000860B, 10593: 0x00008607, 10594: 0x0000860A, 10595: 0x00008814, 10596: 0x00008815, 10597: 0x00008964, 10598: 0x000089BA, 10599: 0x000089F8, 10600: 0x00008B70, 10601: 0x00008B6C, 10602: 0x00008B66, 10603: 0x00008B6F, 10604: 0x00008B5F, 10605: 0x00008B6B, 10606: 0x00008D0F, 10607: 0x00008D0D, 10608: 0x00008E89, 10609: 0x00008E81, 10610: 0x00008E85, 10611: 0x00008E82, 10612: 0x000091B4, 10613: 0x000091CB, 10614: 0x00009418, 10615: 0x00009403, 10616: 0x000093FD, 10617: 0x000095E1, 10618: 0x00009730, 10619: 0x000098C4, 10620: 0x00009952, 10621: 0x00009951, 10622: 0x000099A8, 10623: 0x00009A2B, 10624: 0x00009A30, 10625: 0x00009A37, 10626: 0x00009A35, 10627: 0x00009C13, 10628: 0x00009C0D, 10629: 0x00009E79, 10630: 0x00009EB5, 10631: 0x00009EE8, 10632: 0x00009F2F, 10633: 0x00009F5F, 10634: 0x00009F63, 10635: 0x00009F61, 10636: 0x00005137, 10637: 0x00005138, 10638: 0x000056C1, 10639: 0x000056C0, 10640: 0x000056C2, 10641: 0x00005914, 10642: 0x00005C6C, 10643: 0x00005DCD, 10644: 0x000061FC, 10645: 0x000061FE, 10646: 0x0000651D, 10647: 0x0000651C, 10648: 0x00006595, 10649: 0x000066E9, 10650: 0x00006AFB, 10651: 0x00006B04, 10652: 0x00006AFA, 10653: 0x00006BB2, 10654: 0x0000704C, 10655: 0x0000721B, 10656: 0x000072A7, 10657: 0x000074D6, 10658: 0x000074D4, 10659: 0x00007669, 10660: 0x000077D3, 10661: 0x00007C50, 10662: 0x00007E8F, 10663: 0x00007E8C, 10664: 0x00007FBC, 10665: 0x00008617, 10666: 0x0000862D, 10667: 0x0000861A, 10668: 0x00008823, 10669: 0x00008822, 10670: 0x00008821, 10671: 0x0000881F, 10672: 0x0000896A, 10673: 0x0000896C, 10674: 0x000089BD, 10675: 0x00008B74, 10676: 0x00008B77, 10677: 0x00008B7D, 10678: 0x00008D13, 10679: 0x00008E8A, 10680: 0x00008E8D, 10681: 0x00008E8B, 10682: 0x00008F5F, 10683: 0x00008FAF, 10684: 0x000091BA, 10685: 0x0000942E, 10686: 0x00009433, 10687: 0x00009435, 10688: 0x0000943A, 10689: 0x00009438, 10690: 0x00009432, 10691: 0x0000942B, 10692: 0x000095E2, 10693: 0x00009738, 10694: 0x00009739, 10695: 0x00009732, 10696: 0x000097FF, 10697: 0x00009867, 10698: 0x00009865, 10699: 0x00009957, 10700: 0x00009A45, 10701: 0x00009A43, 10702: 0x00009A40, 10703: 0x00009A3E, 10704: 0x00009ACF, 10705: 0x00009B54, 10706: 0x00009B51, 10707: 0x00009C2D, 10708: 0x00009C25, 10709: 0x00009DAF, 10710: 0x00009DB4, 10711: 0x00009DC2, 10712: 0x00009DB8, 10713: 0x00009E9D, 10714: 0x00009EEF, 10715: 0x00009F19, 10716: 0x00009F5C, 10717: 0x00009F66, 10718: 0x00009F67, 10719: 0x0000513C, 10720: 0x0000513B, 10721: 0x000056C8, 10722: 0x000056CA, 10723: 0x000056C9, 10724: 0x00005B7F, 10725: 0x00005DD4, 10726: 0x00005DD2, 10727: 0x00005F4E, 10728: 0x000061FF, 10729: 0x00006524, 10730: 0x00006B0A, 10731: 0x00006B61, 10732: 0x00007051, 10733: 0x00007058, 10734: 0x00007380, 10735: 0x000074E4, 10736: 0x0000758A, 10737: 0x0000766E, 10738: 0x0000766C, 10739: 0x000079B3, 10740: 0x00007C60, 10741: 0x00007C5F, 10742: 0x0000807E, 10743: 0x0000807D, 10744: 0x000081DF, 10745: 0x00008972, 10746: 0x0000896F, 10747: 0x000089FC, 10748: 0x00008B80, 10749: 0x00008D16, 10750: 0x00008D17, 10751: 0x00008E91, 10752: 0x00008E93, 10753: 0x00008F61, 10754: 0x00009148, 10755: 0x00009444, 10756: 0x00009451, 10757: 0x00009452, 10758: 0x0000973D, 10759: 0x0000973E, 10760: 0x000097C3, 10761: 0x000097C1, 10762: 0x0000986B, 10763: 0x00009955, 10764: 0x00009A55, 10765: 0x00009A4D, 10766: 0x00009AD2, 10767: 0x00009B1A, 10768: 0x00009C49, 10769: 0x00009C31, 10770: 0x00009C3E, 10771: 0x00009C3B, 10772: 0x00009DD3, 10773: 0x00009DD7, 10774: 0x00009F34, 10775: 0x00009F6C, 10776: 0x00009F6A, 10777: 0x00009F94, 10778: 0x000056CC, 10779: 0x00005DD6, 10780: 0x00006200, 10781: 0x00006523, 10782: 0x0000652B, 10783: 0x0000652A, 10784: 0x000066EC, 10785: 0x00006B10, 10786: 0x000074DA, 10787: 0x00007ACA, 10788: 0x00007C64, 10789: 0x00007C63, 10790: 0x00007C65, 10791: 0x00007E93, 10792: 0x00007E96, 10793: 0x00007E94, 10794: 0x000081E2, 10795: 0x00008638, 10796: 0x0000863F, 10797: 0x00008831, 10798: 0x00008B8A, 10799: 0x00009090, 10800: 0x0000908F, 10801: 0x00009463, 10802: 0x00009460, 10803: 0x00009464, 10804: 0x00009768, 10805: 0x0000986F, 10806: 0x0000995C, 10807: 0x00009A5A, 10808: 0x00009A5B, 10809: 0x00009A57, 10810: 0x00009AD3, 10811: 0x00009AD4, 10812: 0x00009AD1, 10813: 0x00009C54, 10814: 0x00009C57, 10815: 0x00009C56, 10816: 0x00009DE5, 10817: 0x00009E9F, 10818: 0x00009EF4, 10819: 0x000056D1, 10820: 0x000058E9, 10821: 0x0000652C, 10822: 0x0000705E, 10823: 0x00007671, 10824: 0x00007672, 10825: 0x000077D7, 10826: 0x00007F50, 10827: 0x00007F88, 10828: 0x00008836, 10829: 0x00008839, 10830: 0x00008862, 10831: 0x00008B93, 10832: 0x00008B92, 10833: 0x00008B96, 10834: 0x00008277, 10835: 0x00008D1B, 10836: 0x000091C0, 10837: 0x0000946A, 10838: 0x00009742, 10839: 0x00009748, 10840: 0x00009744, 10841: 0x000097C6, 10842: 0x00009870, 10843: 0x00009A5F, 10844: 0x00009B22, 10845: 0x00009B58, 10846: 0x00009C5F, 10847: 0x00009DF9, 10848: 0x00009DFA, 10849: 0x00009E7C, 10850: 0x00009E7D, 10851: 0x00009F07, 10852: 0x00009F77, 10853: 0x00009F72, 10854: 0x00005EF3, 10855: 0x00006B16, 10856: 0x00007063, 10857: 0x00007C6C, 10858: 0x00007C6E, 10859: 0x0000883B, 10860: 0x000089C0, 10861: 0x00008EA1, 10862: 0x000091C1, 10863: 0x00009472, 10864: 0x00009470, 10865: 0x00009871, 10866: 0x0000995E, 10867: 0x00009AD6, 10868: 0x00009B23, 10869: 0x00009ECC, 10870: 0x00007064, 10871: 0x000077DA, 10872: 0x00008B9A, 10873: 0x00009477, 10874: 0x000097C9, 10875: 0x00009A62, 10876: 0x00009A65, 10877: 0x00007E9C, 10878: 0x00008B9C, 10879: 0x00008EAA, 10880: 0x000091C5, 10881: 0x0000947D, 10882: 0x0000947E, 10883: 0x0000947C, 10884: 0x00009C77, 10885: 0x00009C78, 10886: 0x00009EF7, 10887: 0x00008C54, 10888: 0x0000947F, 10889: 0x00009E1A, 10890: 0x00007228, 10891: 0x00009A6A, 10892: 0x00009B31, 10893: 0x00009E1B, 10894: 0x00009E1E, 10895: 0x00007C72, 10896: 0x00002460, 10897: 0x00002461, 10898: 0x00002462, 10899: 0x00002463, 10900: 0x00002464, 10901: 0x00002465, 10902: 0x00002466, 10903: 0x00002467, 10904: 0x00002468, 10905: 0x00002469, 10906: 0x00002474, 10907: 0x00002475, 10908: 0x00002476, 10909: 0x00002477, 10910: 0x00002478, 10911: 0x00002479, 10912: 0x0000247A, 10913: 0x0000247B, 10914: 0x0000247C, 10915: 0x0000247D, 10916: 0x00002170, 10917: 0x00002171, 10918: 0x00002172, 10919: 0x00002173, 10920: 0x00002174, 10921: 0x00002175, 10922: 0x00002176, 10923: 0x00002177, 10924: 0x00002178, 10925: 0x00002179, 10926: 0x00004E36, 10927: 0x00004E3F, 10928: 0x00004E85, 10929: 0x00004EA0, 10930: 0x00005182, 10931: 0x00005196, 10932: 0x000051AB, 10933: 0x000052F9, 10934: 0x00005338, 10935: 0x00005369, 10936: 0x000053B6, 10937: 0x0000590A, 10938: 0x00005B80, 10939: 0x00005DDB, 10940: 0x00002F33, 10941: 0x00005E7F, 10942: 0x00005EF4, 10943: 0x00005F50, 10944: 0x00005F61, 10945: 0x00006534, 10946: 0x000065E0, 10947: 0x00007592, 10948: 0x00007676, 10949: 0x00008FB5, 10950: 0x000096B6, 10951: 0x000000A8, 10952: 0x000002C6, 10953: 0x000030FD, 10954: 0x000030FE, 10955: 0x0000309D, 10956: 0x0000309E, 10957: 0x00003003, 10958: 0x00004EDD, 10959: 0x00003005, 10960: 0x00003006, 10961: 0x00003007, 10962: 0x000030FC, 10963: 0x0000FF3B, 10964: 0x0000FF3D, 10965: 0x0000273D, 10966: 0x00003041, 10967: 0x00003042, 10968: 0x00003043, 10969: 0x00003044, 10970: 0x00003045, 10971: 0x00003046, 10972: 0x00003047, 10973: 0x00003048, 10974: 0x00003049, 10975: 0x0000304A, 10976: 0x0000304B, 10977: 0x0000304C, 10978: 0x0000304D, 10979: 0x0000304E, 10980: 0x0000304F, 10981: 0x00003050, 10982: 0x00003051, 10983: 0x00003052, 10984: 0x00003053, 10985: 0x00003054, 10986: 0x00003055, 10987: 0x00003056, 10988: 0x00003057, 10989: 0x00003058, 10990: 0x00003059, 10991: 0x0000305A, 10992: 0x0000305B, 10993: 0x0000305C, 10994: 0x0000305D, 10995: 0x0000305E, 10996: 0x0000305F, 10997: 0x00003060, 10998: 0x00003061, 10999: 0x00003062, 11000: 0x00003063, 11001: 0x00003064, 11002: 0x00003065, 11003: 0x00003066, 11004: 0x00003067, 11005: 0x00003068, 11006: 0x00003069, 11007: 0x0000306A, 11008: 0x0000306B, 11009: 0x0000306C, 11010: 0x0000306D, 11011: 0x0000306E, 11012: 0x0000306F, 11013: 0x00003070, 11014: 0x00003071, 11015: 0x00003072, 11016: 0x00003073, 11017: 0x00003074, 11018: 0x00003075, 11019: 0x00003076, 11020: 0x00003077, 11021: 0x00003078, 11022: 0x00003079, 11023: 0x0000307A, 11024: 0x0000307B, 11025: 0x0000307C, 11026: 0x0000307D, 11027: 0x0000307E, 11028: 0x0000307F, 11029: 0x00003080, 11030: 0x00003081, 11031: 0x00003082, 11032: 0x00003083, 11033: 0x00003084, 11034: 0x00003085, 11035: 0x00003086, 11036: 0x00003087, 11037: 0x00003088, 11038: 0x00003089, 11039: 0x0000308A, 11040: 0x0000308B, 11041: 0x0000308C, 11042: 0x0000308D, 11043: 0x0000308E, 11044: 0x0000308F, 11045: 0x00003090, 11046: 0x00003091, 11047: 0x00003092, 11048: 0x00003093, 11049: 0x000030A1, 11050: 0x000030A2, 11051: 0x000030A3, 11052: 0x000030A4, 11053: 0x000030A5, 11054: 0x000030A6, 11055: 0x000030A7, 11056: 0x000030A8, 11057: 0x000030A9, 11058: 0x000030AA, 11059: 0x000030AB, 11060: 0x000030AC, 11061: 0x000030AD, 11062: 0x000030AE, 11063: 0x000030AF, 11064: 0x000030B0, 11065: 0x000030B1, 11066: 0x000030B2, 11067: 0x000030B3, 11068: 0x000030B4, 11069: 0x000030B5, 11070: 0x000030B6, 11071: 0x000030B7, 11072: 0x000030B8, 11073: 0x000030B9, 11074: 0x000030BA, 11075: 0x000030BB, 11076: 0x000030BC, 11077: 0x000030BD, 11078: 0x000030BE, 11079: 0x000030BF, 11080: 0x000030C0, 11081: 0x000030C1, 11082: 0x000030C2, 11083: 0x000030C3, 11084: 0x000030C4, 11085: 0x000030C5, 11086: 0x000030C6, 11087: 0x000030C7, 11088: 0x000030C8, 11089: 0x000030C9, 11090: 0x000030CA, 11091: 0x000030CB, 11092: 0x000030CC, 11093: 0x000030CD, 11094: 0x000030CE, 11095: 0x000030CF, 11096: 0x000030D0, 11097: 0x000030D1, 11098: 0x000030D2, 11099: 0x000030D3, 11100: 0x000030D4, 11101: 0x000030D5, 11102: 0x000030D6, 11103: 0x000030D7, 11104: 0x000030D8, 11105: 0x000030D9, 11106: 0x000030DA, 11107: 0x000030DB, 11108: 0x000030DC, 11109: 0x000030DD, 11110: 0x000030DE, 11111: 0x000030DF, 11112: 0x000030E0, 11113: 0x000030E1, 11114: 0x000030E2, 11115: 0x000030E3, 11116: 0x000030E4, 11117: 0x000030E5, 11118: 0x000030E6, 11119: 0x000030E7, 11120: 0x000030E8, 11121: 0x000030E9, 11122: 0x000030EA, 11123: 0x000030EB, 11124: 0x000030EC, 11125: 0x000030ED, 11126: 0x000030EE, 11127: 0x000030EF, 11128: 0x000030F0, 11129: 0x000030F1, 11130: 0x000030F2, 11131: 0x000030F3, 11132: 0x000030F4, 11133: 0x000030F5, 11134: 0x000030F6, 11135: 0x00000410, 11136: 0x00000411, 11137: 0x00000412, 11138: 0x00000413, 11139: 0x00000414, 11140: 0x00000415, 11141: 0x00000401, 11142: 0x00000416, 11143: 0x00000417, 11144: 0x00000418, 11145: 0x00000419, 11146: 0x0000041A, 11147: 0x0000041B, 11148: 0x0000041C, 11149: 0x0000041D, 11150: 0x0000041E, 11151: 0x0000041F, 11152: 0x00000420, 11153: 0x00000421, 11154: 0x00000422, 11155: 0x00000423, 11156: 0x00000424, 11157: 0x00000425, 11158: 0x00000426, 11159: 0x00000427, 11160: 0x00000428, 11161: 0x00000429, 11162: 0x0000042A, 11163: 0x0000042B, 11164: 0x0000042C, 11165: 0x0000042D, 11166: 0x0000042E, 11167: 0x0000042F, 11168: 0x00000430, 11169: 0x00000431, 11170: 0x00000432, 11171: 0x00000433, 11172: 0x00000434, 11173: 0x00000435, 11174: 0x00000451, 11175: 0x00000436, 11176: 0x00000437, 11177: 0x00000438, 11178: 0x00000439, 11179: 0x0000043A, 11180: 0x0000043B, 11181: 0x0000043C, 11182: 0x0000043D, 11183: 0x0000043E, 11184: 0x0000043F, 11185: 0x00000440, 11186: 0x00000441, 11187: 0x00000442, 11188: 0x00000443, 11189: 0x00000444, 11190: 0x00000445, 11191: 0x00000446, 11192: 0x00000447, 11193: 0x00000448, 11194: 0x00000449, 11195: 0x0000044A, 11196: 0x0000044B, 11197: 0x0000044C, 11198: 0x0000044D, 11199: 0x0000044E, 11200: 0x0000044F, 11201: 0x000021E7, 11202: 0x000021B8, 11203: 0x000021B9, 11204: 0x000031CF, 11205: 0x000200CC, 11206: 0x00004E5A, 11207: 0x0002008A, 11208: 0x00005202, 11209: 0x00004491, 11210: 0x00009FB0, 11211: 0x00005188, 11212: 0x00009FB1, 11213: 0x00027607, 11254: 0x0000FFE2, 11255: 0x0000FFE4, 11256: 0x0000FF07, 11257: 0x0000FF02, 11258: 0x00003231, 11259: 0x00002116, 11260: 0x00002121, 11261: 0x0000309B, 11262: 0x0000309C, 11263: 0x00002E80, 11264: 0x00002E84, 11265: 0x00002E86, 11266: 0x00002E87, 11267: 0x00002E88, 11268: 0x00002E8A, 11269: 0x00002E8C, 11270: 0x00002E8D, 11271: 0x00002E95, 11272: 0x00002E9C, 11273: 0x00002E9D, 11274: 0x00002EA5, 11275: 0x00002EA7, 11276: 0x00002EAA, 11277: 0x00002EAC, 11278: 0x00002EAE, 11279: 0x00002EB6, 11280: 0x00002EBC, 11281: 0x00002EBE, 11282: 0x00002EC6, 11283: 0x00002ECA, 11284: 0x00002ECC, 11285: 0x00002ECD, 11286: 0x00002ECF, 11287: 0x00002ED6, 11288: 0x00002ED7, 11289: 0x00002EDE, 11290: 0x00002EE3, 11294: 0x00000283, 11295: 0x00000250, 11296: 0x0000025B, 11297: 0x00000254, 11298: 0x00000275, 11299: 0x00000153, 11300: 0x000000F8, 11301: 0x0000014B, 11302: 0x0000028A, 11303: 0x0000026A, 11304: 0x00004E42, 11305: 0x00004E5C, 11306: 0x000051F5, 11307: 0x0000531A, 11308: 0x00005382, 11309: 0x00004E07, 11310: 0x00004E0C, 11311: 0x00004E47, 11312: 0x00004E8D, 11313: 0x000056D7, 11314: 0x0000FA0C, 11315: 0x00005C6E, 11316: 0x00005F73, 11317: 0x00004E0F, 11318: 0x00005187, 11319: 0x00004E0E, 11320: 0x00004E2E, 11321: 0x00004E93, 11322: 0x00004EC2, 11323: 0x00004EC9, 11324: 0x00004EC8, 11325: 0x00005198, 11326: 0x000052FC, 11327: 0x0000536C, 11328: 0x000053B9, 11329: 0x00005720, 11330: 0x00005903, 11331: 0x0000592C, 11332: 0x00005C10, 11333: 0x00005DFF, 11334: 0x000065E1, 11335: 0x00006BB3, 11336: 0x00006BCC, 11337: 0x00006C14, 11338: 0x0000723F, 11339: 0x00004E31, 11340: 0x00004E3C, 11341: 0x00004EE8, 11342: 0x00004EDC, 11343: 0x00004EE9, 11344: 0x00004EE1, 11345: 0x00004EDD, 11346: 0x00004EDA, 11347: 0x0000520C, 11348: 0x0000531C, 11349: 0x0000534C, 11350: 0x00005722, 11351: 0x00005723, 11352: 0x00005917, 11353: 0x0000592F, 11354: 0x00005B81, 11355: 0x00005B84, 11356: 0x00005C12, 11357: 0x00005C3B, 11358: 0x00005C74, 11359: 0x00005C73, 11360: 0x00005E04, 11361: 0x00005E80, 11362: 0x00005E82, 11363: 0x00005FC9, 11364: 0x00006209, 11365: 0x00006250, 11366: 0x00006C15, 11367: 0x00006C36, 11368: 0x00006C43, 11369: 0x00006C3F, 11370: 0x00006C3B, 11371: 0x000072AE, 11372: 0x000072B0, 11373: 0x0000738A, 11374: 0x000079B8, 11375: 0x0000808A, 11376: 0x0000961E, 11377: 0x00004F0E, 11378: 0x00004F18, 11379: 0x00004F2C, 11380: 0x00004EF5, 11381: 0x00004F14, 11382: 0x00004EF1, 11383: 0x00004F00, 11384: 0x00004EF7, 11385: 0x00004F08, 11386: 0x00004F1D, 11387: 0x00004F02, 11388: 0x00004F05, 11389: 0x00004F22, 11390: 0x00004F13, 11391: 0x00004F04, 11392: 0x00004EF4, 11393: 0x00004F12, 11394: 0x000051B1, 11395: 0x00005213, 11396: 0x00005209, 11397: 0x00005210, 11398: 0x000052A6, 11399: 0x00005322, 11400: 0x0000531F, 11401: 0x0000534D, 11402: 0x0000538A, 11403: 0x00005407, 11404: 0x000056E1, 11405: 0x000056DF, 11406: 0x0000572E, 11407: 0x0000572A, 11408: 0x00005734, 11409: 0x0000593C, 11410: 0x00005980, 11411: 0x0000597C, 11412: 0x00005985, 11413: 0x0000597B, 11414: 0x0000597E, 11415: 0x00005977, 11416: 0x0000597F, 11417: 0x00005B56, 11418: 0x00005C15, 11419: 0x00005C25, 11420: 0x00005C7C, 11421: 0x00005C7A, 11422: 0x00005C7B, 11423: 0x00005C7E, 11424: 0x00005DDF, 11425: 0x00005E75, 11426: 0x00005E84, 11427: 0x00005F02, 11428: 0x00005F1A, 11429: 0x00005F74, 11430: 0x00005FD5, 11431: 0x00005FD4, 11432: 0x00005FCF, 11433: 0x0000625C, 11434: 0x0000625E, 11435: 0x00006264, 11436: 0x00006261, 11437: 0x00006266, 11438: 0x00006262, 11439: 0x00006259, 11440: 0x00006260, 11441: 0x0000625A, 11442: 0x00006265, 11443: 0x000065EF, 11444: 0x000065EE, 11445: 0x0000673E, 11446: 0x00006739, 11447: 0x00006738, 11448: 0x0000673B, 11449: 0x0000673A, 11450: 0x0000673F, 11451: 0x0000673C, 11452: 0x00006733, 11453: 0x00006C18, 11454: 0x00006C46, 11455: 0x00006C52, 11456: 0x00006C5C, 11457: 0x00006C4F, 11458: 0x00006C4A, 11459: 0x00006C54, 11460: 0x00006C4B, 11461: 0x00006C4C, 11462: 0x00007071, 11463: 0x0000725E, 11464: 0x000072B4, 11465: 0x000072B5, 11466: 0x0000738E, 11467: 0x0000752A, 11468: 0x0000767F, 11469: 0x00007A75, 11470: 0x00007F51, 11471: 0x00008278, 11472: 0x0000827C, 11473: 0x00008280, 11474: 0x0000827D, 11475: 0x0000827F, 11476: 0x0000864D, 11477: 0x0000897E, 11478: 0x00009099, 11479: 0x00009097, 11480: 0x00009098, 11481: 0x0000909B, 11482: 0x00009094, 11483: 0x00009622, 11484: 0x00009624, 11485: 0x00009620, 11486: 0x00009623, 11487: 0x00004F56, 11488: 0x00004F3B, 11489: 0x00004F62, 11490: 0x00004F49, 11491: 0x00004F53, 11492: 0x00004F64, 11493: 0x00004F3E, 11494: 0x00004F67, 11495: 0x00004F52, 11496: 0x00004F5F, 11497: 0x00004F41, 11498: 0x00004F58, 11499: 0x00004F2D, 11500: 0x00004F33, 11501: 0x00004F3F, 11502: 0x00004F61, 11503: 0x0000518F, 11504: 0x000051B9, 11505: 0x0000521C, 11506: 0x0000521E, 11507: 0x00005221, 11508: 0x000052AD, 11509: 0x000052AE, 11510: 0x00005309, 11511: 0x00005363, 11512: 0x00005372, 11513: 0x0000538E, 11514: 0x0000538F, 11515: 0x00005430, 11516: 0x00005437, 11517: 0x0000542A, 11518: 0x00005454, 11519: 0x00005445, 11520: 0x00005419, 11521: 0x0000541C, 11522: 0x00005425, 11523: 0x00005418, 11524: 0x0000543D, 11525: 0x0000544F, 11526: 0x00005441, 11527: 0x00005428, 11528: 0x00005424, 11529: 0x00005447, 11530: 0x000056EE, 11531: 0x000056E7, 11532: 0x000056E5, 11533: 0x00005741, 11534: 0x00005745, 11535: 0x0000574C, 11536: 0x00005749, 11537: 0x0000574B, 11538: 0x00005752, 11539: 0x00005906, 11540: 0x00005940, 11541: 0x000059A6, 11542: 0x00005998, 11543: 0x000059A0, 11544: 0x00005997, 11545: 0x0000598E, 11546: 0x000059A2, 11547: 0x00005990, 11548: 0x0000598F, 11549: 0x000059A7, 11550: 0x000059A1, 11551: 0x00005B8E, 11552: 0x00005B92, 11553: 0x00005C28, 11554: 0x00005C2A, 11555: 0x00005C8D, 11556: 0x00005C8F, 11557: 0x00005C88, 11558: 0x00005C8B, 11559: 0x00005C89, 11560: 0x00005C92, 11561: 0x00005C8A, 11562: 0x00005C86, 11563: 0x00005C93, 11564: 0x00005C95, 11565: 0x00005DE0, 11566: 0x00005E0A, 11567: 0x00005E0E, 11568: 0x00005E8B, 11569: 0x00005E89, 11570: 0x00005E8C, 11571: 0x00005E88, 11572: 0x00005E8D, 11573: 0x00005F05, 11574: 0x00005F1D, 11575: 0x00005F78, 11576: 0x00005F76, 11577: 0x00005FD2, 11578: 0x00005FD1, 11579: 0x00005FD0, 11580: 0x00005FED, 11581: 0x00005FE8, 11582: 0x00005FEE, 11583: 0x00005FF3, 11584: 0x00005FE1, 11585: 0x00005FE4, 11586: 0x00005FE3, 11587: 0x00005FFA, 11588: 0x00005FEF, 11589: 0x00005FF7, 11590: 0x00005FFB, 11591: 0x00006000, 11592: 0x00005FF4, 11593: 0x0000623A, 11594: 0x00006283, 11595: 0x0000628C, 11596: 0x0000628E, 11597: 0x0000628F, 11598: 0x00006294, 11599: 0x00006287, 11600: 0x00006271, 11601: 0x0000627B, 11602: 0x0000627A, 11603: 0x00006270, 11604: 0x00006281, 11605: 0x00006288, 11606: 0x00006277, 11607: 0x0000627D, 11608: 0x00006272, 11609: 0x00006274, 11610: 0x00006537, 11611: 0x000065F0, 11612: 0x000065F4, 11613: 0x000065F3, 11614: 0x000065F2, 11615: 0x000065F5, 11616: 0x00006745, 11617: 0x00006747, 11618: 0x00006759, 11619: 0x00006755, 11620: 0x0000674C, 11621: 0x00006748, 11622: 0x0000675D, 11623: 0x0000674D, 11624: 0x0000675A, 11625: 0x0000674B, 11626: 0x00006BD0, 11627: 0x00006C19, 11628: 0x00006C1A, 11629: 0x00006C78, 11630: 0x00006C67, 11631: 0x00006C6B, 11632: 0x00006C84, 11633: 0x00006C8B, 11634: 0x00006C8F, 11635: 0x00006C71, 11636: 0x00006C6F, 11637: 0x00006C69, 11638: 0x00006C9A, 11639: 0x00006C6D, 11640: 0x00006C87, 11641: 0x00006C95, 11642: 0x00006C9C, 11643: 0x00006C66, 11644: 0x00006C73, 11645: 0x00006C65, 11646: 0x00006C7B, 11647: 0x00006C8E, 11648: 0x00007074, 11649: 0x0000707A, 11650: 0x00007263, 11651: 0x000072BF, 11652: 0x000072BD, 11653: 0x000072C3, 11654: 0x000072C6, 11655: 0x000072C1, 11656: 0x000072BA, 11657: 0x000072C5, 11658: 0x00007395, 11659: 0x00007397, 11660: 0x00007393, 11661: 0x00007394, 11662: 0x00007392, 11663: 0x0000753A, 11664: 0x00007539, 11665: 0x00007594, 11666: 0x00007595, 11667: 0x00007681, 11668: 0x0000793D, 11669: 0x00008034, 11670: 0x00008095, 11671: 0x00008099, 11672: 0x00008090, 11673: 0x00008092, 11674: 0x0000809C, 11675: 0x00008290, 11676: 0x0000828F, 11677: 0x00008285, 11678: 0x0000828E, 11679: 0x00008291, 11680: 0x00008293, 11681: 0x0000828A, 11682: 0x00008283, 11683: 0x00008284, 11684: 0x00008C78, 11685: 0x00008FC9, 11686: 0x00008FBF, 11687: 0x0000909F, 11688: 0x000090A1, 11689: 0x000090A5, 11690: 0x0000909E, 11691: 0x000090A7, 11692: 0x000090A0, 11693: 0x00009630, 11694: 0x00009628, 11695: 0x0000962F, 11696: 0x0000962D, 11697: 0x00004E33, 11698: 0x00004F98, 11699: 0x00004F7C, 11700: 0x00004F85, 11701: 0x00004F7D, 11702: 0x00004F80, 11703: 0x00004F87, 11704: 0x00004F76, 11705: 0x00004F74, 11706: 0x00004F89, 11707: 0x00004F84, 11708: 0x00004F77, 11709: 0x00004F4C, 11710: 0x00004F97, 11711: 0x00004F6A, 11712: 0x00004F9A, 11713: 0x00004F79, 11714: 0x00004F81, 11715: 0x00004F78, 11716: 0x00004F90, 11717: 0x00004F9C, 11718: 0x00004F94, 11719: 0x00004F9E, 11720: 0x00004F92, 11721: 0x00004F82, 11722: 0x00004F95, 11723: 0x00004F6B, 11724: 0x00004F6E, 11725: 0x0000519E, 11726: 0x000051BC, 11727: 0x000051BE, 11728: 0x00005235, 11729: 0x00005232, 11730: 0x00005233, 11731: 0x00005246, 11732: 0x00005231, 11733: 0x000052BC, 11734: 0x0000530A, 11735: 0x0000530B, 11736: 0x0000533C, 11737: 0x00005392, 11738: 0x00005394, 11739: 0x00005487, 11740: 0x0000547F, 11741: 0x00005481, 11742: 0x00005491, 11743: 0x00005482, 11744: 0x00005488, 11745: 0x0000546B, 11746: 0x0000547A, 11747: 0x0000547E, 11748: 0x00005465, 11749: 0x0000546C, 11750: 0x00005474, 11751: 0x00005466, 11752: 0x0000548D, 11753: 0x0000546F, 11754: 0x00005461, 11755: 0x00005460, 11756: 0x00005498, 11757: 0x00005463, 11758: 0x00005467, 11759: 0x00005464, 11760: 0x000056F7, 11761: 0x000056F9, 11762: 0x0000576F, 11763: 0x00005772, 11764: 0x0000576D, 11765: 0x0000576B, 11766: 0x00005771, 11767: 0x00005770, 11768: 0x00005776, 11769: 0x00005780, 11770: 0x00005775, 11771: 0x0000577B, 11772: 0x00005773, 11773: 0x00005774, 11774: 0x00005762, 11775: 0x00005768, 11776: 0x0000577D, 11777: 0x0000590C, 11778: 0x00005945, 11779: 0x000059B5, 11780: 0x000059BA, 11781: 0x000059CF, 11782: 0x000059CE, 11783: 0x000059B2, 11784: 0x000059CC, 11785: 0x000059C1, 11786: 0x000059B6, 11787: 0x000059BC, 11788: 0x000059C3, 11789: 0x000059D6, 11790: 0x000059B1, 11791: 0x000059BD, 11792: 0x000059C0, 11793: 0x000059C8, 11794: 0x000059B4, 11795: 0x000059C7, 11796: 0x00005B62, 11797: 0x00005B65, 11798: 0x00005B93, 11799: 0x00005B95, 11800: 0x00005C44, 11801: 0x00005C47, 11802: 0x00005CAE, 11803: 0x00005CA4, 11804: 0x00005CA0, 11805: 0x00005CB5, 11806: 0x00005CAF, 11807: 0x00005CA8, 11808: 0x00005CAC, 11809: 0x00005C9F, 11810: 0x00005CA3, 11811: 0x00005CAD, 11812: 0x00005CA2, 11813: 0x00005CAA, 11814: 0x00005CA7, 11815: 0x00005C9D, 11816: 0x00005CA5, 11817: 0x00005CB6, 11818: 0x00005CB0, 11819: 0x00005CA6, 11820: 0x00005E17, 11821: 0x00005E14, 11822: 0x00005E19, 11823: 0x00005F28, 11824: 0x00005F22, 11825: 0x00005F23, 11826: 0x00005F24, 11827: 0x00005F54, 11828: 0x00005F82, 11829: 0x00005F7E, 11830: 0x00005F7D, 11831: 0x00005FDE, 11832: 0x00005FE5, 11833: 0x0000602D, 11834: 0x00006026, 11835: 0x00006019, 11836: 0x00006032, 11837: 0x0000600B, 11838: 0x00006034, 11839: 0x0000600A, 11840: 0x00006017, 11841: 0x00006033, 11842: 0x0000601A, 11843: 0x0000601E, 11844: 0x0000602C, 11845: 0x00006022, 11846: 0x0000600D, 11847: 0x00006010, 11848: 0x0000602E, 11849: 0x00006013, 11850: 0x00006011, 11851: 0x0000600C, 11852: 0x00006009, 11853: 0x0000601C, 11854: 0x00006214, 11855: 0x0000623D, 11856: 0x000062AD, 11857: 0x000062B4, 11858: 0x000062D1, 11859: 0x000062BE, 11860: 0x000062AA, 11861: 0x000062B6, 11862: 0x000062CA, 11863: 0x000062AE, 11864: 0x000062B3, 11865: 0x000062AF, 11866: 0x000062BB, 11867: 0x000062A9, 11868: 0x000062B0, 11869: 0x000062B8, 11870: 0x0000653D, 11871: 0x000065A8, 11872: 0x000065BB, 11873: 0x00006609, 11874: 0x000065FC, 11875: 0x00006604, 11876: 0x00006612, 11877: 0x00006608, 11878: 0x000065FB, 11879: 0x00006603, 11880: 0x0000660B, 11881: 0x0000660D, 11882: 0x00006605, 11883: 0x000065FD, 11884: 0x00006611, 11885: 0x00006610, 11886: 0x000066F6, 11887: 0x0000670A, 11888: 0x00006785, 11889: 0x0000676C, 11890: 0x0000678E, 11891: 0x00006792, 11892: 0x00006776, 11893: 0x0000677B, 11894: 0x00006798, 11895: 0x00006786, 11896: 0x00006784, 11897: 0x00006774, 11898: 0x0000678D, 11899: 0x0000678C, 11900: 0x0000677A, 11901: 0x0000679F, 11902: 0x00006791, 11903: 0x00006799, 11904: 0x00006783, 11905: 0x0000677D, 11906: 0x00006781, 11907: 0x00006778, 11908: 0x00006779, 11909: 0x00006794, 11910: 0x00006B25, 11911: 0x00006B80, 11912: 0x00006B7E, 11913: 0x00006BDE, 11914: 0x00006C1D, 11915: 0x00006C93, 11916: 0x00006CEC, 11917: 0x00006CEB, 11918: 0x00006CEE, 11919: 0x00006CD9, 11920: 0x00006CB6, 11921: 0x00006CD4, 11922: 0x00006CAD, 11923: 0x00006CE7, 11924: 0x00006CB7, 11925: 0x00006CD0, 11926: 0x00006CC2, 11927: 0x00006CBA, 11928: 0x00006CC3, 11929: 0x00006CC6, 11930: 0x00006CED, 11931: 0x00006CF2, 11932: 0x00006CD2, 11933: 0x00006CDD, 11934: 0x00006CB4, 11935: 0x00006C8A, 11936: 0x00006C9D, 11937: 0x00006C80, 11938: 0x00006CDE, 11939: 0x00006CC0, 11940: 0x00006D30, 11941: 0x00006CCD, 11942: 0x00006CC7, 11943: 0x00006CB0, 11944: 0x00006CF9, 11945: 0x00006CCF, 11946: 0x00006CE9, 11947: 0x00006CD1, 11948: 0x00007094, 11949: 0x00007098, 11950: 0x00007085, 11951: 0x00007093, 11952: 0x00007086, 11953: 0x00007084, 11954: 0x00007091, 11955: 0x00007096, 11956: 0x00007082, 11957: 0x0000709A, 11958: 0x00007083, 11959: 0x0000726A, 11960: 0x000072D6, 11961: 0x000072CB, 11962: 0x000072D8, 11963: 0x000072C9, 11964: 0x000072DC, 11965: 0x000072D2, 11966: 0x000072D4, 11967: 0x000072DA, 11968: 0x000072CC, 11969: 0x000072D1, 11970: 0x000073A4, 11971: 0x000073A1, 11972: 0x000073AD, 11973: 0x000073A6, 11974: 0x000073A2, 11975: 0x000073A0, 11976: 0x000073AC, 11977: 0x0000739D, 11978: 0x000074DD, 11979: 0x000074E8, 11980: 0x0000753F, 11981: 0x00007540, 11982: 0x0000753E, 11983: 0x0000758C, 11984: 0x00007598, 11985: 0x000076AF, 11986: 0x000076F3, 11987: 0x000076F1, 11988: 0x000076F0, 11989: 0x000076F5, 11990: 0x000077F8, 11991: 0x000077FC, 11992: 0x000077F9, 11993: 0x000077FB, 11994: 0x000077FA, 11995: 0x000077F7, 11996: 0x00007942, 11997: 0x0000793F, 11998: 0x000079C5, 11999: 0x00007A78, 12000: 0x00007A7B, 12001: 0x00007AFB, 12002: 0x00007C75, 12003: 0x00007CFD, 12004: 0x00008035, 12005: 0x0000808F, 12006: 0x000080AE, 12007: 0x000080A3, 12008: 0x000080B8, 12009: 0x000080B5, 12010: 0x000080AD, 12011: 0x00008220, 12012: 0x000082A0, 12013: 0x000082C0, 12014: 0x000082AB, 12015: 0x0000829A, 12016: 0x00008298, 12017: 0x0000829B, 12018: 0x000082B5, 12019: 0x000082A7, 12020: 0x000082AE, 12021: 0x000082BC, 12022: 0x0000829E, 12023: 0x000082BA, 12024: 0x000082B4, 12025: 0x000082A8, 12026: 0x000082A1, 12027: 0x000082A9, 12028: 0x000082C2, 12029: 0x000082A4, 12030: 0x000082C3, 12031: 0x000082B6, 12032: 0x000082A2, 12033: 0x00008670, 12034: 0x0000866F, 12035: 0x0000866D, 12036: 0x0000866E, 12037: 0x00008C56, 12038: 0x00008FD2, 12039: 0x00008FCB, 12040: 0x00008FD3, 12041: 0x00008FCD, 12042: 0x00008FD6, 12043: 0x00008FD5, 12044: 0x00008FD7, 12045: 0x000090B2, 12046: 0x000090B4, 12047: 0x000090AF, 12048: 0x000090B3, 12049: 0x000090B0, 12050: 0x00009639, 12051: 0x0000963D, 12052: 0x0000963C, 12053: 0x0000963A, 12054: 0x00009643, 12055: 0x00004FCD, 12056: 0x00004FC5, 12057: 0x00004FD3, 12058: 0x00004FB2, 12059: 0x00004FC9, 12060: 0x00004FCB, 12061: 0x00004FC1, 12062: 0x00004FD4, 12063: 0x00004FDC, 12064: 0x00004FD9, 12065: 0x00004FBB, 12066: 0x00004FB3, 12067: 0x00004FDB, 12068: 0x00004FC7, 12069: 0x00004FD6, 12070: 0x00004FBA, 12071: 0x00004FC0, 12072: 0x00004FB9, 12073: 0x00004FEC, 12074: 0x00005244, 12075: 0x00005249, 12076: 0x000052C0, 12077: 0x000052C2, 12078: 0x0000533D, 12079: 0x0000537C, 12080: 0x00005397, 12081: 0x00005396, 12082: 0x00005399, 12083: 0x00005398, 12084: 0x000054BA, 12085: 0x000054A1, 12086: 0x000054AD, 12087: 0x000054A5, 12088: 0x000054CF, 12089: 0x000054C3, 12090: 0x0000830D, 12091: 0x000054B7, 12092: 0x000054AE, 12093: 0x000054D6, 12094: 0x000054B6, 12095: 0x000054C5, 12096: 0x000054C6, 12097: 0x000054A0, 12098: 0x00005470, 12099: 0x000054BC, 12100: 0x000054A2, 12101: 0x000054BE, 12102: 0x00005472, 12103: 0x000054DE, 12104: 0x000054B0, 12105: 0x000057B5, 12106: 0x0000579E, 12107: 0x0000579F, 12108: 0x000057A4, 12109: 0x0000578C, 12110: 0x00005797, 12111: 0x0000579D, 12112: 0x0000579B, 12113: 0x00005794, 12114: 0x00005798, 12115: 0x0000578F, 12116: 0x00005799, 12117: 0x000057A5, 12118: 0x0000579A, 12119: 0x00005795, 12120: 0x000058F4, 12121: 0x0000590D, 12122: 0x00005953, 12123: 0x000059E1, 12124: 0x000059DE, 12125: 0x000059EE, 12126: 0x00005A00, 12127: 0x000059F1, 12128: 0x000059DD, 12129: 0x000059FA, 12130: 0x000059FD, 12131: 0x000059FC, 12132: 0x000059F6, 12133: 0x000059E4, 12134: 0x000059F2, 12135: 0x000059F7, 12136: 0x000059DB, 12137: 0x000059E9, 12138: 0x000059F3, 12139: 0x000059F5, 12140: 0x000059E0, 12141: 0x000059FE, 12142: 0x000059F4, 12143: 0x000059ED, 12144: 0x00005BA8, 12145: 0x00005C4C, 12146: 0x00005CD0, 12147: 0x00005CD8, 12148: 0x00005CCC, 12149: 0x00005CD7, 12150: 0x00005CCB, 12151: 0x00005CDB, 12152: 0x00005CDE, 12153: 0x00005CDA, 12154: 0x00005CC9, 12155: 0x00005CC7, 12156: 0x00005CCA, 12157: 0x00005CD6, 12158: 0x00005CD3, 12159: 0x00005CD4, 12160: 0x00005CCF, 12161: 0x00005CC8, 12162: 0x00005CC6, 12163: 0x00005CCE, 12164: 0x00005CDF, 12165: 0x00005CF8, 12166: 0x00005DF9, 12167: 0x00005E21, 12168: 0x00005E22, 12169: 0x00005E23, 12170: 0x00005E20, 12171: 0x00005E24, 12172: 0x00005EB0, 12173: 0x00005EA4, 12174: 0x00005EA2, 12175: 0x00005E9B, 12176: 0x00005EA3, 12177: 0x00005EA5, 12178: 0x00005F07, 12179: 0x00005F2E, 12180: 0x00005F56, 12181: 0x00005F86, 12182: 0x00006037, 12183: 0x00006039, 12184: 0x00006054, 12185: 0x00006072, 12186: 0x0000605E, 12187: 0x00006045, 12188: 0x00006053, 12189: 0x00006047, 12190: 0x00006049, 12191: 0x0000605B, 12192: 0x0000604C, 12193: 0x00006040, 12194: 0x00006042, 12195: 0x0000605F, 12196: 0x00006024, 12197: 0x00006044, 12198: 0x00006058, 12199: 0x00006066, 12200: 0x0000606E, 12201: 0x00006242, 12202: 0x00006243, 12203: 0x000062CF, 12204: 0x0000630D, 12205: 0x0000630B, 12206: 0x000062F5, 12207: 0x0000630E, 12208: 0x00006303, 12209: 0x000062EB, 12210: 0x000062F9, 12211: 0x0000630F, 12212: 0x0000630C, 12213: 0x000062F8, 12214: 0x000062F6, 12215: 0x00006300, 12216: 0x00006313, 12217: 0x00006314, 12218: 0x000062FA, 12219: 0x00006315, 12220: 0x000062FB, 12221: 0x000062F0, 12222: 0x00006541, 12223: 0x00006543, 12224: 0x000065AA, 12225: 0x000065BF, 12226: 0x00006636, 12227: 0x00006621, 12228: 0x00006632, 12229: 0x00006635, 12230: 0x0000661C, 12231: 0x00006626, 12232: 0x00006622, 12233: 0x00006633, 12234: 0x0000662B, 12235: 0x0000663A, 12236: 0x0000661D, 12237: 0x00006634, 12238: 0x00006639, 12239: 0x0000662E, 12240: 0x0000670F, 12241: 0x00006710, 12242: 0x000067C1, 12243: 0x000067F2, 12244: 0x000067C8, 12245: 0x000067BA, 12246: 0x000067DC, 12247: 0x000067BB, 12248: 0x000067F8, 12249: 0x000067D8, 12250: 0x000067C0, 12251: 0x000067B7, 12252: 0x000067C5, 12253: 0x000067EB, 12254: 0x000067E4, 12255: 0x000067DF, 12256: 0x000067B5, 12257: 0x000067CD, 12258: 0x000067B3, 12259: 0x000067F7, 12260: 0x000067F6, 12261: 0x000067EE, 12262: 0x000067E3, 12263: 0x000067C2, 12264: 0x000067B9, 12265: 0x000067CE, 12266: 0x000067E7, 12267: 0x000067F0, 12268: 0x000067B2, 12269: 0x000067FC, 12270: 0x000067C6, 12271: 0x000067ED, 12272: 0x000067CC, 12273: 0x000067AE, 12274: 0x000067E6, 12275: 0x000067DB, 12276: 0x000067FA, 12277: 0x000067C9, 12278: 0x000067CA, 12279: 0x000067C3, 12280: 0x000067EA, 12281: 0x000067CB, 12282: 0x00006B28, 12283: 0x00006B82, 12284: 0x00006B84, 12285: 0x00006BB6, 12286: 0x00006BD6, 12287: 0x00006BD8, 12288: 0x00006BE0, 12289: 0x00006C20, 12290: 0x00006C21, 12291: 0x00006D28, 12292: 0x00006D34, 12293: 0x00006D2D, 12294: 0x00006D1F, 12295: 0x00006D3C, 12296: 0x00006D3F, 12297: 0x00006D12, 12298: 0x00006D0A, 12299: 0x00006CDA, 12300: 0x00006D33, 12301: 0x00006D04, 12302: 0x00006D19, 12303: 0x00006D3A, 12304: 0x00006D1A, 12305: 0x00006D11, 12306: 0x00006D00, 12307: 0x00006D1D, 12308: 0x00006D42, 12309: 0x00006D01, 12310: 0x00006D18, 12311: 0x00006D37, 12312: 0x00006D03, 12313: 0x00006D0F, 12314: 0x00006D40, 12315: 0x00006D07, 12316: 0x00006D20, 12317: 0x00006D2C, 12318: 0x00006D08, 12319: 0x00006D22, 12320: 0x00006D09, 12321: 0x00006D10, 12322: 0x000070B7, 12323: 0x0000709F, 12324: 0x000070BE, 12325: 0x000070B1, 12326: 0x000070B0, 12327: 0x000070A1, 12328: 0x000070B4, 12329: 0x000070B5, 12330: 0x000070A9, 12331: 0x00007241, 12332: 0x00007249, 12333: 0x0000724A, 12334: 0x0000726C, 12335: 0x00007270, 12336: 0x00007273, 12337: 0x0000726E, 12338: 0x000072CA, 12339: 0x000072E4, 12340: 0x000072E8, 12341: 0x000072EB, 12342: 0x000072DF, 12343: 0x000072EA, 12344: 0x000072E6, 12345: 0x000072E3, 12346: 0x00007385, 12347: 0x000073CC, 12348: 0x000073C2, 12349: 0x000073C8, 12350: 0x000073C5, 12351: 0x000073B9, 12352: 0x000073B6, 12353: 0x000073B5, 12354: 0x000073B4, 12355: 0x000073EB, 12356: 0x000073BF, 12357: 0x000073C7, 12358: 0x000073BE, 12359: 0x000073C3, 12360: 0x000073C6, 12361: 0x000073B8, 12362: 0x000073CB, 12363: 0x000074EC, 12364: 0x000074EE, 12365: 0x0000752E, 12366: 0x00007547, 12367: 0x00007548, 12368: 0x000075A7, 12369: 0x000075AA, 12370: 0x00007679, 12371: 0x000076C4, 12372: 0x00007708, 12373: 0x00007703, 12374: 0x00007704, 12375: 0x00007705, 12376: 0x0000770A, 12377: 0x000076F7, 12378: 0x000076FB, 12379: 0x000076FA, 12380: 0x000077E7, 12381: 0x000077E8, 12382: 0x00007806, 12383: 0x00007811, 12384: 0x00007812, 12385: 0x00007805, 12386: 0x00007810, 12387: 0x0000780F, 12388: 0x0000780E, 12389: 0x00007809, 12390: 0x00007803, 12391: 0x00007813, 12392: 0x0000794A, 12393: 0x0000794C, 12394: 0x0000794B, 12395: 0x00007945, 12396: 0x00007944, 12397: 0x000079D5, 12398: 0x000079CD, 12399: 0x000079CF, 12400: 0x000079D6, 12401: 0x000079CE, 12402: 0x00007A80, 12403: 0x00007A7E, 12404: 0x00007AD1, 12405: 0x00007B00, 12406: 0x00007B01, 12407: 0x00007C7A, 12408: 0x00007C78, 12409: 0x00007C79, 12410: 0x00007C7F, 12411: 0x00007C80, 12412: 0x00007C81, 12413: 0x00007D03, 12414: 0x00007D08, 12415: 0x00007D01, 12416: 0x00007F58, 12417: 0x00007F91, 12418: 0x00007F8D, 12419: 0x00007FBE, 12420: 0x00008007, 12421: 0x0000800E, 12422: 0x0000800F, 12423: 0x00008014, 12424: 0x00008037, 12425: 0x000080D8, 12426: 0x000080C7, 12427: 0x000080E0, 12428: 0x000080D1, 12429: 0x000080C8, 12430: 0x000080C2, 12431: 0x000080D0, 12432: 0x000080C5, 12433: 0x000080E3, 12434: 0x000080D9, 12435: 0x000080DC, 12436: 0x000080CA, 12437: 0x000080D5, 12438: 0x000080C9, 12439: 0x000080CF, 12440: 0x000080D7, 12441: 0x000080E6, 12442: 0x000080CD, 12443: 0x000081FF, 12444: 0x00008221, 12445: 0x00008294, 12446: 0x000082D9, 12447: 0x000082FE, 12448: 0x000082F9, 12449: 0x00008307, 12450: 0x000082E8, 12451: 0x00008300, 12452: 0x000082D5, 12453: 0x0000833A, 12454: 0x000082EB, 12455: 0x000082D6, 12456: 0x000082F4, 12457: 0x000082EC, 12458: 0x000082E1, 12459: 0x000082F2, 12460: 0x000082F5, 12461: 0x0000830C, 12462: 0x000082FB, 12463: 0x000082F6, 12464: 0x000082F0, 12465: 0x000082EA, 12466: 0x000082E4, 12467: 0x000082E0, 12468: 0x000082FA, 12469: 0x000082F3, 12470: 0x000082ED, 12471: 0x00008677, 12472: 0x00008674, 12473: 0x0000867C, 12474: 0x00008673, 12475: 0x00008841, 12476: 0x0000884E, 12477: 0x00008867, 12478: 0x0000886A, 12479: 0x00008869, 12480: 0x000089D3, 12481: 0x00008A04, 12482: 0x00008A07, 12483: 0x00008D72, 12484: 0x00008FE3, 12485: 0x00008FE1, 12486: 0x00008FEE, 12487: 0x00008FE0, 12488: 0x000090F1, 12489: 0x000090BD, 12490: 0x000090BF, 12491: 0x000090D5, 12492: 0x000090C5, 12493: 0x000090BE, 12494: 0x000090C7, 12495: 0x000090CB, 12496: 0x000090C8, 12497: 0x000091D4, 12498: 0x000091D3, 12499: 0x00009654, 12500: 0x0000964F, 12501: 0x00009651, 12502: 0x00009653, 12503: 0x0000964A, 12504: 0x0000964E, 12505: 0x0000501E, 12506: 0x00005005, 12507: 0x00005007, 12508: 0x00005013, 12509: 0x00005022, 12510: 0x00005030, 12511: 0x0000501B, 12512: 0x00004FF5, 12513: 0x00004FF4, 12514: 0x00005033, 12515: 0x00005037, 12516: 0x0000502C, 12517: 0x00004FF6, 12518: 0x00004FF7, 12519: 0x00005017, 12520: 0x0000501C, 12521: 0x00005020, 12522: 0x00005027, 12523: 0x00005035, 12524: 0x0000502F, 12525: 0x00005031, 12526: 0x0000500E, 12527: 0x0000515A, 12528: 0x00005194, 12529: 0x00005193, 12530: 0x000051CA, 12531: 0x000051C4, 12532: 0x000051C5, 12533: 0x000051C8, 12534: 0x000051CE, 12535: 0x00005261, 12536: 0x0000525A, 12537: 0x00005252, 12538: 0x0000525E, 12539: 0x0000525F, 12540: 0x00005255, 12541: 0x00005262, 12542: 0x000052CD, 12543: 0x0000530E, 12544: 0x0000539E, 12545: 0x00005526, 12546: 0x000054E2, 12547: 0x00005517, 12548: 0x00005512, 12549: 0x000054E7, 12550: 0x000054F3, 12551: 0x000054E4, 12552: 0x0000551A, 12553: 0x000054FF, 12554: 0x00005504, 12555: 0x00005508, 12556: 0x000054EB, 12557: 0x00005511, 12558: 0x00005505, 12559: 0x000054F1, 12560: 0x0000550A, 12561: 0x000054FB, 12562: 0x000054F7, 12563: 0x000054F8, 12564: 0x000054E0, 12565: 0x0000550E, 12566: 0x00005503, 12567: 0x0000550B, 12568: 0x00005701, 12569: 0x00005702, 12570: 0x000057CC, 12571: 0x00005832, 12572: 0x000057D5, 12573: 0x000057D2, 12574: 0x000057BA, 12575: 0x000057C6, 12576: 0x000057BD, 12577: 0x000057BC, 12578: 0x000057B8, 12579: 0x000057B6, 12580: 0x000057BF, 12581: 0x000057C7, 12582: 0x000057D0, 12583: 0x000057B9, 12584: 0x000057C1, 12585: 0x0000590E, 12586: 0x0000594A, 12587: 0x00005A19, 12588: 0x00005A16, 12589: 0x00005A2D, 12590: 0x00005A2E, 12591: 0x00005A15, 12592: 0x00005A0F, 12593: 0x00005A17, 12594: 0x00005A0A, 12595: 0x00005A1E, 12596: 0x00005A33, 12597: 0x00005B6C, 12598: 0x00005BA7, 12599: 0x00005BAD, 12600: 0x00005BAC, 12601: 0x00005C03, 12602: 0x00005C56, 12603: 0x00005C54, 12604: 0x00005CEC, 12605: 0x00005CFF, 12606: 0x00005CEE, 12607: 0x00005CF1, 12608: 0x00005CF7, 12609: 0x00005D00, 12610: 0x00005CF9, 12611: 0x00005E29, 12612: 0x00005E28, 12613: 0x00005EA8, 12614: 0x00005EAE, 12615: 0x00005EAA, 12616: 0x00005EAC, 12617: 0x00005F33, 12618: 0x00005F30, 12619: 0x00005F67, 12620: 0x0000605D, 12621: 0x0000605A, 12622: 0x00006067, 12623: 0x00006041, 12624: 0x000060A2, 12625: 0x00006088, 12626: 0x00006080, 12627: 0x00006092, 12628: 0x00006081, 12629: 0x0000609D, 12630: 0x00006083, 12631: 0x00006095, 12632: 0x0000609B, 12633: 0x00006097, 12634: 0x00006087, 12635: 0x0000609C, 12636: 0x0000608E, 12637: 0x00006219, 12638: 0x00006246, 12639: 0x000062F2, 12640: 0x00006310, 12641: 0x00006356, 12642: 0x0000632C, 12643: 0x00006344, 12644: 0x00006345, 12645: 0x00006336, 12646: 0x00006343, 12647: 0x000063E4, 12648: 0x00006339, 12649: 0x0000634B, 12650: 0x0000634A, 12651: 0x0000633C, 12652: 0x00006329, 12653: 0x00006341, 12654: 0x00006334, 12655: 0x00006358, 12656: 0x00006354, 12657: 0x00006359, 12658: 0x0000632D, 12659: 0x00006347, 12660: 0x00006333, 12661: 0x0000635A, 12662: 0x00006351, 12663: 0x00006338, 12664: 0x00006357, 12665: 0x00006340, 12666: 0x00006348, 12667: 0x0000654A, 12668: 0x00006546, 12669: 0x000065C6, 12670: 0x000065C3, 12671: 0x000065C4, 12672: 0x000065C2, 12673: 0x0000664A, 12674: 0x0000665F, 12675: 0x00006647, 12676: 0x00006651, 12677: 0x00006712, 12678: 0x00006713, 12679: 0x0000681F, 12680: 0x0000681A, 12681: 0x00006849, 12682: 0x00006832, 12683: 0x00006833, 12684: 0x0000683B, 12685: 0x0000684B, 12686: 0x0000684F, 12687: 0x00006816, 12688: 0x00006831, 12689: 0x0000681C, 12690: 0x00006835, 12691: 0x0000682B, 12692: 0x0000682D, 12693: 0x0000682F, 12694: 0x0000684E, 12695: 0x00006844, 12696: 0x00006834, 12697: 0x0000681D, 12698: 0x00006812, 12699: 0x00006814, 12700: 0x00006826, 12701: 0x00006828, 12702: 0x0000682E, 12703: 0x0000684D, 12704: 0x0000683A, 12705: 0x00006825, 12706: 0x00006820, 12707: 0x00006B2C, 12708: 0x00006B2F, 12709: 0x00006B2D, 12710: 0x00006B31, 12711: 0x00006B34, 12712: 0x00006B6D, 12713: 0x00008082, 12714: 0x00006B88, 12715: 0x00006BE6, 12716: 0x00006BE4, 12717: 0x00006BE8, 12718: 0x00006BE3, 12719: 0x00006BE2, 12720: 0x00006BE7, 12721: 0x00006C25, 12722: 0x00006D7A, 12723: 0x00006D63, 12724: 0x00006D64, 12725: 0x00006D76, 12726: 0x00006D0D, 12727: 0x00006D61, 12728: 0x00006D92, 12729: 0x00006D58, 12730: 0x00006D62, 12731: 0x00006D6D, 12732: 0x00006D6F, 12733: 0x00006D91, 12734: 0x00006D8D, 12735: 0x00006DEF, 12736: 0x00006D7F, 12737: 0x00006D86, 12738: 0x00006D5E, 12739: 0x00006D67, 12740: 0x00006D60, 12741: 0x00006D97, 12742: 0x00006D70, 12743: 0x00006D7C, 12744: 0x00006D5F, 12745: 0x00006D82, 12746: 0x00006D98, 12747: 0x00006D2F, 12748: 0x00006D68, 12749: 0x00006D8B, 12750: 0x00006D7E, 12751: 0x00006D80, 12752: 0x00006D84, 12753: 0x00006D16, 12754: 0x00006D83, 12755: 0x00006D7B, 12756: 0x00006D7D, 12757: 0x00006D75, 12758: 0x00006D90, 12759: 0x000070DC, 12760: 0x000070D3, 12761: 0x000070D1, 12762: 0x000070DD, 12763: 0x000070CB, 12764: 0x00007F39, 12765: 0x000070E2, 12766: 0x000070D7, 12767: 0x000070D2, 12768: 0x000070DE, 12769: 0x000070E0, 12770: 0x000070D4, 12771: 0x000070CD, 12772: 0x000070C5, 12773: 0x000070C6, 12774: 0x000070C7, 12775: 0x000070DA, 12776: 0x000070CE, 12777: 0x000070E1, 12778: 0x00007242, 12779: 0x00007278, 12780: 0x00007277, 12781: 0x00007276, 12782: 0x00007300, 12783: 0x000072FA, 12784: 0x000072F4, 12785: 0x000072FE, 12786: 0x000072F6, 12787: 0x000072F3, 12788: 0x000072FB, 12789: 0x00007301, 12790: 0x000073D3, 12791: 0x000073D9, 12792: 0x000073E5, 12793: 0x000073D6, 12794: 0x000073BC, 12795: 0x000073E7, 12796: 0x000073E3, 12797: 0x000073E9, 12798: 0x000073DC, 12799: 0x000073D2, 12800: 0x000073DB, 12801: 0x000073D4, 12802: 0x000073DD, 12803: 0x000073DA, 12804: 0x000073D7, 12805: 0x000073D8, 12806: 0x000073E8, 12807: 0x000074DE, 12808: 0x000074DF, 12809: 0x000074F4, 12810: 0x000074F5, 12811: 0x00007521, 12812: 0x0000755B, 12813: 0x0000755F, 12814: 0x000075B0, 12815: 0x000075C1, 12816: 0x000075BB, 12817: 0x000075C4, 12818: 0x000075C0, 12819: 0x000075BF, 12820: 0x000075B6, 12821: 0x000075BA, 12822: 0x0000768A, 12823: 0x000076C9, 12824: 0x0000771D, 12825: 0x0000771B, 12826: 0x00007710, 12827: 0x00007713, 12828: 0x00007712, 12829: 0x00007723, 12830: 0x00007711, 12831: 0x00007715, 12832: 0x00007719, 12833: 0x0000771A, 12834: 0x00007722, 12835: 0x00007727, 12836: 0x00007823, 12837: 0x0000782C, 12838: 0x00007822, 12839: 0x00007835, 12840: 0x0000782F, 12841: 0x00007828, 12842: 0x0000782E, 12843: 0x0000782B, 12844: 0x00007821, 12845: 0x00007829, 12846: 0x00007833, 12847: 0x0000782A, 12848: 0x00007831, 12849: 0x00007954, 12850: 0x0000795B, 12851: 0x0000794F, 12852: 0x0000795C, 12853: 0x00007953, 12854: 0x00007952, 12855: 0x00007951, 12856: 0x000079EB, 12857: 0x000079EC, 12858: 0x000079E0, 12859: 0x000079EE, 12860: 0x000079ED, 12861: 0x000079EA, 12862: 0x000079DC, 12863: 0x000079DE, 12864: 0x000079DD, 12865: 0x00007A86, 12866: 0x00007A89, 12867: 0x00007A85, 12868: 0x00007A8B, 12869: 0x00007A8C, 12870: 0x00007A8A, 12871: 0x00007A87, 12872: 0x00007AD8, 12873: 0x00007B10, 12874: 0x00007B04, 12875: 0x00007B13, 12876: 0x00007B05, 12877: 0x00007B0F, 12878: 0x00007B08, 12879: 0x00007B0A, 12880: 0x00007B0E, 12881: 0x00007B09, 12882: 0x00007B12, 12883: 0x00007C84, 12884: 0x00007C91, 12885: 0x00007C8A, 12886: 0x00007C8C, 12887: 0x00007C88, 12888: 0x00007C8D, 12889: 0x00007C85, 12890: 0x00007D1E, 12891: 0x00007D1D, 12892: 0x00007D11, 12893: 0x00007D0E, 12894: 0x00007D18, 12895: 0x00007D16, 12896: 0x00007D13, 12897: 0x00007D1F, 12898: 0x00007D12, 12899: 0x00007D0F, 12900: 0x00007D0C, 12901: 0x00007F5C, 12902: 0x00007F61, 12903: 0x00007F5E, 12904: 0x00007F60, 12905: 0x00007F5D, 12906: 0x00007F5B, 12907: 0x00007F96, 12908: 0x00007F92, 12909: 0x00007FC3, 12910: 0x00007FC2, 12911: 0x00007FC0, 12912: 0x00008016, 12913: 0x0000803E, 12914: 0x00008039, 12915: 0x000080FA, 12916: 0x000080F2, 12917: 0x000080F9, 12918: 0x000080F5, 12919: 0x00008101, 12920: 0x000080FB, 12921: 0x00008100, 12922: 0x00008201, 12923: 0x0000822F, 12924: 0x00008225, 12925: 0x00008333, 12926: 0x0000832D, 12927: 0x00008344, 12928: 0x00008319, 12929: 0x00008351, 12930: 0x00008325, 12931: 0x00008356, 12932: 0x0000833F, 12933: 0x00008341, 12934: 0x00008326, 12935: 0x0000831C, 12936: 0x00008322, 12937: 0x00008342, 12938: 0x0000834E, 12939: 0x0000831B, 12940: 0x0000832A, 12941: 0x00008308, 12942: 0x0000833C, 12943: 0x0000834D, 12944: 0x00008316, 12945: 0x00008324, 12946: 0x00008320, 12947: 0x00008337, 12948: 0x0000832F, 12949: 0x00008329, 12950: 0x00008347, 12951: 0x00008345, 12952: 0x0000834C, 12953: 0x00008353, 12954: 0x0000831E, 12955: 0x0000832C, 12956: 0x0000834B, 12957: 0x00008327, 12958: 0x00008348, 12959: 0x00008653, 12960: 0x00008652, 12961: 0x000086A2, 12962: 0x000086A8, 12963: 0x00008696, 12964: 0x0000868D, 12965: 0x00008691, 12966: 0x0000869E, 12967: 0x00008687, 12968: 0x00008697, 12969: 0x00008686, 12970: 0x0000868B, 12971: 0x0000869A, 12972: 0x00008685, 12973: 0x000086A5, 12974: 0x00008699, 12975: 0x000086A1, 12976: 0x000086A7, 12977: 0x00008695, 12978: 0x00008698, 12979: 0x0000868E, 12980: 0x0000869D, 12981: 0x00008690, 12982: 0x00008694, 12983: 0x00008843, 12984: 0x00008844, 12985: 0x0000886D, 12986: 0x00008875, 12987: 0x00008876, 12988: 0x00008872, 12989: 0x00008880, 12990: 0x00008871, 12991: 0x0000887F, 12992: 0x0000886F, 12993: 0x00008883, 12994: 0x0000887E, 12995: 0x00008874, 12996: 0x0000887C, 12997: 0x00008A12, 12998: 0x00008C47, 12999: 0x00008C57, 13000: 0x00008C7B, 13001: 0x00008CA4, 13002: 0x00008CA3, 13003: 0x00008D76, 13004: 0x00008D78, 13005: 0x00008DB5, 13006: 0x00008DB7, 13007: 0x00008DB6, 13008: 0x00008ED1, 13009: 0x00008ED3, 13010: 0x00008FFE, 13011: 0x00008FF5, 13012: 0x00009002, 13013: 0x00008FFF, 13014: 0x00008FFB, 13015: 0x00009004, 13016: 0x00008FFC, 13017: 0x00008FF6, 13018: 0x000090D6, 13019: 0x000090E0, 13020: 0x000090D9, 13021: 0x000090DA, 13022: 0x000090E3, 13023: 0x000090DF, 13024: 0x000090E5, 13025: 0x000090D8, 13026: 0x000090DB, 13027: 0x000090D7, 13028: 0x000090DC, 13029: 0x000090E4, 13030: 0x00009150, 13031: 0x0000914E, 13032: 0x0000914F, 13033: 0x000091D5, 13034: 0x000091E2, 13035: 0x000091DA, 13036: 0x0000965C, 13037: 0x0000965F, 13038: 0x000096BC, 13039: 0x000098E3, 13040: 0x00009ADF, 13041: 0x00009B2F, 13042: 0x00004E7F, 13043: 0x00005070, 13044: 0x0000506A, 13045: 0x00005061, 13046: 0x0000505E, 13047: 0x00005060, 13048: 0x00005053, 13049: 0x0000504B, 13050: 0x0000505D, 13051: 0x00005072, 13052: 0x00005048, 13053: 0x0000504D, 13054: 0x00005041, 13055: 0x0000505B, 13056: 0x0000504A, 13057: 0x00005062, 13058: 0x00005015, 13059: 0x00005045, 13060: 0x0000505F, 13061: 0x00005069, 13062: 0x0000506B, 13063: 0x00005063, 13064: 0x00005064, 13065: 0x00005046, 13066: 0x00005040, 13067: 0x0000506E, 13068: 0x00005073, 13069: 0x00005057, 13070: 0x00005051, 13071: 0x000051D0, 13072: 0x0000526B, 13073: 0x0000526D, 13074: 0x0000526C, 13075: 0x0000526E, 13076: 0x000052D6, 13077: 0x000052D3, 13078: 0x0000532D, 13079: 0x0000539C, 13080: 0x00005575, 13081: 0x00005576, 13082: 0x0000553C, 13083: 0x0000554D, 13084: 0x00005550, 13085: 0x00005534, 13086: 0x0000552A, 13087: 0x00005551, 13088: 0x00005562, 13089: 0x00005536, 13090: 0x00005535, 13091: 0x00005530, 13092: 0x00005552, 13093: 0x00005545, 13094: 0x0000550C, 13095: 0x00005532, 13096: 0x00005565, 13097: 0x0000554E, 13098: 0x00005539, 13099: 0x00005548, 13100: 0x0000552D, 13101: 0x0000553B, 13102: 0x00005540, 13103: 0x0000554B, 13104: 0x0000570A, 13105: 0x00005707, 13106: 0x000057FB, 13107: 0x00005814, 13108: 0x000057E2, 13109: 0x000057F6, 13110: 0x000057DC, 13111: 0x000057F4, 13112: 0x00005800, 13113: 0x000057ED, 13114: 0x000057FD, 13115: 0x00005808, 13116: 0x000057F8, 13117: 0x0000580B, 13118: 0x000057F3, 13119: 0x000057CF, 13120: 0x00005807, 13121: 0x000057EE, 13122: 0x000057E3, 13123: 0x000057F2, 13124: 0x000057E5, 13125: 0x000057EC, 13126: 0x000057E1, 13127: 0x0000580E, 13128: 0x000057FC, 13129: 0x00005810, 13130: 0x000057E7, 13131: 0x00005801, 13132: 0x0000580C, 13133: 0x000057F1, 13134: 0x000057E9, 13135: 0x000057F0, 13136: 0x0000580D, 13137: 0x00005804, 13138: 0x0000595C, 13139: 0x00005A60, 13140: 0x00005A58, 13141: 0x00005A55, 13142: 0x00005A67, 13143: 0x00005A5E, 13144: 0x00005A38, 13145: 0x00005A35, 13146: 0x00005A6D, 13147: 0x00005A50, 13148: 0x00005A5F, 13149: 0x00005A65, 13150: 0x00005A6C, 13151: 0x00005A53, 13152: 0x00005A64, 13153: 0x00005A57, 13154: 0x00005A43, 13155: 0x00005A5D, 13156: 0x00005A52, 13157: 0x00005A44, 13158: 0x00005A5B, 13159: 0x00005A48, 13160: 0x00005A8E, 13161: 0x00005A3E, 13162: 0x00005A4D, 13163: 0x00005A39, 13164: 0x00005A4C, 13165: 0x00005A70, 13166: 0x00005A69, 13167: 0x00005A47, 13168: 0x00005A51, 13169: 0x00005A56, 13170: 0x00005A42, 13171: 0x00005A5C, 13172: 0x00005B72, 13173: 0x00005B6E, 13174: 0x00005BC1, 13175: 0x00005BC0, 13176: 0x00005C59, 13177: 0x00005D1E, 13178: 0x00005D0B, 13179: 0x00005D1D, 13180: 0x00005D1A, 13181: 0x00005D20, 13182: 0x00005D0C, 13183: 0x00005D28, 13184: 0x00005D0D, 13185: 0x00005D26, 13186: 0x00005D25, 13187: 0x00005D0F, 13188: 0x00005D30, 13189: 0x00005D12, 13190: 0x00005D23, 13191: 0x00005D1F, 13192: 0x00005D2E, 13193: 0x00005E3E, 13194: 0x00005E34, 13195: 0x00005EB1, 13196: 0x00005EB4, 13197: 0x00005EB9, 13198: 0x00005EB2, 13199: 0x00005EB3, 13200: 0x00005F36, 13201: 0x00005F38, 13202: 0x00005F9B, 13203: 0x00005F96, 13204: 0x00005F9F, 13205: 0x0000608A, 13206: 0x00006090, 13207: 0x00006086, 13208: 0x000060BE, 13209: 0x000060B0, 13210: 0x000060BA, 13211: 0x000060D3, 13212: 0x000060D4, 13213: 0x000060CF, 13214: 0x000060E4, 13215: 0x000060D9, 13216: 0x000060DD, 13217: 0x000060C8, 13218: 0x000060B1, 13219: 0x000060DB, 13220: 0x000060B7, 13221: 0x000060CA, 13222: 0x000060BF, 13223: 0x000060C3, 13224: 0x000060CD, 13225: 0x000060C0, 13226: 0x00006332, 13227: 0x00006365, 13228: 0x0000638A, 13229: 0x00006382, 13230: 0x0000637D, 13231: 0x000063BD, 13232: 0x0000639E, 13233: 0x000063AD, 13234: 0x0000639D, 13235: 0x00006397, 13236: 0x000063AB, 13237: 0x0000638E, 13238: 0x0000636F, 13239: 0x00006387, 13240: 0x00006390, 13241: 0x0000636E, 13242: 0x000063AF, 13243: 0x00006375, 13244: 0x0000639C, 13245: 0x0000636D, 13246: 0x000063AE, 13247: 0x0000637C, 13248: 0x000063A4, 13249: 0x0000633B, 13250: 0x0000639F, 13251: 0x00006378, 13252: 0x00006385, 13253: 0x00006381, 13254: 0x00006391, 13255: 0x0000638D, 13256: 0x00006370, 13257: 0x00006553, 13258: 0x000065CD, 13259: 0x00006665, 13260: 0x00006661, 13261: 0x0000665B, 13262: 0x00006659, 13263: 0x0000665C, 13264: 0x00006662, 13265: 0x00006718, 13266: 0x00006879, 13267: 0x00006887, 13268: 0x00006890, 13269: 0x0000689C, 13270: 0x0000686D, 13271: 0x0000686E, 13272: 0x000068AE, 13273: 0x000068AB, 13274: 0x00006956, 13275: 0x0000686F, 13276: 0x000068A3, 13277: 0x000068AC, 13278: 0x000068A9, 13279: 0x00006875, 13280: 0x00006874, 13281: 0x000068B2, 13282: 0x0000688F, 13283: 0x00006877, 13284: 0x00006892, 13285: 0x0000687C, 13286: 0x0000686B, 13287: 0x00006872, 13288: 0x000068AA, 13289: 0x00006880, 13290: 0x00006871, 13291: 0x0000687E, 13292: 0x0000689B, 13293: 0x00006896, 13294: 0x0000688B, 13295: 0x000068A0, 13296: 0x00006889, 13297: 0x000068A4, 13298: 0x00006878, 13299: 0x0000687B, 13300: 0x00006891, 13301: 0x0000688C, 13302: 0x0000688A, 13303: 0x0000687D, 13304: 0x00006B36, 13305: 0x00006B33, 13306: 0x00006B37, 13307: 0x00006B38, 13308: 0x00006B91, 13309: 0x00006B8F, 13310: 0x00006B8D, 13311: 0x00006B8E, 13312: 0x00006B8C, 13313: 0x00006C2A, 13314: 0x00006DC0, 13315: 0x00006DAB, 13316: 0x00006DB4, 13317: 0x00006DB3, 13318: 0x00006E74, 13319: 0x00006DAC, 13320: 0x00006DE9, 13321: 0x00006DE2, 13322: 0x00006DB7, 13323: 0x00006DF6, 13324: 0x00006DD4, 13325: 0x00006E00, 13326: 0x00006DC8, 13327: 0x00006DE0, 13328: 0x00006DDF, 13329: 0x00006DD6, 13330: 0x00006DBE, 13331: 0x00006DE5, 13332: 0x00006DDC, 13333: 0x00006DDD, 13334: 0x00006DDB, 13335: 0x00006DF4, 13336: 0x00006DCA, 13337: 0x00006DBD, 13338: 0x00006DED, 13339: 0x00006DF0, 13340: 0x00006DBA, 13341: 0x00006DD5, 13342: 0x00006DC2, 13343: 0x00006DCF, 13344: 0x00006DC9, 13345: 0x00006DD0, 13346: 0x00006DF2, 13347: 0x00006DD3, 13348: 0x00006DFD, 13349: 0x00006DD7, 13350: 0x00006DCD, 13351: 0x00006DE3, 13352: 0x00006DBB, 13353: 0x000070FA, 13354: 0x0000710D, 13355: 0x000070F7, 13356: 0x00007117, 13357: 0x000070F4, 13358: 0x0000710C, 13359: 0x000070F0, 13360: 0x00007104, 13361: 0x000070F3, 13362: 0x00007110, 13363: 0x000070FC, 13364: 0x000070FF, 13365: 0x00007106, 13366: 0x00007113, 13367: 0x00007100, 13368: 0x000070F8, 13369: 0x000070F6, 13370: 0x0000710B, 13371: 0x00007102, 13372: 0x0000710E, 13373: 0x0000727E, 13374: 0x0000727B, 13375: 0x0000727C, 13376: 0x0000727F, 13377: 0x0000731D, 13378: 0x00007317, 13379: 0x00007307, 13380: 0x00007311, 13381: 0x00007318, 13382: 0x0000730A, 13383: 0x00007308, 13384: 0x000072FF, 13385: 0x0000730F, 13386: 0x0000731E, 13387: 0x00007388, 13388: 0x000073F6, 13389: 0x000073F8, 13390: 0x000073F5, 13391: 0x00007404, 13392: 0x00007401, 13393: 0x000073FD, 13394: 0x00007407, 13395: 0x00007400, 13396: 0x000073FA, 13397: 0x000073FC, 13398: 0x000073FF, 13399: 0x0000740C, 13400: 0x0000740B, 13401: 0x000073F4, 13402: 0x00007408, 13403: 0x00007564, 13404: 0x00007563, 13405: 0x000075CE, 13406: 0x000075D2, 13407: 0x000075CF, 13408: 0x000075CB, 13409: 0x000075CC, 13410: 0x000075D1, 13411: 0x000075D0, 13412: 0x0000768F, 13413: 0x00007689, 13414: 0x000076D3, 13415: 0x00007739, 13416: 0x0000772F, 13417: 0x0000772D, 13418: 0x00007731, 13419: 0x00007732, 13420: 0x00007734, 13421: 0x00007733, 13422: 0x0000773D, 13423: 0x00007725, 13424: 0x0000773B, 13425: 0x00007735, 13426: 0x00007848, 13427: 0x00007852, 13428: 0x00007849, 13429: 0x0000784D, 13430: 0x0000784A, 13431: 0x0000784C, 13432: 0x00007826, 13433: 0x00007845, 13434: 0x00007850, 13435: 0x00007964, 13436: 0x00007967, 13437: 0x00007969, 13438: 0x0000796A, 13439: 0x00007963, 13440: 0x0000796B, 13441: 0x00007961, 13442: 0x000079BB, 13443: 0x000079FA, 13444: 0x000079F8, 13445: 0x000079F6, 13446: 0x000079F7, 13447: 0x00007A8F, 13448: 0x00007A94, 13449: 0x00007A90, 13450: 0x00007B35, 13451: 0x00007B47, 13452: 0x00007B34, 13453: 0x00007B25, 13454: 0x00007B30, 13455: 0x00007B22, 13456: 0x00007B24, 13457: 0x00007B33, 13458: 0x00007B18, 13459: 0x00007B2A, 13460: 0x00007B1D, 13461: 0x00007B31, 13462: 0x00007B2B, 13463: 0x00007B2D, 13464: 0x00007B2F, 13465: 0x00007B32, 13466: 0x00007B38, 13467: 0x00007B1A, 13468: 0x00007B23, 13469: 0x00007C94, 13470: 0x00007C98, 13471: 0x00007C96, 13472: 0x00007CA3, 13473: 0x00007D35, 13474: 0x00007D3D, 13475: 0x00007D38, 13476: 0x00007D36, 13477: 0x00007D3A, 13478: 0x00007D45, 13479: 0x00007D2C, 13480: 0x00007D29, 13481: 0x00007D41, 13482: 0x00007D47, 13483: 0x00007D3E, 13484: 0x00007D3F, 13485: 0x00007D4A, 13486: 0x00007D3B, 13487: 0x00007D28, 13488: 0x00007F63, 13489: 0x00007F95, 13490: 0x00007F9C, 13491: 0x00007F9D, 13492: 0x00007F9B, 13493: 0x00007FCA, 13494: 0x00007FCB, 13495: 0x00007FCD, 13496: 0x00007FD0, 13497: 0x00007FD1, 13498: 0x00007FC7, 13499: 0x00007FCF, 13500: 0x00007FC9, 13501: 0x0000801F, 13502: 0x0000801E, 13503: 0x0000801B, 13504: 0x00008047, 13505: 0x00008043, 13506: 0x00008048, 13507: 0x00008118, 13508: 0x00008125, 13509: 0x00008119, 13510: 0x0000811B, 13511: 0x0000812D, 13512: 0x0000811F, 13513: 0x0000812C, 13514: 0x0000811E, 13515: 0x00008121, 13516: 0x00008115, 13517: 0x00008127, 13518: 0x0000811D, 13519: 0x00008122, 13520: 0x00008211, 13521: 0x00008238, 13522: 0x00008233, 13523: 0x0000823A, 13524: 0x00008234, 13525: 0x00008232, 13526: 0x00008274, 13527: 0x00008390, 13528: 0x000083A3, 13529: 0x000083A8, 13530: 0x0000838D, 13531: 0x0000837A, 13532: 0x00008373, 13533: 0x000083A4, 13534: 0x00008374, 13535: 0x0000838F, 13536: 0x00008381, 13537: 0x00008395, 13538: 0x00008399, 13539: 0x00008375, 13540: 0x00008394, 13541: 0x000083A9, 13542: 0x0000837D, 13543: 0x00008383, 13544: 0x0000838C, 13545: 0x0000839D, 13546: 0x0000839B, 13547: 0x000083AA, 13548: 0x0000838B, 13549: 0x0000837E, 13550: 0x000083A5, 13551: 0x000083AF, 13552: 0x00008388, 13553: 0x00008397, 13554: 0x000083B0, 13555: 0x0000837F, 13556: 0x000083A6, 13557: 0x00008387, 13558: 0x000083AE, 13559: 0x00008376, 13560: 0x0000839A, 13561: 0x00008659, 13562: 0x00008656, 13563: 0x000086BF, 13564: 0x000086B7, 13565: 0x000086C2, 13566: 0x000086C1, 13567: 0x000086C5, 13568: 0x000086BA, 13569: 0x000086B0, 13570: 0x000086C8, 13571: 0x000086B9, 13572: 0x000086B3, 13573: 0x000086B8, 13574: 0x000086CC, 13575: 0x000086B4, 13576: 0x000086BB, 13577: 0x000086BC, 13578: 0x000086C3, 13579: 0x000086BD, 13580: 0x000086BE, 13581: 0x00008852, 13582: 0x00008889, 13583: 0x00008895, 13584: 0x000088A8, 13585: 0x000088A2, 13586: 0x000088AA, 13587: 0x0000889A, 13588: 0x00008891, 13589: 0x000088A1, 13590: 0x0000889F, 13591: 0x00008898, 13592: 0x000088A7, 13593: 0x00008899, 13594: 0x0000889B, 13595: 0x00008897, 13596: 0x000088A4, 13597: 0x000088AC, 13598: 0x0000888C, 13599: 0x00008893, 13600: 0x0000888E, 13601: 0x00008982, 13602: 0x000089D6, 13603: 0x000089D9, 13604: 0x000089D5, 13605: 0x00008A30, 13606: 0x00008A27, 13607: 0x00008A2C, 13608: 0x00008A1E, 13609: 0x00008C39, 13610: 0x00008C3B, 13611: 0x00008C5C, 13612: 0x00008C5D, 13613: 0x00008C7D, 13614: 0x00008CA5, 13615: 0x00008D7D, 13616: 0x00008D7B, 13617: 0x00008D79, 13618: 0x00008DBC, 13619: 0x00008DC2, 13620: 0x00008DB9, 13621: 0x00008DBF, 13622: 0x00008DC1, 13623: 0x00008ED8, 13624: 0x00008EDE, 13625: 0x00008EDD, 13626: 0x00008EDC, 13627: 0x00008ED7, 13628: 0x00008EE0, 13629: 0x00008EE1, 13630: 0x00009024, 13631: 0x0000900B, 13632: 0x00009011, 13633: 0x0000901C, 13634: 0x0000900C, 13635: 0x00009021, 13636: 0x000090EF, 13637: 0x000090EA, 13638: 0x000090F0, 13639: 0x000090F4, 13640: 0x000090F2, 13641: 0x000090F3, 13642: 0x000090D4, 13643: 0x000090EB, 13644: 0x000090EC, 13645: 0x000090E9, 13646: 0x00009156, 13647: 0x00009158, 13648: 0x0000915A, 13649: 0x00009153, 13650: 0x00009155, 13651: 0x000091EC, 13652: 0x000091F4, 13653: 0x000091F1, 13654: 0x000091F3, 13655: 0x000091F8, 13656: 0x000091E4, 13657: 0x000091F9, 13658: 0x000091EA, 13659: 0x000091EB, 13660: 0x000091F7, 13661: 0x000091E8, 13662: 0x000091EE, 13663: 0x0000957A, 13664: 0x00009586, 13665: 0x00009588, 13666: 0x0000967C, 13667: 0x0000966D, 13668: 0x0000966B, 13669: 0x00009671, 13670: 0x0000966F, 13671: 0x000096BF, 13672: 0x0000976A, 13673: 0x00009804, 13674: 0x000098E5, 13675: 0x00009997, 13676: 0x0000509B, 13677: 0x00005095, 13678: 0x00005094, 13679: 0x0000509E, 13680: 0x0000508B, 13681: 0x000050A3, 13682: 0x00005083, 13683: 0x0000508C, 13684: 0x0000508E, 13685: 0x0000509D, 13686: 0x00005068, 13687: 0x0000509C, 13688: 0x00005092, 13689: 0x00005082, 13690: 0x00005087, 13691: 0x0000515F, 13692: 0x000051D4, 13693: 0x00005312, 13694: 0x00005311, 13695: 0x000053A4, 13696: 0x000053A7, 13697: 0x00005591, 13698: 0x000055A8, 13699: 0x000055A5, 13700: 0x000055AD, 13701: 0x00005577, 13702: 0x00005645, 13703: 0x000055A2, 13704: 0x00005593, 13705: 0x00005588, 13706: 0x0000558F, 13707: 0x000055B5, 13708: 0x00005581, 13709: 0x000055A3, 13710: 0x00005592, 13711: 0x000055A4, 13712: 0x0000557D, 13713: 0x0000558C, 13714: 0x000055A6, 13715: 0x0000557F, 13716: 0x00005595, 13717: 0x000055A1, 13718: 0x0000558E, 13719: 0x0000570C, 13720: 0x00005829, 13721: 0x00005837, 13722: 0x00005819, 13723: 0x0000581E, 13724: 0x00005827, 13725: 0x00005823, 13726: 0x00005828, 13727: 0x000057F5, 13728: 0x00005848, 13729: 0x00005825, 13730: 0x0000581C, 13731: 0x0000581B, 13732: 0x00005833, 13733: 0x0000583F, 13734: 0x00005836, 13735: 0x0000582E, 13736: 0x00005839, 13737: 0x00005838, 13738: 0x0000582D, 13739: 0x0000582C, 13740: 0x0000583B, 13741: 0x00005961, 13742: 0x00005AAF, 13743: 0x00005A94, 13744: 0x00005A9F, 13745: 0x00005A7A, 13746: 0x00005AA2, 13747: 0x00005A9E, 13748: 0x00005A78, 13749: 0x00005AA6, 13750: 0x00005A7C, 13751: 0x00005AA5, 13752: 0x00005AAC, 13753: 0x00005A95, 13754: 0x00005AAE, 13755: 0x00005A37, 13756: 0x00005A84, 13757: 0x00005A8A, 13758: 0x00005A97, 13759: 0x00005A83, 13760: 0x00005A8B, 13761: 0x00005AA9, 13762: 0x00005A7B, 13763: 0x00005A7D, 13764: 0x00005A8C, 13765: 0x00005A9C, 13766: 0x00005A8F, 13767: 0x00005A93, 13768: 0x00005A9D, 13769: 0x00005BEA, 13770: 0x00005BCD, 13771: 0x00005BCB, 13772: 0x00005BD4, 13773: 0x00005BD1, 13774: 0x00005BCA, 13775: 0x00005BCE, 13776: 0x00005C0C, 13777: 0x00005C30, 13778: 0x00005D37, 13779: 0x00005D43, 13780: 0x00005D6B, 13781: 0x00005D41, 13782: 0x00005D4B, 13783: 0x00005D3F, 13784: 0x00005D35, 13785: 0x00005D51, 13786: 0x00005D4E, 13787: 0x00005D55, 13788: 0x00005D33, 13789: 0x00005D3A, 13790: 0x00005D52, 13791: 0x00005D3D, 13792: 0x00005D31, 13793: 0x00005D59, 13794: 0x00005D42, 13795: 0x00005D39, 13796: 0x00005D49, 13797: 0x00005D38, 13798: 0x00005D3C, 13799: 0x00005D32, 13800: 0x00005D36, 13801: 0x00005D40, 13802: 0x00005D45, 13803: 0x00005E44, 13804: 0x00005E41, 13805: 0x00005F58, 13806: 0x00005FA6, 13807: 0x00005FA5, 13808: 0x00005FAB, 13809: 0x000060C9, 13810: 0x000060B9, 13811: 0x000060CC, 13812: 0x000060E2, 13813: 0x000060CE, 13814: 0x000060C4, 13815: 0x00006114, 13816: 0x000060F2, 13817: 0x0000610A, 13818: 0x00006116, 13819: 0x00006105, 13820: 0x000060F5, 13821: 0x00006113, 13822: 0x000060F8, 13823: 0x000060FC, 13824: 0x000060FE, 13825: 0x000060C1, 13826: 0x00006103, 13827: 0x00006118, 13828: 0x0000611D, 13829: 0x00006110, 13830: 0x000060FF, 13831: 0x00006104, 13832: 0x0000610B, 13833: 0x0000624A, 13834: 0x00006394, 13835: 0x000063B1, 13836: 0x000063B0, 13837: 0x000063CE, 13838: 0x000063E5, 13839: 0x000063E8, 13840: 0x000063EF, 13841: 0x000063C3, 13842: 0x0000649D, 13843: 0x000063F3, 13844: 0x000063CA, 13845: 0x000063E0, 13846: 0x000063F6, 13847: 0x000063D5, 13848: 0x000063F2, 13849: 0x000063F5, 13850: 0x00006461, 13851: 0x000063DF, 13852: 0x000063BE, 13853: 0x000063DD, 13854: 0x000063DC, 13855: 0x000063C4, 13856: 0x000063D8, 13857: 0x000063D3, 13858: 0x000063C2, 13859: 0x000063C7, 13860: 0x000063CC, 13861: 0x000063CB, 13862: 0x000063C8, 13863: 0x000063F0, 13864: 0x000063D7, 13865: 0x000063D9, 13866: 0x00006532, 13867: 0x00006567, 13868: 0x0000656A, 13869: 0x00006564, 13870: 0x0000655C, 13871: 0x00006568, 13872: 0x00006565, 13873: 0x0000658C, 13874: 0x0000659D, 13875: 0x0000659E, 13876: 0x000065AE, 13877: 0x000065D0, 13878: 0x000065D2, 13879: 0x0000667C, 13880: 0x0000666C, 13881: 0x0000667B, 13882: 0x00006680, 13883: 0x00006671, 13884: 0x00006679, 13885: 0x0000666A, 13886: 0x00006672, 13887: 0x00006701, 13888: 0x0000690C, 13889: 0x000068D3, 13890: 0x00006904, 13891: 0x000068DC, 13892: 0x0000692A, 13893: 0x000068EC, 13894: 0x000068EA, 13895: 0x000068F1, 13896: 0x0000690F, 13897: 0x000068D6, 13898: 0x000068F7, 13899: 0x000068EB, 13900: 0x000068E4, 13901: 0x000068F6, 13902: 0x00006913, 13903: 0x00006910, 13904: 0x000068F3, 13905: 0x000068E1, 13906: 0x00006907, 13907: 0x000068CC, 13908: 0x00006908, 13909: 0x00006970, 13910: 0x000068B4, 13911: 0x00006911, 13912: 0x000068EF, 13913: 0x000068C6, 13914: 0x00006914, 13915: 0x000068F8, 13916: 0x000068D0, 13917: 0x000068FD, 13918: 0x000068FC, 13919: 0x000068E8, 13920: 0x0000690B, 13921: 0x0000690A, 13922: 0x00006917, 13923: 0x000068CE, 13924: 0x000068C8, 13925: 0x000068DD, 13926: 0x000068DE, 13927: 0x000068E6, 13928: 0x000068F4, 13929: 0x000068D1, 13930: 0x00006906, 13931: 0x000068D4, 13932: 0x000068E9, 13933: 0x00006915, 13934: 0x00006925, 13935: 0x000068C7, 13936: 0x00006B39, 13937: 0x00006B3B, 13938: 0x00006B3F, 13939: 0x00006B3C, 13940: 0x00006B94, 13941: 0x00006B97, 13942: 0x00006B99, 13943: 0x00006B95, 13944: 0x00006BBD, 13945: 0x00006BF0, 13946: 0x00006BF2, 13947: 0x00006BF3, 13948: 0x00006C30, 13949: 0x00006DFC, 13950: 0x00006E46, 13951: 0x00006E47, 13952: 0x00006E1F, 13953: 0x00006E49, 13954: 0x00006E88, 13955: 0x00006E3C, 13956: 0x00006E3D, 13957: 0x00006E45, 13958: 0x00006E62, 13959: 0x00006E2B, 13960: 0x00006E3F, 13961: 0x00006E41, 13962: 0x00006E5D, 13963: 0x00006E73, 13964: 0x00006E1C, 13965: 0x00006E33, 13966: 0x00006E4B, 13967: 0x00006E40, 13968: 0x00006E51, 13969: 0x00006E3B, 13970: 0x00006E03, 13971: 0x00006E2E, 13972: 0x00006E5E, 13973: 0x00006E68, 13974: 0x00006E5C, 13975: 0x00006E61, 13976: 0x00006E31, 13977: 0x00006E28, 13978: 0x00006E60, 13979: 0x00006E71, 13980: 0x00006E6B, 13981: 0x00006E39, 13982: 0x00006E22, 13983: 0x00006E30, 13984: 0x00006E53, 13985: 0x00006E65, 13986: 0x00006E27, 13987: 0x00006E78, 13988: 0x00006E64, 13989: 0x00006E77, 13990: 0x00006E55, 13991: 0x00006E79, 13992: 0x00006E52, 13993: 0x00006E66, 13994: 0x00006E35, 13995: 0x00006E36, 13996: 0x00006E5A, 13997: 0x00007120, 13998: 0x0000711E, 13999: 0x0000712F, 14000: 0x000070FB, 14001: 0x0000712E, 14002: 0x00007131, 14003: 0x00007123, 14004: 0x00007125, 14005: 0x00007122, 14006: 0x00007132, 14007: 0x0000711F, 14008: 0x00007128, 14009: 0x0000713A, 14010: 0x0000711B, 14011: 0x0000724B, 14012: 0x0000725A, 14013: 0x00007288, 14014: 0x00007289, 14015: 0x00007286, 14016: 0x00007285, 14017: 0x0000728B, 14018: 0x00007312, 14019: 0x0000730B, 14020: 0x00007330, 14021: 0x00007322, 14022: 0x00007331, 14023: 0x00007333, 14024: 0x00007327, 14025: 0x00007332, 14026: 0x0000732D, 14027: 0x00007326, 14028: 0x00007323, 14029: 0x00007335, 14030: 0x0000730C, 14031: 0x0000742E, 14032: 0x0000742C, 14033: 0x00007430, 14034: 0x0000742B, 14035: 0x00007416, 14036: 0x0000741A, 14037: 0x00007421, 14038: 0x0000742D, 14039: 0x00007431, 14040: 0x00007424, 14041: 0x00007423, 14042: 0x0000741D, 14043: 0x00007429, 14044: 0x00007420, 14045: 0x00007432, 14046: 0x000074FB, 14047: 0x0000752F, 14048: 0x0000756F, 14049: 0x0000756C, 14050: 0x000075E7, 14051: 0x000075DA, 14052: 0x000075E1, 14053: 0x000075E6, 14054: 0x000075DD, 14055: 0x000075DF, 14056: 0x000075E4, 14057: 0x000075D7, 14058: 0x00007695, 14059: 0x00007692, 14060: 0x000076DA, 14061: 0x00007746, 14062: 0x00007747, 14063: 0x00007744, 14064: 0x0000774D, 14065: 0x00007745, 14066: 0x0000774A, 14067: 0x0000774E, 14068: 0x0000774B, 14069: 0x0000774C, 14070: 0x000077DE, 14071: 0x000077EC, 14072: 0x00007860, 14073: 0x00007864, 14074: 0x00007865, 14075: 0x0000785C, 14076: 0x0000786D, 14077: 0x00007871, 14078: 0x0000786A, 14079: 0x0000786E, 14080: 0x00007870, 14081: 0x00007869, 14082: 0x00007868, 14083: 0x0000785E, 14084: 0x00007862, 14085: 0x00007974, 14086: 0x00007973, 14087: 0x00007972, 14088: 0x00007970, 14089: 0x00007A02, 14090: 0x00007A0A, 14091: 0x00007A03, 14092: 0x00007A0C, 14093: 0x00007A04, 14094: 0x00007A99, 14095: 0x00007AE6, 14096: 0x00007AE4, 14097: 0x00007B4A, 14098: 0x00007B3B, 14099: 0x00007B44, 14100: 0x00007B48, 14101: 0x00007B4C, 14102: 0x00007B4E, 14103: 0x00007B40, 14104: 0x00007B58, 14105: 0x00007B45, 14106: 0x00007CA2, 14107: 0x00007C9E, 14108: 0x00007CA8, 14109: 0x00007CA1, 14110: 0x00007D58, 14111: 0x00007D6F, 14112: 0x00007D63, 14113: 0x00007D53, 14114: 0x00007D56, 14115: 0x00007D67, 14116: 0x00007D6A, 14117: 0x00007D4F, 14118: 0x00007D6D, 14119: 0x00007D5C, 14120: 0x00007D6B, 14121: 0x00007D52, 14122: 0x00007D54, 14123: 0x00007D69, 14124: 0x00007D51, 14125: 0x00007D5F, 14126: 0x00007D4E, 14127: 0x00007F3E, 14128: 0x00007F3F, 14129: 0x00007F65, 14130: 0x00007F66, 14131: 0x00007FA2, 14132: 0x00007FA0, 14133: 0x00007FA1, 14134: 0x00007FD7, 14135: 0x00008051, 14136: 0x0000804F, 14137: 0x00008050, 14138: 0x000080FE, 14139: 0x000080D4, 14140: 0x00008143, 14141: 0x0000814A, 14142: 0x00008152, 14143: 0x0000814F, 14144: 0x00008147, 14145: 0x0000813D, 14146: 0x0000814D, 14147: 0x0000813A, 14148: 0x000081E6, 14149: 0x000081EE, 14150: 0x000081F7, 14151: 0x000081F8, 14152: 0x000081F9, 14153: 0x00008204, 14154: 0x0000823C, 14155: 0x0000823D, 14156: 0x0000823F, 14157: 0x00008275, 14158: 0x0000833B, 14159: 0x000083CF, 14160: 0x000083F9, 14161: 0x00008423, 14162: 0x000083C0, 14163: 0x000083E8, 14164: 0x00008412, 14165: 0x000083E7, 14166: 0x000083E4, 14167: 0x000083FC, 14168: 0x000083F6, 14169: 0x00008410, 14170: 0x000083C6, 14171: 0x000083C8, 14172: 0x000083EB, 14173: 0x000083E3, 14174: 0x000083BF, 14175: 0x00008401, 14176: 0x000083DD, 14177: 0x000083E5, 14178: 0x000083D8, 14179: 0x000083FF, 14180: 0x000083E1, 14181: 0x000083CB, 14182: 0x000083CE, 14183: 0x000083D6, 14184: 0x000083F5, 14185: 0x000083C9, 14186: 0x00008409, 14187: 0x0000840F, 14188: 0x000083DE, 14189: 0x00008411, 14190: 0x00008406, 14191: 0x000083C2, 14192: 0x000083F3, 14193: 0x000083D5, 14194: 0x000083FA, 14195: 0x000083C7, 14196: 0x000083D1, 14197: 0x000083EA, 14198: 0x00008413, 14199: 0x000083C3, 14200: 0x000083EC, 14201: 0x000083EE, 14202: 0x000083C4, 14203: 0x000083FB, 14204: 0x000083D7, 14205: 0x000083E2, 14206: 0x0000841B, 14207: 0x000083DB, 14208: 0x000083FE, 14209: 0x000086D8, 14210: 0x000086E2, 14211: 0x000086E6, 14212: 0x000086D3, 14213: 0x000086E3, 14214: 0x000086DA, 14215: 0x000086EA, 14216: 0x000086DD, 14217: 0x000086EB, 14218: 0x000086DC, 14219: 0x000086EC, 14220: 0x000086E9, 14221: 0x000086D7, 14222: 0x000086E8, 14223: 0x000086D1, 14224: 0x00008848, 14225: 0x00008856, 14226: 0x00008855, 14227: 0x000088BA, 14228: 0x000088D7, 14229: 0x000088B9, 14230: 0x000088B8, 14231: 0x000088C0, 14232: 0x000088BE, 14233: 0x000088B6, 14234: 0x000088BC, 14235: 0x000088B7, 14236: 0x000088BD, 14237: 0x000088B2, 14238: 0x00008901, 14239: 0x000088C9, 14240: 0x00008995, 14241: 0x00008998, 14242: 0x00008997, 14243: 0x000089DD, 14244: 0x000089DA, 14245: 0x000089DB, 14246: 0x00008A4E, 14247: 0x00008A4D, 14248: 0x00008A39, 14249: 0x00008A59, 14250: 0x00008A40, 14251: 0x00008A57, 14252: 0x00008A58, 14253: 0x00008A44, 14254: 0x00008A45, 14255: 0x00008A52, 14256: 0x00008A48, 14257: 0x00008A51, 14258: 0x00008A4A, 14259: 0x00008A4C, 14260: 0x00008A4F, 14261: 0x00008C5F, 14262: 0x00008C81, 14263: 0x00008C80, 14264: 0x00008CBA, 14265: 0x00008CBE, 14266: 0x00008CB0, 14267: 0x00008CB9, 14268: 0x00008CB5, 14269: 0x00008D84, 14270: 0x00008D80, 14271: 0x00008D89, 14272: 0x00008DD8, 14273: 0x00008DD3, 14274: 0x00008DCD, 14275: 0x00008DC7, 14276: 0x00008DD6, 14277: 0x00008DDC, 14278: 0x00008DCF, 14279: 0x00008DD5, 14280: 0x00008DD9, 14281: 0x00008DC8, 14282: 0x00008DD7, 14283: 0x00008DC5, 14284: 0x00008EEF, 14285: 0x00008EF7, 14286: 0x00008EFA, 14287: 0x00008EF9, 14288: 0x00008EE6, 14289: 0x00008EEE, 14290: 0x00008EE5, 14291: 0x00008EF5, 14292: 0x00008EE7, 14293: 0x00008EE8, 14294: 0x00008EF6, 14295: 0x00008EEB, 14296: 0x00008EF1, 14297: 0x00008EEC, 14298: 0x00008EF4, 14299: 0x00008EE9, 14300: 0x0000902D, 14301: 0x00009034, 14302: 0x0000902F, 14303: 0x00009106, 14304: 0x0000912C, 14305: 0x00009104, 14306: 0x000090FF, 14307: 0x000090FC, 14308: 0x00009108, 14309: 0x000090F9, 14310: 0x000090FB, 14311: 0x00009101, 14312: 0x00009100, 14313: 0x00009107, 14314: 0x00009105, 14315: 0x00009103, 14316: 0x00009161, 14317: 0x00009164, 14318: 0x0000915F, 14319: 0x00009162, 14320: 0x00009160, 14321: 0x00009201, 14322: 0x0000920A, 14323: 0x00009225, 14324: 0x00009203, 14325: 0x0000921A, 14326: 0x00009226, 14327: 0x0000920F, 14328: 0x0000920C, 14329: 0x00009200, 14330: 0x00009212, 14331: 0x000091FF, 14332: 0x000091FD, 14333: 0x00009206, 14334: 0x00009204, 14335: 0x00009227, 14336: 0x00009202, 14337: 0x0000921C, 14338: 0x00009224, 14339: 0x00009219, 14340: 0x00009217, 14341: 0x00009205, 14342: 0x00009216, 14343: 0x0000957B, 14344: 0x0000958D, 14345: 0x0000958C, 14346: 0x00009590, 14347: 0x00009687, 14348: 0x0000967E, 14349: 0x00009688, 14350: 0x00009689, 14351: 0x00009683, 14352: 0x00009680, 14353: 0x000096C2, 14354: 0x000096C8, 14355: 0x000096C3, 14356: 0x000096F1, 14357: 0x000096F0, 14358: 0x0000976C, 14359: 0x00009770, 14360: 0x0000976E, 14361: 0x00009807, 14362: 0x000098A9, 14363: 0x000098EB, 14364: 0x00009CE6, 14365: 0x00009EF9, 14366: 0x00004E83, 14367: 0x00004E84, 14368: 0x00004EB6, 14369: 0x000050BD, 14370: 0x000050BF, 14371: 0x000050C6, 14372: 0x000050AE, 14373: 0x000050C4, 14374: 0x000050CA, 14375: 0x000050B4, 14376: 0x000050C8, 14377: 0x000050C2, 14378: 0x000050B0, 14379: 0x000050C1, 14380: 0x000050BA, 14381: 0x000050B1, 14382: 0x000050CB, 14383: 0x000050C9, 14384: 0x000050B6, 14385: 0x000050B8, 14386: 0x000051D7, 14387: 0x0000527A, 14388: 0x00005278, 14389: 0x0000527B, 14390: 0x0000527C, 14391: 0x000055C3, 14392: 0x000055DB, 14393: 0x000055CC, 14394: 0x000055D0, 14395: 0x000055CB, 14396: 0x000055CA, 14397: 0x000055DD, 14398: 0x000055C0, 14399: 0x000055D4, 14400: 0x000055C4, 14401: 0x000055E9, 14402: 0x000055BF, 14403: 0x000055D2, 14404: 0x0000558D, 14405: 0x000055CF, 14406: 0x000055D5, 14407: 0x000055E2, 14408: 0x000055D6, 14409: 0x000055C8, 14410: 0x000055F2, 14411: 0x000055CD, 14412: 0x000055D9, 14413: 0x000055C2, 14414: 0x00005714, 14415: 0x00005853, 14416: 0x00005868, 14417: 0x00005864, 14418: 0x0000584F, 14419: 0x0000584D, 14420: 0x00005849, 14421: 0x0000586F, 14422: 0x00005855, 14423: 0x0000584E, 14424: 0x0000585D, 14425: 0x00005859, 14426: 0x00005865, 14427: 0x0000585B, 14428: 0x0000583D, 14429: 0x00005863, 14430: 0x00005871, 14431: 0x000058FC, 14432: 0x00005AC7, 14433: 0x00005AC4, 14434: 0x00005ACB, 14435: 0x00005ABA, 14436: 0x00005AB8, 14437: 0x00005AB1, 14438: 0x00005AB5, 14439: 0x00005AB0, 14440: 0x00005ABF, 14441: 0x00005AC8, 14442: 0x00005ABB, 14443: 0x00005AC6, 14444: 0x00005AB7, 14445: 0x00005AC0, 14446: 0x00005ACA, 14447: 0x00005AB4, 14448: 0x00005AB6, 14449: 0x00005ACD, 14450: 0x00005AB9, 14451: 0x00005A90, 14452: 0x00005BD6, 14453: 0x00005BD8, 14454: 0x00005BD9, 14455: 0x00005C1F, 14456: 0x00005C33, 14457: 0x00005D71, 14458: 0x00005D63, 14459: 0x00005D4A, 14460: 0x00005D65, 14461: 0x00005D72, 14462: 0x00005D6C, 14463: 0x00005D5E, 14464: 0x00005D68, 14465: 0x00005D67, 14466: 0x00005D62, 14467: 0x00005DF0, 14468: 0x00005E4F, 14469: 0x00005E4E, 14470: 0x00005E4A, 14471: 0x00005E4D, 14472: 0x00005E4B, 14473: 0x00005EC5, 14474: 0x00005ECC, 14475: 0x00005EC6, 14476: 0x00005ECB, 14477: 0x00005EC7, 14478: 0x00005F40, 14479: 0x00005FAF, 14480: 0x00005FAD, 14481: 0x000060F7, 14482: 0x00006149, 14483: 0x0000614A, 14484: 0x0000612B, 14485: 0x00006145, 14486: 0x00006136, 14487: 0x00006132, 14488: 0x0000612E, 14489: 0x00006146, 14490: 0x0000612F, 14491: 0x0000614F, 14492: 0x00006129, 14493: 0x00006140, 14494: 0x00006220, 14495: 0x00009168, 14496: 0x00006223, 14497: 0x00006225, 14498: 0x00006224, 14499: 0x000063C5, 14500: 0x000063F1, 14501: 0x000063EB, 14502: 0x00006410, 14503: 0x00006412, 14504: 0x00006409, 14505: 0x00006420, 14506: 0x00006424, 14507: 0x00006433, 14508: 0x00006443, 14509: 0x0000641F, 14510: 0x00006415, 14511: 0x00006418, 14512: 0x00006439, 14513: 0x00006437, 14514: 0x00006422, 14515: 0x00006423, 14516: 0x0000640C, 14517: 0x00006426, 14518: 0x00006430, 14519: 0x00006428, 14520: 0x00006441, 14521: 0x00006435, 14522: 0x0000642F, 14523: 0x0000640A, 14524: 0x0000641A, 14525: 0x00006440, 14526: 0x00006425, 14527: 0x00006427, 14528: 0x0000640B, 14529: 0x000063E7, 14530: 0x0000641B, 14531: 0x0000642E, 14532: 0x00006421, 14533: 0x0000640E, 14534: 0x0000656F, 14535: 0x00006592, 14536: 0x000065D3, 14537: 0x00006686, 14538: 0x0000668C, 14539: 0x00006695, 14540: 0x00006690, 14541: 0x0000668B, 14542: 0x0000668A, 14543: 0x00006699, 14544: 0x00006694, 14545: 0x00006678, 14546: 0x00006720, 14547: 0x00006966, 14548: 0x0000695F, 14549: 0x00006938, 14550: 0x0000694E, 14551: 0x00006962, 14552: 0x00006971, 14553: 0x0000693F, 14554: 0x00006945, 14555: 0x0000696A, 14556: 0x00006939, 14557: 0x00006942, 14558: 0x00006957, 14559: 0x00006959, 14560: 0x0000697A, 14561: 0x00006948, 14562: 0x00006949, 14563: 0x00006935, 14564: 0x0000696C, 14565: 0x00006933, 14566: 0x0000693D, 14567: 0x00006965, 14568: 0x000068F0, 14569: 0x00006978, 14570: 0x00006934, 14571: 0x00006969, 14572: 0x00006940, 14573: 0x0000696F, 14574: 0x00006944, 14575: 0x00006976, 14576: 0x00006958, 14577: 0x00006941, 14578: 0x00006974, 14579: 0x0000694C, 14580: 0x0000693B, 14581: 0x0000694B, 14582: 0x00006937, 14583: 0x0000695C, 14584: 0x0000694F, 14585: 0x00006951, 14586: 0x00006932, 14587: 0x00006952, 14588: 0x0000692F, 14589: 0x0000697B, 14590: 0x0000693C, 14591: 0x00006B46, 14592: 0x00006B45, 14593: 0x00006B43, 14594: 0x00006B42, 14595: 0x00006B48, 14596: 0x00006B41, 14597: 0x00006B9B, 14598: 0x0000FA0D, 14599: 0x00006BFB, 14600: 0x00006BFC, 14601: 0x00006BF9, 14602: 0x00006BF7, 14603: 0x00006BF8, 14604: 0x00006E9B, 14605: 0x00006ED6, 14606: 0x00006EC8, 14607: 0x00006E8F, 14608: 0x00006EC0, 14609: 0x00006E9F, 14610: 0x00006E93, 14611: 0x00006E94, 14612: 0x00006EA0, 14613: 0x00006EB1, 14614: 0x00006EB9, 14615: 0x00006EC6, 14616: 0x00006ED2, 14617: 0x00006EBD, 14618: 0x00006EC1, 14619: 0x00006E9E, 14620: 0x00006EC9, 14621: 0x00006EB7, 14622: 0x00006EB0, 14623: 0x00006ECD, 14624: 0x00006EA6, 14625: 0x00006ECF, 14626: 0x00006EB2, 14627: 0x00006EBE, 14628: 0x00006EC3, 14629: 0x00006EDC, 14630: 0x00006ED8, 14631: 0x00006E99, 14632: 0x00006E92, 14633: 0x00006E8E, 14634: 0x00006E8D, 14635: 0x00006EA4, 14636: 0x00006EA1, 14637: 0x00006EBF, 14638: 0x00006EB3, 14639: 0x00006ED0, 14640: 0x00006ECA, 14641: 0x00006E97, 14642: 0x00006EAE, 14643: 0x00006EA3, 14644: 0x00007147, 14645: 0x00007154, 14646: 0x00007152, 14647: 0x00007163, 14648: 0x00007160, 14649: 0x00007141, 14650: 0x0000715D, 14651: 0x00007162, 14652: 0x00007172, 14653: 0x00007178, 14654: 0x0000716A, 14655: 0x00007161, 14656: 0x00007142, 14657: 0x00007158, 14658: 0x00007143, 14659: 0x0000714B, 14660: 0x00007170, 14661: 0x0000715F, 14662: 0x00007150, 14663: 0x00007153, 14664: 0x00007144, 14665: 0x0000714D, 14666: 0x0000715A, 14667: 0x0000724F, 14668: 0x0000728D, 14669: 0x0000728C, 14670: 0x00007291, 14671: 0x00007290, 14672: 0x0000728E, 14673: 0x0000733C, 14674: 0x00007342, 14675: 0x0000733B, 14676: 0x0000733A, 14677: 0x00007340, 14678: 0x0000734A, 14679: 0x00007349, 14680: 0x00007444, 14681: 0x0000744A, 14682: 0x0000744B, 14683: 0x00007452, 14684: 0x00007451, 14685: 0x00007457, 14686: 0x00007440, 14687: 0x0000744F, 14688: 0x00007450, 14689: 0x0000744E, 14690: 0x00007442, 14691: 0x00007446, 14692: 0x0000744D, 14693: 0x00007454, 14694: 0x000074E1, 14695: 0x000074FF, 14696: 0x000074FE, 14697: 0x000074FD, 14698: 0x0000751D, 14699: 0x00007579, 14700: 0x00007577, 14701: 0x00006983, 14702: 0x000075EF, 14703: 0x0000760F, 14704: 0x00007603, 14705: 0x000075F7, 14706: 0x000075FE, 14707: 0x000075FC, 14708: 0x000075F9, 14709: 0x000075F8, 14710: 0x00007610, 14711: 0x000075FB, 14712: 0x000075F6, 14713: 0x000075ED, 14714: 0x000075F5, 14715: 0x000075FD, 14716: 0x00007699, 14717: 0x000076B5, 14718: 0x000076DD, 14719: 0x00007755, 14720: 0x0000775F, 14721: 0x00007760, 14722: 0x00007752, 14723: 0x00007756, 14724: 0x0000775A, 14725: 0x00007769, 14726: 0x00007767, 14727: 0x00007754, 14728: 0x00007759, 14729: 0x0000776D, 14730: 0x000077E0, 14731: 0x00007887, 14732: 0x0000789A, 14733: 0x00007894, 14734: 0x0000788F, 14735: 0x00007884, 14736: 0x00007895, 14737: 0x00007885, 14738: 0x00007886, 14739: 0x000078A1, 14740: 0x00007883, 14741: 0x00007879, 14742: 0x00007899, 14743: 0x00007880, 14744: 0x00007896, 14745: 0x0000787B, 14746: 0x0000797C, 14747: 0x00007982, 14748: 0x0000797D, 14749: 0x00007979, 14750: 0x00007A11, 14751: 0x00007A18, 14752: 0x00007A19, 14753: 0x00007A12, 14754: 0x00007A17, 14755: 0x00007A15, 14756: 0x00007A22, 14757: 0x00007A13, 14758: 0x00007A1B, 14759: 0x00007A10, 14760: 0x00007AA3, 14761: 0x00007AA2, 14762: 0x00007A9E, 14763: 0x00007AEB, 14764: 0x00007B66, 14765: 0x00007B64, 14766: 0x00007B6D, 14767: 0x00007B74, 14768: 0x00007B69, 14769: 0x00007B72, 14770: 0x00007B65, 14771: 0x00007B73, 14772: 0x00007B71, 14773: 0x00007B70, 14774: 0x00007B61, 14775: 0x00007B78, 14776: 0x00007B76, 14777: 0x00007B63, 14778: 0x00007CB2, 14779: 0x00007CB4, 14780: 0x00007CAF, 14781: 0x00007D88, 14782: 0x00007D86, 14783: 0x00007D80, 14784: 0x00007D8D, 14785: 0x00007D7F, 14786: 0x00007D85, 14787: 0x00007D7A, 14788: 0x00007D8E, 14789: 0x00007D7B, 14790: 0x00007D83, 14791: 0x00007D7C, 14792: 0x00007D8C, 14793: 0x00007D94, 14794: 0x00007D84, 14795: 0x00007D7D, 14796: 0x00007D92, 14797: 0x00007F6D, 14798: 0x00007F6B, 14799: 0x00007F67, 14800: 0x00007F68, 14801: 0x00007F6C, 14802: 0x00007FA6, 14803: 0x00007FA5, 14804: 0x00007FA7, 14805: 0x00007FDB, 14806: 0x00007FDC, 14807: 0x00008021, 14808: 0x00008164, 14809: 0x00008160, 14810: 0x00008177, 14811: 0x0000815C, 14812: 0x00008169, 14813: 0x0000815B, 14814: 0x00008162, 14815: 0x00008172, 14816: 0x00006721, 14817: 0x0000815E, 14818: 0x00008176, 14819: 0x00008167, 14820: 0x0000816F, 14821: 0x00008144, 14822: 0x00008161, 14823: 0x0000821D, 14824: 0x00008249, 14825: 0x00008244, 14826: 0x00008240, 14827: 0x00008242, 14828: 0x00008245, 14829: 0x000084F1, 14830: 0x0000843F, 14831: 0x00008456, 14832: 0x00008476, 14833: 0x00008479, 14834: 0x0000848F, 14835: 0x0000848D, 14836: 0x00008465, 14837: 0x00008451, 14838: 0x00008440, 14839: 0x00008486, 14840: 0x00008467, 14841: 0x00008430, 14842: 0x0000844D, 14843: 0x0000847D, 14844: 0x0000845A, 14845: 0x00008459, 14846: 0x00008474, 14847: 0x00008473, 14848: 0x0000845D, 14849: 0x00008507, 14850: 0x0000845E, 14851: 0x00008437, 14852: 0x0000843A, 14853: 0x00008434, 14854: 0x0000847A, 14855: 0x00008443, 14856: 0x00008478, 14857: 0x00008432, 14858: 0x00008445, 14859: 0x00008429, 14860: 0x000083D9, 14861: 0x0000844B, 14862: 0x0000842F, 14863: 0x00008442, 14864: 0x0000842D, 14865: 0x0000845F, 14866: 0x00008470, 14867: 0x00008439, 14868: 0x0000844E, 14869: 0x0000844C, 14870: 0x00008452, 14871: 0x0000846F, 14872: 0x000084C5, 14873: 0x0000848E, 14874: 0x0000843B, 14875: 0x00008447, 14876: 0x00008436, 14877: 0x00008433, 14878: 0x00008468, 14879: 0x0000847E, 14880: 0x00008444, 14881: 0x0000842B, 14882: 0x00008460, 14883: 0x00008454, 14884: 0x0000846E, 14885: 0x00008450, 14886: 0x0000870B, 14887: 0x00008704, 14888: 0x000086F7, 14889: 0x0000870C, 14890: 0x000086FA, 14891: 0x000086D6, 14892: 0x000086F5, 14893: 0x0000874D, 14894: 0x000086F8, 14895: 0x0000870E, 14896: 0x00008709, 14897: 0x00008701, 14898: 0x000086F6, 14899: 0x0000870D, 14900: 0x00008705, 14901: 0x000088D6, 14902: 0x000088CB, 14903: 0x000088CD, 14904: 0x000088CE, 14905: 0x000088DE, 14906: 0x000088DB, 14907: 0x000088DA, 14908: 0x000088CC, 14909: 0x000088D0, 14910: 0x00008985, 14911: 0x0000899B, 14912: 0x000089DF, 14913: 0x000089E5, 14914: 0x000089E4, 14915: 0x000089E1, 14916: 0x000089E0, 14917: 0x000089E2, 14918: 0x000089DC, 14919: 0x000089E6, 14920: 0x00008A76, 14921: 0x00008A86, 14922: 0x00008A7F, 14923: 0x00008A61, 14924: 0x00008A3F, 14925: 0x00008A77, 14926: 0x00008A82, 14927: 0x00008A84, 14928: 0x00008A75, 14929: 0x00008A83, 14930: 0x00008A81, 14931: 0x00008A74, 14932: 0x00008A7A, 14933: 0x00008C3C, 14934: 0x00008C4B, 14935: 0x00008C4A, 14936: 0x00008C65, 14937: 0x00008C64, 14938: 0x00008C66, 14939: 0x00008C86, 14940: 0x00008C84, 14941: 0x00008C85, 14942: 0x00008CCC, 14943: 0x00008D68, 14944: 0x00008D69, 14945: 0x00008D91, 14946: 0x00008D8C, 14947: 0x00008D8E, 14948: 0x00008D8F, 14949: 0x00008D8D, 14950: 0x00008D93, 14951: 0x00008D94, 14952: 0x00008D90, 14953: 0x00008D92, 14954: 0x00008DF0, 14955: 0x00008DE0, 14956: 0x00008DEC, 14957: 0x00008DF1, 14958: 0x00008DEE, 14959: 0x00008DD0, 14960: 0x00008DE9, 14961: 0x00008DE3, 14962: 0x00008DE2, 14963: 0x00008DE7, 14964: 0x00008DF2, 14965: 0x00008DEB, 14966: 0x00008DF4, 14967: 0x00008F06, 14968: 0x00008EFF, 14969: 0x00008F01, 14970: 0x00008F00, 14971: 0x00008F05, 14972: 0x00008F07, 14973: 0x00008F08, 14974: 0x00008F02, 14975: 0x00008F0B, 14976: 0x00009052, 14977: 0x0000903F, 14978: 0x00009044, 14979: 0x00009049, 14980: 0x0000903D, 14981: 0x00009110, 14982: 0x0000910D, 14983: 0x0000910F, 14984: 0x00009111, 14985: 0x00009116, 14986: 0x00009114, 14987: 0x0000910B, 14988: 0x0000910E, 14989: 0x0000916E, 14990: 0x0000916F, 14991: 0x00009248, 14992: 0x00009252, 14993: 0x00009230, 14994: 0x0000923A, 14995: 0x00009266, 14996: 0x00009233, 14997: 0x00009265, 14998: 0x0000925E, 14999: 0x00009283, 15000: 0x0000922E, 15001: 0x0000924A, 15002: 0x00009246, 15003: 0x0000926D, 15004: 0x0000926C, 15005: 0x0000924F, 15006: 0x00009260, 15007: 0x00009267, 15008: 0x0000926F, 15009: 0x00009236, 15010: 0x00009261, 15011: 0x00009270, 15012: 0x00009231, 15013: 0x00009254, 15014: 0x00009263, 15015: 0x00009250, 15016: 0x00009272, 15017: 0x0000924E, 15018: 0x00009253, 15019: 0x0000924C, 15020: 0x00009256, 15021: 0x00009232, 15022: 0x0000959F, 15023: 0x0000959C, 15024: 0x0000959E, 15025: 0x0000959B, 15026: 0x00009692, 15027: 0x00009693, 15028: 0x00009691, 15029: 0x00009697, 15030: 0x000096CE, 15031: 0x000096FA, 15032: 0x000096FD, 15033: 0x000096F8, 15034: 0x000096F5, 15035: 0x00009773, 15036: 0x00009777, 15037: 0x00009778, 15038: 0x00009772, 15039: 0x0000980F, 15040: 0x0000980D, 15041: 0x0000980E, 15042: 0x000098AC, 15043: 0x000098F6, 15044: 0x000098F9, 15045: 0x000099AF, 15046: 0x000099B2, 15047: 0x000099B0, 15048: 0x000099B5, 15049: 0x00009AAD, 15050: 0x00009AAB, 15051: 0x00009B5B, 15052: 0x00009CEA, 15053: 0x00009CED, 15054: 0x00009CE7, 15055: 0x00009E80, 15056: 0x00009EFD, 15057: 0x000050E6, 15058: 0x000050D4, 15059: 0x000050D7, 15060: 0x000050E8, 15061: 0x000050F3, 15062: 0x000050DB, 15063: 0x000050EA, 15064: 0x000050DD, 15065: 0x000050E4, 15066: 0x000050D3, 15067: 0x000050EC, 15068: 0x000050F0, 15069: 0x000050EF, 15070: 0x000050E3, 15071: 0x000050E0, 15072: 0x000051D8, 15073: 0x00005280, 15074: 0x00005281, 15075: 0x000052E9, 15076: 0x000052EB, 15077: 0x00005330, 15078: 0x000053AC, 15079: 0x00005627, 15080: 0x00005615, 15081: 0x0000560C, 15082: 0x00005612, 15083: 0x000055FC, 15084: 0x0000560F, 15085: 0x0000561C, 15086: 0x00005601, 15087: 0x00005613, 15088: 0x00005602, 15089: 0x000055FA, 15090: 0x0000561D, 15091: 0x00005604, 15092: 0x000055FF, 15093: 0x000055F9, 15094: 0x00005889, 15095: 0x0000587C, 15096: 0x00005890, 15097: 0x00005898, 15098: 0x00005886, 15099: 0x00005881, 15100: 0x0000587F, 15101: 0x00005874, 15102: 0x0000588B, 15103: 0x0000587A, 15104: 0x00005887, 15105: 0x00005891, 15106: 0x0000588E, 15107: 0x00005876, 15108: 0x00005882, 15109: 0x00005888, 15110: 0x0000587B, 15111: 0x00005894, 15112: 0x0000588F, 15113: 0x000058FE, 15114: 0x0000596B, 15115: 0x00005ADC, 15116: 0x00005AEE, 15117: 0x00005AE5, 15118: 0x00005AD5, 15119: 0x00005AEA, 15120: 0x00005ADA, 15121: 0x00005AED, 15122: 0x00005AEB, 15123: 0x00005AF3, 15124: 0x00005AE2, 15125: 0x00005AE0, 15126: 0x00005ADB, 15127: 0x00005AEC, 15128: 0x00005ADE, 15129: 0x00005ADD, 15130: 0x00005AD9, 15131: 0x00005AE8, 15132: 0x00005ADF, 15133: 0x00005B77, 15134: 0x00005BE0, 15135: 0x00005BE3, 15136: 0x00005C63, 15137: 0x00005D82, 15138: 0x00005D80, 15139: 0x00005D7D, 15140: 0x00005D86, 15141: 0x00005D7A, 15142: 0x00005D81, 15143: 0x00005D77, 15144: 0x00005D8A, 15145: 0x00005D89, 15146: 0x00005D88, 15147: 0x00005D7E, 15148: 0x00005D7C, 15149: 0x00005D8D, 15150: 0x00005D79, 15151: 0x00005D7F, 15152: 0x00005E58, 15153: 0x00005E59, 15154: 0x00005E53, 15155: 0x00005ED8, 15156: 0x00005ED1, 15157: 0x00005ED7, 15158: 0x00005ECE, 15159: 0x00005EDC, 15160: 0x00005ED5, 15161: 0x00005ED9, 15162: 0x00005ED2, 15163: 0x00005ED4, 15164: 0x00005F44, 15165: 0x00005F43, 15166: 0x00005F6F, 15167: 0x00005FB6, 15168: 0x0000612C, 15169: 0x00006128, 15170: 0x00006141, 15171: 0x0000615E, 15172: 0x00006171, 15173: 0x00006173, 15174: 0x00006152, 15175: 0x00006153, 15176: 0x00006172, 15177: 0x0000616C, 15178: 0x00006180, 15179: 0x00006174, 15180: 0x00006154, 15181: 0x0000617A, 15182: 0x0000615B, 15183: 0x00006165, 15184: 0x0000613B, 15185: 0x0000616A, 15186: 0x00006161, 15187: 0x00006156, 15188: 0x00006229, 15189: 0x00006227, 15190: 0x0000622B, 15191: 0x0000642B, 15192: 0x0000644D, 15193: 0x0000645B, 15194: 0x0000645D, 15195: 0x00006474, 15196: 0x00006476, 15197: 0x00006472, 15198: 0x00006473, 15199: 0x0000647D, 15200: 0x00006475, 15201: 0x00006466, 15202: 0x000064A6, 15203: 0x0000644E, 15204: 0x00006482, 15205: 0x0000645E, 15206: 0x0000645C, 15207: 0x0000644B, 15208: 0x00006453, 15209: 0x00006460, 15210: 0x00006450, 15211: 0x0000647F, 15212: 0x0000643F, 15213: 0x0000646C, 15214: 0x0000646B, 15215: 0x00006459, 15216: 0x00006465, 15217: 0x00006477, 15218: 0x00006573, 15219: 0x000065A0, 15220: 0x000066A1, 15221: 0x000066A0, 15222: 0x0000669F, 15223: 0x00006705, 15224: 0x00006704, 15225: 0x00006722, 15226: 0x000069B1, 15227: 0x000069B6, 15228: 0x000069C9, 15229: 0x000069A0, 15230: 0x000069CE, 15231: 0x00006996, 15232: 0x000069B0, 15233: 0x000069AC, 15234: 0x000069BC, 15235: 0x00006991, 15236: 0x00006999, 15237: 0x0000698E, 15238: 0x000069A7, 15239: 0x0000698D, 15240: 0x000069A9, 15241: 0x000069BE, 15242: 0x000069AF, 15243: 0x000069BF, 15244: 0x000069C4, 15245: 0x000069BD, 15246: 0x000069A4, 15247: 0x000069D4, 15248: 0x000069B9, 15249: 0x000069CA, 15250: 0x0000699A, 15251: 0x000069CF, 15252: 0x000069B3, 15253: 0x00006993, 15254: 0x000069AA, 15255: 0x000069A1, 15256: 0x0000699E, 15257: 0x000069D9, 15258: 0x00006997, 15259: 0x00006990, 15260: 0x000069C2, 15261: 0x000069B5, 15262: 0x000069A5, 15263: 0x000069C6, 15264: 0x00006B4A, 15265: 0x00006B4D, 15266: 0x00006B4B, 15267: 0x00006B9E, 15268: 0x00006B9F, 15269: 0x00006BA0, 15270: 0x00006BC3, 15271: 0x00006BC4, 15272: 0x00006BFE, 15273: 0x00006ECE, 15274: 0x00006EF5, 15275: 0x00006EF1, 15276: 0x00006F03, 15277: 0x00006F25, 15278: 0x00006EF8, 15279: 0x00006F37, 15280: 0x00006EFB, 15281: 0x00006F2E, 15282: 0x00006F09, 15283: 0x00006F4E, 15284: 0x00006F19, 15285: 0x00006F1A, 15286: 0x00006F27, 15287: 0x00006F18, 15288: 0x00006F3B, 15289: 0x00006F12, 15290: 0x00006EED, 15291: 0x00006F0A, 15292: 0x00006F36, 15293: 0x00006F73, 15294: 0x00006EF9, 15295: 0x00006EEE, 15296: 0x00006F2D, 15297: 0x00006F40, 15298: 0x00006F30, 15299: 0x00006F3C, 15300: 0x00006F35, 15301: 0x00006EEB, 15302: 0x00006F07, 15303: 0x00006F0E, 15304: 0x00006F43, 15305: 0x00006F05, 15306: 0x00006EFD, 15307: 0x00006EF6, 15308: 0x00006F39, 15309: 0x00006F1C, 15310: 0x00006EFC, 15311: 0x00006F3A, 15312: 0x00006F1F, 15313: 0x00006F0D, 15314: 0x00006F1E, 15315: 0x00006F08, 15316: 0x00006F21, 15317: 0x00007187, 15318: 0x00007190, 15319: 0x00007189, 15320: 0x00007180, 15321: 0x00007185, 15322: 0x00007182, 15323: 0x0000718F, 15324: 0x0000717B, 15325: 0x00007186, 15326: 0x00007181, 15327: 0x00007197, 15328: 0x00007244, 15329: 0x00007253, 15330: 0x00007297, 15331: 0x00007295, 15332: 0x00007293, 15333: 0x00007343, 15334: 0x0000734D, 15335: 0x00007351, 15336: 0x0000734C, 15337: 0x00007462, 15338: 0x00007473, 15339: 0x00007471, 15340: 0x00007475, 15341: 0x00007472, 15342: 0x00007467, 15343: 0x0000746E, 15344: 0x00007500, 15345: 0x00007502, 15346: 0x00007503, 15347: 0x0000757D, 15348: 0x00007590, 15349: 0x00007616, 15350: 0x00007608, 15351: 0x0000760C, 15352: 0x00007615, 15353: 0x00007611, 15354: 0x0000760A, 15355: 0x00007614, 15356: 0x000076B8, 15357: 0x00007781, 15358: 0x0000777C, 15359: 0x00007785, 15360: 0x00007782, 15361: 0x0000776E, 15362: 0x00007780, 15363: 0x0000776F, 15364: 0x0000777E, 15365: 0x00007783, 15366: 0x000078B2, 15367: 0x000078AA, 15368: 0x000078B4, 15369: 0x000078AD, 15370: 0x000078A8, 15371: 0x0000787E, 15372: 0x000078AB, 15373: 0x0000789E, 15374: 0x000078A5, 15375: 0x000078A0, 15376: 0x000078AC, 15377: 0x000078A2, 15378: 0x000078A4, 15379: 0x00007998, 15380: 0x0000798A, 15381: 0x0000798B, 15382: 0x00007996, 15383: 0x00007995, 15384: 0x00007994, 15385: 0x00007993, 15386: 0x00007997, 15387: 0x00007988, 15388: 0x00007992, 15389: 0x00007990, 15390: 0x00007A2B, 15391: 0x00007A4A, 15392: 0x00007A30, 15393: 0x00007A2F, 15394: 0x00007A28, 15395: 0x00007A26, 15396: 0x00007AA8, 15397: 0x00007AAB, 15398: 0x00007AAC, 15399: 0x00007AEE, 15400: 0x00007B88, 15401: 0x00007B9C, 15402: 0x00007B8A, 15403: 0x00007B91, 15404: 0x00007B90, 15405: 0x00007B96, 15406: 0x00007B8D, 15407: 0x00007B8C, 15408: 0x00007B9B, 15409: 0x00007B8E, 15410: 0x00007B85, 15411: 0x00007B98, 15412: 0x00005284, 15413: 0x00007B99, 15414: 0x00007BA4, 15415: 0x00007B82, 15416: 0x00007CBB, 15417: 0x00007CBF, 15418: 0x00007CBC, 15419: 0x00007CBA, 15420: 0x00007DA7, 15421: 0x00007DB7, 15422: 0x00007DC2, 15423: 0x00007DA3, 15424: 0x00007DAA, 15425: 0x00007DC1, 15426: 0x00007DC0, 15427: 0x00007DC5, 15428: 0x00007D9D, 15429: 0x00007DCE, 15430: 0x00007DC4, 15431: 0x00007DC6, 15432: 0x00007DCB, 15433: 0x00007DCC, 15434: 0x00007DAF, 15435: 0x00007DB9, 15436: 0x00007D96, 15437: 0x00007DBC, 15438: 0x00007D9F, 15439: 0x00007DA6, 15440: 0x00007DAE, 15441: 0x00007DA9, 15442: 0x00007DA1, 15443: 0x00007DC9, 15444: 0x00007F73, 15445: 0x00007FE2, 15446: 0x00007FE3, 15447: 0x00007FE5, 15448: 0x00007FDE, 15449: 0x00008024, 15450: 0x0000805D, 15451: 0x0000805C, 15452: 0x00008189, 15453: 0x00008186, 15454: 0x00008183, 15455: 0x00008187, 15456: 0x0000818D, 15457: 0x0000818C, 15458: 0x0000818B, 15459: 0x00008215, 15460: 0x00008497, 15461: 0x000084A4, 15462: 0x000084A1, 15463: 0x0000849F, 15464: 0x000084BA, 15465: 0x000084CE, 15466: 0x000084C2, 15467: 0x000084AC, 15468: 0x000084AE, 15469: 0x000084AB, 15470: 0x000084B9, 15471: 0x000084B4, 15472: 0x000084C1, 15473: 0x000084CD, 15474: 0x000084AA, 15475: 0x0000849A, 15476: 0x000084B1, 15477: 0x000084D0, 15478: 0x0000849D, 15479: 0x000084A7, 15480: 0x000084BB, 15481: 0x000084A2, 15482: 0x00008494, 15483: 0x000084C7, 15484: 0x000084CC, 15485: 0x0000849B, 15486: 0x000084A9, 15487: 0x000084AF, 15488: 0x000084A8, 15489: 0x000084D6, 15490: 0x00008498, 15491: 0x000084B6, 15492: 0x000084CF, 15493: 0x000084A0, 15494: 0x000084D7, 15495: 0x000084D4, 15496: 0x000084D2, 15497: 0x000084DB, 15498: 0x000084B0, 15499: 0x00008491, 15500: 0x00008661, 15501: 0x00008733, 15502: 0x00008723, 15503: 0x00008728, 15504: 0x0000876B, 15505: 0x00008740, 15506: 0x0000872E, 15507: 0x0000871E, 15508: 0x00008721, 15509: 0x00008719, 15510: 0x0000871B, 15511: 0x00008743, 15512: 0x0000872C, 15513: 0x00008741, 15514: 0x0000873E, 15515: 0x00008746, 15516: 0x00008720, 15517: 0x00008732, 15518: 0x0000872A, 15519: 0x0000872D, 15520: 0x0000873C, 15521: 0x00008712, 15522: 0x0000873A, 15523: 0x00008731, 15524: 0x00008735, 15525: 0x00008742, 15526: 0x00008726, 15527: 0x00008727, 15528: 0x00008738, 15529: 0x00008724, 15530: 0x0000871A, 15531: 0x00008730, 15532: 0x00008711, 15533: 0x000088F7, 15534: 0x000088E7, 15535: 0x000088F1, 15536: 0x000088F2, 15537: 0x000088FA, 15538: 0x000088FE, 15539: 0x000088EE, 15540: 0x000088FC, 15541: 0x000088F6, 15542: 0x000088FB, 15543: 0x000088F0, 15544: 0x000088EC, 15545: 0x000088EB, 15546: 0x0000899D, 15547: 0x000089A1, 15548: 0x0000899F, 15549: 0x0000899E, 15550: 0x000089E9, 15551: 0x000089EB, 15552: 0x000089E8, 15553: 0x00008AAB, 15554: 0x00008A99, 15555: 0x00008A8B, 15556: 0x00008A92, 15557: 0x00008A8F, 15558: 0x00008A96, 15559: 0x00008C3D, 15560: 0x00008C68, 15561: 0x00008C69, 15562: 0x00008CD5, 15563: 0x00008CCF, 15564: 0x00008CD7, 15565: 0x00008D96, 15566: 0x00008E09, 15567: 0x00008E02, 15568: 0x00008DFF, 15569: 0x00008E0D, 15570: 0x00008DFD, 15571: 0x00008E0A, 15572: 0x00008E03, 15573: 0x00008E07, 15574: 0x00008E06, 15575: 0x00008E05, 15576: 0x00008DFE, 15577: 0x00008E00, 15578: 0x00008E04, 15579: 0x00008F10, 15580: 0x00008F11, 15581: 0x00008F0E, 15582: 0x00008F0D, 15583: 0x00009123, 15584: 0x0000911C, 15585: 0x00009120, 15586: 0x00009122, 15587: 0x0000911F, 15588: 0x0000911D, 15589: 0x0000911A, 15590: 0x00009124, 15591: 0x00009121, 15592: 0x0000911B, 15593: 0x0000917A, 15594: 0x00009172, 15595: 0x00009179, 15596: 0x00009173, 15597: 0x000092A5, 15598: 0x000092A4, 15599: 0x00009276, 15600: 0x0000929B, 15601: 0x0000927A, 15602: 0x000092A0, 15603: 0x00009294, 15604: 0x000092AA, 15605: 0x0000928D, 15606: 0x000092A6, 15607: 0x0000929A, 15608: 0x000092AB, 15609: 0x00009279, 15610: 0x00009297, 15611: 0x0000927F, 15612: 0x000092A3, 15613: 0x000092EE, 15614: 0x0000928E, 15615: 0x00009282, 15616: 0x00009295, 15617: 0x000092A2, 15618: 0x0000927D, 15619: 0x00009288, 15620: 0x000092A1, 15621: 0x0000928A, 15622: 0x00009286, 15623: 0x0000928C, 15624: 0x00009299, 15625: 0x000092A7, 15626: 0x0000927E, 15627: 0x00009287, 15628: 0x000092A9, 15629: 0x0000929D, 15630: 0x0000928B, 15631: 0x0000922D, 15632: 0x0000969E, 15633: 0x000096A1, 15634: 0x000096FF, 15635: 0x00009758, 15636: 0x0000977D, 15637: 0x0000977A, 15638: 0x0000977E, 15639: 0x00009783, 15640: 0x00009780, 15641: 0x00009782, 15642: 0x0000977B, 15643: 0x00009784, 15644: 0x00009781, 15645: 0x0000977F, 15646: 0x000097CE, 15647: 0x000097CD, 15648: 0x00009816, 15649: 0x000098AD, 15650: 0x000098AE, 15651: 0x00009902, 15652: 0x00009900, 15653: 0x00009907, 15654: 0x0000999D, 15655: 0x0000999C, 15656: 0x000099C3, 15657: 0x000099B9, 15658: 0x000099BB, 15659: 0x000099BA, 15660: 0x000099C2, 15661: 0x000099BD, 15662: 0x000099C7, 15663: 0x00009AB1, 15664: 0x00009AE3, 15665: 0x00009AE7, 15666: 0x00009B3E, 15667: 0x00009B3F, 15668: 0x00009B60, 15669: 0x00009B61, 15670: 0x00009B5F, 15671: 0x00009CF1, 15672: 0x00009CF2, 15673: 0x00009CF5, 15674: 0x00009EA7, 15675: 0x000050FF, 15676: 0x00005103, 15677: 0x00005130, 15678: 0x000050F8, 15679: 0x00005106, 15680: 0x00005107, 15681: 0x000050F6, 15682: 0x000050FE, 15683: 0x0000510B, 15684: 0x0000510C, 15685: 0x000050FD, 15686: 0x0000510A, 15687: 0x0000528B, 15688: 0x0000528C, 15689: 0x000052F1, 15690: 0x000052EF, 15691: 0x00005648, 15692: 0x00005642, 15693: 0x0000564C, 15694: 0x00005635, 15695: 0x00005641, 15696: 0x0000564A, 15697: 0x00005649, 15698: 0x00005646, 15699: 0x00005658, 15700: 0x0000565A, 15701: 0x00005640, 15702: 0x00005633, 15703: 0x0000563D, 15704: 0x0000562C, 15705: 0x0000563E, 15706: 0x00005638, 15707: 0x0000562A, 15708: 0x0000563A, 15709: 0x0000571A, 15710: 0x000058AB, 15711: 0x0000589D, 15712: 0x000058B1, 15713: 0x000058A0, 15714: 0x000058A3, 15715: 0x000058AF, 15716: 0x000058AC, 15717: 0x000058A5, 15718: 0x000058A1, 15719: 0x000058FF, 15720: 0x00005AFF, 15721: 0x00005AF4, 15722: 0x00005AFD, 15723: 0x00005AF7, 15724: 0x00005AF6, 15725: 0x00005B03, 15726: 0x00005AF8, 15727: 0x00005B02, 15728: 0x00005AF9, 15729: 0x00005B01, 15730: 0x00005B07, 15731: 0x00005B05, 15732: 0x00005B0F, 15733: 0x00005C67, 15734: 0x00005D99, 15735: 0x00005D97, 15736: 0x00005D9F, 15737: 0x00005D92, 15738: 0x00005DA2, 15739: 0x00005D93, 15740: 0x00005D95, 15741: 0x00005DA0, 15742: 0x00005D9C, 15743: 0x00005DA1, 15744: 0x00005D9A, 15745: 0x00005D9E, 15746: 0x00005E69, 15747: 0x00005E5D, 15748: 0x00005E60, 15749: 0x00005E5C, 15750: 0x00007DF3, 15751: 0x00005EDB, 15752: 0x00005EDE, 15753: 0x00005EE1, 15754: 0x00005F49, 15755: 0x00005FB2, 15756: 0x0000618B, 15757: 0x00006183, 15758: 0x00006179, 15759: 0x000061B1, 15760: 0x000061B0, 15761: 0x000061A2, 15762: 0x00006189, 15763: 0x0000619B, 15764: 0x00006193, 15765: 0x000061AF, 15766: 0x000061AD, 15767: 0x0000619F, 15768: 0x00006192, 15769: 0x000061AA, 15770: 0x000061A1, 15771: 0x0000618D, 15772: 0x00006166, 15773: 0x000061B3, 15774: 0x0000622D, 15775: 0x0000646E, 15776: 0x00006470, 15777: 0x00006496, 15778: 0x000064A0, 15779: 0x00006485, 15780: 0x00006497, 15781: 0x0000649C, 15782: 0x0000648F, 15783: 0x0000648B, 15784: 0x0000648A, 15785: 0x0000648C, 15786: 0x000064A3, 15787: 0x0000649F, 15788: 0x00006468, 15789: 0x000064B1, 15790: 0x00006498, 15791: 0x00006576, 15792: 0x0000657A, 15793: 0x00006579, 15794: 0x0000657B, 15795: 0x000065B2, 15796: 0x000065B3, 15797: 0x000066B5, 15798: 0x000066B0, 15799: 0x000066A9, 15800: 0x000066B2, 15801: 0x000066B7, 15802: 0x000066AA, 15803: 0x000066AF, 15804: 0x00006A00, 15805: 0x00006A06, 15806: 0x00006A17, 15807: 0x000069E5, 15808: 0x000069F8, 15809: 0x00006A15, 15810: 0x000069F1, 15811: 0x000069E4, 15812: 0x00006A20, 15813: 0x000069FF, 15814: 0x000069EC, 15815: 0x000069E2, 15816: 0x00006A1B, 15817: 0x00006A1D, 15818: 0x000069FE, 15819: 0x00006A27, 15820: 0x000069F2, 15821: 0x000069EE, 15822: 0x00006A14, 15823: 0x000069F7, 15824: 0x000069E7, 15825: 0x00006A40, 15826: 0x00006A08, 15827: 0x000069E6, 15828: 0x000069FB, 15829: 0x00006A0D, 15830: 0x000069FC, 15831: 0x000069EB, 15832: 0x00006A09, 15833: 0x00006A04, 15834: 0x00006A18, 15835: 0x00006A25, 15836: 0x00006A0F, 15837: 0x000069F6, 15838: 0x00006A26, 15839: 0x00006A07, 15840: 0x000069F4, 15841: 0x00006A16, 15842: 0x00006B51, 15843: 0x00006BA5, 15844: 0x00006BA3, 15845: 0x00006BA2, 15846: 0x00006BA6, 15847: 0x00006C01, 15848: 0x00006C00, 15849: 0x00006BFF, 15850: 0x00006C02, 15851: 0x00006F41, 15852: 0x00006F26, 15853: 0x00006F7E, 15854: 0x00006F87, 15855: 0x00006FC6, 15856: 0x00006F92, 15857: 0x00006F8D, 15858: 0x00006F89, 15859: 0x00006F8C, 15860: 0x00006F62, 15861: 0x00006F4F, 15862: 0x00006F85, 15863: 0x00006F5A, 15864: 0x00006F96, 15865: 0x00006F76, 15866: 0x00006F6C, 15867: 0x00006F82, 15868: 0x00006F55, 15869: 0x00006F72, 15870: 0x00006F52, 15871: 0x00006F50, 15872: 0x00006F57, 15873: 0x00006F94, 15874: 0x00006F93, 15875: 0x00006F5D, 15876: 0x00006F00, 15877: 0x00006F61, 15878: 0x00006F6B, 15879: 0x00006F7D, 15880: 0x00006F67, 15881: 0x00006F90, 15882: 0x00006F53, 15883: 0x00006F8B, 15884: 0x00006F69, 15885: 0x00006F7F, 15886: 0x00006F95, 15887: 0x00006F63, 15888: 0x00006F77, 15889: 0x00006F6A, 15890: 0x00006F7B, 15891: 0x000071B2, 15892: 0x000071AF, 15893: 0x0000719B, 15894: 0x000071B0, 15895: 0x000071A0, 15896: 0x0000719A, 15897: 0x000071A9, 15898: 0x000071B5, 15899: 0x0000719D, 15900: 0x000071A5, 15901: 0x0000719E, 15902: 0x000071A4, 15903: 0x000071A1, 15904: 0x000071AA, 15905: 0x0000719C, 15906: 0x000071A7, 15907: 0x000071B3, 15908: 0x00007298, 15909: 0x0000729A, 15910: 0x00007358, 15911: 0x00007352, 15912: 0x0000735E, 15913: 0x0000735F, 15914: 0x00007360, 15915: 0x0000735D, 15916: 0x0000735B, 15917: 0x00007361, 15918: 0x0000735A, 15919: 0x00007359, 15920: 0x00007362, 15921: 0x00007487, 15922: 0x00007489, 15923: 0x0000748A, 15924: 0x00007486, 15925: 0x00007481, 15926: 0x0000747D, 15927: 0x00007485, 15928: 0x00007488, 15929: 0x0000747C, 15930: 0x00007479, 15931: 0x00007508, 15932: 0x00007507, 15933: 0x0000757E, 15934: 0x00007625, 15935: 0x0000761E, 15936: 0x00007619, 15937: 0x0000761D, 15938: 0x0000761C, 15939: 0x00007623, 15940: 0x0000761A, 15941: 0x00007628, 15942: 0x0000761B, 15943: 0x0000769C, 15944: 0x0000769D, 15945: 0x0000769E, 15946: 0x0000769B, 15947: 0x0000778D, 15948: 0x0000778F, 15949: 0x00007789, 15950: 0x00007788, 15951: 0x000078CD, 15952: 0x000078BB, 15953: 0x000078CF, 15954: 0x000078CC, 15955: 0x000078D1, 15956: 0x000078CE, 15957: 0x000078D4, 15958: 0x000078C8, 15959: 0x000078C3, 15960: 0x000078C4, 15961: 0x000078C9, 15962: 0x0000799A, 15963: 0x000079A1, 15964: 0x000079A0, 15965: 0x0000799C, 15966: 0x000079A2, 15967: 0x0000799B, 15968: 0x00006B76, 15969: 0x00007A39, 15970: 0x00007AB2, 15971: 0x00007AB4, 15972: 0x00007AB3, 15973: 0x00007BB7, 15974: 0x00007BCB, 15975: 0x00007BBE, 15976: 0x00007BAC, 15977: 0x00007BCE, 15978: 0x00007BAF, 15979: 0x00007BB9, 15980: 0x00007BCA, 15981: 0x00007BB5, 15982: 0x00007CC5, 15983: 0x00007CC8, 15984: 0x00007CCC, 15985: 0x00007CCB, 15986: 0x00007DF7, 15987: 0x00007DDB, 15988: 0x00007DEA, 15989: 0x00007DE7, 15990: 0x00007DD7, 15991: 0x00007DE1, 15992: 0x00007E03, 15993: 0x00007DFA, 15994: 0x00007DE6, 15995: 0x00007DF6, 15996: 0x00007DF1, 15997: 0x00007DF0, 15998: 0x00007DEE, 15999: 0x00007DDF, 16000: 0x00007F76, 16001: 0x00007FAC, 16002: 0x00007FB0, 16003: 0x00007FAD, 16004: 0x00007FED, 16005: 0x00007FEB, 16006: 0x00007FEA, 16007: 0x00007FEC, 16008: 0x00007FE6, 16009: 0x00007FE8, 16010: 0x00008064, 16011: 0x00008067, 16012: 0x000081A3, 16013: 0x0000819F, 16014: 0x0000819E, 16015: 0x00008195, 16016: 0x000081A2, 16017: 0x00008199, 16018: 0x00008197, 16019: 0x00008216, 16020: 0x0000824F, 16021: 0x00008253, 16022: 0x00008252, 16023: 0x00008250, 16024: 0x0000824E, 16025: 0x00008251, 16026: 0x00008524, 16027: 0x0000853B, 16028: 0x0000850F, 16029: 0x00008500, 16030: 0x00008529, 16031: 0x0000850E, 16032: 0x00008509, 16033: 0x0000850D, 16034: 0x0000851F, 16035: 0x0000850A, 16036: 0x00008527, 16037: 0x0000851C, 16038: 0x000084FB, 16039: 0x0000852B, 16040: 0x000084FA, 16041: 0x00008508, 16042: 0x0000850C, 16043: 0x000084F4, 16044: 0x0000852A, 16045: 0x000084F2, 16046: 0x00008515, 16047: 0x000084F7, 16048: 0x000084EB, 16049: 0x000084F3, 16050: 0x000084FC, 16051: 0x00008512, 16052: 0x000084EA, 16053: 0x000084E9, 16054: 0x00008516, 16055: 0x000084FE, 16056: 0x00008528, 16057: 0x0000851D, 16058: 0x0000852E, 16059: 0x00008502, 16060: 0x000084FD, 16061: 0x0000851E, 16062: 0x000084F6, 16063: 0x00008531, 16064: 0x00008526, 16065: 0x000084E7, 16066: 0x000084E8, 16067: 0x000084F0, 16068: 0x000084EF, 16069: 0x000084F9, 16070: 0x00008518, 16071: 0x00008520, 16072: 0x00008530, 16073: 0x0000850B, 16074: 0x00008519, 16075: 0x0000852F, 16076: 0x00008662, 16077: 0x00008756, 16078: 0x00008763, 16079: 0x00008764, 16080: 0x00008777, 16081: 0x000087E1, 16082: 0x00008773, 16083: 0x00008758, 16084: 0x00008754, 16085: 0x0000875B, 16086: 0x00008752, 16087: 0x00008761, 16088: 0x0000875A, 16089: 0x00008751, 16090: 0x0000875E, 16091: 0x0000876D, 16092: 0x0000876A, 16093: 0x00008750, 16094: 0x0000874E, 16095: 0x0000875F, 16096: 0x0000875D, 16097: 0x0000876F, 16098: 0x0000876C, 16099: 0x0000877A, 16100: 0x0000876E, 16101: 0x0000875C, 16102: 0x00008765, 16103: 0x0000874F, 16104: 0x0000877B, 16105: 0x00008775, 16106: 0x00008762, 16107: 0x00008767, 16108: 0x00008769, 16109: 0x0000885A, 16110: 0x00008905, 16111: 0x0000890C, 16112: 0x00008914, 16113: 0x0000890B, 16114: 0x00008917, 16115: 0x00008918, 16116: 0x00008919, 16117: 0x00008906, 16118: 0x00008916, 16119: 0x00008911, 16120: 0x0000890E, 16121: 0x00008909, 16122: 0x000089A2, 16123: 0x000089A4, 16124: 0x000089A3, 16125: 0x000089ED, 16126: 0x000089F0, 16127: 0x000089EC, 16128: 0x00008ACF, 16129: 0x00008AC6, 16130: 0x00008AB8, 16131: 0x00008AD3, 16132: 0x00008AD1, 16133: 0x00008AD4, 16134: 0x00008AD5, 16135: 0x00008ABB, 16136: 0x00008AD7, 16137: 0x00008ABE, 16138: 0x00008AC0, 16139: 0x00008AC5, 16140: 0x00008AD8, 16141: 0x00008AC3, 16142: 0x00008ABA, 16143: 0x00008ABD, 16144: 0x00008AD9, 16145: 0x00008C3E, 16146: 0x00008C4D, 16147: 0x00008C8F, 16148: 0x00008CE5, 16149: 0x00008CDF, 16150: 0x00008CD9, 16151: 0x00008CE8, 16152: 0x00008CDA, 16153: 0x00008CDD, 16154: 0x00008CE7, 16155: 0x00008DA0, 16156: 0x00008D9C, 16157: 0x00008DA1, 16158: 0x00008D9B, 16159: 0x00008E20, 16160: 0x00008E23, 16161: 0x00008E25, 16162: 0x00008E24, 16163: 0x00008E2E, 16164: 0x00008E15, 16165: 0x00008E1B, 16166: 0x00008E16, 16167: 0x00008E11, 16168: 0x00008E19, 16169: 0x00008E26, 16170: 0x00008E27, 16171: 0x00008E14, 16172: 0x00008E12, 16173: 0x00008E18, 16174: 0x00008E13, 16175: 0x00008E1C, 16176: 0x00008E17, 16177: 0x00008E1A, 16178: 0x00008F2C, 16179: 0x00008F24, 16180: 0x00008F18, 16181: 0x00008F1A, 16182: 0x00008F20, 16183: 0x00008F23, 16184: 0x00008F16, 16185: 0x00008F17, 16186: 0x00009073, 16187: 0x00009070, 16188: 0x0000906F, 16189: 0x00009067, 16190: 0x0000906B, 16191: 0x0000912F, 16192: 0x0000912B, 16193: 0x00009129, 16194: 0x0000912A, 16195: 0x00009132, 16196: 0x00009126, 16197: 0x0000912E, 16198: 0x00009185, 16199: 0x00009186, 16200: 0x0000918A, 16201: 0x00009181, 16202: 0x00009182, 16203: 0x00009184, 16204: 0x00009180, 16205: 0x000092D0, 16206: 0x000092C3, 16207: 0x000092C4, 16208: 0x000092C0, 16209: 0x000092D9, 16210: 0x000092B6, 16211: 0x000092CF, 16212: 0x000092F1, 16213: 0x000092DF, 16214: 0x000092D8, 16215: 0x000092E9, 16216: 0x000092D7, 16217: 0x000092DD, 16218: 0x000092CC, 16219: 0x000092EF, 16220: 0x000092C2, 16221: 0x000092E8, 16222: 0x000092CA, 16223: 0x000092C8, 16224: 0x000092CE, 16225: 0x000092E6, 16226: 0x000092CD, 16227: 0x000092D5, 16228: 0x000092C9, 16229: 0x000092E0, 16230: 0x000092DE, 16231: 0x000092E7, 16232: 0x000092D1, 16233: 0x000092D3, 16234: 0x000092B5, 16235: 0x000092E1, 16236: 0x000092C6, 16237: 0x000092B4, 16238: 0x0000957C, 16239: 0x000095AC, 16240: 0x000095AB, 16241: 0x000095AE, 16242: 0x000095B0, 16243: 0x000096A4, 16244: 0x000096A2, 16245: 0x000096D3, 16246: 0x00009705, 16247: 0x00009708, 16248: 0x00009702, 16249: 0x0000975A, 16250: 0x0000978A, 16251: 0x0000978E, 16252: 0x00009788, 16253: 0x000097D0, 16254: 0x000097CF, 16255: 0x0000981E, 16256: 0x0000981D, 16257: 0x00009826, 16258: 0x00009829, 16259: 0x00009828, 16260: 0x00009820, 16261: 0x0000981B, 16262: 0x00009827, 16263: 0x000098B2, 16264: 0x00009908, 16265: 0x000098FA, 16266: 0x00009911, 16267: 0x00009914, 16268: 0x00009916, 16269: 0x00009917, 16270: 0x00009915, 16271: 0x000099DC, 16272: 0x000099CD, 16273: 0x000099CF, 16274: 0x000099D3, 16275: 0x000099D4, 16276: 0x000099CE, 16277: 0x000099C9, 16278: 0x000099D6, 16279: 0x000099D8, 16280: 0x000099CB, 16281: 0x000099D7, 16282: 0x000099CC, 16283: 0x00009AB3, 16284: 0x00009AEC, 16285: 0x00009AEB, 16286: 0x00009AF3, 16287: 0x00009AF2, 16288: 0x00009AF1, 16289: 0x00009B46, 16290: 0x00009B43, 16291: 0x00009B67, 16292: 0x00009B74, 16293: 0x00009B71, 16294: 0x00009B66, 16295: 0x00009B76, 16296: 0x00009B75, 16297: 0x00009B70, 16298: 0x00009B68, 16299: 0x00009B64, 16300: 0x00009B6C, 16301: 0x00009CFC, 16302: 0x00009CFA, 16303: 0x00009CFD, 16304: 0x00009CFF, 16305: 0x00009CF7, 16306: 0x00009D07, 16307: 0x00009D00, 16308: 0x00009CF9, 16309: 0x00009CFB, 16310: 0x00009D08, 16311: 0x00009D05, 16312: 0x00009D04, 16313: 0x00009E83, 16314: 0x00009ED3, 16315: 0x00009F0F, 16316: 0x00009F10, 16317: 0x0000511C, 16318: 0x00005113, 16319: 0x00005117, 16320: 0x0000511A, 16321: 0x00005111, 16322: 0x000051DE, 16323: 0x00005334, 16324: 0x000053E1, 16325: 0x00005670, 16326: 0x00005660, 16327: 0x0000566E, 16328: 0x00005673, 16329: 0x00005666, 16330: 0x00005663, 16331: 0x0000566D, 16332: 0x00005672, 16333: 0x0000565E, 16334: 0x00005677, 16335: 0x0000571C, 16336: 0x0000571B, 16337: 0x000058C8, 16338: 0x000058BD, 16339: 0x000058C9, 16340: 0x000058BF, 16341: 0x000058BA, 16342: 0x000058C2, 16343: 0x000058BC, 16344: 0x000058C6, 16345: 0x00005B17, 16346: 0x00005B19, 16347: 0x00005B1B, 16348: 0x00005B21, 16349: 0x00005B14, 16350: 0x00005B13, 16351: 0x00005B10, 16352: 0x00005B16, 16353: 0x00005B28, 16354: 0x00005B1A, 16355: 0x00005B20, 16356: 0x00005B1E, 16357: 0x00005BEF, 16358: 0x00005DAC, 16359: 0x00005DB1, 16360: 0x00005DA9, 16361: 0x00005DA7, 16362: 0x00005DB5, 16363: 0x00005DB0, 16364: 0x00005DAE, 16365: 0x00005DAA, 16366: 0x00005DA8, 16367: 0x00005DB2, 16368: 0x00005DAD, 16369: 0x00005DAF, 16370: 0x00005DB4, 16371: 0x00005E67, 16372: 0x00005E68, 16373: 0x00005E66, 16374: 0x00005E6F, 16375: 0x00005EE9, 16376: 0x00005EE7, 16377: 0x00005EE6, 16378: 0x00005EE8, 16379: 0x00005EE5, 16380: 0x00005F4B, 16381: 0x00005FBC, 16382: 0x0000619D, 16383: 0x000061A8, 16384: 0x00006196, 16385: 0x000061C5, 16386: 0x000061B4, 16387: 0x000061C6, 16388: 0x000061C1, 16389: 0x000061CC, 16390: 0x000061BA, 16391: 0x000061BF, 16392: 0x000061B8, 16393: 0x0000618C, 16394: 0x000064D7, 16395: 0x000064D6, 16396: 0x000064D0, 16397: 0x000064CF, 16398: 0x000064C9, 16399: 0x000064BD, 16400: 0x00006489, 16401: 0x000064C3, 16402: 0x000064DB, 16403: 0x000064F3, 16404: 0x000064D9, 16405: 0x00006533, 16406: 0x0000657F, 16407: 0x0000657C, 16408: 0x000065A2, 16409: 0x000066C8, 16410: 0x000066BE, 16411: 0x000066C0, 16412: 0x000066CA, 16413: 0x000066CB, 16414: 0x000066CF, 16415: 0x000066BD, 16416: 0x000066BB, 16417: 0x000066BA, 16418: 0x000066CC, 16419: 0x00006723, 16420: 0x00006A34, 16421: 0x00006A66, 16422: 0x00006A49, 16423: 0x00006A67, 16424: 0x00006A32, 16425: 0x00006A68, 16426: 0x00006A3E, 16427: 0x00006A5D, 16428: 0x00006A6D, 16429: 0x00006A76, 16430: 0x00006A5B, 16431: 0x00006A51, 16432: 0x00006A28, 16433: 0x00006A5A, 16434: 0x00006A3B, 16435: 0x00006A3F, 16436: 0x00006A41, 16437: 0x00006A6A, 16438: 0x00006A64, 16439: 0x00006A50, 16440: 0x00006A4F, 16441: 0x00006A54, 16442: 0x00006A6F, 16443: 0x00006A69, 16444: 0x00006A60, 16445: 0x00006A3C, 16446: 0x00006A5E, 16447: 0x00006A56, 16448: 0x00006A55, 16449: 0x00006A4D, 16450: 0x00006A4E, 16451: 0x00006A46, 16452: 0x00006B55, 16453: 0x00006B54, 16454: 0x00006B56, 16455: 0x00006BA7, 16456: 0x00006BAA, 16457: 0x00006BAB, 16458: 0x00006BC8, 16459: 0x00006BC7, 16460: 0x00006C04, 16461: 0x00006C03, 16462: 0x00006C06, 16463: 0x00006FAD, 16464: 0x00006FCB, 16465: 0x00006FA3, 16466: 0x00006FC7, 16467: 0x00006FBC, 16468: 0x00006FCE, 16469: 0x00006FC8, 16470: 0x00006F5E, 16471: 0x00006FC4, 16472: 0x00006FBD, 16473: 0x00006F9E, 16474: 0x00006FCA, 16475: 0x00006FA8, 16476: 0x00007004, 16477: 0x00006FA5, 16478: 0x00006FAE, 16479: 0x00006FBA, 16480: 0x00006FAC, 16481: 0x00006FAA, 16482: 0x00006FCF, 16483: 0x00006FBF, 16484: 0x00006FB8, 16485: 0x00006FA2, 16486: 0x00006FC9, 16487: 0x00006FAB, 16488: 0x00006FCD, 16489: 0x00006FAF, 16490: 0x00006FB2, 16491: 0x00006FB0, 16492: 0x000071C5, 16493: 0x000071C2, 16494: 0x000071BF, 16495: 0x000071B8, 16496: 0x000071D6, 16497: 0x000071C0, 16498: 0x000071C1, 16499: 0x000071CB, 16500: 0x000071D4, 16501: 0x000071CA, 16502: 0x000071C7, 16503: 0x000071CF, 16504: 0x000071BD, 16505: 0x000071D8, 16506: 0x000071BC, 16507: 0x000071C6, 16508: 0x000071DA, 16509: 0x000071DB, 16510: 0x0000729D, 16511: 0x0000729E, 16512: 0x00007369, 16513: 0x00007366, 16514: 0x00007367, 16515: 0x0000736C, 16516: 0x00007365, 16517: 0x0000736B, 16518: 0x0000736A, 16519: 0x0000747F, 16520: 0x0000749A, 16521: 0x000074A0, 16522: 0x00007494, 16523: 0x00007492, 16524: 0x00007495, 16525: 0x000074A1, 16526: 0x0000750B, 16527: 0x00007580, 16528: 0x0000762F, 16529: 0x0000762D, 16530: 0x00007631, 16531: 0x0000763D, 16532: 0x00007633, 16533: 0x0000763C, 16534: 0x00007635, 16535: 0x00007632, 16536: 0x00007630, 16537: 0x000076BB, 16538: 0x000076E6, 16539: 0x0000779A, 16540: 0x0000779D, 16541: 0x000077A1, 16542: 0x0000779C, 16543: 0x0000779B, 16544: 0x000077A2, 16545: 0x000077A3, 16546: 0x00007795, 16547: 0x00007799, 16548: 0x00007797, 16549: 0x000078DD, 16550: 0x000078E9, 16551: 0x000078E5, 16552: 0x000078EA, 16553: 0x000078DE, 16554: 0x000078E3, 16555: 0x000078DB, 16556: 0x000078E1, 16557: 0x000078E2, 16558: 0x000078ED, 16559: 0x000078DF, 16560: 0x000078E0, 16561: 0x000079A4, 16562: 0x00007A44, 16563: 0x00007A48, 16564: 0x00007A47, 16565: 0x00007AB6, 16566: 0x00007AB8, 16567: 0x00007AB5, 16568: 0x00007AB1, 16569: 0x00007AB7, 16570: 0x00007BDE, 16571: 0x00007BE3, 16572: 0x00007BE7, 16573: 0x00007BDD, 16574: 0x00007BD5, 16575: 0x00007BE5, 16576: 0x00007BDA, 16577: 0x00007BE8, 16578: 0x00007BF9, 16579: 0x00007BD4, 16580: 0x00007BEA, 16581: 0x00007BE2, 16582: 0x00007BDC, 16583: 0x00007BEB, 16584: 0x00007BD8, 16585: 0x00007BDF, 16586: 0x00007CD2, 16587: 0x00007CD4, 16588: 0x00007CD7, 16589: 0x00007CD0, 16590: 0x00007CD1, 16591: 0x00007E12, 16592: 0x00007E21, 16593: 0x00007E17, 16594: 0x00007E0C, 16595: 0x00007E1F, 16596: 0x00007E20, 16597: 0x00007E13, 16598: 0x00007E0E, 16599: 0x00007E1C, 16600: 0x00007E15, 16601: 0x00007E1A, 16602: 0x00007E22, 16603: 0x00007E0B, 16604: 0x00007E0F, 16605: 0x00007E16, 16606: 0x00007E0D, 16607: 0x00007E14, 16608: 0x00007E25, 16609: 0x00007E24, 16610: 0x00007F43, 16611: 0x00007F7B, 16612: 0x00007F7C, 16613: 0x00007F7A, 16614: 0x00007FB1, 16615: 0x00007FEF, 16616: 0x0000802A, 16617: 0x00008029, 16618: 0x0000806C, 16619: 0x000081B1, 16620: 0x000081A6, 16621: 0x000081AE, 16622: 0x000081B9, 16623: 0x000081B5, 16624: 0x000081AB, 16625: 0x000081B0, 16626: 0x000081AC, 16627: 0x000081B4, 16628: 0x000081B2, 16629: 0x000081B7, 16630: 0x000081A7, 16631: 0x000081F2, 16632: 0x00008255, 16633: 0x00008256, 16634: 0x00008257, 16635: 0x00008556, 16636: 0x00008545, 16637: 0x0000856B, 16638: 0x0000854D, 16639: 0x00008553, 16640: 0x00008561, 16641: 0x00008558, 16642: 0x00008540, 16643: 0x00008546, 16644: 0x00008564, 16645: 0x00008541, 16646: 0x00008562, 16647: 0x00008544, 16648: 0x00008551, 16649: 0x00008547, 16650: 0x00008563, 16651: 0x0000853E, 16652: 0x0000855B, 16653: 0x00008571, 16654: 0x0000854E, 16655: 0x0000856E, 16656: 0x00008575, 16657: 0x00008555, 16658: 0x00008567, 16659: 0x00008560, 16660: 0x0000858C, 16661: 0x00008566, 16662: 0x0000855D, 16663: 0x00008554, 16664: 0x00008565, 16665: 0x0000856C, 16666: 0x00008663, 16667: 0x00008665, 16668: 0x00008664, 16669: 0x0000879B, 16670: 0x0000878F, 16671: 0x00008797, 16672: 0x00008793, 16673: 0x00008792, 16674: 0x00008788, 16675: 0x00008781, 16676: 0x00008796, 16677: 0x00008798, 16678: 0x00008779, 16679: 0x00008787, 16680: 0x000087A3, 16681: 0x00008785, 16682: 0x00008790, 16683: 0x00008791, 16684: 0x0000879D, 16685: 0x00008784, 16686: 0x00008794, 16687: 0x0000879C, 16688: 0x0000879A, 16689: 0x00008789, 16690: 0x0000891E, 16691: 0x00008926, 16692: 0x00008930, 16693: 0x0000892D, 16694: 0x0000892E, 16695: 0x00008927, 16696: 0x00008931, 16697: 0x00008922, 16698: 0x00008929, 16699: 0x00008923, 16700: 0x0000892F, 16701: 0x0000892C, 16702: 0x0000891F, 16703: 0x000089F1, 16704: 0x00008AE0, 16705: 0x00008AE2, 16706: 0x00008AF2, 16707: 0x00008AF4, 16708: 0x00008AF5, 16709: 0x00008ADD, 16710: 0x00008B14, 16711: 0x00008AE4, 16712: 0x00008ADF, 16713: 0x00008AF0, 16714: 0x00008AC8, 16715: 0x00008ADE, 16716: 0x00008AE1, 16717: 0x00008AE8, 16718: 0x00008AFF, 16719: 0x00008AEF, 16720: 0x00008AFB, 16721: 0x00008C91, 16722: 0x00008C92, 16723: 0x00008C90, 16724: 0x00008CF5, 16725: 0x00008CEE, 16726: 0x00008CF1, 16727: 0x00008CF0, 16728: 0x00008CF3, 16729: 0x00008D6C, 16730: 0x00008D6E, 16731: 0x00008DA5, 16732: 0x00008DA7, 16733: 0x00008E33, 16734: 0x00008E3E, 16735: 0x00008E38, 16736: 0x00008E40, 16737: 0x00008E45, 16738: 0x00008E36, 16739: 0x00008E3C, 16740: 0x00008E3D, 16741: 0x00008E41, 16742: 0x00008E30, 16743: 0x00008E3F, 16744: 0x00008EBD, 16745: 0x00008F36, 16746: 0x00008F2E, 16747: 0x00008F35, 16748: 0x00008F32, 16749: 0x00008F39, 16750: 0x00008F37, 16751: 0x00008F34, 16752: 0x00009076, 16753: 0x00009079, 16754: 0x0000907B, 16755: 0x00009086, 16756: 0x000090FA, 16757: 0x00009133, 16758: 0x00009135, 16759: 0x00009136, 16760: 0x00009193, 16761: 0x00009190, 16762: 0x00009191, 16763: 0x0000918D, 16764: 0x0000918F, 16765: 0x00009327, 16766: 0x0000931E, 16767: 0x00009308, 16768: 0x0000931F, 16769: 0x00009306, 16770: 0x0000930F, 16771: 0x0000937A, 16772: 0x00009338, 16773: 0x0000933C, 16774: 0x0000931B, 16775: 0x00009323, 16776: 0x00009312, 16777: 0x00009301, 16778: 0x00009346, 16779: 0x0000932D, 16780: 0x0000930E, 16781: 0x0000930D, 16782: 0x000092CB, 16783: 0x0000931D, 16784: 0x000092FA, 16785: 0x00009325, 16786: 0x00009313, 16787: 0x000092F9, 16788: 0x000092F7, 16789: 0x00009334, 16790: 0x00009302, 16791: 0x00009324, 16792: 0x000092FF, 16793: 0x00009329, 16794: 0x00009339, 16795: 0x00009335, 16796: 0x0000932A, 16797: 0x00009314, 16798: 0x0000930C, 16799: 0x0000930B, 16800: 0x000092FE, 16801: 0x00009309, 16802: 0x00009300, 16803: 0x000092FB, 16804: 0x00009316, 16805: 0x000095BC, 16806: 0x000095CD, 16807: 0x000095BE, 16808: 0x000095B9, 16809: 0x000095BA, 16810: 0x000095B6, 16811: 0x000095BF, 16812: 0x000095B5, 16813: 0x000095BD, 16814: 0x000096A9, 16815: 0x000096D4, 16816: 0x0000970B, 16817: 0x00009712, 16818: 0x00009710, 16819: 0x00009799, 16820: 0x00009797, 16821: 0x00009794, 16822: 0x000097F0, 16823: 0x000097F8, 16824: 0x00009835, 16825: 0x0000982F, 16826: 0x00009832, 16827: 0x00009924, 16828: 0x0000991F, 16829: 0x00009927, 16830: 0x00009929, 16831: 0x0000999E, 16832: 0x000099EE, 16833: 0x000099EC, 16834: 0x000099E5, 16835: 0x000099E4, 16836: 0x000099F0, 16837: 0x000099E3, 16838: 0x000099EA, 16839: 0x000099E9, 16840: 0x000099E7, 16841: 0x00009AB9, 16842: 0x00009ABF, 16843: 0x00009AB4, 16844: 0x00009ABB, 16845: 0x00009AF6, 16846: 0x00009AFA, 16847: 0x00009AF9, 16848: 0x00009AF7, 16849: 0x00009B33, 16850: 0x00009B80, 16851: 0x00009B85, 16852: 0x00009B87, 16853: 0x00009B7C, 16854: 0x00009B7E, 16855: 0x00009B7B, 16856: 0x00009B82, 16857: 0x00009B93, 16858: 0x00009B92, 16859: 0x00009B90, 16860: 0x00009B7A, 16861: 0x00009B95, 16862: 0x00009B7D, 16863: 0x00009B88, 16864: 0x00009D25, 16865: 0x00009D17, 16866: 0x00009D20, 16867: 0x00009D1E, 16868: 0x00009D14, 16869: 0x00009D29, 16870: 0x00009D1D, 16871: 0x00009D18, 16872: 0x00009D22, 16873: 0x00009D10, 16874: 0x00009D19, 16875: 0x00009D1F, 16876: 0x00009E88, 16877: 0x00009E86, 16878: 0x00009E87, 16879: 0x00009EAE, 16880: 0x00009EAD, 16881: 0x00009ED5, 16882: 0x00009ED6, 16883: 0x00009EFA, 16884: 0x00009F12, 16885: 0x00009F3D, 16886: 0x00005126, 16887: 0x00005125, 16888: 0x00005122, 16889: 0x00005124, 16890: 0x00005120, 16891: 0x00005129, 16892: 0x000052F4, 16893: 0x00005693, 16894: 0x0000568C, 16895: 0x0000568D, 16896: 0x00005686, 16897: 0x00005684, 16898: 0x00005683, 16899: 0x0000567E, 16900: 0x00005682, 16901: 0x0000567F, 16902: 0x00005681, 16903: 0x000058D6, 16904: 0x000058D4, 16905: 0x000058CF, 16906: 0x000058D2, 16907: 0x00005B2D, 16908: 0x00005B25, 16909: 0x00005B32, 16910: 0x00005B23, 16911: 0x00005B2C, 16912: 0x00005B27, 16913: 0x00005B26, 16914: 0x00005B2F, 16915: 0x00005B2E, 16916: 0x00005B7B, 16917: 0x00005BF1, 16918: 0x00005BF2, 16919: 0x00005DB7, 16920: 0x00005E6C, 16921: 0x00005E6A, 16922: 0x00005FBE, 16923: 0x00005FBB, 16924: 0x000061C3, 16925: 0x000061B5, 16926: 0x000061BC, 16927: 0x000061E7, 16928: 0x000061E0, 16929: 0x000061E5, 16930: 0x000061E4, 16931: 0x000061E8, 16932: 0x000061DE, 16933: 0x000064EF, 16934: 0x000064E9, 16935: 0x000064E3, 16936: 0x000064EB, 16937: 0x000064E4, 16938: 0x000064E8, 16939: 0x00006581, 16940: 0x00006580, 16941: 0x000065B6, 16942: 0x000065DA, 16943: 0x000066D2, 16944: 0x00006A8D, 16945: 0x00006A96, 16946: 0x00006A81, 16947: 0x00006AA5, 16948: 0x00006A89, 16949: 0x00006A9F, 16950: 0x00006A9B, 16951: 0x00006AA1, 16952: 0x00006A9E, 16953: 0x00006A87, 16954: 0x00006A93, 16955: 0x00006A8E, 16956: 0x00006A95, 16957: 0x00006A83, 16958: 0x00006AA8, 16959: 0x00006AA4, 16960: 0x00006A91, 16961: 0x00006A7F, 16962: 0x00006AA6, 16963: 0x00006A9A, 16964: 0x00006A85, 16965: 0x00006A8C, 16966: 0x00006A92, 16967: 0x00006B5B, 16968: 0x00006BAD, 16969: 0x00006C09, 16970: 0x00006FCC, 16971: 0x00006FA9, 16972: 0x00006FF4, 16973: 0x00006FD4, 16974: 0x00006FE3, 16975: 0x00006FDC, 16976: 0x00006FED, 16977: 0x00006FE7, 16978: 0x00006FE6, 16979: 0x00006FDE, 16980: 0x00006FF2, 16981: 0x00006FDD, 16982: 0x00006FE2, 16983: 0x00006FE8, 16984: 0x000071E1, 16985: 0x000071F1, 16986: 0x000071E8, 16987: 0x000071F2, 16988: 0x000071E4, 16989: 0x000071F0, 16990: 0x000071E2, 16991: 0x00007373, 16992: 0x0000736E, 16993: 0x0000736F, 16994: 0x00007497, 16995: 0x000074B2, 16996: 0x000074AB, 16997: 0x00007490, 16998: 0x000074AA, 16999: 0x000074AD, 17000: 0x000074B1, 17001: 0x000074A5, 17002: 0x000074AF, 17003: 0x00007510, 17004: 0x00007511, 17005: 0x00007512, 17006: 0x0000750F, 17007: 0x00007584, 17008: 0x00007643, 17009: 0x00007648, 17010: 0x00007649, 17011: 0x00007647, 17012: 0x000076A4, 17013: 0x000076E9, 17014: 0x000077B5, 17015: 0x000077AB, 17016: 0x000077B2, 17017: 0x000077B7, 17018: 0x000077B6, 17019: 0x000077B4, 17020: 0x000077B1, 17021: 0x000077A8, 17022: 0x000077F0, 17023: 0x000078F3, 17024: 0x000078FD, 17025: 0x00007902, 17026: 0x000078FB, 17027: 0x000078FC, 17028: 0x000078F2, 17029: 0x00007905, 17030: 0x000078F9, 17031: 0x000078FE, 17032: 0x00007904, 17033: 0x000079AB, 17034: 0x000079A8, 17035: 0x00007A5C, 17036: 0x00007A5B, 17037: 0x00007A56, 17038: 0x00007A58, 17039: 0x00007A54, 17040: 0x00007A5A, 17041: 0x00007ABE, 17042: 0x00007AC0, 17043: 0x00007AC1, 17044: 0x00007C05, 17045: 0x00007C0F, 17046: 0x00007BF2, 17047: 0x00007C00, 17048: 0x00007BFF, 17049: 0x00007BFB, 17050: 0x00007C0E, 17051: 0x00007BF4, 17052: 0x00007C0B, 17053: 0x00007BF3, 17054: 0x00007C02, 17055: 0x00007C09, 17056: 0x00007C03, 17057: 0x00007C01, 17058: 0x00007BF8, 17059: 0x00007BFD, 17060: 0x00007C06, 17061: 0x00007BF0, 17062: 0x00007BF1, 17063: 0x00007C10, 17064: 0x00007C0A, 17065: 0x00007CE8, 17066: 0x00007E2D, 17067: 0x00007E3C, 17068: 0x00007E42, 17069: 0x00007E33, 17070: 0x00009848, 17071: 0x00007E38, 17072: 0x00007E2A, 17073: 0x00007E49, 17074: 0x00007E40, 17075: 0x00007E47, 17076: 0x00007E29, 17077: 0x00007E4C, 17078: 0x00007E30, 17079: 0x00007E3B, 17080: 0x00007E36, 17081: 0x00007E44, 17082: 0x00007E3A, 17083: 0x00007F45, 17084: 0x00007F7F, 17085: 0x00007F7E, 17086: 0x00007F7D, 17087: 0x00007FF4, 17088: 0x00007FF2, 17089: 0x0000802C, 17090: 0x000081BB, 17091: 0x000081C4, 17092: 0x000081CC, 17093: 0x000081CA, 17094: 0x000081C5, 17095: 0x000081C7, 17096: 0x000081BC, 17097: 0x000081E9, 17098: 0x0000825B, 17099: 0x0000825A, 17100: 0x0000825C, 17101: 0x00008583, 17102: 0x00008580, 17103: 0x0000858F, 17104: 0x000085A7, 17105: 0x00008595, 17106: 0x000085A0, 17107: 0x0000858B, 17108: 0x000085A3, 17109: 0x0000857B, 17110: 0x000085A4, 17111: 0x0000859A, 17112: 0x0000859E, 17113: 0x00008577, 17114: 0x0000857C, 17115: 0x00008589, 17116: 0x000085A1, 17117: 0x0000857A, 17118: 0x00008578, 17119: 0x00008557, 17120: 0x0000858E, 17121: 0x00008596, 17122: 0x00008586, 17123: 0x0000858D, 17124: 0x00008599, 17125: 0x0000859D, 17126: 0x00008581, 17127: 0x000085A2, 17128: 0x00008582, 17129: 0x00008588, 17130: 0x00008585, 17131: 0x00008579, 17132: 0x00008576, 17133: 0x00008598, 17134: 0x00008590, 17135: 0x0000859F, 17136: 0x00008668, 17137: 0x000087BE, 17138: 0x000087AA, 17139: 0x000087AD, 17140: 0x000087C5, 17141: 0x000087B0, 17142: 0x000087AC, 17143: 0x000087B9, 17144: 0x000087B5, 17145: 0x000087BC, 17146: 0x000087AE, 17147: 0x000087C9, 17148: 0x000087C3, 17149: 0x000087C2, 17150: 0x000087CC, 17151: 0x000087B7, 17152: 0x000087AF, 17153: 0x000087C4, 17154: 0x000087CA, 17155: 0x000087B4, 17156: 0x000087B6, 17157: 0x000087BF, 17158: 0x000087B8, 17159: 0x000087BD, 17160: 0x000087DE, 17161: 0x000087B2, 17162: 0x00008935, 17163: 0x00008933, 17164: 0x0000893C, 17165: 0x0000893E, 17166: 0x00008941, 17167: 0x00008952, 17168: 0x00008937, 17169: 0x00008942, 17170: 0x000089AD, 17171: 0x000089AF, 17172: 0x000089AE, 17173: 0x000089F2, 17174: 0x000089F3, 17175: 0x00008B1E, 17176: 0x00008B18, 17177: 0x00008B16, 17178: 0x00008B11, 17179: 0x00008B05, 17180: 0x00008B0B, 17181: 0x00008B22, 17182: 0x00008B0F, 17183: 0x00008B12, 17184: 0x00008B15, 17185: 0x00008B07, 17186: 0x00008B0D, 17187: 0x00008B08, 17188: 0x00008B06, 17189: 0x00008B1C, 17190: 0x00008B13, 17191: 0x00008B1A, 17192: 0x00008C4F, 17193: 0x00008C70, 17194: 0x00008C72, 17195: 0x00008C71, 17196: 0x00008C6F, 17197: 0x00008C95, 17198: 0x00008C94, 17199: 0x00008CF9, 17200: 0x00008D6F, 17201: 0x00008E4E, 17202: 0x00008E4D, 17203: 0x00008E53, 17204: 0x00008E50, 17205: 0x00008E4C, 17206: 0x00008E47, 17207: 0x00008F43, 17208: 0x00008F40, 17209: 0x00009085, 17210: 0x0000907E, 17211: 0x00009138, 17212: 0x0000919A, 17213: 0x000091A2, 17214: 0x0000919B, 17215: 0x00009199, 17216: 0x0000919F, 17217: 0x000091A1, 17218: 0x0000919D, 17219: 0x000091A0, 17220: 0x000093A1, 17221: 0x00009383, 17222: 0x000093AF, 17223: 0x00009364, 17224: 0x00009356, 17225: 0x00009347, 17226: 0x0000937C, 17227: 0x00009358, 17228: 0x0000935C, 17229: 0x00009376, 17230: 0x00009349, 17231: 0x00009350, 17232: 0x00009351, 17233: 0x00009360, 17234: 0x0000936D, 17235: 0x0000938F, 17236: 0x0000934C, 17237: 0x0000936A, 17238: 0x00009379, 17239: 0x00009357, 17240: 0x00009355, 17241: 0x00009352, 17242: 0x0000934F, 17243: 0x00009371, 17244: 0x00009377, 17245: 0x0000937B, 17246: 0x00009361, 17247: 0x0000935E, 17248: 0x00009363, 17249: 0x00009367, 17250: 0x00009380, 17251: 0x0000934E, 17252: 0x00009359, 17253: 0x000095C7, 17254: 0x000095C0, 17255: 0x000095C9, 17256: 0x000095C3, 17257: 0x000095C5, 17258: 0x000095B7, 17259: 0x000096AE, 17260: 0x000096B0, 17261: 0x000096AC, 17262: 0x00009720, 17263: 0x0000971F, 17264: 0x00009718, 17265: 0x0000971D, 17266: 0x00009719, 17267: 0x0000979A, 17268: 0x000097A1, 17269: 0x0000979C, 17270: 0x0000979E, 17271: 0x0000979D, 17272: 0x000097D5, 17273: 0x000097D4, 17274: 0x000097F1, 17275: 0x00009841, 17276: 0x00009844, 17277: 0x0000984A, 17278: 0x00009849, 17279: 0x00009845, 17280: 0x00009843, 17281: 0x00009925, 17282: 0x0000992B, 17283: 0x0000992C, 17284: 0x0000992A, 17285: 0x00009933, 17286: 0x00009932, 17287: 0x0000992F, 17288: 0x0000992D, 17289: 0x00009931, 17290: 0x00009930, 17291: 0x00009998, 17292: 0x000099A3, 17293: 0x000099A1, 17294: 0x00009A02, 17295: 0x000099FA, 17296: 0x000099F4, 17297: 0x000099F7, 17298: 0x000099F9, 17299: 0x000099F8, 17300: 0x000099F6, 17301: 0x000099FB, 17302: 0x000099FD, 17303: 0x000099FE, 17304: 0x000099FC, 17305: 0x00009A03, 17306: 0x00009ABE, 17307: 0x00009AFE, 17308: 0x00009AFD, 17309: 0x00009B01, 17310: 0x00009AFC, 17311: 0x00009B48, 17312: 0x00009B9A, 17313: 0x00009BA8, 17314: 0x00009B9E, 17315: 0x00009B9B, 17316: 0x00009BA6, 17317: 0x00009BA1, 17318: 0x00009BA5, 17319: 0x00009BA4, 17320: 0x00009B86, 17321: 0x00009BA2, 17322: 0x00009BA0, 17323: 0x00009BAF, 17324: 0x00009D33, 17325: 0x00009D41, 17326: 0x00009D67, 17327: 0x00009D36, 17328: 0x00009D2E, 17329: 0x00009D2F, 17330: 0x00009D31, 17331: 0x00009D38, 17332: 0x00009D30, 17333: 0x00009D45, 17334: 0x00009D42, 17335: 0x00009D43, 17336: 0x00009D3E, 17337: 0x00009D37, 17338: 0x00009D40, 17339: 0x00009D3D, 17340: 0x00007FF5, 17341: 0x00009D2D, 17342: 0x00009E8A, 17343: 0x00009E89, 17344: 0x00009E8D, 17345: 0x00009EB0, 17346: 0x00009EC8, 17347: 0x00009EDA, 17348: 0x00009EFB, 17349: 0x00009EFF, 17350: 0x00009F24, 17351: 0x00009F23, 17352: 0x00009F22, 17353: 0x00009F54, 17354: 0x00009FA0, 17355: 0x00005131, 17356: 0x0000512D, 17357: 0x0000512E, 17358: 0x00005698, 17359: 0x0000569C, 17360: 0x00005697, 17361: 0x0000569A, 17362: 0x0000569D, 17363: 0x00005699, 17364: 0x00005970, 17365: 0x00005B3C, 17366: 0x00005C69, 17367: 0x00005C6A, 17368: 0x00005DC0, 17369: 0x00005E6D, 17370: 0x00005E6E, 17371: 0x000061D8, 17372: 0x000061DF, 17373: 0x000061ED, 17374: 0x000061EE, 17375: 0x000061F1, 17376: 0x000061EA, 17377: 0x000061F0, 17378: 0x000061EB, 17379: 0x000061D6, 17380: 0x000061E9, 17381: 0x000064FF, 17382: 0x00006504, 17383: 0x000064FD, 17384: 0x000064F8, 17385: 0x00006501, 17386: 0x00006503, 17387: 0x000064FC, 17388: 0x00006594, 17389: 0x000065DB, 17390: 0x000066DA, 17391: 0x000066DB, 17392: 0x000066D8, 17393: 0x00006AC5, 17394: 0x00006AB9, 17395: 0x00006ABD, 17396: 0x00006AE1, 17397: 0x00006AC6, 17398: 0x00006ABA, 17399: 0x00006AB6, 17400: 0x00006AB7, 17401: 0x00006AC7, 17402: 0x00006AB4, 17403: 0x00006AAD, 17404: 0x00006B5E, 17405: 0x00006BC9, 17406: 0x00006C0B, 17407: 0x00007007, 17408: 0x0000700C, 17409: 0x0000700D, 17410: 0x00007001, 17411: 0x00007005, 17412: 0x00007014, 17413: 0x0000700E, 17414: 0x00006FFF, 17415: 0x00007000, 17416: 0x00006FFB, 17417: 0x00007026, 17418: 0x00006FFC, 17419: 0x00006FF7, 17420: 0x0000700A, 17421: 0x00007201, 17422: 0x000071FF, 17423: 0x000071F9, 17424: 0x00007203, 17425: 0x000071FD, 17426: 0x00007376, 17427: 0x000074B8, 17428: 0x000074C0, 17429: 0x000074B5, 17430: 0x000074C1, 17431: 0x000074BE, 17432: 0x000074B6, 17433: 0x000074BB, 17434: 0x000074C2, 17435: 0x00007514, 17436: 0x00007513, 17437: 0x0000765C, 17438: 0x00007664, 17439: 0x00007659, 17440: 0x00007650, 17441: 0x00007653, 17442: 0x00007657, 17443: 0x0000765A, 17444: 0x000076A6, 17445: 0x000076BD, 17446: 0x000076EC, 17447: 0x000077C2, 17448: 0x000077BA, 17449: 0x000078FF, 17450: 0x0000790C, 17451: 0x00007913, 17452: 0x00007914, 17453: 0x00007909, 17454: 0x00007910, 17455: 0x00007912, 17456: 0x00007911, 17457: 0x000079AD, 17458: 0x000079AC, 17459: 0x00007A5F, 17460: 0x00007C1C, 17461: 0x00007C29, 17462: 0x00007C19, 17463: 0x00007C20, 17464: 0x00007C1F, 17465: 0x00007C2D, 17466: 0x00007C1D, 17467: 0x00007C26, 17468: 0x00007C28, 17469: 0x00007C22, 17470: 0x00007C25, 17471: 0x00007C30, 17472: 0x00007E5C, 17473: 0x00007E50, 17474: 0x00007E56, 17475: 0x00007E63, 17476: 0x00007E58, 17477: 0x00007E62, 17478: 0x00007E5F, 17479: 0x00007E51, 17480: 0x00007E60, 17481: 0x00007E57, 17482: 0x00007E53, 17483: 0x00007FB5, 17484: 0x00007FB3, 17485: 0x00007FF7, 17486: 0x00007FF8, 17487: 0x00008075, 17488: 0x000081D1, 17489: 0x000081D2, 17490: 0x000081D0, 17491: 0x0000825F, 17492: 0x0000825E, 17493: 0x000085B4, 17494: 0x000085C6, 17495: 0x000085C0, 17496: 0x000085C3, 17497: 0x000085C2, 17498: 0x000085B3, 17499: 0x000085B5, 17500: 0x000085BD, 17501: 0x000085C7, 17502: 0x000085C4, 17503: 0x000085BF, 17504: 0x000085CB, 17505: 0x000085CE, 17506: 0x000085C8, 17507: 0x000085C5, 17508: 0x000085B1, 17509: 0x000085B6, 17510: 0x000085D2, 17511: 0x00008624, 17512: 0x000085B8, 17513: 0x000085B7, 17514: 0x000085BE, 17515: 0x00008669, 17516: 0x000087E7, 17517: 0x000087E6, 17518: 0x000087E2, 17519: 0x000087DB, 17520: 0x000087EB, 17521: 0x000087EA, 17522: 0x000087E5, 17523: 0x000087DF, 17524: 0x000087F3, 17525: 0x000087E4, 17526: 0x000087D4, 17527: 0x000087DC, 17528: 0x000087D3, 17529: 0x000087ED, 17530: 0x000087D8, 17531: 0x000087E3, 17532: 0x000087A4, 17533: 0x000087D7, 17534: 0x000087D9, 17535: 0x00008801, 17536: 0x000087F4, 17537: 0x000087E8, 17538: 0x000087DD, 17539: 0x00008953, 17540: 0x0000894B, 17541: 0x0000894F, 17542: 0x0000894C, 17543: 0x00008946, 17544: 0x00008950, 17545: 0x00008951, 17546: 0x00008949, 17547: 0x00008B2A, 17548: 0x00008B27, 17549: 0x00008B23, 17550: 0x00008B33, 17551: 0x00008B30, 17552: 0x00008B35, 17553: 0x00008B47, 17554: 0x00008B2F, 17555: 0x00008B3C, 17556: 0x00008B3E, 17557: 0x00008B31, 17558: 0x00008B25, 17559: 0x00008B37, 17560: 0x00008B26, 17561: 0x00008B36, 17562: 0x00008B2E, 17563: 0x00008B24, 17564: 0x00008B3B, 17565: 0x00008B3D, 17566: 0x00008B3A, 17567: 0x00008C42, 17568: 0x00008C75, 17569: 0x00008C99, 17570: 0x00008C98, 17571: 0x00008C97, 17572: 0x00008CFE, 17573: 0x00008D04, 17574: 0x00008D02, 17575: 0x00008D00, 17576: 0x00008E5C, 17577: 0x00008E62, 17578: 0x00008E60, 17579: 0x00008E57, 17580: 0x00008E56, 17581: 0x00008E5E, 17582: 0x00008E65, 17583: 0x00008E67, 17584: 0x00008E5B, 17585: 0x00008E5A, 17586: 0x00008E61, 17587: 0x00008E5D, 17588: 0x00008E69, 17589: 0x00008E54, 17590: 0x00008F46, 17591: 0x00008F47, 17592: 0x00008F48, 17593: 0x00008F4B, 17594: 0x00009128, 17595: 0x0000913A, 17596: 0x0000913B, 17597: 0x0000913E, 17598: 0x000091A8, 17599: 0x000091A5, 17600: 0x000091A7, 17601: 0x000091AF, 17602: 0x000091AA, 17603: 0x000093B5, 17604: 0x0000938C, 17605: 0x00009392, 17606: 0x000093B7, 17607: 0x0000939B, 17608: 0x0000939D, 17609: 0x00009389, 17610: 0x000093A7, 17611: 0x0000938E, 17612: 0x000093AA, 17613: 0x0000939E, 17614: 0x000093A6, 17615: 0x00009395, 17616: 0x00009388, 17617: 0x00009399, 17618: 0x0000939F, 17619: 0x0000938D, 17620: 0x000093B1, 17621: 0x00009391, 17622: 0x000093B2, 17623: 0x000093A4, 17624: 0x000093A8, 17625: 0x000093B4, 17626: 0x000093A3, 17627: 0x000093A5, 17628: 0x000095D2, 17629: 0x000095D3, 17630: 0x000095D1, 17631: 0x000096B3, 17632: 0x000096D7, 17633: 0x000096DA, 17634: 0x00005DC2, 17635: 0x000096DF, 17636: 0x000096D8, 17637: 0x000096DD, 17638: 0x00009723, 17639: 0x00009722, 17640: 0x00009725, 17641: 0x000097AC, 17642: 0x000097AE, 17643: 0x000097A8, 17644: 0x000097AB, 17645: 0x000097A4, 17646: 0x000097AA, 17647: 0x000097A2, 17648: 0x000097A5, 17649: 0x000097D7, 17650: 0x000097D9, 17651: 0x000097D6, 17652: 0x000097D8, 17653: 0x000097FA, 17654: 0x00009850, 17655: 0x00009851, 17656: 0x00009852, 17657: 0x000098B8, 17658: 0x00009941, 17659: 0x0000993C, 17660: 0x0000993A, 17661: 0x00009A0F, 17662: 0x00009A0B, 17663: 0x00009A09, 17664: 0x00009A0D, 17665: 0x00009A04, 17666: 0x00009A11, 17667: 0x00009A0A, 17668: 0x00009A05, 17669: 0x00009A07, 17670: 0x00009A06, 17671: 0x00009AC0, 17672: 0x00009ADC, 17673: 0x00009B08, 17674: 0x00009B04, 17675: 0x00009B05, 17676: 0x00009B29, 17677: 0x00009B35, 17678: 0x00009B4A, 17679: 0x00009B4C, 17680: 0x00009B4B, 17681: 0x00009BC7, 17682: 0x00009BC6, 17683: 0x00009BC3, 17684: 0x00009BBF, 17685: 0x00009BC1, 17686: 0x00009BB5, 17687: 0x00009BB8, 17688: 0x00009BD3, 17689: 0x00009BB6, 17690: 0x00009BC4, 17691: 0x00009BB9, 17692: 0x00009BBD, 17693: 0x00009D5C, 17694: 0x00009D53, 17695: 0x00009D4F, 17696: 0x00009D4A, 17697: 0x00009D5B, 17698: 0x00009D4B, 17699: 0x00009D59, 17700: 0x00009D56, 17701: 0x00009D4C, 17702: 0x00009D57, 17703: 0x00009D52, 17704: 0x00009D54, 17705: 0x00009D5F, 17706: 0x00009D58, 17707: 0x00009D5A, 17708: 0x00009E8E, 17709: 0x00009E8C, 17710: 0x00009EDF, 17711: 0x00009F01, 17712: 0x00009F00, 17713: 0x00009F16, 17714: 0x00009F25, 17715: 0x00009F2B, 17716: 0x00009F2A, 17717: 0x00009F29, 17718: 0x00009F28, 17719: 0x00009F4C, 17720: 0x00009F55, 17721: 0x00005134, 17722: 0x00005135, 17723: 0x00005296, 17724: 0x000052F7, 17725: 0x000053B4, 17726: 0x000056AB, 17727: 0x000056AD, 17728: 0x000056A6, 17729: 0x000056A7, 17730: 0x000056AA, 17731: 0x000056AC, 17732: 0x000058DA, 17733: 0x000058DD, 17734: 0x000058DB, 17735: 0x00005912, 17736: 0x00005B3D, 17737: 0x00005B3E, 17738: 0x00005B3F, 17739: 0x00005DC3, 17740: 0x00005E70, 17741: 0x00005FBF, 17742: 0x000061FB, 17743: 0x00006507, 17744: 0x00006510, 17745: 0x0000650D, 17746: 0x00006509, 17747: 0x0000650C, 17748: 0x0000650E, 17749: 0x00006584, 17750: 0x000065DE, 17751: 0x000065DD, 17752: 0x000066DE, 17753: 0x00006AE7, 17754: 0x00006AE0, 17755: 0x00006ACC, 17756: 0x00006AD1, 17757: 0x00006AD9, 17758: 0x00006ACB, 17759: 0x00006ADF, 17760: 0x00006ADC, 17761: 0x00006AD0, 17762: 0x00006AEB, 17763: 0x00006ACF, 17764: 0x00006ACD, 17765: 0x00006ADE, 17766: 0x00006B60, 17767: 0x00006BB0, 17768: 0x00006C0C, 17769: 0x00007019, 17770: 0x00007027, 17771: 0x00007020, 17772: 0x00007016, 17773: 0x0000702B, 17774: 0x00007021, 17775: 0x00007022, 17776: 0x00007023, 17777: 0x00007029, 17778: 0x00007017, 17779: 0x00007024, 17780: 0x0000701C, 17781: 0x0000702A, 17782: 0x0000720C, 17783: 0x0000720A, 17784: 0x00007207, 17785: 0x00007202, 17786: 0x00007205, 17787: 0x000072A5, 17788: 0x000072A6, 17789: 0x000072A4, 17790: 0x000072A3, 17791: 0x000072A1, 17792: 0x000074CB, 17793: 0x000074C5, 17794: 0x000074B7, 17795: 0x000074C3, 17796: 0x00007516, 17797: 0x00007660, 17798: 0x000077C9, 17799: 0x000077CA, 17800: 0x000077C4, 17801: 0x000077F1, 17802: 0x0000791D, 17803: 0x0000791B, 17804: 0x00007921, 17805: 0x0000791C, 17806: 0x00007917, 17807: 0x0000791E, 17808: 0x000079B0, 17809: 0x00007A67, 17810: 0x00007A68, 17811: 0x00007C33, 17812: 0x00007C3C, 17813: 0x00007C39, 17814: 0x00007C2C, 17815: 0x00007C3B, 17816: 0x00007CEC, 17817: 0x00007CEA, 17818: 0x00007E76, 17819: 0x00007E75, 17820: 0x00007E78, 17821: 0x00007E70, 17822: 0x00007E77, 17823: 0x00007E6F, 17824: 0x00007E7A, 17825: 0x00007E72, 17826: 0x00007E74, 17827: 0x00007E68, 17828: 0x00007F4B, 17829: 0x00007F4A, 17830: 0x00007F83, 17831: 0x00007F86, 17832: 0x00007FB7, 17833: 0x00007FFD, 17834: 0x00007FFE, 17835: 0x00008078, 17836: 0x000081D7, 17837: 0x000081D5, 17838: 0x00008264, 17839: 0x00008261, 17840: 0x00008263, 17841: 0x000085EB, 17842: 0x000085F1, 17843: 0x000085ED, 17844: 0x000085D9, 17845: 0x000085E1, 17846: 0x000085E8, 17847: 0x000085DA, 17848: 0x000085D7, 17849: 0x000085EC, 17850: 0x000085F2, 17851: 0x000085F8, 17852: 0x000085D8, 17853: 0x000085DF, 17854: 0x000085E3, 17855: 0x000085DC, 17856: 0x000085D1, 17857: 0x000085F0, 17858: 0x000085E6, 17859: 0x000085EF, 17860: 0x000085DE, 17861: 0x000085E2, 17862: 0x00008800, 17863: 0x000087FA, 17864: 0x00008803, 17865: 0x000087F6, 17866: 0x000087F7, 17867: 0x00008809, 17868: 0x0000880C, 17869: 0x0000880B, 17870: 0x00008806, 17871: 0x000087FC, 17872: 0x00008808, 17873: 0x000087FF, 17874: 0x0000880A, 17875: 0x00008802, 17876: 0x00008962, 17877: 0x0000895A, 17878: 0x0000895B, 17879: 0x00008957, 17880: 0x00008961, 17881: 0x0000895C, 17882: 0x00008958, 17883: 0x0000895D, 17884: 0x00008959, 17885: 0x00008988, 17886: 0x000089B7, 17887: 0x000089B6, 17888: 0x000089F6, 17889: 0x00008B50, 17890: 0x00008B48, 17891: 0x00008B4A, 17892: 0x00008B40, 17893: 0x00008B53, 17894: 0x00008B56, 17895: 0x00008B54, 17896: 0x00008B4B, 17897: 0x00008B55, 17898: 0x00008B51, 17899: 0x00008B42, 17900: 0x00008B52, 17901: 0x00008B57, 17902: 0x00008C43, 17903: 0x00008C77, 17904: 0x00008C76, 17905: 0x00008C9A, 17906: 0x00008D06, 17907: 0x00008D07, 17908: 0x00008D09, 17909: 0x00008DAC, 17910: 0x00008DAA, 17911: 0x00008DAD, 17912: 0x00008DAB, 17913: 0x00008E6D, 17914: 0x00008E78, 17915: 0x00008E73, 17916: 0x00008E6A, 17917: 0x00008E6F, 17918: 0x00008E7B, 17919: 0x00008EC2, 17920: 0x00008F52, 17921: 0x00008F51, 17922: 0x00008F4F, 17923: 0x00008F50, 17924: 0x00008F53, 17925: 0x00008FB4, 17926: 0x00009140, 17927: 0x0000913F, 17928: 0x000091B0, 17929: 0x000091AD, 17930: 0x000093DE, 17931: 0x000093C7, 17932: 0x000093CF, 17933: 0x000093C2, 17934: 0x000093DA, 17935: 0x000093D0, 17936: 0x000093F9, 17937: 0x000093EC, 17938: 0x000093CC, 17939: 0x000093D9, 17940: 0x000093A9, 17941: 0x000093E6, 17942: 0x000093CA, 17943: 0x000093D4, 17944: 0x000093EE, 17945: 0x000093E3, 17946: 0x000093D5, 17947: 0x000093C4, 17948: 0x000093CE, 17949: 0x000093C0, 17950: 0x000093D2, 17951: 0x000093E7, 17952: 0x0000957D, 17953: 0x000095DA, 17954: 0x000095DB, 17955: 0x000096E1, 17956: 0x00009729, 17957: 0x0000972B, 17958: 0x0000972C, 17959: 0x00009728, 17960: 0x00009726, 17961: 0x000097B3, 17962: 0x000097B7, 17963: 0x000097B6, 17964: 0x000097DD, 17965: 0x000097DE, 17966: 0x000097DF, 17967: 0x0000985C, 17968: 0x00009859, 17969: 0x0000985D, 17970: 0x00009857, 17971: 0x000098BF, 17972: 0x000098BD, 17973: 0x000098BB, 17974: 0x000098BE, 17975: 0x00009948, 17976: 0x00009947, 17977: 0x00009943, 17978: 0x000099A6, 17979: 0x000099A7, 17980: 0x00009A1A, 17981: 0x00009A15, 17982: 0x00009A25, 17983: 0x00009A1D, 17984: 0x00009A24, 17985: 0x00009A1B, 17986: 0x00009A22, 17987: 0x00009A20, 17988: 0x00009A27, 17989: 0x00009A23, 17990: 0x00009A1E, 17991: 0x00009A1C, 17992: 0x00009A14, 17993: 0x00009AC2, 17994: 0x00009B0B, 17995: 0x00009B0A, 17996: 0x00009B0E, 17997: 0x00009B0C, 17998: 0x00009B37, 17999: 0x00009BEA, 18000: 0x00009BEB, 18001: 0x00009BE0, 18002: 0x00009BDE, 18003: 0x00009BE4, 18004: 0x00009BE6, 18005: 0x00009BE2, 18006: 0x00009BF0, 18007: 0x00009BD4, 18008: 0x00009BD7, 18009: 0x00009BEC, 18010: 0x00009BDC, 18011: 0x00009BD9, 18012: 0x00009BE5, 18013: 0x00009BD5, 18014: 0x00009BE1, 18015: 0x00009BDA, 18016: 0x00009D77, 18017: 0x00009D81, 18018: 0x00009D8A, 18019: 0x00009D84, 18020: 0x00009D88, 18021: 0x00009D71, 18022: 0x00009D80, 18023: 0x00009D78, 18024: 0x00009D86, 18025: 0x00009D8B, 18026: 0x00009D8C, 18027: 0x00009D7D, 18028: 0x00009D6B, 18029: 0x00009D74, 18030: 0x00009D75, 18031: 0x00009D70, 18032: 0x00009D69, 18033: 0x00009D85, 18034: 0x00009D73, 18035: 0x00009D7B, 18036: 0x00009D82, 18037: 0x00009D6F, 18038: 0x00009D79, 18039: 0x00009D7F, 18040: 0x00009D87, 18041: 0x00009D68, 18042: 0x00009E94, 18043: 0x00009E91, 18044: 0x00009EC0, 18045: 0x00009EFC, 18046: 0x00009F2D, 18047: 0x00009F40, 18048: 0x00009F41, 18049: 0x00009F4D, 18050: 0x00009F56, 18051: 0x00009F57, 18052: 0x00009F58, 18053: 0x00005337, 18054: 0x000056B2, 18055: 0x000056B5, 18056: 0x000056B3, 18057: 0x000058E3, 18058: 0x00005B45, 18059: 0x00005DC6, 18060: 0x00005DC7, 18061: 0x00005EEE, 18062: 0x00005EEF, 18063: 0x00005FC0, 18064: 0x00005FC1, 18065: 0x000061F9, 18066: 0x00006517, 18067: 0x00006516, 18068: 0x00006515, 18069: 0x00006513, 18070: 0x000065DF, 18071: 0x000066E8, 18072: 0x000066E3, 18073: 0x000066E4, 18074: 0x00006AF3, 18075: 0x00006AF0, 18076: 0x00006AEA, 18077: 0x00006AE8, 18078: 0x00006AF9, 18079: 0x00006AF1, 18080: 0x00006AEE, 18081: 0x00006AEF, 18082: 0x0000703C, 18083: 0x00007035, 18084: 0x0000702F, 18085: 0x00007037, 18086: 0x00007034, 18087: 0x00007031, 18088: 0x00007042, 18089: 0x00007038, 18090: 0x0000703F, 18091: 0x0000703A, 18092: 0x00007039, 18093: 0x00007040, 18094: 0x0000703B, 18095: 0x00007033, 18096: 0x00007041, 18097: 0x00007213, 18098: 0x00007214, 18099: 0x000072A8, 18100: 0x0000737D, 18101: 0x0000737C, 18102: 0x000074BA, 18103: 0x000076AB, 18104: 0x000076AA, 18105: 0x000076BE, 18106: 0x000076ED, 18107: 0x000077CC, 18108: 0x000077CE, 18109: 0x000077CF, 18110: 0x000077CD, 18111: 0x000077F2, 18112: 0x00007925, 18113: 0x00007923, 18114: 0x00007927, 18115: 0x00007928, 18116: 0x00007924, 18117: 0x00007929, 18118: 0x000079B2, 18119: 0x00007A6E, 18120: 0x00007A6C, 18121: 0x00007A6D, 18122: 0x00007AF7, 18123: 0x00007C49, 18124: 0x00007C48, 18125: 0x00007C4A, 18126: 0x00007C47, 18127: 0x00007C45, 18128: 0x00007CEE, 18129: 0x00007E7B, 18130: 0x00007E7E, 18131: 0x00007E81, 18132: 0x00007E80, 18133: 0x00007FBA, 18134: 0x00007FFF, 18135: 0x00008079, 18136: 0x000081DB, 18137: 0x000081D9, 18138: 0x0000820B, 18139: 0x00008268, 18140: 0x00008269, 18141: 0x00008622, 18142: 0x000085FF, 18143: 0x00008601, 18144: 0x000085FE, 18145: 0x0000861B, 18146: 0x00008600, 18147: 0x000085F6, 18148: 0x00008604, 18149: 0x00008609, 18150: 0x00008605, 18151: 0x0000860C, 18152: 0x000085FD, 18153: 0x00008819, 18154: 0x00008810, 18155: 0x00008811, 18156: 0x00008817, 18157: 0x00008813, 18158: 0x00008816, 18159: 0x00008963, 18160: 0x00008966, 18161: 0x000089B9, 18162: 0x000089F7, 18163: 0x00008B60, 18164: 0x00008B6A, 18165: 0x00008B5D, 18166: 0x00008B68, 18167: 0x00008B63, 18168: 0x00008B65, 18169: 0x00008B67, 18170: 0x00008B6D, 18171: 0x00008DAE, 18172: 0x00008E86, 18173: 0x00008E88, 18174: 0x00008E84, 18175: 0x00008F59, 18176: 0x00008F56, 18177: 0x00008F57, 18178: 0x00008F55, 18179: 0x00008F58, 18180: 0x00008F5A, 18181: 0x0000908D, 18182: 0x00009143, 18183: 0x00009141, 18184: 0x000091B7, 18185: 0x000091B5, 18186: 0x000091B2, 18187: 0x000091B3, 18188: 0x0000940B, 18189: 0x00009413, 18190: 0x000093FB, 18191: 0x00009420, 18192: 0x0000940F, 18193: 0x00009414, 18194: 0x000093FE, 18195: 0x00009415, 18196: 0x00009410, 18197: 0x00009428, 18198: 0x00009419, 18199: 0x0000940D, 18200: 0x000093F5, 18201: 0x00009400, 18202: 0x000093F7, 18203: 0x00009407, 18204: 0x0000940E, 18205: 0x00009416, 18206: 0x00009412, 18207: 0x000093FA, 18208: 0x00009409, 18209: 0x000093F8, 18210: 0x0000940A, 18211: 0x000093FF, 18212: 0x000093FC, 18213: 0x0000940C, 18214: 0x000093F6, 18215: 0x00009411, 18216: 0x00009406, 18217: 0x000095DE, 18218: 0x000095E0, 18219: 0x000095DF, 18220: 0x0000972E, 18221: 0x0000972F, 18222: 0x000097B9, 18223: 0x000097BB, 18224: 0x000097FD, 18225: 0x000097FE, 18226: 0x00009860, 18227: 0x00009862, 18228: 0x00009863, 18229: 0x0000985F, 18230: 0x000098C1, 18231: 0x000098C2, 18232: 0x00009950, 18233: 0x0000994E, 18234: 0x00009959, 18235: 0x0000994C, 18236: 0x0000994B, 18237: 0x00009953, 18238: 0x00009A32, 18239: 0x00009A34, 18240: 0x00009A31, 18241: 0x00009A2C, 18242: 0x00009A2A, 18243: 0x00009A36, 18244: 0x00009A29, 18245: 0x00009A2E, 18246: 0x00009A38, 18247: 0x00009A2D, 18248: 0x00009AC7, 18249: 0x00009ACA, 18250: 0x00009AC6, 18251: 0x00009B10, 18252: 0x00009B12, 18253: 0x00009B11, 18254: 0x00009C0B, 18255: 0x00009C08, 18256: 0x00009BF7, 18257: 0x00009C05, 18258: 0x00009C12, 18259: 0x00009BF8, 18260: 0x00009C40, 18261: 0x00009C07, 18262: 0x00009C0E, 18263: 0x00009C06, 18264: 0x00009C17, 18265: 0x00009C14, 18266: 0x00009C09, 18267: 0x00009D9F, 18268: 0x00009D99, 18269: 0x00009DA4, 18270: 0x00009D9D, 18271: 0x00009D92, 18272: 0x00009D98, 18273: 0x00009D90, 18274: 0x00009D9B, 18275: 0x00009DA0, 18276: 0x00009D94, 18277: 0x00009D9C, 18278: 0x00009DAA, 18279: 0x00009D97, 18280: 0x00009DA1, 18281: 0x00009D9A, 18282: 0x00009DA2, 18283: 0x00009DA8, 18284: 0x00009D9E, 18285: 0x00009DA3, 18286: 0x00009DBF, 18287: 0x00009DA9, 18288: 0x00009D96, 18289: 0x00009DA6, 18290: 0x00009DA7, 18291: 0x00009E99, 18292: 0x00009E9B, 18293: 0x00009E9A, 18294: 0x00009EE5, 18295: 0x00009EE4, 18296: 0x00009EE7, 18297: 0x00009EE6, 18298: 0x00009F30, 18299: 0x00009F2E, 18300: 0x00009F5B, 18301: 0x00009F60, 18302: 0x00009F5E, 18303: 0x00009F5D, 18304: 0x00009F59, 18305: 0x00009F91, 18306: 0x0000513A, 18307: 0x00005139, 18308: 0x00005298, 18309: 0x00005297, 18310: 0x000056C3, 18311: 0x000056BD, 18312: 0x000056BE, 18313: 0x00005B48, 18314: 0x00005B47, 18315: 0x00005DCB, 18316: 0x00005DCF, 18317: 0x00005EF1, 18318: 0x000061FD, 18319: 0x0000651B, 18320: 0x00006B02, 18321: 0x00006AFC, 18322: 0x00006B03, 18323: 0x00006AF8, 18324: 0x00006B00, 18325: 0x00007043, 18326: 0x00007044, 18327: 0x0000704A, 18328: 0x00007048, 18329: 0x00007049, 18330: 0x00007045, 18331: 0x00007046, 18332: 0x0000721D, 18333: 0x0000721A, 18334: 0x00007219, 18335: 0x0000737E, 18336: 0x00007517, 18337: 0x0000766A, 18338: 0x000077D0, 18339: 0x0000792D, 18340: 0x00007931, 18341: 0x0000792F, 18342: 0x00007C54, 18343: 0x00007C53, 18344: 0x00007CF2, 18345: 0x00007E8A, 18346: 0x00007E87, 18347: 0x00007E88, 18348: 0x00007E8B, 18349: 0x00007E86, 18350: 0x00007E8D, 18351: 0x00007F4D, 18352: 0x00007FBB, 18353: 0x00008030, 18354: 0x000081DD, 18355: 0x00008618, 18356: 0x0000862A, 18357: 0x00008626, 18358: 0x0000861F, 18359: 0x00008623, 18360: 0x0000861C, 18361: 0x00008619, 18362: 0x00008627, 18363: 0x0000862E, 18364: 0x00008621, 18365: 0x00008620, 18366: 0x00008629, 18367: 0x0000861E, 18368: 0x00008625, 18369: 0x00008829, 18370: 0x0000881D, 18371: 0x0000881B, 18372: 0x00008820, 18373: 0x00008824, 18374: 0x0000881C, 18375: 0x0000882B, 18376: 0x0000884A, 18377: 0x0000896D, 18378: 0x00008969, 18379: 0x0000896E, 18380: 0x0000896B, 18381: 0x000089FA, 18382: 0x00008B79, 18383: 0x00008B78, 18384: 0x00008B45, 18385: 0x00008B7A, 18386: 0x00008B7B, 18387: 0x00008D10, 18388: 0x00008D14, 18389: 0x00008DAF, 18390: 0x00008E8E, 18391: 0x00008E8C, 18392: 0x00008F5E, 18393: 0x00008F5B, 18394: 0x00008F5D, 18395: 0x00009146, 18396: 0x00009144, 18397: 0x00009145, 18398: 0x000091B9, 18399: 0x0000943F, 18400: 0x0000943B, 18401: 0x00009436, 18402: 0x00009429, 18403: 0x0000943D, 18404: 0x0000943C, 18405: 0x00009430, 18406: 0x00009439, 18407: 0x0000942A, 18408: 0x00009437, 18409: 0x0000942C, 18410: 0x00009440, 18411: 0x00009431, 18412: 0x000095E5, 18413: 0x000095E4, 18414: 0x000095E3, 18415: 0x00009735, 18416: 0x0000973A, 18417: 0x000097BF, 18418: 0x000097E1, 18419: 0x00009864, 18420: 0x000098C9, 18421: 0x000098C6, 18422: 0x000098C0, 18423: 0x00009958, 18424: 0x00009956, 18425: 0x00009A39, 18426: 0x00009A3D, 18427: 0x00009A46, 18428: 0x00009A44, 18429: 0x00009A42, 18430: 0x00009A41, 18431: 0x00009A3A, 18432: 0x00009A3F, 18433: 0x00009ACD, 18434: 0x00009B15, 18435: 0x00009B17, 18436: 0x00009B18, 18437: 0x00009B16, 18438: 0x00009B3A, 18439: 0x00009B52, 18440: 0x00009C2B, 18441: 0x00009C1D, 18442: 0x00009C1C, 18443: 0x00009C2C, 18444: 0x00009C23, 18445: 0x00009C28, 18446: 0x00009C29, 18447: 0x00009C24, 18448: 0x00009C21, 18449: 0x00009DB7, 18450: 0x00009DB6, 18451: 0x00009DBC, 18452: 0x00009DC1, 18453: 0x00009DC7, 18454: 0x00009DCA, 18455: 0x00009DCF, 18456: 0x00009DBE, 18457: 0x00009DC5, 18458: 0x00009DC3, 18459: 0x00009DBB, 18460: 0x00009DB5, 18461: 0x00009DCE, 18462: 0x00009DB9, 18463: 0x00009DBA, 18464: 0x00009DAC, 18465: 0x00009DC8, 18466: 0x00009DB1, 18467: 0x00009DAD, 18468: 0x00009DCC, 18469: 0x00009DB3, 18470: 0x00009DCD, 18471: 0x00009DB2, 18472: 0x00009E7A, 18473: 0x00009E9C, 18474: 0x00009EEB, 18475: 0x00009EEE, 18476: 0x00009EED, 18477: 0x00009F1B, 18478: 0x00009F18, 18479: 0x00009F1A, 18480: 0x00009F31, 18481: 0x00009F4E, 18482: 0x00009F65, 18483: 0x00009F64, 18484: 0x00009F92, 18485: 0x00004EB9, 18486: 0x000056C6, 18487: 0x000056C5, 18488: 0x000056CB, 18489: 0x00005971, 18490: 0x00005B4B, 18491: 0x00005B4C, 18492: 0x00005DD5, 18493: 0x00005DD1, 18494: 0x00005EF2, 18495: 0x00006521, 18496: 0x00006520, 18497: 0x00006526, 18498: 0x00006522, 18499: 0x00006B0B, 18500: 0x00006B08, 18501: 0x00006B09, 18502: 0x00006C0D, 18503: 0x00007055, 18504: 0x00007056, 18505: 0x00007057, 18506: 0x00007052, 18507: 0x0000721E, 18508: 0x0000721F, 18509: 0x000072A9, 18510: 0x0000737F, 18511: 0x000074D8, 18512: 0x000074D5, 18513: 0x000074D9, 18514: 0x000074D7, 18515: 0x0000766D, 18516: 0x000076AD, 18517: 0x00007935, 18518: 0x000079B4, 18519: 0x00007A70, 18520: 0x00007A71, 18521: 0x00007C57, 18522: 0x00007C5C, 18523: 0x00007C59, 18524: 0x00007C5B, 18525: 0x00007C5A, 18526: 0x00007CF4, 18527: 0x00007CF1, 18528: 0x00007E91, 18529: 0x00007F4F, 18530: 0x00007F87, 18531: 0x000081DE, 18532: 0x0000826B, 18533: 0x00008634, 18534: 0x00008635, 18535: 0x00008633, 18536: 0x0000862C, 18537: 0x00008632, 18538: 0x00008636, 18539: 0x0000882C, 18540: 0x00008828, 18541: 0x00008826, 18542: 0x0000882A, 18543: 0x00008825, 18544: 0x00008971, 18545: 0x000089BF, 18546: 0x000089BE, 18547: 0x000089FB, 18548: 0x00008B7E, 18549: 0x00008B84, 18550: 0x00008B82, 18551: 0x00008B86, 18552: 0x00008B85, 18553: 0x00008B7F, 18554: 0x00008D15, 18555: 0x00008E95, 18556: 0x00008E94, 18557: 0x00008E9A, 18558: 0x00008E92, 18559: 0x00008E90, 18560: 0x00008E96, 18561: 0x00008E97, 18562: 0x00008F60, 18563: 0x00008F62, 18564: 0x00009147, 18565: 0x0000944C, 18566: 0x00009450, 18567: 0x0000944A, 18568: 0x0000944B, 18569: 0x0000944F, 18570: 0x00009447, 18571: 0x00009445, 18572: 0x00009448, 18573: 0x00009449, 18574: 0x00009446, 18575: 0x0000973F, 18576: 0x000097E3, 18577: 0x0000986A, 18578: 0x00009869, 18579: 0x000098CB, 18580: 0x00009954, 18581: 0x0000995B, 18582: 0x00009A4E, 18583: 0x00009A53, 18584: 0x00009A54, 18585: 0x00009A4C, 18586: 0x00009A4F, 18587: 0x00009A48, 18588: 0x00009A4A, 18589: 0x00009A49, 18590: 0x00009A52, 18591: 0x00009A50, 18592: 0x00009AD0, 18593: 0x00009B19, 18594: 0x00009B2B, 18595: 0x00009B3B, 18596: 0x00009B56, 18597: 0x00009B55, 18598: 0x00009C46, 18599: 0x00009C48, 18600: 0x00009C3F, 18601: 0x00009C44, 18602: 0x00009C39, 18603: 0x00009C33, 18604: 0x00009C41, 18605: 0x00009C3C, 18606: 0x00009C37, 18607: 0x00009C34, 18608: 0x00009C32, 18609: 0x00009C3D, 18610: 0x00009C36, 18611: 0x00009DDB, 18612: 0x00009DD2, 18613: 0x00009DDE, 18614: 0x00009DDA, 18615: 0x00009DCB, 18616: 0x00009DD0, 18617: 0x00009DDC, 18618: 0x00009DD1, 18619: 0x00009DDF, 18620: 0x00009DE9, 18621: 0x00009DD9, 18622: 0x00009DD8, 18623: 0x00009DD6, 18624: 0x00009DF5, 18625: 0x00009DD5, 18626: 0x00009DDD, 18627: 0x00009EB6, 18628: 0x00009EF0, 18629: 0x00009F35, 18630: 0x00009F33, 18631: 0x00009F32, 18632: 0x00009F42, 18633: 0x00009F6B, 18634: 0x00009F95, 18635: 0x00009FA2, 18636: 0x0000513D, 18637: 0x00005299, 18638: 0x000058E8, 18639: 0x000058E7, 18640: 0x00005972, 18641: 0x00005B4D, 18642: 0x00005DD8, 18643: 0x0000882F, 18644: 0x00005F4F, 18645: 0x00006201, 18646: 0x00006203, 18647: 0x00006204, 18648: 0x00006529, 18649: 0x00006525, 18650: 0x00006596, 18651: 0x000066EB, 18652: 0x00006B11, 18653: 0x00006B12, 18654: 0x00006B0F, 18655: 0x00006BCA, 18656: 0x0000705B, 18657: 0x0000705A, 18658: 0x00007222, 18659: 0x00007382, 18660: 0x00007381, 18661: 0x00007383, 18662: 0x00007670, 18663: 0x000077D4, 18664: 0x00007C67, 18665: 0x00007C66, 18666: 0x00007E95, 18667: 0x0000826C, 18668: 0x0000863A, 18669: 0x00008640, 18670: 0x00008639, 18671: 0x0000863C, 18672: 0x00008631, 18673: 0x0000863B, 18674: 0x0000863E, 18675: 0x00008830, 18676: 0x00008832, 18677: 0x0000882E, 18678: 0x00008833, 18679: 0x00008976, 18680: 0x00008974, 18681: 0x00008973, 18682: 0x000089FE, 18683: 0x00008B8C, 18684: 0x00008B8E, 18685: 0x00008B8B, 18686: 0x00008B88, 18687: 0x00008C45, 18688: 0x00008D19, 18689: 0x00008E98, 18690: 0x00008F64, 18691: 0x00008F63, 18692: 0x000091BC, 18693: 0x00009462, 18694: 0x00009455, 18695: 0x0000945D, 18696: 0x00009457, 18697: 0x0000945E, 18698: 0x000097C4, 18699: 0x000097C5, 18700: 0x00009800, 18701: 0x00009A56, 18702: 0x00009A59, 18703: 0x00009B1E, 18704: 0x00009B1F, 18705: 0x00009B20, 18706: 0x00009C52, 18707: 0x00009C58, 18708: 0x00009C50, 18709: 0x00009C4A, 18710: 0x00009C4D, 18711: 0x00009C4B, 18712: 0x00009C55, 18713: 0x00009C59, 18714: 0x00009C4C, 18715: 0x00009C4E, 18716: 0x00009DFB, 18717: 0x00009DF7, 18718: 0x00009DEF, 18719: 0x00009DE3, 18720: 0x00009DEB, 18721: 0x00009DF8, 18722: 0x00009DE4, 18723: 0x00009DF6, 18724: 0x00009DE1, 18725: 0x00009DEE, 18726: 0x00009DE6, 18727: 0x00009DF2, 18728: 0x00009DF0, 18729: 0x00009DE2, 18730: 0x00009DEC, 18731: 0x00009DF4, 18732: 0x00009DF3, 18733: 0x00009DE8, 18734: 0x00009DED, 18735: 0x00009EC2, 18736: 0x00009ED0, 18737: 0x00009EF2, 18738: 0x00009EF3, 18739: 0x00009F06, 18740: 0x00009F1C, 18741: 0x00009F38, 18742: 0x00009F37, 18743: 0x00009F36, 18744: 0x00009F43, 18745: 0x00009F4F, 18746: 0x00009F71, 18747: 0x00009F70, 18748: 0x00009F6E, 18749: 0x00009F6F, 18750: 0x000056D3, 18751: 0x000056CD, 18752: 0x00005B4E, 18753: 0x00005C6D, 18754: 0x0000652D, 18755: 0x000066ED, 18756: 0x000066EE, 18757: 0x00006B13, 18758: 0x0000705F, 18759: 0x00007061, 18760: 0x0000705D, 18761: 0x00007060, 18762: 0x00007223, 18763: 0x000074DB, 18764: 0x000074E5, 18765: 0x000077D5, 18766: 0x00007938, 18767: 0x000079B7, 18768: 0x000079B6, 18769: 0x00007C6A, 18770: 0x00007E97, 18771: 0x00007F89, 18772: 0x0000826D, 18773: 0x00008643, 18774: 0x00008838, 18775: 0x00008837, 18776: 0x00008835, 18777: 0x0000884B, 18778: 0x00008B94, 18779: 0x00008B95, 18780: 0x00008E9E, 18781: 0x00008E9F, 18782: 0x00008EA0, 18783: 0x00008E9D, 18784: 0x000091BE, 18785: 0x000091BD, 18786: 0x000091C2, 18787: 0x0000946B, 18788: 0x00009468, 18789: 0x00009469, 18790: 0x000096E5, 18791: 0x00009746, 18792: 0x00009743, 18793: 0x00009747, 18794: 0x000097C7, 18795: 0x000097E5, 18796: 0x00009A5E, 18797: 0x00009AD5, 18798: 0x00009B59, 18799: 0x00009C63, 18800: 0x00009C67, 18801: 0x00009C66, 18802: 0x00009C62, 18803: 0x00009C5E, 18804: 0x00009C60, 18805: 0x00009E02, 18806: 0x00009DFE, 18807: 0x00009E07, 18808: 0x00009E03, 18809: 0x00009E06, 18810: 0x00009E05, 18811: 0x00009E00, 18812: 0x00009E01, 18813: 0x00009E09, 18814: 0x00009DFF, 18815: 0x00009DFD, 18816: 0x00009E04, 18817: 0x00009EA0, 18818: 0x00009F1E, 18819: 0x00009F46, 18820: 0x00009F74, 18821: 0x00009F75, 18822: 0x00009F76, 18823: 0x000056D4, 18824: 0x0000652E, 18825: 0x000065B8, 18826: 0x00006B18, 18827: 0x00006B19, 18828: 0x00006B17, 18829: 0x00006B1A, 18830: 0x00007062, 18831: 0x00007226, 18832: 0x000072AA, 18833: 0x000077D8, 18834: 0x000077D9, 18835: 0x00007939, 18836: 0x00007C69, 18837: 0x00007C6B, 18838: 0x00007CF6, 18839: 0x00007E9A, 18840: 0x00007E98, 18841: 0x00007E9B, 18842: 0x00007E99, 18843: 0x000081E0, 18844: 0x000081E1, 18845: 0x00008646, 18846: 0x00008647, 18847: 0x00008648, 18848: 0x00008979, 18849: 0x0000897A, 18850: 0x0000897C, 18851: 0x0000897B, 18852: 0x000089FF, 18853: 0x00008B98, 18854: 0x00008B99, 18855: 0x00008EA5, 18856: 0x00008EA4, 18857: 0x00008EA3, 18858: 0x0000946E, 18859: 0x0000946D, 18860: 0x0000946F, 18861: 0x00009471, 18862: 0x00009473, 18863: 0x00009749, 18864: 0x00009872, 18865: 0x0000995F, 18866: 0x00009C68, 18867: 0x00009C6E, 18868: 0x00009C6D, 18869: 0x00009E0B, 18870: 0x00009E0D, 18871: 0x00009E10, 18872: 0x00009E0F, 18873: 0x00009E12, 18874: 0x00009E11, 18875: 0x00009EA1, 18876: 0x00009EF5, 18877: 0x00009F09, 18878: 0x00009F47, 18879: 0x00009F78, 18880: 0x00009F7B, 18881: 0x00009F7A, 18882: 0x00009F79, 18883: 0x0000571E, 18884: 0x00007066, 18885: 0x00007C6F, 18886: 0x0000883C, 18887: 0x00008DB2, 18888: 0x00008EA6, 18889: 0x000091C3, 18890: 0x00009474, 18891: 0x00009478, 18892: 0x00009476, 18893: 0x00009475, 18894: 0x00009A60, 18895: 0x00009C74, 18896: 0x00009C73, 18897: 0x00009C71, 18898: 0x00009C75, 18899: 0x00009E14, 18900: 0x00009E13, 18901: 0x00009EF6, 18902: 0x00009F0A, 18903: 0x00009FA4, 18904: 0x00007068, 18905: 0x00007065, 18906: 0x00007CF7, 18907: 0x0000866A, 18908: 0x0000883E, 18909: 0x0000883D, 18910: 0x0000883F, 18911: 0x00008B9E, 18912: 0x00008C9C, 18913: 0x00008EA9, 18914: 0x00008EC9, 18915: 0x0000974B, 18916: 0x00009873, 18917: 0x00009874, 18918: 0x000098CC, 18919: 0x00009961, 18920: 0x000099AB, 18921: 0x00009A64, 18922: 0x00009A66, 18923: 0x00009A67, 18924: 0x00009B24, 18925: 0x00009E15, 18926: 0x00009E17, 18927: 0x00009F48, 18928: 0x00006207, 18929: 0x00006B1E, 18930: 0x00007227, 18931: 0x0000864C, 18932: 0x00008EA8, 18933: 0x00009482, 18934: 0x00009480, 18935: 0x00009481, 18936: 0x00009A69, 18937: 0x00009A68, 18938: 0x00009B2E, 18939: 0x00009E19, 18940: 0x00007229, 18941: 0x0000864B, 18942: 0x00008B9F, 18943: 0x00009483, 18944: 0x00009C79, 18945: 0x00009EB7, 18946: 0x00007675, 18947: 0x00009A6B, 18948: 0x00009C7A, 18949: 0x00009E1D, 18950: 0x00007069, 18951: 0x0000706A, 18952: 0x00009EA4, 18953: 0x00009F7E, 18954: 0x00009F49, 18955: 0x00009F98, 18956: 0x00007881, 18957: 0x000092B9, 18958: 0x000088CF, 18959: 0x000058BB, 18960: 0x00006052, 18961: 0x00007CA7, 18962: 0x00005AFA, 18963: 0x00002554, 18964: 0x00002566, 18965: 0x00002557, 18966: 0x00002560, 18967: 0x0000256C, 18968: 0x00002563, 18969: 0x0000255A, 18970: 0x00002569, 18971: 0x0000255D, 18972: 0x00002552, 18973: 0x00002564, 18974: 0x00002555, 18975: 0x0000255E, 18976: 0x0000256A, 18977: 0x00002561, 18978: 0x00002558, 18979: 0x00002567, 18980: 0x0000255B, 18981: 0x00002553, 18982: 0x00002565, 18983: 0x00002556, 18984: 0x0000255F, 18985: 0x0000256B, 18986: 0x00002562, 18987: 0x00002559, 18988: 0x00002568, 18989: 0x0000255C, 18990: 0x00002551, 18991: 0x00002550, 18992: 0x0000256D, 18993: 0x0000256E, 18994: 0x00002570, 18995: 0x0000256F, 18996: 0x0000FFED, 18997: 0x00020547, 18998: 0x000092DB, 18999: 0x000205DF, 19000: 0x00023FC5, 19001: 0x0000854C, 19002: 0x000042B5, 19003: 0x000073EF, 19004: 0x000051B5, 19005: 0x00003649, 19006: 0x00024942, 19007: 0x000289E4, 19008: 0x00009344, 19009: 0x000219DB, 19010: 0x000082EE, 19011: 0x00023CC8, 19012: 0x0000783C, 19013: 0x00006744, 19014: 0x000062DF, 19015: 0x00024933, 19016: 0x000289AA, 19017: 0x000202A0, 19018: 0x00026BB3, 19019: 0x00021305, 19020: 0x00004FAB, 19021: 0x000224ED, 19022: 0x00005008, 19023: 0x00026D29, 19024: 0x00027A84, 19025: 0x00023600, 19026: 0x00024AB1, 19027: 0x00022513, 19028: 0x00005029, 19029: 0x0002037E, 19030: 0x00005FA4, 19031: 0x00020380, 19032: 0x00020347, 19033: 0x00006EDB, 19034: 0x0002041F, 19035: 0x0000507D, 19036: 0x00005101, 19037: 0x0000347A, 19038: 0x0000510E, 19039: 0x0000986C, 19040: 0x00003743, 19041: 0x00008416, 19042: 0x000249A4, 19043: 0x00020487, 19044: 0x00005160, 19045: 0x000233B4, 19046: 0x0000516A, 19047: 0x00020BFF, 19048: 0x000220FC, 19049: 0x000202E5, 19050: 0x00022530, 19051: 0x0002058E, 19052: 0x00023233, 19053: 0x00021983, 19054: 0x00005B82, 19055: 0x0000877D, 19056: 0x000205B3, 19057: 0x00023C99, 19058: 0x000051B2, 19059: 0x000051B8, 19060: 0x00009D34, 19061: 0x000051C9, 19062: 0x000051CF, 19063: 0x000051D1, 19064: 0x00003CDC, 19065: 0x000051D3, 19066: 0x00024AA6, 19067: 0x000051B3, 19068: 0x000051E2, 19069: 0x00005342, 19070: 0x000051ED, 19071: 0x000083CD, 19072: 0x0000693E, 19073: 0x0002372D, 19074: 0x00005F7B, 19075: 0x0000520B, 19076: 0x00005226, 19077: 0x0000523C, 19078: 0x000052B5, 19079: 0x00005257, 19080: 0x00005294, 19081: 0x000052B9, 19082: 0x000052C5, 19083: 0x00007C15, 19084: 0x00008542, 19085: 0x000052E0, 19086: 0x0000860D, 19087: 0x00026B13, 19088: 0x00005305, 19089: 0x00028ADE, 19090: 0x00005549, 19091: 0x00006ED9, 19092: 0x00023F80, 19093: 0x00020954, 19094: 0x00023FEC, 19095: 0x00005333, 19096: 0x00005344, 19097: 0x00020BE2, 19098: 0x00006CCB, 19099: 0x00021726, 19100: 0x0000681B, 19101: 0x000073D5, 19102: 0x0000604A, 19103: 0x00003EAA, 19104: 0x000038CC, 19105: 0x000216E8, 19106: 0x000071DD, 19107: 0x000044A2, 19108: 0x0000536D, 19109: 0x00005374, 19110: 0x000286AB, 19111: 0x0000537E, 19112: 0x0000537F, 19113: 0x00021596, 19114: 0x00021613, 19115: 0x000077E6, 19116: 0x00005393, 19117: 0x00028A9B, 19118: 0x000053A0, 19119: 0x000053AB, 19120: 0x000053AE, 19121: 0x000073A7, 19122: 0x00025772, 19123: 0x00003F59, 19124: 0x0000739C, 19125: 0x000053C1, 19126: 0x000053C5, 19127: 0x00006C49, 19128: 0x00004E49, 19129: 0x000057FE, 19130: 0x000053D9, 19131: 0x00003AAB, 19132: 0x00020B8F, 19133: 0x000053E0, 19134: 0x00023FEB, 19135: 0x00022DA3, 19136: 0x000053F6, 19137: 0x00020C77, 19138: 0x00005413, 19139: 0x00007079, 19140: 0x0000552B, 19141: 0x00006657, 19142: 0x00006D5B, 19143: 0x0000546D, 19144: 0x00026B53, 19145: 0x00020D74, 19146: 0x0000555D, 19147: 0x0000548F, 19148: 0x000054A4, 19149: 0x000047A6, 19150: 0x0002170D, 19151: 0x00020EDD, 19152: 0x00003DB4, 19153: 0x00020D4D, 19154: 0x000289BC, 19155: 0x00022698, 19156: 0x00005547, 19157: 0x00004CED, 19158: 0x0000542F, 19159: 0x00007417, 19160: 0x00005586, 19161: 0x000055A9, 19162: 0x00005605, 19163: 0x000218D7, 19164: 0x0002403A, 19165: 0x00004552, 19166: 0x00024435, 19167: 0x000066B3, 19168: 0x000210B4, 19169: 0x00005637, 19170: 0x000066CD, 19171: 0x0002328A, 19172: 0x000066A4, 19173: 0x000066AD, 19174: 0x0000564D, 19175: 0x0000564F, 19176: 0x000078F1, 19177: 0x000056F1, 19178: 0x00009787, 19179: 0x000053FE, 19180: 0x00005700, 19181: 0x000056EF, 19182: 0x000056ED, 19183: 0x00028B66, 19184: 0x00003623, 19185: 0x0002124F, 19186: 0x00005746, 19187: 0x000241A5, 19188: 0x00006C6E, 19189: 0x0000708B, 19190: 0x00005742, 19191: 0x000036B1, 19192: 0x00026C7E, 19193: 0x000057E6, 19194: 0x00021416, 19195: 0x00005803, 19196: 0x00021454, 19197: 0x00024363, 19198: 0x00005826, 19199: 0x00024BF5, 19200: 0x0000585C, 19201: 0x000058AA, 19202: 0x00003561, 19203: 0x000058E0, 19204: 0x000058DC, 19205: 0x0002123C, 19206: 0x000058FB, 19207: 0x00005BFF, 19208: 0x00005743, 19209: 0x0002A150, 19210: 0x00024278, 19211: 0x000093D3, 19212: 0x000035A1, 19213: 0x0000591F, 19214: 0x000068A6, 19215: 0x000036C3, 19216: 0x00006E59, 19217: 0x0002163E, 19218: 0x00005A24, 19219: 0x00005553, 19220: 0x00021692, 19221: 0x00008505, 19222: 0x000059C9, 19223: 0x00020D4E, 19224: 0x00026C81, 19225: 0x00026D2A, 19226: 0x000217DC, 19227: 0x000059D9, 19228: 0x000217FB, 19229: 0x000217B2, 19230: 0x00026DA6, 19231: 0x00006D71, 19232: 0x00021828, 19233: 0x000216D5, 19234: 0x000059F9, 19235: 0x00026E45, 19236: 0x00005AAB, 19237: 0x00005A63, 19238: 0x000036E6, 19239: 0x000249A9, 19240: 0x00005A77, 19241: 0x00003708, 19242: 0x00005A96, 19243: 0x00007465, 19244: 0x00005AD3, 19245: 0x00026FA1, 19246: 0x00022554, 19247: 0x00003D85, 19248: 0x00021911, 19249: 0x00003732, 19250: 0x000216B8, 19251: 0x00005E83, 19252: 0x000052D0, 19253: 0x00005B76, 19254: 0x00006588, 19255: 0x00005B7C, 19256: 0x00027A0E, 19257: 0x00004004, 19258: 0x0000485D, 19259: 0x00020204, 19260: 0x00005BD5, 19261: 0x00006160, 19262: 0x00021A34, 19263: 0x000259CC, 19264: 0x000205A5, 19265: 0x00005BF3, 19266: 0x00005B9D, 19267: 0x00004D10, 19268: 0x00005C05, 19269: 0x00021B44, 19270: 0x00005C13, 19271: 0x000073CE, 19272: 0x00005C14, 19273: 0x00021CA5, 19274: 0x00026B28, 19275: 0x00005C49, 19276: 0x000048DD, 19277: 0x00005C85, 19278: 0x00005CE9, 19279: 0x00005CEF, 19280: 0x00005D8B, 19281: 0x00021DF9, 19282: 0x00021E37, 19283: 0x00005D10, 19284: 0x00005D18, 19285: 0x00005D46, 19286: 0x00021EA4, 19287: 0x00005CBA, 19288: 0x00005DD7, 19289: 0x000082FC, 19290: 0x0000382D, 19291: 0x00024901, 19292: 0x00022049, 19293: 0x00022173, 19294: 0x00008287, 19295: 0x00003836, 19296: 0x00003BC2, 19297: 0x00005E2E, 19298: 0x00006A8A, 19299: 0x00005E75, 19300: 0x00005E7A, 19301: 0x000244BC, 19302: 0x00020CD3, 19303: 0x000053A6, 19304: 0x00004EB7, 19305: 0x00005ED0, 19306: 0x000053A8, 19307: 0x00021771, 19308: 0x00005E09, 19309: 0x00005EF4, 19310: 0x00028482, 19311: 0x00005EF9, 19312: 0x00005EFB, 19313: 0x000038A0, 19314: 0x00005EFC, 19315: 0x0000683E, 19316: 0x0000941B, 19317: 0x00005F0D, 19318: 0x000201C1, 19319: 0x0002F894, 19320: 0x00003ADE, 19321: 0x000048AE, 19322: 0x0002133A, 19323: 0x00005F3A, 19324: 0x00026888, 19325: 0x000223D0, 19326: 0x00005F58, 19327: 0x00022471, 19328: 0x00005F63, 19329: 0x000097BD, 19330: 0x00026E6E, 19331: 0x00005F72, 19332: 0x00009340, 19333: 0x00028A36, 19334: 0x00005FA7, 19335: 0x00005DB6, 19336: 0x00003D5F, 19337: 0x00025250, 19338: 0x00021F6A, 19339: 0x000270F8, 19340: 0x00022668, 19341: 0x000091D6, 19342: 0x0002029E, 19343: 0x00028A29, 19344: 0x00006031, 19345: 0x00006685, 19346: 0x00021877, 19347: 0x00003963, 19348: 0x00003DC7, 19349: 0x00003639, 19350: 0x00005790, 19351: 0x000227B4, 19352: 0x00007971, 19353: 0x00003E40, 19354: 0x0000609E, 19355: 0x000060A4, 19356: 0x000060B3, 19357: 0x00024982, 19358: 0x0002498F, 19359: 0x00027A53, 19360: 0x000074A4, 19361: 0x000050E1, 19362: 0x00005AA0, 19363: 0x00006164, 19364: 0x00008424, 19365: 0x00006142, 19366: 0x0002F8A6, 19367: 0x00026ED2, 19368: 0x00006181, 19369: 0x000051F4, 19370: 0x00020656, 19371: 0x00006187, 19372: 0x00005BAA, 19373: 0x00023FB7, 19374: 0x0002285F, 19375: 0x000061D3, 19376: 0x00028B9D, 19377: 0x0002995D, 19378: 0x000061D0, 19379: 0x00003932, 19380: 0x00022980, 19381: 0x000228C1, 19382: 0x00006023, 19383: 0x0000615C, 19384: 0x0000651E, 19385: 0x0000638B, 19386: 0x00020118, 19387: 0x000062C5, 19388: 0x00021770, 19389: 0x000062D5, 19390: 0x00022E0D, 19391: 0x0000636C, 19392: 0x000249DF, 19393: 0x00003A17, 19394: 0x00006438, 19395: 0x000063F8, 19396: 0x0002138E, 19397: 0x000217FC, 19398: 0x00006490, 19399: 0x00006F8A, 19400: 0x00022E36, 19401: 0x00009814, 19402: 0x0002408C, 19403: 0x0002571D, 19404: 0x000064E1, 19405: 0x000064E5, 19406: 0x0000947B, 19407: 0x00003A66, 19408: 0x0000643A, 19409: 0x00003A57, 19410: 0x0000654D, 19411: 0x00006F16, 19412: 0x00024A28, 19413: 0x00024A23, 19414: 0x00006585, 19415: 0x0000656D, 19416: 0x0000655F, 19417: 0x0002307E, 19418: 0x000065B5, 19419: 0x00024940, 19420: 0x00004B37, 19421: 0x000065D1, 19422: 0x000040D8, 19423: 0x00021829, 19424: 0x000065E0, 19425: 0x000065E3, 19426: 0x00005FDF, 19427: 0x00023400, 19428: 0x00006618, 19429: 0x000231F7, 19430: 0x000231F8, 19431: 0x00006644, 19432: 0x000231A4, 19433: 0x000231A5, 19434: 0x0000664B, 19435: 0x00020E75, 19436: 0x00006667, 19437: 0x000251E6, 19438: 0x00006673, 19439: 0x00006674, 19440: 0x00021E3D, 19441: 0x00023231, 19442: 0x000285F4, 19443: 0x000231C8, 19444: 0x00025313, 19445: 0x000077C5, 19446: 0x000228F7, 19447: 0x000099A4, 19448: 0x00006702, 19449: 0x0002439C, 19450: 0x00024A21, 19451: 0x00003B2B, 19452: 0x000069FA, 19453: 0x000237C2, 19454: 0x0000675E, 19455: 0x00006767, 19456: 0x00006762, 19457: 0x000241CD, 19458: 0x000290ED, 19459: 0x000067D7, 19460: 0x000044E9, 19461: 0x00006822, 19462: 0x00006E50, 19463: 0x0000923C, 19464: 0x00006801, 19465: 0x000233E6, 19466: 0x00026DA0, 19467: 0x0000685D, 19468: 0x0002346F, 19469: 0x000069E1, 19470: 0x00006A0B, 19471: 0x00028ADF, 19472: 0x00006973, 19473: 0x000068C3, 19474: 0x000235CD, 19475: 0x00006901, 19476: 0x00006900, 19477: 0x00003D32, 19478: 0x00003A01, 19479: 0x0002363C, 19480: 0x00003B80, 19481: 0x000067AC, 19482: 0x00006961, 19483: 0x00028A4A, 19484: 0x000042FC, 19485: 0x00006936, 19486: 0x00006998, 19487: 0x00003BA1, 19488: 0x000203C9, 19489: 0x00008363, 19490: 0x00005090, 19491: 0x000069F9, 19492: 0x00023659, 19493: 0x0002212A, 19494: 0x00006A45, 19495: 0x00023703, 19496: 0x00006A9D, 19497: 0x00003BF3, 19498: 0x000067B1, 19499: 0x00006AC8, 19500: 0x0002919C, 19501: 0x00003C0D, 19502: 0x00006B1D, 19503: 0x00020923, 19504: 0x000060DE, 19505: 0x00006B35, 19506: 0x00006B74, 19507: 0x000227CD, 19508: 0x00006EB5, 19509: 0x00023ADB, 19510: 0x000203B5, 19511: 0x00021958, 19512: 0x00003740, 19513: 0x00005421, 19514: 0x00023B5A, 19515: 0x00006BE1, 19516: 0x00023EFC, 19517: 0x00006BDC, 19518: 0x00006C37, 19519: 0x0002248B, 19520: 0x000248F1, 19521: 0x00026B51, 19522: 0x00006C5A, 19523: 0x00008226, 19524: 0x00006C79, 19525: 0x00023DBC, 19526: 0x000044C5, 19527: 0x00023DBD, 19528: 0x000241A4, 19529: 0x0002490C, 19530: 0x00024900, 19531: 0x00023CC9, 19532: 0x000036E5, 19533: 0x00003CEB, 19534: 0x00020D32, 19535: 0x00009B83, 19536: 0x000231F9, 19537: 0x00022491, 19538: 0x00007F8F, 19539: 0x00006837, 19540: 0x00026D25, 19541: 0x00026DA1, 19542: 0x00026DEB, 19543: 0x00006D96, 19544: 0x00006D5C, 19545: 0x00006E7C, 19546: 0x00006F04, 19547: 0x0002497F, 19548: 0x00024085, 19549: 0x00026E72, 19550: 0x00008533, 19551: 0x00026F74, 19552: 0x000051C7, 19553: 0x00006C9C, 19554: 0x00006E1D, 19555: 0x0000842E, 19556: 0x00028B21, 19557: 0x00006E2F, 19558: 0x00023E2F, 19559: 0x00007453, 19560: 0x00023F82, 19561: 0x000079CC, 19562: 0x00006E4F, 19563: 0x00005A91, 19564: 0x0002304B, 19565: 0x00006FF8, 19566: 0x0000370D, 19567: 0x00006F9D, 19568: 0x00023E30, 19569: 0x00006EFA, 19570: 0x00021497, 19571: 0x0002403D, 19572: 0x00004555, 19573: 0x000093F0, 19574: 0x00006F44, 19575: 0x00006F5C, 19576: 0x00003D4E, 19577: 0x00006F74, 19578: 0x00029170, 19579: 0x00003D3B, 19580: 0x00006F9F, 19581: 0x00024144, 19582: 0x00006FD3, 19583: 0x00024091, 19584: 0x00024155, 19585: 0x00024039, 19586: 0x00023FF0, 19587: 0x00023FB4, 19588: 0x0002413F, 19589: 0x000051DF, 19590: 0x00024156, 19591: 0x00024157, 19592: 0x00024140, 19593: 0x000261DD, 19594: 0x0000704B, 19595: 0x0000707E, 19596: 0x000070A7, 19597: 0x00007081, 19598: 0x000070CC, 19599: 0x000070D5, 19600: 0x000070D6, 19601: 0x000070DF, 19602: 0x00004104, 19603: 0x00003DE8, 19604: 0x000071B4, 19605: 0x00007196, 19606: 0x00024277, 19607: 0x0000712B, 19608: 0x00007145, 19609: 0x00005A88, 19610: 0x0000714A, 19611: 0x0000716E, 19612: 0x00005C9C, 19613: 0x00024365, 19614: 0x0000714F, 19615: 0x00009362, 19616: 0x000242C1, 19617: 0x0000712C, 19618: 0x0002445A, 19619: 0x00024A27, 19620: 0x00024A22, 19621: 0x000071BA, 19622: 0x00028BE8, 19623: 0x000070BD, 19624: 0x0000720E, 19625: 0x00009442, 19626: 0x00007215, 19627: 0x00005911, 19628: 0x00009443, 19629: 0x00007224, 19630: 0x00009341, 19631: 0x00025605, 19632: 0x0000722E, 19633: 0x00007240, 19634: 0x00024974, 19635: 0x000068BD, 19636: 0x00007255, 19637: 0x00007257, 19638: 0x00003E55, 19639: 0x00023044, 19640: 0x0000680D, 19641: 0x00006F3D, 19642: 0x00007282, 19643: 0x0000732A, 19644: 0x0000732B, 19645: 0x00024823, 19646: 0x0002882B, 19647: 0x000048ED, 19648: 0x00028804, 19649: 0x00007328, 19650: 0x0000732E, 19651: 0x000073CF, 19652: 0x000073AA, 19653: 0x00020C3A, 19654: 0x00026A2E, 19655: 0x000073C9, 19656: 0x00007449, 19657: 0x000241E2, 19658: 0x000216E7, 19659: 0x00024A24, 19660: 0x00006623, 19661: 0x000036C5, 19662: 0x000249B7, 19663: 0x0002498D, 19664: 0x000249FB, 19665: 0x000073F7, 19666: 0x00007415, 19667: 0x00006903, 19668: 0x00024A26, 19669: 0x00007439, 19670: 0x000205C3, 19671: 0x00003ED7, 19672: 0x0000745C, 19673: 0x000228AD, 19674: 0x00007460, 19675: 0x00028EB2, 19676: 0x00007447, 19677: 0x000073E4, 19678: 0x00007476, 19679: 0x000083B9, 19680: 0x0000746C, 19681: 0x00003730, 19682: 0x00007474, 19683: 0x000093F1, 19684: 0x00006A2C, 19685: 0x00007482, 19686: 0x00004953, 19687: 0x00024A8C, 19688: 0x0002415F, 19689: 0x00024A79, 19690: 0x00028B8F, 19691: 0x00005B46, 19692: 0x00028C03, 19693: 0x0002189E, 19694: 0x000074C8, 19695: 0x00021988, 19696: 0x0000750E, 19697: 0x000074E9, 19698: 0x0000751E, 19699: 0x00028ED9, 19700: 0x00021A4B, 19701: 0x00005BD7, 19702: 0x00028EAC, 19703: 0x00009385, 19704: 0x0000754D, 19705: 0x0000754A, 19706: 0x00007567, 19707: 0x0000756E, 19708: 0x00024F82, 19709: 0x00003F04, 19710: 0x00024D13, 19711: 0x0000758E, 19712: 0x0000745D, 19713: 0x0000759E, 19714: 0x000075B4, 19715: 0x00007602, 19716: 0x0000762C, 19717: 0x00007651, 19718: 0x0000764F, 19719: 0x0000766F, 19720: 0x00007676, 19721: 0x000263F5, 19722: 0x00007690, 19723: 0x000081EF, 19724: 0x000037F8, 19725: 0x00026911, 19726: 0x0002690E, 19727: 0x000076A1, 19728: 0x000076A5, 19729: 0x000076B7, 19730: 0x000076CC, 19731: 0x00026F9F, 19732: 0x00008462, 19733: 0x0002509D, 19734: 0x0002517D, 19735: 0x00021E1C, 19736: 0x0000771E, 19737: 0x00007726, 19738: 0x00007740, 19739: 0x000064AF, 19740: 0x00025220, 19741: 0x00007758, 19742: 0x000232AC, 19743: 0x000077AF, 19744: 0x00028964, 19745: 0x00028968, 19746: 0x000216C1, 19747: 0x000077F4, 19748: 0x00007809, 19749: 0x00021376, 19750: 0x00024A12, 19751: 0x000068CA, 19752: 0x000078AF, 19753: 0x000078C7, 19754: 0x000078D3, 19755: 0x000096A5, 19756: 0x0000792E, 19757: 0x000255E0, 19758: 0x000078D7, 19759: 0x00007934, 19760: 0x000078B1, 19761: 0x0002760C, 19762: 0x00008FB8, 19763: 0x00008884, 19764: 0x00028B2B, 19765: 0x00026083, 19766: 0x0002261C, 19767: 0x00007986, 19768: 0x00008900, 19769: 0x00006902, 19770: 0x00007980, 19771: 0x00025857, 19772: 0x0000799D, 19773: 0x00027B39, 19774: 0x0000793C, 19775: 0x000079A9, 19776: 0x00006E2A, 19777: 0x00027126, 19778: 0x00003EA8, 19779: 0x000079C6, 19780: 0x0002910D, 19781: 0x000079D4, } const numEncodeTables = 8 // encodeX are the encoding tables from Unicode to Big5 code, // sorted by decreasing length. // encode0: 42633 entries for runes in [131105, 173738). // encode1: 29004 entries for runes in [ 11904, 40908). // encode2: 2176 entries for runes in [ 7870, 10046). // encode3: 939 entries for runes in [ 167, 1106). // encode4: 446 entries for runes in [ 65072, 65518). // encode5: 432 entries for runes in [194597, 195029). // encode6: 263 entries for runes in [ 63751, 64014). // encode7: 1 entries for runes in [175615, 175616). const encode0Low, encode0High = 131105, 173738 var encode0 = [...]uint16{ 131105 - 131105: 0x9C71, 131134 - 131105: 0x9375, 131142 - 131105: 0x9376, 131150 - 131105: 0x9548, 131176 - 131105: 0x8EC6, 131206 - 131105: 0x8BC5, 131207 - 131105: 0x8BFA, 131210 - 131105: 0xC87C, 131220 - 131105: 0x9AB4, 131274 - 131105: 0x884E, 131275 - 131105: 0x884B, 131276 - 131105: 0xC87A, 131277 - 131105: 0x8848, 131281 - 131105: 0x8847, 131310 - 131105: 0xA0F6, 131340 - 131105: 0x8845, 131342 - 131105: 0x8853, 131352 - 131105: 0xFCAD, 131492 - 131105: 0x8CF5, 131497 - 131105: 0x8AAD, 131499 - 131105: 0x9272, 131521 - 131105: 0xFC47, 131540 - 131105: 0x94DF, 131570 - 131105: 0x9FD1, 131588 - 131105: 0xFBCB, 131596 - 131105: 0x927D, 131604 - 131105: 0x98A4, 131641 - 131105: 0x8CF9, 131675 - 131105: 0x94E7, 131700 - 131105: 0x90CB, 131701 - 131105: 0x927B, 131737 - 131105: 0x94D8, 131742 - 131105: 0xFC5F, 131744 - 131105: 0xFA54, 131767 - 131105: 0x9AB5, 131775 - 131105: 0x96DA, 131776 - 131105: 0x9279, 131813 - 131105: 0xFA74, 131850 - 131105: 0x9275, 131877 - 131105: 0x8DFB, 131905 - 131105: 0x8A49, 131909 - 131105: 0x92DF, 131910 - 131105: 0x9B7C, 131911 - 131105: 0xFA63, 131966 - 131105: 0xFA60, 131967 - 131105: 0x926D, 131968 - 131105: 0xFA62, 132000 - 131105: 0x9AB6, 132007 - 131105: 0x976B, 132021 - 131105: 0xFD6A, 132041 - 131105: 0xFD54, 132043 - 131105: 0x9273, 132085 - 131105: 0x97D8, 132092 - 131105: 0x9FBB, 132115 - 131105: 0x9342, 132116 - 131105: 0x9276, 132127 - 131105: 0xFA65, 132197 - 131105: 0x926C, 132231 - 131105: 0xFA6E, 132238 - 131105: 0x9EE0, 132241 - 131105: 0x92C0, 132242 - 131105: 0x92BF, 132259 - 131105: 0x92BE, 132311 - 131105: 0x9ABA, 132348 - 131105: 0x8AB3, 132350 - 131105: 0x9775, 132423 - 131105: 0xFA40, 132494 - 131105: 0xFA76, 132517 - 131105: 0xFBD0, 132531 - 131105: 0xFA7B, 132547 - 131105: 0xFE6D, 132554 - 131105: 0x9BB3, 132560 - 131105: 0x89CC, 132565 - 131105: 0x9ABE, 132575 - 131105: 0xFA42, 132576 - 131105: 0x92BC, 132587 - 131105: 0x945C, 132625 - 131105: 0x9BB5, 132629 - 131105: 0x9ABF, 132633 - 131105: 0x98A7, 132634 - 131105: 0x97A4, 132656 - 131105: 0x90FD, 132694 - 131105: 0xFC7B, 132726 - 131105: 0x9AC0, 132878 - 131105: 0x92C3, 132913 - 131105: 0x8AAA, 132985 - 131105: 0x9BD0, 133164 - 131105: 0x9550, 133235 - 131105: 0x92C6, 133333 - 131105: 0x98A6, 133398 - 131105: 0x9546, 133411 - 131105: 0xFD63, 133460 - 131105: 0xFAC2, 133497 - 131105: 0x9EC3, 133607 - 131105: 0x89B2, 133649 - 131105: 0x9C66, 133712 - 131105: 0x9053, 133743 - 131105: 0x8C62, 133770 - 131105: 0x87A8, 133812 - 131105: 0x97C1, 133826 - 131105: 0x9AC4, 133837 - 131105: 0x9AC5, 133901 - 131105: 0x8EEF, 134031 - 131105: 0xFAE9, 134047 - 131105: 0x8D40, 134056 - 131105: 0x9262, 134057 - 131105: 0x8AF7, 134079 - 131105: 0x9AC6, 134086 - 131105: 0x92E1, 134091 - 131105: 0x9AC9, 134114 - 131105: 0xFAC6, 134123 - 131105: 0x97A5, 134139 - 131105: 0x9ACB, 134143 - 131105: 0xFA72, 134155 - 131105: 0x8A5E, 134157 - 131105: 0x94E0, 134176 - 131105: 0x92CC, 134196 - 131105: 0x8AE5, 134202 - 131105: 0xFE5C, 134203 - 131105: 0x9ACC, 134209 - 131105: 0x9DF9, 134210 - 131105: 0x8A43, 134211 - 131105: 0x8AA6, 134227 - 131105: 0x9ACD, 134245 - 131105: 0x9ACE, 134263 - 131105: 0xFAEE, 134264 - 131105: 0x9BCC, 134268 - 131105: 0x9ACF, 134285 - 131105: 0x9AD1, 134294 - 131105: 0x9DFA, 134300 - 131105: 0x9D7C, 134325 - 131105: 0x9AD3, 134328 - 131105: 0x97A6, 134351 - 131105: 0x995F, 134355 - 131105: 0xFBF6, 134356 - 131105: 0x9FC5, 134357 - 131105: 0x8A59, 134358 - 131105: 0x8B6B, 134365 - 131105: 0x9AD4, 134381 - 131105: 0x9AD5, 134399 - 131105: 0x97A2, 134421 - 131105: 0x8A44, 134440 - 131105: 0x9F4A, 134449 - 131105: 0x90A1, 134450 - 131105: 0xFDA4, 134470 - 131105: 0x8A64, 134471 - 131105: 0x8AF2, 134472 - 131105: 0x8AF8, 134473 - 131105: 0x9DD8, 134476 - 131105: 0x94D6, 134477 - 131105: 0xFAFE, 134478 - 131105: 0xFBA7, 134511 - 131105: 0x9AD6, 134513 - 131105: 0x9F4D, 134516 - 131105: 0xFAF6, 134524 - 131105: 0x8A57, 134526 - 131105: 0x8B43, 134527 - 131105: 0x8B44, 134550 - 131105: 0x8AB6, 134556 - 131105: 0x8AC0, 134567 - 131105: 0x9E54, 134578 - 131105: 0x9AD7, 134600 - 131105: 0x9AD8, 134660 - 131105: 0x9ADC, 134665 - 131105: 0x8ACA, 134666 - 131105: 0x9EA8, 134669 - 131105: 0x9263, 134670 - 131105: 0x9ADD, 134671 - 131105: 0x8B65, 134672 - 131105: 0x8B6F, 134673 - 131105: 0x8B7E, 134678 - 131105: 0x8F43, 134685 - 131105: 0x92D0, 134732 - 131105: 0x8AF4, 134765 - 131105: 0x9DBE, 134771 - 131105: 0x9AE1, 134773 - 131105: 0xFCDE, 134774 - 131105: 0x9DFD, 134775 - 131105: 0x8B66, 134776 - 131105: 0x8B70, 134777 - 131105: 0x8B75, 134778 - 131105: 0x8AE4, 134779 - 131105: 0x8BA4, 134796 - 131105: 0x8AED, 134806 - 131105: 0x8A5D, 134808 - 131105: 0x8B48, 134813 - 131105: 0x9DED, 134818 - 131105: 0x9E40, 134826 - 131105: 0x8AEF, 134827 - 131105: 0x8AF6, 134828 - 131105: 0x9E76, 134838 - 131105: 0x9EE3, 134871 - 131105: 0x9ADE, 134872 - 131105: 0x8DFE, 134877 - 131105: 0xFAFC, 134904 - 131105: 0x9CB1, 134905 - 131105: 0x9E77, 134906 - 131105: 0x8B64, 134907 - 131105: 0x8B67, 134941 - 131105: 0x974B, 134950 - 131105: 0x9653, 134957 - 131105: 0x9AE0, 134958 - 131105: 0x8B4A, 134960 - 131105: 0x8AF1, 134961 - 131105: 0x8AD7, 134971 - 131105: 0xA0AB, 134988 - 131105: 0x8AB5, 135012 - 131105: 0x8A5F, 135053 - 131105: 0x8AEE, 135056 - 131105: 0x9ADF, 135085 - 131105: 0x8AFE, 135092 - 131105: 0x8A58, 135093 - 131105: 0x8BA3, 135094 - 131105: 0x8BA7, 135100 - 131105: 0x9AE3, 135135 - 131105: 0x9261, 135146 - 131105: 0x9DD7, 135147 - 131105: 0x9E7D, 135148 - 131105: 0x9EA7, 135149 - 131105: 0x9EAB, 135188 - 131105: 0x9042, 135197 - 131105: 0x8B79, 135198 - 131105: 0x8B7A, 135247 - 131105: 0x9AE6, 135260 - 131105: 0x9AE5, 135279 - 131105: 0x8A7E, 135285 - 131105: 0x9E44, 135286 - 131105: 0x9AE7, 135287 - 131105: 0x8A7C, 135288 - 131105: 0x8B71, 135291 - 131105: 0x9AE9, 135304 - 131105: 0x9AEA, 135318 - 131105: 0x9AEB, 135325 - 131105: 0x8ABD, 135348 - 131105: 0xFB4E, 135359 - 131105: 0x9AED, 135360 - 131105: 0x8AF9, 135361 - 131105: 0x9E63, 135367 - 131105: 0x8B49, 135368 - 131105: 0x8ACE, 135369 - 131105: 0x8B6E, 135375 - 131105: 0x8AE8, 135379 - 131105: 0x9AEE, 135396 - 131105: 0x92CE, 135412 - 131105: 0x8A5A, 135413 - 131105: 0x8B7B, 135414 - 131105: 0x8B7C, 135471 - 131105: 0x9AEF, 135483 - 131105: 0x9AF0, 135485 - 131105: 0x8AFA, 135493 - 131105: 0x8941, 135496 - 131105: 0x8B72, 135503 - 131105: 0x8AF3, 135552 - 131105: 0x8BA8, 135559 - 131105: 0x9EAE, 135641 - 131105: 0x9E72, 135740 - 131105: 0xFB73, 135759 - 131105: 0xFB5F, 135804 - 131105: 0x90BA, 135848 - 131105: 0x91FE, 135849 - 131105: 0x9EF6, 135856 - 131105: 0x97ED, 135907 - 131105: 0x9AF3, 135934 - 131105: 0xA0EE, 135938 - 131105: 0x967C, 135939 - 131105: 0x9345, 135940 - 131105: 0x986E, 135941 - 131105: 0xFA56, 135990 - 131105: 0x9AF5, 135994 - 131105: 0xFC4B, 136053 - 131105: 0x9AF4, 136054 - 131105: 0xFEDE, 136078 - 131105: 0xFCB7, 136088 - 131105: 0x97F1, 136092 - 131105: 0x97C7, 136133 - 131105: 0x9CCB, 136134 - 131105: 0x9240, 136173 - 131105: 0x9CE8, 136190 - 131105: 0x91FD, 136211 - 131105: 0x974E, 136214 - 131105: 0xFB68, 136228 - 131105: 0x976C, 136255 - 131105: 0x8CC2, 136274 - 131105: 0x97E8, 136276 - 131105: 0xFB6A, 136277 - 131105: 0x8B74, 136330 - 131105: 0x8EE7, 136343 - 131105: 0xFDC8, 136374 - 131105: 0x9241, 136424 - 131105: 0x96A1, 136445 - 131105: 0x8EF3, 136567 - 131105: 0x9AF7, 136578 - 131105: 0x8FA6, 136598 - 131105: 0xFAD6, 136714 - 131105: 0x9CC7, 136723 - 131105: 0xFAD7, 136729 - 131105: 0x9AF8, 136766 - 131105: 0xFBA1, 136801 - 131105: 0x8EC5, 136850 - 131105: 0xFBA4, 136888 - 131105: 0xFBC2, 136890 - 131105: 0x9AC1, 136896 - 131105: 0x91FA, 136897 - 131105: 0xFEDB, 136898 - 131105: 0x97AB, 136915 - 131105: 0x9147, 136917 - 131105: 0xFBB1, 136927 - 131105: 0x8FEA, 136934 - 131105: 0x94D2, 136935 - 131105: 0xFE61, 136936 - 131105: 0xFACE, 136954 - 131105: 0x92ED, 136955 - 131105: 0x91F3, 136956 - 131105: 0x93C6, 136958 - 131105: 0x935A, 136973 - 131105: 0xFAFB, 136976 - 131105: 0x92EF, 136998 - 131105: 0xFAC8, 137018 - 131105: 0x9847, 137019 - 131105: 0x9366, 137020 - 131105: 0x9855, 137047 - 131105: 0x96E6, 137068 - 131105: 0x9F43, 137069 - 131105: 0x9FAA, 137070 - 131105: 0x94DA, 137071 - 131105: 0x92EE, 137072 - 131105: 0xFCAF, 137073 - 131105: 0xFBFB, 137075 - 131105: 0x8EF9, 137076 - 131105: 0x91F6, 137131 - 131105: 0x9364, 137136 - 131105: 0x94F5, 137137 - 131105: 0x9CB6, 137138 - 131105: 0xFBAD, 137139 - 131105: 0x984E, 137140 - 131105: 0x8F44, 137141 - 131105: 0x96FD, 137155 - 131105: 0x9AF9, 137159 - 131105: 0x9AFA, 137177 - 131105: 0x9769, 137178 - 131105: 0x95D4, 137179 - 131105: 0x984B, 137180 - 131105: 0xFBAA, 137183 - 131105: 0x987C, 137199 - 131105: 0x91EA, 137205 - 131105: 0x9DAF, 137206 - 131105: 0x9DC5, 137208 - 131105: 0x91F1, 137209 - 131105: 0x8EB1, 137210 - 131105: 0x97A9, 137211 - 131105: 0xFBAC, 137212 - 131105: 0xFCB8, 137248 - 131105: 0x9CB9, 137256 - 131105: 0xFBB0, 137257 - 131105: 0xFCD2, 137258 - 131105: 0x93CB, 137261 - 131105: 0x9AFD, 137273 - 131105: 0x91F4, 137274 - 131105: 0x8BAC, 137275 - 131105: 0xA055, 137280 - 131105: 0x9574, 137285 - 131105: 0x95BE, 137298 - 131105: 0x97AD, 137310 - 131105: 0x8EE9, 137313 - 131105: 0x92F8, 137314 - 131105: 0x97BE, 137315 - 131105: 0x916C, 137316 - 131105: 0x94AA, 137335 - 131105: 0xFC63, 137339 - 131105: 0x9DC6, 137347 - 131105: 0x97B5, 137348 - 131105: 0x92B8, 137349 - 131105: 0x91EF, 137374 - 131105: 0xFEA6, 137375 - 131105: 0x9760, 137376 - 131105: 0x9358, 137377 - 131105: 0x9576, 137378 - 131105: 0x8FAC, 137406 - 131105: 0x91EC, 137407 - 131105: 0x97B4, 137425 - 131105: 0x91F7, 137430 - 131105: 0x974A, 137431 - 131105: 0xFB49, 137432 - 131105: 0x9578, 137433 - 131105: 0x93BC, 137466 - 131105: 0x91D6, 137475 - 131105: 0x9355, 137476 - 131105: 0x9356, 137477 - 131105: 0x9851, 137488 - 131105: 0x8FF8, 137489 - 131105: 0xFBC0, 137490 - 131105: 0x93F2, 137493 - 131105: 0x90D0, 137500 - 131105: 0x9C44, 137506 - 131105: 0x9255, 137511 - 131105: 0x9363, 137531 - 131105: 0x91A5, 137540 - 131105: 0xA0ED, 137560 - 131105: 0xFD6B, 137578 - 131105: 0x9AFE, 137596 - 131105: 0x9351, 137600 - 131105: 0x8C57, 137603 - 131105: 0xFA78, 137608 - 131105: 0xFEA8, 137622 - 131105: 0x9350, 137691 - 131105: 0xFA4C, 137715 - 131105: 0x92F7, 137773 - 131105: 0x9B40, 137780 - 131105: 0xFBCE, 137797 - 131105: 0x9B41, 137803 - 131105: 0xFEAD, 137827 - 131105: 0x8761, 138052 - 131105: 0xFBD5, 138177 - 131105: 0x8BC2, 138178 - 131105: 0x9A7C, 138282 - 131105: 0x9B42, 138352 - 131105: 0x9B43, 138402 - 131105: 0x9E79, 138405 - 131105: 0xFBD9, 138412 - 131105: 0x9B44, 138566 - 131105: 0xA0A7, 138579 - 131105: 0x877B, 138590 - 131105: 0x876E, 138640 - 131105: 0x9BF3, 138678 - 131105: 0x8C79, 138682 - 131105: 0x935E, 138698 - 131105: 0x89CB, 138705 - 131105: 0x9F53, 138731 - 131105: 0x93D7, 138745 - 131105: 0xFBE1, 138780 - 131105: 0xFED0, 138787 - 131105: 0x8CF1, 138807 - 131105: 0xFBE2, 138813 - 131105: 0xFCE3, 138889 - 131105: 0x9074, 138916 - 131105: 0xFBE6, 138920 - 131105: 0x9BB7, 138952 - 131105: 0x9B45, 138965 - 131105: 0x9B47, 139023 - 131105: 0x9F50, 139029 - 131105: 0x9B48, 139114 - 131105: 0xFC5B, 139166 - 131105: 0x98A9, 139169 - 131105: 0x9CFD, 139240 - 131105: 0x884C, 139333 - 131105: 0x9B4B, 139337 - 131105: 0xFBEC, 139390 - 131105: 0x8C69, 139418 - 131105: 0x9BA8, 139463 - 131105: 0x8AD5, 139516 - 131105: 0xFA73, 139562 - 131105: 0xFD59, 139611 - 131105: 0x91A2, 139635 - 131105: 0xFBED, 139642 - 131105: 0x9CA9, 139681 - 131105: 0x8AA8, 139713 - 131105: 0x8D42, 139715 - 131105: 0x9BC3, 139784 - 131105: 0x8AE1, 139900 - 131105: 0x9B4E, 140065 - 131105: 0x95D0, 140069 - 131105: 0x905F, 140221 - 131105: 0x97EE, 140240 - 131105: 0xFC4E, 140247 - 131105: 0x9B4F, 140282 - 131105: 0x9B50, 140389 - 131105: 0x9EC6, 140401 - 131105: 0xFC50, 140427 - 131105: 0xFD73, 140433 - 131105: 0xFDA7, 140464 - 131105: 0x9DA2, 140476 - 131105: 0x87D1, 140481 - 131105: 0x87D3, 140489 - 131105: 0x87D4, 140492 - 131105: 0x87D5, 140525 - 131105: 0xFA58, 140563 - 131105: 0xFA5E, 140571 - 131105: 0xA059, 140592 - 131105: 0xFA75, 140628 - 131105: 0xFBBE, 140685 - 131105: 0x9CA2, 140719 - 131105: 0x9370, 140734 - 131105: 0x9371, 140827 - 131105: 0x9377, 140828 - 131105: 0xFEEF, 140843 - 131105: 0x936D, 140904 - 131105: 0xFC5D, 140922 - 131105: 0x90B8, 140950 - 131105: 0x8AFC, 140952 - 131105: 0xFB41, 141044 - 131105: 0x9E6B, 141045 - 131105: 0x94E3, 141046 - 131105: 0x8EE2, 141074 - 131105: 0x8C7D, 141076 - 131105: 0x8ED7, 141083 - 131105: 0x9C4D, 141087 - 131105: 0x96A3, 141098 - 131105: 0x9B51, 141173 - 131105: 0x8AC3, 141185 - 131105: 0x96AA, 141206 - 131105: 0x8CE2, 141236 - 131105: 0xFC68, 141237 - 131105: 0x8B6D, 141261 - 131105: 0xFD67, 141315 - 131105: 0x8AE9, 141407 - 131105: 0xFCA1, 141408 - 131105: 0x936C, 141425 - 131105: 0x9B52, 141485 - 131105: 0xFE70, 141505 - 131105: 0xFCA8, 141559 - 131105: 0xFCE9, 141606 - 131105: 0x9CB4, 141625 - 131105: 0x8AEA, 141647 - 131105: 0x9B53, 141671 - 131105: 0x9B55, 141675 - 131105: 0x96AB, 141696 - 131105: 0xFCA7, 141715 - 131105: 0x9B56, 141926 - 131105: 0x8ABC, 142031 - 131105: 0x8ACB, 142037 - 131105: 0x9B57, 142054 - 131105: 0x89CD, 142056 - 131105: 0x9B59, 142094 - 131105: 0x9B5B, 142114 - 131105: 0x93A5, 142143 - 131105: 0x9B5D, 142147 - 131105: 0x9E4F, 142186 - 131105: 0x93A3, 142282 - 131105: 0x8A7B, 142286 - 131105: 0x8B42, 142374 - 131105: 0x9750, 142375 - 131105: 0x8FB3, 142392 - 131105: 0x8A50, 142412 - 131105: 0x9B60, 142417 - 131105: 0x8B45, 142421 - 131105: 0x8B46, 142434 - 131105: 0x9DFE, 142472 - 131105: 0x9B62, 142491 - 131105: 0x937B, 142497 - 131105: 0x93B1, 142505 - 131105: 0x8A60, 142514 - 131105: 0x8AD8, 142519 - 131105: 0x9B63, 142530 - 131105: 0x8A69, 142534 - 131105: 0x8A47, 142537 - 131105: 0x8ACC, 142599 - 131105: 0x937C, 142600 - 131105: 0x9B65, 142610 - 131105: 0x9B66, 142660 - 131105: 0x8A72, 142668 - 131105: 0x8A7A, 142695 - 131105: 0x93AF, 142733 - 131105: 0x8AB0, 142741 - 131105: 0x9B68, 142752 - 131105: 0x9EA3, 142755 - 131105: 0xFAEC, 142756 - 131105: 0x8B77, 142775 - 131105: 0x9B67, 142830 - 131105: 0x8B59, 142861 - 131105: 0xFCB1, 142902 - 131105: 0xFCBB, 142914 - 131105: 0x9B69, 142968 - 131105: 0x93A8, 142987 - 131105: 0x8AE0, 143027 - 131105: 0x9E51, 143087 - 131105: 0x8F5F, 143220 - 131105: 0x9B6A, 143308 - 131105: 0x9B6B, 143331 - 131105: 0x97EC, 143411 - 131105: 0x9B6C, 143428 - 131105: 0xFE4E, 143435 - 131105: 0xFDC2, 143462 - 131105: 0x9B6D, 143485 - 131105: 0x9167, 143486 - 131105: 0xFCCC, 143502 - 131105: 0x93B6, 143543 - 131105: 0x90E4, 143548 - 131105: 0x90E5, 143578 - 131105: 0x9EF2, 143619 - 131105: 0x93CA, 143677 - 131105: 0x8BBC, 143741 - 131105: 0x8F46, 143746 - 131105: 0x93CF, 143780 - 131105: 0xFCDB, 143781 - 131105: 0xFCDC, 143795 - 131105: 0x93C0, 143816 - 131105: 0xFCE6, 143817 - 131105: 0x96E7, 143850 - 131105: 0x87A7, 143863 - 131105: 0xFCD8, 143864 - 131105: 0xFCD9, 143865 - 131105: 0xFDA6, 143887 - 131105: 0x93CE, 143909 - 131105: 0x95F1, 143919 - 131105: 0x9CE9, 143921 - 131105: 0xFCE4, 143922 - 131105: 0x94AF, 143923 - 131105: 0xFA77, 143924 - 131105: 0x93CC, 143958 - 131105: 0x8CE1, 143966 - 131105: 0x87A9, 143970 - 131105: 0x905A, 144001 - 131105: 0x8C54, 144009 - 131105: 0x93BF, 144010 - 131105: 0xFB51, 144043 - 131105: 0x93B9, 144044 - 131105: 0xFED7, 144045 - 131105: 0x93B7, 144082 - 131105: 0x93D9, 144096 - 131105: 0x93BB, 144097 - 131105: 0x93DA, 144128 - 131105: 0x98A3, 144138 - 131105: 0x90D1, 144159 - 131105: 0x9B6E, 144308 - 131105: 0xFA70, 144332 - 131105: 0x9BEB, 144350 - 131105: 0x9B6F, 144358 - 131105: 0xFCFC, 144372 - 131105: 0x8B40, 144373 - 131105: 0xA07B, 144377 - 131105: 0x8CA1, 144378 - 131105: 0x97F7, 144382 - 131105: 0x93E2, 144384 - 131105: 0xFCD6, 144447 - 131105: 0x9559, 144464 - 131105: 0x93A6, 144495 - 131105: 0xFD40, 144498 - 131105: 0x935F, 144613 - 131105: 0x97F2, 144665 - 131105: 0x9C76, 144688 - 131105: 0x8EF8, 144721 - 131105: 0x8CEB, 144730 - 131105: 0x8F47, 144743 - 131105: 0x9B74, 144789 - 131105: 0x92B4, 144793 - 131105: 0x91ED, 144796 - 131105: 0x96D2, 144827 - 131105: 0x87D8, 144845 - 131105: 0xFD46, 144846 - 131105: 0x8F4F, 144847 - 131105: 0x9549, 144883 - 131105: 0x9B75, 144896 - 131105: 0xFA5C, 144919 - 131105: 0x8751, 144922 - 131105: 0x9B79, 144956 - 131105: 0xFD4B, 144960 - 131105: 0x96D3, 144985 - 131105: 0xFD58, 144991 - 131105: 0x945F, 145015 - 131105: 0xA0F5, 145038 - 131105: 0x87C7, 145054 - 131105: 0x877C, 145062 - 131105: 0x9243, 145069 - 131105: 0x97FA, 145082 - 131105: 0x9DD9, 145119 - 131105: 0x97F4, 145134 - 131105: 0x924D, 145155 - 131105: 0xFD5B, 145174 - 131105: 0x9B7A, 145184 - 131105: 0x9ED5, 145197 - 131105: 0xFAAE, 145199 - 131105: 0x9CC9, 145215 - 131105: 0x9258, 145254 - 131105: 0x8EC8, 145281 - 131105: 0x94B4, 145314 - 131105: 0x93E1, 145340 - 131105: 0x93DF, 145346 - 131105: 0xFCF0, 145365 - 131105: 0x93EC, 145366 - 131105: 0x97F6, 145367 - 131105: 0x96CF, 145466 - 131105: 0x93DE, 145858 - 131105: 0x8ACF, 146087 - 131105: 0x9BA2, 146139 - 131105: 0xFD69, 146158 - 131105: 0x9352, 146170 - 131105: 0x98A2, 146202 - 131105: 0x8CE7, 146266 - 131105: 0xFD6E, 146531 - 131105: 0x8CA4, 146585 - 131105: 0xFA7C, 146586 - 131105: 0x93FA, 146587 - 131105: 0x907C, 146613 - 131105: 0x8F67, 146615 - 131105: 0x9DB7, 146631 - 131105: 0xA0E9, 146632 - 131105: 0xFA4E, 146633 - 131105: 0xFDA1, 146684 - 131105: 0x9E74, 146685 - 131105: 0x9FBF, 146686 - 131105: 0x9ECB, 146687 - 131105: 0x9BB9, 146752 - 131105: 0x9DD4, 146779 - 131105: 0x97B9, 146814 - 131105: 0x8EF1, 146831 - 131105: 0x957B, 146870 - 131105: 0x9ED2, 146871 - 131105: 0x9753, 146872 - 131105: 0x96A4, 146873 - 131105: 0x8FBE, 146874 - 131105: 0x94D9, 146875 - 131105: 0x9058, 146876 - 131105: 0xFD79, 146877 - 131105: 0xFD7B, 146915 - 131105: 0x8EDA, 146936 - 131105: 0x8EFA, 146950 - 131105: 0x8762, 146961 - 131105: 0x9BA5, 146988 - 131105: 0x9ED9, 146989 - 131105: 0x97D4, 146990 - 131105: 0x90BB, 146991 - 131105: 0xFDBC, 146992 - 131105: 0xFDC6, 146993 - 131105: 0x9248, 147001 - 131105: 0x92B5, 147080 - 131105: 0x9DC1, 147081 - 131105: 0x92B9, 147082 - 131105: 0x92A6, 147083 - 131105: 0x8F4B, 147129 - 131105: 0x9BA6, 147135 - 131105: 0x92B6, 147159 - 131105: 0x8E40, 147191 - 131105: 0x9ED8, 147192 - 131105: 0x945E, 147193 - 131105: 0x985F, 147194 - 131105: 0x94CE, 147195 - 131105: 0x924A, 147196 - 131105: 0xFD70, 147253 - 131105: 0x9467, 147265 - 131105: 0x8DEC, 147274 - 131105: 0x9BD8, 147297 - 131105: 0x8763, 147327 - 131105: 0x9448, 147328 - 131105: 0xFAC1, 147329 - 131105: 0x9CF7, 147330 - 131105: 0xFDBE, 147343 - 131105: 0x8FDA, 147380 - 131105: 0xFDD9, 147383 - 131105: 0xFC7E, 147392 - 131105: 0x93F9, 147397 - 131105: 0xFA43, 147435 - 131105: 0xFAEB, 147436 - 131105: 0xFAC3, 147437 - 131105: 0x97D3, 147438 - 131105: 0x95F9, 147439 - 131105: 0x9C48, 147440 - 131105: 0xFDD8, 147473 - 131105: 0xA0D8, 147513 - 131105: 0xFDD7, 147514 - 131105: 0xFB4A, 147515 - 131105: 0x9BAF, 147516 - 131105: 0x944B, 147517 - 131105: 0xFDC9, 147543 - 131105: 0x8EAC, 147589 - 131105: 0xFDB2, 147595 - 131105: 0x925A, 147596 - 131105: 0xFCBD, 147597 - 131105: 0x92D9, 147601 - 131105: 0xFDD5, 147657 - 131105: 0x92DD, 147681 - 131105: 0x9259, 147692 - 131105: 0x8CF0, 147716 - 131105: 0x96BA, 147727 - 131105: 0x925B, 147737 - 131105: 0x9BAB, 147775 - 131105: 0xFDDA, 147776 - 131105: 0xFDDE, 147780 - 131105: 0xFDD3, 147790 - 131105: 0x8C46, 147797 - 131105: 0xFDD6, 147798 - 131105: 0xFDDC, 147799 - 131105: 0xFDDD, 147804 - 131105: 0x90FE, 147807 - 131105: 0xFEA1, 147809 - 131105: 0x87A5, 147831 - 131105: 0x8BAD, 147834 - 131105: 0x9CD8, 147875 - 131105: 0x9E6D, 147876 - 131105: 0xFD7C, 147877 - 131105: 0xFB61, 147884 - 131105: 0x96F8, 147893 - 131105: 0x96F0, 147917 - 131105: 0xFCF4, 147938 - 131105: 0xFE60, 147964 - 131105: 0x9852, 147995 - 131105: 0x964F, 148043 - 131105: 0x916E, 148054 - 131105: 0x986D, 148057 - 131105: 0x9864, 148086 - 131105: 0x9453, 148087 - 131105: 0xFDEC, 148088 - 131105: 0xFB78, 148100 - 131105: 0x95BA, 148115 - 131105: 0x985D, 148117 - 131105: 0x92F9, 148133 - 131105: 0x985A, 148159 - 131105: 0x8750, 148161 - 131105: 0xFDF6, 148169 - 131105: 0x93D0, 148170 - 131105: 0x9862, 148206 - 131105: 0x9BAD, 148218 - 131105: 0x974F, 148237 - 131105: 0x9BAE, 148250 - 131105: 0x9452, 148276 - 131105: 0x9BB0, 148296 - 131105: 0x91D2, 148322 - 131105: 0x97EA, 148323 - 131105: 0xFB6B, 148324 - 131105: 0x91B1, 148325 - 131105: 0xFDF3, 148364 - 131105: 0x92CB, 148374 - 131105: 0x9BB1, 148380 - 131105: 0xFCEC, 148413 - 131105: 0x986B, 148417 - 131105: 0x9751, 148457 - 131105: 0x9871, 148458 - 131105: 0x95EF, 148466 - 131105: 0x9EF3, 148472 - 131105: 0x91E8, 148484 - 131105: 0x9BBA, 148533 - 131105: 0xFB4C, 148534 - 131105: 0x926A, 148570 - 131105: 0xFDF8, 148571 - 131105: 0x9861, 148595 - 131105: 0x91E7, 148615 - 131105: 0x93ED, 148616 - 131105: 0x9744, 148665 - 131105: 0x91E1, 148668 - 131105: 0xFBF5, 148686 - 131105: 0x9869, 148691 - 131105: 0x8A62, 148694 - 131105: 0x9BBB, 148741 - 131105: 0x8CA8, 148769 - 131105: 0x9C55, 148856 - 131105: 0x8E77, 148936 - 131105: 0x8AB2, 149016 - 131105: 0x9EBC, 149034 - 131105: 0x93E6, 149093 - 131105: 0x93A2, 149108 - 131105: 0x9BBD, 149143 - 131105: 0x94B3, 149204 - 131105: 0x937D, 149254 - 131105: 0x9E66, 149285 - 131105: 0x9459, 149295 - 131105: 0x9BBF, 149391 - 131105: 0x9458, 149472 - 131105: 0x9EA5, 149522 - 131105: 0x9BC7, 149539 - 131105: 0xFE54, 149634 - 131105: 0x8E74, 149737 - 131105: 0x8BD6, 149744 - 131105: 0x94B6, 149745 - 131105: 0xFD74, 149746 - 131105: 0x98C0, 149747 - 131105: 0x94A5, 149755 - 131105: 0x9BC8, 149759 - 131105: 0x95ED, 149760 - 131105: 0xFD7E, 149761 - 131105: 0xFBEB, 149772 - 131105: 0xFD7D, 149782 - 131105: 0x976F, 149783 - 131105: 0x9461, 149785 - 131105: 0x9FC1, 149807 - 131105: 0x95D7, 149811 - 131105: 0xFA52, 149812 - 131105: 0x9C58, 149822 - 131105: 0x9F68, 149823 - 131105: 0x9BE7, 149824 - 131105: 0xFCCE, 149825 - 131105: 0x96E8, 149826 - 131105: 0xFA49, 149827 - 131105: 0x97A1, 149858 - 131105: 0x954D, 149859 - 131105: 0x9EF8, 149876 - 131105: 0xFE49, 149877 - 131105: 0x91CE, 149878 - 131105: 0x9771, 149883 - 131105: 0x8CCF, 149887 - 131105: 0xFDB1, 149890 - 131105: 0xFC6E, 149896 - 131105: 0x9CF2, 149897 - 131105: 0x93B8, 149898 - 131105: 0x9043, 149899 - 131105: 0x9759, 149900 - 131105: 0x94D7, 149901 - 131105: 0xFE66, 149902 - 131105: 0x947D, 149903 - 131105: 0xFC6F, 149908 - 131105: 0x9246, 149924 - 131105: 0xFA6D, 149927 - 131105: 0x8EF7, 149929 - 131105: 0xFBB7, 149931 - 131105: 0x947C, 149932 - 131105: 0x92CD, 149933 - 131105: 0x97B2, 149943 - 131105: 0xFE65, 149944 - 131105: 0x967E, 149945 - 131105: 0x9758, 149946 - 131105: 0x9B77, 149947 - 131105: 0x91CF, 149957 - 131105: 0x94A4, 149968 - 131105: 0x9CAD, 149978 - 131105: 0x8BAB, 149982 - 131105: 0x96D5, 149983 - 131105: 0xFCB3, 149987 - 131105: 0x93AE, 149989 - 131105: 0x976D, 149996 - 131105: 0x9446, 149997 - 131105: 0x95F7, 150006 - 131105: 0x9C46, 150007 - 131105: 0x955B, 150008 - 131105: 0x91D1, 150009 - 131105: 0x94F4, 150011 - 131105: 0xFE67, 150030 - 131105: 0x92A5, 150034 - 131105: 0xFEDF, 150035 - 131105: 0x8CAB, 150037 - 131105: 0x9BC9, 150049 - 131105: 0xFCED, 150050 - 131105: 0xFDFA, 150051 - 131105: 0xFCC8, 150052 - 131105: 0xFE62, 150053 - 131105: 0x91FC, 150054 - 131105: 0xFE6B, 150055 - 131105: 0xFDF9, 150056 - 131105: 0xFCC7, 150057 - 131105: 0x914E, 150058 - 131105: 0x9CB8, 150078 - 131105: 0x9767, 150082 - 131105: 0x95EE, 150085 - 131105: 0x9BB2, 150090 - 131105: 0x9460, 150094 - 131105: 0x94A2, 150095 - 131105: 0x9875, 150096 - 131105: 0x97AC, 150097 - 131105: 0x91D3, 150109 - 131105: 0x987B, 150117 - 131105: 0x8EEB, 150118 - 131105: 0x976A, 150119 - 131105: 0x965E, 150129 - 131105: 0x97EB, 150135 - 131105: 0x9FF9, 150136 - 131105: 0x95F8, 150137 - 131105: 0xFEA2, 150138 - 131105: 0x8FE6, 150156 - 131105: 0xFE7E, 150163 - 131105: 0x9DA4, 150164 - 131105: 0x9768, 150165 - 131105: 0x8EEC, 150166 - 131105: 0x94BD, 150180 - 131105: 0x945B, 150181 - 131105: 0x9CF6, 150182 - 131105: 0xFAA7, 150183 - 131105: 0x9BD9, 150193 - 131105: 0xFA5D, 150194 - 131105: 0x9656, 150195 - 131105: 0x9762, 150202 - 131105: 0x94BA, 150203 - 131105: 0xA04F, 150204 - 131105: 0x92D8, 150208 - 131105: 0x9BCB, 150215 - 131105: 0x94BB, 150218 - 131105: 0x9D5F, 150225 - 131105: 0x90CF, 150239 - 131105: 0x9465, 150242 - 131105: 0x9F4C, 150249 - 131105: 0x90D8, 150287 - 131105: 0x8D5B, 150382 - 131105: 0x9EBE, 150517 - 131105: 0xFB6D, 150537 - 131105: 0x95CA, 150686 - 131105: 0x9DC2, 150687 - 131105: 0x97F8, 150729 - 131105: 0x8FFC, 150745 - 131105: 0x9473, 150790 - 131105: 0x9474, 150803 - 131105: 0xFEB7, 150968 - 131105: 0x8A4B, 151018 - 131105: 0x8A55, 151019 - 131105: 0x8B69, 151099 - 131105: 0x8ADC, 151120 - 131105: 0x8B76, 151205 - 131105: 0x9BCE, 151207 - 131105: 0x8A68, 151310 - 131105: 0xA0F8, 151388 - 131105: 0x98DF, 151426 - 131105: 0xFEB5, 151430 - 131105: 0x9BCF, 151447 - 131105: 0x96FB, 151450 - 131105: 0x9BFB, 151465 - 131105: 0x9ECE, 151480 - 131105: 0x8EE5, 151490 - 131105: 0x9E7B, 151596 - 131105: 0x9BD2, 151634 - 131105: 0x8AA5, 151709 - 131105: 0xFECE, 151851 - 131105: 0x8A45, 151880 - 131105: 0x9DFC, 151933 - 131105: 0xFECF, 151934 - 131105: 0x8BA5, 152013 - 131105: 0x8C4A, 152035 - 131105: 0x8AEC, 152038 - 131105: 0xFCE0, 152039 - 131105: 0x94AD, 152096 - 131105: 0xFED5, 152097 - 131105: 0x94AC, 152144 - 131105: 0xFC5A, 152217 - 131105: 0x9BD6, 152263 - 131105: 0x8A6F, 152280 - 131105: 0x8BA9, 152334 - 131105: 0x8E5F, 152337 - 131105: 0x9DCB, 152339 - 131105: 0xFCE7, 152601 - 131105: 0x9BD7, 152613 - 131105: 0x93C8, 152623 - 131105: 0x91F0, 152624 - 131105: 0x8FE0, 152646 - 131105: 0x9BDB, 152684 - 131105: 0x90ED, 152686 - 131105: 0x9BDC, 152730 - 131105: 0x8D53, 152881 - 131105: 0xA0EC, 152885 - 131105: 0x98FA, 152895 - 131105: 0x9BE0, 152923 - 131105: 0x93C7, 152924 - 131105: 0x9249, 152925 - 131105: 0x96E1, 152926 - 131105: 0x9BE2, 152930 - 131105: 0x9BE4, 152933 - 131105: 0x8FE1, 152934 - 131105: 0x9BE5, 152961 - 131105: 0x94C0, 152964 - 131105: 0x93C3, 152975 - 131105: 0x93C5, 153017 - 131105: 0x9079, 153045 - 131105: 0x977B, 153051 - 131105: 0x907E, 153056 - 131105: 0xFEE6, 153093 - 131105: 0xFE46, 153141 - 131105: 0x9DB8, 153169 - 131105: 0x9270, 153219 - 131105: 0x95A8, 153237 - 131105: 0x8CB0, 153315 - 131105: 0x94C8, 153334 - 131105: 0x98B9, 153350 - 131105: 0x9140, 153373 - 131105: 0xFCBE, 153381 - 131105: 0x9157, 153405 - 131105: 0x8BB2, 153458 - 131105: 0xFADF, 153543 - 131105: 0x9BE6, 153567 - 131105: 0x9643, 153568 - 131105: 0x8E44, 153569 - 131105: 0x9C4F, 153687 - 131105: 0xFEF4, 153693 - 131105: 0x9BE8, 153714 - 131105: 0x93DC, 153800 - 131105: 0x966F, 153822 - 131105: 0x87A1, 153825 - 131105: 0x8E4A, 153859 - 131105: 0x9BED, 153926 - 131105: 0x92F6, 153942 - 131105: 0x9DB9, 154028 - 131105: 0x8E4E, 154060 - 131105: 0xFBCF, 154196 - 131105: 0x8760, 154261 - 131105: 0x9EC2, 154268 - 131105: 0x94E5, 154286 - 131105: 0x9BF0, 154287 - 131105: 0x94E4, 154345 - 131105: 0x9551, 154484 - 131105: 0x8BBB, 154505 - 131105: 0x9BF1, 154547 - 131105: 0x94F0, 154548 - 131105: 0x8E64, 154566 - 131105: 0x94EA, 154596 - 131105: 0x8F61, 154600 - 131105: 0x9B64, 154625 - 131105: 0x8E5B, 154630 - 131105: 0x9BF2, 154657 - 131105: 0x9FBE, 154698 - 131105: 0x9DC9, 154725 - 131105: 0x8E6C, 154769 - 131105: 0x8F73, 154788 - 131105: 0x8CAF, 154816 - 131105: 0x8F75, 154817 - 131105: 0x8E71, 154878 - 131105: 0x8E60, 154912 - 131105: 0x8E6A, 154928 - 131105: 0x8C4C, 154947 - 131105: 0x9552, 155033 - 131105: 0x87CF, 155065 - 131105: 0x87C0, 155150 - 131105: 0x9554, 155209 - 131105: 0x8AD4, 155265 - 131105: 0x9DBB, 155266 - 131105: 0x9543, 155267 - 131105: 0x92FE, 155302 - 131105: 0x94F2, 155324 - 131105: 0x94F1, 155351 - 131105: 0xA0EA, 155352 - 131105: 0x9DD2, 155418 - 131105: 0xA0B1, 155467 - 131105: 0x91F8, 155617 - 131105: 0x9462, 155618 - 131105: 0x9BA4, 155681 - 131105: 0x877D, 155689 - 131105: 0x8EAD, 155720 - 131105: 0x9EAD, 155748 - 131105: 0x96D0, 155779 - 131105: 0xFEEE, 155799 - 131105: 0x8AB4, 155812 - 131105: 0x9757, 155813 - 131105: 0x8A77, 155906 - 131105: 0x9BF7, 155937 - 131105: 0x8EB5, 155993 - 131105: 0xA06D, 155994 - 131105: 0x8EB6, 155995 - 131105: 0x9756, 155996 - 131105: 0x9540, 156077 - 131105: 0xA0F3, 156078 - 131105: 0x94BE, 156082 - 131105: 0x9BFA, 156125 - 131105: 0xFDDF, 156248 - 131105: 0x9DBC, 156257 - 131105: 0x94FE, 156266 - 131105: 0x8BDB, 156267 - 131105: 0xA0FE, 156368 - 131105: 0x8EC0, 156469 - 131105: 0x9F47, 156491 - 131105: 0x8BDE, 156492 - 131105: 0xA0FB, 156497 - 131105: 0x8EC3, 156606 - 131105: 0x9649, 156661 - 131105: 0xFEC2, 156664 - 131105: 0x954C, 156674 - 131105: 0x9BFD, 156688 - 131105: 0x90CC, 156689 - 131105: 0x9C60, 156690 - 131105: 0x954B, 156746 - 131105: 0x9BFE, 156777 - 131105: 0x9C70, 156804 - 131105: 0x9C43, 156808 - 131105: 0x9C47, 156809 - 131105: 0x8ECC, 156813 - 131105: 0x8E54, 156824 - 131105: 0x8EE4, 156946 - 131105: 0x9C49, 157042 - 131105: 0x8B5E, 157088 - 131105: 0x955E, 157101 - 131105: 0x955C, 157119 - 131105: 0x9C4B, 157202 - 131105: 0x8BE1, 157222 - 131105: 0x8ED9, 157359 - 131105: 0x9DB4, 157361 - 131105: 0x925F, 157365 - 131105: 0x9C4C, 157402 - 131105: 0x8AA1, 157416 - 131105: 0x8EDB, 157436 - 131105: 0x9C56, 157462 - 131105: 0x8AA2, 157505 - 131105: 0x9754, 157593 - 131105: 0x9C5E, 157619 - 131105: 0x9ED4, 157620 - 131105: 0x9568, 157644 - 131105: 0xA0C3, 157724 - 131105: 0x8AE6, 157766 - 131105: 0xA0F7, 157790 - 131105: 0x9C61, 157806 - 131105: 0x9C5F, 157832 - 131105: 0xFC4D, 157834 - 131105: 0x9E5B, 157843 - 131105: 0x9E69, 157895 - 131105: 0x9C63, 157966 - 131105: 0xFEC7, 157969 - 131105: 0xFEC6, 157990 - 131105: 0x9C67, 158009 - 131105: 0x9C69, 158033 - 131105: 0x8BE2, 158120 - 131105: 0x9165, 158133 - 131105: 0x9CE7, 158194 - 131105: 0x8A54, 158202 - 131105: 0x9C6C, 158253 - 131105: 0x9C6E, 158254 - 131105: 0xFE5D, 158260 - 131105: 0x9C73, 158274 - 131105: 0x956A, 158289 - 131105: 0x956D, 158290 - 131105: 0x8EF0, 158469 - 131105: 0x8F4D, 158474 - 131105: 0x8EF6, 158483 - 131105: 0xFABC, 158485 - 131105: 0x8CD5, 158499 - 131105: 0x875E, 158504 - 131105: 0xFBDA, 158544 - 131105: 0x8B4C, 158545 - 131105: 0xFD75, 158546 - 131105: 0x9BDD, 158547 - 131105: 0xFAF5, 158555 - 131105: 0x9C74, 158581 - 131105: 0x9545, 158594 - 131105: 0x96C6, 158614 - 131105: 0x8F6A, 158615 - 131105: 0x8F4E, 158621 - 131105: 0x9C78, 158643 - 131105: 0xFA55, 158656 - 131105: 0x97E4, 158711 - 131105: 0x9C41, 158753 - 131105: 0x925C, 158784 - 131105: 0x96FA, 158785 - 131105: 0x8CF6, 158790 - 131105: 0x8D4D, 158846 - 131105: 0xFB66, 158847 - 131105: 0x8E65, 158848 - 131105: 0x9849, 158849 - 131105: 0xFBA8, 158850 - 131105: 0x9842, 158884 - 131105: 0x9C7A, 158903 - 131105: 0x97FB, 158904 - 131105: 0x90CA, 158909 - 131105: 0x9C5B, 158912 - 131105: 0x974D, 158915 - 131105: 0x8ED3, 158929 - 131105: 0x9561, 159010 - 131105: 0x9F4B, 159011 - 131105: 0x9FB5, 159012 - 131105: 0x93D2, 159013 - 131105: 0xFDAA, 159014 - 131105: 0x9840, 159015 - 131105: 0x9146, 159016 - 131105: 0x9867, 159017 - 131105: 0xFA5A, 159018 - 131105: 0xFBA9, 159057 - 131105: 0x9841, 159092 - 131105: 0x8CD3, 159136 - 131105: 0xFCFD, 159137 - 131105: 0xFDAB, 159138 - 131105: 0x91BD, 159139 - 131105: 0x8F4C, 159140 - 131105: 0x96C9, 159141 - 131105: 0x8F55, 159142 - 131105: 0xFBAE, 159143 - 131105: 0x956F, 159150 - 131105: 0x9C7D, 159196 - 131105: 0xA0F0, 159210 - 131105: 0x946F, 159211 - 131105: 0xFDAC, 159216 - 131105: 0x96CB, 159232 - 131105: 0x96CE, 159237 - 131105: 0xA056, 159239 - 131105: 0x9CE1, 159250 - 131105: 0x96C4, 159298 - 131105: 0x8F5E, 159299 - 131105: 0x8F6C, 159300 - 131105: 0x8EA3, 159301 - 131105: 0xFBB3, 159342 - 131105: 0xFC53, 159346 - 131105: 0xFDB3, 159351 - 131105: 0x8F6B, 159364 - 131105: 0x96CA, 159368 - 131105: 0x87CD, 159371 - 131105: 0x8753, 159385 - 131105: 0x8F79, 159440 - 131105: 0x9E6F, 159441 - 131105: 0xA0C5, 159442 - 131105: 0xFC78, 159443 - 131105: 0x8E42, 159444 - 131105: 0x8F5A, 159445 - 131105: 0x90C2, 159446 - 131105: 0x8EA5, 159447 - 131105: 0x9061, 159526 - 131105: 0x924F, 159603 - 131105: 0x9373, 159604 - 131105: 0xFDB5, 159647 - 131105: 0xFECC, 159649 - 131105: 0xFBBD, 159678 - 131105: 0x8CD6, 159710 - 131105: 0x9843, 159711 - 131105: 0x96C5, 159758 - 131105: 0x89BC, 159819 - 131105: 0x9CA3, 159826 - 131105: 0x924B, 159827 - 131105: 0x984A, 159880 - 131105: 0x8FA4, 159917 - 131105: 0xA0F1, 159918 - 131105: 0x9EFB, 159919 - 131105: 0x9CD2, 159949 - 131105: 0x8FA7, 159954 - 131105: 0x8754, 159992 - 131105: 0xFC5C, 160009 - 131105: 0x9845, 160012 - 131105: 0x9046, 160013 - 131105: 0x8CD1, 160038 - 131105: 0xFEFA, 160039 - 131105: 0x9560, 160100 - 131105: 0x9F48, 160101 - 131105: 0x9247, 160117 - 131105: 0x90FB, 160205 - 131105: 0x9CA4, 160283 - 131105: 0x9571, 160359 - 131105: 0x8745, 160384 - 131105: 0x9CA6, 160389 - 131105: 0x9CA7, 160395 - 131105: 0x9CAA, 160434 - 131105: 0x9ED3, 160438 - 131105: 0x9E70, 160486 - 131105: 0x9CAC, 160594 - 131105: 0x8752, 160666 - 131105: 0x8FAE, 160767 - 131105: 0x8D50, 160802 - 131105: 0x957D, 160848 - 131105: 0x9CB0, 160900 - 131105: 0x97B6, 160902 - 131105: 0xA0BD, 161140 - 131105: 0x8ADF, 161187 - 131105: 0x9EAA, 161248 - 131105: 0x8FBD, 161252 - 131105: 0x8FBF, 161277 - 131105: 0x9369, 161278 - 131105: 0x9BA7, 161287 - 131105: 0xC8A4, 161292 - 131105: 0xFEEA, 161330 - 131105: 0x9BE1, 161337 - 131105: 0x8B41, 161365 - 131105: 0x9DB6, 161366 - 131105: 0xA0EB, 161367 - 131105: 0x9BA3, 161428 - 131105: 0x8BA1, 161551 - 131105: 0x8FC8, 161589 - 131105: 0x894C, 161590 - 131105: 0x9860, 161601 - 131105: 0x94C7, 161630 - 131105: 0x8B58, 161668 - 131105: 0x95AB, 161669 - 131105: 0x95AA, 161740 - 131105: 0x9CC3, 161880 - 131105: 0x9CC4, 161904 - 131105: 0x93D6, 161949 - 131105: 0x9DAC, 161970 - 131105: 0x8BE6, 161992 - 131105: 0x8A71, 162084 - 131105: 0x8FD1, 162151 - 131105: 0x99D5, 162170 - 131105: 0x90F4, 162208 - 131105: 0x8AA3, 162269 - 131105: 0x9CCE, 162301 - 131105: 0x9CD4, 162314 - 131105: 0x9CD5, 162318 - 131105: 0xFBC8, 162366 - 131105: 0x9DB3, 162387 - 131105: 0xFC70, 162393 - 131105: 0x8FD7, 162425 - 131105: 0x9B73, 162436 - 131105: 0xFA5B, 162493 - 131105: 0x8FD2, 162494 - 131105: 0x9064, 162548 - 131105: 0x98B6, 162566 - 131105: 0x9668, 162571 - 131105: 0x9CD6, 162584 - 131105: 0x98BD, 162616 - 131105: 0x8FDC, 162617 - 131105: 0xFEF6, 162618 - 131105: 0x8FD9, 162632 - 131105: 0x9541, 162661 - 131105: 0x87CA, 162799 - 131105: 0x876C, 162804 - 131105: 0x97F3, 162834 - 131105: 0x9BF8, 162924 - 131105: 0x875A, 162993 - 131105: 0x8748, 163013 - 131105: 0x874A, 163119 - 131105: 0x9E6C, 163155 - 131105: 0x8FF2, 163156 - 131105: 0x8FEE, 163174 - 131105: 0x9CD7, 163187 - 131105: 0x9E6E, 163204 - 131105: 0x8A40, 163215 - 131105: 0x8FEF, 163224 - 131105: 0x8FF4, 163261 - 131105: 0x8FF5, 163292 - 131105: 0x95C2, 163405 - 131105: 0x986A, 163407 - 131105: 0x97CF, 163630 - 131105: 0x9EE5, 163833 - 131105: 0x9E7C, 163842 - 131105: 0x9041, 163849 - 131105: 0x9CDB, 163870 - 131105: 0x9441, 163875 - 131105: 0x9CE6, 163876 - 131105: 0x9DB0, 163912 - 131105: 0x9CEA, 163971 - 131105: 0x9CED, 163984 - 131105: 0x9CFA, 164029 - 131105: 0x8B62, 164030 - 131105: 0x8A4E, 164072 - 131105: 0x9CCA, 164073 - 131105: 0x8A66, 164084 - 131105: 0x9CFB, 164142 - 131105: 0x9CFC, 164175 - 131105: 0x9CFE, 164189 - 131105: 0x8A53, 164207 - 131105: 0x9CE5, 164233 - 131105: 0x9D40, 164271 - 131105: 0x9D41, 164284 - 131105: 0x9045, 164359 - 131105: 0x8B73, 164376 - 131105: 0x97CA, 164378 - 131105: 0x9D42, 164438 - 131105: 0x8A61, 164476 - 131105: 0x8BAE, 164507 - 131105: 0x8AD2, 164557 - 131105: 0x8BA2, 164578 - 131105: 0x9DF2, 164614 - 131105: 0x9D43, 164632 - 131105: 0x9CDF, 164655 - 131105: 0x9D44, 164666 - 131105: 0x8ECA, 164709 - 131105: 0x904E, 164717 - 131105: 0x8EB3, 164733 - 131105: 0x9FF5, 164746 - 131105: 0x9D45, 164882 - 131105: 0x904F, 164968 - 131105: 0x9D47, 164972 - 131105: 0x89CA, 164979 - 131105: 0x9CB5, 164994 - 131105: 0xFBFE, 165121 - 131105: 0x905E, 165180 - 131105: 0x9063, 165181 - 131105: 0x9057, 165228 - 131105: 0x9066, 165352 - 131105: 0x9BC0, 165364 - 131105: 0xFCE5, 165376 - 131105: 0x9162, 165387 - 131105: 0x9067, 165413 - 131105: 0x8FA1, 165435 - 131105: 0x8FA2, 165546 - 131105: 0x9D48, 165547 - 131105: 0xFAD3, 165554 - 131105: 0x8D4F, 165564 - 131105: 0x905D, 165592 - 131105: 0x90B9, 165606 - 131105: 0x906B, 165647 - 131105: 0x8C5C, 165651 - 131105: 0x9069, 165892 - 131105: 0xFE57, 165931 - 131105: 0xFE55, 166157 - 131105: 0x87A6, 166195 - 131105: 0x9073, 166216 - 131105: 0x9BEF, 166217 - 131105: 0x9CF0, 166230 - 131105: 0x9D4B, 166244 - 131105: 0xFED9, 166248 - 131105: 0xFEDA, 166252 - 131105: 0x91E0, 166253 - 131105: 0x8D43, 166270 - 131105: 0x91D8, 166281 - 131105: 0x9646, 166312 - 131105: 0x9360, 166314 - 131105: 0xFA53, 166315 - 131105: 0x9CD3, 166328 - 131105: 0x9D4E, 166332 - 131105: 0xFB40, 166336 - 131105: 0x8DE2, 166364 - 131105: 0x9442, 166366 - 131105: 0x9056, 166369 - 131105: 0x9865, 166371 - 131105: 0x8C6C, 166372 - 131105: 0xFA4A, 166375 - 131105: 0x9D50, 166376 - 131105: 0x9D52, 166393 - 131105: 0x95AF, 166394 - 131105: 0x975A, 166395 - 131105: 0x9349, 166396 - 131105: 0x9747, 166415 - 131105: 0xA0F4, 166422 - 131105: 0x9778, 166437 - 131105: 0x8FCF, 166441 - 131105: 0xFC60, 166450 - 131105: 0x8C4E, 166454 - 131105: 0xFC56, 166468 - 131105: 0x91DC, 166469 - 131105: 0x9661, 166470 - 131105: 0x92EC, 166471 - 131105: 0x935D, 166472 - 131105: 0x8EDE, 166473 - 131105: 0x96FE, 166474 - 131105: 0xFD4F, 166475 - 131105: 0x95DE, 166489 - 131105: 0x98B0, 166490 - 131105: 0xA040, 166529 - 131105: 0x97BD, 166530 - 131105: 0x977D, 166531 - 131105: 0x97F5, 166554 - 131105: 0x9BAC, 166555 - 131105: 0xFADA, 166556 - 131105: 0x92C2, 166592 - 131105: 0x97B1, 166598 - 131105: 0x907B, 166603 - 131105: 0x93FE, 166604 - 131105: 0x947B, 166606 - 131105: 0x9777, 166622 - 131105: 0xFABE, 166623 - 131105: 0xFD43, 166624 - 131105: 0x90C6, 166625 - 131105: 0x90A4, 166626 - 131105: 0x90A8, 166627 - 131105: 0x94A9, 166629 - 131105: 0x90A9, 166634 - 131105: 0x8C65, 166652 - 131105: 0x95E0, 166668 - 131105: 0x907D, 166675 - 131105: 0x9265, 166689 - 131105: 0xFDBA, 166690 - 131105: 0x93C4, 166699 - 131105: 0xFEED, 166700 - 131105: 0x9DAB, 166701 - 131105: 0xA0E3, 166703 - 131105: 0x9648, 166726 - 131105: 0x9D53, 166732 - 131105: 0x8AA9, 166734 - 131105: 0x9BC5, 166736 - 131105: 0x965D, 166755 - 131105: 0x975F, 166756 - 131105: 0x965F, 166757 - 131105: 0x966E, 166758 - 131105: 0xFB5D, 166764 - 131105: 0x9DB1, 166799 - 131105: 0xFEA3, 166809 - 131105: 0x9DB2, 166812 - 131105: 0x95AE, 166813 - 131105: 0xFCA3, 166841 - 131105: 0x8769, 166850 - 131105: 0xA0A2, 166853 - 131105: 0x9655, 166868 - 131105: 0x9D54, 166871 - 131105: 0x9341, 166873 - 131105: 0x95AD, 166874 - 131105: 0x91D5, 166887 - 131105: 0x977A, 166888 - 131105: 0xFDFC, 166889 - 131105: 0x8E47, 166890 - 131105: 0x93FD, 166891 - 131105: 0x90A5, 166892 - 131105: 0x90AC, 166901 - 131105: 0x95AC, 166911 - 131105: 0x90AE, 166915 - 131105: 0xFEA5, 166921 - 131105: 0x9D56, 166940 - 131105: 0x97E3, 166941 - 131105: 0x95E2, 166947 - 131105: 0x9466, 166950 - 131105: 0x9647, 166955 - 131105: 0x91B8, 166960 - 131105: 0x9CEC, 166969 - 131105: 0x90AD, 166971 - 131105: 0x95E3, 167114 - 131105: 0x8B4F, 167117 - 131105: 0x8AE3, 167122 - 131105: 0x8B4D, 167220 - 131105: 0x95EA, 167321 - 131105: 0x8B4E, 167353 - 131105: 0x8CC1, 167439 - 131105: 0x8BED, 167478 - 131105: 0x91D9, 167481 - 131105: 0xA0A4, 167525 - 131105: 0x95F5, 167526 - 131105: 0x95F4, 167575 - 131105: 0x9FB3, 167596 - 131105: 0xFEAF, 167602 - 131105: 0xFE72, 167603 - 131105: 0x927A, 167641 - 131105: 0xFEAC, 167655 - 131105: 0x95F3, 167877 - 131105: 0x9D58, 168057 - 131105: 0x8D46, 168072 - 131105: 0x9372, 168075 - 131105: 0x91C5, 168083 - 131105: 0x9642, 168111 - 131105: 0x90CD, 168112 - 131105: 0x95FE, 168113 - 131105: 0x9159, 168128 - 131105: 0x9C65, 168164 - 131105: 0x97CC, 168165 - 131105: 0x90CE, 168172 - 131105: 0x9D59, 168173 - 131105: 0xFCF5, 168205 - 131105: 0xFEFD, 168208 - 131105: 0x9D5B, 168252 - 131105: 0x9D5C, 168269 - 131105: 0x937E, 168283 - 131105: 0x98AC, 168286 - 131105: 0x9D5E, 168304 - 131105: 0xFDD0, 168348 - 131105: 0xFD60, 168360 - 131105: 0x9CCF, 168405 - 131105: 0x90DD, 168427 - 131105: 0x90E0, 168989 - 131105: 0x90F3, 168992 - 131105: 0x98B1, 169011 - 131105: 0x90F0, 169023 - 131105: 0x93BD, 169032 - 131105: 0x95B7, 169168 - 131105: 0x9F46, 169177 - 131105: 0x8E4B, 169178 - 131105: 0x9658, 169189 - 131105: 0x8A4C, 169191 - 131105: 0x9D63, 169374 - 131105: 0x9ECF, 169392 - 131105: 0x9D65, 169400 - 131105: 0x9D66, 169431 - 131105: 0x965A, 169449 - 131105: 0x9D64, 169460 - 131105: 0x8A6C, 169760 - 131105: 0x8AD9, 169778 - 131105: 0x9D67, 169940 - 131105: 0x8A70, 170000 - 131105: 0x8BF3, 170071 - 131105: 0x9150, 170148 - 131105: 0x9CC1, 170193 - 131105: 0x9D68, 170218 - 131105: 0x93A7, 170225 - 131105: 0x9674, 170234 - 131105: 0x8CFD, 170243 - 131105: 0xA0EF, 170245 - 131105: 0x9151, 170287 - 131105: 0x96C1, 170309 - 131105: 0x8777, 170311 - 131105: 0x8C64, 170312 - 131105: 0x9676, 170313 - 131105: 0x9D69, 170333 - 131105: 0xFCA4, 170346 - 131105: 0x9D6A, 170397 - 131105: 0x924E, 170435 - 131105: 0x9D6B, 170441 - 131105: 0x9BC1, 170536 - 131105: 0x9D6C, 170573 - 131105: 0x8A65, 170757 - 131105: 0x915D, 170766 - 131105: 0x9D6D, 170965 - 131105: 0x915A, 171123 - 131105: 0x8C42, 171181 - 131105: 0x9CC0, 171326 - 131105: 0x916A, 171354 - 131105: 0x9D6E, 171388 - 131105: 0x9EA6, 171416 - 131105: 0x9DCD, 171419 - 131105: 0x9D6F, 171510 - 131105: 0x89BB, 171526 - 131105: 0x9EF9, 171565 - 131105: 0x96B4, 171624 - 131105: 0x9172, 171692 - 131105: 0x9EC8, 171696 - 131105: 0x8771, 171715 - 131105: 0x8B55, 171768 - 131105: 0x9D71, 171811 - 131105: 0x9D72, 171824 - 131105: 0x9ECC, 171959 - 131105: 0x9174, 171998 - 131105: 0x9ED0, 172052 - 131105: 0x905C, 172167 - 131105: 0x8ED2, 172217 - 131105: 0x91A8, 172257 - 131105: 0x9177, 172269 - 131105: 0x96BF, 172275 - 131105: 0x96C0, 172280 - 131105: 0x8FB1, 172286 - 131105: 0x96B7, 172295 - 131105: 0x8C55, 172323 - 131105: 0x9178, 172339 - 131105: 0x89BE, 172340 - 131105: 0x917C, 172368 - 131105: 0xFB77, 172434 - 131105: 0x9175, 172435 - 131105: 0x91A3, 172459 - 131105: 0x9176, 172468 - 131105: 0x96BE, 172469 - 131105: 0x8D49, 172511 - 131105: 0x9179, 172533 - 131105: 0x96B6, 172576 - 131105: 0x91A4, 172595 - 131105: 0x91A6, 172691 - 131105: 0x9D75, 172703 - 131105: 0x9052, 172722 - 131105: 0xA045, 172724 - 131105: 0x91A9, 172726 - 131105: 0x98AA, 172730 - 131105: 0x8C5F, 172733 - 131105: 0x8BAA, 172767 - 131105: 0x9CDD, 172799 - 131105: 0x9D77, 172881 - 131105: 0x8756, 172969 - 131105: 0x8940, 173108 - 131105: 0x9EEC, 173147 - 131105: 0x93AA, 173510 - 131105: 0x9478, 173515 - 131105: 0x9D7A, 173569 - 131105: 0x8AC9, 173618 - 131105: 0x8B4B, 173642 - 131105: 0x9FEC, 173659 - 131105: 0x8AE2, 173737 - 131105: 0x9E75, } const encode1Low, encode1High = 11904, 40908 var encode1 = [...]uint16{ 11904 - 11904: 0xC8D6, 11908 - 11904: 0xC8D7, 11910 - 11904: 0xC8D8, 11911 - 11904: 0xC8D9, 11912 - 11904: 0xC8DA, 11914 - 11904: 0xC8DB, 11916 - 11904: 0xC8DC, 11917 - 11904: 0xC8DD, 11925 - 11904: 0xC8DE, 11932 - 11904: 0xC8DF, 11933 - 11904: 0xC8E0, 11941 - 11904: 0xC8E1, 11943 - 11904: 0xC8E2, 11946 - 11904: 0xC8E3, 11948 - 11904: 0xC8E4, 11950 - 11904: 0xC8E5, 11958 - 11904: 0xC8E6, 11964 - 11904: 0xC8E7, 11966 - 11904: 0xC8E8, 11974 - 11904: 0xC8E9, 11978 - 11904: 0xC8EA, 11980 - 11904: 0xC8EB, 11981 - 11904: 0xC8EC, 11983 - 11904: 0xC8ED, 11990 - 11904: 0xC8EE, 11991 - 11904: 0xC8EF, 11998 - 11904: 0xC8F0, 12003 - 11904: 0xC8F1, 12083 - 11904: 0xC6CD, 12288 - 11904: 0xA140, 12289 - 11904: 0xA142, 12290 - 11904: 0xA143, 12291 - 11904: 0xC6DE, 12293 - 11904: 0xC6E0, 12294 - 11904: 0xC6E1, 12295 - 11904: 0xC6E2, 12296 - 11904: 0xA171, 12297 - 11904: 0xA172, 12298 - 11904: 0xA16D, 12299 - 11904: 0xA16E, 12300 - 11904: 0xA175, 12301 - 11904: 0xA176, 12302 - 11904: 0xA179, 12303 - 11904: 0xA17A, 12304 - 11904: 0xA169, 12305 - 11904: 0xA16A, 12306 - 11904: 0xA245, 12308 - 11904: 0xA165, 12309 - 11904: 0xA166, 12317 - 11904: 0xA1A9, 12318 - 11904: 0xA1AA, 12321 - 11904: 0xA2C3, 12322 - 11904: 0xA2C4, 12323 - 11904: 0xA2C5, 12324 - 11904: 0xA2C6, 12325 - 11904: 0xA2C7, 12326 - 11904: 0xA2C8, 12327 - 11904: 0xA2C9, 12328 - 11904: 0xA2CA, 12329 - 11904: 0xA2CB, 12353 - 11904: 0xC6E7, 12354 - 11904: 0xC6E8, 12355 - 11904: 0xC6E9, 12356 - 11904: 0xC6EA, 12357 - 11904: 0xC6EB, 12358 - 11904: 0xC6EC, 12359 - 11904: 0xC6ED, 12360 - 11904: 0xC6EE, 12361 - 11904: 0xC6EF, 12362 - 11904: 0xC6F0, 12363 - 11904: 0xC6F1, 12364 - 11904: 0xC6F2, 12365 - 11904: 0xC6F3, 12366 - 11904: 0xC6F4, 12367 - 11904: 0xC6F5, 12368 - 11904: 0xC6F6, 12369 - 11904: 0xC6F7, 12370 - 11904: 0xC6F8, 12371 - 11904: 0xC6F9, 12372 - 11904: 0xC6FA, 12373 - 11904: 0xC6FB, 12374 - 11904: 0xC6FC, 12375 - 11904: 0xC6FD, 12376 - 11904: 0xC6FE, 12377 - 11904: 0xC740, 12378 - 11904: 0xC741, 12379 - 11904: 0xC742, 12380 - 11904: 0xC743, 12381 - 11904: 0xC744, 12382 - 11904: 0xC745, 12383 - 11904: 0xC746, 12384 - 11904: 0xC747, 12385 - 11904: 0xC748, 12386 - 11904: 0xC749, 12387 - 11904: 0xC74A, 12388 - 11904: 0xC74B, 12389 - 11904: 0xC74C, 12390 - 11904: 0xC74D, 12391 - 11904: 0xC74E, 12392 - 11904: 0xC74F, 12393 - 11904: 0xC750, 12394 - 11904: 0xC751, 12395 - 11904: 0xC752, 12396 - 11904: 0xC753, 12397 - 11904: 0xC754, 12398 - 11904: 0xC755, 12399 - 11904: 0xC756, 12400 - 11904: 0xC757, 12401 - 11904: 0xC758, 12402 - 11904: 0xC759, 12403 - 11904: 0xC75A, 12404 - 11904: 0xC75B, 12405 - 11904: 0xC75C, 12406 - 11904: 0xC75D, 12407 - 11904: 0xC75E, 12408 - 11904: 0xC75F, 12409 - 11904: 0xC760, 12410 - 11904: 0xC761, 12411 - 11904: 0xC762, 12412 - 11904: 0xC763, 12413 - 11904: 0xC764, 12414 - 11904: 0xC765, 12415 - 11904: 0xC766, 12416 - 11904: 0xC767, 12417 - 11904: 0xC768, 12418 - 11904: 0xC769, 12419 - 11904: 0xC76A, 12420 - 11904: 0xC76B, 12421 - 11904: 0xC76C, 12422 - 11904: 0xC76D, 12423 - 11904: 0xC76E, 12424 - 11904: 0xC76F, 12425 - 11904: 0xC770, 12426 - 11904: 0xC771, 12427 - 11904: 0xC772, 12428 - 11904: 0xC773, 12429 - 11904: 0xC774, 12430 - 11904: 0xC775, 12431 - 11904: 0xC776, 12432 - 11904: 0xC777, 12433 - 11904: 0xC778, 12434 - 11904: 0xC779, 12435 - 11904: 0xC77A, 12443 - 11904: 0xC8D4, 12444 - 11904: 0xC8D5, 12445 - 11904: 0xC6DC, 12446 - 11904: 0xC6DD, 12449 - 11904: 0xC77B, 12450 - 11904: 0xC77C, 12451 - 11904: 0xC77D, 12452 - 11904: 0xC77E, 12453 - 11904: 0xC7A1, 12454 - 11904: 0xC7A2, 12455 - 11904: 0xC7A3, 12456 - 11904: 0xC7A4, 12457 - 11904: 0xC7A5, 12458 - 11904: 0xC7A6, 12459 - 11904: 0xC7A7, 12460 - 11904: 0xC7A8, 12461 - 11904: 0xC7A9, 12462 - 11904: 0xC7AA, 12463 - 11904: 0xC7AB, 12464 - 11904: 0xC7AC, 12465 - 11904: 0xC7AD, 12466 - 11904: 0xC7AE, 12467 - 11904: 0xC7AF, 12468 - 11904: 0xC7B0, 12469 - 11904: 0xC7B1, 12470 - 11904: 0xC7B2, 12471 - 11904: 0xC7B3, 12472 - 11904: 0xC7B4, 12473 - 11904: 0xC7B5, 12474 - 11904: 0xC7B6, 12475 - 11904: 0xC7B7, 12476 - 11904: 0xC7B8, 12477 - 11904: 0xC7B9, 12478 - 11904: 0xC7BA, 12479 - 11904: 0xC7BB, 12480 - 11904: 0xC7BC, 12481 - 11904: 0xC7BD, 12482 - 11904: 0xC7BE, 12483 - 11904: 0xC7BF, 12484 - 11904: 0xC7C0, 12485 - 11904: 0xC7C1, 12486 - 11904: 0xC7C2, 12487 - 11904: 0xC7C3, 12488 - 11904: 0xC7C4, 12489 - 11904: 0xC7C5, 12490 - 11904: 0xC7C6, 12491 - 11904: 0xC7C7, 12492 - 11904: 0xC7C8, 12493 - 11904: 0xC7C9, 12494 - 11904: 0xC7CA, 12495 - 11904: 0xC7CB, 12496 - 11904: 0xC7CC, 12497 - 11904: 0xC7CD, 12498 - 11904: 0xC7CE, 12499 - 11904: 0xC7CF, 12500 - 11904: 0xC7D0, 12501 - 11904: 0xC7D1, 12502 - 11904: 0xC7D2, 12503 - 11904: 0xC7D3, 12504 - 11904: 0xC7D4, 12505 - 11904: 0xC7D5, 12506 - 11904: 0xC7D6, 12507 - 11904: 0xC7D7, 12508 - 11904: 0xC7D8, 12509 - 11904: 0xC7D9, 12510 - 11904: 0xC7DA, 12511 - 11904: 0xC7DB, 12512 - 11904: 0xC7DC, 12513 - 11904: 0xC7DD, 12514 - 11904: 0xC7DE, 12515 - 11904: 0xC7DF, 12516 - 11904: 0xC7E0, 12517 - 11904: 0xC7E1, 12518 - 11904: 0xC7E2, 12519 - 11904: 0xC7E3, 12520 - 11904: 0xC7E4, 12521 - 11904: 0xC7E5, 12522 - 11904: 0xC7E6, 12523 - 11904: 0xC7E7, 12524 - 11904: 0xC7E8, 12525 - 11904: 0xC7E9, 12526 - 11904: 0xC7EA, 12527 - 11904: 0xC7EB, 12528 - 11904: 0xC7EC, 12529 - 11904: 0xC7ED, 12530 - 11904: 0xC7EE, 12531 - 11904: 0xC7EF, 12532 - 11904: 0xC7F0, 12533 - 11904: 0xC7F1, 12534 - 11904: 0xC7F2, 12540 - 11904: 0xC6E3, 12541 - 11904: 0xC6DA, 12542 - 11904: 0xC6DB, 12549 - 11904: 0xA374, 12550 - 11904: 0xA375, 12551 - 11904: 0xA376, 12552 - 11904: 0xA377, 12553 - 11904: 0xA378, 12554 - 11904: 0xA379, 12555 - 11904: 0xA37A, 12556 - 11904: 0xA37B, 12557 - 11904: 0xA37C, 12558 - 11904: 0xA37D, 12559 - 11904: 0xA37E, 12560 - 11904: 0xA3A1, 12561 - 11904: 0xA3A2, 12562 - 11904: 0xA3A3, 12563 - 11904: 0xA3A4, 12564 - 11904: 0xA3A5, 12565 - 11904: 0xA3A6, 12566 - 11904: 0xA3A7, 12567 - 11904: 0xA3A8, 12568 - 11904: 0xA3A9, 12569 - 11904: 0xA3AA, 12570 - 11904: 0xA3AB, 12571 - 11904: 0xA3AC, 12572 - 11904: 0xA3AD, 12573 - 11904: 0xA3AE, 12574 - 11904: 0xA3AF, 12575 - 11904: 0xA3B0, 12576 - 11904: 0xA3B1, 12577 - 11904: 0xA3B2, 12578 - 11904: 0xA3B3, 12579 - 11904: 0xA3B4, 12580 - 11904: 0xA3B5, 12581 - 11904: 0xA3B6, 12582 - 11904: 0xA3B7, 12583 - 11904: 0xA3B8, 12584 - 11904: 0xA3B9, 12585 - 11904: 0xA3BA, 12736 - 11904: 0x8840, 12737 - 11904: 0x8841, 12738 - 11904: 0x8842, 12739 - 11904: 0x8843, 12740 - 11904: 0x8844, 12741 - 11904: 0x8846, 12742 - 11904: 0x8849, 12743 - 11904: 0x884A, 12744 - 11904: 0x884D, 12745 - 11904: 0x884F, 12746 - 11904: 0x8850, 12747 - 11904: 0x8851, 12748 - 11904: 0x8852, 12749 - 11904: 0x8854, 12750 - 11904: 0x8855, 12751 - 11904: 0xC879, 12849 - 11904: 0xC8D1, 12963 - 11904: 0xA1C0, 13198 - 11904: 0xA255, 13199 - 11904: 0xA256, 13212 - 11904: 0xA250, 13213 - 11904: 0xA251, 13214 - 11904: 0xA252, 13217 - 11904: 0xA254, 13252 - 11904: 0xA257, 13262 - 11904: 0xA253, 13265 - 11904: 0xA1EB, 13266 - 11904: 0xA1EA, 13269 - 11904: 0xA24F, 13365 - 11904: 0x9277, 13376 - 11904: 0x96DF, 13386 - 11904: 0x8CF4, 13388 - 11904: 0x89D5, 13412 - 11904: 0x93CD, 13427 - 11904: 0x9BDF, 13434 - 11904: 0xFA68, 13437 - 11904: 0x89DA, 13438 - 11904: 0x8F59, 13459 - 11904: 0x89DB, 13462 - 11904: 0x8F5D, 13477 - 11904: 0x89DC, 13487 - 11904: 0x96F7, 13500 - 11904: 0x8ADA, 13505 - 11904: 0x8BDC, 13512 - 11904: 0x97DB, 13535 - 11904: 0x9E53, 13540 - 11904: 0x9DAA, 13542 - 11904: 0x87BE, 13563 - 11904: 0x9BEA, 13574 - 11904: 0x8A6E, 13630 - 11904: 0x8BC8, 13649 - 11904: 0x89E8, 13651 - 11904: 0x89EA, 13657 - 11904: 0x8C4B, 13665 - 11904: 0xFB70, 13677 - 11904: 0x89ED, 13680 - 11904: 0x94DD, 13682 - 11904: 0x89EE, 13687 - 11904: 0x9EB4, 13688 - 11904: 0x8AD3, 13700 - 11904: 0x92DB, 13719 - 11904: 0x94DB, 13720 - 11904: 0x89F9, 13729 - 11904: 0xFB7A, 13733 - 11904: 0x89FB, 13741 - 11904: 0x9EFC, 13759 - 11904: 0x89FC, 13761 - 11904: 0x89BF, 13765 - 11904: 0x89FE, 13767 - 11904: 0x89E6, 13770 - 11904: 0x9D46, 13774 - 11904: 0x9DEE, 13778 - 11904: 0xA07E, 13782 - 11904: 0xA068, 13787 - 11904: 0x98E9, 13789 - 11904: 0x8B68, 13809 - 11904: 0x8DFD, 13810 - 11904: 0x8BBE, 13811 - 11904: 0x9FD9, 13819 - 11904: 0x8AEB, 13822 - 11904: 0x9FD7, 13833 - 11904: 0x8B6A, 13848 - 11904: 0x9C5C, 13850 - 11904: 0x8BB1, 13859 - 11904: 0xFB5E, 13861 - 11904: 0x8770, 13869 - 11904: 0x9DF3, 13877 - 11904: 0xA0D0, 13881 - 11904: 0xFC66, 13886 - 11904: 0x92E9, 13895 - 11904: 0x9AEC, 13896 - 11904: 0x8FAB, 13897 - 11904: 0xFA48, 13902 - 11904: 0x8E45, 13919 - 11904: 0x9C6F, 13921 - 11904: 0x8D5C, 13946 - 11904: 0x9EDE, 13953 - 11904: 0x89EF, 13978 - 11904: 0x96E9, 13989 - 11904: 0x9EBB, 13994 - 11904: 0x94DE, 13996 - 11904: 0x9EB8, 14000 - 11904: 0x97BA, 14001 - 11904: 0xFB65, 14005 - 11904: 0x95D6, 14009 - 11904: 0x9CBB, 14012 - 11904: 0x97DA, 14017 - 11904: 0x8F45, 14019 - 11904: 0xFB7D, 14020 - 11904: 0x9158, 14021 - 11904: 0xFE64, 14023 - 11904: 0x9856, 14024 - 11904: 0x9B4D, 14035 - 11904: 0x935B, 14036 - 11904: 0x95C7, 14038 - 11904: 0x97E7, 14045 - 11904: 0x9359, 14049 - 11904: 0x91F5, 14050 - 11904: 0x97B8, 14053 - 11904: 0xFDA2, 14054 - 11904: 0xFBB6, 14069 - 11904: 0x92FA, 14081 - 11904: 0x9357, 14083 - 11904: 0x8BA6, 14088 - 11904: 0xFBB9, 14090 - 11904: 0x97B0, 14093 - 11904: 0xFDC4, 14108 - 11904: 0x9CA1, 14114 - 11904: 0x91F2, 14115 - 11904: 0x91F9, 14117 - 11904: 0x8FF1, 14124 - 11904: 0x9745, 14125 - 11904: 0x9853, 14128 - 11904: 0xFE78, 14130 - 11904: 0xFBC1, 14131 - 11904: 0x9251, 14138 - 11904: 0x9DAD, 14144 - 11904: 0xFD6C, 14147 - 11904: 0xFA6B, 14178 - 11904: 0x9BC2, 14191 - 11904: 0x9A7B, 14231 - 11904: 0x8B60, 14240 - 11904: 0x934B, 14265 - 11904: 0x9ABD, 14270 - 11904: 0x91B7, 14294 - 11904: 0x8D4B, 14322 - 11904: 0x95B4, 14328 - 11904: 0xFEC5, 14331 - 11904: 0x9EF0, 14351 - 11904: 0x8D64, 14361 - 11904: 0x9269, 14368 - 11904: 0x8D67, 14381 - 11904: 0xFBEA, 14390 - 11904: 0xFBEF, 14392 - 11904: 0x8D68, 14435 - 11904: 0x93EB, 14453 - 11904: 0x877A, 14496 - 11904: 0xFC42, 14531 - 11904: 0x9166, 14540 - 11904: 0xFACD, 14545 - 11904: 0x93DD, 14548 - 11904: 0x8D52, 14586 - 11904: 0x8BCC, 14600 - 11904: 0x8D6D, 14612 - 11904: 0x8D6E, 14631 - 11904: 0x96A8, 14642 - 11904: 0xFCA6, 14655 - 11904: 0x8D6F, 14669 - 11904: 0x8D70, 14691 - 11904: 0xFC64, 14712 - 11904: 0x8CF3, 14720 - 11904: 0x9060, 14729 - 11904: 0x8D74, 14730 - 11904: 0x97C3, 14738 - 11904: 0x8AD0, 14745 - 11904: 0x9274, 14747 - 11904: 0x9BBE, 14753 - 11904: 0x9CC8, 14756 - 11904: 0x9CBA, 14776 - 11904: 0x8D78, 14812 - 11904: 0x9EB9, 14818 - 11904: 0x955A, 14821 - 11904: 0x91B4, 14828 - 11904: 0x8A48, 14840 - 11904: 0x8D7D, 14843 - 11904: 0x8A7D, 14846 - 11904: 0x8AC2, 14849 - 11904: 0xFD4A, 14851 - 11904: 0x8DA1, 14854 - 11904: 0x8AD1, 14871 - 11904: 0xFCB4, 14872 - 11904: 0x8B47, 14889 - 11904: 0x93A4, 14890 - 11904: 0x9EDA, 14900 - 11904: 0x8A51, 14923 - 11904: 0x8DA6, 14930 - 11904: 0x9EC5, 14935 - 11904: 0xFCC4, 14940 - 11904: 0xA078, 14942 - 11904: 0x94B5, 14950 - 11904: 0xFCC2, 14951 - 11904: 0x8A6B, 14999 - 11904: 0x8DAB, 15019 - 11904: 0xFAE8, 15037 - 11904: 0x8DAD, 15070 - 11904: 0xFC49, 15072 - 11904: 0x93C1, 15088 - 11904: 0x906F, 15090 - 11904: 0x8DB0, 15093 - 11904: 0x87A2, 15099 - 11904: 0x947E, 15118 - 11904: 0x90FA, 15129 - 11904: 0x9479, 15138 - 11904: 0x8DB2, 15147 - 11904: 0xFCEE, 15161 - 11904: 0x997B, 15170 - 11904: 0x8DB4, 15192 - 11904: 0x8DB7, 15200 - 11904: 0x91B3, 15217 - 11904: 0x8DBB, 15218 - 11904: 0x8DBA, 15227 - 11904: 0x8DBC, 15228 - 11904: 0x9044, 15232 - 11904: 0xFD4C, 15253 - 11904: 0x874B, 15254 - 11904: 0x93E4, 15257 - 11904: 0x93E0, 15265 - 11904: 0xFD53, 15292 - 11904: 0x8DC3, 15294 - 11904: 0x9BB8, 15298 - 11904: 0xFBF0, 15300 - 11904: 0x93E9, 15319 - 11904: 0x93F6, 15325 - 11904: 0x8DC5, 15340 - 11904: 0x8DCA, 15346 - 11904: 0x8DCC, 15347 - 11904: 0xFD5D, 15348 - 11904: 0x93B5, 15373 - 11904: 0xFD61, 15377 - 11904: 0x9CF8, 15381 - 11904: 0x9252, 15384 - 11904: 0xA0E8, 15444 - 11904: 0x9CA5, 15499 - 11904: 0x8C56, 15563 - 11904: 0x8DD6, 15565 - 11904: 0x97C0, 15569 - 11904: 0xA0DE, 15574 - 11904: 0x97D2, 15580 - 11904: 0xFAA5, 15595 - 11904: 0xFDA3, 15599 - 11904: 0x8DDB, 15634 - 11904: 0x8CEA, 15635 - 11904: 0x8EAF, 15645 - 11904: 0x91B5, 15666 - 11904: 0xFD49, 15675 - 11904: 0xFDD1, 15686 - 11904: 0x8DEB, 15692 - 11904: 0x97C6, 15694 - 11904: 0xFDCE, 15697 - 11904: 0x90FC, 15711 - 11904: 0xFC59, 15714 - 11904: 0x96D6, 15721 - 11904: 0x97C5, 15722 - 11904: 0x8DEF, 15727 - 11904: 0x97D7, 15733 - 11904: 0x8DF0, 15741 - 11904: 0x96A6, 15749 - 11904: 0xFBBF, 15752 - 11904: 0x8CDF, 15754 - 11904: 0x8DF3, 15759 - 11904: 0x9449, 15761 - 11904: 0x8DF5, 15781 - 11904: 0x9872, 15789 - 11904: 0x8E6B, 15796 - 11904: 0xFAFD, 15807 - 11904: 0x8F50, 15814 - 11904: 0x9DCC, 15815 - 11904: 0xFC65, 15817 - 11904: 0x8C44, 15820 - 11904: 0x996E, 15821 - 11904: 0x94A1, 15827 - 11904: 0x8F63, 15835 - 11904: 0xA0DA, 15847 - 11904: 0x9253, 15848 - 11904: 0xFDE9, 15851 - 11904: 0x9DB5, 15859 - 11904: 0x9879, 15860 - 11904: 0x876A, 15863 - 11904: 0x9D5D, 15868 - 11904: 0x8D63, 15869 - 11904: 0x9669, 15878 - 11904: 0x9F70, 15936 - 11904: 0xFC6A, 15939 - 11904: 0x8AC7, 15944 - 11904: 0x89D7, 15957 - 11904: 0xFE4D, 15988 - 11904: 0x9EDD, 16040 - 11904: 0xFEFB, 16041 - 11904: 0x98BC, 16042 - 11904: 0xFACC, 16045 - 11904: 0x95B0, 16049 - 11904: 0x9464, 16056 - 11904: 0x936F, 16063 - 11904: 0x94B9, 16066 - 11904: 0x95EC, 16071 - 11904: 0x91EE, 16074 - 11904: 0x98C3, 16076 - 11904: 0x95F6, 16080 - 11904: 0x8FFD, 16081 - 11904: 0x98C5, 16086 - 11904: 0x9766, 16087 - 11904: 0xFE6E, 16090 - 11904: 0x97DD, 16091 - 11904: 0x8CAA, 16094 - 11904: 0x92D2, 16097 - 11904: 0x9761, 16098 - 11904: 0x98CB, 16103 - 11904: 0x95F0, 16105 - 11904: 0x975D, 16107 - 11904: 0x91E3, 16108 - 11904: 0x877E, 16112 - 11904: 0x98CC, 16115 - 11904: 0x9469, 16116 - 11904: 0x98CD, 16122 - 11904: 0x98CE, 16124 - 11904: 0x95FC, 16127 - 11904: 0x94A3, 16128 - 11904: 0x9662, 16132 - 11904: 0xFEB6, 16134 - 11904: 0x9463, 16135 - 11904: 0x8D47, 16142 - 11904: 0x98D0, 16211 - 11904: 0x98D1, 16216 - 11904: 0x9475, 16217 - 11904: 0xFAE0, 16227 - 11904: 0x9472, 16252 - 11904: 0x98D6, 16275 - 11904: 0x8AF0, 16320 - 11904: 0x98D9, 16328 - 11904: 0x8D5A, 16343 - 11904: 0x98DB, 16348 - 11904: 0x98DD, 16357 - 11904: 0x98A8, 16365 - 11904: 0x8A6D, 16377 - 11904: 0x8AFB, 16378 - 11904: 0x8AAE, 16388 - 11904: 0xFBC9, 16393 - 11904: 0x8C5D, 16413 - 11904: 0x98E4, 16441 - 11904: 0x98E6, 16453 - 11904: 0x98E8, 16467 - 11904: 0x8A4D, 16471 - 11904: 0x9257, 16482 - 11904: 0x95DF, 16485 - 11904: 0xA0AC, 16490 - 11904: 0x98EB, 16495 - 11904: 0x98EC, 16497 - 11904: 0x8CC3, 16552 - 11904: 0x98F4, 16564 - 11904: 0x87D9, 16571 - 11904: 0x8AB8, 16575 - 11904: 0x9EE7, 16584 - 11904: 0x94BC, 16600 - 11904: 0xFCD1, 16607 - 11904: 0x9CC6, 16632 - 11904: 0x8D4A, 16634 - 11904: 0x9E7E, 16642 - 11904: 0x8D44, 16643 - 11904: 0x98FE, 16644 - 11904: 0xFDE8, 16649 - 11904: 0x9940, 16654 - 11904: 0x94C9, 16689 - 11904: 0x87C6, 16690 - 11904: 0x94D3, 16743 - 11904: 0x9946, 16748 - 11904: 0x90C0, 16750 - 11904: 0x94D1, 16764 - 11904: 0x8D4E, 16767 - 11904: 0x9573, 16769 - 11904: 0x87CE, 16784 - 11904: 0x93C2, 16818 - 11904: 0x9948, 16836 - 11904: 0x994B, 16842 - 11904: 0x8E55, 16847 - 11904: 0x994E, 16859 - 11904: 0x8EFE, 16877 - 11904: 0x8D5F, 16879 - 11904: 0x8E59, 16889 - 11904: 0x94EC, 16913 - 11904: 0x94EF, 16931 - 11904: 0x8C60, 16960 - 11904: 0x8F74, 16992 - 11904: 0x9955, 17002 - 11904: 0x9544, 17014 - 11904: 0x8CCB, 17018 - 11904: 0x9956, 17036 - 11904: 0x9959, 17044 - 11904: 0x995B, 17058 - 11904: 0x8CC4, 17077 - 11904: 0xFA45, 17081 - 11904: 0x90B7, 17084 - 11904: 0x9743, 17140 - 11904: 0x95CD, 17147 - 11904: 0x97C9, 17148 - 11904: 0xFD50, 17162 - 11904: 0x87AA, 17195 - 11904: 0x8EB9, 17262 - 11904: 0x95C6, 17303 - 11904: 0x9967, 17306 - 11904: 0x8CE3, 17338 - 11904: 0x8AB9, 17345 - 11904: 0x8DFC, 17369 - 11904: 0x8A76, 17375 - 11904: 0x9D51, 17389 - 11904: 0x9973, 17392 - 11904: 0x8740, 17394 - 11904: 0x9D4F, 17409 - 11904: 0x997A, 17410 - 11904: 0x9564, 17427 - 11904: 0x99A1, 17445 - 11904: 0x99A5, 17453 - 11904: 0x99A7, 17530 - 11904: 0x8EED, 17551 - 11904: 0x99AD, 17553 - 11904: 0xC87E, 17567 - 11904: 0x946E, 17568 - 11904: 0x8F70, 17570 - 11904: 0xFAD0, 17584 - 11904: 0x99B3, 17591 - 11904: 0xA053, 17597 - 11904: 0x8D5E, 17600 - 11904: 0x965C, 17603 - 11904: 0x8CE0, 17605 - 11904: 0xFD7A, 17614 - 11904: 0x97FE, 17629 - 11904: 0x92BD, 17630 - 11904: 0x8D5D, 17631 - 11904: 0x97FD, 17633 - 11904: 0x87DB, 17636 - 11904: 0x8F64, 17641 - 11904: 0xFCF7, 17642 - 11904: 0x9562, 17643 - 11904: 0x97CD, 17644 - 11904: 0x9E64, 17652 - 11904: 0x924C, 17667 - 11904: 0x8EC9, 17668 - 11904: 0x99BC, 17673 - 11904: 0x9DA5, 17675 - 11904: 0x8F54, 17686 - 11904: 0x8F7C, 17691 - 11904: 0x8D55, 17693 - 11904: 0x8EA2, 17703 - 11904: 0x8F7A, 17710 - 11904: 0x97AE, 17715 - 11904: 0x96C8, 17718 - 11904: 0x8CE4, 17723 - 11904: 0x99C3, 17725 - 11904: 0x90D6, 17727 - 11904: 0x9CBE, 17731 - 11904: 0x8F76, 17745 - 11904: 0x9470, 17746 - 11904: 0xFB4B, 17749 - 11904: 0xFDCA, 17752 - 11904: 0x8CEF, 17756 - 11904: 0x8EC7, 17761 - 11904: 0x8D54, 17762 - 11904: 0xA0F9, 17770 - 11904: 0x8FA9, 17773 - 11904: 0x8D51, 17783 - 11904: 0x99C7, 17784 - 11904: 0x8744, 17797 - 11904: 0x90D7, 17830 - 11904: 0x8743, 17843 - 11904: 0x8747, 17882 - 11904: 0x8758, 17897 - 11904: 0x9EDF, 17898 - 11904: 0x8D59, 17923 - 11904: 0x8742, 17926 - 11904: 0x99CE, 17935 - 11904: 0x8FBA, 17941 - 11904: 0x8FEB, 17943 - 11904: 0x99CF, 18011 - 11904: 0x8FC2, 18042 - 11904: 0x92C9, 18048 - 11904: 0x97DC, 18081 - 11904: 0x875D, 18094 - 11904: 0x87CC, 18107 - 11904: 0x8D45, 18127 - 11904: 0x95B3, 18128 - 11904: 0x9C79, 18165 - 11904: 0x95B2, 18167 - 11904: 0x8D4C, 18195 - 11904: 0x8FDB, 18200 - 11904: 0x9BE3, 18230 - 11904: 0x874C, 18244 - 11904: 0x874D, 18254 - 11904: 0x9E7A, 18255 - 11904: 0x8757, 18300 - 11904: 0x9BEE, 18328 - 11904: 0x99DE, 18342 - 11904: 0xFAFA, 18389 - 11904: 0x8A52, 18413 - 11904: 0x99E1, 18420 - 11904: 0x8A67, 18432 - 11904: 0x8BB5, 18443 - 11904: 0x8AAC, 18487 - 11904: 0x99E9, 18525 - 11904: 0xFBCA, 18545 - 11904: 0x97DE, 18587 - 11904: 0x95D1, 18605 - 11904: 0x99F5, 18606 - 11904: 0xFC4A, 18640 - 11904: 0x9BA9, 18653 - 11904: 0xFBDC, 18669 - 11904: 0xFE56, 18675 - 11904: 0x9EA4, 18682 - 11904: 0x9D49, 18694 - 11904: 0x95DB, 18705 - 11904: 0x89C5, 18718 - 11904: 0x99F8, 18725 - 11904: 0x9664, 18730 - 11904: 0x9055, 18733 - 11904: 0x96D4, 18735 - 11904: 0x87C4, 18736 - 11904: 0x87AE, 18741 - 11904: 0x977C, 18748 - 11904: 0x964D, 18750 - 11904: 0x97E1, 18757 - 11904: 0x9A48, 18769 - 11904: 0x9A49, 18771 - 11904: 0xFE7D, 18789 - 11904: 0x90AA, 18794 - 11904: 0x9A50, 18802 - 11904: 0x9347, 18825 - 11904: 0x8ED8, 18849 - 11904: 0x90C9, 18855 - 11904: 0x9A55, 18911 - 11904: 0x90BC, 18917 - 11904: 0x9A58, 18919 - 11904: 0x8BB8, 18959 - 11904: 0x90D5, 18973 - 11904: 0x9641, 18980 - 11904: 0x9A5A, 18997 - 11904: 0x9A5C, 19094 - 11904: 0x97C2, 19108 - 11904: 0x875C, 19124 - 11904: 0x8ABB, 19128 - 11904: 0x9BAA, 19153 - 11904: 0x90F5, 19172 - 11904: 0x9A60, 19199 - 11904: 0x9145, 19216 - 11904: 0x8C58, 19225 - 11904: 0x9A63, 19232 - 11904: 0x8C49, 19244 - 11904: 0x8BB6, 19255 - 11904: 0xFCCF, 19311 - 11904: 0x966B, 19312 - 11904: 0x9A6E, 19314 - 11904: 0x914F, 19323 - 11904: 0x9746, 19326 - 11904: 0xA0E6, 19342 - 11904: 0x92D7, 19344 - 11904: 0x9675, 19347 - 11904: 0x93D4, 19350 - 11904: 0x91BB, 19351 - 11904: 0x9679, 19357 - 11904: 0x9A70, 19389 - 11904: 0x9678, 19390 - 11904: 0x91CD, 19392 - 11904: 0x9C4A, 19460 - 11904: 0xA06F, 19463 - 11904: 0xA06A, 19470 - 11904: 0x915F, 19506 - 11904: 0x8741, 19515 - 11904: 0x9FA5, 19518 - 11904: 0x89BA, 19520 - 11904: 0x874F, 19527 - 11904: 0x874E, 19543 - 11904: 0x8755, 19547 - 11904: 0x9ECD, 19565 - 11904: 0x9A79, 19575 - 11904: 0x8CF2, 19579 - 11904: 0x8D57, 19581 - 11904: 0x9DCE, 19585 - 11904: 0x8CD2, 19589 - 11904: 0x8759, 19620 - 11904: 0x9D73, 19630 - 11904: 0x96B9, 19632 - 11904: 0x96BC, 19639 - 11904: 0x9CD1, 19661 - 11904: 0x89B7, 19681 - 11904: 0x9EEE, 19682 - 11904: 0x8749, 19693 - 11904: 0xFB43, 19719 - 11904: 0x875B, 19721 - 11904: 0x9EC9, 19728 - 11904: 0xFBD3, 19764 - 11904: 0x91AE, 19830 - 11904: 0x8D58, 19831 - 11904: 0x8746, 19849 - 11904: 0x8D56, 19857 - 11904: 0x9D78, 19868 - 11904: 0x9D7B, 19968 - 11904: 0xA440, 19969 - 11904: 0xA442, 19971 - 11904: 0xA443, 19972 - 11904: 0x9EB3, 19975 - 11904: 0xC945, 19976 - 11904: 0xA456, 19977 - 11904: 0xA454, 19978 - 11904: 0xA457, 19979 - 11904: 0xA455, 19980 - 11904: 0xC946, 19981 - 11904: 0xA4A3, 19982 - 11904: 0xC94F, 19983 - 11904: 0xC94D, 19984 - 11904: 0xA4A2, 19985 - 11904: 0xA4A1, 19988 - 11904: 0xA542, 19989 - 11904: 0xA541, 19990 - 11904: 0xA540, 19992 - 11904: 0xA543, 19993 - 11904: 0xA4FE, 19994 - 11904: 0x9EB2, 19996 - 11904: 0x9DD6, 19998 - 11904: 0xA5E0, 19999 - 11904: 0xA5E1, 20001 - 11904: 0x994F, 20004 - 11904: 0x89CE, 20006 - 11904: 0xA8C3, 20008 - 11904: 0x8BC0, 20010 - 11904: 0x9FC4, 20011 - 11904: 0xA458, 20012 - 11904: 0x8BD4, 20013 - 11904: 0xA4A4, 20014 - 11904: 0xC950, 20015 - 11904: 0x8C72, 20016 - 11904: 0xA4A5, 20017 - 11904: 0xC963, 20018 - 11904: 0xA6EA, 20019 - 11904: 0xCBB1, 20022 - 11904: 0xC6BF, 20023 - 11904: 0x8BF9, 20024 - 11904: 0xA459, 20025 - 11904: 0xA4A6, 20027 - 11904: 0xA544, 20028 - 11904: 0xC964, 20029 - 11904: 0x8946, 20031 - 11904: 0xC6C0, 20034 - 11904: 0xC940, 20035 - 11904: 0xA444, 20037 - 11904: 0xA45B, 20039 - 11904: 0xC947, 20040 - 11904: 0xA45C, 20041 - 11904: 0xFAE5, 20043 - 11904: 0xA4A7, 20045 - 11904: 0xA545, 20046 - 11904: 0xA547, 20047 - 11904: 0xA546, 20050 - 11904: 0xA5E2, 20051 - 11904: 0xA5E3, 20054 - 11904: 0xA8C4, 20056 - 11904: 0xADBC, 20057 - 11904: 0xA441, 20058 - 11904: 0xC87B, 20059 - 11904: 0x8BC6, 20060 - 11904: 0xC941, 20061 - 11904: 0xA445, 20062 - 11904: 0xA45E, 20063 - 11904: 0xA45D, 20073 - 11904: 0xA5E4, 20074 - 11904: 0x9C57, 20083 - 11904: 0xA8C5, 20088 - 11904: 0x9AFB, 20094 - 11904: 0xB0AE, 20095 - 11904: 0xD44B, 20096 - 11904: 0x89D0, 20097 - 11904: 0x89CF, 20098 - 11904: 0xB6C3, 20099 - 11904: 0xDCB1, 20100 - 11904: 0xDCB2, 20101 - 11904: 0xC6C1, 20102 - 11904: 0xA446, 20103 - 11904: 0x89D1, 20104 - 11904: 0xA4A9, 20105 - 11904: 0x89E2, 20107 - 11904: 0xA8C6, 20108 - 11904: 0xA447, 20109 - 11904: 0xC948, 20110 - 11904: 0xA45F, 20113 - 11904: 0xA4AA, 20114 - 11904: 0xA4AC, 20115 - 11904: 0xC951, 20116 - 11904: 0xA4AD, 20117 - 11904: 0xA4AB, 20120 - 11904: 0x927E, 20121 - 11904: 0xA5E5, 20122 - 11904: 0x9DBA, 20123 - 11904: 0xA8C7, 20126 - 11904: 0xA8C8, 20127 - 11904: 0xAB45, 20128 - 11904: 0xC6C2, 20129 - 11904: 0xA460, 20130 - 11904: 0xA4AE, 20131 - 11904: 0x8C6F, 20132 - 11904: 0xA5E6, 20133 - 11904: 0xA5E8, 20134 - 11904: 0xA5E7, 20136 - 11904: 0xA6EB, 20139 - 11904: 0xA8C9, 20140 - 11904: 0xA8CA, 20141 - 11904: 0xAB46, 20142 - 11904: 0xAB47, 20147 - 11904: 0xADBD, 20150 - 11904: 0xDCB3, 20151 - 11904: 0xFBF8, 20153 - 11904: 0xF6D6, 20154 - 11904: 0xA448, 20155 - 11904: 0x8BC7, 20156 - 11904: 0x926B, 20159 - 11904: 0x89D2, 20160 - 11904: 0xA4B0, 20161 - 11904: 0xA4AF, 20162 - 11904: 0xC952, 20163 - 11904: 0xA4B1, 20164 - 11904: 0xA4B7, 20166 - 11904: 0xA4B2, 20167 - 11904: 0xA4B3, 20168 - 11904: 0xC954, 20169 - 11904: 0xC953, 20170 - 11904: 0xA4B5, 20171 - 11904: 0xA4B6, 20173 - 11904: 0xA4B4, 20174 - 11904: 0x9FCF, 20180 - 11904: 0xA54A, 20181 - 11904: 0xA54B, 20182 - 11904: 0xA54C, 20183 - 11904: 0xA54D, 20184 - 11904: 0xA549, 20185 - 11904: 0xA550, 20186 - 11904: 0xC96A, 20188 - 11904: 0xC966, 20189 - 11904: 0xC969, 20190 - 11904: 0xA551, 20191 - 11904: 0xA561, 20193 - 11904: 0xC968, 20195 - 11904: 0xA54E, 20196 - 11904: 0xA54F, 20197 - 11904: 0xA548, 20200 - 11904: 0xC965, 20201 - 11904: 0xC967, 20202 - 11904: 0x9DA9, 20203 - 11904: 0x89D3, 20206 - 11904: 0x99E2, 20208 - 11904: 0xA5F5, 20209 - 11904: 0xC9B0, 20210 - 11904: 0xA5F2, 20211 - 11904: 0xA5F6, 20212 - 11904: 0xC9BA, 20213 - 11904: 0xC9AE, 20214 - 11904: 0xA5F3, 20215 - 11904: 0xC9B2, 20216 - 11904: 0x9267, 20219 - 11904: 0xA5F4, 20221 - 11904: 0xA5F7, 20223 - 11904: 0xA5E9, 20224 - 11904: 0xC9B1, 20225 - 11904: 0xA5F8, 20226 - 11904: 0xC9B5, 20227 - 11904: 0x92A4, 20228 - 11904: 0xC9B9, 20229 - 11904: 0xC9B6, 20232 - 11904: 0xC9B3, 20233 - 11904: 0xA5EA, 20234 - 11904: 0xA5EC, 20235 - 11904: 0xA5F9, 20237 - 11904: 0xA5EE, 20238 - 11904: 0xC9AB, 20239 - 11904: 0xA5F1, 20240 - 11904: 0xA5EF, 20241 - 11904: 0xA5F0, 20242 - 11904: 0xC9BB, 20243 - 11904: 0xC9B8, 20244 - 11904: 0xC9AF, 20245 - 11904: 0xA5ED, 20247 - 11904: 0x8C73, 20248 - 11904: 0xC9AC, 20249 - 11904: 0xA5EB, 20250 - 11904: 0x894E, 20253 - 11904: 0xC9B4, 20258 - 11904: 0xC9B7, 20264 - 11904: 0x894F, 20265 - 11904: 0x9278, 20268 - 11904: 0xC9AD, 20269 - 11904: 0xCA66, 20271 - 11904: 0xA742, 20272 - 11904: 0xA6F4, 20274 - 11904: 0x91B6, 20275 - 11904: 0xCA67, 20276 - 11904: 0xA6F1, 20278 - 11904: 0xA744, 20279 - 11904: 0x89D4, 20280 - 11904: 0xA6F9, 20281 - 11904: 0x9FD2, 20282 - 11904: 0xA6F8, 20283 - 11904: 0xCA5B, 20284 - 11904: 0xA6FC, 20285 - 11904: 0xA6F7, 20286 - 11904: 0xCA60, 20287 - 11904: 0xCA68, 20289 - 11904: 0xCA64, 20290 - 11904: 0x92A7, 20291 - 11904: 0xA6FA, 20293 - 11904: 0x95A2, 20294 - 11904: 0xA6FD, 20295 - 11904: 0xA6EE, 20296 - 11904: 0xA747, 20297 - 11904: 0xCA5D, 20299 - 11904: 0x926E, 20300 - 11904: 0xCBBD, 20301 - 11904: 0xA6EC, 20302 - 11904: 0xA743, 20303 - 11904: 0xA6ED, 20304 - 11904: 0xA6F5, 20305 - 11904: 0xA6F6, 20306 - 11904: 0xCA62, 20307 - 11904: 0xCA5E, 20308 - 11904: 0xA6FB, 20309 - 11904: 0xA6F3, 20310 - 11904: 0xCA5A, 20311 - 11904: 0xA6EF, 20312 - 11904: 0xCA65, 20313 - 11904: 0xA745, 20314 - 11904: 0xA748, 20315 - 11904: 0xA6F2, 20316 - 11904: 0xA740, 20317 - 11904: 0xA746, 20318 - 11904: 0xA6F0, 20319 - 11904: 0xCA63, 20320 - 11904: 0xA741, 20321 - 11904: 0xCA69, 20322 - 11904: 0xCA5C, 20323 - 11904: 0xA6FE, 20324 - 11904: 0xCA5F, 20327 - 11904: 0xCA61, 20329 - 11904: 0xA8D8, 20330 - 11904: 0xCBBF, 20331 - 11904: 0xCBCB, 20332 - 11904: 0xA8D0, 20334 - 11904: 0xCBCC, 20335 - 11904: 0xA8CB, 20336 - 11904: 0xA8D5, 20338 - 11904: 0x96EA, 20339 - 11904: 0xA8CE, 20340 - 11904: 0xCBB9, 20341 - 11904: 0xA8D6, 20342 - 11904: 0xCBB8, 20343 - 11904: 0xCBBC, 20344 - 11904: 0xCBC3, 20345 - 11904: 0xCBC1, 20346 - 11904: 0xA8DE, 20347 - 11904: 0xA8D9, 20348 - 11904: 0xCBB3, 20349 - 11904: 0xCBB5, 20350 - 11904: 0xA8DB, 20351 - 11904: 0xA8CF, 20352 - 11904: 0xCBB6, 20353 - 11904: 0xCBC2, 20354 - 11904: 0xCBC9, 20355 - 11904: 0xA8D4, 20356 - 11904: 0xCBBB, 20357 - 11904: 0xCBB4, 20358 - 11904: 0xA8D3, 20359 - 11904: 0xCBB7, 20360 - 11904: 0xA8D7, 20361 - 11904: 0xCBBA, 20362 - 11904: 0x926F, 20363 - 11904: 0xA8D2, 20365 - 11904: 0xA8CD, 20367 - 11904: 0xA8DC, 20368 - 11904: 0xCBC4, 20369 - 11904: 0xA8DD, 20370 - 11904: 0xCBC8, 20372 - 11904: 0xCBC6, 20373 - 11904: 0xCBCA, 20374 - 11904: 0xA8DA, 20375 - 11904: 0xCBBE, 20376 - 11904: 0xCBB2, 20378 - 11904: 0xCBC0, 20379 - 11904: 0xA8D1, 20380 - 11904: 0xCBC5, 20381 - 11904: 0xA8CC, 20382 - 11904: 0xCBC7, 20386 - 11904: 0x92A3, 20392 - 11904: 0x8950, 20395 - 11904: 0xFA57, 20398 - 11904: 0xAB56, 20399 - 11904: 0xAB4A, 20400 - 11904: 0x9866, 20402 - 11904: 0xCDE0, 20403 - 11904: 0xCDE8, 20404 - 11904: 0x8CF8, 20405 - 11904: 0xAB49, 20406 - 11904: 0xAB51, 20407 - 11904: 0xAB5D, 20409 - 11904: 0xCDEE, 20410 - 11904: 0xCDEC, 20411 - 11904: 0xCDE7, 20413 - 11904: 0x89D6, 20415 - 11904: 0xAB4B, 20416 - 11904: 0xCDED, 20417 - 11904: 0xCDE3, 20418 - 11904: 0xAB59, 20419 - 11904: 0xAB50, 20420 - 11904: 0xAB58, 20421 - 11904: 0xCDDE, 20423 - 11904: 0xCDEA, 20424 - 11904: 0x98B2, 20425 - 11904: 0xCDE1, 20426 - 11904: 0xAB54, 20427 - 11904: 0xCDE2, 20428 - 11904: 0x92AB, 20429 - 11904: 0xCDDD, 20430 - 11904: 0xAB5B, 20431 - 11904: 0xAB4E, 20432 - 11904: 0xAB57, 20433 - 11904: 0xAB4D, 20435 - 11904: 0xCDDF, 20436 - 11904: 0xCDE4, 20438 - 11904: 0xCDEB, 20439 - 11904: 0xAB55, 20440 - 11904: 0xAB52, 20441 - 11904: 0xCDE6, 20442 - 11904: 0xAB5A, 20443 - 11904: 0xCDE9, 20444 - 11904: 0xCDE5, 20445 - 11904: 0xAB4F, 20446 - 11904: 0xAB5C, 20447 - 11904: 0xAB53, 20448 - 11904: 0xAB4C, 20449 - 11904: 0xAB48, 20452 - 11904: 0x96DE, 20453 - 11904: 0x92AC, 20460 - 11904: 0xCDEF, 20462 - 11904: 0xADD7, 20463 - 11904: 0xADC1, 20464 - 11904: 0x8C70, 20465 - 11904: 0xADD1, 20466 - 11904: 0x9F6E, 20467 - 11904: 0xADD6, 20468 - 11904: 0xD0D0, 20469 - 11904: 0xD0CF, 20470 - 11904: 0xD0D4, 20471 - 11904: 0xD0D5, 20472 - 11904: 0xADC4, 20473 - 11904: 0x8EF2, 20474 - 11904: 0xADCD, 20477 - 11904: 0x9F6C, 20478 - 11904: 0xADDA, 20480 - 11904: 0xADCE, 20483 - 11904: 0x89D8, 20485 - 11904: 0xD0C9, 20486 - 11904: 0xADC7, 20487 - 11904: 0xD0CA, 20488 - 11904: 0xFA59, 20489 - 11904: 0xADDC, 20491 - 11904: 0xADD3, 20492 - 11904: 0xADBE, 20493 - 11904: 0xADBF, 20494 - 11904: 0xD0DD, 20495 - 11904: 0xB0BF, 20497 - 11904: 0xADCC, 20498 - 11904: 0xADCB, 20499 - 11904: 0xD0CB, 20500 - 11904: 0xADCF, 20501 - 11904: 0xD45B, 20502 - 11904: 0xADC6, 20503 - 11904: 0xD0D6, 20504 - 11904: 0xADD5, 20505 - 11904: 0xADD4, 20506 - 11904: 0xADCA, 20507 - 11904: 0xD0CE, 20508 - 11904: 0xD0D7, 20510 - 11904: 0xD0C8, 20511 - 11904: 0xADC9, 20512 - 11904: 0xD0D8, 20513 - 11904: 0xADD2, 20514 - 11904: 0xD0CC, 20515 - 11904: 0xADC0, 20517 - 11904: 0xADC3, 20518 - 11904: 0xADC2, 20519 - 11904: 0xD0D9, 20520 - 11904: 0xADD0, 20521 - 11904: 0xFA5F, 20522 - 11904: 0xADD9, 20523 - 11904: 0xADDB, 20524 - 11904: 0xD0D3, 20525 - 11904: 0xADD8, 20526 - 11904: 0x92A8, 20527 - 11904: 0xD0DB, 20528 - 11904: 0xD0CD, 20529 - 11904: 0xD0DC, 20531 - 11904: 0xD0D1, 20532 - 11904: 0x9163, 20533 - 11904: 0xD0DA, 20535 - 11904: 0xD0D2, 20539 - 11904: 0x8C40, 20540 - 11904: 0xADC8, 20544 - 11904: 0xD463, 20545 - 11904: 0xD457, 20547 - 11904: 0xB0B3, 20549 - 11904: 0xD45C, 20550 - 11904: 0xD462, 20551 - 11904: 0xB0B2, 20552 - 11904: 0xD455, 20553 - 11904: 0xB0B6, 20554 - 11904: 0xD459, 20555 - 11904: 0xD452, 20556 - 11904: 0xB0B4, 20557 - 11904: 0xD456, 20558 - 11904: 0xB0B9, 20559 - 11904: 0xB0BE, 20561 - 11904: 0xD467, 20563 - 11904: 0xD451, 20565 - 11904: 0xB0BA, 20566 - 11904: 0x9F73, 20567 - 11904: 0xD466, 20568 - 11904: 0x92AD, 20570 - 11904: 0xB0B5, 20571 - 11904: 0xD458, 20572 - 11904: 0xB0B1, 20573 - 11904: 0xD453, 20574 - 11904: 0xD44F, 20575 - 11904: 0xD45D, 20576 - 11904: 0xD450, 20577 - 11904: 0xD44E, 20578 - 11904: 0xD45A, 20579 - 11904: 0xD460, 20580 - 11904: 0xD461, 20581 - 11904: 0xB0B7, 20582 - 11904: 0x9BE9, 20584 - 11904: 0xD85B, 20585 - 11904: 0xD45E, 20586 - 11904: 0xD44D, 20587 - 11904: 0xD45F, 20588 - 11904: 0x92A9, 20589 - 11904: 0xB0C1, 20590 - 11904: 0xD464, 20591 - 11904: 0xB0C0, 20592 - 11904: 0xD44C, 20594 - 11904: 0xD454, 20595 - 11904: 0xD465, 20596 - 11904: 0xB0BC, 20597 - 11904: 0xB0BB, 20598 - 11904: 0xB0B8, 20599 - 11904: 0xB0BD, 20602 - 11904: 0xB0AF, 20605 - 11904: 0xFA66, 20608 - 11904: 0xB3C8, 20609 - 11904: 0x92AA, 20610 - 11904: 0xD85E, 20611 - 11904: 0xD857, 20613 - 11904: 0xB3C5, 20615 - 11904: 0xD85F, 20616 - 11904: 0x89D9, 20619 - 11904: 0xD855, 20620 - 11904: 0xD858, 20621 - 11904: 0xB3C4, 20622 - 11904: 0xD859, 20624 - 11904: 0xFD56, 20625 - 11904: 0xB3C7, 20626 - 11904: 0xD85D, 20628 - 11904: 0xD853, 20629 - 11904: 0xD852, 20630 - 11904: 0xB3C9, 20632 - 11904: 0xB3CA, 20633 - 11904: 0xB3C6, 20634 - 11904: 0xB3CB, 20635 - 11904: 0xD851, 20636 - 11904: 0xD85C, 20637 - 11904: 0xD85A, 20638 - 11904: 0xD854, 20642 - 11904: 0xB3C3, 20643 - 11904: 0xD856, 20646 - 11904: 0x9FA8, 20652 - 11904: 0xB6CA, 20653 - 11904: 0xB6C4, 20654 - 11904: 0xDCB7, 20655 - 11904: 0xB6CD, 20656 - 11904: 0xDCBD, 20657 - 11904: 0xDCC0, 20658 - 11904: 0xB6C6, 20659 - 11904: 0xB6C7, 20660 - 11904: 0xDCBA, 20661 - 11904: 0xB6C5, 20662 - 11904: 0xDCC3, 20663 - 11904: 0xB6CB, 20664 - 11904: 0xDCC4, 20666 - 11904: 0xDCBF, 20667 - 11904: 0xB6CC, 20668 - 11904: 0x8C71, 20669 - 11904: 0xDCB4, 20670 - 11904: 0xB6C9, 20671 - 11904: 0xDCB5, 20673 - 11904: 0xDCBE, 20674 - 11904: 0xDCBC, 20676 - 11904: 0xDCB8, 20677 - 11904: 0xB6C8, 20678 - 11904: 0xDCB6, 20679 - 11904: 0xB6CE, 20680 - 11904: 0xDCBB, 20681 - 11904: 0xDCC2, 20682 - 11904: 0xDCB9, 20683 - 11904: 0xDCC1, 20685 - 11904: 0x92A1, 20686 - 11904: 0xB9B6, 20687 - 11904: 0xB9B3, 20688 - 11904: 0x90E3, 20689 - 11904: 0xB9B4, 20691 - 11904: 0xE0F9, 20692 - 11904: 0xE0F1, 20693 - 11904: 0xB9B2, 20694 - 11904: 0xB9AF, 20695 - 11904: 0xE0F2, 20697 - 11904: 0xA0A6, 20698 - 11904: 0xB9B1, 20699 - 11904: 0xE0F5, 20701 - 11904: 0xE0F7, 20703 - 11904: 0x94AB, 20704 - 11904: 0xE0FE, 20705 - 11904: 0xFC72, 20707 - 11904: 0xE0FD, 20708 - 11904: 0xE0F8, 20709 - 11904: 0xB9AE, 20710 - 11904: 0xE0F0, 20711 - 11904: 0xB9AC, 20712 - 11904: 0xE0F3, 20713 - 11904: 0xB9B7, 20714 - 11904: 0xE0F6, 20716 - 11904: 0xE0FA, 20717 - 11904: 0xB9B0, 20718 - 11904: 0xB9AD, 20719 - 11904: 0xE0FC, 20720 - 11904: 0xE0FB, 20721 - 11904: 0xB9B5, 20723 - 11904: 0xE0F4, 20724 - 11904: 0x97C4, 20725 - 11904: 0xBBF8, 20726 - 11904: 0xE4EC, 20728 - 11904: 0xE4E9, 20729 - 11904: 0xBBF9, 20731 - 11904: 0xBBF7, 20732 - 11904: 0x92AE, 20733 - 11904: 0xE4F0, 20734 - 11904: 0xE4ED, 20735 - 11904: 0xE4E6, 20736 - 11904: 0xBBF6, 20737 - 11904: 0xFA67, 20738 - 11904: 0xBBFA, 20739 - 11904: 0xE4E7, 20740 - 11904: 0xBBF5, 20741 - 11904: 0xBBFD, 20742 - 11904: 0xE4EA, 20743 - 11904: 0xE4EB, 20744 - 11904: 0xBBFB, 20745 - 11904: 0xBBFC, 20746 - 11904: 0xE4F1, 20747 - 11904: 0xE4EE, 20748 - 11904: 0xE4EF, 20749 - 11904: 0x92A2, 20750 - 11904: 0xFA69, 20752 - 11904: 0xBEAA, 20753 - 11904: 0xE8F8, 20754 - 11904: 0xBEA7, 20755 - 11904: 0xE8F5, 20756 - 11904: 0xBEA9, 20757 - 11904: 0xBEAB, 20759 - 11904: 0xE8F6, 20760 - 11904: 0xBEA8, 20762 - 11904: 0xE8F7, 20764 - 11904: 0xE8F4, 20767 - 11904: 0xC076, 20768 - 11904: 0xECBD, 20769 - 11904: 0xC077, 20770 - 11904: 0xECBB, 20772 - 11904: 0xECBC, 20773 - 11904: 0xECBA, 20774 - 11904: 0xECB9, 20777 - 11904: 0xECBE, 20778 - 11904: 0xC075, 20779 - 11904: 0x9268, 20781 - 11904: 0xEFB8, 20782 - 11904: 0xEFB9, 20784 - 11904: 0xE4E8, 20785 - 11904: 0xEFB7, 20786 - 11904: 0xC078, 20787 - 11904: 0xC35F, 20788 - 11904: 0xF1EB, 20789 - 11904: 0xF1EC, 20791 - 11904: 0xC4D7, 20792 - 11904: 0xC4D8, 20793 - 11904: 0xF5C1, 20794 - 11904: 0xF5C0, 20795 - 11904: 0xC56C, 20796 - 11904: 0xC56B, 20797 - 11904: 0xF7D0, 20799 - 11904: 0xA449, 20800 - 11904: 0xA461, 20801 - 11904: 0xA4B9, 20803 - 11904: 0xA4B8, 20804 - 11904: 0xA553, 20805 - 11904: 0xA552, 20806 - 11904: 0xA5FC, 20807 - 11904: 0xA5FB, 20808 - 11904: 0xA5FD, 20809 - 11904: 0xA5FA, 20811 - 11904: 0xA74A, 20812 - 11904: 0xA749, 20813 - 11904: 0xA74B, 20818 - 11904: 0xA8E0, 20820 - 11904: 0xA8DF, 20821 - 11904: 0xA8E1, 20822 - 11904: 0x8951, 20823 - 11904: 0xAB5E, 20825 - 11904: 0xA259, 20826 - 11904: 0xD0DE, 20827 - 11904: 0xA25A, 20828 - 11904: 0xB0C2, 20829 - 11904: 0xA25C, 20830 - 11904: 0xA25B, 20831 - 11904: 0xD860, 20832 - 11904: 0xFA6F, 20833 - 11904: 0xA25D, 20834 - 11904: 0xB9B8, 20835 - 11904: 0xA25E, 20837 - 11904: 0xA44A, 20839 - 11904: 0xA4BA, 20840 - 11904: 0xA5FE, 20841 - 11904: 0xA8E2, 20842 - 11904: 0xFA71, 20843 - 11904: 0xA44B, 20844 - 11904: 0xA4BD, 20845 - 11904: 0xA4BB, 20846 - 11904: 0xA4BC, 20849 - 11904: 0xA640, 20852 - 11904: 0x8952, 20853 - 11904: 0xA74C, 20854 - 11904: 0xA8E4, 20855 - 11904: 0xA8E3, 20856 - 11904: 0xA8E5, 20857 - 11904: 0x945A, 20860 - 11904: 0xADDD, 20864 - 11904: 0xBEAC, 20866 - 11904: 0xC6C3, 20870 - 11904: 0x89DD, 20871 - 11904: 0xC94E, 20872 - 11904: 0xC8A2, 20873 - 11904: 0xA554, 20874 - 11904: 0xA555, 20877 - 11904: 0xA641, 20879 - 11904: 0xCA6A, 20881 - 11904: 0xAB60, 20882 - 11904: 0xAB5F, 20883 - 11904: 0xD0E0, 20884 - 11904: 0xD0DF, 20885 - 11904: 0xB0C3, 20886 - 11904: 0xC6C4, 20887 - 11904: 0xA4BE, 20888 - 11904: 0xC955, 20890 - 11904: 0x9E52, 20892 - 11904: 0x8953, 20894 - 11904: 0xCBCD, 20896 - 11904: 0xAB61, 20898 - 11904: 0xADE0, 20900 - 11904: 0xADDE, 20901 - 11904: 0xADDF, 20903 - 11904: 0x9E55, 20904 - 11904: 0x92BA, 20906 - 11904: 0xBEAD, 20907 - 11904: 0xC6C5, 20908 - 11904: 0xA556, 20910 - 11904: 0x8C5B, 20912 - 11904: 0xA642, 20913 - 11904: 0xC9BC, 20914 - 11904: 0xFA7D, 20915 - 11904: 0xFAA8, 20916 - 11904: 0x9A68, 20917 - 11904: 0xFA47, 20918 - 11904: 0xA74D, 20919 - 11904: 0xA74E, 20920 - 11904: 0xFA7E, 20921 - 11904: 0xCA6B, 20924 - 11904: 0xCBCE, 20925 - 11904: 0xA8E6, 20926 - 11904: 0xCBCF, 20931 - 11904: 0x92BB, 20932 - 11904: 0xD0E2, 20933 - 11904: 0xD0E3, 20934 - 11904: 0xADE3, 20935 - 11904: 0xFDB6, 20936 - 11904: 0xD0E4, 20937 - 11904: 0xFAA2, 20938 - 11904: 0xD0E1, 20939 - 11904: 0xADE4, 20940 - 11904: 0xADE2, 20941 - 11904: 0xADE1, 20942 - 11904: 0xD0E5, 20943 - 11904: 0xFAA3, 20944 - 11904: 0xD468, 20945 - 11904: 0xFAA4, 20946 - 11904: 0x9BB4, 20947 - 11904: 0xFAA6, 20948 - 11904: 0xD861, 20951 - 11904: 0xDCC5, 20952 - 11904: 0xE140, 20955 - 11904: 0x89DF, 20956 - 11904: 0xBBFE, 20957 - 11904: 0xBEAE, 20958 - 11904: 0xE8F9, 20959 - 11904: 0xFDDB, 20960 - 11904: 0xA44C, 20961 - 11904: 0xA45A, 20962 - 11904: 0xFAA9, 20964 - 11904: 0x8954, 20973 - 11904: 0xFAAB, 20976 - 11904: 0xB0C4, 20977 - 11904: 0xB3CD, 20979 - 11904: 0xB9B9, 20980 - 11904: 0xFC7A, 20981 - 11904: 0xC942, 20982 - 11904: 0xA4BF, 20984 - 11904: 0xA559, 20985 - 11904: 0xA557, 20986 - 11904: 0xA558, 20988 - 11904: 0x89E0, 20989 - 11904: 0xA8E7, 20990 - 11904: 0x9F4F, 20992 - 11904: 0xA44D, 20993 - 11904: 0xA44E, 20994 - 11904: 0xC87D, 20995 - 11904: 0xA462, 20997 - 11904: 0x89E1, 20998 - 11904: 0xA4C0, 20999 - 11904: 0xA4C1, 21000 - 11904: 0xA4C2, 21001 - 11904: 0xC9BE, 21002 - 11904: 0xA55A, 21003 - 11904: 0xFAB0, 21004 - 11904: 0xC96B, 21006 - 11904: 0xA646, 21008 - 11904: 0xC9BF, 21009 - 11904: 0xA644, 21010 - 11904: 0xA645, 21011 - 11904: 0xC9BD, 21014 - 11904: 0xA647, 21015 - 11904: 0xA643, 21020 - 11904: 0xCA6C, 21021 - 11904: 0xAAEC, 21022 - 11904: 0xCA6D, 21023 - 11904: 0x9FCD, 21024 - 11904: 0xA0E7, 21025 - 11904: 0xCA6E, 21028 - 11904: 0xA750, 21029 - 11904: 0xA74F, 21030 - 11904: 0xFAB1, 21031 - 11904: 0x89A6, 21032 - 11904: 0xA753, 21033 - 11904: 0xA751, 21034 - 11904: 0xA752, 21038 - 11904: 0xA8ED, 21040 - 11904: 0xA8EC, 21041 - 11904: 0xCBD4, 21042 - 11904: 0xCBD1, 21043 - 11904: 0xCBD2, 21044 - 11904: 0x9EFA, 21045 - 11904: 0xCBD0, 21046 - 11904: 0xA8EE, 21047 - 11904: 0xA8EA, 21048 - 11904: 0xA8E9, 21050 - 11904: 0xA8EB, 21051 - 11904: 0xA8E8, 21052 - 11904: 0xFAB2, 21057 - 11904: 0xA8EF, 21059 - 11904: 0xAB63, 21060 - 11904: 0xCDF0, 21062 - 11904: 0xCBD3, 21063 - 11904: 0xAB68, 21065 - 11904: 0xCDF1, 21066 - 11904: 0xAB64, 21067 - 11904: 0xAB67, 21068 - 11904: 0xAB66, 21069 - 11904: 0xAB65, 21070 - 11904: 0xAB62, 21071 - 11904: 0x87BC, 21074 - 11904: 0xD0E8, 21076 - 11904: 0xADE7, 21077 - 11904: 0xD0EB, 21078 - 11904: 0xADE5, 21079 - 11904: 0xFAB4, 21081 - 11904: 0x92C4, 21082 - 11904: 0xD0E7, 21083 - 11904: 0xADE8, 21084 - 11904: 0xADE6, 21085 - 11904: 0xADE9, 21086 - 11904: 0xD0E9, 21087 - 11904: 0xD0EA, 21088 - 11904: 0x9F6F, 21089 - 11904: 0xD0E6, 21090 - 11904: 0xD0EC, 21096 - 11904: 0x8BB0, 21097 - 11904: 0xB3D1, 21098 - 11904: 0xB0C5, 21099 - 11904: 0xD469, 21100 - 11904: 0xD46B, 21101 - 11904: 0xD46A, 21102 - 11904: 0xD46C, 21103 - 11904: 0xB0C6, 21106 - 11904: 0xB3CE, 21107 - 11904: 0x9FAC, 21108 - 11904: 0xB3CF, 21109 - 11904: 0xB3D0, 21111 - 11904: 0xB6D0, 21112 - 11904: 0xDCC7, 21113 - 11904: 0x89E3, 21114 - 11904: 0xDCC6, 21115 - 11904: 0xDCC8, 21116 - 11904: 0xDCC9, 21117 - 11904: 0xB6D1, 21119 - 11904: 0xB6CF, 21120 - 11904: 0xE141, 21121 - 11904: 0xE142, 21122 - 11904: 0xB9BB, 21123 - 11904: 0xB9BA, 21124 - 11904: 0xE35A, 21127 - 11904: 0xBC40, 21128 - 11904: 0xBC41, 21129 - 11904: 0xBC42, 21130 - 11904: 0xBC44, 21131 - 11904: 0xE4F2, 21132 - 11904: 0xE4F3, 21133 - 11904: 0xBC43, 21135 - 11904: 0x9BD3, 21136 - 11904: 0x89E4, 21137 - 11904: 0xBEAF, 21139 - 11904: 0xBEB0, 21140 - 11904: 0xFAB5, 21142 - 11904: 0xF1ED, 21143 - 11904: 0xF5C3, 21144 - 11904: 0xF5C2, 21145 - 11904: 0xF7D1, 21146 - 11904: 0x9FD5, 21147 - 11904: 0xA44F, 21151 - 11904: 0xA55C, 21152 - 11904: 0xA55B, 21153 - 11904: 0x8955, 21155 - 11904: 0xA648, 21156 - 11904: 0x92C5, 21158 - 11904: 0xC9C0, 21160 - 11904: 0x8956, 21161 - 11904: 0xA755, 21162 - 11904: 0xA756, 21163 - 11904: 0xA754, 21164 - 11904: 0xA757, 21165 - 11904: 0xCA6F, 21166 - 11904: 0xCA70, 21173 - 11904: 0xFAB3, 21177 - 11904: 0xFAB6, 21179 - 11904: 0xA8F1, 21180 - 11904: 0xCBD5, 21182 - 11904: 0xA8F0, 21184 - 11904: 0xCDF2, 21185 - 11904: 0xAB6C, 21186 - 11904: 0xCDF3, 21187 - 11904: 0xAB6B, 21189 - 11904: 0xFAB7, 21191 - 11904: 0xAB69, 21193 - 11904: 0xAB6A, 21196 - 11904: 0x9EDC, 21197 - 11904: 0xD0ED, 21200 - 11904: 0xFBC4, 21201 - 11904: 0x9F71, 21202 - 11904: 0xB0C7, 21203 - 11904: 0xD46E, 21205 - 11904: 0xB0CA, 21206 - 11904: 0xD46D, 21207 - 11904: 0xB1E5, 21208 - 11904: 0xB0C9, 21209 - 11904: 0xB0C8, 21211 - 11904: 0xB3D4, 21213 - 11904: 0xB3D3, 21214 - 11904: 0xB3D2, 21215 - 11904: 0xB6D2, 21216 - 11904: 0xFABA, 21217 - 11904: 0x92C7, 21218 - 11904: 0xB6D5, 21219 - 11904: 0xB6D6, 21220 - 11904: 0xB6D4, 21222 - 11904: 0xB6D3, 21225 - 11904: 0xE143, 21227 - 11904: 0xE144, 21231 - 11904: 0xE4F5, 21232 - 11904: 0xBC45, 21233 - 11904: 0xE4F4, 21235 - 11904: 0xBEB1, 21236 - 11904: 0xECBF, 21237 - 11904: 0xC079, 21239 - 11904: 0xF1EE, 21240 - 11904: 0xC455, 21241 - 11904: 0xC6C6, 21242 - 11904: 0xA463, 21243 - 11904: 0xA4C3, 21244 - 11904: 0xC956, 21246 - 11904: 0xA4C4, 21247 - 11904: 0xA4C5, 21249 - 11904: 0x9A4C, 21253 - 11904: 0xFABD, 21254 - 11904: 0xA55E, 21256 - 11904: 0xA649, 21257 - 11904: 0xCA71, 21258 - 11904: 0xCBD6, 21259 - 11904: 0xCBD7, 21261 - 11904: 0xAB6D, 21262 - 11904: 0xD0EE, 21263 - 11904: 0xB0CC, 21264 - 11904: 0xB0CB, 21265 - 11904: 0xD863, 21266 - 11904: 0xD862, 21269 - 11904: 0xA450, 21270 - 11904: 0xA4C6, 21271 - 11904: 0xA55F, 21273 - 11904: 0xB0CD, 21274 - 11904: 0xC943, 21276 - 11904: 0xC96C, 21277 - 11904: 0xA560, 21279 - 11904: 0xC9C2, 21280 - 11904: 0xA64B, 21281 - 11904: 0xA64A, 21282 - 11904: 0xC9C1, 21283 - 11904: 0xA758, 21284 - 11904: 0x8C68, 21287 - 11904: 0x89E5, 21290 - 11904: 0xADEA, 21292 - 11904: 0x9F7D, 21293 - 11904: 0xD46F, 21295 - 11904: 0xB6D7, 21296 - 11904: 0xE145, 21297 - 11904: 0xB9BC, 21298 - 11904: 0xA0A9, 21299 - 11904: 0xFAC4, 21300 - 11904: 0xE8FA, 21303 - 11904: 0xF3FD, 21304 - 11904: 0xC6C7, 21305 - 11904: 0xA4C7, 21307 - 11904: 0x8957, 21308 - 11904: 0xCBD8, 21309 - 11904: 0xCDF4, 21310 - 11904: 0xB0D0, 21311 - 11904: 0xB0CE, 21312 - 11904: 0xB0CF, 21313 - 11904: 0xA451, 21314 - 11904: 0xFAAA, 21315 - 11904: 0xA464, 21316 - 11904: 0xFAC5, 21317 - 11904: 0xA4CA, 21319 - 11904: 0xA4C9, 21320 - 11904: 0xA4C8, 21321 - 11904: 0xA563, 21322 - 11904: 0xA562, 21324 - 11904: 0xC96D, 21325 - 11904: 0xC9C3, 21326 - 11904: 0x8958, 21329 - 11904: 0xA8F5, 21330 - 11904: 0xA8F2, 21331 - 11904: 0xA8F4, 21332 - 11904: 0xA8F3, 21335 - 11904: 0xAB6E, 21338 - 11904: 0xB3D5, 21340 - 11904: 0xA452, 21341 - 11904: 0x8BE3, 21342 - 11904: 0xA4CB, 21343 - 11904: 0x8B61, 21344 - 11904: 0xA565, 21345 - 11904: 0xA564, 21347 - 11904: 0xCA72, 21348 - 11904: 0x9AF1, 21350 - 11904: 0xA8F6, 21351 - 11904: 0x9EB7, 21353 - 11904: 0xC6C8, 21356 - 11904: 0xC957, 21357 - 11904: 0xFAD1, 21358 - 11904: 0xA567, 21359 - 11904: 0xA566, 21360 - 11904: 0xA64C, 21361 - 11904: 0xA64D, 21362 - 11904: 0xCA73, 21363 - 11904: 0xA759, 21364 - 11904: 0xFAD2, 21365 - 11904: 0xA75A, 21367 - 11904: 0xA8F7, 21368 - 11904: 0xA8F8, 21369 - 11904: 0xA8F9, 21371 - 11904: 0xAB6F, 21372 - 11904: 0xCDF5, 21373 - 11904: 0x9EBA, 21374 - 11904: 0xFAD4, 21375 - 11904: 0xFAD5, 21378 - 11904: 0xC944, 21380 - 11904: 0xA4CC, 21386 - 11904: 0xC9C4, 21390 - 11904: 0xCA74, 21391 - 11904: 0xCA75, 21394 - 11904: 0xCBD9, 21395 - 11904: 0xFAD9, 21396 - 11904: 0xCBDA, 21398 - 11904: 0xCDF7, 21399 - 11904: 0xCDF6, 21400 - 11904: 0xCDF9, 21401 - 11904: 0xCDF8, 21402 - 11904: 0xAB70, 21404 - 11904: 0xD470, 21405 - 11904: 0xADED, 21406 - 11904: 0xD0EF, 21407 - 11904: 0xADEC, 21408 - 11904: 0xFADB, 21410 - 11904: 0x9CE0, 21412 - 11904: 0xD864, 21413 - 11904: 0xB3D6, 21414 - 11904: 0xFBF7, 21415 - 11904: 0xD865, 21416 - 11904: 0xFBFA, 21417 - 11904: 0x89E7, 21418 - 11904: 0xA07A, 21419 - 11904: 0xFADC, 21420 - 11904: 0xE146, 21421 - 11904: 0xB9BD, 21422 - 11904: 0xFADD, 21424 - 11904: 0x89E9, 21426 - 11904: 0xBC46, 21428 - 11904: 0xF1EF, 21430 - 11904: 0xC6C9, 21433 - 11904: 0xC958, 21435 - 11904: 0xA568, 21441 - 11904: 0xFAE2, 21442 - 11904: 0x89EB, 21443 - 11904: 0xB0D1, 21445 - 11904: 0xFAE3, 21448 - 11904: 0xA453, 21449 - 11904: 0xA465, 21450 - 11904: 0xA4CE, 21451 - 11904: 0xA4CD, 21452 - 11904: 0x90C8, 21453 - 11904: 0xA4CF, 21456 - 11904: 0x92DA, 21457 - 11904: 0x8959, 21458 - 11904: 0x9CF5, 21460 - 11904: 0xA8FB, 21462 - 11904: 0xA8FA, 21463 - 11904: 0xA8FC, 21464 - 11904: 0x895A, 21465 - 11904: 0xFAE7, 21466 - 11904: 0x9FA2, 21467 - 11904: 0xAB71, 21471 - 11904: 0xADEE, 21472 - 11904: 0xFAEA, 21473 - 11904: 0xE8FB, 21474 - 11904: 0xC24F, 21475 - 11904: 0xA466, 21476 - 11904: 0xA56A, 21477 - 11904: 0xA579, 21478 - 11904: 0xA574, 21480 - 11904: 0xA56F, 21481 - 11904: 0xA56E, 21482 - 11904: 0xA575, 21483 - 11904: 0xA573, 21484 - 11904: 0xA56C, 21485 - 11904: 0xA57A, 21486 - 11904: 0xA56D, 21487 - 11904: 0xA569, 21488 - 11904: 0xA578, 21489 - 11904: 0xA577, 21490 - 11904: 0xA576, 21491 - 11904: 0xA56B, 21493 - 11904: 0xA572, 21494 - 11904: 0xFAED, 21495 - 11904: 0x8FAD, 21496 - 11904: 0xA571, 21499 - 11904: 0xA57B, 21500 - 11904: 0xA570, 21502 - 11904: 0xFB59, 21505 - 11904: 0xA653, 21507 - 11904: 0xA659, 21508 - 11904: 0xA655, 21510 - 11904: 0xA65B, 21511 - 11904: 0xC9C5, 21512 - 11904: 0xA658, 21513 - 11904: 0xA64E, 21514 - 11904: 0xA651, 21515 - 11904: 0xA654, 21516 - 11904: 0xA650, 21517 - 11904: 0xA657, 21518 - 11904: 0xA65A, 21519 - 11904: 0xA64F, 21520 - 11904: 0xA652, 21521 - 11904: 0xA656, 21522 - 11904: 0xA65C, 21523 - 11904: 0xFAEF, 21524 - 11904: 0x96EF, 21526 - 11904: 0x9DEC, 21528 - 11904: 0xCA7E, 21529 - 11904: 0xCA7B, 21530 - 11904: 0x9DCA, 21531 - 11904: 0xA767, 21532 - 11904: 0xCA7C, 21533 - 11904: 0xA75B, 21534 - 11904: 0xA75D, 21535 - 11904: 0xA775, 21536 - 11904: 0xA770, 21537 - 11904: 0xFD6D, 21539 - 11904: 0x89EC, 21540 - 11904: 0xCAA5, 21541 - 11904: 0xCA7D, 21542 - 11904: 0xA75F, 21543 - 11904: 0xA761, 21544 - 11904: 0xCAA4, 21545 - 11904: 0xA768, 21546 - 11904: 0xCA78, 21547 - 11904: 0xA774, 21548 - 11904: 0xA776, 21549 - 11904: 0xA75C, 21550 - 11904: 0xA76D, 21551 - 11904: 0xFB44, 21552 - 11904: 0xCA76, 21553 - 11904: 0xA773, 21554 - 11904: 0x9DE2, 21555 - 11904: 0xA764, 21556 - 11904: 0x8C75, 21557 - 11904: 0xA76E, 21558 - 11904: 0xA76F, 21559 - 11904: 0xCA77, 21560 - 11904: 0xA76C, 21561 - 11904: 0xA76A, 21563 - 11904: 0xA76B, 21564 - 11904: 0xA771, 21565 - 11904: 0xCAA1, 21566 - 11904: 0xA75E, 21568 - 11904: 0xA772, 21569 - 11904: 0xCAA3, 21570 - 11904: 0xA766, 21571 - 11904: 0xA763, 21573 - 11904: 0xCA7A, 21574 - 11904: 0xA762, 21575 - 11904: 0xCAA6, 21576 - 11904: 0xA765, 21578 - 11904: 0xA769, 21579 - 11904: 0x9EC0, 21580 - 11904: 0x87C5, 21581 - 11904: 0x9E56, 21582 - 11904: 0xA760, 21583 - 11904: 0xCAA2, 21588 - 11904: 0xCA79, 21600 - 11904: 0xCBEB, 21601 - 11904: 0xCBEA, 21602 - 11904: 0xA94F, 21603 - 11904: 0xCBED, 21604 - 11904: 0xCBEF, 21605 - 11904: 0xCBE4, 21606 - 11904: 0xCBE7, 21607 - 11904: 0xCBEE, 21608 - 11904: 0xA950, 21609 - 11904: 0x9F79, 21610 - 11904: 0x9AC7, 21611 - 11904: 0xCBE1, 21612 - 11904: 0xCBE5, 21613 - 11904: 0xFAF4, 21615 - 11904: 0xCBE9, 21616 - 11904: 0xCE49, 21617 - 11904: 0xA94B, 21618 - 11904: 0xCE4D, 21619 - 11904: 0xA8FD, 21620 - 11904: 0xCBE6, 21621 - 11904: 0xA8FE, 21622 - 11904: 0xA94C, 21623 - 11904: 0xA945, 21624 - 11904: 0xA941, 21626 - 11904: 0xCBE2, 21627 - 11904: 0xA944, 21628 - 11904: 0xA949, 21629 - 11904: 0xA952, 21630 - 11904: 0xCBE3, 21631 - 11904: 0xCBDC, 21632 - 11904: 0xA943, 21633 - 11904: 0xCBDD, 21634 - 11904: 0xCBDF, 21636 - 11904: 0xA946, 21637 - 11904: 0x98A1, 21638 - 11904: 0xA948, 21639 - 11904: 0xCBDB, 21640 - 11904: 0xCBE0, 21643 - 11904: 0xA951, 21644 - 11904: 0xA94D, 21645 - 11904: 0xCBE8, 21646 - 11904: 0xA953, 21647 - 11904: 0xFAF8, 21648 - 11904: 0xA94A, 21649 - 11904: 0xCBDE, 21650 - 11904: 0xA947, 21651 - 11904: 0x89F0, 21652 - 11904: 0x9E47, 21653 - 11904: 0xA942, 21654 - 11904: 0xA940, 21655 - 11904: 0x9DF7, 21656 - 11904: 0xCBEC, 21658 - 11904: 0xA94E, 21660 - 11904: 0x9FD3, 21662 - 11904: 0x9ACA, 21664 - 11904: 0xCE48, 21665 - 11904: 0xCDFB, 21666 - 11904: 0xCE4B, 21667 - 11904: 0x89F1, 21668 - 11904: 0xFAF9, 21669 - 11904: 0xCDFD, 21670 - 11904: 0xAB78, 21671 - 11904: 0xABA8, 21672 - 11904: 0xAB74, 21673 - 11904: 0xABA7, 21674 - 11904: 0xAB7D, 21675 - 11904: 0xABA4, 21676 - 11904: 0xAB72, 21677 - 11904: 0xCDFC, 21678 - 11904: 0xCE43, 21679 - 11904: 0xABA3, 21680 - 11904: 0xCE4F, 21681 - 11904: 0xABA5, 21682 - 11904: 0x8E5A, 21683 - 11904: 0xAB79, 21684 - 11904: 0x89F2, 21686 - 11904: 0xCE45, 21687 - 11904: 0xCE42, 21688 - 11904: 0xAB77, 21689 - 11904: 0x89F3, 21690 - 11904: 0xCDFA, 21691 - 11904: 0xABA6, 21692 - 11904: 0xCE4A, 21693 - 11904: 0xAB7C, 21694 - 11904: 0xCE4C, 21695 - 11904: 0xABA9, 21696 - 11904: 0xAB73, 21697 - 11904: 0xAB7E, 21698 - 11904: 0xAB7B, 21699 - 11904: 0xCE40, 21700 - 11904: 0xABA1, 21701 - 11904: 0xCE46, 21702 - 11904: 0xCE47, 21703 - 11904: 0xAB7A, 21704 - 11904: 0xABA2, 21705 - 11904: 0xAB76, 21707 - 11904: 0x925D, 21708 - 11904: 0x8B51, 21709 - 11904: 0x92E0, 21710 - 11904: 0xAB75, 21711 - 11904: 0xCDFE, 21712 - 11904: 0x89F4, 21718 - 11904: 0xCE44, 21722 - 11904: 0x9FD4, 21726 - 11904: 0xCE4E, 21728 - 11904: 0xD144, 21729 - 11904: 0xADFB, 21730 - 11904: 0xD0F1, 21731 - 11904: 0x8A79, 21732 - 11904: 0xD0F6, 21733 - 11904: 0xADF4, 21734 - 11904: 0xAE40, 21735 - 11904: 0xD0F4, 21736 - 11904: 0xADEF, 21737 - 11904: 0xADF9, 21738 - 11904: 0xADFE, 21739 - 11904: 0xD0FB, 21741 - 11904: 0xADFA, 21742 - 11904: 0xADFD, 21743 - 11904: 0x89F5, 21745 - 11904: 0xD0FE, 21746 - 11904: 0xADF5, 21747 - 11904: 0xD0F5, 21751 - 11904: 0xD142, 21752 - 11904: 0xD143, 21754 - 11904: 0xADF7, 21755 - 11904: 0xD141, 21756 - 11904: 0xADF3, 21757 - 11904: 0xAE43, 21759 - 11904: 0xD0F8, 21761 - 11904: 0xADF1, 21762 - 11904: 0x97A7, 21763 - 11904: 0xD146, 21764 - 11904: 0xD0F9, 21765 - 11904: 0xD0FD, 21766 - 11904: 0xADF6, 21767 - 11904: 0xAE42, 21768 - 11904: 0xD0FA, 21769 - 11904: 0xADFC, 21770 - 11904: 0xD140, 21771 - 11904: 0xD147, 21772 - 11904: 0xD4A1, 21773 - 11904: 0x93BA, 21774 - 11904: 0xD145, 21775 - 11904: 0xAE44, 21776 - 11904: 0xADF0, 21777 - 11904: 0xD0FC, 21778 - 11904: 0xD0F3, 21779 - 11904: 0x9E58, 21780 - 11904: 0xADF8, 21783 - 11904: 0xD0F2, 21784 - 11904: 0x89F6, 21786 - 11904: 0xD0F7, 21790 - 11904: 0x9E57, 21795 - 11904: 0x89F7, 21797 - 11904: 0x8A41, 21798 - 11904: 0xD0F0, 21799 - 11904: 0xAE41, 21800 - 11904: 0x89F8, 21802 - 11904: 0xD477, 21803 - 11904: 0xFAF1, 21804 - 11904: 0xB0E4, 21805 - 11904: 0xD4A7, 21806 - 11904: 0xB0E2, 21807 - 11904: 0xB0DF, 21808 - 11904: 0xD47C, 21809 - 11904: 0xB0DB, 21810 - 11904: 0xD4A2, 21811 - 11904: 0xB0E6, 21812 - 11904: 0xD476, 21813 - 11904: 0xD47B, 21814 - 11904: 0xD47A, 21815 - 11904: 0xADF2, 21816 - 11904: 0xB0E1, 21817 - 11904: 0xD4A5, 21819 - 11904: 0xD4A8, 21820 - 11904: 0xD473, 21822 - 11904: 0xB3E8, 21823 - 11904: 0x89FA, 21824 - 11904: 0xD4A9, 21825 - 11904: 0xB0E7, 21827 - 11904: 0xB0D9, 21828 - 11904: 0xB0D6, 21829 - 11904: 0xD47E, 21830 - 11904: 0xB0D3, 21831 - 11904: 0xFB42, 21832 - 11904: 0xD4A6, 21833 - 11904: 0xFABF, 21834 - 11904: 0xB0DA, 21835 - 11904: 0xD4AA, 21837 - 11904: 0xD474, 21838 - 11904: 0xD4A4, 21839 - 11904: 0xB0DD, 21840 - 11904: 0xD475, 21841 - 11904: 0xD478, 21842 - 11904: 0xD47D, 21843 - 11904: 0xFBA3, 21845 - 11904: 0xB0DE, 21846 - 11904: 0xB0DC, 21847 - 11904: 0xB0E8, 21852 - 11904: 0xB0E3, 21853 - 11904: 0xFAF7, 21854 - 11904: 0xB0D7, 21855 - 11904: 0xB1D2, 21857 - 11904: 0xB0D8, 21858 - 11904: 0xD479, 21859 - 11904: 0xB0E5, 21860 - 11904: 0xB0E0, 21861 - 11904: 0xD4A3, 21862 - 11904: 0xB0D5, 21865 - 11904: 0x9E4E, 21866 - 11904: 0xB0D4, 21867 - 11904: 0x94DC, 21873 - 11904: 0x95DA, 21874 - 11904: 0x9DF8, 21875 - 11904: 0x9F6A, 21877 - 11904: 0xD471, 21878 - 11904: 0xD472, 21879 - 11904: 0xD86A, 21881 - 11904: 0x8AB7, 21883 - 11904: 0xB3D7, 21884 - 11904: 0xB3DA, 21885 - 11904: 0xD875, 21886 - 11904: 0xB3EE, 21887 - 11904: 0xD878, 21888 - 11904: 0xB3D8, 21889 - 11904: 0xD871, 21890 - 11904: 0xB3DE, 21891 - 11904: 0xB3E4, 21892 - 11904: 0xB5BD, 21894 - 11904: 0xFB46, 21895 - 11904: 0xB3E2, 21896 - 11904: 0xD86E, 21897 - 11904: 0xB3EF, 21898 - 11904: 0xB3DB, 21899 - 11904: 0xB3E3, 21900 - 11904: 0xD876, 21901 - 11904: 0xDCD7, 21902 - 11904: 0xD87B, 21903 - 11904: 0xD86F, 21904 - 11904: 0x8A46, 21905 - 11904: 0xD866, 21906 - 11904: 0xD873, 21907 - 11904: 0xD86D, 21908 - 11904: 0xB3E1, 21909 - 11904: 0xD879, 21912 - 11904: 0xB3DD, 21913 - 11904: 0xB3F1, 21914 - 11904: 0xB3EA, 21916 - 11904: 0xB3DF, 21917 - 11904: 0xB3DC, 21919 - 11904: 0xB3E7, 21921 - 11904: 0xD87A, 21922 - 11904: 0xD86C, 21923 - 11904: 0xD872, 21924 - 11904: 0xD874, 21925 - 11904: 0xD868, 21926 - 11904: 0xD877, 21927 - 11904: 0xB3D9, 21928 - 11904: 0xD867, 21929 - 11904: 0xFB47, 21930 - 11904: 0xB3E0, 21931 - 11904: 0xB3F0, 21932 - 11904: 0xB3EC, 21933 - 11904: 0xD869, 21934 - 11904: 0xB3E6, 21936 - 11904: 0x9148, 21937 - 11904: 0xB3ED, 21938 - 11904: 0xB3E9, 21939 - 11904: 0xB3E5, 21940 - 11904: 0x92DE, 21941 - 11904: 0xD870, 21945 - 11904: 0x8B53, 21946 - 11904: 0x9DF6, 21947 - 11904: 0xB3EB, 21948 - 11904: 0x9BDA, 21951 - 11904: 0xDCD5, 21952 - 11904: 0xDCD1, 21953 - 11904: 0x9D7E, 21954 - 11904: 0xDCE0, 21955 - 11904: 0xDCCA, 21956 - 11904: 0xDCD3, 21957 - 11904: 0xB6E5, 21958 - 11904: 0xB6E6, 21959 - 11904: 0xB6DE, 21960 - 11904: 0xDCDC, 21961 - 11904: 0xB6E8, 21962 - 11904: 0xDCCF, 21963 - 11904: 0xDCCE, 21964 - 11904: 0xDCCC, 21965 - 11904: 0xDCDE, 21966 - 11904: 0xB6DC, 21967 - 11904: 0xDCD8, 21968 - 11904: 0xDCCD, 21969 - 11904: 0xB6DF, 21970 - 11904: 0xDCD6, 21971 - 11904: 0xB6DA, 21972 - 11904: 0xDCD2, 21973 - 11904: 0xDCD9, 21974 - 11904: 0xDCDB, 21975 - 11904: 0x89FD, 21976 - 11904: 0x99E4, 21977 - 11904: 0xDCDF, 21978 - 11904: 0xB6E3, 21979 - 11904: 0xDCCB, 21980 - 11904: 0xB6DD, 21981 - 11904: 0xDCD0, 21982 - 11904: 0x9E43, 21983 - 11904: 0xB6D8, 21985 - 11904: 0xB6E4, 21986 - 11904: 0xDCDA, 21987 - 11904: 0xB6E0, 21988 - 11904: 0xB6E1, 21989 - 11904: 0xB6E7, 21990 - 11904: 0xB6DB, 21991 - 11904: 0xA25F, 21992 - 11904: 0xB6D9, 21993 - 11904: 0xDCD4, 21994 - 11904: 0x9DE9, 21996 - 11904: 0x8F52, 21999 - 11904: 0xB6E2, 22000 - 11904: 0x9DF5, 22001 - 11904: 0x9DF0, 22002 - 11904: 0xDCDD, 22005 - 11904: 0x99E7, 22006 - 11904: 0xB9CD, 22007 - 11904: 0xB9C8, 22009 - 11904: 0xE155, 22010 - 11904: 0xE151, 22011 - 11904: 0x8BBD, 22012 - 11904: 0xE14B, 22013 - 11904: 0xB9C2, 22014 - 11904: 0xB9BE, 22015 - 11904: 0xE154, 22016 - 11904: 0xB9BF, 22017 - 11904: 0xE14E, 22018 - 11904: 0xE150, 22020 - 11904: 0xE153, 22021 - 11904: 0xFB48, 22022 - 11904: 0xB9C4, 22024 - 11904: 0xB9CB, 22025 - 11904: 0xB9C5, 22028 - 11904: 0xE149, 22029 - 11904: 0xB9C6, 22030 - 11904: 0xB9C7, 22031 - 11904: 0xE14C, 22032 - 11904: 0xB9CC, 22033 - 11904: 0x9FB7, 22034 - 11904: 0xE14A, 22035 - 11904: 0xE14F, 22036 - 11904: 0xB9C3, 22037 - 11904: 0xE148, 22038 - 11904: 0xB9C9, 22039 - 11904: 0xB9C1, 22043 - 11904: 0xB9C0, 22044 - 11904: 0xE14D, 22045 - 11904: 0xE152, 22046 - 11904: 0x9DD0, 22047 - 11904: 0xB9CA, 22048 - 11904: 0x9FEB, 22049 - 11904: 0x8DA9, 22050 - 11904: 0x9DCF, 22051 - 11904: 0x98E1, 22053 - 11904: 0x9DE5, 22055 - 11904: 0xE147, 22057 - 11904: 0xBC4D, 22058 - 11904: 0xE547, 22060 - 11904: 0xE544, 22061 - 11904: 0x9DC8, 22062 - 11904: 0xBC47, 22063 - 11904: 0xBC53, 22064 - 11904: 0xBC54, 22066 - 11904: 0xBC4A, 22067 - 11904: 0xE542, 22068 - 11904: 0xBC4C, 22069 - 11904: 0xE4F9, 22070 - 11904: 0xBC52, 22071 - 11904: 0xFB4F, 22072 - 11904: 0xE546, 22073 - 11904: 0xBC49, 22074 - 11904: 0xE548, 22075 - 11904: 0xBC48, 22077 - 11904: 0xE543, 22078 - 11904: 0xE545, 22079 - 11904: 0xBC4B, 22080 - 11904: 0xE541, 22081 - 11904: 0xE4FA, 22082 - 11904: 0xE4F7, 22083 - 11904: 0x9DEB, 22085 - 11904: 0xD86B, 22086 - 11904: 0xE4FD, 22088 - 11904: 0xE4F6, 22089 - 11904: 0xE4FC, 22090 - 11904: 0xE4FB, 22092 - 11904: 0xE4F8, 22093 - 11904: 0xFB54, 22094 - 11904: 0xBC4F, 22095 - 11904: 0xFB55, 22096 - 11904: 0x9AA2, 22098 - 11904: 0x8AD6, 22099 - 11904: 0xBC4E, 22100 - 11904: 0x9A5F, 22103 - 11904: 0xBC50, 22104 - 11904: 0xE4FE, 22105 - 11904: 0xBEB2, 22106 - 11904: 0xE540, 22109 - 11904: 0x9EF5, 22110 - 11904: 0xE945, 22112 - 11904: 0xE8FD, 22113 - 11904: 0x8FB7, 22114 - 11904: 0xBEBE, 22115 - 11904: 0xE942, 22116 - 11904: 0xBEB6, 22117 - 11904: 0xBEBA, 22118 - 11904: 0xE941, 22120 - 11904: 0xBEB9, 22121 - 11904: 0xBEB5, 22122 - 11904: 0xBEB8, 22123 - 11904: 0xBEB3, 22124 - 11904: 0xBEBD, 22125 - 11904: 0xE943, 22126 - 11904: 0xE8FE, 22127 - 11904: 0xBEBC, 22128 - 11904: 0xE8FC, 22129 - 11904: 0xBEBB, 22130 - 11904: 0xE944, 22131 - 11904: 0xE940, 22132 - 11904: 0xBC51, 22134 - 11904: 0xBEBF, 22135 - 11904: 0xE946, 22136 - 11904: 0xBEB7, 22137 - 11904: 0xBEB4, 22138 - 11904: 0x9AD2, 22139 - 11904: 0x9E6A, 22140 - 11904: 0x9EE8, 22142 - 11904: 0xECC6, 22143 - 11904: 0xECC8, 22144 - 11904: 0xC07B, 22145 - 11904: 0xECC9, 22146 - 11904: 0xECC7, 22147 - 11904: 0xECC5, 22148 - 11904: 0xECC4, 22149 - 11904: 0xC07D, 22150 - 11904: 0xECC3, 22151 - 11904: 0xC07E, 22153 - 11904: 0x8BBF, 22154 - 11904: 0x91C2, 22155 - 11904: 0x9D62, 22156 - 11904: 0xECC1, 22157 - 11904: 0xECC2, 22158 - 11904: 0xC07A, 22159 - 11904: 0xC0A1, 22160 - 11904: 0xC07C, 22162 - 11904: 0x9260, 22163 - 11904: 0xECC0, 22165 - 11904: 0xC250, 22167 - 11904: 0xEFBC, 22168 - 11904: 0xEFBA, 22169 - 11904: 0xEFBF, 22170 - 11904: 0xEFBD, 22172 - 11904: 0xEFBB, 22173 - 11904: 0xEFBE, 22174 - 11904: 0x925E, 22175 - 11904: 0x91C1, 22177 - 11904: 0x8AC5, 22180 - 11904: 0x97A3, 22181 - 11904: 0xC360, 22182 - 11904: 0xF1F2, 22183 - 11904: 0xF1F3, 22184 - 11904: 0xC456, 22186 - 11904: 0xF1F4, 22187 - 11904: 0xF1F0, 22188 - 11904: 0xF1F5, 22189 - 11904: 0xF1F1, 22190 - 11904: 0xC251, 22191 - 11904: 0x8B6C, 22193 - 11904: 0x8D7E, 22194 - 11904: 0xF3FE, 22195 - 11904: 0xF441, 22196 - 11904: 0xC459, 22197 - 11904: 0xF440, 22198 - 11904: 0xC458, 22199 - 11904: 0xC457, 22201 - 11904: 0x9C54, 22204 - 11904: 0xC45A, 22205 - 11904: 0xF5C5, 22206 - 11904: 0xF5C6, 22207 - 11904: 0x9DBD, 22208 - 11904: 0xC4DA, 22209 - 11904: 0xC4D9, 22210 - 11904: 0xC4DB, 22211 - 11904: 0xF5C4, 22213 - 11904: 0xF6D8, 22214 - 11904: 0xF6D7, 22216 - 11904: 0xC56D, 22217 - 11904: 0xC56F, 22218 - 11904: 0xC56E, 22219 - 11904: 0xF6D9, 22220 - 11904: 0xC5C8, 22221 - 11904: 0xF8A6, 22225 - 11904: 0xC5F1, 22227 - 11904: 0xF8A5, 22228 - 11904: 0xF8EE, 22230 - 11904: 0x9CC5, 22231 - 11904: 0xC949, 22234 - 11904: 0xA57D, 22235 - 11904: 0xA57C, 22237 - 11904: 0xA65F, 22238 - 11904: 0xA65E, 22239 - 11904: 0xC9C7, 22240 - 11904: 0xA65D, 22241 - 11904: 0xC9C6, 22242 - 11904: 0x895B, 22244 - 11904: 0xA779, 22245 - 11904: 0xCAA9, 22247 - 11904: 0xCAA8, 22250 - 11904: 0xA777, 22251 - 11904: 0xA77A, 22253 - 11904: 0xFB5C, 22254 - 11904: 0xCAA7, 22255 - 11904: 0xFB5B, 22256 - 11904: 0xA778, 22257 - 11904: 0xFB57, 22263 - 11904: 0xCBF0, 22265 - 11904: 0xCBF1, 22266 - 11904: 0xA954, 22267 - 11904: 0x8765, 22269 - 11904: 0x98C7, 22271 - 11904: 0xABAA, 22272 - 11904: 0xFB5A, 22273 - 11904: 0xD148, 22274 - 11904: 0xD149, 22275 - 11904: 0xAE45, 22276 - 11904: 0xAE46, 22279 - 11904: 0xD4AC, 22280 - 11904: 0xB0E9, 22281 - 11904: 0xB0EB, 22282 - 11904: 0xD4AB, 22283 - 11904: 0xB0EA, 22284 - 11904: 0xD87C, 22285 - 11904: 0xB3F2, 22290 - 11904: 0xB6E9, 22291 - 11904: 0xB6EA, 22292 - 11904: 0xDCE1, 22293 - 11904: 0x9CEE, 22294 - 11904: 0xB9CF, 22296 - 11904: 0xB9CE, 22298 - 11904: 0xE549, 22299 - 11904: 0xE948, 22300 - 11904: 0xE947, 22301 - 11904: 0x92E2, 22302 - 11904: 0xF96B, 22303 - 11904: 0xA467, 22304 - 11904: 0xC959, 22306 - 11904: 0xC96E, 22307 - 11904: 0xC96F, 22312 - 11904: 0xA662, 22313 - 11904: 0xA666, 22314 - 11904: 0xC9C9, 22316 - 11904: 0xA664, 22317 - 11904: 0xA663, 22318 - 11904: 0xC9C8, 22319 - 11904: 0xA665, 22320 - 11904: 0xA661, 22322 - 11904: 0x94A7, 22323 - 11904: 0xA660, 22324 - 11904: 0xC9CA, 22331 - 11904: 0xA7A6, 22333 - 11904: 0x8CCC, 22334 - 11904: 0xA7A3, 22335 - 11904: 0x9BD4, 22336 - 11904: 0xA77D, 22337 - 11904: 0xCAAA, 22338 - 11904: 0xFB64, 22339 - 11904: 0xFB76, 22341 - 11904: 0xCAAB, 22342 - 11904: 0xFB60, 22343 - 11904: 0xA7A1, 22345 - 11904: 0xCAAD, 22346 - 11904: 0xA77B, 22347 - 11904: 0xCAAE, 22348 - 11904: 0xCAAC, 22349 - 11904: 0xA77E, 22350 - 11904: 0xA7A2, 22351 - 11904: 0xA7A5, 22352 - 11904: 0xA7A4, 22353 - 11904: 0xA77C, 22354 - 11904: 0xCAAF, 22356 - 11904: 0x99E5, 22359 - 11904: 0x9AC2, 22363 - 11904: 0x91FB, 22367 - 11904: 0xA073, 22369 - 11904: 0xA959, 22370 - 11904: 0xCBFE, 22372 - 11904: 0xA95B, 22374 - 11904: 0xA95A, 22375 - 11904: 0x9F72, 22376 - 11904: 0xCC40, 22377 - 11904: 0xA958, 22378 - 11904: 0xA957, 22379 - 11904: 0xCBF5, 22381 - 11904: 0xCBF4, 22383 - 11904: 0xCBF2, 22384 - 11904: 0xCBF7, 22385 - 11904: 0xCBF6, 22386 - 11904: 0xCBF3, 22387 - 11904: 0xCBFC, 22388 - 11904: 0xCBFD, 22389 - 11904: 0xCBFA, 22390 - 11904: 0xCBF8, 22391 - 11904: 0xA956, 22394 - 11904: 0x9FCC, 22395 - 11904: 0xCBFB, 22396 - 11904: 0xA95C, 22397 - 11904: 0xCC41, 22398 - 11904: 0x98A5, 22399 - 11904: 0x92E8, 22400 - 11904: 0xCBF9, 22402 - 11904: 0xABAB, 22403 - 11904: 0xA955, 22408 - 11904: 0x9BBC, 22410 - 11904: 0x96F3, 22411 - 11904: 0xABAC, 22412 - 11904: 0xCE54, 22413 - 11904: 0x92E7, 22415 - 11904: 0xCE5A, 22416 - 11904: 0xFC67, 22419 - 11904: 0xABB2, 22420 - 11904: 0xCE58, 22421 - 11904: 0xCE5E, 22423 - 11904: 0xCE55, 22424 - 11904: 0xCE59, 22425 - 11904: 0xCE5B, 22426 - 11904: 0xCE5D, 22427 - 11904: 0xCE57, 22428 - 11904: 0x8B7D, 22429 - 11904: 0xCE56, 22430 - 11904: 0xCE51, 22431 - 11904: 0xCE52, 22432 - 11904: 0xABAD, 22433 - 11904: 0x9BF4, 22434 - 11904: 0xABAF, 22435 - 11904: 0xABAE, 22436 - 11904: 0xCE53, 22437 - 11904: 0xCE5C, 22439 - 11904: 0x9EF7, 22442 - 11904: 0x9EC1, 22446 - 11904: 0xABB1, 22451 - 11904: 0x87C3, 22452 - 11904: 0x996F, 22453 - 11904: 0xCE50, 22454 - 11904: 0xD153, 22456 - 11904: 0xD152, 22457 - 11904: 0xD157, 22458 - 11904: 0xD14E, 22459 - 11904: 0x96F1, 22460 - 11904: 0xD151, 22461 - 11904: 0xD150, 22462 - 11904: 0x8E41, 22463 - 11904: 0xD154, 22465 - 11904: 0xD158, 22466 - 11904: 0xAE47, 22467 - 11904: 0xAE4A, 22468 - 11904: 0x954A, 22470 - 11904: 0xD14F, 22471 - 11904: 0xD155, 22472 - 11904: 0x97E6, 22475 - 11904: 0xAE49, 22476 - 11904: 0xD14A, 22478 - 11904: 0xABB0, 22479 - 11904: 0xD4BA, 22480 - 11904: 0xD156, 22482 - 11904: 0xD14D, 22484 - 11904: 0xAE48, 22485 - 11904: 0xD14C, 22487 - 11904: 0x96F5, 22492 - 11904: 0xD4B1, 22493 - 11904: 0x92E6, 22494 - 11904: 0x9F42, 22495 - 11904: 0xB0EC, 22496 - 11904: 0xB0F0, 22497 - 11904: 0xD4C1, 22498 - 11904: 0xD4AF, 22499 - 11904: 0xD4BD, 22500 - 11904: 0xB0F1, 22501 - 11904: 0xD4BF, 22502 - 11904: 0xFB67, 22503 - 11904: 0xD4C5, 22505 - 11904: 0xD4C9, 22508 - 11904: 0xD4C0, 22509 - 11904: 0xD4B4, 22510 - 11904: 0xD4BC, 22511 - 11904: 0x99A9, 22512 - 11904: 0xD4CA, 22513 - 11904: 0xD4C8, 22514 - 11904: 0xD4BE, 22515 - 11904: 0xD4B9, 22516 - 11904: 0xD4B2, 22517 - 11904: 0xD8A6, 22518 - 11904: 0xD4B0, 22519 - 11904: 0xB0F5, 22520 - 11904: 0xD4B7, 22521 - 11904: 0xB0F6, 22522 - 11904: 0xB0F2, 22523 - 11904: 0xD4AD, 22524 - 11904: 0xD4C3, 22525 - 11904: 0xD4B5, 22526 - 11904: 0xFAE6, 22528 - 11904: 0xD4B3, 22529 - 11904: 0xD4C6, 22530 - 11904: 0xB0F3, 22531 - 11904: 0xFB69, 22532 - 11904: 0xD4CC, 22533 - 11904: 0xB0ED, 22534 - 11904: 0xB0EF, 22535 - 11904: 0xD4BB, 22536 - 11904: 0xD4B6, 22537 - 11904: 0xAE4B, 22538 - 11904: 0xB0EE, 22539 - 11904: 0xD4B8, 22540 - 11904: 0xD4C7, 22541 - 11904: 0xD4CB, 22542 - 11904: 0xD4C2, 22544 - 11904: 0xD4C4, 22546 - 11904: 0x97E5, 22548 - 11904: 0xD4AE, 22552 - 11904: 0x87C8, 22553 - 11904: 0xD8A1, 22555 - 11904: 0xD8AA, 22556 - 11904: 0xD8A9, 22557 - 11904: 0xB3FA, 22558 - 11904: 0xD8A2, 22560 - 11904: 0xB3FB, 22561 - 11904: 0xB3F9, 22562 - 11904: 0x967D, 22563 - 11904: 0xD8A4, 22564 - 11904: 0xB3F6, 22565 - 11904: 0xD8A8, 22566 - 11904: 0xFB6C, 22567 - 11904: 0xD8A3, 22568 - 11904: 0xD8A5, 22569 - 11904: 0xD87D, 22570 - 11904: 0xB3F4, 22572 - 11904: 0xD8B2, 22573 - 11904: 0xD8B1, 22574 - 11904: 0xD8AE, 22575 - 11904: 0xB3F3, 22576 - 11904: 0xB3F7, 22577 - 11904: 0xB3F8, 22578 - 11904: 0xD14B, 22579 - 11904: 0xD8AB, 22580 - 11904: 0xB3F5, 22581 - 11904: 0xB0F4, 22582 - 11904: 0xD8AD, 22583 - 11904: 0xD87E, 22584 - 11904: 0xD8B0, 22585 - 11904: 0xD8AF, 22586 - 11904: 0x99A2, 22587 - 11904: 0xD8B3, 22589 - 11904: 0xDCEF, 22591 - 11904: 0xD8AC, 22592 - 11904: 0x9ABB, 22596 - 11904: 0x9A65, 22599 - 11904: 0x944E, 22600 - 11904: 0xD8A7, 22601 - 11904: 0xDCE7, 22602 - 11904: 0xB6F4, 22603 - 11904: 0xB6F7, 22604 - 11904: 0xB6F2, 22605 - 11904: 0xDCE6, 22606 - 11904: 0xDCEA, 22607 - 11904: 0xDCE5, 22609 - 11904: 0xB6EC, 22610 - 11904: 0xB6F6, 22611 - 11904: 0xDCE2, 22612 - 11904: 0xB6F0, 22613 - 11904: 0xDCE9, 22615 - 11904: 0xB6EE, 22616 - 11904: 0xB6ED, 22617 - 11904: 0xDCEC, 22618 - 11904: 0xB6EF, 22619 - 11904: 0xDCEE, 22620 - 11904: 0xFB6E, 22621 - 11904: 0xDCEB, 22622 - 11904: 0xB6EB, 22623 - 11904: 0x99DF, 22626 - 11904: 0xB6F5, 22627 - 11904: 0xDCF0, 22628 - 11904: 0xDCE4, 22629 - 11904: 0xDCED, 22632 - 11904: 0xDCE3, 22633 - 11904: 0x98E3, 22635 - 11904: 0xB6F1, 22636 - 11904: 0x9254, 22637 - 11904: 0xB6F3, 22639 - 11904: 0xDCE8, 22641 - 11904: 0xDCF1, 22642 - 11904: 0x967B, 22643 - 11904: 0x8AAF, 22644 - 11904: 0xE15D, 22645 - 11904: 0xB9D0, 22646 - 11904: 0xE163, 22649 - 11904: 0xB9D5, 22650 - 11904: 0xE15F, 22651 - 11904: 0xE166, 22652 - 11904: 0xE157, 22653 - 11904: 0xB9D7, 22654 - 11904: 0xB9D1, 22655 - 11904: 0xE15C, 22656 - 11904: 0xBC55, 22657 - 11904: 0xE15B, 22658 - 11904: 0xE164, 22659 - 11904: 0xB9D2, 22661 - 11904: 0xB9D6, 22662 - 11904: 0xE15A, 22663 - 11904: 0xE160, 22664 - 11904: 0xE165, 22665 - 11904: 0xE156, 22666 - 11904: 0xB9D4, 22667 - 11904: 0xE15E, 22670 - 11904: 0xE162, 22671 - 11904: 0xE168, 22672 - 11904: 0xE158, 22673 - 11904: 0xE161, 22674 - 11904: 0x8C77, 22675 - 11904: 0xB9D3, 22676 - 11904: 0xE167, 22678 - 11904: 0x87B0, 22680 - 11904: 0xE159, 22681 - 11904: 0x8BAF, 22682 - 11904: 0x9EBD, 22684 - 11904: 0xBC59, 22685 - 11904: 0xE54B, 22686 - 11904: 0xBC57, 22687 - 11904: 0xBC56, 22688 - 11904: 0xE54D, 22689 - 11904: 0xE552, 22691 - 11904: 0xE54E, 22693 - 11904: 0xE551, 22694 - 11904: 0xBC5C, 22695 - 11904: 0x9EE6, 22696 - 11904: 0xBEA5, 22697 - 11904: 0xBC5B, 22698 - 11904: 0xFB6F, 22699 - 11904: 0xE54A, 22700 - 11904: 0xE550, 22702 - 11904: 0xBC5A, 22703 - 11904: 0xE54F, 22704 - 11904: 0x8EE1, 22705 - 11904: 0xE54C, 22707 - 11904: 0xBC58, 22709 - 11904: 0x9B7D, 22710 - 11904: 0x9C7E, 22714 - 11904: 0xE94D, 22715 - 11904: 0xF9D9, 22716 - 11904: 0xE94F, 22717 - 11904: 0xE94A, 22718 - 11904: 0xBEC1, 22719 - 11904: 0xE94C, 22721 - 11904: 0xBEC0, 22722 - 11904: 0xE94E, 22725 - 11904: 0xBEC3, 22726 - 11904: 0xE950, 22727 - 11904: 0xBEC2, 22728 - 11904: 0xE949, 22729 - 11904: 0xE94B, 22731 - 11904: 0x92EA, 22734 - 11904: 0xC0A5, 22735 - 11904: 0xECCC, 22736 - 11904: 0x8C78, 22737 - 11904: 0xC0A4, 22738 - 11904: 0xECCD, 22739 - 11904: 0xC0A3, 22740 - 11904: 0xECCB, 22741 - 11904: 0xC0A2, 22742 - 11904: 0xECCA, 22744 - 11904: 0xC253, 22745 - 11904: 0xC252, 22746 - 11904: 0xF1F6, 22747 - 11904: 0xF1F8, 22748 - 11904: 0xFB72, 22749 - 11904: 0xF1F7, 22750 - 11904: 0xC361, 22751 - 11904: 0xC362, 22752 - 11904: 0xFB71, 22754 - 11904: 0xC363, 22755 - 11904: 0xF442, 22756 - 11904: 0xC45B, 22759 - 11904: 0xF7D3, 22760 - 11904: 0xF7D2, 22761 - 11904: 0xC5F2, 22763 - 11904: 0xA468, 22764 - 11904: 0xA4D0, 22767 - 11904: 0xA7A7, 22768 - 11904: 0x895C, 22770 - 11904: 0x98F0, 22771 - 11904: 0x96F2, 22772 - 11904: 0xCE5F, 22777 - 11904: 0xB3FC, 22778 - 11904: 0xB3FD, 22779 - 11904: 0xFB74, 22780 - 11904: 0xDCF2, 22781 - 11904: 0xB9D8, 22782 - 11904: 0xE169, 22783 - 11904: 0xE553, 22786 - 11904: 0x8BC1, 22787 - 11904: 0xC95A, 22788 - 11904: 0x895D, 22789 - 11904: 0x89DE, 22790 - 11904: 0xCAB0, 22791 - 11904: 0x895E, 22794 - 11904: 0xC6CA, 22796 - 11904: 0xCC42, 22797 - 11904: 0xCE60, 22798 - 11904: 0xD159, 22799 - 11904: 0xAE4C, 22801 - 11904: 0xFE42, 22802 - 11904: 0xF1F9, 22804 - 11904: 0xC4DC, 22805 - 11904: 0xA469, 22806 - 11904: 0xA57E, 22807 - 11904: 0xC970, 22809 - 11904: 0xA667, 22810 - 11904: 0xA668, 22812 - 11904: 0xA95D, 22813 - 11904: 0x8768, 22815 - 11904: 0xFB7B, 22816 - 11904: 0xB0F7, 22818 - 11904: 0xB9DA, 22820 - 11904: 0xB9DB, 22821 - 11904: 0xB9D9, 22823 - 11904: 0xA46A, 22825 - 11904: 0xA4D1, 22826 - 11904: 0xA4D3, 22827 - 11904: 0xA4D2, 22828 - 11904: 0xC95B, 22829 - 11904: 0xA4D4, 22830 - 11904: 0xA5A1, 22831 - 11904: 0xC971, 22833 - 11904: 0xA5A2, 22834 - 11904: 0x895F, 22836 - 11904: 0x8960, 22839 - 11904: 0xA669, 22840 - 11904: 0xA66A, 22844 - 11904: 0xC9CB, 22846 - 11904: 0xA7A8, 22848 - 11904: 0xCAB1, 22852 - 11904: 0xA961, 22853 - 11904: 0xCC43, 22855 - 11904: 0xA95F, 22856 - 11904: 0xA960, 22857 - 11904: 0xA95E, 22858 - 11904: 0xD15A, 22862 - 11904: 0xABB6, 22863 - 11904: 0xABB5, 22864 - 11904: 0xABB7, 22865 - 11904: 0xABB4, 22867 - 11904: 0xCE61, 22868 - 11904: 0xA962, 22869 - 11904: 0xABB3, 22871 - 11904: 0xAE4D, 22872 - 11904: 0xAE4E, 22874 - 11904: 0xAE4F, 22876 - 11904: 0xD4CD, 22880 - 11904: 0xB3FE, 22881 - 11904: 0xD8B4, 22882 - 11904: 0xB0F8, 22885 - 11904: 0x9BCD, 22887 - 11904: 0xB6F8, 22889 - 11904: 0xB9DD, 22890 - 11904: 0xB9DC, 22891 - 11904: 0xE16A, 22893 - 11904: 0xBC5D, 22894 - 11904: 0xBEC4, 22896 - 11904: 0xEFC0, 22897 - 11904: 0xF6DA, 22898 - 11904: 0xF7D4, 22899 - 11904: 0xA46B, 22900 - 11904: 0xA5A3, 22901 - 11904: 0x9DD3, 22902 - 11904: 0xA5A4, 22903 - 11904: 0xC9D1, 22904 - 11904: 0xA66C, 22905 - 11904: 0xA66F, 22907 - 11904: 0xC9CF, 22908 - 11904: 0xC9CD, 22909 - 11904: 0xA66E, 22910 - 11904: 0xC9D0, 22911 - 11904: 0xC9D2, 22912 - 11904: 0xC9CC, 22913 - 11904: 0xA671, 22914 - 11904: 0xA670, 22915 - 11904: 0xA66D, 22916 - 11904: 0xA66B, 22917 - 11904: 0xC9CE, 22921 - 11904: 0x984C, 22922 - 11904: 0xA7B3, 22925 - 11904: 0xA7B0, 22926 - 11904: 0xCAB6, 22927 - 11904: 0xCAB9, 22928 - 11904: 0xCAB8, 22930 - 11904: 0xA7AA, 22931 - 11904: 0xA7B2, 22932 - 11904: 0x9752, 22934 - 11904: 0xA7AF, 22935 - 11904: 0xCAB5, 22936 - 11904: 0xCAB3, 22937 - 11904: 0xA7AE, 22938 - 11904: 0x95C3, 22941 - 11904: 0xA7A9, 22942 - 11904: 0xA7AC, 22943 - 11904: 0x9BB6, 22944 - 11904: 0xCAB4, 22945 - 11904: 0xCABB, 22946 - 11904: 0xCAB7, 22947 - 11904: 0xA7AD, 22948 - 11904: 0xA7B1, 22949 - 11904: 0xA7B4, 22950 - 11904: 0xCAB2, 22951 - 11904: 0xCABA, 22952 - 11904: 0xA7AB, 22956 - 11904: 0x9AB9, 22958 - 11904: 0xA967, 22959 - 11904: 0xA96F, 22960 - 11904: 0x97B3, 22961 - 11904: 0xCC4F, 22962 - 11904: 0xCC48, 22963 - 11904: 0xA970, 22964 - 11904: 0xCC53, 22965 - 11904: 0xCC44, 22966 - 11904: 0xCC4B, 22967 - 11904: 0x9F74, 22968 - 11904: 0x92F1, 22969 - 11904: 0xA966, 22970 - 11904: 0xCC45, 22971 - 11904: 0xA964, 22972 - 11904: 0xCC4C, 22973 - 11904: 0xCC50, 22974 - 11904: 0xA963, 22975 - 11904: 0x8CFA, 22976 - 11904: 0xCC51, 22977 - 11904: 0xCC4A, 22979 - 11904: 0xCC4D, 22980 - 11904: 0x97DF, 22981 - 11904: 0xA972, 22982 - 11904: 0xA969, 22983 - 11904: 0xCC54, 22984 - 11904: 0xCC52, 22985 - 11904: 0xFBA6, 22986 - 11904: 0xA96E, 22987 - 11904: 0xA96C, 22988 - 11904: 0xCC49, 22989 - 11904: 0xA96B, 22990 - 11904: 0xCC47, 22991 - 11904: 0xCC46, 22992 - 11904: 0xA96A, 22993 - 11904: 0xA968, 22994 - 11904: 0xA971, 22995 - 11904: 0xA96D, 22996 - 11904: 0xA965, 22998 - 11904: 0xCC4E, 23000 - 11904: 0xABB9, 23001 - 11904: 0xFBAB, 23002 - 11904: 0xABC0, 23003 - 11904: 0xCE6F, 23004 - 11904: 0xABB8, 23005 - 11904: 0xCE67, 23006 - 11904: 0xCE63, 23008 - 11904: 0xCE73, 23009 - 11904: 0xCE62, 23011 - 11904: 0xABBB, 23012 - 11904: 0xCE6C, 23013 - 11904: 0xABBE, 23014 - 11904: 0xABC1, 23016 - 11904: 0xABBC, 23017 - 11904: 0xCE70, 23018 - 11904: 0xABBF, 23019 - 11904: 0x9877, 23020 - 11904: 0xAE56, 23021 - 11904: 0xCE76, 23022 - 11904: 0xCE64, 23023 - 11904: 0x9854, 23024 - 11904: 0x95C5, 23025 - 11904: 0xCE66, 23026 - 11904: 0xCE6D, 23027 - 11904: 0xCE71, 23028 - 11904: 0xCE75, 23029 - 11904: 0xCE72, 23030 - 11904: 0xCE6B, 23031 - 11904: 0xCE6E, 23032 - 11904: 0x9D55, 23033 - 11904: 0xFBB2, 23034 - 11904: 0xCE68, 23035 - 11904: 0xABC3, 23036 - 11904: 0xCE6A, 23037 - 11904: 0xCE69, 23038 - 11904: 0xCE74, 23039 - 11904: 0xABBA, 23040 - 11904: 0xCE65, 23041 - 11904: 0xABC2, 23042 - 11904: 0x957E, 23043 - 11904: 0xABBD, 23049 - 11904: 0xAE5C, 23050 - 11904: 0xD162, 23051 - 11904: 0x9742, 23052 - 11904: 0xAE5B, 23053 - 11904: 0x94E6, 23055 - 11904: 0xD160, 23057 - 11904: 0xAE50, 23058 - 11904: 0x92F5, 23059 - 11904: 0xAE55, 23061 - 11904: 0xD15F, 23062 - 11904: 0xD15C, 23063 - 11904: 0xD161, 23064 - 11904: 0xAE51, 23065 - 11904: 0xD15B, 23066 - 11904: 0x8CC5, 23067 - 11904: 0xAE54, 23068 - 11904: 0xAE52, 23070 - 11904: 0xD163, 23071 - 11904: 0xAE53, 23072 - 11904: 0xAE57, 23073 - 11904: 0x92FD, 23075 - 11904: 0xAE58, 23076 - 11904: 0xFBA2, 23077 - 11904: 0xAE5A, 23079 - 11904: 0x9C51, 23081 - 11904: 0xAE59, 23082 - 11904: 0x94E9, 23083 - 11904: 0x985C, 23084 - 11904: 0x92F0, 23085 - 11904: 0xD15D, 23086 - 11904: 0xD15E, 23091 - 11904: 0xD164, 23093 - 11904: 0xD4D4, 23094 - 11904: 0xB0F9, 23095 - 11904: 0xD8C2, 23096 - 11904: 0xD4D3, 23097 - 11904: 0xD4E6, 23100 - 11904: 0xB140, 23101 - 11904: 0x944C, 23102 - 11904: 0xD4E4, 23104 - 11904: 0xB0FE, 23105 - 11904: 0xB0FA, 23106 - 11904: 0xD4ED, 23107 - 11904: 0xD4DD, 23108 - 11904: 0xD4E0, 23109 - 11904: 0x916B, 23110 - 11904: 0xB143, 23111 - 11904: 0xD4EA, 23112 - 11904: 0xD4E2, 23113 - 11904: 0xB0FB, 23114 - 11904: 0xB144, 23116 - 11904: 0xD4E7, 23117 - 11904: 0xD4E5, 23120 - 11904: 0xD4D6, 23121 - 11904: 0xD4EB, 23122 - 11904: 0xD4DF, 23123 - 11904: 0xD4DA, 23124 - 11904: 0x8B78, 23125 - 11904: 0xD4D0, 23126 - 11904: 0xD4EC, 23127 - 11904: 0xD4DC, 23128 - 11904: 0xD4CF, 23129 - 11904: 0x94E2, 23130 - 11904: 0xB142, 23131 - 11904: 0xD4E1, 23132 - 11904: 0xD4EE, 23133 - 11904: 0xD4DE, 23134 - 11904: 0xD4D2, 23135 - 11904: 0xD4D7, 23136 - 11904: 0xD4CE, 23137 - 11904: 0x984F, 23138 - 11904: 0xB141, 23139 - 11904: 0xFBB5, 23140 - 11904: 0xD4DB, 23141 - 11904: 0xD4D8, 23142 - 11904: 0xB0FC, 23143 - 11904: 0xD4D1, 23144 - 11904: 0x9271, 23145 - 11904: 0xD4E9, 23146 - 11904: 0xB0FD, 23147 - 11904: 0x9365, 23148 - 11904: 0xD4D9, 23149 - 11904: 0xD4D5, 23150 - 11904: 0x985B, 23152 - 11904: 0xD4E8, 23153 - 11904: 0x9850, 23159 - 11904: 0xFBB8, 23160 - 11904: 0xD8BB, 23161 - 11904: 0x97BC, 23162 - 11904: 0xD8B8, 23163 - 11904: 0xD8C9, 23164 - 11904: 0xD8BD, 23165 - 11904: 0xD8CA, 23166 - 11904: 0x92F3, 23167 - 11904: 0xB442, 23169 - 11904: 0x9340, 23170 - 11904: 0x984D, 23171 - 11904: 0xD8C6, 23172 - 11904: 0xD8C3, 23174 - 11904: 0x9572, 23176 - 11904: 0xFDEF, 23178 - 11904: 0xD8C4, 23179 - 11904: 0xD8C7, 23180 - 11904: 0xD8CB, 23182 - 11904: 0xD4E3, 23183 - 11904: 0xD8CD, 23184 - 11904: 0xDD47, 23185 - 11904: 0xFDC1, 23186 - 11904: 0xB443, 23187 - 11904: 0xD8CE, 23188 - 11904: 0xD8B6, 23189 - 11904: 0xD8C0, 23190 - 11904: 0xFBBA, 23191 - 11904: 0xD8C5, 23193 - 11904: 0x92EB, 23194 - 11904: 0xB441, 23195 - 11904: 0xB444, 23196 - 11904: 0xD8CC, 23197 - 11904: 0xD8CF, 23198 - 11904: 0xD8BA, 23199 - 11904: 0xD8B7, 23200 - 11904: 0xFC73, 23201 - 11904: 0x97B7, 23202 - 11904: 0xD8B9, 23204 - 11904: 0x876F, 23205 - 11904: 0xD8BE, 23206 - 11904: 0xD8BC, 23207 - 11904: 0xB445, 23209 - 11904: 0xD8C8, 23211 - 11904: 0xFBB4, 23212 - 11904: 0xD8BF, 23214 - 11904: 0xD8C1, 23215 - 11904: 0xD8B5, 23216 - 11904: 0xDCFA, 23217 - 11904: 0xDCF8, 23218 - 11904: 0xB742, 23219 - 11904: 0xB740, 23220 - 11904: 0xDD43, 23221 - 11904: 0xDCF9, 23222 - 11904: 0xDD44, 23223 - 11904: 0xDD40, 23224 - 11904: 0xDCF7, 23225 - 11904: 0xDD46, 23226 - 11904: 0xDCF6, 23227 - 11904: 0xDCFD, 23228 - 11904: 0xB6FE, 23229 - 11904: 0xB6FD, 23230 - 11904: 0xB6FC, 23231 - 11904: 0xDCFB, 23232 - 11904: 0xDD41, 23233 - 11904: 0xB6F9, 23234 - 11904: 0xB741, 23235 - 11904: 0x90A7, 23236 - 11904: 0xDCF4, 23238 - 11904: 0xDCFE, 23239 - 11904: 0xDCF3, 23240 - 11904: 0xDCFC, 23241 - 11904: 0xB6FA, 23242 - 11904: 0xDD42, 23243 - 11904: 0xDCF5, 23244 - 11904: 0xB6FB, 23245 - 11904: 0xDD45, 23246 - 11904: 0x9741, 23247 - 11904: 0x92F4, 23249 - 11904: 0x8772, 23251 - 11904: 0xFBBC, 23253 - 11904: 0xE16E, 23254 - 11904: 0xB9E2, 23255 - 11904: 0xB9E1, 23256 - 11904: 0xB9E3, 23257 - 11904: 0xE17A, 23258 - 11904: 0xE170, 23259 - 11904: 0xE176, 23260 - 11904: 0xE16B, 23261 - 11904: 0xE179, 23262 - 11904: 0xE178, 23263 - 11904: 0xE17C, 23264 - 11904: 0xE175, 23265 - 11904: 0xB9DE, 23266 - 11904: 0xE174, 23267 - 11904: 0xB9E4, 23268 - 11904: 0x9577, 23269 - 11904: 0xE16D, 23270 - 11904: 0xB9DF, 23272 - 11904: 0xE17B, 23273 - 11904: 0xB9E0, 23274 - 11904: 0xE16F, 23275 - 11904: 0xE172, 23276 - 11904: 0xE177, 23277 - 11904: 0xE171, 23278 - 11904: 0xE16C, 23280 - 11904: 0x9EE2, 23282 - 11904: 0x8F78, 23283 - 11904: 0xE173, 23284 - 11904: 0xE555, 23285 - 11904: 0xBC61, 23286 - 11904: 0xE558, 23287 - 11904: 0xE557, 23288 - 11904: 0xE55A, 23289 - 11904: 0xE55C, 23290 - 11904: 0xF9DC, 23291 - 11904: 0xBC5F, 23293 - 11904: 0xE556, 23294 - 11904: 0x9672, 23295 - 11904: 0xE554, 23297 - 11904: 0xE55D, 23298 - 11904: 0xE55B, 23299 - 11904: 0xE559, 23301 - 11904: 0xE55F, 23303 - 11904: 0xE55E, 23304 - 11904: 0xBC63, 23305 - 11904: 0xBC5E, 23307 - 11904: 0xBC60, 23308 - 11904: 0xBC62, 23309 - 11904: 0x9EB5, 23311 - 11904: 0xE560, 23312 - 11904: 0xE957, 23313 - 11904: 0x964B, 23315 - 11904: 0xE956, 23316 - 11904: 0xE955, 23317 - 11904: 0x8CAC, 23318 - 11904: 0xE958, 23319 - 11904: 0xE951, 23321 - 11904: 0xE952, 23322 - 11904: 0xE95A, 23323 - 11904: 0xE953, 23325 - 11904: 0xBEC5, 23326 - 11904: 0xE95C, 23327 - 11904: 0xA0FA, 23328 - 11904: 0xE95B, 23329 - 11904: 0xE954, 23331 - 11904: 0xECD1, 23332 - 11904: 0xC0A8, 23333 - 11904: 0xECCF, 23334 - 11904: 0xECD4, 23335 - 11904: 0xECD3, 23336 - 11904: 0xE959, 23338 - 11904: 0xC0A7, 23339 - 11904: 0x9575, 23340 - 11904: 0xECD2, 23341 - 11904: 0xECCE, 23342 - 11904: 0xECD6, 23343 - 11904: 0xECD5, 23344 - 11904: 0xC0A6, 23346 - 11904: 0xECD0, 23348 - 11904: 0xBEC6, 23352 - 11904: 0xC254, 23356 - 11904: 0xEFC1, 23357 - 11904: 0xF1FA, 23358 - 11904: 0xF1FB, 23359 - 11904: 0xF1FC, 23360 - 11904: 0xC45C, 23361 - 11904: 0x90DA, 23363 - 11904: 0xC45D, 23364 - 11904: 0x9367, 23365 - 11904: 0xF443, 23366 - 11904: 0xFEA4, 23367 - 11904: 0xF5C8, 23368 - 11904: 0xF5C7, 23370 - 11904: 0x90DF, 23371 - 11904: 0xF6DB, 23372 - 11904: 0xF6DC, 23373 - 11904: 0xF7D5, 23374 - 11904: 0xF8A7, 23375 - 11904: 0x9354, 23376 - 11904: 0xA46C, 23377 - 11904: 0xA46D, 23379 - 11904: 0xA46E, 23380 - 11904: 0xA4D5, 23381 - 11904: 0xA5A5, 23382 - 11904: 0xC9D3, 23383 - 11904: 0xA672, 23384 - 11904: 0xA673, 23386 - 11904: 0xA7B7, 23387 - 11904: 0xA7B8, 23388 - 11904: 0xA7B6, 23389 - 11904: 0xA7B5, 23391 - 11904: 0xA973, 23394 - 11904: 0xCC55, 23395 - 11904: 0xA975, 23396 - 11904: 0xA974, 23397 - 11904: 0xCC56, 23398 - 11904: 0x8961, 23400 - 11904: 0x8BB4, 23401 - 11904: 0xABC4, 23403 - 11904: 0xAE5D, 23404 - 11904: 0xD165, 23405 - 11904: 0x9DC0, 23406 - 11904: 0xD4F0, 23408 - 11904: 0xB145, 23409 - 11904: 0xB447, 23410 - 11904: 0xD4EF, 23411 - 11904: 0xB446, 23412 - 11904: 0x8E48, 23413 - 11904: 0xB9E5, 23414 - 11904: 0xFBC5, 23415 - 11904: 0xE17D, 23416 - 11904: 0xBEC7, 23418 - 11904: 0xC0A9, 23419 - 11904: 0xECD7, 23420 - 11904: 0xFBC7, 23421 - 11904: 0xC45E, 23423 - 11904: 0xC570, 23424 - 11904: 0xC6CB, 23425 - 11904: 0xC972, 23426 - 11904: 0xFA79, 23427 - 11904: 0xA5A6, 23428 - 11904: 0xC973, 23429 - 11904: 0xA676, 23431 - 11904: 0xA674, 23432 - 11904: 0xA675, 23433 - 11904: 0xA677, 23435 - 11904: 0xA7BA, 23436 - 11904: 0xA7B9, 23438 - 11904: 0xCABC, 23439 - 11904: 0xA7BB, 23440 - 11904: 0x9E67, 23442 - 11904: 0xCABD, 23443 - 11904: 0xCC57, 23445 - 11904: 0xCC58, 23446 - 11904: 0x8CD9, 23447 - 11904: 0xA976, 23448 - 11904: 0xA978, 23449 - 11904: 0xA97A, 23450 - 11904: 0xA977, 23451 - 11904: 0xA97B, 23452 - 11904: 0xA979, 23453 - 11904: 0xFBD2, 23454 - 11904: 0x8962, 23455 - 11904: 0x8963, 23458 - 11904: 0xABC8, 23459 - 11904: 0xABC5, 23460 - 11904: 0xABC7, 23461 - 11904: 0xABC9, 23462 - 11904: 0xABC6, 23463 - 11904: 0xD166, 23464 - 11904: 0xCE77, 23466 - 11904: 0xFC7D, 23468 - 11904: 0xD168, 23469 - 11904: 0xD167, 23470 - 11904: 0xAE63, 23472 - 11904: 0xAE5F, 23475 - 11904: 0xAE60, 23476 - 11904: 0xAE62, 23477 - 11904: 0xAE64, 23478 - 11904: 0xAE61, 23479 - 11904: 0x8773, 23480 - 11904: 0xAE66, 23481 - 11904: 0xAE65, 23487 - 11904: 0xB14A, 23488 - 11904: 0xD4F2, 23489 - 11904: 0xD4F1, 23490 - 11904: 0xB149, 23491 - 11904: 0x9F6B, 23492 - 11904: 0xB148, 23493 - 11904: 0xB147, 23494 - 11904: 0xB14B, 23495 - 11904: 0xB146, 23498 - 11904: 0xD8D5, 23499 - 11904: 0xD8D2, 23500 - 11904: 0xB449, 23501 - 11904: 0xD8D1, 23502 - 11904: 0xD8D6, 23504 - 11904: 0xB44B, 23505 - 11904: 0xD8D4, 23506 - 11904: 0xB448, 23507 - 11904: 0xB44A, 23508 - 11904: 0xD8D3, 23509 - 11904: 0xFBCC, 23510 - 11904: 0xDD48, 23511 - 11904: 0xFEAE, 23512 - 11904: 0xDD49, 23513 - 11904: 0xDD4A, 23515 - 11904: 0x876D, 23518 - 11904: 0xB9E6, 23519 - 11904: 0xB9EE, 23520 - 11904: 0xE17E, 23521 - 11904: 0xB9E8, 23522 - 11904: 0xB9EC, 23523 - 11904: 0xE1A1, 23524 - 11904: 0xB9ED, 23525 - 11904: 0xB9E9, 23526 - 11904: 0xB9EA, 23527 - 11904: 0xB9E7, 23528 - 11904: 0xB9EB, 23529 - 11904: 0xBC66, 23530 - 11904: 0xD8D0, 23531 - 11904: 0xBC67, 23532 - 11904: 0xBC65, 23534 - 11904: 0xBC64, 23535 - 11904: 0xE95D, 23536 - 11904: 0xBEC8, 23537 - 11904: 0xECD8, 23538 - 11904: 0xECD9, 23539 - 11904: 0xFBD1, 23541 - 11904: 0xC364, 23542 - 11904: 0xC45F, 23544 - 11904: 0xA46F, 23546 - 11904: 0xA678, 23551 - 11904: 0xFB75, 23553 - 11904: 0xABCA, 23555 - 11904: 0xD169, 23556 - 11904: 0xAE67, 23557 - 11904: 0xFBD4, 23559 - 11904: 0xB14E, 23560 - 11904: 0xB14D, 23561 - 11904: 0xB14C, 23562 - 11904: 0xB44C, 23563 - 11904: 0xB44D, 23564 - 11904: 0xD8D7, 23565 - 11904: 0xB9EF, 23566 - 11904: 0xBEC9, 23567 - 11904: 0xA470, 23568 - 11904: 0xC95C, 23569 - 11904: 0xA4D6, 23570 - 11904: 0xC974, 23571 - 11904: 0xFBD6, 23572 - 11904: 0xFBD8, 23573 - 11904: 0xC9D4, 23574 - 11904: 0xA679, 23578 - 11904: 0xA97C, 23580 - 11904: 0x8B5D, 23582 - 11904: 0x934C, 23583 - 11904: 0xDD4B, 23584 - 11904: 0x9AE2, 23586 - 11904: 0xA471, 23587 - 11904: 0x8BC9, 23588 - 11904: 0xA4D7, 23589 - 11904: 0xC9D5, 23592 - 11904: 0xCABE, 23594 - 11904: 0xCABF, 23596 - 11904: 0xA7BC, 23600 - 11904: 0xD8D8, 23601 - 11904: 0xB44E, 23603 - 11904: 0xDD4C, 23607 - 11904: 0xC0AA, 23608 - 11904: 0xA472, 23609 - 11904: 0xA4A8, 23610 - 11904: 0xA4D8, 23611 - 11904: 0xC975, 23612 - 11904: 0xA5A7, 23614 - 11904: 0xA7C0, 23615 - 11904: 0xA7BF, 23616 - 11904: 0xA7BD, 23617 - 11904: 0xA7BE, 23620 - 11904: 0xCC59, 23621 - 11904: 0xA97E, 23622 - 11904: 0xA9A1, 23623 - 11904: 0xCC5A, 23624 - 11904: 0xA97D, 23625 - 11904: 0xFBDB, 23626 - 11904: 0x9FC9, 23627 - 11904: 0xABCE, 23628 - 11904: 0xCE78, 23629 - 11904: 0xABCD, 23630 - 11904: 0xABCB, 23631 - 11904: 0xABCC, 23632 - 11904: 0xAE6A, 23633 - 11904: 0xAE68, 23635 - 11904: 0x9F44, 23636 - 11904: 0xD16B, 23637 - 11904: 0xAE69, 23638 - 11904: 0xD16A, 23640 - 11904: 0xAE5E, 23641 - 11904: 0xD4F3, 23644 - 11904: 0xB150, 23645 - 11904: 0xB151, 23646 - 11904: 0x98ED, 23648 - 11904: 0xB14F, 23650 - 11904: 0xB9F0, 23651 - 11904: 0xE1A2, 23652 - 11904: 0xBC68, 23653 - 11904: 0xBC69, 23655 - 11904: 0xE561, 23656 - 11904: 0xC0AB, 23657 - 11904: 0xEFC2, 23658 - 11904: 0xEFC3, 23660 - 11904: 0xC4DD, 23661 - 11904: 0xF8A8, 23662 - 11904: 0xC94B, 23663 - 11904: 0xA4D9, 23665 - 11904: 0xA473, 23667 - 11904: 0xC977, 23668 - 11904: 0xC976, 23672 - 11904: 0x8CE9, 23673 - 11904: 0xA67A, 23674 - 11904: 0xC9D7, 23675 - 11904: 0xC9D8, 23676 - 11904: 0xC9D6, 23678 - 11904: 0xC9D9, 23685 - 11904: 0xFBDD, 23686 - 11904: 0xCAC7, 23688 - 11904: 0xCAC2, 23689 - 11904: 0xCAC4, 23690 - 11904: 0xCAC6, 23691 - 11904: 0xCAC3, 23692 - 11904: 0xA7C4, 23693 - 11904: 0xCAC0, 23695 - 11904: 0xCAC1, 23696 - 11904: 0xA7C1, 23697 - 11904: 0xA7C2, 23698 - 11904: 0xCAC5, 23699 - 11904: 0xCAC8, 23700 - 11904: 0xA7C3, 23701 - 11904: 0xCAC9, 23705 - 11904: 0x8DF2, 23706 - 11904: 0x8964, 23708 - 11904: 0xFDF2, 23709 - 11904: 0xCC68, 23710 - 11904: 0x934D, 23711 - 11904: 0xCC62, 23712 - 11904: 0xCC5D, 23713 - 11904: 0xA9A3, 23714 - 11904: 0xCC65, 23715 - 11904: 0xCC63, 23716 - 11904: 0xCC5C, 23717 - 11904: 0xCC69, 23718 - 11904: 0xCC6C, 23719 - 11904: 0xCC67, 23720 - 11904: 0xCC60, 23721 - 11904: 0xA9A5, 23722 - 11904: 0xCC66, 23723 - 11904: 0xA9A6, 23724 - 11904: 0xCC61, 23725 - 11904: 0xCC64, 23726 - 11904: 0xCC5B, 23727 - 11904: 0xCC5F, 23728 - 11904: 0xCC6B, 23729 - 11904: 0xA9A7, 23731 - 11904: 0xA9A8, 23733 - 11904: 0xCC5E, 23734 - 11904: 0xCC6A, 23735 - 11904: 0xA9A2, 23736 - 11904: 0xA9A4, 23738 - 11904: 0xFBE7, 23745 - 11904: 0xA0F2, 23746 - 11904: 0x9868, 23750 - 11904: 0xCEAB, 23751 - 11904: 0xCEA4, 23752 - 11904: 0xCEAA, 23753 - 11904: 0xCEA3, 23754 - 11904: 0xCEA5, 23755 - 11904: 0xCE7D, 23756 - 11904: 0xCE7B, 23758 - 11904: 0xCEAC, 23759 - 11904: 0xCEA9, 23760 - 11904: 0xCE79, 23761 - 11904: 0x9F58, 23762 - 11904: 0xABD0, 23763 - 11904: 0xCEA7, 23764 - 11904: 0xCEA8, 23765 - 11904: 0x8CE6, 23766 - 11904: 0xCEA6, 23767 - 11904: 0xCE7C, 23768 - 11904: 0xCE7A, 23769 - 11904: 0xABCF, 23770 - 11904: 0xCEA2, 23771 - 11904: 0xCE7E, 23774 - 11904: 0xCEA1, 23775 - 11904: 0xCEAD, 23781 - 11904: 0x8D73, 23784 - 11904: 0xAE6F, 23785 - 11904: 0xFBDE, 23786 - 11904: 0xAE6E, 23788 - 11904: 0xD16C, 23789 - 11904: 0xAE6B, 23790 - 11904: 0xD16E, 23791 - 11904: 0xFBDF, 23792 - 11904: 0xAE70, 23793 - 11904: 0xD16F, 23796 - 11904: 0xAE73, 23797 - 11904: 0x8C48, 23798 - 11904: 0xAE71, 23799 - 11904: 0xD170, 23800 - 11904: 0xCEAE, 23801 - 11904: 0xD172, 23803 - 11904: 0xAE6D, 23804 - 11904: 0x8774, 23805 - 11904: 0xAE6C, 23807 - 11904: 0xD16D, 23808 - 11904: 0xD171, 23809 - 11904: 0xAE72, 23814 - 11904: 0xB153, 23815 - 11904: 0xB152, 23819 - 11904: 0xD4F5, 23820 - 11904: 0xD4F9, 23821 - 11904: 0xD4FB, 23822 - 11904: 0xB154, 23823 - 11904: 0xD4FE, 23824 - 11904: 0xFBE3, 23825 - 11904: 0xB158, 23826 - 11904: 0xD541, 23828 - 11904: 0xB15A, 23829 - 11904: 0x8DA8, 23830 - 11904: 0xB156, 23831 - 11904: 0xB15E, 23832 - 11904: 0xFBE4, 23833 - 11904: 0xB15B, 23834 - 11904: 0xD4F7, 23835 - 11904: 0xB155, 23837 - 11904: 0xD4F6, 23838 - 11904: 0xD4F4, 23839 - 11904: 0xD543, 23840 - 11904: 0xD4F8, 23842 - 11904: 0xB157, 23843 - 11904: 0xD542, 23844 - 11904: 0xB15C, 23845 - 11904: 0xD4FD, 23846 - 11904: 0xD4FC, 23847 - 11904: 0xB15D, 23848 - 11904: 0xD4FA, 23849 - 11904: 0xB159, 23852 - 11904: 0x9C75, 23854 - 11904: 0xD544, 23855 - 11904: 0x9878, 23856 - 11904: 0xD540, 23857 - 11904: 0xD8E7, 23858 - 11904: 0xD8EE, 23859 - 11904: 0xD8E3, 23860 - 11904: 0xB451, 23861 - 11904: 0xD8DF, 23862 - 11904: 0xD8EF, 23863 - 11904: 0xD8D9, 23864 - 11904: 0xD8EC, 23865 - 11904: 0xD8EA, 23866 - 11904: 0xD8E4, 23868 - 11904: 0xD8ED, 23869 - 11904: 0xD8E6, 23870 - 11904: 0x8D60, 23871 - 11904: 0xD8DE, 23872 - 11904: 0xD8F0, 23873 - 11904: 0xD8DC, 23874 - 11904: 0xD8E9, 23875 - 11904: 0xD8DA, 23877 - 11904: 0xD8F1, 23878 - 11904: 0xFBE5, 23879 - 11904: 0xB452, 23880 - 11904: 0x8D61, 23881 - 11904: 0xD8EB, 23882 - 11904: 0xDD4F, 23883 - 11904: 0xD8DD, 23884 - 11904: 0xB44F, 23886 - 11904: 0xD8E1, 23888 - 11904: 0xB450, 23889 - 11904: 0xD8E0, 23890 - 11904: 0xD8E5, 23893 - 11904: 0xD8E2, 23894 - 11904: 0x8D62, 23895 - 11904: 0xA0A1, 23897 - 11904: 0xD8E8, 23899 - 11904: 0x9C40, 23902 - 11904: 0xDD53, 23906 - 11904: 0xDD56, 23907 - 11904: 0xDD4E, 23909 - 11904: 0xDD50, 23911 - 11904: 0xDD55, 23912 - 11904: 0xDD54, 23913 - 11904: 0xB743, 23915 - 11904: 0xD8DB, 23916 - 11904: 0xDD52, 23919 - 11904: 0xB744, 23920 - 11904: 0x98AD, 23921 - 11904: 0xDD4D, 23922 - 11904: 0xDD51, 23924 - 11904: 0x9EEA, 23927 - 11904: 0xE1A9, 23928 - 11904: 0x8CEC, 23929 - 11904: 0xE1B0, 23930 - 11904: 0xE1A7, 23931 - 11904: 0x8CD4, 23932 - 11904: 0xE1AE, 23933 - 11904: 0xE1A5, 23934 - 11904: 0xE1AD, 23935 - 11904: 0xE1B1, 23936 - 11904: 0xE1A4, 23937 - 11904: 0xE1A8, 23938 - 11904: 0xE1A3, 23940 - 11904: 0xB9F1, 23941 - 11904: 0x9CEB, 23942 - 11904: 0xE1A6, 23943 - 11904: 0xB9F2, 23944 - 11904: 0xE1AC, 23945 - 11904: 0xE1AB, 23946 - 11904: 0xE1AA, 23947 - 11904: 0xFBE0, 23949 - 11904: 0xE1AF, 23950 - 11904: 0x9F51, 23954 - 11904: 0xE565, 23955 - 11904: 0xE567, 23956 - 11904: 0xBC6B, 23957 - 11904: 0xE568, 23959 - 11904: 0xE563, 23961 - 11904: 0xE562, 23962 - 11904: 0xE56C, 23964 - 11904: 0xE56A, 23965 - 11904: 0xBC6A, 23966 - 11904: 0xE56D, 23967 - 11904: 0xE564, 23968 - 11904: 0xE569, 23969 - 11904: 0xE56B, 23970 - 11904: 0xE566, 23972 - 11904: 0x8D65, 23975 - 11904: 0xE961, 23976 - 11904: 0xE966, 23977 - 11904: 0xE960, 23978 - 11904: 0xE965, 23979 - 11904: 0x9CF1, 23980 - 11904: 0xE95E, 23981 - 11904: 0xE968, 23982 - 11904: 0xE964, 23983 - 11904: 0xE969, 23984 - 11904: 0xE963, 23985 - 11904: 0xE95F, 23986 - 11904: 0xE967, 23988 - 11904: 0xE96A, 23989 - 11904: 0xE962, 23990 - 11904: 0xFC58, 23991 - 11904: 0xECDA, 23992 - 11904: 0xC0AF, 23993 - 11904: 0x8D66, 23994 - 11904: 0xC0AD, 23996 - 11904: 0xC0AC, 23997 - 11904: 0xC0AE, 24000 - 11904: 0xEFC4, 24001 - 11904: 0x9654, 24002 - 11904: 0xF172, 24003 - 11904: 0xF1FD, 24006 - 11904: 0xF444, 24007 - 11904: 0xF445, 24009 - 11904: 0xC460, 24011 - 11904: 0xF5C9, 24013 - 11904: 0xC4DE, 24015 - 11904: 0xF5CA, 24017 - 11904: 0xF6DE, 24018 - 11904: 0xC572, 24020 - 11904: 0xC571, 24021 - 11904: 0xF6DD, 24022 - 11904: 0xC5C9, 24023 - 11904: 0xFBE8, 24024 - 11904: 0xF7D6, 24027 - 11904: 0xC6CC, 24029 - 11904: 0xA474, 24030 - 11904: 0xA67B, 24031 - 11904: 0xC9DA, 24032 - 11904: 0xCACA, 24033 - 11904: 0xA8B5, 24034 - 11904: 0xB15F, 24037 - 11904: 0xA475, 24038 - 11904: 0xA5AA, 24039 - 11904: 0xA5A9, 24040 - 11904: 0xA5A8, 24043 - 11904: 0xA7C5, 24046 - 11904: 0xAE74, 24048 - 11904: 0xDD57, 24049 - 11904: 0xA476, 24050 - 11904: 0xA477, 24051 - 11904: 0xA478, 24052 - 11904: 0xA4DA, 24053 - 11904: 0x9FCE, 24055 - 11904: 0xABD1, 24057 - 11904: 0xCEAF, 24061 - 11904: 0xB453, 24062 - 11904: 0xA479, 24063 - 11904: 0xC95D, 24066 - 11904: 0xA5AB, 24067 - 11904: 0xA5AC, 24068 - 11904: 0xC978, 24070 - 11904: 0xA67C, 24073 - 11904: 0xFBFC, 24074 - 11904: 0xCACB, 24075 - 11904: 0x9AE4, 24076 - 11904: 0xA7C6, 24078 - 11904: 0xCACC, 24081 - 11904: 0xA9AE, 24082 - 11904: 0x9F75, 24084 - 11904: 0xCC6E, 24085 - 11904: 0xA9AC, 24086 - 11904: 0xA9AB, 24087 - 11904: 0xCC6D, 24088 - 11904: 0xA9A9, 24089 - 11904: 0xCC6F, 24090 - 11904: 0xA9AA, 24091 - 11904: 0xA9AD, 24093 - 11904: 0xABD2, 24095 - 11904: 0xABD4, 24096 - 11904: 0xCEB3, 24097 - 11904: 0xCEB0, 24098 - 11904: 0xCEB1, 24099 - 11904: 0xCEB2, 24100 - 11904: 0xCEB4, 24101 - 11904: 0xABD3, 24104 - 11904: 0xD174, 24105 - 11904: 0xD173, 24107 - 11904: 0xAE76, 24109 - 11904: 0xAE75, 24110 - 11904: 0xFBF1, 24115 - 11904: 0xB162, 24116 - 11904: 0xD546, 24118 - 11904: 0xB161, 24119 - 11904: 0xB163, 24120 - 11904: 0xB160, 24125 - 11904: 0xB455, 24126 - 11904: 0xD545, 24128 - 11904: 0xB456, 24129 - 11904: 0xD8F3, 24130 - 11904: 0x8D69, 24131 - 11904: 0xB457, 24132 - 11904: 0xD8F2, 24133 - 11904: 0xB454, 24136 - 11904: 0x934F, 24138 - 11904: 0xDD5A, 24139 - 11904: 0xDD5C, 24140 - 11904: 0xB745, 24141 - 11904: 0xDD5B, 24142 - 11904: 0xDD59, 24143 - 11904: 0xDD58, 24147 - 11904: 0xE1B4, 24148 - 11904: 0xB9F7, 24149 - 11904: 0xB9F5, 24151 - 11904: 0xB9F6, 24152 - 11904: 0xE1B2, 24153 - 11904: 0xE1B3, 24155 - 11904: 0xB9F3, 24156 - 11904: 0xE571, 24157 - 11904: 0xE56F, 24158 - 11904: 0x934E, 24159 - 11904: 0xBC6D, 24160 - 11904: 0xE570, 24161 - 11904: 0xBC6E, 24162 - 11904: 0xBC6C, 24163 - 11904: 0xB9F4, 24166 - 11904: 0xE96D, 24167 - 11904: 0xE96B, 24168 - 11904: 0xE96C, 24169 - 11904: 0xE56E, 24170 - 11904: 0xECDC, 24171 - 11904: 0xC0B0, 24172 - 11904: 0xECDB, 24173 - 11904: 0xEFC5, 24174 - 11904: 0xEFC6, 24175 - 11904: 0xE96E, 24176 - 11904: 0xF1FE, 24178 - 11904: 0xA47A, 24179 - 11904: 0xA5AD, 24180 - 11904: 0xA67E, 24181 - 11904: 0xFBF3, 24182 - 11904: 0xA67D, 24184 - 11904: 0xA9AF, 24185 - 11904: 0xB746, 24186 - 11904: 0xFBF4, 24187 - 11904: 0xA4DB, 24188 - 11904: 0xA5AE, 24189 - 11904: 0xABD5, 24190 - 11904: 0xB458, 24191 - 11904: 0xC6CE, 24192 - 11904: 0xC979, 24194 - 11904: 0xC97A, 24195 - 11904: 0xFBC3, 24196 - 11904: 0xC9DC, 24198 - 11904: 0x8965, 24199 - 11904: 0xA7C8, 24200 - 11904: 0xCAD0, 24201 - 11904: 0xCACE, 24202 - 11904: 0xA7C9, 24203 - 11904: 0xCACD, 24204 - 11904: 0xCACF, 24205 - 11904: 0xCAD1, 24207 - 11904: 0xA7C7, 24210 - 11904: 0x8C7A, 24213 - 11904: 0xA9B3, 24214 - 11904: 0xA9B4, 24215 - 11904: 0xA9B1, 24217 - 11904: 0x8C7B, 24218 - 11904: 0xA9B0, 24219 - 11904: 0xCEB8, 24220 - 11904: 0xA9B2, 24224 - 11904: 0xABD6, 24226 - 11904: 0xCEB7, 24227 - 11904: 0xCEB9, 24228 - 11904: 0xCEB6, 24229 - 11904: 0xCEBA, 24230 - 11904: 0xABD7, 24231 - 11904: 0xAE79, 24232 - 11904: 0xD175, 24234 - 11904: 0xD177, 24235 - 11904: 0xAE77, 24236 - 11904: 0xD178, 24237 - 11904: 0xAE78, 24238 - 11904: 0xD176, 24240 - 11904: 0xCEB5, 24241 - 11904: 0xD547, 24242 - 11904: 0xD54A, 24243 - 11904: 0xD54B, 24244 - 11904: 0xD548, 24245 - 11904: 0xB167, 24246 - 11904: 0xB166, 24247 - 11904: 0xB164, 24248 - 11904: 0xB165, 24249 - 11904: 0xD549, 24253 - 11904: 0x8D6A, 24254 - 11904: 0xB168, 24257 - 11904: 0xB45A, 24258 - 11904: 0xB45B, 24260 - 11904: 0xB45C, 24261 - 11904: 0xDD5D, 24262 - 11904: 0xDD5F, 24263 - 11904: 0xDD61, 24264 - 11904: 0xB748, 24265 - 11904: 0xB747, 24266 - 11904: 0xB459, 24267 - 11904: 0xDD60, 24268 - 11904: 0xDD5E, 24269 - 11904: 0x9353, 24270 - 11904: 0xE1B8, 24272 - 11904: 0xFBF9, 24273 - 11904: 0xE1B6, 24274 - 11904: 0xE1BC, 24275 - 11904: 0xB9F8, 24276 - 11904: 0xE1BD, 24277 - 11904: 0xE1BA, 24278 - 11904: 0xB9F9, 24279 - 11904: 0xE1B7, 24280 - 11904: 0xE1B5, 24281 - 11904: 0xE1BB, 24282 - 11904: 0xBC70, 24283 - 11904: 0xE573, 24284 - 11904: 0xE1B9, 24285 - 11904: 0xBC72, 24286 - 11904: 0xE574, 24287 - 11904: 0xBC71, 24288 - 11904: 0xBC74, 24289 - 11904: 0xE575, 24290 - 11904: 0xBC6F, 24291 - 11904: 0xBC73, 24293 - 11904: 0xE973, 24294 - 11904: 0xE971, 24295 - 11904: 0xE970, 24296 - 11904: 0xE972, 24297 - 11904: 0xE96F, 24300 - 11904: 0xC366, 24302 - 11904: 0xF446, 24303 - 11904: 0xF447, 24305 - 11904: 0xF5CB, 24306 - 11904: 0xF6DF, 24307 - 11904: 0xC655, 24308 - 11904: 0xFBFD, 24310 - 11904: 0xA9B5, 24311 - 11904: 0xA7CA, 24312 - 11904: 0x9059, 24313 - 11904: 0xFC40, 24314 - 11904: 0xABD8, 24315 - 11904: 0xFC41, 24316 - 11904: 0xFC43, 24318 - 11904: 0xA47B, 24319 - 11904: 0xA4DC, 24321 - 11904: 0xA5AF, 24322 - 11904: 0xC9DD, 24324 - 11904: 0xA7CB, 24325 - 11904: 0xCAD2, 24327 - 11904: 0xCEBB, 24328 - 11904: 0xABD9, 24330 - 11904: 0xB9FA, 24331 - 11904: 0xA47C, 24332 - 11904: 0x9FD8, 24333 - 11904: 0xFC46, 24334 - 11904: 0x9362, 24335 - 11904: 0xA6A1, 24338 - 11904: 0xB749, 24339 - 11904: 0xA47D, 24340 - 11904: 0xA4DD, 24341 - 11904: 0xA4DE, 24343 - 11904: 0xA5B1, 24344 - 11904: 0xA5B0, 24346 - 11904: 0xC9DE, 24347 - 11904: 0xA6A2, 24349 - 11904: 0xCAD3, 24351 - 11904: 0xA7CC, 24354 - 11904: 0xCC71, 24355 - 11904: 0xCC72, 24356 - 11904: 0xCC73, 24357 - 11904: 0x8D6B, 24358 - 11904: 0xA9B6, 24359 - 11904: 0xA9B7, 24360 - 11904: 0xCC70, 24361 - 11904: 0xA9B8, 24365 - 11904: 0xABDA, 24366 - 11904: 0xCEBC, 24368 - 11904: 0xD17A, 24369 - 11904: 0xAE7A, 24371 - 11904: 0xD179, 24373 - 11904: 0xB169, 24374 - 11904: 0xD54C, 24375 - 11904: 0xB16A, 24376 - 11904: 0xD54D, 24378 - 11904: 0xFC4C, 24379 - 11904: 0x8CFE, 24380 - 11904: 0xB45D, 24384 - 11904: 0xDD62, 24387 - 11904: 0xE1BF, 24388 - 11904: 0xE1BE, 24390 - 11904: 0xB9FB, 24392 - 11904: 0xBC75, 24393 - 11904: 0xE576, 24394 - 11904: 0xBECA, 24395 - 11904: 0xE974, 24396 - 11904: 0xC0B1, 24397 - 11904: 0x95B8, 24398 - 11904: 0xC573, 24399 - 11904: 0xF7D8, 24400 - 11904: 0xC6D0, 24401 - 11904: 0x8BCA, 24404 - 11904: 0xCC74, 24406 - 11904: 0xCEBD, 24407 - 11904: 0xB16B, 24408 - 11904: 0xFC4F, 24409 - 11904: 0xB74A, 24412 - 11904: 0x987A, 24413 - 11904: 0xC255, 24417 - 11904: 0xC6D1, 24418 - 11904: 0xA7CE, 24419 - 11904: 0xFC51, 24420 - 11904: 0xA7CD, 24421 - 11904: 0xABDB, 24423 - 11904: 0xD17B, 24425 - 11904: 0xB16D, 24426 - 11904: 0xB343, 24427 - 11904: 0xB16E, 24428 - 11904: 0xB16C, 24429 - 11904: 0xB45E, 24431 - 11904: 0xE1C0, 24432 - 11904: 0xB9FC, 24433 - 11904: 0xBC76, 24434 - 11904: 0xFC54, 24435 - 11904: 0xC94C, 24436 - 11904: 0xC9DF, 24438 - 11904: 0xCAD5, 24439 - 11904: 0xA7CF, 24440 - 11904: 0xCAD4, 24441 - 11904: 0xA7D0, 24443 - 11904: 0xFAAF, 24444 - 11904: 0xA9BC, 24445 - 11904: 0xCC77, 24446 - 11904: 0xCC76, 24447 - 11904: 0xA9BB, 24448 - 11904: 0xA9B9, 24449 - 11904: 0xA9BA, 24450 - 11904: 0xCC75, 24451 - 11904: 0x8D6C, 24453 - 11904: 0xABDD, 24454 - 11904: 0xCEBE, 24455 - 11904: 0xABE0, 24456 - 11904: 0xABDC, 24457 - 11904: 0xABE2, 24458 - 11904: 0xABDE, 24459 - 11904: 0xABDF, 24460 - 11904: 0xABE1, 24464 - 11904: 0xAE7D, 24465 - 11904: 0xAE7C, 24466 - 11904: 0xAE7B, 24470 - 11904: 0xD54F, 24471 - 11904: 0xB16F, 24472 - 11904: 0xB172, 24473 - 11904: 0xB170, 24475 - 11904: 0xD54E, 24476 - 11904: 0xB175, 24478 - 11904: 0xB171, 24479 - 11904: 0xD550, 24480 - 11904: 0xB174, 24481 - 11904: 0xB173, 24484 - 11904: 0xFA61, 24485 - 11904: 0xD8F6, 24486 - 11904: 0xD8F5, 24487 - 11904: 0xFC57, 24488 - 11904: 0xB461, 24489 - 11904: 0xB45F, 24490 - 11904: 0xB460, 24491 - 11904: 0xD8F7, 24492 - 11904: 0xB74B, 24493 - 11904: 0xDD64, 24494 - 11904: 0xB74C, 24495 - 11904: 0xDD63, 24497 - 11904: 0x9B70, 24498 - 11904: 0xE577, 24501 - 11904: 0xBC78, 24502 - 11904: 0xE1C1, 24503 - 11904: 0xBC77, 24505 - 11904: 0xB9FD, 24506 - 11904: 0xA051, 24507 - 11904: 0xECDE, 24508 - 11904: 0xE975, 24509 - 11904: 0xC0B2, 24510 - 11904: 0xECDD, 24511 - 11904: 0xF240, 24512 - 11904: 0xF448, 24513 - 11904: 0xF449, 24514 - 11904: 0x8C7C, 24515 - 11904: 0xA4DF, 24516 - 11904: 0x8BCB, 24517 - 11904: 0xA5B2, 24521 - 11904: 0xC97B, 24524 - 11904: 0xA7D2, 24525 - 11904: 0xA7D4, 24527 - 11904: 0xC9E2, 24528 - 11904: 0xCAD8, 24529 - 11904: 0xCAD7, 24530 - 11904: 0xCAD6, 24532 - 11904: 0xC9E1, 24533 - 11904: 0xC9E0, 24534 - 11904: 0xA6A4, 24535 - 11904: 0xA7D3, 24536 - 11904: 0xA7D1, 24537 - 11904: 0xA6A3, 24539 - 11904: 0x936E, 24541 - 11904: 0xA9BD, 24542 - 11904: 0xCC78, 24543 - 11904: 0xFCD5, 24544 - 11904: 0xA9BE, 24545 - 11904: 0xCADD, 24547 - 11904: 0xCADF, 24548 - 11904: 0xCADE, 24549 - 11904: 0xCC79, 24552 - 11904: 0xCADA, 24554 - 11904: 0xA7D8, 24555 - 11904: 0xA7D6, 24557 - 11904: 0xCAD9, 24558 - 11904: 0xCADB, 24559 - 11904: 0xCAE1, 24561 - 11904: 0xA7D5, 24563 - 11904: 0xCADC, 24564 - 11904: 0xCAE5, 24565 - 11904: 0xA9C0, 24567 - 11904: 0xCAE2, 24568 - 11904: 0xA7D7, 24570 - 11904: 0xCAE0, 24571 - 11904: 0xCAE3, 24573 - 11904: 0xA9BF, 24575 - 11904: 0xA9C1, 24576 - 11904: 0xCAE4, 24585 - 11904: 0xCCAF, 24586 - 11904: 0xCCA2, 24587 - 11904: 0xCC7E, 24588 - 11904: 0xCCAE, 24589 - 11904: 0xCCA9, 24590 - 11904: 0xABE7, 24591 - 11904: 0xA9C2, 24592 - 11904: 0xCCAA, 24593 - 11904: 0xCCAD, 24594 - 11904: 0xABE3, 24595 - 11904: 0xCCAC, 24596 - 11904: 0xA9C3, 24597 - 11904: 0xA9C8, 24598 - 11904: 0xA9C6, 24599 - 11904: 0xCCA3, 24601 - 11904: 0xCC7C, 24602 - 11904: 0xCCA5, 24603 - 11904: 0xA9CD, 24604 - 11904: 0xCCB0, 24605 - 11904: 0xABE4, 24606 - 11904: 0xCCA6, 24608 - 11904: 0xABE5, 24609 - 11904: 0xA9C9, 24610 - 11904: 0xCCA8, 24611 - 11904: 0xFCA9, 24612 - 11904: 0xCECD, 24613 - 11904: 0xABE6, 24614 - 11904: 0xCC7B, 24615 - 11904: 0xA9CA, 24616 - 11904: 0xABE8, 24617 - 11904: 0xA9CB, 24618 - 11904: 0xA9C7, 24619 - 11904: 0xA9CC, 24620 - 11904: 0xCCA7, 24621 - 11904: 0xCC7A, 24622 - 11904: 0xCCAB, 24623 - 11904: 0xA9C4, 24625 - 11904: 0xFC61, 24626 - 11904: 0xCC7D, 24627 - 11904: 0xCCA4, 24628 - 11904: 0xCCA1, 24629 - 11904: 0xA9C5, 24631 - 11904: 0xCEBF, 24633 - 11904: 0xCEC0, 24635 - 11904: 0x8966, 24640 - 11904: 0xCECA, 24641 - 11904: 0xD1A1, 24642 - 11904: 0xCECB, 24643 - 11904: 0xABEE, 24644 - 11904: 0xCECE, 24645 - 11904: 0xCEC4, 24646 - 11904: 0xABED, 24647 - 11904: 0xCEC6, 24649 - 11904: 0xCEC7, 24650 - 11904: 0xFACB, 24652 - 11904: 0xCEC9, 24653 - 11904: 0xABE9, 24656 - 11904: 0xAEA3, 24658 - 11904: 0xF9DA, 24659 - 11904: 0xCEC5, 24660 - 11904: 0xCEC1, 24661 - 11904: 0xAEA4, 24664 - 11904: 0xCECF, 24665 - 11904: 0xAE7E, 24666 - 11904: 0xD17D, 24667 - 11904: 0xCEC8, 24669 - 11904: 0xD17C, 24670 - 11904: 0xCEC3, 24671 - 11904: 0xCECC, 24674 - 11904: 0xABEC, 24675 - 11904: 0xAEA1, 24676 - 11904: 0xABF2, 24677 - 11904: 0xAEA2, 24678 - 11904: 0xCED0, 24679 - 11904: 0xD17E, 24680 - 11904: 0xABEB, 24681 - 11904: 0xAEA6, 24682 - 11904: 0xABF1, 24683 - 11904: 0xABF0, 24684 - 11904: 0xABEF, 24685 - 11904: 0xAEA5, 24686 - 11904: 0xCED1, 24687 - 11904: 0xAEA7, 24688 - 11904: 0xABEA, 24690 - 11904: 0xCEC2, 24693 - 11904: 0x937A, 24695 - 11904: 0xA0E0, 24702 - 11904: 0x936B, 24703 - 11904: 0xB176, 24704 - 11904: 0xD1A4, 24705 - 11904: 0xD1A6, 24707 - 11904: 0xD1A8, 24708 - 11904: 0xAEA8, 24709 - 11904: 0xAEAE, 24710 - 11904: 0xD553, 24711 - 11904: 0xD1AC, 24712 - 11904: 0xD1A3, 24713 - 11904: 0xB178, 24714 - 11904: 0xD551, 24716 - 11904: 0xAEAD, 24717 - 11904: 0xAEAB, 24718 - 11904: 0xD1AE, 24720 - 11904: 0xD552, 24722 - 11904: 0xD1A5, 24724 - 11904: 0xAEAC, 24725 - 11904: 0xD1A9, 24726 - 11904: 0xAEAF, 24727 - 11904: 0xD1AB, 24730 - 11904: 0xAEAA, 24731 - 11904: 0xD1AA, 24732 - 11904: 0xD1AD, 24733 - 11904: 0xD1A7, 24734 - 11904: 0xFC6B, 24735 - 11904: 0xAEA9, 24736 - 11904: 0xB179, 24738 - 11904: 0xD1A2, 24739 - 11904: 0xB177, 24740 - 11904: 0xFC6C, 24743 - 11904: 0x9468, 24744 - 11904: 0xB17A, 24752 - 11904: 0xD555, 24753 - 11904: 0xD55E, 24754 - 11904: 0xB464, 24755 - 11904: 0xFC6D, 24756 - 11904: 0xB17C, 24757 - 11904: 0xB1A3, 24758 - 11904: 0xB465, 24759 - 11904: 0xD560, 24760 - 11904: 0xB1AA, 24761 - 11904: 0xD8F9, 24762 - 11904: 0xD556, 24763 - 11904: 0xB1A2, 24764 - 11904: 0xB1A5, 24765 - 11904: 0xB17E, 24766 - 11904: 0xD554, 24767 - 11904: 0xD562, 24768 - 11904: 0xD565, 24769 - 11904: 0xD949, 24771 - 11904: 0xD563, 24772 - 11904: 0xD8FD, 24773 - 11904: 0xB1A1, 24774 - 11904: 0xB1A8, 24775 - 11904: 0xB1AC, 24776 - 11904: 0xD55D, 24777 - 11904: 0xD8F8, 24778 - 11904: 0xD561, 24779 - 11904: 0xB17B, 24780 - 11904: 0xD8FA, 24781 - 11904: 0xD564, 24782 - 11904: 0xD8FC, 24783 - 11904: 0xD559, 24785 - 11904: 0xB462, 24787 - 11904: 0xD557, 24788 - 11904: 0xD558, 24789 - 11904: 0xB1A7, 24791 - 11904: 0x8D71, 24792 - 11904: 0xB1A6, 24793 - 11904: 0xD55B, 24794 - 11904: 0xB1AB, 24795 - 11904: 0xD55F, 24796 - 11904: 0xB1A4, 24797 - 11904: 0xD55C, 24798 - 11904: 0xFD64, 24799 - 11904: 0xB1A9, 24800 - 11904: 0xB466, 24801 - 11904: 0xB463, 24802 - 11904: 0xD8FB, 24803 - 11904: 0x99BA, 24804 - 11904: 0xD55A, 24806 - 11904: 0xB17D, 24807 - 11904: 0x9AD0, 24808 - 11904: 0x9A61, 24809 - 11904: 0xA0E5, 24816 - 11904: 0xB46B, 24817 - 11904: 0xB46F, 24818 - 11904: 0xD940, 24819 - 11904: 0xB751, 24820 - 11904: 0xB46D, 24821 - 11904: 0xD944, 24822 - 11904: 0xB471, 24823 - 11904: 0xDD65, 24824 - 11904: 0xD946, 24825 - 11904: 0xB753, 24826 - 11904: 0xB469, 24827 - 11904: 0xB46C, 24828 - 11904: 0xD947, 24829 - 11904: 0xA05B, 24830 - 11904: 0xD948, 24831 - 11904: 0xD94E, 24832 - 11904: 0xB473, 24833 - 11904: 0xB754, 24835 - 11904: 0xD94A, 24836 - 11904: 0xD94F, 24837 - 11904: 0xD943, 24838 - 11904: 0xB75E, 24839 - 11904: 0x96AC, 24840 - 11904: 0xB755, 24841 - 11904: 0xB472, 24842 - 11904: 0xD941, 24843 - 11904: 0xD950, 24844 - 11904: 0x9740, 24845 - 11904: 0xB75D, 24846 - 11904: 0xB470, 24847 - 11904: 0xB74E, 24848 - 11904: 0xD94D, 24850 - 11904: 0xB474, 24851 - 11904: 0xD945, 24852 - 11904: 0xD8FE, 24853 - 11904: 0xB46A, 24854 - 11904: 0xD942, 24856 - 11904: 0xD94B, 24857 - 11904: 0x9EF1, 24858 - 11904: 0xB74D, 24859 - 11904: 0xB752, 24860 - 11904: 0xB467, 24861 - 11904: 0xD94C, 24863 - 11904: 0xB750, 24866 - 11904: 0x8C4D, 24867 - 11904: 0xB468, 24871 - 11904: 0xB75C, 24872 - 11904: 0xE1C3, 24873 - 11904: 0xDD70, 24875 - 11904: 0xDD68, 24876 - 11904: 0xE1C2, 24878 - 11904: 0xDD6C, 24879 - 11904: 0xDD6E, 24880 - 11904: 0x9F7E, 24882 - 11904: 0xDD6B, 24884 - 11904: 0xB75B, 24886 - 11904: 0xDD6A, 24887 - 11904: 0xB75F, 24891 - 11904: 0xE1D2, 24893 - 11904: 0x8D72, 24894 - 11904: 0xB75A, 24895 - 11904: 0xBA40, 24896 - 11904: 0xDD71, 24897 - 11904: 0xE1C4, 24898 - 11904: 0xFC76, 24900 - 11904: 0xB758, 24901 - 11904: 0xDD69, 24902 - 11904: 0xDD6D, 24903 - 11904: 0xB9FE, 24904 - 11904: 0xB74F, 24905 - 11904: 0xDD66, 24906 - 11904: 0xDD67, 24907 - 11904: 0xBA41, 24908 - 11904: 0xB757, 24909 - 11904: 0xB759, 24910 - 11904: 0xB756, 24911 - 11904: 0xDD6F, 24912 - 11904: 0x96A9, 24914 - 11904: 0xE1C8, 24915 - 11904: 0xE1C9, 24916 - 11904: 0xE1CE, 24917 - 11904: 0xBC7D, 24918 - 11904: 0xE1D5, 24920 - 11904: 0xBA47, 24921 - 11904: 0xA06E, 24922 - 11904: 0xBA46, 24923 - 11904: 0xE1D0, 24924 - 11904: 0xFCAA, 24925 - 11904: 0xBC7C, 24926 - 11904: 0xE1C5, 24927 - 11904: 0xBA45, 24928 - 11904: 0xFBCD, 24929 - 11904: 0xE1D4, 24930 - 11904: 0xBA43, 24931 - 11904: 0xBA44, 24932 - 11904: 0xFC74, 24933 - 11904: 0xE1D1, 24934 - 11904: 0xE5AA, 24935 - 11904: 0xBC7A, 24936 - 11904: 0xB46E, 24938 - 11904: 0xE1D3, 24939 - 11904: 0xBCA3, 24940 - 11904: 0xE1CB, 24942 - 11904: 0xBC7B, 24943 - 11904: 0xA074, 24944 - 11904: 0xBCA2, 24945 - 11904: 0xE1C6, 24946 - 11904: 0xE1CA, 24947 - 11904: 0xE1C7, 24948 - 11904: 0xE1CD, 24949 - 11904: 0xBA48, 24950 - 11904: 0xBC79, 24951 - 11904: 0xBA42, 24953 - 11904: 0xE57A, 24954 - 11904: 0xE1CF, 24956 - 11904: 0xBCA1, 24957 - 11904: 0xA071, 24958 - 11904: 0xBCA4, 24960 - 11904: 0xE1CC, 24961 - 11904: 0xFC79, 24962 - 11904: 0xBC7E, 24963 - 11904: 0xE579, 24967 - 11904: 0xFC7C, 24969 - 11904: 0xE57E, 24970 - 11904: 0xBECE, 24971 - 11904: 0xE578, 24972 - 11904: 0xE9A3, 24973 - 11904: 0xE5A9, 24974 - 11904: 0xBCA8, 24976 - 11904: 0xBCA6, 24977 - 11904: 0xBECC, 24978 - 11904: 0xE5A6, 24979 - 11904: 0xE5A2, 24980 - 11904: 0xBCAC, 24981 - 11904: 0x9C50, 24982 - 11904: 0xE978, 24984 - 11904: 0x9379, 24985 - 11904: 0x9378, 24986 - 11904: 0xBCAA, 24987 - 11904: 0xE5A1, 24988 - 11904: 0xA0DD, 24989 - 11904: 0xE976, 24991 - 11904: 0xE5A5, 24993 - 11904: 0xE5A8, 24994 - 11904: 0xE57D, 24996 - 11904: 0xBCAB, 24999 - 11904: 0xBCA5, 25000 - 11904: 0xE977, 25001 - 11904: 0xBECD, 25002 - 11904: 0xE5A7, 25003 - 11904: 0xBCA7, 25004 - 11904: 0xBCA9, 25005 - 11904: 0xE5A4, 25006 - 11904: 0xBCAD, 25007 - 11904: 0xE5A3, 25008 - 11904: 0xE57C, 25009 - 11904: 0xE57B, 25010 - 11904: 0xBECB, 25011 - 11904: 0xE5AB, 25012 - 11904: 0xE97A, 25013 - 11904: 0xECE0, 25014 - 11904: 0xBED0, 25015 - 11904: 0x8D75, 25016 - 11904: 0xE9A2, 25017 - 11904: 0x8D76, 25018 - 11904: 0xE97E, 25020 - 11904: 0xECE1, 25022 - 11904: 0xBED1, 25023 - 11904: 0xE9A1, 25024 - 11904: 0x9374, 25025 - 11904: 0xE97C, 25026 - 11904: 0xC0B4, 25027 - 11904: 0xECDF, 25029 - 11904: 0xE979, 25030 - 11904: 0xE97B, 25031 - 11904: 0xC0B5, 25032 - 11904: 0xBED3, 25033 - 11904: 0xC0B3, 25034 - 11904: 0xBED2, 25035 - 11904: 0xC0B7, 25036 - 11904: 0xE97D, 25037 - 11904: 0xBECF, 25039 - 11904: 0x8D77, 25040 - 11904: 0xFCA5, 25043 - 11904: 0xFCA2, 25046 - 11904: 0xEFCF, 25048 - 11904: 0xEFC7, 25050 - 11904: 0x90C3, 25054 - 11904: 0xECE7, 25055 - 11904: 0xEFC8, 25056 - 11904: 0xECE3, 25058 - 11904: 0xA079, 25059 - 11904: 0xC256, 25060 - 11904: 0xECE5, 25061 - 11904: 0xECE4, 25062 - 11904: 0xC0B6, 25063 - 11904: 0xECE2, 25064 - 11904: 0xECE6, 25065 - 11904: 0xEFD0, 25066 - 11904: 0xEFCC, 25067 - 11904: 0xEFCE, 25069 - 11904: 0xEFC9, 25070 - 11904: 0xEFCA, 25072 - 11904: 0xEFCD, 25073 - 11904: 0xEFCB, 25074 - 11904: 0xC367, 25077 - 11904: 0xC36A, 25078 - 11904: 0xC369, 25079 - 11904: 0xC368, 25080 - 11904: 0xC461, 25081 - 11904: 0xF44A, 25082 - 11904: 0xC462, 25083 - 11904: 0xF241, 25084 - 11904: 0xC4DF, 25085 - 11904: 0xF5CC, 25086 - 11904: 0xC4E0, 25087 - 11904: 0xC574, 25088 - 11904: 0xC5CA, 25089 - 11904: 0xF7D9, 25091 - 11904: 0xF7DA, 25092 - 11904: 0xF7DB, 25095 - 11904: 0xF9BA, 25096 - 11904: 0xA4E0, 25097 - 11904: 0xC97C, 25098 - 11904: 0xA5B3, 25100 - 11904: 0xA6A6, 25101 - 11904: 0xA6A7, 25102 - 11904: 0xA6A5, 25104 - 11904: 0xA6A8, 25105 - 11904: 0xA7DA, 25106 - 11904: 0xA7D9, 25108 - 11904: 0xCCB1, 25109 - 11904: 0xA9CF, 25110 - 11904: 0xA9CE, 25113 - 11904: 0xD1AF, 25114 - 11904: 0xB1AD, 25115 - 11904: 0xB1AE, 25119 - 11904: 0xB475, 25120 - 11904: 0xDD72, 25121 - 11904: 0xB760, 25122 - 11904: 0xB761, 25123 - 11904: 0xDD74, 25124 - 11904: 0xDD76, 25125 - 11904: 0xDD75, 25127 - 11904: 0xE1D7, 25129 - 11904: 0xE1D6, 25130 - 11904: 0xBA49, 25131 - 11904: 0xE1D8, 25132 - 11904: 0x8D79, 25133 - 11904: 0xE5AC, 25134 - 11904: 0xBCAE, 25136 - 11904: 0xBED4, 25138 - 11904: 0xC0B8, 25139 - 11904: 0xC257, 25140 - 11904: 0xC0B9, 25142 - 11904: 0xA4E1, 25143 - 11904: 0x8BFC, 25145 - 11904: 0xA076, 25146 - 11904: 0xCAE6, 25149 - 11904: 0xCCB2, 25150 - 11904: 0xA9D1, 25151 - 11904: 0xA9D0, 25152 - 11904: 0xA9D2, 25153 - 11904: 0xABF3, 25154 - 11904: 0xCED2, 25155 - 11904: 0xCED3, 25158 - 11904: 0xD1B0, 25159 - 11904: 0xAEB0, 25160 - 11904: 0xB1AF, 25161 - 11904: 0xB476, 25162 - 11904: 0xD951, 25163 - 11904: 0xA4E2, 25164 - 11904: 0x8BCD, 25165 - 11904: 0xA47E, 25166 - 11904: 0xA4E3, 25168 - 11904: 0xC97D, 25169 - 11904: 0xA5B7, 25170 - 11904: 0xA5B6, 25171 - 11904: 0xA5B4, 25172 - 11904: 0xA5B5, 25176 - 11904: 0xA6AB, 25177 - 11904: 0xC9E9, 25178 - 11904: 0xC9EB, 25179 - 11904: 0xA6AA, 25180 - 11904: 0xC9E3, 25182 - 11904: 0xC9E4, 25184 - 11904: 0xC9EA, 25185 - 11904: 0xC9E6, 25186 - 11904: 0xC9E8, 25187 - 11904: 0xA6A9, 25188 - 11904: 0xC9E5, 25189 - 11904: 0xC9EC, 25190 - 11904: 0xC9E7, 25192 - 11904: 0x9F5A, 25197 - 11904: 0xA7E1, 25198 - 11904: 0xA7EA, 25199 - 11904: 0xA7E8, 25200 - 11904: 0xCAF0, 25201 - 11904: 0xCAED, 25202 - 11904: 0xCAF5, 25203 - 11904: 0xA7E6, 25204 - 11904: 0xCAF6, 25206 - 11904: 0xA7DF, 25207 - 11904: 0xCAF3, 25209 - 11904: 0xA7E5, 25210 - 11904: 0xCAEF, 25211 - 11904: 0xCAEE, 25212 - 11904: 0xA7E3, 25213 - 11904: 0xCAF4, 25214 - 11904: 0xA7E4, 25215 - 11904: 0xA9D3, 25216 - 11904: 0xA7DE, 25217 - 11904: 0xCAF1, 25218 - 11904: 0x9FF4, 25219 - 11904: 0xCAE7, 25220 - 11904: 0xA7DB, 25221 - 11904: 0x9FBA, 25222 - 11904: 0xA7EE, 25223 - 11904: 0xCAEC, 25224 - 11904: 0xCAF2, 25225 - 11904: 0xA7E0, 25226 - 11904: 0xA7E2, 25228 - 11904: 0xCAE8, 25230 - 11904: 0xCAE9, 25231 - 11904: 0xCAEA, 25232 - 11904: 0x8D7A, 25233 - 11904: 0xA7ED, 25234 - 11904: 0xA7E7, 25235 - 11904: 0xA7EC, 25236 - 11904: 0xCAEB, 25237 - 11904: 0xA7EB, 25238 - 11904: 0xA7DD, 25239 - 11904: 0xA7DC, 25240 - 11904: 0xA7E9, 25245 - 11904: 0x9E45, 25252 - 11904: 0x93B0, 25254 - 11904: 0xA075, 25256 - 11904: 0xA9E1, 25257 - 11904: 0xCCBE, 25258 - 11904: 0xCCB7, 25259 - 11904: 0xA9DC, 25260 - 11904: 0xA9EF, 25261 - 11904: 0xCCB3, 25262 - 11904: 0xCCBA, 25263 - 11904: 0xCCBC, 25264 - 11904: 0xCCBF, 25265 - 11904: 0xA9EA, 25267 - 11904: 0xCCBB, 25268 - 11904: 0xCCB4, 25269 - 11904: 0xA9E8, 25270 - 11904: 0xCCB8, 25272 - 11904: 0xCCC0, 25273 - 11904: 0xA9D9, 25275 - 11904: 0xCCBD, 25276 - 11904: 0xA9E3, 25277 - 11904: 0xA9E2, 25278 - 11904: 0xCCB6, 25279 - 11904: 0xA9D7, 25281 - 11904: 0x87DD, 25282 - 11904: 0xA9D8, 25283 - 11904: 0x9B46, 25284 - 11904: 0xA9D6, 25285 - 11904: 0xFCAE, 25286 - 11904: 0xA9EE, 25287 - 11904: 0xA9E6, 25288 - 11904: 0xA9E0, 25289 - 11904: 0xA9D4, 25290 - 11904: 0xCCB9, 25291 - 11904: 0xA9DF, 25292 - 11904: 0xA9D5, 25293 - 11904: 0xA9E7, 25294 - 11904: 0xA9F0, 25295 - 11904: 0xCED4, 25296 - 11904: 0xA9E4, 25297 - 11904: 0xCCB5, 25298 - 11904: 0xA9DA, 25299 - 11904: 0xA9DD, 25300 - 11904: 0xA9DE, 25301 - 11904: 0xFCB0, 25302 - 11904: 0xA9EC, 25303 - 11904: 0xA9ED, 25304 - 11904: 0xA9EB, 25305 - 11904: 0xA9E5, 25306 - 11904: 0xA9E9, 25307 - 11904: 0xA9DB, 25308 - 11904: 0xABF4, 25311 - 11904: 0xFA51, 25317 - 11904: 0x8D7B, 25323 - 11904: 0xCEDA, 25324 - 11904: 0xAC41, 25325 - 11904: 0xABF8, 25326 - 11904: 0xABFA, 25327 - 11904: 0xAC40, 25328 - 11904: 0xCEE6, 25329 - 11904: 0xABFD, 25330 - 11904: 0xD1B1, 25331 - 11904: 0xAEB1, 25332 - 11904: 0xAC43, 25333 - 11904: 0xCED7, 25334 - 11904: 0xCEDF, 25335 - 11904: 0xABFE, 25336 - 11904: 0xCEDE, 25337 - 11904: 0xCEDB, 25338 - 11904: 0xCEE3, 25339 - 11904: 0xCEE5, 25340 - 11904: 0xABF7, 25341 - 11904: 0xABFB, 25342 - 11904: 0xAC42, 25343 - 11904: 0xAEB3, 25344 - 11904: 0xCEE0, 25345 - 11904: 0xABF9, 25346 - 11904: 0xAC45, 25347 - 11904: 0xCED9, 25351 - 11904: 0xABFC, 25352 - 11904: 0xAEB2, 25353 - 11904: 0xABF6, 25355 - 11904: 0xCED6, 25356 - 11904: 0xCEDD, 25357 - 11904: 0xCED5, 25358 - 11904: 0xCED8, 25359 - 11904: 0xCEDC, 25360 - 11904: 0xD1B2, 25361 - 11904: 0xAC44, 25363 - 11904: 0xCEE1, 25364 - 11904: 0xCEE2, 25365 - 11904: 0xCEE4, 25366 - 11904: 0xABF5, 25368 - 11904: 0x8D7C, 25384 - 11904: 0xAEC1, 25385 - 11904: 0xD1BE, 25386 - 11904: 0xAEBF, 25387 - 11904: 0xAEC0, 25388 - 11904: 0xD1B4, 25389 - 11904: 0xD1C4, 25390 - 11904: 0x9ED6, 25391 - 11904: 0xAEB6, 25393 - 11904: 0x93AC, 25394 - 11904: 0xD566, 25395 - 11904: 0xD1C6, 25396 - 11904: 0xD1C0, 25397 - 11904: 0x9F5B, 25398 - 11904: 0xD1B7, 25399 - 11904: 0x93A9, 25400 - 11904: 0xD1C9, 25401 - 11904: 0xD1BA, 25402 - 11904: 0xAEBC, 25403 - 11904: 0xD57D, 25404 - 11904: 0xD1BD, 25405 - 11904: 0xAEBE, 25406 - 11904: 0xAEB5, 25408 - 11904: 0xD1CB, 25409 - 11904: 0xD1BF, 25410 - 11904: 0xAEB8, 25411 - 11904: 0xD1B8, 25412 - 11904: 0xD1B5, 25413 - 11904: 0xD1B6, 25414 - 11904: 0xAEB9, 25415 - 11904: 0xD1C5, 25416 - 11904: 0xD1CC, 25417 - 11904: 0xAEBB, 25418 - 11904: 0xD1BC, 25419 - 11904: 0xD1BB, 25420 - 11904: 0xAEC3, 25421 - 11904: 0xAEC2, 25422 - 11904: 0xAEB4, 25423 - 11904: 0xAEBA, 25424 - 11904: 0xAEBD, 25425 - 11904: 0xD1C8, 25428 - 11904: 0xD1C2, 25429 - 11904: 0xAEB7, 25430 - 11904: 0xD1B3, 25431 - 11904: 0xD1CA, 25432 - 11904: 0xD1C1, 25433 - 11904: 0xD1C3, 25434 - 11904: 0xD1C7, 25444 - 11904: 0xA07C, 25445 - 11904: 0xD567, 25447 - 11904: 0xB1B7, 25448 - 11904: 0xB1CB, 25449 - 11904: 0xB1CA, 25451 - 11904: 0xB1BF, 25452 - 11904: 0xFCB2, 25453 - 11904: 0xD579, 25454 - 11904: 0xD575, 25455 - 11904: 0xD572, 25456 - 11904: 0xD5A6, 25457 - 11904: 0xB1BA, 25458 - 11904: 0xB1B2, 25461 - 11904: 0xD577, 25462 - 11904: 0xB4A8, 25463 - 11904: 0xB1B6, 25464 - 11904: 0xD5A1, 25465 - 11904: 0x8AC1, 25466 - 11904: 0xB1CC, 25467 - 11904: 0xB1C9, 25468 - 11904: 0xD57B, 25469 - 11904: 0xD56A, 25471 - 11904: 0x9FB4, 25472 - 11904: 0xB1C8, 25473 - 11904: 0xD5A3, 25474 - 11904: 0xD569, 25475 - 11904: 0xB1BD, 25476 - 11904: 0xB1C1, 25477 - 11904: 0xD5A2, 25479 - 11904: 0xD573, 25480 - 11904: 0xB1C2, 25481 - 11904: 0xB1BC, 25482 - 11904: 0xD568, 25483 - 11904: 0xFCAC, 25484 - 11904: 0xB478, 25485 - 11904: 0xD5A5, 25486 - 11904: 0xD571, 25487 - 11904: 0xB1C7, 25488 - 11904: 0xD574, 25489 - 11904: 0xD5A4, 25490 - 11904: 0xB1C6, 25492 - 11904: 0xD952, 25494 - 11904: 0xB1B3, 25495 - 11904: 0xD56F, 25496 - 11904: 0xB1B8, 25497 - 11904: 0xB1C3, 25499 - 11904: 0xB1BE, 25500 - 11904: 0xD578, 25501 - 11904: 0xD56E, 25502 - 11904: 0xD56C, 25503 - 11904: 0xD57E, 25504 - 11904: 0xB1B0, 25505 - 11904: 0xB1C4, 25506 - 11904: 0xB1B4, 25507 - 11904: 0xB477, 25508 - 11904: 0xD57C, 25509 - 11904: 0xB1B5, 25511 - 11904: 0xB1B1, 25512 - 11904: 0xB1C0, 25513 - 11904: 0xB1BB, 25514 - 11904: 0xB1B9, 25515 - 11904: 0xD570, 25516 - 11904: 0xB1C5, 25517 - 11904: 0xD56D, 25518 - 11904: 0xD57A, 25519 - 11904: 0xD576, 25520 - 11904: 0xD954, 25521 - 11904: 0xD953, 25529 - 11904: 0x9E4C, 25533 - 11904: 0xD56B, 25534 - 11904: 0xD964, 25536 - 11904: 0xB47A, 25537 - 11904: 0x8FC5, 25538 - 11904: 0xD96A, 25539 - 11904: 0xD959, 25540 - 11904: 0xD967, 25541 - 11904: 0xDD77, 25542 - 11904: 0xB47D, 25543 - 11904: 0xD96B, 25544 - 11904: 0xD96E, 25545 - 11904: 0xB47C, 25546 - 11904: 0xD95C, 25547 - 11904: 0xD96D, 25548 - 11904: 0xD96C, 25549 - 11904: 0xB47E, 25550 - 11904: 0xD955, 25551 - 11904: 0xB479, 25552 - 11904: 0xB4A3, 25553 - 11904: 0x93AD, 25554 - 11904: 0xB4A1, 25555 - 11904: 0xD969, 25557 - 11904: 0xD95F, 25558 - 11904: 0xB4A5, 25559 - 11904: 0xD970, 25560 - 11904: 0xD968, 25561 - 11904: 0xD971, 25562 - 11904: 0xB4AD, 25563 - 11904: 0xB4AB, 25564 - 11904: 0xD966, 25565 - 11904: 0xD965, 25566 - 11904: 0x9DC3, 25567 - 11904: 0xD963, 25568 - 11904: 0xD95D, 25569 - 11904: 0xB4A4, 25570 - 11904: 0x8DA2, 25571 - 11904: 0xB4A2, 25572 - 11904: 0xD1B9, 25573 - 11904: 0xD956, 25574 - 11904: 0x9D4A, 25575 - 11904: 0xDDB7, 25576 - 11904: 0xD957, 25577 - 11904: 0xB47B, 25578 - 11904: 0xB4AA, 25579 - 11904: 0xDD79, 25581 - 11904: 0xB4A6, 25582 - 11904: 0xB4A7, 25583 - 11904: 0xD958, 25584 - 11904: 0xD96F, 25585 - 11904: 0xDD78, 25586 - 11904: 0xD960, 25587 - 11904: 0xD95B, 25588 - 11904: 0xB4A9, 25589 - 11904: 0xD961, 25590 - 11904: 0xD95E, 25592 - 11904: 0xFCB6, 25593 - 11904: 0xB4AE, 25595 - 11904: 0x8DA3, 25596 - 11904: 0x9E4B, 25598 - 11904: 0x9E4D, 25606 - 11904: 0xB770, 25607 - 11904: 0x8DA4, 25609 - 11904: 0xDD7C, 25610 - 11904: 0xDDB1, 25611 - 11904: 0xDDB6, 25612 - 11904: 0xDDAA, 25613 - 11904: 0xB76C, 25614 - 11904: 0xDDBB, 25615 - 11904: 0xB769, 25616 - 11904: 0xDD7A, 25618 - 11904: 0xDD7B, 25619 - 11904: 0xB762, 25620 - 11904: 0xB76B, 25621 - 11904: 0xDDA4, 25622 - 11904: 0xB76E, 25623 - 11904: 0xB76F, 25624 - 11904: 0xDDA5, 25626 - 11904: 0xDDB2, 25627 - 11904: 0xDDB8, 25628 - 11904: 0xB76A, 25630 - 11904: 0xB764, 25631 - 11904: 0xDDA3, 25632 - 11904: 0xDD7D, 25633 - 11904: 0xDDBA, 25634 - 11904: 0xDDA8, 25635 - 11904: 0xDDA9, 25636 - 11904: 0xDD7E, 25637 - 11904: 0xDDB4, 25638 - 11904: 0xDDAB, 25639 - 11904: 0xDDB5, 25640 - 11904: 0xDDAD, 25642 - 11904: 0xB765, 25643 - 11904: 0xE1D9, 25644 - 11904: 0xB768, 25645 - 11904: 0xB766, 25646 - 11904: 0xDDB9, 25647 - 11904: 0xDDB0, 25648 - 11904: 0xDDAC, 25650 - 11904: 0x8AFD, 25651 - 11904: 0xDDA1, 25652 - 11904: 0xBA53, 25653 - 11904: 0xDDAF, 25654 - 11904: 0xB76D, 25655 - 11904: 0xDDA7, 25656 - 11904: 0xFCB5, 25657 - 11904: 0xDDA6, 25658 - 11904: 0xFCC3, 25659 - 11904: 0x93B2, 25661 - 11904: 0xB767, 25662 - 11904: 0xB763, 25663 - 11904: 0xE1EE, 25664 - 11904: 0xDDB3, 25665 - 11904: 0xDDAE, 25667 - 11904: 0xDDA2, 25675 - 11904: 0xE1E9, 25677 - 11904: 0xE1DA, 25678 - 11904: 0xE1E5, 25680 - 11904: 0xE1EC, 25681 - 11904: 0xBA51, 25682 - 11904: 0xB4AC, 25683 - 11904: 0xE1EA, 25684 - 11904: 0xBA4C, 25688 - 11904: 0xBA4B, 25689 - 11904: 0xE1F1, 25690 - 11904: 0x8DA5, 25691 - 11904: 0xE1DB, 25692 - 11904: 0xE1E8, 25693 - 11904: 0xE1DC, 25694 - 11904: 0xE1E7, 25695 - 11904: 0xBA4F, 25696 - 11904: 0xE1EB, 25697 - 11904: 0xD962, 25701 - 11904: 0xE1F2, 25702 - 11904: 0xE1E3, 25703 - 11904: 0xBA52, 25704 - 11904: 0xE5BA, 25705 - 11904: 0xBCAF, 25707 - 11904: 0xE1F0, 25708 - 11904: 0xE1EF, 25709 - 11904: 0xBA54, 25710 - 11904: 0xE5AD, 25711 - 11904: 0xBCB0, 25712 - 11904: 0xE5AE, 25713 - 11904: 0x93A1, 25714 - 11904: 0xE1DF, 25715 - 11904: 0xE1E0, 25716 - 11904: 0xE1DD, 25717 - 11904: 0xE1E2, 25718 - 11904: 0xE1DE, 25719 - 11904: 0xE1F3, 25720 - 11904: 0xBA4E, 25721 - 11904: 0xBCB1, 25722 - 11904: 0xBA50, 25723 - 11904: 0xBA55, 25724 - 11904: 0x8AC6, 25725 - 11904: 0xE1E1, 25727 - 11904: 0xE1ED, 25730 - 11904: 0xE1E6, 25733 - 11904: 0xE5B1, 25735 - 11904: 0xBA4A, 25736 - 11904: 0xBCB4, 25737 - 11904: 0xE9AA, 25738 - 11904: 0xE5B6, 25739 - 11904: 0xE5B5, 25740 - 11904: 0xE5B7, 25741 - 11904: 0x8A5B, 25743 - 11904: 0xE5B4, 25744 - 11904: 0xFCB9, 25745 - 11904: 0x894D, 25746 - 11904: 0xBCBB, 25747 - 11904: 0xBCB8, 25749 - 11904: 0xBCB9, 25750 - 11904: 0xE5AF, 25751 - 11904: 0xE5B2, 25752 - 11904: 0xE5BC, 25753 - 11904: 0xBCC1, 25754 - 11904: 0xBCBF, 25756 - 11904: 0xE5B3, 25757 - 11904: 0xD95A, 25758 - 11904: 0xBCB2, 25759 - 11904: 0xE5B9, 25760 - 11904: 0xE5B0, 25762 - 11904: 0xBCC2, 25763 - 11904: 0xE5B8, 25764 - 11904: 0xBA4D, 25765 - 11904: 0xBCB7, 25766 - 11904: 0xE1E4, 25769 - 11904: 0xBCBA, 25771 - 11904: 0xBCBE, 25772 - 11904: 0xBCC0, 25773 - 11904: 0xBCBD, 25774 - 11904: 0xBCBC, 25775 - 11904: 0xFED4, 25776 - 11904: 0xBCB6, 25777 - 11904: 0xE5BB, 25778 - 11904: 0xBCB3, 25779 - 11904: 0xBCC3, 25780 - 11904: 0x8A78, 25782 - 11904: 0x93AB, 25787 - 11904: 0xBED8, 25788 - 11904: 0xBED9, 25789 - 11904: 0xE9A9, 25790 - 11904: 0xBEE2, 25791 - 11904: 0xBEDF, 25792 - 11904: 0x8DA7, 25793 - 11904: 0xBED6, 25794 - 11904: 0xBEDD, 25795 - 11904: 0xE9AB, 25796 - 11904: 0xBEDB, 25797 - 11904: 0xBED5, 25799 - 11904: 0xBEDC, 25801 - 11904: 0xE9A8, 25802 - 11904: 0xC0BB, 25803 - 11904: 0xBED7, 25805 - 11904: 0xBEDE, 25806 - 11904: 0xC0BA, 25807 - 11904: 0xE9A7, 25808 - 11904: 0xE9A6, 25810 - 11904: 0xBEE0, 25811 - 11904: 0x9F45, 25812 - 11904: 0xBEE1, 25814 - 11904: 0xE9A5, 25815 - 11904: 0xE9A4, 25816 - 11904: 0xC0BC, 25817 - 11904: 0xE9AE, 25818 - 11904: 0xBEDA, 25819 - 11904: 0xE9AC, 25821 - 11904: 0x8A56, 25824 - 11904: 0xC0BD, 25825 - 11904: 0xFCBF, 25826 - 11904: 0xC0C2, 25827 - 11904: 0xECEA, 25828 - 11904: 0xECEC, 25829 - 11904: 0xFCC0, 25830 - 11904: 0xC0BF, 25831 - 11904: 0x8EE6, 25832 - 11904: 0xECED, 25833 - 11904: 0xECE9, 25834 - 11904: 0x8AA4, 25835 - 11904: 0xECEB, 25836 - 11904: 0xC0C0, 25837 - 11904: 0xC0C3, 25839 - 11904: 0xECE8, 25840 - 11904: 0xC0BE, 25841 - 11904: 0xC0C1, 25842 - 11904: 0xC259, 25843 - 11904: 0xE9AD, 25844 - 11904: 0xC258, 25847 - 11904: 0xC25E, 25848 - 11904: 0xEFD4, 25850 - 11904: 0xC25C, 25851 - 11904: 0xC25D, 25852 - 11904: 0xEFD7, 25853 - 11904: 0xEFD3, 25854 - 11904: 0xC25A, 25855 - 11904: 0xEFD1, 25856 - 11904: 0xC36B, 25857 - 11904: 0xEFD5, 25859 - 11904: 0xEFD6, 25860 - 11904: 0xEFD2, 25862 - 11904: 0xC25B, 25863 - 11904: 0xF242, 25865 - 11904: 0xF245, 25866 - 11904: 0x8943, 25868 - 11904: 0xF246, 25869 - 11904: 0xF244, 25870 - 11904: 0xF247, 25871 - 11904: 0xC36C, 25872 - 11904: 0xF243, 25873 - 11904: 0x93F3, 25875 - 11904: 0xF44E, 25876 - 11904: 0xC464, 25877 - 11904: 0xF44D, 25878 - 11904: 0xF44C, 25879 - 11904: 0xF44B, 25880 - 11904: 0xC463, 25881 - 11904: 0xC465, 25883 - 11904: 0xF5CD, 25884 - 11904: 0xC4E2, 25885 - 11904: 0xC4E1, 25886 - 11904: 0xFCAB, 25887 - 11904: 0x9EA2, 25888 - 11904: 0xF6E1, 25889 - 11904: 0xF6E0, 25890 - 11904: 0xF6E3, 25891 - 11904: 0xC5CB, 25892 - 11904: 0xC575, 25893 - 11904: 0xF7DD, 25894 - 11904: 0xF6E2, 25897 - 11904: 0xF7DC, 25898 - 11904: 0xC5CD, 25899 - 11904: 0xC5CC, 25900 - 11904: 0xC5F3, 25901 - 11904: 0xF8A9, 25902 - 11904: 0xF8EF, 25903 - 11904: 0xA4E4, 25904 - 11904: 0x9DC7, 25906 - 11904: 0xD972, 25907 - 11904: 0xE9AF, 25908 - 11904: 0xC6D2, 25909 - 11904: 0x8BCE, 25910 - 11904: 0xA6AC, 25911 - 11904: 0xCAF7, 25912 - 11904: 0xA7F1, 25913 - 11904: 0xA7EF, 25915 - 11904: 0xA7F0, 25917 - 11904: 0xCCC1, 25918 - 11904: 0xA9F1, 25919 - 11904: 0xAC46, 25921 - 11904: 0xCEE7, 25923 - 11904: 0xCEE8, 25925 - 11904: 0xAC47, 25926 - 11904: 0xD1CE, 25928 - 11904: 0xAEC4, 25929 - 11904: 0xAEC5, 25930 - 11904: 0xD1CD, 25933 - 11904: 0xFCC5, 25935 - 11904: 0xB1D3, 25937 - 11904: 0xB1CF, 25939 - 11904: 0xD5A7, 25940 - 11904: 0xB1D6, 25941 - 11904: 0xB1D5, 25942 - 11904: 0xB1CE, 25943 - 11904: 0xB1D1, 25944 - 11904: 0xB1D4, 25945 - 11904: 0xB1D0, 25948 - 11904: 0xD976, 25949 - 11904: 0xB1CD, 25950 - 11904: 0xB4AF, 25951 - 11904: 0xFCCB, 25954 - 11904: 0xB4B1, 25955 - 11904: 0xB4B2, 25956 - 11904: 0xD975, 25957 - 11904: 0xD978, 25958 - 11904: 0xB4B0, 25959 - 11904: 0xD973, 25960 - 11904: 0xD977, 25962 - 11904: 0xD974, 25963 - 11904: 0x93B3, 25964 - 11904: 0xB771, 25965 - 11904: 0xFCCA, 25967 - 11904: 0xDDBC, 25970 - 11904: 0xBA56, 25971 - 11904: 0xE1F4, 25972 - 11904: 0xBEE3, 25973 - 11904: 0xBCC4, 25974 - 11904: 0xE5BD, 25975 - 11904: 0xBCC5, 25976 - 11904: 0xBCC6, 25977 - 11904: 0xE5BF, 25978 - 11904: 0xE5BE, 25979 - 11904: 0xE5C0, 25980 - 11904: 0xE9B1, 25983 - 11904: 0xE9B0, 25984 - 11904: 0xECEF, 25985 - 11904: 0xECEE, 25986 - 11904: 0xC0C4, 25987 - 11904: 0xC0C5, 25988 - 11904: 0xF248, 25989 - 11904: 0xFCC9, 25990 - 11904: 0x8DAC, 25991 - 11904: 0xA4E5, 25992 - 11904: 0xFBC6, 25993 - 11904: 0x8967, 25995 - 11904: 0x8C7E, 25996 - 11904: 0xD979, 26000 - 11904: 0xB4B4, 26001 - 11904: 0xB4B3, 26002 - 11904: 0xDDBD, 26004 - 11904: 0xEFD8, 26005 - 11904: 0xC4E3, 26006 - 11904: 0xF7DE, 26007 - 11904: 0xA4E6, 26009 - 11904: 0xAEC6, 26011 - 11904: 0xB1D8, 26012 - 11904: 0xB1D7, 26013 - 11904: 0xD97A, 26014 - 11904: 0xD97B, 26015 - 11904: 0xB772, 26016 - 11904: 0xE1F5, 26017 - 11904: 0xBA57, 26018 - 11904: 0xE9B2, 26020 - 11904: 0xA4E7, 26021 - 11904: 0xA5B8, 26023 - 11904: 0xA9F2, 26024 - 11904: 0xCCC2, 26026 - 11904: 0xCEE9, 26027 - 11904: 0xAC48, 26028 - 11904: 0xB1D9, 26030 - 11904: 0xD97C, 26031 - 11904: 0xB4B5, 26032 - 11904: 0xB773, 26034 - 11904: 0xE5C1, 26035 - 11904: 0xE5C2, 26037 - 11904: 0xFCCD, 26038 - 11904: 0xECF0, 26039 - 11904: 0xC25F, 26040 - 11904: 0xF8F0, 26041 - 11904: 0xA4E8, 26043 - 11904: 0xCCC3, 26044 - 11904: 0xA9F3, 26045 - 11904: 0xAC49, 26046 - 11904: 0x9CF3, 26047 - 11904: 0xCEEA, 26049 - 11904: 0xAEC7, 26050 - 11904: 0xD1D2, 26051 - 11904: 0xD1D0, 26052 - 11904: 0xD1D1, 26053 - 11904: 0xAEC8, 26054 - 11904: 0xD1CF, 26059 - 11904: 0xB1DB, 26060 - 11904: 0xB1DC, 26061 - 11904: 0xD5A8, 26062 - 11904: 0xB1DD, 26063 - 11904: 0xB1DA, 26064 - 11904: 0xD97D, 26065 - 11904: 0xFCD0, 26066 - 11904: 0xD97E, 26067 - 11904: 0xDDBE, 26068 - 11904: 0x95BB, 26070 - 11904: 0xBA59, 26071 - 11904: 0xBA58, 26074 - 11904: 0xECF1, 26075 - 11904: 0xEFD9, 26077 - 11904: 0xF24A, 26078 - 11904: 0xF249, 26079 - 11904: 0xF44F, 26080 - 11904: 0xFCD3, 26081 - 11904: 0xC95E, 26082 - 11904: 0xAC4A, 26083 - 11904: 0xFCD4, 26085 - 11904: 0xA4E9, 26086 - 11904: 0xA5B9, 26088 - 11904: 0xA6AE, 26089 - 11904: 0xA6AD, 26092 - 11904: 0xA6AF, 26093 - 11904: 0xA6B0, 26094 - 11904: 0xC9EE, 26095 - 11904: 0xC9ED, 26096 - 11904: 0xCAF8, 26097 - 11904: 0xA7F2, 26098 - 11904: 0xCAFB, 26099 - 11904: 0xCAFA, 26100 - 11904: 0xCAF9, 26101 - 11904: 0xCAFC, 26106 - 11904: 0xA9F4, 26107 - 11904: 0xCCC9, 26108 - 11904: 0xCCC5, 26109 - 11904: 0xCCCE, 26111 - 11904: 0x8DAE, 26112 - 11904: 0xA9FB, 26114 - 11904: 0xA9F9, 26115 - 11904: 0xCCCA, 26116 - 11904: 0xCCC6, 26117 - 11904: 0xCCCD, 26118 - 11904: 0xA9F8, 26119 - 11904: 0xAA40, 26120 - 11904: 0xCCC8, 26121 - 11904: 0xCCC4, 26122 - 11904: 0xA9FE, 26123 - 11904: 0xCCCB, 26124 - 11904: 0xA9F7, 26125 - 11904: 0xCCCC, 26126 - 11904: 0xA9FA, 26127 - 11904: 0xA9FC, 26128 - 11904: 0xCCD0, 26129 - 11904: 0xCCCF, 26130 - 11904: 0xCCC7, 26131 - 11904: 0xA9F6, 26132 - 11904: 0xA9F5, 26133 - 11904: 0xA9FD, 26136 - 11904: 0xFCD7, 26140 - 11904: 0xCEEF, 26141 - 11904: 0xCEF5, 26142 - 11904: 0x93DB, 26143 - 11904: 0xAC50, 26144 - 11904: 0xAC4D, 26145 - 11904: 0xCEEC, 26146 - 11904: 0xCEF1, 26147 - 11904: 0xFE63, 26148 - 11904: 0xAC53, 26149 - 11904: 0xAC4B, 26150 - 11904: 0xCEF0, 26151 - 11904: 0xAC4E, 26152 - 11904: 0xAC51, 26155 - 11904: 0xCEF3, 26157 - 11904: 0xAC4C, 26158 - 11904: 0xCEF8, 26159 - 11904: 0xAC4F, 26160 - 11904: 0x93D5, 26161 - 11904: 0xAC52, 26162 - 11904: 0xCEED, 26163 - 11904: 0xCEF2, 26164 - 11904: 0xCEF6, 26165 - 11904: 0xCEEE, 26166 - 11904: 0xCEEB, 26169 - 11904: 0xCEF7, 26170 - 11904: 0xCEF4, 26177 - 11904: 0xAED0, 26178 - 11904: 0xAEC9, 26179 - 11904: 0xAECC, 26180 - 11904: 0xFCDA, 26181 - 11904: 0xAECF, 26183 - 11904: 0xD1D5, 26184 - 11904: 0x9B71, 26185 - 11904: 0xAECA, 26186 - 11904: 0xD1D3, 26187 - 11904: 0xFCDD, 26188 - 11904: 0xAECE, 26189 - 11904: 0x8764, 26191 - 11904: 0xAECB, 26193 - 11904: 0xD1D6, 26194 - 11904: 0xAECD, 26195 - 11904: 0x8DAF, 26199 - 11904: 0xFAF2, 26201 - 11904: 0xD5AC, 26202 - 11904: 0xB1DF, 26203 - 11904: 0xD5AB, 26204 - 11904: 0xD5AD, 26205 - 11904: 0xB1DE, 26206 - 11904: 0xB1E3, 26207 - 11904: 0xD1D4, 26208 - 11904: 0x87B5, 26209 - 11904: 0xD5AA, 26210 - 11904: 0xD5AE, 26211 - 11904: 0x93D8, 26212 - 11904: 0xB1E0, 26213 - 11904: 0xD5A9, 26214 - 11904: 0xB1E2, 26215 - 11904: 0xFCDF, 26216 - 11904: 0xB1E1, 26218 - 11904: 0xD9A7, 26219 - 11904: 0x93D3, 26220 - 11904: 0xD9A2, 26222 - 11904: 0xB4B6, 26223 - 11904: 0xB4BA, 26224 - 11904: 0xB4B7, 26225 - 11904: 0xD9A5, 26226 - 11904: 0xD9A8, 26227 - 11904: 0xFCE1, 26228 - 11904: 0xFCE2, 26230 - 11904: 0xB4B9, 26231 - 11904: 0xB4BE, 26232 - 11904: 0xDDC7, 26233 - 11904: 0xD9A6, 26234 - 11904: 0xB4BC, 26235 - 11904: 0xD9A3, 26236 - 11904: 0xD9A1, 26237 - 11904: 0x8E76, 26238 - 11904: 0xB4BD, 26240 - 11904: 0xD9A4, 26244 - 11904: 0xB779, 26245 - 11904: 0xFC62, 26246 - 11904: 0xDDBF, 26247 - 11904: 0xB776, 26248 - 11904: 0xB777, 26249 - 11904: 0xB775, 26250 - 11904: 0xDDC4, 26251 - 11904: 0xDDC3, 26252 - 11904: 0xDDC0, 26253 - 11904: 0xB77B, 26254 - 11904: 0x93D1, 26256 - 11904: 0xDDC2, 26257 - 11904: 0xB4BB, 26258 - 11904: 0x8DB1, 26260 - 11904: 0xDDC6, 26261 - 11904: 0xDDC1, 26262 - 11904: 0xB778, 26263 - 11904: 0xB774, 26264 - 11904: 0xB77A, 26265 - 11904: 0xDDC5, 26266 - 11904: 0x9859, 26269 - 11904: 0xBA5C, 26271 - 11904: 0xE1F8, 26272 - 11904: 0xE1F7, 26273 - 11904: 0xE1F6, 26274 - 11904: 0xBA5A, 26276 - 11904: 0xFB52, 26280 - 11904: 0xBA5B, 26281 - 11904: 0xE5C5, 26282 - 11904: 0xE5C8, 26283 - 11904: 0xBCC8, 26285 - 11904: 0xFB53, 26286 - 11904: 0xBCC7, 26287 - 11904: 0xE5C9, 26288 - 11904: 0xE5C4, 26289 - 11904: 0xBCCA, 26290 - 11904: 0xE5C6, 26291 - 11904: 0xFB4D, 26292 - 11904: 0xBCC9, 26293 - 11904: 0xE5C3, 26294 - 11904: 0x9CBF, 26295 - 11904: 0xE5C7, 26296 - 11904: 0xBEE9, 26297 - 11904: 0xBEE6, 26298 - 11904: 0xE9BB, 26299 - 11904: 0xE9BA, 26301 - 11904: 0xE9B9, 26302 - 11904: 0xE9B4, 26303 - 11904: 0x9B72, 26304 - 11904: 0xE9B5, 26308 - 11904: 0xBEE7, 26310 - 11904: 0xBEE4, 26311 - 11904: 0xBEE8, 26312 - 11904: 0xE9B3, 26313 - 11904: 0xBEE5, 26314 - 11904: 0xE9B6, 26315 - 11904: 0xE9B7, 26316 - 11904: 0xE9BC, 26317 - 11904: 0xFB50, 26318 - 11904: 0x93BE, 26319 - 11904: 0xE9B8, 26322 - 11904: 0xECF2, 26326 - 11904: 0xC0C7, 26328 - 11904: 0xEFDC, 26329 - 11904: 0xC0C6, 26330 - 11904: 0xEFDA, 26331 - 11904: 0xEFDB, 26332 - 11904: 0xC260, 26333 - 11904: 0xC36E, 26334 - 11904: 0xF24B, 26336 - 11904: 0xC36D, 26339 - 11904: 0xF451, 26340 - 11904: 0xF452, 26342 - 11904: 0xC466, 26343 - 11904: 0x8CDB, 26344 - 11904: 0xF450, 26345 - 11904: 0xC4E4, 26347 - 11904: 0xF7DF, 26348 - 11904: 0xC5CE, 26349 - 11904: 0xF8AA, 26350 - 11904: 0xF8AB, 26352 - 11904: 0xA4EA, 26353 - 11904: 0x9DF1, 26354 - 11904: 0xA6B1, 26355 - 11904: 0xA6B2, 26356 - 11904: 0xA7F3, 26358 - 11904: 0xCCD1, 26359 - 11904: 0xAC54, 26360 - 11904: 0xAED1, 26361 - 11904: 0xB1E4, 26364 - 11904: 0xB0D2, 26366 - 11904: 0xB4BF, 26367 - 11904: 0xB4C0, 26368 - 11904: 0xB3CC, 26369 - 11904: 0xD9A9, 26370 - 11904: 0xFCEB, 26371 - 11904: 0xB77C, 26372 - 11904: 0xE1FA, 26373 - 11904: 0xE1F9, 26376 - 11904: 0xA4EB, 26377 - 11904: 0xA6B3, 26378 - 11904: 0xCCD2, 26379 - 11904: 0xAA42, 26380 - 11904: 0xA0BB, 26381 - 11904: 0xAA41, 26382 - 11904: 0x9B7E, 26383 - 11904: 0xCEF9, 26384 - 11904: 0xCEFA, 26386 - 11904: 0xD1D7, 26387 - 11904: 0xD1D8, 26388 - 11904: 0xAED2, 26389 - 11904: 0xAED3, 26390 - 11904: 0x8DB3, 26391 - 11904: 0xAED4, 26392 - 11904: 0xD5AF, 26393 - 11904: 0x8C52, 26395 - 11904: 0xB1E6, 26397 - 11904: 0xB4C2, 26398 - 11904: 0x9AE8, 26399 - 11904: 0xB4C1, 26400 - 11904: 0xDDC8, 26401 - 11904: 0xDF7A, 26402 - 11904: 0xE1FB, 26403 - 11904: 0xE9BD, 26405 - 11904: 0x8EDC, 26406 - 11904: 0xC261, 26407 - 11904: 0xC467, 26408 - 11904: 0xA4EC, 26410 - 11904: 0xA5BC, 26411 - 11904: 0xA5BD, 26412 - 11904: 0xA5BB, 26413 - 11904: 0xA5BE, 26414 - 11904: 0xA5BA, 26417 - 11904: 0xA6B6, 26419 - 11904: 0xC9F6, 26420 - 11904: 0xA6B5, 26421 - 11904: 0xA6B7, 26422 - 11904: 0x9CF9, 26424 - 11904: 0xC9F1, 26425 - 11904: 0xC9F0, 26426 - 11904: 0xC9F3, 26427 - 11904: 0xC9F2, 26428 - 11904: 0xC9F5, 26429 - 11904: 0xA6B4, 26430 - 11904: 0xC9EF, 26431 - 11904: 0xC9F4, 26436 - 11904: 0xFA50, 26437 - 11904: 0xCAFD, 26438 - 11904: 0xA7FD, 26439 - 11904: 0xCAFE, 26440 - 11904: 0xCB43, 26441 - 11904: 0xA7FC, 26443 - 11904: 0xCB47, 26444 - 11904: 0xCB42, 26445 - 11904: 0xCB45, 26446 - 11904: 0xA7F5, 26447 - 11904: 0xA7F6, 26448 - 11904: 0xA7F7, 26449 - 11904: 0xA7F8, 26451 - 11904: 0xA840, 26453 - 11904: 0xCB41, 26454 - 11904: 0xA7FA, 26455 - 11904: 0xA841, 26457 - 11904: 0xCB40, 26458 - 11904: 0xCB46, 26460 - 11904: 0xA7F9, 26461 - 11904: 0xCB44, 26462 - 11904: 0xFCF1, 26463 - 11904: 0xA7F4, 26464 - 11904: 0xA7FE, 26465 - 11904: 0x98E7, 26466 - 11904: 0xFCF3, 26471 - 11904: 0xFCF2, 26474 - 11904: 0xAA57, 26475 - 11904: 0x8CCA, 26476 - 11904: 0xCCD4, 26477 - 11904: 0xAA43, 26478 - 11904: 0x8775, 26479 - 11904: 0xAA4D, 26480 - 11904: 0xAA4E, 26481 - 11904: 0xAA46, 26482 - 11904: 0xAA58, 26483 - 11904: 0xAA48, 26484 - 11904: 0xCCDC, 26485 - 11904: 0xAA53, 26486 - 11904: 0xCCD7, 26487 - 11904: 0xAA49, 26488 - 11904: 0xCCE6, 26489 - 11904: 0xCCE7, 26490 - 11904: 0xCCDF, 26491 - 11904: 0xCCD8, 26492 - 11904: 0xAA56, 26493 - 11904: 0xCCE4, 26494 - 11904: 0xAA51, 26495 - 11904: 0xAA4F, 26497 - 11904: 0xCCE5, 26498 - 11904: 0x87BA, 26499 - 11904: 0xCCE3, 26500 - 11904: 0xCCDB, 26501 - 11904: 0xCCD3, 26502 - 11904: 0xCCDA, 26503 - 11904: 0xAA4A, 26505 - 11904: 0xAA50, 26507 - 11904: 0xAA44, 26508 - 11904: 0xCCDE, 26509 - 11904: 0xCCDD, 26510 - 11904: 0xCCD5, 26511 - 11904: 0x93E5, 26512 - 11904: 0xAA52, 26513 - 11904: 0xCCE1, 26514 - 11904: 0xCCD6, 26515 - 11904: 0xAA55, 26516 - 11904: 0xCCE8, 26517 - 11904: 0xAA45, 26519 - 11904: 0xAA4C, 26520 - 11904: 0xCCD9, 26521 - 11904: 0xCCE2, 26522 - 11904: 0xAA54, 26524 - 11904: 0xAA47, 26525 - 11904: 0xAA4B, 26527 - 11904: 0xCCE0, 26528 - 11904: 0x9A59, 26532 - 11904: 0x8DB5, 26540 - 11904: 0xFD4D, 26542 - 11904: 0xCF5B, 26543 - 11904: 0xAC5C, 26544 - 11904: 0xAC69, 26545 - 11904: 0xFD5E, 26546 - 11904: 0xCF56, 26547 - 11904: 0xCF4C, 26548 - 11904: 0xAC62, 26549 - 11904: 0xCF4A, 26550 - 11904: 0xAC5B, 26551 - 11904: 0xCF45, 26552 - 11904: 0xAC65, 26553 - 11904: 0xCF52, 26554 - 11904: 0xCEFE, 26555 - 11904: 0xCF41, 26559 - 11904: 0x8F7D, 26560 - 11904: 0xCF44, 26561 - 11904: 0xCEFB, 26562 - 11904: 0xCF51, 26563 - 11904: 0xCF61, 26564 - 11904: 0xAC60, 26565 - 11904: 0xCF46, 26566 - 11904: 0xCF58, 26568 - 11904: 0xCEFD, 26569 - 11904: 0xCF5F, 26570 - 11904: 0xCF60, 26571 - 11904: 0xCF63, 26572 - 11904: 0xCF5A, 26573 - 11904: 0xCF4B, 26574 - 11904: 0xCF53, 26575 - 11904: 0xAC66, 26576 - 11904: 0xAC59, 26577 - 11904: 0xAC61, 26578 - 11904: 0xAC6D, 26579 - 11904: 0xAC56, 26580 - 11904: 0xAC58, 26582 - 11904: 0x9547, 26583 - 11904: 0xFCF6, 26584 - 11904: 0xCF43, 26585 - 11904: 0xAC6A, 26586 - 11904: 0xAC63, 26587 - 11904: 0xCF5D, 26588 - 11904: 0xCF40, 26589 - 11904: 0xAC6C, 26590 - 11904: 0xAC67, 26591 - 11904: 0xCF49, 26594 - 11904: 0xAC6B, 26595 - 11904: 0xCF50, 26596 - 11904: 0xCF48, 26597 - 11904: 0xAC64, 26598 - 11904: 0xCF5C, 26599 - 11904: 0xCF54, 26601 - 11904: 0xAC5E, 26602 - 11904: 0xCF62, 26603 - 11904: 0xCF47, 26604 - 11904: 0xAC5A, 26605 - 11904: 0xCF59, 26606 - 11904: 0xCF4F, 26607 - 11904: 0xAC5F, 26608 - 11904: 0xCF55, 26609 - 11904: 0xAC57, 26610 - 11904: 0xCEFC, 26611 - 11904: 0xAC68, 26612 - 11904: 0xAEE3, 26613 - 11904: 0xAC5D, 26614 - 11904: 0xCF4E, 26615 - 11904: 0xCF4D, 26616 - 11904: 0xCF42, 26617 - 11904: 0x9250, 26618 - 11904: 0xCF5E, 26620 - 11904: 0xCF57, 26622 - 11904: 0x8968, 26623 - 11904: 0xAC55, 26624 - 11904: 0x8DB6, 26625 - 11904: 0xFCFB, 26626 - 11904: 0xA07D, 26627 - 11904: 0x98FC, 26628 - 11904: 0x8969, 26637 - 11904: 0xFE4F, 26640 - 11904: 0x9256, 26642 - 11904: 0xD1EC, 26643 - 11904: 0xAEEA, 26644 - 11904: 0xD1ED, 26646 - 11904: 0xD1E1, 26647 - 11904: 0xAEDF, 26648 - 11904: 0xAEEB, 26650 - 11904: 0xD1DA, 26651 - 11904: 0xFAC9, 26652 - 11904: 0xD1E3, 26653 - 11904: 0xD1EB, 26654 - 11904: 0x93E8, 26655 - 11904: 0xD1D9, 26656 - 11904: 0xD1F4, 26657 - 11904: 0xAED5, 26658 - 11904: 0xFCF8, 26661 - 11904: 0xD1F3, 26662 - 11904: 0xD1EE, 26664 - 11904: 0xD1EF, 26665 - 11904: 0xAEDD, 26666 - 11904: 0xAEE8, 26667 - 11904: 0xD1E5, 26669 - 11904: 0xD1E6, 26670 - 11904: 0xD1F0, 26671 - 11904: 0xD1E7, 26673 - 11904: 0xD1E2, 26674 - 11904: 0xD1DC, 26675 - 11904: 0xD1DD, 26676 - 11904: 0xD1EA, 26677 - 11904: 0xD1E4, 26678 - 11904: 0x9CE3, 26679 - 11904: 0xFDA9, 26680 - 11904: 0xAED6, 26681 - 11904: 0xAEDA, 26682 - 11904: 0xD1F2, 26683 - 11904: 0xD1DE, 26684 - 11904: 0xAEE6, 26685 - 11904: 0xAEE2, 26686 - 11904: 0xFC44, 26688 - 11904: 0xAEE5, 26689 - 11904: 0xAEEC, 26690 - 11904: 0xAEDB, 26691 - 11904: 0xAEE7, 26692 - 11904: 0xD1E9, 26693 - 11904: 0xAEE9, 26694 - 11904: 0xAED8, 26695 - 11904: 0x9640, 26696 - 11904: 0xAED7, 26697 - 11904: 0xD1DB, 26698 - 11904: 0x8DB8, 26699 - 11904: 0xD1DF, 26700 - 11904: 0xAEE0, 26701 - 11904: 0xD1F1, 26702 - 11904: 0xD1E8, 26703 - 11904: 0xD1E0, 26704 - 11904: 0xAEE4, 26705 - 11904: 0xAEE1, 26707 - 11904: 0xAED9, 26708 - 11904: 0xAEDC, 26709 - 11904: 0x9B4A, 26710 - 11904: 0x8FB9, 26717 - 11904: 0xFCFE, 26725 - 11904: 0x896A, 26731 - 11904: 0xD5C4, 26733 - 11904: 0xD5B4, 26734 - 11904: 0xD5B5, 26735 - 11904: 0xD5B9, 26737 - 11904: 0xD5C8, 26738 - 11904: 0xD5C5, 26740 - 11904: 0xD5BE, 26741 - 11904: 0xD5BD, 26742 - 11904: 0xB1ED, 26743 - 11904: 0xD5C1, 26744 - 11904: 0xD5D0, 26745 - 11904: 0xD5B0, 26747 - 11904: 0xD5D1, 26748 - 11904: 0xD5C3, 26749 - 11904: 0xD5D5, 26750 - 11904: 0xD5C9, 26751 - 11904: 0xB1EC, 26752 - 11904: 0xD5C7, 26753 - 11904: 0xB1E7, 26754 - 11904: 0xB1FC, 26755 - 11904: 0xB1F2, 26756 - 11904: 0x8DB9, 26757 - 11904: 0xB1F6, 26758 - 11904: 0xB1F5, 26759 - 11904: 0xD5B1, 26760 - 11904: 0x917E, 26761 - 11904: 0xD5CE, 26762 - 11904: 0xD5D4, 26763 - 11904: 0xD5CC, 26764 - 11904: 0xD5D3, 26767 - 11904: 0xD5C0, 26768 - 11904: 0xD5B2, 26769 - 11904: 0xD5D2, 26770 - 11904: 0xD5C2, 26771 - 11904: 0xB1EA, 26772 - 11904: 0xB1F7, 26774 - 11904: 0xD5CB, 26775 - 11904: 0xB1F0, 26776 - 11904: 0x93F4, 26779 - 11904: 0xD5CA, 26780 - 11904: 0xD5B3, 26781 - 11904: 0xB1F8, 26783 - 11904: 0xB1FA, 26784 - 11904: 0xD5CD, 26785 - 11904: 0xB1FB, 26786 - 11904: 0xB1E9, 26787 - 11904: 0xD5BA, 26788 - 11904: 0xD5CF, 26790 - 11904: 0xFB7C, 26791 - 11904: 0xB1EF, 26792 - 11904: 0xB1F9, 26793 - 11904: 0xD5BC, 26794 - 11904: 0xD5C6, 26795 - 11904: 0xD5B7, 26796 - 11904: 0xD5BB, 26797 - 11904: 0xB1F4, 26798 - 11904: 0xD5B6, 26799 - 11904: 0xB1E8, 26800 - 11904: 0xB1F1, 26801 - 11904: 0xB1EE, 26802 - 11904: 0xD5BF, 26803 - 11904: 0xAEDE, 26804 - 11904: 0xD9C0, 26805 - 11904: 0xB1EB, 26806 - 11904: 0x93E7, 26809 - 11904: 0x97EF, 26813 - 11904: 0xFE4A, 26819 - 11904: 0xFD45, 26820 - 11904: 0xB1F3, 26821 - 11904: 0x96A5, 26822 - 11904: 0xD9C3, 26823 - 11904: 0xD9D9, 26824 - 11904: 0xD9CE, 26825 - 11904: 0xB4D6, 26826 - 11904: 0xFEE0, 26827 - 11904: 0xB4D1, 26828 - 11904: 0xD9BD, 26829 - 11904: 0xB4D2, 26830 - 11904: 0xD9CD, 26832 - 11904: 0xD9C6, 26833 - 11904: 0xD9D3, 26834 - 11904: 0xB4CE, 26835 - 11904: 0xD9AB, 26836 - 11904: 0xD9D5, 26837 - 11904: 0xB4C4, 26838 - 11904: 0xD9B3, 26839 - 11904: 0xB4C7, 26840 - 11904: 0xB4C6, 26842 - 11904: 0xB4D7, 26844 - 11904: 0xD9AD, 26845 - 11904: 0xD9CF, 26846 - 11904: 0xD9D0, 26847 - 11904: 0xB4C9, 26848 - 11904: 0xB4C5, 26849 - 11904: 0xD9BB, 26851 - 11904: 0xB4D0, 26852 - 11904: 0xD9B6, 26854 - 11904: 0xD9D1, 26855 - 11904: 0xB4CC, 26856 - 11904: 0xD9C9, 26857 - 11904: 0xD9D6, 26858 - 11904: 0xD9B0, 26859 - 11904: 0xD9B5, 26860 - 11904: 0xD9AF, 26862 - 11904: 0xB4CB, 26863 - 11904: 0xD9C2, 26864 - 11904: 0xDDDE, 26865 - 11904: 0xD9B1, 26866 - 11904: 0xB4CF, 26867 - 11904: 0xD9BA, 26868 - 11904: 0xD9D2, 26869 - 11904: 0xB4CA, 26870 - 11904: 0xD9B7, 26871 - 11904: 0xD9B4, 26872 - 11904: 0xD9C5, 26873 - 11904: 0xB4CD, 26874 - 11904: 0xB4C3, 26875 - 11904: 0xB4D9, 26876 - 11904: 0xD9C8, 26877 - 11904: 0xD9C7, 26880 - 11904: 0xFD48, 26881 - 11904: 0xFD47, 26882 - 11904: 0xFEF2, 26883 - 11904: 0xFE6A, 26884 - 11904: 0xD9AC, 26885 - 11904: 0xB4C8, 26886 - 11904: 0xD9D4, 26887 - 11904: 0xD9BC, 26888 - 11904: 0xD9BE, 26889 - 11904: 0x8DBD, 26890 - 11904: 0xD9CB, 26891 - 11904: 0xD9CA, 26892 - 11904: 0xD9AA, 26893 - 11904: 0xB4D3, 26894 - 11904: 0xB4D5, 26895 - 11904: 0xD9B2, 26896 - 11904: 0xD9B9, 26897 - 11904: 0xD9C1, 26898 - 11904: 0xB4D4, 26899 - 11904: 0xD9B8, 26900 - 11904: 0xD9C4, 26901 - 11904: 0xD9D7, 26903 - 11904: 0xD9CC, 26904 - 11904: 0x9BA1, 26905 - 11904: 0x8CA2, 26906 - 11904: 0x9AB7, 26907 - 11904: 0x8EFC, 26917 - 11904: 0xD9D8, 26922 - 11904: 0xD9AE, 26924 - 11904: 0x9FA1, 26927 - 11904: 0xDDF2, 26928 - 11904: 0xB7A6, 26930 - 11904: 0xDDF0, 26931 - 11904: 0xDDDB, 26932 - 11904: 0xDDE0, 26933 - 11904: 0xDDD9, 26934 - 11904: 0xFD51, 26935 - 11904: 0xDDEC, 26936 - 11904: 0xDDCB, 26937 - 11904: 0xDDD2, 26939 - 11904: 0xDDEA, 26940 - 11904: 0xDDF4, 26941 - 11904: 0xDDDC, 26942 - 11904: 0xFAAD, 26943 - 11904: 0xDDCF, 26944 - 11904: 0xDDE2, 26945 - 11904: 0xDDE7, 26946 - 11904: 0xDDD3, 26947 - 11904: 0x8DBE, 26948 - 11904: 0xDDE4, 26949 - 11904: 0xDDD0, 26950 - 11904: 0x89A4, 26952 - 11904: 0xDDD7, 26953 - 11904: 0xDDD8, 26954 - 11904: 0xB7A8, 26955 - 11904: 0xDDEB, 26956 - 11904: 0xDDE9, 26958 - 11904: 0xDDCC, 26959 - 11904: 0xDDEE, 26961 - 11904: 0xDDEF, 26962 - 11904: 0xDDF1, 26963 - 11904: 0xB7AC, 26964 - 11904: 0xB7A4, 26965 - 11904: 0x9AD9, 26966 - 11904: 0xD5B8, 26967 - 11904: 0xDDD4, 26968 - 11904: 0xDDE6, 26969 - 11904: 0xDDD5, 26970 - 11904: 0xB7A1, 26971 - 11904: 0xB7B1, 26972 - 11904: 0xDDED, 26973 - 11904: 0xB7AF, 26974 - 11904: 0xB7AB, 26975 - 11904: 0xDDCA, 26976 - 11904: 0xB7A3, 26977 - 11904: 0xFD4E, 26978 - 11904: 0xDDCD, 26979 - 11904: 0xB7B0, 26980 - 11904: 0x8DC0, 26981 - 11904: 0xDDDD, 26982 - 11904: 0xDDC9, 26983 - 11904: 0x97F0, 26984 - 11904: 0xB7A9, 26985 - 11904: 0xDDE1, 26986 - 11904: 0xDDD1, 26987 - 11904: 0xB7AA, 26988 - 11904: 0xDDDA, 26989 - 11904: 0xB77E, 26990 - 11904: 0xB4D8, 26991 - 11904: 0xDDE3, 26992 - 11904: 0xD9BF, 26993 - 11904: 0xDDCE, 26994 - 11904: 0x93B4, 26995 - 11904: 0xFD44, 26996 - 11904: 0xDDE8, 26997 - 11904: 0xB7A5, 26998 - 11904: 0xDDE5, 26999 - 11904: 0xB7A2, 27000 - 11904: 0xDDDF, 27001 - 11904: 0xB7AD, 27002 - 11904: 0xDDD6, 27003 - 11904: 0xDDF3, 27008 - 11904: 0x9FA7, 27010 - 11904: 0xB7A7, 27011 - 11904: 0xDEC6, 27013 - 11904: 0x8DC2, 27014 - 11904: 0xB7AE, 27018 - 11904: 0x99B6, 27021 - 11904: 0xE24A, 27022 - 11904: 0xE248, 27024 - 11904: 0xE25E, 27025 - 11904: 0xE246, 27027 - 11904: 0xE258, 27028 - 11904: 0xB77D, 27029 - 11904: 0xBA5F, 27030 - 11904: 0xE242, 27031 - 11904: 0xE25D, 27032 - 11904: 0xFD52, 27033 - 11904: 0xE247, 27034 - 11904: 0xE255, 27035 - 11904: 0xBA64, 27036 - 11904: 0xBA5D, 27038 - 11904: 0xE25B, 27039 - 11904: 0x8DC1, 27040 - 11904: 0xE240, 27041 - 11904: 0xE25A, 27042 - 11904: 0x8E46, 27043 - 11904: 0xBA6F, 27044 - 11904: 0xE251, 27045 - 11904: 0xE261, 27046 - 11904: 0xBA6D, 27047 - 11904: 0xE249, 27048 - 11904: 0xBA5E, 27049 - 11904: 0xE24B, 27050 - 11904: 0xE259, 27051 - 11904: 0xBA67, 27052 - 11904: 0xE244, 27053 - 11904: 0xBA6B, 27054 - 11904: 0xBA61, 27055 - 11904: 0xE24D, 27056 - 11904: 0xE243, 27057 - 11904: 0xE1FC, 27058 - 11904: 0xA0D1, 27059 - 11904: 0xE257, 27060 - 11904: 0xBA68, 27061 - 11904: 0xE260, 27062 - 11904: 0xE1FD, 27063 - 11904: 0xBA65, 27065 - 11904: 0xE253, 27067 - 11904: 0xBA66, 27068 - 11904: 0xE245, 27069 - 11904: 0xE250, 27070 - 11904: 0xE24C, 27071 - 11904: 0xE24E, 27072 - 11904: 0x9FCA, 27073 - 11904: 0xBA60, 27074 - 11904: 0xE25F, 27075 - 11904: 0xBA6E, 27076 - 11904: 0xE24F, 27078 - 11904: 0xE262, 27081 - 11904: 0xE1FE, 27082 - 11904: 0xE254, 27083 - 11904: 0xBA63, 27084 - 11904: 0xBA6C, 27085 - 11904: 0xBA6A, 27086 - 11904: 0xE241, 27087 - 11904: 0xE256, 27088 - 11904: 0xBA69, 27089 - 11904: 0x92CF, 27091 - 11904: 0xBA62, 27092 - 11904: 0xE252, 27093 - 11904: 0x9CF4, 27094 - 11904: 0x8DC4, 27097 - 11904: 0xE25C, 27105 - 11904: 0xFD41, 27106 - 11904: 0xE5D5, 27108 - 11904: 0xE5D1, 27109 - 11904: 0xE5CD, 27110 - 11904: 0xE5E1, 27111 - 11904: 0xE5DE, 27112 - 11904: 0xBCCD, 27113 - 11904: 0x9B4C, 27115 - 11904: 0xE5E5, 27116 - 11904: 0xE5D4, 27117 - 11904: 0xBCD8, 27118 - 11904: 0xE5DB, 27121 - 11904: 0xE5D0, 27122 - 11904: 0xE5DA, 27123 - 11904: 0xBCD5, 27124 - 11904: 0xE5EE, 27126 - 11904: 0xE5EB, 27127 - 11904: 0xE5DD, 27128 - 11904: 0xE5CE, 27129 - 11904: 0xFD57, 27130 - 11904: 0xFCEF, 27131 - 11904: 0xE5E2, 27132 - 11904: 0xE5E4, 27133 - 11904: 0xBCD1, 27134 - 11904: 0xE5D8, 27135 - 11904: 0xE5D3, 27136 - 11904: 0xE5CA, 27137 - 11904: 0xBCCE, 27138 - 11904: 0xBCD6, 27139 - 11904: 0x9CDE, 27140 - 11904: 0xE5E7, 27141 - 11904: 0xBCD7, 27142 - 11904: 0xE5CB, 27143 - 11904: 0xE5ED, 27144 - 11904: 0xE5E0, 27145 - 11904: 0xE5E6, 27146 - 11904: 0xBCD4, 27147 - 11904: 0xFD42, 27148 - 11904: 0x986C, 27149 - 11904: 0xE5E3, 27151 - 11904: 0xE5EA, 27153 - 11904: 0xBCD9, 27155 - 11904: 0xBCD3, 27156 - 11904: 0xE5DC, 27157 - 11904: 0xE5CF, 27158 - 11904: 0xE5EF, 27159 - 11904: 0xE5CC, 27160 - 11904: 0xE5E8, 27161 - 11904: 0xBCD0, 27162 - 11904: 0x97F9, 27163 - 11904: 0xE5D6, 27164 - 11904: 0x9558, 27165 - 11904: 0xE5D7, 27166 - 11904: 0xBCCF, 27167 - 11904: 0xBCCC, 27168 - 11904: 0xE5D2, 27169 - 11904: 0xBCD2, 27171 - 11904: 0xBCCB, 27173 - 11904: 0xE5E9, 27174 - 11904: 0xE5EC, 27175 - 11904: 0xE5D9, 27176 - 11904: 0xE9CA, 27177 - 11904: 0x87B6, 27179 - 11904: 0x985E, 27180 - 11904: 0xFE7B, 27181 - 11904: 0x94CD, 27186 - 11904: 0xE9C2, 27187 - 11904: 0x93EE, 27188 - 11904: 0xE9BE, 27189 - 11904: 0xBEF6, 27192 - 11904: 0xBEEB, 27193 - 11904: 0xBEF0, 27194 - 11904: 0xBEEC, 27195 - 11904: 0xE9CC, 27196 - 11904: 0xE9D7, 27197 - 11904: 0xBEEA, 27198 - 11904: 0xE9C4, 27199 - 11904: 0xE9CD, 27200 - 11904: 0xE5DF, 27201 - 11904: 0xE9CE, 27203 - 11904: 0x8CA3, 27204 - 11904: 0xBEF1, 27205 - 11904: 0xFD5A, 27206 - 11904: 0xE9DD, 27207 - 11904: 0xBEF5, 27208 - 11904: 0xBEF8, 27209 - 11904: 0xE9C0, 27211 - 11904: 0xBEF4, 27212 - 11904: 0x93F5, 27213 - 11904: 0xE9DB, 27214 - 11904: 0xE9DC, 27215 - 11904: 0xE9D2, 27216 - 11904: 0xE9D1, 27217 - 11904: 0xE9C9, 27218 - 11904: 0x93EF, 27219 - 11904: 0x8EEA, 27220 - 11904: 0xE9D3, 27221 - 11904: 0xE9DA, 27222 - 11904: 0xE9D9, 27223 - 11904: 0x8F5B, 27224 - 11904: 0xBEEF, 27225 - 11904: 0xBEED, 27226 - 11904: 0xE9CB, 27227 - 11904: 0xE9C8, 27229 - 11904: 0xE9C5, 27230 - 11904: 0xE9D8, 27231 - 11904: 0xBEF7, 27232 - 11904: 0xE9D6, 27233 - 11904: 0xBEF3, 27234 - 11904: 0xBEF2, 27235 - 11904: 0x8C5E, 27236 - 11904: 0xE9D0, 27237 - 11904: 0x8DC6, 27238 - 11904: 0xE9BF, 27239 - 11904: 0xE9C1, 27240 - 11904: 0xE9C3, 27241 - 11904: 0xE9D5, 27242 - 11904: 0xE9CF, 27243 - 11904: 0xBEEE, 27245 - 11904: 0xE9C6, 27247 - 11904: 0xE9D4, 27249 - 11904: 0x8DC8, 27252 - 11904: 0x8DC7, 27254 - 11904: 0xE9C7, 27258 - 11904: 0x93F7, 27262 - 11904: 0xC0CF, 27263 - 11904: 0xED45, 27264 - 11904: 0xC0C8, 27265 - 11904: 0xECF5, 27266 - 11904: 0x8DC9, 27267 - 11904: 0xED41, 27268 - 11904: 0xC0CA, 27269 - 11904: 0xED48, 27271 - 11904: 0xECFC, 27273 - 11904: 0xECF7, 27274 - 11904: 0xFBF2, 27276 - 11904: 0xED49, 27277 - 11904: 0xECF3, 27278 - 11904: 0xECFE, 27279 - 11904: 0x9670, 27280 - 11904: 0xC0D1, 27281 - 11904: 0xED44, 27282 - 11904: 0xED4A, 27283 - 11904: 0xECFD, 27284 - 11904: 0xC0C9, 27285 - 11904: 0xED40, 27286 - 11904: 0xECF4, 27287 - 11904: 0xC0D0, 27289 - 11904: 0x8DCB, 27290 - 11904: 0xED47, 27291 - 11904: 0xECF9, 27292 - 11904: 0xC0CC, 27293 - 11904: 0xFD5C, 27294 - 11904: 0xECFB, 27295 - 11904: 0xECF8, 27296 - 11904: 0xC0D2, 27297 - 11904: 0xECFA, 27298 - 11904: 0xC0CB, 27299 - 11904: 0xC0CE, 27300 - 11904: 0xED43, 27301 - 11904: 0xECF6, 27302 - 11904: 0xED46, 27303 - 11904: 0x8F65, 27304 - 11904: 0xED42, 27307 - 11904: 0x8DCD, 27308 - 11904: 0xC263, 27309 - 11904: 0xEFE7, 27310 - 11904: 0xC268, 27311 - 11904: 0xC269, 27313 - 11904: 0x9DA8, 27314 - 11904: 0x94F9, 27315 - 11904: 0xC262, 27316 - 11904: 0xEFE6, 27317 - 11904: 0x8DCE, 27318 - 11904: 0xEFE3, 27319 - 11904: 0xEFE4, 27320 - 11904: 0xC266, 27321 - 11904: 0xEFDE, 27322 - 11904: 0xEFE2, 27323 - 11904: 0xC265, 27325 - 11904: 0xEFDF, 27326 - 11904: 0x93EA, 27330 - 11904: 0xC267, 27331 - 11904: 0xC264, 27333 - 11904: 0xEFDD, 27334 - 11904: 0xEFE1, 27335 - 11904: 0xEFE5, 27336 - 11904: 0xFD5F, 27337 - 11904: 0x93F0, 27338 - 11904: 0x9FB6, 27339 - 11904: 0xF251, 27340 - 11904: 0xF24E, 27341 - 11904: 0xF257, 27343 - 11904: 0xF256, 27344 - 11904: 0xF254, 27345 - 11904: 0xF24F, 27347 - 11904: 0xC372, 27348 - 11904: 0x8DCF, 27352 - 11904: 0x9763, 27353 - 11904: 0xF250, 27354 - 11904: 0xC371, 27355 - 11904: 0xC0CD, 27356 - 11904: 0xF253, 27357 - 11904: 0xC370, 27358 - 11904: 0xF258, 27359 - 11904: 0xF252, 27360 - 11904: 0xF24D, 27361 - 11904: 0xEFE0, 27365 - 11904: 0xC36F, 27367 - 11904: 0xF24C, 27368 - 11904: 0xF456, 27370 - 11904: 0xF455, 27371 - 11904: 0xF255, 27372 - 11904: 0xC468, 27374 - 11904: 0xF459, 27375 - 11904: 0xF45A, 27376 - 11904: 0xF454, 27377 - 11904: 0xF458, 27379 - 11904: 0xF453, 27382 - 11904: 0x8DD0, 27384 - 11904: 0xF5D1, 27385 - 11904: 0xF457, 27386 - 11904: 0xC4E7, 27387 - 11904: 0xC4E5, 27388 - 11904: 0xF5CF, 27392 - 11904: 0xF5D2, 27394 - 11904: 0xF5CE, 27395 - 11904: 0xF5D0, 27396 - 11904: 0xC4E6, 27397 - 11904: 0x93F1, 27400 - 11904: 0xF6E5, 27401 - 11904: 0xF6E6, 27402 - 11904: 0xC576, 27403 - 11904: 0xF6E4, 27407 - 11904: 0xF7E2, 27408 - 11904: 0xC5CF, 27409 - 11904: 0xF7E0, 27410 - 11904: 0xF7E1, 27411 - 11904: 0xF8AC, 27414 - 11904: 0xC656, 27415 - 11904: 0xF8F3, 27416 - 11904: 0xF8F1, 27417 - 11904: 0xF8F2, 27418 - 11904: 0xF8F4, 27421 - 11904: 0xFD62, 27422 - 11904: 0xF9BB, 27424 - 11904: 0xA4ED, 27425 - 11904: 0xA6B8, 27427 - 11904: 0xAA59, 27429 - 11904: 0xCCE9, 27432 - 11904: 0xCF64, 27436 - 11904: 0xD1F5, 27437 - 11904: 0xD1F7, 27439 - 11904: 0xD1F6, 27441 - 11904: 0xD1F8, 27442 - 11904: 0xB1FD, 27443 - 11904: 0xD5D7, 27444 - 11904: 0xD1F9, 27445 - 11904: 0xFD65, 27446 - 11904: 0xD5D6, 27447 - 11904: 0xD5D8, 27448 - 11904: 0xD5D9, 27449 - 11904: 0xD9DA, 27450 - 11904: 0xB4DB, 27451 - 11904: 0xD9DB, 27452 - 11904: 0xD9DD, 27453 - 11904: 0xB4DC, 27454 - 11904: 0xB4DA, 27455 - 11904: 0xD9DC, 27457 - 11904: 0xDDFA, 27458 - 11904: 0xDDF8, 27459 - 11904: 0xDDF7, 27461 - 11904: 0xDDF6, 27462 - 11904: 0xDDF5, 27463 - 11904: 0xB7B2, 27464 - 11904: 0xDDF9, 27465 - 11904: 0xBA70, 27466 - 11904: 0xE263, 27467 - 11904: 0xE265, 27468 - 11904: 0xBA71, 27469 - 11904: 0xE264, 27470 - 11904: 0xBCDB, 27472 - 11904: 0xBCDA, 27473 - 11904: 0xE5F0, 27474 - 11904: 0x9FDB, 27476 - 11904: 0xE9DF, 27477 - 11904: 0xE9DE, 27478 - 11904: 0xE9E0, 27479 - 11904: 0x93F8, 27481 - 11904: 0xBEF9, 27483 - 11904: 0xED4B, 27484 - 11904: 0xC0D3, 27486 - 11904: 0xEFE8, 27487 - 11904: 0xC26A, 27488 - 11904: 0xF259, 27489 - 11904: 0xC577, 27490 - 11904: 0xA4EE, 27491 - 11904: 0xA5BF, 27492 - 11904: 0xA6B9, 27493 - 11904: 0xA842, 27494 - 11904: 0xAA5A, 27495 - 11904: 0xAA5B, 27498 - 11904: 0xAC6E, 27501 - 11904: 0xD1FA, 27503 - 11904: 0x8BF7, 27506 - 11904: 0xB7B3, 27508 - 11904: 0xFD66, 27510 - 11904: 0xE6D1, 27511 - 11904: 0xBEFA, 27512 - 11904: 0xC26B, 27513 - 11904: 0xA4EF, 27514 - 11904: 0x8BCF, 27515 - 11904: 0xA6BA, 27518 - 11904: 0xCCEB, 27519 - 11904: 0xAA5C, 27520 - 11904: 0xCCEA, 27521 - 11904: 0x8DD1, 27522 - 11904: 0xCF65, 27523 - 11904: 0xAC6F, 27524 - 11904: 0xCF66, 27526 - 11904: 0xAC70, 27528 - 11904: 0xD1FC, 27529 - 11904: 0xAEEE, 27530 - 11904: 0xAEED, 27532 - 11904: 0xD5DE, 27533 - 11904: 0xD5DC, 27534 - 11904: 0xD5DD, 27535 - 11904: 0xD5DB, 27537 - 11904: 0xD5DA, 27540 - 11904: 0xD9DE, 27541 - 11904: 0xD9E1, 27542 - 11904: 0xB4DE, 27543 - 11904: 0xD9DF, 27544 - 11904: 0xB4DD, 27545 - 11904: 0xD9E0, 27547 - 11904: 0xDDFB, 27550 - 11904: 0xE266, 27551 - 11904: 0xE267, 27552 - 11904: 0xE268, 27554 - 11904: 0xE5F3, 27555 - 11904: 0xE5F2, 27556 - 11904: 0xBCDC, 27557 - 11904: 0xE5F1, 27558 - 11904: 0xE5F4, 27559 - 11904: 0xE9E1, 27562 - 11904: 0xE9E2, 27563 - 11904: 0xE9E3, 27565 - 11904: 0xED4C, 27566 - 11904: 0xC0D4, 27567 - 11904: 0xC26C, 27568 - 11904: 0xF25A, 27570 - 11904: 0xC4E8, 27571 - 11904: 0xC95F, 27573 - 11904: 0xAC71, 27574 - 11904: 0xCF67, 27575 - 11904: 0xAEEF, 27578 - 11904: 0xB1FE, 27580 - 11904: 0xB4DF, 27581 - 11904: 0xD9E2, 27583 - 11904: 0xB7B5, 27584 - 11904: 0xB7B4, 27585 - 11904: 0x8DD2, 27587 - 11904: 0xE269, 27588 - 11904: 0xE26A, 27589 - 11904: 0xBCDD, 27590 - 11904: 0xBCDE, 27591 - 11904: 0xE9E5, 27592 - 11904: 0xE9E4, 27593 - 11904: 0xEFE9, 27594 - 11904: 0xF7E3, 27595 - 11904: 0xA4F0, 27596 - 11904: 0xC960, 27597 - 11904: 0xA5C0, 27599 - 11904: 0xA843, 27600 - 11904: 0xCB48, 27602 - 11904: 0xAC72, 27603 - 11904: 0xB7B6, 27604 - 11904: 0xA4F1, 27606 - 11904: 0xCF68, 27607 - 11904: 0xAC73, 27608 - 11904: 0xCF69, 27610 - 11904: 0xC0D5, 27611 - 11904: 0xA4F2, 27612 - 11904: 0xFD71, 27614 - 11904: 0xCCEC, 27616 - 11904: 0xCF6A, 27617 - 11904: 0xFD6F, 27618 - 11904: 0xD242, 27619 - 11904: 0xD241, 27620 - 11904: 0xD1FE, 27622 - 11904: 0xD1FD, 27623 - 11904: 0xD243, 27624 - 11904: 0xD240, 27626 - 11904: 0x8DD3, 27627 - 11904: 0xB240, 27628 - 11904: 0xB241, 27631 - 11904: 0xB4E0, 27632 - 11904: 0xD9E3, 27634 - 11904: 0xD9E4, 27635 - 11904: 0xD9E5, 27639 - 11904: 0xDE41, 27640 - 11904: 0xDE42, 27641 - 11904: 0xDE40, 27642 - 11904: 0x9FE7, 27643 - 11904: 0xDDFD, 27644 - 11904: 0xDDFE, 27645 - 11904: 0xB7B7, 27646 - 11904: 0xE26B, 27647 - 11904: 0xE5F7, 27648 - 11904: 0xE5F6, 27649 - 11904: 0xE5F5, 27650 - 11904: 0xE5F8, 27651 - 11904: 0xE9E7, 27652 - 11904: 0xE9E6, 27653 - 11904: 0xBEFB, 27654 - 11904: 0xE9E8, 27656 - 11904: 0xC0D6, 27657 - 11904: 0xED4D, 27659 - 11904: 0xEFEA, 27660 - 11904: 0xF25B, 27661 - 11904: 0xF6E7, 27663 - 11904: 0xA4F3, 27664 - 11904: 0xA5C2, 27665 - 11904: 0xA5C1, 27667 - 11904: 0xAA5D, 27668 - 11904: 0xC961, 27669 - 11904: 0xC97E, 27670 - 11904: 0xA6BB, 27672 - 11904: 0xC9F7, 27673 - 11904: 0xCB49, 27674 - 11904: 0xCB4A, 27675 - 11904: 0xAA5E, 27676 - 11904: 0x90BD, 27677 - 11904: 0xCCED, 27679 - 11904: 0xAC74, 27680 - 11904: 0xCF6B, 27681 - 11904: 0xCF6C, 27683 - 11904: 0xAEF0, 27684 - 11904: 0xAEF4, 27685 - 11904: 0xD244, 27686 - 11904: 0xAEF3, 27687 - 11904: 0xAEF1, 27688 - 11904: 0xAEF2, 27690 - 11904: 0xD5DF, 27691 - 11904: 0xB242, 27692 - 11904: 0xB4E3, 27694 - 11904: 0xB4E1, 27695 - 11904: 0xB4E2, 27696 - 11904: 0xD9E6, 27697 - 11904: 0x9FD0, 27699 - 11904: 0xBA72, 27700 - 11904: 0xA4F4, 27701 - 11904: 0x8BD0, 27702 - 11904: 0xC9A1, 27703 - 11904: 0xFD72, 27704 - 11904: 0xA5C3, 27705 - 11904: 0x9CAE, 27706 - 11904: 0x8BD1, 27707 - 11904: 0xC9A4, 27709 - 11904: 0x8ADB, 27710 - 11904: 0xA5C6, 27711 - 11904: 0xC9A3, 27712 - 11904: 0xA5C5, 27713 - 11904: 0xA5C4, 27714 - 11904: 0xA844, 27715 - 11904: 0xC9A2, 27718 - 11904: 0xC9F8, 27721 - 11904: 0xFAE4, 27722 - 11904: 0xC9FC, 27723 - 11904: 0xC9FE, 27724 - 11904: 0xCA40, 27725 - 11904: 0xA6C5, 27726 - 11904: 0xA6C6, 27727 - 11904: 0xC9FB, 27728 - 11904: 0xA6C1, 27730 - 11904: 0xC9F9, 27732 - 11904: 0xC9FD, 27733 - 11904: 0xA6C2, 27735 - 11904: 0xA6BD, 27736 - 11904: 0x95CE, 27737 - 11904: 0xA6BE, 27738 - 11904: 0xFD76, 27739 - 11904: 0xA6C4, 27740 - 11904: 0xC9FA, 27741 - 11904: 0xA6BC, 27742 - 11904: 0xA845, 27743 - 11904: 0xA6BF, 27744 - 11904: 0xA6C0, 27745 - 11904: 0xA6C3, 27749 - 11904: 0xCB5B, 27750 - 11904: 0xCB59, 27751 - 11904: 0xCB4C, 27752 - 11904: 0xA851, 27753 - 11904: 0xCB53, 27754 - 11904: 0xA84C, 27755 - 11904: 0xCB4D, 27757 - 11904: 0xCB55, 27758 - 11904: 0xFB62, 27759 - 11904: 0xCB52, 27760 - 11904: 0xA84F, 27761 - 11904: 0xCB51, 27762 - 11904: 0xA856, 27763 - 11904: 0xCB5A, 27764 - 11904: 0xA858, 27765 - 11904: 0x8DD4, 27766 - 11904: 0xA85A, 27768 - 11904: 0xCB4B, 27769 - 11904: 0xFD78, 27770 - 11904: 0xA84D, 27771 - 11904: 0xCB5C, 27773 - 11904: 0xA854, 27774 - 11904: 0xA857, 27775 - 11904: 0x8EE3, 27776 - 11904: 0xCD45, 27777 - 11904: 0xA847, 27778 - 11904: 0xA85E, 27779 - 11904: 0xA855, 27780 - 11904: 0xCB4E, 27781 - 11904: 0xA84A, 27782 - 11904: 0xA859, 27783 - 11904: 0xCB56, 27784 - 11904: 0xA848, 27785 - 11904: 0xA849, 27786 - 11904: 0xCD43, 27787 - 11904: 0xCB4F, 27788 - 11904: 0xA850, 27789 - 11904: 0xA85B, 27790 - 11904: 0xCB5D, 27791 - 11904: 0xCB50, 27792 - 11904: 0xA84E, 27794 - 11904: 0xA853, 27795 - 11904: 0xCCEE, 27796 - 11904: 0xA85C, 27797 - 11904: 0xCB57, 27798 - 11904: 0xA852, 27800 - 11904: 0xA85D, 27801 - 11904: 0xA846, 27802 - 11904: 0xCB54, 27803 - 11904: 0xA84B, 27804 - 11904: 0xFDB7, 27805 - 11904: 0xCD44, 27807 - 11904: 0x9076, 27810 - 11904: 0x98C6, 27818 - 11904: 0x8DD5, 27819 - 11904: 0xAA6A, 27820 - 11904: 0xAA7A, 27821 - 11904: 0xCCF5, 27822 - 11904: 0xAA71, 27823 - 11904: 0x97D1, 27824 - 11904: 0xCD4B, 27825 - 11904: 0xAA62, 27826 - 11904: 0x9EB6, 27827 - 11904: 0xAA65, 27828 - 11904: 0xCD42, 27830 - 11904: 0xCCF3, 27831 - 11904: 0xCCF7, 27832 - 11904: 0xAA6D, 27833 - 11904: 0xAA6F, 27834 - 11904: 0xCCFA, 27835 - 11904: 0xAA76, 27836 - 11904: 0xAA68, 27837 - 11904: 0xAA66, 27838 - 11904: 0xAA67, 27839 - 11904: 0xAA75, 27840 - 11904: 0xCD47, 27841 - 11904: 0xAA70, 27842 - 11904: 0xCCF9, 27843 - 11904: 0xCCFB, 27844 - 11904: 0xAA6E, 27845 - 11904: 0xAA73, 27846 - 11904: 0xCCFC, 27847 - 11904: 0xCD4A, 27849 - 11904: 0xAC75, 27850 - 11904: 0xAA79, 27851 - 11904: 0xFAC7, 27852 - 11904: 0xAA63, 27853 - 11904: 0xCD49, 27854 - 11904: 0xA042, 27855 - 11904: 0xCD4D, 27856 - 11904: 0xCCF8, 27857 - 11904: 0xCD4F, 27858 - 11904: 0xCD40, 27859 - 11904: 0xAA6C, 27860 - 11904: 0xCCF4, 27861 - 11904: 0xAA6B, 27862 - 11904: 0xAA7D, 27863 - 11904: 0xAA72, 27865 - 11904: 0xCCF2, 27866 - 11904: 0xCF75, 27867 - 11904: 0xAA78, 27868 - 11904: 0xAA7C, 27869 - 11904: 0xCD41, 27870 - 11904: 0xCD46, 27871 - 11904: 0x9873, 27872 - 11904: 0xAA7E, 27873 - 11904: 0xAA77, 27874 - 11904: 0xAA69, 27875 - 11904: 0xAA5F, 27877 - 11904: 0xAA64, 27879 - 11904: 0xCCF6, 27880 - 11904: 0xAA60, 27881 - 11904: 0xCD4E, 27882 - 11904: 0x9FFC, 27883 - 11904: 0xCCF0, 27884 - 11904: 0xCCEF, 27885 - 11904: 0xCCFD, 27886 - 11904: 0xCCF1, 27887 - 11904: 0xAA7B, 27888 - 11904: 0xAEF5, 27889 - 11904: 0xAA74, 27890 - 11904: 0xCCFE, 27891 - 11904: 0xAA61, 27893 - 11904: 0xACA6, 27897 - 11904: 0xCD4C, 27903 - 11904: 0x8CA5, 27904 - 11904: 0xCF7C, 27905 - 11904: 0xCFA1, 27906 - 11904: 0x8DD7, 27907 - 11904: 0xCFA4, 27908 - 11904: 0xCF77, 27909 - 11904: 0x92FB, 27910 - 11904: 0x8DD8, 27911 - 11904: 0xCFA7, 27912 - 11904: 0xCFAA, 27913 - 11904: 0xCFAC, 27914 - 11904: 0xCF74, 27915 - 11904: 0xAC76, 27916 - 11904: 0xAC7B, 27917 - 11904: 0xD249, 27918 - 11904: 0xACAD, 27919 - 11904: 0xCFA5, 27920 - 11904: 0xCFAD, 27921 - 11904: 0xCF7B, 27922 - 11904: 0xCF73, 27926 - 11904: 0xD264, 27927 - 11904: 0xAC7E, 27928 - 11904: 0xCFA2, 27929 - 11904: 0xCF78, 27930 - 11904: 0xCF7A, 27931 - 11904: 0xACA5, 27933 - 11904: 0xCF7D, 27934 - 11904: 0xAC7D, 27935 - 11904: 0xCF70, 27936 - 11904: 0xCFA8, 27938 - 11904: 0xCFAB, 27940 - 11904: 0x944F, 27941 - 11904: 0xAC7A, 27942 - 11904: 0x8DD9, 27943 - 11904: 0xACA8, 27944 - 11904: 0xCF6D, 27945 - 11904: 0xACAA, 27946 - 11904: 0xAC78, 27947 - 11904: 0xACAE, 27948 - 11904: 0xCFA9, 27949 - 11904: 0xCF6F, 27950 - 11904: 0xACAB, 27951 - 11904: 0xD25E, 27952 - 11904: 0xCD48, 27953 - 11904: 0xAC7C, 27954 - 11904: 0xAC77, 27955 - 11904: 0xCF76, 27956 - 11904: 0xCF6E, 27957 - 11904: 0xACAC, 27958 - 11904: 0xACA4, 27959 - 11904: 0xCFA3, 27960 - 11904: 0xACA9, 27961 - 11904: 0xACA7, 27962 - 11904: 0xCF79, 27963 - 11904: 0xACA1, 27964 - 11904: 0xCF71, 27965 - 11904: 0xACA2, 27966 - 11904: 0xACA3, 27967 - 11904: 0xCF72, 27968 - 11904: 0xCFA6, 27969 - 11904: 0xAC79, 27970 - 11904: 0xCF7E, 27982 - 11904: 0x896B, 27991 - 11904: 0x97CE, 27992 - 11904: 0xD24C, 27993 - 11904: 0xAEFD, 27994 - 11904: 0xAF43, 27995 - 11904: 0xFAF3, 27996 - 11904: 0xFDAE, 27998 - 11904: 0xD255, 27999 - 11904: 0xD25B, 28000 - 11904: 0xD257, 28001 - 11904: 0xD24A, 28002 - 11904: 0xD24D, 28003 - 11904: 0xD246, 28004 - 11904: 0xD247, 28005 - 11904: 0xAF4A, 28006 - 11904: 0xAEFA, 28007 - 11904: 0xD256, 28008 - 11904: 0xD25F, 28009 - 11904: 0xAF45, 28010 - 11904: 0xAEF6, 28012 - 11904: 0xAF40, 28013 - 11904: 0xD24E, 28014 - 11904: 0xAF42, 28015 - 11904: 0xD24F, 28016 - 11904: 0xD259, 28017 - 11904: 0xFBAF, 28018 - 11904: 0x92B7, 28020 - 11904: 0xAF44, 28021 - 11904: 0xD268, 28022 - 11904: 0xD248, 28023 - 11904: 0xAEFC, 28024 - 11904: 0xAEFB, 28025 - 11904: 0xAF48, 28026 - 11904: 0xD245, 28027 - 11904: 0xD266, 28028 - 11904: 0xD25A, 28029 - 11904: 0xD267, 28030 - 11904: 0xD261, 28031 - 11904: 0xD253, 28032 - 11904: 0xD262, 28033 - 11904: 0x8DDA, 28034 - 11904: 0xD25C, 28035 - 11904: 0xD265, 28036 - 11904: 0xD263, 28037 - 11904: 0xAF49, 28038 - 11904: 0xD254, 28039 - 11904: 0xAEF9, 28040 - 11904: 0xAEF8, 28041 - 11904: 0xAF41, 28042 - 11904: 0xAF47, 28043 - 11904: 0xD260, 28044 - 11904: 0xAF46, 28045 - 11904: 0xD251, 28046 - 11904: 0xB243, 28047 - 11904: 0x9C5A, 28048 - 11904: 0xD269, 28049 - 11904: 0xD250, 28050 - 11904: 0xD24B, 28051 - 11904: 0xAEFE, 28052 - 11904: 0xAF4B, 28053 - 11904: 0xAEF7, 28054 - 11904: 0xFDAD, 28055 - 11904: 0xD258, 28056 - 11904: 0xD25D, 28068 - 11904: 0x8DDC, 28069 - 11904: 0x9444, 28074 - 11904: 0xB265, 28075 - 11904: 0xD5E1, 28076 - 11904: 0xD5E5, 28078 - 11904: 0xB252, 28079 - 11904: 0xB250, 28081 - 11904: 0x8DDD, 28082 - 11904: 0xB247, 28083 - 11904: 0xD5E3, 28084 - 11904: 0xD5E2, 28085 - 11904: 0xB25B, 28087 - 11904: 0xD5E8, 28088 - 11904: 0xB255, 28089 - 11904: 0xA0D6, 28090 - 11904: 0xD5FA, 28091 - 11904: 0xD647, 28092 - 11904: 0xB244, 28093 - 11904: 0xD5F7, 28094 - 11904: 0xD5F0, 28095 - 11904: 0xB267, 28096 - 11904: 0xD5E0, 28098 - 11904: 0xD5FC, 28100 - 11904: 0xB264, 28101 - 11904: 0xB258, 28102 - 11904: 0xB263, 28103 - 11904: 0xB24E, 28104 - 11904: 0xD5EC, 28105 - 11904: 0xD5FE, 28106 - 11904: 0xD5F6, 28107 - 11904: 0xB24F, 28108 - 11904: 0xB249, 28109 - 11904: 0xD645, 28111 - 11904: 0xD5FD, 28112 - 11904: 0xD640, 28113 - 11904: 0xB251, 28114 - 11904: 0xB259, 28115 - 11904: 0xD642, 28116 - 11904: 0xD5EA, 28117 - 11904: 0xD5FB, 28118 - 11904: 0xD5EF, 28119 - 11904: 0xD644, 28120 - 11904: 0xB25E, 28121 - 11904: 0xB246, 28122 - 11904: 0xB25C, 28123 - 11904: 0xD5F4, 28124 - 11904: 0xD5F2, 28125 - 11904: 0xD5F3, 28126 - 11904: 0xB253, 28127 - 11904: 0xD5EE, 28128 - 11904: 0xD5ED, 28129 - 11904: 0xB248, 28130 - 11904: 0xD5E7, 28131 - 11904: 0xD646, 28132 - 11904: 0xB24A, 28133 - 11904: 0xD5F1, 28134 - 11904: 0xB268, 28136 - 11904: 0xB262, 28137 - 11904: 0xD5E6, 28138 - 11904: 0xB25F, 28139 - 11904: 0xB25D, 28140 - 11904: 0xB266, 28141 - 11904: 0xD5F8, 28142 - 11904: 0xB261, 28143 - 11904: 0xD252, 28144 - 11904: 0xD5F9, 28145 - 11904: 0xB260, 28146 - 11904: 0xD641, 28147 - 11904: 0xB245, 28148 - 11904: 0xD5F5, 28149 - 11904: 0xB257, 28150 - 11904: 0xD5E9, 28151 - 11904: 0xB256, 28153 - 11904: 0xB254, 28154 - 11904: 0xB24C, 28155 - 11904: 0xB24B, 28156 - 11904: 0xD9E7, 28157 - 11904: 0xD643, 28158 - 11904: 0x8C41, 28160 - 11904: 0xD5EB, 28162 - 11904: 0x97D5, 28163 - 11904: 0xD9FC, 28164 - 11904: 0x944A, 28165 - 11904: 0xB24D, 28170 - 11904: 0x944D, 28175 - 11904: 0x97CB, 28181 - 11904: 0x8DDE, 28184 - 11904: 0x8DDF, 28185 - 11904: 0xB541, 28186 - 11904: 0xB25A, 28187 - 11904: 0xB4EE, 28188 - 11904: 0xD9F6, 28189 - 11904: 0xFDB8, 28191 - 11904: 0xD9EA, 28192 - 11904: 0xB4EB, 28193 - 11904: 0xB4E7, 28194 - 11904: 0xDA49, 28195 - 11904: 0xB4ED, 28196 - 11904: 0xB4F1, 28197 - 11904: 0xB4EC, 28198 - 11904: 0xB4F5, 28199 - 11904: 0xDA4D, 28200 - 11904: 0xDA44, 28201 - 11904: 0x8DE0, 28202 - 11904: 0xFEF9, 28203 - 11904: 0xD9F1, 28204 - 11904: 0xB4FA, 28205 - 11904: 0xB4F4, 28206 - 11904: 0xD9FD, 28207 - 11904: 0xFDBB, 28208 - 11904: 0xDA4A, 28209 - 11904: 0xDA43, 28210 - 11904: 0xB4E8, 28211 - 11904: 0xD9F7, 28212 - 11904: 0xB4F7, 28213 - 11904: 0xDA55, 28214 - 11904: 0xDA56, 28216 - 11904: 0xB4E5, 28217 - 11904: 0xDA48, 28218 - 11904: 0xB4F9, 28219 - 11904: 0xD9FB, 28220 - 11904: 0xD9ED, 28221 - 11904: 0xD9EE, 28222 - 11904: 0xB4FD, 28223 - 11904: 0xD9F2, 28224 - 11904: 0xD9F9, 28225 - 11904: 0xD9F3, 28227 - 11904: 0xB4FB, 28228 - 11904: 0xB544, 28229 - 11904: 0xD9EF, 28230 - 11904: 0xD9E8, 28231 - 11904: 0xD9E9, 28233 - 11904: 0xD9EB, 28234 - 11904: 0xB4EA, 28235 - 11904: 0xD9F8, 28237 - 11904: 0xB4F8, 28238 - 11904: 0xB542, 28239 - 11904: 0xFDC0, 28240 - 11904: 0xFCF9, 28241 - 11904: 0xD9FA, 28242 - 11904: 0xDA53, 28243 - 11904: 0xDA4B, 28244 - 11904: 0xB4E6, 28245 - 11904: 0xDA51, 28246 - 11904: 0xB4F2, 28247 - 11904: 0x8CDD, 28248 - 11904: 0xB4F0, 28249 - 11904: 0xFB7E, 28250 - 11904: 0xDA57, 28251 - 11904: 0xB4EF, 28252 - 11904: 0xDA41, 28253 - 11904: 0xD9F4, 28254 - 11904: 0xD9FE, 28255 - 11904: 0xB547, 28256 - 11904: 0xDA45, 28257 - 11904: 0xDA42, 28258 - 11904: 0xD9F0, 28259 - 11904: 0xB543, 28260 - 11904: 0xDA4F, 28261 - 11904: 0xDA4C, 28262 - 11904: 0xDA54, 28263 - 11904: 0xB4E9, 28264 - 11904: 0xDA40, 28265 - 11904: 0xB546, 28267 - 11904: 0xDA47, 28270 - 11904: 0xB4F3, 28271 - 11904: 0xB4F6, 28273 - 11904: 0xDA46, 28274 - 11904: 0xB545, 28275 - 11904: 0xD9F5, 28276 - 11904: 0xD5E4, 28278 - 11904: 0x92B3, 28279 - 11904: 0xDA50, 28280 - 11904: 0xDA4E, 28281 - 11904: 0xDA52, 28284 - 11904: 0xFDAF, 28294 - 11904: 0x8DE1, 28296 - 11904: 0xD9EC, 28297 - 11904: 0xB540, 28299 - 11904: 0x95D3, 28301 - 11904: 0xDE61, 28302 - 11904: 0xDE60, 28303 - 11904: 0xDE46, 28304 - 11904: 0xB7BD, 28306 - 11904: 0xDE5F, 28307 - 11904: 0xDE49, 28308 - 11904: 0xDE4A, 28310 - 11904: 0xB7C7, 28311 - 11904: 0xDE68, 28312 - 11904: 0xB7C2, 28313 - 11904: 0xDE5E, 28314 - 11904: 0x89C1, 28315 - 11904: 0xDE43, 28316 - 11904: 0xB7C8, 28317 - 11904: 0xB7BE, 28318 - 11904: 0xDE52, 28319 - 11904: 0xDE48, 28320 - 11904: 0xDE4B, 28321 - 11904: 0xDE63, 28322 - 11904: 0xB7B8, 28323 - 11904: 0xDE6A, 28324 - 11904: 0xDE62, 28325 - 11904: 0xB7C1, 28326 - 11904: 0xDE57, 28327 - 11904: 0xB7CC, 28330 - 11904: 0xB7CB, 28331 - 11904: 0xB7C5, 28334 - 11904: 0xDE69, 28335 - 11904: 0xB7B9, 28336 - 11904: 0xDE55, 28337 - 11904: 0xDE4C, 28338 - 11904: 0xDE59, 28339 - 11904: 0xDE65, 28340 - 11904: 0xB7CD, 28341 - 11904: 0xFD68, 28342 - 11904: 0xB7BB, 28343 - 11904: 0xDE54, 28344 - 11904: 0x9CB7, 28345 - 11904: 0xDE4D, 28346 - 11904: 0xB7C4, 28347 - 11904: 0x8DE3, 28348 - 11904: 0xB7C3, 28349 - 11904: 0xDE50, 28350 - 11904: 0xDE5A, 28351 - 11904: 0xDE64, 28352 - 11904: 0xDE47, 28353 - 11904: 0xDE51, 28354 - 11904: 0xB7BC, 28355 - 11904: 0xDE5B, 28356 - 11904: 0xB7C9, 28357 - 11904: 0xB7C0, 28358 - 11904: 0xDE4E, 28359 - 11904: 0xB7BF, 28360 - 11904: 0xDE45, 28361 - 11904: 0xDE53, 28362 - 11904: 0xDE67, 28363 - 11904: 0xB4FE, 28364 - 11904: 0xBAB0, 28365 - 11904: 0xDE56, 28366 - 11904: 0xE26C, 28367 - 11904: 0xDE58, 28368 - 11904: 0xDE66, 28369 - 11904: 0xB7C6, 28370 - 11904: 0xDE4F, 28371 - 11904: 0xB7BA, 28372 - 11904: 0xB7CA, 28373 - 11904: 0xBCF0, 28374 - 11904: 0xDE44, 28376 - 11904: 0xDE5D, 28377 - 11904: 0xFAC0, 28378 - 11904: 0x8DE5, 28379 - 11904: 0xFA64, 28380 - 11904: 0xDE5C, 28381 - 11904: 0x8947, 28386 - 11904: 0x8DE4, 28392 - 11904: 0x8DE7, 28393 - 11904: 0x8DE8, 28395 - 11904: 0xE2AA, 28396 - 11904: 0xBAAD, 28397 - 11904: 0xE27D, 28398 - 11904: 0xE2A4, 28399 - 11904: 0xBAA2, 28401 - 11904: 0xE26E, 28402 - 11904: 0xBAAF, 28404 - 11904: 0xBA77, 28405 - 11904: 0xE26D, 28406 - 11904: 0xE2B0, 28407 - 11904: 0xBAB1, 28408 - 11904: 0xE271, 28409 - 11904: 0xE2A3, 28410 - 11904: 0xFDC7, 28411 - 11904: 0xE273, 28412 - 11904: 0xE2B3, 28413 - 11904: 0xE2AF, 28414 - 11904: 0xBA75, 28415 - 11904: 0xBAA1, 28416 - 11904: 0xE653, 28417 - 11904: 0xBAAE, 28418 - 11904: 0xBA7D, 28419 - 11904: 0xE26F, 28420 - 11904: 0xFDB0, 28421 - 11904: 0xE2AE, 28422 - 11904: 0xBAA3, 28423 - 11904: 0xE2AB, 28424 - 11904: 0xE2B8, 28425 - 11904: 0xE275, 28426 - 11904: 0xE27E, 28427 - 11904: 0x9445, 28428 - 11904: 0x97D6, 28429 - 11904: 0xE2B6, 28430 - 11904: 0xE2AC, 28431 - 11904: 0xBA7C, 28434 - 11904: 0xE27C, 28435 - 11904: 0xBA76, 28436 - 11904: 0xBA74, 28437 - 11904: 0xBAA8, 28438 - 11904: 0xFCC6, 28439 - 11904: 0x9844, 28440 - 11904: 0xE27A, 28441 - 11904: 0xE277, 28442 - 11904: 0xE278, 28444 - 11904: 0xE2B2, 28446 - 11904: 0xE2B7, 28447 - 11904: 0xE2B5, 28448 - 11904: 0xBA7A, 28449 - 11904: 0xE2B9, 28450 - 11904: 0xBA7E, 28451 - 11904: 0xBAA7, 28452 - 11904: 0x8DE9, 28453 - 11904: 0xE270, 28454 - 11904: 0xE5FA, 28455 - 11904: 0xE279, 28457 - 11904: 0xBA78, 28458 - 11904: 0xBAAC, 28459 - 11904: 0xBAA9, 28460 - 11904: 0xBA7B, 28461 - 11904: 0xE2A5, 28462 - 11904: 0xE274, 28463 - 11904: 0xBAAA, 28464 - 11904: 0xE2A7, 28465 - 11904: 0xBAA4, 28466 - 11904: 0xBAA6, 28467 - 11904: 0xBA73, 28468 - 11904: 0x8DEA, 28469 - 11904: 0xE2A9, 28470 - 11904: 0xE2A1, 28471 - 11904: 0xE272, 28472 - 11904: 0xBAA5, 28473 - 11904: 0xE2B1, 28474 - 11904: 0xE2B4, 28475 - 11904: 0xE27B, 28476 - 11904: 0xE2A8, 28477 - 11904: 0xFE50, 28478 - 11904: 0xBA79, 28479 - 11904: 0xBCDF, 28480 - 11904: 0xE2A6, 28481 - 11904: 0xE5F9, 28483 - 11904: 0xE2AD, 28484 - 11904: 0xFDCC, 28494 - 11904: 0xE276, 28495 - 11904: 0xE644, 28496 - 11904: 0xE64E, 28497 - 11904: 0xBCE2, 28498 - 11904: 0xE64D, 28499 - 11904: 0xE659, 28500 - 11904: 0xBCE4, 28501 - 11904: 0xE64B, 28502 - 11904: 0x9DA7, 28503 - 11904: 0xE64F, 28504 - 11904: 0xBCEF, 28506 - 11904: 0xE646, 28507 - 11904: 0xBCE7, 28508 - 11904: 0xFDCD, 28509 - 11904: 0xE652, 28510 - 11904: 0xE9F0, 28511 - 11904: 0xBCF3, 28512 - 11904: 0xBCF2, 28513 - 11904: 0xE654, 28514 - 11904: 0xE643, 28515 - 11904: 0xE65E, 28516 - 11904: 0xBCED, 28518 - 11904: 0xBCE3, 28519 - 11904: 0xE657, 28521 - 11904: 0xE65B, 28522 - 11904: 0xE660, 28523 - 11904: 0xE655, 28524 - 11904: 0xE649, 28525 - 11904: 0xBCE6, 28526 - 11904: 0xBCE9, 28527 - 11904: 0xBCF1, 28528 - 11904: 0xBCEC, 28530 - 11904: 0xE64C, 28531 - 11904: 0xE2A2, 28532 - 11904: 0xFDCF, 28534 - 11904: 0xE648, 28535 - 11904: 0xE65F, 28536 - 11904: 0xBCE8, 28537 - 11904: 0x95D2, 28538 - 11904: 0xBCEB, 28539 - 11904: 0xE661, 28540 - 11904: 0xBCE0, 28541 - 11904: 0xE656, 28542 - 11904: 0xE5FB, 28543 - 11904: 0xE65C, 28544 - 11904: 0xC0DF, 28545 - 11904: 0x8DED, 28546 - 11904: 0xE64A, 28548 - 11904: 0xBCE1, 28549 - 11904: 0xE645, 28550 - 11904: 0xBCE5, 28551 - 11904: 0xE5FC, 28552 - 11904: 0xBAAB, 28553 - 11904: 0xE641, 28554 - 11904: 0xFCBA, 28555 - 11904: 0xE65A, 28556 - 11904: 0xE642, 28557 - 11904: 0xE640, 28558 - 11904: 0xBCEA, 28560 - 11904: 0xE658, 28562 - 11904: 0xE5FE, 28563 - 11904: 0xE651, 28564 - 11904: 0xE650, 28565 - 11904: 0xE65D, 28566 - 11904: 0xE647, 28567 - 11904: 0xBCEE, 28573 - 11904: 0xFDC5, 28574 - 11904: 0xE9F3, 28575 - 11904: 0xFDD2, 28576 - 11904: 0xBF49, 28577 - 11904: 0xBEFE, 28578 - 11904: 0xEA40, 28579 - 11904: 0xE9EB, 28580 - 11904: 0xBF41, 28581 - 11904: 0xE9F7, 28582 - 11904: 0xBF48, 28583 - 11904: 0xBF43, 28584 - 11904: 0xE9F5, 28585 - 11904: 0xED4F, 28586 - 11904: 0xE9FB, 28587 - 11904: 0xEA42, 28588 - 11904: 0xE9FA, 28589 - 11904: 0xE9E9, 28590 - 11904: 0xE9F8, 28591 - 11904: 0xEA44, 28592 - 11904: 0xEA46, 28593 - 11904: 0xBEFD, 28594 - 11904: 0xEA45, 28595 - 11904: 0xBF44, 28596 - 11904: 0xBF4A, 28597 - 11904: 0x9CDC, 28598 - 11904: 0xBF47, 28600 - 11904: 0xE9FE, 28601 - 11904: 0xBF46, 28602 - 11904: 0xE9F9, 28603 - 11904: 0x95CF, 28604 - 11904: 0xE9ED, 28605 - 11904: 0xE9F2, 28606 - 11904: 0x8DEE, 28607 - 11904: 0xE9FD, 28608 - 11904: 0xBF45, 28609 - 11904: 0xBF42, 28610 - 11904: 0xBEFC, 28611 - 11904: 0xBF40, 28612 - 11904: 0xE9F1, 28614 - 11904: 0xE5FD, 28615 - 11904: 0xE9EC, 28616 - 11904: 0xE9EF, 28617 - 11904: 0xEA41, 28618 - 11904: 0xE9F4, 28619 - 11904: 0xE9EA, 28620 - 11904: 0xED4E, 28621 - 11904: 0xEA43, 28622 - 11904: 0xE9EE, 28623 - 11904: 0xE9FC, 28627 - 11904: 0xFDD4, 28628 - 11904: 0xED51, 28629 - 11904: 0xC0E3, 28632 - 11904: 0xC0D7, 28633 - 11904: 0x96EC, 28634 - 11904: 0x96EB, 28635 - 11904: 0xC0DB, 28636 - 11904: 0xED53, 28637 - 11904: 0xED59, 28638 - 11904: 0xED57, 28639 - 11904: 0xC0D9, 28640 - 11904: 0xC0DA, 28641 - 11904: 0xC0E1, 28642 - 11904: 0xED5A, 28643 - 11904: 0xED52, 28644 - 11904: 0xC0DC, 28646 - 11904: 0xED56, 28647 - 11904: 0xED55, 28648 - 11904: 0xED5B, 28649 - 11904: 0xC0E2, 28651 - 11904: 0xC0DD, 28652 - 11904: 0xC0E0, 28653 - 11904: 0xED54, 28654 - 11904: 0xC0E4, 28655 - 11904: 0xC0DE, 28656 - 11904: 0xC0E5, 28657 - 11904: 0xC0D8, 28658 - 11904: 0xED58, 28660 - 11904: 0xED50, 28662 - 11904: 0x90B6, 28663 - 11904: 0xEFF7, 28664 - 11904: 0xFDC3, 28666 - 11904: 0xC271, 28667 - 11904: 0xEFF4, 28668 - 11904: 0xEFF6, 28670 - 11904: 0xC26F, 28671 - 11904: 0xEFF2, 28672 - 11904: 0xEFF3, 28673 - 11904: 0xEFEE, 28675 - 11904: 0x98AB, 28676 - 11904: 0xE9F6, 28677 - 11904: 0xEFEF, 28678 - 11904: 0xC270, 28679 - 11904: 0xEFEB, 28681 - 11904: 0xC26D, 28682 - 11904: 0xEFF8, 28683 - 11904: 0xC26E, 28684 - 11904: 0xEFEC, 28685 - 11904: 0xEFED, 28686 - 11904: 0xEFF1, 28687 - 11904: 0xC273, 28689 - 11904: 0xC272, 28692 - 11904: 0xEFF0, 28693 - 11904: 0xC378, 28694 - 11904: 0xF25F, 28695 - 11904: 0xF265, 28696 - 11904: 0xC379, 28697 - 11904: 0xF25C, 28698 - 11904: 0xC376, 28699 - 11904: 0xC373, 28700 - 11904: 0xF267, 28701 - 11904: 0xC377, 28702 - 11904: 0x96EE, 28703 - 11904: 0xC374, 28704 - 11904: 0xF25E, 28705 - 11904: 0xF261, 28706 - 11904: 0xF262, 28707 - 11904: 0xF263, 28708 - 11904: 0xF266, 28710 - 11904: 0xEFF5, 28711 - 11904: 0xF25D, 28712 - 11904: 0xC375, 28713 - 11904: 0xF264, 28714 - 11904: 0xF268, 28715 - 11904: 0xF260, 28716 - 11904: 0x8DF4, 28719 - 11904: 0xF45D, 28720 - 11904: 0xC46A, 28721 - 11904: 0xF460, 28722 - 11904: 0xC46B, 28723 - 11904: 0xF468, 28724 - 11904: 0xF45F, 28725 - 11904: 0xF45C, 28727 - 11904: 0xF45E, 28728 - 11904: 0xF462, 28729 - 11904: 0xF465, 28730 - 11904: 0xF464, 28731 - 11904: 0xF467, 28732 - 11904: 0xF45B, 28734 - 11904: 0xC469, 28735 - 11904: 0xF463, 28736 - 11904: 0xF466, 28737 - 11904: 0xF469, 28738 - 11904: 0xF461, 28739 - 11904: 0xF5D3, 28740 - 11904: 0xF5D4, 28741 - 11904: 0xF5D8, 28742 - 11904: 0xF5D9, 28744 - 11904: 0xF5D6, 28745 - 11904: 0xF5D7, 28746 - 11904: 0xF5D5, 28747 - 11904: 0xFDE0, 28748 - 11904: 0xC4E9, 28749 - 11904: 0x8C67, 28752 - 11904: 0x8DF6, 28753 - 11904: 0xC578, 28754 - 11904: 0xF6EB, 28756 - 11904: 0x8DF7, 28757 - 11904: 0xF6E8, 28758 - 11904: 0xF6E9, 28759 - 11904: 0xF6EA, 28760 - 11904: 0xC579, 28762 - 11904: 0xF7E5, 28763 - 11904: 0xF7E4, 28764 - 11904: 0x8FFA, 28765 - 11904: 0xF8AF, 28766 - 11904: 0xC5F4, 28767 - 11904: 0xF8AD, 28768 - 11904: 0xF8B0, 28769 - 11904: 0xF8AE, 28770 - 11904: 0xF8F5, 28771 - 11904: 0xC657, 28772 - 11904: 0xC665, 28773 - 11904: 0xF9A3, 28774 - 11904: 0xF96C, 28775 - 11904: 0x97D0, 28776 - 11904: 0xF9A2, 28777 - 11904: 0xF9D0, 28778 - 11904: 0xF9D1, 28779 - 11904: 0xA4F5, 28780 - 11904: 0x8BD2, 28782 - 11904: 0x87DE, 28783 - 11904: 0x8DF8, 28784 - 11904: 0xA6C7, 28785 - 11904: 0xCA41, 28788 - 11904: 0xCB5E, 28789 - 11904: 0x90D9, 28790 - 11904: 0xA85F, 28791 - 11904: 0x8C47, 28792 - 11904: 0xA862, 28793 - 11904: 0xFAF0, 28794 - 11904: 0xCB5F, 28796 - 11904: 0xA860, 28797 - 11904: 0xA861, 28798 - 11904: 0xFDE1, 28799 - 11904: 0x8DF9, 28801 - 11904: 0xFDE3, 28802 - 11904: 0xCD58, 28803 - 11904: 0xCD5A, 28804 - 11904: 0xCD55, 28805 - 11904: 0xCD52, 28806 - 11904: 0xCD54, 28809 - 11904: 0x8DFA, 28810 - 11904: 0xAAA4, 28811 - 11904: 0xFB63, 28814 - 11904: 0xAAA2, 28815 - 11904: 0x90A6, 28817 - 11904: 0xCD56, 28818 - 11904: 0xAAA3, 28819 - 11904: 0xCD53, 28820 - 11904: 0xCD50, 28821 - 11904: 0xAAA1, 28822 - 11904: 0xCD57, 28824 - 11904: 0xCD51, 28825 - 11904: 0xAAA5, 28826 - 11904: 0xCD59, 28831 - 11904: 0xCFAF, 28832 - 11904: 0x9970, 28833 - 11904: 0xCFB3, 28835 - 11904: 0x91EB, 28836 - 11904: 0xACB7, 28837 - 11904: 0x9770, 28838 - 11904: 0x986F, 28839 - 11904: 0xFDE2, 28841 - 11904: 0xCFB6, 28843 - 11904: 0xACAF, 28844 - 11904: 0xACB2, 28845 - 11904: 0xACB4, 28846 - 11904: 0xACB6, 28847 - 11904: 0xACB3, 28848 - 11904: 0xCFB2, 28849 - 11904: 0xCFB1, 28851 - 11904: 0xACB1, 28852 - 11904: 0xCFB4, 28853 - 11904: 0xCFB5, 28855 - 11904: 0xCFAE, 28856 - 11904: 0xACB5, 28857 - 11904: 0x98F2, 28858 - 11904: 0xACB0, 28859 - 11904: 0x9AFC, 28860 - 11904: 0x896C, 28861 - 11904: 0xFDFD, 28862 - 11904: 0xCFB0, 28864 - 11904: 0x995E, 28868 - 11904: 0x95BD, 28869 - 11904: 0xD277, 28870 - 11904: 0xD278, 28871 - 11904: 0xD279, 28872 - 11904: 0xAF50, 28874 - 11904: 0xAF4C, 28875 - 11904: 0xD26E, 28876 - 11904: 0xFDE4, 28877 - 11904: 0xD276, 28878 - 11904: 0xD27B, 28879 - 11904: 0xAF51, 28880 - 11904: 0x91E6, 28881 - 11904: 0xD26C, 28882 - 11904: 0xD272, 28883 - 11904: 0xD26B, 28884 - 11904: 0xD275, 28885 - 11904: 0xFDE5, 28886 - 11904: 0xFDE6, 28887 - 11904: 0xD271, 28888 - 11904: 0xAF4D, 28889 - 11904: 0xAF4F, 28890 - 11904: 0xD27A, 28892 - 11904: 0xD26A, 28893 - 11904: 0xD26D, 28894 - 11904: 0xD273, 28895 - 11904: 0xFDE7, 28896 - 11904: 0xD274, 28897 - 11904: 0xD27C, 28898 - 11904: 0xD270, 28900 - 11904: 0xAF4E, 28911 - 11904: 0xB26D, 28912 - 11904: 0xD64E, 28913 - 11904: 0x9454, 28915 - 11904: 0xD650, 28916 - 11904: 0xD64C, 28917 - 11904: 0x99B8, 28918 - 11904: 0xD658, 28919 - 11904: 0xD64A, 28920 - 11904: 0xD657, 28921 - 11904: 0xB269, 28922 - 11904: 0xD648, 28923 - 11904: 0xDA5B, 28924 - 11904: 0xD652, 28925 - 11904: 0xB26C, 28926 - 11904: 0x97E9, 28927 - 11904: 0xD653, 28928 - 11904: 0xD656, 28930 - 11904: 0xD65A, 28932 - 11904: 0xD64F, 28933 - 11904: 0x9346, 28934 - 11904: 0xD654, 28937 - 11904: 0xB26A, 28938 - 11904: 0xB26B, 28939 - 11904: 0xD659, 28940 - 11904: 0xD64D, 28941 - 11904: 0xD649, 28942 - 11904: 0xD65B, 28944 - 11904: 0xD651, 28947 - 11904: 0xD655, 28951 - 11904: 0xD64B, 28953 - 11904: 0xB548, 28954 - 11904: 0xB549, 28955 - 11904: 0xDA65, 28956 - 11904: 0xB54F, 28957 - 11904: 0x9863, 28958 - 11904: 0xDA59, 28959 - 11904: 0xDA62, 28960 - 11904: 0xDA58, 28961 - 11904: 0xB54C, 28962 - 11904: 0xDA60, 28963 - 11904: 0xDA5E, 28965 - 11904: 0xDA5F, 28966 - 11904: 0xB54A, 28968 - 11904: 0xDA63, 28969 - 11904: 0x95BC, 28971 - 11904: 0xFDED, 28972 - 11904: 0xFDF7, 28974 - 11904: 0xDA5C, 28975 - 11904: 0xDA5A, 28976 - 11904: 0xB54B, 28977 - 11904: 0xDA5D, 28978 - 11904: 0xDA61, 28979 - 11904: 0x9870, 28980 - 11904: 0x96F6, 28981 - 11904: 0x8EA9, 28982 - 11904: 0xB54D, 28986 - 11904: 0xDA64, 28987 - 11904: 0x9451, 28990 - 11904: 0x8E43, 28992 - 11904: 0x8B5A, 28993 - 11904: 0xDE70, 28994 - 11904: 0xDE77, 28995 - 11904: 0xDE79, 28996 - 11904: 0xDEA1, 28997 - 11904: 0xFDEE, 28998 - 11904: 0xB7DA, 28999 - 11904: 0xDE6B, 29001 - 11904: 0xB7D2, 29002 - 11904: 0xFDF0, 29003 - 11904: 0xDE7A, 29004 - 11904: 0xB7D7, 29005 - 11904: 0xDEA2, 29006 - 11904: 0xB7CE, 29007 - 11904: 0xFDF4, 29008 - 11904: 0xDE7D, 29009 - 11904: 0x9BF5, 29010 - 11904: 0xDE6D, 29011 - 11904: 0xDE7E, 29012 - 11904: 0xDE6C, 29014 - 11904: 0xB7DC, 29015 - 11904: 0x8CEE, 29016 - 11904: 0xDE78, 29017 - 11904: 0xB7CF, 29018 - 11904: 0xDEA3, 29020 - 11904: 0xB7D4, 29021 - 11904: 0xDE71, 29022 - 11904: 0xB7D9, 29023 - 11904: 0xDE7C, 29024 - 11904: 0xDE6F, 29025 - 11904: 0xDE76, 29026 - 11904: 0xDE72, 29027 - 11904: 0xDE6E, 29028 - 11904: 0xB7D1, 29029 - 11904: 0xB7D8, 29030 - 11904: 0xB7D6, 29031 - 11904: 0xB7D3, 29032 - 11904: 0xB7DB, 29033 - 11904: 0xB7D0, 29034 - 11904: 0xDE75, 29035 - 11904: 0x977E, 29036 - 11904: 0xB7D5, 29038 - 11904: 0xFDF1, 29040 - 11904: 0xDE7B, 29041 - 11904: 0x9BD5, 29042 - 11904: 0xDE73, 29043 - 11904: 0x9AC3, 29045 - 11904: 0x97C8, 29046 - 11904: 0xA0DB, 29047 - 11904: 0x91D0, 29048 - 11904: 0xDE74, 29050 - 11904: 0x9FE4, 29051 - 11904: 0xE2C1, 29052 - 11904: 0x8FDD, 29053 - 11904: 0xBAB4, 29054 - 11904: 0x91E9, 29056 - 11904: 0xE2BD, 29057 - 11904: 0xE2C3, 29058 - 11904: 0xE2BF, 29060 - 11904: 0xBAB6, 29061 - 11904: 0xE2BE, 29062 - 11904: 0xE2C2, 29063 - 11904: 0xE2BA, 29064 - 11904: 0x98E0, 29065 - 11904: 0xE2BC, 29066 - 11904: 0xBAB5, 29068 - 11904: 0x92CA, 29070 - 11904: 0x9857, 29071 - 11904: 0xE2C0, 29072 - 11904: 0xE2BB, 29073 - 11904: 0x8C51, 29074 - 11904: 0xBAB7, 29076 - 11904: 0xBAB2, 29078 - 11904: 0xFDEB, 29079 - 11904: 0xE2C4, 29080 - 11904: 0x9B49, 29081 - 11904: 0xBAB3, 29082 - 11904: 0xE667, 29083 - 11904: 0xE664, 29084 - 11904: 0xE670, 29085 - 11904: 0xE66A, 29086 - 11904: 0xE66C, 29087 - 11904: 0xBCF4, 29088 - 11904: 0xE666, 29089 - 11904: 0xE66E, 29090 - 11904: 0x9D76, 29091 - 11904: 0x9EAF, 29092 - 11904: 0xE66D, 29093 - 11904: 0xE66B, 29095 - 11904: 0xE671, 29096 - 11904: 0xBCF7, 29097 - 11904: 0xE668, 29098 - 11904: 0xE66F, 29100 - 11904: 0xBCF5, 29101 - 11904: 0x9CCC, 29103 - 11904: 0xE663, 29104 - 11904: 0xE665, 29105 - 11904: 0xBCF6, 29106 - 11904: 0xE662, 29107 - 11904: 0xE672, 29108 - 11904: 0xFDEA, 29109 - 11904: 0xE669, 29111 - 11904: 0x8DF1, 29112 - 11904: 0xEA4A, 29113 - 11904: 0xBF51, 29114 - 11904: 0xFDFB, 29116 - 11904: 0xEA55, 29117 - 11904: 0xEA53, 29118 - 11904: 0xBF4B, 29119 - 11904: 0xEA49, 29120 - 11904: 0xEA4C, 29121 - 11904: 0xEA4D, 29122 - 11904: 0xEA48, 29123 - 11904: 0xBF55, 29124 - 11904: 0xBF56, 29125 - 11904: 0xEA47, 29126 - 11904: 0xEA56, 29127 - 11904: 0xEA51, 29128 - 11904: 0xBF4F, 29129 - 11904: 0xBF4C, 29130 - 11904: 0xEA50, 29131 - 11904: 0xEA4E, 29134 - 11904: 0xBF52, 29135 - 11904: 0xEA52, 29136 - 11904: 0xBF4D, 29137 - 11904: 0x8E53, 29138 - 11904: 0xBF4E, 29140 - 11904: 0xEA4F, 29141 - 11904: 0xBF50, 29142 - 11904: 0xEA4B, 29144 - 11904: 0xEA54, 29145 - 11904: 0xBF53, 29146 - 11904: 0xEA57, 29147 - 11904: 0xEA58, 29148 - 11904: 0xBF54, 29149 - 11904: 0xFACF, 29151 - 11904: 0xC0E7, 29152 - 11904: 0xC0EE, 29153 - 11904: 0xED5C, 29154 - 11904: 0xED62, 29156 - 11904: 0xED60, 29157 - 11904: 0xC0EA, 29158 - 11904: 0xC0E9, 29159 - 11904: 0xC0E6, 29160 - 11904: 0xED5E, 29163 - 11904: 0x96F9, 29164 - 11904: 0xC0EC, 29165 - 11904: 0xC0EB, 29166 - 11904: 0xC0E8, 29168 - 11904: 0xED61, 29169 - 11904: 0xED5D, 29170 - 11904: 0xED5F, 29172 - 11904: 0xC0ED, 29173 - 11904: 0x98BF, 29174 - 11904: 0x9E49, 29176 - 11904: 0xC277, 29177 - 11904: 0xEFFB, 29179 - 11904: 0xC274, 29180 - 11904: 0xC275, 29181 - 11904: 0xEFFD, 29182 - 11904: 0xC276, 29183 - 11904: 0xEFFA, 29184 - 11904: 0x8CA7, 29185 - 11904: 0xEFF9, 29186 - 11904: 0xF26C, 29187 - 11904: 0xEFFC, 29189 - 11904: 0xF26D, 29190 - 11904: 0xC37A, 29191 - 11904: 0xF26B, 29193 - 11904: 0x9BCA, 29194 - 11904: 0xF26A, 29196 - 11904: 0xF269, 29197 - 11904: 0xC37B, 29198 - 11904: 0xFDFE, 29199 - 11904: 0x92DC, 29200 - 11904: 0xC46C, 29203 - 11904: 0xF46A, 29204 - 11904: 0xF46B, 29205 - 11904: 0xFE41, 29206 - 11904: 0x91CC, 29207 - 11904: 0x91E2, 29209 - 11904: 0xF5DC, 29210 - 11904: 0xF5DB, 29211 - 11904: 0xC4EA, 29213 - 11904: 0xF5DA, 29214 - 11904: 0xF6EC, 29215 - 11904: 0xF6ED, 29218 - 11904: 0xF7E6, 29219 - 11904: 0xF8B1, 29220 - 11904: 0xFE44, 29221 - 11904: 0x875F, 29222 - 11904: 0xF8F6, 29223 - 11904: 0xF9BC, 29224 - 11904: 0xC679, 29225 - 11904: 0xF9C6, 29226 - 11904: 0xA4F6, 29227 - 11904: 0x8BD3, 29228 - 11904: 0xAAA6, 29229 - 11904: 0xAAA7, 29230 - 11904: 0xFE47, 29232 - 11904: 0xACB8, 29237 - 11904: 0xC0EF, 29238 - 11904: 0xA4F7, 29240 - 11904: 0xAAA8, 29241 - 11904: 0xAF52, 29242 - 11904: 0xB7DD, 29243 - 11904: 0xA4F8, 29245 - 11904: 0xB26E, 29246 - 11904: 0xBAB8, 29247 - 11904: 0xC962, 29248 - 11904: 0xFE48, 29249 - 11904: 0xCFB7, 29250 - 11904: 0xD27D, 29252 - 11904: 0xE2C5, 29254 - 11904: 0xC0F0, 29255 - 11904: 0xA4F9, 29256 - 11904: 0xAAA9, 29257 - 11904: 0xCFB8, 29258 - 11904: 0xCFB9, 29259 - 11904: 0xDA66, 29260 - 11904: 0xB550, 29263 - 11904: 0xDEA4, 29264 - 11904: 0xA0E4, 29266 - 11904: 0xB7DE, 29267 - 11904: 0xE2C6, 29269 - 11904: 0xFE4B, 29270 - 11904: 0xBCF8, 29271 - 11904: 0xFE4C, 29272 - 11904: 0xC37C, 29273 - 11904: 0xA4FA, 29274 - 11904: 0xDA67, 29275 - 11904: 0xA4FB, 29276 - 11904: 0x8DBF, 29277 - 11904: 0xA6C9, 29278 - 11904: 0xCA42, 29279 - 11904: 0xA6C8, 29280 - 11904: 0xA865, 29281 - 11904: 0xA864, 29282 - 11904: 0xA863, 29283 - 11904: 0xCB60, 29286 - 11904: 0x9E78, 29287 - 11904: 0xAAAA, 29289 - 11904: 0xAAAB, 29290 - 11904: 0xCD5B, 29292 - 11904: 0xCFBA, 29294 - 11904: 0xCFBD, 29295 - 11904: 0xACBA, 29296 - 11904: 0xCFBB, 29298 - 11904: 0xACB9, 29299 - 11904: 0xCFBC, 29300 - 11904: 0xACBB, 29302 - 11904: 0xD2A2, 29303 - 11904: 0xD2A1, 29304 - 11904: 0xD27E, 29305 - 11904: 0xAF53, 29307 - 11904: 0xD65D, 29308 - 11904: 0xD65E, 29309 - 11904: 0xB26F, 29310 - 11904: 0xD65C, 29311 - 11904: 0xD65F, 29312 - 11904: 0xB552, 29313 - 11904: 0xB270, 29314 - 11904: 0xFE51, 29316 - 11904: 0xB551, 29317 - 11904: 0xDA6B, 29318 - 11904: 0xDA6A, 29319 - 11904: 0x9456, 29320 - 11904: 0xDA68, 29321 - 11904: 0xDA69, 29323 - 11904: 0xDA6C, 29324 - 11904: 0xDEA6, 29325 - 11904: 0xDEA5, 29326 - 11904: 0xDEA9, 29327 - 11904: 0x9D61, 29328 - 11904: 0xDEA8, 29329 - 11904: 0xDEA7, 29330 - 11904: 0xBAB9, 29331 - 11904: 0xE2C9, 29332 - 11904: 0x9457, 29333 - 11904: 0xE2C8, 29334 - 11904: 0xBABA, 29335 - 11904: 0xE2C7, 29336 - 11904: 0xE673, 29338 - 11904: 0xE674, 29339 - 11904: 0xBCF9, 29341 - 11904: 0xEA59, 29342 - 11904: 0xEA5A, 29343 - 11904: 0x9966, 29345 - 11904: 0xF272, 29346 - 11904: 0xC37D, 29347 - 11904: 0xF271, 29348 - 11904: 0xF270, 29349 - 11904: 0xF26E, 29350 - 11904: 0xF26F, 29351 - 11904: 0xC4EB, 29352 - 11904: 0xF46C, 29353 - 11904: 0xF6EE, 29354 - 11904: 0xF8F7, 29356 - 11904: 0xA4FC, 29357 - 11904: 0x8BD5, 29358 - 11904: 0xC9A5, 29359 - 11904: 0xA5C7, 29360 - 11904: 0xC9A6, 29362 - 11904: 0xA069, 29364 - 11904: 0xCA43, 29365 - 11904: 0xCA44, 29370 - 11904: 0xCB66, 29373 - 11904: 0xCB62, 29375 - 11904: 0xCB61, 29376 - 11904: 0xAAAC, 29377 - 11904: 0xCB65, 29378 - 11904: 0xA867, 29379 - 11904: 0xCB63, 29380 - 11904: 0xA866, 29381 - 11904: 0xCB67, 29382 - 11904: 0xCB64, 29385 - 11904: 0xCD5F, 29386 - 11904: 0xCFBE, 29387 - 11904: 0xCD5D, 29388 - 11904: 0xCD64, 29389 - 11904: 0x98B4, 29390 - 11904: 0xAAAD, 29392 - 11904: 0xAAB0, 29393 - 11904: 0xCD65, 29394 - 11904: 0xCD61, 29396 - 11904: 0xCD62, 29398 - 11904: 0xCD5C, 29399 - 11904: 0xAAAF, 29400 - 11904: 0xCD5E, 29401 - 11904: 0xAAAE, 29402 - 11904: 0xCD63, 29404 - 11904: 0xCD60, 29407 - 11904: 0xCFC2, 29408 - 11904: 0xACBD, 29409 - 11904: 0xACBE, 29410 - 11904: 0xA049, 29411 - 11904: 0xCFC5, 29412 - 11904: 0xCFBF, 29414 - 11904: 0xCFC4, 29416 - 11904: 0xCFC0, 29417 - 11904: 0xACBC, 29418 - 11904: 0xCFC3, 29419 - 11904: 0xCFC1, 29427 - 11904: 0xD2A8, 29428 - 11904: 0xD2A5, 29430 - 11904: 0xD2A7, 29431 - 11904: 0xAF58, 29432 - 11904: 0xAF57, 29433 - 11904: 0xAF55, 29434 - 11904: 0xD2A4, 29435 - 11904: 0xD2A9, 29436 - 11904: 0xAF54, 29437 - 11904: 0xAF56, 29438 - 11904: 0xD2A6, 29439 - 11904: 0xD667, 29440 - 11904: 0xD2A3, 29441 - 11904: 0xD2AA, 29442 - 11904: 0xA04C, 29444 - 11904: 0x9E65, 29447 - 11904: 0xD662, 29448 - 11904: 0xD666, 29450 - 11904: 0xD665, 29451 - 11904: 0xDA6E, 29452 - 11904: 0xDA79, 29455 - 11904: 0xD668, 29456 - 11904: 0x98B5, 29457 - 11904: 0xD663, 29458 - 11904: 0xDA6D, 29459 - 11904: 0xB274, 29462 - 11904: 0xB273, 29463 - 11904: 0xD661, 29464 - 11904: 0xD664, 29465 - 11904: 0xB275, 29467 - 11904: 0xB272, 29468 - 11904: 0xB271, 29469 - 11904: 0xD660, 29470 - 11904: 0xD669, 29474 - 11904: 0xDA70, 29475 - 11904: 0xDA77, 29477 - 11904: 0xB554, 29478 - 11904: 0xDA76, 29479 - 11904: 0xDA73, 29480 - 11904: 0xFE58, 29481 - 11904: 0xB556, 29482 - 11904: 0xFE52, 29483 - 11904: 0xFE53, 29484 - 11904: 0xA065, 29485 - 11904: 0xDA75, 29486 - 11904: 0xFE59, 29488 - 11904: 0xDA6F, 29489 - 11904: 0xDA71, 29490 - 11904: 0xDA74, 29491 - 11904: 0xDA72, 29492 - 11904: 0xB555, 29493 - 11904: 0xDA78, 29494 - 11904: 0xB553, 29495 - 11904: 0xB7DF, 29496 - 11904: 0x98B7, 29497 - 11904: 0x98B8, 29498 - 11904: 0xDEAD, 29499 - 11904: 0xDEAC, 29500 - 11904: 0xDEAA, 29502 - 11904: 0xB7E2, 29503 - 11904: 0xB7E1, 29504 - 11904: 0xDEAE, 29505 - 11904: 0x98BA, 29506 - 11904: 0xDEAB, 29507 - 11904: 0xE2CA, 29508 - 11904: 0xBABB, 29509 - 11904: 0xB7E0, 29512 - 11904: 0x98BB, 29513 - 11904: 0xDEB0, 29514 - 11904: 0xDEAF, 29516 - 11904: 0xE2CD, 29517 - 11904: 0xE2CB, 29518 - 11904: 0xBCFA, 29519 - 11904: 0x9FBC, 29520 - 11904: 0xBABC, 29521 - 11904: 0xE2CC, 29522 - 11904: 0xE676, 29527 - 11904: 0xBCFB, 29528 - 11904: 0xE675, 29529 - 11904: 0xE67E, 29530 - 11904: 0xE67D, 29531 - 11904: 0xE67B, 29533 - 11904: 0xE67A, 29534 - 11904: 0xE677, 29535 - 11904: 0xE678, 29536 - 11904: 0xE679, 29537 - 11904: 0xE67C, 29538 - 11904: 0xE6A1, 29541 - 11904: 0xEA5F, 29542 - 11904: 0xEA5C, 29543 - 11904: 0xEA5D, 29544 - 11904: 0xBF57, 29545 - 11904: 0xEA5B, 29546 - 11904: 0xEA61, 29547 - 11904: 0xEA60, 29548 - 11904: 0xEA5E, 29550 - 11904: 0xED64, 29551 - 11904: 0xED65, 29552 - 11904: 0xC0F1, 29553 - 11904: 0xA04A, 29554 - 11904: 0xC0F2, 29555 - 11904: 0xED63, 29556 - 11904: 0x9EC7, 29557 - 11904: 0xC279, 29558 - 11904: 0xEFFE, 29559 - 11904: 0xC278, 29560 - 11904: 0xC37E, 29562 - 11904: 0xC3A1, 29563 - 11904: 0xC46D, 29564 - 11904: 0xF46E, 29565 - 11904: 0xF46D, 29566 - 11904: 0xF5DD, 29567 - 11904: 0xF6EF, 29568 - 11904: 0xC57A, 29569 - 11904: 0xF7E8, 29570 - 11904: 0xF7E7, 29571 - 11904: 0xF7E9, 29572 - 11904: 0xA5C8, 29573 - 11904: 0xCFC6, 29574 - 11904: 0xAF59, 29575 - 11904: 0xB276, 29576 - 11904: 0xD66A, 29577 - 11904: 0xA5C9, 29578 - 11904: 0xC9A7, 29579 - 11904: 0xA4FD, 29580 - 11904: 0x8CA9, 29582 - 11904: 0xCA45, 29583 - 11904: 0x98AE, 29586 - 11904: 0xCB6C, 29587 - 11904: 0xCB6A, 29588 - 11904: 0xCB6B, 29589 - 11904: 0xCB68, 29590 - 11904: 0xA868, 29591 - 11904: 0xCB69, 29592 - 11904: 0x92D6, 29596 - 11904: 0xFAE1, 29597 - 11904: 0xCD6D, 29598 - 11904: 0x91D4, 29599 - 11904: 0xAAB3, 29600 - 11904: 0xCD6B, 29601 - 11904: 0xCD67, 29602 - 11904: 0xCD6A, 29604 - 11904: 0xCD66, 29605 - 11904: 0xAAB5, 29606 - 11904: 0xCD69, 29607 - 11904: 0xFADE, 29608 - 11904: 0xAAB2, 29609 - 11904: 0xAAB1, 29610 - 11904: 0xFE5B, 29611 - 11904: 0xAAB4, 29612 - 11904: 0xCD6C, 29613 - 11904: 0xCD68, 29618 - 11904: 0xACC2, 29619 - 11904: 0xACC5, 29620 - 11904: 0xCFCE, 29621 - 11904: 0xCFCD, 29622 - 11904: 0xCFCC, 29623 - 11904: 0xACBF, 29624 - 11904: 0xCFD5, 29625 - 11904: 0xCFCB, 29626 - 11904: 0x8C53, 29627 - 11904: 0xACC1, 29628 - 11904: 0xD2AF, 29630 - 11904: 0xCFD2, 29631 - 11904: 0xCFD0, 29632 - 11904: 0xACC4, 29634 - 11904: 0xCFC8, 29635 - 11904: 0xCFD3, 29636 - 11904: 0x87BF, 29637 - 11904: 0xCFCA, 29638 - 11904: 0xCFD4, 29639 - 11904: 0xCFD1, 29640 - 11904: 0xCFC9, 29641 - 11904: 0xFE5E, 29642 - 11904: 0xACC0, 29643 - 11904: 0xCFD6, 29644 - 11904: 0xCFC7, 29645 - 11904: 0xACC3, 29646 - 11904: 0xFBD7, 29647 - 11904: 0xFE5A, 29648 - 11904: 0x94C5, 29650 - 11904: 0xD2B4, 29651 - 11904: 0xD2AB, 29652 - 11904: 0xD2B6, 29653 - 11904: 0xFACA, 29654 - 11904: 0xD2AE, 29655 - 11904: 0xD2B9, 29656 - 11904: 0xD2BA, 29657 - 11904: 0xD2AC, 29658 - 11904: 0xD2B8, 29659 - 11904: 0xD2B5, 29660 - 11904: 0xD2B3, 29661 - 11904: 0xD2B7, 29662 - 11904: 0xAF5F, 29664 - 11904: 0xAF5D, 29665 - 11904: 0x98C1, 29666 - 11904: 0x975C, 29667 - 11904: 0xD2B1, 29668 - 11904: 0xFE74, 29669 - 11904: 0xD2AD, 29670 - 11904: 0x9773, 29671 - 11904: 0xD2B0, 29672 - 11904: 0xD2BB, 29673 - 11904: 0xD2B2, 29674 - 11904: 0xAF5E, 29675 - 11904: 0xCFCF, 29677 - 11904: 0xAF5A, 29678 - 11904: 0xAF5C, 29679 - 11904: 0xFA46, 29683 - 11904: 0x9764, 29684 - 11904: 0xD678, 29685 - 11904: 0xD66D, 29686 - 11904: 0xD66B, 29687 - 11904: 0xFE68, 29688 - 11904: 0xD66C, 29689 - 11904: 0x964E, 29690 - 11904: 0xD673, 29691 - 11904: 0x9765, 29692 - 11904: 0xD674, 29693 - 11904: 0xD670, 29694 - 11904: 0xB27B, 29695 - 11904: 0xD675, 29696 - 11904: 0xD672, 29697 - 11904: 0xD66F, 29698 - 11904: 0x8C5A, 29699 - 11904: 0xB279, 29700 - 11904: 0xD66E, 29701 - 11904: 0xB277, 29702 - 11904: 0xB27A, 29703 - 11904: 0xD671, 29704 - 11904: 0xD679, 29705 - 11904: 0xAF5B, 29706 - 11904: 0xB278, 29707 - 11904: 0xD677, 29708 - 11904: 0xD676, 29709 - 11904: 0xB27C, 29713 - 11904: 0x89A1, 29714 - 11904: 0x95FA, 29716 - 11904: 0x92D4, 29717 - 11904: 0xFE69, 29718 - 11904: 0xDA7E, 29719 - 11904: 0xFB45, 29721 - 11904: 0x98C8, 29722 - 11904: 0xDAA1, 29723 - 11904: 0xB560, 29724 - 11904: 0x90EF, 29725 - 11904: 0xDAA7, 29726 - 11904: 0x98C9, 29727 - 11904: 0x98CA, 29728 - 11904: 0xDAA9, 29729 - 11904: 0xDAA2, 29730 - 11904: 0xB55A, 29731 - 11904: 0xDAA6, 29732 - 11904: 0xDAA5, 29733 - 11904: 0xB55B, 29734 - 11904: 0xB561, 29736 - 11904: 0xB562, 29737 - 11904: 0xDAA8, 29738 - 11904: 0xB558, 29739 - 11904: 0xDA7D, 29740 - 11904: 0xDA7B, 29741 - 11904: 0xDAA3, 29742 - 11904: 0xDA7A, 29743 - 11904: 0xB55F, 29744 - 11904: 0xDA7C, 29745 - 11904: 0xDAA4, 29746 - 11904: 0xDAAA, 29747 - 11904: 0xB559, 29748 - 11904: 0xB55E, 29749 - 11904: 0xB55C, 29750 - 11904: 0xB55D, 29751 - 11904: 0x946D, 29752 - 11904: 0x94B7, 29753 - 11904: 0xFE6C, 29754 - 11904: 0xB557, 29756 - 11904: 0x946B, 29759 - 11904: 0xB7E9, 29760 - 11904: 0xDEB7, 29761 - 11904: 0xB7E8, 29762 - 11904: 0xDEBB, 29763 - 11904: 0x92FC, 29764 - 11904: 0xDEB1, 29765 - 11904: 0x95EB, 29766 - 11904: 0xDEBC, 29767 - 11904: 0xFE73, 29768 - 11904: 0x976E, 29769 - 11904: 0xFE5F, 29770 - 11904: 0xDEB2, 29771 - 11904: 0xDEB3, 29772 - 11904: 0x87B8, 29773 - 11904: 0xDEBD, 29774 - 11904: 0xDEBA, 29775 - 11904: 0xDEB8, 29776 - 11904: 0xDEB9, 29777 - 11904: 0xDEB5, 29778 - 11904: 0xDEB4, 29779 - 11904: 0xFDBD, 29780 - 11904: 0xDEBE, 29781 - 11904: 0xB7E5, 29782 - 11904: 0x92D5, 29783 - 11904: 0xDEB6, 29785 - 11904: 0xB7EA, 29786 - 11904: 0xB7E4, 29787 - 11904: 0xB7EB, 29788 - 11904: 0xFE6F, 29789 - 11904: 0xFEB9, 29790 - 11904: 0xB7E7, 29791 - 11904: 0xB7E6, 29792 - 11904: 0xFE71, 29793 - 11904: 0x8778, 29794 - 11904: 0xE2CE, 29795 - 11904: 0xBABE, 29796 - 11904: 0xBABD, 29797 - 11904: 0xFBBB, 29799 - 11904: 0xE2D3, 29800 - 11904: 0xA0D5, 29801 - 11904: 0xBCFC, 29802 - 11904: 0xBABF, 29803 - 11904: 0x95FB, 29804 - 11904: 0xFE77, 29805 - 11904: 0xBAC1, 29806 - 11904: 0xE2D4, 29807 - 11904: 0xB7E3, 29808 - 11904: 0xBAC0, 29809 - 11904: 0xE2D0, 29810 - 11904: 0xE2D2, 29811 - 11904: 0xE2CF, 29812 - 11904: 0xFE79, 29813 - 11904: 0xE2D1, 29814 - 11904: 0xFE75, 29817 - 11904: 0xE6AB, 29818 - 11904: 0x945D, 29820 - 11904: 0xE6AA, 29821 - 11904: 0xE6A7, 29822 - 11904: 0xBD40, 29823 - 11904: 0xEA62, 29824 - 11904: 0xBD41, 29825 - 11904: 0xE6A6, 29826 - 11904: 0xFE7C, 29827 - 11904: 0xBCFE, 29829 - 11904: 0xE6A8, 29830 - 11904: 0xE6A5, 29831 - 11904: 0xE6A2, 29832 - 11904: 0xE6A9, 29833 - 11904: 0xE6A3, 29834 - 11904: 0xE6A4, 29835 - 11904: 0xBCFD, 29836 - 11904: 0x9344, 29837 - 11904: 0x8EA6, 29840 - 11904: 0xED69, 29842 - 11904: 0xEA66, 29844 - 11904: 0xEA65, 29845 - 11904: 0xEA67, 29847 - 11904: 0xED66, 29848 - 11904: 0xBF5A, 29849 - 11904: 0x92D3, 29850 - 11904: 0xEA63, 29851 - 11904: 0x94B8, 29852 - 11904: 0xBF58, 29853 - 11904: 0x8779, 29854 - 11904: 0xBF5C, 29855 - 11904: 0xBF5B, 29856 - 11904: 0xEA64, 29857 - 11904: 0xEA68, 29859 - 11904: 0xBF59, 29860 - 11904: 0xFC71, 29861 - 11904: 0xED6D, 29862 - 11904: 0xC0F5, 29863 - 11904: 0xC27A, 29864 - 11904: 0xC0F6, 29865 - 11904: 0xC0F3, 29866 - 11904: 0xED6A, 29867 - 11904: 0xED68, 29869 - 11904: 0xED6B, 29871 - 11904: 0xED6E, 29872 - 11904: 0xC0F4, 29873 - 11904: 0xED6C, 29874 - 11904: 0xED67, 29876 - 11904: 0x975E, 29877 - 11904: 0xF042, 29878 - 11904: 0xF045, 29879 - 11904: 0xF275, 29880 - 11904: 0xF040, 29881 - 11904: 0x8CAD, 29882 - 11904: 0xF46F, 29883 - 11904: 0xF046, 29885 - 11904: 0xC3A2, 29886 - 11904: 0xF044, 29887 - 11904: 0xC27B, 29888 - 11904: 0xF041, 29889 - 11904: 0xF043, 29890 - 11904: 0xF047, 29891 - 11904: 0xF276, 29893 - 11904: 0xF274, 29894 - 11904: 0x87C1, 29896 - 11904: 0xFEA7, 29898 - 11904: 0xC3A3, 29899 - 11904: 0xF273, 29900 - 11904: 0x946A, 29903 - 11904: 0xC46E, 29904 - 11904: 0x93E3, 29907 - 11904: 0x98CF, 29908 - 11904: 0xC4ED, 29909 - 11904: 0xF6F1, 29910 - 11904: 0xC4EC, 29911 - 11904: 0xF6F3, 29912 - 11904: 0xF6F0, 29913 - 11904: 0xF6F2, 29914 - 11904: 0xC5D0, 29915 - 11904: 0xF8B2, 29916 - 11904: 0xA5CA, 29917 - 11904: 0xCD6E, 29918 - 11904: 0xD2BC, 29919 - 11904: 0xD2BD, 29920 - 11904: 0xB27D, 29921 - 11904: 0xDEBF, 29922 - 11904: 0xBF5D, 29923 - 11904: 0xC3A4, 29924 - 11904: 0xC57B, 29925 - 11904: 0xF8B3, 29926 - 11904: 0xA5CB, 29927 - 11904: 0xA0D9, 29928 - 11904: 0xCD6F, 29929 - 11904: 0xFEAA, 29932 - 11904: 0xCFD7, 29934 - 11904: 0xCFD8, 29936 - 11904: 0xA0BF, 29937 - 11904: 0xA04D, 29938 - 11904: 0xA0B8, 29940 - 11904: 0xD2BE, 29941 - 11904: 0xD2BF, 29942 - 11904: 0xB27E, 29943 - 11904: 0xB2A1, 29944 - 11904: 0xA0CE, 29947 - 11904: 0xDAAB, 29949 - 11904: 0xDEC2, 29950 - 11904: 0xDEC1, 29951 - 11904: 0xDEC0, 29952 - 11904: 0xE2D5, 29954 - 11904: 0xE2D6, 29955 - 11904: 0xE2D7, 29956 - 11904: 0xBAC2, 29957 - 11904: 0xA0B7, 29959 - 11904: 0xE6AD, 29960 - 11904: 0xE6AC, 29963 - 11904: 0xEA69, 29964 - 11904: 0xBF5E, 29965 - 11904: 0xBF5F, 29966 - 11904: 0xFEA9, 29967 - 11904: 0xED72, 29968 - 11904: 0xED6F, 29969 - 11904: 0xED70, 29970 - 11904: 0xED71, 29971 - 11904: 0xF049, 29972 - 11904: 0xF048, 29973 - 11904: 0xC27C, 29974 - 11904: 0xF277, 29975 - 11904: 0xF5DE, 29976 - 11904: 0xA5CC, 29977 - 11904: 0x89C3, 29978 - 11904: 0xACC6, 29980 - 11904: 0xB2A2, 29981 - 11904: 0xDEC3, 29982 - 11904: 0xFEAB, 29983 - 11904: 0xA5CD, 29985 - 11904: 0xD2C0, 29986 - 11904: 0xB2A3, 29989 - 11904: 0xB563, 29990 - 11904: 0xB564, 29992 - 11904: 0xA5CE, 29993 - 11904: 0xA5CF, 29994 - 11904: 0xCA46, 29995 - 11904: 0xA86A, 29996 - 11904: 0xA869, 29997 - 11904: 0xACC7, 29998 - 11904: 0xCFD9, 29999 - 11904: 0xDAAC, 30000 - 11904: 0xA5D0, 30001 - 11904: 0xA5D1, 30002 - 11904: 0xA5D2, 30003 - 11904: 0xA5D3, 30004 - 11904: 0x9DF4, 30005 - 11904: 0x896D, 30007 - 11904: 0xA86B, 30008 - 11904: 0xA86C, 30009 - 11904: 0xCB6E, 30010 - 11904: 0xCB6D, 30011 - 11904: 0x9C7B, 30013 - 11904: 0xAAB6, 30014 - 11904: 0xCD72, 30015 - 11904: 0xCD70, 30016 - 11904: 0xCD71, 30018 - 11904: 0x98D2, 30022 - 11904: 0x9FA9, 30023 - 11904: 0xCFDA, 30024 - 11904: 0xCFDB, 30026 - 11904: 0xFEB2, 30027 - 11904: 0xACCB, 30028 - 11904: 0xACC9, 30029 - 11904: 0xFEB1, 30030 - 11904: 0xACCA, 30031 - 11904: 0xACC8, 30033 - 11904: 0x97D9, 30035 - 11904: 0xA0C4, 30036 - 11904: 0xAF60, 30037 - 11904: 0x9476, 30041 - 11904: 0xAF64, 30042 - 11904: 0xAF63, 30043 - 11904: 0xD2C1, 30044 - 11904: 0xAF62, 30045 - 11904: 0xAF61, 30047 - 11904: 0xD2C2, 30048 - 11904: 0x9978, 30050 - 11904: 0xB2A6, 30051 - 11904: 0xD67B, 30052 - 11904: 0xD67A, 30053 - 11904: 0xB2A4, 30054 - 11904: 0xB2A5, 30055 - 11904: 0xFEB3, 30058 - 11904: 0xB566, 30059 - 11904: 0xB565, 30060 - 11904: 0xDAAE, 30061 - 11904: 0x98D3, 30062 - 11904: 0xFEB4, 30063 - 11904: 0xDAAD, 30064 - 11904: 0xB2A7, 30066 - 11904: 0x98D4, 30070 - 11904: 0xB7ED, 30071 - 11904: 0xDEC5, 30072 - 11904: 0xB7EE, 30073 - 11904: 0xDEC4, 30074 - 11904: 0x9FB9, 30077 - 11904: 0xE2D8, 30078 - 11904: 0xE6AE, 30079 - 11904: 0xBD42, 30080 - 11904: 0xEA6A, 30083 - 11904: 0x9471, 30084 - 11904: 0xED73, 30086 - 11904: 0xC3A6, 30087 - 11904: 0xC3A5, 30090 - 11904: 0xC57C, 30091 - 11904: 0xA5D4, 30092 - 11904: 0xCD73, 30093 - 11904: 0x98D5, 30094 - 11904: 0xFEB8, 30095 - 11904: 0xB2A8, 30096 - 11904: 0xE2D9, 30097 - 11904: 0xBAC3, 30098 - 11904: 0xC6D4, 30100 - 11904: 0xCB6F, 30101 - 11904: 0xCB70, 30104 - 11904: 0xCD74, 30105 - 11904: 0xAAB8, 30106 - 11904: 0xAAB9, 30109 - 11904: 0xAAB7, 30110 - 11904: 0xFEBA, 30114 - 11904: 0xACCF, 30115 - 11904: 0xACD0, 30116 - 11904: 0xACCD, 30117 - 11904: 0xACCE, 30119 - 11904: 0xCFDC, 30122 - 11904: 0xCFDD, 30123 - 11904: 0xACCC, 30128 - 11904: 0xD2C3, 30129 - 11904: 0x9E5C, 30130 - 11904: 0xAF68, 30131 - 11904: 0xAF69, 30132 - 11904: 0xFEBB, 30133 - 11904: 0xB2AB, 30134 - 11904: 0xD2C9, 30136 - 11904: 0xAF6E, 30137 - 11904: 0xAF6C, 30138 - 11904: 0xD2CA, 30139 - 11904: 0xD2C5, 30140 - 11904: 0xAF6B, 30141 - 11904: 0xAF6A, 30142 - 11904: 0xAF65, 30143 - 11904: 0xD2C8, 30144 - 11904: 0xD2C7, 30145 - 11904: 0xD2C4, 30146 - 11904: 0xAF6D, 30147 - 11904: 0xA044, 30148 - 11904: 0xD2C6, 30149 - 11904: 0xAF66, 30151 - 11904: 0xAF67, 30152 - 11904: 0x98D7, 30154 - 11904: 0xB2AC, 30155 - 11904: 0xD6A1, 30156 - 11904: 0xD6A2, 30157 - 11904: 0xB2AD, 30158 - 11904: 0xD67C, 30159 - 11904: 0xD67E, 30160 - 11904: 0xD6A4, 30161 - 11904: 0xD6A3, 30162 - 11904: 0xD67D, 30164 - 11904: 0xB2A9, 30165 - 11904: 0xB2AA, 30167 - 11904: 0xDAB6, 30168 - 11904: 0xB56B, 30169 - 11904: 0xB56A, 30170 - 11904: 0xDAB0, 30171 - 11904: 0xB568, 30172 - 11904: 0x98D8, 30173 - 11904: 0xDAB3, 30174 - 11904: 0xB56C, 30175 - 11904: 0xDAB4, 30176 - 11904: 0xB56D, 30177 - 11904: 0xDAB1, 30178 - 11904: 0xB567, 30179 - 11904: 0xB569, 30180 - 11904: 0xDAB5, 30182 - 11904: 0xDAB2, 30183 - 11904: 0xDAAF, 30189 - 11904: 0xDED2, 30191 - 11904: 0xDEC7, 30192 - 11904: 0xB7F0, 30193 - 11904: 0xB7F3, 30194 - 11904: 0xB7F2, 30195 - 11904: 0xB7F7, 30196 - 11904: 0xB7F6, 30197 - 11904: 0xDED3, 30198 - 11904: 0xDED1, 30199 - 11904: 0xDECA, 30200 - 11904: 0xDECE, 30201 - 11904: 0xDECD, 30202 - 11904: 0xB7F4, 30203 - 11904: 0xDED0, 30204 - 11904: 0xDECC, 30205 - 11904: 0xDED4, 30206 - 11904: 0xDECB, 30207 - 11904: 0xB7F5, 30208 - 11904: 0xB7EF, 30209 - 11904: 0xB7F1, 30210 - 11904: 0xFEBC, 30211 - 11904: 0xDEC9, 30215 - 11904: 0x9FFE, 30216 - 11904: 0xE2DB, 30217 - 11904: 0xBAC7, 30218 - 11904: 0xE2DF, 30219 - 11904: 0xBAC6, 30220 - 11904: 0xE2DC, 30221 - 11904: 0xBAC5, 30223 - 11904: 0xDEC8, 30224 - 11904: 0xDECF, 30225 - 11904: 0xE2DE, 30227 - 11904: 0xBAC8, 30228 - 11904: 0xE2E0, 30229 - 11904: 0xE2DD, 30230 - 11904: 0xE2DA, 30233 - 11904: 0xE6B1, 30234 - 11904: 0xE6B5, 30235 - 11904: 0xE6B7, 30236 - 11904: 0xE6B3, 30237 - 11904: 0xE6B2, 30238 - 11904: 0xE6B0, 30239 - 11904: 0xBD45, 30240 - 11904: 0xBD43, 30241 - 11904: 0xBD48, 30242 - 11904: 0xBD49, 30243 - 11904: 0xE6B4, 30244 - 11904: 0xBD46, 30245 - 11904: 0xE6AF, 30246 - 11904: 0xBD47, 30247 - 11904: 0xBAC4, 30248 - 11904: 0xE6B6, 30249 - 11904: 0xBD44, 30252 - 11904: 0xFEBD, 30253 - 11904: 0xEA6C, 30255 - 11904: 0xEA6B, 30256 - 11904: 0xEA73, 30257 - 11904: 0xEA6D, 30258 - 11904: 0xEA72, 30259 - 11904: 0xEA6F, 30260 - 11904: 0xBF60, 30261 - 11904: 0xEA71, 30264 - 11904: 0xBF61, 30266 - 11904: 0xBF62, 30267 - 11904: 0x9DDD, 30268 - 11904: 0xEA70, 30269 - 11904: 0xEA6E, 30272 - 11904: 0x9EE1, 30274 - 11904: 0xC0F8, 30275 - 11904: 0xED74, 30278 - 11904: 0xC0F7, 30279 - 11904: 0xED77, 30280 - 11904: 0xED75, 30281 - 11904: 0xED76, 30284 - 11904: 0xC0F9, 30285 - 11904: 0x98DA, 30286 - 11904: 0x9DDF, 30287 - 11904: 0xFEBF, 30288 - 11904: 0xF04D, 30289 - 11904: 0xFEBE, 30290 - 11904: 0xC2A1, 30291 - 11904: 0xF04E, 30292 - 11904: 0x9EEB, 30294 - 11904: 0xC27D, 30295 - 11904: 0xF04F, 30296 - 11904: 0xC27E, 30297 - 11904: 0xF04C, 30298 - 11904: 0xF050, 30300 - 11904: 0xF04A, 30303 - 11904: 0xC3A7, 30304 - 11904: 0xF278, 30305 - 11904: 0xC3A8, 30306 - 11904: 0xC46F, 30308 - 11904: 0xF04B, 30309 - 11904: 0xC470, 30310 - 11904: 0x9E59, 30311 - 11904: 0xA05C, 30313 - 11904: 0xC4EE, 30314 - 11904: 0xF5DF, 30316 - 11904: 0xC57E, 30317 - 11904: 0xF6F4, 30318 - 11904: 0xC57D, 30319 - 11904: 0xFEC0, 30320 - 11904: 0xF7EA, 30321 - 11904: 0xC5F5, 30322 - 11904: 0xC5F6, 30323 - 11904: 0x9477, 30324 - 11904: 0x98DC, 30325 - 11904: 0xF9CC, 30326 - 11904: 0xFEC1, 30328 - 11904: 0xACD1, 30329 - 11904: 0xCFDE, 30330 - 11904: 0x98DE, 30331 - 11904: 0xB56E, 30332 - 11904: 0xB56F, 30333 - 11904: 0xA5D5, 30334 - 11904: 0xA6CA, 30335 - 11904: 0xCA47, 30337 - 11904: 0xCB71, 30338 - 11904: 0xA86D, 30340 - 11904: 0xAABA, 30342 - 11904: 0xACD2, 30343 - 11904: 0xACD3, 30344 - 11904: 0xACD4, 30345 - 11904: 0xD6A6, 30346 - 11904: 0xD2CB, 30347 - 11904: 0xAF6F, 30350 - 11904: 0xB2AE, 30351 - 11904: 0xD6A5, 30352 - 11904: 0xFEC3, 30354 - 11904: 0xDAB8, 30355 - 11904: 0xB571, 30357 - 11904: 0xDAB7, 30358 - 11904: 0xB570, 30361 - 11904: 0xDED5, 30362 - 11904: 0xBD4A, 30363 - 11904: 0xE6BB, 30364 - 11904: 0xE6B8, 30365 - 11904: 0xE6B9, 30366 - 11904: 0xE6BA, 30369 - 11904: 0xFEC8, 30372 - 11904: 0xED78, 30373 - 11904: 0xFEC9, 30374 - 11904: 0xF051, 30378 - 11904: 0xF471, 30379 - 11904: 0xF470, 30381 - 11904: 0xF6F5, 30382 - 11904: 0xA5D6, 30383 - 11904: 0xCD75, 30384 - 11904: 0xAF70, 30388 - 11904: 0xB572, 30389 - 11904: 0xDED6, 30391 - 11904: 0xFECA, 30392 - 11904: 0xE2E1, 30394 - 11904: 0xBD4B, 30395 - 11904: 0xEA74, 30397 - 11904: 0xF052, 30398 - 11904: 0xF472, 30399 - 11904: 0xA5D7, 30402 - 11904: 0xAABB, 30403 - 11904: 0xACD7, 30404 - 11904: 0xCFDF, 30405 - 11904: 0xACD8, 30406 - 11904: 0xACD6, 30408 - 11904: 0xACD5, 30409 - 11904: 0xD2CC, 30410 - 11904: 0xAF71, 30412 - 11904: 0xFECB, 30413 - 11904: 0xAF72, 30414 - 11904: 0xAF73, 30418 - 11904: 0xB2B0, 30419 - 11904: 0xD6A7, 30420 - 11904: 0xB2AF, 30422 - 11904: 0x9FC2, 30425 - 11904: 0x8C6B, 30426 - 11904: 0xDAB9, 30427 - 11904: 0xB2B1, 30428 - 11904: 0xB573, 30429 - 11904: 0xDED7, 30430 - 11904: 0xB7F8, 30431 - 11904: 0xB7F9, 30433 - 11904: 0xBAC9, 30435 - 11904: 0xBACA, 30436 - 11904: 0xBD4C, 30437 - 11904: 0xBF64, 30438 - 11904: 0xEA75, 30439 - 11904: 0xBF63, 30441 - 11904: 0xED79, 30442 - 11904: 0xC0FA, 30444 - 11904: 0xF053, 30445 - 11904: 0xF473, 30446 - 11904: 0xA5D8, 30447 - 11904: 0xA86E, 30448 - 11904: 0xCD78, 30449 - 11904: 0xCD77, 30450 - 11904: 0xAABC, 30451 - 11904: 0xCD76, 30452 - 11904: 0xAABD, 30453 - 11904: 0xCD79, 30455 - 11904: 0xCFE5, 30456 - 11904: 0xACDB, 30457 - 11904: 0xACDA, 30458 - 11904: 0xCFE7, 30459 - 11904: 0xCFE6, 30460 - 11904: 0xACDF, 30462 - 11904: 0xACDE, 30465 - 11904: 0xACD9, 30467 - 11904: 0xCFE1, 30468 - 11904: 0xCFE2, 30469 - 11904: 0xCFE3, 30471 - 11904: 0xACE0, 30472 - 11904: 0xCFE0, 30473 - 11904: 0xACDC, 30474 - 11904: 0xCFE4, 30475 - 11904: 0xACDD, 30476 - 11904: 0x98C4, 30478 - 11904: 0x94B0, 30479 - 11904: 0x94B1, 30480 - 11904: 0xD2CF, 30481 - 11904: 0xD2D3, 30482 - 11904: 0xD2D1, 30483 - 11904: 0xD2D0, 30485 - 11904: 0xD2D4, 30489 - 11904: 0xD2D5, 30490 - 11904: 0xD2D6, 30491 - 11904: 0xD2CE, 30493 - 11904: 0xD2CD, 30494 - 11904: 0xFED1, 30495 - 11904: 0xAF75, 30496 - 11904: 0xAF76, 30498 - 11904: 0xD2D7, 30499 - 11904: 0xD2D2, 30500 - 11904: 0xA0C1, 30501 - 11904: 0xD6B0, 30502 - 11904: 0xFED2, 30503 - 11904: 0xD2D8, 30504 - 11904: 0xAF77, 30505 - 11904: 0xAF74, 30507 - 11904: 0xA0CD, 30509 - 11904: 0xD6AA, 30511 - 11904: 0xD6A9, 30513 - 11904: 0xD6AB, 30514 - 11904: 0xD6AC, 30515 - 11904: 0xD6AE, 30516 - 11904: 0xD6AD, 30517 - 11904: 0xD6B2, 30518 - 11904: 0xB2B5, 30519 - 11904: 0xB2B2, 30520 - 11904: 0xB2B6, 30521 - 11904: 0xD6A8, 30522 - 11904: 0xB2B7, 30523 - 11904: 0xD6B1, 30524 - 11904: 0xB2B4, 30525 - 11904: 0xD6AF, 30526 - 11904: 0xB2B3, 30528 - 11904: 0xFED3, 30531 - 11904: 0x98E5, 30532 - 11904: 0xDABC, 30533 - 11904: 0xDABE, 30534 - 11904: 0xDABA, 30535 - 11904: 0xDABB, 30538 - 11904: 0xDABF, 30539 - 11904: 0xDAC1, 30540 - 11904: 0xDAC2, 30541 - 11904: 0xDABD, 30542 - 11904: 0xDAC0, 30543 - 11904: 0xB574, 30546 - 11904: 0xDEDB, 30548 - 11904: 0xDEE0, 30549 - 11904: 0xDED8, 30550 - 11904: 0xDEDC, 30552 - 11904: 0xFED6, 30553 - 11904: 0xDEE1, 30554 - 11904: 0xDEDD, 30555 - 11904: 0xB7FA, 30556 - 11904: 0xB843, 30558 - 11904: 0xB7FD, 30559 - 11904: 0xDED9, 30560 - 11904: 0xDEDA, 30561 - 11904: 0xBACE, 30562 - 11904: 0xB846, 30563 - 11904: 0xB7FE, 30565 - 11904: 0xB844, 30566 - 11904: 0xB7FC, 30567 - 11904: 0xDEDF, 30568 - 11904: 0xB845, 30569 - 11904: 0xDEDE, 30570 - 11904: 0xB841, 30571 - 11904: 0xB7FB, 30572 - 11904: 0xB842, 30573 - 11904: 0xDEE2, 30574 - 11904: 0xE2E6, 30575 - 11904: 0xE2E8, 30578 - 11904: 0x91E4, 30583 - 11904: 0x8FC7, 30584 - 11904: 0x94AE, 30585 - 11904: 0xB840, 30586 - 11904: 0x8A4F, 30587 - 11904: 0x94B2, 30588 - 11904: 0xE2E3, 30589 - 11904: 0xBACC, 30590 - 11904: 0xE2E9, 30591 - 11904: 0xBACD, 30592 - 11904: 0xE2E7, 30593 - 11904: 0xE2E2, 30594 - 11904: 0xE2E5, 30595 - 11904: 0xE2EA, 30596 - 11904: 0xBACB, 30597 - 11904: 0xE2E4, 30599 - 11904: 0xBD4E, 30600 - 11904: 0xE6BF, 30601 - 11904: 0xE6BE, 30603 - 11904: 0xBD51, 30604 - 11904: 0xBD4F, 30605 - 11904: 0xE6BC, 30606 - 11904: 0xBD4D, 30607 - 11904: 0xE6BD, 30609 - 11904: 0xBD50, 30611 - 11904: 0x8FD4, 30613 - 11904: 0xEA7D, 30615 - 11904: 0xEAA1, 30616 - 11904: 0x98EA, 30617 - 11904: 0xEA7E, 30618 - 11904: 0xEA76, 30619 - 11904: 0xEA7A, 30620 - 11904: 0xEA79, 30621 - 11904: 0xEA77, 30622 - 11904: 0xBF66, 30623 - 11904: 0xBF67, 30624 - 11904: 0xBF65, 30625 - 11904: 0xEA78, 30626 - 11904: 0xEA7B, 30627 - 11904: 0xEA7C, 30629 - 11904: 0xBF68, 30631 - 11904: 0xC140, 30632 - 11904: 0xEDA3, 30634 - 11904: 0xC0FC, 30635 - 11904: 0xED7B, 30636 - 11904: 0xC0FE, 30637 - 11904: 0xC141, 30639 - 11904: 0xFED8, 30640 - 11904: 0xC0FD, 30641 - 11904: 0xEDA2, 30642 - 11904: 0xED7C, 30643 - 11904: 0xC0FB, 30644 - 11904: 0xEDA1, 30645 - 11904: 0xED7A, 30646 - 11904: 0xED7E, 30647 - 11904: 0xED7D, 30649 - 11904: 0x9DE0, 30650 - 11904: 0xF055, 30651 - 11904: 0xC2A4, 30652 - 11904: 0xC2A5, 30653 - 11904: 0xC2A2, 30654 - 11904: 0x98EE, 30655 - 11904: 0xC2A3, 30658 - 11904: 0xF054, 30659 - 11904: 0x95C4, 30660 - 11904: 0xF27B, 30661 - 11904: 0xFCE8, 30663 - 11904: 0xC3A9, 30665 - 11904: 0xF279, 30666 - 11904: 0xF27A, 30667 - 11904: 0x98EF, 30668 - 11904: 0xF474, 30669 - 11904: 0xF477, 30670 - 11904: 0xF475, 30671 - 11904: 0xF476, 30672 - 11904: 0xF5E0, 30675 - 11904: 0xC4EF, 30676 - 11904: 0xF7EB, 30677 - 11904: 0xF8B4, 30679 - 11904: 0xC5F7, 30680 - 11904: 0xF8F8, 30681 - 11904: 0xF8F9, 30682 - 11904: 0xC666, 30683 - 11904: 0xA5D9, 30684 - 11904: 0xACE1, 30685 - 11904: 0x8C6E, 30686 - 11904: 0xDAC3, 30688 - 11904: 0xDEE3, 30690 - 11904: 0xA5DA, 30691 - 11904: 0xA86F, 30693 - 11904: 0xAABE, 30694 - 11904: 0xFAD8, 30695 - 11904: 0xCFE8, 30696 - 11904: 0xCFE9, 30697 - 11904: 0xAF78, 30700 - 11904: 0xDAC4, 30701 - 11904: 0xB575, 30702 - 11904: 0xB847, 30703 - 11904: 0xC142, 30704 - 11904: 0xEDA4, 30705 - 11904: 0xF27C, 30706 - 11904: 0xF478, 30707 - 11904: 0xA5DB, 30708 - 11904: 0xFEDC, 30711 - 11904: 0xCDA1, 30712 - 11904: 0xCD7A, 30713 - 11904: 0xCD7C, 30714 - 11904: 0xCD7E, 30715 - 11904: 0xCD7D, 30716 - 11904: 0xCD7B, 30717 - 11904: 0xAABF, 30718 - 11904: 0xA0AE, 30722 - 11904: 0xACE2, 30723 - 11904: 0xCFF2, 30725 - 11904: 0xCFED, 30726 - 11904: 0xCFEA, 30728 - 11904: 0x9D4C, 30729 - 11904: 0xFEDD, 30732 - 11904: 0xACE4, 30733 - 11904: 0xACE5, 30734 - 11904: 0xCFF0, 30735 - 11904: 0xCFEF, 30736 - 11904: 0xCFEE, 30737 - 11904: 0xCFEB, 30738 - 11904: 0xCFEC, 30739 - 11904: 0xCFF3, 30740 - 11904: 0xACE3, 30744 - 11904: 0x98F1, 30748 - 11904: 0x98F3, 30749 - 11904: 0xAF7C, 30750 - 11904: 0x94C1, 30751 - 11904: 0xAFA4, 30752 - 11904: 0xAFA3, 30753 - 11904: 0xD2E1, 30754 - 11904: 0xD2DB, 30755 - 11904: 0xD2D9, 30757 - 11904: 0xAFA1, 30758 - 11904: 0xD6B9, 30759 - 11904: 0xAF7A, 30760 - 11904: 0xD2DE, 30761 - 11904: 0xD2E2, 30762 - 11904: 0xD2E4, 30763 - 11904: 0xD2E0, 30764 - 11904: 0xD2DA, 30765 - 11904: 0xAFA2, 30766 - 11904: 0xD2DF, 30767 - 11904: 0xD2DD, 30768 - 11904: 0xAF79, 30769 - 11904: 0xD2E5, 30770 - 11904: 0xAFA5, 30771 - 11904: 0xD2E3, 30772 - 11904: 0xAF7D, 30773 - 11904: 0xD2DC, 30775 - 11904: 0xAF7E, 30776 - 11904: 0xAF7B, 30777 - 11904: 0x98F5, 30780 - 11904: 0xFA4F, 30781 - 11904: 0x96E2, 30786 - 11904: 0x9450, 30787 - 11904: 0xB2B9, 30788 - 11904: 0x96A2, 30789 - 11904: 0xD6BA, 30791 - 11904: 0x98F6, 30792 - 11904: 0xD6B3, 30793 - 11904: 0xD6B5, 30794 - 11904: 0xD6B7, 30795 - 11904: 0x96E5, 30796 - 11904: 0xD6B8, 30797 - 11904: 0xD6B6, 30798 - 11904: 0xB2BA, 30800 - 11904: 0xD6BB, 30801 - 11904: 0x98F7, 30802 - 11904: 0xD6B4, 30803 - 11904: 0xA046, 30804 - 11904: 0x96E3, 30812 - 11904: 0xDAC8, 30813 - 11904: 0xB576, 30814 - 11904: 0xDAD0, 30816 - 11904: 0xDAC5, 30818 - 11904: 0xDAD1, 30820 - 11904: 0xDAC6, 30821 - 11904: 0xDAC7, 30822 - 11904: 0x98F8, 30824 - 11904: 0xDACF, 30825 - 11904: 0xDACE, 30826 - 11904: 0xDACB, 30827 - 11904: 0xB2B8, 30828 - 11904: 0xB577, 30829 - 11904: 0xDAC9, 30830 - 11904: 0xDACC, 30831 - 11904: 0xB578, 30832 - 11904: 0xDACD, 30833 - 11904: 0xDACA, 30841 - 11904: 0xDEEE, 30842 - 11904: 0x9EE4, 30843 - 11904: 0xDEF2, 30844 - 11904: 0xB84E, 30846 - 11904: 0xE2F0, 30847 - 11904: 0xB851, 30848 - 11904: 0xDEF0, 30849 - 11904: 0xF9D6, 30851 - 11904: 0xDEED, 30852 - 11904: 0xDEE8, 30853 - 11904: 0xDEEA, 30854 - 11904: 0xDEEB, 30855 - 11904: 0xDEE4, 30856 - 11904: 0x94C3, 30857 - 11904: 0xB84D, 30860 - 11904: 0xB84C, 30861 - 11904: 0x94C2, 30862 - 11904: 0xB848, 30863 - 11904: 0xDEE7, 30865 - 11904: 0xB84F, 30867 - 11904: 0xB850, 30868 - 11904: 0xDEE6, 30869 - 11904: 0xDEE9, 30870 - 11904: 0xDEF1, 30871 - 11904: 0xB84A, 30872 - 11904: 0xB84B, 30873 - 11904: 0xDEEF, 30874 - 11904: 0xDEE5, 30878 - 11904: 0xE2F2, 30879 - 11904: 0xBAD0, 30880 - 11904: 0xE2F4, 30881 - 11904: 0xDEEC, 30882 - 11904: 0xE2F6, 30883 - 11904: 0xBAD4, 30884 - 11904: 0xE2F7, 30885 - 11904: 0xE2F3, 30887 - 11904: 0xBAD1, 30888 - 11904: 0xE2EF, 30889 - 11904: 0xBAD3, 30890 - 11904: 0xE2EC, 30891 - 11904: 0xE2F1, 30892 - 11904: 0xE2F5, 30893 - 11904: 0xE2EE, 30895 - 11904: 0xFEE1, 30896 - 11904: 0xB849, 30897 - 11904: 0xFEE9, 30898 - 11904: 0xE2EB, 30899 - 11904: 0xBAD2, 30900 - 11904: 0xE2ED, 30902 - 11904: 0x96E4, 30904 - 11904: 0x89AC, 30905 - 11904: 0x96DB, 30906 - 11904: 0xBD54, 30907 - 11904: 0xE6C1, 30908 - 11904: 0xBD58, 30910 - 11904: 0xBD56, 30913 - 11904: 0xBACF, 30915 - 11904: 0xE6C8, 30916 - 11904: 0xE6C9, 30917 - 11904: 0xBD53, 30919 - 11904: 0xFEE2, 30920 - 11904: 0xE6C7, 30921 - 11904: 0xE6CA, 30922 - 11904: 0xBD55, 30923 - 11904: 0xBD52, 30924 - 11904: 0xE6C3, 30925 - 11904: 0xE6C0, 30926 - 11904: 0xE6C5, 30927 - 11904: 0xE6C2, 30928 - 11904: 0xBD59, 30929 - 11904: 0xE6C4, 30930 - 11904: 0x94C4, 30931 - 11904: 0xFEE3, 30932 - 11904: 0xE6C6, 30933 - 11904: 0xBD57, 30935 - 11904: 0xFEE7, 30936 - 11904: 0x9FFB, 30938 - 11904: 0xBF6A, 30939 - 11904: 0xEAA8, 30941 - 11904: 0xEAA2, 30942 - 11904: 0xEAA6, 30943 - 11904: 0xEAAC, 30944 - 11904: 0xEAAD, 30945 - 11904: 0xEAA9, 30946 - 11904: 0xEAAA, 30947 - 11904: 0xEAA7, 30948 - 11904: 0x8C59, 30949 - 11904: 0xEAA4, 30951 - 11904: 0xBF6C, 30952 - 11904: 0xBF69, 30953 - 11904: 0xEAA3, 30954 - 11904: 0xEAA5, 30956 - 11904: 0xBF6B, 30957 - 11904: 0xEAAB, 30958 - 11904: 0x93C9, 30959 - 11904: 0xC146, 30960 - 11904: 0x94E8, 30961 - 11904: 0xFB56, 30962 - 11904: 0xEDAA, 30963 - 11904: 0xEDA5, 30964 - 11904: 0xC145, 30965 - 11904: 0x90C5, 30967 - 11904: 0xC143, 30969 - 11904: 0xEDAC, 30970 - 11904: 0xC144, 30971 - 11904: 0xEDA8, 30972 - 11904: 0xEDA9, 30973 - 11904: 0xEDA6, 30974 - 11904: 0xEDAD, 30975 - 11904: 0xF056, 30977 - 11904: 0xC147, 30978 - 11904: 0xEDA7, 30980 - 11904: 0xEDAE, 30981 - 11904: 0xEDAB, 30982 - 11904: 0xA0A8, 30985 - 11904: 0xF05A, 30988 - 11904: 0xF057, 30990 - 11904: 0xC2A6, 30992 - 11904: 0xF05B, 30993 - 11904: 0xF05D, 30994 - 11904: 0xF05C, 30995 - 11904: 0xF058, 30996 - 11904: 0xF059, 30999 - 11904: 0xF2A3, 31001 - 11904: 0xC3AA, 31003 - 11904: 0xF27E, 31004 - 11904: 0xF2A2, 31005 - 11904: 0xF27D, 31006 - 11904: 0xF2A4, 31009 - 11904: 0xF2A1, 31011 - 11904: 0xF47A, 31012 - 11904: 0xF47D, 31013 - 11904: 0xF479, 31014 - 11904: 0xC471, 31015 - 11904: 0xF47B, 31016 - 11904: 0xF47C, 31017 - 11904: 0xF47E, 31018 - 11904: 0xC472, 31019 - 11904: 0xC474, 31020 - 11904: 0xC473, 31021 - 11904: 0xF5E1, 31022 - 11904: 0xFEE5, 31023 - 11904: 0xF5E3, 31025 - 11904: 0xF5E2, 31026 - 11904: 0x98FD, 31027 - 11904: 0x98FB, 31028 - 11904: 0xFEE8, 31029 - 11904: 0xF6F6, 31030 - 11904: 0x8EBF, 31032 - 11904: 0xF8B5, 31033 - 11904: 0xF8FA, 31034 - 11904: 0xA5DC, 31035 - 11904: 0x8BD8, 31036 - 11904: 0xFEF7, 31037 - 11904: 0xCB72, 31038 - 11904: 0xAAC0, 31039 - 11904: 0xCDA3, 31040 - 11904: 0xAAC1, 31041 - 11904: 0xAAC2, 31042 - 11904: 0xCDA2, 31044 - 11904: 0xCFF8, 31045 - 11904: 0xCFF7, 31046 - 11904: 0xACE6, 31047 - 11904: 0xACE9, 31048 - 11904: 0xACE8, 31049 - 11904: 0xACE7, 31050 - 11904: 0xCFF4, 31051 - 11904: 0xCFF6, 31052 - 11904: 0xCFF5, 31055 - 11904: 0xD2E8, 31056 - 11904: 0xAFA7, 31057 - 11904: 0xD2EC, 31058 - 11904: 0xD2EB, 31059 - 11904: 0xD2EA, 31060 - 11904: 0xD2E6, 31061 - 11904: 0xAFA6, 31062 - 11904: 0xAFAA, 31063 - 11904: 0xAFAD, 31064 - 11904: 0x8F68, 31065 - 11904: 0x94C6, 31066 - 11904: 0xAFAE, 31067 - 11904: 0xD2E7, 31068 - 11904: 0xD2E9, 31069 - 11904: 0xAFAC, 31070 - 11904: 0xAFAB, 31071 - 11904: 0xAFA9, 31072 - 11904: 0xAFA8, 31073 - 11904: 0xD6C2, 31074 - 11904: 0x9DEA, 31075 - 11904: 0xD6C0, 31076 - 11904: 0xD6BC, 31077 - 11904: 0xB2BB, 31079 - 11904: 0xD6BD, 31080 - 11904: 0xB2BC, 31081 - 11904: 0xD6BE, 31082 - 11904: 0xD6BF, 31083 - 11904: 0xD6C1, 31085 - 11904: 0xB2BD, 31088 - 11904: 0xDAD5, 31089 - 11904: 0xFC69, 31090 - 11904: 0xDAD4, 31091 - 11904: 0xDAD3, 31092 - 11904: 0xDAD2, 31097 - 11904: 0xDEF6, 31098 - 11904: 0xB852, 31100 - 11904: 0xDEF3, 31101 - 11904: 0xDEF5, 31102 - 11904: 0x9CDA, 31103 - 11904: 0xB853, 31104 - 11904: 0xFEF3, 31105 - 11904: 0xB854, 31106 - 11904: 0xDEF4, 31107 - 11904: 0x9C72, 31110 - 11904: 0xFEF0, 31111 - 11904: 0x89C9, 31112 - 11904: 0xE341, 31114 - 11904: 0xE2F9, 31115 - 11904: 0xE2FA, 31117 - 11904: 0xBAD7, 31118 - 11904: 0xBAD5, 31119 - 11904: 0xBAD6, 31120 - 11904: 0xE343, 31121 - 11904: 0x9941, 31122 - 11904: 0xE342, 31123 - 11904: 0xE2FE, 31124 - 11904: 0xE2FD, 31125 - 11904: 0xE2FC, 31126 - 11904: 0xE2FB, 31127 - 11904: 0xE340, 31128 - 11904: 0xE2F8, 31129 - 11904: 0x9942, 31130 - 11904: 0xE6CB, 31131 - 11904: 0xE6D0, 31132 - 11904: 0xE6CE, 31133 - 11904: 0xFEF5, 31135 - 11904: 0x91D7, 31136 - 11904: 0xE6CD, 31137 - 11904: 0xE6CC, 31138 - 11904: 0xE6CF, 31140 - 11904: 0xEAAE, 31141 - 11904: 0x94CC, 31142 - 11904: 0xBF6D, 31143 - 11904: 0xC148, 31144 - 11904: 0xEDB0, 31145 - 11904: 0xFEF8, 31146 - 11904: 0xC149, 31147 - 11904: 0xEDAF, 31148 - 11904: 0xF05F, 31149 - 11904: 0xF05E, 31150 - 11904: 0xC2A7, 31152 - 11904: 0xF2A5, 31153 - 11904: 0xC3AB, 31154 - 11904: 0xF4A1, 31155 - 11904: 0xC5A1, 31156 - 11904: 0xF6F7, 31158 - 11904: 0xF8B7, 31159 - 11904: 0xF8B6, 31160 - 11904: 0xC9A8, 31161 - 11904: 0xACEA, 31162 - 11904: 0xACEB, 31163 - 11904: 0xD6C3, 31165 - 11904: 0xB856, 31166 - 11904: 0xA5DD, 31167 - 11904: 0xA872, 31168 - 11904: 0xA871, 31169 - 11904: 0xA870, 31172 - 11904: 0x97A8, 31173 - 11904: 0xCDA4, 31174 - 11904: 0xFEFC, 31176 - 11904: 0xAAC4, 31177 - 11904: 0xAAC3, 31178 - 11904: 0x8CDE, 31179 - 11904: 0xACEE, 31180 - 11904: 0xFDBF, 31181 - 11904: 0xCFFA, 31182 - 11904: 0xCFFD, 31183 - 11904: 0xCFFB, 31184 - 11904: 0x87B3, 31185 - 11904: 0xACEC, 31186 - 11904: 0xACED, 31188 - 11904: 0xFEFE, 31189 - 11904: 0xCFF9, 31190 - 11904: 0xCFFC, 31192 - 11904: 0xAFB5, 31196 - 11904: 0xD2F3, 31197 - 11904: 0xD2F5, 31198 - 11904: 0xD2F4, 31199 - 11904: 0xAFB2, 31200 - 11904: 0xD2EF, 31202 - 11904: 0x96D1, 31203 - 11904: 0xAFB0, 31204 - 11904: 0xAFAF, 31206 - 11904: 0xAFB3, 31207 - 11904: 0xAFB1, 31209 - 11904: 0xAFB4, 31210 - 11904: 0xD2F2, 31211 - 11904: 0xD2ED, 31212 - 11904: 0xD2EE, 31213 - 11904: 0xD2F1, 31214 - 11904: 0xD2F0, 31217 - 11904: 0x94D5, 31220 - 11904: 0x94D0, 31222 - 11904: 0xD6C6, 31223 - 11904: 0xD6C7, 31224 - 11904: 0xD6C5, 31226 - 11904: 0xD6C4, 31227 - 11904: 0xB2BE, 31232 - 11904: 0xB57D, 31234 - 11904: 0xDAD6, 31235 - 11904: 0xDAD8, 31236 - 11904: 0xDADA, 31237 - 11904: 0xB57C, 31238 - 11904: 0x9944, 31240 - 11904: 0xB57A, 31242 - 11904: 0xDAD7, 31243 - 11904: 0xB57B, 31244 - 11904: 0xDAD9, 31245 - 11904: 0xB579, 31248 - 11904: 0xDF41, 31249 - 11904: 0xDEF7, 31250 - 11904: 0xDEFA, 31251 - 11904: 0xDEFE, 31252 - 11904: 0xB85A, 31253 - 11904: 0xDEFC, 31255 - 11904: 0xDEFB, 31256 - 11904: 0xDEF8, 31257 - 11904: 0xDEF9, 31258 - 11904: 0xB858, 31259 - 11904: 0xDF40, 31260 - 11904: 0xB857, 31262 - 11904: 0xB85C, 31263 - 11904: 0xB85B, 31264 - 11904: 0xB859, 31266 - 11904: 0xDEFD, 31270 - 11904: 0xE349, 31272 - 11904: 0xE348, 31274 - 11904: 0x8C63, 31275 - 11904: 0xE344, 31276 - 11904: 0x87BB, 31277 - 11904: 0xA0B3, 31278 - 11904: 0xBAD8, 31279 - 11904: 0xE347, 31280 - 11904: 0xE346, 31281 - 11904: 0xBAD9, 31282 - 11904: 0x87B4, 31287 - 11904: 0xBD5E, 31289 - 11904: 0xE6D2, 31290 - 11904: 0x94CF, 31291 - 11904: 0xBD5F, 31292 - 11904: 0xBD5B, 31293 - 11904: 0xBD5D, 31294 - 11904: 0x9FFA, 31295 - 11904: 0xBD5A, 31296 - 11904: 0xBD5C, 31299 - 11904: 0x91E5, 31300 - 11904: 0xEAAF, 31301 - 11904: 0x9C6A, 31302 - 11904: 0xBF70, 31303 - 11904: 0xEAB1, 31304 - 11904: 0xEAB0, 31305 - 11904: 0x8E49, 31306 - 11904: 0xE345, 31307 - 11904: 0xBF72, 31308 - 11904: 0xBF71, 31309 - 11904: 0xBF6E, 31310 - 11904: 0xBF6F, 31316 - 11904: 0xEDB5, 31318 - 11904: 0xEDB3, 31319 - 11904: 0xC14A, 31320 - 11904: 0xEDB4, 31322 - 11904: 0xEDB6, 31323 - 11904: 0xEDB2, 31324 - 11904: 0xEDB1, 31327 - 11904: 0xF060, 31328 - 11904: 0xC2AA, 31329 - 11904: 0xC2A8, 31330 - 11904: 0xC2A9, 31333 - 11904: 0x8E4C, 31335 - 11904: 0xF2A6, 31336 - 11904: 0xF2A7, 31337 - 11904: 0xC3AD, 31339 - 11904: 0xC3AC, 31340 - 11904: 0xF4A3, 31341 - 11904: 0xF4A4, 31342 - 11904: 0xF4A2, 31344 - 11904: 0xF6F8, 31345 - 11904: 0xF6F9, 31346 - 11904: 0x87C9, 31348 - 11904: 0xA5DE, 31349 - 11904: 0xCA48, 31350 - 11904: 0xA873, 31352 - 11904: 0xCDA5, 31353 - 11904: 0xAAC6, 31354 - 11904: 0xAAC5, 31355 - 11904: 0xCDA6, 31357 - 11904: 0x8E4D, 31358 - 11904: 0xD040, 31359 - 11904: 0xACEF, 31360 - 11904: 0xCFFE, 31361 - 11904: 0xACF0, 31363 - 11904: 0x9A73, 31364 - 11904: 0xAFB6, 31365 - 11904: 0xD2F8, 31366 - 11904: 0xD2F6, 31367 - 11904: 0xD2FC, 31368 - 11904: 0xAFB7, 31369 - 11904: 0xD2F7, 31370 - 11904: 0xD2FB, 31371 - 11904: 0xD2F9, 31372 - 11904: 0xD2FA, 31375 - 11904: 0xD6C8, 31376 - 11904: 0xD6CA, 31377 - 11904: 0x9947, 31378 - 11904: 0xB2BF, 31379 - 11904: 0x8CB1, 31380 - 11904: 0xD6C9, 31381 - 11904: 0xB2C0, 31382 - 11904: 0xB5A2, 31383 - 11904: 0xB5A1, 31384 - 11904: 0xB57E, 31385 - 11904: 0xDADB, 31390 - 11904: 0xDF44, 31391 - 11904: 0xB85D, 31392 - 11904: 0xB85E, 31394 - 11904: 0xDF43, 31395 - 11904: 0xDF42, 31400 - 11904: 0xE34A, 31401 - 11904: 0xBADB, 31402 - 11904: 0xBADA, 31403 - 11904: 0xE34B, 31404 - 11904: 0xE34C, 31406 - 11904: 0xBD61, 31407 - 11904: 0xBD60, 31408 - 11904: 0x8E50, 31409 - 11904: 0xEAB5, 31410 - 11904: 0xE6D3, 31411 - 11904: 0xE6D5, 31412 - 11904: 0xE6D4, 31413 - 11904: 0xEAB4, 31414 - 11904: 0xEAB2, 31415 - 11904: 0xEAB6, 31416 - 11904: 0xEAB3, 31418 - 11904: 0xBF73, 31419 - 11904: 0x8E4F, 31420 - 11904: 0x9949, 31422 - 11904: 0xEDB7, 31423 - 11904: 0xC14B, 31424 - 11904: 0xEDB8, 31425 - 11904: 0xEDB9, 31426 - 11904: 0x8E51, 31427 - 11904: 0x8E52, 31428 - 11904: 0xC2AB, 31429 - 11904: 0xC2AC, 31431 - 11904: 0xC475, 31432 - 11904: 0x9AB2, 31433 - 11904: 0x89A5, 31434 - 11904: 0xC5D1, 31435 - 11904: 0xA5DF, 31439 - 11904: 0x994C, 31441 - 11904: 0xD041, 31443 - 11904: 0x9FF8, 31448 - 11904: 0xD2FD, 31449 - 11904: 0xAFB8, 31450 - 11904: 0x8E56, 31451 - 11904: 0x994D, 31452 - 11904: 0x91CA, 31453 - 11904: 0x8E57, 31455 - 11904: 0xB3BA, 31456 - 11904: 0xB3B9, 31458 - 11904: 0x94E1, 31459 - 11904: 0xB5A4, 31460 - 11904: 0xDADD, 31461 - 11904: 0xB5A3, 31462 - 11904: 0xDADC, 31463 - 11904: 0x9047, 31465 - 11904: 0x8FD8, 31466 - 11904: 0x8E58, 31467 - 11904: 0xDF45, 31469 - 11904: 0xBADC, 31470 - 11904: 0xE34D, 31471 - 11904: 0xBADD, 31478 - 11904: 0xC476, 31479 - 11904: 0xF4A5, 31481 - 11904: 0xA6CB, 31482 - 11904: 0xAAC7, 31483 - 11904: 0xCDA7, 31484 - 11904: 0x87A3, 31485 - 11904: 0xACF2, 31486 - 11904: 0x94EB, 31487 - 11904: 0xACF1, 31488 - 11904: 0xD042, 31489 - 11904: 0xD043, 31492 - 11904: 0xD340, 31493 - 11904: 0xD342, 31494 - 11904: 0xAFB9, 31496 - 11904: 0xD344, 31497 - 11904: 0xD347, 31498 - 11904: 0xD345, 31499 - 11904: 0x8E5C, 31500 - 11904: 0x9553, 31502 - 11904: 0xD346, 31503 - 11904: 0xD343, 31504 - 11904: 0xD2FE, 31505 - 11904: 0xAFBA, 31506 - 11904: 0xD348, 31507 - 11904: 0xD341, 31508 - 11904: 0x9FE5, 31512 - 11904: 0xD6D3, 31513 - 11904: 0xB2C6, 31514 - 11904: 0xD6DC, 31515 - 11904: 0xB2C3, 31517 - 11904: 0xD6D5, 31518 - 11904: 0xB2C7, 31519 - 11904: 0x9F56, 31520 - 11904: 0xB2C1, 31522 - 11904: 0xD6D0, 31523 - 11904: 0xD6DD, 31524 - 11904: 0xD6D1, 31525 - 11904: 0xD6CE, 31526 - 11904: 0xB2C5, 31527 - 11904: 0x954F, 31528 - 11904: 0xB2C2, 31529 - 11904: 0x8E5E, 31530 - 11904: 0xD6D4, 31531 - 11904: 0xD6D7, 31532 - 11904: 0xB2C4, 31533 - 11904: 0xD6D8, 31534 - 11904: 0xB2C8, 31535 - 11904: 0xD6D9, 31536 - 11904: 0xD6CF, 31537 - 11904: 0xD6D6, 31538 - 11904: 0xD6DA, 31539 - 11904: 0xD6D2, 31540 - 11904: 0xD6CD, 31541 - 11904: 0xD6CB, 31544 - 11904: 0xD6DB, 31545 - 11904: 0x996A, 31547 - 11904: 0xDADF, 31552 - 11904: 0xDAE4, 31554 - 11904: 0x9C64, 31555 - 11904: 0x9CD9, 31556 - 11904: 0xDAE0, 31557 - 11904: 0xDAE6, 31558 - 11904: 0xB5A7, 31559 - 11904: 0xD6CC, 31560 - 11904: 0xDAE1, 31561 - 11904: 0xB5A5, 31562 - 11904: 0xDADE, 31563 - 11904: 0xB5AC, 31564 - 11904: 0xDAE2, 31565 - 11904: 0xB5AB, 31566 - 11904: 0xDAE3, 31567 - 11904: 0xB5AD, 31568 - 11904: 0xB5A8, 31569 - 11904: 0xB5AE, 31570 - 11904: 0xB5A9, 31572 - 11904: 0xB5AA, 31573 - 11904: 0x8E5D, 31574 - 11904: 0xB5A6, 31576 - 11904: 0xDAE5, 31584 - 11904: 0xB861, 31585 - 11904: 0xDF50, 31586 - 11904: 0x9950, 31587 - 11904: 0xDF53, 31588 - 11904: 0xDF47, 31589 - 11904: 0xDF4C, 31590 - 11904: 0xDF46, 31591 - 11904: 0xB863, 31593 - 11904: 0xDF4A, 31596 - 11904: 0x9951, 31597 - 11904: 0xDF48, 31598 - 11904: 0xB862, 31599 - 11904: 0x8E62, 31600 - 11904: 0xDF4F, 31601 - 11904: 0xDF4E, 31602 - 11904: 0xDF4B, 31603 - 11904: 0xDF4D, 31604 - 11904: 0xDF49, 31605 - 11904: 0xBAE1, 31606 - 11904: 0xDF52, 31607 - 11904: 0xB85F, 31608 - 11904: 0xDF51, 31611 - 11904: 0x9952, 31618 - 11904: 0xE35D, 31620 - 11904: 0xBAE8, 31621 - 11904: 0xE358, 31623 - 11904: 0xBAE7, 31624 - 11904: 0xE34E, 31626 - 11904: 0xE350, 31627 - 11904: 0xBAE0, 31628 - 11904: 0xE355, 31629 - 11904: 0xE354, 31630 - 11904: 0xE357, 31631 - 11904: 0xBAE5, 31632 - 11904: 0xE352, 31633 - 11904: 0xE351, 31634 - 11904: 0x8E68, 31636 - 11904: 0xBAE4, 31637 - 11904: 0xBADF, 31638 - 11904: 0xE353, 31639 - 11904: 0xBAE2, 31640 - 11904: 0xE359, 31641 - 11904: 0xE35B, 31643 - 11904: 0xE356, 31644 - 11904: 0xE34F, 31645 - 11904: 0xBAE3, 31648 - 11904: 0xBD69, 31649 - 11904: 0xBADE, 31650 - 11904: 0x8E61, 31651 - 11904: 0x9F59, 31652 - 11904: 0xE35C, 31660 - 11904: 0xE6D9, 31661 - 11904: 0xBD62, 31662 - 11904: 0x87D0, 31663 - 11904: 0xE6DB, 31665 - 11904: 0xBD63, 31666 - 11904: 0x8BB3, 31668 - 11904: 0xBD65, 31669 - 11904: 0xE6DE, 31671 - 11904: 0xE6D6, 31672 - 11904: 0xBAE6, 31673 - 11904: 0xE6DC, 31678 - 11904: 0xE6D8, 31680 - 11904: 0xB860, 31681 - 11904: 0xBD68, 31684 - 11904: 0xBD64, 31685 - 11904: 0x87B9, 31686 - 11904: 0xBD66, 31687 - 11904: 0xBD67, 31689 - 11904: 0xBF76, 31690 - 11904: 0xE6DD, 31691 - 11904: 0xE6D7, 31692 - 11904: 0xBD6A, 31694 - 11904: 0xE6DA, 31695 - 11904: 0x9F5D, 31696 - 11904: 0x8E66, 31700 - 11904: 0xEAC0, 31701 - 11904: 0xEABB, 31704 - 11904: 0xEAC5, 31705 - 11904: 0xBF74, 31706 - 11904: 0xEABD, 31707 - 11904: 0xBF78, 31708 - 11904: 0xEAC3, 31709 - 11904: 0xEABA, 31710 - 11904: 0xEAB7, 31711 - 11904: 0xEAC6, 31712 - 11904: 0xC151, 31713 - 11904: 0xBF79, 31714 - 11904: 0xEAC2, 31715 - 11904: 0xEAB8, 31716 - 11904: 0xBF77, 31717 - 11904: 0xEABC, 31718 - 11904: 0xBF7B, 31719 - 11904: 0xEAB9, 31720 - 11904: 0xEABE, 31721 - 11904: 0xBF7A, 31722 - 11904: 0xEAC1, 31723 - 11904: 0xEAC4, 31724 - 11904: 0x8CB2, 31728 - 11904: 0xEDCB, 31729 - 11904: 0xEDCC, 31730 - 11904: 0xEDBC, 31731 - 11904: 0xEDC3, 31732 - 11904: 0xEDC1, 31735 - 11904: 0xC14F, 31736 - 11904: 0xEDC8, 31737 - 11904: 0xEABF, 31738 - 11904: 0x8E6E, 31739 - 11904: 0xEDBF, 31740 - 11904: 0x9F64, 31741 - 11904: 0xEDC9, 31742 - 11904: 0xC14E, 31743 - 11904: 0xEDBE, 31744 - 11904: 0xEDBD, 31745 - 11904: 0xEDC7, 31746 - 11904: 0xEDC4, 31747 - 11904: 0xEDC6, 31749 - 11904: 0xEDBA, 31750 - 11904: 0xEDCA, 31751 - 11904: 0xC14C, 31753 - 11904: 0xEDC5, 31754 - 11904: 0xEDCE, 31755 - 11904: 0xEDC2, 31756 - 11904: 0xC150, 31757 - 11904: 0xC14D, 31758 - 11904: 0xEDC0, 31759 - 11904: 0xEDBB, 31760 - 11904: 0xEDCD, 31761 - 11904: 0xBF75, 31762 - 11904: 0x9953, 31765 - 11904: 0xFAB8, 31769 - 11904: 0xF063, 31771 - 11904: 0x9954, 31772 - 11904: 0xF061, 31773 - 11904: 0xF067, 31774 - 11904: 0xC2B0, 31775 - 11904: 0xF065, 31776 - 11904: 0xF064, 31777 - 11904: 0xC2B2, 31778 - 11904: 0xF06A, 31779 - 11904: 0xC2B1, 31781 - 11904: 0xF06B, 31782 - 11904: 0xF068, 31783 - 11904: 0xC2AE, 31784 - 11904: 0xF069, 31785 - 11904: 0xF062, 31786 - 11904: 0xC2AF, 31787 - 11904: 0xC2AD, 31788 - 11904: 0xF2AB, 31789 - 11904: 0xF066, 31792 - 11904: 0xF06C, 31795 - 11904: 0xF2A8, 31797 - 11904: 0x8E70, 31799 - 11904: 0xC3B2, 31800 - 11904: 0xC3B0, 31801 - 11904: 0xF2AA, 31803 - 11904: 0xF2AC, 31804 - 11904: 0xF2A9, 31805 - 11904: 0xC3B1, 31806 - 11904: 0xC3AE, 31807 - 11904: 0xC3AF, 31808 - 11904: 0xC3B3, 31810 - 11904: 0x9F61, 31811 - 11904: 0xC478, 31812 - 11904: 0x8E72, 31813 - 11904: 0xF4AA, 31815 - 11904: 0xF4A9, 31816 - 11904: 0xF4A7, 31817 - 11904: 0xF4A6, 31818 - 11904: 0xF4A8, 31820 - 11904: 0xC477, 31821 - 11904: 0xC479, 31824 - 11904: 0xC4F0, 31825 - 11904: 0xA06B, 31827 - 11904: 0xF5E5, 31828 - 11904: 0xF5E4, 31830 - 11904: 0x9F40, 31831 - 11904: 0xF6FA, 31833 - 11904: 0xF6FC, 31834 - 11904: 0xF6FE, 31835 - 11904: 0xF6FD, 31836 - 11904: 0xF6FB, 31837 - 11904: 0x94ED, 31839 - 11904: 0xC5A3, 31840 - 11904: 0xC5A2, 31843 - 11904: 0xC5D3, 31844 - 11904: 0xC5D2, 31845 - 11904: 0xC5D4, 31846 - 11904: 0xF7ED, 31847 - 11904: 0xF7EC, 31849 - 11904: 0xF8FB, 31850 - 11904: 0xF8B8, 31851 - 11904: 0xF8FC, 31852 - 11904: 0xC658, 31853 - 11904: 0x94EE, 31854 - 11904: 0xC659, 31855 - 11904: 0xF96D, 31856 - 11904: 0x9FBD, 31858 - 11904: 0xC67E, 31859 - 11904: 0xA6CC, 31860 - 11904: 0x8E7B, 31861 - 11904: 0xCDA8, 31864 - 11904: 0xD045, 31865 - 11904: 0xD046, 31866 - 11904: 0xD044, 31867 - 11904: 0x9957, 31868 - 11904: 0x94F7, 31869 - 11904: 0xACF3, 31870 - 11904: 0x9F5F, 31871 - 11904: 0xD047, 31872 - 11904: 0xD048, 31873 - 11904: 0xD049, 31875 - 11904: 0x8E73, 31876 - 11904: 0xD349, 31877 - 11904: 0xD34F, 31878 - 11904: 0x9F62, 31880 - 11904: 0xD34D, 31881 - 11904: 0xAFBB, 31882 - 11904: 0xD34B, 31884 - 11904: 0xD34C, 31885 - 11904: 0xD34E, 31886 - 11904: 0x94F6, 31889 - 11904: 0xD34A, 31890 - 11904: 0xB2C9, 31892 - 11904: 0xD6DE, 31893 - 11904: 0xB2CB, 31894 - 11904: 0xD6E0, 31895 - 11904: 0xB2CA, 31896 - 11904: 0xD6DF, 31900 - 11904: 0x9958, 31902 - 11904: 0xDAE8, 31903 - 11904: 0xB5AF, 31905 - 11904: 0xDAEA, 31906 - 11904: 0xDAE7, 31907 - 11904: 0xD6E1, 31909 - 11904: 0xB5B0, 31910 - 11904: 0x8E75, 31911 - 11904: 0xF9DB, 31912 - 11904: 0xDAE9, 31916 - 11904: 0x9072, 31918 - 11904: 0x94F8, 31919 - 11904: 0xDF56, 31921 - 11904: 0xB864, 31922 - 11904: 0xDF54, 31923 - 11904: 0xB865, 31924 - 11904: 0xDF55, 31925 - 11904: 0xB866, 31928 - 11904: 0x995A, 31929 - 11904: 0xBAE9, 31930 - 11904: 0xE361, 31931 - 11904: 0xE35E, 31932 - 11904: 0xE360, 31933 - 11904: 0xBAEA, 31934 - 11904: 0xBAEB, 31935 - 11904: 0xE35F, 31938 - 11904: 0xA0B0, 31939 - 11904: 0x8CB3, 31941 - 11904: 0xE6DF, 31943 - 11904: 0x8E79, 31944 - 11904: 0xE6E0, 31945 - 11904: 0x8E78, 31946 - 11904: 0xBD6B, 31947 - 11904: 0xE6E2, 31948 - 11904: 0xE6E1, 31949 - 11904: 0x94F3, 31950 - 11904: 0xA261, 31952 - 11904: 0xEACA, 31953 - 11904: 0xEACB, 31954 - 11904: 0xEAC7, 31955 - 11904: 0x98AF, 31956 - 11904: 0xEAC8, 31957 - 11904: 0xBF7C, 31958 - 11904: 0xBF7D, 31959 - 11904: 0xEAC9, 31961 - 11904: 0xC157, 31962 - 11904: 0xA0B2, 31964 - 11904: 0xC153, 31965 - 11904: 0xC158, 31966 - 11904: 0xC154, 31967 - 11904: 0xC156, 31968 - 11904: 0xC152, 31970 - 11904: 0xC155, 31974 - 11904: 0x8E7A, 31975 - 11904: 0xC2B3, 31976 - 11904: 0xEDCF, 31978 - 11904: 0xF2AE, 31980 - 11904: 0xF2AD, 31981 - 11904: 0x995C, 31982 - 11904: 0xF4AB, 31983 - 11904: 0xC47A, 31984 - 11904: 0xC47B, 31985 - 11904: 0xF741, 31986 - 11904: 0xF5E6, 31987 - 11904: 0x8E7C, 31988 - 11904: 0xF740, 31989 - 11904: 0x8E7D, 31990 - 11904: 0xF8FD, 31991 - 11904: 0xF9A4, 31992 - 11904: 0xA6CD, 31993 - 11904: 0x8BD9, 31995 - 11904: 0xA874, 31996 - 11904: 0x89A2, 31997 - 11904: 0xCDA9, 31998 - 11904: 0xAAC8, 32000 - 11904: 0xACF6, 32001 - 11904: 0xD04C, 32002 - 11904: 0xACF4, 32003 - 11904: 0xD04A, 32004 - 11904: 0xACF9, 32005 - 11904: 0xACF5, 32006 - 11904: 0xACFA, 32007 - 11904: 0xACF8, 32008 - 11904: 0xD04B, 32009 - 11904: 0xACF7, 32010 - 11904: 0xAFBF, 32011 - 11904: 0xAFBE, 32012 - 11904: 0xD35A, 32013 - 11904: 0xAFC7, 32014 - 11904: 0xD353, 32015 - 11904: 0xD359, 32016 - 11904: 0xAFC3, 32017 - 11904: 0xD352, 32018 - 11904: 0xD358, 32019 - 11904: 0xD356, 32020 - 11904: 0xAFC2, 32021 - 11904: 0xAFC4, 32022 - 11904: 0xD355, 32023 - 11904: 0xAFBD, 32024 - 11904: 0xD354, 32025 - 11904: 0xAFC8, 32026 - 11904: 0xAFC5, 32027 - 11904: 0xAFC9, 32028 - 11904: 0xAFC6, 32029 - 11904: 0xD351, 32030 - 11904: 0xD350, 32031 - 11904: 0xD357, 32032 - 11904: 0xAFC0, 32033 - 11904: 0xAFBC, 32034 - 11904: 0xAFC1, 32037 - 11904: 0x9ED7, 32040 - 11904: 0xD6F0, 32041 - 11904: 0xD6E9, 32043 - 11904: 0xB5B5, 32044 - 11904: 0xD6E8, 32046 - 11904: 0xB2CF, 32047 - 11904: 0xB2D6, 32048 - 11904: 0xB2D3, 32049 - 11904: 0xB2D9, 32050 - 11904: 0xB2D8, 32051 - 11904: 0xB2D4, 32053 - 11904: 0xD6E2, 32054 - 11904: 0xD6E5, 32056 - 11904: 0xD6E4, 32057 - 11904: 0xB2D0, 32058 - 11904: 0xD6E6, 32059 - 11904: 0xD6EF, 32060 - 11904: 0xB2D1, 32061 - 11904: 0xD6E3, 32062 - 11904: 0xD6EC, 32063 - 11904: 0xD6ED, 32064 - 11904: 0xB2D2, 32065 - 11904: 0xD6EA, 32066 - 11904: 0xB2D7, 32067 - 11904: 0xB2CD, 32068 - 11904: 0xB2D5, 32069 - 11904: 0xD6E7, 32070 - 11904: 0xB2CC, 32071 - 11904: 0xD6EB, 32074 - 11904: 0xD6EE, 32077 - 11904: 0xA0B6, 32078 - 11904: 0xDAFB, 32079 - 11904: 0xDAF2, 32080 - 11904: 0xB5B2, 32081 - 11904: 0xDAF9, 32082 - 11904: 0xDAF6, 32083 - 11904: 0xDAEE, 32084 - 11904: 0xDAF7, 32085 - 11904: 0xB5B4, 32086 - 11904: 0xDAEF, 32088 - 11904: 0xDAEB, 32090 - 11904: 0x9E42, 32091 - 11904: 0xB86C, 32092 - 11904: 0xDAF4, 32093 - 11904: 0x8EA4, 32094 - 11904: 0xB5B1, 32095 - 11904: 0xDAFA, 32097 - 11904: 0xB5B8, 32098 - 11904: 0xB5BA, 32099 - 11904: 0xDAED, 32102 - 11904: 0xB5B9, 32103 - 11904: 0xDAF0, 32104 - 11904: 0xB5B3, 32105 - 11904: 0xDAF8, 32106 - 11904: 0xDAF1, 32107 - 11904: 0xDAF5, 32109 - 11904: 0xDAF3, 32110 - 11904: 0xB5B6, 32111 - 11904: 0xDAEC, 32112 - 11904: 0xB5BB, 32113 - 11904: 0xB2CE, 32114 - 11904: 0xB5B7, 32115 - 11904: 0xB5BC, 32121 - 11904: 0xB868, 32122 - 11904: 0xDF5D, 32123 - 11904: 0xDF5F, 32124 - 11904: 0xDF61, 32125 - 11904: 0xDF65, 32127 - 11904: 0xDF5B, 32128 - 11904: 0xDF59, 32129 - 11904: 0xB86A, 32131 - 11904: 0xDF60, 32132 - 11904: 0xDF64, 32133 - 11904: 0xDF5C, 32134 - 11904: 0xDF58, 32136 - 11904: 0xDF57, 32137 - 11904: 0x8EA7, 32139 - 11904: 0x8C76, 32140 - 11904: 0xDF62, 32141 - 11904: 0xDF5A, 32142 - 11904: 0xDF5E, 32143 - 11904: 0xB86B, 32145 - 11904: 0xB869, 32146 - 11904: 0xDF66, 32147 - 11904: 0xB867, 32148 - 11904: 0xDF63, 32149 - 11904: 0x8767, 32150 - 11904: 0xE372, 32151 - 11904: 0x9542, 32156 - 11904: 0xBAEE, 32157 - 11904: 0xE36A, 32158 - 11904: 0xBD78, 32159 - 11904: 0xE374, 32160 - 11904: 0xBAF1, 32161 - 11904: 0xE378, 32162 - 11904: 0xBAF7, 32163 - 11904: 0xE365, 32164 - 11904: 0x987D, 32166 - 11904: 0xE375, 32167 - 11904: 0xE362, 32168 - 11904: 0x9755, 32169 - 11904: 0xE377, 32170 - 11904: 0xE366, 32171 - 11904: 0x8EA8, 32172 - 11904: 0xBAFE, 32173 - 11904: 0xBAFB, 32174 - 11904: 0xE376, 32175 - 11904: 0xE370, 32176 - 11904: 0xBAED, 32177 - 11904: 0xBAF5, 32178 - 11904: 0xBAF4, 32179 - 11904: 0x8EAA, 32180 - 11904: 0xBAF3, 32181 - 11904: 0xBAF9, 32183 - 11904: 0xE363, 32184 - 11904: 0xBAFA, 32185 - 11904: 0xE371, 32186 - 11904: 0xBAF6, 32187 - 11904: 0xBAEC, 32188 - 11904: 0xE373, 32189 - 11904: 0xBAEF, 32190 - 11904: 0xBAF0, 32191 - 11904: 0xBAF8, 32192 - 11904: 0xE368, 32193 - 11904: 0xE367, 32194 - 11904: 0xE364, 32196 - 11904: 0xE36C, 32197 - 11904: 0xE369, 32198 - 11904: 0xE36D, 32199 - 11904: 0xBAFD, 32201 - 11904: 0xE379, 32202 - 11904: 0xBAF2, 32203 - 11904: 0xE36E, 32204 - 11904: 0xE36F, 32205 - 11904: 0x89A3, 32206 - 11904: 0xE36B, 32207 - 11904: 0x9960, 32208 - 11904: 0x9962, 32210 - 11904: 0xBAFC, 32211 - 11904: 0x94FC, 32212 - 11904: 0x9961, 32215 - 11904: 0xE6E7, 32216 - 11904: 0xBD70, 32217 - 11904: 0xBD79, 32218 - 11904: 0xBD75, 32219 - 11904: 0xE6E4, 32220 - 11904: 0x94FA, 32221 - 11904: 0xBD72, 32222 - 11904: 0xBD76, 32223 - 11904: 0xE6F0, 32224 - 11904: 0xBD6C, 32225 - 11904: 0xE6E8, 32227 - 11904: 0xBD74, 32228 - 11904: 0x8EAE, 32229 - 11904: 0x8EB2, 32230 - 11904: 0xE6EB, 32231 - 11904: 0xE6E6, 32232 - 11904: 0xBD73, 32233 - 11904: 0xBD77, 32234 - 11904: 0xE6E5, 32236 - 11904: 0xBD71, 32238 - 11904: 0xE6EF, 32239 - 11904: 0xBD6E, 32240 - 11904: 0xE6EE, 32241 - 11904: 0xE6ED, 32242 - 11904: 0xBD7A, 32243 - 11904: 0xE572, 32244 - 11904: 0xBD6D, 32245 - 11904: 0x8EB0, 32246 - 11904: 0xE6EC, 32247 - 11904: 0xE6E3, 32249 - 11904: 0xBD7B, 32250 - 11904: 0xE6EA, 32251 - 11904: 0xBD6F, 32253 - 11904: 0x9963, 32254 - 11904: 0x97AA, 32259 - 11904: 0xE6E9, 32263 - 11904: 0x94FB, 32264 - 11904: 0xBFA2, 32265 - 11904: 0xBFA7, 32266 - 11904: 0xBF7E, 32267 - 11904: 0xEAD8, 32268 - 11904: 0xEACF, 32269 - 11904: 0xEADB, 32270 - 11904: 0xEAD3, 32271 - 11904: 0xEAD9, 32272 - 11904: 0xBFA8, 32273 - 11904: 0xBFA1, 32274 - 11904: 0xEACC, 32275 - 11904: 0xEAD2, 32276 - 11904: 0xEADC, 32277 - 11904: 0xEAD5, 32278 - 11904: 0xEADA, 32279 - 11904: 0xEACE, 32282 - 11904: 0xEAD6, 32283 - 11904: 0xBFA3, 32284 - 11904: 0xEAD4, 32285 - 11904: 0xBFA6, 32286 - 11904: 0xBFA5, 32287 - 11904: 0xEAD0, 32288 - 11904: 0xEAD1, 32289 - 11904: 0xEACD, 32290 - 11904: 0xEAD7, 32291 - 11904: 0xBFA4, 32292 - 11904: 0xEADE, 32293 - 11904: 0xEADD, 32295 - 11904: 0x8EBB, 32297 - 11904: 0xEDDA, 32298 - 11904: 0xEDD6, 32299 - 11904: 0xC15F, 32301 - 11904: 0xEDD0, 32302 - 11904: 0xC159, 32303 - 11904: 0xC169, 32304 - 11904: 0xEDDC, 32305 - 11904: 0xC161, 32306 - 11904: 0xC15D, 32307 - 11904: 0xEDD3, 32308 - 11904: 0xC164, 32309 - 11904: 0xC167, 32310 - 11904: 0xEDDE, 32311 - 11904: 0xC15C, 32312 - 11904: 0xEDD5, 32313 - 11904: 0xC165, 32314 - 11904: 0xEDE0, 32315 - 11904: 0xEDDD, 32316 - 11904: 0xEDD1, 32317 - 11904: 0xC160, 32318 - 11904: 0xC15A, 32319 - 11904: 0xC168, 32320 - 11904: 0xEDD8, 32321 - 11904: 0xC163, 32322 - 11904: 0xEDD2, 32323 - 11904: 0xC15E, 32324 - 11904: 0xEDDF, 32325 - 11904: 0xC162, 32326 - 11904: 0xC15B, 32327 - 11904: 0xEDD9, 32328 - 11904: 0xC166, 32329 - 11904: 0xEDD7, 32332 - 11904: 0xEDDB, 32336 - 11904: 0xF06E, 32337 - 11904: 0xF074, 32338 - 11904: 0xC2B9, 32339 - 11904: 0xF077, 32340 - 11904: 0xC2B4, 32341 - 11904: 0xC2B5, 32342 - 11904: 0xF06F, 32343 - 11904: 0xF076, 32344 - 11904: 0xF071, 32345 - 11904: 0xC2BA, 32346 - 11904: 0xC2B7, 32347 - 11904: 0x8CDC, 32348 - 11904: 0xF06D, 32350 - 11904: 0xC2B6, 32351 - 11904: 0xF073, 32352 - 11904: 0xF075, 32353 - 11904: 0xC2B8, 32354 - 11904: 0xF072, 32355 - 11904: 0xF070, 32357 - 11904: 0x9876, 32359 - 11904: 0x8EA1, 32360 - 11904: 0xF2B8, 32361 - 11904: 0xC3B7, 32362 - 11904: 0xC3B8, 32363 - 11904: 0xC3B4, 32364 - 11904: 0x8CB4, 32365 - 11904: 0xC3B5, 32366 - 11904: 0x8EB7, 32367 - 11904: 0xF2B4, 32368 - 11904: 0xF2B2, 32370 - 11904: 0xF2B6, 32371 - 11904: 0xC3BA, 32372 - 11904: 0xF2B7, 32373 - 11904: 0xF2B0, 32374 - 11904: 0xF2AF, 32375 - 11904: 0xF2B3, 32376 - 11904: 0xF2B1, 32377 - 11904: 0xC3B6, 32378 - 11904: 0xF2B5, 32379 - 11904: 0xF4AC, 32380 - 11904: 0xC47E, 32381 - 11904: 0xC47D, 32382 - 11904: 0xF4AD, 32383 - 11904: 0x9DA6, 32384 - 11904: 0xF4AF, 32385 - 11904: 0xF4AE, 32386 - 11904: 0xC4A1, 32390 - 11904: 0xF5EB, 32391 - 11904: 0xF5E8, 32392 - 11904: 0xF5E9, 32394 - 11904: 0xF5E7, 32395 - 11904: 0xF5EA, 32396 - 11904: 0xC4F2, 32397 - 11904: 0xF5EC, 32398 - 11904: 0x9EB0, 32399 - 11904: 0xC4F1, 32401 - 11904: 0xF742, 32402 - 11904: 0x8EB8, 32403 - 11904: 0xC5D5, 32404 - 11904: 0xC5D7, 32405 - 11904: 0xF7EE, 32406 - 11904: 0xC5D6, 32407 - 11904: 0xF8B9, 32408 - 11904: 0xF940, 32409 - 11904: 0xF942, 32410 - 11904: 0xF8FE, 32411 - 11904: 0xF941, 32412 - 11904: 0xC66C, 32415 - 11904: 0x9D70, 32420 - 11904: 0x896E, 32428 - 11904: 0x896F, 32442 - 11904: 0x8970, 32455 - 11904: 0x8971, 32463 - 11904: 0x8972, 32479 - 11904: 0x8973, 32518 - 11904: 0x8974, 32566 - 11904: 0xA6CE, 32567 - 11904: 0x8975, 32568 - 11904: 0xACFB, 32569 - 11904: 0xD26F, 32570 - 11904: 0xAFCA, 32573 - 11904: 0xB2DA, 32574 - 11904: 0xDAFC, 32575 - 11904: 0xDAFD, 32576 - 11904: 0x8EBC, 32577 - 11904: 0x8EBD, 32579 - 11904: 0xEADF, 32580 - 11904: 0xC16A, 32581 - 11904: 0xEDE1, 32583 - 11904: 0x8EBE, 32584 - 11904: 0xC2BB, 32585 - 11904: 0x9DD1, 32586 - 11904: 0xF2BA, 32587 - 11904: 0xF2B9, 32588 - 11904: 0xC4A2, 32589 - 11904: 0xF5ED, 32590 - 11904: 0x94FD, 32591 - 11904: 0xF743, 32592 - 11904: 0xC5F8, 32593 - 11904: 0xCA49, 32594 - 11904: 0x8BD7, 32595 - 11904: 0x8BDA, 32596 - 11904: 0xAAC9, 32597 - 11904: 0xA875, 32600 - 11904: 0xD04D, 32603 - 11904: 0xD360, 32604 - 11904: 0xD35B, 32605 - 11904: 0xD35F, 32606 - 11904: 0xD35D, 32607 - 11904: 0xAFCB, 32608 - 11904: 0xD35E, 32609 - 11904: 0xD35C, 32611 - 11904: 0xD6F1, 32613 - 11904: 0xDAFE, 32614 - 11904: 0xDB40, 32615 - 11904: 0xDF69, 32616 - 11904: 0xDF6A, 32617 - 11904: 0xB86E, 32618 - 11904: 0xB86F, 32619 - 11904: 0xDF68, 32620 - 11904: 0xDF6B, 32621 - 11904: 0xDF67, 32622 - 11904: 0xB86D, 32624 - 11904: 0xBB40, 32625 - 11904: 0xA0E2, 32626 - 11904: 0xB870, 32627 - 11904: 0xE37A, 32629 - 11904: 0xBD7C, 32630 - 11904: 0xE6F1, 32631 - 11904: 0xBD7D, 32632 - 11904: 0x9FE9, 32633 - 11904: 0xBFA9, 32634 - 11904: 0xEAE2, 32635 - 11904: 0xEAE0, 32636 - 11904: 0xEAE1, 32637 - 11904: 0xEDE4, 32638 - 11904: 0xEDE3, 32639 - 11904: 0xEDE2, 32643 - 11904: 0xF2BB, 32645 - 11904: 0xC3B9, 32646 - 11904: 0xF2BC, 32647 - 11904: 0xF744, 32648 - 11904: 0xC5F9, 32649 - 11904: 0xF8BA, 32650 - 11904: 0xA6CF, 32651 - 11904: 0xAACB, 32652 - 11904: 0xAACA, 32653 - 11904: 0xD04F, 32654 - 11904: 0xACFC, 32655 - 11904: 0xFDA8, 32657 - 11904: 0xD04E, 32658 - 11904: 0xD362, 32659 - 11904: 0x8AE7, 32660 - 11904: 0xAFCC, 32661 - 11904: 0xD6F2, 32662 - 11904: 0xD361, 32663 - 11904: 0x8EC2, 32666 - 11904: 0xB2DC, 32667 - 11904: 0xD6F5, 32668 - 11904: 0xD6F3, 32669 - 11904: 0xD6F4, 32670 - 11904: 0xB2DB, 32672 - 11904: 0xDB42, 32673 - 11904: 0xDB43, 32674 - 11904: 0xDB41, 32675 - 11904: 0x8EC4, 32676 - 11904: 0xB873, 32677 - 11904: 0xDF6D, 32678 - 11904: 0xDF6C, 32679 - 11904: 0xDF6E, 32680 - 11904: 0xB872, 32681 - 11904: 0xB871, 32684 - 11904: 0xE6F2, 32685 - 11904: 0xE6F4, 32686 - 11904: 0x9964, 32687 - 11904: 0xBD7E, 32688 - 11904: 0xE6F3, 32689 - 11904: 0xEAE3, 32690 - 11904: 0xBFAA, 32691 - 11904: 0xF079, 32692 - 11904: 0x9965, 32693 - 11904: 0xF078, 32694 - 11904: 0xC3BB, 32695 - 11904: 0xF2BD, 32696 - 11904: 0xC3BD, 32697 - 11904: 0xC3BC, 32698 - 11904: 0xF4B0, 32699 - 11904: 0xF5EE, 32700 - 11904: 0xC4F3, 32701 - 11904: 0xA6D0, 32702 - 11904: 0xD050, 32703 - 11904: 0xACFD, 32704 - 11904: 0xD365, 32705 - 11904: 0xAFCE, 32706 - 11904: 0xD364, 32707 - 11904: 0xD363, 32709 - 11904: 0xAFCD, 32711 - 11904: 0xD6FB, 32713 - 11904: 0xD6FD, 32714 - 11904: 0xD6F6, 32715 - 11904: 0xD6F7, 32716 - 11904: 0xB2DD, 32717 - 11904: 0xD6F8, 32718 - 11904: 0xB2DE, 32719 - 11904: 0xD6FC, 32720 - 11904: 0xD6F9, 32721 - 11904: 0xD6FA, 32722 - 11904: 0xB2DF, 32724 - 11904: 0xB5BE, 32725 - 11904: 0xB5BF, 32727 - 11904: 0xDB44, 32731 - 11904: 0xDF6F, 32732 - 11904: 0xDF70, 32733 - 11904: 0x954E, 32734 - 11904: 0xE37E, 32735 - 11904: 0xBB43, 32736 - 11904: 0xBB41, 32737 - 11904: 0xBB42, 32738 - 11904: 0xE37B, 32739 - 11904: 0xE37C, 32741 - 11904: 0xE37D, 32742 - 11904: 0xE6F9, 32743 - 11904: 0x98B3, 32744 - 11904: 0xE6FA, 32745 - 11904: 0xBDA1, 32746 - 11904: 0xE6F7, 32747 - 11904: 0xE6F6, 32748 - 11904: 0xE6F8, 32749 - 11904: 0xE6F5, 32750 - 11904: 0xBFAD, 32751 - 11904: 0xEAE4, 32752 - 11904: 0xBFAB, 32753 - 11904: 0xBFAC, 32754 - 11904: 0xEDE6, 32755 - 11904: 0xC16B, 32756 - 11904: 0xEDE5, 32757 - 11904: 0xEFA8, 32759 - 11904: 0xF07A, 32760 - 11904: 0xF07B, 32761 - 11904: 0xC2BC, 32762 - 11904: 0x8ECB, 32763 - 11904: 0xC2BD, 32764 - 11904: 0xC16C, 32765 - 11904: 0xF2BE, 32766 - 11904: 0xF2BF, 32767 - 11904: 0xF4B1, 32768 - 11904: 0xC4A3, 32769 - 11904: 0xA6D1, 32770 - 11904: 0x8BDF, 32771 - 11904: 0xA6D2, 32772 - 11904: 0xACFE, 32773 - 11904: 0xAACC, 32774 - 11904: 0xAFCF, 32775 - 11904: 0xD051, 32776 - 11904: 0x8ECE, 32779 - 11904: 0xB5C0, 32780 - 11904: 0xA6D3, 32781 - 11904: 0xAD41, 32782 - 11904: 0xD052, 32783 - 11904: 0xD053, 32784 - 11904: 0xAD40, 32785 - 11904: 0xAD42, 32786 - 11904: 0xA6D4, 32788 - 11904: 0xD054, 32789 - 11904: 0xAFD1, 32790 - 11904: 0xD366, 32791 - 11904: 0xAFD3, 32792 - 11904: 0xAFD0, 32793 - 11904: 0xAFD2, 32795 - 11904: 0xD741, 32796 - 11904: 0xB2E0, 32797 - 11904: 0x8ECF, 32798 - 11904: 0xD740, 32799 - 11904: 0xD6FE, 32800 - 11904: 0x9968, 32801 - 11904: 0xDF71, 32804 - 11904: 0xE3A1, 32805 - 11904: 0x9969, 32806 - 11904: 0xBDA2, 32808 - 11904: 0xBFAE, 32809 - 11904: 0xEAE6, 32810 - 11904: 0xEAE5, 32812 - 11904: 0xEDE7, 32814 - 11904: 0x996B, 32815 - 11904: 0x8ED1, 32816 - 11904: 0xF5EF, 32817 - 11904: 0x996C, 32819 - 11904: 0xA6D5, 32820 - 11904: 0xCB73, 32821 - 11904: 0xCDAA, 32822 - 11904: 0xAD43, 32823 - 11904: 0xD055, 32825 - 11904: 0xD368, 32827 - 11904: 0x8ED4, 32828 - 11904: 0x8ED5, 32829 - 11904: 0xAFD4, 32830 - 11904: 0xD367, 32831 - 11904: 0xAFD5, 32835 - 11904: 0xD743, 32838 - 11904: 0xB2E2, 32839 - 11904: 0xD742, 32840 - 11904: 0xD744, 32842 - 11904: 0xB2E1, 32847 - 11904: 0xDB46, 32848 - 11904: 0xDB47, 32849 - 11904: 0xDB45, 32850 - 11904: 0xB5C1, 32852 - 11904: 0x996D, 32854 - 11904: 0xB874, 32856 - 11904: 0xB875, 32858 - 11904: 0xBB45, 32859 - 11904: 0xA0BE, 32860 - 11904: 0xE3A3, 32861 - 11904: 0xE3A2, 32862 - 11904: 0xBB44, 32865 - 11904: 0x8ED6, 32866 - 11904: 0xA0BC, 32867 - 11904: 0xA0B5, 32868 - 11904: 0xE6FB, 32870 - 11904: 0xA0B4, 32871 - 11904: 0xE6FC, 32876 - 11904: 0xEAE7, 32879 - 11904: 0xC170, 32880 - 11904: 0xC16F, 32881 - 11904: 0xC16D, 32882 - 11904: 0xC16E, 32883 - 11904: 0xC171, 32885 - 11904: 0xF07C, 32886 - 11904: 0xC2BF, 32887 - 11904: 0xC2BE, 32888 - 11904: 0xF2C0, 32889 - 11904: 0xF4B2, 32893 - 11904: 0xC5A5, 32894 - 11904: 0xC5A4, 32895 - 11904: 0xA6D6, 32896 - 11904: 0x8BE0, 32898 - 11904: 0xD1FB, 32900 - 11904: 0xB877, 32901 - 11904: 0xB5C2, 32902 - 11904: 0xB876, 32903 - 11904: 0xBB46, 32905 - 11904: 0xA6D7, 32906 - 11904: 0xC9A9, 32907 - 11904: 0xA6D8, 32908 - 11904: 0xA6D9, 32911 - 11904: 0xCDAB, 32912 - 11904: 0xCB76, 32914 - 11904: 0xCB77, 32915 - 11904: 0xA877, 32917 - 11904: 0xCB74, 32918 - 11904: 0xA876, 32920 - 11904: 0xA879, 32921 - 11904: 0xCB75, 32922 - 11904: 0xA87B, 32923 - 11904: 0xA87A, 32924 - 11904: 0xCB78, 32925 - 11904: 0xA878, 32927 - 11904: 0x89B5, 32929 - 11904: 0xAAD1, 32930 - 11904: 0xAACF, 32931 - 11904: 0xCDAD, 32933 - 11904: 0xAACE, 32935 - 11904: 0x8EDD, 32937 - 11904: 0xAAD3, 32938 - 11904: 0xAAD5, 32939 - 11904: 0xAAD2, 32941 - 11904: 0xCDB0, 32942 - 11904: 0xCDAC, 32943 - 11904: 0xAAD6, 32945 - 11904: 0xAAD0, 32946 - 11904: 0xA87C, 32948 - 11904: 0xAAD4, 32949 - 11904: 0xCDAF, 32950 - 11904: 0x9E5D, 32951 - 11904: 0x9971, 32952 - 11904: 0xCDAE, 32954 - 11904: 0xAACD, 32956 - 11904: 0x89AE, 32957 - 11904: 0x9DE8, 32962 - 11904: 0xD05B, 32963 - 11904: 0xAD47, 32964 - 11904: 0xAD48, 32965 - 11904: 0xD05D, 32966 - 11904: 0x9565, 32967 - 11904: 0xD057, 32968 - 11904: 0xD05A, 32969 - 11904: 0xD063, 32970 - 11904: 0xD061, 32972 - 11904: 0xAD49, 32973 - 11904: 0xD067, 32974 - 11904: 0xAD4C, 32975 - 11904: 0xD064, 32976 - 11904: 0xD05C, 32977 - 11904: 0xD059, 32980 - 11904: 0xDB49, 32981 - 11904: 0xD062, 32982 - 11904: 0xAD44, 32983 - 11904: 0xD065, 32984 - 11904: 0xD056, 32985 - 11904: 0xD05F, 32986 - 11904: 0xAD46, 32987 - 11904: 0xAD4B, 32988 - 11904: 0xD060, 32989 - 11904: 0xAD4F, 32990 - 11904: 0xAD4D, 32992 - 11904: 0xD058, 32993 - 11904: 0xAD4A, 32995 - 11904: 0xD05E, 32996 - 11904: 0xAD4E, 32997 - 11904: 0xAD45, 32998 - 11904: 0xD066, 33001 - 11904: 0x9972, 33004 - 11904: 0x8B5C, 33005 - 11904: 0xAFDA, 33007 - 11904: 0xAFE3, 33008 - 11904: 0xAFD8, 33009 - 11904: 0xAFD6, 33010 - 11904: 0xD36A, 33011 - 11904: 0xAFDE, 33012 - 11904: 0xAFDB, 33013 - 11904: 0xD36C, 33014 - 11904: 0x89B1, 33016 - 11904: 0xAFDD, 33017 - 11904: 0xD36B, 33018 - 11904: 0xD369, 33019 - 11904: 0xD36E, 33020 - 11904: 0xAFE2, 33021 - 11904: 0xAFE0, 33022 - 11904: 0xDB48, 33024 - 11904: 0xD36F, 33025 - 11904: 0xD36D, 33026 - 11904: 0xAFD7, 33027 - 11904: 0xA0C0, 33029 - 11904: 0xAFD9, 33030 - 11904: 0xAFDC, 33031 - 11904: 0x8EDF, 33032 - 11904: 0xAFDF, 33033 - 11904: 0x9566, 33034 - 11904: 0xAFE1, 33036 - 11904: 0x9974, 33038 - 11904: 0x9976, 33042 - 11904: 0x9977, 33044 - 11904: 0x9979, 33045 - 11904: 0xD74E, 33046 - 11904: 0xB2E4, 33047 - 11904: 0x9DDA, 33048 - 11904: 0xD745, 33049 - 11904: 0xD747, 33050 - 11904: 0x8EE0, 33051 - 11904: 0xD748, 33053 - 11904: 0xD750, 33054 - 11904: 0xD74C, 33055 - 11904: 0xD74A, 33057 - 11904: 0xD74D, 33058 - 11904: 0xD751, 33059 - 11904: 0xB2E5, 33060 - 11904: 0xB2E9, 33061 - 11904: 0xD746, 33063 - 11904: 0xD74F, 33065 - 11904: 0xB2E7, 33066 - 11904: 0x935C, 33067 - 11904: 0xB2E6, 33068 - 11904: 0xD74B, 33069 - 11904: 0xD749, 33071 - 11904: 0xB2E3, 33072 - 11904: 0xB2E8, 33074 - 11904: 0x9DE6, 33076 - 11904: 0x8B5F, 33079 - 11904: 0x9563, 33081 - 11904: 0xB5C8, 33082 - 11904: 0xDB51, 33085 - 11904: 0xDB4F, 33086 - 11904: 0xB5CA, 33090 - 11904: 0x9567, 33091 - 11904: 0xDB4A, 33092 - 11904: 0xDFA1, 33094 - 11904: 0xB5C9, 33095 - 11904: 0xDB4E, 33096 - 11904: 0x9DE3, 33098 - 11904: 0xDB4B, 33099 - 11904: 0xB5C5, 33100 - 11904: 0xB5CB, 33101 - 11904: 0xDB50, 33102 - 11904: 0xB5C7, 33103 - 11904: 0xDB4D, 33104 - 11904: 0xBB47, 33105 - 11904: 0xB5C6, 33106 - 11904: 0xDB4C, 33107 - 11904: 0xB5CC, 33108 - 11904: 0xB5C4, 33109 - 11904: 0xB5C3, 33110 - 11904: 0x997C, 33113 - 11904: 0x997D, 33114 - 11904: 0x997E, 33115 - 11904: 0xDF77, 33116 - 11904: 0xDF75, 33118 - 11904: 0xDF7B, 33120 - 11904: 0xDF73, 33121 - 11904: 0xDFA2, 33122 - 11904: 0xDF78, 33124 - 11904: 0xDF72, 33125 - 11904: 0xB87B, 33126 - 11904: 0xB8A3, 33127 - 11904: 0xDF7D, 33129 - 11904: 0xDF76, 33131 - 11904: 0xB87E, 33132 - 11904: 0x8CFB, 33133 - 11904: 0x8B5B, 33134 - 11904: 0xB87C, 33135 - 11904: 0xDF7E, 33136 - 11904: 0xB879, 33137 - 11904: 0xB878, 33138 - 11904: 0xDF79, 33139 - 11904: 0xB87D, 33140 - 11904: 0xB5CD, 33142 - 11904: 0xDF7C, 33143 - 11904: 0xDF74, 33144 - 11904: 0xB87A, 33145 - 11904: 0xB8A1, 33146 - 11904: 0xB8A2, 33148 - 11904: 0x99A3, 33151 - 11904: 0xBB4C, 33152 - 11904: 0xBB48, 33154 - 11904: 0xBB4D, 33155 - 11904: 0xE3A6, 33156 - 11904: 0x99A4, 33158 - 11904: 0xE3A5, 33159 - 11904: 0xE3A7, 33160 - 11904: 0xBB4A, 33161 - 11904: 0xE3A4, 33162 - 11904: 0xBB4B, 33163 - 11904: 0xE3AA, 33164 - 11904: 0xE3A9, 33165 - 11904: 0xE3A8, 33167 - 11904: 0xBB49, 33171 - 11904: 0x99A6, 33173 - 11904: 0xE741, 33175 - 11904: 0xE744, 33176 - 11904: 0xBDA8, 33177 - 11904: 0xE743, 33178 - 11904: 0xBDA7, 33179 - 11904: 0xBDA3, 33180 - 11904: 0xBDA4, 33181 - 11904: 0xBDA5, 33182 - 11904: 0xE740, 33183 - 11904: 0xE6FE, 33184 - 11904: 0xBDA6, 33186 - 11904: 0xE742, 33187 - 11904: 0xE6FD, 33189 - 11904: 0x99A8, 33190 - 11904: 0xEAE9, 33191 - 11904: 0xEAF3, 33192 - 11904: 0xBFB1, 33193 - 11904: 0xBFB0, 33194 - 11904: 0x8ABE, 33195 - 11904: 0xEAED, 33196 - 11904: 0xEAEF, 33198 - 11904: 0xEAEA, 33200 - 11904: 0xEAEE, 33201 - 11904: 0xEAE8, 33202 - 11904: 0xEAF1, 33203 - 11904: 0xBFAF, 33204 - 11904: 0xEAF0, 33205 - 11904: 0xEAEC, 33206 - 11904: 0x9E61, 33207 - 11904: 0xEAF2, 33209 - 11904: 0xEAEB, 33210 - 11904: 0xC174, 33211 - 11904: 0xEDE8, 33212 - 11904: 0xEDEE, 33213 - 11904: 0xC178, 33214 - 11904: 0xC17A, 33215 - 11904: 0xC177, 33216 - 11904: 0xC176, 33217 - 11904: 0x99AA, 33218 - 11904: 0xC175, 33219 - 11904: 0xC173, 33220 - 11904: 0xEDE9, 33221 - 11904: 0xEDEC, 33222 - 11904: 0xC172, 33223 - 11904: 0xEDED, 33224 - 11904: 0xA0C8, 33225 - 11904: 0xC179, 33226 - 11904: 0xEDEB, 33228 - 11904: 0xEDEA, 33229 - 11904: 0xC2C0, 33231 - 11904: 0xC2C1, 33232 - 11904: 0xF0A1, 33233 - 11904: 0xF07D, 33234 - 11904: 0xF07E, 33237 - 11904: 0xF2C2, 33239 - 11904: 0xF2C1, 33240 - 11904: 0xC3BE, 33241 - 11904: 0xF4B4, 33242 - 11904: 0xC4A4, 33243 - 11904: 0xF4B3, 33245 - 11904: 0xF5F0, 33246 - 11904: 0xF745, 33247 - 11904: 0xC5A6, 33248 - 11904: 0xF943, 33249 - 11904: 0xF944, 33250 - 11904: 0xC5D8, 33251 - 11904: 0xA6DA, 33252 - 11904: 0x99AB, 33253 - 11904: 0xAAD7, 33254 - 11904: 0xDB52, 33255 - 11904: 0xBB4E, 33256 - 11904: 0xC17B, 33257 - 11904: 0xEDEF, 33258 - 11904: 0xA6DB, 33260 - 11904: 0xAFE5, 33261 - 11904: 0xAFE4, 33262 - 11904: 0xDB53, 33263 - 11904: 0xFEC4, 33266 - 11904: 0xEAF4, 33267 - 11904: 0xA6DC, 33268 - 11904: 0xAD50, 33270 - 11904: 0x98C2, 33271 - 11904: 0xDB54, 33272 - 11904: 0xDB55, 33273 - 11904: 0xDB56, 33274 - 11904: 0xBB4F, 33275 - 11904: 0xBFB2, 33276 - 11904: 0xA6DD, 33278 - 11904: 0xAAD8, 33279 - 11904: 0xD068, 33280 - 11904: 0xAFE6, 33281 - 11904: 0xD370, 33282 - 11904: 0xB2EA, 33284 - 11904: 0xDB57, 33285 - 11904: 0xB8A4, 33287 - 11904: 0xBB50, 33288 - 11904: 0xBFB3, 33289 - 11904: 0xC17C, 33290 - 11904: 0xC2C2, 33291 - 11904: 0xF4B5, 33292 - 11904: 0xA6DE, 33293 - 11904: 0xAAD9, 33296 - 11904: 0xAFE7, 33297 - 11904: 0xD752, 33298 - 11904: 0xB5CE, 33300 - 11904: 0xBB51, 33301 - 11904: 0xE3AB, 33302 - 11904: 0xE745, 33304 - 11904: 0x8EE8, 33306 - 11904: 0xA0BA, 33307 - 11904: 0xA6DF, 33308 - 11904: 0xB5CF, 33309 - 11904: 0xDFA3, 33310 - 11904: 0xBB52, 33311 - 11904: 0xA6E0, 33312 - 11904: 0xCDB1, 33313 - 11904: 0xD069, 33314 - 11904: 0xAD51, 33317 - 11904: 0xD372, 33318 - 11904: 0xFD77, 33320 - 11904: 0xAFEA, 33321 - 11904: 0x8EEE, 33322 - 11904: 0xAFE8, 33323 - 11904: 0xAFE9, 33324 - 11904: 0xAFEB, 33325 - 11904: 0x9EBF, 33327 - 11904: 0xD371, 33330 - 11904: 0xD757, 33331 - 11904: 0xD754, 33332 - 11904: 0xD756, 33333 - 11904: 0xB2EB, 33334 - 11904: 0xB2ED, 33335 - 11904: 0xB2EC, 33336 - 11904: 0xD753, 33337 - 11904: 0xB2EE, 33338 - 11904: 0xD755, 33340 - 11904: 0xDB58, 33341 - 11904: 0xDB59, 33342 - 11904: 0x89C2, 33343 - 11904: 0xDB5A, 33344 - 11904: 0xDFA6, 33346 - 11904: 0xDFA7, 33348 - 11904: 0xDFA5, 33349 - 11904: 0xDFA8, 33351 - 11904: 0xB8A5, 33353 - 11904: 0xDFA4, 33355 - 11904: 0xBB53, 33358 - 11904: 0xE74A, 33359 - 11904: 0xE746, 33360 - 11904: 0xE749, 33361 - 11904: 0xE74B, 33362 - 11904: 0xE748, 33363 - 11904: 0xE747, 33364 - 11904: 0x99AC, 33365 - 11904: 0xEAF5, 33366 - 11904: 0xEAF6, 33367 - 11904: 0xEAF7, 33368 - 11904: 0xBFB4, 33369 - 11904: 0xBFB5, 33370 - 11904: 0xEDF1, 33371 - 11904: 0xEDF0, 33372 - 11904: 0xEDF2, 33374 - 11904: 0xF0A3, 33375 - 11904: 0xF0A2, 33377 - 11904: 0xF2C4, 33378 - 11904: 0x956B, 33379 - 11904: 0xF2C5, 33380 - 11904: 0xF2C3, 33381 - 11904: 0x956C, 33382 - 11904: 0xC4A5, 33384 - 11904: 0xF4B6, 33385 - 11904: 0xF4B7, 33387 - 11904: 0xF746, 33388 - 11904: 0xF7EF, 33389 - 11904: 0xF8BB, 33390 - 11904: 0xA6E1, 33391 - 11904: 0xA87D, 33393 - 11904: 0xC17D, 33394 - 11904: 0xA6E2, 33396 - 11904: 0xD758, 33397 - 11904: 0xDB5B, 33398 - 11904: 0x99AF, 33399 - 11904: 0xC641, 33400 - 11904: 0xCA4A, 33401 - 11904: 0x994A, 33402 - 11904: 0x8976, 33403 - 11904: 0x8F48, 33404 - 11904: 0xCA4B, 33405 - 11904: 0xCA4D, 33406 - 11904: 0xA6E3, 33407 - 11904: 0xCA4E, 33408 - 11904: 0xCA4C, 33411 - 11904: 0xCBA2, 33412 - 11904: 0xCBA3, 33413 - 11904: 0xCB7B, 33415 - 11904: 0xFBEE, 33418 - 11904: 0xCBA1, 33419 - 11904: 0xA8A1, 33421 - 11904: 0xA8A2, 33422 - 11904: 0xCB7C, 33423 - 11904: 0xCB7A, 33424 - 11904: 0xCB79, 33425 - 11904: 0xCB7D, 33426 - 11904: 0xA87E, 33427 - 11904: 0xCB7E, 33428 - 11904: 0xD06A, 33432 - 11904: 0xCDB6, 33433 - 11904: 0xAADC, 33434 - 11904: 0xCDB5, 33435 - 11904: 0xCDB7, 33437 - 11904: 0xAADB, 33438 - 11904: 0xCDBC, 33439 - 11904: 0xAADF, 33440 - 11904: 0xCDB2, 33441 - 11904: 0xCDC0, 33442 - 11904: 0xCDC6, 33443 - 11904: 0xAAE6, 33444 - 11904: 0xCDC3, 33445 - 11904: 0xAAE3, 33446 - 11904: 0x99AE, 33447 - 11904: 0xCDB9, 33448 - 11904: 0xCDBF, 33449 - 11904: 0xCDC1, 33450 - 11904: 0x8EFB, 33451 - 11904: 0xCDB4, 33452 - 11904: 0xAAE2, 33453 - 11904: 0xAADD, 33454 - 11904: 0xCDBA, 33455 - 11904: 0xAAE4, 33456 - 11904: 0xAAE7, 33457 - 11904: 0xAAE1, 33459 - 11904: 0xAADA, 33460 - 11904: 0xCDBE, 33461 - 11904: 0xCDB8, 33462 - 11904: 0xCDC5, 33463 - 11904: 0xAAE9, 33464 - 11904: 0xAAE5, 33465 - 11904: 0xAAE0, 33466 - 11904: 0xCDBD, 33467 - 11904: 0xAFEC, 33468 - 11904: 0xCDBB, 33469 - 11904: 0xAADE, 33470 - 11904: 0xAAE8, 33471 - 11904: 0x8CD0, 33472 - 11904: 0xCDB3, 33474 - 11904: 0xCDC2, 33475 - 11904: 0xCDC4, 33476 - 11904: 0x8B52, 33482 - 11904: 0x99B0, 33487 - 11904: 0x8977, 33488 - 11904: 0x8F41, 33489 - 11904: 0xAD62, 33490 - 11904: 0xAD5C, 33491 - 11904: 0xAD64, 33492 - 11904: 0xAD61, 33493 - 11904: 0xD071, 33494 - 11904: 0xD074, 33495 - 11904: 0xAD5D, 33496 - 11904: 0x99B1, 33497 - 11904: 0xD06B, 33499 - 11904: 0xAD56, 33500 - 11904: 0xAD60, 33502 - 11904: 0xAD63, 33503 - 11904: 0xAD65, 33504 - 11904: 0xD0A2, 33505 - 11904: 0xD077, 33506 - 11904: 0x8F49, 33507 - 11904: 0xAD55, 33508 - 11904: 0xD0A1, 33509 - 11904: 0xAD59, 33510 - 11904: 0xAD57, 33511 - 11904: 0xAD52, 33512 - 11904: 0xD06F, 33514 - 11904: 0xD07E, 33515 - 11904: 0xD073, 33516 - 11904: 0xD076, 33517 - 11904: 0xD0A5, 33518 - 11904: 0xFA4D, 33519 - 11904: 0xAD66, 33520 - 11904: 0xD07D, 33521 - 11904: 0xAD5E, 33522 - 11904: 0xD078, 33523 - 11904: 0xD0A4, 33524 - 11904: 0xD075, 33525 - 11904: 0xD079, 33526 - 11904: 0xD07C, 33527 - 11904: 0x9DE4, 33528 - 11904: 0x8CB5, 33529 - 11904: 0xD06D, 33530 - 11904: 0xD0A3, 33531 - 11904: 0xD07B, 33532 - 11904: 0xFBE9, 33533 - 11904: 0x9B54, 33534 - 11904: 0xD06C, 33535 - 11904: 0x99B2, 33536 - 11904: 0xD070, 33537 - 11904: 0xAD5F, 33538 - 11904: 0xAD5A, 33539 - 11904: 0xAD53, 33540 - 11904: 0xAD58, 33541 - 11904: 0xAD54, 33542 - 11904: 0xAD67, 33543 - 11904: 0xD06E, 33544 - 11904: 0xD3A5, 33545 - 11904: 0xAD5B, 33547 - 11904: 0x9E68, 33548 - 11904: 0xD07A, 33549 - 11904: 0xCE41, 33558 - 11904: 0xD3A8, 33559 - 11904: 0xAFFA, 33560 - 11904: 0x8F4A, 33561 - 11904: 0xD376, 33562 - 11904: 0x8F42, 33563 - 11904: 0xD3A3, 33564 - 11904: 0xD37D, 33565 - 11904: 0x8F51, 33566 - 11904: 0xD3B2, 33568 - 11904: 0xD3AA, 33570 - 11904: 0xD37E, 33572 - 11904: 0xD3A9, 33573 - 11904: 0xD378, 33574 - 11904: 0xD37C, 33575 - 11904: 0xD3B5, 33576 - 11904: 0xAFFD, 33577 - 11904: 0xD3AD, 33578 - 11904: 0xD3A4, 33579 - 11904: 0xAFED, 33580 - 11904: 0xD3B3, 33581 - 11904: 0xD374, 33583 - 11904: 0xD3AC, 33585 - 11904: 0xAFFC, 33586 - 11904: 0xAFF7, 33587 - 11904: 0xD373, 33588 - 11904: 0xAFF5, 33589 - 11904: 0xAFF4, 33590 - 11904: 0xAFF9, 33591 - 11904: 0xD3AB, 33592 - 11904: 0xAFF1, 33593 - 11904: 0xAFF8, 33594 - 11904: 0xD072, 33595 - 11904: 0xDB5C, 33596 - 11904: 0xD3A6, 33597 - 11904: 0x9846, 33599 - 11904: 0xD37A, 33600 - 11904: 0xAFFB, 33601 - 11904: 0xD37B, 33602 - 11904: 0xD3A1, 33603 - 11904: 0xAFFE, 33604 - 11904: 0xD375, 33605 - 11904: 0xD3AF, 33607 - 11904: 0xD3AE, 33608 - 11904: 0xD3B6, 33609 - 11904: 0xAFF3, 33610 - 11904: 0xAFF0, 33611 - 11904: 0xD3B4, 33612 - 11904: 0xD3B0, 33613 - 11904: 0xD3A7, 33614 - 11904: 0xD3A2, 33615 - 11904: 0xAFF6, 33616 - 11904: 0xAFF2, 33617 - 11904: 0xD377, 33618 - 11904: 0xAFEE, 33619 - 11904: 0xD3B1, 33620 - 11904: 0xAFEF, 33622 - 11904: 0xD379, 33623 - 11904: 0x99B4, 33634 - 11904: 0x8EF5, 33635 - 11904: 0xFD55, 33638 - 11904: 0x9CCD, 33647 - 11904: 0x8978, 33651 - 11904: 0xD75E, 33652 - 11904: 0xD760, 33653 - 11904: 0xD765, 33654 - 11904: 0xD779, 33655 - 11904: 0xB2FC, 33656 - 11904: 0xB2F2, 33658 - 11904: 0xD75D, 33659 - 11904: 0xB2FD, 33660 - 11904: 0xB2FE, 33661 - 11904: 0xD768, 33662 - 11904: 0xD76F, 33663 - 11904: 0xD775, 33665 - 11904: 0xD762, 33667 - 11904: 0xD769, 33669 - 11904: 0x8F53, 33670 - 11904: 0xB340, 33671 - 11904: 0xD777, 33672 - 11904: 0xD772, 33673 - 11904: 0xB2FA, 33674 - 11904: 0xB2F8, 33675 - 11904: 0xD76E, 33676 - 11904: 0xD76A, 33677 - 11904: 0xD75C, 33678 - 11904: 0xB2EF, 33679 - 11904: 0xD761, 33680 - 11904: 0xD759, 33681 - 11904: 0x8F6F, 33682 - 11904: 0xB2F7, 33683 - 11904: 0xB2F9, 33684 - 11904: 0xD766, 33685 - 11904: 0xD763, 33686 - 11904: 0xB2F4, 33687 - 11904: 0xD773, 33688 - 11904: 0xB2F1, 33689 - 11904: 0xD764, 33690 - 11904: 0xD77A, 33691 - 11904: 0xD76C, 33692 - 11904: 0x8E63, 33693 - 11904: 0xD76B, 33694 - 11904: 0xB2F0, 33696 - 11904: 0xB2FB, 33698 - 11904: 0xB2F3, 33699 - 11904: 0xD75A, 33700 - 11904: 0xD75F, 33701 - 11904: 0xD770, 33702 - 11904: 0xD776, 33703 - 11904: 0xB341, 33704 - 11904: 0xD75B, 33705 - 11904: 0xD767, 33706 - 11904: 0xD76D, 33707 - 11904: 0xB2F6, 33708 - 11904: 0x8F56, 33710 - 11904: 0xD778, 33711 - 11904: 0xD771, 33712 - 11904: 0xD774, 33721 - 11904: 0xFE76, 33725 - 11904: 0xB2F5, 33726 - 11904: 0x9FC6, 33727 - 11904: 0xDB6C, 33728 - 11904: 0xDB60, 33729 - 11904: 0xB5D7, 33730 - 11904: 0xDB7D, 33731 - 11904: 0xDBA7, 33732 - 11904: 0xDBAA, 33733 - 11904: 0xB5D5, 33734 - 11904: 0xDB68, 33735 - 11904: 0xDBA3, 33736 - 11904: 0xDB69, 33737 - 11904: 0xDB77, 33738 - 11904: 0xB5E2, 33739 - 11904: 0xDB73, 33740 - 11904: 0xB5DF, 33741 - 11904: 0xFAAC, 33742 - 11904: 0xDB74, 33743 - 11904: 0xDB5D, 33745 - 11904: 0xDBA4, 33747 - 11904: 0x8F58, 33748 - 11904: 0xB5E8, 33749 - 11904: 0xDBA1, 33750 - 11904: 0xDB75, 33751 - 11904: 0xDBAC, 33752 - 11904: 0xDB70, 33753 - 11904: 0xDFC8, 33755 - 11904: 0xDBAF, 33756 - 11904: 0xB5E6, 33757 - 11904: 0xDB6E, 33758 - 11904: 0xDB7A, 33759 - 11904: 0xB5E9, 33760 - 11904: 0xB5D4, 33761 - 11904: 0xDB72, 33762 - 11904: 0xDBAD, 33763 - 11904: 0xDB6B, 33764 - 11904: 0xDB64, 33765 - 11904: 0xDB6F, 33767 - 11904: 0xDB63, 33768 - 11904: 0xDB61, 33769 - 11904: 0xB5D0, 33770 - 11904: 0xDBA5, 33771 - 11904: 0xDB6A, 33772 - 11904: 0xDBA8, 33773 - 11904: 0x9848, 33774 - 11904: 0xDBA9, 33775 - 11904: 0xB5D8, 33776 - 11904: 0xB5DD, 33777 - 11904: 0xB5D9, 33778 - 11904: 0xB5E1, 33779 - 11904: 0xDB7E, 33780 - 11904: 0xB5DA, 33781 - 11904: 0xDB76, 33782 - 11904: 0xDB66, 33784 - 11904: 0xB5D2, 33785 - 11904: 0xDB5E, 33786 - 11904: 0xDBA2, 33787 - 11904: 0xDBAB, 33788 - 11904: 0xDB65, 33789 - 11904: 0xB5E0, 33790 - 11904: 0xDBB0, 33791 - 11904: 0xDB71, 33793 - 11904: 0xDB6D, 33795 - 11904: 0xB5D1, 33796 - 11904: 0xB5E5, 33797 - 11904: 0x99B7, 33798 - 11904: 0xDB7C, 33799 - 11904: 0xB5E7, 33801 - 11904: 0xDB78, 33802 - 11904: 0xB5DC, 33803 - 11904: 0xB5D6, 33804 - 11904: 0xB5DE, 33805 - 11904: 0xB5D3, 33806 - 11904: 0xB5E4, 33807 - 11904: 0xDB79, 33808 - 11904: 0xDB67, 33809 - 11904: 0xDB7B, 33810 - 11904: 0xDB62, 33811 - 11904: 0xDBA6, 33812 - 11904: 0x9665, 33814 - 11904: 0xFA6C, 33816 - 11904: 0x9DE7, 33819 - 11904: 0xDBAE, 33820 - 11904: 0x9E62, 33824 - 11904: 0x96CC, 33825 - 11904: 0x8E67, 33827 - 11904: 0xDB5F, 33828 - 11904: 0xFC75, 33830 - 11904: 0x987E, 33833 - 11904: 0xDFC7, 33835 - 11904: 0xDFDD, 33836 - 11904: 0xB855, 33837 - 11904: 0xDFCC, 33838 - 11904: 0xFDB9, 33839 - 11904: 0xDFCA, 33840 - 11904: 0xDFB5, 33841 - 11904: 0xB8A9, 33842 - 11904: 0xDFC5, 33843 - 11904: 0xDFD9, 33844 - 11904: 0xDFC1, 33845 - 11904: 0xB8B1, 33846 - 11904: 0xDFD8, 33847 - 11904: 0xDFBF, 33848 - 11904: 0xB5E3, 33849 - 11904: 0xDFCF, 33850 - 11904: 0xDFC0, 33851 - 11904: 0xDFD6, 33852 - 11904: 0xB8B0, 33853 - 11904: 0xB8A8, 33854 - 11904: 0x97FC, 33855 - 11904: 0xDFAA, 33856 - 11904: 0xDFB2, 33858 - 11904: 0xDFCB, 33859 - 11904: 0xDFC3, 33860 - 11904: 0xDFDC, 33861 - 11904: 0xDFC6, 33862 - 11904: 0xB8B6, 33863 - 11904: 0xDFD7, 33864 - 11904: 0x98F9, 33865 - 11904: 0xB8AD, 33866 - 11904: 0x8F66, 33867 - 11904: 0xDFC9, 33868 - 11904: 0xDFD1, 33869 - 11904: 0xDFB6, 33870 - 11904: 0xDFD0, 33872 - 11904: 0xDFE1, 33873 - 11904: 0xDFB1, 33874 - 11904: 0xDFD2, 33875 - 11904: 0x956E, 33876 - 11904: 0xDFDF, 33877 - 11904: 0x9245, 33878 - 11904: 0xDFAB, 33879 - 11904: 0xB5DB, 33880 - 11904: 0x8F60, 33881 - 11904: 0xDFB9, 33882 - 11904: 0xDFB8, 33883 - 11904: 0xB8AF, 33884 - 11904: 0x9ED1, 33885 - 11904: 0xDFBC, 33886 - 11904: 0xDFBE, 33887 - 11904: 0xDFCD, 33888 - 11904: 0xDFDE, 33889 - 11904: 0xB8B2, 33890 - 11904: 0xFECD, 33891 - 11904: 0xB8B3, 33892 - 11904: 0x99B9, 33893 - 11904: 0xDFB0, 33894 - 11904: 0xB8AB, 33895 - 11904: 0xDFB4, 33896 - 11904: 0xDFDA, 33897 - 11904: 0xB8B4, 33899 - 11904: 0xB8AC, 33900 - 11904: 0xB8AE, 33901 - 11904: 0xB8B5, 33902 - 11904: 0xDFE0, 33903 - 11904: 0xDFD3, 33904 - 11904: 0xDFCE, 33905 - 11904: 0x8F62, 33906 - 11904: 0x974C, 33907 - 11904: 0xDFBB, 33908 - 11904: 0xDFBA, 33909 - 11904: 0xB8AA, 33910 - 11904: 0xDFAC, 33911 - 11904: 0xB8A7, 33912 - 11904: 0xDFC4, 33913 - 11904: 0xDFAD, 33914 - 11904: 0xDFC2, 33917 - 11904: 0xDFB7, 33918 - 11904: 0xDFDB, 33919 - 11904: 0x91C7, 33920 - 11904: 0x955F, 33922 - 11904: 0xB8A6, 33924 - 11904: 0x87AB, 33926 - 11904: 0xDFB3, 33928 - 11904: 0x99BB, 33933 - 11904: 0xDFAF, 33934 - 11904: 0xDFD5, 33935 - 11904: 0xDFAE, 33936 - 11904: 0xBB60, 33937 - 11904: 0xE3D3, 33938 - 11904: 0x8E6D, 33939 - 11904: 0x8F71, 33940 - 11904: 0xE3C2, 33942 - 11904: 0x94CB, 33943 - 11904: 0xE3AC, 33944 - 11904: 0xE3CA, 33945 - 11904: 0xBB58, 33946 - 11904: 0xE3BB, 33947 - 11904: 0xE3C5, 33948 - 11904: 0xBB5B, 33949 - 11904: 0xE3BE, 33950 - 11904: 0xBB59, 33951 - 11904: 0xE3AF, 33952 - 11904: 0xE3CD, 33953 - 11904: 0xE3AE, 33954 - 11904: 0xE3C1, 33955 - 11904: 0x95B1, 33956 - 11904: 0xE3AD, 33959 - 11904: 0xE3BF, 33960 - 11904: 0xE3C8, 33961 - 11904: 0xE3C6, 33962 - 11904: 0xE3BA, 33963 - 11904: 0xE3B5, 33964 - 11904: 0xE3B3, 33965 - 11904: 0x9AF2, 33966 - 11904: 0xE3B4, 33967 - 11904: 0xE3C7, 33968 - 11904: 0xE3D2, 33969 - 11904: 0xE3BC, 33970 - 11904: 0xBB5A, 33972 - 11904: 0xE3B7, 33974 - 11904: 0xE3CB, 33976 - 11904: 0xBB5D, 33977 - 11904: 0xE3B6, 33978 - 11904: 0xE3B0, 33979 - 11904: 0xE3C0, 33980 - 11904: 0xBB61, 33981 - 11904: 0x96C3, 33982 - 11904: 0x99BD, 33983 - 11904: 0xBB55, 33984 - 11904: 0xBB5E, 33985 - 11904: 0xE3B8, 33986 - 11904: 0xE3B2, 33988 - 11904: 0xBB57, 33989 - 11904: 0xDFD4, 33990 - 11904: 0xBB56, 33991 - 11904: 0xE3C3, 33993 - 11904: 0xBB54, 33994 - 11904: 0xBB63, 33995 - 11904: 0xBB5C, 33996 - 11904: 0xE3C4, 33997 - 11904: 0xE3B9, 33998 - 11904: 0xE3B1, 33999 - 11904: 0xE3CC, 34000 - 11904: 0xE3BD, 34001 - 11904: 0xBB62, 34002 - 11904: 0xE3D0, 34003 - 11904: 0xBB5F, 34004 - 11904: 0xE3CF, 34006 - 11904: 0xE3C9, 34007 - 11904: 0xE3CE, 34010 - 11904: 0xA0CF, 34011 - 11904: 0xE3D1, 34014 - 11904: 0x8F6D, 34017 - 11904: 0x99BE, 34018 - 11904: 0x8EF4, 34020 - 11904: 0x8F72, 34021 - 11904: 0x95E4, 34023 - 11904: 0xE773, 34024 - 11904: 0xE774, 34025 - 11904: 0xE767, 34026 - 11904: 0xE766, 34027 - 11904: 0xE762, 34028 - 11904: 0xBDB4, 34030 - 11904: 0xBDAC, 34031 - 11904: 0xE776, 34032 - 11904: 0xE775, 34033 - 11904: 0xDFA9, 34034 - 11904: 0xE75F, 34035 - 11904: 0xE763, 34036 - 11904: 0xE75D, 34038 - 11904: 0xE770, 34039 - 11904: 0xE761, 34040 - 11904: 0x99BF, 34041 - 11904: 0xE777, 34042 - 11904: 0xE75A, 34043 - 11904: 0xE758, 34044 - 11904: 0xE764, 34045 - 11904: 0xE76E, 34046 - 11904: 0xE769, 34047 - 11904: 0xBDB6, 34048 - 11904: 0xE74F, 34050 - 11904: 0xE76D, 34051 - 11904: 0x9244, 34052 - 11904: 0x87D7, 34053 - 11904: 0xFBA5, 34054 - 11904: 0xBDB7, 34055 - 11904: 0xDFBD, 34056 - 11904: 0xE75B, 34057 - 11904: 0xE752, 34058 - 11904: 0xE755, 34059 - 11904: 0xE77B, 34060 - 11904: 0xE75C, 34061 - 11904: 0xE753, 34062 - 11904: 0xE751, 34063 - 11904: 0xE74E, 34064 - 11904: 0x99C0, 34065 - 11904: 0xBDB0, 34066 - 11904: 0xE765, 34067 - 11904: 0xBDAF, 34068 - 11904: 0xBDB3, 34069 - 11904: 0xE760, 34070 - 11904: 0xE768, 34071 - 11904: 0xBDA9, 34072 - 11904: 0xE778, 34073 - 11904: 0xE77C, 34074 - 11904: 0xBDAB, 34076 - 11904: 0xE757, 34077 - 11904: 0xE76B, 34078 - 11904: 0xE76F, 34079 - 11904: 0xE754, 34080 - 11904: 0xE779, 34081 - 11904: 0xBDB2, 34083 - 11904: 0xBDB1, 34084 - 11904: 0xE74C, 34085 - 11904: 0xBDB5, 34086 - 11904: 0xE772, 34087 - 11904: 0xE756, 34088 - 11904: 0xE76A, 34089 - 11904: 0xE750, 34090 - 11904: 0xE75E, 34091 - 11904: 0xE759, 34092 - 11904: 0xBDAD, 34093 - 11904: 0xBDAE, 34094 - 11904: 0xE76C, 34095 - 11904: 0xE77D, 34096 - 11904: 0xE77A, 34097 - 11904: 0xE771, 34099 - 11904: 0xFDB4, 34100 - 11904: 0x8F77, 34104 - 11904: 0x99C1, 34107 - 11904: 0xE74D, 34109 - 11904: 0xBDAA, 34110 - 11904: 0xEB49, 34112 - 11904: 0xEB40, 34113 - 11904: 0xEB43, 34114 - 11904: 0xFAB9, 34115 - 11904: 0xBFBB, 34116 - 11904: 0xEB45, 34117 - 11904: 0xEAF9, 34118 - 11904: 0xEB41, 34119 - 11904: 0xEB47, 34120 - 11904: 0xBFB8, 34121 - 11904: 0xBFBC, 34122 - 11904: 0xBFB6, 34123 - 11904: 0x8F40, 34124 - 11904: 0xFA44, 34125 - 11904: 0xEAFB, 34126 - 11904: 0xEB4C, 34129 - 11904: 0xEB46, 34130 - 11904: 0x99C2, 34131 - 11904: 0xEAFC, 34132 - 11904: 0xEB55, 34133 - 11904: 0xEB4F, 34134 - 11904: 0xEAF8, 34135 - 11904: 0xEE46, 34136 - 11904: 0xEAFE, 34137 - 11904: 0xBFB7, 34138 - 11904: 0x8F5C, 34139 - 11904: 0xEB4A, 34141 - 11904: 0xEB54, 34142 - 11904: 0xBFBF, 34143 - 11904: 0x8CBD, 34144 - 11904: 0xEB51, 34145 - 11904: 0xEAFD, 34146 - 11904: 0xEB44, 34147 - 11904: 0xEB48, 34148 - 11904: 0xEB42, 34149 - 11904: 0xEB56, 34150 - 11904: 0xEB53, 34151 - 11904: 0xEB50, 34152 - 11904: 0xBFB9, 34153 - 11904: 0xBFBA, 34154 - 11904: 0xBFBE, 34155 - 11904: 0xEAFA, 34156 - 11904: 0xEB57, 34157 - 11904: 0xBFBD, 34158 - 11904: 0xEB4D, 34159 - 11904: 0x99C4, 34160 - 11904: 0x99C5, 34161 - 11904: 0xEB4B, 34163 - 11904: 0x8F7B, 34165 - 11904: 0xEB4E, 34166 - 11904: 0xEE53, 34167 - 11904: 0xEE40, 34168 - 11904: 0xEE45, 34169 - 11904: 0xEE52, 34170 - 11904: 0xEE44, 34171 - 11904: 0xEDFB, 34172 - 11904: 0xEE41, 34174 - 11904: 0xC1A2, 34176 - 11904: 0xEDF4, 34177 - 11904: 0xEE4D, 34178 - 11904: 0xEE4F, 34179 - 11904: 0xEDF3, 34180 - 11904: 0xC1A1, 34181 - 11904: 0xEE51, 34182 - 11904: 0xEE49, 34183 - 11904: 0xC1A8, 34184 - 11904: 0xEE50, 34185 - 11904: 0xEE42, 34186 - 11904: 0xC1AA, 34187 - 11904: 0xEDF9, 34188 - 11904: 0xEB52, 34189 - 11904: 0xEE4A, 34190 - 11904: 0xEE47, 34191 - 11904: 0xEDF5, 34192 - 11904: 0xEE55, 34193 - 11904: 0xC1A4, 34195 - 11904: 0x8776, 34196 - 11904: 0xC1A5, 34197 - 11904: 0xEDF7, 34198 - 11904: 0xEE48, 34199 - 11904: 0x8CB6, 34200 - 11904: 0xEE54, 34201 - 11904: 0xEE4B, 34202 - 11904: 0xEDFD, 34203 - 11904: 0xC1A7, 34204 - 11904: 0xC1A3, 34205 - 11904: 0xEE4C, 34206 - 11904: 0xEDFE, 34207 - 11904: 0xEE56, 34208 - 11904: 0xEDF8, 34209 - 11904: 0xEE43, 34210 - 11904: 0xEE4E, 34211 - 11904: 0xEDFA, 34212 - 11904: 0xEDFC, 34214 - 11904: 0xC2CB, 34215 - 11904: 0xEDF6, 34216 - 11904: 0xC1A9, 34217 - 11904: 0xC2C4, 34218 - 11904: 0xC17E, 34223 - 11904: 0xC1A6, 34224 - 11904: 0xC2C8, 34225 - 11904: 0xF0B3, 34227 - 11904: 0xF0A9, 34228 - 11904: 0xF0A4, 34229 - 11904: 0xF0AA, 34230 - 11904: 0xF0B4, 34231 - 11904: 0xF0B8, 34232 - 11904: 0xF0B7, 34233 - 11904: 0xC2CA, 34234 - 11904: 0xC2C9, 34237 - 11904: 0xF0AB, 34238 - 11904: 0xF0B9, 34239 - 11904: 0xF0AE, 34240 - 11904: 0xF0A6, 34241 - 11904: 0x8FA3, 34242 - 11904: 0xF0A8, 34243 - 11904: 0xF0A7, 34244 - 11904: 0xF0AD, 34245 - 11904: 0xF0B2, 34246 - 11904: 0xF0A5, 34247 - 11904: 0xF0AC, 34248 - 11904: 0xF0B1, 34249 - 11904: 0xC2C7, 34251 - 11904: 0xF0AF, 34253 - 11904: 0xC2C5, 34254 - 11904: 0xF0B0, 34255 - 11904: 0xC2C3, 34256 - 11904: 0xC2C6, 34257 - 11904: 0xF2D5, 34258 - 11904: 0xF0B5, 34261 - 11904: 0xC3C2, 34262 - 11904: 0x8CCE, 34263 - 11904: 0xF2CD, 34264 - 11904: 0xF2D1, 34265 - 11904: 0xF2C9, 34266 - 11904: 0xF2CC, 34268 - 11904: 0xF2D4, 34269 - 11904: 0xC3C0, 34270 - 11904: 0xF2D9, 34271 - 11904: 0xF2D2, 34272 - 11904: 0x99C6, 34273 - 11904: 0xF2CA, 34274 - 11904: 0xF2DA, 34275 - 11904: 0xF2D3, 34276 - 11904: 0xC3C3, 34277 - 11904: 0xC3C4, 34278 - 11904: 0xF2D7, 34280 - 11904: 0xF2CB, 34281 - 11904: 0xC3BF, 34282 - 11904: 0xC3C1, 34283 - 11904: 0xF2C6, 34284 - 11904: 0xF2CE, 34285 - 11904: 0xF2C8, 34286 - 11904: 0x96CD, 34287 - 11904: 0xF2D8, 34288 - 11904: 0xF2D6, 34289 - 11904: 0xF2C7, 34290 - 11904: 0xF2CF, 34294 - 11904: 0xF4BE, 34295 - 11904: 0xC3C5, 34296 - 11904: 0xF2D0, 34297 - 11904: 0xC4A7, 34298 - 11904: 0xC4A9, 34299 - 11904: 0xC4A6, 34300 - 11904: 0x96C7, 34301 - 11904: 0xF4C3, 34302 - 11904: 0xF4BB, 34303 - 11904: 0xF4B9, 34304 - 11904: 0xF4BD, 34305 - 11904: 0xF4BA, 34306 - 11904: 0x8FA5, 34308 - 11904: 0xF4BF, 34309 - 11904: 0xF4C1, 34310 - 11904: 0xC4AA, 34311 - 11904: 0xC4AC, 34313 - 11904: 0xF4C0, 34314 - 11904: 0xC4AD, 34315 - 11904: 0xC4AB, 34316 - 11904: 0xF4C2, 34317 - 11904: 0xFABB, 34319 - 11904: 0x8C61, 34320 - 11904: 0x9570, 34321 - 11904: 0xC4A8, 34323 - 11904: 0x87AF, 34324 - 11904: 0x9368, 34326 - 11904: 0x8F7E, 34327 - 11904: 0xC4F4, 34328 - 11904: 0xF5F1, 34329 - 11904: 0xF5F7, 34330 - 11904: 0xC4F6, 34331 - 11904: 0xF4BC, 34332 - 11904: 0xF5F6, 34334 - 11904: 0xF5FD, 34335 - 11904: 0xF5F4, 34336 - 11904: 0xF5FB, 34337 - 11904: 0xF5FA, 34338 - 11904: 0xF4B8, 34339 - 11904: 0xF5F5, 34340 - 11904: 0xF0B6, 34341 - 11904: 0xF5FE, 34342 - 11904: 0xF5F3, 34343 - 11904: 0xF5F8, 34344 - 11904: 0x8FAA, 34345 - 11904: 0xF5FC, 34346 - 11904: 0xF5F2, 34348 - 11904: 0xF74A, 34349 - 11904: 0xC4F5, 34350 - 11904: 0xF5F9, 34351 - 11904: 0xA050, 34353 - 11904: 0xF7F4, 34354 - 11904: 0xF74B, 34355 - 11904: 0xF749, 34356 - 11904: 0xF747, 34357 - 11904: 0xF748, 34358 - 11904: 0xF74C, 34360 - 11904: 0xC5D9, 34361 - 11904: 0xF7F2, 34362 - 11904: 0xF7F0, 34363 - 11904: 0xF7F5, 34364 - 11904: 0xF7F3, 34366 - 11904: 0xF7F6, 34367 - 11904: 0xC5DA, 34368 - 11904: 0xF7F1, 34370 - 11904: 0x90D3, 34371 - 11904: 0xF8BC, 34373 - 11904: 0x9556, 34374 - 11904: 0xF945, 34375 - 11904: 0xF946, 34376 - 11904: 0xF947, 34379 - 11904: 0xF9C7, 34380 - 11904: 0xF9BD, 34381 - 11904: 0xCA4F, 34382 - 11904: 0xAAEA, 34384 - 11904: 0xAD68, 34386 - 11904: 0xD3B8, 34387 - 11904: 0xD3B7, 34388 - 11904: 0xB040, 34389 - 11904: 0xB342, 34390 - 11904: 0xD77C, 34393 - 11904: 0xD77B, 34395 - 11904: 0xB5EA, 34396 - 11904: 0xB8B8, 34398 - 11904: 0xB8B7, 34399 - 11904: 0xB8B9, 34401 - 11904: 0xE3D4, 34402 - 11904: 0xE77E, 34403 - 11904: 0xEB58, 34404 - 11904: 0xEB5A, 34405 - 11904: 0xEB59, 34407 - 11904: 0xC1AB, 34408 - 11904: 0xEE57, 34409 - 11904: 0xF0BA, 34410 - 11904: 0xF9A5, 34411 - 11904: 0xA6E4, 34412 - 11904: 0x8FB8, 34413 - 11904: 0xCDC9, 34414 - 11904: 0xCDCA, 34415 - 11904: 0xCDC8, 34416 - 11904: 0xCDC7, 34417 - 11904: 0xAAEB, 34418 - 11904: 0x99C8, 34419 - 11904: 0xD0A9, 34420 - 11904: 0xD0A7, 34423 - 11904: 0xD0A6, 34425 - 11904: 0xAD69, 34426 - 11904: 0xAD6B, 34427 - 11904: 0xAD6A, 34428 - 11904: 0xD0A8, 34430 - 11904: 0x8FAF, 34437 - 11904: 0xD3C4, 34438 - 11904: 0xD3C1, 34439 - 11904: 0xD3BF, 34442 - 11904: 0xB041, 34443 - 11904: 0xD3C2, 34444 - 11904: 0xB046, 34445 - 11904: 0xD3BC, 34446 - 11904: 0xD3CB, 34448 - 11904: 0xD3CD, 34449 - 11904: 0xD3BD, 34450 - 11904: 0x99C9, 34451 - 11904: 0xB043, 34452 - 11904: 0xD3CE, 34453 - 11904: 0xD3C9, 34454 - 11904: 0xD3BB, 34455 - 11904: 0xD3C0, 34456 - 11904: 0xD3CA, 34457 - 11904: 0xD3C6, 34458 - 11904: 0xD3C3, 34460 - 11904: 0xB048, 34461 - 11904: 0xD3CC, 34462 - 11904: 0xD3BE, 34464 - 11904: 0x9579, 34465 - 11904: 0xD3C7, 34466 - 11904: 0xD3B9, 34467 - 11904: 0xB047, 34468 - 11904: 0xB044, 34469 - 11904: 0xD3C5, 34471 - 11904: 0xD3C8, 34472 - 11904: 0xD3BA, 34473 - 11904: 0xB045, 34474 - 11904: 0xB042, 34477 - 11904: 0x9F49, 34479 - 11904: 0xB34C, 34480 - 11904: 0xD7A5, 34481 - 11904: 0xB34B, 34482 - 11904: 0x99CA, 34483 - 11904: 0xD7A8, 34484 - 11904: 0xD7AB, 34485 - 11904: 0xB348, 34486 - 11904: 0xB346, 34487 - 11904: 0xD77E, 34488 - 11904: 0xD7A9, 34489 - 11904: 0xD7A7, 34490 - 11904: 0xD7A4, 34491 - 11904: 0xD7AC, 34492 - 11904: 0xD7AD, 34493 - 11904: 0xD7AF, 34494 - 11904: 0xD7B0, 34495 - 11904: 0xD77D, 34496 - 11904: 0xB345, 34497 - 11904: 0xD7A2, 34498 - 11904: 0xD7A1, 34499 - 11904: 0xD7AE, 34500 - 11904: 0xB347, 34501 - 11904: 0xD7A3, 34502 - 11904: 0xB349, 34503 - 11904: 0xB344, 34504 - 11904: 0xD7A6, 34505 - 11904: 0xB34D, 34507 - 11904: 0xB34A, 34508 - 11904: 0xD7AA, 34512 - 11904: 0xB5F1, 34513 - 11904: 0xDBBF, 34515 - 11904: 0xDBB4, 34516 - 11904: 0xB5EE, 34518 - 11904: 0xDFE7, 34519 - 11904: 0xDBBD, 34520 - 11904: 0xDBB1, 34521 - 11904: 0xB5EC, 34522 - 11904: 0xDBB6, 34523 - 11904: 0xB5EF, 34524 - 11904: 0xDBBA, 34525 - 11904: 0xDBB8, 34526 - 11904: 0xB5F2, 34527 - 11904: 0xB5EB, 34530 - 11904: 0xDBB2, 34531 - 11904: 0xDBB5, 34532 - 11904: 0xB5F0, 34534 - 11904: 0xDBB3, 34536 - 11904: 0xDBBE, 34537 - 11904: 0xDBBC, 34538 - 11904: 0xDBB7, 34539 - 11904: 0xDBB9, 34540 - 11904: 0xDBBB, 34541 - 11904: 0xB5ED, 34543 - 11904: 0x99CB, 34549 - 11904: 0xDFE8, 34550 - 11904: 0xDFEE, 34551 - 11904: 0xDFE4, 34552 - 11904: 0xDFEA, 34553 - 11904: 0xB8BA, 34554 - 11904: 0xDFE6, 34555 - 11904: 0xB8C0, 34558 - 11904: 0xB8BF, 34560 - 11904: 0xB8BE, 34561 - 11904: 0xDFED, 34562 - 11904: 0xB8C1, 34563 - 11904: 0xB8C2, 34564 - 11904: 0xDFE3, 34565 - 11904: 0xDFF0, 34566 - 11904: 0xB8C3, 34567 - 11904: 0xB8BD, 34568 - 11904: 0xB8BC, 34569 - 11904: 0xDFEC, 34570 - 11904: 0xB8C4, 34571 - 11904: 0xDFE2, 34572 - 11904: 0xDFE5, 34573 - 11904: 0xDFEF, 34574 - 11904: 0xDFEB, 34577 - 11904: 0xE3F4, 34578 - 11904: 0xE3E9, 34579 - 11904: 0xB8BB, 34584 - 11904: 0xBB6A, 34585 - 11904: 0xE3DD, 34586 - 11904: 0xE3F2, 34587 - 11904: 0xE3DE, 34588 - 11904: 0xBB65, 34590 - 11904: 0xE3DB, 34592 - 11904: 0xE3E4, 34593 - 11904: 0xE3DC, 34594 - 11904: 0xBB67, 34595 - 11904: 0xE3D6, 34596 - 11904: 0xE3F1, 34597 - 11904: 0xBB68, 34598 - 11904: 0xE3EE, 34599 - 11904: 0xE3EF, 34600 - 11904: 0xE3D7, 34601 - 11904: 0xBB6D, 34602 - 11904: 0xE3E6, 34604 - 11904: 0xE3E0, 34605 - 11904: 0xE3E7, 34606 - 11904: 0xE3DA, 34608 - 11904: 0xE3F3, 34609 - 11904: 0xE3EB, 34610 - 11904: 0xE3E5, 34611 - 11904: 0xE3D5, 34612 - 11904: 0xBB69, 34613 - 11904: 0xE3EC, 34615 - 11904: 0xBB6C, 34616 - 11904: 0xE3F0, 34618 - 11904: 0xE3EA, 34619 - 11904: 0xBB66, 34620 - 11904: 0xE3E8, 34622 - 11904: 0xE3E2, 34623 - 11904: 0xBB64, 34624 - 11904: 0xE3D9, 34625 - 11904: 0xE3E1, 34626 - 11904: 0xE3ED, 34627 - 11904: 0xE3DF, 34630 - 11904: 0xE3E3, 34636 - 11904: 0xBDC1, 34637 - 11904: 0xDFE9, 34638 - 11904: 0xE7B2, 34639 - 11904: 0xE7BB, 34640 - 11904: 0xE7B1, 34641 - 11904: 0xE7AD, 34642 - 11904: 0xE7AA, 34643 - 11904: 0xBDC2, 34644 - 11904: 0xE7A8, 34645 - 11904: 0xBB6B, 34646 - 11904: 0xE7A1, 34647 - 11904: 0xBDC0, 34648 - 11904: 0xE7A7, 34649 - 11904: 0xBDBF, 34650 - 11904: 0xE7AC, 34651 - 11904: 0xE7A9, 34652 - 11904: 0xE7B9, 34653 - 11904: 0xE7B4, 34654 - 11904: 0xE7AE, 34655 - 11904: 0xE7B3, 34656 - 11904: 0xBDBB, 34657 - 11904: 0xE7AB, 34658 - 11904: 0xE7BE, 34659 - 11904: 0xE7A2, 34660 - 11904: 0xE7A3, 34661 - 11904: 0xE7BA, 34662 - 11904: 0xBDBC, 34663 - 11904: 0xE7BF, 34664 - 11904: 0xBDBE, 34665 - 11904: 0xE7C0, 34666 - 11904: 0xE7B0, 34667 - 11904: 0xE3D8, 34668 - 11904: 0xE7B6, 34669 - 11904: 0xE7AF, 34670 - 11904: 0xE7B8, 34671 - 11904: 0xE7B5, 34672 - 11904: 0x9DD5, 34673 - 11904: 0x8FB0, 34675 - 11904: 0xE7A6, 34676 - 11904: 0xBDB9, 34677 - 11904: 0xE7BD, 34678 - 11904: 0xBDBA, 34679 - 11904: 0xE7A4, 34680 - 11904: 0xBDBD, 34681 - 11904: 0xEB64, 34682 - 11904: 0xE7B7, 34683 - 11904: 0xE7BC, 34685 - 11904: 0xFA7A, 34689 - 11904: 0xEB61, 34690 - 11904: 0xBDB8, 34691 - 11904: 0xBFC0, 34692 - 11904: 0xEB6B, 34693 - 11904: 0xEB67, 34694 - 11904: 0x9E5F, 34695 - 11904: 0xEB65, 34696 - 11904: 0xEB60, 34697 - 11904: 0xEB6F, 34699 - 11904: 0x99CD, 34700 - 11904: 0xA0C9, 34701 - 11904: 0xBFC4, 34703 - 11904: 0xEB5C, 34704 - 11904: 0xEB68, 34705 - 11904: 0xEB69, 34706 - 11904: 0xEB5F, 34707 - 11904: 0xEB5E, 34708 - 11904: 0xEB6C, 34710 - 11904: 0xEB62, 34711 - 11904: 0xEB5D, 34712 - 11904: 0xEB63, 34714 - 11904: 0xEB6E, 34715 - 11904: 0xEB5B, 34716 - 11904: 0xEB6D, 34717 - 11904: 0xEB6A, 34718 - 11904: 0xBFC2, 34719 - 11904: 0xBFC1, 34722 - 11904: 0xBFC3, 34723 - 11904: 0xEB66, 34724 - 11904: 0xF0CB, 34725 - 11904: 0x9ADB, 34729 - 11904: 0xA0C6, 34730 - 11904: 0xEE59, 34731 - 11904: 0xC1B1, 34732 - 11904: 0xEE5D, 34733 - 11904: 0xEE5A, 34734 - 11904: 0xEE61, 34735 - 11904: 0xEE67, 34736 - 11904: 0xEE5C, 34737 - 11904: 0x8FB4, 34738 - 11904: 0xEE70, 34739 - 11904: 0xC1AE, 34740 - 11904: 0xEE6A, 34741 - 11904: 0xEE5F, 34742 - 11904: 0xEE6B, 34743 - 11904: 0xEE66, 34744 - 11904: 0xEE6D, 34745 - 11904: 0xEE5E, 34746 - 11904: 0xC1B3, 34747 - 11904: 0xC1B2, 34748 - 11904: 0xEE60, 34749 - 11904: 0xEE6E, 34750 - 11904: 0xEE58, 34751 - 11904: 0xEE6C, 34752 - 11904: 0xC1AC, 34753 - 11904: 0xA0D7, 34754 - 11904: 0xEE64, 34755 - 11904: 0xEE63, 34756 - 11904: 0xEE68, 34757 - 11904: 0xEE5B, 34758 - 11904: 0xC1B0, 34760 - 11904: 0xC1B4, 34761 - 11904: 0xEE62, 34762 - 11904: 0xEE69, 34763 - 11904: 0xC1B5, 34764 - 11904: 0xEE65, 34766 - 11904: 0xA0C7, 34769 - 11904: 0xC1AD, 34770 - 11904: 0xC1AF, 34771 - 11904: 0xF0C7, 34772 - 11904: 0xF0C5, 34774 - 11904: 0xA043, 34775 - 11904: 0xF0CC, 34776 - 11904: 0xF0C9, 34777 - 11904: 0xF0CD, 34778 - 11904: 0x8FB5, 34779 - 11904: 0xF0BE, 34780 - 11904: 0xF0C6, 34781 - 11904: 0xF0D1, 34782 - 11904: 0xEE6F, 34783 - 11904: 0xF0C2, 34784 - 11904: 0xC2CF, 34785 - 11904: 0xE7A5, 34786 - 11904: 0xF0BD, 34787 - 11904: 0xF0CA, 34788 - 11904: 0xF0C4, 34789 - 11904: 0xF0C1, 34790 - 11904: 0xF0BC, 34791 - 11904: 0xF0BB, 34792 - 11904: 0xF0D0, 34794 - 11904: 0xF0C0, 34795 - 11904: 0xF0BF, 34796 - 11904: 0xC2CD, 34797 - 11904: 0xF0C8, 34798 - 11904: 0x8FB2, 34799 - 11904: 0xC2CC, 34802 - 11904: 0xC2CE, 34803 - 11904: 0xF0C3, 34804 - 11904: 0xF0CF, 34805 - 11904: 0xA061, 34806 - 11904: 0xF2DE, 34807 - 11904: 0xF2DF, 34809 - 11904: 0xC3C9, 34810 - 11904: 0xF2DC, 34811 - 11904: 0xC3C6, 34812 - 11904: 0xF2E4, 34814 - 11904: 0xC3CA, 34815 - 11904: 0xF2E6, 34816 - 11904: 0xF2DB, 34817 - 11904: 0xF0CE, 34818 - 11904: 0xF2E8, 34819 - 11904: 0xF2DD, 34820 - 11904: 0x9E5E, 34821 - 11904: 0xC3C7, 34822 - 11904: 0xF2E3, 34824 - 11904: 0xF2E5, 34825 - 11904: 0xF2E0, 34826 - 11904: 0xF2E7, 34827 - 11904: 0xF2E2, 34828 - 11904: 0xF2E1, 34829 - 11904: 0xC3C8, 34831 - 11904: 0xA063, 34832 - 11904: 0xF4C5, 34833 - 11904: 0xF4C6, 34835 - 11904: 0xF4C8, 34836 - 11904: 0xC4AE, 34837 - 11904: 0xC4AF, 34838 - 11904: 0xF4C9, 34839 - 11904: 0xF4C7, 34840 - 11904: 0x9FE8, 34841 - 11904: 0xF4C4, 34843 - 11904: 0xF642, 34844 - 11904: 0xF645, 34845 - 11904: 0xF641, 34847 - 11904: 0xC4FA, 34848 - 11904: 0xF643, 34849 - 11904: 0xC4F9, 34850 - 11904: 0xC4F8, 34851 - 11904: 0xC4F7, 34852 - 11904: 0xF644, 34853 - 11904: 0xF751, 34854 - 11904: 0xF74F, 34855 - 11904: 0x9CB2, 34856 - 11904: 0xF74E, 34857 - 11904: 0xF640, 34858 - 11904: 0xF750, 34859 - 11904: 0xF646, 34860 - 11904: 0xF74D, 34861 - 11904: 0x957C, 34862 - 11904: 0xF7F9, 34863 - 11904: 0xF7D7, 34864 - 11904: 0xF7F7, 34865 - 11904: 0xC5DB, 34866 - 11904: 0xF7F8, 34867 - 11904: 0xF7FA, 34869 - 11904: 0xF8BF, 34870 - 11904: 0xC5FA, 34871 - 11904: 0xF8BE, 34872 - 11904: 0xF8BD, 34873 - 11904: 0xC5FB, 34875 - 11904: 0xC65A, 34876 - 11904: 0xF96E, 34877 - 11904: 0xF9A7, 34878 - 11904: 0xF9A6, 34879 - 11904: 0xF9A8, 34880 - 11904: 0xA6E5, 34881 - 11904: 0xD0AA, 34882 - 11904: 0x9FC7, 34883 - 11904: 0xD3CF, 34884 - 11904: 0xD3D0, 34885 - 11904: 0x8FBB, 34886 - 11904: 0x8FBC, 34888 - 11904: 0xDBC0, 34890 - 11904: 0xF647, 34891 - 11904: 0xF8C0, 34892 - 11904: 0xA6E6, 34893 - 11904: 0xAD6C, 34894 - 11904: 0xD0AB, 34895 - 11904: 0x8FEC, 34898 - 11904: 0xD7B1, 34899 - 11904: 0xB34E, 34901 - 11904: 0xDBC2, 34902 - 11904: 0xDBC1, 34903 - 11904: 0xB5F3, 34905 - 11904: 0xB8C5, 34906 - 11904: 0xE7C1, 34907 - 11904: 0xBDC3, 34909 - 11904: 0xBDC4, 34910 - 11904: 0x8FC0, 34912 - 11904: 0x936A, 34913 - 11904: 0xBFC5, 34914 - 11904: 0xC5FC, 34915 - 11904: 0xA6E7, 34916 - 11904: 0x8BE4, 34917 - 11904: 0x9C7C, 34919 - 11904: 0xD0AC, 34920 - 11904: 0xAAED, 34921 - 11904: 0xD0AE, 34922 - 11904: 0xD0AD, 34923 - 11904: 0xAD6D, 34925 - 11904: 0xD3D1, 34926 - 11904: 0x95A1, 34927 - 11904: 0xD3D8, 34928 - 11904: 0xB049, 34929 - 11904: 0xD3D6, 34930 - 11904: 0xD3D4, 34932 - 11904: 0xD3DB, 34933 - 11904: 0xD3D2, 34934 - 11904: 0xD3D3, 34935 - 11904: 0xB04A, 34937 - 11904: 0xB04E, 34940 - 11904: 0xD3DC, 34941 - 11904: 0xB04D, 34942 - 11904: 0xD3DA, 34943 - 11904: 0xD3D7, 34944 - 11904: 0xD3D5, 34945 - 11904: 0xB04B, 34946 - 11904: 0xB04C, 34947 - 11904: 0xD3D9, 34948 - 11904: 0xFEEC, 34951 - 11904: 0x95A3, 34952 - 11904: 0xB350, 34953 - 11904: 0xD7B2, 34955 - 11904: 0xB355, 34956 - 11904: 0xD7C2, 34957 - 11904: 0xB354, 34958 - 11904: 0xD7C4, 34959 - 11904: 0x8C45, 34960 - 11904: 0x8CB8, 34961 - 11904: 0xD7B8, 34962 - 11904: 0xB352, 34963 - 11904: 0xD7C3, 34965 - 11904: 0xD7B3, 34966 - 11904: 0xB353, 34967 - 11904: 0xD7BF, 34968 - 11904: 0xD7BB, 34969 - 11904: 0xD7BD, 34970 - 11904: 0xD7B7, 34971 - 11904: 0xD7BE, 34972 - 11904: 0x8FC1, 34973 - 11904: 0x87B7, 34974 - 11904: 0xB34F, 34975 - 11904: 0xD7BA, 34976 - 11904: 0xA052, 34977 - 11904: 0xD7B9, 34978 - 11904: 0xD7B5, 34980 - 11904: 0xD7C0, 34983 - 11904: 0xD7BC, 34984 - 11904: 0xD7B4, 34986 - 11904: 0xD7B6, 34987 - 11904: 0xB351, 34988 - 11904: 0xD7C1, 34990 - 11904: 0x99D0, 34993 - 11904: 0xB5F6, 34994 - 11904: 0xDBCD, 34996 - 11904: 0x8FC3, 34997 - 11904: 0x8FC4, 34998 - 11904: 0xDBC9, 34999 - 11904: 0xDBCB, 35000 - 11904: 0xDBC6, 35001 - 11904: 0xDBC5, 35002 - 11904: 0xDBC3, 35004 - 11904: 0xDBCA, 35005 - 11904: 0xDBCC, 35006 - 11904: 0xDBC8, 35007 - 11904: 0x95A4, 35008 - 11904: 0xDBC7, 35009 - 11904: 0xB5F4, 35010 - 11904: 0xB5F5, 35013 - 11904: 0x8FC6, 35015 - 11904: 0x9E60, 35017 - 11904: 0xDBCF, 35018 - 11904: 0xB8CD, 35019 - 11904: 0xDFF2, 35020 - 11904: 0xDFF8, 35021 - 11904: 0xDFF3, 35022 - 11904: 0xDFF4, 35023 - 11904: 0xF9D8, 35024 - 11904: 0xDFF9, 35026 - 11904: 0xB8CF, 35028 - 11904: 0xB8C7, 35029 - 11904: 0xB8CE, 35030 - 11904: 0xDFF1, 35031 - 11904: 0xDBC4, 35032 - 11904: 0xB8CA, 35033 - 11904: 0xB8C8, 35034 - 11904: 0xDFF7, 35035 - 11904: 0xDFF6, 35036 - 11904: 0xB8C9, 35037 - 11904: 0xB8CB, 35038 - 11904: 0xDFF5, 35039 - 11904: 0xB8C6, 35041 - 11904: 0xB8CC, 35046 - 11904: 0x95A5, 35047 - 11904: 0xE3F6, 35048 - 11904: 0xBB74, 35051 - 11904: 0xE442, 35052 - 11904: 0xE441, 35054 - 11904: 0xE3FB, 35055 - 11904: 0xBB76, 35056 - 11904: 0xE440, 35057 - 11904: 0xE3F7, 35058 - 11904: 0xE3F8, 35059 - 11904: 0xBB6E, 35060 - 11904: 0xBB70, 35061 - 11904: 0x9CB3, 35062 - 11904: 0xE3FD, 35063 - 11904: 0xE3F5, 35064 - 11904: 0xBB72, 35065 - 11904: 0xBB71, 35066 - 11904: 0xE3F9, 35067 - 11904: 0xE3FE, 35068 - 11904: 0xE3FC, 35069 - 11904: 0xBB73, 35070 - 11904: 0xE3FA, 35071 - 11904: 0x99D1, 35072 - 11904: 0xFEF1, 35073 - 11904: 0xDBCE, 35074 - 11904: 0xBB6F, 35077 - 11904: 0xE7C2, 35078 - 11904: 0xE7C9, 35079 - 11904: 0xBDC6, 35081 - 11904: 0xE7CD, 35082 - 11904: 0xBDCA, 35083 - 11904: 0xE7C5, 35084 - 11904: 0xE7C3, 35086 - 11904: 0xE7CC, 35088 - 11904: 0xBDC5, 35089 - 11904: 0xE7CB, 35090 - 11904: 0xBDC7, 35091 - 11904: 0xBDC8, 35092 - 11904: 0xE7C4, 35093 - 11904: 0xBDC9, 35094 - 11904: 0xE7CA, 35095 - 11904: 0xE7C6, 35096 - 11904: 0xE7C7, 35097 - 11904: 0xE7C8, 35098 - 11904: 0xBB75, 35102 - 11904: 0xEB70, 35103 - 11904: 0xEB7C, 35105 - 11904: 0xBFCA, 35106 - 11904: 0xEB77, 35107 - 11904: 0xEB79, 35108 - 11904: 0x99D2, 35109 - 11904: 0xBFC8, 35110 - 11904: 0xEB71, 35111 - 11904: 0xEB75, 35113 - 11904: 0xEB78, 35114 - 11904: 0xBFC6, 35115 - 11904: 0xBFC9, 35116 - 11904: 0xEB7B, 35117 - 11904: 0xEB73, 35118 - 11904: 0xEB74, 35119 - 11904: 0xEB7A, 35120 - 11904: 0xEB72, 35121 - 11904: 0xEB76, 35122 - 11904: 0xBFC7, 35123 - 11904: 0xEE72, 35125 - 11904: 0xEE71, 35126 - 11904: 0xC1B7, 35127 - 11904: 0xEE77, 35128 - 11904: 0xC1B9, 35131 - 11904: 0xC1B6, 35132 - 11904: 0xEE73, 35133 - 11904: 0xC1BA, 35134 - 11904: 0xEE74, 35137 - 11904: 0xEE75, 35138 - 11904: 0xEE78, 35139 - 11904: 0x9CC2, 35140 - 11904: 0xC1B8, 35142 - 11904: 0xF0D6, 35143 - 11904: 0x99D3, 35145 - 11904: 0xF0D9, 35147 - 11904: 0xF0D3, 35148 - 11904: 0xF0D5, 35149 - 11904: 0x95A7, 35151 - 11904: 0xF0D4, 35152 - 11904: 0xF0D7, 35153 - 11904: 0xF0D8, 35154 - 11904: 0xEE76, 35155 - 11904: 0xF0D2, 35156 - 11904: 0x95A9, 35158 - 11904: 0xC3CD, 35159 - 11904: 0xF2EC, 35160 - 11904: 0xF2EF, 35161 - 11904: 0xF2F1, 35162 - 11904: 0xF2EA, 35163 - 11904: 0xF2EB, 35164 - 11904: 0xF2EE, 35165 - 11904: 0xF2F0, 35166 - 11904: 0xC3CE, 35167 - 11904: 0xC3CC, 35168 - 11904: 0xC3CB, 35169 - 11904: 0xF2ED, 35170 - 11904: 0xF2E9, 35171 - 11904: 0xF4CA, 35172 - 11904: 0xC4B0, 35173 - 11904: 0x95A6, 35174 - 11904: 0xF4CB, 35177 - 11904: 0xF649, 35178 - 11904: 0xC4FB, 35179 - 11904: 0xF64B, 35180 - 11904: 0xC4FC, 35181 - 11904: 0xF648, 35182 - 11904: 0xF64A, 35183 - 11904: 0xC5A8, 35185 - 11904: 0xF752, 35186 - 11904: 0xC5A7, 35187 - 11904: 0xF7FD, 35188 - 11904: 0xF7FC, 35190 - 11904: 0xF7FB, 35191 - 11904: 0x9C5D, 35193 - 11904: 0xF948, 35194 - 11904: 0xF949, 35195 - 11904: 0xF94B, 35196 - 11904: 0xF94A, 35198 - 11904: 0xCA50, 35199 - 11904: 0xA6E8, 35200 - 11904: 0x98E2, 35201 - 11904: 0xAD6E, 35202 - 11904: 0xD7C5, 35203 - 11904: 0xB5F7, 35205 - 11904: 0xDFFA, 35206 - 11904: 0xC2D0, 35207 - 11904: 0x8FC9, 35208 - 11904: 0xF2F2, 35209 - 11904: 0xA0C2, 35210 - 11904: 0x8FCA, 35211 - 11904: 0xA8A3, 35215 - 11904: 0xB357, 35217 - 11904: 0x99D4, 35219 - 11904: 0xB356, 35220 - 11904: 0xA0B9, 35221 - 11904: 0xDBD0, 35222 - 11904: 0xB5F8, 35223 - 11904: 0xDBD2, 35224 - 11904: 0xDBD1, 35227 - 11904: 0xDFFB, 35228 - 11904: 0xB8D0, 35229 - 11904: 0xE443, 35230 - 11904: 0xE446, 35231 - 11904: 0xE445, 35233 - 11904: 0xE444, 35234 - 11904: 0xE7CE, 35235 - 11904: 0xE7D0, 35236 - 11904: 0xE7CF, 35237 - 11904: 0x9B58, 35238 - 11904: 0xBFCC, 35239 - 11904: 0x8FCD, 35241 - 11904: 0xA0D4, 35242 - 11904: 0xBFCB, 35244 - 11904: 0xC1BB, 35245 - 11904: 0xEE79, 35246 - 11904: 0xEE7B, 35247 - 11904: 0xEE7A, 35250 - 11904: 0xC2D1, 35254 - 11904: 0xF2F4, 35255 - 11904: 0xF2F3, 35257 - 11904: 0xF4CC, 35258 - 11904: 0xC4B1, 35260 - 11904: 0x8FCE, 35261 - 11904: 0xC4FD, 35262 - 11904: 0xF754, 35263 - 11904: 0xF753, 35264 - 11904: 0xC65B, 35265 - 11904: 0x8BE5, 35270 - 11904: 0x8979, 35282 - 11904: 0xA8A4, 35283 - 11904: 0xD0AF, 35284 - 11904: 0xAD6F, 35285 - 11904: 0xD7C8, 35286 - 11904: 0xD7C6, 35289 - 11904: 0xD7C7, 35290 - 11904: 0xDBD4, 35291 - 11904: 0xDBD5, 35292 - 11904: 0xE043, 35293 - 11904: 0xDBD3, 35295 - 11904: 0xDFFC, 35296 - 11904: 0xE041, 35297 - 11904: 0xE040, 35298 - 11904: 0xE042, 35299 - 11904: 0xB8D1, 35300 - 11904: 0xDFFE, 35301 - 11904: 0xDFFD, 35302 - 11904: 0xE044, 35303 - 11904: 0x8FD0, 35304 - 11904: 0xE449, 35305 - 11904: 0xE447, 35307 - 11904: 0xE448, 35308 - 11904: 0xE7D3, 35309 - 11904: 0xE7D1, 35312 - 11904: 0xE7D2, 35313 - 11904: 0xEB7D, 35314 - 11904: 0xEE7C, 35315 - 11904: 0xEE7D, 35316 - 11904: 0xC2D2, 35318 - 11904: 0xF2F5, 35319 - 11904: 0xF4CD, 35320 - 11904: 0xC4B2, 35322 - 11904: 0xF64C, 35323 - 11904: 0xF755, 35324 - 11904: 0xC5A9, 35326 - 11904: 0xF7FE, 35327 - 11904: 0xF94C, 35328 - 11904: 0xA8A5, 35330 - 11904: 0xAD71, 35331 - 11904: 0xAD72, 35332 - 11904: 0xD0B0, 35335 - 11904: 0xD0B1, 35336 - 11904: 0xAD70, 35338 - 11904: 0xB054, 35340 - 11904: 0xB052, 35342 - 11904: 0xB051, 35343 - 11904: 0xB058, 35344 - 11904: 0xB050, 35345 - 11904: 0xB059, 35346 - 11904: 0xD3DD, 35347 - 11904: 0xB056, 35349 - 11904: 0xB053, 35350 - 11904: 0xB057, 35351 - 11904: 0xB055, 35352 - 11904: 0xB04F, 35355 - 11904: 0xB35F, 35356 - 11904: 0x95B6, 35357 - 11904: 0xB359, 35358 - 11904: 0xD7CC, 35359 - 11904: 0xB35E, 35362 - 11904: 0xB360, 35363 - 11904: 0xB35A, 35365 - 11904: 0xB35B, 35367 - 11904: 0xD7CA, 35369 - 11904: 0x99D6, 35370 - 11904: 0xB358, 35371 - 11904: 0x95E5, 35372 - 11904: 0xD7CB, 35373 - 11904: 0xB35D, 35376 - 11904: 0xD7C9, 35377 - 11904: 0xB35C, 35380 - 11904: 0xB644, 35382 - 11904: 0xB646, 35384 - 11904: 0x99D7, 35385 - 11904: 0xDBD8, 35386 - 11904: 0xB645, 35387 - 11904: 0xB5F9, 35388 - 11904: 0xB5FD, 35389 - 11904: 0x95B5, 35390 - 11904: 0xB8E4, 35391 - 11904: 0xE049, 35392 - 11904: 0xDBDA, 35393 - 11904: 0xB5FE, 35396 - 11904: 0xDBDD, 35397 - 11904: 0xDBDE, 35398 - 11904: 0xB643, 35400 - 11904: 0xDBE0, 35401 - 11904: 0xA0CA, 35402 - 11904: 0xDBE2, 35404 - 11904: 0xDBE3, 35405 - 11904: 0xDBD7, 35406 - 11904: 0xDBD6, 35407 - 11904: 0xDBE4, 35408 - 11904: 0xB642, 35409 - 11904: 0xDBE1, 35410 - 11904: 0xDBDF, 35412 - 11904: 0xB640, 35413 - 11904: 0xB5FB, 35414 - 11904: 0xB647, 35415 - 11904: 0xDBDB, 35416 - 11904: 0xDBDC, 35417 - 11904: 0xDBD9, 35419 - 11904: 0xB641, 35422 - 11904: 0xB5FC, 35424 - 11904: 0xB5FA, 35425 - 11904: 0xE048, 35426 - 11904: 0xB8DF, 35427 - 11904: 0xB8DA, 35430 - 11904: 0xB8D5, 35431 - 11904: 0x9FFD, 35432 - 11904: 0xB8E5, 35433 - 11904: 0xB8D6, 35435 - 11904: 0xB8D2, 35436 - 11904: 0xB8E1, 35437 - 11904: 0xB8DE, 35438 - 11904: 0xB8E0, 35440 - 11904: 0xB8D7, 35441 - 11904: 0xB8DC, 35442 - 11904: 0xB8D3, 35443 - 11904: 0xB8D4, 35444 - 11904: 0xE050, 35445 - 11904: 0xE04D, 35446 - 11904: 0xE045, 35447 - 11904: 0xE04A, 35449 - 11904: 0xB8E2, 35450 - 11904: 0xE051, 35451 - 11904: 0xB8E3, 35452 - 11904: 0xB8D9, 35454 - 11904: 0xA058, 35455 - 11904: 0xE047, 35457 - 11904: 0xE04F, 35458 - 11904: 0xE04B, 35459 - 11904: 0xE04E, 35460 - 11904: 0xE04C, 35461 - 11904: 0xB8DD, 35462 - 11904: 0xE046, 35463 - 11904: 0xB8D8, 35467 - 11904: 0xE44C, 35468 - 11904: 0xBB78, 35469 - 11904: 0xBB7B, 35471 - 11904: 0xE44E, 35472 - 11904: 0x8FD6, 35473 - 11904: 0xBBA5, 35474 - 11904: 0xE44D, 35475 - 11904: 0xBB7D, 35476 - 11904: 0x99D8, 35477 - 11904: 0xBDCF, 35478 - 11904: 0xE44F, 35480 - 11904: 0xBBA4, 35481 - 11904: 0xE44B, 35482 - 11904: 0xBBA6, 35484 - 11904: 0x8FD3, 35486 - 11904: 0xBB79, 35488 - 11904: 0xB8DB, 35489 - 11904: 0xBB7C, 35491 - 11904: 0xBB7A, 35492 - 11904: 0xBB7E, 35493 - 11904: 0xBBA2, 35494 - 11904: 0xBB77, 35495 - 11904: 0xBBA7, 35496 - 11904: 0xBBA3, 35497 - 11904: 0x8FE5, 35498 - 11904: 0xBBA1, 35499 - 11904: 0xE44A, 35503 - 11904: 0x8FE9, 35504 - 11904: 0xBDD6, 35506 - 11904: 0xBDD2, 35508 - 11904: 0x99D9, 35510 - 11904: 0xBDD9, 35512 - 11904: 0xE7D6, 35513 - 11904: 0xBDDA, 35514 - 11904: 0xE7E2, 35515 - 11904: 0xE7DB, 35516 - 11904: 0xBDCB, 35517 - 11904: 0xE7E3, 35518 - 11904: 0xE7DD, 35519 - 11904: 0xBDD5, 35520 - 11904: 0xE7DE, 35522 - 11904: 0xBDD4, 35523 - 11904: 0xE7E1, 35524 - 11904: 0xBDCE, 35525 - 11904: 0xE7DF, 35526 - 11904: 0xE7D5, 35527 - 11904: 0xBDCD, 35528 - 11904: 0xEBAA, 35529 - 11904: 0xBDD3, 35531 - 11904: 0xBDD0, 35532 - 11904: 0x8CF7, 35533 - 11904: 0xBDD8, 35535 - 11904: 0xE7D4, 35537 - 11904: 0xE7D8, 35538 - 11904: 0xBDCC, 35539 - 11904: 0xE7D7, 35540 - 11904: 0xE7D9, 35541 - 11904: 0xE7DA, 35542 - 11904: 0xBDD7, 35543 - 11904: 0xE7DC, 35544 - 11904: 0xE7E0, 35545 - 11904: 0xE7E4, 35546 - 11904: 0x927C, 35547 - 11904: 0xBDDB, 35548 - 11904: 0xBFD2, 35549 - 11904: 0xEBA5, 35550 - 11904: 0xEBAB, 35551 - 11904: 0xEBA8, 35552 - 11904: 0xEB7E, 35553 - 11904: 0xEBAC, 35554 - 11904: 0xEBA1, 35556 - 11904: 0xEBA7, 35558 - 11904: 0xBFCD, 35559 - 11904: 0xBFD3, 35560 - 11904: 0xEBAD, 35562 - 11904: 0x9C45, 35563 - 11904: 0xBFCF, 35565 - 11904: 0xBFD9, 35566 - 11904: 0xBFD4, 35567 - 11904: 0xEBAF, 35568 - 11904: 0xEBA9, 35569 - 11904: 0xBFD0, 35570 - 11904: 0xEBA2, 35571 - 11904: 0xBFDA, 35572 - 11904: 0xEBA3, 35573 - 11904: 0xEBA4, 35574 - 11904: 0xBFDB, 35575 - 11904: 0xBFD8, 35576 - 11904: 0xBDD1, 35577 - 11904: 0x8CE8, 35578 - 11904: 0xBFCE, 35579 - 11904: 0xEBB0, 35580 - 11904: 0xBFDC, 35582 - 11904: 0xBFD5, 35583 - 11904: 0xEBAE, 35584 - 11904: 0xBFD1, 35585 - 11904: 0xBFD6, 35586 - 11904: 0xBFD7, 35588 - 11904: 0xC1C3, 35589 - 11904: 0xEEA4, 35590 - 11904: 0xEEAD, 35591 - 11904: 0xEEAA, 35592 - 11904: 0xEEAC, 35594 - 11904: 0xC1C0, 35595 - 11904: 0xEEA5, 35596 - 11904: 0x8FDE, 35597 - 11904: 0xEEAB, 35598 - 11904: 0xC1BC, 35599 - 11904: 0xEEA7, 35600 - 11904: 0xC1C4, 35601 - 11904: 0xEEA3, 35602 - 11904: 0xEEA8, 35603 - 11904: 0xEEAF, 35604 - 11904: 0xEBA6, 35605 - 11904: 0xEEA9, 35606 - 11904: 0xEEA2, 35607 - 11904: 0xC1BD, 35608 - 11904: 0xEEA1, 35609 - 11904: 0xC1BE, 35610 - 11904: 0xEEB0, 35611 - 11904: 0xC1BF, 35612 - 11904: 0xEEAE, 35613 - 11904: 0xC1C2, 35614 - 11904: 0xEE7E, 35615 - 11904: 0x8FDF, 35616 - 11904: 0xC1C1, 35618 - 11904: 0xEEA6, 35619 - 11904: 0xF0DC, 35620 - 11904: 0xF0EA, 35621 - 11904: 0xF0E5, 35622 - 11904: 0xF0E7, 35623 - 11904: 0xF0DB, 35624 - 11904: 0xC2D3, 35626 - 11904: 0xF0DA, 35627 - 11904: 0xC2D6, 35628 - 11904: 0xC2D5, 35629 - 11904: 0xA04B, 35630 - 11904: 0xF0E9, 35631 - 11904: 0xF0E1, 35632 - 11904: 0xF0DE, 35633 - 11904: 0xF0E4, 35635 - 11904: 0xF0DD, 35637 - 11904: 0xF0DF, 35638 - 11904: 0xF0E8, 35639 - 11904: 0xF0E6, 35641 - 11904: 0xC2D4, 35642 - 11904: 0xF0ED, 35643 - 11904: 0xF0EB, 35644 - 11904: 0xF0E2, 35645 - 11904: 0xF0EC, 35646 - 11904: 0xF0E3, 35647 - 11904: 0x8FE2, 35648 - 11904: 0xF2F9, 35649 - 11904: 0xC3CF, 35650 - 11904: 0xF341, 35651 - 11904: 0xA0CC, 35653 - 11904: 0xF64F, 35654 - 11904: 0xC3D6, 35655 - 11904: 0xF0E0, 35656 - 11904: 0xF2F7, 35657 - 11904: 0xC3D2, 35658 - 11904: 0xF2F8, 35659 - 11904: 0xF2FD, 35660 - 11904: 0x8FE3, 35661 - 11904: 0x8FE4, 35662 - 11904: 0xC3D4, 35663 - 11904: 0xC3D5, 35664 - 11904: 0xF2F6, 35665 - 11904: 0xF340, 35666 - 11904: 0xF342, 35667 - 11904: 0xF2FA, 35668 - 11904: 0xF2FC, 35669 - 11904: 0xF2FE, 35670 - 11904: 0xF2FB, 35671 - 11904: 0xF343, 35672 - 11904: 0xC3D1, 35673 - 11904: 0xC3D7, 35674 - 11904: 0xC3D3, 35676 - 11904: 0xC3D0, 35677 - 11904: 0xF4D0, 35678 - 11904: 0x9BC4, 35679 - 11904: 0xC4B7, 35680 - 11904: 0xF4CE, 35682 - 11904: 0x9BFC, 35683 - 11904: 0xF4D2, 35685 - 11904: 0xF4D3, 35686 - 11904: 0xC4B5, 35687 - 11904: 0xF4D4, 35688 - 11904: 0xF4D1, 35689 - 11904: 0x964C, 35690 - 11904: 0xF4CF, 35691 - 11904: 0xC4B8, 35692 - 11904: 0xC4B4, 35693 - 11904: 0xF4D5, 35695 - 11904: 0xC4B6, 35696 - 11904: 0xC4B3, 35700 - 11904: 0xC4FE, 35703 - 11904: 0xC540, 35704 - 11904: 0xF64E, 35705 - 11904: 0xF64D, 35706 - 11904: 0xF650, 35707 - 11904: 0xF651, 35709 - 11904: 0xC541, 35710 - 11904: 0xF756, 35711 - 11904: 0xF75B, 35712 - 11904: 0xC5AA, 35713 - 11904: 0x9AF6, 35714 - 11904: 0xF758, 35715 - 11904: 0x8CAE, 35716 - 11904: 0xF757, 35717 - 11904: 0xF75A, 35718 - 11904: 0xF759, 35720 - 11904: 0xF843, 35722 - 11904: 0xC5DC, 35723 - 11904: 0xF842, 35724 - 11904: 0xF840, 35726 - 11904: 0xF841, 35727 - 11904: 0x87CB, 35728 - 11904: 0x8FE7, 35730 - 11904: 0xC5FE, 35731 - 11904: 0xC5FD, 35732 - 11904: 0xF8C1, 35733 - 11904: 0xF8C2, 35734 - 11904: 0xC640, 35736 - 11904: 0xF94D, 35737 - 11904: 0xF94E, 35738 - 11904: 0xC667, 35739 - 11904: 0x8FE8, 35740 - 11904: 0xC66D, 35742 - 11904: 0xF9A9, 35743 - 11904: 0xF9C8, 35744 - 11904: 0x8BE7, 35774 - 11904: 0x897A, 35810 - 11904: 0x897B, 35895 - 11904: 0xA8A6, 35897 - 11904: 0xD7CD, 35899 - 11904: 0xD7CE, 35900 - 11904: 0xE052, 35901 - 11904: 0xE450, 35902 - 11904: 0xE7E5, 35903 - 11904: 0xC1C6, 35905 - 11904: 0xC1C5, 35906 - 11904: 0xF0EE, 35907 - 11904: 0xF344, 35909 - 11904: 0xF844, 35910 - 11904: 0xA8A7, 35911 - 11904: 0xD3DE, 35912 - 11904: 0xB05A, 35913 - 11904: 0xB361, 35914 - 11904: 0xE054, 35915 - 11904: 0xE053, 35916 - 11904: 0xBDDC, 35917 - 11904: 0xE7E6, 35918 - 11904: 0xBDDD, 35919 - 11904: 0xEEB1, 35920 - 11904: 0xC2D7, 35921 - 11904: 0x99DA, 35924 - 11904: 0xC676, 35925 - 11904: 0xA8A8, 35926 - 11904: 0xCDCB, 35927 - 11904: 0xD3DF, 35930 - 11904: 0xB362, 35932 - 11904: 0xD7CF, 35933 - 11904: 0xD7D0, 35935 - 11904: 0xDBE5, 35937 - 11904: 0xB648, 35938 - 11904: 0xB8E6, 35940 - 11904: 0xE056, 35941 - 11904: 0xE055, 35942 - 11904: 0xE057, 35944 - 11904: 0xE451, 35945 - 11904: 0xE452, 35946 - 11904: 0xBBA8, 35947 - 11904: 0xBFDD, 35948 - 11904: 0xBDDE, 35949 - 11904: 0xBFDE, 35951 - 11904: 0xEEB5, 35952 - 11904: 0xEEB2, 35953 - 11904: 0xEEB4, 35954 - 11904: 0xEEB3, 35955 - 11904: 0xC1C7, 35957 - 11904: 0xF0EF, 35958 - 11904: 0xF346, 35959 - 11904: 0xF345, 35960 - 11904: 0xCBA4, 35961 - 11904: 0xB05C, 35962 - 11904: 0xB05B, 35963 - 11904: 0xD3E0, 35965 - 11904: 0xD7D1, 35968 - 11904: 0xDBE7, 35969 - 11904: 0xDBE6, 35970 - 11904: 0xB649, 35972 - 11904: 0xE059, 35973 - 11904: 0xE05A, 35974 - 11904: 0xE058, 35977 - 11904: 0xB8E8, 35978 - 11904: 0xB8E7, 35980 - 11904: 0xBBAA, 35981 - 11904: 0xBBA9, 35983 - 11904: 0xE7E7, 35984 - 11904: 0xEBB3, 35985 - 11904: 0xEBB1, 35986 - 11904: 0xEBB2, 35987 - 11904: 0xBFDF, 35988 - 11904: 0xEEB7, 35989 - 11904: 0xEEB6, 35991 - 11904: 0xF0F2, 35992 - 11904: 0xF0F1, 35993 - 11904: 0xF0F0, 35994 - 11904: 0xF347, 35995 - 11904: 0x8FED, 35996 - 11904: 0xF9AA, 35997 - 11904: 0xA8A9, 35998 - 11904: 0xAD73, 35999 - 11904: 0x95C0, 36000 - 11904: 0xAD74, 36001 - 11904: 0xB05D, 36002 - 11904: 0xB05E, 36003 - 11904: 0xD3E2, 36004 - 11904: 0xD3E1, 36005 - 11904: 0xD7D2, 36007 - 11904: 0xB368, 36008 - 11904: 0xB366, 36009 - 11904: 0xB363, 36010 - 11904: 0xB367, 36011 - 11904: 0xB365, 36012 - 11904: 0xB364, 36013 - 11904: 0xA0CB, 36015 - 11904: 0xB64A, 36016 - 11904: 0xDBEA, 36018 - 11904: 0xB8ED, 36019 - 11904: 0xB64C, 36020 - 11904: 0xB651, 36021 - 11904: 0xDBEC, 36022 - 11904: 0xB653, 36023 - 11904: 0xB652, 36024 - 11904: 0xB655, 36025 - 11904: 0xDBEB, 36026 - 11904: 0xDBE8, 36027 - 11904: 0xB64F, 36028 - 11904: 0xB64B, 36029 - 11904: 0xB64D, 36030 - 11904: 0xDBE9, 36031 - 11904: 0xB654, 36032 - 11904: 0xB650, 36033 - 11904: 0xB64E, 36034 - 11904: 0xB8EF, 36035 - 11904: 0xB8EE, 36036 - 11904: 0xB8EC, 36037 - 11904: 0xB8F0, 36039 - 11904: 0xB8EA, 36040 - 11904: 0xB8EB, 36042 - 11904: 0xB8E9, 36044 - 11904: 0xE05B, 36045 - 11904: 0x9E48, 36047 - 11904: 0xE454, 36049 - 11904: 0xBBAC, 36050 - 11904: 0xBBAD, 36051 - 11904: 0xBBAB, 36052 - 11904: 0x99DB, 36053 - 11904: 0xE453, 36054 - 11904: 0x8FF3, 36055 - 11904: 0xE455, 36057 - 11904: 0xE7EA, 36058 - 11904: 0xE7EC, 36059 - 11904: 0x8FF9, 36060 - 11904: 0xBDE7, 36061 - 11904: 0xE7ED, 36062 - 11904: 0xBDE0, 36063 - 11904: 0xE7E9, 36064 - 11904: 0xBDDF, 36065 - 11904: 0xBDE9, 36066 - 11904: 0xBDE5, 36067 - 11904: 0xBDE6, 36068 - 11904: 0xBDE2, 36069 - 11904: 0xE7E8, 36070 - 11904: 0xBDE1, 36071 - 11904: 0xE7EE, 36072 - 11904: 0xE7EB, 36073 - 11904: 0x95C1, 36074 - 11904: 0xBDE8, 36075 - 11904: 0xA04E, 36076 - 11904: 0xBDE3, 36077 - 11904: 0xBDE4, 36078 - 11904: 0xEBB5, 36080 - 11904: 0xEBB7, 36081 - 11904: 0xEBB6, 36082 - 11904: 0x99DC, 36083 - 11904: 0xEBB8, 36084 - 11904: 0xBFE0, 36085 - 11904: 0xEBB4, 36087 - 11904: 0xA064, 36088 - 11904: 0xC1CB, 36089 - 11904: 0xEEB8, 36090 - 11904: 0xC1C8, 36091 - 11904: 0xC1CC, 36092 - 11904: 0xC1CA, 36093 - 11904: 0xC1C9, 36094 - 11904: 0xF0F3, 36096 - 11904: 0xF0F6, 36098 - 11904: 0xF0F5, 36099 - 11904: 0x8FF7, 36100 - 11904: 0xF0F4, 36101 - 11904: 0xC2D8, 36102 - 11904: 0xF348, 36103 - 11904: 0xF349, 36104 - 11904: 0xC3D8, 36105 - 11904: 0xF34A, 36106 - 11904: 0xC3D9, 36107 - 11904: 0x89B0, 36108 - 11904: 0xA048, 36109 - 11904: 0xC4BA, 36111 - 11904: 0xC4B9, 36112 - 11904: 0xF652, 36113 - 11904: 0x8FFB, 36114 - 11904: 0x8FF6, 36115 - 11904: 0xC542, 36116 - 11904: 0xF653, 36117 - 11904: 0xF75C, 36118 - 11904: 0xC5AB, 36119 - 11904: 0xC5AC, 36120 - 11904: 0x9DDC, 36121 - 11904: 0xF845, 36123 - 11904: 0xC642, 36124 - 11904: 0x99DD, 36125 - 11904: 0x8BE8, 36196 - 11904: 0xA8AA, 36198 - 11904: 0xB36A, 36199 - 11904: 0xB369, 36200 - 11904: 0xE05C, 36201 - 11904: 0xE05D, 36203 - 11904: 0xBBAE, 36204 - 11904: 0xEBB9, 36205 - 11904: 0xBDEA, 36206 - 11904: 0xEBBA, 36207 - 11904: 0xEEB9, 36208 - 11904: 0xA8AB, 36210 - 11904: 0xD0B2, 36211 - 11904: 0xAD76, 36212 - 11904: 0xAD75, 36214 - 11904: 0xD3E3, 36215 - 11904: 0xB05F, 36216 - 11904: 0xD3E4, 36217 - 11904: 0xD7D5, 36218 - 11904: 0x92C1, 36219 - 11904: 0xD7D4, 36221 - 11904: 0xD7D3, 36224 - 11904: 0xDBEE, 36225 - 11904: 0xB658, 36226 - 11904: 0x9FD6, 36228 - 11904: 0xDBED, 36229 - 11904: 0xB657, 36233 - 11904: 0xDBEF, 36234 - 11904: 0xB656, 36236 - 11904: 0xE05F, 36237 - 11904: 0xE062, 36238 - 11904: 0xE060, 36239 - 11904: 0xE061, 36240 - 11904: 0xE065, 36241 - 11904: 0xE05E, 36242 - 11904: 0xE066, 36243 - 11904: 0xE063, 36244 - 11904: 0xE064, 36245 - 11904: 0xBBB0, 36246 - 11904: 0xE456, 36249 - 11904: 0xBBAF, 36251 - 11904: 0xE7F2, 36252 - 11904: 0xE7F0, 36255 - 11904: 0xBDEB, 36256 - 11904: 0xE7EF, 36257 - 11904: 0xE7F1, 36259 - 11904: 0xBDEC, 36261 - 11904: 0xEBBB, 36262 - 11904: 0xA0D2, 36263 - 11904: 0xEBBC, 36264 - 11904: 0xC1CD, 36265 - 11904: 0x9040, 36266 - 11904: 0xF34C, 36267 - 11904: 0xF34E, 36268 - 11904: 0xF34B, 36269 - 11904: 0xF34D, 36270 - 11904: 0xF4D6, 36271 - 11904: 0xF654, 36274 - 11904: 0xF96F, 36275 - 11904: 0xA8AC, 36276 - 11904: 0xAD77, 36277 - 11904: 0xD3E5, 36278 - 11904: 0xD3E7, 36279 - 11904: 0xD3E6, 36281 - 11904: 0xD7D8, 36282 - 11904: 0xB36C, 36284 - 11904: 0xD7D6, 36286 - 11904: 0xB36B, 36287 - 11904: 0xD7D9, 36288 - 11904: 0x8AC4, 36289 - 11904: 0xD7DA, 36290 - 11904: 0xD7D7, 36291 - 11904: 0x99E0, 36293 - 11904: 0xDBFB, 36294 - 11904: 0xB660, 36295 - 11904: 0xDBF3, 36296 - 11904: 0xDBF9, 36299 - 11904: 0xB65B, 36300 - 11904: 0xB65E, 36301 - 11904: 0xDBF2, 36302 - 11904: 0xB659, 36303 - 11904: 0xDBF6, 36304 - 11904: 0xE06C, 36305 - 11904: 0xB65D, 36307 - 11904: 0xDBF1, 36308 - 11904: 0x9FF0, 36309 - 11904: 0xDBF7, 36310 - 11904: 0xDBF4, 36311 - 11904: 0xDBFA, 36312 - 11904: 0xDBF0, 36313 - 11904: 0xDBF8, 36314 - 11904: 0xB65C, 36315 - 11904: 0xB65F, 36316 - 11904: 0xDBF5, 36317 - 11904: 0xB65A, 36319 - 11904: 0xB8F2, 36320 - 11904: 0xE068, 36321 - 11904: 0xB8F1, 36322 - 11904: 0xE06F, 36323 - 11904: 0xE06E, 36324 - 11904: 0xB8F8, 36326 - 11904: 0xB8F9, 36327 - 11904: 0xE070, 36328 - 11904: 0xB8F3, 36329 - 11904: 0xE06D, 36330 - 11904: 0xB8F7, 36331 - 11904: 0xE072, 36332 - 11904: 0xE069, 36334 - 11904: 0xE06B, 36335 - 11904: 0xB8F4, 36336 - 11904: 0xE067, 36337 - 11904: 0xE06A, 36338 - 11904: 0xE071, 36339 - 11904: 0xB8F5, 36340 - 11904: 0xE073, 36346 - 11904: 0xB8F6, 36348 - 11904: 0xBBB1, 36349 - 11904: 0xE45B, 36350 - 11904: 0xE461, 36351 - 11904: 0xE459, 36352 - 11904: 0xE462, 36353 - 11904: 0x9FF3, 36354 - 11904: 0xE458, 36355 - 11904: 0xE45D, 36356 - 11904: 0xE463, 36357 - 11904: 0xE460, 36358 - 11904: 0xE45F, 36359 - 11904: 0xE45E, 36361 - 11904: 0xE457, 36362 - 11904: 0xE45C, 36365 - 11904: 0xE45A, 36366 - 11904: 0x9DBF, 36367 - 11904: 0xBDF1, 36368 - 11904: 0xBDEE, 36369 - 11904: 0xE7FB, 36370 - 11904: 0xE841, 36371 - 11904: 0xE843, 36372 - 11904: 0xE840, 36373 - 11904: 0xE7F8, 36374 - 11904: 0xE7FA, 36375 - 11904: 0xE845, 36376 - 11904: 0xE842, 36377 - 11904: 0xE7FC, 36378 - 11904: 0xE846, 36379 - 11904: 0xE7F9, 36380 - 11904: 0xE844, 36381 - 11904: 0xBDEF, 36382 - 11904: 0xBDF5, 36383 - 11904: 0xBDF3, 36384 - 11904: 0xE7F3, 36385 - 11904: 0xBDF4, 36386 - 11904: 0xBDF0, 36387 - 11904: 0xE7F4, 36388 - 11904: 0xE7F6, 36389 - 11904: 0xE7F5, 36390 - 11904: 0xE7FD, 36391 - 11904: 0xE7FE, 36392 - 11904: 0x9FF6, 36393 - 11904: 0xBDF2, 36394 - 11904: 0x95C8, 36395 - 11904: 0xBDED, 36397 - 11904: 0x9E5A, 36398 - 11904: 0xE7F7, 36400 - 11904: 0xEBC6, 36401 - 11904: 0xBFE2, 36403 - 11904: 0xEBBD, 36404 - 11904: 0xBFE3, 36405 - 11904: 0xBFE6, 36406 - 11904: 0xEBC2, 36408 - 11904: 0xEBBF, 36409 - 11904: 0xBFE5, 36410 - 11904: 0x99E3, 36412 - 11904: 0xEBC3, 36413 - 11904: 0xEBC4, 36414 - 11904: 0xEBBE, 36415 - 11904: 0xEBC7, 36416 - 11904: 0xEBC0, 36417 - 11904: 0xEBC5, 36418 - 11904: 0xBFE4, 36420 - 11904: 0xBFE1, 36421 - 11904: 0xEBC1, 36422 - 11904: 0x8A4A, 36423 - 11904: 0xEEBF, 36424 - 11904: 0xC1D0, 36425 - 11904: 0xC1CE, 36426 - 11904: 0xC1D1, 36427 - 11904: 0xC1CF, 36428 - 11904: 0xEEBE, 36429 - 11904: 0xEEBB, 36430 - 11904: 0xEEBA, 36431 - 11904: 0x9FF1, 36432 - 11904: 0xEEBD, 36435 - 11904: 0xEEBC, 36436 - 11904: 0xF145, 36437 - 11904: 0xC2DE, 36438 - 11904: 0xF0FB, 36439 - 11904: 0xF0FA, 36441 - 11904: 0xC2D9, 36442 - 11904: 0xF141, 36443 - 11904: 0xF140, 36444 - 11904: 0xF0F7, 36445 - 11904: 0xF143, 36446 - 11904: 0xF0FC, 36447 - 11904: 0xC2DD, 36448 - 11904: 0xF0F9, 36449 - 11904: 0xF142, 36450 - 11904: 0xF0F8, 36451 - 11904: 0xC2DA, 36452 - 11904: 0xC2DC, 36453 - 11904: 0xF0FD, 36454 - 11904: 0xC2DB, 36455 - 11904: 0xF0FE, 36456 - 11904: 0x8AA7, 36457 - 11904: 0xF144, 36458 - 11904: 0xF352, 36460 - 11904: 0xC3DE, 36461 - 11904: 0xF34F, 36463 - 11904: 0xF353, 36465 - 11904: 0x99E6, 36466 - 11904: 0xC3DB, 36467 - 11904: 0xF351, 36468 - 11904: 0xC3E0, 36469 - 11904: 0x9FF7, 36470 - 11904: 0xC3DD, 36471 - 11904: 0x9FED, 36472 - 11904: 0xF350, 36474 - 11904: 0xC3DF, 36475 - 11904: 0xF354, 36476 - 11904: 0xC3DA, 36478 - 11904: 0x8A5C, 36480 - 11904: 0x9DAE, 36481 - 11904: 0xC4BC, 36482 - 11904: 0xC4BE, 36484 - 11904: 0xF4D9, 36485 - 11904: 0xC4BD, 36486 - 11904: 0xF4D7, 36487 - 11904: 0xC3DC, 36488 - 11904: 0xF4D8, 36489 - 11904: 0xC4BB, 36490 - 11904: 0xC543, 36491 - 11904: 0xC545, 36492 - 11904: 0xF656, 36493 - 11904: 0xC544, 36494 - 11904: 0xF655, 36496 - 11904: 0xF761, 36497 - 11904: 0xC5AD, 36498 - 11904: 0xF760, 36499 - 11904: 0xC5AE, 36500 - 11904: 0xF75E, 36501 - 11904: 0xF75D, 36502 - 11904: 0xF762, 36503 - 11904: 0xF763, 36504 - 11904: 0xF846, 36506 - 11904: 0xF75F, 36509 - 11904: 0xF8C6, 36510 - 11904: 0xF8C3, 36511 - 11904: 0xF8C4, 36512 - 11904: 0xF8C5, 36513 - 11904: 0xC65C, 36515 - 11904: 0xF951, 36516 - 11904: 0xF950, 36517 - 11904: 0xF94F, 36518 - 11904: 0xF970, 36519 - 11904: 0x95C9, 36520 - 11904: 0xF9BE, 36521 - 11904: 0xF9AB, 36522 - 11904: 0xC66E, 36523 - 11904: 0xA8AD, 36524 - 11904: 0xB060, 36525 - 11904: 0x9048, 36528 - 11904: 0x99E8, 36530 - 11904: 0xB8FA, 36534 - 11904: 0x9049, 36537 - 11904: 0x8CBA, 36538 - 11904: 0xBDF6, 36540 - 11904: 0x90B1, 36541 - 11904: 0xEBC8, 36544 - 11904: 0xC2DF, 36546 - 11904: 0xF355, 36547 - 11904: 0x904A, 36553 - 11904: 0xF9AC, 36554 - 11904: 0xA8AE, 36555 - 11904: 0xAAEE, 36556 - 11904: 0xAD79, 36557 - 11904: 0xAD78, 36558 - 11904: 0x99EA, 36559 - 11904: 0xB063, 36561 - 11904: 0xD3E8, 36562 - 11904: 0xB061, 36563 - 11904: 0xD3E9, 36564 - 11904: 0xB062, 36567 - 11904: 0xD7DF, 36568 - 11904: 0xD7DB, 36570 - 11904: 0x9BD1, 36571 - 11904: 0xB36D, 36572 - 11904: 0xD7DE, 36573 - 11904: 0xD7DD, 36574 - 11904: 0xD7DC, 36575 - 11904: 0xB36E, 36576 - 11904: 0xD7E0, 36577 - 11904: 0xD7E1, 36578 - 11904: 0x99EB, 36580 - 11904: 0x99EC, 36581 - 11904: 0xDC43, 36582 - 11904: 0xDC41, 36583 - 11904: 0xDC45, 36584 - 11904: 0xDC46, 36585 - 11904: 0xDC4C, 36587 - 11904: 0xDC48, 36588 - 11904: 0xDC4A, 36589 - 11904: 0x99ED, 36590 - 11904: 0xDC42, 36591 - 11904: 0xDBFC, 36593 - 11904: 0xDC49, 36594 - 11904: 0x99EE, 36596 - 11904: 0xDC4B, 36597 - 11904: 0xDC44, 36598 - 11904: 0xDC47, 36599 - 11904: 0xDBFD, 36600 - 11904: 0xB662, 36601 - 11904: 0xDC40, 36602 - 11904: 0xDBFE, 36603 - 11904: 0xB661, 36604 - 11904: 0xB663, 36606 - 11904: 0xB8FD, 36607 - 11904: 0xE075, 36608 - 11904: 0xE077, 36609 - 11904: 0xE076, 36610 - 11904: 0xE07B, 36611 - 11904: 0xB8FB, 36613 - 11904: 0xE078, 36614 - 11904: 0xE074, 36615 - 11904: 0xE079, 36616 - 11904: 0xE07A, 36617 - 11904: 0xB8FC, 36618 - 11904: 0xB8FE, 36619 - 11904: 0xE07C, 36621 - 11904: 0xE467, 36622 - 11904: 0xE466, 36624 - 11904: 0xE464, 36625 - 11904: 0xE465, 36626 - 11904: 0xBBB3, 36627 - 11904: 0xBBB5, 36628 - 11904: 0xBBB2, 36629 - 11904: 0xBBB4, 36630 - 11904: 0xE84D, 36631 - 11904: 0xE84E, 36632 - 11904: 0xE849, 36633 - 11904: 0x904C, 36634 - 11904: 0xE84A, 36635 - 11904: 0xBDF8, 36636 - 11904: 0xBDFD, 36637 - 11904: 0xBDF7, 36638 - 11904: 0xBDFE, 36639 - 11904: 0xBDF9, 36640 - 11904: 0xE84B, 36643 - 11904: 0xE84C, 36644 - 11904: 0xE848, 36645 - 11904: 0xBE40, 36646 - 11904: 0xBDFB, 36649 - 11904: 0xBDFA, 36650 - 11904: 0xBDFC, 36652 - 11904: 0xE847, 36653 - 11904: 0x904D, 36654 - 11904: 0xEBCA, 36655 - 11904: 0xBFE8, 36656 - 11904: 0x95CB, 36658 - 11904: 0xEBCC, 36659 - 11904: 0xBFEA, 36660 - 11904: 0xEBCF, 36661 - 11904: 0xEBCB, 36662 - 11904: 0xEBC9, 36663 - 11904: 0xEBCE, 36664 - 11904: 0xBFE9, 36665 - 11904: 0xEBCD, 36667 - 11904: 0xBFE7, 36670 - 11904: 0xC1D3, 36671 - 11904: 0xC1D6, 36672 - 11904: 0xEEC1, 36673 - 11904: 0x97E2, 36674 - 11904: 0xC1D4, 36675 - 11904: 0xEEC0, 36676 - 11904: 0xC1D2, 36677 - 11904: 0xC1D5, 36678 - 11904: 0xF146, 36679 - 11904: 0xF147, 36680 - 11904: 0xF148, 36681 - 11904: 0xC2E0, 36682 - 11904: 0x95CC, 36683 - 11904: 0xF149, 36685 - 11904: 0xC2E1, 36686 - 11904: 0xC3E2, 36687 - 11904: 0xF358, 36688 - 11904: 0xF359, 36689 - 11904: 0xF357, 36690 - 11904: 0xF356, 36691 - 11904: 0xF35A, 36692 - 11904: 0xC3E1, 36693 - 11904: 0xF4DD, 36694 - 11904: 0xF4DB, 36695 - 11904: 0xF4DC, 36696 - 11904: 0xF4DE, 36697 - 11904: 0xF4DA, 36698 - 11904: 0xF4DF, 36699 - 11904: 0xF658, 36700 - 11904: 0x9F78, 36701 - 11904: 0xF659, 36702 - 11904: 0xF657, 36703 - 11904: 0xC546, 36704 - 11904: 0xF764, 36705 - 11904: 0xC5AF, 36706 - 11904: 0xF765, 36707 - 11904: 0xF848, 36708 - 11904: 0xF847, 36710 - 11904: 0x897C, 36711 - 11904: 0x897D, 36718 - 11904: 0x897E, 36755 - 11904: 0x995D, 36763 - 11904: 0xA8AF, 36764 - 11904: 0xB664, 36767 - 11904: 0xB940, 36768 - 11904: 0x9B5A, 36771 - 11904: 0xBBB6, 36773 - 11904: 0x9050, 36774 - 11904: 0xBFEC, 36775 - 11904: 0x8C4F, 36776 - 11904: 0xBFEB, 36781 - 11904: 0xC3E3, 36782 - 11904: 0xC47C, 36783 - 11904: 0xC547, 36784 - 11904: 0xA8B0, 36785 - 11904: 0xB064, 36786 - 11904: 0xB941, 36787 - 11904: 0x9054, 36788 - 11904: 0xF35B, 36789 - 11904: 0xC6D6, 36790 - 11904: 0x9AA8, 36791 - 11904: 0x99EF, 36792 - 11904: 0xFEEB, 36793 - 11904: 0x9DA3, 36794 - 11904: 0x9DA1, 36795 - 11904: 0x9943, 36796 - 11904: 0x9945, 36798 - 11904: 0x9D7D, 36799 - 11904: 0xCBA6, 36801 - 11904: 0x99F0, 36802 - 11904: 0xA8B1, 36804 - 11904: 0xA8B4, 36805 - 11904: 0xA8B3, 36806 - 11904: 0xA8B2, 36809 - 11904: 0xCBA5, 36810 - 11904: 0x99F1, 36811 - 11904: 0xCDCD, 36812 - 11904: 0x99F2, 36813 - 11904: 0xCDCF, 36814 - 11904: 0xAAEF, 36815 - 11904: 0x8CBC, 36816 - 11904: 0x9D60, 36817 - 11904: 0xAAF1, 36818 - 11904: 0xCDCC, 36819 - 11904: 0xCDCE, 36820 - 11904: 0xAAF0, 36821 - 11904: 0xCDD1, 36822 - 11904: 0xCDD0, 36823 - 11904: 0xCDD2, 36826 - 11904: 0xA0A3, 36832 - 11904: 0xD0B6, 36833 - 11904: 0xD0B4, 36834 - 11904: 0xAD7C, 36835 - 11904: 0xD0B3, 36836 - 11904: 0xADA3, 36837 - 11904: 0xAD7E, 36838 - 11904: 0xAD7B, 36840 - 11904: 0xADA4, 36842 - 11904: 0xAD7D, 36843 - 11904: 0xADA2, 36845 - 11904: 0xADA1, 36846 - 11904: 0xD0B5, 36848 - 11904: 0xAD7A, 36852 - 11904: 0xB06A, 36853 - 11904: 0xD3EB, 36854 - 11904: 0xD3F1, 36855 - 11904: 0xB067, 36856 - 11904: 0xB06E, 36857 - 11904: 0x905B, 36858 - 11904: 0xB069, 36859 - 11904: 0xD3EE, 36860 - 11904: 0xD3F0, 36861 - 11904: 0xB06C, 36862 - 11904: 0xD3EA, 36863 - 11904: 0xD3ED, 36864 - 11904: 0xB068, 36865 - 11904: 0xB065, 36866 - 11904: 0xD3EC, 36867 - 11904: 0xB06B, 36868 - 11904: 0xD3EF, 36869 - 11904: 0xB06D, 36870 - 11904: 0xB066, 36872 - 11904: 0x9EDB, 36875 - 11904: 0xD7E3, 36876 - 11904: 0xD7E6, 36877 - 11904: 0xB370, 36879 - 11904: 0xB37A, 36880 - 11904: 0xB376, 36881 - 11904: 0xD7E4, 36882 - 11904: 0x9D79, 36884 - 11904: 0xB37E, 36885 - 11904: 0xB377, 36886 - 11904: 0xB37C, 36887 - 11904: 0xB372, 36889 - 11904: 0xB36F, 36890 - 11904: 0xB371, 36891 - 11904: 0xB37D, 36892 - 11904: 0xD7E5, 36893 - 11904: 0xB375, 36894 - 11904: 0xB378, 36895 - 11904: 0xB374, 36896 - 11904: 0xB379, 36897 - 11904: 0xD7E7, 36898 - 11904: 0xB37B, 36899 - 11904: 0xB373, 36900 - 11904: 0xD7E2, 36909 - 11904: 0xDC4D, 36910 - 11904: 0xB665, 36911 - 11904: 0xDC4F, 36913 - 11904: 0xB667, 36914 - 11904: 0xB669, 36915 - 11904: 0x99F3, 36916 - 11904: 0xDC4E, 36917 - 11904: 0xB666, 36918 - 11904: 0xB66A, 36919 - 11904: 0x9062, 36920 - 11904: 0xB668, 36924 - 11904: 0xB947, 36925 - 11904: 0xE0A3, 36926 - 11904: 0xB94F, 36927 - 11904: 0xE07E, 36929 - 11904: 0xB950, 36930 - 11904: 0xB945, 36932 - 11904: 0xE0A1, 36934 - 11904: 0x87BD, 36935 - 11904: 0xB94A, 36937 - 11904: 0xE0A2, 36938 - 11904: 0xB943, 36939 - 11904: 0xB942, 36940 - 11904: 0x9F55, 36941 - 11904: 0xB94D, 36942 - 11904: 0xB94C, 36943 - 11904: 0xB94B, 36944 - 11904: 0xB949, 36945 - 11904: 0xB94E, 36946 - 11904: 0xE07D, 36947 - 11904: 0xB944, 36948 - 11904: 0xB946, 36949 - 11904: 0xB948, 36950 - 11904: 0x9BF9, 36952 - 11904: 0xBBB8, 36953 - 11904: 0xBBBB, 36955 - 11904: 0xBBBF, 36956 - 11904: 0xBBB9, 36957 - 11904: 0xBBBE, 36958 - 11904: 0xBBBC, 36960 - 11904: 0xBBB7, 36961 - 11904: 0x9065, 36962 - 11904: 0xBBBD, 36963 - 11904: 0xBBBA, 36964 - 11904: 0x96E0, 36967 - 11904: 0xE852, 36968 - 11904: 0xBE43, 36969 - 11904: 0xBE41, 36971 - 11904: 0xE853, 36972 - 11904: 0x98BE, 36973 - 11904: 0xBE44, 36974 - 11904: 0xBE42, 36975 - 11904: 0xE851, 36976 - 11904: 0xE850, 36978 - 11904: 0xBFF0, 36979 - 11904: 0xE84F, 36980 - 11904: 0xBFEE, 36981 - 11904: 0xBFED, 36982 - 11904: 0xEBD0, 36983 - 11904: 0xBE45, 36984 - 11904: 0xBFEF, 36985 - 11904: 0xEBD1, 36986 - 11904: 0xBFF2, 36987 - 11904: 0xEBD2, 36988 - 11904: 0xBFF1, 36989 - 11904: 0xC1D8, 36990 - 11904: 0xEEC3, 36991 - 11904: 0xC1D7, 36992 - 11904: 0xC1DC, 36993 - 11904: 0xC1DA, 36994 - 11904: 0xC1DB, 36995 - 11904: 0xC2E3, 36996 - 11904: 0xC1D9, 36997 - 11904: 0xEEC2, 36998 - 11904: 0xEBD3, 36999 - 11904: 0xC2E2, 37000 - 11904: 0xC2E4, 37002 - 11904: 0xC3E4, 37003 - 11904: 0xC3E5, 37005 - 11904: 0xF4E0, 37007 - 11904: 0xC5DE, 37008 - 11904: 0xC5DD, 37009 - 11904: 0xA8B6, 37012 - 11904: 0xCA55, 37013 - 11904: 0xB06F, 37015 - 11904: 0xCA52, 37016 - 11904: 0xCA53, 37017 - 11904: 0xCA51, 37019 - 11904: 0xCA54, 37022 - 11904: 0xCBAA, 37023 - 11904: 0xCBA7, 37024 - 11904: 0xCBAC, 37025 - 11904: 0xCBA8, 37026 - 11904: 0xA8B7, 37027 - 11904: 0xA8BA, 37029 - 11904: 0xCBA9, 37030 - 11904: 0xA8B9, 37031 - 11904: 0xCBAB, 37032 - 11904: 0x9068, 37034 - 11904: 0xA8B8, 37038 - 11904: 0x906C, 37039 - 11904: 0xCDD5, 37040 - 11904: 0xCDD7, 37041 - 11904: 0xAAF4, 37042 - 11904: 0xCDD3, 37043 - 11904: 0xCDD6, 37044 - 11904: 0xCDD4, 37045 - 11904: 0xAAF2, 37046 - 11904: 0xAAF5, 37048 - 11904: 0xAAF3, 37051 - 11904: 0x95D8, 37053 - 11904: 0xD0B8, 37054 - 11904: 0xD0BC, 37055 - 11904: 0xD0B9, 37057 - 11904: 0xADA7, 37059 - 11904: 0xADA8, 37060 - 11904: 0x906A, 37061 - 11904: 0xD0BB, 37063 - 11904: 0xD0BD, 37064 - 11904: 0xD0BF, 37066 - 11904: 0xADA5, 37067 - 11904: 0xD0BE, 37070 - 11904: 0xADA6, 37076 - 11904: 0xD7EE, 37077 - 11904: 0xD0BA, 37078 - 11904: 0xD3F2, 37079 - 11904: 0xD3FB, 37080 - 11904: 0xD3F9, 37081 - 11904: 0xD3F4, 37082 - 11904: 0xD3F5, 37083 - 11904: 0xD3FA, 37084 - 11904: 0xD3FC, 37085 - 11904: 0xB071, 37087 - 11904: 0xD3F7, 37088 - 11904: 0xD3F3, 37089 - 11904: 0xB070, 37090 - 11904: 0xB072, 37091 - 11904: 0xD3F6, 37092 - 11904: 0xD3FD, 37093 - 11904: 0xD3F8, 37096 - 11904: 0xB3A1, 37097 - 11904: 0xD7F1, 37098 - 11904: 0xD7E9, 37099 - 11904: 0xD7EF, 37100 - 11904: 0xD7F0, 37101 - 11904: 0xB3A2, 37103 - 11904: 0xD7E8, 37104 - 11904: 0xD7EA, 37105 - 11904: 0xD0B7, 37106 - 11904: 0xD7EC, 37107 - 11904: 0xD7ED, 37108 - 11904: 0xD7EB, 37109 - 11904: 0xB66C, 37113 - 11904: 0xDC56, 37114 - 11904: 0xEBD4, 37115 - 11904: 0xDC57, 37116 - 11904: 0xDC54, 37117 - 11904: 0xB3A3, 37118 - 11904: 0xB66E, 37119 - 11904: 0xDC53, 37120 - 11904: 0xDC59, 37121 - 11904: 0xDC58, 37122 - 11904: 0xB66B, 37123 - 11904: 0xDC5C, 37124 - 11904: 0xDC52, 37125 - 11904: 0xDC5B, 37126 - 11904: 0xDC50, 37127 - 11904: 0xDC5A, 37128 - 11904: 0xDC55, 37129 - 11904: 0xB66D, 37131 - 11904: 0xE0AA, 37133 - 11904: 0xE0A5, 37134 - 11904: 0xE0AB, 37135 - 11904: 0xE0A6, 37136 - 11904: 0xE0A4, 37137 - 11904: 0xE0A7, 37138 - 11904: 0xB951, 37140 - 11904: 0xE0A9, 37142 - 11904: 0xE0A8, 37143 - 11904: 0xB952, 37144 - 11904: 0xBBC1, 37145 - 11904: 0xBBC0, 37146 - 11904: 0xE46E, 37147 - 11904: 0xE471, 37148 - 11904: 0xE469, 37149 - 11904: 0xE46D, 37150 - 11904: 0xBBC2, 37151 - 11904: 0xE46C, 37152 - 11904: 0xE46A, 37153 - 11904: 0xE470, 37154 - 11904: 0xE46B, 37155 - 11904: 0xE468, 37156 - 11904: 0xE46F, 37158 - 11904: 0xE859, 37159 - 11904: 0xBE48, 37160 - 11904: 0xF14A, 37161 - 11904: 0xE856, 37162 - 11904: 0xE857, 37163 - 11904: 0xE855, 37164 - 11904: 0xDC51, 37165 - 11904: 0xBE47, 37166 - 11904: 0xE85A, 37167 - 11904: 0xE854, 37168 - 11904: 0xBE46, 37169 - 11904: 0xBE49, 37170 - 11904: 0xE858, 37171 - 11904: 0xEBD5, 37172 - 11904: 0xBFF3, 37173 - 11904: 0xEBD6, 37174 - 11904: 0xEBD7, 37176 - 11904: 0xEEC4, 37177 - 11904: 0xC1DD, 37178 - 11904: 0xF14B, 37179 - 11904: 0xF14C, 37182 - 11904: 0xF14D, 37183 - 11904: 0xF35D, 37184 - 11904: 0xF35C, 37185 - 11904: 0xF4E2, 37187 - 11904: 0xF4E1, 37188 - 11904: 0xF65B, 37189 - 11904: 0xF65C, 37190 - 11904: 0xF65A, 37191 - 11904: 0xF766, 37192 - 11904: 0xC5B0, 37193 - 11904: 0xA8BB, 37194 - 11904: 0xADAA, 37195 - 11904: 0xADA9, 37196 - 11904: 0xB075, 37197 - 11904: 0xB074, 37198 - 11904: 0xD440, 37199 - 11904: 0xD441, 37200 - 11904: 0xD3FE, 37201 - 11904: 0x9FB2, 37202 - 11904: 0xB073, 37203 - 11904: 0xD7F5, 37205 - 11904: 0xD7F6, 37206 - 11904: 0xD7F2, 37207 - 11904: 0xB3A4, 37208 - 11904: 0xD7F3, 37209 - 11904: 0x9FAE, 37210 - 11904: 0xD7F4, 37212 - 11904: 0x9FB0, 37214 - 11904: 0x89AD, 37215 - 11904: 0xDC5F, 37216 - 11904: 0xDC61, 37217 - 11904: 0xDC5D, 37218 - 11904: 0xDC60, 37219 - 11904: 0xB66F, 37220 - 11904: 0xDC5E, 37221 - 11904: 0xB670, 37223 - 11904: 0x906E, 37224 - 11904: 0xDD73, 37225 - 11904: 0xB955, 37226 - 11904: 0xB954, 37228 - 11904: 0xB953, 37230 - 11904: 0xE0AC, 37231 - 11904: 0xE0AD, 37232 - 11904: 0x9E71, 37234 - 11904: 0xE473, 37235 - 11904: 0xE475, 37236 - 11904: 0xBBC6, 37237 - 11904: 0xBBC3, 37238 - 11904: 0x9E4A, 37239 - 11904: 0xBBC5, 37240 - 11904: 0xBBC4, 37241 - 11904: 0xE474, 37242 - 11904: 0xE472, 37244 - 11904: 0x9FDC, 37248 - 11904: 0xE861, 37249 - 11904: 0xE85E, 37250 - 11904: 0xE85F, 37251 - 11904: 0xBE4D, 37252 - 11904: 0xE860, 37253 - 11904: 0xE85B, 37254 - 11904: 0xE85C, 37255 - 11904: 0xBE4A, 37257 - 11904: 0xBE4B, 37258 - 11904: 0xE85D, 37259 - 11904: 0xBE4C, 37260 - 11904: 0x89AB, 37261 - 11904: 0xEBDB, 37262 - 11904: 0x9FB8, 37263 - 11904: 0xEBDC, 37264 - 11904: 0xEBD9, 37265 - 11904: 0xEBDA, 37266 - 11904: 0xBFF4, 37267 - 11904: 0xEBD8, 37273 - 11904: 0xEEC8, 37274 - 11904: 0xEEC5, 37275 - 11904: 0xEEC7, 37276 - 11904: 0xC1E0, 37277 - 11904: 0xEECB, 37278 - 11904: 0xC1DF, 37279 - 11904: 0xEEC9, 37280 - 11904: 0xEECC, 37281 - 11904: 0xEECA, 37282 - 11904: 0xEEC6, 37283 - 11904: 0xC1DE, 37285 - 11904: 0xF14F, 37287 - 11904: 0xF150, 37288 - 11904: 0xF14E, 37289 - 11904: 0x9070, 37290 - 11904: 0xF152, 37291 - 11904: 0xC2E5, 37292 - 11904: 0xC2E6, 37293 - 11904: 0xF35F, 37294 - 11904: 0xC3E7, 37295 - 11904: 0xF151, 37296 - 11904: 0xF35E, 37297 - 11904: 0xC3E6, 37298 - 11904: 0xF4E5, 37299 - 11904: 0xF4E6, 37300 - 11904: 0xC4BF, 37301 - 11904: 0xF4E4, 37302 - 11904: 0x8B63, 37303 - 11904: 0xF4E3, 37305 - 11904: 0xF65D, 37306 - 11904: 0xC548, 37307 - 11904: 0x95DC, 37308 - 11904: 0xF849, 37309 - 11904: 0xF8C8, 37310 - 11904: 0xF8C7, 37312 - 11904: 0xC643, 37313 - 11904: 0xC65D, 37314 - 11904: 0xF8C9, 37315 - 11904: 0xF971, 37316 - 11904: 0x9071, 37317 - 11904: 0xC66F, 37318 - 11904: 0xA8BC, 37319 - 11904: 0xAAF6, 37321 - 11904: 0xB956, 37323 - 11904: 0xC4C0, 37324 - 11904: 0xA8BD, 37325 - 11904: 0xADAB, 37326 - 11904: 0xB3A5, 37327 - 11904: 0xB671, 37328 - 11904: 0xC2E7, 37329 - 11904: 0xAAF7, 37331 - 11904: 0xD0C1, 37332 - 11904: 0xD0C0, 37333 - 11904: 0xD442, 37334 - 11904: 0xFC5E, 37335 - 11904: 0xB078, 37336 - 11904: 0xB076, 37337 - 11904: 0xB07A, 37338 - 11904: 0xD444, 37340 - 11904: 0xB079, 37341 - 11904: 0xB077, 37343 - 11904: 0x8949, 37346 - 11904: 0xD443, 37347 - 11904: 0xB3A8, 37348 - 11904: 0xD7FC, 37349 - 11904: 0x965B, 37350 - 11904: 0xB3A7, 37351 - 11904: 0xB3A9, 37352 - 11904: 0xD842, 37353 - 11904: 0xB3AB, 37354 - 11904: 0xD7FE, 37355 - 11904: 0xD840, 37356 - 11904: 0xD7F7, 37357 - 11904: 0xB3AA, 37358 - 11904: 0xD843, 37361 - 11904: 0xD7F9, 37363 - 11904: 0xD7FA, 37364 - 11904: 0xD7F8, 37365 - 11904: 0xB3A6, 37366 - 11904: 0x8C50, 37367 - 11904: 0xD841, 37368 - 11904: 0xD7FB, 37369 - 11904: 0xD7FD, 37370 - 11904: 0x94A6, 37373 - 11904: 0xDC6D, 37374 - 11904: 0x8FD5, 37375 - 11904: 0xDC6C, 37376 - 11904: 0xDC6A, 37377 - 11904: 0xDC62, 37378 - 11904: 0xDC71, 37379 - 11904: 0xDC65, 37380 - 11904: 0xDC6F, 37381 - 11904: 0xDC76, 37382 - 11904: 0xDC6E, 37383 - 11904: 0xB679, 37384 - 11904: 0x9E73, 37385 - 11904: 0xB675, 37386 - 11904: 0xDC63, 37388 - 11904: 0xDC69, 37389 - 11904: 0xB677, 37390 - 11904: 0x9075, 37391 - 11904: 0xDC68, 37392 - 11904: 0xB678, 37393 - 11904: 0xB67A, 37394 - 11904: 0xDC6B, 37395 - 11904: 0x99F7, 37396 - 11904: 0xB672, 37397 - 11904: 0xB673, 37398 - 11904: 0xDC77, 37399 - 11904: 0xDC75, 37400 - 11904: 0x87B2, 37401 - 11904: 0xDC74, 37402 - 11904: 0xDC66, 37404 - 11904: 0xDC72, 37406 - 11904: 0xB676, 37409 - 11904: 0x8CBF, 37411 - 11904: 0xB674, 37412 - 11904: 0xDC73, 37413 - 11904: 0xDC64, 37414 - 11904: 0xDC67, 37415 - 11904: 0xDC70, 37416 - 11904: 0x99F9, 37418 - 11904: 0x9663, 37419 - 11904: 0x95B9, 37421 - 11904: 0xE4BA, 37422 - 11904: 0xE0B7, 37424 - 11904: 0xE0B0, 37425 - 11904: 0xE0C3, 37426 - 11904: 0xE0CC, 37427 - 11904: 0xE0B3, 37428 - 11904: 0xB961, 37429 - 11904: 0x94D4, 37430 - 11904: 0xE0C0, 37431 - 11904: 0xB957, 37432 - 11904: 0xB959, 37433 - 11904: 0xB965, 37434 - 11904: 0xE0B1, 37436 - 11904: 0xFCFA, 37437 - 11904: 0xB95A, 37438 - 11904: 0xB95C, 37439 - 11904: 0xB966, 37440 - 11904: 0xB95B, 37441 - 11904: 0x9077, 37444 - 11904: 0x90AB, 37445 - 11904: 0xB964, 37446 - 11904: 0xE0B9, 37448 - 11904: 0xE0AE, 37449 - 11904: 0xB962, 37450 - 11904: 0xE0B8, 37451 - 11904: 0xB95E, 37452 - 11904: 0xE0CA, 37453 - 11904: 0xB963, 37454 - 11904: 0xE0C8, 37455 - 11904: 0xE0BC, 37456 - 11904: 0xE0C6, 37457 - 11904: 0xB960, 37458 - 11904: 0xE0AF, 37459 - 11904: 0xE0C9, 37460 - 11904: 0xE0C4, 37461 - 11904: 0x9D4D, 37462 - 11904: 0xE0CB, 37463 - 11904: 0xB958, 37464 - 11904: 0x99FA, 37466 - 11904: 0xB967, 37467 - 11904: 0xB95D, 37469 - 11904: 0x92E3, 37470 - 11904: 0xE0B5, 37471 - 11904: 0x97BB, 37472 - 11904: 0xE0BD, 37473 - 11904: 0xE0C1, 37474 - 11904: 0x9078, 37475 - 11904: 0xE0C5, 37476 - 11904: 0xB95F, 37477 - 11904: 0xE0B4, 37478 - 11904: 0xE0B2, 37479 - 11904: 0xE0BE, 37483 - 11904: 0x99FB, 37484 - 11904: 0xE0BB, 37485 - 11904: 0xE0BA, 37486 - 11904: 0x97E0, 37487 - 11904: 0xE0BF, 37488 - 11904: 0xE0C2, 37490 - 11904: 0xE0C7, 37494 - 11904: 0xE478, 37495 - 11904: 0x96DC, 37496 - 11904: 0xBBC7, 37497 - 11904: 0xE4A4, 37498 - 11904: 0xE47A, 37499 - 11904: 0xBBCC, 37500 - 11904: 0xBBD0, 37501 - 11904: 0xE4AD, 37502 - 11904: 0xE4B5, 37503 - 11904: 0xE4A6, 37504 - 11904: 0xBBC8, 37505 - 11904: 0x9CA8, 37506 - 11904: 0xE4AA, 37507 - 11904: 0xE0B6, 37508 - 11904: 0x9772, 37509 - 11904: 0xBBC9, 37510 - 11904: 0xE4B1, 37511 - 11904: 0xE4B6, 37512 - 11904: 0xE4AE, 37513 - 11904: 0x9440, 37514 - 11904: 0xE4B0, 37515 - 11904: 0xE4B9, 37516 - 11904: 0xE4B2, 37517 - 11904: 0xE47E, 37518 - 11904: 0xE4A9, 37519 - 11904: 0x92F2, 37521 - 11904: 0xBBD1, 37523 - 11904: 0xBBCD, 37524 - 11904: 0xE47C, 37525 - 11904: 0xE4AB, 37526 - 11904: 0xBBCB, 37527 - 11904: 0xE4A5, 37528 - 11904: 0xBBCA, 37529 - 11904: 0xE4B3, 37530 - 11904: 0xE4A2, 37531 - 11904: 0xE479, 37532 - 11904: 0xBBCE, 37533 - 11904: 0xE4B8, 37536 - 11904: 0xE47B, 37537 - 11904: 0xE4AF, 37538 - 11904: 0xE4AC, 37539 - 11904: 0xE4A7, 37540 - 11904: 0xE477, 37541 - 11904: 0xE476, 37542 - 11904: 0xE4A1, 37543 - 11904: 0xE4B4, 37544 - 11904: 0xBBCF, 37545 - 11904: 0xE4B7, 37546 - 11904: 0xE47D, 37547 - 11904: 0xE4A3, 37548 - 11904: 0xBE52, 37550 - 11904: 0x99FD, 37553 - 11904: 0x99FC, 37554 - 11904: 0xBE5A, 37555 - 11904: 0xBE55, 37556 - 11904: 0xE8A4, 37557 - 11904: 0xE8A1, 37558 - 11904: 0xE867, 37559 - 11904: 0xBE50, 37561 - 11904: 0xF9D7, 37562 - 11904: 0x964A, 37563 - 11904: 0xBE4F, 37564 - 11904: 0xBE56, 37566 - 11904: 0x96D8, 37567 - 11904: 0x99FE, 37568 - 11904: 0xE865, 37569 - 11904: 0xBE54, 37570 - 11904: 0xE871, 37571 - 11904: 0xE863, 37572 - 11904: 0xE864, 37573 - 11904: 0xBE4E, 37574 - 11904: 0xE8A3, 37575 - 11904: 0xBE58, 37576 - 11904: 0xE874, 37577 - 11904: 0xE879, 37578 - 11904: 0xE873, 37579 - 11904: 0xEBEE, 37580 - 11904: 0xE86F, 37581 - 11904: 0xE877, 37582 - 11904: 0xE875, 37583 - 11904: 0xE868, 37584 - 11904: 0xE862, 37585 - 11904: 0xE87D, 37586 - 11904: 0xBE57, 37587 - 11904: 0xE87E, 37588 - 11904: 0x904B, 37589 - 11904: 0xE878, 37591 - 11904: 0xE86D, 37592 - 11904: 0xE86B, 37593 - 11904: 0xE866, 37595 - 11904: 0xFA41, 37597 - 11904: 0xE86E, 37598 - 11904: 0xE87B, 37599 - 11904: 0xE86A, 37600 - 11904: 0xE87A, 37601 - 11904: 0xE8A2, 37603 - 11904: 0x9A40, 37604 - 11904: 0xBE53, 37605 - 11904: 0x975B, 37606 - 11904: 0xE876, 37607 - 11904: 0xE87C, 37608 - 11904: 0xE872, 37609 - 11904: 0xE86C, 37610 - 11904: 0xBE51, 37611 - 11904: 0x9A41, 37612 - 11904: 0x91DD, 37614 - 11904: 0xE4A8, 37615 - 11904: 0xE870, 37616 - 11904: 0xBE59, 37617 - 11904: 0xE869, 37618 - 11904: 0x93FC, 37619 - 11904: 0x9A42, 37620 - 11904: 0x9A43, 37622 - 11904: 0x9659, 37623 - 11904: 0xEBF4, 37624 - 11904: 0xBFF7, 37625 - 11904: 0xEBF3, 37626 - 11904: 0xEBF0, 37627 - 11904: 0xEC44, 37628 - 11904: 0xBFFB, 37629 - 11904: 0x9A44, 37630 - 11904: 0xEC41, 37631 - 11904: 0xEBF8, 37632 - 11904: 0xEC43, 37633 - 11904: 0xEBE9, 37634 - 11904: 0xEBF6, 37635 - 11904: 0x9051, 37636 - 11904: 0xBFFD, 37638 - 11904: 0xEBE1, 37639 - 11904: 0x94BF, 37640 - 11904: 0xEBDF, 37641 - 11904: 0xEC42, 37643 - 11904: 0xEC40, 37644 - 11904: 0xEBFE, 37645 - 11904: 0xEBED, 37646 - 11904: 0xEBEC, 37647 - 11904: 0xEBE2, 37648 - 11904: 0xC040, 37650 - 11904: 0xEBE8, 37651 - 11904: 0xEBF2, 37652 - 11904: 0xEBFD, 37653 - 11904: 0xC043, 37654 - 11904: 0xEC45, 37656 - 11904: 0xC1E8, 37657 - 11904: 0xC045, 37658 - 11904: 0xBFFE, 37659 - 11904: 0xEBE6, 37661 - 11904: 0xEBEF, 37662 - 11904: 0xEBDE, 37663 - 11904: 0xEBE0, 37664 - 11904: 0xBFF5, 37665 - 11904: 0xC042, 37666 - 11904: 0xBFFA, 37667 - 11904: 0xEBE7, 37668 - 11904: 0xEBF7, 37669 - 11904: 0xEBF1, 37670 - 11904: 0xC041, 37671 - 11904: 0xEBDD, 37672 - 11904: 0xC1E3, 37673 - 11904: 0xEBF9, 37674 - 11904: 0xEBFC, 37675 - 11904: 0xBFFC, 37676 - 11904: 0x90A2, 37677 - 11904: 0xEBEB, 37678 - 11904: 0xC044, 37679 - 11904: 0xBFF9, 37680 - 11904: 0x9CAB, 37681 - 11904: 0x9776, 37683 - 11904: 0xBFF8, 37684 - 11904: 0xEBF5, 37685 - 11904: 0xEBFB, 37686 - 11904: 0xBFF6, 37688 - 11904: 0xEBE4, 37689 - 11904: 0xEBFA, 37692 - 11904: 0xEBE5, 37696 - 11904: 0xFC55, 37697 - 11904: 0xFE45, 37698 - 11904: 0x94A8, 37699 - 11904: 0x9A45, 37700 - 11904: 0xFA4B, 37701 - 11904: 0x9DE1, 37702 - 11904: 0xEBEA, 37703 - 11904: 0xEED2, 37704 - 11904: 0x96D9, 37705 - 11904: 0xEED7, 37706 - 11904: 0xC1E5, 37707 - 11904: 0xC1E7, 37708 - 11904: 0xEEDD, 37709 - 11904: 0xC1E1, 37710 - 11904: 0xEEEC, 37711 - 11904: 0xEEE3, 37712 - 11904: 0xEED8, 37713 - 11904: 0xEED9, 37714 - 11904: 0xEEE2, 37716 - 11904: 0xC1EE, 37717 - 11904: 0xEEE1, 37718 - 11904: 0xEED1, 37719 - 11904: 0xEEE0, 37720 - 11904: 0xEED4, 37721 - 11904: 0xEEED, 37722 - 11904: 0xC1ED, 37723 - 11904: 0xC1EB, 37724 - 11904: 0xEED5, 37726 - 11904: 0xEEE8, 37727 - 11904: 0x9774, 37728 - 11904: 0xEEDA, 37729 - 11904: 0xEEE7, 37730 - 11904: 0xFDF5, 37731 - 11904: 0xEEE9, 37732 - 11904: 0xEED0, 37733 - 11904: 0xC1E6, 37734 - 11904: 0x92E5, 37735 - 11904: 0xEEEA, 37736 - 11904: 0x9645, 37737 - 11904: 0x91DA, 37738 - 11904: 0xEEDE, 37739 - 11904: 0x90A3, 37740 - 11904: 0xC1EA, 37741 - 11904: 0xEEDB, 37742 - 11904: 0xA05F, 37744 - 11904: 0xC1EC, 37745 - 11904: 0xEEE4, 37747 - 11904: 0x90AF, 37748 - 11904: 0x97BF, 37749 - 11904: 0xC1E4, 37750 - 11904: 0xEED6, 37751 - 11904: 0xEEE5, 37752 - 11904: 0x914C, 37753 - 11904: 0xEEDF, 37754 - 11904: 0xEBE3, 37755 - 11904: 0xEEE6, 37756 - 11904: 0xEED3, 37757 - 11904: 0x967A, 37758 - 11904: 0xC1E9, 37760 - 11904: 0xEEEB, 37761 - 11904: 0x91DE, 37762 - 11904: 0xC1E2, 37763 - 11904: 0xEECE, 37764 - 11904: 0x9A46, 37765 - 11904: 0xFEB0, 37766 - 11904: 0x9779, 37767 - 11904: 0x946C, 37768 - 11904: 0xF160, 37769 - 11904: 0xF159, 37770 - 11904: 0xC2E9, 37772 - 11904: 0xF154, 37773 - 11904: 0xF163, 37774 - 11904: 0xF15B, 37775 - 11904: 0xEEDC, 37776 - 11904: 0x9858, 37777 - 11904: 0xF165, 37778 - 11904: 0xF155, 37780 - 11904: 0xC2E8, 37781 - 11904: 0xF15F, 37782 - 11904: 0xC2EA, 37783 - 11904: 0xC2F2, 37784 - 11904: 0xC2F0, 37785 - 11904: 0xF161, 37786 - 11904: 0xC2F1, 37787 - 11904: 0xF157, 37788 - 11904: 0x9266, 37789 - 11904: 0xF158, 37790 - 11904: 0xF15D, 37791 - 11904: 0xF162, 37792 - 11904: 0x93FB, 37793 - 11904: 0xEECD, 37794 - 11904: 0xC2EB, 37795 - 11904: 0xF16A, 37796 - 11904: 0xF167, 37797 - 11904: 0xF16B, 37798 - 11904: 0xF15E, 37799 - 11904: 0xF15A, 37800 - 11904: 0xF168, 37801 - 11904: 0xF36A, 37802 - 11904: 0xF15C, 37804 - 11904: 0xC2EE, 37805 - 11904: 0x9A47, 37806 - 11904: 0xC2ED, 37807 - 11904: 0xEECF, 37808 - 11904: 0xC2EF, 37809 - 11904: 0xF164, 37810 - 11904: 0xF166, 37811 - 11904: 0xC2EC, 37812 - 11904: 0xF169, 37813 - 11904: 0xF153, 37815 - 11904: 0xF156, 37816 - 11904: 0x9749, 37819 - 11904: 0x9748, 37821 - 11904: 0x934A, 37823 - 11904: 0x9CE2, 37824 - 11904: 0xF373, 37826 - 11904: 0xF363, 37827 - 11904: 0xC3EB, 37828 - 11904: 0xF371, 37830 - 11904: 0x9264, 37831 - 11904: 0xF361, 37832 - 11904: 0xC3EC, 37834 - 11904: 0xF36C, 37835 - 11904: 0x91DF, 37836 - 11904: 0xF368, 37837 - 11904: 0xC3F1, 37838 - 11904: 0xF372, 37839 - 11904: 0xF362, 37840 - 11904: 0xF365, 37841 - 11904: 0xC3E9, 37842 - 11904: 0xF374, 37843 - 11904: 0xFB79, 37844 - 11904: 0xF36D, 37845 - 11904: 0xF370, 37846 - 11904: 0xC3EF, 37847 - 11904: 0xC3F4, 37848 - 11904: 0xC3F2, 37849 - 11904: 0xF369, 37850 - 11904: 0xF364, 37851 - 11904: 0x96D7, 37852 - 11904: 0xC3ED, 37853 - 11904: 0xC3EE, 37854 - 11904: 0xF360, 37855 - 11904: 0xC3EA, 37856 - 11904: 0x9343, 37857 - 11904: 0xC3E8, 37858 - 11904: 0xC3F0, 37859 - 11904: 0xF36F, 37860 - 11904: 0xC3F3, 37862 - 11904: 0xF36B, 37863 - 11904: 0xF375, 37864 - 11904: 0xC3F5, 37868 - 11904: 0xF367, 37870 - 11904: 0xF36E, 37872 - 11904: 0xFDCB, 37873 - 11904: 0xFE7A, 37875 - 11904: 0x91DB, 37876 - 11904: 0x8C6A, 37877 - 11904: 0xF4F3, 37878 - 11904: 0xF542, 37879 - 11904: 0xF4F5, 37880 - 11904: 0xF4FC, 37881 - 11904: 0xF366, 37882 - 11904: 0xF4FA, 37883 - 11904: 0xF4E9, 37884 - 11904: 0xF540, 37885 - 11904: 0xC4C3, 37886 - 11904: 0xF4ED, 37887 - 11904: 0xF4FE, 37888 - 11904: 0xF4F4, 37889 - 11904: 0x97AF, 37891 - 11904: 0xC4C2, 37892 - 11904: 0x95DD, 37894 - 11904: 0xF544, 37895 - 11904: 0xF4F6, 37896 - 11904: 0x9348, 37897 - 11904: 0xF4FB, 37898 - 11904: 0xF4FD, 37899 - 11904: 0xF4E7, 37900 - 11904: 0xF541, 37901 - 11904: 0xF4F2, 37902 - 11904: 0xF4F7, 37903 - 11904: 0xF4EB, 37904 - 11904: 0xF4EF, 37905 - 11904: 0xF543, 37906 - 11904: 0xF4F9, 37907 - 11904: 0xF4E8, 37908 - 11904: 0xF4EC, 37909 - 11904: 0xF4EE, 37910 - 11904: 0xF4F8, 37911 - 11904: 0x9A4B, 37912 - 11904: 0xC4C1, 37913 - 11904: 0xF4F1, 37915 - 11904: 0xFC45, 37917 - 11904: 0x9A4D, 37920 - 11904: 0xF4EA, 37924 - 11904: 0x91BC, 37925 - 11904: 0x90E2, 37926 - 11904: 0x90B4, 37927 - 11904: 0x95E1, 37928 - 11904: 0xF4F0, 37929 - 11904: 0xF661, 37930 - 11904: 0xF666, 37931 - 11904: 0xC54F, 37932 - 11904: 0xF668, 37933 - 11904: 0x9A4E, 37934 - 11904: 0xC549, 37935 - 11904: 0x87AD, 37936 - 11904: 0xF664, 37937 - 11904: 0xF66A, 37938 - 11904: 0xC54E, 37939 - 11904: 0xC54A, 37941 - 11904: 0xC54B, 37942 - 11904: 0xF660, 37943 - 11904: 0xF667, 37944 - 11904: 0xC54D, 37945 - 11904: 0xF665, 37946 - 11904: 0xC54C, 37947 - 11904: 0xF65F, 37948 - 11904: 0xF663, 37949 - 11904: 0xF662, 37950 - 11904: 0x9A4F, 37951 - 11904: 0xF65E, 37952 - 11904: 0xF669, 37954 - 11904: 0xFE40, 37955 - 11904: 0xFE43, 37956 - 11904: 0xC5B1, 37957 - 11904: 0xF76D, 37958 - 11904: 0xF770, 37959 - 11904: 0xF76C, 37960 - 11904: 0xF76E, 37961 - 11904: 0xF76F, 37962 - 11904: 0xF769, 37963 - 11904: 0xF76A, 37964 - 11904: 0xF767, 37965 - 11904: 0x96DD, 37967 - 11904: 0xF76B, 37968 - 11904: 0xF768, 37969 - 11904: 0xC5B2, 37970 - 11904: 0xC5B3, 37972 - 11904: 0x9A51, 37973 - 11904: 0xF84B, 37975 - 11904: 0xF84D, 37976 - 11904: 0x96A7, 37979 - 11904: 0x90B0, 37981 - 11904: 0xF84C, 37982 - 11904: 0xF84E, 37984 - 11904: 0xC5E0, 37986 - 11904: 0xF84A, 37987 - 11904: 0xC5DF, 37988 - 11904: 0xC5E1, 37989 - 11904: 0x9C4E, 37991 - 11904: 0x9443, 37992 - 11904: 0xF8CB, 37993 - 11904: 0xF8CC, 37994 - 11904: 0xC644, 37995 - 11904: 0xF8CA, 37996 - 11904: 0x8EBA, 37997 - 11904: 0xF953, 37998 - 11904: 0xF952, 37999 - 11904: 0xF954, 38000 - 11904: 0xC65F, 38001 - 11904: 0xF955, 38002 - 11904: 0xC65E, 38003 - 11904: 0xF956, 38004 - 11904: 0xF972, 38005 - 11904: 0xF975, 38006 - 11904: 0xF974, 38007 - 11904: 0xC668, 38008 - 11904: 0xF973, 38009 - 11904: 0x9A52, 38011 - 11904: 0xFCC1, 38012 - 11904: 0xC672, 38013 - 11904: 0xC670, 38014 - 11904: 0xC671, 38015 - 11904: 0xC677, 38016 - 11904: 0xF9C0, 38017 - 11904: 0xF9C1, 38018 - 11904: 0xF9BF, 38019 - 11904: 0xF9C9, 38021 - 11904: 0x8BE9, 38047 - 11904: 0x9CAF, 38050 - 11904: 0x8BFD, 38081 - 11904: 0x9ABC, 38083 - 11904: 0x9AB8, 38108 - 11904: 0x9AAE, 38134 - 11904: 0x9AA7, 38189 - 11904: 0x9A53, 38215 - 11904: 0x9D74, 38263 - 11904: 0xAAF8, 38264 - 11904: 0x8BEA, 38266 - 11904: 0xD844, 38267 - 11904: 0xDC78, 38268 - 11904: 0xE8A5, 38269 - 11904: 0xF376, 38271 - 11904: 0x8BEB, 38272 - 11904: 0xAAF9, 38274 - 11904: 0xADAC, 38275 - 11904: 0xB07B, 38277 - 11904: 0x90B2, 38278 - 11904: 0xD845, 38280 - 11904: 0xD846, 38281 - 11904: 0xB3AC, 38283 - 11904: 0xB67D, 38284 - 11904: 0xDC7A, 38285 - 11904: 0xDC79, 38286 - 11904: 0xB6A3, 38287 - 11904: 0xB67C, 38288 - 11904: 0xDC7B, 38289 - 11904: 0xB67E, 38290 - 11904: 0xB6A2, 38291 - 11904: 0xB6A1, 38292 - 11904: 0xB67B, 38294 - 11904: 0x95E9, 38295 - 11904: 0x95E8, 38296 - 11904: 0xB968, 38297 - 11904: 0x95E6, 38299 - 11904: 0xE0D0, 38300 - 11904: 0xE0CE, 38302 - 11904: 0xE0CF, 38303 - 11904: 0xE0CD, 38304 - 11904: 0x90B5, 38305 - 11904: 0xBBD2, 38306 - 11904: 0x9A54, 38307 - 11904: 0xBBD5, 38308 - 11904: 0xBBD7, 38309 - 11904: 0xBBD6, 38310 - 11904: 0x90B3, 38311 - 11904: 0x95E7, 38312 - 11904: 0xBBD3, 38313 - 11904: 0xBBD4, 38314 - 11904: 0x8B50, 38315 - 11904: 0xE8A7, 38316 - 11904: 0xE8A6, 38317 - 11904: 0xBE5B, 38318 - 11904: 0xE8A8, 38320 - 11904: 0xE8A9, 38321 - 11904: 0xBE5C, 38325 - 11904: 0xEC4D, 38326 - 11904: 0xEC4B, 38327 - 11904: 0xEEF3, 38329 - 11904: 0xEC49, 38330 - 11904: 0xEC4A, 38331 - 11904: 0xC046, 38332 - 11904: 0xEC46, 38333 - 11904: 0xEC4E, 38334 - 11904: 0xEC48, 38335 - 11904: 0xEC4C, 38336 - 11904: 0xEEEF, 38339 - 11904: 0xEEF1, 38341 - 11904: 0xEEF2, 38342 - 11904: 0xC1F3, 38343 - 11904: 0xEEEE, 38344 - 11904: 0xC1F2, 38345 - 11904: 0xEEF0, 38346 - 11904: 0xC1EF, 38347 - 11904: 0xC1F0, 38348 - 11904: 0xC1F1, 38349 - 11904: 0xEC47, 38352 - 11904: 0xC2F5, 38353 - 11904: 0xF16E, 38354 - 11904: 0xF16C, 38355 - 11904: 0xF16D, 38356 - 11904: 0xC2F3, 38357 - 11904: 0xC2F6, 38358 - 11904: 0xC2F4, 38362 - 11904: 0xF377, 38363 - 11904: 0xF378, 38364 - 11904: 0xC3F6, 38366 - 11904: 0xF545, 38367 - 11904: 0xF547, 38368 - 11904: 0xF546, 38369 - 11904: 0xC4C4, 38370 - 11904: 0xC550, 38371 - 11904: 0xF66D, 38372 - 11904: 0xF66C, 38373 - 11904: 0xF66B, 38376 - 11904: 0x8BEC, 38388 - 11904: 0x9A56, 38428 - 11904: 0xAAFA, 38429 - 11904: 0x8BFB, 38430 - 11904: 0xC9AA, 38432 - 11904: 0xCA58, 38433 - 11904: 0xA6E9, 38434 - 11904: 0xCA56, 38435 - 11904: 0xCA59, 38436 - 11904: 0xCA57, 38440 - 11904: 0xCBAE, 38442 - 11904: 0xA8C1, 38444 - 11904: 0xA8C2, 38445 - 11904: 0xCBB0, 38446 - 11904: 0xA8BF, 38447 - 11904: 0xCBAF, 38448 - 11904: 0xCBAD, 38449 - 11904: 0xA8C0, 38450 - 11904: 0xA8BE, 38451 - 11904: 0x9A57, 38456 - 11904: 0xA0AA, 38457 - 11904: 0xCDD8, 38458 - 11904: 0xCDDB, 38459 - 11904: 0xAAFD, 38460 - 11904: 0xCDDA, 38461 - 11904: 0xCDD9, 38463 - 11904: 0xAAFC, 38464 - 11904: 0xAAFB, 38465 - 11904: 0x9FA6, 38466 - 11904: 0xAB40, 38467 - 11904: 0xCDDC, 38468 - 11904: 0xAAFE, 38469 - 11904: 0x99CC, 38474 - 11904: 0xD0C6, 38475 - 11904: 0xADAE, 38476 - 11904: 0xADAF, 38477 - 11904: 0xADB0, 38478 - 11904: 0xD0C7, 38479 - 11904: 0xD0C3, 38480 - 11904: 0xADAD, 38481 - 11904: 0xD0C4, 38483 - 11904: 0xD0C5, 38484 - 11904: 0xD0C2, 38486 - 11904: 0x9C59, 38488 - 11904: 0xB0A4, 38491 - 11904: 0xB0A1, 38492 - 11904: 0xD445, 38493 - 11904: 0xB0A2, 38494 - 11904: 0xB0A5, 38495 - 11904: 0xD446, 38497 - 11904: 0xB07E, 38498 - 11904: 0xB07C, 38499 - 11904: 0xB07D, 38500 - 11904: 0xB0A3, 38505 - 11904: 0x99B5, 38506 - 11904: 0xB3AD, 38507 - 11904: 0xD849, 38508 - 11904: 0xB3B5, 38509 - 11904: 0xD848, 38511 - 11904: 0xD84B, 38512 - 11904: 0xB3B1, 38513 - 11904: 0xD84A, 38514 - 11904: 0xB6AB, 38515 - 11904: 0xB3AF, 38516 - 11904: 0xB3B2, 38517 - 11904: 0xB3AE, 38518 - 11904: 0xB3B3, 38519 - 11904: 0xB3B4, 38520 - 11904: 0xB3B0, 38523 - 11904: 0x90BE, 38524 - 11904: 0xD847, 38525 - 11904: 0xB6A7, 38526 - 11904: 0xDC7D, 38528 - 11904: 0xDCA3, 38529 - 11904: 0x9FAF, 38531 - 11904: 0xDCA2, 38532 - 11904: 0xB6AC, 38533 - 11904: 0xB6A8, 38534 - 11904: 0xB6A9, 38535 - 11904: 0xDC7C, 38536 - 11904: 0xDC7E, 38537 - 11904: 0xDCA1, 38538 - 11904: 0xB6A4, 38539 - 11904: 0xB6A6, 38541 - 11904: 0xB6AA, 38542 - 11904: 0xB6A5, 38543 - 11904: 0x95F2, 38545 - 11904: 0xE0D3, 38546 - 11904: 0xE0D1, 38547 - 11904: 0xE0D2, 38548 - 11904: 0xB96A, 38549 - 11904: 0xB96B, 38550 - 11904: 0x90BF, 38551 - 11904: 0xE0D4, 38552 - 11904: 0xB969, 38553 - 11904: 0xBBD8, 38555 - 11904: 0xBBDA, 38556 - 11904: 0xBBD9, 38558 - 11904: 0xE4BB, 38561 - 11904: 0xE4BC, 38562 - 11904: 0xE8AB, 38563 - 11904: 0x90C1, 38564 - 11904: 0xE8AA, 38565 - 11904: 0xFEE4, 38567 - 11904: 0xC047, 38568 - 11904: 0xC048, 38569 - 11904: 0xEC4F, 38570 - 11904: 0xC049, 38572 - 11904: 0xEEF6, 38574 - 11904: 0xEEF4, 38576 - 11904: 0xEEF5, 38577 - 11904: 0xC1F4, 38579 - 11904: 0xF16F, 38580 - 11904: 0xC3F7, 38582 - 11904: 0xC6D7, 38584 - 11904: 0xC1F5, 38585 - 11904: 0xAB41, 38587 - 11904: 0xB0A6, 38588 - 11904: 0xD447, 38589 - 11904: 0x90C7, 38591 - 11904: 0xD84C, 38592 - 11904: 0xB3B6, 38593 - 11904: 0xB6AD, 38594 - 11904: 0xDCA4, 38595 - 11904: 0xDCA6, 38596 - 11904: 0xB6AF, 38597 - 11904: 0xB6AE, 38598 - 11904: 0xB6B0, 38599 - 11904: 0xB6B1, 38600 - 11904: 0xDCA5, 38601 - 11904: 0xB96E, 38602 - 11904: 0xB96F, 38603 - 11904: 0xB96D, 38604 - 11904: 0xBBDB, 38605 - 11904: 0xB96C, 38606 - 11904: 0xE0D5, 38610 - 11904: 0xBBDC, 38611 - 11904: 0xE8AC, 38612 - 11904: 0xEC50, 38613 - 11904: 0xC04A, 38614 - 11904: 0xC1F6, 38615 - 11904: 0xF170, 38616 - 11904: 0xF174, 38617 - 11904: 0xC2F9, 38618 - 11904: 0xF171, 38619 - 11904: 0xC2FA, 38620 - 11904: 0xC2F8, 38621 - 11904: 0xF175, 38622 - 11904: 0xC2FB, 38623 - 11904: 0xF173, 38625 - 11904: 0xF379, 38626 - 11904: 0xC2F7, 38627 - 11904: 0xC3F8, 38629 - 11904: 0xF8CD, 38632 - 11904: 0xAB42, 38633 - 11904: 0xB3B8, 38634 - 11904: 0xB3B7, 38639 - 11904: 0xB6B2, 38640 - 11904: 0xDCA8, 38641 - 11904: 0xDCA7, 38642 - 11904: 0xB6B3, 38644 - 11904: 0x92E4, 38645 - 11904: 0xE0D9, 38646 - 11904: 0xB973, 38647 - 11904: 0xB970, 38648 - 11904: 0xE0D8, 38649 - 11904: 0xB972, 38650 - 11904: 0xE0D6, 38651 - 11904: 0xB971, 38653 - 11904: 0xE0D7, 38655 - 11904: 0xE4BD, 38656 - 11904: 0xBBDD, 38658 - 11904: 0xE8AF, 38659 - 11904: 0x9F52, 38660 - 11904: 0xBE5D, 38661 - 11904: 0xE8AD, 38662 - 11904: 0xBE5E, 38663 - 11904: 0xBE5F, 38664 - 11904: 0xE8AE, 38665 - 11904: 0xBE60, 38667 - 11904: 0xEC51, 38669 - 11904: 0xC04E, 38670 - 11904: 0xC04B, 38671 - 11904: 0xC050, 38672 - 11904: 0xEC53, 38673 - 11904: 0xC04C, 38674 - 11904: 0xEC52, 38675 - 11904: 0xC04F, 38678 - 11904: 0xC04D, 38680 - 11904: 0xEEF9, 38681 - 11904: 0xEEFB, 38683 - 11904: 0x90DB, 38684 - 11904: 0xC1F7, 38685 - 11904: 0xEEFA, 38686 - 11904: 0xC1F8, 38687 - 11904: 0xEEF8, 38688 - 11904: 0xEEF7, 38689 - 11904: 0xA066, 38690 - 11904: 0xF177, 38691 - 11904: 0xF176, 38692 - 11904: 0xC2FC, 38693 - 11904: 0xF178, 38694 - 11904: 0xF37E, 38695 - 11904: 0xC3FA, 38696 - 11904: 0xF37D, 38697 - 11904: 0xF37A, 38698 - 11904: 0xC3F9, 38699 - 11904: 0xF37B, 38700 - 11904: 0xF37C, 38702 - 11904: 0xF548, 38703 - 11904: 0xF549, 38704 - 11904: 0xC4C5, 38705 - 11904: 0x90D2, 38706 - 11904: 0xC553, 38708 - 11904: 0x876B, 38709 - 11904: 0xF66E, 38710 - 11904: 0x90D4, 38712 - 11904: 0xC551, 38713 - 11904: 0xC552, 38714 - 11904: 0xF66F, 38717 - 11904: 0xC5B4, 38718 - 11904: 0xC5B5, 38719 - 11904: 0xF771, 38720 - 11904: 0x9A5B, 38721 - 11904: 0x95FD, 38722 - 11904: 0xC645, 38723 - 11904: 0xF8CF, 38724 - 11904: 0xC647, 38726 - 11904: 0xF8CE, 38727 - 11904: 0xF8D0, 38728 - 11904: 0xC646, 38729 - 11904: 0xF957, 38730 - 11904: 0x87B1, 38731 - 11904: 0xF9AD, 38737 - 11904: 0x8BC4, 38738 - 11904: 0xAB43, 38741 - 11904: 0x8C66, 38742 - 11904: 0xB974, 38743 - 11904: 0x90DE, 38744 - 11904: 0xE4BE, 38746 - 11904: 0xE8B0, 38747 - 11904: 0xC051, 38748 - 11904: 0xC052, 38749 - 11904: 0x9CE4, 38750 - 11904: 0xAB44, 38751 - 11904: 0x90E1, 38752 - 11904: 0xBE61, 38753 - 11904: 0xC3FB, 38754 - 11904: 0xADB1, 38758 - 11904: 0xC053, 38760 - 11904: 0xC5E2, 38761 - 11904: 0xADB2, 38762 - 11904: 0xD84D, 38764 - 11904: 0xDCA9, 38765 - 11904: 0x9E46, 38766 - 11904: 0xDCAB, 38768 - 11904: 0xDCAA, 38769 - 11904: 0x9651, 38770 - 11904: 0xE0DD, 38771 - 11904: 0xE0DA, 38772 - 11904: 0xB975, 38774 - 11904: 0xB976, 38775 - 11904: 0xE0DB, 38776 - 11904: 0xE0DC, 38778 - 11904: 0xE4C0, 38779 - 11904: 0xE4C5, 38780 - 11904: 0xBBDE, 38781 - 11904: 0xE4BF, 38782 - 11904: 0xE4C1, 38783 - 11904: 0xE4C8, 38784 - 11904: 0xE4C3, 38785 - 11904: 0xE4C7, 38786 - 11904: 0xE4C4, 38787 - 11904: 0xE4C2, 38788 - 11904: 0xE4C6, 38789 - 11904: 0xBBDF, 38791 - 11904: 0xFB58, 38792 - 11904: 0xE8B3, 38793 - 11904: 0x90E6, 38794 - 11904: 0xE8B1, 38795 - 11904: 0xBE63, 38797 - 11904: 0xBE62, 38798 - 11904: 0xE8B2, 38799 - 11904: 0xBE64, 38804 - 11904: 0xEC56, 38807 - 11904: 0xEC55, 38808 - 11904: 0xC054, 38809 - 11904: 0xEC54, 38810 - 11904: 0xEEFC, 38811 - 11904: 0x9650, 38812 - 11904: 0xEEFE, 38813 - 11904: 0xEF41, 38814 - 11904: 0xEF40, 38815 - 11904: 0x90E7, 38816 - 11904: 0xC1F9, 38817 - 11904: 0xEEFD, 38818 - 11904: 0xF1A1, 38819 - 11904: 0xC2FD, 38820 - 11904: 0xF17D, 38821 - 11904: 0xF1A2, 38822 - 11904: 0xC2FE, 38824 - 11904: 0xF17B, 38826 - 11904: 0xF17E, 38827 - 11904: 0xF17C, 38828 - 11904: 0xF179, 38829 - 11904: 0xC340, 38830 - 11904: 0xF17A, 38833 - 11904: 0x90E8, 38834 - 11904: 0x9A5D, 38835 - 11904: 0xF3A1, 38836 - 11904: 0x9F7A, 38838 - 11904: 0xF3A3, 38839 - 11904: 0xF3A2, 38840 - 11904: 0x9B5C, 38841 - 11904: 0xF54A, 38842 - 11904: 0x9F7C, 38843 - 11904: 0xF54B, 38845 - 11904: 0xFC52, 38846 - 11904: 0x90E9, 38847 - 11904: 0xF670, 38848 - 11904: 0x90EA, 38849 - 11904: 0xC5B7, 38850 - 11904: 0x9A5E, 38851 - 11904: 0xC5B6, 38852 - 11904: 0xF84F, 38853 - 11904: 0xF850, 38854 - 11904: 0xC648, 38855 - 11904: 0xF8D1, 38856 - 11904: 0x9F76, 38857 - 11904: 0xC669, 38859 - 11904: 0xADB3, 38860 - 11904: 0xB6B4, 38861 - 11904: 0xE4CA, 38862 - 11904: 0xE4C9, 38863 - 11904: 0xE8B5, 38864 - 11904: 0xE8B4, 38866 - 11904: 0x90EB, 38867 - 11904: 0xC1FA, 38868 - 11904: 0xEF43, 38869 - 11904: 0xEF42, 38870 - 11904: 0xF1A5, 38871 - 11904: 0xF1A3, 38872 - 11904: 0xF1A6, 38873 - 11904: 0xF1A4, 38876 - 11904: 0xC3FC, 38877 - 11904: 0xF3A4, 38878 - 11904: 0xF3A5, 38879 - 11904: 0xF3A6, 38880 - 11904: 0x90EC, 38881 - 11904: 0xF671, 38883 - 11904: 0xF772, 38885 - 11904: 0xF8D2, 38886 - 11904: 0x8BEE, 38893 - 11904: 0xADB4, 38894 - 11904: 0x90EE, 38896 - 11904: 0xEC57, 38897 - 11904: 0xEF44, 38898 - 11904: 0x91C6, 38899 - 11904: 0xADB5, 38901 - 11904: 0x90F2, 38902 - 11904: 0xBBE0, 38904 - 11904: 0xEC58, 38905 - 11904: 0xC341, 38906 - 11904: 0xF1A7, 38907 - 11904: 0xC3FD, 38909 - 11904: 0xF54C, 38910 - 11904: 0xF54D, 38911 - 11904: 0xC554, 38912 - 11904: 0xF851, 38913 - 11904: 0xADB6, 38914 - 11904: 0xB3BB, 38915 - 11904: 0xB3BC, 38916 - 11904: 0xD84E, 38917 - 11904: 0xB6B5, 38918 - 11904: 0xB6B6, 38919 - 11904: 0xDCAC, 38920 - 11904: 0xB6B7, 38922 - 11904: 0xB97A, 38924 - 11904: 0xB97C, 38925 - 11904: 0xE0DF, 38926 - 11904: 0xE0E0, 38927 - 11904: 0xE0DE, 38928 - 11904: 0xB977, 38929 - 11904: 0xB978, 38930 - 11904: 0xB97B, 38931 - 11904: 0xB979, 38932 - 11904: 0xFCBC, 38933 - 11904: 0x8A74, 38934 - 11904: 0xE4CB, 38935 - 11904: 0xBBE1, 38936 - 11904: 0xBBE2, 38939 - 11904: 0xE8BC, 38940 - 11904: 0xBE67, 38941 - 11904: 0xE8B7, 38942 - 11904: 0xE8B6, 38943 - 11904: 0x9657, 38944 - 11904: 0xE8BB, 38945 - 11904: 0xBE65, 38947 - 11904: 0x9CEF, 38948 - 11904: 0xC05B, 38950 - 11904: 0xE8B8, 38951 - 11904: 0xE8BD, 38952 - 11904: 0xE8BA, 38953 - 11904: 0xE8B9, 38955 - 11904: 0xBE66, 38957 - 11904: 0xC059, 38958 - 11904: 0x9FDF, 38959 - 11904: 0xEC5A, 38960 - 11904: 0xC055, 38962 - 11904: 0xEC5B, 38963 - 11904: 0x90F7, 38964 - 11904: 0x90F6, 38965 - 11904: 0xEC59, 38967 - 11904: 0xC058, 38968 - 11904: 0xC056, 38969 - 11904: 0xC05A, 38971 - 11904: 0xC057, 38977 - 11904: 0xEF45, 38979 - 11904: 0xEF4A, 38980 - 11904: 0xEF46, 38981 - 11904: 0xEF49, 38982 - 11904: 0xC1FB, 38983 - 11904: 0x9B5E, 38984 - 11904: 0xEDD4, 38985 - 11904: 0xEF48, 38986 - 11904: 0xEF47, 38987 - 11904: 0x90F8, 38988 - 11904: 0xC344, 38989 - 11904: 0xC342, 38990 - 11904: 0xC345, 38991 - 11904: 0xC343, 38992 - 11904: 0xF1A8, 38993 - 11904: 0xF1A9, 38994 - 11904: 0xF1AA, 38995 - 11904: 0xC346, 38998 - 11904: 0x8CFC, 38999 - 11904: 0xF3AA, 39000 - 11904: 0xC440, 39001 - 11904: 0xF3A8, 39003 - 11904: 0xC441, 39004 - 11904: 0xF3A7, 39005 - 11904: 0xF3A9, 39006 - 11904: 0xC3FE, 39007 - 11904: 0xF551, 39008 - 11904: 0xF54E, 39010 - 11904: 0xF54F, 39011 - 11904: 0xF550, 39012 - 11904: 0xF672, 39013 - 11904: 0xC556, 39014 - 11904: 0x90F9, 39015 - 11904: 0xC555, 39016 - 11904: 0x8CC9, 39017 - 11904: 0xF774, 39018 - 11904: 0xF773, 39019 - 11904: 0xC5B8, 39020 - 11904: 0xFA6A, 39023 - 11904: 0xC5E3, 39024 - 11904: 0xC649, 39025 - 11904: 0xC660, 39026 - 11904: 0xF958, 39027 - 11904: 0xF9AE, 39028 - 11904: 0xF9AF, 39029 - 11904: 0x8BEF, 39080 - 11904: 0xADB7, 39081 - 11904: 0xDCAD, 39084 - 11904: 0xE0E1, 39085 - 11904: 0xE4CC, 39086 - 11904: 0xE4CD, 39087 - 11904: 0xBBE3, 39089 - 11904: 0xBBE4, 39090 - 11904: 0xE8BE, 39091 - 11904: 0xBE68, 39092 - 11904: 0x9FE0, 39094 - 11904: 0xC1FC, 39095 - 11904: 0x9142, 39096 - 11904: 0xF1AB, 39097 - 11904: 0x9A62, 39098 - 11904: 0xC347, 39099 - 11904: 0xF3AD, 39100 - 11904: 0xC442, 39101 - 11904: 0xF3AC, 39102 - 11904: 0xF3AE, 39103 - 11904: 0xF3AB, 39104 - 11904: 0xF675, 39105 - 11904: 0xF552, 39106 - 11904: 0xF553, 39107 - 11904: 0x9569, 39108 - 11904: 0xC4C6, 39110 - 11904: 0xF674, 39111 - 11904: 0x9144, 39112 - 11904: 0x9143, 39113 - 11904: 0xF673, 39114 - 11904: 0x9141, 39115 - 11904: 0xF775, 39116 - 11904: 0xF9B0, 39118 - 11904: 0x8BF0, 39131 - 11904: 0xADB8, 39132 - 11904: 0x9660, 39134 - 11904: 0x8BF1, 39135 - 11904: 0xADB9, 39136 - 11904: 0x99F6, 39137 - 11904: 0x9149, 39138 - 11904: 0xB0A7, 39139 - 11904: 0xD448, 39141 - 11904: 0xD84F, 39142 - 11904: 0x914A, 39143 - 11904: 0xB6B8, 39145 - 11904: 0xB6BB, 39146 - 11904: 0xB6B9, 39147 - 11904: 0xDCAE, 39148 - 11904: 0x914B, 39149 - 11904: 0xB6BD, 39151 - 11904: 0xB6BA, 39153 - 11904: 0x9A64, 39154 - 11904: 0xB6BC, 39156 - 11904: 0xB97E, 39157 - 11904: 0x8ABF, 39158 - 11904: 0xE0E2, 39161 - 11904: 0xE0E3, 39162 - 11904: 0xE8C0, 39164 - 11904: 0xB97D, 39165 - 11904: 0xB9A1, 39166 - 11904: 0xB9A2, 39168 - 11904: 0xE4CF, 39170 - 11904: 0xE4CE, 39171 - 11904: 0xBBE5, 39173 - 11904: 0xBBE6, 39175 - 11904: 0xE4D0, 39176 - 11904: 0xE8BF, 39177 - 11904: 0xBBE8, 39178 - 11904: 0xBE69, 39180 - 11904: 0xBBE7, 39182 - 11904: 0x9A66, 39184 - 11904: 0xC05C, 39185 - 11904: 0xE8C1, 39186 - 11904: 0xBE6B, 39187 - 11904: 0xBE6A, 39188 - 11904: 0xE8C2, 39189 - 11904: 0xE8C5, 39190 - 11904: 0xE8C3, 39191 - 11904: 0xE8C4, 39192 - 11904: 0xBE6C, 39193 - 11904: 0x9A67, 39194 - 11904: 0xC061, 39195 - 11904: 0xC05F, 39196 - 11904: 0x9A69, 39198 - 11904: 0xC05E, 39199 - 11904: 0xEC5D, 39201 - 11904: 0xC060, 39204 - 11904: 0xEC5C, 39205 - 11904: 0xEF4B, 39207 - 11904: 0xEC5E, 39208 - 11904: 0xC05D, 39209 - 11904: 0xEC5F, 39210 - 11904: 0xEF4E, 39211 - 11904: 0xEF4C, 39212 - 11904: 0xEF4D, 39213 - 11904: 0xEF52, 39214 - 11904: 0xC34B, 39215 - 11904: 0xEF51, 39216 - 11904: 0xEF54, 39217 - 11904: 0xEF53, 39218 - 11904: 0xEF50, 39219 - 11904: 0xEF4F, 39221 - 11904: 0xC1FD, 39223 - 11904: 0x9A6A, 39224 - 11904: 0x9652, 39225 - 11904: 0x914D, 39226 - 11904: 0xF1AE, 39227 - 11904: 0x9666, 39228 - 11904: 0xF1AD, 39229 - 11904: 0xC34A, 39230 - 11904: 0xC348, 39231 - 11904: 0xC349, 39232 - 11904: 0x9F7B, 39233 - 11904: 0xF1AC, 39234 - 11904: 0x9A6B, 39235 - 11904: 0xF3B1, 39237 - 11904: 0xC443, 39239 - 11904: 0xF3B0, 39240 - 11904: 0xF3AF, 39241 - 11904: 0xC444, 39242 - 11904: 0xA06C, 39243 - 11904: 0xF558, 39244 - 11904: 0xF557, 39245 - 11904: 0x9667, 39246 - 11904: 0xF555, 39248 - 11904: 0xF554, 39249 - 11904: 0xC4C8, 39250 - 11904: 0xC4C7, 39251 - 11904: 0xF559, 39252 - 11904: 0xF776, 39253 - 11904: 0xC5B9, 39254 - 11904: 0xF677, 39255 - 11904: 0xC557, 39256 - 11904: 0xF676, 39257 - 11904: 0xF556, 39259 - 11904: 0xF777, 39260 - 11904: 0xC5E4, 39261 - 11904: 0x9A6C, 39262 - 11904: 0xC661, 39263 - 11904: 0xF959, 39265 - 11904: 0xF9B1, 39266 - 11904: 0x9A6D, 39267 - 11904: 0x8BF2, 39318 - 11904: 0xADBA, 39319 - 11904: 0xD850, 39320 - 11904: 0xEF55, 39321 - 11904: 0xADBB, 39323 - 11904: 0x966A, 39324 - 11904: 0xE4D2, 39325 - 11904: 0xE4D1, 39326 - 11904: 0xEC60, 39329 - 11904: 0xEF57, 39331 - 11904: 0xEF56, 39332 - 11904: 0xFCEA, 39333 - 11904: 0xC34C, 39334 - 11904: 0xF3B2, 39335 - 11904: 0xF3B3, 39336 - 11904: 0xC4C9, 39338 - 11904: 0x966C, 39339 - 11904: 0xF9B2, 39340 - 11904: 0xB0A8, 39341 - 11904: 0xB6BF, 39342 - 11904: 0xB6BE, 39343 - 11904: 0xE0E4, 39344 - 11904: 0xE0E6, 39345 - 11904: 0xB9A4, 39346 - 11904: 0xE0E5, 39347 - 11904: 0xB9A3, 39348 - 11904: 0xB9A5, 39349 - 11904: 0xE0E7, 39352 - 11904: 0x91C4, 39353 - 11904: 0xE4D4, 39354 - 11904: 0xE4D6, 39355 - 11904: 0xE4D5, 39356 - 11904: 0x9677, 39357 - 11904: 0xE4D8, 39361 - 11904: 0xBBE9, 39362 - 11904: 0xE4D7, 39363 - 11904: 0xE4D3, 39364 - 11904: 0x99F4, 39365 - 11904: 0x9A6F, 39367 - 11904: 0xE4D9, 39369 - 11904: 0xE8CC, 39371 - 11904: 0xE8CF, 39372 - 11904: 0xE8D1, 39373 - 11904: 0xE8C7, 39374 - 11904: 0xE8CB, 39375 - 11904: 0xE8C8, 39376 - 11904: 0xBE6E, 39377 - 11904: 0xBE71, 39378 - 11904: 0xBE73, 39379 - 11904: 0xE8C9, 39380 - 11904: 0xE8CA, 39381 - 11904: 0xBE72, 39382 - 11904: 0xE8CD, 39383 - 11904: 0xE8D0, 39384 - 11904: 0xE8CE, 39385 - 11904: 0xBE74, 39386 - 11904: 0x9FAB, 39387 - 11904: 0xBE70, 39388 - 11904: 0xE8C6, 39389 - 11904: 0xBE6D, 39391 - 11904: 0xBE6F, 39392 - 11904: 0x8CBE, 39393 - 11904: 0x8EC1, 39394 - 11904: 0xC063, 39395 - 11904: 0xEC66, 39396 - 11904: 0xEC64, 39397 - 11904: 0xEC63, 39398 - 11904: 0x9555, 39399 - 11904: 0xEC69, 39401 - 11904: 0xEC68, 39402 - 11904: 0xEC67, 39404 - 11904: 0xEC62, 39405 - 11904: 0xC062, 39406 - 11904: 0xEC61, 39408 - 11904: 0xEC65, 39409 - 11904: 0xC064, 39412 - 11904: 0xEF5A, 39413 - 11904: 0x9152, 39414 - 11904: 0xEF5E, 39415 - 11904: 0xEF5B, 39416 - 11904: 0xEF5D, 39417 - 11904: 0xEF5C, 39418 - 11904: 0xEF59, 39419 - 11904: 0xEF5F, 39420 - 11904: 0xEF62, 39421 - 11904: 0xEF60, 39422 - 11904: 0xEF61, 39423 - 11904: 0xC240, 39425 - 11904: 0xC1FE, 39426 - 11904: 0xEF58, 39427 - 11904: 0xEF63, 39428 - 11904: 0xF1B3, 39429 - 11904: 0xF1B6, 39430 - 11904: 0xF1B8, 39431 - 11904: 0xF1B7, 39433 - 11904: 0xF1B1, 39434 - 11904: 0xF1B5, 39435 - 11904: 0xF1B0, 39436 - 11904: 0x9153, 39437 - 11904: 0xF1B2, 39438 - 11904: 0xC34D, 39439 - 11904: 0xF1AF, 39440 - 11904: 0x9155, 39441 - 11904: 0xF1B4, 39444 - 11904: 0xF3C0, 39445 - 11904: 0xF3B5, 39446 - 11904: 0xC445, 39449 - 11904: 0xC446, 39450 - 11904: 0xF3B4, 39451 - 11904: 0xF3B9, 39452 - 11904: 0xF3BF, 39453 - 11904: 0xF3B7, 39454 - 11904: 0xF3BE, 39455 - 11904: 0x955D, 39456 - 11904: 0xF3BB, 39457 - 11904: 0x9671, 39458 - 11904: 0xF3BA, 39459 - 11904: 0xF3BD, 39460 - 11904: 0xF3B8, 39461 - 11904: 0xF3B6, 39462 - 11904: 0x9C6D, 39463 - 11904: 0xF3BC, 39465 - 11904: 0xF560, 39466 - 11904: 0xF55E, 39467 - 11904: 0xC4CA, 39468 - 11904: 0xF55D, 39469 - 11904: 0xF563, 39470 - 11904: 0xF561, 39471 - 11904: 0x9673, 39472 - 11904: 0xC4CB, 39473 - 11904: 0xF55C, 39474 - 11904: 0xF55A, 39476 - 11904: 0xF55B, 39477 - 11904: 0xC4CD, 39478 - 11904: 0xF55F, 39479 - 11904: 0xC4CC, 39480 - 11904: 0xF562, 39481 - 11904: 0xF678, 39482 - 11904: 0xF67E, 39483 - 11904: 0x9154, 39484 - 11904: 0x9A71, 39485 - 11904: 0xF679, 39486 - 11904: 0xC55B, 39487 - 11904: 0xF6A1, 39488 - 11904: 0xC55A, 39489 - 11904: 0xF67D, 39490 - 11904: 0xF67C, 39491 - 11904: 0xC559, 39492 - 11904: 0xF67B, 39493 - 11904: 0xC558, 39494 - 11904: 0xF67A, 39496 - 11904: 0xF77D, 39497 - 11904: 0xF7A1, 39498 - 11904: 0xF77E, 39500 - 11904: 0xF77B, 39501 - 11904: 0xC5BB, 39502 - 11904: 0xF778, 39503 - 11904: 0xF77C, 39504 - 11904: 0xF7A3, 39506 - 11904: 0xF7A2, 39507 - 11904: 0xF779, 39508 - 11904: 0xF77A, 39509 - 11904: 0xC5BA, 39510 - 11904: 0xF852, 39511 - 11904: 0xC5E7, 39512 - 11904: 0x9156, 39513 - 11904: 0xF853, 39514 - 11904: 0xC5E5, 39515 - 11904: 0xC5E6, 39516 - 11904: 0x966D, 39518 - 11904: 0xF8D3, 39519 - 11904: 0xC64A, 39520 - 11904: 0xF976, 39522 - 11904: 0xC66A, 39523 - 11904: 0x9557, 39524 - 11904: 0xF9B3, 39525 - 11904: 0xC66B, 39526 - 11904: 0xF9B4, 39527 - 11904: 0xF9B5, 39528 - 11904: 0xF9C3, 39529 - 11904: 0xF9C2, 39530 - 11904: 0xC67A, 39531 - 11904: 0xF9CD, 39532 - 11904: 0x89C6, 39567 - 11904: 0x89C7, 39592 - 11904: 0xB0A9, 39595 - 11904: 0xE0E9, 39597 - 11904: 0xE0E8, 39599 - 11904: 0xBBEA, 39600 - 11904: 0xBBEB, 39601 - 11904: 0xE4DA, 39602 - 11904: 0x8A6A, 39603 - 11904: 0xE8D2, 39604 - 11904: 0xEC6C, 39606 - 11904: 0x8B57, 39607 - 11904: 0xBE75, 39608 - 11904: 0xC065, 39609 - 11904: 0xEC6A, 39610 - 11904: 0x9FE1, 39611 - 11904: 0xEC6D, 39612 - 11904: 0xC066, 39613 - 11904: 0x9B5F, 39614 - 11904: 0xEF64, 39615 - 11904: 0xEC6B, 39616 - 11904: 0xF1B9, 39617 - 11904: 0xC34E, 39618 - 11904: 0xF3C1, 39622 - 11904: 0xF566, 39623 - 11904: 0xF564, 39626 - 11904: 0xF565, 39629 - 11904: 0xF6A2, 39631 - 11904: 0xC55C, 39632 - 11904: 0xF7A4, 39633 - 11904: 0xC5EA, 39634 - 11904: 0xC5BC, 39635 - 11904: 0xC5E8, 39636 - 11904: 0xC5E9, 39637 - 11904: 0xF8D4, 39638 - 11904: 0xC662, 39639 - 11904: 0xA05D, 39640 - 11904: 0xB0AA, 39644 - 11904: 0xF1BA, 39647 - 11904: 0xD449, 39648 - 11904: 0x915B, 39649 - 11904: 0xB9A6, 39650 - 11904: 0x915C, 39651 - 11904: 0xE4DB, 39654 - 11904: 0xBBEC, 39655 - 11904: 0xE4DC, 39659 - 11904: 0xE8D4, 39660 - 11904: 0xE8D3, 39661 - 11904: 0xC068, 39662 - 11904: 0xBE76, 39663 - 11904: 0xBE77, 39665 - 11904: 0xE8D7, 39666 - 11904: 0xE8D6, 39667 - 11904: 0xE8D5, 39668 - 11904: 0x915E, 39670 - 11904: 0xEC6E, 39671 - 11904: 0xEC71, 39673 - 11904: 0xEC70, 39674 - 11904: 0xEC6F, 39675 - 11904: 0xC067, 39676 - 11904: 0xEF68, 39677 - 11904: 0xEF66, 39678 - 11904: 0xEF65, 39679 - 11904: 0x9F5C, 39681 - 11904: 0xEF67, 39682 - 11904: 0x9F57, 39683 - 11904: 0xC34F, 39684 - 11904: 0xF1BC, 39685 - 11904: 0xF1BD, 39686 - 11904: 0xC350, 39688 - 11904: 0xF1BB, 39689 - 11904: 0x9F65, 39690 - 11904: 0xF3C3, 39691 - 11904: 0xF3C2, 39692 - 11904: 0xF3C5, 39693 - 11904: 0xC447, 39694 - 11904: 0xF3C4, 39695 - 11904: 0x9A72, 39696 - 11904: 0xF567, 39697 - 11904: 0xF569, 39698 - 11904: 0xF568, 39700 - 11904: 0x9160, 39701 - 11904: 0xF6A3, 39702 - 11904: 0xF6A6, 39703 - 11904: 0xF6A4, 39704 - 11904: 0xF6A5, 39705 - 11904: 0xF7A5, 39706 - 11904: 0xC5BD, 39710 - 11904: 0xF854, 39711 - 11904: 0xF855, 39712 - 11904: 0xF856, 39714 - 11904: 0xC64B, 39715 - 11904: 0xC663, 39716 - 11904: 0xF9B6, 39717 - 11904: 0xB0AB, 39719 - 11904: 0xBE78, 39720 - 11904: 0xC069, 39721 - 11904: 0xF1BE, 39722 - 11904: 0x9F5E, 39723 - 11904: 0xF7A6, 39725 - 11904: 0x9161, 39726 - 11904: 0xF9C4, 39727 - 11904: 0xD44A, 39729 - 11904: 0xC67B, 39730 - 11904: 0xB0AC, 39731 - 11904: 0xEC72, 39732 - 11904: 0x9164, 39733 - 11904: 0xF1BF, 39735 - 11904: 0xF3C6, 39737 - 11904: 0x9F41, 39738 - 11904: 0xF6A7, 39739 - 11904: 0xF7A7, 39740 - 11904: 0xB0AD, 39742 - 11904: 0xE4DD, 39743 - 11904: 0xE4DE, 39744 - 11904: 0x9169, 39745 - 11904: 0xBBED, 39746 - 11904: 0xBBEE, 39747 - 11904: 0xE8D9, 39748 - 11904: 0xBE7A, 39749 - 11904: 0xBE79, 39750 - 11904: 0xE8D8, 39752 - 11904: 0xEF69, 39754 - 11904: 0xF1C0, 39755 - 11904: 0xF1C2, 39756 - 11904: 0xF1C1, 39757 - 11904: 0xC353, 39758 - 11904: 0xC352, 39759 - 11904: 0xC351, 39760 - 11904: 0x9168, 39761 - 11904: 0xC55E, 39762 - 11904: 0xF6A8, 39764 - 11904: 0xC55D, 39765 - 11904: 0xF7A9, 39766 - 11904: 0xF7A8, 39768 - 11904: 0xC64C, 39769 - 11904: 0xF8D5, 39770 - 11904: 0xB3BD, 39771 - 11904: 0xE0EA, 39775 - 11904: 0xE4E1, 39776 - 11904: 0xE4DF, 39777 - 11904: 0xE4E0, 39780 - 11904: 0xE8E2, 39782 - 11904: 0xE8DD, 39783 - 11904: 0xE8DA, 39784 - 11904: 0xE8E1, 39785 - 11904: 0x9A74, 39788 - 11904: 0xE8E3, 39791 - 11904: 0xBE7C, 39792 - 11904: 0xE8E0, 39793 - 11904: 0xE8DC, 39796 - 11904: 0xE8DB, 39797 - 11904: 0xE8DF, 39798 - 11904: 0xE8DE, 39799 - 11904: 0xBE7B, 39802 - 11904: 0xEC7D, 39803 - 11904: 0xEC78, 39804 - 11904: 0xEC76, 39805 - 11904: 0xECA1, 39806 - 11904: 0xEC77, 39807 - 11904: 0x96B2, 39808 - 11904: 0xEC73, 39809 - 11904: 0x9A75, 39810 - 11904: 0xEC79, 39811 - 11904: 0xFDA5, 39813 - 11904: 0xEC74, 39814 - 11904: 0xEF72, 39815 - 11904: 0xEC75, 39816 - 11904: 0xECA2, 39819 - 11904: 0x9EE9, 39821 - 11904: 0x8BBA, 39822 - 11904: 0x916D, 39823 - 11904: 0xA060, 39824 - 11904: 0xEC7C, 39825 - 11904: 0xC06A, 39826 - 11904: 0xEC7B, 39827 - 11904: 0xEC7A, 39829 - 11904: 0xEC7E, 39831 - 11904: 0x9FDE, 39834 - 11904: 0xEF6A, 39835 - 11904: 0xEF6D, 39837 - 11904: 0x9FC3, 39838 - 11904: 0xEF6C, 39839 - 11904: 0x96B5, 39840 - 11904: 0xEF74, 39841 - 11904: 0xEF6F, 39842 - 11904: 0xEF73, 39844 - 11904: 0xEF71, 39845 - 11904: 0xEF70, 39846 - 11904: 0xEF6E, 39848 - 11904: 0xEF6B, 39850 - 11904: 0xC243, 39851 - 11904: 0xC242, 39853 - 11904: 0xC244, 39854 - 11904: 0xC241, 39855 - 11904: 0xEF75, 39856 - 11904: 0xA067, 39861 - 11904: 0xF1C8, 39862 - 11904: 0xF1CB, 39864 - 11904: 0xF1C9, 39865 - 11904: 0xF1CD, 39869 - 11904: 0xF1CE, 39871 - 11904: 0xF1C6, 39872 - 11904: 0xC358, 39873 - 11904: 0xF1C7, 39875 - 11904: 0xF1C5, 39876 - 11904: 0xF1CC, 39878 - 11904: 0xF1C4, 39879 - 11904: 0xF1C3, 39880 - 11904: 0xC357, 39881 - 11904: 0xC355, 39882 - 11904: 0xC354, 39887 - 11904: 0x96B3, 39891 - 11904: 0xF1CA, 39892 - 11904: 0xF3CF, 39893 - 11904: 0xF3D5, 39894 - 11904: 0xC44A, 39895 - 11904: 0xF3D0, 39897 - 11904: 0xF3D3, 39898 - 11904: 0xF3D7, 39899 - 11904: 0xC44B, 39900 - 11904: 0xF3D2, 39901 - 11904: 0x9A76, 39902 - 11904: 0xF3CA, 39904 - 11904: 0xF3C9, 39905 - 11904: 0xF3D6, 39906 - 11904: 0xF3CD, 39908 - 11904: 0xF3CB, 39909 - 11904: 0xF3D4, 39910 - 11904: 0xF3CC, 39911 - 11904: 0xC449, 39912 - 11904: 0xC448, 39913 - 11904: 0x95D5, 39914 - 11904: 0xF3C7, 39915 - 11904: 0xF3C8, 39916 - 11904: 0xF3D1, 39917 - 11904: 0x9ECA, 39920 - 11904: 0xF3CE, 39921 - 11904: 0x9A77, 39924 - 11904: 0x9A78, 39927 - 11904: 0xF56C, 39928 - 11904: 0xF56F, 39933 - 11904: 0xC356, 39935 - 11904: 0x9170, 39938 - 11904: 0x916F, 39941 - 11904: 0xF56D, 39942 - 11904: 0xF573, 39943 - 11904: 0xF571, 39944 - 11904: 0xF56B, 39945 - 11904: 0xF576, 39946 - 11904: 0x9FA3, 39947 - 11904: 0xF56A, 39948 - 11904: 0x9171, 39949 - 11904: 0xC4CF, 39950 - 11904: 0xF572, 39952 - 11904: 0x96B1, 39954 - 11904: 0xF56E, 39955 - 11904: 0xC4CE, 39956 - 11904: 0xF575, 39957 - 11904: 0x9F63, 39959 - 11904: 0xF574, 39963 - 11904: 0x9F67, 39964 - 11904: 0xF6AB, 39965 - 11904: 0xF6AA, 39967 - 11904: 0x8BB9, 39968 - 11904: 0x9A7A, 39969 - 11904: 0xF6B1, 39971 - 11904: 0xF6AD, 39972 - 11904: 0xF6B0, 39973 - 11904: 0xC560, 39974 - 11904: 0x8B56, 39976 - 11904: 0xF6AE, 39977 - 11904: 0xF6AF, 39979 - 11904: 0xF6A9, 39980 - 11904: 0xF6AC, 39981 - 11904: 0xC55F, 39983 - 11904: 0x9ADA, 39985 - 11904: 0xC5BF, 39986 - 11904: 0xF7B4, 39987 - 11904: 0xF7AF, 39988 - 11904: 0xF7B3, 39989 - 11904: 0x96B0, 39990 - 11904: 0xF7B6, 39991 - 11904: 0xF7B2, 39993 - 11904: 0xF7AE, 39994 - 11904: 0x9A7E, 39995 - 11904: 0xC5C1, 39996 - 11904: 0xF7B1, 39997 - 11904: 0xF7B5, 39998 - 11904: 0xC5C0, 39999 - 11904: 0xF7AC, 40000 - 11904: 0xF570, 40001 - 11904: 0xF7B0, 40004 - 11904: 0xF7AD, 40005 - 11904: 0x9DDE, 40006 - 11904: 0xF7AA, 40008 - 11904: 0xF7AB, 40009 - 11904: 0xC5BE, 40010 - 11904: 0xF85A, 40011 - 11904: 0xF85C, 40012 - 11904: 0xF85F, 40013 - 11904: 0xF85B, 40014 - 11904: 0xF860, 40015 - 11904: 0x96AD, 40016 - 11904: 0xF859, 40018 - 11904: 0xF857, 40019 - 11904: 0x96AE, 40020 - 11904: 0xC5EB, 40021 - 11904: 0xF85D, 40022 - 11904: 0xC5ED, 40023 - 11904: 0xC5EC, 40024 - 11904: 0xF858, 40025 - 11904: 0xF85E, 40029 - 11904: 0x9EA1, 40030 - 11904: 0xF8DA, 40031 - 11904: 0xC64D, 40032 - 11904: 0xF8DB, 40034 - 11904: 0xF8D9, 40035 - 11904: 0xF8D6, 40038 - 11904: 0xF8D8, 40039 - 11904: 0xF8D7, 40040 - 11904: 0xF95A, 40045 - 11904: 0xF95C, 40046 - 11904: 0xF95B, 40049 - 11904: 0xF979, 40050 - 11904: 0x9E50, 40051 - 11904: 0xF978, 40052 - 11904: 0xF977, 40053 - 11904: 0xF97A, 40055 - 11904: 0xC673, 40056 - 11904: 0xC674, 40057 - 11904: 0xF9CA, 40058 - 11904: 0xF9CE, 40059 - 11904: 0x96AF, 40060 - 11904: 0x8BF4, 40165 - 11904: 0xB3BE, 40166 - 11904: 0xDCAF, 40167 - 11904: 0xE0ED, 40169 - 11904: 0xB9A7, 40170 - 11904: 0xE0EB, 40173 - 11904: 0xE0EC, 40177 - 11904: 0xE4E2, 40178 - 11904: 0xE4E3, 40179 - 11904: 0xBBF1, 40180 - 11904: 0xBBEF, 40181 - 11904: 0xE4E4, 40182 - 11904: 0xBBF0, 40183 - 11904: 0xE8E8, 40185 - 11904: 0xE8EB, 40186 - 11904: 0xE8E5, 40187 - 11904: 0xE8EC, 40188 - 11904: 0xE8E4, 40189 - 11904: 0xE8E6, 40191 - 11904: 0xE8E7, 40192 - 11904: 0xE8EA, 40194 - 11904: 0x9FA4, 40195 - 11904: 0xBEA1, 40196 - 11904: 0xE8EF, 40197 - 11904: 0xE8EE, 40198 - 11904: 0xBE7D, 40199 - 11904: 0xE8E9, 40200 - 11904: 0xE8ED, 40201 - 11904: 0xBE7E, 40204 - 11904: 0x96BD, 40208 - 11904: 0xECAC, 40210 - 11904: 0xC06F, 40212 - 11904: 0xECA7, 40213 - 11904: 0xC06B, 40214 - 11904: 0x96F4, 40215 - 11904: 0xECA4, 40216 - 11904: 0xECAA, 40217 - 11904: 0xECAD, 40219 - 11904: 0xC070, 40221 - 11904: 0xECA9, 40222 - 11904: 0xECA6, 40223 - 11904: 0xECAE, 40224 - 11904: 0xECA5, 40225 - 11904: 0x96B8, 40226 - 11904: 0xECAB, 40227 - 11904: 0xC06C, 40229 - 11904: 0xECA3, 40230 - 11904: 0xC06D, 40232 - 11904: 0xC06E, 40233 - 11904: 0xECA8, 40237 - 11904: 0xEFA9, 40238 - 11904: 0xEF7A, 40239 - 11904: 0xEF7B, 40240 - 11904: 0xEF7E, 40241 - 11904: 0xEF7C, 40243 - 11904: 0xEF76, 40244 - 11904: 0xFAA1, 40246 - 11904: 0xEF79, 40247 - 11904: 0xEFA5, 40248 - 11904: 0xEF7D, 40249 - 11904: 0x91A7, 40251 - 11904: 0xC245, 40253 - 11904: 0xEFA7, 40254 - 11904: 0xEFA4, 40255 - 11904: 0xC246, 40256 - 11904: 0xEFA6, 40257 - 11904: 0xEF77, 40258 - 11904: 0xEFA2, 40259 - 11904: 0xEFA3, 40260 - 11904: 0xA05E, 40261 - 11904: 0xEFA1, 40265 - 11904: 0x9A7D, 40266 - 11904: 0xF1D2, 40267 - 11904: 0xF1D4, 40268 - 11904: 0xF1D7, 40270 - 11904: 0x8948, 40271 - 11904: 0xF1D1, 40272 - 11904: 0x9EB1, 40273 - 11904: 0xC359, 40274 - 11904: 0xF1D9, 40275 - 11904: 0xF1D0, 40276 - 11904: 0xF1DA, 40278 - 11904: 0xF1D6, 40279 - 11904: 0xF1D8, 40280 - 11904: 0xF1DC, 40281 - 11904: 0xF1D5, 40282 - 11904: 0xF1DD, 40283 - 11904: 0xF1D3, 40284 - 11904: 0xF1CF, 40285 - 11904: 0xC35A, 40286 - 11904: 0x9DDB, 40287 - 11904: 0xF1DB, 40288 - 11904: 0xC35B, 40289 - 11904: 0xC44D, 40295 - 11904: 0xEF78, 40296 - 11904: 0xF3F1, 40297 - 11904: 0xF3E8, 40298 - 11904: 0xC44F, 40299 - 11904: 0xF3E4, 40300 - 11904: 0xC450, 40301 - 11904: 0x95BF, 40302 - 11904: 0x8A73, 40303 - 11904: 0xF3ED, 40304 - 11904: 0xF3E7, 40305 - 11904: 0xF3DD, 40306 - 11904: 0xC44E, 40307 - 11904: 0xF3EA, 40308 - 11904: 0xF3E5, 40309 - 11904: 0xF3E6, 40311 - 11904: 0xF3D8, 40312 - 11904: 0xF3DF, 40313 - 11904: 0xF3EE, 40315 - 11904: 0xF3EB, 40316 - 11904: 0x9EFE, 40317 - 11904: 0xF3E3, 40318 - 11904: 0x917A, 40319 - 11904: 0xF3EF, 40320 - 11904: 0xF3DE, 40321 - 11904: 0xF3D9, 40322 - 11904: 0xF3EC, 40323 - 11904: 0x917B, 40324 - 11904: 0xF3DB, 40325 - 11904: 0xF3E9, 40326 - 11904: 0xF3E0, 40327 - 11904: 0xF3F0, 40328 - 11904: 0xF3DC, 40329 - 11904: 0xC44C, 40330 - 11904: 0xF3DA, 40331 - 11904: 0xF3E1, 40332 - 11904: 0xF3E2, 40336 - 11904: 0xF57D, 40338 - 11904: 0xF57B, 40339 - 11904: 0x9AA3, 40340 - 11904: 0xF5A2, 40342 - 11904: 0xF5AE, 40343 - 11904: 0xF5A5, 40344 - 11904: 0xF57C, 40345 - 11904: 0xF578, 40346 - 11904: 0xF5A7, 40347 - 11904: 0xF57E, 40348 - 11904: 0xF5A3, 40349 - 11904: 0xF57A, 40350 - 11904: 0xF5AA, 40351 - 11904: 0xF577, 40352 - 11904: 0xF5A1, 40353 - 11904: 0xF5A6, 40354 - 11904: 0xF5A8, 40355 - 11904: 0xF5AB, 40356 - 11904: 0xF579, 40357 - 11904: 0x96C2, 40358 - 11904: 0xF5AF, 40359 - 11904: 0xF5B0, 40360 - 11904: 0xF5A9, 40361 - 11904: 0xF5AD, 40362 - 11904: 0xF5A4, 40363 - 11904: 0x9F77, 40364 - 11904: 0xF6C1, 40365 - 11904: 0xF6C4, 40367 - 11904: 0xC561, 40369 - 11904: 0xF6C3, 40370 - 11904: 0xF6C8, 40371 - 11904: 0xF6C6, 40372 - 11904: 0xC562, 40373 - 11904: 0xF6BD, 40374 - 11904: 0xF6B3, 40375 - 11904: 0xF6B2, 40376 - 11904: 0xC564, 40377 - 11904: 0xF6BF, 40378 - 11904: 0xF6C0, 40379 - 11904: 0xF6BC, 40380 - 11904: 0xF6B4, 40381 - 11904: 0x9AA4, 40382 - 11904: 0xF6B9, 40383 - 11904: 0xF5AC, 40384 - 11904: 0x9AA5, 40385 - 11904: 0xF6B5, 40386 - 11904: 0xC563, 40387 - 11904: 0xF6BB, 40388 - 11904: 0x91A1, 40389 - 11904: 0xF6BA, 40391 - 11904: 0xF6B6, 40392 - 11904: 0xF6C2, 40393 - 11904: 0x89B8, 40394 - 11904: 0xF6B7, 40395 - 11904: 0xF7BB, 40396 - 11904: 0xF6C5, 40397 - 11904: 0xF6C7, 40398 - 11904: 0xF6BE, 40399 - 11904: 0xF6B8, 40400 - 11904: 0xF7BC, 40401 - 11904: 0xF7BE, 40402 - 11904: 0xF7B8, 40403 - 11904: 0xC5C2, 40404 - 11904: 0x9173, 40405 - 11904: 0xF7C5, 40406 - 11904: 0xF7C3, 40407 - 11904: 0xC5C3, 40408 - 11904: 0xF7C2, 40409 - 11904: 0xF7C1, 40410 - 11904: 0xF7BA, 40411 - 11904: 0xF7B7, 40412 - 11904: 0xF7BD, 40413 - 11904: 0xF7C6, 40414 - 11904: 0xF7B9, 40415 - 11904: 0xF7BF, 40417 - 11904: 0xF869, 40418 - 11904: 0xF86E, 40419 - 11904: 0xF864, 40420 - 11904: 0xF867, 40421 - 11904: 0xC5EE, 40422 - 11904: 0xF86B, 40424 - 11904: 0xF872, 40425 - 11904: 0xF7C0, 40427 - 11904: 0xF865, 40428 - 11904: 0xF86F, 40429 - 11904: 0xF873, 40430 - 11904: 0xF86A, 40431 - 11904: 0xF863, 40432 - 11904: 0xF86D, 40434 - 11904: 0xF86C, 40435 - 11904: 0xF871, 40436 - 11904: 0xF870, 40437 - 11904: 0xF7C4, 40438 - 11904: 0xF868, 40439 - 11904: 0xF862, 40440 - 11904: 0xF866, 40441 - 11904: 0xC64E, 40442 - 11904: 0xC64F, 40443 - 11904: 0xF861, 40444 - 11904: 0x9AA6, 40445 - 11904: 0xF8E6, 40446 - 11904: 0xF8DD, 40447 - 11904: 0xF8E5, 40448 - 11904: 0xF8E2, 40449 - 11904: 0xF8E3, 40450 - 11904: 0xF8DC, 40451 - 11904: 0xF8DF, 40452 - 11904: 0xF8E7, 40453 - 11904: 0xF8E1, 40454 - 11904: 0xF8E0, 40455 - 11904: 0xF8DE, 40457 - 11904: 0xF8E4, 40458 - 11904: 0x89BD, 40459 - 11904: 0xF95D, 40460 - 11904: 0x89B9, 40461 - 11904: 0xF95E, 40462 - 11904: 0x917D, 40463 - 11904: 0xF960, 40464 - 11904: 0xF95F, 40465 - 11904: 0xF962, 40466 - 11904: 0xF961, 40467 - 11904: 0xF97C, 40468 - 11904: 0xF97B, 40469 - 11904: 0xF9B7, 40471 - 11904: 0xF9B8, 40472 - 11904: 0x96BB, 40473 - 11904: 0xF9C5, 40474 - 11904: 0xC678, 40475 - 11904: 0xC67C, 40476 - 11904: 0x9FF2, 40477 - 11904: 0xF9CF, 40478 - 11904: 0xC67D, 40479 - 11904: 0x8BF5, 40565 - 11904: 0xB3BF, 40569 - 11904: 0xC4D0, 40570 - 11904: 0xF6C9, 40571 - 11904: 0x9AA9, 40572 - 11904: 0xC650, 40573 - 11904: 0xC651, 40575 - 11904: 0xB3C0, 40576 - 11904: 0xE0EE, 40577 - 11904: 0x9F54, 40578 - 11904: 0xB9A8, 40579 - 11904: 0xE8F0, 40580 - 11904: 0x9FE3, 40581 - 11904: 0x9EED, 40582 - 11904: 0xECB0, 40583 - 11904: 0xECB1, 40584 - 11904: 0xECAF, 40585 - 11904: 0xEFAB, 40586 - 11904: 0xEFAA, 40587 - 11904: 0xC247, 40588 - 11904: 0xF1DF, 40589 - 11904: 0xEFAC, 40590 - 11904: 0xF1DE, 40592 - 11904: 0x91AA, 40593 - 11904: 0xF3F3, 40594 - 11904: 0xC451, 40595 - 11904: 0xC453, 40596 - 11904: 0xF3F2, 40597 - 11904: 0x91AB, 40598 - 11904: 0xA070, 40599 - 11904: 0xC452, 40600 - 11904: 0x9F6D, 40601 - 11904: 0xF5B1, 40602 - 11904: 0xF5B3, 40603 - 11904: 0xF5B2, 40604 - 11904: 0xF6CA, 40605 - 11904: 0xC565, 40606 - 11904: 0x91AC, 40607 - 11904: 0xC5EF, 40608 - 11904: 0xF8E8, 40609 - 11904: 0xF963, 40610 - 11904: 0x91AD, 40612 - 11904: 0xF9D2, 40613 - 11904: 0xB3C1, 40614 - 11904: 0xA0FD, 40615 - 11904: 0xE4E5, 40616 - 11904: 0x9FE2, 40617 - 11904: 0xBEA2, 40618 - 11904: 0x91AF, 40619 - 11904: 0x9E41, 40620 - 11904: 0x9AAA, 40621 - 11904: 0xECB3, 40622 - 11904: 0xECB2, 40623 - 11904: 0x91B0, 40624 - 11904: 0xEFAD, 40625 - 11904: 0x9AAB, 40628 - 11904: 0xC454, 40629 - 11904: 0xC4D1, 40630 - 11904: 0xF7C7, 40631 - 11904: 0xF9CB, 40635 - 11904: 0xB3C2, 40636 - 11904: 0xBBF2, 40637 - 11904: 0x9AAC, 40638 - 11904: 0xBEA3, 40639 - 11904: 0x9A4A, 40640 - 11904: 0xF3F4, 40641 - 11904: 0x91B2, 40642 - 11904: 0xF874, 40643 - 11904: 0xB6C0, 40644 - 11904: 0x8BF6, 40646 - 11904: 0x9AAD, 40647 - 11904: 0x89B6, 40648 - 11904: 0xEFAE, 40652 - 11904: 0xC664, 40653 - 11904: 0xB6C1, 40654 - 11904: 0xBEA4, 40655 - 11904: 0xC248, 40656 - 11904: 0xF875, 40657 - 11904: 0xB6C2, 40659 - 11904: 0xE8F1, 40660 - 11904: 0xC072, 40661 - 11904: 0xECB4, 40662 - 11904: 0xECB5, 40664 - 11904: 0xC071, 40666 - 11904: 0xEFAF, 40667 - 11904: 0xC24C, 40668 - 11904: 0xC24A, 40669 - 11904: 0xC24B, 40670 - 11904: 0xC249, 40671 - 11904: 0xF1E0, 40672 - 11904: 0xC35C, 40674 - 11904: 0x9AAF, 40676 - 11904: 0xF5B5, 40677 - 11904: 0xF5B4, 40678 - 11904: 0xF5B7, 40679 - 11904: 0xF5B6, 40680 - 11904: 0xC4D2, 40683 - 11904: 0xF6CB, 40685 - 11904: 0xF6CD, 40686 - 11904: 0xF6CC, 40687 - 11904: 0xC566, 40688 - 11904: 0xF7C8, 40689 - 11904: 0x9AB0, 40690 - 11904: 0xF876, 40691 - 11904: 0xF877, 40692 - 11904: 0xC5F0, 40693 - 11904: 0xF964, 40694 - 11904: 0xF97D, 40695 - 11904: 0xC675, 40696 - 11904: 0x9AB1, 40697 - 11904: 0xDCB0, 40698 - 11904: 0xECB6, 40699 - 11904: 0xEFB0, 40700 - 11904: 0xF3F5, 40701 - 11904: 0xE0EF, 40702 - 11904: 0x9AA1, 40703 - 11904: 0xEFB1, 40704 - 11904: 0xF1E2, 40705 - 11904: 0xF1E1, 40706 - 11904: 0x91B9, 40710 - 11904: 0xF878, 40711 - 11904: 0xC652, 40712 - 11904: 0x91BA, 40713 - 11904: 0xF965, 40714 - 11904: 0xF97E, 40718 - 11904: 0xB9A9, 40719 - 11904: 0xE8F2, 40720 - 11904: 0xE8F3, 40722 - 11904: 0xECB7, 40723 - 11904: 0xB9AA, 40725 - 11904: 0xC35D, 40726 - 11904: 0xF1E3, 40727 - 11904: 0x9F66, 40728 - 11904: 0xF6CF, 40729 - 11904: 0xC567, 40730 - 11904: 0xF6D0, 40731 - 11904: 0xF6CE, 40732 - 11904: 0xF879, 40734 - 11904: 0xF8E9, 40736 - 11904: 0xB9AB, 40738 - 11904: 0xEFB4, 40739 - 11904: 0xEFB3, 40740 - 11904: 0xEFB2, 40741 - 11904: 0xF1E4, 40742 - 11904: 0xA041, 40743 - 11904: 0x8BB7, 40744 - 11904: 0xF1E8, 40745 - 11904: 0xF1E7, 40746 - 11904: 0xF1E6, 40747 - 11904: 0xF1E5, 40748 - 11904: 0xC35E, 40749 - 11904: 0xF3F6, 40750 - 11904: 0xF5B9, 40751 - 11904: 0xC4D3, 40752 - 11904: 0xF5B8, 40753 - 11904: 0xF6D1, 40754 - 11904: 0xF7CB, 40755 - 11904: 0xF7CA, 40756 - 11904: 0xC5C4, 40757 - 11904: 0xF7C9, 40758 - 11904: 0xF87C, 40759 - 11904: 0xF87B, 40760 - 11904: 0xF87A, 40761 - 11904: 0x91C0, 40763 - 11904: 0xBBF3, 40765 - 11904: 0xECB8, 40766 - 11904: 0xC24D, 40768 - 11904: 0xF3F7, 40769 - 11904: 0xF3F8, 40770 - 11904: 0xF7CC, 40771 - 11904: 0xF87D, 40772 - 11904: 0x9AB3, 40773 - 11904: 0x91C3, 40774 - 11904: 0xF8EA, 40775 - 11904: 0xF966, 40776 - 11904: 0xF9B9, 40777 - 11904: 0xF9D4, 40778 - 11904: 0xBBF4, 40779 - 11904: 0xC24E, 40780 - 11904: 0xF1E9, 40781 - 11904: 0xF3F9, 40782 - 11904: 0xF6D2, 40783 - 11904: 0xF87E, 40784 - 11904: 0xA0FC, 40786 - 11904: 0xBEA6, 40787 - 11904: 0x9FEE, 40788 - 11904: 0xEFB5, 40789 - 11904: 0xF1EA, 40790 - 11904: 0xF3FA, 40791 - 11904: 0xF3FB, 40792 - 11904: 0xF3FC, 40793 - 11904: 0xF5BE, 40794 - 11904: 0x9F69, 40795 - 11904: 0xF5BA, 40796 - 11904: 0xC568, 40797 - 11904: 0xF5BD, 40798 - 11904: 0xF5BC, 40799 - 11904: 0xC4D4, 40800 - 11904: 0xF5BB, 40801 - 11904: 0xC4D6, 40802 - 11904: 0x91C8, 40803 - 11904: 0xC4D5, 40804 - 11904: 0xF6D4, 40805 - 11904: 0xF6D3, 40806 - 11904: 0xC569, 40807 - 11904: 0xC56A, 40809 - 11904: 0x91C9, 40810 - 11904: 0xC5C6, 40811 - 11904: 0xF7CD, 40812 - 11904: 0xC5C5, 40814 - 11904: 0xF8A3, 40815 - 11904: 0xF8A4, 40816 - 11904: 0xF8A2, 40817 - 11904: 0xF8A1, 40818 - 11904: 0xC654, 40820 - 11904: 0xF8EB, 40821 - 11904: 0xF8EC, 40822 - 11904: 0xF8ED, 40823 - 11904: 0xC653, 40824 - 11904: 0xF967, 40825 - 11904: 0xF96A, 40826 - 11904: 0xF969, 40827 - 11904: 0xF968, 40830 - 11904: 0xF9D3, 40831 - 11904: 0x8DE6, 40845 - 11904: 0xC073, 40846 - 11904: 0x91CB, 40848 - 11904: 0xC365, 40849 - 11904: 0xF5BF, 40850 - 11904: 0xF6D5, 40852 - 11904: 0xC5C7, 40853 - 11904: 0xF7CE, 40854 - 11904: 0x87AC, 40855 - 11904: 0x87A4, 40856 - 11904: 0xF9D5, 40857 - 11904: 0x89C8, 40860 - 11904: 0xC074, 40863 - 11904: 0x8DAA, 40864 - 11904: 0xEFB6, 40866 - 11904: 0xF7CF, 40868 - 11904: 0xF9A1, 40869 - 11904: 0x9FDD, 40870 - 11904: 0x8C43, 40871 - 11904: 0x8C6D, 40872 - 11904: 0x8C74, 40873 - 11904: 0x8CB7, 40874 - 11904: 0x8CB9, 40875 - 11904: 0x8CBB, 40876 - 11904: 0x8CC0, 40877 - 11904: 0x8CD7, 40878 - 11904: 0x8CD8, 40879 - 11904: 0x8CDA, 40880 - 11904: 0xC8A1, 40881 - 11904: 0xC8A3, 40882 - 11904: 0x8CED, 40883 - 11904: 0x8D48, 40903 - 11904: 0x87C2, 40904 - 11904: 0x87D2, 40905 - 11904: 0x87D6, 40906 - 11904: 0x87DA, 40907 - 11904: 0x87DF, } const encode2Low, encode2High = 7870, 10046 var encode2 = [...]uint16{ 7870 - 7870: 0x8863, 7871 - 7870: 0x88A4, 7872 - 7870: 0x8865, 7873 - 7870: 0x88A6, 8211 - 7870: 0xA156, 8212 - 7870: 0xA158, 8216 - 7870: 0xA1A5, 8217 - 7870: 0xA1A6, 8220 - 7870: 0xA1A7, 8221 - 7870: 0xA1A8, 8229 - 7870: 0xA14C, 8230 - 7870: 0xA14B, 8231 - 7870: 0xA145, 8242 - 7870: 0xA1AC, 8245 - 7870: 0xA1AB, 8251 - 7870: 0xA1B0, 8364 - 7870: 0xA3E1, 8451 - 7870: 0xA24A, 8453 - 7870: 0xA1C1, 8457 - 7870: 0xA24B, 8470 - 7870: 0xC8D2, 8481 - 7870: 0xC8D3, 8544 - 7870: 0xA2B9, 8545 - 7870: 0xA2BA, 8546 - 7870: 0xA2BB, 8547 - 7870: 0xA2BC, 8548 - 7870: 0xA2BD, 8549 - 7870: 0xA2BE, 8550 - 7870: 0xA2BF, 8551 - 7870: 0xA2C0, 8552 - 7870: 0xA2C1, 8553 - 7870: 0xA2C2, 8560 - 7870: 0xC6B5, 8561 - 7870: 0xC6B6, 8562 - 7870: 0xC6B7, 8563 - 7870: 0xC6B8, 8564 - 7870: 0xC6B9, 8565 - 7870: 0xC6BA, 8566 - 7870: 0xC6BB, 8567 - 7870: 0xC6BC, 8568 - 7870: 0xC6BD, 8569 - 7870: 0xC6BE, 8592 - 7870: 0xA1F6, 8593 - 7870: 0xA1F4, 8594 - 7870: 0xA1F7, 8595 - 7870: 0xA1F5, 8598 - 7870: 0xA1F8, 8599 - 7870: 0xA1F9, 8600 - 7870: 0xA1FB, 8601 - 7870: 0xA1FA, 8632 - 7870: 0xC877, 8633 - 7870: 0xC878, 8679 - 7870: 0xC876, 8725 - 7870: 0xA241, 8730 - 7870: 0xA1D4, 8734 - 7870: 0xA1DB, 8735 - 7870: 0xA1E8, 8736 - 7870: 0xA1E7, 8739 - 7870: 0xA1FD, 8741 - 7870: 0xA1FC, 8745 - 7870: 0xA1E4, 8746 - 7870: 0xA1E5, 8747 - 7870: 0xA1EC, 8750 - 7870: 0xA1ED, 8756 - 7870: 0xA1EF, 8757 - 7870: 0xA1EE, 8786 - 7870: 0xA1DC, 8800 - 7870: 0xA1DA, 8801 - 7870: 0xA1DD, 8806 - 7870: 0xA1D8, 8807 - 7870: 0xA1D9, 8853 - 7870: 0xA1F2, 8857 - 7870: 0xA1F3, 8869 - 7870: 0xA1E6, 8895 - 7870: 0xA1E9, 9178 - 7870: 0x88A9, 9179 - 7870: 0x88AA, 9216 - 7870: 0xA3C0, 9217 - 7870: 0xA3C1, 9218 - 7870: 0xA3C2, 9219 - 7870: 0xA3C3, 9220 - 7870: 0xA3C4, 9221 - 7870: 0xA3C5, 9222 - 7870: 0xA3C6, 9223 - 7870: 0xA3C7, 9224 - 7870: 0xA3C8, 9225 - 7870: 0xA3C9, 9226 - 7870: 0xA3CA, 9227 - 7870: 0xA3CB, 9228 - 7870: 0xA3CC, 9229 - 7870: 0xA3CD, 9230 - 7870: 0xA3CE, 9231 - 7870: 0xA3CF, 9232 - 7870: 0xA3D0, 9233 - 7870: 0xA3D1, 9234 - 7870: 0xA3D2, 9235 - 7870: 0xA3D3, 9236 - 7870: 0xA3D4, 9237 - 7870: 0xA3D5, 9238 - 7870: 0xA3D6, 9239 - 7870: 0xA3D7, 9240 - 7870: 0xA3D8, 9241 - 7870: 0xA3D9, 9242 - 7870: 0xA3DA, 9243 - 7870: 0xA3DB, 9244 - 7870: 0xA3DC, 9245 - 7870: 0xA3DD, 9246 - 7870: 0xA3DE, 9247 - 7870: 0xA3DF, 9249 - 7870: 0xA3E0, 9312 - 7870: 0xC6A1, 9313 - 7870: 0xC6A2, 9314 - 7870: 0xC6A3, 9315 - 7870: 0xC6A4, 9316 - 7870: 0xC6A5, 9317 - 7870: 0xC6A6, 9318 - 7870: 0xC6A7, 9319 - 7870: 0xC6A8, 9320 - 7870: 0xC6A9, 9321 - 7870: 0xC6AA, 9332 - 7870: 0xC6AB, 9333 - 7870: 0xC6AC, 9334 - 7870: 0xC6AD, 9335 - 7870: 0xC6AE, 9336 - 7870: 0xC6AF, 9337 - 7870: 0xC6B0, 9338 - 7870: 0xC6B1, 9339 - 7870: 0xC6B2, 9340 - 7870: 0xC6B3, 9341 - 7870: 0xC6B4, 9472 - 7870: 0xA277, 9474 - 7870: 0xA278, 9484 - 7870: 0xA27A, 9488 - 7870: 0xA27B, 9492 - 7870: 0xA27C, 9496 - 7870: 0xA27D, 9500 - 7870: 0xA275, 9508 - 7870: 0xA274, 9516 - 7870: 0xA273, 9524 - 7870: 0xA272, 9532 - 7870: 0xA271, 9552 - 7870: 0xF9F9, 9553 - 7870: 0xF9F8, 9554 - 7870: 0xF9E6, 9555 - 7870: 0xF9EF, 9556 - 7870: 0xF9DD, 9557 - 7870: 0xF9E8, 9558 - 7870: 0xF9F1, 9559 - 7870: 0xF9DF, 9560 - 7870: 0xF9EC, 9561 - 7870: 0xF9F5, 9562 - 7870: 0xF9E3, 9563 - 7870: 0xF9EE, 9564 - 7870: 0xF9F7, 9565 - 7870: 0xF9E5, 9566 - 7870: 0xF9E9, 9567 - 7870: 0xF9F2, 9568 - 7870: 0xF9E0, 9569 - 7870: 0xF9EB, 9570 - 7870: 0xF9F4, 9571 - 7870: 0xF9E2, 9572 - 7870: 0xF9E7, 9573 - 7870: 0xF9F0, 9574 - 7870: 0xF9DE, 9575 - 7870: 0xF9ED, 9576 - 7870: 0xF9F6, 9577 - 7870: 0xF9E4, 9578 - 7870: 0xF9EA, 9579 - 7870: 0xF9F3, 9580 - 7870: 0xF9E1, 9581 - 7870: 0xF9FA, 9582 - 7870: 0xF9FB, 9583 - 7870: 0xF9FD, 9584 - 7870: 0xF9FC, 9585 - 7870: 0xA2AC, 9586 - 7870: 0xA2AD, 9587 - 7870: 0xA2AE, 9588 - 7870: 0xA15A, 9601 - 7870: 0xA262, 9602 - 7870: 0xA263, 9603 - 7870: 0xA264, 9604 - 7870: 0xA265, 9605 - 7870: 0xA266, 9606 - 7870: 0xA267, 9607 - 7870: 0xA268, 9608 - 7870: 0xA269, 9609 - 7870: 0xA270, 9610 - 7870: 0xA26F, 9611 - 7870: 0xA26E, 9612 - 7870: 0xA26D, 9613 - 7870: 0xA26C, 9614 - 7870: 0xA26B, 9615 - 7870: 0xA26A, 9620 - 7870: 0xA276, 9621 - 7870: 0xA279, 9632 - 7870: 0xA1BD, 9633 - 7870: 0xA1BC, 9650 - 7870: 0xA1B6, 9651 - 7870: 0xA1B5, 9660 - 7870: 0xA1BF, 9661 - 7870: 0xA1BE, 9670 - 7870: 0xA1BB, 9671 - 7870: 0xA1BA, 9675 - 7870: 0xA1B3, 9678 - 7870: 0xA1B7, 9679 - 7870: 0xA1B4, 9698 - 7870: 0xA2A8, 9699 - 7870: 0xA2A9, 9700 - 7870: 0xA2AB, 9701 - 7870: 0xA2AA, 9733 - 7870: 0xA1B9, 9734 - 7870: 0xA1B8, 9792 - 7870: 0xA1F0, 9794 - 7870: 0xA1F1, 10045 - 7870: 0xC6E6, } const encode3Low, encode3High = 167, 1106 var encode3 = [...]uint16{ 167 - 167: 0xA1B1, 168 - 167: 0xC6D8, 175 - 167: 0xA1C2, 176 - 167: 0xA258, 177 - 167: 0xA1D3, 183 - 167: 0xA150, 192 - 167: 0x8859, 193 - 167: 0x8857, 200 - 167: 0x885D, 201 - 167: 0x885B, 202 - 167: 0x8866, 210 - 167: 0x8861, 211 - 167: 0x885F, 215 - 167: 0xA1D1, 224 - 167: 0x886A, 225 - 167: 0x8868, 232 - 167: 0x886F, 233 - 167: 0x886D, 234 - 167: 0x88A7, 236 - 167: 0x8873, 237 - 167: 0x8871, 242 - 167: 0x8877, 243 - 167: 0x8875, 247 - 167: 0xA1D2, 248 - 167: 0xC8FB, 249 - 167: 0x887B, 250 - 167: 0x8879, 252 - 167: 0x88A2, 256 - 167: 0x8856, 257 - 167: 0x8867, 274 - 167: 0x885A, 275 - 167: 0x886C, 282 - 167: 0x885C, 283 - 167: 0x886E, 299 - 167: 0x8870, 331 - 167: 0xC8FC, 332 - 167: 0x885E, 333 - 167: 0x8874, 339 - 167: 0xC8FA, 363 - 167: 0x8878, 461 - 167: 0x8858, 462 - 167: 0x8869, 464 - 167: 0x8872, 465 - 167: 0x8860, 466 - 167: 0x8876, 468 - 167: 0x887A, 470 - 167: 0x887C, 472 - 167: 0x887D, 474 - 167: 0x887E, 476 - 167: 0x88A1, 592 - 167: 0xC8F6, 593 - 167: 0x886B, 596 - 167: 0xC8F8, 603 - 167: 0xC8F7, 609 - 167: 0x88A8, 618 - 167: 0xC8FE, 629 - 167: 0xC8F9, 643 - 167: 0xC8F5, 650 - 167: 0xC8FD, 710 - 167: 0xC6D9, 711 - 167: 0xA3BE, 713 - 167: 0xA3BC, 714 - 167: 0xA3BD, 715 - 167: 0xA3BF, 717 - 167: 0xA1C5, 729 - 167: 0xA3BB, 913 - 167: 0xA344, 914 - 167: 0xA345, 915 - 167: 0xA346, 916 - 167: 0xA347, 917 - 167: 0xA348, 918 - 167: 0xA349, 919 - 167: 0xA34A, 920 - 167: 0xA34B, 921 - 167: 0xA34C, 922 - 167: 0xA34D, 923 - 167: 0xA34E, 924 - 167: 0xA34F, 925 - 167: 0xA350, 926 - 167: 0xA351, 927 - 167: 0xA352, 928 - 167: 0xA353, 929 - 167: 0xA354, 931 - 167: 0xA355, 932 - 167: 0xA356, 933 - 167: 0xA357, 934 - 167: 0xA358, 935 - 167: 0xA359, 936 - 167: 0xA35A, 937 - 167: 0xA35B, 945 - 167: 0xA35C, 946 - 167: 0xA35D, 947 - 167: 0xA35E, 948 - 167: 0xA35F, 949 - 167: 0xA360, 950 - 167: 0xA361, 951 - 167: 0xA362, 952 - 167: 0xA363, 953 - 167: 0xA364, 954 - 167: 0xA365, 955 - 167: 0xA366, 956 - 167: 0xA367, 957 - 167: 0xA368, 958 - 167: 0xA369, 959 - 167: 0xA36A, 960 - 167: 0xA36B, 961 - 167: 0xA36C, 963 - 167: 0xA36D, 964 - 167: 0xA36E, 965 - 167: 0xA36F, 966 - 167: 0xA370, 967 - 167: 0xA371, 968 - 167: 0xA372, 969 - 167: 0xA373, 1025 - 167: 0xC7F9, 1040 - 167: 0xC7F3, 1041 - 167: 0xC7F4, 1042 - 167: 0xC7F5, 1043 - 167: 0xC7F6, 1044 - 167: 0xC7F7, 1045 - 167: 0xC7F8, 1046 - 167: 0xC7FA, 1047 - 167: 0xC7FB, 1048 - 167: 0xC7FC, 1049 - 167: 0xC7FD, 1050 - 167: 0xC7FE, 1051 - 167: 0xC840, 1052 - 167: 0xC841, 1053 - 167: 0xC842, 1054 - 167: 0xC843, 1055 - 167: 0xC844, 1056 - 167: 0xC845, 1057 - 167: 0xC846, 1058 - 167: 0xC847, 1059 - 167: 0xC848, 1060 - 167: 0xC849, 1061 - 167: 0xC84A, 1062 - 167: 0xC84B, 1063 - 167: 0xC84C, 1064 - 167: 0xC84D, 1065 - 167: 0xC84E, 1066 - 167: 0xC84F, 1067 - 167: 0xC850, 1068 - 167: 0xC851, 1069 - 167: 0xC852, 1070 - 167: 0xC853, 1071 - 167: 0xC854, 1072 - 167: 0xC855, 1073 - 167: 0xC856, 1074 - 167: 0xC857, 1075 - 167: 0xC858, 1076 - 167: 0xC859, 1077 - 167: 0xC85A, 1078 - 167: 0xC85C, 1079 - 167: 0xC85D, 1080 - 167: 0xC85E, 1081 - 167: 0xC85F, 1082 - 167: 0xC860, 1083 - 167: 0xC861, 1084 - 167: 0xC862, 1085 - 167: 0xC863, 1086 - 167: 0xC864, 1087 - 167: 0xC865, 1088 - 167: 0xC866, 1089 - 167: 0xC867, 1090 - 167: 0xC868, 1091 - 167: 0xC869, 1092 - 167: 0xC86A, 1093 - 167: 0xC86B, 1094 - 167: 0xC86C, 1095 - 167: 0xC86D, 1096 - 167: 0xC86E, 1097 - 167: 0xC86F, 1098 - 167: 0xC870, 1099 - 167: 0xC871, 1100 - 167: 0xC872, 1101 - 167: 0xC873, 1102 - 167: 0xC874, 1103 - 167: 0xC875, 1105 - 167: 0xC85B, } const encode4Low, encode4High = 65072, 65518 var encode4 = [...]uint16{ 65072 - 65072: 0xA14A, 65073 - 65072: 0xA157, 65075 - 65072: 0xA159, 65076 - 65072: 0xA15B, 65077 - 65072: 0xA15F, 65078 - 65072: 0xA160, 65079 - 65072: 0xA163, 65080 - 65072: 0xA164, 65081 - 65072: 0xA167, 65082 - 65072: 0xA168, 65083 - 65072: 0xA16B, 65084 - 65072: 0xA16C, 65085 - 65072: 0xA16F, 65086 - 65072: 0xA170, 65087 - 65072: 0xA173, 65088 - 65072: 0xA174, 65089 - 65072: 0xA177, 65090 - 65072: 0xA178, 65091 - 65072: 0xA17B, 65092 - 65072: 0xA17C, 65097 - 65072: 0xA1C6, 65098 - 65072: 0xA1C7, 65099 - 65072: 0xA1CA, 65100 - 65072: 0xA1CB, 65101 - 65072: 0xA1C8, 65102 - 65072: 0xA1C9, 65103 - 65072: 0xA15C, 65104 - 65072: 0xA14D, 65105 - 65072: 0xA14E, 65106 - 65072: 0xA14F, 65108 - 65072: 0xA151, 65109 - 65072: 0xA152, 65110 - 65072: 0xA153, 65111 - 65072: 0xA154, 65113 - 65072: 0xA17D, 65114 - 65072: 0xA17E, 65115 - 65072: 0xA1A1, 65116 - 65072: 0xA1A2, 65117 - 65072: 0xA1A3, 65118 - 65072: 0xA1A4, 65119 - 65072: 0xA1CC, 65120 - 65072: 0xA1CD, 65121 - 65072: 0xA1CE, 65122 - 65072: 0xA1DE, 65123 - 65072: 0xA1DF, 65124 - 65072: 0xA1E0, 65125 - 65072: 0xA1E1, 65126 - 65072: 0xA1E2, 65128 - 65072: 0xA242, 65129 - 65072: 0xA24C, 65130 - 65072: 0xA24D, 65131 - 65072: 0xA24E, 65281 - 65072: 0xA149, 65282 - 65072: 0xC8D0, 65283 - 65072: 0xA1AD, 65284 - 65072: 0xA243, 65285 - 65072: 0xA248, 65286 - 65072: 0xA1AE, 65287 - 65072: 0xC8CF, 65288 - 65072: 0xA15D, 65289 - 65072: 0xA15E, 65290 - 65072: 0xA1AF, 65291 - 65072: 0xA1CF, 65292 - 65072: 0xA141, 65293 - 65072: 0xA1D0, 65294 - 65072: 0xA144, 65295 - 65072: 0xA1FE, 65296 - 65072: 0xA2AF, 65297 - 65072: 0xA2B0, 65298 - 65072: 0xA2B1, 65299 - 65072: 0xA2B2, 65300 - 65072: 0xA2B3, 65301 - 65072: 0xA2B4, 65302 - 65072: 0xA2B5, 65303 - 65072: 0xA2B6, 65304 - 65072: 0xA2B7, 65305 - 65072: 0xA2B8, 65306 - 65072: 0xA147, 65307 - 65072: 0xA146, 65308 - 65072: 0xA1D5, 65309 - 65072: 0xA1D7, 65310 - 65072: 0xA1D6, 65311 - 65072: 0xA148, 65312 - 65072: 0xA249, 65313 - 65072: 0xA2CF, 65314 - 65072: 0xA2D0, 65315 - 65072: 0xA2D1, 65316 - 65072: 0xA2D2, 65317 - 65072: 0xA2D3, 65318 - 65072: 0xA2D4, 65319 - 65072: 0xA2D5, 65320 - 65072: 0xA2D6, 65321 - 65072: 0xA2D7, 65322 - 65072: 0xA2D8, 65323 - 65072: 0xA2D9, 65324 - 65072: 0xA2DA, 65325 - 65072: 0xA2DB, 65326 - 65072: 0xA2DC, 65327 - 65072: 0xA2DD, 65328 - 65072: 0xA2DE, 65329 - 65072: 0xA2DF, 65330 - 65072: 0xA2E0, 65331 - 65072: 0xA2E1, 65332 - 65072: 0xA2E2, 65333 - 65072: 0xA2E3, 65334 - 65072: 0xA2E4, 65335 - 65072: 0xA2E5, 65336 - 65072: 0xA2E6, 65337 - 65072: 0xA2E7, 65338 - 65072: 0xA2E8, 65339 - 65072: 0xC6E4, 65340 - 65072: 0xA240, 65341 - 65072: 0xC6E5, 65343 - 65072: 0xA1C4, 65345 - 65072: 0xA2E9, 65346 - 65072: 0xA2EA, 65347 - 65072: 0xA2EB, 65348 - 65072: 0xA2EC, 65349 - 65072: 0xA2ED, 65350 - 65072: 0xA2EE, 65351 - 65072: 0xA2EF, 65352 - 65072: 0xA2F0, 65353 - 65072: 0xA2F1, 65354 - 65072: 0xA2F2, 65355 - 65072: 0xA2F3, 65356 - 65072: 0xA2F4, 65357 - 65072: 0xA2F5, 65358 - 65072: 0xA2F6, 65359 - 65072: 0xA2F7, 65360 - 65072: 0xA2F8, 65361 - 65072: 0xA2F9, 65362 - 65072: 0xA2FA, 65363 - 65072: 0xA2FB, 65364 - 65072: 0xA2FC, 65365 - 65072: 0xA2FD, 65366 - 65072: 0xA2FE, 65367 - 65072: 0xA340, 65368 - 65072: 0xA341, 65369 - 65072: 0xA342, 65370 - 65072: 0xA343, 65371 - 65072: 0xA161, 65372 - 65072: 0xA155, 65373 - 65072: 0xA162, 65374 - 65072: 0xA1E3, 65504 - 65072: 0xA246, 65505 - 65072: 0xA247, 65506 - 65072: 0xC8CD, 65507 - 65072: 0xA1C3, 65508 - 65072: 0xC8CE, 65509 - 65072: 0xA244, 65517 - 65072: 0xF9FE, } const encode5Low, encode5High = 194597, 195029 var encode5 = [...]uint16{ 194597 - 194597: 0x9874, 194619 - 194597: 0x9AC8, 194624 - 194597: 0xA047, 194680 - 194597: 0x8BC3, 194708 - 194597: 0xFC48, 194726 - 194597: 0xFC77, 194765 - 194597: 0x9C52, 194964 - 194597: 0x8EFD, 194994 - 194597: 0x8FA8, 195004 - 194597: 0x957A, 195028 - 194597: 0x8FF0, } const encode6Low, encode6High = 63751, 64014 var encode6 = [...]uint16{ 63751 - 63751: 0x8BF8, 64012 - 63751: 0xC94A, 64013 - 63751: 0xDDFC, } const encode7Low, encode7High = 175615, 175616 var encode7 = [...]uint16{ 175615 - 175615: 0x87DC, } ================================================ FILE: vendor/golang.org/x/text/encoding/unicode/override.go ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package unicode import ( "golang.org/x/text/transform" ) // BOMOverride returns a new decoder transformer that is identical to fallback, // except that the presence of a Byte Order Mark at the start of the input // causes it to switch to the corresponding Unicode decoding. It will only // consider BOMs for UTF-8, UTF-16BE, and UTF-16LE. // // This differs from using ExpectBOM by allowing a BOM to switch to UTF-8, not // just UTF-16 variants, and allowing falling back to any encoding scheme. // // This technique is recommended by the W3C for use in HTML 5: "For // compatibility with deployed content, the byte order mark (also known as BOM) // is considered more authoritative than anything else." // http://www.w3.org/TR/encoding/#specification-hooks // // Using BOMOverride is mostly intended for use cases where the first characters // of a fallback encoding are known to not be a BOM, for example, for valid HTML // and most encodings. func BOMOverride(fallback transform.Transformer) transform.Transformer { // TODO: possibly allow a variadic argument of unicode encodings to allow // specifying details of which fallbacks are supported as well as // specifying the details of the implementations. This would also allow for // support for UTF-32, which should not be supported by default. return &bomOverride{fallback: fallback} } type bomOverride struct { fallback transform.Transformer current transform.Transformer } func (d *bomOverride) Reset() { d.current = nil d.fallback.Reset() } var ( // TODO: we could use decode functions here, instead of allocating a new // decoder on every NewDecoder as IgnoreBOM decoders can be stateless. utf16le = UTF16(LittleEndian, IgnoreBOM) utf16be = UTF16(BigEndian, IgnoreBOM) ) const utf8BOM = "\ufeff" func (d *bomOverride) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { if d.current != nil { return d.current.Transform(dst, src, atEOF) } if len(src) < 3 && !atEOF { return 0, 0, transform.ErrShortSrc } d.current = d.fallback bomSize := 0 if len(src) >= 2 { if src[0] == 0xFF && src[1] == 0xFE { d.current = utf16le.NewDecoder() bomSize = 2 } else if src[0] == 0xFE && src[1] == 0xFF { d.current = utf16be.NewDecoder() bomSize = 2 } else if len(src) >= 3 && src[0] == utf8BOM[0] && src[1] == utf8BOM[1] && src[2] == utf8BOM[2] { d.current = transform.Nop bomSize = 3 } } if bomSize < len(src) { nDst, nSrc, err = d.current.Transform(dst, src[bomSize:], atEOF) } return nDst, nSrc + bomSize, err } ================================================ FILE: vendor/golang.org/x/text/encoding/unicode/unicode.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package unicode provides Unicode encodings such as UTF-16. package unicode // import "golang.org/x/text/encoding/unicode" import ( "errors" "unicode/utf16" "unicode/utf8" "golang.org/x/text/encoding" "golang.org/x/text/encoding/internal" "golang.org/x/text/encoding/internal/identifier" "golang.org/x/text/internal/utf8internal" "golang.org/x/text/runes" "golang.org/x/text/transform" ) // TODO: I think the Transformers really should return errors on unmatched // surrogate pairs and odd numbers of bytes. This is not required by RFC 2781, // which leaves it open, but is suggested by WhatWG. It will allow for all error // modes as defined by WhatWG: fatal, HTML and Replacement. This would require // the introduction of some kind of error type for conveying the erroneous code // point. // UTF8 is the UTF-8 encoding. var UTF8 encoding.Encoding = utf8enc var utf8enc = &internal.Encoding{ &internal.SimpleEncoding{utf8Decoder{}, runes.ReplaceIllFormed()}, "UTF-8", identifier.UTF8, } type utf8Decoder struct{ transform.NopResetter } func (utf8Decoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { var pSrc int // point from which to start copy in src var accept utf8internal.AcceptRange // The decoder can only make the input larger, not smaller. n := len(src) if len(dst) < n { err = transform.ErrShortDst n = len(dst) atEOF = false } for nSrc < n { c := src[nSrc] if c < utf8.RuneSelf { nSrc++ continue } first := utf8internal.First[c] size := int(first & utf8internal.SizeMask) if first == utf8internal.FirstInvalid { goto handleInvalid // invalid starter byte } accept = utf8internal.AcceptRanges[first>>utf8internal.AcceptShift] if nSrc+size > n { if !atEOF { // We may stop earlier than necessary here if the short sequence // has invalid bytes. Not checking for this simplifies the code // and may avoid duplicate computations in certain conditions. if err == nil { err = transform.ErrShortSrc } break } // Determine the maximal subpart of an ill-formed subsequence. switch { case nSrc+1 >= n || src[nSrc+1] < accept.Lo || accept.Hi < src[nSrc+1]: size = 1 case nSrc+2 >= n || src[nSrc+2] < utf8internal.LoCB || utf8internal.HiCB < src[nSrc+2]: size = 2 default: size = 3 // As we are short, the maximum is 3. } goto handleInvalid } if c = src[nSrc+1]; c < accept.Lo || accept.Hi < c { size = 1 goto handleInvalid // invalid continuation byte } else if size == 2 { } else if c = src[nSrc+2]; c < utf8internal.LoCB || utf8internal.HiCB < c { size = 2 goto handleInvalid // invalid continuation byte } else if size == 3 { } else if c = src[nSrc+3]; c < utf8internal.LoCB || utf8internal.HiCB < c { size = 3 goto handleInvalid // invalid continuation byte } nSrc += size continue handleInvalid: // Copy the scanned input so far. nDst += copy(dst[nDst:], src[pSrc:nSrc]) // Append RuneError to the destination. const runeError = "\ufffd" if nDst+len(runeError) > len(dst) { return nDst, nSrc, transform.ErrShortDst } nDst += copy(dst[nDst:], runeError) // Skip the maximal subpart of an ill-formed subsequence according to // the W3C standard way instead of the Go way. This Transform is // probably the only place in the text repo where it is warranted. nSrc += size pSrc = nSrc // Recompute the maximum source length. if sz := len(dst) - nDst; sz < len(src)-nSrc { err = transform.ErrShortDst n = nSrc + sz atEOF = false } } return nDst + copy(dst[nDst:], src[pSrc:nSrc]), nSrc, err } // UTF16 returns a UTF-16 Encoding for the given default endianness and byte // order mark (BOM) policy. // // When decoding from UTF-16 to UTF-8, if the BOMPolicy is IgnoreBOM then // neither BOMs U+FEFF nor noncharacters U+FFFE in the input stream will affect // the endianness used for decoding, and will instead be output as their // standard UTF-8 encodings: "\xef\xbb\xbf" and "\xef\xbf\xbe". If the BOMPolicy // is UseBOM or ExpectBOM a staring BOM is not written to the UTF-8 output. // Instead, it overrides the default endianness e for the remainder of the // transformation. Any subsequent BOMs U+FEFF or noncharacters U+FFFE will not // affect the endianness used, and will instead be output as their standard // UTF-8 encodings. For UseBOM, if there is no starting BOM, it will proceed // with the default Endianness. For ExpectBOM, in that case, the transformation // will return early with an ErrMissingBOM error. // // When encoding from UTF-8 to UTF-16, a BOM will be inserted at the start of // the output if the BOMPolicy is UseBOM or ExpectBOM. Otherwise, a BOM will not // be inserted. The UTF-8 input does not need to contain a BOM. // // There is no concept of a 'native' endianness. If the UTF-16 data is produced // and consumed in a greater context that implies a certain endianness, use // IgnoreBOM. Otherwise, use ExpectBOM and always produce and consume a BOM. // // In the language of http://www.unicode.org/faq/utf_bom.html#bom10, IgnoreBOM // corresponds to "Where the precise type of the data stream is known... the // BOM should not be used" and ExpectBOM corresponds to "A particular // protocol... may require use of the BOM". func UTF16(e Endianness, b BOMPolicy) encoding.Encoding { return utf16Encoding{config{e, b}, mibValue[e][b&bomMask]} } // mibValue maps Endianness and BOMPolicy settings to MIB constants. Note that // some configurations map to the same MIB identifier. RFC 2781 has requirements // and recommendations. Some of the "configurations" are merely recommendations, // so multiple configurations could match. var mibValue = map[Endianness][numBOMValues]identifier.MIB{ BigEndian: [numBOMValues]identifier.MIB{ IgnoreBOM: identifier.UTF16BE, UseBOM: identifier.UTF16, // BigEnding default is preferred by RFC 2781. // TODO: acceptBOM | strictBOM would map to UTF16BE as well. }, LittleEndian: [numBOMValues]identifier.MIB{ IgnoreBOM: identifier.UTF16LE, UseBOM: identifier.UTF16, // LittleEndian default is allowed and preferred on Windows. // TODO: acceptBOM | strictBOM would map to UTF16LE as well. }, // ExpectBOM is not widely used and has no valid MIB identifier. } // All lists a configuration for each IANA-defined UTF-16 variant. var All = []encoding.Encoding{ UTF8, UTF16(BigEndian, UseBOM), UTF16(BigEndian, IgnoreBOM), UTF16(LittleEndian, IgnoreBOM), } // BOMPolicy is a UTF-16 encoding's byte order mark policy. type BOMPolicy uint8 const ( writeBOM BOMPolicy = 0x01 acceptBOM BOMPolicy = 0x02 requireBOM BOMPolicy = 0x04 bomMask BOMPolicy = 0x07 // HACK: numBOMValues == 8 triggers a bug in the 1.4 compiler (cannot have a // map of an array of length 8 of a type that is also used as a key or value // in another map). See golang.org/issue/11354. // TODO: consider changing this value back to 8 if the use of 1.4.* has // been minimized. numBOMValues = 8 + 1 // IgnoreBOM means to ignore any byte order marks. IgnoreBOM BOMPolicy = 0 // Common and RFC 2781-compliant interpretation for UTF-16BE/LE. // UseBOM means that the UTF-16 form may start with a byte order mark, which // will be used to override the default encoding. UseBOM BOMPolicy = writeBOM | acceptBOM // Common and RFC 2781-compliant interpretation for UTF-16. // ExpectBOM means that the UTF-16 form must start with a byte order mark, // which will be used to override the default encoding. ExpectBOM BOMPolicy = writeBOM | acceptBOM | requireBOM // Used in Java as Unicode (not to be confused with Java's UTF-16) and // ICU's UTF-16,version=1. Not compliant with RFC 2781. // TODO (maybe): strictBOM: BOM must match Endianness. This would allow: // - UTF-16(B|L)E,version=1: writeBOM | acceptBOM | requireBOM | strictBOM // (UnicodeBig and UnicodeLittle in Java) // - RFC 2781-compliant, but less common interpretation for UTF-16(B|L)E: // acceptBOM | strictBOM (e.g. assigned to CheckBOM). // This addition would be consistent with supporting ExpectBOM. ) // Endianness is a UTF-16 encoding's default endianness. type Endianness bool const ( // BigEndian is UTF-16BE. BigEndian Endianness = false // LittleEndian is UTF-16LE. LittleEndian Endianness = true ) // ErrMissingBOM means that decoding UTF-16 input with ExpectBOM did not find a // starting byte order mark. var ErrMissingBOM = errors.New("encoding: missing byte order mark") type utf16Encoding struct { config mib identifier.MIB } type config struct { endianness Endianness bomPolicy BOMPolicy } func (u utf16Encoding) NewDecoder() *encoding.Decoder { return &encoding.Decoder{Transformer: &utf16Decoder{ initial: u.config, current: u.config, }} } func (u utf16Encoding) NewEncoder() *encoding.Encoder { return &encoding.Encoder{Transformer: &utf16Encoder{ endianness: u.endianness, initialBOMPolicy: u.bomPolicy, currentBOMPolicy: u.bomPolicy, }} } func (u utf16Encoding) ID() (mib identifier.MIB, other string) { return u.mib, "" } func (u utf16Encoding) String() string { e, b := "B", "" if u.endianness == LittleEndian { e = "L" } switch u.bomPolicy { case ExpectBOM: b = "Expect" case UseBOM: b = "Use" case IgnoreBOM: b = "Ignore" } return "UTF-16" + e + "E (" + b + " BOM)" } type utf16Decoder struct { initial config current config } func (u *utf16Decoder) Reset() { u.current = u.initial } func (u *utf16Decoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { if len(src) == 0 { if atEOF && u.current.bomPolicy&requireBOM != 0 { return 0, 0, ErrMissingBOM } return 0, 0, nil } if u.current.bomPolicy&acceptBOM != 0 { if len(src) < 2 { return 0, 0, transform.ErrShortSrc } switch { case src[0] == 0xfe && src[1] == 0xff: u.current.endianness = BigEndian nSrc = 2 case src[0] == 0xff && src[1] == 0xfe: u.current.endianness = LittleEndian nSrc = 2 default: if u.current.bomPolicy&requireBOM != 0 { return 0, 0, ErrMissingBOM } } u.current.bomPolicy = IgnoreBOM } var r rune var dSize, sSize int for nSrc < len(src) { if nSrc+1 < len(src) { x := uint16(src[nSrc+0])<<8 | uint16(src[nSrc+1]) if u.current.endianness == LittleEndian { x = x>>8 | x<<8 } r, sSize = rune(x), 2 if utf16.IsSurrogate(r) { if nSrc+3 < len(src) { x = uint16(src[nSrc+2])<<8 | uint16(src[nSrc+3]) if u.current.endianness == LittleEndian { x = x>>8 | x<<8 } // Save for next iteration if it is not a high surrogate. if isHighSurrogate(rune(x)) { r, sSize = utf16.DecodeRune(r, rune(x)), 4 } } else if !atEOF { err = transform.ErrShortSrc break } } if dSize = utf8.RuneLen(r); dSize < 0 { r, dSize = utf8.RuneError, 3 } } else if atEOF { // Single trailing byte. r, dSize, sSize = utf8.RuneError, 3, 1 } else { err = transform.ErrShortSrc break } if nDst+dSize > len(dst) { err = transform.ErrShortDst break } nDst += utf8.EncodeRune(dst[nDst:], r) nSrc += sSize } return nDst, nSrc, err } func isHighSurrogate(r rune) bool { return 0xDC00 <= r && r <= 0xDFFF } type utf16Encoder struct { endianness Endianness initialBOMPolicy BOMPolicy currentBOMPolicy BOMPolicy } func (u *utf16Encoder) Reset() { u.currentBOMPolicy = u.initialBOMPolicy } func (u *utf16Encoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { if u.currentBOMPolicy&writeBOM != 0 { if len(dst) < 2 { return 0, 0, transform.ErrShortDst } dst[0], dst[1] = 0xfe, 0xff u.currentBOMPolicy = IgnoreBOM nDst = 2 } r, size := rune(0), 0 for nSrc < len(src) { r = rune(src[nSrc]) // Decode a 1-byte rune. if r < utf8.RuneSelf { size = 1 } else { // Decode a multi-byte rune. r, size = utf8.DecodeRune(src[nSrc:]) if size == 1 { // All valid runes of size 1 (those below utf8.RuneSelf) were // handled above. We have invalid UTF-8 or we haven't seen the // full character yet. if !atEOF && !utf8.FullRune(src[nSrc:]) { err = transform.ErrShortSrc break } } } if r <= 0xffff { if nDst+2 > len(dst) { err = transform.ErrShortDst break } dst[nDst+0] = uint8(r >> 8) dst[nDst+1] = uint8(r) nDst += 2 } else { if nDst+4 > len(dst) { err = transform.ErrShortDst break } r1, r2 := utf16.EncodeRune(r) dst[nDst+0] = uint8(r1 >> 8) dst[nDst+1] = uint8(r1) dst[nDst+2] = uint8(r2 >> 8) dst[nDst+3] = uint8(r2) nDst += 4 } nSrc += size } if u.endianness == LittleEndian { for i := 0; i < nDst; i += 2 { dst[i], dst[i+1] = dst[i+1], dst[i] } } return nDst, nSrc, err } ================================================ FILE: vendor/golang.org/x/text/internal/tag/tag.go ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package tag contains functionality handling tags and related data. package tag // import "golang.org/x/text/internal/tag" import "sort" // An Index converts tags to a compact numeric value. // // All elements are of size 4. Tags may be up to 4 bytes long. Excess bytes can // be used to store additional information about the tag. type Index string // Elem returns the element data at the given index. func (s Index) Elem(x int) string { return string(s[x*4 : x*4+4]) } // Index reports the index of the given key or -1 if it could not be found. // Only the first len(key) bytes from the start of the 4-byte entries will be // considered for the search and the first match in Index will be returned. func (s Index) Index(key []byte) int { n := len(key) // search the index of the first entry with an equal or higher value than // key in s. index := sort.Search(len(s)/4, func(i int) bool { return cmp(s[i*4:i*4+n], key) != -1 }) i := index * 4 if cmp(s[i:i+len(key)], key) != 0 { return -1 } return index } // Next finds the next occurrence of key after index x, which must have been // obtained from a call to Index using the same key. It returns x+1 or -1. func (s Index) Next(key []byte, x int) int { if x++; x*4 < len(s) && cmp(s[x*4:x*4+len(key)], key) == 0 { return x } return -1 } // cmp returns an integer comparing a and b lexicographically. func cmp(a Index, b []byte) int { n := len(a) if len(b) < n { n = len(b) } for i, c := range b[:n] { switch { case a[i] > c: return 1 case a[i] < c: return -1 } } switch { case len(a) < len(b): return -1 case len(a) > len(b): return 1 } return 0 } // Compare returns an integer comparing a and b lexicographically. func Compare(a string, b []byte) int { return cmp(Index(a), b) } // FixCase reformats b to the same pattern of cases as form. // If returns false if string b is malformed. func FixCase(form string, b []byte) bool { if len(form) != len(b) { return false } for i, c := range b { if form[i] <= 'Z' { if c >= 'a' { c -= 'z' - 'Z' } if c < 'A' || 'Z' < c { return false } } else { if c <= 'Z' { c += 'z' - 'Z' } if c < 'a' || 'z' < c { return false } } b[i] = c } return true } ================================================ FILE: vendor/golang.org/x/text/internal/utf8internal/utf8internal.go ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package utf8internal contains low-level utf8-related constants, tables, etc. // that are used internally by the text package. package utf8internal // The default lowest and highest continuation byte. const ( LoCB = 0x80 // 1000 0000 HiCB = 0xBF // 1011 1111 ) // Constants related to getting information of first bytes of UTF-8 sequences. const ( // ASCII identifies a UTF-8 byte as ASCII. ASCII = as // FirstInvalid indicates a byte is invalid as a first byte of a UTF-8 // sequence. FirstInvalid = xx // SizeMask is a mask for the size bits. Use use x&SizeMask to get the size. SizeMask = 7 // AcceptShift is the right-shift count for the first byte info byte to get // the index into the AcceptRanges table. See AcceptRanges. AcceptShift = 4 // The names of these constants are chosen to give nice alignment in the // table below. The first nibble is an index into acceptRanges or F for // special one-byte cases. The second nibble is the Rune length or the // Status for the special one-byte case. xx = 0xF1 // invalid: size 1 as = 0xF0 // ASCII: size 1 s1 = 0x02 // accept 0, size 2 s2 = 0x13 // accept 1, size 3 s3 = 0x03 // accept 0, size 3 s4 = 0x23 // accept 2, size 3 s5 = 0x34 // accept 3, size 4 s6 = 0x04 // accept 0, size 4 s7 = 0x44 // accept 4, size 4 ) // First is information about the first byte in a UTF-8 sequence. var First = [256]uint8{ // 1 2 3 4 5 6 7 8 9 A B C D E F as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x00-0x0F as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x10-0x1F as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x20-0x2F as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x30-0x3F as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x40-0x4F as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x50-0x5F as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x60-0x6F as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x70-0x7F // 1 2 3 4 5 6 7 8 9 A B C D E F xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0x80-0x8F xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0x90-0x9F xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0xA0-0xAF xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0xB0-0xBF xx, xx, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, // 0xC0-0xCF s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, // 0xD0-0xDF s2, s3, s3, s3, s3, s3, s3, s3, s3, s3, s3, s3, s3, s4, s3, s3, // 0xE0-0xEF s5, s6, s6, s6, s7, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0xF0-0xFF } // AcceptRange gives the range of valid values for the second byte in a UTF-8 // sequence for any value for First that is not ASCII or FirstInvalid. type AcceptRange struct { Lo uint8 // lowest value for second byte. Hi uint8 // highest value for second byte. } // AcceptRanges is a slice of AcceptRange values. For a given byte sequence b // // AcceptRanges[First[b[0]]>>AcceptShift] // // will give the value of AcceptRange for the multi-byte UTF-8 sequence starting // at b[0]. var AcceptRanges = [...]AcceptRange{ 0: {LoCB, HiCB}, 1: {0xA0, HiCB}, 2: {LoCB, 0x9F}, 3: {0x90, HiCB}, 4: {LoCB, 0x8F}, } ================================================ FILE: vendor/golang.org/x/text/language/Makefile ================================================ # Copyright 2013 The Go Authors. All rights reserved. # Use of this source code is governed by a BSD-style # license that can be found in the LICENSE file. CLEANFILES+=maketables maketables: maketables.go go build $^ tables: maketables ./maketables > tables.go gofmt -w -s tables.go # Build (but do not run) maketables during testing, # just to make sure it still compiles. testshort: maketables ================================================ FILE: vendor/golang.org/x/text/language/common.go ================================================ // This file was generated by go generate; DO NOT EDIT package language // This file contains code common to the maketables.go and the package code. // langAliasType is the type of an alias in langAliasMap. type langAliasType int8 const ( langDeprecated langAliasType = iota langMacro langLegacy langAliasTypeUnknown langAliasType = -1 ) ================================================ FILE: vendor/golang.org/x/text/language/coverage.go ================================================ // Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package language import ( "fmt" "sort" ) // The Coverage interface is used to define the level of coverage of an // internationalization service. Note that not all types are supported by all // services. As lists may be generated on the fly, it is recommended that users // of a Coverage cache the results. type Coverage interface { // Tags returns the list of supported tags. Tags() []Tag // BaseLanguages returns the list of supported base languages. BaseLanguages() []Base // Scripts returns the list of supported scripts. Scripts() []Script // Regions returns the list of supported regions. Regions() []Region } var ( // Supported defines a Coverage that lists all supported subtags. Tags // always returns nil. Supported Coverage = allSubtags{} ) // TODO: // - Support Variants, numbering systems. // - CLDR coverage levels. // - Set of common tags defined in this package. type allSubtags struct{} // Regions returns the list of supported regions. As all regions are in a // consecutive range, it simply returns a slice of numbers in increasing order. // The "undefined" region is not returned. func (s allSubtags) Regions() []Region { reg := make([]Region, numRegions) for i := range reg { reg[i] = Region{regionID(i + 1)} } return reg } // Scripts returns the list of supported scripts. As all scripts are in a // consecutive range, it simply returns a slice of numbers in increasing order. // The "undefined" script is not returned. func (s allSubtags) Scripts() []Script { scr := make([]Script, numScripts) for i := range scr { scr[i] = Script{scriptID(i + 1)} } return scr } // BaseLanguages returns the list of all supported base languages. It generates // the list by traversing the internal structures. func (s allSubtags) BaseLanguages() []Base { base := make([]Base, 0, numLanguages) for i := 0; i < langNoIndexOffset; i++ { // We included "und" already for the value 0. if i != nonCanonicalUnd { base = append(base, Base{langID(i)}) } } i := langNoIndexOffset for _, v := range langNoIndex { for k := 0; k < 8; k++ { if v&1 == 1 { base = append(base, Base{langID(i)}) } v >>= 1 i++ } } return base } // Tags always returns nil. func (s allSubtags) Tags() []Tag { return nil } // coverage is used used by NewCoverage which is used as a convenient way for // creating Coverage implementations for partially defined data. Very often a // package will only need to define a subset of slices. coverage provides a // convenient way to do this. Moreover, packages using NewCoverage, instead of // their own implementation, will not break if later new slice types are added. type coverage struct { tags func() []Tag bases func() []Base scripts func() []Script regions func() []Region } func (s *coverage) Tags() []Tag { if s.tags == nil { return nil } return s.tags() } // bases implements sort.Interface and is used to sort base languages. type bases []Base func (b bases) Len() int { return len(b) } func (b bases) Swap(i, j int) { b[i], b[j] = b[j], b[i] } func (b bases) Less(i, j int) bool { return b[i].langID < b[j].langID } // BaseLanguages returns the result from calling s.bases if it is specified or // otherwise derives the set of supported base languages from tags. func (s *coverage) BaseLanguages() []Base { if s.bases == nil { tags := s.Tags() if len(tags) == 0 { return nil } a := make([]Base, len(tags)) for i, t := range tags { a[i] = Base{langID(t.lang)} } sort.Sort(bases(a)) k := 0 for i := 1; i < len(a); i++ { if a[k] != a[i] { k++ a[k] = a[i] } } return a[:k+1] } return s.bases() } func (s *coverage) Scripts() []Script { if s.scripts == nil { return nil } return s.scripts() } func (s *coverage) Regions() []Region { if s.regions == nil { return nil } return s.regions() } // NewCoverage returns a Coverage for the given lists. It is typically used by // packages providing internationalization services to define their level of // coverage. A list may be of type []T or func() []T, where T is either Tag, // Base, Script or Region. The returned Coverage derives the value for Bases // from Tags if no func or slice for []Base is specified. For other unspecified // types the returned Coverage will return nil for the respective methods. func NewCoverage(list ...interface{}) Coverage { s := &coverage{} for _, x := range list { switch v := x.(type) { case func() []Base: s.bases = v case func() []Script: s.scripts = v case func() []Region: s.regions = v case func() []Tag: s.tags = v case []Base: s.bases = func() []Base { return v } case []Script: s.scripts = func() []Script { return v } case []Region: s.regions = func() []Region { return v } case []Tag: s.tags = func() []Tag { return v } default: panic(fmt.Sprintf("language: unsupported set type %T", v)) } } return s } ================================================ FILE: vendor/golang.org/x/text/language/gen_common.go ================================================ // Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build ignore package main // This file contains code common to the maketables.go and the package code. // langAliasType is the type of an alias in langAliasMap. type langAliasType int8 const ( langDeprecated langAliasType = iota langMacro langLegacy langAliasTypeUnknown langAliasType = -1 ) ================================================ FILE: vendor/golang.org/x/text/language/gen_index.go ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build ignore package main // This file generates derivative tables based on the language package itself. import ( "bytes" "flag" "fmt" "io/ioutil" "log" "reflect" "sort" "strings" "golang.org/x/text/internal/gen" "golang.org/x/text/language" "golang.org/x/text/unicode/cldr" ) var ( test = flag.Bool("test", false, "test existing tables; can be used to compare web data with package data.") draft = flag.String("draft", "contributed", `Minimal draft requirements (approved, contributed, provisional, unconfirmed).`) ) func main() { gen.Init() // Read the CLDR zip file. r := gen.OpenCLDRCoreZip() defer r.Close() d := &cldr.Decoder{} data, err := d.DecodeZip(r) if err != nil { log.Fatalf("DecodeZip: %v", err) } w := gen.NewCodeWriter() defer func() { buf := &bytes.Buffer{} if _, err = w.WriteGo(buf, "language"); err != nil { log.Fatalf("Error formatting file index.go: %v", err) } // Since we're generating a table for our own package we need to rewrite // doing the equivalent of go fmt -r 'language.b -> b'. Using // bytes.Replace will do. out := bytes.Replace(buf.Bytes(), []byte("language."), nil, -1) if err := ioutil.WriteFile("index.go", out, 0600); err != nil { log.Fatalf("Could not create file index.go: %v", err) } }() m := map[language.Tag]bool{} for _, lang := range data.Locales() { // We include all locales unconditionally to be consistent with en_US. // We want en_US, even though it has no data associated with it. // TODO: put any of the languages for which no data exists at the end // of the index. This allows all components based on ICU to use that // as the cutoff point. // if x := data.RawLDML(lang); false || // x.LocaleDisplayNames != nil || // x.Characters != nil || // x.Delimiters != nil || // x.Measurement != nil || // x.Dates != nil || // x.Numbers != nil || // x.Units != nil || // x.ListPatterns != nil || // x.Collations != nil || // x.Segmentations != nil || // x.Rbnf != nil || // x.Annotations != nil || // x.Metadata != nil { // TODO: support POSIX natively, albeit non-standard. tag := language.Make(strings.Replace(lang, "_POSIX", "-u-va-posix", 1)) m[tag] = true // } } // Include locales for plural rules, which uses a different structure. for _, plurals := range data.Supplemental().Plurals { for _, rules := range plurals.PluralRules { for _, lang := range strings.Split(rules.Locales, " ") { m[language.Make(lang)] = true } } } var core, special []language.Tag for t := range m { if x := t.Extensions(); len(x) != 0 && fmt.Sprint(x) != "[u-va-posix]" { log.Fatalf("Unexpected extension %v in %v", x, t) } if len(t.Variants()) == 0 && len(t.Extensions()) == 0 { core = append(core, t) } else { special = append(special, t) } } w.WriteComment(` NumCompactTags is the number of common tags. The maximum tag is NumCompactTags-1.`) w.WriteConst("NumCompactTags", len(core)+len(special)) sort.Sort(byAlpha(special)) w.WriteVar("specialTags", special) // TODO: order by frequency? sort.Sort(byAlpha(core)) // Size computations are just an estimate. w.Size += int(reflect.TypeOf(map[uint32]uint16{}).Size()) w.Size += len(core) * 6 // size of uint32 and uint16 fmt.Fprintln(w) fmt.Fprintln(w, "var coreTags = map[uint32]uint16{") fmt.Fprintln(w, "0x0: 0, // und") i := len(special) + 1 // Und and special tags already written. for _, t := range core { if t == language.Und { continue } fmt.Fprint(w.Hash, t, i) b, s, r := t.Raw() fmt.Fprintf(w, "0x%s%s%s: %d, // %s\n", getIndex(b, 3), // 3 is enough as it is guaranteed to be a compact number getIndex(s, 2), getIndex(r, 3), i, t) i++ } fmt.Fprintln(w, "}") } // getIndex prints the subtag type and extracts its index of size nibble. // If the index is less than n nibbles, the result is prefixed with 0s. func getIndex(x interface{}, n int) string { s := fmt.Sprintf("%#v", x) // s is of form Type{typeID: 0x00} s = s[strings.Index(s, "0x")+2 : len(s)-1] return strings.Repeat("0", n-len(s)) + s } type byAlpha []language.Tag func (a byAlpha) Len() int { return len(a) } func (a byAlpha) Swap(i, j int) { a[i], a[j] = a[j], a[i] } func (a byAlpha) Less(i, j int) bool { return a[i].String() < a[j].String() } ================================================ FILE: vendor/golang.org/x/text/language/go1_1.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !go1.2 package language import "sort" func sortStable(s sort.Interface) { ss := stableSort{ s: s, pos: make([]int, s.Len()), } for i := range ss.pos { ss.pos[i] = i } sort.Sort(&ss) } type stableSort struct { s sort.Interface pos []int } func (s *stableSort) Len() int { return len(s.pos) } func (s *stableSort) Less(i, j int) bool { return s.s.Less(i, j) || !s.s.Less(j, i) && s.pos[i] < s.pos[j] } func (s *stableSort) Swap(i, j int) { s.s.Swap(i, j) s.pos[i], s.pos[j] = s.pos[j], s.pos[i] } ================================================ FILE: vendor/golang.org/x/text/language/go1_2.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build go1.2 package language import "sort" var sortStable = sort.Stable ================================================ FILE: vendor/golang.org/x/text/language/index.go ================================================ // This file was generated by go generate; DO NOT EDIT package language // NumCompactTags is the number of common tags. The maximum tag is // NumCompactTags-1. const NumCompactTags = 752 var specialTags = []Tag{ // 2 elements 0: {lang: 0xd5, region: 0x6d, script: 0x0, pVariant: 0x5, pExt: 0xe, str: "ca-ES-valencia"}, 1: {lang: 0x134, region: 0x134, script: 0x0, pVariant: 0x5, pExt: 0x5, str: "en-US-u-va-posix"}, } // Size: 72 bytes var coreTags = map[uint32]uint16{ 0x0: 0, // und 0x01500000: 3, // af 0x015000d1: 4, // af-NA 0x01500160: 5, // af-ZA 0x01b00000: 6, // agq 0x01b00051: 7, // agq-CM 0x02000000: 8, // ak 0x0200007f: 9, // ak-GH 0x02600000: 10, // am 0x0260006e: 11, // am-ET 0x03900000: 12, // ar 0x03900001: 13, // ar-001 0x03900022: 14, // ar-AE 0x03900038: 15, // ar-BH 0x03900061: 16, // ar-DJ 0x03900066: 17, // ar-DZ 0x0390006a: 18, // ar-EG 0x0390006b: 19, // ar-EH 0x0390006c: 20, // ar-ER 0x03900096: 21, // ar-IL 0x0390009a: 22, // ar-IQ 0x039000a0: 23, // ar-JO 0x039000a7: 24, // ar-KM 0x039000ab: 25, // ar-KW 0x039000af: 26, // ar-LB 0x039000b8: 27, // ar-LY 0x039000b9: 28, // ar-MA 0x039000c8: 29, // ar-MR 0x039000e0: 30, // ar-OM 0x039000ec: 31, // ar-PS 0x039000f2: 32, // ar-QA 0x03900107: 33, // ar-SA 0x0390010a: 34, // ar-SD 0x03900114: 35, // ar-SO 0x03900116: 36, // ar-SS 0x0390011b: 37, // ar-SY 0x0390011f: 38, // ar-TD 0x03900127: 39, // ar-TN 0x0390015d: 40, // ar-YE 0x03f00000: 41, // ars 0x04200000: 42, // as 0x04200098: 43, // as-IN 0x04300000: 44, // asa 0x0430012e: 45, // asa-TZ 0x04700000: 46, // ast 0x0470006d: 47, // ast-ES 0x05700000: 48, // az 0x0571e000: 49, // az-Cyrl 0x0571e031: 50, // az-Cyrl-AZ 0x05752000: 51, // az-Latn 0x05752031: 52, // az-Latn-AZ 0x05d00000: 53, // bas 0x05d00051: 54, // bas-CM 0x07000000: 55, // be 0x07000046: 56, // be-BY 0x07400000: 57, // bem 0x07400161: 58, // bem-ZM 0x07800000: 59, // bez 0x0780012e: 60, // bez-TZ 0x07d00000: 61, // bg 0x07d00037: 62, // bg-BG 0x08100000: 63, // bh 0x09e00000: 64, // bm 0x09e000c2: 65, // bm-ML 0x0a300000: 66, // bn 0x0a300034: 67, // bn-BD 0x0a300098: 68, // bn-IN 0x0a700000: 69, // bo 0x0a700052: 70, // bo-CN 0x0a700098: 71, // bo-IN 0x0b000000: 72, // br 0x0b000077: 73, // br-FR 0x0b300000: 74, // brx 0x0b300098: 75, // brx-IN 0x0b500000: 76, // bs 0x0b51e000: 77, // bs-Cyrl 0x0b51e032: 78, // bs-Cyrl-BA 0x0b552000: 79, // bs-Latn 0x0b552032: 80, // bs-Latn-BA 0x0d500000: 81, // ca 0x0d500021: 82, // ca-AD 0x0d50006d: 83, // ca-ES 0x0d500077: 84, // ca-FR 0x0d50009d: 85, // ca-IT 0x0da00000: 86, // ce 0x0da00105: 87, // ce-RU 0x0dd00000: 88, // cgg 0x0dd00130: 89, // cgg-UG 0x0e300000: 90, // chr 0x0e300134: 91, // chr-US 0x0e700000: 92, // ckb 0x0e70009a: 93, // ckb-IQ 0x0e70009b: 94, // ckb-IR 0x0f600000: 95, // cs 0x0f60005d: 96, // cs-CZ 0x0fa00000: 97, // cu 0x0fa00105: 98, // cu-RU 0x0fc00000: 99, // cy 0x0fc0007a: 100, // cy-GB 0x0fd00000: 101, // da 0x0fd00062: 102, // da-DK 0x0fd00081: 103, // da-GL 0x10400000: 104, // dav 0x104000a3: 105, // dav-KE 0x10900000: 106, // de 0x1090002d: 107, // de-AT 0x10900035: 108, // de-BE 0x1090004d: 109, // de-CH 0x1090005f: 110, // de-DE 0x1090009d: 111, // de-IT 0x109000b1: 112, // de-LI 0x109000b6: 113, // de-LU 0x11300000: 114, // dje 0x113000d3: 115, // dje-NE 0x11b00000: 116, // dsb 0x11b0005f: 117, // dsb-DE 0x12000000: 118, // dua 0x12000051: 119, // dua-CM 0x12400000: 120, // dv 0x12700000: 121, // dyo 0x12700113: 122, // dyo-SN 0x12900000: 123, // dz 0x12900042: 124, // dz-BT 0x12b00000: 125, // ebu 0x12b000a3: 126, // ebu-KE 0x12c00000: 127, // ee 0x12c0007f: 128, // ee-GH 0x12c00121: 129, // ee-TG 0x13100000: 130, // el 0x1310005c: 131, // el-CY 0x13100086: 132, // el-GR 0x13400000: 133, // en 0x13400001: 134, // en-001 0x1340001a: 135, // en-150 0x13400024: 136, // en-AG 0x13400025: 137, // en-AI 0x1340002c: 138, // en-AS 0x1340002d: 139, // en-AT 0x1340002e: 140, // en-AU 0x13400033: 141, // en-BB 0x13400035: 142, // en-BE 0x13400039: 143, // en-BI 0x1340003c: 144, // en-BM 0x13400041: 145, // en-BS 0x13400045: 146, // en-BW 0x13400047: 147, // en-BZ 0x13400048: 148, // en-CA 0x13400049: 149, // en-CC 0x1340004d: 150, // en-CH 0x1340004f: 151, // en-CK 0x13400051: 152, // en-CM 0x1340005b: 153, // en-CX 0x1340005c: 154, // en-CY 0x1340005f: 155, // en-DE 0x13400060: 156, // en-DG 0x13400062: 157, // en-DK 0x13400063: 158, // en-DM 0x1340006c: 159, // en-ER 0x13400071: 160, // en-FI 0x13400072: 161, // en-FJ 0x13400073: 162, // en-FK 0x13400074: 163, // en-FM 0x1340007a: 164, // en-GB 0x1340007b: 165, // en-GD 0x1340007e: 166, // en-GG 0x1340007f: 167, // en-GH 0x13400080: 168, // en-GI 0x13400082: 169, // en-GM 0x13400089: 170, // en-GU 0x1340008b: 171, // en-GY 0x1340008c: 172, // en-HK 0x13400095: 173, // en-IE 0x13400096: 174, // en-IL 0x13400097: 175, // en-IM 0x13400098: 176, // en-IN 0x13400099: 177, // en-IO 0x1340009e: 178, // en-JE 0x1340009f: 179, // en-JM 0x134000a3: 180, // en-KE 0x134000a6: 181, // en-KI 0x134000a8: 182, // en-KN 0x134000ac: 183, // en-KY 0x134000b0: 184, // en-LC 0x134000b3: 185, // en-LR 0x134000b4: 186, // en-LS 0x134000be: 187, // en-MG 0x134000bf: 188, // en-MH 0x134000c5: 189, // en-MO 0x134000c6: 190, // en-MP 0x134000c9: 191, // en-MS 0x134000ca: 192, // en-MT 0x134000cb: 193, // en-MU 0x134000cd: 194, // en-MW 0x134000cf: 195, // en-MY 0x134000d1: 196, // en-NA 0x134000d4: 197, // en-NF 0x134000d5: 198, // en-NG 0x134000d8: 199, // en-NL 0x134000dc: 200, // en-NR 0x134000de: 201, // en-NU 0x134000df: 202, // en-NZ 0x134000e5: 203, // en-PG 0x134000e6: 204, // en-PH 0x134000e7: 205, // en-PK 0x134000ea: 206, // en-PN 0x134000eb: 207, // en-PR 0x134000ef: 208, // en-PW 0x13400106: 209, // en-RW 0x13400108: 210, // en-SB 0x13400109: 211, // en-SC 0x1340010a: 212, // en-SD 0x1340010b: 213, // en-SE 0x1340010c: 214, // en-SG 0x1340010d: 215, // en-SH 0x1340010e: 216, // en-SI 0x13400111: 217, // en-SL 0x13400116: 218, // en-SS 0x1340011a: 219, // en-SX 0x1340011c: 220, // en-SZ 0x1340011e: 221, // en-TC 0x13400124: 222, // en-TK 0x13400128: 223, // en-TO 0x1340012b: 224, // en-TT 0x1340012c: 225, // en-TV 0x1340012e: 226, // en-TZ 0x13400130: 227, // en-UG 0x13400132: 228, // en-UM 0x13400134: 229, // en-US 0x13400138: 230, // en-VC 0x1340013b: 231, // en-VG 0x1340013c: 232, // en-VI 0x1340013e: 233, // en-VU 0x13400141: 234, // en-WS 0x13400160: 235, // en-ZA 0x13400161: 236, // en-ZM 0x13400163: 237, // en-ZW 0x13700000: 238, // eo 0x13700001: 239, // eo-001 0x13900000: 240, // es 0x1390001e: 241, // es-419 0x1390002b: 242, // es-AR 0x1390003e: 243, // es-BO 0x13900040: 244, // es-BR 0x13900050: 245, // es-CL 0x13900053: 246, // es-CO 0x13900055: 247, // es-CR 0x13900058: 248, // es-CU 0x13900064: 249, // es-DO 0x13900067: 250, // es-EA 0x13900068: 251, // es-EC 0x1390006d: 252, // es-ES 0x13900085: 253, // es-GQ 0x13900088: 254, // es-GT 0x1390008e: 255, // es-HN 0x13900093: 256, // es-IC 0x139000ce: 257, // es-MX 0x139000d7: 258, // es-NI 0x139000e1: 259, // es-PA 0x139000e3: 260, // es-PE 0x139000e6: 261, // es-PH 0x139000eb: 262, // es-PR 0x139000f0: 263, // es-PY 0x13900119: 264, // es-SV 0x13900134: 265, // es-US 0x13900135: 266, // es-UY 0x1390013a: 267, // es-VE 0x13b00000: 268, // et 0x13b00069: 269, // et-EE 0x14000000: 270, // eu 0x1400006d: 271, // eu-ES 0x14100000: 272, // ewo 0x14100051: 273, // ewo-CM 0x14300000: 274, // fa 0x14300023: 275, // fa-AF 0x1430009b: 276, // fa-IR 0x14900000: 277, // ff 0x14900051: 278, // ff-CM 0x14900083: 279, // ff-GN 0x149000c8: 280, // ff-MR 0x14900113: 281, // ff-SN 0x14c00000: 282, // fi 0x14c00071: 283, // fi-FI 0x14e00000: 284, // fil 0x14e000e6: 285, // fil-PH 0x15300000: 286, // fo 0x15300062: 287, // fo-DK 0x15300075: 288, // fo-FO 0x15900000: 289, // fr 0x15900035: 290, // fr-BE 0x15900036: 291, // fr-BF 0x15900039: 292, // fr-BI 0x1590003a: 293, // fr-BJ 0x1590003b: 294, // fr-BL 0x15900048: 295, // fr-CA 0x1590004a: 296, // fr-CD 0x1590004b: 297, // fr-CF 0x1590004c: 298, // fr-CG 0x1590004d: 299, // fr-CH 0x1590004e: 300, // fr-CI 0x15900051: 301, // fr-CM 0x15900061: 302, // fr-DJ 0x15900066: 303, // fr-DZ 0x15900077: 304, // fr-FR 0x15900079: 305, // fr-GA 0x1590007d: 306, // fr-GF 0x15900083: 307, // fr-GN 0x15900084: 308, // fr-GP 0x15900085: 309, // fr-GQ 0x15900090: 310, // fr-HT 0x159000a7: 311, // fr-KM 0x159000b6: 312, // fr-LU 0x159000b9: 313, // fr-MA 0x159000ba: 314, // fr-MC 0x159000bd: 315, // fr-MF 0x159000be: 316, // fr-MG 0x159000c2: 317, // fr-ML 0x159000c7: 318, // fr-MQ 0x159000c8: 319, // fr-MR 0x159000cb: 320, // fr-MU 0x159000d2: 321, // fr-NC 0x159000d3: 322, // fr-NE 0x159000e4: 323, // fr-PF 0x159000e9: 324, // fr-PM 0x15900101: 325, // fr-RE 0x15900106: 326, // fr-RW 0x15900109: 327, // fr-SC 0x15900113: 328, // fr-SN 0x1590011b: 329, // fr-SY 0x1590011f: 330, // fr-TD 0x15900121: 331, // fr-TG 0x15900127: 332, // fr-TN 0x1590013e: 333, // fr-VU 0x1590013f: 334, // fr-WF 0x1590015e: 335, // fr-YT 0x16400000: 336, // fur 0x1640009d: 337, // fur-IT 0x16800000: 338, // fy 0x168000d8: 339, // fy-NL 0x16900000: 340, // ga 0x16900095: 341, // ga-IE 0x17800000: 342, // gd 0x1780007a: 343, // gd-GB 0x18a00000: 344, // gl 0x18a0006d: 345, // gl-ES 0x19c00000: 346, // gsw 0x19c0004d: 347, // gsw-CH 0x19c00077: 348, // gsw-FR 0x19c000b1: 349, // gsw-LI 0x19d00000: 350, // gu 0x19d00098: 351, // gu-IN 0x1a200000: 352, // guw 0x1a400000: 353, // guz 0x1a4000a3: 354, // guz-KE 0x1a500000: 355, // gv 0x1a500097: 356, // gv-IM 0x1ad00000: 357, // ha 0x1ad0007f: 358, // ha-GH 0x1ad000d3: 359, // ha-NE 0x1ad000d5: 360, // ha-NG 0x1b100000: 361, // haw 0x1b100134: 362, // haw-US 0x1b500000: 363, // he 0x1b500096: 364, // he-IL 0x1b700000: 365, // hi 0x1b700098: 366, // hi-IN 0x1ca00000: 367, // hr 0x1ca00032: 368, // hr-BA 0x1ca0008f: 369, // hr-HR 0x1cb00000: 370, // hsb 0x1cb0005f: 371, // hsb-DE 0x1ce00000: 372, // hu 0x1ce00091: 373, // hu-HU 0x1d000000: 374, // hy 0x1d000027: 375, // hy-AM 0x1da00000: 376, // id 0x1da00094: 377, // id-ID 0x1df00000: 378, // ig 0x1df000d5: 379, // ig-NG 0x1e200000: 380, // ii 0x1e200052: 381, // ii-CN 0x1f000000: 382, // is 0x1f00009c: 383, // is-IS 0x1f100000: 384, // it 0x1f10004d: 385, // it-CH 0x1f10009d: 386, // it-IT 0x1f100112: 387, // it-SM 0x1f200000: 388, // iu 0x1f800000: 389, // ja 0x1f8000a1: 390, // ja-JP 0x1fb00000: 391, // jbo 0x1ff00000: 392, // jgo 0x1ff00051: 393, // jgo-CM 0x20200000: 394, // jmc 0x2020012e: 395, // jmc-TZ 0x20600000: 396, // jv 0x20800000: 397, // ka 0x2080007c: 398, // ka-GE 0x20a00000: 399, // kab 0x20a00066: 400, // kab-DZ 0x20e00000: 401, // kaj 0x20f00000: 402, // kam 0x20f000a3: 403, // kam-KE 0x21700000: 404, // kcg 0x21b00000: 405, // kde 0x21b0012e: 406, // kde-TZ 0x21f00000: 407, // kea 0x21f00059: 408, // kea-CV 0x22c00000: 409, // khq 0x22c000c2: 410, // khq-ML 0x23100000: 411, // ki 0x231000a3: 412, // ki-KE 0x23a00000: 413, // kk 0x23a000ad: 414, // kk-KZ 0x23c00000: 415, // kkj 0x23c00051: 416, // kkj-CM 0x23d00000: 417, // kl 0x23d00081: 418, // kl-GL 0x23e00000: 419, // kln 0x23e000a3: 420, // kln-KE 0x24200000: 421, // km 0x242000a5: 422, // km-KH 0x24900000: 423, // kn 0x24900098: 424, // kn-IN 0x24b00000: 425, // ko 0x24b000a9: 426, // ko-KP 0x24b000aa: 427, // ko-KR 0x24d00000: 428, // kok 0x24d00098: 429, // kok-IN 0x26100000: 430, // ks 0x26100098: 431, // ks-IN 0x26200000: 432, // ksb 0x2620012e: 433, // ksb-TZ 0x26400000: 434, // ksf 0x26400051: 435, // ksf-CM 0x26500000: 436, // ksh 0x2650005f: 437, // ksh-DE 0x26b00000: 438, // ku 0x27800000: 439, // kw 0x2780007a: 440, // kw-GB 0x28100000: 441, // ky 0x281000a4: 442, // ky-KG 0x28800000: 443, // lag 0x2880012e: 444, // lag-TZ 0x28c00000: 445, // lb 0x28c000b6: 446, // lb-LU 0x29a00000: 447, // lg 0x29a00130: 448, // lg-UG 0x2a600000: 449, // lkt 0x2a600134: 450, // lkt-US 0x2ac00000: 451, // ln 0x2ac00029: 452, // ln-AO 0x2ac0004a: 453, // ln-CD 0x2ac0004b: 454, // ln-CF 0x2ac0004c: 455, // ln-CG 0x2af00000: 456, // lo 0x2af000ae: 457, // lo-LA 0x2b600000: 458, // lrc 0x2b60009a: 459, // lrc-IQ 0x2b60009b: 460, // lrc-IR 0x2b700000: 461, // lt 0x2b7000b5: 462, // lt-LT 0x2b900000: 463, // lu 0x2b90004a: 464, // lu-CD 0x2bb00000: 465, // luo 0x2bb000a3: 466, // luo-KE 0x2bc00000: 467, // luy 0x2bc000a3: 468, // luy-KE 0x2be00000: 469, // lv 0x2be000b7: 470, // lv-LV 0x2c800000: 471, // mas 0x2c8000a3: 472, // mas-KE 0x2c80012e: 473, // mas-TZ 0x2e000000: 474, // mer 0x2e0000a3: 475, // mer-KE 0x2e400000: 476, // mfe 0x2e4000cb: 477, // mfe-MU 0x2e800000: 478, // mg 0x2e8000be: 479, // mg-MG 0x2e900000: 480, // mgh 0x2e9000d0: 481, // mgh-MZ 0x2eb00000: 482, // mgo 0x2eb00051: 483, // mgo-CM 0x2f600000: 484, // mk 0x2f6000c1: 485, // mk-MK 0x2fb00000: 486, // ml 0x2fb00098: 487, // ml-IN 0x30200000: 488, // mn 0x302000c4: 489, // mn-MN 0x31200000: 490, // mr 0x31200098: 491, // mr-IN 0x31600000: 492, // ms 0x3160003d: 493, // ms-BN 0x316000cf: 494, // ms-MY 0x3160010c: 495, // ms-SG 0x31700000: 496, // mt 0x317000ca: 497, // mt-MT 0x31c00000: 498, // mua 0x31c00051: 499, // mua-CM 0x32800000: 500, // my 0x328000c3: 501, // my-MM 0x33100000: 502, // mzn 0x3310009b: 503, // mzn-IR 0x33800000: 504, // nah 0x33c00000: 505, // naq 0x33c000d1: 506, // naq-NA 0x33e00000: 507, // nb 0x33e000d9: 508, // nb-NO 0x33e0010f: 509, // nb-SJ 0x34500000: 510, // nd 0x34500163: 511, // nd-ZW 0x34700000: 512, // nds 0x3470005f: 513, // nds-DE 0x347000d8: 514, // nds-NL 0x34800000: 515, // ne 0x34800098: 516, // ne-IN 0x348000da: 517, // ne-NP 0x35e00000: 518, // nl 0x35e0002f: 519, // nl-AW 0x35e00035: 520, // nl-BE 0x35e0003f: 521, // nl-BQ 0x35e0005a: 522, // nl-CW 0x35e000d8: 523, // nl-NL 0x35e00115: 524, // nl-SR 0x35e0011a: 525, // nl-SX 0x35f00000: 526, // nmg 0x35f00051: 527, // nmg-CM 0x36100000: 528, // nn 0x361000d9: 529, // nn-NO 0x36300000: 530, // nnh 0x36300051: 531, // nnh-CM 0x36600000: 532, // no 0x36c00000: 533, // nqo 0x36d00000: 534, // nr 0x37100000: 535, // nso 0x37700000: 536, // nus 0x37700116: 537, // nus-SS 0x37e00000: 538, // ny 0x38000000: 539, // nyn 0x38000130: 540, // nyn-UG 0x38700000: 541, // om 0x3870006e: 542, // om-ET 0x387000a3: 543, // om-KE 0x38c00000: 544, // or 0x38c00098: 545, // or-IN 0x38f00000: 546, // os 0x38f0007c: 547, // os-GE 0x38f00105: 548, // os-RU 0x39400000: 549, // pa 0x39405000: 550, // pa-Arab 0x394050e7: 551, // pa-Arab-PK 0x3942f000: 552, // pa-Guru 0x3942f098: 553, // pa-Guru-IN 0x39800000: 554, // pap 0x3aa00000: 555, // pl 0x3aa000e8: 556, // pl-PL 0x3b400000: 557, // prg 0x3b400001: 558, // prg-001 0x3b500000: 559, // ps 0x3b500023: 560, // ps-AF 0x3b700000: 561, // pt 0x3b700029: 562, // pt-AO 0x3b700040: 563, // pt-BR 0x3b70004d: 564, // pt-CH 0x3b700059: 565, // pt-CV 0x3b700085: 566, // pt-GQ 0x3b70008a: 567, // pt-GW 0x3b7000b6: 568, // pt-LU 0x3b7000c5: 569, // pt-MO 0x3b7000d0: 570, // pt-MZ 0x3b7000ed: 571, // pt-PT 0x3b700117: 572, // pt-ST 0x3b700125: 573, // pt-TL 0x3bb00000: 574, // qu 0x3bb0003e: 575, // qu-BO 0x3bb00068: 576, // qu-EC 0x3bb000e3: 577, // qu-PE 0x3cb00000: 578, // rm 0x3cb0004d: 579, // rm-CH 0x3d000000: 580, // rn 0x3d000039: 581, // rn-BI 0x3d300000: 582, // ro 0x3d3000bb: 583, // ro-MD 0x3d300103: 584, // ro-RO 0x3d500000: 585, // rof 0x3d50012e: 586, // rof-TZ 0x3d900000: 587, // ru 0x3d900046: 588, // ru-BY 0x3d9000a4: 589, // ru-KG 0x3d9000ad: 590, // ru-KZ 0x3d9000bb: 591, // ru-MD 0x3d900105: 592, // ru-RU 0x3d90012f: 593, // ru-UA 0x3dc00000: 594, // rw 0x3dc00106: 595, // rw-RW 0x3dd00000: 596, // rwk 0x3dd0012e: 597, // rwk-TZ 0x3e200000: 598, // sah 0x3e200105: 599, // sah-RU 0x3e300000: 600, // saq 0x3e3000a3: 601, // saq-KE 0x3e900000: 602, // sbp 0x3e90012e: 603, // sbp-TZ 0x3f200000: 604, // sdh 0x3f300000: 605, // se 0x3f300071: 606, // se-FI 0x3f3000d9: 607, // se-NO 0x3f30010b: 608, // se-SE 0x3f500000: 609, // seh 0x3f5000d0: 610, // seh-MZ 0x3f700000: 611, // ses 0x3f7000c2: 612, // ses-ML 0x3f800000: 613, // sg 0x3f80004b: 614, // sg-CF 0x3fe00000: 615, // shi 0x3fe52000: 616, // shi-Latn 0x3fe520b9: 617, // shi-Latn-MA 0x3fed2000: 618, // shi-Tfng 0x3fed20b9: 619, // shi-Tfng-MA 0x40200000: 620, // si 0x402000b2: 621, // si-LK 0x40800000: 622, // sk 0x40800110: 623, // sk-SK 0x40c00000: 624, // sl 0x40c0010e: 625, // sl-SI 0x41200000: 626, // sma 0x41300000: 627, // smi 0x41400000: 628, // smj 0x41500000: 629, // smn 0x41500071: 630, // smn-FI 0x41800000: 631, // sms 0x41900000: 632, // sn 0x41900163: 633, // sn-ZW 0x41f00000: 634, // so 0x41f00061: 635, // so-DJ 0x41f0006e: 636, // so-ET 0x41f000a3: 637, // so-KE 0x41f00114: 638, // so-SO 0x42700000: 639, // sq 0x42700026: 640, // sq-AL 0x427000c1: 641, // sq-MK 0x4270014c: 642, // sq-XK 0x42800000: 643, // sr 0x4281e000: 644, // sr-Cyrl 0x4281e032: 645, // sr-Cyrl-BA 0x4281e0bc: 646, // sr-Cyrl-ME 0x4281e104: 647, // sr-Cyrl-RS 0x4281e14c: 648, // sr-Cyrl-XK 0x42852000: 649, // sr-Latn 0x42852032: 650, // sr-Latn-BA 0x428520bc: 651, // sr-Latn-ME 0x42852104: 652, // sr-Latn-RS 0x4285214c: 653, // sr-Latn-XK 0x42d00000: 654, // ss 0x43000000: 655, // ssy 0x43100000: 656, // st 0x43a00000: 657, // sv 0x43a00030: 658, // sv-AX 0x43a00071: 659, // sv-FI 0x43a0010b: 660, // sv-SE 0x43b00000: 661, // sw 0x43b0004a: 662, // sw-CD 0x43b000a3: 663, // sw-KE 0x43b0012e: 664, // sw-TZ 0x43b00130: 665, // sw-UG 0x44400000: 666, // syr 0x44600000: 667, // ta 0x44600098: 668, // ta-IN 0x446000b2: 669, // ta-LK 0x446000cf: 670, // ta-MY 0x4460010c: 671, // ta-SG 0x45700000: 672, // te 0x45700098: 673, // te-IN 0x45a00000: 674, // teo 0x45a000a3: 675, // teo-KE 0x45a00130: 676, // teo-UG 0x46100000: 677, // th 0x46100122: 678, // th-TH 0x46500000: 679, // ti 0x4650006c: 680, // ti-ER 0x4650006e: 681, // ti-ET 0x46700000: 682, // tig 0x46c00000: 683, // tk 0x46c00126: 684, // tk-TM 0x47600000: 685, // tn 0x47800000: 686, // to 0x47800128: 687, // to-TO 0x48000000: 688, // tr 0x4800005c: 689, // tr-CY 0x4800012a: 690, // tr-TR 0x48400000: 691, // ts 0x49a00000: 692, // twq 0x49a000d3: 693, // twq-NE 0x49f00000: 694, // tzm 0x49f000b9: 695, // tzm-MA 0x4a200000: 696, // ug 0x4a200052: 697, // ug-CN 0x4a400000: 698, // uk 0x4a40012f: 699, // uk-UA 0x4aa00000: 700, // ur 0x4aa00098: 701, // ur-IN 0x4aa000e7: 702, // ur-PK 0x4b200000: 703, // uz 0x4b205000: 704, // uz-Arab 0x4b205023: 705, // uz-Arab-AF 0x4b21e000: 706, // uz-Cyrl 0x4b21e136: 707, // uz-Cyrl-UZ 0x4b252000: 708, // uz-Latn 0x4b252136: 709, // uz-Latn-UZ 0x4b400000: 710, // vai 0x4b452000: 711, // vai-Latn 0x4b4520b3: 712, // vai-Latn-LR 0x4b4d9000: 713, // vai-Vaii 0x4b4d90b3: 714, // vai-Vaii-LR 0x4b600000: 715, // ve 0x4b900000: 716, // vi 0x4b90013d: 717, // vi-VN 0x4bf00000: 718, // vo 0x4bf00001: 719, // vo-001 0x4c200000: 720, // vun 0x4c20012e: 721, // vun-TZ 0x4c400000: 722, // wa 0x4c500000: 723, // wae 0x4c50004d: 724, // wae-CH 0x4db00000: 725, // wo 0x4e800000: 726, // xh 0x4f100000: 727, // xog 0x4f100130: 728, // xog-UG 0x4ff00000: 729, // yav 0x4ff00051: 730, // yav-CM 0x50800000: 731, // yi 0x50800001: 732, // yi-001 0x50e00000: 733, // yo 0x50e0003a: 734, // yo-BJ 0x50e000d5: 735, // yo-NG 0x51500000: 736, // yue 0x5150008c: 737, // yue-HK 0x51e00000: 738, // zgh 0x51e000b9: 739, // zgh-MA 0x51f00000: 740, // zh 0x51f34000: 741, // zh-Hans 0x51f34052: 742, // zh-Hans-CN 0x51f3408c: 743, // zh-Hans-HK 0x51f340c5: 744, // zh-Hans-MO 0x51f3410c: 745, // zh-Hans-SG 0x51f35000: 746, // zh-Hant 0x51f3508c: 747, // zh-Hant-HK 0x51f350c5: 748, // zh-Hant-MO 0x51f3512d: 749, // zh-Hant-TW 0x52400000: 750, // zu 0x52400160: 751, // zu-ZA } // Total table size 4580 bytes (4KiB); checksum: A7F72A2A ================================================ FILE: vendor/golang.org/x/text/language/language.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //go:generate go run maketables.go gen_common.go -output tables.go //go:generate go run gen_index.go // Package language implements BCP 47 language tags and related functionality. // // The Tag type, which is used to represent languages, is agnostic to the // meaning of its subtags. Tags are not fully canonicalized to preserve // information that may be valuable in certain contexts. As a consequence, two // different tags may represent identical languages. // // Initializing language- or locale-specific components usually consists of // two steps. The first step is to select a display language based on the // preferred languages of the user and the languages supported by an application. // The second step is to create the language-specific services based on // this selection. Each is discussed in more details below. // // Matching preferred against supported languages // // An application may support various languages. This list is typically limited // by the languages for which there exists translations of the user interface. // Similarly, a user may provide a list of preferred languages which is limited // by the languages understood by this user. // An application should use a Matcher to find the best supported language based // on the user's preferred list. // Matchers are aware of the intricacies of equivalence between languages. // The default Matcher implementation takes into account things such as // deprecated subtags, legacy tags, and mutual intelligibility between scripts // and languages. // // A Matcher for English, Australian English, Danish, and standard Mandarin can // be defined as follows: // // var matcher = language.NewMatcher([]language.Tag{ // language.English, // The first language is used as fallback. // language.MustParse("en-AU"), // language.Danish, // language.Chinese, // }) // // The following code selects the best match for someone speaking Spanish and // Norwegian: // // preferred := []language.Tag{ language.Spanish, language.Norwegian } // tag, _, _ := matcher.Match(preferred...) // // In this case, the best match is Danish, as Danish is sufficiently a match to // Norwegian to not have to fall back to the default. // See ParseAcceptLanguage on how to handle the Accept-Language HTTP header. // // Selecting language-specific services // // One should always use the Tag returned by the Matcher to create an instance // of any of the language-specific services provided by the text repository. // This prevents the mixing of languages, such as having a different language for // messages and display names, as well as improper casing or sorting order for // the selected language. // Using the returned Tag also allows user-defined settings, such as collation // order or numbering system to be transparently passed as options. // // If you have language-specific data in your application, however, it will in // most cases suffice to use the index returned by the matcher to identify // the user language. // The following loop provides an alternative in case this is not sufficient: // // supported := map[language.Tag]data{ // language.English: enData, // language.MustParse("en-AU"): enAUData, // language.Danish: daData, // language.Chinese: zhData, // } // tag, _, _ := matcher.Match(preferred...) // for ; tag != language.Und; tag = tag.Parent() { // if v, ok := supported[tag]; ok { // return v // } // } // return enData // should not reach here // // Repeatedly taking the Parent of the tag returned by Match will eventually // match one of the tags used to initialize the Matcher. // // Canonicalization // // By default, only legacy and deprecated tags are converted into their // canonical equivalent. All other information is preserved. This approach makes // the confidence scores more accurate and allows matchers to distinguish // between variants that are otherwise lost. // // As a consequence, two tags that should be treated as identical according to // BCP 47 or CLDR, like "en-Latn" and "en", will be represented differently. The // Matchers will handle such distinctions, though, and are aware of the // equivalence relations. The CanonType type can be used to alter the // canonicalization form. // // References // // BCP 47 - Tags for Identifying Languages // http://tools.ietf.org/html/bcp47 package language // import "golang.org/x/text/language" // TODO: Remove above NOTE after: // - verifying that tables are dropped correctly (most notably matcher tables). import ( "errors" "fmt" "strings" ) const ( // maxCoreSize is the maximum size of a BCP 47 tag without variants and // extensions. Equals max lang (3) + script (4) + max reg (3) + 2 dashes. maxCoreSize = 12 // max99thPercentileSize is a somewhat arbitrary buffer size that presumably // is large enough to hold at least 99% of the BCP 47 tags. max99thPercentileSize = 32 // maxSimpleUExtensionSize is the maximum size of a -u extension with one // key-type pair. Equals len("-u-") + key (2) + dash + max value (8). maxSimpleUExtensionSize = 14 ) // Tag represents a BCP 47 language tag. It is used to specify an instance of a // specific language or locale. All language tag values are guaranteed to be // well-formed. type Tag struct { lang langID region regionID script scriptID pVariant byte // offset in str, includes preceding '-' pExt uint16 // offset of first extension, includes preceding '-' // str is the string representation of the Tag. It will only be used if the // tag has variants or extensions. str string } // Make is a convenience wrapper for Parse that omits the error. // In case of an error, a sensible default is returned. func Make(s string) Tag { return Default.Make(s) } // Make is a convenience wrapper for c.Parse that omits the error. // In case of an error, a sensible default is returned. func (c CanonType) Make(s string) Tag { t, _ := c.Parse(s) return t } // Raw returns the raw base language, script and region, without making an // attempt to infer their values. func (t Tag) Raw() (b Base, s Script, r Region) { return Base{t.lang}, Script{t.script}, Region{t.region} } // equalTags compares language, script and region subtags only. func (t Tag) equalTags(a Tag) bool { return t.lang == a.lang && t.script == a.script && t.region == a.region } // IsRoot returns true if t is equal to language "und". func (t Tag) IsRoot() bool { if int(t.pVariant) < len(t.str) { return false } return t.equalTags(und) } // private reports whether the Tag consists solely of a private use tag. func (t Tag) private() bool { return t.str != "" && t.pVariant == 0 } // CanonType can be used to enable or disable various types of canonicalization. type CanonType int const ( // Replace deprecated base languages with their preferred replacements. DeprecatedBase CanonType = 1 << iota // Replace deprecated scripts with their preferred replacements. DeprecatedScript // Replace deprecated regions with their preferred replacements. DeprecatedRegion // Remove redundant scripts. SuppressScript // Normalize legacy encodings. This includes legacy languages defined in // CLDR as well as bibliographic codes defined in ISO-639. Legacy // Map the dominant language of a macro language group to the macro language // subtag. For example cmn -> zh. Macro // The CLDR flag should be used if full compatibility with CLDR is required. // There are a few cases where language.Tag may differ from CLDR. To follow all // of CLDR's suggestions, use All|CLDR. CLDR // Raw can be used to Compose or Parse without Canonicalization. Raw CanonType = 0 // Replace all deprecated tags with their preferred replacements. Deprecated = DeprecatedBase | DeprecatedScript | DeprecatedRegion // All canonicalizations recommended by BCP 47. BCP47 = Deprecated | SuppressScript // All canonicalizations. All = BCP47 | Legacy | Macro // Default is the canonicalization used by Parse, Make and Compose. To // preserve as much information as possible, canonicalizations that remove // potentially valuable information are not included. The Matcher is // designed to recognize similar tags that would be the same if // they were canonicalized using All. Default = Deprecated | Legacy canonLang = DeprecatedBase | Legacy | Macro // TODO: LikelyScript, LikelyRegion: suppress similar to ICU. ) // canonicalize returns the canonicalized equivalent of the tag and // whether there was any change. func (t Tag) canonicalize(c CanonType) (Tag, bool) { if c == Raw { return t, false } changed := false if c&SuppressScript != 0 { if t.lang < langNoIndexOffset && uint8(t.script) == suppressScript[t.lang] { t.script = 0 changed = true } } if c&canonLang != 0 { for { if l, aliasType := normLang(t.lang); l != t.lang { switch aliasType { case langLegacy: if c&Legacy != 0 { if t.lang == _sh && t.script == 0 { t.script = _Latn } t.lang = l changed = true } case langMacro: if c&Macro != 0 { // We deviate here from CLDR. The mapping "nb" -> "no" // qualifies as a typical Macro language mapping. However, // for legacy reasons, CLDR maps "no", the macro language // code for Norwegian, to the dominant variant "nb". This // change is currently under consideration for CLDR as well. // See http://unicode.org/cldr/trac/ticket/2698 and also // http://unicode.org/cldr/trac/ticket/1790 for some of the // practical implications. TODO: this check could be removed // if CLDR adopts this change. if c&CLDR == 0 || t.lang != _nb { changed = true t.lang = l } } case langDeprecated: if c&DeprecatedBase != 0 { if t.lang == _mo && t.region == 0 { t.region = _MD } t.lang = l changed = true // Other canonicalization types may still apply. continue } } } else if c&Legacy != 0 && t.lang == _no && c&CLDR != 0 { t.lang = _nb changed = true } break } } if c&DeprecatedScript != 0 { if t.script == _Qaai { changed = true t.script = _Zinh } } if c&DeprecatedRegion != 0 { if r := normRegion(t.region); r != 0 { changed = true t.region = r } } return t, changed } // Canonicalize returns the canonicalized equivalent of the tag. func (c CanonType) Canonicalize(t Tag) (Tag, error) { t, changed := t.canonicalize(c) if changed { t.remakeString() } return t, nil } // Confidence indicates the level of certainty for a given return value. // For example, Serbian may be written in Cyrillic or Latin script. // The confidence level indicates whether a value was explicitly specified, // whether it is typically the only possible value, or whether there is // an ambiguity. type Confidence int const ( No Confidence = iota // full confidence that there was no match Low // most likely value picked out of a set of alternatives High // value is generally assumed to be the correct match Exact // exact match or explicitly specified value ) var confName = []string{"No", "Low", "High", "Exact"} func (c Confidence) String() string { return confName[c] } // remakeString is used to update t.str in case lang, script or region changed. // It is assumed that pExt and pVariant still point to the start of the // respective parts. func (t *Tag) remakeString() { if t.str == "" { return } extra := t.str[t.pVariant:] if t.pVariant > 0 { extra = extra[1:] } if t.equalTags(und) && strings.HasPrefix(extra, "x-") { t.str = extra t.pVariant = 0 t.pExt = 0 return } var buf [max99thPercentileSize]byte // avoid extra memory allocation in most cases. b := buf[:t.genCoreBytes(buf[:])] if extra != "" { diff := len(b) - int(t.pVariant) b = append(b, '-') b = append(b, extra...) t.pVariant = uint8(int(t.pVariant) + diff) t.pExt = uint16(int(t.pExt) + diff) } else { t.pVariant = uint8(len(b)) t.pExt = uint16(len(b)) } t.str = string(b) } // genCoreBytes writes a string for the base languages, script and region tags // to the given buffer and returns the number of bytes written. It will never // write more than maxCoreSize bytes. func (t *Tag) genCoreBytes(buf []byte) int { n := t.lang.stringToBuf(buf[:]) if t.script != 0 { n += copy(buf[n:], "-") n += copy(buf[n:], t.script.String()) } if t.region != 0 { n += copy(buf[n:], "-") n += copy(buf[n:], t.region.String()) } return n } // String returns the canonical string representation of the language tag. func (t Tag) String() string { if t.str != "" { return t.str } if t.script == 0 && t.region == 0 { return t.lang.String() } buf := [maxCoreSize]byte{} return string(buf[:t.genCoreBytes(buf[:])]) } // Base returns the base language of the language tag. If the base language is // unspecified, an attempt will be made to infer it from the context. // It uses a variant of CLDR's Add Likely Subtags algorithm. This is subject to change. func (t Tag) Base() (Base, Confidence) { if t.lang != 0 { return Base{t.lang}, Exact } c := High if t.script == 0 && !(Region{t.region}).IsCountry() { c = Low } if tag, err := addTags(t); err == nil && tag.lang != 0 { return Base{tag.lang}, c } return Base{0}, No } // Script infers the script for the language tag. If it was not explicitly given, it will infer // a most likely candidate. // If more than one script is commonly used for a language, the most likely one // is returned with a low confidence indication. For example, it returns (Cyrl, Low) // for Serbian. // If a script cannot be inferred (Zzzz, No) is returned. We do not use Zyyy (undetermined) // as one would suspect from the IANA registry for BCP 47. In a Unicode context Zyyy marks // common characters (like 1, 2, 3, '.', etc.) and is therefore more like multiple scripts. // See http://www.unicode.org/reports/tr24/#Values for more details. Zzzz is also used for // unknown value in CLDR. (Zzzz, Exact) is returned if Zzzz was explicitly specified. // Note that an inferred script is never guaranteed to be the correct one. Latin is // almost exclusively used for Afrikaans, but Arabic has been used for some texts // in the past. Also, the script that is commonly used may change over time. // It uses a variant of CLDR's Add Likely Subtags algorithm. This is subject to change. func (t Tag) Script() (Script, Confidence) { if t.script != 0 { return Script{t.script}, Exact } sc, c := scriptID(_Zzzz), No if t.lang < langNoIndexOffset { if scr := scriptID(suppressScript[t.lang]); scr != 0 { // Note: it is not always the case that a language with a suppress // script value is only written in one script (e.g. kk, ms, pa). if t.region == 0 { return Script{scriptID(scr)}, High } sc, c = scr, High } } if tag, err := addTags(t); err == nil { if tag.script != sc { sc, c = tag.script, Low } } else { t, _ = (Deprecated | Macro).Canonicalize(t) if tag, err := addTags(t); err == nil && tag.script != sc { sc, c = tag.script, Low } } return Script{sc}, c } // Region returns the region for the language tag. If it was not explicitly given, it will // infer a most likely candidate from the context. // It uses a variant of CLDR's Add Likely Subtags algorithm. This is subject to change. func (t Tag) Region() (Region, Confidence) { if t.region != 0 { return Region{t.region}, Exact } if t, err := addTags(t); err == nil { return Region{t.region}, Low // TODO: differentiate between high and low. } t, _ = (Deprecated | Macro).Canonicalize(t) if tag, err := addTags(t); err == nil { return Region{tag.region}, Low } return Region{_ZZ}, No // TODO: return world instead of undetermined? } // Variant returns the variants specified explicitly for this language tag. // or nil if no variant was specified. func (t Tag) Variants() []Variant { v := []Variant{} if int(t.pVariant) < int(t.pExt) { for x, str := "", t.str[t.pVariant:t.pExt]; str != ""; { x, str = nextToken(str) v = append(v, Variant{x}) } } return v } // Parent returns the CLDR parent of t. In CLDR, missing fields in data for a // specific language are substituted with fields from the parent language. // The parent for a language may change for newer versions of CLDR. func (t Tag) Parent() Tag { if t.str != "" { // Strip the variants and extensions. t, _ = Raw.Compose(t.Raw()) if t.region == 0 && t.script != 0 && t.lang != 0 { base, _ := addTags(Tag{lang: t.lang}) if base.script == t.script { return Tag{lang: t.lang} } } return t } if t.lang != 0 { if t.region != 0 { maxScript := t.script if maxScript == 0 { max, _ := addTags(t) maxScript = max.script } for i := range parents { if langID(parents[i].lang) == t.lang && scriptID(parents[i].maxScript) == maxScript { for _, r := range parents[i].fromRegion { if regionID(r) == t.region { return Tag{ lang: t.lang, script: scriptID(parents[i].script), region: regionID(parents[i].toRegion), } } } } } // Strip the script if it is the default one. base, _ := addTags(Tag{lang: t.lang}) if base.script != maxScript { return Tag{lang: t.lang, script: maxScript} } return Tag{lang: t.lang} } else if t.script != 0 { // The parent for an base-script pair with a non-default script is // "und" instead of the base language. base, _ := addTags(Tag{lang: t.lang}) if base.script != t.script { return und } return Tag{lang: t.lang} } } return und } // returns token t and the rest of the string. func nextToken(s string) (t, tail string) { p := strings.Index(s[1:], "-") if p == -1 { return s[1:], "" } p++ return s[1:p], s[p:] } // Extension is a single BCP 47 extension. type Extension struct { s string } // String returns the string representation of the extension, including the // type tag. func (e Extension) String() string { return e.s } // ParseExtension parses s as an extension and returns it on success. func ParseExtension(s string) (e Extension, err error) { scan := makeScannerString(s) var end int if n := len(scan.token); n != 1 { return Extension{}, errSyntax } scan.toLower(0, len(scan.b)) end = parseExtension(&scan) if end != len(s) { return Extension{}, errSyntax } return Extension{string(scan.b)}, nil } // Type returns the one-byte extension type of e. It returns 0 for the zero // exception. func (e Extension) Type() byte { if e.s == "" { return 0 } return e.s[0] } // Tokens returns the list of tokens of e. func (e Extension) Tokens() []string { return strings.Split(e.s, "-") } // Extension returns the extension of type x for tag t. It will return // false for ok if t does not have the requested extension. The returned // extension will be invalid in this case. func (t Tag) Extension(x byte) (ext Extension, ok bool) { for i := int(t.pExt); i < len(t.str)-1; { var ext string i, ext = getExtension(t.str, i) if ext[0] == x { return Extension{ext}, true } } return Extension{}, false } // Extensions returns all extensions of t. func (t Tag) Extensions() []Extension { e := []Extension{} for i := int(t.pExt); i < len(t.str)-1; { var ext string i, ext = getExtension(t.str, i) e = append(e, Extension{ext}) } return e } // TypeForKey returns the type associated with the given key, where key and type // are of the allowed values defined for the Unicode locale extension ('u') in // http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers. // TypeForKey will traverse the inheritance chain to get the correct value. func (t Tag) TypeForKey(key string) string { if start, end, _ := t.findTypeForKey(key); end != start { return t.str[start:end] } return "" } var ( errPrivateUse = errors.New("cannot set a key on a private use tag") errInvalidArguments = errors.New("invalid key or type") ) // SetTypeForKey returns a new Tag with the key set to type, where key and type // are of the allowed values defined for the Unicode locale extension ('u') in // http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers. // An empty value removes an existing pair with the same key. func (t Tag) SetTypeForKey(key, value string) (Tag, error) { if t.private() { return t, errPrivateUse } if len(key) != 2 { return t, errInvalidArguments } // Remove the setting if value is "". if value == "" { start, end, _ := t.findTypeForKey(key) if start != end { // Remove key tag and leading '-'. start -= 4 // Remove a possible empty extension. if (end == len(t.str) || t.str[end+2] == '-') && t.str[start-2] == '-' { start -= 2 } if start == int(t.pVariant) && end == len(t.str) { t.str = "" t.pVariant, t.pExt = 0, 0 } else { t.str = fmt.Sprintf("%s%s", t.str[:start], t.str[end:]) } } return t, nil } if len(value) < 3 || len(value) > 8 { return t, errInvalidArguments } var ( buf [maxCoreSize + maxSimpleUExtensionSize]byte uStart int // start of the -u extension. ) // Generate the tag string if needed. if t.str == "" { uStart = t.genCoreBytes(buf[:]) buf[uStart] = '-' uStart++ } // Create new key-type pair and parse it to verify. b := buf[uStart:] copy(b, "u-") copy(b[2:], key) b[4] = '-' b = b[:5+copy(b[5:], value)] scan := makeScanner(b) if parseExtensions(&scan); scan.err != nil { return t, scan.err } // Assemble the replacement string. if t.str == "" { t.pVariant, t.pExt = byte(uStart-1), uint16(uStart-1) t.str = string(buf[:uStart+len(b)]) } else { s := t.str start, end, hasExt := t.findTypeForKey(key) if start == end { if hasExt { b = b[2:] } t.str = fmt.Sprintf("%s-%s%s", s[:start], b, s[end:]) } else { t.str = fmt.Sprintf("%s%s%s", s[:start], value, s[end:]) } } return t, nil } // findKeyAndType returns the start and end position for the type corresponding // to key or the point at which to insert the key-value pair if the type // wasn't found. The hasExt return value reports whether an -u extension was present. // Note: the extensions are typically very small and are likely to contain // only one key-type pair. func (t Tag) findTypeForKey(key string) (start, end int, hasExt bool) { p := int(t.pExt) if len(key) != 2 || p == len(t.str) || p == 0 { return p, p, false } s := t.str // Find the correct extension. for p++; s[p] != 'u'; p++ { if s[p] > 'u' { p-- return p, p, false } if p = nextExtension(s, p); p == len(s) { return len(s), len(s), false } } // Proceed to the hyphen following the extension name. p++ // curKey is the key currently being processed. curKey := "" // Iterate over keys until we get the end of a section. for { // p points to the hyphen preceding the current token. if p3 := p + 3; s[p3] == '-' { // Found a key. // Check whether we just processed the key that was requested. if curKey == key { return start, p, true } // Set to the next key and continue scanning type tokens. curKey = s[p+1 : p3] if curKey > key { return p, p, true } // Start of the type token sequence. start = p + 4 // A type is at least 3 characters long. p += 7 // 4 + 3 } else { // Attribute or type, which is at least 3 characters long. p += 4 } // p points past the third character of a type or attribute. max := p + 5 // maximum length of token plus hyphen. if len(s) < max { max = len(s) } for ; p < max && s[p] != '-'; p++ { } // Bail if we have exhausted all tokens or if the next token starts // a new extension. if p == len(s) || s[p+2] == '-' { if curKey == key { return start, p, true } return p, p, true } } } // CompactIndex returns an index, where 0 <= index < NumCompactTags, for tags // for which data exists in the text repository. The index will change over time // and should not be stored in persistent storage. Extensions, except for the // 'va' type of the 'u' extension, are ignored. It will return 0, false if no // compact tag exists, where 0 is the index for the root language (Und). func CompactIndex(t Tag) (index int, ok bool) { // TODO: perhaps give more frequent tags a lower index. // TODO: we could make the indexes stable. This will excluded some // possibilities for optimization, so don't do this quite yet. b, s, r := t.Raw() if len(t.str) > 0 { if strings.HasPrefix(t.str, "x-") { // We have no entries for user-defined tags. return 0, false } if uint16(t.pVariant) != t.pExt { // There are no tags with variants and an u-va type. if t.TypeForKey("va") != "" { return 0, false } t, _ = Raw.Compose(b, s, r, t.Variants()) } else if _, ok := t.Extension('u'); ok { // Strip all but the 'va' entry. variant := t.TypeForKey("va") t, _ = Raw.Compose(b, s, r) t, _ = t.SetTypeForKey("va", variant) } if len(t.str) > 0 { // We have some variants. for i, s := range specialTags { if s == t { return i + 1, true } } return 0, false } } // No variants specified: just compare core components. // The key has the form lllssrrr, where l, s, and r are nibbles for // respectively the langID, scriptID, and regionID. key := uint32(b.langID) << (8 + 12) key |= uint32(s.scriptID) << 12 key |= uint32(r.regionID) x, ok := coreTags[key] return int(x), ok } // Base is an ISO 639 language code, used for encoding the base language // of a language tag. type Base struct { langID } // ParseBase parses a 2- or 3-letter ISO 639 code. // It returns a ValueError if s is a well-formed but unknown language identifier // or another error if another error occurred. func ParseBase(s string) (Base, error) { if n := len(s); n < 2 || 3 < n { return Base{}, errSyntax } var buf [3]byte l, err := getLangID(buf[:copy(buf[:], s)]) return Base{l}, err } // Script is a 4-letter ISO 15924 code for representing scripts. // It is idiomatically represented in title case. type Script struct { scriptID } // ParseScript parses a 4-letter ISO 15924 code. // It returns a ValueError if s is a well-formed but unknown script identifier // or another error if another error occurred. func ParseScript(s string) (Script, error) { if len(s) != 4 { return Script{}, errSyntax } var buf [4]byte sc, err := getScriptID(script, buf[:copy(buf[:], s)]) return Script{sc}, err } // Region is an ISO 3166-1 or UN M.49 code for representing countries and regions. type Region struct { regionID } // EncodeM49 returns the Region for the given UN M.49 code. // It returns an error if r is not a valid code. func EncodeM49(r int) (Region, error) { rid, err := getRegionM49(r) return Region{rid}, err } // ParseRegion parses a 2- or 3-letter ISO 3166-1 or a UN M.49 code. // It returns a ValueError if s is a well-formed but unknown region identifier // or another error if another error occurred. func ParseRegion(s string) (Region, error) { if n := len(s); n < 2 || 3 < n { return Region{}, errSyntax } var buf [3]byte r, err := getRegionID(buf[:copy(buf[:], s)]) return Region{r}, err } // IsCountry returns whether this region is a country or autonomous area. This // includes non-standard definitions from CLDR. func (r Region) IsCountry() bool { if r.regionID == 0 || r.IsGroup() || r.IsPrivateUse() && r.regionID != _XK { return false } return true } // IsGroup returns whether this region defines a collection of regions. This // includes non-standard definitions from CLDR. func (r Region) IsGroup() bool { if r.regionID == 0 { return false } return int(regionInclusion[r.regionID]) < len(regionContainment) } // Contains returns whether Region c is contained by Region r. It returns true // if c == r. func (r Region) Contains(c Region) bool { return r.regionID.contains(c.regionID) } func (r regionID) contains(c regionID) bool { if r == c { return true } g := regionInclusion[r] if g >= nRegionGroups { return false } m := regionContainment[g] d := regionInclusion[c] b := regionInclusionBits[d] // A contained country may belong to multiple disjoint groups. Matching any // of these indicates containment. If the contained region is a group, it // must strictly be a subset. if d >= nRegionGroups { return b&m != 0 } return b&^m == 0 } var errNoTLD = errors.New("language: region is not a valid ccTLD") // TLD returns the country code top-level domain (ccTLD). UK is returned for GB. // In all other cases it returns either the region itself or an error. // // This method may return an error for a region for which there exists a // canonical form with a ccTLD. To get that ccTLD canonicalize r first. The // region will already be canonicalized it was obtained from a Tag that was // obtained using any of the default methods. func (r Region) TLD() (Region, error) { // See http://en.wikipedia.org/wiki/Country_code_top-level_domain for the // difference between ISO 3166-1 and IANA ccTLD. if r.regionID == _GB { r = Region{_UK} } if (r.typ() & ccTLD) == 0 { return Region{}, errNoTLD } return r, nil } // Canonicalize returns the region or a possible replacement if the region is // deprecated. It will not return a replacement for deprecated regions that // are split into multiple regions. func (r Region) Canonicalize() Region { if cr := normRegion(r.regionID); cr != 0 { return Region{cr} } return r } // Variant represents a registered variant of a language as defined by BCP 47. type Variant struct { variant string } // ParseVariant parses and returns a Variant. An error is returned if s is not // a valid variant. func ParseVariant(s string) (Variant, error) { s = strings.ToLower(s) if _, ok := variantIndex[s]; ok { return Variant{s}, nil } return Variant{}, mkErrInvalid([]byte(s)) } // String returns the string representation of the variant. func (v Variant) String() string { return v.variant } ================================================ FILE: vendor/golang.org/x/text/language/lookup.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package language import ( "bytes" "fmt" "sort" "strconv" "golang.org/x/text/internal/tag" ) // findIndex tries to find the given tag in idx and returns a standardized error // if it could not be found. func findIndex(idx tag.Index, key []byte, form string) (index int, err error) { if !tag.FixCase(form, key) { return 0, errSyntax } i := idx.Index(key) if i == -1 { return 0, mkErrInvalid(key) } return i, nil } func searchUint(imap []uint16, key uint16) int { return sort.Search(len(imap), func(i int) bool { return imap[i] >= key }) } type langID uint16 // getLangID returns the langID of s if s is a canonical subtag // or langUnknown if s is not a canonical subtag. func getLangID(s []byte) (langID, error) { if len(s) == 2 { return getLangISO2(s) } return getLangISO3(s) } // mapLang returns the mapped langID of id according to mapping m. func normLang(id langID) (langID, langAliasType) { k := sort.Search(len(langAliasMap), func(i int) bool { return langAliasMap[i].from >= uint16(id) }) if k < len(langAliasMap) && langAliasMap[k].from == uint16(id) { return langID(langAliasMap[k].to), langAliasTypes[k] } return id, langAliasTypeUnknown } // getLangISO2 returns the langID for the given 2-letter ISO language code // or unknownLang if this does not exist. func getLangISO2(s []byte) (langID, error) { if !tag.FixCase("zz", s) { return 0, errSyntax } if i := lang.Index(s); i != -1 && lang.Elem(i)[3] != 0 { return langID(i), nil } return 0, mkErrInvalid(s) } const base = 'z' - 'a' + 1 func strToInt(s []byte) uint { v := uint(0) for i := 0; i < len(s); i++ { v *= base v += uint(s[i] - 'a') } return v } // converts the given integer to the original ASCII string passed to strToInt. // len(s) must match the number of characters obtained. func intToStr(v uint, s []byte) { for i := len(s) - 1; i >= 0; i-- { s[i] = byte(v%base) + 'a' v /= base } } // getLangISO3 returns the langID for the given 3-letter ISO language code // or unknownLang if this does not exist. func getLangISO3(s []byte) (langID, error) { if tag.FixCase("und", s) { // first try to match canonical 3-letter entries for i := lang.Index(s[:2]); i != -1; i = lang.Next(s[:2], i) { if e := lang.Elem(i); e[3] == 0 && e[2] == s[2] { // We treat "und" as special and always translate it to "unspecified". // Note that ZZ and Zzzz are private use and are not treated as // unspecified by default. id := langID(i) if id == nonCanonicalUnd { return 0, nil } return id, nil } } if i := altLangISO3.Index(s); i != -1 { return langID(altLangIndex[altLangISO3.Elem(i)[3]]), nil } n := strToInt(s) if langNoIndex[n/8]&(1<<(n%8)) != 0 { return langID(n) + langNoIndexOffset, nil } // Check for non-canonical uses of ISO3. for i := lang.Index(s[:1]); i != -1; i = lang.Next(s[:1], i) { if e := lang.Elem(i); e[2] == s[1] && e[3] == s[2] { return langID(i), nil } } return 0, mkErrInvalid(s) } return 0, errSyntax } // stringToBuf writes the string to b and returns the number of bytes // written. cap(b) must be >= 3. func (id langID) stringToBuf(b []byte) int { if id >= langNoIndexOffset { intToStr(uint(id)-langNoIndexOffset, b[:3]) return 3 } else if id == 0 { return copy(b, "und") } l := lang[id<<2:] if l[3] == 0 { return copy(b, l[:3]) } return copy(b, l[:2]) } // String returns the BCP 47 representation of the langID. // Use b as variable name, instead of id, to ensure the variable // used is consistent with that of Base in which this type is embedded. func (b langID) String() string { if b == 0 { return "und" } else if b >= langNoIndexOffset { b -= langNoIndexOffset buf := [3]byte{} intToStr(uint(b), buf[:]) return string(buf[:]) } l := lang.Elem(int(b)) if l[3] == 0 { return l[:3] } return l[:2] } // ISO3 returns the ISO 639-3 language code. func (b langID) ISO3() string { if b == 0 || b >= langNoIndexOffset { return b.String() } l := lang.Elem(int(b)) if l[3] == 0 { return l[:3] } else if l[2] == 0 { return altLangISO3.Elem(int(l[3]))[:3] } // This allocation will only happen for 3-letter ISO codes // that are non-canonical BCP 47 language identifiers. return l[0:1] + l[2:4] } // IsPrivateUse reports whether this language code is reserved for private use. func (b langID) IsPrivateUse() bool { return langPrivateStart <= b && b <= langPrivateEnd } type regionID uint16 // getRegionID returns the region id for s if s is a valid 2-letter region code // or unknownRegion. func getRegionID(s []byte) (regionID, error) { if len(s) == 3 { if isAlpha(s[0]) { return getRegionISO3(s) } if i, err := strconv.ParseUint(string(s), 10, 10); err == nil { return getRegionM49(int(i)) } } return getRegionISO2(s) } // getRegionISO2 returns the regionID for the given 2-letter ISO country code // or unknownRegion if this does not exist. func getRegionISO2(s []byte) (regionID, error) { i, err := findIndex(regionISO, s, "ZZ") if err != nil { return 0, err } return regionID(i) + isoRegionOffset, nil } // getRegionISO3 returns the regionID for the given 3-letter ISO country code // or unknownRegion if this does not exist. func getRegionISO3(s []byte) (regionID, error) { if tag.FixCase("ZZZ", s) { for i := regionISO.Index(s[:1]); i != -1; i = regionISO.Next(s[:1], i) { if e := regionISO.Elem(i); e[2] == s[1] && e[3] == s[2] { return regionID(i) + isoRegionOffset, nil } } for i := 0; i < len(altRegionISO3); i += 3 { if tag.Compare(altRegionISO3[i:i+3], s) == 0 { return regionID(altRegionIDs[i/3]), nil } } return 0, mkErrInvalid(s) } return 0, errSyntax } func getRegionM49(n int) (regionID, error) { if 0 < n && n <= 999 { const ( searchBits = 7 regionBits = 9 regionMask = 1<<regionBits - 1 ) idx := n >> searchBits buf := fromM49[m49Index[idx]:m49Index[idx+1]] val := uint16(n) << regionBits // we rely on bits shifting out i := sort.Search(len(buf), func(i int) bool { return buf[i] >= val }) if r := fromM49[int(m49Index[idx])+i]; r&^regionMask == val { return regionID(r & regionMask), nil } } var e ValueError fmt.Fprint(bytes.NewBuffer([]byte(e.v[:])), n) return 0, e } // normRegion returns a region if r is deprecated or 0 otherwise. // TODO: consider supporting BYS (-> BLR), CSK (-> 200 or CZ), PHI (-> PHL) and AFI (-> DJ). // TODO: consider mapping split up regions to new most populous one (like CLDR). func normRegion(r regionID) regionID { m := regionOldMap k := sort.Search(len(m), func(i int) bool { return m[i].from >= uint16(r) }) if k < len(m) && m[k].from == uint16(r) { return regionID(m[k].to) } return 0 } const ( iso3166UserAssigned = 1 << iota ccTLD bcp47Region ) func (r regionID) typ() byte { return regionTypes[r] } // String returns the BCP 47 representation for the region. // It returns "ZZ" for an unspecified region. func (r regionID) String() string { if r < isoRegionOffset { if r == 0 { return "ZZ" } return fmt.Sprintf("%03d", r.M49()) } r -= isoRegionOffset return regionISO.Elem(int(r))[:2] } // ISO3 returns the 3-letter ISO code of r. // Note that not all regions have a 3-letter ISO code. // In such cases this method returns "ZZZ". func (r regionID) ISO3() string { if r < isoRegionOffset { return "ZZZ" } r -= isoRegionOffset reg := regionISO.Elem(int(r)) switch reg[2] { case 0: return altRegionISO3[reg[3]:][:3] case ' ': return "ZZZ" } return reg[0:1] + reg[2:4] } // M49 returns the UN M.49 encoding of r, or 0 if this encoding // is not defined for r. func (r regionID) M49() int { return int(m49[r]) } // IsPrivateUse reports whether r has the ISO 3166 User-assigned status. This // may include private-use tags that are assigned by CLDR and used in this // implementation. So IsPrivateUse and IsCountry can be simultaneously true. func (r regionID) IsPrivateUse() bool { return r.typ()&iso3166UserAssigned != 0 } type scriptID uint8 // getScriptID returns the script id for string s. It assumes that s // is of the format [A-Z][a-z]{3}. func getScriptID(idx tag.Index, s []byte) (scriptID, error) { i, err := findIndex(idx, s, "Zzzz") return scriptID(i), err } // String returns the script code in title case. // It returns "Zzzz" for an unspecified script. func (s scriptID) String() string { if s == 0 { return "Zzzz" } return script.Elem(int(s)) } // IsPrivateUse reports whether this script code is reserved for private use. func (s scriptID) IsPrivateUse() bool { return _Qaaa <= s && s <= _Qabx } const ( maxAltTaglen = len("en-US-POSIX") maxLen = maxAltTaglen ) var ( // grandfatheredMap holds a mapping from legacy and grandfathered tags to // their base language or index to more elaborate tag. grandfatheredMap = map[[maxLen]byte]int16{ [maxLen]byte{'a', 'r', 't', '-', 'l', 'o', 'j', 'b', 'a', 'n'}: _jbo, // art-lojban [maxLen]byte{'i', '-', 'a', 'm', 'i'}: _ami, // i-ami [maxLen]byte{'i', '-', 'b', 'n', 'n'}: _bnn, // i-bnn [maxLen]byte{'i', '-', 'h', 'a', 'k'}: _hak, // i-hak [maxLen]byte{'i', '-', 'k', 'l', 'i', 'n', 'g', 'o', 'n'}: _tlh, // i-klingon [maxLen]byte{'i', '-', 'l', 'u', 'x'}: _lb, // i-lux [maxLen]byte{'i', '-', 'n', 'a', 'v', 'a', 'j', 'o'}: _nv, // i-navajo [maxLen]byte{'i', '-', 'p', 'w', 'n'}: _pwn, // i-pwn [maxLen]byte{'i', '-', 't', 'a', 'o'}: _tao, // i-tao [maxLen]byte{'i', '-', 't', 'a', 'y'}: _tay, // i-tay [maxLen]byte{'i', '-', 't', 's', 'u'}: _tsu, // i-tsu [maxLen]byte{'n', 'o', '-', 'b', 'o', 'k'}: _nb, // no-bok [maxLen]byte{'n', 'o', '-', 'n', 'y', 'n'}: _nn, // no-nyn [maxLen]byte{'s', 'g', 'n', '-', 'b', 'e', '-', 'f', 'r'}: _sfb, // sgn-BE-FR [maxLen]byte{'s', 'g', 'n', '-', 'b', 'e', '-', 'n', 'l'}: _vgt, // sgn-BE-NL [maxLen]byte{'s', 'g', 'n', '-', 'c', 'h', '-', 'd', 'e'}: _sgg, // sgn-CH-DE [maxLen]byte{'z', 'h', '-', 'g', 'u', 'o', 'y', 'u'}: _cmn, // zh-guoyu [maxLen]byte{'z', 'h', '-', 'h', 'a', 'k', 'k', 'a'}: _hak, // zh-hakka [maxLen]byte{'z', 'h', '-', 'm', 'i', 'n', '-', 'n', 'a', 'n'}: _nan, // zh-min-nan [maxLen]byte{'z', 'h', '-', 'x', 'i', 'a', 'n', 'g'}: _hsn, // zh-xiang // Grandfathered tags with no modern replacement will be converted as // follows: [maxLen]byte{'c', 'e', 'l', '-', 'g', 'a', 'u', 'l', 'i', 's', 'h'}: -1, // cel-gaulish [maxLen]byte{'e', 'n', '-', 'g', 'b', '-', 'o', 'e', 'd'}: -2, // en-GB-oed [maxLen]byte{'i', '-', 'd', 'e', 'f', 'a', 'u', 'l', 't'}: -3, // i-default [maxLen]byte{'i', '-', 'e', 'n', 'o', 'c', 'h', 'i', 'a', 'n'}: -4, // i-enochian [maxLen]byte{'i', '-', 'm', 'i', 'n', 'g', 'o'}: -5, // i-mingo [maxLen]byte{'z', 'h', '-', 'm', 'i', 'n'}: -6, // zh-min // CLDR-specific tag. [maxLen]byte{'r', 'o', 'o', 't'}: 0, // root [maxLen]byte{'e', 'n', '-', 'u', 's', '-', 'p', 'o', 's', 'i', 'x'}: -7, // en_US_POSIX" } altTagIndex = [...]uint8{0, 17, 31, 45, 61, 74, 86, 102} altTags = "xtg-x-cel-gaulishen-GB-oxendicten-x-i-defaultund-x-i-enochiansee-x-i-mingonan-x-zh-minen-US-u-va-posix" ) func grandfathered(s [maxAltTaglen]byte) (t Tag, ok bool) { if v, ok := grandfatheredMap[s]; ok { if v < 0 { return Make(altTags[altTagIndex[-v-1]:altTagIndex[-v]]), true } t.lang = langID(v) return t, true } return t, false } ================================================ FILE: vendor/golang.org/x/text/language/maketables.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build ignore // Language tag table generator. // Data read from the web. package main import ( "bufio" "flag" "fmt" "io" "io/ioutil" "log" "math" "reflect" "regexp" "sort" "strconv" "strings" "golang.org/x/text/internal/gen" "golang.org/x/text/internal/tag" "golang.org/x/text/unicode/cldr" ) var ( test = flag.Bool("test", false, "test existing tables; can be used to compare web data with package data.") outputFile = flag.String("output", "tables.go", "output file for generated tables") ) var comment = []string{ ` lang holds an alphabetically sorted list of ISO-639 language identifiers. All entries are 4 bytes. The index of the identifier (divided by 4) is the language tag. For 2-byte language identifiers, the two successive bytes have the following meaning: - if the first letter of the 2- and 3-letter ISO codes are the same: the second and third letter of the 3-letter ISO code. - otherwise: a 0 and a by 2 bits right-shifted index into altLangISO3. For 3-byte language identifiers the 4th byte is 0.`, ` langNoIndex is a bit vector of all 3-letter language codes that are not used as an index in lookup tables. The language ids for these language codes are derived directly from the letters and are not consecutive.`, ` altLangISO3 holds an alphabetically sorted list of 3-letter language code alternatives to 2-letter language codes that cannot be derived using the method described above. Each 3-letter code is followed by its 1-byte langID.`, ` altLangIndex is used to convert indexes in altLangISO3 to langIDs.`, ` langAliasMap maps langIDs to their suggested replacements.`, ` script is an alphabetically sorted list of ISO 15924 codes. The index of the script in the string, divided by 4, is the internal scriptID.`, ` isoRegionOffset needs to be added to the index of regionISO to obtain the regionID for 2-letter ISO codes. (The first isoRegionOffset regionIDs are reserved for the UN.M49 codes used for groups.)`, ` regionISO holds a list of alphabetically sorted 2-letter ISO region codes. Each 2-letter codes is followed by two bytes with the following meaning: - [A-Z}{2}: the first letter of the 2-letter code plus these two letters form the 3-letter ISO code. - 0, n: index into altRegionISO3.`, ` regionTypes defines the status of a region for various standards.`, ` m49 maps regionIDs to UN.M49 codes. The first isoRegionOffset entries are codes indicating collections of regions.`, ` m49Index gives indexes into fromM49 based on the three most significant bits of a 10-bit UN.M49 code. To search an UN.M49 code in fromM49, search in fromM49[m49Index[msb39(code)]:m49Index[msb3(code)+1]] for an entry where the first 7 bits match the 7 lsb of the UN.M49 code. The region code is stored in the 9 lsb of the indexed value.`, ` fromM49 contains entries to map UN.M49 codes to regions. See m49Index for details.`, ` altRegionISO3 holds a list of 3-letter region codes that cannot be mapped to 2-letter codes using the default algorithm. This is a short list.`, ` altRegionIDs holds a list of regionIDs the positions of which match those of the 3-letter ISO codes in altRegionISO3.`, ` variantNumSpecialized is the number of specialized variants in variants.`, ` suppressScript is an index from langID to the dominant script for that language, if it exists. If a script is given, it should be suppressed from the language tag.`, ` likelyLang is a lookup table, indexed by langID, for the most likely scripts and regions given incomplete information. If more entries exist for a given language, region and script are the index and size respectively of the list in likelyLangList.`, ` likelyLangList holds lists info associated with likelyLang.`, ` likelyRegion is a lookup table, indexed by regionID, for the most likely languages and scripts given incomplete information. If more entries exist for a given regionID, lang and script are the index and size respectively of the list in likelyRegionList. TODO: exclude containers and user-definable regions from the list.`, ` likelyRegionList holds lists info associated with likelyRegion.`, ` likelyScript is a lookup table, indexed by scriptID, for the most likely languages and regions given a script.`, ` matchLang holds pairs of langIDs of base languages that are typically mutually intelligible. Each pair is associated with a confidence and whether the intelligibility goes one or both ways.`, ` matchScript holds pairs of scriptIDs where readers of one script can typically also read the other. Each is associated with a confidence.`, ` nRegionGroups is the number of region groups.`, ` regionInclusion maps region identifiers to sets of regions in regionInclusionBits, where each set holds all groupings that are directly connected in a region containment graph.`, ` regionInclusionBits is an array of bit vectors where every vector represents a set of region groupings. These sets are used to compute the distance between two regions for the purpose of language matching.`, ` regionInclusionNext marks, for each entry in regionInclusionBits, the set of all groups that are reachable from the groups set in the respective entry.`, } // TODO: consider changing some of these structures to tries. This can reduce // memory, but may increase the need for memory allocations. This could be // mitigated if we can piggyback on language tags for common cases. func failOnError(e error) { if e != nil { log.Panic(e) } } type setType int const ( Indexed setType = 1 + iota // all elements must be of same size Linear ) type stringSet struct { s []string sorted, frozen bool // We often need to update values after the creation of an index is completed. // We include a convenience map for keeping track of this. update map[string]string typ setType // used for checking. } func (ss *stringSet) clone() stringSet { c := *ss c.s = append([]string(nil), c.s...) return c } func (ss *stringSet) setType(t setType) { if ss.typ != t && ss.typ != 0 { log.Panicf("type %d cannot be assigned as it was already %d", t, ss.typ) } } // parse parses a whitespace-separated string and initializes ss with its // components. func (ss *stringSet) parse(s string) { scan := bufio.NewScanner(strings.NewReader(s)) scan.Split(bufio.ScanWords) for scan.Scan() { ss.add(scan.Text()) } } func (ss *stringSet) assertChangeable() { if ss.frozen { log.Panic("attempt to modify a frozen stringSet") } } func (ss *stringSet) add(s string) { ss.assertChangeable() ss.s = append(ss.s, s) ss.sorted = ss.frozen } func (ss *stringSet) freeze() { ss.compact() ss.frozen = true } func (ss *stringSet) compact() { if ss.sorted { return } a := ss.s sort.Strings(a) k := 0 for i := 1; i < len(a); i++ { if a[k] != a[i] { a[k+1] = a[i] k++ } } ss.s = a[:k+1] ss.sorted = ss.frozen } type funcSorter struct { fn func(a, b string) bool sort.StringSlice } func (s funcSorter) Less(i, j int) bool { return s.fn(s.StringSlice[i], s.StringSlice[j]) } func (ss *stringSet) sortFunc(f func(a, b string) bool) { ss.compact() sort.Sort(funcSorter{f, sort.StringSlice(ss.s)}) } func (ss *stringSet) remove(s string) { ss.assertChangeable() if i, ok := ss.find(s); ok { copy(ss.s[i:], ss.s[i+1:]) ss.s = ss.s[:len(ss.s)-1] } } func (ss *stringSet) replace(ol, nu string) { ss.s[ss.index(ol)] = nu ss.sorted = ss.frozen } func (ss *stringSet) index(s string) int { ss.setType(Indexed) i, ok := ss.find(s) if !ok { if i < len(ss.s) { log.Panicf("find: item %q is not in list. Closest match is %q.", s, ss.s[i]) } log.Panicf("find: item %q is not in list", s) } return i } func (ss *stringSet) find(s string) (int, bool) { ss.compact() i := sort.SearchStrings(ss.s, s) return i, i != len(ss.s) && ss.s[i] == s } func (ss *stringSet) slice() []string { ss.compact() return ss.s } func (ss *stringSet) updateLater(v, key string) { if ss.update == nil { ss.update = map[string]string{} } ss.update[v] = key } // join joins the string and ensures that all entries are of the same length. func (ss *stringSet) join() string { ss.setType(Indexed) n := len(ss.s[0]) for _, s := range ss.s { if len(s) != n { log.Panicf("join: not all entries are of the same length: %q", s) } } ss.s = append(ss.s, strings.Repeat("\xff", n)) return strings.Join(ss.s, "") } // ianaEntry holds information for an entry in the IANA Language Subtag Repository. // All types use the same entry. // See http://tools.ietf.org/html/bcp47#section-5.1 for a description of the various // fields. type ianaEntry struct { typ string description []string scope string added string preferred string deprecated string suppressScript string macro string prefix []string } type builder struct { w *gen.CodeWriter hw io.Writer // MultiWriter for w and w.Hash data *cldr.CLDR supp *cldr.SupplementalData // indices locale stringSet // common locales lang stringSet // canonical language ids (2 or 3 letter ISO codes) with data langNoIndex stringSet // 3-letter ISO codes with no associated data script stringSet // 4-letter ISO codes region stringSet // 2-letter ISO or 3-digit UN M49 codes variant stringSet // 4-8-alphanumeric variant code. // Region codes that are groups with their corresponding group IDs. groups map[int]index // langInfo registry map[string]*ianaEntry } type index uint func newBuilder(w *gen.CodeWriter) *builder { r := gen.OpenCLDRCoreZip() defer r.Close() d := &cldr.Decoder{} data, err := d.DecodeZip(r) failOnError(err) b := builder{ w: w, hw: io.MultiWriter(w, w.Hash), data: data, supp: data.Supplemental(), } b.parseRegistry() return &b } func (b *builder) parseRegistry() { r := gen.OpenIANAFile("assignments/language-subtag-registry") defer r.Close() b.registry = make(map[string]*ianaEntry) scan := bufio.NewScanner(r) scan.Split(bufio.ScanWords) var record *ianaEntry for more := scan.Scan(); more; { key := scan.Text() more = scan.Scan() value := scan.Text() switch key { case "Type:": record = &ianaEntry{typ: value} case "Subtag:", "Tag:": if s := strings.SplitN(value, "..", 2); len(s) > 1 { for a := s[0]; a <= s[1]; a = inc(a) { b.addToRegistry(a, record) } } else { b.addToRegistry(value, record) } case "Suppress-Script:": record.suppressScript = value case "Added:": record.added = value case "Deprecated:": record.deprecated = value case "Macrolanguage:": record.macro = value case "Preferred-Value:": record.preferred = value case "Prefix:": record.prefix = append(record.prefix, value) case "Scope:": record.scope = value case "Description:": buf := []byte(value) for more = scan.Scan(); more; more = scan.Scan() { b := scan.Bytes() if b[0] == '%' || b[len(b)-1] == ':' { break } buf = append(buf, ' ') buf = append(buf, b...) } record.description = append(record.description, string(buf)) continue default: continue } more = scan.Scan() } if scan.Err() != nil { log.Panic(scan.Err()) } } func (b *builder) addToRegistry(key string, entry *ianaEntry) { if info, ok := b.registry[key]; ok { if info.typ != "language" || entry.typ != "extlang" { log.Fatalf("parseRegistry: tag %q already exists", key) } } else { b.registry[key] = entry } } var commentIndex = make(map[string]string) func init() { for _, s := range comment { key := strings.TrimSpace(strings.SplitN(s, " ", 2)[0]) commentIndex[key] = s } } func (b *builder) comment(name string) { if s := commentIndex[name]; len(s) > 0 { b.w.WriteComment(s) } else { fmt.Fprintln(b.w) } } func (b *builder) pf(f string, x ...interface{}) { fmt.Fprintf(b.hw, f, x...) fmt.Fprint(b.hw, "\n") } func (b *builder) p(x ...interface{}) { fmt.Fprintln(b.hw, x...) } func (b *builder) addSize(s int) { b.w.Size += s b.pf("// Size: %d bytes", s) } func (b *builder) writeConst(name string, x interface{}) { b.comment(name) b.w.WriteConst(name, x) } // writeConsts computes f(v) for all v in values and writes the results // as constants named _v to a single constant block. func (b *builder) writeConsts(f func(string) int, values ...string) { b.pf("const (") for _, v := range values { b.pf("\t_%s = %v", v, f(v)) } b.pf(")") } // writeType writes the type of the given value, which must be a struct. func (b *builder) writeType(value interface{}) { b.comment(reflect.TypeOf(value).Name()) b.w.WriteType(value) } func (b *builder) writeSlice(name string, ss interface{}) { b.writeSliceAddSize(name, 0, ss) } func (b *builder) writeSliceAddSize(name string, extraSize int, ss interface{}) { b.comment(name) b.w.Size += extraSize v := reflect.ValueOf(ss) t := v.Type().Elem() b.pf("// Size: %d bytes, %d elements", v.Len()*int(t.Size())+extraSize, v.Len()) fmt.Fprintf(b.w, "var %s = ", name) b.w.WriteArray(ss) b.p() } type fromTo struct { from, to uint16 } func (b *builder) writeSortedMap(name string, ss *stringSet, index func(s string) uint16) { ss.sortFunc(func(a, b string) bool { return index(a) < index(b) }) m := []fromTo{} for _, s := range ss.s { m = append(m, fromTo{index(s), index(ss.update[s])}) } b.writeSlice(name, m) } const base = 'z' - 'a' + 1 func strToInt(s string) uint { v := uint(0) for i := 0; i < len(s); i++ { v *= base v += uint(s[i] - 'a') } return v } // converts the given integer to the original ASCII string passed to strToInt. // len(s) must match the number of characters obtained. func intToStr(v uint, s []byte) { for i := len(s) - 1; i >= 0; i-- { s[i] = byte(v%base) + 'a' v /= base } } func (b *builder) writeBitVector(name string, ss []string) { vec := make([]uint8, int(math.Ceil(math.Pow(base, float64(len(ss[0])))/8))) for _, s := range ss { v := strToInt(s) vec[v/8] |= 1 << (v % 8) } b.writeSlice(name, vec) } // TODO: convert this type into a list or two-stage trie. func (b *builder) writeMapFunc(name string, m map[string]string, f func(string) uint16) { b.comment(name) v := reflect.ValueOf(m) sz := v.Len() * (2 + int(v.Type().Key().Size())) for _, k := range m { sz += len(k) } b.addSize(sz) keys := []string{} b.pf(`var %s = map[string]uint16{`, name) for k := range m { keys = append(keys, k) } sort.Strings(keys) for _, k := range keys { b.pf("\t%q: %v,", k, f(m[k])) } b.p("}") } func (b *builder) writeMap(name string, m interface{}) { b.comment(name) v := reflect.ValueOf(m) sz := v.Len() * (2 + int(v.Type().Key().Size()) + int(v.Type().Elem().Size())) b.addSize(sz) f := strings.FieldsFunc(fmt.Sprintf("%#v", m), func(r rune) bool { return strings.IndexRune("{}, ", r) != -1 }) sort.Strings(f[1:]) b.pf(`var %s = %s{`, name, f[0]) for _, kv := range f[1:] { b.pf("\t%s,", kv) } b.p("}") } func (b *builder) langIndex(s string) uint16 { if s == "und" { return 0 } if i, ok := b.lang.find(s); ok { return uint16(i) } return uint16(strToInt(s)) + uint16(len(b.lang.s)) } // inc advances the string to its lexicographical successor. func inc(s string) string { const maxTagLength = 4 var buf [maxTagLength]byte intToStr(strToInt(strings.ToLower(s))+1, buf[:len(s)]) for i := 0; i < len(s); i++ { if s[i] <= 'Z' { buf[i] -= 'a' - 'A' } } return string(buf[:len(s)]) } func (b *builder) parseIndices() { meta := b.supp.Metadata for k, v := range b.registry { var ss *stringSet switch v.typ { case "language": if len(k) == 2 || v.suppressScript != "" || v.scope == "special" { b.lang.add(k) continue } else { ss = &b.langNoIndex } case "region": ss = &b.region case "script": ss = &b.script case "variant": ss = &b.variant default: continue } ss.add(k) } // Include any language for which there is data. for _, lang := range b.data.Locales() { if x := b.data.RawLDML(lang); false || x.LocaleDisplayNames != nil || x.Characters != nil || x.Delimiters != nil || x.Measurement != nil || x.Dates != nil || x.Numbers != nil || x.Units != nil || x.ListPatterns != nil || x.Collations != nil || x.Segmentations != nil || x.Rbnf != nil || x.Annotations != nil || x.Metadata != nil { from := strings.Split(lang, "_") if lang := from[0]; lang != "root" { b.lang.add(lang) } } } // Include locales for plural rules, which uses a different structure. for _, plurals := range b.data.Supplemental().Plurals { for _, rules := range plurals.PluralRules { for _, lang := range strings.Split(rules.Locales, " ") { if lang = strings.Split(lang, "_")[0]; lang != "root" { b.lang.add(lang) } } } } // Include languages in likely subtags. for _, m := range b.supp.LikelySubtags.LikelySubtag { from := strings.Split(m.From, "_") b.lang.add(from[0]) } // Include ISO-639 alpha-3 bibliographic entries. for _, a := range meta.Alias.LanguageAlias { if a.Reason == "bibliographic" { b.langNoIndex.add(a.Type) } } // Include regions in territoryAlias (not all are in the IANA registry!) for _, reg := range b.supp.Metadata.Alias.TerritoryAlias { if len(reg.Type) == 2 { b.region.add(reg.Type) } } for _, s := range b.lang.s { if len(s) == 3 { b.langNoIndex.remove(s) } } b.writeConst("numLanguages", len(b.lang.slice())+len(b.langNoIndex.slice())) b.writeConst("numScripts", len(b.script.slice())) b.writeConst("numRegions", len(b.region.slice())) // Add dummy codes at the start of each list to represent "unspecified". b.lang.add("---") b.script.add("----") b.region.add("---") // common locales b.locale.parse(meta.DefaultContent.Locales) } // TODO: region inclusion data will probably not be use used in future matchers. func (b *builder) computeRegionGroups() { b.groups = make(map[int]index) // Create group indices. for i := 1; b.region.s[i][0] < 'A'; i++ { // Base M49 indices on regionID. b.groups[i] = index(len(b.groups)) } for _, g := range b.supp.TerritoryContainment.Group { // Skip UN and EURO zone as they are flattening the containment // relationship. if g.Type == "EZ" || g.Type == "UN" { continue } group := b.region.index(g.Type) if _, ok := b.groups[group]; !ok { b.groups[group] = index(len(b.groups)) } } if len(b.groups) > 32 { log.Fatalf("only 32 groups supported, found %d", len(b.groups)) } b.writeConst("nRegionGroups", len(b.groups)) } var langConsts = []string{ "af", "am", "ar", "az", "bg", "bn", "ca", "cs", "da", "de", "el", "en", "es", "et", "fa", "fi", "fil", "fr", "gu", "he", "hi", "hr", "hu", "hy", "id", "is", "it", "ja", "ka", "kk", "km", "kn", "ko", "ky", "lo", "lt", "lv", "mk", "ml", "mn", "mo", "mr", "ms", "mul", "my", "nb", "ne", "nl", "no", "pa", "pl", "pt", "ro", "ru", "sh", "si", "sk", "sl", "sq", "sr", "sv", "sw", "ta", "te", "th", "tl", "tn", "tr", "uk", "ur", "uz", "vi", "zh", "zu", // constants for grandfathered tags (if not already defined) "jbo", "ami", "bnn", "hak", "tlh", "lb", "nv", "pwn", "tao", "tay", "tsu", "nn", "sfb", "vgt", "sgg", "cmn", "nan", "hsn", } // writeLanguage generates all tables needed for language canonicalization. func (b *builder) writeLanguage() { meta := b.supp.Metadata b.writeConst("nonCanonicalUnd", b.lang.index("und")) b.writeConsts(func(s string) int { return int(b.langIndex(s)) }, langConsts...) b.writeConst("langPrivateStart", b.langIndex("qaa")) b.writeConst("langPrivateEnd", b.langIndex("qtz")) // Get language codes that need to be mapped (overlong 3-letter codes, // deprecated 2-letter codes, legacy and grandfathered tags.) langAliasMap := stringSet{} aliasTypeMap := map[string]langAliasType{} // altLangISO3 get the alternative ISO3 names that need to be mapped. altLangISO3 := stringSet{} // Add dummy start to avoid the use of index 0. altLangISO3.add("---") altLangISO3.updateLater("---", "aa") lang := b.lang.clone() for _, a := range meta.Alias.LanguageAlias { if a.Replacement == "" { a.Replacement = "und" } // TODO: support mapping to tags repl := strings.SplitN(a.Replacement, "_", 2)[0] if a.Reason == "overlong" { if len(a.Replacement) == 2 && len(a.Type) == 3 { lang.updateLater(a.Replacement, a.Type) } } else if len(a.Type) <= 3 { switch a.Reason { case "macrolanguage": aliasTypeMap[a.Type] = langMacro case "deprecated": // handled elsewhere continue case "bibliographic", "legacy": if a.Type == "no" { continue } aliasTypeMap[a.Type] = langLegacy default: log.Fatalf("new %s alias: %s", a.Reason, a.Type) } langAliasMap.add(a.Type) langAliasMap.updateLater(a.Type, repl) } } // Manually add the mapping of "nb" (Norwegian) to its macro language. // This can be removed if CLDR adopts this change. langAliasMap.add("nb") langAliasMap.updateLater("nb", "no") aliasTypeMap["nb"] = langMacro for k, v := range b.registry { // Also add deprecated values for 3-letter ISO codes, which CLDR omits. if v.typ == "language" && v.deprecated != "" && v.preferred != "" { langAliasMap.add(k) langAliasMap.updateLater(k, v.preferred) aliasTypeMap[k] = langDeprecated } } // Fix CLDR mappings. lang.updateLater("tl", "tgl") lang.updateLater("sh", "hbs") lang.updateLater("mo", "mol") lang.updateLater("no", "nor") lang.updateLater("tw", "twi") lang.updateLater("nb", "nob") lang.updateLater("ak", "aka") lang.updateLater("bh", "bih") // Ensure that each 2-letter code is matched with a 3-letter code. for _, v := range lang.s[1:] { s, ok := lang.update[v] if !ok { if s, ok = lang.update[langAliasMap.update[v]]; !ok { continue } lang.update[v] = s } if v[0] != s[0] { altLangISO3.add(s) altLangISO3.updateLater(s, v) } } // Complete canonialized language tags. lang.freeze() for i, v := range lang.s { // We can avoid these manual entries by using the IANI registry directly. // Seems easier to update the list manually, as changes are rare. // The panic in this loop will trigger if we miss an entry. add := "" if s, ok := lang.update[v]; ok { if s[0] == v[0] { add = s[1:] } else { add = string([]byte{0, byte(altLangISO3.index(s))}) } } else if len(v) == 3 { add = "\x00" } else { log.Panicf("no data for long form of %q", v) } lang.s[i] += add } b.writeConst("lang", tag.Index(lang.join())) b.writeConst("langNoIndexOffset", len(b.lang.s)) // space of all valid 3-letter language identifiers. b.writeBitVector("langNoIndex", b.langNoIndex.slice()) altLangIndex := []uint16{} for i, s := range altLangISO3.slice() { altLangISO3.s[i] += string([]byte{byte(len(altLangIndex))}) if i > 0 { idx := b.lang.index(altLangISO3.update[s]) altLangIndex = append(altLangIndex, uint16(idx)) } } b.writeConst("altLangISO3", tag.Index(altLangISO3.join())) b.writeSlice("altLangIndex", altLangIndex) b.writeSortedMap("langAliasMap", &langAliasMap, b.langIndex) types := make([]langAliasType, len(langAliasMap.s)) for i, s := range langAliasMap.s { types[i] = aliasTypeMap[s] } b.writeSlice("langAliasTypes", types) } var scriptConsts = []string{ "Latn", "Hani", "Hans", "Hant", "Qaaa", "Qaai", "Qabx", "Zinh", "Zyyy", "Zzzz", } func (b *builder) writeScript() { b.writeConsts(b.script.index, scriptConsts...) b.writeConst("script", tag.Index(b.script.join())) supp := make([]uint8, len(b.lang.slice())) for i, v := range b.lang.slice()[1:] { if sc := b.registry[v].suppressScript; sc != "" { supp[i+1] = uint8(b.script.index(sc)) } } b.writeSlice("suppressScript", supp) // There is only one deprecated script in CLDR. This value is hard-coded. // We check here if the code must be updated. for _, a := range b.supp.Metadata.Alias.ScriptAlias { if a.Type != "Qaai" { log.Panicf("unexpected deprecated stript %q", a.Type) } } } func parseM49(s string) int16 { if len(s) == 0 { return 0 } v, err := strconv.ParseUint(s, 10, 10) failOnError(err) return int16(v) } var regionConsts = []string{ "001", "419", "BR", "CA", "ES", "GB", "MD", "PT", "UK", "US", "ZZ", "XA", "XC", "XK", // Unofficial tag for Kosovo. } func (b *builder) writeRegion() { b.writeConsts(b.region.index, regionConsts...) isoOffset := b.region.index("AA") m49map := make([]int16, len(b.region.slice())) fromM49map := make(map[int16]int) altRegionISO3 := "" altRegionIDs := []uint16{} b.writeConst("isoRegionOffset", isoOffset) // 2-letter region lookup and mapping to numeric codes. regionISO := b.region.clone() regionISO.s = regionISO.s[isoOffset:] regionISO.sorted = false regionTypes := make([]byte, len(b.region.s)) // Is the region valid BCP 47? for s, e := range b.registry { if len(s) == 2 && s == strings.ToUpper(s) { i := b.region.index(s) for _, d := range e.description { if strings.Contains(d, "Private use") { regionTypes[i] = iso3166UserAssgined } } regionTypes[i] |= bcp47Region } } // Is the region a valid ccTLD? r := gen.OpenIANAFile("domains/root/db") defer r.Close() buf, err := ioutil.ReadAll(r) failOnError(err) re := regexp.MustCompile(`"/domains/root/db/([a-z]{2}).html"`) for _, m := range re.FindAllSubmatch(buf, -1) { i := b.region.index(strings.ToUpper(string(m[1]))) regionTypes[i] |= ccTLD } b.writeSlice("regionTypes", regionTypes) iso3Set := make(map[string]int) update := func(iso2, iso3 string) { i := regionISO.index(iso2) if j, ok := iso3Set[iso3]; !ok && iso3[0] == iso2[0] { regionISO.s[i] += iso3[1:] iso3Set[iso3] = -1 } else { if ok && j >= 0 { regionISO.s[i] += string([]byte{0, byte(j)}) } else { iso3Set[iso3] = len(altRegionISO3) regionISO.s[i] += string([]byte{0, byte(len(altRegionISO3))}) altRegionISO3 += iso3 altRegionIDs = append(altRegionIDs, uint16(isoOffset+i)) } } } for _, tc := range b.supp.CodeMappings.TerritoryCodes { i := regionISO.index(tc.Type) + isoOffset if d := m49map[i]; d != 0 { log.Panicf("%s found as a duplicate UN.M49 code of %03d", tc.Numeric, d) } m49 := parseM49(tc.Numeric) m49map[i] = m49 if r := fromM49map[m49]; r == 0 { fromM49map[m49] = i } else if r != i { dep := b.registry[regionISO.s[r-isoOffset]].deprecated if t := b.registry[tc.Type]; t != nil && dep != "" && (t.deprecated == "" || t.deprecated > dep) { fromM49map[m49] = i } } } for _, ta := range b.supp.Metadata.Alias.TerritoryAlias { if len(ta.Type) == 3 && ta.Type[0] <= '9' && len(ta.Replacement) == 2 { from := parseM49(ta.Type) if r := fromM49map[from]; r == 0 { fromM49map[from] = regionISO.index(ta.Replacement) + isoOffset } } } for _, tc := range b.supp.CodeMappings.TerritoryCodes { if len(tc.Alpha3) == 3 { update(tc.Type, tc.Alpha3) } } // This entries are not included in territoryCodes. Mostly 3-letter variants // of deleted codes and an entry for QU. for _, m := range []struct{ iso2, iso3 string }{ {"CT", "CTE"}, {"DY", "DHY"}, {"HV", "HVO"}, {"JT", "JTN"}, {"MI", "MID"}, {"NH", "NHB"}, {"NQ", "ATN"}, {"PC", "PCI"}, {"PU", "PUS"}, {"PZ", "PCZ"}, {"RH", "RHO"}, {"VD", "VDR"}, {"WK", "WAK"}, // These three-letter codes are used for others as well. {"FQ", "ATF"}, } { update(m.iso2, m.iso3) } for i, s := range regionISO.s { if len(s) != 4 { regionISO.s[i] = s + " " } } b.writeConst("regionISO", tag.Index(regionISO.join())) b.writeConst("altRegionISO3", altRegionISO3) b.writeSlice("altRegionIDs", altRegionIDs) // Create list of deprecated regions. // TODO: consider inserting SF -> FI. Not included by CLDR, but is the only // Transitionally-reserved mapping not included. regionOldMap := stringSet{} // Include regions in territoryAlias (not all are in the IANA registry!) for _, reg := range b.supp.Metadata.Alias.TerritoryAlias { if len(reg.Type) == 2 && reg.Reason == "deprecated" && len(reg.Replacement) == 2 { regionOldMap.add(reg.Type) regionOldMap.updateLater(reg.Type, reg.Replacement) i, _ := regionISO.find(reg.Type) j, _ := regionISO.find(reg.Replacement) if k := m49map[i+isoOffset]; k == 0 { m49map[i+isoOffset] = m49map[j+isoOffset] } } } b.writeSortedMap("regionOldMap", ®ionOldMap, func(s string) uint16 { return uint16(b.region.index(s)) }) // 3-digit region lookup, groupings. for i := 1; i < isoOffset; i++ { m := parseM49(b.region.s[i]) m49map[i] = m fromM49map[m] = i } b.writeSlice("m49", m49map) const ( searchBits = 7 regionBits = 9 ) if len(m49map) >= 1<<regionBits { log.Fatalf("Maximum number of regions exceeded: %d > %d", len(m49map), 1<<regionBits) } m49Index := [9]int16{} fromM49 := []uint16{} m49 := []int{} for k, _ := range fromM49map { m49 = append(m49, int(k)) } sort.Ints(m49) for _, k := range m49[1:] { val := (k & (1<<searchBits - 1)) << regionBits fromM49 = append(fromM49, uint16(val|fromM49map[int16(k)])) m49Index[1:][k>>searchBits] = int16(len(fromM49)) } b.writeSlice("m49Index", m49Index) b.writeSlice("fromM49", fromM49) } const ( // TODO: put these lists in regionTypes as user data? Could be used for // various optimizations and refinements and could be exposed in the API. iso3166Except = "AC CP DG EA EU FX IC SU TA UK" iso3166Trans = "AN BU CS NT TP YU ZR" // SF is not in our set of Regions. // DY and RH are actually not deleted, but indeterminately reserved. iso3166DelCLDR = "CT DD DY FQ HV JT MI NH NQ PC PU PZ RH VD WK YD" ) const ( iso3166UserAssgined = 1 << iota ccTLD bcp47Region ) func find(list []string, s string) int { for i, t := range list { if t == s { return i } } return -1 } // writeVariants generates per-variant information and creates a map from variant // name to index value. We assign index values such that sorting multiple // variants by index value will result in the correct order. // There are two types of variants: specialized and general. Specialized variants // are only applicable to certain language or language-script pairs. Generalized // variants apply to any language. Generalized variants always sort after // specialized variants. We will therefore always assign a higher index value // to a generalized variant than any other variant. Generalized variants are // sorted alphabetically among themselves. // Specialized variants may also sort after other specialized variants. Such // variants will be ordered after any of the variants they may follow. // We assume that if a variant x is followed by a variant y, then for any prefix // p of x, p-x is a prefix of y. This allows us to order tags based on the // maximum of the length of any of its prefixes. // TODO: it is possible to define a set of Prefix values on variants such that // a total order cannot be defined to the point that this algorithm breaks. // In other words, we cannot guarantee the same order of variants for the // future using the same algorithm or for non-compliant combinations of // variants. For this reason, consider using simple alphabetic sorting // of variants and ignore Prefix restrictions altogether. func (b *builder) writeVariant() { generalized := stringSet{} specialized := stringSet{} specializedExtend := stringSet{} // Collate the variants by type and check assumptions. for _, v := range b.variant.slice() { e := b.registry[v] if len(e.prefix) == 0 { generalized.add(v) continue } c := strings.Split(e.prefix[0], "-") hasScriptOrRegion := false if len(c) > 1 { _, hasScriptOrRegion = b.script.find(c[1]) if !hasScriptOrRegion { _, hasScriptOrRegion = b.region.find(c[1]) } } if len(c) == 1 || len(c) == 2 && hasScriptOrRegion { // Variant is preceded by a language. specialized.add(v) continue } // Variant is preceded by another variant. specializedExtend.add(v) prefix := c[0] + "-" if hasScriptOrRegion { prefix += c[1] } for _, p := range e.prefix { // Verify that the prefix minus the last element is a prefix of the // predecessor element. i := strings.LastIndex(p, "-") pred := b.registry[p[i+1:]] if find(pred.prefix, p[:i]) < 0 { log.Fatalf("prefix %q for variant %q not consistent with predecessor spec", p, v) } // The sorting used below does not work in the general case. It works // if we assume that variants that may be followed by others only have // prefixes of the same length. Verify this. count := strings.Count(p[:i], "-") for _, q := range pred.prefix { if c := strings.Count(q, "-"); c != count { log.Fatalf("variant %q preceding %q has a prefix %q of size %d; want %d", p[i+1:], v, q, c, count) } } if !strings.HasPrefix(p, prefix) { log.Fatalf("prefix %q of variant %q should start with %q", p, v, prefix) } } } // Sort extended variants. a := specializedExtend.s less := func(v, w string) bool { // Sort by the maximum number of elements. maxCount := func(s string) (max int) { for _, p := range b.registry[s].prefix { if c := strings.Count(p, "-"); c > max { max = c } } return } if cv, cw := maxCount(v), maxCount(w); cv != cw { return cv < cw } // Sort by name as tie breaker. return v < w } sort.Sort(funcSorter{less, sort.StringSlice(a)}) specializedExtend.frozen = true // Create index from variant name to index. variantIndex := make(map[string]uint8) add := func(s []string) { for _, v := range s { variantIndex[v] = uint8(len(variantIndex)) } } add(specialized.slice()) add(specializedExtend.s) numSpecialized := len(variantIndex) add(generalized.slice()) if n := len(variantIndex); n > 255 { log.Fatalf("maximum number of variants exceeded: was %d; want <= 255", n) } b.writeMap("variantIndex", variantIndex) b.writeConst("variantNumSpecialized", numSpecialized) } func (b *builder) writeLanguageInfo() { } // writeLikelyData writes tables that are used both for finding parent relations and for // language matching. Each entry contains additional bits to indicate the status of the // data to know when it cannot be used for parent relations. func (b *builder) writeLikelyData() { const ( isList = 1 << iota scriptInFrom regionInFrom ) type ( // generated types likelyScriptRegion struct { region uint16 script uint8 flags uint8 } likelyLangScript struct { lang uint16 script uint8 flags uint8 } likelyLangRegion struct { lang uint16 region uint16 } // likelyTag is used for getting likely tags for group regions, where // the likely region might be a region contained in the group. likelyTag struct { lang uint16 region uint16 script uint8 } ) var ( // generated variables likelyRegionGroup = make([]likelyTag, len(b.groups)) likelyLang = make([]likelyScriptRegion, len(b.lang.s)) likelyRegion = make([]likelyLangScript, len(b.region.s)) likelyScript = make([]likelyLangRegion, len(b.script.s)) likelyLangList = []likelyScriptRegion{} likelyRegionList = []likelyLangScript{} ) type fromTo struct { from, to []string } langToOther := map[int][]fromTo{} regionToOther := map[int][]fromTo{} for _, m := range b.supp.LikelySubtags.LikelySubtag { from := strings.Split(m.From, "_") to := strings.Split(m.To, "_") if len(to) != 3 { log.Fatalf("invalid number of subtags in %q: found %d, want 3", m.To, len(to)) } if len(from) > 3 { log.Fatalf("invalid number of subtags: found %d, want 1-3", len(from)) } if from[0] != to[0] && from[0] != "und" { log.Fatalf("unexpected language change in expansion: %s -> %s", from, to) } if len(from) == 3 { if from[2] != to[2] { log.Fatalf("unexpected region change in expansion: %s -> %s", from, to) } if from[0] != "und" { log.Fatalf("unexpected fully specified from tag: %s -> %s", from, to) } } if len(from) == 1 || from[0] != "und" { id := 0 if from[0] != "und" { id = b.lang.index(from[0]) } langToOther[id] = append(langToOther[id], fromTo{from, to}) } else if len(from) == 2 && len(from[1]) == 4 { sid := b.script.index(from[1]) likelyScript[sid].lang = uint16(b.langIndex(to[0])) likelyScript[sid].region = uint16(b.region.index(to[2])) } else { r := b.region.index(from[len(from)-1]) if id, ok := b.groups[r]; ok { if from[0] != "und" { log.Fatalf("region changed unexpectedly: %s -> %s", from, to) } likelyRegionGroup[id].lang = uint16(b.langIndex(to[0])) likelyRegionGroup[id].script = uint8(b.script.index(to[1])) likelyRegionGroup[id].region = uint16(b.region.index(to[2])) } else { regionToOther[r] = append(regionToOther[r], fromTo{from, to}) } } } b.writeType(likelyLangRegion{}) b.writeSlice("likelyScript", likelyScript) for id := range b.lang.s { list := langToOther[id] if len(list) == 1 { likelyLang[id].region = uint16(b.region.index(list[0].to[2])) likelyLang[id].script = uint8(b.script.index(list[0].to[1])) } else if len(list) > 1 { likelyLang[id].flags = isList likelyLang[id].region = uint16(len(likelyLangList)) likelyLang[id].script = uint8(len(list)) for _, x := range list { flags := uint8(0) if len(x.from) > 1 { if x.from[1] == x.to[2] { flags = regionInFrom } else { flags = scriptInFrom } } likelyLangList = append(likelyLangList, likelyScriptRegion{ region: uint16(b.region.index(x.to[2])), script: uint8(b.script.index(x.to[1])), flags: flags, }) } } } // TODO: merge suppressScript data with this table. b.writeType(likelyScriptRegion{}) b.writeSlice("likelyLang", likelyLang) b.writeSlice("likelyLangList", likelyLangList) for id := range b.region.s { list := regionToOther[id] if len(list) == 1 { likelyRegion[id].lang = uint16(b.langIndex(list[0].to[0])) likelyRegion[id].script = uint8(b.script.index(list[0].to[1])) if len(list[0].from) > 2 { likelyRegion[id].flags = scriptInFrom } } else if len(list) > 1 { likelyRegion[id].flags = isList likelyRegion[id].lang = uint16(len(likelyRegionList)) likelyRegion[id].script = uint8(len(list)) for i, x := range list { if len(x.from) == 2 && i != 0 || i > 0 && len(x.from) != 3 { log.Fatalf("unspecified script must be first in list: %v at %d", x.from, i) } x := likelyLangScript{ lang: uint16(b.langIndex(x.to[0])), script: uint8(b.script.index(x.to[1])), } if len(list[0].from) > 2 { x.flags = scriptInFrom } likelyRegionList = append(likelyRegionList, x) } } } b.writeType(likelyLangScript{}) b.writeSlice("likelyRegion", likelyRegion) b.writeSlice("likelyRegionList", likelyRegionList) b.writeType(likelyTag{}) b.writeSlice("likelyRegionGroup", likelyRegionGroup) } type mutualIntelligibility struct { want, have uint16 conf uint8 oneway bool } type scriptIntelligibility struct { lang uint16 // langID or 0 if * want, have uint8 conf uint8 } type sortByConf []mutualIntelligibility func (l sortByConf) Less(a, b int) bool { return l[a].conf > l[b].conf } func (l sortByConf) Swap(a, b int) { l[a], l[b] = l[b], l[a] } func (l sortByConf) Len() int { return len(l) } // toConf converts a percentage value [0, 100] to a confidence class. func toConf(pct uint8) uint8 { switch { case pct == 100: return 3 // Exact case pct >= 90: return 2 // High case pct > 50: return 1 // Low default: return 0 // No } } // writeMatchData writes tables with languages and scripts for which there is // mutual intelligibility. The data is based on CLDR's languageMatching data. // Note that we use a different algorithm than the one defined by CLDR and that // we slightly modify the data. For example, we convert scores to confidence levels. // We also drop all region-related data as we use a different algorithm to // determine region equivalence. func (b *builder) writeMatchData() { b.writeType(mutualIntelligibility{}) b.writeType(scriptIntelligibility{}) lm := b.supp.LanguageMatching.LanguageMatches cldr.MakeSlice(&lm).SelectAnyOf("type", "written") matchLang := []mutualIntelligibility{} matchScript := []scriptIntelligibility{} // Convert the languageMatch entries in lists keyed by desired language. for _, m := range lm[0].LanguageMatch { // Different versions of CLDR use different separators. desired := strings.Replace(m.Desired, "-", "_", -1) supported := strings.Replace(m.Supported, "-", "_", -1) d := strings.Split(desired, "_") s := strings.Split(supported, "_") if len(d) != len(s) || len(d) > 2 { // Skip all entries with regions and work around CLDR bug. continue } pct, _ := strconv.ParseInt(m.Percent, 10, 8) if len(d) == 2 && d[0] == s[0] && len(d[1]) == 4 { // language-script pair. lang := uint16(0) if d[0] != "*" { lang = uint16(b.langIndex(d[0])) } matchScript = append(matchScript, scriptIntelligibility{ lang: lang, want: uint8(b.script.index(d[1])), have: uint8(b.script.index(s[1])), conf: toConf(uint8(pct)), }) if m.Oneway != "true" { matchScript = append(matchScript, scriptIntelligibility{ lang: lang, want: uint8(b.script.index(s[1])), have: uint8(b.script.index(d[1])), conf: toConf(uint8(pct)), }) } } else if len(d) == 1 && d[0] != "*" { if pct == 100 { // nb == no is already handled by macro mapping. Check there // really is only this case. if d[0] != "no" || s[0] != "nb" { log.Fatalf("unhandled equivalence %s == %s", s[0], d[0]) } continue } matchLang = append(matchLang, mutualIntelligibility{ want: uint16(b.langIndex(d[0])), have: uint16(b.langIndex(s[0])), conf: uint8(pct), oneway: m.Oneway == "true", }) } else { // TODO: Handle other mappings. a := []string{"*;*", "*_*;*_*", "es_MX;es_419"} s := strings.Join([]string{desired, supported}, ";") if i := sort.SearchStrings(a, s); i == len(a) || a[i] != s { log.Printf("%q not handled", s) } } } sort.Stable(sortByConf(matchLang)) // collapse percentage into confidence classes for i, m := range matchLang { matchLang[i].conf = toConf(m.conf) } b.writeSlice("matchLang", matchLang) b.writeSlice("matchScript", matchScript) } func (b *builder) writeRegionInclusionData() { var ( // mm holds for each group the set of groups with a distance of 1. mm = make(map[int][]index) // containment holds for each group the transitive closure of // containment of other groups. containment = make(map[index][]index) ) for _, g := range b.supp.TerritoryContainment.Group { // Skip UN and EURO zone as they are flattening the containment // relationship. if g.Type == "EZ" || g.Type == "UN" { continue } group := b.region.index(g.Type) groupIdx := b.groups[group] for _, mem := range strings.Split(g.Contains, " ") { r := b.region.index(mem) mm[r] = append(mm[r], groupIdx) if g, ok := b.groups[r]; ok { mm[group] = append(mm[group], g) containment[groupIdx] = append(containment[groupIdx], g) } } } regionContainment := make([]uint32, len(b.groups)) for _, g := range b.groups { l := containment[g] // Compute the transitive closure of containment. for i := 0; i < len(l); i++ { l = append(l, containment[l[i]]...) } // Compute the bitmask. regionContainment[g] = 1 << g for _, v := range l { regionContainment[g] |= 1 << v } // log.Printf("%d: %X", g, regionContainment[g]) } b.writeSlice("regionContainment", regionContainment) regionInclusion := make([]uint8, len(b.region.s)) bvs := make(map[uint32]index) // Make the first bitvector positions correspond with the groups. for r, i := range b.groups { bv := uint32(1 << i) for _, g := range mm[r] { bv |= 1 << g } bvs[bv] = i regionInclusion[r] = uint8(bvs[bv]) } for r := 1; r < len(b.region.s); r++ { if _, ok := b.groups[r]; !ok { bv := uint32(0) for _, g := range mm[r] { bv |= 1 << g } if bv == 0 { // Pick the world for unspecified regions. bv = 1 << b.groups[b.region.index("001")] } if _, ok := bvs[bv]; !ok { bvs[bv] = index(len(bvs)) } regionInclusion[r] = uint8(bvs[bv]) } } b.writeSlice("regionInclusion", regionInclusion) regionInclusionBits := make([]uint32, len(bvs)) for k, v := range bvs { regionInclusionBits[v] = uint32(k) } // Add bit vectors for increasingly large distances until a fixed point is reached. regionInclusionNext := []uint8{} for i := 0; i < len(regionInclusionBits); i++ { bits := regionInclusionBits[i] next := bits for i := uint(0); i < uint(len(b.groups)); i++ { if bits&(1<<i) != 0 { next |= regionInclusionBits[i] } } if _, ok := bvs[next]; !ok { bvs[next] = index(len(bvs)) regionInclusionBits = append(regionInclusionBits, next) } regionInclusionNext = append(regionInclusionNext, uint8(bvs[next])) } b.writeSlice("regionInclusionBits", regionInclusionBits) b.writeSlice("regionInclusionNext", regionInclusionNext) } type parentRel struct { lang uint16 script uint8 maxScript uint8 toRegion uint16 fromRegion []uint16 } func (b *builder) writeParents() { b.writeType(parentRel{}) parents := []parentRel{} // Construct parent overrides. n := 0 for _, p := range b.data.Supplemental().ParentLocales.ParentLocale { // Skipping non-standard scripts to root is implemented using addTags. if p.Parent == "root" { continue } sub := strings.Split(p.Parent, "_") parent := parentRel{lang: b.langIndex(sub[0])} if len(sub) == 2 { // TODO: check that all undefined scripts are indeed Latn in these // cases. parent.maxScript = uint8(b.script.index("Latn")) parent.toRegion = uint16(b.region.index(sub[1])) } else { parent.script = uint8(b.script.index(sub[1])) parent.maxScript = parent.script parent.toRegion = uint16(b.region.index(sub[2])) } for _, c := range strings.Split(p.Locales, " ") { region := b.region.index(c[strings.LastIndex(c, "_")+1:]) parent.fromRegion = append(parent.fromRegion, uint16(region)) } parents = append(parents, parent) n += len(parent.fromRegion) } b.writeSliceAddSize("parents", n*2, parents) } func main() { gen.Init() gen.Repackage("gen_common.go", "common.go", "language") w := gen.NewCodeWriter() defer w.WriteGoFile("tables.go", "language") fmt.Fprintln(w, `import "golang.org/x/text/internal/tag"`) b := newBuilder(w) gen.WriteCLDRVersion(w) b.parseIndices() b.writeType(fromTo{}) b.writeLanguage() b.writeScript() b.writeRegion() b.writeVariant() // TODO: b.writeLocale() b.computeRegionGroups() b.writeLikelyData() b.writeMatchData() b.writeRegionInclusionData() b.writeParents() } ================================================ FILE: vendor/golang.org/x/text/language/match.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package language import "errors" // Matcher is the interface that wraps the Match method. // // Match returns the best match for any of the given tags, along with // a unique index associated with the returned tag and a confidence // score. type Matcher interface { Match(t ...Tag) (tag Tag, index int, c Confidence) } // Comprehends reports the confidence score for a speaker of a given language // to being able to comprehend the written form of an alternative language. func Comprehends(speaker, alternative Tag) Confidence { _, _, c := NewMatcher([]Tag{alternative}).Match(speaker) return c } // NewMatcher returns a Matcher that matches an ordered list of preferred tags // against a list of supported tags based on written intelligibility, closeness // of dialect, equivalence of subtags and various other rules. It is initialized // with the list of supported tags. The first element is used as the default // value in case no match is found. // // Its Match method matches the first of the given Tags to reach a certain // confidence threshold. The tags passed to Match should therefore be specified // in order of preference. Extensions are ignored for matching. // // The index returned by the Match method corresponds to the index of the // matched tag in t, but is augmented with the Unicode extension ('u')of the // corresponding preferred tag. This allows user locale options to be passed // transparently. func NewMatcher(t []Tag) Matcher { return newMatcher(t) } func (m *matcher) Match(want ...Tag) (t Tag, index int, c Confidence) { match, w, c := m.getBest(want...) if match == nil { t = m.default_.tag } else { t, index = match.tag, match.index } // Copy options from the user-provided tag into the result tag. This is hard // to do after the fact, so we do it here. // TODO: consider also adding in variants that are compatible with the // matched language. // TODO: Add back region if it is non-ambiguous? Or create another tag to // preserve the region? if u, ok := w.Extension('u'); ok { t, _ = Raw.Compose(t, u) } return t, index, c } type scriptRegionFlags uint8 const ( isList = 1 << iota scriptInFrom regionInFrom ) func (t *Tag) setUndefinedLang(id langID) { if t.lang == 0 { t.lang = id } } func (t *Tag) setUndefinedScript(id scriptID) { if t.script == 0 { t.script = id } } func (t *Tag) setUndefinedRegion(id regionID) { if t.region == 0 || t.region.contains(id) { t.region = id } } // ErrMissingLikelyTagsData indicates no information was available // to compute likely values of missing tags. var ErrMissingLikelyTagsData = errors.New("missing likely tags data") // addLikelySubtags sets subtags to their most likely value, given the locale. // In most cases this means setting fields for unknown values, but in some // cases it may alter a value. It returns a ErrMissingLikelyTagsData error // if the given locale cannot be expanded. func (t Tag) addLikelySubtags() (Tag, error) { id, err := addTags(t) if err != nil { return t, err } else if id.equalTags(t) { return t, nil } id.remakeString() return id, nil } // specializeRegion attempts to specialize a group region. func specializeRegion(t *Tag) bool { if i := regionInclusion[t.region]; i < nRegionGroups { x := likelyRegionGroup[i] if langID(x.lang) == t.lang && scriptID(x.script) == t.script { t.region = regionID(x.region) } return true } return false } func addTags(t Tag) (Tag, error) { // We leave private use identifiers alone. if t.private() { return t, nil } if t.script != 0 && t.region != 0 { if t.lang != 0 { // already fully specified specializeRegion(&t) return t, nil } // Search matches for und-script-region. Note that for these cases // region will never be a group so there is no need to check for this. list := likelyRegion[t.region : t.region+1] if x := list[0]; x.flags&isList != 0 { list = likelyRegionList[x.lang : x.lang+uint16(x.script)] } for _, x := range list { // Deviating from the spec. See match_test.go for details. if scriptID(x.script) == t.script { t.setUndefinedLang(langID(x.lang)) return t, nil } } } if t.lang != 0 { // Search matches for lang-script and lang-region, where lang != und. if t.lang < langNoIndexOffset { x := likelyLang[t.lang] if x.flags&isList != 0 { list := likelyLangList[x.region : x.region+uint16(x.script)] if t.script != 0 { for _, x := range list { if scriptID(x.script) == t.script && x.flags&scriptInFrom != 0 { t.setUndefinedRegion(regionID(x.region)) return t, nil } } } else if t.region != 0 { count := 0 goodScript := true tt := t for _, x := range list { // We visit all entries for which the script was not // defined, including the ones where the region was not // defined. This allows for proper disambiguation within // regions. if x.flags&scriptInFrom == 0 && t.region.contains(regionID(x.region)) { tt.region = regionID(x.region) tt.setUndefinedScript(scriptID(x.script)) goodScript = goodScript && tt.script == scriptID(x.script) count++ } } if count == 1 { return tt, nil } // Even if we fail to find a unique Region, we might have // an unambiguous script. if goodScript { t.script = tt.script } } } } } else { // Search matches for und-script. if t.script != 0 { x := likelyScript[t.script] if x.region != 0 { t.setUndefinedRegion(regionID(x.region)) t.setUndefinedLang(langID(x.lang)) return t, nil } } // Search matches for und-region. If und-script-region exists, it would // have been found earlier. if t.region != 0 { if i := regionInclusion[t.region]; i < nRegionGroups { x := likelyRegionGroup[i] if x.region != 0 { t.setUndefinedLang(langID(x.lang)) t.setUndefinedScript(scriptID(x.script)) t.region = regionID(x.region) } } else { x := likelyRegion[t.region] if x.flags&isList != 0 { x = likelyRegionList[x.lang] } if x.script != 0 && x.flags != scriptInFrom { t.setUndefinedLang(langID(x.lang)) t.setUndefinedScript(scriptID(x.script)) return t, nil } } } } // Search matches for lang. if t.lang < langNoIndexOffset { x := likelyLang[t.lang] if x.flags&isList != 0 { x = likelyLangList[x.region] } if x.region != 0 { t.setUndefinedScript(scriptID(x.script)) t.setUndefinedRegion(regionID(x.region)) } specializeRegion(&t) if t.lang == 0 { t.lang = _en // default language } return t, nil } return t, ErrMissingLikelyTagsData } func (t *Tag) setTagsFrom(id Tag) { t.lang = id.lang t.script = id.script t.region = id.region } // minimize removes the region or script subtags from t such that // t.addLikelySubtags() == t.minimize().addLikelySubtags(). func (t Tag) minimize() (Tag, error) { t, err := minimizeTags(t) if err != nil { return t, err } t.remakeString() return t, nil } // minimizeTags mimics the behavior of the ICU 51 C implementation. func minimizeTags(t Tag) (Tag, error) { if t.equalTags(und) { return t, nil } max, err := addTags(t) if err != nil { return t, err } for _, id := range [...]Tag{ {lang: t.lang}, {lang: t.lang, region: t.region}, {lang: t.lang, script: t.script}, } { if x, err := addTags(id); err == nil && max.equalTags(x) { t.setTagsFrom(id) break } } return t, nil } // Tag Matching // CLDR defines an algorithm for finding the best match between two sets of language // tags. The basic algorithm defines how to score a possible match and then find // the match with the best score // (see http://www.unicode.org/reports/tr35/#LanguageMatching). // Using scoring has several disadvantages. The scoring obfuscates the importance of // the various factors considered, making the algorithm harder to understand. Using // scoring also requires the full score to be computed for each pair of tags. // // We will use a different algorithm which aims to have the following properties: // - clarity on the precedence of the various selection factors, and // - improved performance by allowing early termination of a comparison. // // Matching algorithm (overview) // Input: // - supported: a set of supported tags // - default: the default tag to return in case there is no match // - desired: list of desired tags, ordered by preference, starting with // the most-preferred. // // Algorithm: // 1) Set the best match to the lowest confidence level // 2) For each tag in "desired": // a) For each tag in "supported": // 1) compute the match between the two tags. // 2) if the match is better than the previous best match, replace it // with the new match. (see next section) // b) if the current best match is above a certain threshold, return this // match without proceeding to the next tag in "desired". [See Note 1] // 3) If the best match so far is below a certain threshold, return "default". // // Ranking: // We use two phases to determine whether one pair of tags are a better match // than another pair of tags. First, we determine a rough confidence level. If the // levels are different, the one with the highest confidence wins. // Second, if the rough confidence levels are identical, we use a set of tie-breaker // rules. // // The confidence level of matching a pair of tags is determined by finding the // lowest confidence level of any matches of the corresponding subtags (the // result is deemed as good as its weakest link). // We define the following levels: // Exact - An exact match of a subtag, before adding likely subtags. // MaxExact - An exact match of a subtag, after adding likely subtags. // [See Note 2]. // High - High level of mutual intelligibility between different subtag // variants. // Low - Low level of mutual intelligibility between different subtag // variants. // No - No mutual intelligibility. // // The following levels can occur for each type of subtag: // Base: Exact, MaxExact, High, Low, No // Script: Exact, MaxExact [see Note 3], Low, No // Region: Exact, MaxExact, High // Variant: Exact, High // Private: Exact, No // // Any result with a confidence level of Low or higher is deemed a possible match. // Once a desired tag matches any of the supported tags with a level of MaxExact // or higher, the next desired tag is not considered (see Step 2.b). // Note that CLDR provides languageMatching data that defines close equivalence // classes for base languages, scripts and regions. // // Tie-breaking // If we get the same confidence level for two matches, we apply a sequence of // tie-breaking rules. The first that succeeds defines the result. The rules are // applied in the following order. // 1) Original language was defined and was identical. // 2) Original region was defined and was identical. // 3) Distance between two maximized regions was the smallest. // 4) Original script was defined and was identical. // 5) Distance from want tag to have tag using the parent relation [see Note 5.] // If there is still no winner after these rules are applied, the first match // found wins. // // Notes: // [1] Note that even if we may not have a perfect match, if a match is above a // certain threshold, it is considered a better match than any other match // to a tag later in the list of preferred language tags. // [2] In practice, as matching of Exact is done in a separate phase from // matching the other levels, we reuse the Exact level to mean MaxExact in // the second phase. As a consequence, we only need the levels defined by // the Confidence type. The MaxExact confidence level is mapped to High in // the public API. // [3] We do not differentiate between maximized script values that were derived // from suppressScript versus most likely tag data. We determined that in // ranking the two, one ranks just after the other. Moreover, the two cannot // occur concurrently. As a consequence, they are identical for practical // purposes. // [4] In case of deprecated, macro-equivalents and legacy mappings, we assign // the MaxExact level to allow iw vs he to still be a closer match than // en-AU vs en-US, for example. // [5] In CLDR a locale inherits fields that are unspecified for this locale // from its parent. Therefore, if a locale is a parent of another locale, // it is a strong measure for closeness, especially when no other tie // breaker rule applies. One could also argue it is inconsistent, for // example, when pt-AO matches pt (which CLDR equates with pt-BR), even // though its parent is pt-PT according to the inheritance rules. // // Implementation Details: // There are several performance considerations worth pointing out. Most notably, // we preprocess as much as possible (within reason) at the time of creation of a // matcher. This includes: // - creating a per-language map, which includes data for the raw base language // and its canonicalized variant (if applicable), // - expanding entries for the equivalence classes defined in CLDR's // languageMatch data. // The per-language map ensures that typically only a very small number of tags // need to be considered. The pre-expansion of canonicalized subtags and // equivalence classes reduces the amount of map lookups that need to be done at // runtime. // matcher keeps a set of supported language tags, indexed by language. type matcher struct { default_ *haveTag index map[langID]*matchHeader passSettings bool } // matchHeader has the lists of tags for exact matches and matches based on // maximized and canonicalized tags for a given language. type matchHeader struct { exact []*haveTag max []*haveTag } // haveTag holds a supported Tag and its maximized script and region. The maximized // or canonicalized language is not stored as it is not needed during matching. type haveTag struct { tag Tag // index of this tag in the original list of supported tags. index int // conf is the maximum confidence that can result from matching this haveTag. // When conf < Exact this means it was inserted after applying a CLDR equivalence rule. conf Confidence // Maximized region and script. maxRegion regionID maxScript scriptID // altScript may be checked as an alternative match to maxScript. If altScript // matches, the confidence level for this match is Low. Theoretically there // could be multiple alternative scripts. This does not occur in practice. altScript scriptID // nextMax is the index of the next haveTag with the same maximized tags. nextMax uint16 } func makeHaveTag(tag Tag, index int) (haveTag, langID) { max := tag if tag.lang != 0 { max, _ = max.canonicalize(All) max, _ = addTags(max) max.remakeString() } return haveTag{tag, index, Exact, max.region, max.script, altScript(max.lang, max.script), 0}, max.lang } // altScript returns an alternative script that may match the given script with // a low confidence. At the moment, the langMatch data allows for at most one // script to map to another and we rely on this to keep the code simple. func altScript(l langID, s scriptID) scriptID { for _, alt := range matchScript { if (alt.lang == 0 || langID(alt.lang) == l) && scriptID(alt.have) == s { return scriptID(alt.want) } } return 0 } // addIfNew adds a haveTag to the list of tags only if it is a unique tag. // Tags that have the same maximized values are linked by index. func (h *matchHeader) addIfNew(n haveTag, exact bool) { // Don't add new exact matches. for _, v := range h.exact { if v.tag.equalsRest(n.tag) { return } } if exact { h.exact = append(h.exact, &n) } // Allow duplicate maximized tags, but create a linked list to allow quickly // comparing the equivalents and bail out. for i, v := range h.max { if v.maxScript == n.maxScript && v.maxRegion == n.maxRegion && v.tag.variantOrPrivateTagStr() == n.tag.variantOrPrivateTagStr() { for h.max[i].nextMax != 0 { i = int(h.max[i].nextMax) } h.max[i].nextMax = uint16(len(h.max)) break } } h.max = append(h.max, &n) } // header returns the matchHeader for the given language. It creates one if // it doesn't already exist. func (m *matcher) header(l langID) *matchHeader { if h := m.index[l]; h != nil { return h } h := &matchHeader{} m.index[l] = h return h } // newMatcher builds an index for the given supported tags and returns it as // a matcher. It also expands the index by considering various equivalence classes // for a given tag. func newMatcher(supported []Tag) *matcher { m := &matcher{ index: make(map[langID]*matchHeader), } if len(supported) == 0 { m.default_ = &haveTag{} return m } // Add supported languages to the index. Add exact matches first to give // them precedence. for i, tag := range supported { pair, _ := makeHaveTag(tag, i) m.header(tag.lang).addIfNew(pair, true) } m.default_ = m.header(supported[0].lang).exact[0] for i, tag := range supported { pair, max := makeHaveTag(tag, i) if max != tag.lang { m.header(max).addIfNew(pair, false) } } // update is used to add indexes in the map for equivalent languages. // If force is true, the update will also apply to derived entries. To // avoid applying a "transitive closure", use false. update := func(want, have uint16, conf Confidence, force bool) { if hh := m.index[langID(have)]; hh != nil { if !force && len(hh.exact) == 0 { return } hw := m.header(langID(want)) for _, ht := range hh.max { v := *ht if conf < v.conf { v.conf = conf } v.nextMax = 0 // this value needs to be recomputed if v.altScript != 0 { v.altScript = altScript(langID(want), v.maxScript) } hw.addIfNew(v, conf == Exact && len(hh.exact) > 0) } } } // Add entries for languages with mutual intelligibility as defined by CLDR's // languageMatch data. for _, ml := range matchLang { update(ml.want, ml.have, Confidence(ml.conf), false) if !ml.oneway { update(ml.have, ml.want, Confidence(ml.conf), false) } } // Add entries for possible canonicalizations. This is an optimization to // ensure that only one map lookup needs to be done at runtime per desired tag. // First we match deprecated equivalents. If they are perfect equivalents // (their canonicalization simply substitutes a different language code, but // nothing else), the match confidence is Exact, otherwise it is High. for i, lm := range langAliasMap { if lm.from == _sh { continue } // If deprecated codes match and there is no fiddling with the script or // or region, we consider it an exact match. conf := Exact if langAliasTypes[i] != langMacro { if !isExactEquivalent(langID(lm.from)) { conf = High } update(lm.to, lm.from, conf, true) } update(lm.from, lm.to, conf, true) } return m } // getBest gets the best matching tag in m for any of the given tags, taking into // account the order of preference of the given tags. func (m *matcher) getBest(want ...Tag) (got *haveTag, orig Tag, c Confidence) { best := bestMatch{} for _, w := range want { var max Tag // Check for exact match first. h := m.index[w.lang] if w.lang != 0 { // Base language is defined. if h == nil { continue } for i := range h.exact { have := h.exact[i] if have.tag.equalsRest(w) { return have, w, Exact } } max, _ = w.canonicalize(Legacy | Deprecated) max, _ = addTags(max) } else { // Base language is not defined. if h != nil { for i := range h.exact { have := h.exact[i] if have.tag.equalsRest(w) { return have, w, Exact } } } if w.script == 0 && w.region == 0 { // We skip all tags matching und for approximate matching, including // private tags. continue } max, _ = addTags(w) if h = m.index[max.lang]; h == nil { continue } } // Check for match based on maximized tag. for i := range h.max { have := h.max[i] best.update(have, w, max.script, max.region) if best.conf == Exact { for have.nextMax != 0 { have = h.max[have.nextMax] best.update(have, w, max.script, max.region) } return best.have, best.want, High } } } if best.conf <= No { if len(want) != 0 { return nil, want[0], No } return nil, Tag{}, No } return best.have, best.want, best.conf } // bestMatch accumulates the best match so far. type bestMatch struct { have *haveTag want Tag conf Confidence // Cached results from applying tie-breaking rules. origLang bool origReg bool regDist uint8 origScript bool parentDist uint8 // 255 if have is not an ancestor of want tag. } // update updates the existing best match if the new pair is considered to be a // better match. // To determine if the given pair is a better match, it first computes the rough // confidence level. If this surpasses the current match, it will replace it and // update the tie-breaker rule cache. If there is a tie, it proceeds with applying // a series of tie-breaker rules. If there is no conclusive winner after applying // the tie-breaker rules, it leaves the current match as the preferred match. func (m *bestMatch) update(have *haveTag, tag Tag, maxScript scriptID, maxRegion regionID) { // Bail if the maximum attainable confidence is below that of the current best match. c := have.conf if c < m.conf { return } if have.maxScript != maxScript { // There is usually very little comprehension between different scripts. // In a few cases there may still be Low comprehension. This possibility is // pre-computed and stored in have.altScript. if Low < m.conf || have.altScript != maxScript { return } c = Low } else if have.maxRegion != maxRegion { // There is usually a small difference between languages across regions. // We use the region distance (below) to disambiguate between equal matches. if High < c { c = High } } // We store the results of the computations of the tie-breaker rules along // with the best match. There is no need to do the checks once we determine // we have a winner, but we do still need to do the tie-breaker computations. // We use "beaten" to keep track if we still need to do the checks. beaten := false // true if the new pair defeats the current one. if c != m.conf { if c < m.conf { return } beaten = true } // Tie-breaker rules: // We prefer if the pre-maximized language was specified and identical. origLang := have.tag.lang == tag.lang && tag.lang != 0 if !beaten && m.origLang != origLang { if m.origLang { return } beaten = true } // We prefer if the pre-maximized region was specified and identical. origReg := have.tag.region == tag.region && tag.region != 0 if !beaten && m.origReg != origReg { if m.origReg { return } beaten = true } // Next we prefer smaller distances between regions, as defined by regionDist. regDist := regionDist(have.maxRegion, maxRegion, tag.lang) if !beaten && m.regDist != regDist { if regDist > m.regDist { return } beaten = true } // Next we prefer if the pre-maximized script was specified and identical. origScript := have.tag.script == tag.script && tag.script != 0 if !beaten && m.origScript != origScript { if m.origScript { return } beaten = true } // Finally we prefer tags which have a closer parent relationship. parentDist := parentDistance(have.tag.region, tag) if !beaten && m.parentDist != parentDist { if parentDist > m.parentDist { return } beaten = true } // Update m to the newly found best match. if beaten { m.have = have m.want = tag m.conf = c m.origLang = origLang m.origReg = origReg m.origScript = origScript m.regDist = regDist m.parentDist = parentDist } } // parentDistance returns the number of times Parent must be called before the // regions match. It is assumed that it has already been checked that lang and // script are identical. If haveRegion does not occur in the ancestor chain of // tag, it returns 255. func parentDistance(haveRegion regionID, tag Tag) uint8 { p := tag.Parent() d := uint8(1) for haveRegion != p.region { if p.region == 0 { return 255 } p = p.Parent() d++ } return d } // regionDist wraps regionDistance with some exceptions to the algorithmic distance. func regionDist(a, b regionID, lang langID) uint8 { if lang == _en { // Two variants of non-US English are close to each other, regardless of distance. if a != _US && b != _US { return 2 } } return uint8(regionDistance(a, b)) } // regionDistance computes the distance between two regions based on the // distance in the graph of region containments as defined in CLDR. It iterates // over increasingly inclusive sets of groups, represented as bit vectors, until // the source bit vector has bits in common with the destination vector. func regionDistance(a, b regionID) int { if a == b { return 0 } p, q := regionInclusion[a], regionInclusion[b] if p < nRegionGroups { p, q = q, p } set := regionInclusionBits if q < nRegionGroups && set[p]&(1<<q) != 0 { return 1 } d := 2 for goal := set[q]; set[p]&goal == 0; p = regionInclusionNext[p] { d++ } return d } func (t Tag) variants() string { if t.pVariant == 0 { return "" } return t.str[t.pVariant:t.pExt] } // variantOrPrivateTagStr returns variants or private use tags. func (t Tag) variantOrPrivateTagStr() string { if t.pExt > 0 { return t.str[t.pVariant:t.pExt] } return t.str[t.pVariant:] } // equalsRest compares everything except the language. func (a Tag) equalsRest(b Tag) bool { // TODO: don't include extensions in this comparison. To do this efficiently, // though, we should handle private tags separately. return a.script == b.script && a.region == b.region && a.variantOrPrivateTagStr() == b.variantOrPrivateTagStr() } // isExactEquivalent returns true if canonicalizing the language will not alter // the script or region of a tag. func isExactEquivalent(l langID) bool { for _, o := range notEquivalent { if o == l { return false } } return true } var notEquivalent []langID func init() { // Create a list of all languages for which canonicalization may alter the // script or region. for _, lm := range langAliasMap { tag := Tag{lang: langID(lm.from)} if tag, _ = tag.canonicalize(All); tag.script != 0 || tag.region != 0 { notEquivalent = append(notEquivalent, langID(lm.from)) } } } ================================================ FILE: vendor/golang.org/x/text/language/parse.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package language import ( "bytes" "errors" "fmt" "sort" "strconv" "strings" "golang.org/x/text/internal/tag" ) // isAlpha returns true if the byte is not a digit. // b must be an ASCII letter or digit. func isAlpha(b byte) bool { return b > '9' } // isAlphaNum returns true if the string contains only ASCII letters or digits. func isAlphaNum(s []byte) bool { for _, c := range s { if !('a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9') { return false } } return true } // errSyntax is returned by any of the parsing functions when the // input is not well-formed, according to BCP 47. // TODO: return the position at which the syntax error occurred? var errSyntax = errors.New("language: tag is not well-formed") // ValueError is returned by any of the parsing functions when the // input is well-formed but the respective subtag is not recognized // as a valid value. type ValueError struct { v [8]byte } func mkErrInvalid(s []byte) error { var e ValueError copy(e.v[:], s) return e } func (e ValueError) tag() []byte { n := bytes.IndexByte(e.v[:], 0) if n == -1 { n = 8 } return e.v[:n] } // Error implements the error interface. func (e ValueError) Error() string { return fmt.Sprintf("language: subtag %q is well-formed but unknown", e.tag()) } // Subtag returns the subtag for which the error occurred. func (e ValueError) Subtag() string { return string(e.tag()) } // scanner is used to scan BCP 47 tokens, which are separated by _ or -. type scanner struct { b []byte bytes [max99thPercentileSize]byte token []byte start int // start position of the current token end int // end position of the current token next int // next point for scan err error done bool } func makeScannerString(s string) scanner { scan := scanner{} if len(s) <= len(scan.bytes) { scan.b = scan.bytes[:copy(scan.bytes[:], s)] } else { scan.b = []byte(s) } scan.init() return scan } // makeScanner returns a scanner using b as the input buffer. // b is not copied and may be modified by the scanner routines. func makeScanner(b []byte) scanner { scan := scanner{b: b} scan.init() return scan } func (s *scanner) init() { for i, c := range s.b { if c == '_' { s.b[i] = '-' } } s.scan() } // restToLower converts the string between start and end to lower case. func (s *scanner) toLower(start, end int) { for i := start; i < end; i++ { c := s.b[i] if 'A' <= c && c <= 'Z' { s.b[i] += 'a' - 'A' } } } func (s *scanner) setError(e error) { if s.err == nil || (e == errSyntax && s.err != errSyntax) { s.err = e } } // resizeRange shrinks or grows the array at position oldStart such that // a new string of size newSize can fit between oldStart and oldEnd. // Sets the scan point to after the resized range. func (s *scanner) resizeRange(oldStart, oldEnd, newSize int) { s.start = oldStart if end := oldStart + newSize; end != oldEnd { diff := end - oldEnd if end < cap(s.b) { b := make([]byte, len(s.b)+diff) copy(b, s.b[:oldStart]) copy(b[end:], s.b[oldEnd:]) s.b = b } else { s.b = append(s.b[end:], s.b[oldEnd:]...) } s.next = end + (s.next - s.end) s.end = end } } // replace replaces the current token with repl. func (s *scanner) replace(repl string) { s.resizeRange(s.start, s.end, len(repl)) copy(s.b[s.start:], repl) } // gobble removes the current token from the input. // Caller must call scan after calling gobble. func (s *scanner) gobble(e error) { s.setError(e) if s.start == 0 { s.b = s.b[:+copy(s.b, s.b[s.next:])] s.end = 0 } else { s.b = s.b[:s.start-1+copy(s.b[s.start-1:], s.b[s.end:])] s.end = s.start - 1 } s.next = s.start } // deleteRange removes the given range from s.b before the current token. func (s *scanner) deleteRange(start, end int) { s.setError(errSyntax) s.b = s.b[:start+copy(s.b[start:], s.b[end:])] diff := end - start s.next -= diff s.start -= diff s.end -= diff } // scan parses the next token of a BCP 47 string. Tokens that are larger // than 8 characters or include non-alphanumeric characters result in an error // and are gobbled and removed from the output. // It returns the end position of the last token consumed. func (s *scanner) scan() (end int) { end = s.end s.token = nil for s.start = s.next; s.next < len(s.b); { i := bytes.IndexByte(s.b[s.next:], '-') if i == -1 { s.end = len(s.b) s.next = len(s.b) i = s.end - s.start } else { s.end = s.next + i s.next = s.end + 1 } token := s.b[s.start:s.end] if i < 1 || i > 8 || !isAlphaNum(token) { s.gobble(errSyntax) continue } s.token = token return end } if n := len(s.b); n > 0 && s.b[n-1] == '-' { s.setError(errSyntax) s.b = s.b[:len(s.b)-1] } s.done = true return end } // acceptMinSize parses multiple tokens of the given size or greater. // It returns the end position of the last token consumed. func (s *scanner) acceptMinSize(min int) (end int) { end = s.end s.scan() for ; len(s.token) >= min; s.scan() { end = s.end } return end } // Parse parses the given BCP 47 string and returns a valid Tag. If parsing // failed it returns an error and any part of the tag that could be parsed. // If parsing succeeded but an unknown value was found, it returns // ValueError. The Tag returned in this case is just stripped of the unknown // value. All other values are preserved. It accepts tags in the BCP 47 format // and extensions to this standard defined in // http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers. // The resulting tag is canonicalized using the default canonicalization type. func Parse(s string) (t Tag, err error) { return Default.Parse(s) } // Parse parses the given BCP 47 string and returns a valid Tag. If parsing // failed it returns an error and any part of the tag that could be parsed. // If parsing succeeded but an unknown value was found, it returns // ValueError. The Tag returned in this case is just stripped of the unknown // value. All other values are preserved. It accepts tags in the BCP 47 format // and extensions to this standard defined in // http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers. // The resulting tag is canonicalized using the the canonicalization type c. func (c CanonType) Parse(s string) (t Tag, err error) { // TODO: consider supporting old-style locale key-value pairs. if s == "" { return und, errSyntax } if len(s) <= maxAltTaglen { b := [maxAltTaglen]byte{} for i, c := range s { // Generating invalid UTF-8 is okay as it won't match. if 'A' <= c && c <= 'Z' { c += 'a' - 'A' } else if c == '_' { c = '-' } b[i] = byte(c) } if t, ok := grandfathered(b); ok { return t, nil } } scan := makeScannerString(s) t, err = parse(&scan, s) t, changed := t.canonicalize(c) if changed { t.remakeString() } return t, err } func parse(scan *scanner, s string) (t Tag, err error) { t = und var end int if n := len(scan.token); n <= 1 { scan.toLower(0, len(scan.b)) if n == 0 || scan.token[0] != 'x' { return t, errSyntax } end = parseExtensions(scan) } else if n >= 4 { return und, errSyntax } else { // the usual case t, end = parseTag(scan) if n := len(scan.token); n == 1 { t.pExt = uint16(end) end = parseExtensions(scan) } else if end < len(scan.b) { scan.setError(errSyntax) scan.b = scan.b[:end] } } if int(t.pVariant) < len(scan.b) { if end < len(s) { s = s[:end] } if len(s) > 0 && tag.Compare(s, scan.b) == 0 { t.str = s } else { t.str = string(scan.b) } } else { t.pVariant, t.pExt = 0, 0 } return t, scan.err } // parseTag parses language, script, region and variants. // It returns a Tag and the end position in the input that was parsed. func parseTag(scan *scanner) (t Tag, end int) { var e error // TODO: set an error if an unknown lang, script or region is encountered. t.lang, e = getLangID(scan.token) scan.setError(e) scan.replace(t.lang.String()) langStart := scan.start end = scan.scan() for len(scan.token) == 3 && isAlpha(scan.token[0]) { // From http://tools.ietf.org/html/bcp47, <lang>-<extlang> tags are equivalent // to a tag of the form <extlang>. lang, e := getLangID(scan.token) if lang != 0 { t.lang = lang copy(scan.b[langStart:], lang.String()) scan.b[langStart+3] = '-' scan.start = langStart + 4 } scan.gobble(e) end = scan.scan() } if len(scan.token) == 4 && isAlpha(scan.token[0]) { t.script, e = getScriptID(script, scan.token) if t.script == 0 { scan.gobble(e) } end = scan.scan() } if n := len(scan.token); n >= 2 && n <= 3 { t.region, e = getRegionID(scan.token) if t.region == 0 { scan.gobble(e) } else { scan.replace(t.region.String()) } end = scan.scan() } scan.toLower(scan.start, len(scan.b)) t.pVariant = byte(end) end = parseVariants(scan, end, t) t.pExt = uint16(end) return t, end } var separator = []byte{'-'} // parseVariants scans tokens as long as each token is a valid variant string. // Duplicate variants are removed. func parseVariants(scan *scanner, end int, t Tag) int { start := scan.start varIDBuf := [4]uint8{} variantBuf := [4][]byte{} varID := varIDBuf[:0] variant := variantBuf[:0] last := -1 needSort := false for ; len(scan.token) >= 4; scan.scan() { // TODO: measure the impact of needing this conversion and redesign // the data structure if there is an issue. v, ok := variantIndex[string(scan.token)] if !ok { // unknown variant // TODO: allow user-defined variants? scan.gobble(mkErrInvalid(scan.token)) continue } varID = append(varID, v) variant = append(variant, scan.token) if !needSort { if last < int(v) { last = int(v) } else { needSort = true // There is no legal combinations of more than 7 variants // (and this is by no means a useful sequence). const maxVariants = 8 if len(varID) > maxVariants { break } } } end = scan.end } if needSort { sort.Sort(variantsSort{varID, variant}) k, l := 0, -1 for i, v := range varID { w := int(v) if l == w { // Remove duplicates. continue } varID[k] = varID[i] variant[k] = variant[i] k++ l = w } if str := bytes.Join(variant[:k], separator); len(str) == 0 { end = start - 1 } else { scan.resizeRange(start, end, len(str)) copy(scan.b[scan.start:], str) end = scan.end } } return end } type variantsSort struct { i []uint8 v [][]byte } func (s variantsSort) Len() int { return len(s.i) } func (s variantsSort) Swap(i, j int) { s.i[i], s.i[j] = s.i[j], s.i[i] s.v[i], s.v[j] = s.v[j], s.v[i] } func (s variantsSort) Less(i, j int) bool { return s.i[i] < s.i[j] } type bytesSort [][]byte func (b bytesSort) Len() int { return len(b) } func (b bytesSort) Swap(i, j int) { b[i], b[j] = b[j], b[i] } func (b bytesSort) Less(i, j int) bool { return bytes.Compare(b[i], b[j]) == -1 } // parseExtensions parses and normalizes the extensions in the buffer. // It returns the last position of scan.b that is part of any extension. // It also trims scan.b to remove excess parts accordingly. func parseExtensions(scan *scanner) int { start := scan.start exts := [][]byte{} private := []byte{} end := scan.end for len(scan.token) == 1 { extStart := scan.start ext := scan.token[0] end = parseExtension(scan) extension := scan.b[extStart:end] if len(extension) < 3 || (ext != 'x' && len(extension) < 4) { scan.setError(errSyntax) end = extStart continue } else if start == extStart && (ext == 'x' || scan.start == len(scan.b)) { scan.b = scan.b[:end] return end } else if ext == 'x' { private = extension break } exts = append(exts, extension) } sort.Sort(bytesSort(exts)) if len(private) > 0 { exts = append(exts, private) } scan.b = scan.b[:start] if len(exts) > 0 { scan.b = append(scan.b, bytes.Join(exts, separator)...) } else if start > 0 { // Strip trailing '-'. scan.b = scan.b[:start-1] } return end } // parseExtension parses a single extension and returns the position of // the extension end. func parseExtension(scan *scanner) int { start, end := scan.start, scan.end switch scan.token[0] { case 'u': attrStart := end scan.scan() for last := []byte{}; len(scan.token) > 2; scan.scan() { if bytes.Compare(scan.token, last) != -1 { // Attributes are unsorted. Start over from scratch. p := attrStart + 1 scan.next = p attrs := [][]byte{} for scan.scan(); len(scan.token) > 2; scan.scan() { attrs = append(attrs, scan.token) end = scan.end } sort.Sort(bytesSort(attrs)) copy(scan.b[p:], bytes.Join(attrs, separator)) break } last = scan.token end = scan.end } var last, key []byte for attrEnd := end; len(scan.token) == 2; last = key { key = scan.token keyEnd := scan.end end = scan.acceptMinSize(3) // TODO: check key value validity if keyEnd == end || bytes.Compare(key, last) != 1 { // We have an invalid key or the keys are not sorted. // Start scanning keys from scratch and reorder. p := attrEnd + 1 scan.next = p keys := [][]byte{} for scan.scan(); len(scan.token) == 2; { keyStart, keyEnd := scan.start, scan.end end = scan.acceptMinSize(3) if keyEnd != end { keys = append(keys, scan.b[keyStart:end]) } else { scan.setError(errSyntax) end = keyStart } } sort.Sort(bytesSort(keys)) reordered := bytes.Join(keys, separator) if e := p + len(reordered); e < end { scan.deleteRange(e, end) end = e } copy(scan.b[p:], bytes.Join(keys, separator)) break } } case 't': scan.scan() if n := len(scan.token); n >= 2 && n <= 3 && isAlpha(scan.token[1]) { _, end = parseTag(scan) scan.toLower(start, end) } for len(scan.token) == 2 && !isAlpha(scan.token[1]) { end = scan.acceptMinSize(3) } case 'x': end = scan.acceptMinSize(1) default: end = scan.acceptMinSize(2) } return end } // Compose creates a Tag from individual parts, which may be of type Tag, Base, // Script, Region, Variant, []Variant, Extension, []Extension or error. If a // Base, Script or Region or slice of type Variant or Extension is passed more // than once, the latter will overwrite the former. Variants and Extensions are // accumulated, but if two extensions of the same type are passed, the latter // will replace the former. A Tag overwrites all former values and typically // only makes sense as the first argument. The resulting tag is returned after // canonicalizing using the Default CanonType. If one or more errors are // encountered, one of the errors is returned. func Compose(part ...interface{}) (t Tag, err error) { return Default.Compose(part...) } // Compose creates a Tag from individual parts, which may be of type Tag, Base, // Script, Region, Variant, []Variant, Extension, []Extension or error. If a // Base, Script or Region or slice of type Variant or Extension is passed more // than once, the latter will overwrite the former. Variants and Extensions are // accumulated, but if two extensions of the same type are passed, the latter // will replace the former. A Tag overwrites all former values and typically // only makes sense as the first argument. The resulting tag is returned after // canonicalizing using CanonType c. If one or more errors are encountered, // one of the errors is returned. func (c CanonType) Compose(part ...interface{}) (t Tag, err error) { var b builder if err = b.update(part...); err != nil { return und, err } t, _ = b.tag.canonicalize(c) if len(b.ext) > 0 || len(b.variant) > 0 { sort.Sort(sortVariant(b.variant)) sort.Strings(b.ext) if b.private != "" { b.ext = append(b.ext, b.private) } n := maxCoreSize + tokenLen(b.variant...) + tokenLen(b.ext...) buf := make([]byte, n) p := t.genCoreBytes(buf) t.pVariant = byte(p) p += appendTokens(buf[p:], b.variant...) t.pExt = uint16(p) p += appendTokens(buf[p:], b.ext...) t.str = string(buf[:p]) } else if b.private != "" { t.str = b.private t.remakeString() } return } type builder struct { tag Tag private string // the x extension ext []string variant []string err error } func (b *builder) addExt(e string) { if e == "" { } else if e[0] == 'x' { b.private = e } else { b.ext = append(b.ext, e) } } var errInvalidArgument = errors.New("invalid Extension or Variant") func (b *builder) update(part ...interface{}) (err error) { replace := func(l *[]string, s string, eq func(a, b string) bool) bool { if s == "" { b.err = errInvalidArgument return true } for i, v := range *l { if eq(v, s) { (*l)[i] = s return true } } return false } for _, x := range part { switch v := x.(type) { case Tag: b.tag.lang = v.lang b.tag.region = v.region b.tag.script = v.script if v.str != "" { b.variant = nil for x, s := "", v.str[v.pVariant:v.pExt]; s != ""; { x, s = nextToken(s) b.variant = append(b.variant, x) } b.ext, b.private = nil, "" for i, e := int(v.pExt), ""; i < len(v.str); { i, e = getExtension(v.str, i) b.addExt(e) } } case Base: b.tag.lang = v.langID case Script: b.tag.script = v.scriptID case Region: b.tag.region = v.regionID case Variant: if !replace(&b.variant, v.variant, func(a, b string) bool { return a == b }) { b.variant = append(b.variant, v.variant) } case Extension: if !replace(&b.ext, v.s, func(a, b string) bool { return a[0] == b[0] }) { b.addExt(v.s) } case []Variant: b.variant = nil for _, x := range v { b.update(x) } case []Extension: b.ext, b.private = nil, "" for _, e := range v { b.update(e) } // TODO: support parsing of raw strings based on morphology or just extensions? case error: err = v } } return } func tokenLen(token ...string) (n int) { for _, t := range token { n += len(t) + 1 } return } func appendTokens(b []byte, token ...string) int { p := 0 for _, t := range token { b[p] = '-' copy(b[p+1:], t) p += 1 + len(t) } return p } type sortVariant []string func (s sortVariant) Len() int { return len(s) } func (s sortVariant) Swap(i, j int) { s[j], s[i] = s[i], s[j] } func (s sortVariant) Less(i, j int) bool { return variantIndex[s[i]] < variantIndex[s[j]] } func findExt(list []string, x byte) int { for i, e := range list { if e[0] == x { return i } } return -1 } // getExtension returns the name, body and end position of the extension. func getExtension(s string, p int) (end int, ext string) { if s[p] == '-' { p++ } if s[p] == 'x' { return len(s), s[p:] } end = nextExtension(s, p) return end, s[p:end] } // nextExtension finds the next extension within the string, searching // for the -<char>- pattern from position p. // In the fast majority of cases, language tags will have at most // one extension and extensions tend to be small. func nextExtension(s string, p int) int { for n := len(s) - 3; p < n; { if s[p] == '-' { if s[p+2] == '-' { return p } p += 3 } else { p++ } } return len(s) } var errInvalidWeight = errors.New("ParseAcceptLanguage: invalid weight") // ParseAcceptLanguage parses the contents of a Accept-Language header as // defined in http://www.ietf.org/rfc/rfc2616.txt and returns a list of Tags and // a list of corresponding quality weights. It is more permissive than RFC 2616 // and may return non-nil slices even if the input is not valid. // The Tags will be sorted by highest weight first and then by first occurrence. // Tags with a weight of zero will be dropped. An error will be returned if the // input could not be parsed. func ParseAcceptLanguage(s string) (tag []Tag, q []float32, err error) { var entry string for s != "" { if entry, s = split(s, ','); entry == "" { continue } entry, weight := split(entry, ';') // Scan the language. t, err := Parse(entry) if err != nil { id, ok := acceptFallback[entry] if !ok { return nil, nil, err } t = Tag{lang: id} } // Scan the optional weight. w := 1.0 if weight != "" { weight = consume(weight, 'q') weight = consume(weight, '=') // consume returns the empty string when a token could not be // consumed, resulting in an error for ParseFloat. if w, err = strconv.ParseFloat(weight, 32); err != nil { return nil, nil, errInvalidWeight } // Drop tags with a quality weight of 0. if w <= 0 { continue } } tag = append(tag, t) q = append(q, float32(w)) } sortStable(&tagSort{tag, q}) return tag, q, nil } // consume removes a leading token c from s and returns the result or the empty // string if there is no such token. func consume(s string, c byte) string { if s == "" || s[0] != c { return "" } return strings.TrimSpace(s[1:]) } func split(s string, c byte) (head, tail string) { if i := strings.IndexByte(s, c); i >= 0 { return strings.TrimSpace(s[:i]), strings.TrimSpace(s[i+1:]) } return strings.TrimSpace(s), "" } // Add hack mapping to deal with a small number of cases that that occur // in Accept-Language (with reasonable frequency). var acceptFallback = map[string]langID{ "english": _en, "deutsch": _de, "italian": _it, "french": _fr, "*": _mul, // defined in the spec to match all languages. } type tagSort struct { tag []Tag q []float32 } func (s *tagSort) Len() int { return len(s.q) } func (s *tagSort) Less(i, j int) bool { return s.q[i] > s.q[j] } func (s *tagSort) Swap(i, j int) { s.tag[i], s.tag[j] = s.tag[j], s.tag[i] s.q[i], s.q[j] = s.q[j], s.q[i] } ================================================ FILE: vendor/golang.org/x/text/language/tables.go ================================================ // This file was generated by go generate; DO NOT EDIT package language import "golang.org/x/text/internal/tag" // CLDRVersion is the CLDR version from which the tables in this package are derived. const CLDRVersion = "30" const numLanguages = 8654 const numScripts = 230 const numRegions = 356 type fromTo struct { from uint16 to uint16 } const nonCanonicalUnd = 1191 const ( _af = 21 _am = 38 _ar = 57 _az = 87 _bg = 125 _bn = 163 _ca = 213 _cs = 246 _da = 253 _de = 265 _el = 305 _en = 308 _es = 313 _et = 315 _fa = 323 _fi = 332 _fil = 334 _fr = 345 _gu = 413 _he = 437 _hi = 439 _hr = 458 _hu = 462 _hy = 464 _id = 474 _is = 496 _it = 497 _ja = 504 _ka = 520 _kk = 570 _km = 578 _kn = 585 _ko = 587 _ky = 641 _lo = 687 _lt = 695 _lv = 702 _mk = 758 _ml = 763 _mn = 770 _mo = 775 _mr = 786 _ms = 790 _mul = 797 _my = 808 _nb = 830 _ne = 840 _nl = 862 _no = 870 _pa = 916 _pl = 938 _pt = 951 _ro = 979 _ru = 985 _sh = 1021 _si = 1026 _sk = 1032 _sl = 1036 _sq = 1063 _sr = 1064 _sv = 1082 _sw = 1083 _ta = 1094 _te = 1111 _th = 1121 _tl = 1136 _tn = 1142 _tr = 1152 _uk = 1188 _ur = 1194 _uz = 1202 _vi = 1209 _zh = 1311 _zu = 1316 _jbo = 507 _ami = 1639 _bnn = 2346 _hak = 431 _tlh = 14456 _lb = 652 _nv = 890 _pwn = 12044 _tao = 14177 _tay = 14187 _tsu = 14651 _nn = 865 _sfb = 13618 _vgt = 15690 _sgg = 13649 _cmn = 2996 _nan = 826 _hsn = 460 ) const langPrivateStart = 0x2f67 const langPrivateEnd = 0x316e // lang holds an alphabetically sorted list of ISO-639 language identifiers. // All entries are 4 bytes. The index of the identifier (divided by 4) is the language tag. // For 2-byte language identifiers, the two successive bytes have the following meaning: // - if the first letter of the 2- and 3-letter ISO codes are the same: // the second and third letter of the 3-letter ISO code. // - otherwise: a 0 and a by 2 bits right-shifted index into altLangISO3. // For 3-byte language identifiers the 4th byte is 0. const lang tag.Index = "" + // Size: 5280 bytes "---\x00aaaraai\x00aak\x00aau\x00abbkabi\x00abr\x00abt\x00aby\x00acd\x00a" + "ce\x00ach\x00ada\x00ade\x00adj\x00ady\x00adz\x00aeveaeb\x00aey\x00affrag" + "c\x00agd\x00agg\x00agm\x00ago\x00agq\x00aha\x00ahl\x00aho\x00ajg\x00akka" + "akk\x00ala\x00ali\x00aln\x00alt\x00ammhamm\x00amn\x00amo\x00amp\x00anrga" + "nc\x00ank\x00ann\x00any\x00aoj\x00aom\x00aoz\x00apc\x00apd\x00ape\x00apr" + "\x00aps\x00apz\x00arraarc\x00arh\x00arn\x00aro\x00arq\x00ars\x00ary\x00a" + "rz\x00assmasa\x00ase\x00asg\x00aso\x00ast\x00ata\x00atg\x00atj\x00auy" + "\x00avvaavl\x00avn\x00avt\x00avu\x00awa\x00awb\x00awo\x00awx\x00ayymayb" + "\x00azzebaakbal\x00ban\x00bap\x00bar\x00bas\x00bav\x00bax\x00bba\x00bbb" + "\x00bbc\x00bbd\x00bbj\x00bbp\x00bbr\x00bcf\x00bch\x00bci\x00bcm\x00bcn" + "\x00bco\x00bcq\x00bcu\x00bdd\x00beelbef\x00beh\x00bej\x00bem\x00bet\x00b" + "ew\x00bex\x00bez\x00bfd\x00bfq\x00bft\x00bfy\x00bgulbgc\x00bgn\x00bgx" + "\x00bhihbhb\x00bhg\x00bhi\x00bhk\x00bhl\x00bho\x00bhy\x00biisbib\x00big" + "\x00bik\x00bim\x00bin\x00bio\x00biq\x00bjh\x00bji\x00bjj\x00bjn\x00bjo" + "\x00bjr\x00bjz\x00bkc\x00bkm\x00bkq\x00bku\x00bkv\x00blt\x00bmambmh\x00b" + "mk\x00bmq\x00bmu\x00bnenbng\x00bnm\x00bnp\x00boodboj\x00bom\x00bon\x00bp" + "y\x00bqc\x00bqi\x00bqp\x00bqv\x00brrebra\x00brh\x00brx\x00brz\x00bsosbsj" + "\x00bsq\x00bss\x00bst\x00bto\x00btt\x00btv\x00bua\x00buc\x00bud\x00bug" + "\x00buk\x00bum\x00buo\x00bus\x00buu\x00bvb\x00bwd\x00bwr\x00bxh\x00bye" + "\x00byn\x00byr\x00bys\x00byv\x00byx\x00bza\x00bze\x00bzf\x00bzh\x00bzw" + "\x00caatcan\x00cbj\x00cch\x00ccp\x00ceheceb\x00cfa\x00cgg\x00chhachk\x00" + "chm\x00cho\x00chp\x00chr\x00cja\x00cjm\x00cjv\x00ckb\x00ckl\x00cko\x00ck" + "y\x00cla\x00cme\x00cooscop\x00cps\x00crrecrj\x00crk\x00crl\x00crm\x00crs" + "\x00csescsb\x00csw\x00ctd\x00cuhucvhvcyymdaandad\x00daf\x00dag\x00dah" + "\x00dak\x00dar\x00dav\x00dbd\x00dbq\x00dcc\x00ddn\x00deeuded\x00den\x00d" + "ga\x00dgh\x00dgi\x00dgl\x00dgr\x00dgz\x00dia\x00dje\x00dnj\x00dob\x00doi" + "\x00dop\x00dow\x00dri\x00drs\x00dsb\x00dtm\x00dtp\x00dts\x00dty\x00dua" + "\x00duc\x00dud\x00dug\x00dvivdva\x00dww\x00dyo\x00dyu\x00dzzodzg\x00ebu" + "\x00eeweefi\x00egl\x00egy\x00eky\x00elllema\x00emi\x00enngenn\x00enq\x00" + "eopoeri\x00es\x00\x05esu\x00etstetr\x00ett\x00etu\x00etx\x00euusewo\x00e" + "xt\x00faasfaa\x00fab\x00fag\x00fai\x00fan\x00ffulffi\x00ffm\x00fiinfia" + "\x00fil\x00fit\x00fjijflr\x00fmp\x00foaofod\x00fon\x00for\x00fpe\x00fqs" + "\x00frrafrc\x00frp\x00frr\x00frs\x00fub\x00fud\x00fue\x00fuf\x00fuh\x00f" + "uq\x00fur\x00fuv\x00fuy\x00fvr\x00fyrygalegaa\x00gaf\x00gag\x00gah\x00ga" + "j\x00gam\x00gan\x00gaw\x00gay\x00gbf\x00gbm\x00gby\x00gbz\x00gcr\x00gdla" + "gde\x00gdn\x00gdr\x00geb\x00gej\x00gel\x00gez\x00gfk\x00ggn\x00ghs\x00gi" + "l\x00gim\x00gjk\x00gjn\x00gju\x00gkn\x00gkp\x00gllgglk\x00gmm\x00gmv\x00" + "gnrngnd\x00gng\x00god\x00gof\x00goi\x00gom\x00gon\x00gor\x00gos\x00got" + "\x00grc\x00grt\x00grw\x00gsw\x00guujgub\x00guc\x00gud\x00gur\x00guw\x00g" + "ux\x00guz\x00gvlvgvf\x00gvr\x00gvs\x00gwc\x00gwi\x00gwt\x00gyi\x00haauha" + "g\x00hak\x00ham\x00haw\x00haz\x00hbb\x00hdy\x00heebhhy\x00hiinhia\x00hif" + "\x00hig\x00hih\x00hil\x00hla\x00hlu\x00hmd\x00hmt\x00hnd\x00hne\x00hnj" + "\x00hnn\x00hno\x00homohoc\x00hoj\x00hot\x00hrrvhsb\x00hsn\x00htathuunhui" + "\x00hyyehzerianaian\x00iar\x00iba\x00ibb\x00iby\x00ica\x00ich\x00idndidd" + "\x00idi\x00idu\x00ieleigboigb\x00ige\x00iiiiijj\x00ikpkikk\x00ikt\x00ikw" + "\x00ikx\x00ilo\x00imo\x00inndinh\x00iodoiou\x00iri\x00isslittaiukuiw\x00" + "\x03iwm\x00iws\x00izh\x00izi\x00japnjab\x00jam\x00jbo\x00jbu\x00jen\x00j" + "gk\x00jgo\x00ji\x00\x06jib\x00jmc\x00jml\x00jra\x00jut\x00jvavjwavkaatka" + "a\x00kab\x00kac\x00kad\x00kai\x00kaj\x00kam\x00kao\x00kbd\x00kbm\x00kbp" + "\x00kbq\x00kbx\x00kby\x00kcg\x00kck\x00kcl\x00kct\x00kde\x00kdh\x00kdl" + "\x00kdt\x00kea\x00ken\x00kez\x00kfo\x00kfr\x00kfy\x00kgonkge\x00kgf\x00k" + "gp\x00kha\x00khb\x00khn\x00khq\x00khs\x00kht\x00khw\x00khz\x00kiikkij" + "\x00kiu\x00kiw\x00kjuakjd\x00kjg\x00kjs\x00kjy\x00kkazkkc\x00kkj\x00klal" + "kln\x00klq\x00klt\x00klx\x00kmhmkmb\x00kmh\x00kmo\x00kms\x00kmu\x00kmw" + "\x00knanknp\x00koorkoi\x00kok\x00kol\x00kos\x00koz\x00kpe\x00kpf\x00kpo" + "\x00kpr\x00kpx\x00kqb\x00kqf\x00kqs\x00kqy\x00kraukrc\x00kri\x00krj\x00k" + "rl\x00krs\x00kru\x00ksasksb\x00ksd\x00ksf\x00ksh\x00ksj\x00ksr\x00ktb" + "\x00ktm\x00kto\x00kuurkub\x00kud\x00kue\x00kuj\x00kum\x00kun\x00kup\x00k" + "us\x00kvomkvg\x00kvr\x00kvx\x00kw\x00\x01kwj\x00kwo\x00kxa\x00kxc\x00kxm" + "\x00kxp\x00kxw\x00kxz\x00kyirkye\x00kyx\x00kzr\x00laatlab\x00lad\x00lag" + "\x00lah\x00laj\x00las\x00lbtzlbe\x00lbu\x00lbw\x00lcm\x00lcp\x00ldb\x00l" + "ed\x00lee\x00lem\x00lep\x00leq\x00leu\x00lez\x00lguglgg\x00liimlia\x00li" + "d\x00lif\x00lig\x00lih\x00lij\x00lis\x00ljp\x00lki\x00lkt\x00lle\x00lln" + "\x00lmn\x00lmo\x00lmp\x00lninlns\x00lnu\x00loaoloj\x00lok\x00lol\x00lor" + "\x00los\x00loz\x00lrc\x00ltitltg\x00luublua\x00luo\x00luy\x00luz\x00lvav" + "lwl\x00lzh\x00lzz\x00mad\x00maf\x00mag\x00mai\x00mak\x00man\x00mas\x00ma" + "w\x00maz\x00mbh\x00mbo\x00mbq\x00mbu\x00mbw\x00mci\x00mcp\x00mcq\x00mcr" + "\x00mcu\x00mda\x00mde\x00mdf\x00mdh\x00mdj\x00mdr\x00mdx\x00med\x00mee" + "\x00mek\x00men\x00mer\x00met\x00meu\x00mfa\x00mfe\x00mfn\x00mfo\x00mfq" + "\x00mglgmgh\x00mgl\x00mgo\x00mgp\x00mgy\x00mhahmhi\x00mhl\x00mirimif\x00" + "min\x00mis\x00miw\x00mkkdmki\x00mkl\x00mkp\x00mkw\x00mlalmle\x00mlp\x00m" + "ls\x00mmo\x00mmu\x00mmx\x00mnonmna\x00mnf\x00mni\x00mnw\x00moolmoa\x00mo" + "e\x00moh\x00mos\x00mox\x00mpp\x00mps\x00mpt\x00mpx\x00mql\x00mrarmrd\x00" + "mrj\x00mro\x00mssamtltmtc\x00mtf\x00mti\x00mtr\x00mua\x00mul\x00mur\x00m" + "us\x00mva\x00mvn\x00mvy\x00mwk\x00mwr\x00mwv\x00mxc\x00mxm\x00myyamyk" + "\x00mym\x00myv\x00myw\x00myx\x00myz\x00mzk\x00mzm\x00mzn\x00mzp\x00mzw" + "\x00mzz\x00naaunac\x00naf\x00nah\x00nak\x00nan\x00nap\x00naq\x00nas\x00n" + "bobnca\x00nce\x00ncf\x00nch\x00nco\x00ncu\x00nddendc\x00nds\x00neepneb" + "\x00new\x00nex\x00nfr\x00ngdonga\x00ngb\x00ngl\x00nhb\x00nhe\x00nhw\x00n" + "if\x00nii\x00nij\x00nin\x00niu\x00niy\x00niz\x00njo\x00nkg\x00nko\x00nll" + "dnmg\x00nmz\x00nnnonnf\x00nnh\x00nnk\x00nnm\x00noornod\x00noe\x00non\x00" + "nop\x00nou\x00nqo\x00nrblnrb\x00nsk\x00nsn\x00nso\x00nss\x00ntm\x00ntr" + "\x00nui\x00nup\x00nus\x00nuv\x00nux\x00nvavnwb\x00nxq\x00nxr\x00nyyanym" + "\x00nyn\x00nzi\x00occiogc\x00ojjiokr\x00okv\x00omrmong\x00onn\x00ons\x00" + "opm\x00orrioro\x00oru\x00osssosa\x00ota\x00otk\x00ozm\x00paanpag\x00pal" + "\x00pam\x00pap\x00pau\x00pbi\x00pcd\x00pcm\x00pdc\x00pdt\x00ped\x00peo" + "\x00pex\x00pfl\x00phl\x00phn\x00pilipil\x00pip\x00pka\x00pko\x00plolpla" + "\x00pms\x00png\x00pnn\x00pnt\x00pon\x00ppo\x00pra\x00prd\x00prg\x00psusp" + "ss\x00ptorptp\x00puu\x00pwa\x00quuequc\x00qug\x00rai\x00raj\x00rao\x00rc" + "f\x00rej\x00rel\x00res\x00rgn\x00rhg\x00ria\x00rif\x00rjs\x00rkt\x00rmoh" + "rmf\x00rmo\x00rmt\x00rmu\x00rnunrna\x00rng\x00roonrob\x00rof\x00roo\x00r" + "ro\x00rtm\x00ruusrue\x00rug\x00rw\x00\x04rwk\x00rwo\x00ryu\x00saansaf" + "\x00sah\x00saq\x00sas\x00sat\x00saz\x00sba\x00sbe\x00sbp\x00scrdsck\x00s" + "cl\x00scn\x00sco\x00scs\x00sdndsdc\x00sdh\x00semesef\x00seh\x00sei\x00se" + "s\x00sgagsga\x00sgs\x00sgw\x00sgz\x00sh\x00\x02shi\x00shk\x00shn\x00shu" + "\x00siinsid\x00sig\x00sil\x00sim\x00sjr\x00sklkskc\x00skr\x00sks\x00sllv" + "sld\x00sli\x00sll\x00sly\x00smmosma\x00smi\x00smj\x00smn\x00smp\x00smq" + "\x00sms\x00snnasnc\x00snk\x00snp\x00snx\x00sny\x00soomsok\x00soq\x00sou" + "\x00soy\x00spd\x00spl\x00sps\x00sqqisrrpsrb\x00srn\x00srr\x00srx\x00sssw" + "ssd\x00ssg\x00ssy\x00stotstk\x00stq\x00suunsua\x00sue\x00suk\x00sur\x00s" + "us\x00svweswwaswb\x00swc\x00swg\x00swp\x00swv\x00sxn\x00sxw\x00syl\x00sy" + "r\x00szl\x00taamtaj\x00tal\x00tan\x00taq\x00tbc\x00tbd\x00tbf\x00tbg\x00" + "tbo\x00tbw\x00tbz\x00tci\x00tcy\x00tdd\x00tdg\x00tdh\x00teelted\x00tem" + "\x00teo\x00tet\x00tfi\x00tggktgc\x00tgo\x00tgu\x00thhathl\x00thq\x00thr" + "\x00tiirtif\x00tig\x00tik\x00tim\x00tio\x00tiv\x00tkuktkl\x00tkr\x00tkt" + "\x00tlgltlf\x00tlx\x00tly\x00tmh\x00tmy\x00tnsntnh\x00toontof\x00tog\x00" + "toq\x00tpi\x00tpm\x00tpz\x00tqo\x00trurtru\x00trv\x00trw\x00tssotsd\x00t" + "sf\x00tsg\x00tsj\x00tsw\x00ttatttd\x00tte\x00ttj\x00ttr\x00tts\x00ttt" + "\x00tuh\x00tul\x00tum\x00tuq\x00tvd\x00tvl\x00tvu\x00twwitwh\x00twq\x00t" + "xg\x00tyahtya\x00tyv\x00tzm\x00ubu\x00udm\x00ugiguga\x00ukkruli\x00umb" + "\x00und\x00unr\x00unx\x00urrduri\x00urt\x00urw\x00usa\x00utr\x00uvh\x00u" + "vl\x00uzzbvag\x00vai\x00van\x00veenvec\x00vep\x00viievic\x00viv\x00vls" + "\x00vmf\x00vmw\x00voolvot\x00vro\x00vun\x00vut\x00walnwae\x00waj\x00wal" + "\x00wan\x00war\x00wbp\x00wbq\x00wbr\x00wci\x00wer\x00wgi\x00whg\x00wib" + "\x00wiu\x00wiv\x00wja\x00wji\x00wls\x00wmo\x00wnc\x00wni\x00wnu\x00woolw" + "ob\x00wos\x00wrs\x00wsk\x00wtm\x00wuu\x00wuv\x00wwa\x00xav\x00xbi\x00xcr" + "\x00xes\x00xhhoxla\x00xlc\x00xld\x00xmf\x00xmn\x00xmr\x00xna\x00xnr\x00x" + "og\x00xon\x00xpr\x00xrb\x00xsa\x00xsi\x00xsm\x00xsr\x00xwe\x00yam\x00yao" + "\x00yap\x00yas\x00yat\x00yav\x00yay\x00yaz\x00yba\x00ybb\x00yby\x00yer" + "\x00ygr\x00ygw\x00yiidyko\x00yle\x00ylg\x00yll\x00yml\x00yooryon\x00yrb" + "\x00yre\x00yrl\x00yss\x00yua\x00yue\x00yuj\x00yut\x00yuw\x00zahazag\x00z" + "bl\x00zdj\x00zea\x00zgh\x00zhhozia\x00zlm\x00zmi\x00zne\x00zuulzxx\x00zz" + "a\x00\xff\xff\xff\xff" const langNoIndexOffset = 1319 // langNoIndex is a bit vector of all 3-letter language codes that are not used as an index // in lookup tables. The language ids for these language codes are derived directly // from the letters and are not consecutive. // Size: 2197 bytes, 2197 elements var langNoIndex = [2197]uint8{ // Entry 0 - 3F 0xff, 0xf8, 0xed, 0xfe, 0xeb, 0xd7, 0x3b, 0xd2, 0xfb, 0xbf, 0x7a, 0xfa, 0x37, 0x1d, 0x3c, 0x57, 0x6e, 0x97, 0x73, 0x38, 0xfb, 0xea, 0xbf, 0x70, 0xad, 0x03, 0xff, 0xff, 0xcf, 0x05, 0x84, 0x62, 0xe9, 0xbf, 0xfd, 0xbf, 0xbf, 0xf7, 0xfd, 0x77, 0x0f, 0xff, 0xef, 0x6f, 0xff, 0xfb, 0xdf, 0xe2, 0xc9, 0xf8, 0x7f, 0x7e, 0x4d, 0xb8, 0x0a, 0x6a, 0x7c, 0xea, 0xe3, 0xfa, 0x7a, 0xbf, 0x67, 0xff, // Entry 40 - 7F 0xff, 0xff, 0xff, 0xdf, 0x2a, 0x54, 0x91, 0xc0, 0x5d, 0xe3, 0x97, 0x14, 0x07, 0x20, 0xdd, 0xed, 0x9f, 0x3f, 0xc9, 0x21, 0xf8, 0x3f, 0x94, 0x35, 0x7c, 0x5f, 0xff, 0x5f, 0x8e, 0x6e, 0xdf, 0xff, 0xff, 0xff, 0x55, 0x7c, 0xd3, 0xfd, 0xbf, 0xb5, 0x7b, 0xdf, 0x7f, 0xf7, 0xca, 0xfe, 0xdb, 0xa3, 0xa8, 0xff, 0x1f, 0x67, 0x7f, 0xeb, 0xef, 0xce, 0xff, 0xff, 0x9f, 0xff, 0xb7, 0xef, 0xfe, 0xcf, // Entry 80 - BF 0xdb, 0xff, 0xf3, 0xcd, 0xfb, 0x2f, 0xff, 0xff, 0xbb, 0xee, 0xf7, 0xbd, 0xdb, 0xff, 0x5f, 0xf7, 0xfd, 0xf2, 0xfd, 0xff, 0x5e, 0x2f, 0x3b, 0xba, 0x7e, 0xff, 0xff, 0xfe, 0xf7, 0xff, 0xdd, 0xff, 0xfd, 0xdf, 0xfb, 0xfe, 0x9d, 0xb4, 0xd3, 0xff, 0xef, 0xff, 0xdf, 0xf7, 0x7f, 0xb7, 0xfd, 0xd5, 0xa5, 0x77, 0x40, 0xff, 0x9c, 0xc1, 0x41, 0x2c, 0x08, 0x20, 0x41, 0x00, 0x50, 0x40, 0x00, 0x80, // Entry C0 - FF 0xfb, 0x4a, 0xf2, 0x9f, 0xb4, 0x42, 0x41, 0x96, 0x1b, 0x14, 0x08, 0xf2, 0x2b, 0xe7, 0x17, 0x56, 0x45, 0x7d, 0x0e, 0x1c, 0x37, 0x71, 0xf3, 0xef, 0x97, 0xff, 0x5d, 0x38, 0x64, 0x08, 0x00, 0x10, 0xbc, 0x87, 0xaf, 0xdf, 0xff, 0xf7, 0x73, 0x35, 0x3e, 0x87, 0xc7, 0xdf, 0xff, 0x00, 0x81, 0x00, 0xb0, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, 0x40, 0x00, 0x40, 0x92, 0x21, 0x50, 0xb1, 0x5d, // Entry 100 - 13F 0xfd, 0xdc, 0xbe, 0x5e, 0x00, 0x00, 0x02, 0x64, 0x0d, 0x19, 0x41, 0xdf, 0x79, 0x22, 0x00, 0x00, 0x00, 0x5e, 0x64, 0xdc, 0x24, 0xe5, 0xd9, 0xe3, 0xfe, 0xff, 0xfd, 0xcb, 0x9f, 0x14, 0x01, 0x0c, 0x86, 0x00, 0xd1, 0x00, 0xf0, 0xc5, 0x67, 0x5f, 0x56, 0x89, 0x5e, 0xb5, 0x6c, 0xaf, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0xc0, 0x37, 0xda, 0x56, 0x90, 0x69, 0x01, 0x2c, 0x96, 0x69, 0x20, 0xfb, // Entry 140 - 17F 0xff, 0x3f, 0x00, 0x00, 0x00, 0x01, 0x08, 0x16, 0x01, 0x00, 0x00, 0xb0, 0x14, 0x03, 0x50, 0x06, 0x0a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x09, 0x00, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x44, 0x00, 0x00, 0x10, 0x00, 0x04, 0x08, 0x00, 0x00, 0x04, 0x00, 0x80, 0x28, 0x04, 0x00, 0x00, 0x50, 0xd5, 0x2d, 0x00, 0x64, 0x35, 0x24, 0x52, 0xf4, 0xd4, 0xbd, 0x62, 0xc9, 0x03, // Entry 180 - 1BF 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x13, 0x39, 0x01, 0xdd, 0x57, 0x98, 0x21, 0x18, 0x81, 0x00, 0x00, 0x01, 0x40, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0x44, 0x00, 0x00, 0x80, 0xea, 0xa9, 0x39, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, // Entry 1C0 - 1FF 0x00, 0x01, 0x28, 0x05, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x04, 0xa6, 0x00, 0x04, 0x00, 0x00, 0x81, 0x50, 0x00, 0x00, 0x00, 0x11, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x55, 0x02, 0x10, 0x08, 0x04, 0x00, 0x00, 0x00, 0x40, 0x30, 0x83, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xcd, 0xbf, 0x7e, 0xbf, // Entry 200 - 23F 0xdf, 0xc3, 0x83, 0x82, 0xc0, 0xfb, 0x57, 0x27, 0xcd, 0x55, 0xe7, 0x01, 0x00, 0x20, 0xb2, 0xc5, 0xa4, 0x45, 0x25, 0x9b, 0x02, 0xcf, 0xe0, 0xdf, 0x03, 0x44, 0x08, 0x10, 0x01, 0x04, 0x01, 0xe3, 0x92, 0x54, 0xdb, 0x28, 0xd1, 0x5f, 0xf6, 0x6d, 0x79, 0xed, 0x1c, 0x7d, 0x04, 0x08, 0x00, 0x01, 0x21, 0x12, 0x6c, 0x5f, 0xdd, 0x0e, 0x85, 0x4f, 0x40, 0x40, 0x00, 0x04, 0xf1, 0xfd, 0x3d, 0x54, // Entry 240 - 27F 0xe8, 0x03, 0xb4, 0x27, 0x23, 0x0d, 0x00, 0x00, 0x20, 0x7b, 0x38, 0x02, 0x05, 0x84, 0x00, 0xf0, 0xbb, 0x7e, 0x5a, 0x00, 0x18, 0x04, 0x81, 0x00, 0x00, 0x00, 0x80, 0x10, 0x90, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x04, 0x08, 0xa0, 0x70, 0xa5, 0x0c, 0x40, 0x00, 0x00, 0x11, 0x04, 0x04, 0x68, 0x00, 0x20, 0x70, 0xff, 0x7b, 0x7f, 0x60, 0x00, 0x05, 0x9b, 0xdd, 0x66, // Entry 280 - 2BF 0x03, 0x00, 0x11, 0x00, 0x00, 0x00, 0x40, 0x05, 0xb5, 0xb6, 0x80, 0x08, 0x04, 0x00, 0x04, 0x51, 0xe2, 0xef, 0xfd, 0x3f, 0x05, 0x09, 0x08, 0x05, 0x40, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x60, 0xe5, 0x48, 0x00, 0x81, 0x20, 0xc0, 0x05, 0x80, 0x03, 0x00, 0x00, 0x00, 0xcc, 0x50, 0x40, 0x04, 0x84, 0x47, 0x84, 0x40, 0x20, 0x10, 0x00, 0x20, // Entry 2C0 - 2FF 0x02, 0x50, 0x80, 0x11, 0x00, 0x91, 0x6c, 0xe2, 0x50, 0x27, 0x1d, 0x11, 0x29, 0x06, 0x59, 0xe9, 0x33, 0x08, 0x00, 0x20, 0x04, 0x40, 0x10, 0x00, 0x00, 0x00, 0x50, 0x44, 0x92, 0x49, 0xd6, 0x5d, 0xa7, 0x81, 0x47, 0x97, 0xfb, 0x00, 0x10, 0x00, 0x08, 0x00, 0x80, 0x00, 0x40, 0x04, 0x00, 0x01, 0x02, 0x00, 0x01, 0x40, 0x80, 0x00, 0x00, 0x08, 0xd8, 0xeb, 0xf6, 0x39, 0xc4, 0x89, 0x12, 0x00, // Entry 300 - 33F 0x00, 0x0c, 0x04, 0x01, 0x20, 0x20, 0xdd, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x04, 0x10, 0xd0, 0x9d, 0x95, 0x13, 0x04, 0x80, 0x00, 0x01, 0xd0, 0x12, 0x40, 0x00, 0x10, 0xb0, 0x10, 0x62, 0x4c, 0xd2, 0x02, 0x01, 0x4a, 0x00, 0x46, 0x04, 0x00, 0x08, 0x02, 0x00, 0x20, 0x80, 0x00, 0x80, 0x06, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xd8, 0x6f, 0x15, 0x02, 0x08, 0x00, // Entry 340 - 37F 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0xf0, 0x84, 0xe3, 0xdd, 0xbf, 0xf9, 0xf9, 0x3b, 0x7f, 0x7f, 0xdb, 0xfd, 0xfc, 0xfe, 0xdf, 0xff, 0xfd, 0xff, 0xf6, 0xfb, 0xfc, 0xf7, 0x1f, 0xff, 0xb3, 0x6c, 0xff, 0xd9, 0xad, 0xdf, 0xfe, 0xef, 0xba, 0xdf, 0xff, 0xff, 0xff, 0xb7, 0xdd, 0x7d, 0xbf, 0xab, 0xff, 0xfd, 0xfd, 0xdf, 0x2f, 0x9c, 0xdf, 0xf3, 0x6f, // Entry 380 - 3BF 0xdf, 0xdd, 0xff, 0xfb, 0xee, 0xd2, 0xab, 0x5f, 0xd5, 0xdf, 0x7f, 0xff, 0xeb, 0xff, 0xe4, 0x4d, 0xf9, 0xff, 0xfe, 0xf7, 0xfd, 0xdf, 0xfb, 0xbf, 0xee, 0xdb, 0x6f, 0xef, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0x5f, 0xd3, 0x3b, 0xfd, 0xd9, 0xdf, 0xeb, 0xbc, 0x08, 0x05, 0x24, 0xff, 0x07, 0x70, 0xfe, 0xe6, 0x5e, 0x00, 0x08, 0x00, 0x83, 0x3d, 0x1b, 0x06, 0xe6, 0x72, 0x60, 0xd1, 0x3c, 0x7f, 0x44, // Entry 3C0 - 3FF 0x02, 0x30, 0x9f, 0x7a, 0x16, 0xbd, 0x7f, 0x57, 0xf2, 0xff, 0x31, 0xff, 0xf2, 0x1e, 0x90, 0xf7, 0xf1, 0xf9, 0x45, 0x80, 0x01, 0x02, 0x00, 0x00, 0x40, 0x54, 0x9f, 0x8a, 0xd9, 0xd9, 0x0e, 0x11, 0x84, 0x51, 0xc0, 0xf3, 0xfb, 0x47, 0x00, 0x01, 0x05, 0xd1, 0x50, 0x58, 0x00, 0x00, 0x00, 0x10, 0x04, 0x02, 0x00, 0x00, 0x0a, 0x00, 0x17, 0xd2, 0xb9, 0xfd, 0xfc, 0xba, 0xfe, 0xef, 0xc7, 0xbe, // Entry 400 - 43F 0x53, 0x6f, 0xdf, 0xe7, 0xdb, 0x65, 0xbb, 0x7f, 0xfa, 0xff, 0x77, 0xf3, 0xef, 0xbf, 0xfd, 0xf7, 0xdf, 0xdf, 0x9b, 0x7f, 0xff, 0xff, 0x7f, 0x6f, 0xf7, 0xfb, 0xeb, 0xdf, 0xbc, 0xff, 0xbf, 0x6b, 0x7b, 0xfb, 0xff, 0xce, 0x76, 0xbd, 0xf7, 0xf7, 0xdf, 0xdc, 0xf7, 0xf7, 0xff, 0xdf, 0xf3, 0xfe, 0xef, 0xff, 0xff, 0xff, 0xb6, 0x7f, 0x7f, 0xde, 0xf7, 0xb9, 0xeb, 0x77, 0xff, 0xfb, 0xbf, 0xdf, // Entry 440 - 47F 0xfd, 0xfe, 0xfb, 0xff, 0xfe, 0xeb, 0x1f, 0x7d, 0x2f, 0xfd, 0xb6, 0xb5, 0xa5, 0xfc, 0xff, 0xfd, 0x7f, 0x4e, 0xbf, 0x8e, 0xae, 0xff, 0xee, 0xdf, 0x7f, 0xf7, 0x73, 0x02, 0x02, 0x04, 0xfc, 0xf7, 0xff, 0xb7, 0xd7, 0xef, 0xfe, 0xcd, 0xf5, 0xce, 0xe2, 0x8e, 0xe7, 0xbf, 0xb7, 0xff, 0x56, 0xbd, 0xcd, 0xff, 0xfb, 0xff, 0xdf, 0xd7, 0xea, 0xff, 0xe5, 0x5f, 0x6d, 0x0f, 0xa7, 0x51, 0x04, 0x44, // Entry 480 - 4BF 0x13, 0x50, 0x5d, 0xaf, 0xa6, 0xfd, 0x99, 0xfb, 0x63, 0x1d, 0x53, 0xff, 0xef, 0xb7, 0x35, 0x20, 0x14, 0x00, 0x55, 0x51, 0x82, 0x65, 0xf5, 0x41, 0xe2, 0xff, 0xfc, 0xdf, 0x00, 0x05, 0xc5, 0x05, 0x00, 0x22, 0x00, 0x74, 0x69, 0x10, 0x08, 0x04, 0x41, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x20, 0x05, 0x04, 0x01, 0x00, 0x00, 0x06, 0x01, 0x20, 0x00, 0x18, 0x01, 0x92, 0xb1, // Entry 4C0 - 4FF 0xfd, 0x47, 0x49, 0x06, 0x95, 0x06, 0x57, 0xed, 0xfb, 0x4c, 0x1c, 0x6b, 0x83, 0x04, 0x62, 0x40, 0x00, 0x11, 0x42, 0x00, 0x00, 0x00, 0x54, 0x83, 0xb8, 0x4f, 0x10, 0x8c, 0x89, 0x46, 0xde, 0xf7, 0x13, 0x31, 0x00, 0x20, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x10, 0x00, 0x01, 0x00, 0x00, 0xf0, 0x5b, 0xf4, 0xbe, 0x3d, 0xba, 0xcf, 0xf7, 0xaf, 0x42, 0x04, 0x84, 0x41, // Entry 500 - 53F 0x30, 0xff, 0x79, 0x72, 0x04, 0x00, 0x00, 0x49, 0x2d, 0x14, 0x27, 0x57, 0xed, 0xf1, 0x3f, 0xe7, 0x3f, 0x00, 0x00, 0x02, 0xc6, 0xa0, 0x1e, 0xf8, 0xbb, 0xff, 0xfd, 0xfb, 0xb7, 0xfd, 0xe5, 0xf7, 0xfd, 0xfc, 0xd5, 0xed, 0x47, 0xf4, 0x7e, 0x10, 0x01, 0x01, 0x84, 0x6d, 0xff, 0xf7, 0xdd, 0xf9, 0x5b, 0x05, 0x86, 0xed, 0xf5, 0x77, 0xbd, 0x3c, 0x00, 0x00, 0x00, 0x42, 0x71, 0x42, 0x00, 0x40, // Entry 540 - 57F 0x00, 0x00, 0x01, 0x43, 0x19, 0x00, 0x08, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // Entry 580 - 5BF 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xab, 0xbd, 0xe7, 0x57, 0xee, 0x13, 0x5d, 0x09, 0xc1, 0x40, 0x21, 0xfa, 0x17, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xce, 0xfb, 0xbf, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x30, 0x15, 0xa3, 0x10, 0x00, 0x00, 0x00, 0x11, 0x04, 0x16, 0x00, 0x00, 0x02, 0x00, 0x81, 0xa3, 0x01, 0x50, 0x00, 0x00, 0x83, 0x11, 0x40, // Entry 5C0 - 5FF 0x00, 0x00, 0x00, 0xf0, 0xdd, 0x7b, 0x3e, 0x02, 0xaa, 0x10, 0x5d, 0x98, 0x52, 0x00, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x02, 0x19, 0x00, 0x10, 0x02, 0x10, 0x61, 0x5a, 0x9d, 0x31, 0x00, 0x00, 0x00, 0x01, 0x10, 0x02, 0x20, 0x00, 0x00, 0x01, 0x00, 0x42, 0x00, 0x20, 0x00, 0x00, 0x1f, 0xdf, 0xf2, 0xb9, 0xff, 0xfd, 0x3f, 0x1f, 0x18, 0xcf, 0x9c, 0xbf, 0xaf, 0x5f, 0xfe, // Entry 600 - 63F 0x7b, 0x4b, 0x40, 0x10, 0xe1, 0xfd, 0xaf, 0xd9, 0xb7, 0xf6, 0xfb, 0xb3, 0xc7, 0xff, 0x6f, 0xf1, 0x73, 0xb1, 0x7f, 0x9f, 0x7f, 0xbd, 0xfc, 0xb7, 0xee, 0x1c, 0xfa, 0xcb, 0xef, 0xdd, 0xf9, 0xbd, 0x6e, 0xae, 0x55, 0xfd, 0x6e, 0x81, 0x76, 0x1f, 0xd4, 0x77, 0xf5, 0x7d, 0xfb, 0xff, 0xeb, 0xfe, 0xbe, 0x5f, 0x46, 0x1b, 0xe9, 0x5f, 0x50, 0x18, 0x02, 0xfa, 0xf7, 0x9d, 0x15, 0x97, 0x05, 0x0f, // Entry 640 - 67F 0x75, 0xc4, 0x7d, 0x81, 0x82, 0xf1, 0x57, 0x6c, 0xff, 0xe4, 0xef, 0x6f, 0xff, 0xfc, 0xdd, 0xde, 0xfc, 0xfd, 0x76, 0x5f, 0x7a, 0x1f, 0x00, 0x98, 0x02, 0xfb, 0xa3, 0xef, 0xf3, 0xd6, 0xf2, 0xff, 0xb9, 0xda, 0x7d, 0x50, 0x1e, 0x15, 0x7b, 0xb4, 0xf5, 0x3e, 0xff, 0xff, 0xf1, 0xf7, 0xff, 0xe7, 0x5f, 0xff, 0xff, 0x9e, 0xdb, 0xf6, 0xd7, 0xb9, 0xef, 0x27, 0x80, 0xbb, 0xc5, 0xff, 0xff, 0xe3, // Entry 680 - 6BF 0x97, 0x9d, 0xbf, 0x9f, 0xf7, 0xc7, 0xfd, 0x37, 0xce, 0x7f, 0x04, 0x1d, 0x53, 0x7f, 0xf8, 0xda, 0x5d, 0xce, 0x7d, 0x06, 0xb9, 0xea, 0x69, 0xa0, 0x1a, 0x20, 0x00, 0x30, 0x02, 0x04, 0x24, 0x08, 0x04, 0x00, 0x00, 0x40, 0xd4, 0x02, 0x04, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x20, 0x01, 0x06, 0x50, 0x00, 0x08, 0x00, 0x00, 0x00, 0x24, 0x00, 0x04, 0x00, 0x10, 0x8c, 0x58, 0xd5, 0x0d, 0x0f, // Entry 6C0 - 6FF 0x14, 0x4d, 0xf1, 0x16, 0x44, 0xd1, 0x42, 0x08, 0x40, 0x00, 0x00, 0x40, 0x00, 0x08, 0x00, 0x00, 0x00, 0xdc, 0xfb, 0xcb, 0x0e, 0x58, 0x08, 0x41, 0x04, 0x20, 0x04, 0x00, 0x30, 0x12, 0x40, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x10, 0x10, 0xab, 0x6d, 0x93, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x25, 0x00, 0x00, // Entry 700 - 73F 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x80, 0x86, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x01, 0xdf, 0x18, 0x00, 0x00, 0x02, 0xf0, 0xfd, 0x79, 0x3b, 0x00, 0x25, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x03, 0x00, 0x09, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 740 - 77F 0x00, 0x00, 0x00, 0xef, 0xd5, 0xfd, 0xcf, 0x7e, 0xa0, 0x11, 0x00, 0x00, 0x00, 0x92, 0x01, 0x44, 0xcd, 0xf9, 0x5c, 0x00, 0x01, 0x00, 0x30, 0x04, 0x04, 0x55, 0x00, 0x01, 0x04, 0xf4, 0x3f, 0x4a, 0x01, 0x00, 0x00, 0xb0, 0x80, 0x00, 0x55, 0x55, 0x97, 0x7c, 0x9f, 0x31, 0xcc, 0x68, 0xd1, 0x03, 0xd5, 0x57, 0x27, 0x14, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0xf7, 0xcb, 0x1f, 0x14, 0x60, // Entry 780 - 7BF 0x03, 0x68, 0x01, 0x10, 0x8b, 0x38, 0x8a, 0x01, 0x00, 0x00, 0x20, 0x00, 0x24, 0x44, 0x00, 0x00, 0x10, 0x03, 0x11, 0x02, 0x01, 0x00, 0x00, 0xf0, 0xf5, 0xff, 0xd5, 0x97, 0xbc, 0x70, 0xd6, 0x78, 0x78, 0x15, 0x50, 0x00, 0xa4, 0x84, 0xa9, 0x41, 0x00, 0x00, 0x00, 0x6b, 0x39, 0x52, 0x74, 0x00, 0xe8, 0x30, 0x90, 0x6a, 0x92, 0x00, 0x00, 0x02, 0xff, 0xef, 0xff, 0x4b, 0x85, 0x53, 0xf4, 0xed, // Entry 7C0 - 7FF 0xdd, 0xbf, 0x72, 0x19, 0xc7, 0x0c, 0xd5, 0x42, 0x54, 0xdd, 0x77, 0x14, 0x00, 0x80, 0x40, 0x56, 0xcc, 0x16, 0x9e, 0xea, 0x35, 0x7d, 0xef, 0xff, 0xbd, 0xa4, 0xaf, 0x01, 0x44, 0x18, 0x01, 0x4d, 0x4e, 0x4a, 0x08, 0x50, 0x28, 0x30, 0xe0, 0x80, 0x10, 0x20, 0x24, 0x00, 0xff, 0x2f, 0xd3, 0x60, 0xfe, 0x01, 0x02, 0x88, 0x0a, 0x40, 0x16, 0x01, 0x01, 0x15, 0x2b, 0x3c, 0x01, 0x00, 0x00, 0x10, // Entry 800 - 83F 0x90, 0x49, 0x41, 0x02, 0x02, 0x01, 0xe1, 0xbf, 0xbf, 0x03, 0x00, 0x00, 0x10, 0xd4, 0xa3, 0xd1, 0x40, 0x9c, 0x44, 0xdf, 0xf5, 0x8f, 0x66, 0xb3, 0x55, 0x20, 0xd4, 0xc1, 0xd8, 0x30, 0x3d, 0x80, 0x00, 0x00, 0x00, 0x04, 0xd4, 0x11, 0xc5, 0x84, 0x2e, 0x50, 0x00, 0x22, 0x50, 0x6e, 0xbd, 0x93, 0x07, 0x00, 0x20, 0x10, 0x84, 0xb2, 0x45, 0x10, 0x06, 0x44, 0x00, 0x00, 0x12, 0x02, 0x11, 0x00, // Entry 840 - 87F 0xf0, 0xfb, 0xfd, 0x3f, 0x05, 0x00, 0x12, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x02, 0x28, 0x84, 0x00, 0x23, 0xc0, 0x23, 0x24, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0x3a, 0x42, 0x88, 0x14, 0xf1, 0xef, 0xff, 0x7f, 0x12, 0x01, 0x01, 0x84, 0x50, 0x07, 0xfc, 0xff, 0xff, 0x0f, 0x01, 0x00, 0x40, 0x10, 0x38, 0x01, 0x01, 0x1c, 0x12, 0x40, 0xe1, // Entry 880 - 8BF 0x76, 0x16, 0x08, 0x03, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x24, 0x0a, 0x00, 0x80, 0x00, 0x00, } // altLangISO3 holds an alphabetically sorted list of 3-letter language code alternatives // to 2-letter language codes that cannot be derived using the method described above. // Each 3-letter code is followed by its 1-byte langID. const altLangISO3 tag.Index = "---\x00cor\x00hbs\x01heb\x02kin\x03spa\x04yid\x05\xff\xff\xff\xff" // altLangIndex is used to convert indexes in altLangISO3 to langIDs. // Size: 12 bytes, 6 elements var altLangIndex = [6]uint16{ 0x0278, 0x03fd, 0x01f3, 0x03dc, 0x0139, 0x0200, } // langAliasMap maps langIDs to their suggested replacements. // Size: 644 bytes, 161 elements var langAliasMap = [161]fromTo{ 0: {from: 0x81, to: 0x87}, 1: {from: 0x181, to: 0x1a7}, 2: {from: 0x1eb, to: 0x1da}, 3: {from: 0x1f3, to: 0x1b5}, 4: {from: 0x200, to: 0x508}, 5: {from: 0x207, to: 0x206}, 6: {from: 0x307, to: 0x3d3}, 7: {from: 0x33e, to: 0x366}, 8: {from: 0x3fd, to: 0x428}, 9: {from: 0x470, to: 0x14e}, 10: {from: 0x486, to: 0x447}, 11: {from: 0x498, to: 0x20}, 12: {from: 0x533, to: 0x539}, 13: {from: 0x584, to: 0x129}, 14: {from: 0x625, to: 0x1ea6}, 15: {from: 0x646, to: 0x427}, 16: {from: 0x657, to: 0x427}, 17: {from: 0x6e2, to: 0x39}, 18: {from: 0x6ed, to: 0x1d0}, 19: {from: 0x733, to: 0x2196}, 20: {from: 0x7a8, to: 0x55}, 21: {from: 0x7ae, to: 0x2990}, 22: {from: 0x7ba, to: 0x57}, 23: {from: 0x7db, to: 0x140}, 24: {from: 0x801, to: 0x59}, 25: {from: 0x80a, to: 0x8c}, 26: {from: 0x873, to: 0x805}, 27: {from: 0x8b8, to: 0xed8}, 28: {from: 0x9e4, to: 0x328}, 29: {from: 0xa2b, to: 0x2bc}, 30: {from: 0xa32, to: 0xbd}, 31: {from: 0xab3, to: 0x3317}, 32: {from: 0xb2d, to: 0x51f}, 33: {from: 0xb6a, to: 0x264f}, 34: {from: 0xb73, to: 0xbb8}, 35: {from: 0xb90, to: 0x444}, 36: {from: 0xbb1, to: 0x421e}, 37: {from: 0xbb4, to: 0x51f}, 38: {from: 0xbf3, to: 0x2d9c}, 39: {from: 0xc23, to: 0x3176}, 40: {from: 0xcae, to: 0xf0}, 41: {from: 0xcfd, to: 0xf6}, 42: {from: 0xdbd, to: 0x116}, 43: {from: 0xdcc, to: 0x324}, 44: {from: 0xded, to: 0xdf0}, 45: {from: 0xdf3, to: 0x526}, 46: {from: 0xed4, to: 0x204f}, 47: {from: 0xee3, to: 0x2e8f}, 48: {from: 0xf2e, to: 0x35e}, 49: {from: 0x10c5, to: 0x13b}, 50: {from: 0x10f9, to: 0x2c7}, 51: {from: 0x1195, to: 0x1e4}, 52: {from: 0x126e, to: 0x20}, 53: {from: 0x1419, to: 0x159}, 54: {from: 0x1465, to: 0x149}, 55: {from: 0x1514, to: 0xd90}, 56: {from: 0x1518, to: 0x387}, 57: {from: 0x1527, to: 0x16ba}, 58: {from: 0x1575, to: 0x208}, 59: {from: 0x1578, to: 0x109}, 60: {from: 0x1598, to: 0x3ca4}, 61: {from: 0x165f, to: 0x195}, 62: {from: 0x16bd, to: 0x131}, 63: {from: 0x16f5, to: 0x29ed}, 64: {from: 0x170d, to: 0x18e}, 65: {from: 0x171c, to: 0xf34}, 66: {from: 0x176f, to: 0x1519}, 67: {from: 0x17fe, to: 0x17ab}, 68: {from: 0x180b, to: 0x18e8}, 69: {from: 0x187f, to: 0x42c}, 70: {from: 0x196e, to: 0x1cf6}, 71: {from: 0x1a69, to: 0x2ba5}, 72: {from: 0x1a7f, to: 0x1f0}, 73: {from: 0x1b4f, to: 0x1f2}, 74: {from: 0x1b7b, to: 0x150a}, 75: {from: 0x202d, to: 0x37a6}, 76: {from: 0x2032, to: 0x20d2}, 77: {from: 0x204f, to: 0x302}, 78: {from: 0x20d8, to: 0x26b}, 79: {from: 0x20e3, to: 0x25a}, 80: {from: 0x20e7, to: 0x225}, 81: {from: 0x20ee, to: 0x24d}, 82: {from: 0x2104, to: 0x21e0}, 83: {from: 0x212a, to: 0x274}, 84: {from: 0x218e, to: 0x11d}, 85: {from: 0x21c3, to: 0x1556}, 86: {from: 0x21db, to: 0x4fa}, 87: {from: 0x21e9, to: 0x495}, 88: {from: 0x2222, to: 0x11d}, 89: {from: 0x222c, to: 0x11d}, 90: {from: 0x2257, to: 0x91f}, 91: {from: 0x230b, to: 0x321b}, 92: {from: 0x2377, to: 0x335a}, 93: {from: 0x2467, to: 0x2be}, 94: {from: 0x24d9, to: 0x2f6}, 95: {from: 0x24e5, to: 0x2f1}, 96: {from: 0x24ef, to: 0x316}, 97: {from: 0x2545, to: 0xb50}, 98: {from: 0x259e, to: 0xe0}, 99: {from: 0x2633, to: 0x2c7}, 100: {from: 0x26be, to: 0x26a9}, 101: {from: 0x26ee, to: 0x3bf}, 102: {from: 0x271c, to: 0x3ca4}, 103: {from: 0x275a, to: 0x26a9}, 104: {from: 0x277e, to: 0x434d}, 105: {from: 0x28e4, to: 0x282c}, 106: {from: 0x2909, to: 0x348}, 107: {from: 0x297b, to: 0x2d9c}, 108: {from: 0x2b0f, to: 0x384}, 109: {from: 0x2bf1, to: 0x38c}, 110: {from: 0x2c34, to: 0x3ca4}, 111: {from: 0x2cf1, to: 0x3b5}, 112: {from: 0x2d08, to: 0x58c}, 113: {from: 0x2d3c, to: 0x143}, 114: {from: 0x2d3d, to: 0x143}, 115: {from: 0x2df4, to: 0x2e8}, 116: {from: 0x2dfd, to: 0x19c1}, 117: {from: 0x2e0f, to: 0x2d8a}, 118: {from: 0x2e16, to: 0x289}, 119: {from: 0x2e49, to: 0x7c}, 120: {from: 0x2e5a, to: 0x2277}, 121: {from: 0x2e95, to: 0x2e90}, 122: {from: 0x2ee4, to: 0x2ecc}, 123: {from: 0x3188, to: 0x3bb}, 124: {from: 0x335b, to: 0x3383}, 125: {from: 0x341f, to: 0x3d3}, 126: {from: 0x34e3, to: 0x18c5}, 127: {from: 0x35db, to: 0x408}, 128: {from: 0x364d, to: 0x23e}, 129: {from: 0x366b, to: 0x3ea}, 130: {from: 0x36f2, to: 0x43b}, 131: {from: 0x37b5, to: 0x11d}, 132: {from: 0x380b, to: 0x38e7}, 133: {from: 0x3820, to: 0x2c90}, 134: {from: 0x3824, to: 0xa7}, 135: {from: 0x3827, to: 0x321d}, 136: {from: 0x3861, to: 0x399b}, 137: {from: 0x3887, to: 0x3fb5}, 138: {from: 0x389a, to: 0x39cc}, 139: {from: 0x38a9, to: 0x1f99}, 140: {from: 0x38aa, to: 0x2e8f}, 141: {from: 0x3951, to: 0x474}, 142: {from: 0x3b43, to: 0xd86}, 143: {from: 0x3b6d, to: 0x132}, 144: {from: 0x3c8e, to: 0x4b2}, 145: {from: 0x3fb2, to: 0xfc}, 146: {from: 0x41fd, to: 0xa86}, 147: {from: 0x42b3, to: 0x568}, 148: {from: 0x42ee, to: 0x3f55}, 149: {from: 0x436d, to: 0x251}, 150: {from: 0x43c0, to: 0x36c0}, 151: {from: 0x43c2, to: 0x10b}, 152: {from: 0x44a4, to: 0x3317}, 153: {from: 0x44d8, to: 0x508}, 154: {from: 0x45bf, to: 0x23fe}, 155: {from: 0x45d2, to: 0x26d1}, 156: {from: 0x4605, to: 0x48a3}, 157: {from: 0x46a3, to: 0x4695}, 158: {from: 0x4733, to: 0x473a}, 159: {from: 0x490b, to: 0x316}, 160: {from: 0x499c, to: 0x519}, } // Size: 161 bytes, 161 elements var langAliasTypes = [161]langAliasType{ // Entry 0 - 3F 1, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 1, 0, 0, 1, 2, 1, 1, 2, 0, 1, 0, 1, 2, 1, 1, 0, 0, 2, 1, 1, 0, 2, 0, 0, 1, 0, 1, 0, 0, 1, 2, 1, 1, 1, 1, 0, 0, 2, 1, 1, 1, 1, 2, 1, 0, 1, 1, 2, 2, 0, 1, 2, 0, // Entry 40 - 7F 1, 0, 1, 1, 1, 1, 0, 0, 2, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 2, 2, 2, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 2, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 2, 0, 2, // Entry 80 - BF 1, 1, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 2, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, } const ( _Latn = 82 _Hani = 50 _Hans = 52 _Hant = 53 _Qaaa = 131 _Qaai = 139 _Qabx = 180 _Zinh = 224 _Zyyy = 229 _Zzzz = 230 ) // script is an alphabetically sorted list of ISO 15924 codes. The index // of the script in the string, divided by 4, is the internal scriptID. const script tag.Index = "" + // Size: 928 bytes "----AdlmAfakAghbAhomArabAranArmiArmnAvstBaliBamuBassBatkBengBhksBlisBopo" + "BrahBraiBugiBuhdCakmCansCariChamCherCirtCoptCprtCyrlCyrsDevaDsrtDuplEgyd" + "EgyhEgypElbaEthiGeokGeorGlagGothGranGrekGujrGuruHanbHangHaniHanoHansHant" + "HatrHebrHiraHluwHmngHrktHungIndsItalJamoJavaJpanJurcKaliKanaKharKhmrKhoj" + "KitlKitsKndaKoreKpelKthiLanaLaooLatfLatgLatnLekeLepcLimbLinaLinbLisuLoma" + "LyciLydiMahjMandManiMarcMayaMendMercMeroMlymModiMongMoonMrooMteiMultMymr" + "NarbNbatNewaNkgbNkooNshuOgamOlckOrkhOryaOsgeOsmaPalmPaucPermPhagPhliPhlp" + "PhlvPhnxPiqdPlrdPrtiQaaaQaabQaacQaadQaaeQaafQaagQaahQaaiQaajQaakQaalQaam" + "QaanQaaoQaapQaaqQaarQaasQaatQaauQaavQaawQaaxQaayQaazQabaQabbQabcQabdQabe" + "QabfQabgQabhQabiQabjQabkQablQabmQabnQaboQabpQabqQabrQabsQabtQabuQabvQabw" + "QabxRjngRoroRunrSamrSaraSarbSaurSgnwShawShrdSiddSindSinhSoraSundSyloSyrc" + "SyreSyrjSyrnTagbTakrTaleTaluTamlTangTavtTeluTengTfngTglgThaaThaiTibtTirh" + "UgarVaiiVispWaraWoleXpeoXsuxYiiiZinhZmthZsyeZsymZxxxZyyyZzzz\xff\xff\xff" + "\xff" // suppressScript is an index from langID to the dominant script for that language, // if it exists. If a script is given, it should be suppressed from the language tag. // Size: 1319 bytes, 1319 elements var suppressScript = [1319]uint8{ // Entry 0 - 3F 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 40 - 7F 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, // Entry 80 - BF 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry C0 - FF 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x52, 0x00, 0x00, // Entry 100 - 13F 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x52, 0x00, 0x00, 0x52, 0x00, 0x52, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, // Entry 140 - 17F 0x52, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x52, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 180 - 1BF 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 1C0 - 1FF 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x52, 0x00, 0x52, 0x52, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x52, 0x52, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 200 - 23F 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x52, 0x00, 0x00, // Entry 240 - 27F 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 280 - 2BF 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, // Entry 2C0 - 2FF 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, // Entry 300 - 33F 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x52, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, // Entry 340 - 37F 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x52, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x52, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, // Entry 380 - 3BF 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x52, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, // Entry 3C0 - 3FF 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 400 - 43F 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x52, 0x00, 0x00, 0x00, 0x00, // Entry 440 - 47F 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x52, 0x00, 0x52, 0x00, 0x52, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, // Entry 480 - 4BF 0x52, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 4C0 - 4FF 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 500 - 53F 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, } const ( _001 = 1 _419 = 30 _BR = 64 _CA = 72 _ES = 109 _GB = 122 _MD = 187 _PT = 237 _UK = 305 _US = 308 _ZZ = 356 _XA = 322 _XC = 324 _XK = 332 ) // isoRegionOffset needs to be added to the index of regionISO to obtain the regionID // for 2-letter ISO codes. (The first isoRegionOffset regionIDs are reserved for // the UN.M49 codes used for groups.) const isoRegionOffset = 31 // regionTypes defines the status of a region for various standards. // Size: 357 bytes, 357 elements var regionTypes = [357]uint8{ // Entry 0 - 3F 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, // Entry 40 - 7F 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, // Entry 80 - BF 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, // Entry C0 - FF 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, 0x00, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, // Entry 100 - 13F 0x05, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x02, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, // Entry 140 - 17F 0x00, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, 0x04, 0x06, 0x05, } // regionISO holds a list of alphabetically sorted 2-letter ISO region codes. // Each 2-letter codes is followed by two bytes with the following meaning: // - [A-Z}{2}: the first letter of the 2-letter code plus these two // letters form the 3-letter ISO code. // - 0, n: index into altRegionISO3. const regionISO tag.Index = "" + // Size: 1308 bytes "AAAAACSCADNDAEREAFFGAGTGAIIAALLBAMRMANNTAOGOAQTAARRGASSMATUTAUUSAWBWAXLA" + "AZZEBAIHBBRBBDGDBEELBFFABGGRBHHRBIDIBJENBLLMBMMUBNRNBOOLBQESBRRABSHSBTTN" + "BUURBVVTBWWABYLRBZLZCAANCCCKCDODCFAFCGOGCHHECIIVCKOKCLHLCMMRCNHNCOOLCPPT" + "CRRICS\x00\x00CTTECUUBCVPVCWUWCXXRCYYPCZZEDDDRDEEUDGGADJJIDKNKDMMADOOMDY" + "HYDZZAEA ECCUEESTEGGYEHSHERRIESSPETTHEU\x00\x03EZ FIINFJJIFKLKFMSMFORO" + "FQ\x00\x18FRRAFXXXGAABGBBRGDRDGEEOGFUFGGGYGHHAGIIBGLRLGMMBGNINGPLPGQNQGR" + "RCGS\x00\x06GTTMGUUMGWNBGYUYHKKGHMMDHNNDHRRVHTTIHUUNHVVOIC IDDNIERLILSR" + "IMMNINNDIOOTIQRQIRRNISSLITTAJEEYJMAMJOORJPPNJTTNKEENKGGZKHHMKIIRKM\x00" + "\x09KNNAKP\x00\x0cKRORKWWTKY\x00\x0fKZAZLAAOLBBNLCCALIIELKKALRBRLSSOLTTU" + "LUUXLVVALYBYMAARMCCOMDDAMENEMFAFMGDGMHHLMIIDMKKDMLLIMMMRMNNGMOACMPNPMQTQ" + "MRRTMSSRMTLTMUUSMVDVMWWIMXEXMYYSMZOZNAAMNCCLNEERNFFKNGGANHHBNIICNLLDNOOR" + "NPPLNQ\x00\x1eNRRUNTTZNUIUNZZLOMMNPAANPCCIPEERPFYFPGNGPHHLPKAKPLOLPM\x00" + "\x12PNCNPRRIPSSEPTRTPUUSPWLWPYRYPZCZQAATQMMMQNNNQOOOQPPPQQQQQRRRQSSSQTTT" + "QU\x00\x03QVVVQWWWQXXXQYYYQZZZREEURHHOROOURS\x00\x15RUUSRWWASAAUSBLBSCYC" + "SDDNSEWESGGPSHHNSIVNSJJMSKVKSLLESMMRSNENSOOMSRURSSSDSTTPSUUNSVLVSXXMSYYR" + "SZWZTAAATCCATDCDTF\x00\x18TGGOTHHATJJKTKKLTLLSTMKMTNUNTOONTPMPTRURTTTOTV" + "UVTWWNTZZAUAKRUGGAUK UMMIUN USSAUYRYUZZBVAATVCCTVDDRVEENVGGBVIIRVNNMVU" + "UTWFLFWKAKWSSMXAAAXBBBXCCCXDDDXEEEXFFFXGGGXHHHXIIIXJJJXKKKXLLLXMMMXNNNXO" + "OOXPPPXQQQXRRRXSSSXTTTXUUUXVVVXWWWXXXXXYYYXZZZYDMDYEEMYT\x00\x1bYUUGZAAF" + "ZMMBZRARZWWEZZZZ\xff\xff\xff\xff" // altRegionISO3 holds a list of 3-letter region codes that cannot be // mapped to 2-letter codes using the default algorithm. This is a short list. const altRegionISO3 string = "SCGQUUSGSCOMPRKCYMSPMSRBATFMYTATN" // altRegionIDs holds a list of regionIDs the positions of which match those // of the 3-letter ISO codes in altRegionISO3. // Size: 22 bytes, 11 elements var altRegionIDs = [11]uint16{ 0x0056, 0x006f, 0x0087, 0x00a7, 0x00a9, 0x00ac, 0x00e9, 0x0104, 0x0120, 0x015e, 0x00db, } // Size: 80 bytes, 20 elements var regionOldMap = [20]fromTo{ 0: {from: 0x43, to: 0xc3}, 1: {from: 0x57, to: 0xa6}, 2: {from: 0x5e, to: 0x5f}, 3: {from: 0x65, to: 0x3a}, 4: {from: 0x78, to: 0x77}, 5: {from: 0x92, to: 0x36}, 6: {from: 0xa2, to: 0x132}, 7: {from: 0xc0, to: 0x132}, 8: {from: 0xd6, to: 0x13e}, 9: {from: 0xdb, to: 0x2a}, 10: {from: 0xee, to: 0x132}, 11: {from: 0xf1, to: 0xe1}, 12: {from: 0xfb, to: 0x6f}, 13: {from: 0x102, to: 0x163}, 14: {from: 0x129, to: 0x125}, 15: {from: 0x131, to: 0x7a}, 16: {from: 0x139, to: 0x13d}, 17: {from: 0x140, to: 0x132}, 18: {from: 0x15c, to: 0x15d}, 19: {from: 0x162, to: 0x4a}, } // m49 maps regionIDs to UN.M49 codes. The first isoRegionOffset entries are // codes indicating collections of regions. // Size: 714 bytes, 357 elements var m49 = [357]int16{ // Entry 0 - 3F 0, 1, 2, 3, 5, 9, 11, 13, 14, 15, 17, 18, 19, 21, 29, 30, 34, 35, 39, 53, 54, 57, 61, 142, 143, 145, 150, 151, 154, 155, 419, 958, 0, 20, 784, 4, 28, 660, 8, 51, 530, 24, 10, 32, 16, 40, 36, 533, 248, 31, 70, 52, 50, 56, 854, 100, 48, 108, 204, 652, 60, 96, 68, 535, // Entry 40 - 7F 76, 44, 64, 104, 74, 72, 112, 84, 124, 166, 180, 140, 178, 756, 384, 184, 152, 120, 156, 170, 0, 188, 891, 296, 192, 132, 531, 162, 196, 203, 278, 276, 0, 262, 208, 212, 214, 204, 12, 0, 218, 233, 818, 732, 232, 724, 231, 967, 0, 246, 242, 238, 583, 234, 0, 250, 249, 266, 826, 308, 268, 254, 831, 288, // Entry 80 - BF 292, 304, 270, 324, 312, 226, 300, 239, 320, 316, 624, 328, 344, 334, 340, 191, 332, 348, 854, 0, 360, 372, 376, 833, 356, 86, 368, 364, 352, 380, 832, 388, 400, 392, 581, 404, 417, 116, 296, 174, 659, 408, 410, 414, 136, 398, 418, 422, 662, 438, 144, 430, 426, 440, 442, 428, 434, 504, 492, 498, 499, 663, 450, 584, // Entry C0 - FF 581, 807, 466, 104, 496, 446, 580, 474, 478, 500, 470, 480, 462, 454, 484, 458, 508, 516, 540, 562, 574, 566, 548, 558, 528, 578, 524, 10, 520, 536, 570, 554, 512, 591, 0, 604, 258, 598, 608, 586, 616, 666, 612, 630, 275, 620, 581, 585, 600, 591, 634, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, // Entry 100 - 13F 972, 638, 716, 642, 688, 643, 646, 682, 90, 690, 729, 752, 702, 654, 705, 744, 703, 694, 674, 686, 706, 740, 728, 678, 810, 222, 534, 760, 748, 0, 796, 148, 260, 768, 764, 762, 772, 626, 795, 788, 776, 626, 792, 780, 798, 158, 834, 804, 800, 826, 581, 0, 840, 858, 860, 336, 670, 704, 862, 92, 850, 704, 548, 876, // Entry 140 - 17F 581, 882, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 720, 887, 175, 891, 710, 894, 180, 716, 999, } // m49Index gives indexes into fromM49 based on the three most significant bits // of a 10-bit UN.M49 code. To search an UN.M49 code in fromM49, search in // fromM49[m49Index[msb39(code)]:m49Index[msb3(code)+1]] // for an entry where the first 7 bits match the 7 lsb of the UN.M49 code. // The region code is stored in the 9 lsb of the indexed value. // Size: 18 bytes, 9 elements var m49Index = [9]int16{ 0, 59, 107, 142, 180, 219, 258, 290, 332, } // fromM49 contains entries to map UN.M49 codes to regions. See m49Index for details. // Size: 664 bytes, 332 elements var fromM49 = [332]uint16{ // Entry 0 - 3F 0x0201, 0x0402, 0x0603, 0x0823, 0x0a04, 0x1026, 0x1205, 0x142a, 0x1606, 0x1866, 0x1a07, 0x1c08, 0x1e09, 0x202c, 0x220a, 0x240b, 0x260c, 0x2821, 0x2a0d, 0x3029, 0x3824, 0x3a0e, 0x3c0f, 0x3e31, 0x402b, 0x4410, 0x4611, 0x482e, 0x4e12, 0x502d, 0x5841, 0x6038, 0x6434, 0x6627, 0x6833, 0x6a13, 0x6c14, 0x7035, 0x7215, 0x783c, 0x7a16, 0x8042, 0x883e, 0x8c32, 0x9045, 0x9444, 0x9840, 0xa847, 0xac99, 0xb508, 0xb93b, 0xc03d, 0xc837, 0xd0c3, 0xd839, 0xe046, 0xe8a5, 0xf051, 0xf848, 0x0859, 0x10ac, 0x184b, 0x1c17, 0x1e18, // Entry 40 - 7F 0x20b2, 0x2219, 0x291f, 0x2c1a, 0x2e1b, 0x3050, 0x341c, 0x361d, 0x3852, 0x3d2d, 0x445b, 0x4c49, 0x5453, 0x5ca7, 0x5f5e, 0x644c, 0x684a, 0x704f, 0x7855, 0x7e8f, 0x8058, 0x885c, 0x965d, 0x983a, 0xa062, 0xa863, 0xac64, 0xb468, 0xbd19, 0xc485, 0xcc6e, 0xce6e, 0xd06c, 0xd269, 0xd475, 0xdc73, 0xde87, 0xe472, 0xec71, 0xf030, 0xf278, 0xf477, 0xfc7d, 0x04e4, 0x0920, 0x0c61, 0x1479, 0x187c, 0x1c82, 0x26ec, 0x285f, 0x2c5e, 0x305f, 0x407f, 0x4880, 0x50a6, 0x5886, 0x6081, 0x687b, 0x7084, 0x7889, 0x8088, 0x8883, 0x908b, // Entry 80 - BF 0x9890, 0x9c8d, 0xa137, 0xa88e, 0xb08c, 0xb891, 0xc09c, 0xc898, 0xd094, 0xd89b, 0xe09a, 0xe895, 0xf096, 0xf89d, 0x004e, 0x089f, 0x10a1, 0x1cad, 0x20a0, 0x28a3, 0x30a9, 0x34aa, 0x3cab, 0x42a4, 0x44ae, 0x461e, 0x4caf, 0x54b4, 0x58b7, 0x5cb3, 0x64b8, 0x6cb1, 0x70b5, 0x74b6, 0x7cc5, 0x84be, 0x8ccd, 0x94cf, 0x9ccc, 0xa4c2, 0xacca, 0xb4c7, 0xbcc8, 0xc0cb, 0xc8ce, 0xd8ba, 0xe0c4, 0xe4bb, 0xe6bc, 0xe8c9, 0xf0b9, 0xf8d0, 0x00e0, 0x08d1, 0x10dc, 0x18da, 0x20d8, 0x2428, 0x265a, 0x2a2f, 0x2d1a, 0x2e3f, 0x30dd, 0x38d2, // Entry C0 - FF 0x493e, 0x54df, 0x5cd7, 0x64d3, 0x6cd5, 0x74de, 0x7cd4, 0x84d9, 0x88c6, 0x8b32, 0x8e74, 0x90bf, 0x92ef, 0x94e7, 0x9ee1, 0xace5, 0xb0f0, 0xb8e3, 0xc0e6, 0xc8ea, 0xd0e8, 0xd8ed, 0xe08a, 0xe525, 0xeceb, 0xf4f2, 0xfd01, 0x0503, 0x0705, 0x0d06, 0x183b, 0x1d0d, 0x26a8, 0x2825, 0x2cb0, 0x2ebd, 0x34e9, 0x3d38, 0x4512, 0x4d17, 0x5507, 0x5d13, 0x6104, 0x6509, 0x6d11, 0x7d0c, 0x7f10, 0x813d, 0x830e, 0x8514, 0x8d60, 0x9963, 0xa15c, 0xa86d, 0xb116, 0xb30a, 0xb86b, 0xc10a, 0xc915, 0xd10f, 0xd91c, 0xe10b, 0xe84d, 0xf11b, // Entry 100 - 13F 0xf523, 0xf922, 0x0121, 0x0924, 0x1128, 0x192b, 0x2022, 0x2927, 0x312a, 0x3726, 0x391e, 0x3d2c, 0x4130, 0x492f, 0x4ec1, 0x5518, 0x646a, 0x747a, 0x7e7e, 0x809e, 0x8297, 0x852e, 0x9134, 0xa53c, 0xac36, 0xb535, 0xb936, 0xbd3a, 0xd93f, 0xe541, 0xed5d, 0xef5d, 0xf656, 0xfd61, 0x7c1f, 0x7ef3, 0x80f4, 0x82f5, 0x84f6, 0x86f7, 0x88f8, 0x8af9, 0x8cfa, 0x8e6f, 0x90fc, 0x92fd, 0x94fe, 0x96ff, 0x9900, 0x9b42, 0x9d43, 0x9f44, 0xa145, 0xa346, 0xa547, 0xa748, 0xa949, 0xab4a, 0xad4b, 0xaf4c, 0xb14d, 0xb34e, 0xb54f, 0xb750, // Entry 140 - 17F 0xb951, 0xbb52, 0xbd53, 0xbf54, 0xc155, 0xc356, 0xc557, 0xc758, 0xc959, 0xcb5a, 0xcd5b, 0xcf64, } // Size: 1463 bytes var variantIndex = map[string]uint8{ "1606nict": 0x0, "1694acad": 0x1, "1901": 0x2, "1959acad": 0x3, "1994": 0x45, "1996": 0x4, "abl1943": 0x5, "alalc97": 0x47, "aluku": 0x6, "ao1990": 0x7, "arevela": 0x8, "arevmda": 0x9, "baku1926": 0xa, "balanka": 0xb, "barla": 0xc, "basiceng": 0xd, "bauddha": 0xe, "biscayan": 0xf, "biske": 0x40, "bohoric": 0x10, "boont": 0x11, "colb1945": 0x12, "cornu": 0x13, "dajnko": 0x14, "ekavsk": 0x15, "emodeng": 0x16, "fonipa": 0x48, "fonnapa": 0x49, "fonupa": 0x4a, "fonxsamp": 0x4b, "hepburn": 0x17, "heploc": 0x46, "hognorsk": 0x18, "ijekavsk": 0x19, "itihasa": 0x1a, "jauer": 0x1b, "jyutping": 0x1c, "kkcor": 0x1d, "kociewie": 0x1e, "kscor": 0x1f, "laukika": 0x20, "lipaw": 0x41, "luna1918": 0x21, "metelko": 0x22, "monoton": 0x23, "ndyuka": 0x24, "nedis": 0x25, "newfound": 0x26, "njiva": 0x42, "nulik": 0x27, "osojs": 0x43, "oxendict": 0x28, "pamaka": 0x29, "petr1708": 0x2a, "pinyin": 0x2b, "polyton": 0x2c, "puter": 0x2d, "rigik": 0x2e, "rozaj": 0x2f, "rumgr": 0x30, "scotland": 0x31, "scouse": 0x32, "simple": 0x4c, "solba": 0x44, "sotav": 0x33, "surmiran": 0x34, "sursilv": 0x35, "sutsilv": 0x36, "tarask": 0x37, "uccor": 0x38, "ucrcor": 0x39, "ulster": 0x3a, "unifon": 0x3b, "vaidika": 0x3c, "valencia": 0x3d, "vallader": 0x3e, "wadegile": 0x3f, } // variantNumSpecialized is the number of specialized variants in variants. const variantNumSpecialized = 71 // nRegionGroups is the number of region groups. const nRegionGroups = 32 type likelyLangRegion struct { lang uint16 region uint16 } // likelyScript is a lookup table, indexed by scriptID, for the most likely // languages and regions given a script. // Size: 928 bytes, 232 elements var likelyScript = [232]likelyLangRegion{ 1: {lang: 0x149, region: 0x83}, 3: {lang: 0x299, region: 0x105}, 4: {lang: 0x1e, region: 0x98}, 5: {lang: 0x39, region: 0x6a}, 7: {lang: 0x3a, region: 0x9b}, 8: {lang: 0x1d0, region: 0x27}, 9: {lang: 0x12, region: 0x9b}, 10: {lang: 0x5a, region: 0x94}, 11: {lang: 0x5f, region: 0x51}, 12: {lang: 0xb7, region: 0xb3}, 13: {lang: 0x62, region: 0x94}, 14: {lang: 0xa3, region: 0x34}, 15: {lang: 0x3e0, region: 0x98}, 17: {lang: 0x51f, region: 0x12d}, 18: {lang: 0x3a8, region: 0x98}, 19: {lang: 0x159, region: 0x77}, 20: {lang: 0xc0, region: 0x94}, 21: {lang: 0x9b, region: 0xe6}, 22: {lang: 0xd9, region: 0x34}, 23: {lang: 0xf0, region: 0x48}, 24: {lang: 0x4e6, region: 0x12a}, 25: {lang: 0xe5, region: 0x13d}, 26: {lang: 0xe3, region: 0x134}, 28: {lang: 0xee, region: 0x6a}, 29: {lang: 0x199, region: 0x5c}, 30: {lang: 0x3d9, region: 0x105}, 32: {lang: 0x1b7, region: 0x98}, 34: {lang: 0x159, region: 0x77}, 37: {lang: 0x12f, region: 0x6a}, 38: {lang: 0x427, region: 0x26}, 39: {lang: 0x26, region: 0x6e}, 41: {lang: 0x208, region: 0x7c}, 42: {lang: 0xfa, region: 0x37}, 43: {lang: 0x198, region: 0x12f}, 44: {lang: 0x3e0, region: 0x98}, 45: {lang: 0x131, region: 0x86}, 46: {lang: 0x19d, region: 0x98}, 47: {lang: 0x394, region: 0x98}, 48: {lang: 0x51f, region: 0x12d}, 49: {lang: 0x24b, region: 0xaa}, 50: {lang: 0x51f, region: 0x52}, 51: {lang: 0x1c4, region: 0xe6}, 52: {lang: 0x51f, region: 0x52}, 53: {lang: 0x51f, region: 0x12d}, 54: {lang: 0x2f4, region: 0x9a}, 55: {lang: 0x1b5, region: 0x96}, 56: {lang: 0x1f8, region: 0xa1}, 57: {lang: 0x1be, region: 0x12a}, 58: {lang: 0x1c3, region: 0xae}, 60: {lang: 0x1ce, region: 0x91}, 62: {lang: 0x13d, region: 0x9d}, 63: {lang: 0x24b, region: 0xaa}, 64: {lang: 0x206, region: 0x94}, 65: {lang: 0x1f8, region: 0xa1}, 67: {lang: 0x130, region: 0xc3}, 68: {lang: 0x1f8, region: 0xa1}, 69: {lang: 0x3b2, region: 0xe7}, 70: {lang: 0x242, region: 0xa5}, 71: {lang: 0x3f0, region: 0x98}, 74: {lang: 0x249, region: 0x98}, 75: {lang: 0x24b, region: 0xaa}, 77: {lang: 0x87, region: 0x98}, 78: {lang: 0x367, region: 0x122}, 79: {lang: 0x2af, region: 0xae}, 84: {lang: 0x296, region: 0x98}, 85: {lang: 0x29f, region: 0x98}, 86: {lang: 0x286, region: 0x86}, 87: {lang: 0x199, region: 0x86}, 88: {lang: 0x2a3, region: 0x52}, 90: {lang: 0x4ea, region: 0x12a}, 91: {lang: 0x4eb, region: 0x12a}, 92: {lang: 0x1b7, region: 0x98}, 93: {lang: 0x32e, region: 0x9b}, 94: {lang: 0x4ed, region: 0x52}, 95: {lang: 0xa7, region: 0x52}, 97: {lang: 0x2df, region: 0x111}, 98: {lang: 0x4ee, region: 0x10a}, 99: {lang: 0x4ee, region: 0x10a}, 100: {lang: 0x2fb, region: 0x98}, 101: {lang: 0x312, region: 0x98}, 102: {lang: 0x302, region: 0x52}, 104: {lang: 0x315, region: 0x34}, 105: {lang: 0x305, region: 0x98}, 106: {lang: 0x40a, region: 0xe7}, 107: {lang: 0x328, region: 0xc3}, 108: {lang: 0x4ef, region: 0x107}, 109: {lang: 0x3a, region: 0xa0}, 110: {lang: 0x34a, region: 0xda}, 112: {lang: 0x2c7, region: 0x83}, 114: {lang: 0x3f9, region: 0x95}, 115: {lang: 0x3e5, region: 0x98}, 116: {lang: 0x392, region: 0xc4}, 117: {lang: 0x38c, region: 0x98}, 118: {lang: 0x390, region: 0x134}, 119: {lang: 0x41f, region: 0x114}, 120: {lang: 0x3a, region: 0x11b}, 121: {lang: 0xf9, region: 0xc3}, 122: {lang: 0x274, region: 0x105}, 123: {lang: 0x2c0, region: 0x52}, 124: {lang: 0x396, region: 0x9b}, 125: {lang: 0x396, region: 0x52}, 127: {lang: 0x3a4, region: 0xaf}, 129: {lang: 0x1bf, region: 0x52}, 130: {lang: 0x4f3, region: 0x9b}, 181: {lang: 0x3c2, region: 0x94}, 183: {lang: 0x369, region: 0x10b}, 184: {lang: 0x416, region: 0x96}, 186: {lang: 0x4f5, region: 0x15d}, 187: {lang: 0x3e6, region: 0x98}, 188: {lang: 0x44, region: 0x134}, 189: {lang: 0x134, region: 0x7a}, 190: {lang: 0x3e0, region: 0x98}, 191: {lang: 0x3e0, region: 0x98}, 192: {lang: 0x3f0, region: 0x98}, 193: {lang: 0x402, region: 0xb2}, 194: {lang: 0x429, region: 0x98}, 195: {lang: 0x434, region: 0x94}, 196: {lang: 0x443, region: 0x34}, 197: {lang: 0x444, region: 0x9a}, 201: {lang: 0x450, region: 0xe6}, 202: {lang: 0x116, region: 0x98}, 203: {lang: 0x454, region: 0x52}, 204: {lang: 0x22a, region: 0x52}, 205: {lang: 0x446, region: 0x98}, 206: {lang: 0x49b, region: 0x52}, 207: {lang: 0x9d, region: 0x13d}, 208: {lang: 0x457, region: 0x98}, 210: {lang: 0x51e, region: 0xb9}, 211: {lang: 0x14e, region: 0xe6}, 212: {lang: 0x124, region: 0xcc}, 213: {lang: 0x461, region: 0x122}, 214: {lang: 0xa7, region: 0x52}, 215: {lang: 0x2c5, region: 0x98}, 216: {lang: 0x4a3, region: 0x11b}, 217: {lang: 0x4b4, region: 0xb3}, 219: {lang: 0x1c7, region: 0x98}, 221: {lang: 0x3a0, region: 0x9b}, 222: {lang: 0x21, region: 0x9a}, 223: {lang: 0x1e2, region: 0x52}, } type likelyScriptRegion struct { region uint16 script uint8 flags uint8 } // likelyLang is a lookup table, indexed by langID, for the most likely // scripts and regions given incomplete information. If more entries exist for a // given language, region and script are the index and size respectively // of the list in likelyLangList. // Size: 5276 bytes, 1319 elements var likelyLang = [1319]likelyScriptRegion{ 0: {region: 0x134, script: 0x52, flags: 0x0}, 1: {region: 0x6e, script: 0x52, flags: 0x0}, 2: {region: 0x164, script: 0x52, flags: 0x0}, 3: {region: 0x164, script: 0x52, flags: 0x0}, 4: {region: 0x164, script: 0x52, flags: 0x0}, 5: {region: 0x7c, script: 0x1e, flags: 0x0}, 6: {region: 0x164, script: 0x52, flags: 0x0}, 7: {region: 0x7f, script: 0x52, flags: 0x0}, 8: {region: 0x164, script: 0x52, flags: 0x0}, 9: {region: 0x164, script: 0x52, flags: 0x0}, 10: {region: 0x164, script: 0x52, flags: 0x0}, 11: {region: 0x94, script: 0x52, flags: 0x0}, 12: {region: 0x130, script: 0x52, flags: 0x0}, 13: {region: 0x7f, script: 0x52, flags: 0x0}, 14: {region: 0x164, script: 0x52, flags: 0x0}, 15: {region: 0x164, script: 0x52, flags: 0x0}, 16: {region: 0x105, script: 0x1e, flags: 0x0}, 17: {region: 0x164, script: 0x52, flags: 0x0}, 18: {region: 0x9b, script: 0x9, flags: 0x0}, 19: {region: 0x127, script: 0x5, flags: 0x0}, 20: {region: 0x164, script: 0x52, flags: 0x0}, 21: {region: 0x160, script: 0x52, flags: 0x0}, 22: {region: 0x164, script: 0x52, flags: 0x0}, 23: {region: 0x164, script: 0x52, flags: 0x0}, 24: {region: 0x164, script: 0x52, flags: 0x0}, 25: {region: 0x164, script: 0x52, flags: 0x0}, 26: {region: 0x164, script: 0x52, flags: 0x0}, 27: {region: 0x51, script: 0x52, flags: 0x0}, 28: {region: 0x164, script: 0x52, flags: 0x0}, 29: {region: 0x164, script: 0x52, flags: 0x0}, 30: {region: 0x98, script: 0x4, flags: 0x0}, 31: {region: 0x164, script: 0x52, flags: 0x0}, 32: {region: 0x7f, script: 0x52, flags: 0x0}, 33: {region: 0x9a, script: 0xde, flags: 0x0}, 34: {region: 0x164, script: 0x52, flags: 0x0}, 35: {region: 0x164, script: 0x52, flags: 0x0}, 36: {region: 0x14c, script: 0x52, flags: 0x0}, 37: {region: 0x105, script: 0x1e, flags: 0x0}, 38: {region: 0x6e, script: 0x27, flags: 0x0}, 39: {region: 0x164, script: 0x52, flags: 0x0}, 40: {region: 0x164, script: 0x52, flags: 0x0}, 41: {region: 0xd5, script: 0x52, flags: 0x0}, 42: {region: 0x164, script: 0x52, flags: 0x0}, 44: {region: 0x164, script: 0x52, flags: 0x0}, 45: {region: 0x164, script: 0x52, flags: 0x0}, 46: {region: 0x164, script: 0x52, flags: 0x0}, 47: {region: 0x164, script: 0x52, flags: 0x0}, 48: {region: 0x164, script: 0x52, flags: 0x0}, 49: {region: 0x164, script: 0x52, flags: 0x0}, 50: {region: 0x94, script: 0x52, flags: 0x0}, 51: {region: 0x164, script: 0x5, flags: 0x0}, 52: {region: 0x121, script: 0x5, flags: 0x0}, 53: {region: 0x164, script: 0x52, flags: 0x0}, 54: {region: 0x164, script: 0x52, flags: 0x0}, 55: {region: 0x164, script: 0x52, flags: 0x0}, 56: {region: 0x164, script: 0x52, flags: 0x0}, 57: {region: 0x6a, script: 0x5, flags: 0x0}, 58: {region: 0x0, script: 0x3, flags: 0x1}, 59: {region: 0x164, script: 0x52, flags: 0x0}, 60: {region: 0x50, script: 0x52, flags: 0x0}, 61: {region: 0x3e, script: 0x52, flags: 0x0}, 62: {region: 0x66, script: 0x5, flags: 0x0}, 64: {region: 0xb9, script: 0x5, flags: 0x0}, 65: {region: 0x6a, script: 0x5, flags: 0x0}, 66: {region: 0x98, script: 0xe, flags: 0x0}, 67: {region: 0x12e, script: 0x52, flags: 0x0}, 68: {region: 0x134, script: 0xbc, flags: 0x0}, 69: {region: 0x164, script: 0x52, flags: 0x0}, 70: {region: 0x164, script: 0x52, flags: 0x0}, 71: {region: 0x6d, script: 0x52, flags: 0x0}, 72: {region: 0x164, script: 0x52, flags: 0x0}, 73: {region: 0x164, script: 0x52, flags: 0x0}, 74: {region: 0x48, script: 0x52, flags: 0x0}, 75: {region: 0x164, script: 0x52, flags: 0x0}, 76: {region: 0x105, script: 0x1e, flags: 0x0}, 77: {region: 0x164, script: 0x5, flags: 0x0}, 78: {region: 0x164, script: 0x52, flags: 0x0}, 79: {region: 0x164, script: 0x52, flags: 0x0}, 80: {region: 0x164, script: 0x52, flags: 0x0}, 81: {region: 0x98, script: 0x20, flags: 0x0}, 82: {region: 0x164, script: 0x52, flags: 0x0}, 83: {region: 0x164, script: 0x52, flags: 0x0}, 84: {region: 0x164, script: 0x52, flags: 0x0}, 85: {region: 0x3e, script: 0x52, flags: 0x0}, 86: {region: 0x164, script: 0x52, flags: 0x0}, 87: {region: 0x3, script: 0x5, flags: 0x1}, 88: {region: 0x105, script: 0x1e, flags: 0x0}, 89: {region: 0xe7, script: 0x5, flags: 0x0}, 90: {region: 0x94, script: 0x52, flags: 0x0}, 91: {region: 0xda, script: 0x20, flags: 0x0}, 92: {region: 0x2d, script: 0x52, flags: 0x0}, 93: {region: 0x51, script: 0x52, flags: 0x0}, 94: {region: 0x164, script: 0x52, flags: 0x0}, 95: {region: 0x51, script: 0xb, flags: 0x0}, 96: {region: 0x164, script: 0x52, flags: 0x0}, 97: {region: 0x164, script: 0x52, flags: 0x0}, 98: {region: 0x94, script: 0x52, flags: 0x0}, 99: {region: 0x164, script: 0x52, flags: 0x0}, 100: {region: 0x51, script: 0x52, flags: 0x0}, 101: {region: 0x164, script: 0x52, flags: 0x0}, 102: {region: 0x164, script: 0x52, flags: 0x0}, 103: {region: 0x164, script: 0x52, flags: 0x0}, 104: {region: 0x164, script: 0x52, flags: 0x0}, 105: {region: 0x4e, script: 0x52, flags: 0x0}, 106: {region: 0x164, script: 0x52, flags: 0x0}, 107: {region: 0x164, script: 0x52, flags: 0x0}, 108: {region: 0x164, script: 0x52, flags: 0x0}, 109: {region: 0x164, script: 0x27, flags: 0x0}, 110: {region: 0x164, script: 0x52, flags: 0x0}, 111: {region: 0x164, script: 0x52, flags: 0x0}, 112: {region: 0x46, script: 0x1e, flags: 0x0}, 113: {region: 0x164, script: 0x52, flags: 0x0}, 114: {region: 0x164, script: 0x52, flags: 0x0}, 115: {region: 0x10a, script: 0x5, flags: 0x0}, 116: {region: 0x161, script: 0x52, flags: 0x0}, 117: {region: 0x164, script: 0x52, flags: 0x0}, 118: {region: 0x94, script: 0x52, flags: 0x0}, 119: {region: 0x164, script: 0x52, flags: 0x0}, 120: {region: 0x12e, script: 0x52, flags: 0x0}, 121: {region: 0x51, script: 0x52, flags: 0x0}, 122: {region: 0x98, script: 0xcd, flags: 0x0}, 123: {region: 0xe7, script: 0x5, flags: 0x0}, 124: {region: 0x98, script: 0x20, flags: 0x0}, 125: {region: 0x37, script: 0x1e, flags: 0x0}, 126: {region: 0x98, script: 0x20, flags: 0x0}, 127: {region: 0xe7, script: 0x5, flags: 0x0}, 128: {region: 0x12a, script: 0x2d, flags: 0x0}, 130: {region: 0x98, script: 0x20, flags: 0x0}, 131: {region: 0x164, script: 0x52, flags: 0x0}, 132: {region: 0x98, script: 0x20, flags: 0x0}, 133: {region: 0xe6, script: 0x52, flags: 0x0}, 134: {region: 0x164, script: 0x52, flags: 0x0}, 135: {region: 0x98, script: 0x20, flags: 0x0}, 136: {region: 0x164, script: 0x52, flags: 0x0}, 137: {region: 0x13e, script: 0x52, flags: 0x0}, 138: {region: 0x164, script: 0x52, flags: 0x0}, 139: {region: 0x164, script: 0x52, flags: 0x0}, 140: {region: 0xe6, script: 0x52, flags: 0x0}, 141: {region: 0x164, script: 0x52, flags: 0x0}, 142: {region: 0xd5, script: 0x52, flags: 0x0}, 143: {region: 0x164, script: 0x52, flags: 0x0}, 144: {region: 0x164, script: 0x52, flags: 0x0}, 145: {region: 0x164, script: 0x52, flags: 0x0}, 146: {region: 0x164, script: 0x27, flags: 0x0}, 147: {region: 0x98, script: 0x20, flags: 0x0}, 148: {region: 0x94, script: 0x52, flags: 0x0}, 149: {region: 0x164, script: 0x52, flags: 0x0}, 150: {region: 0x164, script: 0x52, flags: 0x0}, 151: {region: 0x164, script: 0x52, flags: 0x0}, 152: {region: 0x164, script: 0x52, flags: 0x0}, 153: {region: 0x51, script: 0x52, flags: 0x0}, 154: {region: 0x164, script: 0x52, flags: 0x0}, 155: {region: 0xe6, script: 0x52, flags: 0x0}, 156: {region: 0x164, script: 0x52, flags: 0x0}, 157: {region: 0x13d, script: 0xcf, flags: 0x0}, 158: {region: 0xc2, script: 0x52, flags: 0x0}, 159: {region: 0x164, script: 0x52, flags: 0x0}, 160: {region: 0x164, script: 0x52, flags: 0x0}, 161: {region: 0xc2, script: 0x52, flags: 0x0}, 162: {region: 0x164, script: 0x52, flags: 0x0}, 163: {region: 0x34, script: 0xe, flags: 0x0}, 164: {region: 0x164, script: 0x52, flags: 0x0}, 165: {region: 0x164, script: 0x52, flags: 0x0}, 166: {region: 0x164, script: 0x52, flags: 0x0}, 167: {region: 0x52, script: 0xd6, flags: 0x0}, 168: {region: 0x164, script: 0x52, flags: 0x0}, 169: {region: 0x164, script: 0x52, flags: 0x0}, 170: {region: 0x164, script: 0x52, flags: 0x0}, 171: {region: 0x98, script: 0xe, flags: 0x0}, 172: {region: 0x164, script: 0x52, flags: 0x0}, 173: {region: 0x9b, script: 0x5, flags: 0x0}, 174: {region: 0x164, script: 0x52, flags: 0x0}, 175: {region: 0x4e, script: 0x52, flags: 0x0}, 176: {region: 0x77, script: 0x52, flags: 0x0}, 177: {region: 0x98, script: 0x20, flags: 0x0}, 178: {region: 0xe7, script: 0x5, flags: 0x0}, 179: {region: 0x98, script: 0x20, flags: 0x0}, 180: {region: 0x164, script: 0x52, flags: 0x0}, 181: {region: 0x32, script: 0x52, flags: 0x0}, 182: {region: 0x164, script: 0x52, flags: 0x0}, 183: {region: 0xb3, script: 0xc, flags: 0x0}, 184: {region: 0x51, script: 0x52, flags: 0x0}, 185: {region: 0x164, script: 0x27, flags: 0x0}, 186: {region: 0xe6, script: 0x52, flags: 0x0}, 187: {region: 0x164, script: 0x52, flags: 0x0}, 188: {region: 0xe7, script: 0x20, flags: 0x0}, 189: {region: 0x105, script: 0x1e, flags: 0x0}, 190: {region: 0x15e, script: 0x52, flags: 0x0}, 191: {region: 0x164, script: 0x52, flags: 0x0}, 192: {region: 0x94, script: 0x52, flags: 0x0}, 193: {region: 0x164, script: 0x52, flags: 0x0}, 194: {region: 0x51, script: 0x52, flags: 0x0}, 195: {region: 0x164, script: 0x52, flags: 0x0}, 196: {region: 0x164, script: 0x52, flags: 0x0}, 197: {region: 0x164, script: 0x52, flags: 0x0}, 198: {region: 0x85, script: 0x52, flags: 0x0}, 199: {region: 0x164, script: 0x52, flags: 0x0}, 200: {region: 0x164, script: 0x52, flags: 0x0}, 201: {region: 0x164, script: 0x52, flags: 0x0}, 202: {region: 0x164, script: 0x52, flags: 0x0}, 203: {region: 0x6c, script: 0x27, flags: 0x0}, 204: {region: 0x164, script: 0x52, flags: 0x0}, 205: {region: 0x164, script: 0x52, flags: 0x0}, 206: {region: 0x51, script: 0x52, flags: 0x0}, 207: {region: 0x164, script: 0x52, flags: 0x0}, 208: {region: 0x164, script: 0x52, flags: 0x0}, 209: {region: 0xc2, script: 0x52, flags: 0x0}, 210: {region: 0x164, script: 0x52, flags: 0x0}, 211: {region: 0x164, script: 0x52, flags: 0x0}, 212: {region: 0x164, script: 0x52, flags: 0x0}, 213: {region: 0x6d, script: 0x52, flags: 0x0}, 214: {region: 0x164, script: 0x52, flags: 0x0}, 215: {region: 0x164, script: 0x52, flags: 0x0}, 216: {region: 0xd5, script: 0x52, flags: 0x0}, 217: {region: 0x8, script: 0x2, flags: 0x1}, 218: {region: 0x105, script: 0x1e, flags: 0x0}, 219: {region: 0xe6, script: 0x52, flags: 0x0}, 220: {region: 0x164, script: 0x52, flags: 0x0}, 221: {region: 0x130, script: 0x52, flags: 0x0}, 222: {region: 0x89, script: 0x52, flags: 0x0}, 223: {region: 0x74, script: 0x52, flags: 0x0}, 224: {region: 0x105, script: 0x1e, flags: 0x0}, 225: {region: 0x134, script: 0x52, flags: 0x0}, 226: {region: 0x48, script: 0x52, flags: 0x0}, 227: {region: 0x134, script: 0x1a, flags: 0x0}, 228: {region: 0xa5, script: 0x5, flags: 0x0}, 229: {region: 0x13d, script: 0x19, flags: 0x0}, 230: {region: 0x164, script: 0x52, flags: 0x0}, 231: {region: 0x9a, script: 0x5, flags: 0x0}, 232: {region: 0x164, script: 0x52, flags: 0x0}, 233: {region: 0x164, script: 0x52, flags: 0x0}, 234: {region: 0x164, script: 0x52, flags: 0x0}, 235: {region: 0x164, script: 0x52, flags: 0x0}, 236: {region: 0x164, script: 0x52, flags: 0x0}, 237: {region: 0x77, script: 0x52, flags: 0x0}, 238: {region: 0x6a, script: 0x1c, flags: 0x0}, 239: {region: 0xe6, script: 0x52, flags: 0x0}, 240: {region: 0x48, script: 0x17, flags: 0x0}, 241: {region: 0x48, script: 0x17, flags: 0x0}, 242: {region: 0x48, script: 0x17, flags: 0x0}, 243: {region: 0x48, script: 0x17, flags: 0x0}, 244: {region: 0x48, script: 0x17, flags: 0x0}, 245: {region: 0x109, script: 0x52, flags: 0x0}, 246: {region: 0x5d, script: 0x52, flags: 0x0}, 247: {region: 0xe8, script: 0x52, flags: 0x0}, 248: {region: 0x48, script: 0x17, flags: 0x0}, 249: {region: 0xc3, script: 0x79, flags: 0x0}, 250: {region: 0xa, script: 0x2, flags: 0x1}, 251: {region: 0x105, script: 0x1e, flags: 0x0}, 252: {region: 0x7a, script: 0x52, flags: 0x0}, 253: {region: 0x62, script: 0x52, flags: 0x0}, 254: {region: 0x164, script: 0x52, flags: 0x0}, 255: {region: 0x164, script: 0x52, flags: 0x0}, 256: {region: 0x164, script: 0x52, flags: 0x0}, 257: {region: 0x164, script: 0x52, flags: 0x0}, 258: {region: 0x134, script: 0x52, flags: 0x0}, 259: {region: 0x105, script: 0x1e, flags: 0x0}, 260: {region: 0xa3, script: 0x52, flags: 0x0}, 261: {region: 0x164, script: 0x52, flags: 0x0}, 262: {region: 0x164, script: 0x52, flags: 0x0}, 263: {region: 0x98, script: 0x5, flags: 0x0}, 264: {region: 0x164, script: 0x52, flags: 0x0}, 265: {region: 0x5f, script: 0x52, flags: 0x0}, 266: {region: 0x164, script: 0x52, flags: 0x0}, 267: {region: 0x48, script: 0x52, flags: 0x0}, 268: {region: 0x164, script: 0x52, flags: 0x0}, 269: {region: 0x164, script: 0x52, flags: 0x0}, 270: {region: 0x164, script: 0x52, flags: 0x0}, 271: {region: 0x164, script: 0x5, flags: 0x0}, 272: {region: 0x48, script: 0x52, flags: 0x0}, 273: {region: 0x164, script: 0x52, flags: 0x0}, 274: {region: 0x164, script: 0x52, flags: 0x0}, 275: {region: 0xd3, script: 0x52, flags: 0x0}, 276: {region: 0x4e, script: 0x52, flags: 0x0}, 277: {region: 0x164, script: 0x52, flags: 0x0}, 278: {region: 0x98, script: 0x5, flags: 0x0}, 279: {region: 0x164, script: 0x52, flags: 0x0}, 280: {region: 0x164, script: 0x52, flags: 0x0}, 281: {region: 0x164, script: 0x52, flags: 0x0}, 282: {region: 0x164, script: 0x27, flags: 0x0}, 283: {region: 0x5f, script: 0x52, flags: 0x0}, 284: {region: 0xc2, script: 0x52, flags: 0x0}, 285: {region: 0xcf, script: 0x52, flags: 0x0}, 286: {region: 0x164, script: 0x52, flags: 0x0}, 287: {region: 0xda, script: 0x20, flags: 0x0}, 288: {region: 0x51, script: 0x52, flags: 0x0}, 289: {region: 0x164, script: 0x52, flags: 0x0}, 290: {region: 0x164, script: 0x52, flags: 0x0}, 291: {region: 0x164, script: 0x52, flags: 0x0}, 292: {region: 0xcc, script: 0xd4, flags: 0x0}, 293: {region: 0x164, script: 0x52, flags: 0x0}, 294: {region: 0x164, script: 0x52, flags: 0x0}, 295: {region: 0x113, script: 0x52, flags: 0x0}, 296: {region: 0x36, script: 0x52, flags: 0x0}, 297: {region: 0x42, script: 0xd6, flags: 0x0}, 298: {region: 0x164, script: 0x52, flags: 0x0}, 299: {region: 0xa3, script: 0x52, flags: 0x0}, 300: {region: 0x7f, script: 0x52, flags: 0x0}, 301: {region: 0xd5, script: 0x52, flags: 0x0}, 302: {region: 0x9d, script: 0x52, flags: 0x0}, 303: {region: 0x6a, script: 0x25, flags: 0x0}, 304: {region: 0xc3, script: 0x43, flags: 0x0}, 305: {region: 0x86, script: 0x2d, flags: 0x0}, 306: {region: 0x164, script: 0x52, flags: 0x0}, 307: {region: 0x164, script: 0x52, flags: 0x0}, 308: {region: 0xc, script: 0x2, flags: 0x1}, 309: {region: 0x164, script: 0x52, flags: 0x0}, 310: {region: 0x164, script: 0x52, flags: 0x0}, 311: {region: 0x1, script: 0x52, flags: 0x0}, 312: {region: 0x164, script: 0x52, flags: 0x0}, 313: {region: 0x6d, script: 0x52, flags: 0x0}, 314: {region: 0x134, script: 0x52, flags: 0x0}, 315: {region: 0x69, script: 0x52, flags: 0x0}, 316: {region: 0x164, script: 0x52, flags: 0x0}, 317: {region: 0x9d, script: 0x3e, flags: 0x0}, 318: {region: 0x164, script: 0x52, flags: 0x0}, 319: {region: 0x164, script: 0x52, flags: 0x0}, 320: {region: 0x6d, script: 0x52, flags: 0x0}, 321: {region: 0x51, script: 0x52, flags: 0x0}, 322: {region: 0x6d, script: 0x52, flags: 0x0}, 323: {region: 0x9b, script: 0x5, flags: 0x0}, 324: {region: 0x164, script: 0x52, flags: 0x0}, 325: {region: 0x164, script: 0x52, flags: 0x0}, 326: {region: 0x164, script: 0x52, flags: 0x0}, 327: {region: 0x164, script: 0x52, flags: 0x0}, 328: {region: 0x85, script: 0x52, flags: 0x0}, 329: {region: 0xe, script: 0x2, flags: 0x1}, 330: {region: 0x164, script: 0x52, flags: 0x0}, 331: {region: 0xc2, script: 0x52, flags: 0x0}, 332: {region: 0x71, script: 0x52, flags: 0x0}, 333: {region: 0x10a, script: 0x5, flags: 0x0}, 334: {region: 0xe6, script: 0x52, flags: 0x0}, 335: {region: 0x10b, script: 0x52, flags: 0x0}, 336: {region: 0x72, script: 0x52, flags: 0x0}, 337: {region: 0x164, script: 0x52, flags: 0x0}, 338: {region: 0x164, script: 0x52, flags: 0x0}, 339: {region: 0x75, script: 0x52, flags: 0x0}, 340: {region: 0x164, script: 0x52, flags: 0x0}, 341: {region: 0x3a, script: 0x52, flags: 0x0}, 342: {region: 0x164, script: 0x52, flags: 0x0}, 343: {region: 0x164, script: 0x52, flags: 0x0}, 344: {region: 0x164, script: 0x52, flags: 0x0}, 345: {region: 0x77, script: 0x52, flags: 0x0}, 346: {region: 0x134, script: 0x52, flags: 0x0}, 347: {region: 0x77, script: 0x52, flags: 0x0}, 348: {region: 0x5f, script: 0x52, flags: 0x0}, 349: {region: 0x5f, script: 0x52, flags: 0x0}, 350: {region: 0x51, script: 0x5, flags: 0x0}, 351: {region: 0x13f, script: 0x52, flags: 0x0}, 352: {region: 0x164, script: 0x52, flags: 0x0}, 353: {region: 0x83, script: 0x52, flags: 0x0}, 354: {region: 0x164, script: 0x52, flags: 0x0}, 355: {region: 0xd3, script: 0x52, flags: 0x0}, 356: {region: 0x9d, script: 0x52, flags: 0x0}, 357: {region: 0xd5, script: 0x52, flags: 0x0}, 358: {region: 0x164, script: 0x52, flags: 0x0}, 359: {region: 0x10a, script: 0x52, flags: 0x0}, 360: {region: 0xd8, script: 0x52, flags: 0x0}, 361: {region: 0x95, script: 0x52, flags: 0x0}, 362: {region: 0x7f, script: 0x52, flags: 0x0}, 363: {region: 0x164, script: 0x52, flags: 0x0}, 364: {region: 0xbb, script: 0x52, flags: 0x0}, 365: {region: 0x164, script: 0x52, flags: 0x0}, 366: {region: 0x164, script: 0x52, flags: 0x0}, 367: {region: 0x164, script: 0x52, flags: 0x0}, 368: {region: 0x52, script: 0x34, flags: 0x0}, 369: {region: 0x164, script: 0x52, flags: 0x0}, 370: {region: 0x94, script: 0x52, flags: 0x0}, 371: {region: 0x164, script: 0x52, flags: 0x0}, 372: {region: 0x98, script: 0x20, flags: 0x0}, 373: {region: 0x164, script: 0x52, flags: 0x0}, 374: {region: 0x9b, script: 0x5, flags: 0x0}, 375: {region: 0x7d, script: 0x52, flags: 0x0}, 376: {region: 0x7a, script: 0x52, flags: 0x0}, 377: {region: 0x164, script: 0x52, flags: 0x0}, 378: {region: 0x164, script: 0x52, flags: 0x0}, 379: {region: 0x164, script: 0x52, flags: 0x0}, 380: {region: 0x164, script: 0x52, flags: 0x0}, 381: {region: 0x164, script: 0x52, flags: 0x0}, 382: {region: 0x164, script: 0x52, flags: 0x0}, 383: {region: 0x6e, script: 0x27, flags: 0x0}, 384: {region: 0x164, script: 0x52, flags: 0x0}, 385: {region: 0xda, script: 0x20, flags: 0x0}, 386: {region: 0x164, script: 0x52, flags: 0x0}, 387: {region: 0xa6, script: 0x52, flags: 0x0}, 388: {region: 0x164, script: 0x52, flags: 0x0}, 389: {region: 0xe7, script: 0x5, flags: 0x0}, 390: {region: 0x164, script: 0x52, flags: 0x0}, 391: {region: 0xe7, script: 0x5, flags: 0x0}, 392: {region: 0x164, script: 0x52, flags: 0x0}, 393: {region: 0x164, script: 0x52, flags: 0x0}, 394: {region: 0x6d, script: 0x52, flags: 0x0}, 395: {region: 0x9b, script: 0x5, flags: 0x0}, 396: {region: 0x164, script: 0x52, flags: 0x0}, 397: {region: 0x164, script: 0x27, flags: 0x0}, 398: {region: 0xf0, script: 0x52, flags: 0x0}, 399: {region: 0x164, script: 0x52, flags: 0x0}, 400: {region: 0x164, script: 0x52, flags: 0x0}, 401: {region: 0x164, script: 0x52, flags: 0x0}, 402: {region: 0x164, script: 0x27, flags: 0x0}, 403: {region: 0x164, script: 0x52, flags: 0x0}, 404: {region: 0x98, script: 0x20, flags: 0x0}, 405: {region: 0x98, script: 0xd0, flags: 0x0}, 406: {region: 0x94, script: 0x52, flags: 0x0}, 407: {region: 0xd8, script: 0x52, flags: 0x0}, 408: {region: 0x12f, script: 0x2b, flags: 0x0}, 409: {region: 0x10, script: 0x2, flags: 0x1}, 410: {region: 0x98, script: 0xe, flags: 0x0}, 411: {region: 0x164, script: 0x52, flags: 0x0}, 412: {region: 0x4d, script: 0x52, flags: 0x0}, 413: {region: 0x98, script: 0x2e, flags: 0x0}, 414: {region: 0x40, script: 0x52, flags: 0x0}, 415: {region: 0x53, script: 0x52, flags: 0x0}, 416: {region: 0x164, script: 0x52, flags: 0x0}, 417: {region: 0x7f, script: 0x52, flags: 0x0}, 418: {region: 0x164, script: 0x52, flags: 0x0}, 419: {region: 0x164, script: 0x52, flags: 0x0}, 420: {region: 0xa3, script: 0x52, flags: 0x0}, 421: {region: 0x97, script: 0x52, flags: 0x0}, 422: {region: 0x164, script: 0x52, flags: 0x0}, 423: {region: 0xda, script: 0x20, flags: 0x0}, 424: {region: 0x164, script: 0x52, flags: 0x0}, 425: {region: 0x164, script: 0x5, flags: 0x0}, 426: {region: 0x48, script: 0x52, flags: 0x0}, 427: {region: 0x164, script: 0x5, flags: 0x0}, 428: {region: 0x164, script: 0x52, flags: 0x0}, 429: {region: 0x12, script: 0x3, flags: 0x1}, 430: {region: 0x164, script: 0x52, flags: 0x0}, 431: {region: 0x52, script: 0x34, flags: 0x0}, 432: {region: 0x164, script: 0x52, flags: 0x0}, 433: {region: 0x134, script: 0x52, flags: 0x0}, 434: {region: 0x23, script: 0x5, flags: 0x0}, 435: {region: 0x164, script: 0x52, flags: 0x0}, 436: {region: 0x164, script: 0x27, flags: 0x0}, 437: {region: 0x96, script: 0x37, flags: 0x0}, 438: {region: 0x164, script: 0x52, flags: 0x0}, 439: {region: 0x98, script: 0x20, flags: 0x0}, 440: {region: 0x164, script: 0x52, flags: 0x0}, 441: {region: 0x72, script: 0x52, flags: 0x0}, 442: {region: 0x164, script: 0x52, flags: 0x0}, 443: {region: 0x164, script: 0x52, flags: 0x0}, 444: {region: 0xe6, script: 0x52, flags: 0x0}, 445: {region: 0x164, script: 0x52, flags: 0x0}, 446: {region: 0x12a, script: 0x39, flags: 0x0}, 447: {region: 0x52, script: 0x81, flags: 0x0}, 448: {region: 0x164, script: 0x52, flags: 0x0}, 449: {region: 0xe7, script: 0x5, flags: 0x0}, 450: {region: 0x98, script: 0x20, flags: 0x0}, 451: {region: 0xae, script: 0x3a, flags: 0x0}, 452: {region: 0xe6, script: 0x52, flags: 0x0}, 453: {region: 0xe7, script: 0x5, flags: 0x0}, 454: {region: 0xe5, script: 0x52, flags: 0x0}, 455: {region: 0x98, script: 0x20, flags: 0x0}, 456: {region: 0x98, script: 0x20, flags: 0x0}, 457: {region: 0x164, script: 0x52, flags: 0x0}, 458: {region: 0x8f, script: 0x52, flags: 0x0}, 459: {region: 0x5f, script: 0x52, flags: 0x0}, 460: {region: 0x52, script: 0x34, flags: 0x0}, 461: {region: 0x90, script: 0x52, flags: 0x0}, 462: {region: 0x91, script: 0x52, flags: 0x0}, 463: {region: 0x164, script: 0x52, flags: 0x0}, 464: {region: 0x27, script: 0x8, flags: 0x0}, 465: {region: 0xd1, script: 0x52, flags: 0x0}, 466: {region: 0x77, script: 0x52, flags: 0x0}, 467: {region: 0x164, script: 0x52, flags: 0x0}, 468: {region: 0x164, script: 0x52, flags: 0x0}, 469: {region: 0xcf, script: 0x52, flags: 0x0}, 470: {region: 0xd5, script: 0x52, flags: 0x0}, 471: {region: 0x164, script: 0x52, flags: 0x0}, 472: {region: 0x164, script: 0x52, flags: 0x0}, 473: {region: 0x164, script: 0x52, flags: 0x0}, 474: {region: 0x94, script: 0x52, flags: 0x0}, 475: {region: 0x164, script: 0x52, flags: 0x0}, 476: {region: 0x164, script: 0x52, flags: 0x0}, 477: {region: 0x164, script: 0x52, flags: 0x0}, 479: {region: 0xd5, script: 0x52, flags: 0x0}, 480: {region: 0x164, script: 0x52, flags: 0x0}, 481: {region: 0x164, script: 0x52, flags: 0x0}, 482: {region: 0x52, script: 0xdf, flags: 0x0}, 483: {region: 0x164, script: 0x52, flags: 0x0}, 484: {region: 0x134, script: 0x52, flags: 0x0}, 485: {region: 0x164, script: 0x52, flags: 0x0}, 486: {region: 0x48, script: 0x52, flags: 0x0}, 487: {region: 0x164, script: 0x52, flags: 0x0}, 488: {region: 0x164, script: 0x52, flags: 0x0}, 489: {region: 0xe6, script: 0x52, flags: 0x0}, 490: {region: 0x164, script: 0x52, flags: 0x0}, 491: {region: 0x94, script: 0x52, flags: 0x0}, 492: {region: 0x105, script: 0x1e, flags: 0x0}, 494: {region: 0x164, script: 0x52, flags: 0x0}, 495: {region: 0x164, script: 0x52, flags: 0x0}, 496: {region: 0x9c, script: 0x52, flags: 0x0}, 497: {region: 0x9d, script: 0x52, flags: 0x0}, 498: {region: 0x48, script: 0x17, flags: 0x0}, 499: {region: 0x96, script: 0x37, flags: 0x0}, 500: {region: 0x164, script: 0x52, flags: 0x0}, 501: {region: 0x164, script: 0x52, flags: 0x0}, 502: {region: 0x105, script: 0x52, flags: 0x0}, 503: {region: 0x164, script: 0x52, flags: 0x0}, 504: {region: 0xa1, script: 0x41, flags: 0x0}, 505: {region: 0x164, script: 0x52, flags: 0x0}, 506: {region: 0x9f, script: 0x52, flags: 0x0}, 508: {region: 0x164, script: 0x52, flags: 0x0}, 509: {region: 0x164, script: 0x52, flags: 0x0}, 510: {region: 0x164, script: 0x52, flags: 0x0}, 511: {region: 0x51, script: 0x52, flags: 0x0}, 512: {region: 0x12f, script: 0x37, flags: 0x0}, 513: {region: 0x164, script: 0x52, flags: 0x0}, 514: {region: 0x12e, script: 0x52, flags: 0x0}, 515: {region: 0xda, script: 0x20, flags: 0x0}, 516: {region: 0x164, script: 0x52, flags: 0x0}, 517: {region: 0x62, script: 0x52, flags: 0x0}, 518: {region: 0x94, script: 0x52, flags: 0x0}, 519: {region: 0x94, script: 0x52, flags: 0x0}, 520: {region: 0x7c, script: 0x29, flags: 0x0}, 521: {region: 0x136, script: 0x1e, flags: 0x0}, 522: {region: 0x66, script: 0x52, flags: 0x0}, 523: {region: 0xc3, script: 0x52, flags: 0x0}, 524: {region: 0x164, script: 0x52, flags: 0x0}, 525: {region: 0x164, script: 0x52, flags: 0x0}, 526: {region: 0xd5, script: 0x52, flags: 0x0}, 527: {region: 0xa3, script: 0x52, flags: 0x0}, 528: {region: 0xc2, script: 0x52, flags: 0x0}, 529: {region: 0x105, script: 0x1e, flags: 0x0}, 530: {region: 0x164, script: 0x52, flags: 0x0}, 531: {region: 0x164, script: 0x52, flags: 0x0}, 532: {region: 0x164, script: 0x52, flags: 0x0}, 533: {region: 0x164, script: 0x52, flags: 0x0}, 534: {region: 0xd3, script: 0x5, flags: 0x0}, 535: {region: 0xd5, script: 0x52, flags: 0x0}, 536: {region: 0x163, script: 0x52, flags: 0x0}, 537: {region: 0x164, script: 0x52, flags: 0x0}, 538: {region: 0x164, script: 0x52, flags: 0x0}, 539: {region: 0x12e, script: 0x52, flags: 0x0}, 540: {region: 0x121, script: 0x5, flags: 0x0}, 541: {region: 0x164, script: 0x52, flags: 0x0}, 542: {region: 0x122, script: 0xd5, flags: 0x0}, 543: {region: 0x59, script: 0x52, flags: 0x0}, 544: {region: 0x51, script: 0x52, flags: 0x0}, 545: {region: 0x164, script: 0x52, flags: 0x0}, 546: {region: 0x4e, script: 0x52, flags: 0x0}, 547: {region: 0x98, script: 0x20, flags: 0x0}, 548: {region: 0x98, script: 0x20, flags: 0x0}, 549: {region: 0x4a, script: 0x52, flags: 0x0}, 550: {region: 0x94, script: 0x52, flags: 0x0}, 551: {region: 0x164, script: 0x52, flags: 0x0}, 552: {region: 0x40, script: 0x52, flags: 0x0}, 553: {region: 0x98, script: 0x52, flags: 0x0}, 554: {region: 0x52, script: 0xcc, flags: 0x0}, 555: {region: 0x98, script: 0x20, flags: 0x0}, 556: {region: 0xc2, script: 0x52, flags: 0x0}, 557: {region: 0x164, script: 0x52, flags: 0x0}, 558: {region: 0x98, script: 0x6b, flags: 0x0}, 559: {region: 0xe7, script: 0x5, flags: 0x0}, 560: {region: 0x164, script: 0x52, flags: 0x0}, 561: {region: 0xa3, script: 0x52, flags: 0x0}, 562: {region: 0x164, script: 0x52, flags: 0x0}, 563: {region: 0x12a, script: 0x52, flags: 0x0}, 564: {region: 0x164, script: 0x52, flags: 0x0}, 565: {region: 0xd1, script: 0x52, flags: 0x0}, 566: {region: 0x164, script: 0x52, flags: 0x0}, 567: {region: 0xae, script: 0x4f, flags: 0x0}, 568: {region: 0x164, script: 0x52, flags: 0x0}, 569: {region: 0x164, script: 0x52, flags: 0x0}, 570: {region: 0x15, script: 0x6, flags: 0x1}, 571: {region: 0x164, script: 0x52, flags: 0x0}, 572: {region: 0x51, script: 0x52, flags: 0x0}, 573: {region: 0x81, script: 0x52, flags: 0x0}, 574: {region: 0xa3, script: 0x52, flags: 0x0}, 575: {region: 0x164, script: 0x52, flags: 0x0}, 576: {region: 0x164, script: 0x52, flags: 0x0}, 577: {region: 0x164, script: 0x52, flags: 0x0}, 578: {region: 0xa5, script: 0x46, flags: 0x0}, 579: {region: 0x29, script: 0x52, flags: 0x0}, 580: {region: 0x164, script: 0x52, flags: 0x0}, 581: {region: 0x164, script: 0x52, flags: 0x0}, 582: {region: 0x164, script: 0x52, flags: 0x0}, 583: {region: 0x164, script: 0x52, flags: 0x0}, 584: {region: 0x164, script: 0x52, flags: 0x0}, 585: {region: 0x98, script: 0x4a, flags: 0x0}, 586: {region: 0x164, script: 0x52, flags: 0x0}, 587: {region: 0xaa, script: 0x4b, flags: 0x0}, 588: {region: 0x105, script: 0x1e, flags: 0x0}, 589: {region: 0x98, script: 0x20, flags: 0x0}, 590: {region: 0x164, script: 0x52, flags: 0x0}, 591: {region: 0x74, script: 0x52, flags: 0x0}, 592: {region: 0x164, script: 0x52, flags: 0x0}, 593: {region: 0xb3, script: 0x52, flags: 0x0}, 594: {region: 0x164, script: 0x52, flags: 0x0}, 595: {region: 0x164, script: 0x52, flags: 0x0}, 596: {region: 0x164, script: 0x52, flags: 0x0}, 597: {region: 0x164, script: 0x52, flags: 0x0}, 598: {region: 0x164, script: 0x52, flags: 0x0}, 599: {region: 0x164, script: 0x52, flags: 0x0}, 600: {region: 0x164, script: 0x52, flags: 0x0}, 601: {region: 0x164, script: 0x27, flags: 0x0}, 603: {region: 0x105, script: 0x1e, flags: 0x0}, 604: {region: 0x111, script: 0x52, flags: 0x0}, 605: {region: 0xe6, script: 0x52, flags: 0x0}, 606: {region: 0x105, script: 0x52, flags: 0x0}, 607: {region: 0x164, script: 0x52, flags: 0x0}, 608: {region: 0x98, script: 0x20, flags: 0x0}, 609: {region: 0x98, script: 0x5, flags: 0x0}, 610: {region: 0x12e, script: 0x52, flags: 0x0}, 611: {region: 0x164, script: 0x52, flags: 0x0}, 612: {region: 0x51, script: 0x52, flags: 0x0}, 613: {region: 0x5f, script: 0x52, flags: 0x0}, 614: {region: 0x164, script: 0x52, flags: 0x0}, 615: {region: 0x164, script: 0x52, flags: 0x0}, 616: {region: 0x164, script: 0x27, flags: 0x0}, 617: {region: 0x164, script: 0x52, flags: 0x0}, 618: {region: 0x164, script: 0x52, flags: 0x0}, 619: {region: 0x1b, script: 0x3, flags: 0x1}, 620: {region: 0x164, script: 0x52, flags: 0x0}, 621: {region: 0x164, script: 0x52, flags: 0x0}, 622: {region: 0x164, script: 0x52, flags: 0x0}, 623: {region: 0x164, script: 0x52, flags: 0x0}, 624: {region: 0x105, script: 0x1e, flags: 0x0}, 625: {region: 0x164, script: 0x52, flags: 0x0}, 626: {region: 0x164, script: 0x52, flags: 0x0}, 627: {region: 0x164, script: 0x52, flags: 0x0}, 628: {region: 0x105, script: 0x1e, flags: 0x0}, 629: {region: 0x164, script: 0x52, flags: 0x0}, 630: {region: 0x94, script: 0x52, flags: 0x0}, 631: {region: 0xe7, script: 0x5, flags: 0x0}, 632: {region: 0x7a, script: 0x52, flags: 0x0}, 633: {region: 0x164, script: 0x52, flags: 0x0}, 634: {region: 0x164, script: 0x52, flags: 0x0}, 635: {region: 0x164, script: 0x52, flags: 0x0}, 636: {region: 0x164, script: 0x27, flags: 0x0}, 637: {region: 0x122, script: 0xd5, flags: 0x0}, 638: {region: 0xe7, script: 0x5, flags: 0x0}, 639: {region: 0x164, script: 0x52, flags: 0x0}, 640: {region: 0x164, script: 0x52, flags: 0x0}, 641: {region: 0x1e, script: 0x5, flags: 0x1}, 642: {region: 0x164, script: 0x52, flags: 0x0}, 643: {region: 0x164, script: 0x52, flags: 0x0}, 644: {region: 0x164, script: 0x52, flags: 0x0}, 645: {region: 0x137, script: 0x52, flags: 0x0}, 646: {region: 0x86, script: 0x56, flags: 0x0}, 647: {region: 0x96, script: 0x37, flags: 0x0}, 648: {region: 0x12e, script: 0x52, flags: 0x0}, 649: {region: 0xe7, script: 0x5, flags: 0x0}, 650: {region: 0x130, script: 0x52, flags: 0x0}, 651: {region: 0x164, script: 0x52, flags: 0x0}, 652: {region: 0xb6, script: 0x52, flags: 0x0}, 653: {region: 0x105, script: 0x1e, flags: 0x0}, 654: {region: 0x164, script: 0x52, flags: 0x0}, 655: {region: 0x94, script: 0x52, flags: 0x0}, 656: {region: 0x164, script: 0x52, flags: 0x0}, 657: {region: 0x52, script: 0xd5, flags: 0x0}, 658: {region: 0x164, script: 0x52, flags: 0x0}, 659: {region: 0x164, script: 0x52, flags: 0x0}, 660: {region: 0x164, script: 0x52, flags: 0x0}, 661: {region: 0x164, script: 0x52, flags: 0x0}, 662: {region: 0x98, script: 0x54, flags: 0x0}, 663: {region: 0x164, script: 0x52, flags: 0x0}, 664: {region: 0x164, script: 0x52, flags: 0x0}, 665: {region: 0x105, script: 0x1e, flags: 0x0}, 666: {region: 0x130, script: 0x52, flags: 0x0}, 667: {region: 0x164, script: 0x52, flags: 0x0}, 668: {region: 0xd8, script: 0x52, flags: 0x0}, 669: {region: 0x164, script: 0x52, flags: 0x0}, 670: {region: 0x164, script: 0x52, flags: 0x0}, 671: {region: 0x23, script: 0x2, flags: 0x1}, 672: {region: 0x164, script: 0x52, flags: 0x0}, 673: {region: 0x164, script: 0x52, flags: 0x0}, 674: {region: 0x9d, script: 0x52, flags: 0x0}, 675: {region: 0x52, script: 0x58, flags: 0x0}, 676: {region: 0x94, script: 0x52, flags: 0x0}, 677: {region: 0x9b, script: 0x5, flags: 0x0}, 678: {region: 0x134, script: 0x52, flags: 0x0}, 679: {region: 0x164, script: 0x52, flags: 0x0}, 680: {region: 0x164, script: 0x52, flags: 0x0}, 681: {region: 0x98, script: 0xd0, flags: 0x0}, 682: {region: 0x9d, script: 0x52, flags: 0x0}, 683: {region: 0x164, script: 0x52, flags: 0x0}, 684: {region: 0x4a, script: 0x52, flags: 0x0}, 685: {region: 0x164, script: 0x52, flags: 0x0}, 686: {region: 0x164, script: 0x52, flags: 0x0}, 687: {region: 0xae, script: 0x4f, flags: 0x0}, 688: {region: 0x164, script: 0x52, flags: 0x0}, 689: {region: 0x164, script: 0x52, flags: 0x0}, 690: {region: 0x4a, script: 0x52, flags: 0x0}, 691: {region: 0x164, script: 0x52, flags: 0x0}, 692: {region: 0x164, script: 0x52, flags: 0x0}, 693: {region: 0x161, script: 0x52, flags: 0x0}, 694: {region: 0x9b, script: 0x5, flags: 0x0}, 695: {region: 0xb5, script: 0x52, flags: 0x0}, 696: {region: 0xb7, script: 0x52, flags: 0x0}, 697: {region: 0x4a, script: 0x52, flags: 0x0}, 698: {region: 0x4a, script: 0x52, flags: 0x0}, 699: {region: 0xa3, script: 0x52, flags: 0x0}, 700: {region: 0xa3, script: 0x52, flags: 0x0}, 701: {region: 0x9b, script: 0x5, flags: 0x0}, 702: {region: 0xb7, script: 0x52, flags: 0x0}, 703: {region: 0x122, script: 0xd5, flags: 0x0}, 704: {region: 0x52, script: 0x34, flags: 0x0}, 705: {region: 0x12a, script: 0x52, flags: 0x0}, 706: {region: 0x94, script: 0x52, flags: 0x0}, 707: {region: 0x51, script: 0x52, flags: 0x0}, 708: {region: 0x98, script: 0x20, flags: 0x0}, 709: {region: 0x98, script: 0x20, flags: 0x0}, 710: {region: 0x94, script: 0x52, flags: 0x0}, 711: {region: 0x25, script: 0x3, flags: 0x1}, 712: {region: 0xa3, script: 0x52, flags: 0x0}, 713: {region: 0x164, script: 0x52, flags: 0x0}, 714: {region: 0xce, script: 0x52, flags: 0x0}, 715: {region: 0x164, script: 0x52, flags: 0x0}, 716: {region: 0x164, script: 0x52, flags: 0x0}, 717: {region: 0x164, script: 0x52, flags: 0x0}, 718: {region: 0x164, script: 0x52, flags: 0x0}, 719: {region: 0x164, script: 0x52, flags: 0x0}, 720: {region: 0x164, script: 0x52, flags: 0x0}, 721: {region: 0x164, script: 0x52, flags: 0x0}, 722: {region: 0x164, script: 0x52, flags: 0x0}, 723: {region: 0x164, script: 0x52, flags: 0x0}, 724: {region: 0x164, script: 0x52, flags: 0x0}, 725: {region: 0x164, script: 0x52, flags: 0x0}, 726: {region: 0x164, script: 0x5, flags: 0x0}, 727: {region: 0x105, script: 0x1e, flags: 0x0}, 728: {region: 0xe6, script: 0x52, flags: 0x0}, 729: {region: 0x164, script: 0x52, flags: 0x0}, 730: {region: 0x94, script: 0x52, flags: 0x0}, 731: {region: 0x164, script: 0x27, flags: 0x0}, 732: {region: 0x164, script: 0x52, flags: 0x0}, 733: {region: 0x164, script: 0x52, flags: 0x0}, 734: {region: 0x164, script: 0x52, flags: 0x0}, 735: {region: 0x111, script: 0x52, flags: 0x0}, 736: {region: 0xa3, script: 0x52, flags: 0x0}, 737: {region: 0x164, script: 0x52, flags: 0x0}, 738: {region: 0x164, script: 0x52, flags: 0x0}, 739: {region: 0x122, script: 0x5, flags: 0x0}, 740: {region: 0xcb, script: 0x52, flags: 0x0}, 741: {region: 0x164, script: 0x52, flags: 0x0}, 742: {region: 0x164, script: 0x52, flags: 0x0}, 743: {region: 0x164, script: 0x52, flags: 0x0}, 744: {region: 0xbe, script: 0x52, flags: 0x0}, 745: {region: 0xd0, script: 0x52, flags: 0x0}, 746: {region: 0x164, script: 0x52, flags: 0x0}, 747: {region: 0x51, script: 0x52, flags: 0x0}, 748: {region: 0xda, script: 0x20, flags: 0x0}, 749: {region: 0x12e, script: 0x52, flags: 0x0}, 750: {region: 0xbf, script: 0x52, flags: 0x0}, 751: {region: 0x164, script: 0x52, flags: 0x0}, 752: {region: 0x164, script: 0x52, flags: 0x0}, 753: {region: 0xdf, script: 0x52, flags: 0x0}, 754: {region: 0x164, script: 0x52, flags: 0x0}, 755: {region: 0x94, script: 0x52, flags: 0x0}, 756: {region: 0x9a, script: 0x36, flags: 0x0}, 757: {region: 0x164, script: 0x52, flags: 0x0}, 758: {region: 0xc1, script: 0x1e, flags: 0x0}, 759: {region: 0x164, script: 0x5, flags: 0x0}, 760: {region: 0x164, script: 0x52, flags: 0x0}, 761: {region: 0x164, script: 0x52, flags: 0x0}, 762: {region: 0x164, script: 0x52, flags: 0x0}, 763: {region: 0x98, script: 0x64, flags: 0x0}, 764: {region: 0x164, script: 0x52, flags: 0x0}, 765: {region: 0x164, script: 0x52, flags: 0x0}, 766: {region: 0x10a, script: 0x52, flags: 0x0}, 767: {region: 0x164, script: 0x52, flags: 0x0}, 768: {region: 0x164, script: 0x52, flags: 0x0}, 769: {region: 0x164, script: 0x52, flags: 0x0}, 770: {region: 0x28, script: 0x3, flags: 0x1}, 771: {region: 0x164, script: 0x52, flags: 0x0}, 772: {region: 0x164, script: 0x52, flags: 0x0}, 773: {region: 0x98, script: 0xe, flags: 0x0}, 774: {region: 0xc3, script: 0x6b, flags: 0x0}, 776: {region: 0x164, script: 0x52, flags: 0x0}, 777: {region: 0x48, script: 0x52, flags: 0x0}, 778: {region: 0x48, script: 0x52, flags: 0x0}, 779: {region: 0x36, script: 0x52, flags: 0x0}, 780: {region: 0x164, script: 0x52, flags: 0x0}, 781: {region: 0x164, script: 0x52, flags: 0x0}, 782: {region: 0x164, script: 0x52, flags: 0x0}, 783: {region: 0x164, script: 0x52, flags: 0x0}, 784: {region: 0x164, script: 0x52, flags: 0x0}, 785: {region: 0x164, script: 0x52, flags: 0x0}, 786: {region: 0x98, script: 0x20, flags: 0x0}, 787: {region: 0xda, script: 0x20, flags: 0x0}, 788: {region: 0x105, script: 0x1e, flags: 0x0}, 789: {region: 0x34, script: 0x68, flags: 0x0}, 790: {region: 0x2b, script: 0x3, flags: 0x1}, 791: {region: 0xca, script: 0x52, flags: 0x0}, 792: {region: 0x164, script: 0x52, flags: 0x0}, 793: {region: 0x164, script: 0x52, flags: 0x0}, 794: {region: 0x164, script: 0x52, flags: 0x0}, 795: {region: 0x98, script: 0x20, flags: 0x0}, 796: {region: 0x51, script: 0x52, flags: 0x0}, 798: {region: 0x164, script: 0x52, flags: 0x0}, 799: {region: 0x134, script: 0x52, flags: 0x0}, 800: {region: 0x164, script: 0x52, flags: 0x0}, 801: {region: 0x164, script: 0x52, flags: 0x0}, 802: {region: 0xe7, script: 0x5, flags: 0x0}, 803: {region: 0xc2, script: 0x52, flags: 0x0}, 804: {region: 0x98, script: 0x20, flags: 0x0}, 805: {region: 0x94, script: 0x52, flags: 0x0}, 806: {region: 0x163, script: 0x52, flags: 0x0}, 807: {region: 0x164, script: 0x52, flags: 0x0}, 808: {region: 0xc3, script: 0x6b, flags: 0x0}, 809: {region: 0x164, script: 0x52, flags: 0x0}, 810: {region: 0x164, script: 0x27, flags: 0x0}, 811: {region: 0x105, script: 0x1e, flags: 0x0}, 812: {region: 0x164, script: 0x52, flags: 0x0}, 813: {region: 0x130, script: 0x52, flags: 0x0}, 814: {region: 0x9b, script: 0x5d, flags: 0x0}, 815: {region: 0x164, script: 0x52, flags: 0x0}, 816: {region: 0x164, script: 0x52, flags: 0x0}, 817: {region: 0x9b, script: 0x5, flags: 0x0}, 818: {region: 0x164, script: 0x52, flags: 0x0}, 819: {region: 0x164, script: 0x52, flags: 0x0}, 820: {region: 0x164, script: 0x52, flags: 0x0}, 821: {region: 0xdc, script: 0x52, flags: 0x0}, 822: {region: 0x164, script: 0x52, flags: 0x0}, 823: {region: 0x164, script: 0x52, flags: 0x0}, 825: {region: 0x164, script: 0x52, flags: 0x0}, 826: {region: 0x52, script: 0x34, flags: 0x0}, 827: {region: 0x9d, script: 0x52, flags: 0x0}, 828: {region: 0xd1, script: 0x52, flags: 0x0}, 829: {region: 0x164, script: 0x52, flags: 0x0}, 830: {region: 0xd9, script: 0x52, flags: 0x0}, 831: {region: 0x164, script: 0x52, flags: 0x0}, 832: {region: 0x164, script: 0x52, flags: 0x0}, 833: {region: 0x164, script: 0x52, flags: 0x0}, 834: {region: 0xce, script: 0x52, flags: 0x0}, 835: {region: 0x164, script: 0x52, flags: 0x0}, 836: {region: 0x164, script: 0x52, flags: 0x0}, 837: {region: 0x163, script: 0x52, flags: 0x0}, 838: {region: 0xd0, script: 0x52, flags: 0x0}, 839: {region: 0x5f, script: 0x52, flags: 0x0}, 840: {region: 0xda, script: 0x20, flags: 0x0}, 841: {region: 0x164, script: 0x52, flags: 0x0}, 842: {region: 0xda, script: 0x20, flags: 0x0}, 843: {region: 0x164, script: 0x52, flags: 0x0}, 844: {region: 0x164, script: 0x52, flags: 0x0}, 845: {region: 0xd1, script: 0x52, flags: 0x0}, 846: {region: 0x164, script: 0x52, flags: 0x0}, 847: {region: 0x164, script: 0x52, flags: 0x0}, 848: {region: 0xd0, script: 0x52, flags: 0x0}, 849: {region: 0x164, script: 0x52, flags: 0x0}, 850: {region: 0xce, script: 0x52, flags: 0x0}, 851: {region: 0xce, script: 0x52, flags: 0x0}, 852: {region: 0x164, script: 0x52, flags: 0x0}, 853: {region: 0x164, script: 0x52, flags: 0x0}, 854: {region: 0x94, script: 0x52, flags: 0x0}, 855: {region: 0x164, script: 0x52, flags: 0x0}, 856: {region: 0xde, script: 0x52, flags: 0x0}, 857: {region: 0x164, script: 0x52, flags: 0x0}, 858: {region: 0x164, script: 0x52, flags: 0x0}, 859: {region: 0x98, script: 0x52, flags: 0x0}, 860: {region: 0x164, script: 0x52, flags: 0x0}, 861: {region: 0x164, script: 0x52, flags: 0x0}, 862: {region: 0xd8, script: 0x52, flags: 0x0}, 863: {region: 0x51, script: 0x52, flags: 0x0}, 864: {region: 0x164, script: 0x52, flags: 0x0}, 865: {region: 0xd9, script: 0x52, flags: 0x0}, 866: {region: 0x164, script: 0x52, flags: 0x0}, 867: {region: 0x51, script: 0x52, flags: 0x0}, 868: {region: 0x164, script: 0x52, flags: 0x0}, 869: {region: 0x164, script: 0x52, flags: 0x0}, 870: {region: 0xd9, script: 0x52, flags: 0x0}, 871: {region: 0x122, script: 0x4e, flags: 0x0}, 872: {region: 0x98, script: 0x20, flags: 0x0}, 873: {region: 0x10b, script: 0xb7, flags: 0x0}, 874: {region: 0x164, script: 0x52, flags: 0x0}, 875: {region: 0x164, script: 0x52, flags: 0x0}, 876: {region: 0x83, script: 0x70, flags: 0x0}, 877: {region: 0x160, script: 0x52, flags: 0x0}, 878: {region: 0x164, script: 0x52, flags: 0x0}, 879: {region: 0x48, script: 0x17, flags: 0x0}, 880: {region: 0x164, script: 0x52, flags: 0x0}, 881: {region: 0x160, script: 0x52, flags: 0x0}, 882: {region: 0x164, script: 0x52, flags: 0x0}, 883: {region: 0x164, script: 0x52, flags: 0x0}, 884: {region: 0x164, script: 0x52, flags: 0x0}, 885: {region: 0x164, script: 0x52, flags: 0x0}, 886: {region: 0x164, script: 0x52, flags: 0x0}, 887: {region: 0x116, script: 0x52, flags: 0x0}, 888: {region: 0x164, script: 0x52, flags: 0x0}, 889: {region: 0x164, script: 0x52, flags: 0x0}, 890: {region: 0x134, script: 0x52, flags: 0x0}, 891: {region: 0x164, script: 0x52, flags: 0x0}, 892: {region: 0x52, script: 0x52, flags: 0x0}, 893: {region: 0x164, script: 0x52, flags: 0x0}, 894: {region: 0xcd, script: 0x52, flags: 0x0}, 895: {region: 0x12e, script: 0x52, flags: 0x0}, 896: {region: 0x130, script: 0x52, flags: 0x0}, 897: {region: 0x7f, script: 0x52, flags: 0x0}, 898: {region: 0x77, script: 0x52, flags: 0x0}, 899: {region: 0x164, script: 0x52, flags: 0x0}, 901: {region: 0x164, script: 0x52, flags: 0x0}, 902: {region: 0x164, script: 0x52, flags: 0x0}, 903: {region: 0x6e, script: 0x52, flags: 0x0}, 904: {region: 0x164, script: 0x52, flags: 0x0}, 905: {region: 0x164, script: 0x52, flags: 0x0}, 906: {region: 0x164, script: 0x52, flags: 0x0}, 907: {region: 0x164, script: 0x52, flags: 0x0}, 908: {region: 0x98, script: 0x75, flags: 0x0}, 909: {region: 0x164, script: 0x52, flags: 0x0}, 910: {region: 0x164, script: 0x5, flags: 0x0}, 911: {region: 0x7c, script: 0x1e, flags: 0x0}, 912: {region: 0x134, script: 0x76, flags: 0x0}, 913: {region: 0x164, script: 0x5, flags: 0x0}, 914: {region: 0xc4, script: 0x74, flags: 0x0}, 915: {region: 0x164, script: 0x52, flags: 0x0}, 916: {region: 0x2e, script: 0x3, flags: 0x1}, 917: {region: 0xe6, script: 0x52, flags: 0x0}, 918: {region: 0x31, script: 0x2, flags: 0x1}, 919: {region: 0xe6, script: 0x52, flags: 0x0}, 920: {region: 0x2f, script: 0x52, flags: 0x0}, 921: {region: 0xef, script: 0x52, flags: 0x0}, 922: {region: 0x164, script: 0x52, flags: 0x0}, 923: {region: 0x77, script: 0x52, flags: 0x0}, 924: {region: 0xd5, script: 0x52, flags: 0x0}, 925: {region: 0x134, script: 0x52, flags: 0x0}, 926: {region: 0x48, script: 0x52, flags: 0x0}, 927: {region: 0x164, script: 0x52, flags: 0x0}, 928: {region: 0x9b, script: 0xdd, flags: 0x0}, 929: {region: 0x164, script: 0x52, flags: 0x0}, 930: {region: 0x5f, script: 0x52, flags: 0x0}, 931: {region: 0x164, script: 0x5, flags: 0x0}, 932: {region: 0xaf, script: 0x7f, flags: 0x0}, 934: {region: 0x164, script: 0x52, flags: 0x0}, 935: {region: 0x164, script: 0x52, flags: 0x0}, 936: {region: 0x98, script: 0x12, flags: 0x0}, 937: {region: 0xa3, script: 0x52, flags: 0x0}, 938: {region: 0xe8, script: 0x52, flags: 0x0}, 939: {region: 0x164, script: 0x52, flags: 0x0}, 940: {region: 0x9d, script: 0x52, flags: 0x0}, 941: {region: 0x164, script: 0x52, flags: 0x0}, 942: {region: 0x164, script: 0x52, flags: 0x0}, 943: {region: 0x86, script: 0x2d, flags: 0x0}, 944: {region: 0x74, script: 0x52, flags: 0x0}, 945: {region: 0x164, script: 0x52, flags: 0x0}, 946: {region: 0xe7, script: 0x45, flags: 0x0}, 947: {region: 0x9b, script: 0x5, flags: 0x0}, 948: {region: 0x1, script: 0x52, flags: 0x0}, 949: {region: 0x23, script: 0x5, flags: 0x0}, 950: {region: 0x164, script: 0x52, flags: 0x0}, 951: {region: 0x40, script: 0x52, flags: 0x0}, 952: {region: 0x164, script: 0x52, flags: 0x0}, 953: {region: 0x79, script: 0x52, flags: 0x0}, 954: {region: 0x164, script: 0x52, flags: 0x0}, 955: {region: 0xe3, script: 0x52, flags: 0x0}, 956: {region: 0x88, script: 0x52, flags: 0x0}, 957: {region: 0x68, script: 0x52, flags: 0x0}, 958: {region: 0x164, script: 0x52, flags: 0x0}, 959: {region: 0x98, script: 0x20, flags: 0x0}, 960: {region: 0x164, script: 0x52, flags: 0x0}, 961: {region: 0x101, script: 0x52, flags: 0x0}, 962: {region: 0x94, script: 0x52, flags: 0x0}, 963: {region: 0x164, script: 0x52, flags: 0x0}, 964: {region: 0x164, script: 0x52, flags: 0x0}, 965: {region: 0x9d, script: 0x52, flags: 0x0}, 966: {region: 0x164, script: 0x5, flags: 0x0}, 967: {region: 0x98, script: 0x52, flags: 0x0}, 968: {region: 0x33, script: 0x2, flags: 0x1}, 969: {region: 0xda, script: 0x20, flags: 0x0}, 970: {region: 0x34, script: 0xe, flags: 0x0}, 971: {region: 0x4d, script: 0x52, flags: 0x0}, 972: {region: 0x71, script: 0x52, flags: 0x0}, 973: {region: 0x4d, script: 0x52, flags: 0x0}, 974: {region: 0x9b, script: 0x5, flags: 0x0}, 975: {region: 0x10b, script: 0x52, flags: 0x0}, 976: {region: 0x39, script: 0x52, flags: 0x0}, 977: {region: 0x164, script: 0x52, flags: 0x0}, 978: {region: 0xd0, script: 0x52, flags: 0x0}, 979: {region: 0x103, script: 0x52, flags: 0x0}, 980: {region: 0x94, script: 0x52, flags: 0x0}, 981: {region: 0x12e, script: 0x52, flags: 0x0}, 982: {region: 0x164, script: 0x52, flags: 0x0}, 983: {region: 0x164, script: 0x52, flags: 0x0}, 984: {region: 0x72, script: 0x52, flags: 0x0}, 985: {region: 0x105, script: 0x1e, flags: 0x0}, 986: {region: 0x12f, script: 0x1e, flags: 0x0}, 987: {region: 0x108, script: 0x52, flags: 0x0}, 988: {region: 0x106, script: 0x52, flags: 0x0}, 989: {region: 0x12e, script: 0x52, flags: 0x0}, 990: {region: 0x164, script: 0x52, flags: 0x0}, 991: {region: 0xa1, script: 0x44, flags: 0x0}, 992: {region: 0x98, script: 0x20, flags: 0x0}, 993: {region: 0x7f, script: 0x52, flags: 0x0}, 994: {region: 0x105, script: 0x1e, flags: 0x0}, 995: {region: 0xa3, script: 0x52, flags: 0x0}, 996: {region: 0x94, script: 0x52, flags: 0x0}, 997: {region: 0x98, script: 0x52, flags: 0x0}, 998: {region: 0x98, script: 0xbb, flags: 0x0}, 999: {region: 0x164, script: 0x52, flags: 0x0}, 1000: {region: 0x164, script: 0x52, flags: 0x0}, 1001: {region: 0x12e, script: 0x52, flags: 0x0}, 1002: {region: 0x9d, script: 0x52, flags: 0x0}, 1003: {region: 0x98, script: 0x20, flags: 0x0}, 1004: {region: 0x164, script: 0x5, flags: 0x0}, 1005: {region: 0x9d, script: 0x52, flags: 0x0}, 1006: {region: 0x7a, script: 0x52, flags: 0x0}, 1007: {region: 0x48, script: 0x52, flags: 0x0}, 1008: {region: 0x35, script: 0x4, flags: 0x1}, 1009: {region: 0x9d, script: 0x52, flags: 0x0}, 1010: {region: 0x9b, script: 0x5, flags: 0x0}, 1011: {region: 0xd9, script: 0x52, flags: 0x0}, 1012: {region: 0x4e, script: 0x52, flags: 0x0}, 1013: {region: 0xd0, script: 0x52, flags: 0x0}, 1014: {region: 0xce, script: 0x52, flags: 0x0}, 1015: {region: 0xc2, script: 0x52, flags: 0x0}, 1016: {region: 0x4b, script: 0x52, flags: 0x0}, 1017: {region: 0x95, script: 0x72, flags: 0x0}, 1018: {region: 0xb5, script: 0x52, flags: 0x0}, 1019: {region: 0x164, script: 0x27, flags: 0x0}, 1020: {region: 0x164, script: 0x52, flags: 0x0}, 1022: {region: 0xb9, script: 0xd2, flags: 0x0}, 1023: {region: 0x164, script: 0x52, flags: 0x0}, 1024: {region: 0xc3, script: 0x6b, flags: 0x0}, 1025: {region: 0x164, script: 0x5, flags: 0x0}, 1026: {region: 0xb2, script: 0xc1, flags: 0x0}, 1027: {region: 0x6e, script: 0x52, flags: 0x0}, 1028: {region: 0x164, script: 0x52, flags: 0x0}, 1029: {region: 0x164, script: 0x52, flags: 0x0}, 1030: {region: 0x164, script: 0x52, flags: 0x0}, 1031: {region: 0x164, script: 0x52, flags: 0x0}, 1032: {region: 0x110, script: 0x52, flags: 0x0}, 1033: {region: 0x164, script: 0x52, flags: 0x0}, 1034: {region: 0xe7, script: 0x5, flags: 0x0}, 1035: {region: 0x164, script: 0x52, flags: 0x0}, 1036: {region: 0x10e, script: 0x52, flags: 0x0}, 1037: {region: 0x164, script: 0x52, flags: 0x0}, 1038: {region: 0xe8, script: 0x52, flags: 0x0}, 1039: {region: 0x164, script: 0x52, flags: 0x0}, 1040: {region: 0x94, script: 0x52, flags: 0x0}, 1041: {region: 0x141, script: 0x52, flags: 0x0}, 1042: {region: 0x10b, script: 0x52, flags: 0x0}, 1044: {region: 0x10b, script: 0x52, flags: 0x0}, 1045: {region: 0x71, script: 0x52, flags: 0x0}, 1046: {region: 0x96, script: 0xb8, flags: 0x0}, 1047: {region: 0x164, script: 0x52, flags: 0x0}, 1048: {region: 0x71, script: 0x52, flags: 0x0}, 1049: {region: 0x163, script: 0x52, flags: 0x0}, 1050: {region: 0x164, script: 0x52, flags: 0x0}, 1051: {region: 0xc2, script: 0x52, flags: 0x0}, 1052: {region: 0x164, script: 0x52, flags: 0x0}, 1053: {region: 0x164, script: 0x52, flags: 0x0}, 1054: {region: 0x164, script: 0x52, flags: 0x0}, 1055: {region: 0x114, script: 0x52, flags: 0x0}, 1056: {region: 0x164, script: 0x52, flags: 0x0}, 1057: {region: 0x164, script: 0x52, flags: 0x0}, 1058: {region: 0x122, script: 0xd5, flags: 0x0}, 1059: {region: 0x164, script: 0x52, flags: 0x0}, 1060: {region: 0x164, script: 0x52, flags: 0x0}, 1061: {region: 0x164, script: 0x52, flags: 0x0}, 1062: {region: 0x164, script: 0x52, flags: 0x0}, 1063: {region: 0x26, script: 0x52, flags: 0x0}, 1064: {region: 0x39, script: 0x5, flags: 0x1}, 1065: {region: 0x98, script: 0xc2, flags: 0x0}, 1066: {region: 0x115, script: 0x52, flags: 0x0}, 1067: {region: 0x113, script: 0x52, flags: 0x0}, 1068: {region: 0x98, script: 0x20, flags: 0x0}, 1069: {region: 0x160, script: 0x52, flags: 0x0}, 1070: {region: 0x164, script: 0x52, flags: 0x0}, 1071: {region: 0x164, script: 0x52, flags: 0x0}, 1072: {region: 0x6c, script: 0x52, flags: 0x0}, 1073: {region: 0x160, script: 0x52, flags: 0x0}, 1074: {region: 0x164, script: 0x52, flags: 0x0}, 1075: {region: 0x5f, script: 0x52, flags: 0x0}, 1076: {region: 0x94, script: 0x52, flags: 0x0}, 1077: {region: 0x164, script: 0x52, flags: 0x0}, 1078: {region: 0x164, script: 0x52, flags: 0x0}, 1079: {region: 0x12e, script: 0x52, flags: 0x0}, 1080: {region: 0x164, script: 0x52, flags: 0x0}, 1081: {region: 0x83, script: 0x52, flags: 0x0}, 1082: {region: 0x10b, script: 0x52, flags: 0x0}, 1083: {region: 0x12e, script: 0x52, flags: 0x0}, 1084: {region: 0x15e, script: 0x5, flags: 0x0}, 1085: {region: 0x4a, script: 0x52, flags: 0x0}, 1086: {region: 0x5f, script: 0x52, flags: 0x0}, 1087: {region: 0x164, script: 0x52, flags: 0x0}, 1088: {region: 0x98, script: 0x20, flags: 0x0}, 1089: {region: 0x94, script: 0x52, flags: 0x0}, 1090: {region: 0x164, script: 0x52, flags: 0x0}, 1091: {region: 0x34, script: 0xe, flags: 0x0}, 1092: {region: 0x9a, script: 0xc5, flags: 0x0}, 1093: {region: 0xe8, script: 0x52, flags: 0x0}, 1094: {region: 0x98, script: 0xcd, flags: 0x0}, 1095: {region: 0xda, script: 0x20, flags: 0x0}, 1096: {region: 0x164, script: 0x52, flags: 0x0}, 1097: {region: 0x164, script: 0x52, flags: 0x0}, 1098: {region: 0x164, script: 0x52, flags: 0x0}, 1099: {region: 0x164, script: 0x52, flags: 0x0}, 1100: {region: 0x164, script: 0x52, flags: 0x0}, 1101: {region: 0x164, script: 0x52, flags: 0x0}, 1102: {region: 0x164, script: 0x52, flags: 0x0}, 1103: {region: 0x164, script: 0x52, flags: 0x0}, 1104: {region: 0xe6, script: 0x52, flags: 0x0}, 1105: {region: 0x164, script: 0x52, flags: 0x0}, 1106: {region: 0x164, script: 0x52, flags: 0x0}, 1107: {region: 0x98, script: 0x4a, flags: 0x0}, 1108: {region: 0x52, script: 0xcb, flags: 0x0}, 1109: {region: 0xda, script: 0x20, flags: 0x0}, 1110: {region: 0xda, script: 0x20, flags: 0x0}, 1111: {region: 0x98, script: 0xd0, flags: 0x0}, 1112: {region: 0x164, script: 0x52, flags: 0x0}, 1113: {region: 0x111, script: 0x52, flags: 0x0}, 1114: {region: 0x130, script: 0x52, flags: 0x0}, 1115: {region: 0x125, script: 0x52, flags: 0x0}, 1116: {region: 0x164, script: 0x52, flags: 0x0}, 1117: {region: 0x3e, script: 0x3, flags: 0x1}, 1118: {region: 0x164, script: 0x52, flags: 0x0}, 1119: {region: 0x164, script: 0x52, flags: 0x0}, 1120: {region: 0x164, script: 0x52, flags: 0x0}, 1121: {region: 0x122, script: 0xd5, flags: 0x0}, 1122: {region: 0xda, script: 0x20, flags: 0x0}, 1123: {region: 0xda, script: 0x20, flags: 0x0}, 1124: {region: 0xda, script: 0x20, flags: 0x0}, 1125: {region: 0x6e, script: 0x27, flags: 0x0}, 1126: {region: 0x164, script: 0x52, flags: 0x0}, 1127: {region: 0x6c, script: 0x27, flags: 0x0}, 1128: {region: 0x164, script: 0x52, flags: 0x0}, 1129: {region: 0x164, script: 0x52, flags: 0x0}, 1130: {region: 0x164, script: 0x52, flags: 0x0}, 1131: {region: 0xd5, script: 0x52, flags: 0x0}, 1132: {region: 0x126, script: 0x52, flags: 0x0}, 1133: {region: 0x124, script: 0x52, flags: 0x0}, 1134: {region: 0x31, script: 0x52, flags: 0x0}, 1135: {region: 0xda, script: 0x20, flags: 0x0}, 1136: {region: 0xe6, script: 0x52, flags: 0x0}, 1137: {region: 0x164, script: 0x52, flags: 0x0}, 1138: {region: 0x164, script: 0x52, flags: 0x0}, 1139: {region: 0x31, script: 0x52, flags: 0x0}, 1140: {region: 0xd3, script: 0x52, flags: 0x0}, 1141: {region: 0x164, script: 0x52, flags: 0x0}, 1142: {region: 0x160, script: 0x52, flags: 0x0}, 1143: {region: 0x164, script: 0x52, flags: 0x0}, 1144: {region: 0x128, script: 0x52, flags: 0x0}, 1145: {region: 0x164, script: 0x52, flags: 0x0}, 1146: {region: 0xcd, script: 0x52, flags: 0x0}, 1147: {region: 0x164, script: 0x52, flags: 0x0}, 1148: {region: 0xe5, script: 0x52, flags: 0x0}, 1149: {region: 0x164, script: 0x52, flags: 0x0}, 1150: {region: 0x164, script: 0x52, flags: 0x0}, 1151: {region: 0x164, script: 0x52, flags: 0x0}, 1152: {region: 0x12a, script: 0x52, flags: 0x0}, 1153: {region: 0x12a, script: 0x52, flags: 0x0}, 1154: {region: 0x12d, script: 0x52, flags: 0x0}, 1155: {region: 0x164, script: 0x5, flags: 0x0}, 1156: {region: 0x160, script: 0x52, flags: 0x0}, 1157: {region: 0x86, script: 0x2d, flags: 0x0}, 1158: {region: 0xda, script: 0x20, flags: 0x0}, 1159: {region: 0xe6, script: 0x52, flags: 0x0}, 1160: {region: 0x42, script: 0xd6, flags: 0x0}, 1161: {region: 0x164, script: 0x52, flags: 0x0}, 1162: {region: 0x105, script: 0x1e, flags: 0x0}, 1163: {region: 0x164, script: 0x52, flags: 0x0}, 1164: {region: 0x164, script: 0x52, flags: 0x0}, 1165: {region: 0x130, script: 0x52, flags: 0x0}, 1166: {region: 0x164, script: 0x52, flags: 0x0}, 1167: {region: 0x122, script: 0xd5, flags: 0x0}, 1168: {region: 0x31, script: 0x52, flags: 0x0}, 1169: {region: 0x164, script: 0x52, flags: 0x0}, 1170: {region: 0x164, script: 0x52, flags: 0x0}, 1171: {region: 0xcd, script: 0x52, flags: 0x0}, 1172: {region: 0x164, script: 0x52, flags: 0x0}, 1173: {region: 0x164, script: 0x52, flags: 0x0}, 1174: {region: 0x12c, script: 0x52, flags: 0x0}, 1175: {region: 0x164, script: 0x52, flags: 0x0}, 1177: {region: 0x164, script: 0x52, flags: 0x0}, 1178: {region: 0xd3, script: 0x52, flags: 0x0}, 1179: {region: 0x52, script: 0xce, flags: 0x0}, 1180: {region: 0xe4, script: 0x52, flags: 0x0}, 1181: {region: 0x164, script: 0x52, flags: 0x0}, 1182: {region: 0x105, script: 0x1e, flags: 0x0}, 1183: {region: 0xb9, script: 0x52, flags: 0x0}, 1184: {region: 0x164, script: 0x52, flags: 0x0}, 1185: {region: 0x105, script: 0x1e, flags: 0x0}, 1186: {region: 0x41, script: 0x4, flags: 0x1}, 1187: {region: 0x11b, script: 0xd8, flags: 0x0}, 1188: {region: 0x12f, script: 0x1e, flags: 0x0}, 1189: {region: 0x74, script: 0x52, flags: 0x0}, 1190: {region: 0x29, script: 0x52, flags: 0x0}, 1192: {region: 0x45, script: 0x3, flags: 0x1}, 1193: {region: 0x98, script: 0xe, flags: 0x0}, 1194: {region: 0xe7, script: 0x5, flags: 0x0}, 1195: {region: 0x164, script: 0x52, flags: 0x0}, 1196: {region: 0x164, script: 0x52, flags: 0x0}, 1197: {region: 0x164, script: 0x52, flags: 0x0}, 1198: {region: 0x164, script: 0x52, flags: 0x0}, 1199: {region: 0x164, script: 0x52, flags: 0x0}, 1200: {region: 0x164, script: 0x52, flags: 0x0}, 1201: {region: 0x164, script: 0x52, flags: 0x0}, 1202: {region: 0x48, script: 0x4, flags: 0x1}, 1203: {region: 0x164, script: 0x52, flags: 0x0}, 1204: {region: 0xb3, script: 0xd9, flags: 0x0}, 1205: {region: 0x164, script: 0x52, flags: 0x0}, 1206: {region: 0x160, script: 0x52, flags: 0x0}, 1207: {region: 0x9d, script: 0x52, flags: 0x0}, 1208: {region: 0x105, script: 0x52, flags: 0x0}, 1209: {region: 0x13d, script: 0x52, flags: 0x0}, 1210: {region: 0x11a, script: 0x52, flags: 0x0}, 1211: {region: 0x164, script: 0x52, flags: 0x0}, 1212: {region: 0x35, script: 0x52, flags: 0x0}, 1213: {region: 0x5f, script: 0x52, flags: 0x0}, 1214: {region: 0xd0, script: 0x52, flags: 0x0}, 1215: {region: 0x1, script: 0x52, flags: 0x0}, 1216: {region: 0x105, script: 0x52, flags: 0x0}, 1217: {region: 0x69, script: 0x52, flags: 0x0}, 1218: {region: 0x12e, script: 0x52, flags: 0x0}, 1219: {region: 0x164, script: 0x52, flags: 0x0}, 1220: {region: 0x35, script: 0x52, flags: 0x0}, 1221: {region: 0x4d, script: 0x52, flags: 0x0}, 1222: {region: 0x164, script: 0x52, flags: 0x0}, 1223: {region: 0x6e, script: 0x27, flags: 0x0}, 1224: {region: 0x164, script: 0x52, flags: 0x0}, 1225: {region: 0xe6, script: 0x52, flags: 0x0}, 1226: {region: 0x2e, script: 0x52, flags: 0x0}, 1227: {region: 0x98, script: 0xd0, flags: 0x0}, 1228: {region: 0x98, script: 0x20, flags: 0x0}, 1229: {region: 0x164, script: 0x52, flags: 0x0}, 1230: {region: 0x164, script: 0x52, flags: 0x0}, 1231: {region: 0x164, script: 0x52, flags: 0x0}, 1232: {region: 0x164, script: 0x52, flags: 0x0}, 1233: {region: 0x164, script: 0x52, flags: 0x0}, 1234: {region: 0x164, script: 0x52, flags: 0x0}, 1235: {region: 0x164, script: 0x52, flags: 0x0}, 1236: {region: 0x164, script: 0x52, flags: 0x0}, 1237: {region: 0x164, script: 0x52, flags: 0x0}, 1238: {region: 0x13f, script: 0x52, flags: 0x0}, 1239: {region: 0x164, script: 0x52, flags: 0x0}, 1240: {region: 0x164, script: 0x52, flags: 0x0}, 1241: {region: 0xa7, script: 0x5, flags: 0x0}, 1242: {region: 0x164, script: 0x52, flags: 0x0}, 1243: {region: 0x113, script: 0x52, flags: 0x0}, 1244: {region: 0x164, script: 0x52, flags: 0x0}, 1245: {region: 0x164, script: 0x52, flags: 0x0}, 1246: {region: 0x164, script: 0x52, flags: 0x0}, 1247: {region: 0x164, script: 0x52, flags: 0x0}, 1248: {region: 0x98, script: 0x20, flags: 0x0}, 1249: {region: 0x52, script: 0x34, flags: 0x0}, 1250: {region: 0x164, script: 0x52, flags: 0x0}, 1251: {region: 0x164, script: 0x52, flags: 0x0}, 1252: {region: 0x40, script: 0x52, flags: 0x0}, 1253: {region: 0x164, script: 0x52, flags: 0x0}, 1254: {region: 0x12a, script: 0x18, flags: 0x0}, 1255: {region: 0x164, script: 0x52, flags: 0x0}, 1256: {region: 0x160, script: 0x52, flags: 0x0}, 1257: {region: 0x164, script: 0x52, flags: 0x0}, 1258: {region: 0x12a, script: 0x5a, flags: 0x0}, 1259: {region: 0x12a, script: 0x5b, flags: 0x0}, 1260: {region: 0x7c, script: 0x29, flags: 0x0}, 1261: {region: 0x52, script: 0x5e, flags: 0x0}, 1262: {region: 0x10a, script: 0x62, flags: 0x0}, 1263: {region: 0x107, script: 0x6c, flags: 0x0}, 1264: {region: 0x98, script: 0x20, flags: 0x0}, 1265: {region: 0x130, script: 0x52, flags: 0x0}, 1266: {region: 0x164, script: 0x52, flags: 0x0}, 1267: {region: 0x9b, script: 0x82, flags: 0x0}, 1268: {region: 0x164, script: 0x52, flags: 0x0}, 1269: {region: 0x15d, script: 0xba, flags: 0x0}, 1270: {region: 0x164, script: 0x52, flags: 0x0}, 1271: {region: 0x164, script: 0x52, flags: 0x0}, 1272: {region: 0xda, script: 0x20, flags: 0x0}, 1273: {region: 0x164, script: 0x52, flags: 0x0}, 1274: {region: 0x164, script: 0x52, flags: 0x0}, 1275: {region: 0xd0, script: 0x52, flags: 0x0}, 1276: {region: 0x74, script: 0x52, flags: 0x0}, 1277: {region: 0x164, script: 0x52, flags: 0x0}, 1278: {region: 0x164, script: 0x52, flags: 0x0}, 1279: {region: 0x51, script: 0x52, flags: 0x0}, 1280: {region: 0x164, script: 0x52, flags: 0x0}, 1281: {region: 0x164, script: 0x52, flags: 0x0}, 1282: {region: 0x164, script: 0x52, flags: 0x0}, 1283: {region: 0x51, script: 0x52, flags: 0x0}, 1284: {region: 0x164, script: 0x52, flags: 0x0}, 1285: {region: 0x164, script: 0x52, flags: 0x0}, 1286: {region: 0x164, script: 0x52, flags: 0x0}, 1287: {region: 0x164, script: 0x52, flags: 0x0}, 1288: {region: 0x1, script: 0x37, flags: 0x0}, 1289: {region: 0x164, script: 0x52, flags: 0x0}, 1290: {region: 0x164, script: 0x52, flags: 0x0}, 1291: {region: 0x164, script: 0x52, flags: 0x0}, 1292: {region: 0x164, script: 0x52, flags: 0x0}, 1293: {region: 0x164, script: 0x52, flags: 0x0}, 1294: {region: 0xd5, script: 0x52, flags: 0x0}, 1295: {region: 0x164, script: 0x52, flags: 0x0}, 1296: {region: 0x164, script: 0x52, flags: 0x0}, 1297: {region: 0x164, script: 0x52, flags: 0x0}, 1298: {region: 0x40, script: 0x52, flags: 0x0}, 1299: {region: 0x164, script: 0x52, flags: 0x0}, 1300: {region: 0xce, script: 0x52, flags: 0x0}, 1301: {region: 0x4c, script: 0x3, flags: 0x1}, 1302: {region: 0x164, script: 0x52, flags: 0x0}, 1303: {region: 0x164, script: 0x52, flags: 0x0}, 1304: {region: 0x164, script: 0x52, flags: 0x0}, 1305: {region: 0x52, script: 0x52, flags: 0x0}, 1306: {region: 0x10a, script: 0x52, flags: 0x0}, 1308: {region: 0xa7, script: 0x5, flags: 0x0}, 1309: {region: 0xd8, script: 0x52, flags: 0x0}, 1310: {region: 0xb9, script: 0xd2, flags: 0x0}, 1311: {region: 0x4f, script: 0x14, flags: 0x1}, 1312: {region: 0x164, script: 0x52, flags: 0x0}, 1313: {region: 0x121, script: 0x52, flags: 0x0}, 1314: {region: 0xcf, script: 0x52, flags: 0x0}, 1315: {region: 0x164, script: 0x52, flags: 0x0}, 1316: {region: 0x160, script: 0x52, flags: 0x0}, 1318: {region: 0x12a, script: 0x52, flags: 0x0}, } // likelyLangList holds lists info associated with likelyLang. // Size: 396 bytes, 99 elements var likelyLangList = [99]likelyScriptRegion{ 0: {region: 0x9b, script: 0x7, flags: 0x0}, 1: {region: 0xa0, script: 0x6d, flags: 0x2}, 2: {region: 0x11b, script: 0x78, flags: 0x2}, 3: {region: 0x31, script: 0x52, flags: 0x0}, 4: {region: 0x9a, script: 0x5, flags: 0x4}, 5: {region: 0x9b, script: 0x5, flags: 0x4}, 6: {region: 0x105, script: 0x1e, flags: 0x4}, 7: {region: 0x9b, script: 0x5, flags: 0x2}, 8: {region: 0x98, script: 0xe, flags: 0x0}, 9: {region: 0x34, script: 0x16, flags: 0x2}, 10: {region: 0x105, script: 0x1e, flags: 0x0}, 11: {region: 0x37, script: 0x2a, flags: 0x2}, 12: {region: 0x134, script: 0x52, flags: 0x0}, 13: {region: 0x7a, script: 0xbd, flags: 0x2}, 14: {region: 0x113, script: 0x52, flags: 0x0}, 15: {region: 0x83, script: 0x1, flags: 0x2}, 16: {region: 0x5c, script: 0x1d, flags: 0x0}, 17: {region: 0x86, script: 0x57, flags: 0x2}, 18: {region: 0xd5, script: 0x52, flags: 0x0}, 19: {region: 0x51, script: 0x5, flags: 0x4}, 20: {region: 0x10a, script: 0x5, flags: 0x4}, 21: {region: 0xad, script: 0x1e, flags: 0x0}, 22: {region: 0x23, script: 0x5, flags: 0x4}, 23: {region: 0x52, script: 0x5, flags: 0x4}, 24: {region: 0x9b, script: 0x5, flags: 0x4}, 25: {region: 0xc4, script: 0x5, flags: 0x4}, 26: {region: 0x52, script: 0x5, flags: 0x2}, 27: {region: 0x12a, script: 0x52, flags: 0x0}, 28: {region: 0xaf, script: 0x5, flags: 0x4}, 29: {region: 0x9a, script: 0x5, flags: 0x2}, 30: {region: 0xa4, script: 0x1e, flags: 0x0}, 31: {region: 0x52, script: 0x5, flags: 0x4}, 32: {region: 0x12a, script: 0x52, flags: 0x4}, 33: {region: 0x52, script: 0x5, flags: 0x2}, 34: {region: 0x12a, script: 0x52, flags: 0x2}, 35: {region: 0xda, script: 0x20, flags: 0x0}, 36: {region: 0x98, script: 0x55, flags: 0x2}, 37: {region: 0x82, script: 0x52, flags: 0x0}, 38: {region: 0x83, script: 0x70, flags: 0x4}, 39: {region: 0x83, script: 0x70, flags: 0x2}, 40: {region: 0xc4, script: 0x1e, flags: 0x0}, 41: {region: 0x52, script: 0x66, flags: 0x4}, 42: {region: 0x52, script: 0x66, flags: 0x2}, 43: {region: 0xcf, script: 0x52, flags: 0x0}, 44: {region: 0x49, script: 0x5, flags: 0x4}, 45: {region: 0x94, script: 0x5, flags: 0x4}, 46: {region: 0x98, script: 0x2f, flags: 0x0}, 47: {region: 0xe7, script: 0x5, flags: 0x4}, 48: {region: 0xe7, script: 0x5, flags: 0x2}, 49: {region: 0x9b, script: 0x7c, flags: 0x0}, 50: {region: 0x52, script: 0x7d, flags: 0x2}, 51: {region: 0xb9, script: 0xd2, flags: 0x0}, 52: {region: 0xd8, script: 0x52, flags: 0x4}, 53: {region: 0xe7, script: 0x5, flags: 0x0}, 54: {region: 0x98, script: 0x20, flags: 0x2}, 55: {region: 0x98, script: 0x47, flags: 0x2}, 56: {region: 0x98, script: 0xc0, flags: 0x2}, 57: {region: 0x104, script: 0x1e, flags: 0x0}, 58: {region: 0xbc, script: 0x52, flags: 0x4}, 59: {region: 0x103, script: 0x52, flags: 0x4}, 60: {region: 0x105, script: 0x52, flags: 0x4}, 61: {region: 0x12a, script: 0x52, flags: 0x4}, 62: {region: 0x123, script: 0x1e, flags: 0x0}, 63: {region: 0xe7, script: 0x5, flags: 0x4}, 64: {region: 0xe7, script: 0x5, flags: 0x2}, 65: {region: 0x52, script: 0x5, flags: 0x0}, 66: {region: 0xad, script: 0x1e, flags: 0x4}, 67: {region: 0xc4, script: 0x1e, flags: 0x4}, 68: {region: 0xad, script: 0x1e, flags: 0x2}, 69: {region: 0x98, script: 0xe, flags: 0x0}, 70: {region: 0xda, script: 0x20, flags: 0x4}, 71: {region: 0xda, script: 0x20, flags: 0x2}, 72: {region: 0x136, script: 0x52, flags: 0x0}, 73: {region: 0x23, script: 0x5, flags: 0x4}, 74: {region: 0x52, script: 0x1e, flags: 0x4}, 75: {region: 0x23, script: 0x5, flags: 0x2}, 76: {region: 0x8c, script: 0x35, flags: 0x0}, 77: {region: 0x52, script: 0x34, flags: 0x4}, 78: {region: 0x52, script: 0x34, flags: 0x2}, 79: {region: 0x52, script: 0x34, flags: 0x0}, 80: {region: 0x2e, script: 0x35, flags: 0x4}, 81: {region: 0x3d, script: 0x35, flags: 0x4}, 82: {region: 0x7a, script: 0x35, flags: 0x4}, 83: {region: 0x7d, script: 0x35, flags: 0x4}, 84: {region: 0x8c, script: 0x35, flags: 0x4}, 85: {region: 0x94, script: 0x35, flags: 0x4}, 86: {region: 0xc5, script: 0x35, flags: 0x4}, 87: {region: 0xcf, script: 0x35, flags: 0x4}, 88: {region: 0xe1, script: 0x35, flags: 0x4}, 89: {region: 0xe4, script: 0x35, flags: 0x4}, 90: {region: 0xe6, script: 0x35, flags: 0x4}, 91: {region: 0x115, script: 0x35, flags: 0x4}, 92: {region: 0x122, script: 0x35, flags: 0x4}, 93: {region: 0x12d, script: 0x35, flags: 0x4}, 94: {region: 0x134, script: 0x35, flags: 0x4}, 95: {region: 0x13d, script: 0x35, flags: 0x4}, 96: {region: 0x12d, script: 0x11, flags: 0x2}, 97: {region: 0x12d, script: 0x30, flags: 0x2}, 98: {region: 0x12d, script: 0x35, flags: 0x2}, } type likelyLangScript struct { lang uint16 script uint8 flags uint8 } // likelyRegion is a lookup table, indexed by regionID, for the most likely // languages and scripts given incomplete information. If more entries exist // for a given regionID, lang and script are the index and size respectively // of the list in likelyRegionList. // TODO: exclude containers and user-definable regions from the list. // Size: 1428 bytes, 357 elements var likelyRegion = [357]likelyLangScript{ 33: {lang: 0xd5, script: 0x52, flags: 0x0}, 34: {lang: 0x39, script: 0x5, flags: 0x0}, 35: {lang: 0x0, script: 0x2, flags: 0x1}, 38: {lang: 0x2, script: 0x2, flags: 0x1}, 39: {lang: 0x4, script: 0x2, flags: 0x1}, 41: {lang: 0x3b7, script: 0x52, flags: 0x0}, 42: {lang: 0x0, script: 0x52, flags: 0x0}, 43: {lang: 0x139, script: 0x52, flags: 0x0}, 44: {lang: 0x411, script: 0x52, flags: 0x0}, 45: {lang: 0x109, script: 0x52, flags: 0x0}, 47: {lang: 0x35e, script: 0x52, flags: 0x0}, 48: {lang: 0x43a, script: 0x52, flags: 0x0}, 49: {lang: 0x57, script: 0x52, flags: 0x0}, 50: {lang: 0x6, script: 0x2, flags: 0x1}, 52: {lang: 0xa3, script: 0xe, flags: 0x0}, 53: {lang: 0x35e, script: 0x52, flags: 0x0}, 54: {lang: 0x159, script: 0x52, flags: 0x0}, 55: {lang: 0x7d, script: 0x1e, flags: 0x0}, 56: {lang: 0x39, script: 0x5, flags: 0x0}, 57: {lang: 0x3d0, script: 0x52, flags: 0x0}, 58: {lang: 0x159, script: 0x52, flags: 0x0}, 59: {lang: 0x159, script: 0x52, flags: 0x0}, 61: {lang: 0x316, script: 0x52, flags: 0x0}, 62: {lang: 0x139, script: 0x52, flags: 0x0}, 63: {lang: 0x398, script: 0x52, flags: 0x0}, 64: {lang: 0x3b7, script: 0x52, flags: 0x0}, 66: {lang: 0x8, script: 0x2, flags: 0x1}, 68: {lang: 0x0, script: 0x52, flags: 0x0}, 70: {lang: 0x70, script: 0x1e, flags: 0x0}, 72: {lang: 0x508, script: 0x37, flags: 0x2}, 73: {lang: 0x316, script: 0x5, flags: 0x2}, 74: {lang: 0x43b, script: 0x52, flags: 0x0}, 75: {lang: 0x159, script: 0x52, flags: 0x0}, 76: {lang: 0x159, script: 0x52, flags: 0x0}, 77: {lang: 0x109, script: 0x52, flags: 0x0}, 78: {lang: 0x159, script: 0x52, flags: 0x0}, 80: {lang: 0x139, script: 0x52, flags: 0x0}, 81: {lang: 0x159, script: 0x52, flags: 0x0}, 82: {lang: 0xa, script: 0x5, flags: 0x1}, 83: {lang: 0x139, script: 0x52, flags: 0x0}, 84: {lang: 0x0, script: 0x52, flags: 0x0}, 85: {lang: 0x139, script: 0x52, flags: 0x0}, 88: {lang: 0x139, script: 0x52, flags: 0x0}, 89: {lang: 0x3b7, script: 0x52, flags: 0x0}, 90: {lang: 0x398, script: 0x52, flags: 0x0}, 92: {lang: 0xf, script: 0x2, flags: 0x1}, 93: {lang: 0xf6, script: 0x52, flags: 0x0}, 95: {lang: 0x109, script: 0x52, flags: 0x0}, 97: {lang: 0x1, script: 0x52, flags: 0x0}, 98: {lang: 0xfd, script: 0x52, flags: 0x0}, 100: {lang: 0x139, script: 0x52, flags: 0x0}, 102: {lang: 0x11, script: 0x2, flags: 0x1}, 103: {lang: 0x139, script: 0x52, flags: 0x0}, 104: {lang: 0x139, script: 0x52, flags: 0x0}, 105: {lang: 0x13b, script: 0x52, flags: 0x0}, 106: {lang: 0x39, script: 0x5, flags: 0x0}, 107: {lang: 0x39, script: 0x5, flags: 0x0}, 108: {lang: 0x465, script: 0x27, flags: 0x0}, 109: {lang: 0x139, script: 0x52, flags: 0x0}, 110: {lang: 0x13, script: 0x2, flags: 0x1}, 112: {lang: 0x109, script: 0x52, flags: 0x0}, 113: {lang: 0x14c, script: 0x52, flags: 0x0}, 114: {lang: 0x1b9, script: 0x20, flags: 0x2}, 117: {lang: 0x153, script: 0x52, flags: 0x0}, 119: {lang: 0x159, script: 0x52, flags: 0x0}, 121: {lang: 0x159, script: 0x52, flags: 0x0}, 122: {lang: 0x15, script: 0x2, flags: 0x1}, 124: {lang: 0x17, script: 0x3, flags: 0x1}, 125: {lang: 0x159, script: 0x52, flags: 0x0}, 127: {lang: 0x20, script: 0x52, flags: 0x0}, 129: {lang: 0x23d, script: 0x52, flags: 0x0}, 131: {lang: 0x159, script: 0x52, flags: 0x0}, 132: {lang: 0x159, script: 0x52, flags: 0x0}, 133: {lang: 0x139, script: 0x52, flags: 0x0}, 134: {lang: 0x1a, script: 0x2, flags: 0x1}, 135: {lang: 0x0, script: 0x52, flags: 0x0}, 136: {lang: 0x139, script: 0x52, flags: 0x0}, 138: {lang: 0x3b7, script: 0x52, flags: 0x0}, 140: {lang: 0x51f, script: 0x35, flags: 0x0}, 141: {lang: 0x0, script: 0x52, flags: 0x0}, 142: {lang: 0x139, script: 0x52, flags: 0x0}, 143: {lang: 0x1ca, script: 0x52, flags: 0x0}, 144: {lang: 0x1cd, script: 0x52, flags: 0x0}, 145: {lang: 0x1ce, script: 0x52, flags: 0x0}, 147: {lang: 0x139, script: 0x52, flags: 0x0}, 148: {lang: 0x1c, script: 0x2, flags: 0x1}, 150: {lang: 0x1b5, script: 0x37, flags: 0x0}, 152: {lang: 0x1e, script: 0x3, flags: 0x1}, 154: {lang: 0x39, script: 0x5, flags: 0x0}, 155: {lang: 0x21, script: 0x2, flags: 0x1}, 156: {lang: 0x1f0, script: 0x52, flags: 0x0}, 157: {lang: 0x1f1, script: 0x52, flags: 0x0}, 160: {lang: 0x39, script: 0x5, flags: 0x0}, 161: {lang: 0x1f8, script: 0x41, flags: 0x0}, 163: {lang: 0x43b, script: 0x52, flags: 0x0}, 164: {lang: 0x281, script: 0x1e, flags: 0x0}, 165: {lang: 0x23, script: 0x3, flags: 0x1}, 167: {lang: 0x26, script: 0x2, flags: 0x1}, 169: {lang: 0x24b, script: 0x4b, flags: 0x0}, 170: {lang: 0x24b, script: 0x4b, flags: 0x0}, 171: {lang: 0x39, script: 0x5, flags: 0x0}, 173: {lang: 0x3d9, script: 0x1e, flags: 0x0}, 174: {lang: 0x28, script: 0x2, flags: 0x1}, 175: {lang: 0x39, script: 0x5, flags: 0x0}, 177: {lang: 0x109, script: 0x52, flags: 0x0}, 178: {lang: 0x402, script: 0xc1, flags: 0x0}, 180: {lang: 0x431, script: 0x52, flags: 0x0}, 181: {lang: 0x2b7, script: 0x52, flags: 0x0}, 182: {lang: 0x159, script: 0x52, flags: 0x0}, 183: {lang: 0x2be, script: 0x52, flags: 0x0}, 184: {lang: 0x39, script: 0x5, flags: 0x0}, 185: {lang: 0x2a, script: 0x2, flags: 0x1}, 186: {lang: 0x159, script: 0x52, flags: 0x0}, 187: {lang: 0x2c, script: 0x2, flags: 0x1}, 188: {lang: 0x428, script: 0x52, flags: 0x0}, 189: {lang: 0x159, script: 0x52, flags: 0x0}, 190: {lang: 0x2e8, script: 0x52, flags: 0x0}, 193: {lang: 0x2e, script: 0x2, flags: 0x1}, 194: {lang: 0x9e, script: 0x52, flags: 0x0}, 195: {lang: 0x30, script: 0x2, flags: 0x1}, 196: {lang: 0x32, script: 0x2, flags: 0x1}, 197: {lang: 0x34, script: 0x2, flags: 0x1}, 199: {lang: 0x159, script: 0x52, flags: 0x0}, 200: {lang: 0x36, script: 0x2, flags: 0x1}, 202: {lang: 0x317, script: 0x52, flags: 0x0}, 203: {lang: 0x38, script: 0x3, flags: 0x1}, 204: {lang: 0x124, script: 0xd4, flags: 0x0}, 206: {lang: 0x139, script: 0x52, flags: 0x0}, 207: {lang: 0x316, script: 0x52, flags: 0x0}, 208: {lang: 0x3b7, script: 0x52, flags: 0x0}, 209: {lang: 0x15, script: 0x52, flags: 0x0}, 210: {lang: 0x159, script: 0x52, flags: 0x0}, 211: {lang: 0x1ad, script: 0x52, flags: 0x0}, 213: {lang: 0x1ad, script: 0x5, flags: 0x2}, 215: {lang: 0x139, script: 0x52, flags: 0x0}, 216: {lang: 0x35e, script: 0x52, flags: 0x0}, 217: {lang: 0x33e, script: 0x52, flags: 0x0}, 218: {lang: 0x348, script: 0x20, flags: 0x0}, 224: {lang: 0x39, script: 0x5, flags: 0x0}, 225: {lang: 0x139, script: 0x52, flags: 0x0}, 227: {lang: 0x139, script: 0x52, flags: 0x0}, 228: {lang: 0x159, script: 0x52, flags: 0x0}, 229: {lang: 0x47c, script: 0x52, flags: 0x0}, 230: {lang: 0x14e, script: 0x52, flags: 0x0}, 231: {lang: 0x3b, script: 0x3, flags: 0x1}, 232: {lang: 0x3e, script: 0x2, flags: 0x1}, 233: {lang: 0x159, script: 0x52, flags: 0x0}, 235: {lang: 0x139, script: 0x52, flags: 0x0}, 236: {lang: 0x39, script: 0x5, flags: 0x0}, 237: {lang: 0x3b7, script: 0x52, flags: 0x0}, 239: {lang: 0x399, script: 0x52, flags: 0x0}, 240: {lang: 0x18e, script: 0x52, flags: 0x0}, 242: {lang: 0x39, script: 0x5, flags: 0x0}, 257: {lang: 0x159, script: 0x52, flags: 0x0}, 259: {lang: 0x40, script: 0x2, flags: 0x1}, 260: {lang: 0x428, script: 0x1e, flags: 0x0}, 261: {lang: 0x42, script: 0x2, flags: 0x1}, 262: {lang: 0x3dc, script: 0x52, flags: 0x0}, 263: {lang: 0x39, script: 0x5, flags: 0x0}, 265: {lang: 0x159, script: 0x52, flags: 0x0}, 266: {lang: 0x39, script: 0x5, flags: 0x0}, 267: {lang: 0x44, script: 0x2, flags: 0x1}, 270: {lang: 0x40c, script: 0x52, flags: 0x0}, 271: {lang: 0x33e, script: 0x52, flags: 0x0}, 272: {lang: 0x46, script: 0x2, flags: 0x1}, 274: {lang: 0x1f1, script: 0x52, flags: 0x0}, 275: {lang: 0x159, script: 0x52, flags: 0x0}, 276: {lang: 0x41f, script: 0x52, flags: 0x0}, 277: {lang: 0x35e, script: 0x52, flags: 0x0}, 279: {lang: 0x3b7, script: 0x52, flags: 0x0}, 281: {lang: 0x139, script: 0x52, flags: 0x0}, 283: {lang: 0x48, script: 0x2, flags: 0x1}, 287: {lang: 0x159, script: 0x52, flags: 0x0}, 288: {lang: 0x159, script: 0x52, flags: 0x0}, 289: {lang: 0x4a, script: 0x2, flags: 0x1}, 290: {lang: 0x4c, script: 0x3, flags: 0x1}, 291: {lang: 0x4f, script: 0x2, flags: 0x1}, 292: {lang: 0x46d, script: 0x52, flags: 0x0}, 293: {lang: 0x3b7, script: 0x52, flags: 0x0}, 294: {lang: 0x46c, script: 0x52, flags: 0x0}, 295: {lang: 0x51, script: 0x2, flags: 0x1}, 296: {lang: 0x478, script: 0x52, flags: 0x0}, 298: {lang: 0x53, script: 0x4, flags: 0x1}, 300: {lang: 0x496, script: 0x52, flags: 0x0}, 301: {lang: 0x57, script: 0x2, flags: 0x1}, 302: {lang: 0x43b, script: 0x52, flags: 0x0}, 303: {lang: 0x59, script: 0x3, flags: 0x1}, 304: {lang: 0x43b, script: 0x52, flags: 0x0}, 308: {lang: 0x508, script: 0x37, flags: 0x2}, 309: {lang: 0x139, script: 0x52, flags: 0x0}, 310: {lang: 0x4b2, script: 0x52, flags: 0x0}, 311: {lang: 0x1f1, script: 0x52, flags: 0x0}, 314: {lang: 0x139, script: 0x52, flags: 0x0}, 317: {lang: 0x4b9, script: 0x52, flags: 0x0}, 318: {lang: 0x89, script: 0x52, flags: 0x0}, 319: {lang: 0x159, script: 0x52, flags: 0x0}, 321: {lang: 0x411, script: 0x52, flags: 0x0}, 332: {lang: 0x5c, script: 0x2, flags: 0x1}, 349: {lang: 0x39, script: 0x5, flags: 0x0}, 350: {lang: 0x5e, script: 0x2, flags: 0x1}, 355: {lang: 0x419, script: 0x52, flags: 0x0}, } // likelyRegionList holds lists info associated with likelyRegion. // Size: 384 bytes, 96 elements var likelyRegionList = [96]likelyLangScript{ 0: {lang: 0x143, script: 0x5, flags: 0x0}, 1: {lang: 0x46c, script: 0x52, flags: 0x0}, 2: {lang: 0x427, script: 0x52, flags: 0x0}, 3: {lang: 0x2f6, script: 0x1e, flags: 0x0}, 4: {lang: 0x1d0, script: 0x8, flags: 0x0}, 5: {lang: 0x26b, script: 0x52, flags: 0x0}, 6: {lang: 0xb5, script: 0x52, flags: 0x0}, 7: {lang: 0x428, script: 0x1e, flags: 0x0}, 8: {lang: 0x129, script: 0xd6, flags: 0x0}, 9: {lang: 0x348, script: 0x20, flags: 0x0}, 10: {lang: 0x51f, script: 0x34, flags: 0x0}, 11: {lang: 0x4a2, script: 0x5, flags: 0x0}, 12: {lang: 0x515, script: 0x35, flags: 0x0}, 13: {lang: 0x519, script: 0x52, flags: 0x0}, 14: {lang: 0x291, script: 0xd5, flags: 0x0}, 15: {lang: 0x131, script: 0x2d, flags: 0x0}, 16: {lang: 0x480, script: 0x52, flags: 0x0}, 17: {lang: 0x39, script: 0x5, flags: 0x0}, 18: {lang: 0x159, script: 0x52, flags: 0x0}, 19: {lang: 0x26, script: 0x27, flags: 0x0}, 20: {lang: 0x134, script: 0x52, flags: 0x0}, 21: {lang: 0x261, script: 0x5, flags: 0x2}, 22: {lang: 0x508, script: 0x37, flags: 0x2}, 23: {lang: 0x208, script: 0x29, flags: 0x0}, 24: {lang: 0x5, script: 0x1e, flags: 0x0}, 25: {lang: 0x26b, script: 0x52, flags: 0x0}, 26: {lang: 0x131, script: 0x2d, flags: 0x0}, 27: {lang: 0x2f6, script: 0x1e, flags: 0x0}, 28: {lang: 0x1da, script: 0x52, flags: 0x0}, 29: {lang: 0x316, script: 0x5, flags: 0x0}, 30: {lang: 0x1b7, script: 0x20, flags: 0x0}, 31: {lang: 0x4aa, script: 0x5, flags: 0x0}, 32: {lang: 0x22e, script: 0x6b, flags: 0x0}, 33: {lang: 0x143, script: 0x5, flags: 0x0}, 34: {lang: 0x46c, script: 0x52, flags: 0x0}, 35: {lang: 0x242, script: 0x46, flags: 0x0}, 36: {lang: 0xe4, script: 0x5, flags: 0x0}, 37: {lang: 0x21e, script: 0xd5, flags: 0x0}, 38: {lang: 0x39, script: 0x5, flags: 0x0}, 39: {lang: 0x159, script: 0x52, flags: 0x0}, 40: {lang: 0x2af, script: 0x4f, flags: 0x0}, 41: {lang: 0x21e, script: 0xd5, flags: 0x0}, 42: {lang: 0x39, script: 0x5, flags: 0x0}, 43: {lang: 0x159, script: 0x52, flags: 0x0}, 44: {lang: 0x3d3, script: 0x52, flags: 0x0}, 45: {lang: 0x4a4, script: 0x1e, flags: 0x0}, 46: {lang: 0x2f6, script: 0x1e, flags: 0x0}, 47: {lang: 0x427, script: 0x52, flags: 0x0}, 48: {lang: 0x328, script: 0x6b, flags: 0x0}, 49: {lang: 0x20b, script: 0x52, flags: 0x0}, 50: {lang: 0x302, script: 0x1e, flags: 0x0}, 51: {lang: 0x23a, script: 0x5, flags: 0x0}, 52: {lang: 0x51f, script: 0x35, flags: 0x0}, 53: {lang: 0x3b7, script: 0x52, flags: 0x0}, 54: {lang: 0x39, script: 0x5, flags: 0x0}, 55: {lang: 0x159, script: 0x52, flags: 0x0}, 56: {lang: 0x2e4, script: 0x52, flags: 0x0}, 57: {lang: 0x4aa, script: 0x5, flags: 0x0}, 58: {lang: 0x87, script: 0x20, flags: 0x0}, 59: {lang: 0x4aa, script: 0x5, flags: 0x0}, 60: {lang: 0x4aa, script: 0x5, flags: 0x0}, 61: {lang: 0xbc, script: 0x20, flags: 0x0}, 62: {lang: 0x3aa, script: 0x52, flags: 0x0}, 63: {lang: 0x70, script: 0x1e, flags: 0x0}, 64: {lang: 0x3d3, script: 0x52, flags: 0x0}, 65: {lang: 0x7d, script: 0x1e, flags: 0x0}, 66: {lang: 0x3d9, script: 0x1e, flags: 0x0}, 67: {lang: 0x25e, script: 0x52, flags: 0x0}, 68: {lang: 0x43a, script: 0x52, flags: 0x0}, 69: {lang: 0x508, script: 0x37, flags: 0x0}, 70: {lang: 0x408, script: 0x52, flags: 0x0}, 71: {lang: 0x4a4, script: 0x1e, flags: 0x0}, 72: {lang: 0x39, script: 0x5, flags: 0x0}, 73: {lang: 0x159, script: 0x52, flags: 0x0}, 74: {lang: 0x159, script: 0x52, flags: 0x0}, 75: {lang: 0x34, script: 0x5, flags: 0x0}, 76: {lang: 0x461, script: 0xd5, flags: 0x0}, 77: {lang: 0x2e3, script: 0x5, flags: 0x0}, 78: {lang: 0x306, script: 0x6b, flags: 0x0}, 79: {lang: 0x45d, script: 0x1e, flags: 0x0}, 80: {lang: 0x143, script: 0x5, flags: 0x0}, 81: {lang: 0x39, script: 0x5, flags: 0x0}, 82: {lang: 0x159, script: 0x52, flags: 0x0}, 83: {lang: 0x480, script: 0x52, flags: 0x0}, 84: {lang: 0x57, script: 0x5, flags: 0x0}, 85: {lang: 0x211, script: 0x1e, flags: 0x0}, 86: {lang: 0x80, script: 0x2d, flags: 0x0}, 87: {lang: 0x51f, script: 0x35, flags: 0x0}, 88: {lang: 0x482, script: 0x52, flags: 0x0}, 89: {lang: 0x4a4, script: 0x1e, flags: 0x0}, 90: {lang: 0x508, script: 0x37, flags: 0x0}, 91: {lang: 0x3aa, script: 0x52, flags: 0x0}, 92: {lang: 0x427, script: 0x52, flags: 0x0}, 93: {lang: 0x428, script: 0x1e, flags: 0x0}, 94: {lang: 0x159, script: 0x52, flags: 0x0}, 95: {lang: 0x43c, script: 0x5, flags: 0x0}, } type likelyTag struct { lang uint16 region uint16 script uint8 } // Size: 192 bytes, 32 elements var likelyRegionGroup = [32]likelyTag{ 1: {lang: 0x134, region: 0xd5, script: 0x52}, 2: {lang: 0x134, region: 0x134, script: 0x52}, 3: {lang: 0x3b7, region: 0x40, script: 0x52}, 4: {lang: 0x134, region: 0x2e, script: 0x52}, 5: {lang: 0x134, region: 0xd5, script: 0x52}, 6: {lang: 0x139, region: 0xce, script: 0x52}, 7: {lang: 0x43b, region: 0x12e, script: 0x52}, 8: {lang: 0x39, region: 0x6a, script: 0x5}, 9: {lang: 0x43b, region: 0x4a, script: 0x52}, 10: {lang: 0x134, region: 0x160, script: 0x52}, 11: {lang: 0x134, region: 0x134, script: 0x52}, 12: {lang: 0x134, region: 0x134, script: 0x52}, 13: {lang: 0x139, region: 0x58, script: 0x52}, 14: {lang: 0x51f, region: 0x52, script: 0x34}, 15: {lang: 0x1b7, region: 0x98, script: 0x20}, 16: {lang: 0x1da, region: 0x94, script: 0x52}, 17: {lang: 0x1f1, region: 0x9d, script: 0x52}, 18: {lang: 0x134, region: 0x2e, script: 0x52}, 19: {lang: 0x134, region: 0xe5, script: 0x52}, 20: {lang: 0x134, region: 0x89, script: 0x52}, 21: {lang: 0x411, region: 0x141, script: 0x52}, 22: {lang: 0x51f, region: 0x52, script: 0x34}, 23: {lang: 0x4b2, region: 0x136, script: 0x52}, 24: {lang: 0x39, region: 0x107, script: 0x5}, 25: {lang: 0x3d9, region: 0x105, script: 0x1e}, 26: {lang: 0x3d9, region: 0x105, script: 0x1e}, 27: {lang: 0x134, region: 0x7a, script: 0x52}, 28: {lang: 0x109, region: 0x5f, script: 0x52}, 29: {lang: 0x139, region: 0x1e, script: 0x52}, 30: {lang: 0x134, region: 0x99, script: 0x52}, 31: {lang: 0x134, region: 0x7a, script: 0x52}, } type mutualIntelligibility struct { want uint16 have uint16 conf uint8 oneway bool } type scriptIntelligibility struct { lang uint16 want uint8 have uint8 conf uint8 } // matchLang holds pairs of langIDs of base languages that are typically // mutually intelligible. Each pair is associated with a confidence and // whether the intelligibility goes one or both ways. // Size: 708 bytes, 118 elements var matchLang = [118]mutualIntelligibility{ 0: {want: 0x366, have: 0x33e, conf: 0x2, oneway: false}, 1: {want: 0x26b, have: 0xe7, conf: 0x2, oneway: false}, 2: {want: 0x1ca, have: 0xb5, conf: 0x2, oneway: false}, 3: {want: 0x3fd, have: 0xb5, conf: 0x2, oneway: false}, 4: {want: 0x428, have: 0xb5, conf: 0x2, oneway: false}, 5: {want: 0x3fd, have: 0x1ca, conf: 0x2, oneway: false}, 6: {want: 0x428, have: 0x1ca, conf: 0x2, oneway: false}, 7: {want: 0x3fd, have: 0x428, conf: 0x2, oneway: false}, 8: {want: 0x430, have: 0x1, conf: 0x2, oneway: false}, 9: {want: 0x19c, have: 0x109, conf: 0x2, oneway: true}, 10: {want: 0x28c, have: 0x109, conf: 0x2, oneway: true}, 11: {want: 0xfd, have: 0x366, conf: 0x2, oneway: false}, 12: {want: 0xfd, have: 0x33e, conf: 0x2, oneway: false}, 13: {want: 0xe7, have: 0x26b, conf: 0x2, oneway: false}, 14: {want: 0x5, have: 0x3d9, conf: 0x2, oneway: true}, 15: {want: 0xc, have: 0x134, conf: 0x2, oneway: true}, 16: {want: 0x15, have: 0x35e, conf: 0x2, oneway: true}, 17: {want: 0x20, have: 0x134, conf: 0x2, oneway: true}, 18: {want: 0x55, have: 0x139, conf: 0x2, oneway: true}, 19: {want: 0x57, have: 0x3d9, conf: 0x2, oneway: true}, 20: {want: 0x70, have: 0x3d9, conf: 0x2, oneway: true}, 21: {want: 0x74, have: 0x134, conf: 0x2, oneway: true}, 22: {want: 0x81, have: 0x1b7, conf: 0x2, oneway: true}, 23: {want: 0xa3, have: 0x134, conf: 0x2, oneway: true}, 24: {want: 0xb0, have: 0x159, conf: 0x2, oneway: true}, 25: {want: 0xdb, have: 0x14e, conf: 0x2, oneway: true}, 26: {want: 0xe3, have: 0x134, conf: 0x2, oneway: true}, 27: {want: 0xe7, have: 0x39, conf: 0x2, oneway: true}, 28: {want: 0xed, have: 0x159, conf: 0x2, oneway: true}, 29: {want: 0xf5, have: 0x159, conf: 0x2, oneway: true}, 30: {want: 0xfc, have: 0x134, conf: 0x2, oneway: true}, 31: {want: 0x12c, have: 0x134, conf: 0x2, oneway: true}, 32: {want: 0x137, have: 0x134, conf: 0x2, oneway: true}, 33: {want: 0x13b, have: 0x14c, conf: 0x2, oneway: true}, 34: {want: 0x140, have: 0x139, conf: 0x2, oneway: true}, 35: {want: 0x153, have: 0xfd, conf: 0x2, oneway: true}, 36: {want: 0x168, have: 0x35e, conf: 0x2, oneway: true}, 37: {want: 0x169, have: 0x134, conf: 0x2, oneway: true}, 38: {want: 0x16a, have: 0x134, conf: 0x2, oneway: true}, 39: {want: 0x178, have: 0x134, conf: 0x2, oneway: true}, 40: {want: 0x18a, have: 0x139, conf: 0x2, oneway: true}, 41: {want: 0x18e, have: 0x139, conf: 0x2, oneway: true}, 42: {want: 0x19d, have: 0x1b7, conf: 0x2, oneway: true}, 43: {want: 0x1ad, have: 0x134, conf: 0x2, oneway: true}, 44: {want: 0x1b1, have: 0x134, conf: 0x2, oneway: true}, 45: {want: 0x1cd, have: 0x159, conf: 0x2, oneway: true}, 46: {want: 0x1d0, have: 0x3d9, conf: 0x2, oneway: true}, 47: {want: 0x1d2, have: 0x134, conf: 0x2, oneway: true}, 48: {want: 0x1df, have: 0x134, conf: 0x2, oneway: true}, 49: {want: 0x1f0, have: 0x134, conf: 0x2, oneway: true}, 50: {want: 0x206, have: 0x1da, conf: 0x2, oneway: true}, 51: {want: 0x208, have: 0x134, conf: 0x2, oneway: true}, 52: {want: 0x225, have: 0x159, conf: 0x2, oneway: true}, 53: {want: 0x23a, have: 0x3d9, conf: 0x2, oneway: true}, 54: {want: 0x242, have: 0x134, conf: 0x2, oneway: true}, 55: {want: 0x249, have: 0x134, conf: 0x2, oneway: true}, 56: {want: 0x25c, have: 0x134, conf: 0x2, oneway: true}, 57: {want: 0x26b, have: 0x480, conf: 0x2, oneway: true}, 58: {want: 0x281, have: 0x3d9, conf: 0x2, oneway: true}, 59: {want: 0x285, have: 0x1f1, conf: 0x2, oneway: true}, 60: {want: 0x29a, have: 0x134, conf: 0x2, oneway: true}, 61: {want: 0x2ac, have: 0x159, conf: 0x2, oneway: true}, 62: {want: 0x2af, have: 0x134, conf: 0x2, oneway: true}, 63: {want: 0x2b5, have: 0x134, conf: 0x2, oneway: true}, 64: {want: 0x2ba, have: 0x159, conf: 0x2, oneway: true}, 65: {want: 0x2e4, have: 0x134, conf: 0x2, oneway: true}, 66: {want: 0x2e8, have: 0x159, conf: 0x2, oneway: true}, 67: {want: 0x2f1, have: 0x134, conf: 0x2, oneway: true}, 68: {want: 0x2f6, have: 0x7d, conf: 0x2, oneway: true}, 69: {want: 0x2fb, have: 0x134, conf: 0x2, oneway: true}, 70: {want: 0x302, have: 0x3d9, conf: 0x2, oneway: true}, 71: {want: 0x312, have: 0x1b7, conf: 0x2, oneway: true}, 72: {want: 0x316, have: 0x1da, conf: 0x2, oneway: true}, 73: {want: 0x317, have: 0x134, conf: 0x2, oneway: true}, 74: {want: 0x328, have: 0x134, conf: 0x2, oneway: true}, 75: {want: 0x348, have: 0x134, conf: 0x2, oneway: true}, 76: {want: 0x361, have: 0x33e, conf: 0x2, oneway: false}, 77: {want: 0x361, have: 0x366, conf: 0x2, oneway: true}, 78: {want: 0x371, have: 0x134, conf: 0x2, oneway: true}, 79: {want: 0x37e, have: 0x134, conf: 0x2, oneway: true}, 80: {want: 0x380, have: 0x134, conf: 0x2, oneway: true}, 81: {want: 0x382, have: 0x159, conf: 0x2, oneway: true}, 82: {want: 0x387, have: 0x134, conf: 0x2, oneway: true}, 83: {want: 0x38c, have: 0x134, conf: 0x2, oneway: true}, 84: {want: 0x394, have: 0x134, conf: 0x2, oneway: true}, 85: {want: 0x39c, have: 0x134, conf: 0x2, oneway: true}, 86: {want: 0x3b5, have: 0x134, conf: 0x2, oneway: true}, 87: {want: 0x3bb, have: 0x139, conf: 0x2, oneway: true}, 88: {want: 0x3cb, have: 0x109, conf: 0x2, oneway: true}, 89: {want: 0x3d0, have: 0x134, conf: 0x2, oneway: true}, 90: {want: 0x3dc, have: 0x159, conf: 0x2, oneway: true}, 91: {want: 0x3e0, have: 0x1b7, conf: 0x2, oneway: true}, 92: {want: 0x3f0, have: 0x134, conf: 0x2, oneway: true}, 93: {want: 0x402, have: 0x134, conf: 0x2, oneway: true}, 94: {want: 0x419, have: 0x134, conf: 0x2, oneway: true}, 95: {want: 0x41f, have: 0x134, conf: 0x2, oneway: true}, 96: {want: 0x427, have: 0x134, conf: 0x2, oneway: true}, 97: {want: 0x431, have: 0x134, conf: 0x2, oneway: true}, 98: {want: 0x434, have: 0x1da, conf: 0x2, oneway: true}, 99: {want: 0x43b, have: 0x134, conf: 0x2, oneway: true}, 100: {want: 0x446, have: 0x134, conf: 0x2, oneway: true}, 101: {want: 0x457, have: 0x134, conf: 0x2, oneway: true}, 102: {want: 0x45d, have: 0x3d9, conf: 0x2, oneway: true}, 103: {want: 0x465, have: 0x134, conf: 0x2, oneway: true}, 104: {want: 0x46c, have: 0x3d9, conf: 0x2, oneway: true}, 105: {want: 0x3878, have: 0x134, conf: 0x2, oneway: true}, 106: {want: 0x476, have: 0x134, conf: 0x2, oneway: true}, 107: {want: 0x478, have: 0x134, conf: 0x2, oneway: true}, 108: {want: 0x48a, have: 0x3d9, conf: 0x2, oneway: true}, 109: {want: 0x493, have: 0x134, conf: 0x2, oneway: true}, 110: {want: 0x4a2, have: 0x51f, conf: 0x2, oneway: true}, 111: {want: 0x4aa, have: 0x134, conf: 0x2, oneway: true}, 112: {want: 0x4b2, have: 0x3d9, conf: 0x2, oneway: true}, 113: {want: 0x4db, have: 0x159, conf: 0x2, oneway: true}, 114: {want: 0x4e8, have: 0x134, conf: 0x2, oneway: true}, 115: {want: 0x508, have: 0x134, conf: 0x2, oneway: true}, 116: {want: 0x50e, have: 0x134, conf: 0x2, oneway: true}, 117: {want: 0x524, have: 0x134, conf: 0x2, oneway: true}, } // matchScript holds pairs of scriptIDs where readers of one script // can typically also read the other. Each is associated with a confidence. // Size: 24 bytes, 4 elements var matchScript = [4]scriptIntelligibility{ 0: {lang: 0x428, want: 0x52, have: 0x1e, conf: 0x2}, 1: {lang: 0x428, want: 0x1e, have: 0x52, conf: 0x2}, 2: {lang: 0x0, want: 0x34, have: 0x35, conf: 0x1}, 3: {lang: 0x0, want: 0x35, have: 0x34, conf: 0x1}, } // Size: 128 bytes, 32 elements var regionContainment = [32]uint32{ 0xffffffff, 0x000007a2, 0x00003044, 0x00000008, 0x403c0010, 0x00000020, 0x00000040, 0x00000080, 0x00000100, 0x00000200, 0x00000400, 0x2000384c, 0x00001000, 0x00002000, 0x00004000, 0x00008000, 0x00010000, 0x00020000, 0x00040000, 0x00080000, 0x00100000, 0x00200000, 0x01c1c000, 0x00800000, 0x01000000, 0x1e020000, 0x04000000, 0x08000000, 0x10000000, 0x20002048, 0x40000000, 0x80000000, } // regionInclusion maps region identifiers to sets of regions in regionInclusionBits, // where each set holds all groupings that are directly connected in a region // containment graph. // Size: 357 bytes, 357 elements var regionInclusion = [357]uint8{ // Entry 0 - 3F 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x25, 0x22, 0x23, 0x25, 0x26, 0x21, 0x27, 0x28, 0x29, 0x2a, 0x25, 0x2b, 0x23, 0x22, 0x25, 0x24, 0x29, 0x2c, 0x2d, 0x23, 0x2e, 0x2c, 0x25, 0x2f, 0x30, 0x27, 0x25, // Entry 40 - 7F 0x27, 0x25, 0x24, 0x30, 0x21, 0x31, 0x32, 0x33, 0x2f, 0x21, 0x26, 0x26, 0x26, 0x34, 0x2c, 0x28, 0x27, 0x26, 0x35, 0x27, 0x21, 0x33, 0x22, 0x20, 0x25, 0x2c, 0x25, 0x21, 0x36, 0x2d, 0x34, 0x29, 0x21, 0x2e, 0x37, 0x25, 0x25, 0x20, 0x38, 0x38, 0x27, 0x37, 0x38, 0x38, 0x2e, 0x39, 0x2e, 0x1f, 0x20, 0x37, 0x3a, 0x27, 0x3b, 0x2b, 0x20, 0x29, 0x34, 0x26, 0x37, 0x25, 0x23, 0x27, 0x2b, 0x2c, // Entry 80 - BF 0x22, 0x2f, 0x2c, 0x2c, 0x25, 0x26, 0x39, 0x21, 0x33, 0x3b, 0x2c, 0x27, 0x35, 0x21, 0x33, 0x39, 0x25, 0x2d, 0x20, 0x38, 0x30, 0x37, 0x23, 0x2b, 0x24, 0x21, 0x23, 0x24, 0x2b, 0x39, 0x2b, 0x25, 0x23, 0x35, 0x20, 0x2e, 0x3c, 0x30, 0x3b, 0x2e, 0x25, 0x35, 0x35, 0x23, 0x25, 0x3c, 0x30, 0x23, 0x25, 0x34, 0x24, 0x2c, 0x31, 0x37, 0x29, 0x37, 0x38, 0x38, 0x34, 0x32, 0x22, 0x25, 0x2e, 0x3b, // Entry C0 - FF 0x20, 0x22, 0x2c, 0x30, 0x35, 0x35, 0x3b, 0x25, 0x2c, 0x25, 0x39, 0x2e, 0x24, 0x2e, 0x33, 0x30, 0x2e, 0x31, 0x3a, 0x2c, 0x2a, 0x2c, 0x20, 0x33, 0x29, 0x2b, 0x24, 0x20, 0x3b, 0x23, 0x28, 0x2a, 0x23, 0x33, 0x20, 0x27, 0x28, 0x3a, 0x30, 0x24, 0x2d, 0x2f, 0x28, 0x25, 0x23, 0x39, 0x20, 0x3b, 0x27, 0x20, 0x23, 0x20, 0x20, 0x1e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // Entry 100 - 13F 0x20, 0x2e, 0x20, 0x2d, 0x22, 0x32, 0x2e, 0x23, 0x3a, 0x2e, 0x38, 0x37, 0x30, 0x2c, 0x39, 0x2b, 0x2d, 0x2c, 0x22, 0x2c, 0x2e, 0x27, 0x2e, 0x26, 0x32, 0x33, 0x25, 0x23, 0x31, 0x21, 0x25, 0x26, 0x21, 0x2c, 0x30, 0x3c, 0x28, 0x30, 0x3c, 0x38, 0x28, 0x30, 0x23, 0x25, 0x28, 0x35, 0x2e, 0x32, 0x2e, 0x20, 0x21, 0x20, 0x2f, 0x27, 0x3c, 0x22, 0x25, 0x20, 0x27, 0x25, 0x25, 0x30, 0x3a, 0x28, // Entry 140 - 17F 0x20, 0x28, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x23, 0x2e, 0x22, 0x31, 0x2e, 0x26, 0x2e, 0x20, } // regionInclusionBits is an array of bit vectors where every vector represents // a set of region groupings. These sets are used to compute the distance // between two regions for the purpose of language matching. // Size: 288 bytes, 72 elements var regionInclusionBits = [72]uint32{ // Entry 0 - 1F 0x82400813, 0x000007a3, 0x00003844, 0x20000808, 0x403c0011, 0x00000022, 0x20000844, 0x00000082, 0x00000102, 0x00000202, 0x00000402, 0x2000384d, 0x00001804, 0x20002804, 0x00404000, 0x00408000, 0x00410000, 0x02020000, 0x00040010, 0x00080010, 0x00100010, 0x00200010, 0x01c1c001, 0x00c00000, 0x01400000, 0x1e020001, 0x06000000, 0x0a000000, 0x12000000, 0x20002848, 0x40000010, 0x80000001, // Entry 20 - 3F 0x00000001, 0x40000000, 0x00020000, 0x01000000, 0x00008000, 0x00002000, 0x00000200, 0x00000008, 0x00200000, 0x90000000, 0x00040000, 0x08000000, 0x00000020, 0x84000000, 0x00000080, 0x00001000, 0x00010000, 0x00000400, 0x04000000, 0x00000040, 0x10000000, 0x00004000, 0x81000000, 0x88000000, 0x00000100, 0x80020000, 0x00080000, 0x00100000, 0x00800000, 0xffffffff, 0x82400fb3, 0xc27c0813, // Entry 40 - 5F 0xa240385f, 0x83c1c813, 0x9e420813, 0x92000001, 0x86000001, 0x81400001, 0x8a000001, 0x82020001, } // regionInclusionNext marks, for each entry in regionInclusionBits, the set of // all groups that are reachable from the groups set in the respective entry. // Size: 72 bytes, 72 elements var regionInclusionNext = [72]uint8{ // Entry 0 - 3F 0x3d, 0x3e, 0x0b, 0x0b, 0x3f, 0x01, 0x0b, 0x01, 0x01, 0x01, 0x01, 0x40, 0x0b, 0x0b, 0x16, 0x16, 0x16, 0x19, 0x04, 0x04, 0x04, 0x04, 0x41, 0x16, 0x16, 0x42, 0x19, 0x19, 0x19, 0x0b, 0x04, 0x00, 0x00, 0x1e, 0x11, 0x18, 0x0f, 0x0d, 0x09, 0x03, 0x15, 0x43, 0x12, 0x1b, 0x05, 0x44, 0x07, 0x0c, 0x10, 0x0a, 0x1a, 0x06, 0x1c, 0x0e, 0x45, 0x46, 0x08, 0x47, 0x13, 0x14, 0x17, 0x3d, 0x3d, 0x3d, // Entry 40 - 7F 0x3d, 0x3d, 0x3d, 0x42, 0x42, 0x41, 0x42, 0x42, } type parentRel struct { lang uint16 script uint8 maxScript uint8 toRegion uint16 fromRegion []uint16 } // Size: 412 bytes, 5 elements var parents = [5]parentRel{ 0: {lang: 0x134, script: 0x0, maxScript: 0x52, toRegion: 0x1, fromRegion: []uint16{0x1a, 0x24, 0x25, 0x2e, 0x33, 0x35, 0x3c, 0x41, 0x45, 0x47, 0x48, 0x49, 0x4f, 0x51, 0x5b, 0x5c, 0x60, 0x63, 0x6c, 0x72, 0x73, 0x74, 0x7a, 0x7b, 0x7e, 0x7f, 0x80, 0x82, 0x8b, 0x8c, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9e, 0x9f, 0xa3, 0xa6, 0xa8, 0xac, 0xb0, 0xb3, 0xb4, 0xbe, 0xc5, 0xc9, 0xca, 0xcb, 0xcd, 0xcf, 0xd1, 0xd4, 0xd5, 0xdc, 0xde, 0xdf, 0xe5, 0xe6, 0xe7, 0xea, 0xef, 0x106, 0x108, 0x109, 0x10a, 0x10c, 0x10d, 0x111, 0x116, 0x11a, 0x11c, 0x11e, 0x124, 0x128, 0x12b, 0x12c, 0x12e, 0x130, 0x138, 0x13b, 0x13e, 0x141, 0x160, 0x161, 0x163}}, 1: {lang: 0x134, script: 0x0, maxScript: 0x52, toRegion: 0x1a, fromRegion: []uint16{0x2d, 0x4d, 0x5f, 0x62, 0x71, 0xd8, 0x10b, 0x10e}}, 2: {lang: 0x139, script: 0x0, maxScript: 0x52, toRegion: 0x1e, fromRegion: []uint16{0x2b, 0x3e, 0x40, 0x50, 0x53, 0x55, 0x58, 0x64, 0x68, 0x88, 0x8e, 0xce, 0xd7, 0xe1, 0xe3, 0xeb, 0xf0, 0x119, 0x134, 0x135, 0x13a}}, 3: {lang: 0x3b7, script: 0x0, maxScript: 0x52, toRegion: 0xed, fromRegion: []uint16{0x29, 0x4d, 0x59, 0x85, 0x8a, 0xb6, 0xc5, 0xd0, 0x117, 0x125}}, 4: {lang: 0x51f, script: 0x35, maxScript: 0x35, toRegion: 0x8c, fromRegion: []uint16{0xc5}}, } // Total table size 25825 bytes (25KiB); checksum: 4E97CC5E ================================================ FILE: vendor/golang.org/x/text/language/tags.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package language // TODO: Various sets of commonly use tags and regions. // MustParse is like Parse, but panics if the given BCP 47 tag cannot be parsed. // It simplifies safe initialization of Tag values. func MustParse(s string) Tag { t, err := Parse(s) if err != nil { panic(err) } return t } // MustParse is like Parse, but panics if the given BCP 47 tag cannot be parsed. // It simplifies safe initialization of Tag values. func (c CanonType) MustParse(s string) Tag { t, err := c.Parse(s) if err != nil { panic(err) } return t } // MustParseBase is like ParseBase, but panics if the given base cannot be parsed. // It simplifies safe initialization of Base values. func MustParseBase(s string) Base { b, err := ParseBase(s) if err != nil { panic(err) } return b } // MustParseScript is like ParseScript, but panics if the given script cannot be // parsed. It simplifies safe initialization of Script values. func MustParseScript(s string) Script { scr, err := ParseScript(s) if err != nil { panic(err) } return scr } // MustParseRegion is like ParseRegion, but panics if the given region cannot be // parsed. It simplifies safe initialization of Region values. func MustParseRegion(s string) Region { r, err := ParseRegion(s) if err != nil { panic(err) } return r } var ( und = Tag{} Und Tag = Tag{} Afrikaans Tag = Tag{lang: _af} // af Amharic Tag = Tag{lang: _am} // am Arabic Tag = Tag{lang: _ar} // ar ModernStandardArabic Tag = Tag{lang: _ar, region: _001} // ar-001 Azerbaijani Tag = Tag{lang: _az} // az Bulgarian Tag = Tag{lang: _bg} // bg Bengali Tag = Tag{lang: _bn} // bn Catalan Tag = Tag{lang: _ca} // ca Czech Tag = Tag{lang: _cs} // cs Danish Tag = Tag{lang: _da} // da German Tag = Tag{lang: _de} // de Greek Tag = Tag{lang: _el} // el English Tag = Tag{lang: _en} // en AmericanEnglish Tag = Tag{lang: _en, region: _US} // en-US BritishEnglish Tag = Tag{lang: _en, region: _GB} // en-GB Spanish Tag = Tag{lang: _es} // es EuropeanSpanish Tag = Tag{lang: _es, region: _ES} // es-ES LatinAmericanSpanish Tag = Tag{lang: _es, region: _419} // es-419 Estonian Tag = Tag{lang: _et} // et Persian Tag = Tag{lang: _fa} // fa Finnish Tag = Tag{lang: _fi} // fi Filipino Tag = Tag{lang: _fil} // fil French Tag = Tag{lang: _fr} // fr CanadianFrench Tag = Tag{lang: _fr, region: _CA} // fr-CA Gujarati Tag = Tag{lang: _gu} // gu Hebrew Tag = Tag{lang: _he} // he Hindi Tag = Tag{lang: _hi} // hi Croatian Tag = Tag{lang: _hr} // hr Hungarian Tag = Tag{lang: _hu} // hu Armenian Tag = Tag{lang: _hy} // hy Indonesian Tag = Tag{lang: _id} // id Icelandic Tag = Tag{lang: _is} // is Italian Tag = Tag{lang: _it} // it Japanese Tag = Tag{lang: _ja} // ja Georgian Tag = Tag{lang: _ka} // ka Kazakh Tag = Tag{lang: _kk} // kk Khmer Tag = Tag{lang: _km} // km Kannada Tag = Tag{lang: _kn} // kn Korean Tag = Tag{lang: _ko} // ko Kirghiz Tag = Tag{lang: _ky} // ky Lao Tag = Tag{lang: _lo} // lo Lithuanian Tag = Tag{lang: _lt} // lt Latvian Tag = Tag{lang: _lv} // lv Macedonian Tag = Tag{lang: _mk} // mk Malayalam Tag = Tag{lang: _ml} // ml Mongolian Tag = Tag{lang: _mn} // mn Marathi Tag = Tag{lang: _mr} // mr Malay Tag = Tag{lang: _ms} // ms Burmese Tag = Tag{lang: _my} // my Nepali Tag = Tag{lang: _ne} // ne Dutch Tag = Tag{lang: _nl} // nl Norwegian Tag = Tag{lang: _no} // no Punjabi Tag = Tag{lang: _pa} // pa Polish Tag = Tag{lang: _pl} // pl Portuguese Tag = Tag{lang: _pt} // pt BrazilianPortuguese Tag = Tag{lang: _pt, region: _BR} // pt-BR EuropeanPortuguese Tag = Tag{lang: _pt, region: _PT} // pt-PT Romanian Tag = Tag{lang: _ro} // ro Russian Tag = Tag{lang: _ru} // ru Sinhala Tag = Tag{lang: _si} // si Slovak Tag = Tag{lang: _sk} // sk Slovenian Tag = Tag{lang: _sl} // sl Albanian Tag = Tag{lang: _sq} // sq Serbian Tag = Tag{lang: _sr} // sr SerbianLatin Tag = Tag{lang: _sr, script: _Latn} // sr-Latn Swedish Tag = Tag{lang: _sv} // sv Swahili Tag = Tag{lang: _sw} // sw Tamil Tag = Tag{lang: _ta} // ta Telugu Tag = Tag{lang: _te} // te Thai Tag = Tag{lang: _th} // th Turkish Tag = Tag{lang: _tr} // tr Ukrainian Tag = Tag{lang: _uk} // uk Urdu Tag = Tag{lang: _ur} // ur Uzbek Tag = Tag{lang: _uz} // uz Vietnamese Tag = Tag{lang: _vi} // vi Chinese Tag = Tag{lang: _zh} // zh SimplifiedChinese Tag = Tag{lang: _zh, script: _Hans} // zh-Hans TraditionalChinese Tag = Tag{lang: _zh, script: _Hant} // zh-Hant Zulu Tag = Tag{lang: _zu} // zu ) ================================================ FILE: vendor/golang.org/x/text/runes/cond.go ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package runes import ( "unicode/utf8" "golang.org/x/text/transform" ) // Note: below we pass invalid UTF-8 to the tIn and tNotIn transformers as is. // This is done for various reasons: // - To retain the semantics of the Nop transformer: if input is passed to a Nop // one would expect it to be unchanged. // - It would be very expensive to pass a converted RuneError to a transformer: // a transformer might need more source bytes after RuneError, meaning that // the only way to pass it safely is to create a new buffer and manage the // intermingling of RuneErrors and normal input. // - Many transformers leave ill-formed UTF-8 as is, so this is not // inconsistent. Generally ill-formed UTF-8 is only replaced if it is a // logical consequence of the operation (as for Map) or if it otherwise would // pose security concerns (as for Remove). // - An alternative would be to return an error on ill-formed UTF-8, but this // would be inconsistent with other operations. // If returns a transformer that applies tIn to consecutive runes for which // s.Contains(r) and tNotIn to consecutive runes for which !s.Contains(r). Reset // is called on tIn and tNotIn at the start of each run. A Nop transformer will // substitute a nil value passed to tIn or tNotIn. Invalid UTF-8 is translated // to RuneError to determine which transformer to apply, but is passed as is to // the respective transformer. func If(s Set, tIn, tNotIn transform.Transformer) Transformer { if tIn == nil && tNotIn == nil { return Transformer{transform.Nop} } if tIn == nil { tIn = transform.Nop } if tNotIn == nil { tNotIn = transform.Nop } sIn, ok := tIn.(transform.SpanningTransformer) if !ok { sIn = dummySpan{tIn} } sNotIn, ok := tNotIn.(transform.SpanningTransformer) if !ok { sNotIn = dummySpan{tNotIn} } a := &cond{ tIn: sIn, tNotIn: sNotIn, f: s.Contains, } a.Reset() return Transformer{a} } type dummySpan struct{ transform.Transformer } func (d dummySpan) Span(src []byte, atEOF bool) (n int, err error) { return 0, transform.ErrEndOfSpan } type cond struct { tIn, tNotIn transform.SpanningTransformer f func(rune) bool check func(rune) bool // current check to perform t transform.SpanningTransformer // current transformer to use } // Reset implements transform.Transformer. func (t *cond) Reset() { t.check = t.is t.t = t.tIn t.t.Reset() // notIn will be reset on first usage. } func (t *cond) is(r rune) bool { if t.f(r) { return true } t.check = t.isNot t.t = t.tNotIn t.tNotIn.Reset() return false } func (t *cond) isNot(r rune) bool { if !t.f(r) { return true } t.check = t.is t.t = t.tIn t.tIn.Reset() return false } // This implementation of Span doesn't help all too much, but it needs to be // there to satisfy this package's Transformer interface. // TODO: there are certainly room for improvements, though. For example, if // t.t == transform.Nop (which will a common occurrence) it will save a bundle // to special-case that loop. func (t *cond) Span(src []byte, atEOF bool) (n int, err error) { p := 0 for n < len(src) && err == nil { // Don't process too much at a time as the Spanner that will be // called on this block may terminate early. const maxChunk = 4096 max := len(src) if v := n + maxChunk; v < max { max = v } atEnd := false size := 0 current := t.t for ; p < max; p += size { r := rune(src[p]) if r < utf8.RuneSelf { size = 1 } else if r, size = utf8.DecodeRune(src[p:]); size == 1 { if !atEOF && !utf8.FullRune(src[p:]) { err = transform.ErrShortSrc break } } if !t.check(r) { // The next rune will be the start of a new run. atEnd = true break } } n2, err2 := current.Span(src[n:p], atEnd || (atEOF && p == len(src))) n += n2 if err2 != nil { return n, err2 } // At this point either err != nil or t.check will pass for the rune at p. p = n + size } return n, err } func (t *cond) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { p := 0 for nSrc < len(src) && err == nil { // Don't process too much at a time, as the work might be wasted if the // destination buffer isn't large enough to hold the result or a // transform returns an error early. const maxChunk = 4096 max := len(src) if n := nSrc + maxChunk; n < len(src) { max = n } atEnd := false size := 0 current := t.t for ; p < max; p += size { r := rune(src[p]) if r < utf8.RuneSelf { size = 1 } else if r, size = utf8.DecodeRune(src[p:]); size == 1 { if !atEOF && !utf8.FullRune(src[p:]) { err = transform.ErrShortSrc break } } if !t.check(r) { // The next rune will be the start of a new run. atEnd = true break } } nDst2, nSrc2, err2 := current.Transform(dst[nDst:], src[nSrc:p], atEnd || (atEOF && p == len(src))) nDst += nDst2 nSrc += nSrc2 if err2 != nil { return nDst, nSrc, err2 } // At this point either err != nil or t.check will pass for the rune at p. p = nSrc + size } return nDst, nSrc, err } ================================================ FILE: vendor/golang.org/x/text/runes/runes.go ================================================ // Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package runes provide transforms for UTF-8 encoded text. package runes // import "golang.org/x/text/runes" import ( "unicode" "unicode/utf8" "golang.org/x/text/transform" ) // A Set is a collection of runes. type Set interface { // Contains returns true if r is contained in the set. Contains(r rune) bool } type setFunc func(rune) bool func (s setFunc) Contains(r rune) bool { return s(r) } // Note: using funcs here instead of wrapping types result in cleaner // documentation and a smaller API. // In creates a Set with a Contains method that returns true for all runes in // the given RangeTable. func In(rt *unicode.RangeTable) Set { return setFunc(func(r rune) bool { return unicode.Is(rt, r) }) } // In creates a Set with a Contains method that returns true for all runes not // in the given RangeTable. func NotIn(rt *unicode.RangeTable) Set { return setFunc(func(r rune) bool { return !unicode.Is(rt, r) }) } // Predicate creates a Set with a Contains method that returns f(r). func Predicate(f func(rune) bool) Set { return setFunc(f) } // Transformer implements the transform.Transformer interface. type Transformer struct { t transform.SpanningTransformer } func (t Transformer) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { return t.t.Transform(dst, src, atEOF) } func (t Transformer) Span(b []byte, atEOF bool) (n int, err error) { return t.t.Span(b, atEOF) } func (t Transformer) Reset() { t.t.Reset() } // Bytes returns a new byte slice with the result of converting b using t. It // calls Reset on t. It returns nil if any error was found. This can only happen // if an error-producing Transformer is passed to If. func (t Transformer) Bytes(b []byte) []byte { b, _, err := transform.Bytes(t, b) if err != nil { return nil } return b } // String returns a string with the result of converting s using t. It calls // Reset on t. It returns the empty string if any error was found. This can only // happen if an error-producing Transformer is passed to If. func (t Transformer) String(s string) string { s, _, err := transform.String(t, s) if err != nil { return "" } return s } // TODO: // - Copy: copying strings and bytes in whole-rune units. // - Validation (maybe) // - Well-formed-ness (maybe) const runeErrorString = string(utf8.RuneError) // Remove returns a Transformer that removes runes r for which s.Contains(r). // Illegal input bytes are replaced by RuneError before being passed to f. func Remove(s Set) Transformer { if f, ok := s.(setFunc); ok { // This little trick cuts the running time of BenchmarkRemove for sets // created by Predicate roughly in half. // TODO: special-case RangeTables as well. return Transformer{remove(f)} } return Transformer{remove(s.Contains)} } // TODO: remove transform.RemoveFunc. type remove func(r rune) bool func (remove) Reset() {} // Span implements transform.Spanner. func (t remove) Span(src []byte, atEOF bool) (n int, err error) { for r, size := rune(0), 0; n < len(src); { if r = rune(src[n]); r < utf8.RuneSelf { size = 1 } else if r, size = utf8.DecodeRune(src[n:]); size == 1 { // Invalid rune. if !atEOF && !utf8.FullRune(src[n:]) { err = transform.ErrShortSrc } else { err = transform.ErrEndOfSpan } break } if t(r) { err = transform.ErrEndOfSpan break } n += size } return } // Transform implements transform.Transformer. func (t remove) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { for r, size := rune(0), 0; nSrc < len(src); { if r = rune(src[nSrc]); r < utf8.RuneSelf { size = 1 } else if r, size = utf8.DecodeRune(src[nSrc:]); size == 1 { // Invalid rune. if !atEOF && !utf8.FullRune(src[nSrc:]) { err = transform.ErrShortSrc break } // We replace illegal bytes with RuneError. Not doing so might // otherwise turn a sequence of invalid UTF-8 into valid UTF-8. // The resulting byte sequence may subsequently contain runes // for which t(r) is true that were passed unnoticed. if !t(utf8.RuneError) { if nDst+3 > len(dst) { err = transform.ErrShortDst break } dst[nDst+0] = runeErrorString[0] dst[nDst+1] = runeErrorString[1] dst[nDst+2] = runeErrorString[2] nDst += 3 } nSrc++ continue } if t(r) { nSrc += size continue } if nDst+size > len(dst) { err = transform.ErrShortDst break } for i := 0; i < size; i++ { dst[nDst] = src[nSrc] nDst++ nSrc++ } } return } // Map returns a Transformer that maps the runes in the input using the given // mapping. Illegal bytes in the input are converted to utf8.RuneError before // being passed to the mapping func. func Map(mapping func(rune) rune) Transformer { return Transformer{mapper(mapping)} } type mapper func(rune) rune func (mapper) Reset() {} // Span implements transform.Spanner. func (t mapper) Span(src []byte, atEOF bool) (n int, err error) { for r, size := rune(0), 0; n < len(src); n += size { if r = rune(src[n]); r < utf8.RuneSelf { size = 1 } else if r, size = utf8.DecodeRune(src[n:]); size == 1 { // Invalid rune. if !atEOF && !utf8.FullRune(src[n:]) { err = transform.ErrShortSrc } else { err = transform.ErrEndOfSpan } break } if t(r) != r { err = transform.ErrEndOfSpan break } } return n, err } // Transform implements transform.Transformer. func (t mapper) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { var replacement rune var b [utf8.UTFMax]byte for r, size := rune(0), 0; nSrc < len(src); { if r = rune(src[nSrc]); r < utf8.RuneSelf { if replacement = t(r); replacement < utf8.RuneSelf { if nDst == len(dst) { err = transform.ErrShortDst break } dst[nDst] = byte(replacement) nDst++ nSrc++ continue } size = 1 } else if r, size = utf8.DecodeRune(src[nSrc:]); size == 1 { // Invalid rune. if !atEOF && !utf8.FullRune(src[nSrc:]) { err = transform.ErrShortSrc break } if replacement = t(utf8.RuneError); replacement == utf8.RuneError { if nDst+3 > len(dst) { err = transform.ErrShortDst break } dst[nDst+0] = runeErrorString[0] dst[nDst+1] = runeErrorString[1] dst[nDst+2] = runeErrorString[2] nDst += 3 nSrc++ continue } } else if replacement = t(r); replacement == r { if nDst+size > len(dst) { err = transform.ErrShortDst break } for i := 0; i < size; i++ { dst[nDst] = src[nSrc] nDst++ nSrc++ } continue } n := utf8.EncodeRune(b[:], replacement) if nDst+n > len(dst) { err = transform.ErrShortDst break } for i := 0; i < n; i++ { dst[nDst] = b[i] nDst++ } nSrc += size } return } // ReplaceIllFormed returns a transformer that replaces all input bytes that are // not part of a well-formed UTF-8 code sequence with utf8.RuneError. func ReplaceIllFormed() Transformer { return Transformer{&replaceIllFormed{}} } type replaceIllFormed struct{ transform.NopResetter } func (t replaceIllFormed) Span(src []byte, atEOF bool) (n int, err error) { for n < len(src) { // ASCII fast path. if src[n] < utf8.RuneSelf { n++ continue } r, size := utf8.DecodeRune(src[n:]) // Look for a valid non-ASCII rune. if r != utf8.RuneError || size != 1 { n += size continue } // Look for short source data. if !atEOF && !utf8.FullRune(src[n:]) { err = transform.ErrShortSrc break } // We have an invalid rune. err = transform.ErrEndOfSpan break } return n, err } func (t replaceIllFormed) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { for nSrc < len(src) { // ASCII fast path. if r := src[nSrc]; r < utf8.RuneSelf { if nDst == len(dst) { err = transform.ErrShortDst break } dst[nDst] = r nDst++ nSrc++ continue } // Look for a valid non-ASCII rune. if _, size := utf8.DecodeRune(src[nSrc:]); size != 1 { if size != copy(dst[nDst:], src[nSrc:nSrc+size]) { err = transform.ErrShortDst break } nDst += size nSrc += size continue } // Look for short source data. if !atEOF && !utf8.FullRune(src[nSrc:]) { err = transform.ErrShortSrc break } // We have an invalid rune. if nDst+3 > len(dst) { err = transform.ErrShortDst break } dst[nDst+0] = runeErrorString[0] dst[nDst+1] = runeErrorString[1] dst[nDst+2] = runeErrorString[2] nDst += 3 nSrc++ } return nDst, nSrc, err } ================================================ FILE: vendor/golang.org/x/text/secure/bidirule/bidirule.go ================================================ // Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package bidirule implements the Bidi Rule defined by RFC 5893. // // This package is under development. The API may change without notice and // without preserving backward compatibility. package bidirule import ( "errors" "unicode/utf8" "golang.org/x/text/transform" "golang.org/x/text/unicode/bidi" ) // This file contains an implementation of RFC 5893: Right-to-Left Scripts for // Internationalized Domain Names for Applications (IDNA) // // A label is an individual component of a domain name. Labels are usually // shown separated by dots; for example, the domain name "www.example.com" is // composed of three labels: "www", "example", and "com". // // An RTL label is a label that contains at least one character of class R, AL, // or AN. An LTR label is any label that is not an RTL label. // // A "Bidi domain name" is a domain name that contains at least one RTL label. // // The following guarantees can be made based on the above: // // o In a domain name consisting of only labels that satisfy the rule, // the requirements of Section 3 are satisfied. Note that even LTR // labels and pure ASCII labels have to be tested. // // o In a domain name consisting of only LDH labels (as defined in the // Definitions document [RFC5890]) and labels that satisfy the rule, // the requirements of Section 3 are satisfied as long as a label // that starts with an ASCII digit does not come after a // right-to-left label. // // No guarantee is given for other combinations. // ErrInvalid indicates a label is invalid according to the Bidi Rule. var ErrInvalid = errors.New("bidirule: failed Bidi Rule") type ruleState uint8 const ( ruleInitial ruleState = iota ruleLTR ruleLTRFinal ruleRTL ruleRTLFinal ruleInvalid ) type ruleTransition struct { next ruleState mask uint16 } var transitions = [...][2]ruleTransition{ // [2.1] The first character must be a character with Bidi property L, R, or // AL. If it has the R or AL property, it is an RTL label; if it has the L // property, it is an LTR label. ruleInitial: { {ruleLTRFinal, 1 << bidi.L}, {ruleRTLFinal, 1<<bidi.R | 1<<bidi.AL}, }, ruleRTL: { // [2.3] In an RTL label, the end of the label must be a character with // Bidi property R, AL, EN, or AN, followed by zero or more characters // with Bidi property NSM. {ruleRTLFinal, 1<<bidi.R | 1<<bidi.AL | 1<<bidi.EN | 1<<bidi.AN}, // [2.2] In an RTL label, only characters with the Bidi properties R, // AL, AN, EN, ES, CS, ET, ON, BN, or NSM are allowed. // We exclude the entries from [2.3] {ruleRTL, 1<<bidi.ES | 1<<bidi.CS | 1<<bidi.ET | 1<<bidi.ON | 1<<bidi.BN | 1<<bidi.NSM}, }, ruleRTLFinal: { // [2.3] In an RTL label, the end of the label must be a character with // Bidi property R, AL, EN, or AN, followed by zero or more characters // with Bidi property NSM. {ruleRTLFinal, 1<<bidi.R | 1<<bidi.AL | 1<<bidi.EN | 1<<bidi.AN | 1<<bidi.NSM}, // [2.2] In an RTL label, only characters with the Bidi properties R, // AL, AN, EN, ES, CS, ET, ON, BN, or NSM are allowed. // We exclude the entries from [2.3] and NSM. {ruleRTL, 1<<bidi.ES | 1<<bidi.CS | 1<<bidi.ET | 1<<bidi.ON | 1<<bidi.BN}, }, ruleLTR: { // [2.6] In an LTR label, the end of the label must be a character with // Bidi property L or EN, followed by zero or more characters with Bidi // property NSM. {ruleLTRFinal, 1<<bidi.L | 1<<bidi.EN}, // [2.5] In an LTR label, only characters with the Bidi properties L, // EN, ES, CS, ET, ON, BN, or NSM are allowed. // We exclude the entries from [2.6]. {ruleLTR, 1<<bidi.ES | 1<<bidi.CS | 1<<bidi.ET | 1<<bidi.ON | 1<<bidi.BN | 1<<bidi.NSM}, }, ruleLTRFinal: { // [2.6] In an LTR label, the end of the label must be a character with // Bidi property L or EN, followed by zero or more characters with Bidi // property NSM. {ruleLTRFinal, 1<<bidi.L | 1<<bidi.EN | 1<<bidi.NSM}, // [2.5] In an LTR label, only characters with the Bidi properties L, // EN, ES, CS, ET, ON, BN, or NSM are allowed. // We exclude the entries from [2.6]. {ruleLTR, 1<<bidi.ES | 1<<bidi.CS | 1<<bidi.ET | 1<<bidi.ON | 1<<bidi.BN}, }, ruleInvalid: { {ruleInvalid, 0}, {ruleInvalid, 0}, }, } // [2.4] In an RTL label, if an EN is present, no AN may be present, and // vice versa. const exclusiveRTL = uint16(1<<bidi.EN | 1<<bidi.AN) // From RFC 5893 // An RTL label is a label that contains at least one character of type // R, AL, or AN. // // An LTR label is any label that is not an RTL label. // Direction reports the direction of the given label as defined by RFC 5893. // The Bidi Rule does not have to be applied to labels of the category // LeftToRight. func Direction(b []byte) bidi.Direction { for i := 0; i < len(b); { e, sz := bidi.Lookup(b[i:]) if sz == 0 { i++ } c := e.Class() if c == bidi.R || c == bidi.AL || c == bidi.AN { return bidi.RightToLeft } i += sz } return bidi.LeftToRight } // DirectionString reports the direction of the given label as defined by RFC // 5893. The Bidi Rule does not have to be applied to labels of the category // LeftToRight. func DirectionString(s string) bidi.Direction { for i := 0; i < len(s); { e, sz := bidi.LookupString(s[i:]) if sz == 0 { i++ continue } c := e.Class() if c == bidi.R || c == bidi.AL || c == bidi.AN { return bidi.RightToLeft } i += sz } return bidi.LeftToRight } // Valid reports whether b conforms to the BiDi rule. func Valid(b []byte) bool { var t Transformer if n, ok := t.advance(b); !ok || n < len(b) { return false } return t.isFinal() } // ValidString reports whether s conforms to the BiDi rule. func ValidString(s string) bool { var t Transformer if n, ok := t.advanceString(s); !ok || n < len(s) { return false } return t.isFinal() } // New returns a Transformer that verifies that input adheres to the Bidi Rule. func New() *Transformer { return &Transformer{} } // Transformer implements transform.Transform. type Transformer struct { state ruleState hasRTL bool seen uint16 } // A rule can only be violated for "Bidi Domain names", meaning if one of the // following categories has been observed. func (t *Transformer) isRTL() bool { const isRTL = 1<<bidi.R | 1<<bidi.AL | 1<<bidi.AN return t.seen&isRTL != 0 } // Reset implements transform.Transformer. func (t *Transformer) Reset() { *t = Transformer{} } // Transform implements transform.Transformer. This Transformer has state and // needs to be reset between uses. func (t *Transformer) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { if len(dst) < len(src) { src = src[:len(dst)] atEOF = false err = transform.ErrShortDst } n, err1 := t.Span(src, atEOF) copy(dst, src[:n]) if err == nil || err1 != nil && err1 != transform.ErrShortSrc { err = err1 } return n, n, err } // Span returns the first n bytes of src that conform to the Bidi rule. func (t *Transformer) Span(src []byte, atEOF bool) (n int, err error) { if t.state == ruleInvalid && t.isRTL() { return 0, ErrInvalid } n, ok := t.advance(src) switch { case !ok: err = ErrInvalid case n < len(src): if !atEOF { err = transform.ErrShortSrc break } err = ErrInvalid case !t.isFinal(): err = ErrInvalid } return n, err } // Precomputing the ASCII values decreases running time for the ASCII fast path // by about 30%. var asciiTable [128]bidi.Properties func init() { for i := range asciiTable { p, _ := bidi.LookupRune(rune(i)) asciiTable[i] = p } } func (t *Transformer) advance(s []byte) (n int, ok bool) { var e bidi.Properties var sz int for n < len(s) { if s[n] < utf8.RuneSelf { e, sz = asciiTable[s[n]], 1 } else { e, sz = bidi.Lookup(s[n:]) if sz <= 1 { if sz == 1 { // We always consider invalid UTF-8 to be invalid, even if // the string has not yet been determined to be RTL. // TODO: is this correct? return n, false } return n, true // incomplete UTF-8 encoding } } // TODO: using CompactClass would result in noticeable speedup. // See unicode/bidi/prop.go:Properties.CompactClass. c := uint16(1 << e.Class()) t.seen |= c if t.seen&exclusiveRTL == exclusiveRTL { t.state = ruleInvalid return n, false } switch tr := transitions[t.state]; { case tr[0].mask&c != 0: t.state = tr[0].next case tr[1].mask&c != 0: t.state = tr[1].next default: t.state = ruleInvalid if t.isRTL() { return n, false } } n += sz } return n, true } func (t *Transformer) advanceString(s string) (n int, ok bool) { var e bidi.Properties var sz int for n < len(s) { if s[n] < utf8.RuneSelf { e, sz = asciiTable[s[n]], 1 } else { e, sz = bidi.LookupString(s[n:]) if sz <= 1 { if sz == 1 { return n, false // invalid UTF-8 } return n, true // incomplete UTF-8 encoding } } // TODO: using CompactClass results in noticeable speedup. // See unicode/bidi/prop.go:Properties.CompactClass. c := uint16(1 << e.Class()) t.seen |= c if t.seen&exclusiveRTL == exclusiveRTL { t.state = ruleInvalid return n, false } switch tr := transitions[t.state]; { case tr[0].mask&c != 0: t.state = tr[0].next case tr[1].mask&c != 0: t.state = tr[1].next default: t.state = ruleInvalid if t.isRTL() { return n, false } } n += sz } return n, true } ================================================ FILE: vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go ================================================ // Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build go1.10 package bidirule func (t *Transformer) isFinal() bool { return t.state == ruleLTRFinal || t.state == ruleRTLFinal || t.state == ruleInitial } ================================================ FILE: vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go ================================================ // Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !go1.10 package bidirule func (t *Transformer) isFinal() bool { if !t.isRTL() { return true } return t.state == ruleLTRFinal || t.state == ruleRTLFinal || t.state == ruleInitial } ================================================ FILE: vendor/golang.org/x/text/transform/transform.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package transform provides reader and writer wrappers that transform the // bytes passing through as well as various transformations. Example // transformations provided by other packages include normalization and // conversion between character sets. package transform // import "golang.org/x/text/transform" import ( "bytes" "errors" "io" "unicode/utf8" ) var ( // ErrShortDst means that the destination buffer was too short to // receive all of the transformed bytes. ErrShortDst = errors.New("transform: short destination buffer") // ErrShortSrc means that the source buffer has insufficient data to // complete the transformation. ErrShortSrc = errors.New("transform: short source buffer") // ErrEndOfSpan means that the input and output (the transformed input) // are not identical. ErrEndOfSpan = errors.New("transform: input and output are not identical") // errInconsistentByteCount means that Transform returned success (nil // error) but also returned nSrc inconsistent with the src argument. errInconsistentByteCount = errors.New("transform: inconsistent byte count returned") // errShortInternal means that an internal buffer is not large enough // to make progress and the Transform operation must be aborted. errShortInternal = errors.New("transform: short internal buffer") ) // Transformer transforms bytes. type Transformer interface { // Transform writes to dst the transformed bytes read from src, and // returns the number of dst bytes written and src bytes read. The // atEOF argument tells whether src represents the last bytes of the // input. // // Callers should always process the nDst bytes produced and account // for the nSrc bytes consumed before considering the error err. // // A nil error means that all of the transformed bytes (whether freshly // transformed from src or left over from previous Transform calls) // were written to dst. A nil error can be returned regardless of // whether atEOF is true. If err is nil then nSrc must equal len(src); // the converse is not necessarily true. // // ErrShortDst means that dst was too short to receive all of the // transformed bytes. ErrShortSrc means that src had insufficient data // to complete the transformation. If both conditions apply, then // either error may be returned. Other than the error conditions listed // here, implementations are free to report other errors that arise. Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) // Reset resets the state and allows a Transformer to be reused. Reset() } // SpanningTransformer extends the Transformer interface with a Span method // that determines how much of the input already conforms to the Transformer. type SpanningTransformer interface { Transformer // Span returns a position in src such that transforming src[:n] results in // identical output src[:n] for these bytes. It does not necessarily return // the largest such n. The atEOF argument tells whether src represents the // last bytes of the input. // // Callers should always account for the n bytes consumed before // considering the error err. // // A nil error means that all input bytes are known to be identical to the // output produced by the Transformer. A nil error can be be returned // regardless of whether atEOF is true. If err is nil, then then n must // equal len(src); the converse is not necessarily true. // // ErrEndOfSpan means that the Transformer output may differ from the // input after n bytes. Note that n may be len(src), meaning that the output // would contain additional bytes after otherwise identical output. // ErrShortSrc means that src had insufficient data to determine whether the // remaining bytes would change. Other than the error conditions listed // here, implementations are free to report other errors that arise. // // Calling Span can modify the Transformer state as a side effect. In // effect, it does the transformation just as calling Transform would, only // without copying to a destination buffer and only up to a point it can // determine the input and output bytes are the same. This is obviously more // limited than calling Transform, but can be more efficient in terms of // copying and allocating buffers. Calls to Span and Transform may be // interleaved. Span(src []byte, atEOF bool) (n int, err error) } // NopResetter can be embedded by implementations of Transformer to add a nop // Reset method. type NopResetter struct{} // Reset implements the Reset method of the Transformer interface. func (NopResetter) Reset() {} // Reader wraps another io.Reader by transforming the bytes read. type Reader struct { r io.Reader t Transformer err error // dst[dst0:dst1] contains bytes that have been transformed by t but // not yet copied out via Read. dst []byte dst0, dst1 int // src[src0:src1] contains bytes that have been read from r but not // yet transformed through t. src []byte src0, src1 int // transformComplete is whether the transformation is complete, // regardless of whether or not it was successful. transformComplete bool } const defaultBufSize = 4096 // NewReader returns a new Reader that wraps r by transforming the bytes read // via t. It calls Reset on t. func NewReader(r io.Reader, t Transformer) *Reader { t.Reset() return &Reader{ r: r, t: t, dst: make([]byte, defaultBufSize), src: make([]byte, defaultBufSize), } } // Read implements the io.Reader interface. func (r *Reader) Read(p []byte) (int, error) { n, err := 0, error(nil) for { // Copy out any transformed bytes and return the final error if we are done. if r.dst0 != r.dst1 { n = copy(p, r.dst[r.dst0:r.dst1]) r.dst0 += n if r.dst0 == r.dst1 && r.transformComplete { return n, r.err } return n, nil } else if r.transformComplete { return 0, r.err } // Try to transform some source bytes, or to flush the transformer if we // are out of source bytes. We do this even if r.r.Read returned an error. // As the io.Reader documentation says, "process the n > 0 bytes returned // before considering the error". if r.src0 != r.src1 || r.err != nil { r.dst0 = 0 r.dst1, n, err = r.t.Transform(r.dst, r.src[r.src0:r.src1], r.err == io.EOF) r.src0 += n switch { case err == nil: if r.src0 != r.src1 { r.err = errInconsistentByteCount } // The Transform call was successful; we are complete if we // cannot read more bytes into src. r.transformComplete = r.err != nil continue case err == ErrShortDst && (r.dst1 != 0 || n != 0): // Make room in dst by copying out, and try again. continue case err == ErrShortSrc && r.src1-r.src0 != len(r.src) && r.err == nil: // Read more bytes into src via the code below, and try again. default: r.transformComplete = true // The reader error (r.err) takes precedence over the // transformer error (err) unless r.err is nil or io.EOF. if r.err == nil || r.err == io.EOF { r.err = err } continue } } // Move any untransformed source bytes to the start of the buffer // and read more bytes. if r.src0 != 0 { r.src0, r.src1 = 0, copy(r.src, r.src[r.src0:r.src1]) } n, r.err = r.r.Read(r.src[r.src1:]) r.src1 += n } } // TODO: implement ReadByte (and ReadRune??). // Writer wraps another io.Writer by transforming the bytes read. // The user needs to call Close to flush unwritten bytes that may // be buffered. type Writer struct { w io.Writer t Transformer dst []byte // src[:n] contains bytes that have not yet passed through t. src []byte n int } // NewWriter returns a new Writer that wraps w by transforming the bytes written // via t. It calls Reset on t. func NewWriter(w io.Writer, t Transformer) *Writer { t.Reset() return &Writer{ w: w, t: t, dst: make([]byte, defaultBufSize), src: make([]byte, defaultBufSize), } } // Write implements the io.Writer interface. If there are not enough // bytes available to complete a Transform, the bytes will be buffered // for the next write. Call Close to convert the remaining bytes. func (w *Writer) Write(data []byte) (n int, err error) { src := data if w.n > 0 { // Append bytes from data to the last remainder. // TODO: limit the amount copied on first try. n = copy(w.src[w.n:], data) w.n += n src = w.src[:w.n] } for { nDst, nSrc, err := w.t.Transform(w.dst, src, false) if _, werr := w.w.Write(w.dst[:nDst]); werr != nil { return n, werr } src = src[nSrc:] if w.n == 0 { n += nSrc } else if len(src) <= n { // Enough bytes from w.src have been consumed. We make src point // to data instead to reduce the copying. w.n = 0 n -= len(src) src = data[n:] if n < len(data) && (err == nil || err == ErrShortSrc) { continue } } switch err { case ErrShortDst: // This error is okay as long as we are making progress. if nDst > 0 || nSrc > 0 { continue } case ErrShortSrc: if len(src) < len(w.src) { m := copy(w.src, src) // If w.n > 0, bytes from data were already copied to w.src and n // was already set to the number of bytes consumed. if w.n == 0 { n += m } w.n = m err = nil } else if nDst > 0 || nSrc > 0 { // Not enough buffer to store the remainder. Keep processing as // long as there is progress. Without this case, transforms that // require a lookahead larger than the buffer may result in an // error. This is not something one may expect to be common in // practice, but it may occur when buffers are set to small // sizes during testing. continue } case nil: if w.n > 0 { err = errInconsistentByteCount } } return n, err } } // Close implements the io.Closer interface. func (w *Writer) Close() error { src := w.src[:w.n] for { nDst, nSrc, err := w.t.Transform(w.dst, src, true) if _, werr := w.w.Write(w.dst[:nDst]); werr != nil { return werr } if err != ErrShortDst { return err } src = src[nSrc:] } } type nop struct{ NopResetter } func (nop) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { n := copy(dst, src) if n < len(src) { err = ErrShortDst } return n, n, err } func (nop) Span(src []byte, atEOF bool) (n int, err error) { return len(src), nil } type discard struct{ NopResetter } func (discard) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { return 0, len(src), nil } var ( // Discard is a Transformer for which all Transform calls succeed // by consuming all bytes and writing nothing. Discard Transformer = discard{} // Nop is a SpanningTransformer that copies src to dst. Nop SpanningTransformer = nop{} ) // chain is a sequence of links. A chain with N Transformers has N+1 links and // N+1 buffers. Of those N+1 buffers, the first and last are the src and dst // buffers given to chain.Transform and the middle N-1 buffers are intermediate // buffers owned by the chain. The i'th link transforms bytes from the i'th // buffer chain.link[i].b at read offset chain.link[i].p to the i+1'th buffer // chain.link[i+1].b at write offset chain.link[i+1].n, for i in [0, N). type chain struct { link []link err error // errStart is the index at which the error occurred plus 1. Processing // errStart at this level at the next call to Transform. As long as // errStart > 0, chain will not consume any more source bytes. errStart int } func (c *chain) fatalError(errIndex int, err error) { if i := errIndex + 1; i > c.errStart { c.errStart = i c.err = err } } type link struct { t Transformer // b[p:n] holds the bytes to be transformed by t. b []byte p int n int } func (l *link) src() []byte { return l.b[l.p:l.n] } func (l *link) dst() []byte { return l.b[l.n:] } // Chain returns a Transformer that applies t in sequence. func Chain(t ...Transformer) Transformer { if len(t) == 0 { return nop{} } c := &chain{link: make([]link, len(t)+1)} for i, tt := range t { c.link[i].t = tt } // Allocate intermediate buffers. b := make([][defaultBufSize]byte, len(t)-1) for i := range b { c.link[i+1].b = b[i][:] } return c } // Reset resets the state of Chain. It calls Reset on all the Transformers. func (c *chain) Reset() { for i, l := range c.link { if l.t != nil { l.t.Reset() } c.link[i].p, c.link[i].n = 0, 0 } } // TODO: make chain use Span (is going to be fun to implement!) // Transform applies the transformers of c in sequence. func (c *chain) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { // Set up src and dst in the chain. srcL := &c.link[0] dstL := &c.link[len(c.link)-1] srcL.b, srcL.p, srcL.n = src, 0, len(src) dstL.b, dstL.n = dst, 0 var lastFull, needProgress bool // for detecting progress // i is the index of the next Transformer to apply, for i in [low, high]. // low is the lowest index for which c.link[low] may still produce bytes. // high is the highest index for which c.link[high] has a Transformer. // The error returned by Transform determines whether to increase or // decrease i. We try to completely fill a buffer before converting it. for low, i, high := c.errStart, c.errStart, len(c.link)-2; low <= i && i <= high; { in, out := &c.link[i], &c.link[i+1] nDst, nSrc, err0 := in.t.Transform(out.dst(), in.src(), atEOF && low == i) out.n += nDst in.p += nSrc if i > 0 && in.p == in.n { in.p, in.n = 0, 0 } needProgress, lastFull = lastFull, false switch err0 { case ErrShortDst: // Process the destination buffer next. Return if we are already // at the high index. if i == high { return dstL.n, srcL.p, ErrShortDst } if out.n != 0 { i++ // If the Transformer at the next index is not able to process any // source bytes there is nothing that can be done to make progress // and the bytes will remain unprocessed. lastFull is used to // detect this and break out of the loop with a fatal error. lastFull = true continue } // The destination buffer was too small, but is completely empty. // Return a fatal error as this transformation can never complete. c.fatalError(i, errShortInternal) case ErrShortSrc: if i == 0 { // Save ErrShortSrc in err. All other errors take precedence. err = ErrShortSrc break } // Source bytes were depleted before filling up the destination buffer. // Verify we made some progress, move the remaining bytes to the errStart // and try to get more source bytes. if needProgress && nSrc == 0 || in.n-in.p == len(in.b) { // There were not enough source bytes to proceed while the source // buffer cannot hold any more bytes. Return a fatal error as this // transformation can never complete. c.fatalError(i, errShortInternal) break } // in.b is an internal buffer and we can make progress. in.p, in.n = 0, copy(in.b, in.src()) fallthrough case nil: // if i == low, we have depleted the bytes at index i or any lower levels. // In that case we increase low and i. In all other cases we decrease i to // fetch more bytes before proceeding to the next index. if i > low { i-- continue } default: c.fatalError(i, err0) } // Exhausted level low or fatal error: increase low and continue // to process the bytes accepted so far. i++ low = i } // If c.errStart > 0, this means we found a fatal error. We will clear // all upstream buffers. At this point, no more progress can be made // downstream, as Transform would have bailed while handling ErrShortDst. if c.errStart > 0 { for i := 1; i < c.errStart; i++ { c.link[i].p, c.link[i].n = 0, 0 } err, c.errStart, c.err = c.err, 0, nil } return dstL.n, srcL.p, err } // Deprecated: use runes.Remove instead. func RemoveFunc(f func(r rune) bool) Transformer { return removeF(f) } type removeF func(r rune) bool func (removeF) Reset() {} // Transform implements the Transformer interface. func (t removeF) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { for r, sz := rune(0), 0; len(src) > 0; src = src[sz:] { if r = rune(src[0]); r < utf8.RuneSelf { sz = 1 } else { r, sz = utf8.DecodeRune(src) if sz == 1 { // Invalid rune. if !atEOF && !utf8.FullRune(src) { err = ErrShortSrc break } // We replace illegal bytes with RuneError. Not doing so might // otherwise turn a sequence of invalid UTF-8 into valid UTF-8. // The resulting byte sequence may subsequently contain runes // for which t(r) is true that were passed unnoticed. if !t(r) { if nDst+3 > len(dst) { err = ErrShortDst break } nDst += copy(dst[nDst:], "\uFFFD") } nSrc++ continue } } if !t(r) { if nDst+sz > len(dst) { err = ErrShortDst break } nDst += copy(dst[nDst:], src[:sz]) } nSrc += sz } return } // grow returns a new []byte that is longer than b, and copies the first n bytes // of b to the start of the new slice. func grow(b []byte, n int) []byte { m := len(b) if m <= 32 { m = 64 } else if m <= 256 { m *= 2 } else { m += m >> 1 } buf := make([]byte, m) copy(buf, b[:n]) return buf } const initialBufSize = 128 // String returns a string with the result of converting s[:n] using t, where // n <= len(s). If err == nil, n will be len(s). It calls Reset on t. func String(t Transformer, s string) (result string, n int, err error) { t.Reset() if s == "" { // Fast path for the common case for empty input. Results in about a // 86% reduction of running time for BenchmarkStringLowerEmpty. if _, _, err := t.Transform(nil, nil, true); err == nil { return "", 0, nil } } // Allocate only once. Note that both dst and src escape when passed to // Transform. buf := [2 * initialBufSize]byte{} dst := buf[:initialBufSize:initialBufSize] src := buf[initialBufSize : 2*initialBufSize] // The input string s is transformed in multiple chunks (starting with a // chunk size of initialBufSize). nDst and nSrc are per-chunk (or // per-Transform-call) indexes, pDst and pSrc are overall indexes. nDst, nSrc := 0, 0 pDst, pSrc := 0, 0 // pPrefix is the length of a common prefix: the first pPrefix bytes of the // result will equal the first pPrefix bytes of s. It is not guaranteed to // be the largest such value, but if pPrefix, len(result) and len(s) are // all equal after the final transform (i.e. calling Transform with atEOF // being true returned nil error) then we don't need to allocate a new // result string. pPrefix := 0 for { // Invariant: pDst == pPrefix && pSrc == pPrefix. n := copy(src, s[pSrc:]) nDst, nSrc, err = t.Transform(dst, src[:n], pSrc+n == len(s)) pDst += nDst pSrc += nSrc // TODO: let transformers implement an optional Spanner interface, akin // to norm's QuickSpan. This would even allow us to avoid any allocation. if !bytes.Equal(dst[:nDst], src[:nSrc]) { break } pPrefix = pSrc if err == ErrShortDst { // A buffer can only be short if a transformer modifies its input. break } else if err == ErrShortSrc { if nSrc == 0 { // No progress was made. break } // Equal so far and !atEOF, so continue checking. } else if err != nil || pPrefix == len(s) { return string(s[:pPrefix]), pPrefix, err } } // Post-condition: pDst == pPrefix + nDst && pSrc == pPrefix + nSrc. // We have transformed the first pSrc bytes of the input s to become pDst // transformed bytes. Those transformed bytes are discontiguous: the first // pPrefix of them equal s[:pPrefix] and the last nDst of them equal // dst[:nDst]. We copy them around, into a new dst buffer if necessary, so // that they become one contiguous slice: dst[:pDst]. if pPrefix != 0 { newDst := dst if pDst > len(newDst) { newDst = make([]byte, len(s)+nDst-nSrc) } copy(newDst[pPrefix:pDst], dst[:nDst]) copy(newDst[:pPrefix], s[:pPrefix]) dst = newDst } // Prevent duplicate Transform calls with atEOF being true at the end of // the input. Also return if we have an unrecoverable error. if (err == nil && pSrc == len(s)) || (err != nil && err != ErrShortDst && err != ErrShortSrc) { return string(dst[:pDst]), pSrc, err } // Transform the remaining input, growing dst and src buffers as necessary. for { n := copy(src, s[pSrc:]) nDst, nSrc, err := t.Transform(dst[pDst:], src[:n], pSrc+n == len(s)) pDst += nDst pSrc += nSrc // If we got ErrShortDst or ErrShortSrc, do not grow as long as we can // make progress. This may avoid excessive allocations. if err == ErrShortDst { if nDst == 0 { dst = grow(dst, pDst) } } else if err == ErrShortSrc { if nSrc == 0 { src = grow(src, 0) } } else if err != nil || pSrc == len(s) { return string(dst[:pDst]), pSrc, err } } } // Bytes returns a new byte slice with the result of converting b[:n] using t, // where n <= len(b). If err == nil, n will be len(b). It calls Reset on t. func Bytes(t Transformer, b []byte) (result []byte, n int, err error) { return doAppend(t, 0, make([]byte, len(b)), b) } // Append appends the result of converting src[:n] using t to dst, where // n <= len(src), If err == nil, n will be len(src). It calls Reset on t. func Append(t Transformer, dst, src []byte) (result []byte, n int, err error) { if len(dst) == cap(dst) { n := len(src) + len(dst) // It is okay for this to be 0. b := make([]byte, n) dst = b[:copy(b, dst)] } return doAppend(t, len(dst), dst[:cap(dst)], src) } func doAppend(t Transformer, pDst int, dst, src []byte) (result []byte, n int, err error) { t.Reset() pSrc := 0 for { nDst, nSrc, err := t.Transform(dst[pDst:], src[pSrc:], true) pDst += nDst pSrc += nSrc if err != ErrShortDst { return dst[:pDst], pSrc, err } // Grow the destination buffer, but do not grow as long as we can make // progress. This may avoid excessive allocations. if nDst == 0 { dst = grow(dst, pDst) } } } ================================================ FILE: vendor/golang.org/x/text/unicode/bidi/bidi.go ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //go:generate go run gen.go gen_trieval.go gen_ranges.go // Package bidi contains functionality for bidirectional text support. // // See http://www.unicode.org/reports/tr9. // // NOTE: UNDER CONSTRUCTION. This API may change in backwards incompatible ways // and without notice. package bidi // import "golang.org/x/text/unicode/bidi" // TODO: // The following functionality would not be hard to implement, but hinges on // the definition of a Segmenter interface. For now this is up to the user. // - Iterate over paragraphs // - Segmenter to iterate over runs directly from a given text. // Also: // - Transformer for reordering? // - Transformer (validator, really) for Bidi Rule. // This API tries to avoid dealing with embedding levels for now. Under the hood // these will be computed, but the question is to which extent the user should // know they exist. We should at some point allow the user to specify an // embedding hierarchy, though. // A Direction indicates the overall flow of text. type Direction int const ( // LeftToRight indicates the text contains no right-to-left characters and // that either there are some left-to-right characters or the option // DefaultDirection(LeftToRight) was passed. LeftToRight Direction = iota // RightToLeft indicates the text contains no left-to-right characters and // that either there are some right-to-left characters or the option // DefaultDirection(RightToLeft) was passed. RightToLeft // Mixed indicates text contains both left-to-right and right-to-left // characters. Mixed // Neutral means that text contains no left-to-right and right-to-left // characters and that no default direction has been set. Neutral ) type options struct{} // An Option is an option for Bidi processing. type Option func(*options) // ICU allows the user to define embedding levels. This may be used, for example, // to use hierarchical structure of markup languages to define embeddings. // The following option may be a way to expose this functionality in this API. // // LevelFunc sets a function that associates nesting levels with the given text. // // The levels function will be called with monotonically increasing values for p. // func LevelFunc(levels func(p int) int) Option { // panic("unimplemented") // } // DefaultDirection sets the default direction for a Paragraph. The direction is // overridden if the text contains directional characters. func DefaultDirection(d Direction) Option { panic("unimplemented") } // A Paragraph holds a single Paragraph for Bidi processing. type Paragraph struct { // buffers } // SetBytes configures p for the given paragraph text. It replaces text // previously set by SetBytes or SetString. If b contains a paragraph separator // it will only process the first paragraph and report the number of bytes // consumed from b including this separator. Error may be non-nil if options are // given. func (p *Paragraph) SetBytes(b []byte, opts ...Option) (n int, err error) { panic("unimplemented") } // SetString configures p for the given paragraph text. It replaces text // previously set by SetBytes or SetString. If b contains a paragraph separator // it will only process the first paragraph and report the number of bytes // consumed from b including this separator. Error may be non-nil if options are // given. func (p *Paragraph) SetString(s string, opts ...Option) (n int, err error) { panic("unimplemented") } // IsLeftToRight reports whether the principle direction of rendering for this // paragraphs is left-to-right. If this returns false, the principle direction // of rendering is right-to-left. func (p *Paragraph) IsLeftToRight() bool { panic("unimplemented") } // Direction returns the direction of the text of this paragraph. // // The direction may be LeftToRight, RightToLeft, Mixed, or Neutral. func (p *Paragraph) Direction() Direction { panic("unimplemented") } // RunAt reports the Run at the given position of the input text. // // This method can be used for computing line breaks on paragraphs. func (p *Paragraph) RunAt(pos int) Run { panic("unimplemented") } // Order computes the visual ordering of all the runs in a Paragraph. func (p *Paragraph) Order() (Ordering, error) { panic("unimplemented") } // Line computes the visual ordering of runs for a single line starting and // ending at the given positions in the original text. func (p *Paragraph) Line(start, end int) (Ordering, error) { panic("unimplemented") } // An Ordering holds the computed visual order of runs of a Paragraph. Calling // SetBytes or SetString on the originating Paragraph invalidates an Ordering. // The methods of an Ordering should only be called by one goroutine at a time. type Ordering struct{} // Direction reports the directionality of the runs. // // The direction may be LeftToRight, RightToLeft, Mixed, or Neutral. func (o *Ordering) Direction() Direction { panic("unimplemented") } // NumRuns returns the number of runs. func (o *Ordering) NumRuns() int { panic("unimplemented") } // Run returns the ith run within the ordering. func (o *Ordering) Run(i int) Run { panic("unimplemented") } // TODO: perhaps with options. // // Reorder creates a reader that reads the runes in visual order per character. // // Modifiers remain after the runes they modify. // func (l *Runs) Reorder() io.Reader { // panic("unimplemented") // } // A Run is a continuous sequence of characters of a single direction. type Run struct { } // String returns the text of the run in its original order. func (r *Run) String() string { panic("unimplemented") } // Bytes returns the text of the run in its original order. func (r *Run) Bytes() []byte { panic("unimplemented") } // TODO: methods for // - Display order // - headers and footers // - bracket replacement. // Direction reports the direction of the run. func (r *Run) Direction() Direction { panic("unimplemented") } // Position of the Run within the text passed to SetBytes or SetString of the // originating Paragraph value. func (r *Run) Pos() (start, end int) { panic("unimplemented") } // AppendReverse reverses the order of characters of in, appends them to out, // and returns the result. Modifiers will still follow the runes they modify. // Brackets are replaced with their counterparts. func AppendReverse(out, in []byte) []byte { panic("unimplemented") } // ReverseString reverses the order of characters in s and returns a new string. // Modifiers will still follow the runes they modify. Brackets are replaced with // their counterparts. func ReverseString(s string) string { panic("unimplemented") } ================================================ FILE: vendor/golang.org/x/text/unicode/bidi/bracket.go ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package bidi import ( "container/list" "fmt" "sort" ) // This file contains a port of the reference implementation of the // Bidi Parentheses Algorithm: // http://www.unicode.org/Public/PROGRAMS/BidiReferenceJava/BidiPBAReference.java // // The implementation in this file covers definitions BD14-BD16 and rule N0 // of UAX#9. // // Some preprocessing is done for each rune before data is passed to this // algorithm: // - opening and closing brackets are identified // - a bracket pair type, like '(' and ')' is assigned a unique identifier that // is identical for the opening and closing bracket. It is left to do these // mappings. // - The BPA algorithm requires that bracket characters that are canonical // equivalents of each other be able to be substituted for each other. // It is the responsibility of the caller to do this canonicalization. // // In implementing BD16, this implementation departs slightly from the "logical" // algorithm defined in UAX#9. In particular, the stack referenced there // supports operations that go beyond a "basic" stack. An equivalent // implementation based on a linked list is used here. // Bidi_Paired_Bracket_Type // BD14. An opening paired bracket is a character whose // Bidi_Paired_Bracket_Type property value is Open. // // BD15. A closing paired bracket is a character whose // Bidi_Paired_Bracket_Type property value is Close. type bracketType byte const ( bpNone bracketType = iota bpOpen bpClose ) // bracketPair holds a pair of index values for opening and closing bracket // location of a bracket pair. type bracketPair struct { opener int closer int } func (b *bracketPair) String() string { return fmt.Sprintf("(%v, %v)", b.opener, b.closer) } // bracketPairs is a slice of bracketPairs with a sort.Interface implementation. type bracketPairs []bracketPair func (b bracketPairs) Len() int { return len(b) } func (b bracketPairs) Swap(i, j int) { b[i], b[j] = b[j], b[i] } func (b bracketPairs) Less(i, j int) bool { return b[i].opener < b[j].opener } // resolvePairedBrackets runs the paired bracket part of the UBA algorithm. // // For each rune, it takes the indexes into the original string, the class the // bracket type (in pairTypes) and the bracket identifier (pairValues). It also // takes the direction type for the start-of-sentence and the embedding level. // // The identifiers for bracket types are the rune of the canonicalized opening // bracket for brackets (open or close) or 0 for runes that are not brackets. func resolvePairedBrackets(s *isolatingRunSequence) { p := bracketPairer{ sos: s.sos, openers: list.New(), codesIsolatedRun: s.types, indexes: s.indexes, } dirEmbed := L if s.level&1 != 0 { dirEmbed = R } p.locateBrackets(s.p.pairTypes, s.p.pairValues) p.resolveBrackets(dirEmbed, s.p.initialTypes) } type bracketPairer struct { sos Class // direction corresponding to start of sequence // The following is a restatement of BD 16 using non-algorithmic language. // // A bracket pair is a pair of characters consisting of an opening // paired bracket and a closing paired bracket such that the // Bidi_Paired_Bracket property value of the former equals the latter, // subject to the following constraints. // - both characters of a pair occur in the same isolating run sequence // - the closing character of a pair follows the opening character // - any bracket character can belong at most to one pair, the earliest possible one // - any bracket character not part of a pair is treated like an ordinary character // - pairs may nest properly, but their spans may not overlap otherwise // Bracket characters with canonical decompositions are supposed to be // treated as if they had been normalized, to allow normalized and non- // normalized text to give the same result. In this implementation that step // is pushed out to the caller. The caller has to ensure that the pairValue // slices contain the rune of the opening bracket after normalization for // any opening or closing bracket. openers *list.List // list of positions for opening brackets // bracket pair positions sorted by location of opening bracket pairPositions bracketPairs codesIsolatedRun []Class // directional bidi codes for an isolated run indexes []int // array of index values into the original string } // matchOpener reports whether characters at given positions form a matching // bracket pair. func (p *bracketPairer) matchOpener(pairValues []rune, opener, closer int) bool { return pairValues[p.indexes[opener]] == pairValues[p.indexes[closer]] } const maxPairingDepth = 63 // locateBrackets locates matching bracket pairs according to BD16. // // This implementation uses a linked list instead of a stack, because, while // elements are added at the front (like a push) they are not generally removed // in atomic 'pop' operations, reducing the benefit of the stack archetype. func (p *bracketPairer) locateBrackets(pairTypes []bracketType, pairValues []rune) { // traverse the run // do that explicitly (not in a for-each) so we can record position for i, index := range p.indexes { // look at the bracket type for each character if pairTypes[index] == bpNone || p.codesIsolatedRun[i] != ON { // continue scanning continue } switch pairTypes[index] { case bpOpen: // check if maximum pairing depth reached if p.openers.Len() == maxPairingDepth { p.openers.Init() return } // remember opener location, most recent first p.openers.PushFront(i) case bpClose: // see if there is a match count := 0 for elem := p.openers.Front(); elem != nil; elem = elem.Next() { count++ opener := elem.Value.(int) if p.matchOpener(pairValues, opener, i) { // if the opener matches, add nested pair to the ordered list p.pairPositions = append(p.pairPositions, bracketPair{opener, i}) // remove up to and including matched opener for ; count > 0; count-- { p.openers.Remove(p.openers.Front()) } break } } sort.Sort(p.pairPositions) // if we get here, the closing bracket matched no openers // and gets ignored } } } // Bracket pairs within an isolating run sequence are processed as units so // that both the opening and the closing paired bracket in a pair resolve to // the same direction. // // N0. Process bracket pairs in an isolating run sequence sequentially in // the logical order of the text positions of the opening paired brackets // using the logic given below. Within this scope, bidirectional types EN // and AN are treated as R. // // Identify the bracket pairs in the current isolating run sequence // according to BD16. For each bracket-pair element in the list of pairs of // text positions: // // a Inspect the bidirectional types of the characters enclosed within the // bracket pair. // // b If any strong type (either L or R) matching the embedding direction is // found, set the type for both brackets in the pair to match the embedding // direction. // // o [ e ] o -> o e e e o // // o [ o e ] -> o e o e e // // o [ NI e ] -> o e NI e e // // c Otherwise, if a strong type (opposite the embedding direction) is // found, test for adjacent strong types as follows: 1 First, check // backwards before the opening paired bracket until the first strong type // (L, R, or sos) is found. If that first preceding strong type is opposite // the embedding direction, then set the type for both brackets in the pair // to that type. 2 Otherwise, set the type for both brackets in the pair to // the embedding direction. // // o [ o ] e -> o o o o e // // o [ o NI ] o -> o o o NI o o // // e [ o ] o -> e e o e o // // e [ o ] e -> e e o e e // // e ( o [ o ] NI ) e -> e e o o o o NI e e // // d Otherwise, do not set the type for the current bracket pair. Note that // if the enclosed text contains no strong types the paired brackets will // both resolve to the same level when resolved individually using rules N1 // and N2. // // e ( NI ) o -> e ( NI ) o // getStrongTypeN0 maps character's directional code to strong type as required // by rule N0. // // TODO: have separate type for "strong" directionality. func (p *bracketPairer) getStrongTypeN0(index int) Class { switch p.codesIsolatedRun[index] { // in the scope of N0, number types are treated as R case EN, AN, AL, R: return R case L: return L default: return ON } } // classifyPairContent reports the strong types contained inside a Bracket Pair, // assuming the given embedding direction. // // It returns ON if no strong type is found. If a single strong type is found, // it returns this this type. Otherwise it returns the embedding direction. // // TODO: use separate type for "strong" directionality. func (p *bracketPairer) classifyPairContent(loc bracketPair, dirEmbed Class) Class { dirOpposite := ON for i := loc.opener + 1; i < loc.closer; i++ { dir := p.getStrongTypeN0(i) if dir == ON { continue } if dir == dirEmbed { return dir // type matching embedding direction found } dirOpposite = dir } // return ON if no strong type found, or class opposite to dirEmbed return dirOpposite } // classBeforePair determines which strong types are present before a Bracket // Pair. Return R or L if strong type found, otherwise ON. func (p *bracketPairer) classBeforePair(loc bracketPair) Class { for i := loc.opener - 1; i >= 0; i-- { if dir := p.getStrongTypeN0(i); dir != ON { return dir } } // no strong types found, return sos return p.sos } // assignBracketType implements rule N0 for a single bracket pair. func (p *bracketPairer) assignBracketType(loc bracketPair, dirEmbed Class, initialTypes []Class) { // rule "N0, a", inspect contents of pair dirPair := p.classifyPairContent(loc, dirEmbed) // dirPair is now L, R, or N (no strong type found) // the following logical tests are performed out of order compared to // the statement of the rules but yield the same results if dirPair == ON { return // case "d" - nothing to do } if dirPair != dirEmbed { // case "c": strong type found, opposite - check before (c.1) dirPair = p.classBeforePair(loc) if dirPair == dirEmbed || dirPair == ON { // no strong opposite type found before - use embedding (c.2) dirPair = dirEmbed } } // else: case "b", strong type found matching embedding, // no explicit action needed, as dirPair is already set to embedding // direction // set the bracket types to the type found p.setBracketsToType(loc, dirPair, initialTypes) } func (p *bracketPairer) setBracketsToType(loc bracketPair, dirPair Class, initialTypes []Class) { p.codesIsolatedRun[loc.opener] = dirPair p.codesIsolatedRun[loc.closer] = dirPair for i := loc.opener + 1; i < loc.closer; i++ { index := p.indexes[i] if initialTypes[index] != NSM { break } p.codesIsolatedRun[i] = dirPair } for i := loc.closer + 1; i < len(p.indexes); i++ { index := p.indexes[i] if initialTypes[index] != NSM { break } p.codesIsolatedRun[i] = dirPair } } // resolveBrackets implements rule N0 for a list of pairs. func (p *bracketPairer) resolveBrackets(dirEmbed Class, initialTypes []Class) { for _, loc := range p.pairPositions { p.assignBracketType(loc, dirEmbed, initialTypes) } } ================================================ FILE: vendor/golang.org/x/text/unicode/bidi/core.go ================================================ // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package bidi import "log" // This implementation is a port based on the reference implementation found at: // http://www.unicode.org/Public/PROGRAMS/BidiReferenceJava/ // // described in Unicode Bidirectional Algorithm (UAX #9). // // Input: // There are two levels of input to the algorithm, since clients may prefer to // supply some information from out-of-band sources rather than relying on the // default behavior. // // - Bidi class array // - Bidi class array, with externally supplied base line direction // // Output: // Output is separated into several stages: // // - levels array over entire paragraph // - reordering array over entire paragraph // - levels array over line // - reordering array over line // // Note that for conformance to the Unicode Bidirectional Algorithm, // implementations are only required to generate correct reordering and // character directionality (odd or even levels) over a line. Generating // identical level arrays over a line is not required. Bidi explicit format // codes (LRE, RLE, LRO, RLO, PDF) and BN can be assigned arbitrary levels and // positions as long as the rest of the input is properly reordered. // // As the algorithm is defined to operate on a single paragraph at a time, this // implementation is written to handle single paragraphs. Thus rule P1 is // presumed by this implementation-- the data provided to the implementation is // assumed to be a single paragraph, and either contains no 'B' codes, or a // single 'B' code at the end of the input. 'B' is allowed as input to // illustrate how the algorithm assigns it a level. // // Also note that rules L3 and L4 depend on the rendering engine that uses the // result of the bidi algorithm. This implementation assumes that the rendering // engine expects combining marks in visual order (e.g. to the left of their // base character in RTL runs) and that it adjusts the glyphs used to render // mirrored characters that are in RTL runs so that they render appropriately. // level is the embedding level of a character. Even embedding levels indicate // left-to-right order and odd levels indicate right-to-left order. The special // level of -1 is reserved for undefined order. type level int8 const implicitLevel level = -1 // in returns if x is equal to any of the values in set. func (c Class) in(set ...Class) bool { for _, s := range set { if c == s { return true } } return false } // A paragraph contains the state of a paragraph. type paragraph struct { initialTypes []Class // Arrays of properties needed for paired bracket evaluation in N0 pairTypes []bracketType // paired Bracket types for paragraph pairValues []rune // rune for opening bracket or pbOpen and pbClose; 0 for pbNone embeddingLevel level // default: = implicitLevel; // at the paragraph levels resultTypes []Class resultLevels []level // Index of matching PDI for isolate initiator characters. For other // characters, the value of matchingPDI will be set to -1. For isolate // initiators with no matching PDI, matchingPDI will be set to the length of // the input string. matchingPDI []int // Index of matching isolate initiator for PDI characters. For other // characters, and for PDIs with no matching isolate initiator, the value of // matchingIsolateInitiator will be set to -1. matchingIsolateInitiator []int } // newParagraph initializes a paragraph. The user needs to supply a few arrays // corresponding to the preprocessed text input. The types correspond to the // Unicode BiDi classes for each rune. pairTypes indicates the bracket type for // each rune. pairValues provides a unique bracket class identifier for each // rune (suggested is the rune of the open bracket for opening and matching // close brackets, after normalization). The embedding levels are optional, but // may be supplied to encode embedding levels of styled text. // // TODO: return an error. func newParagraph(types []Class, pairTypes []bracketType, pairValues []rune, levels level) *paragraph { validateTypes(types) validatePbTypes(pairTypes) validatePbValues(pairValues, pairTypes) validateParagraphEmbeddingLevel(levels) p := ¶graph{ initialTypes: append([]Class(nil), types...), embeddingLevel: levels, pairTypes: pairTypes, pairValues: pairValues, resultTypes: append([]Class(nil), types...), } p.run() return p } func (p *paragraph) Len() int { return len(p.initialTypes) } // The algorithm. Does not include line-based processing (Rules L1, L2). // These are applied later in the line-based phase of the algorithm. func (p *paragraph) run() { p.determineMatchingIsolates() // 1) determining the paragraph level // Rule P1 is the requirement for entering this algorithm. // Rules P2, P3. // If no externally supplied paragraph embedding level, use default. if p.embeddingLevel == implicitLevel { p.embeddingLevel = p.determineParagraphEmbeddingLevel(0, p.Len()) } // Initialize result levels to paragraph embedding level. p.resultLevels = make([]level, p.Len()) setLevels(p.resultLevels, p.embeddingLevel) // 2) Explicit levels and directions // Rules X1-X8. p.determineExplicitEmbeddingLevels() // Rule X9. // We do not remove the embeddings, the overrides, the PDFs, and the BNs // from the string explicitly. But they are not copied into isolating run // sequences when they are created, so they are removed for all // practical purposes. // Rule X10. // Run remainder of algorithm one isolating run sequence at a time for _, seq := range p.determineIsolatingRunSequences() { // 3) resolving weak types // Rules W1-W7. seq.resolveWeakTypes() // 4a) resolving paired brackets // Rule N0 resolvePairedBrackets(seq) // 4b) resolving neutral types // Rules N1-N3. seq.resolveNeutralTypes() // 5) resolving implicit embedding levels // Rules I1, I2. seq.resolveImplicitLevels() // Apply the computed levels and types seq.applyLevelsAndTypes() } // Assign appropriate levels to 'hide' LREs, RLEs, LROs, RLOs, PDFs, and // BNs. This is for convenience, so the resulting level array will have // a value for every character. p.assignLevelsToCharactersRemovedByX9() } // determineMatchingIsolates determines the matching PDI for each isolate // initiator and vice versa. // // Definition BD9. // // At the end of this function: // // - The member variable matchingPDI is set to point to the index of the // matching PDI character for each isolate initiator character. If there is // no matching PDI, it is set to the length of the input text. For other // characters, it is set to -1. // - The member variable matchingIsolateInitiator is set to point to the // index of the matching isolate initiator character for each PDI character. // If there is no matching isolate initiator, or the character is not a PDI, // it is set to -1. func (p *paragraph) determineMatchingIsolates() { p.matchingPDI = make([]int, p.Len()) p.matchingIsolateInitiator = make([]int, p.Len()) for i := range p.matchingIsolateInitiator { p.matchingIsolateInitiator[i] = -1 } for i := range p.matchingPDI { p.matchingPDI[i] = -1 if t := p.resultTypes[i]; t.in(LRI, RLI, FSI) { depthCounter := 1 for j := i + 1; j < p.Len(); j++ { if u := p.resultTypes[j]; u.in(LRI, RLI, FSI) { depthCounter++ } else if u == PDI { if depthCounter--; depthCounter == 0 { p.matchingPDI[i] = j p.matchingIsolateInitiator[j] = i break } } } if p.matchingPDI[i] == -1 { p.matchingPDI[i] = p.Len() } } } } // determineParagraphEmbeddingLevel reports the resolved paragraph direction of // the substring limited by the given range [start, end). // // Determines the paragraph level based on rules P2, P3. This is also used // in rule X5c to find if an FSI should resolve to LRI or RLI. func (p *paragraph) determineParagraphEmbeddingLevel(start, end int) level { var strongType Class = unknownClass // Rule P2. for i := start; i < end; i++ { if t := p.resultTypes[i]; t.in(L, AL, R) { strongType = t break } else if t.in(FSI, LRI, RLI) { i = p.matchingPDI[i] // skip over to the matching PDI if i > end { log.Panic("assert (i <= end)") } } } // Rule P3. switch strongType { case unknownClass: // none found // default embedding level when no strong types found is 0. return 0 case L: return 0 default: // AL, R return 1 } } const maxDepth = 125 // This stack will store the embedding levels and override and isolated // statuses type directionalStatusStack struct { stackCounter int embeddingLevelStack [maxDepth + 1]level overrideStatusStack [maxDepth + 1]Class isolateStatusStack [maxDepth + 1]bool } func (s *directionalStatusStack) empty() { s.stackCounter = 0 } func (s *directionalStatusStack) pop() { s.stackCounter-- } func (s *directionalStatusStack) depth() int { return s.stackCounter } func (s *directionalStatusStack) push(level level, overrideStatus Class, isolateStatus bool) { s.embeddingLevelStack[s.stackCounter] = level s.overrideStatusStack[s.stackCounter] = overrideStatus s.isolateStatusStack[s.stackCounter] = isolateStatus s.stackCounter++ } func (s *directionalStatusStack) lastEmbeddingLevel() level { return s.embeddingLevelStack[s.stackCounter-1] } func (s *directionalStatusStack) lastDirectionalOverrideStatus() Class { return s.overrideStatusStack[s.stackCounter-1] } func (s *directionalStatusStack) lastDirectionalIsolateStatus() bool { return s.isolateStatusStack[s.stackCounter-1] } // Determine explicit levels using rules X1 - X8 func (p *paragraph) determineExplicitEmbeddingLevels() { var stack directionalStatusStack var overflowIsolateCount, overflowEmbeddingCount, validIsolateCount int // Rule X1. stack.push(p.embeddingLevel, ON, false) for i, t := range p.resultTypes { // Rules X2, X3, X4, X5, X5a, X5b, X5c switch t { case RLE, LRE, RLO, LRO, RLI, LRI, FSI: isIsolate := t.in(RLI, LRI, FSI) isRTL := t.in(RLE, RLO, RLI) // override if this is an FSI that resolves to RLI if t == FSI { isRTL = (p.determineParagraphEmbeddingLevel(i+1, p.matchingPDI[i]) == 1) } if isIsolate { p.resultLevels[i] = stack.lastEmbeddingLevel() if stack.lastDirectionalOverrideStatus() != ON { p.resultTypes[i] = stack.lastDirectionalOverrideStatus() } } var newLevel level if isRTL { // least greater odd newLevel = (stack.lastEmbeddingLevel() + 1) | 1 } else { // least greater even newLevel = (stack.lastEmbeddingLevel() + 2) &^ 1 } if newLevel <= maxDepth && overflowIsolateCount == 0 && overflowEmbeddingCount == 0 { if isIsolate { validIsolateCount++ } // Push new embedding level, override status, and isolated // status. // No check for valid stack counter, since the level check // suffices. switch t { case LRO: stack.push(newLevel, L, isIsolate) case RLO: stack.push(newLevel, R, isIsolate) default: stack.push(newLevel, ON, isIsolate) } // Not really part of the spec if !isIsolate { p.resultLevels[i] = newLevel } } else { // This is an invalid explicit formatting character, // so apply the "Otherwise" part of rules X2-X5b. if isIsolate { overflowIsolateCount++ } else { // !isIsolate if overflowIsolateCount == 0 { overflowEmbeddingCount++ } } } // Rule X6a case PDI: if overflowIsolateCount > 0 { overflowIsolateCount-- } else if validIsolateCount == 0 { // do nothing } else { overflowEmbeddingCount = 0 for !stack.lastDirectionalIsolateStatus() { stack.pop() } stack.pop() validIsolateCount-- } p.resultLevels[i] = stack.lastEmbeddingLevel() // Rule X7 case PDF: // Not really part of the spec p.resultLevels[i] = stack.lastEmbeddingLevel() if overflowIsolateCount > 0 { // do nothing } else if overflowEmbeddingCount > 0 { overflowEmbeddingCount-- } else if !stack.lastDirectionalIsolateStatus() && stack.depth() >= 2 { stack.pop() } case B: // paragraph separator. // Rule X8. // These values are reset for clarity, in this implementation B // can only occur as the last code in the array. stack.empty() overflowIsolateCount = 0 overflowEmbeddingCount = 0 validIsolateCount = 0 p.resultLevels[i] = p.embeddingLevel default: p.resultLevels[i] = stack.lastEmbeddingLevel() if stack.lastDirectionalOverrideStatus() != ON { p.resultTypes[i] = stack.lastDirectionalOverrideStatus() } } } } type isolatingRunSequence struct { p *paragraph indexes []int // indexes to the original string types []Class // type of each character using the index resolvedLevels []level // resolved levels after application of rules level level sos, eos Class } func (i *isolatingRunSequence) Len() int { return len(i.indexes) } func maxLevel(a, b level) level { if a > b { return a } return b } // Rule X10, second bullet: Determine the start-of-sequence (sos) and end-of-sequence (eos) types, // either L or R, for each isolating run sequence. func (p *paragraph) isolatingRunSequence(indexes []int) *isolatingRunSequence { length := len(indexes) types := make([]Class, length) for i, x := range indexes { types[i] = p.resultTypes[x] } // assign level, sos and eos prevChar := indexes[0] - 1 for prevChar >= 0 && isRemovedByX9(p.initialTypes[prevChar]) { prevChar-- } prevLevel := p.embeddingLevel if prevChar >= 0 { prevLevel = p.resultLevels[prevChar] } var succLevel level lastType := types[length-1] if lastType.in(LRI, RLI, FSI) { succLevel = p.embeddingLevel } else { // the first character after the end of run sequence limit := indexes[length-1] + 1 for ; limit < p.Len() && isRemovedByX9(p.initialTypes[limit]); limit++ { } succLevel = p.embeddingLevel if limit < p.Len() { succLevel = p.resultLevels[limit] } } level := p.resultLevels[indexes[0]] return &isolatingRunSequence{ p: p, indexes: indexes, types: types, level: level, sos: typeForLevel(maxLevel(prevLevel, level)), eos: typeForLevel(maxLevel(succLevel, level)), } } // Resolving weak types Rules W1-W7. // // Note that some weak types (EN, AN) remain after this processing is // complete. func (s *isolatingRunSequence) resolveWeakTypes() { // on entry, only these types remain s.assertOnly(L, R, AL, EN, ES, ET, AN, CS, B, S, WS, ON, NSM, LRI, RLI, FSI, PDI) // Rule W1. // Changes all NSMs. preceedingCharacterType := s.sos for i, t := range s.types { if t == NSM { s.types[i] = preceedingCharacterType } else { if t.in(LRI, RLI, FSI, PDI) { preceedingCharacterType = ON } preceedingCharacterType = t } } // Rule W2. // EN does not change at the start of the run, because sos != AL. for i, t := range s.types { if t == EN { for j := i - 1; j >= 0; j-- { if t := s.types[j]; t.in(L, R, AL) { if t == AL { s.types[i] = AN } break } } } } // Rule W3. for i, t := range s.types { if t == AL { s.types[i] = R } } // Rule W4. // Since there must be values on both sides for this rule to have an // effect, the scan skips the first and last value. // // Although the scan proceeds left to right, and changes the type // values in a way that would appear to affect the computations // later in the scan, there is actually no problem. A change in the // current value can only affect the value to its immediate right, // and only affect it if it is ES or CS. But the current value can // only change if the value to its right is not ES or CS. Thus // either the current value will not change, or its change will have // no effect on the remainder of the analysis. for i := 1; i < s.Len()-1; i++ { t := s.types[i] if t == ES || t == CS { prevSepType := s.types[i-1] succSepType := s.types[i+1] if prevSepType == EN && succSepType == EN { s.types[i] = EN } else if s.types[i] == CS && prevSepType == AN && succSepType == AN { s.types[i] = AN } } } // Rule W5. for i, t := range s.types { if t == ET { // locate end of sequence runStart := i runEnd := s.findRunLimit(runStart, ET) // check values at ends of sequence t := s.sos if runStart > 0 { t = s.types[runStart-1] } if t != EN { t = s.eos if runEnd < len(s.types) { t = s.types[runEnd] } } if t == EN { setTypes(s.types[runStart:runEnd], EN) } // continue at end of sequence i = runEnd } } // Rule W6. for i, t := range s.types { if t.in(ES, ET, CS) { s.types[i] = ON } } // Rule W7. for i, t := range s.types { if t == EN { // set default if we reach start of run prevStrongType := s.sos for j := i - 1; j >= 0; j-- { t = s.types[j] if t == L || t == R { // AL's have been changed to R prevStrongType = t break } } if prevStrongType == L { s.types[i] = L } } } } // 6) resolving neutral types Rules N1-N2. func (s *isolatingRunSequence) resolveNeutralTypes() { // on entry, only these types can be in resultTypes s.assertOnly(L, R, EN, AN, B, S, WS, ON, RLI, LRI, FSI, PDI) for i, t := range s.types { switch t { case WS, ON, B, S, RLI, LRI, FSI, PDI: // find bounds of run of neutrals runStart := i runEnd := s.findRunLimit(runStart, B, S, WS, ON, RLI, LRI, FSI, PDI) // determine effective types at ends of run var leadType, trailType Class // Note that the character found can only be L, R, AN, or // EN. if runStart == 0 { leadType = s.sos } else { leadType = s.types[runStart-1] if leadType.in(AN, EN) { leadType = R } } if runEnd == len(s.types) { trailType = s.eos } else { trailType = s.types[runEnd] if trailType.in(AN, EN) { trailType = R } } var resolvedType Class if leadType == trailType { // Rule N1. resolvedType = leadType } else { // Rule N2. // Notice the embedding level of the run is used, not // the paragraph embedding level. resolvedType = typeForLevel(s.level) } setTypes(s.types[runStart:runEnd], resolvedType) // skip over run of (former) neutrals i = runEnd } } } func setLevels(levels []level, newLevel level) { for i := range levels { levels[i] = newLevel } } func setTypes(types []Class, newType Class) { for i := range types { types[i] = newType } } // 7) resolving implicit embedding levels Rules I1, I2. func (s *isolatingRunSequence) resolveImplicitLevels() { // on entry, only these types can be in resultTypes s.assertOnly(L, R, EN, AN) s.resolvedLevels = make([]level, len(s.types)) setLevels(s.resolvedLevels, s.level) if (s.level & 1) == 0 { // even level for i, t := range s.types { // Rule I1. if t == L { // no change } else if t == R { s.resolvedLevels[i] += 1 } else { // t == AN || t == EN s.resolvedLevels[i] += 2 } } } else { // odd level for i, t := range s.types { // Rule I2. if t == R { // no change } else { // t == L || t == AN || t == EN s.resolvedLevels[i] += 1 } } } } // Applies the levels and types resolved in rules W1-I2 to the // resultLevels array. func (s *isolatingRunSequence) applyLevelsAndTypes() { for i, x := range s.indexes { s.p.resultTypes[x] = s.types[i] s.p.resultLevels[x] = s.resolvedLevels[i] } } // Return the limit of the run consisting only of the types in validSet // starting at index. This checks the value at index, and will return // index if that value is not in validSet. func (s *isolatingRunSequence) findRunLimit(index int, validSet ...Class) int { loop: for ; index < len(s.types); index++ { t := s.types[index] for _, valid := range validSet { if t == valid { continue loop } } return index // didn't find a match in validSet } return len(s.types) } // Algorithm validation. Assert that all values in types are in the // provided set. func (s *isolatingRunSequence) assertOnly(codes ...Class) { loop: for i, t := range s.types { for _, c := range codes { if t == c { continue loop } } log.Panicf("invalid bidi code %v present in assertOnly at position %d", t, s.indexes[i]) } } // determineLevelRuns returns an array of level runs. Each level run is // described as an array of indexes into the input string. // // Determines the level runs. Rule X9 will be applied in determining the // runs, in the way that makes sure the characters that are supposed to be // removed are not included in the runs. func (p *paragraph) determineLevelRuns() [][]int { run := []int{} allRuns := [][]int{} currentLevel := implicitLevel for i := range p.initialTypes { if !isRemovedByX9(p.initialTypes[i]) { if p.resultLevels[i] != currentLevel { // we just encountered a new run; wrap up last run if currentLevel >= 0 { // only wrap it up if there was a run allRuns = append(allRuns, run) run = nil } // Start new run currentLevel = p.resultLevels[i] } run = append(run, i) } } // Wrap up the final run, if any if len(run) > 0 { allRuns = append(allRuns, run) } return allRuns } // Definition BD13. Determine isolating run sequences. func (p *paragraph) determineIsolatingRunSequences() []*isolatingRunSequence { levelRuns := p.determineLevelRuns() // Compute the run that each character belongs to runForCharacter := make([]int, p.Len()) for i, run := range levelRuns { for _, index := range run { runForCharacter[index] = i } } sequences := []*isolatingRunSequence{} var currentRunSequence []int for _, run := range levelRuns { first := run[0] if p.initialTypes[first] != PDI || p.matchingIsolateInitiator[first] == -1 { currentRunSequence = nil // int run = i; for { // Copy this level run into currentRunSequence currentRunSequence = append(currentRunSequence, run...) last := currentRunSequence[len(currentRunSequence)-1] lastT := p.initialTypes[last] if lastT.in(LRI, RLI, FSI) && p.matchingPDI[last] != p.Len() { run = levelRuns[runForCharacter[p.matchingPDI[last]]] } else { break } } sequences = append(sequences, p.isolatingRunSequence(currentRunSequence)) } } return sequences } // Assign level information to characters removed by rule X9. This is for // ease of relating the level information to the original input data. Note // that the levels assigned to these codes are arbitrary, they're chosen so // as to avoid breaking level runs. func (p *paragraph) assignLevelsToCharactersRemovedByX9() { for i, t := range p.initialTypes { if t.in(LRE, RLE, LRO, RLO, PDF, BN) { p.resultTypes[i] = t p.resultLevels[i] = -1 } } // now propagate forward the levels information (could have // propagated backward, the main thing is not to introduce a level // break where one doesn't already exist). if p.resultLevels[0] == -1 { p.resultLevels[0] = p.embeddingLevel } for i := 1; i < len(p.initialTypes); i++ { if p.resultLevels[i] == -1 { p.resultLevels[i] = p.resultLevels[i-1] } } // Embedding information is for informational purposes only so need not be // adjusted. } // // Output // // getLevels computes levels array breaking lines at offsets in linebreaks. // Rule L1. // // The linebreaks array must include at least one value. The values must be // in strictly increasing order (no duplicates) between 1 and the length of // the text, inclusive. The last value must be the length of the text. func (p *paragraph) getLevels(linebreaks []int) []level { // Note that since the previous processing has removed all // P, S, and WS values from resultTypes, the values referred to // in these rules are the initial types, before any processing // has been applied (including processing of overrides). // // This example implementation has reinserted explicit format codes // and BN, in order that the levels array correspond to the // initial text. Their final placement is not normative. // These codes are treated like WS in this implementation, // so they don't interrupt sequences of WS. validateLineBreaks(linebreaks, p.Len()) result := append([]level(nil), p.resultLevels...) // don't worry about linebreaks since if there is a break within // a series of WS values preceding S, the linebreak itself // causes the reset. for i, t := range p.initialTypes { if t.in(B, S) { // Rule L1, clauses one and two. result[i] = p.embeddingLevel // Rule L1, clause three. for j := i - 1; j >= 0; j-- { if isWhitespace(p.initialTypes[j]) { // including format codes result[j] = p.embeddingLevel } else { break } } } } // Rule L1, clause four. start := 0 for _, limit := range linebreaks { for j := limit - 1; j >= start; j-- { if isWhitespace(p.initialTypes[j]) { // including format codes result[j] = p.embeddingLevel } else { break } } start = limit } return result } // getReordering returns the reordering of lines from a visual index to a // logical index for line breaks at the given offsets. // // Lines are concatenated from left to right. So for example, the fifth // character from the left on the third line is // // getReordering(linebreaks)[linebreaks[1] + 4] // // (linebreaks[1] is the position after the last character of the second // line, which is also the index of the first character on the third line, // and adding four gets the fifth character from the left). // // The linebreaks array must include at least one value. The values must be // in strictly increasing order (no duplicates) between 1 and the length of // the text, inclusive. The last value must be the length of the text. func (p *paragraph) getReordering(linebreaks []int) []int { validateLineBreaks(linebreaks, p.Len()) return computeMultilineReordering(p.getLevels(linebreaks), linebreaks) } // Return multiline reordering array for a given level array. Reordering // does not occur across a line break. func computeMultilineReordering(levels []level, linebreaks []int) []int { result := make([]int, len(levels)) start := 0 for _, limit := range linebreaks { tempLevels := make([]level, limit-start) copy(tempLevels, levels[start:]) for j, order := range computeReordering(tempLevels) { result[start+j] = order + start } start = limit } return result } // Return reordering array for a given level array. This reorders a single // line. The reordering is a visual to logical map. For example, the // leftmost char is string.charAt(order[0]). Rule L2. func computeReordering(levels []level) []int { result := make([]int, len(levels)) // initialize order for i := range result { result[i] = i } // locate highest level found on line. // Note the rules say text, but no reordering across line bounds is // performed, so this is sufficient. highestLevel := level(0) lowestOddLevel := level(maxDepth + 2) for _, level := range levels { if level > highestLevel { highestLevel = level } if level&1 != 0 && level < lowestOddLevel { lowestOddLevel = level } } for level := highestLevel; level >= lowestOddLevel; level-- { for i := 0; i < len(levels); i++ { if levels[i] >= level { // find range of text at or above this level start := i limit := i + 1 for limit < len(levels) && levels[limit] >= level { limit++ } for j, k := start, limit-1; j < k; j, k = j+1, k-1 { result[j], result[k] = result[k], result[j] } // skip to end of level run i = limit } } } return result } // isWhitespace reports whether the type is considered a whitespace type for the // line break rules. func isWhitespace(c Class) bool { switch c { case LRE, RLE, LRO, RLO, PDF, LRI, RLI, FSI, PDI, BN, WS: return true } return false } // isRemovedByX9 reports whether the type is one of the types removed in X9. func isRemovedByX9(c Class) bool { switch c { case LRE, RLE, LRO, RLO, PDF, BN: return true } return false } // typeForLevel reports the strong type (L or R) corresponding to the level. func typeForLevel(level level) Class { if (level & 0x1) == 0 { return L } return R } // TODO: change validation to not panic func validateTypes(types []Class) { if len(types) == 0 { log.Panic("types is null") } for i, t := range types[:len(types)-1] { if t == B { log.Panicf("B type before end of paragraph at index: %d", i) } } } func validateParagraphEmbeddingLevel(embeddingLevel level) { if embeddingLevel != implicitLevel && embeddingLevel != 0 && embeddingLevel != 1 { log.Panicf("illegal paragraph embedding level: %d", embeddingLevel) } } func validateLineBreaks(linebreaks []int, textLength int) { prev := 0 for i, next := range linebreaks { if next <= prev { log.Panicf("bad linebreak: %d at index: %d", next, i) } prev = next } if prev != textLength { log.Panicf("last linebreak was %d, want %d", prev, textLength) } } func validatePbTypes(pairTypes []bracketType) { if len(pairTypes) == 0 { log.Panic("pairTypes is null") } for i, pt := range pairTypes { switch pt { case bpNone, bpOpen, bpClose: default: log.Panicf("illegal pairType value at %d: %v", i, pairTypes[i]) } } } func validatePbValues(pairValues []rune, pairTypes []bracketType) { if pairValues == nil { log.Panic("pairValues is null") } if len(pairTypes) != len(pairValues) { log.Panic("pairTypes is different length from pairValues") } } ================================================ FILE: vendor/golang.org/x/text/unicode/bidi/prop.go ================================================ // Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package bidi import "unicode/utf8" // Properties provides access to BiDi properties of runes. type Properties struct { entry uint8 last uint8 } var trie = newBidiTrie(0) // TODO: using this for bidirule reduces the running time by about 5%. Consider // if this is worth exposing or if we can find a way to speed up the Class // method. // // // CompactClass is like Class, but maps all of the BiDi control classes // // (LRO, RLO, LRE, RLE, PDF, LRI, RLI, FSI, PDI) to the class Control. // func (p Properties) CompactClass() Class { // return Class(p.entry & 0x0F) // } // Class returns the Bidi class for p. func (p Properties) Class() Class { c := Class(p.entry & 0x0F) if c == Control { c = controlByteToClass[p.last&0xF] } return c } // IsBracket reports whether the rune is a bracket. func (p Properties) IsBracket() bool { return p.entry&0xF0 != 0 } // IsOpeningBracket reports whether the rune is an opening bracket. // IsBracket must return true. func (p Properties) IsOpeningBracket() bool { return p.entry&openMask != 0 } // TODO: find a better API and expose. func (p Properties) reverseBracket(r rune) rune { return xorMasks[p.entry>>xorMaskShift] ^ r } var controlByteToClass = [16]Class{ 0xD: LRO, // U+202D LeftToRightOverride, 0xE: RLO, // U+202E RightToLeftOverride, 0xA: LRE, // U+202A LeftToRightEmbedding, 0xB: RLE, // U+202B RightToLeftEmbedding, 0xC: PDF, // U+202C PopDirectionalFormat, 0x6: LRI, // U+2066 LeftToRightIsolate, 0x7: RLI, // U+2067 RightToLeftIsolate, 0x8: FSI, // U+2068 FirstStrongIsolate, 0x9: PDI, // U+2069 PopDirectionalIsolate, } // LookupRune returns properties for r. func LookupRune(r rune) (p Properties, size int) { var buf [4]byte n := utf8.EncodeRune(buf[:], r) return Lookup(buf[:n]) } // TODO: these lookup methods are based on the generated trie code. The returned // sizes have slightly different semantics from the generated code, in that it // always returns size==1 for an illegal UTF-8 byte (instead of the length // of the maximum invalid subsequence). Most Transformers, like unicode/norm, // leave invalid UTF-8 untouched, in which case it has performance benefits to // do so (without changing the semantics). Bidi requires the semantics used here // for the bidirule implementation to be compatible with the Go semantics. // They ultimately should perhaps be adopted by all trie implementations, for // convenience sake. // This unrolled code also boosts performance of the secure/bidirule package by // about 30%. // So, to remove this code: // - add option to trie generator to define return type. // - always return 1 byte size for ill-formed UTF-8 runes. // Lookup returns properties for the first rune in s and the width in bytes of // its encoding. The size will be 0 if s does not hold enough bytes to complete // the encoding. func Lookup(s []byte) (p Properties, sz int) { c0 := s[0] switch { case c0 < 0x80: // is ASCII return Properties{entry: bidiValues[c0]}, 1 case c0 < 0xC2: return Properties{}, 1 case c0 < 0xE0: // 2-byte UTF-8 if len(s) < 2 { return Properties{}, 0 } i := bidiIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return Properties{}, 1 } return Properties{entry: trie.lookupValue(uint32(i), c1)}, 2 case c0 < 0xF0: // 3-byte UTF-8 if len(s) < 3 { return Properties{}, 0 } i := bidiIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return Properties{}, 1 } o := uint32(i)<<6 + uint32(c1) i = bidiIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return Properties{}, 1 } return Properties{entry: trie.lookupValue(uint32(i), c2), last: c2}, 3 case c0 < 0xF8: // 4-byte UTF-8 if len(s) < 4 { return Properties{}, 0 } i := bidiIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return Properties{}, 1 } o := uint32(i)<<6 + uint32(c1) i = bidiIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return Properties{}, 1 } o = uint32(i)<<6 + uint32(c2) i = bidiIndex[o] c3 := s[3] if c3 < 0x80 || 0xC0 <= c3 { return Properties{}, 1 } return Properties{entry: trie.lookupValue(uint32(i), c3)}, 4 } // Illegal rune return Properties{}, 1 } // LookupString returns properties for the first rune in s and the width in // bytes of its encoding. The size will be 0 if s does not hold enough bytes to // complete the encoding. func LookupString(s string) (p Properties, sz int) { c0 := s[0] switch { case c0 < 0x80: // is ASCII return Properties{entry: bidiValues[c0]}, 1 case c0 < 0xC2: return Properties{}, 1 case c0 < 0xE0: // 2-byte UTF-8 if len(s) < 2 { return Properties{}, 0 } i := bidiIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return Properties{}, 1 } return Properties{entry: trie.lookupValue(uint32(i), c1)}, 2 case c0 < 0xF0: // 3-byte UTF-8 if len(s) < 3 { return Properties{}, 0 } i := bidiIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return Properties{}, 1 } o := uint32(i)<<6 + uint32(c1) i = bidiIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return Properties{}, 1 } return Properties{entry: trie.lookupValue(uint32(i), c2), last: c2}, 3 case c0 < 0xF8: // 4-byte UTF-8 if len(s) < 4 { return Properties{}, 0 } i := bidiIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return Properties{}, 1 } o := uint32(i)<<6 + uint32(c1) i = bidiIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return Properties{}, 1 } o = uint32(i)<<6 + uint32(c2) i = bidiIndex[o] c3 := s[3] if c3 < 0x80 || 0xC0 <= c3 { return Properties{}, 1 } return Properties{entry: trie.lookupValue(uint32(i), c3)}, 4 } // Illegal rune return Properties{}, 1 } ================================================ FILE: vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go ================================================ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. // +build go1.10 package bidi // UnicodeVersion is the Unicode version from which the tables in this package are derived. const UnicodeVersion = "10.0.0" // xorMasks contains masks to be xor-ed with brackets to get the reverse // version. var xorMasks = []int32{ // 8 elements 0, 1, 6, 7, 3, 15, 29, 63, } // Size: 56 bytes // lookup returns the trie value for the first UTF-8 encoding in s and // the width in bytes of this encoding. The size will be 0 if s does not // hold enough bytes to complete the encoding. len(s) must be greater than 0. func (t *bidiTrie) lookup(s []byte) (v uint8, sz int) { c0 := s[0] switch { case c0 < 0x80: // is ASCII return bidiValues[c0], 1 case c0 < 0xC2: return 0, 1 // Illegal UTF-8: not a starter, not ASCII. case c0 < 0xE0: // 2-byte UTF-8 if len(s) < 2 { return 0, 0 } i := bidiIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c1), 2 case c0 < 0xF0: // 3-byte UTF-8 if len(s) < 3 { return 0, 0 } i := bidiIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } o := uint32(i)<<6 + uint32(c1) i = bidiIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return 0, 2 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c2), 3 case c0 < 0xF8: // 4-byte UTF-8 if len(s) < 4 { return 0, 0 } i := bidiIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } o := uint32(i)<<6 + uint32(c1) i = bidiIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return 0, 2 // Illegal UTF-8: not a continuation byte. } o = uint32(i)<<6 + uint32(c2) i = bidiIndex[o] c3 := s[3] if c3 < 0x80 || 0xC0 <= c3 { return 0, 3 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c3), 4 } // Illegal rune return 0, 1 } // lookupUnsafe returns the trie value for the first UTF-8 encoding in s. // s must start with a full and valid UTF-8 encoded rune. func (t *bidiTrie) lookupUnsafe(s []byte) uint8 { c0 := s[0] if c0 < 0x80 { // is ASCII return bidiValues[c0] } i := bidiIndex[c0] if c0 < 0xE0 { // 2-byte UTF-8 return t.lookupValue(uint32(i), s[1]) } i = bidiIndex[uint32(i)<<6+uint32(s[1])] if c0 < 0xF0 { // 3-byte UTF-8 return t.lookupValue(uint32(i), s[2]) } i = bidiIndex[uint32(i)<<6+uint32(s[2])] if c0 < 0xF8 { // 4-byte UTF-8 return t.lookupValue(uint32(i), s[3]) } return 0 } // lookupString returns the trie value for the first UTF-8 encoding in s and // the width in bytes of this encoding. The size will be 0 if s does not // hold enough bytes to complete the encoding. len(s) must be greater than 0. func (t *bidiTrie) lookupString(s string) (v uint8, sz int) { c0 := s[0] switch { case c0 < 0x80: // is ASCII return bidiValues[c0], 1 case c0 < 0xC2: return 0, 1 // Illegal UTF-8: not a starter, not ASCII. case c0 < 0xE0: // 2-byte UTF-8 if len(s) < 2 { return 0, 0 } i := bidiIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c1), 2 case c0 < 0xF0: // 3-byte UTF-8 if len(s) < 3 { return 0, 0 } i := bidiIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } o := uint32(i)<<6 + uint32(c1) i = bidiIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return 0, 2 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c2), 3 case c0 < 0xF8: // 4-byte UTF-8 if len(s) < 4 { return 0, 0 } i := bidiIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } o := uint32(i)<<6 + uint32(c1) i = bidiIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return 0, 2 // Illegal UTF-8: not a continuation byte. } o = uint32(i)<<6 + uint32(c2) i = bidiIndex[o] c3 := s[3] if c3 < 0x80 || 0xC0 <= c3 { return 0, 3 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c3), 4 } // Illegal rune return 0, 1 } // lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. // s must start with a full and valid UTF-8 encoded rune. func (t *bidiTrie) lookupStringUnsafe(s string) uint8 { c0 := s[0] if c0 < 0x80 { // is ASCII return bidiValues[c0] } i := bidiIndex[c0] if c0 < 0xE0 { // 2-byte UTF-8 return t.lookupValue(uint32(i), s[1]) } i = bidiIndex[uint32(i)<<6+uint32(s[1])] if c0 < 0xF0 { // 3-byte UTF-8 return t.lookupValue(uint32(i), s[2]) } i = bidiIndex[uint32(i)<<6+uint32(s[2])] if c0 < 0xF8 { // 4-byte UTF-8 return t.lookupValue(uint32(i), s[3]) } return 0 } // bidiTrie. Total size: 16128 bytes (15.75 KiB). Checksum: 8122d83e461996f. type bidiTrie struct{} func newBidiTrie(i int) *bidiTrie { return &bidiTrie{} } // lookupValue determines the type of block n and looks up the value for b. func (t *bidiTrie) lookupValue(n uint32, b byte) uint8 { switch { default: return uint8(bidiValues[n<<6+uint32(b)]) } } // bidiValues: 228 blocks, 14592 entries, 14592 bytes // The third block is the zero block. var bidiValues = [14592]uint8{ // Block 0x0, offset 0x0 0x00: 0x000b, 0x01: 0x000b, 0x02: 0x000b, 0x03: 0x000b, 0x04: 0x000b, 0x05: 0x000b, 0x06: 0x000b, 0x07: 0x000b, 0x08: 0x000b, 0x09: 0x0008, 0x0a: 0x0007, 0x0b: 0x0008, 0x0c: 0x0009, 0x0d: 0x0007, 0x0e: 0x000b, 0x0f: 0x000b, 0x10: 0x000b, 0x11: 0x000b, 0x12: 0x000b, 0x13: 0x000b, 0x14: 0x000b, 0x15: 0x000b, 0x16: 0x000b, 0x17: 0x000b, 0x18: 0x000b, 0x19: 0x000b, 0x1a: 0x000b, 0x1b: 0x000b, 0x1c: 0x0007, 0x1d: 0x0007, 0x1e: 0x0007, 0x1f: 0x0008, 0x20: 0x0009, 0x21: 0x000a, 0x22: 0x000a, 0x23: 0x0004, 0x24: 0x0004, 0x25: 0x0004, 0x26: 0x000a, 0x27: 0x000a, 0x28: 0x003a, 0x29: 0x002a, 0x2a: 0x000a, 0x2b: 0x0003, 0x2c: 0x0006, 0x2d: 0x0003, 0x2e: 0x0006, 0x2f: 0x0006, 0x30: 0x0002, 0x31: 0x0002, 0x32: 0x0002, 0x33: 0x0002, 0x34: 0x0002, 0x35: 0x0002, 0x36: 0x0002, 0x37: 0x0002, 0x38: 0x0002, 0x39: 0x0002, 0x3a: 0x0006, 0x3b: 0x000a, 0x3c: 0x000a, 0x3d: 0x000a, 0x3e: 0x000a, 0x3f: 0x000a, // Block 0x1, offset 0x40 0x40: 0x000a, 0x5b: 0x005a, 0x5c: 0x000a, 0x5d: 0x004a, 0x5e: 0x000a, 0x5f: 0x000a, 0x60: 0x000a, 0x7b: 0x005a, 0x7c: 0x000a, 0x7d: 0x004a, 0x7e: 0x000a, 0x7f: 0x000b, // Block 0x2, offset 0x80 // Block 0x3, offset 0xc0 0xc0: 0x000b, 0xc1: 0x000b, 0xc2: 0x000b, 0xc3: 0x000b, 0xc4: 0x000b, 0xc5: 0x0007, 0xc6: 0x000b, 0xc7: 0x000b, 0xc8: 0x000b, 0xc9: 0x000b, 0xca: 0x000b, 0xcb: 0x000b, 0xcc: 0x000b, 0xcd: 0x000b, 0xce: 0x000b, 0xcf: 0x000b, 0xd0: 0x000b, 0xd1: 0x000b, 0xd2: 0x000b, 0xd3: 0x000b, 0xd4: 0x000b, 0xd5: 0x000b, 0xd6: 0x000b, 0xd7: 0x000b, 0xd8: 0x000b, 0xd9: 0x000b, 0xda: 0x000b, 0xdb: 0x000b, 0xdc: 0x000b, 0xdd: 0x000b, 0xde: 0x000b, 0xdf: 0x000b, 0xe0: 0x0006, 0xe1: 0x000a, 0xe2: 0x0004, 0xe3: 0x0004, 0xe4: 0x0004, 0xe5: 0x0004, 0xe6: 0x000a, 0xe7: 0x000a, 0xe8: 0x000a, 0xe9: 0x000a, 0xeb: 0x000a, 0xec: 0x000a, 0xed: 0x000b, 0xee: 0x000a, 0xef: 0x000a, 0xf0: 0x0004, 0xf1: 0x0004, 0xf2: 0x0002, 0xf3: 0x0002, 0xf4: 0x000a, 0xf6: 0x000a, 0xf7: 0x000a, 0xf8: 0x000a, 0xf9: 0x0002, 0xfb: 0x000a, 0xfc: 0x000a, 0xfd: 0x000a, 0xfe: 0x000a, 0xff: 0x000a, // Block 0x4, offset 0x100 0x117: 0x000a, 0x137: 0x000a, // Block 0x5, offset 0x140 0x179: 0x000a, 0x17a: 0x000a, // Block 0x6, offset 0x180 0x182: 0x000a, 0x183: 0x000a, 0x184: 0x000a, 0x185: 0x000a, 0x186: 0x000a, 0x187: 0x000a, 0x188: 0x000a, 0x189: 0x000a, 0x18a: 0x000a, 0x18b: 0x000a, 0x18c: 0x000a, 0x18d: 0x000a, 0x18e: 0x000a, 0x18f: 0x000a, 0x192: 0x000a, 0x193: 0x000a, 0x194: 0x000a, 0x195: 0x000a, 0x196: 0x000a, 0x197: 0x000a, 0x198: 0x000a, 0x199: 0x000a, 0x19a: 0x000a, 0x19b: 0x000a, 0x19c: 0x000a, 0x19d: 0x000a, 0x19e: 0x000a, 0x19f: 0x000a, 0x1a5: 0x000a, 0x1a6: 0x000a, 0x1a7: 0x000a, 0x1a8: 0x000a, 0x1a9: 0x000a, 0x1aa: 0x000a, 0x1ab: 0x000a, 0x1ac: 0x000a, 0x1ad: 0x000a, 0x1af: 0x000a, 0x1b0: 0x000a, 0x1b1: 0x000a, 0x1b2: 0x000a, 0x1b3: 0x000a, 0x1b4: 0x000a, 0x1b5: 0x000a, 0x1b6: 0x000a, 0x1b7: 0x000a, 0x1b8: 0x000a, 0x1b9: 0x000a, 0x1ba: 0x000a, 0x1bb: 0x000a, 0x1bc: 0x000a, 0x1bd: 0x000a, 0x1be: 0x000a, 0x1bf: 0x000a, // Block 0x7, offset 0x1c0 0x1c0: 0x000c, 0x1c1: 0x000c, 0x1c2: 0x000c, 0x1c3: 0x000c, 0x1c4: 0x000c, 0x1c5: 0x000c, 0x1c6: 0x000c, 0x1c7: 0x000c, 0x1c8: 0x000c, 0x1c9: 0x000c, 0x1ca: 0x000c, 0x1cb: 0x000c, 0x1cc: 0x000c, 0x1cd: 0x000c, 0x1ce: 0x000c, 0x1cf: 0x000c, 0x1d0: 0x000c, 0x1d1: 0x000c, 0x1d2: 0x000c, 0x1d3: 0x000c, 0x1d4: 0x000c, 0x1d5: 0x000c, 0x1d6: 0x000c, 0x1d7: 0x000c, 0x1d8: 0x000c, 0x1d9: 0x000c, 0x1da: 0x000c, 0x1db: 0x000c, 0x1dc: 0x000c, 0x1dd: 0x000c, 0x1de: 0x000c, 0x1df: 0x000c, 0x1e0: 0x000c, 0x1e1: 0x000c, 0x1e2: 0x000c, 0x1e3: 0x000c, 0x1e4: 0x000c, 0x1e5: 0x000c, 0x1e6: 0x000c, 0x1e7: 0x000c, 0x1e8: 0x000c, 0x1e9: 0x000c, 0x1ea: 0x000c, 0x1eb: 0x000c, 0x1ec: 0x000c, 0x1ed: 0x000c, 0x1ee: 0x000c, 0x1ef: 0x000c, 0x1f0: 0x000c, 0x1f1: 0x000c, 0x1f2: 0x000c, 0x1f3: 0x000c, 0x1f4: 0x000c, 0x1f5: 0x000c, 0x1f6: 0x000c, 0x1f7: 0x000c, 0x1f8: 0x000c, 0x1f9: 0x000c, 0x1fa: 0x000c, 0x1fb: 0x000c, 0x1fc: 0x000c, 0x1fd: 0x000c, 0x1fe: 0x000c, 0x1ff: 0x000c, // Block 0x8, offset 0x200 0x200: 0x000c, 0x201: 0x000c, 0x202: 0x000c, 0x203: 0x000c, 0x204: 0x000c, 0x205: 0x000c, 0x206: 0x000c, 0x207: 0x000c, 0x208: 0x000c, 0x209: 0x000c, 0x20a: 0x000c, 0x20b: 0x000c, 0x20c: 0x000c, 0x20d: 0x000c, 0x20e: 0x000c, 0x20f: 0x000c, 0x210: 0x000c, 0x211: 0x000c, 0x212: 0x000c, 0x213: 0x000c, 0x214: 0x000c, 0x215: 0x000c, 0x216: 0x000c, 0x217: 0x000c, 0x218: 0x000c, 0x219: 0x000c, 0x21a: 0x000c, 0x21b: 0x000c, 0x21c: 0x000c, 0x21d: 0x000c, 0x21e: 0x000c, 0x21f: 0x000c, 0x220: 0x000c, 0x221: 0x000c, 0x222: 0x000c, 0x223: 0x000c, 0x224: 0x000c, 0x225: 0x000c, 0x226: 0x000c, 0x227: 0x000c, 0x228: 0x000c, 0x229: 0x000c, 0x22a: 0x000c, 0x22b: 0x000c, 0x22c: 0x000c, 0x22d: 0x000c, 0x22e: 0x000c, 0x22f: 0x000c, 0x234: 0x000a, 0x235: 0x000a, 0x23e: 0x000a, // Block 0x9, offset 0x240 0x244: 0x000a, 0x245: 0x000a, 0x247: 0x000a, // Block 0xa, offset 0x280 0x2b6: 0x000a, // Block 0xb, offset 0x2c0 0x2c3: 0x000c, 0x2c4: 0x000c, 0x2c5: 0x000c, 0x2c6: 0x000c, 0x2c7: 0x000c, 0x2c8: 0x000c, 0x2c9: 0x000c, // Block 0xc, offset 0x300 0x30a: 0x000a, 0x30d: 0x000a, 0x30e: 0x000a, 0x30f: 0x0004, 0x310: 0x0001, 0x311: 0x000c, 0x312: 0x000c, 0x313: 0x000c, 0x314: 0x000c, 0x315: 0x000c, 0x316: 0x000c, 0x317: 0x000c, 0x318: 0x000c, 0x319: 0x000c, 0x31a: 0x000c, 0x31b: 0x000c, 0x31c: 0x000c, 0x31d: 0x000c, 0x31e: 0x000c, 0x31f: 0x000c, 0x320: 0x000c, 0x321: 0x000c, 0x322: 0x000c, 0x323: 0x000c, 0x324: 0x000c, 0x325: 0x000c, 0x326: 0x000c, 0x327: 0x000c, 0x328: 0x000c, 0x329: 0x000c, 0x32a: 0x000c, 0x32b: 0x000c, 0x32c: 0x000c, 0x32d: 0x000c, 0x32e: 0x000c, 0x32f: 0x000c, 0x330: 0x000c, 0x331: 0x000c, 0x332: 0x000c, 0x333: 0x000c, 0x334: 0x000c, 0x335: 0x000c, 0x336: 0x000c, 0x337: 0x000c, 0x338: 0x000c, 0x339: 0x000c, 0x33a: 0x000c, 0x33b: 0x000c, 0x33c: 0x000c, 0x33d: 0x000c, 0x33e: 0x0001, 0x33f: 0x000c, // Block 0xd, offset 0x340 0x340: 0x0001, 0x341: 0x000c, 0x342: 0x000c, 0x343: 0x0001, 0x344: 0x000c, 0x345: 0x000c, 0x346: 0x0001, 0x347: 0x000c, 0x348: 0x0001, 0x349: 0x0001, 0x34a: 0x0001, 0x34b: 0x0001, 0x34c: 0x0001, 0x34d: 0x0001, 0x34e: 0x0001, 0x34f: 0x0001, 0x350: 0x0001, 0x351: 0x0001, 0x352: 0x0001, 0x353: 0x0001, 0x354: 0x0001, 0x355: 0x0001, 0x356: 0x0001, 0x357: 0x0001, 0x358: 0x0001, 0x359: 0x0001, 0x35a: 0x0001, 0x35b: 0x0001, 0x35c: 0x0001, 0x35d: 0x0001, 0x35e: 0x0001, 0x35f: 0x0001, 0x360: 0x0001, 0x361: 0x0001, 0x362: 0x0001, 0x363: 0x0001, 0x364: 0x0001, 0x365: 0x0001, 0x366: 0x0001, 0x367: 0x0001, 0x368: 0x0001, 0x369: 0x0001, 0x36a: 0x0001, 0x36b: 0x0001, 0x36c: 0x0001, 0x36d: 0x0001, 0x36e: 0x0001, 0x36f: 0x0001, 0x370: 0x0001, 0x371: 0x0001, 0x372: 0x0001, 0x373: 0x0001, 0x374: 0x0001, 0x375: 0x0001, 0x376: 0x0001, 0x377: 0x0001, 0x378: 0x0001, 0x379: 0x0001, 0x37a: 0x0001, 0x37b: 0x0001, 0x37c: 0x0001, 0x37d: 0x0001, 0x37e: 0x0001, 0x37f: 0x0001, // Block 0xe, offset 0x380 0x380: 0x0005, 0x381: 0x0005, 0x382: 0x0005, 0x383: 0x0005, 0x384: 0x0005, 0x385: 0x0005, 0x386: 0x000a, 0x387: 0x000a, 0x388: 0x000d, 0x389: 0x0004, 0x38a: 0x0004, 0x38b: 0x000d, 0x38c: 0x0006, 0x38d: 0x000d, 0x38e: 0x000a, 0x38f: 0x000a, 0x390: 0x000c, 0x391: 0x000c, 0x392: 0x000c, 0x393: 0x000c, 0x394: 0x000c, 0x395: 0x000c, 0x396: 0x000c, 0x397: 0x000c, 0x398: 0x000c, 0x399: 0x000c, 0x39a: 0x000c, 0x39b: 0x000d, 0x39c: 0x000d, 0x39d: 0x000d, 0x39e: 0x000d, 0x39f: 0x000d, 0x3a0: 0x000d, 0x3a1: 0x000d, 0x3a2: 0x000d, 0x3a3: 0x000d, 0x3a4: 0x000d, 0x3a5: 0x000d, 0x3a6: 0x000d, 0x3a7: 0x000d, 0x3a8: 0x000d, 0x3a9: 0x000d, 0x3aa: 0x000d, 0x3ab: 0x000d, 0x3ac: 0x000d, 0x3ad: 0x000d, 0x3ae: 0x000d, 0x3af: 0x000d, 0x3b0: 0x000d, 0x3b1: 0x000d, 0x3b2: 0x000d, 0x3b3: 0x000d, 0x3b4: 0x000d, 0x3b5: 0x000d, 0x3b6: 0x000d, 0x3b7: 0x000d, 0x3b8: 0x000d, 0x3b9: 0x000d, 0x3ba: 0x000d, 0x3bb: 0x000d, 0x3bc: 0x000d, 0x3bd: 0x000d, 0x3be: 0x000d, 0x3bf: 0x000d, // Block 0xf, offset 0x3c0 0x3c0: 0x000d, 0x3c1: 0x000d, 0x3c2: 0x000d, 0x3c3: 0x000d, 0x3c4: 0x000d, 0x3c5: 0x000d, 0x3c6: 0x000d, 0x3c7: 0x000d, 0x3c8: 0x000d, 0x3c9: 0x000d, 0x3ca: 0x000d, 0x3cb: 0x000c, 0x3cc: 0x000c, 0x3cd: 0x000c, 0x3ce: 0x000c, 0x3cf: 0x000c, 0x3d0: 0x000c, 0x3d1: 0x000c, 0x3d2: 0x000c, 0x3d3: 0x000c, 0x3d4: 0x000c, 0x3d5: 0x000c, 0x3d6: 0x000c, 0x3d7: 0x000c, 0x3d8: 0x000c, 0x3d9: 0x000c, 0x3da: 0x000c, 0x3db: 0x000c, 0x3dc: 0x000c, 0x3dd: 0x000c, 0x3de: 0x000c, 0x3df: 0x000c, 0x3e0: 0x0005, 0x3e1: 0x0005, 0x3e2: 0x0005, 0x3e3: 0x0005, 0x3e4: 0x0005, 0x3e5: 0x0005, 0x3e6: 0x0005, 0x3e7: 0x0005, 0x3e8: 0x0005, 0x3e9: 0x0005, 0x3ea: 0x0004, 0x3eb: 0x0005, 0x3ec: 0x0005, 0x3ed: 0x000d, 0x3ee: 0x000d, 0x3ef: 0x000d, 0x3f0: 0x000c, 0x3f1: 0x000d, 0x3f2: 0x000d, 0x3f3: 0x000d, 0x3f4: 0x000d, 0x3f5: 0x000d, 0x3f6: 0x000d, 0x3f7: 0x000d, 0x3f8: 0x000d, 0x3f9: 0x000d, 0x3fa: 0x000d, 0x3fb: 0x000d, 0x3fc: 0x000d, 0x3fd: 0x000d, 0x3fe: 0x000d, 0x3ff: 0x000d, // Block 0x10, offset 0x400 0x400: 0x000d, 0x401: 0x000d, 0x402: 0x000d, 0x403: 0x000d, 0x404: 0x000d, 0x405: 0x000d, 0x406: 0x000d, 0x407: 0x000d, 0x408: 0x000d, 0x409: 0x000d, 0x40a: 0x000d, 0x40b: 0x000d, 0x40c: 0x000d, 0x40d: 0x000d, 0x40e: 0x000d, 0x40f: 0x000d, 0x410: 0x000d, 0x411: 0x000d, 0x412: 0x000d, 0x413: 0x000d, 0x414: 0x000d, 0x415: 0x000d, 0x416: 0x000d, 0x417: 0x000d, 0x418: 0x000d, 0x419: 0x000d, 0x41a: 0x000d, 0x41b: 0x000d, 0x41c: 0x000d, 0x41d: 0x000d, 0x41e: 0x000d, 0x41f: 0x000d, 0x420: 0x000d, 0x421: 0x000d, 0x422: 0x000d, 0x423: 0x000d, 0x424: 0x000d, 0x425: 0x000d, 0x426: 0x000d, 0x427: 0x000d, 0x428: 0x000d, 0x429: 0x000d, 0x42a: 0x000d, 0x42b: 0x000d, 0x42c: 0x000d, 0x42d: 0x000d, 0x42e: 0x000d, 0x42f: 0x000d, 0x430: 0x000d, 0x431: 0x000d, 0x432: 0x000d, 0x433: 0x000d, 0x434: 0x000d, 0x435: 0x000d, 0x436: 0x000d, 0x437: 0x000d, 0x438: 0x000d, 0x439: 0x000d, 0x43a: 0x000d, 0x43b: 0x000d, 0x43c: 0x000d, 0x43d: 0x000d, 0x43e: 0x000d, 0x43f: 0x000d, // Block 0x11, offset 0x440 0x440: 0x000d, 0x441: 0x000d, 0x442: 0x000d, 0x443: 0x000d, 0x444: 0x000d, 0x445: 0x000d, 0x446: 0x000d, 0x447: 0x000d, 0x448: 0x000d, 0x449: 0x000d, 0x44a: 0x000d, 0x44b: 0x000d, 0x44c: 0x000d, 0x44d: 0x000d, 0x44e: 0x000d, 0x44f: 0x000d, 0x450: 0x000d, 0x451: 0x000d, 0x452: 0x000d, 0x453: 0x000d, 0x454: 0x000d, 0x455: 0x000d, 0x456: 0x000c, 0x457: 0x000c, 0x458: 0x000c, 0x459: 0x000c, 0x45a: 0x000c, 0x45b: 0x000c, 0x45c: 0x000c, 0x45d: 0x0005, 0x45e: 0x000a, 0x45f: 0x000c, 0x460: 0x000c, 0x461: 0x000c, 0x462: 0x000c, 0x463: 0x000c, 0x464: 0x000c, 0x465: 0x000d, 0x466: 0x000d, 0x467: 0x000c, 0x468: 0x000c, 0x469: 0x000a, 0x46a: 0x000c, 0x46b: 0x000c, 0x46c: 0x000c, 0x46d: 0x000c, 0x46e: 0x000d, 0x46f: 0x000d, 0x470: 0x0002, 0x471: 0x0002, 0x472: 0x0002, 0x473: 0x0002, 0x474: 0x0002, 0x475: 0x0002, 0x476: 0x0002, 0x477: 0x0002, 0x478: 0x0002, 0x479: 0x0002, 0x47a: 0x000d, 0x47b: 0x000d, 0x47c: 0x000d, 0x47d: 0x000d, 0x47e: 0x000d, 0x47f: 0x000d, // Block 0x12, offset 0x480 0x480: 0x000d, 0x481: 0x000d, 0x482: 0x000d, 0x483: 0x000d, 0x484: 0x000d, 0x485: 0x000d, 0x486: 0x000d, 0x487: 0x000d, 0x488: 0x000d, 0x489: 0x000d, 0x48a: 0x000d, 0x48b: 0x000d, 0x48c: 0x000d, 0x48d: 0x000d, 0x48e: 0x000d, 0x48f: 0x000d, 0x490: 0x000d, 0x491: 0x000c, 0x492: 0x000d, 0x493: 0x000d, 0x494: 0x000d, 0x495: 0x000d, 0x496: 0x000d, 0x497: 0x000d, 0x498: 0x000d, 0x499: 0x000d, 0x49a: 0x000d, 0x49b: 0x000d, 0x49c: 0x000d, 0x49d: 0x000d, 0x49e: 0x000d, 0x49f: 0x000d, 0x4a0: 0x000d, 0x4a1: 0x000d, 0x4a2: 0x000d, 0x4a3: 0x000d, 0x4a4: 0x000d, 0x4a5: 0x000d, 0x4a6: 0x000d, 0x4a7: 0x000d, 0x4a8: 0x000d, 0x4a9: 0x000d, 0x4aa: 0x000d, 0x4ab: 0x000d, 0x4ac: 0x000d, 0x4ad: 0x000d, 0x4ae: 0x000d, 0x4af: 0x000d, 0x4b0: 0x000c, 0x4b1: 0x000c, 0x4b2: 0x000c, 0x4b3: 0x000c, 0x4b4: 0x000c, 0x4b5: 0x000c, 0x4b6: 0x000c, 0x4b7: 0x000c, 0x4b8: 0x000c, 0x4b9: 0x000c, 0x4ba: 0x000c, 0x4bb: 0x000c, 0x4bc: 0x000c, 0x4bd: 0x000c, 0x4be: 0x000c, 0x4bf: 0x000c, // Block 0x13, offset 0x4c0 0x4c0: 0x000c, 0x4c1: 0x000c, 0x4c2: 0x000c, 0x4c3: 0x000c, 0x4c4: 0x000c, 0x4c5: 0x000c, 0x4c6: 0x000c, 0x4c7: 0x000c, 0x4c8: 0x000c, 0x4c9: 0x000c, 0x4ca: 0x000c, 0x4cb: 0x000d, 0x4cc: 0x000d, 0x4cd: 0x000d, 0x4ce: 0x000d, 0x4cf: 0x000d, 0x4d0: 0x000d, 0x4d1: 0x000d, 0x4d2: 0x000d, 0x4d3: 0x000d, 0x4d4: 0x000d, 0x4d5: 0x000d, 0x4d6: 0x000d, 0x4d7: 0x000d, 0x4d8: 0x000d, 0x4d9: 0x000d, 0x4da: 0x000d, 0x4db: 0x000d, 0x4dc: 0x000d, 0x4dd: 0x000d, 0x4de: 0x000d, 0x4df: 0x000d, 0x4e0: 0x000d, 0x4e1: 0x000d, 0x4e2: 0x000d, 0x4e3: 0x000d, 0x4e4: 0x000d, 0x4e5: 0x000d, 0x4e6: 0x000d, 0x4e7: 0x000d, 0x4e8: 0x000d, 0x4e9: 0x000d, 0x4ea: 0x000d, 0x4eb: 0x000d, 0x4ec: 0x000d, 0x4ed: 0x000d, 0x4ee: 0x000d, 0x4ef: 0x000d, 0x4f0: 0x000d, 0x4f1: 0x000d, 0x4f2: 0x000d, 0x4f3: 0x000d, 0x4f4: 0x000d, 0x4f5: 0x000d, 0x4f6: 0x000d, 0x4f7: 0x000d, 0x4f8: 0x000d, 0x4f9: 0x000d, 0x4fa: 0x000d, 0x4fb: 0x000d, 0x4fc: 0x000d, 0x4fd: 0x000d, 0x4fe: 0x000d, 0x4ff: 0x000d, // Block 0x14, offset 0x500 0x500: 0x000d, 0x501: 0x000d, 0x502: 0x000d, 0x503: 0x000d, 0x504: 0x000d, 0x505: 0x000d, 0x506: 0x000d, 0x507: 0x000d, 0x508: 0x000d, 0x509: 0x000d, 0x50a: 0x000d, 0x50b: 0x000d, 0x50c: 0x000d, 0x50d: 0x000d, 0x50e: 0x000d, 0x50f: 0x000d, 0x510: 0x000d, 0x511: 0x000d, 0x512: 0x000d, 0x513: 0x000d, 0x514: 0x000d, 0x515: 0x000d, 0x516: 0x000d, 0x517: 0x000d, 0x518: 0x000d, 0x519: 0x000d, 0x51a: 0x000d, 0x51b: 0x000d, 0x51c: 0x000d, 0x51d: 0x000d, 0x51e: 0x000d, 0x51f: 0x000d, 0x520: 0x000d, 0x521: 0x000d, 0x522: 0x000d, 0x523: 0x000d, 0x524: 0x000d, 0x525: 0x000d, 0x526: 0x000c, 0x527: 0x000c, 0x528: 0x000c, 0x529: 0x000c, 0x52a: 0x000c, 0x52b: 0x000c, 0x52c: 0x000c, 0x52d: 0x000c, 0x52e: 0x000c, 0x52f: 0x000c, 0x530: 0x000c, 0x531: 0x000d, 0x532: 0x000d, 0x533: 0x000d, 0x534: 0x000d, 0x535: 0x000d, 0x536: 0x000d, 0x537: 0x000d, 0x538: 0x000d, 0x539: 0x000d, 0x53a: 0x000d, 0x53b: 0x000d, 0x53c: 0x000d, 0x53d: 0x000d, 0x53e: 0x000d, 0x53f: 0x000d, // Block 0x15, offset 0x540 0x540: 0x0001, 0x541: 0x0001, 0x542: 0x0001, 0x543: 0x0001, 0x544: 0x0001, 0x545: 0x0001, 0x546: 0x0001, 0x547: 0x0001, 0x548: 0x0001, 0x549: 0x0001, 0x54a: 0x0001, 0x54b: 0x0001, 0x54c: 0x0001, 0x54d: 0x0001, 0x54e: 0x0001, 0x54f: 0x0001, 0x550: 0x0001, 0x551: 0x0001, 0x552: 0x0001, 0x553: 0x0001, 0x554: 0x0001, 0x555: 0x0001, 0x556: 0x0001, 0x557: 0x0001, 0x558: 0x0001, 0x559: 0x0001, 0x55a: 0x0001, 0x55b: 0x0001, 0x55c: 0x0001, 0x55d: 0x0001, 0x55e: 0x0001, 0x55f: 0x0001, 0x560: 0x0001, 0x561: 0x0001, 0x562: 0x0001, 0x563: 0x0001, 0x564: 0x0001, 0x565: 0x0001, 0x566: 0x0001, 0x567: 0x0001, 0x568: 0x0001, 0x569: 0x0001, 0x56a: 0x0001, 0x56b: 0x000c, 0x56c: 0x000c, 0x56d: 0x000c, 0x56e: 0x000c, 0x56f: 0x000c, 0x570: 0x000c, 0x571: 0x000c, 0x572: 0x000c, 0x573: 0x000c, 0x574: 0x0001, 0x575: 0x0001, 0x576: 0x000a, 0x577: 0x000a, 0x578: 0x000a, 0x579: 0x000a, 0x57a: 0x0001, 0x57b: 0x0001, 0x57c: 0x0001, 0x57d: 0x0001, 0x57e: 0x0001, 0x57f: 0x0001, // Block 0x16, offset 0x580 0x580: 0x0001, 0x581: 0x0001, 0x582: 0x0001, 0x583: 0x0001, 0x584: 0x0001, 0x585: 0x0001, 0x586: 0x0001, 0x587: 0x0001, 0x588: 0x0001, 0x589: 0x0001, 0x58a: 0x0001, 0x58b: 0x0001, 0x58c: 0x0001, 0x58d: 0x0001, 0x58e: 0x0001, 0x58f: 0x0001, 0x590: 0x0001, 0x591: 0x0001, 0x592: 0x0001, 0x593: 0x0001, 0x594: 0x0001, 0x595: 0x0001, 0x596: 0x000c, 0x597: 0x000c, 0x598: 0x000c, 0x599: 0x000c, 0x59a: 0x0001, 0x59b: 0x000c, 0x59c: 0x000c, 0x59d: 0x000c, 0x59e: 0x000c, 0x59f: 0x000c, 0x5a0: 0x000c, 0x5a1: 0x000c, 0x5a2: 0x000c, 0x5a3: 0x000c, 0x5a4: 0x0001, 0x5a5: 0x000c, 0x5a6: 0x000c, 0x5a7: 0x000c, 0x5a8: 0x0001, 0x5a9: 0x000c, 0x5aa: 0x000c, 0x5ab: 0x000c, 0x5ac: 0x000c, 0x5ad: 0x000c, 0x5ae: 0x0001, 0x5af: 0x0001, 0x5b0: 0x0001, 0x5b1: 0x0001, 0x5b2: 0x0001, 0x5b3: 0x0001, 0x5b4: 0x0001, 0x5b5: 0x0001, 0x5b6: 0x0001, 0x5b7: 0x0001, 0x5b8: 0x0001, 0x5b9: 0x0001, 0x5ba: 0x0001, 0x5bb: 0x0001, 0x5bc: 0x0001, 0x5bd: 0x0001, 0x5be: 0x0001, 0x5bf: 0x0001, // Block 0x17, offset 0x5c0 0x5c0: 0x0001, 0x5c1: 0x0001, 0x5c2: 0x0001, 0x5c3: 0x0001, 0x5c4: 0x0001, 0x5c5: 0x0001, 0x5c6: 0x0001, 0x5c7: 0x0001, 0x5c8: 0x0001, 0x5c9: 0x0001, 0x5ca: 0x0001, 0x5cb: 0x0001, 0x5cc: 0x0001, 0x5cd: 0x0001, 0x5ce: 0x0001, 0x5cf: 0x0001, 0x5d0: 0x0001, 0x5d1: 0x0001, 0x5d2: 0x0001, 0x5d3: 0x0001, 0x5d4: 0x0001, 0x5d5: 0x0001, 0x5d6: 0x0001, 0x5d7: 0x0001, 0x5d8: 0x0001, 0x5d9: 0x000c, 0x5da: 0x000c, 0x5db: 0x000c, 0x5dc: 0x0001, 0x5dd: 0x0001, 0x5de: 0x0001, 0x5df: 0x0001, 0x5e0: 0x000d, 0x5e1: 0x000d, 0x5e2: 0x000d, 0x5e3: 0x000d, 0x5e4: 0x000d, 0x5e5: 0x000d, 0x5e6: 0x000d, 0x5e7: 0x000d, 0x5e8: 0x000d, 0x5e9: 0x000d, 0x5ea: 0x000d, 0x5eb: 0x000d, 0x5ec: 0x000d, 0x5ed: 0x000d, 0x5ee: 0x000d, 0x5ef: 0x000d, 0x5f0: 0x0001, 0x5f1: 0x0001, 0x5f2: 0x0001, 0x5f3: 0x0001, 0x5f4: 0x0001, 0x5f5: 0x0001, 0x5f6: 0x0001, 0x5f7: 0x0001, 0x5f8: 0x0001, 0x5f9: 0x0001, 0x5fa: 0x0001, 0x5fb: 0x0001, 0x5fc: 0x0001, 0x5fd: 0x0001, 0x5fe: 0x0001, 0x5ff: 0x0001, // Block 0x18, offset 0x600 0x600: 0x0001, 0x601: 0x0001, 0x602: 0x0001, 0x603: 0x0001, 0x604: 0x0001, 0x605: 0x0001, 0x606: 0x0001, 0x607: 0x0001, 0x608: 0x0001, 0x609: 0x0001, 0x60a: 0x0001, 0x60b: 0x0001, 0x60c: 0x0001, 0x60d: 0x0001, 0x60e: 0x0001, 0x60f: 0x0001, 0x610: 0x0001, 0x611: 0x0001, 0x612: 0x0001, 0x613: 0x0001, 0x614: 0x0001, 0x615: 0x0001, 0x616: 0x0001, 0x617: 0x0001, 0x618: 0x0001, 0x619: 0x0001, 0x61a: 0x0001, 0x61b: 0x0001, 0x61c: 0x0001, 0x61d: 0x0001, 0x61e: 0x0001, 0x61f: 0x0001, 0x620: 0x000d, 0x621: 0x000d, 0x622: 0x000d, 0x623: 0x000d, 0x624: 0x000d, 0x625: 0x000d, 0x626: 0x000d, 0x627: 0x000d, 0x628: 0x000d, 0x629: 0x000d, 0x62a: 0x000d, 0x62b: 0x000d, 0x62c: 0x000d, 0x62d: 0x000d, 0x62e: 0x000d, 0x62f: 0x000d, 0x630: 0x000d, 0x631: 0x000d, 0x632: 0x000d, 0x633: 0x000d, 0x634: 0x000d, 0x635: 0x000d, 0x636: 0x000d, 0x637: 0x000d, 0x638: 0x000d, 0x639: 0x000d, 0x63a: 0x000d, 0x63b: 0x000d, 0x63c: 0x000d, 0x63d: 0x000d, 0x63e: 0x000d, 0x63f: 0x000d, // Block 0x19, offset 0x640 0x640: 0x000d, 0x641: 0x000d, 0x642: 0x000d, 0x643: 0x000d, 0x644: 0x000d, 0x645: 0x000d, 0x646: 0x000d, 0x647: 0x000d, 0x648: 0x000d, 0x649: 0x000d, 0x64a: 0x000d, 0x64b: 0x000d, 0x64c: 0x000d, 0x64d: 0x000d, 0x64e: 0x000d, 0x64f: 0x000d, 0x650: 0x000d, 0x651: 0x000d, 0x652: 0x000d, 0x653: 0x000d, 0x654: 0x000c, 0x655: 0x000c, 0x656: 0x000c, 0x657: 0x000c, 0x658: 0x000c, 0x659: 0x000c, 0x65a: 0x000c, 0x65b: 0x000c, 0x65c: 0x000c, 0x65d: 0x000c, 0x65e: 0x000c, 0x65f: 0x000c, 0x660: 0x000c, 0x661: 0x000c, 0x662: 0x0005, 0x663: 0x000c, 0x664: 0x000c, 0x665: 0x000c, 0x666: 0x000c, 0x667: 0x000c, 0x668: 0x000c, 0x669: 0x000c, 0x66a: 0x000c, 0x66b: 0x000c, 0x66c: 0x000c, 0x66d: 0x000c, 0x66e: 0x000c, 0x66f: 0x000c, 0x670: 0x000c, 0x671: 0x000c, 0x672: 0x000c, 0x673: 0x000c, 0x674: 0x000c, 0x675: 0x000c, 0x676: 0x000c, 0x677: 0x000c, 0x678: 0x000c, 0x679: 0x000c, 0x67a: 0x000c, 0x67b: 0x000c, 0x67c: 0x000c, 0x67d: 0x000c, 0x67e: 0x000c, 0x67f: 0x000c, // Block 0x1a, offset 0x680 0x680: 0x000c, 0x681: 0x000c, 0x682: 0x000c, 0x6ba: 0x000c, 0x6bc: 0x000c, // Block 0x1b, offset 0x6c0 0x6c1: 0x000c, 0x6c2: 0x000c, 0x6c3: 0x000c, 0x6c4: 0x000c, 0x6c5: 0x000c, 0x6c6: 0x000c, 0x6c7: 0x000c, 0x6c8: 0x000c, 0x6cd: 0x000c, 0x6d1: 0x000c, 0x6d2: 0x000c, 0x6d3: 0x000c, 0x6d4: 0x000c, 0x6d5: 0x000c, 0x6d6: 0x000c, 0x6d7: 0x000c, 0x6e2: 0x000c, 0x6e3: 0x000c, // Block 0x1c, offset 0x700 0x701: 0x000c, 0x73c: 0x000c, // Block 0x1d, offset 0x740 0x741: 0x000c, 0x742: 0x000c, 0x743: 0x000c, 0x744: 0x000c, 0x74d: 0x000c, 0x762: 0x000c, 0x763: 0x000c, 0x772: 0x0004, 0x773: 0x0004, 0x77b: 0x0004, // Block 0x1e, offset 0x780 0x781: 0x000c, 0x782: 0x000c, 0x7bc: 0x000c, // Block 0x1f, offset 0x7c0 0x7c1: 0x000c, 0x7c2: 0x000c, 0x7c7: 0x000c, 0x7c8: 0x000c, 0x7cb: 0x000c, 0x7cc: 0x000c, 0x7cd: 0x000c, 0x7d1: 0x000c, 0x7f0: 0x000c, 0x7f1: 0x000c, 0x7f5: 0x000c, // Block 0x20, offset 0x800 0x801: 0x000c, 0x802: 0x000c, 0x803: 0x000c, 0x804: 0x000c, 0x805: 0x000c, 0x807: 0x000c, 0x808: 0x000c, 0x80d: 0x000c, 0x822: 0x000c, 0x823: 0x000c, 0x831: 0x0004, 0x83a: 0x000c, 0x83b: 0x000c, 0x83c: 0x000c, 0x83d: 0x000c, 0x83e: 0x000c, 0x83f: 0x000c, // Block 0x21, offset 0x840 0x841: 0x000c, 0x87c: 0x000c, 0x87f: 0x000c, // Block 0x22, offset 0x880 0x881: 0x000c, 0x882: 0x000c, 0x883: 0x000c, 0x884: 0x000c, 0x88d: 0x000c, 0x896: 0x000c, 0x8a2: 0x000c, 0x8a3: 0x000c, // Block 0x23, offset 0x8c0 0x8c2: 0x000c, // Block 0x24, offset 0x900 0x900: 0x000c, 0x90d: 0x000c, 0x933: 0x000a, 0x934: 0x000a, 0x935: 0x000a, 0x936: 0x000a, 0x937: 0x000a, 0x938: 0x000a, 0x939: 0x0004, 0x93a: 0x000a, // Block 0x25, offset 0x940 0x940: 0x000c, 0x97e: 0x000c, 0x97f: 0x000c, // Block 0x26, offset 0x980 0x980: 0x000c, 0x986: 0x000c, 0x987: 0x000c, 0x988: 0x000c, 0x98a: 0x000c, 0x98b: 0x000c, 0x98c: 0x000c, 0x98d: 0x000c, 0x995: 0x000c, 0x996: 0x000c, 0x9a2: 0x000c, 0x9a3: 0x000c, 0x9b8: 0x000a, 0x9b9: 0x000a, 0x9ba: 0x000a, 0x9bb: 0x000a, 0x9bc: 0x000a, 0x9bd: 0x000a, 0x9be: 0x000a, // Block 0x27, offset 0x9c0 0x9cc: 0x000c, 0x9cd: 0x000c, 0x9e2: 0x000c, 0x9e3: 0x000c, // Block 0x28, offset 0xa00 0xa00: 0x000c, 0xa01: 0x000c, 0xa3b: 0x000c, 0xa3c: 0x000c, // Block 0x29, offset 0xa40 0xa41: 0x000c, 0xa42: 0x000c, 0xa43: 0x000c, 0xa44: 0x000c, 0xa4d: 0x000c, 0xa62: 0x000c, 0xa63: 0x000c, // Block 0x2a, offset 0xa80 0xa8a: 0x000c, 0xa92: 0x000c, 0xa93: 0x000c, 0xa94: 0x000c, 0xa96: 0x000c, // Block 0x2b, offset 0xac0 0xaf1: 0x000c, 0xaf4: 0x000c, 0xaf5: 0x000c, 0xaf6: 0x000c, 0xaf7: 0x000c, 0xaf8: 0x000c, 0xaf9: 0x000c, 0xafa: 0x000c, 0xaff: 0x0004, // Block 0x2c, offset 0xb00 0xb07: 0x000c, 0xb08: 0x000c, 0xb09: 0x000c, 0xb0a: 0x000c, 0xb0b: 0x000c, 0xb0c: 0x000c, 0xb0d: 0x000c, 0xb0e: 0x000c, // Block 0x2d, offset 0xb40 0xb71: 0x000c, 0xb74: 0x000c, 0xb75: 0x000c, 0xb76: 0x000c, 0xb77: 0x000c, 0xb78: 0x000c, 0xb79: 0x000c, 0xb7b: 0x000c, 0xb7c: 0x000c, // Block 0x2e, offset 0xb80 0xb88: 0x000c, 0xb89: 0x000c, 0xb8a: 0x000c, 0xb8b: 0x000c, 0xb8c: 0x000c, 0xb8d: 0x000c, // Block 0x2f, offset 0xbc0 0xbd8: 0x000c, 0xbd9: 0x000c, 0xbf5: 0x000c, 0xbf7: 0x000c, 0xbf9: 0x000c, 0xbfa: 0x003a, 0xbfb: 0x002a, 0xbfc: 0x003a, 0xbfd: 0x002a, // Block 0x30, offset 0xc00 0xc31: 0x000c, 0xc32: 0x000c, 0xc33: 0x000c, 0xc34: 0x000c, 0xc35: 0x000c, 0xc36: 0x000c, 0xc37: 0x000c, 0xc38: 0x000c, 0xc39: 0x000c, 0xc3a: 0x000c, 0xc3b: 0x000c, 0xc3c: 0x000c, 0xc3d: 0x000c, 0xc3e: 0x000c, // Block 0x31, offset 0xc40 0xc40: 0x000c, 0xc41: 0x000c, 0xc42: 0x000c, 0xc43: 0x000c, 0xc44: 0x000c, 0xc46: 0x000c, 0xc47: 0x000c, 0xc4d: 0x000c, 0xc4e: 0x000c, 0xc4f: 0x000c, 0xc50: 0x000c, 0xc51: 0x000c, 0xc52: 0x000c, 0xc53: 0x000c, 0xc54: 0x000c, 0xc55: 0x000c, 0xc56: 0x000c, 0xc57: 0x000c, 0xc59: 0x000c, 0xc5a: 0x000c, 0xc5b: 0x000c, 0xc5c: 0x000c, 0xc5d: 0x000c, 0xc5e: 0x000c, 0xc5f: 0x000c, 0xc60: 0x000c, 0xc61: 0x000c, 0xc62: 0x000c, 0xc63: 0x000c, 0xc64: 0x000c, 0xc65: 0x000c, 0xc66: 0x000c, 0xc67: 0x000c, 0xc68: 0x000c, 0xc69: 0x000c, 0xc6a: 0x000c, 0xc6b: 0x000c, 0xc6c: 0x000c, 0xc6d: 0x000c, 0xc6e: 0x000c, 0xc6f: 0x000c, 0xc70: 0x000c, 0xc71: 0x000c, 0xc72: 0x000c, 0xc73: 0x000c, 0xc74: 0x000c, 0xc75: 0x000c, 0xc76: 0x000c, 0xc77: 0x000c, 0xc78: 0x000c, 0xc79: 0x000c, 0xc7a: 0x000c, 0xc7b: 0x000c, 0xc7c: 0x000c, // Block 0x32, offset 0xc80 0xc86: 0x000c, // Block 0x33, offset 0xcc0 0xced: 0x000c, 0xcee: 0x000c, 0xcef: 0x000c, 0xcf0: 0x000c, 0xcf2: 0x000c, 0xcf3: 0x000c, 0xcf4: 0x000c, 0xcf5: 0x000c, 0xcf6: 0x000c, 0xcf7: 0x000c, 0xcf9: 0x000c, 0xcfa: 0x000c, 0xcfd: 0x000c, 0xcfe: 0x000c, // Block 0x34, offset 0xd00 0xd18: 0x000c, 0xd19: 0x000c, 0xd1e: 0x000c, 0xd1f: 0x000c, 0xd20: 0x000c, 0xd31: 0x000c, 0xd32: 0x000c, 0xd33: 0x000c, 0xd34: 0x000c, // Block 0x35, offset 0xd40 0xd42: 0x000c, 0xd45: 0x000c, 0xd46: 0x000c, 0xd4d: 0x000c, 0xd5d: 0x000c, // Block 0x36, offset 0xd80 0xd9d: 0x000c, 0xd9e: 0x000c, 0xd9f: 0x000c, // Block 0x37, offset 0xdc0 0xdd0: 0x000a, 0xdd1: 0x000a, 0xdd2: 0x000a, 0xdd3: 0x000a, 0xdd4: 0x000a, 0xdd5: 0x000a, 0xdd6: 0x000a, 0xdd7: 0x000a, 0xdd8: 0x000a, 0xdd9: 0x000a, // Block 0x38, offset 0xe00 0xe00: 0x000a, // Block 0x39, offset 0xe40 0xe40: 0x0009, 0xe5b: 0x007a, 0xe5c: 0x006a, // Block 0x3a, offset 0xe80 0xe92: 0x000c, 0xe93: 0x000c, 0xe94: 0x000c, 0xeb2: 0x000c, 0xeb3: 0x000c, 0xeb4: 0x000c, // Block 0x3b, offset 0xec0 0xed2: 0x000c, 0xed3: 0x000c, 0xef2: 0x000c, 0xef3: 0x000c, // Block 0x3c, offset 0xf00 0xf34: 0x000c, 0xf35: 0x000c, 0xf37: 0x000c, 0xf38: 0x000c, 0xf39: 0x000c, 0xf3a: 0x000c, 0xf3b: 0x000c, 0xf3c: 0x000c, 0xf3d: 0x000c, // Block 0x3d, offset 0xf40 0xf46: 0x000c, 0xf49: 0x000c, 0xf4a: 0x000c, 0xf4b: 0x000c, 0xf4c: 0x000c, 0xf4d: 0x000c, 0xf4e: 0x000c, 0xf4f: 0x000c, 0xf50: 0x000c, 0xf51: 0x000c, 0xf52: 0x000c, 0xf53: 0x000c, 0xf5b: 0x0004, 0xf5d: 0x000c, 0xf70: 0x000a, 0xf71: 0x000a, 0xf72: 0x000a, 0xf73: 0x000a, 0xf74: 0x000a, 0xf75: 0x000a, 0xf76: 0x000a, 0xf77: 0x000a, 0xf78: 0x000a, 0xf79: 0x000a, // Block 0x3e, offset 0xf80 0xf80: 0x000a, 0xf81: 0x000a, 0xf82: 0x000a, 0xf83: 0x000a, 0xf84: 0x000a, 0xf85: 0x000a, 0xf86: 0x000a, 0xf87: 0x000a, 0xf88: 0x000a, 0xf89: 0x000a, 0xf8a: 0x000a, 0xf8b: 0x000c, 0xf8c: 0x000c, 0xf8d: 0x000c, 0xf8e: 0x000b, // Block 0x3f, offset 0xfc0 0xfc5: 0x000c, 0xfc6: 0x000c, 0xfe9: 0x000c, // Block 0x40, offset 0x1000 0x1020: 0x000c, 0x1021: 0x000c, 0x1022: 0x000c, 0x1027: 0x000c, 0x1028: 0x000c, 0x1032: 0x000c, 0x1039: 0x000c, 0x103a: 0x000c, 0x103b: 0x000c, // Block 0x41, offset 0x1040 0x1040: 0x000a, 0x1044: 0x000a, 0x1045: 0x000a, // Block 0x42, offset 0x1080 0x109e: 0x000a, 0x109f: 0x000a, 0x10a0: 0x000a, 0x10a1: 0x000a, 0x10a2: 0x000a, 0x10a3: 0x000a, 0x10a4: 0x000a, 0x10a5: 0x000a, 0x10a6: 0x000a, 0x10a7: 0x000a, 0x10a8: 0x000a, 0x10a9: 0x000a, 0x10aa: 0x000a, 0x10ab: 0x000a, 0x10ac: 0x000a, 0x10ad: 0x000a, 0x10ae: 0x000a, 0x10af: 0x000a, 0x10b0: 0x000a, 0x10b1: 0x000a, 0x10b2: 0x000a, 0x10b3: 0x000a, 0x10b4: 0x000a, 0x10b5: 0x000a, 0x10b6: 0x000a, 0x10b7: 0x000a, 0x10b8: 0x000a, 0x10b9: 0x000a, 0x10ba: 0x000a, 0x10bb: 0x000a, 0x10bc: 0x000a, 0x10bd: 0x000a, 0x10be: 0x000a, 0x10bf: 0x000a, // Block 0x43, offset 0x10c0 0x10d7: 0x000c, 0x10d8: 0x000c, 0x10db: 0x000c, // Block 0x44, offset 0x1100 0x1116: 0x000c, 0x1118: 0x000c, 0x1119: 0x000c, 0x111a: 0x000c, 0x111b: 0x000c, 0x111c: 0x000c, 0x111d: 0x000c, 0x111e: 0x000c, 0x1120: 0x000c, 0x1122: 0x000c, 0x1125: 0x000c, 0x1126: 0x000c, 0x1127: 0x000c, 0x1128: 0x000c, 0x1129: 0x000c, 0x112a: 0x000c, 0x112b: 0x000c, 0x112c: 0x000c, 0x1133: 0x000c, 0x1134: 0x000c, 0x1135: 0x000c, 0x1136: 0x000c, 0x1137: 0x000c, 0x1138: 0x000c, 0x1139: 0x000c, 0x113a: 0x000c, 0x113b: 0x000c, 0x113c: 0x000c, 0x113f: 0x000c, // Block 0x45, offset 0x1140 0x1170: 0x000c, 0x1171: 0x000c, 0x1172: 0x000c, 0x1173: 0x000c, 0x1174: 0x000c, 0x1175: 0x000c, 0x1176: 0x000c, 0x1177: 0x000c, 0x1178: 0x000c, 0x1179: 0x000c, 0x117a: 0x000c, 0x117b: 0x000c, 0x117c: 0x000c, 0x117d: 0x000c, 0x117e: 0x000c, // Block 0x46, offset 0x1180 0x1180: 0x000c, 0x1181: 0x000c, 0x1182: 0x000c, 0x1183: 0x000c, 0x11b4: 0x000c, 0x11b6: 0x000c, 0x11b7: 0x000c, 0x11b8: 0x000c, 0x11b9: 0x000c, 0x11ba: 0x000c, 0x11bc: 0x000c, // Block 0x47, offset 0x11c0 0x11c2: 0x000c, 0x11eb: 0x000c, 0x11ec: 0x000c, 0x11ed: 0x000c, 0x11ee: 0x000c, 0x11ef: 0x000c, 0x11f0: 0x000c, 0x11f1: 0x000c, 0x11f2: 0x000c, 0x11f3: 0x000c, // Block 0x48, offset 0x1200 0x1200: 0x000c, 0x1201: 0x000c, 0x1222: 0x000c, 0x1223: 0x000c, 0x1224: 0x000c, 0x1225: 0x000c, 0x1228: 0x000c, 0x1229: 0x000c, 0x122b: 0x000c, 0x122c: 0x000c, 0x122d: 0x000c, // Block 0x49, offset 0x1240 0x1266: 0x000c, 0x1268: 0x000c, 0x1269: 0x000c, 0x126d: 0x000c, 0x126f: 0x000c, 0x1270: 0x000c, 0x1271: 0x000c, // Block 0x4a, offset 0x1280 0x12ac: 0x000c, 0x12ad: 0x000c, 0x12ae: 0x000c, 0x12af: 0x000c, 0x12b0: 0x000c, 0x12b1: 0x000c, 0x12b2: 0x000c, 0x12b3: 0x000c, 0x12b6: 0x000c, 0x12b7: 0x000c, // Block 0x4b, offset 0x12c0 0x12d0: 0x000c, 0x12d1: 0x000c, 0x12d2: 0x000c, 0x12d4: 0x000c, 0x12d5: 0x000c, 0x12d6: 0x000c, 0x12d7: 0x000c, 0x12d8: 0x000c, 0x12d9: 0x000c, 0x12da: 0x000c, 0x12db: 0x000c, 0x12dc: 0x000c, 0x12dd: 0x000c, 0x12de: 0x000c, 0x12df: 0x000c, 0x12e0: 0x000c, 0x12e2: 0x000c, 0x12e3: 0x000c, 0x12e4: 0x000c, 0x12e5: 0x000c, 0x12e6: 0x000c, 0x12e7: 0x000c, 0x12e8: 0x000c, 0x12ed: 0x000c, 0x12f4: 0x000c, 0x12f8: 0x000c, 0x12f9: 0x000c, // Block 0x4c, offset 0x1300 0x1300: 0x000c, 0x1301: 0x000c, 0x1302: 0x000c, 0x1303: 0x000c, 0x1304: 0x000c, 0x1305: 0x000c, 0x1306: 0x000c, 0x1307: 0x000c, 0x1308: 0x000c, 0x1309: 0x000c, 0x130a: 0x000c, 0x130b: 0x000c, 0x130c: 0x000c, 0x130d: 0x000c, 0x130e: 0x000c, 0x130f: 0x000c, 0x1310: 0x000c, 0x1311: 0x000c, 0x1312: 0x000c, 0x1313: 0x000c, 0x1314: 0x000c, 0x1315: 0x000c, 0x1316: 0x000c, 0x1317: 0x000c, 0x1318: 0x000c, 0x1319: 0x000c, 0x131a: 0x000c, 0x131b: 0x000c, 0x131c: 0x000c, 0x131d: 0x000c, 0x131e: 0x000c, 0x131f: 0x000c, 0x1320: 0x000c, 0x1321: 0x000c, 0x1322: 0x000c, 0x1323: 0x000c, 0x1324: 0x000c, 0x1325: 0x000c, 0x1326: 0x000c, 0x1327: 0x000c, 0x1328: 0x000c, 0x1329: 0x000c, 0x132a: 0x000c, 0x132b: 0x000c, 0x132c: 0x000c, 0x132d: 0x000c, 0x132e: 0x000c, 0x132f: 0x000c, 0x1330: 0x000c, 0x1331: 0x000c, 0x1332: 0x000c, 0x1333: 0x000c, 0x1334: 0x000c, 0x1335: 0x000c, 0x1336: 0x000c, 0x1337: 0x000c, 0x1338: 0x000c, 0x1339: 0x000c, 0x133b: 0x000c, 0x133c: 0x000c, 0x133d: 0x000c, 0x133e: 0x000c, 0x133f: 0x000c, // Block 0x4d, offset 0x1340 0x137d: 0x000a, 0x137f: 0x000a, // Block 0x4e, offset 0x1380 0x1380: 0x000a, 0x1381: 0x000a, 0x138d: 0x000a, 0x138e: 0x000a, 0x138f: 0x000a, 0x139d: 0x000a, 0x139e: 0x000a, 0x139f: 0x000a, 0x13ad: 0x000a, 0x13ae: 0x000a, 0x13af: 0x000a, 0x13bd: 0x000a, 0x13be: 0x000a, // Block 0x4f, offset 0x13c0 0x13c0: 0x0009, 0x13c1: 0x0009, 0x13c2: 0x0009, 0x13c3: 0x0009, 0x13c4: 0x0009, 0x13c5: 0x0009, 0x13c6: 0x0009, 0x13c7: 0x0009, 0x13c8: 0x0009, 0x13c9: 0x0009, 0x13ca: 0x0009, 0x13cb: 0x000b, 0x13cc: 0x000b, 0x13cd: 0x000b, 0x13cf: 0x0001, 0x13d0: 0x000a, 0x13d1: 0x000a, 0x13d2: 0x000a, 0x13d3: 0x000a, 0x13d4: 0x000a, 0x13d5: 0x000a, 0x13d6: 0x000a, 0x13d7: 0x000a, 0x13d8: 0x000a, 0x13d9: 0x000a, 0x13da: 0x000a, 0x13db: 0x000a, 0x13dc: 0x000a, 0x13dd: 0x000a, 0x13de: 0x000a, 0x13df: 0x000a, 0x13e0: 0x000a, 0x13e1: 0x000a, 0x13e2: 0x000a, 0x13e3: 0x000a, 0x13e4: 0x000a, 0x13e5: 0x000a, 0x13e6: 0x000a, 0x13e7: 0x000a, 0x13e8: 0x0009, 0x13e9: 0x0007, 0x13ea: 0x000e, 0x13eb: 0x000e, 0x13ec: 0x000e, 0x13ed: 0x000e, 0x13ee: 0x000e, 0x13ef: 0x0006, 0x13f0: 0x0004, 0x13f1: 0x0004, 0x13f2: 0x0004, 0x13f3: 0x0004, 0x13f4: 0x0004, 0x13f5: 0x000a, 0x13f6: 0x000a, 0x13f7: 0x000a, 0x13f8: 0x000a, 0x13f9: 0x000a, 0x13fa: 0x000a, 0x13fb: 0x000a, 0x13fc: 0x000a, 0x13fd: 0x000a, 0x13fe: 0x000a, 0x13ff: 0x000a, // Block 0x50, offset 0x1400 0x1400: 0x000a, 0x1401: 0x000a, 0x1402: 0x000a, 0x1403: 0x000a, 0x1404: 0x0006, 0x1405: 0x009a, 0x1406: 0x008a, 0x1407: 0x000a, 0x1408: 0x000a, 0x1409: 0x000a, 0x140a: 0x000a, 0x140b: 0x000a, 0x140c: 0x000a, 0x140d: 0x000a, 0x140e: 0x000a, 0x140f: 0x000a, 0x1410: 0x000a, 0x1411: 0x000a, 0x1412: 0x000a, 0x1413: 0x000a, 0x1414: 0x000a, 0x1415: 0x000a, 0x1416: 0x000a, 0x1417: 0x000a, 0x1418: 0x000a, 0x1419: 0x000a, 0x141a: 0x000a, 0x141b: 0x000a, 0x141c: 0x000a, 0x141d: 0x000a, 0x141e: 0x000a, 0x141f: 0x0009, 0x1420: 0x000b, 0x1421: 0x000b, 0x1422: 0x000b, 0x1423: 0x000b, 0x1424: 0x000b, 0x1425: 0x000b, 0x1426: 0x000e, 0x1427: 0x000e, 0x1428: 0x000e, 0x1429: 0x000e, 0x142a: 0x000b, 0x142b: 0x000b, 0x142c: 0x000b, 0x142d: 0x000b, 0x142e: 0x000b, 0x142f: 0x000b, 0x1430: 0x0002, 0x1434: 0x0002, 0x1435: 0x0002, 0x1436: 0x0002, 0x1437: 0x0002, 0x1438: 0x0002, 0x1439: 0x0002, 0x143a: 0x0003, 0x143b: 0x0003, 0x143c: 0x000a, 0x143d: 0x009a, 0x143e: 0x008a, // Block 0x51, offset 0x1440 0x1440: 0x0002, 0x1441: 0x0002, 0x1442: 0x0002, 0x1443: 0x0002, 0x1444: 0x0002, 0x1445: 0x0002, 0x1446: 0x0002, 0x1447: 0x0002, 0x1448: 0x0002, 0x1449: 0x0002, 0x144a: 0x0003, 0x144b: 0x0003, 0x144c: 0x000a, 0x144d: 0x009a, 0x144e: 0x008a, 0x1460: 0x0004, 0x1461: 0x0004, 0x1462: 0x0004, 0x1463: 0x0004, 0x1464: 0x0004, 0x1465: 0x0004, 0x1466: 0x0004, 0x1467: 0x0004, 0x1468: 0x0004, 0x1469: 0x0004, 0x146a: 0x0004, 0x146b: 0x0004, 0x146c: 0x0004, 0x146d: 0x0004, 0x146e: 0x0004, 0x146f: 0x0004, 0x1470: 0x0004, 0x1471: 0x0004, 0x1472: 0x0004, 0x1473: 0x0004, 0x1474: 0x0004, 0x1475: 0x0004, 0x1476: 0x0004, 0x1477: 0x0004, 0x1478: 0x0004, 0x1479: 0x0004, 0x147a: 0x0004, 0x147b: 0x0004, 0x147c: 0x0004, 0x147d: 0x0004, 0x147e: 0x0004, 0x147f: 0x0004, // Block 0x52, offset 0x1480 0x1480: 0x0004, 0x1481: 0x0004, 0x1482: 0x0004, 0x1483: 0x0004, 0x1484: 0x0004, 0x1485: 0x0004, 0x1486: 0x0004, 0x1487: 0x0004, 0x1488: 0x0004, 0x1489: 0x0004, 0x148a: 0x0004, 0x148b: 0x0004, 0x148c: 0x0004, 0x148d: 0x0004, 0x148e: 0x0004, 0x148f: 0x0004, 0x1490: 0x000c, 0x1491: 0x000c, 0x1492: 0x000c, 0x1493: 0x000c, 0x1494: 0x000c, 0x1495: 0x000c, 0x1496: 0x000c, 0x1497: 0x000c, 0x1498: 0x000c, 0x1499: 0x000c, 0x149a: 0x000c, 0x149b: 0x000c, 0x149c: 0x000c, 0x149d: 0x000c, 0x149e: 0x000c, 0x149f: 0x000c, 0x14a0: 0x000c, 0x14a1: 0x000c, 0x14a2: 0x000c, 0x14a3: 0x000c, 0x14a4: 0x000c, 0x14a5: 0x000c, 0x14a6: 0x000c, 0x14a7: 0x000c, 0x14a8: 0x000c, 0x14a9: 0x000c, 0x14aa: 0x000c, 0x14ab: 0x000c, 0x14ac: 0x000c, 0x14ad: 0x000c, 0x14ae: 0x000c, 0x14af: 0x000c, 0x14b0: 0x000c, // Block 0x53, offset 0x14c0 0x14c0: 0x000a, 0x14c1: 0x000a, 0x14c3: 0x000a, 0x14c4: 0x000a, 0x14c5: 0x000a, 0x14c6: 0x000a, 0x14c8: 0x000a, 0x14c9: 0x000a, 0x14d4: 0x000a, 0x14d6: 0x000a, 0x14d7: 0x000a, 0x14d8: 0x000a, 0x14de: 0x000a, 0x14df: 0x000a, 0x14e0: 0x000a, 0x14e1: 0x000a, 0x14e2: 0x000a, 0x14e3: 0x000a, 0x14e5: 0x000a, 0x14e7: 0x000a, 0x14e9: 0x000a, 0x14ee: 0x0004, 0x14fa: 0x000a, 0x14fb: 0x000a, // Block 0x54, offset 0x1500 0x1500: 0x000a, 0x1501: 0x000a, 0x1502: 0x000a, 0x1503: 0x000a, 0x1504: 0x000a, 0x150a: 0x000a, 0x150b: 0x000a, 0x150c: 0x000a, 0x150d: 0x000a, 0x1510: 0x000a, 0x1511: 0x000a, 0x1512: 0x000a, 0x1513: 0x000a, 0x1514: 0x000a, 0x1515: 0x000a, 0x1516: 0x000a, 0x1517: 0x000a, 0x1518: 0x000a, 0x1519: 0x000a, 0x151a: 0x000a, 0x151b: 0x000a, 0x151c: 0x000a, 0x151d: 0x000a, 0x151e: 0x000a, 0x151f: 0x000a, // Block 0x55, offset 0x1540 0x1549: 0x000a, 0x154a: 0x000a, 0x154b: 0x000a, 0x1550: 0x000a, 0x1551: 0x000a, 0x1552: 0x000a, 0x1553: 0x000a, 0x1554: 0x000a, 0x1555: 0x000a, 0x1556: 0x000a, 0x1557: 0x000a, 0x1558: 0x000a, 0x1559: 0x000a, 0x155a: 0x000a, 0x155b: 0x000a, 0x155c: 0x000a, 0x155d: 0x000a, 0x155e: 0x000a, 0x155f: 0x000a, 0x1560: 0x000a, 0x1561: 0x000a, 0x1562: 0x000a, 0x1563: 0x000a, 0x1564: 0x000a, 0x1565: 0x000a, 0x1566: 0x000a, 0x1567: 0x000a, 0x1568: 0x000a, 0x1569: 0x000a, 0x156a: 0x000a, 0x156b: 0x000a, 0x156c: 0x000a, 0x156d: 0x000a, 0x156e: 0x000a, 0x156f: 0x000a, 0x1570: 0x000a, 0x1571: 0x000a, 0x1572: 0x000a, 0x1573: 0x000a, 0x1574: 0x000a, 0x1575: 0x000a, 0x1576: 0x000a, 0x1577: 0x000a, 0x1578: 0x000a, 0x1579: 0x000a, 0x157a: 0x000a, 0x157b: 0x000a, 0x157c: 0x000a, 0x157d: 0x000a, 0x157e: 0x000a, 0x157f: 0x000a, // Block 0x56, offset 0x1580 0x1580: 0x000a, 0x1581: 0x000a, 0x1582: 0x000a, 0x1583: 0x000a, 0x1584: 0x000a, 0x1585: 0x000a, 0x1586: 0x000a, 0x1587: 0x000a, 0x1588: 0x000a, 0x1589: 0x000a, 0x158a: 0x000a, 0x158b: 0x000a, 0x158c: 0x000a, 0x158d: 0x000a, 0x158e: 0x000a, 0x158f: 0x000a, 0x1590: 0x000a, 0x1591: 0x000a, 0x1592: 0x000a, 0x1593: 0x000a, 0x1594: 0x000a, 0x1595: 0x000a, 0x1596: 0x000a, 0x1597: 0x000a, 0x1598: 0x000a, 0x1599: 0x000a, 0x159a: 0x000a, 0x159b: 0x000a, 0x159c: 0x000a, 0x159d: 0x000a, 0x159e: 0x000a, 0x159f: 0x000a, 0x15a0: 0x000a, 0x15a1: 0x000a, 0x15a2: 0x000a, 0x15a3: 0x000a, 0x15a4: 0x000a, 0x15a5: 0x000a, 0x15a6: 0x000a, 0x15a7: 0x000a, 0x15a8: 0x000a, 0x15a9: 0x000a, 0x15aa: 0x000a, 0x15ab: 0x000a, 0x15ac: 0x000a, 0x15ad: 0x000a, 0x15ae: 0x000a, 0x15af: 0x000a, 0x15b0: 0x000a, 0x15b1: 0x000a, 0x15b2: 0x000a, 0x15b3: 0x000a, 0x15b4: 0x000a, 0x15b5: 0x000a, 0x15b6: 0x000a, 0x15b7: 0x000a, 0x15b8: 0x000a, 0x15b9: 0x000a, 0x15ba: 0x000a, 0x15bb: 0x000a, 0x15bc: 0x000a, 0x15bd: 0x000a, 0x15be: 0x000a, 0x15bf: 0x000a, // Block 0x57, offset 0x15c0 0x15c0: 0x000a, 0x15c1: 0x000a, 0x15c2: 0x000a, 0x15c3: 0x000a, 0x15c4: 0x000a, 0x15c5: 0x000a, 0x15c6: 0x000a, 0x15c7: 0x000a, 0x15c8: 0x000a, 0x15c9: 0x000a, 0x15ca: 0x000a, 0x15cb: 0x000a, 0x15cc: 0x000a, 0x15cd: 0x000a, 0x15ce: 0x000a, 0x15cf: 0x000a, 0x15d0: 0x000a, 0x15d1: 0x000a, 0x15d2: 0x0003, 0x15d3: 0x0004, 0x15d4: 0x000a, 0x15d5: 0x000a, 0x15d6: 0x000a, 0x15d7: 0x000a, 0x15d8: 0x000a, 0x15d9: 0x000a, 0x15da: 0x000a, 0x15db: 0x000a, 0x15dc: 0x000a, 0x15dd: 0x000a, 0x15de: 0x000a, 0x15df: 0x000a, 0x15e0: 0x000a, 0x15e1: 0x000a, 0x15e2: 0x000a, 0x15e3: 0x000a, 0x15e4: 0x000a, 0x15e5: 0x000a, 0x15e6: 0x000a, 0x15e7: 0x000a, 0x15e8: 0x000a, 0x15e9: 0x000a, 0x15ea: 0x000a, 0x15eb: 0x000a, 0x15ec: 0x000a, 0x15ed: 0x000a, 0x15ee: 0x000a, 0x15ef: 0x000a, 0x15f0: 0x000a, 0x15f1: 0x000a, 0x15f2: 0x000a, 0x15f3: 0x000a, 0x15f4: 0x000a, 0x15f5: 0x000a, 0x15f6: 0x000a, 0x15f7: 0x000a, 0x15f8: 0x000a, 0x15f9: 0x000a, 0x15fa: 0x000a, 0x15fb: 0x000a, 0x15fc: 0x000a, 0x15fd: 0x000a, 0x15fe: 0x000a, 0x15ff: 0x000a, // Block 0x58, offset 0x1600 0x1600: 0x000a, 0x1601: 0x000a, 0x1602: 0x000a, 0x1603: 0x000a, 0x1604: 0x000a, 0x1605: 0x000a, 0x1606: 0x000a, 0x1607: 0x000a, 0x1608: 0x003a, 0x1609: 0x002a, 0x160a: 0x003a, 0x160b: 0x002a, 0x160c: 0x000a, 0x160d: 0x000a, 0x160e: 0x000a, 0x160f: 0x000a, 0x1610: 0x000a, 0x1611: 0x000a, 0x1612: 0x000a, 0x1613: 0x000a, 0x1614: 0x000a, 0x1615: 0x000a, 0x1616: 0x000a, 0x1617: 0x000a, 0x1618: 0x000a, 0x1619: 0x000a, 0x161a: 0x000a, 0x161b: 0x000a, 0x161c: 0x000a, 0x161d: 0x000a, 0x161e: 0x000a, 0x161f: 0x000a, 0x1620: 0x000a, 0x1621: 0x000a, 0x1622: 0x000a, 0x1623: 0x000a, 0x1624: 0x000a, 0x1625: 0x000a, 0x1626: 0x000a, 0x1627: 0x000a, 0x1628: 0x000a, 0x1629: 0x009a, 0x162a: 0x008a, 0x162b: 0x000a, 0x162c: 0x000a, 0x162d: 0x000a, 0x162e: 0x000a, 0x162f: 0x000a, 0x1630: 0x000a, 0x1631: 0x000a, 0x1632: 0x000a, 0x1633: 0x000a, 0x1634: 0x000a, 0x1635: 0x000a, // Block 0x59, offset 0x1640 0x167b: 0x000a, 0x167c: 0x000a, 0x167d: 0x000a, 0x167e: 0x000a, 0x167f: 0x000a, // Block 0x5a, offset 0x1680 0x1680: 0x000a, 0x1681: 0x000a, 0x1682: 0x000a, 0x1683: 0x000a, 0x1684: 0x000a, 0x1685: 0x000a, 0x1686: 0x000a, 0x1687: 0x000a, 0x1688: 0x000a, 0x1689: 0x000a, 0x168a: 0x000a, 0x168b: 0x000a, 0x168c: 0x000a, 0x168d: 0x000a, 0x168e: 0x000a, 0x168f: 0x000a, 0x1690: 0x000a, 0x1691: 0x000a, 0x1692: 0x000a, 0x1693: 0x000a, 0x1694: 0x000a, 0x1696: 0x000a, 0x1697: 0x000a, 0x1698: 0x000a, 0x1699: 0x000a, 0x169a: 0x000a, 0x169b: 0x000a, 0x169c: 0x000a, 0x169d: 0x000a, 0x169e: 0x000a, 0x169f: 0x000a, 0x16a0: 0x000a, 0x16a1: 0x000a, 0x16a2: 0x000a, 0x16a3: 0x000a, 0x16a4: 0x000a, 0x16a5: 0x000a, 0x16a6: 0x000a, 0x16a7: 0x000a, 0x16a8: 0x000a, 0x16a9: 0x000a, 0x16aa: 0x000a, 0x16ab: 0x000a, 0x16ac: 0x000a, 0x16ad: 0x000a, 0x16ae: 0x000a, 0x16af: 0x000a, 0x16b0: 0x000a, 0x16b1: 0x000a, 0x16b2: 0x000a, 0x16b3: 0x000a, 0x16b4: 0x000a, 0x16b5: 0x000a, 0x16b6: 0x000a, 0x16b7: 0x000a, 0x16b8: 0x000a, 0x16b9: 0x000a, 0x16ba: 0x000a, 0x16bb: 0x000a, 0x16bc: 0x000a, 0x16bd: 0x000a, 0x16be: 0x000a, 0x16bf: 0x000a, // Block 0x5b, offset 0x16c0 0x16c0: 0x000a, 0x16c1: 0x000a, 0x16c2: 0x000a, 0x16c3: 0x000a, 0x16c4: 0x000a, 0x16c5: 0x000a, 0x16c6: 0x000a, 0x16c7: 0x000a, 0x16c8: 0x000a, 0x16c9: 0x000a, 0x16ca: 0x000a, 0x16cb: 0x000a, 0x16cc: 0x000a, 0x16cd: 0x000a, 0x16ce: 0x000a, 0x16cf: 0x000a, 0x16d0: 0x000a, 0x16d1: 0x000a, 0x16d2: 0x000a, 0x16d3: 0x000a, 0x16d4: 0x000a, 0x16d5: 0x000a, 0x16d6: 0x000a, 0x16d7: 0x000a, 0x16d8: 0x000a, 0x16d9: 0x000a, 0x16da: 0x000a, 0x16db: 0x000a, 0x16dc: 0x000a, 0x16dd: 0x000a, 0x16de: 0x000a, 0x16df: 0x000a, 0x16e0: 0x000a, 0x16e1: 0x000a, 0x16e2: 0x000a, 0x16e3: 0x000a, 0x16e4: 0x000a, 0x16e5: 0x000a, 0x16e6: 0x000a, // Block 0x5c, offset 0x1700 0x1700: 0x000a, 0x1701: 0x000a, 0x1702: 0x000a, 0x1703: 0x000a, 0x1704: 0x000a, 0x1705: 0x000a, 0x1706: 0x000a, 0x1707: 0x000a, 0x1708: 0x000a, 0x1709: 0x000a, 0x170a: 0x000a, 0x1720: 0x000a, 0x1721: 0x000a, 0x1722: 0x000a, 0x1723: 0x000a, 0x1724: 0x000a, 0x1725: 0x000a, 0x1726: 0x000a, 0x1727: 0x000a, 0x1728: 0x000a, 0x1729: 0x000a, 0x172a: 0x000a, 0x172b: 0x000a, 0x172c: 0x000a, 0x172d: 0x000a, 0x172e: 0x000a, 0x172f: 0x000a, 0x1730: 0x000a, 0x1731: 0x000a, 0x1732: 0x000a, 0x1733: 0x000a, 0x1734: 0x000a, 0x1735: 0x000a, 0x1736: 0x000a, 0x1737: 0x000a, 0x1738: 0x000a, 0x1739: 0x000a, 0x173a: 0x000a, 0x173b: 0x000a, 0x173c: 0x000a, 0x173d: 0x000a, 0x173e: 0x000a, 0x173f: 0x000a, // Block 0x5d, offset 0x1740 0x1740: 0x000a, 0x1741: 0x000a, 0x1742: 0x000a, 0x1743: 0x000a, 0x1744: 0x000a, 0x1745: 0x000a, 0x1746: 0x000a, 0x1747: 0x000a, 0x1748: 0x0002, 0x1749: 0x0002, 0x174a: 0x0002, 0x174b: 0x0002, 0x174c: 0x0002, 0x174d: 0x0002, 0x174e: 0x0002, 0x174f: 0x0002, 0x1750: 0x0002, 0x1751: 0x0002, 0x1752: 0x0002, 0x1753: 0x0002, 0x1754: 0x0002, 0x1755: 0x0002, 0x1756: 0x0002, 0x1757: 0x0002, 0x1758: 0x0002, 0x1759: 0x0002, 0x175a: 0x0002, 0x175b: 0x0002, // Block 0x5e, offset 0x1780 0x17aa: 0x000a, 0x17ab: 0x000a, 0x17ac: 0x000a, 0x17ad: 0x000a, 0x17ae: 0x000a, 0x17af: 0x000a, 0x17b0: 0x000a, 0x17b1: 0x000a, 0x17b2: 0x000a, 0x17b3: 0x000a, 0x17b4: 0x000a, 0x17b5: 0x000a, 0x17b6: 0x000a, 0x17b7: 0x000a, 0x17b8: 0x000a, 0x17b9: 0x000a, 0x17ba: 0x000a, 0x17bb: 0x000a, 0x17bc: 0x000a, 0x17bd: 0x000a, 0x17be: 0x000a, 0x17bf: 0x000a, // Block 0x5f, offset 0x17c0 0x17c0: 0x000a, 0x17c1: 0x000a, 0x17c2: 0x000a, 0x17c3: 0x000a, 0x17c4: 0x000a, 0x17c5: 0x000a, 0x17c6: 0x000a, 0x17c7: 0x000a, 0x17c8: 0x000a, 0x17c9: 0x000a, 0x17ca: 0x000a, 0x17cb: 0x000a, 0x17cc: 0x000a, 0x17cd: 0x000a, 0x17ce: 0x000a, 0x17cf: 0x000a, 0x17d0: 0x000a, 0x17d1: 0x000a, 0x17d2: 0x000a, 0x17d3: 0x000a, 0x17d4: 0x000a, 0x17d5: 0x000a, 0x17d6: 0x000a, 0x17d7: 0x000a, 0x17d8: 0x000a, 0x17d9: 0x000a, 0x17da: 0x000a, 0x17db: 0x000a, 0x17dc: 0x000a, 0x17dd: 0x000a, 0x17de: 0x000a, 0x17df: 0x000a, 0x17e0: 0x000a, 0x17e1: 0x000a, 0x17e2: 0x000a, 0x17e3: 0x000a, 0x17e4: 0x000a, 0x17e5: 0x000a, 0x17e6: 0x000a, 0x17e7: 0x000a, 0x17e8: 0x000a, 0x17e9: 0x000a, 0x17ea: 0x000a, 0x17eb: 0x000a, 0x17ed: 0x000a, 0x17ee: 0x000a, 0x17ef: 0x000a, 0x17f0: 0x000a, 0x17f1: 0x000a, 0x17f2: 0x000a, 0x17f3: 0x000a, 0x17f4: 0x000a, 0x17f5: 0x000a, 0x17f6: 0x000a, 0x17f7: 0x000a, 0x17f8: 0x000a, 0x17f9: 0x000a, 0x17fa: 0x000a, 0x17fb: 0x000a, 0x17fc: 0x000a, 0x17fd: 0x000a, 0x17fe: 0x000a, 0x17ff: 0x000a, // Block 0x60, offset 0x1800 0x1800: 0x000a, 0x1801: 0x000a, 0x1802: 0x000a, 0x1803: 0x000a, 0x1804: 0x000a, 0x1805: 0x000a, 0x1806: 0x000a, 0x1807: 0x000a, 0x1808: 0x000a, 0x1809: 0x000a, 0x180a: 0x000a, 0x180b: 0x000a, 0x180c: 0x000a, 0x180d: 0x000a, 0x180e: 0x000a, 0x180f: 0x000a, 0x1810: 0x000a, 0x1811: 0x000a, 0x1812: 0x000a, 0x1813: 0x000a, 0x1814: 0x000a, 0x1815: 0x000a, 0x1816: 0x000a, 0x1817: 0x000a, 0x1818: 0x000a, 0x1819: 0x000a, 0x181a: 0x000a, 0x181b: 0x000a, 0x181c: 0x000a, 0x181d: 0x000a, 0x181e: 0x000a, 0x181f: 0x000a, 0x1820: 0x000a, 0x1821: 0x000a, 0x1822: 0x000a, 0x1823: 0x000a, 0x1824: 0x000a, 0x1825: 0x000a, 0x1826: 0x000a, 0x1827: 0x000a, 0x1828: 0x003a, 0x1829: 0x002a, 0x182a: 0x003a, 0x182b: 0x002a, 0x182c: 0x003a, 0x182d: 0x002a, 0x182e: 0x003a, 0x182f: 0x002a, 0x1830: 0x003a, 0x1831: 0x002a, 0x1832: 0x003a, 0x1833: 0x002a, 0x1834: 0x003a, 0x1835: 0x002a, 0x1836: 0x000a, 0x1837: 0x000a, 0x1838: 0x000a, 0x1839: 0x000a, 0x183a: 0x000a, 0x183b: 0x000a, 0x183c: 0x000a, 0x183d: 0x000a, 0x183e: 0x000a, 0x183f: 0x000a, // Block 0x61, offset 0x1840 0x1840: 0x000a, 0x1841: 0x000a, 0x1842: 0x000a, 0x1843: 0x000a, 0x1844: 0x000a, 0x1845: 0x009a, 0x1846: 0x008a, 0x1847: 0x000a, 0x1848: 0x000a, 0x1849: 0x000a, 0x184a: 0x000a, 0x184b: 0x000a, 0x184c: 0x000a, 0x184d: 0x000a, 0x184e: 0x000a, 0x184f: 0x000a, 0x1850: 0x000a, 0x1851: 0x000a, 0x1852: 0x000a, 0x1853: 0x000a, 0x1854: 0x000a, 0x1855: 0x000a, 0x1856: 0x000a, 0x1857: 0x000a, 0x1858: 0x000a, 0x1859: 0x000a, 0x185a: 0x000a, 0x185b: 0x000a, 0x185c: 0x000a, 0x185d: 0x000a, 0x185e: 0x000a, 0x185f: 0x000a, 0x1860: 0x000a, 0x1861: 0x000a, 0x1862: 0x000a, 0x1863: 0x000a, 0x1864: 0x000a, 0x1865: 0x000a, 0x1866: 0x003a, 0x1867: 0x002a, 0x1868: 0x003a, 0x1869: 0x002a, 0x186a: 0x003a, 0x186b: 0x002a, 0x186c: 0x003a, 0x186d: 0x002a, 0x186e: 0x003a, 0x186f: 0x002a, 0x1870: 0x000a, 0x1871: 0x000a, 0x1872: 0x000a, 0x1873: 0x000a, 0x1874: 0x000a, 0x1875: 0x000a, 0x1876: 0x000a, 0x1877: 0x000a, 0x1878: 0x000a, 0x1879: 0x000a, 0x187a: 0x000a, 0x187b: 0x000a, 0x187c: 0x000a, 0x187d: 0x000a, 0x187e: 0x000a, 0x187f: 0x000a, // Block 0x62, offset 0x1880 0x1880: 0x000a, 0x1881: 0x000a, 0x1882: 0x000a, 0x1883: 0x007a, 0x1884: 0x006a, 0x1885: 0x009a, 0x1886: 0x008a, 0x1887: 0x00ba, 0x1888: 0x00aa, 0x1889: 0x009a, 0x188a: 0x008a, 0x188b: 0x007a, 0x188c: 0x006a, 0x188d: 0x00da, 0x188e: 0x002a, 0x188f: 0x003a, 0x1890: 0x00ca, 0x1891: 0x009a, 0x1892: 0x008a, 0x1893: 0x007a, 0x1894: 0x006a, 0x1895: 0x009a, 0x1896: 0x008a, 0x1897: 0x00ba, 0x1898: 0x00aa, 0x1899: 0x000a, 0x189a: 0x000a, 0x189b: 0x000a, 0x189c: 0x000a, 0x189d: 0x000a, 0x189e: 0x000a, 0x189f: 0x000a, 0x18a0: 0x000a, 0x18a1: 0x000a, 0x18a2: 0x000a, 0x18a3: 0x000a, 0x18a4: 0x000a, 0x18a5: 0x000a, 0x18a6: 0x000a, 0x18a7: 0x000a, 0x18a8: 0x000a, 0x18a9: 0x000a, 0x18aa: 0x000a, 0x18ab: 0x000a, 0x18ac: 0x000a, 0x18ad: 0x000a, 0x18ae: 0x000a, 0x18af: 0x000a, 0x18b0: 0x000a, 0x18b1: 0x000a, 0x18b2: 0x000a, 0x18b3: 0x000a, 0x18b4: 0x000a, 0x18b5: 0x000a, 0x18b6: 0x000a, 0x18b7: 0x000a, 0x18b8: 0x000a, 0x18b9: 0x000a, 0x18ba: 0x000a, 0x18bb: 0x000a, 0x18bc: 0x000a, 0x18bd: 0x000a, 0x18be: 0x000a, 0x18bf: 0x000a, // Block 0x63, offset 0x18c0 0x18c0: 0x000a, 0x18c1: 0x000a, 0x18c2: 0x000a, 0x18c3: 0x000a, 0x18c4: 0x000a, 0x18c5: 0x000a, 0x18c6: 0x000a, 0x18c7: 0x000a, 0x18c8: 0x000a, 0x18c9: 0x000a, 0x18ca: 0x000a, 0x18cb: 0x000a, 0x18cc: 0x000a, 0x18cd: 0x000a, 0x18ce: 0x000a, 0x18cf: 0x000a, 0x18d0: 0x000a, 0x18d1: 0x000a, 0x18d2: 0x000a, 0x18d3: 0x000a, 0x18d4: 0x000a, 0x18d5: 0x000a, 0x18d6: 0x000a, 0x18d7: 0x000a, 0x18d8: 0x003a, 0x18d9: 0x002a, 0x18da: 0x003a, 0x18db: 0x002a, 0x18dc: 0x000a, 0x18dd: 0x000a, 0x18de: 0x000a, 0x18df: 0x000a, 0x18e0: 0x000a, 0x18e1: 0x000a, 0x18e2: 0x000a, 0x18e3: 0x000a, 0x18e4: 0x000a, 0x18e5: 0x000a, 0x18e6: 0x000a, 0x18e7: 0x000a, 0x18e8: 0x000a, 0x18e9: 0x000a, 0x18ea: 0x000a, 0x18eb: 0x000a, 0x18ec: 0x000a, 0x18ed: 0x000a, 0x18ee: 0x000a, 0x18ef: 0x000a, 0x18f0: 0x000a, 0x18f1: 0x000a, 0x18f2: 0x000a, 0x18f3: 0x000a, 0x18f4: 0x000a, 0x18f5: 0x000a, 0x18f6: 0x000a, 0x18f7: 0x000a, 0x18f8: 0x000a, 0x18f9: 0x000a, 0x18fa: 0x000a, 0x18fb: 0x000a, 0x18fc: 0x003a, 0x18fd: 0x002a, 0x18fe: 0x000a, 0x18ff: 0x000a, // Block 0x64, offset 0x1900 0x1900: 0x000a, 0x1901: 0x000a, 0x1902: 0x000a, 0x1903: 0x000a, 0x1904: 0x000a, 0x1905: 0x000a, 0x1906: 0x000a, 0x1907: 0x000a, 0x1908: 0x000a, 0x1909: 0x000a, 0x190a: 0x000a, 0x190b: 0x000a, 0x190c: 0x000a, 0x190d: 0x000a, 0x190e: 0x000a, 0x190f: 0x000a, 0x1910: 0x000a, 0x1911: 0x000a, 0x1912: 0x000a, 0x1913: 0x000a, 0x1914: 0x000a, 0x1915: 0x000a, 0x1916: 0x000a, 0x1917: 0x000a, 0x1918: 0x000a, 0x1919: 0x000a, 0x191a: 0x000a, 0x191b: 0x000a, 0x191c: 0x000a, 0x191d: 0x000a, 0x191e: 0x000a, 0x191f: 0x000a, 0x1920: 0x000a, 0x1921: 0x000a, 0x1922: 0x000a, 0x1923: 0x000a, 0x1924: 0x000a, 0x1925: 0x000a, 0x1926: 0x000a, 0x1927: 0x000a, 0x1928: 0x000a, 0x1929: 0x000a, 0x192a: 0x000a, 0x192b: 0x000a, 0x192c: 0x000a, 0x192d: 0x000a, 0x192e: 0x000a, 0x192f: 0x000a, 0x1930: 0x000a, 0x1931: 0x000a, 0x1932: 0x000a, 0x1933: 0x000a, 0x1936: 0x000a, 0x1937: 0x000a, 0x1938: 0x000a, 0x1939: 0x000a, 0x193a: 0x000a, 0x193b: 0x000a, 0x193c: 0x000a, 0x193d: 0x000a, 0x193e: 0x000a, 0x193f: 0x000a, // Block 0x65, offset 0x1940 0x1940: 0x000a, 0x1941: 0x000a, 0x1942: 0x000a, 0x1943: 0x000a, 0x1944: 0x000a, 0x1945: 0x000a, 0x1946: 0x000a, 0x1947: 0x000a, 0x1948: 0x000a, 0x1949: 0x000a, 0x194a: 0x000a, 0x194b: 0x000a, 0x194c: 0x000a, 0x194d: 0x000a, 0x194e: 0x000a, 0x194f: 0x000a, 0x1950: 0x000a, 0x1951: 0x000a, 0x1952: 0x000a, 0x1953: 0x000a, 0x1954: 0x000a, 0x1955: 0x000a, 0x1958: 0x000a, 0x1959: 0x000a, 0x195a: 0x000a, 0x195b: 0x000a, 0x195c: 0x000a, 0x195d: 0x000a, 0x195e: 0x000a, 0x195f: 0x000a, 0x1960: 0x000a, 0x1961: 0x000a, 0x1962: 0x000a, 0x1963: 0x000a, 0x1964: 0x000a, 0x1965: 0x000a, 0x1966: 0x000a, 0x1967: 0x000a, 0x1968: 0x000a, 0x1969: 0x000a, 0x196a: 0x000a, 0x196b: 0x000a, 0x196c: 0x000a, 0x196d: 0x000a, 0x196e: 0x000a, 0x196f: 0x000a, 0x1970: 0x000a, 0x1971: 0x000a, 0x1972: 0x000a, 0x1973: 0x000a, 0x1974: 0x000a, 0x1975: 0x000a, 0x1976: 0x000a, 0x1977: 0x000a, 0x1978: 0x000a, 0x1979: 0x000a, 0x197d: 0x000a, 0x197e: 0x000a, 0x197f: 0x000a, // Block 0x66, offset 0x1980 0x1980: 0x000a, 0x1981: 0x000a, 0x1982: 0x000a, 0x1983: 0x000a, 0x1984: 0x000a, 0x1985: 0x000a, 0x1986: 0x000a, 0x1987: 0x000a, 0x1988: 0x000a, 0x198a: 0x000a, 0x198b: 0x000a, 0x198c: 0x000a, 0x198d: 0x000a, 0x198e: 0x000a, 0x198f: 0x000a, 0x1990: 0x000a, 0x1991: 0x000a, 0x1992: 0x000a, 0x19ac: 0x000a, 0x19ad: 0x000a, 0x19ae: 0x000a, 0x19af: 0x000a, // Block 0x67, offset 0x19c0 0x19e5: 0x000a, 0x19e6: 0x000a, 0x19e7: 0x000a, 0x19e8: 0x000a, 0x19e9: 0x000a, 0x19ea: 0x000a, 0x19ef: 0x000c, 0x19f0: 0x000c, 0x19f1: 0x000c, 0x19f9: 0x000a, 0x19fa: 0x000a, 0x19fb: 0x000a, 0x19fc: 0x000a, 0x19fd: 0x000a, 0x19fe: 0x000a, 0x19ff: 0x000a, // Block 0x68, offset 0x1a00 0x1a3f: 0x000c, // Block 0x69, offset 0x1a40 0x1a60: 0x000c, 0x1a61: 0x000c, 0x1a62: 0x000c, 0x1a63: 0x000c, 0x1a64: 0x000c, 0x1a65: 0x000c, 0x1a66: 0x000c, 0x1a67: 0x000c, 0x1a68: 0x000c, 0x1a69: 0x000c, 0x1a6a: 0x000c, 0x1a6b: 0x000c, 0x1a6c: 0x000c, 0x1a6d: 0x000c, 0x1a6e: 0x000c, 0x1a6f: 0x000c, 0x1a70: 0x000c, 0x1a71: 0x000c, 0x1a72: 0x000c, 0x1a73: 0x000c, 0x1a74: 0x000c, 0x1a75: 0x000c, 0x1a76: 0x000c, 0x1a77: 0x000c, 0x1a78: 0x000c, 0x1a79: 0x000c, 0x1a7a: 0x000c, 0x1a7b: 0x000c, 0x1a7c: 0x000c, 0x1a7d: 0x000c, 0x1a7e: 0x000c, 0x1a7f: 0x000c, // Block 0x6a, offset 0x1a80 0x1a80: 0x000a, 0x1a81: 0x000a, 0x1a82: 0x000a, 0x1a83: 0x000a, 0x1a84: 0x000a, 0x1a85: 0x000a, 0x1a86: 0x000a, 0x1a87: 0x000a, 0x1a88: 0x000a, 0x1a89: 0x000a, 0x1a8a: 0x000a, 0x1a8b: 0x000a, 0x1a8c: 0x000a, 0x1a8d: 0x000a, 0x1a8e: 0x000a, 0x1a8f: 0x000a, 0x1a90: 0x000a, 0x1a91: 0x000a, 0x1a92: 0x000a, 0x1a93: 0x000a, 0x1a94: 0x000a, 0x1a95: 0x000a, 0x1a96: 0x000a, 0x1a97: 0x000a, 0x1a98: 0x000a, 0x1a99: 0x000a, 0x1a9a: 0x000a, 0x1a9b: 0x000a, 0x1a9c: 0x000a, 0x1a9d: 0x000a, 0x1a9e: 0x000a, 0x1a9f: 0x000a, 0x1aa0: 0x000a, 0x1aa1: 0x000a, 0x1aa2: 0x003a, 0x1aa3: 0x002a, 0x1aa4: 0x003a, 0x1aa5: 0x002a, 0x1aa6: 0x003a, 0x1aa7: 0x002a, 0x1aa8: 0x003a, 0x1aa9: 0x002a, 0x1aaa: 0x000a, 0x1aab: 0x000a, 0x1aac: 0x000a, 0x1aad: 0x000a, 0x1aae: 0x000a, 0x1aaf: 0x000a, 0x1ab0: 0x000a, 0x1ab1: 0x000a, 0x1ab2: 0x000a, 0x1ab3: 0x000a, 0x1ab4: 0x000a, 0x1ab5: 0x000a, 0x1ab6: 0x000a, 0x1ab7: 0x000a, 0x1ab8: 0x000a, 0x1ab9: 0x000a, 0x1aba: 0x000a, 0x1abb: 0x000a, 0x1abc: 0x000a, 0x1abd: 0x000a, 0x1abe: 0x000a, 0x1abf: 0x000a, // Block 0x6b, offset 0x1ac0 0x1ac0: 0x000a, 0x1ac1: 0x000a, 0x1ac2: 0x000a, 0x1ac3: 0x000a, 0x1ac4: 0x000a, 0x1ac5: 0x000a, 0x1ac6: 0x000a, 0x1ac7: 0x000a, 0x1ac8: 0x000a, 0x1ac9: 0x000a, // Block 0x6c, offset 0x1b00 0x1b00: 0x000a, 0x1b01: 0x000a, 0x1b02: 0x000a, 0x1b03: 0x000a, 0x1b04: 0x000a, 0x1b05: 0x000a, 0x1b06: 0x000a, 0x1b07: 0x000a, 0x1b08: 0x000a, 0x1b09: 0x000a, 0x1b0a: 0x000a, 0x1b0b: 0x000a, 0x1b0c: 0x000a, 0x1b0d: 0x000a, 0x1b0e: 0x000a, 0x1b0f: 0x000a, 0x1b10: 0x000a, 0x1b11: 0x000a, 0x1b12: 0x000a, 0x1b13: 0x000a, 0x1b14: 0x000a, 0x1b15: 0x000a, 0x1b16: 0x000a, 0x1b17: 0x000a, 0x1b18: 0x000a, 0x1b19: 0x000a, 0x1b1b: 0x000a, 0x1b1c: 0x000a, 0x1b1d: 0x000a, 0x1b1e: 0x000a, 0x1b1f: 0x000a, 0x1b20: 0x000a, 0x1b21: 0x000a, 0x1b22: 0x000a, 0x1b23: 0x000a, 0x1b24: 0x000a, 0x1b25: 0x000a, 0x1b26: 0x000a, 0x1b27: 0x000a, 0x1b28: 0x000a, 0x1b29: 0x000a, 0x1b2a: 0x000a, 0x1b2b: 0x000a, 0x1b2c: 0x000a, 0x1b2d: 0x000a, 0x1b2e: 0x000a, 0x1b2f: 0x000a, 0x1b30: 0x000a, 0x1b31: 0x000a, 0x1b32: 0x000a, 0x1b33: 0x000a, 0x1b34: 0x000a, 0x1b35: 0x000a, 0x1b36: 0x000a, 0x1b37: 0x000a, 0x1b38: 0x000a, 0x1b39: 0x000a, 0x1b3a: 0x000a, 0x1b3b: 0x000a, 0x1b3c: 0x000a, 0x1b3d: 0x000a, 0x1b3e: 0x000a, 0x1b3f: 0x000a, // Block 0x6d, offset 0x1b40 0x1b40: 0x000a, 0x1b41: 0x000a, 0x1b42: 0x000a, 0x1b43: 0x000a, 0x1b44: 0x000a, 0x1b45: 0x000a, 0x1b46: 0x000a, 0x1b47: 0x000a, 0x1b48: 0x000a, 0x1b49: 0x000a, 0x1b4a: 0x000a, 0x1b4b: 0x000a, 0x1b4c: 0x000a, 0x1b4d: 0x000a, 0x1b4e: 0x000a, 0x1b4f: 0x000a, 0x1b50: 0x000a, 0x1b51: 0x000a, 0x1b52: 0x000a, 0x1b53: 0x000a, 0x1b54: 0x000a, 0x1b55: 0x000a, 0x1b56: 0x000a, 0x1b57: 0x000a, 0x1b58: 0x000a, 0x1b59: 0x000a, 0x1b5a: 0x000a, 0x1b5b: 0x000a, 0x1b5c: 0x000a, 0x1b5d: 0x000a, 0x1b5e: 0x000a, 0x1b5f: 0x000a, 0x1b60: 0x000a, 0x1b61: 0x000a, 0x1b62: 0x000a, 0x1b63: 0x000a, 0x1b64: 0x000a, 0x1b65: 0x000a, 0x1b66: 0x000a, 0x1b67: 0x000a, 0x1b68: 0x000a, 0x1b69: 0x000a, 0x1b6a: 0x000a, 0x1b6b: 0x000a, 0x1b6c: 0x000a, 0x1b6d: 0x000a, 0x1b6e: 0x000a, 0x1b6f: 0x000a, 0x1b70: 0x000a, 0x1b71: 0x000a, 0x1b72: 0x000a, 0x1b73: 0x000a, // Block 0x6e, offset 0x1b80 0x1b80: 0x000a, 0x1b81: 0x000a, 0x1b82: 0x000a, 0x1b83: 0x000a, 0x1b84: 0x000a, 0x1b85: 0x000a, 0x1b86: 0x000a, 0x1b87: 0x000a, 0x1b88: 0x000a, 0x1b89: 0x000a, 0x1b8a: 0x000a, 0x1b8b: 0x000a, 0x1b8c: 0x000a, 0x1b8d: 0x000a, 0x1b8e: 0x000a, 0x1b8f: 0x000a, 0x1b90: 0x000a, 0x1b91: 0x000a, 0x1b92: 0x000a, 0x1b93: 0x000a, 0x1b94: 0x000a, 0x1b95: 0x000a, 0x1bb0: 0x000a, 0x1bb1: 0x000a, 0x1bb2: 0x000a, 0x1bb3: 0x000a, 0x1bb4: 0x000a, 0x1bb5: 0x000a, 0x1bb6: 0x000a, 0x1bb7: 0x000a, 0x1bb8: 0x000a, 0x1bb9: 0x000a, 0x1bba: 0x000a, 0x1bbb: 0x000a, // Block 0x6f, offset 0x1bc0 0x1bc0: 0x0009, 0x1bc1: 0x000a, 0x1bc2: 0x000a, 0x1bc3: 0x000a, 0x1bc4: 0x000a, 0x1bc8: 0x003a, 0x1bc9: 0x002a, 0x1bca: 0x003a, 0x1bcb: 0x002a, 0x1bcc: 0x003a, 0x1bcd: 0x002a, 0x1bce: 0x003a, 0x1bcf: 0x002a, 0x1bd0: 0x003a, 0x1bd1: 0x002a, 0x1bd2: 0x000a, 0x1bd3: 0x000a, 0x1bd4: 0x003a, 0x1bd5: 0x002a, 0x1bd6: 0x003a, 0x1bd7: 0x002a, 0x1bd8: 0x003a, 0x1bd9: 0x002a, 0x1bda: 0x003a, 0x1bdb: 0x002a, 0x1bdc: 0x000a, 0x1bdd: 0x000a, 0x1bde: 0x000a, 0x1bdf: 0x000a, 0x1be0: 0x000a, 0x1bea: 0x000c, 0x1beb: 0x000c, 0x1bec: 0x000c, 0x1bed: 0x000c, 0x1bf0: 0x000a, 0x1bf6: 0x000a, 0x1bf7: 0x000a, 0x1bfd: 0x000a, 0x1bfe: 0x000a, 0x1bff: 0x000a, // Block 0x70, offset 0x1c00 0x1c19: 0x000c, 0x1c1a: 0x000c, 0x1c1b: 0x000a, 0x1c1c: 0x000a, 0x1c20: 0x000a, // Block 0x71, offset 0x1c40 0x1c7b: 0x000a, // Block 0x72, offset 0x1c80 0x1c80: 0x000a, 0x1c81: 0x000a, 0x1c82: 0x000a, 0x1c83: 0x000a, 0x1c84: 0x000a, 0x1c85: 0x000a, 0x1c86: 0x000a, 0x1c87: 0x000a, 0x1c88: 0x000a, 0x1c89: 0x000a, 0x1c8a: 0x000a, 0x1c8b: 0x000a, 0x1c8c: 0x000a, 0x1c8d: 0x000a, 0x1c8e: 0x000a, 0x1c8f: 0x000a, 0x1c90: 0x000a, 0x1c91: 0x000a, 0x1c92: 0x000a, 0x1c93: 0x000a, 0x1c94: 0x000a, 0x1c95: 0x000a, 0x1c96: 0x000a, 0x1c97: 0x000a, 0x1c98: 0x000a, 0x1c99: 0x000a, 0x1c9a: 0x000a, 0x1c9b: 0x000a, 0x1c9c: 0x000a, 0x1c9d: 0x000a, 0x1c9e: 0x000a, 0x1c9f: 0x000a, 0x1ca0: 0x000a, 0x1ca1: 0x000a, 0x1ca2: 0x000a, 0x1ca3: 0x000a, // Block 0x73, offset 0x1cc0 0x1cdd: 0x000a, 0x1cde: 0x000a, // Block 0x74, offset 0x1d00 0x1d10: 0x000a, 0x1d11: 0x000a, 0x1d12: 0x000a, 0x1d13: 0x000a, 0x1d14: 0x000a, 0x1d15: 0x000a, 0x1d16: 0x000a, 0x1d17: 0x000a, 0x1d18: 0x000a, 0x1d19: 0x000a, 0x1d1a: 0x000a, 0x1d1b: 0x000a, 0x1d1c: 0x000a, 0x1d1d: 0x000a, 0x1d1e: 0x000a, 0x1d1f: 0x000a, 0x1d3c: 0x000a, 0x1d3d: 0x000a, 0x1d3e: 0x000a, // Block 0x75, offset 0x1d40 0x1d71: 0x000a, 0x1d72: 0x000a, 0x1d73: 0x000a, 0x1d74: 0x000a, 0x1d75: 0x000a, 0x1d76: 0x000a, 0x1d77: 0x000a, 0x1d78: 0x000a, 0x1d79: 0x000a, 0x1d7a: 0x000a, 0x1d7b: 0x000a, 0x1d7c: 0x000a, 0x1d7d: 0x000a, 0x1d7e: 0x000a, 0x1d7f: 0x000a, // Block 0x76, offset 0x1d80 0x1d8c: 0x000a, 0x1d8d: 0x000a, 0x1d8e: 0x000a, 0x1d8f: 0x000a, // Block 0x77, offset 0x1dc0 0x1df7: 0x000a, 0x1df8: 0x000a, 0x1df9: 0x000a, 0x1dfa: 0x000a, // Block 0x78, offset 0x1e00 0x1e1e: 0x000a, 0x1e1f: 0x000a, 0x1e3f: 0x000a, // Block 0x79, offset 0x1e40 0x1e50: 0x000a, 0x1e51: 0x000a, 0x1e52: 0x000a, 0x1e53: 0x000a, 0x1e54: 0x000a, 0x1e55: 0x000a, 0x1e56: 0x000a, 0x1e57: 0x000a, 0x1e58: 0x000a, 0x1e59: 0x000a, 0x1e5a: 0x000a, 0x1e5b: 0x000a, 0x1e5c: 0x000a, 0x1e5d: 0x000a, 0x1e5e: 0x000a, 0x1e5f: 0x000a, 0x1e60: 0x000a, 0x1e61: 0x000a, 0x1e62: 0x000a, 0x1e63: 0x000a, 0x1e64: 0x000a, 0x1e65: 0x000a, 0x1e66: 0x000a, 0x1e67: 0x000a, 0x1e68: 0x000a, 0x1e69: 0x000a, 0x1e6a: 0x000a, 0x1e6b: 0x000a, 0x1e6c: 0x000a, 0x1e6d: 0x000a, 0x1e6e: 0x000a, 0x1e6f: 0x000a, 0x1e70: 0x000a, 0x1e71: 0x000a, 0x1e72: 0x000a, 0x1e73: 0x000a, 0x1e74: 0x000a, 0x1e75: 0x000a, 0x1e76: 0x000a, 0x1e77: 0x000a, 0x1e78: 0x000a, 0x1e79: 0x000a, 0x1e7a: 0x000a, 0x1e7b: 0x000a, 0x1e7c: 0x000a, 0x1e7d: 0x000a, 0x1e7e: 0x000a, 0x1e7f: 0x000a, // Block 0x7a, offset 0x1e80 0x1e80: 0x000a, 0x1e81: 0x000a, 0x1e82: 0x000a, 0x1e83: 0x000a, 0x1e84: 0x000a, 0x1e85: 0x000a, 0x1e86: 0x000a, // Block 0x7b, offset 0x1ec0 0x1ecd: 0x000a, 0x1ece: 0x000a, 0x1ecf: 0x000a, // Block 0x7c, offset 0x1f00 0x1f2f: 0x000c, 0x1f30: 0x000c, 0x1f31: 0x000c, 0x1f32: 0x000c, 0x1f33: 0x000a, 0x1f34: 0x000c, 0x1f35: 0x000c, 0x1f36: 0x000c, 0x1f37: 0x000c, 0x1f38: 0x000c, 0x1f39: 0x000c, 0x1f3a: 0x000c, 0x1f3b: 0x000c, 0x1f3c: 0x000c, 0x1f3d: 0x000c, 0x1f3e: 0x000a, 0x1f3f: 0x000a, // Block 0x7d, offset 0x1f40 0x1f5e: 0x000c, 0x1f5f: 0x000c, // Block 0x7e, offset 0x1f80 0x1fb0: 0x000c, 0x1fb1: 0x000c, // Block 0x7f, offset 0x1fc0 0x1fc0: 0x000a, 0x1fc1: 0x000a, 0x1fc2: 0x000a, 0x1fc3: 0x000a, 0x1fc4: 0x000a, 0x1fc5: 0x000a, 0x1fc6: 0x000a, 0x1fc7: 0x000a, 0x1fc8: 0x000a, 0x1fc9: 0x000a, 0x1fca: 0x000a, 0x1fcb: 0x000a, 0x1fcc: 0x000a, 0x1fcd: 0x000a, 0x1fce: 0x000a, 0x1fcf: 0x000a, 0x1fd0: 0x000a, 0x1fd1: 0x000a, 0x1fd2: 0x000a, 0x1fd3: 0x000a, 0x1fd4: 0x000a, 0x1fd5: 0x000a, 0x1fd6: 0x000a, 0x1fd7: 0x000a, 0x1fd8: 0x000a, 0x1fd9: 0x000a, 0x1fda: 0x000a, 0x1fdb: 0x000a, 0x1fdc: 0x000a, 0x1fdd: 0x000a, 0x1fde: 0x000a, 0x1fdf: 0x000a, 0x1fe0: 0x000a, 0x1fe1: 0x000a, // Block 0x80, offset 0x2000 0x2008: 0x000a, // Block 0x81, offset 0x2040 0x2042: 0x000c, 0x2046: 0x000c, 0x204b: 0x000c, 0x2065: 0x000c, 0x2066: 0x000c, 0x2068: 0x000a, 0x2069: 0x000a, 0x206a: 0x000a, 0x206b: 0x000a, 0x2078: 0x0004, 0x2079: 0x0004, // Block 0x82, offset 0x2080 0x20b4: 0x000a, 0x20b5: 0x000a, 0x20b6: 0x000a, 0x20b7: 0x000a, // Block 0x83, offset 0x20c0 0x20c4: 0x000c, 0x20c5: 0x000c, 0x20e0: 0x000c, 0x20e1: 0x000c, 0x20e2: 0x000c, 0x20e3: 0x000c, 0x20e4: 0x000c, 0x20e5: 0x000c, 0x20e6: 0x000c, 0x20e7: 0x000c, 0x20e8: 0x000c, 0x20e9: 0x000c, 0x20ea: 0x000c, 0x20eb: 0x000c, 0x20ec: 0x000c, 0x20ed: 0x000c, 0x20ee: 0x000c, 0x20ef: 0x000c, 0x20f0: 0x000c, 0x20f1: 0x000c, // Block 0x84, offset 0x2100 0x2126: 0x000c, 0x2127: 0x000c, 0x2128: 0x000c, 0x2129: 0x000c, 0x212a: 0x000c, 0x212b: 0x000c, 0x212c: 0x000c, 0x212d: 0x000c, // Block 0x85, offset 0x2140 0x2147: 0x000c, 0x2148: 0x000c, 0x2149: 0x000c, 0x214a: 0x000c, 0x214b: 0x000c, 0x214c: 0x000c, 0x214d: 0x000c, 0x214e: 0x000c, 0x214f: 0x000c, 0x2150: 0x000c, 0x2151: 0x000c, // Block 0x86, offset 0x2180 0x2180: 0x000c, 0x2181: 0x000c, 0x2182: 0x000c, 0x21b3: 0x000c, 0x21b6: 0x000c, 0x21b7: 0x000c, 0x21b8: 0x000c, 0x21b9: 0x000c, 0x21bc: 0x000c, // Block 0x87, offset 0x21c0 0x21e5: 0x000c, // Block 0x88, offset 0x2200 0x2229: 0x000c, 0x222a: 0x000c, 0x222b: 0x000c, 0x222c: 0x000c, 0x222d: 0x000c, 0x222e: 0x000c, 0x2231: 0x000c, 0x2232: 0x000c, 0x2235: 0x000c, 0x2236: 0x000c, // Block 0x89, offset 0x2240 0x2243: 0x000c, 0x224c: 0x000c, 0x227c: 0x000c, // Block 0x8a, offset 0x2280 0x22b0: 0x000c, 0x22b2: 0x000c, 0x22b3: 0x000c, 0x22b4: 0x000c, 0x22b7: 0x000c, 0x22b8: 0x000c, 0x22be: 0x000c, 0x22bf: 0x000c, // Block 0x8b, offset 0x22c0 0x22c1: 0x000c, 0x22ec: 0x000c, 0x22ed: 0x000c, 0x22f6: 0x000c, // Block 0x8c, offset 0x2300 0x2325: 0x000c, 0x2328: 0x000c, 0x232d: 0x000c, // Block 0x8d, offset 0x2340 0x235d: 0x0001, 0x235e: 0x000c, 0x235f: 0x0001, 0x2360: 0x0001, 0x2361: 0x0001, 0x2362: 0x0001, 0x2363: 0x0001, 0x2364: 0x0001, 0x2365: 0x0001, 0x2366: 0x0001, 0x2367: 0x0001, 0x2368: 0x0001, 0x2369: 0x0003, 0x236a: 0x0001, 0x236b: 0x0001, 0x236c: 0x0001, 0x236d: 0x0001, 0x236e: 0x0001, 0x236f: 0x0001, 0x2370: 0x0001, 0x2371: 0x0001, 0x2372: 0x0001, 0x2373: 0x0001, 0x2374: 0x0001, 0x2375: 0x0001, 0x2376: 0x0001, 0x2377: 0x0001, 0x2378: 0x0001, 0x2379: 0x0001, 0x237a: 0x0001, 0x237b: 0x0001, 0x237c: 0x0001, 0x237d: 0x0001, 0x237e: 0x0001, 0x237f: 0x0001, // Block 0x8e, offset 0x2380 0x2380: 0x0001, 0x2381: 0x0001, 0x2382: 0x0001, 0x2383: 0x0001, 0x2384: 0x0001, 0x2385: 0x0001, 0x2386: 0x0001, 0x2387: 0x0001, 0x2388: 0x0001, 0x2389: 0x0001, 0x238a: 0x0001, 0x238b: 0x0001, 0x238c: 0x0001, 0x238d: 0x0001, 0x238e: 0x0001, 0x238f: 0x0001, 0x2390: 0x000d, 0x2391: 0x000d, 0x2392: 0x000d, 0x2393: 0x000d, 0x2394: 0x000d, 0x2395: 0x000d, 0x2396: 0x000d, 0x2397: 0x000d, 0x2398: 0x000d, 0x2399: 0x000d, 0x239a: 0x000d, 0x239b: 0x000d, 0x239c: 0x000d, 0x239d: 0x000d, 0x239e: 0x000d, 0x239f: 0x000d, 0x23a0: 0x000d, 0x23a1: 0x000d, 0x23a2: 0x000d, 0x23a3: 0x000d, 0x23a4: 0x000d, 0x23a5: 0x000d, 0x23a6: 0x000d, 0x23a7: 0x000d, 0x23a8: 0x000d, 0x23a9: 0x000d, 0x23aa: 0x000d, 0x23ab: 0x000d, 0x23ac: 0x000d, 0x23ad: 0x000d, 0x23ae: 0x000d, 0x23af: 0x000d, 0x23b0: 0x000d, 0x23b1: 0x000d, 0x23b2: 0x000d, 0x23b3: 0x000d, 0x23b4: 0x000d, 0x23b5: 0x000d, 0x23b6: 0x000d, 0x23b7: 0x000d, 0x23b8: 0x000d, 0x23b9: 0x000d, 0x23ba: 0x000d, 0x23bb: 0x000d, 0x23bc: 0x000d, 0x23bd: 0x000d, 0x23be: 0x000d, 0x23bf: 0x000d, // Block 0x8f, offset 0x23c0 0x23c0: 0x000d, 0x23c1: 0x000d, 0x23c2: 0x000d, 0x23c3: 0x000d, 0x23c4: 0x000d, 0x23c5: 0x000d, 0x23c6: 0x000d, 0x23c7: 0x000d, 0x23c8: 0x000d, 0x23c9: 0x000d, 0x23ca: 0x000d, 0x23cb: 0x000d, 0x23cc: 0x000d, 0x23cd: 0x000d, 0x23ce: 0x000d, 0x23cf: 0x000d, 0x23d0: 0x000d, 0x23d1: 0x000d, 0x23d2: 0x000d, 0x23d3: 0x000d, 0x23d4: 0x000d, 0x23d5: 0x000d, 0x23d6: 0x000d, 0x23d7: 0x000d, 0x23d8: 0x000d, 0x23d9: 0x000d, 0x23da: 0x000d, 0x23db: 0x000d, 0x23dc: 0x000d, 0x23dd: 0x000d, 0x23de: 0x000d, 0x23df: 0x000d, 0x23e0: 0x000d, 0x23e1: 0x000d, 0x23e2: 0x000d, 0x23e3: 0x000d, 0x23e4: 0x000d, 0x23e5: 0x000d, 0x23e6: 0x000d, 0x23e7: 0x000d, 0x23e8: 0x000d, 0x23e9: 0x000d, 0x23ea: 0x000d, 0x23eb: 0x000d, 0x23ec: 0x000d, 0x23ed: 0x000d, 0x23ee: 0x000d, 0x23ef: 0x000d, 0x23f0: 0x000d, 0x23f1: 0x000d, 0x23f2: 0x000d, 0x23f3: 0x000d, 0x23f4: 0x000d, 0x23f5: 0x000d, 0x23f6: 0x000d, 0x23f7: 0x000d, 0x23f8: 0x000d, 0x23f9: 0x000d, 0x23fa: 0x000d, 0x23fb: 0x000d, 0x23fc: 0x000d, 0x23fd: 0x000d, 0x23fe: 0x000a, 0x23ff: 0x000a, // Block 0x90, offset 0x2400 0x2400: 0x000d, 0x2401: 0x000d, 0x2402: 0x000d, 0x2403: 0x000d, 0x2404: 0x000d, 0x2405: 0x000d, 0x2406: 0x000d, 0x2407: 0x000d, 0x2408: 0x000d, 0x2409: 0x000d, 0x240a: 0x000d, 0x240b: 0x000d, 0x240c: 0x000d, 0x240d: 0x000d, 0x240e: 0x000d, 0x240f: 0x000d, 0x2410: 0x000b, 0x2411: 0x000b, 0x2412: 0x000b, 0x2413: 0x000b, 0x2414: 0x000b, 0x2415: 0x000b, 0x2416: 0x000b, 0x2417: 0x000b, 0x2418: 0x000b, 0x2419: 0x000b, 0x241a: 0x000b, 0x241b: 0x000b, 0x241c: 0x000b, 0x241d: 0x000b, 0x241e: 0x000b, 0x241f: 0x000b, 0x2420: 0x000b, 0x2421: 0x000b, 0x2422: 0x000b, 0x2423: 0x000b, 0x2424: 0x000b, 0x2425: 0x000b, 0x2426: 0x000b, 0x2427: 0x000b, 0x2428: 0x000b, 0x2429: 0x000b, 0x242a: 0x000b, 0x242b: 0x000b, 0x242c: 0x000b, 0x242d: 0x000b, 0x242e: 0x000b, 0x242f: 0x000b, 0x2430: 0x000d, 0x2431: 0x000d, 0x2432: 0x000d, 0x2433: 0x000d, 0x2434: 0x000d, 0x2435: 0x000d, 0x2436: 0x000d, 0x2437: 0x000d, 0x2438: 0x000d, 0x2439: 0x000d, 0x243a: 0x000d, 0x243b: 0x000d, 0x243c: 0x000d, 0x243d: 0x000a, 0x243e: 0x000d, 0x243f: 0x000d, // Block 0x91, offset 0x2440 0x2440: 0x000c, 0x2441: 0x000c, 0x2442: 0x000c, 0x2443: 0x000c, 0x2444: 0x000c, 0x2445: 0x000c, 0x2446: 0x000c, 0x2447: 0x000c, 0x2448: 0x000c, 0x2449: 0x000c, 0x244a: 0x000c, 0x244b: 0x000c, 0x244c: 0x000c, 0x244d: 0x000c, 0x244e: 0x000c, 0x244f: 0x000c, 0x2450: 0x000a, 0x2451: 0x000a, 0x2452: 0x000a, 0x2453: 0x000a, 0x2454: 0x000a, 0x2455: 0x000a, 0x2456: 0x000a, 0x2457: 0x000a, 0x2458: 0x000a, 0x2459: 0x000a, 0x2460: 0x000c, 0x2461: 0x000c, 0x2462: 0x000c, 0x2463: 0x000c, 0x2464: 0x000c, 0x2465: 0x000c, 0x2466: 0x000c, 0x2467: 0x000c, 0x2468: 0x000c, 0x2469: 0x000c, 0x246a: 0x000c, 0x246b: 0x000c, 0x246c: 0x000c, 0x246d: 0x000c, 0x246e: 0x000c, 0x246f: 0x000c, 0x2470: 0x000a, 0x2471: 0x000a, 0x2472: 0x000a, 0x2473: 0x000a, 0x2474: 0x000a, 0x2475: 0x000a, 0x2476: 0x000a, 0x2477: 0x000a, 0x2478: 0x000a, 0x2479: 0x000a, 0x247a: 0x000a, 0x247b: 0x000a, 0x247c: 0x000a, 0x247d: 0x000a, 0x247e: 0x000a, 0x247f: 0x000a, // Block 0x92, offset 0x2480 0x2480: 0x000a, 0x2481: 0x000a, 0x2482: 0x000a, 0x2483: 0x000a, 0x2484: 0x000a, 0x2485: 0x000a, 0x2486: 0x000a, 0x2487: 0x000a, 0x2488: 0x000a, 0x2489: 0x000a, 0x248a: 0x000a, 0x248b: 0x000a, 0x248c: 0x000a, 0x248d: 0x000a, 0x248e: 0x000a, 0x248f: 0x000a, 0x2490: 0x0006, 0x2491: 0x000a, 0x2492: 0x0006, 0x2494: 0x000a, 0x2495: 0x0006, 0x2496: 0x000a, 0x2497: 0x000a, 0x2498: 0x000a, 0x2499: 0x009a, 0x249a: 0x008a, 0x249b: 0x007a, 0x249c: 0x006a, 0x249d: 0x009a, 0x249e: 0x008a, 0x249f: 0x0004, 0x24a0: 0x000a, 0x24a1: 0x000a, 0x24a2: 0x0003, 0x24a3: 0x0003, 0x24a4: 0x000a, 0x24a5: 0x000a, 0x24a6: 0x000a, 0x24a8: 0x000a, 0x24a9: 0x0004, 0x24aa: 0x0004, 0x24ab: 0x000a, 0x24b0: 0x000d, 0x24b1: 0x000d, 0x24b2: 0x000d, 0x24b3: 0x000d, 0x24b4: 0x000d, 0x24b5: 0x000d, 0x24b6: 0x000d, 0x24b7: 0x000d, 0x24b8: 0x000d, 0x24b9: 0x000d, 0x24ba: 0x000d, 0x24bb: 0x000d, 0x24bc: 0x000d, 0x24bd: 0x000d, 0x24be: 0x000d, 0x24bf: 0x000d, // Block 0x93, offset 0x24c0 0x24c0: 0x000d, 0x24c1: 0x000d, 0x24c2: 0x000d, 0x24c3: 0x000d, 0x24c4: 0x000d, 0x24c5: 0x000d, 0x24c6: 0x000d, 0x24c7: 0x000d, 0x24c8: 0x000d, 0x24c9: 0x000d, 0x24ca: 0x000d, 0x24cb: 0x000d, 0x24cc: 0x000d, 0x24cd: 0x000d, 0x24ce: 0x000d, 0x24cf: 0x000d, 0x24d0: 0x000d, 0x24d1: 0x000d, 0x24d2: 0x000d, 0x24d3: 0x000d, 0x24d4: 0x000d, 0x24d5: 0x000d, 0x24d6: 0x000d, 0x24d7: 0x000d, 0x24d8: 0x000d, 0x24d9: 0x000d, 0x24da: 0x000d, 0x24db: 0x000d, 0x24dc: 0x000d, 0x24dd: 0x000d, 0x24de: 0x000d, 0x24df: 0x000d, 0x24e0: 0x000d, 0x24e1: 0x000d, 0x24e2: 0x000d, 0x24e3: 0x000d, 0x24e4: 0x000d, 0x24e5: 0x000d, 0x24e6: 0x000d, 0x24e7: 0x000d, 0x24e8: 0x000d, 0x24e9: 0x000d, 0x24ea: 0x000d, 0x24eb: 0x000d, 0x24ec: 0x000d, 0x24ed: 0x000d, 0x24ee: 0x000d, 0x24ef: 0x000d, 0x24f0: 0x000d, 0x24f1: 0x000d, 0x24f2: 0x000d, 0x24f3: 0x000d, 0x24f4: 0x000d, 0x24f5: 0x000d, 0x24f6: 0x000d, 0x24f7: 0x000d, 0x24f8: 0x000d, 0x24f9: 0x000d, 0x24fa: 0x000d, 0x24fb: 0x000d, 0x24fc: 0x000d, 0x24fd: 0x000d, 0x24fe: 0x000d, 0x24ff: 0x000b, // Block 0x94, offset 0x2500 0x2501: 0x000a, 0x2502: 0x000a, 0x2503: 0x0004, 0x2504: 0x0004, 0x2505: 0x0004, 0x2506: 0x000a, 0x2507: 0x000a, 0x2508: 0x003a, 0x2509: 0x002a, 0x250a: 0x000a, 0x250b: 0x0003, 0x250c: 0x0006, 0x250d: 0x0003, 0x250e: 0x0006, 0x250f: 0x0006, 0x2510: 0x0002, 0x2511: 0x0002, 0x2512: 0x0002, 0x2513: 0x0002, 0x2514: 0x0002, 0x2515: 0x0002, 0x2516: 0x0002, 0x2517: 0x0002, 0x2518: 0x0002, 0x2519: 0x0002, 0x251a: 0x0006, 0x251b: 0x000a, 0x251c: 0x000a, 0x251d: 0x000a, 0x251e: 0x000a, 0x251f: 0x000a, 0x2520: 0x000a, 0x253b: 0x005a, 0x253c: 0x000a, 0x253d: 0x004a, 0x253e: 0x000a, 0x253f: 0x000a, // Block 0x95, offset 0x2540 0x2540: 0x000a, 0x255b: 0x005a, 0x255c: 0x000a, 0x255d: 0x004a, 0x255e: 0x000a, 0x255f: 0x00fa, 0x2560: 0x00ea, 0x2561: 0x000a, 0x2562: 0x003a, 0x2563: 0x002a, 0x2564: 0x000a, 0x2565: 0x000a, // Block 0x96, offset 0x2580 0x25a0: 0x0004, 0x25a1: 0x0004, 0x25a2: 0x000a, 0x25a3: 0x000a, 0x25a4: 0x000a, 0x25a5: 0x0004, 0x25a6: 0x0004, 0x25a8: 0x000a, 0x25a9: 0x000a, 0x25aa: 0x000a, 0x25ab: 0x000a, 0x25ac: 0x000a, 0x25ad: 0x000a, 0x25ae: 0x000a, 0x25b0: 0x000b, 0x25b1: 0x000b, 0x25b2: 0x000b, 0x25b3: 0x000b, 0x25b4: 0x000b, 0x25b5: 0x000b, 0x25b6: 0x000b, 0x25b7: 0x000b, 0x25b8: 0x000b, 0x25b9: 0x000a, 0x25ba: 0x000a, 0x25bb: 0x000a, 0x25bc: 0x000a, 0x25bd: 0x000a, 0x25be: 0x000b, 0x25bf: 0x000b, // Block 0x97, offset 0x25c0 0x25c1: 0x000a, // Block 0x98, offset 0x2600 0x2600: 0x000a, 0x2601: 0x000a, 0x2602: 0x000a, 0x2603: 0x000a, 0x2604: 0x000a, 0x2605: 0x000a, 0x2606: 0x000a, 0x2607: 0x000a, 0x2608: 0x000a, 0x2609: 0x000a, 0x260a: 0x000a, 0x260b: 0x000a, 0x260c: 0x000a, 0x2610: 0x000a, 0x2611: 0x000a, 0x2612: 0x000a, 0x2613: 0x000a, 0x2614: 0x000a, 0x2615: 0x000a, 0x2616: 0x000a, 0x2617: 0x000a, 0x2618: 0x000a, 0x2619: 0x000a, 0x261a: 0x000a, 0x261b: 0x000a, 0x2620: 0x000a, // Block 0x99, offset 0x2640 0x267d: 0x000c, // Block 0x9a, offset 0x2680 0x26a0: 0x000c, 0x26a1: 0x0002, 0x26a2: 0x0002, 0x26a3: 0x0002, 0x26a4: 0x0002, 0x26a5: 0x0002, 0x26a6: 0x0002, 0x26a7: 0x0002, 0x26a8: 0x0002, 0x26a9: 0x0002, 0x26aa: 0x0002, 0x26ab: 0x0002, 0x26ac: 0x0002, 0x26ad: 0x0002, 0x26ae: 0x0002, 0x26af: 0x0002, 0x26b0: 0x0002, 0x26b1: 0x0002, 0x26b2: 0x0002, 0x26b3: 0x0002, 0x26b4: 0x0002, 0x26b5: 0x0002, 0x26b6: 0x0002, 0x26b7: 0x0002, 0x26b8: 0x0002, 0x26b9: 0x0002, 0x26ba: 0x0002, 0x26bb: 0x0002, // Block 0x9b, offset 0x26c0 0x26f6: 0x000c, 0x26f7: 0x000c, 0x26f8: 0x000c, 0x26f9: 0x000c, 0x26fa: 0x000c, // Block 0x9c, offset 0x2700 0x2700: 0x0001, 0x2701: 0x0001, 0x2702: 0x0001, 0x2703: 0x0001, 0x2704: 0x0001, 0x2705: 0x0001, 0x2706: 0x0001, 0x2707: 0x0001, 0x2708: 0x0001, 0x2709: 0x0001, 0x270a: 0x0001, 0x270b: 0x0001, 0x270c: 0x0001, 0x270d: 0x0001, 0x270e: 0x0001, 0x270f: 0x0001, 0x2710: 0x0001, 0x2711: 0x0001, 0x2712: 0x0001, 0x2713: 0x0001, 0x2714: 0x0001, 0x2715: 0x0001, 0x2716: 0x0001, 0x2717: 0x0001, 0x2718: 0x0001, 0x2719: 0x0001, 0x271a: 0x0001, 0x271b: 0x0001, 0x271c: 0x0001, 0x271d: 0x0001, 0x271e: 0x0001, 0x271f: 0x0001, 0x2720: 0x0001, 0x2721: 0x0001, 0x2722: 0x0001, 0x2723: 0x0001, 0x2724: 0x0001, 0x2725: 0x0001, 0x2726: 0x0001, 0x2727: 0x0001, 0x2728: 0x0001, 0x2729: 0x0001, 0x272a: 0x0001, 0x272b: 0x0001, 0x272c: 0x0001, 0x272d: 0x0001, 0x272e: 0x0001, 0x272f: 0x0001, 0x2730: 0x0001, 0x2731: 0x0001, 0x2732: 0x0001, 0x2733: 0x0001, 0x2734: 0x0001, 0x2735: 0x0001, 0x2736: 0x0001, 0x2737: 0x0001, 0x2738: 0x0001, 0x2739: 0x0001, 0x273a: 0x0001, 0x273b: 0x0001, 0x273c: 0x0001, 0x273d: 0x0001, 0x273e: 0x0001, 0x273f: 0x0001, // Block 0x9d, offset 0x2740 0x2740: 0x0001, 0x2741: 0x0001, 0x2742: 0x0001, 0x2743: 0x0001, 0x2744: 0x0001, 0x2745: 0x0001, 0x2746: 0x0001, 0x2747: 0x0001, 0x2748: 0x0001, 0x2749: 0x0001, 0x274a: 0x0001, 0x274b: 0x0001, 0x274c: 0x0001, 0x274d: 0x0001, 0x274e: 0x0001, 0x274f: 0x0001, 0x2750: 0x0001, 0x2751: 0x0001, 0x2752: 0x0001, 0x2753: 0x0001, 0x2754: 0x0001, 0x2755: 0x0001, 0x2756: 0x0001, 0x2757: 0x0001, 0x2758: 0x0001, 0x2759: 0x0001, 0x275a: 0x0001, 0x275b: 0x0001, 0x275c: 0x0001, 0x275d: 0x0001, 0x275e: 0x0001, 0x275f: 0x000a, 0x2760: 0x0001, 0x2761: 0x0001, 0x2762: 0x0001, 0x2763: 0x0001, 0x2764: 0x0001, 0x2765: 0x0001, 0x2766: 0x0001, 0x2767: 0x0001, 0x2768: 0x0001, 0x2769: 0x0001, 0x276a: 0x0001, 0x276b: 0x0001, 0x276c: 0x0001, 0x276d: 0x0001, 0x276e: 0x0001, 0x276f: 0x0001, 0x2770: 0x0001, 0x2771: 0x0001, 0x2772: 0x0001, 0x2773: 0x0001, 0x2774: 0x0001, 0x2775: 0x0001, 0x2776: 0x0001, 0x2777: 0x0001, 0x2778: 0x0001, 0x2779: 0x0001, 0x277a: 0x0001, 0x277b: 0x0001, 0x277c: 0x0001, 0x277d: 0x0001, 0x277e: 0x0001, 0x277f: 0x0001, // Block 0x9e, offset 0x2780 0x2780: 0x0001, 0x2781: 0x000c, 0x2782: 0x000c, 0x2783: 0x000c, 0x2784: 0x0001, 0x2785: 0x000c, 0x2786: 0x000c, 0x2787: 0x0001, 0x2788: 0x0001, 0x2789: 0x0001, 0x278a: 0x0001, 0x278b: 0x0001, 0x278c: 0x000c, 0x278d: 0x000c, 0x278e: 0x000c, 0x278f: 0x000c, 0x2790: 0x0001, 0x2791: 0x0001, 0x2792: 0x0001, 0x2793: 0x0001, 0x2794: 0x0001, 0x2795: 0x0001, 0x2796: 0x0001, 0x2797: 0x0001, 0x2798: 0x0001, 0x2799: 0x0001, 0x279a: 0x0001, 0x279b: 0x0001, 0x279c: 0x0001, 0x279d: 0x0001, 0x279e: 0x0001, 0x279f: 0x0001, 0x27a0: 0x0001, 0x27a1: 0x0001, 0x27a2: 0x0001, 0x27a3: 0x0001, 0x27a4: 0x0001, 0x27a5: 0x0001, 0x27a6: 0x0001, 0x27a7: 0x0001, 0x27a8: 0x0001, 0x27a9: 0x0001, 0x27aa: 0x0001, 0x27ab: 0x0001, 0x27ac: 0x0001, 0x27ad: 0x0001, 0x27ae: 0x0001, 0x27af: 0x0001, 0x27b0: 0x0001, 0x27b1: 0x0001, 0x27b2: 0x0001, 0x27b3: 0x0001, 0x27b4: 0x0001, 0x27b5: 0x0001, 0x27b6: 0x0001, 0x27b7: 0x0001, 0x27b8: 0x000c, 0x27b9: 0x000c, 0x27ba: 0x000c, 0x27bb: 0x0001, 0x27bc: 0x0001, 0x27bd: 0x0001, 0x27be: 0x0001, 0x27bf: 0x000c, // Block 0x9f, offset 0x27c0 0x27c0: 0x0001, 0x27c1: 0x0001, 0x27c2: 0x0001, 0x27c3: 0x0001, 0x27c4: 0x0001, 0x27c5: 0x0001, 0x27c6: 0x0001, 0x27c7: 0x0001, 0x27c8: 0x0001, 0x27c9: 0x0001, 0x27ca: 0x0001, 0x27cb: 0x0001, 0x27cc: 0x0001, 0x27cd: 0x0001, 0x27ce: 0x0001, 0x27cf: 0x0001, 0x27d0: 0x0001, 0x27d1: 0x0001, 0x27d2: 0x0001, 0x27d3: 0x0001, 0x27d4: 0x0001, 0x27d5: 0x0001, 0x27d6: 0x0001, 0x27d7: 0x0001, 0x27d8: 0x0001, 0x27d9: 0x0001, 0x27da: 0x0001, 0x27db: 0x0001, 0x27dc: 0x0001, 0x27dd: 0x0001, 0x27de: 0x0001, 0x27df: 0x0001, 0x27e0: 0x0001, 0x27e1: 0x0001, 0x27e2: 0x0001, 0x27e3: 0x0001, 0x27e4: 0x0001, 0x27e5: 0x000c, 0x27e6: 0x000c, 0x27e7: 0x0001, 0x27e8: 0x0001, 0x27e9: 0x0001, 0x27ea: 0x0001, 0x27eb: 0x0001, 0x27ec: 0x0001, 0x27ed: 0x0001, 0x27ee: 0x0001, 0x27ef: 0x0001, 0x27f0: 0x0001, 0x27f1: 0x0001, 0x27f2: 0x0001, 0x27f3: 0x0001, 0x27f4: 0x0001, 0x27f5: 0x0001, 0x27f6: 0x0001, 0x27f7: 0x0001, 0x27f8: 0x0001, 0x27f9: 0x0001, 0x27fa: 0x0001, 0x27fb: 0x0001, 0x27fc: 0x0001, 0x27fd: 0x0001, 0x27fe: 0x0001, 0x27ff: 0x0001, // Block 0xa0, offset 0x2800 0x2800: 0x0001, 0x2801: 0x0001, 0x2802: 0x0001, 0x2803: 0x0001, 0x2804: 0x0001, 0x2805: 0x0001, 0x2806: 0x0001, 0x2807: 0x0001, 0x2808: 0x0001, 0x2809: 0x0001, 0x280a: 0x0001, 0x280b: 0x0001, 0x280c: 0x0001, 0x280d: 0x0001, 0x280e: 0x0001, 0x280f: 0x0001, 0x2810: 0x0001, 0x2811: 0x0001, 0x2812: 0x0001, 0x2813: 0x0001, 0x2814: 0x0001, 0x2815: 0x0001, 0x2816: 0x0001, 0x2817: 0x0001, 0x2818: 0x0001, 0x2819: 0x0001, 0x281a: 0x0001, 0x281b: 0x0001, 0x281c: 0x0001, 0x281d: 0x0001, 0x281e: 0x0001, 0x281f: 0x0001, 0x2820: 0x0001, 0x2821: 0x0001, 0x2822: 0x0001, 0x2823: 0x0001, 0x2824: 0x0001, 0x2825: 0x0001, 0x2826: 0x0001, 0x2827: 0x0001, 0x2828: 0x0001, 0x2829: 0x0001, 0x282a: 0x0001, 0x282b: 0x0001, 0x282c: 0x0001, 0x282d: 0x0001, 0x282e: 0x0001, 0x282f: 0x0001, 0x2830: 0x0001, 0x2831: 0x0001, 0x2832: 0x0001, 0x2833: 0x0001, 0x2834: 0x0001, 0x2835: 0x0001, 0x2836: 0x0001, 0x2837: 0x0001, 0x2838: 0x0001, 0x2839: 0x000a, 0x283a: 0x000a, 0x283b: 0x000a, 0x283c: 0x000a, 0x283d: 0x000a, 0x283e: 0x000a, 0x283f: 0x000a, // Block 0xa1, offset 0x2840 0x2840: 0x0001, 0x2841: 0x0001, 0x2842: 0x0001, 0x2843: 0x0001, 0x2844: 0x0001, 0x2845: 0x0001, 0x2846: 0x0001, 0x2847: 0x0001, 0x2848: 0x0001, 0x2849: 0x0001, 0x284a: 0x0001, 0x284b: 0x0001, 0x284c: 0x0001, 0x284d: 0x0001, 0x284e: 0x0001, 0x284f: 0x0001, 0x2850: 0x0001, 0x2851: 0x0001, 0x2852: 0x0001, 0x2853: 0x0001, 0x2854: 0x0001, 0x2855: 0x0001, 0x2856: 0x0001, 0x2857: 0x0001, 0x2858: 0x0001, 0x2859: 0x0001, 0x285a: 0x0001, 0x285b: 0x0001, 0x285c: 0x0001, 0x285d: 0x0001, 0x285e: 0x0001, 0x285f: 0x0001, 0x2860: 0x0005, 0x2861: 0x0005, 0x2862: 0x0005, 0x2863: 0x0005, 0x2864: 0x0005, 0x2865: 0x0005, 0x2866: 0x0005, 0x2867: 0x0005, 0x2868: 0x0005, 0x2869: 0x0005, 0x286a: 0x0005, 0x286b: 0x0005, 0x286c: 0x0005, 0x286d: 0x0005, 0x286e: 0x0005, 0x286f: 0x0005, 0x2870: 0x0005, 0x2871: 0x0005, 0x2872: 0x0005, 0x2873: 0x0005, 0x2874: 0x0005, 0x2875: 0x0005, 0x2876: 0x0005, 0x2877: 0x0005, 0x2878: 0x0005, 0x2879: 0x0005, 0x287a: 0x0005, 0x287b: 0x0005, 0x287c: 0x0005, 0x287d: 0x0005, 0x287e: 0x0005, 0x287f: 0x0001, // Block 0xa2, offset 0x2880 0x2881: 0x000c, 0x28b8: 0x000c, 0x28b9: 0x000c, 0x28ba: 0x000c, 0x28bb: 0x000c, 0x28bc: 0x000c, 0x28bd: 0x000c, 0x28be: 0x000c, 0x28bf: 0x000c, // Block 0xa3, offset 0x28c0 0x28c0: 0x000c, 0x28c1: 0x000c, 0x28c2: 0x000c, 0x28c3: 0x000c, 0x28c4: 0x000c, 0x28c5: 0x000c, 0x28c6: 0x000c, 0x28d2: 0x000a, 0x28d3: 0x000a, 0x28d4: 0x000a, 0x28d5: 0x000a, 0x28d6: 0x000a, 0x28d7: 0x000a, 0x28d8: 0x000a, 0x28d9: 0x000a, 0x28da: 0x000a, 0x28db: 0x000a, 0x28dc: 0x000a, 0x28dd: 0x000a, 0x28de: 0x000a, 0x28df: 0x000a, 0x28e0: 0x000a, 0x28e1: 0x000a, 0x28e2: 0x000a, 0x28e3: 0x000a, 0x28e4: 0x000a, 0x28e5: 0x000a, 0x28ff: 0x000c, // Block 0xa4, offset 0x2900 0x2900: 0x000c, 0x2901: 0x000c, 0x2933: 0x000c, 0x2934: 0x000c, 0x2935: 0x000c, 0x2936: 0x000c, 0x2939: 0x000c, 0x293a: 0x000c, // Block 0xa5, offset 0x2940 0x2940: 0x000c, 0x2941: 0x000c, 0x2942: 0x000c, 0x2967: 0x000c, 0x2968: 0x000c, 0x2969: 0x000c, 0x296a: 0x000c, 0x296b: 0x000c, 0x296d: 0x000c, 0x296e: 0x000c, 0x296f: 0x000c, 0x2970: 0x000c, 0x2971: 0x000c, 0x2972: 0x000c, 0x2973: 0x000c, 0x2974: 0x000c, // Block 0xa6, offset 0x2980 0x29b3: 0x000c, // Block 0xa7, offset 0x29c0 0x29c0: 0x000c, 0x29c1: 0x000c, 0x29f6: 0x000c, 0x29f7: 0x000c, 0x29f8: 0x000c, 0x29f9: 0x000c, 0x29fa: 0x000c, 0x29fb: 0x000c, 0x29fc: 0x000c, 0x29fd: 0x000c, 0x29fe: 0x000c, // Block 0xa8, offset 0x2a00 0x2a0a: 0x000c, 0x2a0b: 0x000c, 0x2a0c: 0x000c, // Block 0xa9, offset 0x2a40 0x2a6f: 0x000c, 0x2a70: 0x000c, 0x2a71: 0x000c, 0x2a74: 0x000c, 0x2a76: 0x000c, 0x2a77: 0x000c, 0x2a7e: 0x000c, // Block 0xaa, offset 0x2a80 0x2a9f: 0x000c, 0x2aa3: 0x000c, 0x2aa4: 0x000c, 0x2aa5: 0x000c, 0x2aa6: 0x000c, 0x2aa7: 0x000c, 0x2aa8: 0x000c, 0x2aa9: 0x000c, 0x2aaa: 0x000c, // Block 0xab, offset 0x2ac0 0x2ac0: 0x000c, 0x2ac1: 0x000c, 0x2afc: 0x000c, // Block 0xac, offset 0x2b00 0x2b00: 0x000c, 0x2b26: 0x000c, 0x2b27: 0x000c, 0x2b28: 0x000c, 0x2b29: 0x000c, 0x2b2a: 0x000c, 0x2b2b: 0x000c, 0x2b2c: 0x000c, 0x2b30: 0x000c, 0x2b31: 0x000c, 0x2b32: 0x000c, 0x2b33: 0x000c, 0x2b34: 0x000c, // Block 0xad, offset 0x2b40 0x2b78: 0x000c, 0x2b79: 0x000c, 0x2b7a: 0x000c, 0x2b7b: 0x000c, 0x2b7c: 0x000c, 0x2b7d: 0x000c, 0x2b7e: 0x000c, 0x2b7f: 0x000c, // Block 0xae, offset 0x2b80 0x2b82: 0x000c, 0x2b83: 0x000c, 0x2b84: 0x000c, 0x2b86: 0x000c, // Block 0xaf, offset 0x2bc0 0x2bf3: 0x000c, 0x2bf4: 0x000c, 0x2bf5: 0x000c, 0x2bf6: 0x000c, 0x2bf7: 0x000c, 0x2bf8: 0x000c, 0x2bfa: 0x000c, 0x2bff: 0x000c, // Block 0xb0, offset 0x2c00 0x2c00: 0x000c, 0x2c02: 0x000c, 0x2c03: 0x000c, // Block 0xb1, offset 0x2c40 0x2c72: 0x000c, 0x2c73: 0x000c, 0x2c74: 0x000c, 0x2c75: 0x000c, 0x2c7c: 0x000c, 0x2c7d: 0x000c, 0x2c7f: 0x000c, // Block 0xb2, offset 0x2c80 0x2c80: 0x000c, 0x2c9c: 0x000c, 0x2c9d: 0x000c, // Block 0xb3, offset 0x2cc0 0x2cf3: 0x000c, 0x2cf4: 0x000c, 0x2cf5: 0x000c, 0x2cf6: 0x000c, 0x2cf7: 0x000c, 0x2cf8: 0x000c, 0x2cf9: 0x000c, 0x2cfa: 0x000c, 0x2cfd: 0x000c, 0x2cff: 0x000c, // Block 0xb4, offset 0x2d00 0x2d00: 0x000c, 0x2d20: 0x000a, 0x2d21: 0x000a, 0x2d22: 0x000a, 0x2d23: 0x000a, 0x2d24: 0x000a, 0x2d25: 0x000a, 0x2d26: 0x000a, 0x2d27: 0x000a, 0x2d28: 0x000a, 0x2d29: 0x000a, 0x2d2a: 0x000a, 0x2d2b: 0x000a, 0x2d2c: 0x000a, // Block 0xb5, offset 0x2d40 0x2d6b: 0x000c, 0x2d6d: 0x000c, 0x2d70: 0x000c, 0x2d71: 0x000c, 0x2d72: 0x000c, 0x2d73: 0x000c, 0x2d74: 0x000c, 0x2d75: 0x000c, 0x2d77: 0x000c, // Block 0xb6, offset 0x2d80 0x2d9d: 0x000c, 0x2d9e: 0x000c, 0x2d9f: 0x000c, 0x2da2: 0x000c, 0x2da3: 0x000c, 0x2da4: 0x000c, 0x2da5: 0x000c, 0x2da7: 0x000c, 0x2da8: 0x000c, 0x2da9: 0x000c, 0x2daa: 0x000c, 0x2dab: 0x000c, // Block 0xb7, offset 0x2dc0 0x2dc1: 0x000c, 0x2dc2: 0x000c, 0x2dc3: 0x000c, 0x2dc4: 0x000c, 0x2dc5: 0x000c, 0x2dc6: 0x000c, 0x2dc9: 0x000c, 0x2dca: 0x000c, 0x2df3: 0x000c, 0x2df4: 0x000c, 0x2df5: 0x000c, 0x2df6: 0x000c, 0x2df7: 0x000c, 0x2df8: 0x000c, 0x2dfb: 0x000c, 0x2dfc: 0x000c, 0x2dfd: 0x000c, 0x2dfe: 0x000c, // Block 0xb8, offset 0x2e00 0x2e07: 0x000c, 0x2e11: 0x000c, 0x2e12: 0x000c, 0x2e13: 0x000c, 0x2e14: 0x000c, 0x2e15: 0x000c, 0x2e16: 0x000c, 0x2e19: 0x000c, 0x2e1a: 0x000c, 0x2e1b: 0x000c, // Block 0xb9, offset 0x2e40 0x2e4a: 0x000c, 0x2e4b: 0x000c, 0x2e4c: 0x000c, 0x2e4d: 0x000c, 0x2e4e: 0x000c, 0x2e4f: 0x000c, 0x2e50: 0x000c, 0x2e51: 0x000c, 0x2e52: 0x000c, 0x2e53: 0x000c, 0x2e54: 0x000c, 0x2e55: 0x000c, 0x2e56: 0x000c, 0x2e58: 0x000c, 0x2e59: 0x000c, // Block 0xba, offset 0x2e80 0x2eb0: 0x000c, 0x2eb1: 0x000c, 0x2eb2: 0x000c, 0x2eb3: 0x000c, 0x2eb4: 0x000c, 0x2eb5: 0x000c, 0x2eb6: 0x000c, 0x2eb8: 0x000c, 0x2eb9: 0x000c, 0x2eba: 0x000c, 0x2ebb: 0x000c, 0x2ebc: 0x000c, 0x2ebd: 0x000c, // Block 0xbb, offset 0x2ec0 0x2ed2: 0x000c, 0x2ed3: 0x000c, 0x2ed4: 0x000c, 0x2ed5: 0x000c, 0x2ed6: 0x000c, 0x2ed7: 0x000c, 0x2ed8: 0x000c, 0x2ed9: 0x000c, 0x2eda: 0x000c, 0x2edb: 0x000c, 0x2edc: 0x000c, 0x2edd: 0x000c, 0x2ede: 0x000c, 0x2edf: 0x000c, 0x2ee0: 0x000c, 0x2ee1: 0x000c, 0x2ee2: 0x000c, 0x2ee3: 0x000c, 0x2ee4: 0x000c, 0x2ee5: 0x000c, 0x2ee6: 0x000c, 0x2ee7: 0x000c, 0x2eea: 0x000c, 0x2eeb: 0x000c, 0x2eec: 0x000c, 0x2eed: 0x000c, 0x2eee: 0x000c, 0x2eef: 0x000c, 0x2ef0: 0x000c, 0x2ef2: 0x000c, 0x2ef3: 0x000c, 0x2ef5: 0x000c, 0x2ef6: 0x000c, // Block 0xbc, offset 0x2f00 0x2f31: 0x000c, 0x2f32: 0x000c, 0x2f33: 0x000c, 0x2f34: 0x000c, 0x2f35: 0x000c, 0x2f36: 0x000c, 0x2f3a: 0x000c, 0x2f3c: 0x000c, 0x2f3d: 0x000c, 0x2f3f: 0x000c, // Block 0xbd, offset 0x2f40 0x2f40: 0x000c, 0x2f41: 0x000c, 0x2f42: 0x000c, 0x2f43: 0x000c, 0x2f44: 0x000c, 0x2f45: 0x000c, 0x2f47: 0x000c, // Block 0xbe, offset 0x2f80 0x2fb0: 0x000c, 0x2fb1: 0x000c, 0x2fb2: 0x000c, 0x2fb3: 0x000c, 0x2fb4: 0x000c, // Block 0xbf, offset 0x2fc0 0x2ff0: 0x000c, 0x2ff1: 0x000c, 0x2ff2: 0x000c, 0x2ff3: 0x000c, 0x2ff4: 0x000c, 0x2ff5: 0x000c, 0x2ff6: 0x000c, // Block 0xc0, offset 0x3000 0x300f: 0x000c, 0x3010: 0x000c, 0x3011: 0x000c, 0x3012: 0x000c, // Block 0xc1, offset 0x3040 0x305d: 0x000c, 0x305e: 0x000c, 0x3060: 0x000b, 0x3061: 0x000b, 0x3062: 0x000b, 0x3063: 0x000b, // Block 0xc2, offset 0x3080 0x30a7: 0x000c, 0x30a8: 0x000c, 0x30a9: 0x000c, 0x30b3: 0x000b, 0x30b4: 0x000b, 0x30b5: 0x000b, 0x30b6: 0x000b, 0x30b7: 0x000b, 0x30b8: 0x000b, 0x30b9: 0x000b, 0x30ba: 0x000b, 0x30bb: 0x000c, 0x30bc: 0x000c, 0x30bd: 0x000c, 0x30be: 0x000c, 0x30bf: 0x000c, // Block 0xc3, offset 0x30c0 0x30c0: 0x000c, 0x30c1: 0x000c, 0x30c2: 0x000c, 0x30c5: 0x000c, 0x30c6: 0x000c, 0x30c7: 0x000c, 0x30c8: 0x000c, 0x30c9: 0x000c, 0x30ca: 0x000c, 0x30cb: 0x000c, 0x30ea: 0x000c, 0x30eb: 0x000c, 0x30ec: 0x000c, 0x30ed: 0x000c, // Block 0xc4, offset 0x3100 0x3100: 0x000a, 0x3101: 0x000a, 0x3102: 0x000c, 0x3103: 0x000c, 0x3104: 0x000c, 0x3105: 0x000a, // Block 0xc5, offset 0x3140 0x3140: 0x000a, 0x3141: 0x000a, 0x3142: 0x000a, 0x3143: 0x000a, 0x3144: 0x000a, 0x3145: 0x000a, 0x3146: 0x000a, 0x3147: 0x000a, 0x3148: 0x000a, 0x3149: 0x000a, 0x314a: 0x000a, 0x314b: 0x000a, 0x314c: 0x000a, 0x314d: 0x000a, 0x314e: 0x000a, 0x314f: 0x000a, 0x3150: 0x000a, 0x3151: 0x000a, 0x3152: 0x000a, 0x3153: 0x000a, 0x3154: 0x000a, 0x3155: 0x000a, 0x3156: 0x000a, // Block 0xc6, offset 0x3180 0x319b: 0x000a, // Block 0xc7, offset 0x31c0 0x31d5: 0x000a, // Block 0xc8, offset 0x3200 0x320f: 0x000a, // Block 0xc9, offset 0x3240 0x3249: 0x000a, // Block 0xca, offset 0x3280 0x3283: 0x000a, 0x328e: 0x0002, 0x328f: 0x0002, 0x3290: 0x0002, 0x3291: 0x0002, 0x3292: 0x0002, 0x3293: 0x0002, 0x3294: 0x0002, 0x3295: 0x0002, 0x3296: 0x0002, 0x3297: 0x0002, 0x3298: 0x0002, 0x3299: 0x0002, 0x329a: 0x0002, 0x329b: 0x0002, 0x329c: 0x0002, 0x329d: 0x0002, 0x329e: 0x0002, 0x329f: 0x0002, 0x32a0: 0x0002, 0x32a1: 0x0002, 0x32a2: 0x0002, 0x32a3: 0x0002, 0x32a4: 0x0002, 0x32a5: 0x0002, 0x32a6: 0x0002, 0x32a7: 0x0002, 0x32a8: 0x0002, 0x32a9: 0x0002, 0x32aa: 0x0002, 0x32ab: 0x0002, 0x32ac: 0x0002, 0x32ad: 0x0002, 0x32ae: 0x0002, 0x32af: 0x0002, 0x32b0: 0x0002, 0x32b1: 0x0002, 0x32b2: 0x0002, 0x32b3: 0x0002, 0x32b4: 0x0002, 0x32b5: 0x0002, 0x32b6: 0x0002, 0x32b7: 0x0002, 0x32b8: 0x0002, 0x32b9: 0x0002, 0x32ba: 0x0002, 0x32bb: 0x0002, 0x32bc: 0x0002, 0x32bd: 0x0002, 0x32be: 0x0002, 0x32bf: 0x0002, // Block 0xcb, offset 0x32c0 0x32c0: 0x000c, 0x32c1: 0x000c, 0x32c2: 0x000c, 0x32c3: 0x000c, 0x32c4: 0x000c, 0x32c5: 0x000c, 0x32c6: 0x000c, 0x32c7: 0x000c, 0x32c8: 0x000c, 0x32c9: 0x000c, 0x32ca: 0x000c, 0x32cb: 0x000c, 0x32cc: 0x000c, 0x32cd: 0x000c, 0x32ce: 0x000c, 0x32cf: 0x000c, 0x32d0: 0x000c, 0x32d1: 0x000c, 0x32d2: 0x000c, 0x32d3: 0x000c, 0x32d4: 0x000c, 0x32d5: 0x000c, 0x32d6: 0x000c, 0x32d7: 0x000c, 0x32d8: 0x000c, 0x32d9: 0x000c, 0x32da: 0x000c, 0x32db: 0x000c, 0x32dc: 0x000c, 0x32dd: 0x000c, 0x32de: 0x000c, 0x32df: 0x000c, 0x32e0: 0x000c, 0x32e1: 0x000c, 0x32e2: 0x000c, 0x32e3: 0x000c, 0x32e4: 0x000c, 0x32e5: 0x000c, 0x32e6: 0x000c, 0x32e7: 0x000c, 0x32e8: 0x000c, 0x32e9: 0x000c, 0x32ea: 0x000c, 0x32eb: 0x000c, 0x32ec: 0x000c, 0x32ed: 0x000c, 0x32ee: 0x000c, 0x32ef: 0x000c, 0x32f0: 0x000c, 0x32f1: 0x000c, 0x32f2: 0x000c, 0x32f3: 0x000c, 0x32f4: 0x000c, 0x32f5: 0x000c, 0x32f6: 0x000c, 0x32fb: 0x000c, 0x32fc: 0x000c, 0x32fd: 0x000c, 0x32fe: 0x000c, 0x32ff: 0x000c, // Block 0xcc, offset 0x3300 0x3300: 0x000c, 0x3301: 0x000c, 0x3302: 0x000c, 0x3303: 0x000c, 0x3304: 0x000c, 0x3305: 0x000c, 0x3306: 0x000c, 0x3307: 0x000c, 0x3308: 0x000c, 0x3309: 0x000c, 0x330a: 0x000c, 0x330b: 0x000c, 0x330c: 0x000c, 0x330d: 0x000c, 0x330e: 0x000c, 0x330f: 0x000c, 0x3310: 0x000c, 0x3311: 0x000c, 0x3312: 0x000c, 0x3313: 0x000c, 0x3314: 0x000c, 0x3315: 0x000c, 0x3316: 0x000c, 0x3317: 0x000c, 0x3318: 0x000c, 0x3319: 0x000c, 0x331a: 0x000c, 0x331b: 0x000c, 0x331c: 0x000c, 0x331d: 0x000c, 0x331e: 0x000c, 0x331f: 0x000c, 0x3320: 0x000c, 0x3321: 0x000c, 0x3322: 0x000c, 0x3323: 0x000c, 0x3324: 0x000c, 0x3325: 0x000c, 0x3326: 0x000c, 0x3327: 0x000c, 0x3328: 0x000c, 0x3329: 0x000c, 0x332a: 0x000c, 0x332b: 0x000c, 0x332c: 0x000c, 0x3335: 0x000c, // Block 0xcd, offset 0x3340 0x3344: 0x000c, 0x335b: 0x000c, 0x335c: 0x000c, 0x335d: 0x000c, 0x335e: 0x000c, 0x335f: 0x000c, 0x3361: 0x000c, 0x3362: 0x000c, 0x3363: 0x000c, 0x3364: 0x000c, 0x3365: 0x000c, 0x3366: 0x000c, 0x3367: 0x000c, 0x3368: 0x000c, 0x3369: 0x000c, 0x336a: 0x000c, 0x336b: 0x000c, 0x336c: 0x000c, 0x336d: 0x000c, 0x336e: 0x000c, 0x336f: 0x000c, // Block 0xce, offset 0x3380 0x3380: 0x000c, 0x3381: 0x000c, 0x3382: 0x000c, 0x3383: 0x000c, 0x3384: 0x000c, 0x3385: 0x000c, 0x3386: 0x000c, 0x3388: 0x000c, 0x3389: 0x000c, 0x338a: 0x000c, 0x338b: 0x000c, 0x338c: 0x000c, 0x338d: 0x000c, 0x338e: 0x000c, 0x338f: 0x000c, 0x3390: 0x000c, 0x3391: 0x000c, 0x3392: 0x000c, 0x3393: 0x000c, 0x3394: 0x000c, 0x3395: 0x000c, 0x3396: 0x000c, 0x3397: 0x000c, 0x3398: 0x000c, 0x339b: 0x000c, 0x339c: 0x000c, 0x339d: 0x000c, 0x339e: 0x000c, 0x339f: 0x000c, 0x33a0: 0x000c, 0x33a1: 0x000c, 0x33a3: 0x000c, 0x33a4: 0x000c, 0x33a6: 0x000c, 0x33a7: 0x000c, 0x33a8: 0x000c, 0x33a9: 0x000c, 0x33aa: 0x000c, // Block 0xcf, offset 0x33c0 0x33c0: 0x0001, 0x33c1: 0x0001, 0x33c2: 0x0001, 0x33c3: 0x0001, 0x33c4: 0x0001, 0x33c5: 0x0001, 0x33c6: 0x0001, 0x33c7: 0x0001, 0x33c8: 0x0001, 0x33c9: 0x0001, 0x33ca: 0x0001, 0x33cb: 0x0001, 0x33cc: 0x0001, 0x33cd: 0x0001, 0x33ce: 0x0001, 0x33cf: 0x0001, 0x33d0: 0x000c, 0x33d1: 0x000c, 0x33d2: 0x000c, 0x33d3: 0x000c, 0x33d4: 0x000c, 0x33d5: 0x000c, 0x33d6: 0x000c, 0x33d7: 0x0001, 0x33d8: 0x0001, 0x33d9: 0x0001, 0x33da: 0x0001, 0x33db: 0x0001, 0x33dc: 0x0001, 0x33dd: 0x0001, 0x33de: 0x0001, 0x33df: 0x0001, 0x33e0: 0x0001, 0x33e1: 0x0001, 0x33e2: 0x0001, 0x33e3: 0x0001, 0x33e4: 0x0001, 0x33e5: 0x0001, 0x33e6: 0x0001, 0x33e7: 0x0001, 0x33e8: 0x0001, 0x33e9: 0x0001, 0x33ea: 0x0001, 0x33eb: 0x0001, 0x33ec: 0x0001, 0x33ed: 0x0001, 0x33ee: 0x0001, 0x33ef: 0x0001, 0x33f0: 0x0001, 0x33f1: 0x0001, 0x33f2: 0x0001, 0x33f3: 0x0001, 0x33f4: 0x0001, 0x33f5: 0x0001, 0x33f6: 0x0001, 0x33f7: 0x0001, 0x33f8: 0x0001, 0x33f9: 0x0001, 0x33fa: 0x0001, 0x33fb: 0x0001, 0x33fc: 0x0001, 0x33fd: 0x0001, 0x33fe: 0x0001, 0x33ff: 0x0001, // Block 0xd0, offset 0x3400 0x3400: 0x0001, 0x3401: 0x0001, 0x3402: 0x0001, 0x3403: 0x0001, 0x3404: 0x000c, 0x3405: 0x000c, 0x3406: 0x000c, 0x3407: 0x000c, 0x3408: 0x000c, 0x3409: 0x000c, 0x340a: 0x000c, 0x340b: 0x0001, 0x340c: 0x0001, 0x340d: 0x0001, 0x340e: 0x0001, 0x340f: 0x0001, 0x3410: 0x0001, 0x3411: 0x0001, 0x3412: 0x0001, 0x3413: 0x0001, 0x3414: 0x0001, 0x3415: 0x0001, 0x3416: 0x0001, 0x3417: 0x0001, 0x3418: 0x0001, 0x3419: 0x0001, 0x341a: 0x0001, 0x341b: 0x0001, 0x341c: 0x0001, 0x341d: 0x0001, 0x341e: 0x0001, 0x341f: 0x0001, 0x3420: 0x0001, 0x3421: 0x0001, 0x3422: 0x0001, 0x3423: 0x0001, 0x3424: 0x0001, 0x3425: 0x0001, 0x3426: 0x0001, 0x3427: 0x0001, 0x3428: 0x0001, 0x3429: 0x0001, 0x342a: 0x0001, 0x342b: 0x0001, 0x342c: 0x0001, 0x342d: 0x0001, 0x342e: 0x0001, 0x342f: 0x0001, 0x3430: 0x0001, 0x3431: 0x0001, 0x3432: 0x0001, 0x3433: 0x0001, 0x3434: 0x0001, 0x3435: 0x0001, 0x3436: 0x0001, 0x3437: 0x0001, 0x3438: 0x0001, 0x3439: 0x0001, 0x343a: 0x0001, 0x343b: 0x0001, 0x343c: 0x0001, 0x343d: 0x0001, 0x343e: 0x0001, 0x343f: 0x0001, // Block 0xd1, offset 0x3440 0x3440: 0x000d, 0x3441: 0x000d, 0x3442: 0x000d, 0x3443: 0x000d, 0x3444: 0x000d, 0x3445: 0x000d, 0x3446: 0x000d, 0x3447: 0x000d, 0x3448: 0x000d, 0x3449: 0x000d, 0x344a: 0x000d, 0x344b: 0x000d, 0x344c: 0x000d, 0x344d: 0x000d, 0x344e: 0x000d, 0x344f: 0x000d, 0x3450: 0x000d, 0x3451: 0x000d, 0x3452: 0x000d, 0x3453: 0x000d, 0x3454: 0x000d, 0x3455: 0x000d, 0x3456: 0x000d, 0x3457: 0x000d, 0x3458: 0x000d, 0x3459: 0x000d, 0x345a: 0x000d, 0x345b: 0x000d, 0x345c: 0x000d, 0x345d: 0x000d, 0x345e: 0x000d, 0x345f: 0x000d, 0x3460: 0x000d, 0x3461: 0x000d, 0x3462: 0x000d, 0x3463: 0x000d, 0x3464: 0x000d, 0x3465: 0x000d, 0x3466: 0x000d, 0x3467: 0x000d, 0x3468: 0x000d, 0x3469: 0x000d, 0x346a: 0x000d, 0x346b: 0x000d, 0x346c: 0x000d, 0x346d: 0x000d, 0x346e: 0x000d, 0x346f: 0x000d, 0x3470: 0x000a, 0x3471: 0x000a, 0x3472: 0x000d, 0x3473: 0x000d, 0x3474: 0x000d, 0x3475: 0x000d, 0x3476: 0x000d, 0x3477: 0x000d, 0x3478: 0x000d, 0x3479: 0x000d, 0x347a: 0x000d, 0x347b: 0x000d, 0x347c: 0x000d, 0x347d: 0x000d, 0x347e: 0x000d, 0x347f: 0x000d, // Block 0xd2, offset 0x3480 0x3480: 0x000a, 0x3481: 0x000a, 0x3482: 0x000a, 0x3483: 0x000a, 0x3484: 0x000a, 0x3485: 0x000a, 0x3486: 0x000a, 0x3487: 0x000a, 0x3488: 0x000a, 0x3489: 0x000a, 0x348a: 0x000a, 0x348b: 0x000a, 0x348c: 0x000a, 0x348d: 0x000a, 0x348e: 0x000a, 0x348f: 0x000a, 0x3490: 0x000a, 0x3491: 0x000a, 0x3492: 0x000a, 0x3493: 0x000a, 0x3494: 0x000a, 0x3495: 0x000a, 0x3496: 0x000a, 0x3497: 0x000a, 0x3498: 0x000a, 0x3499: 0x000a, 0x349a: 0x000a, 0x349b: 0x000a, 0x349c: 0x000a, 0x349d: 0x000a, 0x349e: 0x000a, 0x349f: 0x000a, 0x34a0: 0x000a, 0x34a1: 0x000a, 0x34a2: 0x000a, 0x34a3: 0x000a, 0x34a4: 0x000a, 0x34a5: 0x000a, 0x34a6: 0x000a, 0x34a7: 0x000a, 0x34a8: 0x000a, 0x34a9: 0x000a, 0x34aa: 0x000a, 0x34ab: 0x000a, 0x34b0: 0x000a, 0x34b1: 0x000a, 0x34b2: 0x000a, 0x34b3: 0x000a, 0x34b4: 0x000a, 0x34b5: 0x000a, 0x34b6: 0x000a, 0x34b7: 0x000a, 0x34b8: 0x000a, 0x34b9: 0x000a, 0x34ba: 0x000a, 0x34bb: 0x000a, 0x34bc: 0x000a, 0x34bd: 0x000a, 0x34be: 0x000a, 0x34bf: 0x000a, // Block 0xd3, offset 0x34c0 0x34c0: 0x000a, 0x34c1: 0x000a, 0x34c2: 0x000a, 0x34c3: 0x000a, 0x34c4: 0x000a, 0x34c5: 0x000a, 0x34c6: 0x000a, 0x34c7: 0x000a, 0x34c8: 0x000a, 0x34c9: 0x000a, 0x34ca: 0x000a, 0x34cb: 0x000a, 0x34cc: 0x000a, 0x34cd: 0x000a, 0x34ce: 0x000a, 0x34cf: 0x000a, 0x34d0: 0x000a, 0x34d1: 0x000a, 0x34d2: 0x000a, 0x34d3: 0x000a, 0x34e0: 0x000a, 0x34e1: 0x000a, 0x34e2: 0x000a, 0x34e3: 0x000a, 0x34e4: 0x000a, 0x34e5: 0x000a, 0x34e6: 0x000a, 0x34e7: 0x000a, 0x34e8: 0x000a, 0x34e9: 0x000a, 0x34ea: 0x000a, 0x34eb: 0x000a, 0x34ec: 0x000a, 0x34ed: 0x000a, 0x34ee: 0x000a, 0x34f1: 0x000a, 0x34f2: 0x000a, 0x34f3: 0x000a, 0x34f4: 0x000a, 0x34f5: 0x000a, 0x34f6: 0x000a, 0x34f7: 0x000a, 0x34f8: 0x000a, 0x34f9: 0x000a, 0x34fa: 0x000a, 0x34fb: 0x000a, 0x34fc: 0x000a, 0x34fd: 0x000a, 0x34fe: 0x000a, 0x34ff: 0x000a, // Block 0xd4, offset 0x3500 0x3501: 0x000a, 0x3502: 0x000a, 0x3503: 0x000a, 0x3504: 0x000a, 0x3505: 0x000a, 0x3506: 0x000a, 0x3507: 0x000a, 0x3508: 0x000a, 0x3509: 0x000a, 0x350a: 0x000a, 0x350b: 0x000a, 0x350c: 0x000a, 0x350d: 0x000a, 0x350e: 0x000a, 0x350f: 0x000a, 0x3511: 0x000a, 0x3512: 0x000a, 0x3513: 0x000a, 0x3514: 0x000a, 0x3515: 0x000a, 0x3516: 0x000a, 0x3517: 0x000a, 0x3518: 0x000a, 0x3519: 0x000a, 0x351a: 0x000a, 0x351b: 0x000a, 0x351c: 0x000a, 0x351d: 0x000a, 0x351e: 0x000a, 0x351f: 0x000a, 0x3520: 0x000a, 0x3521: 0x000a, 0x3522: 0x000a, 0x3523: 0x000a, 0x3524: 0x000a, 0x3525: 0x000a, 0x3526: 0x000a, 0x3527: 0x000a, 0x3528: 0x000a, 0x3529: 0x000a, 0x352a: 0x000a, 0x352b: 0x000a, 0x352c: 0x000a, 0x352d: 0x000a, 0x352e: 0x000a, 0x352f: 0x000a, 0x3530: 0x000a, 0x3531: 0x000a, 0x3532: 0x000a, 0x3533: 0x000a, 0x3534: 0x000a, 0x3535: 0x000a, // Block 0xd5, offset 0x3540 0x3540: 0x0002, 0x3541: 0x0002, 0x3542: 0x0002, 0x3543: 0x0002, 0x3544: 0x0002, 0x3545: 0x0002, 0x3546: 0x0002, 0x3547: 0x0002, 0x3548: 0x0002, 0x3549: 0x0002, 0x354a: 0x0002, 0x354b: 0x000a, 0x354c: 0x000a, // Block 0xd6, offset 0x3580 0x35aa: 0x000a, 0x35ab: 0x000a, // Block 0xd7, offset 0x35c0 0x35e0: 0x000a, 0x35e1: 0x000a, 0x35e2: 0x000a, 0x35e3: 0x000a, 0x35e4: 0x000a, 0x35e5: 0x000a, // Block 0xd8, offset 0x3600 0x3600: 0x000a, 0x3601: 0x000a, 0x3602: 0x000a, 0x3603: 0x000a, 0x3604: 0x000a, 0x3605: 0x000a, 0x3606: 0x000a, 0x3607: 0x000a, 0x3608: 0x000a, 0x3609: 0x000a, 0x360a: 0x000a, 0x360b: 0x000a, 0x360c: 0x000a, 0x360d: 0x000a, 0x360e: 0x000a, 0x360f: 0x000a, 0x3610: 0x000a, 0x3611: 0x000a, 0x3612: 0x000a, 0x3613: 0x000a, 0x3614: 0x000a, 0x3620: 0x000a, 0x3621: 0x000a, 0x3622: 0x000a, 0x3623: 0x000a, 0x3624: 0x000a, 0x3625: 0x000a, 0x3626: 0x000a, 0x3627: 0x000a, 0x3628: 0x000a, 0x3629: 0x000a, 0x362a: 0x000a, 0x362b: 0x000a, 0x362c: 0x000a, 0x3630: 0x000a, 0x3631: 0x000a, 0x3632: 0x000a, 0x3633: 0x000a, 0x3634: 0x000a, 0x3635: 0x000a, 0x3636: 0x000a, 0x3637: 0x000a, 0x3638: 0x000a, // Block 0xd9, offset 0x3640 0x3640: 0x000a, 0x3641: 0x000a, 0x3642: 0x000a, 0x3643: 0x000a, 0x3644: 0x000a, 0x3645: 0x000a, 0x3646: 0x000a, 0x3647: 0x000a, 0x3648: 0x000a, 0x3649: 0x000a, 0x364a: 0x000a, 0x364b: 0x000a, 0x364c: 0x000a, 0x364d: 0x000a, 0x364e: 0x000a, 0x364f: 0x000a, 0x3650: 0x000a, 0x3651: 0x000a, 0x3652: 0x000a, 0x3653: 0x000a, 0x3654: 0x000a, // Block 0xda, offset 0x3680 0x3680: 0x000a, 0x3681: 0x000a, 0x3682: 0x000a, 0x3683: 0x000a, 0x3684: 0x000a, 0x3685: 0x000a, 0x3686: 0x000a, 0x3687: 0x000a, 0x3688: 0x000a, 0x3689: 0x000a, 0x368a: 0x000a, 0x368b: 0x000a, 0x3690: 0x000a, 0x3691: 0x000a, 0x3692: 0x000a, 0x3693: 0x000a, 0x3694: 0x000a, 0x3695: 0x000a, 0x3696: 0x000a, 0x3697: 0x000a, 0x3698: 0x000a, 0x3699: 0x000a, 0x369a: 0x000a, 0x369b: 0x000a, 0x369c: 0x000a, 0x369d: 0x000a, 0x369e: 0x000a, 0x369f: 0x000a, 0x36a0: 0x000a, 0x36a1: 0x000a, 0x36a2: 0x000a, 0x36a3: 0x000a, 0x36a4: 0x000a, 0x36a5: 0x000a, 0x36a6: 0x000a, 0x36a7: 0x000a, 0x36a8: 0x000a, 0x36a9: 0x000a, 0x36aa: 0x000a, 0x36ab: 0x000a, 0x36ac: 0x000a, 0x36ad: 0x000a, 0x36ae: 0x000a, 0x36af: 0x000a, 0x36b0: 0x000a, 0x36b1: 0x000a, 0x36b2: 0x000a, 0x36b3: 0x000a, 0x36b4: 0x000a, 0x36b5: 0x000a, 0x36b6: 0x000a, 0x36b7: 0x000a, 0x36b8: 0x000a, 0x36b9: 0x000a, 0x36ba: 0x000a, 0x36bb: 0x000a, 0x36bc: 0x000a, 0x36bd: 0x000a, 0x36be: 0x000a, 0x36bf: 0x000a, // Block 0xdb, offset 0x36c0 0x36c0: 0x000a, 0x36c1: 0x000a, 0x36c2: 0x000a, 0x36c3: 0x000a, 0x36c4: 0x000a, 0x36c5: 0x000a, 0x36c6: 0x000a, 0x36c7: 0x000a, 0x36d0: 0x000a, 0x36d1: 0x000a, 0x36d2: 0x000a, 0x36d3: 0x000a, 0x36d4: 0x000a, 0x36d5: 0x000a, 0x36d6: 0x000a, 0x36d7: 0x000a, 0x36d8: 0x000a, 0x36d9: 0x000a, 0x36e0: 0x000a, 0x36e1: 0x000a, 0x36e2: 0x000a, 0x36e3: 0x000a, 0x36e4: 0x000a, 0x36e5: 0x000a, 0x36e6: 0x000a, 0x36e7: 0x000a, 0x36e8: 0x000a, 0x36e9: 0x000a, 0x36ea: 0x000a, 0x36eb: 0x000a, 0x36ec: 0x000a, 0x36ed: 0x000a, 0x36ee: 0x000a, 0x36ef: 0x000a, 0x36f0: 0x000a, 0x36f1: 0x000a, 0x36f2: 0x000a, 0x36f3: 0x000a, 0x36f4: 0x000a, 0x36f5: 0x000a, 0x36f6: 0x000a, 0x36f7: 0x000a, 0x36f8: 0x000a, 0x36f9: 0x000a, 0x36fa: 0x000a, 0x36fb: 0x000a, 0x36fc: 0x000a, 0x36fd: 0x000a, 0x36fe: 0x000a, 0x36ff: 0x000a, // Block 0xdc, offset 0x3700 0x3700: 0x000a, 0x3701: 0x000a, 0x3702: 0x000a, 0x3703: 0x000a, 0x3704: 0x000a, 0x3705: 0x000a, 0x3706: 0x000a, 0x3707: 0x000a, 0x3710: 0x000a, 0x3711: 0x000a, 0x3712: 0x000a, 0x3713: 0x000a, 0x3714: 0x000a, 0x3715: 0x000a, 0x3716: 0x000a, 0x3717: 0x000a, 0x3718: 0x000a, 0x3719: 0x000a, 0x371a: 0x000a, 0x371b: 0x000a, 0x371c: 0x000a, 0x371d: 0x000a, 0x371e: 0x000a, 0x371f: 0x000a, 0x3720: 0x000a, 0x3721: 0x000a, 0x3722: 0x000a, 0x3723: 0x000a, 0x3724: 0x000a, 0x3725: 0x000a, 0x3726: 0x000a, 0x3727: 0x000a, 0x3728: 0x000a, 0x3729: 0x000a, 0x372a: 0x000a, 0x372b: 0x000a, 0x372c: 0x000a, 0x372d: 0x000a, // Block 0xdd, offset 0x3740 0x3740: 0x000a, 0x3741: 0x000a, 0x3742: 0x000a, 0x3743: 0x000a, 0x3744: 0x000a, 0x3745: 0x000a, 0x3746: 0x000a, 0x3747: 0x000a, 0x3748: 0x000a, 0x3749: 0x000a, 0x374a: 0x000a, 0x374b: 0x000a, 0x3750: 0x000a, 0x3751: 0x000a, 0x3752: 0x000a, 0x3753: 0x000a, 0x3754: 0x000a, 0x3755: 0x000a, 0x3756: 0x000a, 0x3757: 0x000a, 0x3758: 0x000a, 0x3759: 0x000a, 0x375a: 0x000a, 0x375b: 0x000a, 0x375c: 0x000a, 0x375d: 0x000a, 0x375e: 0x000a, 0x375f: 0x000a, 0x3760: 0x000a, 0x3761: 0x000a, 0x3762: 0x000a, 0x3763: 0x000a, 0x3764: 0x000a, 0x3765: 0x000a, 0x3766: 0x000a, 0x3767: 0x000a, 0x3768: 0x000a, 0x3769: 0x000a, 0x376a: 0x000a, 0x376b: 0x000a, 0x376c: 0x000a, 0x376d: 0x000a, 0x376e: 0x000a, 0x376f: 0x000a, 0x3770: 0x000a, 0x3771: 0x000a, 0x3772: 0x000a, 0x3773: 0x000a, 0x3774: 0x000a, 0x3775: 0x000a, 0x3776: 0x000a, 0x3777: 0x000a, 0x3778: 0x000a, 0x3779: 0x000a, 0x377a: 0x000a, 0x377b: 0x000a, 0x377c: 0x000a, 0x377d: 0x000a, 0x377e: 0x000a, // Block 0xde, offset 0x3780 0x3780: 0x000a, 0x3781: 0x000a, 0x3782: 0x000a, 0x3783: 0x000a, 0x3784: 0x000a, 0x3785: 0x000a, 0x3786: 0x000a, 0x3787: 0x000a, 0x3788: 0x000a, 0x3789: 0x000a, 0x378a: 0x000a, 0x378b: 0x000a, 0x378c: 0x000a, 0x3790: 0x000a, 0x3791: 0x000a, 0x3792: 0x000a, 0x3793: 0x000a, 0x3794: 0x000a, 0x3795: 0x000a, 0x3796: 0x000a, 0x3797: 0x000a, 0x3798: 0x000a, 0x3799: 0x000a, 0x379a: 0x000a, 0x379b: 0x000a, 0x379c: 0x000a, 0x379d: 0x000a, 0x379e: 0x000a, 0x379f: 0x000a, 0x37a0: 0x000a, 0x37a1: 0x000a, 0x37a2: 0x000a, 0x37a3: 0x000a, 0x37a4: 0x000a, 0x37a5: 0x000a, 0x37a6: 0x000a, 0x37a7: 0x000a, 0x37a8: 0x000a, 0x37a9: 0x000a, 0x37aa: 0x000a, 0x37ab: 0x000a, // Block 0xdf, offset 0x37c0 0x37c0: 0x000a, 0x37c1: 0x000a, 0x37c2: 0x000a, 0x37c3: 0x000a, 0x37c4: 0x000a, 0x37c5: 0x000a, 0x37c6: 0x000a, 0x37c7: 0x000a, 0x37c8: 0x000a, 0x37c9: 0x000a, 0x37ca: 0x000a, 0x37cb: 0x000a, 0x37cc: 0x000a, 0x37cd: 0x000a, 0x37ce: 0x000a, 0x37cf: 0x000a, 0x37d0: 0x000a, 0x37d1: 0x000a, 0x37d2: 0x000a, 0x37d3: 0x000a, 0x37d4: 0x000a, 0x37d5: 0x000a, 0x37d6: 0x000a, 0x37d7: 0x000a, // Block 0xe0, offset 0x3800 0x3800: 0x000a, 0x3810: 0x000a, 0x3811: 0x000a, 0x3812: 0x000a, 0x3813: 0x000a, 0x3814: 0x000a, 0x3815: 0x000a, 0x3816: 0x000a, 0x3817: 0x000a, 0x3818: 0x000a, 0x3819: 0x000a, 0x381a: 0x000a, 0x381b: 0x000a, 0x381c: 0x000a, 0x381d: 0x000a, 0x381e: 0x000a, 0x381f: 0x000a, 0x3820: 0x000a, 0x3821: 0x000a, 0x3822: 0x000a, 0x3823: 0x000a, 0x3824: 0x000a, 0x3825: 0x000a, 0x3826: 0x000a, // Block 0xe1, offset 0x3840 0x387e: 0x000b, 0x387f: 0x000b, // Block 0xe2, offset 0x3880 0x3880: 0x000b, 0x3881: 0x000b, 0x3882: 0x000b, 0x3883: 0x000b, 0x3884: 0x000b, 0x3885: 0x000b, 0x3886: 0x000b, 0x3887: 0x000b, 0x3888: 0x000b, 0x3889: 0x000b, 0x388a: 0x000b, 0x388b: 0x000b, 0x388c: 0x000b, 0x388d: 0x000b, 0x388e: 0x000b, 0x388f: 0x000b, 0x3890: 0x000b, 0x3891: 0x000b, 0x3892: 0x000b, 0x3893: 0x000b, 0x3894: 0x000b, 0x3895: 0x000b, 0x3896: 0x000b, 0x3897: 0x000b, 0x3898: 0x000b, 0x3899: 0x000b, 0x389a: 0x000b, 0x389b: 0x000b, 0x389c: 0x000b, 0x389d: 0x000b, 0x389e: 0x000b, 0x389f: 0x000b, 0x38a0: 0x000b, 0x38a1: 0x000b, 0x38a2: 0x000b, 0x38a3: 0x000b, 0x38a4: 0x000b, 0x38a5: 0x000b, 0x38a6: 0x000b, 0x38a7: 0x000b, 0x38a8: 0x000b, 0x38a9: 0x000b, 0x38aa: 0x000b, 0x38ab: 0x000b, 0x38ac: 0x000b, 0x38ad: 0x000b, 0x38ae: 0x000b, 0x38af: 0x000b, 0x38b0: 0x000b, 0x38b1: 0x000b, 0x38b2: 0x000b, 0x38b3: 0x000b, 0x38b4: 0x000b, 0x38b5: 0x000b, 0x38b6: 0x000b, 0x38b7: 0x000b, 0x38b8: 0x000b, 0x38b9: 0x000b, 0x38ba: 0x000b, 0x38bb: 0x000b, 0x38bc: 0x000b, 0x38bd: 0x000b, 0x38be: 0x000b, 0x38bf: 0x000b, // Block 0xe3, offset 0x38c0 0x38c0: 0x000c, 0x38c1: 0x000c, 0x38c2: 0x000c, 0x38c3: 0x000c, 0x38c4: 0x000c, 0x38c5: 0x000c, 0x38c6: 0x000c, 0x38c7: 0x000c, 0x38c8: 0x000c, 0x38c9: 0x000c, 0x38ca: 0x000c, 0x38cb: 0x000c, 0x38cc: 0x000c, 0x38cd: 0x000c, 0x38ce: 0x000c, 0x38cf: 0x000c, 0x38d0: 0x000c, 0x38d1: 0x000c, 0x38d2: 0x000c, 0x38d3: 0x000c, 0x38d4: 0x000c, 0x38d5: 0x000c, 0x38d6: 0x000c, 0x38d7: 0x000c, 0x38d8: 0x000c, 0x38d9: 0x000c, 0x38da: 0x000c, 0x38db: 0x000c, 0x38dc: 0x000c, 0x38dd: 0x000c, 0x38de: 0x000c, 0x38df: 0x000c, 0x38e0: 0x000c, 0x38e1: 0x000c, 0x38e2: 0x000c, 0x38e3: 0x000c, 0x38e4: 0x000c, 0x38e5: 0x000c, 0x38e6: 0x000c, 0x38e7: 0x000c, 0x38e8: 0x000c, 0x38e9: 0x000c, 0x38ea: 0x000c, 0x38eb: 0x000c, 0x38ec: 0x000c, 0x38ed: 0x000c, 0x38ee: 0x000c, 0x38ef: 0x000c, 0x38f0: 0x000b, 0x38f1: 0x000b, 0x38f2: 0x000b, 0x38f3: 0x000b, 0x38f4: 0x000b, 0x38f5: 0x000b, 0x38f6: 0x000b, 0x38f7: 0x000b, 0x38f8: 0x000b, 0x38f9: 0x000b, 0x38fa: 0x000b, 0x38fb: 0x000b, 0x38fc: 0x000b, 0x38fd: 0x000b, 0x38fe: 0x000b, 0x38ff: 0x000b, } // bidiIndex: 24 blocks, 1536 entries, 1536 bytes // Block 0 is the zero block. var bidiIndex = [1536]uint8{ // Block 0x0, offset 0x0 // Block 0x1, offset 0x40 // Block 0x2, offset 0x80 // Block 0x3, offset 0xc0 0xc2: 0x01, 0xc3: 0x02, 0xca: 0x03, 0xcb: 0x04, 0xcc: 0x05, 0xcd: 0x06, 0xce: 0x07, 0xcf: 0x08, 0xd2: 0x09, 0xd6: 0x0a, 0xd7: 0x0b, 0xd8: 0x0c, 0xd9: 0x0d, 0xda: 0x0e, 0xdb: 0x0f, 0xdc: 0x10, 0xdd: 0x11, 0xde: 0x12, 0xdf: 0x13, 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, 0xea: 0x07, 0xef: 0x08, 0xf0: 0x11, 0xf1: 0x12, 0xf2: 0x12, 0xf3: 0x14, 0xf4: 0x15, // Block 0x4, offset 0x100 0x120: 0x14, 0x121: 0x15, 0x122: 0x16, 0x123: 0x17, 0x124: 0x18, 0x125: 0x19, 0x126: 0x1a, 0x127: 0x1b, 0x128: 0x1c, 0x129: 0x1d, 0x12a: 0x1c, 0x12b: 0x1e, 0x12c: 0x1f, 0x12d: 0x20, 0x12e: 0x21, 0x12f: 0x22, 0x130: 0x23, 0x131: 0x24, 0x132: 0x1a, 0x133: 0x25, 0x134: 0x26, 0x135: 0x27, 0x137: 0x28, 0x138: 0x29, 0x139: 0x2a, 0x13a: 0x2b, 0x13b: 0x2c, 0x13c: 0x2d, 0x13d: 0x2e, 0x13e: 0x2f, 0x13f: 0x30, // Block 0x5, offset 0x140 0x140: 0x31, 0x141: 0x32, 0x142: 0x33, 0x14d: 0x34, 0x14e: 0x35, 0x150: 0x36, 0x15a: 0x37, 0x15c: 0x38, 0x15d: 0x39, 0x15e: 0x3a, 0x15f: 0x3b, 0x160: 0x3c, 0x162: 0x3d, 0x164: 0x3e, 0x165: 0x3f, 0x167: 0x40, 0x168: 0x41, 0x169: 0x42, 0x16a: 0x43, 0x16c: 0x44, 0x16d: 0x45, 0x16e: 0x46, 0x16f: 0x47, 0x170: 0x48, 0x173: 0x49, 0x177: 0x4a, 0x17e: 0x4b, 0x17f: 0x4c, // Block 0x6, offset 0x180 0x180: 0x4d, 0x181: 0x4e, 0x182: 0x4f, 0x183: 0x50, 0x184: 0x51, 0x185: 0x52, 0x186: 0x53, 0x187: 0x54, 0x188: 0x55, 0x189: 0x54, 0x18a: 0x54, 0x18b: 0x54, 0x18c: 0x56, 0x18d: 0x57, 0x18e: 0x58, 0x18f: 0x54, 0x190: 0x59, 0x191: 0x5a, 0x192: 0x5b, 0x193: 0x5c, 0x194: 0x54, 0x195: 0x54, 0x196: 0x54, 0x197: 0x54, 0x198: 0x54, 0x199: 0x54, 0x19a: 0x5d, 0x19b: 0x54, 0x19c: 0x54, 0x19d: 0x5e, 0x19e: 0x54, 0x19f: 0x5f, 0x1a4: 0x54, 0x1a5: 0x54, 0x1a6: 0x60, 0x1a7: 0x61, 0x1a8: 0x54, 0x1a9: 0x54, 0x1aa: 0x54, 0x1ab: 0x54, 0x1ac: 0x54, 0x1ad: 0x62, 0x1ae: 0x63, 0x1af: 0x64, 0x1b3: 0x65, 0x1b5: 0x66, 0x1b7: 0x67, 0x1b8: 0x68, 0x1b9: 0x69, 0x1ba: 0x6a, 0x1bb: 0x6b, 0x1bc: 0x54, 0x1bd: 0x54, 0x1be: 0x54, 0x1bf: 0x6c, // Block 0x7, offset 0x1c0 0x1c0: 0x6d, 0x1c2: 0x6e, 0x1c3: 0x6f, 0x1c7: 0x70, 0x1c8: 0x71, 0x1c9: 0x72, 0x1ca: 0x73, 0x1cb: 0x74, 0x1cd: 0x75, 0x1cf: 0x76, // Block 0x8, offset 0x200 0x237: 0x54, // Block 0x9, offset 0x240 0x252: 0x77, 0x253: 0x78, 0x258: 0x79, 0x259: 0x7a, 0x25a: 0x7b, 0x25b: 0x7c, 0x25c: 0x7d, 0x25e: 0x7e, 0x260: 0x7f, 0x261: 0x80, 0x263: 0x81, 0x264: 0x82, 0x265: 0x83, 0x266: 0x84, 0x267: 0x85, 0x268: 0x86, 0x269: 0x87, 0x26a: 0x88, 0x26b: 0x89, 0x26f: 0x8a, // Block 0xa, offset 0x280 0x2ac: 0x8b, 0x2ad: 0x8c, 0x2ae: 0x0e, 0x2af: 0x0e, 0x2b0: 0x0e, 0x2b1: 0x0e, 0x2b2: 0x0e, 0x2b3: 0x0e, 0x2b4: 0x8d, 0x2b5: 0x0e, 0x2b6: 0x0e, 0x2b7: 0x8e, 0x2b8: 0x8f, 0x2b9: 0x90, 0x2ba: 0x0e, 0x2bb: 0x91, 0x2bc: 0x92, 0x2bd: 0x93, 0x2bf: 0x94, // Block 0xb, offset 0x2c0 0x2c4: 0x95, 0x2c5: 0x54, 0x2c6: 0x96, 0x2c7: 0x97, 0x2cb: 0x98, 0x2cd: 0x99, 0x2e0: 0x9a, 0x2e1: 0x9a, 0x2e2: 0x9a, 0x2e3: 0x9a, 0x2e4: 0x9b, 0x2e5: 0x9a, 0x2e6: 0x9a, 0x2e7: 0x9a, 0x2e8: 0x9c, 0x2e9: 0x9a, 0x2ea: 0x9a, 0x2eb: 0x9d, 0x2ec: 0x9e, 0x2ed: 0x9a, 0x2ee: 0x9a, 0x2ef: 0x9a, 0x2f0: 0x9a, 0x2f1: 0x9a, 0x2f2: 0x9a, 0x2f3: 0x9a, 0x2f4: 0x9a, 0x2f5: 0x9a, 0x2f6: 0x9a, 0x2f7: 0x9a, 0x2f8: 0x9a, 0x2f9: 0x9f, 0x2fa: 0x9a, 0x2fb: 0x9a, 0x2fc: 0x9a, 0x2fd: 0x9a, 0x2fe: 0x9a, 0x2ff: 0x9a, // Block 0xc, offset 0x300 0x300: 0xa0, 0x301: 0xa1, 0x302: 0xa2, 0x304: 0xa3, 0x305: 0xa4, 0x306: 0xa5, 0x307: 0xa6, 0x308: 0xa7, 0x30b: 0xa8, 0x30c: 0xa9, 0x30d: 0xaa, 0x310: 0xab, 0x311: 0xac, 0x312: 0xad, 0x313: 0xae, 0x316: 0xaf, 0x317: 0xb0, 0x318: 0xb1, 0x319: 0xb2, 0x31a: 0xb3, 0x31c: 0xb4, 0x328: 0xb5, 0x329: 0xb6, 0x32a: 0xb7, 0x330: 0xb8, 0x332: 0xb9, 0x334: 0xba, 0x335: 0xbb, // Block 0xd, offset 0x340 0x36b: 0xbc, 0x36c: 0xbd, 0x37e: 0xbe, // Block 0xe, offset 0x380 0x3b2: 0xbf, // Block 0xf, offset 0x3c0 0x3c5: 0xc0, 0x3c6: 0xc1, 0x3c8: 0x54, 0x3c9: 0xc2, 0x3cc: 0x54, 0x3cd: 0xc3, 0x3db: 0xc4, 0x3dc: 0xc5, 0x3dd: 0xc6, 0x3de: 0xc7, 0x3df: 0xc8, 0x3e8: 0xc9, 0x3e9: 0xca, 0x3ea: 0xcb, // Block 0x10, offset 0x400 0x400: 0xcc, 0x420: 0x9a, 0x421: 0x9a, 0x422: 0x9a, 0x423: 0xcd, 0x424: 0x9a, 0x425: 0xce, 0x426: 0x9a, 0x427: 0x9a, 0x428: 0x9a, 0x429: 0x9a, 0x42a: 0x9a, 0x42b: 0x9a, 0x42c: 0x9a, 0x42d: 0x9a, 0x42e: 0x9a, 0x42f: 0x9a, 0x430: 0x9a, 0x431: 0x9a, 0x432: 0x9a, 0x433: 0x9a, 0x434: 0x9a, 0x435: 0x9a, 0x436: 0x9a, 0x437: 0x9a, 0x438: 0x0e, 0x439: 0x0e, 0x43a: 0x0e, 0x43b: 0xcf, 0x43c: 0x9a, 0x43d: 0x9a, 0x43e: 0x9a, 0x43f: 0x9a, // Block 0x11, offset 0x440 0x440: 0xd0, 0x441: 0x54, 0x442: 0xd1, 0x443: 0xd2, 0x444: 0xd3, 0x445: 0xd4, 0x449: 0xd5, 0x44c: 0x54, 0x44d: 0x54, 0x44e: 0x54, 0x44f: 0x54, 0x450: 0x54, 0x451: 0x54, 0x452: 0x54, 0x453: 0x54, 0x454: 0x54, 0x455: 0x54, 0x456: 0x54, 0x457: 0x54, 0x458: 0x54, 0x459: 0x54, 0x45a: 0x54, 0x45b: 0xd6, 0x45c: 0x54, 0x45d: 0x6b, 0x45e: 0x54, 0x45f: 0xd7, 0x460: 0xd8, 0x461: 0xd9, 0x462: 0xda, 0x464: 0xdb, 0x465: 0xdc, 0x466: 0xdd, 0x467: 0xde, 0x47f: 0xdf, // Block 0x12, offset 0x480 0x4bf: 0xdf, // Block 0x13, offset 0x4c0 0x4d0: 0x09, 0x4d1: 0x0a, 0x4d6: 0x0b, 0x4db: 0x0c, 0x4dd: 0x0d, 0x4de: 0x0e, 0x4df: 0x0f, 0x4ef: 0x10, 0x4ff: 0x10, // Block 0x14, offset 0x500 0x50f: 0x10, 0x51f: 0x10, 0x52f: 0x10, 0x53f: 0x10, // Block 0x15, offset 0x540 0x540: 0xe0, 0x541: 0xe0, 0x542: 0xe0, 0x543: 0xe0, 0x544: 0x05, 0x545: 0x05, 0x546: 0x05, 0x547: 0xe1, 0x548: 0xe0, 0x549: 0xe0, 0x54a: 0xe0, 0x54b: 0xe0, 0x54c: 0xe0, 0x54d: 0xe0, 0x54e: 0xe0, 0x54f: 0xe0, 0x550: 0xe0, 0x551: 0xe0, 0x552: 0xe0, 0x553: 0xe0, 0x554: 0xe0, 0x555: 0xe0, 0x556: 0xe0, 0x557: 0xe0, 0x558: 0xe0, 0x559: 0xe0, 0x55a: 0xe0, 0x55b: 0xe0, 0x55c: 0xe0, 0x55d: 0xe0, 0x55e: 0xe0, 0x55f: 0xe0, 0x560: 0xe0, 0x561: 0xe0, 0x562: 0xe0, 0x563: 0xe0, 0x564: 0xe0, 0x565: 0xe0, 0x566: 0xe0, 0x567: 0xe0, 0x568: 0xe0, 0x569: 0xe0, 0x56a: 0xe0, 0x56b: 0xe0, 0x56c: 0xe0, 0x56d: 0xe0, 0x56e: 0xe0, 0x56f: 0xe0, 0x570: 0xe0, 0x571: 0xe0, 0x572: 0xe0, 0x573: 0xe0, 0x574: 0xe0, 0x575: 0xe0, 0x576: 0xe0, 0x577: 0xe0, 0x578: 0xe0, 0x579: 0xe0, 0x57a: 0xe0, 0x57b: 0xe0, 0x57c: 0xe0, 0x57d: 0xe0, 0x57e: 0xe0, 0x57f: 0xe0, // Block 0x16, offset 0x580 0x58f: 0x10, 0x59f: 0x10, 0x5a0: 0x13, 0x5af: 0x10, 0x5bf: 0x10, // Block 0x17, offset 0x5c0 0x5cf: 0x10, } // Total table size 16184 bytes (15KiB); checksum: F50EF68C ================================================ FILE: vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go ================================================ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. // +build !go1.10 package bidi // UnicodeVersion is the Unicode version from which the tables in this package are derived. const UnicodeVersion = "9.0.0" // xorMasks contains masks to be xor-ed with brackets to get the reverse // version. var xorMasks = []int32{ // 8 elements 0, 1, 6, 7, 3, 15, 29, 63, } // Size: 56 bytes // lookup returns the trie value for the first UTF-8 encoding in s and // the width in bytes of this encoding. The size will be 0 if s does not // hold enough bytes to complete the encoding. len(s) must be greater than 0. func (t *bidiTrie) lookup(s []byte) (v uint8, sz int) { c0 := s[0] switch { case c0 < 0x80: // is ASCII return bidiValues[c0], 1 case c0 < 0xC2: return 0, 1 // Illegal UTF-8: not a starter, not ASCII. case c0 < 0xE0: // 2-byte UTF-8 if len(s) < 2 { return 0, 0 } i := bidiIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c1), 2 case c0 < 0xF0: // 3-byte UTF-8 if len(s) < 3 { return 0, 0 } i := bidiIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } o := uint32(i)<<6 + uint32(c1) i = bidiIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return 0, 2 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c2), 3 case c0 < 0xF8: // 4-byte UTF-8 if len(s) < 4 { return 0, 0 } i := bidiIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } o := uint32(i)<<6 + uint32(c1) i = bidiIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return 0, 2 // Illegal UTF-8: not a continuation byte. } o = uint32(i)<<6 + uint32(c2) i = bidiIndex[o] c3 := s[3] if c3 < 0x80 || 0xC0 <= c3 { return 0, 3 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c3), 4 } // Illegal rune return 0, 1 } // lookupUnsafe returns the trie value for the first UTF-8 encoding in s. // s must start with a full and valid UTF-8 encoded rune. func (t *bidiTrie) lookupUnsafe(s []byte) uint8 { c0 := s[0] if c0 < 0x80 { // is ASCII return bidiValues[c0] } i := bidiIndex[c0] if c0 < 0xE0 { // 2-byte UTF-8 return t.lookupValue(uint32(i), s[1]) } i = bidiIndex[uint32(i)<<6+uint32(s[1])] if c0 < 0xF0 { // 3-byte UTF-8 return t.lookupValue(uint32(i), s[2]) } i = bidiIndex[uint32(i)<<6+uint32(s[2])] if c0 < 0xF8 { // 4-byte UTF-8 return t.lookupValue(uint32(i), s[3]) } return 0 } // lookupString returns the trie value for the first UTF-8 encoding in s and // the width in bytes of this encoding. The size will be 0 if s does not // hold enough bytes to complete the encoding. len(s) must be greater than 0. func (t *bidiTrie) lookupString(s string) (v uint8, sz int) { c0 := s[0] switch { case c0 < 0x80: // is ASCII return bidiValues[c0], 1 case c0 < 0xC2: return 0, 1 // Illegal UTF-8: not a starter, not ASCII. case c0 < 0xE0: // 2-byte UTF-8 if len(s) < 2 { return 0, 0 } i := bidiIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c1), 2 case c0 < 0xF0: // 3-byte UTF-8 if len(s) < 3 { return 0, 0 } i := bidiIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } o := uint32(i)<<6 + uint32(c1) i = bidiIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return 0, 2 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c2), 3 case c0 < 0xF8: // 4-byte UTF-8 if len(s) < 4 { return 0, 0 } i := bidiIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } o := uint32(i)<<6 + uint32(c1) i = bidiIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return 0, 2 // Illegal UTF-8: not a continuation byte. } o = uint32(i)<<6 + uint32(c2) i = bidiIndex[o] c3 := s[3] if c3 < 0x80 || 0xC0 <= c3 { return 0, 3 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c3), 4 } // Illegal rune return 0, 1 } // lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. // s must start with a full and valid UTF-8 encoded rune. func (t *bidiTrie) lookupStringUnsafe(s string) uint8 { c0 := s[0] if c0 < 0x80 { // is ASCII return bidiValues[c0] } i := bidiIndex[c0] if c0 < 0xE0 { // 2-byte UTF-8 return t.lookupValue(uint32(i), s[1]) } i = bidiIndex[uint32(i)<<6+uint32(s[1])] if c0 < 0xF0 { // 3-byte UTF-8 return t.lookupValue(uint32(i), s[2]) } i = bidiIndex[uint32(i)<<6+uint32(s[2])] if c0 < 0xF8 { // 4-byte UTF-8 return t.lookupValue(uint32(i), s[3]) } return 0 } // bidiTrie. Total size: 15744 bytes (15.38 KiB). Checksum: b4c3b70954803b86. type bidiTrie struct{} func newBidiTrie(i int) *bidiTrie { return &bidiTrie{} } // lookupValue determines the type of block n and looks up the value for b. func (t *bidiTrie) lookupValue(n uint32, b byte) uint8 { switch { default: return uint8(bidiValues[n<<6+uint32(b)]) } } // bidiValues: 222 blocks, 14208 entries, 14208 bytes // The third block is the zero block. var bidiValues = [14208]uint8{ // Block 0x0, offset 0x0 0x00: 0x000b, 0x01: 0x000b, 0x02: 0x000b, 0x03: 0x000b, 0x04: 0x000b, 0x05: 0x000b, 0x06: 0x000b, 0x07: 0x000b, 0x08: 0x000b, 0x09: 0x0008, 0x0a: 0x0007, 0x0b: 0x0008, 0x0c: 0x0009, 0x0d: 0x0007, 0x0e: 0x000b, 0x0f: 0x000b, 0x10: 0x000b, 0x11: 0x000b, 0x12: 0x000b, 0x13: 0x000b, 0x14: 0x000b, 0x15: 0x000b, 0x16: 0x000b, 0x17: 0x000b, 0x18: 0x000b, 0x19: 0x000b, 0x1a: 0x000b, 0x1b: 0x000b, 0x1c: 0x0007, 0x1d: 0x0007, 0x1e: 0x0007, 0x1f: 0x0008, 0x20: 0x0009, 0x21: 0x000a, 0x22: 0x000a, 0x23: 0x0004, 0x24: 0x0004, 0x25: 0x0004, 0x26: 0x000a, 0x27: 0x000a, 0x28: 0x003a, 0x29: 0x002a, 0x2a: 0x000a, 0x2b: 0x0003, 0x2c: 0x0006, 0x2d: 0x0003, 0x2e: 0x0006, 0x2f: 0x0006, 0x30: 0x0002, 0x31: 0x0002, 0x32: 0x0002, 0x33: 0x0002, 0x34: 0x0002, 0x35: 0x0002, 0x36: 0x0002, 0x37: 0x0002, 0x38: 0x0002, 0x39: 0x0002, 0x3a: 0x0006, 0x3b: 0x000a, 0x3c: 0x000a, 0x3d: 0x000a, 0x3e: 0x000a, 0x3f: 0x000a, // Block 0x1, offset 0x40 0x40: 0x000a, 0x5b: 0x005a, 0x5c: 0x000a, 0x5d: 0x004a, 0x5e: 0x000a, 0x5f: 0x000a, 0x60: 0x000a, 0x7b: 0x005a, 0x7c: 0x000a, 0x7d: 0x004a, 0x7e: 0x000a, 0x7f: 0x000b, // Block 0x2, offset 0x80 // Block 0x3, offset 0xc0 0xc0: 0x000b, 0xc1: 0x000b, 0xc2: 0x000b, 0xc3: 0x000b, 0xc4: 0x000b, 0xc5: 0x0007, 0xc6: 0x000b, 0xc7: 0x000b, 0xc8: 0x000b, 0xc9: 0x000b, 0xca: 0x000b, 0xcb: 0x000b, 0xcc: 0x000b, 0xcd: 0x000b, 0xce: 0x000b, 0xcf: 0x000b, 0xd0: 0x000b, 0xd1: 0x000b, 0xd2: 0x000b, 0xd3: 0x000b, 0xd4: 0x000b, 0xd5: 0x000b, 0xd6: 0x000b, 0xd7: 0x000b, 0xd8: 0x000b, 0xd9: 0x000b, 0xda: 0x000b, 0xdb: 0x000b, 0xdc: 0x000b, 0xdd: 0x000b, 0xde: 0x000b, 0xdf: 0x000b, 0xe0: 0x0006, 0xe1: 0x000a, 0xe2: 0x0004, 0xe3: 0x0004, 0xe4: 0x0004, 0xe5: 0x0004, 0xe6: 0x000a, 0xe7: 0x000a, 0xe8: 0x000a, 0xe9: 0x000a, 0xeb: 0x000a, 0xec: 0x000a, 0xed: 0x000b, 0xee: 0x000a, 0xef: 0x000a, 0xf0: 0x0004, 0xf1: 0x0004, 0xf2: 0x0002, 0xf3: 0x0002, 0xf4: 0x000a, 0xf6: 0x000a, 0xf7: 0x000a, 0xf8: 0x000a, 0xf9: 0x0002, 0xfb: 0x000a, 0xfc: 0x000a, 0xfd: 0x000a, 0xfe: 0x000a, 0xff: 0x000a, // Block 0x4, offset 0x100 0x117: 0x000a, 0x137: 0x000a, // Block 0x5, offset 0x140 0x179: 0x000a, 0x17a: 0x000a, // Block 0x6, offset 0x180 0x182: 0x000a, 0x183: 0x000a, 0x184: 0x000a, 0x185: 0x000a, 0x186: 0x000a, 0x187: 0x000a, 0x188: 0x000a, 0x189: 0x000a, 0x18a: 0x000a, 0x18b: 0x000a, 0x18c: 0x000a, 0x18d: 0x000a, 0x18e: 0x000a, 0x18f: 0x000a, 0x192: 0x000a, 0x193: 0x000a, 0x194: 0x000a, 0x195: 0x000a, 0x196: 0x000a, 0x197: 0x000a, 0x198: 0x000a, 0x199: 0x000a, 0x19a: 0x000a, 0x19b: 0x000a, 0x19c: 0x000a, 0x19d: 0x000a, 0x19e: 0x000a, 0x19f: 0x000a, 0x1a5: 0x000a, 0x1a6: 0x000a, 0x1a7: 0x000a, 0x1a8: 0x000a, 0x1a9: 0x000a, 0x1aa: 0x000a, 0x1ab: 0x000a, 0x1ac: 0x000a, 0x1ad: 0x000a, 0x1af: 0x000a, 0x1b0: 0x000a, 0x1b1: 0x000a, 0x1b2: 0x000a, 0x1b3: 0x000a, 0x1b4: 0x000a, 0x1b5: 0x000a, 0x1b6: 0x000a, 0x1b7: 0x000a, 0x1b8: 0x000a, 0x1b9: 0x000a, 0x1ba: 0x000a, 0x1bb: 0x000a, 0x1bc: 0x000a, 0x1bd: 0x000a, 0x1be: 0x000a, 0x1bf: 0x000a, // Block 0x7, offset 0x1c0 0x1c0: 0x000c, 0x1c1: 0x000c, 0x1c2: 0x000c, 0x1c3: 0x000c, 0x1c4: 0x000c, 0x1c5: 0x000c, 0x1c6: 0x000c, 0x1c7: 0x000c, 0x1c8: 0x000c, 0x1c9: 0x000c, 0x1ca: 0x000c, 0x1cb: 0x000c, 0x1cc: 0x000c, 0x1cd: 0x000c, 0x1ce: 0x000c, 0x1cf: 0x000c, 0x1d0: 0x000c, 0x1d1: 0x000c, 0x1d2: 0x000c, 0x1d3: 0x000c, 0x1d4: 0x000c, 0x1d5: 0x000c, 0x1d6: 0x000c, 0x1d7: 0x000c, 0x1d8: 0x000c, 0x1d9: 0x000c, 0x1da: 0x000c, 0x1db: 0x000c, 0x1dc: 0x000c, 0x1dd: 0x000c, 0x1de: 0x000c, 0x1df: 0x000c, 0x1e0: 0x000c, 0x1e1: 0x000c, 0x1e2: 0x000c, 0x1e3: 0x000c, 0x1e4: 0x000c, 0x1e5: 0x000c, 0x1e6: 0x000c, 0x1e7: 0x000c, 0x1e8: 0x000c, 0x1e9: 0x000c, 0x1ea: 0x000c, 0x1eb: 0x000c, 0x1ec: 0x000c, 0x1ed: 0x000c, 0x1ee: 0x000c, 0x1ef: 0x000c, 0x1f0: 0x000c, 0x1f1: 0x000c, 0x1f2: 0x000c, 0x1f3: 0x000c, 0x1f4: 0x000c, 0x1f5: 0x000c, 0x1f6: 0x000c, 0x1f7: 0x000c, 0x1f8: 0x000c, 0x1f9: 0x000c, 0x1fa: 0x000c, 0x1fb: 0x000c, 0x1fc: 0x000c, 0x1fd: 0x000c, 0x1fe: 0x000c, 0x1ff: 0x000c, // Block 0x8, offset 0x200 0x200: 0x000c, 0x201: 0x000c, 0x202: 0x000c, 0x203: 0x000c, 0x204: 0x000c, 0x205: 0x000c, 0x206: 0x000c, 0x207: 0x000c, 0x208: 0x000c, 0x209: 0x000c, 0x20a: 0x000c, 0x20b: 0x000c, 0x20c: 0x000c, 0x20d: 0x000c, 0x20e: 0x000c, 0x20f: 0x000c, 0x210: 0x000c, 0x211: 0x000c, 0x212: 0x000c, 0x213: 0x000c, 0x214: 0x000c, 0x215: 0x000c, 0x216: 0x000c, 0x217: 0x000c, 0x218: 0x000c, 0x219: 0x000c, 0x21a: 0x000c, 0x21b: 0x000c, 0x21c: 0x000c, 0x21d: 0x000c, 0x21e: 0x000c, 0x21f: 0x000c, 0x220: 0x000c, 0x221: 0x000c, 0x222: 0x000c, 0x223: 0x000c, 0x224: 0x000c, 0x225: 0x000c, 0x226: 0x000c, 0x227: 0x000c, 0x228: 0x000c, 0x229: 0x000c, 0x22a: 0x000c, 0x22b: 0x000c, 0x22c: 0x000c, 0x22d: 0x000c, 0x22e: 0x000c, 0x22f: 0x000c, 0x234: 0x000a, 0x235: 0x000a, 0x23e: 0x000a, // Block 0x9, offset 0x240 0x244: 0x000a, 0x245: 0x000a, 0x247: 0x000a, // Block 0xa, offset 0x280 0x2b6: 0x000a, // Block 0xb, offset 0x2c0 0x2c3: 0x000c, 0x2c4: 0x000c, 0x2c5: 0x000c, 0x2c6: 0x000c, 0x2c7: 0x000c, 0x2c8: 0x000c, 0x2c9: 0x000c, // Block 0xc, offset 0x300 0x30a: 0x000a, 0x30d: 0x000a, 0x30e: 0x000a, 0x30f: 0x0004, 0x310: 0x0001, 0x311: 0x000c, 0x312: 0x000c, 0x313: 0x000c, 0x314: 0x000c, 0x315: 0x000c, 0x316: 0x000c, 0x317: 0x000c, 0x318: 0x000c, 0x319: 0x000c, 0x31a: 0x000c, 0x31b: 0x000c, 0x31c: 0x000c, 0x31d: 0x000c, 0x31e: 0x000c, 0x31f: 0x000c, 0x320: 0x000c, 0x321: 0x000c, 0x322: 0x000c, 0x323: 0x000c, 0x324: 0x000c, 0x325: 0x000c, 0x326: 0x000c, 0x327: 0x000c, 0x328: 0x000c, 0x329: 0x000c, 0x32a: 0x000c, 0x32b: 0x000c, 0x32c: 0x000c, 0x32d: 0x000c, 0x32e: 0x000c, 0x32f: 0x000c, 0x330: 0x000c, 0x331: 0x000c, 0x332: 0x000c, 0x333: 0x000c, 0x334: 0x000c, 0x335: 0x000c, 0x336: 0x000c, 0x337: 0x000c, 0x338: 0x000c, 0x339: 0x000c, 0x33a: 0x000c, 0x33b: 0x000c, 0x33c: 0x000c, 0x33d: 0x000c, 0x33e: 0x0001, 0x33f: 0x000c, // Block 0xd, offset 0x340 0x340: 0x0001, 0x341: 0x000c, 0x342: 0x000c, 0x343: 0x0001, 0x344: 0x000c, 0x345: 0x000c, 0x346: 0x0001, 0x347: 0x000c, 0x348: 0x0001, 0x349: 0x0001, 0x34a: 0x0001, 0x34b: 0x0001, 0x34c: 0x0001, 0x34d: 0x0001, 0x34e: 0x0001, 0x34f: 0x0001, 0x350: 0x0001, 0x351: 0x0001, 0x352: 0x0001, 0x353: 0x0001, 0x354: 0x0001, 0x355: 0x0001, 0x356: 0x0001, 0x357: 0x0001, 0x358: 0x0001, 0x359: 0x0001, 0x35a: 0x0001, 0x35b: 0x0001, 0x35c: 0x0001, 0x35d: 0x0001, 0x35e: 0x0001, 0x35f: 0x0001, 0x360: 0x0001, 0x361: 0x0001, 0x362: 0x0001, 0x363: 0x0001, 0x364: 0x0001, 0x365: 0x0001, 0x366: 0x0001, 0x367: 0x0001, 0x368: 0x0001, 0x369: 0x0001, 0x36a: 0x0001, 0x36b: 0x0001, 0x36c: 0x0001, 0x36d: 0x0001, 0x36e: 0x0001, 0x36f: 0x0001, 0x370: 0x0001, 0x371: 0x0001, 0x372: 0x0001, 0x373: 0x0001, 0x374: 0x0001, 0x375: 0x0001, 0x376: 0x0001, 0x377: 0x0001, 0x378: 0x0001, 0x379: 0x0001, 0x37a: 0x0001, 0x37b: 0x0001, 0x37c: 0x0001, 0x37d: 0x0001, 0x37e: 0x0001, 0x37f: 0x0001, // Block 0xe, offset 0x380 0x380: 0x0005, 0x381: 0x0005, 0x382: 0x0005, 0x383: 0x0005, 0x384: 0x0005, 0x385: 0x0005, 0x386: 0x000a, 0x387: 0x000a, 0x388: 0x000d, 0x389: 0x0004, 0x38a: 0x0004, 0x38b: 0x000d, 0x38c: 0x0006, 0x38d: 0x000d, 0x38e: 0x000a, 0x38f: 0x000a, 0x390: 0x000c, 0x391: 0x000c, 0x392: 0x000c, 0x393: 0x000c, 0x394: 0x000c, 0x395: 0x000c, 0x396: 0x000c, 0x397: 0x000c, 0x398: 0x000c, 0x399: 0x000c, 0x39a: 0x000c, 0x39b: 0x000d, 0x39c: 0x000d, 0x39d: 0x000d, 0x39e: 0x000d, 0x39f: 0x000d, 0x3a0: 0x000d, 0x3a1: 0x000d, 0x3a2: 0x000d, 0x3a3: 0x000d, 0x3a4: 0x000d, 0x3a5: 0x000d, 0x3a6: 0x000d, 0x3a7: 0x000d, 0x3a8: 0x000d, 0x3a9: 0x000d, 0x3aa: 0x000d, 0x3ab: 0x000d, 0x3ac: 0x000d, 0x3ad: 0x000d, 0x3ae: 0x000d, 0x3af: 0x000d, 0x3b0: 0x000d, 0x3b1: 0x000d, 0x3b2: 0x000d, 0x3b3: 0x000d, 0x3b4: 0x000d, 0x3b5: 0x000d, 0x3b6: 0x000d, 0x3b7: 0x000d, 0x3b8: 0x000d, 0x3b9: 0x000d, 0x3ba: 0x000d, 0x3bb: 0x000d, 0x3bc: 0x000d, 0x3bd: 0x000d, 0x3be: 0x000d, 0x3bf: 0x000d, // Block 0xf, offset 0x3c0 0x3c0: 0x000d, 0x3c1: 0x000d, 0x3c2: 0x000d, 0x3c3: 0x000d, 0x3c4: 0x000d, 0x3c5: 0x000d, 0x3c6: 0x000d, 0x3c7: 0x000d, 0x3c8: 0x000d, 0x3c9: 0x000d, 0x3ca: 0x000d, 0x3cb: 0x000c, 0x3cc: 0x000c, 0x3cd: 0x000c, 0x3ce: 0x000c, 0x3cf: 0x000c, 0x3d0: 0x000c, 0x3d1: 0x000c, 0x3d2: 0x000c, 0x3d3: 0x000c, 0x3d4: 0x000c, 0x3d5: 0x000c, 0x3d6: 0x000c, 0x3d7: 0x000c, 0x3d8: 0x000c, 0x3d9: 0x000c, 0x3da: 0x000c, 0x3db: 0x000c, 0x3dc: 0x000c, 0x3dd: 0x000c, 0x3de: 0x000c, 0x3df: 0x000c, 0x3e0: 0x0005, 0x3e1: 0x0005, 0x3e2: 0x0005, 0x3e3: 0x0005, 0x3e4: 0x0005, 0x3e5: 0x0005, 0x3e6: 0x0005, 0x3e7: 0x0005, 0x3e8: 0x0005, 0x3e9: 0x0005, 0x3ea: 0x0004, 0x3eb: 0x0005, 0x3ec: 0x0005, 0x3ed: 0x000d, 0x3ee: 0x000d, 0x3ef: 0x000d, 0x3f0: 0x000c, 0x3f1: 0x000d, 0x3f2: 0x000d, 0x3f3: 0x000d, 0x3f4: 0x000d, 0x3f5: 0x000d, 0x3f6: 0x000d, 0x3f7: 0x000d, 0x3f8: 0x000d, 0x3f9: 0x000d, 0x3fa: 0x000d, 0x3fb: 0x000d, 0x3fc: 0x000d, 0x3fd: 0x000d, 0x3fe: 0x000d, 0x3ff: 0x000d, // Block 0x10, offset 0x400 0x400: 0x000d, 0x401: 0x000d, 0x402: 0x000d, 0x403: 0x000d, 0x404: 0x000d, 0x405: 0x000d, 0x406: 0x000d, 0x407: 0x000d, 0x408: 0x000d, 0x409: 0x000d, 0x40a: 0x000d, 0x40b: 0x000d, 0x40c: 0x000d, 0x40d: 0x000d, 0x40e: 0x000d, 0x40f: 0x000d, 0x410: 0x000d, 0x411: 0x000d, 0x412: 0x000d, 0x413: 0x000d, 0x414: 0x000d, 0x415: 0x000d, 0x416: 0x000d, 0x417: 0x000d, 0x418: 0x000d, 0x419: 0x000d, 0x41a: 0x000d, 0x41b: 0x000d, 0x41c: 0x000d, 0x41d: 0x000d, 0x41e: 0x000d, 0x41f: 0x000d, 0x420: 0x000d, 0x421: 0x000d, 0x422: 0x000d, 0x423: 0x000d, 0x424: 0x000d, 0x425: 0x000d, 0x426: 0x000d, 0x427: 0x000d, 0x428: 0x000d, 0x429: 0x000d, 0x42a: 0x000d, 0x42b: 0x000d, 0x42c: 0x000d, 0x42d: 0x000d, 0x42e: 0x000d, 0x42f: 0x000d, 0x430: 0x000d, 0x431: 0x000d, 0x432: 0x000d, 0x433: 0x000d, 0x434: 0x000d, 0x435: 0x000d, 0x436: 0x000d, 0x437: 0x000d, 0x438: 0x000d, 0x439: 0x000d, 0x43a: 0x000d, 0x43b: 0x000d, 0x43c: 0x000d, 0x43d: 0x000d, 0x43e: 0x000d, 0x43f: 0x000d, // Block 0x11, offset 0x440 0x440: 0x000d, 0x441: 0x000d, 0x442: 0x000d, 0x443: 0x000d, 0x444: 0x000d, 0x445: 0x000d, 0x446: 0x000d, 0x447: 0x000d, 0x448: 0x000d, 0x449: 0x000d, 0x44a: 0x000d, 0x44b: 0x000d, 0x44c: 0x000d, 0x44d: 0x000d, 0x44e: 0x000d, 0x44f: 0x000d, 0x450: 0x000d, 0x451: 0x000d, 0x452: 0x000d, 0x453: 0x000d, 0x454: 0x000d, 0x455: 0x000d, 0x456: 0x000c, 0x457: 0x000c, 0x458: 0x000c, 0x459: 0x000c, 0x45a: 0x000c, 0x45b: 0x000c, 0x45c: 0x000c, 0x45d: 0x0005, 0x45e: 0x000a, 0x45f: 0x000c, 0x460: 0x000c, 0x461: 0x000c, 0x462: 0x000c, 0x463: 0x000c, 0x464: 0x000c, 0x465: 0x000d, 0x466: 0x000d, 0x467: 0x000c, 0x468: 0x000c, 0x469: 0x000a, 0x46a: 0x000c, 0x46b: 0x000c, 0x46c: 0x000c, 0x46d: 0x000c, 0x46e: 0x000d, 0x46f: 0x000d, 0x470: 0x0002, 0x471: 0x0002, 0x472: 0x0002, 0x473: 0x0002, 0x474: 0x0002, 0x475: 0x0002, 0x476: 0x0002, 0x477: 0x0002, 0x478: 0x0002, 0x479: 0x0002, 0x47a: 0x000d, 0x47b: 0x000d, 0x47c: 0x000d, 0x47d: 0x000d, 0x47e: 0x000d, 0x47f: 0x000d, // Block 0x12, offset 0x480 0x480: 0x000d, 0x481: 0x000d, 0x482: 0x000d, 0x483: 0x000d, 0x484: 0x000d, 0x485: 0x000d, 0x486: 0x000d, 0x487: 0x000d, 0x488: 0x000d, 0x489: 0x000d, 0x48a: 0x000d, 0x48b: 0x000d, 0x48c: 0x000d, 0x48d: 0x000d, 0x48e: 0x000d, 0x48f: 0x000d, 0x490: 0x000d, 0x491: 0x000c, 0x492: 0x000d, 0x493: 0x000d, 0x494: 0x000d, 0x495: 0x000d, 0x496: 0x000d, 0x497: 0x000d, 0x498: 0x000d, 0x499: 0x000d, 0x49a: 0x000d, 0x49b: 0x000d, 0x49c: 0x000d, 0x49d: 0x000d, 0x49e: 0x000d, 0x49f: 0x000d, 0x4a0: 0x000d, 0x4a1: 0x000d, 0x4a2: 0x000d, 0x4a3: 0x000d, 0x4a4: 0x000d, 0x4a5: 0x000d, 0x4a6: 0x000d, 0x4a7: 0x000d, 0x4a8: 0x000d, 0x4a9: 0x000d, 0x4aa: 0x000d, 0x4ab: 0x000d, 0x4ac: 0x000d, 0x4ad: 0x000d, 0x4ae: 0x000d, 0x4af: 0x000d, 0x4b0: 0x000c, 0x4b1: 0x000c, 0x4b2: 0x000c, 0x4b3: 0x000c, 0x4b4: 0x000c, 0x4b5: 0x000c, 0x4b6: 0x000c, 0x4b7: 0x000c, 0x4b8: 0x000c, 0x4b9: 0x000c, 0x4ba: 0x000c, 0x4bb: 0x000c, 0x4bc: 0x000c, 0x4bd: 0x000c, 0x4be: 0x000c, 0x4bf: 0x000c, // Block 0x13, offset 0x4c0 0x4c0: 0x000c, 0x4c1: 0x000c, 0x4c2: 0x000c, 0x4c3: 0x000c, 0x4c4: 0x000c, 0x4c5: 0x000c, 0x4c6: 0x000c, 0x4c7: 0x000c, 0x4c8: 0x000c, 0x4c9: 0x000c, 0x4ca: 0x000c, 0x4cb: 0x000d, 0x4cc: 0x000d, 0x4cd: 0x000d, 0x4ce: 0x000d, 0x4cf: 0x000d, 0x4d0: 0x000d, 0x4d1: 0x000d, 0x4d2: 0x000d, 0x4d3: 0x000d, 0x4d4: 0x000d, 0x4d5: 0x000d, 0x4d6: 0x000d, 0x4d7: 0x000d, 0x4d8: 0x000d, 0x4d9: 0x000d, 0x4da: 0x000d, 0x4db: 0x000d, 0x4dc: 0x000d, 0x4dd: 0x000d, 0x4de: 0x000d, 0x4df: 0x000d, 0x4e0: 0x000d, 0x4e1: 0x000d, 0x4e2: 0x000d, 0x4e3: 0x000d, 0x4e4: 0x000d, 0x4e5: 0x000d, 0x4e6: 0x000d, 0x4e7: 0x000d, 0x4e8: 0x000d, 0x4e9: 0x000d, 0x4ea: 0x000d, 0x4eb: 0x000d, 0x4ec: 0x000d, 0x4ed: 0x000d, 0x4ee: 0x000d, 0x4ef: 0x000d, 0x4f0: 0x000d, 0x4f1: 0x000d, 0x4f2: 0x000d, 0x4f3: 0x000d, 0x4f4: 0x000d, 0x4f5: 0x000d, 0x4f6: 0x000d, 0x4f7: 0x000d, 0x4f8: 0x000d, 0x4f9: 0x000d, 0x4fa: 0x000d, 0x4fb: 0x000d, 0x4fc: 0x000d, 0x4fd: 0x000d, 0x4fe: 0x000d, 0x4ff: 0x000d, // Block 0x14, offset 0x500 0x500: 0x000d, 0x501: 0x000d, 0x502: 0x000d, 0x503: 0x000d, 0x504: 0x000d, 0x505: 0x000d, 0x506: 0x000d, 0x507: 0x000d, 0x508: 0x000d, 0x509: 0x000d, 0x50a: 0x000d, 0x50b: 0x000d, 0x50c: 0x000d, 0x50d: 0x000d, 0x50e: 0x000d, 0x50f: 0x000d, 0x510: 0x000d, 0x511: 0x000d, 0x512: 0x000d, 0x513: 0x000d, 0x514: 0x000d, 0x515: 0x000d, 0x516: 0x000d, 0x517: 0x000d, 0x518: 0x000d, 0x519: 0x000d, 0x51a: 0x000d, 0x51b: 0x000d, 0x51c: 0x000d, 0x51d: 0x000d, 0x51e: 0x000d, 0x51f: 0x000d, 0x520: 0x000d, 0x521: 0x000d, 0x522: 0x000d, 0x523: 0x000d, 0x524: 0x000d, 0x525: 0x000d, 0x526: 0x000c, 0x527: 0x000c, 0x528: 0x000c, 0x529: 0x000c, 0x52a: 0x000c, 0x52b: 0x000c, 0x52c: 0x000c, 0x52d: 0x000c, 0x52e: 0x000c, 0x52f: 0x000c, 0x530: 0x000c, 0x531: 0x000d, 0x532: 0x000d, 0x533: 0x000d, 0x534: 0x000d, 0x535: 0x000d, 0x536: 0x000d, 0x537: 0x000d, 0x538: 0x000d, 0x539: 0x000d, 0x53a: 0x000d, 0x53b: 0x000d, 0x53c: 0x000d, 0x53d: 0x000d, 0x53e: 0x000d, 0x53f: 0x000d, // Block 0x15, offset 0x540 0x540: 0x0001, 0x541: 0x0001, 0x542: 0x0001, 0x543: 0x0001, 0x544: 0x0001, 0x545: 0x0001, 0x546: 0x0001, 0x547: 0x0001, 0x548: 0x0001, 0x549: 0x0001, 0x54a: 0x0001, 0x54b: 0x0001, 0x54c: 0x0001, 0x54d: 0x0001, 0x54e: 0x0001, 0x54f: 0x0001, 0x550: 0x0001, 0x551: 0x0001, 0x552: 0x0001, 0x553: 0x0001, 0x554: 0x0001, 0x555: 0x0001, 0x556: 0x0001, 0x557: 0x0001, 0x558: 0x0001, 0x559: 0x0001, 0x55a: 0x0001, 0x55b: 0x0001, 0x55c: 0x0001, 0x55d: 0x0001, 0x55e: 0x0001, 0x55f: 0x0001, 0x560: 0x0001, 0x561: 0x0001, 0x562: 0x0001, 0x563: 0x0001, 0x564: 0x0001, 0x565: 0x0001, 0x566: 0x0001, 0x567: 0x0001, 0x568: 0x0001, 0x569: 0x0001, 0x56a: 0x0001, 0x56b: 0x000c, 0x56c: 0x000c, 0x56d: 0x000c, 0x56e: 0x000c, 0x56f: 0x000c, 0x570: 0x000c, 0x571: 0x000c, 0x572: 0x000c, 0x573: 0x000c, 0x574: 0x0001, 0x575: 0x0001, 0x576: 0x000a, 0x577: 0x000a, 0x578: 0x000a, 0x579: 0x000a, 0x57a: 0x0001, 0x57b: 0x0001, 0x57c: 0x0001, 0x57d: 0x0001, 0x57e: 0x0001, 0x57f: 0x0001, // Block 0x16, offset 0x580 0x580: 0x0001, 0x581: 0x0001, 0x582: 0x0001, 0x583: 0x0001, 0x584: 0x0001, 0x585: 0x0001, 0x586: 0x0001, 0x587: 0x0001, 0x588: 0x0001, 0x589: 0x0001, 0x58a: 0x0001, 0x58b: 0x0001, 0x58c: 0x0001, 0x58d: 0x0001, 0x58e: 0x0001, 0x58f: 0x0001, 0x590: 0x0001, 0x591: 0x0001, 0x592: 0x0001, 0x593: 0x0001, 0x594: 0x0001, 0x595: 0x0001, 0x596: 0x000c, 0x597: 0x000c, 0x598: 0x000c, 0x599: 0x000c, 0x59a: 0x0001, 0x59b: 0x000c, 0x59c: 0x000c, 0x59d: 0x000c, 0x59e: 0x000c, 0x59f: 0x000c, 0x5a0: 0x000c, 0x5a1: 0x000c, 0x5a2: 0x000c, 0x5a3: 0x000c, 0x5a4: 0x0001, 0x5a5: 0x000c, 0x5a6: 0x000c, 0x5a7: 0x000c, 0x5a8: 0x0001, 0x5a9: 0x000c, 0x5aa: 0x000c, 0x5ab: 0x000c, 0x5ac: 0x000c, 0x5ad: 0x000c, 0x5ae: 0x0001, 0x5af: 0x0001, 0x5b0: 0x0001, 0x5b1: 0x0001, 0x5b2: 0x0001, 0x5b3: 0x0001, 0x5b4: 0x0001, 0x5b5: 0x0001, 0x5b6: 0x0001, 0x5b7: 0x0001, 0x5b8: 0x0001, 0x5b9: 0x0001, 0x5ba: 0x0001, 0x5bb: 0x0001, 0x5bc: 0x0001, 0x5bd: 0x0001, 0x5be: 0x0001, 0x5bf: 0x0001, // Block 0x17, offset 0x5c0 0x5c0: 0x0001, 0x5c1: 0x0001, 0x5c2: 0x0001, 0x5c3: 0x0001, 0x5c4: 0x0001, 0x5c5: 0x0001, 0x5c6: 0x0001, 0x5c7: 0x0001, 0x5c8: 0x0001, 0x5c9: 0x0001, 0x5ca: 0x0001, 0x5cb: 0x0001, 0x5cc: 0x0001, 0x5cd: 0x0001, 0x5ce: 0x0001, 0x5cf: 0x0001, 0x5d0: 0x0001, 0x5d1: 0x0001, 0x5d2: 0x0001, 0x5d3: 0x0001, 0x5d4: 0x0001, 0x5d5: 0x0001, 0x5d6: 0x0001, 0x5d7: 0x0001, 0x5d8: 0x0001, 0x5d9: 0x000c, 0x5da: 0x000c, 0x5db: 0x000c, 0x5dc: 0x0001, 0x5dd: 0x0001, 0x5de: 0x0001, 0x5df: 0x0001, 0x5e0: 0x0001, 0x5e1: 0x0001, 0x5e2: 0x0001, 0x5e3: 0x0001, 0x5e4: 0x0001, 0x5e5: 0x0001, 0x5e6: 0x0001, 0x5e7: 0x0001, 0x5e8: 0x0001, 0x5e9: 0x0001, 0x5ea: 0x0001, 0x5eb: 0x0001, 0x5ec: 0x0001, 0x5ed: 0x0001, 0x5ee: 0x0001, 0x5ef: 0x0001, 0x5f0: 0x0001, 0x5f1: 0x0001, 0x5f2: 0x0001, 0x5f3: 0x0001, 0x5f4: 0x0001, 0x5f5: 0x0001, 0x5f6: 0x0001, 0x5f7: 0x0001, 0x5f8: 0x0001, 0x5f9: 0x0001, 0x5fa: 0x0001, 0x5fb: 0x0001, 0x5fc: 0x0001, 0x5fd: 0x0001, 0x5fe: 0x0001, 0x5ff: 0x0001, // Block 0x18, offset 0x600 0x600: 0x0001, 0x601: 0x0001, 0x602: 0x0001, 0x603: 0x0001, 0x604: 0x0001, 0x605: 0x0001, 0x606: 0x0001, 0x607: 0x0001, 0x608: 0x0001, 0x609: 0x0001, 0x60a: 0x0001, 0x60b: 0x0001, 0x60c: 0x0001, 0x60d: 0x0001, 0x60e: 0x0001, 0x60f: 0x0001, 0x610: 0x0001, 0x611: 0x0001, 0x612: 0x0001, 0x613: 0x0001, 0x614: 0x0001, 0x615: 0x0001, 0x616: 0x0001, 0x617: 0x0001, 0x618: 0x0001, 0x619: 0x0001, 0x61a: 0x0001, 0x61b: 0x0001, 0x61c: 0x0001, 0x61d: 0x0001, 0x61e: 0x0001, 0x61f: 0x0001, 0x620: 0x000d, 0x621: 0x000d, 0x622: 0x000d, 0x623: 0x000d, 0x624: 0x000d, 0x625: 0x000d, 0x626: 0x000d, 0x627: 0x000d, 0x628: 0x000d, 0x629: 0x000d, 0x62a: 0x000d, 0x62b: 0x000d, 0x62c: 0x000d, 0x62d: 0x000d, 0x62e: 0x000d, 0x62f: 0x000d, 0x630: 0x000d, 0x631: 0x000d, 0x632: 0x000d, 0x633: 0x000d, 0x634: 0x000d, 0x635: 0x000d, 0x636: 0x000d, 0x637: 0x000d, 0x638: 0x000d, 0x639: 0x000d, 0x63a: 0x000d, 0x63b: 0x000d, 0x63c: 0x000d, 0x63d: 0x000d, 0x63e: 0x000d, 0x63f: 0x000d, // Block 0x19, offset 0x640 0x640: 0x000d, 0x641: 0x000d, 0x642: 0x000d, 0x643: 0x000d, 0x644: 0x000d, 0x645: 0x000d, 0x646: 0x000d, 0x647: 0x000d, 0x648: 0x000d, 0x649: 0x000d, 0x64a: 0x000d, 0x64b: 0x000d, 0x64c: 0x000d, 0x64d: 0x000d, 0x64e: 0x000d, 0x64f: 0x000d, 0x650: 0x000d, 0x651: 0x000d, 0x652: 0x000d, 0x653: 0x000d, 0x654: 0x000c, 0x655: 0x000c, 0x656: 0x000c, 0x657: 0x000c, 0x658: 0x000c, 0x659: 0x000c, 0x65a: 0x000c, 0x65b: 0x000c, 0x65c: 0x000c, 0x65d: 0x000c, 0x65e: 0x000c, 0x65f: 0x000c, 0x660: 0x000c, 0x661: 0x000c, 0x662: 0x0005, 0x663: 0x000c, 0x664: 0x000c, 0x665: 0x000c, 0x666: 0x000c, 0x667: 0x000c, 0x668: 0x000c, 0x669: 0x000c, 0x66a: 0x000c, 0x66b: 0x000c, 0x66c: 0x000c, 0x66d: 0x000c, 0x66e: 0x000c, 0x66f: 0x000c, 0x670: 0x000c, 0x671: 0x000c, 0x672: 0x000c, 0x673: 0x000c, 0x674: 0x000c, 0x675: 0x000c, 0x676: 0x000c, 0x677: 0x000c, 0x678: 0x000c, 0x679: 0x000c, 0x67a: 0x000c, 0x67b: 0x000c, 0x67c: 0x000c, 0x67d: 0x000c, 0x67e: 0x000c, 0x67f: 0x000c, // Block 0x1a, offset 0x680 0x680: 0x000c, 0x681: 0x000c, 0x682: 0x000c, 0x6ba: 0x000c, 0x6bc: 0x000c, // Block 0x1b, offset 0x6c0 0x6c1: 0x000c, 0x6c2: 0x000c, 0x6c3: 0x000c, 0x6c4: 0x000c, 0x6c5: 0x000c, 0x6c6: 0x000c, 0x6c7: 0x000c, 0x6c8: 0x000c, 0x6cd: 0x000c, 0x6d1: 0x000c, 0x6d2: 0x000c, 0x6d3: 0x000c, 0x6d4: 0x000c, 0x6d5: 0x000c, 0x6d6: 0x000c, 0x6d7: 0x000c, 0x6e2: 0x000c, 0x6e3: 0x000c, // Block 0x1c, offset 0x700 0x701: 0x000c, 0x73c: 0x000c, // Block 0x1d, offset 0x740 0x741: 0x000c, 0x742: 0x000c, 0x743: 0x000c, 0x744: 0x000c, 0x74d: 0x000c, 0x762: 0x000c, 0x763: 0x000c, 0x772: 0x0004, 0x773: 0x0004, 0x77b: 0x0004, // Block 0x1e, offset 0x780 0x781: 0x000c, 0x782: 0x000c, 0x7bc: 0x000c, // Block 0x1f, offset 0x7c0 0x7c1: 0x000c, 0x7c2: 0x000c, 0x7c7: 0x000c, 0x7c8: 0x000c, 0x7cb: 0x000c, 0x7cc: 0x000c, 0x7cd: 0x000c, 0x7d1: 0x000c, 0x7f0: 0x000c, 0x7f1: 0x000c, 0x7f5: 0x000c, // Block 0x20, offset 0x800 0x801: 0x000c, 0x802: 0x000c, 0x803: 0x000c, 0x804: 0x000c, 0x805: 0x000c, 0x807: 0x000c, 0x808: 0x000c, 0x80d: 0x000c, 0x822: 0x000c, 0x823: 0x000c, 0x831: 0x0004, // Block 0x21, offset 0x840 0x841: 0x000c, 0x87c: 0x000c, 0x87f: 0x000c, // Block 0x22, offset 0x880 0x881: 0x000c, 0x882: 0x000c, 0x883: 0x000c, 0x884: 0x000c, 0x88d: 0x000c, 0x896: 0x000c, 0x8a2: 0x000c, 0x8a3: 0x000c, // Block 0x23, offset 0x8c0 0x8c2: 0x000c, // Block 0x24, offset 0x900 0x900: 0x000c, 0x90d: 0x000c, 0x933: 0x000a, 0x934: 0x000a, 0x935: 0x000a, 0x936: 0x000a, 0x937: 0x000a, 0x938: 0x000a, 0x939: 0x0004, 0x93a: 0x000a, // Block 0x25, offset 0x940 0x940: 0x000c, 0x97e: 0x000c, 0x97f: 0x000c, // Block 0x26, offset 0x980 0x980: 0x000c, 0x986: 0x000c, 0x987: 0x000c, 0x988: 0x000c, 0x98a: 0x000c, 0x98b: 0x000c, 0x98c: 0x000c, 0x98d: 0x000c, 0x995: 0x000c, 0x996: 0x000c, 0x9a2: 0x000c, 0x9a3: 0x000c, 0x9b8: 0x000a, 0x9b9: 0x000a, 0x9ba: 0x000a, 0x9bb: 0x000a, 0x9bc: 0x000a, 0x9bd: 0x000a, 0x9be: 0x000a, // Block 0x27, offset 0x9c0 0x9cc: 0x000c, 0x9cd: 0x000c, 0x9e2: 0x000c, 0x9e3: 0x000c, // Block 0x28, offset 0xa00 0xa01: 0x000c, // Block 0x29, offset 0xa40 0xa41: 0x000c, 0xa42: 0x000c, 0xa43: 0x000c, 0xa44: 0x000c, 0xa4d: 0x000c, 0xa62: 0x000c, 0xa63: 0x000c, // Block 0x2a, offset 0xa80 0xa8a: 0x000c, 0xa92: 0x000c, 0xa93: 0x000c, 0xa94: 0x000c, 0xa96: 0x000c, // Block 0x2b, offset 0xac0 0xaf1: 0x000c, 0xaf4: 0x000c, 0xaf5: 0x000c, 0xaf6: 0x000c, 0xaf7: 0x000c, 0xaf8: 0x000c, 0xaf9: 0x000c, 0xafa: 0x000c, 0xaff: 0x0004, // Block 0x2c, offset 0xb00 0xb07: 0x000c, 0xb08: 0x000c, 0xb09: 0x000c, 0xb0a: 0x000c, 0xb0b: 0x000c, 0xb0c: 0x000c, 0xb0d: 0x000c, 0xb0e: 0x000c, // Block 0x2d, offset 0xb40 0xb71: 0x000c, 0xb74: 0x000c, 0xb75: 0x000c, 0xb76: 0x000c, 0xb77: 0x000c, 0xb78: 0x000c, 0xb79: 0x000c, 0xb7b: 0x000c, 0xb7c: 0x000c, // Block 0x2e, offset 0xb80 0xb88: 0x000c, 0xb89: 0x000c, 0xb8a: 0x000c, 0xb8b: 0x000c, 0xb8c: 0x000c, 0xb8d: 0x000c, // Block 0x2f, offset 0xbc0 0xbd8: 0x000c, 0xbd9: 0x000c, 0xbf5: 0x000c, 0xbf7: 0x000c, 0xbf9: 0x000c, 0xbfa: 0x003a, 0xbfb: 0x002a, 0xbfc: 0x003a, 0xbfd: 0x002a, // Block 0x30, offset 0xc00 0xc31: 0x000c, 0xc32: 0x000c, 0xc33: 0x000c, 0xc34: 0x000c, 0xc35: 0x000c, 0xc36: 0x000c, 0xc37: 0x000c, 0xc38: 0x000c, 0xc39: 0x000c, 0xc3a: 0x000c, 0xc3b: 0x000c, 0xc3c: 0x000c, 0xc3d: 0x000c, 0xc3e: 0x000c, // Block 0x31, offset 0xc40 0xc40: 0x000c, 0xc41: 0x000c, 0xc42: 0x000c, 0xc43: 0x000c, 0xc44: 0x000c, 0xc46: 0x000c, 0xc47: 0x000c, 0xc4d: 0x000c, 0xc4e: 0x000c, 0xc4f: 0x000c, 0xc50: 0x000c, 0xc51: 0x000c, 0xc52: 0x000c, 0xc53: 0x000c, 0xc54: 0x000c, 0xc55: 0x000c, 0xc56: 0x000c, 0xc57: 0x000c, 0xc59: 0x000c, 0xc5a: 0x000c, 0xc5b: 0x000c, 0xc5c: 0x000c, 0xc5d: 0x000c, 0xc5e: 0x000c, 0xc5f: 0x000c, 0xc60: 0x000c, 0xc61: 0x000c, 0xc62: 0x000c, 0xc63: 0x000c, 0xc64: 0x000c, 0xc65: 0x000c, 0xc66: 0x000c, 0xc67: 0x000c, 0xc68: 0x000c, 0xc69: 0x000c, 0xc6a: 0x000c, 0xc6b: 0x000c, 0xc6c: 0x000c, 0xc6d: 0x000c, 0xc6e: 0x000c, 0xc6f: 0x000c, 0xc70: 0x000c, 0xc71: 0x000c, 0xc72: 0x000c, 0xc73: 0x000c, 0xc74: 0x000c, 0xc75: 0x000c, 0xc76: 0x000c, 0xc77: 0x000c, 0xc78: 0x000c, 0xc79: 0x000c, 0xc7a: 0x000c, 0xc7b: 0x000c, 0xc7c: 0x000c, // Block 0x32, offset 0xc80 0xc86: 0x000c, // Block 0x33, offset 0xcc0 0xced: 0x000c, 0xcee: 0x000c, 0xcef: 0x000c, 0xcf0: 0x000c, 0xcf2: 0x000c, 0xcf3: 0x000c, 0xcf4: 0x000c, 0xcf5: 0x000c, 0xcf6: 0x000c, 0xcf7: 0x000c, 0xcf9: 0x000c, 0xcfa: 0x000c, 0xcfd: 0x000c, 0xcfe: 0x000c, // Block 0x34, offset 0xd00 0xd18: 0x000c, 0xd19: 0x000c, 0xd1e: 0x000c, 0xd1f: 0x000c, 0xd20: 0x000c, 0xd31: 0x000c, 0xd32: 0x000c, 0xd33: 0x000c, 0xd34: 0x000c, // Block 0x35, offset 0xd40 0xd42: 0x000c, 0xd45: 0x000c, 0xd46: 0x000c, 0xd4d: 0x000c, 0xd5d: 0x000c, // Block 0x36, offset 0xd80 0xd9d: 0x000c, 0xd9e: 0x000c, 0xd9f: 0x000c, // Block 0x37, offset 0xdc0 0xdd0: 0x000a, 0xdd1: 0x000a, 0xdd2: 0x000a, 0xdd3: 0x000a, 0xdd4: 0x000a, 0xdd5: 0x000a, 0xdd6: 0x000a, 0xdd7: 0x000a, 0xdd8: 0x000a, 0xdd9: 0x000a, // Block 0x38, offset 0xe00 0xe00: 0x000a, // Block 0x39, offset 0xe40 0xe40: 0x0009, 0xe5b: 0x007a, 0xe5c: 0x006a, // Block 0x3a, offset 0xe80 0xe92: 0x000c, 0xe93: 0x000c, 0xe94: 0x000c, 0xeb2: 0x000c, 0xeb3: 0x000c, 0xeb4: 0x000c, // Block 0x3b, offset 0xec0 0xed2: 0x000c, 0xed3: 0x000c, 0xef2: 0x000c, 0xef3: 0x000c, // Block 0x3c, offset 0xf00 0xf34: 0x000c, 0xf35: 0x000c, 0xf37: 0x000c, 0xf38: 0x000c, 0xf39: 0x000c, 0xf3a: 0x000c, 0xf3b: 0x000c, 0xf3c: 0x000c, 0xf3d: 0x000c, // Block 0x3d, offset 0xf40 0xf46: 0x000c, 0xf49: 0x000c, 0xf4a: 0x000c, 0xf4b: 0x000c, 0xf4c: 0x000c, 0xf4d: 0x000c, 0xf4e: 0x000c, 0xf4f: 0x000c, 0xf50: 0x000c, 0xf51: 0x000c, 0xf52: 0x000c, 0xf53: 0x000c, 0xf5b: 0x0004, 0xf5d: 0x000c, 0xf70: 0x000a, 0xf71: 0x000a, 0xf72: 0x000a, 0xf73: 0x000a, 0xf74: 0x000a, 0xf75: 0x000a, 0xf76: 0x000a, 0xf77: 0x000a, 0xf78: 0x000a, 0xf79: 0x000a, // Block 0x3e, offset 0xf80 0xf80: 0x000a, 0xf81: 0x000a, 0xf82: 0x000a, 0xf83: 0x000a, 0xf84: 0x000a, 0xf85: 0x000a, 0xf86: 0x000a, 0xf87: 0x000a, 0xf88: 0x000a, 0xf89: 0x000a, 0xf8a: 0x000a, 0xf8b: 0x000c, 0xf8c: 0x000c, 0xf8d: 0x000c, 0xf8e: 0x000b, // Block 0x3f, offset 0xfc0 0xfc5: 0x000c, 0xfc6: 0x000c, 0xfe9: 0x000c, // Block 0x40, offset 0x1000 0x1020: 0x000c, 0x1021: 0x000c, 0x1022: 0x000c, 0x1027: 0x000c, 0x1028: 0x000c, 0x1032: 0x000c, 0x1039: 0x000c, 0x103a: 0x000c, 0x103b: 0x000c, // Block 0x41, offset 0x1040 0x1040: 0x000a, 0x1044: 0x000a, 0x1045: 0x000a, // Block 0x42, offset 0x1080 0x109e: 0x000a, 0x109f: 0x000a, 0x10a0: 0x000a, 0x10a1: 0x000a, 0x10a2: 0x000a, 0x10a3: 0x000a, 0x10a4: 0x000a, 0x10a5: 0x000a, 0x10a6: 0x000a, 0x10a7: 0x000a, 0x10a8: 0x000a, 0x10a9: 0x000a, 0x10aa: 0x000a, 0x10ab: 0x000a, 0x10ac: 0x000a, 0x10ad: 0x000a, 0x10ae: 0x000a, 0x10af: 0x000a, 0x10b0: 0x000a, 0x10b1: 0x000a, 0x10b2: 0x000a, 0x10b3: 0x000a, 0x10b4: 0x000a, 0x10b5: 0x000a, 0x10b6: 0x000a, 0x10b7: 0x000a, 0x10b8: 0x000a, 0x10b9: 0x000a, 0x10ba: 0x000a, 0x10bb: 0x000a, 0x10bc: 0x000a, 0x10bd: 0x000a, 0x10be: 0x000a, 0x10bf: 0x000a, // Block 0x43, offset 0x10c0 0x10d7: 0x000c, 0x10d8: 0x000c, 0x10db: 0x000c, // Block 0x44, offset 0x1100 0x1116: 0x000c, 0x1118: 0x000c, 0x1119: 0x000c, 0x111a: 0x000c, 0x111b: 0x000c, 0x111c: 0x000c, 0x111d: 0x000c, 0x111e: 0x000c, 0x1120: 0x000c, 0x1122: 0x000c, 0x1125: 0x000c, 0x1126: 0x000c, 0x1127: 0x000c, 0x1128: 0x000c, 0x1129: 0x000c, 0x112a: 0x000c, 0x112b: 0x000c, 0x112c: 0x000c, 0x1133: 0x000c, 0x1134: 0x000c, 0x1135: 0x000c, 0x1136: 0x000c, 0x1137: 0x000c, 0x1138: 0x000c, 0x1139: 0x000c, 0x113a: 0x000c, 0x113b: 0x000c, 0x113c: 0x000c, 0x113f: 0x000c, // Block 0x45, offset 0x1140 0x1170: 0x000c, 0x1171: 0x000c, 0x1172: 0x000c, 0x1173: 0x000c, 0x1174: 0x000c, 0x1175: 0x000c, 0x1176: 0x000c, 0x1177: 0x000c, 0x1178: 0x000c, 0x1179: 0x000c, 0x117a: 0x000c, 0x117b: 0x000c, 0x117c: 0x000c, 0x117d: 0x000c, 0x117e: 0x000c, // Block 0x46, offset 0x1180 0x1180: 0x000c, 0x1181: 0x000c, 0x1182: 0x000c, 0x1183: 0x000c, 0x11b4: 0x000c, 0x11b6: 0x000c, 0x11b7: 0x000c, 0x11b8: 0x000c, 0x11b9: 0x000c, 0x11ba: 0x000c, 0x11bc: 0x000c, // Block 0x47, offset 0x11c0 0x11c2: 0x000c, 0x11eb: 0x000c, 0x11ec: 0x000c, 0x11ed: 0x000c, 0x11ee: 0x000c, 0x11ef: 0x000c, 0x11f0: 0x000c, 0x11f1: 0x000c, 0x11f2: 0x000c, 0x11f3: 0x000c, // Block 0x48, offset 0x1200 0x1200: 0x000c, 0x1201: 0x000c, 0x1222: 0x000c, 0x1223: 0x000c, 0x1224: 0x000c, 0x1225: 0x000c, 0x1228: 0x000c, 0x1229: 0x000c, 0x122b: 0x000c, 0x122c: 0x000c, 0x122d: 0x000c, // Block 0x49, offset 0x1240 0x1266: 0x000c, 0x1268: 0x000c, 0x1269: 0x000c, 0x126d: 0x000c, 0x126f: 0x000c, 0x1270: 0x000c, 0x1271: 0x000c, // Block 0x4a, offset 0x1280 0x12ac: 0x000c, 0x12ad: 0x000c, 0x12ae: 0x000c, 0x12af: 0x000c, 0x12b0: 0x000c, 0x12b1: 0x000c, 0x12b2: 0x000c, 0x12b3: 0x000c, 0x12b6: 0x000c, 0x12b7: 0x000c, // Block 0x4b, offset 0x12c0 0x12d0: 0x000c, 0x12d1: 0x000c, 0x12d2: 0x000c, 0x12d4: 0x000c, 0x12d5: 0x000c, 0x12d6: 0x000c, 0x12d7: 0x000c, 0x12d8: 0x000c, 0x12d9: 0x000c, 0x12da: 0x000c, 0x12db: 0x000c, 0x12dc: 0x000c, 0x12dd: 0x000c, 0x12de: 0x000c, 0x12df: 0x000c, 0x12e0: 0x000c, 0x12e2: 0x000c, 0x12e3: 0x000c, 0x12e4: 0x000c, 0x12e5: 0x000c, 0x12e6: 0x000c, 0x12e7: 0x000c, 0x12e8: 0x000c, 0x12ed: 0x000c, 0x12f4: 0x000c, 0x12f8: 0x000c, 0x12f9: 0x000c, // Block 0x4c, offset 0x1300 0x1300: 0x000c, 0x1301: 0x000c, 0x1302: 0x000c, 0x1303: 0x000c, 0x1304: 0x000c, 0x1305: 0x000c, 0x1306: 0x000c, 0x1307: 0x000c, 0x1308: 0x000c, 0x1309: 0x000c, 0x130a: 0x000c, 0x130b: 0x000c, 0x130c: 0x000c, 0x130d: 0x000c, 0x130e: 0x000c, 0x130f: 0x000c, 0x1310: 0x000c, 0x1311: 0x000c, 0x1312: 0x000c, 0x1313: 0x000c, 0x1314: 0x000c, 0x1315: 0x000c, 0x1316: 0x000c, 0x1317: 0x000c, 0x1318: 0x000c, 0x1319: 0x000c, 0x131a: 0x000c, 0x131b: 0x000c, 0x131c: 0x000c, 0x131d: 0x000c, 0x131e: 0x000c, 0x131f: 0x000c, 0x1320: 0x000c, 0x1321: 0x000c, 0x1322: 0x000c, 0x1323: 0x000c, 0x1324: 0x000c, 0x1325: 0x000c, 0x1326: 0x000c, 0x1327: 0x000c, 0x1328: 0x000c, 0x1329: 0x000c, 0x132a: 0x000c, 0x132b: 0x000c, 0x132c: 0x000c, 0x132d: 0x000c, 0x132e: 0x000c, 0x132f: 0x000c, 0x1330: 0x000c, 0x1331: 0x000c, 0x1332: 0x000c, 0x1333: 0x000c, 0x1334: 0x000c, 0x1335: 0x000c, 0x133b: 0x000c, 0x133c: 0x000c, 0x133d: 0x000c, 0x133e: 0x000c, 0x133f: 0x000c, // Block 0x4d, offset 0x1340 0x137d: 0x000a, 0x137f: 0x000a, // Block 0x4e, offset 0x1380 0x1380: 0x000a, 0x1381: 0x000a, 0x138d: 0x000a, 0x138e: 0x000a, 0x138f: 0x000a, 0x139d: 0x000a, 0x139e: 0x000a, 0x139f: 0x000a, 0x13ad: 0x000a, 0x13ae: 0x000a, 0x13af: 0x000a, 0x13bd: 0x000a, 0x13be: 0x000a, // Block 0x4f, offset 0x13c0 0x13c0: 0x0009, 0x13c1: 0x0009, 0x13c2: 0x0009, 0x13c3: 0x0009, 0x13c4: 0x0009, 0x13c5: 0x0009, 0x13c6: 0x0009, 0x13c7: 0x0009, 0x13c8: 0x0009, 0x13c9: 0x0009, 0x13ca: 0x0009, 0x13cb: 0x000b, 0x13cc: 0x000b, 0x13cd: 0x000b, 0x13cf: 0x0001, 0x13d0: 0x000a, 0x13d1: 0x000a, 0x13d2: 0x000a, 0x13d3: 0x000a, 0x13d4: 0x000a, 0x13d5: 0x000a, 0x13d6: 0x000a, 0x13d7: 0x000a, 0x13d8: 0x000a, 0x13d9: 0x000a, 0x13da: 0x000a, 0x13db: 0x000a, 0x13dc: 0x000a, 0x13dd: 0x000a, 0x13de: 0x000a, 0x13df: 0x000a, 0x13e0: 0x000a, 0x13e1: 0x000a, 0x13e2: 0x000a, 0x13e3: 0x000a, 0x13e4: 0x000a, 0x13e5: 0x000a, 0x13e6: 0x000a, 0x13e7: 0x000a, 0x13e8: 0x0009, 0x13e9: 0x0007, 0x13ea: 0x000e, 0x13eb: 0x000e, 0x13ec: 0x000e, 0x13ed: 0x000e, 0x13ee: 0x000e, 0x13ef: 0x0006, 0x13f0: 0x0004, 0x13f1: 0x0004, 0x13f2: 0x0004, 0x13f3: 0x0004, 0x13f4: 0x0004, 0x13f5: 0x000a, 0x13f6: 0x000a, 0x13f7: 0x000a, 0x13f8: 0x000a, 0x13f9: 0x000a, 0x13fa: 0x000a, 0x13fb: 0x000a, 0x13fc: 0x000a, 0x13fd: 0x000a, 0x13fe: 0x000a, 0x13ff: 0x000a, // Block 0x50, offset 0x1400 0x1400: 0x000a, 0x1401: 0x000a, 0x1402: 0x000a, 0x1403: 0x000a, 0x1404: 0x0006, 0x1405: 0x009a, 0x1406: 0x008a, 0x1407: 0x000a, 0x1408: 0x000a, 0x1409: 0x000a, 0x140a: 0x000a, 0x140b: 0x000a, 0x140c: 0x000a, 0x140d: 0x000a, 0x140e: 0x000a, 0x140f: 0x000a, 0x1410: 0x000a, 0x1411: 0x000a, 0x1412: 0x000a, 0x1413: 0x000a, 0x1414: 0x000a, 0x1415: 0x000a, 0x1416: 0x000a, 0x1417: 0x000a, 0x1418: 0x000a, 0x1419: 0x000a, 0x141a: 0x000a, 0x141b: 0x000a, 0x141c: 0x000a, 0x141d: 0x000a, 0x141e: 0x000a, 0x141f: 0x0009, 0x1420: 0x000b, 0x1421: 0x000b, 0x1422: 0x000b, 0x1423: 0x000b, 0x1424: 0x000b, 0x1425: 0x000b, 0x1426: 0x000e, 0x1427: 0x000e, 0x1428: 0x000e, 0x1429: 0x000e, 0x142a: 0x000b, 0x142b: 0x000b, 0x142c: 0x000b, 0x142d: 0x000b, 0x142e: 0x000b, 0x142f: 0x000b, 0x1430: 0x0002, 0x1434: 0x0002, 0x1435: 0x0002, 0x1436: 0x0002, 0x1437: 0x0002, 0x1438: 0x0002, 0x1439: 0x0002, 0x143a: 0x0003, 0x143b: 0x0003, 0x143c: 0x000a, 0x143d: 0x009a, 0x143e: 0x008a, // Block 0x51, offset 0x1440 0x1440: 0x0002, 0x1441: 0x0002, 0x1442: 0x0002, 0x1443: 0x0002, 0x1444: 0x0002, 0x1445: 0x0002, 0x1446: 0x0002, 0x1447: 0x0002, 0x1448: 0x0002, 0x1449: 0x0002, 0x144a: 0x0003, 0x144b: 0x0003, 0x144c: 0x000a, 0x144d: 0x009a, 0x144e: 0x008a, 0x1460: 0x0004, 0x1461: 0x0004, 0x1462: 0x0004, 0x1463: 0x0004, 0x1464: 0x0004, 0x1465: 0x0004, 0x1466: 0x0004, 0x1467: 0x0004, 0x1468: 0x0004, 0x1469: 0x0004, 0x146a: 0x0004, 0x146b: 0x0004, 0x146c: 0x0004, 0x146d: 0x0004, 0x146e: 0x0004, 0x146f: 0x0004, 0x1470: 0x0004, 0x1471: 0x0004, 0x1472: 0x0004, 0x1473: 0x0004, 0x1474: 0x0004, 0x1475: 0x0004, 0x1476: 0x0004, 0x1477: 0x0004, 0x1478: 0x0004, 0x1479: 0x0004, 0x147a: 0x0004, 0x147b: 0x0004, 0x147c: 0x0004, 0x147d: 0x0004, 0x147e: 0x0004, 0x147f: 0x0004, // Block 0x52, offset 0x1480 0x1480: 0x0004, 0x1481: 0x0004, 0x1482: 0x0004, 0x1483: 0x0004, 0x1484: 0x0004, 0x1485: 0x0004, 0x1486: 0x0004, 0x1487: 0x0004, 0x1488: 0x0004, 0x1489: 0x0004, 0x148a: 0x0004, 0x148b: 0x0004, 0x148c: 0x0004, 0x148d: 0x0004, 0x148e: 0x0004, 0x148f: 0x0004, 0x1490: 0x000c, 0x1491: 0x000c, 0x1492: 0x000c, 0x1493: 0x000c, 0x1494: 0x000c, 0x1495: 0x000c, 0x1496: 0x000c, 0x1497: 0x000c, 0x1498: 0x000c, 0x1499: 0x000c, 0x149a: 0x000c, 0x149b: 0x000c, 0x149c: 0x000c, 0x149d: 0x000c, 0x149e: 0x000c, 0x149f: 0x000c, 0x14a0: 0x000c, 0x14a1: 0x000c, 0x14a2: 0x000c, 0x14a3: 0x000c, 0x14a4: 0x000c, 0x14a5: 0x000c, 0x14a6: 0x000c, 0x14a7: 0x000c, 0x14a8: 0x000c, 0x14a9: 0x000c, 0x14aa: 0x000c, 0x14ab: 0x000c, 0x14ac: 0x000c, 0x14ad: 0x000c, 0x14ae: 0x000c, 0x14af: 0x000c, 0x14b0: 0x000c, // Block 0x53, offset 0x14c0 0x14c0: 0x000a, 0x14c1: 0x000a, 0x14c3: 0x000a, 0x14c4: 0x000a, 0x14c5: 0x000a, 0x14c6: 0x000a, 0x14c8: 0x000a, 0x14c9: 0x000a, 0x14d4: 0x000a, 0x14d6: 0x000a, 0x14d7: 0x000a, 0x14d8: 0x000a, 0x14de: 0x000a, 0x14df: 0x000a, 0x14e0: 0x000a, 0x14e1: 0x000a, 0x14e2: 0x000a, 0x14e3: 0x000a, 0x14e5: 0x000a, 0x14e7: 0x000a, 0x14e9: 0x000a, 0x14ee: 0x0004, 0x14fa: 0x000a, 0x14fb: 0x000a, // Block 0x54, offset 0x1500 0x1500: 0x000a, 0x1501: 0x000a, 0x1502: 0x000a, 0x1503: 0x000a, 0x1504: 0x000a, 0x150a: 0x000a, 0x150b: 0x000a, 0x150c: 0x000a, 0x150d: 0x000a, 0x1510: 0x000a, 0x1511: 0x000a, 0x1512: 0x000a, 0x1513: 0x000a, 0x1514: 0x000a, 0x1515: 0x000a, 0x1516: 0x000a, 0x1517: 0x000a, 0x1518: 0x000a, 0x1519: 0x000a, 0x151a: 0x000a, 0x151b: 0x000a, 0x151c: 0x000a, 0x151d: 0x000a, 0x151e: 0x000a, 0x151f: 0x000a, // Block 0x55, offset 0x1540 0x1549: 0x000a, 0x154a: 0x000a, 0x154b: 0x000a, 0x1550: 0x000a, 0x1551: 0x000a, 0x1552: 0x000a, 0x1553: 0x000a, 0x1554: 0x000a, 0x1555: 0x000a, 0x1556: 0x000a, 0x1557: 0x000a, 0x1558: 0x000a, 0x1559: 0x000a, 0x155a: 0x000a, 0x155b: 0x000a, 0x155c: 0x000a, 0x155d: 0x000a, 0x155e: 0x000a, 0x155f: 0x000a, 0x1560: 0x000a, 0x1561: 0x000a, 0x1562: 0x000a, 0x1563: 0x000a, 0x1564: 0x000a, 0x1565: 0x000a, 0x1566: 0x000a, 0x1567: 0x000a, 0x1568: 0x000a, 0x1569: 0x000a, 0x156a: 0x000a, 0x156b: 0x000a, 0x156c: 0x000a, 0x156d: 0x000a, 0x156e: 0x000a, 0x156f: 0x000a, 0x1570: 0x000a, 0x1571: 0x000a, 0x1572: 0x000a, 0x1573: 0x000a, 0x1574: 0x000a, 0x1575: 0x000a, 0x1576: 0x000a, 0x1577: 0x000a, 0x1578: 0x000a, 0x1579: 0x000a, 0x157a: 0x000a, 0x157b: 0x000a, 0x157c: 0x000a, 0x157d: 0x000a, 0x157e: 0x000a, 0x157f: 0x000a, // Block 0x56, offset 0x1580 0x1580: 0x000a, 0x1581: 0x000a, 0x1582: 0x000a, 0x1583: 0x000a, 0x1584: 0x000a, 0x1585: 0x000a, 0x1586: 0x000a, 0x1587: 0x000a, 0x1588: 0x000a, 0x1589: 0x000a, 0x158a: 0x000a, 0x158b: 0x000a, 0x158c: 0x000a, 0x158d: 0x000a, 0x158e: 0x000a, 0x158f: 0x000a, 0x1590: 0x000a, 0x1591: 0x000a, 0x1592: 0x000a, 0x1593: 0x000a, 0x1594: 0x000a, 0x1595: 0x000a, 0x1596: 0x000a, 0x1597: 0x000a, 0x1598: 0x000a, 0x1599: 0x000a, 0x159a: 0x000a, 0x159b: 0x000a, 0x159c: 0x000a, 0x159d: 0x000a, 0x159e: 0x000a, 0x159f: 0x000a, 0x15a0: 0x000a, 0x15a1: 0x000a, 0x15a2: 0x000a, 0x15a3: 0x000a, 0x15a4: 0x000a, 0x15a5: 0x000a, 0x15a6: 0x000a, 0x15a7: 0x000a, 0x15a8: 0x000a, 0x15a9: 0x000a, 0x15aa: 0x000a, 0x15ab: 0x000a, 0x15ac: 0x000a, 0x15ad: 0x000a, 0x15ae: 0x000a, 0x15af: 0x000a, 0x15b0: 0x000a, 0x15b1: 0x000a, 0x15b2: 0x000a, 0x15b3: 0x000a, 0x15b4: 0x000a, 0x15b5: 0x000a, 0x15b6: 0x000a, 0x15b7: 0x000a, 0x15b8: 0x000a, 0x15b9: 0x000a, 0x15ba: 0x000a, 0x15bb: 0x000a, 0x15bc: 0x000a, 0x15bd: 0x000a, 0x15be: 0x000a, 0x15bf: 0x000a, // Block 0x57, offset 0x15c0 0x15c0: 0x000a, 0x15c1: 0x000a, 0x15c2: 0x000a, 0x15c3: 0x000a, 0x15c4: 0x000a, 0x15c5: 0x000a, 0x15c6: 0x000a, 0x15c7: 0x000a, 0x15c8: 0x000a, 0x15c9: 0x000a, 0x15ca: 0x000a, 0x15cb: 0x000a, 0x15cc: 0x000a, 0x15cd: 0x000a, 0x15ce: 0x000a, 0x15cf: 0x000a, 0x15d0: 0x000a, 0x15d1: 0x000a, 0x15d2: 0x0003, 0x15d3: 0x0004, 0x15d4: 0x000a, 0x15d5: 0x000a, 0x15d6: 0x000a, 0x15d7: 0x000a, 0x15d8: 0x000a, 0x15d9: 0x000a, 0x15da: 0x000a, 0x15db: 0x000a, 0x15dc: 0x000a, 0x15dd: 0x000a, 0x15de: 0x000a, 0x15df: 0x000a, 0x15e0: 0x000a, 0x15e1: 0x000a, 0x15e2: 0x000a, 0x15e3: 0x000a, 0x15e4: 0x000a, 0x15e5: 0x000a, 0x15e6: 0x000a, 0x15e7: 0x000a, 0x15e8: 0x000a, 0x15e9: 0x000a, 0x15ea: 0x000a, 0x15eb: 0x000a, 0x15ec: 0x000a, 0x15ed: 0x000a, 0x15ee: 0x000a, 0x15ef: 0x000a, 0x15f0: 0x000a, 0x15f1: 0x000a, 0x15f2: 0x000a, 0x15f3: 0x000a, 0x15f4: 0x000a, 0x15f5: 0x000a, 0x15f6: 0x000a, 0x15f7: 0x000a, 0x15f8: 0x000a, 0x15f9: 0x000a, 0x15fa: 0x000a, 0x15fb: 0x000a, 0x15fc: 0x000a, 0x15fd: 0x000a, 0x15fe: 0x000a, 0x15ff: 0x000a, // Block 0x58, offset 0x1600 0x1600: 0x000a, 0x1601: 0x000a, 0x1602: 0x000a, 0x1603: 0x000a, 0x1604: 0x000a, 0x1605: 0x000a, 0x1606: 0x000a, 0x1607: 0x000a, 0x1608: 0x003a, 0x1609: 0x002a, 0x160a: 0x003a, 0x160b: 0x002a, 0x160c: 0x000a, 0x160d: 0x000a, 0x160e: 0x000a, 0x160f: 0x000a, 0x1610: 0x000a, 0x1611: 0x000a, 0x1612: 0x000a, 0x1613: 0x000a, 0x1614: 0x000a, 0x1615: 0x000a, 0x1616: 0x000a, 0x1617: 0x000a, 0x1618: 0x000a, 0x1619: 0x000a, 0x161a: 0x000a, 0x161b: 0x000a, 0x161c: 0x000a, 0x161d: 0x000a, 0x161e: 0x000a, 0x161f: 0x000a, 0x1620: 0x000a, 0x1621: 0x000a, 0x1622: 0x000a, 0x1623: 0x000a, 0x1624: 0x000a, 0x1625: 0x000a, 0x1626: 0x000a, 0x1627: 0x000a, 0x1628: 0x000a, 0x1629: 0x009a, 0x162a: 0x008a, 0x162b: 0x000a, 0x162c: 0x000a, 0x162d: 0x000a, 0x162e: 0x000a, 0x162f: 0x000a, 0x1630: 0x000a, 0x1631: 0x000a, 0x1632: 0x000a, 0x1633: 0x000a, 0x1634: 0x000a, 0x1635: 0x000a, // Block 0x59, offset 0x1640 0x167b: 0x000a, 0x167c: 0x000a, 0x167d: 0x000a, 0x167e: 0x000a, 0x167f: 0x000a, // Block 0x5a, offset 0x1680 0x1680: 0x000a, 0x1681: 0x000a, 0x1682: 0x000a, 0x1683: 0x000a, 0x1684: 0x000a, 0x1685: 0x000a, 0x1686: 0x000a, 0x1687: 0x000a, 0x1688: 0x000a, 0x1689: 0x000a, 0x168a: 0x000a, 0x168b: 0x000a, 0x168c: 0x000a, 0x168d: 0x000a, 0x168e: 0x000a, 0x168f: 0x000a, 0x1690: 0x000a, 0x1691: 0x000a, 0x1692: 0x000a, 0x1693: 0x000a, 0x1694: 0x000a, 0x1696: 0x000a, 0x1697: 0x000a, 0x1698: 0x000a, 0x1699: 0x000a, 0x169a: 0x000a, 0x169b: 0x000a, 0x169c: 0x000a, 0x169d: 0x000a, 0x169e: 0x000a, 0x169f: 0x000a, 0x16a0: 0x000a, 0x16a1: 0x000a, 0x16a2: 0x000a, 0x16a3: 0x000a, 0x16a4: 0x000a, 0x16a5: 0x000a, 0x16a6: 0x000a, 0x16a7: 0x000a, 0x16a8: 0x000a, 0x16a9: 0x000a, 0x16aa: 0x000a, 0x16ab: 0x000a, 0x16ac: 0x000a, 0x16ad: 0x000a, 0x16ae: 0x000a, 0x16af: 0x000a, 0x16b0: 0x000a, 0x16b1: 0x000a, 0x16b2: 0x000a, 0x16b3: 0x000a, 0x16b4: 0x000a, 0x16b5: 0x000a, 0x16b6: 0x000a, 0x16b7: 0x000a, 0x16b8: 0x000a, 0x16b9: 0x000a, 0x16ba: 0x000a, 0x16bb: 0x000a, 0x16bc: 0x000a, 0x16bd: 0x000a, 0x16be: 0x000a, 0x16bf: 0x000a, // Block 0x5b, offset 0x16c0 0x16c0: 0x000a, 0x16c1: 0x000a, 0x16c2: 0x000a, 0x16c3: 0x000a, 0x16c4: 0x000a, 0x16c5: 0x000a, 0x16c6: 0x000a, 0x16c7: 0x000a, 0x16c8: 0x000a, 0x16c9: 0x000a, 0x16ca: 0x000a, 0x16cb: 0x000a, 0x16cc: 0x000a, 0x16cd: 0x000a, 0x16ce: 0x000a, 0x16cf: 0x000a, 0x16d0: 0x000a, 0x16d1: 0x000a, 0x16d2: 0x000a, 0x16d3: 0x000a, 0x16d4: 0x000a, 0x16d5: 0x000a, 0x16d6: 0x000a, 0x16d7: 0x000a, 0x16d8: 0x000a, 0x16d9: 0x000a, 0x16da: 0x000a, 0x16db: 0x000a, 0x16dc: 0x000a, 0x16dd: 0x000a, 0x16de: 0x000a, 0x16df: 0x000a, 0x16e0: 0x000a, 0x16e1: 0x000a, 0x16e2: 0x000a, 0x16e3: 0x000a, 0x16e4: 0x000a, 0x16e5: 0x000a, 0x16e6: 0x000a, 0x16e7: 0x000a, 0x16e8: 0x000a, 0x16e9: 0x000a, 0x16ea: 0x000a, 0x16eb: 0x000a, 0x16ec: 0x000a, 0x16ed: 0x000a, 0x16ee: 0x000a, 0x16ef: 0x000a, 0x16f0: 0x000a, 0x16f1: 0x000a, 0x16f2: 0x000a, 0x16f3: 0x000a, 0x16f4: 0x000a, 0x16f5: 0x000a, 0x16f6: 0x000a, 0x16f7: 0x000a, 0x16f8: 0x000a, 0x16f9: 0x000a, 0x16fa: 0x000a, 0x16fb: 0x000a, 0x16fc: 0x000a, 0x16fd: 0x000a, 0x16fe: 0x000a, // Block 0x5c, offset 0x1700 0x1700: 0x000a, 0x1701: 0x000a, 0x1702: 0x000a, 0x1703: 0x000a, 0x1704: 0x000a, 0x1705: 0x000a, 0x1706: 0x000a, 0x1707: 0x000a, 0x1708: 0x000a, 0x1709: 0x000a, 0x170a: 0x000a, 0x170b: 0x000a, 0x170c: 0x000a, 0x170d: 0x000a, 0x170e: 0x000a, 0x170f: 0x000a, 0x1710: 0x000a, 0x1711: 0x000a, 0x1712: 0x000a, 0x1713: 0x000a, 0x1714: 0x000a, 0x1715: 0x000a, 0x1716: 0x000a, 0x1717: 0x000a, 0x1718: 0x000a, 0x1719: 0x000a, 0x171a: 0x000a, 0x171b: 0x000a, 0x171c: 0x000a, 0x171d: 0x000a, 0x171e: 0x000a, 0x171f: 0x000a, 0x1720: 0x000a, 0x1721: 0x000a, 0x1722: 0x000a, 0x1723: 0x000a, 0x1724: 0x000a, 0x1725: 0x000a, 0x1726: 0x000a, // Block 0x5d, offset 0x1740 0x1740: 0x000a, 0x1741: 0x000a, 0x1742: 0x000a, 0x1743: 0x000a, 0x1744: 0x000a, 0x1745: 0x000a, 0x1746: 0x000a, 0x1747: 0x000a, 0x1748: 0x000a, 0x1749: 0x000a, 0x174a: 0x000a, 0x1760: 0x000a, 0x1761: 0x000a, 0x1762: 0x000a, 0x1763: 0x000a, 0x1764: 0x000a, 0x1765: 0x000a, 0x1766: 0x000a, 0x1767: 0x000a, 0x1768: 0x000a, 0x1769: 0x000a, 0x176a: 0x000a, 0x176b: 0x000a, 0x176c: 0x000a, 0x176d: 0x000a, 0x176e: 0x000a, 0x176f: 0x000a, 0x1770: 0x000a, 0x1771: 0x000a, 0x1772: 0x000a, 0x1773: 0x000a, 0x1774: 0x000a, 0x1775: 0x000a, 0x1776: 0x000a, 0x1777: 0x000a, 0x1778: 0x000a, 0x1779: 0x000a, 0x177a: 0x000a, 0x177b: 0x000a, 0x177c: 0x000a, 0x177d: 0x000a, 0x177e: 0x000a, 0x177f: 0x000a, // Block 0x5e, offset 0x1780 0x1780: 0x000a, 0x1781: 0x000a, 0x1782: 0x000a, 0x1783: 0x000a, 0x1784: 0x000a, 0x1785: 0x000a, 0x1786: 0x000a, 0x1787: 0x000a, 0x1788: 0x0002, 0x1789: 0x0002, 0x178a: 0x0002, 0x178b: 0x0002, 0x178c: 0x0002, 0x178d: 0x0002, 0x178e: 0x0002, 0x178f: 0x0002, 0x1790: 0x0002, 0x1791: 0x0002, 0x1792: 0x0002, 0x1793: 0x0002, 0x1794: 0x0002, 0x1795: 0x0002, 0x1796: 0x0002, 0x1797: 0x0002, 0x1798: 0x0002, 0x1799: 0x0002, 0x179a: 0x0002, 0x179b: 0x0002, // Block 0x5f, offset 0x17c0 0x17ea: 0x000a, 0x17eb: 0x000a, 0x17ec: 0x000a, 0x17ed: 0x000a, 0x17ee: 0x000a, 0x17ef: 0x000a, 0x17f0: 0x000a, 0x17f1: 0x000a, 0x17f2: 0x000a, 0x17f3: 0x000a, 0x17f4: 0x000a, 0x17f5: 0x000a, 0x17f6: 0x000a, 0x17f7: 0x000a, 0x17f8: 0x000a, 0x17f9: 0x000a, 0x17fa: 0x000a, 0x17fb: 0x000a, 0x17fc: 0x000a, 0x17fd: 0x000a, 0x17fe: 0x000a, 0x17ff: 0x000a, // Block 0x60, offset 0x1800 0x1800: 0x000a, 0x1801: 0x000a, 0x1802: 0x000a, 0x1803: 0x000a, 0x1804: 0x000a, 0x1805: 0x000a, 0x1806: 0x000a, 0x1807: 0x000a, 0x1808: 0x000a, 0x1809: 0x000a, 0x180a: 0x000a, 0x180b: 0x000a, 0x180c: 0x000a, 0x180d: 0x000a, 0x180e: 0x000a, 0x180f: 0x000a, 0x1810: 0x000a, 0x1811: 0x000a, 0x1812: 0x000a, 0x1813: 0x000a, 0x1814: 0x000a, 0x1815: 0x000a, 0x1816: 0x000a, 0x1817: 0x000a, 0x1818: 0x000a, 0x1819: 0x000a, 0x181a: 0x000a, 0x181b: 0x000a, 0x181c: 0x000a, 0x181d: 0x000a, 0x181e: 0x000a, 0x181f: 0x000a, 0x1820: 0x000a, 0x1821: 0x000a, 0x1822: 0x000a, 0x1823: 0x000a, 0x1824: 0x000a, 0x1825: 0x000a, 0x1826: 0x000a, 0x1827: 0x000a, 0x1828: 0x000a, 0x1829: 0x000a, 0x182a: 0x000a, 0x182b: 0x000a, 0x182d: 0x000a, 0x182e: 0x000a, 0x182f: 0x000a, 0x1830: 0x000a, 0x1831: 0x000a, 0x1832: 0x000a, 0x1833: 0x000a, 0x1834: 0x000a, 0x1835: 0x000a, 0x1836: 0x000a, 0x1837: 0x000a, 0x1838: 0x000a, 0x1839: 0x000a, 0x183a: 0x000a, 0x183b: 0x000a, 0x183c: 0x000a, 0x183d: 0x000a, 0x183e: 0x000a, 0x183f: 0x000a, // Block 0x61, offset 0x1840 0x1840: 0x000a, 0x1841: 0x000a, 0x1842: 0x000a, 0x1843: 0x000a, 0x1844: 0x000a, 0x1845: 0x000a, 0x1846: 0x000a, 0x1847: 0x000a, 0x1848: 0x000a, 0x1849: 0x000a, 0x184a: 0x000a, 0x184b: 0x000a, 0x184c: 0x000a, 0x184d: 0x000a, 0x184e: 0x000a, 0x184f: 0x000a, 0x1850: 0x000a, 0x1851: 0x000a, 0x1852: 0x000a, 0x1853: 0x000a, 0x1854: 0x000a, 0x1855: 0x000a, 0x1856: 0x000a, 0x1857: 0x000a, 0x1858: 0x000a, 0x1859: 0x000a, 0x185a: 0x000a, 0x185b: 0x000a, 0x185c: 0x000a, 0x185d: 0x000a, 0x185e: 0x000a, 0x185f: 0x000a, 0x1860: 0x000a, 0x1861: 0x000a, 0x1862: 0x000a, 0x1863: 0x000a, 0x1864: 0x000a, 0x1865: 0x000a, 0x1866: 0x000a, 0x1867: 0x000a, 0x1868: 0x003a, 0x1869: 0x002a, 0x186a: 0x003a, 0x186b: 0x002a, 0x186c: 0x003a, 0x186d: 0x002a, 0x186e: 0x003a, 0x186f: 0x002a, 0x1870: 0x003a, 0x1871: 0x002a, 0x1872: 0x003a, 0x1873: 0x002a, 0x1874: 0x003a, 0x1875: 0x002a, 0x1876: 0x000a, 0x1877: 0x000a, 0x1878: 0x000a, 0x1879: 0x000a, 0x187a: 0x000a, 0x187b: 0x000a, 0x187c: 0x000a, 0x187d: 0x000a, 0x187e: 0x000a, 0x187f: 0x000a, // Block 0x62, offset 0x1880 0x1880: 0x000a, 0x1881: 0x000a, 0x1882: 0x000a, 0x1883: 0x000a, 0x1884: 0x000a, 0x1885: 0x009a, 0x1886: 0x008a, 0x1887: 0x000a, 0x1888: 0x000a, 0x1889: 0x000a, 0x188a: 0x000a, 0x188b: 0x000a, 0x188c: 0x000a, 0x188d: 0x000a, 0x188e: 0x000a, 0x188f: 0x000a, 0x1890: 0x000a, 0x1891: 0x000a, 0x1892: 0x000a, 0x1893: 0x000a, 0x1894: 0x000a, 0x1895: 0x000a, 0x1896: 0x000a, 0x1897: 0x000a, 0x1898: 0x000a, 0x1899: 0x000a, 0x189a: 0x000a, 0x189b: 0x000a, 0x189c: 0x000a, 0x189d: 0x000a, 0x189e: 0x000a, 0x189f: 0x000a, 0x18a0: 0x000a, 0x18a1: 0x000a, 0x18a2: 0x000a, 0x18a3: 0x000a, 0x18a4: 0x000a, 0x18a5: 0x000a, 0x18a6: 0x003a, 0x18a7: 0x002a, 0x18a8: 0x003a, 0x18a9: 0x002a, 0x18aa: 0x003a, 0x18ab: 0x002a, 0x18ac: 0x003a, 0x18ad: 0x002a, 0x18ae: 0x003a, 0x18af: 0x002a, 0x18b0: 0x000a, 0x18b1: 0x000a, 0x18b2: 0x000a, 0x18b3: 0x000a, 0x18b4: 0x000a, 0x18b5: 0x000a, 0x18b6: 0x000a, 0x18b7: 0x000a, 0x18b8: 0x000a, 0x18b9: 0x000a, 0x18ba: 0x000a, 0x18bb: 0x000a, 0x18bc: 0x000a, 0x18bd: 0x000a, 0x18be: 0x000a, 0x18bf: 0x000a, // Block 0x63, offset 0x18c0 0x18c0: 0x000a, 0x18c1: 0x000a, 0x18c2: 0x000a, 0x18c3: 0x007a, 0x18c4: 0x006a, 0x18c5: 0x009a, 0x18c6: 0x008a, 0x18c7: 0x00ba, 0x18c8: 0x00aa, 0x18c9: 0x009a, 0x18ca: 0x008a, 0x18cb: 0x007a, 0x18cc: 0x006a, 0x18cd: 0x00da, 0x18ce: 0x002a, 0x18cf: 0x003a, 0x18d0: 0x00ca, 0x18d1: 0x009a, 0x18d2: 0x008a, 0x18d3: 0x007a, 0x18d4: 0x006a, 0x18d5: 0x009a, 0x18d6: 0x008a, 0x18d7: 0x00ba, 0x18d8: 0x00aa, 0x18d9: 0x000a, 0x18da: 0x000a, 0x18db: 0x000a, 0x18dc: 0x000a, 0x18dd: 0x000a, 0x18de: 0x000a, 0x18df: 0x000a, 0x18e0: 0x000a, 0x18e1: 0x000a, 0x18e2: 0x000a, 0x18e3: 0x000a, 0x18e4: 0x000a, 0x18e5: 0x000a, 0x18e6: 0x000a, 0x18e7: 0x000a, 0x18e8: 0x000a, 0x18e9: 0x000a, 0x18ea: 0x000a, 0x18eb: 0x000a, 0x18ec: 0x000a, 0x18ed: 0x000a, 0x18ee: 0x000a, 0x18ef: 0x000a, 0x18f0: 0x000a, 0x18f1: 0x000a, 0x18f2: 0x000a, 0x18f3: 0x000a, 0x18f4: 0x000a, 0x18f5: 0x000a, 0x18f6: 0x000a, 0x18f7: 0x000a, 0x18f8: 0x000a, 0x18f9: 0x000a, 0x18fa: 0x000a, 0x18fb: 0x000a, 0x18fc: 0x000a, 0x18fd: 0x000a, 0x18fe: 0x000a, 0x18ff: 0x000a, // Block 0x64, offset 0x1900 0x1900: 0x000a, 0x1901: 0x000a, 0x1902: 0x000a, 0x1903: 0x000a, 0x1904: 0x000a, 0x1905: 0x000a, 0x1906: 0x000a, 0x1907: 0x000a, 0x1908: 0x000a, 0x1909: 0x000a, 0x190a: 0x000a, 0x190b: 0x000a, 0x190c: 0x000a, 0x190d: 0x000a, 0x190e: 0x000a, 0x190f: 0x000a, 0x1910: 0x000a, 0x1911: 0x000a, 0x1912: 0x000a, 0x1913: 0x000a, 0x1914: 0x000a, 0x1915: 0x000a, 0x1916: 0x000a, 0x1917: 0x000a, 0x1918: 0x003a, 0x1919: 0x002a, 0x191a: 0x003a, 0x191b: 0x002a, 0x191c: 0x000a, 0x191d: 0x000a, 0x191e: 0x000a, 0x191f: 0x000a, 0x1920: 0x000a, 0x1921: 0x000a, 0x1922: 0x000a, 0x1923: 0x000a, 0x1924: 0x000a, 0x1925: 0x000a, 0x1926: 0x000a, 0x1927: 0x000a, 0x1928: 0x000a, 0x1929: 0x000a, 0x192a: 0x000a, 0x192b: 0x000a, 0x192c: 0x000a, 0x192d: 0x000a, 0x192e: 0x000a, 0x192f: 0x000a, 0x1930: 0x000a, 0x1931: 0x000a, 0x1932: 0x000a, 0x1933: 0x000a, 0x1934: 0x000a, 0x1935: 0x000a, 0x1936: 0x000a, 0x1937: 0x000a, 0x1938: 0x000a, 0x1939: 0x000a, 0x193a: 0x000a, 0x193b: 0x000a, 0x193c: 0x003a, 0x193d: 0x002a, 0x193e: 0x000a, 0x193f: 0x000a, // Block 0x65, offset 0x1940 0x1940: 0x000a, 0x1941: 0x000a, 0x1942: 0x000a, 0x1943: 0x000a, 0x1944: 0x000a, 0x1945: 0x000a, 0x1946: 0x000a, 0x1947: 0x000a, 0x1948: 0x000a, 0x1949: 0x000a, 0x194a: 0x000a, 0x194b: 0x000a, 0x194c: 0x000a, 0x194d: 0x000a, 0x194e: 0x000a, 0x194f: 0x000a, 0x1950: 0x000a, 0x1951: 0x000a, 0x1952: 0x000a, 0x1953: 0x000a, 0x1954: 0x000a, 0x1955: 0x000a, 0x1956: 0x000a, 0x1957: 0x000a, 0x1958: 0x000a, 0x1959: 0x000a, 0x195a: 0x000a, 0x195b: 0x000a, 0x195c: 0x000a, 0x195d: 0x000a, 0x195e: 0x000a, 0x195f: 0x000a, 0x1960: 0x000a, 0x1961: 0x000a, 0x1962: 0x000a, 0x1963: 0x000a, 0x1964: 0x000a, 0x1965: 0x000a, 0x1966: 0x000a, 0x1967: 0x000a, 0x1968: 0x000a, 0x1969: 0x000a, 0x196a: 0x000a, 0x196b: 0x000a, 0x196c: 0x000a, 0x196d: 0x000a, 0x196e: 0x000a, 0x196f: 0x000a, 0x1970: 0x000a, 0x1971: 0x000a, 0x1972: 0x000a, 0x1973: 0x000a, 0x1976: 0x000a, 0x1977: 0x000a, 0x1978: 0x000a, 0x1979: 0x000a, 0x197a: 0x000a, 0x197b: 0x000a, 0x197c: 0x000a, 0x197d: 0x000a, 0x197e: 0x000a, 0x197f: 0x000a, // Block 0x66, offset 0x1980 0x1980: 0x000a, 0x1981: 0x000a, 0x1982: 0x000a, 0x1983: 0x000a, 0x1984: 0x000a, 0x1985: 0x000a, 0x1986: 0x000a, 0x1987: 0x000a, 0x1988: 0x000a, 0x1989: 0x000a, 0x198a: 0x000a, 0x198b: 0x000a, 0x198c: 0x000a, 0x198d: 0x000a, 0x198e: 0x000a, 0x198f: 0x000a, 0x1990: 0x000a, 0x1991: 0x000a, 0x1992: 0x000a, 0x1993: 0x000a, 0x1994: 0x000a, 0x1995: 0x000a, 0x1998: 0x000a, 0x1999: 0x000a, 0x199a: 0x000a, 0x199b: 0x000a, 0x199c: 0x000a, 0x199d: 0x000a, 0x199e: 0x000a, 0x199f: 0x000a, 0x19a0: 0x000a, 0x19a1: 0x000a, 0x19a2: 0x000a, 0x19a3: 0x000a, 0x19a4: 0x000a, 0x19a5: 0x000a, 0x19a6: 0x000a, 0x19a7: 0x000a, 0x19a8: 0x000a, 0x19a9: 0x000a, 0x19aa: 0x000a, 0x19ab: 0x000a, 0x19ac: 0x000a, 0x19ad: 0x000a, 0x19ae: 0x000a, 0x19af: 0x000a, 0x19b0: 0x000a, 0x19b1: 0x000a, 0x19b2: 0x000a, 0x19b3: 0x000a, 0x19b4: 0x000a, 0x19b5: 0x000a, 0x19b6: 0x000a, 0x19b7: 0x000a, 0x19b8: 0x000a, 0x19b9: 0x000a, 0x19bd: 0x000a, 0x19be: 0x000a, 0x19bf: 0x000a, // Block 0x67, offset 0x19c0 0x19c0: 0x000a, 0x19c1: 0x000a, 0x19c2: 0x000a, 0x19c3: 0x000a, 0x19c4: 0x000a, 0x19c5: 0x000a, 0x19c6: 0x000a, 0x19c7: 0x000a, 0x19c8: 0x000a, 0x19ca: 0x000a, 0x19cb: 0x000a, 0x19cc: 0x000a, 0x19cd: 0x000a, 0x19ce: 0x000a, 0x19cf: 0x000a, 0x19d0: 0x000a, 0x19d1: 0x000a, 0x19ec: 0x000a, 0x19ed: 0x000a, 0x19ee: 0x000a, 0x19ef: 0x000a, // Block 0x68, offset 0x1a00 0x1a25: 0x000a, 0x1a26: 0x000a, 0x1a27: 0x000a, 0x1a28: 0x000a, 0x1a29: 0x000a, 0x1a2a: 0x000a, 0x1a2f: 0x000c, 0x1a30: 0x000c, 0x1a31: 0x000c, 0x1a39: 0x000a, 0x1a3a: 0x000a, 0x1a3b: 0x000a, 0x1a3c: 0x000a, 0x1a3d: 0x000a, 0x1a3e: 0x000a, 0x1a3f: 0x000a, // Block 0x69, offset 0x1a40 0x1a7f: 0x000c, // Block 0x6a, offset 0x1a80 0x1aa0: 0x000c, 0x1aa1: 0x000c, 0x1aa2: 0x000c, 0x1aa3: 0x000c, 0x1aa4: 0x000c, 0x1aa5: 0x000c, 0x1aa6: 0x000c, 0x1aa7: 0x000c, 0x1aa8: 0x000c, 0x1aa9: 0x000c, 0x1aaa: 0x000c, 0x1aab: 0x000c, 0x1aac: 0x000c, 0x1aad: 0x000c, 0x1aae: 0x000c, 0x1aaf: 0x000c, 0x1ab0: 0x000c, 0x1ab1: 0x000c, 0x1ab2: 0x000c, 0x1ab3: 0x000c, 0x1ab4: 0x000c, 0x1ab5: 0x000c, 0x1ab6: 0x000c, 0x1ab7: 0x000c, 0x1ab8: 0x000c, 0x1ab9: 0x000c, 0x1aba: 0x000c, 0x1abb: 0x000c, 0x1abc: 0x000c, 0x1abd: 0x000c, 0x1abe: 0x000c, 0x1abf: 0x000c, // Block 0x6b, offset 0x1ac0 0x1ac0: 0x000a, 0x1ac1: 0x000a, 0x1ac2: 0x000a, 0x1ac3: 0x000a, 0x1ac4: 0x000a, 0x1ac5: 0x000a, 0x1ac6: 0x000a, 0x1ac7: 0x000a, 0x1ac8: 0x000a, 0x1ac9: 0x000a, 0x1aca: 0x000a, 0x1acb: 0x000a, 0x1acc: 0x000a, 0x1acd: 0x000a, 0x1ace: 0x000a, 0x1acf: 0x000a, 0x1ad0: 0x000a, 0x1ad1: 0x000a, 0x1ad2: 0x000a, 0x1ad3: 0x000a, 0x1ad4: 0x000a, 0x1ad5: 0x000a, 0x1ad6: 0x000a, 0x1ad7: 0x000a, 0x1ad8: 0x000a, 0x1ad9: 0x000a, 0x1ada: 0x000a, 0x1adb: 0x000a, 0x1adc: 0x000a, 0x1add: 0x000a, 0x1ade: 0x000a, 0x1adf: 0x000a, 0x1ae0: 0x000a, 0x1ae1: 0x000a, 0x1ae2: 0x003a, 0x1ae3: 0x002a, 0x1ae4: 0x003a, 0x1ae5: 0x002a, 0x1ae6: 0x003a, 0x1ae7: 0x002a, 0x1ae8: 0x003a, 0x1ae9: 0x002a, 0x1aea: 0x000a, 0x1aeb: 0x000a, 0x1aec: 0x000a, 0x1aed: 0x000a, 0x1aee: 0x000a, 0x1aef: 0x000a, 0x1af0: 0x000a, 0x1af1: 0x000a, 0x1af2: 0x000a, 0x1af3: 0x000a, 0x1af4: 0x000a, 0x1af5: 0x000a, 0x1af6: 0x000a, 0x1af7: 0x000a, 0x1af8: 0x000a, 0x1af9: 0x000a, 0x1afa: 0x000a, 0x1afb: 0x000a, 0x1afc: 0x000a, 0x1afd: 0x000a, 0x1afe: 0x000a, 0x1aff: 0x000a, // Block 0x6c, offset 0x1b00 0x1b00: 0x000a, 0x1b01: 0x000a, 0x1b02: 0x000a, 0x1b03: 0x000a, 0x1b04: 0x000a, // Block 0x6d, offset 0x1b40 0x1b40: 0x000a, 0x1b41: 0x000a, 0x1b42: 0x000a, 0x1b43: 0x000a, 0x1b44: 0x000a, 0x1b45: 0x000a, 0x1b46: 0x000a, 0x1b47: 0x000a, 0x1b48: 0x000a, 0x1b49: 0x000a, 0x1b4a: 0x000a, 0x1b4b: 0x000a, 0x1b4c: 0x000a, 0x1b4d: 0x000a, 0x1b4e: 0x000a, 0x1b4f: 0x000a, 0x1b50: 0x000a, 0x1b51: 0x000a, 0x1b52: 0x000a, 0x1b53: 0x000a, 0x1b54: 0x000a, 0x1b55: 0x000a, 0x1b56: 0x000a, 0x1b57: 0x000a, 0x1b58: 0x000a, 0x1b59: 0x000a, 0x1b5b: 0x000a, 0x1b5c: 0x000a, 0x1b5d: 0x000a, 0x1b5e: 0x000a, 0x1b5f: 0x000a, 0x1b60: 0x000a, 0x1b61: 0x000a, 0x1b62: 0x000a, 0x1b63: 0x000a, 0x1b64: 0x000a, 0x1b65: 0x000a, 0x1b66: 0x000a, 0x1b67: 0x000a, 0x1b68: 0x000a, 0x1b69: 0x000a, 0x1b6a: 0x000a, 0x1b6b: 0x000a, 0x1b6c: 0x000a, 0x1b6d: 0x000a, 0x1b6e: 0x000a, 0x1b6f: 0x000a, 0x1b70: 0x000a, 0x1b71: 0x000a, 0x1b72: 0x000a, 0x1b73: 0x000a, 0x1b74: 0x000a, 0x1b75: 0x000a, 0x1b76: 0x000a, 0x1b77: 0x000a, 0x1b78: 0x000a, 0x1b79: 0x000a, 0x1b7a: 0x000a, 0x1b7b: 0x000a, 0x1b7c: 0x000a, 0x1b7d: 0x000a, 0x1b7e: 0x000a, 0x1b7f: 0x000a, // Block 0x6e, offset 0x1b80 0x1b80: 0x000a, 0x1b81: 0x000a, 0x1b82: 0x000a, 0x1b83: 0x000a, 0x1b84: 0x000a, 0x1b85: 0x000a, 0x1b86: 0x000a, 0x1b87: 0x000a, 0x1b88: 0x000a, 0x1b89: 0x000a, 0x1b8a: 0x000a, 0x1b8b: 0x000a, 0x1b8c: 0x000a, 0x1b8d: 0x000a, 0x1b8e: 0x000a, 0x1b8f: 0x000a, 0x1b90: 0x000a, 0x1b91: 0x000a, 0x1b92: 0x000a, 0x1b93: 0x000a, 0x1b94: 0x000a, 0x1b95: 0x000a, 0x1b96: 0x000a, 0x1b97: 0x000a, 0x1b98: 0x000a, 0x1b99: 0x000a, 0x1b9a: 0x000a, 0x1b9b: 0x000a, 0x1b9c: 0x000a, 0x1b9d: 0x000a, 0x1b9e: 0x000a, 0x1b9f: 0x000a, 0x1ba0: 0x000a, 0x1ba1: 0x000a, 0x1ba2: 0x000a, 0x1ba3: 0x000a, 0x1ba4: 0x000a, 0x1ba5: 0x000a, 0x1ba6: 0x000a, 0x1ba7: 0x000a, 0x1ba8: 0x000a, 0x1ba9: 0x000a, 0x1baa: 0x000a, 0x1bab: 0x000a, 0x1bac: 0x000a, 0x1bad: 0x000a, 0x1bae: 0x000a, 0x1baf: 0x000a, 0x1bb0: 0x000a, 0x1bb1: 0x000a, 0x1bb2: 0x000a, 0x1bb3: 0x000a, // Block 0x6f, offset 0x1bc0 0x1bc0: 0x000a, 0x1bc1: 0x000a, 0x1bc2: 0x000a, 0x1bc3: 0x000a, 0x1bc4: 0x000a, 0x1bc5: 0x000a, 0x1bc6: 0x000a, 0x1bc7: 0x000a, 0x1bc8: 0x000a, 0x1bc9: 0x000a, 0x1bca: 0x000a, 0x1bcb: 0x000a, 0x1bcc: 0x000a, 0x1bcd: 0x000a, 0x1bce: 0x000a, 0x1bcf: 0x000a, 0x1bd0: 0x000a, 0x1bd1: 0x000a, 0x1bd2: 0x000a, 0x1bd3: 0x000a, 0x1bd4: 0x000a, 0x1bd5: 0x000a, 0x1bf0: 0x000a, 0x1bf1: 0x000a, 0x1bf2: 0x000a, 0x1bf3: 0x000a, 0x1bf4: 0x000a, 0x1bf5: 0x000a, 0x1bf6: 0x000a, 0x1bf7: 0x000a, 0x1bf8: 0x000a, 0x1bf9: 0x000a, 0x1bfa: 0x000a, 0x1bfb: 0x000a, // Block 0x70, offset 0x1c00 0x1c00: 0x0009, 0x1c01: 0x000a, 0x1c02: 0x000a, 0x1c03: 0x000a, 0x1c04: 0x000a, 0x1c08: 0x003a, 0x1c09: 0x002a, 0x1c0a: 0x003a, 0x1c0b: 0x002a, 0x1c0c: 0x003a, 0x1c0d: 0x002a, 0x1c0e: 0x003a, 0x1c0f: 0x002a, 0x1c10: 0x003a, 0x1c11: 0x002a, 0x1c12: 0x000a, 0x1c13: 0x000a, 0x1c14: 0x003a, 0x1c15: 0x002a, 0x1c16: 0x003a, 0x1c17: 0x002a, 0x1c18: 0x003a, 0x1c19: 0x002a, 0x1c1a: 0x003a, 0x1c1b: 0x002a, 0x1c1c: 0x000a, 0x1c1d: 0x000a, 0x1c1e: 0x000a, 0x1c1f: 0x000a, 0x1c20: 0x000a, 0x1c2a: 0x000c, 0x1c2b: 0x000c, 0x1c2c: 0x000c, 0x1c2d: 0x000c, 0x1c30: 0x000a, 0x1c36: 0x000a, 0x1c37: 0x000a, 0x1c3d: 0x000a, 0x1c3e: 0x000a, 0x1c3f: 0x000a, // Block 0x71, offset 0x1c40 0x1c59: 0x000c, 0x1c5a: 0x000c, 0x1c5b: 0x000a, 0x1c5c: 0x000a, 0x1c60: 0x000a, // Block 0x72, offset 0x1c80 0x1cbb: 0x000a, // Block 0x73, offset 0x1cc0 0x1cc0: 0x000a, 0x1cc1: 0x000a, 0x1cc2: 0x000a, 0x1cc3: 0x000a, 0x1cc4: 0x000a, 0x1cc5: 0x000a, 0x1cc6: 0x000a, 0x1cc7: 0x000a, 0x1cc8: 0x000a, 0x1cc9: 0x000a, 0x1cca: 0x000a, 0x1ccb: 0x000a, 0x1ccc: 0x000a, 0x1ccd: 0x000a, 0x1cce: 0x000a, 0x1ccf: 0x000a, 0x1cd0: 0x000a, 0x1cd1: 0x000a, 0x1cd2: 0x000a, 0x1cd3: 0x000a, 0x1cd4: 0x000a, 0x1cd5: 0x000a, 0x1cd6: 0x000a, 0x1cd7: 0x000a, 0x1cd8: 0x000a, 0x1cd9: 0x000a, 0x1cda: 0x000a, 0x1cdb: 0x000a, 0x1cdc: 0x000a, 0x1cdd: 0x000a, 0x1cde: 0x000a, 0x1cdf: 0x000a, 0x1ce0: 0x000a, 0x1ce1: 0x000a, 0x1ce2: 0x000a, 0x1ce3: 0x000a, // Block 0x74, offset 0x1d00 0x1d1d: 0x000a, 0x1d1e: 0x000a, // Block 0x75, offset 0x1d40 0x1d50: 0x000a, 0x1d51: 0x000a, 0x1d52: 0x000a, 0x1d53: 0x000a, 0x1d54: 0x000a, 0x1d55: 0x000a, 0x1d56: 0x000a, 0x1d57: 0x000a, 0x1d58: 0x000a, 0x1d59: 0x000a, 0x1d5a: 0x000a, 0x1d5b: 0x000a, 0x1d5c: 0x000a, 0x1d5d: 0x000a, 0x1d5e: 0x000a, 0x1d5f: 0x000a, 0x1d7c: 0x000a, 0x1d7d: 0x000a, 0x1d7e: 0x000a, // Block 0x76, offset 0x1d80 0x1db1: 0x000a, 0x1db2: 0x000a, 0x1db3: 0x000a, 0x1db4: 0x000a, 0x1db5: 0x000a, 0x1db6: 0x000a, 0x1db7: 0x000a, 0x1db8: 0x000a, 0x1db9: 0x000a, 0x1dba: 0x000a, 0x1dbb: 0x000a, 0x1dbc: 0x000a, 0x1dbd: 0x000a, 0x1dbe: 0x000a, 0x1dbf: 0x000a, // Block 0x77, offset 0x1dc0 0x1dcc: 0x000a, 0x1dcd: 0x000a, 0x1dce: 0x000a, 0x1dcf: 0x000a, // Block 0x78, offset 0x1e00 0x1e37: 0x000a, 0x1e38: 0x000a, 0x1e39: 0x000a, 0x1e3a: 0x000a, // Block 0x79, offset 0x1e40 0x1e5e: 0x000a, 0x1e5f: 0x000a, 0x1e7f: 0x000a, // Block 0x7a, offset 0x1e80 0x1e90: 0x000a, 0x1e91: 0x000a, 0x1e92: 0x000a, 0x1e93: 0x000a, 0x1e94: 0x000a, 0x1e95: 0x000a, 0x1e96: 0x000a, 0x1e97: 0x000a, 0x1e98: 0x000a, 0x1e99: 0x000a, 0x1e9a: 0x000a, 0x1e9b: 0x000a, 0x1e9c: 0x000a, 0x1e9d: 0x000a, 0x1e9e: 0x000a, 0x1e9f: 0x000a, 0x1ea0: 0x000a, 0x1ea1: 0x000a, 0x1ea2: 0x000a, 0x1ea3: 0x000a, 0x1ea4: 0x000a, 0x1ea5: 0x000a, 0x1ea6: 0x000a, 0x1ea7: 0x000a, 0x1ea8: 0x000a, 0x1ea9: 0x000a, 0x1eaa: 0x000a, 0x1eab: 0x000a, 0x1eac: 0x000a, 0x1ead: 0x000a, 0x1eae: 0x000a, 0x1eaf: 0x000a, 0x1eb0: 0x000a, 0x1eb1: 0x000a, 0x1eb2: 0x000a, 0x1eb3: 0x000a, 0x1eb4: 0x000a, 0x1eb5: 0x000a, 0x1eb6: 0x000a, 0x1eb7: 0x000a, 0x1eb8: 0x000a, 0x1eb9: 0x000a, 0x1eba: 0x000a, 0x1ebb: 0x000a, 0x1ebc: 0x000a, 0x1ebd: 0x000a, 0x1ebe: 0x000a, 0x1ebf: 0x000a, // Block 0x7b, offset 0x1ec0 0x1ec0: 0x000a, 0x1ec1: 0x000a, 0x1ec2: 0x000a, 0x1ec3: 0x000a, 0x1ec4: 0x000a, 0x1ec5: 0x000a, 0x1ec6: 0x000a, // Block 0x7c, offset 0x1f00 0x1f0d: 0x000a, 0x1f0e: 0x000a, 0x1f0f: 0x000a, // Block 0x7d, offset 0x1f40 0x1f6f: 0x000c, 0x1f70: 0x000c, 0x1f71: 0x000c, 0x1f72: 0x000c, 0x1f73: 0x000a, 0x1f74: 0x000c, 0x1f75: 0x000c, 0x1f76: 0x000c, 0x1f77: 0x000c, 0x1f78: 0x000c, 0x1f79: 0x000c, 0x1f7a: 0x000c, 0x1f7b: 0x000c, 0x1f7c: 0x000c, 0x1f7d: 0x000c, 0x1f7e: 0x000a, 0x1f7f: 0x000a, // Block 0x7e, offset 0x1f80 0x1f9e: 0x000c, 0x1f9f: 0x000c, // Block 0x7f, offset 0x1fc0 0x1ff0: 0x000c, 0x1ff1: 0x000c, // Block 0x80, offset 0x2000 0x2000: 0x000a, 0x2001: 0x000a, 0x2002: 0x000a, 0x2003: 0x000a, 0x2004: 0x000a, 0x2005: 0x000a, 0x2006: 0x000a, 0x2007: 0x000a, 0x2008: 0x000a, 0x2009: 0x000a, 0x200a: 0x000a, 0x200b: 0x000a, 0x200c: 0x000a, 0x200d: 0x000a, 0x200e: 0x000a, 0x200f: 0x000a, 0x2010: 0x000a, 0x2011: 0x000a, 0x2012: 0x000a, 0x2013: 0x000a, 0x2014: 0x000a, 0x2015: 0x000a, 0x2016: 0x000a, 0x2017: 0x000a, 0x2018: 0x000a, 0x2019: 0x000a, 0x201a: 0x000a, 0x201b: 0x000a, 0x201c: 0x000a, 0x201d: 0x000a, 0x201e: 0x000a, 0x201f: 0x000a, 0x2020: 0x000a, 0x2021: 0x000a, // Block 0x81, offset 0x2040 0x2048: 0x000a, // Block 0x82, offset 0x2080 0x2082: 0x000c, 0x2086: 0x000c, 0x208b: 0x000c, 0x20a5: 0x000c, 0x20a6: 0x000c, 0x20a8: 0x000a, 0x20a9: 0x000a, 0x20aa: 0x000a, 0x20ab: 0x000a, 0x20b8: 0x0004, 0x20b9: 0x0004, // Block 0x83, offset 0x20c0 0x20f4: 0x000a, 0x20f5: 0x000a, 0x20f6: 0x000a, 0x20f7: 0x000a, // Block 0x84, offset 0x2100 0x2104: 0x000c, 0x2105: 0x000c, 0x2120: 0x000c, 0x2121: 0x000c, 0x2122: 0x000c, 0x2123: 0x000c, 0x2124: 0x000c, 0x2125: 0x000c, 0x2126: 0x000c, 0x2127: 0x000c, 0x2128: 0x000c, 0x2129: 0x000c, 0x212a: 0x000c, 0x212b: 0x000c, 0x212c: 0x000c, 0x212d: 0x000c, 0x212e: 0x000c, 0x212f: 0x000c, 0x2130: 0x000c, 0x2131: 0x000c, // Block 0x85, offset 0x2140 0x2166: 0x000c, 0x2167: 0x000c, 0x2168: 0x000c, 0x2169: 0x000c, 0x216a: 0x000c, 0x216b: 0x000c, 0x216c: 0x000c, 0x216d: 0x000c, // Block 0x86, offset 0x2180 0x2187: 0x000c, 0x2188: 0x000c, 0x2189: 0x000c, 0x218a: 0x000c, 0x218b: 0x000c, 0x218c: 0x000c, 0x218d: 0x000c, 0x218e: 0x000c, 0x218f: 0x000c, 0x2190: 0x000c, 0x2191: 0x000c, // Block 0x87, offset 0x21c0 0x21c0: 0x000c, 0x21c1: 0x000c, 0x21c2: 0x000c, 0x21f3: 0x000c, 0x21f6: 0x000c, 0x21f7: 0x000c, 0x21f8: 0x000c, 0x21f9: 0x000c, 0x21fc: 0x000c, // Block 0x88, offset 0x2200 0x2225: 0x000c, // Block 0x89, offset 0x2240 0x2269: 0x000c, 0x226a: 0x000c, 0x226b: 0x000c, 0x226c: 0x000c, 0x226d: 0x000c, 0x226e: 0x000c, 0x2271: 0x000c, 0x2272: 0x000c, 0x2275: 0x000c, 0x2276: 0x000c, // Block 0x8a, offset 0x2280 0x2283: 0x000c, 0x228c: 0x000c, 0x22bc: 0x000c, // Block 0x8b, offset 0x22c0 0x22f0: 0x000c, 0x22f2: 0x000c, 0x22f3: 0x000c, 0x22f4: 0x000c, 0x22f7: 0x000c, 0x22f8: 0x000c, 0x22fe: 0x000c, 0x22ff: 0x000c, // Block 0x8c, offset 0x2300 0x2301: 0x000c, 0x232c: 0x000c, 0x232d: 0x000c, 0x2336: 0x000c, // Block 0x8d, offset 0x2340 0x2365: 0x000c, 0x2368: 0x000c, 0x236d: 0x000c, // Block 0x8e, offset 0x2380 0x239d: 0x0001, 0x239e: 0x000c, 0x239f: 0x0001, 0x23a0: 0x0001, 0x23a1: 0x0001, 0x23a2: 0x0001, 0x23a3: 0x0001, 0x23a4: 0x0001, 0x23a5: 0x0001, 0x23a6: 0x0001, 0x23a7: 0x0001, 0x23a8: 0x0001, 0x23a9: 0x0003, 0x23aa: 0x0001, 0x23ab: 0x0001, 0x23ac: 0x0001, 0x23ad: 0x0001, 0x23ae: 0x0001, 0x23af: 0x0001, 0x23b0: 0x0001, 0x23b1: 0x0001, 0x23b2: 0x0001, 0x23b3: 0x0001, 0x23b4: 0x0001, 0x23b5: 0x0001, 0x23b6: 0x0001, 0x23b7: 0x0001, 0x23b8: 0x0001, 0x23b9: 0x0001, 0x23ba: 0x0001, 0x23bb: 0x0001, 0x23bc: 0x0001, 0x23bd: 0x0001, 0x23be: 0x0001, 0x23bf: 0x0001, // Block 0x8f, offset 0x23c0 0x23c0: 0x0001, 0x23c1: 0x0001, 0x23c2: 0x0001, 0x23c3: 0x0001, 0x23c4: 0x0001, 0x23c5: 0x0001, 0x23c6: 0x0001, 0x23c7: 0x0001, 0x23c8: 0x0001, 0x23c9: 0x0001, 0x23ca: 0x0001, 0x23cb: 0x0001, 0x23cc: 0x0001, 0x23cd: 0x0001, 0x23ce: 0x0001, 0x23cf: 0x0001, 0x23d0: 0x000d, 0x23d1: 0x000d, 0x23d2: 0x000d, 0x23d3: 0x000d, 0x23d4: 0x000d, 0x23d5: 0x000d, 0x23d6: 0x000d, 0x23d7: 0x000d, 0x23d8: 0x000d, 0x23d9: 0x000d, 0x23da: 0x000d, 0x23db: 0x000d, 0x23dc: 0x000d, 0x23dd: 0x000d, 0x23de: 0x000d, 0x23df: 0x000d, 0x23e0: 0x000d, 0x23e1: 0x000d, 0x23e2: 0x000d, 0x23e3: 0x000d, 0x23e4: 0x000d, 0x23e5: 0x000d, 0x23e6: 0x000d, 0x23e7: 0x000d, 0x23e8: 0x000d, 0x23e9: 0x000d, 0x23ea: 0x000d, 0x23eb: 0x000d, 0x23ec: 0x000d, 0x23ed: 0x000d, 0x23ee: 0x000d, 0x23ef: 0x000d, 0x23f0: 0x000d, 0x23f1: 0x000d, 0x23f2: 0x000d, 0x23f3: 0x000d, 0x23f4: 0x000d, 0x23f5: 0x000d, 0x23f6: 0x000d, 0x23f7: 0x000d, 0x23f8: 0x000d, 0x23f9: 0x000d, 0x23fa: 0x000d, 0x23fb: 0x000d, 0x23fc: 0x000d, 0x23fd: 0x000d, 0x23fe: 0x000d, 0x23ff: 0x000d, // Block 0x90, offset 0x2400 0x2400: 0x000d, 0x2401: 0x000d, 0x2402: 0x000d, 0x2403: 0x000d, 0x2404: 0x000d, 0x2405: 0x000d, 0x2406: 0x000d, 0x2407: 0x000d, 0x2408: 0x000d, 0x2409: 0x000d, 0x240a: 0x000d, 0x240b: 0x000d, 0x240c: 0x000d, 0x240d: 0x000d, 0x240e: 0x000d, 0x240f: 0x000d, 0x2410: 0x000d, 0x2411: 0x000d, 0x2412: 0x000d, 0x2413: 0x000d, 0x2414: 0x000d, 0x2415: 0x000d, 0x2416: 0x000d, 0x2417: 0x000d, 0x2418: 0x000d, 0x2419: 0x000d, 0x241a: 0x000d, 0x241b: 0x000d, 0x241c: 0x000d, 0x241d: 0x000d, 0x241e: 0x000d, 0x241f: 0x000d, 0x2420: 0x000d, 0x2421: 0x000d, 0x2422: 0x000d, 0x2423: 0x000d, 0x2424: 0x000d, 0x2425: 0x000d, 0x2426: 0x000d, 0x2427: 0x000d, 0x2428: 0x000d, 0x2429: 0x000d, 0x242a: 0x000d, 0x242b: 0x000d, 0x242c: 0x000d, 0x242d: 0x000d, 0x242e: 0x000d, 0x242f: 0x000d, 0x2430: 0x000d, 0x2431: 0x000d, 0x2432: 0x000d, 0x2433: 0x000d, 0x2434: 0x000d, 0x2435: 0x000d, 0x2436: 0x000d, 0x2437: 0x000d, 0x2438: 0x000d, 0x2439: 0x000d, 0x243a: 0x000d, 0x243b: 0x000d, 0x243c: 0x000d, 0x243d: 0x000d, 0x243e: 0x000a, 0x243f: 0x000a, // Block 0x91, offset 0x2440 0x2440: 0x000d, 0x2441: 0x000d, 0x2442: 0x000d, 0x2443: 0x000d, 0x2444: 0x000d, 0x2445: 0x000d, 0x2446: 0x000d, 0x2447: 0x000d, 0x2448: 0x000d, 0x2449: 0x000d, 0x244a: 0x000d, 0x244b: 0x000d, 0x244c: 0x000d, 0x244d: 0x000d, 0x244e: 0x000d, 0x244f: 0x000d, 0x2450: 0x000b, 0x2451: 0x000b, 0x2452: 0x000b, 0x2453: 0x000b, 0x2454: 0x000b, 0x2455: 0x000b, 0x2456: 0x000b, 0x2457: 0x000b, 0x2458: 0x000b, 0x2459: 0x000b, 0x245a: 0x000b, 0x245b: 0x000b, 0x245c: 0x000b, 0x245d: 0x000b, 0x245e: 0x000b, 0x245f: 0x000b, 0x2460: 0x000b, 0x2461: 0x000b, 0x2462: 0x000b, 0x2463: 0x000b, 0x2464: 0x000b, 0x2465: 0x000b, 0x2466: 0x000b, 0x2467: 0x000b, 0x2468: 0x000b, 0x2469: 0x000b, 0x246a: 0x000b, 0x246b: 0x000b, 0x246c: 0x000b, 0x246d: 0x000b, 0x246e: 0x000b, 0x246f: 0x000b, 0x2470: 0x000d, 0x2471: 0x000d, 0x2472: 0x000d, 0x2473: 0x000d, 0x2474: 0x000d, 0x2475: 0x000d, 0x2476: 0x000d, 0x2477: 0x000d, 0x2478: 0x000d, 0x2479: 0x000d, 0x247a: 0x000d, 0x247b: 0x000d, 0x247c: 0x000d, 0x247d: 0x000a, 0x247e: 0x000d, 0x247f: 0x000d, // Block 0x92, offset 0x2480 0x2480: 0x000c, 0x2481: 0x000c, 0x2482: 0x000c, 0x2483: 0x000c, 0x2484: 0x000c, 0x2485: 0x000c, 0x2486: 0x000c, 0x2487: 0x000c, 0x2488: 0x000c, 0x2489: 0x000c, 0x248a: 0x000c, 0x248b: 0x000c, 0x248c: 0x000c, 0x248d: 0x000c, 0x248e: 0x000c, 0x248f: 0x000c, 0x2490: 0x000a, 0x2491: 0x000a, 0x2492: 0x000a, 0x2493: 0x000a, 0x2494: 0x000a, 0x2495: 0x000a, 0x2496: 0x000a, 0x2497: 0x000a, 0x2498: 0x000a, 0x2499: 0x000a, 0x24a0: 0x000c, 0x24a1: 0x000c, 0x24a2: 0x000c, 0x24a3: 0x000c, 0x24a4: 0x000c, 0x24a5: 0x000c, 0x24a6: 0x000c, 0x24a7: 0x000c, 0x24a8: 0x000c, 0x24a9: 0x000c, 0x24aa: 0x000c, 0x24ab: 0x000c, 0x24ac: 0x000c, 0x24ad: 0x000c, 0x24ae: 0x000c, 0x24af: 0x000c, 0x24b0: 0x000a, 0x24b1: 0x000a, 0x24b2: 0x000a, 0x24b3: 0x000a, 0x24b4: 0x000a, 0x24b5: 0x000a, 0x24b6: 0x000a, 0x24b7: 0x000a, 0x24b8: 0x000a, 0x24b9: 0x000a, 0x24ba: 0x000a, 0x24bb: 0x000a, 0x24bc: 0x000a, 0x24bd: 0x000a, 0x24be: 0x000a, 0x24bf: 0x000a, // Block 0x93, offset 0x24c0 0x24c0: 0x000a, 0x24c1: 0x000a, 0x24c2: 0x000a, 0x24c3: 0x000a, 0x24c4: 0x000a, 0x24c5: 0x000a, 0x24c6: 0x000a, 0x24c7: 0x000a, 0x24c8: 0x000a, 0x24c9: 0x000a, 0x24ca: 0x000a, 0x24cb: 0x000a, 0x24cc: 0x000a, 0x24cd: 0x000a, 0x24ce: 0x000a, 0x24cf: 0x000a, 0x24d0: 0x0006, 0x24d1: 0x000a, 0x24d2: 0x0006, 0x24d4: 0x000a, 0x24d5: 0x0006, 0x24d6: 0x000a, 0x24d7: 0x000a, 0x24d8: 0x000a, 0x24d9: 0x009a, 0x24da: 0x008a, 0x24db: 0x007a, 0x24dc: 0x006a, 0x24dd: 0x009a, 0x24de: 0x008a, 0x24df: 0x0004, 0x24e0: 0x000a, 0x24e1: 0x000a, 0x24e2: 0x0003, 0x24e3: 0x0003, 0x24e4: 0x000a, 0x24e5: 0x000a, 0x24e6: 0x000a, 0x24e8: 0x000a, 0x24e9: 0x0004, 0x24ea: 0x0004, 0x24eb: 0x000a, 0x24f0: 0x000d, 0x24f1: 0x000d, 0x24f2: 0x000d, 0x24f3: 0x000d, 0x24f4: 0x000d, 0x24f5: 0x000d, 0x24f6: 0x000d, 0x24f7: 0x000d, 0x24f8: 0x000d, 0x24f9: 0x000d, 0x24fa: 0x000d, 0x24fb: 0x000d, 0x24fc: 0x000d, 0x24fd: 0x000d, 0x24fe: 0x000d, 0x24ff: 0x000d, // Block 0x94, offset 0x2500 0x2500: 0x000d, 0x2501: 0x000d, 0x2502: 0x000d, 0x2503: 0x000d, 0x2504: 0x000d, 0x2505: 0x000d, 0x2506: 0x000d, 0x2507: 0x000d, 0x2508: 0x000d, 0x2509: 0x000d, 0x250a: 0x000d, 0x250b: 0x000d, 0x250c: 0x000d, 0x250d: 0x000d, 0x250e: 0x000d, 0x250f: 0x000d, 0x2510: 0x000d, 0x2511: 0x000d, 0x2512: 0x000d, 0x2513: 0x000d, 0x2514: 0x000d, 0x2515: 0x000d, 0x2516: 0x000d, 0x2517: 0x000d, 0x2518: 0x000d, 0x2519: 0x000d, 0x251a: 0x000d, 0x251b: 0x000d, 0x251c: 0x000d, 0x251d: 0x000d, 0x251e: 0x000d, 0x251f: 0x000d, 0x2520: 0x000d, 0x2521: 0x000d, 0x2522: 0x000d, 0x2523: 0x000d, 0x2524: 0x000d, 0x2525: 0x000d, 0x2526: 0x000d, 0x2527: 0x000d, 0x2528: 0x000d, 0x2529: 0x000d, 0x252a: 0x000d, 0x252b: 0x000d, 0x252c: 0x000d, 0x252d: 0x000d, 0x252e: 0x000d, 0x252f: 0x000d, 0x2530: 0x000d, 0x2531: 0x000d, 0x2532: 0x000d, 0x2533: 0x000d, 0x2534: 0x000d, 0x2535: 0x000d, 0x2536: 0x000d, 0x2537: 0x000d, 0x2538: 0x000d, 0x2539: 0x000d, 0x253a: 0x000d, 0x253b: 0x000d, 0x253c: 0x000d, 0x253d: 0x000d, 0x253e: 0x000d, 0x253f: 0x000b, // Block 0x95, offset 0x2540 0x2541: 0x000a, 0x2542: 0x000a, 0x2543: 0x0004, 0x2544: 0x0004, 0x2545: 0x0004, 0x2546: 0x000a, 0x2547: 0x000a, 0x2548: 0x003a, 0x2549: 0x002a, 0x254a: 0x000a, 0x254b: 0x0003, 0x254c: 0x0006, 0x254d: 0x0003, 0x254e: 0x0006, 0x254f: 0x0006, 0x2550: 0x0002, 0x2551: 0x0002, 0x2552: 0x0002, 0x2553: 0x0002, 0x2554: 0x0002, 0x2555: 0x0002, 0x2556: 0x0002, 0x2557: 0x0002, 0x2558: 0x0002, 0x2559: 0x0002, 0x255a: 0x0006, 0x255b: 0x000a, 0x255c: 0x000a, 0x255d: 0x000a, 0x255e: 0x000a, 0x255f: 0x000a, 0x2560: 0x000a, 0x257b: 0x005a, 0x257c: 0x000a, 0x257d: 0x004a, 0x257e: 0x000a, 0x257f: 0x000a, // Block 0x96, offset 0x2580 0x2580: 0x000a, 0x259b: 0x005a, 0x259c: 0x000a, 0x259d: 0x004a, 0x259e: 0x000a, 0x259f: 0x00fa, 0x25a0: 0x00ea, 0x25a1: 0x000a, 0x25a2: 0x003a, 0x25a3: 0x002a, 0x25a4: 0x000a, 0x25a5: 0x000a, // Block 0x97, offset 0x25c0 0x25e0: 0x0004, 0x25e1: 0x0004, 0x25e2: 0x000a, 0x25e3: 0x000a, 0x25e4: 0x000a, 0x25e5: 0x0004, 0x25e6: 0x0004, 0x25e8: 0x000a, 0x25e9: 0x000a, 0x25ea: 0x000a, 0x25eb: 0x000a, 0x25ec: 0x000a, 0x25ed: 0x000a, 0x25ee: 0x000a, 0x25f0: 0x000b, 0x25f1: 0x000b, 0x25f2: 0x000b, 0x25f3: 0x000b, 0x25f4: 0x000b, 0x25f5: 0x000b, 0x25f6: 0x000b, 0x25f7: 0x000b, 0x25f8: 0x000b, 0x25f9: 0x000a, 0x25fa: 0x000a, 0x25fb: 0x000a, 0x25fc: 0x000a, 0x25fd: 0x000a, 0x25fe: 0x000b, 0x25ff: 0x000b, // Block 0x98, offset 0x2600 0x2601: 0x000a, // Block 0x99, offset 0x2640 0x2640: 0x000a, 0x2641: 0x000a, 0x2642: 0x000a, 0x2643: 0x000a, 0x2644: 0x000a, 0x2645: 0x000a, 0x2646: 0x000a, 0x2647: 0x000a, 0x2648: 0x000a, 0x2649: 0x000a, 0x264a: 0x000a, 0x264b: 0x000a, 0x264c: 0x000a, 0x2650: 0x000a, 0x2651: 0x000a, 0x2652: 0x000a, 0x2653: 0x000a, 0x2654: 0x000a, 0x2655: 0x000a, 0x2656: 0x000a, 0x2657: 0x000a, 0x2658: 0x000a, 0x2659: 0x000a, 0x265a: 0x000a, 0x265b: 0x000a, 0x2660: 0x000a, // Block 0x9a, offset 0x2680 0x26bd: 0x000c, // Block 0x9b, offset 0x26c0 0x26e0: 0x000c, 0x26e1: 0x0002, 0x26e2: 0x0002, 0x26e3: 0x0002, 0x26e4: 0x0002, 0x26e5: 0x0002, 0x26e6: 0x0002, 0x26e7: 0x0002, 0x26e8: 0x0002, 0x26e9: 0x0002, 0x26ea: 0x0002, 0x26eb: 0x0002, 0x26ec: 0x0002, 0x26ed: 0x0002, 0x26ee: 0x0002, 0x26ef: 0x0002, 0x26f0: 0x0002, 0x26f1: 0x0002, 0x26f2: 0x0002, 0x26f3: 0x0002, 0x26f4: 0x0002, 0x26f5: 0x0002, 0x26f6: 0x0002, 0x26f7: 0x0002, 0x26f8: 0x0002, 0x26f9: 0x0002, 0x26fa: 0x0002, 0x26fb: 0x0002, // Block 0x9c, offset 0x2700 0x2736: 0x000c, 0x2737: 0x000c, 0x2738: 0x000c, 0x2739: 0x000c, 0x273a: 0x000c, // Block 0x9d, offset 0x2740 0x2740: 0x0001, 0x2741: 0x0001, 0x2742: 0x0001, 0x2743: 0x0001, 0x2744: 0x0001, 0x2745: 0x0001, 0x2746: 0x0001, 0x2747: 0x0001, 0x2748: 0x0001, 0x2749: 0x0001, 0x274a: 0x0001, 0x274b: 0x0001, 0x274c: 0x0001, 0x274d: 0x0001, 0x274e: 0x0001, 0x274f: 0x0001, 0x2750: 0x0001, 0x2751: 0x0001, 0x2752: 0x0001, 0x2753: 0x0001, 0x2754: 0x0001, 0x2755: 0x0001, 0x2756: 0x0001, 0x2757: 0x0001, 0x2758: 0x0001, 0x2759: 0x0001, 0x275a: 0x0001, 0x275b: 0x0001, 0x275c: 0x0001, 0x275d: 0x0001, 0x275e: 0x0001, 0x275f: 0x0001, 0x2760: 0x0001, 0x2761: 0x0001, 0x2762: 0x0001, 0x2763: 0x0001, 0x2764: 0x0001, 0x2765: 0x0001, 0x2766: 0x0001, 0x2767: 0x0001, 0x2768: 0x0001, 0x2769: 0x0001, 0x276a: 0x0001, 0x276b: 0x0001, 0x276c: 0x0001, 0x276d: 0x0001, 0x276e: 0x0001, 0x276f: 0x0001, 0x2770: 0x0001, 0x2771: 0x0001, 0x2772: 0x0001, 0x2773: 0x0001, 0x2774: 0x0001, 0x2775: 0x0001, 0x2776: 0x0001, 0x2777: 0x0001, 0x2778: 0x0001, 0x2779: 0x0001, 0x277a: 0x0001, 0x277b: 0x0001, 0x277c: 0x0001, 0x277d: 0x0001, 0x277e: 0x0001, 0x277f: 0x0001, // Block 0x9e, offset 0x2780 0x2780: 0x0001, 0x2781: 0x0001, 0x2782: 0x0001, 0x2783: 0x0001, 0x2784: 0x0001, 0x2785: 0x0001, 0x2786: 0x0001, 0x2787: 0x0001, 0x2788: 0x0001, 0x2789: 0x0001, 0x278a: 0x0001, 0x278b: 0x0001, 0x278c: 0x0001, 0x278d: 0x0001, 0x278e: 0x0001, 0x278f: 0x0001, 0x2790: 0x0001, 0x2791: 0x0001, 0x2792: 0x0001, 0x2793: 0x0001, 0x2794: 0x0001, 0x2795: 0x0001, 0x2796: 0x0001, 0x2797: 0x0001, 0x2798: 0x0001, 0x2799: 0x0001, 0x279a: 0x0001, 0x279b: 0x0001, 0x279c: 0x0001, 0x279d: 0x0001, 0x279e: 0x0001, 0x279f: 0x000a, 0x27a0: 0x0001, 0x27a1: 0x0001, 0x27a2: 0x0001, 0x27a3: 0x0001, 0x27a4: 0x0001, 0x27a5: 0x0001, 0x27a6: 0x0001, 0x27a7: 0x0001, 0x27a8: 0x0001, 0x27a9: 0x0001, 0x27aa: 0x0001, 0x27ab: 0x0001, 0x27ac: 0x0001, 0x27ad: 0x0001, 0x27ae: 0x0001, 0x27af: 0x0001, 0x27b0: 0x0001, 0x27b1: 0x0001, 0x27b2: 0x0001, 0x27b3: 0x0001, 0x27b4: 0x0001, 0x27b5: 0x0001, 0x27b6: 0x0001, 0x27b7: 0x0001, 0x27b8: 0x0001, 0x27b9: 0x0001, 0x27ba: 0x0001, 0x27bb: 0x0001, 0x27bc: 0x0001, 0x27bd: 0x0001, 0x27be: 0x0001, 0x27bf: 0x0001, // Block 0x9f, offset 0x27c0 0x27c0: 0x0001, 0x27c1: 0x000c, 0x27c2: 0x000c, 0x27c3: 0x000c, 0x27c4: 0x0001, 0x27c5: 0x000c, 0x27c6: 0x000c, 0x27c7: 0x0001, 0x27c8: 0x0001, 0x27c9: 0x0001, 0x27ca: 0x0001, 0x27cb: 0x0001, 0x27cc: 0x000c, 0x27cd: 0x000c, 0x27ce: 0x000c, 0x27cf: 0x000c, 0x27d0: 0x0001, 0x27d1: 0x0001, 0x27d2: 0x0001, 0x27d3: 0x0001, 0x27d4: 0x0001, 0x27d5: 0x0001, 0x27d6: 0x0001, 0x27d7: 0x0001, 0x27d8: 0x0001, 0x27d9: 0x0001, 0x27da: 0x0001, 0x27db: 0x0001, 0x27dc: 0x0001, 0x27dd: 0x0001, 0x27de: 0x0001, 0x27df: 0x0001, 0x27e0: 0x0001, 0x27e1: 0x0001, 0x27e2: 0x0001, 0x27e3: 0x0001, 0x27e4: 0x0001, 0x27e5: 0x0001, 0x27e6: 0x0001, 0x27e7: 0x0001, 0x27e8: 0x0001, 0x27e9: 0x0001, 0x27ea: 0x0001, 0x27eb: 0x0001, 0x27ec: 0x0001, 0x27ed: 0x0001, 0x27ee: 0x0001, 0x27ef: 0x0001, 0x27f0: 0x0001, 0x27f1: 0x0001, 0x27f2: 0x0001, 0x27f3: 0x0001, 0x27f4: 0x0001, 0x27f5: 0x0001, 0x27f6: 0x0001, 0x27f7: 0x0001, 0x27f8: 0x000c, 0x27f9: 0x000c, 0x27fa: 0x000c, 0x27fb: 0x0001, 0x27fc: 0x0001, 0x27fd: 0x0001, 0x27fe: 0x0001, 0x27ff: 0x000c, // Block 0xa0, offset 0x2800 0x2800: 0x0001, 0x2801: 0x0001, 0x2802: 0x0001, 0x2803: 0x0001, 0x2804: 0x0001, 0x2805: 0x0001, 0x2806: 0x0001, 0x2807: 0x0001, 0x2808: 0x0001, 0x2809: 0x0001, 0x280a: 0x0001, 0x280b: 0x0001, 0x280c: 0x0001, 0x280d: 0x0001, 0x280e: 0x0001, 0x280f: 0x0001, 0x2810: 0x0001, 0x2811: 0x0001, 0x2812: 0x0001, 0x2813: 0x0001, 0x2814: 0x0001, 0x2815: 0x0001, 0x2816: 0x0001, 0x2817: 0x0001, 0x2818: 0x0001, 0x2819: 0x0001, 0x281a: 0x0001, 0x281b: 0x0001, 0x281c: 0x0001, 0x281d: 0x0001, 0x281e: 0x0001, 0x281f: 0x0001, 0x2820: 0x0001, 0x2821: 0x0001, 0x2822: 0x0001, 0x2823: 0x0001, 0x2824: 0x0001, 0x2825: 0x000c, 0x2826: 0x000c, 0x2827: 0x0001, 0x2828: 0x0001, 0x2829: 0x0001, 0x282a: 0x0001, 0x282b: 0x0001, 0x282c: 0x0001, 0x282d: 0x0001, 0x282e: 0x0001, 0x282f: 0x0001, 0x2830: 0x0001, 0x2831: 0x0001, 0x2832: 0x0001, 0x2833: 0x0001, 0x2834: 0x0001, 0x2835: 0x0001, 0x2836: 0x0001, 0x2837: 0x0001, 0x2838: 0x0001, 0x2839: 0x0001, 0x283a: 0x0001, 0x283b: 0x0001, 0x283c: 0x0001, 0x283d: 0x0001, 0x283e: 0x0001, 0x283f: 0x0001, // Block 0xa1, offset 0x2840 0x2840: 0x0001, 0x2841: 0x0001, 0x2842: 0x0001, 0x2843: 0x0001, 0x2844: 0x0001, 0x2845: 0x0001, 0x2846: 0x0001, 0x2847: 0x0001, 0x2848: 0x0001, 0x2849: 0x0001, 0x284a: 0x0001, 0x284b: 0x0001, 0x284c: 0x0001, 0x284d: 0x0001, 0x284e: 0x0001, 0x284f: 0x0001, 0x2850: 0x0001, 0x2851: 0x0001, 0x2852: 0x0001, 0x2853: 0x0001, 0x2854: 0x0001, 0x2855: 0x0001, 0x2856: 0x0001, 0x2857: 0x0001, 0x2858: 0x0001, 0x2859: 0x0001, 0x285a: 0x0001, 0x285b: 0x0001, 0x285c: 0x0001, 0x285d: 0x0001, 0x285e: 0x0001, 0x285f: 0x0001, 0x2860: 0x0001, 0x2861: 0x0001, 0x2862: 0x0001, 0x2863: 0x0001, 0x2864: 0x0001, 0x2865: 0x0001, 0x2866: 0x0001, 0x2867: 0x0001, 0x2868: 0x0001, 0x2869: 0x0001, 0x286a: 0x0001, 0x286b: 0x0001, 0x286c: 0x0001, 0x286d: 0x0001, 0x286e: 0x0001, 0x286f: 0x0001, 0x2870: 0x0001, 0x2871: 0x0001, 0x2872: 0x0001, 0x2873: 0x0001, 0x2874: 0x0001, 0x2875: 0x0001, 0x2876: 0x0001, 0x2877: 0x0001, 0x2878: 0x0001, 0x2879: 0x000a, 0x287a: 0x000a, 0x287b: 0x000a, 0x287c: 0x000a, 0x287d: 0x000a, 0x287e: 0x000a, 0x287f: 0x000a, // Block 0xa2, offset 0x2880 0x2880: 0x0001, 0x2881: 0x0001, 0x2882: 0x0001, 0x2883: 0x0001, 0x2884: 0x0001, 0x2885: 0x0001, 0x2886: 0x0001, 0x2887: 0x0001, 0x2888: 0x0001, 0x2889: 0x0001, 0x288a: 0x0001, 0x288b: 0x0001, 0x288c: 0x0001, 0x288d: 0x0001, 0x288e: 0x0001, 0x288f: 0x0001, 0x2890: 0x0001, 0x2891: 0x0001, 0x2892: 0x0001, 0x2893: 0x0001, 0x2894: 0x0001, 0x2895: 0x0001, 0x2896: 0x0001, 0x2897: 0x0001, 0x2898: 0x0001, 0x2899: 0x0001, 0x289a: 0x0001, 0x289b: 0x0001, 0x289c: 0x0001, 0x289d: 0x0001, 0x289e: 0x0001, 0x289f: 0x0001, 0x28a0: 0x0005, 0x28a1: 0x0005, 0x28a2: 0x0005, 0x28a3: 0x0005, 0x28a4: 0x0005, 0x28a5: 0x0005, 0x28a6: 0x0005, 0x28a7: 0x0005, 0x28a8: 0x0005, 0x28a9: 0x0005, 0x28aa: 0x0005, 0x28ab: 0x0005, 0x28ac: 0x0005, 0x28ad: 0x0005, 0x28ae: 0x0005, 0x28af: 0x0005, 0x28b0: 0x0005, 0x28b1: 0x0005, 0x28b2: 0x0005, 0x28b3: 0x0005, 0x28b4: 0x0005, 0x28b5: 0x0005, 0x28b6: 0x0005, 0x28b7: 0x0005, 0x28b8: 0x0005, 0x28b9: 0x0005, 0x28ba: 0x0005, 0x28bb: 0x0005, 0x28bc: 0x0005, 0x28bd: 0x0005, 0x28be: 0x0005, 0x28bf: 0x0001, // Block 0xa3, offset 0x28c0 0x28c1: 0x000c, 0x28f8: 0x000c, 0x28f9: 0x000c, 0x28fa: 0x000c, 0x28fb: 0x000c, 0x28fc: 0x000c, 0x28fd: 0x000c, 0x28fe: 0x000c, 0x28ff: 0x000c, // Block 0xa4, offset 0x2900 0x2900: 0x000c, 0x2901: 0x000c, 0x2902: 0x000c, 0x2903: 0x000c, 0x2904: 0x000c, 0x2905: 0x000c, 0x2906: 0x000c, 0x2912: 0x000a, 0x2913: 0x000a, 0x2914: 0x000a, 0x2915: 0x000a, 0x2916: 0x000a, 0x2917: 0x000a, 0x2918: 0x000a, 0x2919: 0x000a, 0x291a: 0x000a, 0x291b: 0x000a, 0x291c: 0x000a, 0x291d: 0x000a, 0x291e: 0x000a, 0x291f: 0x000a, 0x2920: 0x000a, 0x2921: 0x000a, 0x2922: 0x000a, 0x2923: 0x000a, 0x2924: 0x000a, 0x2925: 0x000a, 0x293f: 0x000c, // Block 0xa5, offset 0x2940 0x2940: 0x000c, 0x2941: 0x000c, 0x2973: 0x000c, 0x2974: 0x000c, 0x2975: 0x000c, 0x2976: 0x000c, 0x2979: 0x000c, 0x297a: 0x000c, // Block 0xa6, offset 0x2980 0x2980: 0x000c, 0x2981: 0x000c, 0x2982: 0x000c, 0x29a7: 0x000c, 0x29a8: 0x000c, 0x29a9: 0x000c, 0x29aa: 0x000c, 0x29ab: 0x000c, 0x29ad: 0x000c, 0x29ae: 0x000c, 0x29af: 0x000c, 0x29b0: 0x000c, 0x29b1: 0x000c, 0x29b2: 0x000c, 0x29b3: 0x000c, 0x29b4: 0x000c, // Block 0xa7, offset 0x29c0 0x29f3: 0x000c, // Block 0xa8, offset 0x2a00 0x2a00: 0x000c, 0x2a01: 0x000c, 0x2a36: 0x000c, 0x2a37: 0x000c, 0x2a38: 0x000c, 0x2a39: 0x000c, 0x2a3a: 0x000c, 0x2a3b: 0x000c, 0x2a3c: 0x000c, 0x2a3d: 0x000c, 0x2a3e: 0x000c, // Block 0xa9, offset 0x2a40 0x2a4a: 0x000c, 0x2a4b: 0x000c, 0x2a4c: 0x000c, // Block 0xaa, offset 0x2a80 0x2aaf: 0x000c, 0x2ab0: 0x000c, 0x2ab1: 0x000c, 0x2ab4: 0x000c, 0x2ab6: 0x000c, 0x2ab7: 0x000c, 0x2abe: 0x000c, // Block 0xab, offset 0x2ac0 0x2adf: 0x000c, 0x2ae3: 0x000c, 0x2ae4: 0x000c, 0x2ae5: 0x000c, 0x2ae6: 0x000c, 0x2ae7: 0x000c, 0x2ae8: 0x000c, 0x2ae9: 0x000c, 0x2aea: 0x000c, // Block 0xac, offset 0x2b00 0x2b00: 0x000c, 0x2b01: 0x000c, 0x2b3c: 0x000c, // Block 0xad, offset 0x2b40 0x2b40: 0x000c, 0x2b66: 0x000c, 0x2b67: 0x000c, 0x2b68: 0x000c, 0x2b69: 0x000c, 0x2b6a: 0x000c, 0x2b6b: 0x000c, 0x2b6c: 0x000c, 0x2b70: 0x000c, 0x2b71: 0x000c, 0x2b72: 0x000c, 0x2b73: 0x000c, 0x2b74: 0x000c, // Block 0xae, offset 0x2b80 0x2bb8: 0x000c, 0x2bb9: 0x000c, 0x2bba: 0x000c, 0x2bbb: 0x000c, 0x2bbc: 0x000c, 0x2bbd: 0x000c, 0x2bbe: 0x000c, 0x2bbf: 0x000c, // Block 0xaf, offset 0x2bc0 0x2bc2: 0x000c, 0x2bc3: 0x000c, 0x2bc4: 0x000c, 0x2bc6: 0x000c, // Block 0xb0, offset 0x2c00 0x2c33: 0x000c, 0x2c34: 0x000c, 0x2c35: 0x000c, 0x2c36: 0x000c, 0x2c37: 0x000c, 0x2c38: 0x000c, 0x2c3a: 0x000c, 0x2c3f: 0x000c, // Block 0xb1, offset 0x2c40 0x2c40: 0x000c, 0x2c42: 0x000c, 0x2c43: 0x000c, // Block 0xb2, offset 0x2c80 0x2cb2: 0x000c, 0x2cb3: 0x000c, 0x2cb4: 0x000c, 0x2cb5: 0x000c, 0x2cbc: 0x000c, 0x2cbd: 0x000c, 0x2cbf: 0x000c, // Block 0xb3, offset 0x2cc0 0x2cc0: 0x000c, 0x2cdc: 0x000c, 0x2cdd: 0x000c, // Block 0xb4, offset 0x2d00 0x2d33: 0x000c, 0x2d34: 0x000c, 0x2d35: 0x000c, 0x2d36: 0x000c, 0x2d37: 0x000c, 0x2d38: 0x000c, 0x2d39: 0x000c, 0x2d3a: 0x000c, 0x2d3d: 0x000c, 0x2d3f: 0x000c, // Block 0xb5, offset 0x2d40 0x2d40: 0x000c, 0x2d60: 0x000a, 0x2d61: 0x000a, 0x2d62: 0x000a, 0x2d63: 0x000a, 0x2d64: 0x000a, 0x2d65: 0x000a, 0x2d66: 0x000a, 0x2d67: 0x000a, 0x2d68: 0x000a, 0x2d69: 0x000a, 0x2d6a: 0x000a, 0x2d6b: 0x000a, 0x2d6c: 0x000a, // Block 0xb6, offset 0x2d80 0x2dab: 0x000c, 0x2dad: 0x000c, 0x2db0: 0x000c, 0x2db1: 0x000c, 0x2db2: 0x000c, 0x2db3: 0x000c, 0x2db4: 0x000c, 0x2db5: 0x000c, 0x2db7: 0x000c, // Block 0xb7, offset 0x2dc0 0x2ddd: 0x000c, 0x2dde: 0x000c, 0x2ddf: 0x000c, 0x2de2: 0x000c, 0x2de3: 0x000c, 0x2de4: 0x000c, 0x2de5: 0x000c, 0x2de7: 0x000c, 0x2de8: 0x000c, 0x2de9: 0x000c, 0x2dea: 0x000c, 0x2deb: 0x000c, // Block 0xb8, offset 0x2e00 0x2e30: 0x000c, 0x2e31: 0x000c, 0x2e32: 0x000c, 0x2e33: 0x000c, 0x2e34: 0x000c, 0x2e35: 0x000c, 0x2e36: 0x000c, 0x2e38: 0x000c, 0x2e39: 0x000c, 0x2e3a: 0x000c, 0x2e3b: 0x000c, 0x2e3c: 0x000c, 0x2e3d: 0x000c, // Block 0xb9, offset 0x2e40 0x2e52: 0x000c, 0x2e53: 0x000c, 0x2e54: 0x000c, 0x2e55: 0x000c, 0x2e56: 0x000c, 0x2e57: 0x000c, 0x2e58: 0x000c, 0x2e59: 0x000c, 0x2e5a: 0x000c, 0x2e5b: 0x000c, 0x2e5c: 0x000c, 0x2e5d: 0x000c, 0x2e5e: 0x000c, 0x2e5f: 0x000c, 0x2e60: 0x000c, 0x2e61: 0x000c, 0x2e62: 0x000c, 0x2e63: 0x000c, 0x2e64: 0x000c, 0x2e65: 0x000c, 0x2e66: 0x000c, 0x2e67: 0x000c, 0x2e6a: 0x000c, 0x2e6b: 0x000c, 0x2e6c: 0x000c, 0x2e6d: 0x000c, 0x2e6e: 0x000c, 0x2e6f: 0x000c, 0x2e70: 0x000c, 0x2e72: 0x000c, 0x2e73: 0x000c, 0x2e75: 0x000c, 0x2e76: 0x000c, // Block 0xba, offset 0x2e80 0x2eb0: 0x000c, 0x2eb1: 0x000c, 0x2eb2: 0x000c, 0x2eb3: 0x000c, 0x2eb4: 0x000c, // Block 0xbb, offset 0x2ec0 0x2ef0: 0x000c, 0x2ef1: 0x000c, 0x2ef2: 0x000c, 0x2ef3: 0x000c, 0x2ef4: 0x000c, 0x2ef5: 0x000c, 0x2ef6: 0x000c, // Block 0xbc, offset 0x2f00 0x2f0f: 0x000c, 0x2f10: 0x000c, 0x2f11: 0x000c, 0x2f12: 0x000c, // Block 0xbd, offset 0x2f40 0x2f5d: 0x000c, 0x2f5e: 0x000c, 0x2f60: 0x000b, 0x2f61: 0x000b, 0x2f62: 0x000b, 0x2f63: 0x000b, // Block 0xbe, offset 0x2f80 0x2fa7: 0x000c, 0x2fa8: 0x000c, 0x2fa9: 0x000c, 0x2fb3: 0x000b, 0x2fb4: 0x000b, 0x2fb5: 0x000b, 0x2fb6: 0x000b, 0x2fb7: 0x000b, 0x2fb8: 0x000b, 0x2fb9: 0x000b, 0x2fba: 0x000b, 0x2fbb: 0x000c, 0x2fbc: 0x000c, 0x2fbd: 0x000c, 0x2fbe: 0x000c, 0x2fbf: 0x000c, // Block 0xbf, offset 0x2fc0 0x2fc0: 0x000c, 0x2fc1: 0x000c, 0x2fc2: 0x000c, 0x2fc5: 0x000c, 0x2fc6: 0x000c, 0x2fc7: 0x000c, 0x2fc8: 0x000c, 0x2fc9: 0x000c, 0x2fca: 0x000c, 0x2fcb: 0x000c, 0x2fea: 0x000c, 0x2feb: 0x000c, 0x2fec: 0x000c, 0x2fed: 0x000c, // Block 0xc0, offset 0x3000 0x3000: 0x000a, 0x3001: 0x000a, 0x3002: 0x000c, 0x3003: 0x000c, 0x3004: 0x000c, 0x3005: 0x000a, // Block 0xc1, offset 0x3040 0x3040: 0x000a, 0x3041: 0x000a, 0x3042: 0x000a, 0x3043: 0x000a, 0x3044: 0x000a, 0x3045: 0x000a, 0x3046: 0x000a, 0x3047: 0x000a, 0x3048: 0x000a, 0x3049: 0x000a, 0x304a: 0x000a, 0x304b: 0x000a, 0x304c: 0x000a, 0x304d: 0x000a, 0x304e: 0x000a, 0x304f: 0x000a, 0x3050: 0x000a, 0x3051: 0x000a, 0x3052: 0x000a, 0x3053: 0x000a, 0x3054: 0x000a, 0x3055: 0x000a, 0x3056: 0x000a, // Block 0xc2, offset 0x3080 0x309b: 0x000a, // Block 0xc3, offset 0x30c0 0x30d5: 0x000a, // Block 0xc4, offset 0x3100 0x310f: 0x000a, // Block 0xc5, offset 0x3140 0x3149: 0x000a, // Block 0xc6, offset 0x3180 0x3183: 0x000a, 0x318e: 0x0002, 0x318f: 0x0002, 0x3190: 0x0002, 0x3191: 0x0002, 0x3192: 0x0002, 0x3193: 0x0002, 0x3194: 0x0002, 0x3195: 0x0002, 0x3196: 0x0002, 0x3197: 0x0002, 0x3198: 0x0002, 0x3199: 0x0002, 0x319a: 0x0002, 0x319b: 0x0002, 0x319c: 0x0002, 0x319d: 0x0002, 0x319e: 0x0002, 0x319f: 0x0002, 0x31a0: 0x0002, 0x31a1: 0x0002, 0x31a2: 0x0002, 0x31a3: 0x0002, 0x31a4: 0x0002, 0x31a5: 0x0002, 0x31a6: 0x0002, 0x31a7: 0x0002, 0x31a8: 0x0002, 0x31a9: 0x0002, 0x31aa: 0x0002, 0x31ab: 0x0002, 0x31ac: 0x0002, 0x31ad: 0x0002, 0x31ae: 0x0002, 0x31af: 0x0002, 0x31b0: 0x0002, 0x31b1: 0x0002, 0x31b2: 0x0002, 0x31b3: 0x0002, 0x31b4: 0x0002, 0x31b5: 0x0002, 0x31b6: 0x0002, 0x31b7: 0x0002, 0x31b8: 0x0002, 0x31b9: 0x0002, 0x31ba: 0x0002, 0x31bb: 0x0002, 0x31bc: 0x0002, 0x31bd: 0x0002, 0x31be: 0x0002, 0x31bf: 0x0002, // Block 0xc7, offset 0x31c0 0x31c0: 0x000c, 0x31c1: 0x000c, 0x31c2: 0x000c, 0x31c3: 0x000c, 0x31c4: 0x000c, 0x31c5: 0x000c, 0x31c6: 0x000c, 0x31c7: 0x000c, 0x31c8: 0x000c, 0x31c9: 0x000c, 0x31ca: 0x000c, 0x31cb: 0x000c, 0x31cc: 0x000c, 0x31cd: 0x000c, 0x31ce: 0x000c, 0x31cf: 0x000c, 0x31d0: 0x000c, 0x31d1: 0x000c, 0x31d2: 0x000c, 0x31d3: 0x000c, 0x31d4: 0x000c, 0x31d5: 0x000c, 0x31d6: 0x000c, 0x31d7: 0x000c, 0x31d8: 0x000c, 0x31d9: 0x000c, 0x31da: 0x000c, 0x31db: 0x000c, 0x31dc: 0x000c, 0x31dd: 0x000c, 0x31de: 0x000c, 0x31df: 0x000c, 0x31e0: 0x000c, 0x31e1: 0x000c, 0x31e2: 0x000c, 0x31e3: 0x000c, 0x31e4: 0x000c, 0x31e5: 0x000c, 0x31e6: 0x000c, 0x31e7: 0x000c, 0x31e8: 0x000c, 0x31e9: 0x000c, 0x31ea: 0x000c, 0x31eb: 0x000c, 0x31ec: 0x000c, 0x31ed: 0x000c, 0x31ee: 0x000c, 0x31ef: 0x000c, 0x31f0: 0x000c, 0x31f1: 0x000c, 0x31f2: 0x000c, 0x31f3: 0x000c, 0x31f4: 0x000c, 0x31f5: 0x000c, 0x31f6: 0x000c, 0x31fb: 0x000c, 0x31fc: 0x000c, 0x31fd: 0x000c, 0x31fe: 0x000c, 0x31ff: 0x000c, // Block 0xc8, offset 0x3200 0x3200: 0x000c, 0x3201: 0x000c, 0x3202: 0x000c, 0x3203: 0x000c, 0x3204: 0x000c, 0x3205: 0x000c, 0x3206: 0x000c, 0x3207: 0x000c, 0x3208: 0x000c, 0x3209: 0x000c, 0x320a: 0x000c, 0x320b: 0x000c, 0x320c: 0x000c, 0x320d: 0x000c, 0x320e: 0x000c, 0x320f: 0x000c, 0x3210: 0x000c, 0x3211: 0x000c, 0x3212: 0x000c, 0x3213: 0x000c, 0x3214: 0x000c, 0x3215: 0x000c, 0x3216: 0x000c, 0x3217: 0x000c, 0x3218: 0x000c, 0x3219: 0x000c, 0x321a: 0x000c, 0x321b: 0x000c, 0x321c: 0x000c, 0x321d: 0x000c, 0x321e: 0x000c, 0x321f: 0x000c, 0x3220: 0x000c, 0x3221: 0x000c, 0x3222: 0x000c, 0x3223: 0x000c, 0x3224: 0x000c, 0x3225: 0x000c, 0x3226: 0x000c, 0x3227: 0x000c, 0x3228: 0x000c, 0x3229: 0x000c, 0x322a: 0x000c, 0x322b: 0x000c, 0x322c: 0x000c, 0x3235: 0x000c, // Block 0xc9, offset 0x3240 0x3244: 0x000c, 0x325b: 0x000c, 0x325c: 0x000c, 0x325d: 0x000c, 0x325e: 0x000c, 0x325f: 0x000c, 0x3261: 0x000c, 0x3262: 0x000c, 0x3263: 0x000c, 0x3264: 0x000c, 0x3265: 0x000c, 0x3266: 0x000c, 0x3267: 0x000c, 0x3268: 0x000c, 0x3269: 0x000c, 0x326a: 0x000c, 0x326b: 0x000c, 0x326c: 0x000c, 0x326d: 0x000c, 0x326e: 0x000c, 0x326f: 0x000c, // Block 0xca, offset 0x3280 0x3280: 0x000c, 0x3281: 0x000c, 0x3282: 0x000c, 0x3283: 0x000c, 0x3284: 0x000c, 0x3285: 0x000c, 0x3286: 0x000c, 0x3288: 0x000c, 0x3289: 0x000c, 0x328a: 0x000c, 0x328b: 0x000c, 0x328c: 0x000c, 0x328d: 0x000c, 0x328e: 0x000c, 0x328f: 0x000c, 0x3290: 0x000c, 0x3291: 0x000c, 0x3292: 0x000c, 0x3293: 0x000c, 0x3294: 0x000c, 0x3295: 0x000c, 0x3296: 0x000c, 0x3297: 0x000c, 0x3298: 0x000c, 0x329b: 0x000c, 0x329c: 0x000c, 0x329d: 0x000c, 0x329e: 0x000c, 0x329f: 0x000c, 0x32a0: 0x000c, 0x32a1: 0x000c, 0x32a3: 0x000c, 0x32a4: 0x000c, 0x32a6: 0x000c, 0x32a7: 0x000c, 0x32a8: 0x000c, 0x32a9: 0x000c, 0x32aa: 0x000c, // Block 0xcb, offset 0x32c0 0x32c0: 0x0001, 0x32c1: 0x0001, 0x32c2: 0x0001, 0x32c3: 0x0001, 0x32c4: 0x0001, 0x32c5: 0x0001, 0x32c6: 0x0001, 0x32c7: 0x0001, 0x32c8: 0x0001, 0x32c9: 0x0001, 0x32ca: 0x0001, 0x32cb: 0x0001, 0x32cc: 0x0001, 0x32cd: 0x0001, 0x32ce: 0x0001, 0x32cf: 0x0001, 0x32d0: 0x000c, 0x32d1: 0x000c, 0x32d2: 0x000c, 0x32d3: 0x000c, 0x32d4: 0x000c, 0x32d5: 0x000c, 0x32d6: 0x000c, 0x32d7: 0x0001, 0x32d8: 0x0001, 0x32d9: 0x0001, 0x32da: 0x0001, 0x32db: 0x0001, 0x32dc: 0x0001, 0x32dd: 0x0001, 0x32de: 0x0001, 0x32df: 0x0001, 0x32e0: 0x0001, 0x32e1: 0x0001, 0x32e2: 0x0001, 0x32e3: 0x0001, 0x32e4: 0x0001, 0x32e5: 0x0001, 0x32e6: 0x0001, 0x32e7: 0x0001, 0x32e8: 0x0001, 0x32e9: 0x0001, 0x32ea: 0x0001, 0x32eb: 0x0001, 0x32ec: 0x0001, 0x32ed: 0x0001, 0x32ee: 0x0001, 0x32ef: 0x0001, 0x32f0: 0x0001, 0x32f1: 0x0001, 0x32f2: 0x0001, 0x32f3: 0x0001, 0x32f4: 0x0001, 0x32f5: 0x0001, 0x32f6: 0x0001, 0x32f7: 0x0001, 0x32f8: 0x0001, 0x32f9: 0x0001, 0x32fa: 0x0001, 0x32fb: 0x0001, 0x32fc: 0x0001, 0x32fd: 0x0001, 0x32fe: 0x0001, 0x32ff: 0x0001, // Block 0xcc, offset 0x3300 0x3300: 0x0001, 0x3301: 0x0001, 0x3302: 0x0001, 0x3303: 0x0001, 0x3304: 0x000c, 0x3305: 0x000c, 0x3306: 0x000c, 0x3307: 0x000c, 0x3308: 0x000c, 0x3309: 0x000c, 0x330a: 0x000c, 0x330b: 0x0001, 0x330c: 0x0001, 0x330d: 0x0001, 0x330e: 0x0001, 0x330f: 0x0001, 0x3310: 0x0001, 0x3311: 0x0001, 0x3312: 0x0001, 0x3313: 0x0001, 0x3314: 0x0001, 0x3315: 0x0001, 0x3316: 0x0001, 0x3317: 0x0001, 0x3318: 0x0001, 0x3319: 0x0001, 0x331a: 0x0001, 0x331b: 0x0001, 0x331c: 0x0001, 0x331d: 0x0001, 0x331e: 0x0001, 0x331f: 0x0001, 0x3320: 0x0001, 0x3321: 0x0001, 0x3322: 0x0001, 0x3323: 0x0001, 0x3324: 0x0001, 0x3325: 0x0001, 0x3326: 0x0001, 0x3327: 0x0001, 0x3328: 0x0001, 0x3329: 0x0001, 0x332a: 0x0001, 0x332b: 0x0001, 0x332c: 0x0001, 0x332d: 0x0001, 0x332e: 0x0001, 0x332f: 0x0001, 0x3330: 0x0001, 0x3331: 0x0001, 0x3332: 0x0001, 0x3333: 0x0001, 0x3334: 0x0001, 0x3335: 0x0001, 0x3336: 0x0001, 0x3337: 0x0001, 0x3338: 0x0001, 0x3339: 0x0001, 0x333a: 0x0001, 0x333b: 0x0001, 0x333c: 0x0001, 0x333d: 0x0001, 0x333e: 0x0001, 0x333f: 0x0001, // Block 0xcd, offset 0x3340 0x3340: 0x000d, 0x3341: 0x000d, 0x3342: 0x000d, 0x3343: 0x000d, 0x3344: 0x000d, 0x3345: 0x000d, 0x3346: 0x000d, 0x3347: 0x000d, 0x3348: 0x000d, 0x3349: 0x000d, 0x334a: 0x000d, 0x334b: 0x000d, 0x334c: 0x000d, 0x334d: 0x000d, 0x334e: 0x000d, 0x334f: 0x000d, 0x3350: 0x000d, 0x3351: 0x000d, 0x3352: 0x000d, 0x3353: 0x000d, 0x3354: 0x000d, 0x3355: 0x000d, 0x3356: 0x000d, 0x3357: 0x000d, 0x3358: 0x000d, 0x3359: 0x000d, 0x335a: 0x000d, 0x335b: 0x000d, 0x335c: 0x000d, 0x335d: 0x000d, 0x335e: 0x000d, 0x335f: 0x000d, 0x3360: 0x000d, 0x3361: 0x000d, 0x3362: 0x000d, 0x3363: 0x000d, 0x3364: 0x000d, 0x3365: 0x000d, 0x3366: 0x000d, 0x3367: 0x000d, 0x3368: 0x000d, 0x3369: 0x000d, 0x336a: 0x000d, 0x336b: 0x000d, 0x336c: 0x000d, 0x336d: 0x000d, 0x336e: 0x000d, 0x336f: 0x000d, 0x3370: 0x000a, 0x3371: 0x000a, 0x3372: 0x000d, 0x3373: 0x000d, 0x3374: 0x000d, 0x3375: 0x000d, 0x3376: 0x000d, 0x3377: 0x000d, 0x3378: 0x000d, 0x3379: 0x000d, 0x337a: 0x000d, 0x337b: 0x000d, 0x337c: 0x000d, 0x337d: 0x000d, 0x337e: 0x000d, 0x337f: 0x000d, // Block 0xce, offset 0x3380 0x3380: 0x000a, 0x3381: 0x000a, 0x3382: 0x000a, 0x3383: 0x000a, 0x3384: 0x000a, 0x3385: 0x000a, 0x3386: 0x000a, 0x3387: 0x000a, 0x3388: 0x000a, 0x3389: 0x000a, 0x338a: 0x000a, 0x338b: 0x000a, 0x338c: 0x000a, 0x338d: 0x000a, 0x338e: 0x000a, 0x338f: 0x000a, 0x3390: 0x000a, 0x3391: 0x000a, 0x3392: 0x000a, 0x3393: 0x000a, 0x3394: 0x000a, 0x3395: 0x000a, 0x3396: 0x000a, 0x3397: 0x000a, 0x3398: 0x000a, 0x3399: 0x000a, 0x339a: 0x000a, 0x339b: 0x000a, 0x339c: 0x000a, 0x339d: 0x000a, 0x339e: 0x000a, 0x339f: 0x000a, 0x33a0: 0x000a, 0x33a1: 0x000a, 0x33a2: 0x000a, 0x33a3: 0x000a, 0x33a4: 0x000a, 0x33a5: 0x000a, 0x33a6: 0x000a, 0x33a7: 0x000a, 0x33a8: 0x000a, 0x33a9: 0x000a, 0x33aa: 0x000a, 0x33ab: 0x000a, 0x33b0: 0x000a, 0x33b1: 0x000a, 0x33b2: 0x000a, 0x33b3: 0x000a, 0x33b4: 0x000a, 0x33b5: 0x000a, 0x33b6: 0x000a, 0x33b7: 0x000a, 0x33b8: 0x000a, 0x33b9: 0x000a, 0x33ba: 0x000a, 0x33bb: 0x000a, 0x33bc: 0x000a, 0x33bd: 0x000a, 0x33be: 0x000a, 0x33bf: 0x000a, // Block 0xcf, offset 0x33c0 0x33c0: 0x000a, 0x33c1: 0x000a, 0x33c2: 0x000a, 0x33c3: 0x000a, 0x33c4: 0x000a, 0x33c5: 0x000a, 0x33c6: 0x000a, 0x33c7: 0x000a, 0x33c8: 0x000a, 0x33c9: 0x000a, 0x33ca: 0x000a, 0x33cb: 0x000a, 0x33cc: 0x000a, 0x33cd: 0x000a, 0x33ce: 0x000a, 0x33cf: 0x000a, 0x33d0: 0x000a, 0x33d1: 0x000a, 0x33d2: 0x000a, 0x33d3: 0x000a, 0x33e0: 0x000a, 0x33e1: 0x000a, 0x33e2: 0x000a, 0x33e3: 0x000a, 0x33e4: 0x000a, 0x33e5: 0x000a, 0x33e6: 0x000a, 0x33e7: 0x000a, 0x33e8: 0x000a, 0x33e9: 0x000a, 0x33ea: 0x000a, 0x33eb: 0x000a, 0x33ec: 0x000a, 0x33ed: 0x000a, 0x33ee: 0x000a, 0x33f1: 0x000a, 0x33f2: 0x000a, 0x33f3: 0x000a, 0x33f4: 0x000a, 0x33f5: 0x000a, 0x33f6: 0x000a, 0x33f7: 0x000a, 0x33f8: 0x000a, 0x33f9: 0x000a, 0x33fa: 0x000a, 0x33fb: 0x000a, 0x33fc: 0x000a, 0x33fd: 0x000a, 0x33fe: 0x000a, 0x33ff: 0x000a, // Block 0xd0, offset 0x3400 0x3401: 0x000a, 0x3402: 0x000a, 0x3403: 0x000a, 0x3404: 0x000a, 0x3405: 0x000a, 0x3406: 0x000a, 0x3407: 0x000a, 0x3408: 0x000a, 0x3409: 0x000a, 0x340a: 0x000a, 0x340b: 0x000a, 0x340c: 0x000a, 0x340d: 0x000a, 0x340e: 0x000a, 0x340f: 0x000a, 0x3411: 0x000a, 0x3412: 0x000a, 0x3413: 0x000a, 0x3414: 0x000a, 0x3415: 0x000a, 0x3416: 0x000a, 0x3417: 0x000a, 0x3418: 0x000a, 0x3419: 0x000a, 0x341a: 0x000a, 0x341b: 0x000a, 0x341c: 0x000a, 0x341d: 0x000a, 0x341e: 0x000a, 0x341f: 0x000a, 0x3420: 0x000a, 0x3421: 0x000a, 0x3422: 0x000a, 0x3423: 0x000a, 0x3424: 0x000a, 0x3425: 0x000a, 0x3426: 0x000a, 0x3427: 0x000a, 0x3428: 0x000a, 0x3429: 0x000a, 0x342a: 0x000a, 0x342b: 0x000a, 0x342c: 0x000a, 0x342d: 0x000a, 0x342e: 0x000a, 0x342f: 0x000a, 0x3430: 0x000a, 0x3431: 0x000a, 0x3432: 0x000a, 0x3433: 0x000a, 0x3434: 0x000a, 0x3435: 0x000a, // Block 0xd1, offset 0x3440 0x3440: 0x0002, 0x3441: 0x0002, 0x3442: 0x0002, 0x3443: 0x0002, 0x3444: 0x0002, 0x3445: 0x0002, 0x3446: 0x0002, 0x3447: 0x0002, 0x3448: 0x0002, 0x3449: 0x0002, 0x344a: 0x0002, 0x344b: 0x000a, 0x344c: 0x000a, // Block 0xd2, offset 0x3480 0x34aa: 0x000a, 0x34ab: 0x000a, // Block 0xd3, offset 0x34c0 0x34c0: 0x000a, 0x34c1: 0x000a, 0x34c2: 0x000a, 0x34c3: 0x000a, 0x34c4: 0x000a, 0x34c5: 0x000a, 0x34c6: 0x000a, 0x34c7: 0x000a, 0x34c8: 0x000a, 0x34c9: 0x000a, 0x34ca: 0x000a, 0x34cb: 0x000a, 0x34cc: 0x000a, 0x34cd: 0x000a, 0x34ce: 0x000a, 0x34cf: 0x000a, 0x34d0: 0x000a, 0x34d1: 0x000a, 0x34d2: 0x000a, 0x34e0: 0x000a, 0x34e1: 0x000a, 0x34e2: 0x000a, 0x34e3: 0x000a, 0x34e4: 0x000a, 0x34e5: 0x000a, 0x34e6: 0x000a, 0x34e7: 0x000a, 0x34e8: 0x000a, 0x34e9: 0x000a, 0x34ea: 0x000a, 0x34eb: 0x000a, 0x34ec: 0x000a, 0x34f0: 0x000a, 0x34f1: 0x000a, 0x34f2: 0x000a, 0x34f3: 0x000a, 0x34f4: 0x000a, 0x34f5: 0x000a, 0x34f6: 0x000a, // Block 0xd4, offset 0x3500 0x3500: 0x000a, 0x3501: 0x000a, 0x3502: 0x000a, 0x3503: 0x000a, 0x3504: 0x000a, 0x3505: 0x000a, 0x3506: 0x000a, 0x3507: 0x000a, 0x3508: 0x000a, 0x3509: 0x000a, 0x350a: 0x000a, 0x350b: 0x000a, 0x350c: 0x000a, 0x350d: 0x000a, 0x350e: 0x000a, 0x350f: 0x000a, 0x3510: 0x000a, 0x3511: 0x000a, 0x3512: 0x000a, 0x3513: 0x000a, 0x3514: 0x000a, // Block 0xd5, offset 0x3540 0x3540: 0x000a, 0x3541: 0x000a, 0x3542: 0x000a, 0x3543: 0x000a, 0x3544: 0x000a, 0x3545: 0x000a, 0x3546: 0x000a, 0x3547: 0x000a, 0x3548: 0x000a, 0x3549: 0x000a, 0x354a: 0x000a, 0x354b: 0x000a, 0x3550: 0x000a, 0x3551: 0x000a, 0x3552: 0x000a, 0x3553: 0x000a, 0x3554: 0x000a, 0x3555: 0x000a, 0x3556: 0x000a, 0x3557: 0x000a, 0x3558: 0x000a, 0x3559: 0x000a, 0x355a: 0x000a, 0x355b: 0x000a, 0x355c: 0x000a, 0x355d: 0x000a, 0x355e: 0x000a, 0x355f: 0x000a, 0x3560: 0x000a, 0x3561: 0x000a, 0x3562: 0x000a, 0x3563: 0x000a, 0x3564: 0x000a, 0x3565: 0x000a, 0x3566: 0x000a, 0x3567: 0x000a, 0x3568: 0x000a, 0x3569: 0x000a, 0x356a: 0x000a, 0x356b: 0x000a, 0x356c: 0x000a, 0x356d: 0x000a, 0x356e: 0x000a, 0x356f: 0x000a, 0x3570: 0x000a, 0x3571: 0x000a, 0x3572: 0x000a, 0x3573: 0x000a, 0x3574: 0x000a, 0x3575: 0x000a, 0x3576: 0x000a, 0x3577: 0x000a, 0x3578: 0x000a, 0x3579: 0x000a, 0x357a: 0x000a, 0x357b: 0x000a, 0x357c: 0x000a, 0x357d: 0x000a, 0x357e: 0x000a, 0x357f: 0x000a, // Block 0xd6, offset 0x3580 0x3580: 0x000a, 0x3581: 0x000a, 0x3582: 0x000a, 0x3583: 0x000a, 0x3584: 0x000a, 0x3585: 0x000a, 0x3586: 0x000a, 0x3587: 0x000a, 0x3590: 0x000a, 0x3591: 0x000a, 0x3592: 0x000a, 0x3593: 0x000a, 0x3594: 0x000a, 0x3595: 0x000a, 0x3596: 0x000a, 0x3597: 0x000a, 0x3598: 0x000a, 0x3599: 0x000a, 0x35a0: 0x000a, 0x35a1: 0x000a, 0x35a2: 0x000a, 0x35a3: 0x000a, 0x35a4: 0x000a, 0x35a5: 0x000a, 0x35a6: 0x000a, 0x35a7: 0x000a, 0x35a8: 0x000a, 0x35a9: 0x000a, 0x35aa: 0x000a, 0x35ab: 0x000a, 0x35ac: 0x000a, 0x35ad: 0x000a, 0x35ae: 0x000a, 0x35af: 0x000a, 0x35b0: 0x000a, 0x35b1: 0x000a, 0x35b2: 0x000a, 0x35b3: 0x000a, 0x35b4: 0x000a, 0x35b5: 0x000a, 0x35b6: 0x000a, 0x35b7: 0x000a, 0x35b8: 0x000a, 0x35b9: 0x000a, 0x35ba: 0x000a, 0x35bb: 0x000a, 0x35bc: 0x000a, 0x35bd: 0x000a, 0x35be: 0x000a, 0x35bf: 0x000a, // Block 0xd7, offset 0x35c0 0x35c0: 0x000a, 0x35c1: 0x000a, 0x35c2: 0x000a, 0x35c3: 0x000a, 0x35c4: 0x000a, 0x35c5: 0x000a, 0x35c6: 0x000a, 0x35c7: 0x000a, 0x35d0: 0x000a, 0x35d1: 0x000a, 0x35d2: 0x000a, 0x35d3: 0x000a, 0x35d4: 0x000a, 0x35d5: 0x000a, 0x35d6: 0x000a, 0x35d7: 0x000a, 0x35d8: 0x000a, 0x35d9: 0x000a, 0x35da: 0x000a, 0x35db: 0x000a, 0x35dc: 0x000a, 0x35dd: 0x000a, 0x35de: 0x000a, 0x35df: 0x000a, 0x35e0: 0x000a, 0x35e1: 0x000a, 0x35e2: 0x000a, 0x35e3: 0x000a, 0x35e4: 0x000a, 0x35e5: 0x000a, 0x35e6: 0x000a, 0x35e7: 0x000a, 0x35e8: 0x000a, 0x35e9: 0x000a, 0x35ea: 0x000a, 0x35eb: 0x000a, 0x35ec: 0x000a, 0x35ed: 0x000a, // Block 0xd8, offset 0x3600 0x3610: 0x000a, 0x3611: 0x000a, 0x3612: 0x000a, 0x3613: 0x000a, 0x3614: 0x000a, 0x3615: 0x000a, 0x3616: 0x000a, 0x3617: 0x000a, 0x3618: 0x000a, 0x3619: 0x000a, 0x361a: 0x000a, 0x361b: 0x000a, 0x361c: 0x000a, 0x361d: 0x000a, 0x361e: 0x000a, 0x3620: 0x000a, 0x3621: 0x000a, 0x3622: 0x000a, 0x3623: 0x000a, 0x3624: 0x000a, 0x3625: 0x000a, 0x3626: 0x000a, 0x3627: 0x000a, 0x3630: 0x000a, 0x3633: 0x000a, 0x3634: 0x000a, 0x3635: 0x000a, 0x3636: 0x000a, 0x3637: 0x000a, 0x3638: 0x000a, 0x3639: 0x000a, 0x363a: 0x000a, 0x363b: 0x000a, 0x363c: 0x000a, 0x363d: 0x000a, 0x363e: 0x000a, // Block 0xd9, offset 0x3640 0x3640: 0x000a, 0x3641: 0x000a, 0x3642: 0x000a, 0x3643: 0x000a, 0x3644: 0x000a, 0x3645: 0x000a, 0x3646: 0x000a, 0x3647: 0x000a, 0x3648: 0x000a, 0x3649: 0x000a, 0x364a: 0x000a, 0x364b: 0x000a, 0x3650: 0x000a, 0x3651: 0x000a, 0x3652: 0x000a, 0x3653: 0x000a, 0x3654: 0x000a, 0x3655: 0x000a, 0x3656: 0x000a, 0x3657: 0x000a, 0x3658: 0x000a, 0x3659: 0x000a, 0x365a: 0x000a, 0x365b: 0x000a, 0x365c: 0x000a, 0x365d: 0x000a, 0x365e: 0x000a, // Block 0xda, offset 0x3680 0x3680: 0x000a, 0x3681: 0x000a, 0x3682: 0x000a, 0x3683: 0x000a, 0x3684: 0x000a, 0x3685: 0x000a, 0x3686: 0x000a, 0x3687: 0x000a, 0x3688: 0x000a, 0x3689: 0x000a, 0x368a: 0x000a, 0x368b: 0x000a, 0x368c: 0x000a, 0x368d: 0x000a, 0x368e: 0x000a, 0x368f: 0x000a, 0x3690: 0x000a, 0x3691: 0x000a, // Block 0xdb, offset 0x36c0 0x36fe: 0x000b, 0x36ff: 0x000b, // Block 0xdc, offset 0x3700 0x3700: 0x000b, 0x3701: 0x000b, 0x3702: 0x000b, 0x3703: 0x000b, 0x3704: 0x000b, 0x3705: 0x000b, 0x3706: 0x000b, 0x3707: 0x000b, 0x3708: 0x000b, 0x3709: 0x000b, 0x370a: 0x000b, 0x370b: 0x000b, 0x370c: 0x000b, 0x370d: 0x000b, 0x370e: 0x000b, 0x370f: 0x000b, 0x3710: 0x000b, 0x3711: 0x000b, 0x3712: 0x000b, 0x3713: 0x000b, 0x3714: 0x000b, 0x3715: 0x000b, 0x3716: 0x000b, 0x3717: 0x000b, 0x3718: 0x000b, 0x3719: 0x000b, 0x371a: 0x000b, 0x371b: 0x000b, 0x371c: 0x000b, 0x371d: 0x000b, 0x371e: 0x000b, 0x371f: 0x000b, 0x3720: 0x000b, 0x3721: 0x000b, 0x3722: 0x000b, 0x3723: 0x000b, 0x3724: 0x000b, 0x3725: 0x000b, 0x3726: 0x000b, 0x3727: 0x000b, 0x3728: 0x000b, 0x3729: 0x000b, 0x372a: 0x000b, 0x372b: 0x000b, 0x372c: 0x000b, 0x372d: 0x000b, 0x372e: 0x000b, 0x372f: 0x000b, 0x3730: 0x000b, 0x3731: 0x000b, 0x3732: 0x000b, 0x3733: 0x000b, 0x3734: 0x000b, 0x3735: 0x000b, 0x3736: 0x000b, 0x3737: 0x000b, 0x3738: 0x000b, 0x3739: 0x000b, 0x373a: 0x000b, 0x373b: 0x000b, 0x373c: 0x000b, 0x373d: 0x000b, 0x373e: 0x000b, 0x373f: 0x000b, // Block 0xdd, offset 0x3740 0x3740: 0x000c, 0x3741: 0x000c, 0x3742: 0x000c, 0x3743: 0x000c, 0x3744: 0x000c, 0x3745: 0x000c, 0x3746: 0x000c, 0x3747: 0x000c, 0x3748: 0x000c, 0x3749: 0x000c, 0x374a: 0x000c, 0x374b: 0x000c, 0x374c: 0x000c, 0x374d: 0x000c, 0x374e: 0x000c, 0x374f: 0x000c, 0x3750: 0x000c, 0x3751: 0x000c, 0x3752: 0x000c, 0x3753: 0x000c, 0x3754: 0x000c, 0x3755: 0x000c, 0x3756: 0x000c, 0x3757: 0x000c, 0x3758: 0x000c, 0x3759: 0x000c, 0x375a: 0x000c, 0x375b: 0x000c, 0x375c: 0x000c, 0x375d: 0x000c, 0x375e: 0x000c, 0x375f: 0x000c, 0x3760: 0x000c, 0x3761: 0x000c, 0x3762: 0x000c, 0x3763: 0x000c, 0x3764: 0x000c, 0x3765: 0x000c, 0x3766: 0x000c, 0x3767: 0x000c, 0x3768: 0x000c, 0x3769: 0x000c, 0x376a: 0x000c, 0x376b: 0x000c, 0x376c: 0x000c, 0x376d: 0x000c, 0x376e: 0x000c, 0x376f: 0x000c, 0x3770: 0x000b, 0x3771: 0x000b, 0x3772: 0x000b, 0x3773: 0x000b, 0x3774: 0x000b, 0x3775: 0x000b, 0x3776: 0x000b, 0x3777: 0x000b, 0x3778: 0x000b, 0x3779: 0x000b, 0x377a: 0x000b, 0x377b: 0x000b, 0x377c: 0x000b, 0x377d: 0x000b, 0x377e: 0x000b, 0x377f: 0x000b, } // bidiIndex: 24 blocks, 1536 entries, 1536 bytes // Block 0 is the zero block. var bidiIndex = [1536]uint8{ // Block 0x0, offset 0x0 // Block 0x1, offset 0x40 // Block 0x2, offset 0x80 // Block 0x3, offset 0xc0 0xc2: 0x01, 0xc3: 0x02, 0xca: 0x03, 0xcb: 0x04, 0xcc: 0x05, 0xcd: 0x06, 0xce: 0x07, 0xcf: 0x08, 0xd2: 0x09, 0xd6: 0x0a, 0xd7: 0x0b, 0xd8: 0x0c, 0xd9: 0x0d, 0xda: 0x0e, 0xdb: 0x0f, 0xdc: 0x10, 0xdd: 0x11, 0xde: 0x12, 0xdf: 0x13, 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, 0xea: 0x07, 0xef: 0x08, 0xf0: 0x11, 0xf1: 0x12, 0xf2: 0x12, 0xf3: 0x14, 0xf4: 0x15, // Block 0x4, offset 0x100 0x120: 0x14, 0x121: 0x15, 0x122: 0x16, 0x123: 0x17, 0x124: 0x18, 0x125: 0x19, 0x126: 0x1a, 0x127: 0x1b, 0x128: 0x1c, 0x129: 0x1d, 0x12a: 0x1c, 0x12b: 0x1e, 0x12c: 0x1f, 0x12d: 0x20, 0x12e: 0x21, 0x12f: 0x22, 0x130: 0x23, 0x131: 0x24, 0x132: 0x1a, 0x133: 0x25, 0x134: 0x26, 0x135: 0x27, 0x137: 0x28, 0x138: 0x29, 0x139: 0x2a, 0x13a: 0x2b, 0x13b: 0x2c, 0x13c: 0x2d, 0x13d: 0x2e, 0x13e: 0x2f, 0x13f: 0x30, // Block 0x5, offset 0x140 0x140: 0x31, 0x141: 0x32, 0x142: 0x33, 0x14d: 0x34, 0x14e: 0x35, 0x150: 0x36, 0x15a: 0x37, 0x15c: 0x38, 0x15d: 0x39, 0x15e: 0x3a, 0x15f: 0x3b, 0x160: 0x3c, 0x162: 0x3d, 0x164: 0x3e, 0x165: 0x3f, 0x167: 0x40, 0x168: 0x41, 0x169: 0x42, 0x16a: 0x43, 0x16c: 0x44, 0x16d: 0x45, 0x16e: 0x46, 0x16f: 0x47, 0x170: 0x48, 0x173: 0x49, 0x177: 0x4a, 0x17e: 0x4b, 0x17f: 0x4c, // Block 0x6, offset 0x180 0x180: 0x4d, 0x181: 0x4e, 0x182: 0x4f, 0x183: 0x50, 0x184: 0x51, 0x185: 0x52, 0x186: 0x53, 0x187: 0x54, 0x188: 0x55, 0x189: 0x54, 0x18a: 0x54, 0x18b: 0x54, 0x18c: 0x56, 0x18d: 0x57, 0x18e: 0x58, 0x18f: 0x59, 0x190: 0x5a, 0x191: 0x5b, 0x192: 0x5c, 0x193: 0x5d, 0x194: 0x54, 0x195: 0x54, 0x196: 0x54, 0x197: 0x54, 0x198: 0x54, 0x199: 0x54, 0x19a: 0x5e, 0x19b: 0x54, 0x19c: 0x54, 0x19d: 0x5f, 0x19e: 0x54, 0x19f: 0x60, 0x1a4: 0x54, 0x1a5: 0x54, 0x1a6: 0x61, 0x1a7: 0x62, 0x1a8: 0x54, 0x1a9: 0x54, 0x1aa: 0x54, 0x1ab: 0x54, 0x1ac: 0x54, 0x1ad: 0x63, 0x1ae: 0x64, 0x1af: 0x65, 0x1b3: 0x66, 0x1b5: 0x67, 0x1b7: 0x68, 0x1b8: 0x69, 0x1b9: 0x6a, 0x1ba: 0x6b, 0x1bb: 0x6c, 0x1bc: 0x54, 0x1bd: 0x54, 0x1be: 0x54, 0x1bf: 0x6d, // Block 0x7, offset 0x1c0 0x1c0: 0x6e, 0x1c2: 0x6f, 0x1c3: 0x70, 0x1c7: 0x71, 0x1c8: 0x72, 0x1c9: 0x73, 0x1ca: 0x74, 0x1cb: 0x75, 0x1cd: 0x76, 0x1cf: 0x77, // Block 0x8, offset 0x200 0x237: 0x54, // Block 0x9, offset 0x240 0x252: 0x78, 0x253: 0x79, 0x258: 0x7a, 0x259: 0x7b, 0x25a: 0x7c, 0x25b: 0x7d, 0x25c: 0x7e, 0x25e: 0x7f, 0x260: 0x80, 0x261: 0x81, 0x263: 0x82, 0x264: 0x83, 0x265: 0x84, 0x266: 0x85, 0x267: 0x86, 0x268: 0x87, 0x269: 0x88, 0x26a: 0x89, 0x26b: 0x8a, 0x26f: 0x8b, // Block 0xa, offset 0x280 0x2ac: 0x8c, 0x2ad: 0x8d, 0x2ae: 0x0e, 0x2af: 0x0e, 0x2b0: 0x0e, 0x2b1: 0x0e, 0x2b2: 0x0e, 0x2b3: 0x0e, 0x2b4: 0x8e, 0x2b5: 0x0e, 0x2b6: 0x0e, 0x2b7: 0x8f, 0x2b8: 0x90, 0x2b9: 0x91, 0x2ba: 0x0e, 0x2bb: 0x92, 0x2bc: 0x93, 0x2bd: 0x94, 0x2bf: 0x95, // Block 0xb, offset 0x2c0 0x2c4: 0x96, 0x2c5: 0x54, 0x2c6: 0x97, 0x2c7: 0x98, 0x2cb: 0x99, 0x2cd: 0x9a, 0x2e0: 0x9b, 0x2e1: 0x9b, 0x2e2: 0x9b, 0x2e3: 0x9b, 0x2e4: 0x9c, 0x2e5: 0x9b, 0x2e6: 0x9b, 0x2e7: 0x9b, 0x2e8: 0x9d, 0x2e9: 0x9b, 0x2ea: 0x9b, 0x2eb: 0x9e, 0x2ec: 0x9f, 0x2ed: 0x9b, 0x2ee: 0x9b, 0x2ef: 0x9b, 0x2f0: 0x9b, 0x2f1: 0x9b, 0x2f2: 0x9b, 0x2f3: 0x9b, 0x2f4: 0x9b, 0x2f5: 0x9b, 0x2f6: 0x9b, 0x2f7: 0x9b, 0x2f8: 0x9b, 0x2f9: 0xa0, 0x2fa: 0x9b, 0x2fb: 0x9b, 0x2fc: 0x9b, 0x2fd: 0x9b, 0x2fe: 0x9b, 0x2ff: 0x9b, // Block 0xc, offset 0x300 0x300: 0xa1, 0x301: 0xa2, 0x302: 0xa3, 0x304: 0xa4, 0x305: 0xa5, 0x306: 0xa6, 0x307: 0xa7, 0x308: 0xa8, 0x30b: 0xa9, 0x30c: 0xaa, 0x30d: 0xab, 0x310: 0xac, 0x311: 0xad, 0x312: 0xae, 0x313: 0xaf, 0x316: 0xb0, 0x317: 0xb1, 0x318: 0xb2, 0x319: 0xb3, 0x31a: 0xb4, 0x31c: 0xb5, 0x330: 0xb6, 0x332: 0xb7, // Block 0xd, offset 0x340 0x36b: 0xb8, 0x36c: 0xb9, 0x37e: 0xba, // Block 0xe, offset 0x380 0x3b2: 0xbb, // Block 0xf, offset 0x3c0 0x3c5: 0xbc, 0x3c6: 0xbd, 0x3c8: 0x54, 0x3c9: 0xbe, 0x3cc: 0x54, 0x3cd: 0xbf, 0x3db: 0xc0, 0x3dc: 0xc1, 0x3dd: 0xc2, 0x3de: 0xc3, 0x3df: 0xc4, 0x3e8: 0xc5, 0x3e9: 0xc6, 0x3ea: 0xc7, // Block 0x10, offset 0x400 0x400: 0xc8, 0x420: 0x9b, 0x421: 0x9b, 0x422: 0x9b, 0x423: 0xc9, 0x424: 0x9b, 0x425: 0xca, 0x426: 0x9b, 0x427: 0x9b, 0x428: 0x9b, 0x429: 0x9b, 0x42a: 0x9b, 0x42b: 0x9b, 0x42c: 0x9b, 0x42d: 0x9b, 0x42e: 0x9b, 0x42f: 0x9b, 0x430: 0x9b, 0x431: 0x9b, 0x432: 0x9b, 0x433: 0x9b, 0x434: 0x9b, 0x435: 0x9b, 0x436: 0x9b, 0x437: 0x9b, 0x438: 0x0e, 0x439: 0x0e, 0x43a: 0x0e, 0x43b: 0xcb, 0x43c: 0x9b, 0x43d: 0x9b, 0x43e: 0x9b, 0x43f: 0x9b, // Block 0x11, offset 0x440 0x440: 0xcc, 0x441: 0x54, 0x442: 0xcd, 0x443: 0xce, 0x444: 0xcf, 0x445: 0xd0, 0x44c: 0x54, 0x44d: 0x54, 0x44e: 0x54, 0x44f: 0x54, 0x450: 0x54, 0x451: 0x54, 0x452: 0x54, 0x453: 0x54, 0x454: 0x54, 0x455: 0x54, 0x456: 0x54, 0x457: 0x54, 0x458: 0x54, 0x459: 0x54, 0x45a: 0x54, 0x45b: 0xd1, 0x45c: 0x54, 0x45d: 0x6c, 0x45e: 0x54, 0x45f: 0xd2, 0x460: 0xd3, 0x461: 0xd4, 0x462: 0xd5, 0x464: 0xd6, 0x465: 0xd7, 0x466: 0xd8, 0x467: 0x36, 0x47f: 0xd9, // Block 0x12, offset 0x480 0x4bf: 0xd9, // Block 0x13, offset 0x4c0 0x4d0: 0x09, 0x4d1: 0x0a, 0x4d6: 0x0b, 0x4db: 0x0c, 0x4dd: 0x0d, 0x4de: 0x0e, 0x4df: 0x0f, 0x4ef: 0x10, 0x4ff: 0x10, // Block 0x14, offset 0x500 0x50f: 0x10, 0x51f: 0x10, 0x52f: 0x10, 0x53f: 0x10, // Block 0x15, offset 0x540 0x540: 0xda, 0x541: 0xda, 0x542: 0xda, 0x543: 0xda, 0x544: 0x05, 0x545: 0x05, 0x546: 0x05, 0x547: 0xdb, 0x548: 0xda, 0x549: 0xda, 0x54a: 0xda, 0x54b: 0xda, 0x54c: 0xda, 0x54d: 0xda, 0x54e: 0xda, 0x54f: 0xda, 0x550: 0xda, 0x551: 0xda, 0x552: 0xda, 0x553: 0xda, 0x554: 0xda, 0x555: 0xda, 0x556: 0xda, 0x557: 0xda, 0x558: 0xda, 0x559: 0xda, 0x55a: 0xda, 0x55b: 0xda, 0x55c: 0xda, 0x55d: 0xda, 0x55e: 0xda, 0x55f: 0xda, 0x560: 0xda, 0x561: 0xda, 0x562: 0xda, 0x563: 0xda, 0x564: 0xda, 0x565: 0xda, 0x566: 0xda, 0x567: 0xda, 0x568: 0xda, 0x569: 0xda, 0x56a: 0xda, 0x56b: 0xda, 0x56c: 0xda, 0x56d: 0xda, 0x56e: 0xda, 0x56f: 0xda, 0x570: 0xda, 0x571: 0xda, 0x572: 0xda, 0x573: 0xda, 0x574: 0xda, 0x575: 0xda, 0x576: 0xda, 0x577: 0xda, 0x578: 0xda, 0x579: 0xda, 0x57a: 0xda, 0x57b: 0xda, 0x57c: 0xda, 0x57d: 0xda, 0x57e: 0xda, 0x57f: 0xda, // Block 0x16, offset 0x580 0x58f: 0x10, 0x59f: 0x10, 0x5a0: 0x13, 0x5af: 0x10, 0x5bf: 0x10, // Block 0x17, offset 0x5c0 0x5cf: 0x10, } // Total table size 15800 bytes (15KiB); checksum: F50EF68C ================================================ FILE: vendor/golang.org/x/text/unicode/bidi/trieval.go ================================================ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. package bidi // Class is the Unicode BiDi class. Each rune has a single class. type Class uint const ( L Class = iota // LeftToRight R // RightToLeft EN // EuropeanNumber ES // EuropeanSeparator ET // EuropeanTerminator AN // ArabicNumber CS // CommonSeparator B // ParagraphSeparator S // SegmentSeparator WS // WhiteSpace ON // OtherNeutral BN // BoundaryNeutral NSM // NonspacingMark AL // ArabicLetter Control // Control LRO - PDI numClass LRO // LeftToRightOverride RLO // RightToLeftOverride LRE // LeftToRightEmbedding RLE // RightToLeftEmbedding PDF // PopDirectionalFormat LRI // LeftToRightIsolate RLI // RightToLeftIsolate FSI // FirstStrongIsolate PDI // PopDirectionalIsolate unknownClass = ^Class(0) ) var controlToClass = map[rune]Class{ 0x202D: LRO, // LeftToRightOverride, 0x202E: RLO, // RightToLeftOverride, 0x202A: LRE, // LeftToRightEmbedding, 0x202B: RLE, // RightToLeftEmbedding, 0x202C: PDF, // PopDirectionalFormat, 0x2066: LRI, // LeftToRightIsolate, 0x2067: RLI, // RightToLeftIsolate, 0x2068: FSI, // FirstStrongIsolate, 0x2069: PDI, // PopDirectionalIsolate, } // A trie entry has the following bits: // 7..5 XOR mask for brackets // 4 1: Bracket open, 0: Bracket close // 3..0 Class type const ( openMask = 0x10 xorMaskShift = 5 ) ================================================ FILE: vendor/golang.org/x/text/unicode/norm/composition.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package norm import "unicode/utf8" const ( maxNonStarters = 30 // The maximum number of characters needed for a buffer is // maxNonStarters + 1 for the starter + 1 for the GCJ maxBufferSize = maxNonStarters + 2 maxNFCExpansion = 3 // NFC(0x1D160) maxNFKCExpansion = 18 // NFKC(0xFDFA) maxByteBufferSize = utf8.UTFMax * maxBufferSize // 128 ) // ssState is used for reporting the segment state after inserting a rune. // It is returned by streamSafe.next. type ssState int const ( // Indicates a rune was successfully added to the segment. ssSuccess ssState = iota // Indicates a rune starts a new segment and should not be added. ssStarter // Indicates a rune caused a segment overflow and a CGJ should be inserted. ssOverflow ) // streamSafe implements the policy of when a CGJ should be inserted. type streamSafe uint8 // first inserts the first rune of a segment. It is a faster version of next if // it is known p represents the first rune in a segment. func (ss *streamSafe) first(p Properties) { *ss = streamSafe(p.nTrailingNonStarters()) } // insert returns a ssState value to indicate whether a rune represented by p // can be inserted. func (ss *streamSafe) next(p Properties) ssState { if *ss > maxNonStarters { panic("streamSafe was not reset") } n := p.nLeadingNonStarters() if *ss += streamSafe(n); *ss > maxNonStarters { *ss = 0 return ssOverflow } // The Stream-Safe Text Processing prescribes that the counting can stop // as soon as a starter is encountered. However, there are some starters, // like Jamo V and T, that can combine with other runes, leaving their // successive non-starters appended to the previous, possibly causing an // overflow. We will therefore consider any rune with a non-zero nLead to // be a non-starter. Note that it always hold that if nLead > 0 then // nLead == nTrail. if n == 0 { *ss = streamSafe(p.nTrailingNonStarters()) return ssStarter } return ssSuccess } // backwards is used for checking for overflow and segment starts // when traversing a string backwards. Users do not need to call first // for the first rune. The state of the streamSafe retains the count of // the non-starters loaded. func (ss *streamSafe) backwards(p Properties) ssState { if *ss > maxNonStarters { panic("streamSafe was not reset") } c := *ss + streamSafe(p.nTrailingNonStarters()) if c > maxNonStarters { return ssOverflow } *ss = c if p.nLeadingNonStarters() == 0 { return ssStarter } return ssSuccess } func (ss streamSafe) isMax() bool { return ss == maxNonStarters } // GraphemeJoiner is inserted after maxNonStarters non-starter runes. const GraphemeJoiner = "\u034F" // reorderBuffer is used to normalize a single segment. Characters inserted with // insert are decomposed and reordered based on CCC. The compose method can // be used to recombine characters. Note that the byte buffer does not hold // the UTF-8 characters in order. Only the rune array is maintained in sorted // order. flush writes the resulting segment to a byte array. type reorderBuffer struct { rune [maxBufferSize]Properties // Per character info. byte [maxByteBufferSize]byte // UTF-8 buffer. Referenced by runeInfo.pos. nbyte uint8 // Number or bytes. ss streamSafe // For limiting length of non-starter sequence. nrune int // Number of runeInfos. f formInfo src input nsrc int tmpBytes input out []byte flushF func(*reorderBuffer) bool } func (rb *reorderBuffer) init(f Form, src []byte) { rb.f = *formTable[f] rb.src.setBytes(src) rb.nsrc = len(src) rb.ss = 0 } func (rb *reorderBuffer) initString(f Form, src string) { rb.f = *formTable[f] rb.src.setString(src) rb.nsrc = len(src) rb.ss = 0 } func (rb *reorderBuffer) setFlusher(out []byte, f func(*reorderBuffer) bool) { rb.out = out rb.flushF = f } // reset discards all characters from the buffer. func (rb *reorderBuffer) reset() { rb.nrune = 0 rb.nbyte = 0 } func (rb *reorderBuffer) doFlush() bool { if rb.f.composing { rb.compose() } res := rb.flushF(rb) rb.reset() return res } // appendFlush appends the normalized segment to rb.out. func appendFlush(rb *reorderBuffer) bool { for i := 0; i < rb.nrune; i++ { start := rb.rune[i].pos end := start + rb.rune[i].size rb.out = append(rb.out, rb.byte[start:end]...) } return true } // flush appends the normalized segment to out and resets rb. func (rb *reorderBuffer) flush(out []byte) []byte { for i := 0; i < rb.nrune; i++ { start := rb.rune[i].pos end := start + rb.rune[i].size out = append(out, rb.byte[start:end]...) } rb.reset() return out } // flushCopy copies the normalized segment to buf and resets rb. // It returns the number of bytes written to buf. func (rb *reorderBuffer) flushCopy(buf []byte) int { p := 0 for i := 0; i < rb.nrune; i++ { runep := rb.rune[i] p += copy(buf[p:], rb.byte[runep.pos:runep.pos+runep.size]) } rb.reset() return p } // insertOrdered inserts a rune in the buffer, ordered by Canonical Combining Class. // It returns false if the buffer is not large enough to hold the rune. // It is used internally by insert and insertString only. func (rb *reorderBuffer) insertOrdered(info Properties) { n := rb.nrune b := rb.rune[:] cc := info.ccc if cc > 0 { // Find insertion position + move elements to make room. for ; n > 0; n-- { if b[n-1].ccc <= cc { break } b[n] = b[n-1] } } rb.nrune += 1 pos := uint8(rb.nbyte) rb.nbyte += utf8.UTFMax info.pos = pos b[n] = info } // insertErr is an error code returned by insert. Using this type instead // of error improves performance up to 20% for many of the benchmarks. type insertErr int const ( iSuccess insertErr = -iota iShortDst iShortSrc ) // insertFlush inserts the given rune in the buffer ordered by CCC. // If a decomposition with multiple segments are encountered, they leading // ones are flushed. // It returns a non-zero error code if the rune was not inserted. func (rb *reorderBuffer) insertFlush(src input, i int, info Properties) insertErr { if rune := src.hangul(i); rune != 0 { rb.decomposeHangul(rune) return iSuccess } if info.hasDecomposition() { return rb.insertDecomposed(info.Decomposition()) } rb.insertSingle(src, i, info) return iSuccess } // insertUnsafe inserts the given rune in the buffer ordered by CCC. // It is assumed there is sufficient space to hold the runes. It is the // responsibility of the caller to ensure this. This can be done by checking // the state returned by the streamSafe type. func (rb *reorderBuffer) insertUnsafe(src input, i int, info Properties) { if rune := src.hangul(i); rune != 0 { rb.decomposeHangul(rune) } if info.hasDecomposition() { // TODO: inline. rb.insertDecomposed(info.Decomposition()) } else { rb.insertSingle(src, i, info) } } // insertDecomposed inserts an entry in to the reorderBuffer for each rune // in dcomp. dcomp must be a sequence of decomposed UTF-8-encoded runes. // It flushes the buffer on each new segment start. func (rb *reorderBuffer) insertDecomposed(dcomp []byte) insertErr { rb.tmpBytes.setBytes(dcomp) // As the streamSafe accounting already handles the counting for modifiers, // we don't have to call next. However, we do need to keep the accounting // intact when flushing the buffer. for i := 0; i < len(dcomp); { info := rb.f.info(rb.tmpBytes, i) if info.BoundaryBefore() && rb.nrune > 0 && !rb.doFlush() { return iShortDst } i += copy(rb.byte[rb.nbyte:], dcomp[i:i+int(info.size)]) rb.insertOrdered(info) } return iSuccess } // insertSingle inserts an entry in the reorderBuffer for the rune at // position i. info is the runeInfo for the rune at position i. func (rb *reorderBuffer) insertSingle(src input, i int, info Properties) { src.copySlice(rb.byte[rb.nbyte:], i, i+int(info.size)) rb.insertOrdered(info) } // insertCGJ inserts a Combining Grapheme Joiner (0x034f) into rb. func (rb *reorderBuffer) insertCGJ() { rb.insertSingle(input{str: GraphemeJoiner}, 0, Properties{size: uint8(len(GraphemeJoiner))}) } // appendRune inserts a rune at the end of the buffer. It is used for Hangul. func (rb *reorderBuffer) appendRune(r rune) { bn := rb.nbyte sz := utf8.EncodeRune(rb.byte[bn:], rune(r)) rb.nbyte += utf8.UTFMax rb.rune[rb.nrune] = Properties{pos: bn, size: uint8(sz)} rb.nrune++ } // assignRune sets a rune at position pos. It is used for Hangul and recomposition. func (rb *reorderBuffer) assignRune(pos int, r rune) { bn := rb.rune[pos].pos sz := utf8.EncodeRune(rb.byte[bn:], rune(r)) rb.rune[pos] = Properties{pos: bn, size: uint8(sz)} } // runeAt returns the rune at position n. It is used for Hangul and recomposition. func (rb *reorderBuffer) runeAt(n int) rune { inf := rb.rune[n] r, _ := utf8.DecodeRune(rb.byte[inf.pos : inf.pos+inf.size]) return r } // bytesAt returns the UTF-8 encoding of the rune at position n. // It is used for Hangul and recomposition. func (rb *reorderBuffer) bytesAt(n int) []byte { inf := rb.rune[n] return rb.byte[inf.pos : int(inf.pos)+int(inf.size)] } // For Hangul we combine algorithmically, instead of using tables. const ( hangulBase = 0xAC00 // UTF-8(hangulBase) -> EA B0 80 hangulBase0 = 0xEA hangulBase1 = 0xB0 hangulBase2 = 0x80 hangulEnd = hangulBase + jamoLVTCount // UTF-8(0xD7A4) -> ED 9E A4 hangulEnd0 = 0xED hangulEnd1 = 0x9E hangulEnd2 = 0xA4 jamoLBase = 0x1100 // UTF-8(jamoLBase) -> E1 84 00 jamoLBase0 = 0xE1 jamoLBase1 = 0x84 jamoLEnd = 0x1113 jamoVBase = 0x1161 jamoVEnd = 0x1176 jamoTBase = 0x11A7 jamoTEnd = 0x11C3 jamoTCount = 28 jamoVCount = 21 jamoVTCount = 21 * 28 jamoLVTCount = 19 * 21 * 28 ) const hangulUTF8Size = 3 func isHangul(b []byte) bool { if len(b) < hangulUTF8Size { return false } b0 := b[0] if b0 < hangulBase0 { return false } b1 := b[1] switch { case b0 == hangulBase0: return b1 >= hangulBase1 case b0 < hangulEnd0: return true case b0 > hangulEnd0: return false case b1 < hangulEnd1: return true } return b1 == hangulEnd1 && b[2] < hangulEnd2 } func isHangulString(b string) bool { if len(b) < hangulUTF8Size { return false } b0 := b[0] if b0 < hangulBase0 { return false } b1 := b[1] switch { case b0 == hangulBase0: return b1 >= hangulBase1 case b0 < hangulEnd0: return true case b0 > hangulEnd0: return false case b1 < hangulEnd1: return true } return b1 == hangulEnd1 && b[2] < hangulEnd2 } // Caller must ensure len(b) >= 2. func isJamoVT(b []byte) bool { // True if (rune & 0xff00) == jamoLBase return b[0] == jamoLBase0 && (b[1]&0xFC) == jamoLBase1 } func isHangulWithoutJamoT(b []byte) bool { c, _ := utf8.DecodeRune(b) c -= hangulBase return c < jamoLVTCount && c%jamoTCount == 0 } // decomposeHangul writes the decomposed Hangul to buf and returns the number // of bytes written. len(buf) should be at least 9. func decomposeHangul(buf []byte, r rune) int { const JamoUTF8Len = 3 r -= hangulBase x := r % jamoTCount r /= jamoTCount utf8.EncodeRune(buf, jamoLBase+r/jamoVCount) utf8.EncodeRune(buf[JamoUTF8Len:], jamoVBase+r%jamoVCount) if x != 0 { utf8.EncodeRune(buf[2*JamoUTF8Len:], jamoTBase+x) return 3 * JamoUTF8Len } return 2 * JamoUTF8Len } // decomposeHangul algorithmically decomposes a Hangul rune into // its Jamo components. // See http://unicode.org/reports/tr15/#Hangul for details on decomposing Hangul. func (rb *reorderBuffer) decomposeHangul(r rune) { r -= hangulBase x := r % jamoTCount r /= jamoTCount rb.appendRune(jamoLBase + r/jamoVCount) rb.appendRune(jamoVBase + r%jamoVCount) if x != 0 { rb.appendRune(jamoTBase + x) } } // combineHangul algorithmically combines Jamo character components into Hangul. // See http://unicode.org/reports/tr15/#Hangul for details on combining Hangul. func (rb *reorderBuffer) combineHangul(s, i, k int) { b := rb.rune[:] bn := rb.nrune for ; i < bn; i++ { cccB := b[k-1].ccc cccC := b[i].ccc if cccB == 0 { s = k - 1 } if s != k-1 && cccB >= cccC { // b[i] is blocked by greater-equal cccX below it b[k] = b[i] k++ } else { l := rb.runeAt(s) // also used to compare to hangulBase v := rb.runeAt(i) // also used to compare to jamoT switch { case jamoLBase <= l && l < jamoLEnd && jamoVBase <= v && v < jamoVEnd: // 11xx plus 116x to LV rb.assignRune(s, hangulBase+ (l-jamoLBase)*jamoVTCount+(v-jamoVBase)*jamoTCount) case hangulBase <= l && l < hangulEnd && jamoTBase < v && v < jamoTEnd && ((l-hangulBase)%jamoTCount) == 0: // ACxx plus 11Ax to LVT rb.assignRune(s, l+v-jamoTBase) default: b[k] = b[i] k++ } } } rb.nrune = k } // compose recombines the runes in the buffer. // It should only be used to recompose a single segment, as it will not // handle alternations between Hangul and non-Hangul characters correctly. func (rb *reorderBuffer) compose() { // UAX #15, section X5 , including Corrigendum #5 // "In any character sequence beginning with starter S, a character C is // blocked from S if and only if there is some character B between S // and C, and either B is a starter or it has the same or higher // combining class as C." bn := rb.nrune if bn == 0 { return } k := 1 b := rb.rune[:] for s, i := 0, 1; i < bn; i++ { if isJamoVT(rb.bytesAt(i)) { // Redo from start in Hangul mode. Necessary to support // U+320E..U+321E in NFKC mode. rb.combineHangul(s, i, k) return } ii := b[i] // We can only use combineForward as a filter if we later // get the info for the combined character. This is more // expensive than using the filter. Using combinesBackward() // is safe. if ii.combinesBackward() { cccB := b[k-1].ccc cccC := ii.ccc blocked := false // b[i] blocked by starter or greater or equal CCC? if cccB == 0 { s = k - 1 } else { blocked = s != k-1 && cccB >= cccC } if !blocked { combined := combine(rb.runeAt(s), rb.runeAt(i)) if combined != 0 { rb.assignRune(s, combined) continue } } } b[k] = b[i] k++ } rb.nrune = k } ================================================ FILE: vendor/golang.org/x/text/unicode/norm/forminfo.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package norm // This file contains Form-specific logic and wrappers for data in tables.go. // Rune info is stored in a separate trie per composing form. A composing form // and its corresponding decomposing form share the same trie. Each trie maps // a rune to a uint16. The values take two forms. For v >= 0x8000: // bits // 15: 1 (inverse of NFD_QC bit of qcInfo) // 13..7: qcInfo (see below). isYesD is always true (no decompostion). // 6..0: ccc (compressed CCC value). // For v < 0x8000, the respective rune has a decomposition and v is an index // into a byte array of UTF-8 decomposition sequences and additional info and // has the form: // <header> <decomp_byte>* [<tccc> [<lccc>]] // The header contains the number of bytes in the decomposition (excluding this // length byte). The two most significant bits of this length byte correspond // to bit 5 and 4 of qcInfo (see below). The byte sequence itself starts at v+1. // The byte sequence is followed by a trailing and leading CCC if the values // for these are not zero. The value of v determines which ccc are appended // to the sequences. For v < firstCCC, there are none, for v >= firstCCC, // the sequence is followed by a trailing ccc, and for v >= firstLeadingCC // there is an additional leading ccc. The value of tccc itself is the // trailing CCC shifted left 2 bits. The two least-significant bits of tccc // are the number of trailing non-starters. const ( qcInfoMask = 0x3F // to clear all but the relevant bits in a qcInfo headerLenMask = 0x3F // extract the length value from the header byte headerFlagsMask = 0xC0 // extract the qcInfo bits from the header byte ) // Properties provides access to normalization properties of a rune. type Properties struct { pos uint8 // start position in reorderBuffer; used in composition.go size uint8 // length of UTF-8 encoding of this rune ccc uint8 // leading canonical combining class (ccc if not decomposition) tccc uint8 // trailing canonical combining class (ccc if not decomposition) nLead uint8 // number of leading non-starters. flags qcInfo // quick check flags index uint16 } // functions dispatchable per form type lookupFunc func(b input, i int) Properties // formInfo holds Form-specific functions and tables. type formInfo struct { form Form composing, compatibility bool // form type info lookupFunc nextMain iterFunc } var formTable = []*formInfo{{ form: NFC, composing: true, compatibility: false, info: lookupInfoNFC, nextMain: nextComposed, }, { form: NFD, composing: false, compatibility: false, info: lookupInfoNFC, nextMain: nextDecomposed, }, { form: NFKC, composing: true, compatibility: true, info: lookupInfoNFKC, nextMain: nextComposed, }, { form: NFKD, composing: false, compatibility: true, info: lookupInfoNFKC, nextMain: nextDecomposed, }} // We do not distinguish between boundaries for NFC, NFD, etc. to avoid // unexpected behavior for the user. For example, in NFD, there is a boundary // after 'a'. However, 'a' might combine with modifiers, so from the application's // perspective it is not a good boundary. We will therefore always use the // boundaries for the combining variants. // BoundaryBefore returns true if this rune starts a new segment and // cannot combine with any rune on the left. func (p Properties) BoundaryBefore() bool { if p.ccc == 0 && !p.combinesBackward() { return true } // We assume that the CCC of the first character in a decomposition // is always non-zero if different from info.ccc and that we can return // false at this point. This is verified by maketables. return false } // BoundaryAfter returns true if runes cannot combine with or otherwise // interact with this or previous runes. func (p Properties) BoundaryAfter() bool { // TODO: loosen these conditions. return p.isInert() } // We pack quick check data in 4 bits: // 5: Combines forward (0 == false, 1 == true) // 4..3: NFC_QC Yes(00), No (10), or Maybe (11) // 2: NFD_QC Yes (0) or No (1). No also means there is a decomposition. // 1..0: Number of trailing non-starters. // // When all 4 bits are zero, the character is inert, meaning it is never // influenced by normalization. type qcInfo uint8 func (p Properties) isYesC() bool { return p.flags&0x10 == 0 } func (p Properties) isYesD() bool { return p.flags&0x4 == 0 } func (p Properties) combinesForward() bool { return p.flags&0x20 != 0 } func (p Properties) combinesBackward() bool { return p.flags&0x8 != 0 } // == isMaybe func (p Properties) hasDecomposition() bool { return p.flags&0x4 != 0 } // == isNoD func (p Properties) isInert() bool { return p.flags&qcInfoMask == 0 && p.ccc == 0 } func (p Properties) multiSegment() bool { return p.index >= firstMulti && p.index < endMulti } func (p Properties) nLeadingNonStarters() uint8 { return p.nLead } func (p Properties) nTrailingNonStarters() uint8 { return uint8(p.flags & 0x03) } // Decomposition returns the decomposition for the underlying rune // or nil if there is none. func (p Properties) Decomposition() []byte { // TODO: create the decomposition for Hangul? if p.index == 0 { return nil } i := p.index n := decomps[i] & headerLenMask i++ return decomps[i : i+uint16(n)] } // Size returns the length of UTF-8 encoding of the rune. func (p Properties) Size() int { return int(p.size) } // CCC returns the canonical combining class of the underlying rune. func (p Properties) CCC() uint8 { if p.index >= firstCCCZeroExcept { return 0 } return ccc[p.ccc] } // LeadCCC returns the CCC of the first rune in the decomposition. // If there is no decomposition, LeadCCC equals CCC. func (p Properties) LeadCCC() uint8 { return ccc[p.ccc] } // TrailCCC returns the CCC of the last rune in the decomposition. // If there is no decomposition, TrailCCC equals CCC. func (p Properties) TrailCCC() uint8 { return ccc[p.tccc] } // Recomposition // We use 32-bit keys instead of 64-bit for the two codepoint keys. // This clips off the bits of three entries, but we know this will not // result in a collision. In the unlikely event that changes to // UnicodeData.txt introduce collisions, the compiler will catch it. // Note that the recomposition map for NFC and NFKC are identical. // combine returns the combined rune or 0 if it doesn't exist. func combine(a, b rune) rune { key := uint32(uint16(a))<<16 + uint32(uint16(b)) return recompMap[key] } func lookupInfoNFC(b input, i int) Properties { v, sz := b.charinfoNFC(i) return compInfo(v, sz) } func lookupInfoNFKC(b input, i int) Properties { v, sz := b.charinfoNFKC(i) return compInfo(v, sz) } // Properties returns properties for the first rune in s. func (f Form) Properties(s []byte) Properties { if f == NFC || f == NFD { return compInfo(nfcData.lookup(s)) } return compInfo(nfkcData.lookup(s)) } // PropertiesString returns properties for the first rune in s. func (f Form) PropertiesString(s string) Properties { if f == NFC || f == NFD { return compInfo(nfcData.lookupString(s)) } return compInfo(nfkcData.lookupString(s)) } // compInfo converts the information contained in v and sz // to a Properties. See the comment at the top of the file // for more information on the format. func compInfo(v uint16, sz int) Properties { if v == 0 { return Properties{size: uint8(sz)} } else if v >= 0x8000 { p := Properties{ size: uint8(sz), ccc: uint8(v), tccc: uint8(v), flags: qcInfo(v >> 8), } if p.ccc > 0 || p.combinesBackward() { p.nLead = uint8(p.flags & 0x3) } return p } // has decomposition h := decomps[v] f := (qcInfo(h&headerFlagsMask) >> 2) | 0x4 p := Properties{size: uint8(sz), flags: f, index: v} if v >= firstCCC { v += uint16(h&headerLenMask) + 1 c := decomps[v] p.tccc = c >> 2 p.flags |= qcInfo(c & 0x3) if v >= firstLeadingCCC { p.nLead = c & 0x3 if v >= firstStarterWithNLead { // We were tricked. Remove the decomposition. p.flags &= 0x03 p.index = 0 return p } p.ccc = decomps[v+1] } } return p } ================================================ FILE: vendor/golang.org/x/text/unicode/norm/input.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package norm import "unicode/utf8" type input struct { str string bytes []byte } func inputBytes(str []byte) input { return input{bytes: str} } func inputString(str string) input { return input{str: str} } func (in *input) setBytes(str []byte) { in.str = "" in.bytes = str } func (in *input) setString(str string) { in.str = str in.bytes = nil } func (in *input) _byte(p int) byte { if in.bytes == nil { return in.str[p] } return in.bytes[p] } func (in *input) skipASCII(p, max int) int { if in.bytes == nil { for ; p < max && in.str[p] < utf8.RuneSelf; p++ { } } else { for ; p < max && in.bytes[p] < utf8.RuneSelf; p++ { } } return p } func (in *input) skipContinuationBytes(p int) int { if in.bytes == nil { for ; p < len(in.str) && !utf8.RuneStart(in.str[p]); p++ { } } else { for ; p < len(in.bytes) && !utf8.RuneStart(in.bytes[p]); p++ { } } return p } func (in *input) appendSlice(buf []byte, b, e int) []byte { if in.bytes != nil { return append(buf, in.bytes[b:e]...) } for i := b; i < e; i++ { buf = append(buf, in.str[i]) } return buf } func (in *input) copySlice(buf []byte, b, e int) int { if in.bytes == nil { return copy(buf, in.str[b:e]) } return copy(buf, in.bytes[b:e]) } func (in *input) charinfoNFC(p int) (uint16, int) { if in.bytes == nil { return nfcData.lookupString(in.str[p:]) } return nfcData.lookup(in.bytes[p:]) } func (in *input) charinfoNFKC(p int) (uint16, int) { if in.bytes == nil { return nfkcData.lookupString(in.str[p:]) } return nfkcData.lookup(in.bytes[p:]) } func (in *input) hangul(p int) (r rune) { var size int if in.bytes == nil { if !isHangulString(in.str[p:]) { return 0 } r, size = utf8.DecodeRuneInString(in.str[p:]) } else { if !isHangul(in.bytes[p:]) { return 0 } r, size = utf8.DecodeRune(in.bytes[p:]) } if size != hangulUTF8Size { return 0 } return r } ================================================ FILE: vendor/golang.org/x/text/unicode/norm/iter.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package norm import ( "fmt" "unicode/utf8" ) // MaxSegmentSize is the maximum size of a byte buffer needed to consider any // sequence of starter and non-starter runes for the purpose of normalization. const MaxSegmentSize = maxByteBufferSize // An Iter iterates over a string or byte slice, while normalizing it // to a given Form. type Iter struct { rb reorderBuffer buf [maxByteBufferSize]byte info Properties // first character saved from previous iteration next iterFunc // implementation of next depends on form asciiF iterFunc p int // current position in input source multiSeg []byte // remainder of multi-segment decomposition } type iterFunc func(*Iter) []byte // Init initializes i to iterate over src after normalizing it to Form f. func (i *Iter) Init(f Form, src []byte) { i.p = 0 if len(src) == 0 { i.setDone() i.rb.nsrc = 0 return } i.multiSeg = nil i.rb.init(f, src) i.next = i.rb.f.nextMain i.asciiF = nextASCIIBytes i.info = i.rb.f.info(i.rb.src, i.p) i.rb.ss.first(i.info) } // InitString initializes i to iterate over src after normalizing it to Form f. func (i *Iter) InitString(f Form, src string) { i.p = 0 if len(src) == 0 { i.setDone() i.rb.nsrc = 0 return } i.multiSeg = nil i.rb.initString(f, src) i.next = i.rb.f.nextMain i.asciiF = nextASCIIString i.info = i.rb.f.info(i.rb.src, i.p) i.rb.ss.first(i.info) } // Seek sets the segment to be returned by the next call to Next to start // at position p. It is the responsibility of the caller to set p to the // start of a segment. func (i *Iter) Seek(offset int64, whence int) (int64, error) { var abs int64 switch whence { case 0: abs = offset case 1: abs = int64(i.p) + offset case 2: abs = int64(i.rb.nsrc) + offset default: return 0, fmt.Errorf("norm: invalid whence") } if abs < 0 { return 0, fmt.Errorf("norm: negative position") } if int(abs) >= i.rb.nsrc { i.setDone() return int64(i.p), nil } i.p = int(abs) i.multiSeg = nil i.next = i.rb.f.nextMain i.info = i.rb.f.info(i.rb.src, i.p) i.rb.ss.first(i.info) return abs, nil } // returnSlice returns a slice of the underlying input type as a byte slice. // If the underlying is of type []byte, it will simply return a slice. // If the underlying is of type string, it will copy the slice to the buffer // and return that. func (i *Iter) returnSlice(a, b int) []byte { if i.rb.src.bytes == nil { return i.buf[:copy(i.buf[:], i.rb.src.str[a:b])] } return i.rb.src.bytes[a:b] } // Pos returns the byte position at which the next call to Next will commence processing. func (i *Iter) Pos() int { return i.p } func (i *Iter) setDone() { i.next = nextDone i.p = i.rb.nsrc } // Done returns true if there is no more input to process. func (i *Iter) Done() bool { return i.p >= i.rb.nsrc } // Next returns f(i.input[i.Pos():n]), where n is a boundary of i.input. // For any input a and b for which f(a) == f(b), subsequent calls // to Next will return the same segments. // Modifying runes are grouped together with the preceding starter, if such a starter exists. // Although not guaranteed, n will typically be the smallest possible n. func (i *Iter) Next() []byte { return i.next(i) } func nextASCIIBytes(i *Iter) []byte { p := i.p + 1 if p >= i.rb.nsrc { i.setDone() return i.rb.src.bytes[i.p:p] } if i.rb.src.bytes[p] < utf8.RuneSelf { p0 := i.p i.p = p return i.rb.src.bytes[p0:p] } i.info = i.rb.f.info(i.rb.src, i.p) i.next = i.rb.f.nextMain return i.next(i) } func nextASCIIString(i *Iter) []byte { p := i.p + 1 if p >= i.rb.nsrc { i.buf[0] = i.rb.src.str[i.p] i.setDone() return i.buf[:1] } if i.rb.src.str[p] < utf8.RuneSelf { i.buf[0] = i.rb.src.str[i.p] i.p = p return i.buf[:1] } i.info = i.rb.f.info(i.rb.src, i.p) i.next = i.rb.f.nextMain return i.next(i) } func nextHangul(i *Iter) []byte { p := i.p next := p + hangulUTF8Size if next >= i.rb.nsrc { i.setDone() } else if i.rb.src.hangul(next) == 0 { i.rb.ss.next(i.info) i.info = i.rb.f.info(i.rb.src, i.p) i.next = i.rb.f.nextMain return i.next(i) } i.p = next return i.buf[:decomposeHangul(i.buf[:], i.rb.src.hangul(p))] } func nextDone(i *Iter) []byte { return nil } // nextMulti is used for iterating over multi-segment decompositions // for decomposing normal forms. func nextMulti(i *Iter) []byte { j := 0 d := i.multiSeg // skip first rune for j = 1; j < len(d) && !utf8.RuneStart(d[j]); j++ { } for j < len(d) { info := i.rb.f.info(input{bytes: d}, j) if info.BoundaryBefore() { i.multiSeg = d[j:] return d[:j] } j += int(info.size) } // treat last segment as normal decomposition i.next = i.rb.f.nextMain return i.next(i) } // nextMultiNorm is used for iterating over multi-segment decompositions // for composing normal forms. func nextMultiNorm(i *Iter) []byte { j := 0 d := i.multiSeg for j < len(d) { info := i.rb.f.info(input{bytes: d}, j) if info.BoundaryBefore() { i.rb.compose() seg := i.buf[:i.rb.flushCopy(i.buf[:])] i.rb.insertUnsafe(input{bytes: d}, j, info) i.multiSeg = d[j+int(info.size):] return seg } i.rb.insertUnsafe(input{bytes: d}, j, info) j += int(info.size) } i.multiSeg = nil i.next = nextComposed return doNormComposed(i) } // nextDecomposed is the implementation of Next for forms NFD and NFKD. func nextDecomposed(i *Iter) (next []byte) { outp := 0 inCopyStart, outCopyStart := i.p, 0 for { if sz := int(i.info.size); sz <= 1 { i.rb.ss = 0 p := i.p i.p++ // ASCII or illegal byte. Either way, advance by 1. if i.p >= i.rb.nsrc { i.setDone() return i.returnSlice(p, i.p) } else if i.rb.src._byte(i.p) < utf8.RuneSelf { i.next = i.asciiF return i.returnSlice(p, i.p) } outp++ } else if d := i.info.Decomposition(); d != nil { // Note: If leading CCC != 0, then len(d) == 2 and last is also non-zero. // Case 1: there is a leftover to copy. In this case the decomposition // must begin with a modifier and should always be appended. // Case 2: no leftover. Simply return d if followed by a ccc == 0 value. p := outp + len(d) if outp > 0 { i.rb.src.copySlice(i.buf[outCopyStart:], inCopyStart, i.p) // TODO: this condition should not be possible, but we leave it // in for defensive purposes. if p > len(i.buf) { return i.buf[:outp] } } else if i.info.multiSegment() { // outp must be 0 as multi-segment decompositions always // start a new segment. if i.multiSeg == nil { i.multiSeg = d i.next = nextMulti return nextMulti(i) } // We are in the last segment. Treat as normal decomposition. d = i.multiSeg i.multiSeg = nil p = len(d) } prevCC := i.info.tccc if i.p += sz; i.p >= i.rb.nsrc { i.setDone() i.info = Properties{} // Force BoundaryBefore to succeed. } else { i.info = i.rb.f.info(i.rb.src, i.p) } switch i.rb.ss.next(i.info) { case ssOverflow: i.next = nextCGJDecompose fallthrough case ssStarter: if outp > 0 { copy(i.buf[outp:], d) return i.buf[:p] } return d } copy(i.buf[outp:], d) outp = p inCopyStart, outCopyStart = i.p, outp if i.info.ccc < prevCC { goto doNorm } continue } else if r := i.rb.src.hangul(i.p); r != 0 { outp = decomposeHangul(i.buf[:], r) i.p += hangulUTF8Size inCopyStart, outCopyStart = i.p, outp if i.p >= i.rb.nsrc { i.setDone() break } else if i.rb.src.hangul(i.p) != 0 { i.next = nextHangul return i.buf[:outp] } } else { p := outp + sz if p > len(i.buf) { break } outp = p i.p += sz } if i.p >= i.rb.nsrc { i.setDone() break } prevCC := i.info.tccc i.info = i.rb.f.info(i.rb.src, i.p) if v := i.rb.ss.next(i.info); v == ssStarter { break } else if v == ssOverflow { i.next = nextCGJDecompose break } if i.info.ccc < prevCC { goto doNorm } } if outCopyStart == 0 { return i.returnSlice(inCopyStart, i.p) } else if inCopyStart < i.p { i.rb.src.copySlice(i.buf[outCopyStart:], inCopyStart, i.p) } return i.buf[:outp] doNorm: // Insert what we have decomposed so far in the reorderBuffer. // As we will only reorder, there will always be enough room. i.rb.src.copySlice(i.buf[outCopyStart:], inCopyStart, i.p) i.rb.insertDecomposed(i.buf[0:outp]) return doNormDecomposed(i) } func doNormDecomposed(i *Iter) []byte { for { i.rb.insertUnsafe(i.rb.src, i.p, i.info) if i.p += int(i.info.size); i.p >= i.rb.nsrc { i.setDone() break } i.info = i.rb.f.info(i.rb.src, i.p) if i.info.ccc == 0 { break } if s := i.rb.ss.next(i.info); s == ssOverflow { i.next = nextCGJDecompose break } } // new segment or too many combining characters: exit normalization return i.buf[:i.rb.flushCopy(i.buf[:])] } func nextCGJDecompose(i *Iter) []byte { i.rb.ss = 0 i.rb.insertCGJ() i.next = nextDecomposed i.rb.ss.first(i.info) buf := doNormDecomposed(i) return buf } // nextComposed is the implementation of Next for forms NFC and NFKC. func nextComposed(i *Iter) []byte { outp, startp := 0, i.p var prevCC uint8 for { if !i.info.isYesC() { goto doNorm } prevCC = i.info.tccc sz := int(i.info.size) if sz == 0 { sz = 1 // illegal rune: copy byte-by-byte } p := outp + sz if p > len(i.buf) { break } outp = p i.p += sz if i.p >= i.rb.nsrc { i.setDone() break } else if i.rb.src._byte(i.p) < utf8.RuneSelf { i.rb.ss = 0 i.next = i.asciiF break } i.info = i.rb.f.info(i.rb.src, i.p) if v := i.rb.ss.next(i.info); v == ssStarter { break } else if v == ssOverflow { i.next = nextCGJCompose break } if i.info.ccc < prevCC { goto doNorm } } return i.returnSlice(startp, i.p) doNorm: // reset to start position i.p = startp i.info = i.rb.f.info(i.rb.src, i.p) i.rb.ss.first(i.info) if i.info.multiSegment() { d := i.info.Decomposition() info := i.rb.f.info(input{bytes: d}, 0) i.rb.insertUnsafe(input{bytes: d}, 0, info) i.multiSeg = d[int(info.size):] i.next = nextMultiNorm return nextMultiNorm(i) } i.rb.ss.first(i.info) i.rb.insertUnsafe(i.rb.src, i.p, i.info) return doNormComposed(i) } func doNormComposed(i *Iter) []byte { // First rune should already be inserted. for { if i.p += int(i.info.size); i.p >= i.rb.nsrc { i.setDone() break } i.info = i.rb.f.info(i.rb.src, i.p) if s := i.rb.ss.next(i.info); s == ssStarter { break } else if s == ssOverflow { i.next = nextCGJCompose break } i.rb.insertUnsafe(i.rb.src, i.p, i.info) } i.rb.compose() seg := i.buf[:i.rb.flushCopy(i.buf[:])] return seg } func nextCGJCompose(i *Iter) []byte { i.rb.ss = 0 // instead of first i.rb.insertCGJ() i.next = nextComposed // Note that we treat any rune with nLeadingNonStarters > 0 as a non-starter, // even if they are not. This is particularly dubious for U+FF9E and UFF9A. // If we ever change that, insert a check here. i.rb.ss.first(i.info) i.rb.insertUnsafe(i.rb.src, i.p, i.info) return doNormComposed(i) } ================================================ FILE: vendor/golang.org/x/text/unicode/norm/normalize.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Note: the file data_test.go that is generated should not be checked in. //go:generate go run maketables.go triegen.go //go:generate go test -tags test // Package norm contains types and functions for normalizing Unicode strings. package norm // import "golang.org/x/text/unicode/norm" import ( "unicode/utf8" "golang.org/x/text/transform" ) // A Form denotes a canonical representation of Unicode code points. // The Unicode-defined normalization and equivalence forms are: // // NFC Unicode Normalization Form C // NFD Unicode Normalization Form D // NFKC Unicode Normalization Form KC // NFKD Unicode Normalization Form KD // // For a Form f, this documentation uses the notation f(x) to mean // the bytes or string x converted to the given form. // A position n in x is called a boundary if conversion to the form can // proceed independently on both sides: // f(x) == append(f(x[0:n]), f(x[n:])...) // // References: http://unicode.org/reports/tr15/ and // http://unicode.org/notes/tn5/. type Form int const ( NFC Form = iota NFD NFKC NFKD ) // Bytes returns f(b). May return b if f(b) = b. func (f Form) Bytes(b []byte) []byte { src := inputBytes(b) ft := formTable[f] n, ok := ft.quickSpan(src, 0, len(b), true) if ok { return b } out := make([]byte, n, len(b)) copy(out, b[0:n]) rb := reorderBuffer{f: *ft, src: src, nsrc: len(b), out: out, flushF: appendFlush} return doAppendInner(&rb, n) } // String returns f(s). func (f Form) String(s string) string { src := inputString(s) ft := formTable[f] n, ok := ft.quickSpan(src, 0, len(s), true) if ok { return s } out := make([]byte, n, len(s)) copy(out, s[0:n]) rb := reorderBuffer{f: *ft, src: src, nsrc: len(s), out: out, flushF: appendFlush} return string(doAppendInner(&rb, n)) } // IsNormal returns true if b == f(b). func (f Form) IsNormal(b []byte) bool { src := inputBytes(b) ft := formTable[f] bp, ok := ft.quickSpan(src, 0, len(b), true) if ok { return true } rb := reorderBuffer{f: *ft, src: src, nsrc: len(b)} rb.setFlusher(nil, cmpNormalBytes) for bp < len(b) { rb.out = b[bp:] if bp = decomposeSegment(&rb, bp, true); bp < 0 { return false } bp, _ = rb.f.quickSpan(rb.src, bp, len(b), true) } return true } func cmpNormalBytes(rb *reorderBuffer) bool { b := rb.out for i := 0; i < rb.nrune; i++ { info := rb.rune[i] if int(info.size) > len(b) { return false } p := info.pos pe := p + info.size for ; p < pe; p++ { if b[0] != rb.byte[p] { return false } b = b[1:] } } return true } // IsNormalString returns true if s == f(s). func (f Form) IsNormalString(s string) bool { src := inputString(s) ft := formTable[f] bp, ok := ft.quickSpan(src, 0, len(s), true) if ok { return true } rb := reorderBuffer{f: *ft, src: src, nsrc: len(s)} rb.setFlusher(nil, func(rb *reorderBuffer) bool { for i := 0; i < rb.nrune; i++ { info := rb.rune[i] if bp+int(info.size) > len(s) { return false } p := info.pos pe := p + info.size for ; p < pe; p++ { if s[bp] != rb.byte[p] { return false } bp++ } } return true }) for bp < len(s) { if bp = decomposeSegment(&rb, bp, true); bp < 0 { return false } bp, _ = rb.f.quickSpan(rb.src, bp, len(s), true) } return true } // patchTail fixes a case where a rune may be incorrectly normalized // if it is followed by illegal continuation bytes. It returns the // patched buffer and whether the decomposition is still in progress. func patchTail(rb *reorderBuffer) bool { info, p := lastRuneStart(&rb.f, rb.out) if p == -1 || info.size == 0 { return true } end := p + int(info.size) extra := len(rb.out) - end if extra > 0 { // Potentially allocating memory. However, this only // happens with ill-formed UTF-8. x := make([]byte, 0) x = append(x, rb.out[len(rb.out)-extra:]...) rb.out = rb.out[:end] decomposeToLastBoundary(rb) rb.doFlush() rb.out = append(rb.out, x...) return false } buf := rb.out[p:] rb.out = rb.out[:p] decomposeToLastBoundary(rb) if s := rb.ss.next(info); s == ssStarter { rb.doFlush() rb.ss.first(info) } else if s == ssOverflow { rb.doFlush() rb.insertCGJ() rb.ss = 0 } rb.insertUnsafe(inputBytes(buf), 0, info) return true } func appendQuick(rb *reorderBuffer, i int) int { if rb.nsrc == i { return i } end, _ := rb.f.quickSpan(rb.src, i, rb.nsrc, true) rb.out = rb.src.appendSlice(rb.out, i, end) return end } // Append returns f(append(out, b...)). // The buffer out must be nil, empty, or equal to f(out). func (f Form) Append(out []byte, src ...byte) []byte { return f.doAppend(out, inputBytes(src), len(src)) } func (f Form) doAppend(out []byte, src input, n int) []byte { if n == 0 { return out } ft := formTable[f] // Attempt to do a quickSpan first so we can avoid initializing the reorderBuffer. if len(out) == 0 { p, _ := ft.quickSpan(src, 0, n, true) out = src.appendSlice(out, 0, p) if p == n { return out } rb := reorderBuffer{f: *ft, src: src, nsrc: n, out: out, flushF: appendFlush} return doAppendInner(&rb, p) } rb := reorderBuffer{f: *ft, src: src, nsrc: n} return doAppend(&rb, out, 0) } func doAppend(rb *reorderBuffer, out []byte, p int) []byte { rb.setFlusher(out, appendFlush) src, n := rb.src, rb.nsrc doMerge := len(out) > 0 if q := src.skipContinuationBytes(p); q > p { // Move leading non-starters to destination. rb.out = src.appendSlice(rb.out, p, q) p = q doMerge = patchTail(rb) } fd := &rb.f if doMerge { var info Properties if p < n { info = fd.info(src, p) if !info.BoundaryBefore() || info.nLeadingNonStarters() > 0 { if p == 0 { decomposeToLastBoundary(rb) } p = decomposeSegment(rb, p, true) } } if info.size == 0 { rb.doFlush() // Append incomplete UTF-8 encoding. return src.appendSlice(rb.out, p, n) } if rb.nrune > 0 { return doAppendInner(rb, p) } } p = appendQuick(rb, p) return doAppendInner(rb, p) } func doAppendInner(rb *reorderBuffer, p int) []byte { for n := rb.nsrc; p < n; { p = decomposeSegment(rb, p, true) p = appendQuick(rb, p) } return rb.out } // AppendString returns f(append(out, []byte(s))). // The buffer out must be nil, empty, or equal to f(out). func (f Form) AppendString(out []byte, src string) []byte { return f.doAppend(out, inputString(src), len(src)) } // QuickSpan returns a boundary n such that b[0:n] == f(b[0:n]). // It is not guaranteed to return the largest such n. func (f Form) QuickSpan(b []byte) int { n, _ := formTable[f].quickSpan(inputBytes(b), 0, len(b), true) return n } // Span implements transform.SpanningTransformer. It returns a boundary n such // that b[0:n] == f(b[0:n]). It is not guaranteed to return the largest such n. func (f Form) Span(b []byte, atEOF bool) (n int, err error) { n, ok := formTable[f].quickSpan(inputBytes(b), 0, len(b), atEOF) if n < len(b) { if !ok { err = transform.ErrEndOfSpan } else { err = transform.ErrShortSrc } } return n, err } // SpanString returns a boundary n such that s[0:n] == f(s[0:n]). // It is not guaranteed to return the largest such n. func (f Form) SpanString(s string, atEOF bool) (n int, err error) { n, ok := formTable[f].quickSpan(inputString(s), 0, len(s), atEOF) if n < len(s) { if !ok { err = transform.ErrEndOfSpan } else { err = transform.ErrShortSrc } } return n, err } // quickSpan returns a boundary n such that src[0:n] == f(src[0:n]) and // whether any non-normalized parts were found. If atEOF is false, n will // not point past the last segment if this segment might be become // non-normalized by appending other runes. func (f *formInfo) quickSpan(src input, i, end int, atEOF bool) (n int, ok bool) { var lastCC uint8 ss := streamSafe(0) lastSegStart := i for n = end; i < n; { if j := src.skipASCII(i, n); i != j { i = j lastSegStart = i - 1 lastCC = 0 ss = 0 continue } info := f.info(src, i) if info.size == 0 { if atEOF { // include incomplete runes return n, true } return lastSegStart, true } // This block needs to be before the next, because it is possible to // have an overflow for runes that are starters (e.g. with U+FF9E). switch ss.next(info) { case ssStarter: lastSegStart = i case ssOverflow: return lastSegStart, false case ssSuccess: if lastCC > info.ccc { return lastSegStart, false } } if f.composing { if !info.isYesC() { break } } else { if !info.isYesD() { break } } lastCC = info.ccc i += int(info.size) } if i == n { if !atEOF { n = lastSegStart } return n, true } return lastSegStart, false } // QuickSpanString returns a boundary n such that s[0:n] == f(s[0:n]). // It is not guaranteed to return the largest such n. func (f Form) QuickSpanString(s string) int { n, _ := formTable[f].quickSpan(inputString(s), 0, len(s), true) return n } // FirstBoundary returns the position i of the first boundary in b // or -1 if b contains no boundary. func (f Form) FirstBoundary(b []byte) int { return f.firstBoundary(inputBytes(b), len(b)) } func (f Form) firstBoundary(src input, nsrc int) int { i := src.skipContinuationBytes(0) if i >= nsrc { return -1 } fd := formTable[f] ss := streamSafe(0) // We should call ss.first here, but we can't as the first rune is // skipped already. This means FirstBoundary can't really determine // CGJ insertion points correctly. Luckily it doesn't have to. for { info := fd.info(src, i) if info.size == 0 { return -1 } if s := ss.next(info); s != ssSuccess { return i } i += int(info.size) if i >= nsrc { if !info.BoundaryAfter() && !ss.isMax() { return -1 } return nsrc } } } // FirstBoundaryInString returns the position i of the first boundary in s // or -1 if s contains no boundary. func (f Form) FirstBoundaryInString(s string) int { return f.firstBoundary(inputString(s), len(s)) } // NextBoundary reports the index of the boundary between the first and next // segment in b or -1 if atEOF is false and there are not enough bytes to // determine this boundary. func (f Form) NextBoundary(b []byte, atEOF bool) int { return f.nextBoundary(inputBytes(b), len(b), atEOF) } // NextBoundaryInString reports the index of the boundary between the first and // next segment in b or -1 if atEOF is false and there are not enough bytes to // determine this boundary. func (f Form) NextBoundaryInString(s string, atEOF bool) int { return f.nextBoundary(inputString(s), len(s), atEOF) } func (f Form) nextBoundary(src input, nsrc int, atEOF bool) int { if nsrc == 0 { if atEOF { return 0 } return -1 } fd := formTable[f] info := fd.info(src, 0) if info.size == 0 { if atEOF { return 1 } return -1 } ss := streamSafe(0) ss.first(info) for i := int(info.size); i < nsrc; i += int(info.size) { info = fd.info(src, i) if info.size == 0 { if atEOF { return i } return -1 } // TODO: Using streamSafe to determine the boundary isn't the same as // using BoundaryBefore. Determine which should be used. if s := ss.next(info); s != ssSuccess { return i } } if !atEOF && !info.BoundaryAfter() && !ss.isMax() { return -1 } return nsrc } // LastBoundary returns the position i of the last boundary in b // or -1 if b contains no boundary. func (f Form) LastBoundary(b []byte) int { return lastBoundary(formTable[f], b) } func lastBoundary(fd *formInfo, b []byte) int { i := len(b) info, p := lastRuneStart(fd, b) if p == -1 { return -1 } if info.size == 0 { // ends with incomplete rune if p == 0 { // starts with incomplete rune return -1 } i = p info, p = lastRuneStart(fd, b[:i]) if p == -1 { // incomplete UTF-8 encoding or non-starter bytes without a starter return i } } if p+int(info.size) != i { // trailing non-starter bytes: illegal UTF-8 return i } if info.BoundaryAfter() { return i } ss := streamSafe(0) v := ss.backwards(info) for i = p; i >= 0 && v != ssStarter; i = p { info, p = lastRuneStart(fd, b[:i]) if v = ss.backwards(info); v == ssOverflow { break } if p+int(info.size) != i { if p == -1 { // no boundary found return -1 } return i // boundary after an illegal UTF-8 encoding } } return i } // decomposeSegment scans the first segment in src into rb. It inserts 0x034f // (Grapheme Joiner) when it encounters a sequence of more than 30 non-starters // and returns the number of bytes consumed from src or iShortDst or iShortSrc. func decomposeSegment(rb *reorderBuffer, sp int, atEOF bool) int { // Force one character to be consumed. info := rb.f.info(rb.src, sp) if info.size == 0 { return 0 } if s := rb.ss.next(info); s == ssStarter { // TODO: this could be removed if we don't support merging. if rb.nrune > 0 { goto end } } else if s == ssOverflow { rb.insertCGJ() goto end } if err := rb.insertFlush(rb.src, sp, info); err != iSuccess { return int(err) } for { sp += int(info.size) if sp >= rb.nsrc { if !atEOF && !info.BoundaryAfter() { return int(iShortSrc) } break } info = rb.f.info(rb.src, sp) if info.size == 0 { if !atEOF { return int(iShortSrc) } break } if s := rb.ss.next(info); s == ssStarter { break } else if s == ssOverflow { rb.insertCGJ() break } if err := rb.insertFlush(rb.src, sp, info); err != iSuccess { return int(err) } } end: if !rb.doFlush() { return int(iShortDst) } return sp } // lastRuneStart returns the runeInfo and position of the last // rune in buf or the zero runeInfo and -1 if no rune was found. func lastRuneStart(fd *formInfo, buf []byte) (Properties, int) { p := len(buf) - 1 for ; p >= 0 && !utf8.RuneStart(buf[p]); p-- { } if p < 0 { return Properties{}, -1 } return fd.info(inputBytes(buf), p), p } // decomposeToLastBoundary finds an open segment at the end of the buffer // and scans it into rb. Returns the buffer minus the last segment. func decomposeToLastBoundary(rb *reorderBuffer) { fd := &rb.f info, i := lastRuneStart(fd, rb.out) if int(info.size) != len(rb.out)-i { // illegal trailing continuation bytes return } if info.BoundaryAfter() { return } var add [maxNonStarters + 1]Properties // stores runeInfo in reverse order padd := 0 ss := streamSafe(0) p := len(rb.out) for { add[padd] = info v := ss.backwards(info) if v == ssOverflow { // Note that if we have an overflow, it the string we are appending to // is not correctly normalized. In this case the behavior is undefined. break } padd++ p -= int(info.size) if v == ssStarter || p < 0 { break } info, i = lastRuneStart(fd, rb.out[:p]) if int(info.size) != p-i { break } } rb.ss = ss // Copy bytes for insertion as we may need to overwrite rb.out. var buf [maxBufferSize * utf8.UTFMax]byte cp := buf[:copy(buf[:], rb.out[p:])] rb.out = rb.out[:p] for padd--; padd >= 0; padd-- { info = add[padd] rb.insertUnsafe(inputBytes(cp), 0, info) cp = cp[info.size:] } } ================================================ FILE: vendor/golang.org/x/text/unicode/norm/readwriter.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package norm import "io" type normWriter struct { rb reorderBuffer w io.Writer buf []byte } // Write implements the standard write interface. If the last characters are // not at a normalization boundary, the bytes will be buffered for the next // write. The remaining bytes will be written on close. func (w *normWriter) Write(data []byte) (n int, err error) { // Process data in pieces to keep w.buf size bounded. const chunk = 4000 for len(data) > 0 { // Normalize into w.buf. m := len(data) if m > chunk { m = chunk } w.rb.src = inputBytes(data[:m]) w.rb.nsrc = m w.buf = doAppend(&w.rb, w.buf, 0) data = data[m:] n += m // Write out complete prefix, save remainder. // Note that lastBoundary looks back at most 31 runes. i := lastBoundary(&w.rb.f, w.buf) if i == -1 { i = 0 } if i > 0 { if _, err = w.w.Write(w.buf[:i]); err != nil { break } bn := copy(w.buf, w.buf[i:]) w.buf = w.buf[:bn] } } return n, err } // Close forces data that remains in the buffer to be written. func (w *normWriter) Close() error { if len(w.buf) > 0 { _, err := w.w.Write(w.buf) if err != nil { return err } } return nil } // Writer returns a new writer that implements Write(b) // by writing f(b) to w. The returned writer may use an // an internal buffer to maintain state across Write calls. // Calling its Close method writes any buffered data to w. func (f Form) Writer(w io.Writer) io.WriteCloser { wr := &normWriter{rb: reorderBuffer{}, w: w} wr.rb.init(f, nil) return wr } type normReader struct { rb reorderBuffer r io.Reader inbuf []byte outbuf []byte bufStart int lastBoundary int err error } // Read implements the standard read interface. func (r *normReader) Read(p []byte) (int, error) { for { if r.lastBoundary-r.bufStart > 0 { n := copy(p, r.outbuf[r.bufStart:r.lastBoundary]) r.bufStart += n if r.lastBoundary-r.bufStart > 0 { return n, nil } return n, r.err } if r.err != nil { return 0, r.err } outn := copy(r.outbuf, r.outbuf[r.lastBoundary:]) r.outbuf = r.outbuf[0:outn] r.bufStart = 0 n, err := r.r.Read(r.inbuf) r.rb.src = inputBytes(r.inbuf[0:n]) r.rb.nsrc, r.err = n, err if n > 0 { r.outbuf = doAppend(&r.rb, r.outbuf, 0) } if err == io.EOF { r.lastBoundary = len(r.outbuf) } else { r.lastBoundary = lastBoundary(&r.rb.f, r.outbuf) if r.lastBoundary == -1 { r.lastBoundary = 0 } } } } // Reader returns a new reader that implements Read // by reading data from r and returning f(data). func (f Form) Reader(r io.Reader) io.Reader { const chunk = 4000 buf := make([]byte, chunk) rr := &normReader{rb: reorderBuffer{}, r: r, inbuf: buf} rr.rb.init(f, buf) return rr } ================================================ FILE: vendor/golang.org/x/text/unicode/norm/tables10.0.0.go ================================================ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. // +build go1.10 package norm const ( // Version is the Unicode edition from which the tables are derived. Version = "10.0.0" // MaxTransformChunkSize indicates the maximum number of bytes that Transform // may need to write atomically for any Form. Making a destination buffer at // least this size ensures that Transform can always make progress and that // the user does not need to grow the buffer on an ErrShortDst. MaxTransformChunkSize = 35 + maxNonStarters*4 ) var ccc = [55]uint8{ 0, 1, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 84, 91, 103, 107, 118, 122, 129, 130, 132, 202, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 233, 234, 240, } const ( firstMulti = 0x186D firstCCC = 0x2C9E endMulti = 0x2F60 firstLeadingCCC = 0x49AE firstCCCZeroExcept = 0x4A78 firstStarterWithNLead = 0x4A9F lastDecomp = 0x4AA1 maxDecomp = 0x8000 ) // decomps: 19105 bytes var decomps = [...]byte{ // Bytes 0 - 3f 0x00, 0x41, 0x20, 0x41, 0x21, 0x41, 0x22, 0x41, 0x23, 0x41, 0x24, 0x41, 0x25, 0x41, 0x26, 0x41, 0x27, 0x41, 0x28, 0x41, 0x29, 0x41, 0x2A, 0x41, 0x2B, 0x41, 0x2C, 0x41, 0x2D, 0x41, 0x2E, 0x41, 0x2F, 0x41, 0x30, 0x41, 0x31, 0x41, 0x32, 0x41, 0x33, 0x41, 0x34, 0x41, 0x35, 0x41, 0x36, 0x41, 0x37, 0x41, 0x38, 0x41, 0x39, 0x41, 0x3A, 0x41, 0x3B, 0x41, 0x3C, 0x41, 0x3D, 0x41, 0x3E, 0x41, // Bytes 40 - 7f 0x3F, 0x41, 0x40, 0x41, 0x41, 0x41, 0x42, 0x41, 0x43, 0x41, 0x44, 0x41, 0x45, 0x41, 0x46, 0x41, 0x47, 0x41, 0x48, 0x41, 0x49, 0x41, 0x4A, 0x41, 0x4B, 0x41, 0x4C, 0x41, 0x4D, 0x41, 0x4E, 0x41, 0x4F, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41, 0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, 0x57, 0x41, 0x58, 0x41, 0x59, 0x41, 0x5A, 0x41, 0x5B, 0x41, 0x5C, 0x41, 0x5D, 0x41, 0x5E, 0x41, // Bytes 80 - bf 0x5F, 0x41, 0x60, 0x41, 0x61, 0x41, 0x62, 0x41, 0x63, 0x41, 0x64, 0x41, 0x65, 0x41, 0x66, 0x41, 0x67, 0x41, 0x68, 0x41, 0x69, 0x41, 0x6A, 0x41, 0x6B, 0x41, 0x6C, 0x41, 0x6D, 0x41, 0x6E, 0x41, 0x6F, 0x41, 0x70, 0x41, 0x71, 0x41, 0x72, 0x41, 0x73, 0x41, 0x74, 0x41, 0x75, 0x41, 0x76, 0x41, 0x77, 0x41, 0x78, 0x41, 0x79, 0x41, 0x7A, 0x41, 0x7B, 0x41, 0x7C, 0x41, 0x7D, 0x41, 0x7E, 0x42, // Bytes c0 - ff 0xC2, 0xA2, 0x42, 0xC2, 0xA3, 0x42, 0xC2, 0xA5, 0x42, 0xC2, 0xA6, 0x42, 0xC2, 0xAC, 0x42, 0xC2, 0xB7, 0x42, 0xC3, 0x86, 0x42, 0xC3, 0xB0, 0x42, 0xC4, 0xA6, 0x42, 0xC4, 0xA7, 0x42, 0xC4, 0xB1, 0x42, 0xC5, 0x8B, 0x42, 0xC5, 0x93, 0x42, 0xC6, 0x8E, 0x42, 0xC6, 0x90, 0x42, 0xC6, 0xAB, 0x42, 0xC8, 0xA2, 0x42, 0xC8, 0xB7, 0x42, 0xC9, 0x90, 0x42, 0xC9, 0x91, 0x42, 0xC9, 0x92, 0x42, 0xC9, // Bytes 100 - 13f 0x94, 0x42, 0xC9, 0x95, 0x42, 0xC9, 0x99, 0x42, 0xC9, 0x9B, 0x42, 0xC9, 0x9C, 0x42, 0xC9, 0x9F, 0x42, 0xC9, 0xA1, 0x42, 0xC9, 0xA3, 0x42, 0xC9, 0xA5, 0x42, 0xC9, 0xA6, 0x42, 0xC9, 0xA8, 0x42, 0xC9, 0xA9, 0x42, 0xC9, 0xAA, 0x42, 0xC9, 0xAB, 0x42, 0xC9, 0xAD, 0x42, 0xC9, 0xAF, 0x42, 0xC9, 0xB0, 0x42, 0xC9, 0xB1, 0x42, 0xC9, 0xB2, 0x42, 0xC9, 0xB3, 0x42, 0xC9, 0xB4, 0x42, 0xC9, 0xB5, // Bytes 140 - 17f 0x42, 0xC9, 0xB8, 0x42, 0xC9, 0xB9, 0x42, 0xC9, 0xBB, 0x42, 0xCA, 0x81, 0x42, 0xCA, 0x82, 0x42, 0xCA, 0x83, 0x42, 0xCA, 0x89, 0x42, 0xCA, 0x8A, 0x42, 0xCA, 0x8B, 0x42, 0xCA, 0x8C, 0x42, 0xCA, 0x90, 0x42, 0xCA, 0x91, 0x42, 0xCA, 0x92, 0x42, 0xCA, 0x95, 0x42, 0xCA, 0x9D, 0x42, 0xCA, 0x9F, 0x42, 0xCA, 0xB9, 0x42, 0xCE, 0x91, 0x42, 0xCE, 0x92, 0x42, 0xCE, 0x93, 0x42, 0xCE, 0x94, 0x42, // Bytes 180 - 1bf 0xCE, 0x95, 0x42, 0xCE, 0x96, 0x42, 0xCE, 0x97, 0x42, 0xCE, 0x98, 0x42, 0xCE, 0x99, 0x42, 0xCE, 0x9A, 0x42, 0xCE, 0x9B, 0x42, 0xCE, 0x9C, 0x42, 0xCE, 0x9D, 0x42, 0xCE, 0x9E, 0x42, 0xCE, 0x9F, 0x42, 0xCE, 0xA0, 0x42, 0xCE, 0xA1, 0x42, 0xCE, 0xA3, 0x42, 0xCE, 0xA4, 0x42, 0xCE, 0xA5, 0x42, 0xCE, 0xA6, 0x42, 0xCE, 0xA7, 0x42, 0xCE, 0xA8, 0x42, 0xCE, 0xA9, 0x42, 0xCE, 0xB1, 0x42, 0xCE, // Bytes 1c0 - 1ff 0xB2, 0x42, 0xCE, 0xB3, 0x42, 0xCE, 0xB4, 0x42, 0xCE, 0xB5, 0x42, 0xCE, 0xB6, 0x42, 0xCE, 0xB7, 0x42, 0xCE, 0xB8, 0x42, 0xCE, 0xB9, 0x42, 0xCE, 0xBA, 0x42, 0xCE, 0xBB, 0x42, 0xCE, 0xBC, 0x42, 0xCE, 0xBD, 0x42, 0xCE, 0xBE, 0x42, 0xCE, 0xBF, 0x42, 0xCF, 0x80, 0x42, 0xCF, 0x81, 0x42, 0xCF, 0x82, 0x42, 0xCF, 0x83, 0x42, 0xCF, 0x84, 0x42, 0xCF, 0x85, 0x42, 0xCF, 0x86, 0x42, 0xCF, 0x87, // Bytes 200 - 23f 0x42, 0xCF, 0x88, 0x42, 0xCF, 0x89, 0x42, 0xCF, 0x9C, 0x42, 0xCF, 0x9D, 0x42, 0xD0, 0xBD, 0x42, 0xD1, 0x8A, 0x42, 0xD1, 0x8C, 0x42, 0xD7, 0x90, 0x42, 0xD7, 0x91, 0x42, 0xD7, 0x92, 0x42, 0xD7, 0x93, 0x42, 0xD7, 0x94, 0x42, 0xD7, 0x9B, 0x42, 0xD7, 0x9C, 0x42, 0xD7, 0x9D, 0x42, 0xD7, 0xA2, 0x42, 0xD7, 0xA8, 0x42, 0xD7, 0xAA, 0x42, 0xD8, 0xA1, 0x42, 0xD8, 0xA7, 0x42, 0xD8, 0xA8, 0x42, // Bytes 240 - 27f 0xD8, 0xA9, 0x42, 0xD8, 0xAA, 0x42, 0xD8, 0xAB, 0x42, 0xD8, 0xAC, 0x42, 0xD8, 0xAD, 0x42, 0xD8, 0xAE, 0x42, 0xD8, 0xAF, 0x42, 0xD8, 0xB0, 0x42, 0xD8, 0xB1, 0x42, 0xD8, 0xB2, 0x42, 0xD8, 0xB3, 0x42, 0xD8, 0xB4, 0x42, 0xD8, 0xB5, 0x42, 0xD8, 0xB6, 0x42, 0xD8, 0xB7, 0x42, 0xD8, 0xB8, 0x42, 0xD8, 0xB9, 0x42, 0xD8, 0xBA, 0x42, 0xD9, 0x81, 0x42, 0xD9, 0x82, 0x42, 0xD9, 0x83, 0x42, 0xD9, // Bytes 280 - 2bf 0x84, 0x42, 0xD9, 0x85, 0x42, 0xD9, 0x86, 0x42, 0xD9, 0x87, 0x42, 0xD9, 0x88, 0x42, 0xD9, 0x89, 0x42, 0xD9, 0x8A, 0x42, 0xD9, 0xAE, 0x42, 0xD9, 0xAF, 0x42, 0xD9, 0xB1, 0x42, 0xD9, 0xB9, 0x42, 0xD9, 0xBA, 0x42, 0xD9, 0xBB, 0x42, 0xD9, 0xBE, 0x42, 0xD9, 0xBF, 0x42, 0xDA, 0x80, 0x42, 0xDA, 0x83, 0x42, 0xDA, 0x84, 0x42, 0xDA, 0x86, 0x42, 0xDA, 0x87, 0x42, 0xDA, 0x88, 0x42, 0xDA, 0x8C, // Bytes 2c0 - 2ff 0x42, 0xDA, 0x8D, 0x42, 0xDA, 0x8E, 0x42, 0xDA, 0x91, 0x42, 0xDA, 0x98, 0x42, 0xDA, 0xA1, 0x42, 0xDA, 0xA4, 0x42, 0xDA, 0xA6, 0x42, 0xDA, 0xA9, 0x42, 0xDA, 0xAD, 0x42, 0xDA, 0xAF, 0x42, 0xDA, 0xB1, 0x42, 0xDA, 0xB3, 0x42, 0xDA, 0xBA, 0x42, 0xDA, 0xBB, 0x42, 0xDA, 0xBE, 0x42, 0xDB, 0x81, 0x42, 0xDB, 0x85, 0x42, 0xDB, 0x86, 0x42, 0xDB, 0x87, 0x42, 0xDB, 0x88, 0x42, 0xDB, 0x89, 0x42, // Bytes 300 - 33f 0xDB, 0x8B, 0x42, 0xDB, 0x8C, 0x42, 0xDB, 0x90, 0x42, 0xDB, 0x92, 0x43, 0xE0, 0xBC, 0x8B, 0x43, 0xE1, 0x83, 0x9C, 0x43, 0xE1, 0x84, 0x80, 0x43, 0xE1, 0x84, 0x81, 0x43, 0xE1, 0x84, 0x82, 0x43, 0xE1, 0x84, 0x83, 0x43, 0xE1, 0x84, 0x84, 0x43, 0xE1, 0x84, 0x85, 0x43, 0xE1, 0x84, 0x86, 0x43, 0xE1, 0x84, 0x87, 0x43, 0xE1, 0x84, 0x88, 0x43, 0xE1, 0x84, 0x89, 0x43, 0xE1, 0x84, 0x8A, 0x43, // Bytes 340 - 37f 0xE1, 0x84, 0x8B, 0x43, 0xE1, 0x84, 0x8C, 0x43, 0xE1, 0x84, 0x8D, 0x43, 0xE1, 0x84, 0x8E, 0x43, 0xE1, 0x84, 0x8F, 0x43, 0xE1, 0x84, 0x90, 0x43, 0xE1, 0x84, 0x91, 0x43, 0xE1, 0x84, 0x92, 0x43, 0xE1, 0x84, 0x94, 0x43, 0xE1, 0x84, 0x95, 0x43, 0xE1, 0x84, 0x9A, 0x43, 0xE1, 0x84, 0x9C, 0x43, 0xE1, 0x84, 0x9D, 0x43, 0xE1, 0x84, 0x9E, 0x43, 0xE1, 0x84, 0xA0, 0x43, 0xE1, 0x84, 0xA1, 0x43, // Bytes 380 - 3bf 0xE1, 0x84, 0xA2, 0x43, 0xE1, 0x84, 0xA3, 0x43, 0xE1, 0x84, 0xA7, 0x43, 0xE1, 0x84, 0xA9, 0x43, 0xE1, 0x84, 0xAB, 0x43, 0xE1, 0x84, 0xAC, 0x43, 0xE1, 0x84, 0xAD, 0x43, 0xE1, 0x84, 0xAE, 0x43, 0xE1, 0x84, 0xAF, 0x43, 0xE1, 0x84, 0xB2, 0x43, 0xE1, 0x84, 0xB6, 0x43, 0xE1, 0x85, 0x80, 0x43, 0xE1, 0x85, 0x87, 0x43, 0xE1, 0x85, 0x8C, 0x43, 0xE1, 0x85, 0x97, 0x43, 0xE1, 0x85, 0x98, 0x43, // Bytes 3c0 - 3ff 0xE1, 0x85, 0x99, 0x43, 0xE1, 0x85, 0xA0, 0x43, 0xE1, 0x86, 0x84, 0x43, 0xE1, 0x86, 0x85, 0x43, 0xE1, 0x86, 0x88, 0x43, 0xE1, 0x86, 0x91, 0x43, 0xE1, 0x86, 0x92, 0x43, 0xE1, 0x86, 0x94, 0x43, 0xE1, 0x86, 0x9E, 0x43, 0xE1, 0x86, 0xA1, 0x43, 0xE1, 0x87, 0x87, 0x43, 0xE1, 0x87, 0x88, 0x43, 0xE1, 0x87, 0x8C, 0x43, 0xE1, 0x87, 0x8E, 0x43, 0xE1, 0x87, 0x93, 0x43, 0xE1, 0x87, 0x97, 0x43, // Bytes 400 - 43f 0xE1, 0x87, 0x99, 0x43, 0xE1, 0x87, 0x9D, 0x43, 0xE1, 0x87, 0x9F, 0x43, 0xE1, 0x87, 0xB1, 0x43, 0xE1, 0x87, 0xB2, 0x43, 0xE1, 0xB4, 0x82, 0x43, 0xE1, 0xB4, 0x96, 0x43, 0xE1, 0xB4, 0x97, 0x43, 0xE1, 0xB4, 0x9C, 0x43, 0xE1, 0xB4, 0x9D, 0x43, 0xE1, 0xB4, 0xA5, 0x43, 0xE1, 0xB5, 0xBB, 0x43, 0xE1, 0xB6, 0x85, 0x43, 0xE2, 0x80, 0x82, 0x43, 0xE2, 0x80, 0x83, 0x43, 0xE2, 0x80, 0x90, 0x43, // Bytes 440 - 47f 0xE2, 0x80, 0x93, 0x43, 0xE2, 0x80, 0x94, 0x43, 0xE2, 0x82, 0xA9, 0x43, 0xE2, 0x86, 0x90, 0x43, 0xE2, 0x86, 0x91, 0x43, 0xE2, 0x86, 0x92, 0x43, 0xE2, 0x86, 0x93, 0x43, 0xE2, 0x88, 0x82, 0x43, 0xE2, 0x88, 0x87, 0x43, 0xE2, 0x88, 0x91, 0x43, 0xE2, 0x88, 0x92, 0x43, 0xE2, 0x94, 0x82, 0x43, 0xE2, 0x96, 0xA0, 0x43, 0xE2, 0x97, 0x8B, 0x43, 0xE2, 0xA6, 0x85, 0x43, 0xE2, 0xA6, 0x86, 0x43, // Bytes 480 - 4bf 0xE2, 0xB5, 0xA1, 0x43, 0xE3, 0x80, 0x81, 0x43, 0xE3, 0x80, 0x82, 0x43, 0xE3, 0x80, 0x88, 0x43, 0xE3, 0x80, 0x89, 0x43, 0xE3, 0x80, 0x8A, 0x43, 0xE3, 0x80, 0x8B, 0x43, 0xE3, 0x80, 0x8C, 0x43, 0xE3, 0x80, 0x8D, 0x43, 0xE3, 0x80, 0x8E, 0x43, 0xE3, 0x80, 0x8F, 0x43, 0xE3, 0x80, 0x90, 0x43, 0xE3, 0x80, 0x91, 0x43, 0xE3, 0x80, 0x92, 0x43, 0xE3, 0x80, 0x94, 0x43, 0xE3, 0x80, 0x95, 0x43, // Bytes 4c0 - 4ff 0xE3, 0x80, 0x96, 0x43, 0xE3, 0x80, 0x97, 0x43, 0xE3, 0x82, 0xA1, 0x43, 0xE3, 0x82, 0xA2, 0x43, 0xE3, 0x82, 0xA3, 0x43, 0xE3, 0x82, 0xA4, 0x43, 0xE3, 0x82, 0xA5, 0x43, 0xE3, 0x82, 0xA6, 0x43, 0xE3, 0x82, 0xA7, 0x43, 0xE3, 0x82, 0xA8, 0x43, 0xE3, 0x82, 0xA9, 0x43, 0xE3, 0x82, 0xAA, 0x43, 0xE3, 0x82, 0xAB, 0x43, 0xE3, 0x82, 0xAD, 0x43, 0xE3, 0x82, 0xAF, 0x43, 0xE3, 0x82, 0xB1, 0x43, // Bytes 500 - 53f 0xE3, 0x82, 0xB3, 0x43, 0xE3, 0x82, 0xB5, 0x43, 0xE3, 0x82, 0xB7, 0x43, 0xE3, 0x82, 0xB9, 0x43, 0xE3, 0x82, 0xBB, 0x43, 0xE3, 0x82, 0xBD, 0x43, 0xE3, 0x82, 0xBF, 0x43, 0xE3, 0x83, 0x81, 0x43, 0xE3, 0x83, 0x83, 0x43, 0xE3, 0x83, 0x84, 0x43, 0xE3, 0x83, 0x86, 0x43, 0xE3, 0x83, 0x88, 0x43, 0xE3, 0x83, 0x8A, 0x43, 0xE3, 0x83, 0x8B, 0x43, 0xE3, 0x83, 0x8C, 0x43, 0xE3, 0x83, 0x8D, 0x43, // Bytes 540 - 57f 0xE3, 0x83, 0x8E, 0x43, 0xE3, 0x83, 0x8F, 0x43, 0xE3, 0x83, 0x92, 0x43, 0xE3, 0x83, 0x95, 0x43, 0xE3, 0x83, 0x98, 0x43, 0xE3, 0x83, 0x9B, 0x43, 0xE3, 0x83, 0x9E, 0x43, 0xE3, 0x83, 0x9F, 0x43, 0xE3, 0x83, 0xA0, 0x43, 0xE3, 0x83, 0xA1, 0x43, 0xE3, 0x83, 0xA2, 0x43, 0xE3, 0x83, 0xA3, 0x43, 0xE3, 0x83, 0xA4, 0x43, 0xE3, 0x83, 0xA5, 0x43, 0xE3, 0x83, 0xA6, 0x43, 0xE3, 0x83, 0xA7, 0x43, // Bytes 580 - 5bf 0xE3, 0x83, 0xA8, 0x43, 0xE3, 0x83, 0xA9, 0x43, 0xE3, 0x83, 0xAA, 0x43, 0xE3, 0x83, 0xAB, 0x43, 0xE3, 0x83, 0xAC, 0x43, 0xE3, 0x83, 0xAD, 0x43, 0xE3, 0x83, 0xAF, 0x43, 0xE3, 0x83, 0xB0, 0x43, 0xE3, 0x83, 0xB1, 0x43, 0xE3, 0x83, 0xB2, 0x43, 0xE3, 0x83, 0xB3, 0x43, 0xE3, 0x83, 0xBB, 0x43, 0xE3, 0x83, 0xBC, 0x43, 0xE3, 0x92, 0x9E, 0x43, 0xE3, 0x92, 0xB9, 0x43, 0xE3, 0x92, 0xBB, 0x43, // Bytes 5c0 - 5ff 0xE3, 0x93, 0x9F, 0x43, 0xE3, 0x94, 0x95, 0x43, 0xE3, 0x9B, 0xAE, 0x43, 0xE3, 0x9B, 0xBC, 0x43, 0xE3, 0x9E, 0x81, 0x43, 0xE3, 0xA0, 0xAF, 0x43, 0xE3, 0xA1, 0xA2, 0x43, 0xE3, 0xA1, 0xBC, 0x43, 0xE3, 0xA3, 0x87, 0x43, 0xE3, 0xA3, 0xA3, 0x43, 0xE3, 0xA4, 0x9C, 0x43, 0xE3, 0xA4, 0xBA, 0x43, 0xE3, 0xA8, 0xAE, 0x43, 0xE3, 0xA9, 0xAC, 0x43, 0xE3, 0xAB, 0xA4, 0x43, 0xE3, 0xAC, 0x88, 0x43, // Bytes 600 - 63f 0xE3, 0xAC, 0x99, 0x43, 0xE3, 0xAD, 0x89, 0x43, 0xE3, 0xAE, 0x9D, 0x43, 0xE3, 0xB0, 0x98, 0x43, 0xE3, 0xB1, 0x8E, 0x43, 0xE3, 0xB4, 0xB3, 0x43, 0xE3, 0xB6, 0x96, 0x43, 0xE3, 0xBA, 0xAC, 0x43, 0xE3, 0xBA, 0xB8, 0x43, 0xE3, 0xBC, 0x9B, 0x43, 0xE3, 0xBF, 0xBC, 0x43, 0xE4, 0x80, 0x88, 0x43, 0xE4, 0x80, 0x98, 0x43, 0xE4, 0x80, 0xB9, 0x43, 0xE4, 0x81, 0x86, 0x43, 0xE4, 0x82, 0x96, 0x43, // Bytes 640 - 67f 0xE4, 0x83, 0xA3, 0x43, 0xE4, 0x84, 0xAF, 0x43, 0xE4, 0x88, 0x82, 0x43, 0xE4, 0x88, 0xA7, 0x43, 0xE4, 0x8A, 0xA0, 0x43, 0xE4, 0x8C, 0x81, 0x43, 0xE4, 0x8C, 0xB4, 0x43, 0xE4, 0x8D, 0x99, 0x43, 0xE4, 0x8F, 0x95, 0x43, 0xE4, 0x8F, 0x99, 0x43, 0xE4, 0x90, 0x8B, 0x43, 0xE4, 0x91, 0xAB, 0x43, 0xE4, 0x94, 0xAB, 0x43, 0xE4, 0x95, 0x9D, 0x43, 0xE4, 0x95, 0xA1, 0x43, 0xE4, 0x95, 0xAB, 0x43, // Bytes 680 - 6bf 0xE4, 0x97, 0x97, 0x43, 0xE4, 0x97, 0xB9, 0x43, 0xE4, 0x98, 0xB5, 0x43, 0xE4, 0x9A, 0xBE, 0x43, 0xE4, 0x9B, 0x87, 0x43, 0xE4, 0xA6, 0x95, 0x43, 0xE4, 0xA7, 0xA6, 0x43, 0xE4, 0xA9, 0xAE, 0x43, 0xE4, 0xA9, 0xB6, 0x43, 0xE4, 0xAA, 0xB2, 0x43, 0xE4, 0xAC, 0xB3, 0x43, 0xE4, 0xAF, 0x8E, 0x43, 0xE4, 0xB3, 0x8E, 0x43, 0xE4, 0xB3, 0xAD, 0x43, 0xE4, 0xB3, 0xB8, 0x43, 0xE4, 0xB5, 0x96, 0x43, // Bytes 6c0 - 6ff 0xE4, 0xB8, 0x80, 0x43, 0xE4, 0xB8, 0x81, 0x43, 0xE4, 0xB8, 0x83, 0x43, 0xE4, 0xB8, 0x89, 0x43, 0xE4, 0xB8, 0x8A, 0x43, 0xE4, 0xB8, 0x8B, 0x43, 0xE4, 0xB8, 0x8D, 0x43, 0xE4, 0xB8, 0x99, 0x43, 0xE4, 0xB8, 0xA6, 0x43, 0xE4, 0xB8, 0xA8, 0x43, 0xE4, 0xB8, 0xAD, 0x43, 0xE4, 0xB8, 0xB2, 0x43, 0xE4, 0xB8, 0xB6, 0x43, 0xE4, 0xB8, 0xB8, 0x43, 0xE4, 0xB8, 0xB9, 0x43, 0xE4, 0xB8, 0xBD, 0x43, // Bytes 700 - 73f 0xE4, 0xB8, 0xBF, 0x43, 0xE4, 0xB9, 0x81, 0x43, 0xE4, 0xB9, 0x99, 0x43, 0xE4, 0xB9, 0x9D, 0x43, 0xE4, 0xBA, 0x82, 0x43, 0xE4, 0xBA, 0x85, 0x43, 0xE4, 0xBA, 0x86, 0x43, 0xE4, 0xBA, 0x8C, 0x43, 0xE4, 0xBA, 0x94, 0x43, 0xE4, 0xBA, 0xA0, 0x43, 0xE4, 0xBA, 0xA4, 0x43, 0xE4, 0xBA, 0xAE, 0x43, 0xE4, 0xBA, 0xBA, 0x43, 0xE4, 0xBB, 0x80, 0x43, 0xE4, 0xBB, 0x8C, 0x43, 0xE4, 0xBB, 0xA4, 0x43, // Bytes 740 - 77f 0xE4, 0xBC, 0x81, 0x43, 0xE4, 0xBC, 0x91, 0x43, 0xE4, 0xBD, 0xA0, 0x43, 0xE4, 0xBE, 0x80, 0x43, 0xE4, 0xBE, 0x86, 0x43, 0xE4, 0xBE, 0x8B, 0x43, 0xE4, 0xBE, 0xAE, 0x43, 0xE4, 0xBE, 0xBB, 0x43, 0xE4, 0xBE, 0xBF, 0x43, 0xE5, 0x80, 0x82, 0x43, 0xE5, 0x80, 0xAB, 0x43, 0xE5, 0x81, 0xBA, 0x43, 0xE5, 0x82, 0x99, 0x43, 0xE5, 0x83, 0x8F, 0x43, 0xE5, 0x83, 0x9A, 0x43, 0xE5, 0x83, 0xA7, 0x43, // Bytes 780 - 7bf 0xE5, 0x84, 0xAA, 0x43, 0xE5, 0x84, 0xBF, 0x43, 0xE5, 0x85, 0x80, 0x43, 0xE5, 0x85, 0x85, 0x43, 0xE5, 0x85, 0x8D, 0x43, 0xE5, 0x85, 0x94, 0x43, 0xE5, 0x85, 0xA4, 0x43, 0xE5, 0x85, 0xA5, 0x43, 0xE5, 0x85, 0xA7, 0x43, 0xE5, 0x85, 0xA8, 0x43, 0xE5, 0x85, 0xA9, 0x43, 0xE5, 0x85, 0xAB, 0x43, 0xE5, 0x85, 0xAD, 0x43, 0xE5, 0x85, 0xB7, 0x43, 0xE5, 0x86, 0x80, 0x43, 0xE5, 0x86, 0x82, 0x43, // Bytes 7c0 - 7ff 0xE5, 0x86, 0x8D, 0x43, 0xE5, 0x86, 0x92, 0x43, 0xE5, 0x86, 0x95, 0x43, 0xE5, 0x86, 0x96, 0x43, 0xE5, 0x86, 0x97, 0x43, 0xE5, 0x86, 0x99, 0x43, 0xE5, 0x86, 0xA4, 0x43, 0xE5, 0x86, 0xAB, 0x43, 0xE5, 0x86, 0xAC, 0x43, 0xE5, 0x86, 0xB5, 0x43, 0xE5, 0x86, 0xB7, 0x43, 0xE5, 0x87, 0x89, 0x43, 0xE5, 0x87, 0x8C, 0x43, 0xE5, 0x87, 0x9C, 0x43, 0xE5, 0x87, 0x9E, 0x43, 0xE5, 0x87, 0xA0, 0x43, // Bytes 800 - 83f 0xE5, 0x87, 0xB5, 0x43, 0xE5, 0x88, 0x80, 0x43, 0xE5, 0x88, 0x83, 0x43, 0xE5, 0x88, 0x87, 0x43, 0xE5, 0x88, 0x97, 0x43, 0xE5, 0x88, 0x9D, 0x43, 0xE5, 0x88, 0xA9, 0x43, 0xE5, 0x88, 0xBA, 0x43, 0xE5, 0x88, 0xBB, 0x43, 0xE5, 0x89, 0x86, 0x43, 0xE5, 0x89, 0x8D, 0x43, 0xE5, 0x89, 0xB2, 0x43, 0xE5, 0x89, 0xB7, 0x43, 0xE5, 0x8A, 0x89, 0x43, 0xE5, 0x8A, 0x9B, 0x43, 0xE5, 0x8A, 0xA3, 0x43, // Bytes 840 - 87f 0xE5, 0x8A, 0xB3, 0x43, 0xE5, 0x8A, 0xB4, 0x43, 0xE5, 0x8B, 0x87, 0x43, 0xE5, 0x8B, 0x89, 0x43, 0xE5, 0x8B, 0x92, 0x43, 0xE5, 0x8B, 0x9E, 0x43, 0xE5, 0x8B, 0xA4, 0x43, 0xE5, 0x8B, 0xB5, 0x43, 0xE5, 0x8B, 0xB9, 0x43, 0xE5, 0x8B, 0xBA, 0x43, 0xE5, 0x8C, 0x85, 0x43, 0xE5, 0x8C, 0x86, 0x43, 0xE5, 0x8C, 0x95, 0x43, 0xE5, 0x8C, 0x97, 0x43, 0xE5, 0x8C, 0x9A, 0x43, 0xE5, 0x8C, 0xB8, 0x43, // Bytes 880 - 8bf 0xE5, 0x8C, 0xBB, 0x43, 0xE5, 0x8C, 0xBF, 0x43, 0xE5, 0x8D, 0x81, 0x43, 0xE5, 0x8D, 0x84, 0x43, 0xE5, 0x8D, 0x85, 0x43, 0xE5, 0x8D, 0x89, 0x43, 0xE5, 0x8D, 0x91, 0x43, 0xE5, 0x8D, 0x94, 0x43, 0xE5, 0x8D, 0x9A, 0x43, 0xE5, 0x8D, 0x9C, 0x43, 0xE5, 0x8D, 0xA9, 0x43, 0xE5, 0x8D, 0xB0, 0x43, 0xE5, 0x8D, 0xB3, 0x43, 0xE5, 0x8D, 0xB5, 0x43, 0xE5, 0x8D, 0xBD, 0x43, 0xE5, 0x8D, 0xBF, 0x43, // Bytes 8c0 - 8ff 0xE5, 0x8E, 0x82, 0x43, 0xE5, 0x8E, 0xB6, 0x43, 0xE5, 0x8F, 0x83, 0x43, 0xE5, 0x8F, 0x88, 0x43, 0xE5, 0x8F, 0x8A, 0x43, 0xE5, 0x8F, 0x8C, 0x43, 0xE5, 0x8F, 0x9F, 0x43, 0xE5, 0x8F, 0xA3, 0x43, 0xE5, 0x8F, 0xA5, 0x43, 0xE5, 0x8F, 0xAB, 0x43, 0xE5, 0x8F, 0xAF, 0x43, 0xE5, 0x8F, 0xB1, 0x43, 0xE5, 0x8F, 0xB3, 0x43, 0xE5, 0x90, 0x86, 0x43, 0xE5, 0x90, 0x88, 0x43, 0xE5, 0x90, 0x8D, 0x43, // Bytes 900 - 93f 0xE5, 0x90, 0x8F, 0x43, 0xE5, 0x90, 0x9D, 0x43, 0xE5, 0x90, 0xB8, 0x43, 0xE5, 0x90, 0xB9, 0x43, 0xE5, 0x91, 0x82, 0x43, 0xE5, 0x91, 0x88, 0x43, 0xE5, 0x91, 0xA8, 0x43, 0xE5, 0x92, 0x9E, 0x43, 0xE5, 0x92, 0xA2, 0x43, 0xE5, 0x92, 0xBD, 0x43, 0xE5, 0x93, 0xB6, 0x43, 0xE5, 0x94, 0x90, 0x43, 0xE5, 0x95, 0x8F, 0x43, 0xE5, 0x95, 0x93, 0x43, 0xE5, 0x95, 0x95, 0x43, 0xE5, 0x95, 0xA3, 0x43, // Bytes 940 - 97f 0xE5, 0x96, 0x84, 0x43, 0xE5, 0x96, 0x87, 0x43, 0xE5, 0x96, 0x99, 0x43, 0xE5, 0x96, 0x9D, 0x43, 0xE5, 0x96, 0xAB, 0x43, 0xE5, 0x96, 0xB3, 0x43, 0xE5, 0x96, 0xB6, 0x43, 0xE5, 0x97, 0x80, 0x43, 0xE5, 0x97, 0x82, 0x43, 0xE5, 0x97, 0xA2, 0x43, 0xE5, 0x98, 0x86, 0x43, 0xE5, 0x99, 0x91, 0x43, 0xE5, 0x99, 0xA8, 0x43, 0xE5, 0x99, 0xB4, 0x43, 0xE5, 0x9B, 0x97, 0x43, 0xE5, 0x9B, 0x9B, 0x43, // Bytes 980 - 9bf 0xE5, 0x9B, 0xB9, 0x43, 0xE5, 0x9C, 0x96, 0x43, 0xE5, 0x9C, 0x97, 0x43, 0xE5, 0x9C, 0x9F, 0x43, 0xE5, 0x9C, 0xB0, 0x43, 0xE5, 0x9E, 0x8B, 0x43, 0xE5, 0x9F, 0x8E, 0x43, 0xE5, 0x9F, 0xB4, 0x43, 0xE5, 0xA0, 0x8D, 0x43, 0xE5, 0xA0, 0xB1, 0x43, 0xE5, 0xA0, 0xB2, 0x43, 0xE5, 0xA1, 0x80, 0x43, 0xE5, 0xA1, 0x9A, 0x43, 0xE5, 0xA1, 0x9E, 0x43, 0xE5, 0xA2, 0xA8, 0x43, 0xE5, 0xA2, 0xAC, 0x43, // Bytes 9c0 - 9ff 0xE5, 0xA2, 0xB3, 0x43, 0xE5, 0xA3, 0x98, 0x43, 0xE5, 0xA3, 0x9F, 0x43, 0xE5, 0xA3, 0xAB, 0x43, 0xE5, 0xA3, 0xAE, 0x43, 0xE5, 0xA3, 0xB0, 0x43, 0xE5, 0xA3, 0xB2, 0x43, 0xE5, 0xA3, 0xB7, 0x43, 0xE5, 0xA4, 0x82, 0x43, 0xE5, 0xA4, 0x86, 0x43, 0xE5, 0xA4, 0x8A, 0x43, 0xE5, 0xA4, 0x95, 0x43, 0xE5, 0xA4, 0x9A, 0x43, 0xE5, 0xA4, 0x9C, 0x43, 0xE5, 0xA4, 0xA2, 0x43, 0xE5, 0xA4, 0xA7, 0x43, // Bytes a00 - a3f 0xE5, 0xA4, 0xA9, 0x43, 0xE5, 0xA5, 0x84, 0x43, 0xE5, 0xA5, 0x88, 0x43, 0xE5, 0xA5, 0x91, 0x43, 0xE5, 0xA5, 0x94, 0x43, 0xE5, 0xA5, 0xA2, 0x43, 0xE5, 0xA5, 0xB3, 0x43, 0xE5, 0xA7, 0x98, 0x43, 0xE5, 0xA7, 0xAC, 0x43, 0xE5, 0xA8, 0x9B, 0x43, 0xE5, 0xA8, 0xA7, 0x43, 0xE5, 0xA9, 0xA2, 0x43, 0xE5, 0xA9, 0xA6, 0x43, 0xE5, 0xAA, 0xB5, 0x43, 0xE5, 0xAC, 0x88, 0x43, 0xE5, 0xAC, 0xA8, 0x43, // Bytes a40 - a7f 0xE5, 0xAC, 0xBE, 0x43, 0xE5, 0xAD, 0x90, 0x43, 0xE5, 0xAD, 0x97, 0x43, 0xE5, 0xAD, 0xA6, 0x43, 0xE5, 0xAE, 0x80, 0x43, 0xE5, 0xAE, 0x85, 0x43, 0xE5, 0xAE, 0x97, 0x43, 0xE5, 0xAF, 0x83, 0x43, 0xE5, 0xAF, 0x98, 0x43, 0xE5, 0xAF, 0xA7, 0x43, 0xE5, 0xAF, 0xAE, 0x43, 0xE5, 0xAF, 0xB3, 0x43, 0xE5, 0xAF, 0xB8, 0x43, 0xE5, 0xAF, 0xBF, 0x43, 0xE5, 0xB0, 0x86, 0x43, 0xE5, 0xB0, 0x8F, 0x43, // Bytes a80 - abf 0xE5, 0xB0, 0xA2, 0x43, 0xE5, 0xB0, 0xB8, 0x43, 0xE5, 0xB0, 0xBF, 0x43, 0xE5, 0xB1, 0xA0, 0x43, 0xE5, 0xB1, 0xA2, 0x43, 0xE5, 0xB1, 0xA4, 0x43, 0xE5, 0xB1, 0xA5, 0x43, 0xE5, 0xB1, 0xAE, 0x43, 0xE5, 0xB1, 0xB1, 0x43, 0xE5, 0xB2, 0x8D, 0x43, 0xE5, 0xB3, 0x80, 0x43, 0xE5, 0xB4, 0x99, 0x43, 0xE5, 0xB5, 0x83, 0x43, 0xE5, 0xB5, 0x90, 0x43, 0xE5, 0xB5, 0xAB, 0x43, 0xE5, 0xB5, 0xAE, 0x43, // Bytes ac0 - aff 0xE5, 0xB5, 0xBC, 0x43, 0xE5, 0xB6, 0xB2, 0x43, 0xE5, 0xB6, 0xBA, 0x43, 0xE5, 0xB7, 0x9B, 0x43, 0xE5, 0xB7, 0xA1, 0x43, 0xE5, 0xB7, 0xA2, 0x43, 0xE5, 0xB7, 0xA5, 0x43, 0xE5, 0xB7, 0xA6, 0x43, 0xE5, 0xB7, 0xB1, 0x43, 0xE5, 0xB7, 0xBD, 0x43, 0xE5, 0xB7, 0xBE, 0x43, 0xE5, 0xB8, 0xA8, 0x43, 0xE5, 0xB8, 0xBD, 0x43, 0xE5, 0xB9, 0xA9, 0x43, 0xE5, 0xB9, 0xB2, 0x43, 0xE5, 0xB9, 0xB4, 0x43, // Bytes b00 - b3f 0xE5, 0xB9, 0xBA, 0x43, 0xE5, 0xB9, 0xBC, 0x43, 0xE5, 0xB9, 0xBF, 0x43, 0xE5, 0xBA, 0xA6, 0x43, 0xE5, 0xBA, 0xB0, 0x43, 0xE5, 0xBA, 0xB3, 0x43, 0xE5, 0xBA, 0xB6, 0x43, 0xE5, 0xBB, 0x89, 0x43, 0xE5, 0xBB, 0x8A, 0x43, 0xE5, 0xBB, 0x92, 0x43, 0xE5, 0xBB, 0x93, 0x43, 0xE5, 0xBB, 0x99, 0x43, 0xE5, 0xBB, 0xAC, 0x43, 0xE5, 0xBB, 0xB4, 0x43, 0xE5, 0xBB, 0xBE, 0x43, 0xE5, 0xBC, 0x84, 0x43, // Bytes b40 - b7f 0xE5, 0xBC, 0x8B, 0x43, 0xE5, 0xBC, 0x93, 0x43, 0xE5, 0xBC, 0xA2, 0x43, 0xE5, 0xBD, 0x90, 0x43, 0xE5, 0xBD, 0x93, 0x43, 0xE5, 0xBD, 0xA1, 0x43, 0xE5, 0xBD, 0xA2, 0x43, 0xE5, 0xBD, 0xA9, 0x43, 0xE5, 0xBD, 0xAB, 0x43, 0xE5, 0xBD, 0xB3, 0x43, 0xE5, 0xBE, 0x8B, 0x43, 0xE5, 0xBE, 0x8C, 0x43, 0xE5, 0xBE, 0x97, 0x43, 0xE5, 0xBE, 0x9A, 0x43, 0xE5, 0xBE, 0xA9, 0x43, 0xE5, 0xBE, 0xAD, 0x43, // Bytes b80 - bbf 0xE5, 0xBF, 0x83, 0x43, 0xE5, 0xBF, 0x8D, 0x43, 0xE5, 0xBF, 0x97, 0x43, 0xE5, 0xBF, 0xB5, 0x43, 0xE5, 0xBF, 0xB9, 0x43, 0xE6, 0x80, 0x92, 0x43, 0xE6, 0x80, 0x9C, 0x43, 0xE6, 0x81, 0xB5, 0x43, 0xE6, 0x82, 0x81, 0x43, 0xE6, 0x82, 0x94, 0x43, 0xE6, 0x83, 0x87, 0x43, 0xE6, 0x83, 0x98, 0x43, 0xE6, 0x83, 0xA1, 0x43, 0xE6, 0x84, 0x88, 0x43, 0xE6, 0x85, 0x84, 0x43, 0xE6, 0x85, 0x88, 0x43, // Bytes bc0 - bff 0xE6, 0x85, 0x8C, 0x43, 0xE6, 0x85, 0x8E, 0x43, 0xE6, 0x85, 0xA0, 0x43, 0xE6, 0x85, 0xA8, 0x43, 0xE6, 0x85, 0xBA, 0x43, 0xE6, 0x86, 0x8E, 0x43, 0xE6, 0x86, 0x90, 0x43, 0xE6, 0x86, 0xA4, 0x43, 0xE6, 0x86, 0xAF, 0x43, 0xE6, 0x86, 0xB2, 0x43, 0xE6, 0x87, 0x9E, 0x43, 0xE6, 0x87, 0xB2, 0x43, 0xE6, 0x87, 0xB6, 0x43, 0xE6, 0x88, 0x80, 0x43, 0xE6, 0x88, 0x88, 0x43, 0xE6, 0x88, 0x90, 0x43, // Bytes c00 - c3f 0xE6, 0x88, 0x9B, 0x43, 0xE6, 0x88, 0xAE, 0x43, 0xE6, 0x88, 0xB4, 0x43, 0xE6, 0x88, 0xB6, 0x43, 0xE6, 0x89, 0x8B, 0x43, 0xE6, 0x89, 0x93, 0x43, 0xE6, 0x89, 0x9D, 0x43, 0xE6, 0x8A, 0x95, 0x43, 0xE6, 0x8A, 0xB1, 0x43, 0xE6, 0x8B, 0x89, 0x43, 0xE6, 0x8B, 0x8F, 0x43, 0xE6, 0x8B, 0x93, 0x43, 0xE6, 0x8B, 0x94, 0x43, 0xE6, 0x8B, 0xBC, 0x43, 0xE6, 0x8B, 0xBE, 0x43, 0xE6, 0x8C, 0x87, 0x43, // Bytes c40 - c7f 0xE6, 0x8C, 0xBD, 0x43, 0xE6, 0x8D, 0x90, 0x43, 0xE6, 0x8D, 0x95, 0x43, 0xE6, 0x8D, 0xA8, 0x43, 0xE6, 0x8D, 0xBB, 0x43, 0xE6, 0x8E, 0x83, 0x43, 0xE6, 0x8E, 0xA0, 0x43, 0xE6, 0x8E, 0xA9, 0x43, 0xE6, 0x8F, 0x84, 0x43, 0xE6, 0x8F, 0x85, 0x43, 0xE6, 0x8F, 0xA4, 0x43, 0xE6, 0x90, 0x9C, 0x43, 0xE6, 0x90, 0xA2, 0x43, 0xE6, 0x91, 0x92, 0x43, 0xE6, 0x91, 0xA9, 0x43, 0xE6, 0x91, 0xB7, 0x43, // Bytes c80 - cbf 0xE6, 0x91, 0xBE, 0x43, 0xE6, 0x92, 0x9A, 0x43, 0xE6, 0x92, 0x9D, 0x43, 0xE6, 0x93, 0x84, 0x43, 0xE6, 0x94, 0xAF, 0x43, 0xE6, 0x94, 0xB4, 0x43, 0xE6, 0x95, 0x8F, 0x43, 0xE6, 0x95, 0x96, 0x43, 0xE6, 0x95, 0xAC, 0x43, 0xE6, 0x95, 0xB8, 0x43, 0xE6, 0x96, 0x87, 0x43, 0xE6, 0x96, 0x97, 0x43, 0xE6, 0x96, 0x99, 0x43, 0xE6, 0x96, 0xA4, 0x43, 0xE6, 0x96, 0xB0, 0x43, 0xE6, 0x96, 0xB9, 0x43, // Bytes cc0 - cff 0xE6, 0x97, 0x85, 0x43, 0xE6, 0x97, 0xA0, 0x43, 0xE6, 0x97, 0xA2, 0x43, 0xE6, 0x97, 0xA3, 0x43, 0xE6, 0x97, 0xA5, 0x43, 0xE6, 0x98, 0x93, 0x43, 0xE6, 0x98, 0xA0, 0x43, 0xE6, 0x99, 0x89, 0x43, 0xE6, 0x99, 0xB4, 0x43, 0xE6, 0x9A, 0x88, 0x43, 0xE6, 0x9A, 0x91, 0x43, 0xE6, 0x9A, 0x9C, 0x43, 0xE6, 0x9A, 0xB4, 0x43, 0xE6, 0x9B, 0x86, 0x43, 0xE6, 0x9B, 0xB0, 0x43, 0xE6, 0x9B, 0xB4, 0x43, // Bytes d00 - d3f 0xE6, 0x9B, 0xB8, 0x43, 0xE6, 0x9C, 0x80, 0x43, 0xE6, 0x9C, 0x88, 0x43, 0xE6, 0x9C, 0x89, 0x43, 0xE6, 0x9C, 0x97, 0x43, 0xE6, 0x9C, 0x9B, 0x43, 0xE6, 0x9C, 0xA1, 0x43, 0xE6, 0x9C, 0xA8, 0x43, 0xE6, 0x9D, 0x8E, 0x43, 0xE6, 0x9D, 0x93, 0x43, 0xE6, 0x9D, 0x96, 0x43, 0xE6, 0x9D, 0x9E, 0x43, 0xE6, 0x9D, 0xBB, 0x43, 0xE6, 0x9E, 0x85, 0x43, 0xE6, 0x9E, 0x97, 0x43, 0xE6, 0x9F, 0xB3, 0x43, // Bytes d40 - d7f 0xE6, 0x9F, 0xBA, 0x43, 0xE6, 0xA0, 0x97, 0x43, 0xE6, 0xA0, 0x9F, 0x43, 0xE6, 0xA0, 0xAA, 0x43, 0xE6, 0xA1, 0x92, 0x43, 0xE6, 0xA2, 0x81, 0x43, 0xE6, 0xA2, 0x85, 0x43, 0xE6, 0xA2, 0x8E, 0x43, 0xE6, 0xA2, 0xA8, 0x43, 0xE6, 0xA4, 0x94, 0x43, 0xE6, 0xA5, 0x82, 0x43, 0xE6, 0xA6, 0xA3, 0x43, 0xE6, 0xA7, 0xAA, 0x43, 0xE6, 0xA8, 0x82, 0x43, 0xE6, 0xA8, 0x93, 0x43, 0xE6, 0xAA, 0xA8, 0x43, // Bytes d80 - dbf 0xE6, 0xAB, 0x93, 0x43, 0xE6, 0xAB, 0x9B, 0x43, 0xE6, 0xAC, 0x84, 0x43, 0xE6, 0xAC, 0xA0, 0x43, 0xE6, 0xAC, 0xA1, 0x43, 0xE6, 0xAD, 0x94, 0x43, 0xE6, 0xAD, 0xA2, 0x43, 0xE6, 0xAD, 0xA3, 0x43, 0xE6, 0xAD, 0xB2, 0x43, 0xE6, 0xAD, 0xB7, 0x43, 0xE6, 0xAD, 0xB9, 0x43, 0xE6, 0xAE, 0x9F, 0x43, 0xE6, 0xAE, 0xAE, 0x43, 0xE6, 0xAE, 0xB3, 0x43, 0xE6, 0xAE, 0xBA, 0x43, 0xE6, 0xAE, 0xBB, 0x43, // Bytes dc0 - dff 0xE6, 0xAF, 0x8B, 0x43, 0xE6, 0xAF, 0x8D, 0x43, 0xE6, 0xAF, 0x94, 0x43, 0xE6, 0xAF, 0x9B, 0x43, 0xE6, 0xB0, 0x8F, 0x43, 0xE6, 0xB0, 0x94, 0x43, 0xE6, 0xB0, 0xB4, 0x43, 0xE6, 0xB1, 0x8E, 0x43, 0xE6, 0xB1, 0xA7, 0x43, 0xE6, 0xB2, 0x88, 0x43, 0xE6, 0xB2, 0xBF, 0x43, 0xE6, 0xB3, 0x8C, 0x43, 0xE6, 0xB3, 0x8D, 0x43, 0xE6, 0xB3, 0xA5, 0x43, 0xE6, 0xB3, 0xA8, 0x43, 0xE6, 0xB4, 0x96, 0x43, // Bytes e00 - e3f 0xE6, 0xB4, 0x9B, 0x43, 0xE6, 0xB4, 0x9E, 0x43, 0xE6, 0xB4, 0xB4, 0x43, 0xE6, 0xB4, 0xBE, 0x43, 0xE6, 0xB5, 0x81, 0x43, 0xE6, 0xB5, 0xA9, 0x43, 0xE6, 0xB5, 0xAA, 0x43, 0xE6, 0xB5, 0xB7, 0x43, 0xE6, 0xB5, 0xB8, 0x43, 0xE6, 0xB6, 0x85, 0x43, 0xE6, 0xB7, 0x8B, 0x43, 0xE6, 0xB7, 0x9A, 0x43, 0xE6, 0xB7, 0xAA, 0x43, 0xE6, 0xB7, 0xB9, 0x43, 0xE6, 0xB8, 0x9A, 0x43, 0xE6, 0xB8, 0xAF, 0x43, // Bytes e40 - e7f 0xE6, 0xB9, 0xAE, 0x43, 0xE6, 0xBA, 0x80, 0x43, 0xE6, 0xBA, 0x9C, 0x43, 0xE6, 0xBA, 0xBA, 0x43, 0xE6, 0xBB, 0x87, 0x43, 0xE6, 0xBB, 0x8B, 0x43, 0xE6, 0xBB, 0x91, 0x43, 0xE6, 0xBB, 0x9B, 0x43, 0xE6, 0xBC, 0x8F, 0x43, 0xE6, 0xBC, 0x94, 0x43, 0xE6, 0xBC, 0xA2, 0x43, 0xE6, 0xBC, 0xA3, 0x43, 0xE6, 0xBD, 0xAE, 0x43, 0xE6, 0xBF, 0x86, 0x43, 0xE6, 0xBF, 0xAB, 0x43, 0xE6, 0xBF, 0xBE, 0x43, // Bytes e80 - ebf 0xE7, 0x80, 0x9B, 0x43, 0xE7, 0x80, 0x9E, 0x43, 0xE7, 0x80, 0xB9, 0x43, 0xE7, 0x81, 0x8A, 0x43, 0xE7, 0x81, 0xAB, 0x43, 0xE7, 0x81, 0xB0, 0x43, 0xE7, 0x81, 0xB7, 0x43, 0xE7, 0x81, 0xBD, 0x43, 0xE7, 0x82, 0x99, 0x43, 0xE7, 0x82, 0xAD, 0x43, 0xE7, 0x83, 0x88, 0x43, 0xE7, 0x83, 0x99, 0x43, 0xE7, 0x84, 0xA1, 0x43, 0xE7, 0x85, 0x85, 0x43, 0xE7, 0x85, 0x89, 0x43, 0xE7, 0x85, 0xAE, 0x43, // Bytes ec0 - eff 0xE7, 0x86, 0x9C, 0x43, 0xE7, 0x87, 0x8E, 0x43, 0xE7, 0x87, 0x90, 0x43, 0xE7, 0x88, 0x90, 0x43, 0xE7, 0x88, 0x9B, 0x43, 0xE7, 0x88, 0xA8, 0x43, 0xE7, 0x88, 0xAA, 0x43, 0xE7, 0x88, 0xAB, 0x43, 0xE7, 0x88, 0xB5, 0x43, 0xE7, 0x88, 0xB6, 0x43, 0xE7, 0x88, 0xBB, 0x43, 0xE7, 0x88, 0xBF, 0x43, 0xE7, 0x89, 0x87, 0x43, 0xE7, 0x89, 0x90, 0x43, 0xE7, 0x89, 0x99, 0x43, 0xE7, 0x89, 0x9B, 0x43, // Bytes f00 - f3f 0xE7, 0x89, 0xA2, 0x43, 0xE7, 0x89, 0xB9, 0x43, 0xE7, 0x8A, 0x80, 0x43, 0xE7, 0x8A, 0x95, 0x43, 0xE7, 0x8A, 0xAC, 0x43, 0xE7, 0x8A, 0xAF, 0x43, 0xE7, 0x8B, 0x80, 0x43, 0xE7, 0x8B, 0xBC, 0x43, 0xE7, 0x8C, 0xAA, 0x43, 0xE7, 0x8D, 0xB5, 0x43, 0xE7, 0x8D, 0xBA, 0x43, 0xE7, 0x8E, 0x84, 0x43, 0xE7, 0x8E, 0x87, 0x43, 0xE7, 0x8E, 0x89, 0x43, 0xE7, 0x8E, 0x8B, 0x43, 0xE7, 0x8E, 0xA5, 0x43, // Bytes f40 - f7f 0xE7, 0x8E, 0xB2, 0x43, 0xE7, 0x8F, 0x9E, 0x43, 0xE7, 0x90, 0x86, 0x43, 0xE7, 0x90, 0x89, 0x43, 0xE7, 0x90, 0xA2, 0x43, 0xE7, 0x91, 0x87, 0x43, 0xE7, 0x91, 0x9C, 0x43, 0xE7, 0x91, 0xA9, 0x43, 0xE7, 0x91, 0xB1, 0x43, 0xE7, 0x92, 0x85, 0x43, 0xE7, 0x92, 0x89, 0x43, 0xE7, 0x92, 0x98, 0x43, 0xE7, 0x93, 0x8A, 0x43, 0xE7, 0x93, 0x9C, 0x43, 0xE7, 0x93, 0xA6, 0x43, 0xE7, 0x94, 0x86, 0x43, // Bytes f80 - fbf 0xE7, 0x94, 0x98, 0x43, 0xE7, 0x94, 0x9F, 0x43, 0xE7, 0x94, 0xA4, 0x43, 0xE7, 0x94, 0xA8, 0x43, 0xE7, 0x94, 0xB0, 0x43, 0xE7, 0x94, 0xB2, 0x43, 0xE7, 0x94, 0xB3, 0x43, 0xE7, 0x94, 0xB7, 0x43, 0xE7, 0x94, 0xBB, 0x43, 0xE7, 0x94, 0xBE, 0x43, 0xE7, 0x95, 0x99, 0x43, 0xE7, 0x95, 0xA5, 0x43, 0xE7, 0x95, 0xB0, 0x43, 0xE7, 0x96, 0x8B, 0x43, 0xE7, 0x96, 0x92, 0x43, 0xE7, 0x97, 0xA2, 0x43, // Bytes fc0 - fff 0xE7, 0x98, 0x90, 0x43, 0xE7, 0x98, 0x9D, 0x43, 0xE7, 0x98, 0x9F, 0x43, 0xE7, 0x99, 0x82, 0x43, 0xE7, 0x99, 0xA9, 0x43, 0xE7, 0x99, 0xB6, 0x43, 0xE7, 0x99, 0xBD, 0x43, 0xE7, 0x9A, 0xAE, 0x43, 0xE7, 0x9A, 0xBF, 0x43, 0xE7, 0x9B, 0x8A, 0x43, 0xE7, 0x9B, 0x9B, 0x43, 0xE7, 0x9B, 0xA3, 0x43, 0xE7, 0x9B, 0xA7, 0x43, 0xE7, 0x9B, 0xAE, 0x43, 0xE7, 0x9B, 0xB4, 0x43, 0xE7, 0x9C, 0x81, 0x43, // Bytes 1000 - 103f 0xE7, 0x9C, 0x9E, 0x43, 0xE7, 0x9C, 0x9F, 0x43, 0xE7, 0x9D, 0x80, 0x43, 0xE7, 0x9D, 0x8A, 0x43, 0xE7, 0x9E, 0x8B, 0x43, 0xE7, 0x9E, 0xA7, 0x43, 0xE7, 0x9F, 0x9B, 0x43, 0xE7, 0x9F, 0xA2, 0x43, 0xE7, 0x9F, 0xB3, 0x43, 0xE7, 0xA1, 0x8E, 0x43, 0xE7, 0xA1, 0xAB, 0x43, 0xE7, 0xA2, 0x8C, 0x43, 0xE7, 0xA2, 0x91, 0x43, 0xE7, 0xA3, 0x8A, 0x43, 0xE7, 0xA3, 0x8C, 0x43, 0xE7, 0xA3, 0xBB, 0x43, // Bytes 1040 - 107f 0xE7, 0xA4, 0xAA, 0x43, 0xE7, 0xA4, 0xBA, 0x43, 0xE7, 0xA4, 0xBC, 0x43, 0xE7, 0xA4, 0xBE, 0x43, 0xE7, 0xA5, 0x88, 0x43, 0xE7, 0xA5, 0x89, 0x43, 0xE7, 0xA5, 0x90, 0x43, 0xE7, 0xA5, 0x96, 0x43, 0xE7, 0xA5, 0x9D, 0x43, 0xE7, 0xA5, 0x9E, 0x43, 0xE7, 0xA5, 0xA5, 0x43, 0xE7, 0xA5, 0xBF, 0x43, 0xE7, 0xA6, 0x81, 0x43, 0xE7, 0xA6, 0x8D, 0x43, 0xE7, 0xA6, 0x8E, 0x43, 0xE7, 0xA6, 0x8F, 0x43, // Bytes 1080 - 10bf 0xE7, 0xA6, 0xAE, 0x43, 0xE7, 0xA6, 0xB8, 0x43, 0xE7, 0xA6, 0xBE, 0x43, 0xE7, 0xA7, 0x8A, 0x43, 0xE7, 0xA7, 0x98, 0x43, 0xE7, 0xA7, 0xAB, 0x43, 0xE7, 0xA8, 0x9C, 0x43, 0xE7, 0xA9, 0x80, 0x43, 0xE7, 0xA9, 0x8A, 0x43, 0xE7, 0xA9, 0x8F, 0x43, 0xE7, 0xA9, 0xB4, 0x43, 0xE7, 0xA9, 0xBA, 0x43, 0xE7, 0xAA, 0x81, 0x43, 0xE7, 0xAA, 0xB1, 0x43, 0xE7, 0xAB, 0x8B, 0x43, 0xE7, 0xAB, 0xAE, 0x43, // Bytes 10c0 - 10ff 0xE7, 0xAB, 0xB9, 0x43, 0xE7, 0xAC, 0xA0, 0x43, 0xE7, 0xAE, 0x8F, 0x43, 0xE7, 0xAF, 0x80, 0x43, 0xE7, 0xAF, 0x86, 0x43, 0xE7, 0xAF, 0x89, 0x43, 0xE7, 0xB0, 0xBE, 0x43, 0xE7, 0xB1, 0xA0, 0x43, 0xE7, 0xB1, 0xB3, 0x43, 0xE7, 0xB1, 0xBB, 0x43, 0xE7, 0xB2, 0x92, 0x43, 0xE7, 0xB2, 0xBE, 0x43, 0xE7, 0xB3, 0x92, 0x43, 0xE7, 0xB3, 0x96, 0x43, 0xE7, 0xB3, 0xA3, 0x43, 0xE7, 0xB3, 0xA7, 0x43, // Bytes 1100 - 113f 0xE7, 0xB3, 0xA8, 0x43, 0xE7, 0xB3, 0xB8, 0x43, 0xE7, 0xB4, 0x80, 0x43, 0xE7, 0xB4, 0x90, 0x43, 0xE7, 0xB4, 0xA2, 0x43, 0xE7, 0xB4, 0xAF, 0x43, 0xE7, 0xB5, 0x82, 0x43, 0xE7, 0xB5, 0x9B, 0x43, 0xE7, 0xB5, 0xA3, 0x43, 0xE7, 0xB6, 0xA0, 0x43, 0xE7, 0xB6, 0xBE, 0x43, 0xE7, 0xB7, 0x87, 0x43, 0xE7, 0xB7, 0xB4, 0x43, 0xE7, 0xB8, 0x82, 0x43, 0xE7, 0xB8, 0x89, 0x43, 0xE7, 0xB8, 0xB7, 0x43, // Bytes 1140 - 117f 0xE7, 0xB9, 0x81, 0x43, 0xE7, 0xB9, 0x85, 0x43, 0xE7, 0xBC, 0xB6, 0x43, 0xE7, 0xBC, 0xBE, 0x43, 0xE7, 0xBD, 0x91, 0x43, 0xE7, 0xBD, 0xB2, 0x43, 0xE7, 0xBD, 0xB9, 0x43, 0xE7, 0xBD, 0xBA, 0x43, 0xE7, 0xBE, 0x85, 0x43, 0xE7, 0xBE, 0x8A, 0x43, 0xE7, 0xBE, 0x95, 0x43, 0xE7, 0xBE, 0x9A, 0x43, 0xE7, 0xBE, 0xBD, 0x43, 0xE7, 0xBF, 0xBA, 0x43, 0xE8, 0x80, 0x81, 0x43, 0xE8, 0x80, 0x85, 0x43, // Bytes 1180 - 11bf 0xE8, 0x80, 0x8C, 0x43, 0xE8, 0x80, 0x92, 0x43, 0xE8, 0x80, 0xB3, 0x43, 0xE8, 0x81, 0x86, 0x43, 0xE8, 0x81, 0xA0, 0x43, 0xE8, 0x81, 0xAF, 0x43, 0xE8, 0x81, 0xB0, 0x43, 0xE8, 0x81, 0xBE, 0x43, 0xE8, 0x81, 0xBF, 0x43, 0xE8, 0x82, 0x89, 0x43, 0xE8, 0x82, 0x8B, 0x43, 0xE8, 0x82, 0xAD, 0x43, 0xE8, 0x82, 0xB2, 0x43, 0xE8, 0x84, 0x83, 0x43, 0xE8, 0x84, 0xBE, 0x43, 0xE8, 0x87, 0x98, 0x43, // Bytes 11c0 - 11ff 0xE8, 0x87, 0xA3, 0x43, 0xE8, 0x87, 0xA8, 0x43, 0xE8, 0x87, 0xAA, 0x43, 0xE8, 0x87, 0xAD, 0x43, 0xE8, 0x87, 0xB3, 0x43, 0xE8, 0x87, 0xBC, 0x43, 0xE8, 0x88, 0x81, 0x43, 0xE8, 0x88, 0x84, 0x43, 0xE8, 0x88, 0x8C, 0x43, 0xE8, 0x88, 0x98, 0x43, 0xE8, 0x88, 0x9B, 0x43, 0xE8, 0x88, 0x9F, 0x43, 0xE8, 0x89, 0xAE, 0x43, 0xE8, 0x89, 0xAF, 0x43, 0xE8, 0x89, 0xB2, 0x43, 0xE8, 0x89, 0xB8, 0x43, // Bytes 1200 - 123f 0xE8, 0x89, 0xB9, 0x43, 0xE8, 0x8A, 0x8B, 0x43, 0xE8, 0x8A, 0x91, 0x43, 0xE8, 0x8A, 0x9D, 0x43, 0xE8, 0x8A, 0xB1, 0x43, 0xE8, 0x8A, 0xB3, 0x43, 0xE8, 0x8A, 0xBD, 0x43, 0xE8, 0x8B, 0xA5, 0x43, 0xE8, 0x8B, 0xA6, 0x43, 0xE8, 0x8C, 0x9D, 0x43, 0xE8, 0x8C, 0xA3, 0x43, 0xE8, 0x8C, 0xB6, 0x43, 0xE8, 0x8D, 0x92, 0x43, 0xE8, 0x8D, 0x93, 0x43, 0xE8, 0x8D, 0xA3, 0x43, 0xE8, 0x8E, 0xAD, 0x43, // Bytes 1240 - 127f 0xE8, 0x8E, 0xBD, 0x43, 0xE8, 0x8F, 0x89, 0x43, 0xE8, 0x8F, 0x8A, 0x43, 0xE8, 0x8F, 0x8C, 0x43, 0xE8, 0x8F, 0x9C, 0x43, 0xE8, 0x8F, 0xA7, 0x43, 0xE8, 0x8F, 0xAF, 0x43, 0xE8, 0x8F, 0xB1, 0x43, 0xE8, 0x90, 0xBD, 0x43, 0xE8, 0x91, 0x89, 0x43, 0xE8, 0x91, 0x97, 0x43, 0xE8, 0x93, 0xAE, 0x43, 0xE8, 0x93, 0xB1, 0x43, 0xE8, 0x93, 0xB3, 0x43, 0xE8, 0x93, 0xBC, 0x43, 0xE8, 0x94, 0x96, 0x43, // Bytes 1280 - 12bf 0xE8, 0x95, 0xA4, 0x43, 0xE8, 0x97, 0x8D, 0x43, 0xE8, 0x97, 0xBA, 0x43, 0xE8, 0x98, 0x86, 0x43, 0xE8, 0x98, 0x92, 0x43, 0xE8, 0x98, 0xAD, 0x43, 0xE8, 0x98, 0xBF, 0x43, 0xE8, 0x99, 0x8D, 0x43, 0xE8, 0x99, 0x90, 0x43, 0xE8, 0x99, 0x9C, 0x43, 0xE8, 0x99, 0xA7, 0x43, 0xE8, 0x99, 0xA9, 0x43, 0xE8, 0x99, 0xAB, 0x43, 0xE8, 0x9A, 0x88, 0x43, 0xE8, 0x9A, 0xA9, 0x43, 0xE8, 0x9B, 0xA2, 0x43, // Bytes 12c0 - 12ff 0xE8, 0x9C, 0x8E, 0x43, 0xE8, 0x9C, 0xA8, 0x43, 0xE8, 0x9D, 0xAB, 0x43, 0xE8, 0x9D, 0xB9, 0x43, 0xE8, 0x9E, 0x86, 0x43, 0xE8, 0x9E, 0xBA, 0x43, 0xE8, 0x9F, 0xA1, 0x43, 0xE8, 0xA0, 0x81, 0x43, 0xE8, 0xA0, 0x9F, 0x43, 0xE8, 0xA1, 0x80, 0x43, 0xE8, 0xA1, 0x8C, 0x43, 0xE8, 0xA1, 0xA0, 0x43, 0xE8, 0xA1, 0xA3, 0x43, 0xE8, 0xA3, 0x82, 0x43, 0xE8, 0xA3, 0x8F, 0x43, 0xE8, 0xA3, 0x97, 0x43, // Bytes 1300 - 133f 0xE8, 0xA3, 0x9E, 0x43, 0xE8, 0xA3, 0xA1, 0x43, 0xE8, 0xA3, 0xB8, 0x43, 0xE8, 0xA3, 0xBA, 0x43, 0xE8, 0xA4, 0x90, 0x43, 0xE8, 0xA5, 0x81, 0x43, 0xE8, 0xA5, 0xA4, 0x43, 0xE8, 0xA5, 0xBE, 0x43, 0xE8, 0xA6, 0x86, 0x43, 0xE8, 0xA6, 0x8B, 0x43, 0xE8, 0xA6, 0x96, 0x43, 0xE8, 0xA7, 0x92, 0x43, 0xE8, 0xA7, 0xA3, 0x43, 0xE8, 0xA8, 0x80, 0x43, 0xE8, 0xAA, 0xA0, 0x43, 0xE8, 0xAA, 0xAA, 0x43, // Bytes 1340 - 137f 0xE8, 0xAA, 0xBF, 0x43, 0xE8, 0xAB, 0x8B, 0x43, 0xE8, 0xAB, 0x92, 0x43, 0xE8, 0xAB, 0x96, 0x43, 0xE8, 0xAB, 0xAD, 0x43, 0xE8, 0xAB, 0xB8, 0x43, 0xE8, 0xAB, 0xBE, 0x43, 0xE8, 0xAC, 0x81, 0x43, 0xE8, 0xAC, 0xB9, 0x43, 0xE8, 0xAD, 0x98, 0x43, 0xE8, 0xAE, 0x80, 0x43, 0xE8, 0xAE, 0x8A, 0x43, 0xE8, 0xB0, 0xB7, 0x43, 0xE8, 0xB1, 0x86, 0x43, 0xE8, 0xB1, 0x88, 0x43, 0xE8, 0xB1, 0x95, 0x43, // Bytes 1380 - 13bf 0xE8, 0xB1, 0xB8, 0x43, 0xE8, 0xB2, 0x9D, 0x43, 0xE8, 0xB2, 0xA1, 0x43, 0xE8, 0xB2, 0xA9, 0x43, 0xE8, 0xB2, 0xAB, 0x43, 0xE8, 0xB3, 0x81, 0x43, 0xE8, 0xB3, 0x82, 0x43, 0xE8, 0xB3, 0x87, 0x43, 0xE8, 0xB3, 0x88, 0x43, 0xE8, 0xB3, 0x93, 0x43, 0xE8, 0xB4, 0x88, 0x43, 0xE8, 0xB4, 0x9B, 0x43, 0xE8, 0xB5, 0xA4, 0x43, 0xE8, 0xB5, 0xB0, 0x43, 0xE8, 0xB5, 0xB7, 0x43, 0xE8, 0xB6, 0xB3, 0x43, // Bytes 13c0 - 13ff 0xE8, 0xB6, 0xBC, 0x43, 0xE8, 0xB7, 0x8B, 0x43, 0xE8, 0xB7, 0xAF, 0x43, 0xE8, 0xB7, 0xB0, 0x43, 0xE8, 0xBA, 0xAB, 0x43, 0xE8, 0xBB, 0x8A, 0x43, 0xE8, 0xBB, 0x94, 0x43, 0xE8, 0xBC, 0xA6, 0x43, 0xE8, 0xBC, 0xAA, 0x43, 0xE8, 0xBC, 0xB8, 0x43, 0xE8, 0xBC, 0xBB, 0x43, 0xE8, 0xBD, 0xA2, 0x43, 0xE8, 0xBE, 0x9B, 0x43, 0xE8, 0xBE, 0x9E, 0x43, 0xE8, 0xBE, 0xB0, 0x43, 0xE8, 0xBE, 0xB5, 0x43, // Bytes 1400 - 143f 0xE8, 0xBE, 0xB6, 0x43, 0xE9, 0x80, 0xA3, 0x43, 0xE9, 0x80, 0xB8, 0x43, 0xE9, 0x81, 0x8A, 0x43, 0xE9, 0x81, 0xA9, 0x43, 0xE9, 0x81, 0xB2, 0x43, 0xE9, 0x81, 0xBC, 0x43, 0xE9, 0x82, 0x8F, 0x43, 0xE9, 0x82, 0x91, 0x43, 0xE9, 0x82, 0x94, 0x43, 0xE9, 0x83, 0x8E, 0x43, 0xE9, 0x83, 0x9E, 0x43, 0xE9, 0x83, 0xB1, 0x43, 0xE9, 0x83, 0xBD, 0x43, 0xE9, 0x84, 0x91, 0x43, 0xE9, 0x84, 0x9B, 0x43, // Bytes 1440 - 147f 0xE9, 0x85, 0x89, 0x43, 0xE9, 0x85, 0x8D, 0x43, 0xE9, 0x85, 0xAA, 0x43, 0xE9, 0x86, 0x99, 0x43, 0xE9, 0x86, 0xB4, 0x43, 0xE9, 0x87, 0x86, 0x43, 0xE9, 0x87, 0x8C, 0x43, 0xE9, 0x87, 0x8F, 0x43, 0xE9, 0x87, 0x91, 0x43, 0xE9, 0x88, 0xB4, 0x43, 0xE9, 0x88, 0xB8, 0x43, 0xE9, 0x89, 0xB6, 0x43, 0xE9, 0x89, 0xBC, 0x43, 0xE9, 0x8B, 0x97, 0x43, 0xE9, 0x8B, 0x98, 0x43, 0xE9, 0x8C, 0x84, 0x43, // Bytes 1480 - 14bf 0xE9, 0x8D, 0x8A, 0x43, 0xE9, 0x8F, 0xB9, 0x43, 0xE9, 0x90, 0x95, 0x43, 0xE9, 0x95, 0xB7, 0x43, 0xE9, 0x96, 0x80, 0x43, 0xE9, 0x96, 0x8B, 0x43, 0xE9, 0x96, 0xAD, 0x43, 0xE9, 0x96, 0xB7, 0x43, 0xE9, 0x98, 0x9C, 0x43, 0xE9, 0x98, 0xAE, 0x43, 0xE9, 0x99, 0x8B, 0x43, 0xE9, 0x99, 0x8D, 0x43, 0xE9, 0x99, 0xB5, 0x43, 0xE9, 0x99, 0xB8, 0x43, 0xE9, 0x99, 0xBC, 0x43, 0xE9, 0x9A, 0x86, 0x43, // Bytes 14c0 - 14ff 0xE9, 0x9A, 0xA3, 0x43, 0xE9, 0x9A, 0xB6, 0x43, 0xE9, 0x9A, 0xB7, 0x43, 0xE9, 0x9A, 0xB8, 0x43, 0xE9, 0x9A, 0xB9, 0x43, 0xE9, 0x9B, 0x83, 0x43, 0xE9, 0x9B, 0xA2, 0x43, 0xE9, 0x9B, 0xA3, 0x43, 0xE9, 0x9B, 0xA8, 0x43, 0xE9, 0x9B, 0xB6, 0x43, 0xE9, 0x9B, 0xB7, 0x43, 0xE9, 0x9C, 0xA3, 0x43, 0xE9, 0x9C, 0xB2, 0x43, 0xE9, 0x9D, 0x88, 0x43, 0xE9, 0x9D, 0x91, 0x43, 0xE9, 0x9D, 0x96, 0x43, // Bytes 1500 - 153f 0xE9, 0x9D, 0x9E, 0x43, 0xE9, 0x9D, 0xA2, 0x43, 0xE9, 0x9D, 0xA9, 0x43, 0xE9, 0x9F, 0x8B, 0x43, 0xE9, 0x9F, 0x9B, 0x43, 0xE9, 0x9F, 0xA0, 0x43, 0xE9, 0x9F, 0xAD, 0x43, 0xE9, 0x9F, 0xB3, 0x43, 0xE9, 0x9F, 0xBF, 0x43, 0xE9, 0xA0, 0x81, 0x43, 0xE9, 0xA0, 0x85, 0x43, 0xE9, 0xA0, 0x8B, 0x43, 0xE9, 0xA0, 0x98, 0x43, 0xE9, 0xA0, 0xA9, 0x43, 0xE9, 0xA0, 0xBB, 0x43, 0xE9, 0xA1, 0x9E, 0x43, // Bytes 1540 - 157f 0xE9, 0xA2, 0xA8, 0x43, 0xE9, 0xA3, 0x9B, 0x43, 0xE9, 0xA3, 0x9F, 0x43, 0xE9, 0xA3, 0xA2, 0x43, 0xE9, 0xA3, 0xAF, 0x43, 0xE9, 0xA3, 0xBC, 0x43, 0xE9, 0xA4, 0xA8, 0x43, 0xE9, 0xA4, 0xA9, 0x43, 0xE9, 0xA6, 0x96, 0x43, 0xE9, 0xA6, 0x99, 0x43, 0xE9, 0xA6, 0xA7, 0x43, 0xE9, 0xA6, 0xAC, 0x43, 0xE9, 0xA7, 0x82, 0x43, 0xE9, 0xA7, 0xB1, 0x43, 0xE9, 0xA7, 0xBE, 0x43, 0xE9, 0xA9, 0xAA, 0x43, // Bytes 1580 - 15bf 0xE9, 0xAA, 0xA8, 0x43, 0xE9, 0xAB, 0x98, 0x43, 0xE9, 0xAB, 0x9F, 0x43, 0xE9, 0xAC, 0x92, 0x43, 0xE9, 0xAC, 0xA5, 0x43, 0xE9, 0xAC, 0xAF, 0x43, 0xE9, 0xAC, 0xB2, 0x43, 0xE9, 0xAC, 0xBC, 0x43, 0xE9, 0xAD, 0x9A, 0x43, 0xE9, 0xAD, 0xAF, 0x43, 0xE9, 0xB1, 0x80, 0x43, 0xE9, 0xB1, 0x97, 0x43, 0xE9, 0xB3, 0xA5, 0x43, 0xE9, 0xB3, 0xBD, 0x43, 0xE9, 0xB5, 0xA7, 0x43, 0xE9, 0xB6, 0xB4, 0x43, // Bytes 15c0 - 15ff 0xE9, 0xB7, 0xBA, 0x43, 0xE9, 0xB8, 0x9E, 0x43, 0xE9, 0xB9, 0xB5, 0x43, 0xE9, 0xB9, 0xBF, 0x43, 0xE9, 0xBA, 0x97, 0x43, 0xE9, 0xBA, 0x9F, 0x43, 0xE9, 0xBA, 0xA5, 0x43, 0xE9, 0xBA, 0xBB, 0x43, 0xE9, 0xBB, 0x83, 0x43, 0xE9, 0xBB, 0x8D, 0x43, 0xE9, 0xBB, 0x8E, 0x43, 0xE9, 0xBB, 0x91, 0x43, 0xE9, 0xBB, 0xB9, 0x43, 0xE9, 0xBB, 0xBD, 0x43, 0xE9, 0xBB, 0xBE, 0x43, 0xE9, 0xBC, 0x85, 0x43, // Bytes 1600 - 163f 0xE9, 0xBC, 0x8E, 0x43, 0xE9, 0xBC, 0x8F, 0x43, 0xE9, 0xBC, 0x93, 0x43, 0xE9, 0xBC, 0x96, 0x43, 0xE9, 0xBC, 0xA0, 0x43, 0xE9, 0xBC, 0xBB, 0x43, 0xE9, 0xBD, 0x83, 0x43, 0xE9, 0xBD, 0x8A, 0x43, 0xE9, 0xBD, 0x92, 0x43, 0xE9, 0xBE, 0x8D, 0x43, 0xE9, 0xBE, 0x8E, 0x43, 0xE9, 0xBE, 0x9C, 0x43, 0xE9, 0xBE, 0x9F, 0x43, 0xE9, 0xBE, 0xA0, 0x43, 0xEA, 0x9C, 0xA7, 0x43, 0xEA, 0x9D, 0xAF, 0x43, // Bytes 1640 - 167f 0xEA, 0xAC, 0xB7, 0x43, 0xEA, 0xAD, 0x92, 0x44, 0xF0, 0xA0, 0x84, 0xA2, 0x44, 0xF0, 0xA0, 0x94, 0x9C, 0x44, 0xF0, 0xA0, 0x94, 0xA5, 0x44, 0xF0, 0xA0, 0x95, 0x8B, 0x44, 0xF0, 0xA0, 0x98, 0xBA, 0x44, 0xF0, 0xA0, 0xA0, 0x84, 0x44, 0xF0, 0xA0, 0xA3, 0x9E, 0x44, 0xF0, 0xA0, 0xA8, 0xAC, 0x44, 0xF0, 0xA0, 0xAD, 0xA3, 0x44, 0xF0, 0xA1, 0x93, 0xA4, 0x44, 0xF0, 0xA1, 0x9A, 0xA8, 0x44, 0xF0, // Bytes 1680 - 16bf 0xA1, 0x9B, 0xAA, 0x44, 0xF0, 0xA1, 0xA7, 0x88, 0x44, 0xF0, 0xA1, 0xAC, 0x98, 0x44, 0xF0, 0xA1, 0xB4, 0x8B, 0x44, 0xF0, 0xA1, 0xB7, 0xA4, 0x44, 0xF0, 0xA1, 0xB7, 0xA6, 0x44, 0xF0, 0xA2, 0x86, 0x83, 0x44, 0xF0, 0xA2, 0x86, 0x9F, 0x44, 0xF0, 0xA2, 0x8C, 0xB1, 0x44, 0xF0, 0xA2, 0x9B, 0x94, 0x44, 0xF0, 0xA2, 0xA1, 0x84, 0x44, 0xF0, 0xA2, 0xA1, 0x8A, 0x44, 0xF0, 0xA2, 0xAC, 0x8C, 0x44, // Bytes 16c0 - 16ff 0xF0, 0xA2, 0xAF, 0xB1, 0x44, 0xF0, 0xA3, 0x80, 0x8A, 0x44, 0xF0, 0xA3, 0x8A, 0xB8, 0x44, 0xF0, 0xA3, 0x8D, 0x9F, 0x44, 0xF0, 0xA3, 0x8E, 0x93, 0x44, 0xF0, 0xA3, 0x8E, 0x9C, 0x44, 0xF0, 0xA3, 0x8F, 0x83, 0x44, 0xF0, 0xA3, 0x8F, 0x95, 0x44, 0xF0, 0xA3, 0x91, 0xAD, 0x44, 0xF0, 0xA3, 0x9A, 0xA3, 0x44, 0xF0, 0xA3, 0xA2, 0xA7, 0x44, 0xF0, 0xA3, 0xAA, 0x8D, 0x44, 0xF0, 0xA3, 0xAB, 0xBA, // Bytes 1700 - 173f 0x44, 0xF0, 0xA3, 0xB2, 0xBC, 0x44, 0xF0, 0xA3, 0xB4, 0x9E, 0x44, 0xF0, 0xA3, 0xBB, 0x91, 0x44, 0xF0, 0xA3, 0xBD, 0x9E, 0x44, 0xF0, 0xA3, 0xBE, 0x8E, 0x44, 0xF0, 0xA4, 0x89, 0xA3, 0x44, 0xF0, 0xA4, 0x8B, 0xAE, 0x44, 0xF0, 0xA4, 0x8E, 0xAB, 0x44, 0xF0, 0xA4, 0x98, 0x88, 0x44, 0xF0, 0xA4, 0x9C, 0xB5, 0x44, 0xF0, 0xA4, 0xA0, 0x94, 0x44, 0xF0, 0xA4, 0xB0, 0xB6, 0x44, 0xF0, 0xA4, 0xB2, // Bytes 1740 - 177f 0x92, 0x44, 0xF0, 0xA4, 0xBE, 0xA1, 0x44, 0xF0, 0xA4, 0xBE, 0xB8, 0x44, 0xF0, 0xA5, 0x81, 0x84, 0x44, 0xF0, 0xA5, 0x83, 0xB2, 0x44, 0xF0, 0xA5, 0x83, 0xB3, 0x44, 0xF0, 0xA5, 0x84, 0x99, 0x44, 0xF0, 0xA5, 0x84, 0xB3, 0x44, 0xF0, 0xA5, 0x89, 0x89, 0x44, 0xF0, 0xA5, 0x90, 0x9D, 0x44, 0xF0, 0xA5, 0x98, 0xA6, 0x44, 0xF0, 0xA5, 0x9A, 0x9A, 0x44, 0xF0, 0xA5, 0x9B, 0x85, 0x44, 0xF0, 0xA5, // Bytes 1780 - 17bf 0xA5, 0xBC, 0x44, 0xF0, 0xA5, 0xAA, 0xA7, 0x44, 0xF0, 0xA5, 0xAE, 0xAB, 0x44, 0xF0, 0xA5, 0xB2, 0x80, 0x44, 0xF0, 0xA5, 0xB3, 0x90, 0x44, 0xF0, 0xA5, 0xBE, 0x86, 0x44, 0xF0, 0xA6, 0x87, 0x9A, 0x44, 0xF0, 0xA6, 0x88, 0xA8, 0x44, 0xF0, 0xA6, 0x89, 0x87, 0x44, 0xF0, 0xA6, 0x8B, 0x99, 0x44, 0xF0, 0xA6, 0x8C, 0xBE, 0x44, 0xF0, 0xA6, 0x93, 0x9A, 0x44, 0xF0, 0xA6, 0x94, 0xA3, 0x44, 0xF0, // Bytes 17c0 - 17ff 0xA6, 0x96, 0xA8, 0x44, 0xF0, 0xA6, 0x9E, 0xA7, 0x44, 0xF0, 0xA6, 0x9E, 0xB5, 0x44, 0xF0, 0xA6, 0xAC, 0xBC, 0x44, 0xF0, 0xA6, 0xB0, 0xB6, 0x44, 0xF0, 0xA6, 0xB3, 0x95, 0x44, 0xF0, 0xA6, 0xB5, 0xAB, 0x44, 0xF0, 0xA6, 0xBC, 0xAC, 0x44, 0xF0, 0xA6, 0xBE, 0xB1, 0x44, 0xF0, 0xA7, 0x83, 0x92, 0x44, 0xF0, 0xA7, 0x8F, 0x8A, 0x44, 0xF0, 0xA7, 0x99, 0xA7, 0x44, 0xF0, 0xA7, 0xA2, 0xAE, 0x44, // Bytes 1800 - 183f 0xF0, 0xA7, 0xA5, 0xA6, 0x44, 0xF0, 0xA7, 0xB2, 0xA8, 0x44, 0xF0, 0xA7, 0xBB, 0x93, 0x44, 0xF0, 0xA7, 0xBC, 0xAF, 0x44, 0xF0, 0xA8, 0x97, 0x92, 0x44, 0xF0, 0xA8, 0x97, 0xAD, 0x44, 0xF0, 0xA8, 0x9C, 0xAE, 0x44, 0xF0, 0xA8, 0xAF, 0xBA, 0x44, 0xF0, 0xA8, 0xB5, 0xB7, 0x44, 0xF0, 0xA9, 0x85, 0x85, 0x44, 0xF0, 0xA9, 0x87, 0x9F, 0x44, 0xF0, 0xA9, 0x88, 0x9A, 0x44, 0xF0, 0xA9, 0x90, 0x8A, // Bytes 1840 - 187f 0x44, 0xF0, 0xA9, 0x92, 0x96, 0x44, 0xF0, 0xA9, 0x96, 0xB6, 0x44, 0xF0, 0xA9, 0xAC, 0xB0, 0x44, 0xF0, 0xAA, 0x83, 0x8E, 0x44, 0xF0, 0xAA, 0x84, 0x85, 0x44, 0xF0, 0xAA, 0x88, 0x8E, 0x44, 0xF0, 0xAA, 0x8A, 0x91, 0x44, 0xF0, 0xAA, 0x8E, 0x92, 0x44, 0xF0, 0xAA, 0x98, 0x80, 0x42, 0x21, 0x21, 0x42, 0x21, 0x3F, 0x42, 0x2E, 0x2E, 0x42, 0x30, 0x2C, 0x42, 0x30, 0x2E, 0x42, 0x31, 0x2C, 0x42, // Bytes 1880 - 18bf 0x31, 0x2E, 0x42, 0x31, 0x30, 0x42, 0x31, 0x31, 0x42, 0x31, 0x32, 0x42, 0x31, 0x33, 0x42, 0x31, 0x34, 0x42, 0x31, 0x35, 0x42, 0x31, 0x36, 0x42, 0x31, 0x37, 0x42, 0x31, 0x38, 0x42, 0x31, 0x39, 0x42, 0x32, 0x2C, 0x42, 0x32, 0x2E, 0x42, 0x32, 0x30, 0x42, 0x32, 0x31, 0x42, 0x32, 0x32, 0x42, 0x32, 0x33, 0x42, 0x32, 0x34, 0x42, 0x32, 0x35, 0x42, 0x32, 0x36, 0x42, 0x32, 0x37, 0x42, 0x32, // Bytes 18c0 - 18ff 0x38, 0x42, 0x32, 0x39, 0x42, 0x33, 0x2C, 0x42, 0x33, 0x2E, 0x42, 0x33, 0x30, 0x42, 0x33, 0x31, 0x42, 0x33, 0x32, 0x42, 0x33, 0x33, 0x42, 0x33, 0x34, 0x42, 0x33, 0x35, 0x42, 0x33, 0x36, 0x42, 0x33, 0x37, 0x42, 0x33, 0x38, 0x42, 0x33, 0x39, 0x42, 0x34, 0x2C, 0x42, 0x34, 0x2E, 0x42, 0x34, 0x30, 0x42, 0x34, 0x31, 0x42, 0x34, 0x32, 0x42, 0x34, 0x33, 0x42, 0x34, 0x34, 0x42, 0x34, 0x35, // Bytes 1900 - 193f 0x42, 0x34, 0x36, 0x42, 0x34, 0x37, 0x42, 0x34, 0x38, 0x42, 0x34, 0x39, 0x42, 0x35, 0x2C, 0x42, 0x35, 0x2E, 0x42, 0x35, 0x30, 0x42, 0x36, 0x2C, 0x42, 0x36, 0x2E, 0x42, 0x37, 0x2C, 0x42, 0x37, 0x2E, 0x42, 0x38, 0x2C, 0x42, 0x38, 0x2E, 0x42, 0x39, 0x2C, 0x42, 0x39, 0x2E, 0x42, 0x3D, 0x3D, 0x42, 0x3F, 0x21, 0x42, 0x3F, 0x3F, 0x42, 0x41, 0x55, 0x42, 0x42, 0x71, 0x42, 0x43, 0x44, 0x42, // Bytes 1940 - 197f 0x44, 0x4A, 0x42, 0x44, 0x5A, 0x42, 0x44, 0x7A, 0x42, 0x47, 0x42, 0x42, 0x47, 0x79, 0x42, 0x48, 0x50, 0x42, 0x48, 0x56, 0x42, 0x48, 0x67, 0x42, 0x48, 0x7A, 0x42, 0x49, 0x49, 0x42, 0x49, 0x4A, 0x42, 0x49, 0x55, 0x42, 0x49, 0x56, 0x42, 0x49, 0x58, 0x42, 0x4B, 0x42, 0x42, 0x4B, 0x4B, 0x42, 0x4B, 0x4D, 0x42, 0x4C, 0x4A, 0x42, 0x4C, 0x6A, 0x42, 0x4D, 0x42, 0x42, 0x4D, 0x43, 0x42, 0x4D, // Bytes 1980 - 19bf 0x44, 0x42, 0x4D, 0x56, 0x42, 0x4D, 0x57, 0x42, 0x4E, 0x4A, 0x42, 0x4E, 0x6A, 0x42, 0x4E, 0x6F, 0x42, 0x50, 0x48, 0x42, 0x50, 0x52, 0x42, 0x50, 0x61, 0x42, 0x52, 0x73, 0x42, 0x53, 0x44, 0x42, 0x53, 0x4D, 0x42, 0x53, 0x53, 0x42, 0x53, 0x76, 0x42, 0x54, 0x4D, 0x42, 0x56, 0x49, 0x42, 0x57, 0x43, 0x42, 0x57, 0x5A, 0x42, 0x57, 0x62, 0x42, 0x58, 0x49, 0x42, 0x63, 0x63, 0x42, 0x63, 0x64, // Bytes 19c0 - 19ff 0x42, 0x63, 0x6D, 0x42, 0x64, 0x42, 0x42, 0x64, 0x61, 0x42, 0x64, 0x6C, 0x42, 0x64, 0x6D, 0x42, 0x64, 0x7A, 0x42, 0x65, 0x56, 0x42, 0x66, 0x66, 0x42, 0x66, 0x69, 0x42, 0x66, 0x6C, 0x42, 0x66, 0x6D, 0x42, 0x68, 0x61, 0x42, 0x69, 0x69, 0x42, 0x69, 0x6A, 0x42, 0x69, 0x6E, 0x42, 0x69, 0x76, 0x42, 0x69, 0x78, 0x42, 0x6B, 0x41, 0x42, 0x6B, 0x56, 0x42, 0x6B, 0x57, 0x42, 0x6B, 0x67, 0x42, // Bytes 1a00 - 1a3f 0x6B, 0x6C, 0x42, 0x6B, 0x6D, 0x42, 0x6B, 0x74, 0x42, 0x6C, 0x6A, 0x42, 0x6C, 0x6D, 0x42, 0x6C, 0x6E, 0x42, 0x6C, 0x78, 0x42, 0x6D, 0x32, 0x42, 0x6D, 0x33, 0x42, 0x6D, 0x41, 0x42, 0x6D, 0x56, 0x42, 0x6D, 0x57, 0x42, 0x6D, 0x62, 0x42, 0x6D, 0x67, 0x42, 0x6D, 0x6C, 0x42, 0x6D, 0x6D, 0x42, 0x6D, 0x73, 0x42, 0x6E, 0x41, 0x42, 0x6E, 0x46, 0x42, 0x6E, 0x56, 0x42, 0x6E, 0x57, 0x42, 0x6E, // Bytes 1a40 - 1a7f 0x6A, 0x42, 0x6E, 0x6D, 0x42, 0x6E, 0x73, 0x42, 0x6F, 0x56, 0x42, 0x70, 0x41, 0x42, 0x70, 0x46, 0x42, 0x70, 0x56, 0x42, 0x70, 0x57, 0x42, 0x70, 0x63, 0x42, 0x70, 0x73, 0x42, 0x73, 0x72, 0x42, 0x73, 0x74, 0x42, 0x76, 0x69, 0x42, 0x78, 0x69, 0x43, 0x28, 0x31, 0x29, 0x43, 0x28, 0x32, 0x29, 0x43, 0x28, 0x33, 0x29, 0x43, 0x28, 0x34, 0x29, 0x43, 0x28, 0x35, 0x29, 0x43, 0x28, 0x36, 0x29, // Bytes 1a80 - 1abf 0x43, 0x28, 0x37, 0x29, 0x43, 0x28, 0x38, 0x29, 0x43, 0x28, 0x39, 0x29, 0x43, 0x28, 0x41, 0x29, 0x43, 0x28, 0x42, 0x29, 0x43, 0x28, 0x43, 0x29, 0x43, 0x28, 0x44, 0x29, 0x43, 0x28, 0x45, 0x29, 0x43, 0x28, 0x46, 0x29, 0x43, 0x28, 0x47, 0x29, 0x43, 0x28, 0x48, 0x29, 0x43, 0x28, 0x49, 0x29, 0x43, 0x28, 0x4A, 0x29, 0x43, 0x28, 0x4B, 0x29, 0x43, 0x28, 0x4C, 0x29, 0x43, 0x28, 0x4D, 0x29, // Bytes 1ac0 - 1aff 0x43, 0x28, 0x4E, 0x29, 0x43, 0x28, 0x4F, 0x29, 0x43, 0x28, 0x50, 0x29, 0x43, 0x28, 0x51, 0x29, 0x43, 0x28, 0x52, 0x29, 0x43, 0x28, 0x53, 0x29, 0x43, 0x28, 0x54, 0x29, 0x43, 0x28, 0x55, 0x29, 0x43, 0x28, 0x56, 0x29, 0x43, 0x28, 0x57, 0x29, 0x43, 0x28, 0x58, 0x29, 0x43, 0x28, 0x59, 0x29, 0x43, 0x28, 0x5A, 0x29, 0x43, 0x28, 0x61, 0x29, 0x43, 0x28, 0x62, 0x29, 0x43, 0x28, 0x63, 0x29, // Bytes 1b00 - 1b3f 0x43, 0x28, 0x64, 0x29, 0x43, 0x28, 0x65, 0x29, 0x43, 0x28, 0x66, 0x29, 0x43, 0x28, 0x67, 0x29, 0x43, 0x28, 0x68, 0x29, 0x43, 0x28, 0x69, 0x29, 0x43, 0x28, 0x6A, 0x29, 0x43, 0x28, 0x6B, 0x29, 0x43, 0x28, 0x6C, 0x29, 0x43, 0x28, 0x6D, 0x29, 0x43, 0x28, 0x6E, 0x29, 0x43, 0x28, 0x6F, 0x29, 0x43, 0x28, 0x70, 0x29, 0x43, 0x28, 0x71, 0x29, 0x43, 0x28, 0x72, 0x29, 0x43, 0x28, 0x73, 0x29, // Bytes 1b40 - 1b7f 0x43, 0x28, 0x74, 0x29, 0x43, 0x28, 0x75, 0x29, 0x43, 0x28, 0x76, 0x29, 0x43, 0x28, 0x77, 0x29, 0x43, 0x28, 0x78, 0x29, 0x43, 0x28, 0x79, 0x29, 0x43, 0x28, 0x7A, 0x29, 0x43, 0x2E, 0x2E, 0x2E, 0x43, 0x31, 0x30, 0x2E, 0x43, 0x31, 0x31, 0x2E, 0x43, 0x31, 0x32, 0x2E, 0x43, 0x31, 0x33, 0x2E, 0x43, 0x31, 0x34, 0x2E, 0x43, 0x31, 0x35, 0x2E, 0x43, 0x31, 0x36, 0x2E, 0x43, 0x31, 0x37, 0x2E, // Bytes 1b80 - 1bbf 0x43, 0x31, 0x38, 0x2E, 0x43, 0x31, 0x39, 0x2E, 0x43, 0x32, 0x30, 0x2E, 0x43, 0x3A, 0x3A, 0x3D, 0x43, 0x3D, 0x3D, 0x3D, 0x43, 0x43, 0x6F, 0x2E, 0x43, 0x46, 0x41, 0x58, 0x43, 0x47, 0x48, 0x7A, 0x43, 0x47, 0x50, 0x61, 0x43, 0x49, 0x49, 0x49, 0x43, 0x4C, 0x54, 0x44, 0x43, 0x4C, 0xC2, 0xB7, 0x43, 0x4D, 0x48, 0x7A, 0x43, 0x4D, 0x50, 0x61, 0x43, 0x4D, 0xCE, 0xA9, 0x43, 0x50, 0x50, 0x4D, // Bytes 1bc0 - 1bff 0x43, 0x50, 0x50, 0x56, 0x43, 0x50, 0x54, 0x45, 0x43, 0x54, 0x45, 0x4C, 0x43, 0x54, 0x48, 0x7A, 0x43, 0x56, 0x49, 0x49, 0x43, 0x58, 0x49, 0x49, 0x43, 0x61, 0x2F, 0x63, 0x43, 0x61, 0x2F, 0x73, 0x43, 0x61, 0xCA, 0xBE, 0x43, 0x62, 0x61, 0x72, 0x43, 0x63, 0x2F, 0x6F, 0x43, 0x63, 0x2F, 0x75, 0x43, 0x63, 0x61, 0x6C, 0x43, 0x63, 0x6D, 0x32, 0x43, 0x63, 0x6D, 0x33, 0x43, 0x64, 0x6D, 0x32, // Bytes 1c00 - 1c3f 0x43, 0x64, 0x6D, 0x33, 0x43, 0x65, 0x72, 0x67, 0x43, 0x66, 0x66, 0x69, 0x43, 0x66, 0x66, 0x6C, 0x43, 0x67, 0x61, 0x6C, 0x43, 0x68, 0x50, 0x61, 0x43, 0x69, 0x69, 0x69, 0x43, 0x6B, 0x48, 0x7A, 0x43, 0x6B, 0x50, 0x61, 0x43, 0x6B, 0x6D, 0x32, 0x43, 0x6B, 0x6D, 0x33, 0x43, 0x6B, 0xCE, 0xA9, 0x43, 0x6C, 0x6F, 0x67, 0x43, 0x6C, 0xC2, 0xB7, 0x43, 0x6D, 0x69, 0x6C, 0x43, 0x6D, 0x6D, 0x32, // Bytes 1c40 - 1c7f 0x43, 0x6D, 0x6D, 0x33, 0x43, 0x6D, 0x6F, 0x6C, 0x43, 0x72, 0x61, 0x64, 0x43, 0x76, 0x69, 0x69, 0x43, 0x78, 0x69, 0x69, 0x43, 0xC2, 0xB0, 0x43, 0x43, 0xC2, 0xB0, 0x46, 0x43, 0xCA, 0xBC, 0x6E, 0x43, 0xCE, 0xBC, 0x41, 0x43, 0xCE, 0xBC, 0x46, 0x43, 0xCE, 0xBC, 0x56, 0x43, 0xCE, 0xBC, 0x57, 0x43, 0xCE, 0xBC, 0x67, 0x43, 0xCE, 0xBC, 0x6C, 0x43, 0xCE, 0xBC, 0x6D, 0x43, 0xCE, 0xBC, 0x73, // Bytes 1c80 - 1cbf 0x44, 0x28, 0x31, 0x30, 0x29, 0x44, 0x28, 0x31, 0x31, 0x29, 0x44, 0x28, 0x31, 0x32, 0x29, 0x44, 0x28, 0x31, 0x33, 0x29, 0x44, 0x28, 0x31, 0x34, 0x29, 0x44, 0x28, 0x31, 0x35, 0x29, 0x44, 0x28, 0x31, 0x36, 0x29, 0x44, 0x28, 0x31, 0x37, 0x29, 0x44, 0x28, 0x31, 0x38, 0x29, 0x44, 0x28, 0x31, 0x39, 0x29, 0x44, 0x28, 0x32, 0x30, 0x29, 0x44, 0x30, 0xE7, 0x82, 0xB9, 0x44, 0x31, 0xE2, 0x81, // Bytes 1cc0 - 1cff 0x84, 0x44, 0x31, 0xE6, 0x97, 0xA5, 0x44, 0x31, 0xE6, 0x9C, 0x88, 0x44, 0x31, 0xE7, 0x82, 0xB9, 0x44, 0x32, 0xE6, 0x97, 0xA5, 0x44, 0x32, 0xE6, 0x9C, 0x88, 0x44, 0x32, 0xE7, 0x82, 0xB9, 0x44, 0x33, 0xE6, 0x97, 0xA5, 0x44, 0x33, 0xE6, 0x9C, 0x88, 0x44, 0x33, 0xE7, 0x82, 0xB9, 0x44, 0x34, 0xE6, 0x97, 0xA5, 0x44, 0x34, 0xE6, 0x9C, 0x88, 0x44, 0x34, 0xE7, 0x82, 0xB9, 0x44, 0x35, 0xE6, // Bytes 1d00 - 1d3f 0x97, 0xA5, 0x44, 0x35, 0xE6, 0x9C, 0x88, 0x44, 0x35, 0xE7, 0x82, 0xB9, 0x44, 0x36, 0xE6, 0x97, 0xA5, 0x44, 0x36, 0xE6, 0x9C, 0x88, 0x44, 0x36, 0xE7, 0x82, 0xB9, 0x44, 0x37, 0xE6, 0x97, 0xA5, 0x44, 0x37, 0xE6, 0x9C, 0x88, 0x44, 0x37, 0xE7, 0x82, 0xB9, 0x44, 0x38, 0xE6, 0x97, 0xA5, 0x44, 0x38, 0xE6, 0x9C, 0x88, 0x44, 0x38, 0xE7, 0x82, 0xB9, 0x44, 0x39, 0xE6, 0x97, 0xA5, 0x44, 0x39, // Bytes 1d40 - 1d7f 0xE6, 0x9C, 0x88, 0x44, 0x39, 0xE7, 0x82, 0xB9, 0x44, 0x56, 0x49, 0x49, 0x49, 0x44, 0x61, 0x2E, 0x6D, 0x2E, 0x44, 0x6B, 0x63, 0x61, 0x6C, 0x44, 0x70, 0x2E, 0x6D, 0x2E, 0x44, 0x76, 0x69, 0x69, 0x69, 0x44, 0xD5, 0xA5, 0xD6, 0x82, 0x44, 0xD5, 0xB4, 0xD5, 0xA5, 0x44, 0xD5, 0xB4, 0xD5, 0xAB, 0x44, 0xD5, 0xB4, 0xD5, 0xAD, 0x44, 0xD5, 0xB4, 0xD5, 0xB6, 0x44, 0xD5, 0xBE, 0xD5, 0xB6, 0x44, // Bytes 1d80 - 1dbf 0xD7, 0x90, 0xD7, 0x9C, 0x44, 0xD8, 0xA7, 0xD9, 0xB4, 0x44, 0xD8, 0xA8, 0xD8, 0xAC, 0x44, 0xD8, 0xA8, 0xD8, 0xAD, 0x44, 0xD8, 0xA8, 0xD8, 0xAE, 0x44, 0xD8, 0xA8, 0xD8, 0xB1, 0x44, 0xD8, 0xA8, 0xD8, 0xB2, 0x44, 0xD8, 0xA8, 0xD9, 0x85, 0x44, 0xD8, 0xA8, 0xD9, 0x86, 0x44, 0xD8, 0xA8, 0xD9, 0x87, 0x44, 0xD8, 0xA8, 0xD9, 0x89, 0x44, 0xD8, 0xA8, 0xD9, 0x8A, 0x44, 0xD8, 0xAA, 0xD8, 0xAC, // Bytes 1dc0 - 1dff 0x44, 0xD8, 0xAA, 0xD8, 0xAD, 0x44, 0xD8, 0xAA, 0xD8, 0xAE, 0x44, 0xD8, 0xAA, 0xD8, 0xB1, 0x44, 0xD8, 0xAA, 0xD8, 0xB2, 0x44, 0xD8, 0xAA, 0xD9, 0x85, 0x44, 0xD8, 0xAA, 0xD9, 0x86, 0x44, 0xD8, 0xAA, 0xD9, 0x87, 0x44, 0xD8, 0xAA, 0xD9, 0x89, 0x44, 0xD8, 0xAA, 0xD9, 0x8A, 0x44, 0xD8, 0xAB, 0xD8, 0xAC, 0x44, 0xD8, 0xAB, 0xD8, 0xB1, 0x44, 0xD8, 0xAB, 0xD8, 0xB2, 0x44, 0xD8, 0xAB, 0xD9, // Bytes 1e00 - 1e3f 0x85, 0x44, 0xD8, 0xAB, 0xD9, 0x86, 0x44, 0xD8, 0xAB, 0xD9, 0x87, 0x44, 0xD8, 0xAB, 0xD9, 0x89, 0x44, 0xD8, 0xAB, 0xD9, 0x8A, 0x44, 0xD8, 0xAC, 0xD8, 0xAD, 0x44, 0xD8, 0xAC, 0xD9, 0x85, 0x44, 0xD8, 0xAC, 0xD9, 0x89, 0x44, 0xD8, 0xAC, 0xD9, 0x8A, 0x44, 0xD8, 0xAD, 0xD8, 0xAC, 0x44, 0xD8, 0xAD, 0xD9, 0x85, 0x44, 0xD8, 0xAD, 0xD9, 0x89, 0x44, 0xD8, 0xAD, 0xD9, 0x8A, 0x44, 0xD8, 0xAE, // Bytes 1e40 - 1e7f 0xD8, 0xAC, 0x44, 0xD8, 0xAE, 0xD8, 0xAD, 0x44, 0xD8, 0xAE, 0xD9, 0x85, 0x44, 0xD8, 0xAE, 0xD9, 0x89, 0x44, 0xD8, 0xAE, 0xD9, 0x8A, 0x44, 0xD8, 0xB3, 0xD8, 0xAC, 0x44, 0xD8, 0xB3, 0xD8, 0xAD, 0x44, 0xD8, 0xB3, 0xD8, 0xAE, 0x44, 0xD8, 0xB3, 0xD8, 0xB1, 0x44, 0xD8, 0xB3, 0xD9, 0x85, 0x44, 0xD8, 0xB3, 0xD9, 0x87, 0x44, 0xD8, 0xB3, 0xD9, 0x89, 0x44, 0xD8, 0xB3, 0xD9, 0x8A, 0x44, 0xD8, // Bytes 1e80 - 1ebf 0xB4, 0xD8, 0xAC, 0x44, 0xD8, 0xB4, 0xD8, 0xAD, 0x44, 0xD8, 0xB4, 0xD8, 0xAE, 0x44, 0xD8, 0xB4, 0xD8, 0xB1, 0x44, 0xD8, 0xB4, 0xD9, 0x85, 0x44, 0xD8, 0xB4, 0xD9, 0x87, 0x44, 0xD8, 0xB4, 0xD9, 0x89, 0x44, 0xD8, 0xB4, 0xD9, 0x8A, 0x44, 0xD8, 0xB5, 0xD8, 0xAD, 0x44, 0xD8, 0xB5, 0xD8, 0xAE, 0x44, 0xD8, 0xB5, 0xD8, 0xB1, 0x44, 0xD8, 0xB5, 0xD9, 0x85, 0x44, 0xD8, 0xB5, 0xD9, 0x89, 0x44, // Bytes 1ec0 - 1eff 0xD8, 0xB5, 0xD9, 0x8A, 0x44, 0xD8, 0xB6, 0xD8, 0xAC, 0x44, 0xD8, 0xB6, 0xD8, 0xAD, 0x44, 0xD8, 0xB6, 0xD8, 0xAE, 0x44, 0xD8, 0xB6, 0xD8, 0xB1, 0x44, 0xD8, 0xB6, 0xD9, 0x85, 0x44, 0xD8, 0xB6, 0xD9, 0x89, 0x44, 0xD8, 0xB6, 0xD9, 0x8A, 0x44, 0xD8, 0xB7, 0xD8, 0xAD, 0x44, 0xD8, 0xB7, 0xD9, 0x85, 0x44, 0xD8, 0xB7, 0xD9, 0x89, 0x44, 0xD8, 0xB7, 0xD9, 0x8A, 0x44, 0xD8, 0xB8, 0xD9, 0x85, // Bytes 1f00 - 1f3f 0x44, 0xD8, 0xB9, 0xD8, 0xAC, 0x44, 0xD8, 0xB9, 0xD9, 0x85, 0x44, 0xD8, 0xB9, 0xD9, 0x89, 0x44, 0xD8, 0xB9, 0xD9, 0x8A, 0x44, 0xD8, 0xBA, 0xD8, 0xAC, 0x44, 0xD8, 0xBA, 0xD9, 0x85, 0x44, 0xD8, 0xBA, 0xD9, 0x89, 0x44, 0xD8, 0xBA, 0xD9, 0x8A, 0x44, 0xD9, 0x81, 0xD8, 0xAC, 0x44, 0xD9, 0x81, 0xD8, 0xAD, 0x44, 0xD9, 0x81, 0xD8, 0xAE, 0x44, 0xD9, 0x81, 0xD9, 0x85, 0x44, 0xD9, 0x81, 0xD9, // Bytes 1f40 - 1f7f 0x89, 0x44, 0xD9, 0x81, 0xD9, 0x8A, 0x44, 0xD9, 0x82, 0xD8, 0xAD, 0x44, 0xD9, 0x82, 0xD9, 0x85, 0x44, 0xD9, 0x82, 0xD9, 0x89, 0x44, 0xD9, 0x82, 0xD9, 0x8A, 0x44, 0xD9, 0x83, 0xD8, 0xA7, 0x44, 0xD9, 0x83, 0xD8, 0xAC, 0x44, 0xD9, 0x83, 0xD8, 0xAD, 0x44, 0xD9, 0x83, 0xD8, 0xAE, 0x44, 0xD9, 0x83, 0xD9, 0x84, 0x44, 0xD9, 0x83, 0xD9, 0x85, 0x44, 0xD9, 0x83, 0xD9, 0x89, 0x44, 0xD9, 0x83, // Bytes 1f80 - 1fbf 0xD9, 0x8A, 0x44, 0xD9, 0x84, 0xD8, 0xA7, 0x44, 0xD9, 0x84, 0xD8, 0xAC, 0x44, 0xD9, 0x84, 0xD8, 0xAD, 0x44, 0xD9, 0x84, 0xD8, 0xAE, 0x44, 0xD9, 0x84, 0xD9, 0x85, 0x44, 0xD9, 0x84, 0xD9, 0x87, 0x44, 0xD9, 0x84, 0xD9, 0x89, 0x44, 0xD9, 0x84, 0xD9, 0x8A, 0x44, 0xD9, 0x85, 0xD8, 0xA7, 0x44, 0xD9, 0x85, 0xD8, 0xAC, 0x44, 0xD9, 0x85, 0xD8, 0xAD, 0x44, 0xD9, 0x85, 0xD8, 0xAE, 0x44, 0xD9, // Bytes 1fc0 - 1fff 0x85, 0xD9, 0x85, 0x44, 0xD9, 0x85, 0xD9, 0x89, 0x44, 0xD9, 0x85, 0xD9, 0x8A, 0x44, 0xD9, 0x86, 0xD8, 0xAC, 0x44, 0xD9, 0x86, 0xD8, 0xAD, 0x44, 0xD9, 0x86, 0xD8, 0xAE, 0x44, 0xD9, 0x86, 0xD8, 0xB1, 0x44, 0xD9, 0x86, 0xD8, 0xB2, 0x44, 0xD9, 0x86, 0xD9, 0x85, 0x44, 0xD9, 0x86, 0xD9, 0x86, 0x44, 0xD9, 0x86, 0xD9, 0x87, 0x44, 0xD9, 0x86, 0xD9, 0x89, 0x44, 0xD9, 0x86, 0xD9, 0x8A, 0x44, // Bytes 2000 - 203f 0xD9, 0x87, 0xD8, 0xAC, 0x44, 0xD9, 0x87, 0xD9, 0x85, 0x44, 0xD9, 0x87, 0xD9, 0x89, 0x44, 0xD9, 0x87, 0xD9, 0x8A, 0x44, 0xD9, 0x88, 0xD9, 0xB4, 0x44, 0xD9, 0x8A, 0xD8, 0xAC, 0x44, 0xD9, 0x8A, 0xD8, 0xAD, 0x44, 0xD9, 0x8A, 0xD8, 0xAE, 0x44, 0xD9, 0x8A, 0xD8, 0xB1, 0x44, 0xD9, 0x8A, 0xD8, 0xB2, 0x44, 0xD9, 0x8A, 0xD9, 0x85, 0x44, 0xD9, 0x8A, 0xD9, 0x86, 0x44, 0xD9, 0x8A, 0xD9, 0x87, // Bytes 2040 - 207f 0x44, 0xD9, 0x8A, 0xD9, 0x89, 0x44, 0xD9, 0x8A, 0xD9, 0x8A, 0x44, 0xD9, 0x8A, 0xD9, 0xB4, 0x44, 0xDB, 0x87, 0xD9, 0xB4, 0x45, 0x28, 0xE1, 0x84, 0x80, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x82, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x83, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x85, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x86, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x87, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x89, 0x29, 0x45, 0x28, // Bytes 2080 - 20bf 0xE1, 0x84, 0x8B, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x8C, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x8E, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x8F, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x90, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x91, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x92, 0x29, 0x45, 0x28, 0xE4, 0xB8, 0x80, 0x29, 0x45, 0x28, 0xE4, 0xB8, 0x83, 0x29, 0x45, 0x28, 0xE4, 0xB8, 0x89, 0x29, 0x45, 0x28, 0xE4, 0xB9, 0x9D, 0x29, // Bytes 20c0 - 20ff 0x45, 0x28, 0xE4, 0xBA, 0x8C, 0x29, 0x45, 0x28, 0xE4, 0xBA, 0x94, 0x29, 0x45, 0x28, 0xE4, 0xBB, 0xA3, 0x29, 0x45, 0x28, 0xE4, 0xBC, 0x81, 0x29, 0x45, 0x28, 0xE4, 0xBC, 0x91, 0x29, 0x45, 0x28, 0xE5, 0x85, 0xAB, 0x29, 0x45, 0x28, 0xE5, 0x85, 0xAD, 0x29, 0x45, 0x28, 0xE5, 0x8A, 0xB4, 0x29, 0x45, 0x28, 0xE5, 0x8D, 0x81, 0x29, 0x45, 0x28, 0xE5, 0x8D, 0x94, 0x29, 0x45, 0x28, 0xE5, 0x90, // Bytes 2100 - 213f 0x8D, 0x29, 0x45, 0x28, 0xE5, 0x91, 0xBC, 0x29, 0x45, 0x28, 0xE5, 0x9B, 0x9B, 0x29, 0x45, 0x28, 0xE5, 0x9C, 0x9F, 0x29, 0x45, 0x28, 0xE5, 0xAD, 0xA6, 0x29, 0x45, 0x28, 0xE6, 0x97, 0xA5, 0x29, 0x45, 0x28, 0xE6, 0x9C, 0x88, 0x29, 0x45, 0x28, 0xE6, 0x9C, 0x89, 0x29, 0x45, 0x28, 0xE6, 0x9C, 0xA8, 0x29, 0x45, 0x28, 0xE6, 0xA0, 0xAA, 0x29, 0x45, 0x28, 0xE6, 0xB0, 0xB4, 0x29, 0x45, 0x28, // Bytes 2140 - 217f 0xE7, 0x81, 0xAB, 0x29, 0x45, 0x28, 0xE7, 0x89, 0xB9, 0x29, 0x45, 0x28, 0xE7, 0x9B, 0xA3, 0x29, 0x45, 0x28, 0xE7, 0xA4, 0xBE, 0x29, 0x45, 0x28, 0xE7, 0xA5, 0x9D, 0x29, 0x45, 0x28, 0xE7, 0xA5, 0xAD, 0x29, 0x45, 0x28, 0xE8, 0x87, 0xAA, 0x29, 0x45, 0x28, 0xE8, 0x87, 0xB3, 0x29, 0x45, 0x28, 0xE8, 0xB2, 0xA1, 0x29, 0x45, 0x28, 0xE8, 0xB3, 0x87, 0x29, 0x45, 0x28, 0xE9, 0x87, 0x91, 0x29, // Bytes 2180 - 21bf 0x45, 0x30, 0xE2, 0x81, 0x84, 0x33, 0x45, 0x31, 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x30, 0xE6, 0x9C, 0x88, 0x45, 0x31, 0x30, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x31, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x31, 0xE6, 0x9C, 0x88, 0x45, 0x31, 0x31, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x32, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x32, 0xE6, 0x9C, 0x88, 0x45, 0x31, 0x32, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x33, 0xE6, // Bytes 21c0 - 21ff 0x97, 0xA5, 0x45, 0x31, 0x33, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x34, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x35, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x35, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x36, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x36, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x37, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x37, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x38, 0xE6, 0x97, 0xA5, 0x45, 0x31, // Bytes 2200 - 223f 0x38, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x39, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x39, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x32, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x33, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x34, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x36, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x37, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x38, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x39, // Bytes 2240 - 227f 0x45, 0x32, 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x30, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x31, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x31, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x32, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x32, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x33, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x33, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x34, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x35, 0xE6, // Bytes 2280 - 22bf 0x97, 0xA5, 0x45, 0x32, 0x36, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x37, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x38, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x39, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0xE2, 0x81, 0x84, 0x33, 0x45, 0x32, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33, 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x33, 0x31, 0xE6, 0x97, 0xA5, 0x45, 0x33, 0xE2, 0x81, 0x84, 0x34, 0x45, 0x33, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33, // Bytes 22c0 - 22ff 0xE2, 0x81, 0x84, 0x38, 0x45, 0x34, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x35, 0xE2, 0x81, 0x84, 0x36, 0x45, 0x35, 0xE2, 0x81, 0x84, 0x38, 0x45, 0x37, 0xE2, 0x81, 0x84, 0x38, 0x45, 0x41, 0xE2, 0x88, 0x95, 0x6D, 0x45, 0x56, 0xE2, 0x88, 0x95, 0x6D, 0x45, 0x6D, 0xE2, 0x88, 0x95, 0x73, 0x46, 0x31, 0xE2, 0x81, 0x84, 0x31, 0x30, 0x46, 0x43, 0xE2, 0x88, 0x95, 0x6B, 0x67, 0x46, 0x6D, 0xE2, 0x88, // Bytes 2300 - 233f 0x95, 0x73, 0x32, 0x46, 0xD8, 0xA8, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xA8, 0xD8, 0xAE, 0xD9, 0x8A, 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x89, 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8, 0xAA, 0xD8, 0xAD, 0xD8, 0xAC, 0x46, 0xD8, 0xAA, 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, 0xAE, // Bytes 2340 - 237f 0xD9, 0x89, 0x46, 0xD8, 0xAA, 0xD8, 0xAE, 0xD9, 0x8A, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAC, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAE, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD8, 0xAD, 0xD9, 0x89, 0x46, 0xD8, 0xAC, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD8, // Bytes 2380 - 23bf 0xAD, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xAD, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8, 0xAD, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAD, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB3, 0xD8, 0xAC, 0xD8, 0xAD, 0x46, 0xD8, 0xB3, 0xD8, 0xAC, 0xD9, 0x89, 0x46, 0xD8, 0xB3, 0xD8, 0xAD, 0xD8, 0xAC, 0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x89, // Bytes 23c0 - 23ff 0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x8A, 0x46, 0xD8, 0xB3, 0xD9, 0x85, 0xD8, 0xAC, 0x46, 0xD8, 0xB3, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, 0xB3, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8, 0xB4, 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD8, 0xAE, 0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD9, 0x85, 0x46, // Bytes 2400 - 243f 0xD8, 0xB5, 0xD8, 0xAD, 0xD8, 0xAD, 0x46, 0xD8, 0xB5, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xB5, 0xD9, 0x84, 0xD9, 0x89, 0x46, 0xD8, 0xB5, 0xD9, 0x84, 0xDB, 0x92, 0x46, 0xD8, 0xB5, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9, 0x89, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xB6, 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD8, 0xB7, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, // Bytes 2440 - 247f 0xB7, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB7, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB9, 0xD8, 0xAC, 0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x81, // Bytes 2480 - 24bf 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x81, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x82, 0xD9, 0x84, 0xDB, 0x92, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x83, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9, 0x83, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x84, 0xD8, 0xAC, 0xD8, 0xAC, 0x46, 0xD9, 0x84, 0xD8, // Bytes 24c0 - 24ff 0xAC, 0xD9, 0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x89, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x84, 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x84, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD9, 0x84, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD8, 0xAD, 0x46, 0xD9, 0x85, 0xD8, 0xAC, // Bytes 2500 - 253f 0xD8, 0xAE, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9, 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD8, 0xAD, 0xD8, 0xAC, 0x46, 0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD8, 0xAE, 0xD8, 0xAC, 0x46, 0xD9, 0x85, 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAE, 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD9, 0x85, 0xD9, // Bytes 2540 - 257f 0x8A, 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD8, 0xAD, 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x85, 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x89, 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x86, 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, 0x86, 0xD8, 0xAD, 0xD9, 0x89, 0x46, 0xD9, 0x86, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9, 0x8A, // Bytes 2580 - 25bf 0x46, 0xD9, 0x87, 0xD9, 0x85, 0xD8, 0xAC, 0x46, 0xD9, 0x87, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xA7, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAC, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAD, 0x46, // Bytes 25c0 - 25ff 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAE, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xB1, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xB2, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x86, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x87, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x88, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x89, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x8A, 0x46, 0xD9, // Bytes 2600 - 263f 0x8A, 0xD9, 0x94, 0xDB, 0x86, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, 0x87, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, 0x88, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, 0x90, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, 0x95, 0x46, 0xE0, 0xB9, 0x8D, 0xE0, 0xB8, 0xB2, 0x46, 0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0x99, 0x46, 0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0xA1, 0x46, 0xE0, 0xBB, 0x8D, 0xE0, 0xBA, 0xB2, 0x46, 0xE0, 0xBD, // Bytes 2640 - 267f 0x80, 0xE0, 0xBE, 0xB5, 0x46, 0xE0, 0xBD, 0x82, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x8C, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x91, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x96, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x9B, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0x90, 0xE0, 0xBE, 0xB5, 0x46, 0xE0, 0xBE, 0x92, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0x9C, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA1, // Bytes 2680 - 26bf 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA6, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xAB, 0xE0, 0xBE, 0xB7, 0x46, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0x46, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0x46, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0x46, 0xE2, 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x46, 0xE3, 0x81, 0xBB, 0xE3, 0x81, 0x8B, 0x46, 0xE3, 0x82, 0x88, 0xE3, 0x82, 0x8A, 0x46, 0xE3, 0x82, 0xAD, 0xE3, // Bytes 26c0 - 26ff 0x83, 0xAD, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x82, 0xB3, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0x88, 0x46, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x46, 0xE3, 0x83, 0x8A, 0xE3, 0x83, 0x8E, 0x46, 0xE3, 0x83, 0x9B, 0xE3, 0x83, 0xB3, 0x46, 0xE3, 0x83, 0x9F, 0xE3, 0x83, 0xAA, 0x46, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xA9, 0x46, 0xE3, 0x83, 0xAC, 0xE3, 0x83, 0xA0, 0x46, 0xE5, 0xA4, 0xA7, 0xE6, 0xAD, // Bytes 2700 - 273f 0xA3, 0x46, 0xE5, 0xB9, 0xB3, 0xE6, 0x88, 0x90, 0x46, 0xE6, 0x98, 0x8E, 0xE6, 0xB2, 0xBB, 0x46, 0xE6, 0x98, 0xAD, 0xE5, 0x92, 0x8C, 0x47, 0x72, 0x61, 0x64, 0xE2, 0x88, 0x95, 0x73, 0x47, 0xE3, 0x80, 0x94, 0x53, 0xE3, 0x80, 0x95, 0x48, 0x28, 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1, // Bytes 2740 - 277f 0x29, 0x48, 0x28, 0xE1, 0x84, 0x85, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x86, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x87, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x89, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xAE, 0x29, // Bytes 2780 - 27bf 0x48, 0x28, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x8F, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x90, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x91, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x72, 0x61, 0x64, 0xE2, 0x88, 0x95, 0x73, 0x32, 0x48, 0xD8, 0xA7, 0xD9, 0x83, 0xD8, 0xA8, 0xD8, 0xB1, 0x48, // Bytes 27c0 - 27ff 0xD8, 0xA7, 0xD9, 0x84, 0xD9, 0x84, 0xD9, 0x87, 0x48, 0xD8, 0xB1, 0xD8, 0xB3, 0xD9, 0x88, 0xD9, 0x84, 0x48, 0xD8, 0xB1, 0xDB, 0x8C, 0xD8, 0xA7, 0xD9, 0x84, 0x48, 0xD8, 0xB5, 0xD9, 0x84, 0xD8, 0xB9, 0xD9, 0x85, 0x48, 0xD8, 0xB9, 0xD9, 0x84, 0xD9, 0x8A, 0xD9, 0x87, 0x48, 0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x85, 0xD8, 0xAF, 0x48, 0xD9, 0x88, 0xD8, 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x49, 0xE2, // Bytes 2800 - 283f 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0x49, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0x49, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0x49, 0xE2, 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x49, 0xE3, 0x80, 0x94, 0xE4, 0xB8, 0x89, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE4, 0xBA, 0x8C, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE5, 0x8B, // Bytes 2840 - 287f 0x9D, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE5, 0xAE, 0x89, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE6, 0x89, 0x93, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE6, 0x95, 0x97, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE6, 0x9C, 0xAC, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE7, 0x82, 0xB9, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE7, 0x9B, 0x97, 0xE3, 0x80, 0x95, // Bytes 2880 - 28bf 0x49, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x81, 0x49, 0xE3, 0x82, 0xA6, 0xE3, 0x82, 0xA9, 0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x82, 0xAA, 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB9, 0x49, 0xE3, 0x82, 0xAA, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xA0, 0x49, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xAA, 0x49, 0xE3, 0x82, 0xB1, // Bytes 28c0 - 28ff 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xB9, 0x49, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x8A, 0x49, 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x81, 0x49, 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, 0x49, 0xE3, 0x83, 0x86, 0xE3, 0x82, 0x99, 0xE3, 0x82, 0xB7, 0x49, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x8E, 0xE3, 0x83, 0x83, 0xE3, // Bytes 2900 - 293f 0x83, 0x88, 0x49, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x84, 0x49, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xB3, 0x49, 0xE3, 0x83, 0x95, 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xBD, 0x49, 0xE3, 0x83, 0x98, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x84, 0x49, 0xE3, // Bytes 2940 - 297f 0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x83, 0x9E, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x9E, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x8F, 0x49, 0xE3, 0x83, 0x9E, 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xAF, 0x49, 0xE3, 0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0xA6, 0xE3, 0x82, // Bytes 2980 - 29bf 0xA2, 0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x83, 0xAF, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0x4C, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0x4C, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0x4C, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0xA1, 0x4C, 0xE3, 0x82, 0xA8, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xAB, 0xE3, // Bytes 29c0 - 29ff 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xB3, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x9E, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x8B, // Bytes 2a00 - 2a3f 0xE3, 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xA5, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0xA0, 0x4C, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x8D, 0x4C, 0xE3, 0x82, 0xB5, 0xE3, 0x82, 0xA4, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83, // Bytes 2a40 - 2a7f 0xBC, 0xE3, 0x82, 0xB9, 0x4C, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x84, 0x4C, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0xA3, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0x4C, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xBF, 0x4C, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, // Bytes 2a80 - 2abf 0x83, 0x8B, 0xE3, 0x83, 0x92, 0x4C, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB9, 0x4C, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x88, 0x4C, 0xE3, 0x83, 0x9E, 0xE3, 0x82, 0xA4, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAD, 0x4C, 0xE3, 0x83, 0x9F, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xB3, 0x4C, 0xE3, 0x83, 0xA1, 0xE3, 0x83, 0xBC, // Bytes 2ac0 - 2aff 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0x4C, 0xE6, 0xA0, 0xAA, 0xE5, 0xBC, 0x8F, 0xE4, 0xBC, 0x9A, 0xE7, 0xA4, 0xBE, 0x4E, 0x28, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xAE, 0x29, 0x4F, 0xD8, 0xAC, 0xD9, // Bytes 2b00 - 2b3f 0x84, 0x20, 0xD8, 0xAC, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x84, 0xD9, 0x87, 0x4F, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xA2, 0x4F, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xAF, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xB5, // Bytes 2b40 - 2b7f 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x81, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xA0, 0x4F, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAC, 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0xBF, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x83, 0x9E, // Bytes 2b80 - 2bbf 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB7, 0xE3, 0x83, 0xA7, 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xA1, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0x51, 0x28, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA5, 0xE1, 0x86, 0xAB, 0x29, 0x52, 0xE3, // Bytes 2bc0 - 2bff 0x82, 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0x52, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0xA0, 0x52, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xA1, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x52, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83, // Bytes 2c00 - 2c3f 0xA9, 0xE3, 0x83, 0xA0, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x52, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xAD, 0x52, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, 0x52, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xA2, 0xE3, 0x82, 0xB9, 0xE3, 0x83, 0x88, // Bytes 2c40 - 2c7f 0xE3, 0x83, 0xAB, 0x52, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x83, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0xA7, 0xE3, 0x83, 0xAB, 0x52, 0xE3, 0x83, 0x9F, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x52, 0xE3, 0x83, 0xAC, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0xB1, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xB3, 0x61, 0xD8, 0xB5, 0xD9, // Bytes 2c80 - 2cbf 0x84, 0xD9, 0x89, 0x20, 0xD8, 0xA7, 0xD9, 0x84, 0xD9, 0x84, 0xD9, 0x87, 0x20, 0xD8, 0xB9, 0xD9, 0x84, 0xD9, 0x8A, 0xD9, 0x87, 0x20, 0xD9, 0x88, 0xD8, 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x06, 0xE0, 0xA7, 0x87, 0xE0, 0xA6, 0xBE, 0x01, 0x06, 0xE0, 0xA7, 0x87, 0xE0, 0xA7, 0x97, 0x01, 0x06, 0xE0, 0xAD, 0x87, 0xE0, 0xAC, 0xBE, 0x01, 0x06, 0xE0, 0xAD, 0x87, 0xE0, 0xAD, 0x96, 0x01, 0x06, 0xE0, // Bytes 2cc0 - 2cff 0xAD, 0x87, 0xE0, 0xAD, 0x97, 0x01, 0x06, 0xE0, 0xAE, 0x92, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0, 0xAF, 0x86, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0, 0xAF, 0x86, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0, 0xAF, 0x87, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0, 0xB2, 0xBF, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x96, 0x01, 0x06, 0xE0, // Bytes 2d00 - 2d3f 0xB5, 0x86, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0, 0xB5, 0x86, 0xE0, 0xB5, 0x97, 0x01, 0x06, 0xE0, 0xB5, 0x87, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x9F, 0x01, 0x06, 0xE1, 0x80, 0xA5, 0xE1, 0x80, 0xAE, 0x01, 0x06, 0xE1, 0xAC, 0x85, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, 0x87, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, 0x89, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, // Bytes 2d40 - 2d7f 0xAC, 0x8B, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, 0x8D, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, 0x91, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, 0xBA, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, 0xBC, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, 0xBE, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, 0xBF, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAD, 0x82, 0xE1, 0xAC, 0xB5, 0x01, 0x08, 0xF0, // Bytes 2d80 - 2dbf 0x91, 0x84, 0xB1, 0xF0, 0x91, 0x84, 0xA7, 0x01, 0x08, 0xF0, 0x91, 0x84, 0xB2, 0xF0, 0x91, 0x84, 0xA7, 0x01, 0x08, 0xF0, 0x91, 0x8D, 0x87, 0xF0, 0x91, 0x8C, 0xBE, 0x01, 0x08, 0xF0, 0x91, 0x8D, 0x87, 0xF0, 0x91, 0x8D, 0x97, 0x01, 0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0, 0x91, 0x92, 0xB0, 0x01, 0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0, 0x91, 0x92, 0xBA, 0x01, 0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0, // Bytes 2dc0 - 2dff 0x91, 0x92, 0xBD, 0x01, 0x08, 0xF0, 0x91, 0x96, 0xB8, 0xF0, 0x91, 0x96, 0xAF, 0x01, 0x08, 0xF0, 0x91, 0x96, 0xB9, 0xF0, 0x91, 0x96, 0xAF, 0x01, 0x09, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, 0xE0, 0xB3, 0x95, 0x02, 0x09, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8F, 0xE0, 0xB7, 0x8A, 0x12, 0x44, 0x44, 0x5A, 0xCC, 0x8C, 0xC9, 0x44, 0x44, 0x7A, 0xCC, 0x8C, 0xC9, 0x44, 0x64, 0x7A, 0xCC, 0x8C, 0xC9, // Bytes 2e00 - 2e3f 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x93, 0xC9, 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x94, 0xC9, 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x95, 0xB5, 0x46, 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x85, 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x86, 0xE1, 0x85, 0xA1, 0x01, // Bytes 2e40 - 2e7f 0x46, 0xE1, 0x84, 0x87, 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x89, 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xAE, 0x01, 0x46, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x8F, 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x90, 0xE1, 0x85, 0xA1, 0x01, // Bytes 2e80 - 2ebf 0x46, 0xE1, 0x84, 0x91, 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1, 0x01, 0x49, 0xE3, 0x83, 0xA1, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x0D, 0x4C, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xAE, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xB4, 0x01, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x0D, 0x4C, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0xBC, 0xE3, 0x83, // Bytes 2ec0 - 2eff 0x9B, 0xE3, 0x82, 0x9A, 0x0D, 0x4C, 0xE3, 0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D, 0x4F, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, 0xE1, 0x86, 0xB7, 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA9, 0x01, 0x4F, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x8B, 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x0D, 0x4F, 0xE3, 0x82, 0xB7, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xB3, 0xE3, // Bytes 2f00 - 2f3f 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x0D, 0x4F, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x0D, 0x4F, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D, 0x52, 0xE3, 0x82, 0xA8, 0xE3, 0x82, 0xB9, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D, 0x52, 0xE3, 0x83, 0x95, // Bytes 2f40 - 2f7f 0xE3, 0x82, 0xA1, 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D, 0x86, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, 0x01, 0x86, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8F, 0x01, 0x03, 0x3C, 0xCC, 0xB8, 0x05, 0x03, 0x3D, 0xCC, 0xB8, 0x05, 0x03, 0x3E, 0xCC, 0xB8, 0x05, 0x03, 0x41, 0xCC, 0x80, 0xC9, 0x03, 0x41, 0xCC, 0x81, 0xC9, 0x03, 0x41, 0xCC, 0x83, 0xC9, 0x03, 0x41, // Bytes 2f80 - 2fbf 0xCC, 0x84, 0xC9, 0x03, 0x41, 0xCC, 0x89, 0xC9, 0x03, 0x41, 0xCC, 0x8C, 0xC9, 0x03, 0x41, 0xCC, 0x8F, 0xC9, 0x03, 0x41, 0xCC, 0x91, 0xC9, 0x03, 0x41, 0xCC, 0xA5, 0xB5, 0x03, 0x41, 0xCC, 0xA8, 0xA5, 0x03, 0x42, 0xCC, 0x87, 0xC9, 0x03, 0x42, 0xCC, 0xA3, 0xB5, 0x03, 0x42, 0xCC, 0xB1, 0xB5, 0x03, 0x43, 0xCC, 0x81, 0xC9, 0x03, 0x43, 0xCC, 0x82, 0xC9, 0x03, 0x43, 0xCC, 0x87, 0xC9, 0x03, // Bytes 2fc0 - 2fff 0x43, 0xCC, 0x8C, 0xC9, 0x03, 0x44, 0xCC, 0x87, 0xC9, 0x03, 0x44, 0xCC, 0x8C, 0xC9, 0x03, 0x44, 0xCC, 0xA3, 0xB5, 0x03, 0x44, 0xCC, 0xA7, 0xA5, 0x03, 0x44, 0xCC, 0xAD, 0xB5, 0x03, 0x44, 0xCC, 0xB1, 0xB5, 0x03, 0x45, 0xCC, 0x80, 0xC9, 0x03, 0x45, 0xCC, 0x81, 0xC9, 0x03, 0x45, 0xCC, 0x83, 0xC9, 0x03, 0x45, 0xCC, 0x86, 0xC9, 0x03, 0x45, 0xCC, 0x87, 0xC9, 0x03, 0x45, 0xCC, 0x88, 0xC9, // Bytes 3000 - 303f 0x03, 0x45, 0xCC, 0x89, 0xC9, 0x03, 0x45, 0xCC, 0x8C, 0xC9, 0x03, 0x45, 0xCC, 0x8F, 0xC9, 0x03, 0x45, 0xCC, 0x91, 0xC9, 0x03, 0x45, 0xCC, 0xA8, 0xA5, 0x03, 0x45, 0xCC, 0xAD, 0xB5, 0x03, 0x45, 0xCC, 0xB0, 0xB5, 0x03, 0x46, 0xCC, 0x87, 0xC9, 0x03, 0x47, 0xCC, 0x81, 0xC9, 0x03, 0x47, 0xCC, 0x82, 0xC9, 0x03, 0x47, 0xCC, 0x84, 0xC9, 0x03, 0x47, 0xCC, 0x86, 0xC9, 0x03, 0x47, 0xCC, 0x87, // Bytes 3040 - 307f 0xC9, 0x03, 0x47, 0xCC, 0x8C, 0xC9, 0x03, 0x47, 0xCC, 0xA7, 0xA5, 0x03, 0x48, 0xCC, 0x82, 0xC9, 0x03, 0x48, 0xCC, 0x87, 0xC9, 0x03, 0x48, 0xCC, 0x88, 0xC9, 0x03, 0x48, 0xCC, 0x8C, 0xC9, 0x03, 0x48, 0xCC, 0xA3, 0xB5, 0x03, 0x48, 0xCC, 0xA7, 0xA5, 0x03, 0x48, 0xCC, 0xAE, 0xB5, 0x03, 0x49, 0xCC, 0x80, 0xC9, 0x03, 0x49, 0xCC, 0x81, 0xC9, 0x03, 0x49, 0xCC, 0x82, 0xC9, 0x03, 0x49, 0xCC, // Bytes 3080 - 30bf 0x83, 0xC9, 0x03, 0x49, 0xCC, 0x84, 0xC9, 0x03, 0x49, 0xCC, 0x86, 0xC9, 0x03, 0x49, 0xCC, 0x87, 0xC9, 0x03, 0x49, 0xCC, 0x89, 0xC9, 0x03, 0x49, 0xCC, 0x8C, 0xC9, 0x03, 0x49, 0xCC, 0x8F, 0xC9, 0x03, 0x49, 0xCC, 0x91, 0xC9, 0x03, 0x49, 0xCC, 0xA3, 0xB5, 0x03, 0x49, 0xCC, 0xA8, 0xA5, 0x03, 0x49, 0xCC, 0xB0, 0xB5, 0x03, 0x4A, 0xCC, 0x82, 0xC9, 0x03, 0x4B, 0xCC, 0x81, 0xC9, 0x03, 0x4B, // Bytes 30c0 - 30ff 0xCC, 0x8C, 0xC9, 0x03, 0x4B, 0xCC, 0xA3, 0xB5, 0x03, 0x4B, 0xCC, 0xA7, 0xA5, 0x03, 0x4B, 0xCC, 0xB1, 0xB5, 0x03, 0x4C, 0xCC, 0x81, 0xC9, 0x03, 0x4C, 0xCC, 0x8C, 0xC9, 0x03, 0x4C, 0xCC, 0xA7, 0xA5, 0x03, 0x4C, 0xCC, 0xAD, 0xB5, 0x03, 0x4C, 0xCC, 0xB1, 0xB5, 0x03, 0x4D, 0xCC, 0x81, 0xC9, 0x03, 0x4D, 0xCC, 0x87, 0xC9, 0x03, 0x4D, 0xCC, 0xA3, 0xB5, 0x03, 0x4E, 0xCC, 0x80, 0xC9, 0x03, // Bytes 3100 - 313f 0x4E, 0xCC, 0x81, 0xC9, 0x03, 0x4E, 0xCC, 0x83, 0xC9, 0x03, 0x4E, 0xCC, 0x87, 0xC9, 0x03, 0x4E, 0xCC, 0x8C, 0xC9, 0x03, 0x4E, 0xCC, 0xA3, 0xB5, 0x03, 0x4E, 0xCC, 0xA7, 0xA5, 0x03, 0x4E, 0xCC, 0xAD, 0xB5, 0x03, 0x4E, 0xCC, 0xB1, 0xB5, 0x03, 0x4F, 0xCC, 0x80, 0xC9, 0x03, 0x4F, 0xCC, 0x81, 0xC9, 0x03, 0x4F, 0xCC, 0x86, 0xC9, 0x03, 0x4F, 0xCC, 0x89, 0xC9, 0x03, 0x4F, 0xCC, 0x8B, 0xC9, // Bytes 3140 - 317f 0x03, 0x4F, 0xCC, 0x8C, 0xC9, 0x03, 0x4F, 0xCC, 0x8F, 0xC9, 0x03, 0x4F, 0xCC, 0x91, 0xC9, 0x03, 0x50, 0xCC, 0x81, 0xC9, 0x03, 0x50, 0xCC, 0x87, 0xC9, 0x03, 0x52, 0xCC, 0x81, 0xC9, 0x03, 0x52, 0xCC, 0x87, 0xC9, 0x03, 0x52, 0xCC, 0x8C, 0xC9, 0x03, 0x52, 0xCC, 0x8F, 0xC9, 0x03, 0x52, 0xCC, 0x91, 0xC9, 0x03, 0x52, 0xCC, 0xA7, 0xA5, 0x03, 0x52, 0xCC, 0xB1, 0xB5, 0x03, 0x53, 0xCC, 0x82, // Bytes 3180 - 31bf 0xC9, 0x03, 0x53, 0xCC, 0x87, 0xC9, 0x03, 0x53, 0xCC, 0xA6, 0xB5, 0x03, 0x53, 0xCC, 0xA7, 0xA5, 0x03, 0x54, 0xCC, 0x87, 0xC9, 0x03, 0x54, 0xCC, 0x8C, 0xC9, 0x03, 0x54, 0xCC, 0xA3, 0xB5, 0x03, 0x54, 0xCC, 0xA6, 0xB5, 0x03, 0x54, 0xCC, 0xA7, 0xA5, 0x03, 0x54, 0xCC, 0xAD, 0xB5, 0x03, 0x54, 0xCC, 0xB1, 0xB5, 0x03, 0x55, 0xCC, 0x80, 0xC9, 0x03, 0x55, 0xCC, 0x81, 0xC9, 0x03, 0x55, 0xCC, // Bytes 31c0 - 31ff 0x82, 0xC9, 0x03, 0x55, 0xCC, 0x86, 0xC9, 0x03, 0x55, 0xCC, 0x89, 0xC9, 0x03, 0x55, 0xCC, 0x8A, 0xC9, 0x03, 0x55, 0xCC, 0x8B, 0xC9, 0x03, 0x55, 0xCC, 0x8C, 0xC9, 0x03, 0x55, 0xCC, 0x8F, 0xC9, 0x03, 0x55, 0xCC, 0x91, 0xC9, 0x03, 0x55, 0xCC, 0xA3, 0xB5, 0x03, 0x55, 0xCC, 0xA4, 0xB5, 0x03, 0x55, 0xCC, 0xA8, 0xA5, 0x03, 0x55, 0xCC, 0xAD, 0xB5, 0x03, 0x55, 0xCC, 0xB0, 0xB5, 0x03, 0x56, // Bytes 3200 - 323f 0xCC, 0x83, 0xC9, 0x03, 0x56, 0xCC, 0xA3, 0xB5, 0x03, 0x57, 0xCC, 0x80, 0xC9, 0x03, 0x57, 0xCC, 0x81, 0xC9, 0x03, 0x57, 0xCC, 0x82, 0xC9, 0x03, 0x57, 0xCC, 0x87, 0xC9, 0x03, 0x57, 0xCC, 0x88, 0xC9, 0x03, 0x57, 0xCC, 0xA3, 0xB5, 0x03, 0x58, 0xCC, 0x87, 0xC9, 0x03, 0x58, 0xCC, 0x88, 0xC9, 0x03, 0x59, 0xCC, 0x80, 0xC9, 0x03, 0x59, 0xCC, 0x81, 0xC9, 0x03, 0x59, 0xCC, 0x82, 0xC9, 0x03, // Bytes 3240 - 327f 0x59, 0xCC, 0x83, 0xC9, 0x03, 0x59, 0xCC, 0x84, 0xC9, 0x03, 0x59, 0xCC, 0x87, 0xC9, 0x03, 0x59, 0xCC, 0x88, 0xC9, 0x03, 0x59, 0xCC, 0x89, 0xC9, 0x03, 0x59, 0xCC, 0xA3, 0xB5, 0x03, 0x5A, 0xCC, 0x81, 0xC9, 0x03, 0x5A, 0xCC, 0x82, 0xC9, 0x03, 0x5A, 0xCC, 0x87, 0xC9, 0x03, 0x5A, 0xCC, 0x8C, 0xC9, 0x03, 0x5A, 0xCC, 0xA3, 0xB5, 0x03, 0x5A, 0xCC, 0xB1, 0xB5, 0x03, 0x61, 0xCC, 0x80, 0xC9, // Bytes 3280 - 32bf 0x03, 0x61, 0xCC, 0x81, 0xC9, 0x03, 0x61, 0xCC, 0x83, 0xC9, 0x03, 0x61, 0xCC, 0x84, 0xC9, 0x03, 0x61, 0xCC, 0x89, 0xC9, 0x03, 0x61, 0xCC, 0x8C, 0xC9, 0x03, 0x61, 0xCC, 0x8F, 0xC9, 0x03, 0x61, 0xCC, 0x91, 0xC9, 0x03, 0x61, 0xCC, 0xA5, 0xB5, 0x03, 0x61, 0xCC, 0xA8, 0xA5, 0x03, 0x62, 0xCC, 0x87, 0xC9, 0x03, 0x62, 0xCC, 0xA3, 0xB5, 0x03, 0x62, 0xCC, 0xB1, 0xB5, 0x03, 0x63, 0xCC, 0x81, // Bytes 32c0 - 32ff 0xC9, 0x03, 0x63, 0xCC, 0x82, 0xC9, 0x03, 0x63, 0xCC, 0x87, 0xC9, 0x03, 0x63, 0xCC, 0x8C, 0xC9, 0x03, 0x64, 0xCC, 0x87, 0xC9, 0x03, 0x64, 0xCC, 0x8C, 0xC9, 0x03, 0x64, 0xCC, 0xA3, 0xB5, 0x03, 0x64, 0xCC, 0xA7, 0xA5, 0x03, 0x64, 0xCC, 0xAD, 0xB5, 0x03, 0x64, 0xCC, 0xB1, 0xB5, 0x03, 0x65, 0xCC, 0x80, 0xC9, 0x03, 0x65, 0xCC, 0x81, 0xC9, 0x03, 0x65, 0xCC, 0x83, 0xC9, 0x03, 0x65, 0xCC, // Bytes 3300 - 333f 0x86, 0xC9, 0x03, 0x65, 0xCC, 0x87, 0xC9, 0x03, 0x65, 0xCC, 0x88, 0xC9, 0x03, 0x65, 0xCC, 0x89, 0xC9, 0x03, 0x65, 0xCC, 0x8C, 0xC9, 0x03, 0x65, 0xCC, 0x8F, 0xC9, 0x03, 0x65, 0xCC, 0x91, 0xC9, 0x03, 0x65, 0xCC, 0xA8, 0xA5, 0x03, 0x65, 0xCC, 0xAD, 0xB5, 0x03, 0x65, 0xCC, 0xB0, 0xB5, 0x03, 0x66, 0xCC, 0x87, 0xC9, 0x03, 0x67, 0xCC, 0x81, 0xC9, 0x03, 0x67, 0xCC, 0x82, 0xC9, 0x03, 0x67, // Bytes 3340 - 337f 0xCC, 0x84, 0xC9, 0x03, 0x67, 0xCC, 0x86, 0xC9, 0x03, 0x67, 0xCC, 0x87, 0xC9, 0x03, 0x67, 0xCC, 0x8C, 0xC9, 0x03, 0x67, 0xCC, 0xA7, 0xA5, 0x03, 0x68, 0xCC, 0x82, 0xC9, 0x03, 0x68, 0xCC, 0x87, 0xC9, 0x03, 0x68, 0xCC, 0x88, 0xC9, 0x03, 0x68, 0xCC, 0x8C, 0xC9, 0x03, 0x68, 0xCC, 0xA3, 0xB5, 0x03, 0x68, 0xCC, 0xA7, 0xA5, 0x03, 0x68, 0xCC, 0xAE, 0xB5, 0x03, 0x68, 0xCC, 0xB1, 0xB5, 0x03, // Bytes 3380 - 33bf 0x69, 0xCC, 0x80, 0xC9, 0x03, 0x69, 0xCC, 0x81, 0xC9, 0x03, 0x69, 0xCC, 0x82, 0xC9, 0x03, 0x69, 0xCC, 0x83, 0xC9, 0x03, 0x69, 0xCC, 0x84, 0xC9, 0x03, 0x69, 0xCC, 0x86, 0xC9, 0x03, 0x69, 0xCC, 0x89, 0xC9, 0x03, 0x69, 0xCC, 0x8C, 0xC9, 0x03, 0x69, 0xCC, 0x8F, 0xC9, 0x03, 0x69, 0xCC, 0x91, 0xC9, 0x03, 0x69, 0xCC, 0xA3, 0xB5, 0x03, 0x69, 0xCC, 0xA8, 0xA5, 0x03, 0x69, 0xCC, 0xB0, 0xB5, // Bytes 33c0 - 33ff 0x03, 0x6A, 0xCC, 0x82, 0xC9, 0x03, 0x6A, 0xCC, 0x8C, 0xC9, 0x03, 0x6B, 0xCC, 0x81, 0xC9, 0x03, 0x6B, 0xCC, 0x8C, 0xC9, 0x03, 0x6B, 0xCC, 0xA3, 0xB5, 0x03, 0x6B, 0xCC, 0xA7, 0xA5, 0x03, 0x6B, 0xCC, 0xB1, 0xB5, 0x03, 0x6C, 0xCC, 0x81, 0xC9, 0x03, 0x6C, 0xCC, 0x8C, 0xC9, 0x03, 0x6C, 0xCC, 0xA7, 0xA5, 0x03, 0x6C, 0xCC, 0xAD, 0xB5, 0x03, 0x6C, 0xCC, 0xB1, 0xB5, 0x03, 0x6D, 0xCC, 0x81, // Bytes 3400 - 343f 0xC9, 0x03, 0x6D, 0xCC, 0x87, 0xC9, 0x03, 0x6D, 0xCC, 0xA3, 0xB5, 0x03, 0x6E, 0xCC, 0x80, 0xC9, 0x03, 0x6E, 0xCC, 0x81, 0xC9, 0x03, 0x6E, 0xCC, 0x83, 0xC9, 0x03, 0x6E, 0xCC, 0x87, 0xC9, 0x03, 0x6E, 0xCC, 0x8C, 0xC9, 0x03, 0x6E, 0xCC, 0xA3, 0xB5, 0x03, 0x6E, 0xCC, 0xA7, 0xA5, 0x03, 0x6E, 0xCC, 0xAD, 0xB5, 0x03, 0x6E, 0xCC, 0xB1, 0xB5, 0x03, 0x6F, 0xCC, 0x80, 0xC9, 0x03, 0x6F, 0xCC, // Bytes 3440 - 347f 0x81, 0xC9, 0x03, 0x6F, 0xCC, 0x86, 0xC9, 0x03, 0x6F, 0xCC, 0x89, 0xC9, 0x03, 0x6F, 0xCC, 0x8B, 0xC9, 0x03, 0x6F, 0xCC, 0x8C, 0xC9, 0x03, 0x6F, 0xCC, 0x8F, 0xC9, 0x03, 0x6F, 0xCC, 0x91, 0xC9, 0x03, 0x70, 0xCC, 0x81, 0xC9, 0x03, 0x70, 0xCC, 0x87, 0xC9, 0x03, 0x72, 0xCC, 0x81, 0xC9, 0x03, 0x72, 0xCC, 0x87, 0xC9, 0x03, 0x72, 0xCC, 0x8C, 0xC9, 0x03, 0x72, 0xCC, 0x8F, 0xC9, 0x03, 0x72, // Bytes 3480 - 34bf 0xCC, 0x91, 0xC9, 0x03, 0x72, 0xCC, 0xA7, 0xA5, 0x03, 0x72, 0xCC, 0xB1, 0xB5, 0x03, 0x73, 0xCC, 0x82, 0xC9, 0x03, 0x73, 0xCC, 0x87, 0xC9, 0x03, 0x73, 0xCC, 0xA6, 0xB5, 0x03, 0x73, 0xCC, 0xA7, 0xA5, 0x03, 0x74, 0xCC, 0x87, 0xC9, 0x03, 0x74, 0xCC, 0x88, 0xC9, 0x03, 0x74, 0xCC, 0x8C, 0xC9, 0x03, 0x74, 0xCC, 0xA3, 0xB5, 0x03, 0x74, 0xCC, 0xA6, 0xB5, 0x03, 0x74, 0xCC, 0xA7, 0xA5, 0x03, // Bytes 34c0 - 34ff 0x74, 0xCC, 0xAD, 0xB5, 0x03, 0x74, 0xCC, 0xB1, 0xB5, 0x03, 0x75, 0xCC, 0x80, 0xC9, 0x03, 0x75, 0xCC, 0x81, 0xC9, 0x03, 0x75, 0xCC, 0x82, 0xC9, 0x03, 0x75, 0xCC, 0x86, 0xC9, 0x03, 0x75, 0xCC, 0x89, 0xC9, 0x03, 0x75, 0xCC, 0x8A, 0xC9, 0x03, 0x75, 0xCC, 0x8B, 0xC9, 0x03, 0x75, 0xCC, 0x8C, 0xC9, 0x03, 0x75, 0xCC, 0x8F, 0xC9, 0x03, 0x75, 0xCC, 0x91, 0xC9, 0x03, 0x75, 0xCC, 0xA3, 0xB5, // Bytes 3500 - 353f 0x03, 0x75, 0xCC, 0xA4, 0xB5, 0x03, 0x75, 0xCC, 0xA8, 0xA5, 0x03, 0x75, 0xCC, 0xAD, 0xB5, 0x03, 0x75, 0xCC, 0xB0, 0xB5, 0x03, 0x76, 0xCC, 0x83, 0xC9, 0x03, 0x76, 0xCC, 0xA3, 0xB5, 0x03, 0x77, 0xCC, 0x80, 0xC9, 0x03, 0x77, 0xCC, 0x81, 0xC9, 0x03, 0x77, 0xCC, 0x82, 0xC9, 0x03, 0x77, 0xCC, 0x87, 0xC9, 0x03, 0x77, 0xCC, 0x88, 0xC9, 0x03, 0x77, 0xCC, 0x8A, 0xC9, 0x03, 0x77, 0xCC, 0xA3, // Bytes 3540 - 357f 0xB5, 0x03, 0x78, 0xCC, 0x87, 0xC9, 0x03, 0x78, 0xCC, 0x88, 0xC9, 0x03, 0x79, 0xCC, 0x80, 0xC9, 0x03, 0x79, 0xCC, 0x81, 0xC9, 0x03, 0x79, 0xCC, 0x82, 0xC9, 0x03, 0x79, 0xCC, 0x83, 0xC9, 0x03, 0x79, 0xCC, 0x84, 0xC9, 0x03, 0x79, 0xCC, 0x87, 0xC9, 0x03, 0x79, 0xCC, 0x88, 0xC9, 0x03, 0x79, 0xCC, 0x89, 0xC9, 0x03, 0x79, 0xCC, 0x8A, 0xC9, 0x03, 0x79, 0xCC, 0xA3, 0xB5, 0x03, 0x7A, 0xCC, // Bytes 3580 - 35bf 0x81, 0xC9, 0x03, 0x7A, 0xCC, 0x82, 0xC9, 0x03, 0x7A, 0xCC, 0x87, 0xC9, 0x03, 0x7A, 0xCC, 0x8C, 0xC9, 0x03, 0x7A, 0xCC, 0xA3, 0xB5, 0x03, 0x7A, 0xCC, 0xB1, 0xB5, 0x04, 0xC2, 0xA8, 0xCC, 0x80, 0xCA, 0x04, 0xC2, 0xA8, 0xCC, 0x81, 0xCA, 0x04, 0xC2, 0xA8, 0xCD, 0x82, 0xCA, 0x04, 0xC3, 0x86, 0xCC, 0x81, 0xC9, 0x04, 0xC3, 0x86, 0xCC, 0x84, 0xC9, 0x04, 0xC3, 0x98, 0xCC, 0x81, 0xC9, 0x04, // Bytes 35c0 - 35ff 0xC3, 0xA6, 0xCC, 0x81, 0xC9, 0x04, 0xC3, 0xA6, 0xCC, 0x84, 0xC9, 0x04, 0xC3, 0xB8, 0xCC, 0x81, 0xC9, 0x04, 0xC5, 0xBF, 0xCC, 0x87, 0xC9, 0x04, 0xC6, 0xB7, 0xCC, 0x8C, 0xC9, 0x04, 0xCA, 0x92, 0xCC, 0x8C, 0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x86, 0xC9, 0x04, 0xCE, 0x91, 0xCD, 0x85, // Bytes 3600 - 363f 0xD9, 0x04, 0xCE, 0x95, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x95, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x97, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x97, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x97, 0xCD, 0x85, 0xD9, 0x04, 0xCE, 0x99, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x86, 0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x88, 0xC9, 0x04, 0xCE, 0x9F, // Bytes 3640 - 367f 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x9F, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xA1, 0xCC, 0x94, 0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x86, 0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x88, 0xC9, 0x04, 0xCE, 0xA9, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xA9, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xA9, 0xCD, 0x85, 0xD9, 0x04, // Bytes 3680 - 36bf 0xCE, 0xB1, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0xB1, 0xCC, 0x86, 0xC9, 0x04, 0xCE, 0xB1, 0xCD, 0x85, 0xD9, 0x04, 0xCE, 0xB5, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xB5, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xB7, 0xCD, 0x85, 0xD9, 0x04, 0xCE, 0xB9, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xB9, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xB9, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0xB9, 0xCC, 0x86, 0xC9, 0x04, 0xCE, 0xB9, 0xCD, 0x82, // Bytes 36c0 - 36ff 0xC9, 0x04, 0xCE, 0xBF, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xBF, 0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x81, 0xCC, 0x93, 0xC9, 0x04, 0xCF, 0x81, 0xCC, 0x94, 0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x80, 0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x84, 0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x86, 0xC9, 0x04, 0xCF, 0x85, 0xCD, 0x82, 0xC9, 0x04, 0xCF, 0x89, 0xCD, 0x85, 0xD9, 0x04, 0xCF, 0x92, // Bytes 3700 - 373f 0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x92, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x86, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x90, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x90, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x93, 0xCC, 0x81, 0xC9, 0x04, 0xD0, 0x95, 0xCC, 0x80, 0xC9, 0x04, 0xD0, 0x95, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x95, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x96, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x96, 0xCC, 0x88, 0xC9, 0x04, // Bytes 3740 - 377f 0xD0, 0x97, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x80, 0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x84, 0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x9A, 0xCC, 0x81, 0xC9, 0x04, 0xD0, 0x9E, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x84, 0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x8B, // Bytes 3780 - 37bf 0xC9, 0x04, 0xD0, 0xA7, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xAB, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xAD, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB0, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB0, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB3, 0xCC, 0x81, 0xC9, 0x04, 0xD0, 0xB5, 0xCC, 0x80, 0xC9, 0x04, 0xD0, 0xB5, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB5, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB6, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB6, // Bytes 37c0 - 37ff 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB7, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x80, 0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x84, 0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xBA, 0xCC, 0x81, 0xC9, 0x04, 0xD0, 0xBE, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x83, 0xCC, 0x84, 0xC9, 0x04, 0xD1, 0x83, 0xCC, 0x86, 0xC9, 0x04, 0xD1, 0x83, 0xCC, 0x88, 0xC9, 0x04, // Bytes 3800 - 383f 0xD1, 0x83, 0xCC, 0x8B, 0xC9, 0x04, 0xD1, 0x87, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x8B, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x8D, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x96, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0xB4, 0xCC, 0x8F, 0xC9, 0x04, 0xD1, 0xB5, 0xCC, 0x8F, 0xC9, 0x04, 0xD3, 0x98, 0xCC, 0x88, 0xC9, 0x04, 0xD3, 0x99, 0xCC, 0x88, 0xC9, 0x04, 0xD3, 0xA8, 0xCC, 0x88, 0xC9, 0x04, 0xD3, 0xA9, 0xCC, 0x88, // Bytes 3840 - 387f 0xC9, 0x04, 0xD8, 0xA7, 0xD9, 0x93, 0xC9, 0x04, 0xD8, 0xA7, 0xD9, 0x94, 0xC9, 0x04, 0xD8, 0xA7, 0xD9, 0x95, 0xB5, 0x04, 0xD9, 0x88, 0xD9, 0x94, 0xC9, 0x04, 0xD9, 0x8A, 0xD9, 0x94, 0xC9, 0x04, 0xDB, 0x81, 0xD9, 0x94, 0xC9, 0x04, 0xDB, 0x92, 0xD9, 0x94, 0xC9, 0x04, 0xDB, 0x95, 0xD9, 0x94, 0xC9, 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, // Bytes 3880 - 38bf 0x41, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x41, 0xCC, 0x86, 0xCC, 0x80, 0xCA, 0x05, 0x41, 0xCC, 0x86, 0xCC, 0x81, 0xCA, 0x05, 0x41, 0xCC, 0x86, 0xCC, 0x83, 0xCA, 0x05, 0x41, 0xCC, 0x86, 0xCC, 0x89, 0xCA, 0x05, 0x41, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05, 0x41, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x41, 0xCC, 0x8A, 0xCC, 0x81, 0xCA, 0x05, 0x41, // Bytes 38c0 - 38ff 0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x41, 0xCC, 0xA3, 0xCC, 0x86, 0xCA, 0x05, 0x43, 0xCC, 0xA7, 0xCC, 0x81, 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x45, 0xCC, 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x45, 0xCC, 0x84, 0xCC, 0x81, 0xCA, 0x05, 0x45, 0xCC, // Bytes 3900 - 393f 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x45, 0xCC, 0xA7, 0xCC, 0x86, 0xCA, 0x05, 0x49, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05, 0x4C, 0xCC, 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x4F, 0xCC, 0x83, 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x83, // Bytes 3940 - 397f 0xCC, 0x84, 0xCA, 0x05, 0x4F, 0xCC, 0x83, 0xCC, 0x88, 0xCA, 0x05, 0x4F, 0xCC, 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x4F, 0xCC, 0x84, 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05, 0x4F, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, 0x83, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, // Bytes 3980 - 39bf 0x89, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6, 0x05, 0x4F, 0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x4F, 0xCC, 0xA8, 0xCC, 0x84, 0xCA, 0x05, 0x52, 0xCC, 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x53, 0xCC, 0x81, 0xCC, 0x87, 0xCA, 0x05, 0x53, 0xCC, 0x8C, 0xCC, 0x87, 0xCA, 0x05, 0x53, 0xCC, 0xA3, 0xCC, 0x87, 0xCA, 0x05, 0x55, 0xCC, 0x83, 0xCC, 0x81, 0xCA, 0x05, 0x55, 0xCC, 0x84, 0xCC, 0x88, // Bytes 39c0 - 39ff 0xCA, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x80, 0xCA, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x8C, 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0x81, 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0x83, 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0x89, 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6, // Bytes 3a00 - 3a3f 0x05, 0x61, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05, 0x61, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x61, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x61, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x80, 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x81, 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x83, 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x89, 0xCA, 0x05, 0x61, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05, // Bytes 3a40 - 3a7f 0x61, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x61, 0xCC, 0x8A, 0xCC, 0x81, 0xCA, 0x05, 0x61, 0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x61, 0xCC, 0xA3, 0xCC, 0x86, 0xCA, 0x05, 0x63, 0xCC, 0xA7, 0xCC, 0x81, 0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x65, // Bytes 3a80 - 3abf 0xCC, 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x65, 0xCC, 0x84, 0xCC, 0x81, 0xCA, 0x05, 0x65, 0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x65, 0xCC, 0xA7, 0xCC, 0x86, 0xCA, 0x05, 0x69, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05, 0x6C, 0xCC, 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x6F, 0xCC, // Bytes 3ac0 - 3aff 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x6F, 0xCC, 0x83, 0xCC, 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x83, 0xCC, 0x84, 0xCA, 0x05, 0x6F, 0xCC, 0x83, 0xCC, 0x88, 0xCA, 0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05, 0x6F, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, // Bytes 3b00 - 3b3f 0xCC, 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0x83, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0x89, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6, 0x05, 0x6F, 0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x6F, 0xCC, 0xA8, 0xCC, 0x84, 0xCA, 0x05, 0x72, 0xCC, 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x73, 0xCC, 0x81, 0xCC, 0x87, 0xCA, 0x05, 0x73, 0xCC, 0x8C, 0xCC, 0x87, 0xCA, 0x05, 0x73, 0xCC, 0xA3, 0xCC, // Bytes 3b40 - 3b7f 0x87, 0xCA, 0x05, 0x75, 0xCC, 0x83, 0xCC, 0x81, 0xCA, 0x05, 0x75, 0xCC, 0x84, 0xCC, 0x88, 0xCA, 0x05, 0x75, 0xCC, 0x88, 0xCC, 0x80, 0xCA, 0x05, 0x75, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05, 0x75, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x75, 0xCC, 0x88, 0xCC, 0x8C, 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x81, 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x83, // Bytes 3b80 - 3bbf 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x89, 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6, 0x05, 0xE1, 0xBE, 0xBF, 0xCC, 0x80, 0xCA, 0x05, 0xE1, 0xBE, 0xBF, 0xCC, 0x81, 0xCA, 0x05, 0xE1, 0xBE, 0xBF, 0xCD, 0x82, 0xCA, 0x05, 0xE1, 0xBF, 0xBE, 0xCC, 0x80, 0xCA, 0x05, 0xE1, 0xBF, 0xBE, 0xCC, 0x81, 0xCA, 0x05, 0xE1, 0xBF, 0xBE, 0xCD, 0x82, 0xCA, 0x05, 0xE2, 0x86, 0x90, 0xCC, 0xB8, 0x05, // Bytes 3bc0 - 3bff 0x05, 0xE2, 0x86, 0x92, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x86, 0x94, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87, 0x90, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87, 0x92, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87, 0x94, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x88, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x8B, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0xA3, 0xCC, 0xB8, 0x05, 0x05, // Bytes 3c00 - 3c3f 0xE2, 0x88, 0xA5, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0xBC, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x85, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x88, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x8D, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xA1, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xA4, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xA5, 0xCC, 0xB8, 0x05, 0x05, 0xE2, // Bytes 3c40 - 3c7f 0x89, 0xB2, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB3, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB6, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB7, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBA, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBB, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBC, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBD, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x82, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, // Bytes 3c80 - 3cbf 0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x86, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x87, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x91, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x92, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xA2, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xA8, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xA9, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xAB, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB2, // Bytes 3cc0 - 3cff 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB3, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB4, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB5, 0xCC, 0xB8, 0x05, 0x06, 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x80, 0xCA, // Bytes 3d00 - 3d3f 0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x81, 0xCA, // Bytes 3d40 - 3d7f 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCD, 0x82, 0xCA, // Bytes 3d80 - 3dbf 0x06, 0xCE, 0xA9, 0xCC, 0x93, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xA9, 0xCC, 0x94, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB1, 0xCC, 0x80, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB1, 0xCC, 0x81, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB1, 0xCD, 0x82, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x80, 0xCA, // Bytes 3dc0 - 3dff 0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xB7, 0xCC, 0x80, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB7, 0xCC, 0x81, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB7, 0xCC, 0x94, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB7, 0xCD, 0x82, 0xCD, 0x85, 0xDA, // Bytes 3e00 - 3e3f 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCD, 0x82, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x81, 0xCA, // Bytes 3e40 - 3e7f 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x80, 0xCA, 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCD, 0x82, 0xCA, // Bytes 3e80 - 3ebf 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x06, 0xCF, 0x89, 0xCC, 0x80, 0xCD, 0x85, 0xDA, 0x06, 0xCF, 0x89, 0xCC, 0x81, 0xCD, 0x85, 0xDA, // Bytes 3ec0 - 3eff 0x06, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x85, 0xDA, 0x06, 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x85, 0xDA, 0x06, 0xCF, 0x89, 0xCD, 0x82, 0xCD, 0x85, 0xDA, 0x06, 0xE0, 0xA4, 0xA8, 0xE0, 0xA4, 0xBC, 0x09, 0x06, 0xE0, 0xA4, 0xB0, 0xE0, 0xA4, 0xBC, 0x09, 0x06, 0xE0, 0xA4, 0xB3, 0xE0, 0xA4, 0xBC, 0x09, 0x06, 0xE0, 0xB1, 0x86, 0xE0, 0xB1, 0x96, 0x85, 0x06, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8A, 0x11, // Bytes 3f00 - 3f3f 0x06, 0xE3, 0x81, 0x86, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x8B, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x8D, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x8F, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x91, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x93, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x95, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x97, 0xE3, 0x82, 0x99, 0x0D, // Bytes 3f40 - 3f7f 0x06, 0xE3, 0x81, 0x99, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x9D, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x9F, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xA1, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xA4, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xA6, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xA8, 0xE3, 0x82, 0x99, 0x0D, // Bytes 3f80 - 3fbf 0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x9A, 0x0D, // Bytes 3fc0 - 3fff 0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x82, 0x9D, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xA6, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xB1, 0xE3, 0x82, 0x99, 0x0D, // Bytes 4000 - 403f 0x06, 0xE3, 0x82, 0xB3, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xB5, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xB9, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xBD, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x81, 0xE3, 0x82, 0x99, 0x0D, // Bytes 4040 - 407f 0x06, 0xE3, 0x83, 0x84, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x86, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x99, 0x0D, // Bytes 4080 - 40bf 0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x83, 0xAF, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0xB0, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0xB1, 0xE3, 0x82, 0x99, 0x0D, // Bytes 40c0 - 40ff 0x06, 0xE3, 0x83, 0xB2, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0xBD, 0xE3, 0x82, 0x99, 0x0D, 0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCD, // Bytes 4100 - 413f 0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, // Bytes 4140 - 417f 0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCD, // Bytes 4180 - 41bf 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB, // Bytes 41c0 - 41ff 0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, // Bytes 4200 - 423f 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xF0, 0x91, 0x82, 0x99, 0xF0, 0x91, 0x82, // Bytes 4240 - 427f 0xBA, 0x09, 0x08, 0xF0, 0x91, 0x82, 0x9B, 0xF0, 0x91, 0x82, 0xBA, 0x09, 0x08, 0xF0, 0x91, 0x82, 0xA5, 0xF0, 0x91, 0x82, 0xBA, 0x09, 0x42, 0xC2, 0xB4, 0x01, 0x43, 0x20, 0xCC, 0x81, 0xC9, 0x43, 0x20, 0xCC, 0x83, 0xC9, 0x43, 0x20, 0xCC, 0x84, 0xC9, 0x43, 0x20, 0xCC, 0x85, 0xC9, 0x43, 0x20, 0xCC, 0x86, 0xC9, 0x43, 0x20, 0xCC, 0x87, 0xC9, 0x43, 0x20, 0xCC, 0x88, 0xC9, 0x43, 0x20, 0xCC, // Bytes 4280 - 42bf 0x8A, 0xC9, 0x43, 0x20, 0xCC, 0x8B, 0xC9, 0x43, 0x20, 0xCC, 0x93, 0xC9, 0x43, 0x20, 0xCC, 0x94, 0xC9, 0x43, 0x20, 0xCC, 0xA7, 0xA5, 0x43, 0x20, 0xCC, 0xA8, 0xA5, 0x43, 0x20, 0xCC, 0xB3, 0xB5, 0x43, 0x20, 0xCD, 0x82, 0xC9, 0x43, 0x20, 0xCD, 0x85, 0xD9, 0x43, 0x20, 0xD9, 0x8B, 0x59, 0x43, 0x20, 0xD9, 0x8C, 0x5D, 0x43, 0x20, 0xD9, 0x8D, 0x61, 0x43, 0x20, 0xD9, 0x8E, 0x65, 0x43, 0x20, // Bytes 42c0 - 42ff 0xD9, 0x8F, 0x69, 0x43, 0x20, 0xD9, 0x90, 0x6D, 0x43, 0x20, 0xD9, 0x91, 0x71, 0x43, 0x20, 0xD9, 0x92, 0x75, 0x43, 0x41, 0xCC, 0x8A, 0xC9, 0x43, 0x73, 0xCC, 0x87, 0xC9, 0x44, 0x20, 0xE3, 0x82, 0x99, 0x0D, 0x44, 0x20, 0xE3, 0x82, 0x9A, 0x0D, 0x44, 0xC2, 0xA8, 0xCC, 0x81, 0xCA, 0x44, 0xCE, 0x91, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0x95, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0x97, 0xCC, 0x81, 0xC9, // Bytes 4300 - 433f 0x44, 0xCE, 0x99, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0x9F, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xA5, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xA5, 0xCC, 0x88, 0xC9, 0x44, 0xCE, 0xA9, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xB1, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xB5, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xB7, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xB9, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xBF, 0xCC, 0x81, 0xC9, 0x44, 0xCF, 0x85, 0xCC, // Bytes 4340 - 437f 0x81, 0xC9, 0x44, 0xCF, 0x89, 0xCC, 0x81, 0xC9, 0x44, 0xD7, 0x90, 0xD6, 0xB7, 0x31, 0x44, 0xD7, 0x90, 0xD6, 0xB8, 0x35, 0x44, 0xD7, 0x90, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x91, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x91, 0xD6, 0xBF, 0x49, 0x44, 0xD7, 0x92, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x93, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x94, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x95, 0xD6, 0xB9, 0x39, 0x44, 0xD7, // Bytes 4380 - 43bf 0x95, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x96, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x98, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x99, 0xD6, 0xB4, 0x25, 0x44, 0xD7, 0x99, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9A, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9B, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9B, 0xD6, 0xBF, 0x49, 0x44, 0xD7, 0x9C, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9E, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA0, 0xD6, 0xBC, 0x41, // Bytes 43c0 - 43ff 0x44, 0xD7, 0xA1, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA3, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA4, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA4, 0xD6, 0xBF, 0x49, 0x44, 0xD7, 0xA6, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA7, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA8, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA9, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA9, 0xD7, 0x81, 0x4D, 0x44, 0xD7, 0xA9, 0xD7, 0x82, 0x51, 0x44, 0xD7, 0xAA, 0xD6, // Bytes 4400 - 443f 0xBC, 0x41, 0x44, 0xD7, 0xB2, 0xD6, 0xB7, 0x31, 0x44, 0xD8, 0xA7, 0xD9, 0x8B, 0x59, 0x44, 0xD8, 0xA7, 0xD9, 0x93, 0xC9, 0x44, 0xD8, 0xA7, 0xD9, 0x94, 0xC9, 0x44, 0xD8, 0xA7, 0xD9, 0x95, 0xB5, 0x44, 0xD8, 0xB0, 0xD9, 0xB0, 0x79, 0x44, 0xD8, 0xB1, 0xD9, 0xB0, 0x79, 0x44, 0xD9, 0x80, 0xD9, 0x8B, 0x59, 0x44, 0xD9, 0x80, 0xD9, 0x8E, 0x65, 0x44, 0xD9, 0x80, 0xD9, 0x8F, 0x69, 0x44, 0xD9, // Bytes 4440 - 447f 0x80, 0xD9, 0x90, 0x6D, 0x44, 0xD9, 0x80, 0xD9, 0x91, 0x71, 0x44, 0xD9, 0x80, 0xD9, 0x92, 0x75, 0x44, 0xD9, 0x87, 0xD9, 0xB0, 0x79, 0x44, 0xD9, 0x88, 0xD9, 0x94, 0xC9, 0x44, 0xD9, 0x89, 0xD9, 0xB0, 0x79, 0x44, 0xD9, 0x8A, 0xD9, 0x94, 0xC9, 0x44, 0xDB, 0x92, 0xD9, 0x94, 0xC9, 0x44, 0xDB, 0x95, 0xD9, 0x94, 0xC9, 0x45, 0x20, 0xCC, 0x88, 0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC, 0x88, 0xCC, // Bytes 4480 - 44bf 0x81, 0xCA, 0x45, 0x20, 0xCC, 0x88, 0xCD, 0x82, 0xCA, 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x45, 0x20, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x45, 0x20, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x45, 0x20, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x45, 0x20, 0xD9, 0x8C, 0xD9, 0x91, 0x72, 0x45, 0x20, 0xD9, 0x8D, 0xD9, 0x91, // Bytes 44c0 - 44ff 0x72, 0x45, 0x20, 0xD9, 0x8E, 0xD9, 0x91, 0x72, 0x45, 0x20, 0xD9, 0x8F, 0xD9, 0x91, 0x72, 0x45, 0x20, 0xD9, 0x90, 0xD9, 0x91, 0x72, 0x45, 0x20, 0xD9, 0x91, 0xD9, 0xB0, 0x7A, 0x45, 0xE2, 0xAB, 0x9D, 0xCC, 0xB8, 0x05, 0x46, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x46, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x46, 0xD7, 0xA9, 0xD6, 0xBC, 0xD7, 0x81, 0x4E, 0x46, 0xD7, 0xA9, 0xD6, // Bytes 4500 - 453f 0xBC, 0xD7, 0x82, 0x52, 0x46, 0xD9, 0x80, 0xD9, 0x8E, 0xD9, 0x91, 0x72, 0x46, 0xD9, 0x80, 0xD9, 0x8F, 0xD9, 0x91, 0x72, 0x46, 0xD9, 0x80, 0xD9, 0x90, 0xD9, 0x91, 0x72, 0x46, 0xE0, 0xA4, 0x95, 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x96, 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x97, 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x9C, 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xA1, // Bytes 4540 - 457f 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xA2, 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xAB, 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xAF, 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xA1, 0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xA2, 0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xAF, 0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x96, 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x97, // Bytes 4580 - 45bf 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x9C, 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xAB, 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xB2, 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xB8, 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xAC, 0xA1, 0xE0, 0xAC, 0xBC, 0x09, 0x46, 0xE0, 0xAC, 0xA2, 0xE0, 0xAC, 0xBC, 0x09, 0x46, 0xE0, 0xBE, 0xB2, 0xE0, 0xBE, 0x80, 0x9D, 0x46, 0xE0, 0xBE, 0xB3, // Bytes 45c0 - 45ff 0xE0, 0xBE, 0x80, 0x9D, 0x46, 0xE3, 0x83, 0x86, 0xE3, 0x82, 0x99, 0x0D, 0x48, 0xF0, 0x9D, 0x85, 0x97, 0xF0, 0x9D, 0x85, 0xA5, 0xAD, 0x48, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xAD, 0x48, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, 0xA5, 0xAD, 0x48, 0xF0, 0x9D, 0x86, 0xBA, 0xF0, 0x9D, 0x85, 0xA5, 0xAD, 0x49, 0xE0, 0xBE, 0xB2, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x9E, 0x49, // Bytes 4600 - 463f 0xE0, 0xBE, 0xB3, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x9E, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xB0, 0xAE, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, // Bytes 4640 - 467f 0xB1, 0xAE, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xB2, 0xAE, 0x4C, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE, 0x4C, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE, 0x4C, 0xF0, 0x9D, 0x86, 0xBA, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE, 0x4C, 0xF0, 0x9D, 0x86, 0xBA, 0xF0, // Bytes 4680 - 46bf 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE, 0x83, 0x41, 0xCC, 0x82, 0xC9, 0x83, 0x41, 0xCC, 0x86, 0xC9, 0x83, 0x41, 0xCC, 0x87, 0xC9, 0x83, 0x41, 0xCC, 0x88, 0xC9, 0x83, 0x41, 0xCC, 0x8A, 0xC9, 0x83, 0x41, 0xCC, 0xA3, 0xB5, 0x83, 0x43, 0xCC, 0xA7, 0xA5, 0x83, 0x45, 0xCC, 0x82, 0xC9, 0x83, 0x45, 0xCC, 0x84, 0xC9, 0x83, 0x45, 0xCC, 0xA3, 0xB5, 0x83, 0x45, 0xCC, 0xA7, 0xA5, 0x83, // Bytes 46c0 - 46ff 0x49, 0xCC, 0x88, 0xC9, 0x83, 0x4C, 0xCC, 0xA3, 0xB5, 0x83, 0x4F, 0xCC, 0x82, 0xC9, 0x83, 0x4F, 0xCC, 0x83, 0xC9, 0x83, 0x4F, 0xCC, 0x84, 0xC9, 0x83, 0x4F, 0xCC, 0x87, 0xC9, 0x83, 0x4F, 0xCC, 0x88, 0xC9, 0x83, 0x4F, 0xCC, 0x9B, 0xAD, 0x83, 0x4F, 0xCC, 0xA3, 0xB5, 0x83, 0x4F, 0xCC, 0xA8, 0xA5, 0x83, 0x52, 0xCC, 0xA3, 0xB5, 0x83, 0x53, 0xCC, 0x81, 0xC9, 0x83, 0x53, 0xCC, 0x8C, 0xC9, // Bytes 4700 - 473f 0x83, 0x53, 0xCC, 0xA3, 0xB5, 0x83, 0x55, 0xCC, 0x83, 0xC9, 0x83, 0x55, 0xCC, 0x84, 0xC9, 0x83, 0x55, 0xCC, 0x88, 0xC9, 0x83, 0x55, 0xCC, 0x9B, 0xAD, 0x83, 0x61, 0xCC, 0x82, 0xC9, 0x83, 0x61, 0xCC, 0x86, 0xC9, 0x83, 0x61, 0xCC, 0x87, 0xC9, 0x83, 0x61, 0xCC, 0x88, 0xC9, 0x83, 0x61, 0xCC, 0x8A, 0xC9, 0x83, 0x61, 0xCC, 0xA3, 0xB5, 0x83, 0x63, 0xCC, 0xA7, 0xA5, 0x83, 0x65, 0xCC, 0x82, // Bytes 4740 - 477f 0xC9, 0x83, 0x65, 0xCC, 0x84, 0xC9, 0x83, 0x65, 0xCC, 0xA3, 0xB5, 0x83, 0x65, 0xCC, 0xA7, 0xA5, 0x83, 0x69, 0xCC, 0x88, 0xC9, 0x83, 0x6C, 0xCC, 0xA3, 0xB5, 0x83, 0x6F, 0xCC, 0x82, 0xC9, 0x83, 0x6F, 0xCC, 0x83, 0xC9, 0x83, 0x6F, 0xCC, 0x84, 0xC9, 0x83, 0x6F, 0xCC, 0x87, 0xC9, 0x83, 0x6F, 0xCC, 0x88, 0xC9, 0x83, 0x6F, 0xCC, 0x9B, 0xAD, 0x83, 0x6F, 0xCC, 0xA3, 0xB5, 0x83, 0x6F, 0xCC, // Bytes 4780 - 47bf 0xA8, 0xA5, 0x83, 0x72, 0xCC, 0xA3, 0xB5, 0x83, 0x73, 0xCC, 0x81, 0xC9, 0x83, 0x73, 0xCC, 0x8C, 0xC9, 0x83, 0x73, 0xCC, 0xA3, 0xB5, 0x83, 0x75, 0xCC, 0x83, 0xC9, 0x83, 0x75, 0xCC, 0x84, 0xC9, 0x83, 0x75, 0xCC, 0x88, 0xC9, 0x83, 0x75, 0xCC, 0x9B, 0xAD, 0x84, 0xCE, 0x91, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x91, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0x95, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x95, 0xCC, // Bytes 47c0 - 47ff 0x94, 0xC9, 0x84, 0xCE, 0x97, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x97, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0x99, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x99, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0x9F, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x9F, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xA5, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xA9, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xA9, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xB1, 0xCC, 0x80, 0xC9, 0x84, 0xCE, // Bytes 4800 - 483f 0xB1, 0xCC, 0x81, 0xC9, 0x84, 0xCE, 0xB1, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB1, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xB1, 0xCD, 0x82, 0xC9, 0x84, 0xCE, 0xB5, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB5, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xB7, 0xCC, 0x80, 0xC9, 0x84, 0xCE, 0xB7, 0xCC, 0x81, 0xC9, 0x84, 0xCE, 0xB7, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB7, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xB7, 0xCD, 0x82, 0xC9, // Bytes 4840 - 487f 0x84, 0xCE, 0xB9, 0xCC, 0x88, 0xC9, 0x84, 0xCE, 0xB9, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB9, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xBF, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xBF, 0xCC, 0x94, 0xC9, 0x84, 0xCF, 0x85, 0xCC, 0x88, 0xC9, 0x84, 0xCF, 0x85, 0xCC, 0x93, 0xC9, 0x84, 0xCF, 0x85, 0xCC, 0x94, 0xC9, 0x84, 0xCF, 0x89, 0xCC, 0x80, 0xC9, 0x84, 0xCF, 0x89, 0xCC, 0x81, 0xC9, 0x84, 0xCF, 0x89, 0xCC, // Bytes 4880 - 48bf 0x93, 0xC9, 0x84, 0xCF, 0x89, 0xCC, 0x94, 0xC9, 0x84, 0xCF, 0x89, 0xCD, 0x82, 0xC9, 0x86, 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE, // Bytes 48c0 - 48ff 0x97, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, 0x97, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, 0x97, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, // Bytes 4900 - 493f 0xA9, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, 0xA9, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, 0xB1, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, // Bytes 4940 - 497f 0xB1, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, 0xB7, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCF, // Bytes 4980 - 49bf 0x89, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCF, 0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCF, 0x89, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCF, 0x89, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x42, 0xCC, 0x80, 0xC9, 0x32, 0x42, 0xCC, 0x81, 0xC9, 0x32, 0x42, 0xCC, 0x93, 0xC9, 0x32, 0x43, 0xE1, 0x85, // Bytes 49c0 - 49ff 0xA1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA2, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA3, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA4, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA5, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA6, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA7, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA8, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA9, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAA, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAB, 0x01, 0x00, 0x43, // Bytes 4a00 - 4a3f 0xE1, 0x85, 0xAC, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAD, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAE, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAF, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB0, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB2, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB3, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB4, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB5, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xAA, 0x01, // Bytes 4a40 - 4a7f 0x00, 0x43, 0xE1, 0x86, 0xAC, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xAD, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB0, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB1, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB2, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB3, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB4, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB5, 0x01, 0x00, 0x44, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x32, 0x43, 0xE3, 0x82, 0x99, 0x0D, 0x03, 0x43, 0xE3, // Bytes 4a80 - 4abf 0x82, 0x9A, 0x0D, 0x03, 0x46, 0xE0, 0xBD, 0xB1, 0xE0, 0xBD, 0xB2, 0x9E, 0x26, 0x46, 0xE0, 0xBD, 0xB1, 0xE0, 0xBD, 0xB4, 0xA2, 0x26, 0x46, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x9E, 0x26, 0x00, 0x01, } // lookup returns the trie value for the first UTF-8 encoding in s and // the width in bytes of this encoding. The size will be 0 if s does not // hold enough bytes to complete the encoding. len(s) must be greater than 0. func (t *nfcTrie) lookup(s []byte) (v uint16, sz int) { c0 := s[0] switch { case c0 < 0x80: // is ASCII return nfcValues[c0], 1 case c0 < 0xC2: return 0, 1 // Illegal UTF-8: not a starter, not ASCII. case c0 < 0xE0: // 2-byte UTF-8 if len(s) < 2 { return 0, 0 } i := nfcIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c1), 2 case c0 < 0xF0: // 3-byte UTF-8 if len(s) < 3 { return 0, 0 } i := nfcIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } o := uint32(i)<<6 + uint32(c1) i = nfcIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return 0, 2 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c2), 3 case c0 < 0xF8: // 4-byte UTF-8 if len(s) < 4 { return 0, 0 } i := nfcIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } o := uint32(i)<<6 + uint32(c1) i = nfcIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return 0, 2 // Illegal UTF-8: not a continuation byte. } o = uint32(i)<<6 + uint32(c2) i = nfcIndex[o] c3 := s[3] if c3 < 0x80 || 0xC0 <= c3 { return 0, 3 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c3), 4 } // Illegal rune return 0, 1 } // lookupUnsafe returns the trie value for the first UTF-8 encoding in s. // s must start with a full and valid UTF-8 encoded rune. func (t *nfcTrie) lookupUnsafe(s []byte) uint16 { c0 := s[0] if c0 < 0x80 { // is ASCII return nfcValues[c0] } i := nfcIndex[c0] if c0 < 0xE0 { // 2-byte UTF-8 return t.lookupValue(uint32(i), s[1]) } i = nfcIndex[uint32(i)<<6+uint32(s[1])] if c0 < 0xF0 { // 3-byte UTF-8 return t.lookupValue(uint32(i), s[2]) } i = nfcIndex[uint32(i)<<6+uint32(s[2])] if c0 < 0xF8 { // 4-byte UTF-8 return t.lookupValue(uint32(i), s[3]) } return 0 } // lookupString returns the trie value for the first UTF-8 encoding in s and // the width in bytes of this encoding. The size will be 0 if s does not // hold enough bytes to complete the encoding. len(s) must be greater than 0. func (t *nfcTrie) lookupString(s string) (v uint16, sz int) { c0 := s[0] switch { case c0 < 0x80: // is ASCII return nfcValues[c0], 1 case c0 < 0xC2: return 0, 1 // Illegal UTF-8: not a starter, not ASCII. case c0 < 0xE0: // 2-byte UTF-8 if len(s) < 2 { return 0, 0 } i := nfcIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c1), 2 case c0 < 0xF0: // 3-byte UTF-8 if len(s) < 3 { return 0, 0 } i := nfcIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } o := uint32(i)<<6 + uint32(c1) i = nfcIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return 0, 2 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c2), 3 case c0 < 0xF8: // 4-byte UTF-8 if len(s) < 4 { return 0, 0 } i := nfcIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } o := uint32(i)<<6 + uint32(c1) i = nfcIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return 0, 2 // Illegal UTF-8: not a continuation byte. } o = uint32(i)<<6 + uint32(c2) i = nfcIndex[o] c3 := s[3] if c3 < 0x80 || 0xC0 <= c3 { return 0, 3 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c3), 4 } // Illegal rune return 0, 1 } // lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. // s must start with a full and valid UTF-8 encoded rune. func (t *nfcTrie) lookupStringUnsafe(s string) uint16 { c0 := s[0] if c0 < 0x80 { // is ASCII return nfcValues[c0] } i := nfcIndex[c0] if c0 < 0xE0 { // 2-byte UTF-8 return t.lookupValue(uint32(i), s[1]) } i = nfcIndex[uint32(i)<<6+uint32(s[1])] if c0 < 0xF0 { // 3-byte UTF-8 return t.lookupValue(uint32(i), s[2]) } i = nfcIndex[uint32(i)<<6+uint32(s[2])] if c0 < 0xF8 { // 4-byte UTF-8 return t.lookupValue(uint32(i), s[3]) } return 0 } // nfcTrie. Total size: 10442 bytes (10.20 KiB). Checksum: 4ba400a9d8208e03. type nfcTrie struct{} func newNfcTrie(i int) *nfcTrie { return &nfcTrie{} } // lookupValue determines the type of block n and looks up the value for b. func (t *nfcTrie) lookupValue(n uint32, b byte) uint16 { switch { case n < 45: return uint16(nfcValues[n<<6+uint32(b)]) default: n -= 45 return uint16(nfcSparse.lookup(n, b)) } } // nfcValues: 47 blocks, 3008 entries, 6016 bytes // The third block is the zero block. var nfcValues = [3008]uint16{ // Block 0x0, offset 0x0 0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000, // Block 0x1, offset 0x40 0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000, 0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000, 0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000, 0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000, 0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000, 0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000, 0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000, 0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000, 0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000, 0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000, // Block 0x2, offset 0x80 // Block 0x3, offset 0xc0 0xc0: 0x2f6f, 0xc1: 0x2f74, 0xc2: 0x4688, 0xc3: 0x2f79, 0xc4: 0x4697, 0xc5: 0x469c, 0xc6: 0xa000, 0xc7: 0x46a6, 0xc8: 0x2fe2, 0xc9: 0x2fe7, 0xca: 0x46ab, 0xcb: 0x2ffb, 0xcc: 0x306e, 0xcd: 0x3073, 0xce: 0x3078, 0xcf: 0x46bf, 0xd1: 0x3104, 0xd2: 0x3127, 0xd3: 0x312c, 0xd4: 0x46c9, 0xd5: 0x46ce, 0xd6: 0x46dd, 0xd8: 0xa000, 0xd9: 0x31b3, 0xda: 0x31b8, 0xdb: 0x31bd, 0xdc: 0x470f, 0xdd: 0x3235, 0xe0: 0x327b, 0xe1: 0x3280, 0xe2: 0x4719, 0xe3: 0x3285, 0xe4: 0x4728, 0xe5: 0x472d, 0xe6: 0xa000, 0xe7: 0x4737, 0xe8: 0x32ee, 0xe9: 0x32f3, 0xea: 0x473c, 0xeb: 0x3307, 0xec: 0x337f, 0xed: 0x3384, 0xee: 0x3389, 0xef: 0x4750, 0xf1: 0x3415, 0xf2: 0x3438, 0xf3: 0x343d, 0xf4: 0x475a, 0xf5: 0x475f, 0xf6: 0x476e, 0xf8: 0xa000, 0xf9: 0x34c9, 0xfa: 0x34ce, 0xfb: 0x34d3, 0xfc: 0x47a0, 0xfd: 0x3550, 0xff: 0x3569, // Block 0x4, offset 0x100 0x100: 0x2f7e, 0x101: 0x328a, 0x102: 0x468d, 0x103: 0x471e, 0x104: 0x2f9c, 0x105: 0x32a8, 0x106: 0x2fb0, 0x107: 0x32bc, 0x108: 0x2fb5, 0x109: 0x32c1, 0x10a: 0x2fba, 0x10b: 0x32c6, 0x10c: 0x2fbf, 0x10d: 0x32cb, 0x10e: 0x2fc9, 0x10f: 0x32d5, 0x112: 0x46b0, 0x113: 0x4741, 0x114: 0x2ff1, 0x115: 0x32fd, 0x116: 0x2ff6, 0x117: 0x3302, 0x118: 0x3014, 0x119: 0x3320, 0x11a: 0x3005, 0x11b: 0x3311, 0x11c: 0x302d, 0x11d: 0x3339, 0x11e: 0x3037, 0x11f: 0x3343, 0x120: 0x303c, 0x121: 0x3348, 0x122: 0x3046, 0x123: 0x3352, 0x124: 0x304b, 0x125: 0x3357, 0x128: 0x307d, 0x129: 0x338e, 0x12a: 0x3082, 0x12b: 0x3393, 0x12c: 0x3087, 0x12d: 0x3398, 0x12e: 0x30aa, 0x12f: 0x33b6, 0x130: 0x308c, 0x134: 0x30b4, 0x135: 0x33c0, 0x136: 0x30c8, 0x137: 0x33d9, 0x139: 0x30d2, 0x13a: 0x33e3, 0x13b: 0x30dc, 0x13c: 0x33ed, 0x13d: 0x30d7, 0x13e: 0x33e8, // Block 0x5, offset 0x140 0x143: 0x30ff, 0x144: 0x3410, 0x145: 0x3118, 0x146: 0x3429, 0x147: 0x310e, 0x148: 0x341f, 0x14c: 0x46d3, 0x14d: 0x4764, 0x14e: 0x3131, 0x14f: 0x3442, 0x150: 0x313b, 0x151: 0x344c, 0x154: 0x3159, 0x155: 0x346a, 0x156: 0x3172, 0x157: 0x3483, 0x158: 0x3163, 0x159: 0x3474, 0x15a: 0x46f6, 0x15b: 0x4787, 0x15c: 0x317c, 0x15d: 0x348d, 0x15e: 0x318b, 0x15f: 0x349c, 0x160: 0x46fb, 0x161: 0x478c, 0x162: 0x31a4, 0x163: 0x34ba, 0x164: 0x3195, 0x165: 0x34ab, 0x168: 0x4705, 0x169: 0x4796, 0x16a: 0x470a, 0x16b: 0x479b, 0x16c: 0x31c2, 0x16d: 0x34d8, 0x16e: 0x31cc, 0x16f: 0x34e2, 0x170: 0x31d1, 0x171: 0x34e7, 0x172: 0x31ef, 0x173: 0x3505, 0x174: 0x3212, 0x175: 0x3528, 0x176: 0x323a, 0x177: 0x3555, 0x178: 0x324e, 0x179: 0x325d, 0x17a: 0x357d, 0x17b: 0x3267, 0x17c: 0x3587, 0x17d: 0x326c, 0x17e: 0x358c, 0x17f: 0xa000, // Block 0x6, offset 0x180 0x184: 0x8100, 0x185: 0x8100, 0x186: 0x8100, 0x18d: 0x2f88, 0x18e: 0x3294, 0x18f: 0x3096, 0x190: 0x33a2, 0x191: 0x3140, 0x192: 0x3451, 0x193: 0x31d6, 0x194: 0x34ec, 0x195: 0x39cf, 0x196: 0x3b5e, 0x197: 0x39c8, 0x198: 0x3b57, 0x199: 0x39d6, 0x19a: 0x3b65, 0x19b: 0x39c1, 0x19c: 0x3b50, 0x19e: 0x38b0, 0x19f: 0x3a3f, 0x1a0: 0x38a9, 0x1a1: 0x3a38, 0x1a2: 0x35b3, 0x1a3: 0x35c5, 0x1a6: 0x3041, 0x1a7: 0x334d, 0x1a8: 0x30be, 0x1a9: 0x33cf, 0x1aa: 0x46ec, 0x1ab: 0x477d, 0x1ac: 0x3990, 0x1ad: 0x3b1f, 0x1ae: 0x35d7, 0x1af: 0x35dd, 0x1b0: 0x33c5, 0x1b4: 0x3028, 0x1b5: 0x3334, 0x1b8: 0x30fa, 0x1b9: 0x340b, 0x1ba: 0x38b7, 0x1bb: 0x3a46, 0x1bc: 0x35ad, 0x1bd: 0x35bf, 0x1be: 0x35b9, 0x1bf: 0x35cb, // Block 0x7, offset 0x1c0 0x1c0: 0x2f8d, 0x1c1: 0x3299, 0x1c2: 0x2f92, 0x1c3: 0x329e, 0x1c4: 0x300a, 0x1c5: 0x3316, 0x1c6: 0x300f, 0x1c7: 0x331b, 0x1c8: 0x309b, 0x1c9: 0x33a7, 0x1ca: 0x30a0, 0x1cb: 0x33ac, 0x1cc: 0x3145, 0x1cd: 0x3456, 0x1ce: 0x314a, 0x1cf: 0x345b, 0x1d0: 0x3168, 0x1d1: 0x3479, 0x1d2: 0x316d, 0x1d3: 0x347e, 0x1d4: 0x31db, 0x1d5: 0x34f1, 0x1d6: 0x31e0, 0x1d7: 0x34f6, 0x1d8: 0x3186, 0x1d9: 0x3497, 0x1da: 0x319f, 0x1db: 0x34b5, 0x1de: 0x305a, 0x1df: 0x3366, 0x1e6: 0x4692, 0x1e7: 0x4723, 0x1e8: 0x46ba, 0x1e9: 0x474b, 0x1ea: 0x395f, 0x1eb: 0x3aee, 0x1ec: 0x393c, 0x1ed: 0x3acb, 0x1ee: 0x46d8, 0x1ef: 0x4769, 0x1f0: 0x3958, 0x1f1: 0x3ae7, 0x1f2: 0x3244, 0x1f3: 0x355f, // Block 0x8, offset 0x200 0x200: 0x9932, 0x201: 0x9932, 0x202: 0x9932, 0x203: 0x9932, 0x204: 0x9932, 0x205: 0x8132, 0x206: 0x9932, 0x207: 0x9932, 0x208: 0x9932, 0x209: 0x9932, 0x20a: 0x9932, 0x20b: 0x9932, 0x20c: 0x9932, 0x20d: 0x8132, 0x20e: 0x8132, 0x20f: 0x9932, 0x210: 0x8132, 0x211: 0x9932, 0x212: 0x8132, 0x213: 0x9932, 0x214: 0x9932, 0x215: 0x8133, 0x216: 0x812d, 0x217: 0x812d, 0x218: 0x812d, 0x219: 0x812d, 0x21a: 0x8133, 0x21b: 0x992b, 0x21c: 0x812d, 0x21d: 0x812d, 0x21e: 0x812d, 0x21f: 0x812d, 0x220: 0x812d, 0x221: 0x8129, 0x222: 0x8129, 0x223: 0x992d, 0x224: 0x992d, 0x225: 0x992d, 0x226: 0x992d, 0x227: 0x9929, 0x228: 0x9929, 0x229: 0x812d, 0x22a: 0x812d, 0x22b: 0x812d, 0x22c: 0x812d, 0x22d: 0x992d, 0x22e: 0x992d, 0x22f: 0x812d, 0x230: 0x992d, 0x231: 0x992d, 0x232: 0x812d, 0x233: 0x812d, 0x234: 0x8101, 0x235: 0x8101, 0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812d, 0x23a: 0x812d, 0x23b: 0x812d, 0x23c: 0x812d, 0x23d: 0x8132, 0x23e: 0x8132, 0x23f: 0x8132, // Block 0x9, offset 0x240 0x240: 0x49ae, 0x241: 0x49b3, 0x242: 0x9932, 0x243: 0x49b8, 0x244: 0x4a71, 0x245: 0x9936, 0x246: 0x8132, 0x247: 0x812d, 0x248: 0x812d, 0x249: 0x812d, 0x24a: 0x8132, 0x24b: 0x8132, 0x24c: 0x8132, 0x24d: 0x812d, 0x24e: 0x812d, 0x250: 0x8132, 0x251: 0x8132, 0x252: 0x8132, 0x253: 0x812d, 0x254: 0x812d, 0x255: 0x812d, 0x256: 0x812d, 0x257: 0x8132, 0x258: 0x8133, 0x259: 0x812d, 0x25a: 0x812d, 0x25b: 0x8132, 0x25c: 0x8134, 0x25d: 0x8135, 0x25e: 0x8135, 0x25f: 0x8134, 0x260: 0x8135, 0x261: 0x8135, 0x262: 0x8134, 0x263: 0x8132, 0x264: 0x8132, 0x265: 0x8132, 0x266: 0x8132, 0x267: 0x8132, 0x268: 0x8132, 0x269: 0x8132, 0x26a: 0x8132, 0x26b: 0x8132, 0x26c: 0x8132, 0x26d: 0x8132, 0x26e: 0x8132, 0x26f: 0x8132, 0x274: 0x0170, 0x27a: 0x8100, 0x27e: 0x0037, // Block 0xa, offset 0x280 0x284: 0x8100, 0x285: 0x35a1, 0x286: 0x35e9, 0x287: 0x00ce, 0x288: 0x3607, 0x289: 0x3613, 0x28a: 0x3625, 0x28c: 0x3643, 0x28e: 0x3655, 0x28f: 0x3673, 0x290: 0x3e08, 0x291: 0xa000, 0x295: 0xa000, 0x297: 0xa000, 0x299: 0xa000, 0x29f: 0xa000, 0x2a1: 0xa000, 0x2a5: 0xa000, 0x2a9: 0xa000, 0x2aa: 0x3637, 0x2ab: 0x3667, 0x2ac: 0x47fe, 0x2ad: 0x3697, 0x2ae: 0x4828, 0x2af: 0x36a9, 0x2b0: 0x3e70, 0x2b1: 0xa000, 0x2b5: 0xa000, 0x2b7: 0xa000, 0x2b9: 0xa000, 0x2bf: 0xa000, // Block 0xb, offset 0x2c0 0x2c0: 0x3721, 0x2c1: 0x372d, 0x2c3: 0x371b, 0x2c6: 0xa000, 0x2c7: 0x3709, 0x2cc: 0x375d, 0x2cd: 0x3745, 0x2ce: 0x376f, 0x2d0: 0xa000, 0x2d3: 0xa000, 0x2d5: 0xa000, 0x2d6: 0xa000, 0x2d7: 0xa000, 0x2d8: 0xa000, 0x2d9: 0x3751, 0x2da: 0xa000, 0x2de: 0xa000, 0x2e3: 0xa000, 0x2e7: 0xa000, 0x2eb: 0xa000, 0x2ed: 0xa000, 0x2f0: 0xa000, 0x2f3: 0xa000, 0x2f5: 0xa000, 0x2f6: 0xa000, 0x2f7: 0xa000, 0x2f8: 0xa000, 0x2f9: 0x37d5, 0x2fa: 0xa000, 0x2fe: 0xa000, // Block 0xc, offset 0x300 0x301: 0x3733, 0x302: 0x37b7, 0x310: 0x370f, 0x311: 0x3793, 0x312: 0x3715, 0x313: 0x3799, 0x316: 0x3727, 0x317: 0x37ab, 0x318: 0xa000, 0x319: 0xa000, 0x31a: 0x3829, 0x31b: 0x382f, 0x31c: 0x3739, 0x31d: 0x37bd, 0x31e: 0x373f, 0x31f: 0x37c3, 0x322: 0x374b, 0x323: 0x37cf, 0x324: 0x3757, 0x325: 0x37db, 0x326: 0x3763, 0x327: 0x37e7, 0x328: 0xa000, 0x329: 0xa000, 0x32a: 0x3835, 0x32b: 0x383b, 0x32c: 0x378d, 0x32d: 0x3811, 0x32e: 0x3769, 0x32f: 0x37ed, 0x330: 0x3775, 0x331: 0x37f9, 0x332: 0x377b, 0x333: 0x37ff, 0x334: 0x3781, 0x335: 0x3805, 0x338: 0x3787, 0x339: 0x380b, // Block 0xd, offset 0x340 0x351: 0x812d, 0x352: 0x8132, 0x353: 0x8132, 0x354: 0x8132, 0x355: 0x8132, 0x356: 0x812d, 0x357: 0x8132, 0x358: 0x8132, 0x359: 0x8132, 0x35a: 0x812e, 0x35b: 0x812d, 0x35c: 0x8132, 0x35d: 0x8132, 0x35e: 0x8132, 0x35f: 0x8132, 0x360: 0x8132, 0x361: 0x8132, 0x362: 0x812d, 0x363: 0x812d, 0x364: 0x812d, 0x365: 0x812d, 0x366: 0x812d, 0x367: 0x812d, 0x368: 0x8132, 0x369: 0x8132, 0x36a: 0x812d, 0x36b: 0x8132, 0x36c: 0x8132, 0x36d: 0x812e, 0x36e: 0x8131, 0x36f: 0x8132, 0x370: 0x8105, 0x371: 0x8106, 0x372: 0x8107, 0x373: 0x8108, 0x374: 0x8109, 0x375: 0x810a, 0x376: 0x810b, 0x377: 0x810c, 0x378: 0x810d, 0x379: 0x810e, 0x37a: 0x810e, 0x37b: 0x810f, 0x37c: 0x8110, 0x37d: 0x8111, 0x37f: 0x8112, // Block 0xe, offset 0x380 0x388: 0xa000, 0x38a: 0xa000, 0x38b: 0x8116, 0x38c: 0x8117, 0x38d: 0x8118, 0x38e: 0x8119, 0x38f: 0x811a, 0x390: 0x811b, 0x391: 0x811c, 0x392: 0x811d, 0x393: 0x9932, 0x394: 0x9932, 0x395: 0x992d, 0x396: 0x812d, 0x397: 0x8132, 0x398: 0x8132, 0x399: 0x8132, 0x39a: 0x8132, 0x39b: 0x8132, 0x39c: 0x812d, 0x39d: 0x8132, 0x39e: 0x8132, 0x39f: 0x812d, 0x3b0: 0x811e, // Block 0xf, offset 0x3c0 0x3c5: 0xa000, 0x3c6: 0x2d26, 0x3c7: 0xa000, 0x3c8: 0x2d2e, 0x3c9: 0xa000, 0x3ca: 0x2d36, 0x3cb: 0xa000, 0x3cc: 0x2d3e, 0x3cd: 0xa000, 0x3ce: 0x2d46, 0x3d1: 0xa000, 0x3d2: 0x2d4e, 0x3f4: 0x8102, 0x3f5: 0x9900, 0x3fa: 0xa000, 0x3fb: 0x2d56, 0x3fc: 0xa000, 0x3fd: 0x2d5e, 0x3fe: 0xa000, 0x3ff: 0xa000, // Block 0x10, offset 0x400 0x400: 0x8132, 0x401: 0x8132, 0x402: 0x812d, 0x403: 0x8132, 0x404: 0x8132, 0x405: 0x8132, 0x406: 0x8132, 0x407: 0x8132, 0x408: 0x8132, 0x409: 0x8132, 0x40a: 0x812d, 0x40b: 0x8132, 0x40c: 0x8132, 0x40d: 0x8135, 0x40e: 0x812a, 0x40f: 0x812d, 0x410: 0x8129, 0x411: 0x8132, 0x412: 0x8132, 0x413: 0x8132, 0x414: 0x8132, 0x415: 0x8132, 0x416: 0x8132, 0x417: 0x8132, 0x418: 0x8132, 0x419: 0x8132, 0x41a: 0x8132, 0x41b: 0x8132, 0x41c: 0x8132, 0x41d: 0x8132, 0x41e: 0x8132, 0x41f: 0x8132, 0x420: 0x8132, 0x421: 0x8132, 0x422: 0x8132, 0x423: 0x8132, 0x424: 0x8132, 0x425: 0x8132, 0x426: 0x8132, 0x427: 0x8132, 0x428: 0x8132, 0x429: 0x8132, 0x42a: 0x8132, 0x42b: 0x8132, 0x42c: 0x8132, 0x42d: 0x8132, 0x42e: 0x8132, 0x42f: 0x8132, 0x430: 0x8132, 0x431: 0x8132, 0x432: 0x8132, 0x433: 0x8132, 0x434: 0x8132, 0x435: 0x8132, 0x436: 0x8133, 0x437: 0x8131, 0x438: 0x8131, 0x439: 0x812d, 0x43b: 0x8132, 0x43c: 0x8134, 0x43d: 0x812d, 0x43e: 0x8132, 0x43f: 0x812d, // Block 0x11, offset 0x440 0x440: 0x2f97, 0x441: 0x32a3, 0x442: 0x2fa1, 0x443: 0x32ad, 0x444: 0x2fa6, 0x445: 0x32b2, 0x446: 0x2fab, 0x447: 0x32b7, 0x448: 0x38cc, 0x449: 0x3a5b, 0x44a: 0x2fc4, 0x44b: 0x32d0, 0x44c: 0x2fce, 0x44d: 0x32da, 0x44e: 0x2fdd, 0x44f: 0x32e9, 0x450: 0x2fd3, 0x451: 0x32df, 0x452: 0x2fd8, 0x453: 0x32e4, 0x454: 0x38ef, 0x455: 0x3a7e, 0x456: 0x38f6, 0x457: 0x3a85, 0x458: 0x3019, 0x459: 0x3325, 0x45a: 0x301e, 0x45b: 0x332a, 0x45c: 0x3904, 0x45d: 0x3a93, 0x45e: 0x3023, 0x45f: 0x332f, 0x460: 0x3032, 0x461: 0x333e, 0x462: 0x3050, 0x463: 0x335c, 0x464: 0x305f, 0x465: 0x336b, 0x466: 0x3055, 0x467: 0x3361, 0x468: 0x3064, 0x469: 0x3370, 0x46a: 0x3069, 0x46b: 0x3375, 0x46c: 0x30af, 0x46d: 0x33bb, 0x46e: 0x390b, 0x46f: 0x3a9a, 0x470: 0x30b9, 0x471: 0x33ca, 0x472: 0x30c3, 0x473: 0x33d4, 0x474: 0x30cd, 0x475: 0x33de, 0x476: 0x46c4, 0x477: 0x4755, 0x478: 0x3912, 0x479: 0x3aa1, 0x47a: 0x30e6, 0x47b: 0x33f7, 0x47c: 0x30e1, 0x47d: 0x33f2, 0x47e: 0x30eb, 0x47f: 0x33fc, // Block 0x12, offset 0x480 0x480: 0x30f0, 0x481: 0x3401, 0x482: 0x30f5, 0x483: 0x3406, 0x484: 0x3109, 0x485: 0x341a, 0x486: 0x3113, 0x487: 0x3424, 0x488: 0x3122, 0x489: 0x3433, 0x48a: 0x311d, 0x48b: 0x342e, 0x48c: 0x3935, 0x48d: 0x3ac4, 0x48e: 0x3943, 0x48f: 0x3ad2, 0x490: 0x394a, 0x491: 0x3ad9, 0x492: 0x3951, 0x493: 0x3ae0, 0x494: 0x314f, 0x495: 0x3460, 0x496: 0x3154, 0x497: 0x3465, 0x498: 0x315e, 0x499: 0x346f, 0x49a: 0x46f1, 0x49b: 0x4782, 0x49c: 0x3997, 0x49d: 0x3b26, 0x49e: 0x3177, 0x49f: 0x3488, 0x4a0: 0x3181, 0x4a1: 0x3492, 0x4a2: 0x4700, 0x4a3: 0x4791, 0x4a4: 0x399e, 0x4a5: 0x3b2d, 0x4a6: 0x39a5, 0x4a7: 0x3b34, 0x4a8: 0x39ac, 0x4a9: 0x3b3b, 0x4aa: 0x3190, 0x4ab: 0x34a1, 0x4ac: 0x319a, 0x4ad: 0x34b0, 0x4ae: 0x31ae, 0x4af: 0x34c4, 0x4b0: 0x31a9, 0x4b1: 0x34bf, 0x4b2: 0x31ea, 0x4b3: 0x3500, 0x4b4: 0x31f9, 0x4b5: 0x350f, 0x4b6: 0x31f4, 0x4b7: 0x350a, 0x4b8: 0x39b3, 0x4b9: 0x3b42, 0x4ba: 0x39ba, 0x4bb: 0x3b49, 0x4bc: 0x31fe, 0x4bd: 0x3514, 0x4be: 0x3203, 0x4bf: 0x3519, // Block 0x13, offset 0x4c0 0x4c0: 0x3208, 0x4c1: 0x351e, 0x4c2: 0x320d, 0x4c3: 0x3523, 0x4c4: 0x321c, 0x4c5: 0x3532, 0x4c6: 0x3217, 0x4c7: 0x352d, 0x4c8: 0x3221, 0x4c9: 0x353c, 0x4ca: 0x3226, 0x4cb: 0x3541, 0x4cc: 0x322b, 0x4cd: 0x3546, 0x4ce: 0x3249, 0x4cf: 0x3564, 0x4d0: 0x3262, 0x4d1: 0x3582, 0x4d2: 0x3271, 0x4d3: 0x3591, 0x4d4: 0x3276, 0x4d5: 0x3596, 0x4d6: 0x337a, 0x4d7: 0x34a6, 0x4d8: 0x3537, 0x4d9: 0x3573, 0x4db: 0x35d1, 0x4e0: 0x46a1, 0x4e1: 0x4732, 0x4e2: 0x2f83, 0x4e3: 0x328f, 0x4e4: 0x3878, 0x4e5: 0x3a07, 0x4e6: 0x3871, 0x4e7: 0x3a00, 0x4e8: 0x3886, 0x4e9: 0x3a15, 0x4ea: 0x387f, 0x4eb: 0x3a0e, 0x4ec: 0x38be, 0x4ed: 0x3a4d, 0x4ee: 0x3894, 0x4ef: 0x3a23, 0x4f0: 0x388d, 0x4f1: 0x3a1c, 0x4f2: 0x38a2, 0x4f3: 0x3a31, 0x4f4: 0x389b, 0x4f5: 0x3a2a, 0x4f6: 0x38c5, 0x4f7: 0x3a54, 0x4f8: 0x46b5, 0x4f9: 0x4746, 0x4fa: 0x3000, 0x4fb: 0x330c, 0x4fc: 0x2fec, 0x4fd: 0x32f8, 0x4fe: 0x38da, 0x4ff: 0x3a69, // Block 0x14, offset 0x500 0x500: 0x38d3, 0x501: 0x3a62, 0x502: 0x38e8, 0x503: 0x3a77, 0x504: 0x38e1, 0x505: 0x3a70, 0x506: 0x38fd, 0x507: 0x3a8c, 0x508: 0x3091, 0x509: 0x339d, 0x50a: 0x30a5, 0x50b: 0x33b1, 0x50c: 0x46e7, 0x50d: 0x4778, 0x50e: 0x3136, 0x50f: 0x3447, 0x510: 0x3920, 0x511: 0x3aaf, 0x512: 0x3919, 0x513: 0x3aa8, 0x514: 0x392e, 0x515: 0x3abd, 0x516: 0x3927, 0x517: 0x3ab6, 0x518: 0x3989, 0x519: 0x3b18, 0x51a: 0x396d, 0x51b: 0x3afc, 0x51c: 0x3966, 0x51d: 0x3af5, 0x51e: 0x397b, 0x51f: 0x3b0a, 0x520: 0x3974, 0x521: 0x3b03, 0x522: 0x3982, 0x523: 0x3b11, 0x524: 0x31e5, 0x525: 0x34fb, 0x526: 0x31c7, 0x527: 0x34dd, 0x528: 0x39e4, 0x529: 0x3b73, 0x52a: 0x39dd, 0x52b: 0x3b6c, 0x52c: 0x39f2, 0x52d: 0x3b81, 0x52e: 0x39eb, 0x52f: 0x3b7a, 0x530: 0x39f9, 0x531: 0x3b88, 0x532: 0x3230, 0x533: 0x354b, 0x534: 0x3258, 0x535: 0x3578, 0x536: 0x3253, 0x537: 0x356e, 0x538: 0x323f, 0x539: 0x355a, // Block 0x15, offset 0x540 0x540: 0x4804, 0x541: 0x480a, 0x542: 0x491e, 0x543: 0x4936, 0x544: 0x4926, 0x545: 0x493e, 0x546: 0x492e, 0x547: 0x4946, 0x548: 0x47aa, 0x549: 0x47b0, 0x54a: 0x488e, 0x54b: 0x48a6, 0x54c: 0x4896, 0x54d: 0x48ae, 0x54e: 0x489e, 0x54f: 0x48b6, 0x550: 0x4816, 0x551: 0x481c, 0x552: 0x3db8, 0x553: 0x3dc8, 0x554: 0x3dc0, 0x555: 0x3dd0, 0x558: 0x47b6, 0x559: 0x47bc, 0x55a: 0x3ce8, 0x55b: 0x3cf8, 0x55c: 0x3cf0, 0x55d: 0x3d00, 0x560: 0x482e, 0x561: 0x4834, 0x562: 0x494e, 0x563: 0x4966, 0x564: 0x4956, 0x565: 0x496e, 0x566: 0x495e, 0x567: 0x4976, 0x568: 0x47c2, 0x569: 0x47c8, 0x56a: 0x48be, 0x56b: 0x48d6, 0x56c: 0x48c6, 0x56d: 0x48de, 0x56e: 0x48ce, 0x56f: 0x48e6, 0x570: 0x4846, 0x571: 0x484c, 0x572: 0x3e18, 0x573: 0x3e30, 0x574: 0x3e20, 0x575: 0x3e38, 0x576: 0x3e28, 0x577: 0x3e40, 0x578: 0x47ce, 0x579: 0x47d4, 0x57a: 0x3d18, 0x57b: 0x3d30, 0x57c: 0x3d20, 0x57d: 0x3d38, 0x57e: 0x3d28, 0x57f: 0x3d40, // Block 0x16, offset 0x580 0x580: 0x4852, 0x581: 0x4858, 0x582: 0x3e48, 0x583: 0x3e58, 0x584: 0x3e50, 0x585: 0x3e60, 0x588: 0x47da, 0x589: 0x47e0, 0x58a: 0x3d48, 0x58b: 0x3d58, 0x58c: 0x3d50, 0x58d: 0x3d60, 0x590: 0x4864, 0x591: 0x486a, 0x592: 0x3e80, 0x593: 0x3e98, 0x594: 0x3e88, 0x595: 0x3ea0, 0x596: 0x3e90, 0x597: 0x3ea8, 0x599: 0x47e6, 0x59b: 0x3d68, 0x59d: 0x3d70, 0x59f: 0x3d78, 0x5a0: 0x487c, 0x5a1: 0x4882, 0x5a2: 0x497e, 0x5a3: 0x4996, 0x5a4: 0x4986, 0x5a5: 0x499e, 0x5a6: 0x498e, 0x5a7: 0x49a6, 0x5a8: 0x47ec, 0x5a9: 0x47f2, 0x5aa: 0x48ee, 0x5ab: 0x4906, 0x5ac: 0x48f6, 0x5ad: 0x490e, 0x5ae: 0x48fe, 0x5af: 0x4916, 0x5b0: 0x47f8, 0x5b1: 0x431e, 0x5b2: 0x3691, 0x5b3: 0x4324, 0x5b4: 0x4822, 0x5b5: 0x432a, 0x5b6: 0x36a3, 0x5b7: 0x4330, 0x5b8: 0x36c1, 0x5b9: 0x4336, 0x5ba: 0x36d9, 0x5bb: 0x433c, 0x5bc: 0x4870, 0x5bd: 0x4342, // Block 0x17, offset 0x5c0 0x5c0: 0x3da0, 0x5c1: 0x3da8, 0x5c2: 0x4184, 0x5c3: 0x41a2, 0x5c4: 0x418e, 0x5c5: 0x41ac, 0x5c6: 0x4198, 0x5c7: 0x41b6, 0x5c8: 0x3cd8, 0x5c9: 0x3ce0, 0x5ca: 0x40d0, 0x5cb: 0x40ee, 0x5cc: 0x40da, 0x5cd: 0x40f8, 0x5ce: 0x40e4, 0x5cf: 0x4102, 0x5d0: 0x3de8, 0x5d1: 0x3df0, 0x5d2: 0x41c0, 0x5d3: 0x41de, 0x5d4: 0x41ca, 0x5d5: 0x41e8, 0x5d6: 0x41d4, 0x5d7: 0x41f2, 0x5d8: 0x3d08, 0x5d9: 0x3d10, 0x5da: 0x410c, 0x5db: 0x412a, 0x5dc: 0x4116, 0x5dd: 0x4134, 0x5de: 0x4120, 0x5df: 0x413e, 0x5e0: 0x3ec0, 0x5e1: 0x3ec8, 0x5e2: 0x41fc, 0x5e3: 0x421a, 0x5e4: 0x4206, 0x5e5: 0x4224, 0x5e6: 0x4210, 0x5e7: 0x422e, 0x5e8: 0x3d80, 0x5e9: 0x3d88, 0x5ea: 0x4148, 0x5eb: 0x4166, 0x5ec: 0x4152, 0x5ed: 0x4170, 0x5ee: 0x415c, 0x5ef: 0x417a, 0x5f0: 0x3685, 0x5f1: 0x367f, 0x5f2: 0x3d90, 0x5f3: 0x368b, 0x5f4: 0x3d98, 0x5f6: 0x4810, 0x5f7: 0x3db0, 0x5f8: 0x35f5, 0x5f9: 0x35ef, 0x5fa: 0x35e3, 0x5fb: 0x42ee, 0x5fc: 0x35fb, 0x5fd: 0x8100, 0x5fe: 0x01d3, 0x5ff: 0xa100, // Block 0x18, offset 0x600 0x600: 0x8100, 0x601: 0x35a7, 0x602: 0x3dd8, 0x603: 0x369d, 0x604: 0x3de0, 0x606: 0x483a, 0x607: 0x3df8, 0x608: 0x3601, 0x609: 0x42f4, 0x60a: 0x360d, 0x60b: 0x42fa, 0x60c: 0x3619, 0x60d: 0x3b8f, 0x60e: 0x3b96, 0x60f: 0x3b9d, 0x610: 0x36b5, 0x611: 0x36af, 0x612: 0x3e00, 0x613: 0x44e4, 0x616: 0x36bb, 0x617: 0x3e10, 0x618: 0x3631, 0x619: 0x362b, 0x61a: 0x361f, 0x61b: 0x4300, 0x61d: 0x3ba4, 0x61e: 0x3bab, 0x61f: 0x3bb2, 0x620: 0x36eb, 0x621: 0x36e5, 0x622: 0x3e68, 0x623: 0x44ec, 0x624: 0x36cd, 0x625: 0x36d3, 0x626: 0x36f1, 0x627: 0x3e78, 0x628: 0x3661, 0x629: 0x365b, 0x62a: 0x364f, 0x62b: 0x430c, 0x62c: 0x3649, 0x62d: 0x359b, 0x62e: 0x42e8, 0x62f: 0x0081, 0x632: 0x3eb0, 0x633: 0x36f7, 0x634: 0x3eb8, 0x636: 0x4888, 0x637: 0x3ed0, 0x638: 0x363d, 0x639: 0x4306, 0x63a: 0x366d, 0x63b: 0x4318, 0x63c: 0x3679, 0x63d: 0x4256, 0x63e: 0xa100, // Block 0x19, offset 0x640 0x641: 0x3c06, 0x643: 0xa000, 0x644: 0x3c0d, 0x645: 0xa000, 0x647: 0x3c14, 0x648: 0xa000, 0x649: 0x3c1b, 0x64d: 0xa000, 0x660: 0x2f65, 0x661: 0xa000, 0x662: 0x3c29, 0x664: 0xa000, 0x665: 0xa000, 0x66d: 0x3c22, 0x66e: 0x2f60, 0x66f: 0x2f6a, 0x670: 0x3c30, 0x671: 0x3c37, 0x672: 0xa000, 0x673: 0xa000, 0x674: 0x3c3e, 0x675: 0x3c45, 0x676: 0xa000, 0x677: 0xa000, 0x678: 0x3c4c, 0x679: 0x3c53, 0x67a: 0xa000, 0x67b: 0xa000, 0x67c: 0xa000, 0x67d: 0xa000, // Block 0x1a, offset 0x680 0x680: 0x3c5a, 0x681: 0x3c61, 0x682: 0xa000, 0x683: 0xa000, 0x684: 0x3c76, 0x685: 0x3c7d, 0x686: 0xa000, 0x687: 0xa000, 0x688: 0x3c84, 0x689: 0x3c8b, 0x691: 0xa000, 0x692: 0xa000, 0x6a2: 0xa000, 0x6a8: 0xa000, 0x6a9: 0xa000, 0x6ab: 0xa000, 0x6ac: 0x3ca0, 0x6ad: 0x3ca7, 0x6ae: 0x3cae, 0x6af: 0x3cb5, 0x6b2: 0xa000, 0x6b3: 0xa000, 0x6b4: 0xa000, 0x6b5: 0xa000, // Block 0x1b, offset 0x6c0 0x6c6: 0xa000, 0x6cb: 0xa000, 0x6cc: 0x3f08, 0x6cd: 0xa000, 0x6ce: 0x3f10, 0x6cf: 0xa000, 0x6d0: 0x3f18, 0x6d1: 0xa000, 0x6d2: 0x3f20, 0x6d3: 0xa000, 0x6d4: 0x3f28, 0x6d5: 0xa000, 0x6d6: 0x3f30, 0x6d7: 0xa000, 0x6d8: 0x3f38, 0x6d9: 0xa000, 0x6da: 0x3f40, 0x6db: 0xa000, 0x6dc: 0x3f48, 0x6dd: 0xa000, 0x6de: 0x3f50, 0x6df: 0xa000, 0x6e0: 0x3f58, 0x6e1: 0xa000, 0x6e2: 0x3f60, 0x6e4: 0xa000, 0x6e5: 0x3f68, 0x6e6: 0xa000, 0x6e7: 0x3f70, 0x6e8: 0xa000, 0x6e9: 0x3f78, 0x6ef: 0xa000, 0x6f0: 0x3f80, 0x6f1: 0x3f88, 0x6f2: 0xa000, 0x6f3: 0x3f90, 0x6f4: 0x3f98, 0x6f5: 0xa000, 0x6f6: 0x3fa0, 0x6f7: 0x3fa8, 0x6f8: 0xa000, 0x6f9: 0x3fb0, 0x6fa: 0x3fb8, 0x6fb: 0xa000, 0x6fc: 0x3fc0, 0x6fd: 0x3fc8, // Block 0x1c, offset 0x700 0x714: 0x3f00, 0x719: 0x9903, 0x71a: 0x9903, 0x71b: 0x8100, 0x71c: 0x8100, 0x71d: 0xa000, 0x71e: 0x3fd0, 0x726: 0xa000, 0x72b: 0xa000, 0x72c: 0x3fe0, 0x72d: 0xa000, 0x72e: 0x3fe8, 0x72f: 0xa000, 0x730: 0x3ff0, 0x731: 0xa000, 0x732: 0x3ff8, 0x733: 0xa000, 0x734: 0x4000, 0x735: 0xa000, 0x736: 0x4008, 0x737: 0xa000, 0x738: 0x4010, 0x739: 0xa000, 0x73a: 0x4018, 0x73b: 0xa000, 0x73c: 0x4020, 0x73d: 0xa000, 0x73e: 0x4028, 0x73f: 0xa000, // Block 0x1d, offset 0x740 0x740: 0x4030, 0x741: 0xa000, 0x742: 0x4038, 0x744: 0xa000, 0x745: 0x4040, 0x746: 0xa000, 0x747: 0x4048, 0x748: 0xa000, 0x749: 0x4050, 0x74f: 0xa000, 0x750: 0x4058, 0x751: 0x4060, 0x752: 0xa000, 0x753: 0x4068, 0x754: 0x4070, 0x755: 0xa000, 0x756: 0x4078, 0x757: 0x4080, 0x758: 0xa000, 0x759: 0x4088, 0x75a: 0x4090, 0x75b: 0xa000, 0x75c: 0x4098, 0x75d: 0x40a0, 0x76f: 0xa000, 0x770: 0xa000, 0x771: 0xa000, 0x772: 0xa000, 0x774: 0x3fd8, 0x777: 0x40a8, 0x778: 0x40b0, 0x779: 0x40b8, 0x77a: 0x40c0, 0x77d: 0xa000, 0x77e: 0x40c8, // Block 0x1e, offset 0x780 0x780: 0x1377, 0x781: 0x0cfb, 0x782: 0x13d3, 0x783: 0x139f, 0x784: 0x0e57, 0x785: 0x06eb, 0x786: 0x08df, 0x787: 0x162b, 0x788: 0x162b, 0x789: 0x0a0b, 0x78a: 0x145f, 0x78b: 0x0943, 0x78c: 0x0a07, 0x78d: 0x0bef, 0x78e: 0x0fcf, 0x78f: 0x115f, 0x790: 0x1297, 0x791: 0x12d3, 0x792: 0x1307, 0x793: 0x141b, 0x794: 0x0d73, 0x795: 0x0dff, 0x796: 0x0eab, 0x797: 0x0f43, 0x798: 0x125f, 0x799: 0x1447, 0x79a: 0x1573, 0x79b: 0x070f, 0x79c: 0x08b3, 0x79d: 0x0d87, 0x79e: 0x0ecf, 0x79f: 0x1293, 0x7a0: 0x15c3, 0x7a1: 0x0ab3, 0x7a2: 0x0e77, 0x7a3: 0x1283, 0x7a4: 0x1317, 0x7a5: 0x0c23, 0x7a6: 0x11bb, 0x7a7: 0x12df, 0x7a8: 0x0b1f, 0x7a9: 0x0d0f, 0x7aa: 0x0e17, 0x7ab: 0x0f1b, 0x7ac: 0x1427, 0x7ad: 0x074f, 0x7ae: 0x07e7, 0x7af: 0x0853, 0x7b0: 0x0c8b, 0x7b1: 0x0d7f, 0x7b2: 0x0ecb, 0x7b3: 0x0fef, 0x7b4: 0x1177, 0x7b5: 0x128b, 0x7b6: 0x12a3, 0x7b7: 0x13c7, 0x7b8: 0x14ef, 0x7b9: 0x15a3, 0x7ba: 0x15bf, 0x7bb: 0x102b, 0x7bc: 0x106b, 0x7bd: 0x1123, 0x7be: 0x1243, 0x7bf: 0x147b, // Block 0x1f, offset 0x7c0 0x7c0: 0x15cb, 0x7c1: 0x134b, 0x7c2: 0x09c7, 0x7c3: 0x0b3b, 0x7c4: 0x10db, 0x7c5: 0x119b, 0x7c6: 0x0eff, 0x7c7: 0x1033, 0x7c8: 0x1397, 0x7c9: 0x14e7, 0x7ca: 0x09c3, 0x7cb: 0x0a8f, 0x7cc: 0x0d77, 0x7cd: 0x0e2b, 0x7ce: 0x0e5f, 0x7cf: 0x1113, 0x7d0: 0x113b, 0x7d1: 0x14a7, 0x7d2: 0x084f, 0x7d3: 0x11a7, 0x7d4: 0x07f3, 0x7d5: 0x07ef, 0x7d6: 0x1097, 0x7d7: 0x1127, 0x7d8: 0x125b, 0x7d9: 0x14af, 0x7da: 0x1367, 0x7db: 0x0c27, 0x7dc: 0x0d73, 0x7dd: 0x1357, 0x7de: 0x06f7, 0x7df: 0x0a63, 0x7e0: 0x0b93, 0x7e1: 0x0f2f, 0x7e2: 0x0faf, 0x7e3: 0x0873, 0x7e4: 0x103b, 0x7e5: 0x075f, 0x7e6: 0x0b77, 0x7e7: 0x06d7, 0x7e8: 0x0deb, 0x7e9: 0x0ca3, 0x7ea: 0x110f, 0x7eb: 0x08c7, 0x7ec: 0x09b3, 0x7ed: 0x0ffb, 0x7ee: 0x1263, 0x7ef: 0x133b, 0x7f0: 0x0db7, 0x7f1: 0x13f7, 0x7f2: 0x0de3, 0x7f3: 0x0c37, 0x7f4: 0x121b, 0x7f5: 0x0c57, 0x7f6: 0x0fab, 0x7f7: 0x072b, 0x7f8: 0x07a7, 0x7f9: 0x07eb, 0x7fa: 0x0d53, 0x7fb: 0x10fb, 0x7fc: 0x11f3, 0x7fd: 0x1347, 0x7fe: 0x145b, 0x7ff: 0x085b, // Block 0x20, offset 0x800 0x800: 0x090f, 0x801: 0x0a17, 0x802: 0x0b2f, 0x803: 0x0cbf, 0x804: 0x0e7b, 0x805: 0x103f, 0x806: 0x1497, 0x807: 0x157b, 0x808: 0x15cf, 0x809: 0x15e7, 0x80a: 0x0837, 0x80b: 0x0cf3, 0x80c: 0x0da3, 0x80d: 0x13eb, 0x80e: 0x0afb, 0x80f: 0x0bd7, 0x810: 0x0bf3, 0x811: 0x0c83, 0x812: 0x0e6b, 0x813: 0x0eb7, 0x814: 0x0f67, 0x815: 0x108b, 0x816: 0x112f, 0x817: 0x1193, 0x818: 0x13db, 0x819: 0x126b, 0x81a: 0x1403, 0x81b: 0x147f, 0x81c: 0x080f, 0x81d: 0x083b, 0x81e: 0x0923, 0x81f: 0x0ea7, 0x820: 0x12f3, 0x821: 0x133b, 0x822: 0x0b1b, 0x823: 0x0b8b, 0x824: 0x0c4f, 0x825: 0x0daf, 0x826: 0x10d7, 0x827: 0x0f23, 0x828: 0x073b, 0x829: 0x097f, 0x82a: 0x0a63, 0x82b: 0x0ac7, 0x82c: 0x0b97, 0x82d: 0x0f3f, 0x82e: 0x0f5b, 0x82f: 0x116b, 0x830: 0x118b, 0x831: 0x1463, 0x832: 0x14e3, 0x833: 0x14f3, 0x834: 0x152f, 0x835: 0x0753, 0x836: 0x107f, 0x837: 0x144f, 0x838: 0x14cb, 0x839: 0x0baf, 0x83a: 0x0717, 0x83b: 0x0777, 0x83c: 0x0a67, 0x83d: 0x0a87, 0x83e: 0x0caf, 0x83f: 0x0d73, // Block 0x21, offset 0x840 0x840: 0x0ec3, 0x841: 0x0fcb, 0x842: 0x1277, 0x843: 0x1417, 0x844: 0x1623, 0x845: 0x0ce3, 0x846: 0x14a3, 0x847: 0x0833, 0x848: 0x0d2f, 0x849: 0x0d3b, 0x84a: 0x0e0f, 0x84b: 0x0e47, 0x84c: 0x0f4b, 0x84d: 0x0fa7, 0x84e: 0x1027, 0x84f: 0x110b, 0x850: 0x153b, 0x851: 0x07af, 0x852: 0x0c03, 0x853: 0x14b3, 0x854: 0x0767, 0x855: 0x0aab, 0x856: 0x0e2f, 0x857: 0x13df, 0x858: 0x0b67, 0x859: 0x0bb7, 0x85a: 0x0d43, 0x85b: 0x0f2f, 0x85c: 0x14bb, 0x85d: 0x0817, 0x85e: 0x08ff, 0x85f: 0x0a97, 0x860: 0x0cd3, 0x861: 0x0d1f, 0x862: 0x0d5f, 0x863: 0x0df3, 0x864: 0x0f47, 0x865: 0x0fbb, 0x866: 0x1157, 0x867: 0x12f7, 0x868: 0x1303, 0x869: 0x1457, 0x86a: 0x14d7, 0x86b: 0x0883, 0x86c: 0x0e4b, 0x86d: 0x0903, 0x86e: 0x0ec7, 0x86f: 0x0f6b, 0x870: 0x1287, 0x871: 0x14bf, 0x872: 0x15ab, 0x873: 0x15d3, 0x874: 0x0d37, 0x875: 0x0e27, 0x876: 0x11c3, 0x877: 0x10b7, 0x878: 0x10c3, 0x879: 0x10e7, 0x87a: 0x0f17, 0x87b: 0x0e9f, 0x87c: 0x1363, 0x87d: 0x0733, 0x87e: 0x122b, 0x87f: 0x081b, // Block 0x22, offset 0x880 0x880: 0x080b, 0x881: 0x0b0b, 0x882: 0x0c2b, 0x883: 0x10f3, 0x884: 0x0a53, 0x885: 0x0e03, 0x886: 0x0cef, 0x887: 0x13e7, 0x888: 0x12e7, 0x889: 0x14ab, 0x88a: 0x1323, 0x88b: 0x0b27, 0x88c: 0x0787, 0x88d: 0x095b, 0x890: 0x09af, 0x892: 0x0cdf, 0x895: 0x07f7, 0x896: 0x0f1f, 0x897: 0x0fe3, 0x898: 0x1047, 0x899: 0x1063, 0x89a: 0x1067, 0x89b: 0x107b, 0x89c: 0x14fb, 0x89d: 0x10eb, 0x89e: 0x116f, 0x8a0: 0x128f, 0x8a2: 0x1353, 0x8a5: 0x1407, 0x8a6: 0x1433, 0x8aa: 0x154f, 0x8ab: 0x1553, 0x8ac: 0x1557, 0x8ad: 0x15bb, 0x8ae: 0x142b, 0x8af: 0x14c7, 0x8b0: 0x0757, 0x8b1: 0x077b, 0x8b2: 0x078f, 0x8b3: 0x084b, 0x8b4: 0x0857, 0x8b5: 0x0897, 0x8b6: 0x094b, 0x8b7: 0x0967, 0x8b8: 0x096f, 0x8b9: 0x09ab, 0x8ba: 0x09b7, 0x8bb: 0x0a93, 0x8bc: 0x0a9b, 0x8bd: 0x0ba3, 0x8be: 0x0bcb, 0x8bf: 0x0bd3, // Block 0x23, offset 0x8c0 0x8c0: 0x0beb, 0x8c1: 0x0c97, 0x8c2: 0x0cc7, 0x8c3: 0x0ce7, 0x8c4: 0x0d57, 0x8c5: 0x0e1b, 0x8c6: 0x0e37, 0x8c7: 0x0e67, 0x8c8: 0x0ebb, 0x8c9: 0x0edb, 0x8ca: 0x0f4f, 0x8cb: 0x102f, 0x8cc: 0x104b, 0x8cd: 0x1053, 0x8ce: 0x104f, 0x8cf: 0x1057, 0x8d0: 0x105b, 0x8d1: 0x105f, 0x8d2: 0x1073, 0x8d3: 0x1077, 0x8d4: 0x109b, 0x8d5: 0x10af, 0x8d6: 0x10cb, 0x8d7: 0x112f, 0x8d8: 0x1137, 0x8d9: 0x113f, 0x8da: 0x1153, 0x8db: 0x117b, 0x8dc: 0x11cb, 0x8dd: 0x11ff, 0x8de: 0x11ff, 0x8df: 0x1267, 0x8e0: 0x130f, 0x8e1: 0x1327, 0x8e2: 0x135b, 0x8e3: 0x135f, 0x8e4: 0x13a3, 0x8e5: 0x13a7, 0x8e6: 0x13ff, 0x8e7: 0x1407, 0x8e8: 0x14db, 0x8e9: 0x151f, 0x8ea: 0x1537, 0x8eb: 0x0b9b, 0x8ec: 0x171e, 0x8ed: 0x11e3, 0x8f0: 0x06df, 0x8f1: 0x07e3, 0x8f2: 0x07a3, 0x8f3: 0x074b, 0x8f4: 0x078b, 0x8f5: 0x07b7, 0x8f6: 0x0847, 0x8f7: 0x0863, 0x8f8: 0x094b, 0x8f9: 0x0937, 0x8fa: 0x0947, 0x8fb: 0x0963, 0x8fc: 0x09af, 0x8fd: 0x09bf, 0x8fe: 0x0a03, 0x8ff: 0x0a0f, // Block 0x24, offset 0x900 0x900: 0x0a2b, 0x901: 0x0a3b, 0x902: 0x0b23, 0x903: 0x0b2b, 0x904: 0x0b5b, 0x905: 0x0b7b, 0x906: 0x0bab, 0x907: 0x0bc3, 0x908: 0x0bb3, 0x909: 0x0bd3, 0x90a: 0x0bc7, 0x90b: 0x0beb, 0x90c: 0x0c07, 0x90d: 0x0c5f, 0x90e: 0x0c6b, 0x90f: 0x0c73, 0x910: 0x0c9b, 0x911: 0x0cdf, 0x912: 0x0d0f, 0x913: 0x0d13, 0x914: 0x0d27, 0x915: 0x0da7, 0x916: 0x0db7, 0x917: 0x0e0f, 0x918: 0x0e5b, 0x919: 0x0e53, 0x91a: 0x0e67, 0x91b: 0x0e83, 0x91c: 0x0ebb, 0x91d: 0x1013, 0x91e: 0x0edf, 0x91f: 0x0f13, 0x920: 0x0f1f, 0x921: 0x0f5f, 0x922: 0x0f7b, 0x923: 0x0f9f, 0x924: 0x0fc3, 0x925: 0x0fc7, 0x926: 0x0fe3, 0x927: 0x0fe7, 0x928: 0x0ff7, 0x929: 0x100b, 0x92a: 0x1007, 0x92b: 0x1037, 0x92c: 0x10b3, 0x92d: 0x10cb, 0x92e: 0x10e3, 0x92f: 0x111b, 0x930: 0x112f, 0x931: 0x114b, 0x932: 0x117b, 0x933: 0x122f, 0x934: 0x1257, 0x935: 0x12cb, 0x936: 0x1313, 0x937: 0x131f, 0x938: 0x1327, 0x939: 0x133f, 0x93a: 0x1353, 0x93b: 0x1343, 0x93c: 0x135b, 0x93d: 0x1357, 0x93e: 0x134f, 0x93f: 0x135f, // Block 0x25, offset 0x940 0x940: 0x136b, 0x941: 0x13a7, 0x942: 0x13e3, 0x943: 0x1413, 0x944: 0x144b, 0x945: 0x146b, 0x946: 0x14b7, 0x947: 0x14db, 0x948: 0x14fb, 0x949: 0x150f, 0x94a: 0x151f, 0x94b: 0x152b, 0x94c: 0x1537, 0x94d: 0x158b, 0x94e: 0x162b, 0x94f: 0x16b5, 0x950: 0x16b0, 0x951: 0x16e2, 0x952: 0x0607, 0x953: 0x062f, 0x954: 0x0633, 0x955: 0x1764, 0x956: 0x1791, 0x957: 0x1809, 0x958: 0x1617, 0x959: 0x1627, // Block 0x26, offset 0x980 0x980: 0x06fb, 0x981: 0x06f3, 0x982: 0x0703, 0x983: 0x1647, 0x984: 0x0747, 0x985: 0x0757, 0x986: 0x075b, 0x987: 0x0763, 0x988: 0x076b, 0x989: 0x076f, 0x98a: 0x077b, 0x98b: 0x0773, 0x98c: 0x05b3, 0x98d: 0x165b, 0x98e: 0x078f, 0x98f: 0x0793, 0x990: 0x0797, 0x991: 0x07b3, 0x992: 0x164c, 0x993: 0x05b7, 0x994: 0x079f, 0x995: 0x07bf, 0x996: 0x1656, 0x997: 0x07cf, 0x998: 0x07d7, 0x999: 0x0737, 0x99a: 0x07df, 0x99b: 0x07e3, 0x99c: 0x1831, 0x99d: 0x07ff, 0x99e: 0x0807, 0x99f: 0x05bf, 0x9a0: 0x081f, 0x9a1: 0x0823, 0x9a2: 0x082b, 0x9a3: 0x082f, 0x9a4: 0x05c3, 0x9a5: 0x0847, 0x9a6: 0x084b, 0x9a7: 0x0857, 0x9a8: 0x0863, 0x9a9: 0x0867, 0x9aa: 0x086b, 0x9ab: 0x0873, 0x9ac: 0x0893, 0x9ad: 0x0897, 0x9ae: 0x089f, 0x9af: 0x08af, 0x9b0: 0x08b7, 0x9b1: 0x08bb, 0x9b2: 0x08bb, 0x9b3: 0x08bb, 0x9b4: 0x166a, 0x9b5: 0x0e93, 0x9b6: 0x08cf, 0x9b7: 0x08d7, 0x9b8: 0x166f, 0x9b9: 0x08e3, 0x9ba: 0x08eb, 0x9bb: 0x08f3, 0x9bc: 0x091b, 0x9bd: 0x0907, 0x9be: 0x0913, 0x9bf: 0x0917, // Block 0x27, offset 0x9c0 0x9c0: 0x091f, 0x9c1: 0x0927, 0x9c2: 0x092b, 0x9c3: 0x0933, 0x9c4: 0x093b, 0x9c5: 0x093f, 0x9c6: 0x093f, 0x9c7: 0x0947, 0x9c8: 0x094f, 0x9c9: 0x0953, 0x9ca: 0x095f, 0x9cb: 0x0983, 0x9cc: 0x0967, 0x9cd: 0x0987, 0x9ce: 0x096b, 0x9cf: 0x0973, 0x9d0: 0x080b, 0x9d1: 0x09cf, 0x9d2: 0x0997, 0x9d3: 0x099b, 0x9d4: 0x099f, 0x9d5: 0x0993, 0x9d6: 0x09a7, 0x9d7: 0x09a3, 0x9d8: 0x09bb, 0x9d9: 0x1674, 0x9da: 0x09d7, 0x9db: 0x09db, 0x9dc: 0x09e3, 0x9dd: 0x09ef, 0x9de: 0x09f7, 0x9df: 0x0a13, 0x9e0: 0x1679, 0x9e1: 0x167e, 0x9e2: 0x0a1f, 0x9e3: 0x0a23, 0x9e4: 0x0a27, 0x9e5: 0x0a1b, 0x9e6: 0x0a2f, 0x9e7: 0x05c7, 0x9e8: 0x05cb, 0x9e9: 0x0a37, 0x9ea: 0x0a3f, 0x9eb: 0x0a3f, 0x9ec: 0x1683, 0x9ed: 0x0a5b, 0x9ee: 0x0a5f, 0x9ef: 0x0a63, 0x9f0: 0x0a6b, 0x9f1: 0x1688, 0x9f2: 0x0a73, 0x9f3: 0x0a77, 0x9f4: 0x0b4f, 0x9f5: 0x0a7f, 0x9f6: 0x05cf, 0x9f7: 0x0a8b, 0x9f8: 0x0a9b, 0x9f9: 0x0aa7, 0x9fa: 0x0aa3, 0x9fb: 0x1692, 0x9fc: 0x0aaf, 0x9fd: 0x1697, 0x9fe: 0x0abb, 0x9ff: 0x0ab7, // Block 0x28, offset 0xa00 0xa00: 0x0abf, 0xa01: 0x0acf, 0xa02: 0x0ad3, 0xa03: 0x05d3, 0xa04: 0x0ae3, 0xa05: 0x0aeb, 0xa06: 0x0aef, 0xa07: 0x0af3, 0xa08: 0x05d7, 0xa09: 0x169c, 0xa0a: 0x05db, 0xa0b: 0x0b0f, 0xa0c: 0x0b13, 0xa0d: 0x0b17, 0xa0e: 0x0b1f, 0xa0f: 0x1863, 0xa10: 0x0b37, 0xa11: 0x16a6, 0xa12: 0x16a6, 0xa13: 0x11d7, 0xa14: 0x0b47, 0xa15: 0x0b47, 0xa16: 0x05df, 0xa17: 0x16c9, 0xa18: 0x179b, 0xa19: 0x0b57, 0xa1a: 0x0b5f, 0xa1b: 0x05e3, 0xa1c: 0x0b73, 0xa1d: 0x0b83, 0xa1e: 0x0b87, 0xa1f: 0x0b8f, 0xa20: 0x0b9f, 0xa21: 0x05eb, 0xa22: 0x05e7, 0xa23: 0x0ba3, 0xa24: 0x16ab, 0xa25: 0x0ba7, 0xa26: 0x0bbb, 0xa27: 0x0bbf, 0xa28: 0x0bc3, 0xa29: 0x0bbf, 0xa2a: 0x0bcf, 0xa2b: 0x0bd3, 0xa2c: 0x0be3, 0xa2d: 0x0bdb, 0xa2e: 0x0bdf, 0xa2f: 0x0be7, 0xa30: 0x0beb, 0xa31: 0x0bef, 0xa32: 0x0bfb, 0xa33: 0x0bff, 0xa34: 0x0c17, 0xa35: 0x0c1f, 0xa36: 0x0c2f, 0xa37: 0x0c43, 0xa38: 0x16ba, 0xa39: 0x0c3f, 0xa3a: 0x0c33, 0xa3b: 0x0c4b, 0xa3c: 0x0c53, 0xa3d: 0x0c67, 0xa3e: 0x16bf, 0xa3f: 0x0c6f, // Block 0x29, offset 0xa40 0xa40: 0x0c63, 0xa41: 0x0c5b, 0xa42: 0x05ef, 0xa43: 0x0c77, 0xa44: 0x0c7f, 0xa45: 0x0c87, 0xa46: 0x0c7b, 0xa47: 0x05f3, 0xa48: 0x0c97, 0xa49: 0x0c9f, 0xa4a: 0x16c4, 0xa4b: 0x0ccb, 0xa4c: 0x0cff, 0xa4d: 0x0cdb, 0xa4e: 0x05ff, 0xa4f: 0x0ce7, 0xa50: 0x05fb, 0xa51: 0x05f7, 0xa52: 0x07c3, 0xa53: 0x07c7, 0xa54: 0x0d03, 0xa55: 0x0ceb, 0xa56: 0x11ab, 0xa57: 0x0663, 0xa58: 0x0d0f, 0xa59: 0x0d13, 0xa5a: 0x0d17, 0xa5b: 0x0d2b, 0xa5c: 0x0d23, 0xa5d: 0x16dd, 0xa5e: 0x0603, 0xa5f: 0x0d3f, 0xa60: 0x0d33, 0xa61: 0x0d4f, 0xa62: 0x0d57, 0xa63: 0x16e7, 0xa64: 0x0d5b, 0xa65: 0x0d47, 0xa66: 0x0d63, 0xa67: 0x0607, 0xa68: 0x0d67, 0xa69: 0x0d6b, 0xa6a: 0x0d6f, 0xa6b: 0x0d7b, 0xa6c: 0x16ec, 0xa6d: 0x0d83, 0xa6e: 0x060b, 0xa6f: 0x0d8f, 0xa70: 0x16f1, 0xa71: 0x0d93, 0xa72: 0x060f, 0xa73: 0x0d9f, 0xa74: 0x0dab, 0xa75: 0x0db7, 0xa76: 0x0dbb, 0xa77: 0x16f6, 0xa78: 0x168d, 0xa79: 0x16fb, 0xa7a: 0x0ddb, 0xa7b: 0x1700, 0xa7c: 0x0de7, 0xa7d: 0x0def, 0xa7e: 0x0ddf, 0xa7f: 0x0dfb, // Block 0x2a, offset 0xa80 0xa80: 0x0e0b, 0xa81: 0x0e1b, 0xa82: 0x0e0f, 0xa83: 0x0e13, 0xa84: 0x0e1f, 0xa85: 0x0e23, 0xa86: 0x1705, 0xa87: 0x0e07, 0xa88: 0x0e3b, 0xa89: 0x0e3f, 0xa8a: 0x0613, 0xa8b: 0x0e53, 0xa8c: 0x0e4f, 0xa8d: 0x170a, 0xa8e: 0x0e33, 0xa8f: 0x0e6f, 0xa90: 0x170f, 0xa91: 0x1714, 0xa92: 0x0e73, 0xa93: 0x0e87, 0xa94: 0x0e83, 0xa95: 0x0e7f, 0xa96: 0x0617, 0xa97: 0x0e8b, 0xa98: 0x0e9b, 0xa99: 0x0e97, 0xa9a: 0x0ea3, 0xa9b: 0x1651, 0xa9c: 0x0eb3, 0xa9d: 0x1719, 0xa9e: 0x0ebf, 0xa9f: 0x1723, 0xaa0: 0x0ed3, 0xaa1: 0x0edf, 0xaa2: 0x0ef3, 0xaa3: 0x1728, 0xaa4: 0x0f07, 0xaa5: 0x0f0b, 0xaa6: 0x172d, 0xaa7: 0x1732, 0xaa8: 0x0f27, 0xaa9: 0x0f37, 0xaaa: 0x061b, 0xaab: 0x0f3b, 0xaac: 0x061f, 0xaad: 0x061f, 0xaae: 0x0f53, 0xaaf: 0x0f57, 0xab0: 0x0f5f, 0xab1: 0x0f63, 0xab2: 0x0f6f, 0xab3: 0x0623, 0xab4: 0x0f87, 0xab5: 0x1737, 0xab6: 0x0fa3, 0xab7: 0x173c, 0xab8: 0x0faf, 0xab9: 0x16a1, 0xaba: 0x0fbf, 0xabb: 0x1741, 0xabc: 0x1746, 0xabd: 0x174b, 0xabe: 0x0627, 0xabf: 0x062b, // Block 0x2b, offset 0xac0 0xac0: 0x0ff7, 0xac1: 0x1755, 0xac2: 0x1750, 0xac3: 0x175a, 0xac4: 0x175f, 0xac5: 0x0fff, 0xac6: 0x1003, 0xac7: 0x1003, 0xac8: 0x100b, 0xac9: 0x0633, 0xaca: 0x100f, 0xacb: 0x0637, 0xacc: 0x063b, 0xacd: 0x1769, 0xace: 0x1023, 0xacf: 0x102b, 0xad0: 0x1037, 0xad1: 0x063f, 0xad2: 0x176e, 0xad3: 0x105b, 0xad4: 0x1773, 0xad5: 0x1778, 0xad6: 0x107b, 0xad7: 0x1093, 0xad8: 0x0643, 0xad9: 0x109b, 0xada: 0x109f, 0xadb: 0x10a3, 0xadc: 0x177d, 0xadd: 0x1782, 0xade: 0x1782, 0xadf: 0x10bb, 0xae0: 0x0647, 0xae1: 0x1787, 0xae2: 0x10cf, 0xae3: 0x10d3, 0xae4: 0x064b, 0xae5: 0x178c, 0xae6: 0x10ef, 0xae7: 0x064f, 0xae8: 0x10ff, 0xae9: 0x10f7, 0xaea: 0x1107, 0xaeb: 0x1796, 0xaec: 0x111f, 0xaed: 0x0653, 0xaee: 0x112b, 0xaef: 0x1133, 0xaf0: 0x1143, 0xaf1: 0x0657, 0xaf2: 0x17a0, 0xaf3: 0x17a5, 0xaf4: 0x065b, 0xaf5: 0x17aa, 0xaf6: 0x115b, 0xaf7: 0x17af, 0xaf8: 0x1167, 0xaf9: 0x1173, 0xafa: 0x117b, 0xafb: 0x17b4, 0xafc: 0x17b9, 0xafd: 0x118f, 0xafe: 0x17be, 0xaff: 0x1197, // Block 0x2c, offset 0xb00 0xb00: 0x16ce, 0xb01: 0x065f, 0xb02: 0x11af, 0xb03: 0x11b3, 0xb04: 0x0667, 0xb05: 0x11b7, 0xb06: 0x0a33, 0xb07: 0x17c3, 0xb08: 0x17c8, 0xb09: 0x16d3, 0xb0a: 0x16d8, 0xb0b: 0x11d7, 0xb0c: 0x11db, 0xb0d: 0x13f3, 0xb0e: 0x066b, 0xb0f: 0x1207, 0xb10: 0x1203, 0xb11: 0x120b, 0xb12: 0x083f, 0xb13: 0x120f, 0xb14: 0x1213, 0xb15: 0x1217, 0xb16: 0x121f, 0xb17: 0x17cd, 0xb18: 0x121b, 0xb19: 0x1223, 0xb1a: 0x1237, 0xb1b: 0x123b, 0xb1c: 0x1227, 0xb1d: 0x123f, 0xb1e: 0x1253, 0xb1f: 0x1267, 0xb20: 0x1233, 0xb21: 0x1247, 0xb22: 0x124b, 0xb23: 0x124f, 0xb24: 0x17d2, 0xb25: 0x17dc, 0xb26: 0x17d7, 0xb27: 0x066f, 0xb28: 0x126f, 0xb29: 0x1273, 0xb2a: 0x127b, 0xb2b: 0x17f0, 0xb2c: 0x127f, 0xb2d: 0x17e1, 0xb2e: 0x0673, 0xb2f: 0x0677, 0xb30: 0x17e6, 0xb31: 0x17eb, 0xb32: 0x067b, 0xb33: 0x129f, 0xb34: 0x12a3, 0xb35: 0x12a7, 0xb36: 0x12ab, 0xb37: 0x12b7, 0xb38: 0x12b3, 0xb39: 0x12bf, 0xb3a: 0x12bb, 0xb3b: 0x12cb, 0xb3c: 0x12c3, 0xb3d: 0x12c7, 0xb3e: 0x12cf, 0xb3f: 0x067f, // Block 0x2d, offset 0xb40 0xb40: 0x12d7, 0xb41: 0x12db, 0xb42: 0x0683, 0xb43: 0x12eb, 0xb44: 0x12ef, 0xb45: 0x17f5, 0xb46: 0x12fb, 0xb47: 0x12ff, 0xb48: 0x0687, 0xb49: 0x130b, 0xb4a: 0x05bb, 0xb4b: 0x17fa, 0xb4c: 0x17ff, 0xb4d: 0x068b, 0xb4e: 0x068f, 0xb4f: 0x1337, 0xb50: 0x134f, 0xb51: 0x136b, 0xb52: 0x137b, 0xb53: 0x1804, 0xb54: 0x138f, 0xb55: 0x1393, 0xb56: 0x13ab, 0xb57: 0x13b7, 0xb58: 0x180e, 0xb59: 0x1660, 0xb5a: 0x13c3, 0xb5b: 0x13bf, 0xb5c: 0x13cb, 0xb5d: 0x1665, 0xb5e: 0x13d7, 0xb5f: 0x13e3, 0xb60: 0x1813, 0xb61: 0x1818, 0xb62: 0x1423, 0xb63: 0x142f, 0xb64: 0x1437, 0xb65: 0x181d, 0xb66: 0x143b, 0xb67: 0x1467, 0xb68: 0x1473, 0xb69: 0x1477, 0xb6a: 0x146f, 0xb6b: 0x1483, 0xb6c: 0x1487, 0xb6d: 0x1822, 0xb6e: 0x1493, 0xb6f: 0x0693, 0xb70: 0x149b, 0xb71: 0x1827, 0xb72: 0x0697, 0xb73: 0x14d3, 0xb74: 0x0ac3, 0xb75: 0x14eb, 0xb76: 0x182c, 0xb77: 0x1836, 0xb78: 0x069b, 0xb79: 0x069f, 0xb7a: 0x1513, 0xb7b: 0x183b, 0xb7c: 0x06a3, 0xb7d: 0x1840, 0xb7e: 0x152b, 0xb7f: 0x152b, // Block 0x2e, offset 0xb80 0xb80: 0x1533, 0xb81: 0x1845, 0xb82: 0x154b, 0xb83: 0x06a7, 0xb84: 0x155b, 0xb85: 0x1567, 0xb86: 0x156f, 0xb87: 0x1577, 0xb88: 0x06ab, 0xb89: 0x184a, 0xb8a: 0x158b, 0xb8b: 0x15a7, 0xb8c: 0x15b3, 0xb8d: 0x06af, 0xb8e: 0x06b3, 0xb8f: 0x15b7, 0xb90: 0x184f, 0xb91: 0x06b7, 0xb92: 0x1854, 0xb93: 0x1859, 0xb94: 0x185e, 0xb95: 0x15db, 0xb96: 0x06bb, 0xb97: 0x15ef, 0xb98: 0x15f7, 0xb99: 0x15fb, 0xb9a: 0x1603, 0xb9b: 0x160b, 0xb9c: 0x1613, 0xb9d: 0x1868, } // nfcIndex: 22 blocks, 1408 entries, 1408 bytes // Block 0 is the zero block. var nfcIndex = [1408]uint8{ // Block 0x0, offset 0x0 // Block 0x1, offset 0x40 // Block 0x2, offset 0x80 // Block 0x3, offset 0xc0 0xc2: 0x2d, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x2e, 0xc7: 0x04, 0xc8: 0x05, 0xca: 0x2f, 0xcb: 0x30, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x31, 0xd0: 0x09, 0xd1: 0x32, 0xd2: 0x33, 0xd3: 0x0a, 0xd6: 0x0b, 0xd7: 0x34, 0xd8: 0x35, 0xd9: 0x0c, 0xdb: 0x36, 0xdc: 0x37, 0xdd: 0x38, 0xdf: 0x39, 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a, 0xf0: 0x13, // Block 0x4, offset 0x100 0x120: 0x3a, 0x121: 0x3b, 0x123: 0x3c, 0x124: 0x3d, 0x125: 0x3e, 0x126: 0x3f, 0x127: 0x40, 0x128: 0x41, 0x129: 0x42, 0x12a: 0x43, 0x12b: 0x44, 0x12c: 0x3f, 0x12d: 0x45, 0x12e: 0x46, 0x12f: 0x47, 0x131: 0x48, 0x132: 0x49, 0x133: 0x4a, 0x134: 0x4b, 0x135: 0x4c, 0x137: 0x4d, 0x138: 0x4e, 0x139: 0x4f, 0x13a: 0x50, 0x13b: 0x51, 0x13c: 0x52, 0x13d: 0x53, 0x13e: 0x54, 0x13f: 0x55, // Block 0x5, offset 0x140 0x140: 0x56, 0x142: 0x57, 0x144: 0x58, 0x145: 0x59, 0x146: 0x5a, 0x147: 0x5b, 0x14d: 0x5c, 0x15c: 0x5d, 0x15f: 0x5e, 0x162: 0x5f, 0x164: 0x60, 0x168: 0x61, 0x169: 0x62, 0x16a: 0x63, 0x16c: 0x0d, 0x16d: 0x64, 0x16e: 0x65, 0x16f: 0x66, 0x170: 0x67, 0x173: 0x68, 0x177: 0x0e, 0x178: 0x0f, 0x179: 0x10, 0x17a: 0x11, 0x17b: 0x12, 0x17c: 0x13, 0x17d: 0x14, 0x17e: 0x15, 0x17f: 0x16, // Block 0x6, offset 0x180 0x180: 0x69, 0x183: 0x6a, 0x184: 0x6b, 0x186: 0x6c, 0x187: 0x6d, 0x188: 0x6e, 0x189: 0x17, 0x18a: 0x18, 0x18b: 0x6f, 0x18c: 0x70, 0x1ab: 0x71, 0x1b3: 0x72, 0x1b5: 0x73, 0x1b7: 0x74, // Block 0x7, offset 0x1c0 0x1c0: 0x75, 0x1c1: 0x19, 0x1c2: 0x1a, 0x1c3: 0x1b, 0x1c4: 0x76, 0x1c5: 0x77, 0x1c9: 0x78, 0x1cc: 0x79, 0x1cd: 0x7a, // Block 0x8, offset 0x200 0x219: 0x7b, 0x21a: 0x7c, 0x21b: 0x7d, 0x220: 0x7e, 0x223: 0x7f, 0x224: 0x80, 0x225: 0x81, 0x226: 0x82, 0x227: 0x83, 0x22a: 0x84, 0x22b: 0x85, 0x22f: 0x86, 0x230: 0x87, 0x231: 0x88, 0x232: 0x89, 0x233: 0x8a, 0x234: 0x8b, 0x235: 0x8c, 0x236: 0x8d, 0x237: 0x87, 0x238: 0x88, 0x239: 0x89, 0x23a: 0x8a, 0x23b: 0x8b, 0x23c: 0x8c, 0x23d: 0x8d, 0x23e: 0x87, 0x23f: 0x88, // Block 0x9, offset 0x240 0x240: 0x89, 0x241: 0x8a, 0x242: 0x8b, 0x243: 0x8c, 0x244: 0x8d, 0x245: 0x87, 0x246: 0x88, 0x247: 0x89, 0x248: 0x8a, 0x249: 0x8b, 0x24a: 0x8c, 0x24b: 0x8d, 0x24c: 0x87, 0x24d: 0x88, 0x24e: 0x89, 0x24f: 0x8a, 0x250: 0x8b, 0x251: 0x8c, 0x252: 0x8d, 0x253: 0x87, 0x254: 0x88, 0x255: 0x89, 0x256: 0x8a, 0x257: 0x8b, 0x258: 0x8c, 0x259: 0x8d, 0x25a: 0x87, 0x25b: 0x88, 0x25c: 0x89, 0x25d: 0x8a, 0x25e: 0x8b, 0x25f: 0x8c, 0x260: 0x8d, 0x261: 0x87, 0x262: 0x88, 0x263: 0x89, 0x264: 0x8a, 0x265: 0x8b, 0x266: 0x8c, 0x267: 0x8d, 0x268: 0x87, 0x269: 0x88, 0x26a: 0x89, 0x26b: 0x8a, 0x26c: 0x8b, 0x26d: 0x8c, 0x26e: 0x8d, 0x26f: 0x87, 0x270: 0x88, 0x271: 0x89, 0x272: 0x8a, 0x273: 0x8b, 0x274: 0x8c, 0x275: 0x8d, 0x276: 0x87, 0x277: 0x88, 0x278: 0x89, 0x279: 0x8a, 0x27a: 0x8b, 0x27b: 0x8c, 0x27c: 0x8d, 0x27d: 0x87, 0x27e: 0x88, 0x27f: 0x89, // Block 0xa, offset 0x280 0x280: 0x8a, 0x281: 0x8b, 0x282: 0x8c, 0x283: 0x8d, 0x284: 0x87, 0x285: 0x88, 0x286: 0x89, 0x287: 0x8a, 0x288: 0x8b, 0x289: 0x8c, 0x28a: 0x8d, 0x28b: 0x87, 0x28c: 0x88, 0x28d: 0x89, 0x28e: 0x8a, 0x28f: 0x8b, 0x290: 0x8c, 0x291: 0x8d, 0x292: 0x87, 0x293: 0x88, 0x294: 0x89, 0x295: 0x8a, 0x296: 0x8b, 0x297: 0x8c, 0x298: 0x8d, 0x299: 0x87, 0x29a: 0x88, 0x29b: 0x89, 0x29c: 0x8a, 0x29d: 0x8b, 0x29e: 0x8c, 0x29f: 0x8d, 0x2a0: 0x87, 0x2a1: 0x88, 0x2a2: 0x89, 0x2a3: 0x8a, 0x2a4: 0x8b, 0x2a5: 0x8c, 0x2a6: 0x8d, 0x2a7: 0x87, 0x2a8: 0x88, 0x2a9: 0x89, 0x2aa: 0x8a, 0x2ab: 0x8b, 0x2ac: 0x8c, 0x2ad: 0x8d, 0x2ae: 0x87, 0x2af: 0x88, 0x2b0: 0x89, 0x2b1: 0x8a, 0x2b2: 0x8b, 0x2b3: 0x8c, 0x2b4: 0x8d, 0x2b5: 0x87, 0x2b6: 0x88, 0x2b7: 0x89, 0x2b8: 0x8a, 0x2b9: 0x8b, 0x2ba: 0x8c, 0x2bb: 0x8d, 0x2bc: 0x87, 0x2bd: 0x88, 0x2be: 0x89, 0x2bf: 0x8a, // Block 0xb, offset 0x2c0 0x2c0: 0x8b, 0x2c1: 0x8c, 0x2c2: 0x8d, 0x2c3: 0x87, 0x2c4: 0x88, 0x2c5: 0x89, 0x2c6: 0x8a, 0x2c7: 0x8b, 0x2c8: 0x8c, 0x2c9: 0x8d, 0x2ca: 0x87, 0x2cb: 0x88, 0x2cc: 0x89, 0x2cd: 0x8a, 0x2ce: 0x8b, 0x2cf: 0x8c, 0x2d0: 0x8d, 0x2d1: 0x87, 0x2d2: 0x88, 0x2d3: 0x89, 0x2d4: 0x8a, 0x2d5: 0x8b, 0x2d6: 0x8c, 0x2d7: 0x8d, 0x2d8: 0x87, 0x2d9: 0x88, 0x2da: 0x89, 0x2db: 0x8a, 0x2dc: 0x8b, 0x2dd: 0x8c, 0x2de: 0x8e, // Block 0xc, offset 0x300 0x324: 0x1c, 0x325: 0x1d, 0x326: 0x1e, 0x327: 0x1f, 0x328: 0x20, 0x329: 0x21, 0x32a: 0x22, 0x32b: 0x23, 0x32c: 0x8f, 0x32d: 0x90, 0x32e: 0x91, 0x331: 0x92, 0x332: 0x93, 0x333: 0x94, 0x334: 0x95, 0x338: 0x96, 0x339: 0x97, 0x33a: 0x98, 0x33b: 0x99, 0x33e: 0x9a, 0x33f: 0x9b, // Block 0xd, offset 0x340 0x347: 0x9c, 0x34b: 0x9d, 0x34d: 0x9e, 0x368: 0x9f, 0x36b: 0xa0, // Block 0xe, offset 0x380 0x381: 0xa1, 0x382: 0xa2, 0x384: 0xa3, 0x385: 0x82, 0x387: 0xa4, 0x388: 0xa5, 0x38b: 0xa6, 0x38c: 0x3f, 0x38d: 0xa7, 0x391: 0xa8, 0x392: 0xa9, 0x393: 0xaa, 0x396: 0xab, 0x397: 0xac, 0x398: 0x73, 0x39a: 0xad, 0x39c: 0xae, 0x3a8: 0xaf, 0x3a9: 0xb0, 0x3aa: 0xb1, 0x3b0: 0x73, 0x3b5: 0xb2, // Block 0xf, offset 0x3c0 0x3eb: 0xb3, 0x3ec: 0xb4, // Block 0x10, offset 0x400 0x432: 0xb5, // Block 0x11, offset 0x440 0x445: 0xb6, 0x446: 0xb7, 0x447: 0xb8, 0x449: 0xb9, // Block 0x12, offset 0x480 0x480: 0xba, 0x4a3: 0xbb, 0x4a5: 0xbc, // Block 0x13, offset 0x4c0 0x4c8: 0xbd, // Block 0x14, offset 0x500 0x520: 0x24, 0x521: 0x25, 0x522: 0x26, 0x523: 0x27, 0x524: 0x28, 0x525: 0x29, 0x526: 0x2a, 0x527: 0x2b, 0x528: 0x2c, // Block 0x15, offset 0x540 0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d, 0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11, 0x56f: 0x12, } // nfcSparseOffset: 145 entries, 290 bytes var nfcSparseOffset = []uint16{0x0, 0x5, 0x9, 0xb, 0xd, 0x18, 0x28, 0x2a, 0x2f, 0x3a, 0x49, 0x56, 0x5e, 0x62, 0x67, 0x69, 0x7a, 0x82, 0x89, 0x8c, 0x93, 0x97, 0x9b, 0x9d, 0x9f, 0xa8, 0xac, 0xb3, 0xb8, 0xbb, 0xc5, 0xc8, 0xcf, 0xd7, 0xda, 0xdc, 0xde, 0xe0, 0xe5, 0xf6, 0x102, 0x104, 0x10a, 0x10c, 0x10e, 0x110, 0x112, 0x114, 0x116, 0x119, 0x11c, 0x11e, 0x121, 0x124, 0x128, 0x12d, 0x136, 0x138, 0x13b, 0x13d, 0x148, 0x14c, 0x15a, 0x15d, 0x163, 0x169, 0x174, 0x178, 0x17a, 0x17c, 0x17e, 0x180, 0x182, 0x188, 0x18c, 0x18e, 0x190, 0x198, 0x19c, 0x19f, 0x1a1, 0x1a3, 0x1a5, 0x1a8, 0x1aa, 0x1ac, 0x1ae, 0x1b0, 0x1b6, 0x1b9, 0x1bb, 0x1c2, 0x1c8, 0x1ce, 0x1d6, 0x1dc, 0x1e2, 0x1e8, 0x1ec, 0x1fa, 0x203, 0x206, 0x209, 0x20b, 0x20e, 0x210, 0x214, 0x219, 0x21b, 0x21d, 0x222, 0x228, 0x22a, 0x22c, 0x22e, 0x234, 0x237, 0x23a, 0x242, 0x249, 0x24c, 0x24f, 0x251, 0x259, 0x25c, 0x263, 0x266, 0x26c, 0x26e, 0x271, 0x273, 0x275, 0x277, 0x279, 0x27c, 0x27e, 0x280, 0x282, 0x28f, 0x299, 0x29b, 0x29d, 0x2a3, 0x2a5, 0x2a8} // nfcSparseValues: 682 entries, 2728 bytes var nfcSparseValues = [682]valueRange{ // Block 0x0, offset 0x0 {value: 0x0000, lo: 0x04}, {value: 0xa100, lo: 0xa8, hi: 0xa8}, {value: 0x8100, lo: 0xaf, hi: 0xaf}, {value: 0x8100, lo: 0xb4, hi: 0xb4}, {value: 0x8100, lo: 0xb8, hi: 0xb8}, // Block 0x1, offset 0x5 {value: 0x0091, lo: 0x03}, {value: 0x46e2, lo: 0xa0, hi: 0xa1}, {value: 0x4714, lo: 0xaf, hi: 0xb0}, {value: 0xa000, lo: 0xb7, hi: 0xb7}, // Block 0x2, offset 0x9 {value: 0x0000, lo: 0x01}, {value: 0xa000, lo: 0x92, hi: 0x92}, // Block 0x3, offset 0xb {value: 0x0000, lo: 0x01}, {value: 0x8100, lo: 0x98, hi: 0x9d}, // Block 0x4, offset 0xd {value: 0x0006, lo: 0x0a}, {value: 0xa000, lo: 0x81, hi: 0x81}, {value: 0xa000, lo: 0x85, hi: 0x85}, {value: 0xa000, lo: 0x89, hi: 0x89}, {value: 0x4840, lo: 0x8a, hi: 0x8a}, {value: 0x485e, lo: 0x8b, hi: 0x8b}, {value: 0x36c7, lo: 0x8c, hi: 0x8c}, {value: 0x36df, lo: 0x8d, hi: 0x8d}, {value: 0x4876, lo: 0x8e, hi: 0x8e}, {value: 0xa000, lo: 0x92, hi: 0x92}, {value: 0x36fd, lo: 0x93, hi: 0x94}, // Block 0x5, offset 0x18 {value: 0x0000, lo: 0x0f}, {value: 0xa000, lo: 0x83, hi: 0x83}, {value: 0xa000, lo: 0x87, hi: 0x87}, {value: 0xa000, lo: 0x8b, hi: 0x8b}, {value: 0xa000, lo: 0x8d, hi: 0x8d}, {value: 0x37a5, lo: 0x90, hi: 0x90}, {value: 0x37b1, lo: 0x91, hi: 0x91}, {value: 0x379f, lo: 0x93, hi: 0x93}, {value: 0xa000, lo: 0x96, hi: 0x96}, {value: 0x3817, lo: 0x97, hi: 0x97}, {value: 0x37e1, lo: 0x9c, hi: 0x9c}, {value: 0x37c9, lo: 0x9d, hi: 0x9d}, {value: 0x37f3, lo: 0x9e, hi: 0x9e}, {value: 0xa000, lo: 0xb4, hi: 0xb5}, {value: 0x381d, lo: 0xb6, hi: 0xb6}, {value: 0x3823, lo: 0xb7, hi: 0xb7}, // Block 0x6, offset 0x28 {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0x83, hi: 0x87}, // Block 0x7, offset 0x2a {value: 0x0001, lo: 0x04}, {value: 0x8113, lo: 0x81, hi: 0x82}, {value: 0x8132, lo: 0x84, hi: 0x84}, {value: 0x812d, lo: 0x85, hi: 0x85}, {value: 0x810d, lo: 0x87, hi: 0x87}, // Block 0x8, offset 0x2f {value: 0x0000, lo: 0x0a}, {value: 0x8132, lo: 0x90, hi: 0x97}, {value: 0x8119, lo: 0x98, hi: 0x98}, {value: 0x811a, lo: 0x99, hi: 0x99}, {value: 0x811b, lo: 0x9a, hi: 0x9a}, {value: 0x3841, lo: 0xa2, hi: 0xa2}, {value: 0x3847, lo: 0xa3, hi: 0xa3}, {value: 0x3853, lo: 0xa4, hi: 0xa4}, {value: 0x384d, lo: 0xa5, hi: 0xa5}, {value: 0x3859, lo: 0xa6, hi: 0xa6}, {value: 0xa000, lo: 0xa7, hi: 0xa7}, // Block 0x9, offset 0x3a {value: 0x0000, lo: 0x0e}, {value: 0x386b, lo: 0x80, hi: 0x80}, {value: 0xa000, lo: 0x81, hi: 0x81}, {value: 0x385f, lo: 0x82, hi: 0x82}, {value: 0xa000, lo: 0x92, hi: 0x92}, {value: 0x3865, lo: 0x93, hi: 0x93}, {value: 0xa000, lo: 0x95, hi: 0x95}, {value: 0x8132, lo: 0x96, hi: 0x9c}, {value: 0x8132, lo: 0x9f, hi: 0xa2}, {value: 0x812d, lo: 0xa3, hi: 0xa3}, {value: 0x8132, lo: 0xa4, hi: 0xa4}, {value: 0x8132, lo: 0xa7, hi: 0xa8}, {value: 0x812d, lo: 0xaa, hi: 0xaa}, {value: 0x8132, lo: 0xab, hi: 0xac}, {value: 0x812d, lo: 0xad, hi: 0xad}, // Block 0xa, offset 0x49 {value: 0x0000, lo: 0x0c}, {value: 0x811f, lo: 0x91, hi: 0x91}, {value: 0x8132, lo: 0xb0, hi: 0xb0}, {value: 0x812d, lo: 0xb1, hi: 0xb1}, {value: 0x8132, lo: 0xb2, hi: 0xb3}, {value: 0x812d, lo: 0xb4, hi: 0xb4}, {value: 0x8132, lo: 0xb5, hi: 0xb6}, {value: 0x812d, lo: 0xb7, hi: 0xb9}, {value: 0x8132, lo: 0xba, hi: 0xba}, {value: 0x812d, lo: 0xbb, hi: 0xbc}, {value: 0x8132, lo: 0xbd, hi: 0xbd}, {value: 0x812d, lo: 0xbe, hi: 0xbe}, {value: 0x8132, lo: 0xbf, hi: 0xbf}, // Block 0xb, offset 0x56 {value: 0x0005, lo: 0x07}, {value: 0x8132, lo: 0x80, hi: 0x80}, {value: 0x8132, lo: 0x81, hi: 0x81}, {value: 0x812d, lo: 0x82, hi: 0x83}, {value: 0x812d, lo: 0x84, hi: 0x85}, {value: 0x812d, lo: 0x86, hi: 0x87}, {value: 0x812d, lo: 0x88, hi: 0x89}, {value: 0x8132, lo: 0x8a, hi: 0x8a}, // Block 0xc, offset 0x5e {value: 0x0000, lo: 0x03}, {value: 0x8132, lo: 0xab, hi: 0xb1}, {value: 0x812d, lo: 0xb2, hi: 0xb2}, {value: 0x8132, lo: 0xb3, hi: 0xb3}, // Block 0xd, offset 0x62 {value: 0x0000, lo: 0x04}, {value: 0x8132, lo: 0x96, hi: 0x99}, {value: 0x8132, lo: 0x9b, hi: 0xa3}, {value: 0x8132, lo: 0xa5, hi: 0xa7}, {value: 0x8132, lo: 0xa9, hi: 0xad}, // Block 0xe, offset 0x67 {value: 0x0000, lo: 0x01}, {value: 0x812d, lo: 0x99, hi: 0x9b}, // Block 0xf, offset 0x69 {value: 0x0000, lo: 0x10}, {value: 0x8132, lo: 0x94, hi: 0xa1}, {value: 0x812d, lo: 0xa3, hi: 0xa3}, {value: 0x8132, lo: 0xa4, hi: 0xa5}, {value: 0x812d, lo: 0xa6, hi: 0xa6}, {value: 0x8132, lo: 0xa7, hi: 0xa8}, {value: 0x812d, lo: 0xa9, hi: 0xa9}, {value: 0x8132, lo: 0xaa, hi: 0xac}, {value: 0x812d, lo: 0xad, hi: 0xaf}, {value: 0x8116, lo: 0xb0, hi: 0xb0}, {value: 0x8117, lo: 0xb1, hi: 0xb1}, {value: 0x8118, lo: 0xb2, hi: 0xb2}, {value: 0x8132, lo: 0xb3, hi: 0xb5}, {value: 0x812d, lo: 0xb6, hi: 0xb6}, {value: 0x8132, lo: 0xb7, hi: 0xb8}, {value: 0x812d, lo: 0xb9, hi: 0xba}, {value: 0x8132, lo: 0xbb, hi: 0xbf}, // Block 0x10, offset 0x7a {value: 0x0000, lo: 0x07}, {value: 0xa000, lo: 0xa8, hi: 0xa8}, {value: 0x3ed8, lo: 0xa9, hi: 0xa9}, {value: 0xa000, lo: 0xb0, hi: 0xb0}, {value: 0x3ee0, lo: 0xb1, hi: 0xb1}, {value: 0xa000, lo: 0xb3, hi: 0xb3}, {value: 0x3ee8, lo: 0xb4, hi: 0xb4}, {value: 0x9902, lo: 0xbc, hi: 0xbc}, // Block 0x11, offset 0x82 {value: 0x0008, lo: 0x06}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x8132, lo: 0x91, hi: 0x91}, {value: 0x812d, lo: 0x92, hi: 0x92}, {value: 0x8132, lo: 0x93, hi: 0x93}, {value: 0x8132, lo: 0x94, hi: 0x94}, {value: 0x451c, lo: 0x98, hi: 0x9f}, // Block 0x12, offset 0x89 {value: 0x0000, lo: 0x02}, {value: 0x8102, lo: 0xbc, hi: 0xbc}, {value: 0x9900, lo: 0xbe, hi: 0xbe}, // Block 0x13, offset 0x8c {value: 0x0008, lo: 0x06}, {value: 0xa000, lo: 0x87, hi: 0x87}, {value: 0x2c9e, lo: 0x8b, hi: 0x8c}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x9900, lo: 0x97, hi: 0x97}, {value: 0x455c, lo: 0x9c, hi: 0x9d}, {value: 0x456c, lo: 0x9f, hi: 0x9f}, // Block 0x14, offset 0x93 {value: 0x0000, lo: 0x03}, {value: 0x4594, lo: 0xb3, hi: 0xb3}, {value: 0x459c, lo: 0xb6, hi: 0xb6}, {value: 0x8102, lo: 0xbc, hi: 0xbc}, // Block 0x15, offset 0x97 {value: 0x0008, lo: 0x03}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x4574, lo: 0x99, hi: 0x9b}, {value: 0x458c, lo: 0x9e, hi: 0x9e}, // Block 0x16, offset 0x9b {value: 0x0000, lo: 0x01}, {value: 0x8102, lo: 0xbc, hi: 0xbc}, // Block 0x17, offset 0x9d {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, // Block 0x18, offset 0x9f {value: 0x0000, lo: 0x08}, {value: 0xa000, lo: 0x87, hi: 0x87}, {value: 0x2cb6, lo: 0x88, hi: 0x88}, {value: 0x2cae, lo: 0x8b, hi: 0x8b}, {value: 0x2cbe, lo: 0x8c, hi: 0x8c}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x9900, lo: 0x96, hi: 0x97}, {value: 0x45a4, lo: 0x9c, hi: 0x9c}, {value: 0x45ac, lo: 0x9d, hi: 0x9d}, // Block 0x19, offset 0xa8 {value: 0x0000, lo: 0x03}, {value: 0xa000, lo: 0x92, hi: 0x92}, {value: 0x2cc6, lo: 0x94, hi: 0x94}, {value: 0x9900, lo: 0xbe, hi: 0xbe}, // Block 0x1a, offset 0xac {value: 0x0000, lo: 0x06}, {value: 0xa000, lo: 0x86, hi: 0x87}, {value: 0x2cce, lo: 0x8a, hi: 0x8a}, {value: 0x2cde, lo: 0x8b, hi: 0x8b}, {value: 0x2cd6, lo: 0x8c, hi: 0x8c}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x9900, lo: 0x97, hi: 0x97}, // Block 0x1b, offset 0xb3 {value: 0x1801, lo: 0x04}, {value: 0xa000, lo: 0x86, hi: 0x86}, {value: 0x3ef0, lo: 0x88, hi: 0x88}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x8120, lo: 0x95, hi: 0x96}, // Block 0x1c, offset 0xb8 {value: 0x0000, lo: 0x02}, {value: 0x8102, lo: 0xbc, hi: 0xbc}, {value: 0xa000, lo: 0xbf, hi: 0xbf}, // Block 0x1d, offset 0xbb {value: 0x0000, lo: 0x09}, {value: 0x2ce6, lo: 0x80, hi: 0x80}, {value: 0x9900, lo: 0x82, hi: 0x82}, {value: 0xa000, lo: 0x86, hi: 0x86}, {value: 0x2cee, lo: 0x87, hi: 0x87}, {value: 0x2cf6, lo: 0x88, hi: 0x88}, {value: 0x2f50, lo: 0x8a, hi: 0x8a}, {value: 0x2dd8, lo: 0x8b, hi: 0x8b}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x9900, lo: 0x95, hi: 0x96}, // Block 0x1e, offset 0xc5 {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0xbb, hi: 0xbc}, {value: 0x9900, lo: 0xbe, hi: 0xbe}, // Block 0x1f, offset 0xc8 {value: 0x0000, lo: 0x06}, {value: 0xa000, lo: 0x86, hi: 0x87}, {value: 0x2cfe, lo: 0x8a, hi: 0x8a}, {value: 0x2d0e, lo: 0x8b, hi: 0x8b}, {value: 0x2d06, lo: 0x8c, hi: 0x8c}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x9900, lo: 0x97, hi: 0x97}, // Block 0x20, offset 0xcf {value: 0x6bea, lo: 0x07}, {value: 0x9904, lo: 0x8a, hi: 0x8a}, {value: 0x9900, lo: 0x8f, hi: 0x8f}, {value: 0xa000, lo: 0x99, hi: 0x99}, {value: 0x3ef8, lo: 0x9a, hi: 0x9a}, {value: 0x2f58, lo: 0x9c, hi: 0x9c}, {value: 0x2de3, lo: 0x9d, hi: 0x9d}, {value: 0x2d16, lo: 0x9e, hi: 0x9f}, // Block 0x21, offset 0xd7 {value: 0x0000, lo: 0x02}, {value: 0x8122, lo: 0xb8, hi: 0xb9}, {value: 0x8104, lo: 0xba, hi: 0xba}, // Block 0x22, offset 0xda {value: 0x0000, lo: 0x01}, {value: 0x8123, lo: 0x88, hi: 0x8b}, // Block 0x23, offset 0xdc {value: 0x0000, lo: 0x01}, {value: 0x8124, lo: 0xb8, hi: 0xb9}, // Block 0x24, offset 0xde {value: 0x0000, lo: 0x01}, {value: 0x8125, lo: 0x88, hi: 0x8b}, // Block 0x25, offset 0xe0 {value: 0x0000, lo: 0x04}, {value: 0x812d, lo: 0x98, hi: 0x99}, {value: 0x812d, lo: 0xb5, hi: 0xb5}, {value: 0x812d, lo: 0xb7, hi: 0xb7}, {value: 0x812b, lo: 0xb9, hi: 0xb9}, // Block 0x26, offset 0xe5 {value: 0x0000, lo: 0x10}, {value: 0x2644, lo: 0x83, hi: 0x83}, {value: 0x264b, lo: 0x8d, hi: 0x8d}, {value: 0x2652, lo: 0x92, hi: 0x92}, {value: 0x2659, lo: 0x97, hi: 0x97}, {value: 0x2660, lo: 0x9c, hi: 0x9c}, {value: 0x263d, lo: 0xa9, hi: 0xa9}, {value: 0x8126, lo: 0xb1, hi: 0xb1}, {value: 0x8127, lo: 0xb2, hi: 0xb2}, {value: 0x4a84, lo: 0xb3, hi: 0xb3}, {value: 0x8128, lo: 0xb4, hi: 0xb4}, {value: 0x4a8d, lo: 0xb5, hi: 0xb5}, {value: 0x45b4, lo: 0xb6, hi: 0xb6}, {value: 0x8200, lo: 0xb7, hi: 0xb7}, {value: 0x45bc, lo: 0xb8, hi: 0xb8}, {value: 0x8200, lo: 0xb9, hi: 0xb9}, {value: 0x8127, lo: 0xba, hi: 0xbd}, // Block 0x27, offset 0xf6 {value: 0x0000, lo: 0x0b}, {value: 0x8127, lo: 0x80, hi: 0x80}, {value: 0x4a96, lo: 0x81, hi: 0x81}, {value: 0x8132, lo: 0x82, hi: 0x83}, {value: 0x8104, lo: 0x84, hi: 0x84}, {value: 0x8132, lo: 0x86, hi: 0x87}, {value: 0x266e, lo: 0x93, hi: 0x93}, {value: 0x2675, lo: 0x9d, hi: 0x9d}, {value: 0x267c, lo: 0xa2, hi: 0xa2}, {value: 0x2683, lo: 0xa7, hi: 0xa7}, {value: 0x268a, lo: 0xac, hi: 0xac}, {value: 0x2667, lo: 0xb9, hi: 0xb9}, // Block 0x28, offset 0x102 {value: 0x0000, lo: 0x01}, {value: 0x812d, lo: 0x86, hi: 0x86}, // Block 0x29, offset 0x104 {value: 0x0000, lo: 0x05}, {value: 0xa000, lo: 0xa5, hi: 0xa5}, {value: 0x2d1e, lo: 0xa6, hi: 0xa6}, {value: 0x9900, lo: 0xae, hi: 0xae}, {value: 0x8102, lo: 0xb7, hi: 0xb7}, {value: 0x8104, lo: 0xb9, hi: 0xba}, // Block 0x2a, offset 0x10a {value: 0x0000, lo: 0x01}, {value: 0x812d, lo: 0x8d, hi: 0x8d}, // Block 0x2b, offset 0x10c {value: 0x0000, lo: 0x01}, {value: 0xa000, lo: 0x80, hi: 0x92}, // Block 0x2c, offset 0x10e {value: 0x0000, lo: 0x01}, {value: 0xb900, lo: 0xa1, hi: 0xb5}, // Block 0x2d, offset 0x110 {value: 0x0000, lo: 0x01}, {value: 0x9900, lo: 0xa8, hi: 0xbf}, // Block 0x2e, offset 0x112 {value: 0x0000, lo: 0x01}, {value: 0x9900, lo: 0x80, hi: 0x82}, // Block 0x2f, offset 0x114 {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0x9d, hi: 0x9f}, // Block 0x30, offset 0x116 {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0x94, hi: 0x94}, {value: 0x8104, lo: 0xb4, hi: 0xb4}, // Block 0x31, offset 0x119 {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0x92, hi: 0x92}, {value: 0x8132, lo: 0x9d, hi: 0x9d}, // Block 0x32, offset 0x11c {value: 0x0000, lo: 0x01}, {value: 0x8131, lo: 0xa9, hi: 0xa9}, // Block 0x33, offset 0x11e {value: 0x0004, lo: 0x02}, {value: 0x812e, lo: 0xb9, hi: 0xba}, {value: 0x812d, lo: 0xbb, hi: 0xbb}, // Block 0x34, offset 0x121 {value: 0x0000, lo: 0x02}, {value: 0x8132, lo: 0x97, hi: 0x97}, {value: 0x812d, lo: 0x98, hi: 0x98}, // Block 0x35, offset 0x124 {value: 0x0000, lo: 0x03}, {value: 0x8104, lo: 0xa0, hi: 0xa0}, {value: 0x8132, lo: 0xb5, hi: 0xbc}, {value: 0x812d, lo: 0xbf, hi: 0xbf}, // Block 0x36, offset 0x128 {value: 0x0000, lo: 0x04}, {value: 0x8132, lo: 0xb0, hi: 0xb4}, {value: 0x812d, lo: 0xb5, hi: 0xba}, {value: 0x8132, lo: 0xbb, hi: 0xbc}, {value: 0x812d, lo: 0xbd, hi: 0xbd}, // Block 0x37, offset 0x12d {value: 0x0000, lo: 0x08}, {value: 0x2d66, lo: 0x80, hi: 0x80}, {value: 0x2d6e, lo: 0x81, hi: 0x81}, {value: 0xa000, lo: 0x82, hi: 0x82}, {value: 0x2d76, lo: 0x83, hi: 0x83}, {value: 0x8104, lo: 0x84, hi: 0x84}, {value: 0x8132, lo: 0xab, hi: 0xab}, {value: 0x812d, lo: 0xac, hi: 0xac}, {value: 0x8132, lo: 0xad, hi: 0xb3}, // Block 0x38, offset 0x136 {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0xaa, hi: 0xab}, // Block 0x39, offset 0x138 {value: 0x0000, lo: 0x02}, {value: 0x8102, lo: 0xa6, hi: 0xa6}, {value: 0x8104, lo: 0xb2, hi: 0xb3}, // Block 0x3a, offset 0x13b {value: 0x0000, lo: 0x01}, {value: 0x8102, lo: 0xb7, hi: 0xb7}, // Block 0x3b, offset 0x13d {value: 0x0000, lo: 0x0a}, {value: 0x8132, lo: 0x90, hi: 0x92}, {value: 0x8101, lo: 0x94, hi: 0x94}, {value: 0x812d, lo: 0x95, hi: 0x99}, {value: 0x8132, lo: 0x9a, hi: 0x9b}, {value: 0x812d, lo: 0x9c, hi: 0x9f}, {value: 0x8132, lo: 0xa0, hi: 0xa0}, {value: 0x8101, lo: 0xa2, hi: 0xa8}, {value: 0x812d, lo: 0xad, hi: 0xad}, {value: 0x8132, lo: 0xb4, hi: 0xb4}, {value: 0x8132, lo: 0xb8, hi: 0xb9}, // Block 0x3c, offset 0x148 {value: 0x0004, lo: 0x03}, {value: 0x0433, lo: 0x80, hi: 0x81}, {value: 0x8100, lo: 0x97, hi: 0x97}, {value: 0x8100, lo: 0xbe, hi: 0xbe}, // Block 0x3d, offset 0x14c {value: 0x0000, lo: 0x0d}, {value: 0x8132, lo: 0x90, hi: 0x91}, {value: 0x8101, lo: 0x92, hi: 0x93}, {value: 0x8132, lo: 0x94, hi: 0x97}, {value: 0x8101, lo: 0x98, hi: 0x9a}, {value: 0x8132, lo: 0x9b, hi: 0x9c}, {value: 0x8132, lo: 0xa1, hi: 0xa1}, {value: 0x8101, lo: 0xa5, hi: 0xa6}, {value: 0x8132, lo: 0xa7, hi: 0xa7}, {value: 0x812d, lo: 0xa8, hi: 0xa8}, {value: 0x8132, lo: 0xa9, hi: 0xa9}, {value: 0x8101, lo: 0xaa, hi: 0xab}, {value: 0x812d, lo: 0xac, hi: 0xaf}, {value: 0x8132, lo: 0xb0, hi: 0xb0}, // Block 0x3e, offset 0x15a {value: 0x427b, lo: 0x02}, {value: 0x01b8, lo: 0xa6, hi: 0xa6}, {value: 0x0057, lo: 0xaa, hi: 0xab}, // Block 0x3f, offset 0x15d {value: 0x0007, lo: 0x05}, {value: 0xa000, lo: 0x90, hi: 0x90}, {value: 0xa000, lo: 0x92, hi: 0x92}, {value: 0xa000, lo: 0x94, hi: 0x94}, {value: 0x3bb9, lo: 0x9a, hi: 0x9b}, {value: 0x3bc7, lo: 0xae, hi: 0xae}, // Block 0x40, offset 0x163 {value: 0x000e, lo: 0x05}, {value: 0x3bce, lo: 0x8d, hi: 0x8e}, {value: 0x3bd5, lo: 0x8f, hi: 0x8f}, {value: 0xa000, lo: 0x90, hi: 0x90}, {value: 0xa000, lo: 0x92, hi: 0x92}, {value: 0xa000, lo: 0x94, hi: 0x94}, // Block 0x41, offset 0x169 {value: 0x6408, lo: 0x0a}, {value: 0xa000, lo: 0x83, hi: 0x83}, {value: 0x3be3, lo: 0x84, hi: 0x84}, {value: 0xa000, lo: 0x88, hi: 0x88}, {value: 0x3bea, lo: 0x89, hi: 0x89}, {value: 0xa000, lo: 0x8b, hi: 0x8b}, {value: 0x3bf1, lo: 0x8c, hi: 0x8c}, {value: 0xa000, lo: 0xa3, hi: 0xa3}, {value: 0x3bf8, lo: 0xa4, hi: 0xa5}, {value: 0x3bff, lo: 0xa6, hi: 0xa6}, {value: 0xa000, lo: 0xbc, hi: 0xbc}, // Block 0x42, offset 0x174 {value: 0x0007, lo: 0x03}, {value: 0x3c68, lo: 0xa0, hi: 0xa1}, {value: 0x3c92, lo: 0xa2, hi: 0xa3}, {value: 0x3cbc, lo: 0xaa, hi: 0xad}, // Block 0x43, offset 0x178 {value: 0x0004, lo: 0x01}, {value: 0x048b, lo: 0xa9, hi: 0xaa}, // Block 0x44, offset 0x17a {value: 0x0000, lo: 0x01}, {value: 0x44dd, lo: 0x9c, hi: 0x9c}, // Block 0x45, offset 0x17c {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0xaf, hi: 0xb1}, // Block 0x46, offset 0x17e {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0xbf, hi: 0xbf}, // Block 0x47, offset 0x180 {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0xa0, hi: 0xbf}, // Block 0x48, offset 0x182 {value: 0x0000, lo: 0x05}, {value: 0x812c, lo: 0xaa, hi: 0xaa}, {value: 0x8131, lo: 0xab, hi: 0xab}, {value: 0x8133, lo: 0xac, hi: 0xac}, {value: 0x812e, lo: 0xad, hi: 0xad}, {value: 0x812f, lo: 0xae, hi: 0xaf}, // Block 0x49, offset 0x188 {value: 0x0000, lo: 0x03}, {value: 0x4a9f, lo: 0xb3, hi: 0xb3}, {value: 0x4a9f, lo: 0xb5, hi: 0xb6}, {value: 0x4a9f, lo: 0xba, hi: 0xbf}, // Block 0x4a, offset 0x18c {value: 0x0000, lo: 0x01}, {value: 0x4a9f, lo: 0x8f, hi: 0xa3}, // Block 0x4b, offset 0x18e {value: 0x0000, lo: 0x01}, {value: 0x8100, lo: 0xae, hi: 0xbe}, // Block 0x4c, offset 0x190 {value: 0x0000, lo: 0x07}, {value: 0x8100, lo: 0x84, hi: 0x84}, {value: 0x8100, lo: 0x87, hi: 0x87}, {value: 0x8100, lo: 0x90, hi: 0x90}, {value: 0x8100, lo: 0x9e, hi: 0x9e}, {value: 0x8100, lo: 0xa1, hi: 0xa1}, {value: 0x8100, lo: 0xb2, hi: 0xb2}, {value: 0x8100, lo: 0xbb, hi: 0xbb}, // Block 0x4d, offset 0x198 {value: 0x0000, lo: 0x03}, {value: 0x8100, lo: 0x80, hi: 0x80}, {value: 0x8100, lo: 0x8b, hi: 0x8b}, {value: 0x8100, lo: 0x8e, hi: 0x8e}, // Block 0x4e, offset 0x19c {value: 0x0000, lo: 0x02}, {value: 0x8132, lo: 0xaf, hi: 0xaf}, {value: 0x8132, lo: 0xb4, hi: 0xbd}, // Block 0x4f, offset 0x19f {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0x9e, hi: 0x9f}, // Block 0x50, offset 0x1a1 {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0xb0, hi: 0xb1}, // Block 0x51, offset 0x1a3 {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0x86, hi: 0x86}, // Block 0x52, offset 0x1a5 {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0x84, hi: 0x84}, {value: 0x8132, lo: 0xa0, hi: 0xb1}, // Block 0x53, offset 0x1a8 {value: 0x0000, lo: 0x01}, {value: 0x812d, lo: 0xab, hi: 0xad}, // Block 0x54, offset 0x1aa {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0x93, hi: 0x93}, // Block 0x55, offset 0x1ac {value: 0x0000, lo: 0x01}, {value: 0x8102, lo: 0xb3, hi: 0xb3}, // Block 0x56, offset 0x1ae {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0x80, hi: 0x80}, // Block 0x57, offset 0x1b0 {value: 0x0000, lo: 0x05}, {value: 0x8132, lo: 0xb0, hi: 0xb0}, {value: 0x8132, lo: 0xb2, hi: 0xb3}, {value: 0x812d, lo: 0xb4, hi: 0xb4}, {value: 0x8132, lo: 0xb7, hi: 0xb8}, {value: 0x8132, lo: 0xbe, hi: 0xbf}, // Block 0x58, offset 0x1b6 {value: 0x0000, lo: 0x02}, {value: 0x8132, lo: 0x81, hi: 0x81}, {value: 0x8104, lo: 0xb6, hi: 0xb6}, // Block 0x59, offset 0x1b9 {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0xad, hi: 0xad}, // Block 0x5a, offset 0x1bb {value: 0x0000, lo: 0x06}, {value: 0xe500, lo: 0x80, hi: 0x80}, {value: 0xc600, lo: 0x81, hi: 0x9b}, {value: 0xe500, lo: 0x9c, hi: 0x9c}, {value: 0xc600, lo: 0x9d, hi: 0xb7}, {value: 0xe500, lo: 0xb8, hi: 0xb8}, {value: 0xc600, lo: 0xb9, hi: 0xbf}, // Block 0x5b, offset 0x1c2 {value: 0x0000, lo: 0x05}, {value: 0xc600, lo: 0x80, hi: 0x93}, {value: 0xe500, lo: 0x94, hi: 0x94}, {value: 0xc600, lo: 0x95, hi: 0xaf}, {value: 0xe500, lo: 0xb0, hi: 0xb0}, {value: 0xc600, lo: 0xb1, hi: 0xbf}, // Block 0x5c, offset 0x1c8 {value: 0x0000, lo: 0x05}, {value: 0xc600, lo: 0x80, hi: 0x8b}, {value: 0xe500, lo: 0x8c, hi: 0x8c}, {value: 0xc600, lo: 0x8d, hi: 0xa7}, {value: 0xe500, lo: 0xa8, hi: 0xa8}, {value: 0xc600, lo: 0xa9, hi: 0xbf}, // Block 0x5d, offset 0x1ce {value: 0x0000, lo: 0x07}, {value: 0xc600, lo: 0x80, hi: 0x83}, {value: 0xe500, lo: 0x84, hi: 0x84}, {value: 0xc600, lo: 0x85, hi: 0x9f}, {value: 0xe500, lo: 0xa0, hi: 0xa0}, {value: 0xc600, lo: 0xa1, hi: 0xbb}, {value: 0xe500, lo: 0xbc, hi: 0xbc}, {value: 0xc600, lo: 0xbd, hi: 0xbf}, // Block 0x5e, offset 0x1d6 {value: 0x0000, lo: 0x05}, {value: 0xc600, lo: 0x80, hi: 0x97}, {value: 0xe500, lo: 0x98, hi: 0x98}, {value: 0xc600, lo: 0x99, hi: 0xb3}, {value: 0xe500, lo: 0xb4, hi: 0xb4}, {value: 0xc600, lo: 0xb5, hi: 0xbf}, // Block 0x5f, offset 0x1dc {value: 0x0000, lo: 0x05}, {value: 0xc600, lo: 0x80, hi: 0x8f}, {value: 0xe500, lo: 0x90, hi: 0x90}, {value: 0xc600, lo: 0x91, hi: 0xab}, {value: 0xe500, lo: 0xac, hi: 0xac}, {value: 0xc600, lo: 0xad, hi: 0xbf}, // Block 0x60, offset 0x1e2 {value: 0x0000, lo: 0x05}, {value: 0xc600, lo: 0x80, hi: 0x87}, {value: 0xe500, lo: 0x88, hi: 0x88}, {value: 0xc600, lo: 0x89, hi: 0xa3}, {value: 0xe500, lo: 0xa4, hi: 0xa4}, {value: 0xc600, lo: 0xa5, hi: 0xbf}, // Block 0x61, offset 0x1e8 {value: 0x0000, lo: 0x03}, {value: 0xc600, lo: 0x80, hi: 0x87}, {value: 0xe500, lo: 0x88, hi: 0x88}, {value: 0xc600, lo: 0x89, hi: 0xa3}, // Block 0x62, offset 0x1ec {value: 0x0006, lo: 0x0d}, {value: 0x4390, lo: 0x9d, hi: 0x9d}, {value: 0x8115, lo: 0x9e, hi: 0x9e}, {value: 0x4402, lo: 0x9f, hi: 0x9f}, {value: 0x43f0, lo: 0xaa, hi: 0xab}, {value: 0x44f4, lo: 0xac, hi: 0xac}, {value: 0x44fc, lo: 0xad, hi: 0xad}, {value: 0x4348, lo: 0xae, hi: 0xb1}, {value: 0x4366, lo: 0xb2, hi: 0xb4}, {value: 0x437e, lo: 0xb5, hi: 0xb6}, {value: 0x438a, lo: 0xb8, hi: 0xb8}, {value: 0x4396, lo: 0xb9, hi: 0xbb}, {value: 0x43ae, lo: 0xbc, hi: 0xbc}, {value: 0x43b4, lo: 0xbe, hi: 0xbe}, // Block 0x63, offset 0x1fa {value: 0x0006, lo: 0x08}, {value: 0x43ba, lo: 0x80, hi: 0x81}, {value: 0x43c6, lo: 0x83, hi: 0x84}, {value: 0x43d8, lo: 0x86, hi: 0x89}, {value: 0x43fc, lo: 0x8a, hi: 0x8a}, {value: 0x4378, lo: 0x8b, hi: 0x8b}, {value: 0x4360, lo: 0x8c, hi: 0x8c}, {value: 0x43a8, lo: 0x8d, hi: 0x8d}, {value: 0x43d2, lo: 0x8e, hi: 0x8e}, // Block 0x64, offset 0x203 {value: 0x0000, lo: 0x02}, {value: 0x8100, lo: 0xa4, hi: 0xa5}, {value: 0x8100, lo: 0xb0, hi: 0xb1}, // Block 0x65, offset 0x206 {value: 0x0000, lo: 0x02}, {value: 0x8100, lo: 0x9b, hi: 0x9d}, {value: 0x8200, lo: 0x9e, hi: 0xa3}, // Block 0x66, offset 0x209 {value: 0x0000, lo: 0x01}, {value: 0x8100, lo: 0x90, hi: 0x90}, // Block 0x67, offset 0x20b {value: 0x0000, lo: 0x02}, {value: 0x8100, lo: 0x99, hi: 0x99}, {value: 0x8200, lo: 0xb2, hi: 0xb4}, // Block 0x68, offset 0x20e {value: 0x0000, lo: 0x01}, {value: 0x8100, lo: 0xbc, hi: 0xbd}, // Block 0x69, offset 0x210 {value: 0x0000, lo: 0x03}, {value: 0x8132, lo: 0xa0, hi: 0xa6}, {value: 0x812d, lo: 0xa7, hi: 0xad}, {value: 0x8132, lo: 0xae, hi: 0xaf}, // Block 0x6a, offset 0x214 {value: 0x0000, lo: 0x04}, {value: 0x8100, lo: 0x89, hi: 0x8c}, {value: 0x8100, lo: 0xb0, hi: 0xb2}, {value: 0x8100, lo: 0xb4, hi: 0xb4}, {value: 0x8100, lo: 0xb6, hi: 0xbf}, // Block 0x6b, offset 0x219 {value: 0x0000, lo: 0x01}, {value: 0x8100, lo: 0x81, hi: 0x8c}, // Block 0x6c, offset 0x21b {value: 0x0000, lo: 0x01}, {value: 0x8100, lo: 0xb5, hi: 0xba}, // Block 0x6d, offset 0x21d {value: 0x0000, lo: 0x04}, {value: 0x4a9f, lo: 0x9e, hi: 0x9f}, {value: 0x4a9f, lo: 0xa3, hi: 0xa3}, {value: 0x4a9f, lo: 0xa5, hi: 0xa6}, {value: 0x4a9f, lo: 0xaa, hi: 0xaf}, // Block 0x6e, offset 0x222 {value: 0x0000, lo: 0x05}, {value: 0x4a9f, lo: 0x82, hi: 0x87}, {value: 0x4a9f, lo: 0x8a, hi: 0x8f}, {value: 0x4a9f, lo: 0x92, hi: 0x97}, {value: 0x4a9f, lo: 0x9a, hi: 0x9c}, {value: 0x8100, lo: 0xa3, hi: 0xa3}, // Block 0x6f, offset 0x228 {value: 0x0000, lo: 0x01}, {value: 0x812d, lo: 0xbd, hi: 0xbd}, // Block 0x70, offset 0x22a {value: 0x0000, lo: 0x01}, {value: 0x812d, lo: 0xa0, hi: 0xa0}, // Block 0x71, offset 0x22c {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0xb6, hi: 0xba}, // Block 0x72, offset 0x22e {value: 0x002c, lo: 0x05}, {value: 0x812d, lo: 0x8d, hi: 0x8d}, {value: 0x8132, lo: 0x8f, hi: 0x8f}, {value: 0x8132, lo: 0xb8, hi: 0xb8}, {value: 0x8101, lo: 0xb9, hi: 0xba}, {value: 0x8104, lo: 0xbf, hi: 0xbf}, // Block 0x73, offset 0x234 {value: 0x0000, lo: 0x02}, {value: 0x8132, lo: 0xa5, hi: 0xa5}, {value: 0x812d, lo: 0xa6, hi: 0xa6}, // Block 0x74, offset 0x237 {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0x86, hi: 0x86}, {value: 0x8104, lo: 0xbf, hi: 0xbf}, // Block 0x75, offset 0x23a {value: 0x17fe, lo: 0x07}, {value: 0xa000, lo: 0x99, hi: 0x99}, {value: 0x4238, lo: 0x9a, hi: 0x9a}, {value: 0xa000, lo: 0x9b, hi: 0x9b}, {value: 0x4242, lo: 0x9c, hi: 0x9c}, {value: 0xa000, lo: 0xa5, hi: 0xa5}, {value: 0x424c, lo: 0xab, hi: 0xab}, {value: 0x8104, lo: 0xb9, hi: 0xba}, // Block 0x76, offset 0x242 {value: 0x0000, lo: 0x06}, {value: 0x8132, lo: 0x80, hi: 0x82}, {value: 0x9900, lo: 0xa7, hi: 0xa7}, {value: 0x2d7e, lo: 0xae, hi: 0xae}, {value: 0x2d88, lo: 0xaf, hi: 0xaf}, {value: 0xa000, lo: 0xb1, hi: 0xb2}, {value: 0x8104, lo: 0xb3, hi: 0xb4}, // Block 0x77, offset 0x249 {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0x80, hi: 0x80}, {value: 0x8102, lo: 0x8a, hi: 0x8a}, // Block 0x78, offset 0x24c {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0xb5, hi: 0xb5}, {value: 0x8102, lo: 0xb6, hi: 0xb6}, // Block 0x79, offset 0x24f {value: 0x0002, lo: 0x01}, {value: 0x8102, lo: 0xa9, hi: 0xaa}, // Block 0x7a, offset 0x251 {value: 0x0000, lo: 0x07}, {value: 0xa000, lo: 0x87, hi: 0x87}, {value: 0x2d92, lo: 0x8b, hi: 0x8b}, {value: 0x2d9c, lo: 0x8c, hi: 0x8c}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x9900, lo: 0x97, hi: 0x97}, {value: 0x8132, lo: 0xa6, hi: 0xac}, {value: 0x8132, lo: 0xb0, hi: 0xb4}, // Block 0x7b, offset 0x259 {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0x82, hi: 0x82}, {value: 0x8102, lo: 0x86, hi: 0x86}, // Block 0x7c, offset 0x25c {value: 0x6b5a, lo: 0x06}, {value: 0x9900, lo: 0xb0, hi: 0xb0}, {value: 0xa000, lo: 0xb9, hi: 0xb9}, {value: 0x9900, lo: 0xba, hi: 0xba}, {value: 0x2db0, lo: 0xbb, hi: 0xbb}, {value: 0x2da6, lo: 0xbc, hi: 0xbd}, {value: 0x2dba, lo: 0xbe, hi: 0xbe}, // Block 0x7d, offset 0x263 {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0x82, hi: 0x82}, {value: 0x8102, lo: 0x83, hi: 0x83}, // Block 0x7e, offset 0x266 {value: 0x0000, lo: 0x05}, {value: 0x9900, lo: 0xaf, hi: 0xaf}, {value: 0xa000, lo: 0xb8, hi: 0xb9}, {value: 0x2dc4, lo: 0xba, hi: 0xba}, {value: 0x2dce, lo: 0xbb, hi: 0xbb}, {value: 0x8104, lo: 0xbf, hi: 0xbf}, // Block 0x7f, offset 0x26c {value: 0x0000, lo: 0x01}, {value: 0x8102, lo: 0x80, hi: 0x80}, // Block 0x80, offset 0x26e {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0xb6, hi: 0xb6}, {value: 0x8102, lo: 0xb7, hi: 0xb7}, // Block 0x81, offset 0x271 {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0xab, hi: 0xab}, // Block 0x82, offset 0x273 {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0xb4, hi: 0xb4}, // Block 0x83, offset 0x275 {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0x87, hi: 0x87}, // Block 0x84, offset 0x277 {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0x99, hi: 0x99}, // Block 0x85, offset 0x279 {value: 0x0000, lo: 0x02}, {value: 0x8102, lo: 0x82, hi: 0x82}, {value: 0x8104, lo: 0x84, hi: 0x85}, // Block 0x86, offset 0x27c {value: 0x0000, lo: 0x01}, {value: 0x8101, lo: 0xb0, hi: 0xb4}, // Block 0x87, offset 0x27e {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0xb0, hi: 0xb6}, // Block 0x88, offset 0x280 {value: 0x0000, lo: 0x01}, {value: 0x8101, lo: 0x9e, hi: 0x9e}, // Block 0x89, offset 0x282 {value: 0x0000, lo: 0x0c}, {value: 0x45cc, lo: 0x9e, hi: 0x9e}, {value: 0x45d6, lo: 0x9f, hi: 0x9f}, {value: 0x460a, lo: 0xa0, hi: 0xa0}, {value: 0x4618, lo: 0xa1, hi: 0xa1}, {value: 0x4626, lo: 0xa2, hi: 0xa2}, {value: 0x4634, lo: 0xa3, hi: 0xa3}, {value: 0x4642, lo: 0xa4, hi: 0xa4}, {value: 0x812b, lo: 0xa5, hi: 0xa6}, {value: 0x8101, lo: 0xa7, hi: 0xa9}, {value: 0x8130, lo: 0xad, hi: 0xad}, {value: 0x812b, lo: 0xae, hi: 0xb2}, {value: 0x812d, lo: 0xbb, hi: 0xbf}, // Block 0x8a, offset 0x28f {value: 0x0000, lo: 0x09}, {value: 0x812d, lo: 0x80, hi: 0x82}, {value: 0x8132, lo: 0x85, hi: 0x89}, {value: 0x812d, lo: 0x8a, hi: 0x8b}, {value: 0x8132, lo: 0xaa, hi: 0xad}, {value: 0x45e0, lo: 0xbb, hi: 0xbb}, {value: 0x45ea, lo: 0xbc, hi: 0xbc}, {value: 0x4650, lo: 0xbd, hi: 0xbd}, {value: 0x466c, lo: 0xbe, hi: 0xbe}, {value: 0x465e, lo: 0xbf, hi: 0xbf}, // Block 0x8b, offset 0x299 {value: 0x0000, lo: 0x01}, {value: 0x467a, lo: 0x80, hi: 0x80}, // Block 0x8c, offset 0x29b {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0x82, hi: 0x84}, // Block 0x8d, offset 0x29d {value: 0x0000, lo: 0x05}, {value: 0x8132, lo: 0x80, hi: 0x86}, {value: 0x8132, lo: 0x88, hi: 0x98}, {value: 0x8132, lo: 0x9b, hi: 0xa1}, {value: 0x8132, lo: 0xa3, hi: 0xa4}, {value: 0x8132, lo: 0xa6, hi: 0xaa}, // Block 0x8e, offset 0x2a3 {value: 0x0000, lo: 0x01}, {value: 0x812d, lo: 0x90, hi: 0x96}, // Block 0x8f, offset 0x2a5 {value: 0x0000, lo: 0x02}, {value: 0x8132, lo: 0x84, hi: 0x89}, {value: 0x8102, lo: 0x8a, hi: 0x8a}, // Block 0x90, offset 0x2a8 {value: 0x0000, lo: 0x01}, {value: 0x8100, lo: 0x93, hi: 0x93}, } // lookup returns the trie value for the first UTF-8 encoding in s and // the width in bytes of this encoding. The size will be 0 if s does not // hold enough bytes to complete the encoding. len(s) must be greater than 0. func (t *nfkcTrie) lookup(s []byte) (v uint16, sz int) { c0 := s[0] switch { case c0 < 0x80: // is ASCII return nfkcValues[c0], 1 case c0 < 0xC2: return 0, 1 // Illegal UTF-8: not a starter, not ASCII. case c0 < 0xE0: // 2-byte UTF-8 if len(s) < 2 { return 0, 0 } i := nfkcIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c1), 2 case c0 < 0xF0: // 3-byte UTF-8 if len(s) < 3 { return 0, 0 } i := nfkcIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } o := uint32(i)<<6 + uint32(c1) i = nfkcIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return 0, 2 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c2), 3 case c0 < 0xF8: // 4-byte UTF-8 if len(s) < 4 { return 0, 0 } i := nfkcIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } o := uint32(i)<<6 + uint32(c1) i = nfkcIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return 0, 2 // Illegal UTF-8: not a continuation byte. } o = uint32(i)<<6 + uint32(c2) i = nfkcIndex[o] c3 := s[3] if c3 < 0x80 || 0xC0 <= c3 { return 0, 3 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c3), 4 } // Illegal rune return 0, 1 } // lookupUnsafe returns the trie value for the first UTF-8 encoding in s. // s must start with a full and valid UTF-8 encoded rune. func (t *nfkcTrie) lookupUnsafe(s []byte) uint16 { c0 := s[0] if c0 < 0x80 { // is ASCII return nfkcValues[c0] } i := nfkcIndex[c0] if c0 < 0xE0 { // 2-byte UTF-8 return t.lookupValue(uint32(i), s[1]) } i = nfkcIndex[uint32(i)<<6+uint32(s[1])] if c0 < 0xF0 { // 3-byte UTF-8 return t.lookupValue(uint32(i), s[2]) } i = nfkcIndex[uint32(i)<<6+uint32(s[2])] if c0 < 0xF8 { // 4-byte UTF-8 return t.lookupValue(uint32(i), s[3]) } return 0 } // lookupString returns the trie value for the first UTF-8 encoding in s and // the width in bytes of this encoding. The size will be 0 if s does not // hold enough bytes to complete the encoding. len(s) must be greater than 0. func (t *nfkcTrie) lookupString(s string) (v uint16, sz int) { c0 := s[0] switch { case c0 < 0x80: // is ASCII return nfkcValues[c0], 1 case c0 < 0xC2: return 0, 1 // Illegal UTF-8: not a starter, not ASCII. case c0 < 0xE0: // 2-byte UTF-8 if len(s) < 2 { return 0, 0 } i := nfkcIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c1), 2 case c0 < 0xF0: // 3-byte UTF-8 if len(s) < 3 { return 0, 0 } i := nfkcIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } o := uint32(i)<<6 + uint32(c1) i = nfkcIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return 0, 2 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c2), 3 case c0 < 0xF8: // 4-byte UTF-8 if len(s) < 4 { return 0, 0 } i := nfkcIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } o := uint32(i)<<6 + uint32(c1) i = nfkcIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return 0, 2 // Illegal UTF-8: not a continuation byte. } o = uint32(i)<<6 + uint32(c2) i = nfkcIndex[o] c3 := s[3] if c3 < 0x80 || 0xC0 <= c3 { return 0, 3 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c3), 4 } // Illegal rune return 0, 1 } // lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. // s must start with a full and valid UTF-8 encoded rune. func (t *nfkcTrie) lookupStringUnsafe(s string) uint16 { c0 := s[0] if c0 < 0x80 { // is ASCII return nfkcValues[c0] } i := nfkcIndex[c0] if c0 < 0xE0 { // 2-byte UTF-8 return t.lookupValue(uint32(i), s[1]) } i = nfkcIndex[uint32(i)<<6+uint32(s[1])] if c0 < 0xF0 { // 3-byte UTF-8 return t.lookupValue(uint32(i), s[2]) } i = nfkcIndex[uint32(i)<<6+uint32(s[2])] if c0 < 0xF8 { // 4-byte UTF-8 return t.lookupValue(uint32(i), s[3]) } return 0 } // nfkcTrie. Total size: 17104 bytes (16.70 KiB). Checksum: d985061cf5307b35. type nfkcTrie struct{} func newNfkcTrie(i int) *nfkcTrie { return &nfkcTrie{} } // lookupValue determines the type of block n and looks up the value for b. func (t *nfkcTrie) lookupValue(n uint32, b byte) uint16 { switch { case n < 91: return uint16(nfkcValues[n<<6+uint32(b)]) default: n -= 91 return uint16(nfkcSparse.lookup(n, b)) } } // nfkcValues: 93 blocks, 5952 entries, 11904 bytes // The third block is the zero block. var nfkcValues = [5952]uint16{ // Block 0x0, offset 0x0 0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000, // Block 0x1, offset 0x40 0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000, 0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000, 0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000, 0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000, 0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000, 0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000, 0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000, 0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000, 0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000, 0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000, // Block 0x2, offset 0x80 // Block 0x3, offset 0xc0 0xc0: 0x2f6f, 0xc1: 0x2f74, 0xc2: 0x4688, 0xc3: 0x2f79, 0xc4: 0x4697, 0xc5: 0x469c, 0xc6: 0xa000, 0xc7: 0x46a6, 0xc8: 0x2fe2, 0xc9: 0x2fe7, 0xca: 0x46ab, 0xcb: 0x2ffb, 0xcc: 0x306e, 0xcd: 0x3073, 0xce: 0x3078, 0xcf: 0x46bf, 0xd1: 0x3104, 0xd2: 0x3127, 0xd3: 0x312c, 0xd4: 0x46c9, 0xd5: 0x46ce, 0xd6: 0x46dd, 0xd8: 0xa000, 0xd9: 0x31b3, 0xda: 0x31b8, 0xdb: 0x31bd, 0xdc: 0x470f, 0xdd: 0x3235, 0xe0: 0x327b, 0xe1: 0x3280, 0xe2: 0x4719, 0xe3: 0x3285, 0xe4: 0x4728, 0xe5: 0x472d, 0xe6: 0xa000, 0xe7: 0x4737, 0xe8: 0x32ee, 0xe9: 0x32f3, 0xea: 0x473c, 0xeb: 0x3307, 0xec: 0x337f, 0xed: 0x3384, 0xee: 0x3389, 0xef: 0x4750, 0xf1: 0x3415, 0xf2: 0x3438, 0xf3: 0x343d, 0xf4: 0x475a, 0xf5: 0x475f, 0xf6: 0x476e, 0xf8: 0xa000, 0xf9: 0x34c9, 0xfa: 0x34ce, 0xfb: 0x34d3, 0xfc: 0x47a0, 0xfd: 0x3550, 0xff: 0x3569, // Block 0x4, offset 0x100 0x100: 0x2f7e, 0x101: 0x328a, 0x102: 0x468d, 0x103: 0x471e, 0x104: 0x2f9c, 0x105: 0x32a8, 0x106: 0x2fb0, 0x107: 0x32bc, 0x108: 0x2fb5, 0x109: 0x32c1, 0x10a: 0x2fba, 0x10b: 0x32c6, 0x10c: 0x2fbf, 0x10d: 0x32cb, 0x10e: 0x2fc9, 0x10f: 0x32d5, 0x112: 0x46b0, 0x113: 0x4741, 0x114: 0x2ff1, 0x115: 0x32fd, 0x116: 0x2ff6, 0x117: 0x3302, 0x118: 0x3014, 0x119: 0x3320, 0x11a: 0x3005, 0x11b: 0x3311, 0x11c: 0x302d, 0x11d: 0x3339, 0x11e: 0x3037, 0x11f: 0x3343, 0x120: 0x303c, 0x121: 0x3348, 0x122: 0x3046, 0x123: 0x3352, 0x124: 0x304b, 0x125: 0x3357, 0x128: 0x307d, 0x129: 0x338e, 0x12a: 0x3082, 0x12b: 0x3393, 0x12c: 0x3087, 0x12d: 0x3398, 0x12e: 0x30aa, 0x12f: 0x33b6, 0x130: 0x308c, 0x132: 0x195d, 0x133: 0x19e7, 0x134: 0x30b4, 0x135: 0x33c0, 0x136: 0x30c8, 0x137: 0x33d9, 0x139: 0x30d2, 0x13a: 0x33e3, 0x13b: 0x30dc, 0x13c: 0x33ed, 0x13d: 0x30d7, 0x13e: 0x33e8, 0x13f: 0x1bac, // Block 0x5, offset 0x140 0x140: 0x1c34, 0x143: 0x30ff, 0x144: 0x3410, 0x145: 0x3118, 0x146: 0x3429, 0x147: 0x310e, 0x148: 0x341f, 0x149: 0x1c5c, 0x14c: 0x46d3, 0x14d: 0x4764, 0x14e: 0x3131, 0x14f: 0x3442, 0x150: 0x313b, 0x151: 0x344c, 0x154: 0x3159, 0x155: 0x346a, 0x156: 0x3172, 0x157: 0x3483, 0x158: 0x3163, 0x159: 0x3474, 0x15a: 0x46f6, 0x15b: 0x4787, 0x15c: 0x317c, 0x15d: 0x348d, 0x15e: 0x318b, 0x15f: 0x349c, 0x160: 0x46fb, 0x161: 0x478c, 0x162: 0x31a4, 0x163: 0x34ba, 0x164: 0x3195, 0x165: 0x34ab, 0x168: 0x4705, 0x169: 0x4796, 0x16a: 0x470a, 0x16b: 0x479b, 0x16c: 0x31c2, 0x16d: 0x34d8, 0x16e: 0x31cc, 0x16f: 0x34e2, 0x170: 0x31d1, 0x171: 0x34e7, 0x172: 0x31ef, 0x173: 0x3505, 0x174: 0x3212, 0x175: 0x3528, 0x176: 0x323a, 0x177: 0x3555, 0x178: 0x324e, 0x179: 0x325d, 0x17a: 0x357d, 0x17b: 0x3267, 0x17c: 0x3587, 0x17d: 0x326c, 0x17e: 0x358c, 0x17f: 0x00a7, // Block 0x6, offset 0x180 0x184: 0x2dee, 0x185: 0x2df4, 0x186: 0x2dfa, 0x187: 0x1972, 0x188: 0x1975, 0x189: 0x1a08, 0x18a: 0x1987, 0x18b: 0x198a, 0x18c: 0x1a3e, 0x18d: 0x2f88, 0x18e: 0x3294, 0x18f: 0x3096, 0x190: 0x33a2, 0x191: 0x3140, 0x192: 0x3451, 0x193: 0x31d6, 0x194: 0x34ec, 0x195: 0x39cf, 0x196: 0x3b5e, 0x197: 0x39c8, 0x198: 0x3b57, 0x199: 0x39d6, 0x19a: 0x3b65, 0x19b: 0x39c1, 0x19c: 0x3b50, 0x19e: 0x38b0, 0x19f: 0x3a3f, 0x1a0: 0x38a9, 0x1a1: 0x3a38, 0x1a2: 0x35b3, 0x1a3: 0x35c5, 0x1a6: 0x3041, 0x1a7: 0x334d, 0x1a8: 0x30be, 0x1a9: 0x33cf, 0x1aa: 0x46ec, 0x1ab: 0x477d, 0x1ac: 0x3990, 0x1ad: 0x3b1f, 0x1ae: 0x35d7, 0x1af: 0x35dd, 0x1b0: 0x33c5, 0x1b1: 0x1942, 0x1b2: 0x1945, 0x1b3: 0x19cf, 0x1b4: 0x3028, 0x1b5: 0x3334, 0x1b8: 0x30fa, 0x1b9: 0x340b, 0x1ba: 0x38b7, 0x1bb: 0x3a46, 0x1bc: 0x35ad, 0x1bd: 0x35bf, 0x1be: 0x35b9, 0x1bf: 0x35cb, // Block 0x7, offset 0x1c0 0x1c0: 0x2f8d, 0x1c1: 0x3299, 0x1c2: 0x2f92, 0x1c3: 0x329e, 0x1c4: 0x300a, 0x1c5: 0x3316, 0x1c6: 0x300f, 0x1c7: 0x331b, 0x1c8: 0x309b, 0x1c9: 0x33a7, 0x1ca: 0x30a0, 0x1cb: 0x33ac, 0x1cc: 0x3145, 0x1cd: 0x3456, 0x1ce: 0x314a, 0x1cf: 0x345b, 0x1d0: 0x3168, 0x1d1: 0x3479, 0x1d2: 0x316d, 0x1d3: 0x347e, 0x1d4: 0x31db, 0x1d5: 0x34f1, 0x1d6: 0x31e0, 0x1d7: 0x34f6, 0x1d8: 0x3186, 0x1d9: 0x3497, 0x1da: 0x319f, 0x1db: 0x34b5, 0x1de: 0x305a, 0x1df: 0x3366, 0x1e6: 0x4692, 0x1e7: 0x4723, 0x1e8: 0x46ba, 0x1e9: 0x474b, 0x1ea: 0x395f, 0x1eb: 0x3aee, 0x1ec: 0x393c, 0x1ed: 0x3acb, 0x1ee: 0x46d8, 0x1ef: 0x4769, 0x1f0: 0x3958, 0x1f1: 0x3ae7, 0x1f2: 0x3244, 0x1f3: 0x355f, // Block 0x8, offset 0x200 0x200: 0x9932, 0x201: 0x9932, 0x202: 0x9932, 0x203: 0x9932, 0x204: 0x9932, 0x205: 0x8132, 0x206: 0x9932, 0x207: 0x9932, 0x208: 0x9932, 0x209: 0x9932, 0x20a: 0x9932, 0x20b: 0x9932, 0x20c: 0x9932, 0x20d: 0x8132, 0x20e: 0x8132, 0x20f: 0x9932, 0x210: 0x8132, 0x211: 0x9932, 0x212: 0x8132, 0x213: 0x9932, 0x214: 0x9932, 0x215: 0x8133, 0x216: 0x812d, 0x217: 0x812d, 0x218: 0x812d, 0x219: 0x812d, 0x21a: 0x8133, 0x21b: 0x992b, 0x21c: 0x812d, 0x21d: 0x812d, 0x21e: 0x812d, 0x21f: 0x812d, 0x220: 0x812d, 0x221: 0x8129, 0x222: 0x8129, 0x223: 0x992d, 0x224: 0x992d, 0x225: 0x992d, 0x226: 0x992d, 0x227: 0x9929, 0x228: 0x9929, 0x229: 0x812d, 0x22a: 0x812d, 0x22b: 0x812d, 0x22c: 0x812d, 0x22d: 0x992d, 0x22e: 0x992d, 0x22f: 0x812d, 0x230: 0x992d, 0x231: 0x992d, 0x232: 0x812d, 0x233: 0x812d, 0x234: 0x8101, 0x235: 0x8101, 0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812d, 0x23a: 0x812d, 0x23b: 0x812d, 0x23c: 0x812d, 0x23d: 0x8132, 0x23e: 0x8132, 0x23f: 0x8132, // Block 0x9, offset 0x240 0x240: 0x49ae, 0x241: 0x49b3, 0x242: 0x9932, 0x243: 0x49b8, 0x244: 0x4a71, 0x245: 0x9936, 0x246: 0x8132, 0x247: 0x812d, 0x248: 0x812d, 0x249: 0x812d, 0x24a: 0x8132, 0x24b: 0x8132, 0x24c: 0x8132, 0x24d: 0x812d, 0x24e: 0x812d, 0x250: 0x8132, 0x251: 0x8132, 0x252: 0x8132, 0x253: 0x812d, 0x254: 0x812d, 0x255: 0x812d, 0x256: 0x812d, 0x257: 0x8132, 0x258: 0x8133, 0x259: 0x812d, 0x25a: 0x812d, 0x25b: 0x8132, 0x25c: 0x8134, 0x25d: 0x8135, 0x25e: 0x8135, 0x25f: 0x8134, 0x260: 0x8135, 0x261: 0x8135, 0x262: 0x8134, 0x263: 0x8132, 0x264: 0x8132, 0x265: 0x8132, 0x266: 0x8132, 0x267: 0x8132, 0x268: 0x8132, 0x269: 0x8132, 0x26a: 0x8132, 0x26b: 0x8132, 0x26c: 0x8132, 0x26d: 0x8132, 0x26e: 0x8132, 0x26f: 0x8132, 0x274: 0x0170, 0x27a: 0x42a5, 0x27e: 0x0037, // Block 0xa, offset 0x280 0x284: 0x425a, 0x285: 0x447b, 0x286: 0x35e9, 0x287: 0x00ce, 0x288: 0x3607, 0x289: 0x3613, 0x28a: 0x3625, 0x28c: 0x3643, 0x28e: 0x3655, 0x28f: 0x3673, 0x290: 0x3e08, 0x291: 0xa000, 0x295: 0xa000, 0x297: 0xa000, 0x299: 0xa000, 0x29f: 0xa000, 0x2a1: 0xa000, 0x2a5: 0xa000, 0x2a9: 0xa000, 0x2aa: 0x3637, 0x2ab: 0x3667, 0x2ac: 0x47fe, 0x2ad: 0x3697, 0x2ae: 0x4828, 0x2af: 0x36a9, 0x2b0: 0x3e70, 0x2b1: 0xa000, 0x2b5: 0xa000, 0x2b7: 0xa000, 0x2b9: 0xa000, 0x2bf: 0xa000, // Block 0xb, offset 0x2c0 0x2c1: 0xa000, 0x2c5: 0xa000, 0x2c9: 0xa000, 0x2ca: 0x4840, 0x2cb: 0x485e, 0x2cc: 0x36c7, 0x2cd: 0x36df, 0x2ce: 0x4876, 0x2d0: 0x01be, 0x2d1: 0x01d0, 0x2d2: 0x01ac, 0x2d3: 0x430c, 0x2d4: 0x4312, 0x2d5: 0x01fa, 0x2d6: 0x01e8, 0x2f0: 0x01d6, 0x2f1: 0x01eb, 0x2f2: 0x01ee, 0x2f4: 0x0188, 0x2f5: 0x01c7, 0x2f9: 0x01a6, // Block 0xc, offset 0x300 0x300: 0x3721, 0x301: 0x372d, 0x303: 0x371b, 0x306: 0xa000, 0x307: 0x3709, 0x30c: 0x375d, 0x30d: 0x3745, 0x30e: 0x376f, 0x310: 0xa000, 0x313: 0xa000, 0x315: 0xa000, 0x316: 0xa000, 0x317: 0xa000, 0x318: 0xa000, 0x319: 0x3751, 0x31a: 0xa000, 0x31e: 0xa000, 0x323: 0xa000, 0x327: 0xa000, 0x32b: 0xa000, 0x32d: 0xa000, 0x330: 0xa000, 0x333: 0xa000, 0x335: 0xa000, 0x336: 0xa000, 0x337: 0xa000, 0x338: 0xa000, 0x339: 0x37d5, 0x33a: 0xa000, 0x33e: 0xa000, // Block 0xd, offset 0x340 0x341: 0x3733, 0x342: 0x37b7, 0x350: 0x370f, 0x351: 0x3793, 0x352: 0x3715, 0x353: 0x3799, 0x356: 0x3727, 0x357: 0x37ab, 0x358: 0xa000, 0x359: 0xa000, 0x35a: 0x3829, 0x35b: 0x382f, 0x35c: 0x3739, 0x35d: 0x37bd, 0x35e: 0x373f, 0x35f: 0x37c3, 0x362: 0x374b, 0x363: 0x37cf, 0x364: 0x3757, 0x365: 0x37db, 0x366: 0x3763, 0x367: 0x37e7, 0x368: 0xa000, 0x369: 0xa000, 0x36a: 0x3835, 0x36b: 0x383b, 0x36c: 0x378d, 0x36d: 0x3811, 0x36e: 0x3769, 0x36f: 0x37ed, 0x370: 0x3775, 0x371: 0x37f9, 0x372: 0x377b, 0x373: 0x37ff, 0x374: 0x3781, 0x375: 0x3805, 0x378: 0x3787, 0x379: 0x380b, // Block 0xe, offset 0x380 0x387: 0x1d61, 0x391: 0x812d, 0x392: 0x8132, 0x393: 0x8132, 0x394: 0x8132, 0x395: 0x8132, 0x396: 0x812d, 0x397: 0x8132, 0x398: 0x8132, 0x399: 0x8132, 0x39a: 0x812e, 0x39b: 0x812d, 0x39c: 0x8132, 0x39d: 0x8132, 0x39e: 0x8132, 0x39f: 0x8132, 0x3a0: 0x8132, 0x3a1: 0x8132, 0x3a2: 0x812d, 0x3a3: 0x812d, 0x3a4: 0x812d, 0x3a5: 0x812d, 0x3a6: 0x812d, 0x3a7: 0x812d, 0x3a8: 0x8132, 0x3a9: 0x8132, 0x3aa: 0x812d, 0x3ab: 0x8132, 0x3ac: 0x8132, 0x3ad: 0x812e, 0x3ae: 0x8131, 0x3af: 0x8132, 0x3b0: 0x8105, 0x3b1: 0x8106, 0x3b2: 0x8107, 0x3b3: 0x8108, 0x3b4: 0x8109, 0x3b5: 0x810a, 0x3b6: 0x810b, 0x3b7: 0x810c, 0x3b8: 0x810d, 0x3b9: 0x810e, 0x3ba: 0x810e, 0x3bb: 0x810f, 0x3bc: 0x8110, 0x3bd: 0x8111, 0x3bf: 0x8112, // Block 0xf, offset 0x3c0 0x3c8: 0xa000, 0x3ca: 0xa000, 0x3cb: 0x8116, 0x3cc: 0x8117, 0x3cd: 0x8118, 0x3ce: 0x8119, 0x3cf: 0x811a, 0x3d0: 0x811b, 0x3d1: 0x811c, 0x3d2: 0x811d, 0x3d3: 0x9932, 0x3d4: 0x9932, 0x3d5: 0x992d, 0x3d6: 0x812d, 0x3d7: 0x8132, 0x3d8: 0x8132, 0x3d9: 0x8132, 0x3da: 0x8132, 0x3db: 0x8132, 0x3dc: 0x812d, 0x3dd: 0x8132, 0x3de: 0x8132, 0x3df: 0x812d, 0x3f0: 0x811e, 0x3f5: 0x1d84, 0x3f6: 0x2013, 0x3f7: 0x204f, 0x3f8: 0x204a, // Block 0x10, offset 0x400 0x405: 0xa000, 0x406: 0x2d26, 0x407: 0xa000, 0x408: 0x2d2e, 0x409: 0xa000, 0x40a: 0x2d36, 0x40b: 0xa000, 0x40c: 0x2d3e, 0x40d: 0xa000, 0x40e: 0x2d46, 0x411: 0xa000, 0x412: 0x2d4e, 0x434: 0x8102, 0x435: 0x9900, 0x43a: 0xa000, 0x43b: 0x2d56, 0x43c: 0xa000, 0x43d: 0x2d5e, 0x43e: 0xa000, 0x43f: 0xa000, // Block 0x11, offset 0x440 0x440: 0x0069, 0x441: 0x006b, 0x442: 0x006f, 0x443: 0x0083, 0x444: 0x00f5, 0x445: 0x00f8, 0x446: 0x0413, 0x447: 0x0085, 0x448: 0x0089, 0x449: 0x008b, 0x44a: 0x0104, 0x44b: 0x0107, 0x44c: 0x010a, 0x44d: 0x008f, 0x44f: 0x0097, 0x450: 0x009b, 0x451: 0x00e0, 0x452: 0x009f, 0x453: 0x00fe, 0x454: 0x0417, 0x455: 0x041b, 0x456: 0x00a1, 0x457: 0x00a9, 0x458: 0x00ab, 0x459: 0x0423, 0x45a: 0x012b, 0x45b: 0x00ad, 0x45c: 0x0427, 0x45d: 0x01be, 0x45e: 0x01c1, 0x45f: 0x01c4, 0x460: 0x01fa, 0x461: 0x01fd, 0x462: 0x0093, 0x463: 0x00a5, 0x464: 0x00ab, 0x465: 0x00ad, 0x466: 0x01be, 0x467: 0x01c1, 0x468: 0x01eb, 0x469: 0x01fa, 0x46a: 0x01fd, 0x478: 0x020c, // Block 0x12, offset 0x480 0x49b: 0x00fb, 0x49c: 0x0087, 0x49d: 0x0101, 0x49e: 0x00d4, 0x49f: 0x010a, 0x4a0: 0x008d, 0x4a1: 0x010d, 0x4a2: 0x0110, 0x4a3: 0x0116, 0x4a4: 0x011c, 0x4a5: 0x011f, 0x4a6: 0x0122, 0x4a7: 0x042b, 0x4a8: 0x016a, 0x4a9: 0x0128, 0x4aa: 0x042f, 0x4ab: 0x016d, 0x4ac: 0x0131, 0x4ad: 0x012e, 0x4ae: 0x0134, 0x4af: 0x0137, 0x4b0: 0x013a, 0x4b1: 0x013d, 0x4b2: 0x0140, 0x4b3: 0x014c, 0x4b4: 0x014f, 0x4b5: 0x00ec, 0x4b6: 0x0152, 0x4b7: 0x0155, 0x4b8: 0x041f, 0x4b9: 0x0158, 0x4ba: 0x015b, 0x4bb: 0x00b5, 0x4bc: 0x015e, 0x4bd: 0x0161, 0x4be: 0x0164, 0x4bf: 0x01d0, // Block 0x13, offset 0x4c0 0x4c0: 0x8132, 0x4c1: 0x8132, 0x4c2: 0x812d, 0x4c3: 0x8132, 0x4c4: 0x8132, 0x4c5: 0x8132, 0x4c6: 0x8132, 0x4c7: 0x8132, 0x4c8: 0x8132, 0x4c9: 0x8132, 0x4ca: 0x812d, 0x4cb: 0x8132, 0x4cc: 0x8132, 0x4cd: 0x8135, 0x4ce: 0x812a, 0x4cf: 0x812d, 0x4d0: 0x8129, 0x4d1: 0x8132, 0x4d2: 0x8132, 0x4d3: 0x8132, 0x4d4: 0x8132, 0x4d5: 0x8132, 0x4d6: 0x8132, 0x4d7: 0x8132, 0x4d8: 0x8132, 0x4d9: 0x8132, 0x4da: 0x8132, 0x4db: 0x8132, 0x4dc: 0x8132, 0x4dd: 0x8132, 0x4de: 0x8132, 0x4df: 0x8132, 0x4e0: 0x8132, 0x4e1: 0x8132, 0x4e2: 0x8132, 0x4e3: 0x8132, 0x4e4: 0x8132, 0x4e5: 0x8132, 0x4e6: 0x8132, 0x4e7: 0x8132, 0x4e8: 0x8132, 0x4e9: 0x8132, 0x4ea: 0x8132, 0x4eb: 0x8132, 0x4ec: 0x8132, 0x4ed: 0x8132, 0x4ee: 0x8132, 0x4ef: 0x8132, 0x4f0: 0x8132, 0x4f1: 0x8132, 0x4f2: 0x8132, 0x4f3: 0x8132, 0x4f4: 0x8132, 0x4f5: 0x8132, 0x4f6: 0x8133, 0x4f7: 0x8131, 0x4f8: 0x8131, 0x4f9: 0x812d, 0x4fb: 0x8132, 0x4fc: 0x8134, 0x4fd: 0x812d, 0x4fe: 0x8132, 0x4ff: 0x812d, // Block 0x14, offset 0x500 0x500: 0x2f97, 0x501: 0x32a3, 0x502: 0x2fa1, 0x503: 0x32ad, 0x504: 0x2fa6, 0x505: 0x32b2, 0x506: 0x2fab, 0x507: 0x32b7, 0x508: 0x38cc, 0x509: 0x3a5b, 0x50a: 0x2fc4, 0x50b: 0x32d0, 0x50c: 0x2fce, 0x50d: 0x32da, 0x50e: 0x2fdd, 0x50f: 0x32e9, 0x510: 0x2fd3, 0x511: 0x32df, 0x512: 0x2fd8, 0x513: 0x32e4, 0x514: 0x38ef, 0x515: 0x3a7e, 0x516: 0x38f6, 0x517: 0x3a85, 0x518: 0x3019, 0x519: 0x3325, 0x51a: 0x301e, 0x51b: 0x332a, 0x51c: 0x3904, 0x51d: 0x3a93, 0x51e: 0x3023, 0x51f: 0x332f, 0x520: 0x3032, 0x521: 0x333e, 0x522: 0x3050, 0x523: 0x335c, 0x524: 0x305f, 0x525: 0x336b, 0x526: 0x3055, 0x527: 0x3361, 0x528: 0x3064, 0x529: 0x3370, 0x52a: 0x3069, 0x52b: 0x3375, 0x52c: 0x30af, 0x52d: 0x33bb, 0x52e: 0x390b, 0x52f: 0x3a9a, 0x530: 0x30b9, 0x531: 0x33ca, 0x532: 0x30c3, 0x533: 0x33d4, 0x534: 0x30cd, 0x535: 0x33de, 0x536: 0x46c4, 0x537: 0x4755, 0x538: 0x3912, 0x539: 0x3aa1, 0x53a: 0x30e6, 0x53b: 0x33f7, 0x53c: 0x30e1, 0x53d: 0x33f2, 0x53e: 0x30eb, 0x53f: 0x33fc, // Block 0x15, offset 0x540 0x540: 0x30f0, 0x541: 0x3401, 0x542: 0x30f5, 0x543: 0x3406, 0x544: 0x3109, 0x545: 0x341a, 0x546: 0x3113, 0x547: 0x3424, 0x548: 0x3122, 0x549: 0x3433, 0x54a: 0x311d, 0x54b: 0x342e, 0x54c: 0x3935, 0x54d: 0x3ac4, 0x54e: 0x3943, 0x54f: 0x3ad2, 0x550: 0x394a, 0x551: 0x3ad9, 0x552: 0x3951, 0x553: 0x3ae0, 0x554: 0x314f, 0x555: 0x3460, 0x556: 0x3154, 0x557: 0x3465, 0x558: 0x315e, 0x559: 0x346f, 0x55a: 0x46f1, 0x55b: 0x4782, 0x55c: 0x3997, 0x55d: 0x3b26, 0x55e: 0x3177, 0x55f: 0x3488, 0x560: 0x3181, 0x561: 0x3492, 0x562: 0x4700, 0x563: 0x4791, 0x564: 0x399e, 0x565: 0x3b2d, 0x566: 0x39a5, 0x567: 0x3b34, 0x568: 0x39ac, 0x569: 0x3b3b, 0x56a: 0x3190, 0x56b: 0x34a1, 0x56c: 0x319a, 0x56d: 0x34b0, 0x56e: 0x31ae, 0x56f: 0x34c4, 0x570: 0x31a9, 0x571: 0x34bf, 0x572: 0x31ea, 0x573: 0x3500, 0x574: 0x31f9, 0x575: 0x350f, 0x576: 0x31f4, 0x577: 0x350a, 0x578: 0x39b3, 0x579: 0x3b42, 0x57a: 0x39ba, 0x57b: 0x3b49, 0x57c: 0x31fe, 0x57d: 0x3514, 0x57e: 0x3203, 0x57f: 0x3519, // Block 0x16, offset 0x580 0x580: 0x3208, 0x581: 0x351e, 0x582: 0x320d, 0x583: 0x3523, 0x584: 0x321c, 0x585: 0x3532, 0x586: 0x3217, 0x587: 0x352d, 0x588: 0x3221, 0x589: 0x353c, 0x58a: 0x3226, 0x58b: 0x3541, 0x58c: 0x322b, 0x58d: 0x3546, 0x58e: 0x3249, 0x58f: 0x3564, 0x590: 0x3262, 0x591: 0x3582, 0x592: 0x3271, 0x593: 0x3591, 0x594: 0x3276, 0x595: 0x3596, 0x596: 0x337a, 0x597: 0x34a6, 0x598: 0x3537, 0x599: 0x3573, 0x59a: 0x1be0, 0x59b: 0x42d7, 0x5a0: 0x46a1, 0x5a1: 0x4732, 0x5a2: 0x2f83, 0x5a3: 0x328f, 0x5a4: 0x3878, 0x5a5: 0x3a07, 0x5a6: 0x3871, 0x5a7: 0x3a00, 0x5a8: 0x3886, 0x5a9: 0x3a15, 0x5aa: 0x387f, 0x5ab: 0x3a0e, 0x5ac: 0x38be, 0x5ad: 0x3a4d, 0x5ae: 0x3894, 0x5af: 0x3a23, 0x5b0: 0x388d, 0x5b1: 0x3a1c, 0x5b2: 0x38a2, 0x5b3: 0x3a31, 0x5b4: 0x389b, 0x5b5: 0x3a2a, 0x5b6: 0x38c5, 0x5b7: 0x3a54, 0x5b8: 0x46b5, 0x5b9: 0x4746, 0x5ba: 0x3000, 0x5bb: 0x330c, 0x5bc: 0x2fec, 0x5bd: 0x32f8, 0x5be: 0x38da, 0x5bf: 0x3a69, // Block 0x17, offset 0x5c0 0x5c0: 0x38d3, 0x5c1: 0x3a62, 0x5c2: 0x38e8, 0x5c3: 0x3a77, 0x5c4: 0x38e1, 0x5c5: 0x3a70, 0x5c6: 0x38fd, 0x5c7: 0x3a8c, 0x5c8: 0x3091, 0x5c9: 0x339d, 0x5ca: 0x30a5, 0x5cb: 0x33b1, 0x5cc: 0x46e7, 0x5cd: 0x4778, 0x5ce: 0x3136, 0x5cf: 0x3447, 0x5d0: 0x3920, 0x5d1: 0x3aaf, 0x5d2: 0x3919, 0x5d3: 0x3aa8, 0x5d4: 0x392e, 0x5d5: 0x3abd, 0x5d6: 0x3927, 0x5d7: 0x3ab6, 0x5d8: 0x3989, 0x5d9: 0x3b18, 0x5da: 0x396d, 0x5db: 0x3afc, 0x5dc: 0x3966, 0x5dd: 0x3af5, 0x5de: 0x397b, 0x5df: 0x3b0a, 0x5e0: 0x3974, 0x5e1: 0x3b03, 0x5e2: 0x3982, 0x5e3: 0x3b11, 0x5e4: 0x31e5, 0x5e5: 0x34fb, 0x5e6: 0x31c7, 0x5e7: 0x34dd, 0x5e8: 0x39e4, 0x5e9: 0x3b73, 0x5ea: 0x39dd, 0x5eb: 0x3b6c, 0x5ec: 0x39f2, 0x5ed: 0x3b81, 0x5ee: 0x39eb, 0x5ef: 0x3b7a, 0x5f0: 0x39f9, 0x5f1: 0x3b88, 0x5f2: 0x3230, 0x5f3: 0x354b, 0x5f4: 0x3258, 0x5f5: 0x3578, 0x5f6: 0x3253, 0x5f7: 0x356e, 0x5f8: 0x323f, 0x5f9: 0x355a, // Block 0x18, offset 0x600 0x600: 0x4804, 0x601: 0x480a, 0x602: 0x491e, 0x603: 0x4936, 0x604: 0x4926, 0x605: 0x493e, 0x606: 0x492e, 0x607: 0x4946, 0x608: 0x47aa, 0x609: 0x47b0, 0x60a: 0x488e, 0x60b: 0x48a6, 0x60c: 0x4896, 0x60d: 0x48ae, 0x60e: 0x489e, 0x60f: 0x48b6, 0x610: 0x4816, 0x611: 0x481c, 0x612: 0x3db8, 0x613: 0x3dc8, 0x614: 0x3dc0, 0x615: 0x3dd0, 0x618: 0x47b6, 0x619: 0x47bc, 0x61a: 0x3ce8, 0x61b: 0x3cf8, 0x61c: 0x3cf0, 0x61d: 0x3d00, 0x620: 0x482e, 0x621: 0x4834, 0x622: 0x494e, 0x623: 0x4966, 0x624: 0x4956, 0x625: 0x496e, 0x626: 0x495e, 0x627: 0x4976, 0x628: 0x47c2, 0x629: 0x47c8, 0x62a: 0x48be, 0x62b: 0x48d6, 0x62c: 0x48c6, 0x62d: 0x48de, 0x62e: 0x48ce, 0x62f: 0x48e6, 0x630: 0x4846, 0x631: 0x484c, 0x632: 0x3e18, 0x633: 0x3e30, 0x634: 0x3e20, 0x635: 0x3e38, 0x636: 0x3e28, 0x637: 0x3e40, 0x638: 0x47ce, 0x639: 0x47d4, 0x63a: 0x3d18, 0x63b: 0x3d30, 0x63c: 0x3d20, 0x63d: 0x3d38, 0x63e: 0x3d28, 0x63f: 0x3d40, // Block 0x19, offset 0x640 0x640: 0x4852, 0x641: 0x4858, 0x642: 0x3e48, 0x643: 0x3e58, 0x644: 0x3e50, 0x645: 0x3e60, 0x648: 0x47da, 0x649: 0x47e0, 0x64a: 0x3d48, 0x64b: 0x3d58, 0x64c: 0x3d50, 0x64d: 0x3d60, 0x650: 0x4864, 0x651: 0x486a, 0x652: 0x3e80, 0x653: 0x3e98, 0x654: 0x3e88, 0x655: 0x3ea0, 0x656: 0x3e90, 0x657: 0x3ea8, 0x659: 0x47e6, 0x65b: 0x3d68, 0x65d: 0x3d70, 0x65f: 0x3d78, 0x660: 0x487c, 0x661: 0x4882, 0x662: 0x497e, 0x663: 0x4996, 0x664: 0x4986, 0x665: 0x499e, 0x666: 0x498e, 0x667: 0x49a6, 0x668: 0x47ec, 0x669: 0x47f2, 0x66a: 0x48ee, 0x66b: 0x4906, 0x66c: 0x48f6, 0x66d: 0x490e, 0x66e: 0x48fe, 0x66f: 0x4916, 0x670: 0x47f8, 0x671: 0x431e, 0x672: 0x3691, 0x673: 0x4324, 0x674: 0x4822, 0x675: 0x432a, 0x676: 0x36a3, 0x677: 0x4330, 0x678: 0x36c1, 0x679: 0x4336, 0x67a: 0x36d9, 0x67b: 0x433c, 0x67c: 0x4870, 0x67d: 0x4342, // Block 0x1a, offset 0x680 0x680: 0x3da0, 0x681: 0x3da8, 0x682: 0x4184, 0x683: 0x41a2, 0x684: 0x418e, 0x685: 0x41ac, 0x686: 0x4198, 0x687: 0x41b6, 0x688: 0x3cd8, 0x689: 0x3ce0, 0x68a: 0x40d0, 0x68b: 0x40ee, 0x68c: 0x40da, 0x68d: 0x40f8, 0x68e: 0x40e4, 0x68f: 0x4102, 0x690: 0x3de8, 0x691: 0x3df0, 0x692: 0x41c0, 0x693: 0x41de, 0x694: 0x41ca, 0x695: 0x41e8, 0x696: 0x41d4, 0x697: 0x41f2, 0x698: 0x3d08, 0x699: 0x3d10, 0x69a: 0x410c, 0x69b: 0x412a, 0x69c: 0x4116, 0x69d: 0x4134, 0x69e: 0x4120, 0x69f: 0x413e, 0x6a0: 0x3ec0, 0x6a1: 0x3ec8, 0x6a2: 0x41fc, 0x6a3: 0x421a, 0x6a4: 0x4206, 0x6a5: 0x4224, 0x6a6: 0x4210, 0x6a7: 0x422e, 0x6a8: 0x3d80, 0x6a9: 0x3d88, 0x6aa: 0x4148, 0x6ab: 0x4166, 0x6ac: 0x4152, 0x6ad: 0x4170, 0x6ae: 0x415c, 0x6af: 0x417a, 0x6b0: 0x3685, 0x6b1: 0x367f, 0x6b2: 0x3d90, 0x6b3: 0x368b, 0x6b4: 0x3d98, 0x6b6: 0x4810, 0x6b7: 0x3db0, 0x6b8: 0x35f5, 0x6b9: 0x35ef, 0x6ba: 0x35e3, 0x6bb: 0x42ee, 0x6bc: 0x35fb, 0x6bd: 0x4287, 0x6be: 0x01d3, 0x6bf: 0x4287, // Block 0x1b, offset 0x6c0 0x6c0: 0x42a0, 0x6c1: 0x4482, 0x6c2: 0x3dd8, 0x6c3: 0x369d, 0x6c4: 0x3de0, 0x6c6: 0x483a, 0x6c7: 0x3df8, 0x6c8: 0x3601, 0x6c9: 0x42f4, 0x6ca: 0x360d, 0x6cb: 0x42fa, 0x6cc: 0x3619, 0x6cd: 0x4489, 0x6ce: 0x4490, 0x6cf: 0x4497, 0x6d0: 0x36b5, 0x6d1: 0x36af, 0x6d2: 0x3e00, 0x6d3: 0x44e4, 0x6d6: 0x36bb, 0x6d7: 0x3e10, 0x6d8: 0x3631, 0x6d9: 0x362b, 0x6da: 0x361f, 0x6db: 0x4300, 0x6dd: 0x449e, 0x6de: 0x44a5, 0x6df: 0x44ac, 0x6e0: 0x36eb, 0x6e1: 0x36e5, 0x6e2: 0x3e68, 0x6e3: 0x44ec, 0x6e4: 0x36cd, 0x6e5: 0x36d3, 0x6e6: 0x36f1, 0x6e7: 0x3e78, 0x6e8: 0x3661, 0x6e9: 0x365b, 0x6ea: 0x364f, 0x6eb: 0x430c, 0x6ec: 0x3649, 0x6ed: 0x4474, 0x6ee: 0x447b, 0x6ef: 0x0081, 0x6f2: 0x3eb0, 0x6f3: 0x36f7, 0x6f4: 0x3eb8, 0x6f6: 0x4888, 0x6f7: 0x3ed0, 0x6f8: 0x363d, 0x6f9: 0x4306, 0x6fa: 0x366d, 0x6fb: 0x4318, 0x6fc: 0x3679, 0x6fd: 0x425a, 0x6fe: 0x428c, // Block 0x1c, offset 0x700 0x700: 0x1bd8, 0x701: 0x1bdc, 0x702: 0x0047, 0x703: 0x1c54, 0x705: 0x1be8, 0x706: 0x1bec, 0x707: 0x00e9, 0x709: 0x1c58, 0x70a: 0x008f, 0x70b: 0x0051, 0x70c: 0x0051, 0x70d: 0x0051, 0x70e: 0x0091, 0x70f: 0x00da, 0x710: 0x0053, 0x711: 0x0053, 0x712: 0x0059, 0x713: 0x0099, 0x715: 0x005d, 0x716: 0x198d, 0x719: 0x0061, 0x71a: 0x0063, 0x71b: 0x0065, 0x71c: 0x0065, 0x71d: 0x0065, 0x720: 0x199f, 0x721: 0x1bc8, 0x722: 0x19a8, 0x724: 0x0075, 0x726: 0x01b8, 0x728: 0x0075, 0x72a: 0x0057, 0x72b: 0x42d2, 0x72c: 0x0045, 0x72d: 0x0047, 0x72f: 0x008b, 0x730: 0x004b, 0x731: 0x004d, 0x733: 0x005b, 0x734: 0x009f, 0x735: 0x0215, 0x736: 0x0218, 0x737: 0x021b, 0x738: 0x021e, 0x739: 0x0093, 0x73b: 0x1b98, 0x73c: 0x01e8, 0x73d: 0x01c1, 0x73e: 0x0179, 0x73f: 0x01a0, // Block 0x1d, offset 0x740 0x740: 0x0463, 0x745: 0x0049, 0x746: 0x0089, 0x747: 0x008b, 0x748: 0x0093, 0x749: 0x0095, 0x750: 0x222e, 0x751: 0x223a, 0x752: 0x22ee, 0x753: 0x2216, 0x754: 0x229a, 0x755: 0x2222, 0x756: 0x22a0, 0x757: 0x22b8, 0x758: 0x22c4, 0x759: 0x2228, 0x75a: 0x22ca, 0x75b: 0x2234, 0x75c: 0x22be, 0x75d: 0x22d0, 0x75e: 0x22d6, 0x75f: 0x1cbc, 0x760: 0x0053, 0x761: 0x195a, 0x762: 0x1ba4, 0x763: 0x1963, 0x764: 0x006d, 0x765: 0x19ab, 0x766: 0x1bd0, 0x767: 0x1d48, 0x768: 0x1966, 0x769: 0x0071, 0x76a: 0x19b7, 0x76b: 0x1bd4, 0x76c: 0x0059, 0x76d: 0x0047, 0x76e: 0x0049, 0x76f: 0x005b, 0x770: 0x0093, 0x771: 0x19e4, 0x772: 0x1c18, 0x773: 0x19ed, 0x774: 0x00ad, 0x775: 0x1a62, 0x776: 0x1c4c, 0x777: 0x1d5c, 0x778: 0x19f0, 0x779: 0x00b1, 0x77a: 0x1a65, 0x77b: 0x1c50, 0x77c: 0x0099, 0x77d: 0x0087, 0x77e: 0x0089, 0x77f: 0x009b, // Block 0x1e, offset 0x780 0x781: 0x3c06, 0x783: 0xa000, 0x784: 0x3c0d, 0x785: 0xa000, 0x787: 0x3c14, 0x788: 0xa000, 0x789: 0x3c1b, 0x78d: 0xa000, 0x7a0: 0x2f65, 0x7a1: 0xa000, 0x7a2: 0x3c29, 0x7a4: 0xa000, 0x7a5: 0xa000, 0x7ad: 0x3c22, 0x7ae: 0x2f60, 0x7af: 0x2f6a, 0x7b0: 0x3c30, 0x7b1: 0x3c37, 0x7b2: 0xa000, 0x7b3: 0xa000, 0x7b4: 0x3c3e, 0x7b5: 0x3c45, 0x7b6: 0xa000, 0x7b7: 0xa000, 0x7b8: 0x3c4c, 0x7b9: 0x3c53, 0x7ba: 0xa000, 0x7bb: 0xa000, 0x7bc: 0xa000, 0x7bd: 0xa000, // Block 0x1f, offset 0x7c0 0x7c0: 0x3c5a, 0x7c1: 0x3c61, 0x7c2: 0xa000, 0x7c3: 0xa000, 0x7c4: 0x3c76, 0x7c5: 0x3c7d, 0x7c6: 0xa000, 0x7c7: 0xa000, 0x7c8: 0x3c84, 0x7c9: 0x3c8b, 0x7d1: 0xa000, 0x7d2: 0xa000, 0x7e2: 0xa000, 0x7e8: 0xa000, 0x7e9: 0xa000, 0x7eb: 0xa000, 0x7ec: 0x3ca0, 0x7ed: 0x3ca7, 0x7ee: 0x3cae, 0x7ef: 0x3cb5, 0x7f2: 0xa000, 0x7f3: 0xa000, 0x7f4: 0xa000, 0x7f5: 0xa000, // Block 0x20, offset 0x800 0x820: 0x0023, 0x821: 0x0025, 0x822: 0x0027, 0x823: 0x0029, 0x824: 0x002b, 0x825: 0x002d, 0x826: 0x002f, 0x827: 0x0031, 0x828: 0x0033, 0x829: 0x1882, 0x82a: 0x1885, 0x82b: 0x1888, 0x82c: 0x188b, 0x82d: 0x188e, 0x82e: 0x1891, 0x82f: 0x1894, 0x830: 0x1897, 0x831: 0x189a, 0x832: 0x189d, 0x833: 0x18a6, 0x834: 0x1a68, 0x835: 0x1a6c, 0x836: 0x1a70, 0x837: 0x1a74, 0x838: 0x1a78, 0x839: 0x1a7c, 0x83a: 0x1a80, 0x83b: 0x1a84, 0x83c: 0x1a88, 0x83d: 0x1c80, 0x83e: 0x1c85, 0x83f: 0x1c8a, // Block 0x21, offset 0x840 0x840: 0x1c8f, 0x841: 0x1c94, 0x842: 0x1c99, 0x843: 0x1c9e, 0x844: 0x1ca3, 0x845: 0x1ca8, 0x846: 0x1cad, 0x847: 0x1cb2, 0x848: 0x187f, 0x849: 0x18a3, 0x84a: 0x18c7, 0x84b: 0x18eb, 0x84c: 0x190f, 0x84d: 0x1918, 0x84e: 0x191e, 0x84f: 0x1924, 0x850: 0x192a, 0x851: 0x1b60, 0x852: 0x1b64, 0x853: 0x1b68, 0x854: 0x1b6c, 0x855: 0x1b70, 0x856: 0x1b74, 0x857: 0x1b78, 0x858: 0x1b7c, 0x859: 0x1b80, 0x85a: 0x1b84, 0x85b: 0x1b88, 0x85c: 0x1af4, 0x85d: 0x1af8, 0x85e: 0x1afc, 0x85f: 0x1b00, 0x860: 0x1b04, 0x861: 0x1b08, 0x862: 0x1b0c, 0x863: 0x1b10, 0x864: 0x1b14, 0x865: 0x1b18, 0x866: 0x1b1c, 0x867: 0x1b20, 0x868: 0x1b24, 0x869: 0x1b28, 0x86a: 0x1b2c, 0x86b: 0x1b30, 0x86c: 0x1b34, 0x86d: 0x1b38, 0x86e: 0x1b3c, 0x86f: 0x1b40, 0x870: 0x1b44, 0x871: 0x1b48, 0x872: 0x1b4c, 0x873: 0x1b50, 0x874: 0x1b54, 0x875: 0x1b58, 0x876: 0x0043, 0x877: 0x0045, 0x878: 0x0047, 0x879: 0x0049, 0x87a: 0x004b, 0x87b: 0x004d, 0x87c: 0x004f, 0x87d: 0x0051, 0x87e: 0x0053, 0x87f: 0x0055, // Block 0x22, offset 0x880 0x880: 0x06bf, 0x881: 0x06e3, 0x882: 0x06ef, 0x883: 0x06ff, 0x884: 0x0707, 0x885: 0x0713, 0x886: 0x071b, 0x887: 0x0723, 0x888: 0x072f, 0x889: 0x0783, 0x88a: 0x079b, 0x88b: 0x07ab, 0x88c: 0x07bb, 0x88d: 0x07cb, 0x88e: 0x07db, 0x88f: 0x07fb, 0x890: 0x07ff, 0x891: 0x0803, 0x892: 0x0837, 0x893: 0x085f, 0x894: 0x086f, 0x895: 0x0877, 0x896: 0x087b, 0x897: 0x0887, 0x898: 0x08a3, 0x899: 0x08a7, 0x89a: 0x08bf, 0x89b: 0x08c3, 0x89c: 0x08cb, 0x89d: 0x08db, 0x89e: 0x0977, 0x89f: 0x098b, 0x8a0: 0x09cb, 0x8a1: 0x09df, 0x8a2: 0x09e7, 0x8a3: 0x09eb, 0x8a4: 0x09fb, 0x8a5: 0x0a17, 0x8a6: 0x0a43, 0x8a7: 0x0a4f, 0x8a8: 0x0a6f, 0x8a9: 0x0a7b, 0x8aa: 0x0a7f, 0x8ab: 0x0a83, 0x8ac: 0x0a9b, 0x8ad: 0x0a9f, 0x8ae: 0x0acb, 0x8af: 0x0ad7, 0x8b0: 0x0adf, 0x8b1: 0x0ae7, 0x8b2: 0x0af7, 0x8b3: 0x0aff, 0x8b4: 0x0b07, 0x8b5: 0x0b33, 0x8b6: 0x0b37, 0x8b7: 0x0b3f, 0x8b8: 0x0b43, 0x8b9: 0x0b4b, 0x8ba: 0x0b53, 0x8bb: 0x0b63, 0x8bc: 0x0b7f, 0x8bd: 0x0bf7, 0x8be: 0x0c0b, 0x8bf: 0x0c0f, // Block 0x23, offset 0x8c0 0x8c0: 0x0c8f, 0x8c1: 0x0c93, 0x8c2: 0x0ca7, 0x8c3: 0x0cab, 0x8c4: 0x0cb3, 0x8c5: 0x0cbb, 0x8c6: 0x0cc3, 0x8c7: 0x0ccf, 0x8c8: 0x0cf7, 0x8c9: 0x0d07, 0x8ca: 0x0d1b, 0x8cb: 0x0d8b, 0x8cc: 0x0d97, 0x8cd: 0x0da7, 0x8ce: 0x0db3, 0x8cf: 0x0dbf, 0x8d0: 0x0dc7, 0x8d1: 0x0dcb, 0x8d2: 0x0dcf, 0x8d3: 0x0dd3, 0x8d4: 0x0dd7, 0x8d5: 0x0e8f, 0x8d6: 0x0ed7, 0x8d7: 0x0ee3, 0x8d8: 0x0ee7, 0x8d9: 0x0eeb, 0x8da: 0x0eef, 0x8db: 0x0ef7, 0x8dc: 0x0efb, 0x8dd: 0x0f0f, 0x8de: 0x0f2b, 0x8df: 0x0f33, 0x8e0: 0x0f73, 0x8e1: 0x0f77, 0x8e2: 0x0f7f, 0x8e3: 0x0f83, 0x8e4: 0x0f8b, 0x8e5: 0x0f8f, 0x8e6: 0x0fb3, 0x8e7: 0x0fb7, 0x8e8: 0x0fd3, 0x8e9: 0x0fd7, 0x8ea: 0x0fdb, 0x8eb: 0x0fdf, 0x8ec: 0x0ff3, 0x8ed: 0x1017, 0x8ee: 0x101b, 0x8ef: 0x101f, 0x8f0: 0x1043, 0x8f1: 0x1083, 0x8f2: 0x1087, 0x8f3: 0x10a7, 0x8f4: 0x10b7, 0x8f5: 0x10bf, 0x8f6: 0x10df, 0x8f7: 0x1103, 0x8f8: 0x1147, 0x8f9: 0x114f, 0x8fa: 0x1163, 0x8fb: 0x116f, 0x8fc: 0x1177, 0x8fd: 0x117f, 0x8fe: 0x1183, 0x8ff: 0x1187, // Block 0x24, offset 0x900 0x900: 0x119f, 0x901: 0x11a3, 0x902: 0x11bf, 0x903: 0x11c7, 0x904: 0x11cf, 0x905: 0x11d3, 0x906: 0x11df, 0x907: 0x11e7, 0x908: 0x11eb, 0x909: 0x11ef, 0x90a: 0x11f7, 0x90b: 0x11fb, 0x90c: 0x129b, 0x90d: 0x12af, 0x90e: 0x12e3, 0x90f: 0x12e7, 0x910: 0x12ef, 0x911: 0x131b, 0x912: 0x1323, 0x913: 0x132b, 0x914: 0x1333, 0x915: 0x136f, 0x916: 0x1373, 0x917: 0x137b, 0x918: 0x137f, 0x919: 0x1383, 0x91a: 0x13af, 0x91b: 0x13b3, 0x91c: 0x13bb, 0x91d: 0x13cf, 0x91e: 0x13d3, 0x91f: 0x13ef, 0x920: 0x13f7, 0x921: 0x13fb, 0x922: 0x141f, 0x923: 0x143f, 0x924: 0x1453, 0x925: 0x1457, 0x926: 0x145f, 0x927: 0x148b, 0x928: 0x148f, 0x929: 0x149f, 0x92a: 0x14c3, 0x92b: 0x14cf, 0x92c: 0x14df, 0x92d: 0x14f7, 0x92e: 0x14ff, 0x92f: 0x1503, 0x930: 0x1507, 0x931: 0x150b, 0x932: 0x1517, 0x933: 0x151b, 0x934: 0x1523, 0x935: 0x153f, 0x936: 0x1543, 0x937: 0x1547, 0x938: 0x155f, 0x939: 0x1563, 0x93a: 0x156b, 0x93b: 0x157f, 0x93c: 0x1583, 0x93d: 0x1587, 0x93e: 0x158f, 0x93f: 0x1593, // Block 0x25, offset 0x940 0x946: 0xa000, 0x94b: 0xa000, 0x94c: 0x3f08, 0x94d: 0xa000, 0x94e: 0x3f10, 0x94f: 0xa000, 0x950: 0x3f18, 0x951: 0xa000, 0x952: 0x3f20, 0x953: 0xa000, 0x954: 0x3f28, 0x955: 0xa000, 0x956: 0x3f30, 0x957: 0xa000, 0x958: 0x3f38, 0x959: 0xa000, 0x95a: 0x3f40, 0x95b: 0xa000, 0x95c: 0x3f48, 0x95d: 0xa000, 0x95e: 0x3f50, 0x95f: 0xa000, 0x960: 0x3f58, 0x961: 0xa000, 0x962: 0x3f60, 0x964: 0xa000, 0x965: 0x3f68, 0x966: 0xa000, 0x967: 0x3f70, 0x968: 0xa000, 0x969: 0x3f78, 0x96f: 0xa000, 0x970: 0x3f80, 0x971: 0x3f88, 0x972: 0xa000, 0x973: 0x3f90, 0x974: 0x3f98, 0x975: 0xa000, 0x976: 0x3fa0, 0x977: 0x3fa8, 0x978: 0xa000, 0x979: 0x3fb0, 0x97a: 0x3fb8, 0x97b: 0xa000, 0x97c: 0x3fc0, 0x97d: 0x3fc8, // Block 0x26, offset 0x980 0x994: 0x3f00, 0x999: 0x9903, 0x99a: 0x9903, 0x99b: 0x42dc, 0x99c: 0x42e2, 0x99d: 0xa000, 0x99e: 0x3fd0, 0x99f: 0x26b4, 0x9a6: 0xa000, 0x9ab: 0xa000, 0x9ac: 0x3fe0, 0x9ad: 0xa000, 0x9ae: 0x3fe8, 0x9af: 0xa000, 0x9b0: 0x3ff0, 0x9b1: 0xa000, 0x9b2: 0x3ff8, 0x9b3: 0xa000, 0x9b4: 0x4000, 0x9b5: 0xa000, 0x9b6: 0x4008, 0x9b7: 0xa000, 0x9b8: 0x4010, 0x9b9: 0xa000, 0x9ba: 0x4018, 0x9bb: 0xa000, 0x9bc: 0x4020, 0x9bd: 0xa000, 0x9be: 0x4028, 0x9bf: 0xa000, // Block 0x27, offset 0x9c0 0x9c0: 0x4030, 0x9c1: 0xa000, 0x9c2: 0x4038, 0x9c4: 0xa000, 0x9c5: 0x4040, 0x9c6: 0xa000, 0x9c7: 0x4048, 0x9c8: 0xa000, 0x9c9: 0x4050, 0x9cf: 0xa000, 0x9d0: 0x4058, 0x9d1: 0x4060, 0x9d2: 0xa000, 0x9d3: 0x4068, 0x9d4: 0x4070, 0x9d5: 0xa000, 0x9d6: 0x4078, 0x9d7: 0x4080, 0x9d8: 0xa000, 0x9d9: 0x4088, 0x9da: 0x4090, 0x9db: 0xa000, 0x9dc: 0x4098, 0x9dd: 0x40a0, 0x9ef: 0xa000, 0x9f0: 0xa000, 0x9f1: 0xa000, 0x9f2: 0xa000, 0x9f4: 0x3fd8, 0x9f7: 0x40a8, 0x9f8: 0x40b0, 0x9f9: 0x40b8, 0x9fa: 0x40c0, 0x9fd: 0xa000, 0x9fe: 0x40c8, 0x9ff: 0x26c9, // Block 0x28, offset 0xa00 0xa00: 0x0367, 0xa01: 0x032b, 0xa02: 0x032f, 0xa03: 0x0333, 0xa04: 0x037b, 0xa05: 0x0337, 0xa06: 0x033b, 0xa07: 0x033f, 0xa08: 0x0343, 0xa09: 0x0347, 0xa0a: 0x034b, 0xa0b: 0x034f, 0xa0c: 0x0353, 0xa0d: 0x0357, 0xa0e: 0x035b, 0xa0f: 0x49bd, 0xa10: 0x49c3, 0xa11: 0x49c9, 0xa12: 0x49cf, 0xa13: 0x49d5, 0xa14: 0x49db, 0xa15: 0x49e1, 0xa16: 0x49e7, 0xa17: 0x49ed, 0xa18: 0x49f3, 0xa19: 0x49f9, 0xa1a: 0x49ff, 0xa1b: 0x4a05, 0xa1c: 0x4a0b, 0xa1d: 0x4a11, 0xa1e: 0x4a17, 0xa1f: 0x4a1d, 0xa20: 0x4a23, 0xa21: 0x4a29, 0xa22: 0x4a2f, 0xa23: 0x4a35, 0xa24: 0x03c3, 0xa25: 0x035f, 0xa26: 0x0363, 0xa27: 0x03e7, 0xa28: 0x03eb, 0xa29: 0x03ef, 0xa2a: 0x03f3, 0xa2b: 0x03f7, 0xa2c: 0x03fb, 0xa2d: 0x03ff, 0xa2e: 0x036b, 0xa2f: 0x0403, 0xa30: 0x0407, 0xa31: 0x036f, 0xa32: 0x0373, 0xa33: 0x0377, 0xa34: 0x037f, 0xa35: 0x0383, 0xa36: 0x0387, 0xa37: 0x038b, 0xa38: 0x038f, 0xa39: 0x0393, 0xa3a: 0x0397, 0xa3b: 0x039b, 0xa3c: 0x039f, 0xa3d: 0x03a3, 0xa3e: 0x03a7, 0xa3f: 0x03ab, // Block 0x29, offset 0xa40 0xa40: 0x03af, 0xa41: 0x03b3, 0xa42: 0x040b, 0xa43: 0x040f, 0xa44: 0x03b7, 0xa45: 0x03bb, 0xa46: 0x03bf, 0xa47: 0x03c7, 0xa48: 0x03cb, 0xa49: 0x03cf, 0xa4a: 0x03d3, 0xa4b: 0x03d7, 0xa4c: 0x03db, 0xa4d: 0x03df, 0xa4e: 0x03e3, 0xa52: 0x06bf, 0xa53: 0x071b, 0xa54: 0x06cb, 0xa55: 0x097b, 0xa56: 0x06cf, 0xa57: 0x06e7, 0xa58: 0x06d3, 0xa59: 0x0f93, 0xa5a: 0x0707, 0xa5b: 0x06db, 0xa5c: 0x06c3, 0xa5d: 0x09ff, 0xa5e: 0x098f, 0xa5f: 0x072f, // Block 0x2a, offset 0xa80 0xa80: 0x2054, 0xa81: 0x205a, 0xa82: 0x2060, 0xa83: 0x2066, 0xa84: 0x206c, 0xa85: 0x2072, 0xa86: 0x2078, 0xa87: 0x207e, 0xa88: 0x2084, 0xa89: 0x208a, 0xa8a: 0x2090, 0xa8b: 0x2096, 0xa8c: 0x209c, 0xa8d: 0x20a2, 0xa8e: 0x2726, 0xa8f: 0x272f, 0xa90: 0x2738, 0xa91: 0x2741, 0xa92: 0x274a, 0xa93: 0x2753, 0xa94: 0x275c, 0xa95: 0x2765, 0xa96: 0x276e, 0xa97: 0x2780, 0xa98: 0x2789, 0xa99: 0x2792, 0xa9a: 0x279b, 0xa9b: 0x27a4, 0xa9c: 0x2777, 0xa9d: 0x2bac, 0xa9e: 0x2aed, 0xaa0: 0x20a8, 0xaa1: 0x20c0, 0xaa2: 0x20b4, 0xaa3: 0x2108, 0xaa4: 0x20c6, 0xaa5: 0x20e4, 0xaa6: 0x20ae, 0xaa7: 0x20de, 0xaa8: 0x20ba, 0xaa9: 0x20f0, 0xaaa: 0x2120, 0xaab: 0x213e, 0xaac: 0x2138, 0xaad: 0x212c, 0xaae: 0x217a, 0xaaf: 0x210e, 0xab0: 0x211a, 0xab1: 0x2132, 0xab2: 0x2126, 0xab3: 0x2150, 0xab4: 0x20fc, 0xab5: 0x2144, 0xab6: 0x216e, 0xab7: 0x2156, 0xab8: 0x20ea, 0xab9: 0x20cc, 0xaba: 0x2102, 0xabb: 0x2114, 0xabc: 0x214a, 0xabd: 0x20d2, 0xabe: 0x2174, 0xabf: 0x20f6, // Block 0x2b, offset 0xac0 0xac0: 0x215c, 0xac1: 0x20d8, 0xac2: 0x2162, 0xac3: 0x2168, 0xac4: 0x092f, 0xac5: 0x0b03, 0xac6: 0x0ca7, 0xac7: 0x10c7, 0xad0: 0x1bc4, 0xad1: 0x18a9, 0xad2: 0x18ac, 0xad3: 0x18af, 0xad4: 0x18b2, 0xad5: 0x18b5, 0xad6: 0x18b8, 0xad7: 0x18bb, 0xad8: 0x18be, 0xad9: 0x18c1, 0xada: 0x18ca, 0xadb: 0x18cd, 0xadc: 0x18d0, 0xadd: 0x18d3, 0xade: 0x18d6, 0xadf: 0x18d9, 0xae0: 0x0313, 0xae1: 0x031b, 0xae2: 0x031f, 0xae3: 0x0327, 0xae4: 0x032b, 0xae5: 0x032f, 0xae6: 0x0337, 0xae7: 0x033f, 0xae8: 0x0343, 0xae9: 0x034b, 0xaea: 0x034f, 0xaeb: 0x0353, 0xaec: 0x0357, 0xaed: 0x035b, 0xaee: 0x2e18, 0xaef: 0x2e20, 0xaf0: 0x2e28, 0xaf1: 0x2e30, 0xaf2: 0x2e38, 0xaf3: 0x2e40, 0xaf4: 0x2e48, 0xaf5: 0x2e50, 0xaf6: 0x2e60, 0xaf7: 0x2e68, 0xaf8: 0x2e70, 0xaf9: 0x2e78, 0xafa: 0x2e80, 0xafb: 0x2e88, 0xafc: 0x2ed3, 0xafd: 0x2e9b, 0xafe: 0x2e58, // Block 0x2c, offset 0xb00 0xb00: 0x06bf, 0xb01: 0x071b, 0xb02: 0x06cb, 0xb03: 0x097b, 0xb04: 0x071f, 0xb05: 0x07af, 0xb06: 0x06c7, 0xb07: 0x07ab, 0xb08: 0x070b, 0xb09: 0x0887, 0xb0a: 0x0d07, 0xb0b: 0x0e8f, 0xb0c: 0x0dd7, 0xb0d: 0x0d1b, 0xb0e: 0x145f, 0xb0f: 0x098b, 0xb10: 0x0ccf, 0xb11: 0x0d4b, 0xb12: 0x0d0b, 0xb13: 0x104b, 0xb14: 0x08fb, 0xb15: 0x0f03, 0xb16: 0x1387, 0xb17: 0x105f, 0xb18: 0x0843, 0xb19: 0x108f, 0xb1a: 0x0f9b, 0xb1b: 0x0a17, 0xb1c: 0x140f, 0xb1d: 0x077f, 0xb1e: 0x08ab, 0xb1f: 0x0df7, 0xb20: 0x1527, 0xb21: 0x0743, 0xb22: 0x07d3, 0xb23: 0x0d9b, 0xb24: 0x06cf, 0xb25: 0x06e7, 0xb26: 0x06d3, 0xb27: 0x0adb, 0xb28: 0x08ef, 0xb29: 0x087f, 0xb2a: 0x0a57, 0xb2b: 0x0a4b, 0xb2c: 0x0feb, 0xb2d: 0x073f, 0xb2e: 0x139b, 0xb2f: 0x089b, 0xb30: 0x09f3, 0xb31: 0x18dc, 0xb32: 0x18df, 0xb33: 0x18e2, 0xb34: 0x18e5, 0xb35: 0x18ee, 0xb36: 0x18f1, 0xb37: 0x18f4, 0xb38: 0x18f7, 0xb39: 0x18fa, 0xb3a: 0x18fd, 0xb3b: 0x1900, 0xb3c: 0x1903, 0xb3d: 0x1906, 0xb3e: 0x1909, 0xb3f: 0x1912, // Block 0x2d, offset 0xb40 0xb40: 0x1cc6, 0xb41: 0x1cd5, 0xb42: 0x1ce4, 0xb43: 0x1cf3, 0xb44: 0x1d02, 0xb45: 0x1d11, 0xb46: 0x1d20, 0xb47: 0x1d2f, 0xb48: 0x1d3e, 0xb49: 0x218c, 0xb4a: 0x219e, 0xb4b: 0x21b0, 0xb4c: 0x1954, 0xb4d: 0x1c04, 0xb4e: 0x19d2, 0xb4f: 0x1ba8, 0xb50: 0x04cb, 0xb51: 0x04d3, 0xb52: 0x04db, 0xb53: 0x04e3, 0xb54: 0x04eb, 0xb55: 0x04ef, 0xb56: 0x04f3, 0xb57: 0x04f7, 0xb58: 0x04fb, 0xb59: 0x04ff, 0xb5a: 0x0503, 0xb5b: 0x0507, 0xb5c: 0x050b, 0xb5d: 0x050f, 0xb5e: 0x0513, 0xb5f: 0x0517, 0xb60: 0x051b, 0xb61: 0x0523, 0xb62: 0x0527, 0xb63: 0x052b, 0xb64: 0x052f, 0xb65: 0x0533, 0xb66: 0x0537, 0xb67: 0x053b, 0xb68: 0x053f, 0xb69: 0x0543, 0xb6a: 0x0547, 0xb6b: 0x054b, 0xb6c: 0x054f, 0xb6d: 0x0553, 0xb6e: 0x0557, 0xb6f: 0x055b, 0xb70: 0x055f, 0xb71: 0x0563, 0xb72: 0x0567, 0xb73: 0x056f, 0xb74: 0x0577, 0xb75: 0x057f, 0xb76: 0x0583, 0xb77: 0x0587, 0xb78: 0x058b, 0xb79: 0x058f, 0xb7a: 0x0593, 0xb7b: 0x0597, 0xb7c: 0x059b, 0xb7d: 0x059f, 0xb7e: 0x05a3, // Block 0x2e, offset 0xb80 0xb80: 0x2b0c, 0xb81: 0x29a8, 0xb82: 0x2b1c, 0xb83: 0x2880, 0xb84: 0x2ee4, 0xb85: 0x288a, 0xb86: 0x2894, 0xb87: 0x2f28, 0xb88: 0x29b5, 0xb89: 0x289e, 0xb8a: 0x28a8, 0xb8b: 0x28b2, 0xb8c: 0x29dc, 0xb8d: 0x29e9, 0xb8e: 0x29c2, 0xb8f: 0x29cf, 0xb90: 0x2ea9, 0xb91: 0x29f6, 0xb92: 0x2a03, 0xb93: 0x2bbe, 0xb94: 0x26bb, 0xb95: 0x2bd1, 0xb96: 0x2be4, 0xb97: 0x2b2c, 0xb98: 0x2a10, 0xb99: 0x2bf7, 0xb9a: 0x2c0a, 0xb9b: 0x2a1d, 0xb9c: 0x28bc, 0xb9d: 0x28c6, 0xb9e: 0x2eb7, 0xb9f: 0x2a2a, 0xba0: 0x2b3c, 0xba1: 0x2ef5, 0xba2: 0x28d0, 0xba3: 0x28da, 0xba4: 0x2a37, 0xba5: 0x28e4, 0xba6: 0x28ee, 0xba7: 0x26d0, 0xba8: 0x26d7, 0xba9: 0x28f8, 0xbaa: 0x2902, 0xbab: 0x2c1d, 0xbac: 0x2a44, 0xbad: 0x2b4c, 0xbae: 0x2c30, 0xbaf: 0x2a51, 0xbb0: 0x2916, 0xbb1: 0x290c, 0xbb2: 0x2f3c, 0xbb3: 0x2a5e, 0xbb4: 0x2c43, 0xbb5: 0x2920, 0xbb6: 0x2b5c, 0xbb7: 0x292a, 0xbb8: 0x2a78, 0xbb9: 0x2934, 0xbba: 0x2a85, 0xbbb: 0x2f06, 0xbbc: 0x2a6b, 0xbbd: 0x2b6c, 0xbbe: 0x2a92, 0xbbf: 0x26de, // Block 0x2f, offset 0xbc0 0xbc0: 0x2f17, 0xbc1: 0x293e, 0xbc2: 0x2948, 0xbc3: 0x2a9f, 0xbc4: 0x2952, 0xbc5: 0x295c, 0xbc6: 0x2966, 0xbc7: 0x2b7c, 0xbc8: 0x2aac, 0xbc9: 0x26e5, 0xbca: 0x2c56, 0xbcb: 0x2e90, 0xbcc: 0x2b8c, 0xbcd: 0x2ab9, 0xbce: 0x2ec5, 0xbcf: 0x2970, 0xbd0: 0x297a, 0xbd1: 0x2ac6, 0xbd2: 0x26ec, 0xbd3: 0x2ad3, 0xbd4: 0x2b9c, 0xbd5: 0x26f3, 0xbd6: 0x2c69, 0xbd7: 0x2984, 0xbd8: 0x1cb7, 0xbd9: 0x1ccb, 0xbda: 0x1cda, 0xbdb: 0x1ce9, 0xbdc: 0x1cf8, 0xbdd: 0x1d07, 0xbde: 0x1d16, 0xbdf: 0x1d25, 0xbe0: 0x1d34, 0xbe1: 0x1d43, 0xbe2: 0x2192, 0xbe3: 0x21a4, 0xbe4: 0x21b6, 0xbe5: 0x21c2, 0xbe6: 0x21ce, 0xbe7: 0x21da, 0xbe8: 0x21e6, 0xbe9: 0x21f2, 0xbea: 0x21fe, 0xbeb: 0x220a, 0xbec: 0x2246, 0xbed: 0x2252, 0xbee: 0x225e, 0xbef: 0x226a, 0xbf0: 0x2276, 0xbf1: 0x1c14, 0xbf2: 0x19c6, 0xbf3: 0x1936, 0xbf4: 0x1be4, 0xbf5: 0x1a47, 0xbf6: 0x1a56, 0xbf7: 0x19cc, 0xbf8: 0x1bfc, 0xbf9: 0x1c00, 0xbfa: 0x1960, 0xbfb: 0x2701, 0xbfc: 0x270f, 0xbfd: 0x26fa, 0xbfe: 0x2708, 0xbff: 0x2ae0, // Block 0x30, offset 0xc00 0xc00: 0x1a4a, 0xc01: 0x1a32, 0xc02: 0x1c60, 0xc03: 0x1a1a, 0xc04: 0x19f3, 0xc05: 0x1969, 0xc06: 0x1978, 0xc07: 0x1948, 0xc08: 0x1bf0, 0xc09: 0x1d52, 0xc0a: 0x1a4d, 0xc0b: 0x1a35, 0xc0c: 0x1c64, 0xc0d: 0x1c70, 0xc0e: 0x1a26, 0xc0f: 0x19fc, 0xc10: 0x1957, 0xc11: 0x1c1c, 0xc12: 0x1bb0, 0xc13: 0x1b9c, 0xc14: 0x1bcc, 0xc15: 0x1c74, 0xc16: 0x1a29, 0xc17: 0x19c9, 0xc18: 0x19ff, 0xc19: 0x19de, 0xc1a: 0x1a41, 0xc1b: 0x1c78, 0xc1c: 0x1a2c, 0xc1d: 0x19c0, 0xc1e: 0x1a02, 0xc1f: 0x1c3c, 0xc20: 0x1bf4, 0xc21: 0x1a14, 0xc22: 0x1c24, 0xc23: 0x1c40, 0xc24: 0x1bf8, 0xc25: 0x1a17, 0xc26: 0x1c28, 0xc27: 0x22e8, 0xc28: 0x22fc, 0xc29: 0x1996, 0xc2a: 0x1c20, 0xc2b: 0x1bb4, 0xc2c: 0x1ba0, 0xc2d: 0x1c48, 0xc2e: 0x2716, 0xc2f: 0x27ad, 0xc30: 0x1a59, 0xc31: 0x1a44, 0xc32: 0x1c7c, 0xc33: 0x1a2f, 0xc34: 0x1a50, 0xc35: 0x1a38, 0xc36: 0x1c68, 0xc37: 0x1a1d, 0xc38: 0x19f6, 0xc39: 0x1981, 0xc3a: 0x1a53, 0xc3b: 0x1a3b, 0xc3c: 0x1c6c, 0xc3d: 0x1a20, 0xc3e: 0x19f9, 0xc3f: 0x1984, // Block 0x31, offset 0xc40 0xc40: 0x1c2c, 0xc41: 0x1bb8, 0xc42: 0x1d4d, 0xc43: 0x1939, 0xc44: 0x19ba, 0xc45: 0x19bd, 0xc46: 0x22f5, 0xc47: 0x1b94, 0xc48: 0x19c3, 0xc49: 0x194b, 0xc4a: 0x19e1, 0xc4b: 0x194e, 0xc4c: 0x19ea, 0xc4d: 0x196c, 0xc4e: 0x196f, 0xc4f: 0x1a05, 0xc50: 0x1a0b, 0xc51: 0x1a0e, 0xc52: 0x1c30, 0xc53: 0x1a11, 0xc54: 0x1a23, 0xc55: 0x1c38, 0xc56: 0x1c44, 0xc57: 0x1990, 0xc58: 0x1d57, 0xc59: 0x1bbc, 0xc5a: 0x1993, 0xc5b: 0x1a5c, 0xc5c: 0x19a5, 0xc5d: 0x19b4, 0xc5e: 0x22e2, 0xc5f: 0x22dc, 0xc60: 0x1cc1, 0xc61: 0x1cd0, 0xc62: 0x1cdf, 0xc63: 0x1cee, 0xc64: 0x1cfd, 0xc65: 0x1d0c, 0xc66: 0x1d1b, 0xc67: 0x1d2a, 0xc68: 0x1d39, 0xc69: 0x2186, 0xc6a: 0x2198, 0xc6b: 0x21aa, 0xc6c: 0x21bc, 0xc6d: 0x21c8, 0xc6e: 0x21d4, 0xc6f: 0x21e0, 0xc70: 0x21ec, 0xc71: 0x21f8, 0xc72: 0x2204, 0xc73: 0x2240, 0xc74: 0x224c, 0xc75: 0x2258, 0xc76: 0x2264, 0xc77: 0x2270, 0xc78: 0x227c, 0xc79: 0x2282, 0xc7a: 0x2288, 0xc7b: 0x228e, 0xc7c: 0x2294, 0xc7d: 0x22a6, 0xc7e: 0x22ac, 0xc7f: 0x1c10, // Block 0x32, offset 0xc80 0xc80: 0x1377, 0xc81: 0x0cfb, 0xc82: 0x13d3, 0xc83: 0x139f, 0xc84: 0x0e57, 0xc85: 0x06eb, 0xc86: 0x08df, 0xc87: 0x162b, 0xc88: 0x162b, 0xc89: 0x0a0b, 0xc8a: 0x145f, 0xc8b: 0x0943, 0xc8c: 0x0a07, 0xc8d: 0x0bef, 0xc8e: 0x0fcf, 0xc8f: 0x115f, 0xc90: 0x1297, 0xc91: 0x12d3, 0xc92: 0x1307, 0xc93: 0x141b, 0xc94: 0x0d73, 0xc95: 0x0dff, 0xc96: 0x0eab, 0xc97: 0x0f43, 0xc98: 0x125f, 0xc99: 0x1447, 0xc9a: 0x1573, 0xc9b: 0x070f, 0xc9c: 0x08b3, 0xc9d: 0x0d87, 0xc9e: 0x0ecf, 0xc9f: 0x1293, 0xca0: 0x15c3, 0xca1: 0x0ab3, 0xca2: 0x0e77, 0xca3: 0x1283, 0xca4: 0x1317, 0xca5: 0x0c23, 0xca6: 0x11bb, 0xca7: 0x12df, 0xca8: 0x0b1f, 0xca9: 0x0d0f, 0xcaa: 0x0e17, 0xcab: 0x0f1b, 0xcac: 0x1427, 0xcad: 0x074f, 0xcae: 0x07e7, 0xcaf: 0x0853, 0xcb0: 0x0c8b, 0xcb1: 0x0d7f, 0xcb2: 0x0ecb, 0xcb3: 0x0fef, 0xcb4: 0x1177, 0xcb5: 0x128b, 0xcb6: 0x12a3, 0xcb7: 0x13c7, 0xcb8: 0x14ef, 0xcb9: 0x15a3, 0xcba: 0x15bf, 0xcbb: 0x102b, 0xcbc: 0x106b, 0xcbd: 0x1123, 0xcbe: 0x1243, 0xcbf: 0x147b, // Block 0x33, offset 0xcc0 0xcc0: 0x15cb, 0xcc1: 0x134b, 0xcc2: 0x09c7, 0xcc3: 0x0b3b, 0xcc4: 0x10db, 0xcc5: 0x119b, 0xcc6: 0x0eff, 0xcc7: 0x1033, 0xcc8: 0x1397, 0xcc9: 0x14e7, 0xcca: 0x09c3, 0xccb: 0x0a8f, 0xccc: 0x0d77, 0xccd: 0x0e2b, 0xcce: 0x0e5f, 0xccf: 0x1113, 0xcd0: 0x113b, 0xcd1: 0x14a7, 0xcd2: 0x084f, 0xcd3: 0x11a7, 0xcd4: 0x07f3, 0xcd5: 0x07ef, 0xcd6: 0x1097, 0xcd7: 0x1127, 0xcd8: 0x125b, 0xcd9: 0x14af, 0xcda: 0x1367, 0xcdb: 0x0c27, 0xcdc: 0x0d73, 0xcdd: 0x1357, 0xcde: 0x06f7, 0xcdf: 0x0a63, 0xce0: 0x0b93, 0xce1: 0x0f2f, 0xce2: 0x0faf, 0xce3: 0x0873, 0xce4: 0x103b, 0xce5: 0x075f, 0xce6: 0x0b77, 0xce7: 0x06d7, 0xce8: 0x0deb, 0xce9: 0x0ca3, 0xcea: 0x110f, 0xceb: 0x08c7, 0xcec: 0x09b3, 0xced: 0x0ffb, 0xcee: 0x1263, 0xcef: 0x133b, 0xcf0: 0x0db7, 0xcf1: 0x13f7, 0xcf2: 0x0de3, 0xcf3: 0x0c37, 0xcf4: 0x121b, 0xcf5: 0x0c57, 0xcf6: 0x0fab, 0xcf7: 0x072b, 0xcf8: 0x07a7, 0xcf9: 0x07eb, 0xcfa: 0x0d53, 0xcfb: 0x10fb, 0xcfc: 0x11f3, 0xcfd: 0x1347, 0xcfe: 0x145b, 0xcff: 0x085b, // Block 0x34, offset 0xd00 0xd00: 0x090f, 0xd01: 0x0a17, 0xd02: 0x0b2f, 0xd03: 0x0cbf, 0xd04: 0x0e7b, 0xd05: 0x103f, 0xd06: 0x1497, 0xd07: 0x157b, 0xd08: 0x15cf, 0xd09: 0x15e7, 0xd0a: 0x0837, 0xd0b: 0x0cf3, 0xd0c: 0x0da3, 0xd0d: 0x13eb, 0xd0e: 0x0afb, 0xd0f: 0x0bd7, 0xd10: 0x0bf3, 0xd11: 0x0c83, 0xd12: 0x0e6b, 0xd13: 0x0eb7, 0xd14: 0x0f67, 0xd15: 0x108b, 0xd16: 0x112f, 0xd17: 0x1193, 0xd18: 0x13db, 0xd19: 0x126b, 0xd1a: 0x1403, 0xd1b: 0x147f, 0xd1c: 0x080f, 0xd1d: 0x083b, 0xd1e: 0x0923, 0xd1f: 0x0ea7, 0xd20: 0x12f3, 0xd21: 0x133b, 0xd22: 0x0b1b, 0xd23: 0x0b8b, 0xd24: 0x0c4f, 0xd25: 0x0daf, 0xd26: 0x10d7, 0xd27: 0x0f23, 0xd28: 0x073b, 0xd29: 0x097f, 0xd2a: 0x0a63, 0xd2b: 0x0ac7, 0xd2c: 0x0b97, 0xd2d: 0x0f3f, 0xd2e: 0x0f5b, 0xd2f: 0x116b, 0xd30: 0x118b, 0xd31: 0x1463, 0xd32: 0x14e3, 0xd33: 0x14f3, 0xd34: 0x152f, 0xd35: 0x0753, 0xd36: 0x107f, 0xd37: 0x144f, 0xd38: 0x14cb, 0xd39: 0x0baf, 0xd3a: 0x0717, 0xd3b: 0x0777, 0xd3c: 0x0a67, 0xd3d: 0x0a87, 0xd3e: 0x0caf, 0xd3f: 0x0d73, // Block 0x35, offset 0xd40 0xd40: 0x0ec3, 0xd41: 0x0fcb, 0xd42: 0x1277, 0xd43: 0x1417, 0xd44: 0x1623, 0xd45: 0x0ce3, 0xd46: 0x14a3, 0xd47: 0x0833, 0xd48: 0x0d2f, 0xd49: 0x0d3b, 0xd4a: 0x0e0f, 0xd4b: 0x0e47, 0xd4c: 0x0f4b, 0xd4d: 0x0fa7, 0xd4e: 0x1027, 0xd4f: 0x110b, 0xd50: 0x153b, 0xd51: 0x07af, 0xd52: 0x0c03, 0xd53: 0x14b3, 0xd54: 0x0767, 0xd55: 0x0aab, 0xd56: 0x0e2f, 0xd57: 0x13df, 0xd58: 0x0b67, 0xd59: 0x0bb7, 0xd5a: 0x0d43, 0xd5b: 0x0f2f, 0xd5c: 0x14bb, 0xd5d: 0x0817, 0xd5e: 0x08ff, 0xd5f: 0x0a97, 0xd60: 0x0cd3, 0xd61: 0x0d1f, 0xd62: 0x0d5f, 0xd63: 0x0df3, 0xd64: 0x0f47, 0xd65: 0x0fbb, 0xd66: 0x1157, 0xd67: 0x12f7, 0xd68: 0x1303, 0xd69: 0x1457, 0xd6a: 0x14d7, 0xd6b: 0x0883, 0xd6c: 0x0e4b, 0xd6d: 0x0903, 0xd6e: 0x0ec7, 0xd6f: 0x0f6b, 0xd70: 0x1287, 0xd71: 0x14bf, 0xd72: 0x15ab, 0xd73: 0x15d3, 0xd74: 0x0d37, 0xd75: 0x0e27, 0xd76: 0x11c3, 0xd77: 0x10b7, 0xd78: 0x10c3, 0xd79: 0x10e7, 0xd7a: 0x0f17, 0xd7b: 0x0e9f, 0xd7c: 0x1363, 0xd7d: 0x0733, 0xd7e: 0x122b, 0xd7f: 0x081b, // Block 0x36, offset 0xd80 0xd80: 0x080b, 0xd81: 0x0b0b, 0xd82: 0x0c2b, 0xd83: 0x10f3, 0xd84: 0x0a53, 0xd85: 0x0e03, 0xd86: 0x0cef, 0xd87: 0x13e7, 0xd88: 0x12e7, 0xd89: 0x14ab, 0xd8a: 0x1323, 0xd8b: 0x0b27, 0xd8c: 0x0787, 0xd8d: 0x095b, 0xd90: 0x09af, 0xd92: 0x0cdf, 0xd95: 0x07f7, 0xd96: 0x0f1f, 0xd97: 0x0fe3, 0xd98: 0x1047, 0xd99: 0x1063, 0xd9a: 0x1067, 0xd9b: 0x107b, 0xd9c: 0x14fb, 0xd9d: 0x10eb, 0xd9e: 0x116f, 0xda0: 0x128f, 0xda2: 0x1353, 0xda5: 0x1407, 0xda6: 0x1433, 0xdaa: 0x154f, 0xdab: 0x1553, 0xdac: 0x1557, 0xdad: 0x15bb, 0xdae: 0x142b, 0xdaf: 0x14c7, 0xdb0: 0x0757, 0xdb1: 0x077b, 0xdb2: 0x078f, 0xdb3: 0x084b, 0xdb4: 0x0857, 0xdb5: 0x0897, 0xdb6: 0x094b, 0xdb7: 0x0967, 0xdb8: 0x096f, 0xdb9: 0x09ab, 0xdba: 0x09b7, 0xdbb: 0x0a93, 0xdbc: 0x0a9b, 0xdbd: 0x0ba3, 0xdbe: 0x0bcb, 0xdbf: 0x0bd3, // Block 0x37, offset 0xdc0 0xdc0: 0x0beb, 0xdc1: 0x0c97, 0xdc2: 0x0cc7, 0xdc3: 0x0ce7, 0xdc4: 0x0d57, 0xdc5: 0x0e1b, 0xdc6: 0x0e37, 0xdc7: 0x0e67, 0xdc8: 0x0ebb, 0xdc9: 0x0edb, 0xdca: 0x0f4f, 0xdcb: 0x102f, 0xdcc: 0x104b, 0xdcd: 0x1053, 0xdce: 0x104f, 0xdcf: 0x1057, 0xdd0: 0x105b, 0xdd1: 0x105f, 0xdd2: 0x1073, 0xdd3: 0x1077, 0xdd4: 0x109b, 0xdd5: 0x10af, 0xdd6: 0x10cb, 0xdd7: 0x112f, 0xdd8: 0x1137, 0xdd9: 0x113f, 0xdda: 0x1153, 0xddb: 0x117b, 0xddc: 0x11cb, 0xddd: 0x11ff, 0xdde: 0x11ff, 0xddf: 0x1267, 0xde0: 0x130f, 0xde1: 0x1327, 0xde2: 0x135b, 0xde3: 0x135f, 0xde4: 0x13a3, 0xde5: 0x13a7, 0xde6: 0x13ff, 0xde7: 0x1407, 0xde8: 0x14db, 0xde9: 0x151f, 0xdea: 0x1537, 0xdeb: 0x0b9b, 0xdec: 0x171e, 0xded: 0x11e3, 0xdf0: 0x06df, 0xdf1: 0x07e3, 0xdf2: 0x07a3, 0xdf3: 0x074b, 0xdf4: 0x078b, 0xdf5: 0x07b7, 0xdf6: 0x0847, 0xdf7: 0x0863, 0xdf8: 0x094b, 0xdf9: 0x0937, 0xdfa: 0x0947, 0xdfb: 0x0963, 0xdfc: 0x09af, 0xdfd: 0x09bf, 0xdfe: 0x0a03, 0xdff: 0x0a0f, // Block 0x38, offset 0xe00 0xe00: 0x0a2b, 0xe01: 0x0a3b, 0xe02: 0x0b23, 0xe03: 0x0b2b, 0xe04: 0x0b5b, 0xe05: 0x0b7b, 0xe06: 0x0bab, 0xe07: 0x0bc3, 0xe08: 0x0bb3, 0xe09: 0x0bd3, 0xe0a: 0x0bc7, 0xe0b: 0x0beb, 0xe0c: 0x0c07, 0xe0d: 0x0c5f, 0xe0e: 0x0c6b, 0xe0f: 0x0c73, 0xe10: 0x0c9b, 0xe11: 0x0cdf, 0xe12: 0x0d0f, 0xe13: 0x0d13, 0xe14: 0x0d27, 0xe15: 0x0da7, 0xe16: 0x0db7, 0xe17: 0x0e0f, 0xe18: 0x0e5b, 0xe19: 0x0e53, 0xe1a: 0x0e67, 0xe1b: 0x0e83, 0xe1c: 0x0ebb, 0xe1d: 0x1013, 0xe1e: 0x0edf, 0xe1f: 0x0f13, 0xe20: 0x0f1f, 0xe21: 0x0f5f, 0xe22: 0x0f7b, 0xe23: 0x0f9f, 0xe24: 0x0fc3, 0xe25: 0x0fc7, 0xe26: 0x0fe3, 0xe27: 0x0fe7, 0xe28: 0x0ff7, 0xe29: 0x100b, 0xe2a: 0x1007, 0xe2b: 0x1037, 0xe2c: 0x10b3, 0xe2d: 0x10cb, 0xe2e: 0x10e3, 0xe2f: 0x111b, 0xe30: 0x112f, 0xe31: 0x114b, 0xe32: 0x117b, 0xe33: 0x122f, 0xe34: 0x1257, 0xe35: 0x12cb, 0xe36: 0x1313, 0xe37: 0x131f, 0xe38: 0x1327, 0xe39: 0x133f, 0xe3a: 0x1353, 0xe3b: 0x1343, 0xe3c: 0x135b, 0xe3d: 0x1357, 0xe3e: 0x134f, 0xe3f: 0x135f, // Block 0x39, offset 0xe40 0xe40: 0x136b, 0xe41: 0x13a7, 0xe42: 0x13e3, 0xe43: 0x1413, 0xe44: 0x144b, 0xe45: 0x146b, 0xe46: 0x14b7, 0xe47: 0x14db, 0xe48: 0x14fb, 0xe49: 0x150f, 0xe4a: 0x151f, 0xe4b: 0x152b, 0xe4c: 0x1537, 0xe4d: 0x158b, 0xe4e: 0x162b, 0xe4f: 0x16b5, 0xe50: 0x16b0, 0xe51: 0x16e2, 0xe52: 0x0607, 0xe53: 0x062f, 0xe54: 0x0633, 0xe55: 0x1764, 0xe56: 0x1791, 0xe57: 0x1809, 0xe58: 0x1617, 0xe59: 0x1627, // Block 0x3a, offset 0xe80 0xe80: 0x19d5, 0xe81: 0x19d8, 0xe82: 0x19db, 0xe83: 0x1c08, 0xe84: 0x1c0c, 0xe85: 0x1a5f, 0xe86: 0x1a5f, 0xe93: 0x1d75, 0xe94: 0x1d66, 0xe95: 0x1d6b, 0xe96: 0x1d7a, 0xe97: 0x1d70, 0xe9d: 0x4390, 0xe9e: 0x8115, 0xe9f: 0x4402, 0xea0: 0x022d, 0xea1: 0x0215, 0xea2: 0x021e, 0xea3: 0x0221, 0xea4: 0x0224, 0xea5: 0x0227, 0xea6: 0x022a, 0xea7: 0x0230, 0xea8: 0x0233, 0xea9: 0x0017, 0xeaa: 0x43f0, 0xeab: 0x43f6, 0xeac: 0x44f4, 0xead: 0x44fc, 0xeae: 0x4348, 0xeaf: 0x434e, 0xeb0: 0x4354, 0xeb1: 0x435a, 0xeb2: 0x4366, 0xeb3: 0x436c, 0xeb4: 0x4372, 0xeb5: 0x437e, 0xeb6: 0x4384, 0xeb8: 0x438a, 0xeb9: 0x4396, 0xeba: 0x439c, 0xebb: 0x43a2, 0xebc: 0x43ae, 0xebe: 0x43b4, // Block 0x3b, offset 0xec0 0xec0: 0x43ba, 0xec1: 0x43c0, 0xec3: 0x43c6, 0xec4: 0x43cc, 0xec6: 0x43d8, 0xec7: 0x43de, 0xec8: 0x43e4, 0xec9: 0x43ea, 0xeca: 0x43fc, 0xecb: 0x4378, 0xecc: 0x4360, 0xecd: 0x43a8, 0xece: 0x43d2, 0xecf: 0x1d7f, 0xed0: 0x0299, 0xed1: 0x0299, 0xed2: 0x02a2, 0xed3: 0x02a2, 0xed4: 0x02a2, 0xed5: 0x02a2, 0xed6: 0x02a5, 0xed7: 0x02a5, 0xed8: 0x02a5, 0xed9: 0x02a5, 0xeda: 0x02ab, 0xedb: 0x02ab, 0xedc: 0x02ab, 0xedd: 0x02ab, 0xede: 0x029f, 0xedf: 0x029f, 0xee0: 0x029f, 0xee1: 0x029f, 0xee2: 0x02a8, 0xee3: 0x02a8, 0xee4: 0x02a8, 0xee5: 0x02a8, 0xee6: 0x029c, 0xee7: 0x029c, 0xee8: 0x029c, 0xee9: 0x029c, 0xeea: 0x02cf, 0xeeb: 0x02cf, 0xeec: 0x02cf, 0xeed: 0x02cf, 0xeee: 0x02d2, 0xeef: 0x02d2, 0xef0: 0x02d2, 0xef1: 0x02d2, 0xef2: 0x02b1, 0xef3: 0x02b1, 0xef4: 0x02b1, 0xef5: 0x02b1, 0xef6: 0x02ae, 0xef7: 0x02ae, 0xef8: 0x02ae, 0xef9: 0x02ae, 0xefa: 0x02b4, 0xefb: 0x02b4, 0xefc: 0x02b4, 0xefd: 0x02b4, 0xefe: 0x02b7, 0xeff: 0x02b7, // Block 0x3c, offset 0xf00 0xf00: 0x02b7, 0xf01: 0x02b7, 0xf02: 0x02c0, 0xf03: 0x02c0, 0xf04: 0x02bd, 0xf05: 0x02bd, 0xf06: 0x02c3, 0xf07: 0x02c3, 0xf08: 0x02ba, 0xf09: 0x02ba, 0xf0a: 0x02c9, 0xf0b: 0x02c9, 0xf0c: 0x02c6, 0xf0d: 0x02c6, 0xf0e: 0x02d5, 0xf0f: 0x02d5, 0xf10: 0x02d5, 0xf11: 0x02d5, 0xf12: 0x02db, 0xf13: 0x02db, 0xf14: 0x02db, 0xf15: 0x02db, 0xf16: 0x02e1, 0xf17: 0x02e1, 0xf18: 0x02e1, 0xf19: 0x02e1, 0xf1a: 0x02de, 0xf1b: 0x02de, 0xf1c: 0x02de, 0xf1d: 0x02de, 0xf1e: 0x02e4, 0xf1f: 0x02e4, 0xf20: 0x02e7, 0xf21: 0x02e7, 0xf22: 0x02e7, 0xf23: 0x02e7, 0xf24: 0x446e, 0xf25: 0x446e, 0xf26: 0x02ed, 0xf27: 0x02ed, 0xf28: 0x02ed, 0xf29: 0x02ed, 0xf2a: 0x02ea, 0xf2b: 0x02ea, 0xf2c: 0x02ea, 0xf2d: 0x02ea, 0xf2e: 0x0308, 0xf2f: 0x0308, 0xf30: 0x4468, 0xf31: 0x4468, // Block 0x3d, offset 0xf40 0xf53: 0x02d8, 0xf54: 0x02d8, 0xf55: 0x02d8, 0xf56: 0x02d8, 0xf57: 0x02f6, 0xf58: 0x02f6, 0xf59: 0x02f3, 0xf5a: 0x02f3, 0xf5b: 0x02f9, 0xf5c: 0x02f9, 0xf5d: 0x204f, 0xf5e: 0x02ff, 0xf5f: 0x02ff, 0xf60: 0x02f0, 0xf61: 0x02f0, 0xf62: 0x02fc, 0xf63: 0x02fc, 0xf64: 0x0305, 0xf65: 0x0305, 0xf66: 0x0305, 0xf67: 0x0305, 0xf68: 0x028d, 0xf69: 0x028d, 0xf6a: 0x25aa, 0xf6b: 0x25aa, 0xf6c: 0x261a, 0xf6d: 0x261a, 0xf6e: 0x25e9, 0xf6f: 0x25e9, 0xf70: 0x2605, 0xf71: 0x2605, 0xf72: 0x25fe, 0xf73: 0x25fe, 0xf74: 0x260c, 0xf75: 0x260c, 0xf76: 0x2613, 0xf77: 0x2613, 0xf78: 0x2613, 0xf79: 0x25f0, 0xf7a: 0x25f0, 0xf7b: 0x25f0, 0xf7c: 0x0302, 0xf7d: 0x0302, 0xf7e: 0x0302, 0xf7f: 0x0302, // Block 0x3e, offset 0xf80 0xf80: 0x25b1, 0xf81: 0x25b8, 0xf82: 0x25d4, 0xf83: 0x25f0, 0xf84: 0x25f7, 0xf85: 0x1d89, 0xf86: 0x1d8e, 0xf87: 0x1d93, 0xf88: 0x1da2, 0xf89: 0x1db1, 0xf8a: 0x1db6, 0xf8b: 0x1dbb, 0xf8c: 0x1dc0, 0xf8d: 0x1dc5, 0xf8e: 0x1dd4, 0xf8f: 0x1de3, 0xf90: 0x1de8, 0xf91: 0x1ded, 0xf92: 0x1dfc, 0xf93: 0x1e0b, 0xf94: 0x1e10, 0xf95: 0x1e15, 0xf96: 0x1e1a, 0xf97: 0x1e29, 0xf98: 0x1e2e, 0xf99: 0x1e3d, 0xf9a: 0x1e42, 0xf9b: 0x1e47, 0xf9c: 0x1e56, 0xf9d: 0x1e5b, 0xf9e: 0x1e60, 0xf9f: 0x1e6a, 0xfa0: 0x1ea6, 0xfa1: 0x1eb5, 0xfa2: 0x1ec4, 0xfa3: 0x1ec9, 0xfa4: 0x1ece, 0xfa5: 0x1ed8, 0xfa6: 0x1ee7, 0xfa7: 0x1eec, 0xfa8: 0x1efb, 0xfa9: 0x1f00, 0xfaa: 0x1f05, 0xfab: 0x1f14, 0xfac: 0x1f19, 0xfad: 0x1f28, 0xfae: 0x1f2d, 0xfaf: 0x1f32, 0xfb0: 0x1f37, 0xfb1: 0x1f3c, 0xfb2: 0x1f41, 0xfb3: 0x1f46, 0xfb4: 0x1f4b, 0xfb5: 0x1f50, 0xfb6: 0x1f55, 0xfb7: 0x1f5a, 0xfb8: 0x1f5f, 0xfb9: 0x1f64, 0xfba: 0x1f69, 0xfbb: 0x1f6e, 0xfbc: 0x1f73, 0xfbd: 0x1f78, 0xfbe: 0x1f7d, 0xfbf: 0x1f87, // Block 0x3f, offset 0xfc0 0xfc0: 0x1f8c, 0xfc1: 0x1f91, 0xfc2: 0x1f96, 0xfc3: 0x1fa0, 0xfc4: 0x1fa5, 0xfc5: 0x1faf, 0xfc6: 0x1fb4, 0xfc7: 0x1fb9, 0xfc8: 0x1fbe, 0xfc9: 0x1fc3, 0xfca: 0x1fc8, 0xfcb: 0x1fcd, 0xfcc: 0x1fd2, 0xfcd: 0x1fd7, 0xfce: 0x1fe6, 0xfcf: 0x1ff5, 0xfd0: 0x1ffa, 0xfd1: 0x1fff, 0xfd2: 0x2004, 0xfd3: 0x2009, 0xfd4: 0x200e, 0xfd5: 0x2018, 0xfd6: 0x201d, 0xfd7: 0x2022, 0xfd8: 0x2031, 0xfd9: 0x2040, 0xfda: 0x2045, 0xfdb: 0x4420, 0xfdc: 0x4426, 0xfdd: 0x445c, 0xfde: 0x44b3, 0xfdf: 0x44ba, 0xfe0: 0x44c1, 0xfe1: 0x44c8, 0xfe2: 0x44cf, 0xfe3: 0x44d6, 0xfe4: 0x25c6, 0xfe5: 0x25cd, 0xfe6: 0x25d4, 0xfe7: 0x25db, 0xfe8: 0x25f0, 0xfe9: 0x25f7, 0xfea: 0x1d98, 0xfeb: 0x1d9d, 0xfec: 0x1da2, 0xfed: 0x1da7, 0xfee: 0x1db1, 0xfef: 0x1db6, 0xff0: 0x1dca, 0xff1: 0x1dcf, 0xff2: 0x1dd4, 0xff3: 0x1dd9, 0xff4: 0x1de3, 0xff5: 0x1de8, 0xff6: 0x1df2, 0xff7: 0x1df7, 0xff8: 0x1dfc, 0xff9: 0x1e01, 0xffa: 0x1e0b, 0xffb: 0x1e10, 0xffc: 0x1f3c, 0xffd: 0x1f41, 0xffe: 0x1f50, 0xfff: 0x1f55, // Block 0x40, offset 0x1000 0x1000: 0x1f5a, 0x1001: 0x1f6e, 0x1002: 0x1f73, 0x1003: 0x1f78, 0x1004: 0x1f7d, 0x1005: 0x1f96, 0x1006: 0x1fa0, 0x1007: 0x1fa5, 0x1008: 0x1faa, 0x1009: 0x1fbe, 0x100a: 0x1fdc, 0x100b: 0x1fe1, 0x100c: 0x1fe6, 0x100d: 0x1feb, 0x100e: 0x1ff5, 0x100f: 0x1ffa, 0x1010: 0x445c, 0x1011: 0x2027, 0x1012: 0x202c, 0x1013: 0x2031, 0x1014: 0x2036, 0x1015: 0x2040, 0x1016: 0x2045, 0x1017: 0x25b1, 0x1018: 0x25b8, 0x1019: 0x25bf, 0x101a: 0x25d4, 0x101b: 0x25e2, 0x101c: 0x1d89, 0x101d: 0x1d8e, 0x101e: 0x1d93, 0x101f: 0x1da2, 0x1020: 0x1dac, 0x1021: 0x1dbb, 0x1022: 0x1dc0, 0x1023: 0x1dc5, 0x1024: 0x1dd4, 0x1025: 0x1dde, 0x1026: 0x1dfc, 0x1027: 0x1e15, 0x1028: 0x1e1a, 0x1029: 0x1e29, 0x102a: 0x1e2e, 0x102b: 0x1e3d, 0x102c: 0x1e47, 0x102d: 0x1e56, 0x102e: 0x1e5b, 0x102f: 0x1e60, 0x1030: 0x1e6a, 0x1031: 0x1ea6, 0x1032: 0x1eab, 0x1033: 0x1eb5, 0x1034: 0x1ec4, 0x1035: 0x1ec9, 0x1036: 0x1ece, 0x1037: 0x1ed8, 0x1038: 0x1ee7, 0x1039: 0x1efb, 0x103a: 0x1f00, 0x103b: 0x1f05, 0x103c: 0x1f14, 0x103d: 0x1f19, 0x103e: 0x1f28, 0x103f: 0x1f2d, // Block 0x41, offset 0x1040 0x1040: 0x1f32, 0x1041: 0x1f37, 0x1042: 0x1f46, 0x1043: 0x1f4b, 0x1044: 0x1f5f, 0x1045: 0x1f64, 0x1046: 0x1f69, 0x1047: 0x1f6e, 0x1048: 0x1f73, 0x1049: 0x1f87, 0x104a: 0x1f8c, 0x104b: 0x1f91, 0x104c: 0x1f96, 0x104d: 0x1f9b, 0x104e: 0x1faf, 0x104f: 0x1fb4, 0x1050: 0x1fb9, 0x1051: 0x1fbe, 0x1052: 0x1fcd, 0x1053: 0x1fd2, 0x1054: 0x1fd7, 0x1055: 0x1fe6, 0x1056: 0x1ff0, 0x1057: 0x1fff, 0x1058: 0x2004, 0x1059: 0x4450, 0x105a: 0x2018, 0x105b: 0x201d, 0x105c: 0x2022, 0x105d: 0x2031, 0x105e: 0x203b, 0x105f: 0x25d4, 0x1060: 0x25e2, 0x1061: 0x1da2, 0x1062: 0x1dac, 0x1063: 0x1dd4, 0x1064: 0x1dde, 0x1065: 0x1dfc, 0x1066: 0x1e06, 0x1067: 0x1e6a, 0x1068: 0x1e6f, 0x1069: 0x1e92, 0x106a: 0x1e97, 0x106b: 0x1f6e, 0x106c: 0x1f73, 0x106d: 0x1f96, 0x106e: 0x1fe6, 0x106f: 0x1ff0, 0x1070: 0x2031, 0x1071: 0x203b, 0x1072: 0x4504, 0x1073: 0x450c, 0x1074: 0x4514, 0x1075: 0x1ef1, 0x1076: 0x1ef6, 0x1077: 0x1f0a, 0x1078: 0x1f0f, 0x1079: 0x1f1e, 0x107a: 0x1f23, 0x107b: 0x1e74, 0x107c: 0x1e79, 0x107d: 0x1e9c, 0x107e: 0x1ea1, 0x107f: 0x1e33, // Block 0x42, offset 0x1080 0x1080: 0x1e38, 0x1081: 0x1e1f, 0x1082: 0x1e24, 0x1083: 0x1e4c, 0x1084: 0x1e51, 0x1085: 0x1eba, 0x1086: 0x1ebf, 0x1087: 0x1edd, 0x1088: 0x1ee2, 0x1089: 0x1e7e, 0x108a: 0x1e83, 0x108b: 0x1e88, 0x108c: 0x1e92, 0x108d: 0x1e8d, 0x108e: 0x1e65, 0x108f: 0x1eb0, 0x1090: 0x1ed3, 0x1091: 0x1ef1, 0x1092: 0x1ef6, 0x1093: 0x1f0a, 0x1094: 0x1f0f, 0x1095: 0x1f1e, 0x1096: 0x1f23, 0x1097: 0x1e74, 0x1098: 0x1e79, 0x1099: 0x1e9c, 0x109a: 0x1ea1, 0x109b: 0x1e33, 0x109c: 0x1e38, 0x109d: 0x1e1f, 0x109e: 0x1e24, 0x109f: 0x1e4c, 0x10a0: 0x1e51, 0x10a1: 0x1eba, 0x10a2: 0x1ebf, 0x10a3: 0x1edd, 0x10a4: 0x1ee2, 0x10a5: 0x1e7e, 0x10a6: 0x1e83, 0x10a7: 0x1e88, 0x10a8: 0x1e92, 0x10a9: 0x1e8d, 0x10aa: 0x1e65, 0x10ab: 0x1eb0, 0x10ac: 0x1ed3, 0x10ad: 0x1e7e, 0x10ae: 0x1e83, 0x10af: 0x1e88, 0x10b0: 0x1e92, 0x10b1: 0x1e6f, 0x10b2: 0x1e97, 0x10b3: 0x1eec, 0x10b4: 0x1e56, 0x10b5: 0x1e5b, 0x10b6: 0x1e60, 0x10b7: 0x1e7e, 0x10b8: 0x1e83, 0x10b9: 0x1e88, 0x10ba: 0x1eec, 0x10bb: 0x1efb, 0x10bc: 0x4408, 0x10bd: 0x4408, // Block 0x43, offset 0x10c0 0x10d0: 0x2311, 0x10d1: 0x2326, 0x10d2: 0x2326, 0x10d3: 0x232d, 0x10d4: 0x2334, 0x10d5: 0x2349, 0x10d6: 0x2350, 0x10d7: 0x2357, 0x10d8: 0x237a, 0x10d9: 0x237a, 0x10da: 0x239d, 0x10db: 0x2396, 0x10dc: 0x23b2, 0x10dd: 0x23a4, 0x10de: 0x23ab, 0x10df: 0x23ce, 0x10e0: 0x23ce, 0x10e1: 0x23c7, 0x10e2: 0x23d5, 0x10e3: 0x23d5, 0x10e4: 0x23ff, 0x10e5: 0x23ff, 0x10e6: 0x241b, 0x10e7: 0x23e3, 0x10e8: 0x23e3, 0x10e9: 0x23dc, 0x10ea: 0x23f1, 0x10eb: 0x23f1, 0x10ec: 0x23f8, 0x10ed: 0x23f8, 0x10ee: 0x2422, 0x10ef: 0x2430, 0x10f0: 0x2430, 0x10f1: 0x2437, 0x10f2: 0x2437, 0x10f3: 0x243e, 0x10f4: 0x2445, 0x10f5: 0x244c, 0x10f6: 0x2453, 0x10f7: 0x2453, 0x10f8: 0x245a, 0x10f9: 0x2468, 0x10fa: 0x2476, 0x10fb: 0x246f, 0x10fc: 0x247d, 0x10fd: 0x247d, 0x10fe: 0x2492, 0x10ff: 0x2499, // Block 0x44, offset 0x1100 0x1100: 0x24ca, 0x1101: 0x24d8, 0x1102: 0x24d1, 0x1103: 0x24b5, 0x1104: 0x24b5, 0x1105: 0x24df, 0x1106: 0x24df, 0x1107: 0x24e6, 0x1108: 0x24e6, 0x1109: 0x2510, 0x110a: 0x2517, 0x110b: 0x251e, 0x110c: 0x24f4, 0x110d: 0x2502, 0x110e: 0x2525, 0x110f: 0x252c, 0x1112: 0x24fb, 0x1113: 0x2580, 0x1114: 0x2587, 0x1115: 0x255d, 0x1116: 0x2564, 0x1117: 0x2548, 0x1118: 0x2548, 0x1119: 0x254f, 0x111a: 0x2579, 0x111b: 0x2572, 0x111c: 0x259c, 0x111d: 0x259c, 0x111e: 0x230a, 0x111f: 0x231f, 0x1120: 0x2318, 0x1121: 0x2342, 0x1122: 0x233b, 0x1123: 0x2365, 0x1124: 0x235e, 0x1125: 0x2388, 0x1126: 0x236c, 0x1127: 0x2381, 0x1128: 0x23b9, 0x1129: 0x2406, 0x112a: 0x23ea, 0x112b: 0x2429, 0x112c: 0x24c3, 0x112d: 0x24ed, 0x112e: 0x2595, 0x112f: 0x258e, 0x1130: 0x25a3, 0x1131: 0x253a, 0x1132: 0x24a0, 0x1133: 0x256b, 0x1134: 0x2492, 0x1135: 0x24ca, 0x1136: 0x2461, 0x1137: 0x24ae, 0x1138: 0x2541, 0x1139: 0x2533, 0x113a: 0x24bc, 0x113b: 0x24a7, 0x113c: 0x24bc, 0x113d: 0x2541, 0x113e: 0x2373, 0x113f: 0x238f, // Block 0x45, offset 0x1140 0x1140: 0x2509, 0x1141: 0x2484, 0x1142: 0x2303, 0x1143: 0x24a7, 0x1144: 0x244c, 0x1145: 0x241b, 0x1146: 0x23c0, 0x1147: 0x2556, 0x1170: 0x2414, 0x1171: 0x248b, 0x1172: 0x27bf, 0x1173: 0x27b6, 0x1174: 0x27ec, 0x1175: 0x27da, 0x1176: 0x27c8, 0x1177: 0x27e3, 0x1178: 0x27f5, 0x1179: 0x240d, 0x117a: 0x2c7c, 0x117b: 0x2afc, 0x117c: 0x27d1, // Block 0x46, offset 0x1180 0x1190: 0x0019, 0x1191: 0x0483, 0x1192: 0x0487, 0x1193: 0x0035, 0x1194: 0x0037, 0x1195: 0x0003, 0x1196: 0x003f, 0x1197: 0x04bf, 0x1198: 0x04c3, 0x1199: 0x1b5c, 0x11a0: 0x8132, 0x11a1: 0x8132, 0x11a2: 0x8132, 0x11a3: 0x8132, 0x11a4: 0x8132, 0x11a5: 0x8132, 0x11a6: 0x8132, 0x11a7: 0x812d, 0x11a8: 0x812d, 0x11a9: 0x812d, 0x11aa: 0x812d, 0x11ab: 0x812d, 0x11ac: 0x812d, 0x11ad: 0x812d, 0x11ae: 0x8132, 0x11af: 0x8132, 0x11b0: 0x1873, 0x11b1: 0x0443, 0x11b2: 0x043f, 0x11b3: 0x007f, 0x11b4: 0x007f, 0x11b5: 0x0011, 0x11b6: 0x0013, 0x11b7: 0x00b7, 0x11b8: 0x00bb, 0x11b9: 0x04b7, 0x11ba: 0x04bb, 0x11bb: 0x04ab, 0x11bc: 0x04af, 0x11bd: 0x0493, 0x11be: 0x0497, 0x11bf: 0x048b, // Block 0x47, offset 0x11c0 0x11c0: 0x048f, 0x11c1: 0x049b, 0x11c2: 0x049f, 0x11c3: 0x04a3, 0x11c4: 0x04a7, 0x11c7: 0x0077, 0x11c8: 0x007b, 0x11c9: 0x4269, 0x11ca: 0x4269, 0x11cb: 0x4269, 0x11cc: 0x4269, 0x11cd: 0x007f, 0x11ce: 0x007f, 0x11cf: 0x007f, 0x11d0: 0x0019, 0x11d1: 0x0483, 0x11d2: 0x001d, 0x11d4: 0x0037, 0x11d5: 0x0035, 0x11d6: 0x003f, 0x11d7: 0x0003, 0x11d8: 0x0443, 0x11d9: 0x0011, 0x11da: 0x0013, 0x11db: 0x00b7, 0x11dc: 0x00bb, 0x11dd: 0x04b7, 0x11de: 0x04bb, 0x11df: 0x0007, 0x11e0: 0x000d, 0x11e1: 0x0015, 0x11e2: 0x0017, 0x11e3: 0x001b, 0x11e4: 0x0039, 0x11e5: 0x003d, 0x11e6: 0x003b, 0x11e8: 0x0079, 0x11e9: 0x0009, 0x11ea: 0x000b, 0x11eb: 0x0041, 0x11f0: 0x42aa, 0x11f1: 0x442c, 0x11f2: 0x42af, 0x11f4: 0x42b4, 0x11f6: 0x42b9, 0x11f7: 0x4432, 0x11f8: 0x42be, 0x11f9: 0x4438, 0x11fa: 0x42c3, 0x11fb: 0x443e, 0x11fc: 0x42c8, 0x11fd: 0x4444, 0x11fe: 0x42cd, 0x11ff: 0x444a, // Block 0x48, offset 0x1200 0x1200: 0x0236, 0x1201: 0x440e, 0x1202: 0x440e, 0x1203: 0x4414, 0x1204: 0x4414, 0x1205: 0x4456, 0x1206: 0x4456, 0x1207: 0x441a, 0x1208: 0x441a, 0x1209: 0x4462, 0x120a: 0x4462, 0x120b: 0x4462, 0x120c: 0x4462, 0x120d: 0x0239, 0x120e: 0x0239, 0x120f: 0x023c, 0x1210: 0x023c, 0x1211: 0x023c, 0x1212: 0x023c, 0x1213: 0x023f, 0x1214: 0x023f, 0x1215: 0x0242, 0x1216: 0x0242, 0x1217: 0x0242, 0x1218: 0x0242, 0x1219: 0x0245, 0x121a: 0x0245, 0x121b: 0x0245, 0x121c: 0x0245, 0x121d: 0x0248, 0x121e: 0x0248, 0x121f: 0x0248, 0x1220: 0x0248, 0x1221: 0x024b, 0x1222: 0x024b, 0x1223: 0x024b, 0x1224: 0x024b, 0x1225: 0x024e, 0x1226: 0x024e, 0x1227: 0x024e, 0x1228: 0x024e, 0x1229: 0x0251, 0x122a: 0x0251, 0x122b: 0x0254, 0x122c: 0x0254, 0x122d: 0x0257, 0x122e: 0x0257, 0x122f: 0x025a, 0x1230: 0x025a, 0x1231: 0x025d, 0x1232: 0x025d, 0x1233: 0x025d, 0x1234: 0x025d, 0x1235: 0x0260, 0x1236: 0x0260, 0x1237: 0x0260, 0x1238: 0x0260, 0x1239: 0x0263, 0x123a: 0x0263, 0x123b: 0x0263, 0x123c: 0x0263, 0x123d: 0x0266, 0x123e: 0x0266, 0x123f: 0x0266, // Block 0x49, offset 0x1240 0x1240: 0x0266, 0x1241: 0x0269, 0x1242: 0x0269, 0x1243: 0x0269, 0x1244: 0x0269, 0x1245: 0x026c, 0x1246: 0x026c, 0x1247: 0x026c, 0x1248: 0x026c, 0x1249: 0x026f, 0x124a: 0x026f, 0x124b: 0x026f, 0x124c: 0x026f, 0x124d: 0x0272, 0x124e: 0x0272, 0x124f: 0x0272, 0x1250: 0x0272, 0x1251: 0x0275, 0x1252: 0x0275, 0x1253: 0x0275, 0x1254: 0x0275, 0x1255: 0x0278, 0x1256: 0x0278, 0x1257: 0x0278, 0x1258: 0x0278, 0x1259: 0x027b, 0x125a: 0x027b, 0x125b: 0x027b, 0x125c: 0x027b, 0x125d: 0x027e, 0x125e: 0x027e, 0x125f: 0x027e, 0x1260: 0x027e, 0x1261: 0x0281, 0x1262: 0x0281, 0x1263: 0x0281, 0x1264: 0x0281, 0x1265: 0x0284, 0x1266: 0x0284, 0x1267: 0x0284, 0x1268: 0x0284, 0x1269: 0x0287, 0x126a: 0x0287, 0x126b: 0x0287, 0x126c: 0x0287, 0x126d: 0x028a, 0x126e: 0x028a, 0x126f: 0x028d, 0x1270: 0x028d, 0x1271: 0x0290, 0x1272: 0x0290, 0x1273: 0x0290, 0x1274: 0x0290, 0x1275: 0x2e00, 0x1276: 0x2e00, 0x1277: 0x2e08, 0x1278: 0x2e08, 0x1279: 0x2e10, 0x127a: 0x2e10, 0x127b: 0x1f82, 0x127c: 0x1f82, // Block 0x4a, offset 0x1280 0x1280: 0x0081, 0x1281: 0x0083, 0x1282: 0x0085, 0x1283: 0x0087, 0x1284: 0x0089, 0x1285: 0x008b, 0x1286: 0x008d, 0x1287: 0x008f, 0x1288: 0x0091, 0x1289: 0x0093, 0x128a: 0x0095, 0x128b: 0x0097, 0x128c: 0x0099, 0x128d: 0x009b, 0x128e: 0x009d, 0x128f: 0x009f, 0x1290: 0x00a1, 0x1291: 0x00a3, 0x1292: 0x00a5, 0x1293: 0x00a7, 0x1294: 0x00a9, 0x1295: 0x00ab, 0x1296: 0x00ad, 0x1297: 0x00af, 0x1298: 0x00b1, 0x1299: 0x00b3, 0x129a: 0x00b5, 0x129b: 0x00b7, 0x129c: 0x00b9, 0x129d: 0x00bb, 0x129e: 0x00bd, 0x129f: 0x0477, 0x12a0: 0x047b, 0x12a1: 0x0487, 0x12a2: 0x049b, 0x12a3: 0x049f, 0x12a4: 0x0483, 0x12a5: 0x05ab, 0x12a6: 0x05a3, 0x12a7: 0x04c7, 0x12a8: 0x04cf, 0x12a9: 0x04d7, 0x12aa: 0x04df, 0x12ab: 0x04e7, 0x12ac: 0x056b, 0x12ad: 0x0573, 0x12ae: 0x057b, 0x12af: 0x051f, 0x12b0: 0x05af, 0x12b1: 0x04cb, 0x12b2: 0x04d3, 0x12b3: 0x04db, 0x12b4: 0x04e3, 0x12b5: 0x04eb, 0x12b6: 0x04ef, 0x12b7: 0x04f3, 0x12b8: 0x04f7, 0x12b9: 0x04fb, 0x12ba: 0x04ff, 0x12bb: 0x0503, 0x12bc: 0x0507, 0x12bd: 0x050b, 0x12be: 0x050f, 0x12bf: 0x0513, // Block 0x4b, offset 0x12c0 0x12c0: 0x0517, 0x12c1: 0x051b, 0x12c2: 0x0523, 0x12c3: 0x0527, 0x12c4: 0x052b, 0x12c5: 0x052f, 0x12c6: 0x0533, 0x12c7: 0x0537, 0x12c8: 0x053b, 0x12c9: 0x053f, 0x12ca: 0x0543, 0x12cb: 0x0547, 0x12cc: 0x054b, 0x12cd: 0x054f, 0x12ce: 0x0553, 0x12cf: 0x0557, 0x12d0: 0x055b, 0x12d1: 0x055f, 0x12d2: 0x0563, 0x12d3: 0x0567, 0x12d4: 0x056f, 0x12d5: 0x0577, 0x12d6: 0x057f, 0x12d7: 0x0583, 0x12d8: 0x0587, 0x12d9: 0x058b, 0x12da: 0x058f, 0x12db: 0x0593, 0x12dc: 0x0597, 0x12dd: 0x05a7, 0x12de: 0x4a78, 0x12df: 0x4a7e, 0x12e0: 0x03c3, 0x12e1: 0x0313, 0x12e2: 0x0317, 0x12e3: 0x4a3b, 0x12e4: 0x031b, 0x12e5: 0x4a41, 0x12e6: 0x4a47, 0x12e7: 0x031f, 0x12e8: 0x0323, 0x12e9: 0x0327, 0x12ea: 0x4a4d, 0x12eb: 0x4a53, 0x12ec: 0x4a59, 0x12ed: 0x4a5f, 0x12ee: 0x4a65, 0x12ef: 0x4a6b, 0x12f0: 0x0367, 0x12f1: 0x032b, 0x12f2: 0x032f, 0x12f3: 0x0333, 0x12f4: 0x037b, 0x12f5: 0x0337, 0x12f6: 0x033b, 0x12f7: 0x033f, 0x12f8: 0x0343, 0x12f9: 0x0347, 0x12fa: 0x034b, 0x12fb: 0x034f, 0x12fc: 0x0353, 0x12fd: 0x0357, 0x12fe: 0x035b, // Block 0x4c, offset 0x1300 0x1302: 0x49bd, 0x1303: 0x49c3, 0x1304: 0x49c9, 0x1305: 0x49cf, 0x1306: 0x49d5, 0x1307: 0x49db, 0x130a: 0x49e1, 0x130b: 0x49e7, 0x130c: 0x49ed, 0x130d: 0x49f3, 0x130e: 0x49f9, 0x130f: 0x49ff, 0x1312: 0x4a05, 0x1313: 0x4a0b, 0x1314: 0x4a11, 0x1315: 0x4a17, 0x1316: 0x4a1d, 0x1317: 0x4a23, 0x131a: 0x4a29, 0x131b: 0x4a2f, 0x131c: 0x4a35, 0x1320: 0x00bf, 0x1321: 0x00c2, 0x1322: 0x00cb, 0x1323: 0x4264, 0x1324: 0x00c8, 0x1325: 0x00c5, 0x1326: 0x0447, 0x1328: 0x046b, 0x1329: 0x044b, 0x132a: 0x044f, 0x132b: 0x0453, 0x132c: 0x0457, 0x132d: 0x046f, 0x132e: 0x0473, // Block 0x4d, offset 0x1340 0x1340: 0x0063, 0x1341: 0x0065, 0x1342: 0x0067, 0x1343: 0x0069, 0x1344: 0x006b, 0x1345: 0x006d, 0x1346: 0x006f, 0x1347: 0x0071, 0x1348: 0x0073, 0x1349: 0x0075, 0x134a: 0x0083, 0x134b: 0x0085, 0x134c: 0x0087, 0x134d: 0x0089, 0x134e: 0x008b, 0x134f: 0x008d, 0x1350: 0x008f, 0x1351: 0x0091, 0x1352: 0x0093, 0x1353: 0x0095, 0x1354: 0x0097, 0x1355: 0x0099, 0x1356: 0x009b, 0x1357: 0x009d, 0x1358: 0x009f, 0x1359: 0x00a1, 0x135a: 0x00a3, 0x135b: 0x00a5, 0x135c: 0x00a7, 0x135d: 0x00a9, 0x135e: 0x00ab, 0x135f: 0x00ad, 0x1360: 0x00af, 0x1361: 0x00b1, 0x1362: 0x00b3, 0x1363: 0x00b5, 0x1364: 0x00dd, 0x1365: 0x00f2, 0x1368: 0x0173, 0x1369: 0x0176, 0x136a: 0x0179, 0x136b: 0x017c, 0x136c: 0x017f, 0x136d: 0x0182, 0x136e: 0x0185, 0x136f: 0x0188, 0x1370: 0x018b, 0x1371: 0x018e, 0x1372: 0x0191, 0x1373: 0x0194, 0x1374: 0x0197, 0x1375: 0x019a, 0x1376: 0x019d, 0x1377: 0x01a0, 0x1378: 0x01a3, 0x1379: 0x0188, 0x137a: 0x01a6, 0x137b: 0x01a9, 0x137c: 0x01ac, 0x137d: 0x01af, 0x137e: 0x01b2, 0x137f: 0x01b5, // Block 0x4e, offset 0x1380 0x1380: 0x01fd, 0x1381: 0x0200, 0x1382: 0x0203, 0x1383: 0x045b, 0x1384: 0x01c7, 0x1385: 0x01d0, 0x1386: 0x01d6, 0x1387: 0x01fa, 0x1388: 0x01eb, 0x1389: 0x01e8, 0x138a: 0x0206, 0x138b: 0x0209, 0x138e: 0x0021, 0x138f: 0x0023, 0x1390: 0x0025, 0x1391: 0x0027, 0x1392: 0x0029, 0x1393: 0x002b, 0x1394: 0x002d, 0x1395: 0x002f, 0x1396: 0x0031, 0x1397: 0x0033, 0x1398: 0x0021, 0x1399: 0x0023, 0x139a: 0x0025, 0x139b: 0x0027, 0x139c: 0x0029, 0x139d: 0x002b, 0x139e: 0x002d, 0x139f: 0x002f, 0x13a0: 0x0031, 0x13a1: 0x0033, 0x13a2: 0x0021, 0x13a3: 0x0023, 0x13a4: 0x0025, 0x13a5: 0x0027, 0x13a6: 0x0029, 0x13a7: 0x002b, 0x13a8: 0x002d, 0x13a9: 0x002f, 0x13aa: 0x0031, 0x13ab: 0x0033, 0x13ac: 0x0021, 0x13ad: 0x0023, 0x13ae: 0x0025, 0x13af: 0x0027, 0x13b0: 0x0029, 0x13b1: 0x002b, 0x13b2: 0x002d, 0x13b3: 0x002f, 0x13b4: 0x0031, 0x13b5: 0x0033, 0x13b6: 0x0021, 0x13b7: 0x0023, 0x13b8: 0x0025, 0x13b9: 0x0027, 0x13ba: 0x0029, 0x13bb: 0x002b, 0x13bc: 0x002d, 0x13bd: 0x002f, 0x13be: 0x0031, 0x13bf: 0x0033, // Block 0x4f, offset 0x13c0 0x13c0: 0x0239, 0x13c1: 0x023c, 0x13c2: 0x0248, 0x13c3: 0x0251, 0x13c5: 0x028a, 0x13c6: 0x025a, 0x13c7: 0x024b, 0x13c8: 0x0269, 0x13c9: 0x0290, 0x13ca: 0x027b, 0x13cb: 0x027e, 0x13cc: 0x0281, 0x13cd: 0x0284, 0x13ce: 0x025d, 0x13cf: 0x026f, 0x13d0: 0x0275, 0x13d1: 0x0263, 0x13d2: 0x0278, 0x13d3: 0x0257, 0x13d4: 0x0260, 0x13d5: 0x0242, 0x13d6: 0x0245, 0x13d7: 0x024e, 0x13d8: 0x0254, 0x13d9: 0x0266, 0x13da: 0x026c, 0x13db: 0x0272, 0x13dc: 0x0293, 0x13dd: 0x02e4, 0x13de: 0x02cc, 0x13df: 0x0296, 0x13e1: 0x023c, 0x13e2: 0x0248, 0x13e4: 0x0287, 0x13e7: 0x024b, 0x13e9: 0x0290, 0x13ea: 0x027b, 0x13eb: 0x027e, 0x13ec: 0x0281, 0x13ed: 0x0284, 0x13ee: 0x025d, 0x13ef: 0x026f, 0x13f0: 0x0275, 0x13f1: 0x0263, 0x13f2: 0x0278, 0x13f4: 0x0260, 0x13f5: 0x0242, 0x13f6: 0x0245, 0x13f7: 0x024e, 0x13f9: 0x0266, 0x13fb: 0x0272, // Block 0x50, offset 0x1400 0x1402: 0x0248, 0x1407: 0x024b, 0x1409: 0x0290, 0x140b: 0x027e, 0x140d: 0x0284, 0x140e: 0x025d, 0x140f: 0x026f, 0x1411: 0x0263, 0x1412: 0x0278, 0x1414: 0x0260, 0x1417: 0x024e, 0x1419: 0x0266, 0x141b: 0x0272, 0x141d: 0x02e4, 0x141f: 0x0296, 0x1421: 0x023c, 0x1422: 0x0248, 0x1424: 0x0287, 0x1427: 0x024b, 0x1428: 0x0269, 0x1429: 0x0290, 0x142a: 0x027b, 0x142c: 0x0281, 0x142d: 0x0284, 0x142e: 0x025d, 0x142f: 0x026f, 0x1430: 0x0275, 0x1431: 0x0263, 0x1432: 0x0278, 0x1434: 0x0260, 0x1435: 0x0242, 0x1436: 0x0245, 0x1437: 0x024e, 0x1439: 0x0266, 0x143a: 0x026c, 0x143b: 0x0272, 0x143c: 0x0293, 0x143e: 0x02cc, // Block 0x51, offset 0x1440 0x1440: 0x0239, 0x1441: 0x023c, 0x1442: 0x0248, 0x1443: 0x0251, 0x1444: 0x0287, 0x1445: 0x028a, 0x1446: 0x025a, 0x1447: 0x024b, 0x1448: 0x0269, 0x1449: 0x0290, 0x144b: 0x027e, 0x144c: 0x0281, 0x144d: 0x0284, 0x144e: 0x025d, 0x144f: 0x026f, 0x1450: 0x0275, 0x1451: 0x0263, 0x1452: 0x0278, 0x1453: 0x0257, 0x1454: 0x0260, 0x1455: 0x0242, 0x1456: 0x0245, 0x1457: 0x024e, 0x1458: 0x0254, 0x1459: 0x0266, 0x145a: 0x026c, 0x145b: 0x0272, 0x1461: 0x023c, 0x1462: 0x0248, 0x1463: 0x0251, 0x1465: 0x028a, 0x1466: 0x025a, 0x1467: 0x024b, 0x1468: 0x0269, 0x1469: 0x0290, 0x146b: 0x027e, 0x146c: 0x0281, 0x146d: 0x0284, 0x146e: 0x025d, 0x146f: 0x026f, 0x1470: 0x0275, 0x1471: 0x0263, 0x1472: 0x0278, 0x1473: 0x0257, 0x1474: 0x0260, 0x1475: 0x0242, 0x1476: 0x0245, 0x1477: 0x024e, 0x1478: 0x0254, 0x1479: 0x0266, 0x147a: 0x026c, 0x147b: 0x0272, // Block 0x52, offset 0x1480 0x1480: 0x1879, 0x1481: 0x1876, 0x1482: 0x187c, 0x1483: 0x18a0, 0x1484: 0x18c4, 0x1485: 0x18e8, 0x1486: 0x190c, 0x1487: 0x1915, 0x1488: 0x191b, 0x1489: 0x1921, 0x148a: 0x1927, 0x1490: 0x1a8c, 0x1491: 0x1a90, 0x1492: 0x1a94, 0x1493: 0x1a98, 0x1494: 0x1a9c, 0x1495: 0x1aa0, 0x1496: 0x1aa4, 0x1497: 0x1aa8, 0x1498: 0x1aac, 0x1499: 0x1ab0, 0x149a: 0x1ab4, 0x149b: 0x1ab8, 0x149c: 0x1abc, 0x149d: 0x1ac0, 0x149e: 0x1ac4, 0x149f: 0x1ac8, 0x14a0: 0x1acc, 0x14a1: 0x1ad0, 0x14a2: 0x1ad4, 0x14a3: 0x1ad8, 0x14a4: 0x1adc, 0x14a5: 0x1ae0, 0x14a6: 0x1ae4, 0x14a7: 0x1ae8, 0x14a8: 0x1aec, 0x14a9: 0x1af0, 0x14aa: 0x271e, 0x14ab: 0x0047, 0x14ac: 0x0065, 0x14ad: 0x193c, 0x14ae: 0x19b1, 0x14b0: 0x0043, 0x14b1: 0x0045, 0x14b2: 0x0047, 0x14b3: 0x0049, 0x14b4: 0x004b, 0x14b5: 0x004d, 0x14b6: 0x004f, 0x14b7: 0x0051, 0x14b8: 0x0053, 0x14b9: 0x0055, 0x14ba: 0x0057, 0x14bb: 0x0059, 0x14bc: 0x005b, 0x14bd: 0x005d, 0x14be: 0x005f, 0x14bf: 0x0061, // Block 0x53, offset 0x14c0 0x14c0: 0x26ad, 0x14c1: 0x26c2, 0x14c2: 0x0503, 0x14d0: 0x0c0f, 0x14d1: 0x0a47, 0x14d2: 0x08d3, 0x14d3: 0x45c4, 0x14d4: 0x071b, 0x14d5: 0x09ef, 0x14d6: 0x132f, 0x14d7: 0x09ff, 0x14d8: 0x0727, 0x14d9: 0x0cd7, 0x14da: 0x0eaf, 0x14db: 0x0caf, 0x14dc: 0x0827, 0x14dd: 0x0b6b, 0x14de: 0x07bf, 0x14df: 0x0cb7, 0x14e0: 0x0813, 0x14e1: 0x1117, 0x14e2: 0x0f83, 0x14e3: 0x138b, 0x14e4: 0x09d3, 0x14e5: 0x090b, 0x14e6: 0x0e63, 0x14e7: 0x0c1b, 0x14e8: 0x0c47, 0x14e9: 0x06bf, 0x14ea: 0x06cb, 0x14eb: 0x140b, 0x14ec: 0x0adb, 0x14ed: 0x06e7, 0x14ee: 0x08ef, 0x14ef: 0x0c3b, 0x14f0: 0x13b3, 0x14f1: 0x0c13, 0x14f2: 0x106f, 0x14f3: 0x10ab, 0x14f4: 0x08f7, 0x14f5: 0x0e43, 0x14f6: 0x0d0b, 0x14f7: 0x0d07, 0x14f8: 0x0f97, 0x14f9: 0x082b, 0x14fa: 0x0957, 0x14fb: 0x1443, // Block 0x54, offset 0x1500 0x1500: 0x06fb, 0x1501: 0x06f3, 0x1502: 0x0703, 0x1503: 0x1647, 0x1504: 0x0747, 0x1505: 0x0757, 0x1506: 0x075b, 0x1507: 0x0763, 0x1508: 0x076b, 0x1509: 0x076f, 0x150a: 0x077b, 0x150b: 0x0773, 0x150c: 0x05b3, 0x150d: 0x165b, 0x150e: 0x078f, 0x150f: 0x0793, 0x1510: 0x0797, 0x1511: 0x07b3, 0x1512: 0x164c, 0x1513: 0x05b7, 0x1514: 0x079f, 0x1515: 0x07bf, 0x1516: 0x1656, 0x1517: 0x07cf, 0x1518: 0x07d7, 0x1519: 0x0737, 0x151a: 0x07df, 0x151b: 0x07e3, 0x151c: 0x1831, 0x151d: 0x07ff, 0x151e: 0x0807, 0x151f: 0x05bf, 0x1520: 0x081f, 0x1521: 0x0823, 0x1522: 0x082b, 0x1523: 0x082f, 0x1524: 0x05c3, 0x1525: 0x0847, 0x1526: 0x084b, 0x1527: 0x0857, 0x1528: 0x0863, 0x1529: 0x0867, 0x152a: 0x086b, 0x152b: 0x0873, 0x152c: 0x0893, 0x152d: 0x0897, 0x152e: 0x089f, 0x152f: 0x08af, 0x1530: 0x08b7, 0x1531: 0x08bb, 0x1532: 0x08bb, 0x1533: 0x08bb, 0x1534: 0x166a, 0x1535: 0x0e93, 0x1536: 0x08cf, 0x1537: 0x08d7, 0x1538: 0x166f, 0x1539: 0x08e3, 0x153a: 0x08eb, 0x153b: 0x08f3, 0x153c: 0x091b, 0x153d: 0x0907, 0x153e: 0x0913, 0x153f: 0x0917, // Block 0x55, offset 0x1540 0x1540: 0x091f, 0x1541: 0x0927, 0x1542: 0x092b, 0x1543: 0x0933, 0x1544: 0x093b, 0x1545: 0x093f, 0x1546: 0x093f, 0x1547: 0x0947, 0x1548: 0x094f, 0x1549: 0x0953, 0x154a: 0x095f, 0x154b: 0x0983, 0x154c: 0x0967, 0x154d: 0x0987, 0x154e: 0x096b, 0x154f: 0x0973, 0x1550: 0x080b, 0x1551: 0x09cf, 0x1552: 0x0997, 0x1553: 0x099b, 0x1554: 0x099f, 0x1555: 0x0993, 0x1556: 0x09a7, 0x1557: 0x09a3, 0x1558: 0x09bb, 0x1559: 0x1674, 0x155a: 0x09d7, 0x155b: 0x09db, 0x155c: 0x09e3, 0x155d: 0x09ef, 0x155e: 0x09f7, 0x155f: 0x0a13, 0x1560: 0x1679, 0x1561: 0x167e, 0x1562: 0x0a1f, 0x1563: 0x0a23, 0x1564: 0x0a27, 0x1565: 0x0a1b, 0x1566: 0x0a2f, 0x1567: 0x05c7, 0x1568: 0x05cb, 0x1569: 0x0a37, 0x156a: 0x0a3f, 0x156b: 0x0a3f, 0x156c: 0x1683, 0x156d: 0x0a5b, 0x156e: 0x0a5f, 0x156f: 0x0a63, 0x1570: 0x0a6b, 0x1571: 0x1688, 0x1572: 0x0a73, 0x1573: 0x0a77, 0x1574: 0x0b4f, 0x1575: 0x0a7f, 0x1576: 0x05cf, 0x1577: 0x0a8b, 0x1578: 0x0a9b, 0x1579: 0x0aa7, 0x157a: 0x0aa3, 0x157b: 0x1692, 0x157c: 0x0aaf, 0x157d: 0x1697, 0x157e: 0x0abb, 0x157f: 0x0ab7, // Block 0x56, offset 0x1580 0x1580: 0x0abf, 0x1581: 0x0acf, 0x1582: 0x0ad3, 0x1583: 0x05d3, 0x1584: 0x0ae3, 0x1585: 0x0aeb, 0x1586: 0x0aef, 0x1587: 0x0af3, 0x1588: 0x05d7, 0x1589: 0x169c, 0x158a: 0x05db, 0x158b: 0x0b0f, 0x158c: 0x0b13, 0x158d: 0x0b17, 0x158e: 0x0b1f, 0x158f: 0x1863, 0x1590: 0x0b37, 0x1591: 0x16a6, 0x1592: 0x16a6, 0x1593: 0x11d7, 0x1594: 0x0b47, 0x1595: 0x0b47, 0x1596: 0x05df, 0x1597: 0x16c9, 0x1598: 0x179b, 0x1599: 0x0b57, 0x159a: 0x0b5f, 0x159b: 0x05e3, 0x159c: 0x0b73, 0x159d: 0x0b83, 0x159e: 0x0b87, 0x159f: 0x0b8f, 0x15a0: 0x0b9f, 0x15a1: 0x05eb, 0x15a2: 0x05e7, 0x15a3: 0x0ba3, 0x15a4: 0x16ab, 0x15a5: 0x0ba7, 0x15a6: 0x0bbb, 0x15a7: 0x0bbf, 0x15a8: 0x0bc3, 0x15a9: 0x0bbf, 0x15aa: 0x0bcf, 0x15ab: 0x0bd3, 0x15ac: 0x0be3, 0x15ad: 0x0bdb, 0x15ae: 0x0bdf, 0x15af: 0x0be7, 0x15b0: 0x0beb, 0x15b1: 0x0bef, 0x15b2: 0x0bfb, 0x15b3: 0x0bff, 0x15b4: 0x0c17, 0x15b5: 0x0c1f, 0x15b6: 0x0c2f, 0x15b7: 0x0c43, 0x15b8: 0x16ba, 0x15b9: 0x0c3f, 0x15ba: 0x0c33, 0x15bb: 0x0c4b, 0x15bc: 0x0c53, 0x15bd: 0x0c67, 0x15be: 0x16bf, 0x15bf: 0x0c6f, // Block 0x57, offset 0x15c0 0x15c0: 0x0c63, 0x15c1: 0x0c5b, 0x15c2: 0x05ef, 0x15c3: 0x0c77, 0x15c4: 0x0c7f, 0x15c5: 0x0c87, 0x15c6: 0x0c7b, 0x15c7: 0x05f3, 0x15c8: 0x0c97, 0x15c9: 0x0c9f, 0x15ca: 0x16c4, 0x15cb: 0x0ccb, 0x15cc: 0x0cff, 0x15cd: 0x0cdb, 0x15ce: 0x05ff, 0x15cf: 0x0ce7, 0x15d0: 0x05fb, 0x15d1: 0x05f7, 0x15d2: 0x07c3, 0x15d3: 0x07c7, 0x15d4: 0x0d03, 0x15d5: 0x0ceb, 0x15d6: 0x11ab, 0x15d7: 0x0663, 0x15d8: 0x0d0f, 0x15d9: 0x0d13, 0x15da: 0x0d17, 0x15db: 0x0d2b, 0x15dc: 0x0d23, 0x15dd: 0x16dd, 0x15de: 0x0603, 0x15df: 0x0d3f, 0x15e0: 0x0d33, 0x15e1: 0x0d4f, 0x15e2: 0x0d57, 0x15e3: 0x16e7, 0x15e4: 0x0d5b, 0x15e5: 0x0d47, 0x15e6: 0x0d63, 0x15e7: 0x0607, 0x15e8: 0x0d67, 0x15e9: 0x0d6b, 0x15ea: 0x0d6f, 0x15eb: 0x0d7b, 0x15ec: 0x16ec, 0x15ed: 0x0d83, 0x15ee: 0x060b, 0x15ef: 0x0d8f, 0x15f0: 0x16f1, 0x15f1: 0x0d93, 0x15f2: 0x060f, 0x15f3: 0x0d9f, 0x15f4: 0x0dab, 0x15f5: 0x0db7, 0x15f6: 0x0dbb, 0x15f7: 0x16f6, 0x15f8: 0x168d, 0x15f9: 0x16fb, 0x15fa: 0x0ddb, 0x15fb: 0x1700, 0x15fc: 0x0de7, 0x15fd: 0x0def, 0x15fe: 0x0ddf, 0x15ff: 0x0dfb, // Block 0x58, offset 0x1600 0x1600: 0x0e0b, 0x1601: 0x0e1b, 0x1602: 0x0e0f, 0x1603: 0x0e13, 0x1604: 0x0e1f, 0x1605: 0x0e23, 0x1606: 0x1705, 0x1607: 0x0e07, 0x1608: 0x0e3b, 0x1609: 0x0e3f, 0x160a: 0x0613, 0x160b: 0x0e53, 0x160c: 0x0e4f, 0x160d: 0x170a, 0x160e: 0x0e33, 0x160f: 0x0e6f, 0x1610: 0x170f, 0x1611: 0x1714, 0x1612: 0x0e73, 0x1613: 0x0e87, 0x1614: 0x0e83, 0x1615: 0x0e7f, 0x1616: 0x0617, 0x1617: 0x0e8b, 0x1618: 0x0e9b, 0x1619: 0x0e97, 0x161a: 0x0ea3, 0x161b: 0x1651, 0x161c: 0x0eb3, 0x161d: 0x1719, 0x161e: 0x0ebf, 0x161f: 0x1723, 0x1620: 0x0ed3, 0x1621: 0x0edf, 0x1622: 0x0ef3, 0x1623: 0x1728, 0x1624: 0x0f07, 0x1625: 0x0f0b, 0x1626: 0x172d, 0x1627: 0x1732, 0x1628: 0x0f27, 0x1629: 0x0f37, 0x162a: 0x061b, 0x162b: 0x0f3b, 0x162c: 0x061f, 0x162d: 0x061f, 0x162e: 0x0f53, 0x162f: 0x0f57, 0x1630: 0x0f5f, 0x1631: 0x0f63, 0x1632: 0x0f6f, 0x1633: 0x0623, 0x1634: 0x0f87, 0x1635: 0x1737, 0x1636: 0x0fa3, 0x1637: 0x173c, 0x1638: 0x0faf, 0x1639: 0x16a1, 0x163a: 0x0fbf, 0x163b: 0x1741, 0x163c: 0x1746, 0x163d: 0x174b, 0x163e: 0x0627, 0x163f: 0x062b, // Block 0x59, offset 0x1640 0x1640: 0x0ff7, 0x1641: 0x1755, 0x1642: 0x1750, 0x1643: 0x175a, 0x1644: 0x175f, 0x1645: 0x0fff, 0x1646: 0x1003, 0x1647: 0x1003, 0x1648: 0x100b, 0x1649: 0x0633, 0x164a: 0x100f, 0x164b: 0x0637, 0x164c: 0x063b, 0x164d: 0x1769, 0x164e: 0x1023, 0x164f: 0x102b, 0x1650: 0x1037, 0x1651: 0x063f, 0x1652: 0x176e, 0x1653: 0x105b, 0x1654: 0x1773, 0x1655: 0x1778, 0x1656: 0x107b, 0x1657: 0x1093, 0x1658: 0x0643, 0x1659: 0x109b, 0x165a: 0x109f, 0x165b: 0x10a3, 0x165c: 0x177d, 0x165d: 0x1782, 0x165e: 0x1782, 0x165f: 0x10bb, 0x1660: 0x0647, 0x1661: 0x1787, 0x1662: 0x10cf, 0x1663: 0x10d3, 0x1664: 0x064b, 0x1665: 0x178c, 0x1666: 0x10ef, 0x1667: 0x064f, 0x1668: 0x10ff, 0x1669: 0x10f7, 0x166a: 0x1107, 0x166b: 0x1796, 0x166c: 0x111f, 0x166d: 0x0653, 0x166e: 0x112b, 0x166f: 0x1133, 0x1670: 0x1143, 0x1671: 0x0657, 0x1672: 0x17a0, 0x1673: 0x17a5, 0x1674: 0x065b, 0x1675: 0x17aa, 0x1676: 0x115b, 0x1677: 0x17af, 0x1678: 0x1167, 0x1679: 0x1173, 0x167a: 0x117b, 0x167b: 0x17b4, 0x167c: 0x17b9, 0x167d: 0x118f, 0x167e: 0x17be, 0x167f: 0x1197, // Block 0x5a, offset 0x1680 0x1680: 0x16ce, 0x1681: 0x065f, 0x1682: 0x11af, 0x1683: 0x11b3, 0x1684: 0x0667, 0x1685: 0x11b7, 0x1686: 0x0a33, 0x1687: 0x17c3, 0x1688: 0x17c8, 0x1689: 0x16d3, 0x168a: 0x16d8, 0x168b: 0x11d7, 0x168c: 0x11db, 0x168d: 0x13f3, 0x168e: 0x066b, 0x168f: 0x1207, 0x1690: 0x1203, 0x1691: 0x120b, 0x1692: 0x083f, 0x1693: 0x120f, 0x1694: 0x1213, 0x1695: 0x1217, 0x1696: 0x121f, 0x1697: 0x17cd, 0x1698: 0x121b, 0x1699: 0x1223, 0x169a: 0x1237, 0x169b: 0x123b, 0x169c: 0x1227, 0x169d: 0x123f, 0x169e: 0x1253, 0x169f: 0x1267, 0x16a0: 0x1233, 0x16a1: 0x1247, 0x16a2: 0x124b, 0x16a3: 0x124f, 0x16a4: 0x17d2, 0x16a5: 0x17dc, 0x16a6: 0x17d7, 0x16a7: 0x066f, 0x16a8: 0x126f, 0x16a9: 0x1273, 0x16aa: 0x127b, 0x16ab: 0x17f0, 0x16ac: 0x127f, 0x16ad: 0x17e1, 0x16ae: 0x0673, 0x16af: 0x0677, 0x16b0: 0x17e6, 0x16b1: 0x17eb, 0x16b2: 0x067b, 0x16b3: 0x129f, 0x16b4: 0x12a3, 0x16b5: 0x12a7, 0x16b6: 0x12ab, 0x16b7: 0x12b7, 0x16b8: 0x12b3, 0x16b9: 0x12bf, 0x16ba: 0x12bb, 0x16bb: 0x12cb, 0x16bc: 0x12c3, 0x16bd: 0x12c7, 0x16be: 0x12cf, 0x16bf: 0x067f, // Block 0x5b, offset 0x16c0 0x16c0: 0x12d7, 0x16c1: 0x12db, 0x16c2: 0x0683, 0x16c3: 0x12eb, 0x16c4: 0x12ef, 0x16c5: 0x17f5, 0x16c6: 0x12fb, 0x16c7: 0x12ff, 0x16c8: 0x0687, 0x16c9: 0x130b, 0x16ca: 0x05bb, 0x16cb: 0x17fa, 0x16cc: 0x17ff, 0x16cd: 0x068b, 0x16ce: 0x068f, 0x16cf: 0x1337, 0x16d0: 0x134f, 0x16d1: 0x136b, 0x16d2: 0x137b, 0x16d3: 0x1804, 0x16d4: 0x138f, 0x16d5: 0x1393, 0x16d6: 0x13ab, 0x16d7: 0x13b7, 0x16d8: 0x180e, 0x16d9: 0x1660, 0x16da: 0x13c3, 0x16db: 0x13bf, 0x16dc: 0x13cb, 0x16dd: 0x1665, 0x16de: 0x13d7, 0x16df: 0x13e3, 0x16e0: 0x1813, 0x16e1: 0x1818, 0x16e2: 0x1423, 0x16e3: 0x142f, 0x16e4: 0x1437, 0x16e5: 0x181d, 0x16e6: 0x143b, 0x16e7: 0x1467, 0x16e8: 0x1473, 0x16e9: 0x1477, 0x16ea: 0x146f, 0x16eb: 0x1483, 0x16ec: 0x1487, 0x16ed: 0x1822, 0x16ee: 0x1493, 0x16ef: 0x0693, 0x16f0: 0x149b, 0x16f1: 0x1827, 0x16f2: 0x0697, 0x16f3: 0x14d3, 0x16f4: 0x0ac3, 0x16f5: 0x14eb, 0x16f6: 0x182c, 0x16f7: 0x1836, 0x16f8: 0x069b, 0x16f9: 0x069f, 0x16fa: 0x1513, 0x16fb: 0x183b, 0x16fc: 0x06a3, 0x16fd: 0x1840, 0x16fe: 0x152b, 0x16ff: 0x152b, // Block 0x5c, offset 0x1700 0x1700: 0x1533, 0x1701: 0x1845, 0x1702: 0x154b, 0x1703: 0x06a7, 0x1704: 0x155b, 0x1705: 0x1567, 0x1706: 0x156f, 0x1707: 0x1577, 0x1708: 0x06ab, 0x1709: 0x184a, 0x170a: 0x158b, 0x170b: 0x15a7, 0x170c: 0x15b3, 0x170d: 0x06af, 0x170e: 0x06b3, 0x170f: 0x15b7, 0x1710: 0x184f, 0x1711: 0x06b7, 0x1712: 0x1854, 0x1713: 0x1859, 0x1714: 0x185e, 0x1715: 0x15db, 0x1716: 0x06bb, 0x1717: 0x15ef, 0x1718: 0x15f7, 0x1719: 0x15fb, 0x171a: 0x1603, 0x171b: 0x160b, 0x171c: 0x1613, 0x171d: 0x1868, } // nfkcIndex: 22 blocks, 1408 entries, 1408 bytes // Block 0 is the zero block. var nfkcIndex = [1408]uint8{ // Block 0x0, offset 0x0 // Block 0x1, offset 0x40 // Block 0x2, offset 0x80 // Block 0x3, offset 0xc0 0xc2: 0x5b, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x5c, 0xc7: 0x04, 0xc8: 0x05, 0xca: 0x5d, 0xcb: 0x5e, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x09, 0xd0: 0x0a, 0xd1: 0x5f, 0xd2: 0x60, 0xd3: 0x0b, 0xd6: 0x0c, 0xd7: 0x61, 0xd8: 0x62, 0xd9: 0x0d, 0xdb: 0x63, 0xdc: 0x64, 0xdd: 0x65, 0xdf: 0x66, 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a, 0xf0: 0x13, // Block 0x4, offset 0x100 0x120: 0x67, 0x121: 0x68, 0x123: 0x69, 0x124: 0x6a, 0x125: 0x6b, 0x126: 0x6c, 0x127: 0x6d, 0x128: 0x6e, 0x129: 0x6f, 0x12a: 0x70, 0x12b: 0x71, 0x12c: 0x6c, 0x12d: 0x72, 0x12e: 0x73, 0x12f: 0x74, 0x131: 0x75, 0x132: 0x76, 0x133: 0x77, 0x134: 0x78, 0x135: 0x79, 0x137: 0x7a, 0x138: 0x7b, 0x139: 0x7c, 0x13a: 0x7d, 0x13b: 0x7e, 0x13c: 0x7f, 0x13d: 0x80, 0x13e: 0x81, 0x13f: 0x82, // Block 0x5, offset 0x140 0x140: 0x83, 0x142: 0x84, 0x143: 0x85, 0x144: 0x86, 0x145: 0x87, 0x146: 0x88, 0x147: 0x89, 0x14d: 0x8a, 0x15c: 0x8b, 0x15f: 0x8c, 0x162: 0x8d, 0x164: 0x8e, 0x168: 0x8f, 0x169: 0x90, 0x16a: 0x91, 0x16c: 0x0e, 0x16d: 0x92, 0x16e: 0x93, 0x16f: 0x94, 0x170: 0x95, 0x173: 0x96, 0x174: 0x97, 0x175: 0x0f, 0x176: 0x10, 0x177: 0x11, 0x178: 0x12, 0x179: 0x13, 0x17a: 0x14, 0x17b: 0x15, 0x17c: 0x16, 0x17d: 0x17, 0x17e: 0x18, 0x17f: 0x19, // Block 0x6, offset 0x180 0x180: 0x98, 0x181: 0x99, 0x182: 0x9a, 0x183: 0x9b, 0x184: 0x1a, 0x185: 0x1b, 0x186: 0x9c, 0x187: 0x9d, 0x188: 0x9e, 0x189: 0x1c, 0x18a: 0x1d, 0x18b: 0x9f, 0x18c: 0xa0, 0x191: 0x1e, 0x192: 0x1f, 0x193: 0xa1, 0x1a8: 0xa2, 0x1a9: 0xa3, 0x1ab: 0xa4, 0x1b1: 0xa5, 0x1b3: 0xa6, 0x1b5: 0xa7, 0x1b7: 0xa8, 0x1ba: 0xa9, 0x1bb: 0xaa, 0x1bc: 0x20, 0x1bd: 0x21, 0x1be: 0x22, 0x1bf: 0xab, // Block 0x7, offset 0x1c0 0x1c0: 0xac, 0x1c1: 0x23, 0x1c2: 0x24, 0x1c3: 0x25, 0x1c4: 0xad, 0x1c5: 0x26, 0x1c6: 0x27, 0x1c8: 0x28, 0x1c9: 0x29, 0x1ca: 0x2a, 0x1cb: 0x2b, 0x1cc: 0x2c, 0x1cd: 0x2d, 0x1ce: 0x2e, 0x1cf: 0x2f, // Block 0x8, offset 0x200 0x219: 0xae, 0x21a: 0xaf, 0x21b: 0xb0, 0x21d: 0xb1, 0x21f: 0xb2, 0x220: 0xb3, 0x223: 0xb4, 0x224: 0xb5, 0x225: 0xb6, 0x226: 0xb7, 0x227: 0xb8, 0x22a: 0xb9, 0x22b: 0xba, 0x22d: 0xbb, 0x22f: 0xbc, 0x230: 0xbd, 0x231: 0xbe, 0x232: 0xbf, 0x233: 0xc0, 0x234: 0xc1, 0x235: 0xc2, 0x236: 0xc3, 0x237: 0xbd, 0x238: 0xbe, 0x239: 0xbf, 0x23a: 0xc0, 0x23b: 0xc1, 0x23c: 0xc2, 0x23d: 0xc3, 0x23e: 0xbd, 0x23f: 0xbe, // Block 0x9, offset 0x240 0x240: 0xbf, 0x241: 0xc0, 0x242: 0xc1, 0x243: 0xc2, 0x244: 0xc3, 0x245: 0xbd, 0x246: 0xbe, 0x247: 0xbf, 0x248: 0xc0, 0x249: 0xc1, 0x24a: 0xc2, 0x24b: 0xc3, 0x24c: 0xbd, 0x24d: 0xbe, 0x24e: 0xbf, 0x24f: 0xc0, 0x250: 0xc1, 0x251: 0xc2, 0x252: 0xc3, 0x253: 0xbd, 0x254: 0xbe, 0x255: 0xbf, 0x256: 0xc0, 0x257: 0xc1, 0x258: 0xc2, 0x259: 0xc3, 0x25a: 0xbd, 0x25b: 0xbe, 0x25c: 0xbf, 0x25d: 0xc0, 0x25e: 0xc1, 0x25f: 0xc2, 0x260: 0xc3, 0x261: 0xbd, 0x262: 0xbe, 0x263: 0xbf, 0x264: 0xc0, 0x265: 0xc1, 0x266: 0xc2, 0x267: 0xc3, 0x268: 0xbd, 0x269: 0xbe, 0x26a: 0xbf, 0x26b: 0xc0, 0x26c: 0xc1, 0x26d: 0xc2, 0x26e: 0xc3, 0x26f: 0xbd, 0x270: 0xbe, 0x271: 0xbf, 0x272: 0xc0, 0x273: 0xc1, 0x274: 0xc2, 0x275: 0xc3, 0x276: 0xbd, 0x277: 0xbe, 0x278: 0xbf, 0x279: 0xc0, 0x27a: 0xc1, 0x27b: 0xc2, 0x27c: 0xc3, 0x27d: 0xbd, 0x27e: 0xbe, 0x27f: 0xbf, // Block 0xa, offset 0x280 0x280: 0xc0, 0x281: 0xc1, 0x282: 0xc2, 0x283: 0xc3, 0x284: 0xbd, 0x285: 0xbe, 0x286: 0xbf, 0x287: 0xc0, 0x288: 0xc1, 0x289: 0xc2, 0x28a: 0xc3, 0x28b: 0xbd, 0x28c: 0xbe, 0x28d: 0xbf, 0x28e: 0xc0, 0x28f: 0xc1, 0x290: 0xc2, 0x291: 0xc3, 0x292: 0xbd, 0x293: 0xbe, 0x294: 0xbf, 0x295: 0xc0, 0x296: 0xc1, 0x297: 0xc2, 0x298: 0xc3, 0x299: 0xbd, 0x29a: 0xbe, 0x29b: 0xbf, 0x29c: 0xc0, 0x29d: 0xc1, 0x29e: 0xc2, 0x29f: 0xc3, 0x2a0: 0xbd, 0x2a1: 0xbe, 0x2a2: 0xbf, 0x2a3: 0xc0, 0x2a4: 0xc1, 0x2a5: 0xc2, 0x2a6: 0xc3, 0x2a7: 0xbd, 0x2a8: 0xbe, 0x2a9: 0xbf, 0x2aa: 0xc0, 0x2ab: 0xc1, 0x2ac: 0xc2, 0x2ad: 0xc3, 0x2ae: 0xbd, 0x2af: 0xbe, 0x2b0: 0xbf, 0x2b1: 0xc0, 0x2b2: 0xc1, 0x2b3: 0xc2, 0x2b4: 0xc3, 0x2b5: 0xbd, 0x2b6: 0xbe, 0x2b7: 0xbf, 0x2b8: 0xc0, 0x2b9: 0xc1, 0x2ba: 0xc2, 0x2bb: 0xc3, 0x2bc: 0xbd, 0x2bd: 0xbe, 0x2be: 0xbf, 0x2bf: 0xc0, // Block 0xb, offset 0x2c0 0x2c0: 0xc1, 0x2c1: 0xc2, 0x2c2: 0xc3, 0x2c3: 0xbd, 0x2c4: 0xbe, 0x2c5: 0xbf, 0x2c6: 0xc0, 0x2c7: 0xc1, 0x2c8: 0xc2, 0x2c9: 0xc3, 0x2ca: 0xbd, 0x2cb: 0xbe, 0x2cc: 0xbf, 0x2cd: 0xc0, 0x2ce: 0xc1, 0x2cf: 0xc2, 0x2d0: 0xc3, 0x2d1: 0xbd, 0x2d2: 0xbe, 0x2d3: 0xbf, 0x2d4: 0xc0, 0x2d5: 0xc1, 0x2d6: 0xc2, 0x2d7: 0xc3, 0x2d8: 0xbd, 0x2d9: 0xbe, 0x2da: 0xbf, 0x2db: 0xc0, 0x2dc: 0xc1, 0x2dd: 0xc2, 0x2de: 0xc4, // Block 0xc, offset 0x300 0x324: 0x30, 0x325: 0x31, 0x326: 0x32, 0x327: 0x33, 0x328: 0x34, 0x329: 0x35, 0x32a: 0x36, 0x32b: 0x37, 0x32c: 0x38, 0x32d: 0x39, 0x32e: 0x3a, 0x32f: 0x3b, 0x330: 0x3c, 0x331: 0x3d, 0x332: 0x3e, 0x333: 0x3f, 0x334: 0x40, 0x335: 0x41, 0x336: 0x42, 0x337: 0x43, 0x338: 0x44, 0x339: 0x45, 0x33a: 0x46, 0x33b: 0x47, 0x33c: 0xc5, 0x33d: 0x48, 0x33e: 0x49, 0x33f: 0x4a, // Block 0xd, offset 0x340 0x347: 0xc6, 0x34b: 0xc7, 0x34d: 0xc8, 0x368: 0xc9, 0x36b: 0xca, // Block 0xe, offset 0x380 0x381: 0xcb, 0x382: 0xcc, 0x384: 0xcd, 0x385: 0xb7, 0x387: 0xce, 0x388: 0xcf, 0x38b: 0xd0, 0x38c: 0x6c, 0x38d: 0xd1, 0x391: 0xd2, 0x392: 0xd3, 0x393: 0xd4, 0x396: 0xd5, 0x397: 0xd6, 0x398: 0xd7, 0x39a: 0xd8, 0x39c: 0xd9, 0x3a8: 0xda, 0x3a9: 0xdb, 0x3aa: 0xdc, 0x3b0: 0xd7, 0x3b5: 0xdd, // Block 0xf, offset 0x3c0 0x3eb: 0xde, 0x3ec: 0xdf, // Block 0x10, offset 0x400 0x432: 0xe0, // Block 0x11, offset 0x440 0x445: 0xe1, 0x446: 0xe2, 0x447: 0xe3, 0x449: 0xe4, 0x450: 0xe5, 0x451: 0xe6, 0x452: 0xe7, 0x453: 0xe8, 0x454: 0xe9, 0x455: 0xea, 0x456: 0xeb, 0x457: 0xec, 0x458: 0xed, 0x459: 0xee, 0x45a: 0x4b, 0x45b: 0xef, 0x45c: 0xf0, 0x45d: 0xf1, 0x45e: 0xf2, 0x45f: 0x4c, // Block 0x12, offset 0x480 0x480: 0xf3, 0x4a3: 0xf4, 0x4a5: 0xf5, 0x4b8: 0x4d, 0x4b9: 0x4e, 0x4ba: 0x4f, // Block 0x13, offset 0x4c0 0x4c4: 0x50, 0x4c5: 0xf6, 0x4c6: 0xf7, 0x4c8: 0x51, 0x4c9: 0xf8, // Block 0x14, offset 0x500 0x520: 0x52, 0x521: 0x53, 0x522: 0x54, 0x523: 0x55, 0x524: 0x56, 0x525: 0x57, 0x526: 0x58, 0x527: 0x59, 0x528: 0x5a, // Block 0x15, offset 0x540 0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d, 0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11, 0x56f: 0x12, } // nfkcSparseOffset: 158 entries, 316 bytes var nfkcSparseOffset = []uint16{0x0, 0xe, 0x12, 0x1b, 0x25, 0x35, 0x37, 0x3c, 0x47, 0x56, 0x63, 0x6b, 0x6f, 0x74, 0x76, 0x87, 0x8f, 0x96, 0x99, 0xa0, 0xa4, 0xa8, 0xaa, 0xac, 0xb5, 0xb9, 0xc0, 0xc5, 0xc8, 0xd2, 0xd5, 0xdc, 0xe4, 0xe8, 0xea, 0xed, 0xf1, 0xf7, 0x108, 0x114, 0x116, 0x11c, 0x11e, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12a, 0x12d, 0x130, 0x132, 0x135, 0x138, 0x13c, 0x141, 0x14a, 0x14c, 0x14f, 0x151, 0x15c, 0x167, 0x175, 0x183, 0x193, 0x1a1, 0x1a8, 0x1ae, 0x1bd, 0x1c1, 0x1c3, 0x1c7, 0x1c9, 0x1cc, 0x1ce, 0x1d1, 0x1d3, 0x1d6, 0x1d8, 0x1da, 0x1dc, 0x1e8, 0x1f2, 0x1fc, 0x1ff, 0x203, 0x205, 0x207, 0x209, 0x20b, 0x20e, 0x210, 0x212, 0x214, 0x216, 0x21c, 0x21f, 0x223, 0x225, 0x22c, 0x232, 0x238, 0x240, 0x246, 0x24c, 0x252, 0x256, 0x258, 0x25a, 0x25c, 0x25e, 0x264, 0x267, 0x26a, 0x272, 0x279, 0x27c, 0x27f, 0x281, 0x289, 0x28c, 0x293, 0x296, 0x29c, 0x29e, 0x2a0, 0x2a3, 0x2a5, 0x2a7, 0x2a9, 0x2ab, 0x2ae, 0x2b0, 0x2b2, 0x2b4, 0x2c1, 0x2cb, 0x2cd, 0x2cf, 0x2d3, 0x2d8, 0x2e4, 0x2e9, 0x2f2, 0x2f8, 0x2fd, 0x301, 0x306, 0x30a, 0x31a, 0x328, 0x336, 0x344, 0x34a, 0x34c, 0x34f, 0x359, 0x35b} // nfkcSparseValues: 869 entries, 3476 bytes var nfkcSparseValues = [869]valueRange{ // Block 0x0, offset 0x0 {value: 0x0002, lo: 0x0d}, {value: 0x0001, lo: 0xa0, hi: 0xa0}, {value: 0x4278, lo: 0xa8, hi: 0xa8}, {value: 0x0083, lo: 0xaa, hi: 0xaa}, {value: 0x4264, lo: 0xaf, hi: 0xaf}, {value: 0x0025, lo: 0xb2, hi: 0xb3}, {value: 0x425a, lo: 0xb4, hi: 0xb4}, {value: 0x01dc, lo: 0xb5, hi: 0xb5}, {value: 0x4291, lo: 0xb8, hi: 0xb8}, {value: 0x0023, lo: 0xb9, hi: 0xb9}, {value: 0x009f, lo: 0xba, hi: 0xba}, {value: 0x221c, lo: 0xbc, hi: 0xbc}, {value: 0x2210, lo: 0xbd, hi: 0xbd}, {value: 0x22b2, lo: 0xbe, hi: 0xbe}, // Block 0x1, offset 0xe {value: 0x0091, lo: 0x03}, {value: 0x46e2, lo: 0xa0, hi: 0xa1}, {value: 0x4714, lo: 0xaf, hi: 0xb0}, {value: 0xa000, lo: 0xb7, hi: 0xb7}, // Block 0x2, offset 0x12 {value: 0x0003, lo: 0x08}, {value: 0xa000, lo: 0x92, hi: 0x92}, {value: 0x0091, lo: 0xb0, hi: 0xb0}, {value: 0x0119, lo: 0xb1, hi: 0xb1}, {value: 0x0095, lo: 0xb2, hi: 0xb2}, {value: 0x00a5, lo: 0xb3, hi: 0xb3}, {value: 0x0143, lo: 0xb4, hi: 0xb6}, {value: 0x00af, lo: 0xb7, hi: 0xb7}, {value: 0x00b3, lo: 0xb8, hi: 0xb8}, // Block 0x3, offset 0x1b {value: 0x000a, lo: 0x09}, {value: 0x426e, lo: 0x98, hi: 0x98}, {value: 0x4273, lo: 0x99, hi: 0x9a}, {value: 0x4296, lo: 0x9b, hi: 0x9b}, {value: 0x425f, lo: 0x9c, hi: 0x9c}, {value: 0x4282, lo: 0x9d, hi: 0x9d}, {value: 0x0113, lo: 0xa0, hi: 0xa0}, {value: 0x0099, lo: 0xa1, hi: 0xa1}, {value: 0x00a7, lo: 0xa2, hi: 0xa3}, {value: 0x0167, lo: 0xa4, hi: 0xa4}, // Block 0x4, offset 0x25 {value: 0x0000, lo: 0x0f}, {value: 0xa000, lo: 0x83, hi: 0x83}, {value: 0xa000, lo: 0x87, hi: 0x87}, {value: 0xa000, lo: 0x8b, hi: 0x8b}, {value: 0xa000, lo: 0x8d, hi: 0x8d}, {value: 0x37a5, lo: 0x90, hi: 0x90}, {value: 0x37b1, lo: 0x91, hi: 0x91}, {value: 0x379f, lo: 0x93, hi: 0x93}, {value: 0xa000, lo: 0x96, hi: 0x96}, {value: 0x3817, lo: 0x97, hi: 0x97}, {value: 0x37e1, lo: 0x9c, hi: 0x9c}, {value: 0x37c9, lo: 0x9d, hi: 0x9d}, {value: 0x37f3, lo: 0x9e, hi: 0x9e}, {value: 0xa000, lo: 0xb4, hi: 0xb5}, {value: 0x381d, lo: 0xb6, hi: 0xb6}, {value: 0x3823, lo: 0xb7, hi: 0xb7}, // Block 0x5, offset 0x35 {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0x83, hi: 0x87}, // Block 0x6, offset 0x37 {value: 0x0001, lo: 0x04}, {value: 0x8113, lo: 0x81, hi: 0x82}, {value: 0x8132, lo: 0x84, hi: 0x84}, {value: 0x812d, lo: 0x85, hi: 0x85}, {value: 0x810d, lo: 0x87, hi: 0x87}, // Block 0x7, offset 0x3c {value: 0x0000, lo: 0x0a}, {value: 0x8132, lo: 0x90, hi: 0x97}, {value: 0x8119, lo: 0x98, hi: 0x98}, {value: 0x811a, lo: 0x99, hi: 0x99}, {value: 0x811b, lo: 0x9a, hi: 0x9a}, {value: 0x3841, lo: 0xa2, hi: 0xa2}, {value: 0x3847, lo: 0xa3, hi: 0xa3}, {value: 0x3853, lo: 0xa4, hi: 0xa4}, {value: 0x384d, lo: 0xa5, hi: 0xa5}, {value: 0x3859, lo: 0xa6, hi: 0xa6}, {value: 0xa000, lo: 0xa7, hi: 0xa7}, // Block 0x8, offset 0x47 {value: 0x0000, lo: 0x0e}, {value: 0x386b, lo: 0x80, hi: 0x80}, {value: 0xa000, lo: 0x81, hi: 0x81}, {value: 0x385f, lo: 0x82, hi: 0x82}, {value: 0xa000, lo: 0x92, hi: 0x92}, {value: 0x3865, lo: 0x93, hi: 0x93}, {value: 0xa000, lo: 0x95, hi: 0x95}, {value: 0x8132, lo: 0x96, hi: 0x9c}, {value: 0x8132, lo: 0x9f, hi: 0xa2}, {value: 0x812d, lo: 0xa3, hi: 0xa3}, {value: 0x8132, lo: 0xa4, hi: 0xa4}, {value: 0x8132, lo: 0xa7, hi: 0xa8}, {value: 0x812d, lo: 0xaa, hi: 0xaa}, {value: 0x8132, lo: 0xab, hi: 0xac}, {value: 0x812d, lo: 0xad, hi: 0xad}, // Block 0x9, offset 0x56 {value: 0x0000, lo: 0x0c}, {value: 0x811f, lo: 0x91, hi: 0x91}, {value: 0x8132, lo: 0xb0, hi: 0xb0}, {value: 0x812d, lo: 0xb1, hi: 0xb1}, {value: 0x8132, lo: 0xb2, hi: 0xb3}, {value: 0x812d, lo: 0xb4, hi: 0xb4}, {value: 0x8132, lo: 0xb5, hi: 0xb6}, {value: 0x812d, lo: 0xb7, hi: 0xb9}, {value: 0x8132, lo: 0xba, hi: 0xba}, {value: 0x812d, lo: 0xbb, hi: 0xbc}, {value: 0x8132, lo: 0xbd, hi: 0xbd}, {value: 0x812d, lo: 0xbe, hi: 0xbe}, {value: 0x8132, lo: 0xbf, hi: 0xbf}, // Block 0xa, offset 0x63 {value: 0x0005, lo: 0x07}, {value: 0x8132, lo: 0x80, hi: 0x80}, {value: 0x8132, lo: 0x81, hi: 0x81}, {value: 0x812d, lo: 0x82, hi: 0x83}, {value: 0x812d, lo: 0x84, hi: 0x85}, {value: 0x812d, lo: 0x86, hi: 0x87}, {value: 0x812d, lo: 0x88, hi: 0x89}, {value: 0x8132, lo: 0x8a, hi: 0x8a}, // Block 0xb, offset 0x6b {value: 0x0000, lo: 0x03}, {value: 0x8132, lo: 0xab, hi: 0xb1}, {value: 0x812d, lo: 0xb2, hi: 0xb2}, {value: 0x8132, lo: 0xb3, hi: 0xb3}, // Block 0xc, offset 0x6f {value: 0x0000, lo: 0x04}, {value: 0x8132, lo: 0x96, hi: 0x99}, {value: 0x8132, lo: 0x9b, hi: 0xa3}, {value: 0x8132, lo: 0xa5, hi: 0xa7}, {value: 0x8132, lo: 0xa9, hi: 0xad}, // Block 0xd, offset 0x74 {value: 0x0000, lo: 0x01}, {value: 0x812d, lo: 0x99, hi: 0x9b}, // Block 0xe, offset 0x76 {value: 0x0000, lo: 0x10}, {value: 0x8132, lo: 0x94, hi: 0xa1}, {value: 0x812d, lo: 0xa3, hi: 0xa3}, {value: 0x8132, lo: 0xa4, hi: 0xa5}, {value: 0x812d, lo: 0xa6, hi: 0xa6}, {value: 0x8132, lo: 0xa7, hi: 0xa8}, {value: 0x812d, lo: 0xa9, hi: 0xa9}, {value: 0x8132, lo: 0xaa, hi: 0xac}, {value: 0x812d, lo: 0xad, hi: 0xaf}, {value: 0x8116, lo: 0xb0, hi: 0xb0}, {value: 0x8117, lo: 0xb1, hi: 0xb1}, {value: 0x8118, lo: 0xb2, hi: 0xb2}, {value: 0x8132, lo: 0xb3, hi: 0xb5}, {value: 0x812d, lo: 0xb6, hi: 0xb6}, {value: 0x8132, lo: 0xb7, hi: 0xb8}, {value: 0x812d, lo: 0xb9, hi: 0xba}, {value: 0x8132, lo: 0xbb, hi: 0xbf}, // Block 0xf, offset 0x87 {value: 0x0000, lo: 0x07}, {value: 0xa000, lo: 0xa8, hi: 0xa8}, {value: 0x3ed8, lo: 0xa9, hi: 0xa9}, {value: 0xa000, lo: 0xb0, hi: 0xb0}, {value: 0x3ee0, lo: 0xb1, hi: 0xb1}, {value: 0xa000, lo: 0xb3, hi: 0xb3}, {value: 0x3ee8, lo: 0xb4, hi: 0xb4}, {value: 0x9902, lo: 0xbc, hi: 0xbc}, // Block 0x10, offset 0x8f {value: 0x0008, lo: 0x06}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x8132, lo: 0x91, hi: 0x91}, {value: 0x812d, lo: 0x92, hi: 0x92}, {value: 0x8132, lo: 0x93, hi: 0x93}, {value: 0x8132, lo: 0x94, hi: 0x94}, {value: 0x451c, lo: 0x98, hi: 0x9f}, // Block 0x11, offset 0x96 {value: 0x0000, lo: 0x02}, {value: 0x8102, lo: 0xbc, hi: 0xbc}, {value: 0x9900, lo: 0xbe, hi: 0xbe}, // Block 0x12, offset 0x99 {value: 0x0008, lo: 0x06}, {value: 0xa000, lo: 0x87, hi: 0x87}, {value: 0x2c9e, lo: 0x8b, hi: 0x8c}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x9900, lo: 0x97, hi: 0x97}, {value: 0x455c, lo: 0x9c, hi: 0x9d}, {value: 0x456c, lo: 0x9f, hi: 0x9f}, // Block 0x13, offset 0xa0 {value: 0x0000, lo: 0x03}, {value: 0x4594, lo: 0xb3, hi: 0xb3}, {value: 0x459c, lo: 0xb6, hi: 0xb6}, {value: 0x8102, lo: 0xbc, hi: 0xbc}, // Block 0x14, offset 0xa4 {value: 0x0008, lo: 0x03}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x4574, lo: 0x99, hi: 0x9b}, {value: 0x458c, lo: 0x9e, hi: 0x9e}, // Block 0x15, offset 0xa8 {value: 0x0000, lo: 0x01}, {value: 0x8102, lo: 0xbc, hi: 0xbc}, // Block 0x16, offset 0xaa {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, // Block 0x17, offset 0xac {value: 0x0000, lo: 0x08}, {value: 0xa000, lo: 0x87, hi: 0x87}, {value: 0x2cb6, lo: 0x88, hi: 0x88}, {value: 0x2cae, lo: 0x8b, hi: 0x8b}, {value: 0x2cbe, lo: 0x8c, hi: 0x8c}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x9900, lo: 0x96, hi: 0x97}, {value: 0x45a4, lo: 0x9c, hi: 0x9c}, {value: 0x45ac, lo: 0x9d, hi: 0x9d}, // Block 0x18, offset 0xb5 {value: 0x0000, lo: 0x03}, {value: 0xa000, lo: 0x92, hi: 0x92}, {value: 0x2cc6, lo: 0x94, hi: 0x94}, {value: 0x9900, lo: 0xbe, hi: 0xbe}, // Block 0x19, offset 0xb9 {value: 0x0000, lo: 0x06}, {value: 0xa000, lo: 0x86, hi: 0x87}, {value: 0x2cce, lo: 0x8a, hi: 0x8a}, {value: 0x2cde, lo: 0x8b, hi: 0x8b}, {value: 0x2cd6, lo: 0x8c, hi: 0x8c}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x9900, lo: 0x97, hi: 0x97}, // Block 0x1a, offset 0xc0 {value: 0x1801, lo: 0x04}, {value: 0xa000, lo: 0x86, hi: 0x86}, {value: 0x3ef0, lo: 0x88, hi: 0x88}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x8120, lo: 0x95, hi: 0x96}, // Block 0x1b, offset 0xc5 {value: 0x0000, lo: 0x02}, {value: 0x8102, lo: 0xbc, hi: 0xbc}, {value: 0xa000, lo: 0xbf, hi: 0xbf}, // Block 0x1c, offset 0xc8 {value: 0x0000, lo: 0x09}, {value: 0x2ce6, lo: 0x80, hi: 0x80}, {value: 0x9900, lo: 0x82, hi: 0x82}, {value: 0xa000, lo: 0x86, hi: 0x86}, {value: 0x2cee, lo: 0x87, hi: 0x87}, {value: 0x2cf6, lo: 0x88, hi: 0x88}, {value: 0x2f50, lo: 0x8a, hi: 0x8a}, {value: 0x2dd8, lo: 0x8b, hi: 0x8b}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x9900, lo: 0x95, hi: 0x96}, // Block 0x1d, offset 0xd2 {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0xbb, hi: 0xbc}, {value: 0x9900, lo: 0xbe, hi: 0xbe}, // Block 0x1e, offset 0xd5 {value: 0x0000, lo: 0x06}, {value: 0xa000, lo: 0x86, hi: 0x87}, {value: 0x2cfe, lo: 0x8a, hi: 0x8a}, {value: 0x2d0e, lo: 0x8b, hi: 0x8b}, {value: 0x2d06, lo: 0x8c, hi: 0x8c}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x9900, lo: 0x97, hi: 0x97}, // Block 0x1f, offset 0xdc {value: 0x6bea, lo: 0x07}, {value: 0x9904, lo: 0x8a, hi: 0x8a}, {value: 0x9900, lo: 0x8f, hi: 0x8f}, {value: 0xa000, lo: 0x99, hi: 0x99}, {value: 0x3ef8, lo: 0x9a, hi: 0x9a}, {value: 0x2f58, lo: 0x9c, hi: 0x9c}, {value: 0x2de3, lo: 0x9d, hi: 0x9d}, {value: 0x2d16, lo: 0x9e, hi: 0x9f}, // Block 0x20, offset 0xe4 {value: 0x0000, lo: 0x03}, {value: 0x2621, lo: 0xb3, hi: 0xb3}, {value: 0x8122, lo: 0xb8, hi: 0xb9}, {value: 0x8104, lo: 0xba, hi: 0xba}, // Block 0x21, offset 0xe8 {value: 0x0000, lo: 0x01}, {value: 0x8123, lo: 0x88, hi: 0x8b}, // Block 0x22, offset 0xea {value: 0x0000, lo: 0x02}, {value: 0x2636, lo: 0xb3, hi: 0xb3}, {value: 0x8124, lo: 0xb8, hi: 0xb9}, // Block 0x23, offset 0xed {value: 0x0000, lo: 0x03}, {value: 0x8125, lo: 0x88, hi: 0x8b}, {value: 0x2628, lo: 0x9c, hi: 0x9c}, {value: 0x262f, lo: 0x9d, hi: 0x9d}, // Block 0x24, offset 0xf1 {value: 0x0000, lo: 0x05}, {value: 0x030b, lo: 0x8c, hi: 0x8c}, {value: 0x812d, lo: 0x98, hi: 0x99}, {value: 0x812d, lo: 0xb5, hi: 0xb5}, {value: 0x812d, lo: 0xb7, hi: 0xb7}, {value: 0x812b, lo: 0xb9, hi: 0xb9}, // Block 0x25, offset 0xf7 {value: 0x0000, lo: 0x10}, {value: 0x2644, lo: 0x83, hi: 0x83}, {value: 0x264b, lo: 0x8d, hi: 0x8d}, {value: 0x2652, lo: 0x92, hi: 0x92}, {value: 0x2659, lo: 0x97, hi: 0x97}, {value: 0x2660, lo: 0x9c, hi: 0x9c}, {value: 0x263d, lo: 0xa9, hi: 0xa9}, {value: 0x8126, lo: 0xb1, hi: 0xb1}, {value: 0x8127, lo: 0xb2, hi: 0xb2}, {value: 0x4a84, lo: 0xb3, hi: 0xb3}, {value: 0x8128, lo: 0xb4, hi: 0xb4}, {value: 0x4a8d, lo: 0xb5, hi: 0xb5}, {value: 0x45b4, lo: 0xb6, hi: 0xb6}, {value: 0x45f4, lo: 0xb7, hi: 0xb7}, {value: 0x45bc, lo: 0xb8, hi: 0xb8}, {value: 0x45ff, lo: 0xb9, hi: 0xb9}, {value: 0x8127, lo: 0xba, hi: 0xbd}, // Block 0x26, offset 0x108 {value: 0x0000, lo: 0x0b}, {value: 0x8127, lo: 0x80, hi: 0x80}, {value: 0x4a96, lo: 0x81, hi: 0x81}, {value: 0x8132, lo: 0x82, hi: 0x83}, {value: 0x8104, lo: 0x84, hi: 0x84}, {value: 0x8132, lo: 0x86, hi: 0x87}, {value: 0x266e, lo: 0x93, hi: 0x93}, {value: 0x2675, lo: 0x9d, hi: 0x9d}, {value: 0x267c, lo: 0xa2, hi: 0xa2}, {value: 0x2683, lo: 0xa7, hi: 0xa7}, {value: 0x268a, lo: 0xac, hi: 0xac}, {value: 0x2667, lo: 0xb9, hi: 0xb9}, // Block 0x27, offset 0x114 {value: 0x0000, lo: 0x01}, {value: 0x812d, lo: 0x86, hi: 0x86}, // Block 0x28, offset 0x116 {value: 0x0000, lo: 0x05}, {value: 0xa000, lo: 0xa5, hi: 0xa5}, {value: 0x2d1e, lo: 0xa6, hi: 0xa6}, {value: 0x9900, lo: 0xae, hi: 0xae}, {value: 0x8102, lo: 0xb7, hi: 0xb7}, {value: 0x8104, lo: 0xb9, hi: 0xba}, // Block 0x29, offset 0x11c {value: 0x0000, lo: 0x01}, {value: 0x812d, lo: 0x8d, hi: 0x8d}, // Block 0x2a, offset 0x11e {value: 0x0000, lo: 0x01}, {value: 0x030f, lo: 0xbc, hi: 0xbc}, // Block 0x2b, offset 0x120 {value: 0x0000, lo: 0x01}, {value: 0xa000, lo: 0x80, hi: 0x92}, // Block 0x2c, offset 0x122 {value: 0x0000, lo: 0x01}, {value: 0xb900, lo: 0xa1, hi: 0xb5}, // Block 0x2d, offset 0x124 {value: 0x0000, lo: 0x01}, {value: 0x9900, lo: 0xa8, hi: 0xbf}, // Block 0x2e, offset 0x126 {value: 0x0000, lo: 0x01}, {value: 0x9900, lo: 0x80, hi: 0x82}, // Block 0x2f, offset 0x128 {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0x9d, hi: 0x9f}, // Block 0x30, offset 0x12a {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0x94, hi: 0x94}, {value: 0x8104, lo: 0xb4, hi: 0xb4}, // Block 0x31, offset 0x12d {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0x92, hi: 0x92}, {value: 0x8132, lo: 0x9d, hi: 0x9d}, // Block 0x32, offset 0x130 {value: 0x0000, lo: 0x01}, {value: 0x8131, lo: 0xa9, hi: 0xa9}, // Block 0x33, offset 0x132 {value: 0x0004, lo: 0x02}, {value: 0x812e, lo: 0xb9, hi: 0xba}, {value: 0x812d, lo: 0xbb, hi: 0xbb}, // Block 0x34, offset 0x135 {value: 0x0000, lo: 0x02}, {value: 0x8132, lo: 0x97, hi: 0x97}, {value: 0x812d, lo: 0x98, hi: 0x98}, // Block 0x35, offset 0x138 {value: 0x0000, lo: 0x03}, {value: 0x8104, lo: 0xa0, hi: 0xa0}, {value: 0x8132, lo: 0xb5, hi: 0xbc}, {value: 0x812d, lo: 0xbf, hi: 0xbf}, // Block 0x36, offset 0x13c {value: 0x0000, lo: 0x04}, {value: 0x8132, lo: 0xb0, hi: 0xb4}, {value: 0x812d, lo: 0xb5, hi: 0xba}, {value: 0x8132, lo: 0xbb, hi: 0xbc}, {value: 0x812d, lo: 0xbd, hi: 0xbd}, // Block 0x37, offset 0x141 {value: 0x0000, lo: 0x08}, {value: 0x2d66, lo: 0x80, hi: 0x80}, {value: 0x2d6e, lo: 0x81, hi: 0x81}, {value: 0xa000, lo: 0x82, hi: 0x82}, {value: 0x2d76, lo: 0x83, hi: 0x83}, {value: 0x8104, lo: 0x84, hi: 0x84}, {value: 0x8132, lo: 0xab, hi: 0xab}, {value: 0x812d, lo: 0xac, hi: 0xac}, {value: 0x8132, lo: 0xad, hi: 0xb3}, // Block 0x38, offset 0x14a {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0xaa, hi: 0xab}, // Block 0x39, offset 0x14c {value: 0x0000, lo: 0x02}, {value: 0x8102, lo: 0xa6, hi: 0xa6}, {value: 0x8104, lo: 0xb2, hi: 0xb3}, // Block 0x3a, offset 0x14f {value: 0x0000, lo: 0x01}, {value: 0x8102, lo: 0xb7, hi: 0xb7}, // Block 0x3b, offset 0x151 {value: 0x0000, lo: 0x0a}, {value: 0x8132, lo: 0x90, hi: 0x92}, {value: 0x8101, lo: 0x94, hi: 0x94}, {value: 0x812d, lo: 0x95, hi: 0x99}, {value: 0x8132, lo: 0x9a, hi: 0x9b}, {value: 0x812d, lo: 0x9c, hi: 0x9f}, {value: 0x8132, lo: 0xa0, hi: 0xa0}, {value: 0x8101, lo: 0xa2, hi: 0xa8}, {value: 0x812d, lo: 0xad, hi: 0xad}, {value: 0x8132, lo: 0xb4, hi: 0xb4}, {value: 0x8132, lo: 0xb8, hi: 0xb9}, // Block 0x3c, offset 0x15c {value: 0x0002, lo: 0x0a}, {value: 0x0043, lo: 0xac, hi: 0xac}, {value: 0x00d1, lo: 0xad, hi: 0xad}, {value: 0x0045, lo: 0xae, hi: 0xae}, {value: 0x0049, lo: 0xb0, hi: 0xb1}, {value: 0x00e6, lo: 0xb2, hi: 0xb2}, {value: 0x004f, lo: 0xb3, hi: 0xba}, {value: 0x005f, lo: 0xbc, hi: 0xbc}, {value: 0x00ef, lo: 0xbd, hi: 0xbd}, {value: 0x0061, lo: 0xbe, hi: 0xbe}, {value: 0x0065, lo: 0xbf, hi: 0xbf}, // Block 0x3d, offset 0x167 {value: 0x0000, lo: 0x0d}, {value: 0x0001, lo: 0x80, hi: 0x8a}, {value: 0x043b, lo: 0x91, hi: 0x91}, {value: 0x429b, lo: 0x97, hi: 0x97}, {value: 0x001d, lo: 0xa4, hi: 0xa4}, {value: 0x1873, lo: 0xa5, hi: 0xa5}, {value: 0x1b5c, lo: 0xa6, hi: 0xa6}, {value: 0x0001, lo: 0xaf, hi: 0xaf}, {value: 0x2691, lo: 0xb3, hi: 0xb3}, {value: 0x27fe, lo: 0xb4, hi: 0xb4}, {value: 0x2698, lo: 0xb6, hi: 0xb6}, {value: 0x2808, lo: 0xb7, hi: 0xb7}, {value: 0x186d, lo: 0xbc, hi: 0xbc}, {value: 0x4269, lo: 0xbe, hi: 0xbe}, // Block 0x3e, offset 0x175 {value: 0x0002, lo: 0x0d}, {value: 0x1933, lo: 0x87, hi: 0x87}, {value: 0x1930, lo: 0x88, hi: 0x88}, {value: 0x1870, lo: 0x89, hi: 0x89}, {value: 0x298e, lo: 0x97, hi: 0x97}, {value: 0x0001, lo: 0x9f, hi: 0x9f}, {value: 0x0021, lo: 0xb0, hi: 0xb0}, {value: 0x0093, lo: 0xb1, hi: 0xb1}, {value: 0x0029, lo: 0xb4, hi: 0xb9}, {value: 0x0017, lo: 0xba, hi: 0xba}, {value: 0x0467, lo: 0xbb, hi: 0xbb}, {value: 0x003b, lo: 0xbc, hi: 0xbc}, {value: 0x0011, lo: 0xbd, hi: 0xbe}, {value: 0x009d, lo: 0xbf, hi: 0xbf}, // Block 0x3f, offset 0x183 {value: 0x0002, lo: 0x0f}, {value: 0x0021, lo: 0x80, hi: 0x89}, {value: 0x0017, lo: 0x8a, hi: 0x8a}, {value: 0x0467, lo: 0x8b, hi: 0x8b}, {value: 0x003b, lo: 0x8c, hi: 0x8c}, {value: 0x0011, lo: 0x8d, hi: 0x8e}, {value: 0x0083, lo: 0x90, hi: 0x90}, {value: 0x008b, lo: 0x91, hi: 0x91}, {value: 0x009f, lo: 0x92, hi: 0x92}, {value: 0x00b1, lo: 0x93, hi: 0x93}, {value: 0x0104, lo: 0x94, hi: 0x94}, {value: 0x0091, lo: 0x95, hi: 0x95}, {value: 0x0097, lo: 0x96, hi: 0x99}, {value: 0x00a1, lo: 0x9a, hi: 0x9a}, {value: 0x00a7, lo: 0x9b, hi: 0x9c}, {value: 0x1999, lo: 0xa8, hi: 0xa8}, // Block 0x40, offset 0x193 {value: 0x0000, lo: 0x0d}, {value: 0x8132, lo: 0x90, hi: 0x91}, {value: 0x8101, lo: 0x92, hi: 0x93}, {value: 0x8132, lo: 0x94, hi: 0x97}, {value: 0x8101, lo: 0x98, hi: 0x9a}, {value: 0x8132, lo: 0x9b, hi: 0x9c}, {value: 0x8132, lo: 0xa1, hi: 0xa1}, {value: 0x8101, lo: 0xa5, hi: 0xa6}, {value: 0x8132, lo: 0xa7, hi: 0xa7}, {value: 0x812d, lo: 0xa8, hi: 0xa8}, {value: 0x8132, lo: 0xa9, hi: 0xa9}, {value: 0x8101, lo: 0xaa, hi: 0xab}, {value: 0x812d, lo: 0xac, hi: 0xaf}, {value: 0x8132, lo: 0xb0, hi: 0xb0}, // Block 0x41, offset 0x1a1 {value: 0x0007, lo: 0x06}, {value: 0x2180, lo: 0x89, hi: 0x89}, {value: 0xa000, lo: 0x90, hi: 0x90}, {value: 0xa000, lo: 0x92, hi: 0x92}, {value: 0xa000, lo: 0x94, hi: 0x94}, {value: 0x3bb9, lo: 0x9a, hi: 0x9b}, {value: 0x3bc7, lo: 0xae, hi: 0xae}, // Block 0x42, offset 0x1a8 {value: 0x000e, lo: 0x05}, {value: 0x3bce, lo: 0x8d, hi: 0x8e}, {value: 0x3bd5, lo: 0x8f, hi: 0x8f}, {value: 0xa000, lo: 0x90, hi: 0x90}, {value: 0xa000, lo: 0x92, hi: 0x92}, {value: 0xa000, lo: 0x94, hi: 0x94}, // Block 0x43, offset 0x1ae {value: 0x0173, lo: 0x0e}, {value: 0xa000, lo: 0x83, hi: 0x83}, {value: 0x3be3, lo: 0x84, hi: 0x84}, {value: 0xa000, lo: 0x88, hi: 0x88}, {value: 0x3bea, lo: 0x89, hi: 0x89}, {value: 0xa000, lo: 0x8b, hi: 0x8b}, {value: 0x3bf1, lo: 0x8c, hi: 0x8c}, {value: 0xa000, lo: 0xa3, hi: 0xa3}, {value: 0x3bf8, lo: 0xa4, hi: 0xa4}, {value: 0xa000, lo: 0xa5, hi: 0xa5}, {value: 0x3bff, lo: 0xa6, hi: 0xa6}, {value: 0x269f, lo: 0xac, hi: 0xad}, {value: 0x26a6, lo: 0xaf, hi: 0xaf}, {value: 0x281c, lo: 0xb0, hi: 0xb0}, {value: 0xa000, lo: 0xbc, hi: 0xbc}, // Block 0x44, offset 0x1bd {value: 0x0007, lo: 0x03}, {value: 0x3c68, lo: 0xa0, hi: 0xa1}, {value: 0x3c92, lo: 0xa2, hi: 0xa3}, {value: 0x3cbc, lo: 0xaa, hi: 0xad}, // Block 0x45, offset 0x1c1 {value: 0x0004, lo: 0x01}, {value: 0x048b, lo: 0xa9, hi: 0xaa}, // Block 0x46, offset 0x1c3 {value: 0x0002, lo: 0x03}, {value: 0x0057, lo: 0x80, hi: 0x8f}, {value: 0x0083, lo: 0x90, hi: 0xa9}, {value: 0x0021, lo: 0xaa, hi: 0xaa}, // Block 0x47, offset 0x1c7 {value: 0x0000, lo: 0x01}, {value: 0x299b, lo: 0x8c, hi: 0x8c}, // Block 0x48, offset 0x1c9 {value: 0x0263, lo: 0x02}, {value: 0x1b8c, lo: 0xb4, hi: 0xb4}, {value: 0x192d, lo: 0xb5, hi: 0xb6}, // Block 0x49, offset 0x1cc {value: 0x0000, lo: 0x01}, {value: 0x44dd, lo: 0x9c, hi: 0x9c}, // Block 0x4a, offset 0x1ce {value: 0x0000, lo: 0x02}, {value: 0x0095, lo: 0xbc, hi: 0xbc}, {value: 0x006d, lo: 0xbd, hi: 0xbd}, // Block 0x4b, offset 0x1d1 {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0xaf, hi: 0xb1}, // Block 0x4c, offset 0x1d3 {value: 0x0000, lo: 0x02}, {value: 0x047f, lo: 0xaf, hi: 0xaf}, {value: 0x8104, lo: 0xbf, hi: 0xbf}, // Block 0x4d, offset 0x1d6 {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0xa0, hi: 0xbf}, // Block 0x4e, offset 0x1d8 {value: 0x0000, lo: 0x01}, {value: 0x0dc3, lo: 0x9f, hi: 0x9f}, // Block 0x4f, offset 0x1da {value: 0x0000, lo: 0x01}, {value: 0x162f, lo: 0xb3, hi: 0xb3}, // Block 0x50, offset 0x1dc {value: 0x0004, lo: 0x0b}, {value: 0x1597, lo: 0x80, hi: 0x82}, {value: 0x15af, lo: 0x83, hi: 0x83}, {value: 0x15c7, lo: 0x84, hi: 0x85}, {value: 0x15d7, lo: 0x86, hi: 0x89}, {value: 0x15eb, lo: 0x8a, hi: 0x8c}, {value: 0x15ff, lo: 0x8d, hi: 0x8d}, {value: 0x1607, lo: 0x8e, hi: 0x8e}, {value: 0x160f, lo: 0x8f, hi: 0x90}, {value: 0x161b, lo: 0x91, hi: 0x93}, {value: 0x162b, lo: 0x94, hi: 0x94}, {value: 0x1633, lo: 0x95, hi: 0x95}, // Block 0x51, offset 0x1e8 {value: 0x0004, lo: 0x09}, {value: 0x0001, lo: 0x80, hi: 0x80}, {value: 0x812c, lo: 0xaa, hi: 0xaa}, {value: 0x8131, lo: 0xab, hi: 0xab}, {value: 0x8133, lo: 0xac, hi: 0xac}, {value: 0x812e, lo: 0xad, hi: 0xad}, {value: 0x812f, lo: 0xae, hi: 0xae}, {value: 0x812f, lo: 0xaf, hi: 0xaf}, {value: 0x04b3, lo: 0xb6, hi: 0xb6}, {value: 0x0887, lo: 0xb8, hi: 0xba}, // Block 0x52, offset 0x1f2 {value: 0x0006, lo: 0x09}, {value: 0x0313, lo: 0xb1, hi: 0xb1}, {value: 0x0317, lo: 0xb2, hi: 0xb2}, {value: 0x4a3b, lo: 0xb3, hi: 0xb3}, {value: 0x031b, lo: 0xb4, hi: 0xb4}, {value: 0x4a41, lo: 0xb5, hi: 0xb6}, {value: 0x031f, lo: 0xb7, hi: 0xb7}, {value: 0x0323, lo: 0xb8, hi: 0xb8}, {value: 0x0327, lo: 0xb9, hi: 0xb9}, {value: 0x4a4d, lo: 0xba, hi: 0xbf}, // Block 0x53, offset 0x1fc {value: 0x0000, lo: 0x02}, {value: 0x8132, lo: 0xaf, hi: 0xaf}, {value: 0x8132, lo: 0xb4, hi: 0xbd}, // Block 0x54, offset 0x1ff {value: 0x0000, lo: 0x03}, {value: 0x020f, lo: 0x9c, hi: 0x9c}, {value: 0x0212, lo: 0x9d, hi: 0x9d}, {value: 0x8132, lo: 0x9e, hi: 0x9f}, // Block 0x55, offset 0x203 {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0xb0, hi: 0xb1}, // Block 0x56, offset 0x205 {value: 0x0000, lo: 0x01}, {value: 0x163b, lo: 0xb0, hi: 0xb0}, // Block 0x57, offset 0x207 {value: 0x000c, lo: 0x01}, {value: 0x00d7, lo: 0xb8, hi: 0xb9}, // Block 0x58, offset 0x209 {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0x86, hi: 0x86}, // Block 0x59, offset 0x20b {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0x84, hi: 0x84}, {value: 0x8132, lo: 0xa0, hi: 0xb1}, // Block 0x5a, offset 0x20e {value: 0x0000, lo: 0x01}, {value: 0x812d, lo: 0xab, hi: 0xad}, // Block 0x5b, offset 0x210 {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0x93, hi: 0x93}, // Block 0x5c, offset 0x212 {value: 0x0000, lo: 0x01}, {value: 0x8102, lo: 0xb3, hi: 0xb3}, // Block 0x5d, offset 0x214 {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0x80, hi: 0x80}, // Block 0x5e, offset 0x216 {value: 0x0000, lo: 0x05}, {value: 0x8132, lo: 0xb0, hi: 0xb0}, {value: 0x8132, lo: 0xb2, hi: 0xb3}, {value: 0x812d, lo: 0xb4, hi: 0xb4}, {value: 0x8132, lo: 0xb7, hi: 0xb8}, {value: 0x8132, lo: 0xbe, hi: 0xbf}, // Block 0x5f, offset 0x21c {value: 0x0000, lo: 0x02}, {value: 0x8132, lo: 0x81, hi: 0x81}, {value: 0x8104, lo: 0xb6, hi: 0xb6}, // Block 0x60, offset 0x21f {value: 0x0008, lo: 0x03}, {value: 0x1637, lo: 0x9c, hi: 0x9d}, {value: 0x0125, lo: 0x9e, hi: 0x9e}, {value: 0x1643, lo: 0x9f, hi: 0x9f}, // Block 0x61, offset 0x223 {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0xad, hi: 0xad}, // Block 0x62, offset 0x225 {value: 0x0000, lo: 0x06}, {value: 0xe500, lo: 0x80, hi: 0x80}, {value: 0xc600, lo: 0x81, hi: 0x9b}, {value: 0xe500, lo: 0x9c, hi: 0x9c}, {value: 0xc600, lo: 0x9d, hi: 0xb7}, {value: 0xe500, lo: 0xb8, hi: 0xb8}, {value: 0xc600, lo: 0xb9, hi: 0xbf}, // Block 0x63, offset 0x22c {value: 0x0000, lo: 0x05}, {value: 0xc600, lo: 0x80, hi: 0x93}, {value: 0xe500, lo: 0x94, hi: 0x94}, {value: 0xc600, lo: 0x95, hi: 0xaf}, {value: 0xe500, lo: 0xb0, hi: 0xb0}, {value: 0xc600, lo: 0xb1, hi: 0xbf}, // Block 0x64, offset 0x232 {value: 0x0000, lo: 0x05}, {value: 0xc600, lo: 0x80, hi: 0x8b}, {value: 0xe500, lo: 0x8c, hi: 0x8c}, {value: 0xc600, lo: 0x8d, hi: 0xa7}, {value: 0xe500, lo: 0xa8, hi: 0xa8}, {value: 0xc600, lo: 0xa9, hi: 0xbf}, // Block 0x65, offset 0x238 {value: 0x0000, lo: 0x07}, {value: 0xc600, lo: 0x80, hi: 0x83}, {value: 0xe500, lo: 0x84, hi: 0x84}, {value: 0xc600, lo: 0x85, hi: 0x9f}, {value: 0xe500, lo: 0xa0, hi: 0xa0}, {value: 0xc600, lo: 0xa1, hi: 0xbb}, {value: 0xe500, lo: 0xbc, hi: 0xbc}, {value: 0xc600, lo: 0xbd, hi: 0xbf}, // Block 0x66, offset 0x240 {value: 0x0000, lo: 0x05}, {value: 0xc600, lo: 0x80, hi: 0x97}, {value: 0xe500, lo: 0x98, hi: 0x98}, {value: 0xc600, lo: 0x99, hi: 0xb3}, {value: 0xe500, lo: 0xb4, hi: 0xb4}, {value: 0xc600, lo: 0xb5, hi: 0xbf}, // Block 0x67, offset 0x246 {value: 0x0000, lo: 0x05}, {value: 0xc600, lo: 0x80, hi: 0x8f}, {value: 0xe500, lo: 0x90, hi: 0x90}, {value: 0xc600, lo: 0x91, hi: 0xab}, {value: 0xe500, lo: 0xac, hi: 0xac}, {value: 0xc600, lo: 0xad, hi: 0xbf}, // Block 0x68, offset 0x24c {value: 0x0000, lo: 0x05}, {value: 0xc600, lo: 0x80, hi: 0x87}, {value: 0xe500, lo: 0x88, hi: 0x88}, {value: 0xc600, lo: 0x89, hi: 0xa3}, {value: 0xe500, lo: 0xa4, hi: 0xa4}, {value: 0xc600, lo: 0xa5, hi: 0xbf}, // Block 0x69, offset 0x252 {value: 0x0000, lo: 0x03}, {value: 0xc600, lo: 0x80, hi: 0x87}, {value: 0xe500, lo: 0x88, hi: 0x88}, {value: 0xc600, lo: 0x89, hi: 0xa3}, // Block 0x6a, offset 0x256 {value: 0x0002, lo: 0x01}, {value: 0x0003, lo: 0x81, hi: 0xbf}, // Block 0x6b, offset 0x258 {value: 0x0000, lo: 0x01}, {value: 0x812d, lo: 0xbd, hi: 0xbd}, // Block 0x6c, offset 0x25a {value: 0x0000, lo: 0x01}, {value: 0x812d, lo: 0xa0, hi: 0xa0}, // Block 0x6d, offset 0x25c {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0xb6, hi: 0xba}, // Block 0x6e, offset 0x25e {value: 0x002c, lo: 0x05}, {value: 0x812d, lo: 0x8d, hi: 0x8d}, {value: 0x8132, lo: 0x8f, hi: 0x8f}, {value: 0x8132, lo: 0xb8, hi: 0xb8}, {value: 0x8101, lo: 0xb9, hi: 0xba}, {value: 0x8104, lo: 0xbf, hi: 0xbf}, // Block 0x6f, offset 0x264 {value: 0x0000, lo: 0x02}, {value: 0x8132, lo: 0xa5, hi: 0xa5}, {value: 0x812d, lo: 0xa6, hi: 0xa6}, // Block 0x70, offset 0x267 {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0x86, hi: 0x86}, {value: 0x8104, lo: 0xbf, hi: 0xbf}, // Block 0x71, offset 0x26a {value: 0x17fe, lo: 0x07}, {value: 0xa000, lo: 0x99, hi: 0x99}, {value: 0x4238, lo: 0x9a, hi: 0x9a}, {value: 0xa000, lo: 0x9b, hi: 0x9b}, {value: 0x4242, lo: 0x9c, hi: 0x9c}, {value: 0xa000, lo: 0xa5, hi: 0xa5}, {value: 0x424c, lo: 0xab, hi: 0xab}, {value: 0x8104, lo: 0xb9, hi: 0xba}, // Block 0x72, offset 0x272 {value: 0x0000, lo: 0x06}, {value: 0x8132, lo: 0x80, hi: 0x82}, {value: 0x9900, lo: 0xa7, hi: 0xa7}, {value: 0x2d7e, lo: 0xae, hi: 0xae}, {value: 0x2d88, lo: 0xaf, hi: 0xaf}, {value: 0xa000, lo: 0xb1, hi: 0xb2}, {value: 0x8104, lo: 0xb3, hi: 0xb4}, // Block 0x73, offset 0x279 {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0x80, hi: 0x80}, {value: 0x8102, lo: 0x8a, hi: 0x8a}, // Block 0x74, offset 0x27c {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0xb5, hi: 0xb5}, {value: 0x8102, lo: 0xb6, hi: 0xb6}, // Block 0x75, offset 0x27f {value: 0x0002, lo: 0x01}, {value: 0x8102, lo: 0xa9, hi: 0xaa}, // Block 0x76, offset 0x281 {value: 0x0000, lo: 0x07}, {value: 0xa000, lo: 0x87, hi: 0x87}, {value: 0x2d92, lo: 0x8b, hi: 0x8b}, {value: 0x2d9c, lo: 0x8c, hi: 0x8c}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x9900, lo: 0x97, hi: 0x97}, {value: 0x8132, lo: 0xa6, hi: 0xac}, {value: 0x8132, lo: 0xb0, hi: 0xb4}, // Block 0x77, offset 0x289 {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0x82, hi: 0x82}, {value: 0x8102, lo: 0x86, hi: 0x86}, // Block 0x78, offset 0x28c {value: 0x6b5a, lo: 0x06}, {value: 0x9900, lo: 0xb0, hi: 0xb0}, {value: 0xa000, lo: 0xb9, hi: 0xb9}, {value: 0x9900, lo: 0xba, hi: 0xba}, {value: 0x2db0, lo: 0xbb, hi: 0xbb}, {value: 0x2da6, lo: 0xbc, hi: 0xbd}, {value: 0x2dba, lo: 0xbe, hi: 0xbe}, // Block 0x79, offset 0x293 {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0x82, hi: 0x82}, {value: 0x8102, lo: 0x83, hi: 0x83}, // Block 0x7a, offset 0x296 {value: 0x0000, lo: 0x05}, {value: 0x9900, lo: 0xaf, hi: 0xaf}, {value: 0xa000, lo: 0xb8, hi: 0xb9}, {value: 0x2dc4, lo: 0xba, hi: 0xba}, {value: 0x2dce, lo: 0xbb, hi: 0xbb}, {value: 0x8104, lo: 0xbf, hi: 0xbf}, // Block 0x7b, offset 0x29c {value: 0x0000, lo: 0x01}, {value: 0x8102, lo: 0x80, hi: 0x80}, // Block 0x7c, offset 0x29e {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0xbf, hi: 0xbf}, // Block 0x7d, offset 0x2a0 {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0xb6, hi: 0xb6}, {value: 0x8102, lo: 0xb7, hi: 0xb7}, // Block 0x7e, offset 0x2a3 {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0xab, hi: 0xab}, // Block 0x7f, offset 0x2a5 {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0xb4, hi: 0xb4}, // Block 0x80, offset 0x2a7 {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0x87, hi: 0x87}, // Block 0x81, offset 0x2a9 {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0x99, hi: 0x99}, // Block 0x82, offset 0x2ab {value: 0x0000, lo: 0x02}, {value: 0x8102, lo: 0x82, hi: 0x82}, {value: 0x8104, lo: 0x84, hi: 0x85}, // Block 0x83, offset 0x2ae {value: 0x0000, lo: 0x01}, {value: 0x8101, lo: 0xb0, hi: 0xb4}, // Block 0x84, offset 0x2b0 {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0xb0, hi: 0xb6}, // Block 0x85, offset 0x2b2 {value: 0x0000, lo: 0x01}, {value: 0x8101, lo: 0x9e, hi: 0x9e}, // Block 0x86, offset 0x2b4 {value: 0x0000, lo: 0x0c}, {value: 0x45cc, lo: 0x9e, hi: 0x9e}, {value: 0x45d6, lo: 0x9f, hi: 0x9f}, {value: 0x460a, lo: 0xa0, hi: 0xa0}, {value: 0x4618, lo: 0xa1, hi: 0xa1}, {value: 0x4626, lo: 0xa2, hi: 0xa2}, {value: 0x4634, lo: 0xa3, hi: 0xa3}, {value: 0x4642, lo: 0xa4, hi: 0xa4}, {value: 0x812b, lo: 0xa5, hi: 0xa6}, {value: 0x8101, lo: 0xa7, hi: 0xa9}, {value: 0x8130, lo: 0xad, hi: 0xad}, {value: 0x812b, lo: 0xae, hi: 0xb2}, {value: 0x812d, lo: 0xbb, hi: 0xbf}, // Block 0x87, offset 0x2c1 {value: 0x0000, lo: 0x09}, {value: 0x812d, lo: 0x80, hi: 0x82}, {value: 0x8132, lo: 0x85, hi: 0x89}, {value: 0x812d, lo: 0x8a, hi: 0x8b}, {value: 0x8132, lo: 0xaa, hi: 0xad}, {value: 0x45e0, lo: 0xbb, hi: 0xbb}, {value: 0x45ea, lo: 0xbc, hi: 0xbc}, {value: 0x4650, lo: 0xbd, hi: 0xbd}, {value: 0x466c, lo: 0xbe, hi: 0xbe}, {value: 0x465e, lo: 0xbf, hi: 0xbf}, // Block 0x88, offset 0x2cb {value: 0x0000, lo: 0x01}, {value: 0x467a, lo: 0x80, hi: 0x80}, // Block 0x89, offset 0x2cd {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0x82, hi: 0x84}, // Block 0x8a, offset 0x2cf {value: 0x0002, lo: 0x03}, {value: 0x0043, lo: 0x80, hi: 0x99}, {value: 0x0083, lo: 0x9a, hi: 0xb3}, {value: 0x0043, lo: 0xb4, hi: 0xbf}, // Block 0x8b, offset 0x2d3 {value: 0x0002, lo: 0x04}, {value: 0x005b, lo: 0x80, hi: 0x8d}, {value: 0x0083, lo: 0x8e, hi: 0x94}, {value: 0x0093, lo: 0x96, hi: 0xa7}, {value: 0x0043, lo: 0xa8, hi: 0xbf}, // Block 0x8c, offset 0x2d8 {value: 0x0002, lo: 0x0b}, {value: 0x0073, lo: 0x80, hi: 0x81}, {value: 0x0083, lo: 0x82, hi: 0x9b}, {value: 0x0043, lo: 0x9c, hi: 0x9c}, {value: 0x0047, lo: 0x9e, hi: 0x9f}, {value: 0x004f, lo: 0xa2, hi: 0xa2}, {value: 0x0055, lo: 0xa5, hi: 0xa6}, {value: 0x005d, lo: 0xa9, hi: 0xac}, {value: 0x0067, lo: 0xae, hi: 0xb5}, {value: 0x0083, lo: 0xb6, hi: 0xb9}, {value: 0x008d, lo: 0xbb, hi: 0xbb}, {value: 0x0091, lo: 0xbd, hi: 0xbf}, // Block 0x8d, offset 0x2e4 {value: 0x0002, lo: 0x04}, {value: 0x0097, lo: 0x80, hi: 0x83}, {value: 0x00a1, lo: 0x85, hi: 0x8f}, {value: 0x0043, lo: 0x90, hi: 0xa9}, {value: 0x0083, lo: 0xaa, hi: 0xbf}, // Block 0x8e, offset 0x2e9 {value: 0x0002, lo: 0x08}, {value: 0x00af, lo: 0x80, hi: 0x83}, {value: 0x0043, lo: 0x84, hi: 0x85}, {value: 0x0049, lo: 0x87, hi: 0x8a}, {value: 0x0055, lo: 0x8d, hi: 0x94}, {value: 0x0067, lo: 0x96, hi: 0x9c}, {value: 0x0083, lo: 0x9e, hi: 0xb7}, {value: 0x0043, lo: 0xb8, hi: 0xb9}, {value: 0x0049, lo: 0xbb, hi: 0xbe}, // Block 0x8f, offset 0x2f2 {value: 0x0002, lo: 0x05}, {value: 0x0053, lo: 0x80, hi: 0x84}, {value: 0x005f, lo: 0x86, hi: 0x86}, {value: 0x0067, lo: 0x8a, hi: 0x90}, {value: 0x0083, lo: 0x92, hi: 0xab}, {value: 0x0043, lo: 0xac, hi: 0xbf}, // Block 0x90, offset 0x2f8 {value: 0x0002, lo: 0x04}, {value: 0x006b, lo: 0x80, hi: 0x85}, {value: 0x0083, lo: 0x86, hi: 0x9f}, {value: 0x0043, lo: 0xa0, hi: 0xb9}, {value: 0x0083, lo: 0xba, hi: 0xbf}, // Block 0x91, offset 0x2fd {value: 0x0002, lo: 0x03}, {value: 0x008f, lo: 0x80, hi: 0x93}, {value: 0x0043, lo: 0x94, hi: 0xad}, {value: 0x0083, lo: 0xae, hi: 0xbf}, // Block 0x92, offset 0x301 {value: 0x0002, lo: 0x04}, {value: 0x00a7, lo: 0x80, hi: 0x87}, {value: 0x0043, lo: 0x88, hi: 0xa1}, {value: 0x0083, lo: 0xa2, hi: 0xbb}, {value: 0x0043, lo: 0xbc, hi: 0xbf}, // Block 0x93, offset 0x306 {value: 0x0002, lo: 0x03}, {value: 0x004b, lo: 0x80, hi: 0x95}, {value: 0x0083, lo: 0x96, hi: 0xaf}, {value: 0x0043, lo: 0xb0, hi: 0xbf}, // Block 0x94, offset 0x30a {value: 0x0003, lo: 0x0f}, {value: 0x01b8, lo: 0x80, hi: 0x80}, {value: 0x045f, lo: 0x81, hi: 0x81}, {value: 0x01bb, lo: 0x82, hi: 0x9a}, {value: 0x045b, lo: 0x9b, hi: 0x9b}, {value: 0x01c7, lo: 0x9c, hi: 0x9c}, {value: 0x01d0, lo: 0x9d, hi: 0x9d}, {value: 0x01d6, lo: 0x9e, hi: 0x9e}, {value: 0x01fa, lo: 0x9f, hi: 0x9f}, {value: 0x01eb, lo: 0xa0, hi: 0xa0}, {value: 0x01e8, lo: 0xa1, hi: 0xa1}, {value: 0x0173, lo: 0xa2, hi: 0xb2}, {value: 0x0188, lo: 0xb3, hi: 0xb3}, {value: 0x01a6, lo: 0xb4, hi: 0xba}, {value: 0x045f, lo: 0xbb, hi: 0xbb}, {value: 0x01bb, lo: 0xbc, hi: 0xbf}, // Block 0x95, offset 0x31a {value: 0x0003, lo: 0x0d}, {value: 0x01c7, lo: 0x80, hi: 0x94}, {value: 0x045b, lo: 0x95, hi: 0x95}, {value: 0x01c7, lo: 0x96, hi: 0x96}, {value: 0x01d0, lo: 0x97, hi: 0x97}, {value: 0x01d6, lo: 0x98, hi: 0x98}, {value: 0x01fa, lo: 0x99, hi: 0x99}, {value: 0x01eb, lo: 0x9a, hi: 0x9a}, {value: 0x01e8, lo: 0x9b, hi: 0x9b}, {value: 0x0173, lo: 0x9c, hi: 0xac}, {value: 0x0188, lo: 0xad, hi: 0xad}, {value: 0x01a6, lo: 0xae, hi: 0xb4}, {value: 0x045f, lo: 0xb5, hi: 0xb5}, {value: 0x01bb, lo: 0xb6, hi: 0xbf}, // Block 0x96, offset 0x328 {value: 0x0003, lo: 0x0d}, {value: 0x01d9, lo: 0x80, hi: 0x8e}, {value: 0x045b, lo: 0x8f, hi: 0x8f}, {value: 0x01c7, lo: 0x90, hi: 0x90}, {value: 0x01d0, lo: 0x91, hi: 0x91}, {value: 0x01d6, lo: 0x92, hi: 0x92}, {value: 0x01fa, lo: 0x93, hi: 0x93}, {value: 0x01eb, lo: 0x94, hi: 0x94}, {value: 0x01e8, lo: 0x95, hi: 0x95}, {value: 0x0173, lo: 0x96, hi: 0xa6}, {value: 0x0188, lo: 0xa7, hi: 0xa7}, {value: 0x01a6, lo: 0xa8, hi: 0xae}, {value: 0x045f, lo: 0xaf, hi: 0xaf}, {value: 0x01bb, lo: 0xb0, hi: 0xbf}, // Block 0x97, offset 0x336 {value: 0x0003, lo: 0x0d}, {value: 0x01eb, lo: 0x80, hi: 0x88}, {value: 0x045b, lo: 0x89, hi: 0x89}, {value: 0x01c7, lo: 0x8a, hi: 0x8a}, {value: 0x01d0, lo: 0x8b, hi: 0x8b}, {value: 0x01d6, lo: 0x8c, hi: 0x8c}, {value: 0x01fa, lo: 0x8d, hi: 0x8d}, {value: 0x01eb, lo: 0x8e, hi: 0x8e}, {value: 0x01e8, lo: 0x8f, hi: 0x8f}, {value: 0x0173, lo: 0x90, hi: 0xa0}, {value: 0x0188, lo: 0xa1, hi: 0xa1}, {value: 0x01a6, lo: 0xa2, hi: 0xa8}, {value: 0x045f, lo: 0xa9, hi: 0xa9}, {value: 0x01bb, lo: 0xaa, hi: 0xbf}, // Block 0x98, offset 0x344 {value: 0x0000, lo: 0x05}, {value: 0x8132, lo: 0x80, hi: 0x86}, {value: 0x8132, lo: 0x88, hi: 0x98}, {value: 0x8132, lo: 0x9b, hi: 0xa1}, {value: 0x8132, lo: 0xa3, hi: 0xa4}, {value: 0x8132, lo: 0xa6, hi: 0xaa}, // Block 0x99, offset 0x34a {value: 0x0000, lo: 0x01}, {value: 0x812d, lo: 0x90, hi: 0x96}, // Block 0x9a, offset 0x34c {value: 0x0000, lo: 0x02}, {value: 0x8132, lo: 0x84, hi: 0x89}, {value: 0x8102, lo: 0x8a, hi: 0x8a}, // Block 0x9b, offset 0x34f {value: 0x0002, lo: 0x09}, {value: 0x0063, lo: 0x80, hi: 0x89}, {value: 0x1951, lo: 0x8a, hi: 0x8a}, {value: 0x1981, lo: 0x8b, hi: 0x8b}, {value: 0x199c, lo: 0x8c, hi: 0x8c}, {value: 0x19a2, lo: 0x8d, hi: 0x8d}, {value: 0x1bc0, lo: 0x8e, hi: 0x8e}, {value: 0x19ae, lo: 0x8f, hi: 0x8f}, {value: 0x197b, lo: 0xaa, hi: 0xaa}, {value: 0x197e, lo: 0xab, hi: 0xab}, // Block 0x9c, offset 0x359 {value: 0x0000, lo: 0x01}, {value: 0x193f, lo: 0x90, hi: 0x90}, // Block 0x9d, offset 0x35b {value: 0x0028, lo: 0x09}, {value: 0x2862, lo: 0x80, hi: 0x80}, {value: 0x2826, lo: 0x81, hi: 0x81}, {value: 0x2830, lo: 0x82, hi: 0x82}, {value: 0x2844, lo: 0x83, hi: 0x84}, {value: 0x284e, lo: 0x85, hi: 0x86}, {value: 0x283a, lo: 0x87, hi: 0x87}, {value: 0x2858, lo: 0x88, hi: 0x88}, {value: 0x0b6f, lo: 0x90, hi: 0x90}, {value: 0x08e7, lo: 0x91, hi: 0x91}, } // recompMap: 7520 bytes (entries only) var recompMap = map[uint32]rune{ 0x00410300: 0x00C0, 0x00410301: 0x00C1, 0x00410302: 0x00C2, 0x00410303: 0x00C3, 0x00410308: 0x00C4, 0x0041030A: 0x00C5, 0x00430327: 0x00C7, 0x00450300: 0x00C8, 0x00450301: 0x00C9, 0x00450302: 0x00CA, 0x00450308: 0x00CB, 0x00490300: 0x00CC, 0x00490301: 0x00CD, 0x00490302: 0x00CE, 0x00490308: 0x00CF, 0x004E0303: 0x00D1, 0x004F0300: 0x00D2, 0x004F0301: 0x00D3, 0x004F0302: 0x00D4, 0x004F0303: 0x00D5, 0x004F0308: 0x00D6, 0x00550300: 0x00D9, 0x00550301: 0x00DA, 0x00550302: 0x00DB, 0x00550308: 0x00DC, 0x00590301: 0x00DD, 0x00610300: 0x00E0, 0x00610301: 0x00E1, 0x00610302: 0x00E2, 0x00610303: 0x00E3, 0x00610308: 0x00E4, 0x0061030A: 0x00E5, 0x00630327: 0x00E7, 0x00650300: 0x00E8, 0x00650301: 0x00E9, 0x00650302: 0x00EA, 0x00650308: 0x00EB, 0x00690300: 0x00EC, 0x00690301: 0x00ED, 0x00690302: 0x00EE, 0x00690308: 0x00EF, 0x006E0303: 0x00F1, 0x006F0300: 0x00F2, 0x006F0301: 0x00F3, 0x006F0302: 0x00F4, 0x006F0303: 0x00F5, 0x006F0308: 0x00F6, 0x00750300: 0x00F9, 0x00750301: 0x00FA, 0x00750302: 0x00FB, 0x00750308: 0x00FC, 0x00790301: 0x00FD, 0x00790308: 0x00FF, 0x00410304: 0x0100, 0x00610304: 0x0101, 0x00410306: 0x0102, 0x00610306: 0x0103, 0x00410328: 0x0104, 0x00610328: 0x0105, 0x00430301: 0x0106, 0x00630301: 0x0107, 0x00430302: 0x0108, 0x00630302: 0x0109, 0x00430307: 0x010A, 0x00630307: 0x010B, 0x0043030C: 0x010C, 0x0063030C: 0x010D, 0x0044030C: 0x010E, 0x0064030C: 0x010F, 0x00450304: 0x0112, 0x00650304: 0x0113, 0x00450306: 0x0114, 0x00650306: 0x0115, 0x00450307: 0x0116, 0x00650307: 0x0117, 0x00450328: 0x0118, 0x00650328: 0x0119, 0x0045030C: 0x011A, 0x0065030C: 0x011B, 0x00470302: 0x011C, 0x00670302: 0x011D, 0x00470306: 0x011E, 0x00670306: 0x011F, 0x00470307: 0x0120, 0x00670307: 0x0121, 0x00470327: 0x0122, 0x00670327: 0x0123, 0x00480302: 0x0124, 0x00680302: 0x0125, 0x00490303: 0x0128, 0x00690303: 0x0129, 0x00490304: 0x012A, 0x00690304: 0x012B, 0x00490306: 0x012C, 0x00690306: 0x012D, 0x00490328: 0x012E, 0x00690328: 0x012F, 0x00490307: 0x0130, 0x004A0302: 0x0134, 0x006A0302: 0x0135, 0x004B0327: 0x0136, 0x006B0327: 0x0137, 0x004C0301: 0x0139, 0x006C0301: 0x013A, 0x004C0327: 0x013B, 0x006C0327: 0x013C, 0x004C030C: 0x013D, 0x006C030C: 0x013E, 0x004E0301: 0x0143, 0x006E0301: 0x0144, 0x004E0327: 0x0145, 0x006E0327: 0x0146, 0x004E030C: 0x0147, 0x006E030C: 0x0148, 0x004F0304: 0x014C, 0x006F0304: 0x014D, 0x004F0306: 0x014E, 0x006F0306: 0x014F, 0x004F030B: 0x0150, 0x006F030B: 0x0151, 0x00520301: 0x0154, 0x00720301: 0x0155, 0x00520327: 0x0156, 0x00720327: 0x0157, 0x0052030C: 0x0158, 0x0072030C: 0x0159, 0x00530301: 0x015A, 0x00730301: 0x015B, 0x00530302: 0x015C, 0x00730302: 0x015D, 0x00530327: 0x015E, 0x00730327: 0x015F, 0x0053030C: 0x0160, 0x0073030C: 0x0161, 0x00540327: 0x0162, 0x00740327: 0x0163, 0x0054030C: 0x0164, 0x0074030C: 0x0165, 0x00550303: 0x0168, 0x00750303: 0x0169, 0x00550304: 0x016A, 0x00750304: 0x016B, 0x00550306: 0x016C, 0x00750306: 0x016D, 0x0055030A: 0x016E, 0x0075030A: 0x016F, 0x0055030B: 0x0170, 0x0075030B: 0x0171, 0x00550328: 0x0172, 0x00750328: 0x0173, 0x00570302: 0x0174, 0x00770302: 0x0175, 0x00590302: 0x0176, 0x00790302: 0x0177, 0x00590308: 0x0178, 0x005A0301: 0x0179, 0x007A0301: 0x017A, 0x005A0307: 0x017B, 0x007A0307: 0x017C, 0x005A030C: 0x017D, 0x007A030C: 0x017E, 0x004F031B: 0x01A0, 0x006F031B: 0x01A1, 0x0055031B: 0x01AF, 0x0075031B: 0x01B0, 0x0041030C: 0x01CD, 0x0061030C: 0x01CE, 0x0049030C: 0x01CF, 0x0069030C: 0x01D0, 0x004F030C: 0x01D1, 0x006F030C: 0x01D2, 0x0055030C: 0x01D3, 0x0075030C: 0x01D4, 0x00DC0304: 0x01D5, 0x00FC0304: 0x01D6, 0x00DC0301: 0x01D7, 0x00FC0301: 0x01D8, 0x00DC030C: 0x01D9, 0x00FC030C: 0x01DA, 0x00DC0300: 0x01DB, 0x00FC0300: 0x01DC, 0x00C40304: 0x01DE, 0x00E40304: 0x01DF, 0x02260304: 0x01E0, 0x02270304: 0x01E1, 0x00C60304: 0x01E2, 0x00E60304: 0x01E3, 0x0047030C: 0x01E6, 0x0067030C: 0x01E7, 0x004B030C: 0x01E8, 0x006B030C: 0x01E9, 0x004F0328: 0x01EA, 0x006F0328: 0x01EB, 0x01EA0304: 0x01EC, 0x01EB0304: 0x01ED, 0x01B7030C: 0x01EE, 0x0292030C: 0x01EF, 0x006A030C: 0x01F0, 0x00470301: 0x01F4, 0x00670301: 0x01F5, 0x004E0300: 0x01F8, 0x006E0300: 0x01F9, 0x00C50301: 0x01FA, 0x00E50301: 0x01FB, 0x00C60301: 0x01FC, 0x00E60301: 0x01FD, 0x00D80301: 0x01FE, 0x00F80301: 0x01FF, 0x0041030F: 0x0200, 0x0061030F: 0x0201, 0x00410311: 0x0202, 0x00610311: 0x0203, 0x0045030F: 0x0204, 0x0065030F: 0x0205, 0x00450311: 0x0206, 0x00650311: 0x0207, 0x0049030F: 0x0208, 0x0069030F: 0x0209, 0x00490311: 0x020A, 0x00690311: 0x020B, 0x004F030F: 0x020C, 0x006F030F: 0x020D, 0x004F0311: 0x020E, 0x006F0311: 0x020F, 0x0052030F: 0x0210, 0x0072030F: 0x0211, 0x00520311: 0x0212, 0x00720311: 0x0213, 0x0055030F: 0x0214, 0x0075030F: 0x0215, 0x00550311: 0x0216, 0x00750311: 0x0217, 0x00530326: 0x0218, 0x00730326: 0x0219, 0x00540326: 0x021A, 0x00740326: 0x021B, 0x0048030C: 0x021E, 0x0068030C: 0x021F, 0x00410307: 0x0226, 0x00610307: 0x0227, 0x00450327: 0x0228, 0x00650327: 0x0229, 0x00D60304: 0x022A, 0x00F60304: 0x022B, 0x00D50304: 0x022C, 0x00F50304: 0x022D, 0x004F0307: 0x022E, 0x006F0307: 0x022F, 0x022E0304: 0x0230, 0x022F0304: 0x0231, 0x00590304: 0x0232, 0x00790304: 0x0233, 0x00A80301: 0x0385, 0x03910301: 0x0386, 0x03950301: 0x0388, 0x03970301: 0x0389, 0x03990301: 0x038A, 0x039F0301: 0x038C, 0x03A50301: 0x038E, 0x03A90301: 0x038F, 0x03CA0301: 0x0390, 0x03990308: 0x03AA, 0x03A50308: 0x03AB, 0x03B10301: 0x03AC, 0x03B50301: 0x03AD, 0x03B70301: 0x03AE, 0x03B90301: 0x03AF, 0x03CB0301: 0x03B0, 0x03B90308: 0x03CA, 0x03C50308: 0x03CB, 0x03BF0301: 0x03CC, 0x03C50301: 0x03CD, 0x03C90301: 0x03CE, 0x03D20301: 0x03D3, 0x03D20308: 0x03D4, 0x04150300: 0x0400, 0x04150308: 0x0401, 0x04130301: 0x0403, 0x04060308: 0x0407, 0x041A0301: 0x040C, 0x04180300: 0x040D, 0x04230306: 0x040E, 0x04180306: 0x0419, 0x04380306: 0x0439, 0x04350300: 0x0450, 0x04350308: 0x0451, 0x04330301: 0x0453, 0x04560308: 0x0457, 0x043A0301: 0x045C, 0x04380300: 0x045D, 0x04430306: 0x045E, 0x0474030F: 0x0476, 0x0475030F: 0x0477, 0x04160306: 0x04C1, 0x04360306: 0x04C2, 0x04100306: 0x04D0, 0x04300306: 0x04D1, 0x04100308: 0x04D2, 0x04300308: 0x04D3, 0x04150306: 0x04D6, 0x04350306: 0x04D7, 0x04D80308: 0x04DA, 0x04D90308: 0x04DB, 0x04160308: 0x04DC, 0x04360308: 0x04DD, 0x04170308: 0x04DE, 0x04370308: 0x04DF, 0x04180304: 0x04E2, 0x04380304: 0x04E3, 0x04180308: 0x04E4, 0x04380308: 0x04E5, 0x041E0308: 0x04E6, 0x043E0308: 0x04E7, 0x04E80308: 0x04EA, 0x04E90308: 0x04EB, 0x042D0308: 0x04EC, 0x044D0308: 0x04ED, 0x04230304: 0x04EE, 0x04430304: 0x04EF, 0x04230308: 0x04F0, 0x04430308: 0x04F1, 0x0423030B: 0x04F2, 0x0443030B: 0x04F3, 0x04270308: 0x04F4, 0x04470308: 0x04F5, 0x042B0308: 0x04F8, 0x044B0308: 0x04F9, 0x06270653: 0x0622, 0x06270654: 0x0623, 0x06480654: 0x0624, 0x06270655: 0x0625, 0x064A0654: 0x0626, 0x06D50654: 0x06C0, 0x06C10654: 0x06C2, 0x06D20654: 0x06D3, 0x0928093C: 0x0929, 0x0930093C: 0x0931, 0x0933093C: 0x0934, 0x09C709BE: 0x09CB, 0x09C709D7: 0x09CC, 0x0B470B56: 0x0B48, 0x0B470B3E: 0x0B4B, 0x0B470B57: 0x0B4C, 0x0B920BD7: 0x0B94, 0x0BC60BBE: 0x0BCA, 0x0BC70BBE: 0x0BCB, 0x0BC60BD7: 0x0BCC, 0x0C460C56: 0x0C48, 0x0CBF0CD5: 0x0CC0, 0x0CC60CD5: 0x0CC7, 0x0CC60CD6: 0x0CC8, 0x0CC60CC2: 0x0CCA, 0x0CCA0CD5: 0x0CCB, 0x0D460D3E: 0x0D4A, 0x0D470D3E: 0x0D4B, 0x0D460D57: 0x0D4C, 0x0DD90DCA: 0x0DDA, 0x0DD90DCF: 0x0DDC, 0x0DDC0DCA: 0x0DDD, 0x0DD90DDF: 0x0DDE, 0x1025102E: 0x1026, 0x1B051B35: 0x1B06, 0x1B071B35: 0x1B08, 0x1B091B35: 0x1B0A, 0x1B0B1B35: 0x1B0C, 0x1B0D1B35: 0x1B0E, 0x1B111B35: 0x1B12, 0x1B3A1B35: 0x1B3B, 0x1B3C1B35: 0x1B3D, 0x1B3E1B35: 0x1B40, 0x1B3F1B35: 0x1B41, 0x1B421B35: 0x1B43, 0x00410325: 0x1E00, 0x00610325: 0x1E01, 0x00420307: 0x1E02, 0x00620307: 0x1E03, 0x00420323: 0x1E04, 0x00620323: 0x1E05, 0x00420331: 0x1E06, 0x00620331: 0x1E07, 0x00C70301: 0x1E08, 0x00E70301: 0x1E09, 0x00440307: 0x1E0A, 0x00640307: 0x1E0B, 0x00440323: 0x1E0C, 0x00640323: 0x1E0D, 0x00440331: 0x1E0E, 0x00640331: 0x1E0F, 0x00440327: 0x1E10, 0x00640327: 0x1E11, 0x0044032D: 0x1E12, 0x0064032D: 0x1E13, 0x01120300: 0x1E14, 0x01130300: 0x1E15, 0x01120301: 0x1E16, 0x01130301: 0x1E17, 0x0045032D: 0x1E18, 0x0065032D: 0x1E19, 0x00450330: 0x1E1A, 0x00650330: 0x1E1B, 0x02280306: 0x1E1C, 0x02290306: 0x1E1D, 0x00460307: 0x1E1E, 0x00660307: 0x1E1F, 0x00470304: 0x1E20, 0x00670304: 0x1E21, 0x00480307: 0x1E22, 0x00680307: 0x1E23, 0x00480323: 0x1E24, 0x00680323: 0x1E25, 0x00480308: 0x1E26, 0x00680308: 0x1E27, 0x00480327: 0x1E28, 0x00680327: 0x1E29, 0x0048032E: 0x1E2A, 0x0068032E: 0x1E2B, 0x00490330: 0x1E2C, 0x00690330: 0x1E2D, 0x00CF0301: 0x1E2E, 0x00EF0301: 0x1E2F, 0x004B0301: 0x1E30, 0x006B0301: 0x1E31, 0x004B0323: 0x1E32, 0x006B0323: 0x1E33, 0x004B0331: 0x1E34, 0x006B0331: 0x1E35, 0x004C0323: 0x1E36, 0x006C0323: 0x1E37, 0x1E360304: 0x1E38, 0x1E370304: 0x1E39, 0x004C0331: 0x1E3A, 0x006C0331: 0x1E3B, 0x004C032D: 0x1E3C, 0x006C032D: 0x1E3D, 0x004D0301: 0x1E3E, 0x006D0301: 0x1E3F, 0x004D0307: 0x1E40, 0x006D0307: 0x1E41, 0x004D0323: 0x1E42, 0x006D0323: 0x1E43, 0x004E0307: 0x1E44, 0x006E0307: 0x1E45, 0x004E0323: 0x1E46, 0x006E0323: 0x1E47, 0x004E0331: 0x1E48, 0x006E0331: 0x1E49, 0x004E032D: 0x1E4A, 0x006E032D: 0x1E4B, 0x00D50301: 0x1E4C, 0x00F50301: 0x1E4D, 0x00D50308: 0x1E4E, 0x00F50308: 0x1E4F, 0x014C0300: 0x1E50, 0x014D0300: 0x1E51, 0x014C0301: 0x1E52, 0x014D0301: 0x1E53, 0x00500301: 0x1E54, 0x00700301: 0x1E55, 0x00500307: 0x1E56, 0x00700307: 0x1E57, 0x00520307: 0x1E58, 0x00720307: 0x1E59, 0x00520323: 0x1E5A, 0x00720323: 0x1E5B, 0x1E5A0304: 0x1E5C, 0x1E5B0304: 0x1E5D, 0x00520331: 0x1E5E, 0x00720331: 0x1E5F, 0x00530307: 0x1E60, 0x00730307: 0x1E61, 0x00530323: 0x1E62, 0x00730323: 0x1E63, 0x015A0307: 0x1E64, 0x015B0307: 0x1E65, 0x01600307: 0x1E66, 0x01610307: 0x1E67, 0x1E620307: 0x1E68, 0x1E630307: 0x1E69, 0x00540307: 0x1E6A, 0x00740307: 0x1E6B, 0x00540323: 0x1E6C, 0x00740323: 0x1E6D, 0x00540331: 0x1E6E, 0x00740331: 0x1E6F, 0x0054032D: 0x1E70, 0x0074032D: 0x1E71, 0x00550324: 0x1E72, 0x00750324: 0x1E73, 0x00550330: 0x1E74, 0x00750330: 0x1E75, 0x0055032D: 0x1E76, 0x0075032D: 0x1E77, 0x01680301: 0x1E78, 0x01690301: 0x1E79, 0x016A0308: 0x1E7A, 0x016B0308: 0x1E7B, 0x00560303: 0x1E7C, 0x00760303: 0x1E7D, 0x00560323: 0x1E7E, 0x00760323: 0x1E7F, 0x00570300: 0x1E80, 0x00770300: 0x1E81, 0x00570301: 0x1E82, 0x00770301: 0x1E83, 0x00570308: 0x1E84, 0x00770308: 0x1E85, 0x00570307: 0x1E86, 0x00770307: 0x1E87, 0x00570323: 0x1E88, 0x00770323: 0x1E89, 0x00580307: 0x1E8A, 0x00780307: 0x1E8B, 0x00580308: 0x1E8C, 0x00780308: 0x1E8D, 0x00590307: 0x1E8E, 0x00790307: 0x1E8F, 0x005A0302: 0x1E90, 0x007A0302: 0x1E91, 0x005A0323: 0x1E92, 0x007A0323: 0x1E93, 0x005A0331: 0x1E94, 0x007A0331: 0x1E95, 0x00680331: 0x1E96, 0x00740308: 0x1E97, 0x0077030A: 0x1E98, 0x0079030A: 0x1E99, 0x017F0307: 0x1E9B, 0x00410323: 0x1EA0, 0x00610323: 0x1EA1, 0x00410309: 0x1EA2, 0x00610309: 0x1EA3, 0x00C20301: 0x1EA4, 0x00E20301: 0x1EA5, 0x00C20300: 0x1EA6, 0x00E20300: 0x1EA7, 0x00C20309: 0x1EA8, 0x00E20309: 0x1EA9, 0x00C20303: 0x1EAA, 0x00E20303: 0x1EAB, 0x1EA00302: 0x1EAC, 0x1EA10302: 0x1EAD, 0x01020301: 0x1EAE, 0x01030301: 0x1EAF, 0x01020300: 0x1EB0, 0x01030300: 0x1EB1, 0x01020309: 0x1EB2, 0x01030309: 0x1EB3, 0x01020303: 0x1EB4, 0x01030303: 0x1EB5, 0x1EA00306: 0x1EB6, 0x1EA10306: 0x1EB7, 0x00450323: 0x1EB8, 0x00650323: 0x1EB9, 0x00450309: 0x1EBA, 0x00650309: 0x1EBB, 0x00450303: 0x1EBC, 0x00650303: 0x1EBD, 0x00CA0301: 0x1EBE, 0x00EA0301: 0x1EBF, 0x00CA0300: 0x1EC0, 0x00EA0300: 0x1EC1, 0x00CA0309: 0x1EC2, 0x00EA0309: 0x1EC3, 0x00CA0303: 0x1EC4, 0x00EA0303: 0x1EC5, 0x1EB80302: 0x1EC6, 0x1EB90302: 0x1EC7, 0x00490309: 0x1EC8, 0x00690309: 0x1EC9, 0x00490323: 0x1ECA, 0x00690323: 0x1ECB, 0x004F0323: 0x1ECC, 0x006F0323: 0x1ECD, 0x004F0309: 0x1ECE, 0x006F0309: 0x1ECF, 0x00D40301: 0x1ED0, 0x00F40301: 0x1ED1, 0x00D40300: 0x1ED2, 0x00F40300: 0x1ED3, 0x00D40309: 0x1ED4, 0x00F40309: 0x1ED5, 0x00D40303: 0x1ED6, 0x00F40303: 0x1ED7, 0x1ECC0302: 0x1ED8, 0x1ECD0302: 0x1ED9, 0x01A00301: 0x1EDA, 0x01A10301: 0x1EDB, 0x01A00300: 0x1EDC, 0x01A10300: 0x1EDD, 0x01A00309: 0x1EDE, 0x01A10309: 0x1EDF, 0x01A00303: 0x1EE0, 0x01A10303: 0x1EE1, 0x01A00323: 0x1EE2, 0x01A10323: 0x1EE3, 0x00550323: 0x1EE4, 0x00750323: 0x1EE5, 0x00550309: 0x1EE6, 0x00750309: 0x1EE7, 0x01AF0301: 0x1EE8, 0x01B00301: 0x1EE9, 0x01AF0300: 0x1EEA, 0x01B00300: 0x1EEB, 0x01AF0309: 0x1EEC, 0x01B00309: 0x1EED, 0x01AF0303: 0x1EEE, 0x01B00303: 0x1EEF, 0x01AF0323: 0x1EF0, 0x01B00323: 0x1EF1, 0x00590300: 0x1EF2, 0x00790300: 0x1EF3, 0x00590323: 0x1EF4, 0x00790323: 0x1EF5, 0x00590309: 0x1EF6, 0x00790309: 0x1EF7, 0x00590303: 0x1EF8, 0x00790303: 0x1EF9, 0x03B10313: 0x1F00, 0x03B10314: 0x1F01, 0x1F000300: 0x1F02, 0x1F010300: 0x1F03, 0x1F000301: 0x1F04, 0x1F010301: 0x1F05, 0x1F000342: 0x1F06, 0x1F010342: 0x1F07, 0x03910313: 0x1F08, 0x03910314: 0x1F09, 0x1F080300: 0x1F0A, 0x1F090300: 0x1F0B, 0x1F080301: 0x1F0C, 0x1F090301: 0x1F0D, 0x1F080342: 0x1F0E, 0x1F090342: 0x1F0F, 0x03B50313: 0x1F10, 0x03B50314: 0x1F11, 0x1F100300: 0x1F12, 0x1F110300: 0x1F13, 0x1F100301: 0x1F14, 0x1F110301: 0x1F15, 0x03950313: 0x1F18, 0x03950314: 0x1F19, 0x1F180300: 0x1F1A, 0x1F190300: 0x1F1B, 0x1F180301: 0x1F1C, 0x1F190301: 0x1F1D, 0x03B70313: 0x1F20, 0x03B70314: 0x1F21, 0x1F200300: 0x1F22, 0x1F210300: 0x1F23, 0x1F200301: 0x1F24, 0x1F210301: 0x1F25, 0x1F200342: 0x1F26, 0x1F210342: 0x1F27, 0x03970313: 0x1F28, 0x03970314: 0x1F29, 0x1F280300: 0x1F2A, 0x1F290300: 0x1F2B, 0x1F280301: 0x1F2C, 0x1F290301: 0x1F2D, 0x1F280342: 0x1F2E, 0x1F290342: 0x1F2F, 0x03B90313: 0x1F30, 0x03B90314: 0x1F31, 0x1F300300: 0x1F32, 0x1F310300: 0x1F33, 0x1F300301: 0x1F34, 0x1F310301: 0x1F35, 0x1F300342: 0x1F36, 0x1F310342: 0x1F37, 0x03990313: 0x1F38, 0x03990314: 0x1F39, 0x1F380300: 0x1F3A, 0x1F390300: 0x1F3B, 0x1F380301: 0x1F3C, 0x1F390301: 0x1F3D, 0x1F380342: 0x1F3E, 0x1F390342: 0x1F3F, 0x03BF0313: 0x1F40, 0x03BF0314: 0x1F41, 0x1F400300: 0x1F42, 0x1F410300: 0x1F43, 0x1F400301: 0x1F44, 0x1F410301: 0x1F45, 0x039F0313: 0x1F48, 0x039F0314: 0x1F49, 0x1F480300: 0x1F4A, 0x1F490300: 0x1F4B, 0x1F480301: 0x1F4C, 0x1F490301: 0x1F4D, 0x03C50313: 0x1F50, 0x03C50314: 0x1F51, 0x1F500300: 0x1F52, 0x1F510300: 0x1F53, 0x1F500301: 0x1F54, 0x1F510301: 0x1F55, 0x1F500342: 0x1F56, 0x1F510342: 0x1F57, 0x03A50314: 0x1F59, 0x1F590300: 0x1F5B, 0x1F590301: 0x1F5D, 0x1F590342: 0x1F5F, 0x03C90313: 0x1F60, 0x03C90314: 0x1F61, 0x1F600300: 0x1F62, 0x1F610300: 0x1F63, 0x1F600301: 0x1F64, 0x1F610301: 0x1F65, 0x1F600342: 0x1F66, 0x1F610342: 0x1F67, 0x03A90313: 0x1F68, 0x03A90314: 0x1F69, 0x1F680300: 0x1F6A, 0x1F690300: 0x1F6B, 0x1F680301: 0x1F6C, 0x1F690301: 0x1F6D, 0x1F680342: 0x1F6E, 0x1F690342: 0x1F6F, 0x03B10300: 0x1F70, 0x03B50300: 0x1F72, 0x03B70300: 0x1F74, 0x03B90300: 0x1F76, 0x03BF0300: 0x1F78, 0x03C50300: 0x1F7A, 0x03C90300: 0x1F7C, 0x1F000345: 0x1F80, 0x1F010345: 0x1F81, 0x1F020345: 0x1F82, 0x1F030345: 0x1F83, 0x1F040345: 0x1F84, 0x1F050345: 0x1F85, 0x1F060345: 0x1F86, 0x1F070345: 0x1F87, 0x1F080345: 0x1F88, 0x1F090345: 0x1F89, 0x1F0A0345: 0x1F8A, 0x1F0B0345: 0x1F8B, 0x1F0C0345: 0x1F8C, 0x1F0D0345: 0x1F8D, 0x1F0E0345: 0x1F8E, 0x1F0F0345: 0x1F8F, 0x1F200345: 0x1F90, 0x1F210345: 0x1F91, 0x1F220345: 0x1F92, 0x1F230345: 0x1F93, 0x1F240345: 0x1F94, 0x1F250345: 0x1F95, 0x1F260345: 0x1F96, 0x1F270345: 0x1F97, 0x1F280345: 0x1F98, 0x1F290345: 0x1F99, 0x1F2A0345: 0x1F9A, 0x1F2B0345: 0x1F9B, 0x1F2C0345: 0x1F9C, 0x1F2D0345: 0x1F9D, 0x1F2E0345: 0x1F9E, 0x1F2F0345: 0x1F9F, 0x1F600345: 0x1FA0, 0x1F610345: 0x1FA1, 0x1F620345: 0x1FA2, 0x1F630345: 0x1FA3, 0x1F640345: 0x1FA4, 0x1F650345: 0x1FA5, 0x1F660345: 0x1FA6, 0x1F670345: 0x1FA7, 0x1F680345: 0x1FA8, 0x1F690345: 0x1FA9, 0x1F6A0345: 0x1FAA, 0x1F6B0345: 0x1FAB, 0x1F6C0345: 0x1FAC, 0x1F6D0345: 0x1FAD, 0x1F6E0345: 0x1FAE, 0x1F6F0345: 0x1FAF, 0x03B10306: 0x1FB0, 0x03B10304: 0x1FB1, 0x1F700345: 0x1FB2, 0x03B10345: 0x1FB3, 0x03AC0345: 0x1FB4, 0x03B10342: 0x1FB6, 0x1FB60345: 0x1FB7, 0x03910306: 0x1FB8, 0x03910304: 0x1FB9, 0x03910300: 0x1FBA, 0x03910345: 0x1FBC, 0x00A80342: 0x1FC1, 0x1F740345: 0x1FC2, 0x03B70345: 0x1FC3, 0x03AE0345: 0x1FC4, 0x03B70342: 0x1FC6, 0x1FC60345: 0x1FC7, 0x03950300: 0x1FC8, 0x03970300: 0x1FCA, 0x03970345: 0x1FCC, 0x1FBF0300: 0x1FCD, 0x1FBF0301: 0x1FCE, 0x1FBF0342: 0x1FCF, 0x03B90306: 0x1FD0, 0x03B90304: 0x1FD1, 0x03CA0300: 0x1FD2, 0x03B90342: 0x1FD6, 0x03CA0342: 0x1FD7, 0x03990306: 0x1FD8, 0x03990304: 0x1FD9, 0x03990300: 0x1FDA, 0x1FFE0300: 0x1FDD, 0x1FFE0301: 0x1FDE, 0x1FFE0342: 0x1FDF, 0x03C50306: 0x1FE0, 0x03C50304: 0x1FE1, 0x03CB0300: 0x1FE2, 0x03C10313: 0x1FE4, 0x03C10314: 0x1FE5, 0x03C50342: 0x1FE6, 0x03CB0342: 0x1FE7, 0x03A50306: 0x1FE8, 0x03A50304: 0x1FE9, 0x03A50300: 0x1FEA, 0x03A10314: 0x1FEC, 0x00A80300: 0x1FED, 0x1F7C0345: 0x1FF2, 0x03C90345: 0x1FF3, 0x03CE0345: 0x1FF4, 0x03C90342: 0x1FF6, 0x1FF60345: 0x1FF7, 0x039F0300: 0x1FF8, 0x03A90300: 0x1FFA, 0x03A90345: 0x1FFC, 0x21900338: 0x219A, 0x21920338: 0x219B, 0x21940338: 0x21AE, 0x21D00338: 0x21CD, 0x21D40338: 0x21CE, 0x21D20338: 0x21CF, 0x22030338: 0x2204, 0x22080338: 0x2209, 0x220B0338: 0x220C, 0x22230338: 0x2224, 0x22250338: 0x2226, 0x223C0338: 0x2241, 0x22430338: 0x2244, 0x22450338: 0x2247, 0x22480338: 0x2249, 0x003D0338: 0x2260, 0x22610338: 0x2262, 0x224D0338: 0x226D, 0x003C0338: 0x226E, 0x003E0338: 0x226F, 0x22640338: 0x2270, 0x22650338: 0x2271, 0x22720338: 0x2274, 0x22730338: 0x2275, 0x22760338: 0x2278, 0x22770338: 0x2279, 0x227A0338: 0x2280, 0x227B0338: 0x2281, 0x22820338: 0x2284, 0x22830338: 0x2285, 0x22860338: 0x2288, 0x22870338: 0x2289, 0x22A20338: 0x22AC, 0x22A80338: 0x22AD, 0x22A90338: 0x22AE, 0x22AB0338: 0x22AF, 0x227C0338: 0x22E0, 0x227D0338: 0x22E1, 0x22910338: 0x22E2, 0x22920338: 0x22E3, 0x22B20338: 0x22EA, 0x22B30338: 0x22EB, 0x22B40338: 0x22EC, 0x22B50338: 0x22ED, 0x304B3099: 0x304C, 0x304D3099: 0x304E, 0x304F3099: 0x3050, 0x30513099: 0x3052, 0x30533099: 0x3054, 0x30553099: 0x3056, 0x30573099: 0x3058, 0x30593099: 0x305A, 0x305B3099: 0x305C, 0x305D3099: 0x305E, 0x305F3099: 0x3060, 0x30613099: 0x3062, 0x30643099: 0x3065, 0x30663099: 0x3067, 0x30683099: 0x3069, 0x306F3099: 0x3070, 0x306F309A: 0x3071, 0x30723099: 0x3073, 0x3072309A: 0x3074, 0x30753099: 0x3076, 0x3075309A: 0x3077, 0x30783099: 0x3079, 0x3078309A: 0x307A, 0x307B3099: 0x307C, 0x307B309A: 0x307D, 0x30463099: 0x3094, 0x309D3099: 0x309E, 0x30AB3099: 0x30AC, 0x30AD3099: 0x30AE, 0x30AF3099: 0x30B0, 0x30B13099: 0x30B2, 0x30B33099: 0x30B4, 0x30B53099: 0x30B6, 0x30B73099: 0x30B8, 0x30B93099: 0x30BA, 0x30BB3099: 0x30BC, 0x30BD3099: 0x30BE, 0x30BF3099: 0x30C0, 0x30C13099: 0x30C2, 0x30C43099: 0x30C5, 0x30C63099: 0x30C7, 0x30C83099: 0x30C9, 0x30CF3099: 0x30D0, 0x30CF309A: 0x30D1, 0x30D23099: 0x30D3, 0x30D2309A: 0x30D4, 0x30D53099: 0x30D6, 0x30D5309A: 0x30D7, 0x30D83099: 0x30D9, 0x30D8309A: 0x30DA, 0x30DB3099: 0x30DC, 0x30DB309A: 0x30DD, 0x30A63099: 0x30F4, 0x30EF3099: 0x30F7, 0x30F03099: 0x30F8, 0x30F13099: 0x30F9, 0x30F23099: 0x30FA, 0x30FD3099: 0x30FE, 0x109910BA: 0x1109A, 0x109B10BA: 0x1109C, 0x10A510BA: 0x110AB, 0x11311127: 0x1112E, 0x11321127: 0x1112F, 0x1347133E: 0x1134B, 0x13471357: 0x1134C, 0x14B914BA: 0x114BB, 0x14B914B0: 0x114BC, 0x14B914BD: 0x114BE, 0x15B815AF: 0x115BA, 0x15B915AF: 0x115BB, } // Total size of tables: 53KB (54226 bytes) ================================================ FILE: vendor/golang.org/x/text/unicode/norm/tables9.0.0.go ================================================ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. // +build !go1.10 package norm const ( // Version is the Unicode edition from which the tables are derived. Version = "9.0.0" // MaxTransformChunkSize indicates the maximum number of bytes that Transform // may need to write atomically for any Form. Making a destination buffer at // least this size ensures that Transform can always make progress and that // the user does not need to grow the buffer on an ErrShortDst. MaxTransformChunkSize = 35 + maxNonStarters*4 ) var ccc = [55]uint8{ 0, 1, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 84, 91, 103, 107, 118, 122, 129, 130, 132, 202, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 233, 234, 240, } const ( firstMulti = 0x186D firstCCC = 0x2C9E endMulti = 0x2F60 firstLeadingCCC = 0x49AE firstCCCZeroExcept = 0x4A78 firstStarterWithNLead = 0x4A9F lastDecomp = 0x4AA1 maxDecomp = 0x8000 ) // decomps: 19105 bytes var decomps = [...]byte{ // Bytes 0 - 3f 0x00, 0x41, 0x20, 0x41, 0x21, 0x41, 0x22, 0x41, 0x23, 0x41, 0x24, 0x41, 0x25, 0x41, 0x26, 0x41, 0x27, 0x41, 0x28, 0x41, 0x29, 0x41, 0x2A, 0x41, 0x2B, 0x41, 0x2C, 0x41, 0x2D, 0x41, 0x2E, 0x41, 0x2F, 0x41, 0x30, 0x41, 0x31, 0x41, 0x32, 0x41, 0x33, 0x41, 0x34, 0x41, 0x35, 0x41, 0x36, 0x41, 0x37, 0x41, 0x38, 0x41, 0x39, 0x41, 0x3A, 0x41, 0x3B, 0x41, 0x3C, 0x41, 0x3D, 0x41, 0x3E, 0x41, // Bytes 40 - 7f 0x3F, 0x41, 0x40, 0x41, 0x41, 0x41, 0x42, 0x41, 0x43, 0x41, 0x44, 0x41, 0x45, 0x41, 0x46, 0x41, 0x47, 0x41, 0x48, 0x41, 0x49, 0x41, 0x4A, 0x41, 0x4B, 0x41, 0x4C, 0x41, 0x4D, 0x41, 0x4E, 0x41, 0x4F, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41, 0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, 0x57, 0x41, 0x58, 0x41, 0x59, 0x41, 0x5A, 0x41, 0x5B, 0x41, 0x5C, 0x41, 0x5D, 0x41, 0x5E, 0x41, // Bytes 80 - bf 0x5F, 0x41, 0x60, 0x41, 0x61, 0x41, 0x62, 0x41, 0x63, 0x41, 0x64, 0x41, 0x65, 0x41, 0x66, 0x41, 0x67, 0x41, 0x68, 0x41, 0x69, 0x41, 0x6A, 0x41, 0x6B, 0x41, 0x6C, 0x41, 0x6D, 0x41, 0x6E, 0x41, 0x6F, 0x41, 0x70, 0x41, 0x71, 0x41, 0x72, 0x41, 0x73, 0x41, 0x74, 0x41, 0x75, 0x41, 0x76, 0x41, 0x77, 0x41, 0x78, 0x41, 0x79, 0x41, 0x7A, 0x41, 0x7B, 0x41, 0x7C, 0x41, 0x7D, 0x41, 0x7E, 0x42, // Bytes c0 - ff 0xC2, 0xA2, 0x42, 0xC2, 0xA3, 0x42, 0xC2, 0xA5, 0x42, 0xC2, 0xA6, 0x42, 0xC2, 0xAC, 0x42, 0xC2, 0xB7, 0x42, 0xC3, 0x86, 0x42, 0xC3, 0xB0, 0x42, 0xC4, 0xA6, 0x42, 0xC4, 0xA7, 0x42, 0xC4, 0xB1, 0x42, 0xC5, 0x8B, 0x42, 0xC5, 0x93, 0x42, 0xC6, 0x8E, 0x42, 0xC6, 0x90, 0x42, 0xC6, 0xAB, 0x42, 0xC8, 0xA2, 0x42, 0xC8, 0xB7, 0x42, 0xC9, 0x90, 0x42, 0xC9, 0x91, 0x42, 0xC9, 0x92, 0x42, 0xC9, // Bytes 100 - 13f 0x94, 0x42, 0xC9, 0x95, 0x42, 0xC9, 0x99, 0x42, 0xC9, 0x9B, 0x42, 0xC9, 0x9C, 0x42, 0xC9, 0x9F, 0x42, 0xC9, 0xA1, 0x42, 0xC9, 0xA3, 0x42, 0xC9, 0xA5, 0x42, 0xC9, 0xA6, 0x42, 0xC9, 0xA8, 0x42, 0xC9, 0xA9, 0x42, 0xC9, 0xAA, 0x42, 0xC9, 0xAB, 0x42, 0xC9, 0xAD, 0x42, 0xC9, 0xAF, 0x42, 0xC9, 0xB0, 0x42, 0xC9, 0xB1, 0x42, 0xC9, 0xB2, 0x42, 0xC9, 0xB3, 0x42, 0xC9, 0xB4, 0x42, 0xC9, 0xB5, // Bytes 140 - 17f 0x42, 0xC9, 0xB8, 0x42, 0xC9, 0xB9, 0x42, 0xC9, 0xBB, 0x42, 0xCA, 0x81, 0x42, 0xCA, 0x82, 0x42, 0xCA, 0x83, 0x42, 0xCA, 0x89, 0x42, 0xCA, 0x8A, 0x42, 0xCA, 0x8B, 0x42, 0xCA, 0x8C, 0x42, 0xCA, 0x90, 0x42, 0xCA, 0x91, 0x42, 0xCA, 0x92, 0x42, 0xCA, 0x95, 0x42, 0xCA, 0x9D, 0x42, 0xCA, 0x9F, 0x42, 0xCA, 0xB9, 0x42, 0xCE, 0x91, 0x42, 0xCE, 0x92, 0x42, 0xCE, 0x93, 0x42, 0xCE, 0x94, 0x42, // Bytes 180 - 1bf 0xCE, 0x95, 0x42, 0xCE, 0x96, 0x42, 0xCE, 0x97, 0x42, 0xCE, 0x98, 0x42, 0xCE, 0x99, 0x42, 0xCE, 0x9A, 0x42, 0xCE, 0x9B, 0x42, 0xCE, 0x9C, 0x42, 0xCE, 0x9D, 0x42, 0xCE, 0x9E, 0x42, 0xCE, 0x9F, 0x42, 0xCE, 0xA0, 0x42, 0xCE, 0xA1, 0x42, 0xCE, 0xA3, 0x42, 0xCE, 0xA4, 0x42, 0xCE, 0xA5, 0x42, 0xCE, 0xA6, 0x42, 0xCE, 0xA7, 0x42, 0xCE, 0xA8, 0x42, 0xCE, 0xA9, 0x42, 0xCE, 0xB1, 0x42, 0xCE, // Bytes 1c0 - 1ff 0xB2, 0x42, 0xCE, 0xB3, 0x42, 0xCE, 0xB4, 0x42, 0xCE, 0xB5, 0x42, 0xCE, 0xB6, 0x42, 0xCE, 0xB7, 0x42, 0xCE, 0xB8, 0x42, 0xCE, 0xB9, 0x42, 0xCE, 0xBA, 0x42, 0xCE, 0xBB, 0x42, 0xCE, 0xBC, 0x42, 0xCE, 0xBD, 0x42, 0xCE, 0xBE, 0x42, 0xCE, 0xBF, 0x42, 0xCF, 0x80, 0x42, 0xCF, 0x81, 0x42, 0xCF, 0x82, 0x42, 0xCF, 0x83, 0x42, 0xCF, 0x84, 0x42, 0xCF, 0x85, 0x42, 0xCF, 0x86, 0x42, 0xCF, 0x87, // Bytes 200 - 23f 0x42, 0xCF, 0x88, 0x42, 0xCF, 0x89, 0x42, 0xCF, 0x9C, 0x42, 0xCF, 0x9D, 0x42, 0xD0, 0xBD, 0x42, 0xD1, 0x8A, 0x42, 0xD1, 0x8C, 0x42, 0xD7, 0x90, 0x42, 0xD7, 0x91, 0x42, 0xD7, 0x92, 0x42, 0xD7, 0x93, 0x42, 0xD7, 0x94, 0x42, 0xD7, 0x9B, 0x42, 0xD7, 0x9C, 0x42, 0xD7, 0x9D, 0x42, 0xD7, 0xA2, 0x42, 0xD7, 0xA8, 0x42, 0xD7, 0xAA, 0x42, 0xD8, 0xA1, 0x42, 0xD8, 0xA7, 0x42, 0xD8, 0xA8, 0x42, // Bytes 240 - 27f 0xD8, 0xA9, 0x42, 0xD8, 0xAA, 0x42, 0xD8, 0xAB, 0x42, 0xD8, 0xAC, 0x42, 0xD8, 0xAD, 0x42, 0xD8, 0xAE, 0x42, 0xD8, 0xAF, 0x42, 0xD8, 0xB0, 0x42, 0xD8, 0xB1, 0x42, 0xD8, 0xB2, 0x42, 0xD8, 0xB3, 0x42, 0xD8, 0xB4, 0x42, 0xD8, 0xB5, 0x42, 0xD8, 0xB6, 0x42, 0xD8, 0xB7, 0x42, 0xD8, 0xB8, 0x42, 0xD8, 0xB9, 0x42, 0xD8, 0xBA, 0x42, 0xD9, 0x81, 0x42, 0xD9, 0x82, 0x42, 0xD9, 0x83, 0x42, 0xD9, // Bytes 280 - 2bf 0x84, 0x42, 0xD9, 0x85, 0x42, 0xD9, 0x86, 0x42, 0xD9, 0x87, 0x42, 0xD9, 0x88, 0x42, 0xD9, 0x89, 0x42, 0xD9, 0x8A, 0x42, 0xD9, 0xAE, 0x42, 0xD9, 0xAF, 0x42, 0xD9, 0xB1, 0x42, 0xD9, 0xB9, 0x42, 0xD9, 0xBA, 0x42, 0xD9, 0xBB, 0x42, 0xD9, 0xBE, 0x42, 0xD9, 0xBF, 0x42, 0xDA, 0x80, 0x42, 0xDA, 0x83, 0x42, 0xDA, 0x84, 0x42, 0xDA, 0x86, 0x42, 0xDA, 0x87, 0x42, 0xDA, 0x88, 0x42, 0xDA, 0x8C, // Bytes 2c0 - 2ff 0x42, 0xDA, 0x8D, 0x42, 0xDA, 0x8E, 0x42, 0xDA, 0x91, 0x42, 0xDA, 0x98, 0x42, 0xDA, 0xA1, 0x42, 0xDA, 0xA4, 0x42, 0xDA, 0xA6, 0x42, 0xDA, 0xA9, 0x42, 0xDA, 0xAD, 0x42, 0xDA, 0xAF, 0x42, 0xDA, 0xB1, 0x42, 0xDA, 0xB3, 0x42, 0xDA, 0xBA, 0x42, 0xDA, 0xBB, 0x42, 0xDA, 0xBE, 0x42, 0xDB, 0x81, 0x42, 0xDB, 0x85, 0x42, 0xDB, 0x86, 0x42, 0xDB, 0x87, 0x42, 0xDB, 0x88, 0x42, 0xDB, 0x89, 0x42, // Bytes 300 - 33f 0xDB, 0x8B, 0x42, 0xDB, 0x8C, 0x42, 0xDB, 0x90, 0x42, 0xDB, 0x92, 0x43, 0xE0, 0xBC, 0x8B, 0x43, 0xE1, 0x83, 0x9C, 0x43, 0xE1, 0x84, 0x80, 0x43, 0xE1, 0x84, 0x81, 0x43, 0xE1, 0x84, 0x82, 0x43, 0xE1, 0x84, 0x83, 0x43, 0xE1, 0x84, 0x84, 0x43, 0xE1, 0x84, 0x85, 0x43, 0xE1, 0x84, 0x86, 0x43, 0xE1, 0x84, 0x87, 0x43, 0xE1, 0x84, 0x88, 0x43, 0xE1, 0x84, 0x89, 0x43, 0xE1, 0x84, 0x8A, 0x43, // Bytes 340 - 37f 0xE1, 0x84, 0x8B, 0x43, 0xE1, 0x84, 0x8C, 0x43, 0xE1, 0x84, 0x8D, 0x43, 0xE1, 0x84, 0x8E, 0x43, 0xE1, 0x84, 0x8F, 0x43, 0xE1, 0x84, 0x90, 0x43, 0xE1, 0x84, 0x91, 0x43, 0xE1, 0x84, 0x92, 0x43, 0xE1, 0x84, 0x94, 0x43, 0xE1, 0x84, 0x95, 0x43, 0xE1, 0x84, 0x9A, 0x43, 0xE1, 0x84, 0x9C, 0x43, 0xE1, 0x84, 0x9D, 0x43, 0xE1, 0x84, 0x9E, 0x43, 0xE1, 0x84, 0xA0, 0x43, 0xE1, 0x84, 0xA1, 0x43, // Bytes 380 - 3bf 0xE1, 0x84, 0xA2, 0x43, 0xE1, 0x84, 0xA3, 0x43, 0xE1, 0x84, 0xA7, 0x43, 0xE1, 0x84, 0xA9, 0x43, 0xE1, 0x84, 0xAB, 0x43, 0xE1, 0x84, 0xAC, 0x43, 0xE1, 0x84, 0xAD, 0x43, 0xE1, 0x84, 0xAE, 0x43, 0xE1, 0x84, 0xAF, 0x43, 0xE1, 0x84, 0xB2, 0x43, 0xE1, 0x84, 0xB6, 0x43, 0xE1, 0x85, 0x80, 0x43, 0xE1, 0x85, 0x87, 0x43, 0xE1, 0x85, 0x8C, 0x43, 0xE1, 0x85, 0x97, 0x43, 0xE1, 0x85, 0x98, 0x43, // Bytes 3c0 - 3ff 0xE1, 0x85, 0x99, 0x43, 0xE1, 0x85, 0xA0, 0x43, 0xE1, 0x86, 0x84, 0x43, 0xE1, 0x86, 0x85, 0x43, 0xE1, 0x86, 0x88, 0x43, 0xE1, 0x86, 0x91, 0x43, 0xE1, 0x86, 0x92, 0x43, 0xE1, 0x86, 0x94, 0x43, 0xE1, 0x86, 0x9E, 0x43, 0xE1, 0x86, 0xA1, 0x43, 0xE1, 0x87, 0x87, 0x43, 0xE1, 0x87, 0x88, 0x43, 0xE1, 0x87, 0x8C, 0x43, 0xE1, 0x87, 0x8E, 0x43, 0xE1, 0x87, 0x93, 0x43, 0xE1, 0x87, 0x97, 0x43, // Bytes 400 - 43f 0xE1, 0x87, 0x99, 0x43, 0xE1, 0x87, 0x9D, 0x43, 0xE1, 0x87, 0x9F, 0x43, 0xE1, 0x87, 0xB1, 0x43, 0xE1, 0x87, 0xB2, 0x43, 0xE1, 0xB4, 0x82, 0x43, 0xE1, 0xB4, 0x96, 0x43, 0xE1, 0xB4, 0x97, 0x43, 0xE1, 0xB4, 0x9C, 0x43, 0xE1, 0xB4, 0x9D, 0x43, 0xE1, 0xB4, 0xA5, 0x43, 0xE1, 0xB5, 0xBB, 0x43, 0xE1, 0xB6, 0x85, 0x43, 0xE2, 0x80, 0x82, 0x43, 0xE2, 0x80, 0x83, 0x43, 0xE2, 0x80, 0x90, 0x43, // Bytes 440 - 47f 0xE2, 0x80, 0x93, 0x43, 0xE2, 0x80, 0x94, 0x43, 0xE2, 0x82, 0xA9, 0x43, 0xE2, 0x86, 0x90, 0x43, 0xE2, 0x86, 0x91, 0x43, 0xE2, 0x86, 0x92, 0x43, 0xE2, 0x86, 0x93, 0x43, 0xE2, 0x88, 0x82, 0x43, 0xE2, 0x88, 0x87, 0x43, 0xE2, 0x88, 0x91, 0x43, 0xE2, 0x88, 0x92, 0x43, 0xE2, 0x94, 0x82, 0x43, 0xE2, 0x96, 0xA0, 0x43, 0xE2, 0x97, 0x8B, 0x43, 0xE2, 0xA6, 0x85, 0x43, 0xE2, 0xA6, 0x86, 0x43, // Bytes 480 - 4bf 0xE2, 0xB5, 0xA1, 0x43, 0xE3, 0x80, 0x81, 0x43, 0xE3, 0x80, 0x82, 0x43, 0xE3, 0x80, 0x88, 0x43, 0xE3, 0x80, 0x89, 0x43, 0xE3, 0x80, 0x8A, 0x43, 0xE3, 0x80, 0x8B, 0x43, 0xE3, 0x80, 0x8C, 0x43, 0xE3, 0x80, 0x8D, 0x43, 0xE3, 0x80, 0x8E, 0x43, 0xE3, 0x80, 0x8F, 0x43, 0xE3, 0x80, 0x90, 0x43, 0xE3, 0x80, 0x91, 0x43, 0xE3, 0x80, 0x92, 0x43, 0xE3, 0x80, 0x94, 0x43, 0xE3, 0x80, 0x95, 0x43, // Bytes 4c0 - 4ff 0xE3, 0x80, 0x96, 0x43, 0xE3, 0x80, 0x97, 0x43, 0xE3, 0x82, 0xA1, 0x43, 0xE3, 0x82, 0xA2, 0x43, 0xE3, 0x82, 0xA3, 0x43, 0xE3, 0x82, 0xA4, 0x43, 0xE3, 0x82, 0xA5, 0x43, 0xE3, 0x82, 0xA6, 0x43, 0xE3, 0x82, 0xA7, 0x43, 0xE3, 0x82, 0xA8, 0x43, 0xE3, 0x82, 0xA9, 0x43, 0xE3, 0x82, 0xAA, 0x43, 0xE3, 0x82, 0xAB, 0x43, 0xE3, 0x82, 0xAD, 0x43, 0xE3, 0x82, 0xAF, 0x43, 0xE3, 0x82, 0xB1, 0x43, // Bytes 500 - 53f 0xE3, 0x82, 0xB3, 0x43, 0xE3, 0x82, 0xB5, 0x43, 0xE3, 0x82, 0xB7, 0x43, 0xE3, 0x82, 0xB9, 0x43, 0xE3, 0x82, 0xBB, 0x43, 0xE3, 0x82, 0xBD, 0x43, 0xE3, 0x82, 0xBF, 0x43, 0xE3, 0x83, 0x81, 0x43, 0xE3, 0x83, 0x83, 0x43, 0xE3, 0x83, 0x84, 0x43, 0xE3, 0x83, 0x86, 0x43, 0xE3, 0x83, 0x88, 0x43, 0xE3, 0x83, 0x8A, 0x43, 0xE3, 0x83, 0x8B, 0x43, 0xE3, 0x83, 0x8C, 0x43, 0xE3, 0x83, 0x8D, 0x43, // Bytes 540 - 57f 0xE3, 0x83, 0x8E, 0x43, 0xE3, 0x83, 0x8F, 0x43, 0xE3, 0x83, 0x92, 0x43, 0xE3, 0x83, 0x95, 0x43, 0xE3, 0x83, 0x98, 0x43, 0xE3, 0x83, 0x9B, 0x43, 0xE3, 0x83, 0x9E, 0x43, 0xE3, 0x83, 0x9F, 0x43, 0xE3, 0x83, 0xA0, 0x43, 0xE3, 0x83, 0xA1, 0x43, 0xE3, 0x83, 0xA2, 0x43, 0xE3, 0x83, 0xA3, 0x43, 0xE3, 0x83, 0xA4, 0x43, 0xE3, 0x83, 0xA5, 0x43, 0xE3, 0x83, 0xA6, 0x43, 0xE3, 0x83, 0xA7, 0x43, // Bytes 580 - 5bf 0xE3, 0x83, 0xA8, 0x43, 0xE3, 0x83, 0xA9, 0x43, 0xE3, 0x83, 0xAA, 0x43, 0xE3, 0x83, 0xAB, 0x43, 0xE3, 0x83, 0xAC, 0x43, 0xE3, 0x83, 0xAD, 0x43, 0xE3, 0x83, 0xAF, 0x43, 0xE3, 0x83, 0xB0, 0x43, 0xE3, 0x83, 0xB1, 0x43, 0xE3, 0x83, 0xB2, 0x43, 0xE3, 0x83, 0xB3, 0x43, 0xE3, 0x83, 0xBB, 0x43, 0xE3, 0x83, 0xBC, 0x43, 0xE3, 0x92, 0x9E, 0x43, 0xE3, 0x92, 0xB9, 0x43, 0xE3, 0x92, 0xBB, 0x43, // Bytes 5c0 - 5ff 0xE3, 0x93, 0x9F, 0x43, 0xE3, 0x94, 0x95, 0x43, 0xE3, 0x9B, 0xAE, 0x43, 0xE3, 0x9B, 0xBC, 0x43, 0xE3, 0x9E, 0x81, 0x43, 0xE3, 0xA0, 0xAF, 0x43, 0xE3, 0xA1, 0xA2, 0x43, 0xE3, 0xA1, 0xBC, 0x43, 0xE3, 0xA3, 0x87, 0x43, 0xE3, 0xA3, 0xA3, 0x43, 0xE3, 0xA4, 0x9C, 0x43, 0xE3, 0xA4, 0xBA, 0x43, 0xE3, 0xA8, 0xAE, 0x43, 0xE3, 0xA9, 0xAC, 0x43, 0xE3, 0xAB, 0xA4, 0x43, 0xE3, 0xAC, 0x88, 0x43, // Bytes 600 - 63f 0xE3, 0xAC, 0x99, 0x43, 0xE3, 0xAD, 0x89, 0x43, 0xE3, 0xAE, 0x9D, 0x43, 0xE3, 0xB0, 0x98, 0x43, 0xE3, 0xB1, 0x8E, 0x43, 0xE3, 0xB4, 0xB3, 0x43, 0xE3, 0xB6, 0x96, 0x43, 0xE3, 0xBA, 0xAC, 0x43, 0xE3, 0xBA, 0xB8, 0x43, 0xE3, 0xBC, 0x9B, 0x43, 0xE3, 0xBF, 0xBC, 0x43, 0xE4, 0x80, 0x88, 0x43, 0xE4, 0x80, 0x98, 0x43, 0xE4, 0x80, 0xB9, 0x43, 0xE4, 0x81, 0x86, 0x43, 0xE4, 0x82, 0x96, 0x43, // Bytes 640 - 67f 0xE4, 0x83, 0xA3, 0x43, 0xE4, 0x84, 0xAF, 0x43, 0xE4, 0x88, 0x82, 0x43, 0xE4, 0x88, 0xA7, 0x43, 0xE4, 0x8A, 0xA0, 0x43, 0xE4, 0x8C, 0x81, 0x43, 0xE4, 0x8C, 0xB4, 0x43, 0xE4, 0x8D, 0x99, 0x43, 0xE4, 0x8F, 0x95, 0x43, 0xE4, 0x8F, 0x99, 0x43, 0xE4, 0x90, 0x8B, 0x43, 0xE4, 0x91, 0xAB, 0x43, 0xE4, 0x94, 0xAB, 0x43, 0xE4, 0x95, 0x9D, 0x43, 0xE4, 0x95, 0xA1, 0x43, 0xE4, 0x95, 0xAB, 0x43, // Bytes 680 - 6bf 0xE4, 0x97, 0x97, 0x43, 0xE4, 0x97, 0xB9, 0x43, 0xE4, 0x98, 0xB5, 0x43, 0xE4, 0x9A, 0xBE, 0x43, 0xE4, 0x9B, 0x87, 0x43, 0xE4, 0xA6, 0x95, 0x43, 0xE4, 0xA7, 0xA6, 0x43, 0xE4, 0xA9, 0xAE, 0x43, 0xE4, 0xA9, 0xB6, 0x43, 0xE4, 0xAA, 0xB2, 0x43, 0xE4, 0xAC, 0xB3, 0x43, 0xE4, 0xAF, 0x8E, 0x43, 0xE4, 0xB3, 0x8E, 0x43, 0xE4, 0xB3, 0xAD, 0x43, 0xE4, 0xB3, 0xB8, 0x43, 0xE4, 0xB5, 0x96, 0x43, // Bytes 6c0 - 6ff 0xE4, 0xB8, 0x80, 0x43, 0xE4, 0xB8, 0x81, 0x43, 0xE4, 0xB8, 0x83, 0x43, 0xE4, 0xB8, 0x89, 0x43, 0xE4, 0xB8, 0x8A, 0x43, 0xE4, 0xB8, 0x8B, 0x43, 0xE4, 0xB8, 0x8D, 0x43, 0xE4, 0xB8, 0x99, 0x43, 0xE4, 0xB8, 0xA6, 0x43, 0xE4, 0xB8, 0xA8, 0x43, 0xE4, 0xB8, 0xAD, 0x43, 0xE4, 0xB8, 0xB2, 0x43, 0xE4, 0xB8, 0xB6, 0x43, 0xE4, 0xB8, 0xB8, 0x43, 0xE4, 0xB8, 0xB9, 0x43, 0xE4, 0xB8, 0xBD, 0x43, // Bytes 700 - 73f 0xE4, 0xB8, 0xBF, 0x43, 0xE4, 0xB9, 0x81, 0x43, 0xE4, 0xB9, 0x99, 0x43, 0xE4, 0xB9, 0x9D, 0x43, 0xE4, 0xBA, 0x82, 0x43, 0xE4, 0xBA, 0x85, 0x43, 0xE4, 0xBA, 0x86, 0x43, 0xE4, 0xBA, 0x8C, 0x43, 0xE4, 0xBA, 0x94, 0x43, 0xE4, 0xBA, 0xA0, 0x43, 0xE4, 0xBA, 0xA4, 0x43, 0xE4, 0xBA, 0xAE, 0x43, 0xE4, 0xBA, 0xBA, 0x43, 0xE4, 0xBB, 0x80, 0x43, 0xE4, 0xBB, 0x8C, 0x43, 0xE4, 0xBB, 0xA4, 0x43, // Bytes 740 - 77f 0xE4, 0xBC, 0x81, 0x43, 0xE4, 0xBC, 0x91, 0x43, 0xE4, 0xBD, 0xA0, 0x43, 0xE4, 0xBE, 0x80, 0x43, 0xE4, 0xBE, 0x86, 0x43, 0xE4, 0xBE, 0x8B, 0x43, 0xE4, 0xBE, 0xAE, 0x43, 0xE4, 0xBE, 0xBB, 0x43, 0xE4, 0xBE, 0xBF, 0x43, 0xE5, 0x80, 0x82, 0x43, 0xE5, 0x80, 0xAB, 0x43, 0xE5, 0x81, 0xBA, 0x43, 0xE5, 0x82, 0x99, 0x43, 0xE5, 0x83, 0x8F, 0x43, 0xE5, 0x83, 0x9A, 0x43, 0xE5, 0x83, 0xA7, 0x43, // Bytes 780 - 7bf 0xE5, 0x84, 0xAA, 0x43, 0xE5, 0x84, 0xBF, 0x43, 0xE5, 0x85, 0x80, 0x43, 0xE5, 0x85, 0x85, 0x43, 0xE5, 0x85, 0x8D, 0x43, 0xE5, 0x85, 0x94, 0x43, 0xE5, 0x85, 0xA4, 0x43, 0xE5, 0x85, 0xA5, 0x43, 0xE5, 0x85, 0xA7, 0x43, 0xE5, 0x85, 0xA8, 0x43, 0xE5, 0x85, 0xA9, 0x43, 0xE5, 0x85, 0xAB, 0x43, 0xE5, 0x85, 0xAD, 0x43, 0xE5, 0x85, 0xB7, 0x43, 0xE5, 0x86, 0x80, 0x43, 0xE5, 0x86, 0x82, 0x43, // Bytes 7c0 - 7ff 0xE5, 0x86, 0x8D, 0x43, 0xE5, 0x86, 0x92, 0x43, 0xE5, 0x86, 0x95, 0x43, 0xE5, 0x86, 0x96, 0x43, 0xE5, 0x86, 0x97, 0x43, 0xE5, 0x86, 0x99, 0x43, 0xE5, 0x86, 0xA4, 0x43, 0xE5, 0x86, 0xAB, 0x43, 0xE5, 0x86, 0xAC, 0x43, 0xE5, 0x86, 0xB5, 0x43, 0xE5, 0x86, 0xB7, 0x43, 0xE5, 0x87, 0x89, 0x43, 0xE5, 0x87, 0x8C, 0x43, 0xE5, 0x87, 0x9C, 0x43, 0xE5, 0x87, 0x9E, 0x43, 0xE5, 0x87, 0xA0, 0x43, // Bytes 800 - 83f 0xE5, 0x87, 0xB5, 0x43, 0xE5, 0x88, 0x80, 0x43, 0xE5, 0x88, 0x83, 0x43, 0xE5, 0x88, 0x87, 0x43, 0xE5, 0x88, 0x97, 0x43, 0xE5, 0x88, 0x9D, 0x43, 0xE5, 0x88, 0xA9, 0x43, 0xE5, 0x88, 0xBA, 0x43, 0xE5, 0x88, 0xBB, 0x43, 0xE5, 0x89, 0x86, 0x43, 0xE5, 0x89, 0x8D, 0x43, 0xE5, 0x89, 0xB2, 0x43, 0xE5, 0x89, 0xB7, 0x43, 0xE5, 0x8A, 0x89, 0x43, 0xE5, 0x8A, 0x9B, 0x43, 0xE5, 0x8A, 0xA3, 0x43, // Bytes 840 - 87f 0xE5, 0x8A, 0xB3, 0x43, 0xE5, 0x8A, 0xB4, 0x43, 0xE5, 0x8B, 0x87, 0x43, 0xE5, 0x8B, 0x89, 0x43, 0xE5, 0x8B, 0x92, 0x43, 0xE5, 0x8B, 0x9E, 0x43, 0xE5, 0x8B, 0xA4, 0x43, 0xE5, 0x8B, 0xB5, 0x43, 0xE5, 0x8B, 0xB9, 0x43, 0xE5, 0x8B, 0xBA, 0x43, 0xE5, 0x8C, 0x85, 0x43, 0xE5, 0x8C, 0x86, 0x43, 0xE5, 0x8C, 0x95, 0x43, 0xE5, 0x8C, 0x97, 0x43, 0xE5, 0x8C, 0x9A, 0x43, 0xE5, 0x8C, 0xB8, 0x43, // Bytes 880 - 8bf 0xE5, 0x8C, 0xBB, 0x43, 0xE5, 0x8C, 0xBF, 0x43, 0xE5, 0x8D, 0x81, 0x43, 0xE5, 0x8D, 0x84, 0x43, 0xE5, 0x8D, 0x85, 0x43, 0xE5, 0x8D, 0x89, 0x43, 0xE5, 0x8D, 0x91, 0x43, 0xE5, 0x8D, 0x94, 0x43, 0xE5, 0x8D, 0x9A, 0x43, 0xE5, 0x8D, 0x9C, 0x43, 0xE5, 0x8D, 0xA9, 0x43, 0xE5, 0x8D, 0xB0, 0x43, 0xE5, 0x8D, 0xB3, 0x43, 0xE5, 0x8D, 0xB5, 0x43, 0xE5, 0x8D, 0xBD, 0x43, 0xE5, 0x8D, 0xBF, 0x43, // Bytes 8c0 - 8ff 0xE5, 0x8E, 0x82, 0x43, 0xE5, 0x8E, 0xB6, 0x43, 0xE5, 0x8F, 0x83, 0x43, 0xE5, 0x8F, 0x88, 0x43, 0xE5, 0x8F, 0x8A, 0x43, 0xE5, 0x8F, 0x8C, 0x43, 0xE5, 0x8F, 0x9F, 0x43, 0xE5, 0x8F, 0xA3, 0x43, 0xE5, 0x8F, 0xA5, 0x43, 0xE5, 0x8F, 0xAB, 0x43, 0xE5, 0x8F, 0xAF, 0x43, 0xE5, 0x8F, 0xB1, 0x43, 0xE5, 0x8F, 0xB3, 0x43, 0xE5, 0x90, 0x86, 0x43, 0xE5, 0x90, 0x88, 0x43, 0xE5, 0x90, 0x8D, 0x43, // Bytes 900 - 93f 0xE5, 0x90, 0x8F, 0x43, 0xE5, 0x90, 0x9D, 0x43, 0xE5, 0x90, 0xB8, 0x43, 0xE5, 0x90, 0xB9, 0x43, 0xE5, 0x91, 0x82, 0x43, 0xE5, 0x91, 0x88, 0x43, 0xE5, 0x91, 0xA8, 0x43, 0xE5, 0x92, 0x9E, 0x43, 0xE5, 0x92, 0xA2, 0x43, 0xE5, 0x92, 0xBD, 0x43, 0xE5, 0x93, 0xB6, 0x43, 0xE5, 0x94, 0x90, 0x43, 0xE5, 0x95, 0x8F, 0x43, 0xE5, 0x95, 0x93, 0x43, 0xE5, 0x95, 0x95, 0x43, 0xE5, 0x95, 0xA3, 0x43, // Bytes 940 - 97f 0xE5, 0x96, 0x84, 0x43, 0xE5, 0x96, 0x87, 0x43, 0xE5, 0x96, 0x99, 0x43, 0xE5, 0x96, 0x9D, 0x43, 0xE5, 0x96, 0xAB, 0x43, 0xE5, 0x96, 0xB3, 0x43, 0xE5, 0x96, 0xB6, 0x43, 0xE5, 0x97, 0x80, 0x43, 0xE5, 0x97, 0x82, 0x43, 0xE5, 0x97, 0xA2, 0x43, 0xE5, 0x98, 0x86, 0x43, 0xE5, 0x99, 0x91, 0x43, 0xE5, 0x99, 0xA8, 0x43, 0xE5, 0x99, 0xB4, 0x43, 0xE5, 0x9B, 0x97, 0x43, 0xE5, 0x9B, 0x9B, 0x43, // Bytes 980 - 9bf 0xE5, 0x9B, 0xB9, 0x43, 0xE5, 0x9C, 0x96, 0x43, 0xE5, 0x9C, 0x97, 0x43, 0xE5, 0x9C, 0x9F, 0x43, 0xE5, 0x9C, 0xB0, 0x43, 0xE5, 0x9E, 0x8B, 0x43, 0xE5, 0x9F, 0x8E, 0x43, 0xE5, 0x9F, 0xB4, 0x43, 0xE5, 0xA0, 0x8D, 0x43, 0xE5, 0xA0, 0xB1, 0x43, 0xE5, 0xA0, 0xB2, 0x43, 0xE5, 0xA1, 0x80, 0x43, 0xE5, 0xA1, 0x9A, 0x43, 0xE5, 0xA1, 0x9E, 0x43, 0xE5, 0xA2, 0xA8, 0x43, 0xE5, 0xA2, 0xAC, 0x43, // Bytes 9c0 - 9ff 0xE5, 0xA2, 0xB3, 0x43, 0xE5, 0xA3, 0x98, 0x43, 0xE5, 0xA3, 0x9F, 0x43, 0xE5, 0xA3, 0xAB, 0x43, 0xE5, 0xA3, 0xAE, 0x43, 0xE5, 0xA3, 0xB0, 0x43, 0xE5, 0xA3, 0xB2, 0x43, 0xE5, 0xA3, 0xB7, 0x43, 0xE5, 0xA4, 0x82, 0x43, 0xE5, 0xA4, 0x86, 0x43, 0xE5, 0xA4, 0x8A, 0x43, 0xE5, 0xA4, 0x95, 0x43, 0xE5, 0xA4, 0x9A, 0x43, 0xE5, 0xA4, 0x9C, 0x43, 0xE5, 0xA4, 0xA2, 0x43, 0xE5, 0xA4, 0xA7, 0x43, // Bytes a00 - a3f 0xE5, 0xA4, 0xA9, 0x43, 0xE5, 0xA5, 0x84, 0x43, 0xE5, 0xA5, 0x88, 0x43, 0xE5, 0xA5, 0x91, 0x43, 0xE5, 0xA5, 0x94, 0x43, 0xE5, 0xA5, 0xA2, 0x43, 0xE5, 0xA5, 0xB3, 0x43, 0xE5, 0xA7, 0x98, 0x43, 0xE5, 0xA7, 0xAC, 0x43, 0xE5, 0xA8, 0x9B, 0x43, 0xE5, 0xA8, 0xA7, 0x43, 0xE5, 0xA9, 0xA2, 0x43, 0xE5, 0xA9, 0xA6, 0x43, 0xE5, 0xAA, 0xB5, 0x43, 0xE5, 0xAC, 0x88, 0x43, 0xE5, 0xAC, 0xA8, 0x43, // Bytes a40 - a7f 0xE5, 0xAC, 0xBE, 0x43, 0xE5, 0xAD, 0x90, 0x43, 0xE5, 0xAD, 0x97, 0x43, 0xE5, 0xAD, 0xA6, 0x43, 0xE5, 0xAE, 0x80, 0x43, 0xE5, 0xAE, 0x85, 0x43, 0xE5, 0xAE, 0x97, 0x43, 0xE5, 0xAF, 0x83, 0x43, 0xE5, 0xAF, 0x98, 0x43, 0xE5, 0xAF, 0xA7, 0x43, 0xE5, 0xAF, 0xAE, 0x43, 0xE5, 0xAF, 0xB3, 0x43, 0xE5, 0xAF, 0xB8, 0x43, 0xE5, 0xAF, 0xBF, 0x43, 0xE5, 0xB0, 0x86, 0x43, 0xE5, 0xB0, 0x8F, 0x43, // Bytes a80 - abf 0xE5, 0xB0, 0xA2, 0x43, 0xE5, 0xB0, 0xB8, 0x43, 0xE5, 0xB0, 0xBF, 0x43, 0xE5, 0xB1, 0xA0, 0x43, 0xE5, 0xB1, 0xA2, 0x43, 0xE5, 0xB1, 0xA4, 0x43, 0xE5, 0xB1, 0xA5, 0x43, 0xE5, 0xB1, 0xAE, 0x43, 0xE5, 0xB1, 0xB1, 0x43, 0xE5, 0xB2, 0x8D, 0x43, 0xE5, 0xB3, 0x80, 0x43, 0xE5, 0xB4, 0x99, 0x43, 0xE5, 0xB5, 0x83, 0x43, 0xE5, 0xB5, 0x90, 0x43, 0xE5, 0xB5, 0xAB, 0x43, 0xE5, 0xB5, 0xAE, 0x43, // Bytes ac0 - aff 0xE5, 0xB5, 0xBC, 0x43, 0xE5, 0xB6, 0xB2, 0x43, 0xE5, 0xB6, 0xBA, 0x43, 0xE5, 0xB7, 0x9B, 0x43, 0xE5, 0xB7, 0xA1, 0x43, 0xE5, 0xB7, 0xA2, 0x43, 0xE5, 0xB7, 0xA5, 0x43, 0xE5, 0xB7, 0xA6, 0x43, 0xE5, 0xB7, 0xB1, 0x43, 0xE5, 0xB7, 0xBD, 0x43, 0xE5, 0xB7, 0xBE, 0x43, 0xE5, 0xB8, 0xA8, 0x43, 0xE5, 0xB8, 0xBD, 0x43, 0xE5, 0xB9, 0xA9, 0x43, 0xE5, 0xB9, 0xB2, 0x43, 0xE5, 0xB9, 0xB4, 0x43, // Bytes b00 - b3f 0xE5, 0xB9, 0xBA, 0x43, 0xE5, 0xB9, 0xBC, 0x43, 0xE5, 0xB9, 0xBF, 0x43, 0xE5, 0xBA, 0xA6, 0x43, 0xE5, 0xBA, 0xB0, 0x43, 0xE5, 0xBA, 0xB3, 0x43, 0xE5, 0xBA, 0xB6, 0x43, 0xE5, 0xBB, 0x89, 0x43, 0xE5, 0xBB, 0x8A, 0x43, 0xE5, 0xBB, 0x92, 0x43, 0xE5, 0xBB, 0x93, 0x43, 0xE5, 0xBB, 0x99, 0x43, 0xE5, 0xBB, 0xAC, 0x43, 0xE5, 0xBB, 0xB4, 0x43, 0xE5, 0xBB, 0xBE, 0x43, 0xE5, 0xBC, 0x84, 0x43, // Bytes b40 - b7f 0xE5, 0xBC, 0x8B, 0x43, 0xE5, 0xBC, 0x93, 0x43, 0xE5, 0xBC, 0xA2, 0x43, 0xE5, 0xBD, 0x90, 0x43, 0xE5, 0xBD, 0x93, 0x43, 0xE5, 0xBD, 0xA1, 0x43, 0xE5, 0xBD, 0xA2, 0x43, 0xE5, 0xBD, 0xA9, 0x43, 0xE5, 0xBD, 0xAB, 0x43, 0xE5, 0xBD, 0xB3, 0x43, 0xE5, 0xBE, 0x8B, 0x43, 0xE5, 0xBE, 0x8C, 0x43, 0xE5, 0xBE, 0x97, 0x43, 0xE5, 0xBE, 0x9A, 0x43, 0xE5, 0xBE, 0xA9, 0x43, 0xE5, 0xBE, 0xAD, 0x43, // Bytes b80 - bbf 0xE5, 0xBF, 0x83, 0x43, 0xE5, 0xBF, 0x8D, 0x43, 0xE5, 0xBF, 0x97, 0x43, 0xE5, 0xBF, 0xB5, 0x43, 0xE5, 0xBF, 0xB9, 0x43, 0xE6, 0x80, 0x92, 0x43, 0xE6, 0x80, 0x9C, 0x43, 0xE6, 0x81, 0xB5, 0x43, 0xE6, 0x82, 0x81, 0x43, 0xE6, 0x82, 0x94, 0x43, 0xE6, 0x83, 0x87, 0x43, 0xE6, 0x83, 0x98, 0x43, 0xE6, 0x83, 0xA1, 0x43, 0xE6, 0x84, 0x88, 0x43, 0xE6, 0x85, 0x84, 0x43, 0xE6, 0x85, 0x88, 0x43, // Bytes bc0 - bff 0xE6, 0x85, 0x8C, 0x43, 0xE6, 0x85, 0x8E, 0x43, 0xE6, 0x85, 0xA0, 0x43, 0xE6, 0x85, 0xA8, 0x43, 0xE6, 0x85, 0xBA, 0x43, 0xE6, 0x86, 0x8E, 0x43, 0xE6, 0x86, 0x90, 0x43, 0xE6, 0x86, 0xA4, 0x43, 0xE6, 0x86, 0xAF, 0x43, 0xE6, 0x86, 0xB2, 0x43, 0xE6, 0x87, 0x9E, 0x43, 0xE6, 0x87, 0xB2, 0x43, 0xE6, 0x87, 0xB6, 0x43, 0xE6, 0x88, 0x80, 0x43, 0xE6, 0x88, 0x88, 0x43, 0xE6, 0x88, 0x90, 0x43, // Bytes c00 - c3f 0xE6, 0x88, 0x9B, 0x43, 0xE6, 0x88, 0xAE, 0x43, 0xE6, 0x88, 0xB4, 0x43, 0xE6, 0x88, 0xB6, 0x43, 0xE6, 0x89, 0x8B, 0x43, 0xE6, 0x89, 0x93, 0x43, 0xE6, 0x89, 0x9D, 0x43, 0xE6, 0x8A, 0x95, 0x43, 0xE6, 0x8A, 0xB1, 0x43, 0xE6, 0x8B, 0x89, 0x43, 0xE6, 0x8B, 0x8F, 0x43, 0xE6, 0x8B, 0x93, 0x43, 0xE6, 0x8B, 0x94, 0x43, 0xE6, 0x8B, 0xBC, 0x43, 0xE6, 0x8B, 0xBE, 0x43, 0xE6, 0x8C, 0x87, 0x43, // Bytes c40 - c7f 0xE6, 0x8C, 0xBD, 0x43, 0xE6, 0x8D, 0x90, 0x43, 0xE6, 0x8D, 0x95, 0x43, 0xE6, 0x8D, 0xA8, 0x43, 0xE6, 0x8D, 0xBB, 0x43, 0xE6, 0x8E, 0x83, 0x43, 0xE6, 0x8E, 0xA0, 0x43, 0xE6, 0x8E, 0xA9, 0x43, 0xE6, 0x8F, 0x84, 0x43, 0xE6, 0x8F, 0x85, 0x43, 0xE6, 0x8F, 0xA4, 0x43, 0xE6, 0x90, 0x9C, 0x43, 0xE6, 0x90, 0xA2, 0x43, 0xE6, 0x91, 0x92, 0x43, 0xE6, 0x91, 0xA9, 0x43, 0xE6, 0x91, 0xB7, 0x43, // Bytes c80 - cbf 0xE6, 0x91, 0xBE, 0x43, 0xE6, 0x92, 0x9A, 0x43, 0xE6, 0x92, 0x9D, 0x43, 0xE6, 0x93, 0x84, 0x43, 0xE6, 0x94, 0xAF, 0x43, 0xE6, 0x94, 0xB4, 0x43, 0xE6, 0x95, 0x8F, 0x43, 0xE6, 0x95, 0x96, 0x43, 0xE6, 0x95, 0xAC, 0x43, 0xE6, 0x95, 0xB8, 0x43, 0xE6, 0x96, 0x87, 0x43, 0xE6, 0x96, 0x97, 0x43, 0xE6, 0x96, 0x99, 0x43, 0xE6, 0x96, 0xA4, 0x43, 0xE6, 0x96, 0xB0, 0x43, 0xE6, 0x96, 0xB9, 0x43, // Bytes cc0 - cff 0xE6, 0x97, 0x85, 0x43, 0xE6, 0x97, 0xA0, 0x43, 0xE6, 0x97, 0xA2, 0x43, 0xE6, 0x97, 0xA3, 0x43, 0xE6, 0x97, 0xA5, 0x43, 0xE6, 0x98, 0x93, 0x43, 0xE6, 0x98, 0xA0, 0x43, 0xE6, 0x99, 0x89, 0x43, 0xE6, 0x99, 0xB4, 0x43, 0xE6, 0x9A, 0x88, 0x43, 0xE6, 0x9A, 0x91, 0x43, 0xE6, 0x9A, 0x9C, 0x43, 0xE6, 0x9A, 0xB4, 0x43, 0xE6, 0x9B, 0x86, 0x43, 0xE6, 0x9B, 0xB0, 0x43, 0xE6, 0x9B, 0xB4, 0x43, // Bytes d00 - d3f 0xE6, 0x9B, 0xB8, 0x43, 0xE6, 0x9C, 0x80, 0x43, 0xE6, 0x9C, 0x88, 0x43, 0xE6, 0x9C, 0x89, 0x43, 0xE6, 0x9C, 0x97, 0x43, 0xE6, 0x9C, 0x9B, 0x43, 0xE6, 0x9C, 0xA1, 0x43, 0xE6, 0x9C, 0xA8, 0x43, 0xE6, 0x9D, 0x8E, 0x43, 0xE6, 0x9D, 0x93, 0x43, 0xE6, 0x9D, 0x96, 0x43, 0xE6, 0x9D, 0x9E, 0x43, 0xE6, 0x9D, 0xBB, 0x43, 0xE6, 0x9E, 0x85, 0x43, 0xE6, 0x9E, 0x97, 0x43, 0xE6, 0x9F, 0xB3, 0x43, // Bytes d40 - d7f 0xE6, 0x9F, 0xBA, 0x43, 0xE6, 0xA0, 0x97, 0x43, 0xE6, 0xA0, 0x9F, 0x43, 0xE6, 0xA0, 0xAA, 0x43, 0xE6, 0xA1, 0x92, 0x43, 0xE6, 0xA2, 0x81, 0x43, 0xE6, 0xA2, 0x85, 0x43, 0xE6, 0xA2, 0x8E, 0x43, 0xE6, 0xA2, 0xA8, 0x43, 0xE6, 0xA4, 0x94, 0x43, 0xE6, 0xA5, 0x82, 0x43, 0xE6, 0xA6, 0xA3, 0x43, 0xE6, 0xA7, 0xAA, 0x43, 0xE6, 0xA8, 0x82, 0x43, 0xE6, 0xA8, 0x93, 0x43, 0xE6, 0xAA, 0xA8, 0x43, // Bytes d80 - dbf 0xE6, 0xAB, 0x93, 0x43, 0xE6, 0xAB, 0x9B, 0x43, 0xE6, 0xAC, 0x84, 0x43, 0xE6, 0xAC, 0xA0, 0x43, 0xE6, 0xAC, 0xA1, 0x43, 0xE6, 0xAD, 0x94, 0x43, 0xE6, 0xAD, 0xA2, 0x43, 0xE6, 0xAD, 0xA3, 0x43, 0xE6, 0xAD, 0xB2, 0x43, 0xE6, 0xAD, 0xB7, 0x43, 0xE6, 0xAD, 0xB9, 0x43, 0xE6, 0xAE, 0x9F, 0x43, 0xE6, 0xAE, 0xAE, 0x43, 0xE6, 0xAE, 0xB3, 0x43, 0xE6, 0xAE, 0xBA, 0x43, 0xE6, 0xAE, 0xBB, 0x43, // Bytes dc0 - dff 0xE6, 0xAF, 0x8B, 0x43, 0xE6, 0xAF, 0x8D, 0x43, 0xE6, 0xAF, 0x94, 0x43, 0xE6, 0xAF, 0x9B, 0x43, 0xE6, 0xB0, 0x8F, 0x43, 0xE6, 0xB0, 0x94, 0x43, 0xE6, 0xB0, 0xB4, 0x43, 0xE6, 0xB1, 0x8E, 0x43, 0xE6, 0xB1, 0xA7, 0x43, 0xE6, 0xB2, 0x88, 0x43, 0xE6, 0xB2, 0xBF, 0x43, 0xE6, 0xB3, 0x8C, 0x43, 0xE6, 0xB3, 0x8D, 0x43, 0xE6, 0xB3, 0xA5, 0x43, 0xE6, 0xB3, 0xA8, 0x43, 0xE6, 0xB4, 0x96, 0x43, // Bytes e00 - e3f 0xE6, 0xB4, 0x9B, 0x43, 0xE6, 0xB4, 0x9E, 0x43, 0xE6, 0xB4, 0xB4, 0x43, 0xE6, 0xB4, 0xBE, 0x43, 0xE6, 0xB5, 0x81, 0x43, 0xE6, 0xB5, 0xA9, 0x43, 0xE6, 0xB5, 0xAA, 0x43, 0xE6, 0xB5, 0xB7, 0x43, 0xE6, 0xB5, 0xB8, 0x43, 0xE6, 0xB6, 0x85, 0x43, 0xE6, 0xB7, 0x8B, 0x43, 0xE6, 0xB7, 0x9A, 0x43, 0xE6, 0xB7, 0xAA, 0x43, 0xE6, 0xB7, 0xB9, 0x43, 0xE6, 0xB8, 0x9A, 0x43, 0xE6, 0xB8, 0xAF, 0x43, // Bytes e40 - e7f 0xE6, 0xB9, 0xAE, 0x43, 0xE6, 0xBA, 0x80, 0x43, 0xE6, 0xBA, 0x9C, 0x43, 0xE6, 0xBA, 0xBA, 0x43, 0xE6, 0xBB, 0x87, 0x43, 0xE6, 0xBB, 0x8B, 0x43, 0xE6, 0xBB, 0x91, 0x43, 0xE6, 0xBB, 0x9B, 0x43, 0xE6, 0xBC, 0x8F, 0x43, 0xE6, 0xBC, 0x94, 0x43, 0xE6, 0xBC, 0xA2, 0x43, 0xE6, 0xBC, 0xA3, 0x43, 0xE6, 0xBD, 0xAE, 0x43, 0xE6, 0xBF, 0x86, 0x43, 0xE6, 0xBF, 0xAB, 0x43, 0xE6, 0xBF, 0xBE, 0x43, // Bytes e80 - ebf 0xE7, 0x80, 0x9B, 0x43, 0xE7, 0x80, 0x9E, 0x43, 0xE7, 0x80, 0xB9, 0x43, 0xE7, 0x81, 0x8A, 0x43, 0xE7, 0x81, 0xAB, 0x43, 0xE7, 0x81, 0xB0, 0x43, 0xE7, 0x81, 0xB7, 0x43, 0xE7, 0x81, 0xBD, 0x43, 0xE7, 0x82, 0x99, 0x43, 0xE7, 0x82, 0xAD, 0x43, 0xE7, 0x83, 0x88, 0x43, 0xE7, 0x83, 0x99, 0x43, 0xE7, 0x84, 0xA1, 0x43, 0xE7, 0x85, 0x85, 0x43, 0xE7, 0x85, 0x89, 0x43, 0xE7, 0x85, 0xAE, 0x43, // Bytes ec0 - eff 0xE7, 0x86, 0x9C, 0x43, 0xE7, 0x87, 0x8E, 0x43, 0xE7, 0x87, 0x90, 0x43, 0xE7, 0x88, 0x90, 0x43, 0xE7, 0x88, 0x9B, 0x43, 0xE7, 0x88, 0xA8, 0x43, 0xE7, 0x88, 0xAA, 0x43, 0xE7, 0x88, 0xAB, 0x43, 0xE7, 0x88, 0xB5, 0x43, 0xE7, 0x88, 0xB6, 0x43, 0xE7, 0x88, 0xBB, 0x43, 0xE7, 0x88, 0xBF, 0x43, 0xE7, 0x89, 0x87, 0x43, 0xE7, 0x89, 0x90, 0x43, 0xE7, 0x89, 0x99, 0x43, 0xE7, 0x89, 0x9B, 0x43, // Bytes f00 - f3f 0xE7, 0x89, 0xA2, 0x43, 0xE7, 0x89, 0xB9, 0x43, 0xE7, 0x8A, 0x80, 0x43, 0xE7, 0x8A, 0x95, 0x43, 0xE7, 0x8A, 0xAC, 0x43, 0xE7, 0x8A, 0xAF, 0x43, 0xE7, 0x8B, 0x80, 0x43, 0xE7, 0x8B, 0xBC, 0x43, 0xE7, 0x8C, 0xAA, 0x43, 0xE7, 0x8D, 0xB5, 0x43, 0xE7, 0x8D, 0xBA, 0x43, 0xE7, 0x8E, 0x84, 0x43, 0xE7, 0x8E, 0x87, 0x43, 0xE7, 0x8E, 0x89, 0x43, 0xE7, 0x8E, 0x8B, 0x43, 0xE7, 0x8E, 0xA5, 0x43, // Bytes f40 - f7f 0xE7, 0x8E, 0xB2, 0x43, 0xE7, 0x8F, 0x9E, 0x43, 0xE7, 0x90, 0x86, 0x43, 0xE7, 0x90, 0x89, 0x43, 0xE7, 0x90, 0xA2, 0x43, 0xE7, 0x91, 0x87, 0x43, 0xE7, 0x91, 0x9C, 0x43, 0xE7, 0x91, 0xA9, 0x43, 0xE7, 0x91, 0xB1, 0x43, 0xE7, 0x92, 0x85, 0x43, 0xE7, 0x92, 0x89, 0x43, 0xE7, 0x92, 0x98, 0x43, 0xE7, 0x93, 0x8A, 0x43, 0xE7, 0x93, 0x9C, 0x43, 0xE7, 0x93, 0xA6, 0x43, 0xE7, 0x94, 0x86, 0x43, // Bytes f80 - fbf 0xE7, 0x94, 0x98, 0x43, 0xE7, 0x94, 0x9F, 0x43, 0xE7, 0x94, 0xA4, 0x43, 0xE7, 0x94, 0xA8, 0x43, 0xE7, 0x94, 0xB0, 0x43, 0xE7, 0x94, 0xB2, 0x43, 0xE7, 0x94, 0xB3, 0x43, 0xE7, 0x94, 0xB7, 0x43, 0xE7, 0x94, 0xBB, 0x43, 0xE7, 0x94, 0xBE, 0x43, 0xE7, 0x95, 0x99, 0x43, 0xE7, 0x95, 0xA5, 0x43, 0xE7, 0x95, 0xB0, 0x43, 0xE7, 0x96, 0x8B, 0x43, 0xE7, 0x96, 0x92, 0x43, 0xE7, 0x97, 0xA2, 0x43, // Bytes fc0 - fff 0xE7, 0x98, 0x90, 0x43, 0xE7, 0x98, 0x9D, 0x43, 0xE7, 0x98, 0x9F, 0x43, 0xE7, 0x99, 0x82, 0x43, 0xE7, 0x99, 0xA9, 0x43, 0xE7, 0x99, 0xB6, 0x43, 0xE7, 0x99, 0xBD, 0x43, 0xE7, 0x9A, 0xAE, 0x43, 0xE7, 0x9A, 0xBF, 0x43, 0xE7, 0x9B, 0x8A, 0x43, 0xE7, 0x9B, 0x9B, 0x43, 0xE7, 0x9B, 0xA3, 0x43, 0xE7, 0x9B, 0xA7, 0x43, 0xE7, 0x9B, 0xAE, 0x43, 0xE7, 0x9B, 0xB4, 0x43, 0xE7, 0x9C, 0x81, 0x43, // Bytes 1000 - 103f 0xE7, 0x9C, 0x9E, 0x43, 0xE7, 0x9C, 0x9F, 0x43, 0xE7, 0x9D, 0x80, 0x43, 0xE7, 0x9D, 0x8A, 0x43, 0xE7, 0x9E, 0x8B, 0x43, 0xE7, 0x9E, 0xA7, 0x43, 0xE7, 0x9F, 0x9B, 0x43, 0xE7, 0x9F, 0xA2, 0x43, 0xE7, 0x9F, 0xB3, 0x43, 0xE7, 0xA1, 0x8E, 0x43, 0xE7, 0xA1, 0xAB, 0x43, 0xE7, 0xA2, 0x8C, 0x43, 0xE7, 0xA2, 0x91, 0x43, 0xE7, 0xA3, 0x8A, 0x43, 0xE7, 0xA3, 0x8C, 0x43, 0xE7, 0xA3, 0xBB, 0x43, // Bytes 1040 - 107f 0xE7, 0xA4, 0xAA, 0x43, 0xE7, 0xA4, 0xBA, 0x43, 0xE7, 0xA4, 0xBC, 0x43, 0xE7, 0xA4, 0xBE, 0x43, 0xE7, 0xA5, 0x88, 0x43, 0xE7, 0xA5, 0x89, 0x43, 0xE7, 0xA5, 0x90, 0x43, 0xE7, 0xA5, 0x96, 0x43, 0xE7, 0xA5, 0x9D, 0x43, 0xE7, 0xA5, 0x9E, 0x43, 0xE7, 0xA5, 0xA5, 0x43, 0xE7, 0xA5, 0xBF, 0x43, 0xE7, 0xA6, 0x81, 0x43, 0xE7, 0xA6, 0x8D, 0x43, 0xE7, 0xA6, 0x8E, 0x43, 0xE7, 0xA6, 0x8F, 0x43, // Bytes 1080 - 10bf 0xE7, 0xA6, 0xAE, 0x43, 0xE7, 0xA6, 0xB8, 0x43, 0xE7, 0xA6, 0xBE, 0x43, 0xE7, 0xA7, 0x8A, 0x43, 0xE7, 0xA7, 0x98, 0x43, 0xE7, 0xA7, 0xAB, 0x43, 0xE7, 0xA8, 0x9C, 0x43, 0xE7, 0xA9, 0x80, 0x43, 0xE7, 0xA9, 0x8A, 0x43, 0xE7, 0xA9, 0x8F, 0x43, 0xE7, 0xA9, 0xB4, 0x43, 0xE7, 0xA9, 0xBA, 0x43, 0xE7, 0xAA, 0x81, 0x43, 0xE7, 0xAA, 0xB1, 0x43, 0xE7, 0xAB, 0x8B, 0x43, 0xE7, 0xAB, 0xAE, 0x43, // Bytes 10c0 - 10ff 0xE7, 0xAB, 0xB9, 0x43, 0xE7, 0xAC, 0xA0, 0x43, 0xE7, 0xAE, 0x8F, 0x43, 0xE7, 0xAF, 0x80, 0x43, 0xE7, 0xAF, 0x86, 0x43, 0xE7, 0xAF, 0x89, 0x43, 0xE7, 0xB0, 0xBE, 0x43, 0xE7, 0xB1, 0xA0, 0x43, 0xE7, 0xB1, 0xB3, 0x43, 0xE7, 0xB1, 0xBB, 0x43, 0xE7, 0xB2, 0x92, 0x43, 0xE7, 0xB2, 0xBE, 0x43, 0xE7, 0xB3, 0x92, 0x43, 0xE7, 0xB3, 0x96, 0x43, 0xE7, 0xB3, 0xA3, 0x43, 0xE7, 0xB3, 0xA7, 0x43, // Bytes 1100 - 113f 0xE7, 0xB3, 0xA8, 0x43, 0xE7, 0xB3, 0xB8, 0x43, 0xE7, 0xB4, 0x80, 0x43, 0xE7, 0xB4, 0x90, 0x43, 0xE7, 0xB4, 0xA2, 0x43, 0xE7, 0xB4, 0xAF, 0x43, 0xE7, 0xB5, 0x82, 0x43, 0xE7, 0xB5, 0x9B, 0x43, 0xE7, 0xB5, 0xA3, 0x43, 0xE7, 0xB6, 0xA0, 0x43, 0xE7, 0xB6, 0xBE, 0x43, 0xE7, 0xB7, 0x87, 0x43, 0xE7, 0xB7, 0xB4, 0x43, 0xE7, 0xB8, 0x82, 0x43, 0xE7, 0xB8, 0x89, 0x43, 0xE7, 0xB8, 0xB7, 0x43, // Bytes 1140 - 117f 0xE7, 0xB9, 0x81, 0x43, 0xE7, 0xB9, 0x85, 0x43, 0xE7, 0xBC, 0xB6, 0x43, 0xE7, 0xBC, 0xBE, 0x43, 0xE7, 0xBD, 0x91, 0x43, 0xE7, 0xBD, 0xB2, 0x43, 0xE7, 0xBD, 0xB9, 0x43, 0xE7, 0xBD, 0xBA, 0x43, 0xE7, 0xBE, 0x85, 0x43, 0xE7, 0xBE, 0x8A, 0x43, 0xE7, 0xBE, 0x95, 0x43, 0xE7, 0xBE, 0x9A, 0x43, 0xE7, 0xBE, 0xBD, 0x43, 0xE7, 0xBF, 0xBA, 0x43, 0xE8, 0x80, 0x81, 0x43, 0xE8, 0x80, 0x85, 0x43, // Bytes 1180 - 11bf 0xE8, 0x80, 0x8C, 0x43, 0xE8, 0x80, 0x92, 0x43, 0xE8, 0x80, 0xB3, 0x43, 0xE8, 0x81, 0x86, 0x43, 0xE8, 0x81, 0xA0, 0x43, 0xE8, 0x81, 0xAF, 0x43, 0xE8, 0x81, 0xB0, 0x43, 0xE8, 0x81, 0xBE, 0x43, 0xE8, 0x81, 0xBF, 0x43, 0xE8, 0x82, 0x89, 0x43, 0xE8, 0x82, 0x8B, 0x43, 0xE8, 0x82, 0xAD, 0x43, 0xE8, 0x82, 0xB2, 0x43, 0xE8, 0x84, 0x83, 0x43, 0xE8, 0x84, 0xBE, 0x43, 0xE8, 0x87, 0x98, 0x43, // Bytes 11c0 - 11ff 0xE8, 0x87, 0xA3, 0x43, 0xE8, 0x87, 0xA8, 0x43, 0xE8, 0x87, 0xAA, 0x43, 0xE8, 0x87, 0xAD, 0x43, 0xE8, 0x87, 0xB3, 0x43, 0xE8, 0x87, 0xBC, 0x43, 0xE8, 0x88, 0x81, 0x43, 0xE8, 0x88, 0x84, 0x43, 0xE8, 0x88, 0x8C, 0x43, 0xE8, 0x88, 0x98, 0x43, 0xE8, 0x88, 0x9B, 0x43, 0xE8, 0x88, 0x9F, 0x43, 0xE8, 0x89, 0xAE, 0x43, 0xE8, 0x89, 0xAF, 0x43, 0xE8, 0x89, 0xB2, 0x43, 0xE8, 0x89, 0xB8, 0x43, // Bytes 1200 - 123f 0xE8, 0x89, 0xB9, 0x43, 0xE8, 0x8A, 0x8B, 0x43, 0xE8, 0x8A, 0x91, 0x43, 0xE8, 0x8A, 0x9D, 0x43, 0xE8, 0x8A, 0xB1, 0x43, 0xE8, 0x8A, 0xB3, 0x43, 0xE8, 0x8A, 0xBD, 0x43, 0xE8, 0x8B, 0xA5, 0x43, 0xE8, 0x8B, 0xA6, 0x43, 0xE8, 0x8C, 0x9D, 0x43, 0xE8, 0x8C, 0xA3, 0x43, 0xE8, 0x8C, 0xB6, 0x43, 0xE8, 0x8D, 0x92, 0x43, 0xE8, 0x8D, 0x93, 0x43, 0xE8, 0x8D, 0xA3, 0x43, 0xE8, 0x8E, 0xAD, 0x43, // Bytes 1240 - 127f 0xE8, 0x8E, 0xBD, 0x43, 0xE8, 0x8F, 0x89, 0x43, 0xE8, 0x8F, 0x8A, 0x43, 0xE8, 0x8F, 0x8C, 0x43, 0xE8, 0x8F, 0x9C, 0x43, 0xE8, 0x8F, 0xA7, 0x43, 0xE8, 0x8F, 0xAF, 0x43, 0xE8, 0x8F, 0xB1, 0x43, 0xE8, 0x90, 0xBD, 0x43, 0xE8, 0x91, 0x89, 0x43, 0xE8, 0x91, 0x97, 0x43, 0xE8, 0x93, 0xAE, 0x43, 0xE8, 0x93, 0xB1, 0x43, 0xE8, 0x93, 0xB3, 0x43, 0xE8, 0x93, 0xBC, 0x43, 0xE8, 0x94, 0x96, 0x43, // Bytes 1280 - 12bf 0xE8, 0x95, 0xA4, 0x43, 0xE8, 0x97, 0x8D, 0x43, 0xE8, 0x97, 0xBA, 0x43, 0xE8, 0x98, 0x86, 0x43, 0xE8, 0x98, 0x92, 0x43, 0xE8, 0x98, 0xAD, 0x43, 0xE8, 0x98, 0xBF, 0x43, 0xE8, 0x99, 0x8D, 0x43, 0xE8, 0x99, 0x90, 0x43, 0xE8, 0x99, 0x9C, 0x43, 0xE8, 0x99, 0xA7, 0x43, 0xE8, 0x99, 0xA9, 0x43, 0xE8, 0x99, 0xAB, 0x43, 0xE8, 0x9A, 0x88, 0x43, 0xE8, 0x9A, 0xA9, 0x43, 0xE8, 0x9B, 0xA2, 0x43, // Bytes 12c0 - 12ff 0xE8, 0x9C, 0x8E, 0x43, 0xE8, 0x9C, 0xA8, 0x43, 0xE8, 0x9D, 0xAB, 0x43, 0xE8, 0x9D, 0xB9, 0x43, 0xE8, 0x9E, 0x86, 0x43, 0xE8, 0x9E, 0xBA, 0x43, 0xE8, 0x9F, 0xA1, 0x43, 0xE8, 0xA0, 0x81, 0x43, 0xE8, 0xA0, 0x9F, 0x43, 0xE8, 0xA1, 0x80, 0x43, 0xE8, 0xA1, 0x8C, 0x43, 0xE8, 0xA1, 0xA0, 0x43, 0xE8, 0xA1, 0xA3, 0x43, 0xE8, 0xA3, 0x82, 0x43, 0xE8, 0xA3, 0x8F, 0x43, 0xE8, 0xA3, 0x97, 0x43, // Bytes 1300 - 133f 0xE8, 0xA3, 0x9E, 0x43, 0xE8, 0xA3, 0xA1, 0x43, 0xE8, 0xA3, 0xB8, 0x43, 0xE8, 0xA3, 0xBA, 0x43, 0xE8, 0xA4, 0x90, 0x43, 0xE8, 0xA5, 0x81, 0x43, 0xE8, 0xA5, 0xA4, 0x43, 0xE8, 0xA5, 0xBE, 0x43, 0xE8, 0xA6, 0x86, 0x43, 0xE8, 0xA6, 0x8B, 0x43, 0xE8, 0xA6, 0x96, 0x43, 0xE8, 0xA7, 0x92, 0x43, 0xE8, 0xA7, 0xA3, 0x43, 0xE8, 0xA8, 0x80, 0x43, 0xE8, 0xAA, 0xA0, 0x43, 0xE8, 0xAA, 0xAA, 0x43, // Bytes 1340 - 137f 0xE8, 0xAA, 0xBF, 0x43, 0xE8, 0xAB, 0x8B, 0x43, 0xE8, 0xAB, 0x92, 0x43, 0xE8, 0xAB, 0x96, 0x43, 0xE8, 0xAB, 0xAD, 0x43, 0xE8, 0xAB, 0xB8, 0x43, 0xE8, 0xAB, 0xBE, 0x43, 0xE8, 0xAC, 0x81, 0x43, 0xE8, 0xAC, 0xB9, 0x43, 0xE8, 0xAD, 0x98, 0x43, 0xE8, 0xAE, 0x80, 0x43, 0xE8, 0xAE, 0x8A, 0x43, 0xE8, 0xB0, 0xB7, 0x43, 0xE8, 0xB1, 0x86, 0x43, 0xE8, 0xB1, 0x88, 0x43, 0xE8, 0xB1, 0x95, 0x43, // Bytes 1380 - 13bf 0xE8, 0xB1, 0xB8, 0x43, 0xE8, 0xB2, 0x9D, 0x43, 0xE8, 0xB2, 0xA1, 0x43, 0xE8, 0xB2, 0xA9, 0x43, 0xE8, 0xB2, 0xAB, 0x43, 0xE8, 0xB3, 0x81, 0x43, 0xE8, 0xB3, 0x82, 0x43, 0xE8, 0xB3, 0x87, 0x43, 0xE8, 0xB3, 0x88, 0x43, 0xE8, 0xB3, 0x93, 0x43, 0xE8, 0xB4, 0x88, 0x43, 0xE8, 0xB4, 0x9B, 0x43, 0xE8, 0xB5, 0xA4, 0x43, 0xE8, 0xB5, 0xB0, 0x43, 0xE8, 0xB5, 0xB7, 0x43, 0xE8, 0xB6, 0xB3, 0x43, // Bytes 13c0 - 13ff 0xE8, 0xB6, 0xBC, 0x43, 0xE8, 0xB7, 0x8B, 0x43, 0xE8, 0xB7, 0xAF, 0x43, 0xE8, 0xB7, 0xB0, 0x43, 0xE8, 0xBA, 0xAB, 0x43, 0xE8, 0xBB, 0x8A, 0x43, 0xE8, 0xBB, 0x94, 0x43, 0xE8, 0xBC, 0xA6, 0x43, 0xE8, 0xBC, 0xAA, 0x43, 0xE8, 0xBC, 0xB8, 0x43, 0xE8, 0xBC, 0xBB, 0x43, 0xE8, 0xBD, 0xA2, 0x43, 0xE8, 0xBE, 0x9B, 0x43, 0xE8, 0xBE, 0x9E, 0x43, 0xE8, 0xBE, 0xB0, 0x43, 0xE8, 0xBE, 0xB5, 0x43, // Bytes 1400 - 143f 0xE8, 0xBE, 0xB6, 0x43, 0xE9, 0x80, 0xA3, 0x43, 0xE9, 0x80, 0xB8, 0x43, 0xE9, 0x81, 0x8A, 0x43, 0xE9, 0x81, 0xA9, 0x43, 0xE9, 0x81, 0xB2, 0x43, 0xE9, 0x81, 0xBC, 0x43, 0xE9, 0x82, 0x8F, 0x43, 0xE9, 0x82, 0x91, 0x43, 0xE9, 0x82, 0x94, 0x43, 0xE9, 0x83, 0x8E, 0x43, 0xE9, 0x83, 0x9E, 0x43, 0xE9, 0x83, 0xB1, 0x43, 0xE9, 0x83, 0xBD, 0x43, 0xE9, 0x84, 0x91, 0x43, 0xE9, 0x84, 0x9B, 0x43, // Bytes 1440 - 147f 0xE9, 0x85, 0x89, 0x43, 0xE9, 0x85, 0x8D, 0x43, 0xE9, 0x85, 0xAA, 0x43, 0xE9, 0x86, 0x99, 0x43, 0xE9, 0x86, 0xB4, 0x43, 0xE9, 0x87, 0x86, 0x43, 0xE9, 0x87, 0x8C, 0x43, 0xE9, 0x87, 0x8F, 0x43, 0xE9, 0x87, 0x91, 0x43, 0xE9, 0x88, 0xB4, 0x43, 0xE9, 0x88, 0xB8, 0x43, 0xE9, 0x89, 0xB6, 0x43, 0xE9, 0x89, 0xBC, 0x43, 0xE9, 0x8B, 0x97, 0x43, 0xE9, 0x8B, 0x98, 0x43, 0xE9, 0x8C, 0x84, 0x43, // Bytes 1480 - 14bf 0xE9, 0x8D, 0x8A, 0x43, 0xE9, 0x8F, 0xB9, 0x43, 0xE9, 0x90, 0x95, 0x43, 0xE9, 0x95, 0xB7, 0x43, 0xE9, 0x96, 0x80, 0x43, 0xE9, 0x96, 0x8B, 0x43, 0xE9, 0x96, 0xAD, 0x43, 0xE9, 0x96, 0xB7, 0x43, 0xE9, 0x98, 0x9C, 0x43, 0xE9, 0x98, 0xAE, 0x43, 0xE9, 0x99, 0x8B, 0x43, 0xE9, 0x99, 0x8D, 0x43, 0xE9, 0x99, 0xB5, 0x43, 0xE9, 0x99, 0xB8, 0x43, 0xE9, 0x99, 0xBC, 0x43, 0xE9, 0x9A, 0x86, 0x43, // Bytes 14c0 - 14ff 0xE9, 0x9A, 0xA3, 0x43, 0xE9, 0x9A, 0xB6, 0x43, 0xE9, 0x9A, 0xB7, 0x43, 0xE9, 0x9A, 0xB8, 0x43, 0xE9, 0x9A, 0xB9, 0x43, 0xE9, 0x9B, 0x83, 0x43, 0xE9, 0x9B, 0xA2, 0x43, 0xE9, 0x9B, 0xA3, 0x43, 0xE9, 0x9B, 0xA8, 0x43, 0xE9, 0x9B, 0xB6, 0x43, 0xE9, 0x9B, 0xB7, 0x43, 0xE9, 0x9C, 0xA3, 0x43, 0xE9, 0x9C, 0xB2, 0x43, 0xE9, 0x9D, 0x88, 0x43, 0xE9, 0x9D, 0x91, 0x43, 0xE9, 0x9D, 0x96, 0x43, // Bytes 1500 - 153f 0xE9, 0x9D, 0x9E, 0x43, 0xE9, 0x9D, 0xA2, 0x43, 0xE9, 0x9D, 0xA9, 0x43, 0xE9, 0x9F, 0x8B, 0x43, 0xE9, 0x9F, 0x9B, 0x43, 0xE9, 0x9F, 0xA0, 0x43, 0xE9, 0x9F, 0xAD, 0x43, 0xE9, 0x9F, 0xB3, 0x43, 0xE9, 0x9F, 0xBF, 0x43, 0xE9, 0xA0, 0x81, 0x43, 0xE9, 0xA0, 0x85, 0x43, 0xE9, 0xA0, 0x8B, 0x43, 0xE9, 0xA0, 0x98, 0x43, 0xE9, 0xA0, 0xA9, 0x43, 0xE9, 0xA0, 0xBB, 0x43, 0xE9, 0xA1, 0x9E, 0x43, // Bytes 1540 - 157f 0xE9, 0xA2, 0xA8, 0x43, 0xE9, 0xA3, 0x9B, 0x43, 0xE9, 0xA3, 0x9F, 0x43, 0xE9, 0xA3, 0xA2, 0x43, 0xE9, 0xA3, 0xAF, 0x43, 0xE9, 0xA3, 0xBC, 0x43, 0xE9, 0xA4, 0xA8, 0x43, 0xE9, 0xA4, 0xA9, 0x43, 0xE9, 0xA6, 0x96, 0x43, 0xE9, 0xA6, 0x99, 0x43, 0xE9, 0xA6, 0xA7, 0x43, 0xE9, 0xA6, 0xAC, 0x43, 0xE9, 0xA7, 0x82, 0x43, 0xE9, 0xA7, 0xB1, 0x43, 0xE9, 0xA7, 0xBE, 0x43, 0xE9, 0xA9, 0xAA, 0x43, // Bytes 1580 - 15bf 0xE9, 0xAA, 0xA8, 0x43, 0xE9, 0xAB, 0x98, 0x43, 0xE9, 0xAB, 0x9F, 0x43, 0xE9, 0xAC, 0x92, 0x43, 0xE9, 0xAC, 0xA5, 0x43, 0xE9, 0xAC, 0xAF, 0x43, 0xE9, 0xAC, 0xB2, 0x43, 0xE9, 0xAC, 0xBC, 0x43, 0xE9, 0xAD, 0x9A, 0x43, 0xE9, 0xAD, 0xAF, 0x43, 0xE9, 0xB1, 0x80, 0x43, 0xE9, 0xB1, 0x97, 0x43, 0xE9, 0xB3, 0xA5, 0x43, 0xE9, 0xB3, 0xBD, 0x43, 0xE9, 0xB5, 0xA7, 0x43, 0xE9, 0xB6, 0xB4, 0x43, // Bytes 15c0 - 15ff 0xE9, 0xB7, 0xBA, 0x43, 0xE9, 0xB8, 0x9E, 0x43, 0xE9, 0xB9, 0xB5, 0x43, 0xE9, 0xB9, 0xBF, 0x43, 0xE9, 0xBA, 0x97, 0x43, 0xE9, 0xBA, 0x9F, 0x43, 0xE9, 0xBA, 0xA5, 0x43, 0xE9, 0xBA, 0xBB, 0x43, 0xE9, 0xBB, 0x83, 0x43, 0xE9, 0xBB, 0x8D, 0x43, 0xE9, 0xBB, 0x8E, 0x43, 0xE9, 0xBB, 0x91, 0x43, 0xE9, 0xBB, 0xB9, 0x43, 0xE9, 0xBB, 0xBD, 0x43, 0xE9, 0xBB, 0xBE, 0x43, 0xE9, 0xBC, 0x85, 0x43, // Bytes 1600 - 163f 0xE9, 0xBC, 0x8E, 0x43, 0xE9, 0xBC, 0x8F, 0x43, 0xE9, 0xBC, 0x93, 0x43, 0xE9, 0xBC, 0x96, 0x43, 0xE9, 0xBC, 0xA0, 0x43, 0xE9, 0xBC, 0xBB, 0x43, 0xE9, 0xBD, 0x83, 0x43, 0xE9, 0xBD, 0x8A, 0x43, 0xE9, 0xBD, 0x92, 0x43, 0xE9, 0xBE, 0x8D, 0x43, 0xE9, 0xBE, 0x8E, 0x43, 0xE9, 0xBE, 0x9C, 0x43, 0xE9, 0xBE, 0x9F, 0x43, 0xE9, 0xBE, 0xA0, 0x43, 0xEA, 0x9C, 0xA7, 0x43, 0xEA, 0x9D, 0xAF, 0x43, // Bytes 1640 - 167f 0xEA, 0xAC, 0xB7, 0x43, 0xEA, 0xAD, 0x92, 0x44, 0xF0, 0xA0, 0x84, 0xA2, 0x44, 0xF0, 0xA0, 0x94, 0x9C, 0x44, 0xF0, 0xA0, 0x94, 0xA5, 0x44, 0xF0, 0xA0, 0x95, 0x8B, 0x44, 0xF0, 0xA0, 0x98, 0xBA, 0x44, 0xF0, 0xA0, 0xA0, 0x84, 0x44, 0xF0, 0xA0, 0xA3, 0x9E, 0x44, 0xF0, 0xA0, 0xA8, 0xAC, 0x44, 0xF0, 0xA0, 0xAD, 0xA3, 0x44, 0xF0, 0xA1, 0x93, 0xA4, 0x44, 0xF0, 0xA1, 0x9A, 0xA8, 0x44, 0xF0, // Bytes 1680 - 16bf 0xA1, 0x9B, 0xAA, 0x44, 0xF0, 0xA1, 0xA7, 0x88, 0x44, 0xF0, 0xA1, 0xAC, 0x98, 0x44, 0xF0, 0xA1, 0xB4, 0x8B, 0x44, 0xF0, 0xA1, 0xB7, 0xA4, 0x44, 0xF0, 0xA1, 0xB7, 0xA6, 0x44, 0xF0, 0xA2, 0x86, 0x83, 0x44, 0xF0, 0xA2, 0x86, 0x9F, 0x44, 0xF0, 0xA2, 0x8C, 0xB1, 0x44, 0xF0, 0xA2, 0x9B, 0x94, 0x44, 0xF0, 0xA2, 0xA1, 0x84, 0x44, 0xF0, 0xA2, 0xA1, 0x8A, 0x44, 0xF0, 0xA2, 0xAC, 0x8C, 0x44, // Bytes 16c0 - 16ff 0xF0, 0xA2, 0xAF, 0xB1, 0x44, 0xF0, 0xA3, 0x80, 0x8A, 0x44, 0xF0, 0xA3, 0x8A, 0xB8, 0x44, 0xF0, 0xA3, 0x8D, 0x9F, 0x44, 0xF0, 0xA3, 0x8E, 0x93, 0x44, 0xF0, 0xA3, 0x8E, 0x9C, 0x44, 0xF0, 0xA3, 0x8F, 0x83, 0x44, 0xF0, 0xA3, 0x8F, 0x95, 0x44, 0xF0, 0xA3, 0x91, 0xAD, 0x44, 0xF0, 0xA3, 0x9A, 0xA3, 0x44, 0xF0, 0xA3, 0xA2, 0xA7, 0x44, 0xF0, 0xA3, 0xAA, 0x8D, 0x44, 0xF0, 0xA3, 0xAB, 0xBA, // Bytes 1700 - 173f 0x44, 0xF0, 0xA3, 0xB2, 0xBC, 0x44, 0xF0, 0xA3, 0xB4, 0x9E, 0x44, 0xF0, 0xA3, 0xBB, 0x91, 0x44, 0xF0, 0xA3, 0xBD, 0x9E, 0x44, 0xF0, 0xA3, 0xBE, 0x8E, 0x44, 0xF0, 0xA4, 0x89, 0xA3, 0x44, 0xF0, 0xA4, 0x8B, 0xAE, 0x44, 0xF0, 0xA4, 0x8E, 0xAB, 0x44, 0xF0, 0xA4, 0x98, 0x88, 0x44, 0xF0, 0xA4, 0x9C, 0xB5, 0x44, 0xF0, 0xA4, 0xA0, 0x94, 0x44, 0xF0, 0xA4, 0xB0, 0xB6, 0x44, 0xF0, 0xA4, 0xB2, // Bytes 1740 - 177f 0x92, 0x44, 0xF0, 0xA4, 0xBE, 0xA1, 0x44, 0xF0, 0xA4, 0xBE, 0xB8, 0x44, 0xF0, 0xA5, 0x81, 0x84, 0x44, 0xF0, 0xA5, 0x83, 0xB2, 0x44, 0xF0, 0xA5, 0x83, 0xB3, 0x44, 0xF0, 0xA5, 0x84, 0x99, 0x44, 0xF0, 0xA5, 0x84, 0xB3, 0x44, 0xF0, 0xA5, 0x89, 0x89, 0x44, 0xF0, 0xA5, 0x90, 0x9D, 0x44, 0xF0, 0xA5, 0x98, 0xA6, 0x44, 0xF0, 0xA5, 0x9A, 0x9A, 0x44, 0xF0, 0xA5, 0x9B, 0x85, 0x44, 0xF0, 0xA5, // Bytes 1780 - 17bf 0xA5, 0xBC, 0x44, 0xF0, 0xA5, 0xAA, 0xA7, 0x44, 0xF0, 0xA5, 0xAE, 0xAB, 0x44, 0xF0, 0xA5, 0xB2, 0x80, 0x44, 0xF0, 0xA5, 0xB3, 0x90, 0x44, 0xF0, 0xA5, 0xBE, 0x86, 0x44, 0xF0, 0xA6, 0x87, 0x9A, 0x44, 0xF0, 0xA6, 0x88, 0xA8, 0x44, 0xF0, 0xA6, 0x89, 0x87, 0x44, 0xF0, 0xA6, 0x8B, 0x99, 0x44, 0xF0, 0xA6, 0x8C, 0xBE, 0x44, 0xF0, 0xA6, 0x93, 0x9A, 0x44, 0xF0, 0xA6, 0x94, 0xA3, 0x44, 0xF0, // Bytes 17c0 - 17ff 0xA6, 0x96, 0xA8, 0x44, 0xF0, 0xA6, 0x9E, 0xA7, 0x44, 0xF0, 0xA6, 0x9E, 0xB5, 0x44, 0xF0, 0xA6, 0xAC, 0xBC, 0x44, 0xF0, 0xA6, 0xB0, 0xB6, 0x44, 0xF0, 0xA6, 0xB3, 0x95, 0x44, 0xF0, 0xA6, 0xB5, 0xAB, 0x44, 0xF0, 0xA6, 0xBC, 0xAC, 0x44, 0xF0, 0xA6, 0xBE, 0xB1, 0x44, 0xF0, 0xA7, 0x83, 0x92, 0x44, 0xF0, 0xA7, 0x8F, 0x8A, 0x44, 0xF0, 0xA7, 0x99, 0xA7, 0x44, 0xF0, 0xA7, 0xA2, 0xAE, 0x44, // Bytes 1800 - 183f 0xF0, 0xA7, 0xA5, 0xA6, 0x44, 0xF0, 0xA7, 0xB2, 0xA8, 0x44, 0xF0, 0xA7, 0xBB, 0x93, 0x44, 0xF0, 0xA7, 0xBC, 0xAF, 0x44, 0xF0, 0xA8, 0x97, 0x92, 0x44, 0xF0, 0xA8, 0x97, 0xAD, 0x44, 0xF0, 0xA8, 0x9C, 0xAE, 0x44, 0xF0, 0xA8, 0xAF, 0xBA, 0x44, 0xF0, 0xA8, 0xB5, 0xB7, 0x44, 0xF0, 0xA9, 0x85, 0x85, 0x44, 0xF0, 0xA9, 0x87, 0x9F, 0x44, 0xF0, 0xA9, 0x88, 0x9A, 0x44, 0xF0, 0xA9, 0x90, 0x8A, // Bytes 1840 - 187f 0x44, 0xF0, 0xA9, 0x92, 0x96, 0x44, 0xF0, 0xA9, 0x96, 0xB6, 0x44, 0xF0, 0xA9, 0xAC, 0xB0, 0x44, 0xF0, 0xAA, 0x83, 0x8E, 0x44, 0xF0, 0xAA, 0x84, 0x85, 0x44, 0xF0, 0xAA, 0x88, 0x8E, 0x44, 0xF0, 0xAA, 0x8A, 0x91, 0x44, 0xF0, 0xAA, 0x8E, 0x92, 0x44, 0xF0, 0xAA, 0x98, 0x80, 0x42, 0x21, 0x21, 0x42, 0x21, 0x3F, 0x42, 0x2E, 0x2E, 0x42, 0x30, 0x2C, 0x42, 0x30, 0x2E, 0x42, 0x31, 0x2C, 0x42, // Bytes 1880 - 18bf 0x31, 0x2E, 0x42, 0x31, 0x30, 0x42, 0x31, 0x31, 0x42, 0x31, 0x32, 0x42, 0x31, 0x33, 0x42, 0x31, 0x34, 0x42, 0x31, 0x35, 0x42, 0x31, 0x36, 0x42, 0x31, 0x37, 0x42, 0x31, 0x38, 0x42, 0x31, 0x39, 0x42, 0x32, 0x2C, 0x42, 0x32, 0x2E, 0x42, 0x32, 0x30, 0x42, 0x32, 0x31, 0x42, 0x32, 0x32, 0x42, 0x32, 0x33, 0x42, 0x32, 0x34, 0x42, 0x32, 0x35, 0x42, 0x32, 0x36, 0x42, 0x32, 0x37, 0x42, 0x32, // Bytes 18c0 - 18ff 0x38, 0x42, 0x32, 0x39, 0x42, 0x33, 0x2C, 0x42, 0x33, 0x2E, 0x42, 0x33, 0x30, 0x42, 0x33, 0x31, 0x42, 0x33, 0x32, 0x42, 0x33, 0x33, 0x42, 0x33, 0x34, 0x42, 0x33, 0x35, 0x42, 0x33, 0x36, 0x42, 0x33, 0x37, 0x42, 0x33, 0x38, 0x42, 0x33, 0x39, 0x42, 0x34, 0x2C, 0x42, 0x34, 0x2E, 0x42, 0x34, 0x30, 0x42, 0x34, 0x31, 0x42, 0x34, 0x32, 0x42, 0x34, 0x33, 0x42, 0x34, 0x34, 0x42, 0x34, 0x35, // Bytes 1900 - 193f 0x42, 0x34, 0x36, 0x42, 0x34, 0x37, 0x42, 0x34, 0x38, 0x42, 0x34, 0x39, 0x42, 0x35, 0x2C, 0x42, 0x35, 0x2E, 0x42, 0x35, 0x30, 0x42, 0x36, 0x2C, 0x42, 0x36, 0x2E, 0x42, 0x37, 0x2C, 0x42, 0x37, 0x2E, 0x42, 0x38, 0x2C, 0x42, 0x38, 0x2E, 0x42, 0x39, 0x2C, 0x42, 0x39, 0x2E, 0x42, 0x3D, 0x3D, 0x42, 0x3F, 0x21, 0x42, 0x3F, 0x3F, 0x42, 0x41, 0x55, 0x42, 0x42, 0x71, 0x42, 0x43, 0x44, 0x42, // Bytes 1940 - 197f 0x44, 0x4A, 0x42, 0x44, 0x5A, 0x42, 0x44, 0x7A, 0x42, 0x47, 0x42, 0x42, 0x47, 0x79, 0x42, 0x48, 0x50, 0x42, 0x48, 0x56, 0x42, 0x48, 0x67, 0x42, 0x48, 0x7A, 0x42, 0x49, 0x49, 0x42, 0x49, 0x4A, 0x42, 0x49, 0x55, 0x42, 0x49, 0x56, 0x42, 0x49, 0x58, 0x42, 0x4B, 0x42, 0x42, 0x4B, 0x4B, 0x42, 0x4B, 0x4D, 0x42, 0x4C, 0x4A, 0x42, 0x4C, 0x6A, 0x42, 0x4D, 0x42, 0x42, 0x4D, 0x43, 0x42, 0x4D, // Bytes 1980 - 19bf 0x44, 0x42, 0x4D, 0x56, 0x42, 0x4D, 0x57, 0x42, 0x4E, 0x4A, 0x42, 0x4E, 0x6A, 0x42, 0x4E, 0x6F, 0x42, 0x50, 0x48, 0x42, 0x50, 0x52, 0x42, 0x50, 0x61, 0x42, 0x52, 0x73, 0x42, 0x53, 0x44, 0x42, 0x53, 0x4D, 0x42, 0x53, 0x53, 0x42, 0x53, 0x76, 0x42, 0x54, 0x4D, 0x42, 0x56, 0x49, 0x42, 0x57, 0x43, 0x42, 0x57, 0x5A, 0x42, 0x57, 0x62, 0x42, 0x58, 0x49, 0x42, 0x63, 0x63, 0x42, 0x63, 0x64, // Bytes 19c0 - 19ff 0x42, 0x63, 0x6D, 0x42, 0x64, 0x42, 0x42, 0x64, 0x61, 0x42, 0x64, 0x6C, 0x42, 0x64, 0x6D, 0x42, 0x64, 0x7A, 0x42, 0x65, 0x56, 0x42, 0x66, 0x66, 0x42, 0x66, 0x69, 0x42, 0x66, 0x6C, 0x42, 0x66, 0x6D, 0x42, 0x68, 0x61, 0x42, 0x69, 0x69, 0x42, 0x69, 0x6A, 0x42, 0x69, 0x6E, 0x42, 0x69, 0x76, 0x42, 0x69, 0x78, 0x42, 0x6B, 0x41, 0x42, 0x6B, 0x56, 0x42, 0x6B, 0x57, 0x42, 0x6B, 0x67, 0x42, // Bytes 1a00 - 1a3f 0x6B, 0x6C, 0x42, 0x6B, 0x6D, 0x42, 0x6B, 0x74, 0x42, 0x6C, 0x6A, 0x42, 0x6C, 0x6D, 0x42, 0x6C, 0x6E, 0x42, 0x6C, 0x78, 0x42, 0x6D, 0x32, 0x42, 0x6D, 0x33, 0x42, 0x6D, 0x41, 0x42, 0x6D, 0x56, 0x42, 0x6D, 0x57, 0x42, 0x6D, 0x62, 0x42, 0x6D, 0x67, 0x42, 0x6D, 0x6C, 0x42, 0x6D, 0x6D, 0x42, 0x6D, 0x73, 0x42, 0x6E, 0x41, 0x42, 0x6E, 0x46, 0x42, 0x6E, 0x56, 0x42, 0x6E, 0x57, 0x42, 0x6E, // Bytes 1a40 - 1a7f 0x6A, 0x42, 0x6E, 0x6D, 0x42, 0x6E, 0x73, 0x42, 0x6F, 0x56, 0x42, 0x70, 0x41, 0x42, 0x70, 0x46, 0x42, 0x70, 0x56, 0x42, 0x70, 0x57, 0x42, 0x70, 0x63, 0x42, 0x70, 0x73, 0x42, 0x73, 0x72, 0x42, 0x73, 0x74, 0x42, 0x76, 0x69, 0x42, 0x78, 0x69, 0x43, 0x28, 0x31, 0x29, 0x43, 0x28, 0x32, 0x29, 0x43, 0x28, 0x33, 0x29, 0x43, 0x28, 0x34, 0x29, 0x43, 0x28, 0x35, 0x29, 0x43, 0x28, 0x36, 0x29, // Bytes 1a80 - 1abf 0x43, 0x28, 0x37, 0x29, 0x43, 0x28, 0x38, 0x29, 0x43, 0x28, 0x39, 0x29, 0x43, 0x28, 0x41, 0x29, 0x43, 0x28, 0x42, 0x29, 0x43, 0x28, 0x43, 0x29, 0x43, 0x28, 0x44, 0x29, 0x43, 0x28, 0x45, 0x29, 0x43, 0x28, 0x46, 0x29, 0x43, 0x28, 0x47, 0x29, 0x43, 0x28, 0x48, 0x29, 0x43, 0x28, 0x49, 0x29, 0x43, 0x28, 0x4A, 0x29, 0x43, 0x28, 0x4B, 0x29, 0x43, 0x28, 0x4C, 0x29, 0x43, 0x28, 0x4D, 0x29, // Bytes 1ac0 - 1aff 0x43, 0x28, 0x4E, 0x29, 0x43, 0x28, 0x4F, 0x29, 0x43, 0x28, 0x50, 0x29, 0x43, 0x28, 0x51, 0x29, 0x43, 0x28, 0x52, 0x29, 0x43, 0x28, 0x53, 0x29, 0x43, 0x28, 0x54, 0x29, 0x43, 0x28, 0x55, 0x29, 0x43, 0x28, 0x56, 0x29, 0x43, 0x28, 0x57, 0x29, 0x43, 0x28, 0x58, 0x29, 0x43, 0x28, 0x59, 0x29, 0x43, 0x28, 0x5A, 0x29, 0x43, 0x28, 0x61, 0x29, 0x43, 0x28, 0x62, 0x29, 0x43, 0x28, 0x63, 0x29, // Bytes 1b00 - 1b3f 0x43, 0x28, 0x64, 0x29, 0x43, 0x28, 0x65, 0x29, 0x43, 0x28, 0x66, 0x29, 0x43, 0x28, 0x67, 0x29, 0x43, 0x28, 0x68, 0x29, 0x43, 0x28, 0x69, 0x29, 0x43, 0x28, 0x6A, 0x29, 0x43, 0x28, 0x6B, 0x29, 0x43, 0x28, 0x6C, 0x29, 0x43, 0x28, 0x6D, 0x29, 0x43, 0x28, 0x6E, 0x29, 0x43, 0x28, 0x6F, 0x29, 0x43, 0x28, 0x70, 0x29, 0x43, 0x28, 0x71, 0x29, 0x43, 0x28, 0x72, 0x29, 0x43, 0x28, 0x73, 0x29, // Bytes 1b40 - 1b7f 0x43, 0x28, 0x74, 0x29, 0x43, 0x28, 0x75, 0x29, 0x43, 0x28, 0x76, 0x29, 0x43, 0x28, 0x77, 0x29, 0x43, 0x28, 0x78, 0x29, 0x43, 0x28, 0x79, 0x29, 0x43, 0x28, 0x7A, 0x29, 0x43, 0x2E, 0x2E, 0x2E, 0x43, 0x31, 0x30, 0x2E, 0x43, 0x31, 0x31, 0x2E, 0x43, 0x31, 0x32, 0x2E, 0x43, 0x31, 0x33, 0x2E, 0x43, 0x31, 0x34, 0x2E, 0x43, 0x31, 0x35, 0x2E, 0x43, 0x31, 0x36, 0x2E, 0x43, 0x31, 0x37, 0x2E, // Bytes 1b80 - 1bbf 0x43, 0x31, 0x38, 0x2E, 0x43, 0x31, 0x39, 0x2E, 0x43, 0x32, 0x30, 0x2E, 0x43, 0x3A, 0x3A, 0x3D, 0x43, 0x3D, 0x3D, 0x3D, 0x43, 0x43, 0x6F, 0x2E, 0x43, 0x46, 0x41, 0x58, 0x43, 0x47, 0x48, 0x7A, 0x43, 0x47, 0x50, 0x61, 0x43, 0x49, 0x49, 0x49, 0x43, 0x4C, 0x54, 0x44, 0x43, 0x4C, 0xC2, 0xB7, 0x43, 0x4D, 0x48, 0x7A, 0x43, 0x4D, 0x50, 0x61, 0x43, 0x4D, 0xCE, 0xA9, 0x43, 0x50, 0x50, 0x4D, // Bytes 1bc0 - 1bff 0x43, 0x50, 0x50, 0x56, 0x43, 0x50, 0x54, 0x45, 0x43, 0x54, 0x45, 0x4C, 0x43, 0x54, 0x48, 0x7A, 0x43, 0x56, 0x49, 0x49, 0x43, 0x58, 0x49, 0x49, 0x43, 0x61, 0x2F, 0x63, 0x43, 0x61, 0x2F, 0x73, 0x43, 0x61, 0xCA, 0xBE, 0x43, 0x62, 0x61, 0x72, 0x43, 0x63, 0x2F, 0x6F, 0x43, 0x63, 0x2F, 0x75, 0x43, 0x63, 0x61, 0x6C, 0x43, 0x63, 0x6D, 0x32, 0x43, 0x63, 0x6D, 0x33, 0x43, 0x64, 0x6D, 0x32, // Bytes 1c00 - 1c3f 0x43, 0x64, 0x6D, 0x33, 0x43, 0x65, 0x72, 0x67, 0x43, 0x66, 0x66, 0x69, 0x43, 0x66, 0x66, 0x6C, 0x43, 0x67, 0x61, 0x6C, 0x43, 0x68, 0x50, 0x61, 0x43, 0x69, 0x69, 0x69, 0x43, 0x6B, 0x48, 0x7A, 0x43, 0x6B, 0x50, 0x61, 0x43, 0x6B, 0x6D, 0x32, 0x43, 0x6B, 0x6D, 0x33, 0x43, 0x6B, 0xCE, 0xA9, 0x43, 0x6C, 0x6F, 0x67, 0x43, 0x6C, 0xC2, 0xB7, 0x43, 0x6D, 0x69, 0x6C, 0x43, 0x6D, 0x6D, 0x32, // Bytes 1c40 - 1c7f 0x43, 0x6D, 0x6D, 0x33, 0x43, 0x6D, 0x6F, 0x6C, 0x43, 0x72, 0x61, 0x64, 0x43, 0x76, 0x69, 0x69, 0x43, 0x78, 0x69, 0x69, 0x43, 0xC2, 0xB0, 0x43, 0x43, 0xC2, 0xB0, 0x46, 0x43, 0xCA, 0xBC, 0x6E, 0x43, 0xCE, 0xBC, 0x41, 0x43, 0xCE, 0xBC, 0x46, 0x43, 0xCE, 0xBC, 0x56, 0x43, 0xCE, 0xBC, 0x57, 0x43, 0xCE, 0xBC, 0x67, 0x43, 0xCE, 0xBC, 0x6C, 0x43, 0xCE, 0xBC, 0x6D, 0x43, 0xCE, 0xBC, 0x73, // Bytes 1c80 - 1cbf 0x44, 0x28, 0x31, 0x30, 0x29, 0x44, 0x28, 0x31, 0x31, 0x29, 0x44, 0x28, 0x31, 0x32, 0x29, 0x44, 0x28, 0x31, 0x33, 0x29, 0x44, 0x28, 0x31, 0x34, 0x29, 0x44, 0x28, 0x31, 0x35, 0x29, 0x44, 0x28, 0x31, 0x36, 0x29, 0x44, 0x28, 0x31, 0x37, 0x29, 0x44, 0x28, 0x31, 0x38, 0x29, 0x44, 0x28, 0x31, 0x39, 0x29, 0x44, 0x28, 0x32, 0x30, 0x29, 0x44, 0x30, 0xE7, 0x82, 0xB9, 0x44, 0x31, 0xE2, 0x81, // Bytes 1cc0 - 1cff 0x84, 0x44, 0x31, 0xE6, 0x97, 0xA5, 0x44, 0x31, 0xE6, 0x9C, 0x88, 0x44, 0x31, 0xE7, 0x82, 0xB9, 0x44, 0x32, 0xE6, 0x97, 0xA5, 0x44, 0x32, 0xE6, 0x9C, 0x88, 0x44, 0x32, 0xE7, 0x82, 0xB9, 0x44, 0x33, 0xE6, 0x97, 0xA5, 0x44, 0x33, 0xE6, 0x9C, 0x88, 0x44, 0x33, 0xE7, 0x82, 0xB9, 0x44, 0x34, 0xE6, 0x97, 0xA5, 0x44, 0x34, 0xE6, 0x9C, 0x88, 0x44, 0x34, 0xE7, 0x82, 0xB9, 0x44, 0x35, 0xE6, // Bytes 1d00 - 1d3f 0x97, 0xA5, 0x44, 0x35, 0xE6, 0x9C, 0x88, 0x44, 0x35, 0xE7, 0x82, 0xB9, 0x44, 0x36, 0xE6, 0x97, 0xA5, 0x44, 0x36, 0xE6, 0x9C, 0x88, 0x44, 0x36, 0xE7, 0x82, 0xB9, 0x44, 0x37, 0xE6, 0x97, 0xA5, 0x44, 0x37, 0xE6, 0x9C, 0x88, 0x44, 0x37, 0xE7, 0x82, 0xB9, 0x44, 0x38, 0xE6, 0x97, 0xA5, 0x44, 0x38, 0xE6, 0x9C, 0x88, 0x44, 0x38, 0xE7, 0x82, 0xB9, 0x44, 0x39, 0xE6, 0x97, 0xA5, 0x44, 0x39, // Bytes 1d40 - 1d7f 0xE6, 0x9C, 0x88, 0x44, 0x39, 0xE7, 0x82, 0xB9, 0x44, 0x56, 0x49, 0x49, 0x49, 0x44, 0x61, 0x2E, 0x6D, 0x2E, 0x44, 0x6B, 0x63, 0x61, 0x6C, 0x44, 0x70, 0x2E, 0x6D, 0x2E, 0x44, 0x76, 0x69, 0x69, 0x69, 0x44, 0xD5, 0xA5, 0xD6, 0x82, 0x44, 0xD5, 0xB4, 0xD5, 0xA5, 0x44, 0xD5, 0xB4, 0xD5, 0xAB, 0x44, 0xD5, 0xB4, 0xD5, 0xAD, 0x44, 0xD5, 0xB4, 0xD5, 0xB6, 0x44, 0xD5, 0xBE, 0xD5, 0xB6, 0x44, // Bytes 1d80 - 1dbf 0xD7, 0x90, 0xD7, 0x9C, 0x44, 0xD8, 0xA7, 0xD9, 0xB4, 0x44, 0xD8, 0xA8, 0xD8, 0xAC, 0x44, 0xD8, 0xA8, 0xD8, 0xAD, 0x44, 0xD8, 0xA8, 0xD8, 0xAE, 0x44, 0xD8, 0xA8, 0xD8, 0xB1, 0x44, 0xD8, 0xA8, 0xD8, 0xB2, 0x44, 0xD8, 0xA8, 0xD9, 0x85, 0x44, 0xD8, 0xA8, 0xD9, 0x86, 0x44, 0xD8, 0xA8, 0xD9, 0x87, 0x44, 0xD8, 0xA8, 0xD9, 0x89, 0x44, 0xD8, 0xA8, 0xD9, 0x8A, 0x44, 0xD8, 0xAA, 0xD8, 0xAC, // Bytes 1dc0 - 1dff 0x44, 0xD8, 0xAA, 0xD8, 0xAD, 0x44, 0xD8, 0xAA, 0xD8, 0xAE, 0x44, 0xD8, 0xAA, 0xD8, 0xB1, 0x44, 0xD8, 0xAA, 0xD8, 0xB2, 0x44, 0xD8, 0xAA, 0xD9, 0x85, 0x44, 0xD8, 0xAA, 0xD9, 0x86, 0x44, 0xD8, 0xAA, 0xD9, 0x87, 0x44, 0xD8, 0xAA, 0xD9, 0x89, 0x44, 0xD8, 0xAA, 0xD9, 0x8A, 0x44, 0xD8, 0xAB, 0xD8, 0xAC, 0x44, 0xD8, 0xAB, 0xD8, 0xB1, 0x44, 0xD8, 0xAB, 0xD8, 0xB2, 0x44, 0xD8, 0xAB, 0xD9, // Bytes 1e00 - 1e3f 0x85, 0x44, 0xD8, 0xAB, 0xD9, 0x86, 0x44, 0xD8, 0xAB, 0xD9, 0x87, 0x44, 0xD8, 0xAB, 0xD9, 0x89, 0x44, 0xD8, 0xAB, 0xD9, 0x8A, 0x44, 0xD8, 0xAC, 0xD8, 0xAD, 0x44, 0xD8, 0xAC, 0xD9, 0x85, 0x44, 0xD8, 0xAC, 0xD9, 0x89, 0x44, 0xD8, 0xAC, 0xD9, 0x8A, 0x44, 0xD8, 0xAD, 0xD8, 0xAC, 0x44, 0xD8, 0xAD, 0xD9, 0x85, 0x44, 0xD8, 0xAD, 0xD9, 0x89, 0x44, 0xD8, 0xAD, 0xD9, 0x8A, 0x44, 0xD8, 0xAE, // Bytes 1e40 - 1e7f 0xD8, 0xAC, 0x44, 0xD8, 0xAE, 0xD8, 0xAD, 0x44, 0xD8, 0xAE, 0xD9, 0x85, 0x44, 0xD8, 0xAE, 0xD9, 0x89, 0x44, 0xD8, 0xAE, 0xD9, 0x8A, 0x44, 0xD8, 0xB3, 0xD8, 0xAC, 0x44, 0xD8, 0xB3, 0xD8, 0xAD, 0x44, 0xD8, 0xB3, 0xD8, 0xAE, 0x44, 0xD8, 0xB3, 0xD8, 0xB1, 0x44, 0xD8, 0xB3, 0xD9, 0x85, 0x44, 0xD8, 0xB3, 0xD9, 0x87, 0x44, 0xD8, 0xB3, 0xD9, 0x89, 0x44, 0xD8, 0xB3, 0xD9, 0x8A, 0x44, 0xD8, // Bytes 1e80 - 1ebf 0xB4, 0xD8, 0xAC, 0x44, 0xD8, 0xB4, 0xD8, 0xAD, 0x44, 0xD8, 0xB4, 0xD8, 0xAE, 0x44, 0xD8, 0xB4, 0xD8, 0xB1, 0x44, 0xD8, 0xB4, 0xD9, 0x85, 0x44, 0xD8, 0xB4, 0xD9, 0x87, 0x44, 0xD8, 0xB4, 0xD9, 0x89, 0x44, 0xD8, 0xB4, 0xD9, 0x8A, 0x44, 0xD8, 0xB5, 0xD8, 0xAD, 0x44, 0xD8, 0xB5, 0xD8, 0xAE, 0x44, 0xD8, 0xB5, 0xD8, 0xB1, 0x44, 0xD8, 0xB5, 0xD9, 0x85, 0x44, 0xD8, 0xB5, 0xD9, 0x89, 0x44, // Bytes 1ec0 - 1eff 0xD8, 0xB5, 0xD9, 0x8A, 0x44, 0xD8, 0xB6, 0xD8, 0xAC, 0x44, 0xD8, 0xB6, 0xD8, 0xAD, 0x44, 0xD8, 0xB6, 0xD8, 0xAE, 0x44, 0xD8, 0xB6, 0xD8, 0xB1, 0x44, 0xD8, 0xB6, 0xD9, 0x85, 0x44, 0xD8, 0xB6, 0xD9, 0x89, 0x44, 0xD8, 0xB6, 0xD9, 0x8A, 0x44, 0xD8, 0xB7, 0xD8, 0xAD, 0x44, 0xD8, 0xB7, 0xD9, 0x85, 0x44, 0xD8, 0xB7, 0xD9, 0x89, 0x44, 0xD8, 0xB7, 0xD9, 0x8A, 0x44, 0xD8, 0xB8, 0xD9, 0x85, // Bytes 1f00 - 1f3f 0x44, 0xD8, 0xB9, 0xD8, 0xAC, 0x44, 0xD8, 0xB9, 0xD9, 0x85, 0x44, 0xD8, 0xB9, 0xD9, 0x89, 0x44, 0xD8, 0xB9, 0xD9, 0x8A, 0x44, 0xD8, 0xBA, 0xD8, 0xAC, 0x44, 0xD8, 0xBA, 0xD9, 0x85, 0x44, 0xD8, 0xBA, 0xD9, 0x89, 0x44, 0xD8, 0xBA, 0xD9, 0x8A, 0x44, 0xD9, 0x81, 0xD8, 0xAC, 0x44, 0xD9, 0x81, 0xD8, 0xAD, 0x44, 0xD9, 0x81, 0xD8, 0xAE, 0x44, 0xD9, 0x81, 0xD9, 0x85, 0x44, 0xD9, 0x81, 0xD9, // Bytes 1f40 - 1f7f 0x89, 0x44, 0xD9, 0x81, 0xD9, 0x8A, 0x44, 0xD9, 0x82, 0xD8, 0xAD, 0x44, 0xD9, 0x82, 0xD9, 0x85, 0x44, 0xD9, 0x82, 0xD9, 0x89, 0x44, 0xD9, 0x82, 0xD9, 0x8A, 0x44, 0xD9, 0x83, 0xD8, 0xA7, 0x44, 0xD9, 0x83, 0xD8, 0xAC, 0x44, 0xD9, 0x83, 0xD8, 0xAD, 0x44, 0xD9, 0x83, 0xD8, 0xAE, 0x44, 0xD9, 0x83, 0xD9, 0x84, 0x44, 0xD9, 0x83, 0xD9, 0x85, 0x44, 0xD9, 0x83, 0xD9, 0x89, 0x44, 0xD9, 0x83, // Bytes 1f80 - 1fbf 0xD9, 0x8A, 0x44, 0xD9, 0x84, 0xD8, 0xA7, 0x44, 0xD9, 0x84, 0xD8, 0xAC, 0x44, 0xD9, 0x84, 0xD8, 0xAD, 0x44, 0xD9, 0x84, 0xD8, 0xAE, 0x44, 0xD9, 0x84, 0xD9, 0x85, 0x44, 0xD9, 0x84, 0xD9, 0x87, 0x44, 0xD9, 0x84, 0xD9, 0x89, 0x44, 0xD9, 0x84, 0xD9, 0x8A, 0x44, 0xD9, 0x85, 0xD8, 0xA7, 0x44, 0xD9, 0x85, 0xD8, 0xAC, 0x44, 0xD9, 0x85, 0xD8, 0xAD, 0x44, 0xD9, 0x85, 0xD8, 0xAE, 0x44, 0xD9, // Bytes 1fc0 - 1fff 0x85, 0xD9, 0x85, 0x44, 0xD9, 0x85, 0xD9, 0x89, 0x44, 0xD9, 0x85, 0xD9, 0x8A, 0x44, 0xD9, 0x86, 0xD8, 0xAC, 0x44, 0xD9, 0x86, 0xD8, 0xAD, 0x44, 0xD9, 0x86, 0xD8, 0xAE, 0x44, 0xD9, 0x86, 0xD8, 0xB1, 0x44, 0xD9, 0x86, 0xD8, 0xB2, 0x44, 0xD9, 0x86, 0xD9, 0x85, 0x44, 0xD9, 0x86, 0xD9, 0x86, 0x44, 0xD9, 0x86, 0xD9, 0x87, 0x44, 0xD9, 0x86, 0xD9, 0x89, 0x44, 0xD9, 0x86, 0xD9, 0x8A, 0x44, // Bytes 2000 - 203f 0xD9, 0x87, 0xD8, 0xAC, 0x44, 0xD9, 0x87, 0xD9, 0x85, 0x44, 0xD9, 0x87, 0xD9, 0x89, 0x44, 0xD9, 0x87, 0xD9, 0x8A, 0x44, 0xD9, 0x88, 0xD9, 0xB4, 0x44, 0xD9, 0x8A, 0xD8, 0xAC, 0x44, 0xD9, 0x8A, 0xD8, 0xAD, 0x44, 0xD9, 0x8A, 0xD8, 0xAE, 0x44, 0xD9, 0x8A, 0xD8, 0xB1, 0x44, 0xD9, 0x8A, 0xD8, 0xB2, 0x44, 0xD9, 0x8A, 0xD9, 0x85, 0x44, 0xD9, 0x8A, 0xD9, 0x86, 0x44, 0xD9, 0x8A, 0xD9, 0x87, // Bytes 2040 - 207f 0x44, 0xD9, 0x8A, 0xD9, 0x89, 0x44, 0xD9, 0x8A, 0xD9, 0x8A, 0x44, 0xD9, 0x8A, 0xD9, 0xB4, 0x44, 0xDB, 0x87, 0xD9, 0xB4, 0x45, 0x28, 0xE1, 0x84, 0x80, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x82, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x83, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x85, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x86, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x87, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x89, 0x29, 0x45, 0x28, // Bytes 2080 - 20bf 0xE1, 0x84, 0x8B, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x8C, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x8E, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x8F, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x90, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x91, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x92, 0x29, 0x45, 0x28, 0xE4, 0xB8, 0x80, 0x29, 0x45, 0x28, 0xE4, 0xB8, 0x83, 0x29, 0x45, 0x28, 0xE4, 0xB8, 0x89, 0x29, 0x45, 0x28, 0xE4, 0xB9, 0x9D, 0x29, // Bytes 20c0 - 20ff 0x45, 0x28, 0xE4, 0xBA, 0x8C, 0x29, 0x45, 0x28, 0xE4, 0xBA, 0x94, 0x29, 0x45, 0x28, 0xE4, 0xBB, 0xA3, 0x29, 0x45, 0x28, 0xE4, 0xBC, 0x81, 0x29, 0x45, 0x28, 0xE4, 0xBC, 0x91, 0x29, 0x45, 0x28, 0xE5, 0x85, 0xAB, 0x29, 0x45, 0x28, 0xE5, 0x85, 0xAD, 0x29, 0x45, 0x28, 0xE5, 0x8A, 0xB4, 0x29, 0x45, 0x28, 0xE5, 0x8D, 0x81, 0x29, 0x45, 0x28, 0xE5, 0x8D, 0x94, 0x29, 0x45, 0x28, 0xE5, 0x90, // Bytes 2100 - 213f 0x8D, 0x29, 0x45, 0x28, 0xE5, 0x91, 0xBC, 0x29, 0x45, 0x28, 0xE5, 0x9B, 0x9B, 0x29, 0x45, 0x28, 0xE5, 0x9C, 0x9F, 0x29, 0x45, 0x28, 0xE5, 0xAD, 0xA6, 0x29, 0x45, 0x28, 0xE6, 0x97, 0xA5, 0x29, 0x45, 0x28, 0xE6, 0x9C, 0x88, 0x29, 0x45, 0x28, 0xE6, 0x9C, 0x89, 0x29, 0x45, 0x28, 0xE6, 0x9C, 0xA8, 0x29, 0x45, 0x28, 0xE6, 0xA0, 0xAA, 0x29, 0x45, 0x28, 0xE6, 0xB0, 0xB4, 0x29, 0x45, 0x28, // Bytes 2140 - 217f 0xE7, 0x81, 0xAB, 0x29, 0x45, 0x28, 0xE7, 0x89, 0xB9, 0x29, 0x45, 0x28, 0xE7, 0x9B, 0xA3, 0x29, 0x45, 0x28, 0xE7, 0xA4, 0xBE, 0x29, 0x45, 0x28, 0xE7, 0xA5, 0x9D, 0x29, 0x45, 0x28, 0xE7, 0xA5, 0xAD, 0x29, 0x45, 0x28, 0xE8, 0x87, 0xAA, 0x29, 0x45, 0x28, 0xE8, 0x87, 0xB3, 0x29, 0x45, 0x28, 0xE8, 0xB2, 0xA1, 0x29, 0x45, 0x28, 0xE8, 0xB3, 0x87, 0x29, 0x45, 0x28, 0xE9, 0x87, 0x91, 0x29, // Bytes 2180 - 21bf 0x45, 0x30, 0xE2, 0x81, 0x84, 0x33, 0x45, 0x31, 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x30, 0xE6, 0x9C, 0x88, 0x45, 0x31, 0x30, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x31, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x31, 0xE6, 0x9C, 0x88, 0x45, 0x31, 0x31, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x32, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x32, 0xE6, 0x9C, 0x88, 0x45, 0x31, 0x32, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x33, 0xE6, // Bytes 21c0 - 21ff 0x97, 0xA5, 0x45, 0x31, 0x33, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x34, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x35, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x35, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x36, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x36, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x37, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x37, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x38, 0xE6, 0x97, 0xA5, 0x45, 0x31, // Bytes 2200 - 223f 0x38, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x39, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x39, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x32, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x33, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x34, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x36, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x37, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x38, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x39, // Bytes 2240 - 227f 0x45, 0x32, 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x30, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x31, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x31, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x32, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x32, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x33, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x33, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x34, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x35, 0xE6, // Bytes 2280 - 22bf 0x97, 0xA5, 0x45, 0x32, 0x36, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x37, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x38, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x39, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0xE2, 0x81, 0x84, 0x33, 0x45, 0x32, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33, 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x33, 0x31, 0xE6, 0x97, 0xA5, 0x45, 0x33, 0xE2, 0x81, 0x84, 0x34, 0x45, 0x33, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33, // Bytes 22c0 - 22ff 0xE2, 0x81, 0x84, 0x38, 0x45, 0x34, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x35, 0xE2, 0x81, 0x84, 0x36, 0x45, 0x35, 0xE2, 0x81, 0x84, 0x38, 0x45, 0x37, 0xE2, 0x81, 0x84, 0x38, 0x45, 0x41, 0xE2, 0x88, 0x95, 0x6D, 0x45, 0x56, 0xE2, 0x88, 0x95, 0x6D, 0x45, 0x6D, 0xE2, 0x88, 0x95, 0x73, 0x46, 0x31, 0xE2, 0x81, 0x84, 0x31, 0x30, 0x46, 0x43, 0xE2, 0x88, 0x95, 0x6B, 0x67, 0x46, 0x6D, 0xE2, 0x88, // Bytes 2300 - 233f 0x95, 0x73, 0x32, 0x46, 0xD8, 0xA8, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xA8, 0xD8, 0xAE, 0xD9, 0x8A, 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x89, 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8, 0xAA, 0xD8, 0xAD, 0xD8, 0xAC, 0x46, 0xD8, 0xAA, 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, 0xAE, // Bytes 2340 - 237f 0xD9, 0x89, 0x46, 0xD8, 0xAA, 0xD8, 0xAE, 0xD9, 0x8A, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAC, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAE, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD8, 0xAD, 0xD9, 0x89, 0x46, 0xD8, 0xAC, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD8, // Bytes 2380 - 23bf 0xAD, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xAD, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8, 0xAD, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAD, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB3, 0xD8, 0xAC, 0xD8, 0xAD, 0x46, 0xD8, 0xB3, 0xD8, 0xAC, 0xD9, 0x89, 0x46, 0xD8, 0xB3, 0xD8, 0xAD, 0xD8, 0xAC, 0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x89, // Bytes 23c0 - 23ff 0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x8A, 0x46, 0xD8, 0xB3, 0xD9, 0x85, 0xD8, 0xAC, 0x46, 0xD8, 0xB3, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, 0xB3, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8, 0xB4, 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD8, 0xAE, 0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD9, 0x85, 0x46, // Bytes 2400 - 243f 0xD8, 0xB5, 0xD8, 0xAD, 0xD8, 0xAD, 0x46, 0xD8, 0xB5, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xB5, 0xD9, 0x84, 0xD9, 0x89, 0x46, 0xD8, 0xB5, 0xD9, 0x84, 0xDB, 0x92, 0x46, 0xD8, 0xB5, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9, 0x89, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xB6, 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD8, 0xB7, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, // Bytes 2440 - 247f 0xB7, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB7, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB9, 0xD8, 0xAC, 0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x81, // Bytes 2480 - 24bf 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x81, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x82, 0xD9, 0x84, 0xDB, 0x92, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x83, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9, 0x83, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x84, 0xD8, 0xAC, 0xD8, 0xAC, 0x46, 0xD9, 0x84, 0xD8, // Bytes 24c0 - 24ff 0xAC, 0xD9, 0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x89, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x84, 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x84, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD9, 0x84, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD8, 0xAD, 0x46, 0xD9, 0x85, 0xD8, 0xAC, // Bytes 2500 - 253f 0xD8, 0xAE, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9, 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD8, 0xAD, 0xD8, 0xAC, 0x46, 0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD8, 0xAE, 0xD8, 0xAC, 0x46, 0xD9, 0x85, 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAE, 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD9, 0x85, 0xD9, // Bytes 2540 - 257f 0x8A, 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD8, 0xAD, 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x85, 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x89, 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x86, 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, 0x86, 0xD8, 0xAD, 0xD9, 0x89, 0x46, 0xD9, 0x86, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9, 0x8A, // Bytes 2580 - 25bf 0x46, 0xD9, 0x87, 0xD9, 0x85, 0xD8, 0xAC, 0x46, 0xD9, 0x87, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xA7, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAC, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAD, 0x46, // Bytes 25c0 - 25ff 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAE, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xB1, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xB2, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x86, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x87, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x88, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x89, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x8A, 0x46, 0xD9, // Bytes 2600 - 263f 0x8A, 0xD9, 0x94, 0xDB, 0x86, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, 0x87, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, 0x88, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, 0x90, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, 0x95, 0x46, 0xE0, 0xB9, 0x8D, 0xE0, 0xB8, 0xB2, 0x46, 0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0x99, 0x46, 0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0xA1, 0x46, 0xE0, 0xBB, 0x8D, 0xE0, 0xBA, 0xB2, 0x46, 0xE0, 0xBD, // Bytes 2640 - 267f 0x80, 0xE0, 0xBE, 0xB5, 0x46, 0xE0, 0xBD, 0x82, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x8C, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x91, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x96, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x9B, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0x90, 0xE0, 0xBE, 0xB5, 0x46, 0xE0, 0xBE, 0x92, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0x9C, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA1, // Bytes 2680 - 26bf 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA6, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xAB, 0xE0, 0xBE, 0xB7, 0x46, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0x46, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0x46, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0x46, 0xE2, 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x46, 0xE3, 0x81, 0xBB, 0xE3, 0x81, 0x8B, 0x46, 0xE3, 0x82, 0x88, 0xE3, 0x82, 0x8A, 0x46, 0xE3, 0x82, 0xAD, 0xE3, // Bytes 26c0 - 26ff 0x83, 0xAD, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x82, 0xB3, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0x88, 0x46, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x46, 0xE3, 0x83, 0x8A, 0xE3, 0x83, 0x8E, 0x46, 0xE3, 0x83, 0x9B, 0xE3, 0x83, 0xB3, 0x46, 0xE3, 0x83, 0x9F, 0xE3, 0x83, 0xAA, 0x46, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xA9, 0x46, 0xE3, 0x83, 0xAC, 0xE3, 0x83, 0xA0, 0x46, 0xE5, 0xA4, 0xA7, 0xE6, 0xAD, // Bytes 2700 - 273f 0xA3, 0x46, 0xE5, 0xB9, 0xB3, 0xE6, 0x88, 0x90, 0x46, 0xE6, 0x98, 0x8E, 0xE6, 0xB2, 0xBB, 0x46, 0xE6, 0x98, 0xAD, 0xE5, 0x92, 0x8C, 0x47, 0x72, 0x61, 0x64, 0xE2, 0x88, 0x95, 0x73, 0x47, 0xE3, 0x80, 0x94, 0x53, 0xE3, 0x80, 0x95, 0x48, 0x28, 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1, // Bytes 2740 - 277f 0x29, 0x48, 0x28, 0xE1, 0x84, 0x85, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x86, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x87, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x89, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xAE, 0x29, // Bytes 2780 - 27bf 0x48, 0x28, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x8F, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x90, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x91, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x72, 0x61, 0x64, 0xE2, 0x88, 0x95, 0x73, 0x32, 0x48, 0xD8, 0xA7, 0xD9, 0x83, 0xD8, 0xA8, 0xD8, 0xB1, 0x48, // Bytes 27c0 - 27ff 0xD8, 0xA7, 0xD9, 0x84, 0xD9, 0x84, 0xD9, 0x87, 0x48, 0xD8, 0xB1, 0xD8, 0xB3, 0xD9, 0x88, 0xD9, 0x84, 0x48, 0xD8, 0xB1, 0xDB, 0x8C, 0xD8, 0xA7, 0xD9, 0x84, 0x48, 0xD8, 0xB5, 0xD9, 0x84, 0xD8, 0xB9, 0xD9, 0x85, 0x48, 0xD8, 0xB9, 0xD9, 0x84, 0xD9, 0x8A, 0xD9, 0x87, 0x48, 0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x85, 0xD8, 0xAF, 0x48, 0xD9, 0x88, 0xD8, 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x49, 0xE2, // Bytes 2800 - 283f 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0x49, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0x49, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0x49, 0xE2, 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x49, 0xE3, 0x80, 0x94, 0xE4, 0xB8, 0x89, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE4, 0xBA, 0x8C, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE5, 0x8B, // Bytes 2840 - 287f 0x9D, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE5, 0xAE, 0x89, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE6, 0x89, 0x93, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE6, 0x95, 0x97, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE6, 0x9C, 0xAC, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE7, 0x82, 0xB9, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE7, 0x9B, 0x97, 0xE3, 0x80, 0x95, // Bytes 2880 - 28bf 0x49, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x81, 0x49, 0xE3, 0x82, 0xA6, 0xE3, 0x82, 0xA9, 0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x82, 0xAA, 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB9, 0x49, 0xE3, 0x82, 0xAA, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xA0, 0x49, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xAA, 0x49, 0xE3, 0x82, 0xB1, // Bytes 28c0 - 28ff 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xB9, 0x49, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x8A, 0x49, 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x81, 0x49, 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, 0x49, 0xE3, 0x83, 0x86, 0xE3, 0x82, 0x99, 0xE3, 0x82, 0xB7, 0x49, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x8E, 0xE3, 0x83, 0x83, 0xE3, // Bytes 2900 - 293f 0x83, 0x88, 0x49, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x84, 0x49, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xB3, 0x49, 0xE3, 0x83, 0x95, 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xBD, 0x49, 0xE3, 0x83, 0x98, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x84, 0x49, 0xE3, // Bytes 2940 - 297f 0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x83, 0x9E, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x9E, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x8F, 0x49, 0xE3, 0x83, 0x9E, 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xAF, 0x49, 0xE3, 0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0xA6, 0xE3, 0x82, // Bytes 2980 - 29bf 0xA2, 0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x83, 0xAF, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0x4C, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0x4C, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0x4C, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0xA1, 0x4C, 0xE3, 0x82, 0xA8, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xAB, 0xE3, // Bytes 29c0 - 29ff 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xB3, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x9E, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x8B, // Bytes 2a00 - 2a3f 0xE3, 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xA5, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0xA0, 0x4C, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x8D, 0x4C, 0xE3, 0x82, 0xB5, 0xE3, 0x82, 0xA4, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83, // Bytes 2a40 - 2a7f 0xBC, 0xE3, 0x82, 0xB9, 0x4C, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x84, 0x4C, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0xA3, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0x4C, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xBF, 0x4C, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, // Bytes 2a80 - 2abf 0x83, 0x8B, 0xE3, 0x83, 0x92, 0x4C, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB9, 0x4C, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x88, 0x4C, 0xE3, 0x83, 0x9E, 0xE3, 0x82, 0xA4, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAD, 0x4C, 0xE3, 0x83, 0x9F, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xB3, 0x4C, 0xE3, 0x83, 0xA1, 0xE3, 0x83, 0xBC, // Bytes 2ac0 - 2aff 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0x4C, 0xE6, 0xA0, 0xAA, 0xE5, 0xBC, 0x8F, 0xE4, 0xBC, 0x9A, 0xE7, 0xA4, 0xBE, 0x4E, 0x28, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xAE, 0x29, 0x4F, 0xD8, 0xAC, 0xD9, // Bytes 2b00 - 2b3f 0x84, 0x20, 0xD8, 0xAC, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x84, 0xD9, 0x87, 0x4F, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xA2, 0x4F, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xAF, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xB5, // Bytes 2b40 - 2b7f 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x81, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xA0, 0x4F, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAC, 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0xBF, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x83, 0x9E, // Bytes 2b80 - 2bbf 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB7, 0xE3, 0x83, 0xA7, 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xA1, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0x51, 0x28, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA5, 0xE1, 0x86, 0xAB, 0x29, 0x52, 0xE3, // Bytes 2bc0 - 2bff 0x82, 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0x52, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0xA0, 0x52, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xA1, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x52, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83, // Bytes 2c00 - 2c3f 0xA9, 0xE3, 0x83, 0xA0, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x52, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xAD, 0x52, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, 0x52, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xA2, 0xE3, 0x82, 0xB9, 0xE3, 0x83, 0x88, // Bytes 2c40 - 2c7f 0xE3, 0x83, 0xAB, 0x52, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x83, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0xA7, 0xE3, 0x83, 0xAB, 0x52, 0xE3, 0x83, 0x9F, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x52, 0xE3, 0x83, 0xAC, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0xB1, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xB3, 0x61, 0xD8, 0xB5, 0xD9, // Bytes 2c80 - 2cbf 0x84, 0xD9, 0x89, 0x20, 0xD8, 0xA7, 0xD9, 0x84, 0xD9, 0x84, 0xD9, 0x87, 0x20, 0xD8, 0xB9, 0xD9, 0x84, 0xD9, 0x8A, 0xD9, 0x87, 0x20, 0xD9, 0x88, 0xD8, 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x06, 0xE0, 0xA7, 0x87, 0xE0, 0xA6, 0xBE, 0x01, 0x06, 0xE0, 0xA7, 0x87, 0xE0, 0xA7, 0x97, 0x01, 0x06, 0xE0, 0xAD, 0x87, 0xE0, 0xAC, 0xBE, 0x01, 0x06, 0xE0, 0xAD, 0x87, 0xE0, 0xAD, 0x96, 0x01, 0x06, 0xE0, // Bytes 2cc0 - 2cff 0xAD, 0x87, 0xE0, 0xAD, 0x97, 0x01, 0x06, 0xE0, 0xAE, 0x92, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0, 0xAF, 0x86, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0, 0xAF, 0x86, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0, 0xAF, 0x87, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0, 0xB2, 0xBF, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x96, 0x01, 0x06, 0xE0, // Bytes 2d00 - 2d3f 0xB5, 0x86, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0, 0xB5, 0x86, 0xE0, 0xB5, 0x97, 0x01, 0x06, 0xE0, 0xB5, 0x87, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x9F, 0x01, 0x06, 0xE1, 0x80, 0xA5, 0xE1, 0x80, 0xAE, 0x01, 0x06, 0xE1, 0xAC, 0x85, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, 0x87, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, 0x89, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, // Bytes 2d40 - 2d7f 0xAC, 0x8B, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, 0x8D, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, 0x91, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, 0xBA, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, 0xBC, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, 0xBE, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, 0xBF, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAD, 0x82, 0xE1, 0xAC, 0xB5, 0x01, 0x08, 0xF0, // Bytes 2d80 - 2dbf 0x91, 0x84, 0xB1, 0xF0, 0x91, 0x84, 0xA7, 0x01, 0x08, 0xF0, 0x91, 0x84, 0xB2, 0xF0, 0x91, 0x84, 0xA7, 0x01, 0x08, 0xF0, 0x91, 0x8D, 0x87, 0xF0, 0x91, 0x8C, 0xBE, 0x01, 0x08, 0xF0, 0x91, 0x8D, 0x87, 0xF0, 0x91, 0x8D, 0x97, 0x01, 0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0, 0x91, 0x92, 0xB0, 0x01, 0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0, 0x91, 0x92, 0xBA, 0x01, 0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0, // Bytes 2dc0 - 2dff 0x91, 0x92, 0xBD, 0x01, 0x08, 0xF0, 0x91, 0x96, 0xB8, 0xF0, 0x91, 0x96, 0xAF, 0x01, 0x08, 0xF0, 0x91, 0x96, 0xB9, 0xF0, 0x91, 0x96, 0xAF, 0x01, 0x09, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, 0xE0, 0xB3, 0x95, 0x02, 0x09, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8F, 0xE0, 0xB7, 0x8A, 0x12, 0x44, 0x44, 0x5A, 0xCC, 0x8C, 0xC9, 0x44, 0x44, 0x7A, 0xCC, 0x8C, 0xC9, 0x44, 0x64, 0x7A, 0xCC, 0x8C, 0xC9, // Bytes 2e00 - 2e3f 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x93, 0xC9, 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x94, 0xC9, 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x95, 0xB5, 0x46, 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x85, 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x86, 0xE1, 0x85, 0xA1, 0x01, // Bytes 2e40 - 2e7f 0x46, 0xE1, 0x84, 0x87, 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x89, 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xAE, 0x01, 0x46, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x8F, 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x90, 0xE1, 0x85, 0xA1, 0x01, // Bytes 2e80 - 2ebf 0x46, 0xE1, 0x84, 0x91, 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1, 0x01, 0x49, 0xE3, 0x83, 0xA1, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x0D, 0x4C, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xAE, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xB4, 0x01, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x0D, 0x4C, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0xBC, 0xE3, 0x83, // Bytes 2ec0 - 2eff 0x9B, 0xE3, 0x82, 0x9A, 0x0D, 0x4C, 0xE3, 0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D, 0x4F, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, 0xE1, 0x86, 0xB7, 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA9, 0x01, 0x4F, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x8B, 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x0D, 0x4F, 0xE3, 0x82, 0xB7, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xB3, 0xE3, // Bytes 2f00 - 2f3f 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x0D, 0x4F, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x0D, 0x4F, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D, 0x52, 0xE3, 0x82, 0xA8, 0xE3, 0x82, 0xB9, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D, 0x52, 0xE3, 0x83, 0x95, // Bytes 2f40 - 2f7f 0xE3, 0x82, 0xA1, 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D, 0x86, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, 0x01, 0x86, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8F, 0x01, 0x03, 0x3C, 0xCC, 0xB8, 0x05, 0x03, 0x3D, 0xCC, 0xB8, 0x05, 0x03, 0x3E, 0xCC, 0xB8, 0x05, 0x03, 0x41, 0xCC, 0x80, 0xC9, 0x03, 0x41, 0xCC, 0x81, 0xC9, 0x03, 0x41, 0xCC, 0x83, 0xC9, 0x03, 0x41, // Bytes 2f80 - 2fbf 0xCC, 0x84, 0xC9, 0x03, 0x41, 0xCC, 0x89, 0xC9, 0x03, 0x41, 0xCC, 0x8C, 0xC9, 0x03, 0x41, 0xCC, 0x8F, 0xC9, 0x03, 0x41, 0xCC, 0x91, 0xC9, 0x03, 0x41, 0xCC, 0xA5, 0xB5, 0x03, 0x41, 0xCC, 0xA8, 0xA5, 0x03, 0x42, 0xCC, 0x87, 0xC9, 0x03, 0x42, 0xCC, 0xA3, 0xB5, 0x03, 0x42, 0xCC, 0xB1, 0xB5, 0x03, 0x43, 0xCC, 0x81, 0xC9, 0x03, 0x43, 0xCC, 0x82, 0xC9, 0x03, 0x43, 0xCC, 0x87, 0xC9, 0x03, // Bytes 2fc0 - 2fff 0x43, 0xCC, 0x8C, 0xC9, 0x03, 0x44, 0xCC, 0x87, 0xC9, 0x03, 0x44, 0xCC, 0x8C, 0xC9, 0x03, 0x44, 0xCC, 0xA3, 0xB5, 0x03, 0x44, 0xCC, 0xA7, 0xA5, 0x03, 0x44, 0xCC, 0xAD, 0xB5, 0x03, 0x44, 0xCC, 0xB1, 0xB5, 0x03, 0x45, 0xCC, 0x80, 0xC9, 0x03, 0x45, 0xCC, 0x81, 0xC9, 0x03, 0x45, 0xCC, 0x83, 0xC9, 0x03, 0x45, 0xCC, 0x86, 0xC9, 0x03, 0x45, 0xCC, 0x87, 0xC9, 0x03, 0x45, 0xCC, 0x88, 0xC9, // Bytes 3000 - 303f 0x03, 0x45, 0xCC, 0x89, 0xC9, 0x03, 0x45, 0xCC, 0x8C, 0xC9, 0x03, 0x45, 0xCC, 0x8F, 0xC9, 0x03, 0x45, 0xCC, 0x91, 0xC9, 0x03, 0x45, 0xCC, 0xA8, 0xA5, 0x03, 0x45, 0xCC, 0xAD, 0xB5, 0x03, 0x45, 0xCC, 0xB0, 0xB5, 0x03, 0x46, 0xCC, 0x87, 0xC9, 0x03, 0x47, 0xCC, 0x81, 0xC9, 0x03, 0x47, 0xCC, 0x82, 0xC9, 0x03, 0x47, 0xCC, 0x84, 0xC9, 0x03, 0x47, 0xCC, 0x86, 0xC9, 0x03, 0x47, 0xCC, 0x87, // Bytes 3040 - 307f 0xC9, 0x03, 0x47, 0xCC, 0x8C, 0xC9, 0x03, 0x47, 0xCC, 0xA7, 0xA5, 0x03, 0x48, 0xCC, 0x82, 0xC9, 0x03, 0x48, 0xCC, 0x87, 0xC9, 0x03, 0x48, 0xCC, 0x88, 0xC9, 0x03, 0x48, 0xCC, 0x8C, 0xC9, 0x03, 0x48, 0xCC, 0xA3, 0xB5, 0x03, 0x48, 0xCC, 0xA7, 0xA5, 0x03, 0x48, 0xCC, 0xAE, 0xB5, 0x03, 0x49, 0xCC, 0x80, 0xC9, 0x03, 0x49, 0xCC, 0x81, 0xC9, 0x03, 0x49, 0xCC, 0x82, 0xC9, 0x03, 0x49, 0xCC, // Bytes 3080 - 30bf 0x83, 0xC9, 0x03, 0x49, 0xCC, 0x84, 0xC9, 0x03, 0x49, 0xCC, 0x86, 0xC9, 0x03, 0x49, 0xCC, 0x87, 0xC9, 0x03, 0x49, 0xCC, 0x89, 0xC9, 0x03, 0x49, 0xCC, 0x8C, 0xC9, 0x03, 0x49, 0xCC, 0x8F, 0xC9, 0x03, 0x49, 0xCC, 0x91, 0xC9, 0x03, 0x49, 0xCC, 0xA3, 0xB5, 0x03, 0x49, 0xCC, 0xA8, 0xA5, 0x03, 0x49, 0xCC, 0xB0, 0xB5, 0x03, 0x4A, 0xCC, 0x82, 0xC9, 0x03, 0x4B, 0xCC, 0x81, 0xC9, 0x03, 0x4B, // Bytes 30c0 - 30ff 0xCC, 0x8C, 0xC9, 0x03, 0x4B, 0xCC, 0xA3, 0xB5, 0x03, 0x4B, 0xCC, 0xA7, 0xA5, 0x03, 0x4B, 0xCC, 0xB1, 0xB5, 0x03, 0x4C, 0xCC, 0x81, 0xC9, 0x03, 0x4C, 0xCC, 0x8C, 0xC9, 0x03, 0x4C, 0xCC, 0xA7, 0xA5, 0x03, 0x4C, 0xCC, 0xAD, 0xB5, 0x03, 0x4C, 0xCC, 0xB1, 0xB5, 0x03, 0x4D, 0xCC, 0x81, 0xC9, 0x03, 0x4D, 0xCC, 0x87, 0xC9, 0x03, 0x4D, 0xCC, 0xA3, 0xB5, 0x03, 0x4E, 0xCC, 0x80, 0xC9, 0x03, // Bytes 3100 - 313f 0x4E, 0xCC, 0x81, 0xC9, 0x03, 0x4E, 0xCC, 0x83, 0xC9, 0x03, 0x4E, 0xCC, 0x87, 0xC9, 0x03, 0x4E, 0xCC, 0x8C, 0xC9, 0x03, 0x4E, 0xCC, 0xA3, 0xB5, 0x03, 0x4E, 0xCC, 0xA7, 0xA5, 0x03, 0x4E, 0xCC, 0xAD, 0xB5, 0x03, 0x4E, 0xCC, 0xB1, 0xB5, 0x03, 0x4F, 0xCC, 0x80, 0xC9, 0x03, 0x4F, 0xCC, 0x81, 0xC9, 0x03, 0x4F, 0xCC, 0x86, 0xC9, 0x03, 0x4F, 0xCC, 0x89, 0xC9, 0x03, 0x4F, 0xCC, 0x8B, 0xC9, // Bytes 3140 - 317f 0x03, 0x4F, 0xCC, 0x8C, 0xC9, 0x03, 0x4F, 0xCC, 0x8F, 0xC9, 0x03, 0x4F, 0xCC, 0x91, 0xC9, 0x03, 0x50, 0xCC, 0x81, 0xC9, 0x03, 0x50, 0xCC, 0x87, 0xC9, 0x03, 0x52, 0xCC, 0x81, 0xC9, 0x03, 0x52, 0xCC, 0x87, 0xC9, 0x03, 0x52, 0xCC, 0x8C, 0xC9, 0x03, 0x52, 0xCC, 0x8F, 0xC9, 0x03, 0x52, 0xCC, 0x91, 0xC9, 0x03, 0x52, 0xCC, 0xA7, 0xA5, 0x03, 0x52, 0xCC, 0xB1, 0xB5, 0x03, 0x53, 0xCC, 0x82, // Bytes 3180 - 31bf 0xC9, 0x03, 0x53, 0xCC, 0x87, 0xC9, 0x03, 0x53, 0xCC, 0xA6, 0xB5, 0x03, 0x53, 0xCC, 0xA7, 0xA5, 0x03, 0x54, 0xCC, 0x87, 0xC9, 0x03, 0x54, 0xCC, 0x8C, 0xC9, 0x03, 0x54, 0xCC, 0xA3, 0xB5, 0x03, 0x54, 0xCC, 0xA6, 0xB5, 0x03, 0x54, 0xCC, 0xA7, 0xA5, 0x03, 0x54, 0xCC, 0xAD, 0xB5, 0x03, 0x54, 0xCC, 0xB1, 0xB5, 0x03, 0x55, 0xCC, 0x80, 0xC9, 0x03, 0x55, 0xCC, 0x81, 0xC9, 0x03, 0x55, 0xCC, // Bytes 31c0 - 31ff 0x82, 0xC9, 0x03, 0x55, 0xCC, 0x86, 0xC9, 0x03, 0x55, 0xCC, 0x89, 0xC9, 0x03, 0x55, 0xCC, 0x8A, 0xC9, 0x03, 0x55, 0xCC, 0x8B, 0xC9, 0x03, 0x55, 0xCC, 0x8C, 0xC9, 0x03, 0x55, 0xCC, 0x8F, 0xC9, 0x03, 0x55, 0xCC, 0x91, 0xC9, 0x03, 0x55, 0xCC, 0xA3, 0xB5, 0x03, 0x55, 0xCC, 0xA4, 0xB5, 0x03, 0x55, 0xCC, 0xA8, 0xA5, 0x03, 0x55, 0xCC, 0xAD, 0xB5, 0x03, 0x55, 0xCC, 0xB0, 0xB5, 0x03, 0x56, // Bytes 3200 - 323f 0xCC, 0x83, 0xC9, 0x03, 0x56, 0xCC, 0xA3, 0xB5, 0x03, 0x57, 0xCC, 0x80, 0xC9, 0x03, 0x57, 0xCC, 0x81, 0xC9, 0x03, 0x57, 0xCC, 0x82, 0xC9, 0x03, 0x57, 0xCC, 0x87, 0xC9, 0x03, 0x57, 0xCC, 0x88, 0xC9, 0x03, 0x57, 0xCC, 0xA3, 0xB5, 0x03, 0x58, 0xCC, 0x87, 0xC9, 0x03, 0x58, 0xCC, 0x88, 0xC9, 0x03, 0x59, 0xCC, 0x80, 0xC9, 0x03, 0x59, 0xCC, 0x81, 0xC9, 0x03, 0x59, 0xCC, 0x82, 0xC9, 0x03, // Bytes 3240 - 327f 0x59, 0xCC, 0x83, 0xC9, 0x03, 0x59, 0xCC, 0x84, 0xC9, 0x03, 0x59, 0xCC, 0x87, 0xC9, 0x03, 0x59, 0xCC, 0x88, 0xC9, 0x03, 0x59, 0xCC, 0x89, 0xC9, 0x03, 0x59, 0xCC, 0xA3, 0xB5, 0x03, 0x5A, 0xCC, 0x81, 0xC9, 0x03, 0x5A, 0xCC, 0x82, 0xC9, 0x03, 0x5A, 0xCC, 0x87, 0xC9, 0x03, 0x5A, 0xCC, 0x8C, 0xC9, 0x03, 0x5A, 0xCC, 0xA3, 0xB5, 0x03, 0x5A, 0xCC, 0xB1, 0xB5, 0x03, 0x61, 0xCC, 0x80, 0xC9, // Bytes 3280 - 32bf 0x03, 0x61, 0xCC, 0x81, 0xC9, 0x03, 0x61, 0xCC, 0x83, 0xC9, 0x03, 0x61, 0xCC, 0x84, 0xC9, 0x03, 0x61, 0xCC, 0x89, 0xC9, 0x03, 0x61, 0xCC, 0x8C, 0xC9, 0x03, 0x61, 0xCC, 0x8F, 0xC9, 0x03, 0x61, 0xCC, 0x91, 0xC9, 0x03, 0x61, 0xCC, 0xA5, 0xB5, 0x03, 0x61, 0xCC, 0xA8, 0xA5, 0x03, 0x62, 0xCC, 0x87, 0xC9, 0x03, 0x62, 0xCC, 0xA3, 0xB5, 0x03, 0x62, 0xCC, 0xB1, 0xB5, 0x03, 0x63, 0xCC, 0x81, // Bytes 32c0 - 32ff 0xC9, 0x03, 0x63, 0xCC, 0x82, 0xC9, 0x03, 0x63, 0xCC, 0x87, 0xC9, 0x03, 0x63, 0xCC, 0x8C, 0xC9, 0x03, 0x64, 0xCC, 0x87, 0xC9, 0x03, 0x64, 0xCC, 0x8C, 0xC9, 0x03, 0x64, 0xCC, 0xA3, 0xB5, 0x03, 0x64, 0xCC, 0xA7, 0xA5, 0x03, 0x64, 0xCC, 0xAD, 0xB5, 0x03, 0x64, 0xCC, 0xB1, 0xB5, 0x03, 0x65, 0xCC, 0x80, 0xC9, 0x03, 0x65, 0xCC, 0x81, 0xC9, 0x03, 0x65, 0xCC, 0x83, 0xC9, 0x03, 0x65, 0xCC, // Bytes 3300 - 333f 0x86, 0xC9, 0x03, 0x65, 0xCC, 0x87, 0xC9, 0x03, 0x65, 0xCC, 0x88, 0xC9, 0x03, 0x65, 0xCC, 0x89, 0xC9, 0x03, 0x65, 0xCC, 0x8C, 0xC9, 0x03, 0x65, 0xCC, 0x8F, 0xC9, 0x03, 0x65, 0xCC, 0x91, 0xC9, 0x03, 0x65, 0xCC, 0xA8, 0xA5, 0x03, 0x65, 0xCC, 0xAD, 0xB5, 0x03, 0x65, 0xCC, 0xB0, 0xB5, 0x03, 0x66, 0xCC, 0x87, 0xC9, 0x03, 0x67, 0xCC, 0x81, 0xC9, 0x03, 0x67, 0xCC, 0x82, 0xC9, 0x03, 0x67, // Bytes 3340 - 337f 0xCC, 0x84, 0xC9, 0x03, 0x67, 0xCC, 0x86, 0xC9, 0x03, 0x67, 0xCC, 0x87, 0xC9, 0x03, 0x67, 0xCC, 0x8C, 0xC9, 0x03, 0x67, 0xCC, 0xA7, 0xA5, 0x03, 0x68, 0xCC, 0x82, 0xC9, 0x03, 0x68, 0xCC, 0x87, 0xC9, 0x03, 0x68, 0xCC, 0x88, 0xC9, 0x03, 0x68, 0xCC, 0x8C, 0xC9, 0x03, 0x68, 0xCC, 0xA3, 0xB5, 0x03, 0x68, 0xCC, 0xA7, 0xA5, 0x03, 0x68, 0xCC, 0xAE, 0xB5, 0x03, 0x68, 0xCC, 0xB1, 0xB5, 0x03, // Bytes 3380 - 33bf 0x69, 0xCC, 0x80, 0xC9, 0x03, 0x69, 0xCC, 0x81, 0xC9, 0x03, 0x69, 0xCC, 0x82, 0xC9, 0x03, 0x69, 0xCC, 0x83, 0xC9, 0x03, 0x69, 0xCC, 0x84, 0xC9, 0x03, 0x69, 0xCC, 0x86, 0xC9, 0x03, 0x69, 0xCC, 0x89, 0xC9, 0x03, 0x69, 0xCC, 0x8C, 0xC9, 0x03, 0x69, 0xCC, 0x8F, 0xC9, 0x03, 0x69, 0xCC, 0x91, 0xC9, 0x03, 0x69, 0xCC, 0xA3, 0xB5, 0x03, 0x69, 0xCC, 0xA8, 0xA5, 0x03, 0x69, 0xCC, 0xB0, 0xB5, // Bytes 33c0 - 33ff 0x03, 0x6A, 0xCC, 0x82, 0xC9, 0x03, 0x6A, 0xCC, 0x8C, 0xC9, 0x03, 0x6B, 0xCC, 0x81, 0xC9, 0x03, 0x6B, 0xCC, 0x8C, 0xC9, 0x03, 0x6B, 0xCC, 0xA3, 0xB5, 0x03, 0x6B, 0xCC, 0xA7, 0xA5, 0x03, 0x6B, 0xCC, 0xB1, 0xB5, 0x03, 0x6C, 0xCC, 0x81, 0xC9, 0x03, 0x6C, 0xCC, 0x8C, 0xC9, 0x03, 0x6C, 0xCC, 0xA7, 0xA5, 0x03, 0x6C, 0xCC, 0xAD, 0xB5, 0x03, 0x6C, 0xCC, 0xB1, 0xB5, 0x03, 0x6D, 0xCC, 0x81, // Bytes 3400 - 343f 0xC9, 0x03, 0x6D, 0xCC, 0x87, 0xC9, 0x03, 0x6D, 0xCC, 0xA3, 0xB5, 0x03, 0x6E, 0xCC, 0x80, 0xC9, 0x03, 0x6E, 0xCC, 0x81, 0xC9, 0x03, 0x6E, 0xCC, 0x83, 0xC9, 0x03, 0x6E, 0xCC, 0x87, 0xC9, 0x03, 0x6E, 0xCC, 0x8C, 0xC9, 0x03, 0x6E, 0xCC, 0xA3, 0xB5, 0x03, 0x6E, 0xCC, 0xA7, 0xA5, 0x03, 0x6E, 0xCC, 0xAD, 0xB5, 0x03, 0x6E, 0xCC, 0xB1, 0xB5, 0x03, 0x6F, 0xCC, 0x80, 0xC9, 0x03, 0x6F, 0xCC, // Bytes 3440 - 347f 0x81, 0xC9, 0x03, 0x6F, 0xCC, 0x86, 0xC9, 0x03, 0x6F, 0xCC, 0x89, 0xC9, 0x03, 0x6F, 0xCC, 0x8B, 0xC9, 0x03, 0x6F, 0xCC, 0x8C, 0xC9, 0x03, 0x6F, 0xCC, 0x8F, 0xC9, 0x03, 0x6F, 0xCC, 0x91, 0xC9, 0x03, 0x70, 0xCC, 0x81, 0xC9, 0x03, 0x70, 0xCC, 0x87, 0xC9, 0x03, 0x72, 0xCC, 0x81, 0xC9, 0x03, 0x72, 0xCC, 0x87, 0xC9, 0x03, 0x72, 0xCC, 0x8C, 0xC9, 0x03, 0x72, 0xCC, 0x8F, 0xC9, 0x03, 0x72, // Bytes 3480 - 34bf 0xCC, 0x91, 0xC9, 0x03, 0x72, 0xCC, 0xA7, 0xA5, 0x03, 0x72, 0xCC, 0xB1, 0xB5, 0x03, 0x73, 0xCC, 0x82, 0xC9, 0x03, 0x73, 0xCC, 0x87, 0xC9, 0x03, 0x73, 0xCC, 0xA6, 0xB5, 0x03, 0x73, 0xCC, 0xA7, 0xA5, 0x03, 0x74, 0xCC, 0x87, 0xC9, 0x03, 0x74, 0xCC, 0x88, 0xC9, 0x03, 0x74, 0xCC, 0x8C, 0xC9, 0x03, 0x74, 0xCC, 0xA3, 0xB5, 0x03, 0x74, 0xCC, 0xA6, 0xB5, 0x03, 0x74, 0xCC, 0xA7, 0xA5, 0x03, // Bytes 34c0 - 34ff 0x74, 0xCC, 0xAD, 0xB5, 0x03, 0x74, 0xCC, 0xB1, 0xB5, 0x03, 0x75, 0xCC, 0x80, 0xC9, 0x03, 0x75, 0xCC, 0x81, 0xC9, 0x03, 0x75, 0xCC, 0x82, 0xC9, 0x03, 0x75, 0xCC, 0x86, 0xC9, 0x03, 0x75, 0xCC, 0x89, 0xC9, 0x03, 0x75, 0xCC, 0x8A, 0xC9, 0x03, 0x75, 0xCC, 0x8B, 0xC9, 0x03, 0x75, 0xCC, 0x8C, 0xC9, 0x03, 0x75, 0xCC, 0x8F, 0xC9, 0x03, 0x75, 0xCC, 0x91, 0xC9, 0x03, 0x75, 0xCC, 0xA3, 0xB5, // Bytes 3500 - 353f 0x03, 0x75, 0xCC, 0xA4, 0xB5, 0x03, 0x75, 0xCC, 0xA8, 0xA5, 0x03, 0x75, 0xCC, 0xAD, 0xB5, 0x03, 0x75, 0xCC, 0xB0, 0xB5, 0x03, 0x76, 0xCC, 0x83, 0xC9, 0x03, 0x76, 0xCC, 0xA3, 0xB5, 0x03, 0x77, 0xCC, 0x80, 0xC9, 0x03, 0x77, 0xCC, 0x81, 0xC9, 0x03, 0x77, 0xCC, 0x82, 0xC9, 0x03, 0x77, 0xCC, 0x87, 0xC9, 0x03, 0x77, 0xCC, 0x88, 0xC9, 0x03, 0x77, 0xCC, 0x8A, 0xC9, 0x03, 0x77, 0xCC, 0xA3, // Bytes 3540 - 357f 0xB5, 0x03, 0x78, 0xCC, 0x87, 0xC9, 0x03, 0x78, 0xCC, 0x88, 0xC9, 0x03, 0x79, 0xCC, 0x80, 0xC9, 0x03, 0x79, 0xCC, 0x81, 0xC9, 0x03, 0x79, 0xCC, 0x82, 0xC9, 0x03, 0x79, 0xCC, 0x83, 0xC9, 0x03, 0x79, 0xCC, 0x84, 0xC9, 0x03, 0x79, 0xCC, 0x87, 0xC9, 0x03, 0x79, 0xCC, 0x88, 0xC9, 0x03, 0x79, 0xCC, 0x89, 0xC9, 0x03, 0x79, 0xCC, 0x8A, 0xC9, 0x03, 0x79, 0xCC, 0xA3, 0xB5, 0x03, 0x7A, 0xCC, // Bytes 3580 - 35bf 0x81, 0xC9, 0x03, 0x7A, 0xCC, 0x82, 0xC9, 0x03, 0x7A, 0xCC, 0x87, 0xC9, 0x03, 0x7A, 0xCC, 0x8C, 0xC9, 0x03, 0x7A, 0xCC, 0xA3, 0xB5, 0x03, 0x7A, 0xCC, 0xB1, 0xB5, 0x04, 0xC2, 0xA8, 0xCC, 0x80, 0xCA, 0x04, 0xC2, 0xA8, 0xCC, 0x81, 0xCA, 0x04, 0xC2, 0xA8, 0xCD, 0x82, 0xCA, 0x04, 0xC3, 0x86, 0xCC, 0x81, 0xC9, 0x04, 0xC3, 0x86, 0xCC, 0x84, 0xC9, 0x04, 0xC3, 0x98, 0xCC, 0x81, 0xC9, 0x04, // Bytes 35c0 - 35ff 0xC3, 0xA6, 0xCC, 0x81, 0xC9, 0x04, 0xC3, 0xA6, 0xCC, 0x84, 0xC9, 0x04, 0xC3, 0xB8, 0xCC, 0x81, 0xC9, 0x04, 0xC5, 0xBF, 0xCC, 0x87, 0xC9, 0x04, 0xC6, 0xB7, 0xCC, 0x8C, 0xC9, 0x04, 0xCA, 0x92, 0xCC, 0x8C, 0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x86, 0xC9, 0x04, 0xCE, 0x91, 0xCD, 0x85, // Bytes 3600 - 363f 0xD9, 0x04, 0xCE, 0x95, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x95, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x97, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x97, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x97, 0xCD, 0x85, 0xD9, 0x04, 0xCE, 0x99, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x86, 0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x88, 0xC9, 0x04, 0xCE, 0x9F, // Bytes 3640 - 367f 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x9F, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xA1, 0xCC, 0x94, 0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x86, 0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x88, 0xC9, 0x04, 0xCE, 0xA9, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xA9, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xA9, 0xCD, 0x85, 0xD9, 0x04, // Bytes 3680 - 36bf 0xCE, 0xB1, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0xB1, 0xCC, 0x86, 0xC9, 0x04, 0xCE, 0xB1, 0xCD, 0x85, 0xD9, 0x04, 0xCE, 0xB5, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xB5, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xB7, 0xCD, 0x85, 0xD9, 0x04, 0xCE, 0xB9, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xB9, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xB9, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0xB9, 0xCC, 0x86, 0xC9, 0x04, 0xCE, 0xB9, 0xCD, 0x82, // Bytes 36c0 - 36ff 0xC9, 0x04, 0xCE, 0xBF, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xBF, 0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x81, 0xCC, 0x93, 0xC9, 0x04, 0xCF, 0x81, 0xCC, 0x94, 0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x80, 0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x84, 0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x86, 0xC9, 0x04, 0xCF, 0x85, 0xCD, 0x82, 0xC9, 0x04, 0xCF, 0x89, 0xCD, 0x85, 0xD9, 0x04, 0xCF, 0x92, // Bytes 3700 - 373f 0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x92, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x86, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x90, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x90, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x93, 0xCC, 0x81, 0xC9, 0x04, 0xD0, 0x95, 0xCC, 0x80, 0xC9, 0x04, 0xD0, 0x95, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x95, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x96, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x96, 0xCC, 0x88, 0xC9, 0x04, // Bytes 3740 - 377f 0xD0, 0x97, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x80, 0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x84, 0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x9A, 0xCC, 0x81, 0xC9, 0x04, 0xD0, 0x9E, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x84, 0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x8B, // Bytes 3780 - 37bf 0xC9, 0x04, 0xD0, 0xA7, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xAB, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xAD, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB0, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB0, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB3, 0xCC, 0x81, 0xC9, 0x04, 0xD0, 0xB5, 0xCC, 0x80, 0xC9, 0x04, 0xD0, 0xB5, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB5, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB6, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB6, // Bytes 37c0 - 37ff 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB7, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x80, 0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x84, 0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xBA, 0xCC, 0x81, 0xC9, 0x04, 0xD0, 0xBE, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x83, 0xCC, 0x84, 0xC9, 0x04, 0xD1, 0x83, 0xCC, 0x86, 0xC9, 0x04, 0xD1, 0x83, 0xCC, 0x88, 0xC9, 0x04, // Bytes 3800 - 383f 0xD1, 0x83, 0xCC, 0x8B, 0xC9, 0x04, 0xD1, 0x87, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x8B, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x8D, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x96, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0xB4, 0xCC, 0x8F, 0xC9, 0x04, 0xD1, 0xB5, 0xCC, 0x8F, 0xC9, 0x04, 0xD3, 0x98, 0xCC, 0x88, 0xC9, 0x04, 0xD3, 0x99, 0xCC, 0x88, 0xC9, 0x04, 0xD3, 0xA8, 0xCC, 0x88, 0xC9, 0x04, 0xD3, 0xA9, 0xCC, 0x88, // Bytes 3840 - 387f 0xC9, 0x04, 0xD8, 0xA7, 0xD9, 0x93, 0xC9, 0x04, 0xD8, 0xA7, 0xD9, 0x94, 0xC9, 0x04, 0xD8, 0xA7, 0xD9, 0x95, 0xB5, 0x04, 0xD9, 0x88, 0xD9, 0x94, 0xC9, 0x04, 0xD9, 0x8A, 0xD9, 0x94, 0xC9, 0x04, 0xDB, 0x81, 0xD9, 0x94, 0xC9, 0x04, 0xDB, 0x92, 0xD9, 0x94, 0xC9, 0x04, 0xDB, 0x95, 0xD9, 0x94, 0xC9, 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, // Bytes 3880 - 38bf 0x41, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x41, 0xCC, 0x86, 0xCC, 0x80, 0xCA, 0x05, 0x41, 0xCC, 0x86, 0xCC, 0x81, 0xCA, 0x05, 0x41, 0xCC, 0x86, 0xCC, 0x83, 0xCA, 0x05, 0x41, 0xCC, 0x86, 0xCC, 0x89, 0xCA, 0x05, 0x41, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05, 0x41, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x41, 0xCC, 0x8A, 0xCC, 0x81, 0xCA, 0x05, 0x41, // Bytes 38c0 - 38ff 0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x41, 0xCC, 0xA3, 0xCC, 0x86, 0xCA, 0x05, 0x43, 0xCC, 0xA7, 0xCC, 0x81, 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x45, 0xCC, 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x45, 0xCC, 0x84, 0xCC, 0x81, 0xCA, 0x05, 0x45, 0xCC, // Bytes 3900 - 393f 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x45, 0xCC, 0xA7, 0xCC, 0x86, 0xCA, 0x05, 0x49, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05, 0x4C, 0xCC, 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x4F, 0xCC, 0x83, 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x83, // Bytes 3940 - 397f 0xCC, 0x84, 0xCA, 0x05, 0x4F, 0xCC, 0x83, 0xCC, 0x88, 0xCA, 0x05, 0x4F, 0xCC, 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x4F, 0xCC, 0x84, 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05, 0x4F, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, 0x83, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, // Bytes 3980 - 39bf 0x89, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6, 0x05, 0x4F, 0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x4F, 0xCC, 0xA8, 0xCC, 0x84, 0xCA, 0x05, 0x52, 0xCC, 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x53, 0xCC, 0x81, 0xCC, 0x87, 0xCA, 0x05, 0x53, 0xCC, 0x8C, 0xCC, 0x87, 0xCA, 0x05, 0x53, 0xCC, 0xA3, 0xCC, 0x87, 0xCA, 0x05, 0x55, 0xCC, 0x83, 0xCC, 0x81, 0xCA, 0x05, 0x55, 0xCC, 0x84, 0xCC, 0x88, // Bytes 39c0 - 39ff 0xCA, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x80, 0xCA, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x8C, 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0x81, 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0x83, 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0x89, 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6, // Bytes 3a00 - 3a3f 0x05, 0x61, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05, 0x61, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x61, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x61, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x80, 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x81, 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x83, 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x89, 0xCA, 0x05, 0x61, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05, // Bytes 3a40 - 3a7f 0x61, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x61, 0xCC, 0x8A, 0xCC, 0x81, 0xCA, 0x05, 0x61, 0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x61, 0xCC, 0xA3, 0xCC, 0x86, 0xCA, 0x05, 0x63, 0xCC, 0xA7, 0xCC, 0x81, 0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x65, // Bytes 3a80 - 3abf 0xCC, 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x65, 0xCC, 0x84, 0xCC, 0x81, 0xCA, 0x05, 0x65, 0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x65, 0xCC, 0xA7, 0xCC, 0x86, 0xCA, 0x05, 0x69, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05, 0x6C, 0xCC, 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x6F, 0xCC, // Bytes 3ac0 - 3aff 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x6F, 0xCC, 0x83, 0xCC, 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x83, 0xCC, 0x84, 0xCA, 0x05, 0x6F, 0xCC, 0x83, 0xCC, 0x88, 0xCA, 0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05, 0x6F, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, // Bytes 3b00 - 3b3f 0xCC, 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0x83, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0x89, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6, 0x05, 0x6F, 0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x6F, 0xCC, 0xA8, 0xCC, 0x84, 0xCA, 0x05, 0x72, 0xCC, 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x73, 0xCC, 0x81, 0xCC, 0x87, 0xCA, 0x05, 0x73, 0xCC, 0x8C, 0xCC, 0x87, 0xCA, 0x05, 0x73, 0xCC, 0xA3, 0xCC, // Bytes 3b40 - 3b7f 0x87, 0xCA, 0x05, 0x75, 0xCC, 0x83, 0xCC, 0x81, 0xCA, 0x05, 0x75, 0xCC, 0x84, 0xCC, 0x88, 0xCA, 0x05, 0x75, 0xCC, 0x88, 0xCC, 0x80, 0xCA, 0x05, 0x75, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05, 0x75, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x75, 0xCC, 0x88, 0xCC, 0x8C, 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x81, 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x83, // Bytes 3b80 - 3bbf 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x89, 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6, 0x05, 0xE1, 0xBE, 0xBF, 0xCC, 0x80, 0xCA, 0x05, 0xE1, 0xBE, 0xBF, 0xCC, 0x81, 0xCA, 0x05, 0xE1, 0xBE, 0xBF, 0xCD, 0x82, 0xCA, 0x05, 0xE1, 0xBF, 0xBE, 0xCC, 0x80, 0xCA, 0x05, 0xE1, 0xBF, 0xBE, 0xCC, 0x81, 0xCA, 0x05, 0xE1, 0xBF, 0xBE, 0xCD, 0x82, 0xCA, 0x05, 0xE2, 0x86, 0x90, 0xCC, 0xB8, 0x05, // Bytes 3bc0 - 3bff 0x05, 0xE2, 0x86, 0x92, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x86, 0x94, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87, 0x90, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87, 0x92, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87, 0x94, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x88, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x8B, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0xA3, 0xCC, 0xB8, 0x05, 0x05, // Bytes 3c00 - 3c3f 0xE2, 0x88, 0xA5, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0xBC, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x85, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x88, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x8D, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xA1, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xA4, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xA5, 0xCC, 0xB8, 0x05, 0x05, 0xE2, // Bytes 3c40 - 3c7f 0x89, 0xB2, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB3, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB6, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB7, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBA, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBB, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBC, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBD, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x82, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, // Bytes 3c80 - 3cbf 0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x86, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x87, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x91, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x92, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xA2, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xA8, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xA9, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xAB, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB2, // Bytes 3cc0 - 3cff 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB3, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB4, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB5, 0xCC, 0xB8, 0x05, 0x06, 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x80, 0xCA, // Bytes 3d00 - 3d3f 0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x81, 0xCA, // Bytes 3d40 - 3d7f 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCD, 0x82, 0xCA, // Bytes 3d80 - 3dbf 0x06, 0xCE, 0xA9, 0xCC, 0x93, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xA9, 0xCC, 0x94, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB1, 0xCC, 0x80, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB1, 0xCC, 0x81, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB1, 0xCD, 0x82, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x80, 0xCA, // Bytes 3dc0 - 3dff 0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xB7, 0xCC, 0x80, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB7, 0xCC, 0x81, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB7, 0xCC, 0x94, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB7, 0xCD, 0x82, 0xCD, 0x85, 0xDA, // Bytes 3e00 - 3e3f 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCD, 0x82, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x81, 0xCA, // Bytes 3e40 - 3e7f 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x80, 0xCA, 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCD, 0x82, 0xCA, // Bytes 3e80 - 3ebf 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x06, 0xCF, 0x89, 0xCC, 0x80, 0xCD, 0x85, 0xDA, 0x06, 0xCF, 0x89, 0xCC, 0x81, 0xCD, 0x85, 0xDA, // Bytes 3ec0 - 3eff 0x06, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x85, 0xDA, 0x06, 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x85, 0xDA, 0x06, 0xCF, 0x89, 0xCD, 0x82, 0xCD, 0x85, 0xDA, 0x06, 0xE0, 0xA4, 0xA8, 0xE0, 0xA4, 0xBC, 0x09, 0x06, 0xE0, 0xA4, 0xB0, 0xE0, 0xA4, 0xBC, 0x09, 0x06, 0xE0, 0xA4, 0xB3, 0xE0, 0xA4, 0xBC, 0x09, 0x06, 0xE0, 0xB1, 0x86, 0xE0, 0xB1, 0x96, 0x85, 0x06, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8A, 0x11, // Bytes 3f00 - 3f3f 0x06, 0xE3, 0x81, 0x86, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x8B, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x8D, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x8F, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x91, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x93, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x95, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x97, 0xE3, 0x82, 0x99, 0x0D, // Bytes 3f40 - 3f7f 0x06, 0xE3, 0x81, 0x99, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x9D, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x9F, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xA1, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xA4, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xA6, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xA8, 0xE3, 0x82, 0x99, 0x0D, // Bytes 3f80 - 3fbf 0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x9A, 0x0D, // Bytes 3fc0 - 3fff 0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x82, 0x9D, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xA6, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xB1, 0xE3, 0x82, 0x99, 0x0D, // Bytes 4000 - 403f 0x06, 0xE3, 0x82, 0xB3, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xB5, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xB9, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xBD, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x81, 0xE3, 0x82, 0x99, 0x0D, // Bytes 4040 - 407f 0x06, 0xE3, 0x83, 0x84, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x86, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x99, 0x0D, // Bytes 4080 - 40bf 0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x83, 0xAF, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0xB0, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0xB1, 0xE3, 0x82, 0x99, 0x0D, // Bytes 40c0 - 40ff 0x06, 0xE3, 0x83, 0xB2, 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0xBD, 0xE3, 0x82, 0x99, 0x0D, 0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCD, // Bytes 4100 - 413f 0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, // Bytes 4140 - 417f 0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCD, // Bytes 4180 - 41bf 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB, // Bytes 41c0 - 41ff 0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, // Bytes 4200 - 423f 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xF0, 0x91, 0x82, 0x99, 0xF0, 0x91, 0x82, // Bytes 4240 - 427f 0xBA, 0x09, 0x08, 0xF0, 0x91, 0x82, 0x9B, 0xF0, 0x91, 0x82, 0xBA, 0x09, 0x08, 0xF0, 0x91, 0x82, 0xA5, 0xF0, 0x91, 0x82, 0xBA, 0x09, 0x42, 0xC2, 0xB4, 0x01, 0x43, 0x20, 0xCC, 0x81, 0xC9, 0x43, 0x20, 0xCC, 0x83, 0xC9, 0x43, 0x20, 0xCC, 0x84, 0xC9, 0x43, 0x20, 0xCC, 0x85, 0xC9, 0x43, 0x20, 0xCC, 0x86, 0xC9, 0x43, 0x20, 0xCC, 0x87, 0xC9, 0x43, 0x20, 0xCC, 0x88, 0xC9, 0x43, 0x20, 0xCC, // Bytes 4280 - 42bf 0x8A, 0xC9, 0x43, 0x20, 0xCC, 0x8B, 0xC9, 0x43, 0x20, 0xCC, 0x93, 0xC9, 0x43, 0x20, 0xCC, 0x94, 0xC9, 0x43, 0x20, 0xCC, 0xA7, 0xA5, 0x43, 0x20, 0xCC, 0xA8, 0xA5, 0x43, 0x20, 0xCC, 0xB3, 0xB5, 0x43, 0x20, 0xCD, 0x82, 0xC9, 0x43, 0x20, 0xCD, 0x85, 0xD9, 0x43, 0x20, 0xD9, 0x8B, 0x59, 0x43, 0x20, 0xD9, 0x8C, 0x5D, 0x43, 0x20, 0xD9, 0x8D, 0x61, 0x43, 0x20, 0xD9, 0x8E, 0x65, 0x43, 0x20, // Bytes 42c0 - 42ff 0xD9, 0x8F, 0x69, 0x43, 0x20, 0xD9, 0x90, 0x6D, 0x43, 0x20, 0xD9, 0x91, 0x71, 0x43, 0x20, 0xD9, 0x92, 0x75, 0x43, 0x41, 0xCC, 0x8A, 0xC9, 0x43, 0x73, 0xCC, 0x87, 0xC9, 0x44, 0x20, 0xE3, 0x82, 0x99, 0x0D, 0x44, 0x20, 0xE3, 0x82, 0x9A, 0x0D, 0x44, 0xC2, 0xA8, 0xCC, 0x81, 0xCA, 0x44, 0xCE, 0x91, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0x95, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0x97, 0xCC, 0x81, 0xC9, // Bytes 4300 - 433f 0x44, 0xCE, 0x99, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0x9F, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xA5, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xA5, 0xCC, 0x88, 0xC9, 0x44, 0xCE, 0xA9, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xB1, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xB5, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xB7, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xB9, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xBF, 0xCC, 0x81, 0xC9, 0x44, 0xCF, 0x85, 0xCC, // Bytes 4340 - 437f 0x81, 0xC9, 0x44, 0xCF, 0x89, 0xCC, 0x81, 0xC9, 0x44, 0xD7, 0x90, 0xD6, 0xB7, 0x31, 0x44, 0xD7, 0x90, 0xD6, 0xB8, 0x35, 0x44, 0xD7, 0x90, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x91, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x91, 0xD6, 0xBF, 0x49, 0x44, 0xD7, 0x92, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x93, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x94, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x95, 0xD6, 0xB9, 0x39, 0x44, 0xD7, // Bytes 4380 - 43bf 0x95, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x96, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x98, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x99, 0xD6, 0xB4, 0x25, 0x44, 0xD7, 0x99, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9A, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9B, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9B, 0xD6, 0xBF, 0x49, 0x44, 0xD7, 0x9C, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9E, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA0, 0xD6, 0xBC, 0x41, // Bytes 43c0 - 43ff 0x44, 0xD7, 0xA1, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA3, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA4, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA4, 0xD6, 0xBF, 0x49, 0x44, 0xD7, 0xA6, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA7, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA8, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA9, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA9, 0xD7, 0x81, 0x4D, 0x44, 0xD7, 0xA9, 0xD7, 0x82, 0x51, 0x44, 0xD7, 0xAA, 0xD6, // Bytes 4400 - 443f 0xBC, 0x41, 0x44, 0xD7, 0xB2, 0xD6, 0xB7, 0x31, 0x44, 0xD8, 0xA7, 0xD9, 0x8B, 0x59, 0x44, 0xD8, 0xA7, 0xD9, 0x93, 0xC9, 0x44, 0xD8, 0xA7, 0xD9, 0x94, 0xC9, 0x44, 0xD8, 0xA7, 0xD9, 0x95, 0xB5, 0x44, 0xD8, 0xB0, 0xD9, 0xB0, 0x79, 0x44, 0xD8, 0xB1, 0xD9, 0xB0, 0x79, 0x44, 0xD9, 0x80, 0xD9, 0x8B, 0x59, 0x44, 0xD9, 0x80, 0xD9, 0x8E, 0x65, 0x44, 0xD9, 0x80, 0xD9, 0x8F, 0x69, 0x44, 0xD9, // Bytes 4440 - 447f 0x80, 0xD9, 0x90, 0x6D, 0x44, 0xD9, 0x80, 0xD9, 0x91, 0x71, 0x44, 0xD9, 0x80, 0xD9, 0x92, 0x75, 0x44, 0xD9, 0x87, 0xD9, 0xB0, 0x79, 0x44, 0xD9, 0x88, 0xD9, 0x94, 0xC9, 0x44, 0xD9, 0x89, 0xD9, 0xB0, 0x79, 0x44, 0xD9, 0x8A, 0xD9, 0x94, 0xC9, 0x44, 0xDB, 0x92, 0xD9, 0x94, 0xC9, 0x44, 0xDB, 0x95, 0xD9, 0x94, 0xC9, 0x45, 0x20, 0xCC, 0x88, 0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC, 0x88, 0xCC, // Bytes 4480 - 44bf 0x81, 0xCA, 0x45, 0x20, 0xCC, 0x88, 0xCD, 0x82, 0xCA, 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x45, 0x20, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x45, 0x20, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x45, 0x20, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x45, 0x20, 0xD9, 0x8C, 0xD9, 0x91, 0x72, 0x45, 0x20, 0xD9, 0x8D, 0xD9, 0x91, // Bytes 44c0 - 44ff 0x72, 0x45, 0x20, 0xD9, 0x8E, 0xD9, 0x91, 0x72, 0x45, 0x20, 0xD9, 0x8F, 0xD9, 0x91, 0x72, 0x45, 0x20, 0xD9, 0x90, 0xD9, 0x91, 0x72, 0x45, 0x20, 0xD9, 0x91, 0xD9, 0xB0, 0x7A, 0x45, 0xE2, 0xAB, 0x9D, 0xCC, 0xB8, 0x05, 0x46, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x46, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x46, 0xD7, 0xA9, 0xD6, 0xBC, 0xD7, 0x81, 0x4E, 0x46, 0xD7, 0xA9, 0xD6, // Bytes 4500 - 453f 0xBC, 0xD7, 0x82, 0x52, 0x46, 0xD9, 0x80, 0xD9, 0x8E, 0xD9, 0x91, 0x72, 0x46, 0xD9, 0x80, 0xD9, 0x8F, 0xD9, 0x91, 0x72, 0x46, 0xD9, 0x80, 0xD9, 0x90, 0xD9, 0x91, 0x72, 0x46, 0xE0, 0xA4, 0x95, 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x96, 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x97, 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x9C, 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xA1, // Bytes 4540 - 457f 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xA2, 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xAB, 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xAF, 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xA1, 0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xA2, 0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xAF, 0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x96, 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x97, // Bytes 4580 - 45bf 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x9C, 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xAB, 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xB2, 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xB8, 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xAC, 0xA1, 0xE0, 0xAC, 0xBC, 0x09, 0x46, 0xE0, 0xAC, 0xA2, 0xE0, 0xAC, 0xBC, 0x09, 0x46, 0xE0, 0xBE, 0xB2, 0xE0, 0xBE, 0x80, 0x9D, 0x46, 0xE0, 0xBE, 0xB3, // Bytes 45c0 - 45ff 0xE0, 0xBE, 0x80, 0x9D, 0x46, 0xE3, 0x83, 0x86, 0xE3, 0x82, 0x99, 0x0D, 0x48, 0xF0, 0x9D, 0x85, 0x97, 0xF0, 0x9D, 0x85, 0xA5, 0xAD, 0x48, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xAD, 0x48, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, 0xA5, 0xAD, 0x48, 0xF0, 0x9D, 0x86, 0xBA, 0xF0, 0x9D, 0x85, 0xA5, 0xAD, 0x49, 0xE0, 0xBE, 0xB2, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x9E, 0x49, // Bytes 4600 - 463f 0xE0, 0xBE, 0xB3, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x9E, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xB0, 0xAE, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, // Bytes 4640 - 467f 0xB1, 0xAE, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xB2, 0xAE, 0x4C, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE, 0x4C, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE, 0x4C, 0xF0, 0x9D, 0x86, 0xBA, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE, 0x4C, 0xF0, 0x9D, 0x86, 0xBA, 0xF0, // Bytes 4680 - 46bf 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE, 0x83, 0x41, 0xCC, 0x82, 0xC9, 0x83, 0x41, 0xCC, 0x86, 0xC9, 0x83, 0x41, 0xCC, 0x87, 0xC9, 0x83, 0x41, 0xCC, 0x88, 0xC9, 0x83, 0x41, 0xCC, 0x8A, 0xC9, 0x83, 0x41, 0xCC, 0xA3, 0xB5, 0x83, 0x43, 0xCC, 0xA7, 0xA5, 0x83, 0x45, 0xCC, 0x82, 0xC9, 0x83, 0x45, 0xCC, 0x84, 0xC9, 0x83, 0x45, 0xCC, 0xA3, 0xB5, 0x83, 0x45, 0xCC, 0xA7, 0xA5, 0x83, // Bytes 46c0 - 46ff 0x49, 0xCC, 0x88, 0xC9, 0x83, 0x4C, 0xCC, 0xA3, 0xB5, 0x83, 0x4F, 0xCC, 0x82, 0xC9, 0x83, 0x4F, 0xCC, 0x83, 0xC9, 0x83, 0x4F, 0xCC, 0x84, 0xC9, 0x83, 0x4F, 0xCC, 0x87, 0xC9, 0x83, 0x4F, 0xCC, 0x88, 0xC9, 0x83, 0x4F, 0xCC, 0x9B, 0xAD, 0x83, 0x4F, 0xCC, 0xA3, 0xB5, 0x83, 0x4F, 0xCC, 0xA8, 0xA5, 0x83, 0x52, 0xCC, 0xA3, 0xB5, 0x83, 0x53, 0xCC, 0x81, 0xC9, 0x83, 0x53, 0xCC, 0x8C, 0xC9, // Bytes 4700 - 473f 0x83, 0x53, 0xCC, 0xA3, 0xB5, 0x83, 0x55, 0xCC, 0x83, 0xC9, 0x83, 0x55, 0xCC, 0x84, 0xC9, 0x83, 0x55, 0xCC, 0x88, 0xC9, 0x83, 0x55, 0xCC, 0x9B, 0xAD, 0x83, 0x61, 0xCC, 0x82, 0xC9, 0x83, 0x61, 0xCC, 0x86, 0xC9, 0x83, 0x61, 0xCC, 0x87, 0xC9, 0x83, 0x61, 0xCC, 0x88, 0xC9, 0x83, 0x61, 0xCC, 0x8A, 0xC9, 0x83, 0x61, 0xCC, 0xA3, 0xB5, 0x83, 0x63, 0xCC, 0xA7, 0xA5, 0x83, 0x65, 0xCC, 0x82, // Bytes 4740 - 477f 0xC9, 0x83, 0x65, 0xCC, 0x84, 0xC9, 0x83, 0x65, 0xCC, 0xA3, 0xB5, 0x83, 0x65, 0xCC, 0xA7, 0xA5, 0x83, 0x69, 0xCC, 0x88, 0xC9, 0x83, 0x6C, 0xCC, 0xA3, 0xB5, 0x83, 0x6F, 0xCC, 0x82, 0xC9, 0x83, 0x6F, 0xCC, 0x83, 0xC9, 0x83, 0x6F, 0xCC, 0x84, 0xC9, 0x83, 0x6F, 0xCC, 0x87, 0xC9, 0x83, 0x6F, 0xCC, 0x88, 0xC9, 0x83, 0x6F, 0xCC, 0x9B, 0xAD, 0x83, 0x6F, 0xCC, 0xA3, 0xB5, 0x83, 0x6F, 0xCC, // Bytes 4780 - 47bf 0xA8, 0xA5, 0x83, 0x72, 0xCC, 0xA3, 0xB5, 0x83, 0x73, 0xCC, 0x81, 0xC9, 0x83, 0x73, 0xCC, 0x8C, 0xC9, 0x83, 0x73, 0xCC, 0xA3, 0xB5, 0x83, 0x75, 0xCC, 0x83, 0xC9, 0x83, 0x75, 0xCC, 0x84, 0xC9, 0x83, 0x75, 0xCC, 0x88, 0xC9, 0x83, 0x75, 0xCC, 0x9B, 0xAD, 0x84, 0xCE, 0x91, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x91, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0x95, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x95, 0xCC, // Bytes 47c0 - 47ff 0x94, 0xC9, 0x84, 0xCE, 0x97, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x97, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0x99, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x99, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0x9F, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x9F, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xA5, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xA9, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xA9, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xB1, 0xCC, 0x80, 0xC9, 0x84, 0xCE, // Bytes 4800 - 483f 0xB1, 0xCC, 0x81, 0xC9, 0x84, 0xCE, 0xB1, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB1, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xB1, 0xCD, 0x82, 0xC9, 0x84, 0xCE, 0xB5, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB5, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xB7, 0xCC, 0x80, 0xC9, 0x84, 0xCE, 0xB7, 0xCC, 0x81, 0xC9, 0x84, 0xCE, 0xB7, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB7, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xB7, 0xCD, 0x82, 0xC9, // Bytes 4840 - 487f 0x84, 0xCE, 0xB9, 0xCC, 0x88, 0xC9, 0x84, 0xCE, 0xB9, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB9, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xBF, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xBF, 0xCC, 0x94, 0xC9, 0x84, 0xCF, 0x85, 0xCC, 0x88, 0xC9, 0x84, 0xCF, 0x85, 0xCC, 0x93, 0xC9, 0x84, 0xCF, 0x85, 0xCC, 0x94, 0xC9, 0x84, 0xCF, 0x89, 0xCC, 0x80, 0xC9, 0x84, 0xCF, 0x89, 0xCC, 0x81, 0xC9, 0x84, 0xCF, 0x89, 0xCC, // Bytes 4880 - 48bf 0x93, 0xC9, 0x84, 0xCF, 0x89, 0xCC, 0x94, 0xC9, 0x84, 0xCF, 0x89, 0xCD, 0x82, 0xC9, 0x86, 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE, // Bytes 48c0 - 48ff 0x97, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, 0x97, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, 0x97, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, // Bytes 4900 - 493f 0xA9, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, 0xA9, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, 0xB1, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, // Bytes 4940 - 497f 0xB1, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, 0xB7, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCF, // Bytes 4980 - 49bf 0x89, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCF, 0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCF, 0x89, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCF, 0x89, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x42, 0xCC, 0x80, 0xC9, 0x32, 0x42, 0xCC, 0x81, 0xC9, 0x32, 0x42, 0xCC, 0x93, 0xC9, 0x32, 0x43, 0xE1, 0x85, // Bytes 49c0 - 49ff 0xA1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA2, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA3, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA4, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA5, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA6, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA7, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA8, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA9, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAA, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAB, 0x01, 0x00, 0x43, // Bytes 4a00 - 4a3f 0xE1, 0x85, 0xAC, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAD, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAE, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAF, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB0, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB2, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB3, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB4, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB5, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xAA, 0x01, // Bytes 4a40 - 4a7f 0x00, 0x43, 0xE1, 0x86, 0xAC, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xAD, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB0, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB1, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB2, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB3, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB4, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB5, 0x01, 0x00, 0x44, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x32, 0x43, 0xE3, 0x82, 0x99, 0x0D, 0x03, 0x43, 0xE3, // Bytes 4a80 - 4abf 0x82, 0x9A, 0x0D, 0x03, 0x46, 0xE0, 0xBD, 0xB1, 0xE0, 0xBD, 0xB2, 0x9E, 0x26, 0x46, 0xE0, 0xBD, 0xB1, 0xE0, 0xBD, 0xB4, 0xA2, 0x26, 0x46, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x9E, 0x26, 0x00, 0x01, } // lookup returns the trie value for the first UTF-8 encoding in s and // the width in bytes of this encoding. The size will be 0 if s does not // hold enough bytes to complete the encoding. len(s) must be greater than 0. func (t *nfcTrie) lookup(s []byte) (v uint16, sz int) { c0 := s[0] switch { case c0 < 0x80: // is ASCII return nfcValues[c0], 1 case c0 < 0xC2: return 0, 1 // Illegal UTF-8: not a starter, not ASCII. case c0 < 0xE0: // 2-byte UTF-8 if len(s) < 2 { return 0, 0 } i := nfcIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c1), 2 case c0 < 0xF0: // 3-byte UTF-8 if len(s) < 3 { return 0, 0 } i := nfcIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } o := uint32(i)<<6 + uint32(c1) i = nfcIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return 0, 2 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c2), 3 case c0 < 0xF8: // 4-byte UTF-8 if len(s) < 4 { return 0, 0 } i := nfcIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } o := uint32(i)<<6 + uint32(c1) i = nfcIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return 0, 2 // Illegal UTF-8: not a continuation byte. } o = uint32(i)<<6 + uint32(c2) i = nfcIndex[o] c3 := s[3] if c3 < 0x80 || 0xC0 <= c3 { return 0, 3 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c3), 4 } // Illegal rune return 0, 1 } // lookupUnsafe returns the trie value for the first UTF-8 encoding in s. // s must start with a full and valid UTF-8 encoded rune. func (t *nfcTrie) lookupUnsafe(s []byte) uint16 { c0 := s[0] if c0 < 0x80 { // is ASCII return nfcValues[c0] } i := nfcIndex[c0] if c0 < 0xE0 { // 2-byte UTF-8 return t.lookupValue(uint32(i), s[1]) } i = nfcIndex[uint32(i)<<6+uint32(s[1])] if c0 < 0xF0 { // 3-byte UTF-8 return t.lookupValue(uint32(i), s[2]) } i = nfcIndex[uint32(i)<<6+uint32(s[2])] if c0 < 0xF8 { // 4-byte UTF-8 return t.lookupValue(uint32(i), s[3]) } return 0 } // lookupString returns the trie value for the first UTF-8 encoding in s and // the width in bytes of this encoding. The size will be 0 if s does not // hold enough bytes to complete the encoding. len(s) must be greater than 0. func (t *nfcTrie) lookupString(s string) (v uint16, sz int) { c0 := s[0] switch { case c0 < 0x80: // is ASCII return nfcValues[c0], 1 case c0 < 0xC2: return 0, 1 // Illegal UTF-8: not a starter, not ASCII. case c0 < 0xE0: // 2-byte UTF-8 if len(s) < 2 { return 0, 0 } i := nfcIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c1), 2 case c0 < 0xF0: // 3-byte UTF-8 if len(s) < 3 { return 0, 0 } i := nfcIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } o := uint32(i)<<6 + uint32(c1) i = nfcIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return 0, 2 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c2), 3 case c0 < 0xF8: // 4-byte UTF-8 if len(s) < 4 { return 0, 0 } i := nfcIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } o := uint32(i)<<6 + uint32(c1) i = nfcIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return 0, 2 // Illegal UTF-8: not a continuation byte. } o = uint32(i)<<6 + uint32(c2) i = nfcIndex[o] c3 := s[3] if c3 < 0x80 || 0xC0 <= c3 { return 0, 3 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c3), 4 } // Illegal rune return 0, 1 } // lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. // s must start with a full and valid UTF-8 encoded rune. func (t *nfcTrie) lookupStringUnsafe(s string) uint16 { c0 := s[0] if c0 < 0x80 { // is ASCII return nfcValues[c0] } i := nfcIndex[c0] if c0 < 0xE0 { // 2-byte UTF-8 return t.lookupValue(uint32(i), s[1]) } i = nfcIndex[uint32(i)<<6+uint32(s[1])] if c0 < 0xF0 { // 3-byte UTF-8 return t.lookupValue(uint32(i), s[2]) } i = nfcIndex[uint32(i)<<6+uint32(s[2])] if c0 < 0xF8 { // 4-byte UTF-8 return t.lookupValue(uint32(i), s[3]) } return 0 } // nfcTrie. Total size: 10332 bytes (10.09 KiB). Checksum: 51cc525b297fc970. type nfcTrie struct{} func newNfcTrie(i int) *nfcTrie { return &nfcTrie{} } // lookupValue determines the type of block n and looks up the value for b. func (t *nfcTrie) lookupValue(n uint32, b byte) uint16 { switch { case n < 44: return uint16(nfcValues[n<<6+uint32(b)]) default: n -= 44 return uint16(nfcSparse.lookup(n, b)) } } // nfcValues: 46 blocks, 2944 entries, 5888 bytes // The third block is the zero block. var nfcValues = [2944]uint16{ // Block 0x0, offset 0x0 0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000, // Block 0x1, offset 0x40 0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000, 0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000, 0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000, 0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000, 0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000, 0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000, 0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000, 0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000, 0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000, 0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000, // Block 0x2, offset 0x80 // Block 0x3, offset 0xc0 0xc0: 0x2f6f, 0xc1: 0x2f74, 0xc2: 0x4688, 0xc3: 0x2f79, 0xc4: 0x4697, 0xc5: 0x469c, 0xc6: 0xa000, 0xc7: 0x46a6, 0xc8: 0x2fe2, 0xc9: 0x2fe7, 0xca: 0x46ab, 0xcb: 0x2ffb, 0xcc: 0x306e, 0xcd: 0x3073, 0xce: 0x3078, 0xcf: 0x46bf, 0xd1: 0x3104, 0xd2: 0x3127, 0xd3: 0x312c, 0xd4: 0x46c9, 0xd5: 0x46ce, 0xd6: 0x46dd, 0xd8: 0xa000, 0xd9: 0x31b3, 0xda: 0x31b8, 0xdb: 0x31bd, 0xdc: 0x470f, 0xdd: 0x3235, 0xe0: 0x327b, 0xe1: 0x3280, 0xe2: 0x4719, 0xe3: 0x3285, 0xe4: 0x4728, 0xe5: 0x472d, 0xe6: 0xa000, 0xe7: 0x4737, 0xe8: 0x32ee, 0xe9: 0x32f3, 0xea: 0x473c, 0xeb: 0x3307, 0xec: 0x337f, 0xed: 0x3384, 0xee: 0x3389, 0xef: 0x4750, 0xf1: 0x3415, 0xf2: 0x3438, 0xf3: 0x343d, 0xf4: 0x475a, 0xf5: 0x475f, 0xf6: 0x476e, 0xf8: 0xa000, 0xf9: 0x34c9, 0xfa: 0x34ce, 0xfb: 0x34d3, 0xfc: 0x47a0, 0xfd: 0x3550, 0xff: 0x3569, // Block 0x4, offset 0x100 0x100: 0x2f7e, 0x101: 0x328a, 0x102: 0x468d, 0x103: 0x471e, 0x104: 0x2f9c, 0x105: 0x32a8, 0x106: 0x2fb0, 0x107: 0x32bc, 0x108: 0x2fb5, 0x109: 0x32c1, 0x10a: 0x2fba, 0x10b: 0x32c6, 0x10c: 0x2fbf, 0x10d: 0x32cb, 0x10e: 0x2fc9, 0x10f: 0x32d5, 0x112: 0x46b0, 0x113: 0x4741, 0x114: 0x2ff1, 0x115: 0x32fd, 0x116: 0x2ff6, 0x117: 0x3302, 0x118: 0x3014, 0x119: 0x3320, 0x11a: 0x3005, 0x11b: 0x3311, 0x11c: 0x302d, 0x11d: 0x3339, 0x11e: 0x3037, 0x11f: 0x3343, 0x120: 0x303c, 0x121: 0x3348, 0x122: 0x3046, 0x123: 0x3352, 0x124: 0x304b, 0x125: 0x3357, 0x128: 0x307d, 0x129: 0x338e, 0x12a: 0x3082, 0x12b: 0x3393, 0x12c: 0x3087, 0x12d: 0x3398, 0x12e: 0x30aa, 0x12f: 0x33b6, 0x130: 0x308c, 0x134: 0x30b4, 0x135: 0x33c0, 0x136: 0x30c8, 0x137: 0x33d9, 0x139: 0x30d2, 0x13a: 0x33e3, 0x13b: 0x30dc, 0x13c: 0x33ed, 0x13d: 0x30d7, 0x13e: 0x33e8, // Block 0x5, offset 0x140 0x143: 0x30ff, 0x144: 0x3410, 0x145: 0x3118, 0x146: 0x3429, 0x147: 0x310e, 0x148: 0x341f, 0x14c: 0x46d3, 0x14d: 0x4764, 0x14e: 0x3131, 0x14f: 0x3442, 0x150: 0x313b, 0x151: 0x344c, 0x154: 0x3159, 0x155: 0x346a, 0x156: 0x3172, 0x157: 0x3483, 0x158: 0x3163, 0x159: 0x3474, 0x15a: 0x46f6, 0x15b: 0x4787, 0x15c: 0x317c, 0x15d: 0x348d, 0x15e: 0x318b, 0x15f: 0x349c, 0x160: 0x46fb, 0x161: 0x478c, 0x162: 0x31a4, 0x163: 0x34ba, 0x164: 0x3195, 0x165: 0x34ab, 0x168: 0x4705, 0x169: 0x4796, 0x16a: 0x470a, 0x16b: 0x479b, 0x16c: 0x31c2, 0x16d: 0x34d8, 0x16e: 0x31cc, 0x16f: 0x34e2, 0x170: 0x31d1, 0x171: 0x34e7, 0x172: 0x31ef, 0x173: 0x3505, 0x174: 0x3212, 0x175: 0x3528, 0x176: 0x323a, 0x177: 0x3555, 0x178: 0x324e, 0x179: 0x325d, 0x17a: 0x357d, 0x17b: 0x3267, 0x17c: 0x3587, 0x17d: 0x326c, 0x17e: 0x358c, 0x17f: 0xa000, // Block 0x6, offset 0x180 0x184: 0x8100, 0x185: 0x8100, 0x186: 0x8100, 0x18d: 0x2f88, 0x18e: 0x3294, 0x18f: 0x3096, 0x190: 0x33a2, 0x191: 0x3140, 0x192: 0x3451, 0x193: 0x31d6, 0x194: 0x34ec, 0x195: 0x39cf, 0x196: 0x3b5e, 0x197: 0x39c8, 0x198: 0x3b57, 0x199: 0x39d6, 0x19a: 0x3b65, 0x19b: 0x39c1, 0x19c: 0x3b50, 0x19e: 0x38b0, 0x19f: 0x3a3f, 0x1a0: 0x38a9, 0x1a1: 0x3a38, 0x1a2: 0x35b3, 0x1a3: 0x35c5, 0x1a6: 0x3041, 0x1a7: 0x334d, 0x1a8: 0x30be, 0x1a9: 0x33cf, 0x1aa: 0x46ec, 0x1ab: 0x477d, 0x1ac: 0x3990, 0x1ad: 0x3b1f, 0x1ae: 0x35d7, 0x1af: 0x35dd, 0x1b0: 0x33c5, 0x1b4: 0x3028, 0x1b5: 0x3334, 0x1b8: 0x30fa, 0x1b9: 0x340b, 0x1ba: 0x38b7, 0x1bb: 0x3a46, 0x1bc: 0x35ad, 0x1bd: 0x35bf, 0x1be: 0x35b9, 0x1bf: 0x35cb, // Block 0x7, offset 0x1c0 0x1c0: 0x2f8d, 0x1c1: 0x3299, 0x1c2: 0x2f92, 0x1c3: 0x329e, 0x1c4: 0x300a, 0x1c5: 0x3316, 0x1c6: 0x300f, 0x1c7: 0x331b, 0x1c8: 0x309b, 0x1c9: 0x33a7, 0x1ca: 0x30a0, 0x1cb: 0x33ac, 0x1cc: 0x3145, 0x1cd: 0x3456, 0x1ce: 0x314a, 0x1cf: 0x345b, 0x1d0: 0x3168, 0x1d1: 0x3479, 0x1d2: 0x316d, 0x1d3: 0x347e, 0x1d4: 0x31db, 0x1d5: 0x34f1, 0x1d6: 0x31e0, 0x1d7: 0x34f6, 0x1d8: 0x3186, 0x1d9: 0x3497, 0x1da: 0x319f, 0x1db: 0x34b5, 0x1de: 0x305a, 0x1df: 0x3366, 0x1e6: 0x4692, 0x1e7: 0x4723, 0x1e8: 0x46ba, 0x1e9: 0x474b, 0x1ea: 0x395f, 0x1eb: 0x3aee, 0x1ec: 0x393c, 0x1ed: 0x3acb, 0x1ee: 0x46d8, 0x1ef: 0x4769, 0x1f0: 0x3958, 0x1f1: 0x3ae7, 0x1f2: 0x3244, 0x1f3: 0x355f, // Block 0x8, offset 0x200 0x200: 0x9932, 0x201: 0x9932, 0x202: 0x9932, 0x203: 0x9932, 0x204: 0x9932, 0x205: 0x8132, 0x206: 0x9932, 0x207: 0x9932, 0x208: 0x9932, 0x209: 0x9932, 0x20a: 0x9932, 0x20b: 0x9932, 0x20c: 0x9932, 0x20d: 0x8132, 0x20e: 0x8132, 0x20f: 0x9932, 0x210: 0x8132, 0x211: 0x9932, 0x212: 0x8132, 0x213: 0x9932, 0x214: 0x9932, 0x215: 0x8133, 0x216: 0x812d, 0x217: 0x812d, 0x218: 0x812d, 0x219: 0x812d, 0x21a: 0x8133, 0x21b: 0x992b, 0x21c: 0x812d, 0x21d: 0x812d, 0x21e: 0x812d, 0x21f: 0x812d, 0x220: 0x812d, 0x221: 0x8129, 0x222: 0x8129, 0x223: 0x992d, 0x224: 0x992d, 0x225: 0x992d, 0x226: 0x992d, 0x227: 0x9929, 0x228: 0x9929, 0x229: 0x812d, 0x22a: 0x812d, 0x22b: 0x812d, 0x22c: 0x812d, 0x22d: 0x992d, 0x22e: 0x992d, 0x22f: 0x812d, 0x230: 0x992d, 0x231: 0x992d, 0x232: 0x812d, 0x233: 0x812d, 0x234: 0x8101, 0x235: 0x8101, 0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812d, 0x23a: 0x812d, 0x23b: 0x812d, 0x23c: 0x812d, 0x23d: 0x8132, 0x23e: 0x8132, 0x23f: 0x8132, // Block 0x9, offset 0x240 0x240: 0x49ae, 0x241: 0x49b3, 0x242: 0x9932, 0x243: 0x49b8, 0x244: 0x4a71, 0x245: 0x9936, 0x246: 0x8132, 0x247: 0x812d, 0x248: 0x812d, 0x249: 0x812d, 0x24a: 0x8132, 0x24b: 0x8132, 0x24c: 0x8132, 0x24d: 0x812d, 0x24e: 0x812d, 0x250: 0x8132, 0x251: 0x8132, 0x252: 0x8132, 0x253: 0x812d, 0x254: 0x812d, 0x255: 0x812d, 0x256: 0x812d, 0x257: 0x8132, 0x258: 0x8133, 0x259: 0x812d, 0x25a: 0x812d, 0x25b: 0x8132, 0x25c: 0x8134, 0x25d: 0x8135, 0x25e: 0x8135, 0x25f: 0x8134, 0x260: 0x8135, 0x261: 0x8135, 0x262: 0x8134, 0x263: 0x8132, 0x264: 0x8132, 0x265: 0x8132, 0x266: 0x8132, 0x267: 0x8132, 0x268: 0x8132, 0x269: 0x8132, 0x26a: 0x8132, 0x26b: 0x8132, 0x26c: 0x8132, 0x26d: 0x8132, 0x26e: 0x8132, 0x26f: 0x8132, 0x274: 0x0170, 0x27a: 0x8100, 0x27e: 0x0037, // Block 0xa, offset 0x280 0x284: 0x8100, 0x285: 0x35a1, 0x286: 0x35e9, 0x287: 0x00ce, 0x288: 0x3607, 0x289: 0x3613, 0x28a: 0x3625, 0x28c: 0x3643, 0x28e: 0x3655, 0x28f: 0x3673, 0x290: 0x3e08, 0x291: 0xa000, 0x295: 0xa000, 0x297: 0xa000, 0x299: 0xa000, 0x29f: 0xa000, 0x2a1: 0xa000, 0x2a5: 0xa000, 0x2a9: 0xa000, 0x2aa: 0x3637, 0x2ab: 0x3667, 0x2ac: 0x47fe, 0x2ad: 0x3697, 0x2ae: 0x4828, 0x2af: 0x36a9, 0x2b0: 0x3e70, 0x2b1: 0xa000, 0x2b5: 0xa000, 0x2b7: 0xa000, 0x2b9: 0xa000, 0x2bf: 0xa000, // Block 0xb, offset 0x2c0 0x2c0: 0x3721, 0x2c1: 0x372d, 0x2c3: 0x371b, 0x2c6: 0xa000, 0x2c7: 0x3709, 0x2cc: 0x375d, 0x2cd: 0x3745, 0x2ce: 0x376f, 0x2d0: 0xa000, 0x2d3: 0xa000, 0x2d5: 0xa000, 0x2d6: 0xa000, 0x2d7: 0xa000, 0x2d8: 0xa000, 0x2d9: 0x3751, 0x2da: 0xa000, 0x2de: 0xa000, 0x2e3: 0xa000, 0x2e7: 0xa000, 0x2eb: 0xa000, 0x2ed: 0xa000, 0x2f0: 0xa000, 0x2f3: 0xa000, 0x2f5: 0xa000, 0x2f6: 0xa000, 0x2f7: 0xa000, 0x2f8: 0xa000, 0x2f9: 0x37d5, 0x2fa: 0xa000, 0x2fe: 0xa000, // Block 0xc, offset 0x300 0x301: 0x3733, 0x302: 0x37b7, 0x310: 0x370f, 0x311: 0x3793, 0x312: 0x3715, 0x313: 0x3799, 0x316: 0x3727, 0x317: 0x37ab, 0x318: 0xa000, 0x319: 0xa000, 0x31a: 0x3829, 0x31b: 0x382f, 0x31c: 0x3739, 0x31d: 0x37bd, 0x31e: 0x373f, 0x31f: 0x37c3, 0x322: 0x374b, 0x323: 0x37cf, 0x324: 0x3757, 0x325: 0x37db, 0x326: 0x3763, 0x327: 0x37e7, 0x328: 0xa000, 0x329: 0xa000, 0x32a: 0x3835, 0x32b: 0x383b, 0x32c: 0x378d, 0x32d: 0x3811, 0x32e: 0x3769, 0x32f: 0x37ed, 0x330: 0x3775, 0x331: 0x37f9, 0x332: 0x377b, 0x333: 0x37ff, 0x334: 0x3781, 0x335: 0x3805, 0x338: 0x3787, 0x339: 0x380b, // Block 0xd, offset 0x340 0x351: 0x812d, 0x352: 0x8132, 0x353: 0x8132, 0x354: 0x8132, 0x355: 0x8132, 0x356: 0x812d, 0x357: 0x8132, 0x358: 0x8132, 0x359: 0x8132, 0x35a: 0x812e, 0x35b: 0x812d, 0x35c: 0x8132, 0x35d: 0x8132, 0x35e: 0x8132, 0x35f: 0x8132, 0x360: 0x8132, 0x361: 0x8132, 0x362: 0x812d, 0x363: 0x812d, 0x364: 0x812d, 0x365: 0x812d, 0x366: 0x812d, 0x367: 0x812d, 0x368: 0x8132, 0x369: 0x8132, 0x36a: 0x812d, 0x36b: 0x8132, 0x36c: 0x8132, 0x36d: 0x812e, 0x36e: 0x8131, 0x36f: 0x8132, 0x370: 0x8105, 0x371: 0x8106, 0x372: 0x8107, 0x373: 0x8108, 0x374: 0x8109, 0x375: 0x810a, 0x376: 0x810b, 0x377: 0x810c, 0x378: 0x810d, 0x379: 0x810e, 0x37a: 0x810e, 0x37b: 0x810f, 0x37c: 0x8110, 0x37d: 0x8111, 0x37f: 0x8112, // Block 0xe, offset 0x380 0x388: 0xa000, 0x38a: 0xa000, 0x38b: 0x8116, 0x38c: 0x8117, 0x38d: 0x8118, 0x38e: 0x8119, 0x38f: 0x811a, 0x390: 0x811b, 0x391: 0x811c, 0x392: 0x811d, 0x393: 0x9932, 0x394: 0x9932, 0x395: 0x992d, 0x396: 0x812d, 0x397: 0x8132, 0x398: 0x8132, 0x399: 0x8132, 0x39a: 0x8132, 0x39b: 0x8132, 0x39c: 0x812d, 0x39d: 0x8132, 0x39e: 0x8132, 0x39f: 0x812d, 0x3b0: 0x811e, // Block 0xf, offset 0x3c0 0x3c5: 0xa000, 0x3c6: 0x2d26, 0x3c7: 0xa000, 0x3c8: 0x2d2e, 0x3c9: 0xa000, 0x3ca: 0x2d36, 0x3cb: 0xa000, 0x3cc: 0x2d3e, 0x3cd: 0xa000, 0x3ce: 0x2d46, 0x3d1: 0xa000, 0x3d2: 0x2d4e, 0x3f4: 0x8102, 0x3f5: 0x9900, 0x3fa: 0xa000, 0x3fb: 0x2d56, 0x3fc: 0xa000, 0x3fd: 0x2d5e, 0x3fe: 0xa000, 0x3ff: 0xa000, // Block 0x10, offset 0x400 0x400: 0x2f97, 0x401: 0x32a3, 0x402: 0x2fa1, 0x403: 0x32ad, 0x404: 0x2fa6, 0x405: 0x32b2, 0x406: 0x2fab, 0x407: 0x32b7, 0x408: 0x38cc, 0x409: 0x3a5b, 0x40a: 0x2fc4, 0x40b: 0x32d0, 0x40c: 0x2fce, 0x40d: 0x32da, 0x40e: 0x2fdd, 0x40f: 0x32e9, 0x410: 0x2fd3, 0x411: 0x32df, 0x412: 0x2fd8, 0x413: 0x32e4, 0x414: 0x38ef, 0x415: 0x3a7e, 0x416: 0x38f6, 0x417: 0x3a85, 0x418: 0x3019, 0x419: 0x3325, 0x41a: 0x301e, 0x41b: 0x332a, 0x41c: 0x3904, 0x41d: 0x3a93, 0x41e: 0x3023, 0x41f: 0x332f, 0x420: 0x3032, 0x421: 0x333e, 0x422: 0x3050, 0x423: 0x335c, 0x424: 0x305f, 0x425: 0x336b, 0x426: 0x3055, 0x427: 0x3361, 0x428: 0x3064, 0x429: 0x3370, 0x42a: 0x3069, 0x42b: 0x3375, 0x42c: 0x30af, 0x42d: 0x33bb, 0x42e: 0x390b, 0x42f: 0x3a9a, 0x430: 0x30b9, 0x431: 0x33ca, 0x432: 0x30c3, 0x433: 0x33d4, 0x434: 0x30cd, 0x435: 0x33de, 0x436: 0x46c4, 0x437: 0x4755, 0x438: 0x3912, 0x439: 0x3aa1, 0x43a: 0x30e6, 0x43b: 0x33f7, 0x43c: 0x30e1, 0x43d: 0x33f2, 0x43e: 0x30eb, 0x43f: 0x33fc, // Block 0x11, offset 0x440 0x440: 0x30f0, 0x441: 0x3401, 0x442: 0x30f5, 0x443: 0x3406, 0x444: 0x3109, 0x445: 0x341a, 0x446: 0x3113, 0x447: 0x3424, 0x448: 0x3122, 0x449: 0x3433, 0x44a: 0x311d, 0x44b: 0x342e, 0x44c: 0x3935, 0x44d: 0x3ac4, 0x44e: 0x3943, 0x44f: 0x3ad2, 0x450: 0x394a, 0x451: 0x3ad9, 0x452: 0x3951, 0x453: 0x3ae0, 0x454: 0x314f, 0x455: 0x3460, 0x456: 0x3154, 0x457: 0x3465, 0x458: 0x315e, 0x459: 0x346f, 0x45a: 0x46f1, 0x45b: 0x4782, 0x45c: 0x3997, 0x45d: 0x3b26, 0x45e: 0x3177, 0x45f: 0x3488, 0x460: 0x3181, 0x461: 0x3492, 0x462: 0x4700, 0x463: 0x4791, 0x464: 0x399e, 0x465: 0x3b2d, 0x466: 0x39a5, 0x467: 0x3b34, 0x468: 0x39ac, 0x469: 0x3b3b, 0x46a: 0x3190, 0x46b: 0x34a1, 0x46c: 0x319a, 0x46d: 0x34b0, 0x46e: 0x31ae, 0x46f: 0x34c4, 0x470: 0x31a9, 0x471: 0x34bf, 0x472: 0x31ea, 0x473: 0x3500, 0x474: 0x31f9, 0x475: 0x350f, 0x476: 0x31f4, 0x477: 0x350a, 0x478: 0x39b3, 0x479: 0x3b42, 0x47a: 0x39ba, 0x47b: 0x3b49, 0x47c: 0x31fe, 0x47d: 0x3514, 0x47e: 0x3203, 0x47f: 0x3519, // Block 0x12, offset 0x480 0x480: 0x3208, 0x481: 0x351e, 0x482: 0x320d, 0x483: 0x3523, 0x484: 0x321c, 0x485: 0x3532, 0x486: 0x3217, 0x487: 0x352d, 0x488: 0x3221, 0x489: 0x353c, 0x48a: 0x3226, 0x48b: 0x3541, 0x48c: 0x322b, 0x48d: 0x3546, 0x48e: 0x3249, 0x48f: 0x3564, 0x490: 0x3262, 0x491: 0x3582, 0x492: 0x3271, 0x493: 0x3591, 0x494: 0x3276, 0x495: 0x3596, 0x496: 0x337a, 0x497: 0x34a6, 0x498: 0x3537, 0x499: 0x3573, 0x49b: 0x35d1, 0x4a0: 0x46a1, 0x4a1: 0x4732, 0x4a2: 0x2f83, 0x4a3: 0x328f, 0x4a4: 0x3878, 0x4a5: 0x3a07, 0x4a6: 0x3871, 0x4a7: 0x3a00, 0x4a8: 0x3886, 0x4a9: 0x3a15, 0x4aa: 0x387f, 0x4ab: 0x3a0e, 0x4ac: 0x38be, 0x4ad: 0x3a4d, 0x4ae: 0x3894, 0x4af: 0x3a23, 0x4b0: 0x388d, 0x4b1: 0x3a1c, 0x4b2: 0x38a2, 0x4b3: 0x3a31, 0x4b4: 0x389b, 0x4b5: 0x3a2a, 0x4b6: 0x38c5, 0x4b7: 0x3a54, 0x4b8: 0x46b5, 0x4b9: 0x4746, 0x4ba: 0x3000, 0x4bb: 0x330c, 0x4bc: 0x2fec, 0x4bd: 0x32f8, 0x4be: 0x38da, 0x4bf: 0x3a69, // Block 0x13, offset 0x4c0 0x4c0: 0x38d3, 0x4c1: 0x3a62, 0x4c2: 0x38e8, 0x4c3: 0x3a77, 0x4c4: 0x38e1, 0x4c5: 0x3a70, 0x4c6: 0x38fd, 0x4c7: 0x3a8c, 0x4c8: 0x3091, 0x4c9: 0x339d, 0x4ca: 0x30a5, 0x4cb: 0x33b1, 0x4cc: 0x46e7, 0x4cd: 0x4778, 0x4ce: 0x3136, 0x4cf: 0x3447, 0x4d0: 0x3920, 0x4d1: 0x3aaf, 0x4d2: 0x3919, 0x4d3: 0x3aa8, 0x4d4: 0x392e, 0x4d5: 0x3abd, 0x4d6: 0x3927, 0x4d7: 0x3ab6, 0x4d8: 0x3989, 0x4d9: 0x3b18, 0x4da: 0x396d, 0x4db: 0x3afc, 0x4dc: 0x3966, 0x4dd: 0x3af5, 0x4de: 0x397b, 0x4df: 0x3b0a, 0x4e0: 0x3974, 0x4e1: 0x3b03, 0x4e2: 0x3982, 0x4e3: 0x3b11, 0x4e4: 0x31e5, 0x4e5: 0x34fb, 0x4e6: 0x31c7, 0x4e7: 0x34dd, 0x4e8: 0x39e4, 0x4e9: 0x3b73, 0x4ea: 0x39dd, 0x4eb: 0x3b6c, 0x4ec: 0x39f2, 0x4ed: 0x3b81, 0x4ee: 0x39eb, 0x4ef: 0x3b7a, 0x4f0: 0x39f9, 0x4f1: 0x3b88, 0x4f2: 0x3230, 0x4f3: 0x354b, 0x4f4: 0x3258, 0x4f5: 0x3578, 0x4f6: 0x3253, 0x4f7: 0x356e, 0x4f8: 0x323f, 0x4f9: 0x355a, // Block 0x14, offset 0x500 0x500: 0x4804, 0x501: 0x480a, 0x502: 0x491e, 0x503: 0x4936, 0x504: 0x4926, 0x505: 0x493e, 0x506: 0x492e, 0x507: 0x4946, 0x508: 0x47aa, 0x509: 0x47b0, 0x50a: 0x488e, 0x50b: 0x48a6, 0x50c: 0x4896, 0x50d: 0x48ae, 0x50e: 0x489e, 0x50f: 0x48b6, 0x510: 0x4816, 0x511: 0x481c, 0x512: 0x3db8, 0x513: 0x3dc8, 0x514: 0x3dc0, 0x515: 0x3dd0, 0x518: 0x47b6, 0x519: 0x47bc, 0x51a: 0x3ce8, 0x51b: 0x3cf8, 0x51c: 0x3cf0, 0x51d: 0x3d00, 0x520: 0x482e, 0x521: 0x4834, 0x522: 0x494e, 0x523: 0x4966, 0x524: 0x4956, 0x525: 0x496e, 0x526: 0x495e, 0x527: 0x4976, 0x528: 0x47c2, 0x529: 0x47c8, 0x52a: 0x48be, 0x52b: 0x48d6, 0x52c: 0x48c6, 0x52d: 0x48de, 0x52e: 0x48ce, 0x52f: 0x48e6, 0x530: 0x4846, 0x531: 0x484c, 0x532: 0x3e18, 0x533: 0x3e30, 0x534: 0x3e20, 0x535: 0x3e38, 0x536: 0x3e28, 0x537: 0x3e40, 0x538: 0x47ce, 0x539: 0x47d4, 0x53a: 0x3d18, 0x53b: 0x3d30, 0x53c: 0x3d20, 0x53d: 0x3d38, 0x53e: 0x3d28, 0x53f: 0x3d40, // Block 0x15, offset 0x540 0x540: 0x4852, 0x541: 0x4858, 0x542: 0x3e48, 0x543: 0x3e58, 0x544: 0x3e50, 0x545: 0x3e60, 0x548: 0x47da, 0x549: 0x47e0, 0x54a: 0x3d48, 0x54b: 0x3d58, 0x54c: 0x3d50, 0x54d: 0x3d60, 0x550: 0x4864, 0x551: 0x486a, 0x552: 0x3e80, 0x553: 0x3e98, 0x554: 0x3e88, 0x555: 0x3ea0, 0x556: 0x3e90, 0x557: 0x3ea8, 0x559: 0x47e6, 0x55b: 0x3d68, 0x55d: 0x3d70, 0x55f: 0x3d78, 0x560: 0x487c, 0x561: 0x4882, 0x562: 0x497e, 0x563: 0x4996, 0x564: 0x4986, 0x565: 0x499e, 0x566: 0x498e, 0x567: 0x49a6, 0x568: 0x47ec, 0x569: 0x47f2, 0x56a: 0x48ee, 0x56b: 0x4906, 0x56c: 0x48f6, 0x56d: 0x490e, 0x56e: 0x48fe, 0x56f: 0x4916, 0x570: 0x47f8, 0x571: 0x431e, 0x572: 0x3691, 0x573: 0x4324, 0x574: 0x4822, 0x575: 0x432a, 0x576: 0x36a3, 0x577: 0x4330, 0x578: 0x36c1, 0x579: 0x4336, 0x57a: 0x36d9, 0x57b: 0x433c, 0x57c: 0x4870, 0x57d: 0x4342, // Block 0x16, offset 0x580 0x580: 0x3da0, 0x581: 0x3da8, 0x582: 0x4184, 0x583: 0x41a2, 0x584: 0x418e, 0x585: 0x41ac, 0x586: 0x4198, 0x587: 0x41b6, 0x588: 0x3cd8, 0x589: 0x3ce0, 0x58a: 0x40d0, 0x58b: 0x40ee, 0x58c: 0x40da, 0x58d: 0x40f8, 0x58e: 0x40e4, 0x58f: 0x4102, 0x590: 0x3de8, 0x591: 0x3df0, 0x592: 0x41c0, 0x593: 0x41de, 0x594: 0x41ca, 0x595: 0x41e8, 0x596: 0x41d4, 0x597: 0x41f2, 0x598: 0x3d08, 0x599: 0x3d10, 0x59a: 0x410c, 0x59b: 0x412a, 0x59c: 0x4116, 0x59d: 0x4134, 0x59e: 0x4120, 0x59f: 0x413e, 0x5a0: 0x3ec0, 0x5a1: 0x3ec8, 0x5a2: 0x41fc, 0x5a3: 0x421a, 0x5a4: 0x4206, 0x5a5: 0x4224, 0x5a6: 0x4210, 0x5a7: 0x422e, 0x5a8: 0x3d80, 0x5a9: 0x3d88, 0x5aa: 0x4148, 0x5ab: 0x4166, 0x5ac: 0x4152, 0x5ad: 0x4170, 0x5ae: 0x415c, 0x5af: 0x417a, 0x5b0: 0x3685, 0x5b1: 0x367f, 0x5b2: 0x3d90, 0x5b3: 0x368b, 0x5b4: 0x3d98, 0x5b6: 0x4810, 0x5b7: 0x3db0, 0x5b8: 0x35f5, 0x5b9: 0x35ef, 0x5ba: 0x35e3, 0x5bb: 0x42ee, 0x5bc: 0x35fb, 0x5bd: 0x8100, 0x5be: 0x01d3, 0x5bf: 0xa100, // Block 0x17, offset 0x5c0 0x5c0: 0x8100, 0x5c1: 0x35a7, 0x5c2: 0x3dd8, 0x5c3: 0x369d, 0x5c4: 0x3de0, 0x5c6: 0x483a, 0x5c7: 0x3df8, 0x5c8: 0x3601, 0x5c9: 0x42f4, 0x5ca: 0x360d, 0x5cb: 0x42fa, 0x5cc: 0x3619, 0x5cd: 0x3b8f, 0x5ce: 0x3b96, 0x5cf: 0x3b9d, 0x5d0: 0x36b5, 0x5d1: 0x36af, 0x5d2: 0x3e00, 0x5d3: 0x44e4, 0x5d6: 0x36bb, 0x5d7: 0x3e10, 0x5d8: 0x3631, 0x5d9: 0x362b, 0x5da: 0x361f, 0x5db: 0x4300, 0x5dd: 0x3ba4, 0x5de: 0x3bab, 0x5df: 0x3bb2, 0x5e0: 0x36eb, 0x5e1: 0x36e5, 0x5e2: 0x3e68, 0x5e3: 0x44ec, 0x5e4: 0x36cd, 0x5e5: 0x36d3, 0x5e6: 0x36f1, 0x5e7: 0x3e78, 0x5e8: 0x3661, 0x5e9: 0x365b, 0x5ea: 0x364f, 0x5eb: 0x430c, 0x5ec: 0x3649, 0x5ed: 0x359b, 0x5ee: 0x42e8, 0x5ef: 0x0081, 0x5f2: 0x3eb0, 0x5f3: 0x36f7, 0x5f4: 0x3eb8, 0x5f6: 0x4888, 0x5f7: 0x3ed0, 0x5f8: 0x363d, 0x5f9: 0x4306, 0x5fa: 0x366d, 0x5fb: 0x4318, 0x5fc: 0x3679, 0x5fd: 0x4256, 0x5fe: 0xa100, // Block 0x18, offset 0x600 0x601: 0x3c06, 0x603: 0xa000, 0x604: 0x3c0d, 0x605: 0xa000, 0x607: 0x3c14, 0x608: 0xa000, 0x609: 0x3c1b, 0x60d: 0xa000, 0x620: 0x2f65, 0x621: 0xa000, 0x622: 0x3c29, 0x624: 0xa000, 0x625: 0xa000, 0x62d: 0x3c22, 0x62e: 0x2f60, 0x62f: 0x2f6a, 0x630: 0x3c30, 0x631: 0x3c37, 0x632: 0xa000, 0x633: 0xa000, 0x634: 0x3c3e, 0x635: 0x3c45, 0x636: 0xa000, 0x637: 0xa000, 0x638: 0x3c4c, 0x639: 0x3c53, 0x63a: 0xa000, 0x63b: 0xa000, 0x63c: 0xa000, 0x63d: 0xa000, // Block 0x19, offset 0x640 0x640: 0x3c5a, 0x641: 0x3c61, 0x642: 0xa000, 0x643: 0xa000, 0x644: 0x3c76, 0x645: 0x3c7d, 0x646: 0xa000, 0x647: 0xa000, 0x648: 0x3c84, 0x649: 0x3c8b, 0x651: 0xa000, 0x652: 0xa000, 0x662: 0xa000, 0x668: 0xa000, 0x669: 0xa000, 0x66b: 0xa000, 0x66c: 0x3ca0, 0x66d: 0x3ca7, 0x66e: 0x3cae, 0x66f: 0x3cb5, 0x672: 0xa000, 0x673: 0xa000, 0x674: 0xa000, 0x675: 0xa000, // Block 0x1a, offset 0x680 0x686: 0xa000, 0x68b: 0xa000, 0x68c: 0x3f08, 0x68d: 0xa000, 0x68e: 0x3f10, 0x68f: 0xa000, 0x690: 0x3f18, 0x691: 0xa000, 0x692: 0x3f20, 0x693: 0xa000, 0x694: 0x3f28, 0x695: 0xa000, 0x696: 0x3f30, 0x697: 0xa000, 0x698: 0x3f38, 0x699: 0xa000, 0x69a: 0x3f40, 0x69b: 0xa000, 0x69c: 0x3f48, 0x69d: 0xa000, 0x69e: 0x3f50, 0x69f: 0xa000, 0x6a0: 0x3f58, 0x6a1: 0xa000, 0x6a2: 0x3f60, 0x6a4: 0xa000, 0x6a5: 0x3f68, 0x6a6: 0xa000, 0x6a7: 0x3f70, 0x6a8: 0xa000, 0x6a9: 0x3f78, 0x6af: 0xa000, 0x6b0: 0x3f80, 0x6b1: 0x3f88, 0x6b2: 0xa000, 0x6b3: 0x3f90, 0x6b4: 0x3f98, 0x6b5: 0xa000, 0x6b6: 0x3fa0, 0x6b7: 0x3fa8, 0x6b8: 0xa000, 0x6b9: 0x3fb0, 0x6ba: 0x3fb8, 0x6bb: 0xa000, 0x6bc: 0x3fc0, 0x6bd: 0x3fc8, // Block 0x1b, offset 0x6c0 0x6d4: 0x3f00, 0x6d9: 0x9903, 0x6da: 0x9903, 0x6db: 0x8100, 0x6dc: 0x8100, 0x6dd: 0xa000, 0x6de: 0x3fd0, 0x6e6: 0xa000, 0x6eb: 0xa000, 0x6ec: 0x3fe0, 0x6ed: 0xa000, 0x6ee: 0x3fe8, 0x6ef: 0xa000, 0x6f0: 0x3ff0, 0x6f1: 0xa000, 0x6f2: 0x3ff8, 0x6f3: 0xa000, 0x6f4: 0x4000, 0x6f5: 0xa000, 0x6f6: 0x4008, 0x6f7: 0xa000, 0x6f8: 0x4010, 0x6f9: 0xa000, 0x6fa: 0x4018, 0x6fb: 0xa000, 0x6fc: 0x4020, 0x6fd: 0xa000, 0x6fe: 0x4028, 0x6ff: 0xa000, // Block 0x1c, offset 0x700 0x700: 0x4030, 0x701: 0xa000, 0x702: 0x4038, 0x704: 0xa000, 0x705: 0x4040, 0x706: 0xa000, 0x707: 0x4048, 0x708: 0xa000, 0x709: 0x4050, 0x70f: 0xa000, 0x710: 0x4058, 0x711: 0x4060, 0x712: 0xa000, 0x713: 0x4068, 0x714: 0x4070, 0x715: 0xa000, 0x716: 0x4078, 0x717: 0x4080, 0x718: 0xa000, 0x719: 0x4088, 0x71a: 0x4090, 0x71b: 0xa000, 0x71c: 0x4098, 0x71d: 0x40a0, 0x72f: 0xa000, 0x730: 0xa000, 0x731: 0xa000, 0x732: 0xa000, 0x734: 0x3fd8, 0x737: 0x40a8, 0x738: 0x40b0, 0x739: 0x40b8, 0x73a: 0x40c0, 0x73d: 0xa000, 0x73e: 0x40c8, // Block 0x1d, offset 0x740 0x740: 0x1377, 0x741: 0x0cfb, 0x742: 0x13d3, 0x743: 0x139f, 0x744: 0x0e57, 0x745: 0x06eb, 0x746: 0x08df, 0x747: 0x162b, 0x748: 0x162b, 0x749: 0x0a0b, 0x74a: 0x145f, 0x74b: 0x0943, 0x74c: 0x0a07, 0x74d: 0x0bef, 0x74e: 0x0fcf, 0x74f: 0x115f, 0x750: 0x1297, 0x751: 0x12d3, 0x752: 0x1307, 0x753: 0x141b, 0x754: 0x0d73, 0x755: 0x0dff, 0x756: 0x0eab, 0x757: 0x0f43, 0x758: 0x125f, 0x759: 0x1447, 0x75a: 0x1573, 0x75b: 0x070f, 0x75c: 0x08b3, 0x75d: 0x0d87, 0x75e: 0x0ecf, 0x75f: 0x1293, 0x760: 0x15c3, 0x761: 0x0ab3, 0x762: 0x0e77, 0x763: 0x1283, 0x764: 0x1317, 0x765: 0x0c23, 0x766: 0x11bb, 0x767: 0x12df, 0x768: 0x0b1f, 0x769: 0x0d0f, 0x76a: 0x0e17, 0x76b: 0x0f1b, 0x76c: 0x1427, 0x76d: 0x074f, 0x76e: 0x07e7, 0x76f: 0x0853, 0x770: 0x0c8b, 0x771: 0x0d7f, 0x772: 0x0ecb, 0x773: 0x0fef, 0x774: 0x1177, 0x775: 0x128b, 0x776: 0x12a3, 0x777: 0x13c7, 0x778: 0x14ef, 0x779: 0x15a3, 0x77a: 0x15bf, 0x77b: 0x102b, 0x77c: 0x106b, 0x77d: 0x1123, 0x77e: 0x1243, 0x77f: 0x147b, // Block 0x1e, offset 0x780 0x780: 0x15cb, 0x781: 0x134b, 0x782: 0x09c7, 0x783: 0x0b3b, 0x784: 0x10db, 0x785: 0x119b, 0x786: 0x0eff, 0x787: 0x1033, 0x788: 0x1397, 0x789: 0x14e7, 0x78a: 0x09c3, 0x78b: 0x0a8f, 0x78c: 0x0d77, 0x78d: 0x0e2b, 0x78e: 0x0e5f, 0x78f: 0x1113, 0x790: 0x113b, 0x791: 0x14a7, 0x792: 0x084f, 0x793: 0x11a7, 0x794: 0x07f3, 0x795: 0x07ef, 0x796: 0x1097, 0x797: 0x1127, 0x798: 0x125b, 0x799: 0x14af, 0x79a: 0x1367, 0x79b: 0x0c27, 0x79c: 0x0d73, 0x79d: 0x1357, 0x79e: 0x06f7, 0x79f: 0x0a63, 0x7a0: 0x0b93, 0x7a1: 0x0f2f, 0x7a2: 0x0faf, 0x7a3: 0x0873, 0x7a4: 0x103b, 0x7a5: 0x075f, 0x7a6: 0x0b77, 0x7a7: 0x06d7, 0x7a8: 0x0deb, 0x7a9: 0x0ca3, 0x7aa: 0x110f, 0x7ab: 0x08c7, 0x7ac: 0x09b3, 0x7ad: 0x0ffb, 0x7ae: 0x1263, 0x7af: 0x133b, 0x7b0: 0x0db7, 0x7b1: 0x13f7, 0x7b2: 0x0de3, 0x7b3: 0x0c37, 0x7b4: 0x121b, 0x7b5: 0x0c57, 0x7b6: 0x0fab, 0x7b7: 0x072b, 0x7b8: 0x07a7, 0x7b9: 0x07eb, 0x7ba: 0x0d53, 0x7bb: 0x10fb, 0x7bc: 0x11f3, 0x7bd: 0x1347, 0x7be: 0x145b, 0x7bf: 0x085b, // Block 0x1f, offset 0x7c0 0x7c0: 0x090f, 0x7c1: 0x0a17, 0x7c2: 0x0b2f, 0x7c3: 0x0cbf, 0x7c4: 0x0e7b, 0x7c5: 0x103f, 0x7c6: 0x1497, 0x7c7: 0x157b, 0x7c8: 0x15cf, 0x7c9: 0x15e7, 0x7ca: 0x0837, 0x7cb: 0x0cf3, 0x7cc: 0x0da3, 0x7cd: 0x13eb, 0x7ce: 0x0afb, 0x7cf: 0x0bd7, 0x7d0: 0x0bf3, 0x7d1: 0x0c83, 0x7d2: 0x0e6b, 0x7d3: 0x0eb7, 0x7d4: 0x0f67, 0x7d5: 0x108b, 0x7d6: 0x112f, 0x7d7: 0x1193, 0x7d8: 0x13db, 0x7d9: 0x126b, 0x7da: 0x1403, 0x7db: 0x147f, 0x7dc: 0x080f, 0x7dd: 0x083b, 0x7de: 0x0923, 0x7df: 0x0ea7, 0x7e0: 0x12f3, 0x7e1: 0x133b, 0x7e2: 0x0b1b, 0x7e3: 0x0b8b, 0x7e4: 0x0c4f, 0x7e5: 0x0daf, 0x7e6: 0x10d7, 0x7e7: 0x0f23, 0x7e8: 0x073b, 0x7e9: 0x097f, 0x7ea: 0x0a63, 0x7eb: 0x0ac7, 0x7ec: 0x0b97, 0x7ed: 0x0f3f, 0x7ee: 0x0f5b, 0x7ef: 0x116b, 0x7f0: 0x118b, 0x7f1: 0x1463, 0x7f2: 0x14e3, 0x7f3: 0x14f3, 0x7f4: 0x152f, 0x7f5: 0x0753, 0x7f6: 0x107f, 0x7f7: 0x144f, 0x7f8: 0x14cb, 0x7f9: 0x0baf, 0x7fa: 0x0717, 0x7fb: 0x0777, 0x7fc: 0x0a67, 0x7fd: 0x0a87, 0x7fe: 0x0caf, 0x7ff: 0x0d73, // Block 0x20, offset 0x800 0x800: 0x0ec3, 0x801: 0x0fcb, 0x802: 0x1277, 0x803: 0x1417, 0x804: 0x1623, 0x805: 0x0ce3, 0x806: 0x14a3, 0x807: 0x0833, 0x808: 0x0d2f, 0x809: 0x0d3b, 0x80a: 0x0e0f, 0x80b: 0x0e47, 0x80c: 0x0f4b, 0x80d: 0x0fa7, 0x80e: 0x1027, 0x80f: 0x110b, 0x810: 0x153b, 0x811: 0x07af, 0x812: 0x0c03, 0x813: 0x14b3, 0x814: 0x0767, 0x815: 0x0aab, 0x816: 0x0e2f, 0x817: 0x13df, 0x818: 0x0b67, 0x819: 0x0bb7, 0x81a: 0x0d43, 0x81b: 0x0f2f, 0x81c: 0x14bb, 0x81d: 0x0817, 0x81e: 0x08ff, 0x81f: 0x0a97, 0x820: 0x0cd3, 0x821: 0x0d1f, 0x822: 0x0d5f, 0x823: 0x0df3, 0x824: 0x0f47, 0x825: 0x0fbb, 0x826: 0x1157, 0x827: 0x12f7, 0x828: 0x1303, 0x829: 0x1457, 0x82a: 0x14d7, 0x82b: 0x0883, 0x82c: 0x0e4b, 0x82d: 0x0903, 0x82e: 0x0ec7, 0x82f: 0x0f6b, 0x830: 0x1287, 0x831: 0x14bf, 0x832: 0x15ab, 0x833: 0x15d3, 0x834: 0x0d37, 0x835: 0x0e27, 0x836: 0x11c3, 0x837: 0x10b7, 0x838: 0x10c3, 0x839: 0x10e7, 0x83a: 0x0f17, 0x83b: 0x0e9f, 0x83c: 0x1363, 0x83d: 0x0733, 0x83e: 0x122b, 0x83f: 0x081b, // Block 0x21, offset 0x840 0x840: 0x080b, 0x841: 0x0b0b, 0x842: 0x0c2b, 0x843: 0x10f3, 0x844: 0x0a53, 0x845: 0x0e03, 0x846: 0x0cef, 0x847: 0x13e7, 0x848: 0x12e7, 0x849: 0x14ab, 0x84a: 0x1323, 0x84b: 0x0b27, 0x84c: 0x0787, 0x84d: 0x095b, 0x850: 0x09af, 0x852: 0x0cdf, 0x855: 0x07f7, 0x856: 0x0f1f, 0x857: 0x0fe3, 0x858: 0x1047, 0x859: 0x1063, 0x85a: 0x1067, 0x85b: 0x107b, 0x85c: 0x14fb, 0x85d: 0x10eb, 0x85e: 0x116f, 0x860: 0x128f, 0x862: 0x1353, 0x865: 0x1407, 0x866: 0x1433, 0x86a: 0x154f, 0x86b: 0x1553, 0x86c: 0x1557, 0x86d: 0x15bb, 0x86e: 0x142b, 0x86f: 0x14c7, 0x870: 0x0757, 0x871: 0x077b, 0x872: 0x078f, 0x873: 0x084b, 0x874: 0x0857, 0x875: 0x0897, 0x876: 0x094b, 0x877: 0x0967, 0x878: 0x096f, 0x879: 0x09ab, 0x87a: 0x09b7, 0x87b: 0x0a93, 0x87c: 0x0a9b, 0x87d: 0x0ba3, 0x87e: 0x0bcb, 0x87f: 0x0bd3, // Block 0x22, offset 0x880 0x880: 0x0beb, 0x881: 0x0c97, 0x882: 0x0cc7, 0x883: 0x0ce7, 0x884: 0x0d57, 0x885: 0x0e1b, 0x886: 0x0e37, 0x887: 0x0e67, 0x888: 0x0ebb, 0x889: 0x0edb, 0x88a: 0x0f4f, 0x88b: 0x102f, 0x88c: 0x104b, 0x88d: 0x1053, 0x88e: 0x104f, 0x88f: 0x1057, 0x890: 0x105b, 0x891: 0x105f, 0x892: 0x1073, 0x893: 0x1077, 0x894: 0x109b, 0x895: 0x10af, 0x896: 0x10cb, 0x897: 0x112f, 0x898: 0x1137, 0x899: 0x113f, 0x89a: 0x1153, 0x89b: 0x117b, 0x89c: 0x11cb, 0x89d: 0x11ff, 0x89e: 0x11ff, 0x89f: 0x1267, 0x8a0: 0x130f, 0x8a1: 0x1327, 0x8a2: 0x135b, 0x8a3: 0x135f, 0x8a4: 0x13a3, 0x8a5: 0x13a7, 0x8a6: 0x13ff, 0x8a7: 0x1407, 0x8a8: 0x14db, 0x8a9: 0x151f, 0x8aa: 0x1537, 0x8ab: 0x0b9b, 0x8ac: 0x171e, 0x8ad: 0x11e3, 0x8b0: 0x06df, 0x8b1: 0x07e3, 0x8b2: 0x07a3, 0x8b3: 0x074b, 0x8b4: 0x078b, 0x8b5: 0x07b7, 0x8b6: 0x0847, 0x8b7: 0x0863, 0x8b8: 0x094b, 0x8b9: 0x0937, 0x8ba: 0x0947, 0x8bb: 0x0963, 0x8bc: 0x09af, 0x8bd: 0x09bf, 0x8be: 0x0a03, 0x8bf: 0x0a0f, // Block 0x23, offset 0x8c0 0x8c0: 0x0a2b, 0x8c1: 0x0a3b, 0x8c2: 0x0b23, 0x8c3: 0x0b2b, 0x8c4: 0x0b5b, 0x8c5: 0x0b7b, 0x8c6: 0x0bab, 0x8c7: 0x0bc3, 0x8c8: 0x0bb3, 0x8c9: 0x0bd3, 0x8ca: 0x0bc7, 0x8cb: 0x0beb, 0x8cc: 0x0c07, 0x8cd: 0x0c5f, 0x8ce: 0x0c6b, 0x8cf: 0x0c73, 0x8d0: 0x0c9b, 0x8d1: 0x0cdf, 0x8d2: 0x0d0f, 0x8d3: 0x0d13, 0x8d4: 0x0d27, 0x8d5: 0x0da7, 0x8d6: 0x0db7, 0x8d7: 0x0e0f, 0x8d8: 0x0e5b, 0x8d9: 0x0e53, 0x8da: 0x0e67, 0x8db: 0x0e83, 0x8dc: 0x0ebb, 0x8dd: 0x1013, 0x8de: 0x0edf, 0x8df: 0x0f13, 0x8e0: 0x0f1f, 0x8e1: 0x0f5f, 0x8e2: 0x0f7b, 0x8e3: 0x0f9f, 0x8e4: 0x0fc3, 0x8e5: 0x0fc7, 0x8e6: 0x0fe3, 0x8e7: 0x0fe7, 0x8e8: 0x0ff7, 0x8e9: 0x100b, 0x8ea: 0x1007, 0x8eb: 0x1037, 0x8ec: 0x10b3, 0x8ed: 0x10cb, 0x8ee: 0x10e3, 0x8ef: 0x111b, 0x8f0: 0x112f, 0x8f1: 0x114b, 0x8f2: 0x117b, 0x8f3: 0x122f, 0x8f4: 0x1257, 0x8f5: 0x12cb, 0x8f6: 0x1313, 0x8f7: 0x131f, 0x8f8: 0x1327, 0x8f9: 0x133f, 0x8fa: 0x1353, 0x8fb: 0x1343, 0x8fc: 0x135b, 0x8fd: 0x1357, 0x8fe: 0x134f, 0x8ff: 0x135f, // Block 0x24, offset 0x900 0x900: 0x136b, 0x901: 0x13a7, 0x902: 0x13e3, 0x903: 0x1413, 0x904: 0x144b, 0x905: 0x146b, 0x906: 0x14b7, 0x907: 0x14db, 0x908: 0x14fb, 0x909: 0x150f, 0x90a: 0x151f, 0x90b: 0x152b, 0x90c: 0x1537, 0x90d: 0x158b, 0x90e: 0x162b, 0x90f: 0x16b5, 0x910: 0x16b0, 0x911: 0x16e2, 0x912: 0x0607, 0x913: 0x062f, 0x914: 0x0633, 0x915: 0x1764, 0x916: 0x1791, 0x917: 0x1809, 0x918: 0x1617, 0x919: 0x1627, // Block 0x25, offset 0x940 0x940: 0x06fb, 0x941: 0x06f3, 0x942: 0x0703, 0x943: 0x1647, 0x944: 0x0747, 0x945: 0x0757, 0x946: 0x075b, 0x947: 0x0763, 0x948: 0x076b, 0x949: 0x076f, 0x94a: 0x077b, 0x94b: 0x0773, 0x94c: 0x05b3, 0x94d: 0x165b, 0x94e: 0x078f, 0x94f: 0x0793, 0x950: 0x0797, 0x951: 0x07b3, 0x952: 0x164c, 0x953: 0x05b7, 0x954: 0x079f, 0x955: 0x07bf, 0x956: 0x1656, 0x957: 0x07cf, 0x958: 0x07d7, 0x959: 0x0737, 0x95a: 0x07df, 0x95b: 0x07e3, 0x95c: 0x1831, 0x95d: 0x07ff, 0x95e: 0x0807, 0x95f: 0x05bf, 0x960: 0x081f, 0x961: 0x0823, 0x962: 0x082b, 0x963: 0x082f, 0x964: 0x05c3, 0x965: 0x0847, 0x966: 0x084b, 0x967: 0x0857, 0x968: 0x0863, 0x969: 0x0867, 0x96a: 0x086b, 0x96b: 0x0873, 0x96c: 0x0893, 0x96d: 0x0897, 0x96e: 0x089f, 0x96f: 0x08af, 0x970: 0x08b7, 0x971: 0x08bb, 0x972: 0x08bb, 0x973: 0x08bb, 0x974: 0x166a, 0x975: 0x0e93, 0x976: 0x08cf, 0x977: 0x08d7, 0x978: 0x166f, 0x979: 0x08e3, 0x97a: 0x08eb, 0x97b: 0x08f3, 0x97c: 0x091b, 0x97d: 0x0907, 0x97e: 0x0913, 0x97f: 0x0917, // Block 0x26, offset 0x980 0x980: 0x091f, 0x981: 0x0927, 0x982: 0x092b, 0x983: 0x0933, 0x984: 0x093b, 0x985: 0x093f, 0x986: 0x093f, 0x987: 0x0947, 0x988: 0x094f, 0x989: 0x0953, 0x98a: 0x095f, 0x98b: 0x0983, 0x98c: 0x0967, 0x98d: 0x0987, 0x98e: 0x096b, 0x98f: 0x0973, 0x990: 0x080b, 0x991: 0x09cf, 0x992: 0x0997, 0x993: 0x099b, 0x994: 0x099f, 0x995: 0x0993, 0x996: 0x09a7, 0x997: 0x09a3, 0x998: 0x09bb, 0x999: 0x1674, 0x99a: 0x09d7, 0x99b: 0x09db, 0x99c: 0x09e3, 0x99d: 0x09ef, 0x99e: 0x09f7, 0x99f: 0x0a13, 0x9a0: 0x1679, 0x9a1: 0x167e, 0x9a2: 0x0a1f, 0x9a3: 0x0a23, 0x9a4: 0x0a27, 0x9a5: 0x0a1b, 0x9a6: 0x0a2f, 0x9a7: 0x05c7, 0x9a8: 0x05cb, 0x9a9: 0x0a37, 0x9aa: 0x0a3f, 0x9ab: 0x0a3f, 0x9ac: 0x1683, 0x9ad: 0x0a5b, 0x9ae: 0x0a5f, 0x9af: 0x0a63, 0x9b0: 0x0a6b, 0x9b1: 0x1688, 0x9b2: 0x0a73, 0x9b3: 0x0a77, 0x9b4: 0x0b4f, 0x9b5: 0x0a7f, 0x9b6: 0x05cf, 0x9b7: 0x0a8b, 0x9b8: 0x0a9b, 0x9b9: 0x0aa7, 0x9ba: 0x0aa3, 0x9bb: 0x1692, 0x9bc: 0x0aaf, 0x9bd: 0x1697, 0x9be: 0x0abb, 0x9bf: 0x0ab7, // Block 0x27, offset 0x9c0 0x9c0: 0x0abf, 0x9c1: 0x0acf, 0x9c2: 0x0ad3, 0x9c3: 0x05d3, 0x9c4: 0x0ae3, 0x9c5: 0x0aeb, 0x9c6: 0x0aef, 0x9c7: 0x0af3, 0x9c8: 0x05d7, 0x9c9: 0x169c, 0x9ca: 0x05db, 0x9cb: 0x0b0f, 0x9cc: 0x0b13, 0x9cd: 0x0b17, 0x9ce: 0x0b1f, 0x9cf: 0x1863, 0x9d0: 0x0b37, 0x9d1: 0x16a6, 0x9d2: 0x16a6, 0x9d3: 0x11d7, 0x9d4: 0x0b47, 0x9d5: 0x0b47, 0x9d6: 0x05df, 0x9d7: 0x16c9, 0x9d8: 0x179b, 0x9d9: 0x0b57, 0x9da: 0x0b5f, 0x9db: 0x05e3, 0x9dc: 0x0b73, 0x9dd: 0x0b83, 0x9de: 0x0b87, 0x9df: 0x0b8f, 0x9e0: 0x0b9f, 0x9e1: 0x05eb, 0x9e2: 0x05e7, 0x9e3: 0x0ba3, 0x9e4: 0x16ab, 0x9e5: 0x0ba7, 0x9e6: 0x0bbb, 0x9e7: 0x0bbf, 0x9e8: 0x0bc3, 0x9e9: 0x0bbf, 0x9ea: 0x0bcf, 0x9eb: 0x0bd3, 0x9ec: 0x0be3, 0x9ed: 0x0bdb, 0x9ee: 0x0bdf, 0x9ef: 0x0be7, 0x9f0: 0x0beb, 0x9f1: 0x0bef, 0x9f2: 0x0bfb, 0x9f3: 0x0bff, 0x9f4: 0x0c17, 0x9f5: 0x0c1f, 0x9f6: 0x0c2f, 0x9f7: 0x0c43, 0x9f8: 0x16ba, 0x9f9: 0x0c3f, 0x9fa: 0x0c33, 0x9fb: 0x0c4b, 0x9fc: 0x0c53, 0x9fd: 0x0c67, 0x9fe: 0x16bf, 0x9ff: 0x0c6f, // Block 0x28, offset 0xa00 0xa00: 0x0c63, 0xa01: 0x0c5b, 0xa02: 0x05ef, 0xa03: 0x0c77, 0xa04: 0x0c7f, 0xa05: 0x0c87, 0xa06: 0x0c7b, 0xa07: 0x05f3, 0xa08: 0x0c97, 0xa09: 0x0c9f, 0xa0a: 0x16c4, 0xa0b: 0x0ccb, 0xa0c: 0x0cff, 0xa0d: 0x0cdb, 0xa0e: 0x05ff, 0xa0f: 0x0ce7, 0xa10: 0x05fb, 0xa11: 0x05f7, 0xa12: 0x07c3, 0xa13: 0x07c7, 0xa14: 0x0d03, 0xa15: 0x0ceb, 0xa16: 0x11ab, 0xa17: 0x0663, 0xa18: 0x0d0f, 0xa19: 0x0d13, 0xa1a: 0x0d17, 0xa1b: 0x0d2b, 0xa1c: 0x0d23, 0xa1d: 0x16dd, 0xa1e: 0x0603, 0xa1f: 0x0d3f, 0xa20: 0x0d33, 0xa21: 0x0d4f, 0xa22: 0x0d57, 0xa23: 0x16e7, 0xa24: 0x0d5b, 0xa25: 0x0d47, 0xa26: 0x0d63, 0xa27: 0x0607, 0xa28: 0x0d67, 0xa29: 0x0d6b, 0xa2a: 0x0d6f, 0xa2b: 0x0d7b, 0xa2c: 0x16ec, 0xa2d: 0x0d83, 0xa2e: 0x060b, 0xa2f: 0x0d8f, 0xa30: 0x16f1, 0xa31: 0x0d93, 0xa32: 0x060f, 0xa33: 0x0d9f, 0xa34: 0x0dab, 0xa35: 0x0db7, 0xa36: 0x0dbb, 0xa37: 0x16f6, 0xa38: 0x168d, 0xa39: 0x16fb, 0xa3a: 0x0ddb, 0xa3b: 0x1700, 0xa3c: 0x0de7, 0xa3d: 0x0def, 0xa3e: 0x0ddf, 0xa3f: 0x0dfb, // Block 0x29, offset 0xa40 0xa40: 0x0e0b, 0xa41: 0x0e1b, 0xa42: 0x0e0f, 0xa43: 0x0e13, 0xa44: 0x0e1f, 0xa45: 0x0e23, 0xa46: 0x1705, 0xa47: 0x0e07, 0xa48: 0x0e3b, 0xa49: 0x0e3f, 0xa4a: 0x0613, 0xa4b: 0x0e53, 0xa4c: 0x0e4f, 0xa4d: 0x170a, 0xa4e: 0x0e33, 0xa4f: 0x0e6f, 0xa50: 0x170f, 0xa51: 0x1714, 0xa52: 0x0e73, 0xa53: 0x0e87, 0xa54: 0x0e83, 0xa55: 0x0e7f, 0xa56: 0x0617, 0xa57: 0x0e8b, 0xa58: 0x0e9b, 0xa59: 0x0e97, 0xa5a: 0x0ea3, 0xa5b: 0x1651, 0xa5c: 0x0eb3, 0xa5d: 0x1719, 0xa5e: 0x0ebf, 0xa5f: 0x1723, 0xa60: 0x0ed3, 0xa61: 0x0edf, 0xa62: 0x0ef3, 0xa63: 0x1728, 0xa64: 0x0f07, 0xa65: 0x0f0b, 0xa66: 0x172d, 0xa67: 0x1732, 0xa68: 0x0f27, 0xa69: 0x0f37, 0xa6a: 0x061b, 0xa6b: 0x0f3b, 0xa6c: 0x061f, 0xa6d: 0x061f, 0xa6e: 0x0f53, 0xa6f: 0x0f57, 0xa70: 0x0f5f, 0xa71: 0x0f63, 0xa72: 0x0f6f, 0xa73: 0x0623, 0xa74: 0x0f87, 0xa75: 0x1737, 0xa76: 0x0fa3, 0xa77: 0x173c, 0xa78: 0x0faf, 0xa79: 0x16a1, 0xa7a: 0x0fbf, 0xa7b: 0x1741, 0xa7c: 0x1746, 0xa7d: 0x174b, 0xa7e: 0x0627, 0xa7f: 0x062b, // Block 0x2a, offset 0xa80 0xa80: 0x0ff7, 0xa81: 0x1755, 0xa82: 0x1750, 0xa83: 0x175a, 0xa84: 0x175f, 0xa85: 0x0fff, 0xa86: 0x1003, 0xa87: 0x1003, 0xa88: 0x100b, 0xa89: 0x0633, 0xa8a: 0x100f, 0xa8b: 0x0637, 0xa8c: 0x063b, 0xa8d: 0x1769, 0xa8e: 0x1023, 0xa8f: 0x102b, 0xa90: 0x1037, 0xa91: 0x063f, 0xa92: 0x176e, 0xa93: 0x105b, 0xa94: 0x1773, 0xa95: 0x1778, 0xa96: 0x107b, 0xa97: 0x1093, 0xa98: 0x0643, 0xa99: 0x109b, 0xa9a: 0x109f, 0xa9b: 0x10a3, 0xa9c: 0x177d, 0xa9d: 0x1782, 0xa9e: 0x1782, 0xa9f: 0x10bb, 0xaa0: 0x0647, 0xaa1: 0x1787, 0xaa2: 0x10cf, 0xaa3: 0x10d3, 0xaa4: 0x064b, 0xaa5: 0x178c, 0xaa6: 0x10ef, 0xaa7: 0x064f, 0xaa8: 0x10ff, 0xaa9: 0x10f7, 0xaaa: 0x1107, 0xaab: 0x1796, 0xaac: 0x111f, 0xaad: 0x0653, 0xaae: 0x112b, 0xaaf: 0x1133, 0xab0: 0x1143, 0xab1: 0x0657, 0xab2: 0x17a0, 0xab3: 0x17a5, 0xab4: 0x065b, 0xab5: 0x17aa, 0xab6: 0x115b, 0xab7: 0x17af, 0xab8: 0x1167, 0xab9: 0x1173, 0xaba: 0x117b, 0xabb: 0x17b4, 0xabc: 0x17b9, 0xabd: 0x118f, 0xabe: 0x17be, 0xabf: 0x1197, // Block 0x2b, offset 0xac0 0xac0: 0x16ce, 0xac1: 0x065f, 0xac2: 0x11af, 0xac3: 0x11b3, 0xac4: 0x0667, 0xac5: 0x11b7, 0xac6: 0x0a33, 0xac7: 0x17c3, 0xac8: 0x17c8, 0xac9: 0x16d3, 0xaca: 0x16d8, 0xacb: 0x11d7, 0xacc: 0x11db, 0xacd: 0x13f3, 0xace: 0x066b, 0xacf: 0x1207, 0xad0: 0x1203, 0xad1: 0x120b, 0xad2: 0x083f, 0xad3: 0x120f, 0xad4: 0x1213, 0xad5: 0x1217, 0xad6: 0x121f, 0xad7: 0x17cd, 0xad8: 0x121b, 0xad9: 0x1223, 0xada: 0x1237, 0xadb: 0x123b, 0xadc: 0x1227, 0xadd: 0x123f, 0xade: 0x1253, 0xadf: 0x1267, 0xae0: 0x1233, 0xae1: 0x1247, 0xae2: 0x124b, 0xae3: 0x124f, 0xae4: 0x17d2, 0xae5: 0x17dc, 0xae6: 0x17d7, 0xae7: 0x066f, 0xae8: 0x126f, 0xae9: 0x1273, 0xaea: 0x127b, 0xaeb: 0x17f0, 0xaec: 0x127f, 0xaed: 0x17e1, 0xaee: 0x0673, 0xaef: 0x0677, 0xaf0: 0x17e6, 0xaf1: 0x17eb, 0xaf2: 0x067b, 0xaf3: 0x129f, 0xaf4: 0x12a3, 0xaf5: 0x12a7, 0xaf6: 0x12ab, 0xaf7: 0x12b7, 0xaf8: 0x12b3, 0xaf9: 0x12bf, 0xafa: 0x12bb, 0xafb: 0x12cb, 0xafc: 0x12c3, 0xafd: 0x12c7, 0xafe: 0x12cf, 0xaff: 0x067f, // Block 0x2c, offset 0xb00 0xb00: 0x12d7, 0xb01: 0x12db, 0xb02: 0x0683, 0xb03: 0x12eb, 0xb04: 0x12ef, 0xb05: 0x17f5, 0xb06: 0x12fb, 0xb07: 0x12ff, 0xb08: 0x0687, 0xb09: 0x130b, 0xb0a: 0x05bb, 0xb0b: 0x17fa, 0xb0c: 0x17ff, 0xb0d: 0x068b, 0xb0e: 0x068f, 0xb0f: 0x1337, 0xb10: 0x134f, 0xb11: 0x136b, 0xb12: 0x137b, 0xb13: 0x1804, 0xb14: 0x138f, 0xb15: 0x1393, 0xb16: 0x13ab, 0xb17: 0x13b7, 0xb18: 0x180e, 0xb19: 0x1660, 0xb1a: 0x13c3, 0xb1b: 0x13bf, 0xb1c: 0x13cb, 0xb1d: 0x1665, 0xb1e: 0x13d7, 0xb1f: 0x13e3, 0xb20: 0x1813, 0xb21: 0x1818, 0xb22: 0x1423, 0xb23: 0x142f, 0xb24: 0x1437, 0xb25: 0x181d, 0xb26: 0x143b, 0xb27: 0x1467, 0xb28: 0x1473, 0xb29: 0x1477, 0xb2a: 0x146f, 0xb2b: 0x1483, 0xb2c: 0x1487, 0xb2d: 0x1822, 0xb2e: 0x1493, 0xb2f: 0x0693, 0xb30: 0x149b, 0xb31: 0x1827, 0xb32: 0x0697, 0xb33: 0x14d3, 0xb34: 0x0ac3, 0xb35: 0x14eb, 0xb36: 0x182c, 0xb37: 0x1836, 0xb38: 0x069b, 0xb39: 0x069f, 0xb3a: 0x1513, 0xb3b: 0x183b, 0xb3c: 0x06a3, 0xb3d: 0x1840, 0xb3e: 0x152b, 0xb3f: 0x152b, // Block 0x2d, offset 0xb40 0xb40: 0x1533, 0xb41: 0x1845, 0xb42: 0x154b, 0xb43: 0x06a7, 0xb44: 0x155b, 0xb45: 0x1567, 0xb46: 0x156f, 0xb47: 0x1577, 0xb48: 0x06ab, 0xb49: 0x184a, 0xb4a: 0x158b, 0xb4b: 0x15a7, 0xb4c: 0x15b3, 0xb4d: 0x06af, 0xb4e: 0x06b3, 0xb4f: 0x15b7, 0xb50: 0x184f, 0xb51: 0x06b7, 0xb52: 0x1854, 0xb53: 0x1859, 0xb54: 0x185e, 0xb55: 0x15db, 0xb56: 0x06bb, 0xb57: 0x15ef, 0xb58: 0x15f7, 0xb59: 0x15fb, 0xb5a: 0x1603, 0xb5b: 0x160b, 0xb5c: 0x1613, 0xb5d: 0x1868, } // nfcIndex: 22 blocks, 1408 entries, 1408 bytes // Block 0 is the zero block. var nfcIndex = [1408]uint8{ // Block 0x0, offset 0x0 // Block 0x1, offset 0x40 // Block 0x2, offset 0x80 // Block 0x3, offset 0xc0 0xc2: 0x2c, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x2d, 0xc7: 0x04, 0xc8: 0x05, 0xca: 0x2e, 0xcb: 0x2f, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x30, 0xd0: 0x09, 0xd1: 0x31, 0xd2: 0x32, 0xd3: 0x0a, 0xd6: 0x0b, 0xd7: 0x33, 0xd8: 0x34, 0xd9: 0x0c, 0xdb: 0x35, 0xdc: 0x36, 0xdd: 0x37, 0xdf: 0x38, 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a, 0xf0: 0x13, // Block 0x4, offset 0x100 0x120: 0x39, 0x121: 0x3a, 0x123: 0x3b, 0x124: 0x3c, 0x125: 0x3d, 0x126: 0x3e, 0x127: 0x3f, 0x128: 0x40, 0x129: 0x41, 0x12a: 0x42, 0x12b: 0x43, 0x12c: 0x3e, 0x12d: 0x44, 0x12e: 0x45, 0x12f: 0x46, 0x131: 0x47, 0x132: 0x48, 0x133: 0x49, 0x134: 0x4a, 0x135: 0x4b, 0x137: 0x4c, 0x138: 0x4d, 0x139: 0x4e, 0x13a: 0x4f, 0x13b: 0x50, 0x13c: 0x51, 0x13d: 0x52, 0x13e: 0x53, 0x13f: 0x54, // Block 0x5, offset 0x140 0x140: 0x55, 0x142: 0x56, 0x144: 0x57, 0x145: 0x58, 0x146: 0x59, 0x147: 0x5a, 0x14d: 0x5b, 0x15c: 0x5c, 0x15f: 0x5d, 0x162: 0x5e, 0x164: 0x5f, 0x168: 0x60, 0x169: 0x61, 0x16a: 0x62, 0x16c: 0x0d, 0x16d: 0x63, 0x16e: 0x64, 0x16f: 0x65, 0x170: 0x66, 0x173: 0x67, 0x177: 0x68, 0x178: 0x0e, 0x179: 0x0f, 0x17a: 0x10, 0x17b: 0x11, 0x17c: 0x12, 0x17d: 0x13, 0x17e: 0x14, 0x17f: 0x15, // Block 0x6, offset 0x180 0x180: 0x69, 0x183: 0x6a, 0x184: 0x6b, 0x186: 0x6c, 0x187: 0x6d, 0x188: 0x6e, 0x189: 0x16, 0x18a: 0x17, 0x18b: 0x6f, 0x18c: 0x70, 0x1ab: 0x71, 0x1b3: 0x72, 0x1b5: 0x73, 0x1b7: 0x74, // Block 0x7, offset 0x1c0 0x1c0: 0x75, 0x1c1: 0x18, 0x1c2: 0x19, 0x1c3: 0x1a, 0x1c4: 0x76, 0x1c5: 0x77, 0x1c9: 0x78, 0x1cc: 0x79, 0x1cd: 0x7a, // Block 0x8, offset 0x200 0x219: 0x7b, 0x21a: 0x7c, 0x21b: 0x7d, 0x220: 0x7e, 0x223: 0x7f, 0x224: 0x80, 0x225: 0x81, 0x226: 0x82, 0x227: 0x83, 0x22a: 0x84, 0x22b: 0x85, 0x22f: 0x86, 0x230: 0x87, 0x231: 0x88, 0x232: 0x89, 0x233: 0x8a, 0x234: 0x8b, 0x235: 0x8c, 0x236: 0x8d, 0x237: 0x87, 0x238: 0x88, 0x239: 0x89, 0x23a: 0x8a, 0x23b: 0x8b, 0x23c: 0x8c, 0x23d: 0x8d, 0x23e: 0x87, 0x23f: 0x88, // Block 0x9, offset 0x240 0x240: 0x89, 0x241: 0x8a, 0x242: 0x8b, 0x243: 0x8c, 0x244: 0x8d, 0x245: 0x87, 0x246: 0x88, 0x247: 0x89, 0x248: 0x8a, 0x249: 0x8b, 0x24a: 0x8c, 0x24b: 0x8d, 0x24c: 0x87, 0x24d: 0x88, 0x24e: 0x89, 0x24f: 0x8a, 0x250: 0x8b, 0x251: 0x8c, 0x252: 0x8d, 0x253: 0x87, 0x254: 0x88, 0x255: 0x89, 0x256: 0x8a, 0x257: 0x8b, 0x258: 0x8c, 0x259: 0x8d, 0x25a: 0x87, 0x25b: 0x88, 0x25c: 0x89, 0x25d: 0x8a, 0x25e: 0x8b, 0x25f: 0x8c, 0x260: 0x8d, 0x261: 0x87, 0x262: 0x88, 0x263: 0x89, 0x264: 0x8a, 0x265: 0x8b, 0x266: 0x8c, 0x267: 0x8d, 0x268: 0x87, 0x269: 0x88, 0x26a: 0x89, 0x26b: 0x8a, 0x26c: 0x8b, 0x26d: 0x8c, 0x26e: 0x8d, 0x26f: 0x87, 0x270: 0x88, 0x271: 0x89, 0x272: 0x8a, 0x273: 0x8b, 0x274: 0x8c, 0x275: 0x8d, 0x276: 0x87, 0x277: 0x88, 0x278: 0x89, 0x279: 0x8a, 0x27a: 0x8b, 0x27b: 0x8c, 0x27c: 0x8d, 0x27d: 0x87, 0x27e: 0x88, 0x27f: 0x89, // Block 0xa, offset 0x280 0x280: 0x8a, 0x281: 0x8b, 0x282: 0x8c, 0x283: 0x8d, 0x284: 0x87, 0x285: 0x88, 0x286: 0x89, 0x287: 0x8a, 0x288: 0x8b, 0x289: 0x8c, 0x28a: 0x8d, 0x28b: 0x87, 0x28c: 0x88, 0x28d: 0x89, 0x28e: 0x8a, 0x28f: 0x8b, 0x290: 0x8c, 0x291: 0x8d, 0x292: 0x87, 0x293: 0x88, 0x294: 0x89, 0x295: 0x8a, 0x296: 0x8b, 0x297: 0x8c, 0x298: 0x8d, 0x299: 0x87, 0x29a: 0x88, 0x29b: 0x89, 0x29c: 0x8a, 0x29d: 0x8b, 0x29e: 0x8c, 0x29f: 0x8d, 0x2a0: 0x87, 0x2a1: 0x88, 0x2a2: 0x89, 0x2a3: 0x8a, 0x2a4: 0x8b, 0x2a5: 0x8c, 0x2a6: 0x8d, 0x2a7: 0x87, 0x2a8: 0x88, 0x2a9: 0x89, 0x2aa: 0x8a, 0x2ab: 0x8b, 0x2ac: 0x8c, 0x2ad: 0x8d, 0x2ae: 0x87, 0x2af: 0x88, 0x2b0: 0x89, 0x2b1: 0x8a, 0x2b2: 0x8b, 0x2b3: 0x8c, 0x2b4: 0x8d, 0x2b5: 0x87, 0x2b6: 0x88, 0x2b7: 0x89, 0x2b8: 0x8a, 0x2b9: 0x8b, 0x2ba: 0x8c, 0x2bb: 0x8d, 0x2bc: 0x87, 0x2bd: 0x88, 0x2be: 0x89, 0x2bf: 0x8a, // Block 0xb, offset 0x2c0 0x2c0: 0x8b, 0x2c1: 0x8c, 0x2c2: 0x8d, 0x2c3: 0x87, 0x2c4: 0x88, 0x2c5: 0x89, 0x2c6: 0x8a, 0x2c7: 0x8b, 0x2c8: 0x8c, 0x2c9: 0x8d, 0x2ca: 0x87, 0x2cb: 0x88, 0x2cc: 0x89, 0x2cd: 0x8a, 0x2ce: 0x8b, 0x2cf: 0x8c, 0x2d0: 0x8d, 0x2d1: 0x87, 0x2d2: 0x88, 0x2d3: 0x89, 0x2d4: 0x8a, 0x2d5: 0x8b, 0x2d6: 0x8c, 0x2d7: 0x8d, 0x2d8: 0x87, 0x2d9: 0x88, 0x2da: 0x89, 0x2db: 0x8a, 0x2dc: 0x8b, 0x2dd: 0x8c, 0x2de: 0x8e, // Block 0xc, offset 0x300 0x324: 0x1b, 0x325: 0x1c, 0x326: 0x1d, 0x327: 0x1e, 0x328: 0x1f, 0x329: 0x20, 0x32a: 0x21, 0x32b: 0x22, 0x32c: 0x8f, 0x32d: 0x90, 0x32e: 0x91, 0x331: 0x92, 0x332: 0x93, 0x333: 0x94, 0x334: 0x95, 0x338: 0x96, 0x339: 0x97, 0x33a: 0x98, 0x33b: 0x99, 0x33e: 0x9a, 0x33f: 0x9b, // Block 0xd, offset 0x340 0x347: 0x9c, 0x34b: 0x9d, 0x34d: 0x9e, 0x368: 0x9f, 0x36b: 0xa0, // Block 0xe, offset 0x380 0x381: 0xa1, 0x382: 0xa2, 0x384: 0xa3, 0x385: 0x82, 0x387: 0xa4, 0x388: 0xa5, 0x38b: 0xa6, 0x38c: 0x3e, 0x38d: 0xa7, 0x391: 0xa8, 0x392: 0xa9, 0x393: 0xaa, 0x396: 0xab, 0x397: 0xac, 0x398: 0x73, 0x39a: 0xad, 0x39c: 0xae, 0x3b0: 0x73, // Block 0xf, offset 0x3c0 0x3eb: 0xaf, 0x3ec: 0xb0, // Block 0x10, offset 0x400 0x432: 0xb1, // Block 0x11, offset 0x440 0x445: 0xb2, 0x446: 0xb3, 0x447: 0xb4, 0x449: 0xb5, // Block 0x12, offset 0x480 0x480: 0xb6, 0x4a3: 0xb7, 0x4a5: 0xb8, // Block 0x13, offset 0x4c0 0x4c8: 0xb9, // Block 0x14, offset 0x500 0x520: 0x23, 0x521: 0x24, 0x522: 0x25, 0x523: 0x26, 0x524: 0x27, 0x525: 0x28, 0x526: 0x29, 0x527: 0x2a, 0x528: 0x2b, // Block 0x15, offset 0x540 0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d, 0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11, 0x56f: 0x12, } // nfcSparseOffset: 142 entries, 284 bytes var nfcSparseOffset = []uint16{0x0, 0x5, 0x9, 0xb, 0xd, 0x18, 0x28, 0x2a, 0x2f, 0x3a, 0x49, 0x56, 0x5e, 0x62, 0x67, 0x69, 0x7a, 0x82, 0x89, 0x8c, 0x93, 0x97, 0x9b, 0x9d, 0x9f, 0xa8, 0xac, 0xb3, 0xb8, 0xbb, 0xc5, 0xc7, 0xce, 0xd6, 0xd9, 0xdb, 0xdd, 0xdf, 0xe4, 0xf5, 0x101, 0x103, 0x109, 0x10b, 0x10d, 0x10f, 0x111, 0x113, 0x115, 0x118, 0x11b, 0x11d, 0x120, 0x123, 0x127, 0x12c, 0x135, 0x137, 0x13a, 0x13c, 0x147, 0x157, 0x15b, 0x169, 0x16c, 0x172, 0x178, 0x183, 0x187, 0x189, 0x18b, 0x18d, 0x18f, 0x191, 0x197, 0x19b, 0x19d, 0x19f, 0x1a7, 0x1ab, 0x1ae, 0x1b0, 0x1b2, 0x1b4, 0x1b7, 0x1b9, 0x1bb, 0x1bd, 0x1bf, 0x1c5, 0x1c8, 0x1ca, 0x1d1, 0x1d7, 0x1dd, 0x1e5, 0x1eb, 0x1f1, 0x1f7, 0x1fb, 0x209, 0x212, 0x215, 0x218, 0x21a, 0x21d, 0x21f, 0x223, 0x228, 0x22a, 0x22c, 0x231, 0x237, 0x239, 0x23b, 0x23d, 0x243, 0x246, 0x249, 0x251, 0x258, 0x25b, 0x25e, 0x260, 0x268, 0x26b, 0x272, 0x275, 0x27b, 0x27d, 0x280, 0x282, 0x284, 0x286, 0x288, 0x295, 0x29f, 0x2a1, 0x2a3, 0x2a9, 0x2ab, 0x2ae} // nfcSparseValues: 688 entries, 2752 bytes var nfcSparseValues = [688]valueRange{ // Block 0x0, offset 0x0 {value: 0x0000, lo: 0x04}, {value: 0xa100, lo: 0xa8, hi: 0xa8}, {value: 0x8100, lo: 0xaf, hi: 0xaf}, {value: 0x8100, lo: 0xb4, hi: 0xb4}, {value: 0x8100, lo: 0xb8, hi: 0xb8}, // Block 0x1, offset 0x5 {value: 0x0091, lo: 0x03}, {value: 0x46e2, lo: 0xa0, hi: 0xa1}, {value: 0x4714, lo: 0xaf, hi: 0xb0}, {value: 0xa000, lo: 0xb7, hi: 0xb7}, // Block 0x2, offset 0x9 {value: 0x0000, lo: 0x01}, {value: 0xa000, lo: 0x92, hi: 0x92}, // Block 0x3, offset 0xb {value: 0x0000, lo: 0x01}, {value: 0x8100, lo: 0x98, hi: 0x9d}, // Block 0x4, offset 0xd {value: 0x0006, lo: 0x0a}, {value: 0xa000, lo: 0x81, hi: 0x81}, {value: 0xa000, lo: 0x85, hi: 0x85}, {value: 0xa000, lo: 0x89, hi: 0x89}, {value: 0x4840, lo: 0x8a, hi: 0x8a}, {value: 0x485e, lo: 0x8b, hi: 0x8b}, {value: 0x36c7, lo: 0x8c, hi: 0x8c}, {value: 0x36df, lo: 0x8d, hi: 0x8d}, {value: 0x4876, lo: 0x8e, hi: 0x8e}, {value: 0xa000, lo: 0x92, hi: 0x92}, {value: 0x36fd, lo: 0x93, hi: 0x94}, // Block 0x5, offset 0x18 {value: 0x0000, lo: 0x0f}, {value: 0xa000, lo: 0x83, hi: 0x83}, {value: 0xa000, lo: 0x87, hi: 0x87}, {value: 0xa000, lo: 0x8b, hi: 0x8b}, {value: 0xa000, lo: 0x8d, hi: 0x8d}, {value: 0x37a5, lo: 0x90, hi: 0x90}, {value: 0x37b1, lo: 0x91, hi: 0x91}, {value: 0x379f, lo: 0x93, hi: 0x93}, {value: 0xa000, lo: 0x96, hi: 0x96}, {value: 0x3817, lo: 0x97, hi: 0x97}, {value: 0x37e1, lo: 0x9c, hi: 0x9c}, {value: 0x37c9, lo: 0x9d, hi: 0x9d}, {value: 0x37f3, lo: 0x9e, hi: 0x9e}, {value: 0xa000, lo: 0xb4, hi: 0xb5}, {value: 0x381d, lo: 0xb6, hi: 0xb6}, {value: 0x3823, lo: 0xb7, hi: 0xb7}, // Block 0x6, offset 0x28 {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0x83, hi: 0x87}, // Block 0x7, offset 0x2a {value: 0x0001, lo: 0x04}, {value: 0x8113, lo: 0x81, hi: 0x82}, {value: 0x8132, lo: 0x84, hi: 0x84}, {value: 0x812d, lo: 0x85, hi: 0x85}, {value: 0x810d, lo: 0x87, hi: 0x87}, // Block 0x8, offset 0x2f {value: 0x0000, lo: 0x0a}, {value: 0x8132, lo: 0x90, hi: 0x97}, {value: 0x8119, lo: 0x98, hi: 0x98}, {value: 0x811a, lo: 0x99, hi: 0x99}, {value: 0x811b, lo: 0x9a, hi: 0x9a}, {value: 0x3841, lo: 0xa2, hi: 0xa2}, {value: 0x3847, lo: 0xa3, hi: 0xa3}, {value: 0x3853, lo: 0xa4, hi: 0xa4}, {value: 0x384d, lo: 0xa5, hi: 0xa5}, {value: 0x3859, lo: 0xa6, hi: 0xa6}, {value: 0xa000, lo: 0xa7, hi: 0xa7}, // Block 0x9, offset 0x3a {value: 0x0000, lo: 0x0e}, {value: 0x386b, lo: 0x80, hi: 0x80}, {value: 0xa000, lo: 0x81, hi: 0x81}, {value: 0x385f, lo: 0x82, hi: 0x82}, {value: 0xa000, lo: 0x92, hi: 0x92}, {value: 0x3865, lo: 0x93, hi: 0x93}, {value: 0xa000, lo: 0x95, hi: 0x95}, {value: 0x8132, lo: 0x96, hi: 0x9c}, {value: 0x8132, lo: 0x9f, hi: 0xa2}, {value: 0x812d, lo: 0xa3, hi: 0xa3}, {value: 0x8132, lo: 0xa4, hi: 0xa4}, {value: 0x8132, lo: 0xa7, hi: 0xa8}, {value: 0x812d, lo: 0xaa, hi: 0xaa}, {value: 0x8132, lo: 0xab, hi: 0xac}, {value: 0x812d, lo: 0xad, hi: 0xad}, // Block 0xa, offset 0x49 {value: 0x0000, lo: 0x0c}, {value: 0x811f, lo: 0x91, hi: 0x91}, {value: 0x8132, lo: 0xb0, hi: 0xb0}, {value: 0x812d, lo: 0xb1, hi: 0xb1}, {value: 0x8132, lo: 0xb2, hi: 0xb3}, {value: 0x812d, lo: 0xb4, hi: 0xb4}, {value: 0x8132, lo: 0xb5, hi: 0xb6}, {value: 0x812d, lo: 0xb7, hi: 0xb9}, {value: 0x8132, lo: 0xba, hi: 0xba}, {value: 0x812d, lo: 0xbb, hi: 0xbc}, {value: 0x8132, lo: 0xbd, hi: 0xbd}, {value: 0x812d, lo: 0xbe, hi: 0xbe}, {value: 0x8132, lo: 0xbf, hi: 0xbf}, // Block 0xb, offset 0x56 {value: 0x0005, lo: 0x07}, {value: 0x8132, lo: 0x80, hi: 0x80}, {value: 0x8132, lo: 0x81, hi: 0x81}, {value: 0x812d, lo: 0x82, hi: 0x83}, {value: 0x812d, lo: 0x84, hi: 0x85}, {value: 0x812d, lo: 0x86, hi: 0x87}, {value: 0x812d, lo: 0x88, hi: 0x89}, {value: 0x8132, lo: 0x8a, hi: 0x8a}, // Block 0xc, offset 0x5e {value: 0x0000, lo: 0x03}, {value: 0x8132, lo: 0xab, hi: 0xb1}, {value: 0x812d, lo: 0xb2, hi: 0xb2}, {value: 0x8132, lo: 0xb3, hi: 0xb3}, // Block 0xd, offset 0x62 {value: 0x0000, lo: 0x04}, {value: 0x8132, lo: 0x96, hi: 0x99}, {value: 0x8132, lo: 0x9b, hi: 0xa3}, {value: 0x8132, lo: 0xa5, hi: 0xa7}, {value: 0x8132, lo: 0xa9, hi: 0xad}, // Block 0xe, offset 0x67 {value: 0x0000, lo: 0x01}, {value: 0x812d, lo: 0x99, hi: 0x9b}, // Block 0xf, offset 0x69 {value: 0x0000, lo: 0x10}, {value: 0x8132, lo: 0x94, hi: 0xa1}, {value: 0x812d, lo: 0xa3, hi: 0xa3}, {value: 0x8132, lo: 0xa4, hi: 0xa5}, {value: 0x812d, lo: 0xa6, hi: 0xa6}, {value: 0x8132, lo: 0xa7, hi: 0xa8}, {value: 0x812d, lo: 0xa9, hi: 0xa9}, {value: 0x8132, lo: 0xaa, hi: 0xac}, {value: 0x812d, lo: 0xad, hi: 0xaf}, {value: 0x8116, lo: 0xb0, hi: 0xb0}, {value: 0x8117, lo: 0xb1, hi: 0xb1}, {value: 0x8118, lo: 0xb2, hi: 0xb2}, {value: 0x8132, lo: 0xb3, hi: 0xb5}, {value: 0x812d, lo: 0xb6, hi: 0xb6}, {value: 0x8132, lo: 0xb7, hi: 0xb8}, {value: 0x812d, lo: 0xb9, hi: 0xba}, {value: 0x8132, lo: 0xbb, hi: 0xbf}, // Block 0x10, offset 0x7a {value: 0x0000, lo: 0x07}, {value: 0xa000, lo: 0xa8, hi: 0xa8}, {value: 0x3ed8, lo: 0xa9, hi: 0xa9}, {value: 0xa000, lo: 0xb0, hi: 0xb0}, {value: 0x3ee0, lo: 0xb1, hi: 0xb1}, {value: 0xa000, lo: 0xb3, hi: 0xb3}, {value: 0x3ee8, lo: 0xb4, hi: 0xb4}, {value: 0x9902, lo: 0xbc, hi: 0xbc}, // Block 0x11, offset 0x82 {value: 0x0008, lo: 0x06}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x8132, lo: 0x91, hi: 0x91}, {value: 0x812d, lo: 0x92, hi: 0x92}, {value: 0x8132, lo: 0x93, hi: 0x93}, {value: 0x8132, lo: 0x94, hi: 0x94}, {value: 0x451c, lo: 0x98, hi: 0x9f}, // Block 0x12, offset 0x89 {value: 0x0000, lo: 0x02}, {value: 0x8102, lo: 0xbc, hi: 0xbc}, {value: 0x9900, lo: 0xbe, hi: 0xbe}, // Block 0x13, offset 0x8c {value: 0x0008, lo: 0x06}, {value: 0xa000, lo: 0x87, hi: 0x87}, {value: 0x2c9e, lo: 0x8b, hi: 0x8c}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x9900, lo: 0x97, hi: 0x97}, {value: 0x455c, lo: 0x9c, hi: 0x9d}, {value: 0x456c, lo: 0x9f, hi: 0x9f}, // Block 0x14, offset 0x93 {value: 0x0000, lo: 0x03}, {value: 0x4594, lo: 0xb3, hi: 0xb3}, {value: 0x459c, lo: 0xb6, hi: 0xb6}, {value: 0x8102, lo: 0xbc, hi: 0xbc}, // Block 0x15, offset 0x97 {value: 0x0008, lo: 0x03}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x4574, lo: 0x99, hi: 0x9b}, {value: 0x458c, lo: 0x9e, hi: 0x9e}, // Block 0x16, offset 0x9b {value: 0x0000, lo: 0x01}, {value: 0x8102, lo: 0xbc, hi: 0xbc}, // Block 0x17, offset 0x9d {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, // Block 0x18, offset 0x9f {value: 0x0000, lo: 0x08}, {value: 0xa000, lo: 0x87, hi: 0x87}, {value: 0x2cb6, lo: 0x88, hi: 0x88}, {value: 0x2cae, lo: 0x8b, hi: 0x8b}, {value: 0x2cbe, lo: 0x8c, hi: 0x8c}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x9900, lo: 0x96, hi: 0x97}, {value: 0x45a4, lo: 0x9c, hi: 0x9c}, {value: 0x45ac, lo: 0x9d, hi: 0x9d}, // Block 0x19, offset 0xa8 {value: 0x0000, lo: 0x03}, {value: 0xa000, lo: 0x92, hi: 0x92}, {value: 0x2cc6, lo: 0x94, hi: 0x94}, {value: 0x9900, lo: 0xbe, hi: 0xbe}, // Block 0x1a, offset 0xac {value: 0x0000, lo: 0x06}, {value: 0xa000, lo: 0x86, hi: 0x87}, {value: 0x2cce, lo: 0x8a, hi: 0x8a}, {value: 0x2cde, lo: 0x8b, hi: 0x8b}, {value: 0x2cd6, lo: 0x8c, hi: 0x8c}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x9900, lo: 0x97, hi: 0x97}, // Block 0x1b, offset 0xb3 {value: 0x1801, lo: 0x04}, {value: 0xa000, lo: 0x86, hi: 0x86}, {value: 0x3ef0, lo: 0x88, hi: 0x88}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x8120, lo: 0x95, hi: 0x96}, // Block 0x1c, offset 0xb8 {value: 0x0000, lo: 0x02}, {value: 0x8102, lo: 0xbc, hi: 0xbc}, {value: 0xa000, lo: 0xbf, hi: 0xbf}, // Block 0x1d, offset 0xbb {value: 0x0000, lo: 0x09}, {value: 0x2ce6, lo: 0x80, hi: 0x80}, {value: 0x9900, lo: 0x82, hi: 0x82}, {value: 0xa000, lo: 0x86, hi: 0x86}, {value: 0x2cee, lo: 0x87, hi: 0x87}, {value: 0x2cf6, lo: 0x88, hi: 0x88}, {value: 0x2f50, lo: 0x8a, hi: 0x8a}, {value: 0x2dd8, lo: 0x8b, hi: 0x8b}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x9900, lo: 0x95, hi: 0x96}, // Block 0x1e, offset 0xc5 {value: 0x0000, lo: 0x01}, {value: 0x9900, lo: 0xbe, hi: 0xbe}, // Block 0x1f, offset 0xc7 {value: 0x0000, lo: 0x06}, {value: 0xa000, lo: 0x86, hi: 0x87}, {value: 0x2cfe, lo: 0x8a, hi: 0x8a}, {value: 0x2d0e, lo: 0x8b, hi: 0x8b}, {value: 0x2d06, lo: 0x8c, hi: 0x8c}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x9900, lo: 0x97, hi: 0x97}, // Block 0x20, offset 0xce {value: 0x6bea, lo: 0x07}, {value: 0x9904, lo: 0x8a, hi: 0x8a}, {value: 0x9900, lo: 0x8f, hi: 0x8f}, {value: 0xa000, lo: 0x99, hi: 0x99}, {value: 0x3ef8, lo: 0x9a, hi: 0x9a}, {value: 0x2f58, lo: 0x9c, hi: 0x9c}, {value: 0x2de3, lo: 0x9d, hi: 0x9d}, {value: 0x2d16, lo: 0x9e, hi: 0x9f}, // Block 0x21, offset 0xd6 {value: 0x0000, lo: 0x02}, {value: 0x8122, lo: 0xb8, hi: 0xb9}, {value: 0x8104, lo: 0xba, hi: 0xba}, // Block 0x22, offset 0xd9 {value: 0x0000, lo: 0x01}, {value: 0x8123, lo: 0x88, hi: 0x8b}, // Block 0x23, offset 0xdb {value: 0x0000, lo: 0x01}, {value: 0x8124, lo: 0xb8, hi: 0xb9}, // Block 0x24, offset 0xdd {value: 0x0000, lo: 0x01}, {value: 0x8125, lo: 0x88, hi: 0x8b}, // Block 0x25, offset 0xdf {value: 0x0000, lo: 0x04}, {value: 0x812d, lo: 0x98, hi: 0x99}, {value: 0x812d, lo: 0xb5, hi: 0xb5}, {value: 0x812d, lo: 0xb7, hi: 0xb7}, {value: 0x812b, lo: 0xb9, hi: 0xb9}, // Block 0x26, offset 0xe4 {value: 0x0000, lo: 0x10}, {value: 0x2644, lo: 0x83, hi: 0x83}, {value: 0x264b, lo: 0x8d, hi: 0x8d}, {value: 0x2652, lo: 0x92, hi: 0x92}, {value: 0x2659, lo: 0x97, hi: 0x97}, {value: 0x2660, lo: 0x9c, hi: 0x9c}, {value: 0x263d, lo: 0xa9, hi: 0xa9}, {value: 0x8126, lo: 0xb1, hi: 0xb1}, {value: 0x8127, lo: 0xb2, hi: 0xb2}, {value: 0x4a84, lo: 0xb3, hi: 0xb3}, {value: 0x8128, lo: 0xb4, hi: 0xb4}, {value: 0x4a8d, lo: 0xb5, hi: 0xb5}, {value: 0x45b4, lo: 0xb6, hi: 0xb6}, {value: 0x8200, lo: 0xb7, hi: 0xb7}, {value: 0x45bc, lo: 0xb8, hi: 0xb8}, {value: 0x8200, lo: 0xb9, hi: 0xb9}, {value: 0x8127, lo: 0xba, hi: 0xbd}, // Block 0x27, offset 0xf5 {value: 0x0000, lo: 0x0b}, {value: 0x8127, lo: 0x80, hi: 0x80}, {value: 0x4a96, lo: 0x81, hi: 0x81}, {value: 0x8132, lo: 0x82, hi: 0x83}, {value: 0x8104, lo: 0x84, hi: 0x84}, {value: 0x8132, lo: 0x86, hi: 0x87}, {value: 0x266e, lo: 0x93, hi: 0x93}, {value: 0x2675, lo: 0x9d, hi: 0x9d}, {value: 0x267c, lo: 0xa2, hi: 0xa2}, {value: 0x2683, lo: 0xa7, hi: 0xa7}, {value: 0x268a, lo: 0xac, hi: 0xac}, {value: 0x2667, lo: 0xb9, hi: 0xb9}, // Block 0x28, offset 0x101 {value: 0x0000, lo: 0x01}, {value: 0x812d, lo: 0x86, hi: 0x86}, // Block 0x29, offset 0x103 {value: 0x0000, lo: 0x05}, {value: 0xa000, lo: 0xa5, hi: 0xa5}, {value: 0x2d1e, lo: 0xa6, hi: 0xa6}, {value: 0x9900, lo: 0xae, hi: 0xae}, {value: 0x8102, lo: 0xb7, hi: 0xb7}, {value: 0x8104, lo: 0xb9, hi: 0xba}, // Block 0x2a, offset 0x109 {value: 0x0000, lo: 0x01}, {value: 0x812d, lo: 0x8d, hi: 0x8d}, // Block 0x2b, offset 0x10b {value: 0x0000, lo: 0x01}, {value: 0xa000, lo: 0x80, hi: 0x92}, // Block 0x2c, offset 0x10d {value: 0x0000, lo: 0x01}, {value: 0xb900, lo: 0xa1, hi: 0xb5}, // Block 0x2d, offset 0x10f {value: 0x0000, lo: 0x01}, {value: 0x9900, lo: 0xa8, hi: 0xbf}, // Block 0x2e, offset 0x111 {value: 0x0000, lo: 0x01}, {value: 0x9900, lo: 0x80, hi: 0x82}, // Block 0x2f, offset 0x113 {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0x9d, hi: 0x9f}, // Block 0x30, offset 0x115 {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0x94, hi: 0x94}, {value: 0x8104, lo: 0xb4, hi: 0xb4}, // Block 0x31, offset 0x118 {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0x92, hi: 0x92}, {value: 0x8132, lo: 0x9d, hi: 0x9d}, // Block 0x32, offset 0x11b {value: 0x0000, lo: 0x01}, {value: 0x8131, lo: 0xa9, hi: 0xa9}, // Block 0x33, offset 0x11d {value: 0x0004, lo: 0x02}, {value: 0x812e, lo: 0xb9, hi: 0xba}, {value: 0x812d, lo: 0xbb, hi: 0xbb}, // Block 0x34, offset 0x120 {value: 0x0000, lo: 0x02}, {value: 0x8132, lo: 0x97, hi: 0x97}, {value: 0x812d, lo: 0x98, hi: 0x98}, // Block 0x35, offset 0x123 {value: 0x0000, lo: 0x03}, {value: 0x8104, lo: 0xa0, hi: 0xa0}, {value: 0x8132, lo: 0xb5, hi: 0xbc}, {value: 0x812d, lo: 0xbf, hi: 0xbf}, // Block 0x36, offset 0x127 {value: 0x0000, lo: 0x04}, {value: 0x8132, lo: 0xb0, hi: 0xb4}, {value: 0x812d, lo: 0xb5, hi: 0xba}, {value: 0x8132, lo: 0xbb, hi: 0xbc}, {value: 0x812d, lo: 0xbd, hi: 0xbd}, // Block 0x37, offset 0x12c {value: 0x0000, lo: 0x08}, {value: 0x2d66, lo: 0x80, hi: 0x80}, {value: 0x2d6e, lo: 0x81, hi: 0x81}, {value: 0xa000, lo: 0x82, hi: 0x82}, {value: 0x2d76, lo: 0x83, hi: 0x83}, {value: 0x8104, lo: 0x84, hi: 0x84}, {value: 0x8132, lo: 0xab, hi: 0xab}, {value: 0x812d, lo: 0xac, hi: 0xac}, {value: 0x8132, lo: 0xad, hi: 0xb3}, // Block 0x38, offset 0x135 {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0xaa, hi: 0xab}, // Block 0x39, offset 0x137 {value: 0x0000, lo: 0x02}, {value: 0x8102, lo: 0xa6, hi: 0xa6}, {value: 0x8104, lo: 0xb2, hi: 0xb3}, // Block 0x3a, offset 0x13a {value: 0x0000, lo: 0x01}, {value: 0x8102, lo: 0xb7, hi: 0xb7}, // Block 0x3b, offset 0x13c {value: 0x0000, lo: 0x0a}, {value: 0x8132, lo: 0x90, hi: 0x92}, {value: 0x8101, lo: 0x94, hi: 0x94}, {value: 0x812d, lo: 0x95, hi: 0x99}, {value: 0x8132, lo: 0x9a, hi: 0x9b}, {value: 0x812d, lo: 0x9c, hi: 0x9f}, {value: 0x8132, lo: 0xa0, hi: 0xa0}, {value: 0x8101, lo: 0xa2, hi: 0xa8}, {value: 0x812d, lo: 0xad, hi: 0xad}, {value: 0x8132, lo: 0xb4, hi: 0xb4}, {value: 0x8132, lo: 0xb8, hi: 0xb9}, // Block 0x3c, offset 0x147 {value: 0x0000, lo: 0x0f}, {value: 0x8132, lo: 0x80, hi: 0x81}, {value: 0x812d, lo: 0x82, hi: 0x82}, {value: 0x8132, lo: 0x83, hi: 0x89}, {value: 0x812d, lo: 0x8a, hi: 0x8a}, {value: 0x8132, lo: 0x8b, hi: 0x8c}, {value: 0x8135, lo: 0x8d, hi: 0x8d}, {value: 0x812a, lo: 0x8e, hi: 0x8e}, {value: 0x812d, lo: 0x8f, hi: 0x8f}, {value: 0x8129, lo: 0x90, hi: 0x90}, {value: 0x8132, lo: 0x91, hi: 0xb5}, {value: 0x8132, lo: 0xbb, hi: 0xbb}, {value: 0x8134, lo: 0xbc, hi: 0xbc}, {value: 0x812d, lo: 0xbd, hi: 0xbd}, {value: 0x8132, lo: 0xbe, hi: 0xbe}, {value: 0x812d, lo: 0xbf, hi: 0xbf}, // Block 0x3d, offset 0x157 {value: 0x0004, lo: 0x03}, {value: 0x0433, lo: 0x80, hi: 0x81}, {value: 0x8100, lo: 0x97, hi: 0x97}, {value: 0x8100, lo: 0xbe, hi: 0xbe}, // Block 0x3e, offset 0x15b {value: 0x0000, lo: 0x0d}, {value: 0x8132, lo: 0x90, hi: 0x91}, {value: 0x8101, lo: 0x92, hi: 0x93}, {value: 0x8132, lo: 0x94, hi: 0x97}, {value: 0x8101, lo: 0x98, hi: 0x9a}, {value: 0x8132, lo: 0x9b, hi: 0x9c}, {value: 0x8132, lo: 0xa1, hi: 0xa1}, {value: 0x8101, lo: 0xa5, hi: 0xa6}, {value: 0x8132, lo: 0xa7, hi: 0xa7}, {value: 0x812d, lo: 0xa8, hi: 0xa8}, {value: 0x8132, lo: 0xa9, hi: 0xa9}, {value: 0x8101, lo: 0xaa, hi: 0xab}, {value: 0x812d, lo: 0xac, hi: 0xaf}, {value: 0x8132, lo: 0xb0, hi: 0xb0}, // Block 0x3f, offset 0x169 {value: 0x427b, lo: 0x02}, {value: 0x01b8, lo: 0xa6, hi: 0xa6}, {value: 0x0057, lo: 0xaa, hi: 0xab}, // Block 0x40, offset 0x16c {value: 0x0007, lo: 0x05}, {value: 0xa000, lo: 0x90, hi: 0x90}, {value: 0xa000, lo: 0x92, hi: 0x92}, {value: 0xa000, lo: 0x94, hi: 0x94}, {value: 0x3bb9, lo: 0x9a, hi: 0x9b}, {value: 0x3bc7, lo: 0xae, hi: 0xae}, // Block 0x41, offset 0x172 {value: 0x000e, lo: 0x05}, {value: 0x3bce, lo: 0x8d, hi: 0x8e}, {value: 0x3bd5, lo: 0x8f, hi: 0x8f}, {value: 0xa000, lo: 0x90, hi: 0x90}, {value: 0xa000, lo: 0x92, hi: 0x92}, {value: 0xa000, lo: 0x94, hi: 0x94}, // Block 0x42, offset 0x178 {value: 0x6408, lo: 0x0a}, {value: 0xa000, lo: 0x83, hi: 0x83}, {value: 0x3be3, lo: 0x84, hi: 0x84}, {value: 0xa000, lo: 0x88, hi: 0x88}, {value: 0x3bea, lo: 0x89, hi: 0x89}, {value: 0xa000, lo: 0x8b, hi: 0x8b}, {value: 0x3bf1, lo: 0x8c, hi: 0x8c}, {value: 0xa000, lo: 0xa3, hi: 0xa3}, {value: 0x3bf8, lo: 0xa4, hi: 0xa5}, {value: 0x3bff, lo: 0xa6, hi: 0xa6}, {value: 0xa000, lo: 0xbc, hi: 0xbc}, // Block 0x43, offset 0x183 {value: 0x0007, lo: 0x03}, {value: 0x3c68, lo: 0xa0, hi: 0xa1}, {value: 0x3c92, lo: 0xa2, hi: 0xa3}, {value: 0x3cbc, lo: 0xaa, hi: 0xad}, // Block 0x44, offset 0x187 {value: 0x0004, lo: 0x01}, {value: 0x048b, lo: 0xa9, hi: 0xaa}, // Block 0x45, offset 0x189 {value: 0x0000, lo: 0x01}, {value: 0x44dd, lo: 0x9c, hi: 0x9c}, // Block 0x46, offset 0x18b {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0xaf, hi: 0xb1}, // Block 0x47, offset 0x18d {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0xbf, hi: 0xbf}, // Block 0x48, offset 0x18f {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0xa0, hi: 0xbf}, // Block 0x49, offset 0x191 {value: 0x0000, lo: 0x05}, {value: 0x812c, lo: 0xaa, hi: 0xaa}, {value: 0x8131, lo: 0xab, hi: 0xab}, {value: 0x8133, lo: 0xac, hi: 0xac}, {value: 0x812e, lo: 0xad, hi: 0xad}, {value: 0x812f, lo: 0xae, hi: 0xaf}, // Block 0x4a, offset 0x197 {value: 0x0000, lo: 0x03}, {value: 0x4a9f, lo: 0xb3, hi: 0xb3}, {value: 0x4a9f, lo: 0xb5, hi: 0xb6}, {value: 0x4a9f, lo: 0xba, hi: 0xbf}, // Block 0x4b, offset 0x19b {value: 0x0000, lo: 0x01}, {value: 0x4a9f, lo: 0x8f, hi: 0xa3}, // Block 0x4c, offset 0x19d {value: 0x0000, lo: 0x01}, {value: 0x8100, lo: 0xae, hi: 0xbe}, // Block 0x4d, offset 0x19f {value: 0x0000, lo: 0x07}, {value: 0x8100, lo: 0x84, hi: 0x84}, {value: 0x8100, lo: 0x87, hi: 0x87}, {value: 0x8100, lo: 0x90, hi: 0x90}, {value: 0x8100, lo: 0x9e, hi: 0x9e}, {value: 0x8100, lo: 0xa1, hi: 0xa1}, {value: 0x8100, lo: 0xb2, hi: 0xb2}, {value: 0x8100, lo: 0xbb, hi: 0xbb}, // Block 0x4e, offset 0x1a7 {value: 0x0000, lo: 0x03}, {value: 0x8100, lo: 0x80, hi: 0x80}, {value: 0x8100, lo: 0x8b, hi: 0x8b}, {value: 0x8100, lo: 0x8e, hi: 0x8e}, // Block 0x4f, offset 0x1ab {value: 0x0000, lo: 0x02}, {value: 0x8132, lo: 0xaf, hi: 0xaf}, {value: 0x8132, lo: 0xb4, hi: 0xbd}, // Block 0x50, offset 0x1ae {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0x9e, hi: 0x9f}, // Block 0x51, offset 0x1b0 {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0xb0, hi: 0xb1}, // Block 0x52, offset 0x1b2 {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0x86, hi: 0x86}, // Block 0x53, offset 0x1b4 {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0x84, hi: 0x84}, {value: 0x8132, lo: 0xa0, hi: 0xb1}, // Block 0x54, offset 0x1b7 {value: 0x0000, lo: 0x01}, {value: 0x812d, lo: 0xab, hi: 0xad}, // Block 0x55, offset 0x1b9 {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0x93, hi: 0x93}, // Block 0x56, offset 0x1bb {value: 0x0000, lo: 0x01}, {value: 0x8102, lo: 0xb3, hi: 0xb3}, // Block 0x57, offset 0x1bd {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0x80, hi: 0x80}, // Block 0x58, offset 0x1bf {value: 0x0000, lo: 0x05}, {value: 0x8132, lo: 0xb0, hi: 0xb0}, {value: 0x8132, lo: 0xb2, hi: 0xb3}, {value: 0x812d, lo: 0xb4, hi: 0xb4}, {value: 0x8132, lo: 0xb7, hi: 0xb8}, {value: 0x8132, lo: 0xbe, hi: 0xbf}, // Block 0x59, offset 0x1c5 {value: 0x0000, lo: 0x02}, {value: 0x8132, lo: 0x81, hi: 0x81}, {value: 0x8104, lo: 0xb6, hi: 0xb6}, // Block 0x5a, offset 0x1c8 {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0xad, hi: 0xad}, // Block 0x5b, offset 0x1ca {value: 0x0000, lo: 0x06}, {value: 0xe500, lo: 0x80, hi: 0x80}, {value: 0xc600, lo: 0x81, hi: 0x9b}, {value: 0xe500, lo: 0x9c, hi: 0x9c}, {value: 0xc600, lo: 0x9d, hi: 0xb7}, {value: 0xe500, lo: 0xb8, hi: 0xb8}, {value: 0xc600, lo: 0xb9, hi: 0xbf}, // Block 0x5c, offset 0x1d1 {value: 0x0000, lo: 0x05}, {value: 0xc600, lo: 0x80, hi: 0x93}, {value: 0xe500, lo: 0x94, hi: 0x94}, {value: 0xc600, lo: 0x95, hi: 0xaf}, {value: 0xe500, lo: 0xb0, hi: 0xb0}, {value: 0xc600, lo: 0xb1, hi: 0xbf}, // Block 0x5d, offset 0x1d7 {value: 0x0000, lo: 0x05}, {value: 0xc600, lo: 0x80, hi: 0x8b}, {value: 0xe500, lo: 0x8c, hi: 0x8c}, {value: 0xc600, lo: 0x8d, hi: 0xa7}, {value: 0xe500, lo: 0xa8, hi: 0xa8}, {value: 0xc600, lo: 0xa9, hi: 0xbf}, // Block 0x5e, offset 0x1dd {value: 0x0000, lo: 0x07}, {value: 0xc600, lo: 0x80, hi: 0x83}, {value: 0xe500, lo: 0x84, hi: 0x84}, {value: 0xc600, lo: 0x85, hi: 0x9f}, {value: 0xe500, lo: 0xa0, hi: 0xa0}, {value: 0xc600, lo: 0xa1, hi: 0xbb}, {value: 0xe500, lo: 0xbc, hi: 0xbc}, {value: 0xc600, lo: 0xbd, hi: 0xbf}, // Block 0x5f, offset 0x1e5 {value: 0x0000, lo: 0x05}, {value: 0xc600, lo: 0x80, hi: 0x97}, {value: 0xe500, lo: 0x98, hi: 0x98}, {value: 0xc600, lo: 0x99, hi: 0xb3}, {value: 0xe500, lo: 0xb4, hi: 0xb4}, {value: 0xc600, lo: 0xb5, hi: 0xbf}, // Block 0x60, offset 0x1eb {value: 0x0000, lo: 0x05}, {value: 0xc600, lo: 0x80, hi: 0x8f}, {value: 0xe500, lo: 0x90, hi: 0x90}, {value: 0xc600, lo: 0x91, hi: 0xab}, {value: 0xe500, lo: 0xac, hi: 0xac}, {value: 0xc600, lo: 0xad, hi: 0xbf}, // Block 0x61, offset 0x1f1 {value: 0x0000, lo: 0x05}, {value: 0xc600, lo: 0x80, hi: 0x87}, {value: 0xe500, lo: 0x88, hi: 0x88}, {value: 0xc600, lo: 0x89, hi: 0xa3}, {value: 0xe500, lo: 0xa4, hi: 0xa4}, {value: 0xc600, lo: 0xa5, hi: 0xbf}, // Block 0x62, offset 0x1f7 {value: 0x0000, lo: 0x03}, {value: 0xc600, lo: 0x80, hi: 0x87}, {value: 0xe500, lo: 0x88, hi: 0x88}, {value: 0xc600, lo: 0x89, hi: 0xa3}, // Block 0x63, offset 0x1fb {value: 0x0006, lo: 0x0d}, {value: 0x4390, lo: 0x9d, hi: 0x9d}, {value: 0x8115, lo: 0x9e, hi: 0x9e}, {value: 0x4402, lo: 0x9f, hi: 0x9f}, {value: 0x43f0, lo: 0xaa, hi: 0xab}, {value: 0x44f4, lo: 0xac, hi: 0xac}, {value: 0x44fc, lo: 0xad, hi: 0xad}, {value: 0x4348, lo: 0xae, hi: 0xb1}, {value: 0x4366, lo: 0xb2, hi: 0xb4}, {value: 0x437e, lo: 0xb5, hi: 0xb6}, {value: 0x438a, lo: 0xb8, hi: 0xb8}, {value: 0x4396, lo: 0xb9, hi: 0xbb}, {value: 0x43ae, lo: 0xbc, hi: 0xbc}, {value: 0x43b4, lo: 0xbe, hi: 0xbe}, // Block 0x64, offset 0x209 {value: 0x0006, lo: 0x08}, {value: 0x43ba, lo: 0x80, hi: 0x81}, {value: 0x43c6, lo: 0x83, hi: 0x84}, {value: 0x43d8, lo: 0x86, hi: 0x89}, {value: 0x43fc, lo: 0x8a, hi: 0x8a}, {value: 0x4378, lo: 0x8b, hi: 0x8b}, {value: 0x4360, lo: 0x8c, hi: 0x8c}, {value: 0x43a8, lo: 0x8d, hi: 0x8d}, {value: 0x43d2, lo: 0x8e, hi: 0x8e}, // Block 0x65, offset 0x212 {value: 0x0000, lo: 0x02}, {value: 0x8100, lo: 0xa4, hi: 0xa5}, {value: 0x8100, lo: 0xb0, hi: 0xb1}, // Block 0x66, offset 0x215 {value: 0x0000, lo: 0x02}, {value: 0x8100, lo: 0x9b, hi: 0x9d}, {value: 0x8200, lo: 0x9e, hi: 0xa3}, // Block 0x67, offset 0x218 {value: 0x0000, lo: 0x01}, {value: 0x8100, lo: 0x90, hi: 0x90}, // Block 0x68, offset 0x21a {value: 0x0000, lo: 0x02}, {value: 0x8100, lo: 0x99, hi: 0x99}, {value: 0x8200, lo: 0xb2, hi: 0xb4}, // Block 0x69, offset 0x21d {value: 0x0000, lo: 0x01}, {value: 0x8100, lo: 0xbc, hi: 0xbd}, // Block 0x6a, offset 0x21f {value: 0x0000, lo: 0x03}, {value: 0x8132, lo: 0xa0, hi: 0xa6}, {value: 0x812d, lo: 0xa7, hi: 0xad}, {value: 0x8132, lo: 0xae, hi: 0xaf}, // Block 0x6b, offset 0x223 {value: 0x0000, lo: 0x04}, {value: 0x8100, lo: 0x89, hi: 0x8c}, {value: 0x8100, lo: 0xb0, hi: 0xb2}, {value: 0x8100, lo: 0xb4, hi: 0xb4}, {value: 0x8100, lo: 0xb6, hi: 0xbf}, // Block 0x6c, offset 0x228 {value: 0x0000, lo: 0x01}, {value: 0x8100, lo: 0x81, hi: 0x8c}, // Block 0x6d, offset 0x22a {value: 0x0000, lo: 0x01}, {value: 0x8100, lo: 0xb5, hi: 0xba}, // Block 0x6e, offset 0x22c {value: 0x0000, lo: 0x04}, {value: 0x4a9f, lo: 0x9e, hi: 0x9f}, {value: 0x4a9f, lo: 0xa3, hi: 0xa3}, {value: 0x4a9f, lo: 0xa5, hi: 0xa6}, {value: 0x4a9f, lo: 0xaa, hi: 0xaf}, // Block 0x6f, offset 0x231 {value: 0x0000, lo: 0x05}, {value: 0x4a9f, lo: 0x82, hi: 0x87}, {value: 0x4a9f, lo: 0x8a, hi: 0x8f}, {value: 0x4a9f, lo: 0x92, hi: 0x97}, {value: 0x4a9f, lo: 0x9a, hi: 0x9c}, {value: 0x8100, lo: 0xa3, hi: 0xa3}, // Block 0x70, offset 0x237 {value: 0x0000, lo: 0x01}, {value: 0x812d, lo: 0xbd, hi: 0xbd}, // Block 0x71, offset 0x239 {value: 0x0000, lo: 0x01}, {value: 0x812d, lo: 0xa0, hi: 0xa0}, // Block 0x72, offset 0x23b {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0xb6, hi: 0xba}, // Block 0x73, offset 0x23d {value: 0x002c, lo: 0x05}, {value: 0x812d, lo: 0x8d, hi: 0x8d}, {value: 0x8132, lo: 0x8f, hi: 0x8f}, {value: 0x8132, lo: 0xb8, hi: 0xb8}, {value: 0x8101, lo: 0xb9, hi: 0xba}, {value: 0x8104, lo: 0xbf, hi: 0xbf}, // Block 0x74, offset 0x243 {value: 0x0000, lo: 0x02}, {value: 0x8132, lo: 0xa5, hi: 0xa5}, {value: 0x812d, lo: 0xa6, hi: 0xa6}, // Block 0x75, offset 0x246 {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0x86, hi: 0x86}, {value: 0x8104, lo: 0xbf, hi: 0xbf}, // Block 0x76, offset 0x249 {value: 0x17fe, lo: 0x07}, {value: 0xa000, lo: 0x99, hi: 0x99}, {value: 0x4238, lo: 0x9a, hi: 0x9a}, {value: 0xa000, lo: 0x9b, hi: 0x9b}, {value: 0x4242, lo: 0x9c, hi: 0x9c}, {value: 0xa000, lo: 0xa5, hi: 0xa5}, {value: 0x424c, lo: 0xab, hi: 0xab}, {value: 0x8104, lo: 0xb9, hi: 0xba}, // Block 0x77, offset 0x251 {value: 0x0000, lo: 0x06}, {value: 0x8132, lo: 0x80, hi: 0x82}, {value: 0x9900, lo: 0xa7, hi: 0xa7}, {value: 0x2d7e, lo: 0xae, hi: 0xae}, {value: 0x2d88, lo: 0xaf, hi: 0xaf}, {value: 0xa000, lo: 0xb1, hi: 0xb2}, {value: 0x8104, lo: 0xb3, hi: 0xb4}, // Block 0x78, offset 0x258 {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0x80, hi: 0x80}, {value: 0x8102, lo: 0x8a, hi: 0x8a}, // Block 0x79, offset 0x25b {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0xb5, hi: 0xb5}, {value: 0x8102, lo: 0xb6, hi: 0xb6}, // Block 0x7a, offset 0x25e {value: 0x0002, lo: 0x01}, {value: 0x8102, lo: 0xa9, hi: 0xaa}, // Block 0x7b, offset 0x260 {value: 0x0000, lo: 0x07}, {value: 0xa000, lo: 0x87, hi: 0x87}, {value: 0x2d92, lo: 0x8b, hi: 0x8b}, {value: 0x2d9c, lo: 0x8c, hi: 0x8c}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x9900, lo: 0x97, hi: 0x97}, {value: 0x8132, lo: 0xa6, hi: 0xac}, {value: 0x8132, lo: 0xb0, hi: 0xb4}, // Block 0x7c, offset 0x268 {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0x82, hi: 0x82}, {value: 0x8102, lo: 0x86, hi: 0x86}, // Block 0x7d, offset 0x26b {value: 0x6b5a, lo: 0x06}, {value: 0x9900, lo: 0xb0, hi: 0xb0}, {value: 0xa000, lo: 0xb9, hi: 0xb9}, {value: 0x9900, lo: 0xba, hi: 0xba}, {value: 0x2db0, lo: 0xbb, hi: 0xbb}, {value: 0x2da6, lo: 0xbc, hi: 0xbd}, {value: 0x2dba, lo: 0xbe, hi: 0xbe}, // Block 0x7e, offset 0x272 {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0x82, hi: 0x82}, {value: 0x8102, lo: 0x83, hi: 0x83}, // Block 0x7f, offset 0x275 {value: 0x0000, lo: 0x05}, {value: 0x9900, lo: 0xaf, hi: 0xaf}, {value: 0xa000, lo: 0xb8, hi: 0xb9}, {value: 0x2dc4, lo: 0xba, hi: 0xba}, {value: 0x2dce, lo: 0xbb, hi: 0xbb}, {value: 0x8104, lo: 0xbf, hi: 0xbf}, // Block 0x80, offset 0x27b {value: 0x0000, lo: 0x01}, {value: 0x8102, lo: 0x80, hi: 0x80}, // Block 0x81, offset 0x27d {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0xb6, hi: 0xb6}, {value: 0x8102, lo: 0xb7, hi: 0xb7}, // Block 0x82, offset 0x280 {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0xab, hi: 0xab}, // Block 0x83, offset 0x282 {value: 0x0000, lo: 0x01}, {value: 0x8101, lo: 0xb0, hi: 0xb4}, // Block 0x84, offset 0x284 {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0xb0, hi: 0xb6}, // Block 0x85, offset 0x286 {value: 0x0000, lo: 0x01}, {value: 0x8101, lo: 0x9e, hi: 0x9e}, // Block 0x86, offset 0x288 {value: 0x0000, lo: 0x0c}, {value: 0x45cc, lo: 0x9e, hi: 0x9e}, {value: 0x45d6, lo: 0x9f, hi: 0x9f}, {value: 0x460a, lo: 0xa0, hi: 0xa0}, {value: 0x4618, lo: 0xa1, hi: 0xa1}, {value: 0x4626, lo: 0xa2, hi: 0xa2}, {value: 0x4634, lo: 0xa3, hi: 0xa3}, {value: 0x4642, lo: 0xa4, hi: 0xa4}, {value: 0x812b, lo: 0xa5, hi: 0xa6}, {value: 0x8101, lo: 0xa7, hi: 0xa9}, {value: 0x8130, lo: 0xad, hi: 0xad}, {value: 0x812b, lo: 0xae, hi: 0xb2}, {value: 0x812d, lo: 0xbb, hi: 0xbf}, // Block 0x87, offset 0x295 {value: 0x0000, lo: 0x09}, {value: 0x812d, lo: 0x80, hi: 0x82}, {value: 0x8132, lo: 0x85, hi: 0x89}, {value: 0x812d, lo: 0x8a, hi: 0x8b}, {value: 0x8132, lo: 0xaa, hi: 0xad}, {value: 0x45e0, lo: 0xbb, hi: 0xbb}, {value: 0x45ea, lo: 0xbc, hi: 0xbc}, {value: 0x4650, lo: 0xbd, hi: 0xbd}, {value: 0x466c, lo: 0xbe, hi: 0xbe}, {value: 0x465e, lo: 0xbf, hi: 0xbf}, // Block 0x88, offset 0x29f {value: 0x0000, lo: 0x01}, {value: 0x467a, lo: 0x80, hi: 0x80}, // Block 0x89, offset 0x2a1 {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0x82, hi: 0x84}, // Block 0x8a, offset 0x2a3 {value: 0x0000, lo: 0x05}, {value: 0x8132, lo: 0x80, hi: 0x86}, {value: 0x8132, lo: 0x88, hi: 0x98}, {value: 0x8132, lo: 0x9b, hi: 0xa1}, {value: 0x8132, lo: 0xa3, hi: 0xa4}, {value: 0x8132, lo: 0xa6, hi: 0xaa}, // Block 0x8b, offset 0x2a9 {value: 0x0000, lo: 0x01}, {value: 0x812d, lo: 0x90, hi: 0x96}, // Block 0x8c, offset 0x2ab {value: 0x0000, lo: 0x02}, {value: 0x8132, lo: 0x84, hi: 0x89}, {value: 0x8102, lo: 0x8a, hi: 0x8a}, // Block 0x8d, offset 0x2ae {value: 0x0000, lo: 0x01}, {value: 0x8100, lo: 0x93, hi: 0x93}, } // lookup returns the trie value for the first UTF-8 encoding in s and // the width in bytes of this encoding. The size will be 0 if s does not // hold enough bytes to complete the encoding. len(s) must be greater than 0. func (t *nfkcTrie) lookup(s []byte) (v uint16, sz int) { c0 := s[0] switch { case c0 < 0x80: // is ASCII return nfkcValues[c0], 1 case c0 < 0xC2: return 0, 1 // Illegal UTF-8: not a starter, not ASCII. case c0 < 0xE0: // 2-byte UTF-8 if len(s) < 2 { return 0, 0 } i := nfkcIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c1), 2 case c0 < 0xF0: // 3-byte UTF-8 if len(s) < 3 { return 0, 0 } i := nfkcIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } o := uint32(i)<<6 + uint32(c1) i = nfkcIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return 0, 2 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c2), 3 case c0 < 0xF8: // 4-byte UTF-8 if len(s) < 4 { return 0, 0 } i := nfkcIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } o := uint32(i)<<6 + uint32(c1) i = nfkcIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return 0, 2 // Illegal UTF-8: not a continuation byte. } o = uint32(i)<<6 + uint32(c2) i = nfkcIndex[o] c3 := s[3] if c3 < 0x80 || 0xC0 <= c3 { return 0, 3 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c3), 4 } // Illegal rune return 0, 1 } // lookupUnsafe returns the trie value for the first UTF-8 encoding in s. // s must start with a full and valid UTF-8 encoded rune. func (t *nfkcTrie) lookupUnsafe(s []byte) uint16 { c0 := s[0] if c0 < 0x80 { // is ASCII return nfkcValues[c0] } i := nfkcIndex[c0] if c0 < 0xE0 { // 2-byte UTF-8 return t.lookupValue(uint32(i), s[1]) } i = nfkcIndex[uint32(i)<<6+uint32(s[1])] if c0 < 0xF0 { // 3-byte UTF-8 return t.lookupValue(uint32(i), s[2]) } i = nfkcIndex[uint32(i)<<6+uint32(s[2])] if c0 < 0xF8 { // 4-byte UTF-8 return t.lookupValue(uint32(i), s[3]) } return 0 } // lookupString returns the trie value for the first UTF-8 encoding in s and // the width in bytes of this encoding. The size will be 0 if s does not // hold enough bytes to complete the encoding. len(s) must be greater than 0. func (t *nfkcTrie) lookupString(s string) (v uint16, sz int) { c0 := s[0] switch { case c0 < 0x80: // is ASCII return nfkcValues[c0], 1 case c0 < 0xC2: return 0, 1 // Illegal UTF-8: not a starter, not ASCII. case c0 < 0xE0: // 2-byte UTF-8 if len(s) < 2 { return 0, 0 } i := nfkcIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c1), 2 case c0 < 0xF0: // 3-byte UTF-8 if len(s) < 3 { return 0, 0 } i := nfkcIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } o := uint32(i)<<6 + uint32(c1) i = nfkcIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return 0, 2 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c2), 3 case c0 < 0xF8: // 4-byte UTF-8 if len(s) < 4 { return 0, 0 } i := nfkcIndex[c0] c1 := s[1] if c1 < 0x80 || 0xC0 <= c1 { return 0, 1 // Illegal UTF-8: not a continuation byte. } o := uint32(i)<<6 + uint32(c1) i = nfkcIndex[o] c2 := s[2] if c2 < 0x80 || 0xC0 <= c2 { return 0, 2 // Illegal UTF-8: not a continuation byte. } o = uint32(i)<<6 + uint32(c2) i = nfkcIndex[o] c3 := s[3] if c3 < 0x80 || 0xC0 <= c3 { return 0, 3 // Illegal UTF-8: not a continuation byte. } return t.lookupValue(uint32(i), c3), 4 } // Illegal rune return 0, 1 } // lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. // s must start with a full and valid UTF-8 encoded rune. func (t *nfkcTrie) lookupStringUnsafe(s string) uint16 { c0 := s[0] if c0 < 0x80 { // is ASCII return nfkcValues[c0] } i := nfkcIndex[c0] if c0 < 0xE0 { // 2-byte UTF-8 return t.lookupValue(uint32(i), s[1]) } i = nfkcIndex[uint32(i)<<6+uint32(s[1])] if c0 < 0xF0 { // 3-byte UTF-8 return t.lookupValue(uint32(i), s[2]) } i = nfkcIndex[uint32(i)<<6+uint32(s[2])] if c0 < 0xF8 { // 4-byte UTF-8 return t.lookupValue(uint32(i), s[3]) } return 0 } // nfkcTrie. Total size: 16994 bytes (16.60 KiB). Checksum: c3ed54ee046f3c46. type nfkcTrie struct{} func newNfkcTrie(i int) *nfkcTrie { return &nfkcTrie{} } // lookupValue determines the type of block n and looks up the value for b. func (t *nfkcTrie) lookupValue(n uint32, b byte) uint16 { switch { case n < 90: return uint16(nfkcValues[n<<6+uint32(b)]) default: n -= 90 return uint16(nfkcSparse.lookup(n, b)) } } // nfkcValues: 92 blocks, 5888 entries, 11776 bytes // The third block is the zero block. var nfkcValues = [5888]uint16{ // Block 0x0, offset 0x0 0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000, // Block 0x1, offset 0x40 0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000, 0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000, 0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000, 0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000, 0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000, 0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000, 0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000, 0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000, 0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000, 0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000, // Block 0x2, offset 0x80 // Block 0x3, offset 0xc0 0xc0: 0x2f6f, 0xc1: 0x2f74, 0xc2: 0x4688, 0xc3: 0x2f79, 0xc4: 0x4697, 0xc5: 0x469c, 0xc6: 0xa000, 0xc7: 0x46a6, 0xc8: 0x2fe2, 0xc9: 0x2fe7, 0xca: 0x46ab, 0xcb: 0x2ffb, 0xcc: 0x306e, 0xcd: 0x3073, 0xce: 0x3078, 0xcf: 0x46bf, 0xd1: 0x3104, 0xd2: 0x3127, 0xd3: 0x312c, 0xd4: 0x46c9, 0xd5: 0x46ce, 0xd6: 0x46dd, 0xd8: 0xa000, 0xd9: 0x31b3, 0xda: 0x31b8, 0xdb: 0x31bd, 0xdc: 0x470f, 0xdd: 0x3235, 0xe0: 0x327b, 0xe1: 0x3280, 0xe2: 0x4719, 0xe3: 0x3285, 0xe4: 0x4728, 0xe5: 0x472d, 0xe6: 0xa000, 0xe7: 0x4737, 0xe8: 0x32ee, 0xe9: 0x32f3, 0xea: 0x473c, 0xeb: 0x3307, 0xec: 0x337f, 0xed: 0x3384, 0xee: 0x3389, 0xef: 0x4750, 0xf1: 0x3415, 0xf2: 0x3438, 0xf3: 0x343d, 0xf4: 0x475a, 0xf5: 0x475f, 0xf6: 0x476e, 0xf8: 0xa000, 0xf9: 0x34c9, 0xfa: 0x34ce, 0xfb: 0x34d3, 0xfc: 0x47a0, 0xfd: 0x3550, 0xff: 0x3569, // Block 0x4, offset 0x100 0x100: 0x2f7e, 0x101: 0x328a, 0x102: 0x468d, 0x103: 0x471e, 0x104: 0x2f9c, 0x105: 0x32a8, 0x106: 0x2fb0, 0x107: 0x32bc, 0x108: 0x2fb5, 0x109: 0x32c1, 0x10a: 0x2fba, 0x10b: 0x32c6, 0x10c: 0x2fbf, 0x10d: 0x32cb, 0x10e: 0x2fc9, 0x10f: 0x32d5, 0x112: 0x46b0, 0x113: 0x4741, 0x114: 0x2ff1, 0x115: 0x32fd, 0x116: 0x2ff6, 0x117: 0x3302, 0x118: 0x3014, 0x119: 0x3320, 0x11a: 0x3005, 0x11b: 0x3311, 0x11c: 0x302d, 0x11d: 0x3339, 0x11e: 0x3037, 0x11f: 0x3343, 0x120: 0x303c, 0x121: 0x3348, 0x122: 0x3046, 0x123: 0x3352, 0x124: 0x304b, 0x125: 0x3357, 0x128: 0x307d, 0x129: 0x338e, 0x12a: 0x3082, 0x12b: 0x3393, 0x12c: 0x3087, 0x12d: 0x3398, 0x12e: 0x30aa, 0x12f: 0x33b6, 0x130: 0x308c, 0x132: 0x195d, 0x133: 0x19e7, 0x134: 0x30b4, 0x135: 0x33c0, 0x136: 0x30c8, 0x137: 0x33d9, 0x139: 0x30d2, 0x13a: 0x33e3, 0x13b: 0x30dc, 0x13c: 0x33ed, 0x13d: 0x30d7, 0x13e: 0x33e8, 0x13f: 0x1bac, // Block 0x5, offset 0x140 0x140: 0x1c34, 0x143: 0x30ff, 0x144: 0x3410, 0x145: 0x3118, 0x146: 0x3429, 0x147: 0x310e, 0x148: 0x341f, 0x149: 0x1c5c, 0x14c: 0x46d3, 0x14d: 0x4764, 0x14e: 0x3131, 0x14f: 0x3442, 0x150: 0x313b, 0x151: 0x344c, 0x154: 0x3159, 0x155: 0x346a, 0x156: 0x3172, 0x157: 0x3483, 0x158: 0x3163, 0x159: 0x3474, 0x15a: 0x46f6, 0x15b: 0x4787, 0x15c: 0x317c, 0x15d: 0x348d, 0x15e: 0x318b, 0x15f: 0x349c, 0x160: 0x46fb, 0x161: 0x478c, 0x162: 0x31a4, 0x163: 0x34ba, 0x164: 0x3195, 0x165: 0x34ab, 0x168: 0x4705, 0x169: 0x4796, 0x16a: 0x470a, 0x16b: 0x479b, 0x16c: 0x31c2, 0x16d: 0x34d8, 0x16e: 0x31cc, 0x16f: 0x34e2, 0x170: 0x31d1, 0x171: 0x34e7, 0x172: 0x31ef, 0x173: 0x3505, 0x174: 0x3212, 0x175: 0x3528, 0x176: 0x323a, 0x177: 0x3555, 0x178: 0x324e, 0x179: 0x325d, 0x17a: 0x357d, 0x17b: 0x3267, 0x17c: 0x3587, 0x17d: 0x326c, 0x17e: 0x358c, 0x17f: 0x00a7, // Block 0x6, offset 0x180 0x184: 0x2dee, 0x185: 0x2df4, 0x186: 0x2dfa, 0x187: 0x1972, 0x188: 0x1975, 0x189: 0x1a08, 0x18a: 0x1987, 0x18b: 0x198a, 0x18c: 0x1a3e, 0x18d: 0x2f88, 0x18e: 0x3294, 0x18f: 0x3096, 0x190: 0x33a2, 0x191: 0x3140, 0x192: 0x3451, 0x193: 0x31d6, 0x194: 0x34ec, 0x195: 0x39cf, 0x196: 0x3b5e, 0x197: 0x39c8, 0x198: 0x3b57, 0x199: 0x39d6, 0x19a: 0x3b65, 0x19b: 0x39c1, 0x19c: 0x3b50, 0x19e: 0x38b0, 0x19f: 0x3a3f, 0x1a0: 0x38a9, 0x1a1: 0x3a38, 0x1a2: 0x35b3, 0x1a3: 0x35c5, 0x1a6: 0x3041, 0x1a7: 0x334d, 0x1a8: 0x30be, 0x1a9: 0x33cf, 0x1aa: 0x46ec, 0x1ab: 0x477d, 0x1ac: 0x3990, 0x1ad: 0x3b1f, 0x1ae: 0x35d7, 0x1af: 0x35dd, 0x1b0: 0x33c5, 0x1b1: 0x1942, 0x1b2: 0x1945, 0x1b3: 0x19cf, 0x1b4: 0x3028, 0x1b5: 0x3334, 0x1b8: 0x30fa, 0x1b9: 0x340b, 0x1ba: 0x38b7, 0x1bb: 0x3a46, 0x1bc: 0x35ad, 0x1bd: 0x35bf, 0x1be: 0x35b9, 0x1bf: 0x35cb, // Block 0x7, offset 0x1c0 0x1c0: 0x2f8d, 0x1c1: 0x3299, 0x1c2: 0x2f92, 0x1c3: 0x329e, 0x1c4: 0x300a, 0x1c5: 0x3316, 0x1c6: 0x300f, 0x1c7: 0x331b, 0x1c8: 0x309b, 0x1c9: 0x33a7, 0x1ca: 0x30a0, 0x1cb: 0x33ac, 0x1cc: 0x3145, 0x1cd: 0x3456, 0x1ce: 0x314a, 0x1cf: 0x345b, 0x1d0: 0x3168, 0x1d1: 0x3479, 0x1d2: 0x316d, 0x1d3: 0x347e, 0x1d4: 0x31db, 0x1d5: 0x34f1, 0x1d6: 0x31e0, 0x1d7: 0x34f6, 0x1d8: 0x3186, 0x1d9: 0x3497, 0x1da: 0x319f, 0x1db: 0x34b5, 0x1de: 0x305a, 0x1df: 0x3366, 0x1e6: 0x4692, 0x1e7: 0x4723, 0x1e8: 0x46ba, 0x1e9: 0x474b, 0x1ea: 0x395f, 0x1eb: 0x3aee, 0x1ec: 0x393c, 0x1ed: 0x3acb, 0x1ee: 0x46d8, 0x1ef: 0x4769, 0x1f0: 0x3958, 0x1f1: 0x3ae7, 0x1f2: 0x3244, 0x1f3: 0x355f, // Block 0x8, offset 0x200 0x200: 0x9932, 0x201: 0x9932, 0x202: 0x9932, 0x203: 0x9932, 0x204: 0x9932, 0x205: 0x8132, 0x206: 0x9932, 0x207: 0x9932, 0x208: 0x9932, 0x209: 0x9932, 0x20a: 0x9932, 0x20b: 0x9932, 0x20c: 0x9932, 0x20d: 0x8132, 0x20e: 0x8132, 0x20f: 0x9932, 0x210: 0x8132, 0x211: 0x9932, 0x212: 0x8132, 0x213: 0x9932, 0x214: 0x9932, 0x215: 0x8133, 0x216: 0x812d, 0x217: 0x812d, 0x218: 0x812d, 0x219: 0x812d, 0x21a: 0x8133, 0x21b: 0x992b, 0x21c: 0x812d, 0x21d: 0x812d, 0x21e: 0x812d, 0x21f: 0x812d, 0x220: 0x812d, 0x221: 0x8129, 0x222: 0x8129, 0x223: 0x992d, 0x224: 0x992d, 0x225: 0x992d, 0x226: 0x992d, 0x227: 0x9929, 0x228: 0x9929, 0x229: 0x812d, 0x22a: 0x812d, 0x22b: 0x812d, 0x22c: 0x812d, 0x22d: 0x992d, 0x22e: 0x992d, 0x22f: 0x812d, 0x230: 0x992d, 0x231: 0x992d, 0x232: 0x812d, 0x233: 0x812d, 0x234: 0x8101, 0x235: 0x8101, 0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812d, 0x23a: 0x812d, 0x23b: 0x812d, 0x23c: 0x812d, 0x23d: 0x8132, 0x23e: 0x8132, 0x23f: 0x8132, // Block 0x9, offset 0x240 0x240: 0x49ae, 0x241: 0x49b3, 0x242: 0x9932, 0x243: 0x49b8, 0x244: 0x4a71, 0x245: 0x9936, 0x246: 0x8132, 0x247: 0x812d, 0x248: 0x812d, 0x249: 0x812d, 0x24a: 0x8132, 0x24b: 0x8132, 0x24c: 0x8132, 0x24d: 0x812d, 0x24e: 0x812d, 0x250: 0x8132, 0x251: 0x8132, 0x252: 0x8132, 0x253: 0x812d, 0x254: 0x812d, 0x255: 0x812d, 0x256: 0x812d, 0x257: 0x8132, 0x258: 0x8133, 0x259: 0x812d, 0x25a: 0x812d, 0x25b: 0x8132, 0x25c: 0x8134, 0x25d: 0x8135, 0x25e: 0x8135, 0x25f: 0x8134, 0x260: 0x8135, 0x261: 0x8135, 0x262: 0x8134, 0x263: 0x8132, 0x264: 0x8132, 0x265: 0x8132, 0x266: 0x8132, 0x267: 0x8132, 0x268: 0x8132, 0x269: 0x8132, 0x26a: 0x8132, 0x26b: 0x8132, 0x26c: 0x8132, 0x26d: 0x8132, 0x26e: 0x8132, 0x26f: 0x8132, 0x274: 0x0170, 0x27a: 0x42a5, 0x27e: 0x0037, // Block 0xa, offset 0x280 0x284: 0x425a, 0x285: 0x447b, 0x286: 0x35e9, 0x287: 0x00ce, 0x288: 0x3607, 0x289: 0x3613, 0x28a: 0x3625, 0x28c: 0x3643, 0x28e: 0x3655, 0x28f: 0x3673, 0x290: 0x3e08, 0x291: 0xa000, 0x295: 0xa000, 0x297: 0xa000, 0x299: 0xa000, 0x29f: 0xa000, 0x2a1: 0xa000, 0x2a5: 0xa000, 0x2a9: 0xa000, 0x2aa: 0x3637, 0x2ab: 0x3667, 0x2ac: 0x47fe, 0x2ad: 0x3697, 0x2ae: 0x4828, 0x2af: 0x36a9, 0x2b0: 0x3e70, 0x2b1: 0xa000, 0x2b5: 0xa000, 0x2b7: 0xa000, 0x2b9: 0xa000, 0x2bf: 0xa000, // Block 0xb, offset 0x2c0 0x2c1: 0xa000, 0x2c5: 0xa000, 0x2c9: 0xa000, 0x2ca: 0x4840, 0x2cb: 0x485e, 0x2cc: 0x36c7, 0x2cd: 0x36df, 0x2ce: 0x4876, 0x2d0: 0x01be, 0x2d1: 0x01d0, 0x2d2: 0x01ac, 0x2d3: 0x430c, 0x2d4: 0x4312, 0x2d5: 0x01fa, 0x2d6: 0x01e8, 0x2f0: 0x01d6, 0x2f1: 0x01eb, 0x2f2: 0x01ee, 0x2f4: 0x0188, 0x2f5: 0x01c7, 0x2f9: 0x01a6, // Block 0xc, offset 0x300 0x300: 0x3721, 0x301: 0x372d, 0x303: 0x371b, 0x306: 0xa000, 0x307: 0x3709, 0x30c: 0x375d, 0x30d: 0x3745, 0x30e: 0x376f, 0x310: 0xa000, 0x313: 0xa000, 0x315: 0xa000, 0x316: 0xa000, 0x317: 0xa000, 0x318: 0xa000, 0x319: 0x3751, 0x31a: 0xa000, 0x31e: 0xa000, 0x323: 0xa000, 0x327: 0xa000, 0x32b: 0xa000, 0x32d: 0xa000, 0x330: 0xa000, 0x333: 0xa000, 0x335: 0xa000, 0x336: 0xa000, 0x337: 0xa000, 0x338: 0xa000, 0x339: 0x37d5, 0x33a: 0xa000, 0x33e: 0xa000, // Block 0xd, offset 0x340 0x341: 0x3733, 0x342: 0x37b7, 0x350: 0x370f, 0x351: 0x3793, 0x352: 0x3715, 0x353: 0x3799, 0x356: 0x3727, 0x357: 0x37ab, 0x358: 0xa000, 0x359: 0xa000, 0x35a: 0x3829, 0x35b: 0x382f, 0x35c: 0x3739, 0x35d: 0x37bd, 0x35e: 0x373f, 0x35f: 0x37c3, 0x362: 0x374b, 0x363: 0x37cf, 0x364: 0x3757, 0x365: 0x37db, 0x366: 0x3763, 0x367: 0x37e7, 0x368: 0xa000, 0x369: 0xa000, 0x36a: 0x3835, 0x36b: 0x383b, 0x36c: 0x378d, 0x36d: 0x3811, 0x36e: 0x3769, 0x36f: 0x37ed, 0x370: 0x3775, 0x371: 0x37f9, 0x372: 0x377b, 0x373: 0x37ff, 0x374: 0x3781, 0x375: 0x3805, 0x378: 0x3787, 0x379: 0x380b, // Block 0xe, offset 0x380 0x387: 0x1d61, 0x391: 0x812d, 0x392: 0x8132, 0x393: 0x8132, 0x394: 0x8132, 0x395: 0x8132, 0x396: 0x812d, 0x397: 0x8132, 0x398: 0x8132, 0x399: 0x8132, 0x39a: 0x812e, 0x39b: 0x812d, 0x39c: 0x8132, 0x39d: 0x8132, 0x39e: 0x8132, 0x39f: 0x8132, 0x3a0: 0x8132, 0x3a1: 0x8132, 0x3a2: 0x812d, 0x3a3: 0x812d, 0x3a4: 0x812d, 0x3a5: 0x812d, 0x3a6: 0x812d, 0x3a7: 0x812d, 0x3a8: 0x8132, 0x3a9: 0x8132, 0x3aa: 0x812d, 0x3ab: 0x8132, 0x3ac: 0x8132, 0x3ad: 0x812e, 0x3ae: 0x8131, 0x3af: 0x8132, 0x3b0: 0x8105, 0x3b1: 0x8106, 0x3b2: 0x8107, 0x3b3: 0x8108, 0x3b4: 0x8109, 0x3b5: 0x810a, 0x3b6: 0x810b, 0x3b7: 0x810c, 0x3b8: 0x810d, 0x3b9: 0x810e, 0x3ba: 0x810e, 0x3bb: 0x810f, 0x3bc: 0x8110, 0x3bd: 0x8111, 0x3bf: 0x8112, // Block 0xf, offset 0x3c0 0x3c8: 0xa000, 0x3ca: 0xa000, 0x3cb: 0x8116, 0x3cc: 0x8117, 0x3cd: 0x8118, 0x3ce: 0x8119, 0x3cf: 0x811a, 0x3d0: 0x811b, 0x3d1: 0x811c, 0x3d2: 0x811d, 0x3d3: 0x9932, 0x3d4: 0x9932, 0x3d5: 0x992d, 0x3d6: 0x812d, 0x3d7: 0x8132, 0x3d8: 0x8132, 0x3d9: 0x8132, 0x3da: 0x8132, 0x3db: 0x8132, 0x3dc: 0x812d, 0x3dd: 0x8132, 0x3de: 0x8132, 0x3df: 0x812d, 0x3f0: 0x811e, 0x3f5: 0x1d84, 0x3f6: 0x2013, 0x3f7: 0x204f, 0x3f8: 0x204a, // Block 0x10, offset 0x400 0x405: 0xa000, 0x406: 0x2d26, 0x407: 0xa000, 0x408: 0x2d2e, 0x409: 0xa000, 0x40a: 0x2d36, 0x40b: 0xa000, 0x40c: 0x2d3e, 0x40d: 0xa000, 0x40e: 0x2d46, 0x411: 0xa000, 0x412: 0x2d4e, 0x434: 0x8102, 0x435: 0x9900, 0x43a: 0xa000, 0x43b: 0x2d56, 0x43c: 0xa000, 0x43d: 0x2d5e, 0x43e: 0xa000, 0x43f: 0xa000, // Block 0x11, offset 0x440 0x440: 0x0069, 0x441: 0x006b, 0x442: 0x006f, 0x443: 0x0083, 0x444: 0x00f5, 0x445: 0x00f8, 0x446: 0x0413, 0x447: 0x0085, 0x448: 0x0089, 0x449: 0x008b, 0x44a: 0x0104, 0x44b: 0x0107, 0x44c: 0x010a, 0x44d: 0x008f, 0x44f: 0x0097, 0x450: 0x009b, 0x451: 0x00e0, 0x452: 0x009f, 0x453: 0x00fe, 0x454: 0x0417, 0x455: 0x041b, 0x456: 0x00a1, 0x457: 0x00a9, 0x458: 0x00ab, 0x459: 0x0423, 0x45a: 0x012b, 0x45b: 0x00ad, 0x45c: 0x0427, 0x45d: 0x01be, 0x45e: 0x01c1, 0x45f: 0x01c4, 0x460: 0x01fa, 0x461: 0x01fd, 0x462: 0x0093, 0x463: 0x00a5, 0x464: 0x00ab, 0x465: 0x00ad, 0x466: 0x01be, 0x467: 0x01c1, 0x468: 0x01eb, 0x469: 0x01fa, 0x46a: 0x01fd, 0x478: 0x020c, // Block 0x12, offset 0x480 0x49b: 0x00fb, 0x49c: 0x0087, 0x49d: 0x0101, 0x49e: 0x00d4, 0x49f: 0x010a, 0x4a0: 0x008d, 0x4a1: 0x010d, 0x4a2: 0x0110, 0x4a3: 0x0116, 0x4a4: 0x011c, 0x4a5: 0x011f, 0x4a6: 0x0122, 0x4a7: 0x042b, 0x4a8: 0x016a, 0x4a9: 0x0128, 0x4aa: 0x042f, 0x4ab: 0x016d, 0x4ac: 0x0131, 0x4ad: 0x012e, 0x4ae: 0x0134, 0x4af: 0x0137, 0x4b0: 0x013a, 0x4b1: 0x013d, 0x4b2: 0x0140, 0x4b3: 0x014c, 0x4b4: 0x014f, 0x4b5: 0x00ec, 0x4b6: 0x0152, 0x4b7: 0x0155, 0x4b8: 0x041f, 0x4b9: 0x0158, 0x4ba: 0x015b, 0x4bb: 0x00b5, 0x4bc: 0x015e, 0x4bd: 0x0161, 0x4be: 0x0164, 0x4bf: 0x01d0, // Block 0x13, offset 0x4c0 0x4c0: 0x2f97, 0x4c1: 0x32a3, 0x4c2: 0x2fa1, 0x4c3: 0x32ad, 0x4c4: 0x2fa6, 0x4c5: 0x32b2, 0x4c6: 0x2fab, 0x4c7: 0x32b7, 0x4c8: 0x38cc, 0x4c9: 0x3a5b, 0x4ca: 0x2fc4, 0x4cb: 0x32d0, 0x4cc: 0x2fce, 0x4cd: 0x32da, 0x4ce: 0x2fdd, 0x4cf: 0x32e9, 0x4d0: 0x2fd3, 0x4d1: 0x32df, 0x4d2: 0x2fd8, 0x4d3: 0x32e4, 0x4d4: 0x38ef, 0x4d5: 0x3a7e, 0x4d6: 0x38f6, 0x4d7: 0x3a85, 0x4d8: 0x3019, 0x4d9: 0x3325, 0x4da: 0x301e, 0x4db: 0x332a, 0x4dc: 0x3904, 0x4dd: 0x3a93, 0x4de: 0x3023, 0x4df: 0x332f, 0x4e0: 0x3032, 0x4e1: 0x333e, 0x4e2: 0x3050, 0x4e3: 0x335c, 0x4e4: 0x305f, 0x4e5: 0x336b, 0x4e6: 0x3055, 0x4e7: 0x3361, 0x4e8: 0x3064, 0x4e9: 0x3370, 0x4ea: 0x3069, 0x4eb: 0x3375, 0x4ec: 0x30af, 0x4ed: 0x33bb, 0x4ee: 0x390b, 0x4ef: 0x3a9a, 0x4f0: 0x30b9, 0x4f1: 0x33ca, 0x4f2: 0x30c3, 0x4f3: 0x33d4, 0x4f4: 0x30cd, 0x4f5: 0x33de, 0x4f6: 0x46c4, 0x4f7: 0x4755, 0x4f8: 0x3912, 0x4f9: 0x3aa1, 0x4fa: 0x30e6, 0x4fb: 0x33f7, 0x4fc: 0x30e1, 0x4fd: 0x33f2, 0x4fe: 0x30eb, 0x4ff: 0x33fc, // Block 0x14, offset 0x500 0x500: 0x30f0, 0x501: 0x3401, 0x502: 0x30f5, 0x503: 0x3406, 0x504: 0x3109, 0x505: 0x341a, 0x506: 0x3113, 0x507: 0x3424, 0x508: 0x3122, 0x509: 0x3433, 0x50a: 0x311d, 0x50b: 0x342e, 0x50c: 0x3935, 0x50d: 0x3ac4, 0x50e: 0x3943, 0x50f: 0x3ad2, 0x510: 0x394a, 0x511: 0x3ad9, 0x512: 0x3951, 0x513: 0x3ae0, 0x514: 0x314f, 0x515: 0x3460, 0x516: 0x3154, 0x517: 0x3465, 0x518: 0x315e, 0x519: 0x346f, 0x51a: 0x46f1, 0x51b: 0x4782, 0x51c: 0x3997, 0x51d: 0x3b26, 0x51e: 0x3177, 0x51f: 0x3488, 0x520: 0x3181, 0x521: 0x3492, 0x522: 0x4700, 0x523: 0x4791, 0x524: 0x399e, 0x525: 0x3b2d, 0x526: 0x39a5, 0x527: 0x3b34, 0x528: 0x39ac, 0x529: 0x3b3b, 0x52a: 0x3190, 0x52b: 0x34a1, 0x52c: 0x319a, 0x52d: 0x34b0, 0x52e: 0x31ae, 0x52f: 0x34c4, 0x530: 0x31a9, 0x531: 0x34bf, 0x532: 0x31ea, 0x533: 0x3500, 0x534: 0x31f9, 0x535: 0x350f, 0x536: 0x31f4, 0x537: 0x350a, 0x538: 0x39b3, 0x539: 0x3b42, 0x53a: 0x39ba, 0x53b: 0x3b49, 0x53c: 0x31fe, 0x53d: 0x3514, 0x53e: 0x3203, 0x53f: 0x3519, // Block 0x15, offset 0x540 0x540: 0x3208, 0x541: 0x351e, 0x542: 0x320d, 0x543: 0x3523, 0x544: 0x321c, 0x545: 0x3532, 0x546: 0x3217, 0x547: 0x352d, 0x548: 0x3221, 0x549: 0x353c, 0x54a: 0x3226, 0x54b: 0x3541, 0x54c: 0x322b, 0x54d: 0x3546, 0x54e: 0x3249, 0x54f: 0x3564, 0x550: 0x3262, 0x551: 0x3582, 0x552: 0x3271, 0x553: 0x3591, 0x554: 0x3276, 0x555: 0x3596, 0x556: 0x337a, 0x557: 0x34a6, 0x558: 0x3537, 0x559: 0x3573, 0x55a: 0x1be0, 0x55b: 0x42d7, 0x560: 0x46a1, 0x561: 0x4732, 0x562: 0x2f83, 0x563: 0x328f, 0x564: 0x3878, 0x565: 0x3a07, 0x566: 0x3871, 0x567: 0x3a00, 0x568: 0x3886, 0x569: 0x3a15, 0x56a: 0x387f, 0x56b: 0x3a0e, 0x56c: 0x38be, 0x56d: 0x3a4d, 0x56e: 0x3894, 0x56f: 0x3a23, 0x570: 0x388d, 0x571: 0x3a1c, 0x572: 0x38a2, 0x573: 0x3a31, 0x574: 0x389b, 0x575: 0x3a2a, 0x576: 0x38c5, 0x577: 0x3a54, 0x578: 0x46b5, 0x579: 0x4746, 0x57a: 0x3000, 0x57b: 0x330c, 0x57c: 0x2fec, 0x57d: 0x32f8, 0x57e: 0x38da, 0x57f: 0x3a69, // Block 0x16, offset 0x580 0x580: 0x38d3, 0x581: 0x3a62, 0x582: 0x38e8, 0x583: 0x3a77, 0x584: 0x38e1, 0x585: 0x3a70, 0x586: 0x38fd, 0x587: 0x3a8c, 0x588: 0x3091, 0x589: 0x339d, 0x58a: 0x30a5, 0x58b: 0x33b1, 0x58c: 0x46e7, 0x58d: 0x4778, 0x58e: 0x3136, 0x58f: 0x3447, 0x590: 0x3920, 0x591: 0x3aaf, 0x592: 0x3919, 0x593: 0x3aa8, 0x594: 0x392e, 0x595: 0x3abd, 0x596: 0x3927, 0x597: 0x3ab6, 0x598: 0x3989, 0x599: 0x3b18, 0x59a: 0x396d, 0x59b: 0x3afc, 0x59c: 0x3966, 0x59d: 0x3af5, 0x59e: 0x397b, 0x59f: 0x3b0a, 0x5a0: 0x3974, 0x5a1: 0x3b03, 0x5a2: 0x3982, 0x5a3: 0x3b11, 0x5a4: 0x31e5, 0x5a5: 0x34fb, 0x5a6: 0x31c7, 0x5a7: 0x34dd, 0x5a8: 0x39e4, 0x5a9: 0x3b73, 0x5aa: 0x39dd, 0x5ab: 0x3b6c, 0x5ac: 0x39f2, 0x5ad: 0x3b81, 0x5ae: 0x39eb, 0x5af: 0x3b7a, 0x5b0: 0x39f9, 0x5b1: 0x3b88, 0x5b2: 0x3230, 0x5b3: 0x354b, 0x5b4: 0x3258, 0x5b5: 0x3578, 0x5b6: 0x3253, 0x5b7: 0x356e, 0x5b8: 0x323f, 0x5b9: 0x355a, // Block 0x17, offset 0x5c0 0x5c0: 0x4804, 0x5c1: 0x480a, 0x5c2: 0x491e, 0x5c3: 0x4936, 0x5c4: 0x4926, 0x5c5: 0x493e, 0x5c6: 0x492e, 0x5c7: 0x4946, 0x5c8: 0x47aa, 0x5c9: 0x47b0, 0x5ca: 0x488e, 0x5cb: 0x48a6, 0x5cc: 0x4896, 0x5cd: 0x48ae, 0x5ce: 0x489e, 0x5cf: 0x48b6, 0x5d0: 0x4816, 0x5d1: 0x481c, 0x5d2: 0x3db8, 0x5d3: 0x3dc8, 0x5d4: 0x3dc0, 0x5d5: 0x3dd0, 0x5d8: 0x47b6, 0x5d9: 0x47bc, 0x5da: 0x3ce8, 0x5db: 0x3cf8, 0x5dc: 0x3cf0, 0x5dd: 0x3d00, 0x5e0: 0x482e, 0x5e1: 0x4834, 0x5e2: 0x494e, 0x5e3: 0x4966, 0x5e4: 0x4956, 0x5e5: 0x496e, 0x5e6: 0x495e, 0x5e7: 0x4976, 0x5e8: 0x47c2, 0x5e9: 0x47c8, 0x5ea: 0x48be, 0x5eb: 0x48d6, 0x5ec: 0x48c6, 0x5ed: 0x48de, 0x5ee: 0x48ce, 0x5ef: 0x48e6, 0x5f0: 0x4846, 0x5f1: 0x484c, 0x5f2: 0x3e18, 0x5f3: 0x3e30, 0x5f4: 0x3e20, 0x5f5: 0x3e38, 0x5f6: 0x3e28, 0x5f7: 0x3e40, 0x5f8: 0x47ce, 0x5f9: 0x47d4, 0x5fa: 0x3d18, 0x5fb: 0x3d30, 0x5fc: 0x3d20, 0x5fd: 0x3d38, 0x5fe: 0x3d28, 0x5ff: 0x3d40, // Block 0x18, offset 0x600 0x600: 0x4852, 0x601: 0x4858, 0x602: 0x3e48, 0x603: 0x3e58, 0x604: 0x3e50, 0x605: 0x3e60, 0x608: 0x47da, 0x609: 0x47e0, 0x60a: 0x3d48, 0x60b: 0x3d58, 0x60c: 0x3d50, 0x60d: 0x3d60, 0x610: 0x4864, 0x611: 0x486a, 0x612: 0x3e80, 0x613: 0x3e98, 0x614: 0x3e88, 0x615: 0x3ea0, 0x616: 0x3e90, 0x617: 0x3ea8, 0x619: 0x47e6, 0x61b: 0x3d68, 0x61d: 0x3d70, 0x61f: 0x3d78, 0x620: 0x487c, 0x621: 0x4882, 0x622: 0x497e, 0x623: 0x4996, 0x624: 0x4986, 0x625: 0x499e, 0x626: 0x498e, 0x627: 0x49a6, 0x628: 0x47ec, 0x629: 0x47f2, 0x62a: 0x48ee, 0x62b: 0x4906, 0x62c: 0x48f6, 0x62d: 0x490e, 0x62e: 0x48fe, 0x62f: 0x4916, 0x630: 0x47f8, 0x631: 0x431e, 0x632: 0x3691, 0x633: 0x4324, 0x634: 0x4822, 0x635: 0x432a, 0x636: 0x36a3, 0x637: 0x4330, 0x638: 0x36c1, 0x639: 0x4336, 0x63a: 0x36d9, 0x63b: 0x433c, 0x63c: 0x4870, 0x63d: 0x4342, // Block 0x19, offset 0x640 0x640: 0x3da0, 0x641: 0x3da8, 0x642: 0x4184, 0x643: 0x41a2, 0x644: 0x418e, 0x645: 0x41ac, 0x646: 0x4198, 0x647: 0x41b6, 0x648: 0x3cd8, 0x649: 0x3ce0, 0x64a: 0x40d0, 0x64b: 0x40ee, 0x64c: 0x40da, 0x64d: 0x40f8, 0x64e: 0x40e4, 0x64f: 0x4102, 0x650: 0x3de8, 0x651: 0x3df0, 0x652: 0x41c0, 0x653: 0x41de, 0x654: 0x41ca, 0x655: 0x41e8, 0x656: 0x41d4, 0x657: 0x41f2, 0x658: 0x3d08, 0x659: 0x3d10, 0x65a: 0x410c, 0x65b: 0x412a, 0x65c: 0x4116, 0x65d: 0x4134, 0x65e: 0x4120, 0x65f: 0x413e, 0x660: 0x3ec0, 0x661: 0x3ec8, 0x662: 0x41fc, 0x663: 0x421a, 0x664: 0x4206, 0x665: 0x4224, 0x666: 0x4210, 0x667: 0x422e, 0x668: 0x3d80, 0x669: 0x3d88, 0x66a: 0x4148, 0x66b: 0x4166, 0x66c: 0x4152, 0x66d: 0x4170, 0x66e: 0x415c, 0x66f: 0x417a, 0x670: 0x3685, 0x671: 0x367f, 0x672: 0x3d90, 0x673: 0x368b, 0x674: 0x3d98, 0x676: 0x4810, 0x677: 0x3db0, 0x678: 0x35f5, 0x679: 0x35ef, 0x67a: 0x35e3, 0x67b: 0x42ee, 0x67c: 0x35fb, 0x67d: 0x4287, 0x67e: 0x01d3, 0x67f: 0x4287, // Block 0x1a, offset 0x680 0x680: 0x42a0, 0x681: 0x4482, 0x682: 0x3dd8, 0x683: 0x369d, 0x684: 0x3de0, 0x686: 0x483a, 0x687: 0x3df8, 0x688: 0x3601, 0x689: 0x42f4, 0x68a: 0x360d, 0x68b: 0x42fa, 0x68c: 0x3619, 0x68d: 0x4489, 0x68e: 0x4490, 0x68f: 0x4497, 0x690: 0x36b5, 0x691: 0x36af, 0x692: 0x3e00, 0x693: 0x44e4, 0x696: 0x36bb, 0x697: 0x3e10, 0x698: 0x3631, 0x699: 0x362b, 0x69a: 0x361f, 0x69b: 0x4300, 0x69d: 0x449e, 0x69e: 0x44a5, 0x69f: 0x44ac, 0x6a0: 0x36eb, 0x6a1: 0x36e5, 0x6a2: 0x3e68, 0x6a3: 0x44ec, 0x6a4: 0x36cd, 0x6a5: 0x36d3, 0x6a6: 0x36f1, 0x6a7: 0x3e78, 0x6a8: 0x3661, 0x6a9: 0x365b, 0x6aa: 0x364f, 0x6ab: 0x430c, 0x6ac: 0x3649, 0x6ad: 0x4474, 0x6ae: 0x447b, 0x6af: 0x0081, 0x6b2: 0x3eb0, 0x6b3: 0x36f7, 0x6b4: 0x3eb8, 0x6b6: 0x4888, 0x6b7: 0x3ed0, 0x6b8: 0x363d, 0x6b9: 0x4306, 0x6ba: 0x366d, 0x6bb: 0x4318, 0x6bc: 0x3679, 0x6bd: 0x425a, 0x6be: 0x428c, // Block 0x1b, offset 0x6c0 0x6c0: 0x1bd8, 0x6c1: 0x1bdc, 0x6c2: 0x0047, 0x6c3: 0x1c54, 0x6c5: 0x1be8, 0x6c6: 0x1bec, 0x6c7: 0x00e9, 0x6c9: 0x1c58, 0x6ca: 0x008f, 0x6cb: 0x0051, 0x6cc: 0x0051, 0x6cd: 0x0051, 0x6ce: 0x0091, 0x6cf: 0x00da, 0x6d0: 0x0053, 0x6d1: 0x0053, 0x6d2: 0x0059, 0x6d3: 0x0099, 0x6d5: 0x005d, 0x6d6: 0x198d, 0x6d9: 0x0061, 0x6da: 0x0063, 0x6db: 0x0065, 0x6dc: 0x0065, 0x6dd: 0x0065, 0x6e0: 0x199f, 0x6e1: 0x1bc8, 0x6e2: 0x19a8, 0x6e4: 0x0075, 0x6e6: 0x01b8, 0x6e8: 0x0075, 0x6ea: 0x0057, 0x6eb: 0x42d2, 0x6ec: 0x0045, 0x6ed: 0x0047, 0x6ef: 0x008b, 0x6f0: 0x004b, 0x6f1: 0x004d, 0x6f3: 0x005b, 0x6f4: 0x009f, 0x6f5: 0x0215, 0x6f6: 0x0218, 0x6f7: 0x021b, 0x6f8: 0x021e, 0x6f9: 0x0093, 0x6fb: 0x1b98, 0x6fc: 0x01e8, 0x6fd: 0x01c1, 0x6fe: 0x0179, 0x6ff: 0x01a0, // Block 0x1c, offset 0x700 0x700: 0x0463, 0x705: 0x0049, 0x706: 0x0089, 0x707: 0x008b, 0x708: 0x0093, 0x709: 0x0095, 0x710: 0x222e, 0x711: 0x223a, 0x712: 0x22ee, 0x713: 0x2216, 0x714: 0x229a, 0x715: 0x2222, 0x716: 0x22a0, 0x717: 0x22b8, 0x718: 0x22c4, 0x719: 0x2228, 0x71a: 0x22ca, 0x71b: 0x2234, 0x71c: 0x22be, 0x71d: 0x22d0, 0x71e: 0x22d6, 0x71f: 0x1cbc, 0x720: 0x0053, 0x721: 0x195a, 0x722: 0x1ba4, 0x723: 0x1963, 0x724: 0x006d, 0x725: 0x19ab, 0x726: 0x1bd0, 0x727: 0x1d48, 0x728: 0x1966, 0x729: 0x0071, 0x72a: 0x19b7, 0x72b: 0x1bd4, 0x72c: 0x0059, 0x72d: 0x0047, 0x72e: 0x0049, 0x72f: 0x005b, 0x730: 0x0093, 0x731: 0x19e4, 0x732: 0x1c18, 0x733: 0x19ed, 0x734: 0x00ad, 0x735: 0x1a62, 0x736: 0x1c4c, 0x737: 0x1d5c, 0x738: 0x19f0, 0x739: 0x00b1, 0x73a: 0x1a65, 0x73b: 0x1c50, 0x73c: 0x0099, 0x73d: 0x0087, 0x73e: 0x0089, 0x73f: 0x009b, // Block 0x1d, offset 0x740 0x741: 0x3c06, 0x743: 0xa000, 0x744: 0x3c0d, 0x745: 0xa000, 0x747: 0x3c14, 0x748: 0xa000, 0x749: 0x3c1b, 0x74d: 0xa000, 0x760: 0x2f65, 0x761: 0xa000, 0x762: 0x3c29, 0x764: 0xa000, 0x765: 0xa000, 0x76d: 0x3c22, 0x76e: 0x2f60, 0x76f: 0x2f6a, 0x770: 0x3c30, 0x771: 0x3c37, 0x772: 0xa000, 0x773: 0xa000, 0x774: 0x3c3e, 0x775: 0x3c45, 0x776: 0xa000, 0x777: 0xa000, 0x778: 0x3c4c, 0x779: 0x3c53, 0x77a: 0xa000, 0x77b: 0xa000, 0x77c: 0xa000, 0x77d: 0xa000, // Block 0x1e, offset 0x780 0x780: 0x3c5a, 0x781: 0x3c61, 0x782: 0xa000, 0x783: 0xa000, 0x784: 0x3c76, 0x785: 0x3c7d, 0x786: 0xa000, 0x787: 0xa000, 0x788: 0x3c84, 0x789: 0x3c8b, 0x791: 0xa000, 0x792: 0xa000, 0x7a2: 0xa000, 0x7a8: 0xa000, 0x7a9: 0xa000, 0x7ab: 0xa000, 0x7ac: 0x3ca0, 0x7ad: 0x3ca7, 0x7ae: 0x3cae, 0x7af: 0x3cb5, 0x7b2: 0xa000, 0x7b3: 0xa000, 0x7b4: 0xa000, 0x7b5: 0xa000, // Block 0x1f, offset 0x7c0 0x7e0: 0x0023, 0x7e1: 0x0025, 0x7e2: 0x0027, 0x7e3: 0x0029, 0x7e4: 0x002b, 0x7e5: 0x002d, 0x7e6: 0x002f, 0x7e7: 0x0031, 0x7e8: 0x0033, 0x7e9: 0x1882, 0x7ea: 0x1885, 0x7eb: 0x1888, 0x7ec: 0x188b, 0x7ed: 0x188e, 0x7ee: 0x1891, 0x7ef: 0x1894, 0x7f0: 0x1897, 0x7f1: 0x189a, 0x7f2: 0x189d, 0x7f3: 0x18a6, 0x7f4: 0x1a68, 0x7f5: 0x1a6c, 0x7f6: 0x1a70, 0x7f7: 0x1a74, 0x7f8: 0x1a78, 0x7f9: 0x1a7c, 0x7fa: 0x1a80, 0x7fb: 0x1a84, 0x7fc: 0x1a88, 0x7fd: 0x1c80, 0x7fe: 0x1c85, 0x7ff: 0x1c8a, // Block 0x20, offset 0x800 0x800: 0x1c8f, 0x801: 0x1c94, 0x802: 0x1c99, 0x803: 0x1c9e, 0x804: 0x1ca3, 0x805: 0x1ca8, 0x806: 0x1cad, 0x807: 0x1cb2, 0x808: 0x187f, 0x809: 0x18a3, 0x80a: 0x18c7, 0x80b: 0x18eb, 0x80c: 0x190f, 0x80d: 0x1918, 0x80e: 0x191e, 0x80f: 0x1924, 0x810: 0x192a, 0x811: 0x1b60, 0x812: 0x1b64, 0x813: 0x1b68, 0x814: 0x1b6c, 0x815: 0x1b70, 0x816: 0x1b74, 0x817: 0x1b78, 0x818: 0x1b7c, 0x819: 0x1b80, 0x81a: 0x1b84, 0x81b: 0x1b88, 0x81c: 0x1af4, 0x81d: 0x1af8, 0x81e: 0x1afc, 0x81f: 0x1b00, 0x820: 0x1b04, 0x821: 0x1b08, 0x822: 0x1b0c, 0x823: 0x1b10, 0x824: 0x1b14, 0x825: 0x1b18, 0x826: 0x1b1c, 0x827: 0x1b20, 0x828: 0x1b24, 0x829: 0x1b28, 0x82a: 0x1b2c, 0x82b: 0x1b30, 0x82c: 0x1b34, 0x82d: 0x1b38, 0x82e: 0x1b3c, 0x82f: 0x1b40, 0x830: 0x1b44, 0x831: 0x1b48, 0x832: 0x1b4c, 0x833: 0x1b50, 0x834: 0x1b54, 0x835: 0x1b58, 0x836: 0x0043, 0x837: 0x0045, 0x838: 0x0047, 0x839: 0x0049, 0x83a: 0x004b, 0x83b: 0x004d, 0x83c: 0x004f, 0x83d: 0x0051, 0x83e: 0x0053, 0x83f: 0x0055, // Block 0x21, offset 0x840 0x840: 0x06bf, 0x841: 0x06e3, 0x842: 0x06ef, 0x843: 0x06ff, 0x844: 0x0707, 0x845: 0x0713, 0x846: 0x071b, 0x847: 0x0723, 0x848: 0x072f, 0x849: 0x0783, 0x84a: 0x079b, 0x84b: 0x07ab, 0x84c: 0x07bb, 0x84d: 0x07cb, 0x84e: 0x07db, 0x84f: 0x07fb, 0x850: 0x07ff, 0x851: 0x0803, 0x852: 0x0837, 0x853: 0x085f, 0x854: 0x086f, 0x855: 0x0877, 0x856: 0x087b, 0x857: 0x0887, 0x858: 0x08a3, 0x859: 0x08a7, 0x85a: 0x08bf, 0x85b: 0x08c3, 0x85c: 0x08cb, 0x85d: 0x08db, 0x85e: 0x0977, 0x85f: 0x098b, 0x860: 0x09cb, 0x861: 0x09df, 0x862: 0x09e7, 0x863: 0x09eb, 0x864: 0x09fb, 0x865: 0x0a17, 0x866: 0x0a43, 0x867: 0x0a4f, 0x868: 0x0a6f, 0x869: 0x0a7b, 0x86a: 0x0a7f, 0x86b: 0x0a83, 0x86c: 0x0a9b, 0x86d: 0x0a9f, 0x86e: 0x0acb, 0x86f: 0x0ad7, 0x870: 0x0adf, 0x871: 0x0ae7, 0x872: 0x0af7, 0x873: 0x0aff, 0x874: 0x0b07, 0x875: 0x0b33, 0x876: 0x0b37, 0x877: 0x0b3f, 0x878: 0x0b43, 0x879: 0x0b4b, 0x87a: 0x0b53, 0x87b: 0x0b63, 0x87c: 0x0b7f, 0x87d: 0x0bf7, 0x87e: 0x0c0b, 0x87f: 0x0c0f, // Block 0x22, offset 0x880 0x880: 0x0c8f, 0x881: 0x0c93, 0x882: 0x0ca7, 0x883: 0x0cab, 0x884: 0x0cb3, 0x885: 0x0cbb, 0x886: 0x0cc3, 0x887: 0x0ccf, 0x888: 0x0cf7, 0x889: 0x0d07, 0x88a: 0x0d1b, 0x88b: 0x0d8b, 0x88c: 0x0d97, 0x88d: 0x0da7, 0x88e: 0x0db3, 0x88f: 0x0dbf, 0x890: 0x0dc7, 0x891: 0x0dcb, 0x892: 0x0dcf, 0x893: 0x0dd3, 0x894: 0x0dd7, 0x895: 0x0e8f, 0x896: 0x0ed7, 0x897: 0x0ee3, 0x898: 0x0ee7, 0x899: 0x0eeb, 0x89a: 0x0eef, 0x89b: 0x0ef7, 0x89c: 0x0efb, 0x89d: 0x0f0f, 0x89e: 0x0f2b, 0x89f: 0x0f33, 0x8a0: 0x0f73, 0x8a1: 0x0f77, 0x8a2: 0x0f7f, 0x8a3: 0x0f83, 0x8a4: 0x0f8b, 0x8a5: 0x0f8f, 0x8a6: 0x0fb3, 0x8a7: 0x0fb7, 0x8a8: 0x0fd3, 0x8a9: 0x0fd7, 0x8aa: 0x0fdb, 0x8ab: 0x0fdf, 0x8ac: 0x0ff3, 0x8ad: 0x1017, 0x8ae: 0x101b, 0x8af: 0x101f, 0x8b0: 0x1043, 0x8b1: 0x1083, 0x8b2: 0x1087, 0x8b3: 0x10a7, 0x8b4: 0x10b7, 0x8b5: 0x10bf, 0x8b6: 0x10df, 0x8b7: 0x1103, 0x8b8: 0x1147, 0x8b9: 0x114f, 0x8ba: 0x1163, 0x8bb: 0x116f, 0x8bc: 0x1177, 0x8bd: 0x117f, 0x8be: 0x1183, 0x8bf: 0x1187, // Block 0x23, offset 0x8c0 0x8c0: 0x119f, 0x8c1: 0x11a3, 0x8c2: 0x11bf, 0x8c3: 0x11c7, 0x8c4: 0x11cf, 0x8c5: 0x11d3, 0x8c6: 0x11df, 0x8c7: 0x11e7, 0x8c8: 0x11eb, 0x8c9: 0x11ef, 0x8ca: 0x11f7, 0x8cb: 0x11fb, 0x8cc: 0x129b, 0x8cd: 0x12af, 0x8ce: 0x12e3, 0x8cf: 0x12e7, 0x8d0: 0x12ef, 0x8d1: 0x131b, 0x8d2: 0x1323, 0x8d3: 0x132b, 0x8d4: 0x1333, 0x8d5: 0x136f, 0x8d6: 0x1373, 0x8d7: 0x137b, 0x8d8: 0x137f, 0x8d9: 0x1383, 0x8da: 0x13af, 0x8db: 0x13b3, 0x8dc: 0x13bb, 0x8dd: 0x13cf, 0x8de: 0x13d3, 0x8df: 0x13ef, 0x8e0: 0x13f7, 0x8e1: 0x13fb, 0x8e2: 0x141f, 0x8e3: 0x143f, 0x8e4: 0x1453, 0x8e5: 0x1457, 0x8e6: 0x145f, 0x8e7: 0x148b, 0x8e8: 0x148f, 0x8e9: 0x149f, 0x8ea: 0x14c3, 0x8eb: 0x14cf, 0x8ec: 0x14df, 0x8ed: 0x14f7, 0x8ee: 0x14ff, 0x8ef: 0x1503, 0x8f0: 0x1507, 0x8f1: 0x150b, 0x8f2: 0x1517, 0x8f3: 0x151b, 0x8f4: 0x1523, 0x8f5: 0x153f, 0x8f6: 0x1543, 0x8f7: 0x1547, 0x8f8: 0x155f, 0x8f9: 0x1563, 0x8fa: 0x156b, 0x8fb: 0x157f, 0x8fc: 0x1583, 0x8fd: 0x1587, 0x8fe: 0x158f, 0x8ff: 0x1593, // Block 0x24, offset 0x900 0x906: 0xa000, 0x90b: 0xa000, 0x90c: 0x3f08, 0x90d: 0xa000, 0x90e: 0x3f10, 0x90f: 0xa000, 0x910: 0x3f18, 0x911: 0xa000, 0x912: 0x3f20, 0x913: 0xa000, 0x914: 0x3f28, 0x915: 0xa000, 0x916: 0x3f30, 0x917: 0xa000, 0x918: 0x3f38, 0x919: 0xa000, 0x91a: 0x3f40, 0x91b: 0xa000, 0x91c: 0x3f48, 0x91d: 0xa000, 0x91e: 0x3f50, 0x91f: 0xa000, 0x920: 0x3f58, 0x921: 0xa000, 0x922: 0x3f60, 0x924: 0xa000, 0x925: 0x3f68, 0x926: 0xa000, 0x927: 0x3f70, 0x928: 0xa000, 0x929: 0x3f78, 0x92f: 0xa000, 0x930: 0x3f80, 0x931: 0x3f88, 0x932: 0xa000, 0x933: 0x3f90, 0x934: 0x3f98, 0x935: 0xa000, 0x936: 0x3fa0, 0x937: 0x3fa8, 0x938: 0xa000, 0x939: 0x3fb0, 0x93a: 0x3fb8, 0x93b: 0xa000, 0x93c: 0x3fc0, 0x93d: 0x3fc8, // Block 0x25, offset 0x940 0x954: 0x3f00, 0x959: 0x9903, 0x95a: 0x9903, 0x95b: 0x42dc, 0x95c: 0x42e2, 0x95d: 0xa000, 0x95e: 0x3fd0, 0x95f: 0x26b4, 0x966: 0xa000, 0x96b: 0xa000, 0x96c: 0x3fe0, 0x96d: 0xa000, 0x96e: 0x3fe8, 0x96f: 0xa000, 0x970: 0x3ff0, 0x971: 0xa000, 0x972: 0x3ff8, 0x973: 0xa000, 0x974: 0x4000, 0x975: 0xa000, 0x976: 0x4008, 0x977: 0xa000, 0x978: 0x4010, 0x979: 0xa000, 0x97a: 0x4018, 0x97b: 0xa000, 0x97c: 0x4020, 0x97d: 0xa000, 0x97e: 0x4028, 0x97f: 0xa000, // Block 0x26, offset 0x980 0x980: 0x4030, 0x981: 0xa000, 0x982: 0x4038, 0x984: 0xa000, 0x985: 0x4040, 0x986: 0xa000, 0x987: 0x4048, 0x988: 0xa000, 0x989: 0x4050, 0x98f: 0xa000, 0x990: 0x4058, 0x991: 0x4060, 0x992: 0xa000, 0x993: 0x4068, 0x994: 0x4070, 0x995: 0xa000, 0x996: 0x4078, 0x997: 0x4080, 0x998: 0xa000, 0x999: 0x4088, 0x99a: 0x4090, 0x99b: 0xa000, 0x99c: 0x4098, 0x99d: 0x40a0, 0x9af: 0xa000, 0x9b0: 0xa000, 0x9b1: 0xa000, 0x9b2: 0xa000, 0x9b4: 0x3fd8, 0x9b7: 0x40a8, 0x9b8: 0x40b0, 0x9b9: 0x40b8, 0x9ba: 0x40c0, 0x9bd: 0xa000, 0x9be: 0x40c8, 0x9bf: 0x26c9, // Block 0x27, offset 0x9c0 0x9c0: 0x0367, 0x9c1: 0x032b, 0x9c2: 0x032f, 0x9c3: 0x0333, 0x9c4: 0x037b, 0x9c5: 0x0337, 0x9c6: 0x033b, 0x9c7: 0x033f, 0x9c8: 0x0343, 0x9c9: 0x0347, 0x9ca: 0x034b, 0x9cb: 0x034f, 0x9cc: 0x0353, 0x9cd: 0x0357, 0x9ce: 0x035b, 0x9cf: 0x49bd, 0x9d0: 0x49c3, 0x9d1: 0x49c9, 0x9d2: 0x49cf, 0x9d3: 0x49d5, 0x9d4: 0x49db, 0x9d5: 0x49e1, 0x9d6: 0x49e7, 0x9d7: 0x49ed, 0x9d8: 0x49f3, 0x9d9: 0x49f9, 0x9da: 0x49ff, 0x9db: 0x4a05, 0x9dc: 0x4a0b, 0x9dd: 0x4a11, 0x9de: 0x4a17, 0x9df: 0x4a1d, 0x9e0: 0x4a23, 0x9e1: 0x4a29, 0x9e2: 0x4a2f, 0x9e3: 0x4a35, 0x9e4: 0x03c3, 0x9e5: 0x035f, 0x9e6: 0x0363, 0x9e7: 0x03e7, 0x9e8: 0x03eb, 0x9e9: 0x03ef, 0x9ea: 0x03f3, 0x9eb: 0x03f7, 0x9ec: 0x03fb, 0x9ed: 0x03ff, 0x9ee: 0x036b, 0x9ef: 0x0403, 0x9f0: 0x0407, 0x9f1: 0x036f, 0x9f2: 0x0373, 0x9f3: 0x0377, 0x9f4: 0x037f, 0x9f5: 0x0383, 0x9f6: 0x0387, 0x9f7: 0x038b, 0x9f8: 0x038f, 0x9f9: 0x0393, 0x9fa: 0x0397, 0x9fb: 0x039b, 0x9fc: 0x039f, 0x9fd: 0x03a3, 0x9fe: 0x03a7, 0x9ff: 0x03ab, // Block 0x28, offset 0xa00 0xa00: 0x03af, 0xa01: 0x03b3, 0xa02: 0x040b, 0xa03: 0x040f, 0xa04: 0x03b7, 0xa05: 0x03bb, 0xa06: 0x03bf, 0xa07: 0x03c7, 0xa08: 0x03cb, 0xa09: 0x03cf, 0xa0a: 0x03d3, 0xa0b: 0x03d7, 0xa0c: 0x03db, 0xa0d: 0x03df, 0xa0e: 0x03e3, 0xa12: 0x06bf, 0xa13: 0x071b, 0xa14: 0x06cb, 0xa15: 0x097b, 0xa16: 0x06cf, 0xa17: 0x06e7, 0xa18: 0x06d3, 0xa19: 0x0f93, 0xa1a: 0x0707, 0xa1b: 0x06db, 0xa1c: 0x06c3, 0xa1d: 0x09ff, 0xa1e: 0x098f, 0xa1f: 0x072f, // Block 0x29, offset 0xa40 0xa40: 0x2054, 0xa41: 0x205a, 0xa42: 0x2060, 0xa43: 0x2066, 0xa44: 0x206c, 0xa45: 0x2072, 0xa46: 0x2078, 0xa47: 0x207e, 0xa48: 0x2084, 0xa49: 0x208a, 0xa4a: 0x2090, 0xa4b: 0x2096, 0xa4c: 0x209c, 0xa4d: 0x20a2, 0xa4e: 0x2726, 0xa4f: 0x272f, 0xa50: 0x2738, 0xa51: 0x2741, 0xa52: 0x274a, 0xa53: 0x2753, 0xa54: 0x275c, 0xa55: 0x2765, 0xa56: 0x276e, 0xa57: 0x2780, 0xa58: 0x2789, 0xa59: 0x2792, 0xa5a: 0x279b, 0xa5b: 0x27a4, 0xa5c: 0x2777, 0xa5d: 0x2bac, 0xa5e: 0x2aed, 0xa60: 0x20a8, 0xa61: 0x20c0, 0xa62: 0x20b4, 0xa63: 0x2108, 0xa64: 0x20c6, 0xa65: 0x20e4, 0xa66: 0x20ae, 0xa67: 0x20de, 0xa68: 0x20ba, 0xa69: 0x20f0, 0xa6a: 0x2120, 0xa6b: 0x213e, 0xa6c: 0x2138, 0xa6d: 0x212c, 0xa6e: 0x217a, 0xa6f: 0x210e, 0xa70: 0x211a, 0xa71: 0x2132, 0xa72: 0x2126, 0xa73: 0x2150, 0xa74: 0x20fc, 0xa75: 0x2144, 0xa76: 0x216e, 0xa77: 0x2156, 0xa78: 0x20ea, 0xa79: 0x20cc, 0xa7a: 0x2102, 0xa7b: 0x2114, 0xa7c: 0x214a, 0xa7d: 0x20d2, 0xa7e: 0x2174, 0xa7f: 0x20f6, // Block 0x2a, offset 0xa80 0xa80: 0x215c, 0xa81: 0x20d8, 0xa82: 0x2162, 0xa83: 0x2168, 0xa84: 0x092f, 0xa85: 0x0b03, 0xa86: 0x0ca7, 0xa87: 0x10c7, 0xa90: 0x1bc4, 0xa91: 0x18a9, 0xa92: 0x18ac, 0xa93: 0x18af, 0xa94: 0x18b2, 0xa95: 0x18b5, 0xa96: 0x18b8, 0xa97: 0x18bb, 0xa98: 0x18be, 0xa99: 0x18c1, 0xa9a: 0x18ca, 0xa9b: 0x18cd, 0xa9c: 0x18d0, 0xa9d: 0x18d3, 0xa9e: 0x18d6, 0xa9f: 0x18d9, 0xaa0: 0x0313, 0xaa1: 0x031b, 0xaa2: 0x031f, 0xaa3: 0x0327, 0xaa4: 0x032b, 0xaa5: 0x032f, 0xaa6: 0x0337, 0xaa7: 0x033f, 0xaa8: 0x0343, 0xaa9: 0x034b, 0xaaa: 0x034f, 0xaab: 0x0353, 0xaac: 0x0357, 0xaad: 0x035b, 0xaae: 0x2e18, 0xaaf: 0x2e20, 0xab0: 0x2e28, 0xab1: 0x2e30, 0xab2: 0x2e38, 0xab3: 0x2e40, 0xab4: 0x2e48, 0xab5: 0x2e50, 0xab6: 0x2e60, 0xab7: 0x2e68, 0xab8: 0x2e70, 0xab9: 0x2e78, 0xaba: 0x2e80, 0xabb: 0x2e88, 0xabc: 0x2ed3, 0xabd: 0x2e9b, 0xabe: 0x2e58, // Block 0x2b, offset 0xac0 0xac0: 0x06bf, 0xac1: 0x071b, 0xac2: 0x06cb, 0xac3: 0x097b, 0xac4: 0x071f, 0xac5: 0x07af, 0xac6: 0x06c7, 0xac7: 0x07ab, 0xac8: 0x070b, 0xac9: 0x0887, 0xaca: 0x0d07, 0xacb: 0x0e8f, 0xacc: 0x0dd7, 0xacd: 0x0d1b, 0xace: 0x145f, 0xacf: 0x098b, 0xad0: 0x0ccf, 0xad1: 0x0d4b, 0xad2: 0x0d0b, 0xad3: 0x104b, 0xad4: 0x08fb, 0xad5: 0x0f03, 0xad6: 0x1387, 0xad7: 0x105f, 0xad8: 0x0843, 0xad9: 0x108f, 0xada: 0x0f9b, 0xadb: 0x0a17, 0xadc: 0x140f, 0xadd: 0x077f, 0xade: 0x08ab, 0xadf: 0x0df7, 0xae0: 0x1527, 0xae1: 0x0743, 0xae2: 0x07d3, 0xae3: 0x0d9b, 0xae4: 0x06cf, 0xae5: 0x06e7, 0xae6: 0x06d3, 0xae7: 0x0adb, 0xae8: 0x08ef, 0xae9: 0x087f, 0xaea: 0x0a57, 0xaeb: 0x0a4b, 0xaec: 0x0feb, 0xaed: 0x073f, 0xaee: 0x139b, 0xaef: 0x089b, 0xaf0: 0x09f3, 0xaf1: 0x18dc, 0xaf2: 0x18df, 0xaf3: 0x18e2, 0xaf4: 0x18e5, 0xaf5: 0x18ee, 0xaf6: 0x18f1, 0xaf7: 0x18f4, 0xaf8: 0x18f7, 0xaf9: 0x18fa, 0xafa: 0x18fd, 0xafb: 0x1900, 0xafc: 0x1903, 0xafd: 0x1906, 0xafe: 0x1909, 0xaff: 0x1912, // Block 0x2c, offset 0xb00 0xb00: 0x1cc6, 0xb01: 0x1cd5, 0xb02: 0x1ce4, 0xb03: 0x1cf3, 0xb04: 0x1d02, 0xb05: 0x1d11, 0xb06: 0x1d20, 0xb07: 0x1d2f, 0xb08: 0x1d3e, 0xb09: 0x218c, 0xb0a: 0x219e, 0xb0b: 0x21b0, 0xb0c: 0x1954, 0xb0d: 0x1c04, 0xb0e: 0x19d2, 0xb0f: 0x1ba8, 0xb10: 0x04cb, 0xb11: 0x04d3, 0xb12: 0x04db, 0xb13: 0x04e3, 0xb14: 0x04eb, 0xb15: 0x04ef, 0xb16: 0x04f3, 0xb17: 0x04f7, 0xb18: 0x04fb, 0xb19: 0x04ff, 0xb1a: 0x0503, 0xb1b: 0x0507, 0xb1c: 0x050b, 0xb1d: 0x050f, 0xb1e: 0x0513, 0xb1f: 0x0517, 0xb20: 0x051b, 0xb21: 0x0523, 0xb22: 0x0527, 0xb23: 0x052b, 0xb24: 0x052f, 0xb25: 0x0533, 0xb26: 0x0537, 0xb27: 0x053b, 0xb28: 0x053f, 0xb29: 0x0543, 0xb2a: 0x0547, 0xb2b: 0x054b, 0xb2c: 0x054f, 0xb2d: 0x0553, 0xb2e: 0x0557, 0xb2f: 0x055b, 0xb30: 0x055f, 0xb31: 0x0563, 0xb32: 0x0567, 0xb33: 0x056f, 0xb34: 0x0577, 0xb35: 0x057f, 0xb36: 0x0583, 0xb37: 0x0587, 0xb38: 0x058b, 0xb39: 0x058f, 0xb3a: 0x0593, 0xb3b: 0x0597, 0xb3c: 0x059b, 0xb3d: 0x059f, 0xb3e: 0x05a3, // Block 0x2d, offset 0xb40 0xb40: 0x2b0c, 0xb41: 0x29a8, 0xb42: 0x2b1c, 0xb43: 0x2880, 0xb44: 0x2ee4, 0xb45: 0x288a, 0xb46: 0x2894, 0xb47: 0x2f28, 0xb48: 0x29b5, 0xb49: 0x289e, 0xb4a: 0x28a8, 0xb4b: 0x28b2, 0xb4c: 0x29dc, 0xb4d: 0x29e9, 0xb4e: 0x29c2, 0xb4f: 0x29cf, 0xb50: 0x2ea9, 0xb51: 0x29f6, 0xb52: 0x2a03, 0xb53: 0x2bbe, 0xb54: 0x26bb, 0xb55: 0x2bd1, 0xb56: 0x2be4, 0xb57: 0x2b2c, 0xb58: 0x2a10, 0xb59: 0x2bf7, 0xb5a: 0x2c0a, 0xb5b: 0x2a1d, 0xb5c: 0x28bc, 0xb5d: 0x28c6, 0xb5e: 0x2eb7, 0xb5f: 0x2a2a, 0xb60: 0x2b3c, 0xb61: 0x2ef5, 0xb62: 0x28d0, 0xb63: 0x28da, 0xb64: 0x2a37, 0xb65: 0x28e4, 0xb66: 0x28ee, 0xb67: 0x26d0, 0xb68: 0x26d7, 0xb69: 0x28f8, 0xb6a: 0x2902, 0xb6b: 0x2c1d, 0xb6c: 0x2a44, 0xb6d: 0x2b4c, 0xb6e: 0x2c30, 0xb6f: 0x2a51, 0xb70: 0x2916, 0xb71: 0x290c, 0xb72: 0x2f3c, 0xb73: 0x2a5e, 0xb74: 0x2c43, 0xb75: 0x2920, 0xb76: 0x2b5c, 0xb77: 0x292a, 0xb78: 0x2a78, 0xb79: 0x2934, 0xb7a: 0x2a85, 0xb7b: 0x2f06, 0xb7c: 0x2a6b, 0xb7d: 0x2b6c, 0xb7e: 0x2a92, 0xb7f: 0x26de, // Block 0x2e, offset 0xb80 0xb80: 0x2f17, 0xb81: 0x293e, 0xb82: 0x2948, 0xb83: 0x2a9f, 0xb84: 0x2952, 0xb85: 0x295c, 0xb86: 0x2966, 0xb87: 0x2b7c, 0xb88: 0x2aac, 0xb89: 0x26e5, 0xb8a: 0x2c56, 0xb8b: 0x2e90, 0xb8c: 0x2b8c, 0xb8d: 0x2ab9, 0xb8e: 0x2ec5, 0xb8f: 0x2970, 0xb90: 0x297a, 0xb91: 0x2ac6, 0xb92: 0x26ec, 0xb93: 0x2ad3, 0xb94: 0x2b9c, 0xb95: 0x26f3, 0xb96: 0x2c69, 0xb97: 0x2984, 0xb98: 0x1cb7, 0xb99: 0x1ccb, 0xb9a: 0x1cda, 0xb9b: 0x1ce9, 0xb9c: 0x1cf8, 0xb9d: 0x1d07, 0xb9e: 0x1d16, 0xb9f: 0x1d25, 0xba0: 0x1d34, 0xba1: 0x1d43, 0xba2: 0x2192, 0xba3: 0x21a4, 0xba4: 0x21b6, 0xba5: 0x21c2, 0xba6: 0x21ce, 0xba7: 0x21da, 0xba8: 0x21e6, 0xba9: 0x21f2, 0xbaa: 0x21fe, 0xbab: 0x220a, 0xbac: 0x2246, 0xbad: 0x2252, 0xbae: 0x225e, 0xbaf: 0x226a, 0xbb0: 0x2276, 0xbb1: 0x1c14, 0xbb2: 0x19c6, 0xbb3: 0x1936, 0xbb4: 0x1be4, 0xbb5: 0x1a47, 0xbb6: 0x1a56, 0xbb7: 0x19cc, 0xbb8: 0x1bfc, 0xbb9: 0x1c00, 0xbba: 0x1960, 0xbbb: 0x2701, 0xbbc: 0x270f, 0xbbd: 0x26fa, 0xbbe: 0x2708, 0xbbf: 0x2ae0, // Block 0x2f, offset 0xbc0 0xbc0: 0x1a4a, 0xbc1: 0x1a32, 0xbc2: 0x1c60, 0xbc3: 0x1a1a, 0xbc4: 0x19f3, 0xbc5: 0x1969, 0xbc6: 0x1978, 0xbc7: 0x1948, 0xbc8: 0x1bf0, 0xbc9: 0x1d52, 0xbca: 0x1a4d, 0xbcb: 0x1a35, 0xbcc: 0x1c64, 0xbcd: 0x1c70, 0xbce: 0x1a26, 0xbcf: 0x19fc, 0xbd0: 0x1957, 0xbd1: 0x1c1c, 0xbd2: 0x1bb0, 0xbd3: 0x1b9c, 0xbd4: 0x1bcc, 0xbd5: 0x1c74, 0xbd6: 0x1a29, 0xbd7: 0x19c9, 0xbd8: 0x19ff, 0xbd9: 0x19de, 0xbda: 0x1a41, 0xbdb: 0x1c78, 0xbdc: 0x1a2c, 0xbdd: 0x19c0, 0xbde: 0x1a02, 0xbdf: 0x1c3c, 0xbe0: 0x1bf4, 0xbe1: 0x1a14, 0xbe2: 0x1c24, 0xbe3: 0x1c40, 0xbe4: 0x1bf8, 0xbe5: 0x1a17, 0xbe6: 0x1c28, 0xbe7: 0x22e8, 0xbe8: 0x22fc, 0xbe9: 0x1996, 0xbea: 0x1c20, 0xbeb: 0x1bb4, 0xbec: 0x1ba0, 0xbed: 0x1c48, 0xbee: 0x2716, 0xbef: 0x27ad, 0xbf0: 0x1a59, 0xbf1: 0x1a44, 0xbf2: 0x1c7c, 0xbf3: 0x1a2f, 0xbf4: 0x1a50, 0xbf5: 0x1a38, 0xbf6: 0x1c68, 0xbf7: 0x1a1d, 0xbf8: 0x19f6, 0xbf9: 0x1981, 0xbfa: 0x1a53, 0xbfb: 0x1a3b, 0xbfc: 0x1c6c, 0xbfd: 0x1a20, 0xbfe: 0x19f9, 0xbff: 0x1984, // Block 0x30, offset 0xc00 0xc00: 0x1c2c, 0xc01: 0x1bb8, 0xc02: 0x1d4d, 0xc03: 0x1939, 0xc04: 0x19ba, 0xc05: 0x19bd, 0xc06: 0x22f5, 0xc07: 0x1b94, 0xc08: 0x19c3, 0xc09: 0x194b, 0xc0a: 0x19e1, 0xc0b: 0x194e, 0xc0c: 0x19ea, 0xc0d: 0x196c, 0xc0e: 0x196f, 0xc0f: 0x1a05, 0xc10: 0x1a0b, 0xc11: 0x1a0e, 0xc12: 0x1c30, 0xc13: 0x1a11, 0xc14: 0x1a23, 0xc15: 0x1c38, 0xc16: 0x1c44, 0xc17: 0x1990, 0xc18: 0x1d57, 0xc19: 0x1bbc, 0xc1a: 0x1993, 0xc1b: 0x1a5c, 0xc1c: 0x19a5, 0xc1d: 0x19b4, 0xc1e: 0x22e2, 0xc1f: 0x22dc, 0xc20: 0x1cc1, 0xc21: 0x1cd0, 0xc22: 0x1cdf, 0xc23: 0x1cee, 0xc24: 0x1cfd, 0xc25: 0x1d0c, 0xc26: 0x1d1b, 0xc27: 0x1d2a, 0xc28: 0x1d39, 0xc29: 0x2186, 0xc2a: 0x2198, 0xc2b: 0x21aa, 0xc2c: 0x21bc, 0xc2d: 0x21c8, 0xc2e: 0x21d4, 0xc2f: 0x21e0, 0xc30: 0x21ec, 0xc31: 0x21f8, 0xc32: 0x2204, 0xc33: 0x2240, 0xc34: 0x224c, 0xc35: 0x2258, 0xc36: 0x2264, 0xc37: 0x2270, 0xc38: 0x227c, 0xc39: 0x2282, 0xc3a: 0x2288, 0xc3b: 0x228e, 0xc3c: 0x2294, 0xc3d: 0x22a6, 0xc3e: 0x22ac, 0xc3f: 0x1c10, // Block 0x31, offset 0xc40 0xc40: 0x1377, 0xc41: 0x0cfb, 0xc42: 0x13d3, 0xc43: 0x139f, 0xc44: 0x0e57, 0xc45: 0x06eb, 0xc46: 0x08df, 0xc47: 0x162b, 0xc48: 0x162b, 0xc49: 0x0a0b, 0xc4a: 0x145f, 0xc4b: 0x0943, 0xc4c: 0x0a07, 0xc4d: 0x0bef, 0xc4e: 0x0fcf, 0xc4f: 0x115f, 0xc50: 0x1297, 0xc51: 0x12d3, 0xc52: 0x1307, 0xc53: 0x141b, 0xc54: 0x0d73, 0xc55: 0x0dff, 0xc56: 0x0eab, 0xc57: 0x0f43, 0xc58: 0x125f, 0xc59: 0x1447, 0xc5a: 0x1573, 0xc5b: 0x070f, 0xc5c: 0x08b3, 0xc5d: 0x0d87, 0xc5e: 0x0ecf, 0xc5f: 0x1293, 0xc60: 0x15c3, 0xc61: 0x0ab3, 0xc62: 0x0e77, 0xc63: 0x1283, 0xc64: 0x1317, 0xc65: 0x0c23, 0xc66: 0x11bb, 0xc67: 0x12df, 0xc68: 0x0b1f, 0xc69: 0x0d0f, 0xc6a: 0x0e17, 0xc6b: 0x0f1b, 0xc6c: 0x1427, 0xc6d: 0x074f, 0xc6e: 0x07e7, 0xc6f: 0x0853, 0xc70: 0x0c8b, 0xc71: 0x0d7f, 0xc72: 0x0ecb, 0xc73: 0x0fef, 0xc74: 0x1177, 0xc75: 0x128b, 0xc76: 0x12a3, 0xc77: 0x13c7, 0xc78: 0x14ef, 0xc79: 0x15a3, 0xc7a: 0x15bf, 0xc7b: 0x102b, 0xc7c: 0x106b, 0xc7d: 0x1123, 0xc7e: 0x1243, 0xc7f: 0x147b, // Block 0x32, offset 0xc80 0xc80: 0x15cb, 0xc81: 0x134b, 0xc82: 0x09c7, 0xc83: 0x0b3b, 0xc84: 0x10db, 0xc85: 0x119b, 0xc86: 0x0eff, 0xc87: 0x1033, 0xc88: 0x1397, 0xc89: 0x14e7, 0xc8a: 0x09c3, 0xc8b: 0x0a8f, 0xc8c: 0x0d77, 0xc8d: 0x0e2b, 0xc8e: 0x0e5f, 0xc8f: 0x1113, 0xc90: 0x113b, 0xc91: 0x14a7, 0xc92: 0x084f, 0xc93: 0x11a7, 0xc94: 0x07f3, 0xc95: 0x07ef, 0xc96: 0x1097, 0xc97: 0x1127, 0xc98: 0x125b, 0xc99: 0x14af, 0xc9a: 0x1367, 0xc9b: 0x0c27, 0xc9c: 0x0d73, 0xc9d: 0x1357, 0xc9e: 0x06f7, 0xc9f: 0x0a63, 0xca0: 0x0b93, 0xca1: 0x0f2f, 0xca2: 0x0faf, 0xca3: 0x0873, 0xca4: 0x103b, 0xca5: 0x075f, 0xca6: 0x0b77, 0xca7: 0x06d7, 0xca8: 0x0deb, 0xca9: 0x0ca3, 0xcaa: 0x110f, 0xcab: 0x08c7, 0xcac: 0x09b3, 0xcad: 0x0ffb, 0xcae: 0x1263, 0xcaf: 0x133b, 0xcb0: 0x0db7, 0xcb1: 0x13f7, 0xcb2: 0x0de3, 0xcb3: 0x0c37, 0xcb4: 0x121b, 0xcb5: 0x0c57, 0xcb6: 0x0fab, 0xcb7: 0x072b, 0xcb8: 0x07a7, 0xcb9: 0x07eb, 0xcba: 0x0d53, 0xcbb: 0x10fb, 0xcbc: 0x11f3, 0xcbd: 0x1347, 0xcbe: 0x145b, 0xcbf: 0x085b, // Block 0x33, offset 0xcc0 0xcc0: 0x090f, 0xcc1: 0x0a17, 0xcc2: 0x0b2f, 0xcc3: 0x0cbf, 0xcc4: 0x0e7b, 0xcc5: 0x103f, 0xcc6: 0x1497, 0xcc7: 0x157b, 0xcc8: 0x15cf, 0xcc9: 0x15e7, 0xcca: 0x0837, 0xccb: 0x0cf3, 0xccc: 0x0da3, 0xccd: 0x13eb, 0xcce: 0x0afb, 0xccf: 0x0bd7, 0xcd0: 0x0bf3, 0xcd1: 0x0c83, 0xcd2: 0x0e6b, 0xcd3: 0x0eb7, 0xcd4: 0x0f67, 0xcd5: 0x108b, 0xcd6: 0x112f, 0xcd7: 0x1193, 0xcd8: 0x13db, 0xcd9: 0x126b, 0xcda: 0x1403, 0xcdb: 0x147f, 0xcdc: 0x080f, 0xcdd: 0x083b, 0xcde: 0x0923, 0xcdf: 0x0ea7, 0xce0: 0x12f3, 0xce1: 0x133b, 0xce2: 0x0b1b, 0xce3: 0x0b8b, 0xce4: 0x0c4f, 0xce5: 0x0daf, 0xce6: 0x10d7, 0xce7: 0x0f23, 0xce8: 0x073b, 0xce9: 0x097f, 0xcea: 0x0a63, 0xceb: 0x0ac7, 0xcec: 0x0b97, 0xced: 0x0f3f, 0xcee: 0x0f5b, 0xcef: 0x116b, 0xcf0: 0x118b, 0xcf1: 0x1463, 0xcf2: 0x14e3, 0xcf3: 0x14f3, 0xcf4: 0x152f, 0xcf5: 0x0753, 0xcf6: 0x107f, 0xcf7: 0x144f, 0xcf8: 0x14cb, 0xcf9: 0x0baf, 0xcfa: 0x0717, 0xcfb: 0x0777, 0xcfc: 0x0a67, 0xcfd: 0x0a87, 0xcfe: 0x0caf, 0xcff: 0x0d73, // Block 0x34, offset 0xd00 0xd00: 0x0ec3, 0xd01: 0x0fcb, 0xd02: 0x1277, 0xd03: 0x1417, 0xd04: 0x1623, 0xd05: 0x0ce3, 0xd06: 0x14a3, 0xd07: 0x0833, 0xd08: 0x0d2f, 0xd09: 0x0d3b, 0xd0a: 0x0e0f, 0xd0b: 0x0e47, 0xd0c: 0x0f4b, 0xd0d: 0x0fa7, 0xd0e: 0x1027, 0xd0f: 0x110b, 0xd10: 0x153b, 0xd11: 0x07af, 0xd12: 0x0c03, 0xd13: 0x14b3, 0xd14: 0x0767, 0xd15: 0x0aab, 0xd16: 0x0e2f, 0xd17: 0x13df, 0xd18: 0x0b67, 0xd19: 0x0bb7, 0xd1a: 0x0d43, 0xd1b: 0x0f2f, 0xd1c: 0x14bb, 0xd1d: 0x0817, 0xd1e: 0x08ff, 0xd1f: 0x0a97, 0xd20: 0x0cd3, 0xd21: 0x0d1f, 0xd22: 0x0d5f, 0xd23: 0x0df3, 0xd24: 0x0f47, 0xd25: 0x0fbb, 0xd26: 0x1157, 0xd27: 0x12f7, 0xd28: 0x1303, 0xd29: 0x1457, 0xd2a: 0x14d7, 0xd2b: 0x0883, 0xd2c: 0x0e4b, 0xd2d: 0x0903, 0xd2e: 0x0ec7, 0xd2f: 0x0f6b, 0xd30: 0x1287, 0xd31: 0x14bf, 0xd32: 0x15ab, 0xd33: 0x15d3, 0xd34: 0x0d37, 0xd35: 0x0e27, 0xd36: 0x11c3, 0xd37: 0x10b7, 0xd38: 0x10c3, 0xd39: 0x10e7, 0xd3a: 0x0f17, 0xd3b: 0x0e9f, 0xd3c: 0x1363, 0xd3d: 0x0733, 0xd3e: 0x122b, 0xd3f: 0x081b, // Block 0x35, offset 0xd40 0xd40: 0x080b, 0xd41: 0x0b0b, 0xd42: 0x0c2b, 0xd43: 0x10f3, 0xd44: 0x0a53, 0xd45: 0x0e03, 0xd46: 0x0cef, 0xd47: 0x13e7, 0xd48: 0x12e7, 0xd49: 0x14ab, 0xd4a: 0x1323, 0xd4b: 0x0b27, 0xd4c: 0x0787, 0xd4d: 0x095b, 0xd50: 0x09af, 0xd52: 0x0cdf, 0xd55: 0x07f7, 0xd56: 0x0f1f, 0xd57: 0x0fe3, 0xd58: 0x1047, 0xd59: 0x1063, 0xd5a: 0x1067, 0xd5b: 0x107b, 0xd5c: 0x14fb, 0xd5d: 0x10eb, 0xd5e: 0x116f, 0xd60: 0x128f, 0xd62: 0x1353, 0xd65: 0x1407, 0xd66: 0x1433, 0xd6a: 0x154f, 0xd6b: 0x1553, 0xd6c: 0x1557, 0xd6d: 0x15bb, 0xd6e: 0x142b, 0xd6f: 0x14c7, 0xd70: 0x0757, 0xd71: 0x077b, 0xd72: 0x078f, 0xd73: 0x084b, 0xd74: 0x0857, 0xd75: 0x0897, 0xd76: 0x094b, 0xd77: 0x0967, 0xd78: 0x096f, 0xd79: 0x09ab, 0xd7a: 0x09b7, 0xd7b: 0x0a93, 0xd7c: 0x0a9b, 0xd7d: 0x0ba3, 0xd7e: 0x0bcb, 0xd7f: 0x0bd3, // Block 0x36, offset 0xd80 0xd80: 0x0beb, 0xd81: 0x0c97, 0xd82: 0x0cc7, 0xd83: 0x0ce7, 0xd84: 0x0d57, 0xd85: 0x0e1b, 0xd86: 0x0e37, 0xd87: 0x0e67, 0xd88: 0x0ebb, 0xd89: 0x0edb, 0xd8a: 0x0f4f, 0xd8b: 0x102f, 0xd8c: 0x104b, 0xd8d: 0x1053, 0xd8e: 0x104f, 0xd8f: 0x1057, 0xd90: 0x105b, 0xd91: 0x105f, 0xd92: 0x1073, 0xd93: 0x1077, 0xd94: 0x109b, 0xd95: 0x10af, 0xd96: 0x10cb, 0xd97: 0x112f, 0xd98: 0x1137, 0xd99: 0x113f, 0xd9a: 0x1153, 0xd9b: 0x117b, 0xd9c: 0x11cb, 0xd9d: 0x11ff, 0xd9e: 0x11ff, 0xd9f: 0x1267, 0xda0: 0x130f, 0xda1: 0x1327, 0xda2: 0x135b, 0xda3: 0x135f, 0xda4: 0x13a3, 0xda5: 0x13a7, 0xda6: 0x13ff, 0xda7: 0x1407, 0xda8: 0x14db, 0xda9: 0x151f, 0xdaa: 0x1537, 0xdab: 0x0b9b, 0xdac: 0x171e, 0xdad: 0x11e3, 0xdb0: 0x06df, 0xdb1: 0x07e3, 0xdb2: 0x07a3, 0xdb3: 0x074b, 0xdb4: 0x078b, 0xdb5: 0x07b7, 0xdb6: 0x0847, 0xdb7: 0x0863, 0xdb8: 0x094b, 0xdb9: 0x0937, 0xdba: 0x0947, 0xdbb: 0x0963, 0xdbc: 0x09af, 0xdbd: 0x09bf, 0xdbe: 0x0a03, 0xdbf: 0x0a0f, // Block 0x37, offset 0xdc0 0xdc0: 0x0a2b, 0xdc1: 0x0a3b, 0xdc2: 0x0b23, 0xdc3: 0x0b2b, 0xdc4: 0x0b5b, 0xdc5: 0x0b7b, 0xdc6: 0x0bab, 0xdc7: 0x0bc3, 0xdc8: 0x0bb3, 0xdc9: 0x0bd3, 0xdca: 0x0bc7, 0xdcb: 0x0beb, 0xdcc: 0x0c07, 0xdcd: 0x0c5f, 0xdce: 0x0c6b, 0xdcf: 0x0c73, 0xdd0: 0x0c9b, 0xdd1: 0x0cdf, 0xdd2: 0x0d0f, 0xdd3: 0x0d13, 0xdd4: 0x0d27, 0xdd5: 0x0da7, 0xdd6: 0x0db7, 0xdd7: 0x0e0f, 0xdd8: 0x0e5b, 0xdd9: 0x0e53, 0xdda: 0x0e67, 0xddb: 0x0e83, 0xddc: 0x0ebb, 0xddd: 0x1013, 0xdde: 0x0edf, 0xddf: 0x0f13, 0xde0: 0x0f1f, 0xde1: 0x0f5f, 0xde2: 0x0f7b, 0xde3: 0x0f9f, 0xde4: 0x0fc3, 0xde5: 0x0fc7, 0xde6: 0x0fe3, 0xde7: 0x0fe7, 0xde8: 0x0ff7, 0xde9: 0x100b, 0xdea: 0x1007, 0xdeb: 0x1037, 0xdec: 0x10b3, 0xded: 0x10cb, 0xdee: 0x10e3, 0xdef: 0x111b, 0xdf0: 0x112f, 0xdf1: 0x114b, 0xdf2: 0x117b, 0xdf3: 0x122f, 0xdf4: 0x1257, 0xdf5: 0x12cb, 0xdf6: 0x1313, 0xdf7: 0x131f, 0xdf8: 0x1327, 0xdf9: 0x133f, 0xdfa: 0x1353, 0xdfb: 0x1343, 0xdfc: 0x135b, 0xdfd: 0x1357, 0xdfe: 0x134f, 0xdff: 0x135f, // Block 0x38, offset 0xe00 0xe00: 0x136b, 0xe01: 0x13a7, 0xe02: 0x13e3, 0xe03: 0x1413, 0xe04: 0x144b, 0xe05: 0x146b, 0xe06: 0x14b7, 0xe07: 0x14db, 0xe08: 0x14fb, 0xe09: 0x150f, 0xe0a: 0x151f, 0xe0b: 0x152b, 0xe0c: 0x1537, 0xe0d: 0x158b, 0xe0e: 0x162b, 0xe0f: 0x16b5, 0xe10: 0x16b0, 0xe11: 0x16e2, 0xe12: 0x0607, 0xe13: 0x062f, 0xe14: 0x0633, 0xe15: 0x1764, 0xe16: 0x1791, 0xe17: 0x1809, 0xe18: 0x1617, 0xe19: 0x1627, // Block 0x39, offset 0xe40 0xe40: 0x19d5, 0xe41: 0x19d8, 0xe42: 0x19db, 0xe43: 0x1c08, 0xe44: 0x1c0c, 0xe45: 0x1a5f, 0xe46: 0x1a5f, 0xe53: 0x1d75, 0xe54: 0x1d66, 0xe55: 0x1d6b, 0xe56: 0x1d7a, 0xe57: 0x1d70, 0xe5d: 0x4390, 0xe5e: 0x8115, 0xe5f: 0x4402, 0xe60: 0x022d, 0xe61: 0x0215, 0xe62: 0x021e, 0xe63: 0x0221, 0xe64: 0x0224, 0xe65: 0x0227, 0xe66: 0x022a, 0xe67: 0x0230, 0xe68: 0x0233, 0xe69: 0x0017, 0xe6a: 0x43f0, 0xe6b: 0x43f6, 0xe6c: 0x44f4, 0xe6d: 0x44fc, 0xe6e: 0x4348, 0xe6f: 0x434e, 0xe70: 0x4354, 0xe71: 0x435a, 0xe72: 0x4366, 0xe73: 0x436c, 0xe74: 0x4372, 0xe75: 0x437e, 0xe76: 0x4384, 0xe78: 0x438a, 0xe79: 0x4396, 0xe7a: 0x439c, 0xe7b: 0x43a2, 0xe7c: 0x43ae, 0xe7e: 0x43b4, // Block 0x3a, offset 0xe80 0xe80: 0x43ba, 0xe81: 0x43c0, 0xe83: 0x43c6, 0xe84: 0x43cc, 0xe86: 0x43d8, 0xe87: 0x43de, 0xe88: 0x43e4, 0xe89: 0x43ea, 0xe8a: 0x43fc, 0xe8b: 0x4378, 0xe8c: 0x4360, 0xe8d: 0x43a8, 0xe8e: 0x43d2, 0xe8f: 0x1d7f, 0xe90: 0x0299, 0xe91: 0x0299, 0xe92: 0x02a2, 0xe93: 0x02a2, 0xe94: 0x02a2, 0xe95: 0x02a2, 0xe96: 0x02a5, 0xe97: 0x02a5, 0xe98: 0x02a5, 0xe99: 0x02a5, 0xe9a: 0x02ab, 0xe9b: 0x02ab, 0xe9c: 0x02ab, 0xe9d: 0x02ab, 0xe9e: 0x029f, 0xe9f: 0x029f, 0xea0: 0x029f, 0xea1: 0x029f, 0xea2: 0x02a8, 0xea3: 0x02a8, 0xea4: 0x02a8, 0xea5: 0x02a8, 0xea6: 0x029c, 0xea7: 0x029c, 0xea8: 0x029c, 0xea9: 0x029c, 0xeaa: 0x02cf, 0xeab: 0x02cf, 0xeac: 0x02cf, 0xead: 0x02cf, 0xeae: 0x02d2, 0xeaf: 0x02d2, 0xeb0: 0x02d2, 0xeb1: 0x02d2, 0xeb2: 0x02b1, 0xeb3: 0x02b1, 0xeb4: 0x02b1, 0xeb5: 0x02b1, 0xeb6: 0x02ae, 0xeb7: 0x02ae, 0xeb8: 0x02ae, 0xeb9: 0x02ae, 0xeba: 0x02b4, 0xebb: 0x02b4, 0xebc: 0x02b4, 0xebd: 0x02b4, 0xebe: 0x02b7, 0xebf: 0x02b7, // Block 0x3b, offset 0xec0 0xec0: 0x02b7, 0xec1: 0x02b7, 0xec2: 0x02c0, 0xec3: 0x02c0, 0xec4: 0x02bd, 0xec5: 0x02bd, 0xec6: 0x02c3, 0xec7: 0x02c3, 0xec8: 0x02ba, 0xec9: 0x02ba, 0xeca: 0x02c9, 0xecb: 0x02c9, 0xecc: 0x02c6, 0xecd: 0x02c6, 0xece: 0x02d5, 0xecf: 0x02d5, 0xed0: 0x02d5, 0xed1: 0x02d5, 0xed2: 0x02db, 0xed3: 0x02db, 0xed4: 0x02db, 0xed5: 0x02db, 0xed6: 0x02e1, 0xed7: 0x02e1, 0xed8: 0x02e1, 0xed9: 0x02e1, 0xeda: 0x02de, 0xedb: 0x02de, 0xedc: 0x02de, 0xedd: 0x02de, 0xede: 0x02e4, 0xedf: 0x02e4, 0xee0: 0x02e7, 0xee1: 0x02e7, 0xee2: 0x02e7, 0xee3: 0x02e7, 0xee4: 0x446e, 0xee5: 0x446e, 0xee6: 0x02ed, 0xee7: 0x02ed, 0xee8: 0x02ed, 0xee9: 0x02ed, 0xeea: 0x02ea, 0xeeb: 0x02ea, 0xeec: 0x02ea, 0xeed: 0x02ea, 0xeee: 0x0308, 0xeef: 0x0308, 0xef0: 0x4468, 0xef1: 0x4468, // Block 0x3c, offset 0xf00 0xf13: 0x02d8, 0xf14: 0x02d8, 0xf15: 0x02d8, 0xf16: 0x02d8, 0xf17: 0x02f6, 0xf18: 0x02f6, 0xf19: 0x02f3, 0xf1a: 0x02f3, 0xf1b: 0x02f9, 0xf1c: 0x02f9, 0xf1d: 0x204f, 0xf1e: 0x02ff, 0xf1f: 0x02ff, 0xf20: 0x02f0, 0xf21: 0x02f0, 0xf22: 0x02fc, 0xf23: 0x02fc, 0xf24: 0x0305, 0xf25: 0x0305, 0xf26: 0x0305, 0xf27: 0x0305, 0xf28: 0x028d, 0xf29: 0x028d, 0xf2a: 0x25aa, 0xf2b: 0x25aa, 0xf2c: 0x261a, 0xf2d: 0x261a, 0xf2e: 0x25e9, 0xf2f: 0x25e9, 0xf30: 0x2605, 0xf31: 0x2605, 0xf32: 0x25fe, 0xf33: 0x25fe, 0xf34: 0x260c, 0xf35: 0x260c, 0xf36: 0x2613, 0xf37: 0x2613, 0xf38: 0x2613, 0xf39: 0x25f0, 0xf3a: 0x25f0, 0xf3b: 0x25f0, 0xf3c: 0x0302, 0xf3d: 0x0302, 0xf3e: 0x0302, 0xf3f: 0x0302, // Block 0x3d, offset 0xf40 0xf40: 0x25b1, 0xf41: 0x25b8, 0xf42: 0x25d4, 0xf43: 0x25f0, 0xf44: 0x25f7, 0xf45: 0x1d89, 0xf46: 0x1d8e, 0xf47: 0x1d93, 0xf48: 0x1da2, 0xf49: 0x1db1, 0xf4a: 0x1db6, 0xf4b: 0x1dbb, 0xf4c: 0x1dc0, 0xf4d: 0x1dc5, 0xf4e: 0x1dd4, 0xf4f: 0x1de3, 0xf50: 0x1de8, 0xf51: 0x1ded, 0xf52: 0x1dfc, 0xf53: 0x1e0b, 0xf54: 0x1e10, 0xf55: 0x1e15, 0xf56: 0x1e1a, 0xf57: 0x1e29, 0xf58: 0x1e2e, 0xf59: 0x1e3d, 0xf5a: 0x1e42, 0xf5b: 0x1e47, 0xf5c: 0x1e56, 0xf5d: 0x1e5b, 0xf5e: 0x1e60, 0xf5f: 0x1e6a, 0xf60: 0x1ea6, 0xf61: 0x1eb5, 0xf62: 0x1ec4, 0xf63: 0x1ec9, 0xf64: 0x1ece, 0xf65: 0x1ed8, 0xf66: 0x1ee7, 0xf67: 0x1eec, 0xf68: 0x1efb, 0xf69: 0x1f00, 0xf6a: 0x1f05, 0xf6b: 0x1f14, 0xf6c: 0x1f19, 0xf6d: 0x1f28, 0xf6e: 0x1f2d, 0xf6f: 0x1f32, 0xf70: 0x1f37, 0xf71: 0x1f3c, 0xf72: 0x1f41, 0xf73: 0x1f46, 0xf74: 0x1f4b, 0xf75: 0x1f50, 0xf76: 0x1f55, 0xf77: 0x1f5a, 0xf78: 0x1f5f, 0xf79: 0x1f64, 0xf7a: 0x1f69, 0xf7b: 0x1f6e, 0xf7c: 0x1f73, 0xf7d: 0x1f78, 0xf7e: 0x1f7d, 0xf7f: 0x1f87, // Block 0x3e, offset 0xf80 0xf80: 0x1f8c, 0xf81: 0x1f91, 0xf82: 0x1f96, 0xf83: 0x1fa0, 0xf84: 0x1fa5, 0xf85: 0x1faf, 0xf86: 0x1fb4, 0xf87: 0x1fb9, 0xf88: 0x1fbe, 0xf89: 0x1fc3, 0xf8a: 0x1fc8, 0xf8b: 0x1fcd, 0xf8c: 0x1fd2, 0xf8d: 0x1fd7, 0xf8e: 0x1fe6, 0xf8f: 0x1ff5, 0xf90: 0x1ffa, 0xf91: 0x1fff, 0xf92: 0x2004, 0xf93: 0x2009, 0xf94: 0x200e, 0xf95: 0x2018, 0xf96: 0x201d, 0xf97: 0x2022, 0xf98: 0x2031, 0xf99: 0x2040, 0xf9a: 0x2045, 0xf9b: 0x4420, 0xf9c: 0x4426, 0xf9d: 0x445c, 0xf9e: 0x44b3, 0xf9f: 0x44ba, 0xfa0: 0x44c1, 0xfa1: 0x44c8, 0xfa2: 0x44cf, 0xfa3: 0x44d6, 0xfa4: 0x25c6, 0xfa5: 0x25cd, 0xfa6: 0x25d4, 0xfa7: 0x25db, 0xfa8: 0x25f0, 0xfa9: 0x25f7, 0xfaa: 0x1d98, 0xfab: 0x1d9d, 0xfac: 0x1da2, 0xfad: 0x1da7, 0xfae: 0x1db1, 0xfaf: 0x1db6, 0xfb0: 0x1dca, 0xfb1: 0x1dcf, 0xfb2: 0x1dd4, 0xfb3: 0x1dd9, 0xfb4: 0x1de3, 0xfb5: 0x1de8, 0xfb6: 0x1df2, 0xfb7: 0x1df7, 0xfb8: 0x1dfc, 0xfb9: 0x1e01, 0xfba: 0x1e0b, 0xfbb: 0x1e10, 0xfbc: 0x1f3c, 0xfbd: 0x1f41, 0xfbe: 0x1f50, 0xfbf: 0x1f55, // Block 0x3f, offset 0xfc0 0xfc0: 0x1f5a, 0xfc1: 0x1f6e, 0xfc2: 0x1f73, 0xfc3: 0x1f78, 0xfc4: 0x1f7d, 0xfc5: 0x1f96, 0xfc6: 0x1fa0, 0xfc7: 0x1fa5, 0xfc8: 0x1faa, 0xfc9: 0x1fbe, 0xfca: 0x1fdc, 0xfcb: 0x1fe1, 0xfcc: 0x1fe6, 0xfcd: 0x1feb, 0xfce: 0x1ff5, 0xfcf: 0x1ffa, 0xfd0: 0x445c, 0xfd1: 0x2027, 0xfd2: 0x202c, 0xfd3: 0x2031, 0xfd4: 0x2036, 0xfd5: 0x2040, 0xfd6: 0x2045, 0xfd7: 0x25b1, 0xfd8: 0x25b8, 0xfd9: 0x25bf, 0xfda: 0x25d4, 0xfdb: 0x25e2, 0xfdc: 0x1d89, 0xfdd: 0x1d8e, 0xfde: 0x1d93, 0xfdf: 0x1da2, 0xfe0: 0x1dac, 0xfe1: 0x1dbb, 0xfe2: 0x1dc0, 0xfe3: 0x1dc5, 0xfe4: 0x1dd4, 0xfe5: 0x1dde, 0xfe6: 0x1dfc, 0xfe7: 0x1e15, 0xfe8: 0x1e1a, 0xfe9: 0x1e29, 0xfea: 0x1e2e, 0xfeb: 0x1e3d, 0xfec: 0x1e47, 0xfed: 0x1e56, 0xfee: 0x1e5b, 0xfef: 0x1e60, 0xff0: 0x1e6a, 0xff1: 0x1ea6, 0xff2: 0x1eab, 0xff3: 0x1eb5, 0xff4: 0x1ec4, 0xff5: 0x1ec9, 0xff6: 0x1ece, 0xff7: 0x1ed8, 0xff8: 0x1ee7, 0xff9: 0x1efb, 0xffa: 0x1f00, 0xffb: 0x1f05, 0xffc: 0x1f14, 0xffd: 0x1f19, 0xffe: 0x1f28, 0xfff: 0x1f2d, // Block 0x40, offset 0x1000 0x1000: 0x1f32, 0x1001: 0x1f37, 0x1002: 0x1f46, 0x1003: 0x1f4b, 0x1004: 0x1f5f, 0x1005: 0x1f64, 0x1006: 0x1f69, 0x1007: 0x1f6e, 0x1008: 0x1f73, 0x1009: 0x1f87, 0x100a: 0x1f8c, 0x100b: 0x1f91, 0x100c: 0x1f96, 0x100d: 0x1f9b, 0x100e: 0x1faf, 0x100f: 0x1fb4, 0x1010: 0x1fb9, 0x1011: 0x1fbe, 0x1012: 0x1fcd, 0x1013: 0x1fd2, 0x1014: 0x1fd7, 0x1015: 0x1fe6, 0x1016: 0x1ff0, 0x1017: 0x1fff, 0x1018: 0x2004, 0x1019: 0x4450, 0x101a: 0x2018, 0x101b: 0x201d, 0x101c: 0x2022, 0x101d: 0x2031, 0x101e: 0x203b, 0x101f: 0x25d4, 0x1020: 0x25e2, 0x1021: 0x1da2, 0x1022: 0x1dac, 0x1023: 0x1dd4, 0x1024: 0x1dde, 0x1025: 0x1dfc, 0x1026: 0x1e06, 0x1027: 0x1e6a, 0x1028: 0x1e6f, 0x1029: 0x1e92, 0x102a: 0x1e97, 0x102b: 0x1f6e, 0x102c: 0x1f73, 0x102d: 0x1f96, 0x102e: 0x1fe6, 0x102f: 0x1ff0, 0x1030: 0x2031, 0x1031: 0x203b, 0x1032: 0x4504, 0x1033: 0x450c, 0x1034: 0x4514, 0x1035: 0x1ef1, 0x1036: 0x1ef6, 0x1037: 0x1f0a, 0x1038: 0x1f0f, 0x1039: 0x1f1e, 0x103a: 0x1f23, 0x103b: 0x1e74, 0x103c: 0x1e79, 0x103d: 0x1e9c, 0x103e: 0x1ea1, 0x103f: 0x1e33, // Block 0x41, offset 0x1040 0x1040: 0x1e38, 0x1041: 0x1e1f, 0x1042: 0x1e24, 0x1043: 0x1e4c, 0x1044: 0x1e51, 0x1045: 0x1eba, 0x1046: 0x1ebf, 0x1047: 0x1edd, 0x1048: 0x1ee2, 0x1049: 0x1e7e, 0x104a: 0x1e83, 0x104b: 0x1e88, 0x104c: 0x1e92, 0x104d: 0x1e8d, 0x104e: 0x1e65, 0x104f: 0x1eb0, 0x1050: 0x1ed3, 0x1051: 0x1ef1, 0x1052: 0x1ef6, 0x1053: 0x1f0a, 0x1054: 0x1f0f, 0x1055: 0x1f1e, 0x1056: 0x1f23, 0x1057: 0x1e74, 0x1058: 0x1e79, 0x1059: 0x1e9c, 0x105a: 0x1ea1, 0x105b: 0x1e33, 0x105c: 0x1e38, 0x105d: 0x1e1f, 0x105e: 0x1e24, 0x105f: 0x1e4c, 0x1060: 0x1e51, 0x1061: 0x1eba, 0x1062: 0x1ebf, 0x1063: 0x1edd, 0x1064: 0x1ee2, 0x1065: 0x1e7e, 0x1066: 0x1e83, 0x1067: 0x1e88, 0x1068: 0x1e92, 0x1069: 0x1e8d, 0x106a: 0x1e65, 0x106b: 0x1eb0, 0x106c: 0x1ed3, 0x106d: 0x1e7e, 0x106e: 0x1e83, 0x106f: 0x1e88, 0x1070: 0x1e92, 0x1071: 0x1e6f, 0x1072: 0x1e97, 0x1073: 0x1eec, 0x1074: 0x1e56, 0x1075: 0x1e5b, 0x1076: 0x1e60, 0x1077: 0x1e7e, 0x1078: 0x1e83, 0x1079: 0x1e88, 0x107a: 0x1eec, 0x107b: 0x1efb, 0x107c: 0x4408, 0x107d: 0x4408, // Block 0x42, offset 0x1080 0x1090: 0x2311, 0x1091: 0x2326, 0x1092: 0x2326, 0x1093: 0x232d, 0x1094: 0x2334, 0x1095: 0x2349, 0x1096: 0x2350, 0x1097: 0x2357, 0x1098: 0x237a, 0x1099: 0x237a, 0x109a: 0x239d, 0x109b: 0x2396, 0x109c: 0x23b2, 0x109d: 0x23a4, 0x109e: 0x23ab, 0x109f: 0x23ce, 0x10a0: 0x23ce, 0x10a1: 0x23c7, 0x10a2: 0x23d5, 0x10a3: 0x23d5, 0x10a4: 0x23ff, 0x10a5: 0x23ff, 0x10a6: 0x241b, 0x10a7: 0x23e3, 0x10a8: 0x23e3, 0x10a9: 0x23dc, 0x10aa: 0x23f1, 0x10ab: 0x23f1, 0x10ac: 0x23f8, 0x10ad: 0x23f8, 0x10ae: 0x2422, 0x10af: 0x2430, 0x10b0: 0x2430, 0x10b1: 0x2437, 0x10b2: 0x2437, 0x10b3: 0x243e, 0x10b4: 0x2445, 0x10b5: 0x244c, 0x10b6: 0x2453, 0x10b7: 0x2453, 0x10b8: 0x245a, 0x10b9: 0x2468, 0x10ba: 0x2476, 0x10bb: 0x246f, 0x10bc: 0x247d, 0x10bd: 0x247d, 0x10be: 0x2492, 0x10bf: 0x2499, // Block 0x43, offset 0x10c0 0x10c0: 0x24ca, 0x10c1: 0x24d8, 0x10c2: 0x24d1, 0x10c3: 0x24b5, 0x10c4: 0x24b5, 0x10c5: 0x24df, 0x10c6: 0x24df, 0x10c7: 0x24e6, 0x10c8: 0x24e6, 0x10c9: 0x2510, 0x10ca: 0x2517, 0x10cb: 0x251e, 0x10cc: 0x24f4, 0x10cd: 0x2502, 0x10ce: 0x2525, 0x10cf: 0x252c, 0x10d2: 0x24fb, 0x10d3: 0x2580, 0x10d4: 0x2587, 0x10d5: 0x255d, 0x10d6: 0x2564, 0x10d7: 0x2548, 0x10d8: 0x2548, 0x10d9: 0x254f, 0x10da: 0x2579, 0x10db: 0x2572, 0x10dc: 0x259c, 0x10dd: 0x259c, 0x10de: 0x230a, 0x10df: 0x231f, 0x10e0: 0x2318, 0x10e1: 0x2342, 0x10e2: 0x233b, 0x10e3: 0x2365, 0x10e4: 0x235e, 0x10e5: 0x2388, 0x10e6: 0x236c, 0x10e7: 0x2381, 0x10e8: 0x23b9, 0x10e9: 0x2406, 0x10ea: 0x23ea, 0x10eb: 0x2429, 0x10ec: 0x24c3, 0x10ed: 0x24ed, 0x10ee: 0x2595, 0x10ef: 0x258e, 0x10f0: 0x25a3, 0x10f1: 0x253a, 0x10f2: 0x24a0, 0x10f3: 0x256b, 0x10f4: 0x2492, 0x10f5: 0x24ca, 0x10f6: 0x2461, 0x10f7: 0x24ae, 0x10f8: 0x2541, 0x10f9: 0x2533, 0x10fa: 0x24bc, 0x10fb: 0x24a7, 0x10fc: 0x24bc, 0x10fd: 0x2541, 0x10fe: 0x2373, 0x10ff: 0x238f, // Block 0x44, offset 0x1100 0x1100: 0x2509, 0x1101: 0x2484, 0x1102: 0x2303, 0x1103: 0x24a7, 0x1104: 0x244c, 0x1105: 0x241b, 0x1106: 0x23c0, 0x1107: 0x2556, 0x1130: 0x2414, 0x1131: 0x248b, 0x1132: 0x27bf, 0x1133: 0x27b6, 0x1134: 0x27ec, 0x1135: 0x27da, 0x1136: 0x27c8, 0x1137: 0x27e3, 0x1138: 0x27f5, 0x1139: 0x240d, 0x113a: 0x2c7c, 0x113b: 0x2afc, 0x113c: 0x27d1, // Block 0x45, offset 0x1140 0x1150: 0x0019, 0x1151: 0x0483, 0x1152: 0x0487, 0x1153: 0x0035, 0x1154: 0x0037, 0x1155: 0x0003, 0x1156: 0x003f, 0x1157: 0x04bf, 0x1158: 0x04c3, 0x1159: 0x1b5c, 0x1160: 0x8132, 0x1161: 0x8132, 0x1162: 0x8132, 0x1163: 0x8132, 0x1164: 0x8132, 0x1165: 0x8132, 0x1166: 0x8132, 0x1167: 0x812d, 0x1168: 0x812d, 0x1169: 0x812d, 0x116a: 0x812d, 0x116b: 0x812d, 0x116c: 0x812d, 0x116d: 0x812d, 0x116e: 0x8132, 0x116f: 0x8132, 0x1170: 0x1873, 0x1171: 0x0443, 0x1172: 0x043f, 0x1173: 0x007f, 0x1174: 0x007f, 0x1175: 0x0011, 0x1176: 0x0013, 0x1177: 0x00b7, 0x1178: 0x00bb, 0x1179: 0x04b7, 0x117a: 0x04bb, 0x117b: 0x04ab, 0x117c: 0x04af, 0x117d: 0x0493, 0x117e: 0x0497, 0x117f: 0x048b, // Block 0x46, offset 0x1180 0x1180: 0x048f, 0x1181: 0x049b, 0x1182: 0x049f, 0x1183: 0x04a3, 0x1184: 0x04a7, 0x1187: 0x0077, 0x1188: 0x007b, 0x1189: 0x4269, 0x118a: 0x4269, 0x118b: 0x4269, 0x118c: 0x4269, 0x118d: 0x007f, 0x118e: 0x007f, 0x118f: 0x007f, 0x1190: 0x0019, 0x1191: 0x0483, 0x1192: 0x001d, 0x1194: 0x0037, 0x1195: 0x0035, 0x1196: 0x003f, 0x1197: 0x0003, 0x1198: 0x0443, 0x1199: 0x0011, 0x119a: 0x0013, 0x119b: 0x00b7, 0x119c: 0x00bb, 0x119d: 0x04b7, 0x119e: 0x04bb, 0x119f: 0x0007, 0x11a0: 0x000d, 0x11a1: 0x0015, 0x11a2: 0x0017, 0x11a3: 0x001b, 0x11a4: 0x0039, 0x11a5: 0x003d, 0x11a6: 0x003b, 0x11a8: 0x0079, 0x11a9: 0x0009, 0x11aa: 0x000b, 0x11ab: 0x0041, 0x11b0: 0x42aa, 0x11b1: 0x442c, 0x11b2: 0x42af, 0x11b4: 0x42b4, 0x11b6: 0x42b9, 0x11b7: 0x4432, 0x11b8: 0x42be, 0x11b9: 0x4438, 0x11ba: 0x42c3, 0x11bb: 0x443e, 0x11bc: 0x42c8, 0x11bd: 0x4444, 0x11be: 0x42cd, 0x11bf: 0x444a, // Block 0x47, offset 0x11c0 0x11c0: 0x0236, 0x11c1: 0x440e, 0x11c2: 0x440e, 0x11c3: 0x4414, 0x11c4: 0x4414, 0x11c5: 0x4456, 0x11c6: 0x4456, 0x11c7: 0x441a, 0x11c8: 0x441a, 0x11c9: 0x4462, 0x11ca: 0x4462, 0x11cb: 0x4462, 0x11cc: 0x4462, 0x11cd: 0x0239, 0x11ce: 0x0239, 0x11cf: 0x023c, 0x11d0: 0x023c, 0x11d1: 0x023c, 0x11d2: 0x023c, 0x11d3: 0x023f, 0x11d4: 0x023f, 0x11d5: 0x0242, 0x11d6: 0x0242, 0x11d7: 0x0242, 0x11d8: 0x0242, 0x11d9: 0x0245, 0x11da: 0x0245, 0x11db: 0x0245, 0x11dc: 0x0245, 0x11dd: 0x0248, 0x11de: 0x0248, 0x11df: 0x0248, 0x11e0: 0x0248, 0x11e1: 0x024b, 0x11e2: 0x024b, 0x11e3: 0x024b, 0x11e4: 0x024b, 0x11e5: 0x024e, 0x11e6: 0x024e, 0x11e7: 0x024e, 0x11e8: 0x024e, 0x11e9: 0x0251, 0x11ea: 0x0251, 0x11eb: 0x0254, 0x11ec: 0x0254, 0x11ed: 0x0257, 0x11ee: 0x0257, 0x11ef: 0x025a, 0x11f0: 0x025a, 0x11f1: 0x025d, 0x11f2: 0x025d, 0x11f3: 0x025d, 0x11f4: 0x025d, 0x11f5: 0x0260, 0x11f6: 0x0260, 0x11f7: 0x0260, 0x11f8: 0x0260, 0x11f9: 0x0263, 0x11fa: 0x0263, 0x11fb: 0x0263, 0x11fc: 0x0263, 0x11fd: 0x0266, 0x11fe: 0x0266, 0x11ff: 0x0266, // Block 0x48, offset 0x1200 0x1200: 0x0266, 0x1201: 0x0269, 0x1202: 0x0269, 0x1203: 0x0269, 0x1204: 0x0269, 0x1205: 0x026c, 0x1206: 0x026c, 0x1207: 0x026c, 0x1208: 0x026c, 0x1209: 0x026f, 0x120a: 0x026f, 0x120b: 0x026f, 0x120c: 0x026f, 0x120d: 0x0272, 0x120e: 0x0272, 0x120f: 0x0272, 0x1210: 0x0272, 0x1211: 0x0275, 0x1212: 0x0275, 0x1213: 0x0275, 0x1214: 0x0275, 0x1215: 0x0278, 0x1216: 0x0278, 0x1217: 0x0278, 0x1218: 0x0278, 0x1219: 0x027b, 0x121a: 0x027b, 0x121b: 0x027b, 0x121c: 0x027b, 0x121d: 0x027e, 0x121e: 0x027e, 0x121f: 0x027e, 0x1220: 0x027e, 0x1221: 0x0281, 0x1222: 0x0281, 0x1223: 0x0281, 0x1224: 0x0281, 0x1225: 0x0284, 0x1226: 0x0284, 0x1227: 0x0284, 0x1228: 0x0284, 0x1229: 0x0287, 0x122a: 0x0287, 0x122b: 0x0287, 0x122c: 0x0287, 0x122d: 0x028a, 0x122e: 0x028a, 0x122f: 0x028d, 0x1230: 0x028d, 0x1231: 0x0290, 0x1232: 0x0290, 0x1233: 0x0290, 0x1234: 0x0290, 0x1235: 0x2e00, 0x1236: 0x2e00, 0x1237: 0x2e08, 0x1238: 0x2e08, 0x1239: 0x2e10, 0x123a: 0x2e10, 0x123b: 0x1f82, 0x123c: 0x1f82, // Block 0x49, offset 0x1240 0x1240: 0x0081, 0x1241: 0x0083, 0x1242: 0x0085, 0x1243: 0x0087, 0x1244: 0x0089, 0x1245: 0x008b, 0x1246: 0x008d, 0x1247: 0x008f, 0x1248: 0x0091, 0x1249: 0x0093, 0x124a: 0x0095, 0x124b: 0x0097, 0x124c: 0x0099, 0x124d: 0x009b, 0x124e: 0x009d, 0x124f: 0x009f, 0x1250: 0x00a1, 0x1251: 0x00a3, 0x1252: 0x00a5, 0x1253: 0x00a7, 0x1254: 0x00a9, 0x1255: 0x00ab, 0x1256: 0x00ad, 0x1257: 0x00af, 0x1258: 0x00b1, 0x1259: 0x00b3, 0x125a: 0x00b5, 0x125b: 0x00b7, 0x125c: 0x00b9, 0x125d: 0x00bb, 0x125e: 0x00bd, 0x125f: 0x0477, 0x1260: 0x047b, 0x1261: 0x0487, 0x1262: 0x049b, 0x1263: 0x049f, 0x1264: 0x0483, 0x1265: 0x05ab, 0x1266: 0x05a3, 0x1267: 0x04c7, 0x1268: 0x04cf, 0x1269: 0x04d7, 0x126a: 0x04df, 0x126b: 0x04e7, 0x126c: 0x056b, 0x126d: 0x0573, 0x126e: 0x057b, 0x126f: 0x051f, 0x1270: 0x05af, 0x1271: 0x04cb, 0x1272: 0x04d3, 0x1273: 0x04db, 0x1274: 0x04e3, 0x1275: 0x04eb, 0x1276: 0x04ef, 0x1277: 0x04f3, 0x1278: 0x04f7, 0x1279: 0x04fb, 0x127a: 0x04ff, 0x127b: 0x0503, 0x127c: 0x0507, 0x127d: 0x050b, 0x127e: 0x050f, 0x127f: 0x0513, // Block 0x4a, offset 0x1280 0x1280: 0x0517, 0x1281: 0x051b, 0x1282: 0x0523, 0x1283: 0x0527, 0x1284: 0x052b, 0x1285: 0x052f, 0x1286: 0x0533, 0x1287: 0x0537, 0x1288: 0x053b, 0x1289: 0x053f, 0x128a: 0x0543, 0x128b: 0x0547, 0x128c: 0x054b, 0x128d: 0x054f, 0x128e: 0x0553, 0x128f: 0x0557, 0x1290: 0x055b, 0x1291: 0x055f, 0x1292: 0x0563, 0x1293: 0x0567, 0x1294: 0x056f, 0x1295: 0x0577, 0x1296: 0x057f, 0x1297: 0x0583, 0x1298: 0x0587, 0x1299: 0x058b, 0x129a: 0x058f, 0x129b: 0x0593, 0x129c: 0x0597, 0x129d: 0x05a7, 0x129e: 0x4a78, 0x129f: 0x4a7e, 0x12a0: 0x03c3, 0x12a1: 0x0313, 0x12a2: 0x0317, 0x12a3: 0x4a3b, 0x12a4: 0x031b, 0x12a5: 0x4a41, 0x12a6: 0x4a47, 0x12a7: 0x031f, 0x12a8: 0x0323, 0x12a9: 0x0327, 0x12aa: 0x4a4d, 0x12ab: 0x4a53, 0x12ac: 0x4a59, 0x12ad: 0x4a5f, 0x12ae: 0x4a65, 0x12af: 0x4a6b, 0x12b0: 0x0367, 0x12b1: 0x032b, 0x12b2: 0x032f, 0x12b3: 0x0333, 0x12b4: 0x037b, 0x12b5: 0x0337, 0x12b6: 0x033b, 0x12b7: 0x033f, 0x12b8: 0x0343, 0x12b9: 0x0347, 0x12ba: 0x034b, 0x12bb: 0x034f, 0x12bc: 0x0353, 0x12bd: 0x0357, 0x12be: 0x035b, // Block 0x4b, offset 0x12c0 0x12c2: 0x49bd, 0x12c3: 0x49c3, 0x12c4: 0x49c9, 0x12c5: 0x49cf, 0x12c6: 0x49d5, 0x12c7: 0x49db, 0x12ca: 0x49e1, 0x12cb: 0x49e7, 0x12cc: 0x49ed, 0x12cd: 0x49f3, 0x12ce: 0x49f9, 0x12cf: 0x49ff, 0x12d2: 0x4a05, 0x12d3: 0x4a0b, 0x12d4: 0x4a11, 0x12d5: 0x4a17, 0x12d6: 0x4a1d, 0x12d7: 0x4a23, 0x12da: 0x4a29, 0x12db: 0x4a2f, 0x12dc: 0x4a35, 0x12e0: 0x00bf, 0x12e1: 0x00c2, 0x12e2: 0x00cb, 0x12e3: 0x4264, 0x12e4: 0x00c8, 0x12e5: 0x00c5, 0x12e6: 0x0447, 0x12e8: 0x046b, 0x12e9: 0x044b, 0x12ea: 0x044f, 0x12eb: 0x0453, 0x12ec: 0x0457, 0x12ed: 0x046f, 0x12ee: 0x0473, // Block 0x4c, offset 0x1300 0x1300: 0x0063, 0x1301: 0x0065, 0x1302: 0x0067, 0x1303: 0x0069, 0x1304: 0x006b, 0x1305: 0x006d, 0x1306: 0x006f, 0x1307: 0x0071, 0x1308: 0x0073, 0x1309: 0x0075, 0x130a: 0x0083, 0x130b: 0x0085, 0x130c: 0x0087, 0x130d: 0x0089, 0x130e: 0x008b, 0x130f: 0x008d, 0x1310: 0x008f, 0x1311: 0x0091, 0x1312: 0x0093, 0x1313: 0x0095, 0x1314: 0x0097, 0x1315: 0x0099, 0x1316: 0x009b, 0x1317: 0x009d, 0x1318: 0x009f, 0x1319: 0x00a1, 0x131a: 0x00a3, 0x131b: 0x00a5, 0x131c: 0x00a7, 0x131d: 0x00a9, 0x131e: 0x00ab, 0x131f: 0x00ad, 0x1320: 0x00af, 0x1321: 0x00b1, 0x1322: 0x00b3, 0x1323: 0x00b5, 0x1324: 0x00dd, 0x1325: 0x00f2, 0x1328: 0x0173, 0x1329: 0x0176, 0x132a: 0x0179, 0x132b: 0x017c, 0x132c: 0x017f, 0x132d: 0x0182, 0x132e: 0x0185, 0x132f: 0x0188, 0x1330: 0x018b, 0x1331: 0x018e, 0x1332: 0x0191, 0x1333: 0x0194, 0x1334: 0x0197, 0x1335: 0x019a, 0x1336: 0x019d, 0x1337: 0x01a0, 0x1338: 0x01a3, 0x1339: 0x0188, 0x133a: 0x01a6, 0x133b: 0x01a9, 0x133c: 0x01ac, 0x133d: 0x01af, 0x133e: 0x01b2, 0x133f: 0x01b5, // Block 0x4d, offset 0x1340 0x1340: 0x01fd, 0x1341: 0x0200, 0x1342: 0x0203, 0x1343: 0x045b, 0x1344: 0x01c7, 0x1345: 0x01d0, 0x1346: 0x01d6, 0x1347: 0x01fa, 0x1348: 0x01eb, 0x1349: 0x01e8, 0x134a: 0x0206, 0x134b: 0x0209, 0x134e: 0x0021, 0x134f: 0x0023, 0x1350: 0x0025, 0x1351: 0x0027, 0x1352: 0x0029, 0x1353: 0x002b, 0x1354: 0x002d, 0x1355: 0x002f, 0x1356: 0x0031, 0x1357: 0x0033, 0x1358: 0x0021, 0x1359: 0x0023, 0x135a: 0x0025, 0x135b: 0x0027, 0x135c: 0x0029, 0x135d: 0x002b, 0x135e: 0x002d, 0x135f: 0x002f, 0x1360: 0x0031, 0x1361: 0x0033, 0x1362: 0x0021, 0x1363: 0x0023, 0x1364: 0x0025, 0x1365: 0x0027, 0x1366: 0x0029, 0x1367: 0x002b, 0x1368: 0x002d, 0x1369: 0x002f, 0x136a: 0x0031, 0x136b: 0x0033, 0x136c: 0x0021, 0x136d: 0x0023, 0x136e: 0x0025, 0x136f: 0x0027, 0x1370: 0x0029, 0x1371: 0x002b, 0x1372: 0x002d, 0x1373: 0x002f, 0x1374: 0x0031, 0x1375: 0x0033, 0x1376: 0x0021, 0x1377: 0x0023, 0x1378: 0x0025, 0x1379: 0x0027, 0x137a: 0x0029, 0x137b: 0x002b, 0x137c: 0x002d, 0x137d: 0x002f, 0x137e: 0x0031, 0x137f: 0x0033, // Block 0x4e, offset 0x1380 0x1380: 0x0239, 0x1381: 0x023c, 0x1382: 0x0248, 0x1383: 0x0251, 0x1385: 0x028a, 0x1386: 0x025a, 0x1387: 0x024b, 0x1388: 0x0269, 0x1389: 0x0290, 0x138a: 0x027b, 0x138b: 0x027e, 0x138c: 0x0281, 0x138d: 0x0284, 0x138e: 0x025d, 0x138f: 0x026f, 0x1390: 0x0275, 0x1391: 0x0263, 0x1392: 0x0278, 0x1393: 0x0257, 0x1394: 0x0260, 0x1395: 0x0242, 0x1396: 0x0245, 0x1397: 0x024e, 0x1398: 0x0254, 0x1399: 0x0266, 0x139a: 0x026c, 0x139b: 0x0272, 0x139c: 0x0293, 0x139d: 0x02e4, 0x139e: 0x02cc, 0x139f: 0x0296, 0x13a1: 0x023c, 0x13a2: 0x0248, 0x13a4: 0x0287, 0x13a7: 0x024b, 0x13a9: 0x0290, 0x13aa: 0x027b, 0x13ab: 0x027e, 0x13ac: 0x0281, 0x13ad: 0x0284, 0x13ae: 0x025d, 0x13af: 0x026f, 0x13b0: 0x0275, 0x13b1: 0x0263, 0x13b2: 0x0278, 0x13b4: 0x0260, 0x13b5: 0x0242, 0x13b6: 0x0245, 0x13b7: 0x024e, 0x13b9: 0x0266, 0x13bb: 0x0272, // Block 0x4f, offset 0x13c0 0x13c2: 0x0248, 0x13c7: 0x024b, 0x13c9: 0x0290, 0x13cb: 0x027e, 0x13cd: 0x0284, 0x13ce: 0x025d, 0x13cf: 0x026f, 0x13d1: 0x0263, 0x13d2: 0x0278, 0x13d4: 0x0260, 0x13d7: 0x024e, 0x13d9: 0x0266, 0x13db: 0x0272, 0x13dd: 0x02e4, 0x13df: 0x0296, 0x13e1: 0x023c, 0x13e2: 0x0248, 0x13e4: 0x0287, 0x13e7: 0x024b, 0x13e8: 0x0269, 0x13e9: 0x0290, 0x13ea: 0x027b, 0x13ec: 0x0281, 0x13ed: 0x0284, 0x13ee: 0x025d, 0x13ef: 0x026f, 0x13f0: 0x0275, 0x13f1: 0x0263, 0x13f2: 0x0278, 0x13f4: 0x0260, 0x13f5: 0x0242, 0x13f6: 0x0245, 0x13f7: 0x024e, 0x13f9: 0x0266, 0x13fa: 0x026c, 0x13fb: 0x0272, 0x13fc: 0x0293, 0x13fe: 0x02cc, // Block 0x50, offset 0x1400 0x1400: 0x0239, 0x1401: 0x023c, 0x1402: 0x0248, 0x1403: 0x0251, 0x1404: 0x0287, 0x1405: 0x028a, 0x1406: 0x025a, 0x1407: 0x024b, 0x1408: 0x0269, 0x1409: 0x0290, 0x140b: 0x027e, 0x140c: 0x0281, 0x140d: 0x0284, 0x140e: 0x025d, 0x140f: 0x026f, 0x1410: 0x0275, 0x1411: 0x0263, 0x1412: 0x0278, 0x1413: 0x0257, 0x1414: 0x0260, 0x1415: 0x0242, 0x1416: 0x0245, 0x1417: 0x024e, 0x1418: 0x0254, 0x1419: 0x0266, 0x141a: 0x026c, 0x141b: 0x0272, 0x1421: 0x023c, 0x1422: 0x0248, 0x1423: 0x0251, 0x1425: 0x028a, 0x1426: 0x025a, 0x1427: 0x024b, 0x1428: 0x0269, 0x1429: 0x0290, 0x142b: 0x027e, 0x142c: 0x0281, 0x142d: 0x0284, 0x142e: 0x025d, 0x142f: 0x026f, 0x1430: 0x0275, 0x1431: 0x0263, 0x1432: 0x0278, 0x1433: 0x0257, 0x1434: 0x0260, 0x1435: 0x0242, 0x1436: 0x0245, 0x1437: 0x024e, 0x1438: 0x0254, 0x1439: 0x0266, 0x143a: 0x026c, 0x143b: 0x0272, // Block 0x51, offset 0x1440 0x1440: 0x1879, 0x1441: 0x1876, 0x1442: 0x187c, 0x1443: 0x18a0, 0x1444: 0x18c4, 0x1445: 0x18e8, 0x1446: 0x190c, 0x1447: 0x1915, 0x1448: 0x191b, 0x1449: 0x1921, 0x144a: 0x1927, 0x1450: 0x1a8c, 0x1451: 0x1a90, 0x1452: 0x1a94, 0x1453: 0x1a98, 0x1454: 0x1a9c, 0x1455: 0x1aa0, 0x1456: 0x1aa4, 0x1457: 0x1aa8, 0x1458: 0x1aac, 0x1459: 0x1ab0, 0x145a: 0x1ab4, 0x145b: 0x1ab8, 0x145c: 0x1abc, 0x145d: 0x1ac0, 0x145e: 0x1ac4, 0x145f: 0x1ac8, 0x1460: 0x1acc, 0x1461: 0x1ad0, 0x1462: 0x1ad4, 0x1463: 0x1ad8, 0x1464: 0x1adc, 0x1465: 0x1ae0, 0x1466: 0x1ae4, 0x1467: 0x1ae8, 0x1468: 0x1aec, 0x1469: 0x1af0, 0x146a: 0x271e, 0x146b: 0x0047, 0x146c: 0x0065, 0x146d: 0x193c, 0x146e: 0x19b1, 0x1470: 0x0043, 0x1471: 0x0045, 0x1472: 0x0047, 0x1473: 0x0049, 0x1474: 0x004b, 0x1475: 0x004d, 0x1476: 0x004f, 0x1477: 0x0051, 0x1478: 0x0053, 0x1479: 0x0055, 0x147a: 0x0057, 0x147b: 0x0059, 0x147c: 0x005b, 0x147d: 0x005d, 0x147e: 0x005f, 0x147f: 0x0061, // Block 0x52, offset 0x1480 0x1480: 0x26ad, 0x1481: 0x26c2, 0x1482: 0x0503, 0x1490: 0x0c0f, 0x1491: 0x0a47, 0x1492: 0x08d3, 0x1493: 0x45c4, 0x1494: 0x071b, 0x1495: 0x09ef, 0x1496: 0x132f, 0x1497: 0x09ff, 0x1498: 0x0727, 0x1499: 0x0cd7, 0x149a: 0x0eaf, 0x149b: 0x0caf, 0x149c: 0x0827, 0x149d: 0x0b6b, 0x149e: 0x07bf, 0x149f: 0x0cb7, 0x14a0: 0x0813, 0x14a1: 0x1117, 0x14a2: 0x0f83, 0x14a3: 0x138b, 0x14a4: 0x09d3, 0x14a5: 0x090b, 0x14a6: 0x0e63, 0x14a7: 0x0c1b, 0x14a8: 0x0c47, 0x14a9: 0x06bf, 0x14aa: 0x06cb, 0x14ab: 0x140b, 0x14ac: 0x0adb, 0x14ad: 0x06e7, 0x14ae: 0x08ef, 0x14af: 0x0c3b, 0x14b0: 0x13b3, 0x14b1: 0x0c13, 0x14b2: 0x106f, 0x14b3: 0x10ab, 0x14b4: 0x08f7, 0x14b5: 0x0e43, 0x14b6: 0x0d0b, 0x14b7: 0x0d07, 0x14b8: 0x0f97, 0x14b9: 0x082b, 0x14ba: 0x0957, 0x14bb: 0x1443, // Block 0x53, offset 0x14c0 0x14c0: 0x06fb, 0x14c1: 0x06f3, 0x14c2: 0x0703, 0x14c3: 0x1647, 0x14c4: 0x0747, 0x14c5: 0x0757, 0x14c6: 0x075b, 0x14c7: 0x0763, 0x14c8: 0x076b, 0x14c9: 0x076f, 0x14ca: 0x077b, 0x14cb: 0x0773, 0x14cc: 0x05b3, 0x14cd: 0x165b, 0x14ce: 0x078f, 0x14cf: 0x0793, 0x14d0: 0x0797, 0x14d1: 0x07b3, 0x14d2: 0x164c, 0x14d3: 0x05b7, 0x14d4: 0x079f, 0x14d5: 0x07bf, 0x14d6: 0x1656, 0x14d7: 0x07cf, 0x14d8: 0x07d7, 0x14d9: 0x0737, 0x14da: 0x07df, 0x14db: 0x07e3, 0x14dc: 0x1831, 0x14dd: 0x07ff, 0x14de: 0x0807, 0x14df: 0x05bf, 0x14e0: 0x081f, 0x14e1: 0x0823, 0x14e2: 0x082b, 0x14e3: 0x082f, 0x14e4: 0x05c3, 0x14e5: 0x0847, 0x14e6: 0x084b, 0x14e7: 0x0857, 0x14e8: 0x0863, 0x14e9: 0x0867, 0x14ea: 0x086b, 0x14eb: 0x0873, 0x14ec: 0x0893, 0x14ed: 0x0897, 0x14ee: 0x089f, 0x14ef: 0x08af, 0x14f0: 0x08b7, 0x14f1: 0x08bb, 0x14f2: 0x08bb, 0x14f3: 0x08bb, 0x14f4: 0x166a, 0x14f5: 0x0e93, 0x14f6: 0x08cf, 0x14f7: 0x08d7, 0x14f8: 0x166f, 0x14f9: 0x08e3, 0x14fa: 0x08eb, 0x14fb: 0x08f3, 0x14fc: 0x091b, 0x14fd: 0x0907, 0x14fe: 0x0913, 0x14ff: 0x0917, // Block 0x54, offset 0x1500 0x1500: 0x091f, 0x1501: 0x0927, 0x1502: 0x092b, 0x1503: 0x0933, 0x1504: 0x093b, 0x1505: 0x093f, 0x1506: 0x093f, 0x1507: 0x0947, 0x1508: 0x094f, 0x1509: 0x0953, 0x150a: 0x095f, 0x150b: 0x0983, 0x150c: 0x0967, 0x150d: 0x0987, 0x150e: 0x096b, 0x150f: 0x0973, 0x1510: 0x080b, 0x1511: 0x09cf, 0x1512: 0x0997, 0x1513: 0x099b, 0x1514: 0x099f, 0x1515: 0x0993, 0x1516: 0x09a7, 0x1517: 0x09a3, 0x1518: 0x09bb, 0x1519: 0x1674, 0x151a: 0x09d7, 0x151b: 0x09db, 0x151c: 0x09e3, 0x151d: 0x09ef, 0x151e: 0x09f7, 0x151f: 0x0a13, 0x1520: 0x1679, 0x1521: 0x167e, 0x1522: 0x0a1f, 0x1523: 0x0a23, 0x1524: 0x0a27, 0x1525: 0x0a1b, 0x1526: 0x0a2f, 0x1527: 0x05c7, 0x1528: 0x05cb, 0x1529: 0x0a37, 0x152a: 0x0a3f, 0x152b: 0x0a3f, 0x152c: 0x1683, 0x152d: 0x0a5b, 0x152e: 0x0a5f, 0x152f: 0x0a63, 0x1530: 0x0a6b, 0x1531: 0x1688, 0x1532: 0x0a73, 0x1533: 0x0a77, 0x1534: 0x0b4f, 0x1535: 0x0a7f, 0x1536: 0x05cf, 0x1537: 0x0a8b, 0x1538: 0x0a9b, 0x1539: 0x0aa7, 0x153a: 0x0aa3, 0x153b: 0x1692, 0x153c: 0x0aaf, 0x153d: 0x1697, 0x153e: 0x0abb, 0x153f: 0x0ab7, // Block 0x55, offset 0x1540 0x1540: 0x0abf, 0x1541: 0x0acf, 0x1542: 0x0ad3, 0x1543: 0x05d3, 0x1544: 0x0ae3, 0x1545: 0x0aeb, 0x1546: 0x0aef, 0x1547: 0x0af3, 0x1548: 0x05d7, 0x1549: 0x169c, 0x154a: 0x05db, 0x154b: 0x0b0f, 0x154c: 0x0b13, 0x154d: 0x0b17, 0x154e: 0x0b1f, 0x154f: 0x1863, 0x1550: 0x0b37, 0x1551: 0x16a6, 0x1552: 0x16a6, 0x1553: 0x11d7, 0x1554: 0x0b47, 0x1555: 0x0b47, 0x1556: 0x05df, 0x1557: 0x16c9, 0x1558: 0x179b, 0x1559: 0x0b57, 0x155a: 0x0b5f, 0x155b: 0x05e3, 0x155c: 0x0b73, 0x155d: 0x0b83, 0x155e: 0x0b87, 0x155f: 0x0b8f, 0x1560: 0x0b9f, 0x1561: 0x05eb, 0x1562: 0x05e7, 0x1563: 0x0ba3, 0x1564: 0x16ab, 0x1565: 0x0ba7, 0x1566: 0x0bbb, 0x1567: 0x0bbf, 0x1568: 0x0bc3, 0x1569: 0x0bbf, 0x156a: 0x0bcf, 0x156b: 0x0bd3, 0x156c: 0x0be3, 0x156d: 0x0bdb, 0x156e: 0x0bdf, 0x156f: 0x0be7, 0x1570: 0x0beb, 0x1571: 0x0bef, 0x1572: 0x0bfb, 0x1573: 0x0bff, 0x1574: 0x0c17, 0x1575: 0x0c1f, 0x1576: 0x0c2f, 0x1577: 0x0c43, 0x1578: 0x16ba, 0x1579: 0x0c3f, 0x157a: 0x0c33, 0x157b: 0x0c4b, 0x157c: 0x0c53, 0x157d: 0x0c67, 0x157e: 0x16bf, 0x157f: 0x0c6f, // Block 0x56, offset 0x1580 0x1580: 0x0c63, 0x1581: 0x0c5b, 0x1582: 0x05ef, 0x1583: 0x0c77, 0x1584: 0x0c7f, 0x1585: 0x0c87, 0x1586: 0x0c7b, 0x1587: 0x05f3, 0x1588: 0x0c97, 0x1589: 0x0c9f, 0x158a: 0x16c4, 0x158b: 0x0ccb, 0x158c: 0x0cff, 0x158d: 0x0cdb, 0x158e: 0x05ff, 0x158f: 0x0ce7, 0x1590: 0x05fb, 0x1591: 0x05f7, 0x1592: 0x07c3, 0x1593: 0x07c7, 0x1594: 0x0d03, 0x1595: 0x0ceb, 0x1596: 0x11ab, 0x1597: 0x0663, 0x1598: 0x0d0f, 0x1599: 0x0d13, 0x159a: 0x0d17, 0x159b: 0x0d2b, 0x159c: 0x0d23, 0x159d: 0x16dd, 0x159e: 0x0603, 0x159f: 0x0d3f, 0x15a0: 0x0d33, 0x15a1: 0x0d4f, 0x15a2: 0x0d57, 0x15a3: 0x16e7, 0x15a4: 0x0d5b, 0x15a5: 0x0d47, 0x15a6: 0x0d63, 0x15a7: 0x0607, 0x15a8: 0x0d67, 0x15a9: 0x0d6b, 0x15aa: 0x0d6f, 0x15ab: 0x0d7b, 0x15ac: 0x16ec, 0x15ad: 0x0d83, 0x15ae: 0x060b, 0x15af: 0x0d8f, 0x15b0: 0x16f1, 0x15b1: 0x0d93, 0x15b2: 0x060f, 0x15b3: 0x0d9f, 0x15b4: 0x0dab, 0x15b5: 0x0db7, 0x15b6: 0x0dbb, 0x15b7: 0x16f6, 0x15b8: 0x168d, 0x15b9: 0x16fb, 0x15ba: 0x0ddb, 0x15bb: 0x1700, 0x15bc: 0x0de7, 0x15bd: 0x0def, 0x15be: 0x0ddf, 0x15bf: 0x0dfb, // Block 0x57, offset 0x15c0 0x15c0: 0x0e0b, 0x15c1: 0x0e1b, 0x15c2: 0x0e0f, 0x15c3: 0x0e13, 0x15c4: 0x0e1f, 0x15c5: 0x0e23, 0x15c6: 0x1705, 0x15c7: 0x0e07, 0x15c8: 0x0e3b, 0x15c9: 0x0e3f, 0x15ca: 0x0613, 0x15cb: 0x0e53, 0x15cc: 0x0e4f, 0x15cd: 0x170a, 0x15ce: 0x0e33, 0x15cf: 0x0e6f, 0x15d0: 0x170f, 0x15d1: 0x1714, 0x15d2: 0x0e73, 0x15d3: 0x0e87, 0x15d4: 0x0e83, 0x15d5: 0x0e7f, 0x15d6: 0x0617, 0x15d7: 0x0e8b, 0x15d8: 0x0e9b, 0x15d9: 0x0e97, 0x15da: 0x0ea3, 0x15db: 0x1651, 0x15dc: 0x0eb3, 0x15dd: 0x1719, 0x15de: 0x0ebf, 0x15df: 0x1723, 0x15e0: 0x0ed3, 0x15e1: 0x0edf, 0x15e2: 0x0ef3, 0x15e3: 0x1728, 0x15e4: 0x0f07, 0x15e5: 0x0f0b, 0x15e6: 0x172d, 0x15e7: 0x1732, 0x15e8: 0x0f27, 0x15e9: 0x0f37, 0x15ea: 0x061b, 0x15eb: 0x0f3b, 0x15ec: 0x061f, 0x15ed: 0x061f, 0x15ee: 0x0f53, 0x15ef: 0x0f57, 0x15f0: 0x0f5f, 0x15f1: 0x0f63, 0x15f2: 0x0f6f, 0x15f3: 0x0623, 0x15f4: 0x0f87, 0x15f5: 0x1737, 0x15f6: 0x0fa3, 0x15f7: 0x173c, 0x15f8: 0x0faf, 0x15f9: 0x16a1, 0x15fa: 0x0fbf, 0x15fb: 0x1741, 0x15fc: 0x1746, 0x15fd: 0x174b, 0x15fe: 0x0627, 0x15ff: 0x062b, // Block 0x58, offset 0x1600 0x1600: 0x0ff7, 0x1601: 0x1755, 0x1602: 0x1750, 0x1603: 0x175a, 0x1604: 0x175f, 0x1605: 0x0fff, 0x1606: 0x1003, 0x1607: 0x1003, 0x1608: 0x100b, 0x1609: 0x0633, 0x160a: 0x100f, 0x160b: 0x0637, 0x160c: 0x063b, 0x160d: 0x1769, 0x160e: 0x1023, 0x160f: 0x102b, 0x1610: 0x1037, 0x1611: 0x063f, 0x1612: 0x176e, 0x1613: 0x105b, 0x1614: 0x1773, 0x1615: 0x1778, 0x1616: 0x107b, 0x1617: 0x1093, 0x1618: 0x0643, 0x1619: 0x109b, 0x161a: 0x109f, 0x161b: 0x10a3, 0x161c: 0x177d, 0x161d: 0x1782, 0x161e: 0x1782, 0x161f: 0x10bb, 0x1620: 0x0647, 0x1621: 0x1787, 0x1622: 0x10cf, 0x1623: 0x10d3, 0x1624: 0x064b, 0x1625: 0x178c, 0x1626: 0x10ef, 0x1627: 0x064f, 0x1628: 0x10ff, 0x1629: 0x10f7, 0x162a: 0x1107, 0x162b: 0x1796, 0x162c: 0x111f, 0x162d: 0x0653, 0x162e: 0x112b, 0x162f: 0x1133, 0x1630: 0x1143, 0x1631: 0x0657, 0x1632: 0x17a0, 0x1633: 0x17a5, 0x1634: 0x065b, 0x1635: 0x17aa, 0x1636: 0x115b, 0x1637: 0x17af, 0x1638: 0x1167, 0x1639: 0x1173, 0x163a: 0x117b, 0x163b: 0x17b4, 0x163c: 0x17b9, 0x163d: 0x118f, 0x163e: 0x17be, 0x163f: 0x1197, // Block 0x59, offset 0x1640 0x1640: 0x16ce, 0x1641: 0x065f, 0x1642: 0x11af, 0x1643: 0x11b3, 0x1644: 0x0667, 0x1645: 0x11b7, 0x1646: 0x0a33, 0x1647: 0x17c3, 0x1648: 0x17c8, 0x1649: 0x16d3, 0x164a: 0x16d8, 0x164b: 0x11d7, 0x164c: 0x11db, 0x164d: 0x13f3, 0x164e: 0x066b, 0x164f: 0x1207, 0x1650: 0x1203, 0x1651: 0x120b, 0x1652: 0x083f, 0x1653: 0x120f, 0x1654: 0x1213, 0x1655: 0x1217, 0x1656: 0x121f, 0x1657: 0x17cd, 0x1658: 0x121b, 0x1659: 0x1223, 0x165a: 0x1237, 0x165b: 0x123b, 0x165c: 0x1227, 0x165d: 0x123f, 0x165e: 0x1253, 0x165f: 0x1267, 0x1660: 0x1233, 0x1661: 0x1247, 0x1662: 0x124b, 0x1663: 0x124f, 0x1664: 0x17d2, 0x1665: 0x17dc, 0x1666: 0x17d7, 0x1667: 0x066f, 0x1668: 0x126f, 0x1669: 0x1273, 0x166a: 0x127b, 0x166b: 0x17f0, 0x166c: 0x127f, 0x166d: 0x17e1, 0x166e: 0x0673, 0x166f: 0x0677, 0x1670: 0x17e6, 0x1671: 0x17eb, 0x1672: 0x067b, 0x1673: 0x129f, 0x1674: 0x12a3, 0x1675: 0x12a7, 0x1676: 0x12ab, 0x1677: 0x12b7, 0x1678: 0x12b3, 0x1679: 0x12bf, 0x167a: 0x12bb, 0x167b: 0x12cb, 0x167c: 0x12c3, 0x167d: 0x12c7, 0x167e: 0x12cf, 0x167f: 0x067f, // Block 0x5a, offset 0x1680 0x1680: 0x12d7, 0x1681: 0x12db, 0x1682: 0x0683, 0x1683: 0x12eb, 0x1684: 0x12ef, 0x1685: 0x17f5, 0x1686: 0x12fb, 0x1687: 0x12ff, 0x1688: 0x0687, 0x1689: 0x130b, 0x168a: 0x05bb, 0x168b: 0x17fa, 0x168c: 0x17ff, 0x168d: 0x068b, 0x168e: 0x068f, 0x168f: 0x1337, 0x1690: 0x134f, 0x1691: 0x136b, 0x1692: 0x137b, 0x1693: 0x1804, 0x1694: 0x138f, 0x1695: 0x1393, 0x1696: 0x13ab, 0x1697: 0x13b7, 0x1698: 0x180e, 0x1699: 0x1660, 0x169a: 0x13c3, 0x169b: 0x13bf, 0x169c: 0x13cb, 0x169d: 0x1665, 0x169e: 0x13d7, 0x169f: 0x13e3, 0x16a0: 0x1813, 0x16a1: 0x1818, 0x16a2: 0x1423, 0x16a3: 0x142f, 0x16a4: 0x1437, 0x16a5: 0x181d, 0x16a6: 0x143b, 0x16a7: 0x1467, 0x16a8: 0x1473, 0x16a9: 0x1477, 0x16aa: 0x146f, 0x16ab: 0x1483, 0x16ac: 0x1487, 0x16ad: 0x1822, 0x16ae: 0x1493, 0x16af: 0x0693, 0x16b0: 0x149b, 0x16b1: 0x1827, 0x16b2: 0x0697, 0x16b3: 0x14d3, 0x16b4: 0x0ac3, 0x16b5: 0x14eb, 0x16b6: 0x182c, 0x16b7: 0x1836, 0x16b8: 0x069b, 0x16b9: 0x069f, 0x16ba: 0x1513, 0x16bb: 0x183b, 0x16bc: 0x06a3, 0x16bd: 0x1840, 0x16be: 0x152b, 0x16bf: 0x152b, // Block 0x5b, offset 0x16c0 0x16c0: 0x1533, 0x16c1: 0x1845, 0x16c2: 0x154b, 0x16c3: 0x06a7, 0x16c4: 0x155b, 0x16c5: 0x1567, 0x16c6: 0x156f, 0x16c7: 0x1577, 0x16c8: 0x06ab, 0x16c9: 0x184a, 0x16ca: 0x158b, 0x16cb: 0x15a7, 0x16cc: 0x15b3, 0x16cd: 0x06af, 0x16ce: 0x06b3, 0x16cf: 0x15b7, 0x16d0: 0x184f, 0x16d1: 0x06b7, 0x16d2: 0x1854, 0x16d3: 0x1859, 0x16d4: 0x185e, 0x16d5: 0x15db, 0x16d6: 0x06bb, 0x16d7: 0x15ef, 0x16d8: 0x15f7, 0x16d9: 0x15fb, 0x16da: 0x1603, 0x16db: 0x160b, 0x16dc: 0x1613, 0x16dd: 0x1868, } // nfkcIndex: 22 blocks, 1408 entries, 1408 bytes // Block 0 is the zero block. var nfkcIndex = [1408]uint8{ // Block 0x0, offset 0x0 // Block 0x1, offset 0x40 // Block 0x2, offset 0x80 // Block 0x3, offset 0xc0 0xc2: 0x5a, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x5b, 0xc7: 0x04, 0xc8: 0x05, 0xca: 0x5c, 0xcb: 0x5d, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x09, 0xd0: 0x0a, 0xd1: 0x5e, 0xd2: 0x5f, 0xd3: 0x0b, 0xd6: 0x0c, 0xd7: 0x60, 0xd8: 0x61, 0xd9: 0x0d, 0xdb: 0x62, 0xdc: 0x63, 0xdd: 0x64, 0xdf: 0x65, 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a, 0xf0: 0x13, // Block 0x4, offset 0x100 0x120: 0x66, 0x121: 0x67, 0x123: 0x68, 0x124: 0x69, 0x125: 0x6a, 0x126: 0x6b, 0x127: 0x6c, 0x128: 0x6d, 0x129: 0x6e, 0x12a: 0x6f, 0x12b: 0x70, 0x12c: 0x6b, 0x12d: 0x71, 0x12e: 0x72, 0x12f: 0x73, 0x131: 0x74, 0x132: 0x75, 0x133: 0x76, 0x134: 0x77, 0x135: 0x78, 0x137: 0x79, 0x138: 0x7a, 0x139: 0x7b, 0x13a: 0x7c, 0x13b: 0x7d, 0x13c: 0x7e, 0x13d: 0x7f, 0x13e: 0x80, 0x13f: 0x81, // Block 0x5, offset 0x140 0x140: 0x82, 0x142: 0x83, 0x143: 0x84, 0x144: 0x85, 0x145: 0x86, 0x146: 0x87, 0x147: 0x88, 0x14d: 0x89, 0x15c: 0x8a, 0x15f: 0x8b, 0x162: 0x8c, 0x164: 0x8d, 0x168: 0x8e, 0x169: 0x8f, 0x16a: 0x90, 0x16c: 0x0e, 0x16d: 0x91, 0x16e: 0x92, 0x16f: 0x93, 0x170: 0x94, 0x173: 0x95, 0x174: 0x96, 0x175: 0x0f, 0x176: 0x10, 0x177: 0x97, 0x178: 0x11, 0x179: 0x12, 0x17a: 0x13, 0x17b: 0x14, 0x17c: 0x15, 0x17d: 0x16, 0x17e: 0x17, 0x17f: 0x18, // Block 0x6, offset 0x180 0x180: 0x98, 0x181: 0x99, 0x182: 0x9a, 0x183: 0x9b, 0x184: 0x19, 0x185: 0x1a, 0x186: 0x9c, 0x187: 0x9d, 0x188: 0x9e, 0x189: 0x1b, 0x18a: 0x1c, 0x18b: 0x9f, 0x18c: 0xa0, 0x191: 0x1d, 0x192: 0x1e, 0x193: 0xa1, 0x1a8: 0xa2, 0x1a9: 0xa3, 0x1ab: 0xa4, 0x1b1: 0xa5, 0x1b3: 0xa6, 0x1b5: 0xa7, 0x1b7: 0xa8, 0x1ba: 0xa9, 0x1bb: 0xaa, 0x1bc: 0x1f, 0x1bd: 0x20, 0x1be: 0x21, 0x1bf: 0xab, // Block 0x7, offset 0x1c0 0x1c0: 0xac, 0x1c1: 0x22, 0x1c2: 0x23, 0x1c3: 0x24, 0x1c4: 0xad, 0x1c5: 0x25, 0x1c6: 0x26, 0x1c8: 0x27, 0x1c9: 0x28, 0x1ca: 0x29, 0x1cb: 0x2a, 0x1cc: 0x2b, 0x1cd: 0x2c, 0x1ce: 0x2d, 0x1cf: 0x2e, // Block 0x8, offset 0x200 0x219: 0xae, 0x21a: 0xaf, 0x21b: 0xb0, 0x21d: 0xb1, 0x21f: 0xb2, 0x220: 0xb3, 0x223: 0xb4, 0x224: 0xb5, 0x225: 0xb6, 0x226: 0xb7, 0x227: 0xb8, 0x22a: 0xb9, 0x22b: 0xba, 0x22d: 0xbb, 0x22f: 0xbc, 0x230: 0xbd, 0x231: 0xbe, 0x232: 0xbf, 0x233: 0xc0, 0x234: 0xc1, 0x235: 0xc2, 0x236: 0xc3, 0x237: 0xbd, 0x238: 0xbe, 0x239: 0xbf, 0x23a: 0xc0, 0x23b: 0xc1, 0x23c: 0xc2, 0x23d: 0xc3, 0x23e: 0xbd, 0x23f: 0xbe, // Block 0x9, offset 0x240 0x240: 0xbf, 0x241: 0xc0, 0x242: 0xc1, 0x243: 0xc2, 0x244: 0xc3, 0x245: 0xbd, 0x246: 0xbe, 0x247: 0xbf, 0x248: 0xc0, 0x249: 0xc1, 0x24a: 0xc2, 0x24b: 0xc3, 0x24c: 0xbd, 0x24d: 0xbe, 0x24e: 0xbf, 0x24f: 0xc0, 0x250: 0xc1, 0x251: 0xc2, 0x252: 0xc3, 0x253: 0xbd, 0x254: 0xbe, 0x255: 0xbf, 0x256: 0xc0, 0x257: 0xc1, 0x258: 0xc2, 0x259: 0xc3, 0x25a: 0xbd, 0x25b: 0xbe, 0x25c: 0xbf, 0x25d: 0xc0, 0x25e: 0xc1, 0x25f: 0xc2, 0x260: 0xc3, 0x261: 0xbd, 0x262: 0xbe, 0x263: 0xbf, 0x264: 0xc0, 0x265: 0xc1, 0x266: 0xc2, 0x267: 0xc3, 0x268: 0xbd, 0x269: 0xbe, 0x26a: 0xbf, 0x26b: 0xc0, 0x26c: 0xc1, 0x26d: 0xc2, 0x26e: 0xc3, 0x26f: 0xbd, 0x270: 0xbe, 0x271: 0xbf, 0x272: 0xc0, 0x273: 0xc1, 0x274: 0xc2, 0x275: 0xc3, 0x276: 0xbd, 0x277: 0xbe, 0x278: 0xbf, 0x279: 0xc0, 0x27a: 0xc1, 0x27b: 0xc2, 0x27c: 0xc3, 0x27d: 0xbd, 0x27e: 0xbe, 0x27f: 0xbf, // Block 0xa, offset 0x280 0x280: 0xc0, 0x281: 0xc1, 0x282: 0xc2, 0x283: 0xc3, 0x284: 0xbd, 0x285: 0xbe, 0x286: 0xbf, 0x287: 0xc0, 0x288: 0xc1, 0x289: 0xc2, 0x28a: 0xc3, 0x28b: 0xbd, 0x28c: 0xbe, 0x28d: 0xbf, 0x28e: 0xc0, 0x28f: 0xc1, 0x290: 0xc2, 0x291: 0xc3, 0x292: 0xbd, 0x293: 0xbe, 0x294: 0xbf, 0x295: 0xc0, 0x296: 0xc1, 0x297: 0xc2, 0x298: 0xc3, 0x299: 0xbd, 0x29a: 0xbe, 0x29b: 0xbf, 0x29c: 0xc0, 0x29d: 0xc1, 0x29e: 0xc2, 0x29f: 0xc3, 0x2a0: 0xbd, 0x2a1: 0xbe, 0x2a2: 0xbf, 0x2a3: 0xc0, 0x2a4: 0xc1, 0x2a5: 0xc2, 0x2a6: 0xc3, 0x2a7: 0xbd, 0x2a8: 0xbe, 0x2a9: 0xbf, 0x2aa: 0xc0, 0x2ab: 0xc1, 0x2ac: 0xc2, 0x2ad: 0xc3, 0x2ae: 0xbd, 0x2af: 0xbe, 0x2b0: 0xbf, 0x2b1: 0xc0, 0x2b2: 0xc1, 0x2b3: 0xc2, 0x2b4: 0xc3, 0x2b5: 0xbd, 0x2b6: 0xbe, 0x2b7: 0xbf, 0x2b8: 0xc0, 0x2b9: 0xc1, 0x2ba: 0xc2, 0x2bb: 0xc3, 0x2bc: 0xbd, 0x2bd: 0xbe, 0x2be: 0xbf, 0x2bf: 0xc0, // Block 0xb, offset 0x2c0 0x2c0: 0xc1, 0x2c1: 0xc2, 0x2c2: 0xc3, 0x2c3: 0xbd, 0x2c4: 0xbe, 0x2c5: 0xbf, 0x2c6: 0xc0, 0x2c7: 0xc1, 0x2c8: 0xc2, 0x2c9: 0xc3, 0x2ca: 0xbd, 0x2cb: 0xbe, 0x2cc: 0xbf, 0x2cd: 0xc0, 0x2ce: 0xc1, 0x2cf: 0xc2, 0x2d0: 0xc3, 0x2d1: 0xbd, 0x2d2: 0xbe, 0x2d3: 0xbf, 0x2d4: 0xc0, 0x2d5: 0xc1, 0x2d6: 0xc2, 0x2d7: 0xc3, 0x2d8: 0xbd, 0x2d9: 0xbe, 0x2da: 0xbf, 0x2db: 0xc0, 0x2dc: 0xc1, 0x2dd: 0xc2, 0x2de: 0xc4, // Block 0xc, offset 0x300 0x324: 0x2f, 0x325: 0x30, 0x326: 0x31, 0x327: 0x32, 0x328: 0x33, 0x329: 0x34, 0x32a: 0x35, 0x32b: 0x36, 0x32c: 0x37, 0x32d: 0x38, 0x32e: 0x39, 0x32f: 0x3a, 0x330: 0x3b, 0x331: 0x3c, 0x332: 0x3d, 0x333: 0x3e, 0x334: 0x3f, 0x335: 0x40, 0x336: 0x41, 0x337: 0x42, 0x338: 0x43, 0x339: 0x44, 0x33a: 0x45, 0x33b: 0x46, 0x33c: 0xc5, 0x33d: 0x47, 0x33e: 0x48, 0x33f: 0x49, // Block 0xd, offset 0x340 0x347: 0xc6, 0x34b: 0xc7, 0x34d: 0xc8, 0x368: 0xc9, 0x36b: 0xca, // Block 0xe, offset 0x380 0x381: 0xcb, 0x382: 0xcc, 0x384: 0xcd, 0x385: 0xb7, 0x387: 0xce, 0x388: 0xcf, 0x38b: 0xd0, 0x38c: 0x6b, 0x38d: 0xd1, 0x391: 0xd2, 0x392: 0xd3, 0x393: 0xd4, 0x396: 0xd5, 0x397: 0xd6, 0x398: 0xd7, 0x39a: 0xd8, 0x39c: 0xd9, 0x3b0: 0xd7, // Block 0xf, offset 0x3c0 0x3eb: 0xda, 0x3ec: 0xdb, // Block 0x10, offset 0x400 0x432: 0xdc, // Block 0x11, offset 0x440 0x445: 0xdd, 0x446: 0xde, 0x447: 0xdf, 0x449: 0xe0, 0x450: 0xe1, 0x451: 0xe2, 0x452: 0xe3, 0x453: 0xe4, 0x454: 0xe5, 0x455: 0xe6, 0x456: 0xe7, 0x457: 0xe8, 0x458: 0xe9, 0x459: 0xea, 0x45a: 0x4a, 0x45b: 0xeb, 0x45c: 0xec, 0x45d: 0xed, 0x45e: 0xee, 0x45f: 0x4b, // Block 0x12, offset 0x480 0x480: 0xef, 0x4a3: 0xf0, 0x4a5: 0xf1, 0x4b8: 0x4c, 0x4b9: 0x4d, 0x4ba: 0x4e, // Block 0x13, offset 0x4c0 0x4c4: 0x4f, 0x4c5: 0xf2, 0x4c6: 0xf3, 0x4c8: 0x50, 0x4c9: 0xf4, // Block 0x14, offset 0x500 0x520: 0x51, 0x521: 0x52, 0x522: 0x53, 0x523: 0x54, 0x524: 0x55, 0x525: 0x56, 0x526: 0x57, 0x527: 0x58, 0x528: 0x59, // Block 0x15, offset 0x540 0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d, 0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11, 0x56f: 0x12, } // nfkcSparseOffset: 155 entries, 310 bytes var nfkcSparseOffset = []uint16{0x0, 0xe, 0x12, 0x1b, 0x25, 0x35, 0x37, 0x3c, 0x47, 0x56, 0x63, 0x6b, 0x6f, 0x74, 0x76, 0x87, 0x8f, 0x96, 0x99, 0xa0, 0xa4, 0xa8, 0xaa, 0xac, 0xb5, 0xb9, 0xc0, 0xc5, 0xc8, 0xd2, 0xd4, 0xdb, 0xe3, 0xe7, 0xe9, 0xec, 0xf0, 0xf6, 0x107, 0x113, 0x115, 0x11b, 0x11d, 0x11f, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12c, 0x12f, 0x131, 0x134, 0x137, 0x13b, 0x140, 0x149, 0x14b, 0x14e, 0x150, 0x15b, 0x166, 0x176, 0x184, 0x192, 0x1a2, 0x1b0, 0x1b7, 0x1bd, 0x1cc, 0x1d0, 0x1d2, 0x1d6, 0x1d8, 0x1db, 0x1dd, 0x1e0, 0x1e2, 0x1e5, 0x1e7, 0x1e9, 0x1eb, 0x1f7, 0x201, 0x20b, 0x20e, 0x212, 0x214, 0x216, 0x218, 0x21a, 0x21d, 0x21f, 0x221, 0x223, 0x225, 0x22b, 0x22e, 0x232, 0x234, 0x23b, 0x241, 0x247, 0x24f, 0x255, 0x25b, 0x261, 0x265, 0x267, 0x269, 0x26b, 0x26d, 0x273, 0x276, 0x279, 0x281, 0x288, 0x28b, 0x28e, 0x290, 0x298, 0x29b, 0x2a2, 0x2a5, 0x2ab, 0x2ad, 0x2af, 0x2b2, 0x2b4, 0x2b6, 0x2b8, 0x2ba, 0x2c7, 0x2d1, 0x2d3, 0x2d5, 0x2d9, 0x2de, 0x2ea, 0x2ef, 0x2f8, 0x2fe, 0x303, 0x307, 0x30c, 0x310, 0x320, 0x32e, 0x33c, 0x34a, 0x350, 0x352, 0x355, 0x35f, 0x361} // nfkcSparseValues: 875 entries, 3500 bytes var nfkcSparseValues = [875]valueRange{ // Block 0x0, offset 0x0 {value: 0x0002, lo: 0x0d}, {value: 0x0001, lo: 0xa0, hi: 0xa0}, {value: 0x4278, lo: 0xa8, hi: 0xa8}, {value: 0x0083, lo: 0xaa, hi: 0xaa}, {value: 0x4264, lo: 0xaf, hi: 0xaf}, {value: 0x0025, lo: 0xb2, hi: 0xb3}, {value: 0x425a, lo: 0xb4, hi: 0xb4}, {value: 0x01dc, lo: 0xb5, hi: 0xb5}, {value: 0x4291, lo: 0xb8, hi: 0xb8}, {value: 0x0023, lo: 0xb9, hi: 0xb9}, {value: 0x009f, lo: 0xba, hi: 0xba}, {value: 0x221c, lo: 0xbc, hi: 0xbc}, {value: 0x2210, lo: 0xbd, hi: 0xbd}, {value: 0x22b2, lo: 0xbe, hi: 0xbe}, // Block 0x1, offset 0xe {value: 0x0091, lo: 0x03}, {value: 0x46e2, lo: 0xa0, hi: 0xa1}, {value: 0x4714, lo: 0xaf, hi: 0xb0}, {value: 0xa000, lo: 0xb7, hi: 0xb7}, // Block 0x2, offset 0x12 {value: 0x0003, lo: 0x08}, {value: 0xa000, lo: 0x92, hi: 0x92}, {value: 0x0091, lo: 0xb0, hi: 0xb0}, {value: 0x0119, lo: 0xb1, hi: 0xb1}, {value: 0x0095, lo: 0xb2, hi: 0xb2}, {value: 0x00a5, lo: 0xb3, hi: 0xb3}, {value: 0x0143, lo: 0xb4, hi: 0xb6}, {value: 0x00af, lo: 0xb7, hi: 0xb7}, {value: 0x00b3, lo: 0xb8, hi: 0xb8}, // Block 0x3, offset 0x1b {value: 0x000a, lo: 0x09}, {value: 0x426e, lo: 0x98, hi: 0x98}, {value: 0x4273, lo: 0x99, hi: 0x9a}, {value: 0x4296, lo: 0x9b, hi: 0x9b}, {value: 0x425f, lo: 0x9c, hi: 0x9c}, {value: 0x4282, lo: 0x9d, hi: 0x9d}, {value: 0x0113, lo: 0xa0, hi: 0xa0}, {value: 0x0099, lo: 0xa1, hi: 0xa1}, {value: 0x00a7, lo: 0xa2, hi: 0xa3}, {value: 0x0167, lo: 0xa4, hi: 0xa4}, // Block 0x4, offset 0x25 {value: 0x0000, lo: 0x0f}, {value: 0xa000, lo: 0x83, hi: 0x83}, {value: 0xa000, lo: 0x87, hi: 0x87}, {value: 0xa000, lo: 0x8b, hi: 0x8b}, {value: 0xa000, lo: 0x8d, hi: 0x8d}, {value: 0x37a5, lo: 0x90, hi: 0x90}, {value: 0x37b1, lo: 0x91, hi: 0x91}, {value: 0x379f, lo: 0x93, hi: 0x93}, {value: 0xa000, lo: 0x96, hi: 0x96}, {value: 0x3817, lo: 0x97, hi: 0x97}, {value: 0x37e1, lo: 0x9c, hi: 0x9c}, {value: 0x37c9, lo: 0x9d, hi: 0x9d}, {value: 0x37f3, lo: 0x9e, hi: 0x9e}, {value: 0xa000, lo: 0xb4, hi: 0xb5}, {value: 0x381d, lo: 0xb6, hi: 0xb6}, {value: 0x3823, lo: 0xb7, hi: 0xb7}, // Block 0x5, offset 0x35 {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0x83, hi: 0x87}, // Block 0x6, offset 0x37 {value: 0x0001, lo: 0x04}, {value: 0x8113, lo: 0x81, hi: 0x82}, {value: 0x8132, lo: 0x84, hi: 0x84}, {value: 0x812d, lo: 0x85, hi: 0x85}, {value: 0x810d, lo: 0x87, hi: 0x87}, // Block 0x7, offset 0x3c {value: 0x0000, lo: 0x0a}, {value: 0x8132, lo: 0x90, hi: 0x97}, {value: 0x8119, lo: 0x98, hi: 0x98}, {value: 0x811a, lo: 0x99, hi: 0x99}, {value: 0x811b, lo: 0x9a, hi: 0x9a}, {value: 0x3841, lo: 0xa2, hi: 0xa2}, {value: 0x3847, lo: 0xa3, hi: 0xa3}, {value: 0x3853, lo: 0xa4, hi: 0xa4}, {value: 0x384d, lo: 0xa5, hi: 0xa5}, {value: 0x3859, lo: 0xa6, hi: 0xa6}, {value: 0xa000, lo: 0xa7, hi: 0xa7}, // Block 0x8, offset 0x47 {value: 0x0000, lo: 0x0e}, {value: 0x386b, lo: 0x80, hi: 0x80}, {value: 0xa000, lo: 0x81, hi: 0x81}, {value: 0x385f, lo: 0x82, hi: 0x82}, {value: 0xa000, lo: 0x92, hi: 0x92}, {value: 0x3865, lo: 0x93, hi: 0x93}, {value: 0xa000, lo: 0x95, hi: 0x95}, {value: 0x8132, lo: 0x96, hi: 0x9c}, {value: 0x8132, lo: 0x9f, hi: 0xa2}, {value: 0x812d, lo: 0xa3, hi: 0xa3}, {value: 0x8132, lo: 0xa4, hi: 0xa4}, {value: 0x8132, lo: 0xa7, hi: 0xa8}, {value: 0x812d, lo: 0xaa, hi: 0xaa}, {value: 0x8132, lo: 0xab, hi: 0xac}, {value: 0x812d, lo: 0xad, hi: 0xad}, // Block 0x9, offset 0x56 {value: 0x0000, lo: 0x0c}, {value: 0x811f, lo: 0x91, hi: 0x91}, {value: 0x8132, lo: 0xb0, hi: 0xb0}, {value: 0x812d, lo: 0xb1, hi: 0xb1}, {value: 0x8132, lo: 0xb2, hi: 0xb3}, {value: 0x812d, lo: 0xb4, hi: 0xb4}, {value: 0x8132, lo: 0xb5, hi: 0xb6}, {value: 0x812d, lo: 0xb7, hi: 0xb9}, {value: 0x8132, lo: 0xba, hi: 0xba}, {value: 0x812d, lo: 0xbb, hi: 0xbc}, {value: 0x8132, lo: 0xbd, hi: 0xbd}, {value: 0x812d, lo: 0xbe, hi: 0xbe}, {value: 0x8132, lo: 0xbf, hi: 0xbf}, // Block 0xa, offset 0x63 {value: 0x0005, lo: 0x07}, {value: 0x8132, lo: 0x80, hi: 0x80}, {value: 0x8132, lo: 0x81, hi: 0x81}, {value: 0x812d, lo: 0x82, hi: 0x83}, {value: 0x812d, lo: 0x84, hi: 0x85}, {value: 0x812d, lo: 0x86, hi: 0x87}, {value: 0x812d, lo: 0x88, hi: 0x89}, {value: 0x8132, lo: 0x8a, hi: 0x8a}, // Block 0xb, offset 0x6b {value: 0x0000, lo: 0x03}, {value: 0x8132, lo: 0xab, hi: 0xb1}, {value: 0x812d, lo: 0xb2, hi: 0xb2}, {value: 0x8132, lo: 0xb3, hi: 0xb3}, // Block 0xc, offset 0x6f {value: 0x0000, lo: 0x04}, {value: 0x8132, lo: 0x96, hi: 0x99}, {value: 0x8132, lo: 0x9b, hi: 0xa3}, {value: 0x8132, lo: 0xa5, hi: 0xa7}, {value: 0x8132, lo: 0xa9, hi: 0xad}, // Block 0xd, offset 0x74 {value: 0x0000, lo: 0x01}, {value: 0x812d, lo: 0x99, hi: 0x9b}, // Block 0xe, offset 0x76 {value: 0x0000, lo: 0x10}, {value: 0x8132, lo: 0x94, hi: 0xa1}, {value: 0x812d, lo: 0xa3, hi: 0xa3}, {value: 0x8132, lo: 0xa4, hi: 0xa5}, {value: 0x812d, lo: 0xa6, hi: 0xa6}, {value: 0x8132, lo: 0xa7, hi: 0xa8}, {value: 0x812d, lo: 0xa9, hi: 0xa9}, {value: 0x8132, lo: 0xaa, hi: 0xac}, {value: 0x812d, lo: 0xad, hi: 0xaf}, {value: 0x8116, lo: 0xb0, hi: 0xb0}, {value: 0x8117, lo: 0xb1, hi: 0xb1}, {value: 0x8118, lo: 0xb2, hi: 0xb2}, {value: 0x8132, lo: 0xb3, hi: 0xb5}, {value: 0x812d, lo: 0xb6, hi: 0xb6}, {value: 0x8132, lo: 0xb7, hi: 0xb8}, {value: 0x812d, lo: 0xb9, hi: 0xba}, {value: 0x8132, lo: 0xbb, hi: 0xbf}, // Block 0xf, offset 0x87 {value: 0x0000, lo: 0x07}, {value: 0xa000, lo: 0xa8, hi: 0xa8}, {value: 0x3ed8, lo: 0xa9, hi: 0xa9}, {value: 0xa000, lo: 0xb0, hi: 0xb0}, {value: 0x3ee0, lo: 0xb1, hi: 0xb1}, {value: 0xa000, lo: 0xb3, hi: 0xb3}, {value: 0x3ee8, lo: 0xb4, hi: 0xb4}, {value: 0x9902, lo: 0xbc, hi: 0xbc}, // Block 0x10, offset 0x8f {value: 0x0008, lo: 0x06}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x8132, lo: 0x91, hi: 0x91}, {value: 0x812d, lo: 0x92, hi: 0x92}, {value: 0x8132, lo: 0x93, hi: 0x93}, {value: 0x8132, lo: 0x94, hi: 0x94}, {value: 0x451c, lo: 0x98, hi: 0x9f}, // Block 0x11, offset 0x96 {value: 0x0000, lo: 0x02}, {value: 0x8102, lo: 0xbc, hi: 0xbc}, {value: 0x9900, lo: 0xbe, hi: 0xbe}, // Block 0x12, offset 0x99 {value: 0x0008, lo: 0x06}, {value: 0xa000, lo: 0x87, hi: 0x87}, {value: 0x2c9e, lo: 0x8b, hi: 0x8c}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x9900, lo: 0x97, hi: 0x97}, {value: 0x455c, lo: 0x9c, hi: 0x9d}, {value: 0x456c, lo: 0x9f, hi: 0x9f}, // Block 0x13, offset 0xa0 {value: 0x0000, lo: 0x03}, {value: 0x4594, lo: 0xb3, hi: 0xb3}, {value: 0x459c, lo: 0xb6, hi: 0xb6}, {value: 0x8102, lo: 0xbc, hi: 0xbc}, // Block 0x14, offset 0xa4 {value: 0x0008, lo: 0x03}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x4574, lo: 0x99, hi: 0x9b}, {value: 0x458c, lo: 0x9e, hi: 0x9e}, // Block 0x15, offset 0xa8 {value: 0x0000, lo: 0x01}, {value: 0x8102, lo: 0xbc, hi: 0xbc}, // Block 0x16, offset 0xaa {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, // Block 0x17, offset 0xac {value: 0x0000, lo: 0x08}, {value: 0xa000, lo: 0x87, hi: 0x87}, {value: 0x2cb6, lo: 0x88, hi: 0x88}, {value: 0x2cae, lo: 0x8b, hi: 0x8b}, {value: 0x2cbe, lo: 0x8c, hi: 0x8c}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x9900, lo: 0x96, hi: 0x97}, {value: 0x45a4, lo: 0x9c, hi: 0x9c}, {value: 0x45ac, lo: 0x9d, hi: 0x9d}, // Block 0x18, offset 0xb5 {value: 0x0000, lo: 0x03}, {value: 0xa000, lo: 0x92, hi: 0x92}, {value: 0x2cc6, lo: 0x94, hi: 0x94}, {value: 0x9900, lo: 0xbe, hi: 0xbe}, // Block 0x19, offset 0xb9 {value: 0x0000, lo: 0x06}, {value: 0xa000, lo: 0x86, hi: 0x87}, {value: 0x2cce, lo: 0x8a, hi: 0x8a}, {value: 0x2cde, lo: 0x8b, hi: 0x8b}, {value: 0x2cd6, lo: 0x8c, hi: 0x8c}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x9900, lo: 0x97, hi: 0x97}, // Block 0x1a, offset 0xc0 {value: 0x1801, lo: 0x04}, {value: 0xa000, lo: 0x86, hi: 0x86}, {value: 0x3ef0, lo: 0x88, hi: 0x88}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x8120, lo: 0x95, hi: 0x96}, // Block 0x1b, offset 0xc5 {value: 0x0000, lo: 0x02}, {value: 0x8102, lo: 0xbc, hi: 0xbc}, {value: 0xa000, lo: 0xbf, hi: 0xbf}, // Block 0x1c, offset 0xc8 {value: 0x0000, lo: 0x09}, {value: 0x2ce6, lo: 0x80, hi: 0x80}, {value: 0x9900, lo: 0x82, hi: 0x82}, {value: 0xa000, lo: 0x86, hi: 0x86}, {value: 0x2cee, lo: 0x87, hi: 0x87}, {value: 0x2cf6, lo: 0x88, hi: 0x88}, {value: 0x2f50, lo: 0x8a, hi: 0x8a}, {value: 0x2dd8, lo: 0x8b, hi: 0x8b}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x9900, lo: 0x95, hi: 0x96}, // Block 0x1d, offset 0xd2 {value: 0x0000, lo: 0x01}, {value: 0x9900, lo: 0xbe, hi: 0xbe}, // Block 0x1e, offset 0xd4 {value: 0x0000, lo: 0x06}, {value: 0xa000, lo: 0x86, hi: 0x87}, {value: 0x2cfe, lo: 0x8a, hi: 0x8a}, {value: 0x2d0e, lo: 0x8b, hi: 0x8b}, {value: 0x2d06, lo: 0x8c, hi: 0x8c}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x9900, lo: 0x97, hi: 0x97}, // Block 0x1f, offset 0xdb {value: 0x6bea, lo: 0x07}, {value: 0x9904, lo: 0x8a, hi: 0x8a}, {value: 0x9900, lo: 0x8f, hi: 0x8f}, {value: 0xa000, lo: 0x99, hi: 0x99}, {value: 0x3ef8, lo: 0x9a, hi: 0x9a}, {value: 0x2f58, lo: 0x9c, hi: 0x9c}, {value: 0x2de3, lo: 0x9d, hi: 0x9d}, {value: 0x2d16, lo: 0x9e, hi: 0x9f}, // Block 0x20, offset 0xe3 {value: 0x0000, lo: 0x03}, {value: 0x2621, lo: 0xb3, hi: 0xb3}, {value: 0x8122, lo: 0xb8, hi: 0xb9}, {value: 0x8104, lo: 0xba, hi: 0xba}, // Block 0x21, offset 0xe7 {value: 0x0000, lo: 0x01}, {value: 0x8123, lo: 0x88, hi: 0x8b}, // Block 0x22, offset 0xe9 {value: 0x0000, lo: 0x02}, {value: 0x2636, lo: 0xb3, hi: 0xb3}, {value: 0x8124, lo: 0xb8, hi: 0xb9}, // Block 0x23, offset 0xec {value: 0x0000, lo: 0x03}, {value: 0x8125, lo: 0x88, hi: 0x8b}, {value: 0x2628, lo: 0x9c, hi: 0x9c}, {value: 0x262f, lo: 0x9d, hi: 0x9d}, // Block 0x24, offset 0xf0 {value: 0x0000, lo: 0x05}, {value: 0x030b, lo: 0x8c, hi: 0x8c}, {value: 0x812d, lo: 0x98, hi: 0x99}, {value: 0x812d, lo: 0xb5, hi: 0xb5}, {value: 0x812d, lo: 0xb7, hi: 0xb7}, {value: 0x812b, lo: 0xb9, hi: 0xb9}, // Block 0x25, offset 0xf6 {value: 0x0000, lo: 0x10}, {value: 0x2644, lo: 0x83, hi: 0x83}, {value: 0x264b, lo: 0x8d, hi: 0x8d}, {value: 0x2652, lo: 0x92, hi: 0x92}, {value: 0x2659, lo: 0x97, hi: 0x97}, {value: 0x2660, lo: 0x9c, hi: 0x9c}, {value: 0x263d, lo: 0xa9, hi: 0xa9}, {value: 0x8126, lo: 0xb1, hi: 0xb1}, {value: 0x8127, lo: 0xb2, hi: 0xb2}, {value: 0x4a84, lo: 0xb3, hi: 0xb3}, {value: 0x8128, lo: 0xb4, hi: 0xb4}, {value: 0x4a8d, lo: 0xb5, hi: 0xb5}, {value: 0x45b4, lo: 0xb6, hi: 0xb6}, {value: 0x45f4, lo: 0xb7, hi: 0xb7}, {value: 0x45bc, lo: 0xb8, hi: 0xb8}, {value: 0x45ff, lo: 0xb9, hi: 0xb9}, {value: 0x8127, lo: 0xba, hi: 0xbd}, // Block 0x26, offset 0x107 {value: 0x0000, lo: 0x0b}, {value: 0x8127, lo: 0x80, hi: 0x80}, {value: 0x4a96, lo: 0x81, hi: 0x81}, {value: 0x8132, lo: 0x82, hi: 0x83}, {value: 0x8104, lo: 0x84, hi: 0x84}, {value: 0x8132, lo: 0x86, hi: 0x87}, {value: 0x266e, lo: 0x93, hi: 0x93}, {value: 0x2675, lo: 0x9d, hi: 0x9d}, {value: 0x267c, lo: 0xa2, hi: 0xa2}, {value: 0x2683, lo: 0xa7, hi: 0xa7}, {value: 0x268a, lo: 0xac, hi: 0xac}, {value: 0x2667, lo: 0xb9, hi: 0xb9}, // Block 0x27, offset 0x113 {value: 0x0000, lo: 0x01}, {value: 0x812d, lo: 0x86, hi: 0x86}, // Block 0x28, offset 0x115 {value: 0x0000, lo: 0x05}, {value: 0xa000, lo: 0xa5, hi: 0xa5}, {value: 0x2d1e, lo: 0xa6, hi: 0xa6}, {value: 0x9900, lo: 0xae, hi: 0xae}, {value: 0x8102, lo: 0xb7, hi: 0xb7}, {value: 0x8104, lo: 0xb9, hi: 0xba}, // Block 0x29, offset 0x11b {value: 0x0000, lo: 0x01}, {value: 0x812d, lo: 0x8d, hi: 0x8d}, // Block 0x2a, offset 0x11d {value: 0x0000, lo: 0x01}, {value: 0x030f, lo: 0xbc, hi: 0xbc}, // Block 0x2b, offset 0x11f {value: 0x0000, lo: 0x01}, {value: 0xa000, lo: 0x80, hi: 0x92}, // Block 0x2c, offset 0x121 {value: 0x0000, lo: 0x01}, {value: 0xb900, lo: 0xa1, hi: 0xb5}, // Block 0x2d, offset 0x123 {value: 0x0000, lo: 0x01}, {value: 0x9900, lo: 0xa8, hi: 0xbf}, // Block 0x2e, offset 0x125 {value: 0x0000, lo: 0x01}, {value: 0x9900, lo: 0x80, hi: 0x82}, // Block 0x2f, offset 0x127 {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0x9d, hi: 0x9f}, // Block 0x30, offset 0x129 {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0x94, hi: 0x94}, {value: 0x8104, lo: 0xb4, hi: 0xb4}, // Block 0x31, offset 0x12c {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0x92, hi: 0x92}, {value: 0x8132, lo: 0x9d, hi: 0x9d}, // Block 0x32, offset 0x12f {value: 0x0000, lo: 0x01}, {value: 0x8131, lo: 0xa9, hi: 0xa9}, // Block 0x33, offset 0x131 {value: 0x0004, lo: 0x02}, {value: 0x812e, lo: 0xb9, hi: 0xba}, {value: 0x812d, lo: 0xbb, hi: 0xbb}, // Block 0x34, offset 0x134 {value: 0x0000, lo: 0x02}, {value: 0x8132, lo: 0x97, hi: 0x97}, {value: 0x812d, lo: 0x98, hi: 0x98}, // Block 0x35, offset 0x137 {value: 0x0000, lo: 0x03}, {value: 0x8104, lo: 0xa0, hi: 0xa0}, {value: 0x8132, lo: 0xb5, hi: 0xbc}, {value: 0x812d, lo: 0xbf, hi: 0xbf}, // Block 0x36, offset 0x13b {value: 0x0000, lo: 0x04}, {value: 0x8132, lo: 0xb0, hi: 0xb4}, {value: 0x812d, lo: 0xb5, hi: 0xba}, {value: 0x8132, lo: 0xbb, hi: 0xbc}, {value: 0x812d, lo: 0xbd, hi: 0xbd}, // Block 0x37, offset 0x140 {value: 0x0000, lo: 0x08}, {value: 0x2d66, lo: 0x80, hi: 0x80}, {value: 0x2d6e, lo: 0x81, hi: 0x81}, {value: 0xa000, lo: 0x82, hi: 0x82}, {value: 0x2d76, lo: 0x83, hi: 0x83}, {value: 0x8104, lo: 0x84, hi: 0x84}, {value: 0x8132, lo: 0xab, hi: 0xab}, {value: 0x812d, lo: 0xac, hi: 0xac}, {value: 0x8132, lo: 0xad, hi: 0xb3}, // Block 0x38, offset 0x149 {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0xaa, hi: 0xab}, // Block 0x39, offset 0x14b {value: 0x0000, lo: 0x02}, {value: 0x8102, lo: 0xa6, hi: 0xa6}, {value: 0x8104, lo: 0xb2, hi: 0xb3}, // Block 0x3a, offset 0x14e {value: 0x0000, lo: 0x01}, {value: 0x8102, lo: 0xb7, hi: 0xb7}, // Block 0x3b, offset 0x150 {value: 0x0000, lo: 0x0a}, {value: 0x8132, lo: 0x90, hi: 0x92}, {value: 0x8101, lo: 0x94, hi: 0x94}, {value: 0x812d, lo: 0x95, hi: 0x99}, {value: 0x8132, lo: 0x9a, hi: 0x9b}, {value: 0x812d, lo: 0x9c, hi: 0x9f}, {value: 0x8132, lo: 0xa0, hi: 0xa0}, {value: 0x8101, lo: 0xa2, hi: 0xa8}, {value: 0x812d, lo: 0xad, hi: 0xad}, {value: 0x8132, lo: 0xb4, hi: 0xb4}, {value: 0x8132, lo: 0xb8, hi: 0xb9}, // Block 0x3c, offset 0x15b {value: 0x0002, lo: 0x0a}, {value: 0x0043, lo: 0xac, hi: 0xac}, {value: 0x00d1, lo: 0xad, hi: 0xad}, {value: 0x0045, lo: 0xae, hi: 0xae}, {value: 0x0049, lo: 0xb0, hi: 0xb1}, {value: 0x00e6, lo: 0xb2, hi: 0xb2}, {value: 0x004f, lo: 0xb3, hi: 0xba}, {value: 0x005f, lo: 0xbc, hi: 0xbc}, {value: 0x00ef, lo: 0xbd, hi: 0xbd}, {value: 0x0061, lo: 0xbe, hi: 0xbe}, {value: 0x0065, lo: 0xbf, hi: 0xbf}, // Block 0x3d, offset 0x166 {value: 0x0000, lo: 0x0f}, {value: 0x8132, lo: 0x80, hi: 0x81}, {value: 0x812d, lo: 0x82, hi: 0x82}, {value: 0x8132, lo: 0x83, hi: 0x89}, {value: 0x812d, lo: 0x8a, hi: 0x8a}, {value: 0x8132, lo: 0x8b, hi: 0x8c}, {value: 0x8135, lo: 0x8d, hi: 0x8d}, {value: 0x812a, lo: 0x8e, hi: 0x8e}, {value: 0x812d, lo: 0x8f, hi: 0x8f}, {value: 0x8129, lo: 0x90, hi: 0x90}, {value: 0x8132, lo: 0x91, hi: 0xb5}, {value: 0x8132, lo: 0xbb, hi: 0xbb}, {value: 0x8134, lo: 0xbc, hi: 0xbc}, {value: 0x812d, lo: 0xbd, hi: 0xbd}, {value: 0x8132, lo: 0xbe, hi: 0xbe}, {value: 0x812d, lo: 0xbf, hi: 0xbf}, // Block 0x3e, offset 0x176 {value: 0x0000, lo: 0x0d}, {value: 0x0001, lo: 0x80, hi: 0x8a}, {value: 0x043b, lo: 0x91, hi: 0x91}, {value: 0x429b, lo: 0x97, hi: 0x97}, {value: 0x001d, lo: 0xa4, hi: 0xa4}, {value: 0x1873, lo: 0xa5, hi: 0xa5}, {value: 0x1b5c, lo: 0xa6, hi: 0xa6}, {value: 0x0001, lo: 0xaf, hi: 0xaf}, {value: 0x2691, lo: 0xb3, hi: 0xb3}, {value: 0x27fe, lo: 0xb4, hi: 0xb4}, {value: 0x2698, lo: 0xb6, hi: 0xb6}, {value: 0x2808, lo: 0xb7, hi: 0xb7}, {value: 0x186d, lo: 0xbc, hi: 0xbc}, {value: 0x4269, lo: 0xbe, hi: 0xbe}, // Block 0x3f, offset 0x184 {value: 0x0002, lo: 0x0d}, {value: 0x1933, lo: 0x87, hi: 0x87}, {value: 0x1930, lo: 0x88, hi: 0x88}, {value: 0x1870, lo: 0x89, hi: 0x89}, {value: 0x298e, lo: 0x97, hi: 0x97}, {value: 0x0001, lo: 0x9f, hi: 0x9f}, {value: 0x0021, lo: 0xb0, hi: 0xb0}, {value: 0x0093, lo: 0xb1, hi: 0xb1}, {value: 0x0029, lo: 0xb4, hi: 0xb9}, {value: 0x0017, lo: 0xba, hi: 0xba}, {value: 0x0467, lo: 0xbb, hi: 0xbb}, {value: 0x003b, lo: 0xbc, hi: 0xbc}, {value: 0x0011, lo: 0xbd, hi: 0xbe}, {value: 0x009d, lo: 0xbf, hi: 0xbf}, // Block 0x40, offset 0x192 {value: 0x0002, lo: 0x0f}, {value: 0x0021, lo: 0x80, hi: 0x89}, {value: 0x0017, lo: 0x8a, hi: 0x8a}, {value: 0x0467, lo: 0x8b, hi: 0x8b}, {value: 0x003b, lo: 0x8c, hi: 0x8c}, {value: 0x0011, lo: 0x8d, hi: 0x8e}, {value: 0x0083, lo: 0x90, hi: 0x90}, {value: 0x008b, lo: 0x91, hi: 0x91}, {value: 0x009f, lo: 0x92, hi: 0x92}, {value: 0x00b1, lo: 0x93, hi: 0x93}, {value: 0x0104, lo: 0x94, hi: 0x94}, {value: 0x0091, lo: 0x95, hi: 0x95}, {value: 0x0097, lo: 0x96, hi: 0x99}, {value: 0x00a1, lo: 0x9a, hi: 0x9a}, {value: 0x00a7, lo: 0x9b, hi: 0x9c}, {value: 0x1999, lo: 0xa8, hi: 0xa8}, // Block 0x41, offset 0x1a2 {value: 0x0000, lo: 0x0d}, {value: 0x8132, lo: 0x90, hi: 0x91}, {value: 0x8101, lo: 0x92, hi: 0x93}, {value: 0x8132, lo: 0x94, hi: 0x97}, {value: 0x8101, lo: 0x98, hi: 0x9a}, {value: 0x8132, lo: 0x9b, hi: 0x9c}, {value: 0x8132, lo: 0xa1, hi: 0xa1}, {value: 0x8101, lo: 0xa5, hi: 0xa6}, {value: 0x8132, lo: 0xa7, hi: 0xa7}, {value: 0x812d, lo: 0xa8, hi: 0xa8}, {value: 0x8132, lo: 0xa9, hi: 0xa9}, {value: 0x8101, lo: 0xaa, hi: 0xab}, {value: 0x812d, lo: 0xac, hi: 0xaf}, {value: 0x8132, lo: 0xb0, hi: 0xb0}, // Block 0x42, offset 0x1b0 {value: 0x0007, lo: 0x06}, {value: 0x2180, lo: 0x89, hi: 0x89}, {value: 0xa000, lo: 0x90, hi: 0x90}, {value: 0xa000, lo: 0x92, hi: 0x92}, {value: 0xa000, lo: 0x94, hi: 0x94}, {value: 0x3bb9, lo: 0x9a, hi: 0x9b}, {value: 0x3bc7, lo: 0xae, hi: 0xae}, // Block 0x43, offset 0x1b7 {value: 0x000e, lo: 0x05}, {value: 0x3bce, lo: 0x8d, hi: 0x8e}, {value: 0x3bd5, lo: 0x8f, hi: 0x8f}, {value: 0xa000, lo: 0x90, hi: 0x90}, {value: 0xa000, lo: 0x92, hi: 0x92}, {value: 0xa000, lo: 0x94, hi: 0x94}, // Block 0x44, offset 0x1bd {value: 0x0173, lo: 0x0e}, {value: 0xa000, lo: 0x83, hi: 0x83}, {value: 0x3be3, lo: 0x84, hi: 0x84}, {value: 0xa000, lo: 0x88, hi: 0x88}, {value: 0x3bea, lo: 0x89, hi: 0x89}, {value: 0xa000, lo: 0x8b, hi: 0x8b}, {value: 0x3bf1, lo: 0x8c, hi: 0x8c}, {value: 0xa000, lo: 0xa3, hi: 0xa3}, {value: 0x3bf8, lo: 0xa4, hi: 0xa4}, {value: 0xa000, lo: 0xa5, hi: 0xa5}, {value: 0x3bff, lo: 0xa6, hi: 0xa6}, {value: 0x269f, lo: 0xac, hi: 0xad}, {value: 0x26a6, lo: 0xaf, hi: 0xaf}, {value: 0x281c, lo: 0xb0, hi: 0xb0}, {value: 0xa000, lo: 0xbc, hi: 0xbc}, // Block 0x45, offset 0x1cc {value: 0x0007, lo: 0x03}, {value: 0x3c68, lo: 0xa0, hi: 0xa1}, {value: 0x3c92, lo: 0xa2, hi: 0xa3}, {value: 0x3cbc, lo: 0xaa, hi: 0xad}, // Block 0x46, offset 0x1d0 {value: 0x0004, lo: 0x01}, {value: 0x048b, lo: 0xa9, hi: 0xaa}, // Block 0x47, offset 0x1d2 {value: 0x0002, lo: 0x03}, {value: 0x0057, lo: 0x80, hi: 0x8f}, {value: 0x0083, lo: 0x90, hi: 0xa9}, {value: 0x0021, lo: 0xaa, hi: 0xaa}, // Block 0x48, offset 0x1d6 {value: 0x0000, lo: 0x01}, {value: 0x299b, lo: 0x8c, hi: 0x8c}, // Block 0x49, offset 0x1d8 {value: 0x0263, lo: 0x02}, {value: 0x1b8c, lo: 0xb4, hi: 0xb4}, {value: 0x192d, lo: 0xb5, hi: 0xb6}, // Block 0x4a, offset 0x1db {value: 0x0000, lo: 0x01}, {value: 0x44dd, lo: 0x9c, hi: 0x9c}, // Block 0x4b, offset 0x1dd {value: 0x0000, lo: 0x02}, {value: 0x0095, lo: 0xbc, hi: 0xbc}, {value: 0x006d, lo: 0xbd, hi: 0xbd}, // Block 0x4c, offset 0x1e0 {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0xaf, hi: 0xb1}, // Block 0x4d, offset 0x1e2 {value: 0x0000, lo: 0x02}, {value: 0x047f, lo: 0xaf, hi: 0xaf}, {value: 0x8104, lo: 0xbf, hi: 0xbf}, // Block 0x4e, offset 0x1e5 {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0xa0, hi: 0xbf}, // Block 0x4f, offset 0x1e7 {value: 0x0000, lo: 0x01}, {value: 0x0dc3, lo: 0x9f, hi: 0x9f}, // Block 0x50, offset 0x1e9 {value: 0x0000, lo: 0x01}, {value: 0x162f, lo: 0xb3, hi: 0xb3}, // Block 0x51, offset 0x1eb {value: 0x0004, lo: 0x0b}, {value: 0x1597, lo: 0x80, hi: 0x82}, {value: 0x15af, lo: 0x83, hi: 0x83}, {value: 0x15c7, lo: 0x84, hi: 0x85}, {value: 0x15d7, lo: 0x86, hi: 0x89}, {value: 0x15eb, lo: 0x8a, hi: 0x8c}, {value: 0x15ff, lo: 0x8d, hi: 0x8d}, {value: 0x1607, lo: 0x8e, hi: 0x8e}, {value: 0x160f, lo: 0x8f, hi: 0x90}, {value: 0x161b, lo: 0x91, hi: 0x93}, {value: 0x162b, lo: 0x94, hi: 0x94}, {value: 0x1633, lo: 0x95, hi: 0x95}, // Block 0x52, offset 0x1f7 {value: 0x0004, lo: 0x09}, {value: 0x0001, lo: 0x80, hi: 0x80}, {value: 0x812c, lo: 0xaa, hi: 0xaa}, {value: 0x8131, lo: 0xab, hi: 0xab}, {value: 0x8133, lo: 0xac, hi: 0xac}, {value: 0x812e, lo: 0xad, hi: 0xad}, {value: 0x812f, lo: 0xae, hi: 0xae}, {value: 0x812f, lo: 0xaf, hi: 0xaf}, {value: 0x04b3, lo: 0xb6, hi: 0xb6}, {value: 0x0887, lo: 0xb8, hi: 0xba}, // Block 0x53, offset 0x201 {value: 0x0006, lo: 0x09}, {value: 0x0313, lo: 0xb1, hi: 0xb1}, {value: 0x0317, lo: 0xb2, hi: 0xb2}, {value: 0x4a3b, lo: 0xb3, hi: 0xb3}, {value: 0x031b, lo: 0xb4, hi: 0xb4}, {value: 0x4a41, lo: 0xb5, hi: 0xb6}, {value: 0x031f, lo: 0xb7, hi: 0xb7}, {value: 0x0323, lo: 0xb8, hi: 0xb8}, {value: 0x0327, lo: 0xb9, hi: 0xb9}, {value: 0x4a4d, lo: 0xba, hi: 0xbf}, // Block 0x54, offset 0x20b {value: 0x0000, lo: 0x02}, {value: 0x8132, lo: 0xaf, hi: 0xaf}, {value: 0x8132, lo: 0xb4, hi: 0xbd}, // Block 0x55, offset 0x20e {value: 0x0000, lo: 0x03}, {value: 0x020f, lo: 0x9c, hi: 0x9c}, {value: 0x0212, lo: 0x9d, hi: 0x9d}, {value: 0x8132, lo: 0x9e, hi: 0x9f}, // Block 0x56, offset 0x212 {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0xb0, hi: 0xb1}, // Block 0x57, offset 0x214 {value: 0x0000, lo: 0x01}, {value: 0x163b, lo: 0xb0, hi: 0xb0}, // Block 0x58, offset 0x216 {value: 0x000c, lo: 0x01}, {value: 0x00d7, lo: 0xb8, hi: 0xb9}, // Block 0x59, offset 0x218 {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0x86, hi: 0x86}, // Block 0x5a, offset 0x21a {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0x84, hi: 0x84}, {value: 0x8132, lo: 0xa0, hi: 0xb1}, // Block 0x5b, offset 0x21d {value: 0x0000, lo: 0x01}, {value: 0x812d, lo: 0xab, hi: 0xad}, // Block 0x5c, offset 0x21f {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0x93, hi: 0x93}, // Block 0x5d, offset 0x221 {value: 0x0000, lo: 0x01}, {value: 0x8102, lo: 0xb3, hi: 0xb3}, // Block 0x5e, offset 0x223 {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0x80, hi: 0x80}, // Block 0x5f, offset 0x225 {value: 0x0000, lo: 0x05}, {value: 0x8132, lo: 0xb0, hi: 0xb0}, {value: 0x8132, lo: 0xb2, hi: 0xb3}, {value: 0x812d, lo: 0xb4, hi: 0xb4}, {value: 0x8132, lo: 0xb7, hi: 0xb8}, {value: 0x8132, lo: 0xbe, hi: 0xbf}, // Block 0x60, offset 0x22b {value: 0x0000, lo: 0x02}, {value: 0x8132, lo: 0x81, hi: 0x81}, {value: 0x8104, lo: 0xb6, hi: 0xb6}, // Block 0x61, offset 0x22e {value: 0x0008, lo: 0x03}, {value: 0x1637, lo: 0x9c, hi: 0x9d}, {value: 0x0125, lo: 0x9e, hi: 0x9e}, {value: 0x1643, lo: 0x9f, hi: 0x9f}, // Block 0x62, offset 0x232 {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0xad, hi: 0xad}, // Block 0x63, offset 0x234 {value: 0x0000, lo: 0x06}, {value: 0xe500, lo: 0x80, hi: 0x80}, {value: 0xc600, lo: 0x81, hi: 0x9b}, {value: 0xe500, lo: 0x9c, hi: 0x9c}, {value: 0xc600, lo: 0x9d, hi: 0xb7}, {value: 0xe500, lo: 0xb8, hi: 0xb8}, {value: 0xc600, lo: 0xb9, hi: 0xbf}, // Block 0x64, offset 0x23b {value: 0x0000, lo: 0x05}, {value: 0xc600, lo: 0x80, hi: 0x93}, {value: 0xe500, lo: 0x94, hi: 0x94}, {value: 0xc600, lo: 0x95, hi: 0xaf}, {value: 0xe500, lo: 0xb0, hi: 0xb0}, {value: 0xc600, lo: 0xb1, hi: 0xbf}, // Block 0x65, offset 0x241 {value: 0x0000, lo: 0x05}, {value: 0xc600, lo: 0x80, hi: 0x8b}, {value: 0xe500, lo: 0x8c, hi: 0x8c}, {value: 0xc600, lo: 0x8d, hi: 0xa7}, {value: 0xe500, lo: 0xa8, hi: 0xa8}, {value: 0xc600, lo: 0xa9, hi: 0xbf}, // Block 0x66, offset 0x247 {value: 0x0000, lo: 0x07}, {value: 0xc600, lo: 0x80, hi: 0x83}, {value: 0xe500, lo: 0x84, hi: 0x84}, {value: 0xc600, lo: 0x85, hi: 0x9f}, {value: 0xe500, lo: 0xa0, hi: 0xa0}, {value: 0xc600, lo: 0xa1, hi: 0xbb}, {value: 0xe500, lo: 0xbc, hi: 0xbc}, {value: 0xc600, lo: 0xbd, hi: 0xbf}, // Block 0x67, offset 0x24f {value: 0x0000, lo: 0x05}, {value: 0xc600, lo: 0x80, hi: 0x97}, {value: 0xe500, lo: 0x98, hi: 0x98}, {value: 0xc600, lo: 0x99, hi: 0xb3}, {value: 0xe500, lo: 0xb4, hi: 0xb4}, {value: 0xc600, lo: 0xb5, hi: 0xbf}, // Block 0x68, offset 0x255 {value: 0x0000, lo: 0x05}, {value: 0xc600, lo: 0x80, hi: 0x8f}, {value: 0xe500, lo: 0x90, hi: 0x90}, {value: 0xc600, lo: 0x91, hi: 0xab}, {value: 0xe500, lo: 0xac, hi: 0xac}, {value: 0xc600, lo: 0xad, hi: 0xbf}, // Block 0x69, offset 0x25b {value: 0x0000, lo: 0x05}, {value: 0xc600, lo: 0x80, hi: 0x87}, {value: 0xe500, lo: 0x88, hi: 0x88}, {value: 0xc600, lo: 0x89, hi: 0xa3}, {value: 0xe500, lo: 0xa4, hi: 0xa4}, {value: 0xc600, lo: 0xa5, hi: 0xbf}, // Block 0x6a, offset 0x261 {value: 0x0000, lo: 0x03}, {value: 0xc600, lo: 0x80, hi: 0x87}, {value: 0xe500, lo: 0x88, hi: 0x88}, {value: 0xc600, lo: 0x89, hi: 0xa3}, // Block 0x6b, offset 0x265 {value: 0x0002, lo: 0x01}, {value: 0x0003, lo: 0x81, hi: 0xbf}, // Block 0x6c, offset 0x267 {value: 0x0000, lo: 0x01}, {value: 0x812d, lo: 0xbd, hi: 0xbd}, // Block 0x6d, offset 0x269 {value: 0x0000, lo: 0x01}, {value: 0x812d, lo: 0xa0, hi: 0xa0}, // Block 0x6e, offset 0x26b {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0xb6, hi: 0xba}, // Block 0x6f, offset 0x26d {value: 0x002c, lo: 0x05}, {value: 0x812d, lo: 0x8d, hi: 0x8d}, {value: 0x8132, lo: 0x8f, hi: 0x8f}, {value: 0x8132, lo: 0xb8, hi: 0xb8}, {value: 0x8101, lo: 0xb9, hi: 0xba}, {value: 0x8104, lo: 0xbf, hi: 0xbf}, // Block 0x70, offset 0x273 {value: 0x0000, lo: 0x02}, {value: 0x8132, lo: 0xa5, hi: 0xa5}, {value: 0x812d, lo: 0xa6, hi: 0xa6}, // Block 0x71, offset 0x276 {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0x86, hi: 0x86}, {value: 0x8104, lo: 0xbf, hi: 0xbf}, // Block 0x72, offset 0x279 {value: 0x17fe, lo: 0x07}, {value: 0xa000, lo: 0x99, hi: 0x99}, {value: 0x4238, lo: 0x9a, hi: 0x9a}, {value: 0xa000, lo: 0x9b, hi: 0x9b}, {value: 0x4242, lo: 0x9c, hi: 0x9c}, {value: 0xa000, lo: 0xa5, hi: 0xa5}, {value: 0x424c, lo: 0xab, hi: 0xab}, {value: 0x8104, lo: 0xb9, hi: 0xba}, // Block 0x73, offset 0x281 {value: 0x0000, lo: 0x06}, {value: 0x8132, lo: 0x80, hi: 0x82}, {value: 0x9900, lo: 0xa7, hi: 0xa7}, {value: 0x2d7e, lo: 0xae, hi: 0xae}, {value: 0x2d88, lo: 0xaf, hi: 0xaf}, {value: 0xa000, lo: 0xb1, hi: 0xb2}, {value: 0x8104, lo: 0xb3, hi: 0xb4}, // Block 0x74, offset 0x288 {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0x80, hi: 0x80}, {value: 0x8102, lo: 0x8a, hi: 0x8a}, // Block 0x75, offset 0x28b {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0xb5, hi: 0xb5}, {value: 0x8102, lo: 0xb6, hi: 0xb6}, // Block 0x76, offset 0x28e {value: 0x0002, lo: 0x01}, {value: 0x8102, lo: 0xa9, hi: 0xaa}, // Block 0x77, offset 0x290 {value: 0x0000, lo: 0x07}, {value: 0xa000, lo: 0x87, hi: 0x87}, {value: 0x2d92, lo: 0x8b, hi: 0x8b}, {value: 0x2d9c, lo: 0x8c, hi: 0x8c}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x9900, lo: 0x97, hi: 0x97}, {value: 0x8132, lo: 0xa6, hi: 0xac}, {value: 0x8132, lo: 0xb0, hi: 0xb4}, // Block 0x78, offset 0x298 {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0x82, hi: 0x82}, {value: 0x8102, lo: 0x86, hi: 0x86}, // Block 0x79, offset 0x29b {value: 0x6b5a, lo: 0x06}, {value: 0x9900, lo: 0xb0, hi: 0xb0}, {value: 0xa000, lo: 0xb9, hi: 0xb9}, {value: 0x9900, lo: 0xba, hi: 0xba}, {value: 0x2db0, lo: 0xbb, hi: 0xbb}, {value: 0x2da6, lo: 0xbc, hi: 0xbd}, {value: 0x2dba, lo: 0xbe, hi: 0xbe}, // Block 0x7a, offset 0x2a2 {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0x82, hi: 0x82}, {value: 0x8102, lo: 0x83, hi: 0x83}, // Block 0x7b, offset 0x2a5 {value: 0x0000, lo: 0x05}, {value: 0x9900, lo: 0xaf, hi: 0xaf}, {value: 0xa000, lo: 0xb8, hi: 0xb9}, {value: 0x2dc4, lo: 0xba, hi: 0xba}, {value: 0x2dce, lo: 0xbb, hi: 0xbb}, {value: 0x8104, lo: 0xbf, hi: 0xbf}, // Block 0x7c, offset 0x2ab {value: 0x0000, lo: 0x01}, {value: 0x8102, lo: 0x80, hi: 0x80}, // Block 0x7d, offset 0x2ad {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0xbf, hi: 0xbf}, // Block 0x7e, offset 0x2af {value: 0x0000, lo: 0x02}, {value: 0x8104, lo: 0xb6, hi: 0xb6}, {value: 0x8102, lo: 0xb7, hi: 0xb7}, // Block 0x7f, offset 0x2b2 {value: 0x0000, lo: 0x01}, {value: 0x8104, lo: 0xab, hi: 0xab}, // Block 0x80, offset 0x2b4 {value: 0x0000, lo: 0x01}, {value: 0x8101, lo: 0xb0, hi: 0xb4}, // Block 0x81, offset 0x2b6 {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0xb0, hi: 0xb6}, // Block 0x82, offset 0x2b8 {value: 0x0000, lo: 0x01}, {value: 0x8101, lo: 0x9e, hi: 0x9e}, // Block 0x83, offset 0x2ba {value: 0x0000, lo: 0x0c}, {value: 0x45cc, lo: 0x9e, hi: 0x9e}, {value: 0x45d6, lo: 0x9f, hi: 0x9f}, {value: 0x460a, lo: 0xa0, hi: 0xa0}, {value: 0x4618, lo: 0xa1, hi: 0xa1}, {value: 0x4626, lo: 0xa2, hi: 0xa2}, {value: 0x4634, lo: 0xa3, hi: 0xa3}, {value: 0x4642, lo: 0xa4, hi: 0xa4}, {value: 0x812b, lo: 0xa5, hi: 0xa6}, {value: 0x8101, lo: 0xa7, hi: 0xa9}, {value: 0x8130, lo: 0xad, hi: 0xad}, {value: 0x812b, lo: 0xae, hi: 0xb2}, {value: 0x812d, lo: 0xbb, hi: 0xbf}, // Block 0x84, offset 0x2c7 {value: 0x0000, lo: 0x09}, {value: 0x812d, lo: 0x80, hi: 0x82}, {value: 0x8132, lo: 0x85, hi: 0x89}, {value: 0x812d, lo: 0x8a, hi: 0x8b}, {value: 0x8132, lo: 0xaa, hi: 0xad}, {value: 0x45e0, lo: 0xbb, hi: 0xbb}, {value: 0x45ea, lo: 0xbc, hi: 0xbc}, {value: 0x4650, lo: 0xbd, hi: 0xbd}, {value: 0x466c, lo: 0xbe, hi: 0xbe}, {value: 0x465e, lo: 0xbf, hi: 0xbf}, // Block 0x85, offset 0x2d1 {value: 0x0000, lo: 0x01}, {value: 0x467a, lo: 0x80, hi: 0x80}, // Block 0x86, offset 0x2d3 {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0x82, hi: 0x84}, // Block 0x87, offset 0x2d5 {value: 0x0002, lo: 0x03}, {value: 0x0043, lo: 0x80, hi: 0x99}, {value: 0x0083, lo: 0x9a, hi: 0xb3}, {value: 0x0043, lo: 0xb4, hi: 0xbf}, // Block 0x88, offset 0x2d9 {value: 0x0002, lo: 0x04}, {value: 0x005b, lo: 0x80, hi: 0x8d}, {value: 0x0083, lo: 0x8e, hi: 0x94}, {value: 0x0093, lo: 0x96, hi: 0xa7}, {value: 0x0043, lo: 0xa8, hi: 0xbf}, // Block 0x89, offset 0x2de {value: 0x0002, lo: 0x0b}, {value: 0x0073, lo: 0x80, hi: 0x81}, {value: 0x0083, lo: 0x82, hi: 0x9b}, {value: 0x0043, lo: 0x9c, hi: 0x9c}, {value: 0x0047, lo: 0x9e, hi: 0x9f}, {value: 0x004f, lo: 0xa2, hi: 0xa2}, {value: 0x0055, lo: 0xa5, hi: 0xa6}, {value: 0x005d, lo: 0xa9, hi: 0xac}, {value: 0x0067, lo: 0xae, hi: 0xb5}, {value: 0x0083, lo: 0xb6, hi: 0xb9}, {value: 0x008d, lo: 0xbb, hi: 0xbb}, {value: 0x0091, lo: 0xbd, hi: 0xbf}, // Block 0x8a, offset 0x2ea {value: 0x0002, lo: 0x04}, {value: 0x0097, lo: 0x80, hi: 0x83}, {value: 0x00a1, lo: 0x85, hi: 0x8f}, {value: 0x0043, lo: 0x90, hi: 0xa9}, {value: 0x0083, lo: 0xaa, hi: 0xbf}, // Block 0x8b, offset 0x2ef {value: 0x0002, lo: 0x08}, {value: 0x00af, lo: 0x80, hi: 0x83}, {value: 0x0043, lo: 0x84, hi: 0x85}, {value: 0x0049, lo: 0x87, hi: 0x8a}, {value: 0x0055, lo: 0x8d, hi: 0x94}, {value: 0x0067, lo: 0x96, hi: 0x9c}, {value: 0x0083, lo: 0x9e, hi: 0xb7}, {value: 0x0043, lo: 0xb8, hi: 0xb9}, {value: 0x0049, lo: 0xbb, hi: 0xbe}, // Block 0x8c, offset 0x2f8 {value: 0x0002, lo: 0x05}, {value: 0x0053, lo: 0x80, hi: 0x84}, {value: 0x005f, lo: 0x86, hi: 0x86}, {value: 0x0067, lo: 0x8a, hi: 0x90}, {value: 0x0083, lo: 0x92, hi: 0xab}, {value: 0x0043, lo: 0xac, hi: 0xbf}, // Block 0x8d, offset 0x2fe {value: 0x0002, lo: 0x04}, {value: 0x006b, lo: 0x80, hi: 0x85}, {value: 0x0083, lo: 0x86, hi: 0x9f}, {value: 0x0043, lo: 0xa0, hi: 0xb9}, {value: 0x0083, lo: 0xba, hi: 0xbf}, // Block 0x8e, offset 0x303 {value: 0x0002, lo: 0x03}, {value: 0x008f, lo: 0x80, hi: 0x93}, {value: 0x0043, lo: 0x94, hi: 0xad}, {value: 0x0083, lo: 0xae, hi: 0xbf}, // Block 0x8f, offset 0x307 {value: 0x0002, lo: 0x04}, {value: 0x00a7, lo: 0x80, hi: 0x87}, {value: 0x0043, lo: 0x88, hi: 0xa1}, {value: 0x0083, lo: 0xa2, hi: 0xbb}, {value: 0x0043, lo: 0xbc, hi: 0xbf}, // Block 0x90, offset 0x30c {value: 0x0002, lo: 0x03}, {value: 0x004b, lo: 0x80, hi: 0x95}, {value: 0x0083, lo: 0x96, hi: 0xaf}, {value: 0x0043, lo: 0xb0, hi: 0xbf}, // Block 0x91, offset 0x310 {value: 0x0003, lo: 0x0f}, {value: 0x01b8, lo: 0x80, hi: 0x80}, {value: 0x045f, lo: 0x81, hi: 0x81}, {value: 0x01bb, lo: 0x82, hi: 0x9a}, {value: 0x045b, lo: 0x9b, hi: 0x9b}, {value: 0x01c7, lo: 0x9c, hi: 0x9c}, {value: 0x01d0, lo: 0x9d, hi: 0x9d}, {value: 0x01d6, lo: 0x9e, hi: 0x9e}, {value: 0x01fa, lo: 0x9f, hi: 0x9f}, {value: 0x01eb, lo: 0xa0, hi: 0xa0}, {value: 0x01e8, lo: 0xa1, hi: 0xa1}, {value: 0x0173, lo: 0xa2, hi: 0xb2}, {value: 0x0188, lo: 0xb3, hi: 0xb3}, {value: 0x01a6, lo: 0xb4, hi: 0xba}, {value: 0x045f, lo: 0xbb, hi: 0xbb}, {value: 0x01bb, lo: 0xbc, hi: 0xbf}, // Block 0x92, offset 0x320 {value: 0x0003, lo: 0x0d}, {value: 0x01c7, lo: 0x80, hi: 0x94}, {value: 0x045b, lo: 0x95, hi: 0x95}, {value: 0x01c7, lo: 0x96, hi: 0x96}, {value: 0x01d0, lo: 0x97, hi: 0x97}, {value: 0x01d6, lo: 0x98, hi: 0x98}, {value: 0x01fa, lo: 0x99, hi: 0x99}, {value: 0x01eb, lo: 0x9a, hi: 0x9a}, {value: 0x01e8, lo: 0x9b, hi: 0x9b}, {value: 0x0173, lo: 0x9c, hi: 0xac}, {value: 0x0188, lo: 0xad, hi: 0xad}, {value: 0x01a6, lo: 0xae, hi: 0xb4}, {value: 0x045f, lo: 0xb5, hi: 0xb5}, {value: 0x01bb, lo: 0xb6, hi: 0xbf}, // Block 0x93, offset 0x32e {value: 0x0003, lo: 0x0d}, {value: 0x01d9, lo: 0x80, hi: 0x8e}, {value: 0x045b, lo: 0x8f, hi: 0x8f}, {value: 0x01c7, lo: 0x90, hi: 0x90}, {value: 0x01d0, lo: 0x91, hi: 0x91}, {value: 0x01d6, lo: 0x92, hi: 0x92}, {value: 0x01fa, lo: 0x93, hi: 0x93}, {value: 0x01eb, lo: 0x94, hi: 0x94}, {value: 0x01e8, lo: 0x95, hi: 0x95}, {value: 0x0173, lo: 0x96, hi: 0xa6}, {value: 0x0188, lo: 0xa7, hi: 0xa7}, {value: 0x01a6, lo: 0xa8, hi: 0xae}, {value: 0x045f, lo: 0xaf, hi: 0xaf}, {value: 0x01bb, lo: 0xb0, hi: 0xbf}, // Block 0x94, offset 0x33c {value: 0x0003, lo: 0x0d}, {value: 0x01eb, lo: 0x80, hi: 0x88}, {value: 0x045b, lo: 0x89, hi: 0x89}, {value: 0x01c7, lo: 0x8a, hi: 0x8a}, {value: 0x01d0, lo: 0x8b, hi: 0x8b}, {value: 0x01d6, lo: 0x8c, hi: 0x8c}, {value: 0x01fa, lo: 0x8d, hi: 0x8d}, {value: 0x01eb, lo: 0x8e, hi: 0x8e}, {value: 0x01e8, lo: 0x8f, hi: 0x8f}, {value: 0x0173, lo: 0x90, hi: 0xa0}, {value: 0x0188, lo: 0xa1, hi: 0xa1}, {value: 0x01a6, lo: 0xa2, hi: 0xa8}, {value: 0x045f, lo: 0xa9, hi: 0xa9}, {value: 0x01bb, lo: 0xaa, hi: 0xbf}, // Block 0x95, offset 0x34a {value: 0x0000, lo: 0x05}, {value: 0x8132, lo: 0x80, hi: 0x86}, {value: 0x8132, lo: 0x88, hi: 0x98}, {value: 0x8132, lo: 0x9b, hi: 0xa1}, {value: 0x8132, lo: 0xa3, hi: 0xa4}, {value: 0x8132, lo: 0xa6, hi: 0xaa}, // Block 0x96, offset 0x350 {value: 0x0000, lo: 0x01}, {value: 0x812d, lo: 0x90, hi: 0x96}, // Block 0x97, offset 0x352 {value: 0x0000, lo: 0x02}, {value: 0x8132, lo: 0x84, hi: 0x89}, {value: 0x8102, lo: 0x8a, hi: 0x8a}, // Block 0x98, offset 0x355 {value: 0x0002, lo: 0x09}, {value: 0x0063, lo: 0x80, hi: 0x89}, {value: 0x1951, lo: 0x8a, hi: 0x8a}, {value: 0x1981, lo: 0x8b, hi: 0x8b}, {value: 0x199c, lo: 0x8c, hi: 0x8c}, {value: 0x19a2, lo: 0x8d, hi: 0x8d}, {value: 0x1bc0, lo: 0x8e, hi: 0x8e}, {value: 0x19ae, lo: 0x8f, hi: 0x8f}, {value: 0x197b, lo: 0xaa, hi: 0xaa}, {value: 0x197e, lo: 0xab, hi: 0xab}, // Block 0x99, offset 0x35f {value: 0x0000, lo: 0x01}, {value: 0x193f, lo: 0x90, hi: 0x90}, // Block 0x9a, offset 0x361 {value: 0x0028, lo: 0x09}, {value: 0x2862, lo: 0x80, hi: 0x80}, {value: 0x2826, lo: 0x81, hi: 0x81}, {value: 0x2830, lo: 0x82, hi: 0x82}, {value: 0x2844, lo: 0x83, hi: 0x84}, {value: 0x284e, lo: 0x85, hi: 0x86}, {value: 0x283a, lo: 0x87, hi: 0x87}, {value: 0x2858, lo: 0x88, hi: 0x88}, {value: 0x0b6f, lo: 0x90, hi: 0x90}, {value: 0x08e7, lo: 0x91, hi: 0x91}, } // recompMap: 7520 bytes (entries only) var recompMap = map[uint32]rune{ 0x00410300: 0x00C0, 0x00410301: 0x00C1, 0x00410302: 0x00C2, 0x00410303: 0x00C3, 0x00410308: 0x00C4, 0x0041030A: 0x00C5, 0x00430327: 0x00C7, 0x00450300: 0x00C8, 0x00450301: 0x00C9, 0x00450302: 0x00CA, 0x00450308: 0x00CB, 0x00490300: 0x00CC, 0x00490301: 0x00CD, 0x00490302: 0x00CE, 0x00490308: 0x00CF, 0x004E0303: 0x00D1, 0x004F0300: 0x00D2, 0x004F0301: 0x00D3, 0x004F0302: 0x00D4, 0x004F0303: 0x00D5, 0x004F0308: 0x00D6, 0x00550300: 0x00D9, 0x00550301: 0x00DA, 0x00550302: 0x00DB, 0x00550308: 0x00DC, 0x00590301: 0x00DD, 0x00610300: 0x00E0, 0x00610301: 0x00E1, 0x00610302: 0x00E2, 0x00610303: 0x00E3, 0x00610308: 0x00E4, 0x0061030A: 0x00E5, 0x00630327: 0x00E7, 0x00650300: 0x00E8, 0x00650301: 0x00E9, 0x00650302: 0x00EA, 0x00650308: 0x00EB, 0x00690300: 0x00EC, 0x00690301: 0x00ED, 0x00690302: 0x00EE, 0x00690308: 0x00EF, 0x006E0303: 0x00F1, 0x006F0300: 0x00F2, 0x006F0301: 0x00F3, 0x006F0302: 0x00F4, 0x006F0303: 0x00F5, 0x006F0308: 0x00F6, 0x00750300: 0x00F9, 0x00750301: 0x00FA, 0x00750302: 0x00FB, 0x00750308: 0x00FC, 0x00790301: 0x00FD, 0x00790308: 0x00FF, 0x00410304: 0x0100, 0x00610304: 0x0101, 0x00410306: 0x0102, 0x00610306: 0x0103, 0x00410328: 0x0104, 0x00610328: 0x0105, 0x00430301: 0x0106, 0x00630301: 0x0107, 0x00430302: 0x0108, 0x00630302: 0x0109, 0x00430307: 0x010A, 0x00630307: 0x010B, 0x0043030C: 0x010C, 0x0063030C: 0x010D, 0x0044030C: 0x010E, 0x0064030C: 0x010F, 0x00450304: 0x0112, 0x00650304: 0x0113, 0x00450306: 0x0114, 0x00650306: 0x0115, 0x00450307: 0x0116, 0x00650307: 0x0117, 0x00450328: 0x0118, 0x00650328: 0x0119, 0x0045030C: 0x011A, 0x0065030C: 0x011B, 0x00470302: 0x011C, 0x00670302: 0x011D, 0x00470306: 0x011E, 0x00670306: 0x011F, 0x00470307: 0x0120, 0x00670307: 0x0121, 0x00470327: 0x0122, 0x00670327: 0x0123, 0x00480302: 0x0124, 0x00680302: 0x0125, 0x00490303: 0x0128, 0x00690303: 0x0129, 0x00490304: 0x012A, 0x00690304: 0x012B, 0x00490306: 0x012C, 0x00690306: 0x012D, 0x00490328: 0x012E, 0x00690328: 0x012F, 0x00490307: 0x0130, 0x004A0302: 0x0134, 0x006A0302: 0x0135, 0x004B0327: 0x0136, 0x006B0327: 0x0137, 0x004C0301: 0x0139, 0x006C0301: 0x013A, 0x004C0327: 0x013B, 0x006C0327: 0x013C, 0x004C030C: 0x013D, 0x006C030C: 0x013E, 0x004E0301: 0x0143, 0x006E0301: 0x0144, 0x004E0327: 0x0145, 0x006E0327: 0x0146, 0x004E030C: 0x0147, 0x006E030C: 0x0148, 0x004F0304: 0x014C, 0x006F0304: 0x014D, 0x004F0306: 0x014E, 0x006F0306: 0x014F, 0x004F030B: 0x0150, 0x006F030B: 0x0151, 0x00520301: 0x0154, 0x00720301: 0x0155, 0x00520327: 0x0156, 0x00720327: 0x0157, 0x0052030C: 0x0158, 0x0072030C: 0x0159, 0x00530301: 0x015A, 0x00730301: 0x015B, 0x00530302: 0x015C, 0x00730302: 0x015D, 0x00530327: 0x015E, 0x00730327: 0x015F, 0x0053030C: 0x0160, 0x0073030C: 0x0161, 0x00540327: 0x0162, 0x00740327: 0x0163, 0x0054030C: 0x0164, 0x0074030C: 0x0165, 0x00550303: 0x0168, 0x00750303: 0x0169, 0x00550304: 0x016A, 0x00750304: 0x016B, 0x00550306: 0x016C, 0x00750306: 0x016D, 0x0055030A: 0x016E, 0x0075030A: 0x016F, 0x0055030B: 0x0170, 0x0075030B: 0x0171, 0x00550328: 0x0172, 0x00750328: 0x0173, 0x00570302: 0x0174, 0x00770302: 0x0175, 0x00590302: 0x0176, 0x00790302: 0x0177, 0x00590308: 0x0178, 0x005A0301: 0x0179, 0x007A0301: 0x017A, 0x005A0307: 0x017B, 0x007A0307: 0x017C, 0x005A030C: 0x017D, 0x007A030C: 0x017E, 0x004F031B: 0x01A0, 0x006F031B: 0x01A1, 0x0055031B: 0x01AF, 0x0075031B: 0x01B0, 0x0041030C: 0x01CD, 0x0061030C: 0x01CE, 0x0049030C: 0x01CF, 0x0069030C: 0x01D0, 0x004F030C: 0x01D1, 0x006F030C: 0x01D2, 0x0055030C: 0x01D3, 0x0075030C: 0x01D4, 0x00DC0304: 0x01D5, 0x00FC0304: 0x01D6, 0x00DC0301: 0x01D7, 0x00FC0301: 0x01D8, 0x00DC030C: 0x01D9, 0x00FC030C: 0x01DA, 0x00DC0300: 0x01DB, 0x00FC0300: 0x01DC, 0x00C40304: 0x01DE, 0x00E40304: 0x01DF, 0x02260304: 0x01E0, 0x02270304: 0x01E1, 0x00C60304: 0x01E2, 0x00E60304: 0x01E3, 0x0047030C: 0x01E6, 0x0067030C: 0x01E7, 0x004B030C: 0x01E8, 0x006B030C: 0x01E9, 0x004F0328: 0x01EA, 0x006F0328: 0x01EB, 0x01EA0304: 0x01EC, 0x01EB0304: 0x01ED, 0x01B7030C: 0x01EE, 0x0292030C: 0x01EF, 0x006A030C: 0x01F0, 0x00470301: 0x01F4, 0x00670301: 0x01F5, 0x004E0300: 0x01F8, 0x006E0300: 0x01F9, 0x00C50301: 0x01FA, 0x00E50301: 0x01FB, 0x00C60301: 0x01FC, 0x00E60301: 0x01FD, 0x00D80301: 0x01FE, 0x00F80301: 0x01FF, 0x0041030F: 0x0200, 0x0061030F: 0x0201, 0x00410311: 0x0202, 0x00610311: 0x0203, 0x0045030F: 0x0204, 0x0065030F: 0x0205, 0x00450311: 0x0206, 0x00650311: 0x0207, 0x0049030F: 0x0208, 0x0069030F: 0x0209, 0x00490311: 0x020A, 0x00690311: 0x020B, 0x004F030F: 0x020C, 0x006F030F: 0x020D, 0x004F0311: 0x020E, 0x006F0311: 0x020F, 0x0052030F: 0x0210, 0x0072030F: 0x0211, 0x00520311: 0x0212, 0x00720311: 0x0213, 0x0055030F: 0x0214, 0x0075030F: 0x0215, 0x00550311: 0x0216, 0x00750311: 0x0217, 0x00530326: 0x0218, 0x00730326: 0x0219, 0x00540326: 0x021A, 0x00740326: 0x021B, 0x0048030C: 0x021E, 0x0068030C: 0x021F, 0x00410307: 0x0226, 0x00610307: 0x0227, 0x00450327: 0x0228, 0x00650327: 0x0229, 0x00D60304: 0x022A, 0x00F60304: 0x022B, 0x00D50304: 0x022C, 0x00F50304: 0x022D, 0x004F0307: 0x022E, 0x006F0307: 0x022F, 0x022E0304: 0x0230, 0x022F0304: 0x0231, 0x00590304: 0x0232, 0x00790304: 0x0233, 0x00A80301: 0x0385, 0x03910301: 0x0386, 0x03950301: 0x0388, 0x03970301: 0x0389, 0x03990301: 0x038A, 0x039F0301: 0x038C, 0x03A50301: 0x038E, 0x03A90301: 0x038F, 0x03CA0301: 0x0390, 0x03990308: 0x03AA, 0x03A50308: 0x03AB, 0x03B10301: 0x03AC, 0x03B50301: 0x03AD, 0x03B70301: 0x03AE, 0x03B90301: 0x03AF, 0x03CB0301: 0x03B0, 0x03B90308: 0x03CA, 0x03C50308: 0x03CB, 0x03BF0301: 0x03CC, 0x03C50301: 0x03CD, 0x03C90301: 0x03CE, 0x03D20301: 0x03D3, 0x03D20308: 0x03D4, 0x04150300: 0x0400, 0x04150308: 0x0401, 0x04130301: 0x0403, 0x04060308: 0x0407, 0x041A0301: 0x040C, 0x04180300: 0x040D, 0x04230306: 0x040E, 0x04180306: 0x0419, 0x04380306: 0x0439, 0x04350300: 0x0450, 0x04350308: 0x0451, 0x04330301: 0x0453, 0x04560308: 0x0457, 0x043A0301: 0x045C, 0x04380300: 0x045D, 0x04430306: 0x045E, 0x0474030F: 0x0476, 0x0475030F: 0x0477, 0x04160306: 0x04C1, 0x04360306: 0x04C2, 0x04100306: 0x04D0, 0x04300306: 0x04D1, 0x04100308: 0x04D2, 0x04300308: 0x04D3, 0x04150306: 0x04D6, 0x04350306: 0x04D7, 0x04D80308: 0x04DA, 0x04D90308: 0x04DB, 0x04160308: 0x04DC, 0x04360308: 0x04DD, 0x04170308: 0x04DE, 0x04370308: 0x04DF, 0x04180304: 0x04E2, 0x04380304: 0x04E3, 0x04180308: 0x04E4, 0x04380308: 0x04E5, 0x041E0308: 0x04E6, 0x043E0308: 0x04E7, 0x04E80308: 0x04EA, 0x04E90308: 0x04EB, 0x042D0308: 0x04EC, 0x044D0308: 0x04ED, 0x04230304: 0x04EE, 0x04430304: 0x04EF, 0x04230308: 0x04F0, 0x04430308: 0x04F1, 0x0423030B: 0x04F2, 0x0443030B: 0x04F3, 0x04270308: 0x04F4, 0x04470308: 0x04F5, 0x042B0308: 0x04F8, 0x044B0308: 0x04F9, 0x06270653: 0x0622, 0x06270654: 0x0623, 0x06480654: 0x0624, 0x06270655: 0x0625, 0x064A0654: 0x0626, 0x06D50654: 0x06C0, 0x06C10654: 0x06C2, 0x06D20654: 0x06D3, 0x0928093C: 0x0929, 0x0930093C: 0x0931, 0x0933093C: 0x0934, 0x09C709BE: 0x09CB, 0x09C709D7: 0x09CC, 0x0B470B56: 0x0B48, 0x0B470B3E: 0x0B4B, 0x0B470B57: 0x0B4C, 0x0B920BD7: 0x0B94, 0x0BC60BBE: 0x0BCA, 0x0BC70BBE: 0x0BCB, 0x0BC60BD7: 0x0BCC, 0x0C460C56: 0x0C48, 0x0CBF0CD5: 0x0CC0, 0x0CC60CD5: 0x0CC7, 0x0CC60CD6: 0x0CC8, 0x0CC60CC2: 0x0CCA, 0x0CCA0CD5: 0x0CCB, 0x0D460D3E: 0x0D4A, 0x0D470D3E: 0x0D4B, 0x0D460D57: 0x0D4C, 0x0DD90DCA: 0x0DDA, 0x0DD90DCF: 0x0DDC, 0x0DDC0DCA: 0x0DDD, 0x0DD90DDF: 0x0DDE, 0x1025102E: 0x1026, 0x1B051B35: 0x1B06, 0x1B071B35: 0x1B08, 0x1B091B35: 0x1B0A, 0x1B0B1B35: 0x1B0C, 0x1B0D1B35: 0x1B0E, 0x1B111B35: 0x1B12, 0x1B3A1B35: 0x1B3B, 0x1B3C1B35: 0x1B3D, 0x1B3E1B35: 0x1B40, 0x1B3F1B35: 0x1B41, 0x1B421B35: 0x1B43, 0x00410325: 0x1E00, 0x00610325: 0x1E01, 0x00420307: 0x1E02, 0x00620307: 0x1E03, 0x00420323: 0x1E04, 0x00620323: 0x1E05, 0x00420331: 0x1E06, 0x00620331: 0x1E07, 0x00C70301: 0x1E08, 0x00E70301: 0x1E09, 0x00440307: 0x1E0A, 0x00640307: 0x1E0B, 0x00440323: 0x1E0C, 0x00640323: 0x1E0D, 0x00440331: 0x1E0E, 0x00640331: 0x1E0F, 0x00440327: 0x1E10, 0x00640327: 0x1E11, 0x0044032D: 0x1E12, 0x0064032D: 0x1E13, 0x01120300: 0x1E14, 0x01130300: 0x1E15, 0x01120301: 0x1E16, 0x01130301: 0x1E17, 0x0045032D: 0x1E18, 0x0065032D: 0x1E19, 0x00450330: 0x1E1A, 0x00650330: 0x1E1B, 0x02280306: 0x1E1C, 0x02290306: 0x1E1D, 0x00460307: 0x1E1E, 0x00660307: 0x1E1F, 0x00470304: 0x1E20, 0x00670304: 0x1E21, 0x00480307: 0x1E22, 0x00680307: 0x1E23, 0x00480323: 0x1E24, 0x00680323: 0x1E25, 0x00480308: 0x1E26, 0x00680308: 0x1E27, 0x00480327: 0x1E28, 0x00680327: 0x1E29, 0x0048032E: 0x1E2A, 0x0068032E: 0x1E2B, 0x00490330: 0x1E2C, 0x00690330: 0x1E2D, 0x00CF0301: 0x1E2E, 0x00EF0301: 0x1E2F, 0x004B0301: 0x1E30, 0x006B0301: 0x1E31, 0x004B0323: 0x1E32, 0x006B0323: 0x1E33, 0x004B0331: 0x1E34, 0x006B0331: 0x1E35, 0x004C0323: 0x1E36, 0x006C0323: 0x1E37, 0x1E360304: 0x1E38, 0x1E370304: 0x1E39, 0x004C0331: 0x1E3A, 0x006C0331: 0x1E3B, 0x004C032D: 0x1E3C, 0x006C032D: 0x1E3D, 0x004D0301: 0x1E3E, 0x006D0301: 0x1E3F, 0x004D0307: 0x1E40, 0x006D0307: 0x1E41, 0x004D0323: 0x1E42, 0x006D0323: 0x1E43, 0x004E0307: 0x1E44, 0x006E0307: 0x1E45, 0x004E0323: 0x1E46, 0x006E0323: 0x1E47, 0x004E0331: 0x1E48, 0x006E0331: 0x1E49, 0x004E032D: 0x1E4A, 0x006E032D: 0x1E4B, 0x00D50301: 0x1E4C, 0x00F50301: 0x1E4D, 0x00D50308: 0x1E4E, 0x00F50308: 0x1E4F, 0x014C0300: 0x1E50, 0x014D0300: 0x1E51, 0x014C0301: 0x1E52, 0x014D0301: 0x1E53, 0x00500301: 0x1E54, 0x00700301: 0x1E55, 0x00500307: 0x1E56, 0x00700307: 0x1E57, 0x00520307: 0x1E58, 0x00720307: 0x1E59, 0x00520323: 0x1E5A, 0x00720323: 0x1E5B, 0x1E5A0304: 0x1E5C, 0x1E5B0304: 0x1E5D, 0x00520331: 0x1E5E, 0x00720331: 0x1E5F, 0x00530307: 0x1E60, 0x00730307: 0x1E61, 0x00530323: 0x1E62, 0x00730323: 0x1E63, 0x015A0307: 0x1E64, 0x015B0307: 0x1E65, 0x01600307: 0x1E66, 0x01610307: 0x1E67, 0x1E620307: 0x1E68, 0x1E630307: 0x1E69, 0x00540307: 0x1E6A, 0x00740307: 0x1E6B, 0x00540323: 0x1E6C, 0x00740323: 0x1E6D, 0x00540331: 0x1E6E, 0x00740331: 0x1E6F, 0x0054032D: 0x1E70, 0x0074032D: 0x1E71, 0x00550324: 0x1E72, 0x00750324: 0x1E73, 0x00550330: 0x1E74, 0x00750330: 0x1E75, 0x0055032D: 0x1E76, 0x0075032D: 0x1E77, 0x01680301: 0x1E78, 0x01690301: 0x1E79, 0x016A0308: 0x1E7A, 0x016B0308: 0x1E7B, 0x00560303: 0x1E7C, 0x00760303: 0x1E7D, 0x00560323: 0x1E7E, 0x00760323: 0x1E7F, 0x00570300: 0x1E80, 0x00770300: 0x1E81, 0x00570301: 0x1E82, 0x00770301: 0x1E83, 0x00570308: 0x1E84, 0x00770308: 0x1E85, 0x00570307: 0x1E86, 0x00770307: 0x1E87, 0x00570323: 0x1E88, 0x00770323: 0x1E89, 0x00580307: 0x1E8A, 0x00780307: 0x1E8B, 0x00580308: 0x1E8C, 0x00780308: 0x1E8D, 0x00590307: 0x1E8E, 0x00790307: 0x1E8F, 0x005A0302: 0x1E90, 0x007A0302: 0x1E91, 0x005A0323: 0x1E92, 0x007A0323: 0x1E93, 0x005A0331: 0x1E94, 0x007A0331: 0x1E95, 0x00680331: 0x1E96, 0x00740308: 0x1E97, 0x0077030A: 0x1E98, 0x0079030A: 0x1E99, 0x017F0307: 0x1E9B, 0x00410323: 0x1EA0, 0x00610323: 0x1EA1, 0x00410309: 0x1EA2, 0x00610309: 0x1EA3, 0x00C20301: 0x1EA4, 0x00E20301: 0x1EA5, 0x00C20300: 0x1EA6, 0x00E20300: 0x1EA7, 0x00C20309: 0x1EA8, 0x00E20309: 0x1EA9, 0x00C20303: 0x1EAA, 0x00E20303: 0x1EAB, 0x1EA00302: 0x1EAC, 0x1EA10302: 0x1EAD, 0x01020301: 0x1EAE, 0x01030301: 0x1EAF, 0x01020300: 0x1EB0, 0x01030300: 0x1EB1, 0x01020309: 0x1EB2, 0x01030309: 0x1EB3, 0x01020303: 0x1EB4, 0x01030303: 0x1EB5, 0x1EA00306: 0x1EB6, 0x1EA10306: 0x1EB7, 0x00450323: 0x1EB8, 0x00650323: 0x1EB9, 0x00450309: 0x1EBA, 0x00650309: 0x1EBB, 0x00450303: 0x1EBC, 0x00650303: 0x1EBD, 0x00CA0301: 0x1EBE, 0x00EA0301: 0x1EBF, 0x00CA0300: 0x1EC0, 0x00EA0300: 0x1EC1, 0x00CA0309: 0x1EC2, 0x00EA0309: 0x1EC3, 0x00CA0303: 0x1EC4, 0x00EA0303: 0x1EC5, 0x1EB80302: 0x1EC6, 0x1EB90302: 0x1EC7, 0x00490309: 0x1EC8, 0x00690309: 0x1EC9, 0x00490323: 0x1ECA, 0x00690323: 0x1ECB, 0x004F0323: 0x1ECC, 0x006F0323: 0x1ECD, 0x004F0309: 0x1ECE, 0x006F0309: 0x1ECF, 0x00D40301: 0x1ED0, 0x00F40301: 0x1ED1, 0x00D40300: 0x1ED2, 0x00F40300: 0x1ED3, 0x00D40309: 0x1ED4, 0x00F40309: 0x1ED5, 0x00D40303: 0x1ED6, 0x00F40303: 0x1ED7, 0x1ECC0302: 0x1ED8, 0x1ECD0302: 0x1ED9, 0x01A00301: 0x1EDA, 0x01A10301: 0x1EDB, 0x01A00300: 0x1EDC, 0x01A10300: 0x1EDD, 0x01A00309: 0x1EDE, 0x01A10309: 0x1EDF, 0x01A00303: 0x1EE0, 0x01A10303: 0x1EE1, 0x01A00323: 0x1EE2, 0x01A10323: 0x1EE3, 0x00550323: 0x1EE4, 0x00750323: 0x1EE5, 0x00550309: 0x1EE6, 0x00750309: 0x1EE7, 0x01AF0301: 0x1EE8, 0x01B00301: 0x1EE9, 0x01AF0300: 0x1EEA, 0x01B00300: 0x1EEB, 0x01AF0309: 0x1EEC, 0x01B00309: 0x1EED, 0x01AF0303: 0x1EEE, 0x01B00303: 0x1EEF, 0x01AF0323: 0x1EF0, 0x01B00323: 0x1EF1, 0x00590300: 0x1EF2, 0x00790300: 0x1EF3, 0x00590323: 0x1EF4, 0x00790323: 0x1EF5, 0x00590309: 0x1EF6, 0x00790309: 0x1EF7, 0x00590303: 0x1EF8, 0x00790303: 0x1EF9, 0x03B10313: 0x1F00, 0x03B10314: 0x1F01, 0x1F000300: 0x1F02, 0x1F010300: 0x1F03, 0x1F000301: 0x1F04, 0x1F010301: 0x1F05, 0x1F000342: 0x1F06, 0x1F010342: 0x1F07, 0x03910313: 0x1F08, 0x03910314: 0x1F09, 0x1F080300: 0x1F0A, 0x1F090300: 0x1F0B, 0x1F080301: 0x1F0C, 0x1F090301: 0x1F0D, 0x1F080342: 0x1F0E, 0x1F090342: 0x1F0F, 0x03B50313: 0x1F10, 0x03B50314: 0x1F11, 0x1F100300: 0x1F12, 0x1F110300: 0x1F13, 0x1F100301: 0x1F14, 0x1F110301: 0x1F15, 0x03950313: 0x1F18, 0x03950314: 0x1F19, 0x1F180300: 0x1F1A, 0x1F190300: 0x1F1B, 0x1F180301: 0x1F1C, 0x1F190301: 0x1F1D, 0x03B70313: 0x1F20, 0x03B70314: 0x1F21, 0x1F200300: 0x1F22, 0x1F210300: 0x1F23, 0x1F200301: 0x1F24, 0x1F210301: 0x1F25, 0x1F200342: 0x1F26, 0x1F210342: 0x1F27, 0x03970313: 0x1F28, 0x03970314: 0x1F29, 0x1F280300: 0x1F2A, 0x1F290300: 0x1F2B, 0x1F280301: 0x1F2C, 0x1F290301: 0x1F2D, 0x1F280342: 0x1F2E, 0x1F290342: 0x1F2F, 0x03B90313: 0x1F30, 0x03B90314: 0x1F31, 0x1F300300: 0x1F32, 0x1F310300: 0x1F33, 0x1F300301: 0x1F34, 0x1F310301: 0x1F35, 0x1F300342: 0x1F36, 0x1F310342: 0x1F37, 0x03990313: 0x1F38, 0x03990314: 0x1F39, 0x1F380300: 0x1F3A, 0x1F390300: 0x1F3B, 0x1F380301: 0x1F3C, 0x1F390301: 0x1F3D, 0x1F380342: 0x1F3E, 0x1F390342: 0x1F3F, 0x03BF0313: 0x1F40, 0x03BF0314: 0x1F41, 0x1F400300: 0x1F42, 0x1F410300: 0x1F43, 0x1F400301: 0x1F44, 0x1F410301: 0x1F45, 0x039F0313: 0x1F48, 0x039F0314: 0x1F49, 0x1F480300: 0x1F4A, 0x1F490300: 0x1F4B, 0x1F480301: 0x1F4C, 0x1F490301: 0x1F4D, 0x03C50313: 0x1F50, 0x03C50314: 0x1F51, 0x1F500300: 0x1F52, 0x1F510300: 0x1F53, 0x1F500301: 0x1F54, 0x1F510301: 0x1F55, 0x1F500342: 0x1F56, 0x1F510342: 0x1F57, 0x03A50314: 0x1F59, 0x1F590300: 0x1F5B, 0x1F590301: 0x1F5D, 0x1F590342: 0x1F5F, 0x03C90313: 0x1F60, 0x03C90314: 0x1F61, 0x1F600300: 0x1F62, 0x1F610300: 0x1F63, 0x1F600301: 0x1F64, 0x1F610301: 0x1F65, 0x1F600342: 0x1F66, 0x1F610342: 0x1F67, 0x03A90313: 0x1F68, 0x03A90314: 0x1F69, 0x1F680300: 0x1F6A, 0x1F690300: 0x1F6B, 0x1F680301: 0x1F6C, 0x1F690301: 0x1F6D, 0x1F680342: 0x1F6E, 0x1F690342: 0x1F6F, 0x03B10300: 0x1F70, 0x03B50300: 0x1F72, 0x03B70300: 0x1F74, 0x03B90300: 0x1F76, 0x03BF0300: 0x1F78, 0x03C50300: 0x1F7A, 0x03C90300: 0x1F7C, 0x1F000345: 0x1F80, 0x1F010345: 0x1F81, 0x1F020345: 0x1F82, 0x1F030345: 0x1F83, 0x1F040345: 0x1F84, 0x1F050345: 0x1F85, 0x1F060345: 0x1F86, 0x1F070345: 0x1F87, 0x1F080345: 0x1F88, 0x1F090345: 0x1F89, 0x1F0A0345: 0x1F8A, 0x1F0B0345: 0x1F8B, 0x1F0C0345: 0x1F8C, 0x1F0D0345: 0x1F8D, 0x1F0E0345: 0x1F8E, 0x1F0F0345: 0x1F8F, 0x1F200345: 0x1F90, 0x1F210345: 0x1F91, 0x1F220345: 0x1F92, 0x1F230345: 0x1F93, 0x1F240345: 0x1F94, 0x1F250345: 0x1F95, 0x1F260345: 0x1F96, 0x1F270345: 0x1F97, 0x1F280345: 0x1F98, 0x1F290345: 0x1F99, 0x1F2A0345: 0x1F9A, 0x1F2B0345: 0x1F9B, 0x1F2C0345: 0x1F9C, 0x1F2D0345: 0x1F9D, 0x1F2E0345: 0x1F9E, 0x1F2F0345: 0x1F9F, 0x1F600345: 0x1FA0, 0x1F610345: 0x1FA1, 0x1F620345: 0x1FA2, 0x1F630345: 0x1FA3, 0x1F640345: 0x1FA4, 0x1F650345: 0x1FA5, 0x1F660345: 0x1FA6, 0x1F670345: 0x1FA7, 0x1F680345: 0x1FA8, 0x1F690345: 0x1FA9, 0x1F6A0345: 0x1FAA, 0x1F6B0345: 0x1FAB, 0x1F6C0345: 0x1FAC, 0x1F6D0345: 0x1FAD, 0x1F6E0345: 0x1FAE, 0x1F6F0345: 0x1FAF, 0x03B10306: 0x1FB0, 0x03B10304: 0x1FB1, 0x1F700345: 0x1FB2, 0x03B10345: 0x1FB3, 0x03AC0345: 0x1FB4, 0x03B10342: 0x1FB6, 0x1FB60345: 0x1FB7, 0x03910306: 0x1FB8, 0x03910304: 0x1FB9, 0x03910300: 0x1FBA, 0x03910345: 0x1FBC, 0x00A80342: 0x1FC1, 0x1F740345: 0x1FC2, 0x03B70345: 0x1FC3, 0x03AE0345: 0x1FC4, 0x03B70342: 0x1FC6, 0x1FC60345: 0x1FC7, 0x03950300: 0x1FC8, 0x03970300: 0x1FCA, 0x03970345: 0x1FCC, 0x1FBF0300: 0x1FCD, 0x1FBF0301: 0x1FCE, 0x1FBF0342: 0x1FCF, 0x03B90306: 0x1FD0, 0x03B90304: 0x1FD1, 0x03CA0300: 0x1FD2, 0x03B90342: 0x1FD6, 0x03CA0342: 0x1FD7, 0x03990306: 0x1FD8, 0x03990304: 0x1FD9, 0x03990300: 0x1FDA, 0x1FFE0300: 0x1FDD, 0x1FFE0301: 0x1FDE, 0x1FFE0342: 0x1FDF, 0x03C50306: 0x1FE0, 0x03C50304: 0x1FE1, 0x03CB0300: 0x1FE2, 0x03C10313: 0x1FE4, 0x03C10314: 0x1FE5, 0x03C50342: 0x1FE6, 0x03CB0342: 0x1FE7, 0x03A50306: 0x1FE8, 0x03A50304: 0x1FE9, 0x03A50300: 0x1FEA, 0x03A10314: 0x1FEC, 0x00A80300: 0x1FED, 0x1F7C0345: 0x1FF2, 0x03C90345: 0x1FF3, 0x03CE0345: 0x1FF4, 0x03C90342: 0x1FF6, 0x1FF60345: 0x1FF7, 0x039F0300: 0x1FF8, 0x03A90300: 0x1FFA, 0x03A90345: 0x1FFC, 0x21900338: 0x219A, 0x21920338: 0x219B, 0x21940338: 0x21AE, 0x21D00338: 0x21CD, 0x21D40338: 0x21CE, 0x21D20338: 0x21CF, 0x22030338: 0x2204, 0x22080338: 0x2209, 0x220B0338: 0x220C, 0x22230338: 0x2224, 0x22250338: 0x2226, 0x223C0338: 0x2241, 0x22430338: 0x2244, 0x22450338: 0x2247, 0x22480338: 0x2249, 0x003D0338: 0x2260, 0x22610338: 0x2262, 0x224D0338: 0x226D, 0x003C0338: 0x226E, 0x003E0338: 0x226F, 0x22640338: 0x2270, 0x22650338: 0x2271, 0x22720338: 0x2274, 0x22730338: 0x2275, 0x22760338: 0x2278, 0x22770338: 0x2279, 0x227A0338: 0x2280, 0x227B0338: 0x2281, 0x22820338: 0x2284, 0x22830338: 0x2285, 0x22860338: 0x2288, 0x22870338: 0x2289, 0x22A20338: 0x22AC, 0x22A80338: 0x22AD, 0x22A90338: 0x22AE, 0x22AB0338: 0x22AF, 0x227C0338: 0x22E0, 0x227D0338: 0x22E1, 0x22910338: 0x22E2, 0x22920338: 0x22E3, 0x22B20338: 0x22EA, 0x22B30338: 0x22EB, 0x22B40338: 0x22EC, 0x22B50338: 0x22ED, 0x304B3099: 0x304C, 0x304D3099: 0x304E, 0x304F3099: 0x3050, 0x30513099: 0x3052, 0x30533099: 0x3054, 0x30553099: 0x3056, 0x30573099: 0x3058, 0x30593099: 0x305A, 0x305B3099: 0x305C, 0x305D3099: 0x305E, 0x305F3099: 0x3060, 0x30613099: 0x3062, 0x30643099: 0x3065, 0x30663099: 0x3067, 0x30683099: 0x3069, 0x306F3099: 0x3070, 0x306F309A: 0x3071, 0x30723099: 0x3073, 0x3072309A: 0x3074, 0x30753099: 0x3076, 0x3075309A: 0x3077, 0x30783099: 0x3079, 0x3078309A: 0x307A, 0x307B3099: 0x307C, 0x307B309A: 0x307D, 0x30463099: 0x3094, 0x309D3099: 0x309E, 0x30AB3099: 0x30AC, 0x30AD3099: 0x30AE, 0x30AF3099: 0x30B0, 0x30B13099: 0x30B2, 0x30B33099: 0x30B4, 0x30B53099: 0x30B6, 0x30B73099: 0x30B8, 0x30B93099: 0x30BA, 0x30BB3099: 0x30BC, 0x30BD3099: 0x30BE, 0x30BF3099: 0x30C0, 0x30C13099: 0x30C2, 0x30C43099: 0x30C5, 0x30C63099: 0x30C7, 0x30C83099: 0x30C9, 0x30CF3099: 0x30D0, 0x30CF309A: 0x30D1, 0x30D23099: 0x30D3, 0x30D2309A: 0x30D4, 0x30D53099: 0x30D6, 0x30D5309A: 0x30D7, 0x30D83099: 0x30D9, 0x30D8309A: 0x30DA, 0x30DB3099: 0x30DC, 0x30DB309A: 0x30DD, 0x30A63099: 0x30F4, 0x30EF3099: 0x30F7, 0x30F03099: 0x30F8, 0x30F13099: 0x30F9, 0x30F23099: 0x30FA, 0x30FD3099: 0x30FE, 0x109910BA: 0x1109A, 0x109B10BA: 0x1109C, 0x10A510BA: 0x110AB, 0x11311127: 0x1112E, 0x11321127: 0x1112F, 0x1347133E: 0x1134B, 0x13471357: 0x1134C, 0x14B914BA: 0x114BB, 0x14B914B0: 0x114BC, 0x14B914BD: 0x114BE, 0x15B815AF: 0x115BA, 0x15B915AF: 0x115BB, } // Total size of tables: 53KB (54006 bytes) ================================================ FILE: vendor/golang.org/x/text/unicode/norm/transform.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package norm import ( "unicode/utf8" "golang.org/x/text/transform" ) // Reset implements the Reset method of the transform.Transformer interface. func (Form) Reset() {} // Transform implements the Transform method of the transform.Transformer // interface. It may need to write segments of up to MaxSegmentSize at once. // Users should either catch ErrShortDst and allow dst to grow or have dst be at // least of size MaxTransformChunkSize to be guaranteed of progress. func (f Form) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { n := 0 // Cap the maximum number of src bytes to check. b := src eof := atEOF if ns := len(dst); ns < len(b) { err = transform.ErrShortDst eof = false b = b[:ns] } i, ok := formTable[f].quickSpan(inputBytes(b), n, len(b), eof) n += copy(dst[n:], b[n:i]) if !ok { nDst, nSrc, err = f.transform(dst[n:], src[n:], atEOF) return nDst + n, nSrc + n, err } if n < len(src) && !atEOF { err = transform.ErrShortSrc } return n, n, err } func flushTransform(rb *reorderBuffer) bool { // Write out (must fully fit in dst, or else it is an ErrShortDst). if len(rb.out) < rb.nrune*utf8.UTFMax { return false } rb.out = rb.out[rb.flushCopy(rb.out):] return true } var errs = []error{nil, transform.ErrShortDst, transform.ErrShortSrc} // transform implements the transform.Transformer interface. It is only called // when quickSpan does not pass for a given string. func (f Form) transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { // TODO: get rid of reorderBuffer. See CL 23460044. rb := reorderBuffer{} rb.init(f, src) for { // Load segment into reorder buffer. rb.setFlusher(dst[nDst:], flushTransform) end := decomposeSegment(&rb, nSrc, atEOF) if end < 0 { return nDst, nSrc, errs[-end] } nDst = len(dst) - len(rb.out) nSrc = end // Next quickSpan. end = rb.nsrc eof := atEOF if n := nSrc + len(dst) - nDst; n < end { err = transform.ErrShortDst end = n eof = false } end, ok := rb.f.quickSpan(rb.src, nSrc, end, eof) n := copy(dst[nDst:], rb.src.bytes[nSrc:end]) nSrc += n nDst += n if ok { if n < rb.nsrc && !atEOF { err = transform.ErrShortSrc } return nDst, nSrc, err } } } ================================================ FILE: vendor/golang.org/x/text/unicode/norm/trie.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package norm type valueRange struct { value uint16 // header: value:stride lo, hi byte // header: lo:n } type sparseBlocks struct { values []valueRange offset []uint16 } var nfcSparse = sparseBlocks{ values: nfcSparseValues[:], offset: nfcSparseOffset[:], } var nfkcSparse = sparseBlocks{ values: nfkcSparseValues[:], offset: nfkcSparseOffset[:], } var ( nfcData = newNfcTrie(0) nfkcData = newNfkcTrie(0) ) // lookupValue determines the type of block n and looks up the value for b. // For n < t.cutoff, the block is a simple lookup table. Otherwise, the block // is a list of ranges with an accompanying value. Given a matching range r, // the value for b is by r.value + (b - r.lo) * stride. func (t *sparseBlocks) lookup(n uint32, b byte) uint16 { offset := t.offset[n] header := t.values[offset] lo := offset + 1 hi := lo + uint16(header.lo) for lo < hi { m := lo + (hi-lo)/2 r := t.values[m] if r.lo <= b && b <= r.hi { return r.value + uint16(b-r.lo)*header.value } if b < r.lo { hi = m } else { lo = m + 1 } } return 0 } ================================================ FILE: vendor/golang.org/x/tools/.gitattributes ================================================ # Treat all files in this repo as binary, with no git magic updating # line endings. Windows users contributing to Go will need to use a # modern version of git and editors capable of LF line endings. # # We'll prevent accidental CRLF line endings from entering the repo # via the git-review gofmt checks. # # See golang.org/issue/9281 * -text ================================================ FILE: vendor/golang.org/x/tools/.gitignore ================================================ # Add no patterns to .gitignore except for files generated by the build. last-change ================================================ FILE: vendor/golang.org/x/tools/AUTHORS ================================================ # This source code refers to The Go Authors for copyright purposes. # The master list of authors is in the main Go distribution, # visible at http://tip.golang.org/AUTHORS. ================================================ FILE: vendor/golang.org/x/tools/CONTRIBUTING.md ================================================ # Contributing to Go Go is an open source project. It is the work of hundreds of contributors. We appreciate your help! ## Filing issues When [filing an issue](https://golang.org/issue/new), make sure to answer these five questions: 1. What version of Go are you using (`go version`)? 2. What operating system and processor architecture are you using? 3. What did you do? 4. What did you expect to see? 5. What did you see instead? General questions should go to the [golang-nuts mailing list](https://groups.google.com/group/golang-nuts) instead of the issue tracker. The gophers there will answer or ask you to file an issue if you've tripped over a bug. ## Contributing code Please read the [Contribution Guidelines](https://golang.org/doc/contribute.html) before sending patches. **We do not accept GitHub pull requests** (we use [Gerrit](https://code.google.com/p/gerrit/) instead for code review). Unless otherwise noted, the Go source files are distributed under the BSD-style license found in the LICENSE file. ================================================ FILE: vendor/golang.org/x/tools/CONTRIBUTORS ================================================ # This source code was written by the Go contributors. # The master list of contributors is in the main Go distribution, # visible at http://tip.golang.org/CONTRIBUTORS. ================================================ FILE: vendor/golang.org/x/tools/LICENSE ================================================ Copyright (c) 2009 The Go Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: vendor/golang.org/x/tools/PATENTS ================================================ Additional IP Rights Grant (Patents) "This implementation" means the copyrightable works distributed by Google as part of the Go project. Google hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, transfer and otherwise run, modify and propagate the contents of this implementation of Go, where such license applies only to those patent claims, both currently owned or controlled by Google and acquired in the future, licensable by Google that are necessarily infringed by this implementation of Go. This grant does not include claims that would be infringed only as a consequence of further modification of this implementation. If you or your agent or exclusive licensee institute or order or agree to the institution of patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that this implementation of Go or any code incorporated within this implementation of Go constitutes direct or contributory patent infringement, or inducement of patent infringement, then any patent rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ================================================ FILE: vendor/golang.org/x/tools/README ================================================ This subrepository holds the source for various packages and tools that support the Go programming language. Some of the tools, godoc and vet for example, are included in binary Go distributions. Others, including the Go guru and the test coverage tool, can be fetched with "go get". Packages include a type-checker for Go and an implementation of the Static Single Assignment form (SSA) representation for Go programs. To submit changes to this repository, see http://golang.org/doc/contribute.html. ================================================ FILE: vendor/golang.org/x/tools/codereview.cfg ================================================ issuerepo: golang/go ================================================ FILE: vendor/golang.org/x/tools/go/ast/astutil/enclosing.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package astutil // This file defines utilities for working with source positions. import ( "fmt" "go/ast" "go/token" "sort" ) // PathEnclosingInterval returns the node that encloses the source // interval [start, end), and all its ancestors up to the AST root. // // The definition of "enclosing" used by this function considers // additional whitespace abutting a node to be enclosed by it. // In this example: // // z := x + y // add them // <-A-> // <----B-----> // // the ast.BinaryExpr(+) node is considered to enclose interval B // even though its [Pos()..End()) is actually only interval A. // This behaviour makes user interfaces more tolerant of imperfect // input. // // This function treats tokens as nodes, though they are not included // in the result. e.g. PathEnclosingInterval("+") returns the // enclosing ast.BinaryExpr("x + y"). // // If start==end, the 1-char interval following start is used instead. // // The 'exact' result is true if the interval contains only path[0] // and perhaps some adjacent whitespace. It is false if the interval // overlaps multiple children of path[0], or if it contains only // interior whitespace of path[0]. // In this example: // // z := x + y // add them // <--C--> <---E--> // ^ // D // // intervals C, D and E are inexact. C is contained by the // z-assignment statement, because it spans three of its children (:=, // x, +). So too is the 1-char interval D, because it contains only // interior whitespace of the assignment. E is considered interior // whitespace of the BlockStmt containing the assignment. // // Precondition: [start, end) both lie within the same file as root. // TODO(adonovan): return (nil, false) in this case and remove precond. // Requires FileSet; see loader.tokenFileContainsPos. // // Postcondition: path is never nil; it always contains at least 'root'. // func PathEnclosingInterval(root *ast.File, start, end token.Pos) (path []ast.Node, exact bool) { // fmt.Printf("EnclosingInterval %d %d\n", start, end) // debugging // Precondition: node.[Pos..End) and adjoining whitespace contain [start, end). var visit func(node ast.Node) bool visit = func(node ast.Node) bool { path = append(path, node) nodePos := node.Pos() nodeEnd := node.End() // fmt.Printf("visit(%T, %d, %d)\n", node, nodePos, nodeEnd) // debugging // Intersect [start, end) with interval of node. if start < nodePos { start = nodePos } if end > nodeEnd { end = nodeEnd } // Find sole child that contains [start, end). children := childrenOf(node) l := len(children) for i, child := range children { // [childPos, childEnd) is unaugmented interval of child. childPos := child.Pos() childEnd := child.End() // [augPos, augEnd) is whitespace-augmented interval of child. augPos := childPos augEnd := childEnd if i > 0 { augPos = children[i-1].End() // start of preceding whitespace } if i < l-1 { nextChildPos := children[i+1].Pos() // Does [start, end) lie between child and next child? if start >= augEnd && end <= nextChildPos { return false // inexact match } augEnd = nextChildPos // end of following whitespace } // fmt.Printf("\tchild %d: [%d..%d)\tcontains interval [%d..%d)?\n", // i, augPos, augEnd, start, end) // debugging // Does augmented child strictly contain [start, end)? if augPos <= start && end <= augEnd { _, isToken := child.(tokenNode) return isToken || visit(child) } // Does [start, end) overlap multiple children? // i.e. left-augmented child contains start // but LR-augmented child does not contain end. if start < childEnd && end > augEnd { break } } // No single child contained [start, end), // so node is the result. Is it exact? // (It's tempting to put this condition before the // child loop, but it gives the wrong result in the // case where a node (e.g. ExprStmt) and its sole // child have equal intervals.) if start == nodePos && end == nodeEnd { return true // exact match } return false // inexact: overlaps multiple children } if start > end { start, end = end, start } if start < root.End() && end > root.Pos() { if start == end { end = start + 1 // empty interval => interval of size 1 } exact = visit(root) // Reverse the path: for i, l := 0, len(path); i < l/2; i++ { path[i], path[l-1-i] = path[l-1-i], path[i] } } else { // Selection lies within whitespace preceding the // first (or following the last) declaration in the file. // The result nonetheless always includes the ast.File. path = append(path, root) } return } // tokenNode is a dummy implementation of ast.Node for a single token. // They are used transiently by PathEnclosingInterval but never escape // this package. // type tokenNode struct { pos token.Pos end token.Pos } func (n tokenNode) Pos() token.Pos { return n.pos } func (n tokenNode) End() token.Pos { return n.end } func tok(pos token.Pos, len int) ast.Node { return tokenNode{pos, pos + token.Pos(len)} } // childrenOf returns the direct non-nil children of ast.Node n. // It may include fake ast.Node implementations for bare tokens. // it is not safe to call (e.g.) ast.Walk on such nodes. // func childrenOf(n ast.Node) []ast.Node { var children []ast.Node // First add nodes for all true subtrees. ast.Inspect(n, func(node ast.Node) bool { if node == n { // push n return true // recur } if node != nil { // push child children = append(children, node) } return false // no recursion }) // Then add fake Nodes for bare tokens. switch n := n.(type) { case *ast.ArrayType: children = append(children, tok(n.Lbrack, len("[")), tok(n.Elt.End(), len("]"))) case *ast.AssignStmt: children = append(children, tok(n.TokPos, len(n.Tok.String()))) case *ast.BasicLit: children = append(children, tok(n.ValuePos, len(n.Value))) case *ast.BinaryExpr: children = append(children, tok(n.OpPos, len(n.Op.String()))) case *ast.BlockStmt: children = append(children, tok(n.Lbrace, len("{")), tok(n.Rbrace, len("}"))) case *ast.BranchStmt: children = append(children, tok(n.TokPos, len(n.Tok.String()))) case *ast.CallExpr: children = append(children, tok(n.Lparen, len("(")), tok(n.Rparen, len(")"))) if n.Ellipsis != 0 { children = append(children, tok(n.Ellipsis, len("..."))) } case *ast.CaseClause: if n.List == nil { children = append(children, tok(n.Case, len("default"))) } else { children = append(children, tok(n.Case, len("case"))) } children = append(children, tok(n.Colon, len(":"))) case *ast.ChanType: switch n.Dir { case ast.RECV: children = append(children, tok(n.Begin, len("<-chan"))) case ast.SEND: children = append(children, tok(n.Begin, len("chan<-"))) case ast.RECV | ast.SEND: children = append(children, tok(n.Begin, len("chan"))) } case *ast.CommClause: if n.Comm == nil { children = append(children, tok(n.Case, len("default"))) } else { children = append(children, tok(n.Case, len("case"))) } children = append(children, tok(n.Colon, len(":"))) case *ast.Comment: // nop case *ast.CommentGroup: // nop case *ast.CompositeLit: children = append(children, tok(n.Lbrace, len("{")), tok(n.Rbrace, len("{"))) case *ast.DeclStmt: // nop case *ast.DeferStmt: children = append(children, tok(n.Defer, len("defer"))) case *ast.Ellipsis: children = append(children, tok(n.Ellipsis, len("..."))) case *ast.EmptyStmt: // nop case *ast.ExprStmt: // nop case *ast.Field: // TODO(adonovan): Field.{Doc,Comment,Tag}? case *ast.FieldList: children = append(children, tok(n.Opening, len("(")), tok(n.Closing, len(")"))) case *ast.File: // TODO test: Doc children = append(children, tok(n.Package, len("package"))) case *ast.ForStmt: children = append(children, tok(n.For, len("for"))) case *ast.FuncDecl: // TODO(adonovan): FuncDecl.Comment? // Uniquely, FuncDecl breaks the invariant that // preorder traversal yields tokens in lexical order: // in fact, FuncDecl.Recv precedes FuncDecl.Type.Func. // // As a workaround, we inline the case for FuncType // here and order things correctly. // children = nil // discard ast.Walk(FuncDecl) info subtrees children = append(children, tok(n.Type.Func, len("func"))) if n.Recv != nil { children = append(children, n.Recv) } children = append(children, n.Name) if n.Type.Params != nil { children = append(children, n.Type.Params) } if n.Type.Results != nil { children = append(children, n.Type.Results) } if n.Body != nil { children = append(children, n.Body) } case *ast.FuncLit: // nop case *ast.FuncType: if n.Func != 0 { children = append(children, tok(n.Func, len("func"))) } case *ast.GenDecl: children = append(children, tok(n.TokPos, len(n.Tok.String()))) if n.Lparen != 0 { children = append(children, tok(n.Lparen, len("(")), tok(n.Rparen, len(")"))) } case *ast.GoStmt: children = append(children, tok(n.Go, len("go"))) case *ast.Ident: children = append(children, tok(n.NamePos, len(n.Name))) case *ast.IfStmt: children = append(children, tok(n.If, len("if"))) case *ast.ImportSpec: // TODO(adonovan): ImportSpec.{Doc,EndPos}? case *ast.IncDecStmt: children = append(children, tok(n.TokPos, len(n.Tok.String()))) case *ast.IndexExpr: children = append(children, tok(n.Lbrack, len("{")), tok(n.Rbrack, len("}"))) case *ast.InterfaceType: children = append(children, tok(n.Interface, len("interface"))) case *ast.KeyValueExpr: children = append(children, tok(n.Colon, len(":"))) case *ast.LabeledStmt: children = append(children, tok(n.Colon, len(":"))) case *ast.MapType: children = append(children, tok(n.Map, len("map"))) case *ast.ParenExpr: children = append(children, tok(n.Lparen, len("(")), tok(n.Rparen, len(")"))) case *ast.RangeStmt: children = append(children, tok(n.For, len("for")), tok(n.TokPos, len(n.Tok.String()))) case *ast.ReturnStmt: children = append(children, tok(n.Return, len("return"))) case *ast.SelectStmt: children = append(children, tok(n.Select, len("select"))) case *ast.SelectorExpr: // nop case *ast.SendStmt: children = append(children, tok(n.Arrow, len("<-"))) case *ast.SliceExpr: children = append(children, tok(n.Lbrack, len("[")), tok(n.Rbrack, len("]"))) case *ast.StarExpr: children = append(children, tok(n.Star, len("*"))) case *ast.StructType: children = append(children, tok(n.Struct, len("struct"))) case *ast.SwitchStmt: children = append(children, tok(n.Switch, len("switch"))) case *ast.TypeAssertExpr: children = append(children, tok(n.Lparen-1, len(".")), tok(n.Lparen, len("(")), tok(n.Rparen, len(")"))) case *ast.TypeSpec: // TODO(adonovan): TypeSpec.{Doc,Comment}? case *ast.TypeSwitchStmt: children = append(children, tok(n.Switch, len("switch"))) case *ast.UnaryExpr: children = append(children, tok(n.OpPos, len(n.Op.String()))) case *ast.ValueSpec: // TODO(adonovan): ValueSpec.{Doc,Comment}? case *ast.BadDecl, *ast.BadExpr, *ast.BadStmt: // nop } // TODO(adonovan): opt: merge the logic of ast.Inspect() into // the switch above so we can make interleaved callbacks for // both Nodes and Tokens in the right order and avoid the need // to sort. sort.Sort(byPos(children)) return children } type byPos []ast.Node func (sl byPos) Len() int { return len(sl) } func (sl byPos) Less(i, j int) bool { return sl[i].Pos() < sl[j].Pos() } func (sl byPos) Swap(i, j int) { sl[i], sl[j] = sl[j], sl[i] } // NodeDescription returns a description of the concrete type of n suitable // for a user interface. // // TODO(adonovan): in some cases (e.g. Field, FieldList, Ident, // StarExpr) we could be much more specific given the path to the AST // root. Perhaps we should do that. // func NodeDescription(n ast.Node) string { switch n := n.(type) { case *ast.ArrayType: return "array type" case *ast.AssignStmt: return "assignment" case *ast.BadDecl: return "bad declaration" case *ast.BadExpr: return "bad expression" case *ast.BadStmt: return "bad statement" case *ast.BasicLit: return "basic literal" case *ast.BinaryExpr: return fmt.Sprintf("binary %s operation", n.Op) case *ast.BlockStmt: return "block" case *ast.BranchStmt: switch n.Tok { case token.BREAK: return "break statement" case token.CONTINUE: return "continue statement" case token.GOTO: return "goto statement" case token.FALLTHROUGH: return "fall-through statement" } case *ast.CallExpr: if len(n.Args) == 1 && !n.Ellipsis.IsValid() { return "function call (or conversion)" } return "function call" case *ast.CaseClause: return "case clause" case *ast.ChanType: return "channel type" case *ast.CommClause: return "communication clause" case *ast.Comment: return "comment" case *ast.CommentGroup: return "comment group" case *ast.CompositeLit: return "composite literal" case *ast.DeclStmt: return NodeDescription(n.Decl) + " statement" case *ast.DeferStmt: return "defer statement" case *ast.Ellipsis: return "ellipsis" case *ast.EmptyStmt: return "empty statement" case *ast.ExprStmt: return "expression statement" case *ast.Field: // Can be any of these: // struct {x, y int} -- struct field(s) // struct {T} -- anon struct field // interface {I} -- interface embedding // interface {f()} -- interface method // func (A) func(B) C -- receiver, param(s), result(s) return "field/method/parameter" case *ast.FieldList: return "field/method/parameter list" case *ast.File: return "source file" case *ast.ForStmt: return "for loop" case *ast.FuncDecl: return "function declaration" case *ast.FuncLit: return "function literal" case *ast.FuncType: return "function type" case *ast.GenDecl: switch n.Tok { case token.IMPORT: return "import declaration" case token.CONST: return "constant declaration" case token.TYPE: return "type declaration" case token.VAR: return "variable declaration" } case *ast.GoStmt: return "go statement" case *ast.Ident: return "identifier" case *ast.IfStmt: return "if statement" case *ast.ImportSpec: return "import specification" case *ast.IncDecStmt: if n.Tok == token.INC { return "increment statement" } return "decrement statement" case *ast.IndexExpr: return "index expression" case *ast.InterfaceType: return "interface type" case *ast.KeyValueExpr: return "key/value association" case *ast.LabeledStmt: return "statement label" case *ast.MapType: return "map type" case *ast.Package: return "package" case *ast.ParenExpr: return "parenthesized " + NodeDescription(n.X) case *ast.RangeStmt: return "range loop" case *ast.ReturnStmt: return "return statement" case *ast.SelectStmt: return "select statement" case *ast.SelectorExpr: return "selector" case *ast.SendStmt: return "channel send" case *ast.SliceExpr: return "slice expression" case *ast.StarExpr: return "*-operation" // load/store expr or pointer type case *ast.StructType: return "struct type" case *ast.SwitchStmt: return "switch statement" case *ast.TypeAssertExpr: return "type assertion" case *ast.TypeSpec: return "type specification" case *ast.TypeSwitchStmt: return "type switch" case *ast.UnaryExpr: return fmt.Sprintf("unary %s operation", n.Op) case *ast.ValueSpec: return "value specification" } panic(fmt.Sprintf("unexpected node type: %T", n)) } ================================================ FILE: vendor/golang.org/x/tools/go/ast/astutil/imports.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package astutil contains common utilities for working with the Go AST. package astutil // import "golang.org/x/tools/go/ast/astutil" import ( "fmt" "go/ast" "go/token" "strconv" "strings" ) // AddImport adds the import path to the file f, if absent. func AddImport(fset *token.FileSet, f *ast.File, ipath string) (added bool) { return AddNamedImport(fset, f, "", ipath) } // AddNamedImport adds the import path to the file f, if absent. // If name is not empty, it is used to rename the import. // // For example, calling // AddNamedImport(fset, f, "pathpkg", "path") // adds // import pathpkg "path" func AddNamedImport(fset *token.FileSet, f *ast.File, name, ipath string) (added bool) { if imports(f, ipath) { return false } newImport := &ast.ImportSpec{ Path: &ast.BasicLit{ Kind: token.STRING, Value: strconv.Quote(ipath), }, } if name != "" { newImport.Name = &ast.Ident{Name: name} } // Find an import decl to add to. // The goal is to find an existing import // whose import path has the longest shared // prefix with ipath. var ( bestMatch = -1 // length of longest shared prefix lastImport = -1 // index in f.Decls of the file's final import decl impDecl *ast.GenDecl // import decl containing the best match impIndex = -1 // spec index in impDecl containing the best match ) for i, decl := range f.Decls { gen, ok := decl.(*ast.GenDecl) if ok && gen.Tok == token.IMPORT { lastImport = i // Do not add to import "C", to avoid disrupting the // association with its doc comment, breaking cgo. if declImports(gen, "C") { continue } // Match an empty import decl if that's all that is available. if len(gen.Specs) == 0 && bestMatch == -1 { impDecl = gen } // Compute longest shared prefix with imports in this group. for j, spec := range gen.Specs { impspec := spec.(*ast.ImportSpec) n := matchLen(importPath(impspec), ipath) if n > bestMatch { bestMatch = n impDecl = gen impIndex = j } } } } // If no import decl found, add one after the last import. if impDecl == nil { impDecl = &ast.GenDecl{ Tok: token.IMPORT, } if lastImport >= 0 { impDecl.TokPos = f.Decls[lastImport].End() } else { // There are no existing imports. // Our new import goes after the package declaration and after // the comment, if any, that starts on the same line as the // package declaration. impDecl.TokPos = f.Package file := fset.File(f.Package) pkgLine := file.Line(f.Package) for _, c := range f.Comments { if file.Line(c.Pos()) > pkgLine { break } impDecl.TokPos = c.End() } } f.Decls = append(f.Decls, nil) copy(f.Decls[lastImport+2:], f.Decls[lastImport+1:]) f.Decls[lastImport+1] = impDecl } // Insert new import at insertAt. insertAt := 0 if impIndex >= 0 { // insert after the found import insertAt = impIndex + 1 } impDecl.Specs = append(impDecl.Specs, nil) copy(impDecl.Specs[insertAt+1:], impDecl.Specs[insertAt:]) impDecl.Specs[insertAt] = newImport pos := impDecl.Pos() if insertAt > 0 { // If there is a comment after an existing import, preserve the comment // position by adding the new import after the comment. if spec, ok := impDecl.Specs[insertAt-1].(*ast.ImportSpec); ok && spec.Comment != nil { pos = spec.Comment.End() } else { // Assign same position as the previous import, // so that the sorter sees it as being in the same block. pos = impDecl.Specs[insertAt-1].Pos() } } if newImport.Name != nil { newImport.Name.NamePos = pos } newImport.Path.ValuePos = pos newImport.EndPos = pos // Clean up parens. impDecl contains at least one spec. if len(impDecl.Specs) == 1 { // Remove unneeded parens. impDecl.Lparen = token.NoPos } else if !impDecl.Lparen.IsValid() { // impDecl needs parens added. impDecl.Lparen = impDecl.Specs[0].Pos() } f.Imports = append(f.Imports, newImport) if len(f.Decls) <= 1 { return true } // Merge all the import declarations into the first one. var first *ast.GenDecl for i := 0; i < len(f.Decls); i++ { decl := f.Decls[i] gen, ok := decl.(*ast.GenDecl) if !ok || gen.Tok != token.IMPORT || declImports(gen, "C") { continue } if first == nil { first = gen continue // Don't touch the first one. } // We now know there is more than one package in this import // declaration. Ensure that it ends up parenthesized. first.Lparen = first.Pos() // Move the imports of the other import declaration to the first one. for _, spec := range gen.Specs { spec.(*ast.ImportSpec).Path.ValuePos = first.Pos() first.Specs = append(first.Specs, spec) } f.Decls = append(f.Decls[:i], f.Decls[i+1:]...) i-- } return true } // DeleteImport deletes the import path from the file f, if present. func DeleteImport(fset *token.FileSet, f *ast.File, path string) (deleted bool) { return DeleteNamedImport(fset, f, "", path) } // DeleteNamedImport deletes the import with the given name and path from the file f, if present. func DeleteNamedImport(fset *token.FileSet, f *ast.File, name, path string) (deleted bool) { var delspecs []*ast.ImportSpec var delcomments []*ast.CommentGroup // Find the import nodes that import path, if any. for i := 0; i < len(f.Decls); i++ { decl := f.Decls[i] gen, ok := decl.(*ast.GenDecl) if !ok || gen.Tok != token.IMPORT { continue } for j := 0; j < len(gen.Specs); j++ { spec := gen.Specs[j] impspec := spec.(*ast.ImportSpec) if impspec.Name == nil && name != "" { continue } if impspec.Name != nil && impspec.Name.Name != name { continue } if importPath(impspec) != path { continue } // We found an import spec that imports path. // Delete it. delspecs = append(delspecs, impspec) deleted = true copy(gen.Specs[j:], gen.Specs[j+1:]) gen.Specs = gen.Specs[:len(gen.Specs)-1] // If this was the last import spec in this decl, // delete the decl, too. if len(gen.Specs) == 0 { copy(f.Decls[i:], f.Decls[i+1:]) f.Decls = f.Decls[:len(f.Decls)-1] i-- break } else if len(gen.Specs) == 1 { if impspec.Doc != nil { delcomments = append(delcomments, impspec.Doc) } if impspec.Comment != nil { delcomments = append(delcomments, impspec.Comment) } for _, cg := range f.Comments { // Found comment on the same line as the import spec. if cg.End() < impspec.Pos() && fset.Position(cg.End()).Line == fset.Position(impspec.Pos()).Line { delcomments = append(delcomments, cg) break } } spec := gen.Specs[0].(*ast.ImportSpec) // Move the documentation right after the import decl. if spec.Doc != nil { for fset.Position(gen.TokPos).Line+1 < fset.Position(spec.Doc.Pos()).Line { fset.File(gen.TokPos).MergeLine(fset.Position(gen.TokPos).Line) } } for _, cg := range f.Comments { if cg.End() < spec.Pos() && fset.Position(cg.End()).Line == fset.Position(spec.Pos()).Line { for fset.Position(gen.TokPos).Line+1 < fset.Position(spec.Pos()).Line { fset.File(gen.TokPos).MergeLine(fset.Position(gen.TokPos).Line) } break } } } if j > 0 { lastImpspec := gen.Specs[j-1].(*ast.ImportSpec) lastLine := fset.Position(lastImpspec.Path.ValuePos).Line line := fset.Position(impspec.Path.ValuePos).Line // We deleted an entry but now there may be // a blank line-sized hole where the import was. if line-lastLine > 1 { // There was a blank line immediately preceding the deleted import, // so there's no need to close the hole. // Do nothing. } else { // There was no blank line. Close the hole. fset.File(gen.Rparen).MergeLine(line) } } j-- } } // Delete imports from f.Imports. for i := 0; i < len(f.Imports); i++ { imp := f.Imports[i] for j, del := range delspecs { if imp == del { copy(f.Imports[i:], f.Imports[i+1:]) f.Imports = f.Imports[:len(f.Imports)-1] copy(delspecs[j:], delspecs[j+1:]) delspecs = delspecs[:len(delspecs)-1] i-- break } } } // Delete comments from f.Comments. for i := 0; i < len(f.Comments); i++ { cg := f.Comments[i] for j, del := range delcomments { if cg == del { copy(f.Comments[i:], f.Comments[i+1:]) f.Comments = f.Comments[:len(f.Comments)-1] copy(delcomments[j:], delcomments[j+1:]) delcomments = delcomments[:len(delcomments)-1] i-- break } } } if len(delspecs) > 0 { panic(fmt.Sprintf("deleted specs from Decls but not Imports: %v", delspecs)) } return } // RewriteImport rewrites any import of path oldPath to path newPath. func RewriteImport(fset *token.FileSet, f *ast.File, oldPath, newPath string) (rewrote bool) { for _, imp := range f.Imports { if importPath(imp) == oldPath { rewrote = true // record old End, because the default is to compute // it using the length of imp.Path.Value. imp.EndPos = imp.End() imp.Path.Value = strconv.Quote(newPath) } } return } // UsesImport reports whether a given import is used. func UsesImport(f *ast.File, path string) (used bool) { spec := importSpec(f, path) if spec == nil { return } name := spec.Name.String() switch name { case "<nil>": // If the package name is not explicitly specified, // make an educated guess. This is not guaranteed to be correct. lastSlash := strings.LastIndex(path, "/") if lastSlash == -1 { name = path } else { name = path[lastSlash+1:] } case "_", ".": // Not sure if this import is used - err on the side of caution. return true } ast.Walk(visitFn(func(n ast.Node) { sel, ok := n.(*ast.SelectorExpr) if ok && isTopName(sel.X, name) { used = true } }), f) return } type visitFn func(node ast.Node) func (fn visitFn) Visit(node ast.Node) ast.Visitor { fn(node) return fn } // imports returns true if f imports path. func imports(f *ast.File, path string) bool { return importSpec(f, path) != nil } // importSpec returns the import spec if f imports path, // or nil otherwise. func importSpec(f *ast.File, path string) *ast.ImportSpec { for _, s := range f.Imports { if importPath(s) == path { return s } } return nil } // importPath returns the unquoted import path of s, // or "" if the path is not properly quoted. func importPath(s *ast.ImportSpec) string { t, err := strconv.Unquote(s.Path.Value) if err == nil { return t } return "" } // declImports reports whether gen contains an import of path. func declImports(gen *ast.GenDecl, path string) bool { if gen.Tok != token.IMPORT { return false } for _, spec := range gen.Specs { impspec := spec.(*ast.ImportSpec) if importPath(impspec) == path { return true } } return false } // matchLen returns the length of the longest path segment prefix shared by x and y. func matchLen(x, y string) int { n := 0 for i := 0; i < len(x) && i < len(y) && x[i] == y[i]; i++ { if x[i] == '/' { n++ } } return n } // isTopName returns true if n is a top-level unresolved identifier with the given name. func isTopName(n ast.Expr, name string) bool { id, ok := n.(*ast.Ident) return ok && id.Name == name && id.Obj == nil } // Imports returns the file imports grouped by paragraph. func Imports(fset *token.FileSet, f *ast.File) [][]*ast.ImportSpec { var groups [][]*ast.ImportSpec for _, decl := range f.Decls { genDecl, ok := decl.(*ast.GenDecl) if !ok || genDecl.Tok != token.IMPORT { break } group := []*ast.ImportSpec{} var lastLine int for _, spec := range genDecl.Specs { importSpec := spec.(*ast.ImportSpec) pos := importSpec.Path.ValuePos line := fset.Position(pos).Line if lastLine > 0 && pos > 0 && line-lastLine > 1 { groups = append(groups, group) group = []*ast.ImportSpec{} } group = append(group, importSpec) lastLine = line } groups = append(groups, group) } return groups } ================================================ FILE: vendor/golang.org/x/tools/go/ast/astutil/util.go ================================================ package astutil import "go/ast" // Unparen returns e with any enclosing parentheses stripped. func Unparen(e ast.Expr) ast.Expr { for { p, ok := e.(*ast.ParenExpr) if !ok { return e } e = p.X } } ================================================ FILE: vendor/golang.org/x/tools/imports/fastwalk.go ================================================ // Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // A faster implementation of filepath.Walk. // // filepath.Walk's design necessarily calls os.Lstat on each file, // even if the caller needs less info. And goimports only need to know // the type of each file. The kernel interface provides the type in // the Readdir call but the standard library ignored it. // fastwalk_unix.go contains a fork of the syscall routines. // // See golang.org/issue/16399 package imports import ( "errors" "os" "path/filepath" "runtime" ) // traverseLink is a sentinel error for fastWalk, similar to filepath.SkipDir. var traverseLink = errors.New("traverse symlink, assuming target is a directory") // fastWalk walks the file tree rooted at root, calling walkFn for // each file or directory in the tree, including root. // // If fastWalk returns filepath.SkipDir, the directory is skipped. // // Unlike filepath.Walk: // * file stat calls must be done by the user. // The only provided metadata is the file type, which does not include // any permission bits. // * multiple goroutines stat the filesystem concurrently. The provided // walkFn must be safe for concurrent use. // * fastWalk can follow symlinks if walkFn returns the traverseLink // sentinel error. It is the walkFn's responsibility to prevent // fastWalk from going into symlink cycles. func fastWalk(root string, walkFn func(path string, typ os.FileMode) error) error { // TODO(bradfitz): make numWorkers configurable? We used a // minimum of 4 to give the kernel more info about multiple // things we want, in hopes its I/O scheduling can take // advantage of that. Hopefully most are in cache. Maybe 4 is // even too low of a minimum. Profile more. numWorkers := 4 if n := runtime.NumCPU(); n > numWorkers { numWorkers = n } w := &walker{ fn: walkFn, enqueuec: make(chan walkItem, numWorkers), // buffered for performance workc: make(chan walkItem, numWorkers), // buffered for performance donec: make(chan struct{}), // buffered for correctness & not leaking goroutines: resc: make(chan error, numWorkers), } defer close(w.donec) // TODO(bradfitz): start the workers as needed? maybe not worth it. for i := 0; i < numWorkers; i++ { go w.doWork() } todo := []walkItem{{dir: root}} out := 0 for { workc := w.workc var workItem walkItem if len(todo) == 0 { workc = nil } else { workItem = todo[len(todo)-1] } select { case workc <- workItem: todo = todo[:len(todo)-1] out++ case it := <-w.enqueuec: todo = append(todo, it) case err := <-w.resc: out-- if err != nil { return err } if out == 0 && len(todo) == 0 { // It's safe to quit here, as long as the buffered // enqueue channel isn't also readable, which might // happen if the worker sends both another unit of // work and its result before the other select was // scheduled and both w.resc and w.enqueuec were // readable. select { case it := <-w.enqueuec: todo = append(todo, it) default: return nil } } } } } // doWork reads directories as instructed (via workc) and runs the // user's callback function. func (w *walker) doWork() { for { select { case <-w.donec: return case it := <-w.workc: w.resc <- w.walk(it.dir, !it.callbackDone) } } } type walker struct { fn func(path string, typ os.FileMode) error donec chan struct{} // closed on fastWalk's return workc chan walkItem // to workers enqueuec chan walkItem // from workers resc chan error // from workers } type walkItem struct { dir string callbackDone bool // callback already called; don't do it again } func (w *walker) enqueue(it walkItem) { select { case w.enqueuec <- it: case <-w.donec: } } func (w *walker) onDirEnt(dirName, baseName string, typ os.FileMode) error { joined := dirName + string(os.PathSeparator) + baseName if typ == os.ModeDir { w.enqueue(walkItem{dir: joined}) return nil } err := w.fn(joined, typ) if typ == os.ModeSymlink { if err == traverseLink { // Set callbackDone so we don't call it twice for both the // symlink-as-symlink and the symlink-as-directory later: w.enqueue(walkItem{dir: joined, callbackDone: true}) return nil } if err == filepath.SkipDir { // Permit SkipDir on symlinks too. return nil } } return err } func (w *walker) walk(root string, runUserCallback bool) error { if runUserCallback { err := w.fn(root, os.ModeDir) if err == filepath.SkipDir { return nil } if err != nil { return err } } return readDir(root, w.onDirEnt) } ================================================ FILE: vendor/golang.org/x/tools/imports/fastwalk_dirent_fileno.go ================================================ // Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build freebsd openbsd netbsd package imports import "syscall" func direntInode(dirent *syscall.Dirent) uint64 { return uint64(dirent.Fileno) } ================================================ FILE: vendor/golang.org/x/tools/imports/fastwalk_dirent_ino.go ================================================ // Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build linux,!appengine darwin package imports import "syscall" func direntInode(dirent *syscall.Dirent) uint64 { return uint64(dirent.Ino) } ================================================ FILE: vendor/golang.org/x/tools/imports/fastwalk_portable.go ================================================ // Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build appengine !linux,!darwin,!freebsd,!openbsd,!netbsd package imports import ( "io/ioutil" "os" ) // readDir calls fn for each directory entry in dirName. // It does not descend into directories or follow symlinks. // If fn returns a non-nil error, readDir returns with that error // immediately. func readDir(dirName string, fn func(dirName, entName string, typ os.FileMode) error) error { fis, err := ioutil.ReadDir(dirName) if err != nil { return err } for _, fi := range fis { if err := fn(dirName, fi.Name(), fi.Mode()&os.ModeType); err != nil { return err } } return nil } ================================================ FILE: vendor/golang.org/x/tools/imports/fastwalk_unix.go ================================================ // Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build linux,!appengine darwin freebsd openbsd netbsd package imports import ( "bytes" "fmt" "os" "syscall" "unsafe" ) const blockSize = 8 << 10 // unknownFileMode is a sentinel (and bogus) os.FileMode // value used to represent a syscall.DT_UNKNOWN Dirent.Type. const unknownFileMode os.FileMode = os.ModeNamedPipe | os.ModeSocket | os.ModeDevice func readDir(dirName string, fn func(dirName, entName string, typ os.FileMode) error) error { fd, err := syscall.Open(dirName, 0, 0) if err != nil { return err } defer syscall.Close(fd) // The buffer must be at least a block long. buf := make([]byte, blockSize) // stack-allocated; doesn't escape bufp := 0 // starting read position in buf nbuf := 0 // end valid data in buf for { if bufp >= nbuf { bufp = 0 nbuf, err = syscall.ReadDirent(fd, buf) if err != nil { return os.NewSyscallError("readdirent", err) } if nbuf <= 0 { return nil } } consumed, name, typ := parseDirEnt(buf[bufp:nbuf]) bufp += consumed if name == "" || name == "." || name == ".." { continue } // Fallback for filesystems (like old XFS) that don't // support Dirent.Type and have DT_UNKNOWN (0) there // instead. if typ == unknownFileMode { fi, err := os.Lstat(dirName + "/" + name) if err != nil { // It got deleted in the meantime. if os.IsNotExist(err) { continue } return err } typ = fi.Mode() & os.ModeType } if err := fn(dirName, name, typ); err != nil { return err } } } func parseDirEnt(buf []byte) (consumed int, name string, typ os.FileMode) { // golang.org/issue/15653 dirent := (*syscall.Dirent)(unsafe.Pointer(&buf[0])) if v := unsafe.Offsetof(dirent.Reclen) + unsafe.Sizeof(dirent.Reclen); uintptr(len(buf)) < v { panic(fmt.Sprintf("buf size of %d smaller than dirent header size %d", len(buf), v)) } if len(buf) < int(dirent.Reclen) { panic(fmt.Sprintf("buf size %d < record length %d", len(buf), dirent.Reclen)) } consumed = int(dirent.Reclen) if direntInode(dirent) == 0 { // File absent in directory. return } switch dirent.Type { case syscall.DT_REG: typ = 0 case syscall.DT_DIR: typ = os.ModeDir case syscall.DT_LNK: typ = os.ModeSymlink case syscall.DT_BLK: typ = os.ModeDevice case syscall.DT_FIFO: typ = os.ModeNamedPipe case syscall.DT_SOCK: typ = os.ModeSocket case syscall.DT_UNKNOWN: typ = unknownFileMode default: // Skip weird things. // It's probably a DT_WHT (http://lwn.net/Articles/325369/) // or something. Revisit if/when this package is moved outside // of goimports. goimports only cares about regular files, // symlinks, and directories. return } nameBuf := (*[unsafe.Sizeof(dirent.Name)]byte)(unsafe.Pointer(&dirent.Name[0])) nameLen := bytes.IndexByte(nameBuf[:], 0) if nameLen < 0 { panic("failed to find terminating 0 byte in dirent") } // Special cases for common things: if nameLen == 1 && nameBuf[0] == '.' { name = "." } else if nameLen == 2 && nameBuf[0] == '.' && nameBuf[1] == '.' { name = ".." } else { name = string(nameBuf[:nameLen]) } return } ================================================ FILE: vendor/golang.org/x/tools/imports/fix.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package imports import ( "bufio" "bytes" "fmt" "go/ast" "go/build" "go/parser" "go/token" "io/ioutil" "log" "os" "path" "path/filepath" "sort" "strings" "sync" "golang.org/x/tools/go/ast/astutil" ) // Debug controls verbose logging. var Debug = false var ( inTests = false // set true by fix_test.go; if false, no need to use testMu testMu sync.RWMutex // guards globals reset by tests; used only if inTests ) // If set, LocalPrefix instructs Process to sort import paths with the given // prefix into another group after 3rd-party packages. var LocalPrefix string // importToGroup is a list of functions which map from an import path to // a group number. var importToGroup = []func(importPath string) (num int, ok bool){ func(importPath string) (num int, ok bool) { if LocalPrefix != "" && strings.HasPrefix(importPath, LocalPrefix) { return 3, true } return }, func(importPath string) (num int, ok bool) { if strings.HasPrefix(importPath, "appengine") { return 2, true } return }, func(importPath string) (num int, ok bool) { if strings.Contains(importPath, ".") { return 1, true } return }, } func importGroup(importPath string) int { for _, fn := range importToGroup { if n, ok := fn(importPath); ok { return n } } return 0 } // packageInfo is a summary of features found in a package. type packageInfo struct { Globals map[string]bool // symbol => true } // dirPackageInfo gets information from other files in the package. func dirPackageInfo(srcDir, filename string) (*packageInfo, error) { considerTests := strings.HasSuffix(filename, "_test.go") // Handle file from stdin if _, err := os.Stat(filename); err != nil { if os.IsNotExist(err) { return &packageInfo{}, nil } return nil, err } fileBase := filepath.Base(filename) packageFileInfos, err := ioutil.ReadDir(srcDir) if err != nil { return nil, err } info := &packageInfo{Globals: make(map[string]bool)} for _, fi := range packageFileInfos { if fi.Name() == fileBase || !strings.HasSuffix(fi.Name(), ".go") { continue } if !considerTests && strings.HasSuffix(fi.Name(), "_test.go") { continue } fileSet := token.NewFileSet() root, err := parser.ParseFile(fileSet, filepath.Join(srcDir, fi.Name()), nil, 0) if err != nil { continue } for _, decl := range root.Decls { genDecl, ok := decl.(*ast.GenDecl) if !ok { continue } for _, spec := range genDecl.Specs { valueSpec, ok := spec.(*ast.ValueSpec) if !ok { continue } info.Globals[valueSpec.Names[0].Name] = true } } } return info, nil } func fixImports(fset *token.FileSet, f *ast.File, filename string) (added []string, err error) { // refs are a set of possible package references currently unsatisfied by imports. // first key: either base package (e.g. "fmt") or renamed package // second key: referenced package symbol (e.g. "Println") refs := make(map[string]map[string]bool) // decls are the current package imports. key is base package or renamed package. decls := make(map[string]*ast.ImportSpec) abs, err := filepath.Abs(filename) if err != nil { return nil, err } srcDir := filepath.Dir(abs) if Debug { log.Printf("fixImports(filename=%q), abs=%q, srcDir=%q ...", filename, abs, srcDir) } var packageInfo *packageInfo var loadedPackageInfo bool // collect potential uses of packages. var visitor visitFn visitor = visitFn(func(node ast.Node) ast.Visitor { if node == nil { return visitor } switch v := node.(type) { case *ast.ImportSpec: if v.Name != nil { decls[v.Name.Name] = v break } ipath := strings.Trim(v.Path.Value, `"`) if ipath == "C" { break } local := importPathToName(ipath, srcDir) decls[local] = v case *ast.SelectorExpr: xident, ok := v.X.(*ast.Ident) if !ok { break } if xident.Obj != nil { // if the parser can resolve it, it's not a package ref break } pkgName := xident.Name if refs[pkgName] == nil { refs[pkgName] = make(map[string]bool) } if !loadedPackageInfo { loadedPackageInfo = true packageInfo, _ = dirPackageInfo(srcDir, filename) } if decls[pkgName] == nil && (packageInfo == nil || !packageInfo.Globals[pkgName]) { refs[pkgName][v.Sel.Name] = true } } return visitor }) ast.Walk(visitor, f) // Nil out any unused ImportSpecs, to be removed in following passes unusedImport := map[string]string{} for pkg, is := range decls { if refs[pkg] == nil && pkg != "_" && pkg != "." { name := "" if is.Name != nil { name = is.Name.Name } unusedImport[strings.Trim(is.Path.Value, `"`)] = name } } for ipath, name := range unusedImport { if ipath == "C" { // Don't remove cgo stuff. continue } astutil.DeleteNamedImport(fset, f, name, ipath) } for pkgName, symbols := range refs { if len(symbols) == 0 { // skip over packages already imported delete(refs, pkgName) } } // Search for imports matching potential package references. searches := 0 type result struct { ipath string // import path (if err == nil) name string // optional name to rename import as err error } results := make(chan result) for pkgName, symbols := range refs { go func(pkgName string, symbols map[string]bool) { ipath, rename, err := findImport(pkgName, symbols, filename) r := result{ipath: ipath, err: err} if rename { r.name = pkgName } results <- r }(pkgName, symbols) searches++ } for i := 0; i < searches; i++ { result := <-results if result.err != nil { return nil, result.err } if result.ipath != "" { if result.name != "" { astutil.AddNamedImport(fset, f, result.name, result.ipath) } else { astutil.AddImport(fset, f, result.ipath) } added = append(added, result.ipath) } } return added, nil } // importPathToName returns the package name for the given import path. var importPathToName func(importPath, srcDir string) (packageName string) = importPathToNameGoPath // importPathToNameBasic assumes the package name is the base of import path. func importPathToNameBasic(importPath, srcDir string) (packageName string) { return path.Base(importPath) } // importPathToNameGoPath finds out the actual package name, as declared in its .go files. // If there's a problem, it falls back to using importPathToNameBasic. func importPathToNameGoPath(importPath, srcDir string) (packageName string) { // Fast path for standard library without going to disk. if pkg, ok := stdImportPackage[importPath]; ok { return pkg } pkgName, err := importPathToNameGoPathParse(importPath, srcDir) if Debug { log.Printf("importPathToNameGoPathParse(%q, srcDir=%q) = %q, %v", importPath, srcDir, pkgName, err) } if err == nil { return pkgName } return importPathToNameBasic(importPath, srcDir) } // importPathToNameGoPathParse is a faster version of build.Import if // the only thing desired is the package name. It uses build.FindOnly // to find the directory and then only parses one file in the package, // trusting that the files in the directory are consistent. func importPathToNameGoPathParse(importPath, srcDir string) (packageName string, err error) { buildPkg, err := build.Import(importPath, srcDir, build.FindOnly) if err != nil { return "", err } d, err := os.Open(buildPkg.Dir) if err != nil { return "", err } names, err := d.Readdirnames(-1) d.Close() if err != nil { return "", err } sort.Strings(names) // to have predictable behavior var lastErr error var nfile int for _, name := range names { if !strings.HasSuffix(name, ".go") { continue } if strings.HasSuffix(name, "_test.go") { continue } nfile++ fullFile := filepath.Join(buildPkg.Dir, name) fset := token.NewFileSet() f, err := parser.ParseFile(fset, fullFile, nil, parser.PackageClauseOnly) if err != nil { lastErr = err continue } pkgName := f.Name.Name if pkgName == "documentation" { // Special case from go/build.ImportDir, not // handled by ctx.MatchFile. continue } if pkgName == "main" { // Also skip package main, assuming it's a +build ignore generator or example. // Since you can't import a package main anyway, there's no harm here. continue } return pkgName, nil } if lastErr != nil { return "", lastErr } return "", fmt.Errorf("no importable package found in %d Go files", nfile) } var stdImportPackage = map[string]string{} // "net/http" => "http" func init() { // Nothing in the standard library has a package name not // matching its import base name. for _, pkg := range stdlib { if _, ok := stdImportPackage[pkg]; !ok { stdImportPackage[pkg] = path.Base(pkg) } } } // Directory-scanning state. var ( // scanGoRootOnce guards calling scanGoRoot (for $GOROOT) scanGoRootOnce sync.Once // scanGoPathOnce guards calling scanGoPath (for $GOPATH) scanGoPathOnce sync.Once // populateIgnoreOnce guards calling populateIgnore populateIgnoreOnce sync.Once ignoredDirs []os.FileInfo dirScanMu sync.RWMutex dirScan map[string]*pkg // abs dir path => *pkg ) type pkg struct { dir string // absolute file path to pkg directory ("/usr/lib/go/src/net/http") importPath string // full pkg import path ("net/http", "foo/bar/vendor/a/b") importPathShort string // vendorless import path ("net/http", "a/b") } // byImportPathShortLength sorts by the short import path length, breaking ties on the // import string itself. type byImportPathShortLength []*pkg func (s byImportPathShortLength) Len() int { return len(s) } func (s byImportPathShortLength) Less(i, j int) bool { vi, vj := s[i].importPathShort, s[j].importPathShort return len(vi) < len(vj) || (len(vi) == len(vj) && vi < vj) } func (s byImportPathShortLength) Swap(i, j int) { s[i], s[j] = s[j], s[i] } // gate is a semaphore for limiting concurrency. type gate chan struct{} func (g gate) enter() { g <- struct{}{} } func (g gate) leave() { <-g } var visitedSymlinks struct { sync.Mutex m map[string]struct{} } // guarded by populateIgnoreOnce; populates ignoredDirs. func populateIgnore() { for _, srcDir := range build.Default.SrcDirs() { if srcDir == filepath.Join(build.Default.GOROOT, "src") { continue } populateIgnoredDirs(srcDir) } } // populateIgnoredDirs reads an optional config file at <path>/.goimportsignore // of relative directories to ignore when scanning for go files. // The provided path is one of the $GOPATH entries with "src" appended. func populateIgnoredDirs(path string) { file := filepath.Join(path, ".goimportsignore") slurp, err := ioutil.ReadFile(file) if Debug { if err != nil { log.Print(err) } else { log.Printf("Read %s", file) } } if err != nil { return } bs := bufio.NewScanner(bytes.NewReader(slurp)) for bs.Scan() { line := strings.TrimSpace(bs.Text()) if line == "" || strings.HasPrefix(line, "#") { continue } full := filepath.Join(path, line) if fi, err := os.Stat(full); err == nil { ignoredDirs = append(ignoredDirs, fi) if Debug { log.Printf("Directory added to ignore list: %s", full) } } else if Debug { log.Printf("Error statting entry in .goimportsignore: %v", err) } } } func skipDir(fi os.FileInfo) bool { for _, ignoredDir := range ignoredDirs { if os.SameFile(fi, ignoredDir) { return true } } return false } // shouldTraverse reports whether the symlink fi should, found in dir, // should be followed. It makes sure symlinks were never visited // before to avoid symlink loops. func shouldTraverse(dir string, fi os.FileInfo) bool { path := filepath.Join(dir, fi.Name()) target, err := filepath.EvalSymlinks(path) if err != nil { if !os.IsNotExist(err) { fmt.Fprintln(os.Stderr, err) } return false } ts, err := os.Stat(target) if err != nil { fmt.Fprintln(os.Stderr, err) return false } if !ts.IsDir() { return false } if skipDir(ts) { return false } realParent, err := filepath.EvalSymlinks(dir) if err != nil { fmt.Fprint(os.Stderr, err) return false } realPath := filepath.Join(realParent, fi.Name()) visitedSymlinks.Lock() defer visitedSymlinks.Unlock() if visitedSymlinks.m == nil { visitedSymlinks.m = make(map[string]struct{}) } if _, ok := visitedSymlinks.m[realPath]; ok { return false } visitedSymlinks.m[realPath] = struct{}{} return true } var testHookScanDir = func(dir string) {} var scanGoRootDone = make(chan struct{}) // closed when scanGoRoot is done func scanGoRoot() { go func() { scanGoDirs(true) close(scanGoRootDone) }() } func scanGoPath() { scanGoDirs(false) } func scanGoDirs(goRoot bool) { if Debug { which := "$GOROOT" if !goRoot { which = "$GOPATH" } log.Printf("scanning " + which) defer log.Printf("scanned " + which) } dirScanMu.Lock() if dirScan == nil { dirScan = make(map[string]*pkg) } dirScanMu.Unlock() for _, srcDir := range build.Default.SrcDirs() { isGoroot := srcDir == filepath.Join(build.Default.GOROOT, "src") if isGoroot != goRoot { continue } testHookScanDir(srcDir) walkFn := func(path string, typ os.FileMode) error { dir := filepath.Dir(path) if typ.IsRegular() { if dir == srcDir { // Doesn't make sense to have regular files // directly in your $GOPATH/src or $GOROOT/src. return nil } if !strings.HasSuffix(path, ".go") { return nil } dirScanMu.Lock() if _, dup := dirScan[dir]; !dup { importpath := filepath.ToSlash(dir[len(srcDir)+len("/"):]) dirScan[dir] = &pkg{ importPath: importpath, importPathShort: vendorlessImportPath(importpath), dir: dir, } } dirScanMu.Unlock() return nil } if typ == os.ModeDir { base := filepath.Base(path) if base == "" || base[0] == '.' || base[0] == '_' || base == "testdata" || base == "node_modules" { return filepath.SkipDir } fi, err := os.Lstat(path) if err == nil && skipDir(fi) { if Debug { log.Printf("skipping directory %q under %s", fi.Name(), dir) } return filepath.SkipDir } return nil } if typ == os.ModeSymlink { base := filepath.Base(path) if strings.HasPrefix(base, ".#") { // Emacs noise. return nil } fi, err := os.Lstat(path) if err != nil { // Just ignore it. return nil } if shouldTraverse(dir, fi) { return traverseLink } } return nil } if err := fastWalk(srcDir, walkFn); err != nil { log.Printf("goimports: scanning directory %v: %v", srcDir, err) } } } // vendorlessImportPath returns the devendorized version of the provided import path. // e.g. "foo/bar/vendor/a/b" => "a/b" func vendorlessImportPath(ipath string) string { // Devendorize for use in import statement. if i := strings.LastIndex(ipath, "/vendor/"); i >= 0 { return ipath[i+len("/vendor/"):] } if strings.HasPrefix(ipath, "vendor/") { return ipath[len("vendor/"):] } return ipath } // loadExports returns the set of exported symbols in the package at dir. // It returns nil on error or if the package name in dir does not match expectPackage. var loadExports func(expectPackage, dir string) map[string]bool = loadExportsGoPath func loadExportsGoPath(expectPackage, dir string) map[string]bool { if Debug { log.Printf("loading exports in dir %s (seeking package %s)", dir, expectPackage) } exports := make(map[string]bool) ctx := build.Default // ReadDir is like ioutil.ReadDir, but only returns *.go files // and filters out _test.go files since they're not relevant // and only slow things down. ctx.ReadDir = func(dir string) (notTests []os.FileInfo, err error) { all, err := ioutil.ReadDir(dir) if err != nil { return nil, err } notTests = all[:0] for _, fi := range all { name := fi.Name() if strings.HasSuffix(name, ".go") && !strings.HasSuffix(name, "_test.go") { notTests = append(notTests, fi) } } return notTests, nil } files, err := ctx.ReadDir(dir) if err != nil { log.Print(err) return nil } fset := token.NewFileSet() for _, fi := range files { match, err := ctx.MatchFile(dir, fi.Name()) if err != nil || !match { continue } fullFile := filepath.Join(dir, fi.Name()) f, err := parser.ParseFile(fset, fullFile, nil, 0) if err != nil { if Debug { log.Printf("Parsing %s: %v", fullFile, err) } return nil } pkgName := f.Name.Name if pkgName == "documentation" { // Special case from go/build.ImportDir, not // handled by ctx.MatchFile. continue } if pkgName != expectPackage { if Debug { log.Printf("scan of dir %v is not expected package %v (actually %v)", dir, expectPackage, pkgName) } return nil } for name := range f.Scope.Objects { if ast.IsExported(name) { exports[name] = true } } } if Debug { exportList := make([]string, 0, len(exports)) for k := range exports { exportList = append(exportList, k) } sort.Strings(exportList) log.Printf("loaded exports in dir %v (package %v): %v", dir, expectPackage, strings.Join(exportList, ", ")) } return exports } // findImport searches for a package with the given symbols. // If no package is found, findImport returns ("", false, nil) // // This is declared as a variable rather than a function so goimports // can be easily extended by adding a file with an init function. // // The rename value tells goimports whether to use the package name as // a local qualifier in an import. For example, if findImports("pkg", // "X") returns ("foo/bar", rename=true), then goimports adds the // import line: // import pkg "foo/bar" // to satisfy uses of pkg.X in the file. var findImport func(pkgName string, symbols map[string]bool, filename string) (foundPkg string, rename bool, err error) = findImportGoPath // findImportGoPath is the normal implementation of findImport. // (Some companies have their own internally.) func findImportGoPath(pkgName string, symbols map[string]bool, filename string) (foundPkg string, rename bool, err error) { if inTests { testMu.RLock() defer testMu.RUnlock() } // Fast path for the standard library. // In the common case we hopefully never have to scan the GOPATH, which can // be slow with moving disks. if pkg, rename, ok := findImportStdlib(pkgName, symbols); ok { return pkg, rename, nil } if pkgName == "rand" && symbols["Read"] { // Special-case rand.Read. // // If findImportStdlib didn't find it above, don't go // searching for it, lest it find and pick math/rand // in GOROOT (new as of Go 1.6) // // crypto/rand is the safer choice. return "", false, nil } // TODO(sameer): look at the import lines for other Go files in the // local directory, since the user is likely to import the same packages // in the current Go file. Return rename=true when the other Go files // use a renamed package that's also used in the current file. // Read all the $GOPATH/src/.goimportsignore files before scanning directories. populateIgnoreOnce.Do(populateIgnore) // Start scanning the $GOROOT asynchronously, then run the // GOPATH scan synchronously if needed, and then wait for the // $GOROOT to finish. // // TODO(bradfitz): run each $GOPATH entry async. But nobody // really has more than one anyway, so low priority. scanGoRootOnce.Do(scanGoRoot) // async if !fileInDir(filename, build.Default.GOROOT) { scanGoPathOnce.Do(scanGoPath) // blocking } <-scanGoRootDone // Find candidate packages, looking only at their directory names first. var candidates []*pkg for _, pkg := range dirScan { if pkgIsCandidate(filename, pkgName, pkg) { candidates = append(candidates, pkg) } } // Sort the candidates by their import package length, // assuming that shorter package names are better than long // ones. Note that this sorts by the de-vendored name, so // there's no "penalty" for vendoring. sort.Sort(byImportPathShortLength(candidates)) if Debug { for i, pkg := range candidates { log.Printf("%s candidate %d/%d: %v", pkgName, i+1, len(candidates), pkg.importPathShort) } } // Collect exports for packages with matching names. done := make(chan struct{}) // closed when we find the answer defer close(done) rescv := make([]chan *pkg, len(candidates)) for i := range candidates { rescv[i] = make(chan *pkg) } const maxConcurrentPackageImport = 4 loadExportsSem := make(chan struct{}, maxConcurrentPackageImport) go func() { for i, pkg := range candidates { select { case loadExportsSem <- struct{}{}: select { case <-done: default: } case <-done: return } pkg := pkg resc := rescv[i] go func() { if inTests { testMu.RLock() defer testMu.RUnlock() } defer func() { <-loadExportsSem }() exports := loadExports(pkgName, pkg.dir) // If it doesn't have the right // symbols, send nil to mean no match. for symbol := range symbols { if !exports[symbol] { pkg = nil break } } select { case resc <- pkg: case <-done: } }() } }() for _, resc := range rescv { pkg := <-resc if pkg == nil { continue } // If the package name in the source doesn't match the import path's base, // return true so the rewriter adds a name (import foo "github.com/bar/go-foo") needsRename := path.Base(pkg.importPath) != pkgName return pkg.importPathShort, needsRename, nil } return "", false, nil } // pkgIsCandidate reports whether pkg is a candidate for satisfying the // finding which package pkgIdent in the file named by filename is trying // to refer to. // // This check is purely lexical and is meant to be as fast as possible // because it's run over all $GOPATH directories to filter out poor // candidates in order to limit the CPU and I/O later parsing the // exports in candidate packages. // // filename is the file being formatted. // pkgIdent is the package being searched for, like "client" (if // searching for "client.New") func pkgIsCandidate(filename, pkgIdent string, pkg *pkg) bool { // Check "internal" and "vendor" visibility: if !canUse(filename, pkg.dir) { return false } // Speed optimization to minimize disk I/O: // the last two components on disk must contain the // package name somewhere. // // This permits mismatch naming like directory // "go-foo" being package "foo", or "pkg.v3" being "pkg", // or directory "google.golang.org/api/cloudbilling/v1" // being package "cloudbilling", but doesn't // permit a directory "foo" to be package // "bar", which is strongly discouraged // anyway. There's no reason goimports needs // to be slow just to accomodate that. lastTwo := lastTwoComponents(pkg.importPathShort) if strings.Contains(lastTwo, pkgIdent) { return true } if hasHyphenOrUpperASCII(lastTwo) && !hasHyphenOrUpperASCII(pkgIdent) { lastTwo = lowerASCIIAndRemoveHyphen(lastTwo) if strings.Contains(lastTwo, pkgIdent) { return true } } return false } func hasHyphenOrUpperASCII(s string) bool { for i := 0; i < len(s); i++ { b := s[i] if b == '-' || ('A' <= b && b <= 'Z') { return true } } return false } func lowerASCIIAndRemoveHyphen(s string) (ret string) { buf := make([]byte, 0, len(s)) for i := 0; i < len(s); i++ { b := s[i] switch { case b == '-': continue case 'A' <= b && b <= 'Z': buf = append(buf, b+('a'-'A')) default: buf = append(buf, b) } } return string(buf) } // canUse reports whether the package in dir is usable from filename, // respecting the Go "internal" and "vendor" visibility rules. func canUse(filename, dir string) bool { // Fast path check, before any allocations. If it doesn't contain vendor // or internal, it's not tricky: // Note that this can false-negative on directories like "notinternal", // but we check it correctly below. This is just a fast path. if !strings.Contains(dir, "vendor") && !strings.Contains(dir, "internal") { return true } dirSlash := filepath.ToSlash(dir) if !strings.Contains(dirSlash, "/vendor/") && !strings.Contains(dirSlash, "/internal/") && !strings.HasSuffix(dirSlash, "/internal") { return true } // Vendor or internal directory only visible from children of parent. // That means the path from the current directory to the target directory // can contain ../vendor or ../internal but not ../foo/vendor or ../foo/internal // or bar/vendor or bar/internal. // After stripping all the leading ../, the only okay place to see vendor or internal // is at the very beginning of the path. absfile, err := filepath.Abs(filename) if err != nil { return false } absdir, err := filepath.Abs(dir) if err != nil { return false } rel, err := filepath.Rel(absfile, absdir) if err != nil { return false } relSlash := filepath.ToSlash(rel) if i := strings.LastIndex(relSlash, "../"); i >= 0 { relSlash = relSlash[i+len("../"):] } return !strings.Contains(relSlash, "/vendor/") && !strings.Contains(relSlash, "/internal/") && !strings.HasSuffix(relSlash, "/internal") } // lastTwoComponents returns at most the last two path components // of v, using either / or \ as the path separator. func lastTwoComponents(v string) string { nslash := 0 for i := len(v) - 1; i >= 0; i-- { if v[i] == '/' || v[i] == '\\' { nslash++ if nslash == 2 { return v[i:] } } } return v } type visitFn func(node ast.Node) ast.Visitor func (fn visitFn) Visit(node ast.Node) ast.Visitor { return fn(node) } func findImportStdlib(shortPkg string, symbols map[string]bool) (importPath string, rename, ok bool) { for symbol := range symbols { key := shortPkg + "." + symbol path := stdlib[key] if path == "" { if key == "rand.Read" { continue } return "", false, false } if importPath != "" && importPath != path { // Ambiguous. Symbols pointed to different things. return "", false, false } importPath = path } if importPath == "" && shortPkg == "rand" && symbols["Read"] { return "crypto/rand", false, true } return importPath, false, importPath != "" } // fileInDir reports whether the provided file path looks like // it's in dir. (without hitting the filesystem) func fileInDir(file, dir string) bool { rest := strings.TrimPrefix(file, dir) if len(rest) == len(file) { // dir is not a prefix of file. return false } // Check for boundary: either nothing (file == dir), or a slash. return len(rest) == 0 || rest[0] == '/' || rest[0] == '\\' } ================================================ FILE: vendor/golang.org/x/tools/imports/imports.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //go:generate go run mkstdlib.go // Package imports implements a Go pretty-printer (like package "go/format") // that also adds or removes import statements as necessary. package imports // import "golang.org/x/tools/imports" import ( "bufio" "bytes" "fmt" "go/ast" "go/format" "go/parser" "go/printer" "go/token" "io" "regexp" "strconv" "strings" "golang.org/x/tools/go/ast/astutil" ) // Options specifies options for processing files. type Options struct { Fragment bool // Accept fragment of a source file (no package statement) AllErrors bool // Report all errors (not just the first 10 on different lines) Comments bool // Print comments (true if nil *Options provided) TabIndent bool // Use tabs for indent (true if nil *Options provided) TabWidth int // Tab width (8 if nil *Options provided) FormatOnly bool // Disable the insertion and deletion of imports } // Process formats and adjusts imports for the provided file. // If opt is nil the defaults are used. // // Note that filename's directory influences which imports can be chosen, // so it is important that filename be accurate. // To process data ``as if'' it were in filename, pass the data as a non-nil src. func Process(filename string, src []byte, opt *Options) ([]byte, error) { if opt == nil { opt = &Options{Comments: true, TabIndent: true, TabWidth: 8} } fileSet := token.NewFileSet() file, adjust, err := parse(fileSet, filename, src, opt) if err != nil { return nil, err } if !opt.FormatOnly { _, err = fixImports(fileSet, file, filename) if err != nil { return nil, err } } sortImports(fileSet, file) imps := astutil.Imports(fileSet, file) var spacesBefore []string // import paths we need spaces before for _, impSection := range imps { // Within each block of contiguous imports, see if any // import lines are in different group numbers. If so, // we'll need to put a space between them so it's // compatible with gofmt. lastGroup := -1 for _, importSpec := range impSection { importPath, _ := strconv.Unquote(importSpec.Path.Value) groupNum := importGroup(importPath) if groupNum != lastGroup && lastGroup != -1 { spacesBefore = append(spacesBefore, importPath) } lastGroup = groupNum } } printerMode := printer.UseSpaces if opt.TabIndent { printerMode |= printer.TabIndent } printConfig := &printer.Config{Mode: printerMode, Tabwidth: opt.TabWidth} var buf bytes.Buffer err = printConfig.Fprint(&buf, fileSet, file) if err != nil { return nil, err } out := buf.Bytes() if adjust != nil { out = adjust(src, out) } if len(spacesBefore) > 0 { out = addImportSpaces(bytes.NewReader(out), spacesBefore) } out, err = format.Source(out) if err != nil { return nil, err } return out, nil } // parse parses src, which was read from filename, // as a Go source file or statement list. func parse(fset *token.FileSet, filename string, src []byte, opt *Options) (*ast.File, func(orig, src []byte) []byte, error) { parserMode := parser.Mode(0) if opt.Comments { parserMode |= parser.ParseComments } if opt.AllErrors { parserMode |= parser.AllErrors } // Try as whole source file. file, err := parser.ParseFile(fset, filename, src, parserMode) if err == nil { return file, nil, nil } // If the error is that the source file didn't begin with a // package line and we accept fragmented input, fall through to // try as a source fragment. Stop and return on any other error. if !opt.Fragment || !strings.Contains(err.Error(), "expected 'package'") { return nil, nil, err } // If this is a declaration list, make it a source file // by inserting a package clause. // Insert using a ;, not a newline, so that the line numbers // in psrc match the ones in src. psrc := append([]byte("package main;"), src...) file, err = parser.ParseFile(fset, filename, psrc, parserMode) if err == nil { // If a main function exists, we will assume this is a main // package and leave the file. if containsMainFunc(file) { return file, nil, nil } adjust := func(orig, src []byte) []byte { // Remove the package clause. // Gofmt has turned the ; into a \n. src = src[len("package main\n"):] return matchSpace(orig, src) } return file, adjust, nil } // If the error is that the source file didn't begin with a // declaration, fall through to try as a statement list. // Stop and return on any other error. if !strings.Contains(err.Error(), "expected declaration") { return nil, nil, err } // If this is a statement list, make it a source file // by inserting a package clause and turning the list // into a function body. This handles expressions too. // Insert using a ;, not a newline, so that the line numbers // in fsrc match the ones in src. fsrc := append(append([]byte("package p; func _() {"), src...), '}') file, err = parser.ParseFile(fset, filename, fsrc, parserMode) if err == nil { adjust := func(orig, src []byte) []byte { // Remove the wrapping. // Gofmt has turned the ; into a \n\n. src = src[len("package p\n\nfunc _() {"):] src = src[:len(src)-len("}\n")] // Gofmt has also indented the function body one level. // Remove that indent. src = bytes.Replace(src, []byte("\n\t"), []byte("\n"), -1) return matchSpace(orig, src) } return file, adjust, nil } // Failed, and out of options. return nil, nil, err } // containsMainFunc checks if a file contains a function declaration with the // function signature 'func main()' func containsMainFunc(file *ast.File) bool { for _, decl := range file.Decls { if f, ok := decl.(*ast.FuncDecl); ok { if f.Name.Name != "main" { continue } if len(f.Type.Params.List) != 0 { continue } if f.Type.Results != nil && len(f.Type.Results.List) != 0 { continue } return true } } return false } func cutSpace(b []byte) (before, middle, after []byte) { i := 0 for i < len(b) && (b[i] == ' ' || b[i] == '\t' || b[i] == '\n') { i++ } j := len(b) for j > 0 && (b[j-1] == ' ' || b[j-1] == '\t' || b[j-1] == '\n') { j-- } if i <= j { return b[:i], b[i:j], b[j:] } return nil, nil, b[j:] } // matchSpace reformats src to use the same space context as orig. // 1) If orig begins with blank lines, matchSpace inserts them at the beginning of src. // 2) matchSpace copies the indentation of the first non-blank line in orig // to every non-blank line in src. // 3) matchSpace copies the trailing space from orig and uses it in place // of src's trailing space. func matchSpace(orig []byte, src []byte) []byte { before, _, after := cutSpace(orig) i := bytes.LastIndex(before, []byte{'\n'}) before, indent := before[:i+1], before[i+1:] _, src, _ = cutSpace(src) var b bytes.Buffer b.Write(before) for len(src) > 0 { line := src if i := bytes.IndexByte(line, '\n'); i >= 0 { line, src = line[:i+1], line[i+1:] } else { src = nil } if len(line) > 0 && line[0] != '\n' { // not blank b.Write(indent) } b.Write(line) } b.Write(after) return b.Bytes() } var impLine = regexp.MustCompile(`^\s+(?:[\w\.]+\s+)?"(.+)"`) func addImportSpaces(r io.Reader, breaks []string) []byte { var out bytes.Buffer sc := bufio.NewScanner(r) inImports := false done := false for sc.Scan() { s := sc.Text() if !inImports && !done && strings.HasPrefix(s, "import") { inImports = true } if inImports && (strings.HasPrefix(s, "var") || strings.HasPrefix(s, "func") || strings.HasPrefix(s, "const") || strings.HasPrefix(s, "type")) { done = true inImports = false } if inImports && len(breaks) > 0 { if m := impLine.FindStringSubmatch(s); m != nil { if m[1] == breaks[0] { out.WriteByte('\n') breaks = breaks[1:] } } } fmt.Fprintln(&out, s) } return out.Bytes() } ================================================ FILE: vendor/golang.org/x/tools/imports/mkindex.go ================================================ // +build ignore // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Command mkindex creates the file "pkgindex.go" containing an index of the Go // standard library. The file is intended to be built as part of the imports // package, so that the package may be used in environments where a GOROOT is // not available (such as App Engine). package main import ( "bytes" "fmt" "go/ast" "go/build" "go/format" "go/parser" "go/token" "io/ioutil" "log" "os" "path" "path/filepath" "strings" ) var ( pkgIndex = make(map[string][]pkg) exports = make(map[string]map[string]bool) ) func main() { // Don't use GOPATH. ctx := build.Default ctx.GOPATH = "" // Populate pkgIndex global from GOROOT. for _, path := range ctx.SrcDirs() { f, err := os.Open(path) if err != nil { log.Print(err) continue } children, err := f.Readdir(-1) f.Close() if err != nil { log.Print(err) continue } for _, child := range children { if child.IsDir() { loadPkg(path, child.Name()) } } } // Populate exports global. for _, ps := range pkgIndex { for _, p := range ps { e := loadExports(p.dir) if e != nil { exports[p.dir] = e } } } // Construct source file. var buf bytes.Buffer fmt.Fprint(&buf, pkgIndexHead) fmt.Fprintf(&buf, "var pkgIndexMaster = %#v\n", pkgIndex) fmt.Fprintf(&buf, "var exportsMaster = %#v\n", exports) src := buf.Bytes() // Replace main.pkg type name with pkg. src = bytes.Replace(src, []byte("main.pkg"), []byte("pkg"), -1) // Replace actual GOROOT with "/go". src = bytes.Replace(src, []byte(ctx.GOROOT), []byte("/go"), -1) // Add some line wrapping. src = bytes.Replace(src, []byte("}, "), []byte("},\n"), -1) src = bytes.Replace(src, []byte("true, "), []byte("true,\n"), -1) var err error src, err = format.Source(src) if err != nil { log.Fatal(err) } // Write out source file. err = ioutil.WriteFile("pkgindex.go", src, 0644) if err != nil { log.Fatal(err) } } const pkgIndexHead = `package imports func init() { pkgIndexOnce.Do(func() { pkgIndex.m = pkgIndexMaster }) loadExports = func(dir string) map[string]bool { return exportsMaster[dir] } } ` type pkg struct { importpath string // full pkg import path, e.g. "net/http" dir string // absolute file path to pkg directory e.g. "/usr/lib/go/src/fmt" } var fset = token.NewFileSet() func loadPkg(root, importpath string) { shortName := path.Base(importpath) if shortName == "testdata" { return } dir := filepath.Join(root, importpath) pkgIndex[shortName] = append(pkgIndex[shortName], pkg{ importpath: importpath, dir: dir, }) pkgDir, err := os.Open(dir) if err != nil { return } children, err := pkgDir.Readdir(-1) pkgDir.Close() if err != nil { return } for _, child := range children { name := child.Name() if name == "" { continue } if c := name[0]; c == '.' || ('0' <= c && c <= '9') { continue } if child.IsDir() { loadPkg(root, filepath.Join(importpath, name)) } } } func loadExports(dir string) map[string]bool { exports := make(map[string]bool) buildPkg, err := build.ImportDir(dir, 0) if err != nil { if strings.Contains(err.Error(), "no buildable Go source files in") { return nil } log.Printf("could not import %q: %v", dir, err) return nil } for _, file := range buildPkg.GoFiles { f, err := parser.ParseFile(fset, filepath.Join(dir, file), nil, 0) if err != nil { log.Printf("could not parse %q: %v", file, err) continue } for name := range f.Scope.Objects { if ast.IsExported(name) { exports[name] = true } } } return exports } ================================================ FILE: vendor/golang.org/x/tools/imports/mkstdlib.go ================================================ // +build ignore // mkstdlib generates the zstdlib.go file, containing the Go standard // library API symbols. It's baked into the binary to avoid scanning // GOPATH in the common case. package main import ( "bufio" "bytes" "fmt" "go/format" "io" "io/ioutil" "log" "os" "path" "path/filepath" "regexp" "sort" "strings" ) func mustOpen(name string) io.Reader { f, err := os.Open(name) if err != nil { log.Fatal(err) } return f } func api(base string) string { return filepath.Join(os.Getenv("GOROOT"), "api", base) } var sym = regexp.MustCompile(`^pkg (\S+).*?, (?:var|func|type|const) ([A-Z]\w*)`) func main() { var buf bytes.Buffer outf := func(format string, args ...interface{}) { fmt.Fprintf(&buf, format, args...) } outf("// AUTO-GENERATED BY mkstdlib.go\n\n") outf("package imports\n") outf("var stdlib = map[string]string{\n") f := io.MultiReader( mustOpen(api("go1.txt")), mustOpen(api("go1.1.txt")), mustOpen(api("go1.2.txt")), mustOpen(api("go1.3.txt")), mustOpen(api("go1.4.txt")), mustOpen(api("go1.5.txt")), mustOpen(api("go1.6.txt")), mustOpen(api("go1.7.txt")), ) sc := bufio.NewScanner(f) fullImport := map[string]string{} // "zip.NewReader" => "archive/zip" ambiguous := map[string]bool{} var keys []string for sc.Scan() { l := sc.Text() has := func(v string) bool { return strings.Contains(l, v) } if has("struct, ") || has("interface, ") || has(", method (") { continue } if m := sym.FindStringSubmatch(l); m != nil { full := m[1] key := path.Base(full) + "." + m[2] if exist, ok := fullImport[key]; ok { if exist != full { ambiguous[key] = true } } else { fullImport[key] = full keys = append(keys, key) } } } if err := sc.Err(); err != nil { log.Fatal(err) } sort.Strings(keys) for _, key := range keys { if ambiguous[key] { outf("\t// %q is ambiguous\n", key) } else { outf("\t%q: %q,\n", key, fullImport[key]) } } outf("\n") for _, sym := range [...]string{"Alignof", "ArbitraryType", "Offsetof", "Pointer", "Sizeof"} { outf("\t%q: %q,\n", "unsafe."+sym, "unsafe") } outf("}\n") fmtbuf, err := format.Source(buf.Bytes()) if err != nil { log.Fatal(err) } err = ioutil.WriteFile("zstdlib.go", fmtbuf, 0666) if err != nil { log.Fatal(err) } } ================================================ FILE: vendor/golang.org/x/tools/imports/sortimports.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Hacked up copy of go/ast/import.go package imports import ( "go/ast" "go/token" "sort" "strconv" ) // sortImports sorts runs of consecutive import lines in import blocks in f. // It also removes duplicate imports when it is possible to do so without data loss. func sortImports(fset *token.FileSet, f *ast.File) { for i, d := range f.Decls { d, ok := d.(*ast.GenDecl) if !ok || d.Tok != token.IMPORT { // Not an import declaration, so we're done. // Imports are always first. break } if len(d.Specs) == 0 { // Empty import block, remove it. f.Decls = append(f.Decls[:i], f.Decls[i+1:]...) } if !d.Lparen.IsValid() { // Not a block: sorted by default. continue } // Identify and sort runs of specs on successive lines. i := 0 specs := d.Specs[:0] for j, s := range d.Specs { if j > i && fset.Position(s.Pos()).Line > 1+fset.Position(d.Specs[j-1].End()).Line { // j begins a new run. End this one. specs = append(specs, sortSpecs(fset, f, d.Specs[i:j])...) i = j } } specs = append(specs, sortSpecs(fset, f, d.Specs[i:])...) d.Specs = specs // Deduping can leave a blank line before the rparen; clean that up. if len(d.Specs) > 0 { lastSpec := d.Specs[len(d.Specs)-1] lastLine := fset.Position(lastSpec.Pos()).Line if rParenLine := fset.Position(d.Rparen).Line; rParenLine > lastLine+1 { fset.File(d.Rparen).MergeLine(rParenLine - 1) } } } } func importPath(s ast.Spec) string { t, err := strconv.Unquote(s.(*ast.ImportSpec).Path.Value) if err == nil { return t } return "" } func importName(s ast.Spec) string { n := s.(*ast.ImportSpec).Name if n == nil { return "" } return n.Name } func importComment(s ast.Spec) string { c := s.(*ast.ImportSpec).Comment if c == nil { return "" } return c.Text() } // collapse indicates whether prev may be removed, leaving only next. func collapse(prev, next ast.Spec) bool { if importPath(next) != importPath(prev) || importName(next) != importName(prev) { return false } return prev.(*ast.ImportSpec).Comment == nil } type posSpan struct { Start token.Pos End token.Pos } func sortSpecs(fset *token.FileSet, f *ast.File, specs []ast.Spec) []ast.Spec { // Can't short-circuit here even if specs are already sorted, // since they might yet need deduplication. // A lone import, however, may be safely ignored. if len(specs) <= 1 { return specs } // Record positions for specs. pos := make([]posSpan, len(specs)) for i, s := range specs { pos[i] = posSpan{s.Pos(), s.End()} } // Identify comments in this range. // Any comment from pos[0].Start to the final line counts. lastLine := fset.Position(pos[len(pos)-1].End).Line cstart := len(f.Comments) cend := len(f.Comments) for i, g := range f.Comments { if g.Pos() < pos[0].Start { continue } if i < cstart { cstart = i } if fset.Position(g.End()).Line > lastLine { cend = i break } } comments := f.Comments[cstart:cend] // Assign each comment to the import spec preceding it. importComment := map[*ast.ImportSpec][]*ast.CommentGroup{} specIndex := 0 for _, g := range comments { for specIndex+1 < len(specs) && pos[specIndex+1].Start <= g.Pos() { specIndex++ } s := specs[specIndex].(*ast.ImportSpec) importComment[s] = append(importComment[s], g) } // Sort the import specs by import path. // Remove duplicates, when possible without data loss. // Reassign the import paths to have the same position sequence. // Reassign each comment to abut the end of its spec. // Sort the comments by new position. sort.Sort(byImportSpec(specs)) // Dedup. Thanks to our sorting, we can just consider // adjacent pairs of imports. deduped := specs[:0] for i, s := range specs { if i == len(specs)-1 || !collapse(s, specs[i+1]) { deduped = append(deduped, s) } else { p := s.Pos() fset.File(p).MergeLine(fset.Position(p).Line) } } specs = deduped // Fix up comment positions for i, s := range specs { s := s.(*ast.ImportSpec) if s.Name != nil { s.Name.NamePos = pos[i].Start } s.Path.ValuePos = pos[i].Start s.EndPos = pos[i].End for _, g := range importComment[s] { for _, c := range g.List { c.Slash = pos[i].End } } } sort.Sort(byCommentPos(comments)) return specs } type byImportSpec []ast.Spec // slice of *ast.ImportSpec func (x byImportSpec) Len() int { return len(x) } func (x byImportSpec) Swap(i, j int) { x[i], x[j] = x[j], x[i] } func (x byImportSpec) Less(i, j int) bool { ipath := importPath(x[i]) jpath := importPath(x[j]) igroup := importGroup(ipath) jgroup := importGroup(jpath) if igroup != jgroup { return igroup < jgroup } if ipath != jpath { return ipath < jpath } iname := importName(x[i]) jname := importName(x[j]) if iname != jname { return iname < jname } return importComment(x[i]) < importComment(x[j]) } type byCommentPos []*ast.CommentGroup func (x byCommentPos) Len() int { return len(x) } func (x byCommentPos) Swap(i, j int) { x[i], x[j] = x[j], x[i] } func (x byCommentPos) Less(i, j int) bool { return x[i].Pos() < x[j].Pos() } ================================================ FILE: vendor/golang.org/x/tools/imports/zstdlib.go ================================================ // AUTO-GENERATED BY mkstdlib.go package imports var stdlib = map[string]string{ "adler32.Checksum": "hash/adler32", "adler32.New": "hash/adler32", "adler32.Size": "hash/adler32", "aes.BlockSize": "crypto/aes", "aes.KeySizeError": "crypto/aes", "aes.NewCipher": "crypto/aes", "ascii85.CorruptInputError": "encoding/ascii85", "ascii85.Decode": "encoding/ascii85", "ascii85.Encode": "encoding/ascii85", "ascii85.MaxEncodedLen": "encoding/ascii85", "ascii85.NewDecoder": "encoding/ascii85", "ascii85.NewEncoder": "encoding/ascii85", "asn1.BitString": "encoding/asn1", "asn1.ClassApplication": "encoding/asn1", "asn1.ClassContextSpecific": "encoding/asn1", "asn1.ClassPrivate": "encoding/asn1", "asn1.ClassUniversal": "encoding/asn1", "asn1.Enumerated": "encoding/asn1", "asn1.Flag": "encoding/asn1", "asn1.Marshal": "encoding/asn1", "asn1.ObjectIdentifier": "encoding/asn1", "asn1.RawContent": "encoding/asn1", "asn1.RawValue": "encoding/asn1", "asn1.StructuralError": "encoding/asn1", "asn1.SyntaxError": "encoding/asn1", "asn1.TagBitString": "encoding/asn1", "asn1.TagBoolean": "encoding/asn1", "asn1.TagEnum": "encoding/asn1", "asn1.TagGeneralString": "encoding/asn1", "asn1.TagGeneralizedTime": "encoding/asn1", "asn1.TagIA5String": "encoding/asn1", "asn1.TagInteger": "encoding/asn1", "asn1.TagOID": "encoding/asn1", "asn1.TagOctetString": "encoding/asn1", "asn1.TagPrintableString": "encoding/asn1", "asn1.TagSequence": "encoding/asn1", "asn1.TagSet": "encoding/asn1", "asn1.TagT61String": "encoding/asn1", "asn1.TagUTCTime": "encoding/asn1", "asn1.TagUTF8String": "encoding/asn1", "asn1.Unmarshal": "encoding/asn1", "asn1.UnmarshalWithParams": "encoding/asn1", "ast.ArrayType": "go/ast", "ast.AssignStmt": "go/ast", "ast.Bad": "go/ast", "ast.BadDecl": "go/ast", "ast.BadExpr": "go/ast", "ast.BadStmt": "go/ast", "ast.BasicLit": "go/ast", "ast.BinaryExpr": "go/ast", "ast.BlockStmt": "go/ast", "ast.BranchStmt": "go/ast", "ast.CallExpr": "go/ast", "ast.CaseClause": "go/ast", "ast.ChanDir": "go/ast", "ast.ChanType": "go/ast", "ast.CommClause": "go/ast", "ast.Comment": "go/ast", "ast.CommentGroup": "go/ast", "ast.CommentMap": "go/ast", "ast.CompositeLit": "go/ast", "ast.Con": "go/ast", "ast.DeclStmt": "go/ast", "ast.DeferStmt": "go/ast", "ast.Ellipsis": "go/ast", "ast.EmptyStmt": "go/ast", "ast.ExprStmt": "go/ast", "ast.Field": "go/ast", "ast.FieldFilter": "go/ast", "ast.FieldList": "go/ast", "ast.File": "go/ast", "ast.FileExports": "go/ast", "ast.Filter": "go/ast", "ast.FilterDecl": "go/ast", "ast.FilterFile": "go/ast", "ast.FilterFuncDuplicates": "go/ast", "ast.FilterImportDuplicates": "go/ast", "ast.FilterPackage": "go/ast", "ast.FilterUnassociatedComments": "go/ast", "ast.ForStmt": "go/ast", "ast.Fprint": "go/ast", "ast.Fun": "go/ast", "ast.FuncDecl": "go/ast", "ast.FuncLit": "go/ast", "ast.FuncType": "go/ast", "ast.GenDecl": "go/ast", "ast.GoStmt": "go/ast", "ast.Ident": "go/ast", "ast.IfStmt": "go/ast", "ast.ImportSpec": "go/ast", "ast.Importer": "go/ast", "ast.IncDecStmt": "go/ast", "ast.IndexExpr": "go/ast", "ast.Inspect": "go/ast", "ast.InterfaceType": "go/ast", "ast.IsExported": "go/ast", "ast.KeyValueExpr": "go/ast", "ast.LabeledStmt": "go/ast", "ast.Lbl": "go/ast", "ast.MapType": "go/ast", "ast.MergeMode": "go/ast", "ast.MergePackageFiles": "go/ast", "ast.NewCommentMap": "go/ast", "ast.NewIdent": "go/ast", "ast.NewObj": "go/ast", "ast.NewPackage": "go/ast", "ast.NewScope": "go/ast", "ast.Node": "go/ast", "ast.NotNilFilter": "go/ast", "ast.ObjKind": "go/ast", "ast.Object": "go/ast", "ast.Package": "go/ast", "ast.PackageExports": "go/ast", "ast.ParenExpr": "go/ast", "ast.Pkg": "go/ast", "ast.Print": "go/ast", "ast.RECV": "go/ast", "ast.RangeStmt": "go/ast", "ast.ReturnStmt": "go/ast", "ast.SEND": "go/ast", "ast.Scope": "go/ast", "ast.SelectStmt": "go/ast", "ast.SelectorExpr": "go/ast", "ast.SendStmt": "go/ast", "ast.SliceExpr": "go/ast", "ast.SortImports": "go/ast", "ast.StarExpr": "go/ast", "ast.StructType": "go/ast", "ast.SwitchStmt": "go/ast", "ast.Typ": "go/ast", "ast.TypeAssertExpr": "go/ast", "ast.TypeSpec": "go/ast", "ast.TypeSwitchStmt": "go/ast", "ast.UnaryExpr": "go/ast", "ast.ValueSpec": "go/ast", "ast.Var": "go/ast", "ast.Visitor": "go/ast", "ast.Walk": "go/ast", "atomic.AddInt32": "sync/atomic", "atomic.AddInt64": "sync/atomic", "atomic.AddUint32": "sync/atomic", "atomic.AddUint64": "sync/atomic", "atomic.AddUintptr": "sync/atomic", "atomic.CompareAndSwapInt32": "sync/atomic", "atomic.CompareAndSwapInt64": "sync/atomic", "atomic.CompareAndSwapPointer": "sync/atomic", "atomic.CompareAndSwapUint32": "sync/atomic", "atomic.CompareAndSwapUint64": "sync/atomic", "atomic.CompareAndSwapUintptr": "sync/atomic", "atomic.LoadInt32": "sync/atomic", "atomic.LoadInt64": "sync/atomic", "atomic.LoadPointer": "sync/atomic", "atomic.LoadUint32": "sync/atomic", "atomic.LoadUint64": "sync/atomic", "atomic.LoadUintptr": "sync/atomic", "atomic.StoreInt32": "sync/atomic", "atomic.StoreInt64": "sync/atomic", "atomic.StorePointer": "sync/atomic", "atomic.StoreUint32": "sync/atomic", "atomic.StoreUint64": "sync/atomic", "atomic.StoreUintptr": "sync/atomic", "atomic.SwapInt32": "sync/atomic", "atomic.SwapInt64": "sync/atomic", "atomic.SwapPointer": "sync/atomic", "atomic.SwapUint32": "sync/atomic", "atomic.SwapUint64": "sync/atomic", "atomic.SwapUintptr": "sync/atomic", "atomic.Value": "sync/atomic", "base32.CorruptInputError": "encoding/base32", "base32.Encoding": "encoding/base32", "base32.HexEncoding": "encoding/base32", "base32.NewDecoder": "encoding/base32", "base32.NewEncoder": "encoding/base32", "base32.NewEncoding": "encoding/base32", "base32.StdEncoding": "encoding/base32", "base64.CorruptInputError": "encoding/base64", "base64.Encoding": "encoding/base64", "base64.NewDecoder": "encoding/base64", "base64.NewEncoder": "encoding/base64", "base64.NewEncoding": "encoding/base64", "base64.NoPadding": "encoding/base64", "base64.RawStdEncoding": "encoding/base64", "base64.RawURLEncoding": "encoding/base64", "base64.StdEncoding": "encoding/base64", "base64.StdPadding": "encoding/base64", "base64.URLEncoding": "encoding/base64", "big.Above": "math/big", "big.Accuracy": "math/big", "big.AwayFromZero": "math/big", "big.Below": "math/big", "big.ErrNaN": "math/big", "big.Exact": "math/big", "big.Float": "math/big", "big.Int": "math/big", "big.Jacobi": "math/big", "big.MaxBase": "math/big", "big.MaxExp": "math/big", "big.MaxPrec": "math/big", "big.MinExp": "math/big", "big.NewFloat": "math/big", "big.NewInt": "math/big", "big.NewRat": "math/big", "big.ParseFloat": "math/big", "big.Rat": "math/big", "big.RoundingMode": "math/big", "big.ToNearestAway": "math/big", "big.ToNearestEven": "math/big", "big.ToNegativeInf": "math/big", "big.ToPositiveInf": "math/big", "big.ToZero": "math/big", "big.Word": "math/big", "binary.BigEndian": "encoding/binary", "binary.ByteOrder": "encoding/binary", "binary.LittleEndian": "encoding/binary", "binary.MaxVarintLen16": "encoding/binary", "binary.MaxVarintLen32": "encoding/binary", "binary.MaxVarintLen64": "encoding/binary", "binary.PutUvarint": "encoding/binary", "binary.PutVarint": "encoding/binary", "binary.Read": "encoding/binary", "binary.ReadUvarint": "encoding/binary", "binary.ReadVarint": "encoding/binary", "binary.Size": "encoding/binary", "binary.Uvarint": "encoding/binary", "binary.Varint": "encoding/binary", "binary.Write": "encoding/binary", "bufio.ErrAdvanceTooFar": "bufio", "bufio.ErrBufferFull": "bufio", "bufio.ErrFinalToken": "bufio", "bufio.ErrInvalidUnreadByte": "bufio", "bufio.ErrInvalidUnreadRune": "bufio", "bufio.ErrNegativeAdvance": "bufio", "bufio.ErrNegativeCount": "bufio", "bufio.ErrTooLong": "bufio", "bufio.MaxScanTokenSize": "bufio", "bufio.NewReadWriter": "bufio", "bufio.NewReader": "bufio", "bufio.NewReaderSize": "bufio", "bufio.NewScanner": "bufio", "bufio.NewWriter": "bufio", "bufio.NewWriterSize": "bufio", "bufio.ReadWriter": "bufio", "bufio.Reader": "bufio", "bufio.ScanBytes": "bufio", "bufio.ScanLines": "bufio", "bufio.ScanRunes": "bufio", "bufio.ScanWords": "bufio", "bufio.Scanner": "bufio", "bufio.SplitFunc": "bufio", "bufio.Writer": "bufio", "build.AllowBinary": "go/build", "build.ArchChar": "go/build", "build.Context": "go/build", "build.Default": "go/build", "build.FindOnly": "go/build", "build.IgnoreVendor": "go/build", "build.Import": "go/build", "build.ImportComment": "go/build", "build.ImportDir": "go/build", "build.ImportMode": "go/build", "build.IsLocalImport": "go/build", "build.MultiplePackageError": "go/build", "build.NoGoError": "go/build", "build.Package": "go/build", "build.ToolDir": "go/build", "bytes.Buffer": "bytes", "bytes.Compare": "bytes", "bytes.Contains": "bytes", "bytes.ContainsAny": "bytes", "bytes.ContainsRune": "bytes", "bytes.Count": "bytes", "bytes.Equal": "bytes", "bytes.EqualFold": "bytes", "bytes.ErrTooLarge": "bytes", "bytes.Fields": "bytes", "bytes.FieldsFunc": "bytes", "bytes.HasPrefix": "bytes", "bytes.HasSuffix": "bytes", "bytes.Index": "bytes", "bytes.IndexAny": "bytes", "bytes.IndexByte": "bytes", "bytes.IndexFunc": "bytes", "bytes.IndexRune": "bytes", "bytes.Join": "bytes", "bytes.LastIndex": "bytes", "bytes.LastIndexAny": "bytes", "bytes.LastIndexByte": "bytes", "bytes.LastIndexFunc": "bytes", "bytes.Map": "bytes", "bytes.MinRead": "bytes", "bytes.NewBuffer": "bytes", "bytes.NewBufferString": "bytes", "bytes.NewReader": "bytes", "bytes.Reader": "bytes", "bytes.Repeat": "bytes", "bytes.Replace": "bytes", "bytes.Runes": "bytes", "bytes.Split": "bytes", "bytes.SplitAfter": "bytes", "bytes.SplitAfterN": "bytes", "bytes.SplitN": "bytes", "bytes.Title": "bytes", "bytes.ToLower": "bytes", "bytes.ToLowerSpecial": "bytes", "bytes.ToTitle": "bytes", "bytes.ToTitleSpecial": "bytes", "bytes.ToUpper": "bytes", "bytes.ToUpperSpecial": "bytes", "bytes.Trim": "bytes", "bytes.TrimFunc": "bytes", "bytes.TrimLeft": "bytes", "bytes.TrimLeftFunc": "bytes", "bytes.TrimPrefix": "bytes", "bytes.TrimRight": "bytes", "bytes.TrimRightFunc": "bytes", "bytes.TrimSpace": "bytes", "bytes.TrimSuffix": "bytes", "bzip2.NewReader": "compress/bzip2", "bzip2.StructuralError": "compress/bzip2", "cgi.Handler": "net/http/cgi", "cgi.Request": "net/http/cgi", "cgi.RequestFromMap": "net/http/cgi", "cgi.Serve": "net/http/cgi", "cipher.AEAD": "crypto/cipher", "cipher.Block": "crypto/cipher", "cipher.BlockMode": "crypto/cipher", "cipher.NewCBCDecrypter": "crypto/cipher", "cipher.NewCBCEncrypter": "crypto/cipher", "cipher.NewCFBDecrypter": "crypto/cipher", "cipher.NewCFBEncrypter": "crypto/cipher", "cipher.NewCTR": "crypto/cipher", "cipher.NewGCM": "crypto/cipher", "cipher.NewGCMWithNonceSize": "crypto/cipher", "cipher.NewOFB": "crypto/cipher", "cipher.Stream": "crypto/cipher", "cipher.StreamReader": "crypto/cipher", "cipher.StreamWriter": "crypto/cipher", "cmplx.Abs": "math/cmplx", "cmplx.Acos": "math/cmplx", "cmplx.Acosh": "math/cmplx", "cmplx.Asin": "math/cmplx", "cmplx.Asinh": "math/cmplx", "cmplx.Atan": "math/cmplx", "cmplx.Atanh": "math/cmplx", "cmplx.Conj": "math/cmplx", "cmplx.Cos": "math/cmplx", "cmplx.Cosh": "math/cmplx", "cmplx.Cot": "math/cmplx", "cmplx.Exp": "math/cmplx", "cmplx.Inf": "math/cmplx", "cmplx.IsInf": "math/cmplx", "cmplx.IsNaN": "math/cmplx", "cmplx.Log": "math/cmplx", "cmplx.Log10": "math/cmplx", "cmplx.NaN": "math/cmplx", "cmplx.Phase": "math/cmplx", "cmplx.Polar": "math/cmplx", "cmplx.Pow": "math/cmplx", "cmplx.Rect": "math/cmplx", "cmplx.Sin": "math/cmplx", "cmplx.Sinh": "math/cmplx", "cmplx.Sqrt": "math/cmplx", "cmplx.Tan": "math/cmplx", "cmplx.Tanh": "math/cmplx", "color.Alpha": "image/color", "color.Alpha16": "image/color", "color.Alpha16Model": "image/color", "color.AlphaModel": "image/color", "color.Black": "image/color", "color.CMYK": "image/color", "color.CMYKModel": "image/color", "color.CMYKToRGB": "image/color", "color.Color": "image/color", "color.Gray": "image/color", "color.Gray16": "image/color", "color.Gray16Model": "image/color", "color.GrayModel": "image/color", "color.Model": "image/color", "color.ModelFunc": "image/color", "color.NRGBA": "image/color", "color.NRGBA64": "image/color", "color.NRGBA64Model": "image/color", "color.NRGBAModel": "image/color", "color.NYCbCrA": "image/color", "color.NYCbCrAModel": "image/color", "color.Opaque": "image/color", "color.Palette": "image/color", "color.RGBA": "image/color", "color.RGBA64": "image/color", "color.RGBA64Model": "image/color", "color.RGBAModel": "image/color", "color.RGBToCMYK": "image/color", "color.RGBToYCbCr": "image/color", "color.Transparent": "image/color", "color.White": "image/color", "color.YCbCr": "image/color", "color.YCbCrModel": "image/color", "color.YCbCrToRGB": "image/color", "constant.BinaryOp": "go/constant", "constant.BitLen": "go/constant", "constant.Bool": "go/constant", "constant.BoolVal": "go/constant", "constant.Bytes": "go/constant", "constant.Compare": "go/constant", "constant.Complex": "go/constant", "constant.Denom": "go/constant", "constant.Float": "go/constant", "constant.Float32Val": "go/constant", "constant.Float64Val": "go/constant", "constant.Imag": "go/constant", "constant.Int": "go/constant", "constant.Int64Val": "go/constant", "constant.Kind": "go/constant", "constant.MakeBool": "go/constant", "constant.MakeFloat64": "go/constant", "constant.MakeFromBytes": "go/constant", "constant.MakeFromLiteral": "go/constant", "constant.MakeImag": "go/constant", "constant.MakeInt64": "go/constant", "constant.MakeString": "go/constant", "constant.MakeUint64": "go/constant", "constant.MakeUnknown": "go/constant", "constant.Num": "go/constant", "constant.Real": "go/constant", "constant.Shift": "go/constant", "constant.Sign": "go/constant", "constant.String": "go/constant", "constant.StringVal": "go/constant", "constant.ToComplex": "go/constant", "constant.ToFloat": "go/constant", "constant.ToInt": "go/constant", "constant.Uint64Val": "go/constant", "constant.UnaryOp": "go/constant", "constant.Unknown": "go/constant", "context.Background": "context", "context.CancelFunc": "context", "context.Canceled": "context", "context.Context": "context", "context.DeadlineExceeded": "context", "context.TODO": "context", "context.WithCancel": "context", "context.WithDeadline": "context", "context.WithTimeout": "context", "context.WithValue": "context", "cookiejar.Jar": "net/http/cookiejar", "cookiejar.New": "net/http/cookiejar", "cookiejar.Options": "net/http/cookiejar", "cookiejar.PublicSuffixList": "net/http/cookiejar", "crc32.Castagnoli": "hash/crc32", "crc32.Checksum": "hash/crc32", "crc32.ChecksumIEEE": "hash/crc32", "crc32.IEEE": "hash/crc32", "crc32.IEEETable": "hash/crc32", "crc32.Koopman": "hash/crc32", "crc32.MakeTable": "hash/crc32", "crc32.New": "hash/crc32", "crc32.NewIEEE": "hash/crc32", "crc32.Size": "hash/crc32", "crc32.Table": "hash/crc32", "crc32.Update": "hash/crc32", "crc64.Checksum": "hash/crc64", "crc64.ECMA": "hash/crc64", "crc64.ISO": "hash/crc64", "crc64.MakeTable": "hash/crc64", "crc64.New": "hash/crc64", "crc64.Size": "hash/crc64", "crc64.Table": "hash/crc64", "crc64.Update": "hash/crc64", "crypto.Decrypter": "crypto", "crypto.DecrypterOpts": "crypto", "crypto.Hash": "crypto", "crypto.MD4": "crypto", "crypto.MD5": "crypto", "crypto.MD5SHA1": "crypto", "crypto.PrivateKey": "crypto", "crypto.PublicKey": "crypto", "crypto.RIPEMD160": "crypto", "crypto.RegisterHash": "crypto", "crypto.SHA1": "crypto", "crypto.SHA224": "crypto", "crypto.SHA256": "crypto", "crypto.SHA384": "crypto", "crypto.SHA3_224": "crypto", "crypto.SHA3_256": "crypto", "crypto.SHA3_384": "crypto", "crypto.SHA3_512": "crypto", "crypto.SHA512": "crypto", "crypto.SHA512_224": "crypto", "crypto.SHA512_256": "crypto", "crypto.Signer": "crypto", "crypto.SignerOpts": "crypto", "csv.ErrBareQuote": "encoding/csv", "csv.ErrFieldCount": "encoding/csv", "csv.ErrQuote": "encoding/csv", "csv.ErrTrailingComma": "encoding/csv", "csv.NewReader": "encoding/csv", "csv.NewWriter": "encoding/csv", "csv.ParseError": "encoding/csv", "csv.Reader": "encoding/csv", "csv.Writer": "encoding/csv", "debug.FreeOSMemory": "runtime/debug", "debug.GCStats": "runtime/debug", "debug.PrintStack": "runtime/debug", "debug.ReadGCStats": "runtime/debug", "debug.SetGCPercent": "runtime/debug", "debug.SetMaxStack": "runtime/debug", "debug.SetMaxThreads": "runtime/debug", "debug.SetPanicOnFault": "runtime/debug", "debug.SetTraceback": "runtime/debug", "debug.Stack": "runtime/debug", "debug.WriteHeapDump": "runtime/debug", "des.BlockSize": "crypto/des", "des.KeySizeError": "crypto/des", "des.NewCipher": "crypto/des", "des.NewTripleDESCipher": "crypto/des", "doc.AllDecls": "go/doc", "doc.AllMethods": "go/doc", "doc.Example": "go/doc", "doc.Examples": "go/doc", "doc.Filter": "go/doc", "doc.Func": "go/doc", "doc.IllegalPrefixes": "go/doc", "doc.Mode": "go/doc", "doc.New": "go/doc", "doc.Note": "go/doc", "doc.Package": "go/doc", "doc.Synopsis": "go/doc", "doc.ToHTML": "go/doc", "doc.ToText": "go/doc", "doc.Type": "go/doc", "doc.Value": "go/doc", "draw.Draw": "image/draw", "draw.DrawMask": "image/draw", "draw.Drawer": "image/draw", "draw.FloydSteinberg": "image/draw", "draw.Image": "image/draw", "draw.Op": "image/draw", "draw.Over": "image/draw", "draw.Quantizer": "image/draw", "draw.Src": "image/draw", "driver.Bool": "database/sql/driver", "driver.ColumnConverter": "database/sql/driver", "driver.Conn": "database/sql/driver", "driver.DefaultParameterConverter": "database/sql/driver", "driver.Driver": "database/sql/driver", "driver.ErrBadConn": "database/sql/driver", "driver.ErrSkip": "database/sql/driver", "driver.Execer": "database/sql/driver", "driver.Int32": "database/sql/driver", "driver.IsScanValue": "database/sql/driver", "driver.IsValue": "database/sql/driver", "driver.NotNull": "database/sql/driver", "driver.Null": "database/sql/driver", "driver.Queryer": "database/sql/driver", "driver.Result": "database/sql/driver", "driver.ResultNoRows": "database/sql/driver", "driver.Rows": "database/sql/driver", "driver.RowsAffected": "database/sql/driver", "driver.Stmt": "database/sql/driver", "driver.String": "database/sql/driver", "driver.Tx": "database/sql/driver", "driver.Value": "database/sql/driver", "driver.ValueConverter": "database/sql/driver", "driver.Valuer": "database/sql/driver", "dsa.ErrInvalidPublicKey": "crypto/dsa", "dsa.GenerateKey": "crypto/dsa", "dsa.GenerateParameters": "crypto/dsa", "dsa.L1024N160": "crypto/dsa", "dsa.L2048N224": "crypto/dsa", "dsa.L2048N256": "crypto/dsa", "dsa.L3072N256": "crypto/dsa", "dsa.ParameterSizes": "crypto/dsa", "dsa.Parameters": "crypto/dsa", "dsa.PrivateKey": "crypto/dsa", "dsa.PublicKey": "crypto/dsa", "dsa.Sign": "crypto/dsa", "dsa.Verify": "crypto/dsa", "dwarf.AddrType": "debug/dwarf", "dwarf.ArrayType": "debug/dwarf", "dwarf.Attr": "debug/dwarf", "dwarf.AttrAbstractOrigin": "debug/dwarf", "dwarf.AttrAccessibility": "debug/dwarf", "dwarf.AttrAddrClass": "debug/dwarf", "dwarf.AttrAllocated": "debug/dwarf", "dwarf.AttrArtificial": "debug/dwarf", "dwarf.AttrAssociated": "debug/dwarf", "dwarf.AttrBaseTypes": "debug/dwarf", "dwarf.AttrBitOffset": "debug/dwarf", "dwarf.AttrBitSize": "debug/dwarf", "dwarf.AttrByteSize": "debug/dwarf", "dwarf.AttrCallColumn": "debug/dwarf", "dwarf.AttrCallFile": "debug/dwarf", "dwarf.AttrCallLine": "debug/dwarf", "dwarf.AttrCalling": "debug/dwarf", "dwarf.AttrCommonRef": "debug/dwarf", "dwarf.AttrCompDir": "debug/dwarf", "dwarf.AttrConstValue": "debug/dwarf", "dwarf.AttrContainingType": "debug/dwarf", "dwarf.AttrCount": "debug/dwarf", "dwarf.AttrDataLocation": "debug/dwarf", "dwarf.AttrDataMemberLoc": "debug/dwarf", "dwarf.AttrDeclColumn": "debug/dwarf", "dwarf.AttrDeclFile": "debug/dwarf", "dwarf.AttrDeclLine": "debug/dwarf", "dwarf.AttrDeclaration": "debug/dwarf", "dwarf.AttrDefaultValue": "debug/dwarf", "dwarf.AttrDescription": "debug/dwarf", "dwarf.AttrDiscr": "debug/dwarf", "dwarf.AttrDiscrList": "debug/dwarf", "dwarf.AttrDiscrValue": "debug/dwarf", "dwarf.AttrEncoding": "debug/dwarf", "dwarf.AttrEntrypc": "debug/dwarf", "dwarf.AttrExtension": "debug/dwarf", "dwarf.AttrExternal": "debug/dwarf", "dwarf.AttrFrameBase": "debug/dwarf", "dwarf.AttrFriend": "debug/dwarf", "dwarf.AttrHighpc": "debug/dwarf", "dwarf.AttrIdentifierCase": "debug/dwarf", "dwarf.AttrImport": "debug/dwarf", "dwarf.AttrInline": "debug/dwarf", "dwarf.AttrIsOptional": "debug/dwarf", "dwarf.AttrLanguage": "debug/dwarf", "dwarf.AttrLocation": "debug/dwarf", "dwarf.AttrLowerBound": "debug/dwarf", "dwarf.AttrLowpc": "debug/dwarf", "dwarf.AttrMacroInfo": "debug/dwarf", "dwarf.AttrName": "debug/dwarf", "dwarf.AttrNamelistItem": "debug/dwarf", "dwarf.AttrOrdering": "debug/dwarf", "dwarf.AttrPriority": "debug/dwarf", "dwarf.AttrProducer": "debug/dwarf", "dwarf.AttrPrototyped": "debug/dwarf", "dwarf.AttrRanges": "debug/dwarf", "dwarf.AttrReturnAddr": "debug/dwarf", "dwarf.AttrSegment": "debug/dwarf", "dwarf.AttrSibling": "debug/dwarf", "dwarf.AttrSpecification": "debug/dwarf", "dwarf.AttrStartScope": "debug/dwarf", "dwarf.AttrStaticLink": "debug/dwarf", "dwarf.AttrStmtList": "debug/dwarf", "dwarf.AttrStride": "debug/dwarf", "dwarf.AttrStrideSize": "debug/dwarf", "dwarf.AttrStringLength": "debug/dwarf", "dwarf.AttrTrampoline": "debug/dwarf", "dwarf.AttrType": "debug/dwarf", "dwarf.AttrUpperBound": "debug/dwarf", "dwarf.AttrUseLocation": "debug/dwarf", "dwarf.AttrUseUTF8": "debug/dwarf", "dwarf.AttrVarParam": "debug/dwarf", "dwarf.AttrVirtuality": "debug/dwarf", "dwarf.AttrVisibility": "debug/dwarf", "dwarf.AttrVtableElemLoc": "debug/dwarf", "dwarf.BasicType": "debug/dwarf", "dwarf.BoolType": "debug/dwarf", "dwarf.CharType": "debug/dwarf", "dwarf.Class": "debug/dwarf", "dwarf.ClassAddress": "debug/dwarf", "dwarf.ClassBlock": "debug/dwarf", "dwarf.ClassConstant": "debug/dwarf", "dwarf.ClassExprLoc": "debug/dwarf", "dwarf.ClassFlag": "debug/dwarf", "dwarf.ClassLinePtr": "debug/dwarf", "dwarf.ClassLocListPtr": "debug/dwarf", "dwarf.ClassMacPtr": "debug/dwarf", "dwarf.ClassRangeListPtr": "debug/dwarf", "dwarf.ClassReference": "debug/dwarf", "dwarf.ClassReferenceAlt": "debug/dwarf", "dwarf.ClassReferenceSig": "debug/dwarf", "dwarf.ClassString": "debug/dwarf", "dwarf.ClassStringAlt": "debug/dwarf", "dwarf.ClassUnknown": "debug/dwarf", "dwarf.CommonType": "debug/dwarf", "dwarf.ComplexType": "debug/dwarf", "dwarf.Data": "debug/dwarf", "dwarf.DecodeError": "debug/dwarf", "dwarf.DotDotDotType": "debug/dwarf", "dwarf.Entry": "debug/dwarf", "dwarf.EnumType": "debug/dwarf", "dwarf.EnumValue": "debug/dwarf", "dwarf.ErrUnknownPC": "debug/dwarf", "dwarf.Field": "debug/dwarf", "dwarf.FloatType": "debug/dwarf", "dwarf.FuncType": "debug/dwarf", "dwarf.IntType": "debug/dwarf", "dwarf.LineEntry": "debug/dwarf", "dwarf.LineFile": "debug/dwarf", "dwarf.LineReader": "debug/dwarf", "dwarf.LineReaderPos": "debug/dwarf", "dwarf.New": "debug/dwarf", "dwarf.Offset": "debug/dwarf", "dwarf.PtrType": "debug/dwarf", "dwarf.QualType": "debug/dwarf", "dwarf.Reader": "debug/dwarf", "dwarf.StructField": "debug/dwarf", "dwarf.StructType": "debug/dwarf", "dwarf.Tag": "debug/dwarf", "dwarf.TagAccessDeclaration": "debug/dwarf", "dwarf.TagArrayType": "debug/dwarf", "dwarf.TagBaseType": "debug/dwarf", "dwarf.TagCatchDwarfBlock": "debug/dwarf", "dwarf.TagClassType": "debug/dwarf", "dwarf.TagCommonDwarfBlock": "debug/dwarf", "dwarf.TagCommonInclusion": "debug/dwarf", "dwarf.TagCompileUnit": "debug/dwarf", "dwarf.TagCondition": "debug/dwarf", "dwarf.TagConstType": "debug/dwarf", "dwarf.TagConstant": "debug/dwarf", "dwarf.TagDwarfProcedure": "debug/dwarf", "dwarf.TagEntryPoint": "debug/dwarf", "dwarf.TagEnumerationType": "debug/dwarf", "dwarf.TagEnumerator": "debug/dwarf", "dwarf.TagFileType": "debug/dwarf", "dwarf.TagFormalParameter": "debug/dwarf", "dwarf.TagFriend": "debug/dwarf", "dwarf.TagImportedDeclaration": "debug/dwarf", "dwarf.TagImportedModule": "debug/dwarf", "dwarf.TagImportedUnit": "debug/dwarf", "dwarf.TagInheritance": "debug/dwarf", "dwarf.TagInlinedSubroutine": "debug/dwarf", "dwarf.TagInterfaceType": "debug/dwarf", "dwarf.TagLabel": "debug/dwarf", "dwarf.TagLexDwarfBlock": "debug/dwarf", "dwarf.TagMember": "debug/dwarf", "dwarf.TagModule": "debug/dwarf", "dwarf.TagMutableType": "debug/dwarf", "dwarf.TagNamelist": "debug/dwarf", "dwarf.TagNamelistItem": "debug/dwarf", "dwarf.TagNamespace": "debug/dwarf", "dwarf.TagPackedType": "debug/dwarf", "dwarf.TagPartialUnit": "debug/dwarf", "dwarf.TagPointerType": "debug/dwarf", "dwarf.TagPtrToMemberType": "debug/dwarf", "dwarf.TagReferenceType": "debug/dwarf", "dwarf.TagRestrictType": "debug/dwarf", "dwarf.TagRvalueReferenceType": "debug/dwarf", "dwarf.TagSetType": "debug/dwarf", "dwarf.TagSharedType": "debug/dwarf", "dwarf.TagStringType": "debug/dwarf", "dwarf.TagStructType": "debug/dwarf", "dwarf.TagSubprogram": "debug/dwarf", "dwarf.TagSubrangeType": "debug/dwarf", "dwarf.TagSubroutineType": "debug/dwarf", "dwarf.TagTemplateAlias": "debug/dwarf", "dwarf.TagTemplateTypeParameter": "debug/dwarf", "dwarf.TagTemplateValueParameter": "debug/dwarf", "dwarf.TagThrownType": "debug/dwarf", "dwarf.TagTryDwarfBlock": "debug/dwarf", "dwarf.TagTypeUnit": "debug/dwarf", "dwarf.TagTypedef": "debug/dwarf", "dwarf.TagUnionType": "debug/dwarf", "dwarf.TagUnspecifiedParameters": "debug/dwarf", "dwarf.TagUnspecifiedType": "debug/dwarf", "dwarf.TagVariable": "debug/dwarf", "dwarf.TagVariant": "debug/dwarf", "dwarf.TagVariantPart": "debug/dwarf", "dwarf.TagVolatileType": "debug/dwarf", "dwarf.TagWithStmt": "debug/dwarf", "dwarf.Type": "debug/dwarf", "dwarf.TypedefType": "debug/dwarf", "dwarf.UcharType": "debug/dwarf", "dwarf.UintType": "debug/dwarf", "dwarf.UnspecifiedType": "debug/dwarf", "dwarf.VoidType": "debug/dwarf", "ecdsa.GenerateKey": "crypto/ecdsa", "ecdsa.PrivateKey": "crypto/ecdsa", "ecdsa.PublicKey": "crypto/ecdsa", "ecdsa.Sign": "crypto/ecdsa", "ecdsa.Verify": "crypto/ecdsa", "elf.ARM_MAGIC_TRAMP_NUMBER": "debug/elf", "elf.COMPRESS_HIOS": "debug/elf", "elf.COMPRESS_HIPROC": "debug/elf", "elf.COMPRESS_LOOS": "debug/elf", "elf.COMPRESS_LOPROC": "debug/elf", "elf.COMPRESS_ZLIB": "debug/elf", "elf.Chdr32": "debug/elf", "elf.Chdr64": "debug/elf", "elf.Class": "debug/elf", "elf.CompressionType": "debug/elf", "elf.DF_BIND_NOW": "debug/elf", "elf.DF_ORIGIN": "debug/elf", "elf.DF_STATIC_TLS": "debug/elf", "elf.DF_SYMBOLIC": "debug/elf", "elf.DF_TEXTREL": "debug/elf", "elf.DT_BIND_NOW": "debug/elf", "elf.DT_DEBUG": "debug/elf", "elf.DT_ENCODING": "debug/elf", "elf.DT_FINI": "debug/elf", "elf.DT_FINI_ARRAY": "debug/elf", "elf.DT_FINI_ARRAYSZ": "debug/elf", "elf.DT_FLAGS": "debug/elf", "elf.DT_HASH": "debug/elf", "elf.DT_HIOS": "debug/elf", "elf.DT_HIPROC": "debug/elf", "elf.DT_INIT": "debug/elf", "elf.DT_INIT_ARRAY": "debug/elf", "elf.DT_INIT_ARRAYSZ": "debug/elf", "elf.DT_JMPREL": "debug/elf", "elf.DT_LOOS": "debug/elf", "elf.DT_LOPROC": "debug/elf", "elf.DT_NEEDED": "debug/elf", "elf.DT_NULL": "debug/elf", "elf.DT_PLTGOT": "debug/elf", "elf.DT_PLTREL": "debug/elf", "elf.DT_PLTRELSZ": "debug/elf", "elf.DT_PREINIT_ARRAY": "debug/elf", "elf.DT_PREINIT_ARRAYSZ": "debug/elf", "elf.DT_REL": "debug/elf", "elf.DT_RELA": "debug/elf", "elf.DT_RELAENT": "debug/elf", "elf.DT_RELASZ": "debug/elf", "elf.DT_RELENT": "debug/elf", "elf.DT_RELSZ": "debug/elf", "elf.DT_RPATH": "debug/elf", "elf.DT_RUNPATH": "debug/elf", "elf.DT_SONAME": "debug/elf", "elf.DT_STRSZ": "debug/elf", "elf.DT_STRTAB": "debug/elf", "elf.DT_SYMBOLIC": "debug/elf", "elf.DT_SYMENT": "debug/elf", "elf.DT_SYMTAB": "debug/elf", "elf.DT_TEXTREL": "debug/elf", "elf.DT_VERNEED": "debug/elf", "elf.DT_VERNEEDNUM": "debug/elf", "elf.DT_VERSYM": "debug/elf", "elf.Data": "debug/elf", "elf.Dyn32": "debug/elf", "elf.Dyn64": "debug/elf", "elf.DynFlag": "debug/elf", "elf.DynTag": "debug/elf", "elf.EI_ABIVERSION": "debug/elf", "elf.EI_CLASS": "debug/elf", "elf.EI_DATA": "debug/elf", "elf.EI_NIDENT": "debug/elf", "elf.EI_OSABI": "debug/elf", "elf.EI_PAD": "debug/elf", "elf.EI_VERSION": "debug/elf", "elf.ELFCLASS32": "debug/elf", "elf.ELFCLASS64": "debug/elf", "elf.ELFCLASSNONE": "debug/elf", "elf.ELFDATA2LSB": "debug/elf", "elf.ELFDATA2MSB": "debug/elf", "elf.ELFDATANONE": "debug/elf", "elf.ELFMAG": "debug/elf", "elf.ELFOSABI_86OPEN": "debug/elf", "elf.ELFOSABI_AIX": "debug/elf", "elf.ELFOSABI_ARM": "debug/elf", "elf.ELFOSABI_FREEBSD": "debug/elf", "elf.ELFOSABI_HPUX": "debug/elf", "elf.ELFOSABI_HURD": "debug/elf", "elf.ELFOSABI_IRIX": "debug/elf", "elf.ELFOSABI_LINUX": "debug/elf", "elf.ELFOSABI_MODESTO": "debug/elf", "elf.ELFOSABI_NETBSD": "debug/elf", "elf.ELFOSABI_NONE": "debug/elf", "elf.ELFOSABI_NSK": "debug/elf", "elf.ELFOSABI_OPENBSD": "debug/elf", "elf.ELFOSABI_OPENVMS": "debug/elf", "elf.ELFOSABI_SOLARIS": "debug/elf", "elf.ELFOSABI_STANDALONE": "debug/elf", "elf.ELFOSABI_TRU64": "debug/elf", "elf.EM_386": "debug/elf", "elf.EM_486": "debug/elf", "elf.EM_68HC12": "debug/elf", "elf.EM_68K": "debug/elf", "elf.EM_860": "debug/elf", "elf.EM_88K": "debug/elf", "elf.EM_960": "debug/elf", "elf.EM_AARCH64": "debug/elf", "elf.EM_ALPHA": "debug/elf", "elf.EM_ALPHA_STD": "debug/elf", "elf.EM_ARC": "debug/elf", "elf.EM_ARM": "debug/elf", "elf.EM_COLDFIRE": "debug/elf", "elf.EM_FR20": "debug/elf", "elf.EM_H8S": "debug/elf", "elf.EM_H8_300": "debug/elf", "elf.EM_H8_300H": "debug/elf", "elf.EM_H8_500": "debug/elf", "elf.EM_IA_64": "debug/elf", "elf.EM_M32": "debug/elf", "elf.EM_ME16": "debug/elf", "elf.EM_MIPS": "debug/elf", "elf.EM_MIPS_RS3_LE": "debug/elf", "elf.EM_MIPS_RS4_BE": "debug/elf", "elf.EM_MIPS_X": "debug/elf", "elf.EM_MMA": "debug/elf", "elf.EM_NCPU": "debug/elf", "elf.EM_NDR1": "debug/elf", "elf.EM_NONE": "debug/elf", "elf.EM_PARISC": "debug/elf", "elf.EM_PCP": "debug/elf", "elf.EM_PPC": "debug/elf", "elf.EM_PPC64": "debug/elf", "elf.EM_RCE": "debug/elf", "elf.EM_RH32": "debug/elf", "elf.EM_S370": "debug/elf", "elf.EM_S390": "debug/elf", "elf.EM_SH": "debug/elf", "elf.EM_SPARC": "debug/elf", "elf.EM_SPARC32PLUS": "debug/elf", "elf.EM_SPARCV9": "debug/elf", "elf.EM_ST100": "debug/elf", "elf.EM_STARCORE": "debug/elf", "elf.EM_TINYJ": "debug/elf", "elf.EM_TRICORE": "debug/elf", "elf.EM_V800": "debug/elf", "elf.EM_VPP500": "debug/elf", "elf.EM_X86_64": "debug/elf", "elf.ET_CORE": "debug/elf", "elf.ET_DYN": "debug/elf", "elf.ET_EXEC": "debug/elf", "elf.ET_HIOS": "debug/elf", "elf.ET_HIPROC": "debug/elf", "elf.ET_LOOS": "debug/elf", "elf.ET_LOPROC": "debug/elf", "elf.ET_NONE": "debug/elf", "elf.ET_REL": "debug/elf", "elf.EV_CURRENT": "debug/elf", "elf.EV_NONE": "debug/elf", "elf.ErrNoSymbols": "debug/elf", "elf.File": "debug/elf", "elf.FileHeader": "debug/elf", "elf.FormatError": "debug/elf", "elf.Header32": "debug/elf", "elf.Header64": "debug/elf", "elf.ImportedSymbol": "debug/elf", "elf.Machine": "debug/elf", "elf.NT_FPREGSET": "debug/elf", "elf.NT_PRPSINFO": "debug/elf", "elf.NT_PRSTATUS": "debug/elf", "elf.NType": "debug/elf", "elf.NewFile": "debug/elf", "elf.OSABI": "debug/elf", "elf.Open": "debug/elf", "elf.PF_MASKOS": "debug/elf", "elf.PF_MASKPROC": "debug/elf", "elf.PF_R": "debug/elf", "elf.PF_W": "debug/elf", "elf.PF_X": "debug/elf", "elf.PT_DYNAMIC": "debug/elf", "elf.PT_HIOS": "debug/elf", "elf.PT_HIPROC": "debug/elf", "elf.PT_INTERP": "debug/elf", "elf.PT_LOAD": "debug/elf", "elf.PT_LOOS": "debug/elf", "elf.PT_LOPROC": "debug/elf", "elf.PT_NOTE": "debug/elf", "elf.PT_NULL": "debug/elf", "elf.PT_PHDR": "debug/elf", "elf.PT_SHLIB": "debug/elf", "elf.PT_TLS": "debug/elf", "elf.Prog": "debug/elf", "elf.Prog32": "debug/elf", "elf.Prog64": "debug/elf", "elf.ProgFlag": "debug/elf", "elf.ProgHeader": "debug/elf", "elf.ProgType": "debug/elf", "elf.R_386": "debug/elf", "elf.R_386_32": "debug/elf", "elf.R_386_COPY": "debug/elf", "elf.R_386_GLOB_DAT": "debug/elf", "elf.R_386_GOT32": "debug/elf", "elf.R_386_GOTOFF": "debug/elf", "elf.R_386_GOTPC": "debug/elf", "elf.R_386_JMP_SLOT": "debug/elf", "elf.R_386_NONE": "debug/elf", "elf.R_386_PC32": "debug/elf", "elf.R_386_PLT32": "debug/elf", "elf.R_386_RELATIVE": "debug/elf", "elf.R_386_TLS_DTPMOD32": "debug/elf", "elf.R_386_TLS_DTPOFF32": "debug/elf", "elf.R_386_TLS_GD": "debug/elf", "elf.R_386_TLS_GD_32": "debug/elf", "elf.R_386_TLS_GD_CALL": "debug/elf", "elf.R_386_TLS_GD_POP": "debug/elf", "elf.R_386_TLS_GD_PUSH": "debug/elf", "elf.R_386_TLS_GOTIE": "debug/elf", "elf.R_386_TLS_IE": "debug/elf", "elf.R_386_TLS_IE_32": "debug/elf", "elf.R_386_TLS_LDM": "debug/elf", "elf.R_386_TLS_LDM_32": "debug/elf", "elf.R_386_TLS_LDM_CALL": "debug/elf", "elf.R_386_TLS_LDM_POP": "debug/elf", "elf.R_386_TLS_LDM_PUSH": "debug/elf", "elf.R_386_TLS_LDO_32": "debug/elf", "elf.R_386_TLS_LE": "debug/elf", "elf.R_386_TLS_LE_32": "debug/elf", "elf.R_386_TLS_TPOFF": "debug/elf", "elf.R_386_TLS_TPOFF32": "debug/elf", "elf.R_390": "debug/elf", "elf.R_390_12": "debug/elf", "elf.R_390_16": "debug/elf", "elf.R_390_20": "debug/elf", "elf.R_390_32": "debug/elf", "elf.R_390_64": "debug/elf", "elf.R_390_8": "debug/elf", "elf.R_390_COPY": "debug/elf", "elf.R_390_GLOB_DAT": "debug/elf", "elf.R_390_GOT12": "debug/elf", "elf.R_390_GOT16": "debug/elf", "elf.R_390_GOT20": "debug/elf", "elf.R_390_GOT32": "debug/elf", "elf.R_390_GOT64": "debug/elf", "elf.R_390_GOTENT": "debug/elf", "elf.R_390_GOTOFF": "debug/elf", "elf.R_390_GOTOFF16": "debug/elf", "elf.R_390_GOTOFF64": "debug/elf", "elf.R_390_GOTPC": "debug/elf", "elf.R_390_GOTPCDBL": "debug/elf", "elf.R_390_GOTPLT12": "debug/elf", "elf.R_390_GOTPLT16": "debug/elf", "elf.R_390_GOTPLT20": "debug/elf", "elf.R_390_GOTPLT32": "debug/elf", "elf.R_390_GOTPLT64": "debug/elf", "elf.R_390_GOTPLTENT": "debug/elf", "elf.R_390_GOTPLTOFF16": "debug/elf", "elf.R_390_GOTPLTOFF32": "debug/elf", "elf.R_390_GOTPLTOFF64": "debug/elf", "elf.R_390_JMP_SLOT": "debug/elf", "elf.R_390_NONE": "debug/elf", "elf.R_390_PC16": "debug/elf", "elf.R_390_PC16DBL": "debug/elf", "elf.R_390_PC32": "debug/elf", "elf.R_390_PC32DBL": "debug/elf", "elf.R_390_PC64": "debug/elf", "elf.R_390_PLT16DBL": "debug/elf", "elf.R_390_PLT32": "debug/elf", "elf.R_390_PLT32DBL": "debug/elf", "elf.R_390_PLT64": "debug/elf", "elf.R_390_RELATIVE": "debug/elf", "elf.R_390_TLS_DTPMOD": "debug/elf", "elf.R_390_TLS_DTPOFF": "debug/elf", "elf.R_390_TLS_GD32": "debug/elf", "elf.R_390_TLS_GD64": "debug/elf", "elf.R_390_TLS_GDCALL": "debug/elf", "elf.R_390_TLS_GOTIE12": "debug/elf", "elf.R_390_TLS_GOTIE20": "debug/elf", "elf.R_390_TLS_GOTIE32": "debug/elf", "elf.R_390_TLS_GOTIE64": "debug/elf", "elf.R_390_TLS_IE32": "debug/elf", "elf.R_390_TLS_IE64": "debug/elf", "elf.R_390_TLS_IEENT": "debug/elf", "elf.R_390_TLS_LDCALL": "debug/elf", "elf.R_390_TLS_LDM32": "debug/elf", "elf.R_390_TLS_LDM64": "debug/elf", "elf.R_390_TLS_LDO32": "debug/elf", "elf.R_390_TLS_LDO64": "debug/elf", "elf.R_390_TLS_LE32": "debug/elf", "elf.R_390_TLS_LE64": "debug/elf", "elf.R_390_TLS_LOAD": "debug/elf", "elf.R_390_TLS_TPOFF": "debug/elf", "elf.R_AARCH64": "debug/elf", "elf.R_AARCH64_ABS16": "debug/elf", "elf.R_AARCH64_ABS32": "debug/elf", "elf.R_AARCH64_ABS64": "debug/elf", "elf.R_AARCH64_ADD_ABS_LO12_NC": "debug/elf", "elf.R_AARCH64_ADR_GOT_PAGE": "debug/elf", "elf.R_AARCH64_ADR_PREL_LO21": "debug/elf", "elf.R_AARCH64_ADR_PREL_PG_HI21": "debug/elf", "elf.R_AARCH64_ADR_PREL_PG_HI21_NC": "debug/elf", "elf.R_AARCH64_CALL26": "debug/elf", "elf.R_AARCH64_CONDBR19": "debug/elf", "elf.R_AARCH64_COPY": "debug/elf", "elf.R_AARCH64_GLOB_DAT": "debug/elf", "elf.R_AARCH64_GOT_LD_PREL19": "debug/elf", "elf.R_AARCH64_IRELATIVE": "debug/elf", "elf.R_AARCH64_JUMP26": "debug/elf", "elf.R_AARCH64_JUMP_SLOT": "debug/elf", "elf.R_AARCH64_LD64_GOT_LO12_NC": "debug/elf", "elf.R_AARCH64_LDST128_ABS_LO12_NC": "debug/elf", "elf.R_AARCH64_LDST16_ABS_LO12_NC": "debug/elf", "elf.R_AARCH64_LDST32_ABS_LO12_NC": "debug/elf", "elf.R_AARCH64_LDST64_ABS_LO12_NC": "debug/elf", "elf.R_AARCH64_LDST8_ABS_LO12_NC": "debug/elf", "elf.R_AARCH64_LD_PREL_LO19": "debug/elf", "elf.R_AARCH64_MOVW_SABS_G0": "debug/elf", "elf.R_AARCH64_MOVW_SABS_G1": "debug/elf", "elf.R_AARCH64_MOVW_SABS_G2": "debug/elf", "elf.R_AARCH64_MOVW_UABS_G0": "debug/elf", "elf.R_AARCH64_MOVW_UABS_G0_NC": "debug/elf", "elf.R_AARCH64_MOVW_UABS_G1": "debug/elf", "elf.R_AARCH64_MOVW_UABS_G1_NC": "debug/elf", "elf.R_AARCH64_MOVW_UABS_G2": "debug/elf", "elf.R_AARCH64_MOVW_UABS_G2_NC": "debug/elf", "elf.R_AARCH64_MOVW_UABS_G3": "debug/elf", "elf.R_AARCH64_NONE": "debug/elf", "elf.R_AARCH64_NULL": "debug/elf", "elf.R_AARCH64_P32_ABS16": "debug/elf", "elf.R_AARCH64_P32_ABS32": "debug/elf", "elf.R_AARCH64_P32_ADD_ABS_LO12_NC": "debug/elf", "elf.R_AARCH64_P32_ADR_GOT_PAGE": "debug/elf", "elf.R_AARCH64_P32_ADR_PREL_LO21": "debug/elf", "elf.R_AARCH64_P32_ADR_PREL_PG_HI21": "debug/elf", "elf.R_AARCH64_P32_CALL26": "debug/elf", "elf.R_AARCH64_P32_CONDBR19": "debug/elf", "elf.R_AARCH64_P32_COPY": "debug/elf", "elf.R_AARCH64_P32_GLOB_DAT": "debug/elf", "elf.R_AARCH64_P32_GOT_LD_PREL19": "debug/elf", "elf.R_AARCH64_P32_IRELATIVE": "debug/elf", "elf.R_AARCH64_P32_JUMP26": "debug/elf", "elf.R_AARCH64_P32_JUMP_SLOT": "debug/elf", "elf.R_AARCH64_P32_LD32_GOT_LO12_NC": "debug/elf", "elf.R_AARCH64_P32_LDST128_ABS_LO12_NC": "debug/elf", "elf.R_AARCH64_P32_LDST16_ABS_LO12_NC": "debug/elf", "elf.R_AARCH64_P32_LDST32_ABS_LO12_NC": "debug/elf", "elf.R_AARCH64_P32_LDST64_ABS_LO12_NC": "debug/elf", "elf.R_AARCH64_P32_LDST8_ABS_LO12_NC": "debug/elf", "elf.R_AARCH64_P32_LD_PREL_LO19": "debug/elf", "elf.R_AARCH64_P32_MOVW_SABS_G0": "debug/elf", "elf.R_AARCH64_P32_MOVW_UABS_G0": "debug/elf", "elf.R_AARCH64_P32_MOVW_UABS_G0_NC": "debug/elf", "elf.R_AARCH64_P32_MOVW_UABS_G1": "debug/elf", "elf.R_AARCH64_P32_PREL16": "debug/elf", "elf.R_AARCH64_P32_PREL32": "debug/elf", "elf.R_AARCH64_P32_RELATIVE": "debug/elf", "elf.R_AARCH64_P32_TLSDESC": "debug/elf", "elf.R_AARCH64_P32_TLSDESC_ADD_LO12_NC": "debug/elf", "elf.R_AARCH64_P32_TLSDESC_ADR_PAGE21": "debug/elf", "elf.R_AARCH64_P32_TLSDESC_ADR_PREL21": "debug/elf", "elf.R_AARCH64_P32_TLSDESC_CALL": "debug/elf", "elf.R_AARCH64_P32_TLSDESC_LD32_LO12_NC": "debug/elf", "elf.R_AARCH64_P32_TLSDESC_LD_PREL19": "debug/elf", "elf.R_AARCH64_P32_TLSGD_ADD_LO12_NC": "debug/elf", "elf.R_AARCH64_P32_TLSGD_ADR_PAGE21": "debug/elf", "elf.R_AARCH64_P32_TLSIE_ADR_GOTTPREL_PAGE21": "debug/elf", "elf.R_AARCH64_P32_TLSIE_LD32_GOTTPREL_LO12_NC": "debug/elf", "elf.R_AARCH64_P32_TLSIE_LD_GOTTPREL_PREL19": "debug/elf", "elf.R_AARCH64_P32_TLSLE_ADD_TPREL_HI12": "debug/elf", "elf.R_AARCH64_P32_TLSLE_ADD_TPREL_LO12": "debug/elf", "elf.R_AARCH64_P32_TLSLE_ADD_TPREL_LO12_NC": "debug/elf", "elf.R_AARCH64_P32_TLSLE_MOVW_TPREL_G0": "debug/elf", "elf.R_AARCH64_P32_TLSLE_MOVW_TPREL_G0_NC": "debug/elf", "elf.R_AARCH64_P32_TLSLE_MOVW_TPREL_G1": "debug/elf", "elf.R_AARCH64_P32_TLS_DTPMOD": "debug/elf", "elf.R_AARCH64_P32_TLS_DTPREL": "debug/elf", "elf.R_AARCH64_P32_TLS_TPREL": "debug/elf", "elf.R_AARCH64_P32_TSTBR14": "debug/elf", "elf.R_AARCH64_PREL16": "debug/elf", "elf.R_AARCH64_PREL32": "debug/elf", "elf.R_AARCH64_PREL64": "debug/elf", "elf.R_AARCH64_RELATIVE": "debug/elf", "elf.R_AARCH64_TLSDESC": "debug/elf", "elf.R_AARCH64_TLSDESC_ADD": "debug/elf", "elf.R_AARCH64_TLSDESC_ADD_LO12_NC": "debug/elf", "elf.R_AARCH64_TLSDESC_ADR_PAGE21": "debug/elf", "elf.R_AARCH64_TLSDESC_ADR_PREL21": "debug/elf", "elf.R_AARCH64_TLSDESC_CALL": "debug/elf", "elf.R_AARCH64_TLSDESC_LD64_LO12_NC": "debug/elf", "elf.R_AARCH64_TLSDESC_LDR": "debug/elf", "elf.R_AARCH64_TLSDESC_LD_PREL19": "debug/elf", "elf.R_AARCH64_TLSDESC_OFF_G0_NC": "debug/elf", "elf.R_AARCH64_TLSDESC_OFF_G1": "debug/elf", "elf.R_AARCH64_TLSGD_ADD_LO12_NC": "debug/elf", "elf.R_AARCH64_TLSGD_ADR_PAGE21": "debug/elf", "elf.R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21": "debug/elf", "elf.R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC": "debug/elf", "elf.R_AARCH64_TLSIE_LD_GOTTPREL_PREL19": "debug/elf", "elf.R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC": "debug/elf", "elf.R_AARCH64_TLSIE_MOVW_GOTTPREL_G1": "debug/elf", "elf.R_AARCH64_TLSLE_ADD_TPREL_HI12": "debug/elf", "elf.R_AARCH64_TLSLE_ADD_TPREL_LO12": "debug/elf", "elf.R_AARCH64_TLSLE_ADD_TPREL_LO12_NC": "debug/elf", "elf.R_AARCH64_TLSLE_MOVW_TPREL_G0": "debug/elf", "elf.R_AARCH64_TLSLE_MOVW_TPREL_G0_NC": "debug/elf", "elf.R_AARCH64_TLSLE_MOVW_TPREL_G1": "debug/elf", "elf.R_AARCH64_TLSLE_MOVW_TPREL_G1_NC": "debug/elf", "elf.R_AARCH64_TLSLE_MOVW_TPREL_G2": "debug/elf", "elf.R_AARCH64_TLS_DTPMOD64": "debug/elf", "elf.R_AARCH64_TLS_DTPREL64": "debug/elf", "elf.R_AARCH64_TLS_TPREL64": "debug/elf", "elf.R_AARCH64_TSTBR14": "debug/elf", "elf.R_ALPHA": "debug/elf", "elf.R_ALPHA_BRADDR": "debug/elf", "elf.R_ALPHA_COPY": "debug/elf", "elf.R_ALPHA_GLOB_DAT": "debug/elf", "elf.R_ALPHA_GPDISP": "debug/elf", "elf.R_ALPHA_GPREL32": "debug/elf", "elf.R_ALPHA_GPRELHIGH": "debug/elf", "elf.R_ALPHA_GPRELLOW": "debug/elf", "elf.R_ALPHA_GPVALUE": "debug/elf", "elf.R_ALPHA_HINT": "debug/elf", "elf.R_ALPHA_IMMED_BR_HI32": "debug/elf", "elf.R_ALPHA_IMMED_GP_16": "debug/elf", "elf.R_ALPHA_IMMED_GP_HI32": "debug/elf", "elf.R_ALPHA_IMMED_LO32": "debug/elf", "elf.R_ALPHA_IMMED_SCN_HI32": "debug/elf", "elf.R_ALPHA_JMP_SLOT": "debug/elf", "elf.R_ALPHA_LITERAL": "debug/elf", "elf.R_ALPHA_LITUSE": "debug/elf", "elf.R_ALPHA_NONE": "debug/elf", "elf.R_ALPHA_OP_PRSHIFT": "debug/elf", "elf.R_ALPHA_OP_PSUB": "debug/elf", "elf.R_ALPHA_OP_PUSH": "debug/elf", "elf.R_ALPHA_OP_STORE": "debug/elf", "elf.R_ALPHA_REFLONG": "debug/elf", "elf.R_ALPHA_REFQUAD": "debug/elf", "elf.R_ALPHA_RELATIVE": "debug/elf", "elf.R_ALPHA_SREL16": "debug/elf", "elf.R_ALPHA_SREL32": "debug/elf", "elf.R_ALPHA_SREL64": "debug/elf", "elf.R_ARM": "debug/elf", "elf.R_ARM_ABS12": "debug/elf", "elf.R_ARM_ABS16": "debug/elf", "elf.R_ARM_ABS32": "debug/elf", "elf.R_ARM_ABS8": "debug/elf", "elf.R_ARM_AMP_VCALL9": "debug/elf", "elf.R_ARM_COPY": "debug/elf", "elf.R_ARM_GLOB_DAT": "debug/elf", "elf.R_ARM_GNU_VTENTRY": "debug/elf", "elf.R_ARM_GNU_VTINHERIT": "debug/elf", "elf.R_ARM_GOT32": "debug/elf", "elf.R_ARM_GOTOFF": "debug/elf", "elf.R_ARM_GOTPC": "debug/elf", "elf.R_ARM_JUMP_SLOT": "debug/elf", "elf.R_ARM_NONE": "debug/elf", "elf.R_ARM_PC13": "debug/elf", "elf.R_ARM_PC24": "debug/elf", "elf.R_ARM_PLT32": "debug/elf", "elf.R_ARM_RABS32": "debug/elf", "elf.R_ARM_RBASE": "debug/elf", "elf.R_ARM_REL32": "debug/elf", "elf.R_ARM_RELATIVE": "debug/elf", "elf.R_ARM_RPC24": "debug/elf", "elf.R_ARM_RREL32": "debug/elf", "elf.R_ARM_RSBREL32": "debug/elf", "elf.R_ARM_SBREL32": "debug/elf", "elf.R_ARM_SWI24": "debug/elf", "elf.R_ARM_THM_ABS5": "debug/elf", "elf.R_ARM_THM_PC22": "debug/elf", "elf.R_ARM_THM_PC8": "debug/elf", "elf.R_ARM_THM_RPC22": "debug/elf", "elf.R_ARM_THM_SWI8": "debug/elf", "elf.R_ARM_THM_XPC22": "debug/elf", "elf.R_ARM_XPC25": "debug/elf", "elf.R_INFO": "debug/elf", "elf.R_INFO32": "debug/elf", "elf.R_MIPS": "debug/elf", "elf.R_MIPS_16": "debug/elf", "elf.R_MIPS_26": "debug/elf", "elf.R_MIPS_32": "debug/elf", "elf.R_MIPS_64": "debug/elf", "elf.R_MIPS_ADD_IMMEDIATE": "debug/elf", "elf.R_MIPS_CALL16": "debug/elf", "elf.R_MIPS_CALL_HI16": "debug/elf", "elf.R_MIPS_CALL_LO16": "debug/elf", "elf.R_MIPS_DELETE": "debug/elf", "elf.R_MIPS_GOT16": "debug/elf", "elf.R_MIPS_GOT_DISP": "debug/elf", "elf.R_MIPS_GOT_HI16": "debug/elf", "elf.R_MIPS_GOT_LO16": "debug/elf", "elf.R_MIPS_GOT_OFST": "debug/elf", "elf.R_MIPS_GOT_PAGE": "debug/elf", "elf.R_MIPS_GPREL16": "debug/elf", "elf.R_MIPS_GPREL32": "debug/elf", "elf.R_MIPS_HI16": "debug/elf", "elf.R_MIPS_HIGHER": "debug/elf", "elf.R_MIPS_HIGHEST": "debug/elf", "elf.R_MIPS_INSERT_A": "debug/elf", "elf.R_MIPS_INSERT_B": "debug/elf", "elf.R_MIPS_JALR": "debug/elf", "elf.R_MIPS_LITERAL": "debug/elf", "elf.R_MIPS_LO16": "debug/elf", "elf.R_MIPS_NONE": "debug/elf", "elf.R_MIPS_PC16": "debug/elf", "elf.R_MIPS_PJUMP": "debug/elf", "elf.R_MIPS_REL16": "debug/elf", "elf.R_MIPS_REL32": "debug/elf", "elf.R_MIPS_RELGOT": "debug/elf", "elf.R_MIPS_SCN_DISP": "debug/elf", "elf.R_MIPS_SHIFT5": "debug/elf", "elf.R_MIPS_SHIFT6": "debug/elf", "elf.R_MIPS_SUB": "debug/elf", "elf.R_MIPS_TLS_DTPMOD32": "debug/elf", "elf.R_MIPS_TLS_DTPMOD64": "debug/elf", "elf.R_MIPS_TLS_DTPREL32": "debug/elf", "elf.R_MIPS_TLS_DTPREL64": "debug/elf", "elf.R_MIPS_TLS_DTPREL_HI16": "debug/elf", "elf.R_MIPS_TLS_DTPREL_LO16": "debug/elf", "elf.R_MIPS_TLS_GD": "debug/elf", "elf.R_MIPS_TLS_GOTTPREL": "debug/elf", "elf.R_MIPS_TLS_LDM": "debug/elf", "elf.R_MIPS_TLS_TPREL32": "debug/elf", "elf.R_MIPS_TLS_TPREL64": "debug/elf", "elf.R_MIPS_TLS_TPREL_HI16": "debug/elf", "elf.R_MIPS_TLS_TPREL_LO16": "debug/elf", "elf.R_PPC": "debug/elf", "elf.R_PPC64": "debug/elf", "elf.R_PPC64_ADDR14": "debug/elf", "elf.R_PPC64_ADDR14_BRNTAKEN": "debug/elf", "elf.R_PPC64_ADDR14_BRTAKEN": "debug/elf", "elf.R_PPC64_ADDR16": "debug/elf", "elf.R_PPC64_ADDR16_DS": "debug/elf", "elf.R_PPC64_ADDR16_HA": "debug/elf", "elf.R_PPC64_ADDR16_HI": "debug/elf", "elf.R_PPC64_ADDR16_HIGHER": "debug/elf", "elf.R_PPC64_ADDR16_HIGHERA": "debug/elf", "elf.R_PPC64_ADDR16_HIGHEST": "debug/elf", "elf.R_PPC64_ADDR16_HIGHESTA": "debug/elf", "elf.R_PPC64_ADDR16_LO": "debug/elf", "elf.R_PPC64_ADDR16_LO_DS": "debug/elf", "elf.R_PPC64_ADDR24": "debug/elf", "elf.R_PPC64_ADDR32": "debug/elf", "elf.R_PPC64_ADDR64": "debug/elf", "elf.R_PPC64_DTPMOD64": "debug/elf", "elf.R_PPC64_DTPREL16": "debug/elf", "elf.R_PPC64_DTPREL16_DS": "debug/elf", "elf.R_PPC64_DTPREL16_HA": "debug/elf", "elf.R_PPC64_DTPREL16_HI": "debug/elf", "elf.R_PPC64_DTPREL16_HIGHER": "debug/elf", "elf.R_PPC64_DTPREL16_HIGHERA": "debug/elf", "elf.R_PPC64_DTPREL16_HIGHEST": "debug/elf", "elf.R_PPC64_DTPREL16_HIGHESTA": "debug/elf", "elf.R_PPC64_DTPREL16_LO": "debug/elf", "elf.R_PPC64_DTPREL16_LO_DS": "debug/elf", "elf.R_PPC64_DTPREL64": "debug/elf", "elf.R_PPC64_GOT16": "debug/elf", "elf.R_PPC64_GOT16_DS": "debug/elf", "elf.R_PPC64_GOT16_HA": "debug/elf", "elf.R_PPC64_GOT16_HI": "debug/elf", "elf.R_PPC64_GOT16_LO": "debug/elf", "elf.R_PPC64_GOT16_LO_DS": "debug/elf", "elf.R_PPC64_GOT_DTPREL16_DS": "debug/elf", "elf.R_PPC64_GOT_DTPREL16_HA": "debug/elf", "elf.R_PPC64_GOT_DTPREL16_HI": "debug/elf", "elf.R_PPC64_GOT_DTPREL16_LO_DS": "debug/elf", "elf.R_PPC64_GOT_TLSGD16": "debug/elf", "elf.R_PPC64_GOT_TLSGD16_HA": "debug/elf", "elf.R_PPC64_GOT_TLSGD16_HI": "debug/elf", "elf.R_PPC64_GOT_TLSGD16_LO": "debug/elf", "elf.R_PPC64_GOT_TLSLD16": "debug/elf", "elf.R_PPC64_GOT_TLSLD16_HA": "debug/elf", "elf.R_PPC64_GOT_TLSLD16_HI": "debug/elf", "elf.R_PPC64_GOT_TLSLD16_LO": "debug/elf", "elf.R_PPC64_GOT_TPREL16_DS": "debug/elf", "elf.R_PPC64_GOT_TPREL16_HA": "debug/elf", "elf.R_PPC64_GOT_TPREL16_HI": "debug/elf", "elf.R_PPC64_GOT_TPREL16_LO_DS": "debug/elf", "elf.R_PPC64_JMP_SLOT": "debug/elf", "elf.R_PPC64_NONE": "debug/elf", "elf.R_PPC64_REL14": "debug/elf", "elf.R_PPC64_REL14_BRNTAKEN": "debug/elf", "elf.R_PPC64_REL14_BRTAKEN": "debug/elf", "elf.R_PPC64_REL16": "debug/elf", "elf.R_PPC64_REL16_HA": "debug/elf", "elf.R_PPC64_REL16_HI": "debug/elf", "elf.R_PPC64_REL16_LO": "debug/elf", "elf.R_PPC64_REL24": "debug/elf", "elf.R_PPC64_REL32": "debug/elf", "elf.R_PPC64_REL64": "debug/elf", "elf.R_PPC64_TLS": "debug/elf", "elf.R_PPC64_TLSGD": "debug/elf", "elf.R_PPC64_TLSLD": "debug/elf", "elf.R_PPC64_TOC": "debug/elf", "elf.R_PPC64_TOC16": "debug/elf", "elf.R_PPC64_TOC16_DS": "debug/elf", "elf.R_PPC64_TOC16_HA": "debug/elf", "elf.R_PPC64_TOC16_HI": "debug/elf", "elf.R_PPC64_TOC16_LO": "debug/elf", "elf.R_PPC64_TOC16_LO_DS": "debug/elf", "elf.R_PPC64_TPREL16": "debug/elf", "elf.R_PPC64_TPREL16_DS": "debug/elf", "elf.R_PPC64_TPREL16_HA": "debug/elf", "elf.R_PPC64_TPREL16_HI": "debug/elf", "elf.R_PPC64_TPREL16_HIGHER": "debug/elf", "elf.R_PPC64_TPREL16_HIGHERA": "debug/elf", "elf.R_PPC64_TPREL16_HIGHEST": "debug/elf", "elf.R_PPC64_TPREL16_HIGHESTA": "debug/elf", "elf.R_PPC64_TPREL16_LO": "debug/elf", "elf.R_PPC64_TPREL16_LO_DS": "debug/elf", "elf.R_PPC64_TPREL64": "debug/elf", "elf.R_PPC_ADDR14": "debug/elf", "elf.R_PPC_ADDR14_BRNTAKEN": "debug/elf", "elf.R_PPC_ADDR14_BRTAKEN": "debug/elf", "elf.R_PPC_ADDR16": "debug/elf", "elf.R_PPC_ADDR16_HA": "debug/elf", "elf.R_PPC_ADDR16_HI": "debug/elf", "elf.R_PPC_ADDR16_LO": "debug/elf", "elf.R_PPC_ADDR24": "debug/elf", "elf.R_PPC_ADDR32": "debug/elf", "elf.R_PPC_COPY": "debug/elf", "elf.R_PPC_DTPMOD32": "debug/elf", "elf.R_PPC_DTPREL16": "debug/elf", "elf.R_PPC_DTPREL16_HA": "debug/elf", "elf.R_PPC_DTPREL16_HI": "debug/elf", "elf.R_PPC_DTPREL16_LO": "debug/elf", "elf.R_PPC_DTPREL32": "debug/elf", "elf.R_PPC_EMB_BIT_FLD": "debug/elf", "elf.R_PPC_EMB_MRKREF": "debug/elf", "elf.R_PPC_EMB_NADDR16": "debug/elf", "elf.R_PPC_EMB_NADDR16_HA": "debug/elf", "elf.R_PPC_EMB_NADDR16_HI": "debug/elf", "elf.R_PPC_EMB_NADDR16_LO": "debug/elf", "elf.R_PPC_EMB_NADDR32": "debug/elf", "elf.R_PPC_EMB_RELSDA": "debug/elf", "elf.R_PPC_EMB_RELSEC16": "debug/elf", "elf.R_PPC_EMB_RELST_HA": "debug/elf", "elf.R_PPC_EMB_RELST_HI": "debug/elf", "elf.R_PPC_EMB_RELST_LO": "debug/elf", "elf.R_PPC_EMB_SDA21": "debug/elf", "elf.R_PPC_EMB_SDA2I16": "debug/elf", "elf.R_PPC_EMB_SDA2REL": "debug/elf", "elf.R_PPC_EMB_SDAI16": "debug/elf", "elf.R_PPC_GLOB_DAT": "debug/elf", "elf.R_PPC_GOT16": "debug/elf", "elf.R_PPC_GOT16_HA": "debug/elf", "elf.R_PPC_GOT16_HI": "debug/elf", "elf.R_PPC_GOT16_LO": "debug/elf", "elf.R_PPC_GOT_TLSGD16": "debug/elf", "elf.R_PPC_GOT_TLSGD16_HA": "debug/elf", "elf.R_PPC_GOT_TLSGD16_HI": "debug/elf", "elf.R_PPC_GOT_TLSGD16_LO": "debug/elf", "elf.R_PPC_GOT_TLSLD16": "debug/elf", "elf.R_PPC_GOT_TLSLD16_HA": "debug/elf", "elf.R_PPC_GOT_TLSLD16_HI": "debug/elf", "elf.R_PPC_GOT_TLSLD16_LO": "debug/elf", "elf.R_PPC_GOT_TPREL16": "debug/elf", "elf.R_PPC_GOT_TPREL16_HA": "debug/elf", "elf.R_PPC_GOT_TPREL16_HI": "debug/elf", "elf.R_PPC_GOT_TPREL16_LO": "debug/elf", "elf.R_PPC_JMP_SLOT": "debug/elf", "elf.R_PPC_LOCAL24PC": "debug/elf", "elf.R_PPC_NONE": "debug/elf", "elf.R_PPC_PLT16_HA": "debug/elf", "elf.R_PPC_PLT16_HI": "debug/elf", "elf.R_PPC_PLT16_LO": "debug/elf", "elf.R_PPC_PLT32": "debug/elf", "elf.R_PPC_PLTREL24": "debug/elf", "elf.R_PPC_PLTREL32": "debug/elf", "elf.R_PPC_REL14": "debug/elf", "elf.R_PPC_REL14_BRNTAKEN": "debug/elf", "elf.R_PPC_REL14_BRTAKEN": "debug/elf", "elf.R_PPC_REL24": "debug/elf", "elf.R_PPC_REL32": "debug/elf", "elf.R_PPC_RELATIVE": "debug/elf", "elf.R_PPC_SDAREL16": "debug/elf", "elf.R_PPC_SECTOFF": "debug/elf", "elf.R_PPC_SECTOFF_HA": "debug/elf", "elf.R_PPC_SECTOFF_HI": "debug/elf", "elf.R_PPC_SECTOFF_LO": "debug/elf", "elf.R_PPC_TLS": "debug/elf", "elf.R_PPC_TPREL16": "debug/elf", "elf.R_PPC_TPREL16_HA": "debug/elf", "elf.R_PPC_TPREL16_HI": "debug/elf", "elf.R_PPC_TPREL16_LO": "debug/elf", "elf.R_PPC_TPREL32": "debug/elf", "elf.R_PPC_UADDR16": "debug/elf", "elf.R_PPC_UADDR32": "debug/elf", "elf.R_SPARC": "debug/elf", "elf.R_SPARC_10": "debug/elf", "elf.R_SPARC_11": "debug/elf", "elf.R_SPARC_13": "debug/elf", "elf.R_SPARC_16": "debug/elf", "elf.R_SPARC_22": "debug/elf", "elf.R_SPARC_32": "debug/elf", "elf.R_SPARC_5": "debug/elf", "elf.R_SPARC_6": "debug/elf", "elf.R_SPARC_64": "debug/elf", "elf.R_SPARC_7": "debug/elf", "elf.R_SPARC_8": "debug/elf", "elf.R_SPARC_COPY": "debug/elf", "elf.R_SPARC_DISP16": "debug/elf", "elf.R_SPARC_DISP32": "debug/elf", "elf.R_SPARC_DISP64": "debug/elf", "elf.R_SPARC_DISP8": "debug/elf", "elf.R_SPARC_GLOB_DAT": "debug/elf", "elf.R_SPARC_GLOB_JMP": "debug/elf", "elf.R_SPARC_GOT10": "debug/elf", "elf.R_SPARC_GOT13": "debug/elf", "elf.R_SPARC_GOT22": "debug/elf", "elf.R_SPARC_H44": "debug/elf", "elf.R_SPARC_HH22": "debug/elf", "elf.R_SPARC_HI22": "debug/elf", "elf.R_SPARC_HIPLT22": "debug/elf", "elf.R_SPARC_HIX22": "debug/elf", "elf.R_SPARC_HM10": "debug/elf", "elf.R_SPARC_JMP_SLOT": "debug/elf", "elf.R_SPARC_L44": "debug/elf", "elf.R_SPARC_LM22": "debug/elf", "elf.R_SPARC_LO10": "debug/elf", "elf.R_SPARC_LOPLT10": "debug/elf", "elf.R_SPARC_LOX10": "debug/elf", "elf.R_SPARC_M44": "debug/elf", "elf.R_SPARC_NONE": "debug/elf", "elf.R_SPARC_OLO10": "debug/elf", "elf.R_SPARC_PC10": "debug/elf", "elf.R_SPARC_PC22": "debug/elf", "elf.R_SPARC_PCPLT10": "debug/elf", "elf.R_SPARC_PCPLT22": "debug/elf", "elf.R_SPARC_PCPLT32": "debug/elf", "elf.R_SPARC_PC_HH22": "debug/elf", "elf.R_SPARC_PC_HM10": "debug/elf", "elf.R_SPARC_PC_LM22": "debug/elf", "elf.R_SPARC_PLT32": "debug/elf", "elf.R_SPARC_PLT64": "debug/elf", "elf.R_SPARC_REGISTER": "debug/elf", "elf.R_SPARC_RELATIVE": "debug/elf", "elf.R_SPARC_UA16": "debug/elf", "elf.R_SPARC_UA32": "debug/elf", "elf.R_SPARC_UA64": "debug/elf", "elf.R_SPARC_WDISP16": "debug/elf", "elf.R_SPARC_WDISP19": "debug/elf", "elf.R_SPARC_WDISP22": "debug/elf", "elf.R_SPARC_WDISP30": "debug/elf", "elf.R_SPARC_WPLT30": "debug/elf", "elf.R_SYM32": "debug/elf", "elf.R_SYM64": "debug/elf", "elf.R_TYPE32": "debug/elf", "elf.R_TYPE64": "debug/elf", "elf.R_X86_64": "debug/elf", "elf.R_X86_64_16": "debug/elf", "elf.R_X86_64_32": "debug/elf", "elf.R_X86_64_32S": "debug/elf", "elf.R_X86_64_64": "debug/elf", "elf.R_X86_64_8": "debug/elf", "elf.R_X86_64_COPY": "debug/elf", "elf.R_X86_64_DTPMOD64": "debug/elf", "elf.R_X86_64_DTPOFF32": "debug/elf", "elf.R_X86_64_DTPOFF64": "debug/elf", "elf.R_X86_64_GLOB_DAT": "debug/elf", "elf.R_X86_64_GOT32": "debug/elf", "elf.R_X86_64_GOTPCREL": "debug/elf", "elf.R_X86_64_GOTTPOFF": "debug/elf", "elf.R_X86_64_JMP_SLOT": "debug/elf", "elf.R_X86_64_NONE": "debug/elf", "elf.R_X86_64_PC16": "debug/elf", "elf.R_X86_64_PC32": "debug/elf", "elf.R_X86_64_PC8": "debug/elf", "elf.R_X86_64_PLT32": "debug/elf", "elf.R_X86_64_RELATIVE": "debug/elf", "elf.R_X86_64_TLSGD": "debug/elf", "elf.R_X86_64_TLSLD": "debug/elf", "elf.R_X86_64_TPOFF32": "debug/elf", "elf.R_X86_64_TPOFF64": "debug/elf", "elf.Rel32": "debug/elf", "elf.Rel64": "debug/elf", "elf.Rela32": "debug/elf", "elf.Rela64": "debug/elf", "elf.SHF_ALLOC": "debug/elf", "elf.SHF_COMPRESSED": "debug/elf", "elf.SHF_EXECINSTR": "debug/elf", "elf.SHF_GROUP": "debug/elf", "elf.SHF_INFO_LINK": "debug/elf", "elf.SHF_LINK_ORDER": "debug/elf", "elf.SHF_MASKOS": "debug/elf", "elf.SHF_MASKPROC": "debug/elf", "elf.SHF_MERGE": "debug/elf", "elf.SHF_OS_NONCONFORMING": "debug/elf", "elf.SHF_STRINGS": "debug/elf", "elf.SHF_TLS": "debug/elf", "elf.SHF_WRITE": "debug/elf", "elf.SHN_ABS": "debug/elf", "elf.SHN_COMMON": "debug/elf", "elf.SHN_HIOS": "debug/elf", "elf.SHN_HIPROC": "debug/elf", "elf.SHN_HIRESERVE": "debug/elf", "elf.SHN_LOOS": "debug/elf", "elf.SHN_LOPROC": "debug/elf", "elf.SHN_LORESERVE": "debug/elf", "elf.SHN_UNDEF": "debug/elf", "elf.SHN_XINDEX": "debug/elf", "elf.SHT_DYNAMIC": "debug/elf", "elf.SHT_DYNSYM": "debug/elf", "elf.SHT_FINI_ARRAY": "debug/elf", "elf.SHT_GNU_ATTRIBUTES": "debug/elf", "elf.SHT_GNU_HASH": "debug/elf", "elf.SHT_GNU_LIBLIST": "debug/elf", "elf.SHT_GNU_VERDEF": "debug/elf", "elf.SHT_GNU_VERNEED": "debug/elf", "elf.SHT_GNU_VERSYM": "debug/elf", "elf.SHT_GROUP": "debug/elf", "elf.SHT_HASH": "debug/elf", "elf.SHT_HIOS": "debug/elf", "elf.SHT_HIPROC": "debug/elf", "elf.SHT_HIUSER": "debug/elf", "elf.SHT_INIT_ARRAY": "debug/elf", "elf.SHT_LOOS": "debug/elf", "elf.SHT_LOPROC": "debug/elf", "elf.SHT_LOUSER": "debug/elf", "elf.SHT_NOBITS": "debug/elf", "elf.SHT_NOTE": "debug/elf", "elf.SHT_NULL": "debug/elf", "elf.SHT_PREINIT_ARRAY": "debug/elf", "elf.SHT_PROGBITS": "debug/elf", "elf.SHT_REL": "debug/elf", "elf.SHT_RELA": "debug/elf", "elf.SHT_SHLIB": "debug/elf", "elf.SHT_STRTAB": "debug/elf", "elf.SHT_SYMTAB": "debug/elf", "elf.SHT_SYMTAB_SHNDX": "debug/elf", "elf.STB_GLOBAL": "debug/elf", "elf.STB_HIOS": "debug/elf", "elf.STB_HIPROC": "debug/elf", "elf.STB_LOCAL": "debug/elf", "elf.STB_LOOS": "debug/elf", "elf.STB_LOPROC": "debug/elf", "elf.STB_WEAK": "debug/elf", "elf.STT_COMMON": "debug/elf", "elf.STT_FILE": "debug/elf", "elf.STT_FUNC": "debug/elf", "elf.STT_HIOS": "debug/elf", "elf.STT_HIPROC": "debug/elf", "elf.STT_LOOS": "debug/elf", "elf.STT_LOPROC": "debug/elf", "elf.STT_NOTYPE": "debug/elf", "elf.STT_OBJECT": "debug/elf", "elf.STT_SECTION": "debug/elf", "elf.STT_TLS": "debug/elf", "elf.STV_DEFAULT": "debug/elf", "elf.STV_HIDDEN": "debug/elf", "elf.STV_INTERNAL": "debug/elf", "elf.STV_PROTECTED": "debug/elf", "elf.ST_BIND": "debug/elf", "elf.ST_INFO": "debug/elf", "elf.ST_TYPE": "debug/elf", "elf.ST_VISIBILITY": "debug/elf", "elf.Section": "debug/elf", "elf.Section32": "debug/elf", "elf.Section64": "debug/elf", "elf.SectionFlag": "debug/elf", "elf.SectionHeader": "debug/elf", "elf.SectionIndex": "debug/elf", "elf.SectionType": "debug/elf", "elf.Sym32": "debug/elf", "elf.Sym32Size": "debug/elf", "elf.Sym64": "debug/elf", "elf.Sym64Size": "debug/elf", "elf.SymBind": "debug/elf", "elf.SymType": "debug/elf", "elf.SymVis": "debug/elf", "elf.Symbol": "debug/elf", "elf.Type": "debug/elf", "elf.Version": "debug/elf", "elliptic.Curve": "crypto/elliptic", "elliptic.CurveParams": "crypto/elliptic", "elliptic.GenerateKey": "crypto/elliptic", "elliptic.Marshal": "crypto/elliptic", "elliptic.P224": "crypto/elliptic", "elliptic.P256": "crypto/elliptic", "elliptic.P384": "crypto/elliptic", "elliptic.P521": "crypto/elliptic", "elliptic.Unmarshal": "crypto/elliptic", "encoding.BinaryMarshaler": "encoding", "encoding.BinaryUnmarshaler": "encoding", "encoding.TextMarshaler": "encoding", "encoding.TextUnmarshaler": "encoding", "errors.New": "errors", "exec.Cmd": "os/exec", "exec.Command": "os/exec", "exec.CommandContext": "os/exec", "exec.ErrNotFound": "os/exec", "exec.Error": "os/exec", "exec.ExitError": "os/exec", "exec.LookPath": "os/exec", "expvar.Do": "expvar", "expvar.Float": "expvar", "expvar.Func": "expvar", "expvar.Get": "expvar", "expvar.Int": "expvar", "expvar.KeyValue": "expvar", "expvar.Map": "expvar", "expvar.NewFloat": "expvar", "expvar.NewInt": "expvar", "expvar.NewMap": "expvar", "expvar.NewString": "expvar", "expvar.Publish": "expvar", "expvar.String": "expvar", "expvar.Var": "expvar", "fcgi.ErrConnClosed": "net/http/fcgi", "fcgi.ErrRequestAborted": "net/http/fcgi", "fcgi.Serve": "net/http/fcgi", "filepath.Abs": "path/filepath", "filepath.Base": "path/filepath", "filepath.Clean": "path/filepath", "filepath.Dir": "path/filepath", "filepath.ErrBadPattern": "path/filepath", "filepath.EvalSymlinks": "path/filepath", "filepath.Ext": "path/filepath", "filepath.FromSlash": "path/filepath", "filepath.Glob": "path/filepath", "filepath.HasPrefix": "path/filepath", "filepath.IsAbs": "path/filepath", "filepath.Join": "path/filepath", "filepath.ListSeparator": "path/filepath", "filepath.Match": "path/filepath", "filepath.Rel": "path/filepath", "filepath.Separator": "path/filepath", "filepath.SkipDir": "path/filepath", "filepath.Split": "path/filepath", "filepath.SplitList": "path/filepath", "filepath.ToSlash": "path/filepath", "filepath.VolumeName": "path/filepath", "filepath.Walk": "path/filepath", "filepath.WalkFunc": "path/filepath", "flag.Arg": "flag", "flag.Args": "flag", "flag.Bool": "flag", "flag.BoolVar": "flag", "flag.CommandLine": "flag", "flag.ContinueOnError": "flag", "flag.Duration": "flag", "flag.DurationVar": "flag", "flag.ErrHelp": "flag", "flag.ErrorHandling": "flag", "flag.ExitOnError": "flag", "flag.Flag": "flag", "flag.FlagSet": "flag", "flag.Float64": "flag", "flag.Float64Var": "flag", "flag.Getter": "flag", "flag.Int": "flag", "flag.Int64": "flag", "flag.Int64Var": "flag", "flag.IntVar": "flag", "flag.Lookup": "flag", "flag.NArg": "flag", "flag.NFlag": "flag", "flag.NewFlagSet": "flag", "flag.PanicOnError": "flag", "flag.Parse": "flag", "flag.Parsed": "flag", "flag.PrintDefaults": "flag", "flag.Set": "flag", "flag.String": "flag", "flag.StringVar": "flag", "flag.Uint": "flag", "flag.Uint64": "flag", "flag.Uint64Var": "flag", "flag.UintVar": "flag", "flag.UnquoteUsage": "flag", "flag.Usage": "flag", "flag.Value": "flag", "flag.Var": "flag", "flag.Visit": "flag", "flag.VisitAll": "flag", "flate.BestCompression": "compress/flate", "flate.BestSpeed": "compress/flate", "flate.CorruptInputError": "compress/flate", "flate.DefaultCompression": "compress/flate", "flate.HuffmanOnly": "compress/flate", "flate.InternalError": "compress/flate", "flate.NewReader": "compress/flate", "flate.NewReaderDict": "compress/flate", "flate.NewWriter": "compress/flate", "flate.NewWriterDict": "compress/flate", "flate.NoCompression": "compress/flate", "flate.ReadError": "compress/flate", "flate.Reader": "compress/flate", "flate.Resetter": "compress/flate", "flate.WriteError": "compress/flate", "flate.Writer": "compress/flate", "fmt.Errorf": "fmt", "fmt.Formatter": "fmt", "fmt.Fprint": "fmt", "fmt.Fprintf": "fmt", "fmt.Fprintln": "fmt", "fmt.Fscan": "fmt", "fmt.Fscanf": "fmt", "fmt.Fscanln": "fmt", "fmt.GoStringer": "fmt", "fmt.Print": "fmt", "fmt.Printf": "fmt", "fmt.Println": "fmt", "fmt.Scan": "fmt", "fmt.ScanState": "fmt", "fmt.Scanf": "fmt", "fmt.Scanln": "fmt", "fmt.Scanner": "fmt", "fmt.Sprint": "fmt", "fmt.Sprintf": "fmt", "fmt.Sprintln": "fmt", "fmt.Sscan": "fmt", "fmt.Sscanf": "fmt", "fmt.Sscanln": "fmt", "fmt.State": "fmt", "fmt.Stringer": "fmt", "fnv.New32": "hash/fnv", "fnv.New32a": "hash/fnv", "fnv.New64": "hash/fnv", "fnv.New64a": "hash/fnv", "format.Node": "go/format", "format.Source": "go/format", "gif.Decode": "image/gif", "gif.DecodeAll": "image/gif", "gif.DecodeConfig": "image/gif", "gif.DisposalBackground": "image/gif", "gif.DisposalNone": "image/gif", "gif.DisposalPrevious": "image/gif", "gif.Encode": "image/gif", "gif.EncodeAll": "image/gif", "gif.GIF": "image/gif", "gif.Options": "image/gif", "gob.CommonType": "encoding/gob", "gob.Decoder": "encoding/gob", "gob.Encoder": "encoding/gob", "gob.GobDecoder": "encoding/gob", "gob.GobEncoder": "encoding/gob", "gob.NewDecoder": "encoding/gob", "gob.NewEncoder": "encoding/gob", "gob.Register": "encoding/gob", "gob.RegisterName": "encoding/gob", "gosym.DecodingError": "debug/gosym", "gosym.Func": "debug/gosym", "gosym.LineTable": "debug/gosym", "gosym.NewLineTable": "debug/gosym", "gosym.NewTable": "debug/gosym", "gosym.Obj": "debug/gosym", "gosym.Sym": "debug/gosym", "gosym.Table": "debug/gosym", "gosym.UnknownFileError": "debug/gosym", "gosym.UnknownLineError": "debug/gosym", "gzip.BestCompression": "compress/gzip", "gzip.BestSpeed": "compress/gzip", "gzip.DefaultCompression": "compress/gzip", "gzip.ErrChecksum": "compress/gzip", "gzip.ErrHeader": "compress/gzip", "gzip.Header": "compress/gzip", "gzip.NewReader": "compress/gzip", "gzip.NewWriter": "compress/gzip", "gzip.NewWriterLevel": "compress/gzip", "gzip.NoCompression": "compress/gzip", "gzip.Reader": "compress/gzip", "gzip.Writer": "compress/gzip", "hash.Hash": "hash", "hash.Hash32": "hash", "hash.Hash64": "hash", "heap.Fix": "container/heap", "heap.Init": "container/heap", "heap.Interface": "container/heap", "heap.Pop": "container/heap", "heap.Push": "container/heap", "heap.Remove": "container/heap", "hex.Decode": "encoding/hex", "hex.DecodeString": "encoding/hex", "hex.DecodedLen": "encoding/hex", "hex.Dump": "encoding/hex", "hex.Dumper": "encoding/hex", "hex.Encode": "encoding/hex", "hex.EncodeToString": "encoding/hex", "hex.EncodedLen": "encoding/hex", "hex.ErrLength": "encoding/hex", "hex.InvalidByteError": "encoding/hex", "hmac.Equal": "crypto/hmac", "hmac.New": "crypto/hmac", "html.EscapeString": "html", "html.UnescapeString": "html", "http.CanonicalHeaderKey": "net/http", "http.Client": "net/http", "http.CloseNotifier": "net/http", "http.ConnState": "net/http", "http.Cookie": "net/http", "http.CookieJar": "net/http", "http.DefaultClient": "net/http", "http.DefaultMaxHeaderBytes": "net/http", "http.DefaultMaxIdleConnsPerHost": "net/http", "http.DefaultServeMux": "net/http", "http.DefaultTransport": "net/http", "http.DetectContentType": "net/http", "http.Dir": "net/http", "http.ErrBodyNotAllowed": "net/http", "http.ErrBodyReadAfterClose": "net/http", "http.ErrContentLength": "net/http", "http.ErrHandlerTimeout": "net/http", "http.ErrHeaderTooLong": "net/http", "http.ErrHijacked": "net/http", "http.ErrLineTooLong": "net/http", "http.ErrMissingBoundary": "net/http", "http.ErrMissingContentLength": "net/http", "http.ErrMissingFile": "net/http", "http.ErrNoCookie": "net/http", "http.ErrNoLocation": "net/http", "http.ErrNotMultipart": "net/http", "http.ErrNotSupported": "net/http", "http.ErrShortBody": "net/http", "http.ErrSkipAltProtocol": "net/http", "http.ErrUnexpectedTrailer": "net/http", "http.ErrUseLastResponse": "net/http", "http.ErrWriteAfterFlush": "net/http", "http.Error": "net/http", "http.File": "net/http", "http.FileServer": "net/http", "http.FileSystem": "net/http", "http.Flusher": "net/http", "http.Get": "net/http", "http.Handle": "net/http", "http.HandleFunc": "net/http", "http.Handler": "net/http", "http.HandlerFunc": "net/http", "http.Head": "net/http", "http.Header": "net/http", "http.Hijacker": "net/http", "http.ListenAndServe": "net/http", "http.ListenAndServeTLS": "net/http", "http.LocalAddrContextKey": "net/http", "http.MaxBytesReader": "net/http", "http.MethodConnect": "net/http", "http.MethodDelete": "net/http", "http.MethodGet": "net/http", "http.MethodHead": "net/http", "http.MethodOptions": "net/http", "http.MethodPatch": "net/http", "http.MethodPost": "net/http", "http.MethodPut": "net/http", "http.MethodTrace": "net/http", "http.NewFileTransport": "net/http", "http.NewRequest": "net/http", "http.NewServeMux": "net/http", "http.NotFound": "net/http", "http.NotFoundHandler": "net/http", "http.ParseHTTPVersion": "net/http", "http.ParseTime": "net/http", "http.Post": "net/http", "http.PostForm": "net/http", "http.ProtocolError": "net/http", "http.ProxyFromEnvironment": "net/http", "http.ProxyURL": "net/http", "http.ReadRequest": "net/http", "http.ReadResponse": "net/http", "http.Redirect": "net/http", "http.RedirectHandler": "net/http", "http.Request": "net/http", "http.Response": "net/http", "http.ResponseWriter": "net/http", "http.RoundTripper": "net/http", "http.Serve": "net/http", "http.ServeContent": "net/http", "http.ServeFile": "net/http", "http.ServeMux": "net/http", "http.Server": "net/http", "http.ServerContextKey": "net/http", "http.SetCookie": "net/http", "http.StateActive": "net/http", "http.StateClosed": "net/http", "http.StateHijacked": "net/http", "http.StateIdle": "net/http", "http.StateNew": "net/http", "http.StatusAccepted": "net/http", "http.StatusAlreadyReported": "net/http", "http.StatusBadGateway": "net/http", "http.StatusBadRequest": "net/http", "http.StatusConflict": "net/http", "http.StatusContinue": "net/http", "http.StatusCreated": "net/http", "http.StatusExpectationFailed": "net/http", "http.StatusFailedDependency": "net/http", "http.StatusForbidden": "net/http", "http.StatusFound": "net/http", "http.StatusGatewayTimeout": "net/http", "http.StatusGone": "net/http", "http.StatusHTTPVersionNotSupported": "net/http", "http.StatusIMUsed": "net/http", "http.StatusInsufficientStorage": "net/http", "http.StatusInternalServerError": "net/http", "http.StatusLengthRequired": "net/http", "http.StatusLocked": "net/http", "http.StatusLoopDetected": "net/http", "http.StatusMethodNotAllowed": "net/http", "http.StatusMovedPermanently": "net/http", "http.StatusMultiStatus": "net/http", "http.StatusMultipleChoices": "net/http", "http.StatusNetworkAuthenticationRequired": "net/http", "http.StatusNoContent": "net/http", "http.StatusNonAuthoritativeInfo": "net/http", "http.StatusNotAcceptable": "net/http", "http.StatusNotExtended": "net/http", "http.StatusNotFound": "net/http", "http.StatusNotImplemented": "net/http", "http.StatusNotModified": "net/http", "http.StatusOK": "net/http", "http.StatusPartialContent": "net/http", "http.StatusPaymentRequired": "net/http", "http.StatusPermanentRedirect": "net/http", "http.StatusPreconditionFailed": "net/http", "http.StatusPreconditionRequired": "net/http", "http.StatusProcessing": "net/http", "http.StatusProxyAuthRequired": "net/http", "http.StatusRequestEntityTooLarge": "net/http", "http.StatusRequestHeaderFieldsTooLarge": "net/http", "http.StatusRequestTimeout": "net/http", "http.StatusRequestURITooLong": "net/http", "http.StatusRequestedRangeNotSatisfiable": "net/http", "http.StatusResetContent": "net/http", "http.StatusSeeOther": "net/http", "http.StatusServiceUnavailable": "net/http", "http.StatusSwitchingProtocols": "net/http", "http.StatusTeapot": "net/http", "http.StatusTemporaryRedirect": "net/http", "http.StatusText": "net/http", "http.StatusTooManyRequests": "net/http", "http.StatusUnauthorized": "net/http", "http.StatusUnavailableForLegalReasons": "net/http", "http.StatusUnprocessableEntity": "net/http", "http.StatusUnsupportedMediaType": "net/http", "http.StatusUpgradeRequired": "net/http", "http.StatusUseProxy": "net/http", "http.StatusVariantAlsoNegotiates": "net/http", "http.StripPrefix": "net/http", "http.TimeFormat": "net/http", "http.TimeoutHandler": "net/http", "http.Transport": "net/http", "httptest.DefaultRemoteAddr": "net/http/httptest", "httptest.NewRecorder": "net/http/httptest", "httptest.NewRequest": "net/http/httptest", "httptest.NewServer": "net/http/httptest", "httptest.NewTLSServer": "net/http/httptest", "httptest.NewUnstartedServer": "net/http/httptest", "httptest.ResponseRecorder": "net/http/httptest", "httptest.Server": "net/http/httptest", "httptrace.ClientTrace": "net/http/httptrace", "httptrace.ContextClientTrace": "net/http/httptrace", "httptrace.DNSDoneInfo": "net/http/httptrace", "httptrace.DNSStartInfo": "net/http/httptrace", "httptrace.GotConnInfo": "net/http/httptrace", "httptrace.WithClientTrace": "net/http/httptrace", "httptrace.WroteRequestInfo": "net/http/httptrace", "httputil.BufferPool": "net/http/httputil", "httputil.ClientConn": "net/http/httputil", "httputil.DumpRequest": "net/http/httputil", "httputil.DumpRequestOut": "net/http/httputil", "httputil.DumpResponse": "net/http/httputil", "httputil.ErrClosed": "net/http/httputil", "httputil.ErrLineTooLong": "net/http/httputil", "httputil.ErrPersistEOF": "net/http/httputil", "httputil.ErrPipeline": "net/http/httputil", "httputil.NewChunkedReader": "net/http/httputil", "httputil.NewChunkedWriter": "net/http/httputil", "httputil.NewClientConn": "net/http/httputil", "httputil.NewProxyClientConn": "net/http/httputil", "httputil.NewServerConn": "net/http/httputil", "httputil.NewSingleHostReverseProxy": "net/http/httputil", "httputil.ReverseProxy": "net/http/httputil", "httputil.ServerConn": "net/http/httputil", "image.Alpha": "image", "image.Alpha16": "image", "image.Black": "image", "image.CMYK": "image", "image.Config": "image", "image.Decode": "image", "image.DecodeConfig": "image", "image.ErrFormat": "image", "image.Gray": "image", "image.Gray16": "image", "image.Image": "image", "image.NRGBA": "image", "image.NRGBA64": "image", "image.NYCbCrA": "image", "image.NewAlpha": "image", "image.NewAlpha16": "image", "image.NewCMYK": "image", "image.NewGray": "image", "image.NewGray16": "image", "image.NewNRGBA": "image", "image.NewNRGBA64": "image", "image.NewNYCbCrA": "image", "image.NewPaletted": "image", "image.NewRGBA": "image", "image.NewRGBA64": "image", "image.NewUniform": "image", "image.NewYCbCr": "image", "image.Opaque": "image", "image.Paletted": "image", "image.PalettedImage": "image", "image.Point": "image", "image.Pt": "image", "image.RGBA": "image", "image.RGBA64": "image", "image.Rect": "image", "image.Rectangle": "image", "image.RegisterFormat": "image", "image.Transparent": "image", "image.Uniform": "image", "image.White": "image", "image.YCbCr": "image", "image.YCbCrSubsampleRatio": "image", "image.YCbCrSubsampleRatio410": "image", "image.YCbCrSubsampleRatio411": "image", "image.YCbCrSubsampleRatio420": "image", "image.YCbCrSubsampleRatio422": "image", "image.YCbCrSubsampleRatio440": "image", "image.YCbCrSubsampleRatio444": "image", "image.ZP": "image", "image.ZR": "image", "importer.Default": "go/importer", "importer.For": "go/importer", "importer.Lookup": "go/importer", "io.ByteReader": "io", "io.ByteScanner": "io", "io.ByteWriter": "io", "io.Closer": "io", "io.Copy": "io", "io.CopyBuffer": "io", "io.CopyN": "io", "io.EOF": "io", "io.ErrClosedPipe": "io", "io.ErrNoProgress": "io", "io.ErrShortBuffer": "io", "io.ErrShortWrite": "io", "io.ErrUnexpectedEOF": "io", "io.LimitReader": "io", "io.LimitedReader": "io", "io.MultiReader": "io", "io.MultiWriter": "io", "io.NewSectionReader": "io", "io.Pipe": "io", "io.PipeReader": "io", "io.PipeWriter": "io", "io.ReadAtLeast": "io", "io.ReadCloser": "io", "io.ReadFull": "io", "io.ReadSeeker": "io", "io.ReadWriteCloser": "io", "io.ReadWriteSeeker": "io", "io.ReadWriter": "io", "io.Reader": "io", "io.ReaderAt": "io", "io.ReaderFrom": "io", "io.RuneReader": "io", "io.RuneScanner": "io", "io.SectionReader": "io", "io.SeekCurrent": "io", "io.SeekEnd": "io", "io.SeekStart": "io", "io.Seeker": "io", "io.TeeReader": "io", "io.WriteCloser": "io", "io.WriteSeeker": "io", "io.WriteString": "io", "io.Writer": "io", "io.WriterAt": "io", "io.WriterTo": "io", "iotest.DataErrReader": "testing/iotest", "iotest.ErrTimeout": "testing/iotest", "iotest.HalfReader": "testing/iotest", "iotest.NewReadLogger": "testing/iotest", "iotest.NewWriteLogger": "testing/iotest", "iotest.OneByteReader": "testing/iotest", "iotest.TimeoutReader": "testing/iotest", "iotest.TruncateWriter": "testing/iotest", "ioutil.Discard": "io/ioutil", "ioutil.NopCloser": "io/ioutil", "ioutil.ReadAll": "io/ioutil", "ioutil.ReadDir": "io/ioutil", "ioutil.ReadFile": "io/ioutil", "ioutil.TempDir": "io/ioutil", "ioutil.TempFile": "io/ioutil", "ioutil.WriteFile": "io/ioutil", "jpeg.Decode": "image/jpeg", "jpeg.DecodeConfig": "image/jpeg", "jpeg.DefaultQuality": "image/jpeg", "jpeg.Encode": "image/jpeg", "jpeg.FormatError": "image/jpeg", "jpeg.Options": "image/jpeg", "jpeg.Reader": "image/jpeg", "jpeg.UnsupportedError": "image/jpeg", "json.Compact": "encoding/json", "json.Decoder": "encoding/json", "json.Delim": "encoding/json", "json.Encoder": "encoding/json", "json.HTMLEscape": "encoding/json", "json.Indent": "encoding/json", "json.InvalidUTF8Error": "encoding/json", "json.InvalidUnmarshalError": "encoding/json", "json.Marshal": "encoding/json", "json.MarshalIndent": "encoding/json", "json.Marshaler": "encoding/json", "json.MarshalerError": "encoding/json", "json.NewDecoder": "encoding/json", "json.NewEncoder": "encoding/json", "json.Number": "encoding/json", "json.RawMessage": "encoding/json", "json.SyntaxError": "encoding/json", "json.Token": "encoding/json", "json.Unmarshal": "encoding/json", "json.UnmarshalFieldError": "encoding/json", "json.UnmarshalTypeError": "encoding/json", "json.Unmarshaler": "encoding/json", "json.UnsupportedTypeError": "encoding/json", "json.UnsupportedValueError": "encoding/json", "jsonrpc.Dial": "net/rpc/jsonrpc", "jsonrpc.NewClient": "net/rpc/jsonrpc", "jsonrpc.NewClientCodec": "net/rpc/jsonrpc", "jsonrpc.NewServerCodec": "net/rpc/jsonrpc", "jsonrpc.ServeConn": "net/rpc/jsonrpc", "list.Element": "container/list", "list.List": "container/list", "list.New": "container/list", "log.Fatal": "log", "log.Fatalf": "log", "log.Fatalln": "log", "log.Flags": "log", "log.LUTC": "log", "log.Ldate": "log", "log.Llongfile": "log", "log.Lmicroseconds": "log", "log.Logger": "log", "log.Lshortfile": "log", "log.LstdFlags": "log", "log.Ltime": "log", "log.New": "log", "log.Output": "log", "log.Panic": "log", "log.Panicf": "log", "log.Panicln": "log", "log.Prefix": "log", "log.Print": "log", "log.Printf": "log", "log.Println": "log", "log.SetFlags": "log", "log.SetOutput": "log", "log.SetPrefix": "log", "lzw.LSB": "compress/lzw", "lzw.MSB": "compress/lzw", "lzw.NewReader": "compress/lzw", "lzw.NewWriter": "compress/lzw", "lzw.Order": "compress/lzw", "macho.Cpu": "debug/macho", "macho.Cpu386": "debug/macho", "macho.CpuAmd64": "debug/macho", "macho.CpuArm": "debug/macho", "macho.CpuPpc": "debug/macho", "macho.CpuPpc64": "debug/macho", "macho.Dylib": "debug/macho", "macho.DylibCmd": "debug/macho", "macho.Dysymtab": "debug/macho", "macho.DysymtabCmd": "debug/macho", "macho.ErrNotFat": "debug/macho", "macho.FatArch": "debug/macho", "macho.FatArchHeader": "debug/macho", "macho.FatFile": "debug/macho", "macho.File": "debug/macho", "macho.FileHeader": "debug/macho", "macho.FormatError": "debug/macho", "macho.Load": "debug/macho", "macho.LoadBytes": "debug/macho", "macho.LoadCmd": "debug/macho", "macho.LoadCmdDylib": "debug/macho", "macho.LoadCmdDylinker": "debug/macho", "macho.LoadCmdDysymtab": "debug/macho", "macho.LoadCmdSegment": "debug/macho", "macho.LoadCmdSegment64": "debug/macho", "macho.LoadCmdSymtab": "debug/macho", "macho.LoadCmdThread": "debug/macho", "macho.LoadCmdUnixThread": "debug/macho", "macho.Magic32": "debug/macho", "macho.Magic64": "debug/macho", "macho.MagicFat": "debug/macho", "macho.NewFatFile": "debug/macho", "macho.NewFile": "debug/macho", "macho.Nlist32": "debug/macho", "macho.Nlist64": "debug/macho", "macho.Open": "debug/macho", "macho.OpenFat": "debug/macho", "macho.Regs386": "debug/macho", "macho.RegsAMD64": "debug/macho", "macho.Section": "debug/macho", "macho.Section32": "debug/macho", "macho.Section64": "debug/macho", "macho.SectionHeader": "debug/macho", "macho.Segment": "debug/macho", "macho.Segment32": "debug/macho", "macho.Segment64": "debug/macho", "macho.SegmentHeader": "debug/macho", "macho.Symbol": "debug/macho", "macho.Symtab": "debug/macho", "macho.SymtabCmd": "debug/macho", "macho.Thread": "debug/macho", "macho.Type": "debug/macho", "macho.TypeBundle": "debug/macho", "macho.TypeDylib": "debug/macho", "macho.TypeExec": "debug/macho", "macho.TypeObj": "debug/macho", "mail.Address": "net/mail", "mail.AddressParser": "net/mail", "mail.ErrHeaderNotPresent": "net/mail", "mail.Header": "net/mail", "mail.Message": "net/mail", "mail.ParseAddress": "net/mail", "mail.ParseAddressList": "net/mail", "mail.ReadMessage": "net/mail", "math.Abs": "math", "math.Acos": "math", "math.Acosh": "math", "math.Asin": "math", "math.Asinh": "math", "math.Atan": "math", "math.Atan2": "math", "math.Atanh": "math", "math.Cbrt": "math", "math.Ceil": "math", "math.Copysign": "math", "math.Cos": "math", "math.Cosh": "math", "math.Dim": "math", "math.E": "math", "math.Erf": "math", "math.Erfc": "math", "math.Exp": "math", "math.Exp2": "math", "math.Expm1": "math", "math.Float32bits": "math", "math.Float32frombits": "math", "math.Float64bits": "math", "math.Float64frombits": "math", "math.Floor": "math", "math.Frexp": "math", "math.Gamma": "math", "math.Hypot": "math", "math.Ilogb": "math", "math.Inf": "math", "math.IsInf": "math", "math.IsNaN": "math", "math.J0": "math", "math.J1": "math", "math.Jn": "math", "math.Ldexp": "math", "math.Lgamma": "math", "math.Ln10": "math", "math.Ln2": "math", "math.Log": "math", "math.Log10": "math", "math.Log10E": "math", "math.Log1p": "math", "math.Log2": "math", "math.Log2E": "math", "math.Logb": "math", "math.Max": "math", "math.MaxFloat32": "math", "math.MaxFloat64": "math", "math.MaxInt16": "math", "math.MaxInt32": "math", "math.MaxInt64": "math", "math.MaxInt8": "math", "math.MaxUint16": "math", "math.MaxUint32": "math", "math.MaxUint64": "math", "math.MaxUint8": "math", "math.Min": "math", "math.MinInt16": "math", "math.MinInt32": "math", "math.MinInt64": "math", "math.MinInt8": "math", "math.Mod": "math", "math.Modf": "math", "math.NaN": "math", "math.Nextafter": "math", "math.Nextafter32": "math", "math.Phi": "math", "math.Pi": "math", "math.Pow": "math", "math.Pow10": "math", "math.Remainder": "math", "math.Signbit": "math", "math.Sin": "math", "math.Sincos": "math", "math.Sinh": "math", "math.SmallestNonzeroFloat32": "math", "math.SmallestNonzeroFloat64": "math", "math.Sqrt": "math", "math.Sqrt2": "math", "math.SqrtE": "math", "math.SqrtPhi": "math", "math.SqrtPi": "math", "math.Tan": "math", "math.Tanh": "math", "math.Trunc": "math", "math.Y0": "math", "math.Y1": "math", "math.Yn": "math", "md5.BlockSize": "crypto/md5", "md5.New": "crypto/md5", "md5.Size": "crypto/md5", "md5.Sum": "crypto/md5", "mime.AddExtensionType": "mime", "mime.BEncoding": "mime", "mime.ExtensionsByType": "mime", "mime.FormatMediaType": "mime", "mime.ParseMediaType": "mime", "mime.QEncoding": "mime", "mime.TypeByExtension": "mime", "mime.WordDecoder": "mime", "mime.WordEncoder": "mime", "multipart.File": "mime/multipart", "multipart.FileHeader": "mime/multipart", "multipart.Form": "mime/multipart", "multipart.NewReader": "mime/multipart", "multipart.NewWriter": "mime/multipart", "multipart.Part": "mime/multipart", "multipart.Reader": "mime/multipart", "multipart.Writer": "mime/multipart", "net.Addr": "net", "net.AddrError": "net", "net.CIDRMask": "net", "net.Conn": "net", "net.DNSConfigError": "net", "net.DNSError": "net", "net.Dial": "net", "net.DialIP": "net", "net.DialTCP": "net", "net.DialTimeout": "net", "net.DialUDP": "net", "net.DialUnix": "net", "net.Dialer": "net", "net.ErrWriteToConnected": "net", "net.Error": "net", "net.FileConn": "net", "net.FileListener": "net", "net.FilePacketConn": "net", "net.FlagBroadcast": "net", "net.FlagLoopback": "net", "net.FlagMulticast": "net", "net.FlagPointToPoint": "net", "net.FlagUp": "net", "net.Flags": "net", "net.HardwareAddr": "net", "net.IP": "net", "net.IPAddr": "net", "net.IPConn": "net", "net.IPMask": "net", "net.IPNet": "net", "net.IPv4": "net", "net.IPv4Mask": "net", "net.IPv4allrouter": "net", "net.IPv4allsys": "net", "net.IPv4bcast": "net", "net.IPv4len": "net", "net.IPv4zero": "net", "net.IPv6interfacelocalallnodes": "net", "net.IPv6len": "net", "net.IPv6linklocalallnodes": "net", "net.IPv6linklocalallrouters": "net", "net.IPv6loopback": "net", "net.IPv6unspecified": "net", "net.IPv6zero": "net", "net.Interface": "net", "net.InterfaceAddrs": "net", "net.InterfaceByIndex": "net", "net.InterfaceByName": "net", "net.Interfaces": "net", "net.InvalidAddrError": "net", "net.JoinHostPort": "net", "net.Listen": "net", "net.ListenIP": "net", "net.ListenMulticastUDP": "net", "net.ListenPacket": "net", "net.ListenTCP": "net", "net.ListenUDP": "net", "net.ListenUnix": "net", "net.ListenUnixgram": "net", "net.Listener": "net", "net.LookupAddr": "net", "net.LookupCNAME": "net", "net.LookupHost": "net", "net.LookupIP": "net", "net.LookupMX": "net", "net.LookupNS": "net", "net.LookupPort": "net", "net.LookupSRV": "net", "net.LookupTXT": "net", "net.MX": "net", "net.NS": "net", "net.OpError": "net", "net.PacketConn": "net", "net.ParseCIDR": "net", "net.ParseError": "net", "net.ParseIP": "net", "net.ParseMAC": "net", "net.Pipe": "net", "net.ResolveIPAddr": "net", "net.ResolveTCPAddr": "net", "net.ResolveUDPAddr": "net", "net.ResolveUnixAddr": "net", "net.SRV": "net", "net.SplitHostPort": "net", "net.TCPAddr": "net", "net.TCPConn": "net", "net.TCPListener": "net", "net.UDPAddr": "net", "net.UDPConn": "net", "net.UnixAddr": "net", "net.UnixConn": "net", "net.UnixListener": "net", "net.UnknownNetworkError": "net", "os.Args": "os", "os.Chdir": "os", "os.Chmod": "os", "os.Chown": "os", "os.Chtimes": "os", "os.Clearenv": "os", "os.Create": "os", "os.DevNull": "os", "os.Environ": "os", "os.ErrExist": "os", "os.ErrInvalid": "os", "os.ErrNotExist": "os", "os.ErrPermission": "os", "os.Exit": "os", "os.Expand": "os", "os.ExpandEnv": "os", "os.File": "os", "os.FileInfo": "os", "os.FileMode": "os", "os.FindProcess": "os", "os.Getegid": "os", "os.Getenv": "os", "os.Geteuid": "os", "os.Getgid": "os", "os.Getgroups": "os", "os.Getpagesize": "os", "os.Getpid": "os", "os.Getppid": "os", "os.Getuid": "os", "os.Getwd": "os", "os.Hostname": "os", "os.Interrupt": "os", "os.IsExist": "os", "os.IsNotExist": "os", "os.IsPathSeparator": "os", "os.IsPermission": "os", "os.Kill": "os", "os.Lchown": "os", "os.Link": "os", "os.LinkError": "os", "os.LookupEnv": "os", "os.Lstat": "os", "os.Mkdir": "os", "os.MkdirAll": "os", "os.ModeAppend": "os", "os.ModeCharDevice": "os", "os.ModeDevice": "os", "os.ModeDir": "os", "os.ModeExclusive": "os", "os.ModeNamedPipe": "os", "os.ModePerm": "os", "os.ModeSetgid": "os", "os.ModeSetuid": "os", "os.ModeSocket": "os", "os.ModeSticky": "os", "os.ModeSymlink": "os", "os.ModeTemporary": "os", "os.ModeType": "os", "os.NewFile": "os", "os.NewSyscallError": "os", "os.O_APPEND": "os", "os.O_CREATE": "os", "os.O_EXCL": "os", "os.O_RDONLY": "os", "os.O_RDWR": "os", "os.O_SYNC": "os", "os.O_TRUNC": "os", "os.O_WRONLY": "os", "os.Open": "os", "os.OpenFile": "os", "os.PathError": "os", "os.PathListSeparator": "os", "os.PathSeparator": "os", "os.Pipe": "os", "os.ProcAttr": "os", "os.Process": "os", "os.ProcessState": "os", "os.Readlink": "os", "os.Remove": "os", "os.RemoveAll": "os", "os.Rename": "os", "os.SEEK_CUR": "os", "os.SEEK_END": "os", "os.SEEK_SET": "os", "os.SameFile": "os", "os.Setenv": "os", "os.Signal": "os", "os.StartProcess": "os", "os.Stat": "os", "os.Stderr": "os", "os.Stdin": "os", "os.Stdout": "os", "os.Symlink": "os", "os.SyscallError": "os", "os.TempDir": "os", "os.Truncate": "os", "os.Unsetenv": "os", "palette.Plan9": "image/color/palette", "palette.WebSafe": "image/color/palette", "parse.ActionNode": "text/template/parse", "parse.BoolNode": "text/template/parse", "parse.BranchNode": "text/template/parse", "parse.ChainNode": "text/template/parse", "parse.CommandNode": "text/template/parse", "parse.DotNode": "text/template/parse", "parse.FieldNode": "text/template/parse", "parse.IdentifierNode": "text/template/parse", "parse.IfNode": "text/template/parse", "parse.IsEmptyTree": "text/template/parse", "parse.ListNode": "text/template/parse", "parse.New": "text/template/parse", "parse.NewIdentifier": "text/template/parse", "parse.NilNode": "text/template/parse", "parse.Node": "text/template/parse", "parse.NodeAction": "text/template/parse", "parse.NodeBool": "text/template/parse", "parse.NodeChain": "text/template/parse", "parse.NodeCommand": "text/template/parse", "parse.NodeDot": "text/template/parse", "parse.NodeField": "text/template/parse", "parse.NodeIdentifier": "text/template/parse", "parse.NodeIf": "text/template/parse", "parse.NodeList": "text/template/parse", "parse.NodeNil": "text/template/parse", "parse.NodeNumber": "text/template/parse", "parse.NodePipe": "text/template/parse", "parse.NodeRange": "text/template/parse", "parse.NodeString": "text/template/parse", "parse.NodeTemplate": "text/template/parse", "parse.NodeText": "text/template/parse", "parse.NodeType": "text/template/parse", "parse.NodeVariable": "text/template/parse", "parse.NodeWith": "text/template/parse", "parse.NumberNode": "text/template/parse", "parse.Parse": "text/template/parse", "parse.PipeNode": "text/template/parse", "parse.Pos": "text/template/parse", "parse.RangeNode": "text/template/parse", "parse.StringNode": "text/template/parse", "parse.TemplateNode": "text/template/parse", "parse.TextNode": "text/template/parse", "parse.Tree": "text/template/parse", "parse.VariableNode": "text/template/parse", "parse.WithNode": "text/template/parse", "parser.AllErrors": "go/parser", "parser.DeclarationErrors": "go/parser", "parser.ImportsOnly": "go/parser", "parser.Mode": "go/parser", "parser.PackageClauseOnly": "go/parser", "parser.ParseComments": "go/parser", "parser.ParseDir": "go/parser", "parser.ParseExpr": "go/parser", "parser.ParseExprFrom": "go/parser", "parser.ParseFile": "go/parser", "parser.SpuriousErrors": "go/parser", "parser.Trace": "go/parser", "path.Base": "path", "path.Clean": "path", "path.Dir": "path", "path.ErrBadPattern": "path", "path.Ext": "path", "path.IsAbs": "path", "path.Join": "path", "path.Match": "path", "path.Split": "path", "pe.COFFSymbol": "debug/pe", "pe.COFFSymbolSize": "debug/pe", "pe.DataDirectory": "debug/pe", "pe.File": "debug/pe", "pe.FileHeader": "debug/pe", "pe.FormatError": "debug/pe", "pe.IMAGE_FILE_MACHINE_AM33": "debug/pe", "pe.IMAGE_FILE_MACHINE_AMD64": "debug/pe", "pe.IMAGE_FILE_MACHINE_ARM": "debug/pe", "pe.IMAGE_FILE_MACHINE_EBC": "debug/pe", "pe.IMAGE_FILE_MACHINE_I386": "debug/pe", "pe.IMAGE_FILE_MACHINE_IA64": "debug/pe", "pe.IMAGE_FILE_MACHINE_M32R": "debug/pe", "pe.IMAGE_FILE_MACHINE_MIPS16": "debug/pe", "pe.IMAGE_FILE_MACHINE_MIPSFPU": "debug/pe", "pe.IMAGE_FILE_MACHINE_MIPSFPU16": "debug/pe", "pe.IMAGE_FILE_MACHINE_POWERPC": "debug/pe", "pe.IMAGE_FILE_MACHINE_POWERPCFP": "debug/pe", "pe.IMAGE_FILE_MACHINE_R4000": "debug/pe", "pe.IMAGE_FILE_MACHINE_SH3": "debug/pe", "pe.IMAGE_FILE_MACHINE_SH3DSP": "debug/pe", "pe.IMAGE_FILE_MACHINE_SH4": "debug/pe", "pe.IMAGE_FILE_MACHINE_SH5": "debug/pe", "pe.IMAGE_FILE_MACHINE_THUMB": "debug/pe", "pe.IMAGE_FILE_MACHINE_UNKNOWN": "debug/pe", "pe.IMAGE_FILE_MACHINE_WCEMIPSV2": "debug/pe", "pe.ImportDirectory": "debug/pe", "pe.NewFile": "debug/pe", "pe.Open": "debug/pe", "pe.OptionalHeader32": "debug/pe", "pe.OptionalHeader64": "debug/pe", "pe.Section": "debug/pe", "pe.SectionHeader": "debug/pe", "pe.SectionHeader32": "debug/pe", "pe.Symbol": "debug/pe", "pem.Block": "encoding/pem", "pem.Decode": "encoding/pem", "pem.Encode": "encoding/pem", "pem.EncodeToMemory": "encoding/pem", "pkix.AlgorithmIdentifier": "crypto/x509/pkix", "pkix.AttributeTypeAndValue": "crypto/x509/pkix", "pkix.AttributeTypeAndValueSET": "crypto/x509/pkix", "pkix.CertificateList": "crypto/x509/pkix", "pkix.Extension": "crypto/x509/pkix", "pkix.Name": "crypto/x509/pkix", "pkix.RDNSequence": "crypto/x509/pkix", "pkix.RelativeDistinguishedNameSET": "crypto/x509/pkix", "pkix.RevokedCertificate": "crypto/x509/pkix", "pkix.TBSCertificateList": "crypto/x509/pkix", "plan9obj.File": "debug/plan9obj", "plan9obj.FileHeader": "debug/plan9obj", "plan9obj.Magic386": "debug/plan9obj", "plan9obj.Magic64": "debug/plan9obj", "plan9obj.MagicAMD64": "debug/plan9obj", "plan9obj.MagicARM": "debug/plan9obj", "plan9obj.NewFile": "debug/plan9obj", "plan9obj.Open": "debug/plan9obj", "plan9obj.Section": "debug/plan9obj", "plan9obj.SectionHeader": "debug/plan9obj", "plan9obj.Sym": "debug/plan9obj", "png.BestCompression": "image/png", "png.BestSpeed": "image/png", "png.CompressionLevel": "image/png", "png.Decode": "image/png", "png.DecodeConfig": "image/png", "png.DefaultCompression": "image/png", "png.Encode": "image/png", "png.Encoder": "image/png", "png.FormatError": "image/png", "png.NoCompression": "image/png", "png.UnsupportedError": "image/png", "pprof.Cmdline": "net/http/pprof", "pprof.Handler": "net/http/pprof", "pprof.Index": "net/http/pprof", "pprof.Lookup": "runtime/pprof", "pprof.NewProfile": "runtime/pprof", // "pprof.Profile" is ambiguous "pprof.Profiles": "runtime/pprof", "pprof.StartCPUProfile": "runtime/pprof", "pprof.StopCPUProfile": "runtime/pprof", "pprof.Symbol": "net/http/pprof", "pprof.Trace": "net/http/pprof", "pprof.WriteHeapProfile": "runtime/pprof", "printer.CommentedNode": "go/printer", "printer.Config": "go/printer", "printer.Fprint": "go/printer", "printer.Mode": "go/printer", "printer.RawFormat": "go/printer", "printer.SourcePos": "go/printer", "printer.TabIndent": "go/printer", "printer.UseSpaces": "go/printer", "quick.Check": "testing/quick", "quick.CheckEqual": "testing/quick", "quick.CheckEqualError": "testing/quick", "quick.CheckError": "testing/quick", "quick.Config": "testing/quick", "quick.Generator": "testing/quick", "quick.SetupError": "testing/quick", "quick.Value": "testing/quick", "quotedprintable.NewReader": "mime/quotedprintable", "quotedprintable.NewWriter": "mime/quotedprintable", "quotedprintable.Reader": "mime/quotedprintable", "quotedprintable.Writer": "mime/quotedprintable", "rand.ExpFloat64": "math/rand", "rand.Float32": "math/rand", "rand.Float64": "math/rand", // "rand.Int" is ambiguous "rand.Int31": "math/rand", "rand.Int31n": "math/rand", "rand.Int63": "math/rand", "rand.Int63n": "math/rand", "rand.Intn": "math/rand", "rand.New": "math/rand", "rand.NewSource": "math/rand", "rand.NewZipf": "math/rand", "rand.NormFloat64": "math/rand", "rand.Perm": "math/rand", "rand.Prime": "crypto/rand", "rand.Rand": "math/rand", // "rand.Read" is ambiguous "rand.Reader": "crypto/rand", "rand.Seed": "math/rand", "rand.Source": "math/rand", "rand.Uint32": "math/rand", "rand.Zipf": "math/rand", "rc4.Cipher": "crypto/rc4", "rc4.KeySizeError": "crypto/rc4", "rc4.NewCipher": "crypto/rc4", "reflect.Append": "reflect", "reflect.AppendSlice": "reflect", "reflect.Array": "reflect", "reflect.ArrayOf": "reflect", "reflect.Bool": "reflect", "reflect.BothDir": "reflect", "reflect.Chan": "reflect", "reflect.ChanDir": "reflect", "reflect.ChanOf": "reflect", "reflect.Complex128": "reflect", "reflect.Complex64": "reflect", "reflect.Copy": "reflect", "reflect.DeepEqual": "reflect", "reflect.Float32": "reflect", "reflect.Float64": "reflect", "reflect.Func": "reflect", "reflect.FuncOf": "reflect", "reflect.Indirect": "reflect", "reflect.Int": "reflect", "reflect.Int16": "reflect", "reflect.Int32": "reflect", "reflect.Int64": "reflect", "reflect.Int8": "reflect", "reflect.Interface": "reflect", "reflect.Invalid": "reflect", "reflect.Kind": "reflect", "reflect.MakeChan": "reflect", "reflect.MakeFunc": "reflect", "reflect.MakeMap": "reflect", "reflect.MakeSlice": "reflect", "reflect.Map": "reflect", "reflect.MapOf": "reflect", "reflect.Method": "reflect", "reflect.New": "reflect", "reflect.NewAt": "reflect", "reflect.Ptr": "reflect", "reflect.PtrTo": "reflect", "reflect.RecvDir": "reflect", "reflect.Select": "reflect", "reflect.SelectCase": "reflect", "reflect.SelectDefault": "reflect", "reflect.SelectDir": "reflect", "reflect.SelectRecv": "reflect", "reflect.SelectSend": "reflect", "reflect.SendDir": "reflect", "reflect.Slice": "reflect", "reflect.SliceHeader": "reflect", "reflect.SliceOf": "reflect", "reflect.String": "reflect", "reflect.StringHeader": "reflect", "reflect.Struct": "reflect", "reflect.StructField": "reflect", "reflect.StructOf": "reflect", "reflect.StructTag": "reflect", "reflect.TypeOf": "reflect", "reflect.Uint": "reflect", "reflect.Uint16": "reflect", "reflect.Uint32": "reflect", "reflect.Uint64": "reflect", "reflect.Uint8": "reflect", "reflect.Uintptr": "reflect", "reflect.UnsafePointer": "reflect", "reflect.Value": "reflect", "reflect.ValueError": "reflect", "reflect.ValueOf": "reflect", "reflect.Zero": "reflect", "regexp.Compile": "regexp", "regexp.CompilePOSIX": "regexp", "regexp.Match": "regexp", "regexp.MatchReader": "regexp", "regexp.MatchString": "regexp", "regexp.MustCompile": "regexp", "regexp.MustCompilePOSIX": "regexp", "regexp.QuoteMeta": "regexp", "regexp.Regexp": "regexp", "ring.New": "container/ring", "ring.Ring": "container/ring", "rpc.Accept": "net/rpc", "rpc.Call": "net/rpc", "rpc.Client": "net/rpc", "rpc.ClientCodec": "net/rpc", "rpc.DefaultDebugPath": "net/rpc", "rpc.DefaultRPCPath": "net/rpc", "rpc.DefaultServer": "net/rpc", "rpc.Dial": "net/rpc", "rpc.DialHTTP": "net/rpc", "rpc.DialHTTPPath": "net/rpc", "rpc.ErrShutdown": "net/rpc", "rpc.HandleHTTP": "net/rpc", "rpc.NewClient": "net/rpc", "rpc.NewClientWithCodec": "net/rpc", "rpc.NewServer": "net/rpc", "rpc.Register": "net/rpc", "rpc.RegisterName": "net/rpc", "rpc.Request": "net/rpc", "rpc.Response": "net/rpc", "rpc.ServeCodec": "net/rpc", "rpc.ServeConn": "net/rpc", "rpc.ServeRequest": "net/rpc", "rpc.Server": "net/rpc", "rpc.ServerCodec": "net/rpc", "rpc.ServerError": "net/rpc", "rsa.CRTValue": "crypto/rsa", "rsa.DecryptOAEP": "crypto/rsa", "rsa.DecryptPKCS1v15": "crypto/rsa", "rsa.DecryptPKCS1v15SessionKey": "crypto/rsa", "rsa.EncryptOAEP": "crypto/rsa", "rsa.EncryptPKCS1v15": "crypto/rsa", "rsa.ErrDecryption": "crypto/rsa", "rsa.ErrMessageTooLong": "crypto/rsa", "rsa.ErrVerification": "crypto/rsa", "rsa.GenerateKey": "crypto/rsa", "rsa.GenerateMultiPrimeKey": "crypto/rsa", "rsa.OAEPOptions": "crypto/rsa", "rsa.PKCS1v15DecryptOptions": "crypto/rsa", "rsa.PSSOptions": "crypto/rsa", "rsa.PSSSaltLengthAuto": "crypto/rsa", "rsa.PSSSaltLengthEqualsHash": "crypto/rsa", "rsa.PrecomputedValues": "crypto/rsa", "rsa.PrivateKey": "crypto/rsa", "rsa.PublicKey": "crypto/rsa", "rsa.SignPKCS1v15": "crypto/rsa", "rsa.SignPSS": "crypto/rsa", "rsa.VerifyPKCS1v15": "crypto/rsa", "rsa.VerifyPSS": "crypto/rsa", "runtime.BlockProfile": "runtime", "runtime.BlockProfileRecord": "runtime", "runtime.Breakpoint": "runtime", "runtime.CPUProfile": "runtime", "runtime.Caller": "runtime", "runtime.Callers": "runtime", "runtime.CallersFrames": "runtime", "runtime.Compiler": "runtime", "runtime.Error": "runtime", "runtime.Frame": "runtime", "runtime.Frames": "runtime", "runtime.Func": "runtime", "runtime.FuncForPC": "runtime", "runtime.GC": "runtime", "runtime.GOARCH": "runtime", "runtime.GOMAXPROCS": "runtime", "runtime.GOOS": "runtime", "runtime.GOROOT": "runtime", "runtime.Goexit": "runtime", "runtime.GoroutineProfile": "runtime", "runtime.Gosched": "runtime", "runtime.KeepAlive": "runtime", "runtime.LockOSThread": "runtime", "runtime.MemProfile": "runtime", "runtime.MemProfileRate": "runtime", "runtime.MemProfileRecord": "runtime", "runtime.MemStats": "runtime", "runtime.NumCPU": "runtime", "runtime.NumCgoCall": "runtime", "runtime.NumGoroutine": "runtime", "runtime.ReadMemStats": "runtime", "runtime.ReadTrace": "runtime", "runtime.SetBlockProfileRate": "runtime", "runtime.SetCPUProfileRate": "runtime", "runtime.SetCgoTraceback": "runtime", "runtime.SetFinalizer": "runtime", "runtime.Stack": "runtime", "runtime.StackRecord": "runtime", "runtime.StartTrace": "runtime", "runtime.StopTrace": "runtime", "runtime.ThreadCreateProfile": "runtime", "runtime.TypeAssertionError": "runtime", "runtime.UnlockOSThread": "runtime", "runtime.Version": "runtime", "scanner.Char": "text/scanner", "scanner.Comment": "text/scanner", "scanner.EOF": "text/scanner", "scanner.Error": "go/scanner", "scanner.ErrorHandler": "go/scanner", "scanner.ErrorList": "go/scanner", "scanner.Float": "text/scanner", "scanner.GoTokens": "text/scanner", "scanner.GoWhitespace": "text/scanner", "scanner.Ident": "text/scanner", "scanner.Int": "text/scanner", "scanner.Mode": "go/scanner", "scanner.Position": "text/scanner", "scanner.PrintError": "go/scanner", "scanner.RawString": "text/scanner", "scanner.ScanChars": "text/scanner", // "scanner.ScanComments" is ambiguous "scanner.ScanFloats": "text/scanner", "scanner.ScanIdents": "text/scanner", "scanner.ScanInts": "text/scanner", "scanner.ScanRawStrings": "text/scanner", "scanner.ScanStrings": "text/scanner", // "scanner.Scanner" is ambiguous "scanner.SkipComments": "text/scanner", "scanner.String": "text/scanner", "scanner.TokenString": "text/scanner", "sha1.BlockSize": "crypto/sha1", "sha1.New": "crypto/sha1", "sha1.Size": "crypto/sha1", "sha1.Sum": "crypto/sha1", "sha256.BlockSize": "crypto/sha256", "sha256.New": "crypto/sha256", "sha256.New224": "crypto/sha256", "sha256.Size": "crypto/sha256", "sha256.Size224": "crypto/sha256", "sha256.Sum224": "crypto/sha256", "sha256.Sum256": "crypto/sha256", "sha512.BlockSize": "crypto/sha512", "sha512.New": "crypto/sha512", "sha512.New384": "crypto/sha512", "sha512.New512_224": "crypto/sha512", "sha512.New512_256": "crypto/sha512", "sha512.Size": "crypto/sha512", "sha512.Size224": "crypto/sha512", "sha512.Size256": "crypto/sha512", "sha512.Size384": "crypto/sha512", "sha512.Sum384": "crypto/sha512", "sha512.Sum512": "crypto/sha512", "sha512.Sum512_224": "crypto/sha512", "sha512.Sum512_256": "crypto/sha512", "signal.Ignore": "os/signal", "signal.Notify": "os/signal", "signal.Reset": "os/signal", "signal.Stop": "os/signal", "smtp.Auth": "net/smtp", "smtp.CRAMMD5Auth": "net/smtp", "smtp.Client": "net/smtp", "smtp.Dial": "net/smtp", "smtp.NewClient": "net/smtp", "smtp.PlainAuth": "net/smtp", "smtp.SendMail": "net/smtp", "smtp.ServerInfo": "net/smtp", "sort.Float64Slice": "sort", "sort.Float64s": "sort", "sort.Float64sAreSorted": "sort", "sort.IntSlice": "sort", "sort.Interface": "sort", "sort.Ints": "sort", "sort.IntsAreSorted": "sort", "sort.IsSorted": "sort", "sort.Reverse": "sort", "sort.Search": "sort", "sort.SearchFloat64s": "sort", "sort.SearchInts": "sort", "sort.SearchStrings": "sort", "sort.Sort": "sort", "sort.Stable": "sort", "sort.StringSlice": "sort", "sort.Strings": "sort", "sort.StringsAreSorted": "sort", "sql.DB": "database/sql", "sql.DBStats": "database/sql", "sql.Drivers": "database/sql", "sql.ErrNoRows": "database/sql", "sql.ErrTxDone": "database/sql", "sql.NullBool": "database/sql", "sql.NullFloat64": "database/sql", "sql.NullInt64": "database/sql", "sql.NullString": "database/sql", "sql.Open": "database/sql", "sql.RawBytes": "database/sql", "sql.Register": "database/sql", "sql.Result": "database/sql", "sql.Row": "database/sql", "sql.Rows": "database/sql", "sql.Scanner": "database/sql", "sql.Stmt": "database/sql", "sql.Tx": "database/sql", "strconv.AppendBool": "strconv", "strconv.AppendFloat": "strconv", "strconv.AppendInt": "strconv", "strconv.AppendQuote": "strconv", "strconv.AppendQuoteRune": "strconv", "strconv.AppendQuoteRuneToASCII": "strconv", "strconv.AppendQuoteRuneToGraphic": "strconv", "strconv.AppendQuoteToASCII": "strconv", "strconv.AppendQuoteToGraphic": "strconv", "strconv.AppendUint": "strconv", "strconv.Atoi": "strconv", "strconv.CanBackquote": "strconv", "strconv.ErrRange": "strconv", "strconv.ErrSyntax": "strconv", "strconv.FormatBool": "strconv", "strconv.FormatFloat": "strconv", "strconv.FormatInt": "strconv", "strconv.FormatUint": "strconv", "strconv.IntSize": "strconv", "strconv.IsGraphic": "strconv", "strconv.IsPrint": "strconv", "strconv.Itoa": "strconv", "strconv.NumError": "strconv", "strconv.ParseBool": "strconv", "strconv.ParseFloat": "strconv", "strconv.ParseInt": "strconv", "strconv.ParseUint": "strconv", "strconv.Quote": "strconv", "strconv.QuoteRune": "strconv", "strconv.QuoteRuneToASCII": "strconv", "strconv.QuoteRuneToGraphic": "strconv", "strconv.QuoteToASCII": "strconv", "strconv.QuoteToGraphic": "strconv", "strconv.Unquote": "strconv", "strconv.UnquoteChar": "strconv", "strings.Compare": "strings", "strings.Contains": "strings", "strings.ContainsAny": "strings", "strings.ContainsRune": "strings", "strings.Count": "strings", "strings.EqualFold": "strings", "strings.Fields": "strings", "strings.FieldsFunc": "strings", "strings.HasPrefix": "strings", "strings.HasSuffix": "strings", "strings.Index": "strings", "strings.IndexAny": "strings", "strings.IndexByte": "strings", "strings.IndexFunc": "strings", "strings.IndexRune": "strings", "strings.Join": "strings", "strings.LastIndex": "strings", "strings.LastIndexAny": "strings", "strings.LastIndexByte": "strings", "strings.LastIndexFunc": "strings", "strings.Map": "strings", "strings.NewReader": "strings", "strings.NewReplacer": "strings", "strings.Reader": "strings", "strings.Repeat": "strings", "strings.Replace": "strings", "strings.Replacer": "strings", "strings.Split": "strings", "strings.SplitAfter": "strings", "strings.SplitAfterN": "strings", "strings.SplitN": "strings", "strings.Title": "strings", "strings.ToLower": "strings", "strings.ToLowerSpecial": "strings", "strings.ToTitle": "strings", "strings.ToTitleSpecial": "strings", "strings.ToUpper": "strings", "strings.ToUpperSpecial": "strings", "strings.Trim": "strings", "strings.TrimFunc": "strings", "strings.TrimLeft": "strings", "strings.TrimLeftFunc": "strings", "strings.TrimPrefix": "strings", "strings.TrimRight": "strings", "strings.TrimRightFunc": "strings", "strings.TrimSpace": "strings", "strings.TrimSuffix": "strings", "subtle.ConstantTimeByteEq": "crypto/subtle", "subtle.ConstantTimeCompare": "crypto/subtle", "subtle.ConstantTimeCopy": "crypto/subtle", "subtle.ConstantTimeEq": "crypto/subtle", "subtle.ConstantTimeLessOrEq": "crypto/subtle", "subtle.ConstantTimeSelect": "crypto/subtle", "suffixarray.Index": "index/suffixarray", "suffixarray.New": "index/suffixarray", "sync.Cond": "sync", "sync.Locker": "sync", "sync.Mutex": "sync", "sync.NewCond": "sync", "sync.Once": "sync", "sync.Pool": "sync", "sync.RWMutex": "sync", "sync.WaitGroup": "sync", "syntax.ClassNL": "regexp/syntax", "syntax.Compile": "regexp/syntax", "syntax.DotNL": "regexp/syntax", "syntax.EmptyBeginLine": "regexp/syntax", "syntax.EmptyBeginText": "regexp/syntax", "syntax.EmptyEndLine": "regexp/syntax", "syntax.EmptyEndText": "regexp/syntax", "syntax.EmptyNoWordBoundary": "regexp/syntax", "syntax.EmptyOp": "regexp/syntax", "syntax.EmptyOpContext": "regexp/syntax", "syntax.EmptyWordBoundary": "regexp/syntax", "syntax.ErrInternalError": "regexp/syntax", "syntax.ErrInvalidCharClass": "regexp/syntax", "syntax.ErrInvalidCharRange": "regexp/syntax", "syntax.ErrInvalidEscape": "regexp/syntax", "syntax.ErrInvalidNamedCapture": "regexp/syntax", "syntax.ErrInvalidPerlOp": "regexp/syntax", "syntax.ErrInvalidRepeatOp": "regexp/syntax", "syntax.ErrInvalidRepeatSize": "regexp/syntax", "syntax.ErrInvalidUTF8": "regexp/syntax", "syntax.ErrMissingBracket": "regexp/syntax", "syntax.ErrMissingParen": "regexp/syntax", "syntax.ErrMissingRepeatArgument": "regexp/syntax", "syntax.ErrTrailingBackslash": "regexp/syntax", "syntax.ErrUnexpectedParen": "regexp/syntax", "syntax.Error": "regexp/syntax", "syntax.ErrorCode": "regexp/syntax", "syntax.Flags": "regexp/syntax", "syntax.FoldCase": "regexp/syntax", "syntax.Inst": "regexp/syntax", "syntax.InstAlt": "regexp/syntax", "syntax.InstAltMatch": "regexp/syntax", "syntax.InstCapture": "regexp/syntax", "syntax.InstEmptyWidth": "regexp/syntax", "syntax.InstFail": "regexp/syntax", "syntax.InstMatch": "regexp/syntax", "syntax.InstNop": "regexp/syntax", "syntax.InstOp": "regexp/syntax", "syntax.InstRune": "regexp/syntax", "syntax.InstRune1": "regexp/syntax", "syntax.InstRuneAny": "regexp/syntax", "syntax.InstRuneAnyNotNL": "regexp/syntax", "syntax.IsWordChar": "regexp/syntax", "syntax.Literal": "regexp/syntax", "syntax.MatchNL": "regexp/syntax", "syntax.NonGreedy": "regexp/syntax", "syntax.OneLine": "regexp/syntax", "syntax.Op": "regexp/syntax", "syntax.OpAlternate": "regexp/syntax", "syntax.OpAnyChar": "regexp/syntax", "syntax.OpAnyCharNotNL": "regexp/syntax", "syntax.OpBeginLine": "regexp/syntax", "syntax.OpBeginText": "regexp/syntax", "syntax.OpCapture": "regexp/syntax", "syntax.OpCharClass": "regexp/syntax", "syntax.OpConcat": "regexp/syntax", "syntax.OpEmptyMatch": "regexp/syntax", "syntax.OpEndLine": "regexp/syntax", "syntax.OpEndText": "regexp/syntax", "syntax.OpLiteral": "regexp/syntax", "syntax.OpNoMatch": "regexp/syntax", "syntax.OpNoWordBoundary": "regexp/syntax", "syntax.OpPlus": "regexp/syntax", "syntax.OpQuest": "regexp/syntax", "syntax.OpRepeat": "regexp/syntax", "syntax.OpStar": "regexp/syntax", "syntax.OpWordBoundary": "regexp/syntax", "syntax.POSIX": "regexp/syntax", "syntax.Parse": "regexp/syntax", "syntax.Perl": "regexp/syntax", "syntax.PerlX": "regexp/syntax", "syntax.Prog": "regexp/syntax", "syntax.Regexp": "regexp/syntax", "syntax.Simple": "regexp/syntax", "syntax.UnicodeGroups": "regexp/syntax", "syntax.WasDollar": "regexp/syntax", "syscall.AF_ALG": "syscall", "syscall.AF_APPLETALK": "syscall", "syscall.AF_ARP": "syscall", "syscall.AF_ASH": "syscall", "syscall.AF_ATM": "syscall", "syscall.AF_ATMPVC": "syscall", "syscall.AF_ATMSVC": "syscall", "syscall.AF_AX25": "syscall", "syscall.AF_BLUETOOTH": "syscall", "syscall.AF_BRIDGE": "syscall", "syscall.AF_CAIF": "syscall", "syscall.AF_CAN": "syscall", "syscall.AF_CCITT": "syscall", "syscall.AF_CHAOS": "syscall", "syscall.AF_CNT": "syscall", "syscall.AF_COIP": "syscall", "syscall.AF_DATAKIT": "syscall", "syscall.AF_DECnet": "syscall", "syscall.AF_DLI": "syscall", "syscall.AF_E164": "syscall", "syscall.AF_ECMA": "syscall", "syscall.AF_ECONET": "syscall", "syscall.AF_ENCAP": "syscall", "syscall.AF_FILE": "syscall", "syscall.AF_HYLINK": "syscall", "syscall.AF_IEEE80211": "syscall", "syscall.AF_IEEE802154": "syscall", "syscall.AF_IMPLINK": "syscall", "syscall.AF_INET": "syscall", "syscall.AF_INET6": "syscall", "syscall.AF_INET6_SDP": "syscall", "syscall.AF_INET_SDP": "syscall", "syscall.AF_IPX": "syscall", "syscall.AF_IRDA": "syscall", "syscall.AF_ISDN": "syscall", "syscall.AF_ISO": "syscall", "syscall.AF_IUCV": "syscall", "syscall.AF_KEY": "syscall", "syscall.AF_LAT": "syscall", "syscall.AF_LINK": "syscall", "syscall.AF_LLC": "syscall", "syscall.AF_LOCAL": "syscall", "syscall.AF_MAX": "syscall", "syscall.AF_MPLS": "syscall", "syscall.AF_NATM": "syscall", "syscall.AF_NDRV": "syscall", "syscall.AF_NETBEUI": "syscall", "syscall.AF_NETBIOS": "syscall", "syscall.AF_NETGRAPH": "syscall", "syscall.AF_NETLINK": "syscall", "syscall.AF_NETROM": "syscall", "syscall.AF_NS": "syscall", "syscall.AF_OROUTE": "syscall", "syscall.AF_OSI": "syscall", "syscall.AF_PACKET": "syscall", "syscall.AF_PHONET": "syscall", "syscall.AF_PPP": "syscall", "syscall.AF_PPPOX": "syscall", "syscall.AF_PUP": "syscall", "syscall.AF_RDS": "syscall", "syscall.AF_RESERVED_36": "syscall", "syscall.AF_ROSE": "syscall", "syscall.AF_ROUTE": "syscall", "syscall.AF_RXRPC": "syscall", "syscall.AF_SCLUSTER": "syscall", "syscall.AF_SECURITY": "syscall", "syscall.AF_SIP": "syscall", "syscall.AF_SLOW": "syscall", "syscall.AF_SNA": "syscall", "syscall.AF_SYSTEM": "syscall", "syscall.AF_TIPC": "syscall", "syscall.AF_UNIX": "syscall", "syscall.AF_UNSPEC": "syscall", "syscall.AF_VENDOR00": "syscall", "syscall.AF_VENDOR01": "syscall", "syscall.AF_VENDOR02": "syscall", "syscall.AF_VENDOR03": "syscall", "syscall.AF_VENDOR04": "syscall", "syscall.AF_VENDOR05": "syscall", "syscall.AF_VENDOR06": "syscall", "syscall.AF_VENDOR07": "syscall", "syscall.AF_VENDOR08": "syscall", "syscall.AF_VENDOR09": "syscall", "syscall.AF_VENDOR10": "syscall", "syscall.AF_VENDOR11": "syscall", "syscall.AF_VENDOR12": "syscall", "syscall.AF_VENDOR13": "syscall", "syscall.AF_VENDOR14": "syscall", "syscall.AF_VENDOR15": "syscall", "syscall.AF_VENDOR16": "syscall", "syscall.AF_VENDOR17": "syscall", "syscall.AF_VENDOR18": "syscall", "syscall.AF_VENDOR19": "syscall", "syscall.AF_VENDOR20": "syscall", "syscall.AF_VENDOR21": "syscall", "syscall.AF_VENDOR22": "syscall", "syscall.AF_VENDOR23": "syscall", "syscall.AF_VENDOR24": "syscall", "syscall.AF_VENDOR25": "syscall", "syscall.AF_VENDOR26": "syscall", "syscall.AF_VENDOR27": "syscall", "syscall.AF_VENDOR28": "syscall", "syscall.AF_VENDOR29": "syscall", "syscall.AF_VENDOR30": "syscall", "syscall.AF_VENDOR31": "syscall", "syscall.AF_VENDOR32": "syscall", "syscall.AF_VENDOR33": "syscall", "syscall.AF_VENDOR34": "syscall", "syscall.AF_VENDOR35": "syscall", "syscall.AF_VENDOR36": "syscall", "syscall.AF_VENDOR37": "syscall", "syscall.AF_VENDOR38": "syscall", "syscall.AF_VENDOR39": "syscall", "syscall.AF_VENDOR40": "syscall", "syscall.AF_VENDOR41": "syscall", "syscall.AF_VENDOR42": "syscall", "syscall.AF_VENDOR43": "syscall", "syscall.AF_VENDOR44": "syscall", "syscall.AF_VENDOR45": "syscall", "syscall.AF_VENDOR46": "syscall", "syscall.AF_VENDOR47": "syscall", "syscall.AF_WANPIPE": "syscall", "syscall.AF_X25": "syscall", "syscall.AI_CANONNAME": "syscall", "syscall.AI_NUMERICHOST": "syscall", "syscall.AI_PASSIVE": "syscall", "syscall.APPLICATION_ERROR": "syscall", "syscall.ARPHRD_ADAPT": "syscall", "syscall.ARPHRD_APPLETLK": "syscall", "syscall.ARPHRD_ARCNET": "syscall", "syscall.ARPHRD_ASH": "syscall", "syscall.ARPHRD_ATM": "syscall", "syscall.ARPHRD_AX25": "syscall", "syscall.ARPHRD_BIF": "syscall", "syscall.ARPHRD_CHAOS": "syscall", "syscall.ARPHRD_CISCO": "syscall", "syscall.ARPHRD_CSLIP": "syscall", "syscall.ARPHRD_CSLIP6": "syscall", "syscall.ARPHRD_DDCMP": "syscall", "syscall.ARPHRD_DLCI": "syscall", "syscall.ARPHRD_ECONET": "syscall", "syscall.ARPHRD_EETHER": "syscall", "syscall.ARPHRD_ETHER": "syscall", "syscall.ARPHRD_EUI64": "syscall", "syscall.ARPHRD_FCAL": "syscall", "syscall.ARPHRD_FCFABRIC": "syscall", "syscall.ARPHRD_FCPL": "syscall", "syscall.ARPHRD_FCPP": "syscall", "syscall.ARPHRD_FDDI": "syscall", "syscall.ARPHRD_FRAD": "syscall", "syscall.ARPHRD_FRELAY": "syscall", "syscall.ARPHRD_HDLC": "syscall", "syscall.ARPHRD_HIPPI": "syscall", "syscall.ARPHRD_HWX25": "syscall", "syscall.ARPHRD_IEEE1394": "syscall", "syscall.ARPHRD_IEEE802": "syscall", "syscall.ARPHRD_IEEE80211": "syscall", "syscall.ARPHRD_IEEE80211_PRISM": "syscall", "syscall.ARPHRD_IEEE80211_RADIOTAP": "syscall", "syscall.ARPHRD_IEEE802154": "syscall", "syscall.ARPHRD_IEEE802154_PHY": "syscall", "syscall.ARPHRD_IEEE802_TR": "syscall", "syscall.ARPHRD_INFINIBAND": "syscall", "syscall.ARPHRD_IPDDP": "syscall", "syscall.ARPHRD_IPGRE": "syscall", "syscall.ARPHRD_IRDA": "syscall", "syscall.ARPHRD_LAPB": "syscall", "syscall.ARPHRD_LOCALTLK": "syscall", "syscall.ARPHRD_LOOPBACK": "syscall", "syscall.ARPHRD_METRICOM": "syscall", "syscall.ARPHRD_NETROM": "syscall", "syscall.ARPHRD_NONE": "syscall", "syscall.ARPHRD_PIMREG": "syscall", "syscall.ARPHRD_PPP": "syscall", "syscall.ARPHRD_PRONET": "syscall", "syscall.ARPHRD_RAWHDLC": "syscall", "syscall.ARPHRD_ROSE": "syscall", "syscall.ARPHRD_RSRVD": "syscall", "syscall.ARPHRD_SIT": "syscall", "syscall.ARPHRD_SKIP": "syscall", "syscall.ARPHRD_SLIP": "syscall", "syscall.ARPHRD_SLIP6": "syscall", "syscall.ARPHRD_STRIP": "syscall", "syscall.ARPHRD_TUNNEL": "syscall", "syscall.ARPHRD_TUNNEL6": "syscall", "syscall.ARPHRD_VOID": "syscall", "syscall.ARPHRD_X25": "syscall", "syscall.AUTHTYPE_CLIENT": "syscall", "syscall.AUTHTYPE_SERVER": "syscall", "syscall.Accept": "syscall", "syscall.Accept4": "syscall", "syscall.AcceptEx": "syscall", "syscall.Access": "syscall", "syscall.Acct": "syscall", "syscall.AddrinfoW": "syscall", "syscall.Adjtime": "syscall", "syscall.Adjtimex": "syscall", "syscall.AttachLsf": "syscall", "syscall.B0": "syscall", "syscall.B1000000": "syscall", "syscall.B110": "syscall", "syscall.B115200": "syscall", "syscall.B1152000": "syscall", "syscall.B1200": "syscall", "syscall.B134": "syscall", "syscall.B14400": "syscall", "syscall.B150": "syscall", "syscall.B1500000": "syscall", "syscall.B1800": "syscall", "syscall.B19200": "syscall", "syscall.B200": "syscall", "syscall.B2000000": "syscall", "syscall.B230400": "syscall", "syscall.B2400": "syscall", "syscall.B2500000": "syscall", "syscall.B28800": "syscall", "syscall.B300": "syscall", "syscall.B3000000": "syscall", "syscall.B3500000": "syscall", "syscall.B38400": "syscall", "syscall.B4000000": "syscall", "syscall.B460800": "syscall", "syscall.B4800": "syscall", "syscall.B50": "syscall", "syscall.B500000": "syscall", "syscall.B57600": "syscall", "syscall.B576000": "syscall", "syscall.B600": "syscall", "syscall.B7200": "syscall", "syscall.B75": "syscall", "syscall.B76800": "syscall", "syscall.B921600": "syscall", "syscall.B9600": "syscall", "syscall.BASE_PROTOCOL": "syscall", "syscall.BIOCFEEDBACK": "syscall", "syscall.BIOCFLUSH": "syscall", "syscall.BIOCGBLEN": "syscall", "syscall.BIOCGDIRECTION": "syscall", "syscall.BIOCGDIRFILT": "syscall", "syscall.BIOCGDLT": "syscall", "syscall.BIOCGDLTLIST": "syscall", "syscall.BIOCGETBUFMODE": "syscall", "syscall.BIOCGETIF": "syscall", "syscall.BIOCGETZMAX": "syscall", "syscall.BIOCGFEEDBACK": "syscall", "syscall.BIOCGFILDROP": "syscall", "syscall.BIOCGHDRCMPLT": "syscall", "syscall.BIOCGRSIG": "syscall", "syscall.BIOCGRTIMEOUT": "syscall", "syscall.BIOCGSEESENT": "syscall", "syscall.BIOCGSTATS": "syscall", "syscall.BIOCGSTATSOLD": "syscall", "syscall.BIOCGTSTAMP": "syscall", "syscall.BIOCIMMEDIATE": "syscall", "syscall.BIOCLOCK": "syscall", "syscall.BIOCPROMISC": "syscall", "syscall.BIOCROTZBUF": "syscall", "syscall.BIOCSBLEN": "syscall", "syscall.BIOCSDIRECTION": "syscall", "syscall.BIOCSDIRFILT": "syscall", "syscall.BIOCSDLT": "syscall", "syscall.BIOCSETBUFMODE": "syscall", "syscall.BIOCSETF": "syscall", "syscall.BIOCSETFNR": "syscall", "syscall.BIOCSETIF": "syscall", "syscall.BIOCSETWF": "syscall", "syscall.BIOCSETZBUF": "syscall", "syscall.BIOCSFEEDBACK": "syscall", "syscall.BIOCSFILDROP": "syscall", "syscall.BIOCSHDRCMPLT": "syscall", "syscall.BIOCSRSIG": "syscall", "syscall.BIOCSRTIMEOUT": "syscall", "syscall.BIOCSSEESENT": "syscall", "syscall.BIOCSTCPF": "syscall", "syscall.BIOCSTSTAMP": "syscall", "syscall.BIOCSUDPF": "syscall", "syscall.BIOCVERSION": "syscall", "syscall.BPF_A": "syscall", "syscall.BPF_ABS": "syscall", "syscall.BPF_ADD": "syscall", "syscall.BPF_ALIGNMENT": "syscall", "syscall.BPF_ALIGNMENT32": "syscall", "syscall.BPF_ALU": "syscall", "syscall.BPF_AND": "syscall", "syscall.BPF_B": "syscall", "syscall.BPF_BUFMODE_BUFFER": "syscall", "syscall.BPF_BUFMODE_ZBUF": "syscall", "syscall.BPF_DFLTBUFSIZE": "syscall", "syscall.BPF_DIRECTION_IN": "syscall", "syscall.BPF_DIRECTION_OUT": "syscall", "syscall.BPF_DIV": "syscall", "syscall.BPF_H": "syscall", "syscall.BPF_IMM": "syscall", "syscall.BPF_IND": "syscall", "syscall.BPF_JA": "syscall", "syscall.BPF_JEQ": "syscall", "syscall.BPF_JGE": "syscall", "syscall.BPF_JGT": "syscall", "syscall.BPF_JMP": "syscall", "syscall.BPF_JSET": "syscall", "syscall.BPF_K": "syscall", "syscall.BPF_LD": "syscall", "syscall.BPF_LDX": "syscall", "syscall.BPF_LEN": "syscall", "syscall.BPF_LSH": "syscall", "syscall.BPF_MAJOR_VERSION": "syscall", "syscall.BPF_MAXBUFSIZE": "syscall", "syscall.BPF_MAXINSNS": "syscall", "syscall.BPF_MEM": "syscall", "syscall.BPF_MEMWORDS": "syscall", "syscall.BPF_MINBUFSIZE": "syscall", "syscall.BPF_MINOR_VERSION": "syscall", "syscall.BPF_MISC": "syscall", "syscall.BPF_MSH": "syscall", "syscall.BPF_MUL": "syscall", "syscall.BPF_NEG": "syscall", "syscall.BPF_OR": "syscall", "syscall.BPF_RELEASE": "syscall", "syscall.BPF_RET": "syscall", "syscall.BPF_RSH": "syscall", "syscall.BPF_ST": "syscall", "syscall.BPF_STX": "syscall", "syscall.BPF_SUB": "syscall", "syscall.BPF_TAX": "syscall", "syscall.BPF_TXA": "syscall", "syscall.BPF_T_BINTIME": "syscall", "syscall.BPF_T_BINTIME_FAST": "syscall", "syscall.BPF_T_BINTIME_MONOTONIC": "syscall", "syscall.BPF_T_BINTIME_MONOTONIC_FAST": "syscall", "syscall.BPF_T_FAST": "syscall", "syscall.BPF_T_FLAG_MASK": "syscall", "syscall.BPF_T_FORMAT_MASK": "syscall", "syscall.BPF_T_MICROTIME": "syscall", "syscall.BPF_T_MICROTIME_FAST": "syscall", "syscall.BPF_T_MICROTIME_MONOTONIC": "syscall", "syscall.BPF_T_MICROTIME_MONOTONIC_FAST": "syscall", "syscall.BPF_T_MONOTONIC": "syscall", "syscall.BPF_T_MONOTONIC_FAST": "syscall", "syscall.BPF_T_NANOTIME": "syscall", "syscall.BPF_T_NANOTIME_FAST": "syscall", "syscall.BPF_T_NANOTIME_MONOTONIC": "syscall", "syscall.BPF_T_NANOTIME_MONOTONIC_FAST": "syscall", "syscall.BPF_T_NONE": "syscall", "syscall.BPF_T_NORMAL": "syscall", "syscall.BPF_W": "syscall", "syscall.BPF_X": "syscall", "syscall.BRKINT": "syscall", "syscall.Bind": "syscall", "syscall.BindToDevice": "syscall", "syscall.BpfBuflen": "syscall", "syscall.BpfDatalink": "syscall", "syscall.BpfHdr": "syscall", "syscall.BpfHeadercmpl": "syscall", "syscall.BpfInsn": "syscall", "syscall.BpfInterface": "syscall", "syscall.BpfJump": "syscall", "syscall.BpfProgram": "syscall", "syscall.BpfStat": "syscall", "syscall.BpfStats": "syscall", "syscall.BpfStmt": "syscall", "syscall.BpfTimeout": "syscall", "syscall.BpfTimeval": "syscall", "syscall.BpfVersion": "syscall", "syscall.BpfZbuf": "syscall", "syscall.BpfZbufHeader": "syscall", "syscall.ByHandleFileInformation": "syscall", "syscall.BytePtrFromString": "syscall", "syscall.ByteSliceFromString": "syscall", "syscall.CCR0_FLUSH": "syscall", "syscall.CERT_CHAIN_POLICY_AUTHENTICODE": "syscall", "syscall.CERT_CHAIN_POLICY_AUTHENTICODE_TS": "syscall", "syscall.CERT_CHAIN_POLICY_BASE": "syscall", "syscall.CERT_CHAIN_POLICY_BASIC_CONSTRAINTS": "syscall", "syscall.CERT_CHAIN_POLICY_EV": "syscall", "syscall.CERT_CHAIN_POLICY_MICROSOFT_ROOT": "syscall", "syscall.CERT_CHAIN_POLICY_NT_AUTH": "syscall", "syscall.CERT_CHAIN_POLICY_SSL": "syscall", "syscall.CERT_E_CN_NO_MATCH": "syscall", "syscall.CERT_E_EXPIRED": "syscall", "syscall.CERT_E_PURPOSE": "syscall", "syscall.CERT_E_ROLE": "syscall", "syscall.CERT_E_UNTRUSTEDROOT": "syscall", "syscall.CERT_STORE_ADD_ALWAYS": "syscall", "syscall.CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG": "syscall", "syscall.CERT_STORE_PROV_MEMORY": "syscall", "syscall.CERT_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT": "syscall", "syscall.CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT": "syscall", "syscall.CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT": "syscall", "syscall.CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT": "syscall", "syscall.CERT_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT": "syscall", "syscall.CERT_TRUST_INVALID_BASIC_CONSTRAINTS": "syscall", "syscall.CERT_TRUST_INVALID_EXTENSION": "syscall", "syscall.CERT_TRUST_INVALID_NAME_CONSTRAINTS": "syscall", "syscall.CERT_TRUST_INVALID_POLICY_CONSTRAINTS": "syscall", "syscall.CERT_TRUST_IS_CYCLIC": "syscall", "syscall.CERT_TRUST_IS_EXPLICIT_DISTRUST": "syscall", "syscall.CERT_TRUST_IS_NOT_SIGNATURE_VALID": "syscall", "syscall.CERT_TRUST_IS_NOT_TIME_VALID": "syscall", "syscall.CERT_TRUST_IS_NOT_VALID_FOR_USAGE": "syscall", "syscall.CERT_TRUST_IS_OFFLINE_REVOCATION": "syscall", "syscall.CERT_TRUST_IS_REVOKED": "syscall", "syscall.CERT_TRUST_IS_UNTRUSTED_ROOT": "syscall", "syscall.CERT_TRUST_NO_ERROR": "syscall", "syscall.CERT_TRUST_NO_ISSUANCE_CHAIN_POLICY": "syscall", "syscall.CERT_TRUST_REVOCATION_STATUS_UNKNOWN": "syscall", "syscall.CFLUSH": "syscall", "syscall.CLOCAL": "syscall", "syscall.CLONE_CHILD_CLEARTID": "syscall", "syscall.CLONE_CHILD_SETTID": "syscall", "syscall.CLONE_CSIGNAL": "syscall", "syscall.CLONE_DETACHED": "syscall", "syscall.CLONE_FILES": "syscall", "syscall.CLONE_FS": "syscall", "syscall.CLONE_IO": "syscall", "syscall.CLONE_NEWIPC": "syscall", "syscall.CLONE_NEWNET": "syscall", "syscall.CLONE_NEWNS": "syscall", "syscall.CLONE_NEWPID": "syscall", "syscall.CLONE_NEWUSER": "syscall", "syscall.CLONE_NEWUTS": "syscall", "syscall.CLONE_PARENT": "syscall", "syscall.CLONE_PARENT_SETTID": "syscall", "syscall.CLONE_PID": "syscall", "syscall.CLONE_PTRACE": "syscall", "syscall.CLONE_SETTLS": "syscall", "syscall.CLONE_SIGHAND": "syscall", "syscall.CLONE_SYSVSEM": "syscall", "syscall.CLONE_THREAD": "syscall", "syscall.CLONE_UNTRACED": "syscall", "syscall.CLONE_VFORK": "syscall", "syscall.CLONE_VM": "syscall", "syscall.CPUID_CFLUSH": "syscall", "syscall.CREAD": "syscall", "syscall.CREATE_ALWAYS": "syscall", "syscall.CREATE_NEW": "syscall", "syscall.CREATE_NEW_PROCESS_GROUP": "syscall", "syscall.CREATE_UNICODE_ENVIRONMENT": "syscall", "syscall.CRYPT_DEFAULT_CONTAINER_OPTIONAL": "syscall", "syscall.CRYPT_DELETEKEYSET": "syscall", "syscall.CRYPT_MACHINE_KEYSET": "syscall", "syscall.CRYPT_NEWKEYSET": "syscall", "syscall.CRYPT_SILENT": "syscall", "syscall.CRYPT_VERIFYCONTEXT": "syscall", "syscall.CS5": "syscall", "syscall.CS6": "syscall", "syscall.CS7": "syscall", "syscall.CS8": "syscall", "syscall.CSIZE": "syscall", "syscall.CSTART": "syscall", "syscall.CSTATUS": "syscall", "syscall.CSTOP": "syscall", "syscall.CSTOPB": "syscall", "syscall.CSUSP": "syscall", "syscall.CTL_MAXNAME": "syscall", "syscall.CTL_NET": "syscall", "syscall.CTL_QUERY": "syscall", "syscall.CTRL_BREAK_EVENT": "syscall", "syscall.CTRL_C_EVENT": "syscall", "syscall.CancelIo": "syscall", "syscall.CancelIoEx": "syscall", "syscall.CertAddCertificateContextToStore": "syscall", "syscall.CertChainContext": "syscall", "syscall.CertChainElement": "syscall", "syscall.CertChainPara": "syscall", "syscall.CertChainPolicyPara": "syscall", "syscall.CertChainPolicyStatus": "syscall", "syscall.CertCloseStore": "syscall", "syscall.CertContext": "syscall", "syscall.CertCreateCertificateContext": "syscall", "syscall.CertEnhKeyUsage": "syscall", "syscall.CertEnumCertificatesInStore": "syscall", "syscall.CertFreeCertificateChain": "syscall", "syscall.CertFreeCertificateContext": "syscall", "syscall.CertGetCertificateChain": "syscall", "syscall.CertOpenStore": "syscall", "syscall.CertOpenSystemStore": "syscall", "syscall.CertRevocationInfo": "syscall", "syscall.CertSimpleChain": "syscall", "syscall.CertTrustStatus": "syscall", "syscall.CertUsageMatch": "syscall", "syscall.CertVerifyCertificateChainPolicy": "syscall", "syscall.Chdir": "syscall", "syscall.CheckBpfVersion": "syscall", "syscall.Chflags": "syscall", "syscall.Chmod": "syscall", "syscall.Chown": "syscall", "syscall.Chroot": "syscall", "syscall.Clearenv": "syscall", "syscall.Close": "syscall", "syscall.CloseHandle": "syscall", "syscall.CloseOnExec": "syscall", "syscall.Closesocket": "syscall", "syscall.CmsgLen": "syscall", "syscall.CmsgSpace": "syscall", "syscall.Cmsghdr": "syscall", "syscall.CommandLineToArgv": "syscall", "syscall.ComputerName": "syscall", "syscall.Connect": "syscall", "syscall.ConnectEx": "syscall", "syscall.ConvertSidToStringSid": "syscall", "syscall.ConvertStringSidToSid": "syscall", "syscall.CopySid": "syscall", "syscall.Creat": "syscall", "syscall.CreateDirectory": "syscall", "syscall.CreateFile": "syscall", "syscall.CreateFileMapping": "syscall", "syscall.CreateHardLink": "syscall", "syscall.CreateIoCompletionPort": "syscall", "syscall.CreatePipe": "syscall", "syscall.CreateProcess": "syscall", "syscall.CreateSymbolicLink": "syscall", "syscall.CreateToolhelp32Snapshot": "syscall", "syscall.Credential": "syscall", "syscall.CryptAcquireContext": "syscall", "syscall.CryptGenRandom": "syscall", "syscall.CryptReleaseContext": "syscall", "syscall.DIOCBSFLUSH": "syscall", "syscall.DIOCOSFPFLUSH": "syscall", "syscall.DLL": "syscall", "syscall.DLLError": "syscall", "syscall.DLT_A429": "syscall", "syscall.DLT_A653_ICM": "syscall", "syscall.DLT_AIRONET_HEADER": "syscall", "syscall.DLT_AOS": "syscall", "syscall.DLT_APPLE_IP_OVER_IEEE1394": "syscall", "syscall.DLT_ARCNET": "syscall", "syscall.DLT_ARCNET_LINUX": "syscall", "syscall.DLT_ATM_CLIP": "syscall", "syscall.DLT_ATM_RFC1483": "syscall", "syscall.DLT_AURORA": "syscall", "syscall.DLT_AX25": "syscall", "syscall.DLT_AX25_KISS": "syscall", "syscall.DLT_BACNET_MS_TP": "syscall", "syscall.DLT_BLUETOOTH_HCI_H4": "syscall", "syscall.DLT_BLUETOOTH_HCI_H4_WITH_PHDR": "syscall", "syscall.DLT_CAN20B": "syscall", "syscall.DLT_CAN_SOCKETCAN": "syscall", "syscall.DLT_CHAOS": "syscall", "syscall.DLT_CHDLC": "syscall", "syscall.DLT_CISCO_IOS": "syscall", "syscall.DLT_C_HDLC": "syscall", "syscall.DLT_C_HDLC_WITH_DIR": "syscall", "syscall.DLT_DBUS": "syscall", "syscall.DLT_DECT": "syscall", "syscall.DLT_DOCSIS": "syscall", "syscall.DLT_DVB_CI": "syscall", "syscall.DLT_ECONET": "syscall", "syscall.DLT_EN10MB": "syscall", "syscall.DLT_EN3MB": "syscall", "syscall.DLT_ENC": "syscall", "syscall.DLT_ERF": "syscall", "syscall.DLT_ERF_ETH": "syscall", "syscall.DLT_ERF_POS": "syscall", "syscall.DLT_FC_2": "syscall", "syscall.DLT_FC_2_WITH_FRAME_DELIMS": "syscall", "syscall.DLT_FDDI": "syscall", "syscall.DLT_FLEXRAY": "syscall", "syscall.DLT_FRELAY": "syscall", "syscall.DLT_FRELAY_WITH_DIR": "syscall", "syscall.DLT_GCOM_SERIAL": "syscall", "syscall.DLT_GCOM_T1E1": "syscall", "syscall.DLT_GPF_F": "syscall", "syscall.DLT_GPF_T": "syscall", "syscall.DLT_GPRS_LLC": "syscall", "syscall.DLT_GSMTAP_ABIS": "syscall", "syscall.DLT_GSMTAP_UM": "syscall", "syscall.DLT_HDLC": "syscall", "syscall.DLT_HHDLC": "syscall", "syscall.DLT_HIPPI": "syscall", "syscall.DLT_IBM_SN": "syscall", "syscall.DLT_IBM_SP": "syscall", "syscall.DLT_IEEE802": "syscall", "syscall.DLT_IEEE802_11": "syscall", "syscall.DLT_IEEE802_11_RADIO": "syscall", "syscall.DLT_IEEE802_11_RADIO_AVS": "syscall", "syscall.DLT_IEEE802_15_4": "syscall", "syscall.DLT_IEEE802_15_4_LINUX": "syscall", "syscall.DLT_IEEE802_15_4_NOFCS": "syscall", "syscall.DLT_IEEE802_15_4_NONASK_PHY": "syscall", "syscall.DLT_IEEE802_16_MAC_CPS": "syscall", "syscall.DLT_IEEE802_16_MAC_CPS_RADIO": "syscall", "syscall.DLT_IPFILTER": "syscall", "syscall.DLT_IPMB": "syscall", "syscall.DLT_IPMB_LINUX": "syscall", "syscall.DLT_IPNET": "syscall", "syscall.DLT_IPOIB": "syscall", "syscall.DLT_IPV4": "syscall", "syscall.DLT_IPV6": "syscall", "syscall.DLT_IP_OVER_FC": "syscall", "syscall.DLT_JUNIPER_ATM1": "syscall", "syscall.DLT_JUNIPER_ATM2": "syscall", "syscall.DLT_JUNIPER_ATM_CEMIC": "syscall", "syscall.DLT_JUNIPER_CHDLC": "syscall", "syscall.DLT_JUNIPER_ES": "syscall", "syscall.DLT_JUNIPER_ETHER": "syscall", "syscall.DLT_JUNIPER_FIBRECHANNEL": "syscall", "syscall.DLT_JUNIPER_FRELAY": "syscall", "syscall.DLT_JUNIPER_GGSN": "syscall", "syscall.DLT_JUNIPER_ISM": "syscall", "syscall.DLT_JUNIPER_MFR": "syscall", "syscall.DLT_JUNIPER_MLFR": "syscall", "syscall.DLT_JUNIPER_MLPPP": "syscall", "syscall.DLT_JUNIPER_MONITOR": "syscall", "syscall.DLT_JUNIPER_PIC_PEER": "syscall", "syscall.DLT_JUNIPER_PPP": "syscall", "syscall.DLT_JUNIPER_PPPOE": "syscall", "syscall.DLT_JUNIPER_PPPOE_ATM": "syscall", "syscall.DLT_JUNIPER_SERVICES": "syscall", "syscall.DLT_JUNIPER_SRX_E2E": "syscall", "syscall.DLT_JUNIPER_ST": "syscall", "syscall.DLT_JUNIPER_VP": "syscall", "syscall.DLT_JUNIPER_VS": "syscall", "syscall.DLT_LAPB_WITH_DIR": "syscall", "syscall.DLT_LAPD": "syscall", "syscall.DLT_LIN": "syscall", "syscall.DLT_LINUX_EVDEV": "syscall", "syscall.DLT_LINUX_IRDA": "syscall", "syscall.DLT_LINUX_LAPD": "syscall", "syscall.DLT_LINUX_PPP_WITHDIRECTION": "syscall", "syscall.DLT_LINUX_SLL": "syscall", "syscall.DLT_LOOP": "syscall", "syscall.DLT_LTALK": "syscall", "syscall.DLT_MATCHING_MAX": "syscall", "syscall.DLT_MATCHING_MIN": "syscall", "syscall.DLT_MFR": "syscall", "syscall.DLT_MOST": "syscall", "syscall.DLT_MPEG_2_TS": "syscall", "syscall.DLT_MPLS": "syscall", "syscall.DLT_MTP2": "syscall", "syscall.DLT_MTP2_WITH_PHDR": "syscall", "syscall.DLT_MTP3": "syscall", "syscall.DLT_MUX27010": "syscall", "syscall.DLT_NETANALYZER": "syscall", "syscall.DLT_NETANALYZER_TRANSPARENT": "syscall", "syscall.DLT_NFC_LLCP": "syscall", "syscall.DLT_NFLOG": "syscall", "syscall.DLT_NG40": "syscall", "syscall.DLT_NULL": "syscall", "syscall.DLT_PCI_EXP": "syscall", "syscall.DLT_PFLOG": "syscall", "syscall.DLT_PFSYNC": "syscall", "syscall.DLT_PPI": "syscall", "syscall.DLT_PPP": "syscall", "syscall.DLT_PPP_BSDOS": "syscall", "syscall.DLT_PPP_ETHER": "syscall", "syscall.DLT_PPP_PPPD": "syscall", "syscall.DLT_PPP_SERIAL": "syscall", "syscall.DLT_PPP_WITH_DIR": "syscall", "syscall.DLT_PPP_WITH_DIRECTION": "syscall", "syscall.DLT_PRISM_HEADER": "syscall", "syscall.DLT_PRONET": "syscall", "syscall.DLT_RAIF1": "syscall", "syscall.DLT_RAW": "syscall", "syscall.DLT_RAWAF_MASK": "syscall", "syscall.DLT_RIO": "syscall", "syscall.DLT_SCCP": "syscall", "syscall.DLT_SITA": "syscall", "syscall.DLT_SLIP": "syscall", "syscall.DLT_SLIP_BSDOS": "syscall", "syscall.DLT_STANAG_5066_D_PDU": "syscall", "syscall.DLT_SUNATM": "syscall", "syscall.DLT_SYMANTEC_FIREWALL": "syscall", "syscall.DLT_TZSP": "syscall", "syscall.DLT_USB": "syscall", "syscall.DLT_USB_LINUX": "syscall", "syscall.DLT_USB_LINUX_MMAPPED": "syscall", "syscall.DLT_USER0": "syscall", "syscall.DLT_USER1": "syscall", "syscall.DLT_USER10": "syscall", "syscall.DLT_USER11": "syscall", "syscall.DLT_USER12": "syscall", "syscall.DLT_USER13": "syscall", "syscall.DLT_USER14": "syscall", "syscall.DLT_USER15": "syscall", "syscall.DLT_USER2": "syscall", "syscall.DLT_USER3": "syscall", "syscall.DLT_USER4": "syscall", "syscall.DLT_USER5": "syscall", "syscall.DLT_USER6": "syscall", "syscall.DLT_USER7": "syscall", "syscall.DLT_USER8": "syscall", "syscall.DLT_USER9": "syscall", "syscall.DLT_WIHART": "syscall", "syscall.DLT_X2E_SERIAL": "syscall", "syscall.DLT_X2E_XORAYA": "syscall", "syscall.DNSMXData": "syscall", "syscall.DNSPTRData": "syscall", "syscall.DNSRecord": "syscall", "syscall.DNSSRVData": "syscall", "syscall.DNSTXTData": "syscall", "syscall.DNS_INFO_NO_RECORDS": "syscall", "syscall.DNS_TYPE_A": "syscall", "syscall.DNS_TYPE_A6": "syscall", "syscall.DNS_TYPE_AAAA": "syscall", "syscall.DNS_TYPE_ADDRS": "syscall", "syscall.DNS_TYPE_AFSDB": "syscall", "syscall.DNS_TYPE_ALL": "syscall", "syscall.DNS_TYPE_ANY": "syscall", "syscall.DNS_TYPE_ATMA": "syscall", "syscall.DNS_TYPE_AXFR": "syscall", "syscall.DNS_TYPE_CERT": "syscall", "syscall.DNS_TYPE_CNAME": "syscall", "syscall.DNS_TYPE_DHCID": "syscall", "syscall.DNS_TYPE_DNAME": "syscall", "syscall.DNS_TYPE_DNSKEY": "syscall", "syscall.DNS_TYPE_DS": "syscall", "syscall.DNS_TYPE_EID": "syscall", "syscall.DNS_TYPE_GID": "syscall", "syscall.DNS_TYPE_GPOS": "syscall", "syscall.DNS_TYPE_HINFO": "syscall", "syscall.DNS_TYPE_ISDN": "syscall", "syscall.DNS_TYPE_IXFR": "syscall", "syscall.DNS_TYPE_KEY": "syscall", "syscall.DNS_TYPE_KX": "syscall", "syscall.DNS_TYPE_LOC": "syscall", "syscall.DNS_TYPE_MAILA": "syscall", "syscall.DNS_TYPE_MAILB": "syscall", "syscall.DNS_TYPE_MB": "syscall", "syscall.DNS_TYPE_MD": "syscall", "syscall.DNS_TYPE_MF": "syscall", "syscall.DNS_TYPE_MG": "syscall", "syscall.DNS_TYPE_MINFO": "syscall", "syscall.DNS_TYPE_MR": "syscall", "syscall.DNS_TYPE_MX": "syscall", "syscall.DNS_TYPE_NAPTR": "syscall", "syscall.DNS_TYPE_NBSTAT": "syscall", "syscall.DNS_TYPE_NIMLOC": "syscall", "syscall.DNS_TYPE_NS": "syscall", "syscall.DNS_TYPE_NSAP": "syscall", "syscall.DNS_TYPE_NSAPPTR": "syscall", "syscall.DNS_TYPE_NSEC": "syscall", "syscall.DNS_TYPE_NULL": "syscall", "syscall.DNS_TYPE_NXT": "syscall", "syscall.DNS_TYPE_OPT": "syscall", "syscall.DNS_TYPE_PTR": "syscall", "syscall.DNS_TYPE_PX": "syscall", "syscall.DNS_TYPE_RP": "syscall", "syscall.DNS_TYPE_RRSIG": "syscall", "syscall.DNS_TYPE_RT": "syscall", "syscall.DNS_TYPE_SIG": "syscall", "syscall.DNS_TYPE_SINK": "syscall", "syscall.DNS_TYPE_SOA": "syscall", "syscall.DNS_TYPE_SRV": "syscall", "syscall.DNS_TYPE_TEXT": "syscall", "syscall.DNS_TYPE_TKEY": "syscall", "syscall.DNS_TYPE_TSIG": "syscall", "syscall.DNS_TYPE_UID": "syscall", "syscall.DNS_TYPE_UINFO": "syscall", "syscall.DNS_TYPE_UNSPEC": "syscall", "syscall.DNS_TYPE_WINS": "syscall", "syscall.DNS_TYPE_WINSR": "syscall", "syscall.DNS_TYPE_WKS": "syscall", "syscall.DNS_TYPE_X25": "syscall", "syscall.DT_BLK": "syscall", "syscall.DT_CHR": "syscall", "syscall.DT_DIR": "syscall", "syscall.DT_FIFO": "syscall", "syscall.DT_LNK": "syscall", "syscall.DT_REG": "syscall", "syscall.DT_SOCK": "syscall", "syscall.DT_UNKNOWN": "syscall", "syscall.DT_WHT": "syscall", "syscall.DUPLICATE_CLOSE_SOURCE": "syscall", "syscall.DUPLICATE_SAME_ACCESS": "syscall", "syscall.DeleteFile": "syscall", "syscall.DetachLsf": "syscall", "syscall.DeviceIoControl": "syscall", "syscall.Dirent": "syscall", "syscall.DnsNameCompare": "syscall", "syscall.DnsQuery": "syscall", "syscall.DnsRecordListFree": "syscall", "syscall.DnsSectionAdditional": "syscall", "syscall.DnsSectionAnswer": "syscall", "syscall.DnsSectionAuthority": "syscall", "syscall.DnsSectionQuestion": "syscall", "syscall.Dup": "syscall", "syscall.Dup2": "syscall", "syscall.Dup3": "syscall", "syscall.DuplicateHandle": "syscall", "syscall.E2BIG": "syscall", "syscall.EACCES": "syscall", "syscall.EADDRINUSE": "syscall", "syscall.EADDRNOTAVAIL": "syscall", "syscall.EADV": "syscall", "syscall.EAFNOSUPPORT": "syscall", "syscall.EAGAIN": "syscall", "syscall.EALREADY": "syscall", "syscall.EAUTH": "syscall", "syscall.EBADARCH": "syscall", "syscall.EBADE": "syscall", "syscall.EBADEXEC": "syscall", "syscall.EBADF": "syscall", "syscall.EBADFD": "syscall", "syscall.EBADMACHO": "syscall", "syscall.EBADMSG": "syscall", "syscall.EBADR": "syscall", "syscall.EBADRPC": "syscall", "syscall.EBADRQC": "syscall", "syscall.EBADSLT": "syscall", "syscall.EBFONT": "syscall", "syscall.EBUSY": "syscall", "syscall.ECANCELED": "syscall", "syscall.ECAPMODE": "syscall", "syscall.ECHILD": "syscall", "syscall.ECHO": "syscall", "syscall.ECHOCTL": "syscall", "syscall.ECHOE": "syscall", "syscall.ECHOK": "syscall", "syscall.ECHOKE": "syscall", "syscall.ECHONL": "syscall", "syscall.ECHOPRT": "syscall", "syscall.ECHRNG": "syscall", "syscall.ECOMM": "syscall", "syscall.ECONNABORTED": "syscall", "syscall.ECONNREFUSED": "syscall", "syscall.ECONNRESET": "syscall", "syscall.EDEADLK": "syscall", "syscall.EDEADLOCK": "syscall", "syscall.EDESTADDRREQ": "syscall", "syscall.EDEVERR": "syscall", "syscall.EDOM": "syscall", "syscall.EDOOFUS": "syscall", "syscall.EDOTDOT": "syscall", "syscall.EDQUOT": "syscall", "syscall.EEXIST": "syscall", "syscall.EFAULT": "syscall", "syscall.EFBIG": "syscall", "syscall.EFER_LMA": "syscall", "syscall.EFER_LME": "syscall", "syscall.EFER_NXE": "syscall", "syscall.EFER_SCE": "syscall", "syscall.EFTYPE": "syscall", "syscall.EHOSTDOWN": "syscall", "syscall.EHOSTUNREACH": "syscall", "syscall.EHWPOISON": "syscall", "syscall.EIDRM": "syscall", "syscall.EILSEQ": "syscall", "syscall.EINPROGRESS": "syscall", "syscall.EINTR": "syscall", "syscall.EINVAL": "syscall", "syscall.EIO": "syscall", "syscall.EIPSEC": "syscall", "syscall.EISCONN": "syscall", "syscall.EISDIR": "syscall", "syscall.EISNAM": "syscall", "syscall.EKEYEXPIRED": "syscall", "syscall.EKEYREJECTED": "syscall", "syscall.EKEYREVOKED": "syscall", "syscall.EL2HLT": "syscall", "syscall.EL2NSYNC": "syscall", "syscall.EL3HLT": "syscall", "syscall.EL3RST": "syscall", "syscall.ELAST": "syscall", "syscall.ELF_NGREG": "syscall", "syscall.ELF_PRARGSZ": "syscall", "syscall.ELIBACC": "syscall", "syscall.ELIBBAD": "syscall", "syscall.ELIBEXEC": "syscall", "syscall.ELIBMAX": "syscall", "syscall.ELIBSCN": "syscall", "syscall.ELNRNG": "syscall", "syscall.ELOOP": "syscall", "syscall.EMEDIUMTYPE": "syscall", "syscall.EMFILE": "syscall", "syscall.EMLINK": "syscall", "syscall.EMSGSIZE": "syscall", "syscall.EMT_TAGOVF": "syscall", "syscall.EMULTIHOP": "syscall", "syscall.EMUL_ENABLED": "syscall", "syscall.EMUL_LINUX": "syscall", "syscall.EMUL_LINUX32": "syscall", "syscall.EMUL_MAXID": "syscall", "syscall.EMUL_NATIVE": "syscall", "syscall.ENAMETOOLONG": "syscall", "syscall.ENAVAIL": "syscall", "syscall.ENDRUNDISC": "syscall", "syscall.ENEEDAUTH": "syscall", "syscall.ENETDOWN": "syscall", "syscall.ENETRESET": "syscall", "syscall.ENETUNREACH": "syscall", "syscall.ENFILE": "syscall", "syscall.ENOANO": "syscall", "syscall.ENOATTR": "syscall", "syscall.ENOBUFS": "syscall", "syscall.ENOCSI": "syscall", "syscall.ENODATA": "syscall", "syscall.ENODEV": "syscall", "syscall.ENOENT": "syscall", "syscall.ENOEXEC": "syscall", "syscall.ENOKEY": "syscall", "syscall.ENOLCK": "syscall", "syscall.ENOLINK": "syscall", "syscall.ENOMEDIUM": "syscall", "syscall.ENOMEM": "syscall", "syscall.ENOMSG": "syscall", "syscall.ENONET": "syscall", "syscall.ENOPKG": "syscall", "syscall.ENOPOLICY": "syscall", "syscall.ENOPROTOOPT": "syscall", "syscall.ENOSPC": "syscall", "syscall.ENOSR": "syscall", "syscall.ENOSTR": "syscall", "syscall.ENOSYS": "syscall", "syscall.ENOTBLK": "syscall", "syscall.ENOTCAPABLE": "syscall", "syscall.ENOTCONN": "syscall", "syscall.ENOTDIR": "syscall", "syscall.ENOTEMPTY": "syscall", "syscall.ENOTNAM": "syscall", "syscall.ENOTRECOVERABLE": "syscall", "syscall.ENOTSOCK": "syscall", "syscall.ENOTSUP": "syscall", "syscall.ENOTTY": "syscall", "syscall.ENOTUNIQ": "syscall", "syscall.ENXIO": "syscall", "syscall.EN_SW_CTL_INF": "syscall", "syscall.EN_SW_CTL_PREC": "syscall", "syscall.EN_SW_CTL_ROUND": "syscall", "syscall.EN_SW_DATACHAIN": "syscall", "syscall.EN_SW_DENORM": "syscall", "syscall.EN_SW_INVOP": "syscall", "syscall.EN_SW_OVERFLOW": "syscall", "syscall.EN_SW_PRECLOSS": "syscall", "syscall.EN_SW_UNDERFLOW": "syscall", "syscall.EN_SW_ZERODIV": "syscall", "syscall.EOPNOTSUPP": "syscall", "syscall.EOVERFLOW": "syscall", "syscall.EOWNERDEAD": "syscall", "syscall.EPERM": "syscall", "syscall.EPFNOSUPPORT": "syscall", "syscall.EPIPE": "syscall", "syscall.EPOLLERR": "syscall", "syscall.EPOLLET": "syscall", "syscall.EPOLLHUP": "syscall", "syscall.EPOLLIN": "syscall", "syscall.EPOLLMSG": "syscall", "syscall.EPOLLONESHOT": "syscall", "syscall.EPOLLOUT": "syscall", "syscall.EPOLLPRI": "syscall", "syscall.EPOLLRDBAND": "syscall", "syscall.EPOLLRDHUP": "syscall", "syscall.EPOLLRDNORM": "syscall", "syscall.EPOLLWRBAND": "syscall", "syscall.EPOLLWRNORM": "syscall", "syscall.EPOLL_CLOEXEC": "syscall", "syscall.EPOLL_CTL_ADD": "syscall", "syscall.EPOLL_CTL_DEL": "syscall", "syscall.EPOLL_CTL_MOD": "syscall", "syscall.EPOLL_NONBLOCK": "syscall", "syscall.EPROCLIM": "syscall", "syscall.EPROCUNAVAIL": "syscall", "syscall.EPROGMISMATCH": "syscall", "syscall.EPROGUNAVAIL": "syscall", "syscall.EPROTO": "syscall", "syscall.EPROTONOSUPPORT": "syscall", "syscall.EPROTOTYPE": "syscall", "syscall.EPWROFF": "syscall", "syscall.ERANGE": "syscall", "syscall.EREMCHG": "syscall", "syscall.EREMOTE": "syscall", "syscall.EREMOTEIO": "syscall", "syscall.ERESTART": "syscall", "syscall.ERFKILL": "syscall", "syscall.EROFS": "syscall", "syscall.ERPCMISMATCH": "syscall", "syscall.ERROR_ACCESS_DENIED": "syscall", "syscall.ERROR_ALREADY_EXISTS": "syscall", "syscall.ERROR_BROKEN_PIPE": "syscall", "syscall.ERROR_BUFFER_OVERFLOW": "syscall", "syscall.ERROR_ENVVAR_NOT_FOUND": "syscall", "syscall.ERROR_FILE_EXISTS": "syscall", "syscall.ERROR_FILE_NOT_FOUND": "syscall", "syscall.ERROR_HANDLE_EOF": "syscall", "syscall.ERROR_INSUFFICIENT_BUFFER": "syscall", "syscall.ERROR_IO_PENDING": "syscall", "syscall.ERROR_MOD_NOT_FOUND": "syscall", "syscall.ERROR_MORE_DATA": "syscall", "syscall.ERROR_NETNAME_DELETED": "syscall", "syscall.ERROR_NOT_FOUND": "syscall", "syscall.ERROR_NO_MORE_FILES": "syscall", "syscall.ERROR_OPERATION_ABORTED": "syscall", "syscall.ERROR_PATH_NOT_FOUND": "syscall", "syscall.ERROR_PRIVILEGE_NOT_HELD": "syscall", "syscall.ERROR_PROC_NOT_FOUND": "syscall", "syscall.ESHLIBVERS": "syscall", "syscall.ESHUTDOWN": "syscall", "syscall.ESOCKTNOSUPPORT": "syscall", "syscall.ESPIPE": "syscall", "syscall.ESRCH": "syscall", "syscall.ESRMNT": "syscall", "syscall.ESTALE": "syscall", "syscall.ESTRPIPE": "syscall", "syscall.ETHERCAP_JUMBO_MTU": "syscall", "syscall.ETHERCAP_VLAN_HWTAGGING": "syscall", "syscall.ETHERCAP_VLAN_MTU": "syscall", "syscall.ETHERMIN": "syscall", "syscall.ETHERMTU": "syscall", "syscall.ETHERMTU_JUMBO": "syscall", "syscall.ETHERTYPE_8023": "syscall", "syscall.ETHERTYPE_AARP": "syscall", "syscall.ETHERTYPE_ACCTON": "syscall", "syscall.ETHERTYPE_AEONIC": "syscall", "syscall.ETHERTYPE_ALPHA": "syscall", "syscall.ETHERTYPE_AMBER": "syscall", "syscall.ETHERTYPE_AMOEBA": "syscall", "syscall.ETHERTYPE_AOE": "syscall", "syscall.ETHERTYPE_APOLLO": "syscall", "syscall.ETHERTYPE_APOLLODOMAIN": "syscall", "syscall.ETHERTYPE_APPLETALK": "syscall", "syscall.ETHERTYPE_APPLITEK": "syscall", "syscall.ETHERTYPE_ARGONAUT": "syscall", "syscall.ETHERTYPE_ARP": "syscall", "syscall.ETHERTYPE_AT": "syscall", "syscall.ETHERTYPE_ATALK": "syscall", "syscall.ETHERTYPE_ATOMIC": "syscall", "syscall.ETHERTYPE_ATT": "syscall", "syscall.ETHERTYPE_ATTSTANFORD": "syscall", "syscall.ETHERTYPE_AUTOPHON": "syscall", "syscall.ETHERTYPE_AXIS": "syscall", "syscall.ETHERTYPE_BCLOOP": "syscall", "syscall.ETHERTYPE_BOFL": "syscall", "syscall.ETHERTYPE_CABLETRON": "syscall", "syscall.ETHERTYPE_CHAOS": "syscall", "syscall.ETHERTYPE_COMDESIGN": "syscall", "syscall.ETHERTYPE_COMPUGRAPHIC": "syscall", "syscall.ETHERTYPE_COUNTERPOINT": "syscall", "syscall.ETHERTYPE_CRONUS": "syscall", "syscall.ETHERTYPE_CRONUSVLN": "syscall", "syscall.ETHERTYPE_DCA": "syscall", "syscall.ETHERTYPE_DDE": "syscall", "syscall.ETHERTYPE_DEBNI": "syscall", "syscall.ETHERTYPE_DECAM": "syscall", "syscall.ETHERTYPE_DECCUST": "syscall", "syscall.ETHERTYPE_DECDIAG": "syscall", "syscall.ETHERTYPE_DECDNS": "syscall", "syscall.ETHERTYPE_DECDTS": "syscall", "syscall.ETHERTYPE_DECEXPER": "syscall", "syscall.ETHERTYPE_DECLAST": "syscall", "syscall.ETHERTYPE_DECLTM": "syscall", "syscall.ETHERTYPE_DECMUMPS": "syscall", "syscall.ETHERTYPE_DECNETBIOS": "syscall", "syscall.ETHERTYPE_DELTACON": "syscall", "syscall.ETHERTYPE_DIDDLE": "syscall", "syscall.ETHERTYPE_DLOG1": "syscall", "syscall.ETHERTYPE_DLOG2": "syscall", "syscall.ETHERTYPE_DN": "syscall", "syscall.ETHERTYPE_DOGFIGHT": "syscall", "syscall.ETHERTYPE_DSMD": "syscall", "syscall.ETHERTYPE_ECMA": "syscall", "syscall.ETHERTYPE_ENCRYPT": "syscall", "syscall.ETHERTYPE_ES": "syscall", "syscall.ETHERTYPE_EXCELAN": "syscall", "syscall.ETHERTYPE_EXPERDATA": "syscall", "syscall.ETHERTYPE_FLIP": "syscall", "syscall.ETHERTYPE_FLOWCONTROL": "syscall", "syscall.ETHERTYPE_FRARP": "syscall", "syscall.ETHERTYPE_GENDYN": "syscall", "syscall.ETHERTYPE_HAYES": "syscall", "syscall.ETHERTYPE_HIPPI_FP": "syscall", "syscall.ETHERTYPE_HITACHI": "syscall", "syscall.ETHERTYPE_HP": "syscall", "syscall.ETHERTYPE_IEEEPUP": "syscall", "syscall.ETHERTYPE_IEEEPUPAT": "syscall", "syscall.ETHERTYPE_IMLBL": "syscall", "syscall.ETHERTYPE_IMLBLDIAG": "syscall", "syscall.ETHERTYPE_IP": "syscall", "syscall.ETHERTYPE_IPAS": "syscall", "syscall.ETHERTYPE_IPV6": "syscall", "syscall.ETHERTYPE_IPX": "syscall", "syscall.ETHERTYPE_IPXNEW": "syscall", "syscall.ETHERTYPE_KALPANA": "syscall", "syscall.ETHERTYPE_LANBRIDGE": "syscall", "syscall.ETHERTYPE_LANPROBE": "syscall", "syscall.ETHERTYPE_LAT": "syscall", "syscall.ETHERTYPE_LBACK": "syscall", "syscall.ETHERTYPE_LITTLE": "syscall", "syscall.ETHERTYPE_LLDP": "syscall", "syscall.ETHERTYPE_LOGICRAFT": "syscall", "syscall.ETHERTYPE_LOOPBACK": "syscall", "syscall.ETHERTYPE_MATRA": "syscall", "syscall.ETHERTYPE_MAX": "syscall", "syscall.ETHERTYPE_MERIT": "syscall", "syscall.ETHERTYPE_MICP": "syscall", "syscall.ETHERTYPE_MOPDL": "syscall", "syscall.ETHERTYPE_MOPRC": "syscall", "syscall.ETHERTYPE_MOTOROLA": "syscall", "syscall.ETHERTYPE_MPLS": "syscall", "syscall.ETHERTYPE_MPLS_MCAST": "syscall", "syscall.ETHERTYPE_MUMPS": "syscall", "syscall.ETHERTYPE_NBPCC": "syscall", "syscall.ETHERTYPE_NBPCLAIM": "syscall", "syscall.ETHERTYPE_NBPCLREQ": "syscall", "syscall.ETHERTYPE_NBPCLRSP": "syscall", "syscall.ETHERTYPE_NBPCREQ": "syscall", "syscall.ETHERTYPE_NBPCRSP": "syscall", "syscall.ETHERTYPE_NBPDG": "syscall", "syscall.ETHERTYPE_NBPDGB": "syscall", "syscall.ETHERTYPE_NBPDLTE": "syscall", "syscall.ETHERTYPE_NBPRAR": "syscall", "syscall.ETHERTYPE_NBPRAS": "syscall", "syscall.ETHERTYPE_NBPRST": "syscall", "syscall.ETHERTYPE_NBPSCD": "syscall", "syscall.ETHERTYPE_NBPVCD": "syscall", "syscall.ETHERTYPE_NBS": "syscall", "syscall.ETHERTYPE_NCD": "syscall", "syscall.ETHERTYPE_NESTAR": "syscall", "syscall.ETHERTYPE_NETBEUI": "syscall", "syscall.ETHERTYPE_NOVELL": "syscall", "syscall.ETHERTYPE_NS": "syscall", "syscall.ETHERTYPE_NSAT": "syscall", "syscall.ETHERTYPE_NSCOMPAT": "syscall", "syscall.ETHERTYPE_NTRAILER": "syscall", "syscall.ETHERTYPE_OS9": "syscall", "syscall.ETHERTYPE_OS9NET": "syscall", "syscall.ETHERTYPE_PACER": "syscall", "syscall.ETHERTYPE_PAE": "syscall", "syscall.ETHERTYPE_PCS": "syscall", "syscall.ETHERTYPE_PLANNING": "syscall", "syscall.ETHERTYPE_PPP": "syscall", "syscall.ETHERTYPE_PPPOE": "syscall", "syscall.ETHERTYPE_PPPOEDISC": "syscall", "syscall.ETHERTYPE_PRIMENTS": "syscall", "syscall.ETHERTYPE_PUP": "syscall", "syscall.ETHERTYPE_PUPAT": "syscall", "syscall.ETHERTYPE_QINQ": "syscall", "syscall.ETHERTYPE_RACAL": "syscall", "syscall.ETHERTYPE_RATIONAL": "syscall", "syscall.ETHERTYPE_RAWFR": "syscall", "syscall.ETHERTYPE_RCL": "syscall", "syscall.ETHERTYPE_RDP": "syscall", "syscall.ETHERTYPE_RETIX": "syscall", "syscall.ETHERTYPE_REVARP": "syscall", "syscall.ETHERTYPE_SCA": "syscall", "syscall.ETHERTYPE_SECTRA": "syscall", "syscall.ETHERTYPE_SECUREDATA": "syscall", "syscall.ETHERTYPE_SGITW": "syscall", "syscall.ETHERTYPE_SG_BOUNCE": "syscall", "syscall.ETHERTYPE_SG_DIAG": "syscall", "syscall.ETHERTYPE_SG_NETGAMES": "syscall", "syscall.ETHERTYPE_SG_RESV": "syscall", "syscall.ETHERTYPE_SIMNET": "syscall", "syscall.ETHERTYPE_SLOW": "syscall", "syscall.ETHERTYPE_SLOWPROTOCOLS": "syscall", "syscall.ETHERTYPE_SNA": "syscall", "syscall.ETHERTYPE_SNMP": "syscall", "syscall.ETHERTYPE_SONIX": "syscall", "syscall.ETHERTYPE_SPIDER": "syscall", "syscall.ETHERTYPE_SPRITE": "syscall", "syscall.ETHERTYPE_STP": "syscall", "syscall.ETHERTYPE_TALARIS": "syscall", "syscall.ETHERTYPE_TALARISMC": "syscall", "syscall.ETHERTYPE_TCPCOMP": "syscall", "syscall.ETHERTYPE_TCPSM": "syscall", "syscall.ETHERTYPE_TEC": "syscall", "syscall.ETHERTYPE_TIGAN": "syscall", "syscall.ETHERTYPE_TRAIL": "syscall", "syscall.ETHERTYPE_TRANSETHER": "syscall", "syscall.ETHERTYPE_TYMSHARE": "syscall", "syscall.ETHERTYPE_UBBST": "syscall", "syscall.ETHERTYPE_UBDEBUG": "syscall", "syscall.ETHERTYPE_UBDIAGLOOP": "syscall", "syscall.ETHERTYPE_UBDL": "syscall", "syscall.ETHERTYPE_UBNIU": "syscall", "syscall.ETHERTYPE_UBNMC": "syscall", "syscall.ETHERTYPE_VALID": "syscall", "syscall.ETHERTYPE_VARIAN": "syscall", "syscall.ETHERTYPE_VAXELN": "syscall", "syscall.ETHERTYPE_VEECO": "syscall", "syscall.ETHERTYPE_VEXP": "syscall", "syscall.ETHERTYPE_VGLAB": "syscall", "syscall.ETHERTYPE_VINES": "syscall", "syscall.ETHERTYPE_VINESECHO": "syscall", "syscall.ETHERTYPE_VINESLOOP": "syscall", "syscall.ETHERTYPE_VITAL": "syscall", "syscall.ETHERTYPE_VLAN": "syscall", "syscall.ETHERTYPE_VLTLMAN": "syscall", "syscall.ETHERTYPE_VPROD": "syscall", "syscall.ETHERTYPE_VURESERVED": "syscall", "syscall.ETHERTYPE_WATERLOO": "syscall", "syscall.ETHERTYPE_WELLFLEET": "syscall", "syscall.ETHERTYPE_X25": "syscall", "syscall.ETHERTYPE_X75": "syscall", "syscall.ETHERTYPE_XNSSM": "syscall", "syscall.ETHERTYPE_XTP": "syscall", "syscall.ETHER_ADDR_LEN": "syscall", "syscall.ETHER_ALIGN": "syscall", "syscall.ETHER_CRC_LEN": "syscall", "syscall.ETHER_CRC_POLY_BE": "syscall", "syscall.ETHER_CRC_POLY_LE": "syscall", "syscall.ETHER_HDR_LEN": "syscall", "syscall.ETHER_MAX_DIX_LEN": "syscall", "syscall.ETHER_MAX_LEN": "syscall", "syscall.ETHER_MAX_LEN_JUMBO": "syscall", "syscall.ETHER_MIN_LEN": "syscall", "syscall.ETHER_PPPOE_ENCAP_LEN": "syscall", "syscall.ETHER_TYPE_LEN": "syscall", "syscall.ETHER_VLAN_ENCAP_LEN": "syscall", "syscall.ETH_P_1588": "syscall", "syscall.ETH_P_8021Q": "syscall", "syscall.ETH_P_802_2": "syscall", "syscall.ETH_P_802_3": "syscall", "syscall.ETH_P_AARP": "syscall", "syscall.ETH_P_ALL": "syscall", "syscall.ETH_P_AOE": "syscall", "syscall.ETH_P_ARCNET": "syscall", "syscall.ETH_P_ARP": "syscall", "syscall.ETH_P_ATALK": "syscall", "syscall.ETH_P_ATMFATE": "syscall", "syscall.ETH_P_ATMMPOA": "syscall", "syscall.ETH_P_AX25": "syscall", "syscall.ETH_P_BPQ": "syscall", "syscall.ETH_P_CAIF": "syscall", "syscall.ETH_P_CAN": "syscall", "syscall.ETH_P_CONTROL": "syscall", "syscall.ETH_P_CUST": "syscall", "syscall.ETH_P_DDCMP": "syscall", "syscall.ETH_P_DEC": "syscall", "syscall.ETH_P_DIAG": "syscall", "syscall.ETH_P_DNA_DL": "syscall", "syscall.ETH_P_DNA_RC": "syscall", "syscall.ETH_P_DNA_RT": "syscall", "syscall.ETH_P_DSA": "syscall", "syscall.ETH_P_ECONET": "syscall", "syscall.ETH_P_EDSA": "syscall", "syscall.ETH_P_FCOE": "syscall", "syscall.ETH_P_FIP": "syscall", "syscall.ETH_P_HDLC": "syscall", "syscall.ETH_P_IEEE802154": "syscall", "syscall.ETH_P_IEEEPUP": "syscall", "syscall.ETH_P_IEEEPUPAT": "syscall", "syscall.ETH_P_IP": "syscall", "syscall.ETH_P_IPV6": "syscall", "syscall.ETH_P_IPX": "syscall", "syscall.ETH_P_IRDA": "syscall", "syscall.ETH_P_LAT": "syscall", "syscall.ETH_P_LINK_CTL": "syscall", "syscall.ETH_P_LOCALTALK": "syscall", "syscall.ETH_P_LOOP": "syscall", "syscall.ETH_P_MOBITEX": "syscall", "syscall.ETH_P_MPLS_MC": "syscall", "syscall.ETH_P_MPLS_UC": "syscall", "syscall.ETH_P_PAE": "syscall", "syscall.ETH_P_PAUSE": "syscall", "syscall.ETH_P_PHONET": "syscall", "syscall.ETH_P_PPPTALK": "syscall", "syscall.ETH_P_PPP_DISC": "syscall", "syscall.ETH_P_PPP_MP": "syscall", "syscall.ETH_P_PPP_SES": "syscall", "syscall.ETH_P_PUP": "syscall", "syscall.ETH_P_PUPAT": "syscall", "syscall.ETH_P_RARP": "syscall", "syscall.ETH_P_SCA": "syscall", "syscall.ETH_P_SLOW": "syscall", "syscall.ETH_P_SNAP": "syscall", "syscall.ETH_P_TEB": "syscall", "syscall.ETH_P_TIPC": "syscall", "syscall.ETH_P_TRAILER": "syscall", "syscall.ETH_P_TR_802_2": "syscall", "syscall.ETH_P_WAN_PPP": "syscall", "syscall.ETH_P_WCCP": "syscall", "syscall.ETH_P_X25": "syscall", "syscall.ETIME": "syscall", "syscall.ETIMEDOUT": "syscall", "syscall.ETOOMANYREFS": "syscall", "syscall.ETXTBSY": "syscall", "syscall.EUCLEAN": "syscall", "syscall.EUNATCH": "syscall", "syscall.EUSERS": "syscall", "syscall.EVFILT_AIO": "syscall", "syscall.EVFILT_FS": "syscall", "syscall.EVFILT_LIO": "syscall", "syscall.EVFILT_MACHPORT": "syscall", "syscall.EVFILT_PROC": "syscall", "syscall.EVFILT_READ": "syscall", "syscall.EVFILT_SIGNAL": "syscall", "syscall.EVFILT_SYSCOUNT": "syscall", "syscall.EVFILT_THREADMARKER": "syscall", "syscall.EVFILT_TIMER": "syscall", "syscall.EVFILT_USER": "syscall", "syscall.EVFILT_VM": "syscall", "syscall.EVFILT_VNODE": "syscall", "syscall.EVFILT_WRITE": "syscall", "syscall.EV_ADD": "syscall", "syscall.EV_CLEAR": "syscall", "syscall.EV_DELETE": "syscall", "syscall.EV_DISABLE": "syscall", "syscall.EV_DISPATCH": "syscall", "syscall.EV_DROP": "syscall", "syscall.EV_ENABLE": "syscall", "syscall.EV_EOF": "syscall", "syscall.EV_ERROR": "syscall", "syscall.EV_FLAG0": "syscall", "syscall.EV_FLAG1": "syscall", "syscall.EV_ONESHOT": "syscall", "syscall.EV_OOBAND": "syscall", "syscall.EV_POLL": "syscall", "syscall.EV_RECEIPT": "syscall", "syscall.EV_SYSFLAGS": "syscall", "syscall.EWINDOWS": "syscall", "syscall.EWOULDBLOCK": "syscall", "syscall.EXDEV": "syscall", "syscall.EXFULL": "syscall", "syscall.EXTA": "syscall", "syscall.EXTB": "syscall", "syscall.EXTPROC": "syscall", "syscall.Environ": "syscall", "syscall.EpollCreate": "syscall", "syscall.EpollCreate1": "syscall", "syscall.EpollCtl": "syscall", "syscall.EpollEvent": "syscall", "syscall.EpollWait": "syscall", "syscall.Errno": "syscall", "syscall.EscapeArg": "syscall", "syscall.Exchangedata": "syscall", "syscall.Exec": "syscall", "syscall.Exit": "syscall", "syscall.ExitProcess": "syscall", "syscall.FD_CLOEXEC": "syscall", "syscall.FD_SETSIZE": "syscall", "syscall.FILE_ACTION_ADDED": "syscall", "syscall.FILE_ACTION_MODIFIED": "syscall", "syscall.FILE_ACTION_REMOVED": "syscall", "syscall.FILE_ACTION_RENAMED_NEW_NAME": "syscall", "syscall.FILE_ACTION_RENAMED_OLD_NAME": "syscall", "syscall.FILE_APPEND_DATA": "syscall", "syscall.FILE_ATTRIBUTE_ARCHIVE": "syscall", "syscall.FILE_ATTRIBUTE_DIRECTORY": "syscall", "syscall.FILE_ATTRIBUTE_HIDDEN": "syscall", "syscall.FILE_ATTRIBUTE_NORMAL": "syscall", "syscall.FILE_ATTRIBUTE_READONLY": "syscall", "syscall.FILE_ATTRIBUTE_REPARSE_POINT": "syscall", "syscall.FILE_ATTRIBUTE_SYSTEM": "syscall", "syscall.FILE_BEGIN": "syscall", "syscall.FILE_CURRENT": "syscall", "syscall.FILE_END": "syscall", "syscall.FILE_FLAG_BACKUP_SEMANTICS": "syscall", "syscall.FILE_FLAG_OPEN_REPARSE_POINT": "syscall", "syscall.FILE_FLAG_OVERLAPPED": "syscall", "syscall.FILE_LIST_DIRECTORY": "syscall", "syscall.FILE_MAP_COPY": "syscall", "syscall.FILE_MAP_EXECUTE": "syscall", "syscall.FILE_MAP_READ": "syscall", "syscall.FILE_MAP_WRITE": "syscall", "syscall.FILE_NOTIFY_CHANGE_ATTRIBUTES": "syscall", "syscall.FILE_NOTIFY_CHANGE_CREATION": "syscall", "syscall.FILE_NOTIFY_CHANGE_DIR_NAME": "syscall", "syscall.FILE_NOTIFY_CHANGE_FILE_NAME": "syscall", "syscall.FILE_NOTIFY_CHANGE_LAST_ACCESS": "syscall", "syscall.FILE_NOTIFY_CHANGE_LAST_WRITE": "syscall", "syscall.FILE_NOTIFY_CHANGE_SIZE": "syscall", "syscall.FILE_SHARE_DELETE": "syscall", "syscall.FILE_SHARE_READ": "syscall", "syscall.FILE_SHARE_WRITE": "syscall", "syscall.FILE_SKIP_COMPLETION_PORT_ON_SUCCESS": "syscall", "syscall.FILE_SKIP_SET_EVENT_ON_HANDLE": "syscall", "syscall.FILE_TYPE_CHAR": "syscall", "syscall.FILE_TYPE_DISK": "syscall", "syscall.FILE_TYPE_PIPE": "syscall", "syscall.FILE_TYPE_REMOTE": "syscall", "syscall.FILE_TYPE_UNKNOWN": "syscall", "syscall.FILE_WRITE_ATTRIBUTES": "syscall", "syscall.FLUSHO": "syscall", "syscall.FORMAT_MESSAGE_ALLOCATE_BUFFER": "syscall", "syscall.FORMAT_MESSAGE_ARGUMENT_ARRAY": "syscall", "syscall.FORMAT_MESSAGE_FROM_HMODULE": "syscall", "syscall.FORMAT_MESSAGE_FROM_STRING": "syscall", "syscall.FORMAT_MESSAGE_FROM_SYSTEM": "syscall", "syscall.FORMAT_MESSAGE_IGNORE_INSERTS": "syscall", "syscall.FORMAT_MESSAGE_MAX_WIDTH_MASK": "syscall", "syscall.FSCTL_GET_REPARSE_POINT": "syscall", "syscall.F_ADDFILESIGS": "syscall", "syscall.F_ADDSIGS": "syscall", "syscall.F_ALLOCATEALL": "syscall", "syscall.F_ALLOCATECONTIG": "syscall", "syscall.F_CANCEL": "syscall", "syscall.F_CHKCLEAN": "syscall", "syscall.F_CLOSEM": "syscall", "syscall.F_DUP2FD": "syscall", "syscall.F_DUP2FD_CLOEXEC": "syscall", "syscall.F_DUPFD": "syscall", "syscall.F_DUPFD_CLOEXEC": "syscall", "syscall.F_EXLCK": "syscall", "syscall.F_FLUSH_DATA": "syscall", "syscall.F_FREEZE_FS": "syscall", "syscall.F_FSCTL": "syscall", "syscall.F_FSDIRMASK": "syscall", "syscall.F_FSIN": "syscall", "syscall.F_FSINOUT": "syscall", "syscall.F_FSOUT": "syscall", "syscall.F_FSPRIV": "syscall", "syscall.F_FSVOID": "syscall", "syscall.F_FULLFSYNC": "syscall", "syscall.F_GETFD": "syscall", "syscall.F_GETFL": "syscall", "syscall.F_GETLEASE": "syscall", "syscall.F_GETLK": "syscall", "syscall.F_GETLK64": "syscall", "syscall.F_GETLKPID": "syscall", "syscall.F_GETNOSIGPIPE": "syscall", "syscall.F_GETOWN": "syscall", "syscall.F_GETOWN_EX": "syscall", "syscall.F_GETPATH": "syscall", "syscall.F_GETPATH_MTMINFO": "syscall", "syscall.F_GETPIPE_SZ": "syscall", "syscall.F_GETPROTECTIONCLASS": "syscall", "syscall.F_GETSIG": "syscall", "syscall.F_GLOBAL_NOCACHE": "syscall", "syscall.F_LOCK": "syscall", "syscall.F_LOG2PHYS": "syscall", "syscall.F_LOG2PHYS_EXT": "syscall", "syscall.F_MARKDEPENDENCY": "syscall", "syscall.F_MAXFD": "syscall", "syscall.F_NOCACHE": "syscall", "syscall.F_NODIRECT": "syscall", "syscall.F_NOTIFY": "syscall", "syscall.F_OGETLK": "syscall", "syscall.F_OK": "syscall", "syscall.F_OSETLK": "syscall", "syscall.F_OSETLKW": "syscall", "syscall.F_PARAM_MASK": "syscall", "syscall.F_PARAM_MAX": "syscall", "syscall.F_PATHPKG_CHECK": "syscall", "syscall.F_PEOFPOSMODE": "syscall", "syscall.F_PREALLOCATE": "syscall", "syscall.F_RDADVISE": "syscall", "syscall.F_RDAHEAD": "syscall", "syscall.F_RDLCK": "syscall", "syscall.F_READAHEAD": "syscall", "syscall.F_READBOOTSTRAP": "syscall", "syscall.F_SETBACKINGSTORE": "syscall", "syscall.F_SETFD": "syscall", "syscall.F_SETFL": "syscall", "syscall.F_SETLEASE": "syscall", "syscall.F_SETLK": "syscall", "syscall.F_SETLK64": "syscall", "syscall.F_SETLKW": "syscall", "syscall.F_SETLKW64": "syscall", "syscall.F_SETLK_REMOTE": "syscall", "syscall.F_SETNOSIGPIPE": "syscall", "syscall.F_SETOWN": "syscall", "syscall.F_SETOWN_EX": "syscall", "syscall.F_SETPIPE_SZ": "syscall", "syscall.F_SETPROTECTIONCLASS": "syscall", "syscall.F_SETSIG": "syscall", "syscall.F_SETSIZE": "syscall", "syscall.F_SHLCK": "syscall", "syscall.F_TEST": "syscall", "syscall.F_THAW_FS": "syscall", "syscall.F_TLOCK": "syscall", "syscall.F_ULOCK": "syscall", "syscall.F_UNLCK": "syscall", "syscall.F_UNLCKSYS": "syscall", "syscall.F_VOLPOSMODE": "syscall", "syscall.F_WRITEBOOTSTRAP": "syscall", "syscall.F_WRLCK": "syscall", "syscall.Faccessat": "syscall", "syscall.Fallocate": "syscall", "syscall.Fbootstraptransfer_t": "syscall", "syscall.Fchdir": "syscall", "syscall.Fchflags": "syscall", "syscall.Fchmod": "syscall", "syscall.Fchmodat": "syscall", "syscall.Fchown": "syscall", "syscall.Fchownat": "syscall", "syscall.FcntlFlock": "syscall", "syscall.FdSet": "syscall", "syscall.Fdatasync": "syscall", "syscall.FileNotifyInformation": "syscall", "syscall.Filetime": "syscall", "syscall.FindClose": "syscall", "syscall.FindFirstFile": "syscall", "syscall.FindNextFile": "syscall", "syscall.Flock": "syscall", "syscall.Flock_t": "syscall", "syscall.FlushBpf": "syscall", "syscall.FlushFileBuffers": "syscall", "syscall.FlushViewOfFile": "syscall", "syscall.ForkExec": "syscall", "syscall.ForkLock": "syscall", "syscall.FormatMessage": "syscall", "syscall.Fpathconf": "syscall", "syscall.FreeAddrInfoW": "syscall", "syscall.FreeEnvironmentStrings": "syscall", "syscall.FreeLibrary": "syscall", "syscall.Fsid": "syscall", "syscall.Fstat": "syscall", "syscall.Fstatfs": "syscall", "syscall.Fstore_t": "syscall", "syscall.Fsync": "syscall", "syscall.Ftruncate": "syscall", "syscall.FullPath": "syscall", "syscall.Futimes": "syscall", "syscall.Futimesat": "syscall", "syscall.GENERIC_ALL": "syscall", "syscall.GENERIC_EXECUTE": "syscall", "syscall.GENERIC_READ": "syscall", "syscall.GENERIC_WRITE": "syscall", "syscall.GUID": "syscall", "syscall.GetAcceptExSockaddrs": "syscall", "syscall.GetAdaptersInfo": "syscall", "syscall.GetAddrInfoW": "syscall", "syscall.GetCommandLine": "syscall", "syscall.GetComputerName": "syscall", "syscall.GetConsoleMode": "syscall", "syscall.GetCurrentDirectory": "syscall", "syscall.GetCurrentProcess": "syscall", "syscall.GetEnvironmentStrings": "syscall", "syscall.GetEnvironmentVariable": "syscall", "syscall.GetExitCodeProcess": "syscall", "syscall.GetFileAttributes": "syscall", "syscall.GetFileAttributesEx": "syscall", "syscall.GetFileExInfoStandard": "syscall", "syscall.GetFileExMaxInfoLevel": "syscall", "syscall.GetFileInformationByHandle": "syscall", "syscall.GetFileType": "syscall", "syscall.GetFullPathName": "syscall", "syscall.GetHostByName": "syscall", "syscall.GetIfEntry": "syscall", "syscall.GetLastError": "syscall", "syscall.GetLengthSid": "syscall", "syscall.GetLongPathName": "syscall", "syscall.GetProcAddress": "syscall", "syscall.GetProcessTimes": "syscall", "syscall.GetProtoByName": "syscall", "syscall.GetQueuedCompletionStatus": "syscall", "syscall.GetServByName": "syscall", "syscall.GetShortPathName": "syscall", "syscall.GetStartupInfo": "syscall", "syscall.GetStdHandle": "syscall", "syscall.GetSystemTimeAsFileTime": "syscall", "syscall.GetTempPath": "syscall", "syscall.GetTimeZoneInformation": "syscall", "syscall.GetTokenInformation": "syscall", "syscall.GetUserNameEx": "syscall", "syscall.GetUserProfileDirectory": "syscall", "syscall.GetVersion": "syscall", "syscall.Getcwd": "syscall", "syscall.Getdents": "syscall", "syscall.Getdirentries": "syscall", "syscall.Getdtablesize": "syscall", "syscall.Getegid": "syscall", "syscall.Getenv": "syscall", "syscall.Geteuid": "syscall", "syscall.Getfsstat": "syscall", "syscall.Getgid": "syscall", "syscall.Getgroups": "syscall", "syscall.Getpagesize": "syscall", "syscall.Getpeername": "syscall", "syscall.Getpgid": "syscall", "syscall.Getpgrp": "syscall", "syscall.Getpid": "syscall", "syscall.Getppid": "syscall", "syscall.Getpriority": "syscall", "syscall.Getrlimit": "syscall", "syscall.Getrusage": "syscall", "syscall.Getsid": "syscall", "syscall.Getsockname": "syscall", "syscall.Getsockopt": "syscall", "syscall.GetsockoptByte": "syscall", "syscall.GetsockoptICMPv6Filter": "syscall", "syscall.GetsockoptIPMreq": "syscall", "syscall.GetsockoptIPMreqn": "syscall", "syscall.GetsockoptIPv6MTUInfo": "syscall", "syscall.GetsockoptIPv6Mreq": "syscall", "syscall.GetsockoptInet4Addr": "syscall", "syscall.GetsockoptInt": "syscall", "syscall.GetsockoptUcred": "syscall", "syscall.Gettid": "syscall", "syscall.Gettimeofday": "syscall", "syscall.Getuid": "syscall", "syscall.Getwd": "syscall", "syscall.Getxattr": "syscall", "syscall.HANDLE_FLAG_INHERIT": "syscall", "syscall.HKEY_CLASSES_ROOT": "syscall", "syscall.HKEY_CURRENT_CONFIG": "syscall", "syscall.HKEY_CURRENT_USER": "syscall", "syscall.HKEY_DYN_DATA": "syscall", "syscall.HKEY_LOCAL_MACHINE": "syscall", "syscall.HKEY_PERFORMANCE_DATA": "syscall", "syscall.HKEY_USERS": "syscall", "syscall.HUPCL": "syscall", "syscall.Handle": "syscall", "syscall.Hostent": "syscall", "syscall.ICANON": "syscall", "syscall.ICMP6_FILTER": "syscall", "syscall.ICMPV6_FILTER": "syscall", "syscall.ICMPv6Filter": "syscall", "syscall.ICRNL": "syscall", "syscall.IEXTEN": "syscall", "syscall.IFAN_ARRIVAL": "syscall", "syscall.IFAN_DEPARTURE": "syscall", "syscall.IFA_ADDRESS": "syscall", "syscall.IFA_ANYCAST": "syscall", "syscall.IFA_BROADCAST": "syscall", "syscall.IFA_CACHEINFO": "syscall", "syscall.IFA_F_DADFAILED": "syscall", "syscall.IFA_F_DEPRECATED": "syscall", "syscall.IFA_F_HOMEADDRESS": "syscall", "syscall.IFA_F_NODAD": "syscall", "syscall.IFA_F_OPTIMISTIC": "syscall", "syscall.IFA_F_PERMANENT": "syscall", "syscall.IFA_F_SECONDARY": "syscall", "syscall.IFA_F_TEMPORARY": "syscall", "syscall.IFA_F_TENTATIVE": "syscall", "syscall.IFA_LABEL": "syscall", "syscall.IFA_LOCAL": "syscall", "syscall.IFA_MAX": "syscall", "syscall.IFA_MULTICAST": "syscall", "syscall.IFA_ROUTE": "syscall", "syscall.IFA_UNSPEC": "syscall", "syscall.IFF_ALLMULTI": "syscall", "syscall.IFF_ALTPHYS": "syscall", "syscall.IFF_AUTOMEDIA": "syscall", "syscall.IFF_BROADCAST": "syscall", "syscall.IFF_CANTCHANGE": "syscall", "syscall.IFF_CANTCONFIG": "syscall", "syscall.IFF_DEBUG": "syscall", "syscall.IFF_DRV_OACTIVE": "syscall", "syscall.IFF_DRV_RUNNING": "syscall", "syscall.IFF_DYING": "syscall", "syscall.IFF_DYNAMIC": "syscall", "syscall.IFF_LINK0": "syscall", "syscall.IFF_LINK1": "syscall", "syscall.IFF_LINK2": "syscall", "syscall.IFF_LOOPBACK": "syscall", "syscall.IFF_MASTER": "syscall", "syscall.IFF_MONITOR": "syscall", "syscall.IFF_MULTICAST": "syscall", "syscall.IFF_NOARP": "syscall", "syscall.IFF_NOTRAILERS": "syscall", "syscall.IFF_NO_PI": "syscall", "syscall.IFF_OACTIVE": "syscall", "syscall.IFF_ONE_QUEUE": "syscall", "syscall.IFF_POINTOPOINT": "syscall", "syscall.IFF_POINTTOPOINT": "syscall", "syscall.IFF_PORTSEL": "syscall", "syscall.IFF_PPROMISC": "syscall", "syscall.IFF_PROMISC": "syscall", "syscall.IFF_RENAMING": "syscall", "syscall.IFF_RUNNING": "syscall", "syscall.IFF_SIMPLEX": "syscall", "syscall.IFF_SLAVE": "syscall", "syscall.IFF_SMART": "syscall", "syscall.IFF_STATICARP": "syscall", "syscall.IFF_TAP": "syscall", "syscall.IFF_TUN": "syscall", "syscall.IFF_TUN_EXCL": "syscall", "syscall.IFF_UP": "syscall", "syscall.IFF_VNET_HDR": "syscall", "syscall.IFLA_ADDRESS": "syscall", "syscall.IFLA_BROADCAST": "syscall", "syscall.IFLA_COST": "syscall", "syscall.IFLA_IFALIAS": "syscall", "syscall.IFLA_IFNAME": "syscall", "syscall.IFLA_LINK": "syscall", "syscall.IFLA_LINKINFO": "syscall", "syscall.IFLA_LINKMODE": "syscall", "syscall.IFLA_MAP": "syscall", "syscall.IFLA_MASTER": "syscall", "syscall.IFLA_MAX": "syscall", "syscall.IFLA_MTU": "syscall", "syscall.IFLA_NET_NS_PID": "syscall", "syscall.IFLA_OPERSTATE": "syscall", "syscall.IFLA_PRIORITY": "syscall", "syscall.IFLA_PROTINFO": "syscall", "syscall.IFLA_QDISC": "syscall", "syscall.IFLA_STATS": "syscall", "syscall.IFLA_TXQLEN": "syscall", "syscall.IFLA_UNSPEC": "syscall", "syscall.IFLA_WEIGHT": "syscall", "syscall.IFLA_WIRELESS": "syscall", "syscall.IFNAMSIZ": "syscall", "syscall.IFT_1822": "syscall", "syscall.IFT_A12MPPSWITCH": "syscall", "syscall.IFT_AAL2": "syscall", "syscall.IFT_AAL5": "syscall", "syscall.IFT_ADSL": "syscall", "syscall.IFT_AFLANE8023": "syscall", "syscall.IFT_AFLANE8025": "syscall", "syscall.IFT_ARAP": "syscall", "syscall.IFT_ARCNET": "syscall", "syscall.IFT_ARCNETPLUS": "syscall", "syscall.IFT_ASYNC": "syscall", "syscall.IFT_ATM": "syscall", "syscall.IFT_ATMDXI": "syscall", "syscall.IFT_ATMFUNI": "syscall", "syscall.IFT_ATMIMA": "syscall", "syscall.IFT_ATMLOGICAL": "syscall", "syscall.IFT_ATMRADIO": "syscall", "syscall.IFT_ATMSUBINTERFACE": "syscall", "syscall.IFT_ATMVCIENDPT": "syscall", "syscall.IFT_ATMVIRTUAL": "syscall", "syscall.IFT_BGPPOLICYACCOUNTING": "syscall", "syscall.IFT_BLUETOOTH": "syscall", "syscall.IFT_BRIDGE": "syscall", "syscall.IFT_BSC": "syscall", "syscall.IFT_CARP": "syscall", "syscall.IFT_CCTEMUL": "syscall", "syscall.IFT_CELLULAR": "syscall", "syscall.IFT_CEPT": "syscall", "syscall.IFT_CES": "syscall", "syscall.IFT_CHANNEL": "syscall", "syscall.IFT_CNR": "syscall", "syscall.IFT_COFFEE": "syscall", "syscall.IFT_COMPOSITELINK": "syscall", "syscall.IFT_DCN": "syscall", "syscall.IFT_DIGITALPOWERLINE": "syscall", "syscall.IFT_DIGITALWRAPPEROVERHEADCHANNEL": "syscall", "syscall.IFT_DLSW": "syscall", "syscall.IFT_DOCSCABLEDOWNSTREAM": "syscall", "syscall.IFT_DOCSCABLEMACLAYER": "syscall", "syscall.IFT_DOCSCABLEUPSTREAM": "syscall", "syscall.IFT_DOCSCABLEUPSTREAMCHANNEL": "syscall", "syscall.IFT_DS0": "syscall", "syscall.IFT_DS0BUNDLE": "syscall", "syscall.IFT_DS1FDL": "syscall", "syscall.IFT_DS3": "syscall", "syscall.IFT_DTM": "syscall", "syscall.IFT_DUMMY": "syscall", "syscall.IFT_DVBASILN": "syscall", "syscall.IFT_DVBASIOUT": "syscall", "syscall.IFT_DVBRCCDOWNSTREAM": "syscall", "syscall.IFT_DVBRCCMACLAYER": "syscall", "syscall.IFT_DVBRCCUPSTREAM": "syscall", "syscall.IFT_ECONET": "syscall", "syscall.IFT_ENC": "syscall", "syscall.IFT_EON": "syscall", "syscall.IFT_EPLRS": "syscall", "syscall.IFT_ESCON": "syscall", "syscall.IFT_ETHER": "syscall", "syscall.IFT_FAITH": "syscall", "syscall.IFT_FAST": "syscall", "syscall.IFT_FASTETHER": "syscall", "syscall.IFT_FASTETHERFX": "syscall", "syscall.IFT_FDDI": "syscall", "syscall.IFT_FIBRECHANNEL": "syscall", "syscall.IFT_FRAMERELAYINTERCONNECT": "syscall", "syscall.IFT_FRAMERELAYMPI": "syscall", "syscall.IFT_FRDLCIENDPT": "syscall", "syscall.IFT_FRELAY": "syscall", "syscall.IFT_FRELAYDCE": "syscall", "syscall.IFT_FRF16MFRBUNDLE": "syscall", "syscall.IFT_FRFORWARD": "syscall", "syscall.IFT_G703AT2MB": "syscall", "syscall.IFT_G703AT64K": "syscall", "syscall.IFT_GIF": "syscall", "syscall.IFT_GIGABITETHERNET": "syscall", "syscall.IFT_GR303IDT": "syscall", "syscall.IFT_GR303RDT": "syscall", "syscall.IFT_H323GATEKEEPER": "syscall", "syscall.IFT_H323PROXY": "syscall", "syscall.IFT_HDH1822": "syscall", "syscall.IFT_HDLC": "syscall", "syscall.IFT_HDSL2": "syscall", "syscall.IFT_HIPERLAN2": "syscall", "syscall.IFT_HIPPI": "syscall", "syscall.IFT_HIPPIINTERFACE": "syscall", "syscall.IFT_HOSTPAD": "syscall", "syscall.IFT_HSSI": "syscall", "syscall.IFT_HY": "syscall", "syscall.IFT_IBM370PARCHAN": "syscall", "syscall.IFT_IDSL": "syscall", "syscall.IFT_IEEE1394": "syscall", "syscall.IFT_IEEE80211": "syscall", "syscall.IFT_IEEE80212": "syscall", "syscall.IFT_IEEE8023ADLAG": "syscall", "syscall.IFT_IFGSN": "syscall", "syscall.IFT_IMT": "syscall", "syscall.IFT_INFINIBAND": "syscall", "syscall.IFT_INTERLEAVE": "syscall", "syscall.IFT_IP": "syscall", "syscall.IFT_IPFORWARD": "syscall", "syscall.IFT_IPOVERATM": "syscall", "syscall.IFT_IPOVERCDLC": "syscall", "syscall.IFT_IPOVERCLAW": "syscall", "syscall.IFT_IPSWITCH": "syscall", "syscall.IFT_IPXIP": "syscall", "syscall.IFT_ISDN": "syscall", "syscall.IFT_ISDNBASIC": "syscall", "syscall.IFT_ISDNPRIMARY": "syscall", "syscall.IFT_ISDNS": "syscall", "syscall.IFT_ISDNU": "syscall", "syscall.IFT_ISO88022LLC": "syscall", "syscall.IFT_ISO88023": "syscall", "syscall.IFT_ISO88024": "syscall", "syscall.IFT_ISO88025": "syscall", "syscall.IFT_ISO88025CRFPINT": "syscall", "syscall.IFT_ISO88025DTR": "syscall", "syscall.IFT_ISO88025FIBER": "syscall", "syscall.IFT_ISO88026": "syscall", "syscall.IFT_ISUP": "syscall", "syscall.IFT_L2VLAN": "syscall", "syscall.IFT_L3IPVLAN": "syscall", "syscall.IFT_L3IPXVLAN": "syscall", "syscall.IFT_LAPB": "syscall", "syscall.IFT_LAPD": "syscall", "syscall.IFT_LAPF": "syscall", "syscall.IFT_LINEGROUP": "syscall", "syscall.IFT_LOCALTALK": "syscall", "syscall.IFT_LOOP": "syscall", "syscall.IFT_MEDIAMAILOVERIP": "syscall", "syscall.IFT_MFSIGLINK": "syscall", "syscall.IFT_MIOX25": "syscall", "syscall.IFT_MODEM": "syscall", "syscall.IFT_MPC": "syscall", "syscall.IFT_MPLS": "syscall", "syscall.IFT_MPLSTUNNEL": "syscall", "syscall.IFT_MSDSL": "syscall", "syscall.IFT_MVL": "syscall", "syscall.IFT_MYRINET": "syscall", "syscall.IFT_NFAS": "syscall", "syscall.IFT_NSIP": "syscall", "syscall.IFT_OPTICALCHANNEL": "syscall", "syscall.IFT_OPTICALTRANSPORT": "syscall", "syscall.IFT_OTHER": "syscall", "syscall.IFT_P10": "syscall", "syscall.IFT_P80": "syscall", "syscall.IFT_PARA": "syscall", "syscall.IFT_PDP": "syscall", "syscall.IFT_PFLOG": "syscall", "syscall.IFT_PFLOW": "syscall", "syscall.IFT_PFSYNC": "syscall", "syscall.IFT_PLC": "syscall", "syscall.IFT_PON155": "syscall", "syscall.IFT_PON622": "syscall", "syscall.IFT_POS": "syscall", "syscall.IFT_PPP": "syscall", "syscall.IFT_PPPMULTILINKBUNDLE": "syscall", "syscall.IFT_PROPATM": "syscall", "syscall.IFT_PROPBWAP2MP": "syscall", "syscall.IFT_PROPCNLS": "syscall", "syscall.IFT_PROPDOCSWIRELESSDOWNSTREAM": "syscall", "syscall.IFT_PROPDOCSWIRELESSMACLAYER": "syscall", "syscall.IFT_PROPDOCSWIRELESSUPSTREAM": "syscall", "syscall.IFT_PROPMUX": "syscall", "syscall.IFT_PROPVIRTUAL": "syscall", "syscall.IFT_PROPWIRELESSP2P": "syscall", "syscall.IFT_PTPSERIAL": "syscall", "syscall.IFT_PVC": "syscall", "syscall.IFT_Q2931": "syscall", "syscall.IFT_QLLC": "syscall", "syscall.IFT_RADIOMAC": "syscall", "syscall.IFT_RADSL": "syscall", "syscall.IFT_REACHDSL": "syscall", "syscall.IFT_RFC1483": "syscall", "syscall.IFT_RS232": "syscall", "syscall.IFT_RSRB": "syscall", "syscall.IFT_SDLC": "syscall", "syscall.IFT_SDSL": "syscall", "syscall.IFT_SHDSL": "syscall", "syscall.IFT_SIP": "syscall", "syscall.IFT_SIPSIG": "syscall", "syscall.IFT_SIPTG": "syscall", "syscall.IFT_SLIP": "syscall", "syscall.IFT_SMDSDXI": "syscall", "syscall.IFT_SMDSICIP": "syscall", "syscall.IFT_SONET": "syscall", "syscall.IFT_SONETOVERHEADCHANNEL": "syscall", "syscall.IFT_SONETPATH": "syscall", "syscall.IFT_SONETVT": "syscall", "syscall.IFT_SRP": "syscall", "syscall.IFT_SS7SIGLINK": "syscall", "syscall.IFT_STACKTOSTACK": "syscall", "syscall.IFT_STARLAN": "syscall", "syscall.IFT_STF": "syscall", "syscall.IFT_T1": "syscall", "syscall.IFT_TDLC": "syscall", "syscall.IFT_TELINK": "syscall", "syscall.IFT_TERMPAD": "syscall", "syscall.IFT_TR008": "syscall", "syscall.IFT_TRANSPHDLC": "syscall", "syscall.IFT_TUNNEL": "syscall", "syscall.IFT_ULTRA": "syscall", "syscall.IFT_USB": "syscall", "syscall.IFT_V11": "syscall", "syscall.IFT_V35": "syscall", "syscall.IFT_V36": "syscall", "syscall.IFT_V37": "syscall", "syscall.IFT_VDSL": "syscall", "syscall.IFT_VIRTUALIPADDRESS": "syscall", "syscall.IFT_VIRTUALTG": "syscall", "syscall.IFT_VOICEDID": "syscall", "syscall.IFT_VOICEEM": "syscall", "syscall.IFT_VOICEEMFGD": "syscall", "syscall.IFT_VOICEENCAP": "syscall", "syscall.IFT_VOICEFGDEANA": "syscall", "syscall.IFT_VOICEFXO": "syscall", "syscall.IFT_VOICEFXS": "syscall", "syscall.IFT_VOICEOVERATM": "syscall", "syscall.IFT_VOICEOVERCABLE": "syscall", "syscall.IFT_VOICEOVERFRAMERELAY": "syscall", "syscall.IFT_VOICEOVERIP": "syscall", "syscall.IFT_X213": "syscall", "syscall.IFT_X25": "syscall", "syscall.IFT_X25DDN": "syscall", "syscall.IFT_X25HUNTGROUP": "syscall", "syscall.IFT_X25MLP": "syscall", "syscall.IFT_X25PLE": "syscall", "syscall.IFT_XETHER": "syscall", "syscall.IGNBRK": "syscall", "syscall.IGNCR": "syscall", "syscall.IGNORE": "syscall", "syscall.IGNPAR": "syscall", "syscall.IMAXBEL": "syscall", "syscall.INFINITE": "syscall", "syscall.INLCR": "syscall", "syscall.INPCK": "syscall", "syscall.INVALID_FILE_ATTRIBUTES": "syscall", "syscall.IN_ACCESS": "syscall", "syscall.IN_ALL_EVENTS": "syscall", "syscall.IN_ATTRIB": "syscall", "syscall.IN_CLASSA_HOST": "syscall", "syscall.IN_CLASSA_MAX": "syscall", "syscall.IN_CLASSA_NET": "syscall", "syscall.IN_CLASSA_NSHIFT": "syscall", "syscall.IN_CLASSB_HOST": "syscall", "syscall.IN_CLASSB_MAX": "syscall", "syscall.IN_CLASSB_NET": "syscall", "syscall.IN_CLASSB_NSHIFT": "syscall", "syscall.IN_CLASSC_HOST": "syscall", "syscall.IN_CLASSC_NET": "syscall", "syscall.IN_CLASSC_NSHIFT": "syscall", "syscall.IN_CLASSD_HOST": "syscall", "syscall.IN_CLASSD_NET": "syscall", "syscall.IN_CLASSD_NSHIFT": "syscall", "syscall.IN_CLOEXEC": "syscall", "syscall.IN_CLOSE": "syscall", "syscall.IN_CLOSE_NOWRITE": "syscall", "syscall.IN_CLOSE_WRITE": "syscall", "syscall.IN_CREATE": "syscall", "syscall.IN_DELETE": "syscall", "syscall.IN_DELETE_SELF": "syscall", "syscall.IN_DONT_FOLLOW": "syscall", "syscall.IN_EXCL_UNLINK": "syscall", "syscall.IN_IGNORED": "syscall", "syscall.IN_ISDIR": "syscall", "syscall.IN_LINKLOCALNETNUM": "syscall", "syscall.IN_LOOPBACKNET": "syscall", "syscall.IN_MASK_ADD": "syscall", "syscall.IN_MODIFY": "syscall", "syscall.IN_MOVE": "syscall", "syscall.IN_MOVED_FROM": "syscall", "syscall.IN_MOVED_TO": "syscall", "syscall.IN_MOVE_SELF": "syscall", "syscall.IN_NONBLOCK": "syscall", "syscall.IN_ONESHOT": "syscall", "syscall.IN_ONLYDIR": "syscall", "syscall.IN_OPEN": "syscall", "syscall.IN_Q_OVERFLOW": "syscall", "syscall.IN_RFC3021_HOST": "syscall", "syscall.IN_RFC3021_MASK": "syscall", "syscall.IN_RFC3021_NET": "syscall", "syscall.IN_RFC3021_NSHIFT": "syscall", "syscall.IN_UNMOUNT": "syscall", "syscall.IOC_IN": "syscall", "syscall.IOC_INOUT": "syscall", "syscall.IOC_OUT": "syscall", "syscall.IOC_VENDOR": "syscall", "syscall.IOC_WS2": "syscall", "syscall.IO_REPARSE_TAG_SYMLINK": "syscall", "syscall.IPMreq": "syscall", "syscall.IPMreqn": "syscall", "syscall.IPPROTO_3PC": "syscall", "syscall.IPPROTO_ADFS": "syscall", "syscall.IPPROTO_AH": "syscall", "syscall.IPPROTO_AHIP": "syscall", "syscall.IPPROTO_APES": "syscall", "syscall.IPPROTO_ARGUS": "syscall", "syscall.IPPROTO_AX25": "syscall", "syscall.IPPROTO_BHA": "syscall", "syscall.IPPROTO_BLT": "syscall", "syscall.IPPROTO_BRSATMON": "syscall", "syscall.IPPROTO_CARP": "syscall", "syscall.IPPROTO_CFTP": "syscall", "syscall.IPPROTO_CHAOS": "syscall", "syscall.IPPROTO_CMTP": "syscall", "syscall.IPPROTO_COMP": "syscall", "syscall.IPPROTO_CPHB": "syscall", "syscall.IPPROTO_CPNX": "syscall", "syscall.IPPROTO_DCCP": "syscall", "syscall.IPPROTO_DDP": "syscall", "syscall.IPPROTO_DGP": "syscall", "syscall.IPPROTO_DIVERT": "syscall", "syscall.IPPROTO_DIVERT_INIT": "syscall", "syscall.IPPROTO_DIVERT_RESP": "syscall", "syscall.IPPROTO_DONE": "syscall", "syscall.IPPROTO_DSTOPTS": "syscall", "syscall.IPPROTO_EGP": "syscall", "syscall.IPPROTO_EMCON": "syscall", "syscall.IPPROTO_ENCAP": "syscall", "syscall.IPPROTO_EON": "syscall", "syscall.IPPROTO_ESP": "syscall", "syscall.IPPROTO_ETHERIP": "syscall", "syscall.IPPROTO_FRAGMENT": "syscall", "syscall.IPPROTO_GGP": "syscall", "syscall.IPPROTO_GMTP": "syscall", "syscall.IPPROTO_GRE": "syscall", "syscall.IPPROTO_HELLO": "syscall", "syscall.IPPROTO_HMP": "syscall", "syscall.IPPROTO_HOPOPTS": "syscall", "syscall.IPPROTO_ICMP": "syscall", "syscall.IPPROTO_ICMPV6": "syscall", "syscall.IPPROTO_IDP": "syscall", "syscall.IPPROTO_IDPR": "syscall", "syscall.IPPROTO_IDRP": "syscall", "syscall.IPPROTO_IGMP": "syscall", "syscall.IPPROTO_IGP": "syscall", "syscall.IPPROTO_IGRP": "syscall", "syscall.IPPROTO_IL": "syscall", "syscall.IPPROTO_INLSP": "syscall", "syscall.IPPROTO_INP": "syscall", "syscall.IPPROTO_IP": "syscall", "syscall.IPPROTO_IPCOMP": "syscall", "syscall.IPPROTO_IPCV": "syscall", "syscall.IPPROTO_IPEIP": "syscall", "syscall.IPPROTO_IPIP": "syscall", "syscall.IPPROTO_IPPC": "syscall", "syscall.IPPROTO_IPV4": "syscall", "syscall.IPPROTO_IPV6": "syscall", "syscall.IPPROTO_IPV6_ICMP": "syscall", "syscall.IPPROTO_IRTP": "syscall", "syscall.IPPROTO_KRYPTOLAN": "syscall", "syscall.IPPROTO_LARP": "syscall", "syscall.IPPROTO_LEAF1": "syscall", "syscall.IPPROTO_LEAF2": "syscall", "syscall.IPPROTO_MAX": "syscall", "syscall.IPPROTO_MAXID": "syscall", "syscall.IPPROTO_MEAS": "syscall", "syscall.IPPROTO_MH": "syscall", "syscall.IPPROTO_MHRP": "syscall", "syscall.IPPROTO_MICP": "syscall", "syscall.IPPROTO_MOBILE": "syscall", "syscall.IPPROTO_MPLS": "syscall", "syscall.IPPROTO_MTP": "syscall", "syscall.IPPROTO_MUX": "syscall", "syscall.IPPROTO_ND": "syscall", "syscall.IPPROTO_NHRP": "syscall", "syscall.IPPROTO_NONE": "syscall", "syscall.IPPROTO_NSP": "syscall", "syscall.IPPROTO_NVPII": "syscall", "syscall.IPPROTO_OLD_DIVERT": "syscall", "syscall.IPPROTO_OSPFIGP": "syscall", "syscall.IPPROTO_PFSYNC": "syscall", "syscall.IPPROTO_PGM": "syscall", "syscall.IPPROTO_PIGP": "syscall", "syscall.IPPROTO_PIM": "syscall", "syscall.IPPROTO_PRM": "syscall", "syscall.IPPROTO_PUP": "syscall", "syscall.IPPROTO_PVP": "syscall", "syscall.IPPROTO_RAW": "syscall", "syscall.IPPROTO_RCCMON": "syscall", "syscall.IPPROTO_RDP": "syscall", "syscall.IPPROTO_ROUTING": "syscall", "syscall.IPPROTO_RSVP": "syscall", "syscall.IPPROTO_RVD": "syscall", "syscall.IPPROTO_SATEXPAK": "syscall", "syscall.IPPROTO_SATMON": "syscall", "syscall.IPPROTO_SCCSP": "syscall", "syscall.IPPROTO_SCTP": "syscall", "syscall.IPPROTO_SDRP": "syscall", "syscall.IPPROTO_SEND": "syscall", "syscall.IPPROTO_SEP": "syscall", "syscall.IPPROTO_SKIP": "syscall", "syscall.IPPROTO_SPACER": "syscall", "syscall.IPPROTO_SRPC": "syscall", "syscall.IPPROTO_ST": "syscall", "syscall.IPPROTO_SVMTP": "syscall", "syscall.IPPROTO_SWIPE": "syscall", "syscall.IPPROTO_TCF": "syscall", "syscall.IPPROTO_TCP": "syscall", "syscall.IPPROTO_TLSP": "syscall", "syscall.IPPROTO_TP": "syscall", "syscall.IPPROTO_TPXX": "syscall", "syscall.IPPROTO_TRUNK1": "syscall", "syscall.IPPROTO_TRUNK2": "syscall", "syscall.IPPROTO_TTP": "syscall", "syscall.IPPROTO_UDP": "syscall", "syscall.IPPROTO_UDPLITE": "syscall", "syscall.IPPROTO_VINES": "syscall", "syscall.IPPROTO_VISA": "syscall", "syscall.IPPROTO_VMTP": "syscall", "syscall.IPPROTO_VRRP": "syscall", "syscall.IPPROTO_WBEXPAK": "syscall", "syscall.IPPROTO_WBMON": "syscall", "syscall.IPPROTO_WSN": "syscall", "syscall.IPPROTO_XNET": "syscall", "syscall.IPPROTO_XTP": "syscall", "syscall.IPV6_2292DSTOPTS": "syscall", "syscall.IPV6_2292HOPLIMIT": "syscall", "syscall.IPV6_2292HOPOPTS": "syscall", "syscall.IPV6_2292NEXTHOP": "syscall", "syscall.IPV6_2292PKTINFO": "syscall", "syscall.IPV6_2292PKTOPTIONS": "syscall", "syscall.IPV6_2292RTHDR": "syscall", "syscall.IPV6_ADDRFORM": "syscall", "syscall.IPV6_ADD_MEMBERSHIP": "syscall", "syscall.IPV6_AUTHHDR": "syscall", "syscall.IPV6_AUTH_LEVEL": "syscall", "syscall.IPV6_AUTOFLOWLABEL": "syscall", "syscall.IPV6_BINDANY": "syscall", "syscall.IPV6_BINDV6ONLY": "syscall", "syscall.IPV6_BOUND_IF": "syscall", "syscall.IPV6_CHECKSUM": "syscall", "syscall.IPV6_DEFAULT_MULTICAST_HOPS": "syscall", "syscall.IPV6_DEFAULT_MULTICAST_LOOP": "syscall", "syscall.IPV6_DEFHLIM": "syscall", "syscall.IPV6_DONTFRAG": "syscall", "syscall.IPV6_DROP_MEMBERSHIP": "syscall", "syscall.IPV6_DSTOPTS": "syscall", "syscall.IPV6_ESP_NETWORK_LEVEL": "syscall", "syscall.IPV6_ESP_TRANS_LEVEL": "syscall", "syscall.IPV6_FAITH": "syscall", "syscall.IPV6_FLOWINFO_MASK": "syscall", "syscall.IPV6_FLOWLABEL_MASK": "syscall", "syscall.IPV6_FRAGTTL": "syscall", "syscall.IPV6_FW_ADD": "syscall", "syscall.IPV6_FW_DEL": "syscall", "syscall.IPV6_FW_FLUSH": "syscall", "syscall.IPV6_FW_GET": "syscall", "syscall.IPV6_FW_ZERO": "syscall", "syscall.IPV6_HLIMDEC": "syscall", "syscall.IPV6_HOPLIMIT": "syscall", "syscall.IPV6_HOPOPTS": "syscall", "syscall.IPV6_IPCOMP_LEVEL": "syscall", "syscall.IPV6_IPSEC_POLICY": "syscall", "syscall.IPV6_JOIN_ANYCAST": "syscall", "syscall.IPV6_JOIN_GROUP": "syscall", "syscall.IPV6_LEAVE_ANYCAST": "syscall", "syscall.IPV6_LEAVE_GROUP": "syscall", "syscall.IPV6_MAXHLIM": "syscall", "syscall.IPV6_MAXOPTHDR": "syscall", "syscall.IPV6_MAXPACKET": "syscall", "syscall.IPV6_MAX_GROUP_SRC_FILTER": "syscall", "syscall.IPV6_MAX_MEMBERSHIPS": "syscall", "syscall.IPV6_MAX_SOCK_SRC_FILTER": "syscall", "syscall.IPV6_MIN_MEMBERSHIPS": "syscall", "syscall.IPV6_MMTU": "syscall", "syscall.IPV6_MSFILTER": "syscall", "syscall.IPV6_MTU": "syscall", "syscall.IPV6_MTU_DISCOVER": "syscall", "syscall.IPV6_MULTICAST_HOPS": "syscall", "syscall.IPV6_MULTICAST_IF": "syscall", "syscall.IPV6_MULTICAST_LOOP": "syscall", "syscall.IPV6_NEXTHOP": "syscall", "syscall.IPV6_OPTIONS": "syscall", "syscall.IPV6_PATHMTU": "syscall", "syscall.IPV6_PIPEX": "syscall", "syscall.IPV6_PKTINFO": "syscall", "syscall.IPV6_PMTUDISC_DO": "syscall", "syscall.IPV6_PMTUDISC_DONT": "syscall", "syscall.IPV6_PMTUDISC_PROBE": "syscall", "syscall.IPV6_PMTUDISC_WANT": "syscall", "syscall.IPV6_PORTRANGE": "syscall", "syscall.IPV6_PORTRANGE_DEFAULT": "syscall", "syscall.IPV6_PORTRANGE_HIGH": "syscall", "syscall.IPV6_PORTRANGE_LOW": "syscall", "syscall.IPV6_PREFER_TEMPADDR": "syscall", "syscall.IPV6_RECVDSTOPTS": "syscall", "syscall.IPV6_RECVDSTPORT": "syscall", "syscall.IPV6_RECVERR": "syscall", "syscall.IPV6_RECVHOPLIMIT": "syscall", "syscall.IPV6_RECVHOPOPTS": "syscall", "syscall.IPV6_RECVPATHMTU": "syscall", "syscall.IPV6_RECVPKTINFO": "syscall", "syscall.IPV6_RECVRTHDR": "syscall", "syscall.IPV6_RECVTCLASS": "syscall", "syscall.IPV6_ROUTER_ALERT": "syscall", "syscall.IPV6_RTABLE": "syscall", "syscall.IPV6_RTHDR": "syscall", "syscall.IPV6_RTHDRDSTOPTS": "syscall", "syscall.IPV6_RTHDR_LOOSE": "syscall", "syscall.IPV6_RTHDR_STRICT": "syscall", "syscall.IPV6_RTHDR_TYPE_0": "syscall", "syscall.IPV6_RXDSTOPTS": "syscall", "syscall.IPV6_RXHOPOPTS": "syscall", "syscall.IPV6_SOCKOPT_RESERVED1": "syscall", "syscall.IPV6_TCLASS": "syscall", "syscall.IPV6_UNICAST_HOPS": "syscall", "syscall.IPV6_USE_MIN_MTU": "syscall", "syscall.IPV6_V6ONLY": "syscall", "syscall.IPV6_VERSION": "syscall", "syscall.IPV6_VERSION_MASK": "syscall", "syscall.IPV6_XFRM_POLICY": "syscall", "syscall.IP_ADD_MEMBERSHIP": "syscall", "syscall.IP_ADD_SOURCE_MEMBERSHIP": "syscall", "syscall.IP_AUTH_LEVEL": "syscall", "syscall.IP_BINDANY": "syscall", "syscall.IP_BLOCK_SOURCE": "syscall", "syscall.IP_BOUND_IF": "syscall", "syscall.IP_DEFAULT_MULTICAST_LOOP": "syscall", "syscall.IP_DEFAULT_MULTICAST_TTL": "syscall", "syscall.IP_DF": "syscall", "syscall.IP_DIVERTFL": "syscall", "syscall.IP_DONTFRAG": "syscall", "syscall.IP_DROP_MEMBERSHIP": "syscall", "syscall.IP_DROP_SOURCE_MEMBERSHIP": "syscall", "syscall.IP_DUMMYNET3": "syscall", "syscall.IP_DUMMYNET_CONFIGURE": "syscall", "syscall.IP_DUMMYNET_DEL": "syscall", "syscall.IP_DUMMYNET_FLUSH": "syscall", "syscall.IP_DUMMYNET_GET": "syscall", "syscall.IP_EF": "syscall", "syscall.IP_ERRORMTU": "syscall", "syscall.IP_ESP_NETWORK_LEVEL": "syscall", "syscall.IP_ESP_TRANS_LEVEL": "syscall", "syscall.IP_FAITH": "syscall", "syscall.IP_FREEBIND": "syscall", "syscall.IP_FW3": "syscall", "syscall.IP_FW_ADD": "syscall", "syscall.IP_FW_DEL": "syscall", "syscall.IP_FW_FLUSH": "syscall", "syscall.IP_FW_GET": "syscall", "syscall.IP_FW_NAT_CFG": "syscall", "syscall.IP_FW_NAT_DEL": "syscall", "syscall.IP_FW_NAT_GET_CONFIG": "syscall", "syscall.IP_FW_NAT_GET_LOG": "syscall", "syscall.IP_FW_RESETLOG": "syscall", "syscall.IP_FW_TABLE_ADD": "syscall", "syscall.IP_FW_TABLE_DEL": "syscall", "syscall.IP_FW_TABLE_FLUSH": "syscall", "syscall.IP_FW_TABLE_GETSIZE": "syscall", "syscall.IP_FW_TABLE_LIST": "syscall", "syscall.IP_FW_ZERO": "syscall", "syscall.IP_HDRINCL": "syscall", "syscall.IP_IPCOMP_LEVEL": "syscall", "syscall.IP_IPSECFLOWINFO": "syscall", "syscall.IP_IPSEC_LOCAL_AUTH": "syscall", "syscall.IP_IPSEC_LOCAL_CRED": "syscall", "syscall.IP_IPSEC_LOCAL_ID": "syscall", "syscall.IP_IPSEC_POLICY": "syscall", "syscall.IP_IPSEC_REMOTE_AUTH": "syscall", "syscall.IP_IPSEC_REMOTE_CRED": "syscall", "syscall.IP_IPSEC_REMOTE_ID": "syscall", "syscall.IP_MAXPACKET": "syscall", "syscall.IP_MAX_GROUP_SRC_FILTER": "syscall", "syscall.IP_MAX_MEMBERSHIPS": "syscall", "syscall.IP_MAX_SOCK_MUTE_FILTER": "syscall", "syscall.IP_MAX_SOCK_SRC_FILTER": "syscall", "syscall.IP_MAX_SOURCE_FILTER": "syscall", "syscall.IP_MF": "syscall", "syscall.IP_MINFRAGSIZE": "syscall", "syscall.IP_MINTTL": "syscall", "syscall.IP_MIN_MEMBERSHIPS": "syscall", "syscall.IP_MSFILTER": "syscall", "syscall.IP_MSS": "syscall", "syscall.IP_MTU": "syscall", "syscall.IP_MTU_DISCOVER": "syscall", "syscall.IP_MULTICAST_IF": "syscall", "syscall.IP_MULTICAST_IFINDEX": "syscall", "syscall.IP_MULTICAST_LOOP": "syscall", "syscall.IP_MULTICAST_TTL": "syscall", "syscall.IP_MULTICAST_VIF": "syscall", "syscall.IP_NAT__XXX": "syscall", "syscall.IP_OFFMASK": "syscall", "syscall.IP_OLD_FW_ADD": "syscall", "syscall.IP_OLD_FW_DEL": "syscall", "syscall.IP_OLD_FW_FLUSH": "syscall", "syscall.IP_OLD_FW_GET": "syscall", "syscall.IP_OLD_FW_RESETLOG": "syscall", "syscall.IP_OLD_FW_ZERO": "syscall", "syscall.IP_ONESBCAST": "syscall", "syscall.IP_OPTIONS": "syscall", "syscall.IP_ORIGDSTADDR": "syscall", "syscall.IP_PASSSEC": "syscall", "syscall.IP_PIPEX": "syscall", "syscall.IP_PKTINFO": "syscall", "syscall.IP_PKTOPTIONS": "syscall", "syscall.IP_PMTUDISC": "syscall", "syscall.IP_PMTUDISC_DO": "syscall", "syscall.IP_PMTUDISC_DONT": "syscall", "syscall.IP_PMTUDISC_PROBE": "syscall", "syscall.IP_PMTUDISC_WANT": "syscall", "syscall.IP_PORTRANGE": "syscall", "syscall.IP_PORTRANGE_DEFAULT": "syscall", "syscall.IP_PORTRANGE_HIGH": "syscall", "syscall.IP_PORTRANGE_LOW": "syscall", "syscall.IP_RECVDSTADDR": "syscall", "syscall.IP_RECVDSTPORT": "syscall", "syscall.IP_RECVERR": "syscall", "syscall.IP_RECVIF": "syscall", "syscall.IP_RECVOPTS": "syscall", "syscall.IP_RECVORIGDSTADDR": "syscall", "syscall.IP_RECVPKTINFO": "syscall", "syscall.IP_RECVRETOPTS": "syscall", "syscall.IP_RECVRTABLE": "syscall", "syscall.IP_RECVTOS": "syscall", "syscall.IP_RECVTTL": "syscall", "syscall.IP_RETOPTS": "syscall", "syscall.IP_RF": "syscall", "syscall.IP_ROUTER_ALERT": "syscall", "syscall.IP_RSVP_OFF": "syscall", "syscall.IP_RSVP_ON": "syscall", "syscall.IP_RSVP_VIF_OFF": "syscall", "syscall.IP_RSVP_VIF_ON": "syscall", "syscall.IP_RTABLE": "syscall", "syscall.IP_SENDSRCADDR": "syscall", "syscall.IP_STRIPHDR": "syscall", "syscall.IP_TOS": "syscall", "syscall.IP_TRAFFIC_MGT_BACKGROUND": "syscall", "syscall.IP_TRANSPARENT": "syscall", "syscall.IP_TTL": "syscall", "syscall.IP_UNBLOCK_SOURCE": "syscall", "syscall.IP_XFRM_POLICY": "syscall", "syscall.IPv6MTUInfo": "syscall", "syscall.IPv6Mreq": "syscall", "syscall.ISIG": "syscall", "syscall.ISTRIP": "syscall", "syscall.IUCLC": "syscall", "syscall.IUTF8": "syscall", "syscall.IXANY": "syscall", "syscall.IXOFF": "syscall", "syscall.IXON": "syscall", "syscall.IfAddrmsg": "syscall", "syscall.IfAnnounceMsghdr": "syscall", "syscall.IfData": "syscall", "syscall.IfInfomsg": "syscall", "syscall.IfMsghdr": "syscall", "syscall.IfaMsghdr": "syscall", "syscall.IfmaMsghdr": "syscall", "syscall.IfmaMsghdr2": "syscall", "syscall.ImplementsGetwd": "syscall", "syscall.Inet4Pktinfo": "syscall", "syscall.Inet6Pktinfo": "syscall", "syscall.InotifyAddWatch": "syscall", "syscall.InotifyEvent": "syscall", "syscall.InotifyInit": "syscall", "syscall.InotifyInit1": "syscall", "syscall.InotifyRmWatch": "syscall", "syscall.InterfaceAddrMessage": "syscall", "syscall.InterfaceAnnounceMessage": "syscall", "syscall.InterfaceInfo": "syscall", "syscall.InterfaceMessage": "syscall", "syscall.InterfaceMulticastAddrMessage": "syscall", "syscall.InvalidHandle": "syscall", "syscall.Ioperm": "syscall", "syscall.Iopl": "syscall", "syscall.Iovec": "syscall", "syscall.IpAdapterInfo": "syscall", "syscall.IpAddrString": "syscall", "syscall.IpAddressString": "syscall", "syscall.IpMaskString": "syscall", "syscall.Issetugid": "syscall", "syscall.KEY_ALL_ACCESS": "syscall", "syscall.KEY_CREATE_LINK": "syscall", "syscall.KEY_CREATE_SUB_KEY": "syscall", "syscall.KEY_ENUMERATE_SUB_KEYS": "syscall", "syscall.KEY_EXECUTE": "syscall", "syscall.KEY_NOTIFY": "syscall", "syscall.KEY_QUERY_VALUE": "syscall", "syscall.KEY_READ": "syscall", "syscall.KEY_SET_VALUE": "syscall", "syscall.KEY_WOW64_32KEY": "syscall", "syscall.KEY_WOW64_64KEY": "syscall", "syscall.KEY_WRITE": "syscall", "syscall.Kevent": "syscall", "syscall.Kevent_t": "syscall", "syscall.Kill": "syscall", "syscall.Klogctl": "syscall", "syscall.Kqueue": "syscall", "syscall.LANG_ENGLISH": "syscall", "syscall.LAYERED_PROTOCOL": "syscall", "syscall.LCNT_OVERLOAD_FLUSH": "syscall", "syscall.LINUX_REBOOT_CMD_CAD_OFF": "syscall", "syscall.LINUX_REBOOT_CMD_CAD_ON": "syscall", "syscall.LINUX_REBOOT_CMD_HALT": "syscall", "syscall.LINUX_REBOOT_CMD_KEXEC": "syscall", "syscall.LINUX_REBOOT_CMD_POWER_OFF": "syscall", "syscall.LINUX_REBOOT_CMD_RESTART": "syscall", "syscall.LINUX_REBOOT_CMD_RESTART2": "syscall", "syscall.LINUX_REBOOT_CMD_SW_SUSPEND": "syscall", "syscall.LINUX_REBOOT_MAGIC1": "syscall", "syscall.LINUX_REBOOT_MAGIC2": "syscall", "syscall.LOCK_EX": "syscall", "syscall.LOCK_NB": "syscall", "syscall.LOCK_SH": "syscall", "syscall.LOCK_UN": "syscall", "syscall.LazyDLL": "syscall", "syscall.LazyProc": "syscall", "syscall.Lchown": "syscall", "syscall.Linger": "syscall", "syscall.Link": "syscall", "syscall.Listen": "syscall", "syscall.Listxattr": "syscall", "syscall.LoadCancelIoEx": "syscall", "syscall.LoadConnectEx": "syscall", "syscall.LoadCreateSymbolicLink": "syscall", "syscall.LoadDLL": "syscall", "syscall.LoadGetAddrInfo": "syscall", "syscall.LoadLibrary": "syscall", "syscall.LoadSetFileCompletionNotificationModes": "syscall", "syscall.LocalFree": "syscall", "syscall.Log2phys_t": "syscall", "syscall.LookupAccountName": "syscall", "syscall.LookupAccountSid": "syscall", "syscall.LookupSID": "syscall", "syscall.LsfJump": "syscall", "syscall.LsfSocket": "syscall", "syscall.LsfStmt": "syscall", "syscall.Lstat": "syscall", "syscall.MADV_AUTOSYNC": "syscall", "syscall.MADV_CAN_REUSE": "syscall", "syscall.MADV_CORE": "syscall", "syscall.MADV_DOFORK": "syscall", "syscall.MADV_DONTFORK": "syscall", "syscall.MADV_DONTNEED": "syscall", "syscall.MADV_FREE": "syscall", "syscall.MADV_FREE_REUSABLE": "syscall", "syscall.MADV_FREE_REUSE": "syscall", "syscall.MADV_HUGEPAGE": "syscall", "syscall.MADV_HWPOISON": "syscall", "syscall.MADV_MERGEABLE": "syscall", "syscall.MADV_NOCORE": "syscall", "syscall.MADV_NOHUGEPAGE": "syscall", "syscall.MADV_NORMAL": "syscall", "syscall.MADV_NOSYNC": "syscall", "syscall.MADV_PROTECT": "syscall", "syscall.MADV_RANDOM": "syscall", "syscall.MADV_REMOVE": "syscall", "syscall.MADV_SEQUENTIAL": "syscall", "syscall.MADV_SPACEAVAIL": "syscall", "syscall.MADV_UNMERGEABLE": "syscall", "syscall.MADV_WILLNEED": "syscall", "syscall.MADV_ZERO_WIRED_PAGES": "syscall", "syscall.MAP_32BIT": "syscall", "syscall.MAP_ALIGNED_SUPER": "syscall", "syscall.MAP_ALIGNMENT_16MB": "syscall", "syscall.MAP_ALIGNMENT_1TB": "syscall", "syscall.MAP_ALIGNMENT_256TB": "syscall", "syscall.MAP_ALIGNMENT_4GB": "syscall", "syscall.MAP_ALIGNMENT_64KB": "syscall", "syscall.MAP_ALIGNMENT_64PB": "syscall", "syscall.MAP_ALIGNMENT_MASK": "syscall", "syscall.MAP_ALIGNMENT_SHIFT": "syscall", "syscall.MAP_ANON": "syscall", "syscall.MAP_ANONYMOUS": "syscall", "syscall.MAP_COPY": "syscall", "syscall.MAP_DENYWRITE": "syscall", "syscall.MAP_EXECUTABLE": "syscall", "syscall.MAP_FILE": "syscall", "syscall.MAP_FIXED": "syscall", "syscall.MAP_FLAGMASK": "syscall", "syscall.MAP_GROWSDOWN": "syscall", "syscall.MAP_HASSEMAPHORE": "syscall", "syscall.MAP_HUGETLB": "syscall", "syscall.MAP_INHERIT": "syscall", "syscall.MAP_INHERIT_COPY": "syscall", "syscall.MAP_INHERIT_DEFAULT": "syscall", "syscall.MAP_INHERIT_DONATE_COPY": "syscall", "syscall.MAP_INHERIT_NONE": "syscall", "syscall.MAP_INHERIT_SHARE": "syscall", "syscall.MAP_JIT": "syscall", "syscall.MAP_LOCKED": "syscall", "syscall.MAP_NOCACHE": "syscall", "syscall.MAP_NOCORE": "syscall", "syscall.MAP_NOEXTEND": "syscall", "syscall.MAP_NONBLOCK": "syscall", "syscall.MAP_NORESERVE": "syscall", "syscall.MAP_NOSYNC": "syscall", "syscall.MAP_POPULATE": "syscall", "syscall.MAP_PREFAULT_READ": "syscall", "syscall.MAP_PRIVATE": "syscall", "syscall.MAP_RENAME": "syscall", "syscall.MAP_RESERVED0080": "syscall", "syscall.MAP_RESERVED0100": "syscall", "syscall.MAP_SHARED": "syscall", "syscall.MAP_STACK": "syscall", "syscall.MAP_TRYFIXED": "syscall", "syscall.MAP_TYPE": "syscall", "syscall.MAP_WIRED": "syscall", "syscall.MAXIMUM_REPARSE_DATA_BUFFER_SIZE": "syscall", "syscall.MAXLEN_IFDESCR": "syscall", "syscall.MAXLEN_PHYSADDR": "syscall", "syscall.MAX_ADAPTER_ADDRESS_LENGTH": "syscall", "syscall.MAX_ADAPTER_DESCRIPTION_LENGTH": "syscall", "syscall.MAX_ADAPTER_NAME_LENGTH": "syscall", "syscall.MAX_COMPUTERNAME_LENGTH": "syscall", "syscall.MAX_INTERFACE_NAME_LEN": "syscall", "syscall.MAX_LONG_PATH": "syscall", "syscall.MAX_PATH": "syscall", "syscall.MAX_PROTOCOL_CHAIN": "syscall", "syscall.MCL_CURRENT": "syscall", "syscall.MCL_FUTURE": "syscall", "syscall.MNT_DETACH": "syscall", "syscall.MNT_EXPIRE": "syscall", "syscall.MNT_FORCE": "syscall", "syscall.MSG_BCAST": "syscall", "syscall.MSG_CMSG_CLOEXEC": "syscall", "syscall.MSG_COMPAT": "syscall", "syscall.MSG_CONFIRM": "syscall", "syscall.MSG_CONTROLMBUF": "syscall", "syscall.MSG_CTRUNC": "syscall", "syscall.MSG_DONTROUTE": "syscall", "syscall.MSG_DONTWAIT": "syscall", "syscall.MSG_EOF": "syscall", "syscall.MSG_EOR": "syscall", "syscall.MSG_ERRQUEUE": "syscall", "syscall.MSG_FASTOPEN": "syscall", "syscall.MSG_FIN": "syscall", "syscall.MSG_FLUSH": "syscall", "syscall.MSG_HAVEMORE": "syscall", "syscall.MSG_HOLD": "syscall", "syscall.MSG_IOVUSRSPACE": "syscall", "syscall.MSG_LENUSRSPACE": "syscall", "syscall.MSG_MCAST": "syscall", "syscall.MSG_MORE": "syscall", "syscall.MSG_NAMEMBUF": "syscall", "syscall.MSG_NBIO": "syscall", "syscall.MSG_NEEDSA": "syscall", "syscall.MSG_NOSIGNAL": "syscall", "syscall.MSG_NOTIFICATION": "syscall", "syscall.MSG_OOB": "syscall", "syscall.MSG_PEEK": "syscall", "syscall.MSG_PROXY": "syscall", "syscall.MSG_RCVMORE": "syscall", "syscall.MSG_RST": "syscall", "syscall.MSG_SEND": "syscall", "syscall.MSG_SYN": "syscall", "syscall.MSG_TRUNC": "syscall", "syscall.MSG_TRYHARD": "syscall", "syscall.MSG_USERFLAGS": "syscall", "syscall.MSG_WAITALL": "syscall", "syscall.MSG_WAITFORONE": "syscall", "syscall.MSG_WAITSTREAM": "syscall", "syscall.MS_ACTIVE": "syscall", "syscall.MS_ASYNC": "syscall", "syscall.MS_BIND": "syscall", "syscall.MS_DEACTIVATE": "syscall", "syscall.MS_DIRSYNC": "syscall", "syscall.MS_INVALIDATE": "syscall", "syscall.MS_I_VERSION": "syscall", "syscall.MS_KERNMOUNT": "syscall", "syscall.MS_KILLPAGES": "syscall", "syscall.MS_MANDLOCK": "syscall", "syscall.MS_MGC_MSK": "syscall", "syscall.MS_MGC_VAL": "syscall", "syscall.MS_MOVE": "syscall", "syscall.MS_NOATIME": "syscall", "syscall.MS_NODEV": "syscall", "syscall.MS_NODIRATIME": "syscall", "syscall.MS_NOEXEC": "syscall", "syscall.MS_NOSUID": "syscall", "syscall.MS_NOUSER": "syscall", "syscall.MS_POSIXACL": "syscall", "syscall.MS_PRIVATE": "syscall", "syscall.MS_RDONLY": "syscall", "syscall.MS_REC": "syscall", "syscall.MS_RELATIME": "syscall", "syscall.MS_REMOUNT": "syscall", "syscall.MS_RMT_MASK": "syscall", "syscall.MS_SHARED": "syscall", "syscall.MS_SILENT": "syscall", "syscall.MS_SLAVE": "syscall", "syscall.MS_STRICTATIME": "syscall", "syscall.MS_SYNC": "syscall", "syscall.MS_SYNCHRONOUS": "syscall", "syscall.MS_UNBINDABLE": "syscall", "syscall.Madvise": "syscall", "syscall.MapViewOfFile": "syscall", "syscall.MaxTokenInfoClass": "syscall", "syscall.Mclpool": "syscall", "syscall.MibIfRow": "syscall", "syscall.Mkdir": "syscall", "syscall.Mkdirat": "syscall", "syscall.Mkfifo": "syscall", "syscall.Mknod": "syscall", "syscall.Mknodat": "syscall", "syscall.Mlock": "syscall", "syscall.Mlockall": "syscall", "syscall.Mmap": "syscall", "syscall.Mount": "syscall", "syscall.MoveFile": "syscall", "syscall.Mprotect": "syscall", "syscall.Msghdr": "syscall", "syscall.Munlock": "syscall", "syscall.Munlockall": "syscall", "syscall.Munmap": "syscall", "syscall.MustLoadDLL": "syscall", "syscall.NAME_MAX": "syscall", "syscall.NETLINK_ADD_MEMBERSHIP": "syscall", "syscall.NETLINK_AUDIT": "syscall", "syscall.NETLINK_BROADCAST_ERROR": "syscall", "syscall.NETLINK_CONNECTOR": "syscall", "syscall.NETLINK_DNRTMSG": "syscall", "syscall.NETLINK_DROP_MEMBERSHIP": "syscall", "syscall.NETLINK_ECRYPTFS": "syscall", "syscall.NETLINK_FIB_LOOKUP": "syscall", "syscall.NETLINK_FIREWALL": "syscall", "syscall.NETLINK_GENERIC": "syscall", "syscall.NETLINK_INET_DIAG": "syscall", "syscall.NETLINK_IP6_FW": "syscall", "syscall.NETLINK_ISCSI": "syscall", "syscall.NETLINK_KOBJECT_UEVENT": "syscall", "syscall.NETLINK_NETFILTER": "syscall", "syscall.NETLINK_NFLOG": "syscall", "syscall.NETLINK_NO_ENOBUFS": "syscall", "syscall.NETLINK_PKTINFO": "syscall", "syscall.NETLINK_RDMA": "syscall", "syscall.NETLINK_ROUTE": "syscall", "syscall.NETLINK_SCSITRANSPORT": "syscall", "syscall.NETLINK_SELINUX": "syscall", "syscall.NETLINK_UNUSED": "syscall", "syscall.NETLINK_USERSOCK": "syscall", "syscall.NETLINK_XFRM": "syscall", "syscall.NET_RT_DUMP": "syscall", "syscall.NET_RT_DUMP2": "syscall", "syscall.NET_RT_FLAGS": "syscall", "syscall.NET_RT_IFLIST": "syscall", "syscall.NET_RT_IFLIST2": "syscall", "syscall.NET_RT_IFLISTL": "syscall", "syscall.NET_RT_IFMALIST": "syscall", "syscall.NET_RT_MAXID": "syscall", "syscall.NET_RT_OIFLIST": "syscall", "syscall.NET_RT_OOIFLIST": "syscall", "syscall.NET_RT_STAT": "syscall", "syscall.NET_RT_STATS": "syscall", "syscall.NET_RT_TABLE": "syscall", "syscall.NET_RT_TRASH": "syscall", "syscall.NLA_ALIGNTO": "syscall", "syscall.NLA_F_NESTED": "syscall", "syscall.NLA_F_NET_BYTEORDER": "syscall", "syscall.NLA_HDRLEN": "syscall", "syscall.NLMSG_ALIGNTO": "syscall", "syscall.NLMSG_DONE": "syscall", "syscall.NLMSG_ERROR": "syscall", "syscall.NLMSG_HDRLEN": "syscall", "syscall.NLMSG_MIN_TYPE": "syscall", "syscall.NLMSG_NOOP": "syscall", "syscall.NLMSG_OVERRUN": "syscall", "syscall.NLM_F_ACK": "syscall", "syscall.NLM_F_APPEND": "syscall", "syscall.NLM_F_ATOMIC": "syscall", "syscall.NLM_F_CREATE": "syscall", "syscall.NLM_F_DUMP": "syscall", "syscall.NLM_F_ECHO": "syscall", "syscall.NLM_F_EXCL": "syscall", "syscall.NLM_F_MATCH": "syscall", "syscall.NLM_F_MULTI": "syscall", "syscall.NLM_F_REPLACE": "syscall", "syscall.NLM_F_REQUEST": "syscall", "syscall.NLM_F_ROOT": "syscall", "syscall.NOFLSH": "syscall", "syscall.NOTE_ABSOLUTE": "syscall", "syscall.NOTE_ATTRIB": "syscall", "syscall.NOTE_CHILD": "syscall", "syscall.NOTE_DELETE": "syscall", "syscall.NOTE_EOF": "syscall", "syscall.NOTE_EXEC": "syscall", "syscall.NOTE_EXIT": "syscall", "syscall.NOTE_EXITSTATUS": "syscall", "syscall.NOTE_EXTEND": "syscall", "syscall.NOTE_FFAND": "syscall", "syscall.NOTE_FFCOPY": "syscall", "syscall.NOTE_FFCTRLMASK": "syscall", "syscall.NOTE_FFLAGSMASK": "syscall", "syscall.NOTE_FFNOP": "syscall", "syscall.NOTE_FFOR": "syscall", "syscall.NOTE_FORK": "syscall", "syscall.NOTE_LINK": "syscall", "syscall.NOTE_LOWAT": "syscall", "syscall.NOTE_NONE": "syscall", "syscall.NOTE_NSECONDS": "syscall", "syscall.NOTE_PCTRLMASK": "syscall", "syscall.NOTE_PDATAMASK": "syscall", "syscall.NOTE_REAP": "syscall", "syscall.NOTE_RENAME": "syscall", "syscall.NOTE_RESOURCEEND": "syscall", "syscall.NOTE_REVOKE": "syscall", "syscall.NOTE_SECONDS": "syscall", "syscall.NOTE_SIGNAL": "syscall", "syscall.NOTE_TRACK": "syscall", "syscall.NOTE_TRACKERR": "syscall", "syscall.NOTE_TRIGGER": "syscall", "syscall.NOTE_TRUNCATE": "syscall", "syscall.NOTE_USECONDS": "syscall", "syscall.NOTE_VM_ERROR": "syscall", "syscall.NOTE_VM_PRESSURE": "syscall", "syscall.NOTE_VM_PRESSURE_SUDDEN_TERMINATE": "syscall", "syscall.NOTE_VM_PRESSURE_TERMINATE": "syscall", "syscall.NOTE_WRITE": "syscall", "syscall.NameCanonical": "syscall", "syscall.NameCanonicalEx": "syscall", "syscall.NameDisplay": "syscall", "syscall.NameDnsDomain": "syscall", "syscall.NameFullyQualifiedDN": "syscall", "syscall.NameSamCompatible": "syscall", "syscall.NameServicePrincipal": "syscall", "syscall.NameUniqueId": "syscall", "syscall.NameUnknown": "syscall", "syscall.NameUserPrincipal": "syscall", "syscall.Nanosleep": "syscall", "syscall.NetApiBufferFree": "syscall", "syscall.NetGetJoinInformation": "syscall", "syscall.NetSetupDomainName": "syscall", "syscall.NetSetupUnjoined": "syscall", "syscall.NetSetupUnknownStatus": "syscall", "syscall.NetSetupWorkgroupName": "syscall", "syscall.NetUserGetInfo": "syscall", "syscall.NetlinkMessage": "syscall", "syscall.NetlinkRIB": "syscall", "syscall.NetlinkRouteAttr": "syscall", "syscall.NetlinkRouteRequest": "syscall", "syscall.NewCallback": "syscall", "syscall.NewCallbackCDecl": "syscall", "syscall.NewLazyDLL": "syscall", "syscall.NlAttr": "syscall", "syscall.NlMsgerr": "syscall", "syscall.NlMsghdr": "syscall", "syscall.NsecToFiletime": "syscall", "syscall.NsecToTimespec": "syscall", "syscall.NsecToTimeval": "syscall", "syscall.Ntohs": "syscall", "syscall.OCRNL": "syscall", "syscall.OFDEL": "syscall", "syscall.OFILL": "syscall", "syscall.OFIOGETBMAP": "syscall", "syscall.OID_PKIX_KP_SERVER_AUTH": "syscall", "syscall.OID_SERVER_GATED_CRYPTO": "syscall", "syscall.OID_SGC_NETSCAPE": "syscall", "syscall.OLCUC": "syscall", "syscall.ONLCR": "syscall", "syscall.ONLRET": "syscall", "syscall.ONOCR": "syscall", "syscall.ONOEOT": "syscall", "syscall.OPEN_ALWAYS": "syscall", "syscall.OPEN_EXISTING": "syscall", "syscall.OPOST": "syscall", "syscall.O_ACCMODE": "syscall", "syscall.O_ALERT": "syscall", "syscall.O_ALT_IO": "syscall", "syscall.O_APPEND": "syscall", "syscall.O_ASYNC": "syscall", "syscall.O_CLOEXEC": "syscall", "syscall.O_CREAT": "syscall", "syscall.O_DIRECT": "syscall", "syscall.O_DIRECTORY": "syscall", "syscall.O_DSYNC": "syscall", "syscall.O_EVTONLY": "syscall", "syscall.O_EXCL": "syscall", "syscall.O_EXEC": "syscall", "syscall.O_EXLOCK": "syscall", "syscall.O_FSYNC": "syscall", "syscall.O_LARGEFILE": "syscall", "syscall.O_NDELAY": "syscall", "syscall.O_NOATIME": "syscall", "syscall.O_NOCTTY": "syscall", "syscall.O_NOFOLLOW": "syscall", "syscall.O_NONBLOCK": "syscall", "syscall.O_NOSIGPIPE": "syscall", "syscall.O_POPUP": "syscall", "syscall.O_RDONLY": "syscall", "syscall.O_RDWR": "syscall", "syscall.O_RSYNC": "syscall", "syscall.O_SHLOCK": "syscall", "syscall.O_SYMLINK": "syscall", "syscall.O_SYNC": "syscall", "syscall.O_TRUNC": "syscall", "syscall.O_TTY_INIT": "syscall", "syscall.O_WRONLY": "syscall", "syscall.Open": "syscall", "syscall.OpenCurrentProcessToken": "syscall", "syscall.OpenProcess": "syscall", "syscall.OpenProcessToken": "syscall", "syscall.Openat": "syscall", "syscall.Overlapped": "syscall", "syscall.PACKET_ADD_MEMBERSHIP": "syscall", "syscall.PACKET_BROADCAST": "syscall", "syscall.PACKET_DROP_MEMBERSHIP": "syscall", "syscall.PACKET_FASTROUTE": "syscall", "syscall.PACKET_HOST": "syscall", "syscall.PACKET_LOOPBACK": "syscall", "syscall.PACKET_MR_ALLMULTI": "syscall", "syscall.PACKET_MR_MULTICAST": "syscall", "syscall.PACKET_MR_PROMISC": "syscall", "syscall.PACKET_MULTICAST": "syscall", "syscall.PACKET_OTHERHOST": "syscall", "syscall.PACKET_OUTGOING": "syscall", "syscall.PACKET_RECV_OUTPUT": "syscall", "syscall.PACKET_RX_RING": "syscall", "syscall.PACKET_STATISTICS": "syscall", "syscall.PAGE_EXECUTE_READ": "syscall", "syscall.PAGE_EXECUTE_READWRITE": "syscall", "syscall.PAGE_EXECUTE_WRITECOPY": "syscall", "syscall.PAGE_READONLY": "syscall", "syscall.PAGE_READWRITE": "syscall", "syscall.PAGE_WRITECOPY": "syscall", "syscall.PARENB": "syscall", "syscall.PARMRK": "syscall", "syscall.PARODD": "syscall", "syscall.PENDIN": "syscall", "syscall.PFL_HIDDEN": "syscall", "syscall.PFL_MATCHES_PROTOCOL_ZERO": "syscall", "syscall.PFL_MULTIPLE_PROTO_ENTRIES": "syscall", "syscall.PFL_NETWORKDIRECT_PROVIDER": "syscall", "syscall.PFL_RECOMMENDED_PROTO_ENTRY": "syscall", "syscall.PF_FLUSH": "syscall", "syscall.PKCS_7_ASN_ENCODING": "syscall", "syscall.PMC5_PIPELINE_FLUSH": "syscall", "syscall.PRIO_PGRP": "syscall", "syscall.PRIO_PROCESS": "syscall", "syscall.PRIO_USER": "syscall", "syscall.PRI_IOFLUSH": "syscall", "syscall.PROCESS_QUERY_INFORMATION": "syscall", "syscall.PROCESS_TERMINATE": "syscall", "syscall.PROT_EXEC": "syscall", "syscall.PROT_GROWSDOWN": "syscall", "syscall.PROT_GROWSUP": "syscall", "syscall.PROT_NONE": "syscall", "syscall.PROT_READ": "syscall", "syscall.PROT_WRITE": "syscall", "syscall.PROV_DH_SCHANNEL": "syscall", "syscall.PROV_DSS": "syscall", "syscall.PROV_DSS_DH": "syscall", "syscall.PROV_EC_ECDSA_FULL": "syscall", "syscall.PROV_EC_ECDSA_SIG": "syscall", "syscall.PROV_EC_ECNRA_FULL": "syscall", "syscall.PROV_EC_ECNRA_SIG": "syscall", "syscall.PROV_FORTEZZA": "syscall", "syscall.PROV_INTEL_SEC": "syscall", "syscall.PROV_MS_EXCHANGE": "syscall", "syscall.PROV_REPLACE_OWF": "syscall", "syscall.PROV_RNG": "syscall", "syscall.PROV_RSA_AES": "syscall", "syscall.PROV_RSA_FULL": "syscall", "syscall.PROV_RSA_SCHANNEL": "syscall", "syscall.PROV_RSA_SIG": "syscall", "syscall.PROV_SPYRUS_LYNKS": "syscall", "syscall.PROV_SSL": "syscall", "syscall.PR_CAPBSET_DROP": "syscall", "syscall.PR_CAPBSET_READ": "syscall", "syscall.PR_CLEAR_SECCOMP_FILTER": "syscall", "syscall.PR_ENDIAN_BIG": "syscall", "syscall.PR_ENDIAN_LITTLE": "syscall", "syscall.PR_ENDIAN_PPC_LITTLE": "syscall", "syscall.PR_FPEMU_NOPRINT": "syscall", "syscall.PR_FPEMU_SIGFPE": "syscall", "syscall.PR_FP_EXC_ASYNC": "syscall", "syscall.PR_FP_EXC_DISABLED": "syscall", "syscall.PR_FP_EXC_DIV": "syscall", "syscall.PR_FP_EXC_INV": "syscall", "syscall.PR_FP_EXC_NONRECOV": "syscall", "syscall.PR_FP_EXC_OVF": "syscall", "syscall.PR_FP_EXC_PRECISE": "syscall", "syscall.PR_FP_EXC_RES": "syscall", "syscall.PR_FP_EXC_SW_ENABLE": "syscall", "syscall.PR_FP_EXC_UND": "syscall", "syscall.PR_GET_DUMPABLE": "syscall", "syscall.PR_GET_ENDIAN": "syscall", "syscall.PR_GET_FPEMU": "syscall", "syscall.PR_GET_FPEXC": "syscall", "syscall.PR_GET_KEEPCAPS": "syscall", "syscall.PR_GET_NAME": "syscall", "syscall.PR_GET_PDEATHSIG": "syscall", "syscall.PR_GET_SECCOMP": "syscall", "syscall.PR_GET_SECCOMP_FILTER": "syscall", "syscall.PR_GET_SECUREBITS": "syscall", "syscall.PR_GET_TIMERSLACK": "syscall", "syscall.PR_GET_TIMING": "syscall", "syscall.PR_GET_TSC": "syscall", "syscall.PR_GET_UNALIGN": "syscall", "syscall.PR_MCE_KILL": "syscall", "syscall.PR_MCE_KILL_CLEAR": "syscall", "syscall.PR_MCE_KILL_DEFAULT": "syscall", "syscall.PR_MCE_KILL_EARLY": "syscall", "syscall.PR_MCE_KILL_GET": "syscall", "syscall.PR_MCE_KILL_LATE": "syscall", "syscall.PR_MCE_KILL_SET": "syscall", "syscall.PR_SECCOMP_FILTER_EVENT": "syscall", "syscall.PR_SECCOMP_FILTER_SYSCALL": "syscall", "syscall.PR_SET_DUMPABLE": "syscall", "syscall.PR_SET_ENDIAN": "syscall", "syscall.PR_SET_FPEMU": "syscall", "syscall.PR_SET_FPEXC": "syscall", "syscall.PR_SET_KEEPCAPS": "syscall", "syscall.PR_SET_NAME": "syscall", "syscall.PR_SET_PDEATHSIG": "syscall", "syscall.PR_SET_PTRACER": "syscall", "syscall.PR_SET_SECCOMP": "syscall", "syscall.PR_SET_SECCOMP_FILTER": "syscall", "syscall.PR_SET_SECUREBITS": "syscall", "syscall.PR_SET_TIMERSLACK": "syscall", "syscall.PR_SET_TIMING": "syscall", "syscall.PR_SET_TSC": "syscall", "syscall.PR_SET_UNALIGN": "syscall", "syscall.PR_TASK_PERF_EVENTS_DISABLE": "syscall", "syscall.PR_TASK_PERF_EVENTS_ENABLE": "syscall", "syscall.PR_TIMING_STATISTICAL": "syscall", "syscall.PR_TIMING_TIMESTAMP": "syscall", "syscall.PR_TSC_ENABLE": "syscall", "syscall.PR_TSC_SIGSEGV": "syscall", "syscall.PR_UNALIGN_NOPRINT": "syscall", "syscall.PR_UNALIGN_SIGBUS": "syscall", "syscall.PTRACE_ARCH_PRCTL": "syscall", "syscall.PTRACE_ATTACH": "syscall", "syscall.PTRACE_CONT": "syscall", "syscall.PTRACE_DETACH": "syscall", "syscall.PTRACE_EVENT_CLONE": "syscall", "syscall.PTRACE_EVENT_EXEC": "syscall", "syscall.PTRACE_EVENT_EXIT": "syscall", "syscall.PTRACE_EVENT_FORK": "syscall", "syscall.PTRACE_EVENT_VFORK": "syscall", "syscall.PTRACE_EVENT_VFORK_DONE": "syscall", "syscall.PTRACE_GETCRUNCHREGS": "syscall", "syscall.PTRACE_GETEVENTMSG": "syscall", "syscall.PTRACE_GETFPREGS": "syscall", "syscall.PTRACE_GETFPXREGS": "syscall", "syscall.PTRACE_GETHBPREGS": "syscall", "syscall.PTRACE_GETREGS": "syscall", "syscall.PTRACE_GETREGSET": "syscall", "syscall.PTRACE_GETSIGINFO": "syscall", "syscall.PTRACE_GETVFPREGS": "syscall", "syscall.PTRACE_GETWMMXREGS": "syscall", "syscall.PTRACE_GET_THREAD_AREA": "syscall", "syscall.PTRACE_KILL": "syscall", "syscall.PTRACE_OLDSETOPTIONS": "syscall", "syscall.PTRACE_O_MASK": "syscall", "syscall.PTRACE_O_TRACECLONE": "syscall", "syscall.PTRACE_O_TRACEEXEC": "syscall", "syscall.PTRACE_O_TRACEEXIT": "syscall", "syscall.PTRACE_O_TRACEFORK": "syscall", "syscall.PTRACE_O_TRACESYSGOOD": "syscall", "syscall.PTRACE_O_TRACEVFORK": "syscall", "syscall.PTRACE_O_TRACEVFORKDONE": "syscall", "syscall.PTRACE_PEEKDATA": "syscall", "syscall.PTRACE_PEEKTEXT": "syscall", "syscall.PTRACE_PEEKUSR": "syscall", "syscall.PTRACE_POKEDATA": "syscall", "syscall.PTRACE_POKETEXT": "syscall", "syscall.PTRACE_POKEUSR": "syscall", "syscall.PTRACE_SETCRUNCHREGS": "syscall", "syscall.PTRACE_SETFPREGS": "syscall", "syscall.PTRACE_SETFPXREGS": "syscall", "syscall.PTRACE_SETHBPREGS": "syscall", "syscall.PTRACE_SETOPTIONS": "syscall", "syscall.PTRACE_SETREGS": "syscall", "syscall.PTRACE_SETREGSET": "syscall", "syscall.PTRACE_SETSIGINFO": "syscall", "syscall.PTRACE_SETVFPREGS": "syscall", "syscall.PTRACE_SETWMMXREGS": "syscall", "syscall.PTRACE_SET_SYSCALL": "syscall", "syscall.PTRACE_SET_THREAD_AREA": "syscall", "syscall.PTRACE_SINGLEBLOCK": "syscall", "syscall.PTRACE_SINGLESTEP": "syscall", "syscall.PTRACE_SYSCALL": "syscall", "syscall.PTRACE_SYSEMU": "syscall", "syscall.PTRACE_SYSEMU_SINGLESTEP": "syscall", "syscall.PTRACE_TRACEME": "syscall", "syscall.PT_ATTACH": "syscall", "syscall.PT_ATTACHEXC": "syscall", "syscall.PT_CONTINUE": "syscall", "syscall.PT_DATA_ADDR": "syscall", "syscall.PT_DENY_ATTACH": "syscall", "syscall.PT_DETACH": "syscall", "syscall.PT_FIRSTMACH": "syscall", "syscall.PT_FORCEQUOTA": "syscall", "syscall.PT_KILL": "syscall", "syscall.PT_MASK": "syscall", "syscall.PT_READ_D": "syscall", "syscall.PT_READ_I": "syscall", "syscall.PT_READ_U": "syscall", "syscall.PT_SIGEXC": "syscall", "syscall.PT_STEP": "syscall", "syscall.PT_TEXT_ADDR": "syscall", "syscall.PT_TEXT_END_ADDR": "syscall", "syscall.PT_THUPDATE": "syscall", "syscall.PT_TRACE_ME": "syscall", "syscall.PT_WRITE_D": "syscall", "syscall.PT_WRITE_I": "syscall", "syscall.PT_WRITE_U": "syscall", "syscall.ParseDirent": "syscall", "syscall.ParseNetlinkMessage": "syscall", "syscall.ParseNetlinkRouteAttr": "syscall", "syscall.ParseRoutingMessage": "syscall", "syscall.ParseRoutingSockaddr": "syscall", "syscall.ParseSocketControlMessage": "syscall", "syscall.ParseUnixCredentials": "syscall", "syscall.ParseUnixRights": "syscall", "syscall.PathMax": "syscall", "syscall.Pathconf": "syscall", "syscall.Pause": "syscall", "syscall.Pipe": "syscall", "syscall.Pipe2": "syscall", "syscall.PivotRoot": "syscall", "syscall.PostQueuedCompletionStatus": "syscall", "syscall.Pread": "syscall", "syscall.Proc": "syscall", "syscall.ProcAttr": "syscall", "syscall.Process32First": "syscall", "syscall.Process32Next": "syscall", "syscall.ProcessEntry32": "syscall", "syscall.ProcessInformation": "syscall", "syscall.Protoent": "syscall", "syscall.PtraceAttach": "syscall", "syscall.PtraceCont": "syscall", "syscall.PtraceDetach": "syscall", "syscall.PtraceGetEventMsg": "syscall", "syscall.PtraceGetRegs": "syscall", "syscall.PtracePeekData": "syscall", "syscall.PtracePeekText": "syscall", "syscall.PtracePokeData": "syscall", "syscall.PtracePokeText": "syscall", "syscall.PtraceRegs": "syscall", "syscall.PtraceSetOptions": "syscall", "syscall.PtraceSetRegs": "syscall", "syscall.PtraceSingleStep": "syscall", "syscall.PtraceSyscall": "syscall", "syscall.Pwrite": "syscall", "syscall.REG_BINARY": "syscall", "syscall.REG_DWORD": "syscall", "syscall.REG_DWORD_BIG_ENDIAN": "syscall", "syscall.REG_DWORD_LITTLE_ENDIAN": "syscall", "syscall.REG_EXPAND_SZ": "syscall", "syscall.REG_FULL_RESOURCE_DESCRIPTOR": "syscall", "syscall.REG_LINK": "syscall", "syscall.REG_MULTI_SZ": "syscall", "syscall.REG_NONE": "syscall", "syscall.REG_QWORD": "syscall", "syscall.REG_QWORD_LITTLE_ENDIAN": "syscall", "syscall.REG_RESOURCE_LIST": "syscall", "syscall.REG_RESOURCE_REQUIREMENTS_LIST": "syscall", "syscall.REG_SZ": "syscall", "syscall.RLIMIT_AS": "syscall", "syscall.RLIMIT_CORE": "syscall", "syscall.RLIMIT_CPU": "syscall", "syscall.RLIMIT_DATA": "syscall", "syscall.RLIMIT_FSIZE": "syscall", "syscall.RLIMIT_NOFILE": "syscall", "syscall.RLIMIT_STACK": "syscall", "syscall.RLIM_INFINITY": "syscall", "syscall.RTAX_ADVMSS": "syscall", "syscall.RTAX_AUTHOR": "syscall", "syscall.RTAX_BRD": "syscall", "syscall.RTAX_CWND": "syscall", "syscall.RTAX_DST": "syscall", "syscall.RTAX_FEATURES": "syscall", "syscall.RTAX_FEATURE_ALLFRAG": "syscall", "syscall.RTAX_FEATURE_ECN": "syscall", "syscall.RTAX_FEATURE_SACK": "syscall", "syscall.RTAX_FEATURE_TIMESTAMP": "syscall", "syscall.RTAX_GATEWAY": "syscall", "syscall.RTAX_GENMASK": "syscall", "syscall.RTAX_HOPLIMIT": "syscall", "syscall.RTAX_IFA": "syscall", "syscall.RTAX_IFP": "syscall", "syscall.RTAX_INITCWND": "syscall", "syscall.RTAX_INITRWND": "syscall", "syscall.RTAX_LABEL": "syscall", "syscall.RTAX_LOCK": "syscall", "syscall.RTAX_MAX": "syscall", "syscall.RTAX_MTU": "syscall", "syscall.RTAX_NETMASK": "syscall", "syscall.RTAX_REORDERING": "syscall", "syscall.RTAX_RTO_MIN": "syscall", "syscall.RTAX_RTT": "syscall", "syscall.RTAX_RTTVAR": "syscall", "syscall.RTAX_SRC": "syscall", "syscall.RTAX_SRCMASK": "syscall", "syscall.RTAX_SSTHRESH": "syscall", "syscall.RTAX_TAG": "syscall", "syscall.RTAX_UNSPEC": "syscall", "syscall.RTAX_WINDOW": "syscall", "syscall.RTA_ALIGNTO": "syscall", "syscall.RTA_AUTHOR": "syscall", "syscall.RTA_BRD": "syscall", "syscall.RTA_CACHEINFO": "syscall", "syscall.RTA_DST": "syscall", "syscall.RTA_FLOW": "syscall", "syscall.RTA_GATEWAY": "syscall", "syscall.RTA_GENMASK": "syscall", "syscall.RTA_IFA": "syscall", "syscall.RTA_IFP": "syscall", "syscall.RTA_IIF": "syscall", "syscall.RTA_LABEL": "syscall", "syscall.RTA_MAX": "syscall", "syscall.RTA_METRICS": "syscall", "syscall.RTA_MULTIPATH": "syscall", "syscall.RTA_NETMASK": "syscall", "syscall.RTA_OIF": "syscall", "syscall.RTA_PREFSRC": "syscall", "syscall.RTA_PRIORITY": "syscall", "syscall.RTA_SRC": "syscall", "syscall.RTA_SRCMASK": "syscall", "syscall.RTA_TABLE": "syscall", "syscall.RTA_TAG": "syscall", "syscall.RTA_UNSPEC": "syscall", "syscall.RTCF_DIRECTSRC": "syscall", "syscall.RTCF_DOREDIRECT": "syscall", "syscall.RTCF_LOG": "syscall", "syscall.RTCF_MASQ": "syscall", "syscall.RTCF_NAT": "syscall", "syscall.RTCF_VALVE": "syscall", "syscall.RTF_ADDRCLASSMASK": "syscall", "syscall.RTF_ADDRCONF": "syscall", "syscall.RTF_ALLONLINK": "syscall", "syscall.RTF_ANNOUNCE": "syscall", "syscall.RTF_BLACKHOLE": "syscall", "syscall.RTF_BROADCAST": "syscall", "syscall.RTF_CACHE": "syscall", "syscall.RTF_CLONED": "syscall", "syscall.RTF_CLONING": "syscall", "syscall.RTF_CONDEMNED": "syscall", "syscall.RTF_DEFAULT": "syscall", "syscall.RTF_DELCLONE": "syscall", "syscall.RTF_DONE": "syscall", "syscall.RTF_DYNAMIC": "syscall", "syscall.RTF_FLOW": "syscall", "syscall.RTF_FMASK": "syscall", "syscall.RTF_GATEWAY": "syscall", "syscall.RTF_GWFLAG_COMPAT": "syscall", "syscall.RTF_HOST": "syscall", "syscall.RTF_IFREF": "syscall", "syscall.RTF_IFSCOPE": "syscall", "syscall.RTF_INTERFACE": "syscall", "syscall.RTF_IRTT": "syscall", "syscall.RTF_LINKRT": "syscall", "syscall.RTF_LLDATA": "syscall", "syscall.RTF_LLINFO": "syscall", "syscall.RTF_LOCAL": "syscall", "syscall.RTF_MASK": "syscall", "syscall.RTF_MODIFIED": "syscall", "syscall.RTF_MPATH": "syscall", "syscall.RTF_MPLS": "syscall", "syscall.RTF_MSS": "syscall", "syscall.RTF_MTU": "syscall", "syscall.RTF_MULTICAST": "syscall", "syscall.RTF_NAT": "syscall", "syscall.RTF_NOFORWARD": "syscall", "syscall.RTF_NONEXTHOP": "syscall", "syscall.RTF_NOPMTUDISC": "syscall", "syscall.RTF_PERMANENT_ARP": "syscall", "syscall.RTF_PINNED": "syscall", "syscall.RTF_POLICY": "syscall", "syscall.RTF_PRCLONING": "syscall", "syscall.RTF_PROTO1": "syscall", "syscall.RTF_PROTO2": "syscall", "syscall.RTF_PROTO3": "syscall", "syscall.RTF_REINSTATE": "syscall", "syscall.RTF_REJECT": "syscall", "syscall.RTF_RNH_LOCKED": "syscall", "syscall.RTF_SOURCE": "syscall", "syscall.RTF_SRC": "syscall", "syscall.RTF_STATIC": "syscall", "syscall.RTF_STICKY": "syscall", "syscall.RTF_THROW": "syscall", "syscall.RTF_TUNNEL": "syscall", "syscall.RTF_UP": "syscall", "syscall.RTF_USETRAILERS": "syscall", "syscall.RTF_WASCLONED": "syscall", "syscall.RTF_WINDOW": "syscall", "syscall.RTF_XRESOLVE": "syscall", "syscall.RTM_ADD": "syscall", "syscall.RTM_BASE": "syscall", "syscall.RTM_CHANGE": "syscall", "syscall.RTM_CHGADDR": "syscall", "syscall.RTM_DELACTION": "syscall", "syscall.RTM_DELADDR": "syscall", "syscall.RTM_DELADDRLABEL": "syscall", "syscall.RTM_DELETE": "syscall", "syscall.RTM_DELLINK": "syscall", "syscall.RTM_DELMADDR": "syscall", "syscall.RTM_DELNEIGH": "syscall", "syscall.RTM_DELQDISC": "syscall", "syscall.RTM_DELROUTE": "syscall", "syscall.RTM_DELRULE": "syscall", "syscall.RTM_DELTCLASS": "syscall", "syscall.RTM_DELTFILTER": "syscall", "syscall.RTM_DESYNC": "syscall", "syscall.RTM_F_CLONED": "syscall", "syscall.RTM_F_EQUALIZE": "syscall", "syscall.RTM_F_NOTIFY": "syscall", "syscall.RTM_F_PREFIX": "syscall", "syscall.RTM_GET": "syscall", "syscall.RTM_GET2": "syscall", "syscall.RTM_GETACTION": "syscall", "syscall.RTM_GETADDR": "syscall", "syscall.RTM_GETADDRLABEL": "syscall", "syscall.RTM_GETANYCAST": "syscall", "syscall.RTM_GETDCB": "syscall", "syscall.RTM_GETLINK": "syscall", "syscall.RTM_GETMULTICAST": "syscall", "syscall.RTM_GETNEIGH": "syscall", "syscall.RTM_GETNEIGHTBL": "syscall", "syscall.RTM_GETQDISC": "syscall", "syscall.RTM_GETROUTE": "syscall", "syscall.RTM_GETRULE": "syscall", "syscall.RTM_GETTCLASS": "syscall", "syscall.RTM_GETTFILTER": "syscall", "syscall.RTM_IEEE80211": "syscall", "syscall.RTM_IFANNOUNCE": "syscall", "syscall.RTM_IFINFO": "syscall", "syscall.RTM_IFINFO2": "syscall", "syscall.RTM_LLINFO_UPD": "syscall", "syscall.RTM_LOCK": "syscall", "syscall.RTM_LOSING": "syscall", "syscall.RTM_MAX": "syscall", "syscall.RTM_MAXSIZE": "syscall", "syscall.RTM_MISS": "syscall", "syscall.RTM_NEWACTION": "syscall", "syscall.RTM_NEWADDR": "syscall", "syscall.RTM_NEWADDRLABEL": "syscall", "syscall.RTM_NEWLINK": "syscall", "syscall.RTM_NEWMADDR": "syscall", "syscall.RTM_NEWMADDR2": "syscall", "syscall.RTM_NEWNDUSEROPT": "syscall", "syscall.RTM_NEWNEIGH": "syscall", "syscall.RTM_NEWNEIGHTBL": "syscall", "syscall.RTM_NEWPREFIX": "syscall", "syscall.RTM_NEWQDISC": "syscall", "syscall.RTM_NEWROUTE": "syscall", "syscall.RTM_NEWRULE": "syscall", "syscall.RTM_NEWTCLASS": "syscall", "syscall.RTM_NEWTFILTER": "syscall", "syscall.RTM_NR_FAMILIES": "syscall", "syscall.RTM_NR_MSGTYPES": "syscall", "syscall.RTM_OIFINFO": "syscall", "syscall.RTM_OLDADD": "syscall", "syscall.RTM_OLDDEL": "syscall", "syscall.RTM_OOIFINFO": "syscall", "syscall.RTM_REDIRECT": "syscall", "syscall.RTM_RESOLVE": "syscall", "syscall.RTM_RTTUNIT": "syscall", "syscall.RTM_SETDCB": "syscall", "syscall.RTM_SETGATE": "syscall", "syscall.RTM_SETLINK": "syscall", "syscall.RTM_SETNEIGHTBL": "syscall", "syscall.RTM_VERSION": "syscall", "syscall.RTNH_ALIGNTO": "syscall", "syscall.RTNH_F_DEAD": "syscall", "syscall.RTNH_F_ONLINK": "syscall", "syscall.RTNH_F_PERVASIVE": "syscall", "syscall.RTNLGRP_IPV4_IFADDR": "syscall", "syscall.RTNLGRP_IPV4_MROUTE": "syscall", "syscall.RTNLGRP_IPV4_ROUTE": "syscall", "syscall.RTNLGRP_IPV4_RULE": "syscall", "syscall.RTNLGRP_IPV6_IFADDR": "syscall", "syscall.RTNLGRP_IPV6_IFINFO": "syscall", "syscall.RTNLGRP_IPV6_MROUTE": "syscall", "syscall.RTNLGRP_IPV6_PREFIX": "syscall", "syscall.RTNLGRP_IPV6_ROUTE": "syscall", "syscall.RTNLGRP_IPV6_RULE": "syscall", "syscall.RTNLGRP_LINK": "syscall", "syscall.RTNLGRP_ND_USEROPT": "syscall", "syscall.RTNLGRP_NEIGH": "syscall", "syscall.RTNLGRP_NONE": "syscall", "syscall.RTNLGRP_NOTIFY": "syscall", "syscall.RTNLGRP_TC": "syscall", "syscall.RTN_ANYCAST": "syscall", "syscall.RTN_BLACKHOLE": "syscall", "syscall.RTN_BROADCAST": "syscall", "syscall.RTN_LOCAL": "syscall", "syscall.RTN_MAX": "syscall", "syscall.RTN_MULTICAST": "syscall", "syscall.RTN_NAT": "syscall", "syscall.RTN_PROHIBIT": "syscall", "syscall.RTN_THROW": "syscall", "syscall.RTN_UNICAST": "syscall", "syscall.RTN_UNREACHABLE": "syscall", "syscall.RTN_UNSPEC": "syscall", "syscall.RTN_XRESOLVE": "syscall", "syscall.RTPROT_BIRD": "syscall", "syscall.RTPROT_BOOT": "syscall", "syscall.RTPROT_DHCP": "syscall", "syscall.RTPROT_DNROUTED": "syscall", "syscall.RTPROT_GATED": "syscall", "syscall.RTPROT_KERNEL": "syscall", "syscall.RTPROT_MRT": "syscall", "syscall.RTPROT_NTK": "syscall", "syscall.RTPROT_RA": "syscall", "syscall.RTPROT_REDIRECT": "syscall", "syscall.RTPROT_STATIC": "syscall", "syscall.RTPROT_UNSPEC": "syscall", "syscall.RTPROT_XORP": "syscall", "syscall.RTPROT_ZEBRA": "syscall", "syscall.RTV_EXPIRE": "syscall", "syscall.RTV_HOPCOUNT": "syscall", "syscall.RTV_MTU": "syscall", "syscall.RTV_RPIPE": "syscall", "syscall.RTV_RTT": "syscall", "syscall.RTV_RTTVAR": "syscall", "syscall.RTV_SPIPE": "syscall", "syscall.RTV_SSTHRESH": "syscall", "syscall.RTV_WEIGHT": "syscall", "syscall.RT_CACHING_CONTEXT": "syscall", "syscall.RT_CLASS_DEFAULT": "syscall", "syscall.RT_CLASS_LOCAL": "syscall", "syscall.RT_CLASS_MAIN": "syscall", "syscall.RT_CLASS_MAX": "syscall", "syscall.RT_CLASS_UNSPEC": "syscall", "syscall.RT_DEFAULT_FIB": "syscall", "syscall.RT_NORTREF": "syscall", "syscall.RT_SCOPE_HOST": "syscall", "syscall.RT_SCOPE_LINK": "syscall", "syscall.RT_SCOPE_NOWHERE": "syscall", "syscall.RT_SCOPE_SITE": "syscall", "syscall.RT_SCOPE_UNIVERSE": "syscall", "syscall.RT_TABLEID_MAX": "syscall", "syscall.RT_TABLE_COMPAT": "syscall", "syscall.RT_TABLE_DEFAULT": "syscall", "syscall.RT_TABLE_LOCAL": "syscall", "syscall.RT_TABLE_MAIN": "syscall", "syscall.RT_TABLE_MAX": "syscall", "syscall.RT_TABLE_UNSPEC": "syscall", "syscall.RUSAGE_CHILDREN": "syscall", "syscall.RUSAGE_SELF": "syscall", "syscall.RUSAGE_THREAD": "syscall", "syscall.Radvisory_t": "syscall", "syscall.RawSockaddr": "syscall", "syscall.RawSockaddrAny": "syscall", "syscall.RawSockaddrDatalink": "syscall", "syscall.RawSockaddrInet4": "syscall", "syscall.RawSockaddrInet6": "syscall", "syscall.RawSockaddrLinklayer": "syscall", "syscall.RawSockaddrNetlink": "syscall", "syscall.RawSockaddrUnix": "syscall", "syscall.RawSyscall": "syscall", "syscall.RawSyscall6": "syscall", "syscall.Read": "syscall", "syscall.ReadConsole": "syscall", "syscall.ReadDirectoryChanges": "syscall", "syscall.ReadDirent": "syscall", "syscall.ReadFile": "syscall", "syscall.Readlink": "syscall", "syscall.Reboot": "syscall", "syscall.Recvfrom": "syscall", "syscall.Recvmsg": "syscall", "syscall.RegCloseKey": "syscall", "syscall.RegEnumKeyEx": "syscall", "syscall.RegOpenKeyEx": "syscall", "syscall.RegQueryInfoKey": "syscall", "syscall.RegQueryValueEx": "syscall", "syscall.RemoveDirectory": "syscall", "syscall.Removexattr": "syscall", "syscall.Rename": "syscall", "syscall.Renameat": "syscall", "syscall.Revoke": "syscall", "syscall.Rlimit": "syscall", "syscall.Rmdir": "syscall", "syscall.RouteMessage": "syscall", "syscall.RouteRIB": "syscall", "syscall.RtAttr": "syscall", "syscall.RtGenmsg": "syscall", "syscall.RtMetrics": "syscall", "syscall.RtMsg": "syscall", "syscall.RtMsghdr": "syscall", "syscall.RtNexthop": "syscall", "syscall.Rusage": "syscall", "syscall.SCM_BINTIME": "syscall", "syscall.SCM_CREDENTIALS": "syscall", "syscall.SCM_CREDS": "syscall", "syscall.SCM_RIGHTS": "syscall", "syscall.SCM_TIMESTAMP": "syscall", "syscall.SCM_TIMESTAMPING": "syscall", "syscall.SCM_TIMESTAMPNS": "syscall", "syscall.SCM_TIMESTAMP_MONOTONIC": "syscall", "syscall.SHUT_RD": "syscall", "syscall.SHUT_RDWR": "syscall", "syscall.SHUT_WR": "syscall", "syscall.SID": "syscall", "syscall.SIDAndAttributes": "syscall", "syscall.SIGABRT": "syscall", "syscall.SIGALRM": "syscall", "syscall.SIGBUS": "syscall", "syscall.SIGCHLD": "syscall", "syscall.SIGCLD": "syscall", "syscall.SIGCONT": "syscall", "syscall.SIGEMT": "syscall", "syscall.SIGFPE": "syscall", "syscall.SIGHUP": "syscall", "syscall.SIGILL": "syscall", "syscall.SIGINFO": "syscall", "syscall.SIGINT": "syscall", "syscall.SIGIO": "syscall", "syscall.SIGIOT": "syscall", "syscall.SIGKILL": "syscall", "syscall.SIGLIBRT": "syscall", "syscall.SIGLWP": "syscall", "syscall.SIGPIPE": "syscall", "syscall.SIGPOLL": "syscall", "syscall.SIGPROF": "syscall", "syscall.SIGPWR": "syscall", "syscall.SIGQUIT": "syscall", "syscall.SIGSEGV": "syscall", "syscall.SIGSTKFLT": "syscall", "syscall.SIGSTOP": "syscall", "syscall.SIGSYS": "syscall", "syscall.SIGTERM": "syscall", "syscall.SIGTHR": "syscall", "syscall.SIGTRAP": "syscall", "syscall.SIGTSTP": "syscall", "syscall.SIGTTIN": "syscall", "syscall.SIGTTOU": "syscall", "syscall.SIGUNUSED": "syscall", "syscall.SIGURG": "syscall", "syscall.SIGUSR1": "syscall", "syscall.SIGUSR2": "syscall", "syscall.SIGVTALRM": "syscall", "syscall.SIGWINCH": "syscall", "syscall.SIGXCPU": "syscall", "syscall.SIGXFSZ": "syscall", "syscall.SIOCADDDLCI": "syscall", "syscall.SIOCADDMULTI": "syscall", "syscall.SIOCADDRT": "syscall", "syscall.SIOCAIFADDR": "syscall", "syscall.SIOCAIFGROUP": "syscall", "syscall.SIOCALIFADDR": "syscall", "syscall.SIOCARPIPLL": "syscall", "syscall.SIOCATMARK": "syscall", "syscall.SIOCAUTOADDR": "syscall", "syscall.SIOCAUTONETMASK": "syscall", "syscall.SIOCBRDGADD": "syscall", "syscall.SIOCBRDGADDS": "syscall", "syscall.SIOCBRDGARL": "syscall", "syscall.SIOCBRDGDADDR": "syscall", "syscall.SIOCBRDGDEL": "syscall", "syscall.SIOCBRDGDELS": "syscall", "syscall.SIOCBRDGFLUSH": "syscall", "syscall.SIOCBRDGFRL": "syscall", "syscall.SIOCBRDGGCACHE": "syscall", "syscall.SIOCBRDGGFD": "syscall", "syscall.SIOCBRDGGHT": "syscall", "syscall.SIOCBRDGGIFFLGS": "syscall", "syscall.SIOCBRDGGMA": "syscall", "syscall.SIOCBRDGGPARAM": "syscall", "syscall.SIOCBRDGGPRI": "syscall", "syscall.SIOCBRDGGRL": "syscall", "syscall.SIOCBRDGGSIFS": "syscall", "syscall.SIOCBRDGGTO": "syscall", "syscall.SIOCBRDGIFS": "syscall", "syscall.SIOCBRDGRTS": "syscall", "syscall.SIOCBRDGSADDR": "syscall", "syscall.SIOCBRDGSCACHE": "syscall", "syscall.SIOCBRDGSFD": "syscall", "syscall.SIOCBRDGSHT": "syscall", "syscall.SIOCBRDGSIFCOST": "syscall", "syscall.SIOCBRDGSIFFLGS": "syscall", "syscall.SIOCBRDGSIFPRIO": "syscall", "syscall.SIOCBRDGSMA": "syscall", "syscall.SIOCBRDGSPRI": "syscall", "syscall.SIOCBRDGSPROTO": "syscall", "syscall.SIOCBRDGSTO": "syscall", "syscall.SIOCBRDGSTXHC": "syscall", "syscall.SIOCDARP": "syscall", "syscall.SIOCDELDLCI": "syscall", "syscall.SIOCDELMULTI": "syscall", "syscall.SIOCDELRT": "syscall", "syscall.SIOCDEVPRIVATE": "syscall", "syscall.SIOCDIFADDR": "syscall", "syscall.SIOCDIFGROUP": "syscall", "syscall.SIOCDIFPHYADDR": "syscall", "syscall.SIOCDLIFADDR": "syscall", "syscall.SIOCDRARP": "syscall", "syscall.SIOCGARP": "syscall", "syscall.SIOCGDRVSPEC": "syscall", "syscall.SIOCGETKALIVE": "syscall", "syscall.SIOCGETLABEL": "syscall", "syscall.SIOCGETPFLOW": "syscall", "syscall.SIOCGETPFSYNC": "syscall", "syscall.SIOCGETSGCNT": "syscall", "syscall.SIOCGETVIFCNT": "syscall", "syscall.SIOCGETVLAN": "syscall", "syscall.SIOCGHIWAT": "syscall", "syscall.SIOCGIFADDR": "syscall", "syscall.SIOCGIFADDRPREF": "syscall", "syscall.SIOCGIFALIAS": "syscall", "syscall.SIOCGIFALTMTU": "syscall", "syscall.SIOCGIFASYNCMAP": "syscall", "syscall.SIOCGIFBOND": "syscall", "syscall.SIOCGIFBR": "syscall", "syscall.SIOCGIFBRDADDR": "syscall", "syscall.SIOCGIFCAP": "syscall", "syscall.SIOCGIFCONF": "syscall", "syscall.SIOCGIFCOUNT": "syscall", "syscall.SIOCGIFDATA": "syscall", "syscall.SIOCGIFDESCR": "syscall", "syscall.SIOCGIFDEVMTU": "syscall", "syscall.SIOCGIFDLT": "syscall", "syscall.SIOCGIFDSTADDR": "syscall", "syscall.SIOCGIFENCAP": "syscall", "syscall.SIOCGIFFIB": "syscall", "syscall.SIOCGIFFLAGS": "syscall", "syscall.SIOCGIFGATTR": "syscall", "syscall.SIOCGIFGENERIC": "syscall", "syscall.SIOCGIFGMEMB": "syscall", "syscall.SIOCGIFGROUP": "syscall", "syscall.SIOCGIFHARDMTU": "syscall", "syscall.SIOCGIFHWADDR": "syscall", "syscall.SIOCGIFINDEX": "syscall", "syscall.SIOCGIFKPI": "syscall", "syscall.SIOCGIFMAC": "syscall", "syscall.SIOCGIFMAP": "syscall", "syscall.SIOCGIFMEDIA": "syscall", "syscall.SIOCGIFMEM": "syscall", "syscall.SIOCGIFMETRIC": "syscall", "syscall.SIOCGIFMTU": "syscall", "syscall.SIOCGIFNAME": "syscall", "syscall.SIOCGIFNETMASK": "syscall", "syscall.SIOCGIFPDSTADDR": "syscall", "syscall.SIOCGIFPFLAGS": "syscall", "syscall.SIOCGIFPHYS": "syscall", "syscall.SIOCGIFPRIORITY": "syscall", "syscall.SIOCGIFPSRCADDR": "syscall", "syscall.SIOCGIFRDOMAIN": "syscall", "syscall.SIOCGIFRTLABEL": "syscall", "syscall.SIOCGIFSLAVE": "syscall", "syscall.SIOCGIFSTATUS": "syscall", "syscall.SIOCGIFTIMESLOT": "syscall", "syscall.SIOCGIFTXQLEN": "syscall", "syscall.SIOCGIFVLAN": "syscall", "syscall.SIOCGIFWAKEFLAGS": "syscall", "syscall.SIOCGIFXFLAGS": "syscall", "syscall.SIOCGLIFADDR": "syscall", "syscall.SIOCGLIFPHYADDR": "syscall", "syscall.SIOCGLIFPHYRTABLE": "syscall", "syscall.SIOCGLIFPHYTTL": "syscall", "syscall.SIOCGLINKSTR": "syscall", "syscall.SIOCGLOWAT": "syscall", "syscall.SIOCGPGRP": "syscall", "syscall.SIOCGPRIVATE_0": "syscall", "syscall.SIOCGPRIVATE_1": "syscall", "syscall.SIOCGRARP": "syscall", "syscall.SIOCGSPPPPARAMS": "syscall", "syscall.SIOCGSTAMP": "syscall", "syscall.SIOCGSTAMPNS": "syscall", "syscall.SIOCGVH": "syscall", "syscall.SIOCGVNETID": "syscall", "syscall.SIOCIFCREATE": "syscall", "syscall.SIOCIFCREATE2": "syscall", "syscall.SIOCIFDESTROY": "syscall", "syscall.SIOCIFGCLONERS": "syscall", "syscall.SIOCINITIFADDR": "syscall", "syscall.SIOCPROTOPRIVATE": "syscall", "syscall.SIOCRSLVMULTI": "syscall", "syscall.SIOCRTMSG": "syscall", "syscall.SIOCSARP": "syscall", "syscall.SIOCSDRVSPEC": "syscall", "syscall.SIOCSETKALIVE": "syscall", "syscall.SIOCSETLABEL": "syscall", "syscall.SIOCSETPFLOW": "syscall", "syscall.SIOCSETPFSYNC": "syscall", "syscall.SIOCSETVLAN": "syscall", "syscall.SIOCSHIWAT": "syscall", "syscall.SIOCSIFADDR": "syscall", "syscall.SIOCSIFADDRPREF": "syscall", "syscall.SIOCSIFALTMTU": "syscall", "syscall.SIOCSIFASYNCMAP": "syscall", "syscall.SIOCSIFBOND": "syscall", "syscall.SIOCSIFBR": "syscall", "syscall.SIOCSIFBRDADDR": "syscall", "syscall.SIOCSIFCAP": "syscall", "syscall.SIOCSIFDESCR": "syscall", "syscall.SIOCSIFDSTADDR": "syscall", "syscall.SIOCSIFENCAP": "syscall", "syscall.SIOCSIFFIB": "syscall", "syscall.SIOCSIFFLAGS": "syscall", "syscall.SIOCSIFGATTR": "syscall", "syscall.SIOCSIFGENERIC": "syscall", "syscall.SIOCSIFHWADDR": "syscall", "syscall.SIOCSIFHWBROADCAST": "syscall", "syscall.SIOCSIFKPI": "syscall", "syscall.SIOCSIFLINK": "syscall", "syscall.SIOCSIFLLADDR": "syscall", "syscall.SIOCSIFMAC": "syscall", "syscall.SIOCSIFMAP": "syscall", "syscall.SIOCSIFMEDIA": "syscall", "syscall.SIOCSIFMEM": "syscall", "syscall.SIOCSIFMETRIC": "syscall", "syscall.SIOCSIFMTU": "syscall", "syscall.SIOCSIFNAME": "syscall", "syscall.SIOCSIFNETMASK": "syscall", "syscall.SIOCSIFPFLAGS": "syscall", "syscall.SIOCSIFPHYADDR": "syscall", "syscall.SIOCSIFPHYS": "syscall", "syscall.SIOCSIFPRIORITY": "syscall", "syscall.SIOCSIFRDOMAIN": "syscall", "syscall.SIOCSIFRTLABEL": "syscall", "syscall.SIOCSIFRVNET": "syscall", "syscall.SIOCSIFSLAVE": "syscall", "syscall.SIOCSIFTIMESLOT": "syscall", "syscall.SIOCSIFTXQLEN": "syscall", "syscall.SIOCSIFVLAN": "syscall", "syscall.SIOCSIFVNET": "syscall", "syscall.SIOCSIFXFLAGS": "syscall", "syscall.SIOCSLIFPHYADDR": "syscall", "syscall.SIOCSLIFPHYRTABLE": "syscall", "syscall.SIOCSLIFPHYTTL": "syscall", "syscall.SIOCSLINKSTR": "syscall", "syscall.SIOCSLOWAT": "syscall", "syscall.SIOCSPGRP": "syscall", "syscall.SIOCSRARP": "syscall", "syscall.SIOCSSPPPPARAMS": "syscall", "syscall.SIOCSVH": "syscall", "syscall.SIOCSVNETID": "syscall", "syscall.SIOCZIFDATA": "syscall", "syscall.SIO_GET_EXTENSION_FUNCTION_POINTER": "syscall", "syscall.SIO_GET_INTERFACE_LIST": "syscall", "syscall.SIO_KEEPALIVE_VALS": "syscall", "syscall.SIO_UDP_CONNRESET": "syscall", "syscall.SOCK_CLOEXEC": "syscall", "syscall.SOCK_DCCP": "syscall", "syscall.SOCK_DGRAM": "syscall", "syscall.SOCK_FLAGS_MASK": "syscall", "syscall.SOCK_MAXADDRLEN": "syscall", "syscall.SOCK_NONBLOCK": "syscall", "syscall.SOCK_NOSIGPIPE": "syscall", "syscall.SOCK_PACKET": "syscall", "syscall.SOCK_RAW": "syscall", "syscall.SOCK_RDM": "syscall", "syscall.SOCK_SEQPACKET": "syscall", "syscall.SOCK_STREAM": "syscall", "syscall.SOL_AAL": "syscall", "syscall.SOL_ATM": "syscall", "syscall.SOL_DECNET": "syscall", "syscall.SOL_ICMPV6": "syscall", "syscall.SOL_IP": "syscall", "syscall.SOL_IPV6": "syscall", "syscall.SOL_IRDA": "syscall", "syscall.SOL_PACKET": "syscall", "syscall.SOL_RAW": "syscall", "syscall.SOL_SOCKET": "syscall", "syscall.SOL_TCP": "syscall", "syscall.SOL_X25": "syscall", "syscall.SOMAXCONN": "syscall", "syscall.SO_ACCEPTCONN": "syscall", "syscall.SO_ACCEPTFILTER": "syscall", "syscall.SO_ATTACH_FILTER": "syscall", "syscall.SO_BINDANY": "syscall", "syscall.SO_BINDTODEVICE": "syscall", "syscall.SO_BINTIME": "syscall", "syscall.SO_BROADCAST": "syscall", "syscall.SO_BSDCOMPAT": "syscall", "syscall.SO_DEBUG": "syscall", "syscall.SO_DETACH_FILTER": "syscall", "syscall.SO_DOMAIN": "syscall", "syscall.SO_DONTROUTE": "syscall", "syscall.SO_DONTTRUNC": "syscall", "syscall.SO_ERROR": "syscall", "syscall.SO_KEEPALIVE": "syscall", "syscall.SO_LABEL": "syscall", "syscall.SO_LINGER": "syscall", "syscall.SO_LINGER_SEC": "syscall", "syscall.SO_LISTENINCQLEN": "syscall", "syscall.SO_LISTENQLEN": "syscall", "syscall.SO_LISTENQLIMIT": "syscall", "syscall.SO_MARK": "syscall", "syscall.SO_NETPROC": "syscall", "syscall.SO_NKE": "syscall", "syscall.SO_NOADDRERR": "syscall", "syscall.SO_NOHEADER": "syscall", "syscall.SO_NOSIGPIPE": "syscall", "syscall.SO_NOTIFYCONFLICT": "syscall", "syscall.SO_NO_CHECK": "syscall", "syscall.SO_NO_DDP": "syscall", "syscall.SO_NO_OFFLOAD": "syscall", "syscall.SO_NP_EXTENSIONS": "syscall", "syscall.SO_NREAD": "syscall", "syscall.SO_NWRITE": "syscall", "syscall.SO_OOBINLINE": "syscall", "syscall.SO_OVERFLOWED": "syscall", "syscall.SO_PASSCRED": "syscall", "syscall.SO_PASSSEC": "syscall", "syscall.SO_PEERCRED": "syscall", "syscall.SO_PEERLABEL": "syscall", "syscall.SO_PEERNAME": "syscall", "syscall.SO_PEERSEC": "syscall", "syscall.SO_PRIORITY": "syscall", "syscall.SO_PROTOCOL": "syscall", "syscall.SO_PROTOTYPE": "syscall", "syscall.SO_RANDOMPORT": "syscall", "syscall.SO_RCVBUF": "syscall", "syscall.SO_RCVBUFFORCE": "syscall", "syscall.SO_RCVLOWAT": "syscall", "syscall.SO_RCVTIMEO": "syscall", "syscall.SO_RESTRICTIONS": "syscall", "syscall.SO_RESTRICT_DENYIN": "syscall", "syscall.SO_RESTRICT_DENYOUT": "syscall", "syscall.SO_RESTRICT_DENYSET": "syscall", "syscall.SO_REUSEADDR": "syscall", "syscall.SO_REUSEPORT": "syscall", "syscall.SO_REUSESHAREUID": "syscall", "syscall.SO_RTABLE": "syscall", "syscall.SO_RXQ_OVFL": "syscall", "syscall.SO_SECURITY_AUTHENTICATION": "syscall", "syscall.SO_SECURITY_ENCRYPTION_NETWORK": "syscall", "syscall.SO_SECURITY_ENCRYPTION_TRANSPORT": "syscall", "syscall.SO_SETFIB": "syscall", "syscall.SO_SNDBUF": "syscall", "syscall.SO_SNDBUFFORCE": "syscall", "syscall.SO_SNDLOWAT": "syscall", "syscall.SO_SNDTIMEO": "syscall", "syscall.SO_SPLICE": "syscall", "syscall.SO_TIMESTAMP": "syscall", "syscall.SO_TIMESTAMPING": "syscall", "syscall.SO_TIMESTAMPNS": "syscall", "syscall.SO_TIMESTAMP_MONOTONIC": "syscall", "syscall.SO_TYPE": "syscall", "syscall.SO_UPCALLCLOSEWAIT": "syscall", "syscall.SO_UPDATE_ACCEPT_CONTEXT": "syscall", "syscall.SO_UPDATE_CONNECT_CONTEXT": "syscall", "syscall.SO_USELOOPBACK": "syscall", "syscall.SO_USER_COOKIE": "syscall", "syscall.SO_VENDOR": "syscall", "syscall.SO_WANTMORE": "syscall", "syscall.SO_WANTOOBFLAG": "syscall", "syscall.SSLExtraCertChainPolicyPara": "syscall", "syscall.STANDARD_RIGHTS_ALL": "syscall", "syscall.STANDARD_RIGHTS_EXECUTE": "syscall", "syscall.STANDARD_RIGHTS_READ": "syscall", "syscall.STANDARD_RIGHTS_REQUIRED": "syscall", "syscall.STANDARD_RIGHTS_WRITE": "syscall", "syscall.STARTF_USESHOWWINDOW": "syscall", "syscall.STARTF_USESTDHANDLES": "syscall", "syscall.STD_ERROR_HANDLE": "syscall", "syscall.STD_INPUT_HANDLE": "syscall", "syscall.STD_OUTPUT_HANDLE": "syscall", "syscall.SUBLANG_ENGLISH_US": "syscall", "syscall.SW_FORCEMINIMIZE": "syscall", "syscall.SW_HIDE": "syscall", "syscall.SW_MAXIMIZE": "syscall", "syscall.SW_MINIMIZE": "syscall", "syscall.SW_NORMAL": "syscall", "syscall.SW_RESTORE": "syscall", "syscall.SW_SHOW": "syscall", "syscall.SW_SHOWDEFAULT": "syscall", "syscall.SW_SHOWMAXIMIZED": "syscall", "syscall.SW_SHOWMINIMIZED": "syscall", "syscall.SW_SHOWMINNOACTIVE": "syscall", "syscall.SW_SHOWNA": "syscall", "syscall.SW_SHOWNOACTIVATE": "syscall", "syscall.SW_SHOWNORMAL": "syscall", "syscall.SYMBOLIC_LINK_FLAG_DIRECTORY": "syscall", "syscall.SYNCHRONIZE": "syscall", "syscall.SYSCTL_VERSION": "syscall", "syscall.SYSCTL_VERS_0": "syscall", "syscall.SYSCTL_VERS_1": "syscall", "syscall.SYSCTL_VERS_MASK": "syscall", "syscall.SYS_ABORT2": "syscall", "syscall.SYS_ACCEPT": "syscall", "syscall.SYS_ACCEPT4": "syscall", "syscall.SYS_ACCEPT_NOCANCEL": "syscall", "syscall.SYS_ACCESS": "syscall", "syscall.SYS_ACCESS_EXTENDED": "syscall", "syscall.SYS_ACCT": "syscall", "syscall.SYS_ADD_KEY": "syscall", "syscall.SYS_ADD_PROFIL": "syscall", "syscall.SYS_ADJFREQ": "syscall", "syscall.SYS_ADJTIME": "syscall", "syscall.SYS_ADJTIMEX": "syscall", "syscall.SYS_AFS_SYSCALL": "syscall", "syscall.SYS_AIO_CANCEL": "syscall", "syscall.SYS_AIO_ERROR": "syscall", "syscall.SYS_AIO_FSYNC": "syscall", "syscall.SYS_AIO_READ": "syscall", "syscall.SYS_AIO_RETURN": "syscall", "syscall.SYS_AIO_SUSPEND": "syscall", "syscall.SYS_AIO_SUSPEND_NOCANCEL": "syscall", "syscall.SYS_AIO_WRITE": "syscall", "syscall.SYS_ALARM": "syscall", "syscall.SYS_ARCH_PRCTL": "syscall", "syscall.SYS_ARM_FADVISE64_64": "syscall", "syscall.SYS_ARM_SYNC_FILE_RANGE": "syscall", "syscall.SYS_ATGETMSG": "syscall", "syscall.SYS_ATPGETREQ": "syscall", "syscall.SYS_ATPGETRSP": "syscall", "syscall.SYS_ATPSNDREQ": "syscall", "syscall.SYS_ATPSNDRSP": "syscall", "syscall.SYS_ATPUTMSG": "syscall", "syscall.SYS_ATSOCKET": "syscall", "syscall.SYS_AUDIT": "syscall", "syscall.SYS_AUDITCTL": "syscall", "syscall.SYS_AUDITON": "syscall", "syscall.SYS_AUDIT_SESSION_JOIN": "syscall", "syscall.SYS_AUDIT_SESSION_PORT": "syscall", "syscall.SYS_AUDIT_SESSION_SELF": "syscall", "syscall.SYS_BDFLUSH": "syscall", "syscall.SYS_BIND": "syscall", "syscall.SYS_BINDAT": "syscall", "syscall.SYS_BREAK": "syscall", "syscall.SYS_BRK": "syscall", "syscall.SYS_BSDTHREAD_CREATE": "syscall", "syscall.SYS_BSDTHREAD_REGISTER": "syscall", "syscall.SYS_BSDTHREAD_TERMINATE": "syscall", "syscall.SYS_CAPGET": "syscall", "syscall.SYS_CAPSET": "syscall", "syscall.SYS_CAP_ENTER": "syscall", "syscall.SYS_CAP_FCNTLS_GET": "syscall", "syscall.SYS_CAP_FCNTLS_LIMIT": "syscall", "syscall.SYS_CAP_GETMODE": "syscall", "syscall.SYS_CAP_GETRIGHTS": "syscall", "syscall.SYS_CAP_IOCTLS_GET": "syscall", "syscall.SYS_CAP_IOCTLS_LIMIT": "syscall", "syscall.SYS_CAP_NEW": "syscall", "syscall.SYS_CAP_RIGHTS_GET": "syscall", "syscall.SYS_CAP_RIGHTS_LIMIT": "syscall", "syscall.SYS_CHDIR": "syscall", "syscall.SYS_CHFLAGS": "syscall", "syscall.SYS_CHFLAGSAT": "syscall", "syscall.SYS_CHMOD": "syscall", "syscall.SYS_CHMOD_EXTENDED": "syscall", "syscall.SYS_CHOWN": "syscall", "syscall.SYS_CHOWN32": "syscall", "syscall.SYS_CHROOT": "syscall", "syscall.SYS_CHUD": "syscall", "syscall.SYS_CLOCK_ADJTIME": "syscall", "syscall.SYS_CLOCK_GETCPUCLOCKID2": "syscall", "syscall.SYS_CLOCK_GETRES": "syscall", "syscall.SYS_CLOCK_GETTIME": "syscall", "syscall.SYS_CLOCK_NANOSLEEP": "syscall", "syscall.SYS_CLOCK_SETTIME": "syscall", "syscall.SYS_CLONE": "syscall", "syscall.SYS_CLOSE": "syscall", "syscall.SYS_CLOSEFROM": "syscall", "syscall.SYS_CLOSE_NOCANCEL": "syscall", "syscall.SYS_CONNECT": "syscall", "syscall.SYS_CONNECTAT": "syscall", "syscall.SYS_CONNECT_NOCANCEL": "syscall", "syscall.SYS_COPYFILE": "syscall", "syscall.SYS_CPUSET": "syscall", "syscall.SYS_CPUSET_GETAFFINITY": "syscall", "syscall.SYS_CPUSET_GETID": "syscall", "syscall.SYS_CPUSET_SETAFFINITY": "syscall", "syscall.SYS_CPUSET_SETID": "syscall", "syscall.SYS_CREAT": "syscall", "syscall.SYS_CREATE_MODULE": "syscall", "syscall.SYS_CSOPS": "syscall", "syscall.SYS_DELETE": "syscall", "syscall.SYS_DELETE_MODULE": "syscall", "syscall.SYS_DUP": "syscall", "syscall.SYS_DUP2": "syscall", "syscall.SYS_DUP3": "syscall", "syscall.SYS_EACCESS": "syscall", "syscall.SYS_EPOLL_CREATE": "syscall", "syscall.SYS_EPOLL_CREATE1": "syscall", "syscall.SYS_EPOLL_CTL": "syscall", "syscall.SYS_EPOLL_CTL_OLD": "syscall", "syscall.SYS_EPOLL_PWAIT": "syscall", "syscall.SYS_EPOLL_WAIT": "syscall", "syscall.SYS_EPOLL_WAIT_OLD": "syscall", "syscall.SYS_EVENTFD": "syscall", "syscall.SYS_EVENTFD2": "syscall", "syscall.SYS_EXCHANGEDATA": "syscall", "syscall.SYS_EXECVE": "syscall", "syscall.SYS_EXIT": "syscall", "syscall.SYS_EXIT_GROUP": "syscall", "syscall.SYS_EXTATTRCTL": "syscall", "syscall.SYS_EXTATTR_DELETE_FD": "syscall", "syscall.SYS_EXTATTR_DELETE_FILE": "syscall", "syscall.SYS_EXTATTR_DELETE_LINK": "syscall", "syscall.SYS_EXTATTR_GET_FD": "syscall", "syscall.SYS_EXTATTR_GET_FILE": "syscall", "syscall.SYS_EXTATTR_GET_LINK": "syscall", "syscall.SYS_EXTATTR_LIST_FD": "syscall", "syscall.SYS_EXTATTR_LIST_FILE": "syscall", "syscall.SYS_EXTATTR_LIST_LINK": "syscall", "syscall.SYS_EXTATTR_SET_FD": "syscall", "syscall.SYS_EXTATTR_SET_FILE": "syscall", "syscall.SYS_EXTATTR_SET_LINK": "syscall", "syscall.SYS_FACCESSAT": "syscall", "syscall.SYS_FADVISE64": "syscall", "syscall.SYS_FADVISE64_64": "syscall", "syscall.SYS_FALLOCATE": "syscall", "syscall.SYS_FANOTIFY_INIT": "syscall", "syscall.SYS_FANOTIFY_MARK": "syscall", "syscall.SYS_FCHDIR": "syscall", "syscall.SYS_FCHFLAGS": "syscall", "syscall.SYS_FCHMOD": "syscall", "syscall.SYS_FCHMODAT": "syscall", "syscall.SYS_FCHMOD_EXTENDED": "syscall", "syscall.SYS_FCHOWN": "syscall", "syscall.SYS_FCHOWN32": "syscall", "syscall.SYS_FCHOWNAT": "syscall", "syscall.SYS_FCHROOT": "syscall", "syscall.SYS_FCNTL": "syscall", "syscall.SYS_FCNTL64": "syscall", "syscall.SYS_FCNTL_NOCANCEL": "syscall", "syscall.SYS_FDATASYNC": "syscall", "syscall.SYS_FEXECVE": "syscall", "syscall.SYS_FFCLOCK_GETCOUNTER": "syscall", "syscall.SYS_FFCLOCK_GETESTIMATE": "syscall", "syscall.SYS_FFCLOCK_SETESTIMATE": "syscall", "syscall.SYS_FFSCTL": "syscall", "syscall.SYS_FGETATTRLIST": "syscall", "syscall.SYS_FGETXATTR": "syscall", "syscall.SYS_FHOPEN": "syscall", "syscall.SYS_FHSTAT": "syscall", "syscall.SYS_FHSTATFS": "syscall", "syscall.SYS_FILEPORT_MAKEFD": "syscall", "syscall.SYS_FILEPORT_MAKEPORT": "syscall", "syscall.SYS_FKTRACE": "syscall", "syscall.SYS_FLISTXATTR": "syscall", "syscall.SYS_FLOCK": "syscall", "syscall.SYS_FORK": "syscall", "syscall.SYS_FPATHCONF": "syscall", "syscall.SYS_FREEBSD6_FTRUNCATE": "syscall", "syscall.SYS_FREEBSD6_LSEEK": "syscall", "syscall.SYS_FREEBSD6_MMAP": "syscall", "syscall.SYS_FREEBSD6_PREAD": "syscall", "syscall.SYS_FREEBSD6_PWRITE": "syscall", "syscall.SYS_FREEBSD6_TRUNCATE": "syscall", "syscall.SYS_FREMOVEXATTR": "syscall", "syscall.SYS_FSCTL": "syscall", "syscall.SYS_FSETATTRLIST": "syscall", "syscall.SYS_FSETXATTR": "syscall", "syscall.SYS_FSGETPATH": "syscall", "syscall.SYS_FSTAT": "syscall", "syscall.SYS_FSTAT64": "syscall", "syscall.SYS_FSTAT64_EXTENDED": "syscall", "syscall.SYS_FSTATAT": "syscall", "syscall.SYS_FSTATAT64": "syscall", "syscall.SYS_FSTATFS": "syscall", "syscall.SYS_FSTATFS64": "syscall", "syscall.SYS_FSTATV": "syscall", "syscall.SYS_FSTATVFS1": "syscall", "syscall.SYS_FSTAT_EXTENDED": "syscall", "syscall.SYS_FSYNC": "syscall", "syscall.SYS_FSYNC_NOCANCEL": "syscall", "syscall.SYS_FSYNC_RANGE": "syscall", "syscall.SYS_FTIME": "syscall", "syscall.SYS_FTRUNCATE": "syscall", "syscall.SYS_FTRUNCATE64": "syscall", "syscall.SYS_FUTEX": "syscall", "syscall.SYS_FUTIMENS": "syscall", "syscall.SYS_FUTIMES": "syscall", "syscall.SYS_FUTIMESAT": "syscall", "syscall.SYS_GETATTRLIST": "syscall", "syscall.SYS_GETAUDIT": "syscall", "syscall.SYS_GETAUDIT_ADDR": "syscall", "syscall.SYS_GETAUID": "syscall", "syscall.SYS_GETCONTEXT": "syscall", "syscall.SYS_GETCPU": "syscall", "syscall.SYS_GETCWD": "syscall", "syscall.SYS_GETDENTS": "syscall", "syscall.SYS_GETDENTS64": "syscall", "syscall.SYS_GETDIRENTRIES": "syscall", "syscall.SYS_GETDIRENTRIES64": "syscall", "syscall.SYS_GETDIRENTRIESATTR": "syscall", "syscall.SYS_GETDTABLECOUNT": "syscall", "syscall.SYS_GETDTABLESIZE": "syscall", "syscall.SYS_GETEGID": "syscall", "syscall.SYS_GETEGID32": "syscall", "syscall.SYS_GETEUID": "syscall", "syscall.SYS_GETEUID32": "syscall", "syscall.SYS_GETFH": "syscall", "syscall.SYS_GETFSSTAT": "syscall", "syscall.SYS_GETFSSTAT64": "syscall", "syscall.SYS_GETGID": "syscall", "syscall.SYS_GETGID32": "syscall", "syscall.SYS_GETGROUPS": "syscall", "syscall.SYS_GETGROUPS32": "syscall", "syscall.SYS_GETHOSTUUID": "syscall", "syscall.SYS_GETITIMER": "syscall", "syscall.SYS_GETLCID": "syscall", "syscall.SYS_GETLOGIN": "syscall", "syscall.SYS_GETLOGINCLASS": "syscall", "syscall.SYS_GETPEERNAME": "syscall", "syscall.SYS_GETPGID": "syscall", "syscall.SYS_GETPGRP": "syscall", "syscall.SYS_GETPID": "syscall", "syscall.SYS_GETPMSG": "syscall", "syscall.SYS_GETPPID": "syscall", "syscall.SYS_GETPRIORITY": "syscall", "syscall.SYS_GETRESGID": "syscall", "syscall.SYS_GETRESGID32": "syscall", "syscall.SYS_GETRESUID": "syscall", "syscall.SYS_GETRESUID32": "syscall", "syscall.SYS_GETRLIMIT": "syscall", "syscall.SYS_GETRTABLE": "syscall", "syscall.SYS_GETRUSAGE": "syscall", "syscall.SYS_GETSGROUPS": "syscall", "syscall.SYS_GETSID": "syscall", "syscall.SYS_GETSOCKNAME": "syscall", "syscall.SYS_GETSOCKOPT": "syscall", "syscall.SYS_GETTHRID": "syscall", "syscall.SYS_GETTID": "syscall", "syscall.SYS_GETTIMEOFDAY": "syscall", "syscall.SYS_GETUID": "syscall", "syscall.SYS_GETUID32": "syscall", "syscall.SYS_GETVFSSTAT": "syscall", "syscall.SYS_GETWGROUPS": "syscall", "syscall.SYS_GETXATTR": "syscall", "syscall.SYS_GET_KERNEL_SYMS": "syscall", "syscall.SYS_GET_MEMPOLICY": "syscall", "syscall.SYS_GET_ROBUST_LIST": "syscall", "syscall.SYS_GET_THREAD_AREA": "syscall", "syscall.SYS_GTTY": "syscall", "syscall.SYS_IDENTITYSVC": "syscall", "syscall.SYS_IDLE": "syscall", "syscall.SYS_INITGROUPS": "syscall", "syscall.SYS_INIT_MODULE": "syscall", "syscall.SYS_INOTIFY_ADD_WATCH": "syscall", "syscall.SYS_INOTIFY_INIT": "syscall", "syscall.SYS_INOTIFY_INIT1": "syscall", "syscall.SYS_INOTIFY_RM_WATCH": "syscall", "syscall.SYS_IOCTL": "syscall", "syscall.SYS_IOPERM": "syscall", "syscall.SYS_IOPL": "syscall", "syscall.SYS_IOPOLICYSYS": "syscall", "syscall.SYS_IOPRIO_GET": "syscall", "syscall.SYS_IOPRIO_SET": "syscall", "syscall.SYS_IO_CANCEL": "syscall", "syscall.SYS_IO_DESTROY": "syscall", "syscall.SYS_IO_GETEVENTS": "syscall", "syscall.SYS_IO_SETUP": "syscall", "syscall.SYS_IO_SUBMIT": "syscall", "syscall.SYS_IPC": "syscall", "syscall.SYS_ISSETUGID": "syscall", "syscall.SYS_JAIL": "syscall", "syscall.SYS_JAIL_ATTACH": "syscall", "syscall.SYS_JAIL_GET": "syscall", "syscall.SYS_JAIL_REMOVE": "syscall", "syscall.SYS_JAIL_SET": "syscall", "syscall.SYS_KDEBUG_TRACE": "syscall", "syscall.SYS_KENV": "syscall", "syscall.SYS_KEVENT": "syscall", "syscall.SYS_KEVENT64": "syscall", "syscall.SYS_KEXEC_LOAD": "syscall", "syscall.SYS_KEYCTL": "syscall", "syscall.SYS_KILL": "syscall", "syscall.SYS_KLDFIND": "syscall", "syscall.SYS_KLDFIRSTMOD": "syscall", "syscall.SYS_KLDLOAD": "syscall", "syscall.SYS_KLDNEXT": "syscall", "syscall.SYS_KLDSTAT": "syscall", "syscall.SYS_KLDSYM": "syscall", "syscall.SYS_KLDUNLOAD": "syscall", "syscall.SYS_KLDUNLOADF": "syscall", "syscall.SYS_KQUEUE": "syscall", "syscall.SYS_KQUEUE1": "syscall", "syscall.SYS_KTIMER_CREATE": "syscall", "syscall.SYS_KTIMER_DELETE": "syscall", "syscall.SYS_KTIMER_GETOVERRUN": "syscall", "syscall.SYS_KTIMER_GETTIME": "syscall", "syscall.SYS_KTIMER_SETTIME": "syscall", "syscall.SYS_KTRACE": "syscall", "syscall.SYS_LCHFLAGS": "syscall", "syscall.SYS_LCHMOD": "syscall", "syscall.SYS_LCHOWN": "syscall", "syscall.SYS_LCHOWN32": "syscall", "syscall.SYS_LGETFH": "syscall", "syscall.SYS_LGETXATTR": "syscall", "syscall.SYS_LINK": "syscall", "syscall.SYS_LINKAT": "syscall", "syscall.SYS_LIO_LISTIO": "syscall", "syscall.SYS_LISTEN": "syscall", "syscall.SYS_LISTXATTR": "syscall", "syscall.SYS_LLISTXATTR": "syscall", "syscall.SYS_LOCK": "syscall", "syscall.SYS_LOOKUP_DCOOKIE": "syscall", "syscall.SYS_LPATHCONF": "syscall", "syscall.SYS_LREMOVEXATTR": "syscall", "syscall.SYS_LSEEK": "syscall", "syscall.SYS_LSETXATTR": "syscall", "syscall.SYS_LSTAT": "syscall", "syscall.SYS_LSTAT64": "syscall", "syscall.SYS_LSTAT64_EXTENDED": "syscall", "syscall.SYS_LSTATV": "syscall", "syscall.SYS_LSTAT_EXTENDED": "syscall", "syscall.SYS_LUTIMES": "syscall", "syscall.SYS_MAC_SYSCALL": "syscall", "syscall.SYS_MADVISE": "syscall", "syscall.SYS_MADVISE1": "syscall", "syscall.SYS_MAXSYSCALL": "syscall", "syscall.SYS_MBIND": "syscall", "syscall.SYS_MIGRATE_PAGES": "syscall", "syscall.SYS_MINCORE": "syscall", "syscall.SYS_MINHERIT": "syscall", "syscall.SYS_MKCOMPLEX": "syscall", "syscall.SYS_MKDIR": "syscall", "syscall.SYS_MKDIRAT": "syscall", "syscall.SYS_MKDIR_EXTENDED": "syscall", "syscall.SYS_MKFIFO": "syscall", "syscall.SYS_MKFIFOAT": "syscall", "syscall.SYS_MKFIFO_EXTENDED": "syscall", "syscall.SYS_MKNOD": "syscall", "syscall.SYS_MKNODAT": "syscall", "syscall.SYS_MLOCK": "syscall", "syscall.SYS_MLOCKALL": "syscall", "syscall.SYS_MMAP": "syscall", "syscall.SYS_MMAP2": "syscall", "syscall.SYS_MODCTL": "syscall", "syscall.SYS_MODFIND": "syscall", "syscall.SYS_MODFNEXT": "syscall", "syscall.SYS_MODIFY_LDT": "syscall", "syscall.SYS_MODNEXT": "syscall", "syscall.SYS_MODSTAT": "syscall", "syscall.SYS_MODWATCH": "syscall", "syscall.SYS_MOUNT": "syscall", "syscall.SYS_MOVE_PAGES": "syscall", "syscall.SYS_MPROTECT": "syscall", "syscall.SYS_MPX": "syscall", "syscall.SYS_MQUERY": "syscall", "syscall.SYS_MQ_GETSETATTR": "syscall", "syscall.SYS_MQ_NOTIFY": "syscall", "syscall.SYS_MQ_OPEN": "syscall", "syscall.SYS_MQ_TIMEDRECEIVE": "syscall", "syscall.SYS_MQ_TIMEDSEND": "syscall", "syscall.SYS_MQ_UNLINK": "syscall", "syscall.SYS_MREMAP": "syscall", "syscall.SYS_MSGCTL": "syscall", "syscall.SYS_MSGGET": "syscall", "syscall.SYS_MSGRCV": "syscall", "syscall.SYS_MSGRCV_NOCANCEL": "syscall", "syscall.SYS_MSGSND": "syscall", "syscall.SYS_MSGSND_NOCANCEL": "syscall", "syscall.SYS_MSGSYS": "syscall", "syscall.SYS_MSYNC": "syscall", "syscall.SYS_MSYNC_NOCANCEL": "syscall", "syscall.SYS_MUNLOCK": "syscall", "syscall.SYS_MUNLOCKALL": "syscall", "syscall.SYS_MUNMAP": "syscall", "syscall.SYS_NAME_TO_HANDLE_AT": "syscall", "syscall.SYS_NANOSLEEP": "syscall", "syscall.SYS_NEWFSTATAT": "syscall", "syscall.SYS_NFSCLNT": "syscall", "syscall.SYS_NFSSERVCTL": "syscall", "syscall.SYS_NFSSVC": "syscall", "syscall.SYS_NFSTAT": "syscall", "syscall.SYS_NICE": "syscall", "syscall.SYS_NLSTAT": "syscall", "syscall.SYS_NMOUNT": "syscall", "syscall.SYS_NSTAT": "syscall", "syscall.SYS_NTP_ADJTIME": "syscall", "syscall.SYS_NTP_GETTIME": "syscall", "syscall.SYS_OABI_SYSCALL_BASE": "syscall", "syscall.SYS_OBREAK": "syscall", "syscall.SYS_OLDFSTAT": "syscall", "syscall.SYS_OLDLSTAT": "syscall", "syscall.SYS_OLDOLDUNAME": "syscall", "syscall.SYS_OLDSTAT": "syscall", "syscall.SYS_OLDUNAME": "syscall", "syscall.SYS_OPEN": "syscall", "syscall.SYS_OPENAT": "syscall", "syscall.SYS_OPENBSD_POLL": "syscall", "syscall.SYS_OPEN_BY_HANDLE_AT": "syscall", "syscall.SYS_OPEN_EXTENDED": "syscall", "syscall.SYS_OPEN_NOCANCEL": "syscall", "syscall.SYS_OVADVISE": "syscall", "syscall.SYS_PACCEPT": "syscall", "syscall.SYS_PATHCONF": "syscall", "syscall.SYS_PAUSE": "syscall", "syscall.SYS_PCICONFIG_IOBASE": "syscall", "syscall.SYS_PCICONFIG_READ": "syscall", "syscall.SYS_PCICONFIG_WRITE": "syscall", "syscall.SYS_PDFORK": "syscall", "syscall.SYS_PDGETPID": "syscall", "syscall.SYS_PDKILL": "syscall", "syscall.SYS_PERF_EVENT_OPEN": "syscall", "syscall.SYS_PERSONALITY": "syscall", "syscall.SYS_PID_HIBERNATE": "syscall", "syscall.SYS_PID_RESUME": "syscall", "syscall.SYS_PID_SHUTDOWN_SOCKETS": "syscall", "syscall.SYS_PID_SUSPEND": "syscall", "syscall.SYS_PIPE": "syscall", "syscall.SYS_PIPE2": "syscall", "syscall.SYS_PIVOT_ROOT": "syscall", "syscall.SYS_PMC_CONTROL": "syscall", "syscall.SYS_PMC_GET_INFO": "syscall", "syscall.SYS_POLL": "syscall", "syscall.SYS_POLLTS": "syscall", "syscall.SYS_POLL_NOCANCEL": "syscall", "syscall.SYS_POSIX_FADVISE": "syscall", "syscall.SYS_POSIX_FALLOCATE": "syscall", "syscall.SYS_POSIX_OPENPT": "syscall", "syscall.SYS_POSIX_SPAWN": "syscall", "syscall.SYS_PPOLL": "syscall", "syscall.SYS_PRCTL": "syscall", "syscall.SYS_PREAD": "syscall", "syscall.SYS_PREAD64": "syscall", "syscall.SYS_PREADV": "syscall", "syscall.SYS_PREAD_NOCANCEL": "syscall", "syscall.SYS_PRLIMIT64": "syscall", "syscall.SYS_PROCCTL": "syscall", "syscall.SYS_PROCESS_POLICY": "syscall", "syscall.SYS_PROCESS_VM_READV": "syscall", "syscall.SYS_PROCESS_VM_WRITEV": "syscall", "syscall.SYS_PROC_INFO": "syscall", "syscall.SYS_PROF": "syscall", "syscall.SYS_PROFIL": "syscall", "syscall.SYS_PSELECT": "syscall", "syscall.SYS_PSELECT6": "syscall", "syscall.SYS_PSET_ASSIGN": "syscall", "syscall.SYS_PSET_CREATE": "syscall", "syscall.SYS_PSET_DESTROY": "syscall", "syscall.SYS_PSYNCH_CVBROAD": "syscall", "syscall.SYS_PSYNCH_CVCLRPREPOST": "syscall", "syscall.SYS_PSYNCH_CVSIGNAL": "syscall", "syscall.SYS_PSYNCH_CVWAIT": "syscall", "syscall.SYS_PSYNCH_MUTEXDROP": "syscall", "syscall.SYS_PSYNCH_MUTEXWAIT": "syscall", "syscall.SYS_PSYNCH_RW_DOWNGRADE": "syscall", "syscall.SYS_PSYNCH_RW_LONGRDLOCK": "syscall", "syscall.SYS_PSYNCH_RW_RDLOCK": "syscall", "syscall.SYS_PSYNCH_RW_UNLOCK": "syscall", "syscall.SYS_PSYNCH_RW_UNLOCK2": "syscall", "syscall.SYS_PSYNCH_RW_UPGRADE": "syscall", "syscall.SYS_PSYNCH_RW_WRLOCK": "syscall", "syscall.SYS_PSYNCH_RW_YIELDWRLOCK": "syscall", "syscall.SYS_PTRACE": "syscall", "syscall.SYS_PUTPMSG": "syscall", "syscall.SYS_PWRITE": "syscall", "syscall.SYS_PWRITE64": "syscall", "syscall.SYS_PWRITEV": "syscall", "syscall.SYS_PWRITE_NOCANCEL": "syscall", "syscall.SYS_QUERY_MODULE": "syscall", "syscall.SYS_QUOTACTL": "syscall", "syscall.SYS_RASCTL": "syscall", "syscall.SYS_RCTL_ADD_RULE": "syscall", "syscall.SYS_RCTL_GET_LIMITS": "syscall", "syscall.SYS_RCTL_GET_RACCT": "syscall", "syscall.SYS_RCTL_GET_RULES": "syscall", "syscall.SYS_RCTL_REMOVE_RULE": "syscall", "syscall.SYS_READ": "syscall", "syscall.SYS_READAHEAD": "syscall", "syscall.SYS_READDIR": "syscall", "syscall.SYS_READLINK": "syscall", "syscall.SYS_READLINKAT": "syscall", "syscall.SYS_READV": "syscall", "syscall.SYS_READV_NOCANCEL": "syscall", "syscall.SYS_READ_NOCANCEL": "syscall", "syscall.SYS_REBOOT": "syscall", "syscall.SYS_RECV": "syscall", "syscall.SYS_RECVFROM": "syscall", "syscall.SYS_RECVFROM_NOCANCEL": "syscall", "syscall.SYS_RECVMMSG": "syscall", "syscall.SYS_RECVMSG": "syscall", "syscall.SYS_RECVMSG_NOCANCEL": "syscall", "syscall.SYS_REMAP_FILE_PAGES": "syscall", "syscall.SYS_REMOVEXATTR": "syscall", "syscall.SYS_RENAME": "syscall", "syscall.SYS_RENAMEAT": "syscall", "syscall.SYS_REQUEST_KEY": "syscall", "syscall.SYS_RESTART_SYSCALL": "syscall", "syscall.SYS_REVOKE": "syscall", "syscall.SYS_RFORK": "syscall", "syscall.SYS_RMDIR": "syscall", "syscall.SYS_RTPRIO": "syscall", "syscall.SYS_RTPRIO_THREAD": "syscall", "syscall.SYS_RT_SIGACTION": "syscall", "syscall.SYS_RT_SIGPENDING": "syscall", "syscall.SYS_RT_SIGPROCMASK": "syscall", "syscall.SYS_RT_SIGQUEUEINFO": "syscall", "syscall.SYS_RT_SIGRETURN": "syscall", "syscall.SYS_RT_SIGSUSPEND": "syscall", "syscall.SYS_RT_SIGTIMEDWAIT": "syscall", "syscall.SYS_RT_TGSIGQUEUEINFO": "syscall", "syscall.SYS_SBRK": "syscall", "syscall.SYS_SCHED_GETAFFINITY": "syscall", "syscall.SYS_SCHED_GETPARAM": "syscall", "syscall.SYS_SCHED_GETSCHEDULER": "syscall", "syscall.SYS_SCHED_GET_PRIORITY_MAX": "syscall", "syscall.SYS_SCHED_GET_PRIORITY_MIN": "syscall", "syscall.SYS_SCHED_RR_GET_INTERVAL": "syscall", "syscall.SYS_SCHED_SETAFFINITY": "syscall", "syscall.SYS_SCHED_SETPARAM": "syscall", "syscall.SYS_SCHED_SETSCHEDULER": "syscall", "syscall.SYS_SCHED_YIELD": "syscall", "syscall.SYS_SCTP_GENERIC_RECVMSG": "syscall", "syscall.SYS_SCTP_GENERIC_SENDMSG": "syscall", "syscall.SYS_SCTP_GENERIC_SENDMSG_IOV": "syscall", "syscall.SYS_SCTP_PEELOFF": "syscall", "syscall.SYS_SEARCHFS": "syscall", "syscall.SYS_SECURITY": "syscall", "syscall.SYS_SELECT": "syscall", "syscall.SYS_SELECT_NOCANCEL": "syscall", "syscall.SYS_SEMCONFIG": "syscall", "syscall.SYS_SEMCTL": "syscall", "syscall.SYS_SEMGET": "syscall", "syscall.SYS_SEMOP": "syscall", "syscall.SYS_SEMSYS": "syscall", "syscall.SYS_SEMTIMEDOP": "syscall", "syscall.SYS_SEM_CLOSE": "syscall", "syscall.SYS_SEM_DESTROY": "syscall", "syscall.SYS_SEM_GETVALUE": "syscall", "syscall.SYS_SEM_INIT": "syscall", "syscall.SYS_SEM_OPEN": "syscall", "syscall.SYS_SEM_POST": "syscall", "syscall.SYS_SEM_TRYWAIT": "syscall", "syscall.SYS_SEM_UNLINK": "syscall", "syscall.SYS_SEM_WAIT": "syscall", "syscall.SYS_SEM_WAIT_NOCANCEL": "syscall", "syscall.SYS_SEND": "syscall", "syscall.SYS_SENDFILE": "syscall", "syscall.SYS_SENDFILE64": "syscall", "syscall.SYS_SENDMMSG": "syscall", "syscall.SYS_SENDMSG": "syscall", "syscall.SYS_SENDMSG_NOCANCEL": "syscall", "syscall.SYS_SENDTO": "syscall", "syscall.SYS_SENDTO_NOCANCEL": "syscall", "syscall.SYS_SETATTRLIST": "syscall", "syscall.SYS_SETAUDIT": "syscall", "syscall.SYS_SETAUDIT_ADDR": "syscall", "syscall.SYS_SETAUID": "syscall", "syscall.SYS_SETCONTEXT": "syscall", "syscall.SYS_SETDOMAINNAME": "syscall", "syscall.SYS_SETEGID": "syscall", "syscall.SYS_SETEUID": "syscall", "syscall.SYS_SETFIB": "syscall", "syscall.SYS_SETFSGID": "syscall", "syscall.SYS_SETFSGID32": "syscall", "syscall.SYS_SETFSUID": "syscall", "syscall.SYS_SETFSUID32": "syscall", "syscall.SYS_SETGID": "syscall", "syscall.SYS_SETGID32": "syscall", "syscall.SYS_SETGROUPS": "syscall", "syscall.SYS_SETGROUPS32": "syscall", "syscall.SYS_SETHOSTNAME": "syscall", "syscall.SYS_SETITIMER": "syscall", "syscall.SYS_SETLCID": "syscall", "syscall.SYS_SETLOGIN": "syscall", "syscall.SYS_SETLOGINCLASS": "syscall", "syscall.SYS_SETNS": "syscall", "syscall.SYS_SETPGID": "syscall", "syscall.SYS_SETPRIORITY": "syscall", "syscall.SYS_SETPRIVEXEC": "syscall", "syscall.SYS_SETREGID": "syscall", "syscall.SYS_SETREGID32": "syscall", "syscall.SYS_SETRESGID": "syscall", "syscall.SYS_SETRESGID32": "syscall", "syscall.SYS_SETRESUID": "syscall", "syscall.SYS_SETRESUID32": "syscall", "syscall.SYS_SETREUID": "syscall", "syscall.SYS_SETREUID32": "syscall", "syscall.SYS_SETRLIMIT": "syscall", "syscall.SYS_SETRTABLE": "syscall", "syscall.SYS_SETSGROUPS": "syscall", "syscall.SYS_SETSID": "syscall", "syscall.SYS_SETSOCKOPT": "syscall", "syscall.SYS_SETTID": "syscall", "syscall.SYS_SETTID_WITH_PID": "syscall", "syscall.SYS_SETTIMEOFDAY": "syscall", "syscall.SYS_SETUID": "syscall", "syscall.SYS_SETUID32": "syscall", "syscall.SYS_SETWGROUPS": "syscall", "syscall.SYS_SETXATTR": "syscall", "syscall.SYS_SET_MEMPOLICY": "syscall", "syscall.SYS_SET_ROBUST_LIST": "syscall", "syscall.SYS_SET_THREAD_AREA": "syscall", "syscall.SYS_SET_TID_ADDRESS": "syscall", "syscall.SYS_SGETMASK": "syscall", "syscall.SYS_SHARED_REGION_CHECK_NP": "syscall", "syscall.SYS_SHARED_REGION_MAP_AND_SLIDE_NP": "syscall", "syscall.SYS_SHMAT": "syscall", "syscall.SYS_SHMCTL": "syscall", "syscall.SYS_SHMDT": "syscall", "syscall.SYS_SHMGET": "syscall", "syscall.SYS_SHMSYS": "syscall", "syscall.SYS_SHM_OPEN": "syscall", "syscall.SYS_SHM_UNLINK": "syscall", "syscall.SYS_SHUTDOWN": "syscall", "syscall.SYS_SIGACTION": "syscall", "syscall.SYS_SIGALTSTACK": "syscall", "syscall.SYS_SIGNAL": "syscall", "syscall.SYS_SIGNALFD": "syscall", "syscall.SYS_SIGNALFD4": "syscall", "syscall.SYS_SIGPENDING": "syscall", "syscall.SYS_SIGPROCMASK": "syscall", "syscall.SYS_SIGQUEUE": "syscall", "syscall.SYS_SIGQUEUEINFO": "syscall", "syscall.SYS_SIGRETURN": "syscall", "syscall.SYS_SIGSUSPEND": "syscall", "syscall.SYS_SIGSUSPEND_NOCANCEL": "syscall", "syscall.SYS_SIGTIMEDWAIT": "syscall", "syscall.SYS_SIGWAIT": "syscall", "syscall.SYS_SIGWAITINFO": "syscall", "syscall.SYS_SOCKET": "syscall", "syscall.SYS_SOCKETCALL": "syscall", "syscall.SYS_SOCKETPAIR": "syscall", "syscall.SYS_SPLICE": "syscall", "syscall.SYS_SSETMASK": "syscall", "syscall.SYS_SSTK": "syscall", "syscall.SYS_STACK_SNAPSHOT": "syscall", "syscall.SYS_STAT": "syscall", "syscall.SYS_STAT64": "syscall", "syscall.SYS_STAT64_EXTENDED": "syscall", "syscall.SYS_STATFS": "syscall", "syscall.SYS_STATFS64": "syscall", "syscall.SYS_STATV": "syscall", "syscall.SYS_STATVFS1": "syscall", "syscall.SYS_STAT_EXTENDED": "syscall", "syscall.SYS_STIME": "syscall", "syscall.SYS_STTY": "syscall", "syscall.SYS_SWAPCONTEXT": "syscall", "syscall.SYS_SWAPCTL": "syscall", "syscall.SYS_SWAPOFF": "syscall", "syscall.SYS_SWAPON": "syscall", "syscall.SYS_SYMLINK": "syscall", "syscall.SYS_SYMLINKAT": "syscall", "syscall.SYS_SYNC": "syscall", "syscall.SYS_SYNCFS": "syscall", "syscall.SYS_SYNC_FILE_RANGE": "syscall", "syscall.SYS_SYSARCH": "syscall", "syscall.SYS_SYSCALL": "syscall", "syscall.SYS_SYSCALL_BASE": "syscall", "syscall.SYS_SYSFS": "syscall", "syscall.SYS_SYSINFO": "syscall", "syscall.SYS_SYSLOG": "syscall", "syscall.SYS_TEE": "syscall", "syscall.SYS_TGKILL": "syscall", "syscall.SYS_THREAD_SELFID": "syscall", "syscall.SYS_THR_CREATE": "syscall", "syscall.SYS_THR_EXIT": "syscall", "syscall.SYS_THR_KILL": "syscall", "syscall.SYS_THR_KILL2": "syscall", "syscall.SYS_THR_NEW": "syscall", "syscall.SYS_THR_SELF": "syscall", "syscall.SYS_THR_SET_NAME": "syscall", "syscall.SYS_THR_SUSPEND": "syscall", "syscall.SYS_THR_WAKE": "syscall", "syscall.SYS_TIME": "syscall", "syscall.SYS_TIMERFD_CREATE": "syscall", "syscall.SYS_TIMERFD_GETTIME": "syscall", "syscall.SYS_TIMERFD_SETTIME": "syscall", "syscall.SYS_TIMER_CREATE": "syscall", "syscall.SYS_TIMER_DELETE": "syscall", "syscall.SYS_TIMER_GETOVERRUN": "syscall", "syscall.SYS_TIMER_GETTIME": "syscall", "syscall.SYS_TIMER_SETTIME": "syscall", "syscall.SYS_TIMES": "syscall", "syscall.SYS_TKILL": "syscall", "syscall.SYS_TRUNCATE": "syscall", "syscall.SYS_TRUNCATE64": "syscall", "syscall.SYS_TUXCALL": "syscall", "syscall.SYS_UGETRLIMIT": "syscall", "syscall.SYS_ULIMIT": "syscall", "syscall.SYS_UMASK": "syscall", "syscall.SYS_UMASK_EXTENDED": "syscall", "syscall.SYS_UMOUNT": "syscall", "syscall.SYS_UMOUNT2": "syscall", "syscall.SYS_UNAME": "syscall", "syscall.SYS_UNDELETE": "syscall", "syscall.SYS_UNLINK": "syscall", "syscall.SYS_UNLINKAT": "syscall", "syscall.SYS_UNMOUNT": "syscall", "syscall.SYS_UNSHARE": "syscall", "syscall.SYS_USELIB": "syscall", "syscall.SYS_USTAT": "syscall", "syscall.SYS_UTIME": "syscall", "syscall.SYS_UTIMENSAT": "syscall", "syscall.SYS_UTIMES": "syscall", "syscall.SYS_UTRACE": "syscall", "syscall.SYS_UUIDGEN": "syscall", "syscall.SYS_VADVISE": "syscall", "syscall.SYS_VFORK": "syscall", "syscall.SYS_VHANGUP": "syscall", "syscall.SYS_VM86": "syscall", "syscall.SYS_VM86OLD": "syscall", "syscall.SYS_VMSPLICE": "syscall", "syscall.SYS_VM_PRESSURE_MONITOR": "syscall", "syscall.SYS_VSERVER": "syscall", "syscall.SYS_WAIT4": "syscall", "syscall.SYS_WAIT4_NOCANCEL": "syscall", "syscall.SYS_WAIT6": "syscall", "syscall.SYS_WAITEVENT": "syscall", "syscall.SYS_WAITID": "syscall", "syscall.SYS_WAITID_NOCANCEL": "syscall", "syscall.SYS_WAITPID": "syscall", "syscall.SYS_WATCHEVENT": "syscall", "syscall.SYS_WORKQ_KERNRETURN": "syscall", "syscall.SYS_WORKQ_OPEN": "syscall", "syscall.SYS_WRITE": "syscall", "syscall.SYS_WRITEV": "syscall", "syscall.SYS_WRITEV_NOCANCEL": "syscall", "syscall.SYS_WRITE_NOCANCEL": "syscall", "syscall.SYS_YIELD": "syscall", "syscall.SYS__LLSEEK": "syscall", "syscall.SYS__LWP_CONTINUE": "syscall", "syscall.SYS__LWP_CREATE": "syscall", "syscall.SYS__LWP_CTL": "syscall", "syscall.SYS__LWP_DETACH": "syscall", "syscall.SYS__LWP_EXIT": "syscall", "syscall.SYS__LWP_GETNAME": "syscall", "syscall.SYS__LWP_GETPRIVATE": "syscall", "syscall.SYS__LWP_KILL": "syscall", "syscall.SYS__LWP_PARK": "syscall", "syscall.SYS__LWP_SELF": "syscall", "syscall.SYS__LWP_SETNAME": "syscall", "syscall.SYS__LWP_SETPRIVATE": "syscall", "syscall.SYS__LWP_SUSPEND": "syscall", "syscall.SYS__LWP_UNPARK": "syscall", "syscall.SYS__LWP_UNPARK_ALL": "syscall", "syscall.SYS__LWP_WAIT": "syscall", "syscall.SYS__LWP_WAKEUP": "syscall", "syscall.SYS__NEWSELECT": "syscall", "syscall.SYS__PSET_BIND": "syscall", "syscall.SYS__SCHED_GETAFFINITY": "syscall", "syscall.SYS__SCHED_GETPARAM": "syscall", "syscall.SYS__SCHED_SETAFFINITY": "syscall", "syscall.SYS__SCHED_SETPARAM": "syscall", "syscall.SYS__SYSCTL": "syscall", "syscall.SYS__UMTX_LOCK": "syscall", "syscall.SYS__UMTX_OP": "syscall", "syscall.SYS__UMTX_UNLOCK": "syscall", "syscall.SYS___ACL_ACLCHECK_FD": "syscall", "syscall.SYS___ACL_ACLCHECK_FILE": "syscall", "syscall.SYS___ACL_ACLCHECK_LINK": "syscall", "syscall.SYS___ACL_DELETE_FD": "syscall", "syscall.SYS___ACL_DELETE_FILE": "syscall", "syscall.SYS___ACL_DELETE_LINK": "syscall", "syscall.SYS___ACL_GET_FD": "syscall", "syscall.SYS___ACL_GET_FILE": "syscall", "syscall.SYS___ACL_GET_LINK": "syscall", "syscall.SYS___ACL_SET_FD": "syscall", "syscall.SYS___ACL_SET_FILE": "syscall", "syscall.SYS___ACL_SET_LINK": "syscall", "syscall.SYS___CLONE": "syscall", "syscall.SYS___DISABLE_THREADSIGNAL": "syscall", "syscall.SYS___GETCWD": "syscall", "syscall.SYS___GETLOGIN": "syscall", "syscall.SYS___GET_TCB": "syscall", "syscall.SYS___MAC_EXECVE": "syscall", "syscall.SYS___MAC_GETFSSTAT": "syscall", "syscall.SYS___MAC_GET_FD": "syscall", "syscall.SYS___MAC_GET_FILE": "syscall", "syscall.SYS___MAC_GET_LCID": "syscall", "syscall.SYS___MAC_GET_LCTX": "syscall", "syscall.SYS___MAC_GET_LINK": "syscall", "syscall.SYS___MAC_GET_MOUNT": "syscall", "syscall.SYS___MAC_GET_PID": "syscall", "syscall.SYS___MAC_GET_PROC": "syscall", "syscall.SYS___MAC_MOUNT": "syscall", "syscall.SYS___MAC_SET_FD": "syscall", "syscall.SYS___MAC_SET_FILE": "syscall", "syscall.SYS___MAC_SET_LCTX": "syscall", "syscall.SYS___MAC_SET_LINK": "syscall", "syscall.SYS___MAC_SET_PROC": "syscall", "syscall.SYS___MAC_SYSCALL": "syscall", "syscall.SYS___OLD_SEMWAIT_SIGNAL": "syscall", "syscall.SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL": "syscall", "syscall.SYS___POSIX_CHOWN": "syscall", "syscall.SYS___POSIX_FCHOWN": "syscall", "syscall.SYS___POSIX_LCHOWN": "syscall", "syscall.SYS___POSIX_RENAME": "syscall", "syscall.SYS___PTHREAD_CANCELED": "syscall", "syscall.SYS___PTHREAD_CHDIR": "syscall", "syscall.SYS___PTHREAD_FCHDIR": "syscall", "syscall.SYS___PTHREAD_KILL": "syscall", "syscall.SYS___PTHREAD_MARKCANCEL": "syscall", "syscall.SYS___PTHREAD_SIGMASK": "syscall", "syscall.SYS___QUOTACTL": "syscall", "syscall.SYS___SEMCTL": "syscall", "syscall.SYS___SEMWAIT_SIGNAL": "syscall", "syscall.SYS___SEMWAIT_SIGNAL_NOCANCEL": "syscall", "syscall.SYS___SETLOGIN": "syscall", "syscall.SYS___SETUGID": "syscall", "syscall.SYS___SET_TCB": "syscall", "syscall.SYS___SIGACTION_SIGTRAMP": "syscall", "syscall.SYS___SIGTIMEDWAIT": "syscall", "syscall.SYS___SIGWAIT": "syscall", "syscall.SYS___SIGWAIT_NOCANCEL": "syscall", "syscall.SYS___SYSCTL": "syscall", "syscall.SYS___TFORK": "syscall", "syscall.SYS___THREXIT": "syscall", "syscall.SYS___THRSIGDIVERT": "syscall", "syscall.SYS___THRSLEEP": "syscall", "syscall.SYS___THRWAKEUP": "syscall", "syscall.S_ARCH1": "syscall", "syscall.S_ARCH2": "syscall", "syscall.S_BLKSIZE": "syscall", "syscall.S_IEXEC": "syscall", "syscall.S_IFBLK": "syscall", "syscall.S_IFCHR": "syscall", "syscall.S_IFDIR": "syscall", "syscall.S_IFIFO": "syscall", "syscall.S_IFLNK": "syscall", "syscall.S_IFMT": "syscall", "syscall.S_IFREG": "syscall", "syscall.S_IFSOCK": "syscall", "syscall.S_IFWHT": "syscall", "syscall.S_IREAD": "syscall", "syscall.S_IRGRP": "syscall", "syscall.S_IROTH": "syscall", "syscall.S_IRUSR": "syscall", "syscall.S_IRWXG": "syscall", "syscall.S_IRWXO": "syscall", "syscall.S_IRWXU": "syscall", "syscall.S_ISGID": "syscall", "syscall.S_ISTXT": "syscall", "syscall.S_ISUID": "syscall", "syscall.S_ISVTX": "syscall", "syscall.S_IWGRP": "syscall", "syscall.S_IWOTH": "syscall", "syscall.S_IWRITE": "syscall", "syscall.S_IWUSR": "syscall", "syscall.S_IXGRP": "syscall", "syscall.S_IXOTH": "syscall", "syscall.S_IXUSR": "syscall", "syscall.S_LOGIN_SET": "syscall", "syscall.SecurityAttributes": "syscall", "syscall.Seek": "syscall", "syscall.Select": "syscall", "syscall.Sendfile": "syscall", "syscall.Sendmsg": "syscall", "syscall.SendmsgN": "syscall", "syscall.Sendto": "syscall", "syscall.Servent": "syscall", "syscall.SetBpf": "syscall", "syscall.SetBpfBuflen": "syscall", "syscall.SetBpfDatalink": "syscall", "syscall.SetBpfHeadercmpl": "syscall", "syscall.SetBpfImmediate": "syscall", "syscall.SetBpfInterface": "syscall", "syscall.SetBpfPromisc": "syscall", "syscall.SetBpfTimeout": "syscall", "syscall.SetCurrentDirectory": "syscall", "syscall.SetEndOfFile": "syscall", "syscall.SetEnvironmentVariable": "syscall", "syscall.SetFileAttributes": "syscall", "syscall.SetFileCompletionNotificationModes": "syscall", "syscall.SetFilePointer": "syscall", "syscall.SetFileTime": "syscall", "syscall.SetHandleInformation": "syscall", "syscall.SetKevent": "syscall", "syscall.SetLsfPromisc": "syscall", "syscall.SetNonblock": "syscall", "syscall.Setdomainname": "syscall", "syscall.Setegid": "syscall", "syscall.Setenv": "syscall", "syscall.Seteuid": "syscall", "syscall.Setfsgid": "syscall", "syscall.Setfsuid": "syscall", "syscall.Setgid": "syscall", "syscall.Setgroups": "syscall", "syscall.Sethostname": "syscall", "syscall.Setlogin": "syscall", "syscall.Setpgid": "syscall", "syscall.Setpriority": "syscall", "syscall.Setprivexec": "syscall", "syscall.Setregid": "syscall", "syscall.Setresgid": "syscall", "syscall.Setresuid": "syscall", "syscall.Setreuid": "syscall", "syscall.Setrlimit": "syscall", "syscall.Setsid": "syscall", "syscall.Setsockopt": "syscall", "syscall.SetsockoptByte": "syscall", "syscall.SetsockoptICMPv6Filter": "syscall", "syscall.SetsockoptIPMreq": "syscall", "syscall.SetsockoptIPMreqn": "syscall", "syscall.SetsockoptIPv6Mreq": "syscall", "syscall.SetsockoptInet4Addr": "syscall", "syscall.SetsockoptInt": "syscall", "syscall.SetsockoptLinger": "syscall", "syscall.SetsockoptString": "syscall", "syscall.SetsockoptTimeval": "syscall", "syscall.Settimeofday": "syscall", "syscall.Setuid": "syscall", "syscall.Setxattr": "syscall", "syscall.Shutdown": "syscall", "syscall.SidTypeAlias": "syscall", "syscall.SidTypeComputer": "syscall", "syscall.SidTypeDeletedAccount": "syscall", "syscall.SidTypeDomain": "syscall", "syscall.SidTypeGroup": "syscall", "syscall.SidTypeInvalid": "syscall", "syscall.SidTypeLabel": "syscall", "syscall.SidTypeUnknown": "syscall", "syscall.SidTypeUser": "syscall", "syscall.SidTypeWellKnownGroup": "syscall", "syscall.Signal": "syscall", "syscall.SizeofBpfHdr": "syscall", "syscall.SizeofBpfInsn": "syscall", "syscall.SizeofBpfProgram": "syscall", "syscall.SizeofBpfStat": "syscall", "syscall.SizeofBpfVersion": "syscall", "syscall.SizeofBpfZbuf": "syscall", "syscall.SizeofBpfZbufHeader": "syscall", "syscall.SizeofCmsghdr": "syscall", "syscall.SizeofICMPv6Filter": "syscall", "syscall.SizeofIPMreq": "syscall", "syscall.SizeofIPMreqn": "syscall", "syscall.SizeofIPv6MTUInfo": "syscall", "syscall.SizeofIPv6Mreq": "syscall", "syscall.SizeofIfAddrmsg": "syscall", "syscall.SizeofIfAnnounceMsghdr": "syscall", "syscall.SizeofIfData": "syscall", "syscall.SizeofIfInfomsg": "syscall", "syscall.SizeofIfMsghdr": "syscall", "syscall.SizeofIfaMsghdr": "syscall", "syscall.SizeofIfmaMsghdr": "syscall", "syscall.SizeofIfmaMsghdr2": "syscall", "syscall.SizeofInet4Pktinfo": "syscall", "syscall.SizeofInet6Pktinfo": "syscall", "syscall.SizeofInotifyEvent": "syscall", "syscall.SizeofLinger": "syscall", "syscall.SizeofMsghdr": "syscall", "syscall.SizeofNlAttr": "syscall", "syscall.SizeofNlMsgerr": "syscall", "syscall.SizeofNlMsghdr": "syscall", "syscall.SizeofRtAttr": "syscall", "syscall.SizeofRtGenmsg": "syscall", "syscall.SizeofRtMetrics": "syscall", "syscall.SizeofRtMsg": "syscall", "syscall.SizeofRtMsghdr": "syscall", "syscall.SizeofRtNexthop": "syscall", "syscall.SizeofSockFilter": "syscall", "syscall.SizeofSockFprog": "syscall", "syscall.SizeofSockaddrAny": "syscall", "syscall.SizeofSockaddrDatalink": "syscall", "syscall.SizeofSockaddrInet4": "syscall", "syscall.SizeofSockaddrInet6": "syscall", "syscall.SizeofSockaddrLinklayer": "syscall", "syscall.SizeofSockaddrNetlink": "syscall", "syscall.SizeofSockaddrUnix": "syscall", "syscall.SizeofTCPInfo": "syscall", "syscall.SizeofUcred": "syscall", "syscall.SlicePtrFromStrings": "syscall", "syscall.SockFilter": "syscall", "syscall.SockFprog": "syscall", "syscall.SockaddrDatalink": "syscall", "syscall.SockaddrGen": "syscall", "syscall.SockaddrInet4": "syscall", "syscall.SockaddrInet6": "syscall", "syscall.SockaddrLinklayer": "syscall", "syscall.SockaddrNetlink": "syscall", "syscall.SockaddrUnix": "syscall", "syscall.Socket": "syscall", "syscall.SocketControlMessage": "syscall", "syscall.SocketDisableIPv6": "syscall", "syscall.Socketpair": "syscall", "syscall.Splice": "syscall", "syscall.StartProcess": "syscall", "syscall.StartupInfo": "syscall", "syscall.Stat": "syscall", "syscall.Stat_t": "syscall", "syscall.Statfs": "syscall", "syscall.Statfs_t": "syscall", "syscall.Stderr": "syscall", "syscall.Stdin": "syscall", "syscall.Stdout": "syscall", "syscall.StringBytePtr": "syscall", "syscall.StringByteSlice": "syscall", "syscall.StringSlicePtr": "syscall", "syscall.StringToSid": "syscall", "syscall.StringToUTF16": "syscall", "syscall.StringToUTF16Ptr": "syscall", "syscall.Symlink": "syscall", "syscall.Sync": "syscall", "syscall.SyncFileRange": "syscall", "syscall.SysProcAttr": "syscall", "syscall.SysProcIDMap": "syscall", "syscall.Syscall": "syscall", "syscall.Syscall12": "syscall", "syscall.Syscall15": "syscall", "syscall.Syscall6": "syscall", "syscall.Syscall9": "syscall", "syscall.Sysctl": "syscall", "syscall.SysctlUint32": "syscall", "syscall.Sysctlnode": "syscall", "syscall.Sysinfo": "syscall", "syscall.Sysinfo_t": "syscall", "syscall.Systemtime": "syscall", "syscall.TCGETS": "syscall", "syscall.TCIFLUSH": "syscall", "syscall.TCIOFLUSH": "syscall", "syscall.TCOFLUSH": "syscall", "syscall.TCPInfo": "syscall", "syscall.TCPKeepalive": "syscall", "syscall.TCP_CA_NAME_MAX": "syscall", "syscall.TCP_CONGCTL": "syscall", "syscall.TCP_CONGESTION": "syscall", "syscall.TCP_CONNECTIONTIMEOUT": "syscall", "syscall.TCP_CORK": "syscall", "syscall.TCP_DEFER_ACCEPT": "syscall", "syscall.TCP_INFO": "syscall", "syscall.TCP_KEEPALIVE": "syscall", "syscall.TCP_KEEPCNT": "syscall", "syscall.TCP_KEEPIDLE": "syscall", "syscall.TCP_KEEPINIT": "syscall", "syscall.TCP_KEEPINTVL": "syscall", "syscall.TCP_LINGER2": "syscall", "syscall.TCP_MAXBURST": "syscall", "syscall.TCP_MAXHLEN": "syscall", "syscall.TCP_MAXOLEN": "syscall", "syscall.TCP_MAXSEG": "syscall", "syscall.TCP_MAXWIN": "syscall", "syscall.TCP_MAX_SACK": "syscall", "syscall.TCP_MAX_WINSHIFT": "syscall", "syscall.TCP_MD5SIG": "syscall", "syscall.TCP_MD5SIG_MAXKEYLEN": "syscall", "syscall.TCP_MINMSS": "syscall", "syscall.TCP_MINMSSOVERLOAD": "syscall", "syscall.TCP_MSS": "syscall", "syscall.TCP_NODELAY": "syscall", "syscall.TCP_NOOPT": "syscall", "syscall.TCP_NOPUSH": "syscall", "syscall.TCP_NSTATES": "syscall", "syscall.TCP_QUICKACK": "syscall", "syscall.TCP_RXT_CONNDROPTIME": "syscall", "syscall.TCP_RXT_FINDROP": "syscall", "syscall.TCP_SACK_ENABLE": "syscall", "syscall.TCP_SYNCNT": "syscall", "syscall.TCP_VENDOR": "syscall", "syscall.TCP_WINDOW_CLAMP": "syscall", "syscall.TCSAFLUSH": "syscall", "syscall.TCSETS": "syscall", "syscall.TF_DISCONNECT": "syscall", "syscall.TF_REUSE_SOCKET": "syscall", "syscall.TF_USE_DEFAULT_WORKER": "syscall", "syscall.TF_USE_KERNEL_APC": "syscall", "syscall.TF_USE_SYSTEM_THREAD": "syscall", "syscall.TF_WRITE_BEHIND": "syscall", "syscall.TH32CS_INHERIT": "syscall", "syscall.TH32CS_SNAPALL": "syscall", "syscall.TH32CS_SNAPHEAPLIST": "syscall", "syscall.TH32CS_SNAPMODULE": "syscall", "syscall.TH32CS_SNAPMODULE32": "syscall", "syscall.TH32CS_SNAPPROCESS": "syscall", "syscall.TH32CS_SNAPTHREAD": "syscall", "syscall.TIME_ZONE_ID_DAYLIGHT": "syscall", "syscall.TIME_ZONE_ID_STANDARD": "syscall", "syscall.TIME_ZONE_ID_UNKNOWN": "syscall", "syscall.TIOCCBRK": "syscall", "syscall.TIOCCDTR": "syscall", "syscall.TIOCCONS": "syscall", "syscall.TIOCDCDTIMESTAMP": "syscall", "syscall.TIOCDRAIN": "syscall", "syscall.TIOCDSIMICROCODE": "syscall", "syscall.TIOCEXCL": "syscall", "syscall.TIOCEXT": "syscall", "syscall.TIOCFLAG_CDTRCTS": "syscall", "syscall.TIOCFLAG_CLOCAL": "syscall", "syscall.TIOCFLAG_CRTSCTS": "syscall", "syscall.TIOCFLAG_MDMBUF": "syscall", "syscall.TIOCFLAG_PPS": "syscall", "syscall.TIOCFLAG_SOFTCAR": "syscall", "syscall.TIOCFLUSH": "syscall", "syscall.TIOCGDEV": "syscall", "syscall.TIOCGDRAINWAIT": "syscall", "syscall.TIOCGETA": "syscall", "syscall.TIOCGETD": "syscall", "syscall.TIOCGFLAGS": "syscall", "syscall.TIOCGICOUNT": "syscall", "syscall.TIOCGLCKTRMIOS": "syscall", "syscall.TIOCGLINED": "syscall", "syscall.TIOCGPGRP": "syscall", "syscall.TIOCGPTN": "syscall", "syscall.TIOCGQSIZE": "syscall", "syscall.TIOCGRANTPT": "syscall", "syscall.TIOCGRS485": "syscall", "syscall.TIOCGSERIAL": "syscall", "syscall.TIOCGSID": "syscall", "syscall.TIOCGSIZE": "syscall", "syscall.TIOCGSOFTCAR": "syscall", "syscall.TIOCGTSTAMP": "syscall", "syscall.TIOCGWINSZ": "syscall", "syscall.TIOCINQ": "syscall", "syscall.TIOCIXOFF": "syscall", "syscall.TIOCIXON": "syscall", "syscall.TIOCLINUX": "syscall", "syscall.TIOCMBIC": "syscall", "syscall.TIOCMBIS": "syscall", "syscall.TIOCMGDTRWAIT": "syscall", "syscall.TIOCMGET": "syscall", "syscall.TIOCMIWAIT": "syscall", "syscall.TIOCMODG": "syscall", "syscall.TIOCMODS": "syscall", "syscall.TIOCMSDTRWAIT": "syscall", "syscall.TIOCMSET": "syscall", "syscall.TIOCM_CAR": "syscall", "syscall.TIOCM_CD": "syscall", "syscall.TIOCM_CTS": "syscall", "syscall.TIOCM_DCD": "syscall", "syscall.TIOCM_DSR": "syscall", "syscall.TIOCM_DTR": "syscall", "syscall.TIOCM_LE": "syscall", "syscall.TIOCM_RI": "syscall", "syscall.TIOCM_RNG": "syscall", "syscall.TIOCM_RTS": "syscall", "syscall.TIOCM_SR": "syscall", "syscall.TIOCM_ST": "syscall", "syscall.TIOCNOTTY": "syscall", "syscall.TIOCNXCL": "syscall", "syscall.TIOCOUTQ": "syscall", "syscall.TIOCPKT": "syscall", "syscall.TIOCPKT_DATA": "syscall", "syscall.TIOCPKT_DOSTOP": "syscall", "syscall.TIOCPKT_FLUSHREAD": "syscall", "syscall.TIOCPKT_FLUSHWRITE": "syscall", "syscall.TIOCPKT_IOCTL": "syscall", "syscall.TIOCPKT_NOSTOP": "syscall", "syscall.TIOCPKT_START": "syscall", "syscall.TIOCPKT_STOP": "syscall", "syscall.TIOCPTMASTER": "syscall", "syscall.TIOCPTMGET": "syscall", "syscall.TIOCPTSNAME": "syscall", "syscall.TIOCPTYGNAME": "syscall", "syscall.TIOCPTYGRANT": "syscall", "syscall.TIOCPTYUNLK": "syscall", "syscall.TIOCRCVFRAME": "syscall", "syscall.TIOCREMOTE": "syscall", "syscall.TIOCSBRK": "syscall", "syscall.TIOCSCONS": "syscall", "syscall.TIOCSCTTY": "syscall", "syscall.TIOCSDRAINWAIT": "syscall", "syscall.TIOCSDTR": "syscall", "syscall.TIOCSERCONFIG": "syscall", "syscall.TIOCSERGETLSR": "syscall", "syscall.TIOCSERGETMULTI": "syscall", "syscall.TIOCSERGSTRUCT": "syscall", "syscall.TIOCSERGWILD": "syscall", "syscall.TIOCSERSETMULTI": "syscall", "syscall.TIOCSERSWILD": "syscall", "syscall.TIOCSER_TEMT": "syscall", "syscall.TIOCSETA": "syscall", "syscall.TIOCSETAF": "syscall", "syscall.TIOCSETAW": "syscall", "syscall.TIOCSETD": "syscall", "syscall.TIOCSFLAGS": "syscall", "syscall.TIOCSIG": "syscall", "syscall.TIOCSLCKTRMIOS": "syscall", "syscall.TIOCSLINED": "syscall", "syscall.TIOCSPGRP": "syscall", "syscall.TIOCSPTLCK": "syscall", "syscall.TIOCSQSIZE": "syscall", "syscall.TIOCSRS485": "syscall", "syscall.TIOCSSERIAL": "syscall", "syscall.TIOCSSIZE": "syscall", "syscall.TIOCSSOFTCAR": "syscall", "syscall.TIOCSTART": "syscall", "syscall.TIOCSTAT": "syscall", "syscall.TIOCSTI": "syscall", "syscall.TIOCSTOP": "syscall", "syscall.TIOCSTSTAMP": "syscall", "syscall.TIOCSWINSZ": "syscall", "syscall.TIOCTIMESTAMP": "syscall", "syscall.TIOCUCNTL": "syscall", "syscall.TIOCVHANGUP": "syscall", "syscall.TIOCXMTFRAME": "syscall", "syscall.TOKEN_ADJUST_DEFAULT": "syscall", "syscall.TOKEN_ADJUST_GROUPS": "syscall", "syscall.TOKEN_ADJUST_PRIVILEGES": "syscall", "syscall.TOKEN_ALL_ACCESS": "syscall", "syscall.TOKEN_ASSIGN_PRIMARY": "syscall", "syscall.TOKEN_DUPLICATE": "syscall", "syscall.TOKEN_EXECUTE": "syscall", "syscall.TOKEN_IMPERSONATE": "syscall", "syscall.TOKEN_QUERY": "syscall", "syscall.TOKEN_QUERY_SOURCE": "syscall", "syscall.TOKEN_READ": "syscall", "syscall.TOKEN_WRITE": "syscall", "syscall.TOSTOP": "syscall", "syscall.TRUNCATE_EXISTING": "syscall", "syscall.TUNATTACHFILTER": "syscall", "syscall.TUNDETACHFILTER": "syscall", "syscall.TUNGETFEATURES": "syscall", "syscall.TUNGETIFF": "syscall", "syscall.TUNGETSNDBUF": "syscall", "syscall.TUNGETVNETHDRSZ": "syscall", "syscall.TUNSETDEBUG": "syscall", "syscall.TUNSETGROUP": "syscall", "syscall.TUNSETIFF": "syscall", "syscall.TUNSETLINK": "syscall", "syscall.TUNSETNOCSUM": "syscall", "syscall.TUNSETOFFLOAD": "syscall", "syscall.TUNSETOWNER": "syscall", "syscall.TUNSETPERSIST": "syscall", "syscall.TUNSETSNDBUF": "syscall", "syscall.TUNSETTXFILTER": "syscall", "syscall.TUNSETVNETHDRSZ": "syscall", "syscall.Tee": "syscall", "syscall.TerminateProcess": "syscall", "syscall.Termios": "syscall", "syscall.Tgkill": "syscall", "syscall.Time": "syscall", "syscall.Time_t": "syscall", "syscall.Times": "syscall", "syscall.Timespec": "syscall", "syscall.TimespecToNsec": "syscall", "syscall.Timeval": "syscall", "syscall.Timeval32": "syscall", "syscall.TimevalToNsec": "syscall", "syscall.Timex": "syscall", "syscall.Timezoneinformation": "syscall", "syscall.Tms": "syscall", "syscall.Token": "syscall", "syscall.TokenAccessInformation": "syscall", "syscall.TokenAuditPolicy": "syscall", "syscall.TokenDefaultDacl": "syscall", "syscall.TokenElevation": "syscall", "syscall.TokenElevationType": "syscall", "syscall.TokenGroups": "syscall", "syscall.TokenGroupsAndPrivileges": "syscall", "syscall.TokenHasRestrictions": "syscall", "syscall.TokenImpersonationLevel": "syscall", "syscall.TokenIntegrityLevel": "syscall", "syscall.TokenLinkedToken": "syscall", "syscall.TokenLogonSid": "syscall", "syscall.TokenMandatoryPolicy": "syscall", "syscall.TokenOrigin": "syscall", "syscall.TokenOwner": "syscall", "syscall.TokenPrimaryGroup": "syscall", "syscall.TokenPrivileges": "syscall", "syscall.TokenRestrictedSids": "syscall", "syscall.TokenSandBoxInert": "syscall", "syscall.TokenSessionId": "syscall", "syscall.TokenSessionReference": "syscall", "syscall.TokenSource": "syscall", "syscall.TokenStatistics": "syscall", "syscall.TokenType": "syscall", "syscall.TokenUIAccess": "syscall", "syscall.TokenUser": "syscall", "syscall.TokenVirtualizationAllowed": "syscall", "syscall.TokenVirtualizationEnabled": "syscall", "syscall.Tokenprimarygroup": "syscall", "syscall.Tokenuser": "syscall", "syscall.TranslateAccountName": "syscall", "syscall.TranslateName": "syscall", "syscall.TransmitFile": "syscall", "syscall.TransmitFileBuffers": "syscall", "syscall.Truncate": "syscall", "syscall.USAGE_MATCH_TYPE_AND": "syscall", "syscall.USAGE_MATCH_TYPE_OR": "syscall", "syscall.UTF16FromString": "syscall", "syscall.UTF16PtrFromString": "syscall", "syscall.UTF16ToString": "syscall", "syscall.Ucred": "syscall", "syscall.Umask": "syscall", "syscall.Uname": "syscall", "syscall.Undelete": "syscall", "syscall.UnixCredentials": "syscall", "syscall.UnixRights": "syscall", "syscall.Unlink": "syscall", "syscall.Unlinkat": "syscall", "syscall.UnmapViewOfFile": "syscall", "syscall.Unmount": "syscall", "syscall.Unsetenv": "syscall", "syscall.Unshare": "syscall", "syscall.UserInfo10": "syscall", "syscall.Ustat": "syscall", "syscall.Ustat_t": "syscall", "syscall.Utimbuf": "syscall", "syscall.Utime": "syscall", "syscall.Utimes": "syscall", "syscall.UtimesNano": "syscall", "syscall.Utsname": "syscall", "syscall.VDISCARD": "syscall", "syscall.VDSUSP": "syscall", "syscall.VEOF": "syscall", "syscall.VEOL": "syscall", "syscall.VEOL2": "syscall", "syscall.VERASE": "syscall", "syscall.VERASE2": "syscall", "syscall.VINTR": "syscall", "syscall.VKILL": "syscall", "syscall.VLNEXT": "syscall", "syscall.VMIN": "syscall", "syscall.VQUIT": "syscall", "syscall.VREPRINT": "syscall", "syscall.VSTART": "syscall", "syscall.VSTATUS": "syscall", "syscall.VSTOP": "syscall", "syscall.VSUSP": "syscall", "syscall.VSWTC": "syscall", "syscall.VT0": "syscall", "syscall.VT1": "syscall", "syscall.VTDLY": "syscall", "syscall.VTIME": "syscall", "syscall.VWERASE": "syscall", "syscall.VirtualLock": "syscall", "syscall.VirtualUnlock": "syscall", "syscall.WAIT_ABANDONED": "syscall", "syscall.WAIT_FAILED": "syscall", "syscall.WAIT_OBJECT_0": "syscall", "syscall.WAIT_TIMEOUT": "syscall", "syscall.WALL": "syscall", "syscall.WALLSIG": "syscall", "syscall.WALTSIG": "syscall", "syscall.WCLONE": "syscall", "syscall.WCONTINUED": "syscall", "syscall.WCOREFLAG": "syscall", "syscall.WEXITED": "syscall", "syscall.WLINUXCLONE": "syscall", "syscall.WNOHANG": "syscall", "syscall.WNOTHREAD": "syscall", "syscall.WNOWAIT": "syscall", "syscall.WNOZOMBIE": "syscall", "syscall.WOPTSCHECKED": "syscall", "syscall.WORDSIZE": "syscall", "syscall.WSABuf": "syscall", "syscall.WSACleanup": "syscall", "syscall.WSADESCRIPTION_LEN": "syscall", "syscall.WSAData": "syscall", "syscall.WSAEACCES": "syscall", "syscall.WSAECONNRESET": "syscall", "syscall.WSAEnumProtocols": "syscall", "syscall.WSAID_CONNECTEX": "syscall", "syscall.WSAIoctl": "syscall", "syscall.WSAPROTOCOL_LEN": "syscall", "syscall.WSAProtocolChain": "syscall", "syscall.WSAProtocolInfo": "syscall", "syscall.WSARecv": "syscall", "syscall.WSARecvFrom": "syscall", "syscall.WSASYS_STATUS_LEN": "syscall", "syscall.WSASend": "syscall", "syscall.WSASendTo": "syscall", "syscall.WSASendto": "syscall", "syscall.WSAStartup": "syscall", "syscall.WSTOPPED": "syscall", "syscall.WTRAPPED": "syscall", "syscall.WUNTRACED": "syscall", "syscall.Wait4": "syscall", "syscall.WaitForSingleObject": "syscall", "syscall.WaitStatus": "syscall", "syscall.Win32FileAttributeData": "syscall", "syscall.Win32finddata": "syscall", "syscall.Write": "syscall", "syscall.WriteConsole": "syscall", "syscall.WriteFile": "syscall", "syscall.X509_ASN_ENCODING": "syscall", "syscall.XCASE": "syscall", "syscall.XP1_CONNECTIONLESS": "syscall", "syscall.XP1_CONNECT_DATA": "syscall", "syscall.XP1_DISCONNECT_DATA": "syscall", "syscall.XP1_EXPEDITED_DATA": "syscall", "syscall.XP1_GRACEFUL_CLOSE": "syscall", "syscall.XP1_GUARANTEED_DELIVERY": "syscall", "syscall.XP1_GUARANTEED_ORDER": "syscall", "syscall.XP1_IFS_HANDLES": "syscall", "syscall.XP1_MESSAGE_ORIENTED": "syscall", "syscall.XP1_MULTIPOINT_CONTROL_PLANE": "syscall", "syscall.XP1_MULTIPOINT_DATA_PLANE": "syscall", "syscall.XP1_PARTIAL_MESSAGE": "syscall", "syscall.XP1_PSEUDO_STREAM": "syscall", "syscall.XP1_QOS_SUPPORTED": "syscall", "syscall.XP1_SAN_SUPPORT_SDP": "syscall", "syscall.XP1_SUPPORT_BROADCAST": "syscall", "syscall.XP1_SUPPORT_MULTIPOINT": "syscall", "syscall.XP1_UNI_RECV": "syscall", "syscall.XP1_UNI_SEND": "syscall", "syslog.Dial": "log/syslog", "syslog.LOG_ALERT": "log/syslog", "syslog.LOG_AUTH": "log/syslog", "syslog.LOG_AUTHPRIV": "log/syslog", "syslog.LOG_CRIT": "log/syslog", "syslog.LOG_CRON": "log/syslog", "syslog.LOG_DAEMON": "log/syslog", "syslog.LOG_DEBUG": "log/syslog", "syslog.LOG_EMERG": "log/syslog", "syslog.LOG_ERR": "log/syslog", "syslog.LOG_FTP": "log/syslog", "syslog.LOG_INFO": "log/syslog", "syslog.LOG_KERN": "log/syslog", "syslog.LOG_LOCAL0": "log/syslog", "syslog.LOG_LOCAL1": "log/syslog", "syslog.LOG_LOCAL2": "log/syslog", "syslog.LOG_LOCAL3": "log/syslog", "syslog.LOG_LOCAL4": "log/syslog", "syslog.LOG_LOCAL5": "log/syslog", "syslog.LOG_LOCAL6": "log/syslog", "syslog.LOG_LOCAL7": "log/syslog", "syslog.LOG_LPR": "log/syslog", "syslog.LOG_MAIL": "log/syslog", "syslog.LOG_NEWS": "log/syslog", "syslog.LOG_NOTICE": "log/syslog", "syslog.LOG_SYSLOG": "log/syslog", "syslog.LOG_USER": "log/syslog", "syslog.LOG_UUCP": "log/syslog", "syslog.LOG_WARNING": "log/syslog", "syslog.New": "log/syslog", "syslog.NewLogger": "log/syslog", "syslog.Priority": "log/syslog", "syslog.Writer": "log/syslog", "tabwriter.AlignRight": "text/tabwriter", "tabwriter.Debug": "text/tabwriter", "tabwriter.DiscardEmptyColumns": "text/tabwriter", "tabwriter.Escape": "text/tabwriter", "tabwriter.FilterHTML": "text/tabwriter", "tabwriter.NewWriter": "text/tabwriter", "tabwriter.StripEscape": "text/tabwriter", "tabwriter.TabIndent": "text/tabwriter", "tabwriter.Writer": "text/tabwriter", "tar.ErrFieldTooLong": "archive/tar", "tar.ErrHeader": "archive/tar", "tar.ErrWriteAfterClose": "archive/tar", "tar.ErrWriteTooLong": "archive/tar", "tar.FileInfoHeader": "archive/tar", "tar.Header": "archive/tar", "tar.NewReader": "archive/tar", "tar.NewWriter": "archive/tar", "tar.Reader": "archive/tar", "tar.TypeBlock": "archive/tar", "tar.TypeChar": "archive/tar", "tar.TypeCont": "archive/tar", "tar.TypeDir": "archive/tar", "tar.TypeFifo": "archive/tar", "tar.TypeGNULongLink": "archive/tar", "tar.TypeGNULongName": "archive/tar", "tar.TypeGNUSparse": "archive/tar", "tar.TypeLink": "archive/tar", "tar.TypeReg": "archive/tar", "tar.TypeRegA": "archive/tar", "tar.TypeSymlink": "archive/tar", "tar.TypeXGlobalHeader": "archive/tar", "tar.TypeXHeader": "archive/tar", "tar.Writer": "archive/tar", "template.CSS": "html/template", "template.ErrAmbigContext": "html/template", "template.ErrBadHTML": "html/template", "template.ErrBranchEnd": "html/template", "template.ErrEndContext": "html/template", "template.ErrNoSuchTemplate": "html/template", "template.ErrOutputContext": "html/template", "template.ErrPartialCharset": "html/template", "template.ErrPartialEscape": "html/template", "template.ErrRangeLoopReentry": "html/template", "template.ErrSlashAmbig": "html/template", "template.Error": "html/template", "template.ErrorCode": "html/template", "template.ExecError": "text/template", // "template.FuncMap" is ambiguous "template.HTML": "html/template", "template.HTMLAttr": "html/template", // "template.HTMLEscape" is ambiguous // "template.HTMLEscapeString" is ambiguous // "template.HTMLEscaper" is ambiguous // "template.IsTrue" is ambiguous "template.JS": "html/template", // "template.JSEscape" is ambiguous // "template.JSEscapeString" is ambiguous // "template.JSEscaper" is ambiguous "template.JSStr": "html/template", // "template.Must" is ambiguous // "template.New" is ambiguous "template.OK": "html/template", // "template.ParseFiles" is ambiguous // "template.ParseGlob" is ambiguous // "template.Template" is ambiguous "template.URL": "html/template", // "template.URLQueryEscaper" is ambiguous "testing.AllocsPerRun": "testing", "testing.B": "testing", "testing.Benchmark": "testing", "testing.BenchmarkResult": "testing", "testing.Cover": "testing", "testing.CoverBlock": "testing", "testing.Coverage": "testing", "testing.InternalBenchmark": "testing", "testing.InternalExample": "testing", "testing.InternalTest": "testing", "testing.M": "testing", "testing.Main": "testing", "testing.MainStart": "testing", "testing.PB": "testing", "testing.RegisterCover": "testing", "testing.RunBenchmarks": "testing", "testing.RunExamples": "testing", "testing.RunTests": "testing", "testing.Short": "testing", "testing.T": "testing", "testing.Verbose": "testing", "textproto.CanonicalMIMEHeaderKey": "net/textproto", "textproto.Conn": "net/textproto", "textproto.Dial": "net/textproto", "textproto.Error": "net/textproto", "textproto.MIMEHeader": "net/textproto", "textproto.NewConn": "net/textproto", "textproto.NewReader": "net/textproto", "textproto.NewWriter": "net/textproto", "textproto.Pipeline": "net/textproto", "textproto.ProtocolError": "net/textproto", "textproto.Reader": "net/textproto", "textproto.TrimBytes": "net/textproto", "textproto.TrimString": "net/textproto", "textproto.Writer": "net/textproto", "time.ANSIC": "time", "time.After": "time", "time.AfterFunc": "time", "time.April": "time", "time.August": "time", "time.Date": "time", "time.December": "time", "time.Duration": "time", "time.February": "time", "time.FixedZone": "time", "time.Friday": "time", "time.Hour": "time", "time.January": "time", "time.July": "time", "time.June": "time", "time.Kitchen": "time", "time.LoadLocation": "time", "time.Local": "time", "time.Location": "time", "time.March": "time", "time.May": "time", "time.Microsecond": "time", "time.Millisecond": "time", "time.Minute": "time", "time.Monday": "time", "time.Month": "time", "time.Nanosecond": "time", "time.NewTicker": "time", "time.NewTimer": "time", "time.November": "time", "time.Now": "time", "time.October": "time", "time.Parse": "time", "time.ParseDuration": "time", "time.ParseError": "time", "time.ParseInLocation": "time", "time.RFC1123": "time", "time.RFC1123Z": "time", "time.RFC3339": "time", "time.RFC3339Nano": "time", "time.RFC822": "time", "time.RFC822Z": "time", "time.RFC850": "time", "time.RubyDate": "time", "time.Saturday": "time", "time.Second": "time", "time.September": "time", "time.Since": "time", "time.Sleep": "time", "time.Stamp": "time", "time.StampMicro": "time", "time.StampMilli": "time", "time.StampNano": "time", "time.Sunday": "time", "time.Thursday": "time", "time.Tick": "time", "time.Ticker": "time", "time.Time": "time", "time.Timer": "time", "time.Tuesday": "time", "time.UTC": "time", "time.Unix": "time", "time.UnixDate": "time", "time.Wednesday": "time", "time.Weekday": "time", "tls.Certificate": "crypto/tls", "tls.Client": "crypto/tls", "tls.ClientAuthType": "crypto/tls", "tls.ClientHelloInfo": "crypto/tls", "tls.ClientSessionCache": "crypto/tls", "tls.ClientSessionState": "crypto/tls", "tls.Config": "crypto/tls", "tls.Conn": "crypto/tls", "tls.ConnectionState": "crypto/tls", "tls.CurveID": "crypto/tls", "tls.CurveP256": "crypto/tls", "tls.CurveP384": "crypto/tls", "tls.CurveP521": "crypto/tls", "tls.Dial": "crypto/tls", "tls.DialWithDialer": "crypto/tls", "tls.Listen": "crypto/tls", "tls.LoadX509KeyPair": "crypto/tls", "tls.NewLRUClientSessionCache": "crypto/tls", "tls.NewListener": "crypto/tls", "tls.NoClientCert": "crypto/tls", "tls.RecordHeaderError": "crypto/tls", "tls.RenegotiateFreelyAsClient": "crypto/tls", "tls.RenegotiateNever": "crypto/tls", "tls.RenegotiateOnceAsClient": "crypto/tls", "tls.RenegotiationSupport": "crypto/tls", "tls.RequestClientCert": "crypto/tls", "tls.RequireAndVerifyClientCert": "crypto/tls", "tls.RequireAnyClientCert": "crypto/tls", "tls.Server": "crypto/tls", "tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA": "crypto/tls", "tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256": "crypto/tls", "tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA": "crypto/tls", "tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384": "crypto/tls", "tls.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA": "crypto/tls", "tls.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA": "crypto/tls", "tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA": "crypto/tls", "tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256": "crypto/tls", "tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA": "crypto/tls", "tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384": "crypto/tls", "tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA": "crypto/tls", "tls.TLS_FALLBACK_SCSV": "crypto/tls", "tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA": "crypto/tls", "tls.TLS_RSA_WITH_AES_128_CBC_SHA": "crypto/tls", "tls.TLS_RSA_WITH_AES_128_GCM_SHA256": "crypto/tls", "tls.TLS_RSA_WITH_AES_256_CBC_SHA": "crypto/tls", "tls.TLS_RSA_WITH_AES_256_GCM_SHA384": "crypto/tls", "tls.TLS_RSA_WITH_RC4_128_SHA": "crypto/tls", "tls.VerifyClientCertIfGiven": "crypto/tls", "tls.VersionSSL30": "crypto/tls", "tls.VersionTLS10": "crypto/tls", "tls.VersionTLS11": "crypto/tls", "tls.VersionTLS12": "crypto/tls", "tls.X509KeyPair": "crypto/tls", "token.ADD": "go/token", "token.ADD_ASSIGN": "go/token", "token.AND": "go/token", "token.AND_ASSIGN": "go/token", "token.AND_NOT": "go/token", "token.AND_NOT_ASSIGN": "go/token", "token.ARROW": "go/token", "token.ASSIGN": "go/token", "token.BREAK": "go/token", "token.CASE": "go/token", "token.CHAN": "go/token", "token.CHAR": "go/token", "token.COLON": "go/token", "token.COMMA": "go/token", "token.COMMENT": "go/token", "token.CONST": "go/token", "token.CONTINUE": "go/token", "token.DEC": "go/token", "token.DEFAULT": "go/token", "token.DEFER": "go/token", "token.DEFINE": "go/token", "token.ELLIPSIS": "go/token", "token.ELSE": "go/token", "token.EOF": "go/token", "token.EQL": "go/token", "token.FALLTHROUGH": "go/token", "token.FLOAT": "go/token", "token.FOR": "go/token", "token.FUNC": "go/token", "token.File": "go/token", "token.FileSet": "go/token", "token.GEQ": "go/token", "token.GO": "go/token", "token.GOTO": "go/token", "token.GTR": "go/token", "token.HighestPrec": "go/token", "token.IDENT": "go/token", "token.IF": "go/token", "token.ILLEGAL": "go/token", "token.IMAG": "go/token", "token.IMPORT": "go/token", "token.INC": "go/token", "token.INT": "go/token", "token.INTERFACE": "go/token", "token.LAND": "go/token", "token.LBRACE": "go/token", "token.LBRACK": "go/token", "token.LEQ": "go/token", "token.LOR": "go/token", "token.LPAREN": "go/token", "token.LSS": "go/token", "token.Lookup": "go/token", "token.LowestPrec": "go/token", "token.MAP": "go/token", "token.MUL": "go/token", "token.MUL_ASSIGN": "go/token", "token.NEQ": "go/token", "token.NOT": "go/token", "token.NewFileSet": "go/token", "token.NoPos": "go/token", "token.OR": "go/token", "token.OR_ASSIGN": "go/token", "token.PACKAGE": "go/token", "token.PERIOD": "go/token", "token.Pos": "go/token", "token.Position": "go/token", "token.QUO": "go/token", "token.QUO_ASSIGN": "go/token", "token.RANGE": "go/token", "token.RBRACE": "go/token", "token.RBRACK": "go/token", "token.REM": "go/token", "token.REM_ASSIGN": "go/token", "token.RETURN": "go/token", "token.RPAREN": "go/token", "token.SELECT": "go/token", "token.SEMICOLON": "go/token", "token.SHL": "go/token", "token.SHL_ASSIGN": "go/token", "token.SHR": "go/token", "token.SHR_ASSIGN": "go/token", "token.STRING": "go/token", "token.STRUCT": "go/token", "token.SUB": "go/token", "token.SUB_ASSIGN": "go/token", "token.SWITCH": "go/token", "token.TYPE": "go/token", "token.Token": "go/token", "token.UnaryPrec": "go/token", "token.VAR": "go/token", "token.XOR": "go/token", "token.XOR_ASSIGN": "go/token", "trace.Start": "runtime/trace", "trace.Stop": "runtime/trace", "types.Array": "go/types", "types.AssertableTo": "go/types", "types.AssignableTo": "go/types", "types.Basic": "go/types", "types.BasicInfo": "go/types", "types.BasicKind": "go/types", "types.Bool": "go/types", "types.Builtin": "go/types", "types.Byte": "go/types", "types.Chan": "go/types", "types.ChanDir": "go/types", "types.Checker": "go/types", "types.Comparable": "go/types", "types.Complex128": "go/types", "types.Complex64": "go/types", "types.Config": "go/types", "types.Const": "go/types", "types.ConvertibleTo": "go/types", "types.DefPredeclaredTestFuncs": "go/types", "types.Error": "go/types", "types.Eval": "go/types", "types.ExprString": "go/types", "types.FieldVal": "go/types", "types.Float32": "go/types", "types.Float64": "go/types", "types.Func": "go/types", "types.Id": "go/types", "types.Identical": "go/types", "types.Implements": "go/types", "types.ImportMode": "go/types", "types.Importer": "go/types", "types.ImporterFrom": "go/types", "types.Info": "go/types", "types.Initializer": "go/types", "types.Int": "go/types", "types.Int16": "go/types", "types.Int32": "go/types", "types.Int64": "go/types", "types.Int8": "go/types", "types.Interface": "go/types", "types.Invalid": "go/types", "types.IsBoolean": "go/types", "types.IsComplex": "go/types", "types.IsConstType": "go/types", "types.IsFloat": "go/types", "types.IsInteger": "go/types", "types.IsInterface": "go/types", "types.IsNumeric": "go/types", "types.IsOrdered": "go/types", "types.IsString": "go/types", "types.IsUnsigned": "go/types", "types.IsUntyped": "go/types", "types.Label": "go/types", "types.LookupFieldOrMethod": "go/types", "types.Map": "go/types", "types.MethodExpr": "go/types", "types.MethodSet": "go/types", "types.MethodVal": "go/types", "types.MissingMethod": "go/types", "types.Named": "go/types", "types.NewArray": "go/types", "types.NewChan": "go/types", "types.NewChecker": "go/types", "types.NewConst": "go/types", "types.NewField": "go/types", "types.NewFunc": "go/types", "types.NewInterface": "go/types", "types.NewLabel": "go/types", "types.NewMap": "go/types", "types.NewMethodSet": "go/types", "types.NewNamed": "go/types", "types.NewPackage": "go/types", "types.NewParam": "go/types", "types.NewPkgName": "go/types", "types.NewPointer": "go/types", "types.NewScope": "go/types", "types.NewSignature": "go/types", "types.NewSlice": "go/types", "types.NewStruct": "go/types", "types.NewTuple": "go/types", "types.NewTypeName": "go/types", "types.NewVar": "go/types", "types.Nil": "go/types", "types.ObjectString": "go/types", "types.Package": "go/types", "types.PkgName": "go/types", "types.Pointer": "go/types", "types.Qualifier": "go/types", "types.RecvOnly": "go/types", "types.RelativeTo": "go/types", "types.Rune": "go/types", "types.Scope": "go/types", "types.Selection": "go/types", "types.SelectionKind": "go/types", "types.SelectionString": "go/types", "types.SendOnly": "go/types", "types.SendRecv": "go/types", "types.Signature": "go/types", "types.Sizes": "go/types", "types.Slice": "go/types", "types.StdSizes": "go/types", "types.String": "go/types", "types.Struct": "go/types", "types.Tuple": "go/types", "types.Typ": "go/types", "types.Type": "go/types", "types.TypeAndValue": "go/types", "types.TypeName": "go/types", "types.TypeString": "go/types", "types.Uint": "go/types", "types.Uint16": "go/types", "types.Uint32": "go/types", "types.Uint64": "go/types", "types.Uint8": "go/types", "types.Uintptr": "go/types", "types.Universe": "go/types", "types.Unsafe": "go/types", "types.UnsafePointer": "go/types", "types.UntypedBool": "go/types", "types.UntypedComplex": "go/types", "types.UntypedFloat": "go/types", "types.UntypedInt": "go/types", "types.UntypedNil": "go/types", "types.UntypedRune": "go/types", "types.UntypedString": "go/types", "types.Var": "go/types", "types.WriteExpr": "go/types", "types.WriteSignature": "go/types", "types.WriteType": "go/types", "unicode.ASCII_Hex_Digit": "unicode", "unicode.Adlam": "unicode", "unicode.Ahom": "unicode", "unicode.Anatolian_Hieroglyphs": "unicode", "unicode.Arabic": "unicode", "unicode.Armenian": "unicode", "unicode.Avestan": "unicode", "unicode.AzeriCase": "unicode", "unicode.Balinese": "unicode", "unicode.Bamum": "unicode", "unicode.Bassa_Vah": "unicode", "unicode.Batak": "unicode", "unicode.Bengali": "unicode", "unicode.Bhaiksuki": "unicode", "unicode.Bidi_Control": "unicode", "unicode.Bopomofo": "unicode", "unicode.Brahmi": "unicode", "unicode.Braille": "unicode", "unicode.Buginese": "unicode", "unicode.Buhid": "unicode", "unicode.C": "unicode", "unicode.Canadian_Aboriginal": "unicode", "unicode.Carian": "unicode", "unicode.CaseRange": "unicode", "unicode.CaseRanges": "unicode", "unicode.Categories": "unicode", "unicode.Caucasian_Albanian": "unicode", "unicode.Cc": "unicode", "unicode.Cf": "unicode", "unicode.Chakma": "unicode", "unicode.Cham": "unicode", "unicode.Cherokee": "unicode", "unicode.Co": "unicode", "unicode.Common": "unicode", "unicode.Coptic": "unicode", "unicode.Cs": "unicode", "unicode.Cuneiform": "unicode", "unicode.Cypriot": "unicode", "unicode.Cyrillic": "unicode", "unicode.Dash": "unicode", "unicode.Deprecated": "unicode", "unicode.Deseret": "unicode", "unicode.Devanagari": "unicode", "unicode.Diacritic": "unicode", "unicode.Digit": "unicode", "unicode.Duployan": "unicode", "unicode.Egyptian_Hieroglyphs": "unicode", "unicode.Elbasan": "unicode", "unicode.Ethiopic": "unicode", "unicode.Extender": "unicode", "unicode.FoldCategory": "unicode", "unicode.FoldScript": "unicode", "unicode.Georgian": "unicode", "unicode.Glagolitic": "unicode", "unicode.Gothic": "unicode", "unicode.Grantha": "unicode", "unicode.GraphicRanges": "unicode", "unicode.Greek": "unicode", "unicode.Gujarati": "unicode", "unicode.Gurmukhi": "unicode", "unicode.Han": "unicode", "unicode.Hangul": "unicode", "unicode.Hanunoo": "unicode", "unicode.Hatran": "unicode", "unicode.Hebrew": "unicode", "unicode.Hex_Digit": "unicode", "unicode.Hiragana": "unicode", "unicode.Hyphen": "unicode", "unicode.IDS_Binary_Operator": "unicode", "unicode.IDS_Trinary_Operator": "unicode", "unicode.Ideographic": "unicode", "unicode.Imperial_Aramaic": "unicode", "unicode.In": "unicode", "unicode.Inherited": "unicode", "unicode.Inscriptional_Pahlavi": "unicode", "unicode.Inscriptional_Parthian": "unicode", "unicode.Is": "unicode", "unicode.IsControl": "unicode", "unicode.IsDigit": "unicode", "unicode.IsGraphic": "unicode", "unicode.IsLetter": "unicode", "unicode.IsLower": "unicode", "unicode.IsMark": "unicode", "unicode.IsNumber": "unicode", "unicode.IsOneOf": "unicode", "unicode.IsPrint": "unicode", "unicode.IsPunct": "unicode", "unicode.IsSpace": "unicode", "unicode.IsSymbol": "unicode", "unicode.IsTitle": "unicode", "unicode.IsUpper": "unicode", "unicode.Javanese": "unicode", "unicode.Join_Control": "unicode", "unicode.Kaithi": "unicode", "unicode.Kannada": "unicode", "unicode.Katakana": "unicode", "unicode.Kayah_Li": "unicode", "unicode.Kharoshthi": "unicode", "unicode.Khmer": "unicode", "unicode.Khojki": "unicode", "unicode.Khudawadi": "unicode", "unicode.L": "unicode", "unicode.Lao": "unicode", "unicode.Latin": "unicode", "unicode.Lepcha": "unicode", "unicode.Letter": "unicode", "unicode.Limbu": "unicode", "unicode.Linear_A": "unicode", "unicode.Linear_B": "unicode", "unicode.Lisu": "unicode", "unicode.Ll": "unicode", "unicode.Lm": "unicode", "unicode.Lo": "unicode", "unicode.Logical_Order_Exception": "unicode", "unicode.Lower": "unicode", "unicode.LowerCase": "unicode", "unicode.Lt": "unicode", "unicode.Lu": "unicode", "unicode.Lycian": "unicode", "unicode.Lydian": "unicode", "unicode.M": "unicode", "unicode.Mahajani": "unicode", "unicode.Malayalam": "unicode", "unicode.Mandaic": "unicode", "unicode.Manichaean": "unicode", "unicode.Marchen": "unicode", "unicode.Mark": "unicode", "unicode.MaxASCII": "unicode", "unicode.MaxCase": "unicode", "unicode.MaxLatin1": "unicode", "unicode.MaxRune": "unicode", "unicode.Mc": "unicode", "unicode.Me": "unicode", "unicode.Meetei_Mayek": "unicode", "unicode.Mende_Kikakui": "unicode", "unicode.Meroitic_Cursive": "unicode", "unicode.Meroitic_Hieroglyphs": "unicode", "unicode.Miao": "unicode", "unicode.Mn": "unicode", "unicode.Modi": "unicode", "unicode.Mongolian": "unicode", "unicode.Mro": "unicode", "unicode.Multani": "unicode", "unicode.Myanmar": "unicode", "unicode.N": "unicode", "unicode.Nabataean": "unicode", "unicode.Nd": "unicode", "unicode.New_Tai_Lue": "unicode", "unicode.Newa": "unicode", "unicode.Nko": "unicode", "unicode.Nl": "unicode", "unicode.No": "unicode", "unicode.Noncharacter_Code_Point": "unicode", "unicode.Number": "unicode", "unicode.Ogham": "unicode", "unicode.Ol_Chiki": "unicode", "unicode.Old_Hungarian": "unicode", "unicode.Old_Italic": "unicode", "unicode.Old_North_Arabian": "unicode", "unicode.Old_Permic": "unicode", "unicode.Old_Persian": "unicode", "unicode.Old_South_Arabian": "unicode", "unicode.Old_Turkic": "unicode", "unicode.Oriya": "unicode", "unicode.Osage": "unicode", "unicode.Osmanya": "unicode", "unicode.Other": "unicode", "unicode.Other_Alphabetic": "unicode", "unicode.Other_Default_Ignorable_Code_Point": "unicode", "unicode.Other_Grapheme_Extend": "unicode", "unicode.Other_ID_Continue": "unicode", "unicode.Other_ID_Start": "unicode", "unicode.Other_Lowercase": "unicode", "unicode.Other_Math": "unicode", "unicode.Other_Uppercase": "unicode", "unicode.P": "unicode", "unicode.Pahawh_Hmong": "unicode", "unicode.Palmyrene": "unicode", "unicode.Pattern_Syntax": "unicode", "unicode.Pattern_White_Space": "unicode", "unicode.Pau_Cin_Hau": "unicode", "unicode.Pc": "unicode", "unicode.Pd": "unicode", "unicode.Pe": "unicode", "unicode.Pf": "unicode", "unicode.Phags_Pa": "unicode", "unicode.Phoenician": "unicode", "unicode.Pi": "unicode", "unicode.Po": "unicode", "unicode.Prepended_Concatenation_Mark": "unicode", "unicode.PrintRanges": "unicode", "unicode.Properties": "unicode", "unicode.Ps": "unicode", "unicode.Psalter_Pahlavi": "unicode", "unicode.Punct": "unicode", "unicode.Quotation_Mark": "unicode", "unicode.Radical": "unicode", "unicode.Range16": "unicode", "unicode.Range32": "unicode", "unicode.RangeTable": "unicode", "unicode.Rejang": "unicode", "unicode.ReplacementChar": "unicode", "unicode.Runic": "unicode", "unicode.S": "unicode", "unicode.STerm": "unicode", "unicode.Samaritan": "unicode", "unicode.Saurashtra": "unicode", "unicode.Sc": "unicode", "unicode.Scripts": "unicode", "unicode.Sentence_Terminal": "unicode", "unicode.Sharada": "unicode", "unicode.Shavian": "unicode", "unicode.Siddham": "unicode", "unicode.SignWriting": "unicode", "unicode.SimpleFold": "unicode", "unicode.Sinhala": "unicode", "unicode.Sk": "unicode", "unicode.Sm": "unicode", "unicode.So": "unicode", "unicode.Soft_Dotted": "unicode", "unicode.Sora_Sompeng": "unicode", "unicode.Space": "unicode", "unicode.SpecialCase": "unicode", "unicode.Sundanese": "unicode", "unicode.Syloti_Nagri": "unicode", "unicode.Symbol": "unicode", "unicode.Syriac": "unicode", "unicode.Tagalog": "unicode", "unicode.Tagbanwa": "unicode", "unicode.Tai_Le": "unicode", "unicode.Tai_Tham": "unicode", "unicode.Tai_Viet": "unicode", "unicode.Takri": "unicode", "unicode.Tamil": "unicode", "unicode.Tangut": "unicode", "unicode.Telugu": "unicode", "unicode.Terminal_Punctuation": "unicode", "unicode.Thaana": "unicode", "unicode.Thai": "unicode", "unicode.Tibetan": "unicode", "unicode.Tifinagh": "unicode", "unicode.Tirhuta": "unicode", "unicode.Title": "unicode", "unicode.TitleCase": "unicode", "unicode.To": "unicode", "unicode.ToLower": "unicode", "unicode.ToTitle": "unicode", "unicode.ToUpper": "unicode", "unicode.TurkishCase": "unicode", "unicode.Ugaritic": "unicode", "unicode.Unified_Ideograph": "unicode", "unicode.Upper": "unicode", "unicode.UpperCase": "unicode", "unicode.UpperLower": "unicode", "unicode.Vai": "unicode", "unicode.Variation_Selector": "unicode", "unicode.Version": "unicode", "unicode.Warang_Citi": "unicode", "unicode.White_Space": "unicode", "unicode.Yi": "unicode", "unicode.Z": "unicode", "unicode.Zl": "unicode", "unicode.Zp": "unicode", "unicode.Zs": "unicode", "url.Error": "net/url", "url.EscapeError": "net/url", "url.InvalidHostError": "net/url", "url.Parse": "net/url", "url.ParseQuery": "net/url", "url.ParseRequestURI": "net/url", "url.QueryEscape": "net/url", "url.QueryUnescape": "net/url", "url.URL": "net/url", "url.User": "net/url", "url.UserPassword": "net/url", "url.Userinfo": "net/url", "url.Values": "net/url", "user.Current": "os/user", "user.Group": "os/user", "user.Lookup": "os/user", "user.LookupGroup": "os/user", "user.LookupGroupId": "os/user", "user.LookupId": "os/user", "user.UnknownGroupError": "os/user", "user.UnknownGroupIdError": "os/user", "user.UnknownUserError": "os/user", "user.UnknownUserIdError": "os/user", "user.User": "os/user", "utf16.Decode": "unicode/utf16", "utf16.DecodeRune": "unicode/utf16", "utf16.Encode": "unicode/utf16", "utf16.EncodeRune": "unicode/utf16", "utf16.IsSurrogate": "unicode/utf16", "utf8.DecodeLastRune": "unicode/utf8", "utf8.DecodeLastRuneInString": "unicode/utf8", "utf8.DecodeRune": "unicode/utf8", "utf8.DecodeRuneInString": "unicode/utf8", "utf8.EncodeRune": "unicode/utf8", "utf8.FullRune": "unicode/utf8", "utf8.FullRuneInString": "unicode/utf8", "utf8.MaxRune": "unicode/utf8", "utf8.RuneCount": "unicode/utf8", "utf8.RuneCountInString": "unicode/utf8", "utf8.RuneError": "unicode/utf8", "utf8.RuneLen": "unicode/utf8", "utf8.RuneSelf": "unicode/utf8", "utf8.RuneStart": "unicode/utf8", "utf8.UTFMax": "unicode/utf8", "utf8.Valid": "unicode/utf8", "utf8.ValidRune": "unicode/utf8", "utf8.ValidString": "unicode/utf8", "x509.CANotAuthorizedForThisName": "crypto/x509", "x509.CertPool": "crypto/x509", "x509.Certificate": "crypto/x509", "x509.CertificateInvalidError": "crypto/x509", "x509.CertificateRequest": "crypto/x509", "x509.ConstraintViolationError": "crypto/x509", "x509.CreateCertificate": "crypto/x509", "x509.CreateCertificateRequest": "crypto/x509", "x509.DSA": "crypto/x509", "x509.DSAWithSHA1": "crypto/x509", "x509.DSAWithSHA256": "crypto/x509", "x509.DecryptPEMBlock": "crypto/x509", "x509.ECDSA": "crypto/x509", "x509.ECDSAWithSHA1": "crypto/x509", "x509.ECDSAWithSHA256": "crypto/x509", "x509.ECDSAWithSHA384": "crypto/x509", "x509.ECDSAWithSHA512": "crypto/x509", "x509.EncryptPEMBlock": "crypto/x509", "x509.ErrUnsupportedAlgorithm": "crypto/x509", "x509.Expired": "crypto/x509", "x509.ExtKeyUsage": "crypto/x509", "x509.ExtKeyUsageAny": "crypto/x509", "x509.ExtKeyUsageClientAuth": "crypto/x509", "x509.ExtKeyUsageCodeSigning": "crypto/x509", "x509.ExtKeyUsageEmailProtection": "crypto/x509", "x509.ExtKeyUsageIPSECEndSystem": "crypto/x509", "x509.ExtKeyUsageIPSECTunnel": "crypto/x509", "x509.ExtKeyUsageIPSECUser": "crypto/x509", "x509.ExtKeyUsageMicrosoftServerGatedCrypto": "crypto/x509", "x509.ExtKeyUsageNetscapeServerGatedCrypto": "crypto/x509", "x509.ExtKeyUsageOCSPSigning": "crypto/x509", "x509.ExtKeyUsageServerAuth": "crypto/x509", "x509.ExtKeyUsageTimeStamping": "crypto/x509", "x509.HostnameError": "crypto/x509", "x509.IncompatibleUsage": "crypto/x509", "x509.IncorrectPasswordError": "crypto/x509", "x509.InsecureAlgorithmError": "crypto/x509", "x509.InvalidReason": "crypto/x509", "x509.IsEncryptedPEMBlock": "crypto/x509", "x509.KeyUsage": "crypto/x509", "x509.KeyUsageCRLSign": "crypto/x509", "x509.KeyUsageCertSign": "crypto/x509", "x509.KeyUsageContentCommitment": "crypto/x509", "x509.KeyUsageDataEncipherment": "crypto/x509", "x509.KeyUsageDecipherOnly": "crypto/x509", "x509.KeyUsageDigitalSignature": "crypto/x509", "x509.KeyUsageEncipherOnly": "crypto/x509", "x509.KeyUsageKeyAgreement": "crypto/x509", "x509.KeyUsageKeyEncipherment": "crypto/x509", "x509.MD2WithRSA": "crypto/x509", "x509.MD5WithRSA": "crypto/x509", "x509.MarshalECPrivateKey": "crypto/x509", "x509.MarshalPKCS1PrivateKey": "crypto/x509", "x509.MarshalPKIXPublicKey": "crypto/x509", "x509.NewCertPool": "crypto/x509", "x509.NotAuthorizedToSign": "crypto/x509", "x509.PEMCipher": "crypto/x509", "x509.PEMCipher3DES": "crypto/x509", "x509.PEMCipherAES128": "crypto/x509", "x509.PEMCipherAES192": "crypto/x509", "x509.PEMCipherAES256": "crypto/x509", "x509.PEMCipherDES": "crypto/x509", "x509.ParseCRL": "crypto/x509", "x509.ParseCertificate": "crypto/x509", "x509.ParseCertificateRequest": "crypto/x509", "x509.ParseCertificates": "crypto/x509", "x509.ParseDERCRL": "crypto/x509", "x509.ParseECPrivateKey": "crypto/x509", "x509.ParsePKCS1PrivateKey": "crypto/x509", "x509.ParsePKCS8PrivateKey": "crypto/x509", "x509.ParsePKIXPublicKey": "crypto/x509", "x509.PublicKeyAlgorithm": "crypto/x509", "x509.RSA": "crypto/x509", "x509.SHA1WithRSA": "crypto/x509", "x509.SHA256WithRSA": "crypto/x509", "x509.SHA384WithRSA": "crypto/x509", "x509.SHA512WithRSA": "crypto/x509", "x509.SignatureAlgorithm": "crypto/x509", "x509.SystemCertPool": "crypto/x509", "x509.SystemRootsError": "crypto/x509", "x509.TooManyIntermediates": "crypto/x509", "x509.UnhandledCriticalExtension": "crypto/x509", "x509.UnknownAuthorityError": "crypto/x509", "x509.UnknownPublicKeyAlgorithm": "crypto/x509", "x509.UnknownSignatureAlgorithm": "crypto/x509", "x509.VerifyOptions": "crypto/x509", "xml.Attr": "encoding/xml", "xml.CharData": "encoding/xml", "xml.Comment": "encoding/xml", "xml.CopyToken": "encoding/xml", "xml.Decoder": "encoding/xml", "xml.Directive": "encoding/xml", "xml.Encoder": "encoding/xml", "xml.EndElement": "encoding/xml", "xml.Escape": "encoding/xml", "xml.EscapeText": "encoding/xml", "xml.HTMLAutoClose": "encoding/xml", "xml.HTMLEntity": "encoding/xml", "xml.Header": "encoding/xml", "xml.Marshal": "encoding/xml", "xml.MarshalIndent": "encoding/xml", "xml.Marshaler": "encoding/xml", "xml.MarshalerAttr": "encoding/xml", "xml.Name": "encoding/xml", "xml.NewDecoder": "encoding/xml", "xml.NewEncoder": "encoding/xml", "xml.ProcInst": "encoding/xml", "xml.StartElement": "encoding/xml", "xml.SyntaxError": "encoding/xml", "xml.TagPathError": "encoding/xml", "xml.Token": "encoding/xml", "xml.Unmarshal": "encoding/xml", "xml.UnmarshalError": "encoding/xml", "xml.Unmarshaler": "encoding/xml", "xml.UnmarshalerAttr": "encoding/xml", "xml.UnsupportedTypeError": "encoding/xml", "zip.Compressor": "archive/zip", "zip.Decompressor": "archive/zip", "zip.Deflate": "archive/zip", "zip.ErrAlgorithm": "archive/zip", "zip.ErrChecksum": "archive/zip", "zip.ErrFormat": "archive/zip", "zip.File": "archive/zip", "zip.FileHeader": "archive/zip", "zip.FileInfoHeader": "archive/zip", "zip.NewReader": "archive/zip", "zip.NewWriter": "archive/zip", "zip.OpenReader": "archive/zip", "zip.ReadCloser": "archive/zip", "zip.Reader": "archive/zip", "zip.RegisterCompressor": "archive/zip", "zip.RegisterDecompressor": "archive/zip", "zip.Store": "archive/zip", "zip.Writer": "archive/zip", "zlib.BestCompression": "compress/zlib", "zlib.BestSpeed": "compress/zlib", "zlib.DefaultCompression": "compress/zlib", "zlib.ErrChecksum": "compress/zlib", "zlib.ErrDictionary": "compress/zlib", "zlib.ErrHeader": "compress/zlib", "zlib.NewReader": "compress/zlib", "zlib.NewReaderDict": "compress/zlib", "zlib.NewWriter": "compress/zlib", "zlib.NewWriterLevel": "compress/zlib", "zlib.NewWriterLevelDict": "compress/zlib", "zlib.NoCompression": "compress/zlib", "zlib.Resetter": "compress/zlib", "zlib.Writer": "compress/zlib", "unsafe.Alignof": "unsafe", "unsafe.ArbitraryType": "unsafe", "unsafe.Offsetof": "unsafe", "unsafe.Pointer": "unsafe", "unsafe.Sizeof": "unsafe", } ================================================ FILE: vendor/gopkg.in/bsm/ratelimit.v1/Makefile ================================================ default: test testdeps: @go get github.com/onsi/ginkgo @go get github.com/onsi/gomega test: testdeps @go test ./... testrace: testdeps @go test ./... -race testall: test testrace bench: @go test ./... -run=NONE -bench=. ================================================ FILE: vendor/gopkg.in/bsm/ratelimit.v1/README.md ================================================ # RateLimit [![Build Status](https://travis-ci.org/bsm/ratelimit.png?branch=master)](https://travis-ci.org/bsm/ratelimit) Simple, thread-safe Go rate-limiter. Inspired by Antti Huima's algorithm on http://stackoverflow.com/a/668327 ### Example ```go package main import ( "github.com/bsm/ratelimit" "log" ) func main() { // Create a new rate-limiter, allowing up-to 10 calls // per second rl := ratelimit.New(10, time.Second) for i:=0; i<20; i++ { if rl.Limit() { fmt.Println("DOH! Over limit!") } else { fmt.Println("OK") } } } ``` ### Licence ``` Copyright (c) 2015 Black Square Media Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` ================================================ FILE: vendor/gopkg.in/bsm/ratelimit.v1/ratelimit.go ================================================ /* Simple, thread-safe Go rate-limiter. Inspired by Antti Huima's algorithm on http://stackoverflow.com/a/668327 Example: // Create a new rate-limiter, allowing up-to 10 calls // per second rl := ratelimit.New(10, time.Second) for i:=0; i<20; i++ { if rl.Limit() { fmt.Println("DOH! Over limit!") } else { fmt.Println("OK") } } */ package ratelimit import ( "sync/atomic" "time" ) // RateLimiter instances are thread-safe. type RateLimiter struct { rate, allowance, max, unit, lastCheck uint64 } // New creates a new rate limiter instance func New(rate int, per time.Duration) *RateLimiter { nano := uint64(per) if nano < 1 { nano = uint64(time.Second) } if rate < 1 { rate = 1 } return &RateLimiter{ rate: uint64(rate), // store the rate allowance: uint64(rate) * nano, // set our allowance to max in the beginning max: uint64(rate) * nano, // remember our maximum allowance unit: nano, // remember our unit size lastCheck: unixNano(), } } // UpdateRate allows to update the allowed rate func (rl *RateLimiter) UpdateRate(rate int) { atomic.StoreUint64(&rl.rate, uint64(rate)) atomic.StoreUint64(&rl.max, uint64(rate)*rl.unit) } // Limit returns true if rate was exceeded func (rl *RateLimiter) Limit() bool { // Calculate the number of ns that have passed since our last call now := unixNano() passed := now - atomic.SwapUint64(&rl.lastCheck, now) // Add them to our allowance rate := atomic.LoadUint64(&rl.rate) current := atomic.AddUint64(&rl.allowance, passed*rate) // Ensure our allowance is not over maximum if max := atomic.LoadUint64(&rl.max); current > max { atomic.AddUint64(&rl.allowance, max-current) current = max } // If our allowance is less than one unit, rate-limit! if current < rl.unit { return true } // Not limited, subtract a unit atomic.AddUint64(&rl.allowance, -rl.unit) return false } // Undo reverts the last Limit() call, returning consumed allowance func (rl *RateLimiter) Undo() { current := atomic.AddUint64(&rl.allowance, rl.unit) // Ensure our allowance is not over maximum if max := atomic.LoadUint64(&rl.max); current > max { atomic.AddUint64(&rl.allowance, max-current) } } // now as unix nanoseconds func unixNano() uint64 { return uint64(time.Now().UnixNano()) } ================================================ FILE: vendor/gopkg.in/check.v1/LICENSE ================================================ Gocheck - A rich testing framework for Go Copyright (c) 2010-2013 Gustavo Niemeyer <gustavo@niemeyer.net> All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: vendor/gopkg.in/check.v1/README.md ================================================ Instructions ============ Install the package with: go get gopkg.in/check.v1 Import it with: import "gopkg.in/check.v1" and use _check_ as the package name inside the code. For more details, visit the project page: * http://labix.org/gocheck and the API documentation: * https://gopkg.in/check.v1 ================================================ FILE: vendor/gopkg.in/check.v1/TODO ================================================ - Assert(slice, Contains, item) - Parallel test support ================================================ FILE: vendor/gopkg.in/check.v1/benchmark.go ================================================ // Copyright (c) 2012 The Go Authors. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package check import ( "fmt" "runtime" "time" ) var memStats runtime.MemStats // testingB is a type passed to Benchmark functions to manage benchmark // timing and to specify the number of iterations to run. type timer struct { start time.Time // Time test or benchmark started duration time.Duration N int bytes int64 timerOn bool benchTime time.Duration // The initial states of memStats.Mallocs and memStats.TotalAlloc. startAllocs uint64 startBytes uint64 // The net total of this test after being run. netAllocs uint64 netBytes uint64 } // StartTimer starts timing a test. This function is called automatically // before a benchmark starts, but it can also used to resume timing after // a call to StopTimer. func (c *C) StartTimer() { if !c.timerOn { c.start = time.Now() c.timerOn = true runtime.ReadMemStats(&memStats) c.startAllocs = memStats.Mallocs c.startBytes = memStats.TotalAlloc } } // StopTimer stops timing a test. This can be used to pause the timer // while performing complex initialization that you don't // want to measure. func (c *C) StopTimer() { if c.timerOn { c.duration += time.Now().Sub(c.start) c.timerOn = false runtime.ReadMemStats(&memStats) c.netAllocs += memStats.Mallocs - c.startAllocs c.netBytes += memStats.TotalAlloc - c.startBytes } } // ResetTimer sets the elapsed benchmark time to zero. // It does not affect whether the timer is running. func (c *C) ResetTimer() { if c.timerOn { c.start = time.Now() runtime.ReadMemStats(&memStats) c.startAllocs = memStats.Mallocs c.startBytes = memStats.TotalAlloc } c.duration = 0 c.netAllocs = 0 c.netBytes = 0 } // SetBytes informs the number of bytes that the benchmark processes // on each iteration. If this is called in a benchmark it will also // report MB/s. func (c *C) SetBytes(n int64) { c.bytes = n } func (c *C) nsPerOp() int64 { if c.N <= 0 { return 0 } return c.duration.Nanoseconds() / int64(c.N) } func (c *C) mbPerSec() float64 { if c.bytes <= 0 || c.duration <= 0 || c.N <= 0 { return 0 } return (float64(c.bytes) * float64(c.N) / 1e6) / c.duration.Seconds() } func (c *C) timerString() string { if c.N <= 0 { return fmt.Sprintf("%3.3fs", float64(c.duration.Nanoseconds())/1e9) } mbs := c.mbPerSec() mb := "" if mbs != 0 { mb = fmt.Sprintf("\t%7.2f MB/s", mbs) } nsop := c.nsPerOp() ns := fmt.Sprintf("%10d ns/op", nsop) if c.N > 0 && nsop < 100 { // The format specifiers here make sure that // the ones digits line up for all three possible formats. if nsop < 10 { ns = fmt.Sprintf("%13.2f ns/op", float64(c.duration.Nanoseconds())/float64(c.N)) } else { ns = fmt.Sprintf("%12.1f ns/op", float64(c.duration.Nanoseconds())/float64(c.N)) } } memStats := "" if c.benchMem { allocedBytes := fmt.Sprintf("%8d B/op", int64(c.netBytes)/int64(c.N)) allocs := fmt.Sprintf("%8d allocs/op", int64(c.netAllocs)/int64(c.N)) memStats = fmt.Sprintf("\t%s\t%s", allocedBytes, allocs) } return fmt.Sprintf("%8d\t%s%s%s", c.N, ns, mb, memStats) } func min(x, y int) int { if x > y { return y } return x } func max(x, y int) int { if x < y { return y } return x } // roundDown10 rounds a number down to the nearest power of 10. func roundDown10(n int) int { var tens = 0 // tens = floor(log_10(n)) for n > 10 { n = n / 10 tens++ } // result = 10^tens result := 1 for i := 0; i < tens; i++ { result *= 10 } return result } // roundUp rounds x up to a number of the form [1eX, 2eX, 5eX]. func roundUp(n int) int { base := roundDown10(n) if n < (2 * base) { return 2 * base } if n < (5 * base) { return 5 * base } return 10 * base } ================================================ FILE: vendor/gopkg.in/check.v1/check.go ================================================ // Package check is a rich testing extension for Go's testing package. // // For details about the project, see: // // http://labix.org/gocheck // package check import ( "bytes" "errors" "fmt" "io" "math/rand" "os" "path" "path/filepath" "reflect" "regexp" "runtime" "strconv" "strings" "sync" "sync/atomic" "time" ) // ----------------------------------------------------------------------- // Internal type which deals with suite method calling. const ( fixtureKd = iota testKd ) type funcKind int const ( succeededSt = iota failedSt skippedSt panickedSt fixturePanickedSt missedSt ) type funcStatus uint32 // A method value can't reach its own Method structure. type methodType struct { reflect.Value Info reflect.Method } func newMethod(receiver reflect.Value, i int) *methodType { return &methodType{receiver.Method(i), receiver.Type().Method(i)} } func (method *methodType) PC() uintptr { return method.Info.Func.Pointer() } func (method *methodType) suiteName() string { t := method.Info.Type.In(0) if t.Kind() == reflect.Ptr { t = t.Elem() } return t.Name() } func (method *methodType) String() string { return method.suiteName() + "." + method.Info.Name } func (method *methodType) matches(re *regexp.Regexp) bool { return (re.MatchString(method.Info.Name) || re.MatchString(method.suiteName()) || re.MatchString(method.String())) } type C struct { method *methodType kind funcKind testName string _status funcStatus logb *logger logw io.Writer done chan *C reason string mustFail bool tempDir *tempDir benchMem bool startTime time.Time timer } func (c *C) status() funcStatus { return funcStatus(atomic.LoadUint32((*uint32)(&c._status))) } func (c *C) setStatus(s funcStatus) { atomic.StoreUint32((*uint32)(&c._status), uint32(s)) } func (c *C) stopNow() { runtime.Goexit() } // logger is a concurrency safe byte.Buffer type logger struct { sync.Mutex writer bytes.Buffer } func (l *logger) Write(buf []byte) (int, error) { l.Lock() defer l.Unlock() return l.writer.Write(buf) } func (l *logger) WriteTo(w io.Writer) (int64, error) { l.Lock() defer l.Unlock() return l.writer.WriteTo(w) } func (l *logger) String() string { l.Lock() defer l.Unlock() return l.writer.String() } // ----------------------------------------------------------------------- // Handling of temporary files and directories. type tempDir struct { sync.Mutex path string counter int } func (td *tempDir) newPath() string { td.Lock() defer td.Unlock() if td.path == "" { var err error for i := 0; i != 100; i++ { path := fmt.Sprintf("%s%ccheck-%d", os.TempDir(), os.PathSeparator, rand.Int()) if err = os.Mkdir(path, 0700); err == nil { td.path = path break } } if td.path == "" { panic("Couldn't create temporary directory: " + err.Error()) } } result := filepath.Join(td.path, strconv.Itoa(td.counter)) td.counter++ return result } func (td *tempDir) removeAll() { td.Lock() defer td.Unlock() if td.path != "" { err := os.RemoveAll(td.path) if err != nil { fmt.Fprintf(os.Stderr, "WARNING: Error cleaning up temporaries: "+err.Error()) } } } // Create a new temporary directory which is automatically removed after // the suite finishes running. func (c *C) MkDir() string { path := c.tempDir.newPath() if err := os.Mkdir(path, 0700); err != nil { panic(fmt.Sprintf("Couldn't create temporary directory %s: %s", path, err.Error())) } return path } // ----------------------------------------------------------------------- // Low-level logging functions. func (c *C) log(args ...interface{}) { c.writeLog([]byte(fmt.Sprint(args...) + "\n")) } func (c *C) logf(format string, args ...interface{}) { c.writeLog([]byte(fmt.Sprintf(format+"\n", args...))) } func (c *C) logNewLine() { c.writeLog([]byte{'\n'}) } func (c *C) writeLog(buf []byte) { c.logb.Write(buf) if c.logw != nil { c.logw.Write(buf) } } func hasStringOrError(x interface{}) (ok bool) { _, ok = x.(fmt.Stringer) if ok { return } _, ok = x.(error) return } func (c *C) logValue(label string, value interface{}) { if label == "" { if hasStringOrError(value) { c.logf("... %#v (%q)", value, value) } else { c.logf("... %#v", value) } } else if value == nil { c.logf("... %s = nil", label) } else { if hasStringOrError(value) { fv := fmt.Sprintf("%#v", value) qv := fmt.Sprintf("%q", value) if fv != qv { c.logf("... %s %s = %s (%s)", label, reflect.TypeOf(value), fv, qv) return } } if s, ok := value.(string); ok && isMultiLine(s) { c.logf(`... %s %s = "" +`, label, reflect.TypeOf(value)) c.logMultiLine(s) } else { c.logf("... %s %s = %#v", label, reflect.TypeOf(value), value) } } } func (c *C) logMultiLine(s string) { b := make([]byte, 0, len(s)*2) i := 0 n := len(s) for i < n { j := i + 1 for j < n && s[j-1] != '\n' { j++ } b = append(b, "... "...) b = strconv.AppendQuote(b, s[i:j]) if j < n { b = append(b, " +"...) } b = append(b, '\n') i = j } c.writeLog(b) } func isMultiLine(s string) bool { for i := 0; i+1 < len(s); i++ { if s[i] == '\n' { return true } } return false } func (c *C) logString(issue string) { c.log("... ", issue) } func (c *C) logCaller(skip int) { // This is a bit heavier than it ought to be. skip++ // Our own frame. pc, callerFile, callerLine, ok := runtime.Caller(skip) if !ok { return } var testFile string var testLine int testFunc := runtime.FuncForPC(c.method.PC()) if runtime.FuncForPC(pc) != testFunc { for { skip++ if pc, file, line, ok := runtime.Caller(skip); ok { // Note that the test line may be different on // distinct calls for the same test. Showing // the "internal" line is helpful when debugging. if runtime.FuncForPC(pc) == testFunc { testFile, testLine = file, line break } } else { break } } } if testFile != "" && (testFile != callerFile || testLine != callerLine) { c.logCode(testFile, testLine) } c.logCode(callerFile, callerLine) } func (c *C) logCode(path string, line int) { c.logf("%s:%d:", nicePath(path), line) code, err := printLine(path, line) if code == "" { code = "..." // XXX Open the file and take the raw line. if err != nil { code += err.Error() } } c.log(indent(code, " ")) } var valueGo = filepath.Join("reflect", "value.go") var asmGo = filepath.Join("runtime", "asm_") func (c *C) logPanic(skip int, value interface{}) { skip++ // Our own frame. initialSkip := skip for ; ; skip++ { if pc, file, line, ok := runtime.Caller(skip); ok { if skip == initialSkip { c.logf("... Panic: %s (PC=0x%X)\n", value, pc) } name := niceFuncName(pc) path := nicePath(file) if strings.Contains(path, "/gopkg.in/check.v") { continue } if name == "Value.call" && strings.HasSuffix(path, valueGo) { continue } if (name == "call16" || name == "call32") && strings.Contains(path, asmGo) { continue } c.logf("%s:%d\n in %s", nicePath(file), line, name) } else { break } } } func (c *C) logSoftPanic(issue string) { c.log("... Panic: ", issue) } func (c *C) logArgPanic(method *methodType, expectedType string) { c.logf("... Panic: %s argument should be %s", niceFuncName(method.PC()), expectedType) } // ----------------------------------------------------------------------- // Some simple formatting helpers. var initWD, initWDErr = os.Getwd() func init() { if initWDErr == nil { initWD = strings.Replace(initWD, "\\", "/", -1) + "/" } } func nicePath(path string) string { if initWDErr == nil { if strings.HasPrefix(path, initWD) { return path[len(initWD):] } } return path } func niceFuncPath(pc uintptr) string { function := runtime.FuncForPC(pc) if function != nil { filename, line := function.FileLine(pc) return fmt.Sprintf("%s:%d", nicePath(filename), line) } return "<unknown path>" } func niceFuncName(pc uintptr) string { function := runtime.FuncForPC(pc) if function != nil { name := path.Base(function.Name()) if i := strings.Index(name, "."); i > 0 { name = name[i+1:] } if strings.HasPrefix(name, "(*") { if i := strings.Index(name, ")"); i > 0 { name = name[2:i] + name[i+1:] } } if i := strings.LastIndex(name, ".*"); i != -1 { name = name[:i] + "." + name[i+2:] } if i := strings.LastIndex(name, "·"); i != -1 { name = name[:i] + "." + name[i+2:] } return name } return "<unknown function>" } // ----------------------------------------------------------------------- // Result tracker to aggregate call results. type Result struct { Succeeded int Failed int Skipped int Panicked int FixturePanicked int ExpectedFailures int Missed int // Not even tried to run, related to a panic in the fixture. RunError error // Houston, we've got a problem. WorkDir string // If KeepWorkDir is true } type resultTracker struct { result Result _lastWasProblem bool _waiting int _missed int _expectChan chan *C _doneChan chan *C _stopChan chan bool } func newResultTracker() *resultTracker { return &resultTracker{_expectChan: make(chan *C), // Synchronous _doneChan: make(chan *C, 32), // Asynchronous _stopChan: make(chan bool)} // Synchronous } func (tracker *resultTracker) start() { go tracker._loopRoutine() } func (tracker *resultTracker) waitAndStop() { <-tracker._stopChan } func (tracker *resultTracker) expectCall(c *C) { tracker._expectChan <- c } func (tracker *resultTracker) callDone(c *C) { tracker._doneChan <- c } func (tracker *resultTracker) _loopRoutine() { for { var c *C if tracker._waiting > 0 { // Calls still running. Can't stop. select { // XXX Reindent this (not now to make diff clear) case <-tracker._expectChan: tracker._waiting++ case c = <-tracker._doneChan: tracker._waiting-- switch c.status() { case succeededSt: if c.kind == testKd { if c.mustFail { tracker.result.ExpectedFailures++ } else { tracker.result.Succeeded++ } } case failedSt: tracker.result.Failed++ case panickedSt: if c.kind == fixtureKd { tracker.result.FixturePanicked++ } else { tracker.result.Panicked++ } case fixturePanickedSt: // Track it as missed, since the panic // was on the fixture, not on the test. tracker.result.Missed++ case missedSt: tracker.result.Missed++ case skippedSt: if c.kind == testKd { tracker.result.Skipped++ } } } } else { // No calls. Can stop, but no done calls here. select { case tracker._stopChan <- true: return case <-tracker._expectChan: tracker._waiting++ case <-tracker._doneChan: panic("Tracker got an unexpected done call.") } } } } // ----------------------------------------------------------------------- // The underlying suite runner. type suiteRunner struct { suite interface{} setUpSuite, tearDownSuite *methodType setUpTest, tearDownTest *methodType tests []*methodType tracker *resultTracker tempDir *tempDir keepDir bool output *outputWriter reportedProblemLast bool benchTime time.Duration benchMem bool } type RunConf struct { Output io.Writer Stream bool Verbose bool Filter string Benchmark bool BenchmarkTime time.Duration // Defaults to 1 second BenchmarkMem bool KeepWorkDir bool } // Create a new suiteRunner able to run all methods in the given suite. func newSuiteRunner(suite interface{}, runConf *RunConf) *suiteRunner { var conf RunConf if runConf != nil { conf = *runConf } if conf.Output == nil { conf.Output = os.Stdout } if conf.Benchmark { conf.Verbose = true } suiteType := reflect.TypeOf(suite) suiteNumMethods := suiteType.NumMethod() suiteValue := reflect.ValueOf(suite) runner := &suiteRunner{ suite: suite, output: newOutputWriter(conf.Output, conf.Stream, conf.Verbose), tracker: newResultTracker(), benchTime: conf.BenchmarkTime, benchMem: conf.BenchmarkMem, tempDir: &tempDir{}, keepDir: conf.KeepWorkDir, tests: make([]*methodType, 0, suiteNumMethods), } if runner.benchTime == 0 { runner.benchTime = 1 * time.Second } var filterRegexp *regexp.Regexp if conf.Filter != "" { regexp, err := regexp.Compile(conf.Filter) if err != nil { msg := "Bad filter expression: " + err.Error() runner.tracker.result.RunError = errors.New(msg) return runner } filterRegexp = regexp } for i := 0; i != suiteNumMethods; i++ { method := newMethod(suiteValue, i) switch method.Info.Name { case "SetUpSuite": runner.setUpSuite = method case "TearDownSuite": runner.tearDownSuite = method case "SetUpTest": runner.setUpTest = method case "TearDownTest": runner.tearDownTest = method default: prefix := "Test" if conf.Benchmark { prefix = "Benchmark" } if !strings.HasPrefix(method.Info.Name, prefix) { continue } if filterRegexp == nil || method.matches(filterRegexp) { runner.tests = append(runner.tests, method) } } } return runner } // Run all methods in the given suite. func (runner *suiteRunner) run() *Result { if runner.tracker.result.RunError == nil && len(runner.tests) > 0 { runner.tracker.start() if runner.checkFixtureArgs() { c := runner.runFixture(runner.setUpSuite, "", nil) if c == nil || c.status() == succeededSt { for i := 0; i != len(runner.tests); i++ { c := runner.runTest(runner.tests[i]) if c.status() == fixturePanickedSt { runner.skipTests(missedSt, runner.tests[i+1:]) break } } } else if c != nil && c.status() == skippedSt { runner.skipTests(skippedSt, runner.tests) } else { runner.skipTests(missedSt, runner.tests) } runner.runFixture(runner.tearDownSuite, "", nil) } else { runner.skipTests(missedSt, runner.tests) } runner.tracker.waitAndStop() if runner.keepDir { runner.tracker.result.WorkDir = runner.tempDir.path } else { runner.tempDir.removeAll() } } return &runner.tracker.result } // Create a call object with the given suite method, and fork a // goroutine with the provided dispatcher for running it. func (runner *suiteRunner) forkCall(method *methodType, kind funcKind, testName string, logb *logger, dispatcher func(c *C)) *C { var logw io.Writer if runner.output.Stream { logw = runner.output } if logb == nil { logb = new(logger) } c := &C{ method: method, kind: kind, testName: testName, logb: logb, logw: logw, tempDir: runner.tempDir, done: make(chan *C, 1), timer: timer{benchTime: runner.benchTime}, startTime: time.Now(), benchMem: runner.benchMem, } runner.tracker.expectCall(c) go (func() { runner.reportCallStarted(c) defer runner.callDone(c) dispatcher(c) })() return c } // Same as forkCall(), but wait for call to finish before returning. func (runner *suiteRunner) runFunc(method *methodType, kind funcKind, testName string, logb *logger, dispatcher func(c *C)) *C { c := runner.forkCall(method, kind, testName, logb, dispatcher) <-c.done return c } // Handle a finished call. If there were any panics, update the call status // accordingly. Then, mark the call as done and report to the tracker. func (runner *suiteRunner) callDone(c *C) { value := recover() if value != nil { switch v := value.(type) { case *fixturePanic: if v.status == skippedSt { c.setStatus(skippedSt) } else { c.logSoftPanic("Fixture has panicked (see related PANIC)") c.setStatus(fixturePanickedSt) } default: c.logPanic(1, value) c.setStatus(panickedSt) } } if c.mustFail { switch c.status() { case failedSt: c.setStatus(succeededSt) case succeededSt: c.setStatus(failedSt) c.logString("Error: Test succeeded, but was expected to fail") c.logString("Reason: " + c.reason) } } runner.reportCallDone(c) c.done <- c } // Runs a fixture call synchronously. The fixture will still be run in a // goroutine like all suite methods, but this method will not return // while the fixture goroutine is not done, because the fixture must be // run in a desired order. func (runner *suiteRunner) runFixture(method *methodType, testName string, logb *logger) *C { if method != nil { c := runner.runFunc(method, fixtureKd, testName, logb, func(c *C) { c.ResetTimer() c.StartTimer() defer c.StopTimer() c.method.Call([]reflect.Value{reflect.ValueOf(c)}) }) return c } return nil } // Run the fixture method with runFixture(), but panic with a fixturePanic{} // in case the fixture method panics. This makes it easier to track the // fixture panic together with other call panics within forkTest(). func (runner *suiteRunner) runFixtureWithPanic(method *methodType, testName string, logb *logger, skipped *bool) *C { if skipped != nil && *skipped { return nil } c := runner.runFixture(method, testName, logb) if c != nil && c.status() != succeededSt { if skipped != nil { *skipped = c.status() == skippedSt } panic(&fixturePanic{c.status(), method}) } return c } type fixturePanic struct { status funcStatus method *methodType } // Run the suite test method, together with the test-specific fixture, // asynchronously. func (runner *suiteRunner) forkTest(method *methodType) *C { testName := method.String() return runner.forkCall(method, testKd, testName, nil, func(c *C) { var skipped bool defer runner.runFixtureWithPanic(runner.tearDownTest, testName, nil, &skipped) defer c.StopTimer() benchN := 1 for { runner.runFixtureWithPanic(runner.setUpTest, testName, c.logb, &skipped) mt := c.method.Type() if mt.NumIn() != 1 || mt.In(0) != reflect.TypeOf(c) { // Rather than a plain panic, provide a more helpful message when // the argument type is incorrect. c.setStatus(panickedSt) c.logArgPanic(c.method, "*check.C") return } if strings.HasPrefix(c.method.Info.Name, "Test") { c.ResetTimer() c.StartTimer() c.method.Call([]reflect.Value{reflect.ValueOf(c)}) return } if !strings.HasPrefix(c.method.Info.Name, "Benchmark") { panic("unexpected method prefix: " + c.method.Info.Name) } runtime.GC() c.N = benchN c.ResetTimer() c.StartTimer() c.method.Call([]reflect.Value{reflect.ValueOf(c)}) c.StopTimer() if c.status() != succeededSt || c.duration >= c.benchTime || benchN >= 1e9 { return } perOpN := int(1e9) if c.nsPerOp() != 0 { perOpN = int(c.benchTime.Nanoseconds() / c.nsPerOp()) } // Logic taken from the stock testing package: // - Run more iterations than we think we'll need for a second (1.5x). // - Don't grow too fast in case we had timing errors previously. // - Be sure to run at least one more than last time. benchN = max(min(perOpN+perOpN/2, 100*benchN), benchN+1) benchN = roundUp(benchN) skipped = true // Don't run the deferred one if this panics. runner.runFixtureWithPanic(runner.tearDownTest, testName, nil, nil) skipped = false } }) } // Same as forkTest(), but wait for the test to finish before returning. func (runner *suiteRunner) runTest(method *methodType) *C { c := runner.forkTest(method) <-c.done return c } // Helper to mark tests as skipped or missed. A bit heavy for what // it does, but it enables homogeneous handling of tracking, including // nice verbose output. func (runner *suiteRunner) skipTests(status funcStatus, methods []*methodType) { for _, method := range methods { runner.runFunc(method, testKd, "", nil, func(c *C) { c.setStatus(status) }) } } // Verify if the fixture arguments are *check.C. In case of errors, // log the error as a panic in the fixture method call, and return false. func (runner *suiteRunner) checkFixtureArgs() bool { succeeded := true argType := reflect.TypeOf(&C{}) for _, method := range []*methodType{runner.setUpSuite, runner.tearDownSuite, runner.setUpTest, runner.tearDownTest} { if method != nil { mt := method.Type() if mt.NumIn() != 1 || mt.In(0) != argType { succeeded = false runner.runFunc(method, fixtureKd, "", nil, func(c *C) { c.logArgPanic(method, "*check.C") c.setStatus(panickedSt) }) } } } return succeeded } func (runner *suiteRunner) reportCallStarted(c *C) { runner.output.WriteCallStarted("START", c) } func (runner *suiteRunner) reportCallDone(c *C) { runner.tracker.callDone(c) switch c.status() { case succeededSt: if c.mustFail { runner.output.WriteCallSuccess("FAIL EXPECTED", c) } else { runner.output.WriteCallSuccess("PASS", c) } case skippedSt: runner.output.WriteCallSuccess("SKIP", c) case failedSt: runner.output.WriteCallProblem("FAIL", c) case panickedSt: runner.output.WriteCallProblem("PANIC", c) case fixturePanickedSt: // That's a testKd call reporting that its fixture // has panicked. The fixture call which caused the // panic itself was tracked above. We'll report to // aid debugging. runner.output.WriteCallProblem("PANIC", c) case missedSt: runner.output.WriteCallSuccess("MISS", c) } } ================================================ FILE: vendor/gopkg.in/check.v1/checkers.go ================================================ package check import ( "fmt" "reflect" "regexp" ) // ----------------------------------------------------------------------- // CommentInterface and Commentf helper, to attach extra information to checks. type comment struct { format string args []interface{} } // Commentf returns an infomational value to use with Assert or Check calls. // If the checker test fails, the provided arguments will be passed to // fmt.Sprintf, and will be presented next to the logged failure. // // For example: // // c.Assert(v, Equals, 42, Commentf("Iteration #%d failed.", i)) // // Note that if the comment is constant, a better option is to // simply use a normal comment right above or next to the line, as // it will also get printed with any errors: // // c.Assert(l, Equals, 8192) // Ensure buffer size is correct (bug #123) // func Commentf(format string, args ...interface{}) CommentInterface { return &comment{format, args} } // CommentInterface must be implemented by types that attach extra // information to failed checks. See the Commentf function for details. type CommentInterface interface { CheckCommentString() string } func (c *comment) CheckCommentString() string { return fmt.Sprintf(c.format, c.args...) } // ----------------------------------------------------------------------- // The Checker interface. // The Checker interface must be provided by checkers used with // the Assert and Check verification methods. type Checker interface { Info() *CheckerInfo Check(params []interface{}, names []string) (result bool, error string) } // See the Checker interface. type CheckerInfo struct { Name string Params []string } func (info *CheckerInfo) Info() *CheckerInfo { return info } // ----------------------------------------------------------------------- // Not checker logic inverter. // The Not checker inverts the logic of the provided checker. The // resulting checker will succeed where the original one failed, and // vice-versa. // // For example: // // c.Assert(a, Not(Equals), b) // func Not(checker Checker) Checker { return ¬Checker{checker} } type notChecker struct { sub Checker } func (checker *notChecker) Info() *CheckerInfo { info := *checker.sub.Info() info.Name = "Not(" + info.Name + ")" return &info } func (checker *notChecker) Check(params []interface{}, names []string) (result bool, error string) { result, error = checker.sub.Check(params, names) result = !result return } // ----------------------------------------------------------------------- // IsNil checker. type isNilChecker struct { *CheckerInfo } // The IsNil checker tests whether the obtained value is nil. // // For example: // // c.Assert(err, IsNil) // var IsNil Checker = &isNilChecker{ &CheckerInfo{Name: "IsNil", Params: []string{"value"}}, } func (checker *isNilChecker) Check(params []interface{}, names []string) (result bool, error string) { return isNil(params[0]), "" } func isNil(obtained interface{}) (result bool) { if obtained == nil { result = true } else { switch v := reflect.ValueOf(obtained); v.Kind() { case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: return v.IsNil() } } return } // ----------------------------------------------------------------------- // NotNil checker. Alias for Not(IsNil), since it's so common. type notNilChecker struct { *CheckerInfo } // The NotNil checker verifies that the obtained value is not nil. // // For example: // // c.Assert(iface, NotNil) // // This is an alias for Not(IsNil), made available since it's a // fairly common check. // var NotNil Checker = ¬NilChecker{ &CheckerInfo{Name: "NotNil", Params: []string{"value"}}, } func (checker *notNilChecker) Check(params []interface{}, names []string) (result bool, error string) { return !isNil(params[0]), "" } // ----------------------------------------------------------------------- // Equals checker. type equalsChecker struct { *CheckerInfo } // The Equals checker verifies that the obtained value is equal to // the expected value, according to usual Go semantics for ==. // // For example: // // c.Assert(value, Equals, 42) // var Equals Checker = &equalsChecker{ &CheckerInfo{Name: "Equals", Params: []string{"obtained", "expected"}}, } func (checker *equalsChecker) Check(params []interface{}, names []string) (result bool, error string) { defer func() { if v := recover(); v != nil { result = false error = fmt.Sprint(v) } }() return params[0] == params[1], "" } // ----------------------------------------------------------------------- // DeepEquals checker. type deepEqualsChecker struct { *CheckerInfo } // The DeepEquals checker verifies that the obtained value is deep-equal to // the expected value. The check will work correctly even when facing // slices, interfaces, and values of different types (which always fail // the test). // // For example: // // c.Assert(value, DeepEquals, 42) // c.Assert(array, DeepEquals, []string{"hi", "there"}) // var DeepEquals Checker = &deepEqualsChecker{ &CheckerInfo{Name: "DeepEquals", Params: []string{"obtained", "expected"}}, } func (checker *deepEqualsChecker) Check(params []interface{}, names []string) (result bool, error string) { return reflect.DeepEqual(params[0], params[1]), "" } // ----------------------------------------------------------------------- // HasLen checker. type hasLenChecker struct { *CheckerInfo } // The HasLen checker verifies that the obtained value has the // provided length. In many cases this is superior to using Equals // in conjunction with the len function because in case the check // fails the value itself will be printed, instead of its length, // providing more details for figuring the problem. // // For example: // // c.Assert(list, HasLen, 5) // var HasLen Checker = &hasLenChecker{ &CheckerInfo{Name: "HasLen", Params: []string{"obtained", "n"}}, } func (checker *hasLenChecker) Check(params []interface{}, names []string) (result bool, error string) { n, ok := params[1].(int) if !ok { return false, "n must be an int" } value := reflect.ValueOf(params[0]) switch value.Kind() { case reflect.Map, reflect.Array, reflect.Slice, reflect.Chan, reflect.String: default: return false, "obtained value type has no length" } return value.Len() == n, "" } // ----------------------------------------------------------------------- // ErrorMatches checker. type errorMatchesChecker struct { *CheckerInfo } // The ErrorMatches checker verifies that the error value // is non nil and matches the regular expression provided. // // For example: // // c.Assert(err, ErrorMatches, "perm.*denied") // var ErrorMatches Checker = errorMatchesChecker{ &CheckerInfo{Name: "ErrorMatches", Params: []string{"value", "regex"}}, } func (checker errorMatchesChecker) Check(params []interface{}, names []string) (result bool, errStr string) { if params[0] == nil { return false, "Error value is nil" } err, ok := params[0].(error) if !ok { return false, "Value is not an error" } params[0] = err.Error() names[0] = "error" return matches(params[0], params[1]) } // ----------------------------------------------------------------------- // Matches checker. type matchesChecker struct { *CheckerInfo } // The Matches checker verifies that the string provided as the obtained // value (or the string resulting from obtained.String()) matches the // regular expression provided. // // For example: // // c.Assert(err, Matches, "perm.*denied") // var Matches Checker = &matchesChecker{ &CheckerInfo{Name: "Matches", Params: []string{"value", "regex"}}, } func (checker *matchesChecker) Check(params []interface{}, names []string) (result bool, error string) { return matches(params[0], params[1]) } func matches(value, regex interface{}) (result bool, error string) { reStr, ok := regex.(string) if !ok { return false, "Regex must be a string" } valueStr, valueIsStr := value.(string) if !valueIsStr { if valueWithStr, valueHasStr := value.(fmt.Stringer); valueHasStr { valueStr, valueIsStr = valueWithStr.String(), true } } if valueIsStr { matches, err := regexp.MatchString("^"+reStr+"$", valueStr) if err != nil { return false, "Can't compile regex: " + err.Error() } return matches, "" } return false, "Obtained value is not a string and has no .String()" } // ----------------------------------------------------------------------- // Panics checker. type panicsChecker struct { *CheckerInfo } // The Panics checker verifies that calling the provided zero-argument // function will cause a panic which is deep-equal to the provided value. // // For example: // // c.Assert(func() { f(1, 2) }, Panics, &SomeErrorType{"BOOM"}). // // var Panics Checker = &panicsChecker{ &CheckerInfo{Name: "Panics", Params: []string{"function", "expected"}}, } func (checker *panicsChecker) Check(params []interface{}, names []string) (result bool, error string) { f := reflect.ValueOf(params[0]) if f.Kind() != reflect.Func || f.Type().NumIn() != 0 { return false, "Function must take zero arguments" } defer func() { // If the function has not panicked, then don't do the check. if error != "" { return } params[0] = recover() names[0] = "panic" result = reflect.DeepEqual(params[0], params[1]) }() f.Call(nil) return false, "Function has not panicked" } type panicMatchesChecker struct { *CheckerInfo } // The PanicMatches checker verifies that calling the provided zero-argument // function will cause a panic with an error value matching // the regular expression provided. // // For example: // // c.Assert(func() { f(1, 2) }, PanicMatches, `open.*: no such file or directory`). // // var PanicMatches Checker = &panicMatchesChecker{ &CheckerInfo{Name: "PanicMatches", Params: []string{"function", "expected"}}, } func (checker *panicMatchesChecker) Check(params []interface{}, names []string) (result bool, errmsg string) { f := reflect.ValueOf(params[0]) if f.Kind() != reflect.Func || f.Type().NumIn() != 0 { return false, "Function must take zero arguments" } defer func() { // If the function has not panicked, then don't do the check. if errmsg != "" { return } obtained := recover() names[0] = "panic" if e, ok := obtained.(error); ok { params[0] = e.Error() } else if _, ok := obtained.(string); ok { params[0] = obtained } else { errmsg = "Panic value is not a string or an error" return } result, errmsg = matches(params[0], params[1]) }() f.Call(nil) return false, "Function has not panicked" } // ----------------------------------------------------------------------- // FitsTypeOf checker. type fitsTypeChecker struct { *CheckerInfo } // The FitsTypeOf checker verifies that the obtained value is // assignable to a variable with the same type as the provided // sample value. // // For example: // // c.Assert(value, FitsTypeOf, int64(0)) // c.Assert(value, FitsTypeOf, os.Error(nil)) // var FitsTypeOf Checker = &fitsTypeChecker{ &CheckerInfo{Name: "FitsTypeOf", Params: []string{"obtained", "sample"}}, } func (checker *fitsTypeChecker) Check(params []interface{}, names []string) (result bool, error string) { obtained := reflect.ValueOf(params[0]) sample := reflect.ValueOf(params[1]) if !obtained.IsValid() { return false, "" } if !sample.IsValid() { return false, "Invalid sample value" } return obtained.Type().AssignableTo(sample.Type()), "" } // ----------------------------------------------------------------------- // Implements checker. type implementsChecker struct { *CheckerInfo } // The Implements checker verifies that the obtained value // implements the interface specified via a pointer to an interface // variable. // // For example: // // var e os.Error // c.Assert(err, Implements, &e) // var Implements Checker = &implementsChecker{ &CheckerInfo{Name: "Implements", Params: []string{"obtained", "ifaceptr"}}, } func (checker *implementsChecker) Check(params []interface{}, names []string) (result bool, error string) { obtained := reflect.ValueOf(params[0]) ifaceptr := reflect.ValueOf(params[1]) if !obtained.IsValid() { return false, "" } if !ifaceptr.IsValid() || ifaceptr.Kind() != reflect.Ptr || ifaceptr.Elem().Kind() != reflect.Interface { return false, "ifaceptr should be a pointer to an interface variable" } return obtained.Type().Implements(ifaceptr.Elem().Type()), "" } ================================================ FILE: vendor/gopkg.in/check.v1/helpers.go ================================================ package check import ( "fmt" "strings" "time" ) // TestName returns the current test name in the form "SuiteName.TestName" func (c *C) TestName() string { return c.testName } // ----------------------------------------------------------------------- // Basic succeeding/failing logic. // Failed returns whether the currently running test has already failed. func (c *C) Failed() bool { return c.status() == failedSt } // Fail marks the currently running test as failed. // // Something ought to have been previously logged so the developer can tell // what went wrong. The higher level helper functions will fail the test // and do the logging properly. func (c *C) Fail() { c.setStatus(failedSt) } // FailNow marks the currently running test as failed and stops running it. // Something ought to have been previously logged so the developer can tell // what went wrong. The higher level helper functions will fail the test // and do the logging properly. func (c *C) FailNow() { c.Fail() c.stopNow() } // Succeed marks the currently running test as succeeded, undoing any // previous failures. func (c *C) Succeed() { c.setStatus(succeededSt) } // SucceedNow marks the currently running test as succeeded, undoing any // previous failures, and stops running the test. func (c *C) SucceedNow() { c.Succeed() c.stopNow() } // ExpectFailure informs that the running test is knowingly broken for // the provided reason. If the test does not fail, an error will be reported // to raise attention to this fact. This method is useful to temporarily // disable tests which cover well known problems until a better time to // fix the problem is found, without forgetting about the fact that a // failure still exists. func (c *C) ExpectFailure(reason string) { if reason == "" { panic("Missing reason why the test is expected to fail") } c.mustFail = true c.reason = reason } // Skip skips the running test for the provided reason. If run from within // SetUpTest, the individual test being set up will be skipped, and if run // from within SetUpSuite, the whole suite is skipped. func (c *C) Skip(reason string) { if reason == "" { panic("Missing reason why the test is being skipped") } c.reason = reason c.setStatus(skippedSt) c.stopNow() } // ----------------------------------------------------------------------- // Basic logging. // GetTestLog returns the current test error output. func (c *C) GetTestLog() string { return c.logb.String() } // Log logs some information into the test error output. // The provided arguments are assembled together into a string with fmt.Sprint. func (c *C) Log(args ...interface{}) { c.log(args...) } // Log logs some information into the test error output. // The provided arguments are assembled together into a string with fmt.Sprintf. func (c *C) Logf(format string, args ...interface{}) { c.logf(format, args...) } // Output enables *C to be used as a logger in functions that require only // the minimum interface of *log.Logger. func (c *C) Output(calldepth int, s string) error { d := time.Now().Sub(c.startTime) msec := d / time.Millisecond sec := d / time.Second min := d / time.Minute c.Logf("[LOG] %d:%02d.%03d %s", min, sec%60, msec%1000, s) return nil } // Error logs an error into the test error output and marks the test as failed. // The provided arguments are assembled together into a string with fmt.Sprint. func (c *C) Error(args ...interface{}) { c.logCaller(1) c.logString(fmt.Sprint("Error: ", fmt.Sprint(args...))) c.logNewLine() c.Fail() } // Errorf logs an error into the test error output and marks the test as failed. // The provided arguments are assembled together into a string with fmt.Sprintf. func (c *C) Errorf(format string, args ...interface{}) { c.logCaller(1) c.logString(fmt.Sprintf("Error: "+format, args...)) c.logNewLine() c.Fail() } // Fatal logs an error into the test error output, marks the test as failed, and // stops the test execution. The provided arguments are assembled together into // a string with fmt.Sprint. func (c *C) Fatal(args ...interface{}) { c.logCaller(1) c.logString(fmt.Sprint("Error: ", fmt.Sprint(args...))) c.logNewLine() c.FailNow() } // Fatlaf logs an error into the test error output, marks the test as failed, and // stops the test execution. The provided arguments are assembled together into // a string with fmt.Sprintf. func (c *C) Fatalf(format string, args ...interface{}) { c.logCaller(1) c.logString(fmt.Sprint("Error: ", fmt.Sprintf(format, args...))) c.logNewLine() c.FailNow() } // ----------------------------------------------------------------------- // Generic checks and assertions based on checkers. // Check verifies if the first value matches the expected value according // to the provided checker. If they do not match, an error is logged, the // test is marked as failed, and the test execution continues. // // Some checkers may not need the expected argument (e.g. IsNil). // // Extra arguments provided to the function are logged next to the reported // problem when the matching fails. func (c *C) Check(obtained interface{}, checker Checker, args ...interface{}) bool { return c.internalCheck("Check", obtained, checker, args...) } // Assert ensures that the first value matches the expected value according // to the provided checker. If they do not match, an error is logged, the // test is marked as failed, and the test execution stops. // // Some checkers may not need the expected argument (e.g. IsNil). // // Extra arguments provided to the function are logged next to the reported // problem when the matching fails. func (c *C) Assert(obtained interface{}, checker Checker, args ...interface{}) { if !c.internalCheck("Assert", obtained, checker, args...) { c.stopNow() } } func (c *C) internalCheck(funcName string, obtained interface{}, checker Checker, args ...interface{}) bool { if checker == nil { c.logCaller(2) c.logString(fmt.Sprintf("%s(obtained, nil!?, ...):", funcName)) c.logString("Oops.. you've provided a nil checker!") c.logNewLine() c.Fail() return false } // If the last argument is a bug info, extract it out. var comment CommentInterface if len(args) > 0 { if c, ok := args[len(args)-1].(CommentInterface); ok { comment = c args = args[:len(args)-1] } } params := append([]interface{}{obtained}, args...) info := checker.Info() if len(params) != len(info.Params) { names := append([]string{info.Params[0], info.Name}, info.Params[1:]...) c.logCaller(2) c.logString(fmt.Sprintf("%s(%s):", funcName, strings.Join(names, ", "))) c.logString(fmt.Sprintf("Wrong number of parameters for %s: want %d, got %d", info.Name, len(names), len(params)+1)) c.logNewLine() c.Fail() return false } // Copy since it may be mutated by Check. names := append([]string{}, info.Params...) // Do the actual check. result, error := checker.Check(params, names) if !result || error != "" { c.logCaller(2) for i := 0; i != len(params); i++ { c.logValue(names[i], params[i]) } if comment != nil { c.logString(comment.CheckCommentString()) } if error != "" { c.logString(error) } c.logNewLine() c.Fail() return false } return true } ================================================ FILE: vendor/gopkg.in/check.v1/printer.go ================================================ package check import ( "bytes" "go/ast" "go/parser" "go/printer" "go/token" "os" ) func indent(s, with string) (r string) { eol := true for i := 0; i != len(s); i++ { c := s[i] switch { case eol && c == '\n' || c == '\r': case c == '\n' || c == '\r': eol = true case eol: eol = false s = s[:i] + with + s[i:] i += len(with) } } return s } func printLine(filename string, line int) (string, error) { fset := token.NewFileSet() file, err := os.Open(filename) if err != nil { return "", err } fnode, err := parser.ParseFile(fset, filename, file, parser.ParseComments) if err != nil { return "", err } config := &printer.Config{Mode: printer.UseSpaces, Tabwidth: 4} lp := &linePrinter{fset: fset, fnode: fnode, line: line, config: config} ast.Walk(lp, fnode) result := lp.output.Bytes() // Comments leave \n at the end. n := len(result) for n > 0 && result[n-1] == '\n' { n-- } return string(result[:n]), nil } type linePrinter struct { config *printer.Config fset *token.FileSet fnode *ast.File line int output bytes.Buffer stmt ast.Stmt } func (lp *linePrinter) emit() bool { if lp.stmt != nil { lp.trim(lp.stmt) lp.printWithComments(lp.stmt) lp.stmt = nil return true } return false } func (lp *linePrinter) printWithComments(n ast.Node) { nfirst := lp.fset.Position(n.Pos()).Line nlast := lp.fset.Position(n.End()).Line for _, g := range lp.fnode.Comments { cfirst := lp.fset.Position(g.Pos()).Line clast := lp.fset.Position(g.End()).Line if clast == nfirst-1 && lp.fset.Position(n.Pos()).Column == lp.fset.Position(g.Pos()).Column { for _, c := range g.List { lp.output.WriteString(c.Text) lp.output.WriteByte('\n') } } if cfirst >= nfirst && cfirst <= nlast && n.End() <= g.List[0].Slash { // The printer will not include the comment if it starts past // the node itself. Trick it into printing by overlapping the // slash with the end of the statement. g.List[0].Slash = n.End() - 1 } } node := &printer.CommentedNode{n, lp.fnode.Comments} lp.config.Fprint(&lp.output, lp.fset, node) } func (lp *linePrinter) Visit(n ast.Node) (w ast.Visitor) { if n == nil { if lp.output.Len() == 0 { lp.emit() } return nil } first := lp.fset.Position(n.Pos()).Line last := lp.fset.Position(n.End()).Line if first <= lp.line && last >= lp.line { // Print the innermost statement containing the line. if stmt, ok := n.(ast.Stmt); ok { if _, ok := n.(*ast.BlockStmt); !ok { lp.stmt = stmt } } if first == lp.line && lp.emit() { return nil } return lp } return nil } func (lp *linePrinter) trim(n ast.Node) bool { stmt, ok := n.(ast.Stmt) if !ok { return true } line := lp.fset.Position(n.Pos()).Line if line != lp.line { return false } switch stmt := stmt.(type) { case *ast.IfStmt: stmt.Body = lp.trimBlock(stmt.Body) case *ast.SwitchStmt: stmt.Body = lp.trimBlock(stmt.Body) case *ast.TypeSwitchStmt: stmt.Body = lp.trimBlock(stmt.Body) case *ast.CaseClause: stmt.Body = lp.trimList(stmt.Body) case *ast.CommClause: stmt.Body = lp.trimList(stmt.Body) case *ast.BlockStmt: stmt.List = lp.trimList(stmt.List) } return true } func (lp *linePrinter) trimBlock(stmt *ast.BlockStmt) *ast.BlockStmt { if !lp.trim(stmt) { return lp.emptyBlock(stmt) } stmt.Rbrace = stmt.Lbrace return stmt } func (lp *linePrinter) trimList(stmts []ast.Stmt) []ast.Stmt { for i := 0; i != len(stmts); i++ { if !lp.trim(stmts[i]) { stmts[i] = lp.emptyStmt(stmts[i]) break } } return stmts } func (lp *linePrinter) emptyStmt(n ast.Node) *ast.ExprStmt { return &ast.ExprStmt{&ast.Ellipsis{n.Pos(), nil}} } func (lp *linePrinter) emptyBlock(n ast.Node) *ast.BlockStmt { p := n.Pos() return &ast.BlockStmt{p, []ast.Stmt{lp.emptyStmt(n)}, p} } ================================================ FILE: vendor/gopkg.in/check.v1/reporter.go ================================================ package check import ( "fmt" "io" "sync" ) // ----------------------------------------------------------------------- // Output writer manages atomic output writing according to settings. type outputWriter struct { m sync.Mutex writer io.Writer wroteCallProblemLast bool Stream bool Verbose bool } func newOutputWriter(writer io.Writer, stream, verbose bool) *outputWriter { return &outputWriter{writer: writer, Stream: stream, Verbose: verbose} } func (ow *outputWriter) Write(content []byte) (n int, err error) { ow.m.Lock() n, err = ow.writer.Write(content) ow.m.Unlock() return } func (ow *outputWriter) WriteCallStarted(label string, c *C) { if ow.Stream { header := renderCallHeader(label, c, "", "\n") ow.m.Lock() ow.writer.Write([]byte(header)) ow.m.Unlock() } } func (ow *outputWriter) WriteCallProblem(label string, c *C) { var prefix string if !ow.Stream { prefix = "\n-----------------------------------" + "-----------------------------------\n" } header := renderCallHeader(label, c, prefix, "\n\n") ow.m.Lock() ow.wroteCallProblemLast = true ow.writer.Write([]byte(header)) if !ow.Stream { c.logb.WriteTo(ow.writer) } ow.m.Unlock() } func (ow *outputWriter) WriteCallSuccess(label string, c *C) { if ow.Stream || (ow.Verbose && c.kind == testKd) { // TODO Use a buffer here. var suffix string if c.reason != "" { suffix = " (" + c.reason + ")" } if c.status() == succeededSt { suffix += "\t" + c.timerString() } suffix += "\n" if ow.Stream { suffix += "\n" } header := renderCallHeader(label, c, "", suffix) ow.m.Lock() // Resist temptation of using line as prefix above due to race. if !ow.Stream && ow.wroteCallProblemLast { header = "\n-----------------------------------" + "-----------------------------------\n" + header } ow.wroteCallProblemLast = false ow.writer.Write([]byte(header)) ow.m.Unlock() } } func renderCallHeader(label string, c *C, prefix, suffix string) string { pc := c.method.PC() return fmt.Sprintf("%s%s: %s: %s%s", prefix, label, niceFuncPath(pc), niceFuncName(pc), suffix) } ================================================ FILE: vendor/gopkg.in/check.v1/run.go ================================================ package check import ( "bufio" "flag" "fmt" "os" "testing" "time" ) // ----------------------------------------------------------------------- // Test suite registry. var allSuites []interface{} // Suite registers the given value as a test suite to be run. Any methods // starting with the Test prefix in the given value will be considered as // a test method. func Suite(suite interface{}) interface{} { allSuites = append(allSuites, suite) return suite } // ----------------------------------------------------------------------- // Public running interface. var ( oldFilterFlag = flag.String("gocheck.f", "", "Regular expression selecting which tests and/or suites to run") oldVerboseFlag = flag.Bool("gocheck.v", false, "Verbose mode") oldStreamFlag = flag.Bool("gocheck.vv", false, "Super verbose mode (disables output caching)") oldBenchFlag = flag.Bool("gocheck.b", false, "Run benchmarks") oldBenchTime = flag.Duration("gocheck.btime", 1*time.Second, "approximate run time for each benchmark") oldListFlag = flag.Bool("gocheck.list", false, "List the names of all tests that will be run") oldWorkFlag = flag.Bool("gocheck.work", false, "Display and do not remove the test working directory") newFilterFlag = flag.String("check.f", "", "Regular expression selecting which tests and/or suites to run") newVerboseFlag = flag.Bool("check.v", false, "Verbose mode") newStreamFlag = flag.Bool("check.vv", false, "Super verbose mode (disables output caching)") newBenchFlag = flag.Bool("check.b", false, "Run benchmarks") newBenchTime = flag.Duration("check.btime", 1*time.Second, "approximate run time for each benchmark") newBenchMem = flag.Bool("check.bmem", false, "Report memory benchmarks") newListFlag = flag.Bool("check.list", false, "List the names of all tests that will be run") newWorkFlag = flag.Bool("check.work", false, "Display and do not remove the test working directory") ) // TestingT runs all test suites registered with the Suite function, // printing results to stdout, and reporting any failures back to // the "testing" package. func TestingT(testingT *testing.T) { benchTime := *newBenchTime if benchTime == 1*time.Second { benchTime = *oldBenchTime } conf := &RunConf{ Filter: *oldFilterFlag + *newFilterFlag, Verbose: *oldVerboseFlag || *newVerboseFlag, Stream: *oldStreamFlag || *newStreamFlag, Benchmark: *oldBenchFlag || *newBenchFlag, BenchmarkTime: benchTime, BenchmarkMem: *newBenchMem, KeepWorkDir: *oldWorkFlag || *newWorkFlag, } if *oldListFlag || *newListFlag { w := bufio.NewWriter(os.Stdout) for _, name := range ListAll(conf) { fmt.Fprintln(w, name) } w.Flush() return } result := RunAll(conf) println(result.String()) if !result.Passed() { testingT.Fail() } } // RunAll runs all test suites registered with the Suite function, using the // provided run configuration. func RunAll(runConf *RunConf) *Result { result := Result{} for _, suite := range allSuites { result.Add(Run(suite, runConf)) } return &result } // Run runs the provided test suite using the provided run configuration. func Run(suite interface{}, runConf *RunConf) *Result { runner := newSuiteRunner(suite, runConf) return runner.run() } // ListAll returns the names of all the test functions registered with the // Suite function that will be run with the provided run configuration. func ListAll(runConf *RunConf) []string { var names []string for _, suite := range allSuites { names = append(names, List(suite, runConf)...) } return names } // List returns the names of the test functions in the given // suite that will be run with the provided run configuration. func List(suite interface{}, runConf *RunConf) []string { var names []string runner := newSuiteRunner(suite, runConf) for _, t := range runner.tests { names = append(names, t.String()) } return names } // ----------------------------------------------------------------------- // Result methods. func (r *Result) Add(other *Result) { r.Succeeded += other.Succeeded r.Skipped += other.Skipped r.Failed += other.Failed r.Panicked += other.Panicked r.FixturePanicked += other.FixturePanicked r.ExpectedFailures += other.ExpectedFailures r.Missed += other.Missed if r.WorkDir != "" && other.WorkDir != "" { r.WorkDir += ":" + other.WorkDir } else if other.WorkDir != "" { r.WorkDir = other.WorkDir } } func (r *Result) Passed() bool { return (r.Failed == 0 && r.Panicked == 0 && r.FixturePanicked == 0 && r.Missed == 0 && r.RunError == nil) } func (r *Result) String() string { if r.RunError != nil { return "ERROR: " + r.RunError.Error() } var value string if r.Failed == 0 && r.Panicked == 0 && r.FixturePanicked == 0 && r.Missed == 0 { value = "OK: " } else { value = "OOPS: " } value += fmt.Sprintf("%d passed", r.Succeeded) if r.Skipped != 0 { value += fmt.Sprintf(", %d skipped", r.Skipped) } if r.ExpectedFailures != 0 { value += fmt.Sprintf(", %d expected failures", r.ExpectedFailures) } if r.Failed != 0 { value += fmt.Sprintf(", %d FAILED", r.Failed) } if r.Panicked != 0 { value += fmt.Sprintf(", %d PANICKED", r.Panicked) } if r.FixturePanicked != 0 { value += fmt.Sprintf(", %d FIXTURE-PANICKED", r.FixturePanicked) } if r.Missed != 0 { value += fmt.Sprintf(", %d MISSED", r.Missed) } if r.WorkDir != "" { value += "\nWORK=" + r.WorkDir } return value } ================================================ FILE: vendor/gopkg.in/karalabe/cookiejar.v2/LICENSE ================================================ Copyright (c) 2014 Péter Szilágyi. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Alternatively, the CookieJar toolbox may be used in accordance with the terms and conditions contained in a signed written agreement between you and the author(s). ================================================ FILE: vendor/gopkg.in/karalabe/cookiejar.v2/README.md ================================================ CookieJar - A contestant's toolbox ====================================== CookieJar is a small collection of common algorithms, data structures and library extensions that were deemed handy for computing competitions at one point or another. This toolbox is a work in progress for the time being. It may be lacking, and it may change drastically between commits (although every effort is made not to). You're welcome to use it, but it's your head on the line :) Installation ---------------- To get the package, execute: go get gopkg.in/karalabe/cookiejar.v2 To import this package, add the following line to your code: import "gopkg.in/karalabe/cookiejar.v2" For more details, see the [package documentation](http://godoc.org/gopkg.in/karalabe/cookiejar.v2). Contents ------------ Algorithms: - Graph - [Breadth First Search](http://godoc.org/gopkg.in/karalabe/cookiejar.v2/graph/bfs) - [Depth First Search](http://godoc.org/gopkg.in/karalabe/cookiejar.v2/graph/dfs) Data structures: - [Bag](http://godoc.org/gopkg.in/karalabe/cookiejar.v2/collections/bag) - [Deque](http://godoc.org/gopkg.in/karalabe/cookiejar.v2/collections/deque) - [Graph](http://godoc.org/gopkg.in/karalabe/cookiejar.v2/graph) - [Priority Queue](http://godoc.org/gopkg.in/karalabe/cookiejar.v2/collections/prque) - [Queue](http://godoc.org/gopkg.in/karalabe/cookiejar.v2/collections/queue) - [Set](http://godoc.org/gopkg.in/karalabe/cookiejar.v2/collections/set) - [Stack](http://godoc.org/gopkg.in/karalabe/cookiejar.v2/collections/stack) Extensions: - [fmt](http://godoc.org/gopkg.in/karalabe/cookiejar.v2/exts/fmtext) - `Scan` and `Fscan` for `int`, `float64`, `string` and lines - [math](http://godoc.org/gopkg.in/karalabe/cookiejar.v2/exts/mathext) - `Abs` for `int` - `Min` and `Max` for `int`, `big.Int` and `big.Rat` - `Sign` for `int` and `float64` - [os](http://godoc.org/gopkg.in/karalabe/cookiejar.v2/exts/osext) - `Open` and `Create` without error codes - [sort](http://godoc.org/gopkg.in/karalabe/cookiejar.v2/exts/sortext) - `Sort` and `Search` for `big.Int` and `big.Rat` - `Unique` for any `sort.Interface` Below are the performance results for the data structures and the complexity analysis for the algorithms. Performance --------------- Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz: ``` - bag - BenchmarkInsert 309 ns/op - BenchmarkRemove 197 ns/op - BenchmarkDo 28.1 ns/op - deque - BenchmarkPush 25.4 ns/op - BenchmarkPop 6.72 ns/op - prque - BenchmarkPush 171 ns/op - BenchmarkPop 947 ns/op - queue - BenchmarkPush 23.0 ns/op - BenchmarkPop 5.92 ns/op - set - BenchmarkInsert 259 ns/op - BenchmarkRemove 115 ns/op - BenchmarkDo 20.9 ns/op - stack - BenchmarkPush 16.4 ns/op - BenchmarkPop 6.45 ns/op ``` Complexity -------------- | Algorithm | Time complexity | Space complexity | |:---------:|:---------------:|:----------------:| | graph/bfs | O(E) | O(V) | | graph/dfs | O(E) | O(E) | Here be dragons :) ---------------------- ``` . _///_, . / ` ' '> ) o' __/_'> ( / _/ )_\'> ' "__/ /_/\_> ____/_/_/_/ /,---, _/ / "" /_/_/_/ /_(_(_(_ \ ( \_\_\\_ )\ \'__\_\_\_\__ ).\ //____|___\__) )_/ | _ \'___'_( /' \_ (-'\'___'_\ __,'_' __) \ \\___(_ __/.__,' ,((,-,__\ '", __\_/. __,' '"./_._._-' ``` ================================================ FILE: vendor/gopkg.in/karalabe/cookiejar.v2/collections/prque/prque.go ================================================ // CookieJar - A contestant's algorithm toolbox // Copyright (c) 2013 Peter Szilagyi. All rights reserved. // // CookieJar is dual licensed: use of this source code is governed by a BSD // license that can be found in the LICENSE file. Alternatively, the CookieJar // toolbox may be used in accordance with the terms and conditions contained // in a signed written agreement between you and the author(s). // Package prque implements a priority queue data structure supporting arbitrary // value types and float priorities. // // The reasoning behind using floats for the priorities vs. ints or interfaces // was larger flexibility without sacrificing too much performance or code // complexity. // // If you would like to use a min-priority queue, simply negate the priorities. // // Internally the queue is based on the standard heap package working on a // sortable version of the block based stack. package prque import ( "container/heap" ) // Priority queue data structure. type Prque struct { cont *sstack } // Creates a new priority queue. func New() *Prque { return &Prque{newSstack()} } // Pushes a value with a given priority into the queue, expanding if necessary. func (p *Prque) Push(data interface{}, priority float32) { heap.Push(p.cont, &item{data, priority}) } // Pops the value with the greates priority off the stack and returns it. // Currently no shrinking is done. func (p *Prque) Pop() (interface{}, float32) { item := heap.Pop(p.cont).(*item) return item.value, item.priority } // Pops only the item from the queue, dropping the associated priority value. func (p *Prque) PopItem() interface{} { return heap.Pop(p.cont).(*item).value } // Checks whether the priority queue is empty. func (p *Prque) Empty() bool { return p.cont.Len() == 0 } // Returns the number of element in the priority queue. func (p *Prque) Size() int { return p.cont.Len() } // Clears the contents of the priority queue. func (p *Prque) Reset() { *p = *New() } ================================================ FILE: vendor/gopkg.in/karalabe/cookiejar.v2/collections/prque/sstack.go ================================================ // CookieJar - A contestant's algorithm toolbox // Copyright (c) 2013 Peter Szilagyi. All rights reserved. // // CookieJar is dual licensed: use of this source code is governed by a BSD // license that can be found in the LICENSE file. Alternatively, the CookieJar // toolbox may be used in accordance with the terms and conditions contained // in a signed written agreement between you and the author(s). package prque // The size of a block of data const blockSize = 4096 // A prioritized item in the sorted stack. type item struct { value interface{} priority float32 } // Internal sortable stack data structure. Implements the Push and Pop ops for // the stack (heap) functionality and the Len, Less and Swap methods for the // sortability requirements of the heaps. type sstack struct { size int capacity int offset int blocks [][]*item active []*item } // Creates a new, empty stack. func newSstack() *sstack { result := new(sstack) result.active = make([]*item, blockSize) result.blocks = [][]*item{result.active} result.capacity = blockSize return result } // Pushes a value onto the stack, expanding it if necessary. Required by // heap.Interface. func (s *sstack) Push(data interface{}) { if s.size == s.capacity { s.active = make([]*item, blockSize) s.blocks = append(s.blocks, s.active) s.capacity += blockSize s.offset = 0 } else if s.offset == blockSize { s.active = s.blocks[s.size/blockSize] s.offset = 0 } s.active[s.offset] = data.(*item) s.offset++ s.size++ } // Pops a value off the stack and returns it. Currently no shrinking is done. // Required by heap.Interface. func (s *sstack) Pop() (res interface{}) { s.size-- s.offset-- if s.offset < 0 { s.offset = blockSize - 1 s.active = s.blocks[s.size/blockSize] } res, s.active[s.offset] = s.active[s.offset], nil return } // Returns the length of the stack. Required by sort.Interface. func (s *sstack) Len() int { return s.size } // Compares the priority of two elements of the stack (higher is first). // Required by sort.Interface. func (s *sstack) Less(i, j int) bool { return s.blocks[i/blockSize][i%blockSize].priority > s.blocks[j/blockSize][j%blockSize].priority } // Swaps two elements in the stack. Required by sort.Interface. func (s *sstack) Swap(i, j int) { ib, io, jb, jo := i/blockSize, i%blockSize, j/blockSize, j%blockSize s.blocks[ib][io], s.blocks[jb][jo] = s.blocks[jb][jo], s.blocks[ib][io] } // Resets the stack, effectively clearing its contents. func (s *sstack) Reset() { *s = *newSstack() } ================================================ FILE: vendor/gopkg.in/natefinch/npipe.v2/LICENSE.txt ================================================ The MIT License (MIT) Copyright (c) 2013 npipe authors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: vendor/gopkg.in/natefinch/npipe.v2/README.md ================================================ npipe [![Build status](https://ci.appveyor.com/api/projects/status/00vuepirsot29qwi)](https://ci.appveyor.com/project/natefinch/npipe) [![GoDoc](https://godoc.org/gopkg.in/natefinch/npipe.v2?status.svg)](https://godoc.org/gopkg.in/natefinch/npipe.v2) ===== Package npipe provides a pure Go wrapper around Windows named pipes. Windows named pipe documentation: http://msdn.microsoft.com/en-us/library/windows/desktop/aa365780 Note that the code lives at https://github.com/natefinch/npipe (v2 branch) but should be imported as gopkg.in/natefinch/npipe.v2 (the package name is still npipe). npipe provides an interface based on stdlib's net package, with Dial, Listen, and Accept functions, as well as associated implementations of net.Conn and net.Listener. It supports rpc over the connection. ### Notes * Deadlines for reading/writing to the connection are only functional in Windows Vista/Server 2008 and above, due to limitations with the Windows API. * The pipes support byte mode only (no support for message mode) ### Examples The Dial function connects a client to a named pipe: conn, err := npipe.Dial(`\\.\pipe\mypipename`) if err != nil { <handle error> } fmt.Fprintf(conn, "Hi server!\n") msg, err := bufio.NewReader(conn).ReadString('\n') ... The Listen function creates servers: ln, err := npipe.Listen(`\\.\pipe\mypipename`) if err != nil { // handle error } for { conn, err := ln.Accept() if err != nil { // handle error continue } go handleConnection(conn) } ## Variables ``` go var ErrClosed = PipeError{"Pipe has been closed.", false} ``` ErrClosed is the error returned by PipeListener.Accept when Close is called on the PipeListener. ## type PipeAddr ``` go type PipeAddr string ``` PipeAddr represents the address of a named pipe. ### func (PipeAddr) Network ``` go func (a PipeAddr) Network() string ``` Network returns the address's network name, "pipe". ### func (PipeAddr) String ``` go func (a PipeAddr) String() string ``` String returns the address of the pipe ## type PipeConn ``` go type PipeConn struct { // contains filtered or unexported fields } ``` PipeConn is the implementation of the net.Conn interface for named pipe connections. ### func Dial ``` go func Dial(address string) (*PipeConn, error) ``` Dial connects to a named pipe with the given address. If the specified pipe is not available, it will wait indefinitely for the pipe to become available. The address must be of the form \\.\\pipe\<name> for local pipes and \\<computer>\pipe\<name> for remote pipes. Dial will return a PipeError if you pass in a badly formatted pipe name. Examples: // local pipe conn, err := Dial(`\\.\pipe\mypipename`) // remote pipe conn, err := Dial(`\\othercomp\pipe\mypipename`) ### func DialTimeout ``` go func DialTimeout(address string, timeout time.Duration) (*PipeConn, error) ``` DialTimeout acts like Dial, but will time out after the duration of timeout ### func (\*PipeConn) Close ``` go func (c *PipeConn) Close() error ``` Close closes the connection. ### func (\*PipeConn) LocalAddr ``` go func (c *PipeConn) LocalAddr() net.Addr ``` LocalAddr returns the local network address. ### func (\*PipeConn) Read ``` go func (c *PipeConn) Read(b []byte) (int, error) ``` Read implements the net.Conn Read method. ### func (\*PipeConn) RemoteAddr ``` go func (c *PipeConn) RemoteAddr() net.Addr ``` RemoteAddr returns the remote network address. ### func (\*PipeConn) SetDeadline ``` go func (c *PipeConn) SetDeadline(t time.Time) error ``` SetDeadline implements the net.Conn SetDeadline method. Note that timeouts are only supported on Windows Vista/Server 2008 and above ### func (\*PipeConn) SetReadDeadline ``` go func (c *PipeConn) SetReadDeadline(t time.Time) error ``` SetReadDeadline implements the net.Conn SetReadDeadline method. Note that timeouts are only supported on Windows Vista/Server 2008 and above ### func (\*PipeConn) SetWriteDeadline ``` go func (c *PipeConn) SetWriteDeadline(t time.Time) error ``` SetWriteDeadline implements the net.Conn SetWriteDeadline method. Note that timeouts are only supported on Windows Vista/Server 2008 and above ### func (\*PipeConn) Write ``` go func (c *PipeConn) Write(b []byte) (int, error) ``` Write implements the net.Conn Write method. ## type PipeError ``` go type PipeError struct { // contains filtered or unexported fields } ``` PipeError is an error related to a call to a pipe ### func (PipeError) Error ``` go func (e PipeError) Error() string ``` Error implements the error interface ### func (PipeError) Temporary ``` go func (e PipeError) Temporary() bool ``` Temporary implements net.AddrError.Temporary() ### func (PipeError) Timeout ``` go func (e PipeError) Timeout() bool ``` Timeout implements net.AddrError.Timeout() ## type PipeListener ``` go type PipeListener struct { // contains filtered or unexported fields } ``` PipeListener is a named pipe listener. Clients should typically use variables of type net.Listener instead of assuming named pipe. ### func Listen ``` go func Listen(address string) (*PipeListener, error) ``` Listen returns a new PipeListener that will listen on a pipe with the given address. The address must be of the form \\.\pipe\<name> Listen will return a PipeError for an incorrectly formatted pipe name. ### func (\*PipeListener) Accept ``` go func (l *PipeListener) Accept() (net.Conn, error) ``` Accept implements the Accept method in the net.Listener interface; it waits for the next call and returns a generic net.Conn. ### func (\*PipeListener) AcceptPipe ``` go func (l *PipeListener) AcceptPipe() (*PipeConn, error) ``` AcceptPipe accepts the next incoming call and returns the new connection. ### func (\*PipeListener) Addr ``` go func (l *PipeListener) Addr() net.Addr ``` Addr returns the listener's network address, a PipeAddr. ### func (\*PipeListener) Close ``` go func (l *PipeListener) Close() error ``` Close stops listening on the address. Already Accepted connections are not closed. ================================================ FILE: vendor/gopkg.in/natefinch/npipe.v2/doc.go ================================================ // Copyright 2013 Nate Finch. All rights reserved. // Use of this source code is governed by an MIT-style // license that can be found in the LICENSE file. // Package npipe provides a pure Go wrapper around Windows named pipes. // // !! Note, this package is Windows-only. There is no code to compile on linux. // // Windows named pipe documentation: http://msdn.microsoft.com/en-us/library/windows/desktop/aa365780 // // Note that the code lives at https://github.com/natefinch/npipe (v2 branch) // but should be imported as gopkg.in/natefinch/npipe.v2 (the package name is // still npipe). // // npipe provides an interface based on stdlib's net package, with Dial, Listen, // and Accept functions, as well as associated implementations of net.Conn and // net.Listener. It supports rpc over the connection. // // Notes // // * Deadlines for reading/writing to the connection are only functional in Windows Vista/Server 2008 and above, due to limitations with the Windows API. // // * The pipes support byte mode only (no support for message mode) // // Examples // // The Dial function connects a client to a named pipe: // conn, err := npipe.Dial(`\\.\pipe\mypipename`) // if err != nil { // <handle error> // } // fmt.Fprintf(conn, "Hi server!\n") // msg, err := bufio.NewReader(conn).ReadString('\n') // ... // // The Listen function creates servers: // // ln, err := npipe.Listen(`\\.\pipe\mypipename`) // if err != nil { // // handle error // } // for { // conn, err := ln.Accept() // if err != nil { // // handle error // continue // } // go handleConnection(conn) // } package npipe ================================================ FILE: vendor/gopkg.in/natefinch/npipe.v2/npipe_windows.go ================================================ package npipe //sys createNamedPipe(name *uint16, openMode uint32, pipeMode uint32, maxInstances uint32, outBufSize uint32, inBufSize uint32, defaultTimeout uint32, sa *syscall.SecurityAttributes) (handle syscall.Handle, err error) [failretval==syscall.InvalidHandle] = CreateNamedPipeW //sys connectNamedPipe(handle syscall.Handle, overlapped *syscall.Overlapped) (err error) = ConnectNamedPipe //sys disconnectNamedPipe(handle syscall.Handle) (err error) = DisconnectNamedPipe //sys waitNamedPipe(name *uint16, timeout uint32) (err error) = WaitNamedPipeW //sys createEvent(sa *syscall.SecurityAttributes, manualReset bool, initialState bool, name *uint16) (handle syscall.Handle, err error) [failretval==syscall.InvalidHandle] = CreateEventW //sys getOverlappedResult(handle syscall.Handle, overlapped *syscall.Overlapped, transferred *uint32, wait bool) (err error) = GetOverlappedResult //sys cancelIoEx(handle syscall.Handle, overlapped *syscall.Overlapped) (err error) = CancelIoEx import ( "fmt" "io" "net" "sync" "syscall" "time" ) const ( // openMode pipe_access_duplex = 0x3 pipe_access_inbound = 0x1 pipe_access_outbound = 0x2 // openMode write flags file_flag_first_pipe_instance = 0x00080000 file_flag_write_through = 0x80000000 file_flag_overlapped = 0x40000000 // openMode ACL flags write_dac = 0x00040000 write_owner = 0x00080000 access_system_security = 0x01000000 // pipeMode pipe_type_byte = 0x0 pipe_type_message = 0x4 // pipeMode read mode flags pipe_readmode_byte = 0x0 pipe_readmode_message = 0x2 // pipeMode wait mode flags pipe_wait = 0x0 pipe_nowait = 0x1 // pipeMode remote-client mode flags pipe_accept_remote_clients = 0x0 pipe_reject_remote_clients = 0x8 pipe_unlimited_instances = 255 nmpwait_wait_forever = 0xFFFFFFFF // the two not-an-errors below occur if a client connects to the pipe between // the server's CreateNamedPipe and ConnectNamedPipe calls. error_no_data syscall.Errno = 0xE8 error_pipe_connected syscall.Errno = 0x217 error_pipe_busy syscall.Errno = 0xE7 error_sem_timeout syscall.Errno = 0x79 error_bad_pathname syscall.Errno = 0xA1 error_invalid_name syscall.Errno = 0x7B error_io_incomplete syscall.Errno = 0x3e4 ) var _ net.Conn = (*PipeConn)(nil) var _ net.Listener = (*PipeListener)(nil) // ErrClosed is the error returned by PipeListener.Accept when Close is called // on the PipeListener. var ErrClosed = PipeError{"Pipe has been closed.", false} // PipeError is an error related to a call to a pipe type PipeError struct { msg string timeout bool } // Error implements the error interface func (e PipeError) Error() string { return e.msg } // Timeout implements net.AddrError.Timeout() func (e PipeError) Timeout() bool { return e.timeout } // Temporary implements net.AddrError.Temporary() func (e PipeError) Temporary() bool { return false } // Dial connects to a named pipe with the given address. If the specified pipe is not available, // it will wait indefinitely for the pipe to become available. // // The address must be of the form \\.\\pipe\<name> for local pipes and \\<computer>\pipe\<name> // for remote pipes. // // Dial will return a PipeError if you pass in a badly formatted pipe name. // // Examples: // // local pipe // conn, err := Dial(`\\.\pipe\mypipename`) // // // remote pipe // conn, err := Dial(`\\othercomp\pipe\mypipename`) func Dial(address string) (*PipeConn, error) { for { conn, err := dial(address, nmpwait_wait_forever) if err == nil { return conn, nil } if isPipeNotReady(err) { <-time.After(100 * time.Millisecond) continue } return nil, err } } // DialTimeout acts like Dial, but will time out after the duration of timeout func DialTimeout(address string, timeout time.Duration) (*PipeConn, error) { deadline := time.Now().Add(timeout) now := time.Now() for now.Before(deadline) { millis := uint32(deadline.Sub(now) / time.Millisecond) conn, err := dial(address, millis) if err == nil { return conn, nil } if err == error_sem_timeout { // This is WaitNamedPipe's timeout error, so we know we're done return nil, PipeError{fmt.Sprintf( "Timed out waiting for pipe '%s' to come available", address), true} } if isPipeNotReady(err) { left := deadline.Sub(time.Now()) retry := 100 * time.Millisecond if left > retry { <-time.After(retry) } else { <-time.After(left - time.Millisecond) } now = time.Now() continue } return nil, err } return nil, PipeError{fmt.Sprintf( "Timed out waiting for pipe '%s' to come available", address), true} } // isPipeNotReady checks the error to see if it indicates the pipe is not ready func isPipeNotReady(err error) bool { // Pipe Busy means another client just grabbed the open pipe end, // and the server hasn't made a new one yet. // File Not Found means the server hasn't created the pipe yet. // Neither is a fatal error. return err == syscall.ERROR_FILE_NOT_FOUND || err == error_pipe_busy } // newOverlapped creates a structure used to track asynchronous // I/O requests that have been issued. func newOverlapped() (*syscall.Overlapped, error) { event, err := createEvent(nil, true, true, nil) if err != nil { return nil, err } return &syscall.Overlapped{HEvent: event}, nil } // waitForCompletion waits for an asynchronous I/O request referred to by overlapped to complete. // This function returns the number of bytes transferred by the operation and an error code if // applicable (nil otherwise). func waitForCompletion(handle syscall.Handle, overlapped *syscall.Overlapped) (uint32, error) { _, err := syscall.WaitForSingleObject(overlapped.HEvent, syscall.INFINITE) if err != nil { return 0, err } var transferred uint32 err = getOverlappedResult(handle, overlapped, &transferred, true) return transferred, err } // dial is a helper to initiate a connection to a named pipe that has been started by a server. // The timeout is only enforced if the pipe server has already created the pipe, otherwise // this function will return immediately. func dial(address string, timeout uint32) (*PipeConn, error) { name, err := syscall.UTF16PtrFromString(string(address)) if err != nil { return nil, err } // If at least one instance of the pipe has been created, this function // will wait timeout milliseconds for it to become available. // It will return immediately regardless of timeout, if no instances // of the named pipe have been created yet. // If this returns with no error, there is a pipe available. if err := waitNamedPipe(name, timeout); err != nil { if err == error_bad_pathname { // badly formatted pipe name return nil, badAddr(address) } return nil, err } pathp, err := syscall.UTF16PtrFromString(address) if err != nil { return nil, err } handle, err := syscall.CreateFile(pathp, syscall.GENERIC_READ|syscall.GENERIC_WRITE, uint32(syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE), nil, syscall.OPEN_EXISTING, syscall.FILE_FLAG_OVERLAPPED, 0) if err != nil { return nil, err } return &PipeConn{handle: handle, addr: PipeAddr(address)}, nil } // Listen returns a new PipeListener that will listen on a pipe with the given // address. The address must be of the form \\.\pipe\<name> // // Listen will return a PipeError for an incorrectly formatted pipe name. func Listen(address string) (*PipeListener, error) { handle, err := createPipe(address, true) if err == error_invalid_name { return nil, badAddr(address) } if err != nil { return nil, err } return &PipeListener{ addr: PipeAddr(address), handle: handle, }, nil } // PipeListener is a named pipe listener. Clients should typically // use variables of type net.Listener instead of assuming named pipe. type PipeListener struct { mu sync.Mutex addr PipeAddr handle syscall.Handle closed bool // acceptHandle contains the current handle waiting for // an incoming connection or nil. acceptHandle syscall.Handle // acceptOverlapped is set before waiting on a connection. // If not waiting, it is nil. acceptOverlapped *syscall.Overlapped } // Accept implements the Accept method in the net.Listener interface; it // waits for the next call and returns a generic net.Conn. func (l *PipeListener) Accept() (net.Conn, error) { c, err := l.AcceptPipe() for err == error_no_data { // Ignore clients that connect and immediately disconnect. c, err = l.AcceptPipe() } if err != nil { return nil, err } return c, nil } // AcceptPipe accepts the next incoming call and returns the new connection. // It might return an error if a client connected and immediately cancelled // the connection. func (l *PipeListener) AcceptPipe() (*PipeConn, error) { if l == nil { return nil, syscall.EINVAL } l.mu.Lock() defer l.mu.Unlock() if l.addr == "" || l.closed { return nil, syscall.EINVAL } // the first time we call accept, the handle will have been created by the Listen // call. This is to prevent race conditions where the client thinks the server // isn't listening because it hasn't actually called create yet. After the first time, we'll // have to create a new handle each time handle := l.handle if handle == 0 { var err error handle, err = createPipe(string(l.addr), false) if err != nil { return nil, err } } else { l.handle = 0 } overlapped, err := newOverlapped() if err != nil { return nil, err } defer syscall.CloseHandle(overlapped.HEvent) err = connectNamedPipe(handle, overlapped) if err == nil || err == error_pipe_connected { return &PipeConn{handle: handle, addr: l.addr}, nil } if err == error_io_incomplete || err == syscall.ERROR_IO_PENDING { l.acceptOverlapped = overlapped l.acceptHandle = handle // unlock here so close can function correctly while we wait (we'll // get relocked via the defer below, before the original defer // unlock happens.) l.mu.Unlock() defer func() { l.mu.Lock() l.acceptOverlapped = nil l.acceptHandle = 0 // unlock is via defer above. }() _, err = waitForCompletion(handle, overlapped) } if err == syscall.ERROR_OPERATION_ABORTED { // Return error compatible to net.Listener.Accept() in case the // listener was closed. return nil, ErrClosed } if err != nil { return nil, err } return &PipeConn{handle: handle, addr: l.addr}, nil } // Close stops listening on the address. // Already Accepted connections are not closed. func (l *PipeListener) Close() error { l.mu.Lock() defer l.mu.Unlock() if l.closed { return nil } l.closed = true if l.handle != 0 { err := disconnectNamedPipe(l.handle) if err != nil { return err } err = syscall.CloseHandle(l.handle) if err != nil { return err } l.handle = 0 } if l.acceptOverlapped != nil && l.acceptHandle != 0 { // Cancel the pending IO. This call does not block, so it is safe // to hold onto the mutex above. if err := cancelIoEx(l.acceptHandle, l.acceptOverlapped); err != nil { return err } err := syscall.CloseHandle(l.acceptOverlapped.HEvent) if err != nil { return err } l.acceptOverlapped.HEvent = 0 err = syscall.CloseHandle(l.acceptHandle) if err != nil { return err } l.acceptHandle = 0 } return nil } // Addr returns the listener's network address, a PipeAddr. func (l *PipeListener) Addr() net.Addr { return l.addr } // PipeConn is the implementation of the net.Conn interface for named pipe connections. type PipeConn struct { handle syscall.Handle addr PipeAddr // these aren't actually used yet readDeadline *time.Time writeDeadline *time.Time } type iodata struct { n uint32 err error } // completeRequest looks at iodata to see if a request is pending. If so, it waits for it to either complete or to // abort due to hitting the specified deadline. Deadline may be set to nil to wait forever. If no request is pending, // the content of iodata is returned. func (c *PipeConn) completeRequest(data iodata, deadline *time.Time, overlapped *syscall.Overlapped) (int, error) { if data.err == error_io_incomplete || data.err == syscall.ERROR_IO_PENDING { var timer <-chan time.Time if deadline != nil { if timeDiff := deadline.Sub(time.Now()); timeDiff > 0 { timer = time.After(timeDiff) } } done := make(chan iodata) go func() { n, err := waitForCompletion(c.handle, overlapped) done <- iodata{n, err} }() select { case data = <-done: case <-timer: syscall.CancelIoEx(c.handle, overlapped) data = iodata{0, timeout(c.addr.String())} } } // Windows will produce ERROR_BROKEN_PIPE upon closing // a handle on the other end of a connection. Go RPC // expects an io.EOF error in this case. if data.err == syscall.ERROR_BROKEN_PIPE { data.err = io.EOF } return int(data.n), data.err } // Read implements the net.Conn Read method. func (c *PipeConn) Read(b []byte) (int, error) { // Use ReadFile() rather than Read() because the latter // contains a workaround that eats ERROR_BROKEN_PIPE. overlapped, err := newOverlapped() if err != nil { return 0, err } defer syscall.CloseHandle(overlapped.HEvent) var n uint32 err = syscall.ReadFile(c.handle, b, &n, overlapped) return c.completeRequest(iodata{n, err}, c.readDeadline, overlapped) } // Write implements the net.Conn Write method. func (c *PipeConn) Write(b []byte) (int, error) { overlapped, err := newOverlapped() if err != nil { return 0, err } defer syscall.CloseHandle(overlapped.HEvent) var n uint32 err = syscall.WriteFile(c.handle, b, &n, overlapped) return c.completeRequest(iodata{n, err}, c.writeDeadline, overlapped) } // Close closes the connection. func (c *PipeConn) Close() error { return syscall.CloseHandle(c.handle) } // LocalAddr returns the local network address. func (c *PipeConn) LocalAddr() net.Addr { return c.addr } // RemoteAddr returns the remote network address. func (c *PipeConn) RemoteAddr() net.Addr { // not sure what to do here, we don't have remote addr.... return c.addr } // SetDeadline implements the net.Conn SetDeadline method. // Note that timeouts are only supported on Windows Vista/Server 2008 and above func (c *PipeConn) SetDeadline(t time.Time) error { c.SetReadDeadline(t) c.SetWriteDeadline(t) return nil } // SetReadDeadline implements the net.Conn SetReadDeadline method. // Note that timeouts are only supported on Windows Vista/Server 2008 and above func (c *PipeConn) SetReadDeadline(t time.Time) error { c.readDeadline = &t return nil } // SetWriteDeadline implements the net.Conn SetWriteDeadline method. // Note that timeouts are only supported on Windows Vista/Server 2008 and above func (c *PipeConn) SetWriteDeadline(t time.Time) error { c.writeDeadline = &t return nil } // PipeAddr represents the address of a named pipe. type PipeAddr string // Network returns the address's network name, "pipe". func (a PipeAddr) Network() string { return "pipe" } // String returns the address of the pipe func (a PipeAddr) String() string { return string(a) } // createPipe is a helper function to make sure we always create pipes // with the same arguments, since subsequent calls to create pipe need // to use the same arguments as the first one. If first is set, fail // if the pipe already exists. func createPipe(address string, first bool) (syscall.Handle, error) { n, err := syscall.UTF16PtrFromString(address) if err != nil { return 0, err } mode := uint32(pipe_access_duplex | syscall.FILE_FLAG_OVERLAPPED) if first { mode |= file_flag_first_pipe_instance } return createNamedPipe(n, mode, pipe_type_byte, pipe_unlimited_instances, 512, 512, 0, nil) } func badAddr(addr string) PipeError { return PipeError{fmt.Sprintf("Invalid pipe address '%s'.", addr), false} } func timeout(addr string) PipeError { return PipeError{fmt.Sprintf("Pipe IO timed out waiting for '%s'", addr), true} } ================================================ FILE: vendor/gopkg.in/natefinch/npipe.v2/znpipe_windows_386.go ================================================ // +build windows // go build mksyscall_windows.go && ./mksyscall_windows npipe_windows.go // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT package npipe import "unsafe" import "syscall" var ( modkernel32 = syscall.NewLazyDLL("kernel32.dll") procCreateNamedPipeW = modkernel32.NewProc("CreateNamedPipeW") procConnectNamedPipe = modkernel32.NewProc("ConnectNamedPipe") procDisconnectNamedPipe = modkernel32.NewProc("DisconnectNamedPipe") procWaitNamedPipeW = modkernel32.NewProc("WaitNamedPipeW") procCreateEventW = modkernel32.NewProc("CreateEventW") procGetOverlappedResult = modkernel32.NewProc("GetOverlappedResult") procCancelIoEx = modkernel32.NewProc("CancelIoEx") ) func createNamedPipe(name *uint16, openMode uint32, pipeMode uint32, maxInstances uint32, outBufSize uint32, inBufSize uint32, defaultTimeout uint32, sa *syscall.SecurityAttributes) (handle syscall.Handle, err error) { r0, _, e1 := syscall.Syscall9(procCreateNamedPipeW.Addr(), 8, uintptr(unsafe.Pointer(name)), uintptr(openMode), uintptr(pipeMode), uintptr(maxInstances), uintptr(outBufSize), uintptr(inBufSize), uintptr(defaultTimeout), uintptr(unsafe.Pointer(sa)), 0) handle = syscall.Handle(r0) if handle == syscall.InvalidHandle { if e1 != 0 { err = error(e1) } else { err = syscall.EINVAL } } return } func cancelIoEx(handle syscall.Handle, overlapped *syscall.Overlapped) (err error) { r1, _, e1 := syscall.Syscall(procCancelIoEx.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(overlapped)), 0) if r1 == 0 { if e1 != 0 { err = error(e1) } else { err = syscall.EINVAL } } return } func connectNamedPipe(handle syscall.Handle, overlapped *syscall.Overlapped) (err error) { r1, _, e1 := syscall.Syscall(procConnectNamedPipe.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(overlapped)), 0) if r1 == 0 { if e1 != 0 { err = error(e1) } else { err = syscall.EINVAL } } return } func disconnectNamedPipe(handle syscall.Handle) (err error) { r1, _, e1 := syscall.Syscall(procDisconnectNamedPipe.Addr(), 1, uintptr(handle), 0, 0) if r1 == 0 { if e1 != 0 { err = error(e1) } else { err = syscall.EINVAL } } return } func waitNamedPipe(name *uint16, timeout uint32) (err error) { r1, _, e1 := syscall.Syscall(procWaitNamedPipeW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(timeout), 0) if r1 == 0 { if e1 != 0 { err = error(e1) } else { err = syscall.EINVAL } } return } func createEvent(sa *syscall.SecurityAttributes, manualReset bool, initialState bool, name *uint16) (handle syscall.Handle, err error) { var _p0 uint32 if manualReset { _p0 = 1 } else { _p0 = 0 } var _p1 uint32 if initialState { _p1 = 1 } else { _p1 = 0 } r0, _, e1 := syscall.Syscall6(procCreateEventW.Addr(), 4, uintptr(unsafe.Pointer(sa)), uintptr(_p0), uintptr(_p1), uintptr(unsafe.Pointer(name)), 0, 0) handle = syscall.Handle(r0) if handle == syscall.InvalidHandle { if e1 != 0 { err = error(e1) } else { err = syscall.EINVAL } } return } func getOverlappedResult(handle syscall.Handle, overlapped *syscall.Overlapped, transferred *uint32, wait bool) (err error) { var _p0 uint32 if wait { _p0 = 1 } else { _p0 = 0 } r1, _, e1 := syscall.Syscall6(procGetOverlappedResult.Addr(), 4, uintptr(handle), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(transferred)), uintptr(_p0), 0, 0) if r1 == 0 { if e1 != 0 { err = error(e1) } else { err = syscall.EINVAL } } return } ================================================ FILE: vendor/gopkg.in/natefinch/npipe.v2/znpipe_windows_amd64.go ================================================ // +build windows // go build mksyscall_windows.go && ./mksyscall_windows npipe_windows.go // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT package npipe import "unsafe" import "syscall" var ( modkernel32 = syscall.NewLazyDLL("kernel32.dll") procCreateNamedPipeW = modkernel32.NewProc("CreateNamedPipeW") procConnectNamedPipe = modkernel32.NewProc("ConnectNamedPipe") procDisconnectNamedPipe = modkernel32.NewProc("DisconnectNamedPipe") procWaitNamedPipeW = modkernel32.NewProc("WaitNamedPipeW") procCreateEventW = modkernel32.NewProc("CreateEventW") procGetOverlappedResult = modkernel32.NewProc("GetOverlappedResult") procCancelIoEx = modkernel32.NewProc("CancelIoEx") ) func createNamedPipe(name *uint16, openMode uint32, pipeMode uint32, maxInstances uint32, outBufSize uint32, inBufSize uint32, defaultTimeout uint32, sa *syscall.SecurityAttributes) (handle syscall.Handle, err error) { r0, _, e1 := syscall.Syscall9(procCreateNamedPipeW.Addr(), 8, uintptr(unsafe.Pointer(name)), uintptr(openMode), uintptr(pipeMode), uintptr(maxInstances), uintptr(outBufSize), uintptr(inBufSize), uintptr(defaultTimeout), uintptr(unsafe.Pointer(sa)), 0) handle = syscall.Handle(r0) if handle == syscall.InvalidHandle { if e1 != 0 { err = error(e1) } else { err = syscall.EINVAL } } return } func cancelIoEx(handle syscall.Handle, overlapped *syscall.Overlapped) (err error) { r1, _, e1 := syscall.Syscall(procCancelIoEx.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(overlapped)), 0) if r1 == 0 { if e1 != 0 { err = error(e1) } else { err = syscall.EINVAL } } return } func connectNamedPipe(handle syscall.Handle, overlapped *syscall.Overlapped) (err error) { r1, _, e1 := syscall.Syscall(procConnectNamedPipe.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(overlapped)), 0) if r1 == 0 { if e1 != 0 { err = error(e1) } else { err = syscall.EINVAL } } return } func disconnectNamedPipe(handle syscall.Handle) (err error) { r1, _, e1 := syscall.Syscall(procDisconnectNamedPipe.Addr(), 1, uintptr(handle), 0, 0) if r1 == 0 { if e1 != 0 { err = error(e1) } else { err = syscall.EINVAL } } return } func waitNamedPipe(name *uint16, timeout uint32) (err error) { r1, _, e1 := syscall.Syscall(procWaitNamedPipeW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(timeout), 0) if r1 == 0 { if e1 != 0 { err = error(e1) } else { err = syscall.EINVAL } } return } func createEvent(sa *syscall.SecurityAttributes, manualReset bool, initialState bool, name *uint16) (handle syscall.Handle, err error) { var _p0 uint32 if manualReset { _p0 = 1 } else { _p0 = 0 } var _p1 uint32 if initialState { _p1 = 1 } else { _p1 = 0 } r0, _, e1 := syscall.Syscall6(procCreateEventW.Addr(), 4, uintptr(unsafe.Pointer(sa)), uintptr(_p0), uintptr(_p1), uintptr(unsafe.Pointer(name)), 0, 0) handle = syscall.Handle(r0) if handle == syscall.InvalidHandle { if e1 != 0 { err = error(e1) } else { err = syscall.EINVAL } } return } func getOverlappedResult(handle syscall.Handle, overlapped *syscall.Overlapped, transferred *uint32, wait bool) (err error) { var _p0 uint32 if wait { _p0 = 1 } else { _p0 = 0 } r1, _, e1 := syscall.Syscall6(procGetOverlappedResult.Addr(), 4, uintptr(handle), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(transferred)), uintptr(_p0), 0, 0) if r1 == 0 { if e1 != 0 { err = error(e1) } else { err = syscall.EINVAL } } return } ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/Gopkg.toml ================================================ [[constraint]] branch = "v1" name = "gopkg.in/check.v1" ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/LICENSE.md ================================================ The MIT License (MIT) Copyright (c) 2015 Oleg Lebedev Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/README.md ================================================ # Duktape bindings for Go(Golang) [![wercker status](https://app.wercker.com/status/3a5bb2e639a4b4efaf4c8bf7cab7442d/s "wercker status")](https://app.wercker.com/project/bykey/3a5bb2e639a4b4efaf4c8bf7cab7442d) [![Travis status](https://travis-ci.org/olebedev/go-duktape.svg?branch=v3)](https://travis-ci.org/olebedev/go-duktape) [![Appveyor status](https://ci.appveyor.com/api/projects/status/github/olebedev/go-duktape?branch=v3&svg=true)](https://ci.appveyor.com/project/olebedev/go-duktape/branch/v3) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/olebedev/go-duktape?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [Duktape](http://duktape.org/index.html) is a thin, embeddable javascript engine. Most of the [api](http://duktape.org/api.html) is implemented. The exceptions are listed [here](https://github.com/olebedev/go-duktape/blob/master/api.go#L1566). ### Usage The package is fully go-getable, no need to install any external C libraries. So, just type `go get gopkg.in/olebedev/go-duktape.v3` to install. ```go package main import "fmt" import "gopkg.in/olebedev/go-duktape.v3" func main() { ctx := duktape.New() ctx.PevalString(`2 + 3`) result := ctx.GetNumber(-1) ctx.Pop() fmt.Println("result is:", result) // To prevent memory leaks, don't forget to clean up after // yourself when you're done using a context. ctx.DestroyHeap() } ``` ### Go specific notes Bindings between Go and Javascript contexts are not fully functional. However, binding a Go function to the Javascript context is available: ```go package main import "fmt" import "gopkg.in/olebedev/go-duktape.v3" func main() { ctx := duktape.New() ctx.PushGlobalGoFunction("log", func(c *duktape.Context) int { fmt.Println(c.SafeToString(-1)) return 0 }) ctx.PevalString(`log('Go lang Go!')`) } ``` then run it. ```bash $ go run *.go Go lang Go! $ ``` ### Timers There is a method to inject timers to the global scope: ```go package main import "fmt" import "gopkg.in/olebedev/go-duktape.v3" func main() { ctx := duktape.New() // Let's inject `setTimeout`, `setInterval`, `clearTimeout`, // `clearInterval` into global scope. ctx.PushTimers() ch := make(chan string) ctx.PushGlobalGoFunction("second", func(_ *Context) int { ch <- "second step" return 0 }) ctx.PevalString(` setTimeout(second, 0); print('first step'); `) fmt.Println(<-ch) } ``` then run it ```bash $ go run *.go first step second step $ ``` Also you can `FlushTimers()`. ### Command line tool Install `go get gopkg.in/olebedev/go-duktape.v3/...`. Execute file.js: `$GOPATH/bin/go-duk file.js`. ### Benchmarks | prog | time | | ------------|-------| |[otto](https://github.com/robertkrimen/otto)|200.13s| |[anko](https://github.com/mattn/anko)|231.19s| |[agora](https://github.com/PuerkitoBio/agora/)|149.33s| |[GopherLua](https://github.com/yuin/gopher-lua/)|8.39s| |**go-duktape**|**9.80s**| More details are [here](https://github.com/olebedev/go-duktape/wiki/Benchmarks). ### Status The package is not fully tested, so be careful. ### Contribution Pull requests are welcome! Also, if you want to discuss something send a pull request with proposal and changes. __Convention:__ fork the repository and make changes on your fork in a feature branch. ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/api.go ================================================ package duktape /* #cgo !windows CFLAGS: -std=c99 -O3 -Wall -Wno-unused-value -fomit-frame-pointer -fstrict-aliasing #cgo windows CFLAGS: -O3 -Wall -Wno-unused-value -fomit-frame-pointer -fstrict-aliasing #include "duktape.h" #include "duk_logging.h" #include "duk_v1_compat.h" #include "duk_print_alert.h" static void _duk_eval_string(duk_context *ctx, const char *str) { duk_eval_string(ctx, str); } static void _duk_compile(duk_context *ctx, duk_uint_t flags) { duk_compile(ctx, flags); } static void _duk_compile_file(duk_context *ctx, duk_uint_t flags, const char *path) { duk_compile_file(ctx, flags, path); } static void _duk_compile_lstring(duk_context *ctx, duk_uint_t flags, const char *src, duk_size_t len) { duk_compile_lstring(ctx, flags, src, len); } static void _duk_compile_lstring_filename(duk_context *ctx, duk_uint_t flags, const char *src, duk_size_t len) { duk_compile_lstring_filename(ctx, flags, src, len); } static void _duk_compile_string(duk_context *ctx, duk_uint_t flags, const char *src) { duk_compile_string(ctx, flags, src); } static void _duk_compile_string_filename(duk_context *ctx, duk_uint_t flags, const char *src) { duk_compile_string_filename(ctx, flags, src); } static void _duk_dump_context_stderr(duk_context *ctx) { duk_dump_context_stderr(ctx); } static void _duk_dump_context_stdout(duk_context *ctx) { duk_dump_context_stdout(ctx); } static void _duk_eval(duk_context *ctx) { duk_eval(ctx); } static void _duk_eval_file(duk_context *ctx, const char *path) { duk_eval_file(ctx, path); } static void _duk_eval_file_noresult(duk_context *ctx, const char *path) { duk_eval_file_noresult(ctx, path); } static void _duk_eval_lstring(duk_context *ctx, const char *src, duk_size_t len) { duk_eval_lstring(ctx, src, len); } static void _duk_eval_lstring_noresult(duk_context *ctx, const char *src, duk_size_t len) { duk_eval_lstring_noresult(ctx, src, len); } static void _duk_eval_noresult(duk_context *ctx) { duk_eval_noresult(ctx); } static void _duk_eval_string_noresult(duk_context *ctx, const char *src) { duk_eval_string_noresult(ctx, src); } static duk_bool_t _duk_is_error(duk_context *ctx, duk_idx_t index) { return duk_is_error(ctx, index); } static duk_bool_t _duk_is_object_coercible(duk_context *ctx, duk_idx_t index) { return duk_is_object_coercible(ctx, index); } static duk_int_t _duk_pcompile(duk_context *ctx, duk_uint_t flags) { return duk_pcompile(ctx, flags); } static duk_int_t _duk_pcompile_file(duk_context *ctx, duk_uint_t flags, const char *path) { return duk_pcompile_file(ctx, flags, path); } static duk_int_t _duk_pcompile_lstring(duk_context *ctx, duk_uint_t flags, const char *src, duk_size_t len) { return duk_pcompile_lstring(ctx, flags, src, len); } static duk_int_t _duk_pcompile_lstring_filename(duk_context *ctx, duk_uint_t flags, const char *src, duk_size_t len) { return duk_pcompile_lstring_filename(ctx, flags, src, len); } static duk_int_t _duk_pcompile_string(duk_context *ctx, duk_uint_t flags, const char *src) { return duk_pcompile_string(ctx, flags, src); } static duk_int_t _duk_pcompile_string_filename(duk_context *ctx, duk_uint_t flags, const char *src) { return duk_pcompile_string_filename(ctx, flags, src); } static duk_int_t _duk_peval(duk_context *ctx) { return duk_peval(ctx); } static duk_int_t _duk_peval_file(duk_context *ctx, const char *path) { return duk_peval_file(ctx, path); } static duk_int_t _duk_peval_file_noresult(duk_context *ctx, const char *path) { return duk_peval_file_noresult(ctx, path); } static duk_int_t _duk_peval_lstring(duk_context *ctx, const char *src, duk_size_t len) { return duk_peval_lstring(ctx, src, len); } static duk_int_t _duk_peval_lstring_noresult(duk_context *ctx, const char *src, duk_size_t len) { return duk_peval_lstring_noresult(ctx, src, len); } static duk_int_t _duk_peval_noresult(duk_context *ctx) { return duk_peval_noresult(ctx); } static duk_int_t _duk_peval_string(duk_context *ctx, const char *src) { return duk_peval_string(ctx, src); } static duk_int_t _duk_peval_string_noresult(duk_context *ctx, const char *src) { return duk_peval_string_noresult(ctx, src); } static const char *_duk_push_string_file(duk_context *ctx, const char *path) { return duk_push_string_file(ctx, path); } static duk_idx_t _duk_push_thread(duk_context *ctx) { return duk_push_thread(ctx); } static duk_idx_t _duk_push_thread_new_globalenv(duk_context *ctx) { return duk_push_thread_new_globalenv(ctx); } static void _duk_require_object_coercible(duk_context *ctx, duk_idx_t index) { duk_require_object_coercible(ctx, index); } static void _duk_require_type_mask(duk_context *ctx, duk_idx_t index, duk_uint_t mask) { duk_require_type_mask(ctx, index, mask); } static const char *_duk_safe_to_string(duk_context *ctx, duk_idx_t index) { return duk_safe_to_string(ctx, index); } static void _duk_xcopy_top(duk_context *to_ctx, duk_context *from_ctx, duk_idx_t count) { duk_xcopy_top(to_ctx, from_ctx, count); } static void _duk_xmove_top(duk_context *to_ctx, duk_context *from_ctx, duk_idx_t count) { duk_xmove_top(to_ctx, from_ctx, count); } static void *_duk_to_buffer(duk_context *ctx, duk_idx_t index, duk_size_t *out_size) { return duk_to_buffer(ctx, index, out_size); } static void *_duk_to_dynamic_buffer(duk_context *ctx, duk_idx_t index, duk_size_t *out_size) { return duk_to_dynamic_buffer(ctx, index, out_size); } static void *_duk_to_fixed_buffer(duk_context *ctx, duk_idx_t index, duk_size_t *out_size) { return duk_to_fixed_buffer(ctx, index, out_size); } static duk_int_t _duk_is_primitive(duk_context *ctx, duk_idx_t index) { return duk_is_primitive(ctx, index); } static void *_duk_push_buffer(duk_context *ctx, duk_size_t size, duk_bool_t dynamic) { return duk_push_buffer(ctx, size, dynamic); } static void *_duk_push_fixed_buffer(duk_context *ctx, duk_size_t size) { return duk_push_fixed_buffer(ctx, size); } static void *_duk_push_dynamic_buffer(duk_context *ctx, duk_size_t size) { return duk_push_dynamic_buffer(ctx, size); } static void _duk_error(duk_context *ctx, duk_errcode_t err_code, const char *str) { duk_error(ctx, err_code, "%s", str); } static void _duk_push_error_object(duk_context *ctx, duk_errcode_t err_code, const char *str) { duk_push_error_object(ctx, err_code, "%s", str); } static void _duk_error_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *text) { duk_error_raw(ctx, err_code, filename, line, text); } static void _duk_log(duk_context *ctx, duk_int_t level, const char *str) { duk_log(ctx, level, "%s", str); } static void _duk_push_external_buffer(duk_context *ctx) { duk_push_external_buffer(ctx); } */ import "C" import ( "fmt" "unsafe" ) // See: http://duktape.org/api.html#duk_alloc func (d *Context) Alloc(size int) unsafe.Pointer { return C.duk_alloc(d.duk_context, C.duk_size_t(size)) } // See: http://duktape.org/api.html#duk_alloc_raw func (d *Context) AllocRaw(size int) unsafe.Pointer { return C.duk_alloc_raw(d.duk_context, C.duk_size_t(size)) } // See: http://duktape.org/api.html#duk_base64_decode func (d *Context) Base64Decode(index int) { C.duk_base64_decode(d.duk_context, C.duk_idx_t(index)) } // See: http://duktape.org/api.html#duk_base64_encode func (d *Context) Base64Encode(index int) string { if s := C.duk_base64_encode(d.duk_context, C.duk_idx_t(index)); s != nil { return C.GoString(s) } return "" } // See: http://duktape.org/api.html#duk_call func (d *Context) Call(nargs int) { C.duk_call(d.duk_context, C.duk_idx_t(nargs)) } // See: http://duktape.org/api.html#duk_call_method func (d *Context) CallMethod(nargs int) { C.duk_call_method(d.duk_context, C.duk_idx_t(nargs)) } // See: http://duktape.org/api.html#duk_call_prop func (d *Context) CallProp(objIndex int, nargs int) { C.duk_call_prop(d.duk_context, C.duk_idx_t(objIndex), C.duk_idx_t(nargs)) } // See: http://duktape.org/api.html#duk_check_stack func (d *Context) CheckStack(extra int) bool { return int(C.duk_check_stack(d.duk_context, C.duk_idx_t(extra))) == 1 } // See: http://duktape.org/api.html#duk_check_stack_top func (d *Context) CheckStackTop(top int) bool { return int(C.duk_check_stack_top(d.duk_context, C.duk_idx_t(top))) == 1 } // See: http://duktape.org/api.html#duk_check_type func (d *Context) CheckType(index int, typ int) bool { return int(C.duk_check_type(d.duk_context, C.duk_idx_t(index), C.duk_int_t(typ))) == 1 } // See: http://duktape.org/api.html#duk_check_type_mask func (d *Context) CheckTypeMask(index int, mask uint) bool { return int(C.duk_check_type_mask(d.duk_context, C.duk_idx_t(index), C.duk_uint_t(mask))) == 1 } // See: http://duktape.org/api.html#duk_compact func (d *Context) Compact(objIndex int) { C.duk_compact(d.duk_context, C.duk_idx_t(objIndex)) } // See: http://duktape.org/api.html#duk_compile func (d *Context) Compile(flags uint) { C._duk_compile(d.duk_context, C.duk_uint_t(flags)) } // See: http://duktape.org/api.html#duk_compile_file func (d *Context) CompileFile(flags uint, path string) { __path__ := C.CString(path) C._duk_compile_file(d.duk_context, C.duk_uint_t(flags), __path__) C.free(unsafe.Pointer(__path__)) } // See: http://duktape.org/api.html#duk_compile_lstring func (d *Context) CompileLstring(flags uint, src string, len int) { __src__ := C.CString(src) C._duk_compile_lstring(d.duk_context, C.duk_uint_t(flags), __src__, C.duk_size_t(len)) C.free(unsafe.Pointer(__src__)) } // See: http://duktape.org/api.html#duk_compile_lstring_filename func (d *Context) CompileLstringFilename(flags uint, src string, len int) { __src__ := C.CString(src) C._duk_compile_lstring_filename(d.duk_context, C.duk_uint_t(flags), __src__, C.duk_size_t(len)) C.free(unsafe.Pointer(__src__)) } // See: http://duktape.org/api.html#duk_compile_string func (d *Context) CompileString(flags uint, src string) { __src__ := C.CString(src) C._duk_compile_string(d.duk_context, C.duk_uint_t(flags), __src__) C.free(unsafe.Pointer(__src__)) } // See: http://duktape.org/api.html#duk_compile_string_filename func (d *Context) CompileStringFilename(flags uint, src string) { __src__ := C.CString(src) C._duk_compile_string_filename(d.duk_context, C.duk_uint_t(flags), __src__) C.free(unsafe.Pointer(__src__)) } // See: http://duktape.org/api.html#duk_concat func (d *Context) Concat(count int) { C.duk_concat(d.duk_context, C.duk_idx_t(count)) } // See: http://duktape.org/api.html#duk_copy func (d *Context) Copy(fromIndex int, toIndex int) { C.duk_copy(d.duk_context, C.duk_idx_t(fromIndex), C.duk_idx_t(toIndex)) } // See: http://duktape.org/api.html#duk_del_prop func (d *Context) DelProp(objIndex int) bool { return int(C.duk_del_prop(d.duk_context, C.duk_idx_t(objIndex))) == 1 } // See: http://duktape.org/api.html#duk_del_prop_index func (d *Context) DelPropIndex(objIndex int, arrIndex uint) bool { return int(C.duk_del_prop_index(d.duk_context, C.duk_idx_t(objIndex), C.duk_uarridx_t(arrIndex))) == 1 } // See: http://duktape.org/api.html#duk_del_prop_string func (d *Context) DelPropString(objIndex int, key string) bool { __key__ := C.CString(key) result := int(C.duk_del_prop_string(d.duk_context, C.duk_idx_t(objIndex), __key__)) == 1 C.free(unsafe.Pointer(__key__)) return result } // See: http://duktape.org/api.html#duk_def_prop func (d *Context) DefProp(objIndex int, flags uint) { C.duk_def_prop(d.duk_context, C.duk_idx_t(objIndex), C.duk_uint_t(flags)) } // See: http://duktape.org/api.html#duk_destroy_heap func (d *Context) DestroyHeap() { d.Gc(0) C.duk_destroy_heap(d.duk_context) d.duk_context = nil } // See: http://duktape.org/api.html#duk_dump_context_stderr func (d *Context) DumpContextStderr() { C._duk_dump_context_stderr(d.duk_context) } // See: http://duktape.org/api.html#duk_dump_context_stdout func (d *Context) DumpContextStdout() { C._duk_dump_context_stdout(d.duk_context) } // See: http://duktape.org/api.html#duk_dup func (d *Context) Dup(fromIndex int) { C.duk_dup(d.duk_context, C.duk_idx_t(fromIndex)) } // See: http://duktape.org/api.html#duk_dup_top func (d *Context) DupTop() { C.duk_dup_top(d.duk_context) } // See: http://duktape.org/api.html#duk_enum func (d *Context) Enum(objIndex int, enumFlags uint) { C.duk_enum(d.duk_context, C.duk_idx_t(objIndex), C.duk_uint_t(enumFlags)) } // See: http://duktape.org/api.html#duk_equals func (d *Context) Equals(index1 int, index2 int) bool { return int(C.duk_equals(d.duk_context, C.duk_idx_t(index1), C.duk_idx_t(index2))) == 1 } // Error pushes a new Error object to the stack and throws it. This will call // fmt.Sprint, forwarding arguments after the error code, to produce the // Error's message. // // See: http://duktape.org/api.html#duk_error func (d *Context) Error(errCode int, str string) { __str__ := C.CString(str) C._duk_error(d.duk_context, C.duk_errcode_t(errCode), __str__) C.free(unsafe.Pointer(__str__)) } func (d *Context) ErrorRaw(errCode int, filename string, line int, errMsg string) { __filename__ := C.CString(filename) __errMsg__ := C.CString(errMsg) C._duk_error_raw(d.duk_context, C.duk_errcode_t(errCode), __filename__, C.duk_int_t(line), __errMsg__) C.free(unsafe.Pointer(__filename__)) C.free(unsafe.Pointer(__errMsg__)) } // Errorf pushes a new Error object to the stack and throws it. This will call // fmt.Sprintf, forwarding the format string and additional arguments, to // produce the Error's message. // // See: http://duktape.org/api.html#duk_error func (d *Context) Errorf(errCode int, format string, a ...interface{}) { str := fmt.Sprintf(format, a...) __str__ := C.CString(str) C._duk_error(d.duk_context, C.duk_errcode_t(errCode), __str__) C.free(unsafe.Pointer(__str__)) } // See: http://duktape.org/api.html#duk_eval func (d *Context) Eval() { C._duk_eval(d.duk_context) } // See: http://duktape.org/api.html#duk_eval_file func (d *Context) EvalFile(path string) { __path__ := C.CString(path) C._duk_eval_file(d.duk_context, __path__) C.free(unsafe.Pointer(__path__)) } // See: http://duktape.org/api.html#duk_eval_file_noresult func (d *Context) EvalFileNoresult(path string) { __path__ := C.CString(path) C._duk_eval_file_noresult(d.duk_context, __path__) C.free(unsafe.Pointer(__path__)) } // See: http://duktape.org/api.html#duk_eval_lstring func (d *Context) EvalLstring(src string, len int) { __src__ := C.CString(src) C._duk_eval_lstring(d.duk_context, __src__, C.duk_size_t(len)) C.free(unsafe.Pointer(__src__)) } // See: http://duktape.org/api.html#duk_eval_lstring_noresult func (d *Context) EvalLstringNoresult(src string, len int) { __src__ := C.CString(src) C._duk_eval_lstring_noresult(d.duk_context, __src__, C.duk_size_t(len)) C.free(unsafe.Pointer(__src__)) } // See: http://duktape.org/api.html#duk_eval_noresult func (d *Context) EvalNoresult() { C._duk_eval_noresult(d.duk_context) } // See: http://duktape.org/api.html#duk_eval_string func (d *Context) EvalString(src string) { __src__ := C.CString(src) C._duk_eval_string(d.duk_context, __src__) C.free(unsafe.Pointer(__src__)) } // See: http://duktape.org/api.html#duk_eval_string_noresult func (d *Context) EvalStringNoresult(src string) { __src__ := C.CString(src) C._duk_eval_string_noresult(d.duk_context, __src__) C.free(unsafe.Pointer(__src__)) } // See: http://duktape.org/api.html#duk_fatal func (d *Context) Fatal(errCode int, errMsg string) { __errMsg__ := C.CString(errMsg) defer C.free(unsafe.Pointer(__errMsg__)) C.duk_fatal_raw(d.duk_context, __errMsg__) } // See: http://duktape.org/api.html#duk_gc func (d *Context) Gc(flags uint) { C.duk_gc(d.duk_context, C.duk_uint_t(flags)) } // See: http://duktape.org/api.html#duk_get_boolean func (d *Context) GetBoolean(index int) bool { return int(C.duk_get_boolean(d.duk_context, C.duk_idx_t(index))) == 1 } // See: http://duktape.org/api.html#duk_get_buffer func (d *Context) GetBuffer(index int) (rawPtr unsafe.Pointer, outSize uint) { rawPtr = C.duk_get_buffer(d.duk_context, C.duk_idx_t(index), (*C.duk_size_t)(unsafe.Pointer(&outSize))) return rawPtr, outSize } // See: http://duktape.org/api.html#duk_get_context func (d *Context) GetContext(index int) *Context { return contextFromPointer(C.duk_get_context(d.duk_context, C.duk_idx_t(index))) } // See: http://duktape.org/api.html#duk_get_current_magic func (d *Context) GetCurrentMagic() int { return int(C.duk_get_current_magic(d.duk_context)) } // See: http://duktape.org/api.html#duk_get_error_code func (d *Context) GetErrorCode(index int) int { code := int(C.duk_get_error_code(d.duk_context, C.duk_idx_t(index))) return code } // See: http://duktape.org/api.html#duk_get_finalizer func (d *Context) GetFinalizer(index int) { C.duk_get_finalizer(d.duk_context, C.duk_idx_t(index)) } // See: http://duktape.org/api.html#duk_get_global_string func (d *Context) GetGlobalString(key string) bool { __key__ := C.CString(key) result := int(C.duk_get_global_string(d.duk_context, __key__)) == 1 C.free(unsafe.Pointer(__key__)) return result } // See: http://duktape.org/api.html#duk_get_heapptr func (d *Context) GetHeapptr(index int) unsafe.Pointer { return unsafe.Pointer(C.duk_get_heapptr(d.duk_context, C.duk_idx_t(index))) } // See: http://duktape.org/api.html#duk_get_int func (d *Context) GetInt(index int) int { return int(C.duk_get_int(d.duk_context, C.duk_idx_t(index))) } // See: http://duktape.org/api.html#duk_get_length func (d *Context) GetLength(index int) int { return int(C.duk_get_length(d.duk_context, C.duk_idx_t(index))) } // See: http://duktape.org/api.html#duk_get_lstring func (d *Context) GetLstring(index int) string { if s := C.duk_get_lstring(d.duk_context, C.duk_idx_t(index), nil); s != nil { return C.GoString(s) } return "" } // See: http://duktape.org/api.html#duk_get_magic func (d *Context) GetMagic(index int) int { return int(C.duk_get_magic(d.duk_context, C.duk_idx_t(index))) } // See: http://duktape.org/api.html#duk_get_number func (d *Context) GetNumber(index int) float64 { return float64(C.duk_get_number(d.duk_context, C.duk_idx_t(index))) } // See: http://duktape.org/api.html#duk_get_pointer func (d *Context) GetPointer(index int) unsafe.Pointer { return C.duk_get_pointer(d.duk_context, C.duk_idx_t(index)) } // See: http://duktape.org/api.html#duk_get_prop func (d *Context) GetProp(objIndex int) bool { return int(C.duk_get_prop(d.duk_context, C.duk_idx_t(objIndex))) == 1 } // See: http://duktape.org/api.html#duk_get_prop_index func (d *Context) GetPropIndex(objIndex int, arrIndex uint) bool { return int(C.duk_get_prop_index(d.duk_context, C.duk_idx_t(objIndex), C.duk_uarridx_t(arrIndex))) == 1 } // See: http://duktape.org/api.html#duk_get_prop_string func (d *Context) GetPropString(objIndex int, key string) bool { __key__ := C.CString(key) result := int(C.duk_get_prop_string(d.duk_context, C.duk_idx_t(objIndex), __key__)) == 1 C.free(unsafe.Pointer(__key__)) return result } // See: http://duktape.org/api.html#duk_get_prototype func (d *Context) GetPrototype(index int) { C.duk_get_prototype(d.duk_context, C.duk_idx_t(index)) } // See: http://duktape.org/api.html#duk_get_string func (d *Context) GetString(i int) string { if s := C.duk_get_string(d.duk_context, C.duk_idx_t(i)); s != nil { return C.GoString(s) } return "" } // See: http://duktape.org/api.html#duk_get_top func (d *Context) GetTop() int { return int(C.duk_get_top(d.duk_context)) } // See: http://duktape.org/api.html#duk_get_top_index func (d *Context) GetTopIndex() int { return int(C.duk_get_top_index(d.duk_context)) } // See: http://duktape.org/api.html#duk_get_type func (d *Context) GetType(index int) Type { return Type(C.duk_get_type(d.duk_context, C.duk_idx_t(index))) } // See: http://duktape.org/api.html#duk_get_type_mask func (d *Context) GetTypeMask(index int) uint { return uint(C.duk_get_type_mask(d.duk_context, C.duk_idx_t(index))) } // See: http://duktape.org/api.html#duk_get_uint func (d *Context) GetUint(index int) uint { return uint(C.duk_get_uint(d.duk_context, C.duk_idx_t(index))) } // See: http://duktape.org/api.html#duk_has_prop func (d *Context) HasProp(objIndex int) bool { return int(C.duk_has_prop(d.duk_context, C.duk_idx_t(objIndex))) == 1 } // See: http://duktape.org/api.html#duk_has_prop_index func (d *Context) HasPropIndex(objIndex int, arrIndex uint) bool { return int(C.duk_has_prop_index(d.duk_context, C.duk_idx_t(objIndex), C.duk_uarridx_t(arrIndex))) == 1 } // See: http://duktape.org/api.html#duk_has_prop_string func (d *Context) HasPropString(objIndex int, key string) bool { __key__ := C.CString(key) result := int(C.duk_has_prop_string(d.duk_context, C.duk_idx_t(objIndex), __key__)) == 1 C.free(unsafe.Pointer(__key__)) return result } // See: http://duktape.org/api.html#duk_hex_decode func (d *Context) HexDecode(index int) { C.duk_hex_decode(d.duk_context, C.duk_idx_t(index)) } // See: http://duktape.org/api.html#duk_hex_encode func (d *Context) HexEncode(index int) string { if s := C.duk_hex_encode(d.duk_context, C.duk_idx_t(index)); s != nil { return C.GoString(s) } return "" } // See: http://duktape.org/api.html#duk_insert func (d *Context) Insert(toIndex int) { C.duk_insert(d.duk_context, C.duk_idx_t(toIndex)) } // See: http://duktape.org/api.html#duk_is_array func (d *Context) IsArray(index int) bool { return int(C.duk_is_array(d.duk_context, C.duk_idx_t(index))) == 1 } // See: http://duktape.org/api.html#duk_is_boolean func (d *Context) IsBoolean(index int) bool { return int(C.duk_is_boolean(d.duk_context, C.duk_idx_t(index))) == 1 } // See: http://duktape.org/api.html#duk_is_bound_function func (d *Context) IsBoundFunction(index int) bool { return int(C.duk_is_bound_function(d.duk_context, C.duk_idx_t(index))) == 1 } // See: http://duktape.org/api.html#duk_is_buffer func (d *Context) IsBuffer(index int) bool { return int(C.duk_is_buffer(d.duk_context, C.duk_idx_t(index))) == 1 } // See: http://duktape.org/api.html#duk_is_c_function func (d *Context) IsCFunction(index int) bool { return int(C.duk_is_c_function(d.duk_context, C.duk_idx_t(index))) == 1 } // See: http://duktape.org/api.html#duk_is_callable func (d *Context) IsCallable(index int) bool { return int(C.duk_is_function(d.duk_context, C.duk_idx_t(index))) == 1 } // See: http://duktape.org/api.html#duk_is_constructor_call func (d *Context) IsConstructorCall() bool { return int(C.duk_is_constructor_call(d.duk_context)) == 1 } // See: http://duktape.org/api.html#duk_is_dynamic_buffer func (d *Context) IsDynamicBuffer(index int) bool { return int(C.duk_is_dynamic_buffer(d.duk_context, C.duk_idx_t(index))) == 1 } // See: http://duktape.org/api.html#duk_is_ecmascript_function func (d *Context) IsEcmascriptFunction(index int) bool { return int(C.duk_is_ecmascript_function(d.duk_context, C.duk_idx_t(index))) == 1 } // See: http://duktape.org/api.html#duk_is_fixed_buffer func (d *Context) IsFixedBuffer(index int) bool { return int(C.duk_is_fixed_buffer(d.duk_context, C.duk_idx_t(index))) == 1 } // See: http://duktape.org/api.html#duk_is_function func (d *Context) IsFunction(index int) bool { return int(C.duk_is_function(d.duk_context, C.duk_idx_t(index))) == 1 } // See: http://duktape.org/api.html#duk_is_nan func (d *Context) IsNan(index int) bool { return int(C.duk_is_nan(d.duk_context, C.duk_idx_t(index))) == 1 } // See: http://duktape.org/api.html#duk_is_null func (d *Context) IsNull(index int) bool { return int(C.duk_is_null(d.duk_context, C.duk_idx_t(index))) == 1 } // See: http://duktape.org/api.html#duk_is_null_or_undefined func (d *Context) IsNullOrUndefined(index int) bool { return d.IsNull(index) || d.IsUndefined(index) } // See: http://duktape.org/api.html#duk_is_number func (d *Context) IsNumber(index int) bool { return int(C.duk_is_number(d.duk_context, C.duk_idx_t(index))) == 1 } // See: http://duktape.org/api.html#duk_is_object func (d *Context) IsObject(index int) bool { return int(C.duk_is_object(d.duk_context, C.duk_idx_t(index))) == 1 } // See: http://duktape.org/api.html#duk_is_error func (d *Context) IsError(index int) bool { return int(C._duk_is_error(d.duk_context, C.duk_idx_t(index))) == 1 } // See: http://duktape.org/api.html#duk_is_object_coercible func (d *Context) IsObjectCoercible(index int) bool { return int(C._duk_is_object_coercible(d.duk_context, C.duk_idx_t(index))) == 1 } // See: http://duktape.org/api.html#duk_is_pointer func (d *Context) IsPointer(index int) bool { return int(C.duk_is_pointer(d.duk_context, C.duk_idx_t(index))) == 1 } // See: http://duktape.org/api.html#duk_is_primitive func (d *Context) IsPrimitive(index int) bool { return int(C._duk_is_primitive(d.duk_context, C.duk_idx_t(index))) == 1 } // See: http://duktape.org/api.html#duk_is_strict_call func (d *Context) IsStrictCall() bool { return int(C.duk_is_strict_call(d.duk_context)) == 1 } // See: http://duktape.org/api.html#duk_is_string func (d *Context) IsString(index int) bool { return int(C.duk_is_string(d.duk_context, C.duk_idx_t(index))) == 1 } // See: http://duktape.org/api.html#duk_is_thread func (d *Context) IsThread(index int) bool { return int(C.duk_is_thread(d.duk_context, C.duk_idx_t(index))) == 1 } // See: http://duktape.org/api.html#duk_is_undefined func (d *Context) IsUndefined(index int) bool { return int(C.duk_is_undefined(d.duk_context, C.duk_idx_t(index))) == 1 } // See: http://duktape.org/api.html#duk_is_valid_index func (d *Context) IsValidIndex(index int) bool { return int(C.duk_is_valid_index(d.duk_context, C.duk_idx_t(index))) == 1 } // See: http://duktape.org/api.html#duk_join func (d *Context) Join(count int) { C.duk_join(d.duk_context, C.duk_idx_t(count)) } // See: http://duktape.org/api.html#duk_json_decode func (d *Context) JsonDecode(index int) { C.duk_json_decode(d.duk_context, C.duk_idx_t(index)) } // See: http://duktape.org/api.html#duk_json_encode func (d *Context) JsonEncode(index int) string { if s := C.duk_json_encode(d.duk_context, C.duk_idx_t(index)); s != nil { return C.GoString(s) } return "" } // See: http://duktape.org/api.html#duk_new func (d *Context) New(nargs int) { C.duk_new(d.duk_context, C.duk_idx_t(nargs)) } // See: http://duktape.org/api.html#duk_next func (d *Context) Next(enumIndex int, getValue bool) bool { var __getValue__ int if getValue { __getValue__ = 1 } return int(C.duk_next(d.duk_context, C.duk_idx_t(enumIndex), C.duk_bool_t(__getValue__))) == 1 } // See: http://duktape.org/api.html#duk_normalize_index func (d *Context) NormalizeIndex(index int) int { return int(C.duk_normalize_index(d.duk_context, C.duk_idx_t(index))) } // See: http://duktape.org/api.html#duk_pcall func (d *Context) Pcall(nargs int) int { return int(C.duk_pcall(d.duk_context, C.duk_idx_t(nargs))) } // See: http://duktape.org/api.html#duk_pcall_method func (d *Context) PcallMethod(nargs int) int { return int(C.duk_pcall_method(d.duk_context, C.duk_idx_t(nargs))) } // See: http://duktape.org/api.html#duk_pcall_prop func (d *Context) PcallProp(objIndex int, nargs int) int { return int(C.duk_pcall_prop(d.duk_context, C.duk_idx_t(objIndex), C.duk_idx_t(nargs))) } // See: http://duktape.org/api.html#duk_pcompile func (d *Context) Pcompile(flags uint) error { result := int(C._duk_pcompile(d.duk_context, C.duk_uint_t(flags))) return d.castStringToError(result) } // See: http://duktape.org/api.html#duk_pcompile_file func (d *Context) PcompileFile(flags uint, path string) error { __path__ := C.CString(path) result := int(C._duk_pcompile_file(d.duk_context, C.duk_uint_t(flags), __path__)) C.free(unsafe.Pointer(__path__)) return d.castStringToError(result) } // See: http://duktape.org/api.html#duk_pcompile_lstring func (d *Context) PcompileLstring(flags uint, src string, len int) error { __src__ := C.CString(src) result := int(C._duk_pcompile_lstring(d.duk_context, C.duk_uint_t(flags), __src__, C.duk_size_t(len))) C.free(unsafe.Pointer(__src__)) return d.castStringToError(result) } // See: http://duktape.org/api.html#duk_pcompile_lstring_filename func (d *Context) PcompileLstringFilename(flags uint, src string, len int) error { __src__ := C.CString(src) result := int(C._duk_pcompile_lstring_filename(d.duk_context, C.duk_uint_t(flags), __src__, C.duk_size_t(len))) C.free(unsafe.Pointer(__src__)) return d.castStringToError(result) } // See: http://duktape.org/api.html#duk_pcompile_string func (d *Context) PcompileString(flags uint, src string) error { __src__ := C.CString(src) result := int(C._duk_pcompile_string(d.duk_context, C.duk_uint_t(flags), __src__)) C.free(unsafe.Pointer(__src__)) fmt.Println("result herhehreh", result) return nil //d.castStringToError(result) } // See: http://duktape.org/api.html#duk_pcompile_string_filename func (d *Context) PcompileStringFilename(flags uint, src string) error { __src__ := C.CString(src) result := int(C._duk_pcompile_string_filename(d.duk_context, C.duk_uint_t(flags), __src__)) C.free(unsafe.Pointer(__src__)) return d.castStringToError(result) } // See: http://duktape.org/api.html#duk_peval func (d *Context) Peval() error { result := int(C._duk_peval(d.duk_context)) return d.castStringToError(result) } // See: http://duktape.org/api.html#duk_peval_file func (d *Context) PevalFile(path string) error { __path__ := C.CString(path) result := int(C._duk_peval_file(d.duk_context, __path__)) C.free(unsafe.Pointer(__path__)) return d.castStringToError(result) } // See: http://duktape.org/api.html#duk_peval_file_noresult func (d *Context) PevalFileNoresult(path string) int { __path__ := C.CString(path) result := int(C._duk_peval_file_noresult(d.duk_context, __path__)) C.free(unsafe.Pointer(__path__)) return result } // See: http://duktape.org/api.html#duk_peval_lstring func (d *Context) PevalLstring(src string, len int) error { __src__ := C.CString(src) result := int(C._duk_peval_lstring(d.duk_context, __src__, C.duk_size_t(len))) C.free(unsafe.Pointer(__src__)) return d.castStringToError(result) } // See: http://duktape.org/api.html#duk_peval_lstring_noresult func (d *Context) PevalLstringNoresult(src string, len int) int { __src__ := C.CString(src) result := int(C._duk_peval_lstring_noresult(d.duk_context, __src__, C.duk_size_t(len))) C.free(unsafe.Pointer(__src__)) return result } // See: http://duktape.org/api.html#duk_peval_noresult func (d *Context) PevalNoresult() int { return int(C._duk_peval_noresult(d.duk_context)) } // See: http://duktape.org/api.html#duk_peval_string func (d *Context) PevalString(src string) error { __src__ := C.CString(src) result := int(C._duk_peval_string(d.duk_context, __src__)) C.free(unsafe.Pointer(__src__)) return d.castStringToError(result) } // See: http://duktape.org/api.html#duk_peval_string_noresult func (d *Context) PevalStringNoresult(src string) int { __src__ := C.CString(src) result := int(C._duk_peval_string_noresult(d.duk_context, __src__)) C.free(unsafe.Pointer(__src__)) return result } func (d *Context) castStringToError(result int) error { if result == 0 { return nil } err := &Error{} for _, key := range []string{"name", "message", "fileName", "lineNumber", "stack"} { d.GetPropString(-1, key) switch key { case "name": err.Type = d.SafeToString(-1) case "message": err.Message = d.SafeToString(-1) case "fileName": err.FileName = d.SafeToString(-1) case "lineNumber": if d.IsNumber(-1) { err.LineNumber = d.GetInt(-1) } case "stack": err.Stack = d.SafeToString(-1) } d.Pop() } return err } // See: http://duktape.org/api.html#duk_pop func (d *Context) Pop() { if d.GetTop() == 0 { return } C.duk_pop(d.duk_context) } // See: http://duktape.org/api.html#duk_pop_2 func (d *Context) Pop2() { d.PopN(2) } // See: http://duktape.org/api.html#duk_pop_3 func (d *Context) Pop3() { d.PopN(3) } // See: http://duktape.org/api.html#duk_pop_n func (d *Context) PopN(count int) { if d.GetTop() < count || count < 1 { return } C.duk_pop_n(d.duk_context, C.duk_idx_t(count)) } // See: http://duktape.org/api.html#duk_push_array func (d *Context) PushArray() int { return int(C.duk_push_array(d.duk_context)) } // See: http://duktape.org/api.html#duk_push_boolean func (d *Context) PushBoolean(val bool) { var __val__ int if val { __val__ = 1 } C.duk_push_boolean(d.duk_context, C.duk_bool_t(__val__)) } // See: http://duktape.org/api.html#duk_push_buffer func (d *Context) PushBuffer(size int, dynamic bool) unsafe.Pointer { var __dynamic__ int if dynamic { __dynamic__ = 1 } return C._duk_push_buffer(d.duk_context, C.duk_size_t(size), C.duk_bool_t(__dynamic__)) } // See: http://duktape.org/api.html#duk_push_c_function func (d *Context) PushCFunction(fn *[0]byte, nargs int64) int { return int(C.duk_push_c_function(d.duk_context, fn, C.duk_idx_t(nargs))) } // See: http://duktape.org/api.html#duk_push_context_dump func (d *Context) PushContextDump() { C.duk_push_context_dump(d.duk_context) } // See: http://duktape.org/api.html#duk_push_current_function func (d *Context) PushCurrentFunction() { C.duk_push_current_function(d.duk_context) } // See: http://duktape.org/api.html#duk_push_current_thread func (d *Context) PushCurrentThread() { C.duk_push_current_thread(d.duk_context) } // See: http://duktape.org/api.html#duk_push_dynamic_buffer func (d *Context) PushDynamicBuffer(size int) unsafe.Pointer { return C._duk_push_dynamic_buffer(d.duk_context, C.duk_size_t(size)) } // See: http://duktape.org/api.html#duk_push_error_object func (d *Context) PushErrorObject(errCode int, format string, value interface{}) { __str__ := C.CString(fmt.Sprintf(format, value)) C._duk_push_error_object(d.duk_context, C.duk_errcode_t(errCode), __str__) C.free(unsafe.Pointer(__str__)) } // See: http://duktape.org/api.html#duk_push_false func (d *Context) PushFalse() { C.duk_push_false(d.duk_context) } // See: http://duktape.org/api.html#duk_push_fixed_buffer func (d *Context) PushFixedBuffer(size int) unsafe.Pointer { return C._duk_push_fixed_buffer(d.duk_context, C.duk_size_t(size)) } // See: http://duktape.org/api.html#duk_push_global_object func (d *Context) PushGlobalObject() { C.duk_push_global_object(d.duk_context) } // See: http://duktape.org/api.html#duk_push_global_stash func (d *Context) PushGlobalStash() { C.duk_push_global_stash(d.duk_context) } // See: http://duktape.org/api.html#duk_push_heapptr func (d *Context) PushHeapptr(ptr unsafe.Pointer) { C.duk_push_heapptr(d.duk_context, ptr) } // See: http://duktape.org/api.html#duk_push_heap_stash func (d *Context) PushHeapStash() { C.duk_push_heap_stash(d.duk_context) } // See: http://duktape.org/api.html#duk_push_int func (d *Context) PushInt(val int) { C.duk_push_int(d.duk_context, C.duk_int_t(val)) } // See: http://duktape.org/api.html#duk_push_lstring func (d *Context) PushLstring(str string, len int) string { __str__ := C.CString(str) var result string if s := C.duk_push_lstring(d.duk_context, __str__, C.duk_size_t(len)); s != nil { result = C.GoString(s) } C.free(unsafe.Pointer(__str__)) return result } // See: http://duktape.org/api.html#duk_push_nan func (d *Context) PushNan() { C.duk_push_nan(d.duk_context) } // See: http://duktape.org/api.html#duk_push_null func (d *Context) PushNull() { C.duk_push_null(d.duk_context) } // See: http://duktape.org/api.html#duk_push_number func (d *Context) PushNumber(val float64) { C.duk_push_number(d.duk_context, C.duk_double_t(val)) } // See: http://duktape.org/api.html#duk_push_object func (d *Context) PushObject() int { return int(C.duk_push_object(d.duk_context)) } // See: http://duktape.org/api.html#duk_push_string func (d *Context) PushString(str string) string { __str__ := C.CString(str) var result string if s := C.duk_push_string(d.duk_context, __str__); s != nil { result = C.GoString(s) } C.free(unsafe.Pointer(__str__)) return result } // See: http://duktape.org/api.html#duk_push_string_file func (d *Context) PushStringFile(path string) string { __path__ := C.CString(path) var result string if s := C._duk_push_string_file(d.duk_context, __path__); s != nil { result = C.GoString(s) } C.free(unsafe.Pointer(__path__)) return result } // See: http://duktape.org/api.html#duk_push_this func (d *Context) PushThis() { C.duk_push_this(d.duk_context) } // See: http://duktape.org/api.html#duk_push_thread func (d *Context) PushThread() int { return int(C._duk_push_thread(d.duk_context)) } // See: http://duktape.org/api.html#duk_push_thread_new_globalenv func (d *Context) PushThreadNewGlobalenv() int { return int(C._duk_push_thread_new_globalenv(d.duk_context)) } // See: http://duktape.org/api.html#duk_push_thread_stash func (d *Context) PushThreadStash(targetCtx *Context) { C.duk_push_thread_stash(d.duk_context, targetCtx.duk_context) } // See: http://duktape.org/api.html#duk_push_true func (d *Context) PushTrue() { C.duk_push_true(d.duk_context) } // See: http://duktape.org/api.html#duk_push_uint func (d *Context) PushUint(val uint) { C.duk_push_uint(d.duk_context, C.duk_uint_t(val)) } // See: http://duktape.org/api.html#duk_push_undefined func (d *Context) PushUndefined() { C.duk_push_undefined(d.duk_context) } // See: http://duktape.org/api.html#duk_put_global_string func (d *Context) PutGlobalString(key string) bool { __key__ := C.CString(key) result := int(C.duk_put_global_string(d.duk_context, __key__)) == 1 C.free(unsafe.Pointer(__key__)) return result } // See: http://duktape.org/api.html#duk_put_prop func (d *Context) PutProp(objIndex int) bool { return int(C.duk_put_prop(d.duk_context, C.duk_idx_t(objIndex))) == 1 } // See: http://duktape.org/api.html#duk_put_prop_index func (d *Context) PutPropIndex(objIndex int, arrIndex uint) bool { return int(C.duk_put_prop_index(d.duk_context, C.duk_idx_t(objIndex), C.duk_uarridx_t(arrIndex))) == 1 } // See: http://duktape.org/api.html#duk_put_prop_string func (d *Context) PutPropString(objIndex int, key string) bool { __key__ := C.CString(key) result := int(C.duk_put_prop_string(d.duk_context, C.duk_idx_t(objIndex), __key__)) == 1 C.free(unsafe.Pointer(__key__)) return result } // See: http://duktape.org/api.html#duk_remove func (d *Context) Remove(index int) { C.duk_remove(d.duk_context, C.duk_idx_t(index)) } // See: http://duktape.org/api.html#duk_replace func (d *Context) Replace(toIndex int) { C.duk_replace(d.duk_context, C.duk_idx_t(toIndex)) } // See: http://duktape.org/api.html#duk_require_boolean func (d *Context) RequireBoolean(index int) bool { return int(C.duk_require_boolean(d.duk_context, C.duk_idx_t(index))) == 1 } // See: http://duktape.org/api.html#duk_require_buffer func (d *Context) RequireBuffer(index int) (rawPtr unsafe.Pointer, outSize uint) { rawPtr = C.duk_require_buffer(d.duk_context, C.duk_idx_t(index), (*C.duk_size_t)(unsafe.Pointer(&outSize))) return rawPtr, outSize } // See: http://duktape.org/api.html#duk_require_callable func (d *Context) RequireCallable(index int) { // At present, duk_require_callable is a macro that just calls duk_require_function. // cgo does not support such macros we have to call it directly. C.duk_require_function(d.duk_context, C.duk_idx_t(index)) } // See: http://duktape.org/api.html#duk_require_context func (d *Context) RequireContext(index int) *Context { return contextFromPointer(C.duk_require_context(d.duk_context, C.duk_idx_t(index))) } // See: http://duktape.org/api.html#duk_require_function func (d *Context) RequireFunction(index int) { C.duk_require_function(d.duk_context, C.duk_idx_t(index)) } // See: http://duktape.org/api.html#duk_require_heapptr func (d *Context) RequireHeapptr(index int) unsafe.Pointer { return unsafe.Pointer(C.duk_require_heapptr(d.duk_context, C.duk_idx_t(index))) } // See: http://duktape.org/api.html#duk_require_int func (d *Context) RequireInt(index int) int { return int(C.duk_require_int(d.duk_context, C.duk_idx_t(index))) } // See: http://duktape.org/api.html#duk_require_lstring func (d *Context) RequireLstring(index int) string { if s := C.duk_require_lstring(d.duk_context, C.duk_idx_t(index), nil); s != nil { return C.GoString(s) } return "" } // See: http://duktape.org/api.html#duk_require_normalize_index func (d *Context) RequireNormalizeIndex(index int) int { return int(C.duk_require_normalize_index(d.duk_context, C.duk_idx_t(index))) } // See: http://duktape.org/api.html#duk_require_null func (d *Context) RequireNull(index int) { C.duk_require_null(d.duk_context, C.duk_idx_t(index)) } // See: http://duktape.org/api.html#duk_require_number func (d *Context) RequireNumber(index int) float64 { return float64(C.duk_require_number(d.duk_context, C.duk_idx_t(index))) } // See: http://duktape.org/api.html#duk_require_object_coercible func (d *Context) RequireObjectCoercible(index int) { C._duk_require_object_coercible(d.duk_context, C.duk_idx_t(index)) } // See: http://duktape.org/api.html#duk_require_pointer func (d *Context) RequirePointer(index int) unsafe.Pointer { return C.duk_require_pointer(d.duk_context, C.duk_idx_t(index)) } // See: http://duktape.org/api.html#duk_require_stack func (d *Context) RequireStack(extra int) { C.duk_require_stack(d.duk_context, C.duk_idx_t(extra)) } // See: http://duktape.org/api.html#duk_require_stack_top func (d *Context) RequireStackTop(top int) { C.duk_require_stack_top(d.duk_context, C.duk_idx_t(top)) } // See: http://duktape.org/api.html#duk_require_string func (d *Context) RequireString(index int) string { if s := C.duk_require_string(d.duk_context, C.duk_idx_t(index)); s != nil { return C.GoString(s) } return "" } // See: http://duktape.org/api.html#duk_require_top_index func (d *Context) RequireTopIndex() int { return int(C.duk_require_top_index(d.duk_context)) } // See: http://duktape.org/api.html#duk_require_type_mask func (d *Context) RequireTypeMask(index int, mask uint) { C._duk_require_type_mask(d.duk_context, C.duk_idx_t(index), C.duk_uint_t(mask)) } // See: http://duktape.org/api.html#duk_require_uint func (d *Context) RequireUint(index int) uint { return uint(C.duk_require_uint(d.duk_context, C.duk_idx_t(index))) } // See: http://duktape.org/api.html#duk_require_undefined func (d *Context) RequireUndefined(index int) { C.duk_require_undefined(d.duk_context, C.duk_idx_t(index)) } // See: http://duktape.org/api.html#duk_require_valid_index func (d *Context) RequireValidIndex(index int) { C.duk_require_valid_index(d.duk_context, C.duk_idx_t(index)) } // See: http://duktape.org/api.html#duk_resize_buffer func (d *Context) ResizeBuffer(index int, newSize int) unsafe.Pointer { return C.duk_resize_buffer(d.duk_context, C.duk_idx_t(index), C.duk_size_t(newSize)) } // See: http://duktape.org/api.html#duk_safe_call func (d *Context) SafeCall(fn, args *[0]byte, nargs, nrets int) int { return int(C.duk_safe_call( d.duk_context, fn, unsafe.Pointer(&args), C.duk_idx_t(nargs), C.duk_idx_t(nrets), )) } // See: http://duktape.org/api.html#duk_safe_to_lstring func (d *Context) SafeToLstring(index int) string { if s := C.duk_safe_to_lstring(d.duk_context, C.duk_idx_t(index), nil); s != nil { return C.GoString(s) } return "" } // See: http://duktape.org/api.html#duk_safe_to_string func (d *Context) SafeToString(index int) string { if s := C._duk_safe_to_string(d.duk_context, C.duk_idx_t(index)); s != nil { return C.GoString(s) } return "" } // See: http://duktape.org/api.html#duk_set_finalizer func (d *Context) SetFinalizer(index int) { C.duk_set_finalizer(d.duk_context, C.duk_idx_t(index)) } // See: http://duktape.org/api.html#duk_set_global_object func (d *Context) SetGlobalObject() { C.duk_set_global_object(d.duk_context) } // See: http://duktape.org/api.html#duk_set_magic func (d *Context) SetMagic(index int, magic int) { C.duk_set_magic(d.duk_context, C.duk_idx_t(index), C.duk_int_t(magic)) } // See: http://duktape.org/api.html#duk_set_prototype func (d *Context) SetPrototype(index int) { C.duk_set_prototype(d.duk_context, C.duk_idx_t(index)) } // See: http://duktape.org/api.html#duk_set_top func (d *Context) SetTop(index int) { C.duk_set_top(d.duk_context, C.duk_idx_t(index)) } func (d *Context) StrictEquals(index1 int, index2 int) bool { return int(C.duk_strict_equals(d.duk_context, C.duk_idx_t(index1), C.duk_idx_t(index2))) == 1 } // See: http://duktape.org/api.html#duk_substring func (d *Context) Substring(index int, startCharOffset int, endCharOffset int) { C.duk_substring(d.duk_context, C.duk_idx_t(index), C.duk_size_t(startCharOffset), C.duk_size_t(endCharOffset)) } // See: http://duktape.org/api.html#duk_swap func (d *Context) Swap(index1 int, index2 int) { C.duk_swap(d.duk_context, C.duk_idx_t(index1), C.duk_idx_t(index2)) } // See: http://duktape.org/api.html#duk_swap_top func (d *Context) SwapTop(index int) { C.duk_swap_top(d.duk_context, C.duk_idx_t(index)) } // See: http://duktape.org/api.html#duk_throw func (d *Context) Throw() { C.duk_throw_raw(d.duk_context) } // See: http://duktape.org/api.html#duk_to_boolean func (d *Context) ToBoolean(index int) bool { return int(C.duk_to_boolean(d.duk_context, C.duk_idx_t(index))) == 1 } // See: http://duktape.org/api.html#duk_to_buffer func (d *Context) ToBuffer(index int) (rawPtr unsafe.Pointer, outSize uint) { rawPtr = C._duk_to_buffer(d.duk_context, C.duk_idx_t(index), (*C.duk_size_t)(unsafe.Pointer(&outSize))) return rawPtr, outSize } // See: http://duktape.org/api.html#duk_to_defaultvalue func (d *Context) ToDefaultvalue(index int, hint int) { C.duk_to_defaultvalue(d.duk_context, C.duk_idx_t(index), C.duk_int_t(hint)) } // See: http://duktape.org/api.html#duk_to_dynamic_buffer func (d *Context) ToDynamicBuffer(index int) (rawPtr unsafe.Pointer, outSize uint) { rawPtr = C._duk_to_dynamic_buffer(d.duk_context, C.duk_idx_t(index), (*C.duk_size_t)(unsafe.Pointer(&outSize))) return rawPtr, outSize } // See: http://duktape.org/api.html#duk_to_fixed_buffer func (d *Context) ToFixedBuffer(index int) (rawPtr unsafe.Pointer, outSize uint) { rawPtr = C._duk_to_fixed_buffer(d.duk_context, C.duk_idx_t(index), (*C.duk_size_t)(unsafe.Pointer(&outSize))) return rawPtr, outSize } // See: http://duktape.org/api.html#duk_to_int func (d *Context) ToInt(index int) int { return int(C.duk_to_int(d.duk_context, C.duk_idx_t(index))) } // See: http://duktape.org/api.html#duk_to_int32 func (d *Context) ToInt32(index int) int32 { return int32(C.duk_to_int32(d.duk_context, C.duk_idx_t(index))) } // See: http://duktape.org/api.html#duk_to_lstring func (d *Context) ToLstring(index int) string { if s := C.duk_to_lstring(d.duk_context, C.duk_idx_t(index), nil); s != nil { return C.GoString(s) } return "" } // See: http://duktape.org/api.html#duk_to_null func (d *Context) ToNull(index int) { C.duk_to_null(d.duk_context, C.duk_idx_t(index)) } // See: http://duktape.org/api.html#duk_to_number func (d *Context) ToNumber(index int) float64 { return float64(C.duk_to_number(d.duk_context, C.duk_idx_t(index))) } // See: http://duktape.org/api.html#duk_to_object func (d *Context) ToObject(index int) { C.duk_to_object(d.duk_context, C.duk_idx_t(index)) } // See: http://duktape.org/api.html#duk_to_pointer func (d *Context) ToPointer(index int) unsafe.Pointer { return C.duk_to_pointer(d.duk_context, C.duk_idx_t(index)) } // See: http://duktape.org/api.html#duk_to_primitive func (d *Context) ToPrimitive(index int, hint int) { C.duk_to_primitive(d.duk_context, C.duk_idx_t(index), C.duk_int_t(hint)) } // See: http://duktape.org/api.html#duk_to_string func (d *Context) ToString(index int) string { if s := C.duk_to_string(d.duk_context, C.duk_idx_t(index)); s != nil { return C.GoString(s) } return "" } // See: http://duktape.org/api.html#duk_to_uint func (d *Context) ToUint(index int) uint { return uint(C.duk_to_uint(d.duk_context, C.duk_idx_t(index))) } // See: http://duktape.org/api.html#duk_to_uint16 func (d *Context) ToUint16(index int) uint16 { return uint16(C.duk_to_uint16(d.duk_context, C.duk_idx_t(index))) } // See: http://duktape.org/api.html#duk_to_uint32 func (d *Context) ToUint32(index int) uint32 { return uint32(C.duk_to_uint32(d.duk_context, C.duk_idx_t(index))) } // See: http://duktape.org/api.html#duk_to_undefined func (d *Context) ToUndefined(index int) { C.duk_to_undefined(d.duk_context, C.duk_idx_t(index)) } // See: http://duktape.org/api.html#duk_trim func (d *Context) Trim(index int) { C.duk_trim(d.duk_context, C.duk_idx_t(index)) } // See: http://duktape.org/api.html#duk_xcopy_top func (d *Context) XcopyTop(fromCtx *Context, count int) { C._duk_xcopy_top(d.duk_context, fromCtx.duk_context, C.duk_idx_t(count)) } // See: http://duktape.org/api.html#duk_xmove_top func (d *Context) XmoveTop(fromCtx *Context, count int) { C._duk_xmove_top(d.duk_context, fromCtx.duk_context, C.duk_idx_t(count)) } // See: http://duktape.org/api.html#duk_push_pointer func (d *Context) PushPointer(p unsafe.Pointer) { C.duk_push_pointer(d.duk_context, p) } //---[ Duktape 1.3 API ]--- // // See: http://duktape.org/api.html#duk_debugger_attach func (d *Context) DebuggerAttach( readFn, writeFn, peekFn, readFlushFn, writeFlushFn, detachedFn *[0]byte, uData unsafe.Pointer) { C.duk_debugger_attach( d.duk_context, readFn, writeFn, peekFn, readFlushFn, writeFlushFn, nil, detachedFn, uData, ) } // See: http://duktape.org/api.html#duk_debugger_cooperate func (d *Context) DebuggerCooperate() { C.duk_debugger_cooperate(d.duk_context) } // See: http://duktape.org/api.html#duk_debugger_detach func (d *Context) DebuggerDetach() { C.duk_debugger_detach(d.duk_context) } // See: http://duktape.org/api.html#duk_dump_function func (d *Context) DumpFunction() { C.duk_dump_function(d.duk_context) } // See: http://duktape.org/api.html#duk_error_va func (d *Context) ErrorVa(errCode int, a ...interface{}) { str := fmt.Sprint(a...) d.Error(errCode, str) } // See: http://duktape.org/api.html#duk_instanceof func (d *Context) Instanceof(idx1, idx2 int) bool { return int(C.duk_instanceof(d.duk_context, C.duk_idx_t(idx1), C.duk_idx_t(idx2))) == 1 } // See: http://duktape.org/api.html#duk_is_lightfunc func (d *Context) IsLightfunc(index int) bool { return int(C.duk_is_lightfunc(d.duk_context, C.duk_idx_t(index))) == 1 } // See: http://duktape.org/api.html#duk_load_function func (d *Context) LoadFunction() { C.duk_load_function(d.duk_context) } // See: http://duktape.org/api.html#duk_log func (d *Context) Log(loglevel int, format string, value interface{}) { __str__ := C.CString(fmt.Sprintf(format, value)) C._duk_log(d.duk_context, C.duk_int_t(loglevel), __str__) C.free(unsafe.Pointer(__str__)) } // See: http://duktape.org/api.html#duk_log_va func (d *Context) LogVa(logLevel int, format string, values ...interface{}) { __str__ := C.CString(fmt.Sprintf(format, values...)) C._duk_log(d.duk_context, C.duk_int_t(logLevel), __str__) C.free(unsafe.Pointer(__str__)) } // See: http://duktape.org/api.html#duk_pnew func (d *Context) Pnew(nargs int) error { result := int(C.duk_pnew(d.duk_context, C.duk_idx_t(nargs))) return d.castStringToError(result) } // See: http://duktape.org/api.html#duk_push_buffer_object func (d *Context) PushBufferObject(bufferIdx, size, length int, flags uint) { C.duk_push_buffer_object( d.duk_context, C.duk_idx_t(bufferIdx), C.duk_size_t(size), C.duk_size_t(length), C.duk_uint_t(flags), ) } // See: http://duktape.org/api.html#duk_push_c_lightfunc func (d *Context) PushCLightfunc(fn *[0]byte, nargs, length, magic int) int { return int(C.duk_push_c_lightfunc( d.duk_context, fn, C.duk_idx_t(nargs), C.duk_idx_t(length), C.duk_int_t(magic), )) } // See: http://duktape.org/api.html#duk_push_error_object_va func (d *Context) PushErrorObjectVa(errCode int, format string, values ...interface{}) { __str__ := C.CString(fmt.Sprintf(format, values...)) C._duk_push_error_object(d.duk_context, C.duk_errcode_t(errCode), __str__) C.free(unsafe.Pointer(__str__)) } // See: http://duktape.org/api.html#duk_push_external_buffer func (d *Context) PushExternalBuffer() { C._duk_push_external_buffer(d.duk_context) } /** * Unimplemented. * * CharCodeAt see: http://duktape.org/api.html#duk_char_code_at * CreateHeap see: http://duktape.org/api.html#duk_create_heap * DecodeString see: http://duktape.org/api.html#duk_decode_string * Free see: http://duktape.org/api.html#duk_free * FreeRaw see: http://duktape.org/api.html#duk_free_raw * GetCFunction see: http://duktape.org/api.html#duk_get_c_function * GetMemoryFunctions see: http://duktape.org/api.html#duk_get_memory_functions * MapString see: http://duktape.org/api.html#duk_map_string * PushSprintf see: http://duktape.org/api.html#duk_push_sprintf * PushVsprintf see: http://duktape.org/api.html#duk_push_vsprintf * PutFunctionList see: http://duktape.org/api.html#duk_put_function_list * PutNumberList see: http://duktape.org/api.html#duk_put_number_list * Realloc see: http://duktape.org/api.html#duk_realloc * ReallocRaw see: http://duktape.org/api.html#duk_realloc_raw * RequireCFunction see: http://duktape.org/api.html#duk_require_c_function * ConfigBuffer see: http://duktape.org/api.html#duk_config_buffer * GetBufferData see: http://duktape.org/api.html#duk_get_buffer_data * StealBuffer see: http://duktape.org/api.html#duk_steal_buffer * RequireBufferData see: http://duktape.org/api.html#duk_require_buffer_data * IsEvalError see: http://duktape.org/api.html#duk_is_eval_error */ ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/appveyor.yml ================================================ os: Visual Studio 2015 clone_folder: C:\gopath\src\gopkg.in/olebedev/go-duktape.v3 clone_depth: 5 version: "{branch}.{build}" environment: global: GOPATH: C:\gopath CC: gcc.exe matrix: - DUKTAPE_ARCH: amd64 MSYS2_ARCH: x86_64 MSYS2_BITS: 64 MSYSTEM: MINGW64 PATH: C:\msys64\mingw64\bin\;C:\Program Files (x86)\NSIS\;%PATH% - DUKTAPE_ARCH: 386 MSYS2_ARCH: i686 MSYS2_BITS: 32 MSYSTEM: MINGW32 PATH: C:\msys64\mingw32\bin\;C:\Program Files (x86)\NSIS\;%PATH% install: - rmdir C:\go /s /q - appveyor DownloadFile https://storage.googleapis.com/golang/go1.9.2.windows-%DUKTAPE_ARCH%.zip - 7z x go1.9.2.windows-%DUKTAPE_ARCH%.zip -y -oC:\ > NUL - go version - gcc --version build_script: - go get -t - go install ./... test_script: - go test ./... ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/conts.go ================================================ package duktape const ( CompileEval uint = 1 << iota CompileFunction CompileStrict CompileSafe CompileNoResult CompileNoSource CompileStrlen ) const ( TypeNone Type = iota TypeUndefined TypeNull TypeBoolean TypeNumber TypeString TypeObject TypeBuffer TypePointer TypeLightFunc ) const ( TypeMaskNone uint = 1 << iota TypeMaskUndefined TypeMaskNull TypeMaskBoolean TypeMaskNumber TypeMaskString TypeMaskObject TypeMaskBuffer TypeMaskPointer TypeMaskLightFunc ) const ( EnumIncludeNonenumerable uint = 1 << iota EnumIncludeInternal EnumOwnPropertiesOnly EnumArrayIndicesOnly EnumSortArrayIndices NoProxyBehavior ) const ( ErrNone int = 0 // Internal to Duktape ErrUnimplemented int = 50 + iota ErrUnsupported ErrInternal ErrAlloc ErrAssertion ErrAPI ErrUncaughtError ) const ( // Common prototypes ErrError int = 1 + iota ErrEval ErrRange ErrReference ErrSyntax ErrType ErrURI ) const ( // Returned error values ErrRetUnimplemented int = -(ErrUnimplemented + iota) ErrRetUnsupported ErrRetInternal ErrRetAlloc ErrRetAssertion ErrRetAPI ErrRetUncaughtError ) const ( ErrRetError int = -(ErrError + iota) ErrRetEval ErrRetRange ErrRetReference ErrRetSyntax ErrRetType ErrRetURI ) const ( ExecSuccess = iota ExecError ) const ( LogTrace int = iota LogDebug LogInfo LogWarn LogError LogFatal ) const ( BufobjDuktapeAuffer = 0 BufobjNodejsAuffer = 1 BufobjArraybuffer = 2 BufobjDataview = 3 BufobjInt8array = 4 BufobjUint8array = 5 BufobjUint8clampedarray = 6 BufobjInt16array = 7 BufobjUint16array = 8 BufobjInt32array = 9 BufobjUint32array = 10 BufobjFloat32array = 11 BufobjFloat64array = 12 ) ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/duk_alloc_pool.c ================================================ /* * Pool allocator for low memory targets. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> #include <stdarg.h> #include "duktape.h" #include "duk_alloc_pool.h" /* Define to enable some debug printfs. */ /* #define DUK_ALLOC_POOL_DEBUG */ /* Define to enable approximate waste tracking. */ /* #define DUK_ALLOC_POOL_TRACK_WASTE */ /* Define to track global highwater for used and waste bytes. VERY SLOW, only * useful for manual testing. */ /* #define DUK_ALLOC_POOL_TRACK_HIGHWATER */ #if defined(DUK_ALLOC_POOL_ROMPTR_COMPRESSION) #if 0 /* This extern declaration is provided by duktape.h, array provided by duktape.c. */ extern const void * const duk_rom_compressed_pointers[]; #endif const void *duk_alloc_pool_romptr_low = NULL; const void *duk_alloc_pool_romptr_high = NULL; static void duk__alloc_pool_romptr_init(void); #endif #if defined(DUK_USE_HEAPPTR16) void *duk_alloc_pool_ptrcomp_base = NULL; #endif #if defined(DUK_ALLOC_POOL_DEBUG) static void duk__alloc_pool_dprintf(const char *fmt, ...) { va_list ap; va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); } #endif /* * Pool initialization */ void *duk_alloc_pool_init(char *buffer, size_t size, const duk_pool_config *configs, duk_pool_state *states, int num_pools, duk_pool_global *global) { double t_min, t_max, t_curr, x; int step, i, j, n; size_t total; char *p; /* XXX: check that 'size' is not too large when using pointer * compression. */ /* To optimize pool counts first come up with a 't' which still allows * total pool size to fit within user provided region. After that * sprinkle any remaining bytes to the counts. Binary search with a * fixed step count; last round uses 't_min' as 't_curr' to ensure it * succeeds. */ t_min = 0.0; /* Unless config is insane, this should always be "good". */ t_max = 1e6; for (step = 0; ; step++) { if (step >= 100) { /* Force "known good", rerun config, and break out. * Deals with rounding corner cases where t_curr is * persistently "bad" even though t_min is a valid * solution. */ t_curr = t_min; } else { t_curr = (t_min + t_max) / 2.0; } for (i = 0, total = 0; i < num_pools; i++) { states[i].size = configs[i].size; /* Target bytes = A*t + B ==> target count = (A*t + B) / block_size. * Rely on A and B being small enough so that 'x' won't wrap. */ x = ((double) configs[i].a * t_curr + (double) configs[i].b) / (double) configs[i].size; states[i].count = (unsigned int) x; total += (size_t) states[i].size * (size_t) states[i].count; if (total > size) { goto bad; } } /* t_curr is good. */ #if defined(DUK_ALLOC_POOL_DEBUG) duk__alloc_pool_dprintf("duk_alloc_pool_init: step=%d, t=[%lf %lf %lf] -> total %ld/%ld (good)\n", step, t_min, t_curr, t_max, (long) total, (long) size); #endif if (step >= 100) { /* Keep state[] initialization state. The state was * created using the highest 't_min'. */ break; } t_min = t_curr; continue; bad: /* t_curr is bad. */ #if defined(DUK_ALLOC_POOL_DEBUG) duk__alloc_pool_dprintf("duk_alloc_pool_init: step=%d, t=[%lf %lf %lf] -> total %ld/%ld (bad)\n", step, t_min, t_curr, t_max, (long) total, (long) size); #endif if (step >= 1000) { /* Cannot find any good solution; shouldn't happen * unless config is bad or 'size' is so small that * even a baseline allocation won't fit. */ return NULL; } t_max = t_curr; /* continue */ } /* The base configuration is now good; sprinkle any leftovers to * pools in descending order. Note that for good t_curr, 'total' * indicates allocated bytes so far and 'size - total' indicates * leftovers. */ for (i = num_pools - 1; i >= 0; i--) { while (size - total >= states[i].size) { /* Ignore potential wrapping of states[i].count as the count * is 32 bits and shouldn't wrap in practice. */ states[i].count++; total += states[i].size; #if defined(DUK_ALLOC_POOL_DEBUG) duk__alloc_pool_dprintf("duk_alloc_pool_init: sprinkle %ld bytes (%ld left after) to pool index %ld, new count %ld\n", (long) states[i].size, (long) (size - total), (long) i, (long) states[i].count); #endif } } /* Pool counts are final. Allocate the user supplied region based * on the final counts, initialize free lists for each block size, * and otherwise finalize 'state' for use. */ p = buffer; global->num_pools = num_pools; global->states = states; #if defined(DUK_ALLOC_POOL_TRACK_HIGHWATER) #if defined(DUK_ALLOC_POOL_DEBUG) duk__alloc_pool_dprintf("duk_alloc_pool_init: global highwater mark tracking enabled, THIS IS VERY SLOW!\n"); #endif global->hwm_used_bytes = 0U; global->hwm_waste_bytes = 0U; #endif #if defined(DUK_ALLOC_POOL_TRACK_WASTE) #if defined(DUK_ALLOC_POOL_DEBUG) duk__alloc_pool_dprintf("duk_alloc_pool_init: approximate waste tracking enabled\n"); #endif #endif #if defined(DUK_USE_HEAPPTR16) /* Register global base value for pointer compression, assumes * a single active pool -4 allows a single subtract to be used and * still ensures no non-NULL pointer encodes to zero. */ duk_alloc_pool_ptrcomp_base = (void *) (p - 4); #endif for (i = 0; i < num_pools; i++) { n = (int) states[i].count; if (n > 0) { states[i].first = (duk_pool_free *) p; for (j = 0; j < n; j++) { char *p_next = p + states[i].size; ((duk_pool_free *) p)->next = (j == n - 1) ? (duk_pool_free *) NULL : (duk_pool_free *) p_next; p = p_next; } } else { states[i].first = (duk_pool_free *) NULL; } states[i].alloc_end = p; #if defined(DUK_ALLOC_POOL_TRACK_HIGHWATER) states[i].hwm_used_count = 0; #endif /* All members of 'state' now initialized. */ #if defined(DUK_ALLOC_POOL_DEBUG) duk__alloc_pool_dprintf("duk_alloc_pool_init: block size %5ld, count %5ld, %8ld total bytes, " "end %p\n", (long) states[i].size, (long) states[i].count, (long) states[i].size * (long) states[i].count, (void *) states[i].alloc_end); #endif } #if defined(DUK_ALLOC_POOL_ROMPTR_COMPRESSION) /* ROM pointer compression precomputation. Assumes a single active * pool. */ duk__alloc_pool_romptr_init(); #endif /* Use 'global' as udata. */ return (void *) global; } /* * Misc helpers */ #if defined(DUK_ALLOC_POOL_TRACK_WASTE) static void duk__alloc_pool_set_waste_marker(void *ptr, size_t used, size_t size) { /* Rely on the base pointer and size being divisible by 4 and thus * aligned. Use 32-bit markers: a 4-byte resolution is good enough, * and comparing 32 bits at a time makes false waste estimates less * likely than when comparing as bytes. */ duk_uint32_t *p, *p_start, *p_end; size_t used_round; used_round = (used + 3U) & ~0x03U; /* round up to 4 */ p_end = (duk_uint32_t *) ((duk_uint8_t *) ptr + size); p_start = (duk_uint32_t *) ((duk_uint8_t *) ptr + used_round); p = (duk_uint32_t *) p_start; while (p != p_end) { *p++ = DUK_ALLOC_POOL_WASTE_MARKER; } } #else /* DUK_ALLOC_POOL_TRACK_WASTE */ static void duk__alloc_pool_set_waste_marker(void *ptr, size_t used, size_t size) { (void) ptr; (void) used; (void) size; } #endif /* DUK_ALLOC_POOL_TRACK_WASTE */ #if defined(DUK_ALLOC_POOL_TRACK_WASTE) static size_t duk__alloc_pool_get_waste_estimate(void *ptr, size_t size) { duk_uint32_t *p, *p_end, *p_start; /* Assumes size is >= 4. */ p_start = (duk_uint32_t *) ptr; p_end = (duk_uint32_t *) ((duk_uint8_t *) ptr + size); p = p_end; /* This scan may cause harmless valgrind complaints: there may be * uninitialized bytes within the legitimate allocation or between * the start of the waste marker and the end of the allocation. */ do { p--; if (*p == DUK_ALLOC_POOL_WASTE_MARKER) { ; } else { return (size_t) (p_end - p - 1) * 4U; } } while (p != p_start); return size; } #else /* DUK_ALLOC_POOL_TRACK_WASTE */ static size_t duk__alloc_pool_get_waste_estimate(void *ptr, size_t size) { (void) ptr; (void) size; return 0; } #endif /* DUK_ALLOC_POOL_TRACK_WASTE */ static int duk__alloc_pool_ptr_in_freelist(duk_pool_state *s, void *ptr) { duk_pool_free *curr; for (curr = s->first; curr != NULL; curr = curr->next) { if ((void *) curr == ptr) { return 1; } } return 0; } void duk_alloc_pool_get_pool_stats(duk_pool_state *s, duk_pool_stats *res) { void *curr; size_t free_count; size_t used_count; size_t waste_bytes; curr = s->alloc_end - (s->size * s->count); free_count = 0U; waste_bytes = 0U; while (curr != s->alloc_end) { if (duk__alloc_pool_ptr_in_freelist(s, curr)) { free_count++; } else { waste_bytes += duk__alloc_pool_get_waste_estimate(curr, s->size); } curr = curr + s->size; } used_count = (size_t) (s->count - free_count); res->used_count = used_count; res->used_bytes = (size_t) (used_count * s->size); res->free_count = free_count; res->free_bytes = (size_t) (free_count * s->size); res->waste_bytes = waste_bytes; #if defined(DUK_ALLOC_POOL_TRACK_HIGHWATER) res->hwm_used_count = s->hwm_used_count; #else res->hwm_used_count = 0U; #endif } void duk_alloc_pool_get_global_stats(duk_pool_global *g, duk_pool_global_stats *res) { int i; size_t total_used = 0U; size_t total_free = 0U; size_t total_waste = 0U; for (i = 0; i < g->num_pools; i++) { duk_pool_state *s = &g->states[i]; duk_pool_stats stats; duk_alloc_pool_get_pool_stats(s, &stats); total_used += stats.used_bytes; total_free += stats.free_bytes; total_waste += stats.waste_bytes; } res->used_bytes = total_used; res->free_bytes = total_free; res->waste_bytes = total_waste; #if defined(DUK_ALLOC_POOL_TRACK_HIGHWATER) res->hwm_used_bytes = g->hwm_used_bytes; res->hwm_waste_bytes = g->hwm_waste_bytes; #else res->hwm_used_bytes = 0U; res->hwm_waste_bytes = 0U; #endif } #if defined(DUK_ALLOC_POOL_TRACK_HIGHWATER) static void duk__alloc_pool_update_highwater(duk_pool_global *g) { int i; size_t total_used = 0U; size_t total_free = 0U; size_t total_waste = 0U; /* Per pool highwater used count, useful to checking if a pool is * too small. */ for (i = 0; i < g->num_pools; i++) { duk_pool_state *s = &g->states[i]; duk_pool_stats stats; duk_alloc_pool_get_pool_stats(s, &stats); if (stats.used_count > s->hwm_used_count) { #if defined(DUK_ALLOC_POOL_DEBUG) duk__alloc_pool_dprintf("duk__alloc_pool_update_highwater: pool %ld (%ld bytes) highwater updated: count %ld -> %ld\n", (long) i, (long) s->size, (long) s->hwm_used_count, (long) stats.used_count); #endif s->hwm_used_count = stats.used_count; } total_used += stats.used_bytes; total_free += stats.free_bytes; total_waste += stats.waste_bytes; } /* Global highwater mark for used and waste bytes. Both fields are * updated from the same snapshot based on highest used count. * This is VERY, VERY slow and only useful for development. * (Note that updating HWM states for pools individually and then * summing them won't create a consistent global snapshot. There * are still easy ways to make this much, much faster.) */ if (total_used > g->hwm_used_bytes) { #if defined(DUK_ALLOC_POOL_DEBUG) duk__alloc_pool_dprintf("duk__alloc_pool_update_highwater: global highwater updated: used=%ld, bytes=%ld -> " "used=%ld, bytes=%ld\n", (long) g->hwm_used_bytes, (long) g->hwm_waste_bytes, (long) total_used, (long) total_waste); #endif g->hwm_used_bytes = total_used; g->hwm_waste_bytes = total_waste; } } #else /* DUK_ALLOC_POOL_TRACK_HIGHWATER */ static void duk__alloc_pool_update_highwater(duk_pool_global *g) { (void) g; } #endif /* DUK_ALLOC_POOL_TRACK_HIGHWATER */ /* * Allocation providers */ void *duk_alloc_pool(void *udata, duk_size_t size) { duk_pool_global *g = (duk_pool_global *) udata; int i, n; #if defined(DUK_ALLOC_POOL_DEBUG) duk__alloc_pool_dprintf("duk_alloc_pool: %p %ld\n", udata, (long) size); #endif if (size == 0) { return NULL; } for (i = 0, n = g->num_pools; i < n; i++) { duk_pool_state *st = g->states + i; if (size <= st->size) { duk_pool_free *res = st->first; if (res != NULL) { st->first = res->next; duk__alloc_pool_set_waste_marker((void *) res, size, st->size); duk__alloc_pool_update_highwater(g); return (void *) res; } } /* Allocation doesn't fit or no free entries, try to borrow * from the next block size. There's no support for preventing * a borrow at present. */ } return NULL; } void *duk_realloc_pool(void *udata, void *ptr, duk_size_t size) { duk_pool_global *g = (duk_pool_global *) udata; int i, j, n; #if defined(DUK_ALLOC_POOL_DEBUG) duk__alloc_pool_dprintf("duk_realloc_pool: %p %p %ld\n", udata, ptr, (long) size); #endif if (ptr == NULL) { return duk_alloc_pool(udata, size); } if (size == 0) { duk_free_pool(udata, ptr); return NULL; } /* Non-NULL pointers are necessarily from the pool so we should * always be able to find the allocation. */ for (i = 0, n = g->num_pools; i < n; i++) { duk_pool_state *st = g->states + i; char *new_ptr; /* Because 'ptr' is assumed to be in the pool and pools are * allocated in sequence, it suffices to check for end pointer * only. */ if ((char *) ptr >= st->alloc_end) { continue; } if (size <= st->size) { /* Allocation still fits existing allocation. Check if * we can shrink the allocation to a smaller block size * (smallest possible). */ for (j = 0; j < i; j++) { duk_pool_state *st2 = g->states + j; if (size <= st2->size) { new_ptr = (char *) st2->first; if (new_ptr != NULL) { #if defined(DUK_ALLOC_POOL_DEBUG) duk__alloc_pool_dprintf("duk_realloc_pool: shrink, block size %ld -> %ld\n", (long) st->size, (long) st2->size); #endif st2->first = ((duk_pool_free *) new_ptr)->next; memcpy((void *) new_ptr, (const void *) ptr, (size_t) size); ((duk_pool_free *) ptr)->next = st->first; st->first = (duk_pool_free *) ptr; duk__alloc_pool_set_waste_marker((void *) new_ptr, size, st2->size); duk__alloc_pool_update_highwater(g); return (void *) new_ptr; } } } /* Failed to shrink; return existing pointer. */ duk__alloc_pool_set_waste_marker((void *) ptr, size, st->size); return ptr; } /* Find first free larger block. */ for (j = i + 1; j < n; j++) { duk_pool_state *st2 = g->states + j; if (size <= st2->size) { new_ptr = (char *) st2->first; if (new_ptr != NULL) { st2->first = ((duk_pool_free *) new_ptr)->next; memcpy((void *) new_ptr, (const void *) ptr, (size_t) st->size); ((duk_pool_free *) ptr)->next = st->first; st->first = (duk_pool_free *) ptr; duk__alloc_pool_set_waste_marker((void *) new_ptr, size, st2->size); duk__alloc_pool_update_highwater(g); return (void *) new_ptr; } } } /* Failed to resize. */ return NULL; } /* We should never be here because 'ptr' should be a valid pool * entry and thus always found above. */ return NULL; } void duk_free_pool(void *udata, void *ptr) { duk_pool_global *g = (duk_pool_global *) udata; int i, n; #if defined(DUK_ALLOC_POOL_DEBUG) duk__alloc_pool_dprintf("duk_free_pool: %p %p\n", udata, ptr); #endif if (ptr == NULL) { return; } for (i = 0, n = g->num_pools; i < n; i++) { duk_pool_state *st = g->states + i; /* Enough to check end address only. */ if ((char *) ptr >= st->alloc_end) { continue; } ((duk_pool_free *) ptr)->next = st->first; st->first = (duk_pool_free *) ptr; #if 0 /* never necessary when freeing */ duk__alloc_pool_update_highwater(g); #endif return; } /* We should never be here because 'ptr' should be a valid pool * entry and thus always found above. */ } /* * Pointer compression */ #if defined(DUK_ALLOC_POOL_ROMPTR_COMPRESSION) static void duk__alloc_pool_romptr_init(void) { /* Scan ROM pointer range for faster detection of "is 'p' a ROM pointer" * later on. */ const void * const * ptrs = (const void * const *) duk_rom_compressed_pointers; duk_alloc_pool_romptr_low = duk_alloc_pool_romptr_high = (const void *) *ptrs; while (*ptrs) { if (*ptrs > duk_alloc_pool_romptr_high) { duk_alloc_pool_romptr_high = (const void *) *ptrs; } if (*ptrs < duk_alloc_pool_romptr_low) { duk_alloc_pool_romptr_low = (const void *) *ptrs; } ptrs++; } } #endif /* Encode/decode functions are defined in the header to allow inlining. */ #if defined(DUK_ALLOC_POOL_ROMPTR_COMPRESSION) duk_uint16_t duk_alloc_pool_enc16_rom(void *ptr) { /* The if-condition should be the fastest possible check * for "is 'ptr' in ROM?". If pointer is in ROM, we'd like * to compress it quickly. Here we just scan a ~1K array * which is very bad for performance. */ const void * const * ptrs = duk_rom_compressed_pointers; while (*ptrs) { if (*ptrs == ptr) { return DUK_ALLOC_POOL_ROMPTR_FIRST + (duk_uint16_t) (ptrs - duk_rom_compressed_pointers); } ptrs++; } /* We should really never be here: Duktape should only be * compressing pointers which are in the ROM compressed * pointers list, which are known at 'make dist' time. * We go on, causing a pointer compression error. */ return 0; } #endif ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/duk_alloc_pool.h ================================================ #if !defined(DUK_ALLOC_POOL_H_INCLUDED) #define DUK_ALLOC_POOL_H_INCLUDED #include "duktape.h" /* 32-bit (big endian) marker used at the end of pool entries so that wasted * space can be detected. Waste tracking must be enabled explicitly. */ #if defined(DUK_ALLOC_POOL_TRACK_WASTE) #define DUK_ALLOC_POOL_WASTE_MARKER 0xedcb2345UL #endif /* Pointer compression with ROM strings/objects: * * For now, use DUK_USE_ROM_OBJECTS to signal the need for compressed ROM * pointers. DUK_USE_ROM_PTRCOMP_FIRST is provided for the ROM pointer * compression range minimum to avoid duplication in user code. */ #if defined(DUK_USE_ROM_OBJECTS) && defined(DUK_USE_HEAPPTR16) #define DUK_ALLOC_POOL_ROMPTR_COMPRESSION #define DUK_ALLOC_POOL_ROMPTR_FIRST DUK_USE_ROM_PTRCOMP_FIRST /* This extern declaration is provided by duktape.h, array provided by duktape.c. * Because duk_config.h may include this file (to get the inline functions) we * need to forward declare this also here. */ extern const void * const duk_rom_compressed_pointers[]; #endif /* Pool configuration for a certain block size. */ typedef struct { unsigned int size; /* must be divisible by 4 and >= sizeof(void *) */ unsigned int a; /* bytes (not count) to allocate: a*t + b, t is an arbitrary scale parameter */ unsigned int b; } duk_pool_config; /* Freelist entry, must fit into the smallest block size. */ struct duk_pool_free; typedef struct duk_pool_free duk_pool_free; struct duk_pool_free { duk_pool_free *next; }; /* Pool state for a certain block size. */ typedef struct { duk_pool_free *first; char *alloc_end; unsigned int size; unsigned int count; #if defined(DUK_ALLOC_POOL_TRACK_HIGHWATER) unsigned int hwm_used_count; #endif } duk_pool_state; /* Statistics for a certain pool. */ typedef struct { size_t used_count; size_t used_bytes; size_t free_count; size_t free_bytes; size_t waste_bytes; size_t hwm_used_count; } duk_pool_stats; /* Top level state for all pools. Pointer to this struct is used as the allocator * userdata pointer. */ typedef struct { int num_pools; duk_pool_state *states; #if defined(DUK_ALLOC_POOL_TRACK_HIGHWATER) size_t hwm_used_bytes; size_t hwm_waste_bytes; #endif } duk_pool_global; /* Statistics for the entire set of pools. */ typedef struct { size_t used_bytes; size_t free_bytes; size_t waste_bytes; size_t hwm_used_bytes; size_t hwm_waste_bytes; } duk_pool_global_stats; /* Initialize a pool allocator, arguments: * - buffer and size: continuous region to use for pool, must align to 4 * - config: configuration for pools in ascending block size * - state: state for pools, matches config order * - num_pools: number of entries in 'config' and 'state' * - global: global state structure * * The 'config', 'state', and 'global' pointers must be valid beyond the init * call, as long as the pool is used. * * Returns a void pointer to be used as userdata for the allocator functions. * Concretely the return value will be "(void *) global", i.e. the global * state struct. If pool init fails, the return value will be NULL. */ void *duk_alloc_pool_init(char *buffer, size_t size, const duk_pool_config *configs, duk_pool_state *states, int num_pools, duk_pool_global *global); /* Duktape allocation providers. Typing matches Duktape requirements. */ void *duk_alloc_pool(void *udata, duk_size_t size); void *duk_realloc_pool(void *udata, void *ptr, duk_size_t size); void duk_free_pool(void *udata, void *ptr); /* Stats. */ void duk_alloc_pool_get_pool_stats(duk_pool_state *s, duk_pool_stats *res); void duk_alloc_pool_get_global_stats(duk_pool_global *g, duk_pool_global_stats *res); /* Duktape pointer compression global state (assumes single pool). */ #if defined(DUK_USE_ROM_OBJECTS) && defined(DUK_USE_HEAPPTR16) extern const void *duk_alloc_pool_romptr_low; extern const void *duk_alloc_pool_romptr_high; duk_uint16_t duk_alloc_pool_enc16_rom(void *ptr); #endif #if defined(DUK_USE_HEAPPTR16) extern void *duk_alloc_pool_ptrcomp_base; #endif #if 0 duk_uint16_t duk_alloc_pool_enc16(void *ptr); void *duk_alloc_pool_dec16(duk_uint16_t val); #endif /* Inlined pointer compression functions. Gcc and clang -Os won't in * practice inline these without an "always inline" attribute because it's * more size efficient (by a few kB) to use explicit calls instead. Having * these defined inline here allows performance optimized builds to inline * pointer compression operations. * * Pointer compression assumes there's a single globally registered memory * pool which makes pointer compression more efficient. This would be easy * to fix by adding a userdata pointer to the compression functions and * plumbing the heap userdata from the compression/decompression macros. */ /* DUK_ALWAYS_INLINE is not a public API symbol so it may go away in even a * minor update. But it's pragmatic for this extra because it handles many * compilers via duk_config.h detection. Check that the macro exists so that * if it's gone, we can still compile. */ #if defined(DUK_ALWAYS_INLINE) #define DUK__ALLOC_POOL_ALWAYS_INLINE DUK_ALWAYS_INLINE #else #define DUK__ALLOC_POOL_ALWAYS_INLINE /* nop */ #endif #if defined(DUK_USE_HEAPPTR16) static DUK__ALLOC_POOL_ALWAYS_INLINE duk_uint16_t duk_alloc_pool_enc16(void *ptr) { if (ptr == NULL) { /* With 'return 0' gcc and clang -Os generate inefficient code. * For example, gcc -Os generates: * * 0804911d <duk_alloc_pool_enc16>: * 804911d: 55 push %ebp * 804911e: 85 c0 test %eax,%eax * 8049120: 89 e5 mov %esp,%ebp * 8049122: 74 0b je 804912f <duk_alloc_pool_enc16+0x12> * 8049124: 2b 05 e4 90 07 08 sub 0x80790e4,%eax * 804912a: c1 e8 02 shr $0x2,%eax * 804912d: eb 02 jmp 8049131 <duk_alloc_pool_enc16+0x14> * 804912f: 31 c0 xor %eax,%eax * 8049131: 5d pop %ebp * 8049132: c3 ret * * The NULL path checks %eax for zero; if it is zero, a zero * is unnecessarily loaded into %eax again. The non-zero path * has an unnecessary jump as a side effect of this. * * Using 'return (duk_uint16_t) (intptr_t) ptr;' generates similarly * inefficient code; not sure how to make the result better. */ return 0; } #if defined(DUK_ALLOC_POOL_ROMPTR_COMPRESSION) if (ptr >= duk_alloc_pool_romptr_low && ptr <= duk_alloc_pool_romptr_high) { /* This is complex enough now to need a separate function. */ return duk_alloc_pool_enc16_rom(ptr); } #endif return (duk_uint16_t) (((size_t) ((char *) ptr - (char *) duk_alloc_pool_ptrcomp_base)) >> 2); } static DUK__ALLOC_POOL_ALWAYS_INLINE void *duk_alloc_pool_dec16(duk_uint16_t val) { if (val == 0) { /* As with enc16 the gcc and clang -Os output is inefficient, * e.g. gcc -Os: * * 08049133 <duk_alloc_pool_dec16>: * 8049133: 55 push %ebp * 8049134: 66 85 c0 test %ax,%ax * 8049137: 89 e5 mov %esp,%ebp * 8049139: 74 0e je 8049149 <duk_alloc_pool_dec16+0x16> * 804913b: 8b 15 e4 90 07 08 mov 0x80790e4,%edx * 8049141: 0f b7 c0 movzwl %ax,%eax * 8049144: 8d 04 82 lea (%edx,%eax,4),%eax * 8049147: eb 02 jmp 804914b <duk_alloc_pool_dec16+0x18> * 8049149: 31 c0 xor %eax,%eax * 804914b: 5d pop %ebp * 804914c: c3 ret */ return NULL; } #if defined(DUK_ALLOC_POOL_ROMPTR_COMPRESSION) if (val >= DUK_ALLOC_POOL_ROMPTR_FIRST) { /* This is a blind lookup, could check index validity. * Duktape should never decompress a pointer which would * be out-of-bounds here. */ return (void *) (intptr_t) (duk_rom_compressed_pointers[val - DUK_ALLOC_POOL_ROMPTR_FIRST]); } #endif return (void *) ((char *) duk_alloc_pool_ptrcomp_base + (((size_t) val) << 2)); } #endif #endif /* DUK_ALLOC_POOL_H_INCLUDED */ ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/duk_config.h ================================================ /* * duk_config.h configuration header generated by genconfig.py. * * Git commit: a459cf3c9bd1779fc01b435d69302b742675a08f * Git describe: v2.2.0 * Git branch: master * * Supported platforms: * - Mac OSX, iPhone, Darwin * - Orbis * - OpenBSD * - Generic BSD * - Atari ST TOS * - AmigaOS * - Durango (XboxOne) * - Windows * - Flashplayer (Crossbridge) * - QNX * - TI-Nspire * - Emscripten * - Linux * - Solaris * - AIX * - HPUX * - Generic POSIX * - Cygwin * - Generic UNIX * - Generic fallback * * Supported architectures: * - x86 * - x64 * - x32 * - ARM 32-bit * - ARM 64-bit * - MIPS 32-bit * - MIPS 64-bit * - PowerPC 32-bit * - PowerPC 64-bit * - SPARC 32-bit * - SPARC 64-bit * - SuperH * - Motorola 68k * - Emscripten * - Generic * * Supported compilers: * - Clang * - GCC * - MSVC * - Emscripten * - TinyC * - VBCC * - Bruce's C compiler * - Generic * */ #if !defined(DUK_CONFIG_H_INCLUDED) #define DUK_CONFIG_H_INCLUDED /* * Intermediate helper defines */ /* DLL build detection */ /* not configured for DLL build */ #undef DUK_F_DLL_BUILD /* Apple OSX, iOS */ #if defined(__APPLE__) #define DUK_F_APPLE #endif /* FreeBSD */ #if defined(__FreeBSD__) || defined(__FreeBSD) #define DUK_F_FREEBSD #endif /* Orbis (PS4) variant */ #if defined(DUK_F_FREEBSD) && defined(__ORBIS__) #define DUK_F_ORBIS #endif /* OpenBSD */ #if defined(__OpenBSD__) || defined(__OpenBSD) #define DUK_F_OPENBSD #endif /* NetBSD */ #if defined(__NetBSD__) || defined(__NetBSD) #define DUK_F_NETBSD #endif /* BSD variant */ #if defined(DUK_F_FREEBSD) || defined(DUK_F_NETBSD) || defined(DUK_F_OPENBSD) || \ defined(__bsdi__) || defined(__DragonFly__) #define DUK_F_BSD #endif /* Atari ST TOS. __TOS__ defined by PureC. No platform define in VBCC * apparently, so to use with VBCC user must define __TOS__ manually. */ #if defined(__TOS__) #define DUK_F_TOS #endif /* Motorola 68K. Not defined by VBCC, so user must define one of these * manually when using VBCC. */ #if defined(__m68k__) || defined(M68000) || defined(__MC68K__) #define DUK_F_M68K #endif /* AmigaOS. Neither AMIGA nor __amigaos__ is defined on VBCC, so user must * define 'AMIGA' manually when using VBCC. */ #if defined(AMIGA) || defined(__amigaos__) #define DUK_F_AMIGAOS #endif /* PowerPC */ #if defined(__powerpc) || defined(__powerpc__) || defined(__PPC__) #define DUK_F_PPC #if defined(__PPC64__) || defined(__LP64__) || defined(_LP64) #define DUK_F_PPC64 #else #define DUK_F_PPC32 #endif #endif /* Durango (Xbox One) */ #if defined(_DURANGO) || defined(_XBOX_ONE) #define DUK_F_DURANGO #endif /* Windows, both 32-bit and 64-bit */ #if defined(_WIN32) || defined(WIN32) || defined(_WIN64) || defined(WIN64) || \ defined(__WIN32__) || defined(__TOS_WIN__) || defined(__WINDOWS__) #define DUK_F_WINDOWS #if defined(_WIN64) || defined(WIN64) #define DUK_F_WIN64 #else #define DUK_F_WIN32 #endif #endif /* Flash player (e.g. Crossbridge) */ #if defined(__FLASHPLAYER__) #define DUK_F_FLASHPLAYER #endif /* QNX */ #if defined(__QNX__) #define DUK_F_QNX #endif /* TI-Nspire (using Ndless) */ #if defined(_TINSPIRE) #define DUK_F_TINSPIRE #endif /* Emscripten (provided explicitly by user), improve if possible */ #if defined(EMSCRIPTEN) #define DUK_F_EMSCRIPTEN #endif /* BCC (Bruce's C compiler): this is a "torture target" for compilation */ #if defined(__BCC__) || defined(__BCC_VERSION__) #define DUK_F_BCC #endif /* Linux */ #if defined(__linux) || defined(__linux__) || defined(linux) #define DUK_F_LINUX #endif /* illumos / Solaris */ #if defined(__sun) && defined(__SVR4) #define DUK_F_SUN #if defined(__SUNPRO_C) && (__SUNPRO_C < 0x550) #define DUK_F_OLD_SOLARIS /* Defines _ILP32 / _LP64 required by DUK_F_X86/DUK_F_X64. Platforms * are processed before architectures, so this happens before the * DUK_F_X86/DUK_F_X64 detection is emitted. */ #include <sys/isa_defs.h> #endif #endif /* AIX */ #if defined(_AIX) /* defined(__xlc__) || defined(__IBMC__): works but too wide */ #define DUK_F_AIX #endif /* HPUX */ #if defined(__hpux) #define DUK_F_HPUX #if defined(__ia64) #define DUK_F_HPUX_ITANIUM #endif #endif /* POSIX */ #if defined(__posix) #define DUK_F_POSIX #endif /* Cygwin */ #if defined(__CYGWIN__) #define DUK_F_CYGWIN #endif /* Generic Unix (includes Cygwin) */ #if defined(__unix) || defined(__unix__) || defined(unix) || \ defined(DUK_F_LINUX) || defined(DUK_F_BSD) #define DUK_F_UNIX #endif /* C++ */ #undef DUK_F_CPP #if defined(__cplusplus) #define DUK_F_CPP #endif /* Intel x86 (32-bit), x64 (64-bit) or x32 (64-bit but 32-bit pointers), * define only one of DUK_F_X86, DUK_F_X64, DUK_F_X32. * https://sites.google.com/site/x32abi/ * * With DUK_F_OLD_SOLARIS the <sys/isa_defs.h> header must be included * before this. */ #if defined(__amd64__) || defined(__amd64) || \ defined(__x86_64__) || defined(__x86_64) || \ defined(_M_X64) || defined(_M_AMD64) #if defined(__ILP32__) || defined(_ILP32) #define DUK_F_X32 #else #define DUK_F_X64 #endif #elif defined(i386) || defined(__i386) || defined(__i386__) || \ defined(__i486__) || defined(__i586__) || defined(__i686__) || \ defined(__IA32__) || defined(_M_IX86) || defined(__X86__) || \ defined(_X86_) || defined(__THW_INTEL__) || defined(__I86__) #if defined(__LP64__) || defined(_LP64) /* This should not really happen, but would indicate x64. */ #define DUK_F_X64 #else #define DUK_F_X86 #endif #endif /* ARM */ #if defined(__arm__) || defined(__thumb__) || defined(_ARM) || defined(_M_ARM) || defined(__aarch64__) #define DUK_F_ARM #if defined(__LP64__) || defined(_LP64) || defined(__arm64) || defined(__arm64__) || defined(__aarch64__) #define DUK_F_ARM64 #else #define DUK_F_ARM32 #endif #endif /* MIPS. Related defines: __MIPSEB__, __MIPSEL__, __mips_isa_rev, __LP64__ */ #if defined(__mips__) || defined(mips) || defined(_MIPS_ISA) || \ defined(_R3000) || defined(_R4000) || defined(_R5900) || \ defined(_MIPS_ISA_MIPS1) || defined(_MIPS_ISA_MIPS2) || \ defined(_MIPS_ISA_MIPS3) || defined(_MIPS_ISA_MIPS4) || \ defined(__mips) || defined(__MIPS__) #define DUK_F_MIPS #if defined(__LP64__) || defined(_LP64) || defined(__mips64) || \ defined(__mips64__) || defined(__mips_n64) #define DUK_F_MIPS64 #else #define DUK_F_MIPS32 #endif #endif /* SPARC */ #if defined(sparc) || defined(__sparc) || defined(__sparc__) #define DUK_F_SPARC #if defined(__LP64__) || defined(_LP64) #define DUK_F_SPARC64 #else #define DUK_F_SPARC32 #endif #endif /* SuperH */ #if defined(__sh__) || \ defined(__sh1__) || defined(__SH1__) || \ defined(__sh2__) || defined(__SH2__) || \ defined(__sh3__) || defined(__SH3__) || \ defined(__sh4__) || defined(__SH4__) || \ defined(__sh5__) || defined(__SH5__) #define DUK_F_SUPERH #endif /* Clang */ #if defined(__clang__) #define DUK_F_CLANG #endif /* C99 or above */ #undef DUK_F_C99 #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) #define DUK_F_C99 #endif /* C++11 or above */ #undef DUK_F_CPP11 #if defined(__cplusplus) && (__cplusplus >= 201103L) #define DUK_F_CPP11 #endif /* GCC. Clang also defines __GNUC__ so don't detect GCC if using Clang. */ #if defined(__GNUC__) && !defined(__clang__) && !defined(DUK_F_CLANG) #define DUK_F_GCC #if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) /* Convenience, e.g. gcc 4.5.1 == 40501; http://stackoverflow.com/questions/6031819/emulating-gccs-builtin-unreachable */ #define DUK_F_GCC_VERSION (__GNUC__ * 10000L + __GNUC_MINOR__ * 100L + __GNUC_PATCHLEVEL__) #else #error cannot figure out gcc version #endif #endif /* MinGW. Also GCC flags (DUK_F_GCC) are enabled now. */ #if defined(__MINGW32__) || defined(__MINGW64__) #define DUK_F_MINGW #endif /* MSVC */ #if defined(_MSC_VER) /* MSVC preprocessor defines: http://msdn.microsoft.com/en-us/library/b0084kay.aspx * _MSC_FULL_VER includes the build number, but it has at least two formats, see e.g. * BOOST_MSVC_FULL_VER in http://www.boost.org/doc/libs/1_52_0/boost/config/compiler/visualc.hpp */ #define DUK_F_MSVC #if defined(_MSC_FULL_VER) #if (_MSC_FULL_VER > 100000000) #define DUK_F_MSVC_FULL_VER _MSC_FULL_VER #else #define DUK_F_MSCV_FULL_VER (_MSC_FULL_VER * 10) #endif #endif #endif /* _MSC_VER */ /* TinyC */ #if defined(__TINYC__) /* http://bellard.org/tcc/tcc-doc.html#SEC9 */ #define DUK_F_TINYC #endif /* VBCC */ #if defined(__VBCC__) #define DUK_F_VBCC #endif #if defined(ANDROID) || defined(__ANDROID__) #define DUK_F_ANDROID #endif /* Atari Mint */ #if defined(__MINT__) #define DUK_F_MINT #endif /* * Platform autodetection */ /* Workaround for older C++ compilers before including <inttypes.h>, * see e.g.: https://sourceware.org/bugzilla/show_bug.cgi?id=15366 */ #if defined(__cplusplus) && !defined(__STDC_LIMIT_MACROS) #define __STDC_LIMIT_MACROS #endif #if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS) #define __STDC_CONSTANT_MACROS #endif #if defined(DUK_F_APPLE) /* --- Mac OSX, iPhone, Darwin --- */ #define DUK_USE_DATE_NOW_GETTIMEOFDAY #define DUK_USE_DATE_TZO_GMTIME_R #define DUK_USE_DATE_PRS_STRPTIME #define DUK_USE_DATE_FMT_STRFTIME #include <TargetConditionals.h> #include <architecture/byte_order.h> #include <sys/param.h> #include <sys/time.h> #include <time.h> /* http://stackoverflow.com/questions/5919996/how-to-detect-reliably-mac-os-x-ios-linux-windows-in-c-preprocessor */ #if TARGET_IPHONE_SIMULATOR #define DUK_USE_OS_STRING "iphone-sim" #elif TARGET_OS_IPHONE #define DUK_USE_OS_STRING "iphone" #elif TARGET_OS_MAC #define DUK_USE_OS_STRING "osx" #else #define DUK_USE_OS_STRING "osx-unknown" #endif /* Use _setjmp() on Apple by default, see GH-55. */ #define DUK_JMPBUF_TYPE jmp_buf #define DUK_SETJMP(jb) _setjmp((jb)) #define DUK_LONGJMP(jb) _longjmp((jb), 1) #elif defined(DUK_F_ORBIS) /* --- Orbis --- */ /* Orbis = PS4 */ #define DUK_USE_DATE_NOW_GETTIMEOFDAY #define DUK_USE_DATE_TZO_GMTIME_S /* no parsing (not an error) */ #define DUK_USE_DATE_FMT_STRFTIME #include <sys/types.h> #include <machine/endian.h> #include <sys/param.h> #include <sys/time.h> #include <time.h> #define DUK_USE_OS_STRING "orbis" #elif defined(DUK_F_OPENBSD) /* --- OpenBSD --- */ /* http://www.monkey.org/openbsd/archive/ports/0401/msg00089.html */ #define DUK_USE_DATE_NOW_GETTIMEOFDAY #define DUK_USE_DATE_TZO_GMTIME_R #define DUK_USE_DATE_PRS_STRPTIME #define DUK_USE_DATE_FMT_STRFTIME #include <sys/types.h> #include <sys/endian.h> #include <sys/param.h> #include <sys/time.h> #include <time.h> #define DUK_USE_OS_STRING "openbsd" #elif defined(DUK_F_BSD) /* --- Generic BSD --- */ #define DUK_USE_DATE_NOW_GETTIMEOFDAY #define DUK_USE_DATE_TZO_GMTIME_R #define DUK_USE_DATE_PRS_STRPTIME #define DUK_USE_DATE_FMT_STRFTIME #include <sys/types.h> #include <sys/endian.h> #include <sys/param.h> #include <sys/time.h> #include <time.h> #define DUK_USE_OS_STRING "bsd" #elif defined(DUK_F_TOS) /* --- Atari ST TOS --- */ #define DUK_USE_DATE_NOW_TIME #define DUK_USE_DATE_TZO_GMTIME /* no parsing (not an error) */ #define DUK_USE_DATE_FMT_STRFTIME #include <time.h> #define DUK_USE_OS_STRING "tos" /* TOS on M68K is always big endian. */ #if !defined(DUK_USE_BYTEORDER) && defined(DUK_F_M68K) #define DUK_USE_BYTEORDER 3 #endif #elif defined(DUK_F_AMIGAOS) /* --- AmigaOS --- */ #if defined(DUK_F_M68K) /* AmigaOS on M68k */ #define DUK_USE_DATE_NOW_TIME #define DUK_USE_DATE_TZO_GMTIME /* no parsing (not an error) */ #define DUK_USE_DATE_FMT_STRFTIME #include <time.h> #elif defined(DUK_F_PPC) #define DUK_USE_DATE_NOW_GETTIMEOFDAY #define DUK_USE_DATE_TZO_GMTIME_R #define DUK_USE_DATE_PRS_STRPTIME #define DUK_USE_DATE_FMT_STRFTIME #include <time.h> #if !defined(UINTPTR_MAX) #define UINTPTR_MAX UINT_MAX #endif #else #error AmigaOS but not M68K/PPC, not supported now #endif #define DUK_USE_OS_STRING "amigaos" /* AmigaOS on M68K or PPC is always big endian. */ #if !defined(DUK_USE_BYTEORDER) && (defined(DUK_F_M68K) || defined(DUK_F_PPC)) #define DUK_USE_BYTEORDER 3 #endif #elif defined(DUK_F_DURANGO) /* --- Durango (XboxOne) --- */ /* Durango = XboxOne * Configuration is nearly identical to Windows, except for * DUK_USE_DATE_TZO_WINDOWS. */ /* Initial fix: disable secure CRT related warnings when compiling Duktape * itself (must be defined before including Windows headers). Don't define * for user code including duktape.h. */ #if defined(DUK_COMPILING_DUKTAPE) && !defined(_CRT_SECURE_NO_WARNINGS) #define _CRT_SECURE_NO_WARNINGS #endif /* MSVC does not have sys/param.h */ #define DUK_USE_DATE_NOW_WINDOWS #define DUK_USE_DATE_TZO_WINDOWS_NO_DST /* Note: PRS and FMT are intentionally left undefined for now. This means * there is no platform specific date parsing/formatting but there is still * the ISO 8601 standard format. */ #if defined(DUK_COMPILING_DUKTAPE) /* Only include when compiling Duktape to avoid polluting application build * with a lot of unnecessary defines. */ #include <windows.h> #endif #define DUK_USE_OS_STRING "durango" #if !defined(DUK_USE_BYTEORDER) #define DUK_USE_BYTEORDER 1 #endif #elif defined(DUK_F_WINDOWS) /* --- Windows --- */ /* Windows version can't obviously be determined at compile time, * but _WIN32_WINNT indicates the minimum version targeted: * - https://msdn.microsoft.com/en-us/library/6sehtctf.aspx */ /* Initial fix: disable secure CRT related warnings when compiling Duktape * itself (must be defined before including Windows headers). Don't define * for user code including duktape.h. */ #if defined(DUK_COMPILING_DUKTAPE) && !defined(_CRT_SECURE_NO_WARNINGS) #define _CRT_SECURE_NO_WARNINGS #endif /* Windows 32-bit and 64-bit are currently the same. */ /* MSVC does not have sys/param.h */ #if defined(DUK_COMPILING_DUKTAPE) /* Only include when compiling Duktape to avoid polluting application build * with a lot of unnecessary defines. */ #include <windows.h> #endif /* GetSystemTimePreciseAsFileTime() available from Windows 8: * https://msdn.microsoft.com/en-us/library/windows/desktop/hh706895(v=vs.85).aspx */ #if defined(DUK_USE_DATE_NOW_WINDOWS_SUBMS) || defined(DUK_USE_DATE_NOW_WINDOWS) /* User forced provider. */ #else #if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0602) #define DUK_USE_DATE_NOW_WINDOWS_SUBMS #else #define DUK_USE_DATE_NOW_WINDOWS #endif #endif #define DUK_USE_DATE_TZO_WINDOWS /* Note: PRS and FMT are intentionally left undefined for now. This means * there is no platform specific date parsing/formatting but there is still * the ISO 8601 standard format. */ /* QueryPerformanceCounter() may go backwards in Windows XP, so enable for * Vista and later: https://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx#qpc_support_in_windows_versions */ #if !defined(DUK_USE_GET_MONOTONIC_TIME_WINDOWS_QPC) && \ defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600) #define DUK_USE_GET_MONOTONIC_TIME_WINDOWS_QPC #endif #define DUK_USE_OS_STRING "windows" /* On Windows, assume we're little endian. Even Itanium which has a * configurable endianness runs little endian in Windows. */ #if !defined(DUK_USE_BYTEORDER) #define DUK_USE_BYTEORDER 1 #endif #elif defined(DUK_F_FLASHPLAYER) /* --- Flashplayer (Crossbridge) --- */ #define DUK_USE_DATE_NOW_GETTIMEOFDAY #define DUK_USE_DATE_TZO_GMTIME_R #define DUK_USE_DATE_PRS_STRPTIME #define DUK_USE_DATE_FMT_STRFTIME #include <endian.h> #include <sys/param.h> #include <sys/time.h> #include <time.h> #define DUK_USE_OS_STRING "flashplayer" #if !defined(DUK_USE_BYTEORDER) && defined(DUK_F_FLASHPLAYER) #define DUK_USE_BYTEORDER 1 #endif #elif defined(DUK_F_QNX) /* --- QNX --- */ #if defined(DUK_F_QNX) && defined(DUK_COMPILING_DUKTAPE) /* See: /opt/qnx650/target/qnx6/usr/include/sys/platform.h */ #define _XOPEN_SOURCE 600 #define _POSIX_C_SOURCE 200112L #endif #define DUK_USE_DATE_NOW_GETTIMEOFDAY #define DUK_USE_DATE_TZO_GMTIME_R #define DUK_USE_DATE_PRS_STRPTIME #define DUK_USE_DATE_FMT_STRFTIME #include <sys/types.h> #include <sys/param.h> #include <sys/time.h> #include <time.h> #define DUK_USE_OS_STRING "qnx" #elif defined(DUK_F_TINSPIRE) /* --- TI-Nspire --- */ #if defined(DUK_COMPILING_DUKTAPE) && !defined(_XOPEN_SOURCE) #define _XOPEN_SOURCE /* e.g. strptime */ #endif #define DUK_USE_DATE_NOW_GETTIMEOFDAY #define DUK_USE_DATE_TZO_GMTIME_R #define DUK_USE_DATE_PRS_STRPTIME #define DUK_USE_DATE_FMT_STRFTIME #include <sys/types.h> #include <sys/param.h> #include <sys/time.h> #include <time.h> #define DUK_USE_OS_STRING "tinspire" #elif defined(DUK_F_EMSCRIPTEN) /* --- Emscripten --- */ #if defined(DUK_COMPILING_DUKTAPE) #if !defined(_POSIX_C_SOURCE) #define _POSIX_C_SOURCE 200809L #endif #if !defined(_GNU_SOURCE) #define _GNU_SOURCE /* e.g. getdate_r */ #endif #if !defined(_XOPEN_SOURCE) #define _XOPEN_SOURCE /* e.g. strptime */ #endif #endif /* DUK_COMPILING_DUKTAPE */ #include <sys/types.h> #if defined(DUK_F_BCC) /* no endian.h */ #else #include <endian.h> #endif /* DUK_F_BCC */ #include <sys/param.h> #include <sys/time.h> #include <time.h> #include <stdint.h> #define DUK_USE_DATE_NOW_GETTIMEOFDAY #define DUK_USE_DATE_TZO_GMTIME_R #define DUK_USE_DATE_PRS_STRPTIME #define DUK_USE_DATE_FMT_STRFTIME #define DUK_USE_OS_STRING "emscripten" #elif defined(DUK_F_LINUX) /* --- Linux --- */ #if defined(DUK_COMPILING_DUKTAPE) #if !defined(_POSIX_C_SOURCE) #define _POSIX_C_SOURCE 200809L #endif #if !defined(_GNU_SOURCE) #define _GNU_SOURCE /* e.g. getdate_r */ #endif #if !defined(_XOPEN_SOURCE) #define _XOPEN_SOURCE /* e.g. strptime */ #endif #endif /* DUK_COMPILING_DUKTAPE */ #include <sys/types.h> #if defined(DUK_F_BCC) /* no endian.h or stdint.h */ #else #include <endian.h> #include <stdint.h> #endif /* DUK_F_BCC */ #include <sys/param.h> #include <sys/time.h> #include <time.h> #define DUK_USE_DATE_NOW_GETTIMEOFDAY #define DUK_USE_DATE_TZO_GMTIME_R #define DUK_USE_DATE_PRS_STRPTIME #define DUK_USE_DATE_FMT_STRFTIME #if 0 /* XXX: safe condition? */ #define DUK_USE_GET_MONOTONIC_TIME_CLOCK_GETTIME #endif #define DUK_USE_OS_STRING "linux" #elif defined(DUK_F_SUN) /* --- Solaris --- */ #define DUK_USE_DATE_NOW_GETTIMEOFDAY #define DUK_USE_DATE_TZO_GMTIME_R #define DUK_USE_DATE_PRS_STRPTIME #define DUK_USE_DATE_FMT_STRFTIME #include <sys/types.h> #if defined(DUK_F_OLD_SOLARIS) /* Old Solaris with no endian.h, stdint.h */ #define DUK_F_NO_STDINT_H #if !defined(DUK_USE_BYTEORDER) #define DUK_USE_BYTEORDER 3 #endif #else /* DUK_F_OLD_SOLARIS */ #include <ast/endian.h> #endif /* DUK_F_OLD_SOLARIS */ #include <sys/param.h> #include <sys/time.h> #include <time.h> #define DUK_USE_OS_STRING "solaris" #elif defined(DUK_F_AIX) /* --- AIX --- */ #if !defined(DUK_USE_BYTEORDER) #define DUK_USE_BYTEORDER 3 #endif #define DUK_USE_DATE_NOW_GETTIMEOFDAY #define DUK_USE_DATE_TZO_GMTIME_R #define DUK_USE_DATE_PRS_STRPTIME #define DUK_USE_DATE_FMT_STRFTIME #include <sys/param.h> #include <sys/time.h> #include <time.h> #define DUK_USE_OS_STRING "aix" #elif defined(DUK_F_HPUX) /* --- HPUX --- */ #define DUK_F_NO_STDINT_H #if !defined(DUK_USE_BYTEORDER) #define DUK_USE_BYTEORDER 3 #endif #define DUK_USE_DATE_NOW_GETTIMEOFDAY #define DUK_USE_DATE_TZO_GMTIME_R #define DUK_USE_DATE_PRS_STRPTIME #define DUK_USE_DATE_FMT_STRFTIME #include <sys/param.h> #include <sys/time.h> #include <time.h> #define DUK_USE_OS_STRING "hpux" #elif defined(DUK_F_POSIX) /* --- Generic POSIX --- */ #define DUK_USE_DATE_NOW_GETTIMEOFDAY #define DUK_USE_DATE_TZO_GMTIME_R #define DUK_USE_DATE_PRS_STRPTIME #define DUK_USE_DATE_FMT_STRFTIME #include <sys/types.h> #include <endian.h> #include <sys/param.h> #include <sys/time.h> #include <time.h> #define DUK_USE_OS_STRING "posix" #elif defined(DUK_F_CYGWIN) /* --- Cygwin --- */ /* don't use strptime() for now */ #define DUK_USE_DATE_NOW_GETTIMEOFDAY #define DUK_USE_DATE_TZO_GMTIME_R #define DUK_USE_DATE_FMT_STRFTIME #include <sys/types.h> #include <endian.h> #include <sys/param.h> #include <sys/time.h> #include <time.h> #define DUK_JMPBUF_TYPE jmp_buf #define DUK_SETJMP(jb) _setjmp((jb)) #define DUK_LONGJMP(jb) _longjmp((jb), 1) #define DUK_USE_OS_STRING "windows" #elif defined(DUK_F_UNIX) /* --- Generic UNIX --- */ #define DUK_USE_DATE_NOW_GETTIMEOFDAY #define DUK_USE_DATE_TZO_GMTIME_R #define DUK_USE_DATE_PRS_STRPTIME #define DUK_USE_DATE_FMT_STRFTIME #include <time.h> #include <sys/time.h> #define DUK_USE_OS_STRING "unknown" #else /* --- Generic fallback --- */ /* The most portable current time provider is time(), but it only has a * one second resolution. */ #define DUK_USE_DATE_NOW_TIME /* The most portable way to figure out local time offset is gmtime(), * but it's not thread safe so use with caution. */ #define DUK_USE_DATE_TZO_GMTIME /* Avoid custom date parsing and formatting for portability. */ #undef DUK_USE_DATE_PRS_STRPTIME #undef DUK_USE_DATE_FMT_STRFTIME /* Rely on C89 headers only; time.h must be here. */ #include <time.h> #define DUK_USE_OS_STRING "unknown" #endif /* autodetect platform */ /* Shared includes: C89 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdarg.h> /* varargs */ #include <setjmp.h> #include <stddef.h> /* e.g. ptrdiff_t */ #include <math.h> #include <limits.h> /* date.h is omitted, and included per platform */ /* Shared includes: stdint.h is C99 */ #if defined(DUK_F_NO_STDINT_H) /* stdint.h not available */ #else /* Technically C99 (C++11) but found in many systems. On some systems * __STDC_LIMIT_MACROS and __STDC_CONSTANT_MACROS must be defined before * including stdint.h (see above). */ #include <stdint.h> #endif #if defined(DUK_F_CPP) #include <exception> /* std::exception */ #endif /* * Architecture autodetection */ #if defined(DUK_F_X86) /* --- x86 --- */ #define DUK_USE_ARCH_STRING "x86" #if !defined(DUK_USE_BYTEORDER) #define DUK_USE_BYTEORDER 1 #endif /* XXX: This is technically not guaranteed because it's possible to configure * an x86 to require aligned accesses with Alignment Check (AC) flag. */ #if !defined(DUK_USE_ALIGN_BY) #define DUK_USE_ALIGN_BY 1 #endif #define DUK_USE_PACKED_TVAL #define DUK_F_PACKED_TVAL_PROVIDED #elif defined(DUK_F_X64) /* --- x64 --- */ #define DUK_USE_ARCH_STRING "x64" #if !defined(DUK_USE_BYTEORDER) #define DUK_USE_BYTEORDER 1 #endif /* XXX: This is technically not guaranteed because it's possible to configure * an x86 to require aligned accesses with Alignment Check (AC) flag. */ #if !defined(DUK_USE_ALIGN_BY) #define DUK_USE_ALIGN_BY 1 #endif #undef DUK_USE_PACKED_TVAL #define DUK_F_PACKED_TVAL_PROVIDED #elif defined(DUK_F_X32) /* --- x32 --- */ #define DUK_USE_ARCH_STRING "x32" #if !defined(DUK_USE_BYTEORDER) #define DUK_USE_BYTEORDER 1 #endif /* XXX: This is technically not guaranteed because it's possible to configure * an x86 to require aligned accesses with Alignment Check (AC) flag. */ #if !defined(DUK_USE_ALIGN_BY) #define DUK_USE_ALIGN_BY 1 #endif #define DUK_USE_PACKED_TVAL #define DUK_F_PACKED_TVAL_PROVIDED #elif defined(DUK_F_ARM32) /* --- ARM 32-bit --- */ #define DUK_USE_ARCH_STRING "arm32" /* Byte order varies, so rely on autodetect. */ #if !defined(DUK_USE_ALIGN_BY) #define DUK_USE_ALIGN_BY 4 #endif #define DUK_USE_PACKED_TVAL #define DUK_F_PACKED_TVAL_PROVIDED #elif defined(DUK_F_ARM64) /* --- ARM 64-bit --- */ #define DUK_USE_ARCH_STRING "arm64" /* Byte order varies, so rely on autodetect. */ #if !defined(DUK_USE_ALIGN_BY) #define DUK_USE_ALIGN_BY 8 #endif #undef DUK_USE_PACKED_TVAL #define DUK_F_PACKED_TVAL_PROVIDED #elif defined(DUK_F_MIPS32) /* --- MIPS 32-bit --- */ #define DUK_USE_ARCH_STRING "mips32" /* MIPS byte order varies so rely on autodetection. */ #if !defined(DUK_USE_ALIGN_BY) #define DUK_USE_ALIGN_BY 8 #endif #define DUK_USE_PACKED_TVAL #define DUK_F_PACKED_TVAL_PROVIDED #elif defined(DUK_F_MIPS64) /* --- MIPS 64-bit --- */ #define DUK_USE_ARCH_STRING "mips64" /* MIPS byte order varies so rely on autodetection. */ #if !defined(DUK_USE_ALIGN_BY) #define DUK_USE_ALIGN_BY 8 #endif #undef DUK_USE_PACKED_TVAL #define DUK_F_PACKED_TVAL_PROVIDED #elif defined(DUK_F_PPC32) /* --- PowerPC 32-bit --- */ #define DUK_USE_ARCH_STRING "ppc32" #if !defined(DUK_USE_BYTEORDER) #define DUK_USE_BYTEORDER 3 #endif #if !defined(DUK_USE_ALIGN_BY) #define DUK_USE_ALIGN_BY 8 #endif #define DUK_USE_PACKED_TVAL #define DUK_F_PACKED_TVAL_PROVIDED #elif defined(DUK_F_PPC64) /* --- PowerPC 64-bit --- */ #define DUK_USE_ARCH_STRING "ppc64" #if !defined(DUK_USE_BYTEORDER) #define DUK_USE_BYTEORDER 3 #endif #if !defined(DUK_USE_ALIGN_BY) #define DUK_USE_ALIGN_BY 8 #endif #undef DUK_USE_PACKED_TVAL #define DUK_F_PACKED_TVAL_PROVIDED #elif defined(DUK_F_SPARC32) /* --- SPARC 32-bit --- */ #define DUK_USE_ARCH_STRING "sparc32" /* SPARC byte order varies so rely on autodetection. */ #if !defined(DUK_USE_ALIGN_BY) #define DUK_USE_ALIGN_BY 8 #endif #define DUK_USE_PACKED_TVAL #define DUK_F_PACKED_TVAL_PROVIDED #elif defined(DUK_F_SPARC64) /* --- SPARC 64-bit --- */ #define DUK_USE_ARCH_STRING "sparc64" /* SPARC byte order varies so rely on autodetection. */ #if !defined(DUK_USE_ALIGN_BY) #define DUK_USE_ALIGN_BY 8 #endif #undef DUK_USE_PACKED_TVAL #define DUK_F_PACKED_TVAL_PROVIDED #elif defined(DUK_F_SUPERH) /* --- SuperH --- */ #define DUK_USE_ARCH_STRING "sh" /* Byte order varies, rely on autodetection. */ /* Based on 'make checkalign' there are no alignment requirements on * Linux SH4, but align by 4 is probably a good basic default. */ #if !defined(DUK_USE_ALIGN_BY) #define DUK_USE_ALIGN_BY 4 #endif #define DUK_USE_PACKED_TVAL #define DUK_F_PACKED_TVAL_PROVIDED #elif defined(DUK_F_M68K) /* --- Motorola 68k --- */ #define DUK_USE_ARCH_STRING "m68k" #if !defined(DUK_USE_BYTEORDER) #define DUK_USE_BYTEORDER 3 #endif #if !defined(DUK_USE_ALIGN_BY) #define DUK_USE_ALIGN_BY 8 #endif #define DUK_USE_PACKED_TVAL #define DUK_F_PACKED_TVAL_PROVIDED #elif defined(DUK_F_EMSCRIPTEN) /* --- Emscripten --- */ #define DUK_USE_ARCH_STRING "emscripten" #if !defined(DUK_USE_BYTEORDER) #define DUK_USE_BYTEORDER 1 #endif #if !defined(DUK_USE_ALIGN_BY) #define DUK_USE_ALIGN_BY 8 #endif #undef DUK_USE_PACKED_TVAL #define DUK_F_PACKED_TVAL_PROVIDED #else /* --- Generic --- */ /* These are necessary wild guesses. */ #define DUK_USE_ARCH_STRING "generic" /* Rely on autodetection for byte order, alignment, and packed tval. */ #endif /* autodetect architecture */ /* * Compiler autodetection */ #if defined(DUK_F_CLANG) /* --- Clang --- */ #if defined(DUK_F_C99) || defined(DUK_F_CPP11) /* C99 / C++11 and above: rely on va_copy() which is required. */ #define DUK_VA_COPY(dest,src) va_copy(dest,src) #else /* Clang: assume we have __va_copy() in non-C99 mode. */ #define DUK_VA_COPY(dest,src) __va_copy(dest,src) #endif #define DUK_NORETURN(decl) decl __attribute__((noreturn)) #if defined(__clang__) && defined(__has_builtin) #if __has_builtin(__builtin_unreachable) #define DUK_UNREACHABLE() do { __builtin_unreachable(); } while (0) #endif #endif #define DUK_USE_BRANCH_HINTS #define DUK_LIKELY(x) __builtin_expect((x), 1) #define DUK_UNLIKELY(x) __builtin_expect((x), 0) #if defined(__clang__) && defined(__has_builtin) #if __has_builtin(__builtin_unpredictable) #define DUK_UNPREDICTABLE(x) __builtin_unpredictable((x)) #endif #endif #if defined(DUK_F_C99) || defined(DUK_F_CPP11) #define DUK_NOINLINE __attribute__((noinline)) #define DUK_INLINE inline #define DUK_ALWAYS_INLINE inline __attribute__((always_inline)) #endif /* DUK_HOT */ /* DUK_COLD */ #if defined(DUK_F_DLL_BUILD) && defined(DUK_F_WINDOWS) /* MSVC dllexport/dllimport: appropriate __declspec depends on whether we're * compiling Duktape or the application. */ #if defined(DUK_COMPILING_DUKTAPE) #define DUK_EXTERNAL_DECL extern __declspec(dllexport) #define DUK_EXTERNAL __declspec(dllexport) #else #define DUK_EXTERNAL_DECL extern __declspec(dllimport) #define DUK_EXTERNAL should_not_happen #endif #if defined(DUK_SINGLE_FILE) #define DUK_INTERNAL_DECL static #define DUK_INTERNAL static #else #define DUK_INTERNAL_DECL extern #define DUK_INTERNAL /*empty*/ #endif #define DUK_LOCAL_DECL static #define DUK_LOCAL static #else #define DUK_EXTERNAL_DECL __attribute__ ((visibility("default"))) extern #define DUK_EXTERNAL __attribute__ ((visibility("default"))) #if defined(DUK_SINGLE_FILE) #if (defined(DUK_F_GCC_VERSION) && DUK_F_GCC_VERSION >= 30101) || defined(DUK_F_CLANG) /* Minimize warnings for unused internal functions with GCC >= 3.1.1 and * Clang. Based on documentation it should suffice to have the attribute * in the declaration only, but in practice some warnings are generated unless * the attribute is also applied to the definition. */ #define DUK_INTERNAL_DECL static __attribute__ ((unused)) #define DUK_INTERNAL static __attribute__ ((unused)) #else #define DUK_INTERNAL_DECL static #define DUK_INTERNAL static #endif #else #if (defined(DUK_F_GCC_VERSION) && DUK_F_GCC_VERSION >= 30101) || defined(DUK_F_CLANG) #define DUK_INTERNAL_DECL __attribute__ ((visibility("hidden"))) __attribute__ ((unused)) extern #define DUK_INTERNAL __attribute__ ((visibility("hidden"))) __attribute__ ((unused)) #else #define DUK_INTERNAL_DECL __attribute__ ((visibility("hidden"))) extern #define DUK_INTERNAL __attribute__ ((visibility("hidden"))) #endif #endif #define DUK_LOCAL_DECL static #define DUK_LOCAL static #endif #if defined(DUK_F_CPP) #define DUK_USE_COMPILER_STRING "clang" #else #define DUK_USE_COMPILER_STRING "clang" #endif #undef DUK_USE_VARIADIC_MACROS #if defined(DUK_F_C99) || defined(DUK_F_CPP11) #define DUK_USE_VARIADIC_MACROS #endif #define DUK_USE_UNION_INITIALIZERS #undef DUK_USE_FLEX_C99 #undef DUK_USE_FLEX_ZEROSIZE #undef DUK_USE_FLEX_ONESIZE #if defined(DUK_F_C99) #define DUK_USE_FLEX_C99 #else #define DUK_USE_FLEX_ZEROSIZE #endif #undef DUK_USE_GCC_PRAGMAS #define DUK_USE_PACK_CLANG_ATTR #elif defined(DUK_F_GCC) /* --- GCC --- */ #if defined(DUK_F_C99) || defined(DUK_F_CPP11) /* C99 / C++11 and above: rely on va_copy() which is required. */ #define DUK_VA_COPY(dest,src) va_copy(dest,src) #else /* GCC: assume we have __va_copy() in non-C99 mode. */ #define DUK_VA_COPY(dest,src) __va_copy(dest,src) #endif #if defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 20500L) /* since gcc-2.5 */ #define DUK_NORETURN(decl) decl __attribute__((noreturn)) #endif #if defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 40500L) /* since gcc-4.5 */ #define DUK_UNREACHABLE() do { __builtin_unreachable(); } while (0) #endif #define DUK_USE_BRANCH_HINTS #if defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 40500L) /* GCC: test not very accurate; enable only in relatively recent builds * because of bugs in gcc-4.4 (http://lists.debian.org/debian-gcc/2010/04/msg00000.html) */ #define DUK_LIKELY(x) __builtin_expect((x), 1) #define DUK_UNLIKELY(x) __builtin_expect((x), 0) #endif /* XXX: equivalent of clang __builtin_unpredictable? */ #if (defined(DUK_F_C99) || defined(DUK_F_CPP11)) && \ defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 30101) #define DUK_NOINLINE __attribute__((noinline)) #define DUK_INLINE inline #define DUK_ALWAYS_INLINE inline __attribute__((always_inline)) #endif #if (defined(DUK_F_C99) || defined(DUK_F_CPP11)) && \ defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 40300) #define DUK_HOT __attribute__((hot)) #define DUK_COLD __attribute__((cold)) #endif #if defined(DUK_F_DLL_BUILD) && defined(DUK_F_WINDOWS) /* MSVC dllexport/dllimport: appropriate __declspec depends on whether we're * compiling Duktape or the application. */ #if defined(DUK_COMPILING_DUKTAPE) #define DUK_EXTERNAL_DECL extern __declspec(dllexport) #define DUK_EXTERNAL __declspec(dllexport) #else #define DUK_EXTERNAL_DECL extern __declspec(dllimport) #define DUK_EXTERNAL should_not_happen #endif #if defined(DUK_SINGLE_FILE) #define DUK_INTERNAL_DECL static #define DUK_INTERNAL static #else #define DUK_INTERNAL_DECL extern #define DUK_INTERNAL /*empty*/ #endif #define DUK_LOCAL_DECL static #define DUK_LOCAL static #elif defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 40000) #define DUK_EXTERNAL_DECL __attribute__ ((visibility("default"))) extern #define DUK_EXTERNAL __attribute__ ((visibility("default"))) #if defined(DUK_SINGLE_FILE) #if (defined(DUK_F_GCC_VERSION) && DUK_F_GCC_VERSION >= 30101) || defined(DUK_F_CLANG) /* Minimize warnings for unused internal functions with GCC >= 3.1.1 and * Clang. Based on documentation it should suffice to have the attribute * in the declaration only, but in practice some warnings are generated unless * the attribute is also applied to the definition. */ #define DUK_INTERNAL_DECL static __attribute__ ((unused)) #define DUK_INTERNAL static __attribute__ ((unused)) #else #define DUK_INTERNAL_DECL static #define DUK_INTERNAL static #endif #else #if (defined(DUK_F_GCC_VERSION) && DUK_F_GCC_VERSION >= 30101) || defined(DUK_F_CLANG) #define DUK_INTERNAL_DECL __attribute__ ((visibility("hidden"))) __attribute__ ((unused)) extern #define DUK_INTERNAL __attribute__ ((visibility("hidden"))) __attribute__ ((unused)) #else #define DUK_INTERNAL_DECL __attribute__ ((visibility("hidden"))) extern #define DUK_INTERNAL __attribute__ ((visibility("hidden"))) #endif #endif #define DUK_LOCAL_DECL static #define DUK_LOCAL static #endif #if defined(DUK_F_MINGW) #if defined(DUK_F_CPP) #define DUK_USE_COMPILER_STRING "mingw++" #else #define DUK_USE_COMPILER_STRING "mingw" #endif #else #if defined(DUK_F_CPP) #define DUK_USE_COMPILER_STRING "g++" #else #define DUK_USE_COMPILER_STRING "gcc" #endif #endif #undef DUK_USE_VARIADIC_MACROS #if defined(DUK_F_C99) || (defined(DUK_F_CPP11) && defined(__GNUC__)) #define DUK_USE_VARIADIC_MACROS #endif #define DUK_USE_UNION_INITIALIZERS #undef DUK_USE_FLEX_C99 #undef DUK_USE_FLEX_ZEROSIZE #undef DUK_USE_FLEX_ONESIZE #if defined(DUK_F_C99) #define DUK_USE_FLEX_C99 #else #define DUK_USE_FLEX_ZEROSIZE #endif #if defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 40600) #define DUK_USE_GCC_PRAGMAS #else #undef DUK_USE_GCC_PRAGMAS #endif #define DUK_USE_PACK_GCC_ATTR #elif defined(DUK_F_MSVC) /* --- MSVC --- */ /* http://msdn.microsoft.com/en-us/library/aa235362(VS.60).aspx */ #define DUK_NORETURN(decl) __declspec(noreturn) decl /* XXX: DUK_UNREACHABLE for msvc? */ #undef DUK_USE_BRANCH_HINTS /* XXX: DUK_LIKELY, DUK_UNLIKELY for msvc? */ /* XXX: DUK_NOINLINE, DUK_INLINE, DUK_ALWAYS_INLINE for msvc? */ #if defined(DUK_F_DLL_BUILD) && defined(DUK_F_WINDOWS) /* MSVC dllexport/dllimport: appropriate __declspec depends on whether we're * compiling Duktape or the application. */ #if defined(DUK_COMPILING_DUKTAPE) #define DUK_EXTERNAL_DECL extern __declspec(dllexport) #define DUK_EXTERNAL __declspec(dllexport) #else #define DUK_EXTERNAL_DECL extern __declspec(dllimport) #define DUK_EXTERNAL should_not_happen #endif #if defined(DUK_SINGLE_FILE) #define DUK_INTERNAL_DECL static #define DUK_INTERNAL static #else #define DUK_INTERNAL_DECL extern #define DUK_INTERNAL /*empty*/ #endif #define DUK_LOCAL_DECL static #define DUK_LOCAL static #endif #if defined(DUK_F_CPP) #define DUK_USE_COMPILER_STRING "msvc++" #else #define DUK_USE_COMPILER_STRING "msvc" #endif #undef DUK_USE_VARIADIC_MACROS #if defined(DUK_F_C99) #define DUK_USE_VARIADIC_MACROS #elif defined(_MSC_VER) && (_MSC_VER >= 1400) /* VS2005+ should have variadic macros even when they're not C99. */ #define DUK_USE_VARIADIC_MACROS #endif #undef DUK_USE_UNION_INITIALIZERS #if defined(_MSC_VER) && (_MSC_VER >= 1800) /* VS2013+ supports union initializers but there's a bug involving union-inside-struct: * https://connect.microsoft.com/VisualStudio/feedback/details/805981 * The bug was fixed (at least) in VS2015 so check for VS2015 for now: * https://blogs.msdn.microsoft.com/vcblog/2015/07/01/c-compiler-front-end-fixes-in-vs2015/ * Manually tested using VS2013, CL reports 18.00.31101, so enable for VS2013 too. */ #define DUK_USE_UNION_INITIALIZERS #endif #undef DUK_USE_FLEX_C99 #undef DUK_USE_FLEX_ZEROSIZE #undef DUK_USE_FLEX_ONESIZE #if defined(DUK_F_C99) #define DUK_USE_FLEX_C99 #else #define DUK_USE_FLEX_ZEROSIZE #endif #undef DUK_USE_GCC_PRAGMAS #define DUK_USE_PACK_MSVC_PRAGMA /* These have been tested from VS2008 onwards; may work in older VS versions * too but not enabled by default. */ #if defined(_MSC_VER) && (_MSC_VER >= 1500) #define DUK_NOINLINE __declspec(noinline) #define DUK_INLINE __inline #define DUK_ALWAYS_INLINE __forceinline #endif #if defined(_MSC_VER) && (_MSC_VER >= 1900) #define DUK_SNPRINTF snprintf #define DUK_VSNPRINTF vsnprintf #else /* (v)snprintf() is missing before MSVC 2015. Note that _(v)snprintf() does * NOT NUL terminate on truncation, but Duktape code never assumes that. * http://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010 */ #define DUK_SNPRINTF _snprintf #define DUK_VSNPRINTF _vsnprintf #endif /* Avoid warning when doing DUK_UNREF(some_function). */ #if defined(_MSC_VER) && (_MSC_VER < 1500) #pragma warning(disable: 4100 4101 4550 4551) #define DUK_UNREF(x) #else #define DUK_UNREF(x) do { __pragma(warning(suppress:4100 4101 4550 4551)) (x); } while (0) #endif /* Older versions of MSVC don't support the LL/ULL suffix. */ #define DUK_U64_CONSTANT(x) x##ui64 #define DUK_I64_CONSTANT(x) x##i64 #elif defined(DUK_F_EMSCRIPTEN) /* --- Emscripten --- */ #define DUK_NORETURN(decl) decl __attribute__((noreturn)) #if defined(__clang__) && defined(__has_builtin) #if __has_builtin(__builtin_unreachable) #define DUK_UNREACHABLE() do { __builtin_unreachable(); } while (0) #endif #endif #define DUK_USE_BRANCH_HINTS #define DUK_LIKELY(x) __builtin_expect((x), 1) #define DUK_UNLIKELY(x) __builtin_expect((x), 0) #if defined(__clang__) && defined(__has_builtin) #if __has_builtin(__builtin_unpredictable) #define DUK_UNPREDICTABLE(x) __builtin_unpredictable((x)) #endif #endif #if defined(DUK_F_C99) || defined(DUK_F_CPP11) #define DUK_NOINLINE __attribute__((noinline)) #define DUK_INLINE inline #define DUK_ALWAYS_INLINE inline __attribute__((always_inline)) #endif #define DUK_EXTERNAL_DECL __attribute__ ((visibility("default"))) extern #define DUK_EXTERNAL __attribute__ ((visibility("default"))) #if defined(DUK_SINGLE_FILE) #if (defined(DUK_F_GCC_VERSION) && DUK_F_GCC_VERSION >= 30101) || defined(DUK_F_CLANG) /* Minimize warnings for unused internal functions with GCC >= 3.1.1 and * Clang. Based on documentation it should suffice to have the attribute * in the declaration only, but in practice some warnings are generated unless * the attribute is also applied to the definition. */ #define DUK_INTERNAL_DECL static __attribute__ ((unused)) #define DUK_INTERNAL static __attribute__ ((unused)) #else #define DUK_INTERNAL_DECL static #define DUK_INTERNAL static #endif #else #if (defined(DUK_F_GCC_VERSION) && DUK_F_GCC_VERSION >= 30101) || defined(DUK_F_CLANG) #define DUK_INTERNAL_DECL __attribute__ ((visibility("hidden"))) __attribute__ ((unused)) extern #define DUK_INTERNAL __attribute__ ((visibility("hidden"))) __attribute__ ((unused)) #else #define DUK_INTERNAL_DECL __attribute__ ((visibility("hidden"))) extern #define DUK_INTERNAL __attribute__ ((visibility("hidden"))) #endif #endif #define DUK_LOCAL_DECL static #define DUK_LOCAL static #define DUK_USE_COMPILER_STRING "emscripten" #undef DUK_USE_VARIADIC_MACROS #if defined(DUK_F_C99) || defined(DUK_F_CPP11) #define DUK_USE_VARIADIC_MACROS #endif #define DUK_USE_UNION_INITIALIZERS #undef DUK_USE_FLEX_C99 #undef DUK_USE_FLEX_ZEROSIZE #undef DUK_USE_FLEX_ONESIZE #if defined(DUK_F_C99) #define DUK_USE_FLEX_C99 #else #define DUK_USE_FLEX_ZEROSIZE #endif #undef DUK_USE_GCC_PRAGMAS #define DUK_USE_PACK_CLANG_ATTR #elif defined(DUK_F_TINYC) /* --- TinyC --- */ #undef DUK_USE_BRANCH_HINTS #if defined(DUK_F_CPP) #define DUK_USE_COMPILER_STRING "tinyc++" #else #define DUK_USE_COMPILER_STRING "tinyc" #endif /* http://bellard.org/tcc/tcc-doc.html#SEC7 */ #define DUK_USE_VARIADIC_MACROS #define DUK_USE_UNION_INITIALIZERS /* Most portable, wastes space */ #define DUK_USE_FLEX_ONESIZE /* Most portable, potentially wastes space */ #define DUK_USE_PACK_DUMMY_MEMBER #elif defined(DUK_F_VBCC) /* --- VBCC --- */ #undef DUK_USE_BRANCH_HINTS #if defined(DUK_F_CPP) #define DUK_USE_COMPILER_STRING "vbcc-c++" #else #define DUK_USE_COMPILER_STRING "vbcc" #endif #undef DUK_USE_VARIADIC_MACROS #if defined(DUK_F_C99) || defined(DUK_F_CPP11) #define DUK_USE_VARIADIC_MACROS #endif /* VBCC supports C99 so check only for C99 for union initializer support. * Designated union initializers would possibly work even without a C99 check. */ #undef DUK_USE_UNION_INITIALIZERS #if defined(DUK_F_C99) #define DUK_USE_UNION_INITIALIZERS #endif #define DUK_USE_FLEX_ZEROSIZE #define DUK_USE_PACK_DUMMY_MEMBER #elif defined(DUK_F_BCC) /* --- Bruce's C compiler --- */ #undef DUK_USE_BRANCH_HINTS #if defined(DUK_F_CPP) #define DUK_USE_COMPILER_STRING "bcc++" #else #define DUK_USE_COMPILER_STRING "bcc" #endif /* Most portable */ #undef DUK_USE_VARIADIC_MACROS /* Most portable, wastes space */ #undef DUK_USE_UNION_INITIALIZERS /* Most portable, wastes space */ #define DUK_USE_FLEX_ONESIZE /* Most portable, potentially wastes space */ #define DUK_USE_PACK_DUMMY_MEMBER /* BCC, assume we're on x86. */ #if !defined(DUK_USE_BYTEORDER) #define DUK_USE_BYTEORDER 1 #endif #else /* --- Generic --- */ #undef DUK_USE_BRANCH_HINTS #if defined(DUK_F_CPP) #define DUK_USE_COMPILER_STRING "generic-c++" #else #define DUK_USE_COMPILER_STRING "generic" #endif #undef DUK_USE_VARIADIC_MACROS #if defined(DUK_F_C99) || defined(DUK_F_CPP11) #define DUK_USE_VARIADIC_MACROS #endif /* C++ doesn't have standard designated union initializers ({ .foo = 1 }). */ #undef DUK_USE_UNION_INITIALIZERS #if defined(DUK_F_C99) #define DUK_USE_UNION_INITIALIZERS #endif /* Most portable, wastes space */ #define DUK_USE_FLEX_ONESIZE /* Most portable, potentially wastes space */ #define DUK_USE_PACK_DUMMY_MEMBER #endif /* autodetect compiler */ /* uclibc */ #if defined(__UCLIBC__) #define DUK_F_UCLIBC #endif /* * Wrapper typedefs and constants for integer types, also sanity check types. * * C99 typedefs are quite good but not always available, and we want to avoid * forcibly redefining the C99 typedefs. So, there are Duktape wrappers for * all C99 typedefs and Duktape code should only use these typedefs. Type * detection when C99 is not supported is best effort and may end up detecting * some types incorrectly. * * Pointer sizes are a portability problem: pointers to different types may * have a different size and function pointers are very difficult to manage * portably. * * http://en.wikipedia.org/wiki/C_data_types#Fixed-width_integer_types * * Note: there's an interesting corner case when trying to define minimum * signed integer value constants which leads to the current workaround of * defining e.g. -0x80000000 as (-0x7fffffffL - 1L). See doc/code-issues.txt * for a longer discussion. * * Note: avoid typecasts and computations in macro integer constants as they * can then no longer be used in macro relational expressions (such as * #if DUK_SIZE_MAX < 0xffffffffUL). There is internal code which relies on * being able to compare DUK_SIZE_MAX against a limit. */ /* XXX: add feature options to force basic types from outside? */ #if !defined(INT_MAX) #error INT_MAX not defined #endif /* Check that architecture is two's complement, standard C allows e.g. * INT_MIN to be -2**31+1 (instead of -2**31). */ #if defined(INT_MAX) && defined(INT_MIN) #if INT_MAX != -(INT_MIN + 1) #error platform does not seem complement of two #endif #else #error cannot check complement of two #endif /* Pointer size determination based on __WORDSIZE or architecture when * that's not available. */ #if defined(DUK_F_X86) || defined(DUK_F_X32) || \ defined(DUK_F_M68K) || defined(DUK_F_PPC32) || \ defined(DUK_F_BCC) || \ (defined(__WORDSIZE) && (__WORDSIZE == 32)) || \ ((defined(DUK_F_OLD_SOLARIS) || defined(DUK_F_AIX) || \ defined(DUK_F_HPUX)) && defined(_ILP32)) || \ defined(DUK_F_ARM32) #define DUK_F_32BIT_PTRS #elif defined(DUK_F_X64) || \ (defined(__WORDSIZE) && (__WORDSIZE == 64)) || \ ((defined(DUK_F_OLD_SOLARIS) || defined(DUK_F_AIX) || \ defined(DUK_F_HPUX)) && defined(_LP64)) || \ defined(DUK_F_ARM64) #define DUK_F_64BIT_PTRS #else /* not sure, not needed with C99 anyway */ #endif /* Intermediate define for 'have inttypes.h' */ #undef DUK_F_HAVE_INTTYPES #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \ !(defined(DUK_F_AMIGAOS) && defined(DUK_F_VBCC)) /* vbcc + AmigaOS has C99 but no inttypes.h */ #define DUK_F_HAVE_INTTYPES #elif defined(__cplusplus) && (__cplusplus >= 201103L) /* C++11 apparently ratified stdint.h */ #define DUK_F_HAVE_INTTYPES #endif /* Basic integer typedefs and limits, preferably from inttypes.h, otherwise * through automatic detection. */ #if defined(DUK_F_HAVE_INTTYPES) /* C99 or compatible */ #define DUK_F_HAVE_64BIT #include <inttypes.h> typedef uint8_t duk_uint8_t; typedef int8_t duk_int8_t; typedef uint16_t duk_uint16_t; typedef int16_t duk_int16_t; typedef uint32_t duk_uint32_t; typedef int32_t duk_int32_t; typedef uint64_t duk_uint64_t; typedef int64_t duk_int64_t; typedef uint_least8_t duk_uint_least8_t; typedef int_least8_t duk_int_least8_t; typedef uint_least16_t duk_uint_least16_t; typedef int_least16_t duk_int_least16_t; typedef uint_least32_t duk_uint_least32_t; typedef int_least32_t duk_int_least32_t; typedef uint_least64_t duk_uint_least64_t; typedef int_least64_t duk_int_least64_t; typedef uint_fast8_t duk_uint_fast8_t; typedef int_fast8_t duk_int_fast8_t; typedef uint_fast16_t duk_uint_fast16_t; typedef int_fast16_t duk_int_fast16_t; typedef uint_fast32_t duk_uint_fast32_t; typedef int_fast32_t duk_int_fast32_t; typedef uint_fast64_t duk_uint_fast64_t; typedef int_fast64_t duk_int_fast64_t; typedef uintptr_t duk_uintptr_t; typedef intptr_t duk_intptr_t; typedef uintmax_t duk_uintmax_t; typedef intmax_t duk_intmax_t; #define DUK_UINT8_MIN 0 #define DUK_UINT8_MAX UINT8_MAX #define DUK_INT8_MIN INT8_MIN #define DUK_INT8_MAX INT8_MAX #define DUK_UINT_LEAST8_MIN 0 #define DUK_UINT_LEAST8_MAX UINT_LEAST8_MAX #define DUK_INT_LEAST8_MIN INT_LEAST8_MIN #define DUK_INT_LEAST8_MAX INT_LEAST8_MAX #define DUK_UINT_FAST8_MIN 0 #define DUK_UINT_FAST8_MAX UINT_FAST8_MAX #define DUK_INT_FAST8_MIN INT_FAST8_MIN #define DUK_INT_FAST8_MAX INT_FAST8_MAX #define DUK_UINT16_MIN 0 #define DUK_UINT16_MAX UINT16_MAX #define DUK_INT16_MIN INT16_MIN #define DUK_INT16_MAX INT16_MAX #define DUK_UINT_LEAST16_MIN 0 #define DUK_UINT_LEAST16_MAX UINT_LEAST16_MAX #define DUK_INT_LEAST16_MIN INT_LEAST16_MIN #define DUK_INT_LEAST16_MAX INT_LEAST16_MAX #define DUK_UINT_FAST16_MIN 0 #define DUK_UINT_FAST16_MAX UINT_FAST16_MAX #define DUK_INT_FAST16_MIN INT_FAST16_MIN #define DUK_INT_FAST16_MAX INT_FAST16_MAX #define DUK_UINT32_MIN 0 #define DUK_UINT32_MAX UINT32_MAX #define DUK_INT32_MIN INT32_MIN #define DUK_INT32_MAX INT32_MAX #define DUK_UINT_LEAST32_MIN 0 #define DUK_UINT_LEAST32_MAX UINT_LEAST32_MAX #define DUK_INT_LEAST32_MIN INT_LEAST32_MIN #define DUK_INT_LEAST32_MAX INT_LEAST32_MAX #define DUK_UINT_FAST32_MIN 0 #define DUK_UINT_FAST32_MAX UINT_FAST32_MAX #define DUK_INT_FAST32_MIN INT_FAST32_MIN #define DUK_INT_FAST32_MAX INT_FAST32_MAX #define DUK_UINT64_MIN 0 #define DUK_UINT64_MAX UINT64_MAX #define DUK_INT64_MIN INT64_MIN #define DUK_INT64_MAX INT64_MAX #define DUK_UINT_LEAST64_MIN 0 #define DUK_UINT_LEAST64_MAX UINT_LEAST64_MAX #define DUK_INT_LEAST64_MIN INT_LEAST64_MIN #define DUK_INT_LEAST64_MAX INT_LEAST64_MAX #define DUK_UINT_FAST64_MIN 0 #define DUK_UINT_FAST64_MAX UINT_FAST64_MAX #define DUK_INT_FAST64_MIN INT_FAST64_MIN #define DUK_INT_FAST64_MAX INT_FAST64_MAX #define DUK_UINTPTR_MIN 0 #define DUK_UINTPTR_MAX UINTPTR_MAX #define DUK_INTPTR_MIN INTPTR_MIN #define DUK_INTPTR_MAX INTPTR_MAX #define DUK_UINTMAX_MIN 0 #define DUK_UINTMAX_MAX UINTMAX_MAX #define DUK_INTMAX_MIN INTMAX_MIN #define DUK_INTMAX_MAX INTMAX_MAX #define DUK_SIZE_MIN 0 #define DUK_SIZE_MAX SIZE_MAX #undef DUK_SIZE_MAX_COMPUTED #else /* C99 types */ /* When C99 types are not available, we use heuristic detection to get * the basic 8, 16, 32, and (possibly) 64 bit types. The fast/least * types are then assumed to be exactly the same for now: these could * be improved per platform but C99 types are very often now available. * 64-bit types are not available on all platforms; this is OK at least * on 32-bit platforms. * * This detection code is necessarily a bit hacky and can provide typedefs * and defines that won't work correctly on some exotic platform. */ #if (defined(CHAR_BIT) && (CHAR_BIT == 8)) || \ (defined(UCHAR_MAX) && (UCHAR_MAX == 255)) typedef unsigned char duk_uint8_t; typedef signed char duk_int8_t; #else #error cannot detect 8-bit type #endif #if defined(USHRT_MAX) && (USHRT_MAX == 65535UL) typedef unsigned short duk_uint16_t; typedef signed short duk_int16_t; #elif defined(UINT_MAX) && (UINT_MAX == 65535UL) /* On some platforms int is 16-bit but long is 32-bit (e.g. PureC) */ typedef unsigned int duk_uint16_t; typedef signed int duk_int16_t; #else #error cannot detect 16-bit type #endif #if defined(UINT_MAX) && (UINT_MAX == 4294967295UL) typedef unsigned int duk_uint32_t; typedef signed int duk_int32_t; #elif defined(ULONG_MAX) && (ULONG_MAX == 4294967295UL) /* On some platforms int is 16-bit but long is 32-bit (e.g. PureC) */ typedef unsigned long duk_uint32_t; typedef signed long duk_int32_t; #else #error cannot detect 32-bit type #endif /* 64-bit type detection is a bit tricky. * * ULLONG_MAX is a standard define. __LONG_LONG_MAX__ and __ULONG_LONG_MAX__ * are used by at least GCC (even if system headers don't provide ULLONG_MAX). * Some GCC variants may provide __LONG_LONG_MAX__ but not __ULONG_LONG_MAX__. * * ULL / LL constants are rejected / warned about by some compilers, even if * the compiler has a 64-bit type and the compiler/system headers provide an * unsupported constant (ULL/LL)! Try to avoid using ULL / LL constants. * As a side effect we can only check that e.g. ULONG_MAX is larger than 32 * bits but can't be sure it is exactly 64 bits. Self tests will catch such * cases. */ #undef DUK_F_HAVE_64BIT #if !defined(DUK_F_HAVE_64BIT) && defined(ULONG_MAX) #if (ULONG_MAX > 4294967295UL) #define DUK_F_HAVE_64BIT typedef unsigned long duk_uint64_t; typedef signed long duk_int64_t; #endif #endif #if !defined(DUK_F_HAVE_64BIT) && defined(ULLONG_MAX) #if (ULLONG_MAX > 4294967295UL) #define DUK_F_HAVE_64BIT typedef unsigned long long duk_uint64_t; typedef signed long long duk_int64_t; #endif #endif #if !defined(DUK_F_HAVE_64BIT) && defined(__ULONG_LONG_MAX__) #if (__ULONG_LONG_MAX__ > 4294967295UL) #define DUK_F_HAVE_64BIT typedef unsigned long long duk_uint64_t; typedef signed long long duk_int64_t; #endif #endif #if !defined(DUK_F_HAVE_64BIT) && defined(__LONG_LONG_MAX__) #if (__LONG_LONG_MAX__ > 2147483647L) #define DUK_F_HAVE_64BIT typedef unsigned long long duk_uint64_t; typedef signed long long duk_int64_t; #endif #endif #if !defined(DUK_F_HAVE_64BIT) && defined(DUK_F_MINGW) #define DUK_F_HAVE_64BIT typedef unsigned long duk_uint64_t; typedef signed long duk_int64_t; #endif #if !defined(DUK_F_HAVE_64BIT) && defined(DUK_F_MSVC) #define DUK_F_HAVE_64BIT typedef unsigned __int64 duk_uint64_t; typedef signed __int64 duk_int64_t; #endif #if !defined(DUK_F_HAVE_64BIT) /* cannot detect 64-bit type, not always needed so don't error */ #endif typedef duk_uint8_t duk_uint_least8_t; typedef duk_int8_t duk_int_least8_t; typedef duk_uint16_t duk_uint_least16_t; typedef duk_int16_t duk_int_least16_t; typedef duk_uint32_t duk_uint_least32_t; typedef duk_int32_t duk_int_least32_t; typedef duk_uint8_t duk_uint_fast8_t; typedef duk_int8_t duk_int_fast8_t; typedef duk_uint16_t duk_uint_fast16_t; typedef duk_int16_t duk_int_fast16_t; typedef duk_uint32_t duk_uint_fast32_t; typedef duk_int32_t duk_int_fast32_t; #if defined(DUK_F_HAVE_64BIT) typedef duk_uint64_t duk_uint_least64_t; typedef duk_int64_t duk_int_least64_t; typedef duk_uint64_t duk_uint_fast64_t; typedef duk_int64_t duk_int_fast64_t; #endif #if defined(DUK_F_HAVE_64BIT) typedef duk_uint64_t duk_uintmax_t; typedef duk_int64_t duk_intmax_t; #else typedef duk_uint32_t duk_uintmax_t; typedef duk_int32_t duk_intmax_t; #endif /* Note: the funny looking computations for signed minimum 16-bit, 32-bit, and * 64-bit values are intentional as the obvious forms (e.g. -0x80000000L) are * -not- portable. See code-issues.txt for a detailed discussion. */ #define DUK_UINT8_MIN 0UL #define DUK_UINT8_MAX 0xffUL #define DUK_INT8_MIN (-0x80L) #define DUK_INT8_MAX 0x7fL #define DUK_UINT_LEAST8_MIN 0UL #define DUK_UINT_LEAST8_MAX 0xffUL #define DUK_INT_LEAST8_MIN (-0x80L) #define DUK_INT_LEAST8_MAX 0x7fL #define DUK_UINT_FAST8_MIN 0UL #define DUK_UINT_FAST8_MAX 0xffUL #define DUK_INT_FAST8_MIN (-0x80L) #define DUK_INT_FAST8_MAX 0x7fL #define DUK_UINT16_MIN 0UL #define DUK_UINT16_MAX 0xffffUL #define DUK_INT16_MIN (-0x7fffL - 1L) #define DUK_INT16_MAX 0x7fffL #define DUK_UINT_LEAST16_MIN 0UL #define DUK_UINT_LEAST16_MAX 0xffffUL #define DUK_INT_LEAST16_MIN (-0x7fffL - 1L) #define DUK_INT_LEAST16_MAX 0x7fffL #define DUK_UINT_FAST16_MIN 0UL #define DUK_UINT_FAST16_MAX 0xffffUL #define DUK_INT_FAST16_MIN (-0x7fffL - 1L) #define DUK_INT_FAST16_MAX 0x7fffL #define DUK_UINT32_MIN 0UL #define DUK_UINT32_MAX 0xffffffffUL #define DUK_INT32_MIN (-0x7fffffffL - 1L) #define DUK_INT32_MAX 0x7fffffffL #define DUK_UINT_LEAST32_MIN 0UL #define DUK_UINT_LEAST32_MAX 0xffffffffUL #define DUK_INT_LEAST32_MIN (-0x7fffffffL - 1L) #define DUK_INT_LEAST32_MAX 0x7fffffffL #define DUK_UINT_FAST32_MIN 0UL #define DUK_UINT_FAST32_MAX 0xffffffffUL #define DUK_INT_FAST32_MIN (-0x7fffffffL - 1L) #define DUK_INT_FAST32_MAX 0x7fffffffL /* 64-bit constants. Since LL / ULL constants are not always available, * use computed values. These values can't be used in preprocessor * comparisons; flag them as such. */ #if defined(DUK_F_HAVE_64BIT) #define DUK_UINT64_MIN ((duk_uint64_t) 0) #define DUK_UINT64_MAX ((duk_uint64_t) -1) #define DUK_INT64_MIN ((duk_int64_t) (~(DUK_UINT64_MAX >> 1))) #define DUK_INT64_MAX ((duk_int64_t) (DUK_UINT64_MAX >> 1)) #define DUK_UINT_LEAST64_MIN DUK_UINT64_MIN #define DUK_UINT_LEAST64_MAX DUK_UINT64_MAX #define DUK_INT_LEAST64_MIN DUK_INT64_MIN #define DUK_INT_LEAST64_MAX DUK_INT64_MAX #define DUK_UINT_FAST64_MIN DUK_UINT64_MIN #define DUK_UINT_FAST64_MAX DUK_UINT64_MAX #define DUK_INT_FAST64_MIN DUK_INT64_MIN #define DUK_INT_FAST64_MAX DUK_INT64_MAX #define DUK_UINT64_MIN_COMPUTED #define DUK_UINT64_MAX_COMPUTED #define DUK_INT64_MIN_COMPUTED #define DUK_INT64_MAX_COMPUTED #define DUK_UINT_LEAST64_MIN_COMPUTED #define DUK_UINT_LEAST64_MAX_COMPUTED #define DUK_INT_LEAST64_MIN_COMPUTED #define DUK_INT_LEAST64_MAX_COMPUTED #define DUK_UINT_FAST64_MIN_COMPUTED #define DUK_UINT_FAST64_MAX_COMPUTED #define DUK_INT_FAST64_MIN_COMPUTED #define DUK_INT_FAST64_MAX_COMPUTED #endif #if defined(DUK_F_HAVE_64BIT) #define DUK_UINTMAX_MIN DUK_UINT64_MIN #define DUK_UINTMAX_MAX DUK_UINT64_MAX #define DUK_INTMAX_MIN DUK_INT64_MIN #define DUK_INTMAX_MAX DUK_INT64_MAX #define DUK_UINTMAX_MIN_COMPUTED #define DUK_UINTMAX_MAX_COMPUTED #define DUK_INTMAX_MIN_COMPUTED #define DUK_INTMAX_MAX_COMPUTED #else #define DUK_UINTMAX_MIN 0UL #define DUK_UINTMAX_MAX 0xffffffffUL #define DUK_INTMAX_MIN (-0x7fffffffL - 1L) #define DUK_INTMAX_MAX 0x7fffffffL #endif /* This detection is not very reliable. */ #if defined(DUK_F_32BIT_PTRS) typedef duk_int32_t duk_intptr_t; typedef duk_uint32_t duk_uintptr_t; #define DUK_UINTPTR_MIN DUK_UINT32_MIN #define DUK_UINTPTR_MAX DUK_UINT32_MAX #define DUK_INTPTR_MIN DUK_INT32_MIN #define DUK_INTPTR_MAX DUK_INT32_MAX #elif defined(DUK_F_64BIT_PTRS) && defined(DUK_F_HAVE_64BIT) typedef duk_int64_t duk_intptr_t; typedef duk_uint64_t duk_uintptr_t; #define DUK_UINTPTR_MIN DUK_UINT64_MIN #define DUK_UINTPTR_MAX DUK_UINT64_MAX #define DUK_INTPTR_MIN DUK_INT64_MIN #define DUK_INTPTR_MAX DUK_INT64_MAX #define DUK_UINTPTR_MIN_COMPUTED #define DUK_UINTPTR_MAX_COMPUTED #define DUK_INTPTR_MIN_COMPUTED #define DUK_INTPTR_MAX_COMPUTED #else #error cannot determine intptr type #endif /* SIZE_MAX may be missing so use an approximate value for it. */ #undef DUK_SIZE_MAX_COMPUTED #if !defined(SIZE_MAX) #define DUK_SIZE_MAX_COMPUTED #define SIZE_MAX ((size_t) (-1)) #endif #define DUK_SIZE_MIN 0 #define DUK_SIZE_MAX SIZE_MAX #endif /* C99 types */ /* A few types are assumed to always exist. */ typedef size_t duk_size_t; typedef ptrdiff_t duk_ptrdiff_t; /* The best type for an "all around int" in Duktape internals is "at least * 32 bit signed integer" which is most convenient. Same for unsigned type. * Prefer 'int' when large enough, as it is almost always a convenient type. */ #if defined(UINT_MAX) && (UINT_MAX >= 0xffffffffUL) typedef int duk_int_t; typedef unsigned int duk_uint_t; #define DUK_INT_MIN INT_MIN #define DUK_INT_MAX INT_MAX #define DUK_UINT_MIN 0 #define DUK_UINT_MAX UINT_MAX #else typedef duk_int_fast32_t duk_int_t; typedef duk_uint_fast32_t duk_uint_t; #define DUK_INT_MIN DUK_INT_FAST32_MIN #define DUK_INT_MAX DUK_INT_FAST32_MAX #define DUK_UINT_MIN DUK_UINT_FAST32_MIN #define DUK_UINT_MAX DUK_UINT_FAST32_MAX #endif /* Same as 'duk_int_t' but guaranteed to be a 'fast' variant if this * distinction matters for the CPU. These types are used mainly in the * executor where it might really matter. */ typedef duk_int_fast32_t duk_int_fast_t; typedef duk_uint_fast32_t duk_uint_fast_t; #define DUK_INT_FAST_MIN DUK_INT_FAST32_MIN #define DUK_INT_FAST_MAX DUK_INT_FAST32_MAX #define DUK_UINT_FAST_MIN DUK_UINT_FAST32_MIN #define DUK_UINT_FAST_MAX DUK_UINT_FAST32_MAX /* Small integers (16 bits or more) can fall back to the 'int' type, but * have a typedef so they are marked "small" explicitly. */ typedef int duk_small_int_t; typedef unsigned int duk_small_uint_t; #define DUK_SMALL_INT_MIN INT_MIN #define DUK_SMALL_INT_MAX INT_MAX #define DUK_SMALL_UINT_MIN 0 #define DUK_SMALL_UINT_MAX UINT_MAX /* Fast variants of small integers, again for really fast paths like the * executor. */ typedef duk_int_fast16_t duk_small_int_fast_t; typedef duk_uint_fast16_t duk_small_uint_fast_t; #define DUK_SMALL_INT_FAST_MIN DUK_INT_FAST16_MIN #define DUK_SMALL_INT_FAST_MAX DUK_INT_FAST16_MAX #define DUK_SMALL_UINT_FAST_MIN DUK_UINT_FAST16_MIN #define DUK_SMALL_UINT_FAST_MAX DUK_UINT_FAST16_MAX /* Boolean values are represented with the platform 'unsigned int'. */ typedef duk_small_uint_t duk_bool_t; #define DUK_BOOL_MIN DUK_SMALL_INT_MIN #define DUK_BOOL_MAX DUK_SMALL_INT_MAX /* Index values must have at least 32-bit signed range. */ typedef duk_int_t duk_idx_t; #define DUK_IDX_MIN DUK_INT_MIN #define DUK_IDX_MAX DUK_INT_MAX /* Unsigned index variant. */ typedef duk_uint_t duk_uidx_t; #define DUK_UIDX_MIN DUK_UINT_MIN #define DUK_UIDX_MAX DUK_UINT_MAX /* Array index values, could be exact 32 bits. * Currently no need for signed duk_arridx_t. */ typedef duk_uint_t duk_uarridx_t; #define DUK_UARRIDX_MIN DUK_UINT_MIN #define DUK_UARRIDX_MAX DUK_UINT_MAX /* Duktape/C function return value, platform int is enough for now to * represent 0, 1, or negative error code. Must be compatible with * assigning truth values (e.g. duk_ret_t rc = (foo == bar);). */ typedef duk_small_int_t duk_ret_t; #define DUK_RET_MIN DUK_SMALL_INT_MIN #define DUK_RET_MAX DUK_SMALL_INT_MAX /* Error codes are represented with platform int. High bits are used * for flags and such, so 32 bits are needed. */ typedef duk_int_t duk_errcode_t; #define DUK_ERRCODE_MIN DUK_INT_MIN #define DUK_ERRCODE_MAX DUK_INT_MAX /* Codepoint type. Must be 32 bits or more because it is used also for * internal codepoints. The type is signed because negative codepoints * are used as internal markers (e.g. to mark EOF or missing argument). * (X)UTF-8/CESU-8 encode/decode take and return an unsigned variant to * ensure duk_uint32_t casts back and forth nicely. Almost everything * else uses the signed one. */ typedef duk_int_t duk_codepoint_t; typedef duk_uint_t duk_ucodepoint_t; #define DUK_CODEPOINT_MIN DUK_INT_MIN #define DUK_CODEPOINT_MAX DUK_INT_MAX #define DUK_UCODEPOINT_MIN DUK_UINT_MIN #define DUK_UCODEPOINT_MAX DUK_UINT_MAX /* IEEE float/double typedef. */ typedef float duk_float_t; typedef double duk_double_t; /* We're generally assuming that we're working on a platform with a 32-bit * address space. If DUK_SIZE_MAX is a typecast value (which is necessary * if SIZE_MAX is missing), the check must be avoided because the * preprocessor can't do a comparison. */ #if !defined(DUK_SIZE_MAX) #error DUK_SIZE_MAX is undefined, probably missing SIZE_MAX #elif !defined(DUK_SIZE_MAX_COMPUTED) #if DUK_SIZE_MAX < 0xffffffffUL /* On some systems SIZE_MAX can be smaller than max unsigned 32-bit value * which seems incorrect if size_t is (at least) an unsigned 32-bit type. * However, it doesn't seem useful to error out compilation if this is the * case. */ #endif #endif /* Type used in public API declarations and user code. Typedef maps to * 'struct duk_hthread' like the 'duk_hthread' typedef which is used * exclusively in internals. */ typedef struct duk_hthread duk_context; /* Check whether we should use 64-bit integers or not. * * Quite incomplete now. Use 64-bit types if detected (C99 or other detection) * unless they are known to be unreliable. For instance, 64-bit types are * available on VBCC but seem to misbehave. */ #if defined(DUK_F_HAVE_64BIT) && !defined(DUK_F_VBCC) #define DUK_USE_64BIT_OPS #else #undef DUK_USE_64BIT_OPS #endif /* * Fill-ins for platform, architecture, and compiler */ /* An abort()-like primitive is needed by the default fatal error handler. */ #if !defined(DUK_ABORT) #define DUK_ABORT abort #endif #if !defined(DUK_SETJMP) #define DUK_JMPBUF_TYPE jmp_buf #define DUK_SETJMP(jb) setjmp((jb)) #define DUK_LONGJMP(jb) longjmp((jb), 1) #endif #if 0 /* sigsetjmp() alternative */ #define DUK_JMPBUF_TYPE sigjmp_buf #define DUK_SETJMP(jb) sigsetjmp((jb)) #define DUK_LONGJMP(jb) siglongjmp((jb), 1) #endif /* Special naming to avoid conflict with e.g. DUK_FREE() in duk_heap.h * (which is unfortunately named). May sometimes need replacement, e.g. * some compilers don't handle zero length or NULL correctly in realloc(). */ #if !defined(DUK_ANSI_MALLOC) #define DUK_ANSI_MALLOC malloc #endif #if !defined(DUK_ANSI_REALLOC) #define DUK_ANSI_REALLOC realloc #endif #if !defined(DUK_ANSI_CALLOC) #define DUK_ANSI_CALLOC calloc #endif #if !defined(DUK_ANSI_FREE) #define DUK_ANSI_FREE free #endif /* ANSI C (various versions) and some implementations require that the * pointer arguments to memset(), memcpy(), and memmove() be valid values * even when byte size is 0 (even a NULL pointer is considered invalid in * this context). Zero-size operations as such are allowed, as long as their * pointer arguments point to a valid memory area. The DUK_MEMSET(), * DUK_MEMCPY(), and DUK_MEMMOVE() macros require this same behavior, i.e.: * (1) pointers must be valid and non-NULL, (2) zero size must otherwise be * allowed. If these are not fulfilled, a macro wrapper is needed. * * http://stackoverflow.com/questions/5243012/is-it-guaranteed-to-be-safe-to-perform-memcpy0-0-0 * http://lists.cs.uiuc.edu/pipermail/llvmdev/2007-October/011065.html * * Not sure what's the required behavior when a pointer points just past the * end of a buffer, which often happens in practice (e.g. zero size memmoves). * For example, if allocation size is 3, the following pointer would not * technically point to a valid memory byte: * * <-- alloc --> * | 0 | 1 | 2 | ..... * ^-- p=3, points after last valid byte (2) */ #if !defined(DUK_MEMCPY) #if defined(DUK_F_UCLIBC) /* Old uclibcs have a broken memcpy so use memmove instead (this is overly wide * now on purpose): http://lists.uclibc.org/pipermail/uclibc-cvs/2008-October/025511.html */ #define DUK_MEMCPY memmove #else #define DUK_MEMCPY memcpy #endif #endif #if !defined(DUK_MEMMOVE) #define DUK_MEMMOVE memmove #endif #if !defined(DUK_MEMCMP) #define DUK_MEMCMP memcmp #endif #if !defined(DUK_MEMSET) #define DUK_MEMSET memset #endif #if !defined(DUK_STRLEN) #define DUK_STRLEN strlen #endif #if !defined(DUK_STRCMP) #define DUK_STRCMP strcmp #endif #if !defined(DUK_STRNCMP) #define DUK_STRNCMP strncmp #endif #if !defined(DUK_SPRINTF) #define DUK_SPRINTF sprintf #endif #if !defined(DUK_SNPRINTF) /* snprintf() is technically not part of C89 but usually available. */ #define DUK_SNPRINTF snprintf #endif #if !defined(DUK_VSPRINTF) #define DUK_VSPRINTF vsprintf #endif #if !defined(DUK_VSNPRINTF) /* vsnprintf() is technically not part of C89 but usually available. */ #define DUK_VSNPRINTF vsnprintf #endif #if !defined(DUK_SSCANF) #define DUK_SSCANF sscanf #endif #if !defined(DUK_VSSCANF) #define DUK_VSSCANF vsscanf #endif #if !defined(DUK_MEMZERO) #define DUK_MEMZERO(p,n) DUK_MEMSET((p), 0, (n)) #endif #if !defined(DUK_DOUBLE_INFINITY) #undef DUK_USE_COMPUTED_INFINITY #if defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION < 40600) /* GCC older than 4.6: avoid overflow warnings related to using INFINITY */ #define DUK_DOUBLE_INFINITY (__builtin_inf()) #elif defined(INFINITY) #define DUK_DOUBLE_INFINITY ((double) INFINITY) #elif !defined(DUK_F_VBCC) && !defined(DUK_F_MSVC) && !defined(DUK_F_BCC) && \ !defined(DUK_F_OLD_SOLARIS) && !defined(DUK_F_AIX) #define DUK_DOUBLE_INFINITY (1.0 / 0.0) #else /* In VBCC (1.0 / 0.0) results in a warning and 0.0 instead of infinity. * Use a computed infinity (initialized when a heap is created at the * latest). */ #define DUK_USE_COMPUTED_INFINITY #define DUK_DOUBLE_INFINITY duk_computed_infinity #endif #endif #if !defined(DUK_DOUBLE_NAN) #undef DUK_USE_COMPUTED_NAN #if defined(NAN) #define DUK_DOUBLE_NAN NAN #elif !defined(DUK_F_VBCC) && !defined(DUK_F_MSVC) && !defined(DUK_F_BCC) && \ !defined(DUK_F_OLD_SOLARIS) && !defined(DUK_F_AIX) #define DUK_DOUBLE_NAN (0.0 / 0.0) #else /* In VBCC (0.0 / 0.0) results in a warning and 0.0 instead of NaN. * In MSVC (VS2010 Express) (0.0 / 0.0) results in a compile error. * Use a computed NaN (initialized when a heap is created at the * latest). */ #define DUK_USE_COMPUTED_NAN #define DUK_DOUBLE_NAN duk_computed_nan #endif #endif /* Many platforms are missing fpclassify() and friends, so use replacements * if necessary. The replacement constants (FP_NAN etc) can be anything but * match Linux constants now. */ #undef DUK_USE_REPL_FPCLASSIFY #undef DUK_USE_REPL_SIGNBIT #undef DUK_USE_REPL_ISFINITE #undef DUK_USE_REPL_ISNAN #undef DUK_USE_REPL_ISINF /* Complex condition broken into separate parts. */ #undef DUK_F_USE_REPL_ALL #if !(defined(FP_NAN) && defined(FP_INFINITE) && defined(FP_ZERO) && \ defined(FP_SUBNORMAL) && defined(FP_NORMAL)) /* Missing some obvious constants. */ #define DUK_F_USE_REPL_ALL #elif defined(DUK_F_AMIGAOS) && defined(DUK_F_VBCC) /* VBCC is missing the built-ins even in C99 mode (perhaps a header issue). */ #define DUK_F_USE_REPL_ALL #elif defined(DUK_F_AMIGAOS) && defined(DUK_F_M68K) /* AmigaOS + M68K seems to have math issues even when using GCC cross * compilation. Use replacements for all AmigaOS versions on M68K * regardless of compiler. */ #define DUK_F_USE_REPL_ALL #elif defined(DUK_F_FREEBSD) && defined(DUK_F_CLANG) /* Placeholder fix for (detection is wider than necessary): * http://llvm.org/bugs/show_bug.cgi?id=17788 */ #define DUK_F_USE_REPL_ALL #elif defined(DUK_F_UCLIBC) /* At least some uclibc versions have broken floating point math. For * example, fpclassify() can incorrectly classify certain NaN formats. * To be safe, use replacements. */ #define DUK_F_USE_REPL_ALL #elif defined(DUK_F_AIX) /* Older versions may be missing isnan(), etc. */ #define DUK_F_USE_REPL_ALL #endif #if defined(DUK_F_USE_REPL_ALL) #define DUK_USE_REPL_FPCLASSIFY #define DUK_USE_REPL_SIGNBIT #define DUK_USE_REPL_ISFINITE #define DUK_USE_REPL_ISNAN #define DUK_USE_REPL_ISINF #define DUK_FPCLASSIFY duk_repl_fpclassify #define DUK_SIGNBIT duk_repl_signbit #define DUK_ISFINITE duk_repl_isfinite #define DUK_ISNAN duk_repl_isnan #define DUK_ISINF duk_repl_isinf #define DUK_FP_NAN 0 #define DUK_FP_INFINITE 1 #define DUK_FP_ZERO 2 #define DUK_FP_SUBNORMAL 3 #define DUK_FP_NORMAL 4 #else #define DUK_FPCLASSIFY fpclassify #define DUK_SIGNBIT signbit #define DUK_ISFINITE isfinite #define DUK_ISNAN isnan #define DUK_ISINF isinf #define DUK_FP_NAN FP_NAN #define DUK_FP_INFINITE FP_INFINITE #define DUK_FP_ZERO FP_ZERO #define DUK_FP_SUBNORMAL FP_SUBNORMAL #define DUK_FP_NORMAL FP_NORMAL #endif #if defined(DUK_F_USE_REPL_ALL) #undef DUK_F_USE_REPL_ALL #endif /* These functions don't currently need replacement but are wrapped for * completeness. Because these are used as function pointers, they need * to be defined as concrete C functions (not macros). */ #if !defined(DUK_FABS) #define DUK_FABS fabs #endif #if !defined(DUK_FLOOR) #define DUK_FLOOR floor #endif #if !defined(DUK_CEIL) #define DUK_CEIL ceil #endif #if !defined(DUK_FMOD) #define DUK_FMOD fmod #endif #if !defined(DUK_POW) #define DUK_POW pow #endif #if !defined(DUK_ACOS) #define DUK_ACOS acos #endif #if !defined(DUK_ASIN) #define DUK_ASIN asin #endif #if !defined(DUK_ATAN) #define DUK_ATAN atan #endif #if !defined(DUK_ATAN2) #define DUK_ATAN2 atan2 #endif #if !defined(DUK_SIN) #define DUK_SIN sin #endif #if !defined(DUK_COS) #define DUK_COS cos #endif #if !defined(DUK_TAN) #define DUK_TAN tan #endif #if !defined(DUK_EXP) #define DUK_EXP exp #endif #if !defined(DUK_LOG) #define DUK_LOG log #endif #if !defined(DUK_SQRT) #define DUK_SQRT sqrt #endif /* The functions below exist only in C99/C++11 or later and need a workaround * for platforms that don't include them. MSVC isn't detected as C99, but * these functions also exist in MSVC 2013 and later so include a clause for * that too. Android doesn't have log2; disable all of these for Android. */ #if (defined(DUK_F_C99) || defined(DUK_F_CPP11) || (defined(_MSC_VER) && (_MSC_VER >= 1800))) && \ !defined(DUK_F_ANDROID) && !defined(DUK_F_MINT) #if !defined(DUK_CBRT) #define DUK_CBRT cbrt #endif #if !defined(DUK_LOG2) #define DUK_LOG2 log2 #endif #if !defined(DUK_LOG10) #define DUK_LOG10 log10 #endif #if !defined(DUK_TRUNC) #define DUK_TRUNC trunc #endif #endif /* DUK_F_C99 etc */ /* NetBSD 6.0 x86 (at least) has a few problems with pow() semantics, * see test-bug-netbsd-math-pow.js. MinGW has similar (but different) * issues, see test-bug-mingw-math-issues.js. Enable pow() workarounds * for these targets. */ #undef DUK_USE_POW_WORKAROUNDS #if defined(DUK_F_NETBSD) || defined(DUK_F_MINGW) #define DUK_USE_POW_WORKAROUNDS #endif /* Similar workarounds for atan2() semantics issues. MinGW issues are * documented in test-bug-mingw-math-issues.js. */ #undef DUK_USE_ATAN2_WORKAROUNDS #if defined(DUK_F_MINGW) #define DUK_USE_ATAN2_WORKAROUNDS #endif /* Rely as little as possible on compiler behavior for NaN comparison, * signed zero handling, etc. Currently never activated but may be needed * for broken compilers. */ #undef DUK_USE_PARANOID_MATH /* There was a curious bug where test-bi-date-canceling.js would fail e.g. * on 64-bit Ubuntu, gcc-4.8.1, -m32, and no -std=c99. Some date computations * using doubles would be optimized which then broke some corner case tests. * The problem goes away by adding 'volatile' to the datetime computations. * Not sure what the actual triggering conditions are, but using this on * non-C99 systems solves the known issues and has relatively little cost * on other platforms. */ #undef DUK_USE_PARANOID_DATE_COMPUTATION #if !defined(DUK_F_C99) #define DUK_USE_PARANOID_DATE_COMPUTATION #endif /* * Byte order and double memory layout detection * * Endianness detection is a major portability hassle because the macros * and headers are not standardized. There's even variance across UNIX * platforms. Even with "standard" headers, details like underscore count * varies between platforms, e.g. both __BYTE_ORDER and _BYTE_ORDER are used * (Crossbridge has a single underscore, for instance). * * The checks below are structured with this in mind: several approaches are * used, and at the end we check if any of them worked. This allows generic * approaches to be tried first, and platform/compiler specific hacks tried * last. As a last resort, the user can force a specific endianness, as it's * not likely that automatic detection will work on the most exotic platforms. * * Duktape supports little and big endian machines. There's also support * for a hybrid used by some ARM machines where integers are little endian * but IEEE double values use a mixed order (12345678 -> 43218765). This * byte order for doubles is referred to as "mixed endian". */ /* GCC and Clang provide endianness defines as built-in predefines, with * leading and trailing double underscores (e.g. __BYTE_ORDER__). See * output of "make gccpredefs" and "make clangpredefs". Clang doesn't * seem to provide __FLOAT_WORD_ORDER__; assume not mixed endian for clang. * http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html */ #if !defined(DUK_USE_BYTEORDER) && defined(__BYTE_ORDER__) #if defined(__ORDER_LITTLE_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) #if defined(__FLOAT_WORD_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && (__FLOAT_WORD_ORDER__ == __ORDER_LITTLE_ENDIAN__) #define DUK_USE_BYTEORDER 1 #elif defined(__FLOAT_WORD_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && (__FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__) #define DUK_USE_BYTEORDER 2 #elif !defined(__FLOAT_WORD_ORDER__) /* Float word order not known, assume not a hybrid. */ #define DUK_USE_BYTEORDER 1 #else /* Byte order is little endian but cannot determine IEEE double word order. */ #endif /* float word order */ #elif defined(__ORDER_BIG_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) #if defined(__FLOAT_WORD_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && (__FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__) #define DUK_USE_BYTEORDER 3 #elif !defined(__FLOAT_WORD_ORDER__) /* Float word order not known, assume not a hybrid. */ #define DUK_USE_BYTEORDER 3 #else /* Byte order is big endian but cannot determine IEEE double word order. */ #endif /* float word order */ #else /* Cannot determine byte order; __ORDER_PDP_ENDIAN__ is related to 32-bit * integer ordering and is not relevant. */ #endif /* integer byte order */ #endif /* !defined(DUK_USE_BYTEORDER) && defined(__BYTE_ORDER__) */ /* More or less standard endianness predefines provided by header files. * The ARM hybrid case is detected by assuming that __FLOAT_WORD_ORDER * will be big endian, see: http://lists.mysql.com/internals/443. * On some platforms some defines may be present with an empty value which * causes comparisons to fail: https://github.com/svaarala/duktape/issues/453. */ #if !defined(DUK_USE_BYTEORDER) #if defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && (__BYTE_ORDER == __LITTLE_ENDIAN) || \ defined(_BYTE_ORDER) && defined(_LITTLE_ENDIAN) && (_BYTE_ORDER == _LITTLE_ENDIAN) || \ defined(__LITTLE_ENDIAN__) #if defined(__FLOAT_WORD_ORDER) && defined(__LITTLE_ENDIAN) && (__FLOAT_WORD_ORDER == __LITTLE_ENDIAN) || \ defined(_FLOAT_WORD_ORDER) && defined(_LITTLE_ENDIAN) && (_FLOAT_WORD_ORDER == _LITTLE_ENDIAN) #define DUK_USE_BYTEORDER 1 #elif defined(__FLOAT_WORD_ORDER) && defined(__BIG_ENDIAN) && (__FLOAT_WORD_ORDER == __BIG_ENDIAN) || \ defined(_FLOAT_WORD_ORDER) && defined(_BIG_ENDIAN) && (_FLOAT_WORD_ORDER == _BIG_ENDIAN) #define DUK_USE_BYTEORDER 2 #elif !defined(__FLOAT_WORD_ORDER) && !defined(_FLOAT_WORD_ORDER) /* Float word order not known, assume not a hybrid. */ #define DUK_USE_BYTEORDER 1 #else /* Byte order is little endian but cannot determine IEEE double word order. */ #endif /* float word order */ #elif defined(__BYTE_ORDER) && defined(__BIG_ENDIAN) && (__BYTE_ORDER == __BIG_ENDIAN) || \ defined(_BYTE_ORDER) && defined(_BIG_ENDIAN) && (_BYTE_ORDER == _BIG_ENDIAN) || \ defined(__BIG_ENDIAN__) #if defined(__FLOAT_WORD_ORDER) && defined(__BIG_ENDIAN) && (__FLOAT_WORD_ORDER == __BIG_ENDIAN) || \ defined(_FLOAT_WORD_ORDER) && defined(_BIG_ENDIAN) && (_FLOAT_WORD_ORDER == _BIG_ENDIAN) #define DUK_USE_BYTEORDER 3 #elif !defined(__FLOAT_WORD_ORDER) && !defined(_FLOAT_WORD_ORDER) /* Float word order not known, assume not a hybrid. */ #define DUK_USE_BYTEORDER 3 #else /* Byte order is big endian but cannot determine IEEE double word order. */ #endif /* float word order */ #else /* Cannot determine byte order. */ #endif /* integer byte order */ #endif /* !defined(DUK_USE_BYTEORDER) */ /* QNX gcc cross compiler seems to define e.g. __LITTLEENDIAN__ or __BIGENDIAN__: * $ /opt/qnx650/host/linux/x86/usr/bin/i486-pc-nto-qnx6.5.0-gcc -dM -E - </dev/null | grep -ni endian * 67:#define __LITTLEENDIAN__ 1 * $ /opt/qnx650/host/linux/x86/usr/bin/mips-unknown-nto-qnx6.5.0-gcc -dM -E - </dev/null | grep -ni endian * 81:#define __BIGENDIAN__ 1 * $ /opt/qnx650/host/linux/x86/usr/bin/arm-unknown-nto-qnx6.5.0-gcc -dM -E - </dev/null | grep -ni endian * 70:#define __LITTLEENDIAN__ 1 */ #if !defined(DUK_USE_BYTEORDER) #if defined(__LITTLEENDIAN__) #define DUK_USE_BYTEORDER 1 #elif defined(__BIGENDIAN__) #define DUK_USE_BYTEORDER 3 #endif #endif /* * Alignment requirement and support for unaligned accesses * * Assume unaligned accesses are not supported unless specifically allowed * in the target platform. Some platforms may support unaligned accesses * but alignment to 4 or 8 may still be desirable. */ /* If not provided, use safe default for alignment. */ #if !defined(DUK_USE_ALIGN_BY) #define DUK_USE_ALIGN_BY 8 #endif /* Compiler specific hackery needed to force struct size to match aligment, * see e.g. duk_hbuffer.h. * * http://stackoverflow.com/questions/11130109/c-struct-size-alignment * http://stackoverflow.com/questions/10951039/specifying-64-bit-alignment */ #if !(defined(DUK_USE_PACK_MSVC_PRAGMA) || defined(DUK_USE_PACK_GCC_ATTR) || \ defined(DUK_USE_PACK_CLANG_ATTR) || defined(DUK_USE_PACK_DUMMY_MEMBER)) #define DUK_USE_PACK_DUMMY_MEMBER #endif #if !defined(DUK_VA_COPY) /* We need va_copy() which is defined in C99 / C++11, so an awkward * replacement is needed for pre-C99 / pre-C++11 environments. This * will quite likely need portability hacks for some non-C99 * environments. */ #if defined(DUK_F_C99) || defined(DUK_F_CPP11) /* C99 / C++11 and above: rely on va_copy() which is required. * Omit parenthesis on macro right side on purpose to minimize differences * to direct use. */ #define DUK_VA_COPY(dest,src) va_copy(dest,src) #else /* Pre-C99: va_list type is implementation dependent. This replacement * assumes it is a plain value so that a simple assignment will work. * This is not the case on all platforms (it may be a single-array element, * for instance). */ #define DUK_VA_COPY(dest,src) do { (dest) = (src); } while (0) #endif #endif #if !defined(DUK_MACRO_STRINGIFY) /* Macro hackery to convert e.g. __LINE__ to a string without formatting, * see: http://stackoverflow.com/questions/240353/convert-a-preprocessor-token-to-a-string */ #define DUK_MACRO_STRINGIFY_HELPER(x) #x #define DUK_MACRO_STRINGIFY(x) DUK_MACRO_STRINGIFY_HELPER(x) #endif #if !defined(DUK_CAUSE_SEGFAULT) /* This can be used for testing; valgrind will then indicate the C call stack * leading to the call site. */ #define DUK_CAUSE_SEGFAULT() do { *((volatile duk_uint32_t *) NULL) = (duk_uint32_t) 0xdeadbeefUL; } while (0) #endif #if !defined(DUK_UNREF) /* Macro for suppressing warnings for potentially unreferenced variables. * The variables can be actually unreferenced or unreferenced in some * specific cases only; for instance, if a variable is only debug printed, * it is unreferenced when debug printing is disabled. May cause warnings * for volatile arguments. */ #define DUK_UNREF(x) do { (void) (x); } while (0) #endif #if !defined(DUK_NORETURN) #define DUK_NORETURN(decl) decl #endif #if !defined(DUK_UNREACHABLE) /* Don't know how to declare unreachable point, so don't do it; this * may cause some spurious compilation warnings (e.g. "variable used * uninitialized"). */ #define DUK_UNREACHABLE() do { } while (0) #endif #if !defined(DUK_LOSE_CONST) /* Convert any input pointer into a "void *", losing a const qualifier. * This is not fully portable because casting through duk_uintptr_t may * not work on all architectures (e.g. those with long, segmented pointers). */ #define DUK_LOSE_CONST(src) ((void *) (duk_uintptr_t) (src)) #endif #if !defined(DUK_LIKELY) #define DUK_LIKELY(x) (x) #endif #if !defined(DUK_UNLIKELY) #define DUK_UNLIKELY(x) (x) #endif #if !defined(DUK_UNPREDICTABLE) #define DUK_UNPREDICTABLE(x) (x) #endif #if !defined(DUK_NOINLINE) #define DUK_NOINLINE /*nop*/ #endif #if !defined(DUK_INLINE) #define DUK_INLINE /*nop*/ #endif #if !defined(DUK_ALWAYS_INLINE) #define DUK_ALWAYS_INLINE /*nop*/ #endif #if !defined(DUK_HOT) #define DUK_HOT /*nop*/ #endif #if !defined(DUK_COLD) #define DUK_COLD /*nop*/ #endif #if !defined(DUK_EXTERNAL_DECL) #define DUK_EXTERNAL_DECL extern #endif #if !defined(DUK_EXTERNAL) #define DUK_EXTERNAL /*empty*/ #endif #if !defined(DUK_INTERNAL_DECL) #if defined(DUK_SINGLE_FILE) #define DUK_INTERNAL_DECL static #else #define DUK_INTERNAL_DECL extern #endif #endif #if !defined(DUK_INTERNAL) #if defined(DUK_SINGLE_FILE) #define DUK_INTERNAL static #else #define DUK_INTERNAL /*empty*/ #endif #endif #if !defined(DUK_LOCAL_DECL) #define DUK_LOCAL_DECL static #endif #if !defined(DUK_LOCAL) #define DUK_LOCAL static #endif #if !defined(DUK_FILE_MACRO) #define DUK_FILE_MACRO __FILE__ #endif #if !defined(DUK_LINE_MACRO) #define DUK_LINE_MACRO __LINE__ #endif #if !defined(DUK_FUNC_MACRO) #if defined(DUK_F_C99) || defined(DUK_F_CPP11) #define DUK_FUNC_MACRO __func__ #elif defined(__FUNCTION__) #define DUK_FUNC_MACRO __FUNCTION__ #else #define DUK_FUNC_MACRO "unknown" #endif #endif #if !defined(DUK_BSWAP32) #define DUK_BSWAP32(x) \ ((((duk_uint32_t) (x)) >> 24) | \ ((((duk_uint32_t) (x)) >> 8) & 0xff00UL) | \ ((((duk_uint32_t) (x)) << 8) & 0xff0000UL) | \ (((duk_uint32_t) (x)) << 24)) #endif #if !defined(DUK_BSWAP16) #define DUK_BSWAP16(x) \ ((duk_uint16_t) (x) >> 8) | \ ((duk_uint16_t) (x) << 8) #endif /* DUK_USE_VARIADIC_MACROS: required from compilers, so no fill-in. */ /* DUK_USE_UNION_INITIALIZERS: required from compilers, so no fill-in. */ #if !(defined(DUK_USE_FLEX_C99) || defined(DUK_USE_FLEX_ZEROSIZE) || defined(DUK_USE_FLEX_ONESIZE)) #if defined(DUK_F_C99) #define DUK_USE_FLEX_C99 #else #define DUK_USE_FLEX_ZEROSIZE /* Not standard but common enough */ #endif #endif #if !(defined(DUK_USE_PACK_GCC_ATTR) || defined(DUK_USE_PACK_CLANG_ATTR) || \ defined(DUK_USE_PACK_MSVC_PRAGMA) || defined(DUK_USE_PACK_DUMMY_MEMBER)) #define DUK_USE_PACK_DUMMY_MEMBER #endif #if 0 /* not defined by default */ #undef DUK_USE_GCC_PRAGMAS #endif #if !defined(DUK_U64_CONSTANT) #define DUK_U64_CONSTANT(x) x##ULL #endif #if !defined(DUK_I64_CONSTANT) #define DUK_I64_CONSTANT(x) x##LL #endif /* Workaround for GH-323: avoid inlining control when compiling from * multiple sources, as it causes compiler portability trouble. */ #if !defined(DUK_SINGLE_FILE) #undef DUK_NOINLINE #undef DUK_INLINE #undef DUK_ALWAYS_INLINE #define DUK_NOINLINE /*nop*/ #define DUK_INLINE /*nop*/ #define DUK_ALWAYS_INLINE /*nop*/ #endif /* * Check whether or not a packed duk_tval representation is possible. * What's basically required is that pointers are 32-bit values * (sizeof(void *) == 4). Best effort check, not always accurate. * If guess goes wrong, crashes may result; self tests also verify * the guess. */ /* Explicit marker needed; may be 'defined', 'undefined, 'or 'not provided'. */ #if !defined(DUK_F_PACKED_TVAL_PROVIDED) #undef DUK_F_PACKED_TVAL_POSSIBLE /* Strict C99 case: DUK_UINTPTR_MAX (= UINTPTR_MAX) should be very reliable */ #if !defined(DUK_F_PACKED_TVAL_POSSIBLE) && defined(DUK_UINTPTR_MAX) #if (DUK_UINTPTR_MAX <= 0xffffffffUL) #define DUK_F_PACKED_TVAL_POSSIBLE #endif #endif /* Non-C99 case, still relying on DUK_UINTPTR_MAX, as long as it is not a computed value */ #if !defined(DUK_F_PACKED_TVAL_POSSIBLE) && defined(DUK_UINTPTR_MAX) && !defined(DUK_UINTPTR_MAX_COMPUTED) #if (DUK_UINTPTR_MAX <= 0xffffffffUL) #define DUK_F_PACKED_TVAL_POSSIBLE #endif #endif /* DUK_SIZE_MAX (= SIZE_MAX) is often reliable */ #if !defined(DUK_F_PACKED_TVAL_POSSIBLE) && defined(DUK_SIZE_MAX) && !defined(DUK_SIZE_MAX_COMPUTED) #if (DUK_SIZE_MAX <= 0xffffffffUL) #define DUK_F_PACKED_TVAL_POSSIBLE #endif #endif #undef DUK_USE_PACKED_TVAL #if defined(DUK_F_PACKED_TVAL_POSSIBLE) #define DUK_USE_PACKED_TVAL #endif #undef DUK_F_PACKED_TVAL_POSSIBLE #endif /* DUK_F_PACKED_TVAL_PROVIDED */ /* Object property allocation layout has implications for memory and code * footprint and generated code size/speed. The best layout also depends * on whether the platform has alignment requirements or benefits from * having mostly aligned accesses. */ #undef DUK_USE_HOBJECT_LAYOUT_1 #undef DUK_USE_HOBJECT_LAYOUT_2 #undef DUK_USE_HOBJECT_LAYOUT_3 #if (DUK_USE_ALIGN_BY == 1) /* On platforms without any alignment issues, layout 1 is preferable * because it compiles to slightly less code and provides direct access * to property keys. */ #define DUK_USE_HOBJECT_LAYOUT_1 #else /* On other platforms use layout 2, which requires some padding but * is a bit more natural than layout 3 in ordering the entries. Layout * 3 is currently not used. */ #define DUK_USE_HOBJECT_LAYOUT_2 #endif /* GCC/clang inaccurate math would break compliance and probably duk_tval, * so refuse to compile. Relax this if -ffast-math is tested to work. */ #if defined(__FAST_MATH__) #error __FAST_MATH__ defined, refusing to compile #endif /* * Autogenerated defaults */ #define DUK_USE_ARRAY_BUILTIN #define DUK_USE_ARRAY_FASTPATH #define DUK_USE_ARRAY_PROP_FASTPATH #undef DUK_USE_ASSERTIONS #define DUK_USE_AUGMENT_ERROR_CREATE #define DUK_USE_AUGMENT_ERROR_THROW #define DUK_USE_AVOID_PLATFORM_FUNCPTRS #define DUK_USE_BASE64_FASTPATH #define DUK_USE_BOOLEAN_BUILTIN #define DUK_USE_BUFFEROBJECT_SUPPORT #undef DUK_USE_BUFLEN16 #define DUK_USE_BYTECODE_DUMP_SUPPORT #define DUK_USE_CACHE_ACTIVATION #define DUK_USE_CACHE_CATCHER #define DUK_USE_CALLSTACK_LIMIT 10000 #define DUK_USE_COMMONJS_MODULES #define DUK_USE_COMPILER_RECLIMIT 2500 #define DUK_USE_COROUTINE_SUPPORT #undef DUK_USE_CPP_EXCEPTIONS #undef DUK_USE_DATAPTR16 #undef DUK_USE_DATAPTR_DEC16 #undef DUK_USE_DATAPTR_ENC16 #define DUK_USE_DATE_BUILTIN #undef DUK_USE_DATE_FORMAT_STRING #undef DUK_USE_DATE_GET_LOCAL_TZOFFSET #undef DUK_USE_DATE_GET_NOW #undef DUK_USE_DATE_PARSE_STRING #undef DUK_USE_DATE_PRS_GETDATE #undef DUK_USE_DEBUG #undef DUK_USE_DEBUGGER_DUMPHEAP #undef DUK_USE_DEBUGGER_INSPECT #undef DUK_USE_DEBUGGER_PAUSE_UNCAUGHT #undef DUK_USE_DEBUGGER_SUPPORT #define DUK_USE_DEBUGGER_THROW_NOTIFY #undef DUK_USE_DEBUGGER_TRANSPORT_TORTURE #define DUK_USE_DEBUG_BUFSIZE 65536L #define DUK_USE_DEBUG_LEVEL 0 #undef DUK_USE_DEBUG_WRITE #define DUK_USE_DOUBLE_LINKED_HEAP #define DUK_USE_DUKTAPE_BUILTIN #define DUK_USE_ENCODING_BUILTINS #define DUK_USE_ERRCREATE #define DUK_USE_ERRTHROW #define DUK_USE_ES6 #define DUK_USE_ES6_OBJECT_PROTO_PROPERTY #define DUK_USE_ES6_OBJECT_SETPROTOTYPEOF #define DUK_USE_ES6_PROXY #define DUK_USE_ES6_REGEXP_SYNTAX #define DUK_USE_ES6_UNICODE_ESCAPE #define DUK_USE_ES7 #define DUK_USE_ES7_EXP_OPERATOR #define DUK_USE_ES8 #define DUK_USE_ES9 #define DUK_USE_ESBC_LIMITS #define DUK_USE_ESBC_MAX_BYTES 2147418112L #define DUK_USE_ESBC_MAX_LINENUMBER 2147418112L #undef DUK_USE_EXEC_FUN_LOCAL #undef DUK_USE_EXEC_INDIRECT_BOUND_CHECK #undef DUK_USE_EXEC_PREFER_SIZE #define DUK_USE_EXEC_REGCONST_OPTIMIZE #undef DUK_USE_EXEC_TIMEOUT_CHECK #undef DUK_USE_EXPLICIT_NULL_INIT #undef DUK_USE_EXTSTR_FREE #undef DUK_USE_EXTSTR_INTERN_CHECK #undef DUK_USE_FASTINT #define DUK_USE_FAST_REFCOUNT_DEFAULT #undef DUK_USE_FATAL_HANDLER #define DUK_USE_FATAL_MAXLEN 128 #define DUK_USE_FINALIZER_SUPPORT #undef DUK_USE_FINALIZER_TORTURE #undef DUK_USE_FUNCPTR16 #undef DUK_USE_FUNCPTR_DEC16 #undef DUK_USE_FUNCPTR_ENC16 #define DUK_USE_FUNCTION_BUILTIN #define DUK_USE_FUNC_FILENAME_PROPERTY #define DUK_USE_FUNC_NAME_PROPERTY #undef DUK_USE_GC_TORTURE #undef DUK_USE_GET_MONOTONIC_TIME #undef DUK_USE_GET_RANDOM_DOUBLE #undef DUK_USE_GLOBAL_BINDING #define DUK_USE_GLOBAL_BUILTIN #undef DUK_USE_HEAPPTR16 #undef DUK_USE_HEAPPTR_DEC16 #undef DUK_USE_HEAPPTR_ENC16 #define DUK_USE_HEX_FASTPATH #define DUK_USE_HOBJECT_ARRAY_ABANDON_LIMIT 2 #define DUK_USE_HOBJECT_ARRAY_FAST_RESIZE_LIMIT 9 #define DUK_USE_HOBJECT_ARRAY_MINGROW_ADD 16 #define DUK_USE_HOBJECT_ARRAY_MINGROW_DIVISOR 8 #define DUK_USE_HOBJECT_ENTRY_MINGROW_ADD 16 #define DUK_USE_HOBJECT_ENTRY_MINGROW_DIVISOR 8 #define DUK_USE_HOBJECT_HASH_PART #define DUK_USE_HOBJECT_HASH_PROP_LIMIT 8 #define DUK_USE_HSTRING_ARRIDX #define DUK_USE_HSTRING_CLEN #undef DUK_USE_HSTRING_EXTDATA #define DUK_USE_HSTRING_LAZY_CLEN #define DUK_USE_HTML_COMMENTS #define DUK_USE_IDCHAR_FASTPATH #undef DUK_USE_INJECT_HEAP_ALLOC_ERROR #undef DUK_USE_INTERRUPT_COUNTER #undef DUK_USE_INTERRUPT_DEBUG_FIXUP #define DUK_USE_JC #define DUK_USE_JSON_BUILTIN #define DUK_USE_JSON_DECNUMBER_FASTPATH #define DUK_USE_JSON_DECSTRING_FASTPATH #define DUK_USE_JSON_DEC_RECLIMIT 1000 #define DUK_USE_JSON_EATWHITE_FASTPATH #define DUK_USE_JSON_ENC_RECLIMIT 1000 #define DUK_USE_JSON_QUOTESTRING_FASTPATH #undef DUK_USE_JSON_STRINGIFY_FASTPATH #define DUK_USE_JSON_SUPPORT #define DUK_USE_JX #define DUK_USE_LEXER_SLIDING_WINDOW #undef DUK_USE_LIGHTFUNC_BUILTINS #define DUK_USE_MARK_AND_SWEEP_RECLIMIT 256 #define DUK_USE_MATH_BUILTIN #define DUK_USE_NATIVE_CALL_RECLIMIT 1000 #define DUK_USE_NONSTD_ARRAY_CONCAT_TRAILER #define DUK_USE_NONSTD_ARRAY_MAP_TRAILER #define DUK_USE_NONSTD_ARRAY_SPLICE_DELCOUNT #undef DUK_USE_NONSTD_FUNC_CALLER_PROPERTY #undef DUK_USE_NONSTD_FUNC_SOURCE_PROPERTY #define DUK_USE_NONSTD_FUNC_STMT #define DUK_USE_NONSTD_GETTER_KEY_ARGUMENT #define DUK_USE_NONSTD_JSON_ESC_U2028_U2029 #define DUK_USE_NONSTD_SETTER_KEY_ARGUMENT #define DUK_USE_NONSTD_STRING_FROMCHARCODE_32BIT #define DUK_USE_NUMBER_BUILTIN #define DUK_USE_OBJECT_BUILTIN #undef DUK_USE_OBJSIZES16 #undef DUK_USE_PARANOID_ERRORS #define DUK_USE_PC2LINE #define DUK_USE_PERFORMANCE_BUILTIN #undef DUK_USE_PREFER_SIZE #undef DUK_USE_PROMISE_BUILTIN #define DUK_USE_PROVIDE_DEFAULT_ALLOC_FUNCTIONS #undef DUK_USE_REFCOUNT16 #define DUK_USE_REFCOUNT32 #define DUK_USE_REFERENCE_COUNTING #define DUK_USE_REFLECT_BUILTIN #define DUK_USE_REGEXP_CANON_BITMAP #undef DUK_USE_REGEXP_CANON_WORKAROUND #define DUK_USE_REGEXP_COMPILER_RECLIMIT 10000 #define DUK_USE_REGEXP_EXECUTOR_RECLIMIT 10000 #define DUK_USE_REGEXP_SUPPORT #undef DUK_USE_ROM_GLOBAL_CLONE #undef DUK_USE_ROM_GLOBAL_INHERIT #undef DUK_USE_ROM_OBJECTS #define DUK_USE_ROM_PTRCOMP_FIRST 63488L #undef DUK_USE_ROM_STRINGS #define DUK_USE_SECTION_B #undef DUK_USE_SELF_TESTS #define DUK_USE_SHEBANG_COMMENTS #undef DUK_USE_SHUFFLE_TORTURE #define DUK_USE_SOURCE_NONBMP #undef DUK_USE_STRHASH16 #undef DUK_USE_STRHASH_DENSE #define DUK_USE_STRHASH_SKIP_SHIFT 5 #define DUK_USE_STRICT_DECL #undef DUK_USE_STRICT_UTF8_SOURCE #define DUK_USE_STRING_BUILTIN #undef DUK_USE_STRLEN16 #define DUK_USE_STRTAB_GROW_LIMIT 17 #define DUK_USE_STRTAB_MAXSIZE 268435456L #define DUK_USE_STRTAB_MINSIZE 1024 #undef DUK_USE_STRTAB_PTRCOMP #define DUK_USE_STRTAB_RESIZE_CHECK_MASK 255 #define DUK_USE_STRTAB_SHRINK_LIMIT 6 #undef DUK_USE_STRTAB_TORTURE #undef DUK_USE_SYMBOL_BUILTIN #define DUK_USE_TAILCALL #define DUK_USE_TARGET_INFO "unknown" #define DUK_USE_TRACEBACKS #define DUK_USE_TRACEBACK_DEPTH 10 #define DUK_USE_USER_DECLARE() /* no user declarations */ #define DUK_USE_VALSTACK_GROW_SHIFT 2 #define DUK_USE_VALSTACK_LIMIT 1000000L #define DUK_USE_VALSTACK_SHRINK_CHECK_SHIFT 2 #define DUK_USE_VALSTACK_SHRINK_SLACK_SHIFT 4 #undef DUK_USE_VALSTACK_UNSAFE #define DUK_USE_VERBOSE_ERRORS #define DUK_USE_VERBOSE_EXECUTOR_ERRORS #define DUK_USE_VOLUNTARY_GC #define DUK_USE_ZERO_BUFFER_DATA /* * You may add overriding #define/#undef directives below for * customization. You of course cannot un-#include or un-typedef * anything; these require direct changes above. */ /* __OVERRIDE_DEFINES__ */ /* * Date provider selection * * User may define DUK_USE_DATE_GET_NOW() etc directly, in which case we'll * rely on an external provider. If this is not done, revert to previous * behavior and use Unix/Windows built-in provider. */ #if defined(DUK_COMPILING_DUKTAPE) #if defined(DUK_USE_DATE_GET_NOW) /* External provider already defined. */ #elif defined(DUK_USE_DATE_NOW_GETTIMEOFDAY) #define DUK_USE_DATE_GET_NOW(ctx) duk_bi_date_get_now_gettimeofday() #elif defined(DUK_USE_DATE_NOW_TIME) #define DUK_USE_DATE_GET_NOW(ctx) duk_bi_date_get_now_time() #elif defined(DUK_USE_DATE_NOW_WINDOWS) #define DUK_USE_DATE_GET_NOW(ctx) duk_bi_date_get_now_windows() #elif defined(DUK_USE_DATE_NOW_WINDOWS_SUBMS) #define DUK_USE_DATE_GET_NOW(ctx) duk_bi_date_get_now_windows_subms() #else #error no provider for DUK_USE_DATE_GET_NOW() #endif #if defined(DUK_USE_DATE_GET_LOCAL_TZOFFSET) /* External provider already defined. */ #elif defined(DUK_USE_DATE_TZO_GMTIME_R) || defined(DUK_USE_DATE_TZO_GMTIME_S) || defined(DUK_USE_DATE_TZO_GMTIME) #define DUK_USE_DATE_GET_LOCAL_TZOFFSET(d) duk_bi_date_get_local_tzoffset_gmtime((d)) #elif defined(DUK_USE_DATE_TZO_WINDOWS) #define DUK_USE_DATE_GET_LOCAL_TZOFFSET(d) duk_bi_date_get_local_tzoffset_windows((d)) #elif defined(DUK_USE_DATE_TZO_WINDOWS_NO_DST) #define DUK_USE_DATE_GET_LOCAL_TZOFFSET(d) duk_bi_date_get_local_tzoffset_windows_no_dst((d)) #else #error no provider for DUK_USE_DATE_GET_LOCAL_TZOFFSET() #endif #if defined(DUK_USE_DATE_PARSE_STRING) /* External provider already defined. */ #elif defined(DUK_USE_DATE_PRS_STRPTIME) #define DUK_USE_DATE_PARSE_STRING(ctx,str) duk_bi_date_parse_string_strptime((ctx), (str)) #elif defined(DUK_USE_DATE_PRS_GETDATE) #define DUK_USE_DATE_PARSE_STRING(ctx,str) duk_bi_date_parse_string_getdate((ctx), (str)) #else /* No provider for DUK_USE_DATE_PARSE_STRING(), fall back to ISO 8601 only. */ #endif #if defined(DUK_USE_DATE_FORMAT_STRING) /* External provider already defined. */ #elif defined(DUK_USE_DATE_FMT_STRFTIME) #define DUK_USE_DATE_FORMAT_STRING(ctx,parts,tzoffset,flags) \ duk_bi_date_format_parts_strftime((ctx), (parts), (tzoffset), (flags)) #else /* No provider for DUK_USE_DATE_FORMAT_STRING(), fall back to ISO 8601 only. */ #endif #if defined(DUK_USE_GET_MONOTONIC_TIME) /* External provider already defined. */ #elif defined(DUK_USE_GET_MONOTONIC_TIME_CLOCK_GETTIME) #define DUK_USE_GET_MONOTONIC_TIME(ctx) duk_bi_date_get_monotonic_time_clock_gettime() #elif defined(DUK_USE_GET_MONOTONIC_TIME_WINDOWS_QPC) #define DUK_USE_GET_MONOTONIC_TIME(ctx) duk_bi_date_get_monotonic_time_windows_qpc() #else /* No provider for DUK_USE_GET_MONOTONIC_TIME(), fall back to DUK_USE_DATE_GET_NOW(). */ #endif #endif /* DUK_COMPILING_DUKTAPE */ /* * Checks for legacy feature options (DUK_OPT_xxx) */ #if defined(DUK_OPT_ASSERTIONS) #error unsupported legacy feature option DUK_OPT_ASSERTIONS used #endif #if defined(DUK_OPT_BUFFEROBJECT_SUPPORT) #error unsupported legacy feature option DUK_OPT_BUFFEROBJECT_SUPPORT used #endif #if defined(DUK_OPT_BUFLEN16) #error unsupported legacy feature option DUK_OPT_BUFLEN16 used #endif #if defined(DUK_OPT_DATAPTR16) #error unsupported legacy feature option DUK_OPT_DATAPTR16 used #endif #if defined(DUK_OPT_DATAPTR_DEC16) #error unsupported legacy feature option DUK_OPT_DATAPTR_DEC16 used #endif #if defined(DUK_OPT_DATAPTR_ENC16) #error unsupported legacy feature option DUK_OPT_DATAPTR_ENC16 used #endif #if defined(DUK_OPT_DDDPRINT) #error unsupported legacy feature option DUK_OPT_DDDPRINT used #endif #if defined(DUK_OPT_DDPRINT) #error unsupported legacy feature option DUK_OPT_DDPRINT used #endif #if defined(DUK_OPT_DEBUG) #error unsupported legacy feature option DUK_OPT_DEBUG used #endif #if defined(DUK_OPT_DEBUGGER_DUMPHEAP) #error unsupported legacy feature option DUK_OPT_DEBUGGER_DUMPHEAP used #endif #if defined(DUK_OPT_DEBUGGER_FWD_LOGGING) #error unsupported legacy feature option DUK_OPT_DEBUGGER_FWD_LOGGING used #endif #if defined(DUK_OPT_DEBUGGER_FWD_PRINTALERT) #error unsupported legacy feature option DUK_OPT_DEBUGGER_FWD_PRINTALERT used #endif #if defined(DUK_OPT_DEBUGGER_SUPPORT) #error unsupported legacy feature option DUK_OPT_DEBUGGER_SUPPORT used #endif #if defined(DUK_OPT_DEBUGGER_TRANSPORT_TORTURE) #error unsupported legacy feature option DUK_OPT_DEBUGGER_TRANSPORT_TORTURE used #endif #if defined(DUK_OPT_DEBUG_BUFSIZE) #error unsupported legacy feature option DUK_OPT_DEBUG_BUFSIZE used #endif #if defined(DUK_OPT_DECLARE) #error unsupported legacy feature option DUK_OPT_DECLARE used #endif #if defined(DUK_OPT_DEEP_C_STACK) #error unsupported legacy feature option DUK_OPT_DEEP_C_STACK used #endif #if defined(DUK_OPT_DLL_BUILD) #error unsupported legacy feature option DUK_OPT_DLL_BUILD used #endif #if defined(DUK_OPT_DPRINT) #error unsupported legacy feature option DUK_OPT_DPRINT used #endif #if defined(DUK_OPT_DPRINT_COLORS) #error unsupported legacy feature option DUK_OPT_DPRINT_COLORS used #endif #if defined(DUK_OPT_DPRINT_RDTSC) #error unsupported legacy feature option DUK_OPT_DPRINT_RDTSC used #endif #if defined(DUK_OPT_EXEC_TIMEOUT_CHECK) #error unsupported legacy feature option DUK_OPT_EXEC_TIMEOUT_CHECK used #endif #if defined(DUK_OPT_EXTERNAL_STRINGS) #error unsupported legacy feature option DUK_OPT_EXTERNAL_STRINGS used #endif #if defined(DUK_OPT_EXTSTR_FREE) #error unsupported legacy feature option DUK_OPT_EXTSTR_FREE used #endif #if defined(DUK_OPT_EXTSTR_INTERN_CHECK) #error unsupported legacy feature option DUK_OPT_EXTSTR_INTERN_CHECK used #endif #if defined(DUK_OPT_FASTINT) #error unsupported legacy feature option DUK_OPT_FASTINT used #endif #if defined(DUK_OPT_FORCE_ALIGN) #error unsupported legacy feature option DUK_OPT_FORCE_ALIGN used #endif #if defined(DUK_OPT_FORCE_BYTEORDER) #error unsupported legacy feature option DUK_OPT_FORCE_BYTEORDER used #endif #if defined(DUK_OPT_FUNCPTR16) #error unsupported legacy feature option DUK_OPT_FUNCPTR16 used #endif #if defined(DUK_OPT_FUNCPTR_DEC16) #error unsupported legacy feature option DUK_OPT_FUNCPTR_DEC16 used #endif #if defined(DUK_OPT_FUNCPTR_ENC16) #error unsupported legacy feature option DUK_OPT_FUNCPTR_ENC16 used #endif #if defined(DUK_OPT_FUNC_NONSTD_CALLER_PROPERTY) #error unsupported legacy feature option DUK_OPT_FUNC_NONSTD_CALLER_PROPERTY used #endif #if defined(DUK_OPT_FUNC_NONSTD_SOURCE_PROPERTY) #error unsupported legacy feature option DUK_OPT_FUNC_NONSTD_SOURCE_PROPERTY used #endif #if defined(DUK_OPT_GC_TORTURE) #error unsupported legacy feature option DUK_OPT_GC_TORTURE used #endif #if defined(DUK_OPT_HAVE_CUSTOM_H) #error unsupported legacy feature option DUK_OPT_HAVE_CUSTOM_H used #endif #if defined(DUK_OPT_HEAPPTR16) #error unsupported legacy feature option DUK_OPT_HEAPPTR16 used #endif #if defined(DUK_OPT_HEAPPTR_DEC16) #error unsupported legacy feature option DUK_OPT_HEAPPTR_DEC16 used #endif #if defined(DUK_OPT_HEAPPTR_ENC16) #error unsupported legacy feature option DUK_OPT_HEAPPTR_ENC16 used #endif #if defined(DUK_OPT_INTERRUPT_COUNTER) #error unsupported legacy feature option DUK_OPT_INTERRUPT_COUNTER used #endif #if defined(DUK_OPT_JSON_STRINGIFY_FASTPATH) #error unsupported legacy feature option DUK_OPT_JSON_STRINGIFY_FASTPATH used #endif #if defined(DUK_OPT_LIGHTFUNC_BUILTINS) #error unsupported legacy feature option DUK_OPT_LIGHTFUNC_BUILTINS used #endif #if defined(DUK_OPT_NONSTD_FUNC_CALLER_PROPERTY) #error unsupported legacy feature option DUK_OPT_NONSTD_FUNC_CALLER_PROPERTY used #endif #if defined(DUK_OPT_NONSTD_FUNC_SOURCE_PROPERTY) #error unsupported legacy feature option DUK_OPT_NONSTD_FUNC_SOURCE_PROPERTY used #endif #if defined(DUK_OPT_NO_ARRAY_SPLICE_NONSTD_DELCOUNT) #error unsupported legacy feature option DUK_OPT_NO_ARRAY_SPLICE_NONSTD_DELCOUNT used #endif #if defined(DUK_OPT_NO_AUGMENT_ERRORS) #error unsupported legacy feature option DUK_OPT_NO_AUGMENT_ERRORS used #endif #if defined(DUK_OPT_NO_BROWSER_LIKE) #error unsupported legacy feature option DUK_OPT_NO_BROWSER_LIKE used #endif #if defined(DUK_OPT_NO_BUFFEROBJECT_SUPPORT) #error unsupported legacy feature option DUK_OPT_NO_BUFFEROBJECT_SUPPORT used #endif #if defined(DUK_OPT_NO_BYTECODE_DUMP_SUPPORT) #error unsupported legacy feature option DUK_OPT_NO_BYTECODE_DUMP_SUPPORT used #endif #if defined(DUK_OPT_NO_COMMONJS_MODULES) #error unsupported legacy feature option DUK_OPT_NO_COMMONJS_MODULES used #endif #if defined(DUK_OPT_NO_ES6_OBJECT_PROTO_PROPERTY) #error unsupported legacy feature option DUK_OPT_NO_ES6_OBJECT_PROTO_PROPERTY used #endif #if defined(DUK_OPT_NO_ES6_OBJECT_SETPROTOTYPEOF) #error unsupported legacy feature option DUK_OPT_NO_ES6_OBJECT_SETPROTOTYPEOF used #endif #if defined(DUK_OPT_NO_ES6_PROXY) #error unsupported legacy feature option DUK_OPT_NO_ES6_PROXY used #endif #if defined(DUK_OPT_NO_FILE_IO) #error unsupported legacy feature option DUK_OPT_NO_FILE_IO used #endif #if defined(DUK_OPT_NO_FUNC_STMT) #error unsupported legacy feature option DUK_OPT_NO_FUNC_STMT used #endif #if defined(DUK_OPT_NO_JC) #error unsupported legacy feature option DUK_OPT_NO_JC used #endif #if defined(DUK_OPT_NO_JSONC) #error unsupported legacy feature option DUK_OPT_NO_JSONC used #endif #if defined(DUK_OPT_NO_JSONX) #error unsupported legacy feature option DUK_OPT_NO_JSONX used #endif #if defined(DUK_OPT_NO_JX) #error unsupported legacy feature option DUK_OPT_NO_JX used #endif #if defined(DUK_OPT_NO_MARK_AND_SWEEP) #error unsupported legacy feature option DUK_OPT_NO_MARK_AND_SWEEP used #endif #if defined(DUK_OPT_NO_MS_STRINGTABLE_RESIZE) #error unsupported legacy feature option DUK_OPT_NO_MS_STRINGTABLE_RESIZE used #endif #if defined(DUK_OPT_NO_NONSTD_ACCESSOR_KEY_ARGUMENT) #error unsupported legacy feature option DUK_OPT_NO_NONSTD_ACCESSOR_KEY_ARGUMENT used #endif #if defined(DUK_OPT_NO_NONSTD_ARRAY_CONCAT_TRAILER) #error unsupported legacy feature option DUK_OPT_NO_NONSTD_ARRAY_CONCAT_TRAILER used #endif #if defined(DUK_OPT_NO_NONSTD_ARRAY_MAP_TRAILER) #error unsupported legacy feature option DUK_OPT_NO_NONSTD_ARRAY_MAP_TRAILER used #endif #if defined(DUK_OPT_NO_NONSTD_ARRAY_SPLICE_DELCOUNT) #error unsupported legacy feature option DUK_OPT_NO_NONSTD_ARRAY_SPLICE_DELCOUNT used #endif #if defined(DUK_OPT_NO_NONSTD_FUNC_STMT) #error unsupported legacy feature option DUK_OPT_NO_NONSTD_FUNC_STMT used #endif #if defined(DUK_OPT_NO_NONSTD_JSON_ESC_U2028_U2029) #error unsupported legacy feature option DUK_OPT_NO_NONSTD_JSON_ESC_U2028_U2029 used #endif #if defined(DUK_OPT_NO_NONSTD_STRING_FROMCHARCODE_32BIT) #error unsupported legacy feature option DUK_OPT_NO_NONSTD_STRING_FROMCHARCODE_32BIT used #endif #if defined(DUK_OPT_NO_OBJECT_ES6_PROTO_PROPERTY) #error unsupported legacy feature option DUK_OPT_NO_OBJECT_ES6_PROTO_PROPERTY used #endif #if defined(DUK_OPT_NO_OBJECT_ES6_SETPROTOTYPEOF) #error unsupported legacy feature option DUK_OPT_NO_OBJECT_ES6_SETPROTOTYPEOF used #endif #if defined(DUK_OPT_NO_OCTAL_SUPPORT) #error unsupported legacy feature option DUK_OPT_NO_OCTAL_SUPPORT used #endif #if defined(DUK_OPT_NO_PACKED_TVAL) #error unsupported legacy feature option DUK_OPT_NO_PACKED_TVAL used #endif #if defined(DUK_OPT_NO_PC2LINE) #error unsupported legacy feature option DUK_OPT_NO_PC2LINE used #endif #if defined(DUK_OPT_NO_REFERENCE_COUNTING) #error unsupported legacy feature option DUK_OPT_NO_REFERENCE_COUNTING used #endif #if defined(DUK_OPT_NO_REGEXP_SUPPORT) #error unsupported legacy feature option DUK_OPT_NO_REGEXP_SUPPORT used #endif #if defined(DUK_OPT_NO_SECTION_B) #error unsupported legacy feature option DUK_OPT_NO_SECTION_B used #endif #if defined(DUK_OPT_NO_SOURCE_NONBMP) #error unsupported legacy feature option DUK_OPT_NO_SOURCE_NONBMP used #endif #if defined(DUK_OPT_NO_STRICT_DECL) #error unsupported legacy feature option DUK_OPT_NO_STRICT_DECL used #endif #if defined(DUK_OPT_NO_TRACEBACKS) #error unsupported legacy feature option DUK_OPT_NO_TRACEBACKS used #endif #if defined(DUK_OPT_NO_VERBOSE_ERRORS) #error unsupported legacy feature option DUK_OPT_NO_VERBOSE_ERRORS used #endif #if defined(DUK_OPT_NO_VOLUNTARY_GC) #error unsupported legacy feature option DUK_OPT_NO_VOLUNTARY_GC used #endif #if defined(DUK_OPT_NO_ZERO_BUFFER_DATA) #error unsupported legacy feature option DUK_OPT_NO_ZERO_BUFFER_DATA used #endif #if defined(DUK_OPT_OBJSIZES16) #error unsupported legacy feature option DUK_OPT_OBJSIZES16 used #endif #if defined(DUK_OPT_PANIC_HANDLER) #error unsupported legacy feature option DUK_OPT_PANIC_HANDLER used #endif #if defined(DUK_OPT_REFCOUNT16) #error unsupported legacy feature option DUK_OPT_REFCOUNT16 used #endif #if defined(DUK_OPT_SEGFAULT_ON_PANIC) #error unsupported legacy feature option DUK_OPT_SEGFAULT_ON_PANIC used #endif #if defined(DUK_OPT_SELF_TESTS) #error unsupported legacy feature option DUK_OPT_SELF_TESTS used #endif #if defined(DUK_OPT_SETJMP) #error unsupported legacy feature option DUK_OPT_SETJMP used #endif #if defined(DUK_OPT_SHUFFLE_TORTURE) #error unsupported legacy feature option DUK_OPT_SHUFFLE_TORTURE used #endif #if defined(DUK_OPT_SIGSETJMP) #error unsupported legacy feature option DUK_OPT_SIGSETJMP used #endif #if defined(DUK_OPT_STRHASH16) #error unsupported legacy feature option DUK_OPT_STRHASH16 used #endif #if defined(DUK_OPT_STRICT_UTF8_SOURCE) #error unsupported legacy feature option DUK_OPT_STRICT_UTF8_SOURCE used #endif #if defined(DUK_OPT_STRLEN16) #error unsupported legacy feature option DUK_OPT_STRLEN16 used #endif #if defined(DUK_OPT_STRTAB_CHAIN) #error unsupported legacy feature option DUK_OPT_STRTAB_CHAIN used #endif #if defined(DUK_OPT_STRTAB_CHAIN_SIZE) #error unsupported legacy feature option DUK_OPT_STRTAB_CHAIN_SIZE used #endif #if defined(DUK_OPT_TARGET_INFO) #error unsupported legacy feature option DUK_OPT_TARGET_INFO used #endif #if defined(DUK_OPT_TRACEBACK_DEPTH) #error unsupported legacy feature option DUK_OPT_TRACEBACK_DEPTH used #endif #if defined(DUK_OPT_UNDERSCORE_SETJMP) #error unsupported legacy feature option DUK_OPT_UNDERSCORE_SETJMP used #endif #if defined(DUK_OPT_USER_INITJS) #error unsupported legacy feature option DUK_OPT_USER_INITJS used #endif /* * Checks for config option consistency (DUK_USE_xxx) */ #if defined(DUK_USE_32BIT_PTRS) #error unsupported config option used (option has been removed): DUK_USE_32BIT_PTRS #endif #if defined(DUK_USE_ALIGN_4) #error unsupported config option used (option has been removed): DUK_USE_ALIGN_4 #endif #if defined(DUK_USE_ALIGN_8) #error unsupported config option used (option has been removed): DUK_USE_ALIGN_8 #endif #if defined(DUK_USE_BROWSER_LIKE) #error unsupported config option used (option has been removed): DUK_USE_BROWSER_LIKE #endif #if defined(DUK_USE_BUILTIN_INITJS) #error unsupported config option used (option has been removed): DUK_USE_BUILTIN_INITJS #endif #if defined(DUK_USE_BYTEORDER_FORCED) #error unsupported config option used (option has been removed): DUK_USE_BYTEORDER_FORCED #endif #if defined(DUK_USE_DATAPTR_DEC16) && !defined(DUK_USE_DATAPTR16) #error config option DUK_USE_DATAPTR_DEC16 requires option DUK_USE_DATAPTR16 (which is missing) #endif #if defined(DUK_USE_DATAPTR_ENC16) && !defined(DUK_USE_DATAPTR16) #error config option DUK_USE_DATAPTR_ENC16 requires option DUK_USE_DATAPTR16 (which is missing) #endif #if defined(DUK_USE_DDDPRINT) #error unsupported config option used (option has been removed): DUK_USE_DDDPRINT #endif #if defined(DUK_USE_DDPRINT) #error unsupported config option used (option has been removed): DUK_USE_DDPRINT #endif #if defined(DUK_USE_DEBUGGER_FWD_LOGGING) #error unsupported config option used (option has been removed): DUK_USE_DEBUGGER_FWD_LOGGING #endif #if defined(DUK_USE_DEBUGGER_FWD_PRINTALERT) #error unsupported config option used (option has been removed): DUK_USE_DEBUGGER_FWD_PRINTALERT #endif #if defined(DUK_USE_DEBUGGER_SUPPORT) && !defined(DUK_USE_INTERRUPT_COUNTER) #error config option DUK_USE_DEBUGGER_SUPPORT requires option DUK_USE_INTERRUPT_COUNTER (which is missing) #endif #if defined(DUK_USE_DEEP_C_STACK) #error unsupported config option used (option has been removed): DUK_USE_DEEP_C_STACK #endif #if defined(DUK_USE_DOUBLE_BE) #error unsupported config option used (option has been removed): DUK_USE_DOUBLE_BE #endif #if defined(DUK_USE_DOUBLE_BE) && defined(DUK_USE_DOUBLE_LE) #error config option DUK_USE_DOUBLE_BE conflicts with option DUK_USE_DOUBLE_LE (which is also defined) #endif #if defined(DUK_USE_DOUBLE_BE) && defined(DUK_USE_DOUBLE_ME) #error config option DUK_USE_DOUBLE_BE conflicts with option DUK_USE_DOUBLE_ME (which is also defined) #endif #if defined(DUK_USE_DOUBLE_LE) #error unsupported config option used (option has been removed): DUK_USE_DOUBLE_LE #endif #if defined(DUK_USE_DOUBLE_LE) && defined(DUK_USE_DOUBLE_BE) #error config option DUK_USE_DOUBLE_LE conflicts with option DUK_USE_DOUBLE_BE (which is also defined) #endif #if defined(DUK_USE_DOUBLE_LE) && defined(DUK_USE_DOUBLE_ME) #error config option DUK_USE_DOUBLE_LE conflicts with option DUK_USE_DOUBLE_ME (which is also defined) #endif #if defined(DUK_USE_DOUBLE_ME) #error unsupported config option used (option has been removed): DUK_USE_DOUBLE_ME #endif #if defined(DUK_USE_DOUBLE_ME) && defined(DUK_USE_DOUBLE_LE) #error config option DUK_USE_DOUBLE_ME conflicts with option DUK_USE_DOUBLE_LE (which is also defined) #endif #if defined(DUK_USE_DOUBLE_ME) && defined(DUK_USE_DOUBLE_BE) #error config option DUK_USE_DOUBLE_ME conflicts with option DUK_USE_DOUBLE_BE (which is also defined) #endif #if defined(DUK_USE_DPRINT) #error unsupported config option used (option has been removed): DUK_USE_DPRINT #endif #if defined(DUK_USE_DPRINT) && !defined(DUK_USE_DEBUG) #error config option DUK_USE_DPRINT requires option DUK_USE_DEBUG (which is missing) #endif #if defined(DUK_USE_DPRINT_COLORS) #error unsupported config option used (option has been removed): DUK_USE_DPRINT_COLORS #endif #if defined(DUK_USE_DPRINT_RDTSC) #error unsupported config option used (option has been removed): DUK_USE_DPRINT_RDTSC #endif #if defined(DUK_USE_ES6_REGEXP_BRACES) #error unsupported config option used (option has been removed): DUK_USE_ES6_REGEXP_BRACES #endif #if defined(DUK_USE_ESBC_MAX_BYTES) && !defined(DUK_USE_ESBC_LIMITS) #error config option DUK_USE_ESBC_MAX_BYTES requires option DUK_USE_ESBC_LIMITS (which is missing) #endif #if defined(DUK_USE_ESBC_MAX_LINENUMBER) && !defined(DUK_USE_ESBC_LIMITS) #error config option DUK_USE_ESBC_MAX_LINENUMBER requires option DUK_USE_ESBC_LIMITS (which is missing) #endif #if defined(DUK_USE_EXEC_TIMEOUT_CHECK) && !defined(DUK_USE_INTERRUPT_COUNTER) #error config option DUK_USE_EXEC_TIMEOUT_CHECK requires option DUK_USE_INTERRUPT_COUNTER (which is missing) #endif #if defined(DUK_USE_EXTSTR_FREE) && !defined(DUK_USE_HSTRING_EXTDATA) #error config option DUK_USE_EXTSTR_FREE requires option DUK_USE_HSTRING_EXTDATA (which is missing) #endif #if defined(DUK_USE_EXTSTR_INTERN_CHECK) && !defined(DUK_USE_HSTRING_EXTDATA) #error config option DUK_USE_EXTSTR_INTERN_CHECK requires option DUK_USE_HSTRING_EXTDATA (which is missing) #endif #if defined(DUK_USE_FASTINT) && !defined(DUK_USE_64BIT_OPS) #error config option DUK_USE_FASTINT requires option DUK_USE_64BIT_OPS (which is missing) #endif #if defined(DUK_USE_FILE_IO) #error unsupported config option used (option has been removed): DUK_USE_FILE_IO #endif #if defined(DUK_USE_FULL_TVAL) #error unsupported config option used (option has been removed): DUK_USE_FULL_TVAL #endif #if defined(DUK_USE_FUNCPTR_DEC16) && !defined(DUK_USE_FUNCPTR16) #error config option DUK_USE_FUNCPTR_DEC16 requires option DUK_USE_FUNCPTR16 (which is missing) #endif #if defined(DUK_USE_FUNCPTR_ENC16) && !defined(DUK_USE_FUNCPTR16) #error config option DUK_USE_FUNCPTR_ENC16 requires option DUK_USE_FUNCPTR16 (which is missing) #endif #if defined(DUK_USE_HASHBYTES_UNALIGNED_U32_ACCESS) #error unsupported config option used (option has been removed): DUK_USE_HASHBYTES_UNALIGNED_U32_ACCESS #endif #if defined(DUK_USE_HEAPPTR16) && defined(DUK_USE_DEBUG) #error config option DUK_USE_HEAPPTR16 conflicts with option DUK_USE_DEBUG (which is also defined) #endif #if defined(DUK_USE_HEAPPTR_DEC16) && !defined(DUK_USE_HEAPPTR16) #error config option DUK_USE_HEAPPTR_DEC16 requires option DUK_USE_HEAPPTR16 (which is missing) #endif #if defined(DUK_USE_HEAPPTR_ENC16) && !defined(DUK_USE_HEAPPTR16) #error config option DUK_USE_HEAPPTR_ENC16 requires option DUK_USE_HEAPPTR16 (which is missing) #endif #if defined(DUK_USE_INTEGER_BE) #error unsupported config option used (option has been removed): DUK_USE_INTEGER_BE #endif #if defined(DUK_USE_INTEGER_BE) && defined(DUK_USE_INTEGER_LE) #error config option DUK_USE_INTEGER_BE conflicts with option DUK_USE_INTEGER_LE (which is also defined) #endif #if defined(DUK_USE_INTEGER_BE) && defined(DUK_USE_INTEGER_ME) #error config option DUK_USE_INTEGER_BE conflicts with option DUK_USE_INTEGER_ME (which is also defined) #endif #if defined(DUK_USE_INTEGER_LE) #error unsupported config option used (option has been removed): DUK_USE_INTEGER_LE #endif #if defined(DUK_USE_INTEGER_LE) && defined(DUK_USE_INTEGER_BE) #error config option DUK_USE_INTEGER_LE conflicts with option DUK_USE_INTEGER_BE (which is also defined) #endif #if defined(DUK_USE_INTEGER_LE) && defined(DUK_USE_INTEGER_ME) #error config option DUK_USE_INTEGER_LE conflicts with option DUK_USE_INTEGER_ME (which is also defined) #endif #if defined(DUK_USE_INTEGER_ME) #error unsupported config option used (option has been removed): DUK_USE_INTEGER_ME #endif #if defined(DUK_USE_INTEGER_ME) && defined(DUK_USE_INTEGER_LE) #error config option DUK_USE_INTEGER_ME conflicts with option DUK_USE_INTEGER_LE (which is also defined) #endif #if defined(DUK_USE_INTEGER_ME) && defined(DUK_USE_INTEGER_BE) #error config option DUK_USE_INTEGER_ME conflicts with option DUK_USE_INTEGER_BE (which is also defined) #endif #if defined(DUK_USE_MARKANDSWEEP_FINALIZER_TORTURE) #error unsupported config option used (option has been removed): DUK_USE_MARKANDSWEEP_FINALIZER_TORTURE #endif #if defined(DUK_USE_MARK_AND_SWEEP) #error unsupported config option used (option has been removed): DUK_USE_MARK_AND_SWEEP #endif #if defined(DUK_USE_MATH_FMAX) #error unsupported config option used (option has been removed): DUK_USE_MATH_FMAX #endif #if defined(DUK_USE_MATH_FMIN) #error unsupported config option used (option has been removed): DUK_USE_MATH_FMIN #endif #if defined(DUK_USE_MATH_ROUND) #error unsupported config option used (option has been removed): DUK_USE_MATH_ROUND #endif #if defined(DUK_USE_MS_STRINGTABLE_RESIZE) #error unsupported config option used (option has been removed): DUK_USE_MS_STRINGTABLE_RESIZE #endif #if defined(DUK_USE_NONSTD_REGEXP_DOLLAR_ESCAPE) #error unsupported config option used (option has been removed): DUK_USE_NONSTD_REGEXP_DOLLAR_ESCAPE #endif #if defined(DUK_USE_NO_DOUBLE_ALIASING_SELFTEST) #error unsupported config option used (option has been removed): DUK_USE_NO_DOUBLE_ALIASING_SELFTEST #endif #if defined(DUK_USE_OCTAL_SUPPORT) #error unsupported config option used (option has been removed): DUK_USE_OCTAL_SUPPORT #endif #if defined(DUK_USE_PACKED_TVAL_POSSIBLE) #error unsupported config option used (option has been removed): DUK_USE_PACKED_TVAL_POSSIBLE #endif #if defined(DUK_USE_PANIC_ABORT) #error unsupported config option used (option has been removed): DUK_USE_PANIC_ABORT #endif #if defined(DUK_USE_PANIC_EXIT) #error unsupported config option used (option has been removed): DUK_USE_PANIC_EXIT #endif #if defined(DUK_USE_PANIC_HANDLER) #error unsupported config option used (option has been removed): DUK_USE_PANIC_HANDLER #endif #if defined(DUK_USE_PANIC_SEGFAULT) #error unsupported config option used (option has been removed): DUK_USE_PANIC_SEGFAULT #endif #if defined(DUK_USE_POW_NETBSD_WORKAROUND) #error unsupported config option used (option has been removed): DUK_USE_POW_NETBSD_WORKAROUND #endif #if defined(DUK_USE_RDTSC) #error unsupported config option used (option has been removed): DUK_USE_RDTSC #endif #if defined(DUK_USE_REFZERO_FINALIZER_TORTURE) #error unsupported config option used (option has been removed): DUK_USE_REFZERO_FINALIZER_TORTURE #endif #if defined(DUK_USE_ROM_GLOBAL_CLONE) && !defined(DUK_USE_ROM_STRINGS) #error config option DUK_USE_ROM_GLOBAL_CLONE requires option DUK_USE_ROM_STRINGS (which is missing) #endif #if defined(DUK_USE_ROM_GLOBAL_CLONE) && !defined(DUK_USE_ROM_OBJECTS) #error config option DUK_USE_ROM_GLOBAL_CLONE requires option DUK_USE_ROM_OBJECTS (which is missing) #endif #if defined(DUK_USE_ROM_GLOBAL_CLONE) && defined(DUK_USE_ROM_GLOBAL_INHERIT) #error config option DUK_USE_ROM_GLOBAL_CLONE conflicts with option DUK_USE_ROM_GLOBAL_INHERIT (which is also defined) #endif #if defined(DUK_USE_ROM_GLOBAL_INHERIT) && !defined(DUK_USE_ROM_STRINGS) #error config option DUK_USE_ROM_GLOBAL_INHERIT requires option DUK_USE_ROM_STRINGS (which is missing) #endif #if defined(DUK_USE_ROM_GLOBAL_INHERIT) && !defined(DUK_USE_ROM_OBJECTS) #error config option DUK_USE_ROM_GLOBAL_INHERIT requires option DUK_USE_ROM_OBJECTS (which is missing) #endif #if defined(DUK_USE_ROM_GLOBAL_INHERIT) && defined(DUK_USE_ROM_GLOBAL_CLONE) #error config option DUK_USE_ROM_GLOBAL_INHERIT conflicts with option DUK_USE_ROM_GLOBAL_CLONE (which is also defined) #endif #if defined(DUK_USE_ROM_OBJECTS) && !defined(DUK_USE_ROM_STRINGS) #error config option DUK_USE_ROM_OBJECTS requires option DUK_USE_ROM_STRINGS (which is missing) #endif #if defined(DUK_USE_ROM_STRINGS) && !defined(DUK_USE_ROM_OBJECTS) #error config option DUK_USE_ROM_STRINGS requires option DUK_USE_ROM_OBJECTS (which is missing) #endif #if defined(DUK_USE_SETJMP) #error unsupported config option used (option has been removed): DUK_USE_SETJMP #endif #if defined(DUK_USE_SIGSETJMP) #error unsupported config option used (option has been removed): DUK_USE_SIGSETJMP #endif #if defined(DUK_USE_STRTAB_CHAIN) #error unsupported config option used (option has been removed): DUK_USE_STRTAB_CHAIN #endif #if defined(DUK_USE_STRTAB_CHAIN_SIZE) #error unsupported config option used (option has been removed): DUK_USE_STRTAB_CHAIN_SIZE #endif #if defined(DUK_USE_STRTAB_CHAIN_SIZE) && !defined(DUK_USE_STRTAB_CHAIN) #error config option DUK_USE_STRTAB_CHAIN_SIZE requires option DUK_USE_STRTAB_CHAIN (which is missing) #endif #if defined(DUK_USE_STRTAB_PROBE) #error unsupported config option used (option has been removed): DUK_USE_STRTAB_PROBE #endif #if defined(DUK_USE_STRTAB_PTRCOMP) && !defined(DUK_USE_HEAPPTR16) #error config option DUK_USE_STRTAB_PTRCOMP requires option DUK_USE_HEAPPTR16 (which is missing) #endif #if defined(DUK_USE_TAILCALL) && defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY) #error config option DUK_USE_TAILCALL conflicts with option DUK_USE_NONSTD_FUNC_CALLER_PROPERTY (which is also defined) #endif #if defined(DUK_USE_UNALIGNED_ACCESSES_POSSIBLE) #error unsupported config option used (option has been removed): DUK_USE_UNALIGNED_ACCESSES_POSSIBLE #endif #if defined(DUK_USE_UNDERSCORE_SETJMP) #error unsupported config option used (option has been removed): DUK_USE_UNDERSCORE_SETJMP #endif #if defined(DUK_USE_USER_INITJS) #error unsupported config option used (option has been removed): DUK_USE_USER_INITJS #endif #if defined(DUK_USE_CPP_EXCEPTIONS) && !defined(__cplusplus) #error DUK_USE_CPP_EXCEPTIONS enabled but not compiling with a C++ compiler #endif /* * Convert DUK_USE_BYTEORDER, from whatever source, into currently used * internal defines. If detection failed, #error out. */ #if defined(DUK_USE_BYTEORDER) #if (DUK_USE_BYTEORDER == 1) #define DUK_USE_INTEGER_LE #define DUK_USE_DOUBLE_LE #elif (DUK_USE_BYTEORDER == 2) #define DUK_USE_INTEGER_LE /* integer endianness is little on purpose */ #define DUK_USE_DOUBLE_ME #elif (DUK_USE_BYTEORDER == 3) #define DUK_USE_INTEGER_BE #define DUK_USE_DOUBLE_BE #else #error unsupported: byte order invalid #endif /* byte order */ #else #error unsupported: byte order detection failed #endif /* defined(DUK_USE_BYTEORDER) */ #endif /* DUK_CONFIG_H_INCLUDED */ ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/duk_console.c ================================================ /* * Minimal 'console' binding. * * https://github.com/DeveloperToolsWG/console-object/blob/master/api.md * https://developers.google.com/web/tools/chrome-devtools/debug/console/console-reference * https://developer.mozilla.org/en/docs/Web/API/console */ #include <stdio.h> #include <stdarg.h> #include "duktape.h" #include "duk_console.h" /* XXX: Add some form of log level filtering. */ /* XXX: For now logs everything to stdout, V8/Node.js logs debug/info level * to stdout, warn and above to stderr. Should this extra do the same? */ /* XXX: Should all output be written via e.g. console.write(formattedMsg)? * This would make it easier for user code to redirect all console output * to a custom backend. */ /* XXX: Init console object using duk_def_prop() when that call is available. */ static duk_ret_t duk__console_log_helper(duk_context *ctx, const char *error_name) { duk_idx_t i, n; duk_uint_t flags; flags = (duk_uint_t) duk_get_current_magic(ctx); n = duk_get_top(ctx); duk_get_global_string(ctx, "console"); duk_get_prop_string(ctx, -1, "format"); for (i = 0; i < n; i++) { if (duk_check_type_mask(ctx, i, DUK_TYPE_MASK_OBJECT)) { /* Slow path formatting. */ duk_dup(ctx, -1); /* console.format */ duk_dup(ctx, i); duk_call(ctx, 1); duk_replace(ctx, i); /* arg[i] = console.format(arg[i]); */ } } duk_pop_2(ctx); duk_push_string(ctx, " "); duk_insert(ctx, 0); duk_join(ctx, n); if (error_name) { duk_push_error_object(ctx, DUK_ERR_ERROR, "%s", duk_require_string(ctx, -1)); duk_push_string(ctx, "name"); duk_push_string(ctx, error_name); duk_def_prop(ctx, -3, DUK_DEFPROP_FORCE | DUK_DEFPROP_HAVE_VALUE); /* to get e.g. 'Trace: 1 2 3' */ duk_get_prop_string(ctx, -1, "stack"); } fprintf(stdout, "%s\n", duk_to_string(ctx, -1)); if (flags & DUK_CONSOLE_FLUSH) { fflush(stdout); } return 0; } static duk_ret_t duk__console_assert(duk_context *ctx) { if (duk_to_boolean(ctx, 0)) { return 0; } duk_remove(ctx, 0); return duk__console_log_helper(ctx, "AssertionError"); } static duk_ret_t duk__console_log(duk_context *ctx) { return duk__console_log_helper(ctx, NULL); } static duk_ret_t duk__console_trace(duk_context *ctx) { return duk__console_log_helper(ctx, "Trace"); } static duk_ret_t duk__console_info(duk_context *ctx) { return duk__console_log_helper(ctx, NULL); } static duk_ret_t duk__console_warn(duk_context *ctx) { return duk__console_log_helper(ctx, NULL); } static duk_ret_t duk__console_error(duk_context *ctx) { return duk__console_log_helper(ctx, "Error"); } static duk_ret_t duk__console_dir(duk_context *ctx) { /* For now, just share the formatting of .log() */ return duk__console_log_helper(ctx, 0); } static void duk__console_reg_vararg_func(duk_context *ctx, duk_c_function func, const char *name, duk_uint_t flags) { duk_push_c_function(ctx, func, DUK_VARARGS); duk_push_string(ctx, "name"); duk_push_string(ctx, name); duk_def_prop(ctx, -3, DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_FORCE); /* Improve stacktraces by displaying function name */ duk_set_magic(ctx, -1, (duk_int_t) flags); duk_put_prop_string(ctx, -2, name); } void duk_console_init(duk_context *ctx, duk_uint_t flags) { duk_push_object(ctx); /* Custom function to format objects; user can replace. * For now, try JX-formatting and if that fails, fall back * to ToString(v). */ duk_eval_string(ctx, "(function (E) {" "return function format(v){" "try{" "return E('jx',v);" "}catch(e){" "return String(v);" /* String() allows symbols, ToString() internal algorithm doesn't. */ "}" "};" "})(Duktape.enc)"); duk_put_prop_string(ctx, -2, "format"); duk__console_reg_vararg_func(ctx, duk__console_assert, "assert", flags); duk__console_reg_vararg_func(ctx, duk__console_log, "log", flags); duk__console_reg_vararg_func(ctx, duk__console_log, "debug", flags); /* alias to console.log */ duk__console_reg_vararg_func(ctx, duk__console_trace, "trace", flags); duk__console_reg_vararg_func(ctx, duk__console_info, "info", flags); duk__console_reg_vararg_func(ctx, duk__console_warn, "warn", flags); duk__console_reg_vararg_func(ctx, duk__console_error, "error", flags); duk__console_reg_vararg_func(ctx, duk__console_error, "exception", flags); /* alias to console.error */ duk__console_reg_vararg_func(ctx, duk__console_dir, "dir", flags); duk_put_global_string(ctx, "console"); /* Proxy wrapping: ensures any undefined console method calls are * ignored silently. This is required specifically by the * DeveloperToolsWG proposal (and is implemented also by Firefox: * https://bugzilla.mozilla.org/show_bug.cgi?id=629607). */ if (flags & DUK_CONSOLE_PROXY_WRAPPER) { /* Tolerate errors: Proxy may be disabled. */ duk_peval_string_noresult(ctx, "(function(){" "var D=function(){};" "console=new Proxy(console,{" "get:function(t,k){" "var v=t[k];" "return typeof v==='function'?v:D;" "}" "});" "})();" ); } } ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/duk_console.h ================================================ #if !defined(DUK_CONSOLE_H_INCLUDED) #define DUK_CONSOLE_H_INCLUDED #include "duktape.h" /* Use a proxy wrapper to make undefined methods (console.foo()) no-ops. */ #define DUK_CONSOLE_PROXY_WRAPPER (1 << 0) /* Flush output after every call. */ #define DUK_CONSOLE_FLUSH (1 << 1) extern void duk_console_init(duk_context *ctx, duk_uint_t flags); #endif /* DUK_CONSOLE_H_INCLUDED */ ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/duk_logging.c ================================================ /* * Logging support */ #include <stdio.h> #include <string.h> #include <stdarg.h> #include "duktape.h" #include "duk_logging.h" /* XXX: uses stderr always for now, configurable? */ #define DUK_LOGGING_FLUSH /* Duktape 1.x: flush stderr */ /* 3-letter log level strings. */ static const char duk__log_level_strings[] = { 'T', 'R', 'C', 'D', 'B', 'G', 'I', 'N', 'F', 'W', 'R', 'N', 'E', 'R', 'R', 'F', 'T', 'L' }; /* Log method names. */ static const char *duk__log_method_names[] = { "trace", "debug", "info", "warn", "error", "fatal" }; /* Constructor. */ static duk_ret_t duk__logger_constructor(duk_context *ctx) { duk_idx_t nargs; /* Calling as a non-constructor is not meaningful. */ if (!duk_is_constructor_call(ctx)) { return DUK_RET_TYPE_ERROR; } nargs = duk_get_top(ctx); duk_set_top(ctx, 1); duk_push_this(ctx); /* [ name this ] */ if (nargs == 0) { /* Automatic defaulting of logger name from caller. This * would work poorly with tail calls, but constructor calls * are currently never tail calls, so tail calls are not an * issue now. */ duk_inspect_callstack_entry(ctx, -2); if (duk_is_object(ctx, -1)) { if (duk_get_prop_string(ctx, -1, "function")) { if (duk_get_prop_string(ctx, -1, "fileName")) { if (duk_is_string(ctx, -1)) { duk_replace(ctx, 0); } } } } /* Leave values on stack on purpose, ignored below. */ /* Stripping the filename might be a good idea * ("/foo/bar/quux.js" -> logger name "quux"), * but now used verbatim. */ } /* The stack is unbalanced here on purpose; we only rely on the * initial two values: [ name this ]. */ if (duk_is_string(ctx, 0)) { duk_dup(ctx, 0); duk_put_prop_string(ctx, 1, "n"); } else { /* don't set 'n' at all, inherited value is used as name */ } duk_compact(ctx, 1); return 0; /* keep default instance */ } /* Default function to format objects. Tries to use toLogString() but falls * back to toString(). Any errors are propagated out without catching. */ static duk_ret_t duk__logger_prototype_fmt(duk_context *ctx) { if (duk_get_prop_string(ctx, 0, "toLogString")) { /* [ arg toLogString ] */ duk_dup(ctx, 0); duk_call_method(ctx, 0); /* [ arg result ] */ return 1; } /* [ arg undefined ] */ duk_pop(ctx); duk_to_string(ctx, 0); return 1; } /* Default function to write a formatted log line. Writes to stderr, * appending a newline to the log line. * * The argument is a buffer; avoid coercing the buffer to a string to * avoid string table traffic. */ static duk_ret_t duk__logger_prototype_raw(duk_context *ctx) { const char *data; duk_size_t data_len; data = (const char *) duk_require_buffer(ctx, 0, &data_len); fwrite((const void *) data, 1, data_len, stderr); fputc((int) '\n', stderr); #if defined(DUK_LOGGING_FLUSH) fflush(stderr); #endif return 0; } /* Log frontend shared helper, magic value indicates log level. Provides * frontend functions: trace(), debug(), info(), warn(), error(), fatal(). * This needs to have small footprint, reasonable performance, minimal * memory churn, etc. */ static duk_ret_t duk__logger_prototype_log_shared(duk_context *ctx) { duk_double_t now; duk_time_components comp; duk_small_int_t entry_lev; duk_small_int_t logger_lev; duk_int_t nargs; duk_int_t i; duk_size_t tot_len; const duk_uint8_t *arg_str; duk_size_t arg_len; duk_uint8_t *buf, *p; const duk_uint8_t *q; duk_uint8_t date_buf[32]; /* maximum format length is 24+1 (NUL), round up. */ duk_size_t date_len; duk_small_int_t rc; /* XXX: sanitize to printable (and maybe ASCII) */ /* XXX: better multiline */ /* * Logger arguments are: * * magic: log level (0-5) * this: logger * stack: plain log args * * We want to minimize memory churn so a two-pass approach * is used: first pass formats arguments and computes final * string length, second pass copies strings into a buffer * allocated directly with the correct size. If the backend * function plays nice, it won't coerce the buffer to a string * (and thus intern it). */ entry_lev = duk_get_current_magic(ctx); if (entry_lev < DUK_LOG_TRACE || entry_lev > DUK_LOG_FATAL) { /* Should never happen, check just in case. */ return 0; } nargs = duk_get_top(ctx); /* [ arg1 ... argN this ] */ /* * Log level check */ duk_push_this(ctx); duk_get_prop_string(ctx, -1, "l"); logger_lev = (duk_small_int_t) duk_get_int(ctx, -1); if (entry_lev < logger_lev) { return 0; } /* log level could be popped but that's not necessary */ now = duk_get_now(ctx); duk_time_to_components(ctx, now, &comp); sprintf((char *) date_buf, "%04d-%02d-%02dT%02d:%02d:%02d.%03dZ", (int) comp.year, (int) comp.month + 1, (int) comp.day, (int) comp.hours, (int) comp.minutes, (int) comp.seconds, (int) comp.milliseconds); date_len = strlen((const char *) date_buf); duk_get_prop_string(ctx, -2, "n"); duk_to_string(ctx, -1); /* [ arg1 ... argN this loggerLevel loggerName ] */ /* * Pass 1 */ /* Line format: <time> <entryLev> <loggerName>: <msg> */ tot_len = 0; tot_len += 3 + /* separators: space, space, colon */ 3 + /* level string */ date_len + /* time */ duk_get_length(ctx, -1); /* loggerName */ for (i = 0; i < nargs; i++) { /* When formatting an argument to a string, errors may happen from multiple * causes. In general we want to catch obvious errors like a toLogString() * throwing an error, but we don't currently try to catch every possible * error. In particular, internal errors (like out of memory or stack) are * not caught. Also, we expect Error toString() to not throw an error. */ if (duk_is_object(ctx, i)) { /* duk_pcall_prop() may itself throw an error, but we're content * in catching the obvious errors (like toLogString() throwing an * error). */ duk_push_string(ctx, "fmt"); duk_dup(ctx, i); /* [ arg1 ... argN this loggerLevel loggerName 'fmt' arg ] */ /* call: this.fmt(arg) */ rc = duk_pcall_prop(ctx, -5 /*obj_index*/, 1 /*nargs*/); if (rc) { /* Keep the error as the result (coercing it might fail below, * but we don't catch that now). */ ; } duk_replace(ctx, i); } (void) duk_to_lstring(ctx, i, &arg_len); tot_len++; /* sep (even before first one) */ tot_len += arg_len; } /* * Pass 2 */ /* XXX: Here it'd be nice if we didn't need to allocate a new fixed * buffer for every write. This would be possible if raw() took a * buffer and a length. We could then use a preallocated buffer for * most log writes and request raw() to write a partial buffer. */ buf = (duk_uint8_t *) duk_push_fixed_buffer(ctx, tot_len); p = buf; memcpy((void *) p, (const void *) date_buf, (size_t) date_len); p += date_len; *p++ = (duk_uint8_t) ' '; q = (const duk_uint8_t *) duk__log_level_strings + (entry_lev * 3); memcpy((void *) p, (const void *) q, (size_t) 3); p += 3; *p++ = (duk_uint8_t) ' '; arg_str = (const duk_uint8_t *) duk_get_lstring(ctx, -2, &arg_len); memcpy((void *) p, (const void *) arg_str, (size_t) arg_len); p += arg_len; *p++ = (duk_uint8_t) ':'; for (i = 0; i < nargs; i++) { *p++ = (duk_uint8_t) ' '; arg_str = (const duk_uint8_t *) duk_get_lstring(ctx, i, &arg_len); memcpy((void *) p, (const void *) arg_str, (size_t) arg_len); p += arg_len; } /* [ arg1 ... argN this loggerLevel loggerName buffer ] */ /* Call this.raw(msg); look up through the instance allows user to override * the raw() function in the instance or in the prototype for maximum * flexibility. */ duk_push_string(ctx, "raw"); duk_dup(ctx, -2); /* [ arg1 ... argN this loggerLevel loggerName buffer 'raw' buffer ] */ duk_call_prop(ctx, -6, 1); /* this.raw(buffer) */ return 0; } void duk_log_va(duk_context *ctx, duk_int_t level, const char *fmt, va_list ap) { if (level < 0) { level = 0; } else if (level > (int) (sizeof(duk__log_method_names) / sizeof(const char *)) - 1) { level = (int) (sizeof(duk__log_method_names) / sizeof(const char *)) - 1; } duk_push_global_stash(ctx); duk_get_prop_string(ctx, -1, "\xff" "logger:constructor"); /* fixed at init time */ duk_get_prop_string(ctx, -1, "clog"); duk_get_prop_string(ctx, -1, duk__log_method_names[level]); duk_dup(ctx, -2); duk_push_vsprintf(ctx, fmt, ap); /* [ ... stash Logger clog logfunc clog(=this) msg ] */ duk_call_method(ctx, 1 /*nargs*/); /* [ ... stash Logger clog res ] */ duk_pop_n(ctx, 4); } void duk_log(duk_context *ctx, duk_int_t level, const char *fmt, ...) { va_list ap; va_start(ap, fmt); duk_log_va(ctx, level, fmt, ap); va_end(ap); } void duk_logging_init(duk_context *ctx, duk_uint_t flags) { /* XXX: Add .name property for logger functions (useful for stack traces if they throw). */ (void) flags; duk_eval_string(ctx, "(function(cons,prot){" "Object.defineProperty(Duktape,'Logger',{value:cons,writable:true,configurable:true});" "Object.defineProperty(cons,'prototype',{value:prot});" "Object.defineProperty(cons,'clog',{value:new Duktape.Logger('C'),writable:true,configurable:true});" "});"); duk_push_c_function(ctx, duk__logger_constructor, DUK_VARARGS /*nargs*/); /* Duktape.Logger */ duk_push_object(ctx); /* Duktape.Logger.prototype */ /* [ ... func Duktape.Logger Duktape.Logger.prototype ] */ duk_push_string(ctx, "name"); duk_push_string(ctx, "Logger"); duk_def_prop(ctx, -4, DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_FORCE); duk_dup_top(ctx); duk_put_prop_string(ctx, -2, "constructor"); duk_push_int(ctx, 2); duk_put_prop_string(ctx, -2, "l"); duk_push_string(ctx, "anon"); duk_put_prop_string(ctx, -2, "n"); duk_push_c_function(ctx, duk__logger_prototype_fmt, 1 /*nargs*/); duk_put_prop_string(ctx, -2, "fmt"); duk_push_c_function(ctx, duk__logger_prototype_raw, 1 /*nargs*/); duk_put_prop_string(ctx, -2, "raw"); duk_push_c_function(ctx, duk__logger_prototype_log_shared, DUK_VARARGS /*nargs*/); duk_set_magic(ctx, -1, 0); /* magic=0: trace */ duk_put_prop_string(ctx, -2, "trace"); duk_push_c_function(ctx, duk__logger_prototype_log_shared, DUK_VARARGS /*nargs*/); duk_set_magic(ctx, -1, 1); /* magic=1: debug */ duk_put_prop_string(ctx, -2, "debug"); duk_push_c_function(ctx, duk__logger_prototype_log_shared, DUK_VARARGS /*nargs*/); duk_set_magic(ctx, -1, 2); /* magic=2: info */ duk_put_prop_string(ctx, -2, "info"); duk_push_c_function(ctx, duk__logger_prototype_log_shared, DUK_VARARGS /*nargs*/); duk_set_magic(ctx, -1, 3); /* magic=3: warn */ duk_put_prop_string(ctx, -2, "warn"); duk_push_c_function(ctx, duk__logger_prototype_log_shared, DUK_VARARGS /*nargs*/); duk_set_magic(ctx, -1, 4); /* magic=4: error */ duk_put_prop_string(ctx, -2, "error"); duk_push_c_function(ctx, duk__logger_prototype_log_shared, DUK_VARARGS /*nargs*/); duk_set_magic(ctx, -1, 5); /* magic=5: fatal */ duk_put_prop_string(ctx, -2, "fatal"); /* [ ... func Duktape.Logger Duktape.Logger.prototype ] */ /* XXX: when using ROM built-ins, "Duktape" is read-only by default so * setting Duktape.Logger will now fail. */ /* [ ... func Duktape.Logger Duktape.Logger.prototype ] */ duk_call(ctx, 2); duk_pop(ctx); } ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/duk_logging.h ================================================ #if !defined(DUK_LOGGING_H_INCLUDED) #define DUK_LOGGING_H_INCLUDED #include "duktape.h" /* Log levels */ #define DUK_LOG_TRACE 0 #define DUK_LOG_DEBUG 1 #define DUK_LOG_INFO 2 #define DUK_LOG_WARN 3 #define DUK_LOG_ERROR 4 #define DUK_LOG_FATAL 5 /* No flags at the moment. */ extern void duk_logging_init(duk_context *ctx, duk_uint_t flags); extern void duk_log_va(duk_context *ctx, duk_int_t level, const char *fmt, va_list ap); extern void duk_log(duk_context *ctx, duk_int_t level, const char *fmt, ...); #endif /* DUK_LOGGING_H_INCLUDED */ ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/duk_minimal_printf.c ================================================ /* * Minimal vsnprintf(), snprintf(), sprintf(), and sscanf() for Duktape. * The supported conversion formats narrowly match what Duktape needs. */ #include <stdarg.h> /* va_list etc */ #include <stddef.h> /* size_t */ #include <stdint.h> /* SIZE_MAX */ /* Write character with bound checking. Offset 'off' is updated regardless * of whether an actual write is made. This is necessary to satisfy snprintf() * return value semantics. */ #define DUK__WRITE_CHAR(c) do { \ if (off < size) { \ str[off] = (char) c; \ } \ off++; \ } while (0) /* Digits up to radix 16. */ static const char duk__format_digits[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; /* Format an unsigned long with various options. An unsigned long is large * enough for formatting all supported types. */ static size_t duk__format_long(char *str, size_t size, size_t off, int fixed_length, char pad, int radix, int neg_sign, unsigned long v) { char buf[24]; /* 2^64 = 18446744073709552000, length 20 */ char *required; char *p; int i; /* Format in reverse order first. Ensure at least one digit is output * to handle '0' correctly. Note that space padding and zero padding * handle negative sign differently: * * %9d and -321 => ' -321' * %09d and -321 => '-00000321' */ for (i = 0; i < (int) sizeof(buf); i++) { buf[i] = pad; /* compiles into memset() equivalent, avoid memset() dependency */ } p = buf; do { *p++ = duk__format_digits[v % radix]; v /= radix; } while (v != 0); required = buf + fixed_length; if (p < required && pad == (char) '0') { /* Zero padding and we didn't reach maximum length: place * negative sign at the last position. We can't get here * with fixed_length == 0 so that required[-1] is safe. * * Technically we should only do this for 'neg_sign == 1', * but it's OK to advance the pointer even when that's not * the case. */ p = required - 1; } if (neg_sign) { *p++ = (char) '-'; } if (p < required) { p = required; } /* Now [buf,p[ contains the result in reverse; copy into place. */ while (p > buf) { p--; DUK__WRITE_CHAR(*p); } return off; } /* Parse a pointer. Must parse whatever is produced by '%p' in sprintf(). */ static int duk__parse_pointer(const char *str, void **out) { const unsigned char *p; unsigned char ch; int count; int limit; long val; /* assume void * fits into long */ /* We only need to parse what our minimal printf() produces, so that * we can check for a '0x' prefix, and assume all hex digits are * lowercase. */ p = (const unsigned char *) str; if (p[0] != (unsigned char) '0' || p[1] != (unsigned char) 'x') { return 0; } p += 2; for (val = 0, count = 0, limit = sizeof(void *) * 2; count < limit; count++) { ch = *p++; val <<= 4; if (ch >= (unsigned char) '0' && ch <= (unsigned char) '9') { val += ch - (unsigned char) '0'; } else if (ch >= (unsigned char) 'a' && ch <= (unsigned char) 'f') { val += ch - (unsigned char) 'a' + 0x0a; } else { return 0; } } /* The input may end at a NUL or garbage may follow. As long as we * parse the '%p' correctly, garbage is allowed to follow, and the * JX pointer parsing also relies on that. */ *out = (void *) val; return 1; } /* Minimal vsnprintf() entry point. */ int duk_minimal_vsnprintf(char *str, size_t size, const char *format, va_list ap) { size_t off = 0; const char *p; #if 0 const char *p_tmp; const char *p_fmt_start; #endif char c; char pad; int fixed_length; int is_long; /* Assume str != NULL unless size == 0. * Assume format != NULL. */ p = format; for (;;) { c = *p++; if (c == (char) 0) { break; } if (c != (char) '%') { DUK__WRITE_CHAR(c); continue; } /* Start format sequence. Scan flags and format specifier. */ #if 0 p_fmt_start = p - 1; #endif is_long = 0; pad = ' '; fixed_length = 0; for (;;) { c = *p++; if (c == (char) 'l') { is_long = 1; } else if (c == (char) '0') { /* Only support pad character '0'. */ pad = '0'; } else if (c >= (char) '1' && c <= (char) '9') { /* Only support fixed lengths 1-9. */ fixed_length = (int) (c - (char) '0'); } else if (c == (char) 'd') { long v; int neg_sign = 0; if (is_long) { v = va_arg(ap, long); } else { v = (long) va_arg(ap, int); } if (v < 0) { neg_sign = 1; v = -v; } off = duk__format_long(str, size, off, fixed_length, pad, 10, neg_sign, (unsigned long) v); break; } else if (c == (char) 'u') { unsigned long v; if (is_long) { v = va_arg(ap, unsigned long); } else { v = (unsigned long) va_arg(ap, unsigned int); } off = duk__format_long(str, size, off, fixed_length, pad, 10, 0, v); break; } else if (c == (char) 'x') { unsigned long v; if (is_long) { v = va_arg(ap, unsigned long); } else { v = (unsigned long) va_arg(ap, unsigned int); } off = duk__format_long(str, size, off, fixed_length, pad, 16, 0, v); break; } else if (c == (char) 'c') { char v; v = (char) va_arg(ap, int); /* intentionally not 'char' */ DUK__WRITE_CHAR(v); break; } else if (c == (char) 's') { const char *v; char c_tmp; v = va_arg(ap, const char *); if (v) { for (;;) { c_tmp = *v++; if (c_tmp) { DUK__WRITE_CHAR(c_tmp); } else { break; } } } break; } else if (c == (char) 'p') { /* Assume a void * can be represented by 'long'. This is not * always the case. NULL pointer is printed out as 0x0000... */ void *v; v = va_arg(ap, void *); DUK__WRITE_CHAR('0'); DUK__WRITE_CHAR('x'); off = duk__format_long(str, size, off, sizeof(void *) * 2, '0', 16, 0, (unsigned long) v); break; } else { /* Unrecognized, bail out early. We could also emit the format * specifier verbatim, but it'd be a waste of footprint because * this case should never happen in practice. */ #if 0 DUK__WRITE_CHAR('!'); #endif #if 0 for (p_tmp = p_fmt_start; p_tmp != p; p_tmp++) { DUK__WRITE_CHAR(*p_tmp); } break; #endif goto finish; } } } finish: if (off < size) { str[off] = (char) 0; /* No increment for 'off', not counted in return value. */ } else if (size > 0) { /* Forced termination. */ str[size - 1] = 0; } return (int) off; } /* Minimal snprintf() entry point. */ int duk_minimal_snprintf(char *str, size_t size, const char *format, ...) { va_list ap; int ret; va_start(ap, format); ret = duk_minimal_vsnprintf(str, size, format, ap); va_end(ap); return ret; } /* Minimal sprintf() entry point. */ int duk_minimal_sprintf(char *str, const char *format, ...) { va_list ap; int ret; va_start(ap, format); ret = duk_minimal_vsnprintf(str, SIZE_MAX, format, ap); va_end(ap); return ret; } /* Minimal sscanf() entry point. */ int duk_minimal_sscanf(const char *str, const char *format, ...) { va_list ap; int ret; void **out; /* Only the exact "%p" format is supported. */ if (format[0] != (char) '%' || format[1] != (char) 'p' || format[2] != (char) 0) { } va_start(ap, format); out = va_arg(ap, void **); ret = duk__parse_pointer(str, out); va_end(ap); return ret; } #undef DUK__WRITE_CHAR ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/duk_minimal_printf.h ================================================ #if !defined(DUK_MINIMAL_PRINTF_H_INCLUDED) #define DUK_MINIMAL_PRINTF_H_INCLUDED #include <stdarg.h> /* va_list etc */ #include <stddef.h> /* size_t */ extern int duk_minimal_sprintf(char *str, const char *format, ...); extern int duk_minimal_snprintf(char *str, size_t size, const char *format, ...); extern int duk_minimal_vsnprintf(char *str, size_t size, const char *format, va_list ap); extern int duk_minimal_sscanf(const char *str, const char *format, ...); #endif /* DUK_MINIMAL_PRINTF_H_INCLUDED */ ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/duk_module_duktape.c ================================================ /* * Duktape 1.x compatible module loading framework */ #include "duktape.h" #include "duk_module_duktape.h" /* (v)snprintf() is missing before MSVC 2015. Note that _(v)snprintf() does * NOT NUL terminate on truncation, but that's OK here. * http://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010 */ #if defined(_MSC_VER) && (_MSC_VER < 1900) #define snprintf _snprintf #endif #if 0 /* Enable manually */ #define DUK__ASSERT(x) do { \ if (!(x)) { \ fprintf(stderr, "ASSERTION FAILED at %s:%d: " #x "\n", __FILE__, __LINE__); \ fflush(stderr); \ } \ } while (0) #define DUK__ASSERT_TOP(ctx,val) do { \ DUK__ASSERT(duk_get_top((ctx)) == (val)); \ } while (0) #else #define DUK__ASSERT(x) do { (void) (x); } while (0) #define DUK__ASSERT_TOP(ctx,val) do { (void) ctx; (void) (val); } while (0) #endif static void duk__resolve_module_id(duk_context *ctx, const char *req_id, const char *mod_id) { duk_uint8_t buf[DUK_COMMONJS_MODULE_ID_LIMIT]; duk_uint8_t *p; duk_uint8_t *q; duk_uint8_t *q_last; /* last component */ duk_int_t int_rc; DUK__ASSERT(req_id != NULL); /* mod_id may be NULL */ /* * A few notes on the algorithm: * * - Terms are not allowed to begin with a period unless the term * is either '.' or '..'. This simplifies implementation (and * is within CommonJS modules specification). * * - There are few output bound checks here. This is on purpose: * the resolution input is length checked and the output is never * longer than the input. The resolved output is written directly * over the input because it's never longer than the input at any * point in the algorithm. * * - Non-ASCII characters are processed as individual bytes and * need no special treatment. However, U+0000 terminates the * algorithm; this is not an issue because U+0000 is not a * desirable term character anyway. */ /* * Set up the resolution input which is the requested ID directly * (if absolute or no current module path) or with current module * ID prepended (if relative and current module path exists). * * Suppose current module is 'foo/bar' and relative path is './quux'. * The 'bar' component must be replaced so the initial input here is * 'foo/bar/.././quux'. */ if (mod_id != NULL && req_id[0] == '.') { int_rc = snprintf((char *) buf, sizeof(buf), "%s/../%s", mod_id, req_id); } else { int_rc = snprintf((char *) buf, sizeof(buf), "%s", req_id); } if (int_rc >= (duk_int_t) sizeof(buf) || int_rc < 0) { /* Potentially truncated, NUL not guaranteed in any case. * The (int_rc < 0) case should not occur in practice. */ goto resolve_error; } DUK__ASSERT(strlen((const char *) buf) < sizeof(buf)); /* at most sizeof(buf) - 1 */ /* * Resolution loop. At the top of the loop we're expecting a valid * term: '.', '..', or a non-empty identifier not starting with a period. */ p = buf; q = buf; for (;;) { duk_uint_fast8_t c; /* Here 'p' always points to the start of a term. * * We can also unconditionally reset q_last here: if this is * the last (non-empty) term q_last will have the right value * on loop exit. */ DUK__ASSERT(p >= q); /* output is never longer than input during resolution */ q_last = q; c = *p++; if (c == 0) { goto resolve_error; } else if (c == '.') { c = *p++; if (c == '/') { /* Term was '.' and is eaten entirely (including dup slashes). */ goto eat_dup_slashes; } if (c == '.' && *p == '/') { /* Term was '..', backtrack resolved name by one component. * q[-1] = previous slash (or beyond start of buffer) * q[-2] = last char of previous component (or beyond start of buffer) */ p++; /* eat (first) input slash */ DUK__ASSERT(q >= buf); if (q == buf) { goto resolve_error; } DUK__ASSERT(*(q - 1) == '/'); q--; /* Backtrack to last output slash (dups already eliminated). */ for (;;) { /* Backtrack to previous slash or start of buffer. */ DUK__ASSERT(q >= buf); if (q == buf) { break; } if (*(q - 1) == '/') { break; } q--; } goto eat_dup_slashes; } goto resolve_error; } else if (c == '/') { /* e.g. require('/foo'), empty terms not allowed */ goto resolve_error; } else { for (;;) { /* Copy term name until end or '/'. */ *q++ = c; c = *p++; if (c == 0) { /* This was the last term, and q_last was * updated to match this term at loop top. */ goto loop_done; } else if (c == '/') { *q++ = '/'; break; } else { /* write on next loop */ } } } eat_dup_slashes: for (;;) { /* eat dup slashes */ c = *p; if (c != '/') { break; } p++; } } loop_done: /* Output #1: resolved absolute name. */ DUK__ASSERT(q >= buf); duk_push_lstring(ctx, (const char *) buf, (size_t) (q - buf)); /* Output #2: last component name. */ DUK__ASSERT(q >= q_last); DUK__ASSERT(q_last >= buf); duk_push_lstring(ctx, (const char *) q_last, (size_t) (q - q_last)); return; resolve_error: (void) duk_type_error(ctx, "cannot resolve module id: %s", (const char *) req_id); } /* Stack indices for better readability. */ #define DUK__IDX_REQUESTED_ID 0 /* module id requested */ #define DUK__IDX_REQUIRE 1 /* current require() function */ #define DUK__IDX_REQUIRE_ID 2 /* the base ID of the current require() function, resolution base */ #define DUK__IDX_RESOLVED_ID 3 /* resolved, normalized absolute module ID */ #define DUK__IDX_LASTCOMP 4 /* last component name in resolved path */ #define DUK__IDX_DUKTAPE 5 /* Duktape object */ #define DUK__IDX_MODLOADED 6 /* Duktape.modLoaded[] module cache */ #define DUK__IDX_UNDEFINED 7 /* 'undefined', artifact of lookup */ #define DUK__IDX_FRESH_REQUIRE 8 /* new require() function for module, updated resolution base */ #define DUK__IDX_EXPORTS 9 /* default exports table */ #define DUK__IDX_MODULE 10 /* module object containing module.exports, etc */ static duk_ret_t duk__require(duk_context *ctx) { const char *str_req_id; /* requested identifier */ const char *str_mod_id; /* require.id of current module */ duk_int_t pcall_rc; /* NOTE: we try to minimize code size by avoiding unnecessary pops, * so the stack looks a bit cluttered in this function. DUK__ASSERT_TOP() * assertions are used to ensure stack configuration is correct at each * step. */ /* * Resolve module identifier into canonical absolute form. */ str_req_id = duk_require_string(ctx, DUK__IDX_REQUESTED_ID); duk_push_current_function(ctx); duk_get_prop_string(ctx, -1, "id"); str_mod_id = duk_get_string(ctx, DUK__IDX_REQUIRE_ID); /* ignore non-strings */ duk__resolve_module_id(ctx, str_req_id, str_mod_id); str_req_id = NULL; str_mod_id = NULL; /* [ requested_id require require.id resolved_id last_comp ] */ DUK__ASSERT_TOP(ctx, DUK__IDX_LASTCOMP + 1); /* * Cached module check. * * If module has been loaded or its loading has already begun without * finishing, return the same cached value (module.exports). The * value is registered when module load starts so that circular * references can be supported to some extent. */ duk_push_global_stash(ctx); duk_get_prop_string(ctx, -1, "\xff" "module:Duktape"); duk_remove(ctx, -2); /* Lookup stashed, original 'Duktape' object. */ duk_get_prop_string(ctx, DUK__IDX_DUKTAPE, "modLoaded"); /* Duktape.modLoaded */ duk_require_type_mask(ctx, DUK__IDX_MODLOADED, DUK_TYPE_MASK_OBJECT); DUK__ASSERT_TOP(ctx, DUK__IDX_MODLOADED + 1); duk_dup(ctx, DUK__IDX_RESOLVED_ID); if (duk_get_prop(ctx, DUK__IDX_MODLOADED)) { /* [ requested_id require require.id resolved_id last_comp Duktape Duktape.modLoaded Duktape.modLoaded[id] ] */ duk_get_prop_string(ctx, -1, "exports"); /* return module.exports */ return 1; } DUK__ASSERT_TOP(ctx, DUK__IDX_UNDEFINED + 1); /* [ requested_id require require.id resolved_id last_comp Duktape Duktape.modLoaded undefined ] */ /* * Module not loaded (and loading not started previously). * * Create a new require() function with 'id' set to resolved ID * of module being loaded. Also create 'exports' and 'module' * tables but don't register exports to the loaded table yet. * We don't want to do that unless the user module search callbacks * succeeds in finding the module. */ /* Fresh require: require.id is left configurable (but not writable) * so that is not easy to accidentally tweak it, but it can still be * done with Object.defineProperty(). * * XXX: require.id could also be just made non-configurable, as there * is no practical reason to touch it (at least from Ecmascript code). */ duk_push_c_function(ctx, duk__require, 1 /*nargs*/); duk_push_string(ctx, "name"); duk_push_string(ctx, "require"); duk_def_prop(ctx, DUK__IDX_FRESH_REQUIRE, DUK_DEFPROP_HAVE_VALUE); /* not writable, not enumerable, not configurable */ duk_push_string(ctx, "id"); duk_dup(ctx, DUK__IDX_RESOLVED_ID); duk_def_prop(ctx, DUK__IDX_FRESH_REQUIRE, DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_SET_CONFIGURABLE); /* a fresh require() with require.id = resolved target module id */ /* Module table: * - module.exports: initial exports table (may be replaced by user) * - module.id is non-writable and non-configurable, as the CommonJS * spec suggests this if possible * - module.filename: not set, defaults to resolved ID if not explicitly * set by modSearch() (note capitalization, not .fileName, matches Node.js) * - module.name: not set, defaults to last component of resolved ID if * not explicitly set by modSearch() */ duk_push_object(ctx); /* exports */ duk_push_object(ctx); /* module */ duk_push_string(ctx, "exports"); duk_dup(ctx, DUK__IDX_EXPORTS); duk_def_prop(ctx, DUK__IDX_MODULE, DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_SET_WRITABLE | DUK_DEFPROP_SET_CONFIGURABLE); /* module.exports = exports */ duk_push_string(ctx, "id"); duk_dup(ctx, DUK__IDX_RESOLVED_ID); /* resolved id: require(id) must return this same module */ duk_def_prop(ctx, DUK__IDX_MODULE, DUK_DEFPROP_HAVE_VALUE); /* module.id = resolved_id; not writable, not enumerable, not configurable */ duk_compact(ctx, DUK__IDX_MODULE); /* module table remains registered to modLoaded, minimize its size */ DUK__ASSERT_TOP(ctx, DUK__IDX_MODULE + 1); /* [ requested_id require require.id resolved_id last_comp Duktape Duktape.modLoaded undefined fresh_require exports module ] */ /* Register the module table early to modLoaded[] so that we can * support circular references even in modSearch(). If an error * is thrown, we'll delete the reference. */ duk_dup(ctx, DUK__IDX_RESOLVED_ID); duk_dup(ctx, DUK__IDX_MODULE); duk_put_prop(ctx, DUK__IDX_MODLOADED); /* Duktape.modLoaded[resolved_id] = module */ /* * Call user provided module search function and build the wrapped * module source code (if necessary). The module search function * can be used to implement pure Ecmacsript, pure C, and mixed * Ecmascript/C modules. * * The module search function can operate on the exports table directly * (e.g. DLL code can register values to it). It can also return a * string which is interpreted as module source code (if a non-string * is returned the module is assumed to be a pure C one). If a module * cannot be found, an error must be thrown by the user callback. * * Because Duktape.modLoaded[] already contains the module being * loaded, circular references for C modules should also work * (although expected to be quite rare). */ duk_push_string(ctx, "(function(require,exports,module){"); /* Duktape.modSearch(resolved_id, fresh_require, exports, module). */ duk_get_prop_string(ctx, DUK__IDX_DUKTAPE, "modSearch"); /* Duktape.modSearch */ duk_dup(ctx, DUK__IDX_RESOLVED_ID); duk_dup(ctx, DUK__IDX_FRESH_REQUIRE); duk_dup(ctx, DUK__IDX_EXPORTS); duk_dup(ctx, DUK__IDX_MODULE); /* [ ... Duktape.modSearch resolved_id last_comp fresh_require exports module ] */ pcall_rc = duk_pcall(ctx, 4 /*nargs*/); /* -> [ ... source ] */ DUK__ASSERT_TOP(ctx, DUK__IDX_MODULE + 3); if (pcall_rc != DUK_EXEC_SUCCESS) { /* Delete entry in Duktape.modLoaded[] and rethrow. */ goto delete_rethrow; } /* If user callback did not return source code, module loading * is finished (user callback initialized exports table directly). */ if (!duk_is_string(ctx, -1)) { /* User callback did not return source code, so module loading * is finished: just update modLoaded with final module.exports * and we're done. */ goto return_exports; } /* Finish the wrapped module source. Force module.filename as the * function .fileName so it gets set for functions defined within a * module. This also ensures loggers created within the module get * the module ID (or overridden filename) as their default logger name. * (Note capitalization: .filename matches Node.js while .fileName is * used elsewhere in Duktape.) */ duk_push_string(ctx, "\n})"); /* Newline allows module last line to contain a // comment. */ duk_concat(ctx, 3); if (!duk_get_prop_string(ctx, DUK__IDX_MODULE, "filename")) { /* module.filename for .fileName, default to resolved ID if * not present. */ duk_pop(ctx); duk_dup(ctx, DUK__IDX_RESOLVED_ID); } pcall_rc = duk_pcompile(ctx, DUK_COMPILE_EVAL); if (pcall_rc != DUK_EXEC_SUCCESS) { goto delete_rethrow; } pcall_rc = duk_pcall(ctx, 0); /* -> eval'd function wrapper (not called yet) */ if (pcall_rc != DUK_EXEC_SUCCESS) { goto delete_rethrow; } /* Module has now evaluated to a wrapped module function. Force its * .name to match module.name (defaults to last component of resolved * ID) so that it is shown in stack traces too. Note that we must not * introduce an actual name binding into the function scope (which is * usually the case with a named function) because it would affect the * scope seen by the module and shadow accesses to globals of the same name. * This is now done by compiling the function as anonymous and then forcing * its .name without setting a "has name binding" flag. */ duk_push_string(ctx, "name"); if (!duk_get_prop_string(ctx, DUK__IDX_MODULE, "name")) { /* module.name for .name, default to last component if * not present. */ duk_pop(ctx); duk_dup(ctx, DUK__IDX_LASTCOMP); } duk_def_prop(ctx, -3, DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_FORCE); /* * Call the wrapped module function. * * Use a protected call so that we can update Duktape.modLoaded[resolved_id] * even if the module throws an error. */ /* [ requested_id require require.id resolved_id last_comp Duktape Duktape.modLoaded undefined fresh_require exports module mod_func ] */ DUK__ASSERT_TOP(ctx, DUK__IDX_MODULE + 2); duk_dup(ctx, DUK__IDX_EXPORTS); /* exports (this binding) */ duk_dup(ctx, DUK__IDX_FRESH_REQUIRE); /* fresh require (argument) */ duk_get_prop_string(ctx, DUK__IDX_MODULE, "exports"); /* relookup exports from module.exports in case it was changed by modSearch */ duk_dup(ctx, DUK__IDX_MODULE); /* module (argument) */ DUK__ASSERT_TOP(ctx, DUK__IDX_MODULE + 6); /* [ requested_id require require.id resolved_id last_comp Duktape Duktape.modLoaded undefined fresh_require exports module mod_func exports fresh_require exports module ] */ pcall_rc = duk_pcall_method(ctx, 3 /*nargs*/); if (pcall_rc != DUK_EXEC_SUCCESS) { /* Module loading failed. Node.js will forget the module * registration so that another require() will try to load * the module again. Mimic that behavior. */ goto delete_rethrow; } /* [ requested_id require require.id resolved_id last_comp Duktape Duktape.modLoaded undefined fresh_require exports module result(ignored) ] */ DUK__ASSERT_TOP(ctx, DUK__IDX_MODULE + 2); /* fall through */ return_exports: duk_get_prop_string(ctx, DUK__IDX_MODULE, "exports"); duk_compact(ctx, -1); /* compact the exports table */ return 1; /* return module.exports */ delete_rethrow: duk_dup(ctx, DUK__IDX_RESOLVED_ID); duk_del_prop(ctx, DUK__IDX_MODLOADED); /* delete Duktape.modLoaded[resolved_id] */ (void) duk_throw(ctx); /* rethrow original error */ return 0; /* not reachable */ } void duk_module_duktape_init(duk_context *ctx) { /* Stash 'Duktape' in case it's modified. */ duk_push_global_stash(ctx); duk_get_global_string(ctx, "Duktape"); duk_put_prop_string(ctx, -2, "\xff" "module:Duktape"); duk_pop(ctx); /* Register `require` as a global function. */ duk_eval_string(ctx, "(function(req){" "var D=Object.defineProperty;" "D(req,'name',{value:'require'});" "D(this,'require',{value:req,writable:true,configurable:true});" "D(Duktape,'modLoaded',{value:Object.create(null),writable:true,configurable:true});" "})"); duk_push_c_function(ctx, duk__require, 1 /*nargs*/); duk_call(ctx, 1); duk_pop(ctx); } #undef DUK__ASSERT #undef DUK__ASSERT_TOP #undef DUK__IDX_REQUESTED_ID #undef DUK__IDX_REQUIRE #undef DUK__IDX_REQUIRE_ID #undef DUK__IDX_RESOLVED_ID #undef DUK__IDX_LASTCOMP #undef DUK__IDX_DUKTAPE #undef DUK__IDX_MODLOADED #undef DUK__IDX_UNDEFINED #undef DUK__IDX_FRESH_REQUIRE #undef DUK__IDX_EXPORTS #undef DUK__IDX_MODULE ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/duk_module_duktape.h ================================================ #if !defined(DUK_MODULE_DUKTAPE_H_INCLUDED) #define DUK_MODULE_DUKTAPE_H_INCLUDED #include "duktape.h" /* Maximum length of CommonJS module identifier to resolve. Length includes * both current module ID, requested (possibly relative) module ID, and a * slash in between. */ #define DUK_COMMONJS_MODULE_ID_LIMIT 256 extern void duk_module_duktape_init(duk_context *ctx); #endif /* DUK_MODULE_DUKTAPE_H_INCLUDED */ ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/duk_module_node.c ================================================ /* * Node.js-like module loading framework for Duktape * * https://nodejs.org/api/modules.html */ #include "duktape.h" #include "duk_module_node.h" #if DUK_VERSION >= 19999 static duk_int_t duk__eval_module_source(duk_context *ctx, void *udata); #else static duk_int_t duk__eval_module_source(duk_context *ctx); #endif static void duk__push_module_object(duk_context *ctx, const char *id, duk_bool_t main); static duk_bool_t duk__get_cached_module(duk_context *ctx, const char *id) { duk_push_global_stash(ctx); (void) duk_get_prop_string(ctx, -1, "\xff" "requireCache"); if (duk_get_prop_string(ctx, -1, id)) { duk_remove(ctx, -2); duk_remove(ctx, -2); return 1; } else { duk_pop_3(ctx); return 0; } } /* Place a `module` object on the top of the value stack into the require cache * based on its `.id` property. As a convenience to the caller, leave the * object on top of the value stack afterwards. */ static void duk__put_cached_module(duk_context *ctx) { /* [ ... module ] */ duk_push_global_stash(ctx); (void) duk_get_prop_string(ctx, -1, "\xff" "requireCache"); duk_dup(ctx, -3); /* [ ... module stash req_cache module ] */ (void) duk_get_prop_string(ctx, -1, "id"); duk_dup(ctx, -2); duk_put_prop(ctx, -4); duk_pop_3(ctx); /* [ ... module ] */ } static void duk__del_cached_module(duk_context *ctx, const char *id) { duk_push_global_stash(ctx); (void) duk_get_prop_string(ctx, -1, "\xff" "requireCache"); duk_del_prop_string(ctx, -1, id); duk_pop_2(ctx); } static duk_ret_t duk__handle_require(duk_context *ctx) { /* * Value stack handling here is a bit sloppy but should be correct. * Call handling will clean up any extra garbage for us. */ const char *id; const char *parent_id; duk_idx_t module_idx; duk_idx_t stash_idx; duk_int_t ret; duk_push_global_stash(ctx); stash_idx = duk_normalize_index(ctx, -1); duk_push_current_function(ctx); (void) duk_get_prop_string(ctx, -1, "\xff" "moduleId"); parent_id = duk_require_string(ctx, -1); (void) parent_id; /* not used directly; suppress warning */ /* [ id stash require parent_id ] */ id = duk_require_string(ctx, 0); (void) duk_get_prop_string(ctx, stash_idx, "\xff" "modResolve"); duk_dup(ctx, 0); /* module ID */ duk_dup(ctx, -3); /* parent ID */ duk_call(ctx, 2); /* [ ... stash ... resolved_id ] */ id = duk_require_string(ctx, -1); if (duk__get_cached_module(ctx, id)) { goto have_module; /* use the cached module */ } duk__push_module_object(ctx, id, 0 /*main*/); duk__put_cached_module(ctx); /* module remains on stack */ /* * From here on out, we have to be careful not to throw. If it can't be * avoided, the error must be caught and the module removed from the * require cache before rethrowing. This allows the application to * reattempt loading the module. */ module_idx = duk_normalize_index(ctx, -1); /* [ ... stash ... resolved_id module ] */ (void) duk_get_prop_string(ctx, stash_idx, "\xff" "modLoad"); duk_dup(ctx, -3); /* resolved ID */ (void) duk_get_prop_string(ctx, module_idx, "exports"); duk_dup(ctx, module_idx); ret = duk_pcall(ctx, 3); if (ret != DUK_EXEC_SUCCESS) { duk__del_cached_module(ctx, id); (void) duk_throw(ctx); /* rethrow */ } if (duk_is_string(ctx, -1)) { duk_int_t ret; /* [ ... module source ] */ #if DUK_VERSION >= 19999 ret = duk_safe_call(ctx, duk__eval_module_source, NULL, 2, 1); #else ret = duk_safe_call(ctx, duk__eval_module_source, 2, 1); #endif if (ret != DUK_EXEC_SUCCESS) { duk__del_cached_module(ctx, id); (void) duk_throw(ctx); /* rethrow */ } } else if (duk_is_undefined(ctx, -1)) { duk_pop(ctx); } else { duk__del_cached_module(ctx, id); (void) duk_type_error(ctx, "invalid module load callback return value"); } /* fall through */ have_module: /* [ ... module ] */ (void) duk_get_prop_string(ctx, -1, "exports"); return 1; } static void duk__push_require_function(duk_context *ctx, const char *id) { duk_push_c_function(ctx, duk__handle_require, 1); duk_push_string(ctx, "name"); duk_push_string(ctx, "require"); duk_def_prop(ctx, -3, DUK_DEFPROP_HAVE_VALUE); duk_push_string(ctx, id); duk_put_prop_string(ctx, -2, "\xff" "moduleId"); /* require.cache */ duk_push_global_stash(ctx); (void) duk_get_prop_string(ctx, -1, "\xff" "requireCache"); duk_put_prop_string(ctx, -3, "cache"); duk_pop(ctx); /* require.main */ duk_push_global_stash(ctx); (void) duk_get_prop_string(ctx, -1, "\xff" "mainModule"); duk_put_prop_string(ctx, -3, "main"); duk_pop(ctx); } static void duk__push_module_object(duk_context *ctx, const char *id, duk_bool_t main) { duk_push_object(ctx); /* Set this as the main module, if requested */ if (main) { duk_push_global_stash(ctx); duk_dup(ctx, -2); duk_put_prop_string(ctx, -2, "\xff" "mainModule"); duk_pop(ctx); } /* Node.js uses the canonicalized filename of a module for both module.id * and module.filename. We have no concept of a file system here, so just * use the module ID for both values. */ duk_push_string(ctx, id); duk_dup(ctx, -1); duk_put_prop_string(ctx, -3, "filename"); duk_put_prop_string(ctx, -2, "id"); /* module.exports = {} */ duk_push_object(ctx); duk_put_prop_string(ctx, -2, "exports"); /* module.loaded = false */ duk_push_false(ctx); duk_put_prop_string(ctx, -2, "loaded"); /* module.require */ duk__push_require_function(ctx, id); duk_put_prop_string(ctx, -2, "require"); } #if DUK_VERSION >= 19999 static duk_int_t duk__eval_module_source(duk_context *ctx, void *udata) { #else static duk_int_t duk__eval_module_source(duk_context *ctx) { #endif const char *src; /* * Stack: [ ... module source ] */ #if DUK_VERSION >= 19999 (void) udata; #endif /* Wrap the module code in a function expression. This is the simplest * way to implement CommonJS closure semantics and matches the behavior of * e.g. Node.js. */ duk_push_string(ctx, "(function(exports,require,module,__filename,__dirname){"); src = duk_require_string(ctx, -2); duk_push_string(ctx, (src[0] == '#' && src[1] == '!') ? "//" : ""); /* Shebang support. */ duk_dup(ctx, -3); /* source */ duk_push_string(ctx, "\n})"); /* Newline allows module last line to contain a // comment. */ duk_concat(ctx, 4); /* [ ... module source func_src ] */ (void) duk_get_prop_string(ctx, -3, "filename"); duk_compile(ctx, DUK_COMPILE_EVAL); duk_call(ctx, 0); /* [ ... module source func ] */ /* Set name for the wrapper function. */ duk_push_string(ctx, "name"); duk_push_string(ctx, "main"); duk_def_prop(ctx, -3, DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_FORCE); /* call the function wrapper */ (void) duk_get_prop_string(ctx, -3, "exports"); /* exports */ (void) duk_get_prop_string(ctx, -4, "require"); /* require */ duk_dup(ctx, -5); /* module */ (void) duk_get_prop_string(ctx, -6, "filename"); /* __filename */ duk_push_undefined(ctx); /* __dirname */ duk_call(ctx, 5); /* [ ... module source result(ignore) ] */ /* module.loaded = true */ duk_push_true(ctx); duk_put_prop_string(ctx, -4, "loaded"); /* [ ... module source retval ] */ duk_pop_2(ctx); /* [ ... module ] */ return 1; } /* Load a module as the 'main' module. */ duk_ret_t duk_module_node_peval_main(duk_context *ctx, const char *path) { /* * Stack: [ ... source ] */ duk__push_module_object(ctx, path, 1 /*main*/); /* [ ... source module ] */ duk_dup(ctx, 0); /* [ ... source module source ] */ #if DUK_VERSION >= 19999 return duk_safe_call(ctx, duk__eval_module_source, NULL, 2, 1); #else return duk_safe_call(ctx, duk__eval_module_source, 2, 1); #endif } void duk_module_node_init(duk_context *ctx) { /* * Stack: [ ... options ] => [ ... ] */ duk_idx_t options_idx; duk_require_object_coercible(ctx, -1); /* error before setting up requireCache */ options_idx = duk_require_normalize_index(ctx, -1); /* Initialize the require cache to a fresh object. */ duk_push_global_stash(ctx); #if DUK_VERSION >= 19999 duk_push_bare_object(ctx); #else duk_push_object(ctx); duk_push_undefined(ctx); duk_set_prototype(ctx, -2); #endif duk_put_prop_string(ctx, -2, "\xff" "requireCache"); duk_pop(ctx); /* Stash callbacks for later use. User code can overwrite them later * on directly by accessing the global stash. */ duk_push_global_stash(ctx); duk_get_prop_string(ctx, options_idx, "resolve"); duk_require_function(ctx, -1); duk_put_prop_string(ctx, -2, "\xff" "modResolve"); duk_get_prop_string(ctx, options_idx, "load"); duk_require_function(ctx, -1); duk_put_prop_string(ctx, -2, "\xff" "modLoad"); duk_pop(ctx); /* Stash main module. */ duk_push_global_stash(ctx); duk_push_undefined(ctx); duk_put_prop_string(ctx, -2, "\xff" "mainModule"); duk_pop(ctx); /* register `require` as a global function. */ duk_push_global_object(ctx); duk_push_string(ctx, "require"); duk__push_require_function(ctx, ""); duk_def_prop(ctx, -3, DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_SET_WRITABLE | DUK_DEFPROP_SET_CONFIGURABLE); duk_pop(ctx); duk_pop(ctx); /* pop argument */ } ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/duk_module_node.h ================================================ #if !defined(DUK_MODULE_NODE_H_INCLUDED) #define DUK_MODULE_NODE_H_INCLUDED #include "duktape.h" extern duk_ret_t duk_module_node_peval_main(duk_context *ctx, const char *path); extern void duk_module_node_init(duk_context *ctx); #endif /* DUK_MODULE_NODE_H_INCLUDED */ ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/duk_print_alert.c ================================================ /* * Duktape 1.x compatible print() and alert() bindings. */ #include <stdio.h> #include <string.h> #include "duktape.h" #include "duk_print_alert.h" #define DUK_PRINT_ALERT_FLUSH /* Flush after stdout/stderr write (Duktape 1.x: yes) */ #undef DUK_PRINT_ALERT_SMALL /* Prefer smaller footprint (but slower and more memory churn) */ #if defined(DUK_PRINT_ALERT_SMALL) static duk_ret_t duk__print_alert_helper(duk_context *ctx, FILE *fh) { duk_idx_t nargs; nargs = duk_get_top(ctx); /* If argument count is 1 and first argument is a buffer, write the buffer * as raw data into the file without a newline; this allows exact control * over stdout/stderr without an additional entrypoint (useful for now). * Otherwise current print/alert semantics are to ToString() coerce * arguments, join them with a single space, and append a newline. */ if (nargs == 1 && duk_is_buffer(ctx, 0)) { buf = (const duk_uint8_t *) duk_get_buffer(ctx, 0, &sz_buf); fwrite((const void *) buf, 1, (size_t) sz_buf, fh); } else { duk_push_string(ctx, " "); duk_insert(ctx, 0); duk_concat(ctx, nargs); fprintf(fh, "%s\n", duk_require_string(ctx, -1)); } #if defined(DUK_PRINT_ALERT_FLUSH) fflush(fh); #endif return 0; } #else /* Faster, less churn, higher footprint option. */ static duk_ret_t duk__print_alert_helper(duk_context *ctx, FILE *fh) { duk_idx_t nargs; const duk_uint8_t *buf; duk_size_t sz_buf; const char nl = (const char) '\n'; duk_uint8_t buf_stack[256]; nargs = duk_get_top(ctx); /* If argument count is 1 and first argument is a buffer, write the buffer * as raw data into the file without a newline; this allows exact control * over stdout/stderr without an additional entrypoint (useful for now). * Otherwise current print/alert semantics are to ToString() coerce * arguments, join them with a single space, and append a newline. */ if (nargs == 1 && duk_is_buffer(ctx, 0)) { buf = (const duk_uint8_t *) duk_get_buffer(ctx, 0, &sz_buf); } else if (nargs > 0) { duk_idx_t i; duk_size_t sz_str; const duk_uint8_t *p_str; duk_uint8_t *p; sz_buf = (duk_size_t) nargs; /* spaces (nargs - 1) + newline */ for (i = 0; i < nargs; i++) { (void) duk_to_lstring(ctx, i, &sz_str); sz_buf += sz_str; } if (sz_buf <= sizeof(buf_stack)) { p = (duk_uint8_t *) buf_stack; } else { p = (duk_uint8_t *) duk_push_fixed_buffer(ctx, sz_buf); } buf = (const duk_uint8_t *) p; for (i = 0; i < nargs; i++) { p_str = (const duk_uint8_t *) duk_get_lstring(ctx, i, &sz_str); memcpy((void *) p, (const void *) p_str, sz_str); p += sz_str; *p++ = (duk_uint8_t) (i == nargs - 1 ? '\n' : ' '); } } else { buf = (const duk_uint8_t *) &nl; sz_buf = 1; } /* 'buf' contains the string to write, 'sz_buf' contains the length * (which may be zero). */ if (sz_buf > 0) { fwrite((const void *) buf, 1, (size_t) sz_buf, fh); #if defined(DUK_PRINT_ALERT_FLUSH) fflush(fh); #endif } return 0; } #endif static duk_ret_t duk__print(duk_context *ctx) { return duk__print_alert_helper(ctx, stdout); } static duk_ret_t duk__alert(duk_context *ctx) { return duk__print_alert_helper(ctx, stderr); } void duk_print_alert_init(duk_context *ctx, duk_uint_t flags) { (void) flags; /* unused at the moment */ /* XXX: use duk_def_prop_list(). */ duk_push_global_object(ctx); duk_push_string(ctx, "print"); duk_push_c_function(ctx, duk__print, DUK_VARARGS); duk_def_prop(ctx, -3, DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_SET_WRITABLE | DUK_DEFPROP_SET_CONFIGURABLE); duk_push_string(ctx, "alert"); duk_push_c_function(ctx, duk__alert, DUK_VARARGS); duk_def_prop(ctx, -3, DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_SET_WRITABLE | DUK_DEFPROP_SET_CONFIGURABLE); duk_pop(ctx); } ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/duk_print_alert.h ================================================ #if !defined(DUK_PRINT_ALERT_H_INCLUDED) #define DUK_PRINT_ALERT_H_INCLUDED #include "duktape.h" /* No flags at the moment. */ extern void duk_print_alert_init(duk_context *ctx, duk_uint_t flags); #endif /* DUK_PRINT_ALERT_H_INCLUDED */ ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/duk_v1_compat.c ================================================ #include <stdio.h> #include "duktape.h" #include "duk_v1_compat.h" /* * duk_dump_context_{stdout,stderr}() */ void duk_dump_context_stdout(duk_context *ctx) { duk_push_context_dump(ctx); fprintf(stdout, "%s\n", duk_safe_to_string(ctx, -1)); duk_pop(ctx); } void duk_dump_context_stderr(duk_context *ctx) { duk_push_context_dump(ctx); fprintf(stderr, "%s\n", duk_safe_to_string(ctx, -1)); duk_pop(ctx); } /* * duk_push_string_file() and duk_push_string_file_raw() */ const char *duk_push_string_file_raw(duk_context *ctx, const char *path, duk_uint_t flags) { FILE *f = NULL; char *buf; long sz; /* ANSI C typing */ if (!path) { goto fail; } f = fopen(path, "rb"); if (!f) { goto fail; } if (fseek(f, 0, SEEK_END) < 0) { goto fail; } sz = ftell(f); if (sz < 0) { goto fail; } if (fseek(f, 0, SEEK_SET) < 0) { goto fail; } buf = (char *) duk_push_fixed_buffer(ctx, (duk_size_t) sz); if ((size_t) fread(buf, 1, (size_t) sz, f) != (size_t) sz) { duk_pop(ctx); goto fail; } (void) fclose(f); /* ignore fclose() error */ return duk_buffer_to_string(ctx, -1); fail: if (f) { (void) fclose(f); /* ignore fclose() error */ } if (flags & DUK_STRING_PUSH_SAFE) { duk_push_undefined(ctx); } else { (void) duk_type_error(ctx, "read file error"); } return NULL; } /* * duk_eval_file(), duk_compile_file(), and their variants */ void duk_eval_file(duk_context *ctx, const char *path) { duk_push_string_file_raw(ctx, path, 0); duk_push_string(ctx, path); duk_compile(ctx, DUK_COMPILE_EVAL); duk_push_global_object(ctx); /* 'this' binding */ duk_call_method(ctx, 0); } void duk_eval_file_noresult(duk_context *ctx, const char *path) { duk_eval_file(ctx, path); duk_pop(ctx); } duk_int_t duk_peval_file(duk_context *ctx, const char *path) { duk_int_t rc; duk_push_string_file_raw(ctx, path, DUK_STRING_PUSH_SAFE); duk_push_string(ctx, path); rc = duk_pcompile(ctx, DUK_COMPILE_EVAL); if (rc != 0) { return rc; } duk_push_global_object(ctx); /* 'this' binding */ rc = duk_pcall_method(ctx, 0); return rc; } duk_int_t duk_peval_file_noresult(duk_context *ctx, const char *path) { duk_int_t rc; rc = duk_peval_file(ctx, path); duk_pop(ctx); return rc; } void duk_compile_file(duk_context *ctx, duk_uint_t flags, const char *path) { duk_push_string_file_raw(ctx, path, 0); duk_push_string(ctx, path); duk_compile(ctx, flags); } duk_int_t duk_pcompile_file(duk_context *ctx, duk_uint_t flags, const char *path) { duk_int_t rc; duk_push_string_file_raw(ctx, path, DUK_STRING_PUSH_SAFE); duk_push_string(ctx, path); rc = duk_pcompile(ctx, flags); return rc; } /* * duk_to_defaultvalue() */ void duk_to_defaultvalue(duk_context *ctx, duk_idx_t idx, duk_int_t hint) { duk_require_type_mask(ctx, idx, DUK_TYPE_MASK_OBJECT | DUK_TYPE_MASK_BUFFER | DUK_TYPE_MASK_LIGHTFUNC); duk_to_primitive(ctx, idx, hint); } ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/duk_v1_compat.h ================================================ #if !defined(DUK_V1_COMPAT_INCLUDED) #define DUK_V1_COMPAT_INCLUDED #include "duktape.h" /* Straight flag rename */ #if !defined(DUK_ENUM_INCLUDE_INTERNAL) #define DUK_ENUM_INCLUDE_INTERNAL DUK_ENUM_INCLUDE_HIDDEN #endif /* Flags for duk_push_string_file_raw() */ #define DUK_STRING_PUSH_SAFE (1 << 0) /* no error if file does not exist */ extern void duk_dump_context_stdout(duk_context *ctx); extern void duk_dump_context_stderr(duk_context *ctx); extern const char *duk_push_string_file_raw(duk_context *ctx, const char *path, duk_uint_t flags); extern void duk_eval_file(duk_context *ctx, const char *path); extern void duk_eval_file_noresult(duk_context *ctx, const char *path); extern duk_int_t duk_peval_file(duk_context *ctx, const char *path); extern duk_int_t duk_peval_file_noresult(duk_context *ctx, const char *path); extern void duk_compile_file(duk_context *ctx, duk_uint_t flags, const char *path); extern duk_int_t duk_pcompile_file(duk_context *ctx, duk_uint_t flags, const char *path); extern void duk_to_defaultvalue(duk_context *ctx, duk_idx_t idx, duk_int_t hint); #define duk_push_string_file(ctx,path) \ duk_push_string_file_raw((ctx), (path), 0) #endif /* DUK_V1_COMPAT_INCLUDED */ ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/duktape.c ================================================ /* * Single source autogenerated distributable for Duktape 2.2.0. * * Git commit a459cf3c9bd1779fc01b435d69302b742675a08f (v2.2.0). * Git branch master. * * See Duktape AUTHORS.rst and LICENSE.txt for copyright and * licensing information. */ /* LICENSE.txt */ /* * =============== * Duktape license * =============== * * (http://opensource.org/licenses/MIT) * * Copyright (c) 2013-2017 by Duktape authors (see AUTHORS.rst) * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ /* AUTHORS.rst */ /* * =============== * Duktape authors * =============== * * Copyright * ========= * * Duktape copyrights are held by its authors. Each author has a copyright * to their contribution, and agrees to irrevocably license the contribution * under the Duktape ``LICENSE.txt``. * * Authors * ======= * * Please include an e-mail address, a link to your GitHub profile, or something * similar to allow your contribution to be identified accurately. * * The following people have contributed code, website contents, or Wiki contents, * and agreed to irrevocably license their contributions under the Duktape * ``LICENSE.txt`` (in order of appearance): * * * Sami Vaarala <sami.vaarala@iki.fi> * * Niki Dobrev * * Andreas \u00d6man <andreas@lonelycoder.com> * * L\u00e1szl\u00f3 Lang\u00f3 <llango.u-szeged@partner.samsung.com> * * Legimet <legimet.calc@gmail.com> * * Karl Skomski <karl@skomski.com> * * Bruce Pascoe <fatcerberus1@gmail.com> * * Ren\u00e9 Hollander <rene@rene8888.at> * * Julien Hamaide (https://github.com/crazyjul) * * Sebastian G\u00f6tte (https://github.com/jaseg) * * Tomasz Magulski (https://github.com/magul) * * \D. Bohdan (https://github.com/dbohdan) * * Ond\u0159ej Jirman (https://github.com/megous) * * Sa\u00fal Ibarra Corretg\u00e9 <saghul@gmail.com> * * Jeremy HU <huxingyi@msn.com> * * Ole Andr\u00e9 Vadla Ravn\u00e5s (https://github.com/oleavr) * * Harold Brenes (https://github.com/harold-b) * * Oliver Crow (https://github.com/ocrow) * * Jakub Ch\u0142api\u0144ski (https://github.com/jchlapinski) * * Brett Vickers (https://github.com/beevik) * * Dominik Okwieka (https://github.com/okitec) * * Remko Tron\u00e7on (https://el-tramo.be) * * Romero Malaquias (rbsm@ic.ufal.br) * * Michael Drake <michael.drake@codethink.co.uk> * * Steven Don (https://github.com/shdon) * * Simon Stone (https://github.com/sstone1) * * \J. McC. (https://github.com/jmhmccr) * * Other contributions * =================== * * The following people have contributed something other than code (e.g. reported * bugs, provided ideas, etc; roughly in order of appearance): * * * Greg Burns * * Anthony Rabine * * Carlos Costa * * Aur\u00e9lien Bouilland * * Preet Desai (Pris Matic) * * judofyr (http://www.reddit.com/user/judofyr) * * Jason Woofenden * * Micha\u0142 Przyby\u015b * * Anthony Howe * * Conrad Pankoff * * Jim Schimpf * * Rajaran Gaunker (https://github.com/zimbabao) * * Andreas \u00d6man * * Doug Sanden * * Josh Engebretson (https://github.com/JoshEngebretson) * * Remo Eichenberger (https://github.com/remoe) * * Mamod Mehyar (https://github.com/mamod) * * David Demelier (https://github.com/markand) * * Tim Caswell (https://github.com/creationix) * * Mitchell Blank Jr (https://github.com/mitchblank) * * https://github.com/yushli * * Seo Sanghyeon (https://github.com/sanxiyn) * * Han ChoongWoo (https://github.com/tunz) * * Joshua Peek (https://github.com/josh) * * Bruce E. Pascoe (https://github.com/fatcerberus) * * https://github.com/Kelledin * * https://github.com/sstruchtrup * * Michael Drake (https://github.com/tlsa) * * https://github.com/chris-y * * Laurent Zubiaur (https://github.com/lzubiaur) * * Neil Kolban (https://github.com/nkolban) * * If you are accidentally missing from this list, send me an e-mail * (``sami.vaarala@iki.fi``) and I'll fix the omission. */ #line 1 "duk_replacements.c" /* * Replacements for missing platform functions. * * Unlike the originals, fpclassify() and signbit() replacements don't * work on any floating point types, only doubles. The C typing here * mimics the standard prototypes. */ /* #include duk_internal.h */ #line 1 "duk_internal.h" /* * Top-level include file to be used for all (internal) source files. * * Source files should not include individual header files, as they * have not been designed to be individually included. */ #if !defined(DUK_INTERNAL_H_INCLUDED) #define DUK_INTERNAL_H_INCLUDED /* * The 'duktape.h' header provides the public API, but also handles all * compiler and platform specific feature detection, Duktape feature * resolution, inclusion of system headers, etc. These have been merged * because the public API is also dependent on e.g. detecting appropriate * C types which is quite platform/compiler specific especially for a non-C99 * build. The public API is also dependent on the resolved feature set. * * Some actions taken by the merged header (such as including system headers) * are not appropriate for building a user application. The define * DUK_COMPILING_DUKTAPE allows the merged header to skip/include some * sections depending on what is being built. */ #define DUK_COMPILING_DUKTAPE #include "duktape.h" /* * User declarations, e.g. prototypes for user functions used by Duktape * macros. */ DUK_USE_USER_DECLARE() /* * Duktape includes (other than duk_features.h) * * The header files expect to be included in an order which satisfies header * dependencies correctly (the headers themselves don't include any other * includes). Forward declarations are used to break circular struct/typedef * dependencies. */ /* #include duk_dblunion.h */ #line 1 "duk_dblunion.h" /* * Union to access IEEE double memory representation, indexes for double * memory representation, and some macros for double manipulation. * * Also used by packed duk_tval. Use a union for bit manipulation to * minimize aliasing issues in practice. The C99 standard does not * guarantee that this should work, but it's a very widely supported * practice for low level manipulation. * * IEEE double format summary: * * seeeeeee eeeeffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff * A B C D E F G H * * s sign bit * eee... exponent field * fff... fraction * * See http://en.wikipedia.org/wiki/Double_precision_floating-point_format. * * NaNs are represented as exponent 0x7ff and mantissa != 0. The NaN is a * signaling NaN when the highest bit of the mantissa is zero, and a quiet * NaN when the highest bit is set. * * At least three memory layouts are relevant here: * * A B C D E F G H Big endian (e.g. 68k) DUK_USE_DOUBLE_BE * H G F E D C B A Little endian (e.g. x86) DUK_USE_DOUBLE_LE * D C B A H G F E Mixed/cross endian (e.g. ARM) DUK_USE_DOUBLE_ME * * ARM is a special case: ARM double values are in mixed/cross endian * format while ARM duk_uint64_t values are in standard little endian * format (H G F E D C B A). When a double is read as a duk_uint64_t * from memory, the register will contain the (logical) value * E F G H A B C D. This requires some special handling below. * * Indexes of various types (8-bit, 16-bit, 32-bit) in memory relative to * the logical (big endian) order: * * byte order duk_uint8_t duk_uint16_t duk_uint32_t * BE 01234567 0123 01 * LE 76543210 3210 10 * ME (ARM) 32107654 1032 01 * * Some processors may alter NaN values in a floating point load+store. * For instance, on X86 a FLD + FSTP may convert a signaling NaN to a * quiet one. This is catastrophic when NaN space is used in packed * duk_tval values. See: misc/clang_aliasing.c. */ #if !defined(DUK_DBLUNION_H_INCLUDED) #define DUK_DBLUNION_H_INCLUDED /* * Union for accessing double parts, also serves as packed duk_tval */ union duk_double_union { double d; float f[2]; #if defined(DUK_USE_64BIT_OPS) duk_uint64_t ull[1]; #endif duk_uint32_t ui[2]; duk_uint16_t us[4]; duk_uint8_t uc[8]; #if defined(DUK_USE_PACKED_TVAL) void *vp[2]; /* used by packed duk_tval, assumes sizeof(void *) == 4 */ #endif }; typedef union duk_double_union duk_double_union; /* * Indexes of various types with respect to big endian (logical) layout */ #if defined(DUK_USE_DOUBLE_LE) #if defined(DUK_USE_64BIT_OPS) #define DUK_DBL_IDX_ULL0 0 #endif #define DUK_DBL_IDX_UI0 1 #define DUK_DBL_IDX_UI1 0 #define DUK_DBL_IDX_US0 3 #define DUK_DBL_IDX_US1 2 #define DUK_DBL_IDX_US2 1 #define DUK_DBL_IDX_US3 0 #define DUK_DBL_IDX_UC0 7 #define DUK_DBL_IDX_UC1 6 #define DUK_DBL_IDX_UC2 5 #define DUK_DBL_IDX_UC3 4 #define DUK_DBL_IDX_UC4 3 #define DUK_DBL_IDX_UC5 2 #define DUK_DBL_IDX_UC6 1 #define DUK_DBL_IDX_UC7 0 #define DUK_DBL_IDX_VP0 DUK_DBL_IDX_UI0 /* packed tval */ #define DUK_DBL_IDX_VP1 DUK_DBL_IDX_UI1 /* packed tval */ #elif defined(DUK_USE_DOUBLE_BE) #if defined(DUK_USE_64BIT_OPS) #define DUK_DBL_IDX_ULL0 0 #endif #define DUK_DBL_IDX_UI0 0 #define DUK_DBL_IDX_UI1 1 #define DUK_DBL_IDX_US0 0 #define DUK_DBL_IDX_US1 1 #define DUK_DBL_IDX_US2 2 #define DUK_DBL_IDX_US3 3 #define DUK_DBL_IDX_UC0 0 #define DUK_DBL_IDX_UC1 1 #define DUK_DBL_IDX_UC2 2 #define DUK_DBL_IDX_UC3 3 #define DUK_DBL_IDX_UC4 4 #define DUK_DBL_IDX_UC5 5 #define DUK_DBL_IDX_UC6 6 #define DUK_DBL_IDX_UC7 7 #define DUK_DBL_IDX_VP0 DUK_DBL_IDX_UI0 /* packed tval */ #define DUK_DBL_IDX_VP1 DUK_DBL_IDX_UI1 /* packed tval */ #elif defined(DUK_USE_DOUBLE_ME) #if defined(DUK_USE_64BIT_OPS) #define DUK_DBL_IDX_ULL0 0 /* not directly applicable, byte order differs from a double */ #endif #define DUK_DBL_IDX_UI0 0 #define DUK_DBL_IDX_UI1 1 #define DUK_DBL_IDX_US0 1 #define DUK_DBL_IDX_US1 0 #define DUK_DBL_IDX_US2 3 #define DUK_DBL_IDX_US3 2 #define DUK_DBL_IDX_UC0 3 #define DUK_DBL_IDX_UC1 2 #define DUK_DBL_IDX_UC2 1 #define DUK_DBL_IDX_UC3 0 #define DUK_DBL_IDX_UC4 7 #define DUK_DBL_IDX_UC5 6 #define DUK_DBL_IDX_UC6 5 #define DUK_DBL_IDX_UC7 4 #define DUK_DBL_IDX_VP0 DUK_DBL_IDX_UI0 /* packed tval */ #define DUK_DBL_IDX_VP1 DUK_DBL_IDX_UI1 /* packed tval */ #else #error internal error #endif /* * Helper macros for reading/writing memory representation parts, used * by duk_numconv.c and duk_tval.h. */ #define DUK_DBLUNION_SET_DOUBLE(u,v) do { \ (u)->d = (v); \ } while (0) #define DUK_DBLUNION_SET_HIGH32(u,v) do { \ (u)->ui[DUK_DBL_IDX_UI0] = (duk_uint32_t) (v); \ } while (0) #if defined(DUK_USE_64BIT_OPS) #if defined(DUK_USE_DOUBLE_ME) #define DUK_DBLUNION_SET_HIGH32_ZERO_LOW32(u,v) do { \ (u)->ull[DUK_DBL_IDX_ULL0] = (duk_uint64_t) (v); \ } while (0) #else #define DUK_DBLUNION_SET_HIGH32_ZERO_LOW32(u,v) do { \ (u)->ull[DUK_DBL_IDX_ULL0] = ((duk_uint64_t) (v)) << 32; \ } while (0) #endif #else /* DUK_USE_64BIT_OPS */ #define DUK_DBLUNION_SET_HIGH32_ZERO_LOW32(u,v) do { \ (u)->ui[DUK_DBL_IDX_UI0] = (duk_uint32_t) (v); \ (u)->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) 0; \ } while (0) #endif /* DUK_USE_64BIT_OPS */ #define DUK_DBLUNION_SET_LOW32(u,v) do { \ (u)->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) (v); \ } while (0) #define DUK_DBLUNION_GET_DOUBLE(u) ((u)->d) #define DUK_DBLUNION_GET_HIGH32(u) ((u)->ui[DUK_DBL_IDX_UI0]) #define DUK_DBLUNION_GET_LOW32(u) ((u)->ui[DUK_DBL_IDX_UI1]) #if defined(DUK_USE_64BIT_OPS) #if defined(DUK_USE_DOUBLE_ME) #define DUK_DBLUNION_SET_UINT64(u,v) do { \ (u)->ui[DUK_DBL_IDX_UI0] = (duk_uint32_t) ((v) >> 32); \ (u)->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) (v); \ } while (0) #define DUK_DBLUNION_GET_UINT64(u) \ ((((duk_uint64_t) (u)->ui[DUK_DBL_IDX_UI0]) << 32) | \ ((duk_uint64_t) (u)->ui[DUK_DBL_IDX_UI1])) #else #define DUK_DBLUNION_SET_UINT64(u,v) do { \ (u)->ull[DUK_DBL_IDX_ULL0] = (duk_uint64_t) (v); \ } while (0) #define DUK_DBLUNION_GET_UINT64(u) ((u)->ull[DUK_DBL_IDX_ULL0]) #endif #define DUK_DBLUNION_SET_INT64(u,v) DUK_DBLUNION_SET_UINT64((u), (duk_uint64_t) (v)) #define DUK_DBLUNION_GET_INT64(u) ((duk_int64_t) DUK_DBLUNION_GET_UINT64((u))) #endif /* DUK_USE_64BIT_OPS */ /* * Double NaN manipulation macros related to NaN normalization needed when * using the packed duk_tval representation. NaN normalization is necessary * to keep double values compatible with the duk_tval format. * * When packed duk_tval is used, the NaN space is used to store pointers * and other tagged values in addition to NaNs. Actual NaNs are normalized * to a specific quiet NaN. The macros below are used by the implementation * to check and normalize NaN values when they might be created. The macros * are essentially NOPs when the non-packed duk_tval representation is used. * * A FULL check is exact and checks all bits. A NOTFULL check is used by * the packed duk_tval and works correctly for all NaNs except those that * begin with 0x7ff0. Since the 'normalized NaN' values used with packed * duk_tval begin with 0x7ff8, the partial check is reliable when packed * duk_tval is used. The 0x7ff8 prefix means the normalized NaN will be a * quiet NaN regardless of its remaining lower bits. * * The ME variant below is specifically for ARM byte order, which has the * feature that while doubles have a mixed byte order (32107654), unsigned * long long values has a little endian byte order (76543210). When writing * a logical double value through a ULL pointer, the 32-bit words need to be * swapped; hence the #if defined()s below for ULL writes with DUK_USE_DOUBLE_ME. * This is not full ARM support but suffices for some environments. */ #if defined(DUK_USE_64BIT_OPS) #if defined(DUK_USE_DOUBLE_ME) /* Macros for 64-bit ops + mixed endian doubles. */ #define DUK__DBLUNION_SET_NAN_FULL(u) do { \ (u)->ull[DUK_DBL_IDX_ULL0] = DUK_U64_CONSTANT(0x000000007ff80000); \ } while (0) #define DUK__DBLUNION_IS_NAN_FULL(u) \ ((((u)->ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x000000007ff00000)) == DUK_U64_CONSTANT(0x000000007ff00000)) && \ ((((u)->ull[DUK_DBL_IDX_ULL0]) & DUK_U64_CONSTANT(0xffffffff000fffff)) != 0)) #define DUK__DBLUNION_IS_NORMALIZED_NAN_FULL(u) \ ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x000000007ff80000)) #define DUK__DBLUNION_IS_ANYINF(u) \ (((u)->ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0xffffffff7fffffff)) == DUK_U64_CONSTANT(0x000000007ff00000)) #define DUK__DBLUNION_IS_POSINF(u) \ ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x000000007ff00000)) #define DUK__DBLUNION_IS_NEGINF(u) \ ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x00000000fff00000)) #define DUK__DBLUNION_IS_ANYZERO(u) \ (((u)->ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0xffffffff7fffffff)) == DUK_U64_CONSTANT(0x0000000000000000)) #define DUK__DBLUNION_IS_POSZERO(u) \ ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x0000000000000000)) #define DUK__DBLUNION_IS_NEGZERO(u) \ ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x0000000080000000)) #else /* Macros for 64-bit ops + big/little endian doubles. */ #define DUK__DBLUNION_SET_NAN_FULL(u) do { \ (u)->ull[DUK_DBL_IDX_ULL0] = DUK_U64_CONSTANT(0x7ff8000000000000); \ } while (0) #define DUK__DBLUNION_IS_NAN_FULL(u) \ ((((u)->ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x7ff0000000000000)) == DUK_U64_CONSTANT(0x7ff0000000000000)) && \ ((((u)->ull[DUK_DBL_IDX_ULL0]) & DUK_U64_CONSTANT(0x000fffffffffffff)) != 0)) #define DUK__DBLUNION_IS_NORMALIZED_NAN_FULL(u) \ ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x7ff8000000000000)) #define DUK__DBLUNION_IS_ANYINF(u) \ (((u)->ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x7fffffffffffffff)) == DUK_U64_CONSTANT(0x7ff0000000000000)) #define DUK__DBLUNION_IS_POSINF(u) \ ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x7ff0000000000000)) #define DUK__DBLUNION_IS_NEGINF(u) \ ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0xfff0000000000000)) #define DUK__DBLUNION_IS_ANYZERO(u) \ (((u)->ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x7fffffffffffffff)) == DUK_U64_CONSTANT(0x0000000000000000)) #define DUK__DBLUNION_IS_POSZERO(u) \ ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x0000000000000000)) #define DUK__DBLUNION_IS_NEGZERO(u) \ ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x8000000000000000)) #endif #else /* DUK_USE_64BIT_OPS */ /* Macros for no 64-bit ops, any endianness. */ #define DUK__DBLUNION_SET_NAN_FULL(u) do { \ (u)->ui[DUK_DBL_IDX_UI0] = (duk_uint32_t) 0x7ff80000UL; \ (u)->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) 0x00000000UL; \ } while (0) #define DUK__DBLUNION_IS_NAN_FULL(u) \ ((((u)->ui[DUK_DBL_IDX_UI0] & 0x7ff00000UL) == 0x7ff00000UL) && \ (((u)->ui[DUK_DBL_IDX_UI0] & 0x000fffffUL) != 0 || \ (u)->ui[DUK_DBL_IDX_UI1] != 0)) #define DUK__DBLUNION_IS_NORMALIZED_NAN_FULL(u) \ (((u)->ui[DUK_DBL_IDX_UI0] == 0x7ff80000UL) && \ ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL)) #define DUK__DBLUNION_IS_ANYINF(u) \ ((((u)->ui[DUK_DBL_IDX_UI0] & 0x7fffffffUL) == 0x7ff00000UL) && \ ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL)) #define DUK__DBLUNION_IS_POSINF(u) \ (((u)->ui[DUK_DBL_IDX_UI0] == 0x7ff00000UL) && \ ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL)) #define DUK__DBLUNION_IS_NEGINF(u) \ (((u)->ui[DUK_DBL_IDX_UI0] == 0xfff00000UL) && \ ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL)) #define DUK__DBLUNION_IS_ANYZERO(u) \ ((((u)->ui[DUK_DBL_IDX_UI0] & 0x7fffffffUL) == 0x00000000UL) && \ ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL)) #define DUK__DBLUNION_IS_POSZERO(u) \ (((u)->ui[DUK_DBL_IDX_UI0] == 0x00000000UL) && \ ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL)) #define DUK__DBLUNION_IS_NEGZERO(u) \ (((u)->ui[DUK_DBL_IDX_UI0] == 0x80000000UL) && \ ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL)) #endif /* DUK_USE_64BIT_OPS */ #define DUK__DBLUNION_SET_NAN_NOTFULL(u) do { \ (u)->us[DUK_DBL_IDX_US0] = 0x7ff8UL; \ } while (0) #define DUK__DBLUNION_IS_NAN_NOTFULL(u) \ /* E == 0x7ff, topmost four bits of F != 0 => assume NaN */ \ ((((u)->us[DUK_DBL_IDX_US0] & 0x7ff0UL) == 0x7ff0UL) && \ (((u)->us[DUK_DBL_IDX_US0] & 0x000fUL) != 0x0000UL)) #define DUK__DBLUNION_IS_NORMALIZED_NAN_NOTFULL(u) \ /* E == 0x7ff, F == 8 => normalized NaN */ \ ((u)->us[DUK_DBL_IDX_US0] == 0x7ff8UL) #define DUK__DBLUNION_NORMALIZE_NAN_CHECK_FULL(u) do { \ if (DUK__DBLUNION_IS_NAN_FULL((u))) { \ DUK__DBLUNION_SET_NAN_FULL((u)); \ } \ } while (0) #define DUK__DBLUNION_NORMALIZE_NAN_CHECK_NOTFULL(u) do { \ if (DUK__DBLUNION_IS_NAN_NOTFULL((u))) { \ DUK__DBLUNION_SET_NAN_NOTFULL((u)); \ } \ } while (0) /* Concrete macros for NaN handling used by the implementation internals. * Chosen so that they match the duk_tval representation: with a packed * duk_tval, ensure NaNs are properly normalized; with a non-packed duk_tval * these are essentially NOPs. */ #if defined(DUK_USE_PACKED_TVAL) #if defined(DUK_USE_FULL_TVAL) #define DUK_DBLUNION_NORMALIZE_NAN_CHECK(u) DUK__DBLUNION_NORMALIZE_NAN_CHECK_FULL((u)) #define DUK_DBLUNION_IS_NAN(u) DUK__DBLUNION_IS_NAN_FULL((u)) #define DUK_DBLUNION_IS_NORMALIZED_NAN(u) DUK__DBLUNION_IS_NORMALIZED_NAN_FULL((u)) #define DUK_DBLUNION_SET_NAN(d) DUK__DBLUNION_SET_NAN_FULL((d)) #else #define DUK_DBLUNION_NORMALIZE_NAN_CHECK(u) DUK__DBLUNION_NORMALIZE_NAN_CHECK_NOTFULL((u)) #define DUK_DBLUNION_IS_NAN(u) DUK__DBLUNION_IS_NAN_NOTFULL((u)) #define DUK_DBLUNION_IS_NORMALIZED_NAN(u) DUK__DBLUNION_IS_NORMALIZED_NAN_NOTFULL((u)) #define DUK_DBLUNION_SET_NAN(d) DUK__DBLUNION_SET_NAN_NOTFULL((d)) #endif #define DUK_DBLUNION_IS_NORMALIZED(u) \ (!DUK_DBLUNION_IS_NAN((u)) || /* either not a NaN */ \ DUK_DBLUNION_IS_NORMALIZED_NAN((u))) /* or is a normalized NaN */ #else /* DUK_USE_PACKED_TVAL */ #define DUK_DBLUNION_NORMALIZE_NAN_CHECK(u) /* nop: no need to normalize */ #define DUK_DBLUNION_IS_NAN(u) DUK__DBLUNION_IS_NAN_FULL((u)) /* (DUK_ISNAN((u)->d)) */ #define DUK_DBLUNION_IS_NORMALIZED_NAN(u) DUK__DBLUNION_IS_NAN_FULL((u)) /* (DUK_ISNAN((u)->d)) */ #define DUK_DBLUNION_IS_NORMALIZED(u) 1 /* all doubles are considered normalized */ #define DUK_DBLUNION_SET_NAN(u) do { \ /* in non-packed representation we don't care about which NaN is used */ \ (u)->d = DUK_DOUBLE_NAN; \ } while (0) #endif /* DUK_USE_PACKED_TVAL */ #define DUK_DBLUNION_IS_ANYINF(u) DUK__DBLUNION_IS_ANYINF((u)) #define DUK_DBLUNION_IS_POSINF(u) DUK__DBLUNION_IS_POSINF((u)) #define DUK_DBLUNION_IS_NEGINF(u) DUK__DBLUNION_IS_NEGINF((u)) #define DUK_DBLUNION_IS_ANYZERO(u) DUK__DBLUNION_IS_ANYZERO((u)) #define DUK_DBLUNION_IS_POSZERO(u) DUK__DBLUNION_IS_POSZERO((u)) #define DUK_DBLUNION_IS_NEGZERO(u) DUK__DBLUNION_IS_NEGZERO((u)) /* XXX: native 64-bit byteswaps when available */ /* 64-bit byteswap, same operation independent of target endianness. */ #define DUK_DBLUNION_BSWAP64(u) do { \ duk_uint32_t duk__bswaptmp1, duk__bswaptmp2; \ duk__bswaptmp1 = (u)->ui[0]; \ duk__bswaptmp2 = (u)->ui[1]; \ duk__bswaptmp1 = DUK_BSWAP32(duk__bswaptmp1); \ duk__bswaptmp2 = DUK_BSWAP32(duk__bswaptmp2); \ (u)->ui[0] = duk__bswaptmp2; \ (u)->ui[1] = duk__bswaptmp1; \ } while (0) /* Byteswap an IEEE double in the duk_double_union from host to network * order. For a big endian target this is a no-op. */ #if defined(DUK_USE_DOUBLE_LE) #define DUK_DBLUNION_DOUBLE_HTON(u) do { \ duk_uint32_t duk__bswaptmp1, duk__bswaptmp2; \ duk__bswaptmp1 = (u)->ui[0]; \ duk__bswaptmp2 = (u)->ui[1]; \ duk__bswaptmp1 = DUK_BSWAP32(duk__bswaptmp1); \ duk__bswaptmp2 = DUK_BSWAP32(duk__bswaptmp2); \ (u)->ui[0] = duk__bswaptmp2; \ (u)->ui[1] = duk__bswaptmp1; \ } while (0) #elif defined(DUK_USE_DOUBLE_ME) #define DUK_DBLUNION_DOUBLE_HTON(u) do { \ duk_uint32_t duk__bswaptmp1, duk__bswaptmp2; \ duk__bswaptmp1 = (u)->ui[0]; \ duk__bswaptmp2 = (u)->ui[1]; \ duk__bswaptmp1 = DUK_BSWAP32(duk__bswaptmp1); \ duk__bswaptmp2 = DUK_BSWAP32(duk__bswaptmp2); \ (u)->ui[0] = duk__bswaptmp1; \ (u)->ui[1] = duk__bswaptmp2; \ } while (0) #elif defined(DUK_USE_DOUBLE_BE) #define DUK_DBLUNION_DOUBLE_HTON(u) do { } while (0) #else #error internal error, double endianness insane #endif /* Reverse operation is the same. */ #define DUK_DBLUNION_DOUBLE_NTOH(u) DUK_DBLUNION_DOUBLE_HTON((u)) /* Some sign bit helpers. */ #if defined(DUK_USE_64BIT_OPS) #define DUK_DBLUNION_HAS_SIGNBIT(u) (((u)->ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x8000000000000000)) != 0) #define DUK_DBLUNION_GET_SIGNBIT(u) (((u)->ull[DUK_DBL_IDX_ULL0] >> 63U)) #else #define DUK_DBLUNION_HAS_SIGNBIT(u) (((u)->ui[DUK_DBL_IDX_UI0] & 0x80000000UL) != 0) #define DUK_DBLUNION_GET_SIGNBIT(u) (((u)->ui[DUK_DBL_IDX_UI0] >> 31U)) #endif #endif /* DUK_DBLUNION_H_INCLUDED */ /* #include duk_replacements.h */ #line 1 "duk_replacements.h" #if !defined(DUK_REPLACEMENTS_H_INCLUDED) #define DUK_REPLACEMENTS_H_INCLUDED #if !defined(DUK_SINGLE_FILE) #if defined(DUK_USE_COMPUTED_INFINITY) DUK_INTERNAL_DECL double duk_computed_infinity; #endif #if defined(DUK_USE_COMPUTED_NAN) DUK_INTERNAL_DECL double duk_computed_nan; #endif #endif /* !DUK_SINGLE_FILE */ #if defined(DUK_USE_REPL_FPCLASSIFY) DUK_INTERNAL_DECL int duk_repl_fpclassify(double x); #endif #if defined(DUK_USE_REPL_SIGNBIT) DUK_INTERNAL_DECL int duk_repl_signbit(double x); #endif #if defined(DUK_USE_REPL_ISFINITE) DUK_INTERNAL_DECL int duk_repl_isfinite(double x); #endif #if defined(DUK_USE_REPL_ISNAN) DUK_INTERNAL_DECL int duk_repl_isnan(double x); #endif #if defined(DUK_USE_REPL_ISINF) DUK_INTERNAL_DECL int duk_repl_isinf(double x); #endif #endif /* DUK_REPLACEMENTS_H_INCLUDED */ /* #include duk_jmpbuf.h */ #line 1 "duk_jmpbuf.h" /* * Wrapper for jmp_buf. * * This is used because jmp_buf is an array type for backward compatibility. * Wrapping jmp_buf in a struct makes pointer references, sizeof, etc, * behave more intuitively. * * http://en.wikipedia.org/wiki/Setjmp.h#Member_types */ #if !defined(DUK_JMPBUF_H_INCLUDED) #define DUK_JMPBUF_H_INCLUDED #if defined(DUK_USE_CPP_EXCEPTIONS) struct duk_jmpbuf { duk_small_int_t dummy; /* unused */ }; #else struct duk_jmpbuf { DUK_JMPBUF_TYPE jb; }; #endif #endif /* DUK_JMPBUF_H_INCLUDED */ /* #include duk_exception.h */ #line 1 "duk_exception.h" /* * Exception for Duktape internal throws when C++ exceptions are used * for long control transfers. * * Doesn't inherit from any exception base class to minimize the chance * that user code would accidentally catch this exception. */ #if !defined(DUK_EXCEPTION_H_INCLUDED) #define DUK_EXCEPTION_H_INCLUDED #if defined(DUK_USE_CPP_EXCEPTIONS) class duk_internal_exception { /* intentionally empty */ }; #endif #endif /* DUK_EXCEPTION_H_INCLUDED */ /* #include duk_forwdecl.h */ #line 1 "duk_forwdecl.h" /* * Forward declarations for all Duktape structures. */ #if !defined(DUK_FORWDECL_H_INCLUDED) #define DUK_FORWDECL_H_INCLUDED /* * Forward declarations */ #if defined(DUK_USE_CPP_EXCEPTIONS) class duk_internal_exception; #else struct duk_jmpbuf; #endif /* duk_tval intentionally skipped */ struct duk_heaphdr; struct duk_heaphdr_string; struct duk_harray; struct duk_hstring; struct duk_hstring_external; struct duk_hobject; struct duk_hcompfunc; struct duk_hnatfunc; struct duk_hboundfunc; struct duk_hthread; struct duk_hbufobj; struct duk_hdecenv; struct duk_hobjenv; struct duk_hproxy; struct duk_hbuffer; struct duk_hbuffer_fixed; struct duk_hbuffer_dynamic; struct duk_hbuffer_external; struct duk_propaccessor; union duk_propvalue; struct duk_propdesc; struct duk_heap; struct duk_breakpoint; struct duk_activation; struct duk_catcher; struct duk_strcache; struct duk_ljstate; struct duk_strtab_entry; #if defined(DUK_USE_DEBUG) struct duk_fixedbuffer; #endif struct duk_bitdecoder_ctx; struct duk_bitencoder_ctx; struct duk_bufwriter_ctx; struct duk_token; struct duk_re_token; struct duk_lexer_point; struct duk_lexer_ctx; struct duk_lexer_codepoint; struct duk_compiler_instr; struct duk_compiler_func; struct duk_compiler_ctx; struct duk_re_matcher_ctx; struct duk_re_compiler_ctx; #if defined(DUK_USE_CPP_EXCEPTIONS) /* no typedef */ #else typedef struct duk_jmpbuf duk_jmpbuf; #endif /* duk_tval intentionally skipped */ typedef struct duk_heaphdr duk_heaphdr; typedef struct duk_heaphdr_string duk_heaphdr_string; typedef struct duk_harray duk_harray; typedef struct duk_hstring duk_hstring; typedef struct duk_hstring_external duk_hstring_external; typedef struct duk_hobject duk_hobject; typedef struct duk_hcompfunc duk_hcompfunc; typedef struct duk_hnatfunc duk_hnatfunc; typedef struct duk_hboundfunc duk_hboundfunc; typedef struct duk_hthread duk_hthread; typedef struct duk_hbufobj duk_hbufobj; typedef struct duk_hdecenv duk_hdecenv; typedef struct duk_hobjenv duk_hobjenv; typedef struct duk_hproxy duk_hproxy; typedef struct duk_hbuffer duk_hbuffer; typedef struct duk_hbuffer_fixed duk_hbuffer_fixed; typedef struct duk_hbuffer_dynamic duk_hbuffer_dynamic; typedef struct duk_hbuffer_external duk_hbuffer_external; typedef struct duk_propaccessor duk_propaccessor; typedef union duk_propvalue duk_propvalue; typedef struct duk_propdesc duk_propdesc; typedef struct duk_heap duk_heap; typedef struct duk_breakpoint duk_breakpoint; typedef struct duk_activation duk_activation; typedef struct duk_catcher duk_catcher; typedef struct duk_strcache duk_strcache; typedef struct duk_ljstate duk_ljstate; typedef struct duk_strtab_entry duk_strtab_entry; #if defined(DUK_USE_DEBUG) typedef struct duk_fixedbuffer duk_fixedbuffer; #endif typedef struct duk_bitdecoder_ctx duk_bitdecoder_ctx; typedef struct duk_bitencoder_ctx duk_bitencoder_ctx; typedef struct duk_bufwriter_ctx duk_bufwriter_ctx; typedef struct duk_token duk_token; typedef struct duk_re_token duk_re_token; typedef struct duk_lexer_point duk_lexer_point; typedef struct duk_lexer_ctx duk_lexer_ctx; typedef struct duk_lexer_codepoint duk_lexer_codepoint; typedef struct duk_compiler_instr duk_compiler_instr; typedef struct duk_compiler_func duk_compiler_func; typedef struct duk_compiler_ctx duk_compiler_ctx; typedef struct duk_re_matcher_ctx duk_re_matcher_ctx; typedef struct duk_re_compiler_ctx duk_re_compiler_ctx; #endif /* DUK_FORWDECL_H_INCLUDED */ /* #include duk_tval.h */ #line 1 "duk_tval.h" /* * Tagged type definition (duk_tval) and accessor macros. * * Access all fields through the accessor macros, as the representation * is quite tricky. * * There are two packed type alternatives: an 8-byte representation * based on an IEEE double (preferred for compactness), and a 12-byte * representation (portability). The latter is needed also in e.g. * 64-bit environments (it usually pads to 16 bytes per value). * * Selecting the tagged type format involves many trade-offs (memory * use, size and performance of generated code, portability, etc). * * NB: because macro arguments are often expressions, macros should * avoid evaluating their argument more than once. */ #if !defined(DUK_TVAL_H_INCLUDED) #define DUK_TVAL_H_INCLUDED /* sanity */ #if !defined(DUK_USE_DOUBLE_LE) && !defined(DUK_USE_DOUBLE_ME) && !defined(DUK_USE_DOUBLE_BE) #error unsupported: cannot determine byte order variant #endif #if defined(DUK_USE_PACKED_TVAL) /* ======================================================================== */ /* * Packed 8-byte representation */ /* use duk_double_union as duk_tval directly */ typedef union duk_double_union duk_tval; typedef struct { duk_uint16_t a; duk_uint16_t b; duk_uint16_t c; duk_uint16_t d; } duk_tval_unused; /* tags */ #define DUK_TAG_NORMALIZED_NAN 0x7ff8UL /* the NaN variant we use */ /* avoid tag 0xfff0, no risk of confusion with negative infinity */ #define DUK_TAG_MIN 0xfff1UL #if defined(DUK_USE_FASTINT) #define DUK_TAG_FASTINT 0xfff1UL /* embed: integer value */ #endif #define DUK_TAG_UNUSED 0xfff2UL /* marker; not actual tagged value */ #define DUK_TAG_UNDEFINED 0xfff3UL /* embed: nothing */ #define DUK_TAG_NULL 0xfff4UL /* embed: nothing */ #define DUK_TAG_BOOLEAN 0xfff5UL /* embed: 0 or 1 (false or true) */ /* DUK_TAG_NUMBER would logically go here, but it has multiple 'tags' */ #define DUK_TAG_POINTER 0xfff6UL /* embed: void ptr */ #define DUK_TAG_LIGHTFUNC 0xfff7UL /* embed: func ptr */ #define DUK_TAG_STRING 0xfff8UL /* embed: duk_hstring ptr */ #define DUK_TAG_OBJECT 0xfff9UL /* embed: duk_hobject ptr */ #define DUK_TAG_BUFFER 0xfffaUL /* embed: duk_hbuffer ptr */ #define DUK_TAG_MAX 0xfffaUL /* for convenience */ #define DUK_XTAG_BOOLEAN_FALSE 0xfff50000UL #define DUK_XTAG_BOOLEAN_TRUE 0xfff50001UL #define DUK_TVAL_IS_VALID_TAG(tv) \ (DUK_TVAL_GET_TAG((tv)) - DUK_TAG_MIN <= DUK_TAG_MAX - DUK_TAG_MIN) /* DUK_TVAL_UNUSED initializer for duk_tval_unused, works for any endianness. */ #define DUK_TVAL_UNUSED_INITIALIZER() \ { DUK_TAG_UNUSED, DUK_TAG_UNUSED, DUK_TAG_UNUSED, DUK_TAG_UNUSED } /* two casts to avoid gcc warning: "warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]" */ #if defined(DUK_USE_64BIT_OPS) #if defined(DUK_USE_DOUBLE_ME) #define DUK__TVAL_SET_TAGGEDPOINTER(tv,h,tag) do { \ (tv)->ull[DUK_DBL_IDX_ULL0] = (((duk_uint64_t) (tag)) << 16) | (((duk_uint64_t) (duk_uint32_t) (h)) << 32); \ } while (0) #else #define DUK__TVAL_SET_TAGGEDPOINTER(tv,h,tag) do { \ (tv)->ull[DUK_DBL_IDX_ULL0] = (((duk_uint64_t) (tag)) << 48) | ((duk_uint64_t) (duk_uint32_t) (h)); \ } while (0) #endif #else /* DUK_USE_64BIT_OPS */ #define DUK__TVAL_SET_TAGGEDPOINTER(tv,h,tag) do { \ duk_tval *duk__tv; \ duk__tv = (tv); \ duk__tv->ui[DUK_DBL_IDX_UI0] = ((duk_uint32_t) (tag)) << 16; \ duk__tv->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) (h); \ } while (0) #endif /* DUK_USE_64BIT_OPS */ #if defined(DUK_USE_64BIT_OPS) /* Double casting for pointer to avoid gcc warning (cast from pointer to integer of different size) */ #if defined(DUK_USE_DOUBLE_ME) #define DUK__TVAL_SET_LIGHTFUNC(tv,fp,flags) do { \ (tv)->ull[DUK_DBL_IDX_ULL0] = (((duk_uint64_t) DUK_TAG_LIGHTFUNC) << 16) | \ ((duk_uint64_t) (flags)) | \ (((duk_uint64_t) (duk_uint32_t) (fp)) << 32); \ } while (0) #else #define DUK__TVAL_SET_LIGHTFUNC(tv,fp,flags) do { \ (tv)->ull[DUK_DBL_IDX_ULL0] = (((duk_uint64_t) DUK_TAG_LIGHTFUNC) << 48) | \ (((duk_uint64_t) (flags)) << 32) | \ ((duk_uint64_t) (duk_uint32_t) (fp)); \ } while (0) #endif #else /* DUK_USE_64BIT_OPS */ #define DUK__TVAL_SET_LIGHTFUNC(tv,fp,flags) do { \ duk_tval *duk__tv; \ duk__tv = (tv); \ duk__tv->ui[DUK_DBL_IDX_UI0] = (((duk_uint32_t) DUK_TAG_LIGHTFUNC) << 16) | ((duk_uint32_t) (flags)); \ duk__tv->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) (fp); \ } while (0) #endif /* DUK_USE_64BIT_OPS */ #if defined(DUK_USE_FASTINT) /* Note: masking is done for 'i' to deal with negative numbers correctly */ #if defined(DUK_USE_DOUBLE_ME) #define DUK__TVAL_SET_I48(tv,i) do { \ duk_tval *duk__tv; \ duk__tv = (tv); \ duk__tv->ui[DUK_DBL_IDX_UI0] = ((duk_uint32_t) DUK_TAG_FASTINT) << 16 | (((duk_uint32_t) ((i) >> 32)) & 0x0000ffffUL); \ duk__tv->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) (i); \ } while (0) #define DUK__TVAL_SET_U32(tv,i) do { \ duk_tval *duk__tv; \ duk__tv = (tv); \ duk__tv->ui[DUK_DBL_IDX_UI0] = ((duk_uint32_t) DUK_TAG_FASTINT) << 16; \ duk__tv->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) (i); \ } while (0) #else #define DUK__TVAL_SET_I48(tv,i) do { \ (tv)->ull[DUK_DBL_IDX_ULL0] = (((duk_uint64_t) DUK_TAG_FASTINT) << 48) | (((duk_uint64_t) (i)) & DUK_U64_CONSTANT(0x0000ffffffffffff)); \ } while (0) #define DUK__TVAL_SET_U32(tv,i) do { \ (tv)->ull[DUK_DBL_IDX_ULL0] = (((duk_uint64_t) DUK_TAG_FASTINT) << 48) | (duk_uint64_t) (i); \ } while (0) #endif /* This needs to go through a cast because sign extension is needed. */ #define DUK__TVAL_SET_I32(tv,i) do { \ duk_int64_t duk__tmp = (duk_int64_t) (i); \ DUK_TVAL_SET_I48((tv), duk__tmp); \ } while (0) /* XXX: Clumsy sign extend and masking of 16 topmost bits. */ #if defined(DUK_USE_DOUBLE_ME) #define DUK__TVAL_GET_FASTINT(tv) (((duk_int64_t) ((((duk_uint64_t) (tv)->ui[DUK_DBL_IDX_UI0]) << 32) | ((duk_uint64_t) (tv)->ui[DUK_DBL_IDX_UI1]))) << 16 >> 16) #else #define DUK__TVAL_GET_FASTINT(tv) ((((duk_int64_t) (tv)->ull[DUK_DBL_IDX_ULL0]) << 16) >> 16) #endif #define DUK__TVAL_GET_FASTINT_U32(tv) ((tv)->ui[DUK_DBL_IDX_UI1]) #define DUK__TVAL_GET_FASTINT_I32(tv) ((duk_int32_t) (tv)->ui[DUK_DBL_IDX_UI1]) #endif /* DUK_USE_FASTINT */ #define DUK_TVAL_SET_UNDEFINED(tv) do { \ (tv)->us[DUK_DBL_IDX_US0] = (duk_uint16_t) DUK_TAG_UNDEFINED; \ } while (0) #define DUK_TVAL_SET_UNUSED(tv) do { \ (tv)->us[DUK_DBL_IDX_US0] = (duk_uint16_t) DUK_TAG_UNUSED; \ } while (0) #define DUK_TVAL_SET_NULL(tv) do { \ (tv)->us[DUK_DBL_IDX_US0] = (duk_uint16_t) DUK_TAG_NULL; \ } while (0) #define DUK_TVAL_SET_BOOLEAN(tv,val) DUK_DBLUNION_SET_HIGH32((tv), (((duk_uint32_t) DUK_TAG_BOOLEAN) << 16) | ((duk_uint32_t) (val))) #define DUK_TVAL_SET_NAN(tv) DUK_DBLUNION_SET_NAN_FULL((tv)) /* Assumes that caller has normalized NaNs, otherwise trouble ahead. */ #if defined(DUK_USE_FASTINT) #define DUK_TVAL_SET_DOUBLE(tv,d) do { \ duk_double_t duk__dblval; \ duk__dblval = (d); \ DUK_ASSERT_DOUBLE_IS_NORMALIZED(duk__dblval); \ DUK_DBLUNION_SET_DOUBLE((tv), duk__dblval); \ } while (0) #define DUK_TVAL_SET_I48(tv,i) DUK__TVAL_SET_I48((tv), (i)) #define DUK_TVAL_SET_I32(tv,i) DUK__TVAL_SET_I32((tv), (i)) #define DUK_TVAL_SET_U32(tv,i) DUK__TVAL_SET_U32((tv), (i)) #define DUK_TVAL_SET_NUMBER_CHKFAST_FAST(tv,d) duk_tval_set_number_chkfast_fast((tv), (d)) #define DUK_TVAL_SET_NUMBER_CHKFAST_SLOW(tv,d) duk_tval_set_number_chkfast_slow((tv), (d)) #define DUK_TVAL_SET_NUMBER(tv,d) DUK_TVAL_SET_DOUBLE((tv), (d)) #define DUK_TVAL_CHKFAST_INPLACE_FAST(tv) do { \ duk_tval *duk__tv; \ duk_double_t duk__d; \ duk__tv = (tv); \ if (DUK_TVAL_IS_DOUBLE(duk__tv)) { \ duk__d = DUK_TVAL_GET_DOUBLE(duk__tv); \ DUK_TVAL_SET_NUMBER_CHKFAST_FAST(duk__tv, duk__d); \ } \ } while (0) #define DUK_TVAL_CHKFAST_INPLACE_SLOW(tv) do { \ duk_tval *duk__tv; \ duk_double_t duk__d; \ duk__tv = (tv); \ if (DUK_TVAL_IS_DOUBLE(duk__tv)) { \ duk__d = DUK_TVAL_GET_DOUBLE(duk__tv); \ DUK_TVAL_SET_NUMBER_CHKFAST_SLOW(duk__tv, duk__d); \ } \ } while (0) #else /* DUK_USE_FASTINT */ #define DUK_TVAL_SET_DOUBLE(tv,d) do { \ duk_double_t duk__dblval; \ duk__dblval = (d); \ DUK_ASSERT_DOUBLE_IS_NORMALIZED(duk__dblval); \ DUK_DBLUNION_SET_DOUBLE((tv), duk__dblval); \ } while (0) #define DUK_TVAL_SET_I48(tv,i) DUK_TVAL_SET_DOUBLE((tv), (duk_double_t) (i)) /* XXX: fast int-to-double */ #define DUK_TVAL_SET_I32(tv,i) DUK_TVAL_SET_DOUBLE((tv), (duk_double_t) (i)) #define DUK_TVAL_SET_U32(tv,i) DUK_TVAL_SET_DOUBLE((tv), (duk_double_t) (i)) #define DUK_TVAL_SET_NUMBER_CHKFAST_FAST(tv,d) DUK_TVAL_SET_DOUBLE((tv), (d)) #define DUK_TVAL_SET_NUMBER_CHKFAST_SLOW(tv,d) DUK_TVAL_SET_DOUBLE((tv), (d)) #define DUK_TVAL_SET_NUMBER(tv,d) DUK_TVAL_SET_DOUBLE((tv), (d)) #define DUK_TVAL_CHKFAST_INPLACE_FAST(tv) do { } while (0) #define DUK_TVAL_CHKFAST_INPLACE_SLOW(tv) do { } while (0) #endif /* DUK_USE_FASTINT */ #define DUK_TVAL_SET_FASTINT(tv,i) DUK_TVAL_SET_I48((tv), (i)) /* alias */ #define DUK_TVAL_SET_LIGHTFUNC(tv,fp,flags) DUK__TVAL_SET_LIGHTFUNC((tv), (fp), (flags)) #define DUK_TVAL_SET_STRING(tv,h) DUK__TVAL_SET_TAGGEDPOINTER((tv), (h), DUK_TAG_STRING) #define DUK_TVAL_SET_OBJECT(tv,h) DUK__TVAL_SET_TAGGEDPOINTER((tv), (h), DUK_TAG_OBJECT) #define DUK_TVAL_SET_BUFFER(tv,h) DUK__TVAL_SET_TAGGEDPOINTER((tv), (h), DUK_TAG_BUFFER) #define DUK_TVAL_SET_POINTER(tv,p) DUK__TVAL_SET_TAGGEDPOINTER((tv), (p), DUK_TAG_POINTER) #define DUK_TVAL_SET_TVAL(tv,x) do { *(tv) = *(x); } while (0) /* getters */ #define DUK_TVAL_GET_BOOLEAN(tv) ((duk_small_uint_t) (tv)->us[DUK_DBL_IDX_US1]) #if defined(DUK_USE_FASTINT) #define DUK_TVAL_GET_DOUBLE(tv) ((tv)->d) #define DUK_TVAL_GET_FASTINT(tv) DUK__TVAL_GET_FASTINT((tv)) #define DUK_TVAL_GET_FASTINT_U32(tv) DUK__TVAL_GET_FASTINT_U32((tv)) #define DUK_TVAL_GET_FASTINT_I32(tv) DUK__TVAL_GET_FASTINT_I32((tv)) #define DUK_TVAL_GET_NUMBER(tv) duk_tval_get_number_packed((tv)) #else #define DUK_TVAL_GET_NUMBER(tv) ((tv)->d) #define DUK_TVAL_GET_DOUBLE(tv) ((tv)->d) #endif #define DUK_TVAL_GET_LIGHTFUNC(tv,out_fp,out_flags) do { \ (out_flags) = (tv)->ui[DUK_DBL_IDX_UI0] & 0xffffUL; \ (out_fp) = (duk_c_function) (tv)->ui[DUK_DBL_IDX_UI1]; \ } while (0) #define DUK_TVAL_GET_LIGHTFUNC_FUNCPTR(tv) ((duk_c_function) ((tv)->ui[DUK_DBL_IDX_UI1])) #define DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv) (((duk_small_uint_t) (tv)->ui[DUK_DBL_IDX_UI0]) & 0xffffUL) #define DUK_TVAL_GET_STRING(tv) ((duk_hstring *) (tv)->vp[DUK_DBL_IDX_VP1]) #define DUK_TVAL_GET_OBJECT(tv) ((duk_hobject *) (tv)->vp[DUK_DBL_IDX_VP1]) #define DUK_TVAL_GET_BUFFER(tv) ((duk_hbuffer *) (tv)->vp[DUK_DBL_IDX_VP1]) #define DUK_TVAL_GET_POINTER(tv) ((void *) (tv)->vp[DUK_DBL_IDX_VP1]) #define DUK_TVAL_GET_HEAPHDR(tv) ((duk_heaphdr *) (tv)->vp[DUK_DBL_IDX_VP1]) /* decoding */ #define DUK_TVAL_GET_TAG(tv) ((duk_small_uint_t) (tv)->us[DUK_DBL_IDX_US0]) #define DUK_TVAL_IS_UNDEFINED(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_UNDEFINED) #define DUK_TVAL_IS_UNUSED(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_UNUSED) #define DUK_TVAL_IS_NULL(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_NULL) #define DUK_TVAL_IS_BOOLEAN(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_BOOLEAN) #define DUK_TVAL_IS_BOOLEAN_TRUE(tv) ((tv)->ui[DUK_DBL_IDX_UI0] == DUK_XTAG_BOOLEAN_TRUE) #define DUK_TVAL_IS_BOOLEAN_FALSE(tv) ((tv)->ui[DUK_DBL_IDX_UI0] == DUK_XTAG_BOOLEAN_FALSE) #define DUK_TVAL_IS_LIGHTFUNC(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_LIGHTFUNC) #define DUK_TVAL_IS_STRING(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_STRING) #define DUK_TVAL_IS_OBJECT(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_OBJECT) #define DUK_TVAL_IS_BUFFER(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_BUFFER) #define DUK_TVAL_IS_POINTER(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_POINTER) #if defined(DUK_USE_FASTINT) /* 0xfff0 is -Infinity */ #define DUK_TVAL_IS_DOUBLE(tv) (DUK_TVAL_GET_TAG((tv)) <= 0xfff0UL) #define DUK_TVAL_IS_FASTINT(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_FASTINT) #define DUK_TVAL_IS_NUMBER(tv) (DUK_TVAL_GET_TAG((tv)) <= 0xfff1UL) #else #define DUK_TVAL_IS_NUMBER(tv) (DUK_TVAL_GET_TAG((tv)) <= 0xfff0UL) #define DUK_TVAL_IS_DOUBLE(tv) DUK_TVAL_IS_NUMBER((tv)) #endif /* This is performance critical because it appears in every DECREF. */ #define DUK_TVAL_IS_HEAP_ALLOCATED(tv) (DUK_TVAL_GET_TAG((tv)) >= DUK_TAG_STRING) #if defined(DUK_USE_FASTINT) DUK_INTERNAL_DECL duk_double_t duk_tval_get_number_packed(duk_tval *tv); #endif #else /* DUK_USE_PACKED_TVAL */ /* ======================================================================== */ /* * Portable 12-byte representation */ /* Note: not initializing all bytes is normally not an issue: Duktape won't * read or use the uninitialized bytes so valgrind won't issue warnings. * In some special cases a harmless valgrind warning may be issued though. * For example, the DumpHeap debugger command writes out a compiled function's * 'data' area as is, including any uninitialized bytes, which causes a * valgrind warning. */ typedef struct duk_tval_struct duk_tval; struct duk_tval_struct { duk_small_uint_t t; duk_small_uint_t v_extra; union { duk_double_t d; duk_small_int_t i; #if defined(DUK_USE_FASTINT) duk_int64_t fi; /* if present, forces 16-byte duk_tval */ #endif void *voidptr; duk_hstring *hstring; duk_hobject *hobject; duk_hcompfunc *hcompfunc; duk_hnatfunc *hnatfunc; duk_hthread *hthread; duk_hbuffer *hbuffer; duk_heaphdr *heaphdr; duk_c_function lightfunc; } v; }; typedef struct { duk_small_uint_t t; duk_small_uint_t v_extra; /* The rest of the fields don't matter except for debug dumps and such * for which a partial initializer may trigger out-ot-bounds memory * reads. Include a double field which is usually as large or larger * than pointers (not always however). */ duk_double_t d; } duk_tval_unused; #define DUK_TVAL_UNUSED_INITIALIZER() \ { DUK_TAG_UNUSED, 0, 0.0 } #define DUK_TAG_MIN 0 #define DUK_TAG_NUMBER 0 /* DUK_TAG_NUMBER only defined for non-packed duk_tval */ #if defined(DUK_USE_FASTINT) #define DUK_TAG_FASTINT 1 #endif #define DUK_TAG_UNDEFINED 2 #define DUK_TAG_NULL 3 #define DUK_TAG_BOOLEAN 4 #define DUK_TAG_POINTER 5 #define DUK_TAG_LIGHTFUNC 6 #define DUK_TAG_UNUSED 7 /* marker; not actual tagged type */ #define DUK_TAG_STRING 8 /* first heap allocated, match bit boundary */ #define DUK_TAG_OBJECT 9 #define DUK_TAG_BUFFER 10 #define DUK_TAG_MAX 10 #define DUK_TVAL_IS_VALID_TAG(tv) \ (DUK_TVAL_GET_TAG((tv)) - DUK_TAG_MIN <= DUK_TAG_MAX - DUK_TAG_MIN) /* DUK_TAG_NUMBER is intentionally first, as it is the default clause in code * to support the 8-byte representation. Further, it is a non-heap-allocated * type so it should come before DUK_TAG_STRING. Finally, it should not break * the tag value ranges covered by case-clauses in a switch-case. */ /* setters */ #define DUK_TVAL_SET_UNDEFINED(tv) do { \ duk_tval *duk__tv; \ duk__tv = (tv); \ duk__tv->t = DUK_TAG_UNDEFINED; \ } while (0) #define DUK_TVAL_SET_UNUSED(tv) do { \ duk_tval *duk__tv; \ duk__tv = (tv); \ duk__tv->t = DUK_TAG_UNUSED; \ } while (0) #define DUK_TVAL_SET_NULL(tv) do { \ duk_tval *duk__tv; \ duk__tv = (tv); \ duk__tv->t = DUK_TAG_NULL; \ } while (0) #define DUK_TVAL_SET_BOOLEAN(tv,val) do { \ duk_tval *duk__tv; \ duk__tv = (tv); \ duk__tv->t = DUK_TAG_BOOLEAN; \ duk__tv->v.i = (duk_small_int_t) (val); \ } while (0) #if defined(DUK_USE_FASTINT) #define DUK_TVAL_SET_DOUBLE(tv,val) do { \ duk_tval *duk__tv; \ duk_double_t duk__dblval; \ duk__dblval = (val); \ DUK_ASSERT_DOUBLE_IS_NORMALIZED(duk__dblval); /* nop for unpacked duk_tval */ \ duk__tv = (tv); \ duk__tv->t = DUK_TAG_NUMBER; \ duk__tv->v.d = duk__dblval; \ } while (0) #define DUK_TVAL_SET_I48(tv,val) do { \ duk_tval *duk__tv; \ duk__tv = (tv); \ duk__tv->t = DUK_TAG_FASTINT; \ duk__tv->v.fi = (val); \ } while (0) #define DUK_TVAL_SET_U32(tv,val) do { \ duk_tval *duk__tv; \ duk__tv = (tv); \ duk__tv->t = DUK_TAG_FASTINT; \ duk__tv->v.fi = (duk_int64_t) (val); \ } while (0) #define DUK_TVAL_SET_I32(tv,val) do { \ duk_tval *duk__tv; \ duk__tv = (tv); \ duk__tv->t = DUK_TAG_FASTINT; \ duk__tv->v.fi = (duk_int64_t) (val); \ } while (0) #define DUK_TVAL_SET_NUMBER_CHKFAST_FAST(tv,d) \ duk_tval_set_number_chkfast_fast((tv), (d)) #define DUK_TVAL_SET_NUMBER_CHKFAST_SLOW(tv,d) \ duk_tval_set_number_chkfast_slow((tv), (d)) #define DUK_TVAL_SET_NUMBER(tv,val) \ DUK_TVAL_SET_DOUBLE((tv), (val)) #define DUK_TVAL_CHKFAST_INPLACE_FAST(tv) do { \ duk_tval *duk__tv; \ duk_double_t duk__d; \ duk__tv = (tv); \ if (DUK_TVAL_IS_DOUBLE(duk__tv)) { \ duk__d = DUK_TVAL_GET_DOUBLE(duk__tv); \ DUK_TVAL_SET_NUMBER_CHKFAST_FAST(duk__tv, duk__d); \ } \ } while (0) #define DUK_TVAL_CHKFAST_INPLACE_SLOW(tv) do { \ duk_tval *duk__tv; \ duk_double_t duk__d; \ duk__tv = (tv); \ if (DUK_TVAL_IS_DOUBLE(duk__tv)) { \ duk__d = DUK_TVAL_GET_DOUBLE(duk__tv); \ DUK_TVAL_SET_NUMBER_CHKFAST_SLOW(duk__tv, duk__d); \ } \ } while (0) #else /* DUK_USE_FASTINT */ #define DUK_TVAL_SET_DOUBLE(tv,d) \ DUK_TVAL_SET_NUMBER((tv), (d)) #define DUK_TVAL_SET_I48(tv,val) \ DUK_TVAL_SET_NUMBER((tv), (duk_double_t) (val)) /* XXX: fast int-to-double */ #define DUK_TVAL_SET_U32(tv,val) \ DUK_TVAL_SET_NUMBER((tv), (duk_double_t) (val)) #define DUK_TVAL_SET_I32(tv,val) \ DUK_TVAL_SET_NUMBER((tv), (duk_double_t) (val)) #define DUK_TVAL_SET_NUMBER(tv,val) do { \ duk_tval *duk__tv; \ duk_double_t duk__dblval; \ duk__dblval = (val); \ DUK_ASSERT_DOUBLE_IS_NORMALIZED(duk__dblval); /* nop for unpacked duk_tval */ \ duk__tv = (tv); \ duk__tv->t = DUK_TAG_NUMBER; \ duk__tv->v.d = duk__dblval; \ } while (0) #define DUK_TVAL_SET_NUMBER_CHKFAST_FAST(tv,d) \ DUK_TVAL_SET_NUMBER((tv), (d)) #define DUK_TVAL_SET_NUMBER_CHKFAST_SLOW(tv,d) \ DUK_TVAL_SET_NUMBER((tv), (d)) #define DUK_TVAL_CHKFAST_INPLACE_FAST(tv) do { } while (0) #define DUK_TVAL_CHKFAST_INPLACE_SLOW(tv) do { } while (0) #endif /* DUK_USE_FASTINT */ #define DUK_TVAL_SET_FASTINT(tv,i) \ DUK_TVAL_SET_I48((tv), (i)) /* alias */ #define DUK_TVAL_SET_POINTER(tv,hptr) do { \ duk_tval *duk__tv; \ duk__tv = (tv); \ duk__tv->t = DUK_TAG_POINTER; \ duk__tv->v.voidptr = (hptr); \ } while (0) #define DUK_TVAL_SET_LIGHTFUNC(tv,fp,flags) do { \ duk_tval *duk__tv; \ duk__tv = (tv); \ duk__tv->t = DUK_TAG_LIGHTFUNC; \ duk__tv->v_extra = (flags); \ duk__tv->v.lightfunc = (duk_c_function) (fp); \ } while (0) #define DUK_TVAL_SET_STRING(tv,hptr) do { \ duk_tval *duk__tv; \ duk__tv = (tv); \ duk__tv->t = DUK_TAG_STRING; \ duk__tv->v.hstring = (hptr); \ } while (0) #define DUK_TVAL_SET_OBJECT(tv,hptr) do { \ duk_tval *duk__tv; \ duk__tv = (tv); \ duk__tv->t = DUK_TAG_OBJECT; \ duk__tv->v.hobject = (hptr); \ } while (0) #define DUK_TVAL_SET_BUFFER(tv,hptr) do { \ duk_tval *duk__tv; \ duk__tv = (tv); \ duk__tv->t = DUK_TAG_BUFFER; \ duk__tv->v.hbuffer = (hptr); \ } while (0) #define DUK_TVAL_SET_NAN(tv) do { \ /* in non-packed representation we don't care about which NaN is used */ \ duk_tval *duk__tv; \ duk__tv = (tv); \ duk__tv->t = DUK_TAG_NUMBER; \ duk__tv->v.d = DUK_DOUBLE_NAN; \ } while (0) #define DUK_TVAL_SET_TVAL(tv,x) do { *(tv) = *(x); } while (0) /* getters */ #define DUK_TVAL_GET_BOOLEAN(tv) ((duk_small_uint_t) (tv)->v.i) #if defined(DUK_USE_FASTINT) #define DUK_TVAL_GET_DOUBLE(tv) ((tv)->v.d) #define DUK_TVAL_GET_FASTINT(tv) ((tv)->v.fi) #define DUK_TVAL_GET_FASTINT_U32(tv) ((duk_uint32_t) ((tv)->v.fi)) #define DUK_TVAL_GET_FASTINT_I32(tv) ((duk_int32_t) ((tv)->v.fi)) #if 0 #define DUK_TVAL_GET_NUMBER(tv) (DUK_TVAL_IS_FASTINT((tv)) ? \ (duk_double_t) DUK_TVAL_GET_FASTINT((tv)) : \ DUK_TVAL_GET_DOUBLE((tv))) #define DUK_TVAL_GET_NUMBER(tv) duk_tval_get_number_unpacked((tv)) #else /* This seems reasonable overall. */ #define DUK_TVAL_GET_NUMBER(tv) (DUK_TVAL_IS_FASTINT((tv)) ? \ duk_tval_get_number_unpacked_fastint((tv)) : \ DUK_TVAL_GET_DOUBLE((tv))) #endif #else #define DUK_TVAL_GET_NUMBER(tv) ((tv)->v.d) #define DUK_TVAL_GET_DOUBLE(tv) ((tv)->v.d) #endif /* DUK_USE_FASTINT */ #define DUK_TVAL_GET_POINTER(tv) ((tv)->v.voidptr) #define DUK_TVAL_GET_LIGHTFUNC(tv,out_fp,out_flags) do { \ (out_flags) = (duk_uint32_t) (tv)->v_extra; \ (out_fp) = (tv)->v.lightfunc; \ } while (0) #define DUK_TVAL_GET_LIGHTFUNC_FUNCPTR(tv) ((tv)->v.lightfunc) #define DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv) ((duk_small_uint_t) ((tv)->v_extra)) #define DUK_TVAL_GET_STRING(tv) ((tv)->v.hstring) #define DUK_TVAL_GET_OBJECT(tv) ((tv)->v.hobject) #define DUK_TVAL_GET_BUFFER(tv) ((tv)->v.hbuffer) #define DUK_TVAL_GET_HEAPHDR(tv) ((tv)->v.heaphdr) /* decoding */ #define DUK_TVAL_GET_TAG(tv) ((tv)->t) #define DUK_TVAL_IS_UNDEFINED(tv) ((tv)->t == DUK_TAG_UNDEFINED) #define DUK_TVAL_IS_UNUSED(tv) ((tv)->t == DUK_TAG_UNUSED) #define DUK_TVAL_IS_NULL(tv) ((tv)->t == DUK_TAG_NULL) #define DUK_TVAL_IS_BOOLEAN(tv) ((tv)->t == DUK_TAG_BOOLEAN) #define DUK_TVAL_IS_BOOLEAN_TRUE(tv) (((tv)->t == DUK_TAG_BOOLEAN) && ((tv)->v.i != 0)) #define DUK_TVAL_IS_BOOLEAN_FALSE(tv) (((tv)->t == DUK_TAG_BOOLEAN) && ((tv)->v.i == 0)) #if defined(DUK_USE_FASTINT) #define DUK_TVAL_IS_DOUBLE(tv) ((tv)->t == DUK_TAG_NUMBER) #define DUK_TVAL_IS_FASTINT(tv) ((tv)->t == DUK_TAG_FASTINT) #define DUK_TVAL_IS_NUMBER(tv) ((tv)->t == DUK_TAG_NUMBER || \ (tv)->t == DUK_TAG_FASTINT) #else #define DUK_TVAL_IS_NUMBER(tv) ((tv)->t == DUK_TAG_NUMBER) #define DUK_TVAL_IS_DOUBLE(tv) DUK_TVAL_IS_NUMBER((tv)) #endif /* DUK_USE_FASTINT */ #define DUK_TVAL_IS_POINTER(tv) ((tv)->t == DUK_TAG_POINTER) #define DUK_TVAL_IS_LIGHTFUNC(tv) ((tv)->t == DUK_TAG_LIGHTFUNC) #define DUK_TVAL_IS_STRING(tv) ((tv)->t == DUK_TAG_STRING) #define DUK_TVAL_IS_OBJECT(tv) ((tv)->t == DUK_TAG_OBJECT) #define DUK_TVAL_IS_BUFFER(tv) ((tv)->t == DUK_TAG_BUFFER) /* This is performance critical because it's needed for every DECREF. * Take advantage of the fact that the first heap allocated tag is 8, * so that bit 3 is set for all heap allocated tags (and never set for * non-heap-allocated tags). */ #if 0 #define DUK_TVAL_IS_HEAP_ALLOCATED(tv) ((tv)->t >= DUK_TAG_STRING) #endif #define DUK_TVAL_IS_HEAP_ALLOCATED(tv) ((tv)->t & 0x08) #if defined(DUK_USE_FASTINT) #if 0 DUK_INTERNAL_DECL duk_double_t duk_tval_get_number_unpacked(duk_tval *tv); #endif DUK_INTERNAL_DECL duk_double_t duk_tval_get_number_unpacked_fastint(duk_tval *tv); #endif #endif /* DUK_USE_PACKED_TVAL */ /* * Convenience (independent of representation) */ #define DUK_TVAL_SET_BOOLEAN_TRUE(tv) DUK_TVAL_SET_BOOLEAN((tv), 1) #define DUK_TVAL_SET_BOOLEAN_FALSE(tv) DUK_TVAL_SET_BOOLEAN((tv), 0) #define DUK_TVAL_STRING_IS_SYMBOL(tv) \ DUK_HSTRING_HAS_SYMBOL(DUK_TVAL_GET_STRING((tv))) /* Lightfunc flags packing and unpacking. */ /* Sign extend: 0x0000##00 -> 0x##000000 -> sign extend to 0xssssss##. * Avoid signed shifts due to portability limitations. */ #define DUK_LFUNC_FLAGS_GET_MAGIC(lf_flags) \ ((duk_int32_t) (duk_int8_t) (((duk_uint16_t) (lf_flags)) >> 8)) #define DUK_LFUNC_FLAGS_GET_LENGTH(lf_flags) \ (((lf_flags) >> 4) & 0x0fU) #define DUK_LFUNC_FLAGS_GET_NARGS(lf_flags) \ ((lf_flags) & 0x0fU) #define DUK_LFUNC_FLAGS_PACK(magic,length,nargs) \ ((((duk_small_uint_t) (magic)) & 0xffU) << 8) | ((length) << 4) | (nargs) #define DUK_LFUNC_NARGS_VARARGS 0x0f /* varargs marker */ #define DUK_LFUNC_NARGS_MIN 0x00 #define DUK_LFUNC_NARGS_MAX 0x0e /* max, excl. varargs marker */ #define DUK_LFUNC_LENGTH_MIN 0x00 #define DUK_LFUNC_LENGTH_MAX 0x0f #define DUK_LFUNC_MAGIC_MIN (-0x80) #define DUK_LFUNC_MAGIC_MAX 0x7f /* fastint constants etc */ #if defined(DUK_USE_FASTINT) #define DUK_FASTINT_MIN (DUK_I64_CONSTANT(-0x800000000000)) #define DUK_FASTINT_MAX (DUK_I64_CONSTANT(0x7fffffffffff)) #define DUK_FASTINT_BITS 48 DUK_INTERNAL_DECL void duk_tval_set_number_chkfast_fast(duk_tval *tv, duk_double_t x); DUK_INTERNAL_DECL void duk_tval_set_number_chkfast_slow(duk_tval *tv, duk_double_t x); #endif #endif /* DUK_TVAL_H_INCLUDED */ /* #include duk_builtins.h */ #line 1 "duk_builtins.h" /* * Automatically generated by genbuiltins.py, do not edit! */ #if !defined(DUK_BUILTINS_H_INCLUDED) #define DUK_BUILTINS_H_INCLUDED #if defined(DUK_USE_ROM_STRINGS) #error ROM support not enabled, rerun configure.py with --rom-support #else /* DUK_USE_ROM_STRINGS */ #define DUK_STRIDX_UC_UNDEFINED 0 /* 'Undefined' */ #define DUK_HEAP_STRING_UC_UNDEFINED(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_UNDEFINED) #define DUK_HTHREAD_STRING_UC_UNDEFINED(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_UNDEFINED) #define DUK_STRIDX_UC_NULL 1 /* 'Null' */ #define DUK_HEAP_STRING_UC_NULL(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_NULL) #define DUK_HTHREAD_STRING_UC_NULL(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_NULL) #define DUK_STRIDX_UC_SYMBOL 2 /* 'Symbol' */ #define DUK_HEAP_STRING_UC_SYMBOL(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_SYMBOL) #define DUK_HTHREAD_STRING_UC_SYMBOL(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_SYMBOL) #define DUK_STRIDX_UC_ARGUMENTS 3 /* 'Arguments' */ #define DUK_HEAP_STRING_UC_ARGUMENTS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_ARGUMENTS) #define DUK_HTHREAD_STRING_UC_ARGUMENTS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_ARGUMENTS) #define DUK_STRIDX_UC_OBJECT 4 /* 'Object' */ #define DUK_HEAP_STRING_UC_OBJECT(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_OBJECT) #define DUK_HTHREAD_STRING_UC_OBJECT(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_OBJECT) #define DUK_STRIDX_UC_FUNCTION 5 /* 'Function' */ #define DUK_HEAP_STRING_UC_FUNCTION(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_FUNCTION) #define DUK_HTHREAD_STRING_UC_FUNCTION(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_FUNCTION) #define DUK_STRIDX_ARRAY 6 /* 'Array' */ #define DUK_HEAP_STRING_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ARRAY) #define DUK_HTHREAD_STRING_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ARRAY) #define DUK_STRIDX_UC_STRING 7 /* 'String' */ #define DUK_HEAP_STRING_UC_STRING(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_STRING) #define DUK_HTHREAD_STRING_UC_STRING(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_STRING) #define DUK_STRIDX_UC_BOOLEAN 8 /* 'Boolean' */ #define DUK_HEAP_STRING_UC_BOOLEAN(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_BOOLEAN) #define DUK_HTHREAD_STRING_UC_BOOLEAN(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_BOOLEAN) #define DUK_STRIDX_UC_NUMBER 9 /* 'Number' */ #define DUK_HEAP_STRING_UC_NUMBER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_NUMBER) #define DUK_HTHREAD_STRING_UC_NUMBER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_NUMBER) #define DUK_STRIDX_DATE 10 /* 'Date' */ #define DUK_HEAP_STRING_DATE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DATE) #define DUK_HTHREAD_STRING_DATE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DATE) #define DUK_STRIDX_REG_EXP 11 /* 'RegExp' */ #define DUK_HEAP_STRING_REG_EXP(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_REG_EXP) #define DUK_HTHREAD_STRING_REG_EXP(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_REG_EXP) #define DUK_STRIDX_UC_ERROR 12 /* 'Error' */ #define DUK_HEAP_STRING_UC_ERROR(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_ERROR) #define DUK_HTHREAD_STRING_UC_ERROR(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_ERROR) #define DUK_STRIDX_MATH 13 /* 'Math' */ #define DUK_HEAP_STRING_MATH(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_MATH) #define DUK_HTHREAD_STRING_MATH(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_MATH) #define DUK_STRIDX_JSON 14 /* 'JSON' */ #define DUK_HEAP_STRING_JSON(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JSON) #define DUK_HTHREAD_STRING_JSON(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JSON) #define DUK_STRIDX_EMPTY_STRING 15 /* '' */ #define DUK_HEAP_STRING_EMPTY_STRING(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_EMPTY_STRING) #define DUK_HTHREAD_STRING_EMPTY_STRING(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_EMPTY_STRING) #define DUK_STRIDX_ARRAY_BUFFER 16 /* 'ArrayBuffer' */ #define DUK_HEAP_STRING_ARRAY_BUFFER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ARRAY_BUFFER) #define DUK_HTHREAD_STRING_ARRAY_BUFFER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ARRAY_BUFFER) #define DUK_STRIDX_DATA_VIEW 17 /* 'DataView' */ #define DUK_HEAP_STRING_DATA_VIEW(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DATA_VIEW) #define DUK_HTHREAD_STRING_DATA_VIEW(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DATA_VIEW) #define DUK_STRIDX_INT8_ARRAY 18 /* 'Int8Array' */ #define DUK_HEAP_STRING_INT8_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT8_ARRAY) #define DUK_HTHREAD_STRING_INT8_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT8_ARRAY) #define DUK_STRIDX_UINT8_ARRAY 19 /* 'Uint8Array' */ #define DUK_HEAP_STRING_UINT8_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UINT8_ARRAY) #define DUK_HTHREAD_STRING_UINT8_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UINT8_ARRAY) #define DUK_STRIDX_UINT8_CLAMPED_ARRAY 20 /* 'Uint8ClampedArray' */ #define DUK_HEAP_STRING_UINT8_CLAMPED_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UINT8_CLAMPED_ARRAY) #define DUK_HTHREAD_STRING_UINT8_CLAMPED_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UINT8_CLAMPED_ARRAY) #define DUK_STRIDX_INT16_ARRAY 21 /* 'Int16Array' */ #define DUK_HEAP_STRING_INT16_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT16_ARRAY) #define DUK_HTHREAD_STRING_INT16_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT16_ARRAY) #define DUK_STRIDX_UINT16_ARRAY 22 /* 'Uint16Array' */ #define DUK_HEAP_STRING_UINT16_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UINT16_ARRAY) #define DUK_HTHREAD_STRING_UINT16_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UINT16_ARRAY) #define DUK_STRIDX_INT32_ARRAY 23 /* 'Int32Array' */ #define DUK_HEAP_STRING_INT32_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT32_ARRAY) #define DUK_HTHREAD_STRING_INT32_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT32_ARRAY) #define DUK_STRIDX_UINT32_ARRAY 24 /* 'Uint32Array' */ #define DUK_HEAP_STRING_UINT32_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UINT32_ARRAY) #define DUK_HTHREAD_STRING_UINT32_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UINT32_ARRAY) #define DUK_STRIDX_FLOAT32_ARRAY 25 /* 'Float32Array' */ #define DUK_HEAP_STRING_FLOAT32_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_FLOAT32_ARRAY) #define DUK_HTHREAD_STRING_FLOAT32_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_FLOAT32_ARRAY) #define DUK_STRIDX_FLOAT64_ARRAY 26 /* 'Float64Array' */ #define DUK_HEAP_STRING_FLOAT64_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_FLOAT64_ARRAY) #define DUK_HTHREAD_STRING_FLOAT64_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_FLOAT64_ARRAY) #define DUK_STRIDX_GLOBAL 27 /* 'global' */ #define DUK_HEAP_STRING_GLOBAL(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_GLOBAL) #define DUK_HTHREAD_STRING_GLOBAL(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_GLOBAL) #define DUK_STRIDX_OBJ_ENV 28 /* 'ObjEnv' */ #define DUK_HEAP_STRING_OBJ_ENV(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_OBJ_ENV) #define DUK_HTHREAD_STRING_OBJ_ENV(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_OBJ_ENV) #define DUK_STRIDX_DEC_ENV 29 /* 'DecEnv' */ #define DUK_HEAP_STRING_DEC_ENV(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DEC_ENV) #define DUK_HTHREAD_STRING_DEC_ENV(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DEC_ENV) #define DUK_STRIDX_UC_BUFFER 30 /* 'Buffer' */ #define DUK_HEAP_STRING_UC_BUFFER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_BUFFER) #define DUK_HTHREAD_STRING_UC_BUFFER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_BUFFER) #define DUK_STRIDX_UC_POINTER 31 /* 'Pointer' */ #define DUK_HEAP_STRING_UC_POINTER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_POINTER) #define DUK_HTHREAD_STRING_UC_POINTER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_POINTER) #define DUK_STRIDX_UC_THREAD 32 /* 'Thread' */ #define DUK_HEAP_STRING_UC_THREAD(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_THREAD) #define DUK_HTHREAD_STRING_UC_THREAD(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_THREAD) #define DUK_STRIDX_EVAL 33 /* 'eval' */ #define DUK_HEAP_STRING_EVAL(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_EVAL) #define DUK_HTHREAD_STRING_EVAL(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_EVAL) #define DUK_STRIDX_VALUE 34 /* 'value' */ #define DUK_HEAP_STRING_VALUE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_VALUE) #define DUK_HTHREAD_STRING_VALUE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_VALUE) #define DUK_STRIDX_WRITABLE 35 /* 'writable' */ #define DUK_HEAP_STRING_WRITABLE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_WRITABLE) #define DUK_HTHREAD_STRING_WRITABLE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_WRITABLE) #define DUK_STRIDX_CONFIGURABLE 36 /* 'configurable' */ #define DUK_HEAP_STRING_CONFIGURABLE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CONFIGURABLE) #define DUK_HTHREAD_STRING_CONFIGURABLE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CONFIGURABLE) #define DUK_STRIDX_ENUMERABLE 37 /* 'enumerable' */ #define DUK_HEAP_STRING_ENUMERABLE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ENUMERABLE) #define DUK_HTHREAD_STRING_ENUMERABLE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ENUMERABLE) #define DUK_STRIDX_JOIN 38 /* 'join' */ #define DUK_HEAP_STRING_JOIN(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JOIN) #define DUK_HTHREAD_STRING_JOIN(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JOIN) #define DUK_STRIDX_TO_LOCALE_STRING 39 /* 'toLocaleString' */ #define DUK_HEAP_STRING_TO_LOCALE_STRING(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TO_LOCALE_STRING) #define DUK_HTHREAD_STRING_TO_LOCALE_STRING(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TO_LOCALE_STRING) #define DUK_STRIDX_VALUE_OF 40 /* 'valueOf' */ #define DUK_HEAP_STRING_VALUE_OF(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_VALUE_OF) #define DUK_HTHREAD_STRING_VALUE_OF(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_VALUE_OF) #define DUK_STRIDX_TO_UTC_STRING 41 /* 'toUTCString' */ #define DUK_HEAP_STRING_TO_UTC_STRING(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TO_UTC_STRING) #define DUK_HTHREAD_STRING_TO_UTC_STRING(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TO_UTC_STRING) #define DUK_STRIDX_TO_ISO_STRING 42 /* 'toISOString' */ #define DUK_HEAP_STRING_TO_ISO_STRING(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TO_ISO_STRING) #define DUK_HTHREAD_STRING_TO_ISO_STRING(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TO_ISO_STRING) #define DUK_STRIDX_TO_GMT_STRING 43 /* 'toGMTString' */ #define DUK_HEAP_STRING_TO_GMT_STRING(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TO_GMT_STRING) #define DUK_HTHREAD_STRING_TO_GMT_STRING(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TO_GMT_STRING) #define DUK_STRIDX_SOURCE 44 /* 'source' */ #define DUK_HEAP_STRING_SOURCE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_SOURCE) #define DUK_HTHREAD_STRING_SOURCE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_SOURCE) #define DUK_STRIDX_IGNORE_CASE 45 /* 'ignoreCase' */ #define DUK_HEAP_STRING_IGNORE_CASE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_IGNORE_CASE) #define DUK_HTHREAD_STRING_IGNORE_CASE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_IGNORE_CASE) #define DUK_STRIDX_MULTILINE 46 /* 'multiline' */ #define DUK_HEAP_STRING_MULTILINE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_MULTILINE) #define DUK_HTHREAD_STRING_MULTILINE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_MULTILINE) #define DUK_STRIDX_LAST_INDEX 47 /* 'lastIndex' */ #define DUK_HEAP_STRING_LAST_INDEX(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LAST_INDEX) #define DUK_HTHREAD_STRING_LAST_INDEX(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LAST_INDEX) #define DUK_STRIDX_FLAGS 48 /* 'flags' */ #define DUK_HEAP_STRING_FLAGS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_FLAGS) #define DUK_HTHREAD_STRING_FLAGS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_FLAGS) #define DUK_STRIDX_INDEX 49 /* 'index' */ #define DUK_HEAP_STRING_INDEX(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INDEX) #define DUK_HTHREAD_STRING_INDEX(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INDEX) #define DUK_STRIDX_PROTOTYPE 50 /* 'prototype' */ #define DUK_HEAP_STRING_PROTOTYPE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_PROTOTYPE) #define DUK_HTHREAD_STRING_PROTOTYPE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_PROTOTYPE) #define DUK_STRIDX_CONSTRUCTOR 51 /* 'constructor' */ #define DUK_HEAP_STRING_CONSTRUCTOR(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CONSTRUCTOR) #define DUK_HTHREAD_STRING_CONSTRUCTOR(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CONSTRUCTOR) #define DUK_STRIDX_MESSAGE 52 /* 'message' */ #define DUK_HEAP_STRING_MESSAGE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_MESSAGE) #define DUK_HTHREAD_STRING_MESSAGE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_MESSAGE) #define DUK_STRIDX_LC_BOOLEAN 53 /* 'boolean' */ #define DUK_HEAP_STRING_LC_BOOLEAN(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_BOOLEAN) #define DUK_HTHREAD_STRING_LC_BOOLEAN(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_BOOLEAN) #define DUK_STRIDX_LC_NUMBER 54 /* 'number' */ #define DUK_HEAP_STRING_LC_NUMBER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_NUMBER) #define DUK_HTHREAD_STRING_LC_NUMBER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_NUMBER) #define DUK_STRIDX_LC_STRING 55 /* 'string' */ #define DUK_HEAP_STRING_LC_STRING(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_STRING) #define DUK_HTHREAD_STRING_LC_STRING(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_STRING) #define DUK_STRIDX_LC_SYMBOL 56 /* 'symbol' */ #define DUK_HEAP_STRING_LC_SYMBOL(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_SYMBOL) #define DUK_HTHREAD_STRING_LC_SYMBOL(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_SYMBOL) #define DUK_STRIDX_LC_OBJECT 57 /* 'object' */ #define DUK_HEAP_STRING_LC_OBJECT(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_OBJECT) #define DUK_HTHREAD_STRING_LC_OBJECT(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_OBJECT) #define DUK_STRIDX_LC_UNDEFINED 58 /* 'undefined' */ #define DUK_HEAP_STRING_LC_UNDEFINED(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_UNDEFINED) #define DUK_HTHREAD_STRING_LC_UNDEFINED(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_UNDEFINED) #define DUK_STRIDX_NAN 59 /* 'NaN' */ #define DUK_HEAP_STRING_NAN(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_NAN) #define DUK_HTHREAD_STRING_NAN(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_NAN) #define DUK_STRIDX_INFINITY 60 /* 'Infinity' */ #define DUK_HEAP_STRING_INFINITY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INFINITY) #define DUK_HTHREAD_STRING_INFINITY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INFINITY) #define DUK_STRIDX_MINUS_INFINITY 61 /* '-Infinity' */ #define DUK_HEAP_STRING_MINUS_INFINITY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_MINUS_INFINITY) #define DUK_HTHREAD_STRING_MINUS_INFINITY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_MINUS_INFINITY) #define DUK_STRIDX_MINUS_ZERO 62 /* '-0' */ #define DUK_HEAP_STRING_MINUS_ZERO(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_MINUS_ZERO) #define DUK_HTHREAD_STRING_MINUS_ZERO(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_MINUS_ZERO) #define DUK_STRIDX_COMMA 63 /* ',' */ #define DUK_HEAP_STRING_COMMA(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_COMMA) #define DUK_HTHREAD_STRING_COMMA(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_COMMA) #define DUK_STRIDX_NEWLINE_4SPACE 64 /* '\n ' */ #define DUK_HEAP_STRING_NEWLINE_4SPACE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_NEWLINE_4SPACE) #define DUK_HTHREAD_STRING_NEWLINE_4SPACE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_NEWLINE_4SPACE) #define DUK_STRIDX_BRACKETED_ELLIPSIS 65 /* '[...]' */ #define DUK_HEAP_STRING_BRACKETED_ELLIPSIS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_BRACKETED_ELLIPSIS) #define DUK_HTHREAD_STRING_BRACKETED_ELLIPSIS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_BRACKETED_ELLIPSIS) #define DUK_STRIDX_INVALID_DATE 66 /* 'Invalid Date' */ #define DUK_HEAP_STRING_INVALID_DATE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INVALID_DATE) #define DUK_HTHREAD_STRING_INVALID_DATE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INVALID_DATE) #define DUK_STRIDX_LC_ARGUMENTS 67 /* 'arguments' */ #define DUK_HEAP_STRING_LC_ARGUMENTS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_ARGUMENTS) #define DUK_HTHREAD_STRING_LC_ARGUMENTS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_ARGUMENTS) #define DUK_STRIDX_CALLEE 68 /* 'callee' */ #define DUK_HEAP_STRING_CALLEE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CALLEE) #define DUK_HTHREAD_STRING_CALLEE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CALLEE) #define DUK_STRIDX_CALLER 69 /* 'caller' */ #define DUK_HEAP_STRING_CALLER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CALLER) #define DUK_HTHREAD_STRING_CALLER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CALLER) #define DUK_STRIDX_APPLY 70 /* 'apply' */ #define DUK_HEAP_STRING_APPLY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_APPLY) #define DUK_HTHREAD_STRING_APPLY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_APPLY) #define DUK_STRIDX_CONSTRUCT 71 /* 'construct' */ #define DUK_HEAP_STRING_CONSTRUCT(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CONSTRUCT) #define DUK_HTHREAD_STRING_CONSTRUCT(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CONSTRUCT) #define DUK_STRIDX_DELETE_PROPERTY 72 /* 'deleteProperty' */ #define DUK_HEAP_STRING_DELETE_PROPERTY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DELETE_PROPERTY) #define DUK_HTHREAD_STRING_DELETE_PROPERTY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DELETE_PROPERTY) #define DUK_STRIDX_GET 73 /* 'get' */ #define DUK_HEAP_STRING_GET(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_GET) #define DUK_HTHREAD_STRING_GET(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_GET) #define DUK_STRIDX_HAS 74 /* 'has' */ #define DUK_HEAP_STRING_HAS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_HAS) #define DUK_HTHREAD_STRING_HAS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_HAS) #define DUK_STRIDX_OWN_KEYS 75 /* 'ownKeys' */ #define DUK_HEAP_STRING_OWN_KEYS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_OWN_KEYS) #define DUK_HTHREAD_STRING_OWN_KEYS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_OWN_KEYS) #define DUK_STRIDX_SET_PROTOTYPE_OF 76 /* 'setPrototypeOf' */ #define DUK_HEAP_STRING_SET_PROTOTYPE_OF(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_SET_PROTOTYPE_OF) #define DUK_HTHREAD_STRING_SET_PROTOTYPE_OF(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_SET_PROTOTYPE_OF) #define DUK_STRIDX___PROTO__ 77 /* '__proto__' */ #define DUK_HEAP_STRING___PROTO__(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX___PROTO__) #define DUK_HTHREAD_STRING___PROTO__(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX___PROTO__) #define DUK_STRIDX_TO_STRING 78 /* 'toString' */ #define DUK_HEAP_STRING_TO_STRING(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TO_STRING) #define DUK_HTHREAD_STRING_TO_STRING(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TO_STRING) #define DUK_STRIDX_TO_JSON 79 /* 'toJSON' */ #define DUK_HEAP_STRING_TO_JSON(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TO_JSON) #define DUK_HTHREAD_STRING_TO_JSON(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TO_JSON) #define DUK_STRIDX_TYPE 80 /* 'type' */ #define DUK_HEAP_STRING_TYPE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TYPE) #define DUK_HTHREAD_STRING_TYPE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TYPE) #define DUK_STRIDX_DATA 81 /* 'data' */ #define DUK_HEAP_STRING_DATA(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DATA) #define DUK_HTHREAD_STRING_DATA(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DATA) #define DUK_STRIDX_LENGTH 82 /* 'length' */ #define DUK_HEAP_STRING_LENGTH(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LENGTH) #define DUK_HTHREAD_STRING_LENGTH(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LENGTH) #define DUK_STRIDX_SET 83 /* 'set' */ #define DUK_HEAP_STRING_SET(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_SET) #define DUK_HTHREAD_STRING_SET(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_SET) #define DUK_STRIDX_STACK 84 /* 'stack' */ #define DUK_HEAP_STRING_STACK(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_STACK) #define DUK_HTHREAD_STRING_STACK(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_STACK) #define DUK_STRIDX_PC 85 /* 'pc' */ #define DUK_HEAP_STRING_PC(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_PC) #define DUK_HTHREAD_STRING_PC(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_PC) #define DUK_STRIDX_LINE_NUMBER 86 /* 'lineNumber' */ #define DUK_HEAP_STRING_LINE_NUMBER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LINE_NUMBER) #define DUK_HTHREAD_STRING_LINE_NUMBER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LINE_NUMBER) #define DUK_STRIDX_INT_TRACEDATA 87 /* '\x82Tracedata' */ #define DUK_HEAP_STRING_INT_TRACEDATA(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_TRACEDATA) #define DUK_HTHREAD_STRING_INT_TRACEDATA(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_TRACEDATA) #define DUK_STRIDX_NAME 88 /* 'name' */ #define DUK_HEAP_STRING_NAME(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_NAME) #define DUK_HTHREAD_STRING_NAME(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_NAME) #define DUK_STRIDX_FILE_NAME 89 /* 'fileName' */ #define DUK_HEAP_STRING_FILE_NAME(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_FILE_NAME) #define DUK_HTHREAD_STRING_FILE_NAME(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_FILE_NAME) #define DUK_STRIDX_LC_POINTER 90 /* 'pointer' */ #define DUK_HEAP_STRING_LC_POINTER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_POINTER) #define DUK_HTHREAD_STRING_LC_POINTER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_POINTER) #define DUK_STRIDX_INT_TARGET 91 /* '\x82Target' */ #define DUK_HEAP_STRING_INT_TARGET(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_TARGET) #define DUK_HTHREAD_STRING_INT_TARGET(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_TARGET) #define DUK_STRIDX_INT_NEXT 92 /* '\x82Next' */ #define DUK_HEAP_STRING_INT_NEXT(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_NEXT) #define DUK_HTHREAD_STRING_INT_NEXT(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_NEXT) #define DUK_STRIDX_INT_BYTECODE 93 /* '\x82Bytecode' */ #define DUK_HEAP_STRING_INT_BYTECODE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_BYTECODE) #define DUK_HTHREAD_STRING_INT_BYTECODE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_BYTECODE) #define DUK_STRIDX_INT_FORMALS 94 /* '\x82Formals' */ #define DUK_HEAP_STRING_INT_FORMALS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_FORMALS) #define DUK_HTHREAD_STRING_INT_FORMALS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_FORMALS) #define DUK_STRIDX_INT_VARMAP 95 /* '\x82Varmap' */ #define DUK_HEAP_STRING_INT_VARMAP(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_VARMAP) #define DUK_HTHREAD_STRING_INT_VARMAP(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_VARMAP) #define DUK_STRIDX_INT_SOURCE 96 /* '\x82Source' */ #define DUK_HEAP_STRING_INT_SOURCE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_SOURCE) #define DUK_HTHREAD_STRING_INT_SOURCE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_SOURCE) #define DUK_STRIDX_INT_PC2LINE 97 /* '\x82Pc2line' */ #define DUK_HEAP_STRING_INT_PC2LINE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_PC2LINE) #define DUK_HTHREAD_STRING_INT_PC2LINE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_PC2LINE) #define DUK_STRIDX_INT_MAP 98 /* '\x82Map' */ #define DUK_HEAP_STRING_INT_MAP(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_MAP) #define DUK_HTHREAD_STRING_INT_MAP(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_MAP) #define DUK_STRIDX_INT_VARENV 99 /* '\x82Varenv' */ #define DUK_HEAP_STRING_INT_VARENV(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_VARENV) #define DUK_HTHREAD_STRING_INT_VARENV(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_VARENV) #define DUK_STRIDX_INT_FINALIZER 100 /* '\x82Finalizer' */ #define DUK_HEAP_STRING_INT_FINALIZER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_FINALIZER) #define DUK_HTHREAD_STRING_INT_FINALIZER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_FINALIZER) #define DUK_STRIDX_INT_VALUE 101 /* '\x82Value' */ #define DUK_HEAP_STRING_INT_VALUE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_VALUE) #define DUK_HTHREAD_STRING_INT_VALUE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_VALUE) #define DUK_STRIDX_COMPILE 102 /* 'compile' */ #define DUK_HEAP_STRING_COMPILE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_COMPILE) #define DUK_HTHREAD_STRING_COMPILE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_COMPILE) #define DUK_STRIDX_INPUT 103 /* 'input' */ #define DUK_HEAP_STRING_INPUT(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INPUT) #define DUK_HTHREAD_STRING_INPUT(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INPUT) #define DUK_STRIDX_ERR_CREATE 104 /* 'errCreate' */ #define DUK_HEAP_STRING_ERR_CREATE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ERR_CREATE) #define DUK_HTHREAD_STRING_ERR_CREATE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ERR_CREATE) #define DUK_STRIDX_ERR_THROW 105 /* 'errThrow' */ #define DUK_HEAP_STRING_ERR_THROW(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ERR_THROW) #define DUK_HTHREAD_STRING_ERR_THROW(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ERR_THROW) #define DUK_STRIDX_ENV 106 /* 'env' */ #define DUK_HEAP_STRING_ENV(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ENV) #define DUK_HTHREAD_STRING_ENV(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ENV) #define DUK_STRIDX_HEX 107 /* 'hex' */ #define DUK_HEAP_STRING_HEX(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_HEX) #define DUK_HTHREAD_STRING_HEX(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_HEX) #define DUK_STRIDX_BASE64 108 /* 'base64' */ #define DUK_HEAP_STRING_BASE64(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_BASE64) #define DUK_HTHREAD_STRING_BASE64(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_BASE64) #define DUK_STRIDX_JX 109 /* 'jx' */ #define DUK_HEAP_STRING_JX(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JX) #define DUK_HTHREAD_STRING_JX(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JX) #define DUK_STRIDX_JC 110 /* 'jc' */ #define DUK_HEAP_STRING_JC(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JC) #define DUK_HTHREAD_STRING_JC(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JC) #define DUK_STRIDX_JSON_EXT_UNDEFINED 111 /* '{"_undef":true}' */ #define DUK_HEAP_STRING_JSON_EXT_UNDEFINED(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JSON_EXT_UNDEFINED) #define DUK_HTHREAD_STRING_JSON_EXT_UNDEFINED(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JSON_EXT_UNDEFINED) #define DUK_STRIDX_JSON_EXT_NAN 112 /* '{"_nan":true}' */ #define DUK_HEAP_STRING_JSON_EXT_NAN(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JSON_EXT_NAN) #define DUK_HTHREAD_STRING_JSON_EXT_NAN(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JSON_EXT_NAN) #define DUK_STRIDX_JSON_EXT_POSINF 113 /* '{"_inf":true}' */ #define DUK_HEAP_STRING_JSON_EXT_POSINF(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JSON_EXT_POSINF) #define DUK_HTHREAD_STRING_JSON_EXT_POSINF(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JSON_EXT_POSINF) #define DUK_STRIDX_JSON_EXT_NEGINF 114 /* '{"_ninf":true}' */ #define DUK_HEAP_STRING_JSON_EXT_NEGINF(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JSON_EXT_NEGINF) #define DUK_HTHREAD_STRING_JSON_EXT_NEGINF(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JSON_EXT_NEGINF) #define DUK_STRIDX_JSON_EXT_FUNCTION1 115 /* '{"_func":true}' */ #define DUK_HEAP_STRING_JSON_EXT_FUNCTION1(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JSON_EXT_FUNCTION1) #define DUK_HTHREAD_STRING_JSON_EXT_FUNCTION1(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JSON_EXT_FUNCTION1) #define DUK_STRIDX_JSON_EXT_FUNCTION2 116 /* '{_func:true}' */ #define DUK_HEAP_STRING_JSON_EXT_FUNCTION2(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JSON_EXT_FUNCTION2) #define DUK_HTHREAD_STRING_JSON_EXT_FUNCTION2(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JSON_EXT_FUNCTION2) #define DUK_STRIDX_BREAK 117 /* 'break' */ #define DUK_HEAP_STRING_BREAK(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_BREAK) #define DUK_HTHREAD_STRING_BREAK(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_BREAK) #define DUK_STRIDX_CASE 118 /* 'case' */ #define DUK_HEAP_STRING_CASE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CASE) #define DUK_HTHREAD_STRING_CASE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CASE) #define DUK_STRIDX_CATCH 119 /* 'catch' */ #define DUK_HEAP_STRING_CATCH(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CATCH) #define DUK_HTHREAD_STRING_CATCH(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CATCH) #define DUK_STRIDX_CONTINUE 120 /* 'continue' */ #define DUK_HEAP_STRING_CONTINUE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CONTINUE) #define DUK_HTHREAD_STRING_CONTINUE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CONTINUE) #define DUK_STRIDX_DEBUGGER 121 /* 'debugger' */ #define DUK_HEAP_STRING_DEBUGGER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DEBUGGER) #define DUK_HTHREAD_STRING_DEBUGGER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DEBUGGER) #define DUK_STRIDX_DEFAULT 122 /* 'default' */ #define DUK_HEAP_STRING_DEFAULT(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DEFAULT) #define DUK_HTHREAD_STRING_DEFAULT(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DEFAULT) #define DUK_STRIDX_DELETE 123 /* 'delete' */ #define DUK_HEAP_STRING_DELETE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DELETE) #define DUK_HTHREAD_STRING_DELETE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DELETE) #define DUK_STRIDX_DO 124 /* 'do' */ #define DUK_HEAP_STRING_DO(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DO) #define DUK_HTHREAD_STRING_DO(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DO) #define DUK_STRIDX_ELSE 125 /* 'else' */ #define DUK_HEAP_STRING_ELSE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ELSE) #define DUK_HTHREAD_STRING_ELSE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ELSE) #define DUK_STRIDX_FINALLY 126 /* 'finally' */ #define DUK_HEAP_STRING_FINALLY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_FINALLY) #define DUK_HTHREAD_STRING_FINALLY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_FINALLY) #define DUK_STRIDX_FOR 127 /* 'for' */ #define DUK_HEAP_STRING_FOR(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_FOR) #define DUK_HTHREAD_STRING_FOR(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_FOR) #define DUK_STRIDX_LC_FUNCTION 128 /* 'function' */ #define DUK_HEAP_STRING_LC_FUNCTION(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_FUNCTION) #define DUK_HTHREAD_STRING_LC_FUNCTION(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_FUNCTION) #define DUK_STRIDX_IF 129 /* 'if' */ #define DUK_HEAP_STRING_IF(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_IF) #define DUK_HTHREAD_STRING_IF(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_IF) #define DUK_STRIDX_IN 130 /* 'in' */ #define DUK_HEAP_STRING_IN(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_IN) #define DUK_HTHREAD_STRING_IN(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_IN) #define DUK_STRIDX_INSTANCEOF 131 /* 'instanceof' */ #define DUK_HEAP_STRING_INSTANCEOF(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INSTANCEOF) #define DUK_HTHREAD_STRING_INSTANCEOF(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INSTANCEOF) #define DUK_STRIDX_NEW 132 /* 'new' */ #define DUK_HEAP_STRING_NEW(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_NEW) #define DUK_HTHREAD_STRING_NEW(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_NEW) #define DUK_STRIDX_RETURN 133 /* 'return' */ #define DUK_HEAP_STRING_RETURN(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_RETURN) #define DUK_HTHREAD_STRING_RETURN(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_RETURN) #define DUK_STRIDX_SWITCH 134 /* 'switch' */ #define DUK_HEAP_STRING_SWITCH(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_SWITCH) #define DUK_HTHREAD_STRING_SWITCH(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_SWITCH) #define DUK_STRIDX_THIS 135 /* 'this' */ #define DUK_HEAP_STRING_THIS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_THIS) #define DUK_HTHREAD_STRING_THIS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_THIS) #define DUK_STRIDX_THROW 136 /* 'throw' */ #define DUK_HEAP_STRING_THROW(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_THROW) #define DUK_HTHREAD_STRING_THROW(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_THROW) #define DUK_STRIDX_TRY 137 /* 'try' */ #define DUK_HEAP_STRING_TRY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TRY) #define DUK_HTHREAD_STRING_TRY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TRY) #define DUK_STRIDX_TYPEOF 138 /* 'typeof' */ #define DUK_HEAP_STRING_TYPEOF(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TYPEOF) #define DUK_HTHREAD_STRING_TYPEOF(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TYPEOF) #define DUK_STRIDX_VAR 139 /* 'var' */ #define DUK_HEAP_STRING_VAR(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_VAR) #define DUK_HTHREAD_STRING_VAR(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_VAR) #define DUK_STRIDX_CONST 140 /* 'const' */ #define DUK_HEAP_STRING_CONST(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CONST) #define DUK_HTHREAD_STRING_CONST(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CONST) #define DUK_STRIDX_VOID 141 /* 'void' */ #define DUK_HEAP_STRING_VOID(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_VOID) #define DUK_HTHREAD_STRING_VOID(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_VOID) #define DUK_STRIDX_WHILE 142 /* 'while' */ #define DUK_HEAP_STRING_WHILE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_WHILE) #define DUK_HTHREAD_STRING_WHILE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_WHILE) #define DUK_STRIDX_WITH 143 /* 'with' */ #define DUK_HEAP_STRING_WITH(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_WITH) #define DUK_HTHREAD_STRING_WITH(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_WITH) #define DUK_STRIDX_CLASS 144 /* 'class' */ #define DUK_HEAP_STRING_CLASS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CLASS) #define DUK_HTHREAD_STRING_CLASS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CLASS) #define DUK_STRIDX_ENUM 145 /* 'enum' */ #define DUK_HEAP_STRING_ENUM(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ENUM) #define DUK_HTHREAD_STRING_ENUM(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ENUM) #define DUK_STRIDX_EXPORT 146 /* 'export' */ #define DUK_HEAP_STRING_EXPORT(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_EXPORT) #define DUK_HTHREAD_STRING_EXPORT(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_EXPORT) #define DUK_STRIDX_EXTENDS 147 /* 'extends' */ #define DUK_HEAP_STRING_EXTENDS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_EXTENDS) #define DUK_HTHREAD_STRING_EXTENDS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_EXTENDS) #define DUK_STRIDX_IMPORT 148 /* 'import' */ #define DUK_HEAP_STRING_IMPORT(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_IMPORT) #define DUK_HTHREAD_STRING_IMPORT(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_IMPORT) #define DUK_STRIDX_SUPER 149 /* 'super' */ #define DUK_HEAP_STRING_SUPER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_SUPER) #define DUK_HTHREAD_STRING_SUPER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_SUPER) #define DUK_STRIDX_LC_NULL 150 /* 'null' */ #define DUK_HEAP_STRING_LC_NULL(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_NULL) #define DUK_HTHREAD_STRING_LC_NULL(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_NULL) #define DUK_STRIDX_TRUE 151 /* 'true' */ #define DUK_HEAP_STRING_TRUE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TRUE) #define DUK_HTHREAD_STRING_TRUE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TRUE) #define DUK_STRIDX_FALSE 152 /* 'false' */ #define DUK_HEAP_STRING_FALSE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_FALSE) #define DUK_HTHREAD_STRING_FALSE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_FALSE) #define DUK_STRIDX_IMPLEMENTS 153 /* 'implements' */ #define DUK_HEAP_STRING_IMPLEMENTS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_IMPLEMENTS) #define DUK_HTHREAD_STRING_IMPLEMENTS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_IMPLEMENTS) #define DUK_STRIDX_INTERFACE 154 /* 'interface' */ #define DUK_HEAP_STRING_INTERFACE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INTERFACE) #define DUK_HTHREAD_STRING_INTERFACE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INTERFACE) #define DUK_STRIDX_LET 155 /* 'let' */ #define DUK_HEAP_STRING_LET(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LET) #define DUK_HTHREAD_STRING_LET(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LET) #define DUK_STRIDX_PACKAGE 156 /* 'package' */ #define DUK_HEAP_STRING_PACKAGE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_PACKAGE) #define DUK_HTHREAD_STRING_PACKAGE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_PACKAGE) #define DUK_STRIDX_PRIVATE 157 /* 'private' */ #define DUK_HEAP_STRING_PRIVATE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_PRIVATE) #define DUK_HTHREAD_STRING_PRIVATE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_PRIVATE) #define DUK_STRIDX_PROTECTED 158 /* 'protected' */ #define DUK_HEAP_STRING_PROTECTED(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_PROTECTED) #define DUK_HTHREAD_STRING_PROTECTED(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_PROTECTED) #define DUK_STRIDX_PUBLIC 159 /* 'public' */ #define DUK_HEAP_STRING_PUBLIC(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_PUBLIC) #define DUK_HTHREAD_STRING_PUBLIC(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_PUBLIC) #define DUK_STRIDX_STATIC 160 /* 'static' */ #define DUK_HEAP_STRING_STATIC(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_STATIC) #define DUK_HTHREAD_STRING_STATIC(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_STATIC) #define DUK_STRIDX_YIELD 161 /* 'yield' */ #define DUK_HEAP_STRING_YIELD(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_YIELD) #define DUK_HTHREAD_STRING_YIELD(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_YIELD) #define DUK_HEAP_NUM_STRINGS 162 #define DUK_STRIDX_START_RESERVED 117 #define DUK_STRIDX_START_STRICT_RESERVED 153 #define DUK_STRIDX_END_RESERVED 162 /* exclusive endpoint */ /* To convert a heap stridx to a token number, subtract * DUK_STRIDX_START_RESERVED and add DUK_TOK_START_RESERVED. */ #if !defined(DUK_SINGLE_FILE) DUK_INTERNAL_DECL const duk_uint8_t duk_strings_data[892]; #endif /* !DUK_SINGLE_FILE */ #define DUK_STRDATA_MAX_STRLEN 17 #define DUK_STRDATA_DATA_LENGTH 892 #endif /* DUK_USE_ROM_STRINGS */ #if defined(DUK_USE_ROM_OBJECTS) #error RAM support not enabled, rerun configure.py with --ram-support #else /* DUK_USE_ROM_OBJECTS */ DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_function_constructor(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_function_prototype(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_array_constructor(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_string_constructor(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_boolean_constructor(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_number_constructor(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_date_constructor(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_regexp_constructor(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_error_constructor_shared(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_type_error_thrower(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_thread_constructor(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_pointer_constructor(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_proxy_constructor(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_arraybuffer_constructor(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_dataview_constructor(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_typedarray_constructor(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_constructor(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_textencoder_constructor(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_textdecoder_constructor(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_eval(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_parse_int(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_parse_float(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_is_nan(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_is_finite(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_decode_uri(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_decode_uri_component(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_encode_uri(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_encode_uri_component(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_escape(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_unescape(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_object_getprototype_shared(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_object_setprototype_shared(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_get_own_property_descriptor(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_keys_shared(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_assign(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_create(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_define_property(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_define_properties(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_seal_freeze_shared(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_prevent_extensions(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_is_sealed_frozen_shared(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_is_extensible(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_is(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_to_string(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_to_locale_string(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_value_of(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_has_own_property(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_is_prototype_of(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_property_is_enumerable(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_defineaccessor(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_lookupaccessor(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_function_prototype_to_string(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_function_prototype_apply(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_function_prototype_call(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_function_prototype_bind(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_native_function_length(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_native_function_name(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_array_constructor_is_array(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_to_string(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_join_shared(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_concat(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_pop(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_push(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_reverse(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_shift(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_slice(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_sort(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_splice(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_unshift(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_indexof_shared(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_iter_shared(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_reduce_shared(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_string_constructor_from_char_code(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_string_constructor_from_code_point(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_to_string(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_char_at(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_char_code_at(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_concat(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_indexof_shared(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_locale_compare(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_match(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_replace(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_search(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_slice(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_split(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_substring(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_caseconv_shared(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_trim(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_repeat(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_startswith_endswith(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_includes(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_substr(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_boolean_prototype_tostring_shared(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_number_prototype_to_string(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_number_prototype_to_locale_string(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_number_prototype_value_of(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_number_prototype_to_fixed(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_number_prototype_to_exponential(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_number_prototype_to_precision(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_date_constructor_parse(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_date_constructor_utc(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_date_constructor_now(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_date_prototype_tostring_shared(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_date_prototype_to_json(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_date_prototype_value_of(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_date_prototype_get_shared(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_date_prototype_get_timezone_offset(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_date_prototype_set_time(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_date_prototype_set_shared(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_regexp_prototype_exec(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_regexp_prototype_test(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_regexp_prototype_tostring(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_regexp_prototype_flags(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_regexp_prototype_shared_getter(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_error_prototype_stack_getter(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_error_prototype_stack_setter(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_error_prototype_filename_getter(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_error_prototype_filename_setter(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_error_prototype_linenumber_getter(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_error_prototype_linenumber_setter(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_error_prototype_to_string(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_onearg_shared(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_twoarg_shared(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_clz32(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_hypot(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_imul(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_max(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_min(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_random(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_sign(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_json_object_parse(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_json_object_stringify(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_duktape_object_info(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_duktape_object_act(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_duktape_object_gc(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_duktape_object_fin(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_duktape_object_enc(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_duktape_object_dec(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_duktape_object_compact(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_thread_yield(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_thread_resume(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_thread_current(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_pointer_prototype_tostring_shared(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_reflect_apply(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_reflect_construct(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_reflect_object_delete_property(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_reflect_object_get(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_reflect_object_has(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_reflect_object_set(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_arraybuffer_isview(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_typedarray_bytelength_getter(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_buffer_slice_shared(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_typedarray_byteoffset_getter(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_typedarray_buffer_getter(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_buffer_readfield(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_buffer_writefield(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_typedarray_set(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_uint8array_allocplain(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_uint8array_plainof(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_concat(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_is_encoding(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_is_buffer(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_byte_length(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_buffer_compare_shared(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_tostring(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_tojson(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_fill(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_copy(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_write(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_textencoder_prototype_encoding_getter(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_textencoder_prototype_encode(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_textdecoder_prototype_shared_getter(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_textdecoder_prototype_decode(duk_context *ctx); DUK_INTERNAL_DECL duk_ret_t duk_bi_performance_now(duk_context *ctx); #if !defined(DUK_SINGLE_FILE) DUK_INTERNAL_DECL const duk_c_function duk_bi_native_functions[176]; #endif /* !DUK_SINGLE_FILE */ #define DUK_BIDX_GLOBAL 0 #define DUK_BIDX_GLOBAL_ENV 1 #define DUK_BIDX_OBJECT_CONSTRUCTOR 2 #define DUK_BIDX_OBJECT_PROTOTYPE 3 #define DUK_BIDX_FUNCTION_CONSTRUCTOR 4 #define DUK_BIDX_FUNCTION_PROTOTYPE 5 #define DUK_BIDX_NATIVE_FUNCTION_PROTOTYPE 6 #define DUK_BIDX_ARRAY_CONSTRUCTOR 7 #define DUK_BIDX_ARRAY_PROTOTYPE 8 #define DUK_BIDX_STRING_CONSTRUCTOR 9 #define DUK_BIDX_STRING_PROTOTYPE 10 #define DUK_BIDX_BOOLEAN_CONSTRUCTOR 11 #define DUK_BIDX_BOOLEAN_PROTOTYPE 12 #define DUK_BIDX_NUMBER_CONSTRUCTOR 13 #define DUK_BIDX_NUMBER_PROTOTYPE 14 #define DUK_BIDX_DATE_CONSTRUCTOR 15 #define DUK_BIDX_DATE_PROTOTYPE 16 #define DUK_BIDX_REGEXP_CONSTRUCTOR 17 #define DUK_BIDX_REGEXP_PROTOTYPE 18 #define DUK_BIDX_ERROR_CONSTRUCTOR 19 #define DUK_BIDX_ERROR_PROTOTYPE 20 #define DUK_BIDX_EVAL_ERROR_CONSTRUCTOR 21 #define DUK_BIDX_EVAL_ERROR_PROTOTYPE 22 #define DUK_BIDX_RANGE_ERROR_CONSTRUCTOR 23 #define DUK_BIDX_RANGE_ERROR_PROTOTYPE 24 #define DUK_BIDX_REFERENCE_ERROR_CONSTRUCTOR 25 #define DUK_BIDX_REFERENCE_ERROR_PROTOTYPE 26 #define DUK_BIDX_SYNTAX_ERROR_CONSTRUCTOR 27 #define DUK_BIDX_SYNTAX_ERROR_PROTOTYPE 28 #define DUK_BIDX_TYPE_ERROR_CONSTRUCTOR 29 #define DUK_BIDX_TYPE_ERROR_PROTOTYPE 30 #define DUK_BIDX_URI_ERROR_CONSTRUCTOR 31 #define DUK_BIDX_URI_ERROR_PROTOTYPE 32 #define DUK_BIDX_TYPE_ERROR_THROWER 33 #define DUK_BIDX_DUKTAPE 34 #define DUK_BIDX_THREAD_PROTOTYPE 35 #define DUK_BIDX_POINTER_PROTOTYPE 36 #define DUK_BIDX_DOUBLE_ERROR 37 #define DUK_BIDX_SYMBOL_PROTOTYPE 38 #define DUK_BIDX_ARRAYBUFFER_PROTOTYPE 39 #define DUK_BIDX_DATAVIEW_PROTOTYPE 40 #define DUK_BIDX_INT8ARRAY_PROTOTYPE 41 #define DUK_BIDX_UINT8ARRAY_PROTOTYPE 42 #define DUK_BIDX_UINT8CLAMPEDARRAY_PROTOTYPE 43 #define DUK_BIDX_INT16ARRAY_PROTOTYPE 44 #define DUK_BIDX_UINT16ARRAY_PROTOTYPE 45 #define DUK_BIDX_INT32ARRAY_PROTOTYPE 46 #define DUK_BIDX_UINT32ARRAY_PROTOTYPE 47 #define DUK_BIDX_FLOAT32ARRAY_PROTOTYPE 48 #define DUK_BIDX_FLOAT64ARRAY_PROTOTYPE 49 #define DUK_BIDX_NODEJS_BUFFER_PROTOTYPE 50 #define DUK_NUM_BUILTINS 51 #define DUK_NUM_BIDX_BUILTINS 51 #define DUK_NUM_ALL_BUILTINS 76 #if defined(DUK_USE_DOUBLE_LE) #if !defined(DUK_SINGLE_FILE) DUK_INTERNAL_DECL const duk_uint8_t duk_builtins_data[3972]; #endif /* !DUK_SINGLE_FILE */ #define DUK_BUILTINS_DATA_LENGTH 3972 #elif defined(DUK_USE_DOUBLE_BE) #if !defined(DUK_SINGLE_FILE) DUK_INTERNAL_DECL const duk_uint8_t duk_builtins_data[3972]; #endif /* !DUK_SINGLE_FILE */ #define DUK_BUILTINS_DATA_LENGTH 3972 #elif defined(DUK_USE_DOUBLE_ME) #if !defined(DUK_SINGLE_FILE) DUK_INTERNAL_DECL const duk_uint8_t duk_builtins_data[3972]; #endif /* !DUK_SINGLE_FILE */ #define DUK_BUILTINS_DATA_LENGTH 3972 #else #error invalid endianness defines #endif #endif /* DUK_USE_ROM_OBJECTS */ #endif /* DUK_BUILTINS_H_INCLUDED */ #line 51 "duk_internal.h" /* #include duk_util.h */ #line 1 "duk_util.h" /* * Utilities */ #if !defined(DUK_UTIL_H_INCLUDED) #define DUK_UTIL_H_INCLUDED #if defined(DUK_USE_GET_RANDOM_DOUBLE) #define DUK_UTIL_GET_RANDOM_DOUBLE(thr) DUK_USE_GET_RANDOM_DOUBLE((thr)->heap_udata) #else #define DUK_UTIL_GET_RANDOM_DOUBLE(thr) duk_util_tinyrandom_get_double(thr) #endif /* * Some useful constants */ #define DUK_DOUBLE_2TO32 4294967296.0 #define DUK_DOUBLE_2TO31 2147483648.0 #define DUK_DOUBLE_LOG2E 1.4426950408889634 #define DUK_DOUBLE_LOG10E 0.4342944819032518 /* * Endian conversion */ #if defined(DUK_USE_INTEGER_LE) #define DUK_HTON32(x) DUK_BSWAP32((x)) #define DUK_NTOH32(x) DUK_BSWAP32((x)) #define DUK_HTON16(x) DUK_BSWAP16((x)) #define DUK_NTOH16(x) DUK_BSWAP16((x)) #elif defined(DUK_USE_INTEGER_BE) #define DUK_HTON32(x) (x) #define DUK_NTOH32(x) (x) #define DUK_HTON16(x) (x) #define DUK_NTOH16(x) (x) #else #error internal error, endianness defines broken #endif /* * Bitstream decoder */ struct duk_bitdecoder_ctx { const duk_uint8_t *data; duk_size_t offset; duk_size_t length; duk_uint32_t currval; duk_small_int_t currbits; }; #define DUK_BD_BITPACKED_STRING_MAXLEN 256 /* * Bitstream encoder */ struct duk_bitencoder_ctx { duk_uint8_t *data; duk_size_t offset; duk_size_t length; duk_uint32_t currval; duk_small_int_t currbits; duk_small_int_t truncated; }; /* * Raw write/read macros for big endian, unaligned basic values. * Caller ensures there's enough space. The macros update the pointer * argument automatically on resizes. The idiom seems a bit odd, but * leads to compact code. */ #define DUK_RAW_WRITE_U8(ptr,val) do { \ *(ptr)++ = (duk_uint8_t) (val); \ } while (0) #define DUK_RAW_WRITE_U16_BE(ptr,val) duk_raw_write_u16_be(&(ptr), (duk_uint16_t) (val)) #define DUK_RAW_WRITE_U32_BE(ptr,val) duk_raw_write_u32_be(&(ptr), (duk_uint32_t) (val)) #define DUK_RAW_WRITE_DOUBLE_BE(ptr,val) duk_raw_write_double_be(&(ptr), (duk_double_t) (val)) #define DUK_RAW_WRITE_XUTF8(ptr,val) do { \ /* 'ptr' is evaluated both as LHS and RHS. */ \ duk_uint8_t *duk__ptr; \ duk_small_int_t duk__len; \ duk__ptr = (duk_uint8_t *) (ptr); \ duk__len = duk_unicode_encode_xutf8((duk_ucodepoint_t) (val), duk__ptr); \ duk__ptr += duk__len; \ (ptr) = duk__ptr; \ } while (0) #define DUK_RAW_WRITE_CESU8(ptr,val) do { \ /* 'ptr' is evaluated both as LHS and RHS. */ \ duk_uint8_t *duk__ptr; \ duk_small_int_t duk__len; \ duk__ptr = (duk_uint8_t *) (ptr); \ duk__len = duk_unicode_encode_cesu8((duk_ucodepoint_t) (val), duk__ptr); \ duk__ptr += duk__len; \ (ptr) = duk__ptr; \ } while (0) #define DUK_RAW_READ_U8(ptr) ((duk_uint8_t) (*(ptr)++)) #define DUK_RAW_READ_U16_BE(ptr) duk_raw_read_u16_be(&(ptr)); #define DUK_RAW_READ_U32_BE(ptr) duk_raw_read_u32_be(&(ptr)); #define DUK_RAW_READ_DOUBLE_BE(ptr) duk_raw_read_double_be(&(ptr)); /* * Buffer writer (dynamic buffer only) * * Helper for writing to a dynamic buffer with a concept of a "slack" area * to reduce resizes. You can ensure there is enough space beforehand and * then write for a while without further checks, relying on a stable data * pointer. Slack handling is automatic so call sites only indicate how * much data they need right now. * * There are several ways to write using bufwriter. The best approach * depends mainly on how much performance matters over code footprint. * The key issues are (1) ensuring there is space and (2) keeping the * pointers consistent. Fast code should ensure space for multiple writes * with one ensure call. Fastest inner loop code can temporarily borrow * the 'p' pointer but must write it back eventually. * * Be careful to ensure all macro arguments (other than static pointers like * 'thr' and 'bw_ctx') are evaluated exactly once, using temporaries if * necessary (if that's not possible, there should be a note near the macro). * Buffer write arguments often contain arithmetic etc so this is * particularly important here. */ /* XXX: Migrate bufwriter and other read/write helpers to its own header? */ struct duk_bufwriter_ctx { duk_uint8_t *p; duk_uint8_t *p_base; duk_uint8_t *p_limit; duk_hbuffer_dynamic *buf; }; #if defined(DUK_USE_PREFER_SIZE) #define DUK_BW_SLACK_ADD 64 #define DUK_BW_SLACK_SHIFT 4 /* 2^4 -> 1/16 = 6.25% slack */ #else #define DUK_BW_SLACK_ADD 64 #define DUK_BW_SLACK_SHIFT 2 /* 2^2 -> 1/4 = 25% slack */ #endif /* Initialization and finalization (compaction), converting to other types. */ #define DUK_BW_INIT_PUSHBUF(thr,bw_ctx,sz) do { \ duk_bw_init_pushbuf((thr), (bw_ctx), (sz)); \ } while (0) #define DUK_BW_INIT_WITHBUF(thr,bw_ctx,buf) do { \ duk_bw_init((thr), (bw_ctx), (buf)); \ } while (0) #define DUK_BW_COMPACT(thr,bw_ctx) do { \ /* Make underlying buffer compact to match DUK_BW_GET_SIZE(). */ \ duk_bw_compact((thr), (bw_ctx)); \ } while (0) #define DUK_BW_PUSH_AS_STRING(thr,bw_ctx) do { \ duk_push_lstring((thr), \ (const char *) (bw_ctx)->p_base, \ (duk_size_t) ((bw_ctx)->p - (bw_ctx)->p_base)); \ } while (0) /* Pointers may be NULL for a while when 'buf' size is zero and before any * ENSURE calls have been made. Once an ENSURE has been made, the pointers * are required to be non-NULL so that it's always valid to use memcpy() and * memmove(), even for zero size. */ #define DUK_BW_ASSERT_VALID_EXPR(thr,bw_ctx) \ DUK_ASSERT_EXPR((bw_ctx) != NULL && \ (bw_ctx)->buf != NULL && \ ((DUK_HBUFFER_DYNAMIC_GET_SIZE((bw_ctx)->buf) == 0) || \ ((bw_ctx)->p != NULL && \ (bw_ctx)->p_base != NULL && \ (bw_ctx)->p_limit != NULL && \ (bw_ctx)->p_limit >= (bw_ctx)->p_base && \ (bw_ctx)->p >= (bw_ctx)->p_base && \ (bw_ctx)->p <= (bw_ctx)->p_limit))) #define DUK_BW_ASSERT_VALID(thr,bw_ctx) do { \ DUK_BW_ASSERT_VALID_EXPR((thr), (bw_ctx)); \ } while (0) /* Working with the pointer and current size. */ #define DUK_BW_GET_PTR(thr,bw_ctx) \ ((bw_ctx)->p) #define DUK_BW_SET_PTR(thr,bw_ctx,ptr) do { \ (bw_ctx)->p = (ptr); \ } while (0) #define DUK_BW_ADD_PTR(thr,bw_ctx,delta) do { \ (bw_ctx)->p += (delta); \ } while (0) #define DUK_BW_GET_BASEPTR(thr,bw_ctx) \ ((bw_ctx)->p_base) #define DUK_BW_GET_LIMITPTR(thr,bw_ctx) \ ((bw_ctx)->p_limit) #define DUK_BW_GET_SIZE(thr,bw_ctx) \ ((duk_size_t) ((bw_ctx)->p - (bw_ctx)->p_base)) #define DUK_BW_SET_SIZE(thr,bw_ctx,sz) do { \ DUK_ASSERT((duk_size_t) (sz) <= (duk_size_t) ((bw_ctx)->p - (bw_ctx)->p_base)); \ (bw_ctx)->p = (bw_ctx)->p_base + (sz); \ } while (0) #define DUK_BW_RESET_SIZE(thr,bw_ctx) do { \ /* Reset to zero size, keep current limit. */ \ (bw_ctx)->p = (bw_ctx)->p_base; \ } while (0) #define DUK_BW_GET_BUFFER(thr,bw_ctx) \ ((bw_ctx)->buf) /* Ensuring (reserving) space. */ #define DUK_BW_ENSURE(thr,bw_ctx,sz) do { \ duk_size_t duk__sz, duk__space; \ DUK_BW_ASSERT_VALID((thr), (bw_ctx)); \ duk__sz = (sz); \ duk__space = (duk_size_t) ((bw_ctx)->p_limit - (bw_ctx)->p); \ if (duk__space < duk__sz) { \ (void) duk_bw_resize((thr), (bw_ctx), duk__sz); \ } \ } while (0) /* NOTE: Multiple evaluation of 'ptr' in this macro. */ /* XXX: Rework to use an always-inline function? */ #define DUK_BW_ENSURE_RAW(thr,bw_ctx,sz,ptr) \ (((duk_size_t) ((bw_ctx)->p_limit - (ptr)) >= (sz)) ? \ (ptr) : \ ((bw_ctx)->p = (ptr), duk_bw_resize((thr),(bw_ctx),(sz)))) #define DUK_BW_ENSURE_GETPTR(thr,bw_ctx,sz) \ DUK_BW_ENSURE_RAW((thr), (bw_ctx), (sz), (bw_ctx)->p) #define DUK_BW_ASSERT_SPACE_EXPR(thr,bw_ctx,sz) \ (DUK_BW_ASSERT_VALID_EXPR((thr), (bw_ctx)), \ DUK_ASSERT_EXPR((duk_size_t) ((bw_ctx)->p_limit - (bw_ctx)->p) >= (duk_size_t) (sz))) #define DUK_BW_ASSERT_SPACE(thr,bw_ctx,sz) do { \ DUK_BW_ASSERT_SPACE_EXPR((thr), (bw_ctx), (sz)); \ } while (0) /* Miscellaneous. */ #define DUK_BW_SETPTR_AND_COMPACT(thr,bw_ctx,ptr) do { \ (bw_ctx)->p = (ptr); \ duk_bw_compact((thr), (bw_ctx)); \ } while (0) /* Fast write calls which assume you control the slack beforehand. * Multibyte write variants exist and use a temporary write pointer * because byte writes alias with anything: with a stored pointer * explicit pointer load/stores get generated (e.g. gcc -Os). */ #define DUK_BW_WRITE_RAW_U8(thr,bw_ctx,val) do { \ DUK_BW_ASSERT_SPACE((thr), (bw_ctx), 1); \ *(bw_ctx)->p++ = (duk_uint8_t) (val); \ } while (0) #define DUK_BW_WRITE_RAW_U8_2(thr,bw_ctx,val1,val2) do { \ duk_uint8_t *duk__p; \ DUK_BW_ASSERT_SPACE((thr), (bw_ctx), 2); \ duk__p = (bw_ctx)->p; \ *duk__p++ = (duk_uint8_t) (val1); \ *duk__p++ = (duk_uint8_t) (val2); \ (bw_ctx)->p = duk__p; \ } while (0) #define DUK_BW_WRITE_RAW_U8_3(thr,bw_ctx,val1,val2,val3) do { \ duk_uint8_t *duk__p; \ DUK_BW_ASSERT_SPACE((thr), (bw_ctx), 3); \ duk__p = (bw_ctx)->p; \ *duk__p++ = (duk_uint8_t) (val1); \ *duk__p++ = (duk_uint8_t) (val2); \ *duk__p++ = (duk_uint8_t) (val3); \ (bw_ctx)->p = duk__p; \ } while (0) #define DUK_BW_WRITE_RAW_U8_4(thr,bw_ctx,val1,val2,val3,val4) do { \ duk_uint8_t *duk__p; \ DUK_BW_ASSERT_SPACE((thr), (bw_ctx), 4); \ duk__p = (bw_ctx)->p; \ *duk__p++ = (duk_uint8_t) (val1); \ *duk__p++ = (duk_uint8_t) (val2); \ *duk__p++ = (duk_uint8_t) (val3); \ *duk__p++ = (duk_uint8_t) (val4); \ (bw_ctx)->p = duk__p; \ } while (0) #define DUK_BW_WRITE_RAW_U8_5(thr,bw_ctx,val1,val2,val3,val4,val5) do { \ duk_uint8_t *duk__p; \ DUK_BW_ASSERT_SPACE((thr), (bw_ctx), 5); \ duk__p = (bw_ctx)->p; \ *duk__p++ = (duk_uint8_t) (val1); \ *duk__p++ = (duk_uint8_t) (val2); \ *duk__p++ = (duk_uint8_t) (val3); \ *duk__p++ = (duk_uint8_t) (val4); \ *duk__p++ = (duk_uint8_t) (val5); \ (bw_ctx)->p = duk__p; \ } while (0) #define DUK_BW_WRITE_RAW_U8_6(thr,bw_ctx,val1,val2,val3,val4,val5,val6) do { \ duk_uint8_t *duk__p; \ DUK_BW_ASSERT_SPACE((thr), (bw_ctx), 6); \ duk__p = (bw_ctx)->p; \ *duk__p++ = (duk_uint8_t) (val1); \ *duk__p++ = (duk_uint8_t) (val2); \ *duk__p++ = (duk_uint8_t) (val3); \ *duk__p++ = (duk_uint8_t) (val4); \ *duk__p++ = (duk_uint8_t) (val5); \ *duk__p++ = (duk_uint8_t) (val6); \ (bw_ctx)->p = duk__p; \ } while (0) #define DUK_BW_WRITE_RAW_XUTF8(thr,bw_ctx,cp) do { \ duk_ucodepoint_t duk__cp; \ duk_small_int_t duk__enc_len; \ duk__cp = (duk_ucodepoint_t) (cp); \ DUK_BW_ASSERT_SPACE((thr), (bw_ctx), duk_unicode_get_xutf8_length(duk__cp)); \ duk__enc_len = duk_unicode_encode_xutf8(duk__cp, (bw_ctx)->p); \ (bw_ctx)->p += duk__enc_len; \ } while (0) #define DUK_BW_WRITE_RAW_CESU8(thr,bw_ctx,cp) do { \ duk_ucodepoint_t duk__cp; \ duk_small_int_t duk__enc_len; \ duk__cp = (duk_ucodepoint_t) (cp); \ DUK_BW_ASSERT_SPACE((thr), (bw_ctx), duk_unicode_get_cesu8_length(duk__cp)); \ duk__enc_len = duk_unicode_encode_cesu8(duk__cp, (bw_ctx)->p); \ (bw_ctx)->p += duk__enc_len; \ } while (0) /* XXX: add temporary duk__p pointer here too; sharing */ #define DUK_BW_WRITE_RAW_BYTES(thr,bw_ctx,valptr,valsz) do { \ const void *duk__valptr; \ duk_size_t duk__valsz; \ duk__valptr = (const void *) (valptr); \ duk__valsz = (duk_size_t) (valsz); \ DUK_MEMCPY((void *) ((bw_ctx)->p), duk__valptr, duk__valsz); \ (bw_ctx)->p += duk__valsz; \ } while (0) #define DUK_BW_WRITE_RAW_CSTRING(thr,bw_ctx,val) do { \ const duk_uint8_t *duk__val; \ duk_size_t duk__val_len; \ duk__val = (const duk_uint8_t *) (val); \ duk__val_len = DUK_STRLEN((const char *) duk__val); \ DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) duk__val, duk__val_len); \ (bw_ctx)->p += duk__val_len; \ } while (0) #define DUK_BW_WRITE_RAW_HSTRING(thr,bw_ctx,val) do { \ duk_size_t duk__val_len; \ duk__val_len = DUK_HSTRING_GET_BYTELEN((val)); \ DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HSTRING_GET_DATA((val)), duk__val_len); \ (bw_ctx)->p += duk__val_len; \ } while (0) #define DUK_BW_WRITE_RAW_HBUFFER(thr,bw_ctx,val) do { \ duk_size_t duk__val_len; \ duk__val_len = DUK_HBUFFER_GET_SIZE((val)); \ DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HBUFFER_GET_DATA_PTR((thr)->heap, (val)), duk__val_len); \ (bw_ctx)->p += duk__val_len; \ } while (0) #define DUK_BW_WRITE_RAW_HBUFFER_FIXED(thr,bw_ctx,val) do { \ duk_size_t duk__val_len; \ duk__val_len = DUK_HBUFFER_FIXED_GET_SIZE((val)); \ DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HBUFFER_FIXED_GET_DATA_PTR((thr)->heap, (val)), duk__val_len); \ (bw_ctx)->p += duk__val_len; \ } while (0) #define DUK_BW_WRITE_RAW_HBUFFER_DYNAMIC(thr,bw_ctx,val) do { \ duk_size_t duk__val_len; \ duk__val_len = DUK_HBUFFER_DYNAMIC_GET_SIZE((val)); \ DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR((thr)->heap, (val)), duk__val_len); \ (bw_ctx)->p += duk__val_len; \ } while (0) /* Append bytes from a slice already in the buffer. */ #define DUK_BW_WRITE_RAW_SLICE(thr,bw,dst_off,dst_len) \ duk_bw_write_raw_slice((thr), (bw), (dst_off), (dst_len)) /* Insert bytes in the middle of the buffer from an external buffer. */ #define DUK_BW_INSERT_RAW_BYTES(thr,bw,dst_off,buf,len) \ duk_bw_insert_raw_bytes((thr), (bw), (dst_off), (buf), (len)) /* Insert bytes in the middle of the buffer from a slice already * in the buffer. Source offset is interpreted "before" the operation. */ #define DUK_BW_INSERT_RAW_SLICE(thr,bw,dst_off,src_off,len) \ duk_bw_insert_raw_slice((thr), (bw), (dst_off), (src_off), (len)) /* Insert a reserved area somewhere in the buffer; caller fills it. * Evaluates to a (duk_uint_t *) pointing to the start of the reserved * area for convenience. */ #define DUK_BW_INSERT_RAW_AREA(thr,bw,off,len) \ duk_bw_insert_raw_area((thr), (bw), (off), (len)) /* Remove a slice from inside buffer. */ #define DUK_BW_REMOVE_RAW_SLICE(thr,bw,off,len) \ duk_bw_remove_raw_slice((thr), (bw), (off), (len)) /* Safe write calls which will ensure space first. */ #define DUK_BW_WRITE_ENSURE_U8(thr,bw_ctx,val) do { \ DUK_BW_ENSURE((thr), (bw_ctx), 1); \ DUK_BW_WRITE_RAW_U8((thr), (bw_ctx), (val)); \ } while (0) #define DUK_BW_WRITE_ENSURE_U8_2(thr,bw_ctx,val1,val2) do { \ DUK_BW_ENSURE((thr), (bw_ctx), 2); \ DUK_BW_WRITE_RAW_U8_2((thr), (bw_ctx), (val1), (val2)); \ } while (0) #define DUK_BW_WRITE_ENSURE_U8_3(thr,bw_ctx,val1,val2,val3) do { \ DUK_BW_ENSURE((thr), (bw_ctx), 3); \ DUK_BW_WRITE_RAW_U8_3((thr), (bw_ctx), (val1), (val2), (val3)); \ } while (0) #define DUK_BW_WRITE_ENSURE_U8_4(thr,bw_ctx,val1,val2,val3,val4) do { \ DUK_BW_ENSURE((thr), (bw_ctx), 4); \ DUK_BW_WRITE_RAW_U8_4((thr), (bw_ctx), (val1), (val2), (val3), (val4)); \ } while (0) #define DUK_BW_WRITE_ENSURE_U8_5(thr,bw_ctx,val1,val2,val3,val4,val5) do { \ DUK_BW_ENSURE((thr), (bw_ctx), 5); \ DUK_BW_WRITE_RAW_U8_5((thr), (bw_ctx), (val1), (val2), (val3), (val4), (val5)); \ } while (0) #define DUK_BW_WRITE_ENSURE_U8_6(thr,bw_ctx,val1,val2,val3,val4,val5,val6) do { \ DUK_BW_ENSURE((thr), (bw_ctx), 6); \ DUK_BW_WRITE_RAW_U8_6((thr), (bw_ctx), (val1), (val2), (val3), (val4), (val5), (val6)); \ } while (0) #define DUK_BW_WRITE_ENSURE_XUTF8(thr,bw_ctx,cp) do { \ DUK_BW_ENSURE((thr), (bw_ctx), DUK_UNICODE_MAX_XUTF8_LENGTH); \ DUK_BW_WRITE_RAW_XUTF8((thr), (bw_ctx), (cp)); \ } while (0) #define DUK_BW_WRITE_ENSURE_CESU8(thr,bw_ctx,cp) do { \ DUK_BW_ENSURE((thr), (bw_ctx), DUK_UNICODE_MAX_CESU8_LENGTH); \ DUK_BW_WRITE_RAW_CESU8((thr), (bw_ctx), (cp)); \ } while (0) /* XXX: add temporary duk__p pointer here too; sharing */ #define DUK_BW_WRITE_ENSURE_BYTES(thr,bw_ctx,valptr,valsz) do { \ const void *duk__valptr; \ duk_size_t duk__valsz; \ duk__valptr = (const void *) (valptr); \ duk__valsz = (duk_size_t) (valsz); \ DUK_BW_ENSURE((thr), (bw_ctx), duk__valsz); \ DUK_MEMCPY((void *) ((bw_ctx)->p), duk__valptr, duk__valsz); \ (bw_ctx)->p += duk__valsz; \ } while (0) #define DUK_BW_WRITE_ENSURE_CSTRING(thr,bw_ctx,val) do { \ const duk_uint8_t *duk__val; \ duk_size_t duk__val_len; \ duk__val = (const duk_uint8_t *) (val); \ duk__val_len = DUK_STRLEN((const char *) duk__val); \ DUK_BW_ENSURE((thr), (bw_ctx), duk__val_len); \ DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) duk__val, duk__val_len); \ (bw_ctx)->p += duk__val_len; \ } while (0) #define DUK_BW_WRITE_ENSURE_HSTRING(thr,bw_ctx,val) do { \ duk_size_t duk__val_len; \ duk__val_len = DUK_HSTRING_GET_BYTELEN((val)); \ DUK_BW_ENSURE((thr), (bw_ctx), duk__val_len); \ DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HSTRING_GET_DATA((val)), duk__val_len); \ (bw_ctx)->p += duk__val_len; \ } while (0) #define DUK_BW_WRITE_ENSURE_HBUFFER(thr,bw_ctx,val) do { \ duk_size_t duk__val_len; \ duk__val_len = DUK_HBUFFER_GET_SIZE((val)); \ DUK_BW_ENSURE((thr), (bw_ctx), duk__val_len); \ DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HBUFFER_GET_DATA_PTR((thr)->heap, (val)), duk__val_len); \ (bw_ctx)->p += duk__val_len; \ } while (0) #define DUK_BW_WRITE_ENSURE_HBUFFER_FIXED(thr,bw_ctx,val) do { \ duk_size_t duk__val_len; \ duk__val_len = DUK_HBUFFER_FIXED_GET_SIZE((val)); \ DUK_BW_ENSURE((thr), (bw_ctx), duk__val_len); \ DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HBUFFER_FIXED_GET_DATA_PTR((thr)->heap, (val)), duk__val_len); \ (bw_ctx)->p += duk__val_len; \ } while (0) #define DUK_BW_WRITE_ENSURE_HBUFFER_DYNAMIC(thr,bw_ctx,val) do { \ duk_size_t duk__val_len; \ duk__val_len = DUK_HBUFFER_DYNAMIC_GET_SIZE((val)); \ DUK_BW_ENSURE((thr), (bw_ctx), duk__val_len); \ DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR((thr)->heap, (val)), duk__val_len); \ (bw_ctx)->p += duk__val_len; \ } while (0) #define DUK_BW_WRITE_ENSURE_SLICE(thr,bw,dst_off,dst_len) \ duk_bw_write_ensure_slice((thr), (bw), (dst_off), (dst_len)) #define DUK_BW_INSERT_ENSURE_BYTES(thr,bw,dst_off,buf,len) \ duk_bw_insert_ensure_bytes((thr), (bw), (dst_off), (buf), (len)) #define DUK_BW_INSERT_ENSURE_SLICE(thr,bw,dst_off,src_off,len) \ duk_bw_insert_ensure_slice((thr), (bw), (dst_off), (src_off), (len)) #define DUK_BW_INSERT_ENSURE_AREA(thr,bw,off,len) \ /* Evaluates to (duk_uint8_t *) pointing to start of area. */ \ duk_bw_insert_ensure_area((thr), (bw), (off), (len)) #define DUK_BW_REMOVE_ENSURE_SLICE(thr,bw,off,len) \ /* No difference between raw/ensure because the buffer shrinks. */ \ DUK_BW_REMOVE_RAW_SLICE((thr), (bw), (off), (len)) /* * Externs and prototypes */ #if !defined(DUK_SINGLE_FILE) DUK_INTERNAL_DECL const duk_uint8_t duk_lc_digits[36]; DUK_INTERNAL_DECL const duk_uint8_t duk_uc_nybbles[16]; DUK_INTERNAL_DECL const duk_int8_t duk_hex_dectab[256]; #if defined(DUK_USE_HEX_FASTPATH) DUK_INTERNAL_DECL const duk_int16_t duk_hex_dectab_shift4[256]; DUK_INTERNAL_DECL const duk_uint16_t duk_hex_enctab[256]; #endif #if defined(DUK_USE_BASE64_FASTPATH) DUK_INTERNAL_DECL const duk_uint8_t duk_base64_enctab[64]; DUK_INTERNAL_DECL const duk_int8_t duk_base64_dectab[256]; #endif #endif /* !DUK_SINGLE_FILE */ /* Note: assumes that duk_util_probe_steps size is 32 */ #if defined(DUK_USE_HOBJECT_HASH_PART) #if !defined(DUK_SINGLE_FILE) DUK_INTERNAL_DECL duk_uint8_t duk_util_probe_steps[32]; #endif /* !DUK_SINGLE_FILE */ #endif #if defined(DUK_USE_STRHASH_DENSE) DUK_INTERNAL_DECL duk_uint32_t duk_util_hashbytes(const duk_uint8_t *data, duk_size_t len, duk_uint32_t seed); #endif DUK_INTERNAL_DECL duk_uint32_t duk_bd_decode(duk_bitdecoder_ctx *ctx, duk_small_int_t bits); DUK_INTERNAL_DECL duk_small_uint_t duk_bd_decode_flag(duk_bitdecoder_ctx *ctx); DUK_INTERNAL_DECL duk_uint32_t duk_bd_decode_flagged(duk_bitdecoder_ctx *ctx, duk_small_int_t bits, duk_uint32_t def_value); DUK_INTERNAL_DECL duk_int32_t duk_bd_decode_flagged_signed(duk_bitdecoder_ctx *ctx, duk_small_int_t bits, duk_int32_t def_value); DUK_INTERNAL_DECL duk_uint32_t duk_bd_decode_varuint(duk_bitdecoder_ctx *ctx); DUK_INTERNAL_DECL duk_small_uint_t duk_bd_decode_bitpacked_string(duk_bitdecoder_ctx *bd, duk_uint8_t *out); DUK_INTERNAL_DECL void duk_be_encode(duk_bitencoder_ctx *ctx, duk_uint32_t data, duk_small_int_t bits); DUK_INTERNAL_DECL void duk_be_finish(duk_bitencoder_ctx *ctx); #if !defined(DUK_USE_GET_RANDOM_DOUBLE) DUK_INTERNAL_DECL duk_double_t duk_util_tinyrandom_get_double(duk_hthread *thr); DUK_INTERNAL_DECL void duk_util_tinyrandom_prepare_seed(duk_hthread *thr); #endif DUK_INTERNAL_DECL void duk_bw_init(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx, duk_hbuffer_dynamic *h_buf); DUK_INTERNAL_DECL void duk_bw_init_pushbuf(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx, duk_size_t buf_size); DUK_INTERNAL_DECL duk_uint8_t *duk_bw_resize(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx, duk_size_t sz); DUK_INTERNAL_DECL void duk_bw_compact(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx); DUK_INTERNAL_DECL void duk_bw_write_raw_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t src_off, duk_size_t len); DUK_INTERNAL_DECL void duk_bw_write_ensure_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t src_off, duk_size_t len); DUK_INTERNAL_DECL void duk_bw_insert_raw_bytes(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, const duk_uint8_t *buf, duk_size_t len); DUK_INTERNAL_DECL void duk_bw_insert_ensure_bytes(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, const duk_uint8_t *buf, duk_size_t len); DUK_INTERNAL_DECL void duk_bw_insert_raw_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, duk_size_t src_off, duk_size_t len); DUK_INTERNAL_DECL void duk_bw_insert_ensure_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, duk_size_t src_off, duk_size_t len); DUK_INTERNAL_DECL duk_uint8_t *duk_bw_insert_raw_area(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t off, duk_size_t len); DUK_INTERNAL_DECL duk_uint8_t *duk_bw_insert_ensure_area(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t off, duk_size_t len); DUK_INTERNAL_DECL void duk_bw_remove_raw_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t off, duk_size_t len); /* No duk_bw_remove_ensure_slice(), functionality would be identical. */ DUK_INTERNAL_DECL duk_uint16_t duk_raw_read_u16_be(duk_uint8_t **p); DUK_INTERNAL_DECL duk_uint32_t duk_raw_read_u32_be(duk_uint8_t **p); DUK_INTERNAL_DECL duk_double_t duk_raw_read_double_be(duk_uint8_t **p); DUK_INTERNAL_DECL void duk_raw_write_u16_be(duk_uint8_t **p, duk_uint16_t val); DUK_INTERNAL_DECL void duk_raw_write_u32_be(duk_uint8_t **p, duk_uint32_t val); DUK_INTERNAL_DECL void duk_raw_write_double_be(duk_uint8_t **p, duk_double_t val); #if defined(DUK_USE_DEBUGGER_SUPPORT) /* For now only needed by the debugger. */ DUK_INTERNAL_DECL void duk_byteswap_bytes(duk_uint8_t *p, duk_small_uint_t len); #endif DUK_INTERNAL_DECL duk_bool_t duk_is_whole_get_int32_nonegzero(duk_double_t x, duk_int32_t *ival); DUK_INTERNAL_DECL duk_bool_t duk_is_whole_get_int32(duk_double_t x, duk_int32_t *ival); DUK_INTERNAL_DECL duk_bool_t duk_double_is_anyinf(duk_double_t x); DUK_INTERNAL_DECL duk_bool_t duk_double_is_posinf(duk_double_t x); DUK_INTERNAL_DECL duk_bool_t duk_double_is_neginf(duk_double_t x); DUK_INTERNAL_DECL duk_bool_t duk_double_is_nan(duk_double_t x); DUK_INTERNAL_DECL duk_bool_t duk_double_is_nan_or_zero(duk_double_t x); DUK_INTERNAL_DECL duk_bool_t duk_double_is_nan_or_inf(duk_double_t x); DUK_INTERNAL_DECL duk_bool_t duk_double_is_nan_zero_inf(duk_double_t x); DUK_INTERNAL_DECL duk_small_uint_t duk_double_signbit(duk_double_t x); DUK_INTERNAL_DECL duk_double_t duk_double_trunc_towards_zero(duk_double_t x); DUK_INTERNAL_DECL duk_bool_t duk_double_same_sign(duk_double_t x, duk_double_t y); DUK_INTERNAL_DECL duk_double_t duk_double_fmin(duk_double_t x, duk_double_t y); DUK_INTERNAL_DECL duk_double_t duk_double_fmax(duk_double_t x, duk_double_t y); #endif /* DUK_UTIL_H_INCLUDED */ /* #include duk_strings.h */ #line 1 "duk_strings.h" /* * Shared string macros. * * Using shared macros helps minimize strings data size because it's easy * to check if an existing string could be used. String constants don't * need to be all defined here; defining a string here makes sense if there's * a high chance the string could be reused. Also, using macros allows * a call site express the exact string needed, but the macro may map to an * approximate string to reduce unique string count. Macros can also be * more easily tuned for low memory targets than #if defined()s throughout * the code base. * * Because format strings behave differently in the call site (they need to * be followed by format arguments), they use a special prefix DUK_STR_FMT_. * * On some compilers using explicit shared strings is preferable; on others * it may be better to use straight literals because the compiler will combine * them anyway, and such strings won't end up unnecessarily in a symbol table. */ #if !defined(DUK_ERRMSG_H_INCLUDED) #define DUK_ERRMSG_H_INCLUDED /* Mostly API and built-in method related */ #define DUK_STR_INTERNAL_ERROR "internal error" #define DUK_STR_UNSUPPORTED "unsupported" #define DUK_STR_INVALID_COUNT "invalid count" #define DUK_STR_INVALID_ARGS "invalid args" #define DUK_STR_INVALID_STATE "invalid state" #define DUK_STR_INVALID_INPUT "invalid input" #define DUK_STR_INVALID_LENGTH "invalid length" #define DUK_STR_NOT_CONSTRUCTABLE "not constructable" #define DUK_STR_CONSTRUCT_ONLY "constructor requires 'new'" #define DUK_STR_NOT_CALLABLE "not callable" #define DUK_STR_NOT_EXTENSIBLE "not extensible" #define DUK_STR_NOT_WRITABLE "not writable" #define DUK_STR_NOT_CONFIGURABLE "not configurable" #define DUK_STR_INVALID_CONTEXT "invalid context" #define DUK_STR_INVALID_INDEX "invalid args" #define DUK_STR_PUSH_BEYOND_ALLOC_STACK "cannot push beyond allocated stack" #define DUK_STR_NOT_UNDEFINED "unexpected type" #define DUK_STR_NOT_NULL "unexpected type" #define DUK_STR_NOT_BOOLEAN "unexpected type" #define DUK_STR_NOT_NUMBER "unexpected type" #define DUK_STR_NOT_STRING "unexpected type" #define DUK_STR_NOT_OBJECT "unexpected type" #define DUK_STR_NOT_POINTER "unexpected type" #define DUK_STR_NOT_BUFFER "not buffer" /* still in use with verbose messages */ #define DUK_STR_UNEXPECTED_TYPE "unexpected type" #define DUK_STR_NOT_THREAD "unexpected type" #define DUK_STR_NOT_COMPFUNC "unexpected type" #define DUK_STR_NOT_NATFUNC "unexpected type" #define DUK_STR_NOT_C_FUNCTION "unexpected type" #define DUK_STR_NOT_FUNCTION "unexpected type" #define DUK_STR_NOT_REGEXP "unexpected type" #define DUK_STR_TOPRIMITIVE_FAILED "coercion to primitive failed" #define DUK_STR_NUMBER_OUTSIDE_RANGE "number outside range" #define DUK_STR_NOT_OBJECT_COERCIBLE "not object coercible" #define DUK_STR_CANNOT_NUMBER_COERCE_SYMBOL "cannot number coerce Symbol" #define DUK_STR_CANNOT_STRING_COERCE_SYMBOL "cannot string coerce Symbol" #define DUK_STR_STRING_TOO_LONG "string too long" #define DUK_STR_BUFFER_TOO_LONG "buffer too long" #define DUK_STR_ALLOC_FAILED "alloc failed" #define DUK_STR_WRONG_BUFFER_TYPE "wrong buffer type" #define DUK_STR_BASE64_ENCODE_FAILED "base64 encode failed" #define DUK_STR_SOURCE_DECODE_FAILED "source decode failed" #define DUK_STR_UTF8_DECODE_FAILED "utf-8 decode failed" #define DUK_STR_BASE64_DECODE_FAILED "base64 decode failed" #define DUK_STR_HEX_DECODE_FAILED "hex decode failed" #define DUK_STR_INVALID_BYTECODE "invalid bytecode" #define DUK_STR_NO_SOURCECODE "no sourcecode" #define DUK_STR_RESULT_TOO_LONG "result too long" #define DUK_STR_INVALID_CFUNC_RC "invalid C function rc" #define DUK_STR_INVALID_INSTANCEOF_RVAL "invalid instanceof rval" #define DUK_STR_INVALID_INSTANCEOF_RVAL_NOPROTO "instanceof rval has no .prototype" /* JSON */ #define DUK_STR_FMT_PTR "%p" #define DUK_STR_FMT_INVALID_JSON "invalid json (at offset %ld)" #define DUK_STR_JSONDEC_RECLIMIT "json decode recursion limit" #define DUK_STR_JSONENC_RECLIMIT "json encode recursion limit" #define DUK_STR_CYCLIC_INPUT "cyclic input" /* Object property access */ #define DUK_STR_INVALID_BASE "invalid base value" #define DUK_STR_STRICT_CALLER_READ "cannot read strict 'caller'" #define DUK_STR_PROXY_REJECTED "proxy rejected" #define DUK_STR_INVALID_ARRAY_LENGTH "invalid array length" #define DUK_STR_SETTER_UNDEFINED "setter undefined" #define DUK_STR_INVALID_DESCRIPTOR "invalid descriptor" /* Proxy */ #define DUK_STR_PROXY_REVOKED "proxy revoked" #define DUK_STR_INVALID_TRAP_RESULT "invalid trap result" /* Variables */ /* Lexer */ #define DUK_STR_INVALID_ESCAPE "invalid escape" #define DUK_STR_UNTERMINATED_STRING "unterminated string" #define DUK_STR_UNTERMINATED_COMMENT "unterminated comment" #define DUK_STR_UNTERMINATED_REGEXP "unterminated regexp" #define DUK_STR_TOKEN_LIMIT "token limit" #define DUK_STR_REGEXP_SUPPORT_DISABLED "regexp support disabled" #define DUK_STR_INVALID_NUMBER_LITERAL "invalid number literal" #define DUK_STR_INVALID_TOKEN "invalid token" /* Compiler */ #define DUK_STR_PARSE_ERROR "parse error" #define DUK_STR_DUPLICATE_LABEL "duplicate label" #define DUK_STR_INVALID_LABEL "invalid label" #define DUK_STR_INVALID_ARRAY_LITERAL "invalid array literal" #define DUK_STR_INVALID_OBJECT_LITERAL "invalid object literal" #define DUK_STR_INVALID_VAR_DECLARATION "invalid variable declaration" #define DUK_STR_CANNOT_DELETE_IDENTIFIER "cannot delete identifier" #define DUK_STR_INVALID_EXPRESSION "invalid expression" #define DUK_STR_INVALID_LVALUE "invalid lvalue" #define DUK_STR_INVALID_NEWTARGET "invalid new.target" #define DUK_STR_EXPECTED_IDENTIFIER "expected identifier" #define DUK_STR_EMPTY_EXPR_NOT_ALLOWED "empty expression not allowed" #define DUK_STR_INVALID_FOR "invalid for statement" #define DUK_STR_INVALID_SWITCH "invalid switch statement" #define DUK_STR_INVALID_BREAK_CONT_LABEL "invalid break/continue label" #define DUK_STR_INVALID_RETURN "invalid return" #define DUK_STR_INVALID_TRY "invalid try" #define DUK_STR_INVALID_THROW "invalid throw" #define DUK_STR_WITH_IN_STRICT_MODE "with in strict mode" #define DUK_STR_FUNC_STMT_NOT_ALLOWED "function statement not allowed" #define DUK_STR_UNTERMINATED_STMT "unterminated statement" #define DUK_STR_INVALID_ARG_NAME "invalid argument name" #define DUK_STR_INVALID_FUNC_NAME "invalid function name" #define DUK_STR_INVALID_GETSET_NAME "invalid getter/setter name" #define DUK_STR_FUNC_NAME_REQUIRED "function name required" /* RegExp */ #define DUK_STR_INVALID_QUANTIFIER "invalid regexp quantifier" #define DUK_STR_INVALID_QUANTIFIER_NO_ATOM "quantifier without preceding atom" #define DUK_STR_INVALID_QUANTIFIER_VALUES "quantifier values invalid (qmin > qmax)" #define DUK_STR_QUANTIFIER_TOO_MANY_COPIES "quantifier requires too many atom copies" #define DUK_STR_UNEXPECTED_CLOSING_PAREN "unexpected closing parenthesis" #define DUK_STR_UNEXPECTED_END_OF_PATTERN "unexpected end of pattern" #define DUK_STR_UNEXPECTED_REGEXP_TOKEN "unexpected token in regexp" #define DUK_STR_INVALID_REGEXP_FLAGS "invalid regexp flags" #define DUK_STR_INVALID_REGEXP_ESCAPE "invalid regexp escape" #define DUK_STR_INVALID_BACKREFS "invalid backreference(s)" #define DUK_STR_INVALID_REGEXP_CHARACTER "invalid regexp character" #define DUK_STR_INVALID_REGEXP_GROUP "invalid regexp group" #define DUK_STR_UNTERMINATED_CHARCLASS "unterminated character class" #define DUK_STR_INVALID_RANGE "invalid range" /* Limits */ #define DUK_STR_VALSTACK_LIMIT "valstack limit" #define DUK_STR_CALLSTACK_LIMIT "callstack limit" #define DUK_STR_PROTOTYPE_CHAIN_LIMIT "prototype chain limit" #define DUK_STR_BOUND_CHAIN_LIMIT "function call bound chain limit" #define DUK_STR_C_CALLSTACK_LIMIT "C call stack depth limit" #define DUK_STR_COMPILER_RECURSION_LIMIT "compiler recursion limit" #define DUK_STR_BYTECODE_LIMIT "bytecode limit" #define DUK_STR_REG_LIMIT "register limit" #define DUK_STR_TEMP_LIMIT "temp limit" #define DUK_STR_CONST_LIMIT "const limit" #define DUK_STR_FUNC_LIMIT "function limit" #define DUK_STR_REGEXP_COMPILER_RECURSION_LIMIT "regexp compiler recursion limit" #define DUK_STR_REGEXP_EXECUTOR_RECURSION_LIMIT "regexp executor recursion limit" #define DUK_STR_REGEXP_EXECUTOR_STEP_LIMIT "regexp step limit" #endif /* DUK_ERRMSG_H_INCLUDED */ /* #include duk_js_bytecode.h */ #line 1 "duk_js_bytecode.h" /* * Ecmascript bytecode */ #if !defined(DUK_JS_BYTECODE_H_INCLUDED) #define DUK_JS_BYTECODE_H_INCLUDED /* * Bytecode instruction layout * =========================== * * Instructions are unsigned 32-bit integers divided as follows: * * !3!3!2!2!2!2!2!2!2!2!2!2!1!1!1!1!1!1!1!1!1!1! ! ! ! ! ! ! ! ! ! ! * !1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0! * +-----------------------------------------------+---------------+ * ! C ! B ! A ! OP ! * +-----------------------------------------------+---------------+ * * OP (8 bits): opcode (DUK_OP_*), access should be fastest * consecutive opcodes allocated when opcode needs flags * A (8 bits): typically a target register number * B (8 bits): typically first source register/constant number * C (8 bits): typically second source register/constant number * * Some instructions combine BC or ABC together for larger parameter values. * Signed integers (e.g. jump offsets) are encoded as unsigned, with an * opcode specific bias. * * Some opcodes have flags which are handled by allocating consecutive * opcodes to make space for 1-N flags. Flags can also be e.g. in the 'A' * field when there's room for the specific opcode. * * For example, if three flags were needed, they could be allocated from * the opcode field as follows: * * !3!3!2!2!2!2!2!2!2!2!2!2!1!1!1!1!1!1!1!1!1!1! ! ! ! ! ! ! ! ! ! ! * !1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0! * +-----------------------------------------------+---------------+ * ! C ! B ! A ! OP !Z!Y!X! * +-----------------------------------------------+---------------+ * * Some opcodes accept a reg/const argument which is handled by allocating * flags in the OP field, see DUK_BC_ISREG() and DUK_BC_ISCONST(). The * following convention is shared by most opcodes, so that the compiler * can handle reg/const flagging without opcode specific code paths: * * !3!3!2!2!2!2!2!2!2!2!2!2!1!1!1!1!1!1!1!1!1!1! ! ! ! ! ! ! ! ! ! ! * !1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0! * +-----------------------------------------------+---------------+ * ! C ! B ! A ! OP !Y!X! * +-----------------------------------------------+---------------+ * * X 1=B is const, 0=B is reg * Y 1=C is const, 0=C is reg * * In effect OP, OP + 1, OP + 2, and OP + 3 are allocated from the * 8-bit opcode space for a single logical opcode. The base opcode * number should be divisible by 4. If the opcode is called 'FOO' * the following opcode constants would be defined: * * DUK_OP_FOO 100 // base opcode number * DUK_OP_FOO_RR 100 // FOO, B=reg, C=reg * DUK_OP_FOO_CR 101 // FOO, B=const, C=reg * DUK_OP_FOO_RC 102 // FOO, B=reg, C=const * DUK_OP_FOO_CC 103 // FOO, B=const, C=const * * If only B or C is a reg/const, the unused opcode combinations can be * used for other opcodes (which take no reg/const argument). However, * such opcode values are initially reserved, at least while opcode space * is available. For example, if 'BAR' uses B for a register field and * C is a reg/const: * * DUK_OP_BAR 116 // base opcode number * DUK_OP_BAR_RR 116 // BAR, B=reg, C=reg * DUK_OP_BAR_CR_UNUSED 117 // unused, could be repurposed * DUK_OP_BAR_RC 118 // BAR, B=reg, C=const * DUK_OP_BAR_CC_UNUSED 119 // unused, could be repurposed * * Macro naming is a bit misleading, e.g. "ABC" in macro name but the * field layout is concretely "CBA" in the register. */ typedef duk_uint32_t duk_instr_t; #define DUK_BC_SHIFT_OP 0 #define DUK_BC_SHIFT_A 8 #define DUK_BC_SHIFT_B 16 #define DUK_BC_SHIFT_C 24 #define DUK_BC_SHIFT_BC DUK_BC_SHIFT_B #define DUK_BC_SHIFT_ABC DUK_BC_SHIFT_A #define DUK_BC_UNSHIFTED_MASK_OP 0xffUL #define DUK_BC_UNSHIFTED_MASK_A 0xffUL #define DUK_BC_UNSHIFTED_MASK_B 0xffUL #define DUK_BC_UNSHIFTED_MASK_C 0xffUL #define DUK_BC_UNSHIFTED_MASK_BC 0xffffUL #define DUK_BC_UNSHIFTED_MASK_ABC 0xffffffUL #define DUK_BC_SHIFTED_MASK_OP (DUK_BC_UNSHIFTED_MASK_OP << DUK_BC_SHIFT_OP) #define DUK_BC_SHIFTED_MASK_A (DUK_BC_UNSHIFTED_MASK_A << DUK_BC_SHIFT_A) #define DUK_BC_SHIFTED_MASK_B (DUK_BC_UNSHIFTED_MASK_B << DUK_BC_SHIFT_B) #define DUK_BC_SHIFTED_MASK_C (DUK_BC_UNSHIFTED_MASK_C << DUK_BC_SHIFT_C) #define DUK_BC_SHIFTED_MASK_BC (DUK_BC_UNSHIFTED_MASK_BC << DUK_BC_SHIFT_BC) #define DUK_BC_SHIFTED_MASK_ABC (DUK_BC_UNSHIFTED_MASK_ABC << DUK_BC_SHIFT_ABC) #define DUK_DEC_OP(x) ((x) & 0xffUL) #define DUK_DEC_A(x) (((x) >> 8) & 0xffUL) #define DUK_DEC_B(x) (((x) >> 16) & 0xffUL) #define DUK_DEC_C(x) (((x) >> 24) & 0xffUL) #define DUK_DEC_BC(x) (((x) >> 16) & 0xffffUL) #define DUK_DEC_ABC(x) (((x) >> 8) & 0xffffffUL) #define DUK_ENC_OP(op) ((duk_instr_t) (op)) #define DUK_ENC_OP_ABC(op,abc) ((duk_instr_t) ( \ (((duk_instr_t) (abc)) << 8) | \ ((duk_instr_t) (op)) \ )) #define DUK_ENC_OP_A_BC(op,a,bc) ((duk_instr_t) ( \ (((duk_instr_t) (bc)) << 16) | \ (((duk_instr_t) (a)) << 8) | \ ((duk_instr_t) (op)) \ )) #define DUK_ENC_OP_A_B_C(op,a,b,c) ((duk_instr_t) ( \ (((duk_instr_t) (c)) << 24) | \ (((duk_instr_t) (b)) << 16) | \ (((duk_instr_t) (a)) << 8) | \ ((duk_instr_t) (op)) \ )) #define DUK_ENC_OP_A_B(op,a,b) DUK_ENC_OP_A_B_C((op),(a),(b),0) #define DUK_ENC_OP_A(op,a) DUK_ENC_OP_A_B_C((op),(a),0,0) #define DUK_ENC_OP_BC(op,bc) DUK_ENC_OP_A_BC((op),0,(bc)) /* Get opcode base value with B/C reg/const flags cleared. */ #define DUK_BC_NOREGCONST_OP(op) ((op) & 0xfc) /* Constants should be signed so that signed arithmetic involving them * won't cause values to be coerced accidentally to unsigned. */ #define DUK_BC_OP_MIN 0 #define DUK_BC_OP_MAX 0xffL #define DUK_BC_A_MIN 0 #define DUK_BC_A_MAX 0xffL #define DUK_BC_B_MIN 0 #define DUK_BC_B_MAX 0xffL #define DUK_BC_C_MIN 0 #define DUK_BC_C_MAX 0xffL #define DUK_BC_BC_MIN 0 #define DUK_BC_BC_MAX 0xffffL #define DUK_BC_ABC_MIN 0 #define DUK_BC_ABC_MAX 0xffffffL /* Masks for B/C reg/const indicator in opcode field. */ #define DUK_BC_REGCONST_B (0x01UL) #define DUK_BC_REGCONST_C (0x02UL) /* Misc. masks for opcode field. */ #define DUK_BC_INCDECP_FLAG_DEC (0x04UL) #define DUK_BC_INCDECP_FLAG_POST (0x08UL) /* Opcodes. */ #define DUK_OP_LDREG 0 #define DUK_OP_STREG 1 #define DUK_OP_JUMP 2 #define DUK_OP_LDCONST 3 #define DUK_OP_LDINT 4 #define DUK_OP_LDINTX 5 #define DUK_OP_LDTHIS 6 #define DUK_OP_LDUNDEF 7 #define DUK_OP_LDNULL 8 #define DUK_OP_LDTRUE 9 #define DUK_OP_LDFALSE 10 #define DUK_OP_GETVAR 11 #define DUK_OP_BNOT 12 #define DUK_OP_LNOT 13 #define DUK_OP_UNM 14 #define DUK_OP_UNP 15 #define DUK_OP_EQ 16 #define DUK_OP_EQ_RR 16 #define DUK_OP_EQ_CR 17 #define DUK_OP_EQ_RC 18 #define DUK_OP_EQ_CC 19 #define DUK_OP_NEQ 20 #define DUK_OP_NEQ_RR 20 #define DUK_OP_NEQ_CR 21 #define DUK_OP_NEQ_RC 22 #define DUK_OP_NEQ_CC 23 #define DUK_OP_SEQ 24 #define DUK_OP_SEQ_RR 24 #define DUK_OP_SEQ_CR 25 #define DUK_OP_SEQ_RC 26 #define DUK_OP_SEQ_CC 27 #define DUK_OP_SNEQ 28 #define DUK_OP_SNEQ_RR 28 #define DUK_OP_SNEQ_CR 29 #define DUK_OP_SNEQ_RC 30 #define DUK_OP_SNEQ_CC 31 #define DUK_OP_GT 32 #define DUK_OP_GT_RR 32 #define DUK_OP_GT_CR 33 #define DUK_OP_GT_RC 34 #define DUK_OP_GT_CC 35 #define DUK_OP_GE 36 #define DUK_OP_GE_RR 36 #define DUK_OP_GE_CR 37 #define DUK_OP_GE_RC 38 #define DUK_OP_GE_CC 39 #define DUK_OP_LT 40 #define DUK_OP_LT_RR 40 #define DUK_OP_LT_CR 41 #define DUK_OP_LT_RC 42 #define DUK_OP_LT_CC 43 #define DUK_OP_LE 44 #define DUK_OP_LE_RR 44 #define DUK_OP_LE_CR 45 #define DUK_OP_LE_RC 46 #define DUK_OP_LE_CC 47 #define DUK_OP_IFTRUE 48 #define DUK_OP_IFTRUE_R 48 #define DUK_OP_IFTRUE_C 49 #define DUK_OP_IFFALSE 50 #define DUK_OP_IFFALSE_R 50 #define DUK_OP_IFFALSE_C 51 #define DUK_OP_ADD 52 #define DUK_OP_ADD_RR 52 #define DUK_OP_ADD_CR 53 #define DUK_OP_ADD_RC 54 #define DUK_OP_ADD_CC 55 #define DUK_OP_SUB 56 #define DUK_OP_SUB_RR 56 #define DUK_OP_SUB_CR 57 #define DUK_OP_SUB_RC 58 #define DUK_OP_SUB_CC 59 #define DUK_OP_MUL 60 #define DUK_OP_MUL_RR 60 #define DUK_OP_MUL_CR 61 #define DUK_OP_MUL_RC 62 #define DUK_OP_MUL_CC 63 #define DUK_OP_DIV 64 #define DUK_OP_DIV_RR 64 #define DUK_OP_DIV_CR 65 #define DUK_OP_DIV_RC 66 #define DUK_OP_DIV_CC 67 #define DUK_OP_MOD 68 #define DUK_OP_MOD_RR 68 #define DUK_OP_MOD_CR 69 #define DUK_OP_MOD_RC 70 #define DUK_OP_MOD_CC 71 #define DUK_OP_EXP 72 #define DUK_OP_EXP_RR 72 #define DUK_OP_EXP_CR 73 #define DUK_OP_EXP_RC 74 #define DUK_OP_EXP_CC 75 #define DUK_OP_BAND 76 #define DUK_OP_BAND_RR 76 #define DUK_OP_BAND_CR 77 #define DUK_OP_BAND_RC 78 #define DUK_OP_BAND_CC 79 #define DUK_OP_BOR 80 #define DUK_OP_BOR_RR 80 #define DUK_OP_BOR_CR 81 #define DUK_OP_BOR_RC 82 #define DUK_OP_BOR_CC 83 #define DUK_OP_BXOR 84 #define DUK_OP_BXOR_RR 84 #define DUK_OP_BXOR_CR 85 #define DUK_OP_BXOR_RC 86 #define DUK_OP_BXOR_CC 87 #define DUK_OP_BASL 88 #define DUK_OP_BASL_RR 88 #define DUK_OP_BASL_CR 89 #define DUK_OP_BASL_RC 90 #define DUK_OP_BASL_CC 91 #define DUK_OP_BLSR 92 #define DUK_OP_BLSR_RR 92 #define DUK_OP_BLSR_CR 93 #define DUK_OP_BLSR_RC 94 #define DUK_OP_BLSR_CC 95 #define DUK_OP_BASR 96 #define DUK_OP_BASR_RR 96 #define DUK_OP_BASR_CR 97 #define DUK_OP_BASR_RC 98 #define DUK_OP_BASR_CC 99 #define DUK_OP_INSTOF 100 #define DUK_OP_INSTOF_RR 100 #define DUK_OP_INSTOF_CR 101 #define DUK_OP_INSTOF_RC 102 #define DUK_OP_INSTOF_CC 103 #define DUK_OP_IN 104 #define DUK_OP_IN_RR 104 #define DUK_OP_IN_CR 105 #define DUK_OP_IN_RC 106 #define DUK_OP_IN_CC 107 #define DUK_OP_GETPROP 108 #define DUK_OP_GETPROP_RR 108 #define DUK_OP_GETPROP_CR 109 #define DUK_OP_GETPROP_RC 110 #define DUK_OP_GETPROP_CC 111 #define DUK_OP_PUTPROP 112 #define DUK_OP_PUTPROP_RR 112 #define DUK_OP_PUTPROP_CR 113 #define DUK_OP_PUTPROP_RC 114 #define DUK_OP_PUTPROP_CC 115 #define DUK_OP_DELPROP 116 #define DUK_OP_DELPROP_RR 116 #define DUK_OP_DELPROP_CR_UNUSED 117 /* unused now */ #define DUK_OP_DELPROP_RC 118 #define DUK_OP_DELPROP_CC_UNUSED 119 /* unused now */ #define DUK_OP_PREINCR 120 /* pre/post opcode values have constraints, */ #define DUK_OP_PREDECR 121 /* see duk_js_executor.c and duk_js_compiler.c. */ #define DUK_OP_POSTINCR 122 #define DUK_OP_POSTDECR 123 #define DUK_OP_PREINCV 124 #define DUK_OP_PREDECV 125 #define DUK_OP_POSTINCV 126 #define DUK_OP_POSTDECV 127 #define DUK_OP_PREINCP 128 /* pre/post inc/dec prop opcodes have constraints */ #define DUK_OP_PREINCP_RR 128 #define DUK_OP_PREINCP_CR 129 #define DUK_OP_PREINCP_RC 130 #define DUK_OP_PREINCP_CC 131 #define DUK_OP_PREDECP 132 #define DUK_OP_PREDECP_RR 132 #define DUK_OP_PREDECP_CR 133 #define DUK_OP_PREDECP_RC 134 #define DUK_OP_PREDECP_CC 135 #define DUK_OP_POSTINCP 136 #define DUK_OP_POSTINCP_RR 136 #define DUK_OP_POSTINCP_CR 137 #define DUK_OP_POSTINCP_RC 138 #define DUK_OP_POSTINCP_CC 139 #define DUK_OP_POSTDECP 140 #define DUK_OP_POSTDECP_RR 140 #define DUK_OP_POSTDECP_CR 141 #define DUK_OP_POSTDECP_RC 142 #define DUK_OP_POSTDECP_CC 143 #define DUK_OP_DECLVAR 144 #define DUK_OP_DECLVAR_RR 144 #define DUK_OP_DECLVAR_CR 145 #define DUK_OP_DECLVAR_RC 146 #define DUK_OP_DECLVAR_CC 147 #define DUK_OP_REGEXP 148 #define DUK_OP_REGEXP_RR 148 #define DUK_OP_REGEXP_CR 149 #define DUK_OP_REGEXP_RC 150 #define DUK_OP_REGEXP_CC 151 #define DUK_OP_CLOSURE 152 #define DUK_OP_TYPEOF 153 #define DUK_OP_TYPEOFID 154 #define DUK_OP_PUTVAR 155 #define DUK_OP_DELVAR 156 #define DUK_OP_RETREG 157 #define DUK_OP_RETUNDEF 158 #define DUK_OP_RETCONST 159 #define DUK_OP_RETCONSTN 160 /* return const without incref (e.g. number) */ #define DUK_OP_LABEL 161 #define DUK_OP_ENDLABEL 162 #define DUK_OP_BREAK 163 #define DUK_OP_CONTINUE 164 #define DUK_OP_TRYCATCH 165 #define DUK_OP_ENDTRY 166 #define DUK_OP_ENDCATCH 167 #define DUK_OP_ENDFIN 168 #define DUK_OP_THROW 169 #define DUK_OP_INVLHS 170 #define DUK_OP_CSREG 171 #define DUK_OP_CSVAR 172 #define DUK_OP_CSVAR_RR 172 #define DUK_OP_CSVAR_CR 173 #define DUK_OP_CSVAR_RC 174 #define DUK_OP_CSVAR_CC 175 #define DUK_OP_CALL0 176 /* DUK_OP_CALL0 & 0x0F must be zero. */ #define DUK_OP_CALL1 177 #define DUK_OP_CALL2 178 #define DUK_OP_CALL3 179 #define DUK_OP_CALL4 180 #define DUK_OP_CALL5 181 #define DUK_OP_CALL6 182 #define DUK_OP_CALL7 183 #define DUK_OP_CALL8 184 #define DUK_OP_CALL9 185 #define DUK_OP_CALL10 186 #define DUK_OP_CALL11 187 #define DUK_OP_CALL12 188 #define DUK_OP_CALL13 189 #define DUK_OP_CALL14 190 #define DUK_OP_CALL15 191 #define DUK_OP_NEWOBJ 192 #define DUK_OP_NEWARR 193 #define DUK_OP_MPUTOBJ 194 #define DUK_OP_MPUTOBJI 195 #define DUK_OP_INITSET 196 #define DUK_OP_INITGET 197 #define DUK_OP_MPUTARR 198 #define DUK_OP_MPUTARRI 199 #define DUK_OP_SETALEN 200 #define DUK_OP_INITENUM 201 #define DUK_OP_NEXTENUM 202 #define DUK_OP_NEWTARGET 203 #define DUK_OP_DEBUGGER 204 #define DUK_OP_NOP 205 #define DUK_OP_INVALID 206 #define DUK_OP_UNUSED207 207 #define DUK_OP_GETPROPC 208 #define DUK_OP_GETPROPC_RR 208 #define DUK_OP_GETPROPC_CR 209 #define DUK_OP_GETPROPC_RC 210 #define DUK_OP_GETPROPC_CC 211 #define DUK_OP_UNUSED212 212 #define DUK_OP_UNUSED213 213 #define DUK_OP_UNUSED214 214 #define DUK_OP_UNUSED215 215 #define DUK_OP_UNUSED216 216 #define DUK_OP_UNUSED217 217 #define DUK_OP_UNUSED218 218 #define DUK_OP_UNUSED219 219 #define DUK_OP_UNUSED220 220 #define DUK_OP_UNUSED221 221 #define DUK_OP_UNUSED222 222 #define DUK_OP_UNUSED223 223 #define DUK_OP_UNUSED224 224 #define DUK_OP_UNUSED225 225 #define DUK_OP_UNUSED226 226 #define DUK_OP_UNUSED227 227 #define DUK_OP_UNUSED228 228 #define DUK_OP_UNUSED229 229 #define DUK_OP_UNUSED230 230 #define DUK_OP_UNUSED231 231 #define DUK_OP_UNUSED232 232 #define DUK_OP_UNUSED233 233 #define DUK_OP_UNUSED234 234 #define DUK_OP_UNUSED235 235 #define DUK_OP_UNUSED236 236 #define DUK_OP_UNUSED237 237 #define DUK_OP_UNUSED238 238 #define DUK_OP_UNUSED239 239 #define DUK_OP_UNUSED240 240 #define DUK_OP_UNUSED241 241 #define DUK_OP_UNUSED242 242 #define DUK_OP_UNUSED243 243 #define DUK_OP_UNUSED244 244 #define DUK_OP_UNUSED245 245 #define DUK_OP_UNUSED246 246 #define DUK_OP_UNUSED247 247 #define DUK_OP_UNUSED248 248 #define DUK_OP_UNUSED249 249 #define DUK_OP_UNUSED250 250 #define DUK_OP_UNUSED251 251 #define DUK_OP_UNUSED252 252 #define DUK_OP_UNUSED253 253 #define DUK_OP_UNUSED254 254 #define DUK_OP_UNUSED255 255 #define DUK_OP_NONE 256 /* dummy value used as marker (doesn't fit in 8-bit field) */ /* XXX: Allocate flags from opcode field? Would take 16 opcode slots * but avoids shuffling in more cases. Maybe not worth it. */ /* DUK_OP_TRYCATCH flags in A. */ #define DUK_BC_TRYCATCH_FLAG_HAVE_CATCH (1U << 0) #define DUK_BC_TRYCATCH_FLAG_HAVE_FINALLY (1U << 1) #define DUK_BC_TRYCATCH_FLAG_CATCH_BINDING (1U << 2) #define DUK_BC_TRYCATCH_FLAG_WITH_BINDING (1U << 3) /* DUK_OP_DECLVAR flags in A; bottom bits are reserved for propdesc flags * (DUK_PROPDESC_FLAG_XXX). */ #define DUK_BC_DECLVAR_FLAG_FUNC_DECL (1U << 4) /* function declaration */ /* DUK_OP_CALLn flags, part of opcode field. Three lowest bits must match * DUK_CALL_FLAG_xxx directly. */ #define DUK_BC_CALL_FLAG_TAILCALL (1U << 0) #define DUK_BC_CALL_FLAG_CONSTRUCT (1U << 1) #define DUK_BC_CALL_FLAG_CALLED_AS_EVAL (1U << 2) #define DUK_BC_CALL_FLAG_INDIRECT (1U << 3) /* Misc constants and helper macros. */ #define DUK_BC_LDINT_BIAS (1L << 15) #define DUK_BC_LDINTX_SHIFT 16 #define DUK_BC_JUMP_BIAS (1L << 23) #endif /* DUK_JS_BYTECODE_H_INCLUDED */ /* #include duk_lexer.h */ #line 1 "duk_lexer.h" /* * Lexer defines. */ #if !defined(DUK_LEXER_H_INCLUDED) #define DUK_LEXER_H_INCLUDED typedef void (*duk_re_range_callback)(void *user, duk_codepoint_t r1, duk_codepoint_t r2, duk_bool_t direct); /* * A token is interpreted as any possible production of InputElementDiv * and InputElementRegExp, see E5 Section 7 in its entirety. Note that * the E5 "Token" production does not cover all actual tokens of the * language (which is explicitly stated in the specification, Section 7.5). * Null and boolean literals are defined as part of both ReservedWord * (E5 Section 7.6.1) and Literal (E5 Section 7.8) productions. Here, * null and boolean values have literal tokens, and are not reserved * words. * * Decimal literal negative/positive sign is -not- part of DUK_TOK_NUMBER. * The number tokens always have a non-negative value. The unary minus * operator in "-1.0" is optimized during compilation to yield a single * negative constant. * * Token numbering is free except that reserved words are required to be * in a continuous range and in a particular order. See genstrings.py. */ #define DUK_LEXER_INITCTX(ctx) duk_lexer_initctx((ctx)) #define DUK_LEXER_SETPOINT(ctx,pt) duk_lexer_setpoint((ctx), (pt)) #define DUK_LEXER_GETPOINT(ctx,pt) duk_lexer_getpoint((ctx), (pt)) /* Currently 6 characters of lookup are actually needed (duk_lexer.c). */ #define DUK_LEXER_WINDOW_SIZE 6 #if defined(DUK_USE_LEXER_SLIDING_WINDOW) #define DUK_LEXER_BUFFER_SIZE 64 #endif #define DUK_TOK_MINVAL 0 /* returned after EOF (infinite amount) */ #define DUK_TOK_EOF 0 /* identifier names (E5 Section 7.6) */ #define DUK_TOK_IDENTIFIER 1 /* reserved words: keywords */ #define DUK_TOK_START_RESERVED 2 #define DUK_TOK_BREAK 2 #define DUK_TOK_CASE 3 #define DUK_TOK_CATCH 4 #define DUK_TOK_CONTINUE 5 #define DUK_TOK_DEBUGGER 6 #define DUK_TOK_DEFAULT 7 #define DUK_TOK_DELETE 8 #define DUK_TOK_DO 9 #define DUK_TOK_ELSE 10 #define DUK_TOK_FINALLY 11 #define DUK_TOK_FOR 12 #define DUK_TOK_FUNCTION 13 #define DUK_TOK_IF 14 #define DUK_TOK_IN 15 #define DUK_TOK_INSTANCEOF 16 #define DUK_TOK_NEW 17 #define DUK_TOK_RETURN 18 #define DUK_TOK_SWITCH 19 #define DUK_TOK_THIS 20 #define DUK_TOK_THROW 21 #define DUK_TOK_TRY 22 #define DUK_TOK_TYPEOF 23 #define DUK_TOK_VAR 24 #define DUK_TOK_CONST 25 #define DUK_TOK_VOID 26 #define DUK_TOK_WHILE 27 #define DUK_TOK_WITH 28 /* reserved words: future reserved words */ #define DUK_TOK_CLASS 29 #define DUK_TOK_ENUM 30 #define DUK_TOK_EXPORT 31 #define DUK_TOK_EXTENDS 32 #define DUK_TOK_IMPORT 33 #define DUK_TOK_SUPER 34 /* "null", "true", and "false" are always reserved words. * Note that "get" and "set" are not! */ #define DUK_TOK_NULL 35 #define DUK_TOK_TRUE 36 #define DUK_TOK_FALSE 37 /* reserved words: additional future reserved words in strict mode */ #define DUK_TOK_START_STRICT_RESERVED 38 /* inclusive */ #define DUK_TOK_IMPLEMENTS 38 #define DUK_TOK_INTERFACE 39 #define DUK_TOK_LET 40 #define DUK_TOK_PACKAGE 41 #define DUK_TOK_PRIVATE 42 #define DUK_TOK_PROTECTED 43 #define DUK_TOK_PUBLIC 44 #define DUK_TOK_STATIC 45 #define DUK_TOK_YIELD 46 #define DUK_TOK_END_RESERVED 47 /* exclusive */ /* "get" and "set" are tokens but NOT ReservedWords. They are currently * parsed and identifiers and these defines are actually now unused. */ #define DUK_TOK_GET 47 #define DUK_TOK_SET 48 /* punctuators (unlike the spec, also includes "/" and "/=") */ #define DUK_TOK_LCURLY 49 #define DUK_TOK_RCURLY 50 #define DUK_TOK_LBRACKET 51 #define DUK_TOK_RBRACKET 52 #define DUK_TOK_LPAREN 53 #define DUK_TOK_RPAREN 54 #define DUK_TOK_PERIOD 55 #define DUK_TOK_SEMICOLON 56 #define DUK_TOK_COMMA 57 #define DUK_TOK_LT 58 #define DUK_TOK_GT 59 #define DUK_TOK_LE 60 #define DUK_TOK_GE 61 #define DUK_TOK_EQ 62 #define DUK_TOK_NEQ 63 #define DUK_TOK_SEQ 64 #define DUK_TOK_SNEQ 65 #define DUK_TOK_ADD 66 #define DUK_TOK_SUB 67 #define DUK_TOK_MUL 68 #define DUK_TOK_DIV 69 #define DUK_TOK_MOD 70 #define DUK_TOK_EXP 71 #define DUK_TOK_INCREMENT 72 #define DUK_TOK_DECREMENT 73 #define DUK_TOK_ALSHIFT 74 /* named "arithmetic" because result is signed */ #define DUK_TOK_ARSHIFT 75 #define DUK_TOK_RSHIFT 76 #define DUK_TOK_BAND 77 #define DUK_TOK_BOR 78 #define DUK_TOK_BXOR 79 #define DUK_TOK_LNOT 80 #define DUK_TOK_BNOT 81 #define DUK_TOK_LAND 82 #define DUK_TOK_LOR 83 #define DUK_TOK_QUESTION 84 #define DUK_TOK_COLON 85 #define DUK_TOK_EQUALSIGN 86 #define DUK_TOK_ADD_EQ 87 #define DUK_TOK_SUB_EQ 88 #define DUK_TOK_MUL_EQ 89 #define DUK_TOK_DIV_EQ 90 #define DUK_TOK_MOD_EQ 91 #define DUK_TOK_EXP_EQ 92 #define DUK_TOK_ALSHIFT_EQ 93 #define DUK_TOK_ARSHIFT_EQ 94 #define DUK_TOK_RSHIFT_EQ 95 #define DUK_TOK_BAND_EQ 96 #define DUK_TOK_BOR_EQ 97 #define DUK_TOK_BXOR_EQ 98 /* literals (E5 Section 7.8), except null, true, false, which are treated * like reserved words (above). */ #define DUK_TOK_NUMBER 99 #define DUK_TOK_STRING 100 #define DUK_TOK_REGEXP 101 #define DUK_TOK_MAXVAL 101 /* inclusive */ #define DUK_TOK_INVALID DUK_SMALL_UINT_MAX /* Convert heap string index to a token (reserved words) */ #define DUK_STRIDX_TO_TOK(x) ((x) - DUK_STRIDX_START_RESERVED + DUK_TOK_START_RESERVED) /* Sanity check */ #if (DUK_TOK_MAXVAL > 255) #error DUK_TOK_MAXVAL too large, code assumes it fits into 8 bits #endif /* Sanity checks for string and token defines */ #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_BREAK) != DUK_TOK_BREAK) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_CASE) != DUK_TOK_CASE) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_CATCH) != DUK_TOK_CATCH) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_CONTINUE) != DUK_TOK_CONTINUE) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_DEBUGGER) != DUK_TOK_DEBUGGER) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_DEFAULT) != DUK_TOK_DEFAULT) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_DELETE) != DUK_TOK_DELETE) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_DO) != DUK_TOK_DO) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_ELSE) != DUK_TOK_ELSE) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_FINALLY) != DUK_TOK_FINALLY) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_FOR) != DUK_TOK_FOR) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_LC_FUNCTION) != DUK_TOK_FUNCTION) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_IF) != DUK_TOK_IF) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_IN) != DUK_TOK_IN) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_INSTANCEOF) != DUK_TOK_INSTANCEOF) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_NEW) != DUK_TOK_NEW) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_RETURN) != DUK_TOK_RETURN) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_SWITCH) != DUK_TOK_SWITCH) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_THIS) != DUK_TOK_THIS) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_THROW) != DUK_TOK_THROW) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_TRY) != DUK_TOK_TRY) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_TYPEOF) != DUK_TOK_TYPEOF) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_VAR) != DUK_TOK_VAR) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_VOID) != DUK_TOK_VOID) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_WHILE) != DUK_TOK_WHILE) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_WITH) != DUK_TOK_WITH) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_CLASS) != DUK_TOK_CLASS) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_CONST) != DUK_TOK_CONST) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_ENUM) != DUK_TOK_ENUM) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_EXPORT) != DUK_TOK_EXPORT) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_EXTENDS) != DUK_TOK_EXTENDS) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_IMPORT) != DUK_TOK_IMPORT) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_SUPER) != DUK_TOK_SUPER) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_LC_NULL) != DUK_TOK_NULL) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_TRUE) != DUK_TOK_TRUE) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_FALSE) != DUK_TOK_FALSE) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_IMPLEMENTS) != DUK_TOK_IMPLEMENTS) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_INTERFACE) != DUK_TOK_INTERFACE) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_LET) != DUK_TOK_LET) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_PACKAGE) != DUK_TOK_PACKAGE) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_PRIVATE) != DUK_TOK_PRIVATE) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_PROTECTED) != DUK_TOK_PROTECTED) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_PUBLIC) != DUK_TOK_PUBLIC) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_STATIC) != DUK_TOK_STATIC) #error mismatch in token defines #endif #if (DUK_STRIDX_TO_TOK(DUK_STRIDX_YIELD) != DUK_TOK_YIELD) #error mismatch in token defines #endif /* Regexp tokens */ #define DUK_RETOK_EOF 0 #define DUK_RETOK_DISJUNCTION 1 #define DUK_RETOK_QUANTIFIER 2 #define DUK_RETOK_ASSERT_START 3 #define DUK_RETOK_ASSERT_END 4 #define DUK_RETOK_ASSERT_WORD_BOUNDARY 5 #define DUK_RETOK_ASSERT_NOT_WORD_BOUNDARY 6 #define DUK_RETOK_ASSERT_START_POS_LOOKAHEAD 7 #define DUK_RETOK_ASSERT_START_NEG_LOOKAHEAD 8 #define DUK_RETOK_ATOM_PERIOD 9 #define DUK_RETOK_ATOM_CHAR 10 #define DUK_RETOK_ATOM_DIGIT 11 /* assumptions in regexp compiler */ #define DUK_RETOK_ATOM_NOT_DIGIT 12 /* -""- */ #define DUK_RETOK_ATOM_WHITE 13 /* -""- */ #define DUK_RETOK_ATOM_NOT_WHITE 14 /* -""- */ #define DUK_RETOK_ATOM_WORD_CHAR 15 /* -""- */ #define DUK_RETOK_ATOM_NOT_WORD_CHAR 16 /* -""- */ #define DUK_RETOK_ATOM_BACKREFERENCE 17 #define DUK_RETOK_ATOM_START_CAPTURE_GROUP 18 #define DUK_RETOK_ATOM_START_NONCAPTURE_GROUP 19 #define DUK_RETOK_ATOM_START_CHARCLASS 20 #define DUK_RETOK_ATOM_START_CHARCLASS_INVERTED 21 #define DUK_RETOK_ATOM_END_GROUP 22 /* Constants for duk_lexer_ctx.buf. */ #define DUK_LEXER_TEMP_BUF_LIMIT 256 /* A token value. Can be memcpy()'d, but note that slot1/slot2 values are on the valstack. * Some fields (like num, str1, str2) are only valid for specific token types and may have * stale values otherwise. */ struct duk_token { duk_small_uint_t t; /* token type (with reserved word identification) */ duk_small_uint_t t_nores; /* token type (with reserved words as DUK_TOK_IDENTIFER) */ duk_double_t num; /* numeric value of token */ duk_hstring *str1; /* string 1 of token (borrowed, stored to ctx->slot1_idx) */ duk_hstring *str2; /* string 2 of token (borrowed, stored to ctx->slot2_idx) */ duk_size_t start_offset; /* start byte offset of token in lexer input */ duk_int_t start_line; /* start line of token (first char) */ duk_int_t num_escapes; /* number of escapes and line continuations (for directive prologue) */ duk_bool_t lineterm; /* token was preceded by a lineterm */ duk_bool_t allow_auto_semi; /* token allows automatic semicolon insertion (eof or preceded by newline) */ }; #define DUK_RE_QUANTIFIER_INFINITE ((duk_uint32_t) 0xffffffffUL) /* A regexp token value. */ struct duk_re_token { duk_small_uint_t t; /* token type */ duk_small_uint_t greedy; duk_uint32_t num; /* numeric value (character, count) */ duk_uint32_t qmin; duk_uint32_t qmax; }; /* A structure for 'snapshotting' a point for rewinding */ struct duk_lexer_point { duk_size_t offset; duk_int_t line; }; /* Lexer codepoint with additional info like offset/line number */ struct duk_lexer_codepoint { duk_codepoint_t codepoint; duk_size_t offset; duk_int_t line; }; /* Lexer context. Same context is used for Ecmascript and Regexp parsing. */ struct duk_lexer_ctx { #if defined(DUK_USE_LEXER_SLIDING_WINDOW) duk_lexer_codepoint *window; /* unicode code points, window[0] is always next, points to 'buffer' */ duk_lexer_codepoint buffer[DUK_LEXER_BUFFER_SIZE]; #else duk_lexer_codepoint window[DUK_LEXER_WINDOW_SIZE]; /* unicode code points, window[0] is always next */ #endif duk_hthread *thr; /* thread; minimizes argument passing */ const duk_uint8_t *input; /* input string (may be a user pointer) */ duk_size_t input_length; /* input byte length */ duk_size_t input_offset; /* input offset for window leading edge (not window[0]) */ duk_int_t input_line; /* input linenumber at input_offset (not window[0]), init to 1 */ duk_idx_t slot1_idx; /* valstack slot for 1st token value */ duk_idx_t slot2_idx; /* valstack slot for 2nd token value */ duk_idx_t buf_idx; /* valstack slot for temp buffer */ duk_hbuffer_dynamic *buf; /* temp accumulation buffer */ duk_bufwriter_ctx bw; /* bufwriter for temp accumulation */ duk_int_t token_count; /* number of tokens parsed */ duk_int_t token_limit; /* maximum token count before error (sanity backstop) */ duk_small_uint_t flags; /* lexer flags, use compiler flag defines for now */ }; /* * Prototypes */ DUK_INTERNAL_DECL void duk_lexer_initctx(duk_lexer_ctx *lex_ctx); DUK_INTERNAL_DECL void duk_lexer_getpoint(duk_lexer_ctx *lex_ctx, duk_lexer_point *pt); DUK_INTERNAL_DECL void duk_lexer_setpoint(duk_lexer_ctx *lex_ctx, duk_lexer_point *pt); DUK_INTERNAL_DECL void duk_lexer_parse_js_input_element(duk_lexer_ctx *lex_ctx, duk_token *out_token, duk_bool_t strict_mode, duk_bool_t regexp_mode); #if defined(DUK_USE_REGEXP_SUPPORT) DUK_INTERNAL_DECL void duk_lexer_parse_re_token(duk_lexer_ctx *lex_ctx, duk_re_token *out_token); DUK_INTERNAL_DECL void duk_lexer_parse_re_ranges(duk_lexer_ctx *lex_ctx, duk_re_range_callback gen_range, void *userdata); #endif /* DUK_USE_REGEXP_SUPPORT */ #endif /* DUK_LEXER_H_INCLUDED */ /* #include duk_js_compiler.h */ #line 1 "duk_js_compiler.h" /* * Ecmascript compiler. */ #if !defined(DUK_JS_COMPILER_H_INCLUDED) #define DUK_JS_COMPILER_H_INCLUDED /* ecmascript compiler limits */ #define DUK_COMPILER_TOKEN_LIMIT 100000000L /* 1e8: protects against deeply nested inner functions */ /* maximum loopcount for peephole optimization */ #define DUK_COMPILER_PEEPHOLE_MAXITER 3 /* maximum bytecode length in instructions */ #define DUK_COMPILER_MAX_BYTECODE_LENGTH (256L * 1024L * 1024L) /* 1 GB */ /* * Compiler intermediate values * * Intermediate values describe either plain values (e.g. strings or * numbers) or binary operations which have not yet been coerced into * either a left-hand-side or right-hand-side role (e.g. object property). */ #define DUK_IVAL_NONE 0 /* no value */ #define DUK_IVAL_PLAIN 1 /* register, constant, or value */ #define DUK_IVAL_ARITH 2 /* binary arithmetic; DUK_OP_ADD, DUK_OP_EQ, other binary ops */ #define DUK_IVAL_PROP 3 /* property access */ #define DUK_IVAL_VAR 4 /* variable access */ #define DUK_ISPEC_NONE 0 /* no value */ #define DUK_ISPEC_VALUE 1 /* value resides in 'valstack_idx' */ #define DUK_ISPEC_REGCONST 2 /* value resides in a register or constant */ /* Bit mask which indicates that a regconst is a constant instead of a register. * Chosen so that when a regconst is cast to duk_int32_t, all consts are * negative values. */ #define DUK_REGCONST_CONST_MARKER DUK_INT32_MIN /* = -0x80000000 */ /* Type to represent a reg/const reference during compilation, with <0 * indicating a constant. Some call sites also use -1 to indicate 'none'. */ typedef duk_int32_t duk_regconst_t; typedef struct { duk_small_uint_t t; /* DUK_ISPEC_XXX */ duk_regconst_t regconst; duk_idx_t valstack_idx; /* always set; points to a reserved valstack slot */ } duk_ispec; typedef struct { /* * PLAIN: x1 * ARITH: x1 <op> x2 * PROP: x1.x2 * VAR: x1 (name) */ /* XXX: can be optimized for smaller footprint esp. on 32-bit environments */ duk_small_uint_t t; /* DUK_IVAL_XXX */ duk_small_uint_t op; /* bytecode opcode for binary ops */ duk_ispec x1; duk_ispec x2; } duk_ivalue; /* * Bytecode instruction representation during compilation * * Contains the actual instruction and (optionally) debug info. */ struct duk_compiler_instr { duk_instr_t ins; #if defined(DUK_USE_PC2LINE) duk_uint32_t line; #endif }; /* * Compiler state */ #define DUK_LABEL_FLAG_ALLOW_BREAK (1U << 0) #define DUK_LABEL_FLAG_ALLOW_CONTINUE (1U << 1) #define DUK_DECL_TYPE_VAR 0 #define DUK_DECL_TYPE_FUNC 1 /* XXX: optimize to 16 bytes */ typedef struct { duk_small_uint_t flags; duk_int_t label_id; /* numeric label_id (-1 reserved as marker) */ duk_hstring *h_label; /* borrowed label name */ duk_int_t catch_depth; /* catch depth at point of definition */ duk_int_t pc_label; /* pc of label statement: * pc+1: break jump site * pc+2: continue jump site */ /* Fast jumps (which avoid longjmp) jump directly to the jump sites * which are always known even while the iteration/switch statement * is still being parsed. A final peephole pass "straightens out" * the jumps. */ } duk_labelinfo; /* Compiling state of one function, eventually converted to duk_hcompfunc */ struct duk_compiler_func { /* These pointers are at the start of the struct so that they pack * nicely. Mixing pointers and integer values is bad on some * platforms (e.g. if int is 32 bits and pointers are 64 bits). */ duk_bufwriter_ctx bw_code; /* bufwriter for code */ duk_hstring *h_name; /* function name (borrowed reference), ends up in _name */ /* h_code: held in bw_code */ duk_hobject *h_consts; /* array */ duk_hobject *h_funcs; /* array of function templates: [func1, offset1, line1, func2, offset2, line2] * offset/line points to closing brace to allow skipping on pass 2 */ duk_hobject *h_decls; /* array of declarations: [ name1, val1, name2, val2, ... ] * valN = (typeN) | (fnum << 8), where fnum is inner func number (0 for vars) * record function and variable declarations in pass 1 */ duk_hobject *h_labelnames; /* array of active label names */ duk_hbuffer_dynamic *h_labelinfos; /* C array of duk_labelinfo */ duk_hobject *h_argnames; /* array of formal argument names (-> _Formals) */ duk_hobject *h_varmap; /* variable map for pass 2 (identifier -> register number or null (unmapped)) */ /* Value stack indices for tracking objects. */ /* code_idx: not needed */ duk_idx_t consts_idx; duk_idx_t funcs_idx; duk_idx_t decls_idx; duk_idx_t labelnames_idx; duk_idx_t labelinfos_idx; duk_idx_t argnames_idx; duk_idx_t varmap_idx; /* Temp reg handling. */ duk_regconst_t temp_first; /* first register that is a temporary (below: variables) */ duk_regconst_t temp_next; /* next temporary register to allocate */ duk_regconst_t temp_max; /* highest value of temp_reg (temp_max - 1 is highest used reg) */ /* Shuffle registers if large number of regs/consts. */ duk_regconst_t shuffle1; duk_regconst_t shuffle2; duk_regconst_t shuffle3; /* Stats for current expression being parsed. */ duk_int_t nud_count; duk_int_t led_count; duk_int_t paren_level; /* parenthesis count, 0 = top level */ duk_bool_t expr_lhs; /* expression is left-hand-side compatible */ duk_bool_t allow_in; /* current paren level allows 'in' token */ /* Misc. */ duk_int_t stmt_next; /* statement id allocation (running counter) */ duk_int_t label_next; /* label id allocation (running counter) */ duk_int_t catch_depth; /* catch stack depth */ duk_int_t with_depth; /* with stack depth (affects identifier lookups) */ duk_int_t fnum_next; /* inner function numbering */ duk_int_t num_formals; /* number of formal arguments */ duk_regconst_t reg_stmt_value; /* register for writing value of 'non-empty' statements (global or eval code), -1 is marker */ #if defined(DUK_USE_DEBUGGER_SUPPORT) duk_int_t min_line; /* XXX: typing (duk_hcompfunc has duk_uint32_t) */ duk_int_t max_line; #endif /* Status booleans. */ duk_uint8_t is_function; /* is an actual function (not global/eval code) */ duk_uint8_t is_eval; /* is eval code */ duk_uint8_t is_global; /* is global code */ duk_uint8_t is_namebinding; /* needs a name binding */ duk_uint8_t is_constructable; /* result is constructable */ duk_uint8_t is_setget; /* is a setter/getter */ duk_uint8_t is_strict; /* function is strict */ duk_uint8_t is_notail; /* function must not be tail called */ duk_uint8_t in_directive_prologue; /* parsing in "directive prologue", recognize directives */ duk_uint8_t in_scanning; /* parsing in "scanning" phase (first pass) */ duk_uint8_t may_direct_eval; /* function may call direct eval */ duk_uint8_t id_access_arguments; /* function refers to 'arguments' identifier */ duk_uint8_t id_access_slow; /* function makes one or more slow path accesses that won't match own static variables */ duk_uint8_t id_access_slow_own; /* function makes one or more slow path accesses that may match own static variables */ duk_uint8_t is_arguments_shadowed; /* argument/function declaration shadows 'arguments' */ duk_uint8_t needs_shuffle; /* function needs shuffle registers */ duk_uint8_t reject_regexp_in_adv; /* reject RegExp literal on next advance() call; needed for handling IdentifierName productions */ }; struct duk_compiler_ctx { duk_hthread *thr; /* filename being compiled (ends up in functions' '_filename' property) */ duk_hstring *h_filename; /* borrowed reference */ /* lexing (tokenization) state (contains two valstack slot indices) */ duk_lexer_ctx lex; /* current and previous token for parsing */ duk_token prev_token; duk_token curr_token; duk_idx_t tok11_idx; /* curr_token slot1 (matches 'lex' slot1_idx) */ duk_idx_t tok12_idx; /* curr_token slot2 (matches 'lex' slot2_idx) */ duk_idx_t tok21_idx; /* prev_token slot1 */ duk_idx_t tok22_idx; /* prev_token slot2 */ /* recursion limit */ duk_int_t recursion_depth; duk_int_t recursion_limit; /* code emission temporary */ duk_int_t emit_jumpslot_pc; /* current function being compiled (embedded instead of pointer for more compact access) */ duk_compiler_func curr_func; }; /* * Prototypes */ DUK_INTERNAL_DECL void duk_js_compile(duk_hthread *thr, const duk_uint8_t *src_buffer, duk_size_t src_length, duk_small_uint_t flags); #endif /* DUK_JS_COMPILER_H_INCLUDED */ /* #include duk_regexp.h */ #line 1 "duk_regexp.h" /* * Regular expression structs, constants, and bytecode defines. */ #if !defined(DUK_REGEXP_H_INCLUDED) #define DUK_REGEXP_H_INCLUDED /* maximum bytecode copies for {n,m} quantifiers */ #define DUK_RE_MAX_ATOM_COPIES 1000 /* regexp compilation limits */ #define DUK_RE_COMPILE_TOKEN_LIMIT 100000000L /* 1e8 */ /* regexp execution limits */ #define DUK_RE_EXECUTE_STEPS_LIMIT 1000000000L /* 1e9 */ /* regexp opcodes */ #define DUK_REOP_MATCH 1 #define DUK_REOP_CHAR 2 #define DUK_REOP_PERIOD 3 #define DUK_REOP_RANGES 4 #define DUK_REOP_INVRANGES 5 #define DUK_REOP_JUMP 6 #define DUK_REOP_SPLIT1 7 #define DUK_REOP_SPLIT2 8 #define DUK_REOP_SQMINIMAL 9 #define DUK_REOP_SQGREEDY 10 #define DUK_REOP_SAVE 11 #define DUK_REOP_WIPERANGE 12 #define DUK_REOP_LOOKPOS 13 #define DUK_REOP_LOOKNEG 14 #define DUK_REOP_BACKREFERENCE 15 #define DUK_REOP_ASSERT_START 16 #define DUK_REOP_ASSERT_END 17 #define DUK_REOP_ASSERT_WORD_BOUNDARY 18 #define DUK_REOP_ASSERT_NOT_WORD_BOUNDARY 19 /* flags */ #define DUK_RE_FLAG_GLOBAL (1U << 0) #define DUK_RE_FLAG_IGNORE_CASE (1U << 1) #define DUK_RE_FLAG_MULTILINE (1U << 2) struct duk_re_matcher_ctx { duk_hthread *thr; duk_uint32_t re_flags; const duk_uint8_t *input; const duk_uint8_t *input_end; const duk_uint8_t *bytecode; const duk_uint8_t *bytecode_end; const duk_uint8_t **saved; /* allocated from valstack (fixed buffer) */ duk_uint32_t nsaved; duk_uint32_t recursion_depth; duk_uint32_t recursion_limit; duk_uint32_t steps_count; duk_uint32_t steps_limit; }; struct duk_re_compiler_ctx { duk_hthread *thr; duk_uint32_t re_flags; duk_lexer_ctx lex; duk_re_token curr_token; duk_bufwriter_ctx bw; duk_uint32_t captures; /* highest capture number emitted so far (used as: ++captures) */ duk_uint32_t highest_backref; duk_uint32_t recursion_depth; duk_uint32_t recursion_limit; duk_uint32_t nranges; /* internal temporary value, used for char classes */ }; /* * Prototypes */ #if defined(DUK_USE_REGEXP_SUPPORT) DUK_INTERNAL_DECL void duk_regexp_compile(duk_hthread *thr); DUK_INTERNAL_DECL void duk_regexp_create_instance(duk_hthread *thr); DUK_INTERNAL_DECL void duk_regexp_match(duk_hthread *thr); DUK_INTERNAL_DECL void duk_regexp_match_force_global(duk_hthread *thr); /* hacky helper for String.prototype.split() */ #endif #endif /* DUK_REGEXP_H_INCLUDED */ /* #include duk_heaphdr.h */ #line 1 "duk_heaphdr.h" /* * Heap header definition and assorted macros, including ref counting. * Access all fields through the accessor macros. */ #if !defined(DUK_HEAPHDR_H_INCLUDED) #define DUK_HEAPHDR_H_INCLUDED /* * Common heap header * * All heap objects share the same flags and refcount fields. Objects other * than strings also need to have a single or double linked list pointers * for insertion into the "heap allocated" list. Strings have single linked * list pointers for string table chaining. * * Technically, 'h_refcount' must be wide enough to guarantee that it cannot * wrap; otherwise objects might be freed incorrectly after wrapping. The * default refcount field is 32 bits even on 64-bit systems: while that's in * theory incorrect, the Duktape heap needs to be larger than 64GB for the * count to actually wrap (assuming 16-byte duk_tvals). This is very unlikely * to ever be an issue, but if it is, disabling DUK_USE_REFCOUNT32 causes * Duktape to use size_t for refcounts which should always be safe. * * Heap header size on 32-bit platforms: 8 bytes without reference counting, * 16 bytes with reference counting. * * Note that 'raw' macros such as DUK_HEAPHDR_GET_REFCOUNT() are not * defined without DUK_USE_REFERENCE_COUNTING, so caller must #if defined() * around them. */ /* XXX: macro for shared header fields (avoids some padding issues) */ struct duk_heaphdr { duk_uint32_t h_flags; #if defined(DUK_USE_REFERENCE_COUNTING) #if defined(DUK_USE_ASSERTIONS) /* When assertions enabled, used by mark-and-sweep for refcount * validation. Largest reasonable type; also detects overflows. */ duk_size_t h_assert_refcount; #endif #if defined(DUK_USE_REFCOUNT16) duk_uint16_t h_refcount; #elif defined(DUK_USE_REFCOUNT32) duk_uint32_t h_refcount; #else duk_size_t h_refcount; #endif #endif /* DUK_USE_REFERENCE_COUNTING */ #if defined(DUK_USE_HEAPPTR16) duk_uint16_t h_next16; #else duk_heaphdr *h_next; #endif #if defined(DUK_USE_DOUBLE_LINKED_HEAP) /* refcounting requires direct heap frees, which in turn requires a dual linked heap */ #if defined(DUK_USE_HEAPPTR16) duk_uint16_t h_prev16; #else duk_heaphdr *h_prev; #endif #endif /* When DUK_USE_HEAPPTR16 (and DUK_USE_REFCOUNT16) is in use, the * struct won't align nicely to 4 bytes. This 16-bit extra field * is added to make the alignment clean; the field can be used by * heap objects when 16-bit packing is used. This field is now * conditional to DUK_USE_HEAPPTR16 only, but it is intended to be * used with DUK_USE_REFCOUNT16 and DUK_USE_DOUBLE_LINKED_HEAP; * this only matter to low memory environments anyway. */ #if defined(DUK_USE_HEAPPTR16) duk_uint16_t h_extra16; #endif }; struct duk_heaphdr_string { /* 16 bits would be enough for shared heaphdr flags and duk_hstring * flags. The initial parts of duk_heaphdr_string and duk_heaphdr * must match so changing the flags field size here would be quite * awkward. However, to minimize struct size, we can pack at least * 16 bits of duk_hstring data into the flags field. */ duk_uint32_t h_flags; #if defined(DUK_USE_REFERENCE_COUNTING) #if defined(DUK_USE_ASSERTIONS) /* When assertions enabled, used by mark-and-sweep for refcount * validation. Largest reasonable type; also detects overflows. */ duk_size_t h_assert_refcount; #endif #if defined(DUK_USE_REFCOUNT16) duk_uint16_t h_refcount; duk_uint16_t h_strextra16; /* round out to 8 bytes */ #elif defined(DUK_USE_REFCOUNT32) duk_uint32_t h_refcount; #else duk_size_t h_refcount; #endif #else duk_uint16_t h_strextra16; #endif /* DUK_USE_REFERENCE_COUNTING */ duk_hstring *h_next; /* No 'h_prev' pointer for strings. */ }; #define DUK_HEAPHDR_FLAGS_TYPE_MASK 0x00000003UL #define DUK_HEAPHDR_FLAGS_FLAG_MASK (~DUK_HEAPHDR_FLAGS_TYPE_MASK) /* 2 bits for heap type */ #define DUK_HEAPHDR_FLAGS_HEAP_START 2 /* 5 heap flags */ #define DUK_HEAPHDR_FLAGS_USER_START 7 /* 25 user flags */ #define DUK_HEAPHDR_HEAP_FLAG_NUMBER(n) (DUK_HEAPHDR_FLAGS_HEAP_START + (n)) #define DUK_HEAPHDR_USER_FLAG_NUMBER(n) (DUK_HEAPHDR_FLAGS_USER_START + (n)) #define DUK_HEAPHDR_HEAP_FLAG(n) (1UL << (DUK_HEAPHDR_FLAGS_HEAP_START + (n))) #define DUK_HEAPHDR_USER_FLAG(n) (1UL << (DUK_HEAPHDR_FLAGS_USER_START + (n))) #define DUK_HEAPHDR_FLAG_REACHABLE DUK_HEAPHDR_HEAP_FLAG(0) /* mark-and-sweep: reachable */ #define DUK_HEAPHDR_FLAG_TEMPROOT DUK_HEAPHDR_HEAP_FLAG(1) /* mark-and-sweep: children not processed */ #define DUK_HEAPHDR_FLAG_FINALIZABLE DUK_HEAPHDR_HEAP_FLAG(2) /* mark-and-sweep: finalizable (on current pass) */ #define DUK_HEAPHDR_FLAG_FINALIZED DUK_HEAPHDR_HEAP_FLAG(3) /* mark-and-sweep: finalized (on previous pass) */ #define DUK_HEAPHDR_FLAG_READONLY DUK_HEAPHDR_HEAP_FLAG(4) /* read-only object, in code section */ #define DUK_HTYPE_MIN 0 #define DUK_HTYPE_STRING 0 #define DUK_HTYPE_OBJECT 1 #define DUK_HTYPE_BUFFER 2 #define DUK_HTYPE_MAX 2 #if defined(DUK_USE_HEAPPTR16) #define DUK_HEAPHDR_GET_NEXT(heap,h) \ ((duk_heaphdr *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->h_next16)) #define DUK_HEAPHDR_SET_NEXT(heap,h,val) do { \ (h)->h_next16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) val); \ } while (0) #else #define DUK_HEAPHDR_GET_NEXT(heap,h) ((h)->h_next) #define DUK_HEAPHDR_SET_NEXT(heap,h,val) do { \ (h)->h_next = (val); \ } while (0) #endif #if defined(DUK_USE_DOUBLE_LINKED_HEAP) #if defined(DUK_USE_HEAPPTR16) #define DUK_HEAPHDR_GET_PREV(heap,h) \ ((duk_heaphdr *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->h_prev16)) #define DUK_HEAPHDR_SET_PREV(heap,h,val) do { \ (h)->h_prev16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (val)); \ } while (0) #else #define DUK_HEAPHDR_GET_PREV(heap,h) ((h)->h_prev) #define DUK_HEAPHDR_SET_PREV(heap,h,val) do { \ (h)->h_prev = (val); \ } while (0) #endif #endif #if defined(DUK_USE_REFERENCE_COUNTING) #define DUK_HEAPHDR_GET_REFCOUNT(h) ((h)->h_refcount) #define DUK_HEAPHDR_SET_REFCOUNT(h,val) do { \ (h)->h_refcount = (val); \ DUK_ASSERT((h)->h_refcount == (val)); /* No truncation. */ \ } while (0) #define DUK_HEAPHDR_PREINC_REFCOUNT(h) (++(h)->h_refcount) /* result: updated refcount */ #define DUK_HEAPHDR_PREDEC_REFCOUNT(h) (--(h)->h_refcount) /* result: updated refcount */ #else /* refcount macros not defined without refcounting, caller must #if defined() now */ #endif /* DUK_USE_REFERENCE_COUNTING */ /* * Note: type is treated as a field separate from flags, so some masking is * involved in the macros below. */ #define DUK_HEAPHDR_GET_FLAGS_RAW(h) ((h)->h_flags) #define DUK_HEAPHDR_SET_FLAGS_RAW(h,val) do { \ (h)->h_flags = (val); } \ } #define DUK_HEAPHDR_GET_FLAGS(h) ((h)->h_flags & DUK_HEAPHDR_FLAGS_FLAG_MASK) #define DUK_HEAPHDR_SET_FLAGS(h,val) do { \ (h)->h_flags = ((h)->h_flags & ~(DUK_HEAPHDR_FLAGS_FLAG_MASK)) | (val); \ } while (0) #define DUK_HEAPHDR_GET_TYPE(h) ((h)->h_flags & DUK_HEAPHDR_FLAGS_TYPE_MASK) #define DUK_HEAPHDR_SET_TYPE(h,val) do { \ (h)->h_flags = ((h)->h_flags & ~(DUK_HEAPHDR_FLAGS_TYPE_MASK)) | (val); \ } while (0) /* Comparison for type >= DUK_HTYPE_MIN skipped; because DUK_HTYPE_MIN is zero * and the comparison is unsigned, it's always true and generates warnings. */ #define DUK_HEAPHDR_HTYPE_VALID(h) ( \ DUK_HEAPHDR_GET_TYPE((h)) <= DUK_HTYPE_MAX \ ) #define DUK_HEAPHDR_SET_TYPE_AND_FLAGS(h,tval,fval) do { \ (h)->h_flags = ((tval) & DUK_HEAPHDR_FLAGS_TYPE_MASK) | \ ((fval) & DUK_HEAPHDR_FLAGS_FLAG_MASK); \ } while (0) #define DUK_HEAPHDR_SET_FLAG_BITS(h,bits) do { \ DUK_ASSERT(((bits) & ~(DUK_HEAPHDR_FLAGS_FLAG_MASK)) == 0); \ (h)->h_flags |= (bits); \ } while (0) #define DUK_HEAPHDR_CLEAR_FLAG_BITS(h,bits) do { \ DUK_ASSERT(((bits) & ~(DUK_HEAPHDR_FLAGS_FLAG_MASK)) == 0); \ (h)->h_flags &= ~((bits)); \ } while (0) #define DUK_HEAPHDR_CHECK_FLAG_BITS(h,bits) (((h)->h_flags & (bits)) != 0) #define DUK_HEAPHDR_SET_REACHABLE(h) DUK_HEAPHDR_SET_FLAG_BITS((h),DUK_HEAPHDR_FLAG_REACHABLE) #define DUK_HEAPHDR_CLEAR_REACHABLE(h) DUK_HEAPHDR_CLEAR_FLAG_BITS((h),DUK_HEAPHDR_FLAG_REACHABLE) #define DUK_HEAPHDR_HAS_REACHABLE(h) DUK_HEAPHDR_CHECK_FLAG_BITS((h),DUK_HEAPHDR_FLAG_REACHABLE) #define DUK_HEAPHDR_SET_TEMPROOT(h) DUK_HEAPHDR_SET_FLAG_BITS((h),DUK_HEAPHDR_FLAG_TEMPROOT) #define DUK_HEAPHDR_CLEAR_TEMPROOT(h) DUK_HEAPHDR_CLEAR_FLAG_BITS((h),DUK_HEAPHDR_FLAG_TEMPROOT) #define DUK_HEAPHDR_HAS_TEMPROOT(h) DUK_HEAPHDR_CHECK_FLAG_BITS((h),DUK_HEAPHDR_FLAG_TEMPROOT) #define DUK_HEAPHDR_SET_FINALIZABLE(h) DUK_HEAPHDR_SET_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZABLE) #define DUK_HEAPHDR_CLEAR_FINALIZABLE(h) DUK_HEAPHDR_CLEAR_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZABLE) #define DUK_HEAPHDR_HAS_FINALIZABLE(h) DUK_HEAPHDR_CHECK_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZABLE) #define DUK_HEAPHDR_SET_FINALIZED(h) DUK_HEAPHDR_SET_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZED) #define DUK_HEAPHDR_CLEAR_FINALIZED(h) DUK_HEAPHDR_CLEAR_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZED) #define DUK_HEAPHDR_HAS_FINALIZED(h) DUK_HEAPHDR_CHECK_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZED) #define DUK_HEAPHDR_SET_READONLY(h) DUK_HEAPHDR_SET_FLAG_BITS((h),DUK_HEAPHDR_FLAG_READONLY) #define DUK_HEAPHDR_CLEAR_READONLY(h) DUK_HEAPHDR_CLEAR_FLAG_BITS((h),DUK_HEAPHDR_FLAG_READONLY) #define DUK_HEAPHDR_HAS_READONLY(h) DUK_HEAPHDR_CHECK_FLAG_BITS((h),DUK_HEAPHDR_FLAG_READONLY) /* get or set a range of flags; m=first bit number, n=number of bits */ #define DUK_HEAPHDR_GET_FLAG_RANGE(h,m,n) (((h)->h_flags >> (m)) & ((1UL << (n)) - 1UL)) #define DUK_HEAPHDR_SET_FLAG_RANGE(h,m,n,v) do { \ (h)->h_flags = \ ((h)->h_flags & (~(((1UL << (n)) - 1UL) << (m)))) \ | ((v) << (m)); \ } while (0) /* init pointer fields to null */ #if defined(DUK_USE_DOUBLE_LINKED_HEAP) #define DUK_HEAPHDR_INIT_NULLS(h) do { \ DUK_HEAPHDR_SET_NEXT((h), (void *) NULL); \ DUK_HEAPHDR_SET_PREV((h), (void *) NULL); \ } while (0) #else #define DUK_HEAPHDR_INIT_NULLS(h) do { \ DUK_HEAPHDR_SET_NEXT((h), (void *) NULL); \ } while (0) #endif #define DUK_HEAPHDR_STRING_INIT_NULLS(h) do { \ (h)->h_next = NULL; \ } while (0) /* * Type tests */ /* Take advantage of the fact that for DUK_HTYPE_xxx numbers the lowest bit * is only set for DUK_HTYPE_OBJECT (= 1). */ #if 0 #define DUK_HEAPHDR_IS_OBJECT(h) (DUK_HEAPHDR_GET_TYPE((h)) == DUK_HTYPE_OBJECT) #endif #define DUK_HEAPHDR_IS_OBJECT(h) ((h)->h_flags & 0x01UL) #define DUK_HEAPHDR_IS_STRING(h) (DUK_HEAPHDR_GET_TYPE((h)) == DUK_HTYPE_STRING) #define DUK_HEAPHDR_IS_BUFFER(h) (DUK_HEAPHDR_GET_TYPE((h)) == DUK_HTYPE_BUFFER) /* * Assert helpers */ /* Check that prev/next links are consistent: if e.g. h->prev is != NULL, * h->prev->next should point back to h. */ #if defined(DUK_USE_DOUBLE_LINKED_HEAP) && defined(DUK_USE_ASSERTIONS) #define DUK_ASSERT_HEAPHDR_LINKS(heap,h) do { \ if ((h) != NULL) { \ duk_heaphdr *h__prev, *h__next; \ h__prev = DUK_HEAPHDR_GET_PREV((heap), (h)); \ h__next = DUK_HEAPHDR_GET_NEXT((heap), (h)); \ DUK_ASSERT(h__prev == NULL || (DUK_HEAPHDR_GET_NEXT((heap), h__prev) == (h))); \ DUK_ASSERT(h__next == NULL || (DUK_HEAPHDR_GET_PREV((heap), h__next) == (h))); \ } \ } while (0) #else #define DUK_ASSERT_HEAPHDR_LINKS(heap,h) do {} while (0) #endif #define DUK_ASSERT_HEAPHDR_VALID(h) do { \ DUK_ASSERT((h) != NULL); \ DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID((h))); \ } while (0) #endif /* DUK_HEAPHDR_H_INCLUDED */ /* #include duk_refcount.h */ #line 1 "duk_refcount.h" /* * Reference counting helper macros. The macros take a thread argument * and must thus always be executed in a specific thread context. The * thread argument is not really needed anymore: DECREF can operate with * a heap pointer only, and INCREF needs neither. */ #if !defined(DUK_REFCOUNT_H_INCLUDED) #define DUK_REFCOUNT_H_INCLUDED #if defined(DUK_USE_REFERENCE_COUNTING) #if defined(DUK_USE_ROM_OBJECTS) /* With ROM objects "needs refcount update" is true when the value is * heap allocated and is not a ROM object. */ /* XXX: double evaluation for 'tv' argument. */ #define DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv) \ (DUK_TVAL_IS_HEAP_ALLOCATED((tv)) && !DUK_HEAPHDR_HAS_READONLY(DUK_TVAL_GET_HEAPHDR((tv)))) #define DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE(h) (!DUK_HEAPHDR_HAS_READONLY((h))) #else /* DUK_USE_ROM_OBJECTS */ /* Without ROM objects "needs refcount update" == is heap allocated. */ #define DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv) DUK_TVAL_IS_HEAP_ALLOCATED((tv)) #define DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE(h) 1 #endif /* DUK_USE_ROM_OBJECTS */ /* Fast variants, inline refcount operations except for refzero handling. * Can be used explicitly when speed is always more important than size. * For a good compiler and a single file build, these are basically the * same as a forced inline. */ #define DUK_TVAL_INCREF_FAST(thr,tv) do { \ duk_tval *duk__tv = (tv); \ DUK_ASSERT(duk__tv != NULL); \ if (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(duk__tv)) { \ duk_heaphdr *duk__h = DUK_TVAL_GET_HEAPHDR(duk__tv); \ DUK_ASSERT(duk__h != NULL); \ DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(duk__h)); \ DUK_HEAPHDR_PREINC_REFCOUNT(duk__h); \ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(duk__h) != 0); /* No wrapping. */ \ } \ } while (0) #define DUK_TVAL_DECREF_FAST(thr,tv) do { \ duk_tval *duk__tv = (tv); \ DUK_ASSERT(duk__tv != NULL); \ if (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(duk__tv)) { \ duk_heaphdr *duk__h = DUK_TVAL_GET_HEAPHDR(duk__tv); \ DUK_ASSERT(duk__h != NULL); \ DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(duk__h)); \ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(duk__h) > 0); \ if (DUK_HEAPHDR_PREDEC_REFCOUNT(duk__h) == 0) { \ duk_heaphdr_refzero((thr), duk__h); \ } \ } \ } while (0) #define DUK_TVAL_DECREF_NORZ_FAST(thr,tv) do { \ duk_tval *duk__tv = (tv); \ DUK_ASSERT(duk__tv != NULL); \ if (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(duk__tv)) { \ duk_heaphdr *duk__h = DUK_TVAL_GET_HEAPHDR(duk__tv); \ DUK_ASSERT(duk__h != NULL); \ DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(duk__h)); \ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(duk__h) > 0); \ if (DUK_HEAPHDR_PREDEC_REFCOUNT(duk__h) == 0) { \ duk_heaphdr_refzero_norz((thr), duk__h); \ } \ } \ } while (0) #define DUK_HEAPHDR_INCREF_FAST(thr,h) do { \ duk_heaphdr *duk__h = (duk_heaphdr *) (h); \ DUK_ASSERT(duk__h != NULL); \ DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(duk__h)); \ if (DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE(duk__h)) { \ DUK_HEAPHDR_PREINC_REFCOUNT(duk__h); \ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(duk__h) != 0); /* No wrapping. */ \ } \ } while (0) #define DUK_HEAPHDR_DECREF_FAST_RAW(thr,h,rzcall,rzcast) do { \ duk_heaphdr *duk__h = (duk_heaphdr *) (h); \ DUK_ASSERT(duk__h != NULL); \ DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(duk__h)); \ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(duk__h) > 0); \ if (DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE(duk__h)) { \ if (DUK_HEAPHDR_PREDEC_REFCOUNT(duk__h) == 0) { \ (rzcall)((thr), (rzcast) duk__h); \ } \ } \ } while (0) #define DUK_HEAPHDR_DECREF_FAST(thr,h) \ DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_heaphdr_refzero,duk_heaphdr *) #define DUK_HEAPHDR_DECREF_NORZ_FAST(thr,h) \ DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_heaphdr_refzero_norz,duk_heaphdr *) /* Slow variants, call to a helper to reduce code size. * Can be used explicitly when size is always more important than speed. */ #define DUK_TVAL_INCREF_SLOW(thr,tv) do { duk_tval_incref((tv)); } while (0) #define DUK_TVAL_DECREF_SLOW(thr,tv) do { duk_tval_decref((thr), (tv)); } while (0) #define DUK_TVAL_DECREF_NORZ_SLOW(thr,tv) do { duk_tval_decref_norz((thr), (tv)); } while (0) #define DUK_HEAPHDR_INCREF_SLOW(thr,h) do { duk_heaphdr_incref((duk_heaphdr *) (h)); } while (0) #define DUK_HEAPHDR_DECREF_SLOW(thr,h) do { duk_heaphdr_decref((thr), (duk_heaphdr *) (h)); } while (0) #define DUK_HEAPHDR_DECREF_NORZ_SLOW(thr,h) do { duk_heaphdr_decref_norz((thr), (duk_heaphdr *) (h)); } while (0) #define DUK_HSTRING_INCREF_SLOW(thr,h) do { duk_heaphdr_incref((duk_heaphdr *) (h)); } while (0) #define DUK_HSTRING_DECREF_SLOW(thr,h) do { duk_heaphdr_decref((thr), (duk_heaphdr *) (h)); } while (0) #define DUK_HSTRING_DECREF_NORZ_SLOW(thr,h) do { duk_heaphdr_decref_norz((thr), (duk_heaphdr *) (h)); } while (0) #define DUK_HBUFFER_INCREF_SLOW(thr,h) do { duk_heaphdr_incref((duk_heaphdr *) (h)); } while (0) #define DUK_HBUFFER_DECREF_SLOW(thr,h) do { duk_heaphdr_decref((thr), (duk_heaphdr *) (h)); } while (0) #define DUK_HBUFFER_DECREF_NORZ_SLOW(thr,h) do { duk_heaphdr_decref_norz((thr), (duk_heaphdr *) (h)); } while (0) #define DUK_HOBJECT_INCREF_SLOW(thr,h) do { duk_heaphdr_incref((duk_heaphdr *) (h)); } while (0) #define DUK_HOBJECT_DECREF_SLOW(thr,h) do { duk_heaphdr_decref((thr), (duk_heaphdr *) (h)); } while (0) #define DUK_HOBJECT_DECREF_NORZ_SLOW(thr,h) do { duk_heaphdr_decref_norz((thr), (duk_heaphdr *) (h)); } while (0) /* Default variants. Selection depends on speed/size preference. * Concretely: with gcc 4.8.1 -Os x64 the difference in final binary * is about +1kB for _FAST variants. */ #if defined(DUK_USE_FAST_REFCOUNT_DEFAULT) /* XXX: It would be nice to specialize for specific duk_hobject subtypes * but current refzero queue handling prevents that. */ #define DUK_TVAL_INCREF(thr,tv) DUK_TVAL_INCREF_FAST((thr),(tv)) #define DUK_TVAL_DECREF(thr,tv) DUK_TVAL_DECREF_FAST((thr),(tv)) #define DUK_TVAL_DECREF_NORZ(thr,tv) DUK_TVAL_DECREF_NORZ_FAST((thr),(tv)) #define DUK_HEAPHDR_INCREF(thr,h) DUK_HEAPHDR_INCREF_FAST((thr),(h)) #define DUK_HEAPHDR_DECREF(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_heaphdr_refzero,duk_heaphdr *) #define DUK_HEAPHDR_DECREF_NORZ(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_heaphdr_refzero_norz,duk_heaphdr *) #define DUK_HSTRING_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) (h)) #define DUK_HSTRING_DECREF(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hstring_refzero,duk_hstring *) #define DUK_HSTRING_DECREF_NORZ(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hstring_refzero,duk_hstring *) /* no 'norz' variant */ #define DUK_HOBJECT_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) (h)) #define DUK_HOBJECT_DECREF(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero,duk_hobject *) #define DUK_HOBJECT_DECREF_NORZ(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero_norz,duk_hobject *) #define DUK_HBUFFER_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) (h)) #define DUK_HBUFFER_DECREF(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hbuffer_refzero,duk_hbuffer *) #define DUK_HBUFFER_DECREF_NORZ(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hbuffer_refzero,duk_hbuffer *) /* no 'norz' variant */ #define DUK_HCOMPFUNC_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj) #define DUK_HCOMPFUNC_DECREF(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero,duk_hobject *) #define DUK_HCOMPFUNC_DECREF_NORZ(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero_norz,duk_hobject *) #define DUK_HNATFUNC_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj) #define DUK_HNATFUNC_DECREF(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero,duk_hobject *) #define DUK_HNATFUNC_DECREF_NORZ(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero_norz,duk_hobject *) #define DUK_HBUFOBJ_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj) #define DUK_HBUFOBJ_DECREF(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero,duk_hobject *) #define DUK_HBUFOBJ_DECREF_NORZ(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero_norz,duk_hobject *) #define DUK_HTHREAD_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj) #define DUK_HTHREAD_DECREF(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero,duk_hobject *) #define DUK_HTHREAD_DECREF_NORZ(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero_norz,duk_hobject *) #else #define DUK_TVAL_INCREF(thr,tv) DUK_TVAL_INCREF_SLOW((thr),(tv)) #define DUK_TVAL_DECREF(thr,tv) DUK_TVAL_DECREF_SLOW((thr),(tv)) #define DUK_TVAL_DECREF_NORZ(thr,tv) DUK_TVAL_DECREF_NORZ_SLOW((thr),(tv)) #define DUK_HEAPHDR_INCREF(thr,h) DUK_HEAPHDR_INCREF_SLOW((thr),(h)) #define DUK_HEAPHDR_DECREF(thr,h) DUK_HEAPHDR_DECREF_SLOW((thr),(h)) #define DUK_HEAPHDR_DECREF_NORZ(thr,h) DUK_HEAPHDR_DECREF_NORZ_SLOW((thr),(h)) #define DUK_HSTRING_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) (h)) #define DUK_HSTRING_DECREF(thr,h) DUK_HSTRING_DECREF_SLOW((thr),(h)) #define DUK_HSTRING_DECREF_NORZ(thr,h) DUK_HSTRING_DECREF_NORZ_SLOW((thr),(h)) #define DUK_HOBJECT_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) (h)) #define DUK_HOBJECT_DECREF(thr,h) DUK_HOBJECT_DECREF_SLOW((thr),(h)) #define DUK_HOBJECT_DECREF_NORZ(thr,h) DUK_HOBJECT_DECREF_NORZ_SLOW((thr),(h)) #define DUK_HBUFFER_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) (h)) #define DUK_HBUFFER_DECREF(thr,h) DUK_HBUFFER_DECREF_SLOW((thr),(h)) #define DUK_HBUFFER_DECREF_NORZ(thr,h) DUK_HBUFFER_DECREF_NORZ_SLOW((thr),(h)) #define DUK_HCOMPFUNC_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj) #define DUK_HCOMPFUNC_DECREF(thr,h) DUK_HOBJECT_DECREF_SLOW((thr),(duk_hobject *) &(h)->obj) #define DUK_HCOMPFUNC_DECREF_NORZ(thr,h) DUK_HOBJECT_DECREF_NORZ_SLOW((thr),(duk_hobject *) &(h)->obj) #define DUK_HNATFUNC_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj) #define DUK_HNATFUNC_DECREF(thr,h) DUK_HOBJECT_DECREF_SLOW((thr),(duk_hobject *) &(h)->obj) #define DUK_HNATFUNC_DECREF_NORZ(thr,h) DUK_HOBJECT_DECREF_NORZ_SLOW((thr),(duk_hobject *) &(h)->obj) #define DUK_HBUFOBJ_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj) #define DUK_HBUFOBJ_DECREF(thr,h) DUK_HOBJECT_DECREF_SLOW((thr),(duk_hobject *) &(h)->obj) #define DUK_HBUFOB_DECREF_NORZ(thr,h) DUK_HOBJECT_DECREF_NORZ_SLOW((thr),(duk_hobject *) &(h)->obj) #define DUK_HTHREAD_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj) #define DUK_HTHREAD_DECREF(thr,h) DUK_HOBJECT_DECREF_SLOW((thr),(duk_hobject *) &(h)->obj) #define DUK_HTHREAD_DECREF_NORZ(thr,h) DUK_HOBJECT_DECREF_NORZ_SLOW((thr),(duk_hobject *) &(h)->obj) #endif /* Convenience for some situations; the above macros don't allow NULLs * for performance reasons. Macros cover only actually needed cases. */ #define DUK_HEAPHDR_INCREF_ALLOWNULL(thr,h) do { \ if ((h) != NULL) { \ DUK_HEAPHDR_INCREF((thr), (duk_heaphdr *) (h)); \ } \ } while (0) #define DUK_HEAPHDR_DECREF_ALLOWNULL(thr,h) do { \ if ((h) != NULL) { \ DUK_HEAPHDR_DECREF((thr), (duk_heaphdr *) (h)); \ } \ } while (0) #define DUK_HEAPHDR_DECREF_NORZ_ALLOWNULL(thr,h) do { \ if ((h) != NULL) { \ DUK_HEAPHDR_DECREF_NORZ((thr), (duk_heaphdr *) (h)); \ } \ } while (0) #define DUK_HOBJECT_INCREF_ALLOWNULL(thr,h) do { \ if ((h) != NULL) { \ DUK_HOBJECT_INCREF((thr), (h)); \ } \ } while (0) #define DUK_HOBJECT_DECREF_ALLOWNULL(thr,h) do { \ if ((h) != NULL) { \ DUK_HOBJECT_DECREF((thr), (h)); \ } \ } while (0) #define DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr,h) do { \ if ((h) != NULL) { \ DUK_HOBJECT_DECREF_NORZ((thr), (h)); \ } \ } while (0) #define DUK_HBUFFER_INCREF_ALLOWNULL(thr,h) do { \ if ((h) != NULL) { \ DUK_HBUFFER_INCREF((thr), (h)); \ } \ } while (0) #define DUK_HBUFFER_DECREF_ALLOWNULL(thr,h) do { \ if ((h) != NULL) { \ DUK_HBUFFER_DECREF((thr), (h)); \ } \ } while (0) #define DUK_HBUFFER_DECREF_NORZ_ALLOWNULL(thr,h) do { \ if ((h) != NULL) { \ DUK_HBUFFER_DECREF_NORZ((thr), (h)); \ } \ } while (0) #define DUK_HTHREAD_INCREF_ALLOWNULL(thr,h) do { \ if ((h) != NULL) { \ DUK_HTHREAD_INCREF((thr), (h)); \ } \ } while (0) #define DUK_HTHREAD_DECREF_ALLOWNULL(thr,h) do { \ if ((h) != NULL) { \ DUK_HTHREAD_DECREF((thr), (h)); \ } \ } while (0) #define DUK_HTHREAD_DECREF_NORZ_ALLOWNULL(thr,h) do { \ if ((h) != NULL) { \ DUK_HTHREAD_DECREF_NORZ((thr), (h)); \ } \ } while (0) /* Called after one or more DECREF NORZ calls to handle pending side effects. * At present DECREF NORZ does freeing inline but doesn't execute finalizers, * so these macros check for pending finalizers and execute them. The FAST * variant is performance critical. */ #if defined(DUK_USE_FINALIZER_SUPPORT) #define DUK_REFZERO_CHECK_FAST(thr) do { \ duk_refzero_check_fast((thr)); \ } while (0) #define DUK_REFZERO_CHECK_SLOW(thr) do { \ duk_refzero_check_slow((thr)); \ } while (0) #else /* DUK_USE_FINALIZER_SUPPORT */ #define DUK_REFZERO_CHECK_FAST(thr) do { } while (0) #define DUK_REFZERO_CHECK_SLOW(thr) do { } while (0) #endif /* DUK_USE_FINALIZER_SUPPORT */ /* * Macros to set a duk_tval and update refcount of the target (decref the * old value and incref the new value if necessary). This is both performance * and footprint critical; any changes made should be measured for size/speed. */ #define DUK_TVAL_SET_UNDEFINED_UPDREF_ALT0(thr,tvptr_dst) do { \ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ DUK_TVAL_SET_UNDEFINED(tv__dst); \ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ } while (0) #define DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ_ALT0(thr,tvptr_dst) do { \ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ DUK_TVAL_SET_UNDEFINED(tv__dst); \ DUK_TVAL_DECREF_NORZ((thr), &tv__tmp); \ } while (0) #define DUK_TVAL_SET_UNUSED_UPDREF_ALT0(thr,tvptr_dst) do { \ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ DUK_TVAL_SET_UNUSED(tv__dst); \ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ } while (0) #define DUK_TVAL_SET_NULL_UPDREF_ALT0(thr,tvptr_dst) do { \ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ DUK_TVAL_SET_NULL(tv__dst); \ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ } while (0) #define DUK_TVAL_SET_BOOLEAN_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ DUK_TVAL_SET_BOOLEAN(tv__dst, (newval)); \ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ } while (0) #define DUK_TVAL_SET_NUMBER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ DUK_TVAL_SET_NUMBER(tv__dst, (newval)); \ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ } while (0) #define DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ DUK_TVAL_SET_NUMBER_CHKFAST_FAST(tv__dst, (newval)); \ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ } while (0) #define DUK_TVAL_SET_DOUBLE_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ DUK_TVAL_SET_DOUBLE(tv__dst, (newval)); \ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ } while (0) #define DUK_TVAL_SET_NAN_UPDREF_ALT0(thr,tvptr_dst) do { \ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ DUK_TVAL_SET_NAN(tv__dst); \ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ } while (0) #if defined(DUK_USE_FASTINT) #define DUK_TVAL_SET_I48_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ DUK_TVAL_SET_I48(tv__dst, (newval)); \ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ } while (0) #define DUK_TVAL_SET_I32_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ DUK_TVAL_SET_I32(tv__dst, (newval)); \ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ } while (0) #define DUK_TVAL_SET_U32_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ DUK_TVAL_SET_U32(tv__dst, (newval)); \ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ } while (0) #else #define DUK_TVAL_SET_DOUBLE_CAST_UPDREF(thr,tvptr_dst,newval) \ DUK_TVAL_SET_DOUBLE_UPDREF((thr), (tvptr_dst), (duk_double_t) (newval)) #endif /* DUK_USE_FASTINT */ #define DUK_TVAL_SET_LIGHTFUNC_UPDREF_ALT0(thr,tvptr_dst,lf_v,lf_fp,lf_flags) do { \ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ DUK_TVAL_SET_LIGHTFUNC(tv__dst, (lf_v), (lf_fp), (lf_flags)); \ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ } while (0) #define DUK_TVAL_SET_STRING_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ DUK_TVAL_SET_STRING(tv__dst, (newval)); \ DUK_HSTRING_INCREF((thr), (newval)); \ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ } while (0) #define DUK_TVAL_SET_OBJECT_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ DUK_TVAL_SET_OBJECT(tv__dst, (newval)); \ DUK_HOBJECT_INCREF((thr), (newval)); \ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ } while (0) #define DUK_TVAL_SET_BUFFER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ DUK_TVAL_SET_BUFFER(tv__dst, (newval)); \ DUK_HBUFFER_INCREF((thr), (newval)); \ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ } while (0) #define DUK_TVAL_SET_POINTER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ DUK_TVAL_SET_POINTER(tv__dst, (newval)); \ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ } while (0) /* DUK_TVAL_SET_TVAL_UPDREF() is used a lot in executor, property lookups, * etc, so it's very important for performance. Measure when changing. * * NOTE: the source and destination duk_tval pointers may be the same, and * the macros MUST deal with that correctly. */ /* Original idiom used, minimal code size. */ #define DUK_TVAL_SET_TVAL_UPDREF_ALT0(thr,tvptr_dst,tvptr_src) do { \ duk_tval *tv__dst, *tv__src; duk_tval tv__tmp; \ tv__dst = (tvptr_dst); tv__src = (tvptr_src); \ DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ DUK_TVAL_SET_TVAL(tv__dst, tv__src); \ DUK_TVAL_INCREF((thr), tv__src); \ DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ } while (0) /* Faster alternative: avoid making a temporary copy of tvptr_dst and use * fast incref/decref macros. */ #define DUK_TVAL_SET_TVAL_UPDREF_ALT1(thr,tvptr_dst,tvptr_src) do { \ duk_tval *tv__dst, *tv__src; duk_heaphdr *h__obj; \ tv__dst = (tvptr_dst); tv__src = (tvptr_src); \ DUK_TVAL_INCREF_FAST((thr), tv__src); \ if (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv__dst)) { \ h__obj = DUK_TVAL_GET_HEAPHDR(tv__dst); \ DUK_ASSERT(h__obj != NULL); \ DUK_TVAL_SET_TVAL(tv__dst, tv__src); \ DUK_HEAPHDR_DECREF_FAST((thr), h__obj); /* side effects */ \ } else { \ DUK_TVAL_SET_TVAL(tv__dst, tv__src); \ } \ } while (0) /* XXX: no optimized variants yet */ #define DUK_TVAL_SET_UNDEFINED_UPDREF DUK_TVAL_SET_UNDEFINED_UPDREF_ALT0 #define DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ_ALT0 #define DUK_TVAL_SET_UNUSED_UPDREF DUK_TVAL_SET_UNUSED_UPDREF_ALT0 #define DUK_TVAL_SET_NULL_UPDREF DUK_TVAL_SET_NULL_UPDREF_ALT0 #define DUK_TVAL_SET_BOOLEAN_UPDREF DUK_TVAL_SET_BOOLEAN_UPDREF_ALT0 #define DUK_TVAL_SET_NUMBER_UPDREF DUK_TVAL_SET_NUMBER_UPDREF_ALT0 #define DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF_ALT0 #define DUK_TVAL_SET_DOUBLE_UPDREF DUK_TVAL_SET_DOUBLE_UPDREF_ALT0 #define DUK_TVAL_SET_NAN_UPDREF DUK_TVAL_SET_NAN_UPDREF_ALT0 #if defined(DUK_USE_FASTINT) #define DUK_TVAL_SET_I48_UPDREF DUK_TVAL_SET_I48_UPDREF_ALT0 #define DUK_TVAL_SET_I32_UPDREF DUK_TVAL_SET_I32_UPDREF_ALT0 #define DUK_TVAL_SET_U32_UPDREF DUK_TVAL_SET_U32_UPDREF_ALT0 #else #define DUK_TVAL_SET_I48_UPDREF DUK_TVAL_SET_DOUBLE_CAST_UPDREF /* XXX: fast int-to-double */ #define DUK_TVAL_SET_I32_UPDREF DUK_TVAL_SET_DOUBLE_CAST_UPDREF #define DUK_TVAL_SET_U32_UPDREF DUK_TVAL_SET_DOUBLE_CAST_UPDREF #endif /* DUK_USE_FASTINT */ #define DUK_TVAL_SET_FASTINT_UPDREF DUK_TVAL_SET_I48_UPDREF /* convenience */ #define DUK_TVAL_SET_LIGHTFUNC_UPDREF DUK_TVAL_SET_LIGHTFUNC_UPDREF_ALT0 #define DUK_TVAL_SET_STRING_UPDREF DUK_TVAL_SET_STRING_UPDREF_ALT0 #define DUK_TVAL_SET_OBJECT_UPDREF DUK_TVAL_SET_OBJECT_UPDREF_ALT0 #define DUK_TVAL_SET_BUFFER_UPDREF DUK_TVAL_SET_BUFFER_UPDREF_ALT0 #define DUK_TVAL_SET_POINTER_UPDREF DUK_TVAL_SET_POINTER_UPDREF_ALT0 #if defined(DUK_USE_FAST_REFCOUNT_DEFAULT) /* Optimized for speed. */ #define DUK_TVAL_SET_TVAL_UPDREF DUK_TVAL_SET_TVAL_UPDREF_ALT1 #define DUK_TVAL_SET_TVAL_UPDREF_FAST DUK_TVAL_SET_TVAL_UPDREF_ALT1 #define DUK_TVAL_SET_TVAL_UPDREF_SLOW DUK_TVAL_SET_TVAL_UPDREF_ALT0 #else /* Optimized for size. */ #define DUK_TVAL_SET_TVAL_UPDREF DUK_TVAL_SET_TVAL_UPDREF_ALT0 #define DUK_TVAL_SET_TVAL_UPDREF_FAST DUK_TVAL_SET_TVAL_UPDREF_ALT0 #define DUK_TVAL_SET_TVAL_UPDREF_SLOW DUK_TVAL_SET_TVAL_UPDREF_ALT0 #endif #else /* DUK_USE_REFERENCE_COUNTING */ #define DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv) 0 #define DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE(h) 0 #define DUK_TVAL_INCREF_FAST(thr,v) do {} while (0) /* nop */ #define DUK_TVAL_DECREF_FAST(thr,v) do {} while (0) /* nop */ #define DUK_TVAL_DECREF_NORZ_FAST(thr,v) do {} while (0) /* nop */ #define DUK_TVAL_INCREF_SLOW(thr,v) do {} while (0) /* nop */ #define DUK_TVAL_DECREF_SLOW(thr,v) do {} while (0) /* nop */ #define DUK_TVAL_DECREF_NORZ_SLOW(thr,v) do {} while (0) /* nop */ #define DUK_TVAL_INCREF(thr,v) do {} while (0) /* nop */ #define DUK_TVAL_DECREF(thr,v) do {} while (0) /* nop */ #define DUK_TVAL_DECREF_NORZ(thr,v) do {} while (0) /* nop */ #define DUK_HEAPHDR_INCREF_FAST(thr,h) do {} while (0) /* nop */ #define DUK_HEAPHDR_DECREF_FAST(thr,h) do {} while (0) /* nop */ #define DUK_HEAPHDR_DECREF_NORZ_FAST(thr,h) do {} while (0) /* nop */ #define DUK_HEAPHDR_INCREF_SLOW(thr,h) do {} while (0) /* nop */ #define DUK_HEAPHDR_DECREF_SLOW(thr,h) do {} while (0) /* nop */ #define DUK_HEAPHDR_DECREF_NORZ_SLOW(thr,h) do {} while (0) /* nop */ #define DUK_HEAPHDR_INCREF(thr,h) do {} while (0) /* nop */ #define DUK_HEAPHDR_DECREF(thr,h) do {} while (0) /* nop */ #define DUK_HEAPHDR_DECREF_NORZ(thr,h) do {} while (0) /* nop */ #define DUK_HSTRING_INCREF_FAST(thr,h) do {} while (0) /* nop */ #define DUK_HSTRING_DECREF_FAST(thr,h) do {} while (0) /* nop */ #define DUK_HSTRING_DECREF_NORZ_FAST(thr,h) do {} while (0) /* nop */ #define DUK_HSTRING_INCREF_SLOW(thr,h) do {} while (0) /* nop */ #define DUK_HSTRING_DECREF_SLOW(thr,h) do {} while (0) /* nop */ #define DUK_HSTRING_DECREF_NORZ_SLOW(thr,h) do {} while (0) /* nop */ #define DUK_HSTRING_INCREF(thr,h) do {} while (0) /* nop */ #define DUK_HSTRING_DECREF(thr,h) do {} while (0) /* nop */ #define DUK_HSTRING_DECREF_NORZ(thr,h) do {} while (0) /* nop */ #define DUK_HOBJECT_INCREF_FAST(thr,h) do {} while (0) /* nop */ #define DUK_HOBJECT_DECREF_FAST(thr,h) do {} while (0) /* nop */ #define DUK_HOBJECT_DECREF_NORZ_FAST(thr,h) do {} while (0) /* nop */ #define DUK_HOBJECT_INCREF_SLOW(thr,h) do {} while (0) /* nop */ #define DUK_HOBJECT_DECREF_SLOW(thr,h) do {} while (0) /* nop */ #define DUK_HOBJECT_DECREF_NORZ_SLOW(thr,h) do {} while (0) /* nop */ #define DUK_HOBJECT_INCREF(thr,h) do {} while (0) /* nop */ #define DUK_HOBJECT_DECREF(thr,h) do {} while (0) /* nop */ #define DUK_HOBJECT_DECREF_NORZ(thr,h) do {} while (0) /* nop */ #define DUK_HBUFFER_INCREF_FAST(thr,h) do {} while (0) /* nop */ #define DUK_HBUFFER_DECREF_FAST(thr,h) do {} while (0) /* nop */ #define DUK_HBUFFER_DECREF_NORZ_FAST(thr,h) do {} while (0) /* nop */ #define DUK_HBUFFER_INCREF_SLOW(thr,h) do {} while (0) /* nop */ #define DUK_HBUFFER_DECREF_SLOW(thr,h) do {} while (0) /* nop */ #define DUK_HBUFFER_DECREF_NORZ_SLOW(thr,h) do {} while (0) /* nop */ #define DUK_HBUFFER_INCREF(thr,h) do {} while (0) /* nop */ #define DUK_HBUFFER_DECREF(thr,h) do {} while (0) /* nop */ #define DUK_HBUFFER_DECREF_NORZ(thr,h) do {} while (0) /* nop */ #define DUK_HCOMPFUNC_INCREF(thr,h) do {} while (0) /* nop */ #define DUK_HCOMPFUNC_DECREF(thr,h) do {} while (0) /* nop */ #define DUK_HCOMPFUNC_DECREF_NORZ(thr,h) do {} while (0) /* nop */ #define DUK_HNATFUNC_INCREF(thr,h) do {} while (0) /* nop */ #define DUK_HNATFUNC_DECREF(thr,h) do {} while (0) /* nop */ #define DUK_HNATFUNC_DECREF_NORZ(thr,h) do {} while (0) /* nop */ #define DUK_HBUFOBJ_INCREF(thr,h) do {} while (0) /* nop */ #define DUK_HBUFOBJ_DECREF(thr,h) do {} while (0) /* nop */ #define DUK_HBUFOBJ_DECREF_NORZ(thr,h) do {} while (0) /* nop */ #define DUK_HTHREAD_INCREF(thr,h) do {} while (0) /* nop */ #define DUK_HTHREAD_DECREF(thr,h) do {} while (0) /* nop */ #define DUK_HTHREAD_DECREF_NORZ(thr,h) do {} while (0) /* nop */ #define DUK_HOBJECT_INCREF_ALLOWNULL(thr,h) do {} while (0) /* nop */ #define DUK_HOBJECT_DECREF_ALLOWNULL(thr,h) do {} while (0) /* nop */ #define DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr,h) do {} while (0) /* nop */ #define DUK_HBUFFER_INCREF_ALLOWNULL(thr,h) do {} while (0) /* nop */ #define DUK_HBUFFER_DECREF_ALLOWNULL(thr,h) do {} while (0) /* nop */ #define DUK_HBUFFER_DECREF_NORZ_ALLOWNULL(thr,h) do {} while (0) /* nop */ #define DUK_REFZERO_CHECK_FAST(thr) do {} while (0) /* nop */ #define DUK_REFZERO_CHECK_SLOW(thr) do {} while (0) /* nop */ #define DUK_TVAL_SET_UNDEFINED_UPDREF_ALT0(thr,tvptr_dst) do { \ duk_tval *tv__dst; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_UNDEFINED(tv__dst); \ DUK_UNREF((thr)); \ } while (0) #define DUK_TVAL_SET_UNUSED_UPDREF_ALT0(thr,tvptr_dst) do { \ duk_tval *tv__dst; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_UNUSED(tv__dst); \ DUK_UNREF((thr)); \ } while (0) #define DUK_TVAL_SET_NULL_UPDREF_ALT0(thr,tvptr_dst) do { \ duk_tval *tv__dst; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_NULL(tv__dst); \ DUK_UNREF((thr)); \ } while (0) #define DUK_TVAL_SET_BOOLEAN_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ duk_tval *tv__dst; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_BOOLEAN(tv__dst, (newval)); \ DUK_UNREF((thr)); \ } while (0) #define DUK_TVAL_SET_NUMBER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ duk_tval *tv__dst; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_NUMBER(tv__dst, (newval)); \ DUK_UNREF((thr)); \ } while (0) #define DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ duk_tval *tv__dst; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_NUMBER_CHKFAST_FAST(tv__dst, (newval)); \ DUK_UNREF((thr)); \ } while (0) #define DUK_TVAL_SET_DOUBLE_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ duk_tval *tv__dst; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_DOUBLE(tv__dst, (newval)); \ DUK_UNREF((thr)); \ } while (0) #define DUK_TVAL_SET_NAN_UPDREF_ALT0(thr,tvptr_dst) do { \ duk_tval *tv__dst; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_NAN(tv__dst); \ DUK_UNREF((thr)); \ } while (0) #if defined(DUK_USE_FASTINT) #define DUK_TVAL_SET_I48_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ duk_tval *tv__dst; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_I48(tv__dst, (newval)); \ DUK_UNREF((thr)); \ } while (0) #define DUK_TVAL_SET_I32_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ duk_tval *tv__dst; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_I32(tv__dst, (newval)); \ DUK_UNREF((thr)); \ } while (0) #define DUK_TVAL_SET_U32_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ duk_tval *tv__dst; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_U32(tv__dst, (newval)); \ DUK_UNREF((thr)); \ } while (0) #else #define DUK_TVAL_SET_DOUBLE_CAST_UPDREF(thr,tvptr_dst,newval) \ DUK_TVAL_SET_DOUBLE_UPDREF((thr), (tvptr_dst), (duk_double_t) (newval)) #endif /* DUK_USE_FASTINT */ #define DUK_TVAL_SET_LIGHTFUNC_UPDREF_ALT0(thr,tvptr_dst,lf_v,lf_fp,lf_flags) do { \ duk_tval *tv__dst; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_LIGHTFUNC(tv__dst, (lf_v), (lf_fp), (lf_flags)); \ DUK_UNREF((thr)); \ } while (0) #define DUK_TVAL_SET_STRING_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ duk_tval *tv__dst; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_STRING(tv__dst, (newval)); \ DUK_UNREF((thr)); \ } while (0) #define DUK_TVAL_SET_OBJECT_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ duk_tval *tv__dst; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_OBJECT(tv__dst, (newval)); \ DUK_UNREF((thr)); \ } while (0) #define DUK_TVAL_SET_BUFFER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ duk_tval *tv__dst; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_BUFFER(tv__dst, (newval)); \ DUK_UNREF((thr)); \ } while (0) #define DUK_TVAL_SET_POINTER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ duk_tval *tv__dst; tv__dst = (tvptr_dst); \ DUK_TVAL_SET_POINTER(tv__dst, (newval)); \ DUK_UNREF((thr)); \ } while (0) #define DUK_TVAL_SET_TVAL_UPDREF_ALT0(thr,tvptr_dst,tvptr_src) do { \ duk_tval *tv__dst, *tv__src; \ tv__dst = (tvptr_dst); tv__src = (tvptr_src); \ DUK_TVAL_SET_TVAL(tv__dst, tv__src); \ DUK_UNREF((thr)); \ } while (0) #define DUK_TVAL_SET_UNDEFINED_UPDREF DUK_TVAL_SET_UNDEFINED_UPDREF_ALT0 #define DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ DUK_TVAL_SET_UNDEFINED_UPDREF_ALT0 #define DUK_TVAL_SET_UNUSED_UPDREF DUK_TVAL_SET_UNUSED_UPDREF_ALT0 #define DUK_TVAL_SET_NULL_UPDREF DUK_TVAL_SET_NULL_UPDREF_ALT0 #define DUK_TVAL_SET_BOOLEAN_UPDREF DUK_TVAL_SET_BOOLEAN_UPDREF_ALT0 #define DUK_TVAL_SET_NUMBER_UPDREF DUK_TVAL_SET_NUMBER_UPDREF_ALT0 #define DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF_ALT0 #define DUK_TVAL_SET_DOUBLE_UPDREF DUK_TVAL_SET_DOUBLE_UPDREF_ALT0 #define DUK_TVAL_SET_NAN_UPDREF DUK_TVAL_SET_NAN_UPDREF_ALT0 #if defined(DUK_USE_FASTINT) #define DUK_TVAL_SET_I48_UPDREF DUK_TVAL_SET_I48_UPDREF_ALT0 #define DUK_TVAL_SET_I32_UPDREF DUK_TVAL_SET_I32_UPDREF_ALT0 #define DUK_TVAL_SET_U32_UPDREF DUK_TVAL_SET_U32_UPDREF_ALT0 #else #define DUK_TVAL_SET_I48_UPDREF DUK_TVAL_SET_DOUBLE_CAST_UPDREF /* XXX: fast-int-to-double */ #define DUK_TVAL_SET_I32_UPDREF DUK_TVAL_SET_DOUBLE_CAST_UPDREF #define DUK_TVAL_SET_U32_UPDREF DUK_TVAL_SET_DOUBLE_CAST_UPDREF #endif /* DUK_USE_FASTINT */ #define DUK_TVAL_SET_FASTINT_UPDREF DUK_TVAL_SET_I48_UPDREF /* convenience */ #define DUK_TVAL_SET_LIGHTFUNC_UPDREF DUK_TVAL_SET_LIGHTFUNC_UPDREF_ALT0 #define DUK_TVAL_SET_STRING_UPDREF DUK_TVAL_SET_STRING_UPDREF_ALT0 #define DUK_TVAL_SET_OBJECT_UPDREF DUK_TVAL_SET_OBJECT_UPDREF_ALT0 #define DUK_TVAL_SET_BUFFER_UPDREF DUK_TVAL_SET_BUFFER_UPDREF_ALT0 #define DUK_TVAL_SET_POINTER_UPDREF DUK_TVAL_SET_POINTER_UPDREF_ALT0 #define DUK_TVAL_SET_TVAL_UPDREF DUK_TVAL_SET_TVAL_UPDREF_ALT0 #define DUK_TVAL_SET_TVAL_UPDREF_FAST DUK_TVAL_SET_TVAL_UPDREF_ALT0 #define DUK_TVAL_SET_TVAL_UPDREF_SLOW DUK_TVAL_SET_TVAL_UPDREF_ALT0 #endif /* DUK_USE_REFERENCE_COUNTING */ /* * Some convenience macros that don't have optimized implementations now. */ #define DUK_TVAL_SET_TVAL_UPDREF_NORZ(thr,tv_dst,tv_src) do { \ duk_hthread *duk__thr = (thr); \ duk_tval *duk__dst = (tv_dst); \ duk_tval *duk__src = (tv_src); \ DUK_UNREF(duk__thr); \ DUK_TVAL_DECREF_NORZ(thr, duk__dst); \ DUK_TVAL_SET_TVAL(duk__dst, duk__src); \ DUK_TVAL_INCREF(thr, duk__dst); \ } while (0) #define DUK_TVAL_SET_U32_UPDREF_NORZ(thr,tv_dst,val) do { \ duk_hthread *duk__thr = (thr); \ duk_tval *duk__dst = (tv_dst); \ duk_uint32_t duk__val = (duk_uint32_t) (val); \ DUK_UNREF(duk__thr); \ DUK_TVAL_DECREF_NORZ(thr, duk__dst); \ DUK_TVAL_SET_U32(duk__dst, duk__val); \ } while (0) /* * Prototypes */ #if defined(DUK_USE_REFERENCE_COUNTING) #if defined(DUK_USE_FINALIZER_SUPPORT) DUK_INTERNAL_DECL void duk_refzero_check_slow(duk_hthread *thr); DUK_INTERNAL_DECL void duk_refzero_check_fast(duk_hthread *thr); #endif DUK_INTERNAL_DECL void duk_heaphdr_refcount_finalize_norz(duk_heap *heap, duk_heaphdr *hdr); DUK_INTERNAL_DECL void duk_hobject_refcount_finalize_norz(duk_heap *heap, duk_hobject *h); #if 0 /* Not needed: fast path handles inline; slow path uses duk_heaphdr_decref() which is needed anyway. */ DUK_INTERNAL_DECL void duk_hstring_decref(duk_hthread *thr, duk_hstring *h); DUK_INTERNAL_DECL void duk_hstring_decref_norz(duk_hthread *thr, duk_hstring *h); DUK_INTERNAL_DECL void duk_hbuffer_decref(duk_hthread *thr, duk_hbuffer *h); DUK_INTERNAL_DECL void duk_hbuffer_decref_norz(duk_hthread *thr, duk_hbuffer *h); DUK_INTERNAL_DECL void duk_hobject_decref(duk_hthread *thr, duk_hobject *h); DUK_INTERNAL_DECL void duk_hobject_decref_norz(duk_hthread *thr, duk_hobject *h); #endif DUK_INTERNAL_DECL void duk_heaphdr_refzero(duk_hthread *thr, duk_heaphdr *h); DUK_INTERNAL_DECL void duk_heaphdr_refzero_norz(duk_hthread *thr, duk_heaphdr *h); #if defined(DUK_USE_FAST_REFCOUNT_DEFAULT) DUK_INTERNAL_DECL void duk_hstring_refzero(duk_hthread *thr, duk_hstring *h); /* no 'norz' variant */ DUK_INTERNAL_DECL void duk_hbuffer_refzero(duk_hthread *thr, duk_hbuffer *h); /* no 'norz' variant */ DUK_INTERNAL_DECL void duk_hobject_refzero(duk_hthread *thr, duk_hobject *h); DUK_INTERNAL_DECL void duk_hobject_refzero_norz(duk_hthread *thr, duk_hobject *h); #else DUK_INTERNAL_DECL void duk_tval_incref(duk_tval *tv); DUK_INTERNAL_DECL void duk_tval_decref(duk_hthread *thr, duk_tval *tv); DUK_INTERNAL_DECL void duk_tval_decref_norz(duk_hthread *thr, duk_tval *tv); DUK_INTERNAL_DECL void duk_heaphdr_incref(duk_heaphdr *h); DUK_INTERNAL_DECL void duk_heaphdr_decref(duk_hthread *thr, duk_heaphdr *h); DUK_INTERNAL_DECL void duk_heaphdr_decref_norz(duk_hthread *thr, duk_heaphdr *h); #endif #else /* DUK_USE_REFERENCE_COUNTING */ /* no refcounting */ #endif /* DUK_USE_REFERENCE_COUNTING */ #endif /* DUK_REFCOUNT_H_INCLUDED */ /* #include duk_api_internal.h */ #line 1 "duk_api_internal.h" /* * Internal API calls which have (stack and other) semantics similar * to the public API. */ #if !defined(DUK_API_INTERNAL_H_INCLUDED) #define DUK_API_INTERNAL_H_INCLUDED #define DUK_INTERNAL_SYMBOL(x) ("\x82" x) /* duk_push_sprintf constants */ #define DUK_PUSH_SPRINTF_INITIAL_SIZE 256L #define DUK_PUSH_SPRINTF_SANITY_LIMIT (1L * 1024L * 1024L * 1024L) /* Flag ORed to err_code to indicate __FILE__ / __LINE__ is not * blamed as source of error for error fileName / lineNumber. */ #define DUK_ERRCODE_FLAG_NOBLAME_FILELINE (1L << 24) /* Current convention is to use duk_size_t for value stack sizes and global indices, * and duk_idx_t for local frame indices. */ DUK_INTERNAL_DECL void duk_valstack_grow_check_throw(duk_hthread *thr, duk_size_t min_bytes); DUK_INTERNAL_DECL duk_bool_t duk_valstack_grow_check_nothrow(duk_hthread *thr, duk_size_t min_bytes); DUK_INTERNAL_DECL void duk_valstack_shrink_check_nothrow(duk_hthread *thr, duk_bool_t snug); DUK_INTERNAL_DECL void duk_copy_tvals_incref(duk_hthread *thr, duk_tval *tv_dst, duk_tval *tv_src, duk_size_t count); DUK_INTERNAL_DECL duk_tval *duk_reserve_gap(duk_hthread *thr, duk_idx_t idx_base, duk_idx_t count); DUK_INTERNAL_DECL void duk_set_top_unsafe(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL void duk_set_top_and_wipe(duk_hthread *thr, duk_idx_t top, duk_idx_t idx_wipe_start); DUK_INTERNAL_DECL void duk_dup_0(duk_hthread *thr); DUK_INTERNAL_DECL void duk_dup_1(duk_hthread *thr); DUK_INTERNAL_DECL void duk_dup_2(duk_hthread *thr); /* duk_dup_m1() would be same as duk_dup_top() */ DUK_INTERNAL_DECL void duk_dup_m2(duk_hthread *thr); DUK_INTERNAL_DECL void duk_dup_m3(duk_hthread *thr); DUK_INTERNAL_DECL void duk_dup_m4(duk_hthread *thr); DUK_INTERNAL_DECL void duk_remove_unsafe(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL void duk_remove_m2(duk_hthread *thr); DUK_INTERNAL_DECL void duk_remove_n(duk_hthread *thr, duk_idx_t idx, duk_idx_t count); DUK_INTERNAL_DECL void duk_remove_n_unsafe(duk_hthread *thr, duk_idx_t idx, duk_idx_t count); DUK_INTERNAL_DECL duk_int_t duk_get_type_tval(duk_tval *tv); DUK_INTERNAL_DECL duk_uint_t duk_get_type_mask_tval(duk_tval *tv); #if defined(DUK_USE_VERBOSE_ERRORS) && defined(DUK_USE_PARANOID_ERRORS) DUK_INTERNAL_DECL const char *duk_get_type_name(duk_hthread *thr, duk_idx_t idx); #endif DUK_INTERNAL_DECL duk_small_uint_t duk_get_class_number(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL duk_tval *duk_get_tval(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL duk_tval *duk_get_tval_or_unused(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL duk_tval *duk_require_tval(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL void duk_push_tval(duk_hthread *thr, duk_tval *tv); /* Push the current 'this' binding; throw TypeError if binding is not object * coercible (CheckObjectCoercible). */ DUK_INTERNAL_DECL void duk_push_this_check_object_coercible(duk_hthread *thr); /* duk_push_this() + CheckObjectCoercible() + duk_to_object() */ DUK_INTERNAL_DECL duk_hobject *duk_push_this_coercible_to_object(duk_hthread *thr); /* duk_push_this() + CheckObjectCoercible() + duk_to_string() */ DUK_INTERNAL_DECL duk_hstring *duk_push_this_coercible_to_string(duk_hthread *thr); DUK_INTERNAL_DECL duk_hstring *duk_push_uint_to_hstring(duk_hthread *thr, duk_uint_t i); /* Get a borrowed duk_tval pointer to the current 'this' binding. Caller must * make sure there's an active callstack entry. Note that the returned pointer * is unstable with regards to side effects. */ DUK_INTERNAL_DECL duk_tval *duk_get_borrowed_this_tval(duk_hthread *thr); /* XXX: add fastint support? */ #define duk_push_u64(thr,val) \ duk_push_number((thr), (duk_double_t) (val)) #define duk_push_i64(thr,val) \ duk_push_number((thr), (duk_double_t) (val)) /* duk_push_(u)int() is guaranteed to support at least (un)signed 32-bit range */ #define duk_push_u32(thr,val) \ duk_push_uint((thr), (duk_uint_t) (val)) #define duk_push_i32(thr,val) \ duk_push_int((thr), (duk_int_t) (val)) /* sometimes stack and array indices need to go on the stack */ #define duk_push_idx(thr,val) \ duk_push_int((thr), (duk_int_t) (val)) #define duk_push_uarridx(thr,val) \ duk_push_uint((thr), (duk_uint_t) (val)) #define duk_push_size_t(thr,val) \ duk_push_uint((thr), (duk_uint_t) (val)) /* XXX: assumed to fit for now */ DUK_INTERNAL_DECL duk_bool_t duk_is_string_notsymbol(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL duk_bool_t duk_is_callable_tval(duk_hthread *thr, duk_tval *tv); DUK_INTERNAL_DECL duk_hstring *duk_get_hstring(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL duk_hstring *duk_get_hstring_notsymbol(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL const char *duk_get_string_notsymbol(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL duk_hobject *duk_get_hobject(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL duk_hbuffer *duk_get_hbuffer(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL duk_hthread *duk_get_hthread(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL duk_hcompfunc *duk_get_hcompfunc(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL duk_hnatfunc *duk_get_hnatfunc(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL void *duk_get_buffer_data_raw(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_len, duk_bool_t throw_flag, duk_bool_t *out_isbuffer); DUK_INTERNAL_DECL duk_hobject *duk_get_hobject_with_class(duk_hthread *thr, duk_idx_t idx, duk_small_uint_t classnum); DUK_INTERNAL_DECL duk_hobject *duk_get_hobject_promote_mask(duk_hthread *thr, duk_idx_t idx, duk_uint_t type_mask); DUK_INTERNAL_DECL duk_hobject *duk_require_hobject_promote_mask(duk_hthread *thr, duk_idx_t idx, duk_uint_t type_mask); DUK_INTERNAL_DECL duk_hobject *duk_require_hobject_accept_mask(duk_hthread *thr, duk_idx_t idx, duk_uint_t type_mask); #define duk_require_hobject_promote_lfunc(thr,idx) \ duk_require_hobject_promote_mask((thr), (idx), DUK_TYPE_MASK_LIGHTFUNC) #define duk_get_hobject_promote_lfunc(thr,idx) \ duk_get_hobject_promote_mask((thr), (idx), DUK_TYPE_MASK_LIGHTFUNC) #if 0 /*unused*/ DUK_INTERNAL_DECL void *duk_get_voidptr(duk_hthread *thr, duk_idx_t idx); #endif DUK_INTERNAL_DECL duk_hstring *duk_known_hstring(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL duk_hobject *duk_known_hobject(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL duk_hbuffer *duk_known_hbuffer(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL duk_hcompfunc *duk_known_hcompfunc(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL duk_hnatfunc *duk_known_hnatfunc(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL duk_double_t duk_to_number_tval(duk_hthread *thr, duk_tval *tv); DUK_INTERNAL_DECL duk_hstring *duk_to_hstring(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL duk_hstring *duk_to_hstring_m1(duk_hthread *thr); DUK_INTERNAL_DECL duk_hstring *duk_to_hstring_acceptsymbol(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL duk_hobject *duk_to_hobject(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL duk_double_t duk_to_number_m1(duk_hthread *thr); DUK_INTERNAL_DECL duk_double_t duk_to_number_m2(duk_hthread *thr); #if defined(DUK_USE_DEBUGGER_SUPPORT) /* only needed by debugger for now */ DUK_INTERNAL_DECL duk_hstring *duk_safe_to_hstring(duk_hthread *thr, duk_idx_t idx); #endif DUK_INTERNAL_DECL void duk_push_class_string_tval(duk_hthread *thr, duk_tval *tv); DUK_INTERNAL_DECL duk_int_t duk_to_int_clamped_raw(duk_hthread *thr, duk_idx_t idx, duk_int_t minval, duk_int_t maxval, duk_bool_t *out_clamped); /* out_clamped=NULL, RangeError if outside range */ DUK_INTERNAL_DECL duk_int_t duk_to_int_clamped(duk_hthread *thr, duk_idx_t idx, duk_int_t minval, duk_int_t maxval); DUK_INTERNAL_DECL duk_int_t duk_to_int_check_range(duk_hthread *thr, duk_idx_t idx, duk_int_t minval, duk_int_t maxval); #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_INTERNAL_DECL duk_uint8_t duk_to_uint8clamped(duk_hthread *thr, duk_idx_t idx); #endif DUK_INTERNAL_DECL duk_hstring *duk_to_property_key_hstring(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL duk_hstring *duk_require_hstring(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL duk_hstring *duk_require_hstring_notsymbol(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL const char *duk_require_lstring_notsymbol(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len); DUK_INTERNAL_DECL const char *duk_require_string_notsymbol(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL duk_hobject *duk_require_hobject(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL duk_hbuffer *duk_require_hbuffer(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL duk_hthread *duk_require_hthread(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL duk_hcompfunc *duk_require_hcompfunc(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL duk_hnatfunc *duk_require_hnatfunc(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL duk_hobject *duk_require_hobject_with_class(duk_hthread *thr, duk_idx_t idx, duk_small_uint_t classnum); DUK_INTERNAL_DECL void duk_push_hstring(duk_hthread *thr, duk_hstring *h); DUK_INTERNAL_DECL void duk_push_hstring_stridx(duk_hthread *thr, duk_small_uint_t stridx); DUK_INTERNAL_DECL void duk_push_hstring_empty(duk_hthread *thr); DUK_INTERNAL_DECL void duk_push_hobject(duk_hthread *thr, duk_hobject *h); DUK_INTERNAL_DECL void duk_push_hbuffer(duk_hthread *thr, duk_hbuffer *h); #define duk_push_hthread(thr,h) \ duk_push_hobject((thr), (duk_hobject *) (h)) #define duk_push_hnatfunc(thr,h) \ duk_push_hobject((thr), (duk_hobject *) (h)) DUK_INTERNAL_DECL void duk_push_hobject_bidx(duk_hthread *thr, duk_small_int_t builtin_idx); DUK_INTERNAL_DECL duk_hobject *duk_push_object_helper(duk_hthread *thr, duk_uint_t hobject_flags_and_class, duk_small_int_t prototype_bidx); DUK_INTERNAL_DECL duk_hobject *duk_push_object_helper_proto(duk_hthread *thr, duk_uint_t hobject_flags_and_class, duk_hobject *proto); DUK_INTERNAL_DECL duk_hcompfunc *duk_push_hcompfunc(duk_hthread *thr); DUK_INTERNAL_DECL duk_hboundfunc *duk_push_hboundfunc(duk_hthread *thr); DUK_INTERNAL_DECL void duk_push_c_function_builtin(duk_hthread *thr, duk_c_function func, duk_int_t nargs); DUK_INTERNAL_DECL void duk_push_c_function_builtin_noconstruct(duk_hthread *thr, duk_c_function func, duk_int_t nargs); /* XXX: duk_push_harray() and duk_push_hcompfunc() are inconsistent with * duk_push_hobject() etc which don't create a new value. */ DUK_INTERNAL_DECL duk_harray *duk_push_harray(duk_hthread *thr); DUK_INTERNAL_DECL duk_harray *duk_push_harray_with_size(duk_hthread *thr, duk_uint32_t size); DUK_INTERNAL_DECL duk_tval *duk_push_harray_with_size_outptr(duk_hthread *thr, duk_uint32_t size); DUK_INTERNAL_DECL void duk_push_string_funcptr(duk_hthread *thr, duk_uint8_t *ptr, duk_size_t sz); DUK_INTERNAL_DECL void duk_push_lightfunc_name_raw(duk_hthread *thr, duk_c_function func, duk_small_uint_t lf_flags); DUK_INTERNAL_DECL void duk_push_lightfunc_name(duk_hthread *thr, duk_tval *tv); DUK_INTERNAL_DECL void duk_push_lightfunc_tostring(duk_hthread *thr, duk_tval *tv); #if 0 /* not used yet */ DUK_INTERNAL_DECL void duk_push_hnatfunc_name(duk_hthread *thr, duk_hnatfunc *h); #endif #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_INTERNAL_DECL duk_hbufobj *duk_push_bufobj_raw(duk_hthread *thr, duk_uint_t hobject_flags_and_class, duk_small_int_t prototype_bidx); #endif DUK_INTERNAL_DECL void *duk_push_fixed_buffer_nozero(duk_hthread *thr, duk_size_t len); DUK_INTERNAL_DECL void *duk_push_fixed_buffer_zero(duk_hthread *thr, duk_size_t len); DUK_INTERNAL_DECL const char *duk_push_string_readable(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL const char *duk_push_string_tval_readable(duk_hthread *thr, duk_tval *tv); DUK_INTERNAL_DECL const char *duk_push_string_tval_readable_error(duk_hthread *thr, duk_tval *tv); /* The duk_xxx_prop_stridx_short() variants expect their arguments to be short * enough to be packed into a single 32-bit integer argument. Argument limits * vary per call; typically 16 bits are assigned to the signed value stack index * and the stridx. In practice these work well for footprint with constant * arguments and such call sites are also easiest to verify to be correct. */ DUK_INTERNAL_DECL duk_bool_t duk_get_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx); /* [] -> [val] */ DUK_INTERNAL_DECL duk_bool_t duk_get_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args); #define duk_get_prop_stridx_short(thr,obj_idx,stridx) \ (DUK_ASSERT_EXPR((duk_int_t) (obj_idx) >= -0x8000L && (duk_int_t) (obj_idx) <= 0x7fffL), \ DUK_ASSERT_EXPR((duk_int_t) (stridx) >= 0 && (duk_int_t) (stridx) <= 0xffffL), \ duk_get_prop_stridx_short_raw((thr), (((duk_uint_t) (obj_idx)) << 16) + ((duk_uint_t) (stridx)))) DUK_INTERNAL_DECL duk_bool_t duk_get_prop_stridx_boolean(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx, duk_bool_t *out_has_prop); /* [] -> [] */ DUK_INTERNAL_DECL duk_bool_t duk_put_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx); /* [val] -> [] */ DUK_INTERNAL_DECL duk_bool_t duk_put_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args); #define duk_put_prop_stridx_short(thr,obj_idx,stridx) \ (DUK_ASSERT_EXPR((duk_int_t) (obj_idx) >= -0x8000L && (duk_int_t) (obj_idx) <= 0x7fffL), \ DUK_ASSERT_EXPR((duk_int_t) (stridx) >= 0 && (duk_int_t) (stridx) <= 0xffffL), \ duk_put_prop_stridx_short_raw((thr), (((duk_uint_t) (obj_idx)) << 16) + ((duk_uint_t) (stridx)))) DUK_INTERNAL_DECL duk_bool_t duk_del_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx); /* [] -> [] */ #if 0 /* Too few call sites to be useful. */ DUK_INTERNAL_DECL duk_bool_t duk_del_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args); #define duk_del_prop_stridx_short(thr,obj_idx,stridx) \ (DUK_ASSERT_EXPR((obj_idx) >= -0x8000L && (obj_idx) <= 0x7fffL), \ DUK_ASSERT_EXPR((stridx) >= 0 && (stridx) <= 0xffffL), \ duk_del_prop_stridx_short_raw((thr), (((duk_uint_t) (obj_idx)) << 16) + ((duk_uint_t) (stridx)))) #endif #define duk_del_prop_stridx_short(thr,obj_idx,stridx) \ duk_del_prop_stridx((thr), (obj_idx), (stridx)) DUK_INTERNAL_DECL duk_bool_t duk_has_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx); /* [] -> [] */ #if 0 /* Too few call sites to be useful. */ DUK_INTERNAL_DECL duk_bool_t duk_has_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args); #define duk_has_prop_stridx_short(thr,obj_idx,stridx) \ (DUK_ASSERT_EXPR((obj_idx) >= -0x8000L && (obj_idx) <= 0x7fffL), \ DUK_ASSERT_EXPR((stridx) >= 0 && (stridx) <= 0xffffL), \ duk_has_prop_stridx_short_raw((thr), (((duk_uint_t) (obj_idx)) << 16) + ((duk_uint_t) (stridx)))) #endif #define duk_has_prop_stridx_short(thr,obj_idx,stridx) \ duk_has_prop_stridx((thr), (obj_idx), (stridx)) DUK_INTERNAL_DECL void duk_xdef_prop(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t desc_flags); /* [key val] -> [] */ DUK_INTERNAL_DECL void duk_xdef_prop_index(duk_hthread *thr, duk_idx_t obj_idx, duk_uarridx_t arr_idx, duk_small_uint_t desc_flags); /* [val] -> [] */ /* XXX: Because stridx and desc_flags have a limited range, this call could * always pack stridx and desc_flags into a single argument. */ DUK_INTERNAL_DECL void duk_xdef_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx, duk_small_uint_t desc_flags); /* [val] -> [] */ DUK_INTERNAL_DECL void duk_xdef_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args); #define duk_xdef_prop_stridx_short(thr,obj_idx,stridx,desc_flags) \ (DUK_ASSERT_EXPR((duk_int_t) (obj_idx) >= -0x80L && (duk_int_t) (obj_idx) <= 0x7fL), \ DUK_ASSERT_EXPR((duk_int_t) (stridx) >= 0 && (duk_int_t) (stridx) <= 0xffffL), \ DUK_ASSERT_EXPR((duk_int_t) (desc_flags) >= 0 && (duk_int_t) (desc_flags) <= 0xffL), \ duk_xdef_prop_stridx_short_raw((thr), (((duk_uint_t) (obj_idx)) << 24) + (((duk_uint_t) (stridx)) << 8) + (duk_uint_t) (desc_flags))) #define duk_xdef_prop_wec(thr,obj_idx) \ duk_xdef_prop((thr), (obj_idx), DUK_PROPDESC_FLAGS_WEC) #define duk_xdef_prop_index_wec(thr,obj_idx,arr_idx) \ duk_xdef_prop_index((thr), (obj_idx), (arr_idx), DUK_PROPDESC_FLAGS_WEC) #define duk_xdef_prop_stridx_wec(thr,obj_idx,stridx) \ duk_xdef_prop_stridx((thr), (obj_idx), (stridx), DUK_PROPDESC_FLAGS_WEC) #define duk_xdef_prop_stridx_short_wec(thr,obj_idx,stridx) \ duk_xdef_prop_stridx_short((thr), (obj_idx), (stridx), DUK_PROPDESC_FLAGS_WEC) #if 0 /*unused*/ DUK_INTERNAL_DECL void duk_xdef_prop_stridx_builtin(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx, duk_small_int_t builtin_idx, duk_small_uint_t desc_flags); /* [] -> [] */ #endif DUK_INTERNAL_DECL void duk_xdef_prop_stridx_thrower(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx); /* [] -> [] */ DUK_INTERNAL_DECL void duk_pack(duk_hthread *thr, duk_idx_t count); DUK_INTERNAL_DECL duk_idx_t duk_unpack_array_like(duk_hthread *thr, duk_idx_t idx); #if 0 DUK_INTERNAL_DECL void duk_unpack(duk_hthread *thr); #endif DUK_INTERNAL_DECL void duk_require_constructor_call(duk_hthread *thr); DUK_INTERNAL_DECL void duk_require_constructable(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL void duk_push_symbol_descriptive_string(duk_hthread *thr, duk_hstring *h); DUK_INTERNAL_DECL void duk_resolve_nonbound_function(duk_hthread *thr); DUK_INTERNAL_DECL duk_idx_t duk_get_top_require_min(duk_hthread *thr, duk_idx_t min_top); DUK_INTERNAL_DECL duk_idx_t duk_get_top_index_unsafe(duk_hthread *thr); DUK_INTERNAL_DECL void duk_pop_n_unsafe(duk_hthread *thr, duk_idx_t count); DUK_INTERNAL_DECL void duk_pop_unsafe(duk_hthread *thr); DUK_INTERNAL_DECL void duk_pop_2_unsafe(duk_hthread *thr); DUK_INTERNAL_DECL void duk_pop_3_unsafe(duk_hthread *thr); DUK_INTERNAL_DECL void duk_pop_n_nodecref_unsafe(duk_hthread *thr, duk_idx_t count); DUK_INTERNAL_DECL void duk_pop_nodecref_unsafe(duk_hthread *thr); DUK_INTERNAL_DECL void duk_pop_2_nodecref_unsafe(duk_hthread *thr); DUK_INTERNAL_DECL void duk_pop_3_nodecref_unsafe(duk_hthread *thr); DUK_INTERNAL_DECL void duk_pop_undefined(duk_hthread *thr); DUK_INTERNAL_DECL void duk_compact_m1(duk_hthread *thr); DUK_INTERNAL_DECL void duk_seal_freeze_raw(duk_hthread *thr, duk_idx_t obj_idx, duk_bool_t is_freeze); DUK_INTERNAL_DECL void duk_insert_undefined(duk_hthread *thr, duk_idx_t idx); DUK_INTERNAL_DECL void duk_insert_undefined_n(duk_hthread *thr, duk_idx_t idx, duk_idx_t count); DUK_INTERNAL_DECL void duk_concat_2(duk_hthread *thr); DUK_INTERNAL_DECL duk_int_t duk_pcall_method_flags(duk_hthread *thr, duk_idx_t nargs, duk_small_uint_t call_flags); /* Raw internal valstack access macros: access is unsafe so call site * must have a guarantee that the index is valid. When that is the case, * using these macro results in faster and smaller code than duk_get_tval(). * Both 'ctx' and 'idx' are evaluted multiple times, but only for asserts. */ #define DUK_ASSERT_VALID_NEGIDX(thr,idx) \ (DUK_ASSERT_EXPR((duk_int_t) (idx) < 0), DUK_ASSERT_EXPR(duk_is_valid_index((thr), (idx)))) #define DUK_ASSERT_VALID_POSIDX(thr,idx) \ (DUK_ASSERT_EXPR((duk_int_t) (idx) >= 0), DUK_ASSERT_EXPR(duk_is_valid_index((thr), (idx)))) #define DUK_GET_TVAL_NEGIDX(thr,idx) \ (DUK_ASSERT_VALID_NEGIDX((thr),(idx)), ((duk_hthread *) (thr))->valstack_top + (idx)) #define DUK_GET_TVAL_POSIDX(thr,idx) \ (DUK_ASSERT_VALID_POSIDX((thr),(idx)), ((duk_hthread *) (thr))->valstack_bottom + (idx)) #define DUK_GET_HOBJECT_NEGIDX(thr,idx) \ (DUK_ASSERT_VALID_NEGIDX((thr),(idx)), DUK_TVAL_GET_OBJECT(((duk_hthread *) (thr))->valstack_top + (idx))) #define DUK_GET_HOBJECT_POSIDX(thr,idx) \ (DUK_ASSERT_VALID_POSIDX((thr),(idx)), DUK_TVAL_GET_OBJECT(((duk_hthread *) (thr))->valstack_bottom + (idx))) #define DUK_GET_THIS_TVAL_PTR(thr) \ (DUK_ASSERT_EXPR((thr)->valstack_bottom > (thr)->valstack), \ (thr)->valstack_bottom - 1) DUK_INTERNAL_DECL duk_double_t duk_time_get_ecmascript_time(duk_hthread *thr); DUK_INTERNAL_DECL duk_double_t duk_time_get_ecmascript_time_nofrac(duk_hthread *thr); DUK_INTERNAL_DECL duk_double_t duk_time_get_monotonic_time(duk_hthread *thr); #endif /* DUK_API_INTERNAL_H_INCLUDED */ /* #include duk_hstring.h */ #line 1 "duk_hstring.h" /* * Heap string representation. * * Strings are byte sequences ordinarily stored in extended UTF-8 format, * allowing values larger than the official UTF-8 range (used internally) * and also allowing UTF-8 encoding of surrogate pairs (CESU-8 format). * Strings may also be invalid UTF-8 altogether which is the case e.g. with * strings used as internal property names and raw buffers converted to * strings. In such cases the 'clen' field contains an inaccurate value. * * Ecmascript requires support for 32-bit long strings. However, since each * 16-bit codepoint can take 3 bytes in CESU-8, this representation can only * support about 1.4G codepoint long strings in extreme cases. This is not * really a practical issue. */ #if !defined(DUK_HSTRING_H_INCLUDED) #define DUK_HSTRING_H_INCLUDED /* Impose a maximum string length for now. Restricted artificially to * ensure adding a heap header length won't overflow size_t. The limit * should be synchronized with DUK_HBUFFER_MAX_BYTELEN. * * E5.1 makes provisions to support strings longer than 4G characters. * This limit should be eliminated on 64-bit platforms (and increased * closer to maximum support on 32-bit platforms). */ #if defined(DUK_USE_STRLEN16) #define DUK_HSTRING_MAX_BYTELEN (0x0000ffffUL) #else #define DUK_HSTRING_MAX_BYTELEN (0x7fffffffUL) #endif /* XXX: could add flags for "is valid CESU-8" (Ecmascript compatible strings), * "is valid UTF-8", "is valid extended UTF-8" (internal strings are not, * regexp bytecode is), and "contains non-BMP characters". These are not * needed right now. */ #define DUK_HSTRING_FLAG_ASCII DUK_HEAPHDR_USER_FLAG(0) /* string is ASCII, clen == blen */ #define DUK_HSTRING_FLAG_ARRIDX DUK_HEAPHDR_USER_FLAG(1) /* string is a valid array index */ #define DUK_HSTRING_FLAG_SYMBOL DUK_HEAPHDR_USER_FLAG(2) /* string is a symbol (invalid utf-8) */ #define DUK_HSTRING_FLAG_HIDDEN DUK_HEAPHDR_USER_FLAG(3) /* string is a hidden symbol (implies symbol, Duktape 1.x internal string) */ #define DUK_HSTRING_FLAG_RESERVED_WORD DUK_HEAPHDR_USER_FLAG(4) /* string is a reserved word (non-strict) */ #define DUK_HSTRING_FLAG_STRICT_RESERVED_WORD DUK_HEAPHDR_USER_FLAG(5) /* string is a reserved word (strict) */ #define DUK_HSTRING_FLAG_EVAL_OR_ARGUMENTS DUK_HEAPHDR_USER_FLAG(6) /* string is 'eval' or 'arguments' */ #define DUK_HSTRING_FLAG_EXTDATA DUK_HEAPHDR_USER_FLAG(7) /* string data is external (duk_hstring_external) */ #define DUK_HSTRING_HAS_ASCII(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ASCII) #define DUK_HSTRING_HAS_ARRIDX(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ARRIDX) #define DUK_HSTRING_HAS_SYMBOL(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_SYMBOL) #define DUK_HSTRING_HAS_HIDDEN(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_HIDDEN) #define DUK_HSTRING_HAS_RESERVED_WORD(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_RESERVED_WORD) #define DUK_HSTRING_HAS_STRICT_RESERVED_WORD(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_STRICT_RESERVED_WORD) #define DUK_HSTRING_HAS_EVAL_OR_ARGUMENTS(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EVAL_OR_ARGUMENTS) #define DUK_HSTRING_HAS_EXTDATA(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EXTDATA) #define DUK_HSTRING_SET_ASCII(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ASCII) #define DUK_HSTRING_SET_ARRIDX(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ARRIDX) #define DUK_HSTRING_SET_SYMBOL(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_SYMBOL) #define DUK_HSTRING_SET_HIDDEN(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_HIDDEN) #define DUK_HSTRING_SET_RESERVED_WORD(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_RESERVED_WORD) #define DUK_HSTRING_SET_STRICT_RESERVED_WORD(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_STRICT_RESERVED_WORD) #define DUK_HSTRING_SET_EVAL_OR_ARGUMENTS(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EVAL_OR_ARGUMENTS) #define DUK_HSTRING_SET_EXTDATA(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EXTDATA) #define DUK_HSTRING_CLEAR_ASCII(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ASCII) #define DUK_HSTRING_CLEAR_ARRIDX(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ARRIDX) #define DUK_HSTRING_CLEAR_SYMBOL(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_SYMBOL) #define DUK_HSTRING_CLEAR_HIDDEN(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_HIDDEN) #define DUK_HSTRING_CLEAR_RESERVED_WORD(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_RESERVED_WORD) #define DUK_HSTRING_CLEAR_STRICT_RESERVED_WORD(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_STRICT_RESERVED_WORD) #define DUK_HSTRING_CLEAR_EVAL_OR_ARGUMENTS(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EVAL_OR_ARGUMENTS) #define DUK_HSTRING_CLEAR_EXTDATA(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EXTDATA) #if 0 /* Slightly smaller code without explicit flag, but explicit flag * is very useful when 'clen' is dropped. */ #define DUK_HSTRING_IS_ASCII(x) (DUK_HSTRING_GET_BYTELEN((x)) == DUK_HSTRING_GET_CHARLEN((x))) #endif #define DUK_HSTRING_IS_ASCII(x) DUK_HSTRING_HAS_ASCII((x)) /* lazily set! */ #define DUK_HSTRING_IS_EMPTY(x) (DUK_HSTRING_GET_BYTELEN((x)) == 0) #if defined(DUK_USE_STRHASH16) #define DUK_HSTRING_GET_HASH(x) ((x)->hdr.h_flags >> 16) #define DUK_HSTRING_SET_HASH(x,v) do { \ (x)->hdr.h_flags = ((x)->hdr.h_flags & 0x0000ffffUL) | ((v) << 16); \ } while (0) #else #define DUK_HSTRING_GET_HASH(x) ((x)->hash) #define DUK_HSTRING_SET_HASH(x,v) do { \ (x)->hash = (v); \ } while (0) #endif #if defined(DUK_USE_STRLEN16) #define DUK_HSTRING_GET_BYTELEN(x) ((x)->hdr.h_strextra16) #define DUK_HSTRING_SET_BYTELEN(x,v) do { \ (x)->hdr.h_strextra16 = (v); \ } while (0) #if defined(DUK_USE_HSTRING_CLEN) #define DUK_HSTRING_GET_CHARLEN(x) duk_hstring_get_charlen((x)) #define DUK_HSTRING_SET_CHARLEN(x,v) do { \ (x)->clen16 = (v); \ } while (0) #else #define DUK_HSTRING_GET_CHARLEN(x) duk_hstring_get_charlen((x)) #define DUK_HSTRING_SET_CHARLEN(x,v) do { \ DUK_ASSERT(0); /* should never be called */ \ } while (0) #endif #else #define DUK_HSTRING_GET_BYTELEN(x) ((x)->blen) #define DUK_HSTRING_SET_BYTELEN(x,v) do { \ (x)->blen = (v); \ } while (0) #define DUK_HSTRING_GET_CHARLEN(x) duk_hstring_get_charlen((x)) #define DUK_HSTRING_SET_CHARLEN(x,v) do { \ (x)->clen = (v); \ } while (0) #endif #if defined(DUK_USE_HSTRING_EXTDATA) #define DUK_HSTRING_GET_EXTDATA(x) \ ((x)->extdata) #define DUK_HSTRING_GET_DATA(x) \ (DUK_HSTRING_HAS_EXTDATA((x)) ? \ DUK_HSTRING_GET_EXTDATA((const duk_hstring_external *) (x)) : ((const duk_uint8_t *) ((x) + 1))) #else #define DUK_HSTRING_GET_DATA(x) \ ((const duk_uint8_t *) ((x) + 1)) #endif #define DUK_HSTRING_GET_DATA_END(x) \ (DUK_HSTRING_GET_DATA((x)) + (x)->blen) /* Marker value; in E5 2^32-1 is not a valid array index (2^32-2 is highest * valid). */ #define DUK_HSTRING_NO_ARRAY_INDEX (0xffffffffUL) #if defined(DUK_USE_HSTRING_ARRIDX) #define DUK_HSTRING_GET_ARRIDX_FAST(h) ((h)->arridx) #define DUK_HSTRING_GET_ARRIDX_SLOW(h) ((h)->arridx) #else /* Get array index related to string (or return DUK_HSTRING_NO_ARRAY_INDEX); * avoids helper call if string has no array index value. */ #define DUK_HSTRING_GET_ARRIDX_FAST(h) \ (DUK_HSTRING_HAS_ARRIDX((h)) ? duk_js_to_arrayindex_hstring_fast_known((h)) : DUK_HSTRING_NO_ARRAY_INDEX) /* Slower but more compact variant. */ #define DUK_HSTRING_GET_ARRIDX_SLOW(h) \ (duk_js_to_arrayindex_hstring_fast((h))) #endif /* XXX: these actually fit into duk_hstring */ #define DUK_SYMBOL_TYPE_HIDDEN 0 #define DUK_SYMBOL_TYPE_GLOBAL 1 #define DUK_SYMBOL_TYPE_LOCAL 2 #define DUK_SYMBOL_TYPE_WELLKNOWN 3 /* * Misc */ struct duk_hstring { /* Smaller heaphdr than for other objects, because strings are held * in string intern table which requires no link pointers. Much of * the 32-bit flags field is unused by flags, so we can stuff a 16-bit * field in there. */ duk_heaphdr_string hdr; /* String hash. */ #if defined(DUK_USE_STRHASH16) /* If 16-bit hash is in use, stuff it into duk_heaphdr_string flags. */ #else duk_uint32_t hash; #endif /* Precomputed array index (or DUK_HSTRING_NO_ARRAY_INDEX). */ #if defined(DUK_USE_HSTRING_ARRIDX) duk_uarridx_t arridx; #endif /* Length in bytes (not counting NUL term). */ #if defined(DUK_USE_STRLEN16) /* placed in duk_heaphdr_string */ #else duk_uint32_t blen; #endif /* Length in codepoints (must be E5 compatible). */ #if defined(DUK_USE_STRLEN16) #if defined(DUK_USE_HSTRING_CLEN) duk_uint16_t clen16; #else /* computed live */ #endif #else duk_uint32_t clen; #endif /* * String data of 'blen+1' bytes follows (+1 for NUL termination * convenience for C API). No alignment needs to be guaranteed * for strings, but fields above should guarantee alignment-by-4 * (but not alignment-by-8). */ }; /* The external string struct is defined even when the feature is inactive. */ struct duk_hstring_external { duk_hstring str; /* * For an external string, the NUL-terminated string data is stored * externally. The user must guarantee that data behind this pointer * doesn't change while it's used. */ const duk_uint8_t *extdata; }; /* * Prototypes */ DUK_INTERNAL_DECL duk_ucodepoint_t duk_hstring_char_code_at_raw(duk_hthread *thr, duk_hstring *h, duk_uint_t pos, duk_bool_t surrogate_aware); DUK_INTERNAL_DECL duk_bool_t duk_hstring_equals_ascii_cstring(duk_hstring *h, const char *cstr); DUK_INTERNAL_DECL duk_size_t duk_hstring_get_charlen(duk_hstring *h); #if !defined(DUK_USE_HSTRING_LAZY_CLEN) DUK_INTERNAL_DECL void duk_hstring_init_charlen(duk_hstring *h); #endif #endif /* DUK_HSTRING_H_INCLUDED */ /* #include duk_hobject.h */ #line 1 "duk_hobject.h" /* * Heap object representation. * * Heap objects are used for Ecmascript objects, arrays, and functions, * but also for internal control like declarative and object environment * records. Compiled functions, native functions, and threads are also * objects but with an extended C struct. * * Objects provide the required Ecmascript semantics and exotic behaviors * especially for property access. * * Properties are stored in three conceptual parts: * * 1. A linear 'entry part' contains ordered key-value-attributes triples * and is the main method of string properties. * * 2. An optional linear 'array part' is used for array objects to store a * (dense) range of [0,N[ array indexed entries with default attributes * (writable, enumerable, configurable). If the array part would become * sparse or non-default attributes are required, the array part is * abandoned and moved to the 'entry part'. * * 3. An optional 'hash part' is used to optimize lookups of the entry * part; it is used only for objects with sufficiently many properties * and can be abandoned without loss of information. * * These three conceptual parts are stored in a single memory allocated area. * This minimizes memory allocation overhead but also means that all three * parts are resized together, and makes property access a bit complicated. */ #if !defined(DUK_HOBJECT_H_INCLUDED) #define DUK_HOBJECT_H_INCLUDED /* Object flags. Make sure this stays in sync with debugger object * inspection code. */ /* XXX: some flags are object subtype specific (e.g. common to all function * subtypes, duk_harray, etc) and could be reused for different subtypes. */ #define DUK_HOBJECT_FLAG_EXTENSIBLE DUK_HEAPHDR_USER_FLAG(0) /* object is extensible */ #define DUK_HOBJECT_FLAG_CONSTRUCTABLE DUK_HEAPHDR_USER_FLAG(1) /* object is constructable */ #define DUK_HOBJECT_FLAG_CALLABLE DUK_HEAPHDR_USER_FLAG(2) /* object is callable */ #define DUK_HOBJECT_FLAG_BOUNDFUNC DUK_HEAPHDR_USER_FLAG(3) /* object established using Function.prototype.bind() */ #define DUK_HOBJECT_FLAG_COMPFUNC DUK_HEAPHDR_USER_FLAG(4) /* object is a compiled function (duk_hcompfunc) */ #define DUK_HOBJECT_FLAG_NATFUNC DUK_HEAPHDR_USER_FLAG(5) /* object is a native function (duk_hnatfunc) */ #define DUK_HOBJECT_FLAG_BUFOBJ DUK_HEAPHDR_USER_FLAG(6) /* object is a buffer object (duk_hbufobj) (always exotic) */ #define DUK_HOBJECT_FLAG_FASTREFS DUK_HEAPHDR_USER_FLAG(7) /* object has no fields needing DECREF/marking beyond base duk_hobject header */ #define DUK_HOBJECT_FLAG_ARRAY_PART DUK_HEAPHDR_USER_FLAG(8) /* object has an array part (a_size may still be 0) */ #define DUK_HOBJECT_FLAG_STRICT DUK_HEAPHDR_USER_FLAG(9) /* function: function object is strict */ #define DUK_HOBJECT_FLAG_NOTAIL DUK_HEAPHDR_USER_FLAG(10) /* function: function must not be tail called */ #define DUK_HOBJECT_FLAG_NEWENV DUK_HEAPHDR_USER_FLAG(11) /* function: create new environment when called (see duk_hcompfunc) */ #define DUK_HOBJECT_FLAG_NAMEBINDING DUK_HEAPHDR_USER_FLAG(12) /* function: create binding for func name (function templates only, used for named function expressions) */ #define DUK_HOBJECT_FLAG_CREATEARGS DUK_HEAPHDR_USER_FLAG(13) /* function: create an arguments object on function call */ #define DUK_HOBJECT_FLAG_HAVE_FINALIZER DUK_HEAPHDR_USER_FLAG(14) /* object has a callable (own) finalizer property */ #define DUK_HOBJECT_FLAG_EXOTIC_ARRAY DUK_HEAPHDR_USER_FLAG(15) /* 'Array' object, array length and index exotic behavior */ #define DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ DUK_HEAPHDR_USER_FLAG(16) /* 'String' object, array index exotic behavior */ #define DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS DUK_HEAPHDR_USER_FLAG(17) /* 'Arguments' object and has arguments exotic behavior (non-strict callee) */ #define DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ DUK_HEAPHDR_USER_FLAG(18) /* 'Proxy' object */ #define DUK_HOBJECT_FLAG_SPECIAL_CALL DUK_HEAPHDR_USER_FLAG(19) /* special casing in call behavior, for .call(), .apply(), etc. */ #define DUK_HOBJECT_FLAG_CLASS_BASE DUK_HEAPHDR_USER_FLAG_NUMBER(20) #define DUK_HOBJECT_FLAG_CLASS_BITS 5 #define DUK_HOBJECT_GET_CLASS_NUMBER(h) \ DUK_HEAPHDR_GET_FLAG_RANGE(&(h)->hdr, DUK_HOBJECT_FLAG_CLASS_BASE, DUK_HOBJECT_FLAG_CLASS_BITS) #define DUK_HOBJECT_SET_CLASS_NUMBER(h,v) \ DUK_HEAPHDR_SET_FLAG_RANGE(&(h)->hdr, DUK_HOBJECT_FLAG_CLASS_BASE, DUK_HOBJECT_FLAG_CLASS_BITS, (v)) #define DUK_HOBJECT_GET_CLASS_MASK(h) \ (1UL << DUK_HEAPHDR_GET_FLAG_RANGE(&(h)->hdr, DUK_HOBJECT_FLAG_CLASS_BASE, DUK_HOBJECT_FLAG_CLASS_BITS)) /* Macro for creating flag initializer from a class number. * Unsigned type cast is needed to avoid warnings about coercing * a signed integer to an unsigned one; the largest class values * have the highest bit (bit 31) set which causes this. */ #define DUK_HOBJECT_CLASS_AS_FLAGS(v) (((duk_uint_t) (v)) << DUK_HOBJECT_FLAG_CLASS_BASE) /* E5 Section 8.6.2 + custom classes */ #define DUK_HOBJECT_CLASS_NONE 0 #define DUK_HOBJECT_CLASS_OBJECT 1 #define DUK_HOBJECT_CLASS_ARRAY 2 #define DUK_HOBJECT_CLASS_FUNCTION 3 #define DUK_HOBJECT_CLASS_ARGUMENTS 4 #define DUK_HOBJECT_CLASS_BOOLEAN 5 #define DUK_HOBJECT_CLASS_DATE 6 #define DUK_HOBJECT_CLASS_ERROR 7 #define DUK_HOBJECT_CLASS_JSON 8 #define DUK_HOBJECT_CLASS_MATH 9 #define DUK_HOBJECT_CLASS_NUMBER 10 #define DUK_HOBJECT_CLASS_REGEXP 11 #define DUK_HOBJECT_CLASS_STRING 12 #define DUK_HOBJECT_CLASS_GLOBAL 13 #define DUK_HOBJECT_CLASS_SYMBOL 14 #define DUK_HOBJECT_CLASS_OBJENV 15 /* custom */ #define DUK_HOBJECT_CLASS_DECENV 16 /* custom */ #define DUK_HOBJECT_CLASS_POINTER 17 /* custom */ #define DUK_HOBJECT_CLASS_THREAD 18 /* custom; implies DUK_HOBJECT_IS_THREAD */ #define DUK_HOBJECT_CLASS_BUFOBJ_MIN 19 #define DUK_HOBJECT_CLASS_ARRAYBUFFER 19 /* implies DUK_HOBJECT_IS_BUFOBJ */ #define DUK_HOBJECT_CLASS_DATAVIEW 20 #define DUK_HOBJECT_CLASS_INT8ARRAY 21 #define DUK_HOBJECT_CLASS_UINT8ARRAY 22 #define DUK_HOBJECT_CLASS_UINT8CLAMPEDARRAY 23 #define DUK_HOBJECT_CLASS_INT16ARRAY 24 #define DUK_HOBJECT_CLASS_UINT16ARRAY 25 #define DUK_HOBJECT_CLASS_INT32ARRAY 26 #define DUK_HOBJECT_CLASS_UINT32ARRAY 27 #define DUK_HOBJECT_CLASS_FLOAT32ARRAY 28 #define DUK_HOBJECT_CLASS_FLOAT64ARRAY 29 #define DUK_HOBJECT_CLASS_BUFOBJ_MAX 29 #define DUK_HOBJECT_CLASS_MAX 29 /* Class masks. */ #define DUK_HOBJECT_CMASK_ALL ((1UL << (DUK_HOBJECT_CLASS_MAX + 1)) - 1UL) #define DUK_HOBJECT_CMASK_NONE (1UL << DUK_HOBJECT_CLASS_NONE) #define DUK_HOBJECT_CMASK_ARGUMENTS (1UL << DUK_HOBJECT_CLASS_ARGUMENTS) #define DUK_HOBJECT_CMASK_ARRAY (1UL << DUK_HOBJECT_CLASS_ARRAY) #define DUK_HOBJECT_CMASK_BOOLEAN (1UL << DUK_HOBJECT_CLASS_BOOLEAN) #define DUK_HOBJECT_CMASK_DATE (1UL << DUK_HOBJECT_CLASS_DATE) #define DUK_HOBJECT_CMASK_ERROR (1UL << DUK_HOBJECT_CLASS_ERROR) #define DUK_HOBJECT_CMASK_FUNCTION (1UL << DUK_HOBJECT_CLASS_FUNCTION) #define DUK_HOBJECT_CMASK_JSON (1UL << DUK_HOBJECT_CLASS_JSON) #define DUK_HOBJECT_CMASK_MATH (1UL << DUK_HOBJECT_CLASS_MATH) #define DUK_HOBJECT_CMASK_NUMBER (1UL << DUK_HOBJECT_CLASS_NUMBER) #define DUK_HOBJECT_CMASK_OBJECT (1UL << DUK_HOBJECT_CLASS_OBJECT) #define DUK_HOBJECT_CMASK_REGEXP (1UL << DUK_HOBJECT_CLASS_REGEXP) #define DUK_HOBJECT_CMASK_STRING (1UL << DUK_HOBJECT_CLASS_STRING) #define DUK_HOBJECT_CMASK_GLOBAL (1UL << DUK_HOBJECT_CLASS_GLOBAL) #define DUK_HOBJECT_CMASK_SYMBOL (1UL << DUK_HOBJECT_CLASS_SYMBOL) #define DUK_HOBJECT_CMASK_OBJENV (1UL << DUK_HOBJECT_CLASS_OBJENV) #define DUK_HOBJECT_CMASK_DECENV (1UL << DUK_HOBJECT_CLASS_DECENV) #define DUK_HOBJECT_CMASK_POINTER (1UL << DUK_HOBJECT_CLASS_POINTER) #define DUK_HOBJECT_CMASK_ARRAYBUFFER (1UL << DUK_HOBJECT_CLASS_ARRAYBUFFER) #define DUK_HOBJECT_CMASK_DATAVIEW (1UL << DUK_HOBJECT_CLASS_DATAVIEW) #define DUK_HOBJECT_CMASK_INT8ARRAY (1UL << DUK_HOBJECT_CLASS_INT8ARRAY) #define DUK_HOBJECT_CMASK_UINT8ARRAY (1UL << DUK_HOBJECT_CLASS_UINT8ARRAY) #define DUK_HOBJECT_CMASK_UINT8CLAMPEDARRAY (1UL << DUK_HOBJECT_CLASS_UINT8CLAMPEDARRAY) #define DUK_HOBJECT_CMASK_INT16ARRAY (1UL << DUK_HOBJECT_CLASS_INT16ARRAY) #define DUK_HOBJECT_CMASK_UINT16ARRAY (1UL << DUK_HOBJECT_CLASS_UINT16ARRAY) #define DUK_HOBJECT_CMASK_INT32ARRAY (1UL << DUK_HOBJECT_CLASS_INT32ARRAY) #define DUK_HOBJECT_CMASK_UINT32ARRAY (1UL << DUK_HOBJECT_CLASS_UINT32ARRAY) #define DUK_HOBJECT_CMASK_FLOAT32ARRAY (1UL << DUK_HOBJECT_CLASS_FLOAT32ARRAY) #define DUK_HOBJECT_CMASK_FLOAT64ARRAY (1UL << DUK_HOBJECT_CLASS_FLOAT64ARRAY) #define DUK_HOBJECT_CMASK_ALL_BUFOBJS \ (DUK_HOBJECT_CMASK_ARRAYBUFFER | \ DUK_HOBJECT_CMASK_DATAVIEW | \ DUK_HOBJECT_CMASK_INT8ARRAY | \ DUK_HOBJECT_CMASK_UINT8ARRAY | \ DUK_HOBJECT_CMASK_UINT8CLAMPEDARRAY | \ DUK_HOBJECT_CMASK_INT16ARRAY | \ DUK_HOBJECT_CMASK_UINT16ARRAY | \ DUK_HOBJECT_CMASK_INT32ARRAY | \ DUK_HOBJECT_CMASK_UINT32ARRAY | \ DUK_HOBJECT_CMASK_FLOAT32ARRAY | \ DUK_HOBJECT_CMASK_FLOAT64ARRAY) #define DUK_HOBJECT_IS_OBJENV(h) (DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_OBJENV) #define DUK_HOBJECT_IS_DECENV(h) (DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_DECENV) #define DUK_HOBJECT_IS_ENV(h) (DUK_HOBJECT_IS_OBJENV((h)) || DUK_HOBJECT_IS_DECENV((h))) #define DUK_HOBJECT_IS_ARRAY(h) DUK_HOBJECT_HAS_EXOTIC_ARRAY((h)) /* Rely on class Array <=> exotic Array */ #define DUK_HOBJECT_IS_BOUNDFUNC(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BOUNDFUNC) #define DUK_HOBJECT_IS_COMPFUNC(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_COMPFUNC) #define DUK_HOBJECT_IS_NATFUNC(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NATFUNC) #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) #define DUK_HOBJECT_IS_BUFOBJ(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BUFOBJ) #else #define DUK_HOBJECT_IS_BUFOBJ(h) 0 #endif #define DUK_HOBJECT_IS_THREAD(h) (DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_THREAD) #if defined(DUK_USE_ES6_PROXY) #define DUK_HOBJECT_IS_PROXY(h) DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ((h)) #else #define DUK_HOBJECT_IS_PROXY(h) 0 #endif #define DUK_HOBJECT_IS_NONBOUND_FUNCTION(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, \ DUK_HOBJECT_FLAG_COMPFUNC | \ DUK_HOBJECT_FLAG_NATFUNC) #define DUK_HOBJECT_IS_FUNCTION(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, \ DUK_HOBJECT_FLAG_BOUNDFUNC | \ DUK_HOBJECT_FLAG_COMPFUNC | \ DUK_HOBJECT_FLAG_NATFUNC) #define DUK_HOBJECT_IS_CALLABLE(h) DUK_HOBJECT_HAS_CALLABLE((h)) /* Object has any exotic behavior(s). */ #define DUK_HOBJECT_EXOTIC_BEHAVIOR_FLAGS (DUK_HOBJECT_FLAG_EXOTIC_ARRAY | \ DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS | \ DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ | \ DUK_HOBJECT_FLAG_BUFOBJ | \ DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ) #define DUK_HOBJECT_HAS_EXOTIC_BEHAVIOR(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_EXOTIC_BEHAVIOR_FLAGS) /* Object has any virtual properties (not counting Proxy behavior). */ #define DUK_HOBJECT_VIRTUAL_PROPERTY_FLAGS (DUK_HOBJECT_FLAG_EXOTIC_ARRAY | \ DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ | \ DUK_HOBJECT_FLAG_BUFOBJ) #define DUK_HOBJECT_HAS_VIRTUAL_PROPERTIES(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_VIRTUAL_PROPERTY_FLAGS) #define DUK_HOBJECT_HAS_EXTENSIBLE(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXTENSIBLE) #define DUK_HOBJECT_HAS_CONSTRUCTABLE(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CONSTRUCTABLE) #define DUK_HOBJECT_HAS_CALLABLE(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CALLABLE) #define DUK_HOBJECT_HAS_BOUNDFUNC(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BOUNDFUNC) #define DUK_HOBJECT_HAS_COMPFUNC(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_COMPFUNC) #define DUK_HOBJECT_HAS_NATFUNC(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NATFUNC) #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) #define DUK_HOBJECT_HAS_BUFOBJ(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BUFOBJ) #else #define DUK_HOBJECT_HAS_BUFOBJ(h) 0 #endif #define DUK_HOBJECT_HAS_FASTREFS(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_FASTREFS) #define DUK_HOBJECT_HAS_ARRAY_PART(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_ARRAY_PART) #define DUK_HOBJECT_HAS_STRICT(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_STRICT) #define DUK_HOBJECT_HAS_NOTAIL(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NOTAIL) #define DUK_HOBJECT_HAS_NEWENV(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NEWENV) #define DUK_HOBJECT_HAS_NAMEBINDING(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NAMEBINDING) #define DUK_HOBJECT_HAS_CREATEARGS(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CREATEARGS) #define DUK_HOBJECT_HAS_HAVE_FINALIZER(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_HAVE_FINALIZER) #define DUK_HOBJECT_HAS_EXOTIC_ARRAY(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARRAY) #define DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ) #define DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS) #if defined(DUK_USE_ES6_PROXY) #define DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ) #else #define DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ(h) 0 #endif #define DUK_HOBJECT_HAS_SPECIAL_CALL(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_SPECIAL_CALL) #define DUK_HOBJECT_SET_EXTENSIBLE(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXTENSIBLE) #define DUK_HOBJECT_SET_CONSTRUCTABLE(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CONSTRUCTABLE) #define DUK_HOBJECT_SET_CALLABLE(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CALLABLE) #define DUK_HOBJECT_SET_BOUNDFUNC(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BOUNDFUNC) #define DUK_HOBJECT_SET_COMPFUNC(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_COMPFUNC) #define DUK_HOBJECT_SET_NATFUNC(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NATFUNC) #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) #define DUK_HOBJECT_SET_BUFOBJ(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BUFOBJ) #endif #define DUK_HOBJECT_SET_FASTREFS(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_FASTREFS) #define DUK_HOBJECT_SET_ARRAY_PART(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_ARRAY_PART) #define DUK_HOBJECT_SET_STRICT(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_STRICT) #define DUK_HOBJECT_SET_NOTAIL(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NOTAIL) #define DUK_HOBJECT_SET_NEWENV(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NEWENV) #define DUK_HOBJECT_SET_NAMEBINDING(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NAMEBINDING) #define DUK_HOBJECT_SET_CREATEARGS(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CREATEARGS) #define DUK_HOBJECT_SET_HAVE_FINALIZER(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_HAVE_FINALIZER) #define DUK_HOBJECT_SET_EXOTIC_ARRAY(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARRAY) #define DUK_HOBJECT_SET_EXOTIC_STRINGOBJ(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ) #define DUK_HOBJECT_SET_EXOTIC_ARGUMENTS(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS) #if defined(DUK_USE_ES6_PROXY) #define DUK_HOBJECT_SET_EXOTIC_PROXYOBJ(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ) #endif #define DUK_HOBJECT_SET_SPECIAL_CALL(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_SPECIAL_CALL) #define DUK_HOBJECT_CLEAR_EXTENSIBLE(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXTENSIBLE) #define DUK_HOBJECT_CLEAR_CONSTRUCTABLE(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CONSTRUCTABLE) #define DUK_HOBJECT_CLEAR_CALLABLE(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CALLABLE) #define DUK_HOBJECT_CLEAR_BOUNDFUNC(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BOUNDFUNC) #define DUK_HOBJECT_CLEAR_COMPFUNC(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_COMPFUNC) #define DUK_HOBJECT_CLEAR_NATFUNC(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NATFUNC) #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) #define DUK_HOBJECT_CLEAR_BUFOBJ(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BUFOBJ) #endif #define DUK_HOBJECT_CLEAR_FASTREFS(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_FASTREFS) #define DUK_HOBJECT_CLEAR_ARRAY_PART(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_ARRAY_PART) #define DUK_HOBJECT_CLEAR_STRICT(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_STRICT) #define DUK_HOBJECT_CLEAR_NOTAIL(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NOTAIL) #define DUK_HOBJECT_CLEAR_NEWENV(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NEWENV) #define DUK_HOBJECT_CLEAR_NAMEBINDING(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NAMEBINDING) #define DUK_HOBJECT_CLEAR_CREATEARGS(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CREATEARGS) #define DUK_HOBJECT_CLEAR_HAVE_FINALIZER(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_HAVE_FINALIZER) #define DUK_HOBJECT_CLEAR_EXOTIC_ARRAY(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARRAY) #define DUK_HOBJECT_CLEAR_EXOTIC_STRINGOBJ(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ) #define DUK_HOBJECT_CLEAR_EXOTIC_ARGUMENTS(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS) #if defined(DUK_USE_ES6_PROXY) #define DUK_HOBJECT_CLEAR_EXOTIC_PROXYOBJ(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ) #endif #define DUK_HOBJECT_CLEAR_SPECIAL_CALL(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_SPECIAL_CALL) /* Object can/cannot use FASTREFS, i.e. has no strong reference fields beyond * duk_hobject base header. This is used just for asserts so doesn't need to * be optimized. */ #define DUK_HOBJECT_PROHIBITS_FASTREFS(h) \ (DUK_HOBJECT_IS_COMPFUNC((h)) || DUK_HOBJECT_IS_DECENV((h)) || DUK_HOBJECT_IS_OBJENV((h)) || \ DUK_HOBJECT_IS_BUFOBJ((h)) || DUK_HOBJECT_IS_THREAD((h)) || DUK_HOBJECT_IS_PROXY((h)) || \ DUK_HOBJECT_IS_BOUNDFUNC((h))) #define DUK_HOBJECT_ALLOWS_FASTREFS(h) (!DUK_HOBJECT_PROHIBITS_FASTREFS((h))) /* Flags used for property attributes in duk_propdesc and packed flags. * Must fit into 8 bits. */ #define DUK_PROPDESC_FLAG_WRITABLE (1U << 0) /* E5 Section 8.6.1 */ #define DUK_PROPDESC_FLAG_ENUMERABLE (1U << 1) /* E5 Section 8.6.1 */ #define DUK_PROPDESC_FLAG_CONFIGURABLE (1U << 2) /* E5 Section 8.6.1 */ #define DUK_PROPDESC_FLAG_ACCESSOR (1U << 3) /* accessor */ #define DUK_PROPDESC_FLAG_VIRTUAL (1U << 4) /* property is virtual: used in duk_propdesc, never stored * (used by e.g. buffer virtual properties) */ #define DUK_PROPDESC_FLAGS_MASK (DUK_PROPDESC_FLAG_WRITABLE | \ DUK_PROPDESC_FLAG_ENUMERABLE | \ DUK_PROPDESC_FLAG_CONFIGURABLE | \ DUK_PROPDESC_FLAG_ACCESSOR) /* Additional flags which are passed in the same flags argument as property * flags but are not stored in object properties. */ #define DUK_PROPDESC_FLAG_NO_OVERWRITE (1U << 4) /* internal define property: skip write silently if exists */ /* Convenience defines for property attributes. */ #define DUK_PROPDESC_FLAGS_NONE 0 #define DUK_PROPDESC_FLAGS_W (DUK_PROPDESC_FLAG_WRITABLE) #define DUK_PROPDESC_FLAGS_E (DUK_PROPDESC_FLAG_ENUMERABLE) #define DUK_PROPDESC_FLAGS_C (DUK_PROPDESC_FLAG_CONFIGURABLE) #define DUK_PROPDESC_FLAGS_WE (DUK_PROPDESC_FLAG_WRITABLE | DUK_PROPDESC_FLAG_ENUMERABLE) #define DUK_PROPDESC_FLAGS_WC (DUK_PROPDESC_FLAG_WRITABLE | DUK_PROPDESC_FLAG_CONFIGURABLE) #define DUK_PROPDESC_FLAGS_EC (DUK_PROPDESC_FLAG_ENUMERABLE | DUK_PROPDESC_FLAG_CONFIGURABLE) #define DUK_PROPDESC_FLAGS_WEC (DUK_PROPDESC_FLAG_WRITABLE | \ DUK_PROPDESC_FLAG_ENUMERABLE | \ DUK_PROPDESC_FLAG_CONFIGURABLE) /* Flags for duk_hobject_get_own_propdesc() and variants. */ #define DUK_GETDESC_FLAG_PUSH_VALUE (1U << 0) /* push value to stack */ #define DUK_GETDESC_FLAG_IGNORE_PROTOLOOP (1U << 1) /* don't throw for prototype loop */ /* * Macro for object validity check * * Assert for currently guaranteed relations between flags, for instance. */ #define DUK_ASSERT_HOBJECT_VALID(h) do { \ DUK_ASSERT((h) != NULL); \ DUK_ASSERT(!DUK_HOBJECT_IS_CALLABLE((h)) || \ DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_FUNCTION); \ DUK_ASSERT(!DUK_HOBJECT_IS_BUFOBJ((h)) || \ (DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_ARRAYBUFFER || \ DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_DATAVIEW || \ DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_INT8ARRAY || \ DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_UINT8ARRAY || \ DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_UINT8CLAMPEDARRAY || \ DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_INT16ARRAY || \ DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_UINT16ARRAY || \ DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_INT32ARRAY || \ DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_UINT32ARRAY || \ DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_FLOAT32ARRAY || \ DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_FLOAT64ARRAY)); \ /* Object is an Array <=> object has exotic array behavior */ \ DUK_ASSERT((DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_ARRAY && DUK_HOBJECT_HAS_EXOTIC_ARRAY((h))) || \ (DUK_HOBJECT_GET_CLASS_NUMBER((h)) != DUK_HOBJECT_CLASS_ARRAY && !DUK_HOBJECT_HAS_EXOTIC_ARRAY((h)))); \ } while (0) /* * Macros to access the 'props' allocation. */ #if defined(DUK_USE_HEAPPTR16) #define DUK_HOBJECT_GET_PROPS(heap,h) \ ((duk_uint8_t *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, ((duk_heaphdr *) (h))->h_extra16)) #define DUK_HOBJECT_SET_PROPS(heap,h,x) do { \ ((duk_heaphdr *) (h))->h_extra16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (x)); \ } while (0) #else #define DUK_HOBJECT_GET_PROPS(heap,h) \ ((h)->props) #define DUK_HOBJECT_SET_PROPS(heap,h,x) do { \ (h)->props = (duk_uint8_t *) (x); \ } while (0) #endif #if defined(DUK_USE_HOBJECT_LAYOUT_1) /* LAYOUT 1 */ #define DUK_HOBJECT_E_GET_KEY_BASE(heap,h) \ ((duk_hstring **) (void *) ( \ DUK_HOBJECT_GET_PROPS((heap), (h)) \ )) #define DUK_HOBJECT_E_GET_VALUE_BASE(heap,h) \ ((duk_propvalue *) (void *) ( \ DUK_HOBJECT_GET_PROPS((heap), (h)) + \ DUK_HOBJECT_GET_ESIZE((h)) * sizeof(duk_hstring *) \ )) #define DUK_HOBJECT_E_GET_FLAGS_BASE(heap,h) \ ((duk_uint8_t *) (void *) ( \ DUK_HOBJECT_GET_PROPS((heap), (h)) + DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue)) \ )) #define DUK_HOBJECT_A_GET_BASE(heap,h) \ ((duk_tval *) (void *) ( \ DUK_HOBJECT_GET_PROPS((heap), (h)) + \ DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) \ )) #define DUK_HOBJECT_H_GET_BASE(heap,h) \ ((duk_uint32_t *) (void *) ( \ DUK_HOBJECT_GET_PROPS((heap), (h)) + \ DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) + \ DUK_HOBJECT_GET_ASIZE((h)) * sizeof(duk_tval) \ )) #define DUK_HOBJECT_P_COMPUTE_SIZE(n_ent,n_arr,n_hash) \ ( \ (n_ent) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) + \ (n_arr) * sizeof(duk_tval) + \ (n_hash) * sizeof(duk_uint32_t) \ ) #define DUK_HOBJECT_P_SET_REALLOC_PTRS(p_base,set_e_k,set_e_pv,set_e_f,set_a,set_h,n_ent,n_arr,n_hash) do { \ (set_e_k) = (duk_hstring **) (void *) (p_base); \ (set_e_pv) = (duk_propvalue *) (void *) ((set_e_k) + (n_ent)); \ (set_e_f) = (duk_uint8_t *) (void *) ((set_e_pv) + (n_ent)); \ (set_a) = (duk_tval *) (void *) ((set_e_f) + (n_ent)); \ (set_h) = (duk_uint32_t *) (void *) ((set_a) + (n_arr)); \ } while (0) #elif defined(DUK_USE_HOBJECT_LAYOUT_2) /* LAYOUT 2 */ #if (DUK_USE_ALIGN_BY == 4) #define DUK_HOBJECT_E_FLAG_PADDING(e_sz) ((4 - (e_sz)) & 0x03) #elif (DUK_USE_ALIGN_BY == 8) #define DUK_HOBJECT_E_FLAG_PADDING(e_sz) ((8 - (e_sz)) & 0x07) #elif (DUK_USE_ALIGN_BY == 1) #define DUK_HOBJECT_E_FLAG_PADDING(e_sz) 0 #else #error invalid DUK_USE_ALIGN_BY #endif #define DUK_HOBJECT_E_GET_KEY_BASE(heap,h) \ ((duk_hstring **) (void *) ( \ DUK_HOBJECT_GET_PROPS((heap), (h)) + \ DUK_HOBJECT_GET_ESIZE((h)) * sizeof(duk_propvalue) \ )) #define DUK_HOBJECT_E_GET_VALUE_BASE(heap,h) \ ((duk_propvalue *) (void *) ( \ DUK_HOBJECT_GET_PROPS((heap), (h)) \ )) #define DUK_HOBJECT_E_GET_FLAGS_BASE(heap,h) \ ((duk_uint8_t *) (void *) ( \ DUK_HOBJECT_GET_PROPS((heap), (h)) + DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue)) \ )) #define DUK_HOBJECT_A_GET_BASE(heap,h) \ ((duk_tval *) (void *) ( \ DUK_HOBJECT_GET_PROPS((heap), (h)) + \ DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) + \ DUK_HOBJECT_E_FLAG_PADDING(DUK_HOBJECT_GET_ESIZE((h))) \ )) #define DUK_HOBJECT_H_GET_BASE(heap,h) \ ((duk_uint32_t *) (void *) ( \ DUK_HOBJECT_GET_PROPS((heap), (h)) + \ DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) + \ DUK_HOBJECT_E_FLAG_PADDING(DUK_HOBJECT_GET_ESIZE((h))) + \ DUK_HOBJECT_GET_ASIZE((h)) * sizeof(duk_tval) \ )) #define DUK_HOBJECT_P_COMPUTE_SIZE(n_ent,n_arr,n_hash) \ ( \ (n_ent) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) + \ DUK_HOBJECT_E_FLAG_PADDING((n_ent)) + \ (n_arr) * sizeof(duk_tval) + \ (n_hash) * sizeof(duk_uint32_t) \ ) #define DUK_HOBJECT_P_SET_REALLOC_PTRS(p_base,set_e_k,set_e_pv,set_e_f,set_a,set_h,n_ent,n_arr,n_hash) do { \ (set_e_pv) = (duk_propvalue *) (void *) (p_base); \ (set_e_k) = (duk_hstring **) (void *) ((set_e_pv) + (n_ent)); \ (set_e_f) = (duk_uint8_t *) (void *) ((set_e_k) + (n_ent)); \ (set_a) = (duk_tval *) (void *) (((duk_uint8_t *) (set_e_f)) + \ sizeof(duk_uint8_t) * (n_ent) + \ DUK_HOBJECT_E_FLAG_PADDING((n_ent))); \ (set_h) = (duk_uint32_t *) (void *) ((set_a) + (n_arr)); \ } while (0) #elif defined(DUK_USE_HOBJECT_LAYOUT_3) /* LAYOUT 3 */ #define DUK_HOBJECT_E_GET_KEY_BASE(heap,h) \ ((duk_hstring **) (void *) ( \ DUK_HOBJECT_GET_PROPS((heap), (h)) + \ DUK_HOBJECT_GET_ESIZE((h)) * sizeof(duk_propvalue) + \ DUK_HOBJECT_GET_ASIZE((h)) * sizeof(duk_tval) \ )) #define DUK_HOBJECT_E_GET_VALUE_BASE(heap,h) \ ((duk_propvalue *) (void *) ( \ DUK_HOBJECT_GET_PROPS((heap), (h)) \ )) #define DUK_HOBJECT_E_GET_FLAGS_BASE(heap,h) \ ((duk_uint8_t *) (void *) ( \ DUK_HOBJECT_GET_PROPS((heap), (h)) + \ DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_propvalue) + sizeof(duk_hstring *)) + \ DUK_HOBJECT_GET_ASIZE((h)) * sizeof(duk_tval) + \ DUK_HOBJECT_GET_HSIZE((h)) * sizeof(duk_uint32_t) \ )) #define DUK_HOBJECT_A_GET_BASE(heap,h) \ ((duk_tval *) (void *) ( \ DUK_HOBJECT_GET_PROPS((heap), (h)) + \ DUK_HOBJECT_GET_ESIZE((h)) * sizeof(duk_propvalue) \ )) #define DUK_HOBJECT_H_GET_BASE(heap,h) \ ((duk_uint32_t *) (void *) ( \ DUK_HOBJECT_GET_PROPS((heap), (h)) + \ DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_propvalue) + sizeof(duk_hstring *)) + \ DUK_HOBJECT_GET_ASIZE((h)) * sizeof(duk_tval) \ )) #define DUK_HOBJECT_P_COMPUTE_SIZE(n_ent,n_arr,n_hash) \ ( \ (n_ent) * (sizeof(duk_propvalue) + sizeof(duk_hstring *) + sizeof(duk_uint8_t)) + \ (n_arr) * sizeof(duk_tval) + \ (n_hash) * sizeof(duk_uint32_t) \ ) #define DUK_HOBJECT_P_SET_REALLOC_PTRS(p_base,set_e_k,set_e_pv,set_e_f,set_a,set_h,n_ent,n_arr,n_hash) do { \ (set_e_pv) = (duk_propvalue *) (void *) (p_base); \ (set_a) = (duk_tval *) (void *) ((set_e_pv) + (n_ent)); \ (set_e_k) = (duk_hstring **) (void *) ((set_a) + (n_arr)); \ (set_h) = (duk_uint32_t *) (void *) ((set_e_k) + (n_ent)); \ (set_e_f) = (duk_uint8_t *) (void *) ((set_h) + (n_hash)); \ } while (0) #else #error invalid hobject layout defines #endif /* hobject property layout */ #define DUK_HOBJECT_P_ALLOC_SIZE(h) \ DUK_HOBJECT_P_COMPUTE_SIZE(DUK_HOBJECT_GET_ESIZE((h)), DUK_HOBJECT_GET_ASIZE((h)), DUK_HOBJECT_GET_HSIZE((h))) #define DUK_HOBJECT_E_GET_KEY(heap,h,i) (DUK_HOBJECT_E_GET_KEY_BASE((heap), (h))[(i)]) #define DUK_HOBJECT_E_GET_KEY_PTR(heap,h,i) (&DUK_HOBJECT_E_GET_KEY_BASE((heap), (h))[(i)]) #define DUK_HOBJECT_E_GET_VALUE(heap,h,i) (DUK_HOBJECT_E_GET_VALUE_BASE((heap), (h))[(i)]) #define DUK_HOBJECT_E_GET_VALUE_PTR(heap,h,i) (&DUK_HOBJECT_E_GET_VALUE_BASE((heap), (h))[(i)]) #define DUK_HOBJECT_E_GET_VALUE_TVAL(heap,h,i) (DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).v) #define DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(heap,h,i) (&DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).v) #define DUK_HOBJECT_E_GET_VALUE_GETTER(heap,h,i) (DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.get) #define DUK_HOBJECT_E_GET_VALUE_GETTER_PTR(heap,h,i) (&DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.get) #define DUK_HOBJECT_E_GET_VALUE_SETTER(heap,h,i) (DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.set) #define DUK_HOBJECT_E_GET_VALUE_SETTER_PTR(heap,h,i) (&DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.set) #define DUK_HOBJECT_E_GET_FLAGS(heap,h,i) (DUK_HOBJECT_E_GET_FLAGS_BASE((heap), (h))[(i)]) #define DUK_HOBJECT_E_GET_FLAGS_PTR(heap,h,i) (&DUK_HOBJECT_E_GET_FLAGS_BASE((heap), (h))[(i)]) #define DUK_HOBJECT_A_GET_VALUE(heap,h,i) (DUK_HOBJECT_A_GET_BASE((heap), (h))[(i)]) #define DUK_HOBJECT_A_GET_VALUE_PTR(heap,h,i) (&DUK_HOBJECT_A_GET_BASE((heap), (h))[(i)]) #define DUK_HOBJECT_H_GET_INDEX(heap,h,i) (DUK_HOBJECT_H_GET_BASE((heap), (h))[(i)]) #define DUK_HOBJECT_H_GET_INDEX_PTR(heap,h,i) (&DUK_HOBJECT_H_GET_BASE((heap), (h))[(i)]) #define DUK_HOBJECT_E_SET_KEY(heap,h,i,k) do { \ DUK_HOBJECT_E_GET_KEY((heap), (h), (i)) = (k); \ } while (0) #define DUK_HOBJECT_E_SET_VALUE(heap,h,i,v) do { \ DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)) = (v); \ } while (0) #define DUK_HOBJECT_E_SET_VALUE_TVAL(heap,h,i,v) do { \ DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).v = (v); \ } while (0) #define DUK_HOBJECT_E_SET_VALUE_GETTER(heap,h,i,v) do { \ DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.get = (v); \ } while (0) #define DUK_HOBJECT_E_SET_VALUE_SETTER(heap,h,i,v) do { \ DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.set = (v); \ } while (0) #define DUK_HOBJECT_E_SET_FLAGS(heap,h,i,f) do { \ DUK_HOBJECT_E_GET_FLAGS((heap), (h), (i)) = (duk_uint8_t) (f); \ } while (0) #define DUK_HOBJECT_A_SET_VALUE(heap,h,i,v) do { \ DUK_HOBJECT_A_GET_VALUE((heap), (h), (i)) = (v); \ } while (0) #define DUK_HOBJECT_A_SET_VALUE_TVAL(heap,h,i,v) \ DUK_HOBJECT_A_SET_VALUE((heap), (h), (i), (v)) /* alias for above */ #define DUK_HOBJECT_H_SET_INDEX(heap,h,i,v) do { \ DUK_HOBJECT_H_GET_INDEX((heap), (h), (i)) = (v); \ } while (0) #define DUK_HOBJECT_E_SET_FLAG_BITS(heap,h,i,mask) do { \ DUK_HOBJECT_E_GET_FLAGS_BASE((heap), (h))[(i)] |= (mask); \ } while (0) #define DUK_HOBJECT_E_CLEAR_FLAG_BITS(heap,h,i,mask) do { \ DUK_HOBJECT_E_GET_FLAGS_BASE((heap), (h))[(i)] &= ~(mask); \ } while (0) #define DUK_HOBJECT_E_SLOT_IS_WRITABLE(heap,h,i) ((DUK_HOBJECT_E_GET_FLAGS((heap), (h), (i)) & DUK_PROPDESC_FLAG_WRITABLE) != 0) #define DUK_HOBJECT_E_SLOT_IS_ENUMERABLE(heap,h,i) ((DUK_HOBJECT_E_GET_FLAGS((heap), (h), (i)) & DUK_PROPDESC_FLAG_ENUMERABLE) != 0) #define DUK_HOBJECT_E_SLOT_IS_CONFIGURABLE(heap,h,i) ((DUK_HOBJECT_E_GET_FLAGS((heap), (h), (i)) & DUK_PROPDESC_FLAG_CONFIGURABLE) != 0) #define DUK_HOBJECT_E_SLOT_IS_ACCESSOR(heap,h,i) ((DUK_HOBJECT_E_GET_FLAGS((heap), (h), (i)) & DUK_PROPDESC_FLAG_ACCESSOR) != 0) #define DUK_HOBJECT_E_SLOT_SET_WRITABLE(heap,h,i) DUK_HOBJECT_E_SET_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_WRITABLE) #define DUK_HOBJECT_E_SLOT_SET_ENUMERABLE(heap,h,i) DUK_HOBJECT_E_SET_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_ENUMERABLE) #define DUK_HOBJECT_E_SLOT_SET_CONFIGURABLE(heap,h,i) DUK_HOBJECT_E_SET_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_CONFIGURABLE) #define DUK_HOBJECT_E_SLOT_SET_ACCESSOR(heap,h,i) DUK_HOBJECT_E_SET_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_ACCESSOR) #define DUK_HOBJECT_E_SLOT_CLEAR_WRITABLE(heap,h,i) DUK_HOBJECT_E_CLEAR_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_WRITABLE) #define DUK_HOBJECT_E_SLOT_CLEAR_ENUMERABLE(heap,h,i) DUK_HOBJECT_E_CLEAR_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_ENUMERABLE) #define DUK_HOBJECT_E_SLOT_CLEAR_CONFIGURABLE(heap,h,i) DUK_HOBJECT_E_CLEAR_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_CONFIGURABLE) #define DUK_HOBJECT_E_SLOT_CLEAR_ACCESSOR(heap,h,i) DUK_HOBJECT_E_CLEAR_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_ACCESSOR) #define DUK_PROPDESC_IS_WRITABLE(p) (((p)->flags & DUK_PROPDESC_FLAG_WRITABLE) != 0) #define DUK_PROPDESC_IS_ENUMERABLE(p) (((p)->flags & DUK_PROPDESC_FLAG_ENUMERABLE) != 0) #define DUK_PROPDESC_IS_CONFIGURABLE(p) (((p)->flags & DUK_PROPDESC_FLAG_CONFIGURABLE) != 0) #define DUK_PROPDESC_IS_ACCESSOR(p) (((p)->flags & DUK_PROPDESC_FLAG_ACCESSOR) != 0) #define DUK_HOBJECT_HASHIDX_UNUSED 0xffffffffUL #define DUK_HOBJECT_HASHIDX_DELETED 0xfffffffeUL /* * Macros for accessing size fields */ #if defined(DUK_USE_OBJSIZES16) #define DUK_HOBJECT_GET_ESIZE(h) ((h)->e_size16) #define DUK_HOBJECT_SET_ESIZE(h,v) do { (h)->e_size16 = (v); } while (0) #define DUK_HOBJECT_GET_ENEXT(h) ((h)->e_next16) #define DUK_HOBJECT_SET_ENEXT(h,v) do { (h)->e_next16 = (v); } while (0) #define DUK_HOBJECT_POSTINC_ENEXT(h) ((h)->e_next16++) #define DUK_HOBJECT_GET_ASIZE(h) ((h)->a_size16) #define DUK_HOBJECT_SET_ASIZE(h,v) do { (h)->a_size16 = (v); } while (0) #if defined(DUK_USE_HOBJECT_HASH_PART) #define DUK_HOBJECT_GET_HSIZE(h) ((h)->h_size16) #define DUK_HOBJECT_SET_HSIZE(h,v) do { (h)->h_size16 = (v); } while (0) #else #define DUK_HOBJECT_GET_HSIZE(h) 0 #define DUK_HOBJECT_SET_HSIZE(h,v) do { DUK_ASSERT((v) == 0); } while (0) #endif #else #define DUK_HOBJECT_GET_ESIZE(h) ((h)->e_size) #define DUK_HOBJECT_SET_ESIZE(h,v) do { (h)->e_size = (v); } while (0) #define DUK_HOBJECT_GET_ENEXT(h) ((h)->e_next) #define DUK_HOBJECT_SET_ENEXT(h,v) do { (h)->e_next = (v); } while (0) #define DUK_HOBJECT_POSTINC_ENEXT(h) ((h)->e_next++) #define DUK_HOBJECT_GET_ASIZE(h) ((h)->a_size) #define DUK_HOBJECT_SET_ASIZE(h,v) do { (h)->a_size = (v); } while (0) #if defined(DUK_USE_HOBJECT_HASH_PART) #define DUK_HOBJECT_GET_HSIZE(h) ((h)->h_size) #define DUK_HOBJECT_SET_HSIZE(h,v) do { (h)->h_size = (v); } while (0) #else #define DUK_HOBJECT_GET_HSIZE(h) 0 #define DUK_HOBJECT_SET_HSIZE(h,v) do { DUK_ASSERT((v) == 0); } while (0) #endif #endif /* * Misc */ /* Maximum prototype traversal depth. Sanity limit which handles e.g. * prototype loops (even complex ones like 1->2->3->4->2->3->4->2->3->4). */ #define DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY 10000L /* * Ecmascript [[Class]] */ /* range check not necessary because all 4-bit values are mapped */ #define DUK_HOBJECT_CLASS_NUMBER_TO_STRIDX(n) duk_class_number_to_stridx[(n)] #define DUK_HOBJECT_GET_CLASS_STRING(heap,h) \ DUK_HEAP_GET_STRING( \ (heap), \ DUK_HOBJECT_CLASS_NUMBER_TO_STRIDX(DUK_HOBJECT_GET_CLASS_NUMBER((h))) \ ) /* * Macros for property handling */ #if defined(DUK_USE_HEAPPTR16) #define DUK_HOBJECT_GET_PROTOTYPE(heap,h) \ ((duk_hobject *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->prototype16)) #define DUK_HOBJECT_SET_PROTOTYPE(heap,h,x) do { \ (h)->prototype16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (x)); \ } while (0) #else #define DUK_HOBJECT_GET_PROTOTYPE(heap,h) \ ((h)->prototype) #define DUK_HOBJECT_SET_PROTOTYPE(heap,h,x) do { \ (h)->prototype = (x); \ } while (0) #endif /* Set prototype, DECREF earlier value, INCREF new value (tolerating NULLs). */ #define DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr,h,p) duk_hobject_set_prototype_updref((thr), (h), (p)) /* Set initial prototype, assume NULL previous prototype, INCREF new value, * tolerate NULL. */ #define DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr,h,proto) do { \ duk_hthread *duk__thr = (thr); \ duk_hobject *duk__obj = (h); \ duk_hobject *duk__proto = (proto); \ DUK_UNREF(duk__thr); \ DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(duk__thr->heap, duk__obj) == NULL); \ DUK_HOBJECT_SET_PROTOTYPE(duk__thr->heap, duk__obj, duk__proto); \ DUK_HOBJECT_INCREF_ALLOWNULL(duk__thr, duk__proto); \ } while (0) /* * Finalizer check */ #if defined(DUK_USE_HEAPPTR16) #define DUK_HOBJECT_HAS_FINALIZER_FAST(heap,h) duk_hobject_has_finalizer_fast_raw((heap), (h)) #else #define DUK_HOBJECT_HAS_FINALIZER_FAST(heap,h) duk_hobject_has_finalizer_fast_raw((h)) #endif /* * Resizing and hash behavior */ /* Sanity limit on max number of properties (allocated, not necessarily used). * This is somewhat arbitrary, but if we're close to 2**32 properties some * algorithms will fail (e.g. hash size selection, next prime selection). * Also, we use negative array/entry table indices to indicate 'not found', * so anything above 0x80000000 will cause trouble now. */ #if defined(DUK_USE_OBJSIZES16) #define DUK_HOBJECT_MAX_PROPERTIES 0x0000ffffUL #else #define DUK_HOBJECT_MAX_PROPERTIES 0x3fffffffUL /* 2**30-1 ~= 1G properties */ #endif /* internal align target for props allocation, must be 2*n for some n */ #if (DUK_USE_ALIGN_BY == 4) #define DUK_HOBJECT_ALIGN_TARGET 4 #elif (DUK_USE_ALIGN_BY == 8) #define DUK_HOBJECT_ALIGN_TARGET 8 #elif (DUK_USE_ALIGN_BY == 1) #define DUK_HOBJECT_ALIGN_TARGET 1 #else #error invalid DUK_USE_ALIGN_BY #endif /* * PC-to-line constants */ #define DUK_PC2LINE_SKIP 64 /* maximum length for a SKIP-1 diffstream: 35 bits per entry, rounded up to bytes */ #define DUK_PC2LINE_MAX_DIFF_LENGTH (((DUK_PC2LINE_SKIP - 1) * 35 + 7) / 8) /* * Struct defs */ struct duk_propaccessor { duk_hobject *get; duk_hobject *set; }; union duk_propvalue { /* The get/set pointers could be 16-bit pointer compressed but it * would make no difference on 32-bit platforms because duk_tval is * 8 bytes or more anyway. */ duk_tval v; duk_propaccessor a; }; struct duk_propdesc { /* read-only values 'lifted' for ease of use */ duk_small_uint_t flags; duk_hobject *get; duk_hobject *set; /* for updating (all are set to < 0 for virtual properties) */ duk_int_t e_idx; /* prop index in 'entry part', < 0 if not there */ duk_int_t h_idx; /* prop index in 'hash part', < 0 if not there */ duk_int_t a_idx; /* prop index in 'array part', < 0 if not there */ }; struct duk_hobject { duk_heaphdr hdr; /* * 'props' contains {key,value,flags} entries, optional array entries, and * an optional hash lookup table for non-array entries in a single 'sliced' * allocation. There are several layout options, which differ slightly in * generated code size/speed and alignment/padding; duk_features.h selects * the layout used. * * Layout 1 (DUK_USE_HOBJECT_LAYOUT_1): * * e_size * sizeof(duk_hstring *) bytes of entry keys (e_next gc reachable) * e_size * sizeof(duk_propvalue) bytes of entry values (e_next gc reachable) * e_size * sizeof(duk_uint8_t) bytes of entry flags (e_next gc reachable) * a_size * sizeof(duk_tval) bytes of (opt) array values (plain only) (all gc reachable) * h_size * sizeof(duk_uint32_t) bytes of (opt) hash indexes to entries (e_size), * 0xffffffffUL = unused, 0xfffffffeUL = deleted * * Layout 2 (DUK_USE_HOBJECT_LAYOUT_2): * * e_size * sizeof(duk_propvalue) bytes of entry values (e_next gc reachable) * e_size * sizeof(duk_hstring *) bytes of entry keys (e_next gc reachable) * e_size * sizeof(duk_uint8_t) + pad bytes of entry flags (e_next gc reachable) * a_size * sizeof(duk_tval) bytes of (opt) array values (plain only) (all gc reachable) * h_size * sizeof(duk_uint32_t) bytes of (opt) hash indexes to entries (e_size), * 0xffffffffUL = unused, 0xfffffffeUL = deleted * * Layout 3 (DUK_USE_HOBJECT_LAYOUT_3): * * e_size * sizeof(duk_propvalue) bytes of entry values (e_next gc reachable) * a_size * sizeof(duk_tval) bytes of (opt) array values (plain only) (all gc reachable) * e_size * sizeof(duk_hstring *) bytes of entry keys (e_next gc reachable) * h_size * sizeof(duk_uint32_t) bytes of (opt) hash indexes to entries (e_size), * 0xffffffffUL = unused, 0xfffffffeUL = deleted * e_size * sizeof(duk_uint8_t) bytes of entry flags (e_next gc reachable) * * In layout 1, the 'e_next' count is rounded to 4 or 8 on platforms * requiring 4 or 8 byte alignment. This ensures proper alignment * for the entries, at the cost of memory footprint. However, it's * probably preferable to use another layout on such platforms instead. * * In layout 2, the key and value parts are swapped to avoid padding * the key array on platforms requiring alignment by 8. The flags part * is padded to get alignment for array entries. The 'e_next' count does * not need to be rounded as in layout 1. * * In layout 3, entry values and array values are always aligned properly, * and assuming pointers are at most 8 bytes, so are the entry keys. Hash * indices will be properly aligned (assuming pointers are at least 4 bytes). * Finally, flags don't need additional alignment. This layout provides * compact allocations without padding (even on platforms with alignment * requirements) at the cost of a bit slower lookups. * * Objects with few keys don't have a hash index; keys are looked up linearly, * which is cache efficient because the keys are consecutive. Larger objects * have a hash index part which contains integer indexes to the entries part. * * A single allocation reduces memory allocation overhead but requires more * work when any part needs to be resized. A sliced allocation for entries * makes linear key matching faster on most platforms (more locality) and * skimps on flags size (which would be followed by 3 bytes of padding in * most architectures if entries were placed in a struct). * * 'props' also contains internal properties distinguished with a non-BMP * prefix. Often used properties should be placed early in 'props' whenever * possible to make accessing them as fast a possible. */ #if defined(DUK_USE_HEAPPTR16) /* Located in duk_heaphdr h_extra16. Subclasses of duk_hobject (like * duk_hcompfunc) are not free to use h_extra16 for this reason. */ #else duk_uint8_t *props; #endif /* prototype: the only internal property lifted outside 'e' as it is so central */ #if defined(DUK_USE_HEAPPTR16) duk_uint16_t prototype16; #else duk_hobject *prototype; #endif #if defined(DUK_USE_OBJSIZES16) duk_uint16_t e_size16; duk_uint16_t e_next16; duk_uint16_t a_size16; #if defined(DUK_USE_HOBJECT_HASH_PART) duk_uint16_t h_size16; #endif #else duk_uint32_t e_size; /* entry part size */ duk_uint32_t e_next; /* index for next new key ([0,e_next[ are gc reachable) */ duk_uint32_t a_size; /* array part size (entirely gc reachable) */ #if defined(DUK_USE_HOBJECT_HASH_PART) duk_uint32_t h_size; /* hash part size or 0 if unused */ #endif #endif }; /* * Exposed data */ #if !defined(DUK_SINGLE_FILE) DUK_INTERNAL_DECL duk_uint8_t duk_class_number_to_stridx[32]; #endif /* !DUK_SINGLE_FILE */ /* * Prototypes */ /* alloc and init */ DUK_INTERNAL_DECL duk_hobject *duk_hobject_alloc_unchecked(duk_heap *heap, duk_uint_t hobject_flags); DUK_INTERNAL_DECL duk_hobject *duk_hobject_alloc(duk_hthread *thr, duk_uint_t hobject_flags); DUK_INTERNAL_DECL duk_harray *duk_harray_alloc(duk_hthread *thr, duk_uint_t hobject_flags); DUK_INTERNAL_DECL duk_hcompfunc *duk_hcompfunc_alloc(duk_hthread *thr, duk_uint_t hobject_flags); DUK_INTERNAL_DECL duk_hnatfunc *duk_hnatfunc_alloc(duk_hthread *thr, duk_uint_t hobject_flags); DUK_INTERNAL_DECL duk_hboundfunc *duk_hboundfunc_alloc(duk_heap *heap, duk_uint_t hobject_flags); #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_INTERNAL_DECL duk_hbufobj *duk_hbufobj_alloc(duk_hthread *thr, duk_uint_t hobject_flags); #endif DUK_INTERNAL_DECL duk_hthread *duk_hthread_alloc_unchecked(duk_heap *heap, duk_uint_t hobject_flags); DUK_INTERNAL_DECL duk_hthread *duk_hthread_alloc(duk_hthread *thr, duk_uint_t hobject_flags); DUK_INTERNAL_DECL duk_hdecenv *duk_hdecenv_alloc(duk_hthread *thr, duk_uint_t hobject_flags); DUK_INTERNAL_DECL duk_hobjenv *duk_hobjenv_alloc(duk_hthread *thr, duk_uint_t hobject_flags); DUK_INTERNAL_DECL duk_hproxy *duk_hproxy_alloc(duk_hthread *thr, duk_uint_t hobject_flags); /* resize */ DUK_INTERNAL_DECL void duk_hobject_realloc_props(duk_hthread *thr, duk_hobject *obj, duk_uint32_t new_e_size, duk_uint32_t new_a_size, duk_uint32_t new_h_size, duk_bool_t abandon_array); DUK_INTERNAL_DECL void duk_hobject_resize_entrypart(duk_hthread *thr, duk_hobject *obj, duk_uint32_t new_e_size); #if 0 /*unused*/ DUK_INTERNAL_DECL void duk_hobject_resize_arraypart(duk_hthread *thr, duk_hobject *obj, duk_uint32_t new_a_size); #endif /* low-level property functions */ DUK_INTERNAL_DECL duk_bool_t duk_hobject_find_existing_entry(duk_heap *heap, duk_hobject *obj, duk_hstring *key, duk_int_t *e_idx, duk_int_t *h_idx); DUK_INTERNAL_DECL duk_tval *duk_hobject_find_existing_entry_tval_ptr(duk_heap *heap, duk_hobject *obj, duk_hstring *key); DUK_INTERNAL_DECL duk_tval *duk_hobject_find_existing_entry_tval_ptr_and_attrs(duk_heap *heap, duk_hobject *obj, duk_hstring *key, duk_uint_t *out_attrs); DUK_INTERNAL_DECL duk_tval *duk_hobject_find_existing_array_entry_tval_ptr(duk_heap *heap, duk_hobject *obj, duk_uarridx_t i); DUK_INTERNAL_DECL duk_bool_t duk_hobject_get_own_propdesc(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *out_desc, duk_small_uint_t flags); /* XXX: when optimizing for guaranteed property slots, use a guaranteed * slot for internal value; this call can then access it directly. */ #define duk_hobject_get_internal_value_tval_ptr(heap,obj) \ duk_hobject_find_existing_entry_tval_ptr((heap), (obj), DUK_HEAP_STRING_INT_VALUE((heap))) /* core property functions */ DUK_INTERNAL_DECL duk_bool_t duk_hobject_getprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key); DUK_INTERNAL_DECL duk_bool_t duk_hobject_putprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key, duk_tval *tv_val, duk_bool_t throw_flag); DUK_INTERNAL_DECL duk_bool_t duk_hobject_delprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key, duk_bool_t throw_flag); DUK_INTERNAL_DECL duk_bool_t duk_hobject_hasprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key); /* internal property functions */ #define DUK_DELPROP_FLAG_THROW (1U << 0) #define DUK_DELPROP_FLAG_FORCE (1U << 1) DUK_INTERNAL_DECL duk_bool_t duk_hobject_delprop_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_small_uint_t flags); DUK_INTERNAL_DECL duk_bool_t duk_hobject_hasprop_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key); DUK_INTERNAL_DECL void duk_hobject_define_property_internal(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_small_uint_t flags); DUK_INTERNAL_DECL void duk_hobject_define_property_internal_arridx(duk_hthread *thr, duk_hobject *obj, duk_uarridx_t arr_idx, duk_small_uint_t flags); DUK_INTERNAL_DECL duk_size_t duk_hobject_get_length(duk_hthread *thr, duk_hobject *obj); #if defined(DUK_USE_HEAPPTR16) DUK_INTERNAL_DECL duk_bool_t duk_hobject_has_finalizer_fast_raw(duk_heap *heap, duk_hobject *obj); #else DUK_INTERNAL_DECL duk_bool_t duk_hobject_has_finalizer_fast_raw(duk_hobject *obj); #endif /* helpers for defineProperty() and defineProperties() */ DUK_INTERNAL_DECL void duk_hobject_prepare_property_descriptor(duk_hthread *thr, duk_idx_t idx_in, duk_uint_t *out_defprop_flags, duk_idx_t *out_idx_value, duk_hobject **out_getter, duk_hobject **out_setter); DUK_INTERNAL_DECL duk_bool_t duk_hobject_define_property_helper(duk_hthread *thr, duk_uint_t defprop_flags, duk_hobject *obj, duk_hstring *key, duk_idx_t idx_value, duk_hobject *get, duk_hobject *set, duk_bool_t throw_flag); /* Object built-in methods */ DUK_INTERNAL_DECL void duk_hobject_object_get_own_property_descriptor(duk_hthread *thr, duk_idx_t obj_idx); DUK_INTERNAL_DECL void duk_hobject_object_seal_freeze_helper(duk_hthread *thr, duk_hobject *obj, duk_bool_t is_freeze); DUK_INTERNAL_DECL duk_bool_t duk_hobject_object_is_sealed_frozen_helper(duk_hthread *thr, duk_hobject *obj, duk_bool_t is_frozen); DUK_INTERNAL_DECL duk_bool_t duk_hobject_object_ownprop_helper(duk_hthread *thr, duk_small_uint_t required_desc_flags); /* internal properties */ DUK_INTERNAL_DECL duk_bool_t duk_hobject_get_internal_value(duk_heap *heap, duk_hobject *obj, duk_tval *tv); DUK_INTERNAL_DECL duk_hstring *duk_hobject_get_internal_value_string(duk_heap *heap, duk_hobject *obj); /* hobject management functions */ DUK_INTERNAL_DECL void duk_hobject_compact_props(duk_hthread *thr, duk_hobject *obj); /* ES2015 proxy */ #if defined(DUK_USE_ES6_PROXY) DUK_INTERNAL_DECL duk_bool_t duk_hobject_proxy_check(duk_hobject *obj, duk_hobject **out_target, duk_hobject **out_handler); DUK_INTERNAL_DECL duk_hobject *duk_hobject_resolve_proxy_target(duk_hobject *obj); #endif /* enumeration */ DUK_INTERNAL_DECL void duk_hobject_enumerator_create(duk_hthread *thr, duk_small_uint_t enum_flags); DUK_INTERNAL_DECL duk_ret_t duk_hobject_get_enumerated_keys(duk_hthread *thr, duk_small_uint_t enum_flags); DUK_INTERNAL_DECL duk_bool_t duk_hobject_enumerator_next(duk_hthread *thr, duk_bool_t get_value); /* macros */ DUK_INTERNAL_DECL void duk_hobject_set_prototype_updref(duk_hthread *thr, duk_hobject *h, duk_hobject *p); /* pc2line */ #if defined(DUK_USE_PC2LINE) DUK_INTERNAL_DECL void duk_hobject_pc2line_pack(duk_hthread *thr, duk_compiler_instr *instrs, duk_uint_fast32_t length); DUK_INTERNAL_DECL duk_uint_fast32_t duk_hobject_pc2line_query(duk_hthread *thr, duk_idx_t idx_func, duk_uint_fast32_t pc); #endif /* misc */ DUK_INTERNAL_DECL duk_bool_t duk_hobject_prototype_chain_contains(duk_hthread *thr, duk_hobject *h, duk_hobject *p, duk_bool_t ignore_loop); #if !defined(DUK_USE_OBJECT_BUILTIN) /* These declarations are needed when related built-in is disabled and * genbuiltins.py won't automatically emit the declerations. */ DUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_to_string(duk_hthread *thr); DUK_INTERNAL_DECL duk_ret_t duk_bi_function_prototype(duk_hthread *thr); #endif #endif /* DUK_HOBJECT_H_INCLUDED */ /* #include duk_hcompfunc.h */ #line 1 "duk_hcompfunc.h" /* * Heap compiled function (Ecmascript function) representation. * * There is a single data buffer containing the Ecmascript function's * bytecode, constants, and inner functions. */ #if !defined(DUK_HCOMPFUNC_H_INCLUDED) #define DUK_HCOMPFUNC_H_INCLUDED /* * Field accessor macros */ /* XXX: casts could be improved, especially for GET/SET DATA */ #if defined(DUK_USE_HEAPPTR16) #define DUK_HCOMPFUNC_GET_DATA(heap,h) \ ((duk_hbuffer_fixed *) (void *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->data16)) #define DUK_HCOMPFUNC_SET_DATA(heap,h,v) do { \ (h)->data16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (v)); \ } while (0) #define DUK_HCOMPFUNC_GET_FUNCS(heap,h) \ ((duk_hobject **) (void *) (DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->funcs16))) #define DUK_HCOMPFUNC_SET_FUNCS(heap,h,v) do { \ (h)->funcs16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (v)); \ } while (0) #define DUK_HCOMPFUNC_GET_BYTECODE(heap,h) \ ((duk_instr_t *) (void *) (DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->bytecode16))) #define DUK_HCOMPFUNC_SET_BYTECODE(heap,h,v) do { \ (h)->bytecode16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (v)); \ } while (0) #define DUK_HCOMPFUNC_GET_LEXENV(heap,h) \ ((duk_hobject *) (void *) (DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->lex_env16))) #define DUK_HCOMPFUNC_SET_LEXENV(heap,h,v) do { \ (h)->lex_env16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (v)); \ } while (0) #define DUK_HCOMPFUNC_GET_VARENV(heap,h) \ ((duk_hobject *) (void *) (DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->var_env16))) #define DUK_HCOMPFUNC_SET_VARENV(heap,h,v) do { \ (h)->var_env16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (v)); \ } while (0) #else #define DUK_HCOMPFUNC_GET_DATA(heap,h) ((duk_hbuffer_fixed *) (void *) (h)->data) #define DUK_HCOMPFUNC_SET_DATA(heap,h,v) do { \ (h)->data = (duk_hbuffer *) (v); \ } while (0) #define DUK_HCOMPFUNC_GET_FUNCS(heap,h) ((h)->funcs) #define DUK_HCOMPFUNC_SET_FUNCS(heap,h,v) do { \ (h)->funcs = (v); \ } while (0) #define DUK_HCOMPFUNC_GET_BYTECODE(heap,h) ((h)->bytecode) #define DUK_HCOMPFUNC_SET_BYTECODE(heap,h,v) do { \ (h)->bytecode = (v); \ } while (0) #define DUK_HCOMPFUNC_GET_LEXENV(heap,h) ((h)->lex_env) #define DUK_HCOMPFUNC_SET_LEXENV(heap,h,v) do { \ (h)->lex_env = (v); \ } while (0) #define DUK_HCOMPFUNC_GET_VARENV(heap,h) ((h)->var_env) #define DUK_HCOMPFUNC_SET_VARENV(heap,h,v) do { \ (h)->var_env = (v); \ } while (0) #endif /* * Accessor macros for function specific data areas */ /* Note: assumes 'data' is always a fixed buffer */ #define DUK_HCOMPFUNC_GET_BUFFER_BASE(heap,h) \ DUK_HBUFFER_FIXED_GET_DATA_PTR((heap), DUK_HCOMPFUNC_GET_DATA((heap), (h))) #define DUK_HCOMPFUNC_GET_CONSTS_BASE(heap,h) \ ((duk_tval *) (void *) DUK_HCOMPFUNC_GET_BUFFER_BASE((heap), (h))) #define DUK_HCOMPFUNC_GET_FUNCS_BASE(heap,h) \ DUK_HCOMPFUNC_GET_FUNCS((heap), (h)) #define DUK_HCOMPFUNC_GET_CODE_BASE(heap,h) \ DUK_HCOMPFUNC_GET_BYTECODE((heap), (h)) #define DUK_HCOMPFUNC_GET_CONSTS_END(heap,h) \ ((duk_tval *) (void *) DUK_HCOMPFUNC_GET_FUNCS((heap), (h))) #define DUK_HCOMPFUNC_GET_FUNCS_END(heap,h) \ ((duk_hobject **) (void *) DUK_HCOMPFUNC_GET_BYTECODE((heap), (h))) /* XXX: double evaluation of DUK_HCOMPFUNC_GET_DATA() */ #define DUK_HCOMPFUNC_GET_CODE_END(heap,h) \ ((duk_instr_t *) (void *) (DUK_HBUFFER_FIXED_GET_DATA_PTR((heap), DUK_HCOMPFUNC_GET_DATA((heap), (h))) + \ DUK_HBUFFER_GET_SIZE((duk_hbuffer *) DUK_HCOMPFUNC_GET_DATA((heap), h)))) #define DUK_HCOMPFUNC_GET_CONSTS_SIZE(heap,h) \ ( \ (duk_size_t) \ ( \ ((const duk_uint8_t *) DUK_HCOMPFUNC_GET_CONSTS_END((heap), (h))) - \ ((const duk_uint8_t *) DUK_HCOMPFUNC_GET_CONSTS_BASE((heap), (h))) \ ) \ ) #define DUK_HCOMPFUNC_GET_FUNCS_SIZE(heap,h) \ ( \ (duk_size_t) \ ( \ ((const duk_uint8_t *) DUK_HCOMPFUNC_GET_FUNCS_END((heap), (h))) - \ ((const duk_uint8_t *) DUK_HCOMPFUNC_GET_FUNCS_BASE((heap), (h))) \ ) \ ) #define DUK_HCOMPFUNC_GET_CODE_SIZE(heap,h) \ ( \ (duk_size_t) \ ( \ ((const duk_uint8_t *) DUK_HCOMPFUNC_GET_CODE_END((heap),(h))) - \ ((const duk_uint8_t *) DUK_HCOMPFUNC_GET_CODE_BASE((heap),(h))) \ ) \ ) #define DUK_HCOMPFUNC_GET_CONSTS_COUNT(heap,h) \ ((duk_size_t) (DUK_HCOMPFUNC_GET_CONSTS_SIZE((heap), (h)) / sizeof(duk_tval))) #define DUK_HCOMPFUNC_GET_FUNCS_COUNT(heap,h) \ ((duk_size_t) (DUK_HCOMPFUNC_GET_FUNCS_SIZE((heap), (h)) / sizeof(duk_hobject *))) #define DUK_HCOMPFUNC_GET_CODE_COUNT(heap,h) \ ((duk_size_t) (DUK_HCOMPFUNC_GET_CODE_SIZE((heap), (h)) / sizeof(duk_instr_t))) /* * Validity assert */ #define DUK_ASSERT_HCOMPFUNC_VALID(h) do { \ DUK_ASSERT((h) != NULL); \ } while (0) /* * Main struct */ struct duk_hcompfunc { /* shared object part */ duk_hobject obj; /* * Pointers to function data area for faster access. Function * data is a buffer shared between all closures of the same * "template" function. The data buffer is always fixed (non- * dynamic, hence stable), with a layout as follows: * * constants (duk_tval) * inner functions (duk_hobject *) * bytecode (duk_instr_t) * * Note: bytecode end address can be computed from 'data' buffer * size. It is not strictly necessary functionally, assuming * bytecode never jumps outside its allocated area. However, * it's a safety/robustness feature for avoiding the chance of * executing random data as bytecode due to a compiler error. * * Note: values in the data buffer must be incref'd (they will * be decref'd on release) for every compiledfunction referring * to the 'data' element. */ /* Data area, fixed allocation, stable data ptrs. */ #if defined(DUK_USE_HEAPPTR16) duk_uint16_t data16; #else duk_hbuffer *data; #endif /* No need for constants pointer (= same as data). * * When using 16-bit packing alignment to 4 is nice. 'funcs' will be * 4-byte aligned because 'constants' are duk_tvals. For now the * inner function pointers are not compressed, so that 'bytecode' will * also be 4-byte aligned. */ #if defined(DUK_USE_HEAPPTR16) duk_uint16_t funcs16; duk_uint16_t bytecode16; #else duk_hobject **funcs; duk_instr_t *bytecode; #endif /* Lexenv: lexical environment of closure, NULL for templates. * Varenv: variable environment of closure, NULL for templates. */ #if defined(DUK_USE_HEAPPTR16) duk_uint16_t lex_env16; duk_uint16_t var_env16; #else duk_hobject *lex_env; duk_hobject *var_env; #endif /* * 'nregs' registers are allocated on function entry, at most 'nargs' * are initialized to arguments, and the rest to undefined. Arguments * above 'nregs' are not mapped to registers. All registers in the * active stack range must be initialized because they are GC reachable. * 'nargs' is needed so that if the function is given more than 'nargs' * arguments, the additional arguments do not 'clobber' registers * beyond 'nregs' which must be consistently initialized to undefined. * * Usually there is no need to know which registers are mapped to * local variables. Registers may be allocated to variable in any * way (even including gaps). However, a register-variable mapping * must be the same for the duration of the function execution and * the register cannot be used for anything else. * * When looking up variables by name, the '_Varmap' map is used. * When an activation closes, registers mapped to arguments are * copied into the environment record based on the same map. The * reverse map (from register to variable) is not currently needed * at run time, except for debugging, so it is not maintained. */ duk_uint16_t nregs; /* regs to allocate */ duk_uint16_t nargs; /* number of arguments allocated to regs */ /* * Additional control information is placed into the object itself * as internal properties to avoid unnecessary fields for the * majority of functions. The compiler tries to omit internal * control fields when possible. * * Function templates: * * { * name: "func", // declaration, named function expressions * fileName: <debug info for creating nice errors> * _Varmap: { "arg1": 0, "arg2": 1, "varname": 2 }, * _Formals: [ "arg1", "arg2" ], * _Source: "function func(arg1, arg2) { ... }", * _Pc2line: <debug info for pc-to-line mapping>, * } * * Function instances: * * { * length: 2, * prototype: { constructor: <func> }, * caller: <thrower>, * arguments: <thrower>, * name: "func", // declaration, named function expressions * fileName: <debug info for creating nice errors> * _Varmap: { "arg1": 0, "arg2": 1, "varname": 2 }, * _Formals: [ "arg1", "arg2" ], * _Source: "function func(arg1, arg2) { ... }", * _Pc2line: <debug info for pc-to-line mapping>, * } * * More detailed description of these properties can be found * in the documentation. */ #if defined(DUK_USE_DEBUGGER_SUPPORT) /* Line number range for function. Needed during debugging to * determine active breakpoints. */ duk_uint32_t start_line; duk_uint32_t end_line; #endif }; #endif /* DUK_HCOMPFUNC_H_INCLUDED */ /* #include duk_hnatfunc.h */ #line 1 "duk_hnatfunc.h" /* * Heap native function representation. */ #if !defined(DUK_HNATFUNC_H_INCLUDED) #define DUK_HNATFUNC_H_INCLUDED #define DUK_HNATFUNC_NARGS_VARARGS ((duk_int16_t) -1) #define DUK_HNATFUNC_NARGS_MAX ((duk_int16_t) 0x7fff) struct duk_hnatfunc { /* shared object part */ duk_hobject obj; duk_c_function func; duk_int16_t nargs; duk_int16_t magic; /* The 'magic' field allows an opaque 16-bit field to be accessed by the * Duktape/C function. This allows, for instance, the same native function * to be used for a set of very similar functions, with the 'magic' field * providing the necessary non-argument flags / values to guide the behavior * of the native function. The value is signed on purpose: it is easier to * convert a signed value to unsigned (simply AND with 0xffff) than vice * versa. * * Note: cannot place nargs/magic into the heaphdr flags, because * duk_hobject takes almost all flags already. */ }; #endif /* DUK_HNATFUNC_H_INCLUDED */ /* #include duk_hboundfunc.h */ #line 1 "duk_hboundfunc.h" /* * Bound function representation. */ #if !defined(DUK_HBOUNDFUNC_H_INCLUDED) #define DUK_HBOUNDFUNC_H_INCLUDED /* Artificial limit for args length. Ensures arithmetic won't overflow * 32 bits when combining bound functions. */ #define DUK_HBOUNDFUNC_MAX_ARGS 0x20000000UL #define DUK_ASSERT_HBOUNDFUNC_VALID(h) do { \ DUK_ASSERT((h) != NULL); \ DUK_ASSERT(DUK_HOBJECT_IS_BOUNDFUNC((duk_hobject *) (h))); \ DUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(&(h)->target) || \ (DUK_TVAL_IS_OBJECT(&(h)->target) && \ DUK_HOBJECT_IS_CALLABLE(DUK_TVAL_GET_OBJECT(&(h)->target)))); \ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(&(h)->this_binding)); \ DUK_ASSERT((h)->nargs == 0 || (h)->args != NULL); \ } while (0) struct duk_hboundfunc { /* Shared object part. */ duk_hobject obj; /* Final target function, stored as duk_tval so that lightfunc can be * represented too. */ duk_tval target; /* This binding. */ duk_tval this_binding; /* Arguments to prepend. */ duk_tval *args; /* Separate allocation. */ duk_idx_t nargs; }; #endif /* DUK_HBOUNDFUNC_H_INCLUDED */ /* #include duk_hbufobj.h */ #line 1 "duk_hbufobj.h" /* * Heap Buffer object representation. Used for all Buffer variants. */ #if !defined(DUK_HBUFOBJ_H_INCLUDED) #define DUK_HBUFOBJ_H_INCLUDED #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) /* All element accessors are host endian now (driven by TypedArray spec). */ #define DUK_HBUFOBJ_ELEM_UINT8 0 #define DUK_HBUFOBJ_ELEM_UINT8CLAMPED 1 #define DUK_HBUFOBJ_ELEM_INT8 2 #define DUK_HBUFOBJ_ELEM_UINT16 3 #define DUK_HBUFOBJ_ELEM_INT16 4 #define DUK_HBUFOBJ_ELEM_UINT32 5 #define DUK_HBUFOBJ_ELEM_INT32 6 #define DUK_HBUFOBJ_ELEM_FLOAT32 7 #define DUK_HBUFOBJ_ELEM_FLOAT64 8 #define DUK_HBUFOBJ_ELEM_MAX 8 #define DUK_ASSERT_HBUFOBJ_VALID(h) do { \ DUK_ASSERT((h) != NULL); \ DUK_ASSERT((h)->shift <= 3); \ DUK_ASSERT((h)->elem_type <= DUK_HBUFOBJ_ELEM_MAX); \ DUK_ASSERT(((h)->shift == 0 && (h)->elem_type == DUK_HBUFOBJ_ELEM_UINT8) || \ ((h)->shift == 0 && (h)->elem_type == DUK_HBUFOBJ_ELEM_UINT8CLAMPED) || \ ((h)->shift == 0 && (h)->elem_type == DUK_HBUFOBJ_ELEM_INT8) || \ ((h)->shift == 1 && (h)->elem_type == DUK_HBUFOBJ_ELEM_UINT16) || \ ((h)->shift == 1 && (h)->elem_type == DUK_HBUFOBJ_ELEM_INT16) || \ ((h)->shift == 2 && (h)->elem_type == DUK_HBUFOBJ_ELEM_UINT32) || \ ((h)->shift == 2 && (h)->elem_type == DUK_HBUFOBJ_ELEM_INT32) || \ ((h)->shift == 2 && (h)->elem_type == DUK_HBUFOBJ_ELEM_FLOAT32) || \ ((h)->shift == 3 && (h)->elem_type == DUK_HBUFOBJ_ELEM_FLOAT64)); \ DUK_ASSERT((h)->is_typedarray == 0 || (h)->is_typedarray == 1); \ DUK_ASSERT(DUK_HOBJECT_IS_BUFOBJ((duk_hobject *) (h))); \ if ((h)->buf == NULL) { \ DUK_ASSERT((h)->offset == 0); \ DUK_ASSERT((h)->length == 0); \ } else { \ /* No assertions for offset or length; in particular, \ * it's OK for length to be longer than underlying \ * buffer. Just ensure they don't wrap when added. \ */ \ DUK_ASSERT((h)->offset + (h)->length >= (h)->offset); \ } \ } while (0) /* Get the current data pointer (caller must ensure buf != NULL) as a * duk_uint8_t ptr. */ #define DUK_HBUFOBJ_GET_SLICE_BASE(heap,h) \ (DUK_ASSERT_EXPR((h) != NULL), DUK_ASSERT_EXPR((h)->buf != NULL), \ (((duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR((heap), (h)->buf)) + (h)->offset)) /* True if slice is full, i.e. offset is zero and length covers the entire * buffer. This status may change independently of the duk_hbufobj if * the underlying buffer is dynamic and changes without the hbufobj * being changed. */ #define DUK_HBUFOBJ_FULL_SLICE(h) \ (DUK_ASSERT_EXPR((h) != NULL), DUK_ASSERT_EXPR((h)->buf != NULL), \ ((h)->offset == 0 && (h)->length == DUK_HBUFFER_GET_SIZE((h)->buf))) /* Validate that the whole slice [0,length[ is contained in the underlying * buffer. Caller must ensure 'buf' != NULL. */ #define DUK_HBUFOBJ_VALID_SLICE(h) \ (DUK_ASSERT_EXPR((h) != NULL), DUK_ASSERT_EXPR((h)->buf != NULL), \ ((h)->offset + (h)->length <= DUK_HBUFFER_GET_SIZE((h)->buf))) /* Validate byte read/write for virtual 'offset', i.e. check that the * offset, taking into account h->offset, is within the underlying * buffer size. This is a safety check which is needed to ensure * that even a misconfigured duk_hbufobj never causes memory unsafe * behavior (e.g. if an underlying dynamic buffer changes after being * setup). Caller must ensure 'buf' != NULL. */ #define DUK_HBUFOBJ_VALID_BYTEOFFSET_INCL(h,off) \ (DUK_ASSERT_EXPR((h) != NULL), DUK_ASSERT_EXPR((h)->buf != NULL), \ ((h)->offset + (off) < DUK_HBUFFER_GET_SIZE((h)->buf))) #define DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h,off) \ (DUK_ASSERT_EXPR((h) != NULL), DUK_ASSERT_EXPR((h)->buf != NULL), \ ((h)->offset + (off) <= DUK_HBUFFER_GET_SIZE((h)->buf))) /* Clamp an input byte length (already assumed to be within the nominal * duk_hbufobj 'length') to the current dynamic buffer limits to yield * a byte length limit that's safe for memory accesses. This value can * be invalidated by any side effect because it may trigger a user * callback that resizes the underlying buffer. */ #define DUK_HBUFOBJ_CLAMP_BYTELENGTH(h,len) \ (DUK_ASSERT_EXPR((h) != NULL), \ duk_hbufobj_clamp_bytelength((h), (len))) /* Typed arrays have virtual indices, ArrayBuffer and DataView do not. */ #define DUK_HBUFOBJ_HAS_VIRTUAL_INDICES(h) ((h)->is_typedarray) struct duk_hbufobj { /* Shared object part. */ duk_hobject obj; /* Underlying buffer (refcounted), may be NULL. */ duk_hbuffer *buf; /* .buffer reference to an ArrayBuffer, may be NULL. */ duk_hobject *buf_prop; /* Slice and accessor information. * * Because the underlying buffer may be dynamic, these may be * invalidated by the buffer being modified so that both offset * and length should be validated before every access. Behavior * when the underlying buffer has changed doesn't need to be clean: * virtual 'length' doesn't need to be affected, reads can return * zero/NaN, and writes can be ignored. * * Note that a data pointer cannot be precomputed because 'buf' may * be dynamic and its pointer unstable. */ duk_uint_t offset; /* byte offset to buf */ duk_uint_t length; /* byte index limit for element access, exclusive */ duk_uint8_t shift; /* element size shift: * 0 = u8/i8 * 1 = u16/i16 * 2 = u32/i32/float * 3 = double */ duk_uint8_t elem_type; /* element type */ duk_uint8_t is_typedarray; }; DUK_INTERNAL_DECL duk_uint_t duk_hbufobj_clamp_bytelength(duk_hbufobj *h_bufobj, duk_uint_t len); DUK_INTERNAL_DECL void duk_hbufobj_push_uint8array_from_plain(duk_hthread *thr, duk_hbuffer *h_buf); DUK_INTERNAL_DECL void duk_hbufobj_push_validated_read(duk_hthread *thr, duk_hbufobj *h_bufobj, duk_uint8_t *p, duk_small_uint_t elem_size); DUK_INTERNAL_DECL void duk_hbufobj_validated_write(duk_hthread *thr, duk_hbufobj *h_bufobj, duk_uint8_t *p, duk_small_uint_t elem_size); DUK_INTERNAL_DECL void duk_hbufobj_promote_plain(duk_hthread *thr, duk_idx_t idx); #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ #endif /* DUK_HBUFOBJ_H_INCLUDED */ /* #include duk_hthread.h */ #line 1 "duk_hthread.h" /* * Heap thread object representation. * * duk_hthread is also the 'context' for public API functions via a * different typedef. Most API calls operate on the topmost frame * of the value stack only. */ #if !defined(DUK_HTHREAD_H_INCLUDED) #define DUK_HTHREAD_H_INCLUDED /* * Stack constants */ /* Initial valstack size, roughly 0.7kiB. */ #define DUK_VALSTACK_INITIAL_SIZE 96U /* Internal extra elements assumed on function entry, always added to * user-defined 'extra' for e.g. the duk_check_stack() call. */ #define DUK_VALSTACK_INTERNAL_EXTRA 32U /* Number of elements guaranteed to be user accessible (in addition to call * arguments) on Duktape/C function entry. This is the major public API * commitment. */ #define DUK_VALSTACK_API_ENTRY_MINIMUM DUK_API_ENTRY_STACK /* * Activation defines */ #define DUK_ACT_FLAG_STRICT (1U << 0) /* function executes in strict mode */ #define DUK_ACT_FLAG_TAILCALLED (1U << 1) /* activation has tail called one or more times */ #define DUK_ACT_FLAG_CONSTRUCT (1U << 2) /* function executes as a constructor (called via "new") */ #define DUK_ACT_FLAG_PREVENT_YIELD (1U << 3) /* activation prevents yield (native call or "new") */ #define DUK_ACT_FLAG_DIRECT_EVAL (1U << 4) /* activation is a direct eval call */ #define DUK_ACT_FLAG_CONSTRUCT_PROXY (1U << 5) /* activation is for Proxy 'construct' call, special return value handling */ #define DUK_ACT_FLAG_BREAKPOINT_ACTIVE (1U << 6) /* activation has active breakpoint(s) */ #define DUK_ACT_GET_FUNC(act) ((act)->func) /* * Flags for __FILE__ / __LINE__ registered into tracedata */ #define DUK_TB_FLAG_NOBLAME_FILELINE (1U << 0) /* don't report __FILE__ / __LINE__ as fileName/lineNumber */ /* * Catcher defines */ /* XXX: remove catcher type entirely */ /* flags field: LLLLLLFT, L = label (24 bits), F = flags (4 bits), T = type (4 bits) */ #define DUK_CAT_TYPE_MASK 0x0000000fUL #define DUK_CAT_TYPE_BITS 4 #define DUK_CAT_LABEL_MASK 0xffffff00UL #define DUK_CAT_LABEL_BITS 24 #define DUK_CAT_LABEL_SHIFT 8 #define DUK_CAT_FLAG_CATCH_ENABLED (1U << 4) /* catch part will catch */ #define DUK_CAT_FLAG_FINALLY_ENABLED (1U << 5) /* finally part will catch */ #define DUK_CAT_FLAG_CATCH_BINDING_ENABLED (1U << 6) /* request to create catch binding */ #define DUK_CAT_FLAG_LEXENV_ACTIVE (1U << 7) /* catch or with binding is currently active */ #define DUK_CAT_TYPE_UNKNOWN 0 #define DUK_CAT_TYPE_TCF 1 #define DUK_CAT_TYPE_LABEL 2 #define DUK_CAT_GET_TYPE(c) ((c)->flags & DUK_CAT_TYPE_MASK) #define DUK_CAT_GET_LABEL(c) (((c)->flags & DUK_CAT_LABEL_MASK) >> DUK_CAT_LABEL_SHIFT) #define DUK_CAT_HAS_CATCH_ENABLED(c) ((c)->flags & DUK_CAT_FLAG_CATCH_ENABLED) #define DUK_CAT_HAS_FINALLY_ENABLED(c) ((c)->flags & DUK_CAT_FLAG_FINALLY_ENABLED) #define DUK_CAT_HAS_CATCH_BINDING_ENABLED(c) ((c)->flags & DUK_CAT_FLAG_CATCH_BINDING_ENABLED) #define DUK_CAT_HAS_LEXENV_ACTIVE(c) ((c)->flags & DUK_CAT_FLAG_LEXENV_ACTIVE) #define DUK_CAT_SET_CATCH_ENABLED(c) do { \ (c)->flags |= DUK_CAT_FLAG_CATCH_ENABLED; \ } while (0) #define DUK_CAT_SET_FINALLY_ENABLED(c) do { \ (c)->flags |= DUK_CAT_FLAG_FINALLY_ENABLED; \ } while (0) #define DUK_CAT_SET_CATCH_BINDING_ENABLED(c) do { \ (c)->flags |= DUK_CAT_FLAG_CATCH_BINDING_ENABLED; \ } while (0) #define DUK_CAT_SET_LEXENV_ACTIVE(c) do { \ (c)->flags |= DUK_CAT_FLAG_LEXENV_ACTIVE; \ } while (0) #define DUK_CAT_CLEAR_CATCH_ENABLED(c) do { \ (c)->flags &= ~DUK_CAT_FLAG_CATCH_ENABLED; \ } while (0) #define DUK_CAT_CLEAR_FINALLY_ENABLED(c) do { \ (c)->flags &= ~DUK_CAT_FLAG_FINALLY_ENABLED; \ } while (0) #define DUK_CAT_CLEAR_CATCH_BINDING_ENABLED(c) do { \ (c)->flags &= ~DUK_CAT_FLAG_CATCH_BINDING_ENABLED; \ } while (0) #define DUK_CAT_CLEAR_LEXENV_ACTIVE(c) do { \ (c)->flags &= ~DUK_CAT_FLAG_LEXENV_ACTIVE; \ } while (0) /* * Thread defines */ #if defined(DUK_USE_ROM_STRINGS) #define DUK_HTHREAD_GET_STRING(thr,idx) \ ((duk_hstring *) DUK_LOSE_CONST(duk_rom_strings_stridx[(idx)])) #else /* DUK_USE_ROM_STRINGS */ #if defined(DUK_USE_HEAPPTR16) #define DUK_HTHREAD_GET_STRING(thr,idx) \ ((duk_hstring *) DUK_USE_HEAPPTR_DEC16((thr)->heap->heap_udata, (thr)->strs16[(idx)])) #else #define DUK_HTHREAD_GET_STRING(thr,idx) \ ((thr)->strs[(idx)]) #endif #endif /* DUK_USE_ROM_STRINGS */ /* values for the state field */ #define DUK_HTHREAD_STATE_INACTIVE 1 /* thread not currently running */ #define DUK_HTHREAD_STATE_RUNNING 2 /* thread currently running (only one at a time) */ #define DUK_HTHREAD_STATE_RESUMED 3 /* thread resumed another thread (active but not running) */ #define DUK_HTHREAD_STATE_YIELDED 4 /* thread has yielded */ #define DUK_HTHREAD_STATE_TERMINATED 5 /* thread has terminated */ /* Executor interrupt default interval when nothing else requires a * smaller value. The default interval must be small enough to allow * for reasonable execution timeout checking but large enough to keep * impact on execution performance low. */ #if defined(DUK_USE_INTERRUPT_COUNTER) #define DUK_HTHREAD_INTCTR_DEFAULT (256L * 1024L) #endif /* * Assert context is valid: non-NULL pointer, fields look sane. * * This is used by public API call entrypoints to catch invalid 'ctx' pointers * as early as possible; invalid 'ctx' pointers cause very odd and difficult to * diagnose behavior so it's worth checking even when the check is not 100%. */ /* Assertions for internals. */ #define DUK_ASSERT_HTHREAD_VALID(thr) do { \ DUK_ASSERT((thr) != NULL); \ DUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) (thr)) == DUK_HTYPE_OBJECT); \ DUK_ASSERT(DUK_HOBJECT_IS_THREAD((duk_hobject *) (thr))); \ DUK_ASSERT((thr)->unused1 == 0); \ DUK_ASSERT((thr)->unused2 == 0); \ } while (0) /* Assertions for public API calls; a bit stronger. */ #define DUK_ASSERT_CTX_VALID(thr) do { \ DUK_ASSERT((thr) != NULL); \ DUK_ASSERT_HTHREAD_VALID((thr)); \ DUK_ASSERT((thr)->valstack != NULL); \ DUK_ASSERT((thr)->valstack_bottom != NULL); \ DUK_ASSERT((thr)->valstack_top != NULL); \ DUK_ASSERT((thr)->valstack_end != NULL); \ DUK_ASSERT((thr)->valstack_alloc_end != NULL); \ DUK_ASSERT((thr)->valstack_alloc_end >= (thr)->valstack); \ DUK_ASSERT((thr)->valstack_end >= (thr)->valstack); \ DUK_ASSERT((thr)->valstack_top >= (thr)->valstack); \ DUK_ASSERT((thr)->valstack_top >= (thr)->valstack_bottom); \ DUK_ASSERT((thr)->valstack_end >= (thr)->valstack_top); \ DUK_ASSERT((thr)->valstack_alloc_end >= (thr)->valstack_end); \ } while (0) /* Assertions for API call entry specifically. Checks 'ctx' but also may * check internal state (e.g. not in a debugger transport callback). */ #define DUK_ASSERT_API_ENTRY(thr) do { \ DUK_ASSERT_CTX_VALID((thr)); \ DUK_ASSERT((thr)->heap != NULL); \ DUK_ASSERT((thr)->heap->dbg_calling_transport == 0); \ } while (0) /* * Assertion helpers. */ #define DUK_ASSERT_STRIDX_VALID(val) \ DUK_ASSERT((duk_uint_t) (val) < DUK_HEAP_NUM_STRINGS) #define DUK_ASSERT_BIDX_VALID(val) \ DUK_ASSERT((duk_uint_t) (val) < DUK_NUM_BUILTINS) /* * Misc */ /* Fast access to 'this' binding. Assumes there's a call in progress. */ #define DUK_HTHREAD_THIS_PTR(thr) \ (DUK_ASSERT_EXPR((thr) != NULL), \ DUK_ASSERT_EXPR((thr)->valstack_bottom > (thr)->valstack), \ (thr)->valstack_bottom - 1) /* * Struct defines */ /* Fields are ordered for alignment/packing. */ struct duk_activation { duk_tval tv_func; /* borrowed: full duk_tval for function being executed; for lightfuncs */ duk_hobject *func; /* borrowed: function being executed; for bound function calls, this is the final, real function, NULL for lightfuncs */ duk_activation *parent; /* previous (parent) activation (or NULL if none) */ duk_hobject *var_env; /* current variable environment (may be NULL if delayed) */ duk_hobject *lex_env; /* current lexical environment (may be NULL if delayed) */ duk_catcher *cat; /* current catcher (or NULL) */ #if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY) /* Previous value of 'func' caller, restored when unwound. Only in use * when 'func' is non-strict. */ duk_hobject *prev_caller; #endif duk_instr_t *curr_pc; /* next instruction to execute (points to 'func' bytecode, stable pointer), NULL for native calls */ /* bottom_byteoff and retval_byteoff are only used for book-keeping * of Ecmascript-initiated calls, to allow returning to an Ecmascript * function properly. */ /* Bottom of valstack for this activation, used to reset * valstack_bottom on return; offset is absolute. There's * no need to track 'top' because native call handling deals * with that using locals, and for Ecmascript returns 'nregs' * indicates the necessary top. */ duk_size_t bottom_byteoff; /* Return value when returning to this activation (points to caller * reg, not callee reg); offset is absolute (only set if activation is * not topmost). * * Note: bottom_byteoff is always set, while retval_byteoff is only * applicable for activations below the topmost one. Currently * retval_byteoff for the topmost activation is considered garbage * (and it not initialized on entry or cleared on return; may contain * previous or garbage values). */ duk_size_t retval_byteoff; /* Current 'this' binding is the value just below bottom. * Previously, 'this' binding was handled with an index to the * (calling) valstack. This works for everything except tail * calls, which must not "accumulate" valstack temps. */ /* Value stack reserve (valstack_end) byte offset to be restored * when returning to this activation. Only used by the bytecode * executor. */ duk_size_t reserve_byteoff; #if defined(DUK_USE_DEBUGGER_SUPPORT) duk_uint32_t prev_line; /* needed for stepping */ #endif duk_small_uint_t flags; }; struct duk_catcher { duk_catcher *parent; /* previous (parent) catcher (or NULL if none) */ duk_hstring *h_varname; /* borrowed reference to catch variable name (or NULL if none) */ /* (reference is valid as long activation exists) */ duk_instr_t *pc_base; /* resume execution from pc_base or pc_base+1 (points to 'func' bytecode, stable pointer) */ duk_size_t idx_base; /* idx_base and idx_base+1 get completion value and type */ duk_uint32_t flags; /* type and control flags, label number */ /* XXX: could pack 'flags' and 'idx_base' to same value in practice, * on 32-bit targets this would make duk_catcher 16 bytes. */ }; struct duk_hthread { /* Shared object part */ duk_hobject obj; /* Pointer to bytecode executor's 'curr_pc' variable. Used to copy * the current PC back into the topmost activation when activation * state is about to change (or "syncing" is otherwise needed). This * is rather awkward but important for performance, see execution.rst. */ duk_instr_t **ptr_curr_pc; /* Backpointers. */ duk_heap *heap; /* Current strictness flag: affects API calls. */ duk_uint8_t strict; /* Thread state. */ duk_uint8_t state; duk_uint8_t unused1; duk_uint8_t unused2; /* XXX: Valstack and callstack are currently assumed to have non-NULL * pointers. Relaxing this would not lead to big benefits (except * perhaps for terminated threads). */ /* Value stack: these are expressed as pointers for faster stack * manipulation. [valstack,valstack_top[ is GC-reachable, * [valstack_top,valstack_alloc_end[ is not GC-reachable but kept * initialized as 'undefined'. [valstack,valstack_end[ is the * guaranteed/reserved space and the valstack cannot be resized to * a smaller size. [valstack_end,valstack_alloc_end[ is currently * allocated slack that can be used to grow the current guaranteed * space but may be shrunk away without notice. * * * <----------------------- guaranteed ---> * <---- slack ---> * <--- frame ---> * .-------------+=============+----------+--------------. * |xxxxxxxxxxxxx|yyyyyyyyyyyyy|uuuuuuuuuu|uuuuuuuuuuuuuu| * `-------------+=============+----------+--------------' * * ^ ^ ^ ^ ^ * | | | | | * valstack bottom top end alloc_end * * xxx = arbitrary values, below current frame * yyy = arbitrary values, inside current frame * uuu = outside active value stack, initialized to 'undefined' */ duk_tval *valstack; /* start of valstack allocation */ duk_tval *valstack_end; /* end of valstack reservation/guarantee (exclusive) */ duk_tval *valstack_alloc_end; /* end of valstack allocation */ duk_tval *valstack_bottom; /* bottom of current frame */ duk_tval *valstack_top; /* top of current frame (exclusive) */ /* Call stack, represented as a linked list starting from the current * activation (or NULL if nothing is active). */ duk_activation *callstack_curr; /* current activation (or NULL if none) */ duk_size_t callstack_top; /* number of activation records in callstack (0 if none) */ duk_size_t callstack_preventcount; /* number of activation records in callstack preventing a yield */ /* Yield/resume book-keeping. */ duk_hthread *resumer; /* who resumed us (if any) */ /* Current compiler state (if any), used for augmenting SyntaxErrors. */ duk_compiler_ctx *compile_ctx; #if defined(DUK_USE_INTERRUPT_COUNTER) /* Interrupt counter for triggering a slow path check for execution * timeout, debugger interaction such as breakpoints, etc. The value * is valid for the current running thread, and both the init and * counter values are copied whenever a thread switch occurs. It's * important for the counter to be conveniently accessible for the * bytecode executor inner loop for performance reasons. */ duk_int_t interrupt_counter; /* countdown state */ duk_int_t interrupt_init; /* start value for current countdown */ #endif /* Builtin-objects; may or may not be shared with other threads, * threads existing in different "compartments" will have different * built-ins. Must be stored on a per-thread basis because there * is no intermediate structure for a thread group / compartment. * This takes quite a lot of space, currently 43x4 = 172 bytes on * 32-bit platforms. * * In some cases the builtins array could be ROM based, but it's * sometimes edited (e.g. for sandboxing) so it's better to keep * this array in RAM. */ duk_hobject *builtins[DUK_NUM_BUILTINS]; /* Convenience copies from heap/vm for faster access. */ #if defined(DUK_USE_ROM_STRINGS) /* No field needed when strings are in ROM. */ #else #if defined(DUK_USE_HEAPPTR16) duk_uint16_t *strs16; #else duk_hstring **strs; #endif #endif }; /* * Prototypes */ DUK_INTERNAL_DECL void duk_hthread_copy_builtin_objects(duk_hthread *thr_from, duk_hthread *thr_to); DUK_INTERNAL_DECL void duk_hthread_create_builtin_objects(duk_hthread *thr); DUK_INTERNAL_DECL duk_bool_t duk_hthread_init_stacks(duk_heap *heap, duk_hthread *thr); DUK_INTERNAL_DECL void duk_hthread_terminate(duk_hthread *thr); DUK_INTERNAL_DECL duk_activation *duk_hthread_activation_alloc(duk_hthread *thr); DUK_INTERNAL_DECL void duk_hthread_activation_free(duk_hthread *thr, duk_activation *act); DUK_INTERNAL_DECL void duk_hthread_activation_unwind_norz(duk_hthread *thr); DUK_INTERNAL_DECL void duk_hthread_activation_unwind_reuse_norz(duk_hthread *thr); DUK_INTERNAL_DECL duk_activation *duk_hthread_get_activation_for_level(duk_hthread *thr, duk_int_t level); DUK_INTERNAL_DECL duk_catcher *duk_hthread_catcher_alloc(duk_hthread *thr); DUK_INTERNAL_DECL void duk_hthread_catcher_free(duk_hthread *thr, duk_catcher *cat); DUK_INTERNAL_DECL void duk_hthread_catcher_unwind_norz(duk_hthread *thr, duk_activation *act); DUK_INTERNAL_DECL void duk_hthread_catcher_unwind_nolexenv_norz(duk_hthread *thr, duk_activation *act); #if defined(DUK_USE_FINALIZER_TORTURE) DUK_INTERNAL_DECL void duk_hthread_valstack_torture_realloc(duk_hthread *thr); #endif DUK_INTERNAL_DECL void *duk_hthread_get_valstack_ptr(duk_heap *heap, void *ud); /* indirect allocs */ #if defined(DUK_USE_DEBUGGER_SUPPORT) DUK_INTERNAL_DECL duk_uint_fast32_t duk_hthread_get_act_curr_pc(duk_hthread *thr, duk_activation *act); #endif DUK_INTERNAL_DECL duk_uint_fast32_t duk_hthread_get_act_prev_pc(duk_hthread *thr, duk_activation *act); DUK_INTERNAL_DECL void duk_hthread_sync_currpc(duk_hthread *thr); DUK_INTERNAL_DECL void duk_hthread_sync_and_null_currpc(duk_hthread *thr); #endif /* DUK_HTHREAD_H_INCLUDED */ /* #include duk_harray.h */ #line 1 "duk_harray.h" /* * Array object representation, used for actual Array instances. * * All objects with the exotic array behavior (which must coincide with having * internal class array) MUST be duk_harrays. No other object can be a * duk_harray. However, duk_harrays may not always have an array part. */ #if !defined(DUK_HARRAY_H_INCLUDED) #define DUK_HARRAY_H_INCLUDED #define DUK_ASSERT_HARRAY_VALID(h) do { \ DUK_ASSERT((h) != NULL); \ DUK_ASSERT(DUK_HOBJECT_IS_ARRAY((duk_hobject *) (h))); \ DUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_ARRAY((duk_hobject *) (h))); \ } while (0) #define DUK_HARRAY_LENGTH_WRITABLE(h) (!(h)->length_nonwritable) #define DUK_HARRAY_LENGTH_NONWRITABLE(h) ((h)->length_nonwritable) #define DUK_HARRAY_SET_LENGTH_WRITABLE(h) do { (h)->length_nonwritable = 0; } while (0) #define DUK_HARRAY_SET_LENGTH_NONWRITABLE(h) do { (h)->length_nonwritable = 1; } while (0) struct duk_harray { /* Shared object part. */ duk_hobject obj; /* Array .length. * * At present Array .length may be smaller, equal, or even larger * than the allocated underlying array part. Fast path code must * always take this into account carefully. */ duk_uint32_t length; /* Array .length property attributes. The property is always * non-enumerable and non-configurable. It's initially writable * but per Object.defineProperty() rules it can be made non-writable * even if it is non-configurable. Thus we need to track the * writability explicitly. * * XXX: this field to be eliminated and moved into duk_hobject * flags field to save space. */ duk_bool_t length_nonwritable; }; #endif /* DUK_HARRAY_H_INCLUDED */ /* #include duk_henv.h */ #line 1 "duk_henv.h" /* * Environment object representation. */ #if !defined(DUK_HENV_H_INCLUDED) #define DUK_HENV_H_INCLUDED #define DUK_ASSERT_HDECENV_VALID(h) do { \ DUK_ASSERT((h) != NULL); \ DUK_ASSERT(DUK_HOBJECT_IS_DECENV((duk_hobject *) (h))); \ DUK_ASSERT((h)->thread == NULL || (h)->varmap != NULL); \ } while (0) #define DUK_ASSERT_HOBJENV_VALID(h) do { \ DUK_ASSERT((h) != NULL); \ DUK_ASSERT(DUK_HOBJECT_IS_OBJENV((duk_hobject *) (h))); \ DUK_ASSERT((h)->target != NULL); \ DUK_ASSERT((h)->has_this == 0 || (h)->has_this == 1); \ } while (0) struct duk_hdecenv { /* Shared object part. */ duk_hobject obj; /* These control variables provide enough information to access live * variables for a closure that is still open. If thread == NULL, * the record is closed and the identifiers are in the property table. */ duk_hthread *thread; duk_hobject *varmap; duk_size_t regbase_byteoff; }; struct duk_hobjenv { /* Shared object part. */ duk_hobject obj; /* Target object and 'this' binding for object binding. */ duk_hobject *target; /* The 'target' object is used as a this binding in only some object * environments. For example, the global environment does not provide * a this binding, but a with statement does. */ duk_bool_t has_this; }; #endif /* DUK_HENV_H_INCLUDED */ /* #include duk_hbuffer.h */ #line 1 "duk_hbuffer.h" /* * Heap buffer representation. * * Heap allocated user data buffer which is either: * * 1. A fixed size buffer (data follows header statically) * 2. A dynamic size buffer (data pointer follows header) * * The data pointer for a variable size buffer of zero size may be NULL. */ #if !defined(DUK_HBUFFER_H_INCLUDED) #define DUK_HBUFFER_H_INCLUDED /* * Flags * * Fixed buffer: 0 * Dynamic buffer: DUK_HBUFFER_FLAG_DYNAMIC * External buffer: DUK_HBUFFER_FLAG_DYNAMIC | DUK_HBUFFER_FLAG_EXTERNAL */ #define DUK_HBUFFER_FLAG_DYNAMIC DUK_HEAPHDR_USER_FLAG(0) /* buffer is behind a pointer, dynamic or external */ #define DUK_HBUFFER_FLAG_EXTERNAL DUK_HEAPHDR_USER_FLAG(1) /* buffer pointer is to an externally allocated buffer */ #define DUK_HBUFFER_HAS_DYNAMIC(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HBUFFER_FLAG_DYNAMIC) #define DUK_HBUFFER_HAS_EXTERNAL(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HBUFFER_FLAG_EXTERNAL) #define DUK_HBUFFER_SET_DYNAMIC(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HBUFFER_FLAG_DYNAMIC) #define DUK_HBUFFER_SET_EXTERNAL(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HBUFFER_FLAG_EXTERNAL) #define DUK_HBUFFER_CLEAR_DYNAMIC(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HBUFFER_FLAG_DYNAMIC) #define DUK_HBUFFER_CLEAR_EXTERNAL(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HBUFFER_FLAG_EXTERNAL) /* * Misc defines */ /* Impose a maximum buffer length for now. Restricted artificially to * ensure resize computations or adding a heap header length won't * overflow size_t and that a signed duk_int_t can hold a buffer * length. The limit should be synchronized with DUK_HSTRING_MAX_BYTELEN. */ #if defined(DUK_USE_BUFLEN16) #define DUK_HBUFFER_MAX_BYTELEN (0x0000ffffUL) #else /* Intentionally not 0x7fffffffUL; at least JSON code expects that * 2*len + 2 fits in 32 bits. */ #define DUK_HBUFFER_MAX_BYTELEN (0x7ffffffeUL) #endif /* * Field access */ #if defined(DUK_USE_BUFLEN16) /* size stored in duk_heaphdr unused flag bits */ #define DUK_HBUFFER_GET_SIZE(x) ((x)->hdr.h_flags >> 16) #define DUK_HBUFFER_SET_SIZE(x,v) do { \ duk_size_t duk__v; \ duk__v = (v); \ DUK_ASSERT(duk__v <= 0xffffUL); \ (x)->hdr.h_flags = ((x)->hdr.h_flags & 0x0000ffffUL) | (((duk_uint32_t) duk__v) << 16); \ } while (0) #define DUK_HBUFFER_ADD_SIZE(x,dv) do { \ (x)->hdr.h_flags += ((dv) << 16); \ } while (0) #define DUK_HBUFFER_SUB_SIZE(x,dv) do { \ (x)->hdr.h_flags -= ((dv) << 16); \ } while (0) #else #define DUK_HBUFFER_GET_SIZE(x) (((duk_hbuffer *) (x))->size) #define DUK_HBUFFER_SET_SIZE(x,v) do { \ ((duk_hbuffer *) (x))->size = (v); \ } while (0) #define DUK_HBUFFER_ADD_SIZE(x,dv) do { \ (x)->size += (dv); \ } while (0) #define DUK_HBUFFER_SUB_SIZE(x,dv) do { \ (x)->size -= (dv); \ } while (0) #endif #define DUK_HBUFFER_FIXED_GET_SIZE(x) DUK_HBUFFER_GET_SIZE((duk_hbuffer *) (x)) #define DUK_HBUFFER_FIXED_SET_SIZE(x,v) DUK_HBUFFER_SET_SIZE((duk_hbuffer *) (x)) #define DUK_HBUFFER_DYNAMIC_GET_SIZE(x) DUK_HBUFFER_GET_SIZE((duk_hbuffer *) (x)) #define DUK_HBUFFER_DYNAMIC_SET_SIZE(x,v) DUK_HBUFFER_SET_SIZE((duk_hbuffer *) (x), (v)) #define DUK_HBUFFER_DYNAMIC_ADD_SIZE(x,dv) DUK_HBUFFER_ADD_SIZE((duk_hbuffer *) (x), (dv)) #define DUK_HBUFFER_DYNAMIC_SUB_SIZE(x,dv) DUK_HBUFFER_SUB_SIZE((duk_hbuffer *) (x), (dv)) #define DUK_HBUFFER_EXTERNAL_GET_SIZE(x) DUK_HBUFFER_GET_SIZE((duk_hbuffer *) (x)) #define DUK_HBUFFER_EXTERNAL_SET_SIZE(x,v) DUK_HBUFFER_SET_SIZE((duk_hbuffer *) (x), (v)) #define DUK_HBUFFER_FIXED_GET_DATA_PTR(heap,x) ((duk_uint8_t *) (((duk_hbuffer_fixed *) (x)) + 1)) #if defined(DUK_USE_HEAPPTR16) #define DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap,x) \ ((void *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, ((duk_heaphdr *) (x))->h_extra16)) #define DUK_HBUFFER_DYNAMIC_SET_DATA_PTR(heap,x,v) do { \ ((duk_heaphdr *) (x))->h_extra16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (v)); \ } while (0) #define DUK_HBUFFER_DYNAMIC_SET_DATA_PTR_NULL(heap,x) do { \ ((duk_heaphdr *) (x))->h_extra16 = 0; /* assume 0 <=> NULL */ \ } while (0) #else #define DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap,x) ((x)->curr_alloc) #define DUK_HBUFFER_DYNAMIC_SET_DATA_PTR(heap,x,v) do { \ (x)->curr_alloc = (void *) (v); \ } while (0) #define DUK_HBUFFER_DYNAMIC_SET_DATA_PTR_NULL(heap,x) do { \ (x)->curr_alloc = (void *) NULL; \ } while (0) #endif /* No pointer compression because pointer is potentially outside of * Duktape heap. */ #if defined(DUK_USE_HEAPPTR16) #define DUK_HBUFFER_EXTERNAL_GET_DATA_PTR(heap,x) \ ((void *) (x)->curr_alloc) #define DUK_HBUFFER_EXTERNAL_SET_DATA_PTR(heap,x,v) do { \ (x)->curr_alloc = (void *) (v); \ } while (0) #define DUK_HBUFFER_EXTERNAL_SET_DATA_PTR_NULL(heap,x) do { \ (x)->curr_alloc = (void *) NULL; \ } while (0) #else #define DUK_HBUFFER_EXTERNAL_GET_DATA_PTR(heap,x) \ ((void *) (x)->curr_alloc) #define DUK_HBUFFER_EXTERNAL_SET_DATA_PTR(heap,x,v) do { \ (x)->curr_alloc = (void *) (v); \ } while (0) #define DUK_HBUFFER_EXTERNAL_SET_DATA_PTR_NULL(heap,x) do { \ (x)->curr_alloc = (void *) NULL; \ } while (0) #endif /* Get a pointer to the current buffer contents (matching current allocation * size). May be NULL for zero size dynamic/external buffer. */ #if defined(DUK_USE_HEAPPTR16) #define DUK_HBUFFER_GET_DATA_PTR(heap,x) ( \ DUK_HBUFFER_HAS_DYNAMIC((x)) ? \ ( \ DUK_HBUFFER_HAS_EXTERNAL((x)) ? \ DUK_HBUFFER_EXTERNAL_GET_DATA_PTR((heap), (duk_hbuffer_external *) (x)) : \ DUK_HBUFFER_DYNAMIC_GET_DATA_PTR((heap), (duk_hbuffer_dynamic *) (x)) \ ) : \ DUK_HBUFFER_FIXED_GET_DATA_PTR((heap), (duk_hbuffer_fixed *) (x)) \ ) #else /* Without heap pointer compression duk_hbuffer_dynamic and duk_hbuffer_external * have the same layout so checking for fixed vs. dynamic (or external) is enough. */ #define DUK_HBUFFER_GET_DATA_PTR(heap,x) ( \ DUK_HBUFFER_HAS_DYNAMIC((x)) ? \ DUK_HBUFFER_DYNAMIC_GET_DATA_PTR((heap), (duk_hbuffer_dynamic *) (x)) : \ DUK_HBUFFER_FIXED_GET_DATA_PTR((heap), (duk_hbuffer_fixed *) (x)) \ ) #endif /* * Structs */ /* Shared prefix for all buffer types. */ struct duk_hbuffer { duk_heaphdr hdr; /* It's not strictly necessary to track the current size, but * it is useful for writing robust native code. */ /* Current size. */ #if defined(DUK_USE_BUFLEN16) /* Stored in duk_heaphdr unused flags. */ #else duk_size_t size; #endif /* * Data following the header depends on the DUK_HBUFFER_FLAG_DYNAMIC * flag. * * If the flag is clear (the buffer is a fixed size one), the buffer * data follows the header directly, consisting of 'size' bytes. * * If the flag is set, the actual buffer is allocated separately, and * a few control fields follow the header. Specifically: * * - a "void *" pointing to the current allocation * - a duk_size_t indicating the full allocated size (always >= 'size') * * If DUK_HBUFFER_FLAG_EXTERNAL is set, the buffer has been allocated * by user code, so that Duktape won't be able to resize it and won't * free it. This allows buffers to point to e.g. an externally * allocated structure such as a frame buffer. * * Unlike strings, no terminator byte (NUL) is guaranteed after the * data. This would be convenient, but would pad aligned user buffers * unnecessarily upwards in size. For instance, if user code requested * a 64-byte dynamic buffer, 65 bytes would actually be allocated which * would then potentially round upwards to perhaps 68 or 72 bytes. */ }; /* Fixed buffer; data follows struct, with proper alignment guaranteed by * struct size. */ #if (DUK_USE_ALIGN_BY == 8) && defined(DUK_USE_PACK_MSVC_PRAGMA) #pragma pack(push, 8) #endif struct duk_hbuffer_fixed { /* A union is used here as a portable struct size / alignment trick: * by adding a 32-bit or a 64-bit (unused) union member, the size of * the struct is effectively forced to be a multiple of 4 or 8 bytes * (respectively) without increasing the size of the struct unless * necessary. */ union { struct { duk_heaphdr hdr; #if defined(DUK_USE_BUFLEN16) /* Stored in duk_heaphdr unused flags. */ #else duk_size_t size; #endif } s; #if (DUK_USE_ALIGN_BY == 4) duk_uint32_t dummy_for_align4; #elif (DUK_USE_ALIGN_BY == 8) duk_double_t dummy_for_align8; #elif (DUK_USE_ALIGN_BY == 1) /* no extra padding */ #else #error invalid DUK_USE_ALIGN_BY #endif } u; /* * Data follows the struct header. The struct size is padded by the * compiler based on the struct members. This guarantees that the * buffer data will be aligned-by-4 but not necessarily aligned-by-8. * * On platforms where alignment does not matter, the struct padding * could be removed (if there is any). On platforms where alignment * by 8 is required, the struct size must be forced to be a multiple * of 8 by some means. Without it, some user code may break, and also * Duktape itself breaks (e.g. the compiler stores duk_tvals in a * dynamic buffer). */ } #if (DUK_USE_ALIGN_BY == 8) && defined(DUK_USE_PACK_GCC_ATTR) __attribute__ ((aligned (8))) #elif (DUK_USE_ALIGN_BY == 8) && defined(DUK_USE_PACK_CLANG_ATTR) __attribute__ ((aligned (8))) #endif ; #if (DUK_USE_ALIGN_BY == 8) && defined(DUK_USE_PACK_MSVC_PRAGMA) #pragma pack(pop) #endif /* Dynamic buffer with 'curr_alloc' pointing to a dynamic area allocated using * heap allocation primitives. Also used for external buffers when low memory * options are not used. */ struct duk_hbuffer_dynamic { duk_heaphdr hdr; #if defined(DUK_USE_BUFLEN16) /* Stored in duk_heaphdr unused flags. */ #else duk_size_t size; #endif #if defined(DUK_USE_HEAPPTR16) /* Stored in duk_heaphdr h_extra16. */ #else void *curr_alloc; /* may be NULL if alloc_size == 0 */ #endif /* * Allocation size for 'curr_alloc' is alloc_size. There is no * automatic NUL terminator for buffers (see above for rationale). * * 'curr_alloc' is explicitly allocated with heap allocation * primitives and will thus always have alignment suitable for * e.g. duk_tval and an IEEE double. */ }; /* External buffer with 'curr_alloc' managed by user code and pointing to an * arbitrary address. When heap pointer compression is not used, this struct * has the same layout as duk_hbuffer_dynamic. */ struct duk_hbuffer_external { duk_heaphdr hdr; #if defined(DUK_USE_BUFLEN16) /* Stored in duk_heaphdr unused flags. */ #else duk_size_t size; #endif /* Cannot be compressed as a heap pointer because may point to * an arbitrary address. */ void *curr_alloc; /* may be NULL if alloc_size == 0 */ }; /* * Prototypes */ DUK_INTERNAL_DECL duk_hbuffer *duk_hbuffer_alloc(duk_heap *heap, duk_size_t size, duk_small_uint_t flags, void **out_bufdata); DUK_INTERNAL_DECL void *duk_hbuffer_get_dynalloc_ptr(duk_heap *heap, void *ud); /* indirect allocs */ /* dynamic buffer ops */ DUK_INTERNAL_DECL void duk_hbuffer_resize(duk_hthread *thr, duk_hbuffer_dynamic *buf, duk_size_t new_size); DUK_INTERNAL_DECL void duk_hbuffer_reset(duk_hthread *thr, duk_hbuffer_dynamic *buf); #endif /* DUK_HBUFFER_H_INCLUDED */ /* #include duk_hproxy.h */ #line 1 "duk_hproxy.h" /* * Proxy object representation. */ #if !defined(DUK_HPROXY_H_INCLUDED) #define DUK_HPROXY_H_INCLUDED #define DUK_ASSERT_HPROXY_VALID(h) do { \ DUK_ASSERT((h) != NULL); \ DUK_ASSERT((h)->target != NULL); \ DUK_ASSERT((h)->handler != NULL); \ DUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ((duk_hobject *) (h))); \ } while (0) struct duk_hproxy { /* Shared object part. */ duk_hobject obj; /* Proxy target object. */ duk_hobject *target; /* Proxy handlers (traps). */ duk_hobject *handler; }; #endif /* DUK_HPROXY_H_INCLUDED */ /* #include duk_heap.h */ #line 1 "duk_heap.h" /* * Heap structure. * * Heap contains allocated heap objects, interned strings, and built-in * strings for one or more threads. */ #if !defined(DUK_HEAP_H_INCLUDED) #define DUK_HEAP_H_INCLUDED /* alloc function typedefs in duktape.h */ /* * Heap flags */ #define DUK_HEAP_FLAG_MARKANDSWEEP_RECLIMIT_REACHED (1U << 0) /* mark-and-sweep marking reached a recursion limit and must use multi-pass marking */ #define DUK_HEAP_FLAG_INTERRUPT_RUNNING (1U << 1) /* executor interrupt running (used to avoid nested interrupts) */ #define DUK_HEAP_FLAG_FINALIZER_NORESCUE (1U << 2) /* heap destruction ongoing, finalizer rescue no longer possible */ #define DUK_HEAP_FLAG_DEBUGGER_PAUSED (1U << 3) /* debugger is paused: talk with debug client until step/resume */ #define DUK__HEAP_HAS_FLAGS(heap,bits) ((heap)->flags & (bits)) #define DUK__HEAP_SET_FLAGS(heap,bits) do { \ (heap)->flags |= (bits); \ } while (0) #define DUK__HEAP_CLEAR_FLAGS(heap,bits) do { \ (heap)->flags &= ~(bits); \ } while (0) #define DUK_HEAP_HAS_MARKANDSWEEP_RECLIMIT_REACHED(heap) DUK__HEAP_HAS_FLAGS((heap), DUK_HEAP_FLAG_MARKANDSWEEP_RECLIMIT_REACHED) #define DUK_HEAP_HAS_INTERRUPT_RUNNING(heap) DUK__HEAP_HAS_FLAGS((heap), DUK_HEAP_FLAG_INTERRUPT_RUNNING) #define DUK_HEAP_HAS_FINALIZER_NORESCUE(heap) DUK__HEAP_HAS_FLAGS((heap), DUK_HEAP_FLAG_FINALIZER_NORESCUE) #define DUK_HEAP_HAS_DEBUGGER_PAUSED(heap) DUK__HEAP_HAS_FLAGS((heap), DUK_HEAP_FLAG_DEBUGGER_PAUSED) #define DUK_HEAP_SET_MARKANDSWEEP_RECLIMIT_REACHED(heap) DUK__HEAP_SET_FLAGS((heap), DUK_HEAP_FLAG_MARKANDSWEEP_RECLIMIT_REACHED) #define DUK_HEAP_SET_INTERRUPT_RUNNING(heap) DUK__HEAP_SET_FLAGS((heap), DUK_HEAP_FLAG_INTERRUPT_RUNNING) #define DUK_HEAP_SET_FINALIZER_NORESCUE(heap) DUK__HEAP_SET_FLAGS((heap), DUK_HEAP_FLAG_FINALIZER_NORESCUE) #define DUK_HEAP_SET_DEBUGGER_PAUSED(heap) DUK__HEAP_SET_FLAGS((heap), DUK_HEAP_FLAG_DEBUGGER_PAUSED) #define DUK_HEAP_CLEAR_MARKANDSWEEP_RECLIMIT_REACHED(heap) DUK__HEAP_CLEAR_FLAGS((heap), DUK_HEAP_FLAG_MARKANDSWEEP_RECLIMIT_REACHED) #define DUK_HEAP_CLEAR_INTERRUPT_RUNNING(heap) DUK__HEAP_CLEAR_FLAGS((heap), DUK_HEAP_FLAG_INTERRUPT_RUNNING) #define DUK_HEAP_CLEAR_FINALIZER_NORESCUE(heap) DUK__HEAP_CLEAR_FLAGS((heap), DUK_HEAP_FLAG_FINALIZER_NORESCUE) #define DUK_HEAP_CLEAR_DEBUGGER_PAUSED(heap) DUK__HEAP_CLEAR_FLAGS((heap), DUK_HEAP_FLAG_DEBUGGER_PAUSED) /* * Longjmp types, also double as identifying continuation type for a rethrow (in 'finally') */ #define DUK_LJ_TYPE_UNKNOWN 0 /* unused */ #define DUK_LJ_TYPE_THROW 1 /* value1 -> error object */ #define DUK_LJ_TYPE_YIELD 2 /* value1 -> yield value, iserror -> error / normal */ #define DUK_LJ_TYPE_RESUME 3 /* value1 -> resume value, value2 -> resumee thread, iserror -> error/normal */ #define DUK_LJ_TYPE_BREAK 4 /* value1 -> label number, pseudo-type to indicate a break continuation (for ENDFIN) */ #define DUK_LJ_TYPE_CONTINUE 5 /* value1 -> label number, pseudo-type to indicate a continue continuation (for ENDFIN) */ #define DUK_LJ_TYPE_RETURN 6 /* value1 -> return value, pseudo-type to indicate a return continuation (for ENDFIN) */ #define DUK_LJ_TYPE_NORMAL 7 /* no value, pseudo-type to indicate a normal continuation (for ENDFIN) */ /* * Mark-and-sweep flags * * These are separate from heap level flags now but could be merged. * The heap structure only contains a 'base mark-and-sweep flags' * field and the GC caller can impose further flags. */ /* Emergency mark-and-sweep: try extra hard, even at the cost of * performance. */ #define DUK_MS_FLAG_EMERGENCY (1U << 0) /* Voluntary mark-and-sweep: triggered periodically. */ #define DUK_MS_FLAG_VOLUNTARY (1U << 1) /* Postpone rescue decisions for reachable objects with FINALIZED set. * Used during finalize_list processing to avoid incorrect rescue * decisions due to finalize_list being a reachability root. */ #define DUK_MS_FLAG_POSTPONE_RESCUE (1U << 2) /* Don't compact objects; needed during object property table resize * to prevent a recursive resize. It would suffice to protect only the * current object being resized, but this is not yet implemented. */ #define DUK_MS_FLAG_NO_OBJECT_COMPACTION (1U << 3) /* * Thread switching * * To switch heap->curr_thread, use the macro below so that interrupt counters * get updated correctly. The macro allows a NULL target thread because that * happens e.g. in call handling. */ #if defined(DUK_USE_INTERRUPT_COUNTER) #define DUK_HEAP_SWITCH_THREAD(heap,newthr) duk_heap_switch_thread((heap), (newthr)) #else #define DUK_HEAP_SWITCH_THREAD(heap,newthr) do { \ (heap)->curr_thread = (newthr); \ } while (0) #endif /* * Stats */ #if defined(DUK_USE_DEBUG) #define DUK_STATS_INC(heap,fieldname) do { \ (heap)->fieldname += 1; \ } while (0) #else #define DUK_STATS_INC(heap,fieldname) do {} while (0) #endif /* * Other heap related defines */ /* Mark-and-sweep interval is relative to combined count of objects and * strings kept in the heap during the latest mark-and-sweep pass. * Fixed point .8 multiplier and .0 adder. Trigger count (interval) is * decreased by each (re)allocation attempt (regardless of size), and each * refzero processed object. * * 'SKIP' indicates how many (re)allocations to wait until a retry if * GC is skipped because there is no thread do it with yet (happens * only during init phases). */ #if defined(DUK_USE_REFERENCE_COUNTING) #define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_MULT 12800L /* 50x heap size */ #define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_ADD 1024L #define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_SKIP 256L #else #define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_MULT 256L /* 1x heap size */ #define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_ADD 1024L #define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_SKIP 256L #endif /* GC torture. */ #if defined(DUK_USE_GC_TORTURE) #define DUK_GC_TORTURE(heap) do { duk_heap_mark_and_sweep((heap), 0); } while (0) #else #define DUK_GC_TORTURE(heap) do { } while (0) #endif /* Stringcache is used for speeding up char-offset-to-byte-offset * translations for non-ASCII strings. */ #define DUK_HEAP_STRCACHE_SIZE 4 #define DUK_HEAP_STRINGCACHE_NOCACHE_LIMIT 16 /* strings up to the this length are not cached */ /* Some list management macros. */ #define DUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(heap,hdr) duk_heap_insert_into_heap_allocated((heap), (hdr)) #if defined(DUK_USE_REFERENCE_COUNTING) #define DUK_HEAP_REMOVE_FROM_HEAP_ALLOCATED(heap,hdr) duk_heap_remove_from_heap_allocated((heap), (hdr)) #endif #if defined(DUK_USE_FINALIZER_SUPPORT) #define DUK_HEAP_INSERT_INTO_FINALIZE_LIST(heap,hdr) duk_heap_insert_into_finalize_list((heap), (hdr)) #define DUK_HEAP_REMOVE_FROM_FINALIZE_LIST(heap,hdr) duk_heap_remove_from_finalize_list((heap), (hdr)) #endif /* * Built-in strings */ /* heap string indices are autogenerated in duk_strings.h */ #if defined(DUK_USE_ROM_STRINGS) #define DUK_HEAP_GET_STRING(heap,idx) \ ((duk_hstring *) DUK_LOSE_CONST(duk_rom_strings_stridx[(idx)])) #else /* DUK_USE_ROM_STRINGS */ #if defined(DUK_USE_HEAPPTR16) #define DUK_HEAP_GET_STRING(heap,idx) \ ((duk_hstring *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (heap)->strs16[(idx)])) #else #define DUK_HEAP_GET_STRING(heap,idx) \ ((heap)->strs[(idx)]) #endif #endif /* DUK_USE_ROM_STRINGS */ /* * Raw memory calls: relative to heap, but no GC interaction */ #define DUK_ALLOC_RAW(heap,size) \ ((heap)->alloc_func((heap)->heap_udata, (size))) #define DUK_REALLOC_RAW(heap,ptr,newsize) \ ((heap)->realloc_func((heap)->heap_udata, (void *) (ptr), (newsize))) #define DUK_FREE_RAW(heap,ptr) \ ((heap)->free_func((heap)->heap_udata, (void *) (ptr))) /* * Memory calls: relative to heap, GC interaction, but no error throwing. * * XXX: Currently a mark-and-sweep triggered by memory allocation will run * using the heap->heap_thread. This thread is also used for running * mark-and-sweep finalization; this is not ideal because it breaks the * isolation between multiple global environments. * * Notes: * * - DUK_FREE() is required to ignore NULL and any other possible return * value of a zero-sized alloc/realloc (same as ANSI C free()). * * - There is no DUK_REALLOC_ZEROED because we don't assume to know the * old size. Caller must zero the reallocated memory. * * - DUK_REALLOC_INDIRECT() must be used when a mark-and-sweep triggered * by an allocation failure might invalidate the original 'ptr', thus * causing a realloc retry to use an invalid pointer. Example: we're * reallocating the value stack and a finalizer resizes the same value * stack during mark-and-sweep. The indirect variant requests for the * current location of the pointer being reallocated using a callback * right before every realloc attempt; this circuitous approach is used * to avoid strict aliasing issues in a more straightforward indirect * pointer (void **) approach. Note: the pointer in the storage * location is read but is NOT updated; the caller must do that. */ /* callback for indirect reallocs, request for current pointer */ typedef void *(*duk_mem_getptr)(duk_heap *heap, void *ud); #define DUK_ALLOC(heap,size) duk_heap_mem_alloc((heap), (size)) #define DUK_ALLOC_ZEROED(heap,size) duk_heap_mem_alloc_zeroed((heap), (size)) #define DUK_REALLOC(heap,ptr,newsize) duk_heap_mem_realloc((heap), (ptr), (newsize)) #define DUK_REALLOC_INDIRECT(heap,cb,ud,newsize) duk_heap_mem_realloc_indirect((heap), (cb), (ud), (newsize)) #define DUK_FREE(heap,ptr) duk_heap_mem_free((heap), (ptr)) /* * Checked allocation, relative to a thread * * DUK_FREE_CHECKED() doesn't actually throw, but accepts a 'thr' argument * for convenience. */ #define DUK_ALLOC_CHECKED(thr,size) duk_heap_mem_alloc_checked((thr), (size)) #define DUK_ALLOC_CHECKED_ZEROED(thr,size) duk_heap_mem_alloc_checked_zeroed((thr), (size)) #define DUK_FREE_CHECKED(thr,ptr) duk_heap_mem_free((thr)->heap, (ptr)) /* * Memory constants */ #define DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_LIMIT 10 /* Retry allocation after mark-and-sweep for this * many times. A single mark-and-sweep round is * not guaranteed to free all unreferenced memory * because of finalization (in fact, ANY number of * rounds is strictly not enough). */ #define DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_EMERGENCY_LIMIT 3 /* Starting from this round, use emergency mode * for mark-and-sweep. */ /* * Debugger support */ /* Maximum number of breakpoints. Only breakpoints that are set are * consulted so increasing this has no performance impact. */ #define DUK_HEAP_MAX_BREAKPOINTS 16 /* Opcode interval for a Date-based status/peek rate limit check. Only * relevant when debugger is attached. Requesting a timestamp may be a * slow operation on some platforms so this shouldn't be too low. On the * other hand a high value makes Duktape react to a pause request slowly. */ #define DUK_HEAP_DBG_RATELIMIT_OPCODES 4000 /* Milliseconds between status notify and transport peeks. */ #define DUK_HEAP_DBG_RATELIMIT_MILLISECS 200 /* Debugger pause flags. */ #define DUK_PAUSE_FLAG_ONE_OPCODE (1U << 0) /* pause when a single opcode has been executed */ #define DUK_PAUSE_FLAG_ONE_OPCODE_ACTIVE (1U << 1) /* one opcode pause actually active; artifact of current implementation */ #define DUK_PAUSE_FLAG_LINE_CHANGE (1U << 2) /* pause when current line number changes */ #define DUK_PAUSE_FLAG_FUNC_ENTRY (1U << 3) /* pause when entering a function */ #define DUK_PAUSE_FLAG_FUNC_EXIT (1U << 4) /* pause when exiting current function */ #define DUK_PAUSE_FLAG_CAUGHT_ERROR (1U << 5) /* pause when about to throw an error that is caught */ #define DUK_PAUSE_FLAG_UNCAUGHT_ERROR (1U << 6) /* pause when about to throw an error that won't be caught */ struct duk_breakpoint { duk_hstring *filename; duk_uint32_t line; }; /* * String cache should ideally be at duk_hthread level, but that would * cause string finalization to slow down relative to the number of * threads; string finalization must check the string cache for "weak" * references to the string being finalized to avoid dead pointers. * * Thus, string caches are now at the heap level now. */ struct duk_strcache { duk_hstring *h; duk_uint32_t bidx; duk_uint32_t cidx; }; /* * Longjmp state, contains the information needed to perform a longjmp. * Longjmp related values are written to value1, value2, and iserror. */ struct duk_ljstate { duk_jmpbuf *jmpbuf_ptr; /* current setjmp() catchpoint */ duk_small_uint_t type; /* longjmp type */ duk_bool_t iserror; /* isError flag for yield */ duk_tval value1; /* 1st related value (type specific) */ duk_tval value2; /* 2nd related value (type specific) */ }; #define DUK_ASSERT_LJSTATE_UNSET(heap) do { \ DUK_ASSERT(heap != NULL); \ DUK_ASSERT(heap->lj.type == DUK_LJ_TYPE_UNKNOWN); \ DUK_ASSERT(heap->lj.iserror == 0); \ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(&heap->lj.value1)); \ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(&heap->lj.value2)); \ } while (0) #define DUK_ASSERT_LJSTATE_SET(heap) do { \ DUK_ASSERT(heap != NULL); \ DUK_ASSERT(heap->lj.type != DUK_LJ_TYPE_UNKNOWN); \ } while (0) /* * Main heap structure */ struct duk_heap { duk_small_uint_t flags; /* Allocator functions. */ duk_alloc_function alloc_func; duk_realloc_function realloc_func; duk_free_function free_func; /* Heap udata, used for allocator functions but also for other heap * level callbacks like fatal function, pointer compression, etc. */ void *heap_udata; /* Fatal error handling, called e.g. when a longjmp() is needed but * lj.jmpbuf_ptr is NULL. fatal_func must never return; it's not * declared as "noreturn" because doing that for typedefs is a bit * challenging portability-wise. */ duk_fatal_function fatal_func; /* Main list of allocated heap objects. Objects are either here, * in finalize_list waiting for processing, or in refzero_list * temporarily while a DECREF refzero cascade finishes. */ duk_heaphdr *heap_allocated; /* Temporary work list for freeing a cascade of objects when a DECREF * (or DECREF_NORZ) encounters a zero refcount. Using a work list * allows fixed C stack size when refcounts go to zero for a chain of * objects. Outside of DECREF this is always a NULL because DECREF is * processed without side effects (only memory free calls). */ #if defined(DUK_USE_REFERENCE_COUNTING) duk_heaphdr *refzero_list; #endif #if defined(DUK_USE_FINALIZER_SUPPORT) /* Work list for objects to be finalized. */ duk_heaphdr *finalize_list; #if defined(DUK_USE_ASSERTIONS) /* Object whose finalizer is executing right now (no nesting). */ duk_heaphdr *currently_finalizing; #endif #endif /* Freelist for duk_activations and duk_catchers. */ #if defined(DUK_USE_CACHE_ACTIVATION) duk_activation *activation_free; #endif #if defined(DUK_USE_CACHE_CATCHER) duk_catcher *catcher_free; #endif /* Voluntary mark-and-sweep trigger counter. Intentionally signed * because we continue decreasing the value when voluntary GC cannot * run. */ #if defined(DUK_USE_VOLUNTARY_GC) duk_int_t ms_trigger_counter; #endif /* Mark-and-sweep recursion control: too deep recursion causes * multi-pass processing to avoid growing C stack without bound. */ duk_uint_t ms_recursion_depth; /* Mark-and-sweep flags automatically active (used for critical sections). */ duk_small_uint_t ms_base_flags; /* Mark-and-sweep running flag. Prevents re-entry, and also causes * refzero events to be ignored (= objects won't be queued to refzero_list). */ duk_uint_t ms_running; /* Mark-and-sweep prevent count, stacking. Used to avoid M&S side * effects (besides finalizers which are controlled separately) such * as compacting the string table or object property tables. This * is also bumped when ms_running is set to prevent recursive re-entry. * Can also be bumped when mark-and-sweep is not running. */ duk_uint_t ms_prevent_count; /* Finalizer processing prevent count, stacking. Bumped when finalizers * are processed to prevent recursive finalizer processing (first call site * processing finalizers handles all finalizers until the list is empty). * Can also be bumped explicitly to prevent finalizer execution. */ duk_uint_t pf_prevent_count; /* When processing finalize_list, don't actually run finalizers but * queue finalizable objects back to heap_allocated as is. This is * used during heap destruction to deal with finalizers that keep * on creating more finalizable garbage. */ duk_uint_t pf_skip_finalizers; #if defined(DUK_USE_ASSERTIONS) /* Set when we're in a critical path where an error throw would cause * e.g. sandboxing/protected call violations or state corruption. This * is just used for asserts. */ duk_bool_t error_not_allowed; #endif #if defined(DUK_USE_ASSERTIONS) /* Set when heap is still being initialized, helps with writing * some assertions. */ duk_bool_t heap_initializing; #endif /* Marker for detecting internal "double faults", errors thrown when * we're trying to create an error object, see duk_error_throw.c. */ duk_bool_t creating_error; /* Marker for indicating we're calling a user error augmentation * (errCreate/errThrow) function. Errors created/thrown during * such a call are not augmented. */ #if defined(DUK_USE_AUGMENT_ERROR_THROW) || defined(DUK_USE_AUGMENT_ERROR_CREATE) duk_bool_t augmenting_error; #endif /* Longjmp state. */ duk_ljstate lj; /* Heap thread, used internally and for finalization. */ duk_hthread *heap_thread; /* Current running thread. */ duk_hthread *curr_thread; /* Heap level "stash" object (e.g., various reachability roots). */ duk_hobject *heap_object; /* duk_handle_call / duk_handle_safe_call recursion depth limiting */ duk_int_t call_recursion_depth; duk_int_t call_recursion_limit; /* Mix-in value for computing string hashes; should be reasonably unpredictable. */ duk_uint32_t hash_seed; /* Random number state for duk_util_tinyrandom.c. */ #if !defined(DUK_USE_GET_RANDOM_DOUBLE) #if defined(DUK_USE_PREFER_SIZE) || !defined(DUK_USE_64BIT_OPS) duk_uint32_t rnd_state; /* State for Shamir's three-op algorithm */ #else duk_uint64_t rnd_state[2]; /* State for xoroshiro128+ */ #endif #endif /* Counter for unique local symbol creation. */ /* XXX: When 64-bit types are available, it would be more efficient to * use a duk_uint64_t at least for incrementing but maybe also for * string formatting in the Symbol constructor. */ duk_uint32_t sym_counter[2]; /* For manual debugging: instruction count based on executor and * interrupt counter book-keeping. Inspect debug logs to see how * they match up. */ #if defined(DUK_USE_INTERRUPT_COUNTER) && defined(DUK_USE_DEBUG) duk_int_t inst_count_exec; duk_int_t inst_count_interrupt; #endif /* Debugger state. */ #if defined(DUK_USE_DEBUGGER_SUPPORT) /* Callbacks and udata; dbg_read_cb != NULL is used to indicate attached state. */ duk_debug_read_function dbg_read_cb; /* required, NULL implies detached */ duk_debug_write_function dbg_write_cb; /* required */ duk_debug_peek_function dbg_peek_cb; duk_debug_read_flush_function dbg_read_flush_cb; duk_debug_write_flush_function dbg_write_flush_cb; duk_debug_request_function dbg_request_cb; duk_debug_detached_function dbg_detached_cb; void *dbg_udata; /* The following are only relevant when debugger is attached. */ duk_bool_t dbg_processing; /* currently processing messages or breakpoints: don't enter message processing recursively (e.g. no breakpoints when processing debugger eval) */ duk_bool_t dbg_state_dirty; /* resend state next time executor is about to run */ duk_bool_t dbg_force_restart; /* force executor restart to recheck breakpoints; used to handle function returns (see GH-303) */ duk_bool_t dbg_detaching; /* debugger detaching; used to avoid calling detach handler recursively */ duk_small_uint_t dbg_pause_flags; /* flags for automatic pause behavior */ duk_activation *dbg_pause_act; /* activation related to pause behavior (pause on line change, function entry/exit) */ duk_uint32_t dbg_pause_startline; /* starting line number for line change related pause behavior */ duk_breakpoint dbg_breakpoints[DUK_HEAP_MAX_BREAKPOINTS]; /* breakpoints: [0,breakpoint_count[ gc reachable */ duk_small_uint_t dbg_breakpoint_count; duk_breakpoint *dbg_breakpoints_active[DUK_HEAP_MAX_BREAKPOINTS + 1]; /* currently active breakpoints: NULL term, borrowed pointers */ /* XXX: make active breakpoints actual copies instead of pointers? */ /* These are for rate limiting Status notifications and transport peeking. */ duk_uint_t dbg_exec_counter; /* cumulative opcode execution count (overflows are OK) */ duk_uint_t dbg_last_counter; /* value of dbg_exec_counter when we last did a Date-based check */ duk_double_t dbg_last_time; /* time when status/peek was last done (Date-based rate limit) */ /* Used to support single-byte stream lookahead. */ duk_bool_t dbg_have_next_byte; duk_uint8_t dbg_next_byte; #endif /* DUK_USE_DEBUGGER_SUPPORT */ #if defined(DUK_USE_ASSERTIONS) duk_bool_t dbg_calling_transport; /* transport call in progress, calling into Duktape forbidden */ #endif /* String intern table (weak refs). */ #if defined(DUK_USE_STRTAB_PTRCOMP) duk_uint16_t *strtable16; #else duk_hstring **strtable; #endif duk_uint32_t st_mask; /* mask for lookup, st_size - 1 */ duk_uint32_t st_size; /* stringtable size */ #if (DUK_USE_STRTAB_MINSIZE != DUK_USE_STRTAB_MAXSIZE) duk_uint32_t st_count; /* string count for resize load factor checks */ #endif duk_bool_t st_resizing; /* string table is being resized; avoid recursive resize */ /* String access cache (codepoint offset -> byte offset) for fast string * character looping; 'weak' reference which needs special handling in GC. */ duk_strcache strcache[DUK_HEAP_STRCACHE_SIZE]; /* Built-in strings. */ #if defined(DUK_USE_ROM_STRINGS) /* No field needed when strings are in ROM. */ #else #if defined(DUK_USE_HEAPPTR16) duk_uint16_t strs16[DUK_HEAP_NUM_STRINGS]; #else duk_hstring *strs[DUK_HEAP_NUM_STRINGS]; #endif #endif /* Stats. */ #if defined(DUK_USE_DEBUG) duk_int_t stats_exec_opcodes; duk_int_t stats_exec_interrupt; duk_int_t stats_exec_throw; duk_int_t stats_call_all; duk_int_t stats_call_tailcall; duk_int_t stats_call_ecmatoecma; duk_int_t stats_safecall_all; duk_int_t stats_safecall_nothrow; duk_int_t stats_safecall_throw; duk_int_t stats_ms_try_count; duk_int_t stats_ms_skip_count; duk_int_t stats_ms_emergency_count; duk_int_t stats_strtab_intern_hit; duk_int_t stats_strtab_intern_miss; duk_int_t stats_strtab_resize_check; duk_int_t stats_strtab_resize_grow; duk_int_t stats_strtab_resize_shrink; duk_int_t stats_object_realloc_props; duk_int_t stats_object_abandon_array; duk_int_t stats_getownpropdesc_count; duk_int_t stats_getownpropdesc_hit; duk_int_t stats_getownpropdesc_miss; duk_int_t stats_getpropdesc_count; duk_int_t stats_getpropdesc_hit; duk_int_t stats_getpropdesc_miss; duk_int_t stats_getprop_all; duk_int_t stats_getprop_arrayidx; duk_int_t stats_getprop_bufobjidx; duk_int_t stats_getprop_bufferidx; duk_int_t stats_getprop_bufferlen; duk_int_t stats_getprop_stringidx; duk_int_t stats_getprop_stringlen; duk_int_t stats_getprop_proxy; duk_int_t stats_getprop_arguments; duk_int_t stats_putprop_all; duk_int_t stats_putprop_arrayidx; duk_int_t stats_putprop_bufobjidx; duk_int_t stats_putprop_bufferidx; duk_int_t stats_putprop_proxy; duk_int_t stats_getvar_all; duk_int_t stats_putvar_all; #endif }; /* * Prototypes */ DUK_INTERNAL_DECL duk_heap *duk_heap_alloc(duk_alloc_function alloc_func, duk_realloc_function realloc_func, duk_free_function free_func, void *heap_udata, duk_fatal_function fatal_func); DUK_INTERNAL_DECL void duk_heap_free(duk_heap *heap); DUK_INTERNAL_DECL void duk_free_hobject(duk_heap *heap, duk_hobject *h); DUK_INTERNAL_DECL void duk_free_hbuffer(duk_heap *heap, duk_hbuffer *h); DUK_INTERNAL_DECL void duk_free_hstring(duk_heap *heap, duk_hstring *h); DUK_INTERNAL_DECL void duk_heap_free_heaphdr_raw(duk_heap *heap, duk_heaphdr *hdr); DUK_INTERNAL_DECL void duk_heap_insert_into_heap_allocated(duk_heap *heap, duk_heaphdr *hdr); #if defined(DUK_USE_REFERENCE_COUNTING) DUK_INTERNAL_DECL void duk_heap_remove_from_heap_allocated(duk_heap *heap, duk_heaphdr *hdr); #endif #if defined(DUK_USE_FINALIZER_SUPPORT) DUK_INTERNAL_DECL void duk_heap_insert_into_finalize_list(duk_heap *heap, duk_heaphdr *hdr); DUK_INTERNAL_DECL void duk_heap_remove_from_finalize_list(duk_heap *heap, duk_heaphdr *hdr); #endif #if defined(DUK_USE_ASSERTIONS) DUK_INTERNAL_DECL duk_bool_t duk_heap_in_heap_allocated(duk_heap *heap, duk_heaphdr *ptr); #endif #if defined(DUK_USE_INTERRUPT_COUNTER) DUK_INTERNAL_DECL void duk_heap_switch_thread(duk_heap *heap, duk_hthread *new_thr); #endif DUK_INTERNAL_DECL duk_hstring *duk_heap_strtable_intern(duk_heap *heap, const duk_uint8_t *str, duk_uint32_t blen); DUK_INTERNAL_DECL duk_hstring *duk_heap_strtable_intern_checked(duk_hthread *thr, const duk_uint8_t *str, duk_uint32_t len); DUK_INTERNAL_DECL duk_hstring *duk_heap_strtable_intern_u32(duk_heap *heap, duk_uint32_t val); DUK_INTERNAL_DECL duk_hstring *duk_heap_strtable_intern_u32_checked(duk_hthread *thr, duk_uint32_t val); #if defined(DUK_USE_REFERENCE_COUNTING) DUK_INTERNAL_DECL void duk_heap_strtable_unlink(duk_heap *heap, duk_hstring *h); #endif DUK_INTERNAL_DECL void duk_heap_strtable_unlink_prev(duk_heap *heap, duk_hstring *h, duk_hstring *prev); DUK_INTERNAL_DECL void duk_heap_strtable_force_resize(duk_heap *heap); DUK_INTERNAL void duk_heap_strtable_free(duk_heap *heap); #if defined(DUK_USE_DEBUG) DUK_INTERNAL void duk_heap_strtable_dump(duk_heap *heap); #endif DUK_INTERNAL_DECL void duk_heap_strcache_string_remove(duk_heap *heap, duk_hstring *h); DUK_INTERNAL_DECL duk_uint_fast32_t duk_heap_strcache_offset_char2byte(duk_hthread *thr, duk_hstring *h, duk_uint_fast32_t char_offset); #if defined(DUK_USE_PROVIDE_DEFAULT_ALLOC_FUNCTIONS) DUK_INTERNAL_DECL void *duk_default_alloc_function(void *udata, duk_size_t size); DUK_INTERNAL_DECL void *duk_default_realloc_function(void *udata, void *ptr, duk_size_t newsize); DUK_INTERNAL_DECL void duk_default_free_function(void *udata, void *ptr); #endif DUK_INTERNAL_DECL void *duk_heap_mem_alloc(duk_heap *heap, duk_size_t size); DUK_INTERNAL_DECL void *duk_heap_mem_alloc_zeroed(duk_heap *heap, duk_size_t size); DUK_INTERNAL_DECL void *duk_heap_mem_alloc_checked(duk_hthread *thr, duk_size_t size); DUK_INTERNAL_DECL void *duk_heap_mem_alloc_checked_zeroed(duk_hthread *thr, duk_size_t size); DUK_INTERNAL_DECL void *duk_heap_mem_realloc(duk_heap *heap, void *ptr, duk_size_t newsize); DUK_INTERNAL_DECL void *duk_heap_mem_realloc_indirect(duk_heap *heap, duk_mem_getptr cb, void *ud, duk_size_t newsize); DUK_INTERNAL_DECL void duk_heap_mem_free(duk_heap *heap, void *ptr); DUK_INTERNAL_DECL void duk_heap_free_freelists(duk_heap *heap); #if defined(DUK_USE_FINALIZER_SUPPORT) DUK_INTERNAL_DECL void duk_heap_run_finalizer(duk_heap *heap, duk_hobject *obj); DUK_INTERNAL_DECL void duk_heap_process_finalize_list(duk_heap *heap); #endif /* DUK_USE_FINALIZER_SUPPORT */ DUK_INTERNAL_DECL void duk_heap_mark_and_sweep(duk_heap *heap, duk_small_uint_t flags); DUK_INTERNAL_DECL duk_uint32_t duk_heap_hashstring(duk_heap *heap, const duk_uint8_t *str, duk_size_t len); #endif /* DUK_HEAP_H_INCLUDED */ /* #include duk_debugger.h */ #line 1 "duk_debugger.h" #if !defined(DUK_DEBUGGER_H_INCLUDED) #define DUK_DEBUGGER_H_INCLUDED /* Debugger protocol version is defined in the public API header. */ /* Initial bytes for markers. */ #define DUK_DBG_IB_EOM 0x00 #define DUK_DBG_IB_REQUEST 0x01 #define DUK_DBG_IB_REPLY 0x02 #define DUK_DBG_IB_ERROR 0x03 #define DUK_DBG_IB_NOTIFY 0x04 /* Other initial bytes. */ #define DUK_DBG_IB_INT4 0x10 #define DUK_DBG_IB_STR4 0x11 #define DUK_DBG_IB_STR2 0x12 #define DUK_DBG_IB_BUF4 0x13 #define DUK_DBG_IB_BUF2 0x14 #define DUK_DBG_IB_UNUSED 0x15 #define DUK_DBG_IB_UNDEFINED 0x16 #define DUK_DBG_IB_NULL 0x17 #define DUK_DBG_IB_TRUE 0x18 #define DUK_DBG_IB_FALSE 0x19 #define DUK_DBG_IB_NUMBER 0x1a #define DUK_DBG_IB_OBJECT 0x1b #define DUK_DBG_IB_POINTER 0x1c #define DUK_DBG_IB_LIGHTFUNC 0x1d #define DUK_DBG_IB_HEAPPTR 0x1e /* The short string/integer initial bytes starting from 0x60 don't have * defines now. */ /* Error codes. */ #define DUK_DBG_ERR_UNKNOWN 0x00 #define DUK_DBG_ERR_UNSUPPORTED 0x01 #define DUK_DBG_ERR_TOOMANY 0x02 #define DUK_DBG_ERR_NOTFOUND 0x03 #define DUK_DBG_ERR_APPLICATION 0x04 /* Commands and notifys initiated by Duktape. */ #define DUK_DBG_CMD_STATUS 0x01 #define DUK_DBG_CMD_UNUSED_2 0x02 /* Duktape 1.x: print notify */ #define DUK_DBG_CMD_UNUSED_3 0x03 /* Duktape 1.x: alert notify */ #define DUK_DBG_CMD_UNUSED_4 0x04 /* Duktape 1.x: log notify */ #define DUK_DBG_CMD_THROW 0x05 #define DUK_DBG_CMD_DETACHING 0x06 #define DUK_DBG_CMD_APPNOTIFY 0x07 /* Commands initiated by debug client. */ #define DUK_DBG_CMD_BASICINFO 0x10 #define DUK_DBG_CMD_TRIGGERSTATUS 0x11 #define DUK_DBG_CMD_PAUSE 0x12 #define DUK_DBG_CMD_RESUME 0x13 #define DUK_DBG_CMD_STEPINTO 0x14 #define DUK_DBG_CMD_STEPOVER 0x15 #define DUK_DBG_CMD_STEPOUT 0x16 #define DUK_DBG_CMD_LISTBREAK 0x17 #define DUK_DBG_CMD_ADDBREAK 0x18 #define DUK_DBG_CMD_DELBREAK 0x19 #define DUK_DBG_CMD_GETVAR 0x1a #define DUK_DBG_CMD_PUTVAR 0x1b #define DUK_DBG_CMD_GETCALLSTACK 0x1c #define DUK_DBG_CMD_GETLOCALS 0x1d #define DUK_DBG_CMD_EVAL 0x1e #define DUK_DBG_CMD_DETACH 0x1f #define DUK_DBG_CMD_DUMPHEAP 0x20 #define DUK_DBG_CMD_GETBYTECODE 0x21 #define DUK_DBG_CMD_APPREQUEST 0x22 #define DUK_DBG_CMD_GETHEAPOBJINFO 0x23 #define DUK_DBG_CMD_GETOBJPROPDESC 0x24 #define DUK_DBG_CMD_GETOBJPROPDESCRANGE 0x25 /* The low 8 bits map directly to duk_hobject.h DUK_PROPDESC_FLAG_xxx. * The remaining flags are specific to the debugger. */ #define DUK_DBG_PROPFLAG_SYMBOL (1U << 8) #define DUK_DBG_PROPFLAG_HIDDEN (1U << 9) #if defined(DUK_USE_DEBUGGER_SUPPORT) DUK_INTERNAL_DECL void duk_debug_do_detach(duk_heap *heap); DUK_INTERNAL_DECL duk_bool_t duk_debug_read_peek(duk_hthread *thr); DUK_INTERNAL_DECL void duk_debug_write_flush(duk_hthread *thr); DUK_INTERNAL_DECL void duk_debug_skip_bytes(duk_hthread *thr, duk_size_t length); DUK_INTERNAL_DECL void duk_debug_skip_byte(duk_hthread *thr); DUK_INTERNAL_DECL void duk_debug_read_bytes(duk_hthread *thr, duk_uint8_t *data, duk_size_t length); DUK_INTERNAL_DECL duk_uint8_t duk_debug_read_byte(duk_hthread *thr); DUK_INTERNAL_DECL duk_int32_t duk_debug_read_int(duk_hthread *thr); DUK_INTERNAL_DECL duk_hstring *duk_debug_read_hstring(duk_hthread *thr); /* XXX: exposed duk_debug_read_pointer */ /* XXX: exposed duk_debug_read_buffer */ /* XXX: exposed duk_debug_read_hbuffer */ #if 0 DUK_INTERNAL_DECL duk_heaphdr *duk_debug_read_heapptr(duk_hthread *thr); #endif #if defined(DUK_USE_DEBUGGER_INSPECT) DUK_INTERNAL_DECL duk_heaphdr *duk_debug_read_any_ptr(duk_hthread *thr); #endif DUK_INTERNAL_DECL duk_tval *duk_debug_read_tval(duk_hthread *thr); DUK_INTERNAL_DECL void duk_debug_write_bytes(duk_hthread *thr, const duk_uint8_t *data, duk_size_t length); DUK_INTERNAL_DECL void duk_debug_write_byte(duk_hthread *thr, duk_uint8_t x); DUK_INTERNAL_DECL void duk_debug_write_unused(duk_hthread *thr); DUK_INTERNAL_DECL void duk_debug_write_undefined(duk_hthread *thr); #if defined(DUK_USE_DEBUGGER_INSPECT) DUK_INTERNAL_DECL void duk_debug_write_null(duk_hthread *thr); #endif DUK_INTERNAL_DECL void duk_debug_write_boolean(duk_hthread *thr, duk_uint_t val); DUK_INTERNAL_DECL void duk_debug_write_int(duk_hthread *thr, duk_int32_t x); DUK_INTERNAL_DECL void duk_debug_write_uint(duk_hthread *thr, duk_uint32_t x); DUK_INTERNAL_DECL void duk_debug_write_string(duk_hthread *thr, const char *data, duk_size_t length); DUK_INTERNAL_DECL void duk_debug_write_cstring(duk_hthread *thr, const char *data); DUK_INTERNAL_DECL void duk_debug_write_hstring(duk_hthread *thr, duk_hstring *h); DUK_INTERNAL_DECL void duk_debug_write_buffer(duk_hthread *thr, const char *data, duk_size_t length); DUK_INTERNAL_DECL void duk_debug_write_hbuffer(duk_hthread *thr, duk_hbuffer *h); DUK_INTERNAL_DECL void duk_debug_write_pointer(duk_hthread *thr, void *ptr); #if defined(DUK_USE_DEBUGGER_DUMPHEAP) || defined(DUK_USE_DEBUGGER_INSPECT) DUK_INTERNAL_DECL void duk_debug_write_heapptr(duk_hthread *thr, duk_heaphdr *h); #endif DUK_INTERNAL_DECL void duk_debug_write_hobject(duk_hthread *thr, duk_hobject *obj); DUK_INTERNAL_DECL void duk_debug_write_tval(duk_hthread *thr, duk_tval *tv); #if 0 /* unused */ DUK_INTERNAL_DECL void duk_debug_write_request(duk_hthread *thr, duk_small_uint_t command); #endif DUK_INTERNAL_DECL void duk_debug_write_reply(duk_hthread *thr); DUK_INTERNAL_DECL void duk_debug_write_error_eom(duk_hthread *thr, duk_small_uint_t err_code, const char *msg); DUK_INTERNAL_DECL void duk_debug_write_notify(duk_hthread *thr, duk_small_uint_t command); DUK_INTERNAL_DECL void duk_debug_write_eom(duk_hthread *thr); DUK_INTERNAL_DECL duk_uint_fast32_t duk_debug_curr_line(duk_hthread *thr); DUK_INTERNAL_DECL void duk_debug_send_status(duk_hthread *thr); #if defined(DUK_USE_DEBUGGER_THROW_NOTIFY) DUK_INTERNAL_DECL void duk_debug_send_throw(duk_hthread *thr, duk_bool_t fatal); #endif DUK_INTERNAL_DECL void duk_debug_halt_execution(duk_hthread *thr, duk_bool_t use_prev_pc); DUK_INTERNAL_DECL duk_bool_t duk_debug_process_messages(duk_hthread *thr, duk_bool_t no_block); DUK_INTERNAL_DECL duk_small_int_t duk_debug_add_breakpoint(duk_hthread *thr, duk_hstring *filename, duk_uint32_t line); DUK_INTERNAL_DECL duk_bool_t duk_debug_remove_breakpoint(duk_hthread *thr, duk_small_uint_t breakpoint_index); DUK_INTERNAL_DECL duk_bool_t duk_debug_is_attached(duk_heap *heap); DUK_INTERNAL_DECL duk_bool_t duk_debug_is_paused(duk_heap *heap); DUK_INTERNAL_DECL void duk_debug_set_paused(duk_heap *heap); DUK_INTERNAL_DECL void duk_debug_clear_paused(duk_heap *heap); DUK_INTERNAL_DECL void duk_debug_clear_pause_state(duk_heap *heap); #endif /* DUK_USE_DEBUGGER_SUPPORT */ #endif /* DUK_DEBUGGER_H_INCLUDED */ /* #include duk_debug.h */ #line 1 "duk_debug.h" /* * Debugging macros, DUK_DPRINT() and its variants in particular. * * DUK_DPRINT() allows formatted debug prints, and supports standard * and Duktape specific formatters. See duk_debug_vsnprintf.c for details. * * DUK_D(x), DUK_DD(x), and DUK_DDD(x) are used together with log macros * for technical reasons. They are concretely used to hide 'x' from the * compiler when the corresponding log level is disabled. This allows * clean builds on non-C99 compilers, at the cost of more verbose code. * Examples: * * DUK_D(DUK_DPRINT("foo")); * DUK_DD(DUK_DDPRINT("foo")); * DUK_DDD(DUK_DDDPRINT("foo")); * * This approach is preferable to the old "double parentheses" hack because * double parentheses make the C99 solution worse: __FILE__ and __LINE__ can * no longer be added transparently without going through globals, which * works poorly with threading. */ #if !defined(DUK_DEBUG_H_INCLUDED) #define DUK_DEBUG_H_INCLUDED #if defined(DUK_USE_DEBUG) #if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 0) #define DUK_D(x) x #else #define DUK_D(x) do { } while (0) /* omit */ #endif #if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 1) #define DUK_DD(x) x #else #define DUK_DD(x) do { } while (0) /* omit */ #endif #if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) #define DUK_DDD(x) x #else #define DUK_DDD(x) do { } while (0) /* omit */ #endif /* * Exposed debug macros: debugging enabled */ #if defined(DUK_USE_VARIADIC_MACROS) /* Note: combining __FILE__, __LINE__, and __func__ into fmt would be * possible compile time, but waste some space with shared function names. */ #define DUK__DEBUG_LOG(lev,...) duk_debug_log((duk_int_t) (lev), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, DUK_FUNC_MACRO, __VA_ARGS__); #if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 0) #define DUK_DPRINT(...) DUK__DEBUG_LOG(DUK_LEVEL_DEBUG, __VA_ARGS__) #else #define DUK_DPRINT(...) #endif #if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 1) #define DUK_DDPRINT(...) DUK__DEBUG_LOG(DUK_LEVEL_DDEBUG, __VA_ARGS__) #else #define DUK_DDPRINT(...) #endif #if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) #define DUK_DDDPRINT(...) DUK__DEBUG_LOG(DUK_LEVEL_DDDEBUG, __VA_ARGS__) #else #define DUK_DDDPRINT(...) #endif #else /* DUK_USE_VARIADIC_MACROS */ #define DUK__DEBUG_STASH(lev) \ (void) DUK_SNPRINTF(duk_debug_file_stash, DUK_DEBUG_STASH_SIZE, "%s", (const char *) DUK_FILE_MACRO), \ (void) (duk_debug_file_stash[DUK_DEBUG_STASH_SIZE - 1] = (char) 0), \ (void) (duk_debug_line_stash = (duk_int_t) DUK_LINE_MACRO), \ (void) DUK_SNPRINTF(duk_debug_func_stash, DUK_DEBUG_STASH_SIZE, "%s", (const char *) DUK_FUNC_MACRO), \ (void) (duk_debug_func_stash[DUK_DEBUG_STASH_SIZE - 1] = (char) 0), \ (void) (duk_debug_level_stash = (lev)) /* Without variadic macros resort to comma expression trickery to handle debug * prints. This generates a lot of harmless warnings. These hacks are not * needed normally because DUK_D() and friends will hide the entire debug log * statement from the compiler. */ #if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 0) #define DUK_DPRINT DUK__DEBUG_STASH(DUK_LEVEL_DEBUG), (void) duk_debug_log /* args go here in parens */ #else #define DUK_DPRINT 0 && /* args go here as a comma expression in parens */ #endif #if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 1) #define DUK_DDPRINT DUK__DEBUG_STASH(DUK_LEVEL_DDEBUG), (void) duk_debug_log /* args go here in parens */ #else #define DUK_DDPRINT 0 && /* args */ #endif #if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) #define DUK_DDDPRINT DUK__DEBUG_STASH(DUK_LEVEL_DDDEBUG), (void) duk_debug_log /* args go here in parens */ #else #define DUK_DDDPRINT 0 && /* args */ #endif #endif /* DUK_USE_VARIADIC_MACROS */ #else /* DUK_USE_DEBUG */ /* * Exposed debug macros: debugging disabled */ #define DUK_D(x) do { } while (0) /* omit */ #define DUK_DD(x) do { } while (0) /* omit */ #define DUK_DDD(x) do { } while (0) /* omit */ #if defined(DUK_USE_VARIADIC_MACROS) #define DUK_DPRINT(...) #define DUK_DDPRINT(...) #define DUK_DDDPRINT(...) #else /* DUK_USE_VARIADIC_MACROS */ #define DUK_DPRINT 0 && /* args go here as a comma expression in parens */ #define DUK_DDPRINT 0 && /* args */ #define DUK_DDDPRINT 0 && /* args */ #endif /* DUK_USE_VARIADIC_MACROS */ #endif /* DUK_USE_DEBUG */ /* * Structs */ #if defined(DUK_USE_DEBUG) struct duk_fixedbuffer { duk_uint8_t *buffer; duk_size_t length; duk_size_t offset; duk_bool_t truncated; }; #endif /* * Prototypes */ #if defined(DUK_USE_DEBUG) DUK_INTERNAL_DECL duk_int_t duk_debug_vsnprintf(char *str, duk_size_t size, const char *format, va_list ap); #if 0 /*unused*/ DUK_INTERNAL_DECL duk_int_t duk_debug_snprintf(char *str, duk_size_t size, const char *format, ...); #endif DUK_INTERNAL_DECL void duk_debug_format_funcptr(char *buf, duk_size_t buf_size, duk_uint8_t *fptr, duk_size_t fptr_size); #if defined(DUK_USE_VARIADIC_MACROS) DUK_INTERNAL_DECL void duk_debug_log(duk_int_t level, const char *file, duk_int_t line, const char *func, const char *fmt, ...); #else /* DUK_USE_VARIADIC_MACROS */ /* parameter passing, not thread safe */ #define DUK_DEBUG_STASH_SIZE 128 #if !defined(DUK_SINGLE_FILE) DUK_INTERNAL_DECL char duk_debug_file_stash[DUK_DEBUG_STASH_SIZE]; DUK_INTERNAL_DECL duk_int_t duk_debug_line_stash; DUK_INTERNAL_DECL char duk_debug_func_stash[DUK_DEBUG_STASH_SIZE]; DUK_INTERNAL_DECL duk_int_t duk_debug_level_stash; #endif DUK_INTERNAL_DECL void duk_debug_log(const char *fmt, ...); #endif /* DUK_USE_VARIADIC_MACROS */ DUK_INTERNAL_DECL void duk_fb_put_bytes(duk_fixedbuffer *fb, const duk_uint8_t *buffer, duk_size_t length); DUK_INTERNAL_DECL void duk_fb_put_byte(duk_fixedbuffer *fb, duk_uint8_t x); DUK_INTERNAL_DECL void duk_fb_put_cstring(duk_fixedbuffer *fb, const char *x); DUK_INTERNAL_DECL void duk_fb_sprintf(duk_fixedbuffer *fb, const char *fmt, ...); DUK_INTERNAL_DECL void duk_fb_put_funcptr(duk_fixedbuffer *fb, duk_uint8_t *fptr, duk_size_t fptr_size); DUK_INTERNAL_DECL duk_bool_t duk_fb_is_full(duk_fixedbuffer *fb); #endif /* DUK_USE_DEBUG */ #endif /* DUK_DEBUG_H_INCLUDED */ /* #include duk_error.h */ #line 1 "duk_error.h" /* * Error handling macros, assertion macro, error codes. * * There are three types of 'errors': * * 1. Ordinary errors relative to a thread, cause a longjmp, catchable. * 2. Fatal errors relative to a heap, cause fatal handler to be called. * 3. Fatal errors without context, cause the default (not heap specific) * fatal handler to be called. * * Fatal errors without context are used by debug code such as assertions. * By providing a fatal error handler for a Duktape heap, user code can * avoid fatal errors without context in non-debug builds. */ #if !defined(DUK_ERROR_H_INCLUDED) #define DUK_ERROR_H_INCLUDED /* * Error codes: defined in duktape.h * * Error codes are used as a shorthand to throw exceptions from inside * the implementation. The appropriate Ecmascript object is constructed * based on the code. Ecmascript code throws objects directly. The error * codes are defined in the public API header because they are also used * by calling code. */ /* * Normal error * * Normal error is thrown with a longjmp() through the current setjmp() * catchpoint record in the duk_heap. The 'curr_thread' of the duk_heap * identifies the throwing thread. * * Error formatting is usually unnecessary. The error macros provide a * zero argument version (no formatting) and separate macros for small * argument counts. Variadic macros are not used to avoid portability * issues and avoid the need for stash-based workarounds when they're not * available. Vararg calls are avoided for non-formatted error calls * because vararg call sites are larger than normal, and there are a lot * of call sites with no formatting. * * Note that special formatting provided by debug macros is NOT available. * * The _RAW variants allow the caller to specify file and line. This makes * it easier to write checked calls which want to use the call site of the * checked function, not the error macro call inside the checked function. */ #if defined(DUK_USE_VERBOSE_ERRORS) /* Because there are quite many call sites, pack error code (require at most * 8-bit) into a single argument. */ #define DUK_ERROR(thr,err,msg) do { \ duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) DUK_LINE_MACRO; \ DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \ duk_err_handle_error((thr), DUK_FILE_MACRO, (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (msg)); \ } while (0) #define DUK_ERROR_RAW(thr,file,line,err,msg) do { \ duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) (line); \ DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \ duk_err_handle_error((thr), (file), (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (msg)); \ } while (0) #define DUK_ERROR_FMT1(thr,err,fmt,arg1) do { \ duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) DUK_LINE_MACRO; \ DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \ duk_err_handle_error_fmt((thr), DUK_FILE_MACRO, (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1)); \ } while (0) #define DUK_ERROR_RAW_FMT1(thr,file,line,err,fmt,arg1) do { \ duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) (line); \ DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \ duk_err_handle_error_fmt((thr), (file), (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1)); \ } while (0) #define DUK_ERROR_FMT2(thr,err,fmt,arg1,arg2) do { \ duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) DUK_LINE_MACRO; \ DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \ duk_err_handle_error_fmt((thr), DUK_FILE_MACRO, (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2)); \ } while (0) #define DUK_ERROR_RAW_FMT2(thr,file,line,err,fmt,arg1,arg2) do { \ duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) (line); \ DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \ duk_err_handle_error_fmt((thr), (file), (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2)); \ } while (0) #define DUK_ERROR_FMT3(thr,err,fmt,arg1,arg2,arg3) do { \ duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) DUK_LINE_MACRO; \ DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \ duk_err_handle_error_fmt((thr), DUK_FILE_MACRO, (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2), (arg3)); \ } while (0) #define DUK_ERROR_RAW_FMT3(thr,file,line,err,fmt,arg1,arg2,arg3) do { \ duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) (line); \ DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \ duk_err_handle_error_fmt((thr), (file), (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2), (arg3)); \ } while (0) #define DUK_ERROR_FMT4(thr,err,fmt,arg1,arg2,arg3,arg4) do { \ duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) DUK_LINE_MACRO; \ DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \ duk_err_handle_error_fmt((thr), DUK_FILE_MACRO, (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2), (arg3), (arg4)); \ } while (0) #define DUK_ERROR_RAW_FMT4(thr,file,line,err,fmt,arg1,arg2,arg3,arg4) do { \ duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) (line); \ DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \ duk_err_handle_error_fmt((thr), (file), (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2), (arg3), (arg4)); \ } while (0) #else /* DUK_USE_VERBOSE_ERRORS */ #define DUK_ERROR(thr,err,msg) duk_err_handle_error((thr), (err)) #define DUK_ERROR_RAW(thr,file,line,err,msg) duk_err_handle_error((thr), (err)) #define DUK_ERROR_FMT1(thr,err,fmt,arg1) DUK_ERROR((thr),(err),(fmt)) #define DUK_ERROR_RAW_FMT1(thr,file,line,err,fmt,arg1) DUK_ERROR_RAW((thr),(file),(line),(err),(fmt)) #define DUK_ERROR_FMT2(thr,err,fmt,arg1,arg2) DUK_ERROR((thr),(err),(fmt)) #define DUK_ERROR_RAW_FMT2(thr,file,line,err,fmt,arg1,arg2) DUK_ERROR_RAW((thr),(file),(line),(err),(fmt)) #define DUK_ERROR_FMT3(thr,err,fmt,arg1,arg2,arg3) DUK_ERROR((thr),(err),(fmt)) #define DUK_ERROR_RAW_FMT3(thr,file,line,err,fmt,arg1,arg2,arg3) DUK_ERROR_RAW((thr),(file),(line),(err),(fmt)) #define DUK_ERROR_FMT4(thr,err,fmt,arg1,arg2,arg3,arg4) DUK_ERROR((thr),(err),(fmt)) #define DUK_ERROR_RAW_FMT4(thr,file,line,err,fmt,arg1,arg2,arg3,arg4) DUK_ERROR_RAW((thr),(file),(line),(err),(fmt)) #endif /* DUK_USE_VERBOSE_ERRORS */ /* * Fatal error without context * * The macro is an expression to make it compatible with DUK_ASSERT_EXPR(). */ #define DUK_FATAL_WITHOUT_CONTEXT(msg) \ duk_default_fatal_handler(NULL, (msg)) /* * Error throwing helpers * * The goal is to provide verbose and configurable error messages. Call * sites should be clean in source code and compile to a small footprint. * Small footprint is also useful for performance because small cold paths * reduce code cache pressure. Adding macros here only makes sense if there * are enough call sites to get concrete benefits. * * DUK_ERROR_xxx() macros are generic and can be used anywhere. * * DUK_DCERROR_xxx() macros can only be used in Duktape/C functions where * the "return DUK_RET_xxx;" shorthand is available for low memory targets. * The DUK_DCERROR_xxx() macros always either throw or perform a * 'return DUK_RET_xxx' from the calling function. */ #if defined(DUK_USE_VERBOSE_ERRORS) /* Verbose errors with key/value summaries (non-paranoid) or without key/value * summaries (paranoid, for some security sensitive environments), the paranoid * vs. non-paranoid distinction affects only a few specific errors. */ #if defined(DUK_USE_PARANOID_ERRORS) #define DUK_ERROR_REQUIRE_TYPE_INDEX(thr,idx,expectname,lowmemstr) do { \ duk_err_require_type_index((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, (idx), (expectname)); \ } while (0) #else /* DUK_USE_PARANOID_ERRORS */ #define DUK_ERROR_REQUIRE_TYPE_INDEX(thr,idx,expectname,lowmemstr) do { \ duk_err_require_type_index((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, (idx), (expectname)); \ } while (0) #endif /* DUK_USE_PARANOID_ERRORS */ #define DUK_ERROR_INTERNAL(thr) do { \ duk_err_error_internal((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO); \ } while (0) #define DUK_DCERROR_INTERNAL(thr) do { \ DUK_ERROR_INTERNAL((thr)); \ return 0; \ } while (0) #define DUK_ERROR_ALLOC_FAILED(thr) do { \ duk_err_error_alloc_failed((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO); \ } while (0) #define DUK_ERROR_UNSUPPORTED(thr) do { \ DUK_ERROR((thr), DUK_ERR_ERROR, DUK_STR_UNSUPPORTED); \ } while (0) #define DUK_ERROR_ERROR(thr,msg) do { \ duk_err_error((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, (msg)); \ } while (0) #define DUK_ERROR_RANGE_INDEX(thr,idx) do { \ duk_err_range_index((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, (idx)); \ } while (0) #define DUK_ERROR_RANGE_PUSH_BEYOND(thr) do { \ duk_err_range_push_beyond((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO); \ } while (0) #define DUK_ERROR_RANGE_INVALID_ARGS(thr) do { \ DUK_ERROR_RANGE((thr), DUK_STR_INVALID_ARGS); \ } while (0) #define DUK_DCERROR_RANGE_INVALID_ARGS(thr) do { \ DUK_ERROR_RANGE_INVALID_ARGS((thr)); \ return 0; \ } while (0) #define DUK_ERROR_RANGE_INVALID_COUNT(thr) do { \ DUK_ERROR_RANGE((thr), DUK_STR_INVALID_COUNT); \ } while (0) #define DUK_DCERROR_RANGE_INVALID_COUNT(thr) do { \ DUK_ERROR_RANGE_INVALID_COUNT((thr)); \ return 0; \ } while (0) #define DUK_ERROR_RANGE_INVALID_LENGTH(thr) do { \ DUK_ERROR_RANGE((thr), DUK_STR_INVALID_LENGTH); \ } while (0) #define DUK_DCERROR_RANGE_INVALID_LENGTH(thr) do { \ DUK_ERROR_RANGE_INVALID_LENGTH((thr)); \ return 0; \ } while (0) #define DUK_ERROR_RANGE(thr,msg) do { \ duk_err_range((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, (msg)); \ } while (0) #define DUK_ERROR_EVAL(thr,msg) do { \ DUK_ERROR((thr), DUK_ERR_EVAL_ERROR, (msg)); \ } while (0) #define DUK_ERROR_REFERENCE(thr,msg) do { \ DUK_ERROR((thr), DUK_ERR_REFERENCE_ERROR, (msg)); \ } while (0) #define DUK_ERROR_SYNTAX(thr,msg) do { \ DUK_ERROR((thr), DUK_ERR_SYNTAX_ERROR, (msg)); \ } while (0) #define DUK_ERROR_TYPE_INVALID_ARGS(thr) do { \ duk_err_type_invalid_args((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO); \ } while (0) #define DUK_DCERROR_TYPE_INVALID_ARGS(thr) do { \ DUK_ERROR_TYPE_INVALID_ARGS((thr)); \ return 0; \ } while (0) #define DUK_ERROR_TYPE_INVALID_STATE(thr) do { \ duk_err_type_invalid_state((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO); \ } while (0) #define DUK_DCERROR_TYPE_INVALID_STATE(thr) do { \ DUK_ERROR_TYPE_INVALID_STATE((thr)); \ return 0; \ } while (0) #define DUK_ERROR_TYPE_INVALID_TRAP_RESULT(thr) do { \ duk_err_type_invalid_trap_result((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO); \ } while (0) #define DUK_DCERROR_TYPE_INVALID_TRAP_RESULT(thr) do { \ DUK_ERROR_TYPE((thr), DUK_STR_INVALID_TRAP_RESULT); \ } while (0) #define DUK_ERROR_TYPE(thr,msg) do { \ DUK_ERROR((thr), DUK_ERR_TYPE_ERROR, (msg)); \ } while (0) #define DUK_ERROR_URI(thr,msg) do { \ DUK_ERROR((thr), DUK_ERR_URI_ERROR, (msg)); \ } while (0) #else /* DUK_USE_VERBOSE_ERRORS */ /* Non-verbose errors for low memory targets: no file, line, or message. */ #define DUK_ERROR_REQUIRE_TYPE_INDEX(thr,idx,expectname,lowmemstr) do { \ duk_err_type((thr)); \ } while (0) #define DUK_ERROR_INTERNAL(thr) do { \ duk_err_error((thr)); \ } while (0) #define DUK_DCERROR_INTERNAL(thr) do { \ DUK_UNREF((thr)); \ return DUK_RET_ERROR; \ } while (0) #define DUK_ERROR_ALLOC_FAILED(thr) do { \ duk_err_error((thr)); \ } while (0) #define DUK_ERROR_UNSUPPORTED(thr) do { \ duk_err_error((thr)); \ } while (0) #define DUK_ERROR_ERROR(thr,msg) do { \ duk_err_error((thr)); \ } while (0) #define DUK_ERROR_RANGE_INDEX(thr,idx) do { \ duk_err_range((thr)); \ } while (0) #define DUK_ERROR_RANGE_PUSH_BEYOND(thr) do { \ duk_err_range((thr)); \ } while (0) #define DUK_ERROR_RANGE_INVALID_ARGS(thr) do { \ duk_err_range((thr)); \ } while (0) #define DUK_DCERROR_RANGE_INVALID_ARGS(thr) do { \ DUK_UNREF((thr)); \ return DUK_RET_RANGE_ERROR; \ } while (0) #define DUK_ERROR_RANGE_INVALID_COUNT(thr) do { \ duk_err_range((thr)); \ } while (0) #define DUK_DCERROR_RANGE_INVALID_COUNT(thr) do { \ DUK_UNREF((thr)); \ return DUK_RET_RANGE_ERROR; \ } while (0) #define DUK_ERROR_RANGE_INVALID_LENGTH(thr) do { \ duk_err_range((thr)); \ } while (0) #define DUK_DCERROR_RANGE_INVALID_LENGTH(thr) do { \ DUK_UNREF((thr)); \ return DUK_RET_RANGE_ERROR; \ } while (0) #define DUK_ERROR_RANGE(thr,msg) do { \ duk_err_range((thr)); \ } while (0) #define DUK_ERROR_EVAL(thr,msg) do { \ duk_err_eval((thr)); \ } while (0) #define DUK_ERROR_REFERENCE(thr,msg) do { \ duk_err_reference((thr)); \ } while (0) #define DUK_ERROR_SYNTAX(thr,msg) do { \ duk_err_syntax((thr)); \ } while (0) #define DUK_ERROR_TYPE_INVALID_ARGS(thr) do { \ duk_err_type((thr)); \ } while (0) #define DUK_DCERROR_TYPE_INVALID_ARGS(thr) do { \ DUK_UNREF((thr)); \ return DUK_RET_TYPE_ERROR; \ } while (0) #define DUK_ERROR_TYPE_INVALID_STATE(thr) do { \ duk_err_type((thr)); \ } while (0) #define DUK_DCERROR_TYPE_INVALID_STATE(thr) do { \ duk_err_type((thr)); \ } while (0) #define DUK_ERROR_TYPE_INVALID_TRAP_RESULT(thr) do { \ duk_err_type((thr)); \ } while (0) #define DUK_DCERROR_TYPE_INVALID_TRAP_RESULT(thr) do { \ DUK_UNREF((thr)); \ return DUK_RET_TYPE_ERROR; \ } while (0) #define DUK_ERROR_TYPE_INVALID_TRAP_RESULT(thr) do { \ duk_err_type((thr)); \ } while (0) #define DUK_ERROR_TYPE(thr,msg) do { \ duk_err_type((thr)); \ } while (0) #define DUK_ERROR_URI(thr,msg) do { \ duk_err_uri((thr)); \ } while (0) #endif /* DUK_USE_VERBOSE_ERRORS */ /* * Assert macro: failure causes a fatal error. * * NOTE: since the assert macro doesn't take a heap/context argument, there's * no way to look up a heap/context specific fatal error handler which may have * been given by the application. Instead, assertion failures always use the * internal default fatal error handler; it can be replaced via duk_config.h * and then applies to all Duktape heaps. */ #if defined(DUK_USE_ASSERTIONS) /* The message should be a compile time constant without formatting (less risk); * we don't care about assertion text size because they're not used in production * builds. */ #define DUK_ASSERT(x) do { \ if (!(x)) { \ DUK_FATAL_WITHOUT_CONTEXT("assertion failed: " #x \ " (" DUK_FILE_MACRO ":" DUK_MACRO_STRINGIFY(DUK_LINE_MACRO) ")"); \ } \ } while (0) /* Assertion compatible inside a comma expression, evaluates to void. */ #define DUK_ASSERT_EXPR(x) \ ((void) ((x) ? 0 : (DUK_FATAL_WITHOUT_CONTEXT("assertion failed: " #x \ " (" DUK_FILE_MACRO ":" DUK_MACRO_STRINGIFY(DUK_LINE_MACRO) ")"), 0))) #else /* DUK_USE_ASSERTIONS */ #define DUK_ASSERT(x) do { /* assertion omitted */ } while (0) #define DUK_ASSERT_EXPR(x) ((void) 0) #endif /* DUK_USE_ASSERTIONS */ /* this variant is used when an assert would generate a compile warning by * being always true (e.g. >= 0 comparison for an unsigned value */ #define DUK_ASSERT_DISABLE(x) do { /* assertion disabled */ } while (0) /* * Assertion helpers */ #if defined(DUK_USE_ASSERTIONS) && defined(DUK_USE_REFERENCE_COUNTING) #define DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(h) do { \ DUK_ASSERT((h) == NULL || DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) (h)) > 0); \ } while (0) #define DUK_ASSERT_REFCOUNT_NONZERO_TVAL(tv) do { \ if ((tv) != NULL && DUK_TVAL_IS_HEAP_ALLOCATED((tv))) { \ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(DUK_TVAL_GET_HEAPHDR((tv))) > 0); \ } \ } while (0) #else #define DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(h) /* no refcount check */ #define DUK_ASSERT_REFCOUNT_NONZERO_TVAL(tv) /* no refcount check */ #endif #define DUK_ASSERT_TOP(ctx,n) DUK_ASSERT((duk_idx_t) duk_get_top((ctx)) == (duk_idx_t) (n)) #if defined(DUK_USE_ASSERTIONS) && defined(DUK_USE_PACKED_TVAL) #define DUK_ASSERT_DOUBLE_IS_NORMALIZED(dval) do { \ duk_double_union duk__assert_tmp_du; \ duk__assert_tmp_du.d = (dval); \ DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&duk__assert_tmp_du)); \ } while (0) #else #define DUK_ASSERT_DOUBLE_IS_NORMALIZED(dval) /* nop */ #endif #define DUK_ASSERT_VS_SPACE(thr) \ DUK_ASSERT(thr->valstack_top < thr->valstack_end) /* * Helper to initialize a memory area (e.g. struct) with garbage when * assertions enabled. */ #if defined(DUK_USE_ASSERTIONS) #define DUK_ASSERT_SET_GARBAGE(ptr,size) do { \ DUK_MEMSET((void *) (ptr), 0x5a, size); \ } while (0) #else #define DUK_ASSERT_SET_GARBAGE(ptr,size) do {} while (0) #endif /* * Helper for valstack space * * Caller of DUK_ASSERT_VALSTACK_SPACE() estimates the number of free stack entries * required for its own use, and any child calls which are not (a) Duktape API calls * or (b) Duktape calls which involve extending the valstack (e.g. getter call). */ #define DUK_VALSTACK_ASSERT_EXTRA 5 /* this is added to checks to allow for Duktape * API calls in addition to function's own use */ #if defined(DUK_USE_ASSERTIONS) #define DUK_ASSERT_VALSTACK_SPACE(thr,n) do { \ DUK_ASSERT((thr) != NULL); \ DUK_ASSERT((thr)->valstack_end - (thr)->valstack_top >= (n) + DUK_VALSTACK_ASSERT_EXTRA); \ } while (0) #else #define DUK_ASSERT_VALSTACK_SPACE(thr,n) /* no valstack space check */ #endif /* * Prototypes */ #if defined(DUK_USE_VERBOSE_ERRORS) DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_handle_error(duk_hthread *thr, const char *filename, duk_uint_t line_and_code, const char *msg)); DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_handle_error_fmt(duk_hthread *thr, const char *filename, duk_uint_t line_and_code, const char *fmt, ...)); #else /* DUK_USE_VERBOSE_ERRORS */ DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_handle_error(duk_hthread *thr, duk_errcode_t code)); #endif /* DUK_USE_VERBOSE_ERRORS */ #if defined(DUK_USE_VERBOSE_ERRORS) DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_create_and_throw(duk_hthread *thr, duk_errcode_t code, const char *msg, const char *filename, duk_int_t line)); #else DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_create_and_throw(duk_hthread *thr, duk_errcode_t code)); #endif DUK_NORETURN(DUK_INTERNAL_DECL void duk_error_throw_from_negative_rc(duk_hthread *thr, duk_ret_t rc)); #define DUK_AUGMENT_FLAG_NOBLAME_FILELINE (1U << 0) /* if set, don't blame C file/line for .fileName and .lineNumber */ #define DUK_AUGMENT_FLAG_SKIP_ONE (1U << 1) /* if set, skip topmost activation in traceback construction */ #if defined(DUK_USE_AUGMENT_ERROR_CREATE) DUK_INTERNAL_DECL void duk_err_augment_error_create(duk_hthread *thr, duk_hthread *thr_callstack, const char *filename, duk_int_t line, duk_small_uint_t flags); #endif #if defined(DUK_USE_AUGMENT_ERROR_THROW) DUK_INTERNAL_DECL void duk_err_augment_error_throw(duk_hthread *thr); #endif #if defined(DUK_USE_VERBOSE_ERRORS) #if defined(DUK_USE_PARANOID_ERRORS) DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_require_type_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t idx, const char *expect_name)); #else DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_require_type_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t idx, const char *expect_name)); #endif DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_error_internal(duk_hthread *thr, const char *filename, duk_int_t linenumber)); DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_error_alloc_failed(duk_hthread *thr, const char *filename, duk_int_t linenumber)); DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_error(duk_hthread *thr, const char *filename, duk_int_t linenumber, const char *message)); DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_range_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t idx)); DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_range_push_beyond(duk_hthread *thr, const char *filename, duk_int_t linenumber)); DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_range(duk_hthread *thr, const char *filename, duk_int_t linenumber, const char *message)); DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_type_invalid_args(duk_hthread *thr, const char *filename, duk_int_t linenumber)); DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_type_invalid_state(duk_hthread *thr, const char *filename, duk_int_t linenumber)); DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_type_invalid_trap_result(duk_hthread *thr, const char *filename, duk_int_t linenumber)); #else /* DUK_VERBOSE_ERRORS */ DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_error(duk_hthread *thr)); DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_range(duk_hthread *thr)); DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_eval(duk_hthread *thr)); DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_reference(duk_hthread *thr)); DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_syntax(duk_hthread *thr)); DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_type(duk_hthread *thr)); DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_uri(duk_hthread *thr)); #endif /* DUK_VERBOSE_ERRORS */ DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_longjmp(duk_hthread *thr)); DUK_NORETURN(DUK_INTERNAL_DECL void duk_default_fatal_handler(void *udata, const char *msg)); DUK_INTERNAL_DECL void duk_err_setup_ljstate1(duk_hthread *thr, duk_small_uint_t lj_type, duk_tval *tv_val); #if defined(DUK_USE_DEBUGGER_SUPPORT) DUK_INTERNAL_DECL void duk_err_check_debugger_integration(duk_hthread *thr); #endif DUK_INTERNAL_DECL duk_hobject *duk_error_prototype_from_code(duk_hthread *thr, duk_errcode_t err_code); #endif /* DUK_ERROR_H_INCLUDED */ /* #include duk_unicode.h */ #line 1 "duk_unicode.h" /* * Unicode helpers */ #if !defined(DUK_UNICODE_H_INCLUDED) #define DUK_UNICODE_H_INCLUDED /* * UTF-8 / XUTF-8 / CESU-8 constants */ #define DUK_UNICODE_MAX_XUTF8_LENGTH 7 /* up to 36 bit codepoints */ #define DUK_UNICODE_MAX_XUTF8_BMP_LENGTH 3 /* all codepoints up to U+FFFF */ #define DUK_UNICODE_MAX_CESU8_LENGTH 6 /* all codepoints up to U+10FFFF */ #define DUK_UNICODE_MAX_CESU8_BMP_LENGTH 3 /* all codepoints up to U+FFFF */ /* * Useful Unicode codepoints * * Integer constants must be signed to avoid unexpected coercions * in comparisons. */ #define DUK_UNICODE_CP_ZWNJ 0x200cL /* zero-width non-joiner */ #define DUK_UNICODE_CP_ZWJ 0x200dL /* zero-width joiner */ #define DUK_UNICODE_CP_REPLACEMENT_CHARACTER 0xfffdL /* http://en.wikipedia.org/wiki/Replacement_character#Replacement_character */ /* * ASCII character constants * * C character literals like 'x' have a platform specific value and do * not match ASCII (UTF-8) values on e.g. EBCDIC platforms. So, use * these (admittedly awkward) constants instead. These constants must * also have signed values to avoid unexpected coercions in comparisons. * * http://en.wikipedia.org/wiki/ASCII */ #define DUK_ASC_NUL 0x00 #define DUK_ASC_SOH 0x01 #define DUK_ASC_STX 0x02 #define DUK_ASC_ETX 0x03 #define DUK_ASC_EOT 0x04 #define DUK_ASC_ENQ 0x05 #define DUK_ASC_ACK 0x06 #define DUK_ASC_BEL 0x07 #define DUK_ASC_BS 0x08 #define DUK_ASC_HT 0x09 #define DUK_ASC_LF 0x0a #define DUK_ASC_VT 0x0b #define DUK_ASC_FF 0x0c #define DUK_ASC_CR 0x0d #define DUK_ASC_SO 0x0e #define DUK_ASC_SI 0x0f #define DUK_ASC_DLE 0x10 #define DUK_ASC_DC1 0x11 #define DUK_ASC_DC2 0x12 #define DUK_ASC_DC3 0x13 #define DUK_ASC_DC4 0x14 #define DUK_ASC_NAK 0x15 #define DUK_ASC_SYN 0x16 #define DUK_ASC_ETB 0x17 #define DUK_ASC_CAN 0x18 #define DUK_ASC_EM 0x19 #define DUK_ASC_SUB 0x1a #define DUK_ASC_ESC 0x1b #define DUK_ASC_FS 0x1c #define DUK_ASC_GS 0x1d #define DUK_ASC_RS 0x1e #define DUK_ASC_US 0x1f #define DUK_ASC_SPACE 0x20 #define DUK_ASC_EXCLAMATION 0x21 #define DUK_ASC_DOUBLEQUOTE 0x22 #define DUK_ASC_HASH 0x23 #define DUK_ASC_DOLLAR 0x24 #define DUK_ASC_PERCENT 0x25 #define DUK_ASC_AMP 0x26 #define DUK_ASC_SINGLEQUOTE 0x27 #define DUK_ASC_LPAREN 0x28 #define DUK_ASC_RPAREN 0x29 #define DUK_ASC_STAR 0x2a #define DUK_ASC_PLUS 0x2b #define DUK_ASC_COMMA 0x2c #define DUK_ASC_MINUS 0x2d #define DUK_ASC_PERIOD 0x2e #define DUK_ASC_SLASH 0x2f #define DUK_ASC_0 0x30 #define DUK_ASC_1 0x31 #define DUK_ASC_2 0x32 #define DUK_ASC_3 0x33 #define DUK_ASC_4 0x34 #define DUK_ASC_5 0x35 #define DUK_ASC_6 0x36 #define DUK_ASC_7 0x37 #define DUK_ASC_8 0x38 #define DUK_ASC_9 0x39 #define DUK_ASC_COLON 0x3a #define DUK_ASC_SEMICOLON 0x3b #define DUK_ASC_LANGLE 0x3c #define DUK_ASC_EQUALS 0x3d #define DUK_ASC_RANGLE 0x3e #define DUK_ASC_QUESTION 0x3f #define DUK_ASC_ATSIGN 0x40 #define DUK_ASC_UC_A 0x41 #define DUK_ASC_UC_B 0x42 #define DUK_ASC_UC_C 0x43 #define DUK_ASC_UC_D 0x44 #define DUK_ASC_UC_E 0x45 #define DUK_ASC_UC_F 0x46 #define DUK_ASC_UC_G 0x47 #define DUK_ASC_UC_H 0x48 #define DUK_ASC_UC_I 0x49 #define DUK_ASC_UC_J 0x4a #define DUK_ASC_UC_K 0x4b #define DUK_ASC_UC_L 0x4c #define DUK_ASC_UC_M 0x4d #define DUK_ASC_UC_N 0x4e #define DUK_ASC_UC_O 0x4f #define DUK_ASC_UC_P 0x50 #define DUK_ASC_UC_Q 0x51 #define DUK_ASC_UC_R 0x52 #define DUK_ASC_UC_S 0x53 #define DUK_ASC_UC_T 0x54 #define DUK_ASC_UC_U 0x55 #define DUK_ASC_UC_V 0x56 #define DUK_ASC_UC_W 0x57 #define DUK_ASC_UC_X 0x58 #define DUK_ASC_UC_Y 0x59 #define DUK_ASC_UC_Z 0x5a #define DUK_ASC_LBRACKET 0x5b #define DUK_ASC_BACKSLASH 0x5c #define DUK_ASC_RBRACKET 0x5d #define DUK_ASC_CARET 0x5e #define DUK_ASC_UNDERSCORE 0x5f #define DUK_ASC_GRAVE 0x60 #define DUK_ASC_LC_A 0x61 #define DUK_ASC_LC_B 0x62 #define DUK_ASC_LC_C 0x63 #define DUK_ASC_LC_D 0x64 #define DUK_ASC_LC_E 0x65 #define DUK_ASC_LC_F 0x66 #define DUK_ASC_LC_G 0x67 #define DUK_ASC_LC_H 0x68 #define DUK_ASC_LC_I 0x69 #define DUK_ASC_LC_J 0x6a #define DUK_ASC_LC_K 0x6b #define DUK_ASC_LC_L 0x6c #define DUK_ASC_LC_M 0x6d #define DUK_ASC_LC_N 0x6e #define DUK_ASC_LC_O 0x6f #define DUK_ASC_LC_P 0x70 #define DUK_ASC_LC_Q 0x71 #define DUK_ASC_LC_R 0x72 #define DUK_ASC_LC_S 0x73 #define DUK_ASC_LC_T 0x74 #define DUK_ASC_LC_U 0x75 #define DUK_ASC_LC_V 0x76 #define DUK_ASC_LC_W 0x77 #define DUK_ASC_LC_X 0x78 #define DUK_ASC_LC_Y 0x79 #define DUK_ASC_LC_Z 0x7a #define DUK_ASC_LCURLY 0x7b #define DUK_ASC_PIPE 0x7c #define DUK_ASC_RCURLY 0x7d #define DUK_ASC_TILDE 0x7e #define DUK_ASC_DEL 0x7f /* * Miscellaneous */ /* Uppercase A is 0x41, lowercase a is 0x61; OR 0x20 to convert uppercase * to lowercase. */ #define DUK_LOWERCASE_CHAR_ASCII(x) ((x) | 0x20) /* * Unicode tables */ #if defined(DUK_USE_SOURCE_NONBMP) /* * Automatically generated by extract_chars.py, do not edit! */ extern const duk_uint8_t duk_unicode_ids_noa[1036]; #else /* * Automatically generated by extract_chars.py, do not edit! */ extern const duk_uint8_t duk_unicode_ids_noabmp[625]; #endif #if defined(DUK_USE_SOURCE_NONBMP) /* * Automatically generated by extract_chars.py, do not edit! */ extern const duk_uint8_t duk_unicode_ids_m_let_noa[42]; #else /* * Automatically generated by extract_chars.py, do not edit! */ extern const duk_uint8_t duk_unicode_ids_m_let_noabmp[24]; #endif #if defined(DUK_USE_SOURCE_NONBMP) /* * Automatically generated by extract_chars.py, do not edit! */ extern const duk_uint8_t duk_unicode_idp_m_ids_noa[530]; #else /* * Automatically generated by extract_chars.py, do not edit! */ extern const duk_uint8_t duk_unicode_idp_m_ids_noabmp[357]; #endif /* * Automatically generated by extract_caseconv.py, do not edit! */ extern const duk_uint8_t duk_unicode_caseconv_uc[1386]; extern const duk_uint8_t duk_unicode_caseconv_lc[680]; #if defined(DUK_USE_REGEXP_CANON_WORKAROUND) /* * Automatically generated by extract_caseconv.py, do not edit! */ extern const duk_uint16_t duk_unicode_re_canon_lookup[65536]; #endif #if defined(DUK_USE_REGEXP_CANON_BITMAP) /* * Automatically generated by extract_caseconv.py, do not edit! */ #define DUK_CANON_BITMAP_BLKSIZE 32 #define DUK_CANON_BITMAP_BLKSHIFT 5 #define DUK_CANON_BITMAP_BLKMASK 31 extern const duk_uint8_t duk_unicode_re_canon_bitmap[256]; #endif /* * Extern */ /* duk_unicode_support.c */ #if !defined(DUK_SINGLE_FILE) DUK_INTERNAL_DECL const duk_uint8_t duk_unicode_xutf8_markers[7]; DUK_INTERNAL_DECL const duk_uint16_t duk_unicode_re_ranges_digit[2]; DUK_INTERNAL_DECL const duk_uint16_t duk_unicode_re_ranges_white[22]; DUK_INTERNAL_DECL const duk_uint16_t duk_unicode_re_ranges_wordchar[8]; DUK_INTERNAL_DECL const duk_uint16_t duk_unicode_re_ranges_not_digit[4]; DUK_INTERNAL_DECL const duk_uint16_t duk_unicode_re_ranges_not_white[24]; DUK_INTERNAL_DECL const duk_uint16_t duk_unicode_re_ranges_not_wordchar[10]; DUK_INTERNAL_DECL const duk_int8_t duk_is_idchar_tab[128]; #endif /* !DUK_SINGLE_FILE */ /* * Prototypes */ DUK_INTERNAL_DECL duk_small_int_t duk_unicode_get_xutf8_length(duk_ucodepoint_t cp); #if defined(DUK_USE_ASSERTIONS) DUK_INTERNAL_DECL duk_small_int_t duk_unicode_get_cesu8_length(duk_ucodepoint_t cp); #endif DUK_INTERNAL_DECL duk_small_int_t duk_unicode_encode_xutf8(duk_ucodepoint_t cp, duk_uint8_t *out); DUK_INTERNAL_DECL duk_small_int_t duk_unicode_encode_cesu8(duk_ucodepoint_t cp, duk_uint8_t *out); DUK_INTERNAL_DECL duk_small_int_t duk_unicode_decode_xutf8(duk_hthread *thr, const duk_uint8_t **ptr, const duk_uint8_t *ptr_start, const duk_uint8_t *ptr_end, duk_ucodepoint_t *out_cp); DUK_INTERNAL_DECL duk_ucodepoint_t duk_unicode_decode_xutf8_checked(duk_hthread *thr, const duk_uint8_t **ptr, const duk_uint8_t *ptr_start, const duk_uint8_t *ptr_end); DUK_INTERNAL_DECL duk_size_t duk_unicode_unvalidated_utf8_length(const duk_uint8_t *data, duk_size_t blen); DUK_INTERNAL_DECL duk_small_int_t duk_unicode_is_whitespace(duk_codepoint_t cp); DUK_INTERNAL_DECL duk_small_int_t duk_unicode_is_line_terminator(duk_codepoint_t cp); DUK_INTERNAL_DECL duk_small_int_t duk_unicode_is_identifier_start(duk_codepoint_t cp); DUK_INTERNAL_DECL duk_small_int_t duk_unicode_is_identifier_part(duk_codepoint_t cp); DUK_INTERNAL_DECL duk_small_int_t duk_unicode_is_letter(duk_codepoint_t cp); DUK_INTERNAL_DECL void duk_unicode_case_convert_string(duk_hthread *thr, duk_bool_t uppercase); #if defined(DUK_USE_REGEXP_SUPPORT) DUK_INTERNAL_DECL duk_codepoint_t duk_unicode_re_canonicalize_char(duk_hthread *thr, duk_codepoint_t cp); DUK_INTERNAL_DECL duk_small_int_t duk_unicode_re_is_wordchar(duk_codepoint_t cp); #endif #endif /* DUK_UNICODE_H_INCLUDED */ /* #include duk_json.h */ #line 1 "duk_json.h" /* * Defines for JSON, especially duk_bi_json.c. */ #if !defined(DUK_JSON_H_INCLUDED) #define DUK_JSON_H_INCLUDED /* Encoding/decoding flags */ #define DUK_JSON_FLAG_ASCII_ONLY (1U << 0) /* escape any non-ASCII characters */ #define DUK_JSON_FLAG_AVOID_KEY_QUOTES (1U << 1) /* avoid key quotes when key is an ASCII Identifier */ #define DUK_JSON_FLAG_EXT_CUSTOM (1U << 2) /* extended types: custom encoding */ #define DUK_JSON_FLAG_EXT_COMPATIBLE (1U << 3) /* extended types: compatible encoding */ /* How much stack to require on entry to object/array encode */ #define DUK_JSON_ENC_REQSTACK 32 /* How much stack to require on entry to object/array decode */ #define DUK_JSON_DEC_REQSTACK 32 /* How large a loop detection stack to use */ #define DUK_JSON_ENC_LOOPARRAY 64 /* Encoding state. Heap object references are all borrowed. */ typedef struct { duk_hthread *thr; duk_bufwriter_ctx bw; /* output bufwriter */ duk_hobject *h_replacer; /* replacer function */ duk_hstring *h_gap; /* gap (if empty string, NULL) */ duk_idx_t idx_proplist; /* explicit PropertyList */ duk_idx_t idx_loop; /* valstack index of loop detection object */ duk_small_uint_t flags; duk_small_uint_t flag_ascii_only; duk_small_uint_t flag_avoid_key_quotes; #if defined(DUK_USE_JX) || defined(DUK_USE_JC) duk_small_uint_t flag_ext_custom; duk_small_uint_t flag_ext_compatible; duk_small_uint_t flag_ext_custom_or_compatible; #endif duk_uint_t recursion_depth; duk_uint_t recursion_limit; duk_uint_t mask_for_undefined; /* type bit mask: types which certainly produce 'undefined' */ #if defined(DUK_USE_JX) || defined(DUK_USE_JC) duk_small_uint_t stridx_custom_undefined; duk_small_uint_t stridx_custom_nan; duk_small_uint_t stridx_custom_neginf; duk_small_uint_t stridx_custom_posinf; duk_small_uint_t stridx_custom_function; #endif duk_hobject *visiting[DUK_JSON_ENC_LOOPARRAY]; /* indexed by recursion_depth */ } duk_json_enc_ctx; typedef struct { duk_hthread *thr; const duk_uint8_t *p; const duk_uint8_t *p_start; const duk_uint8_t *p_end; duk_idx_t idx_reviver; duk_small_uint_t flags; #if defined(DUK_USE_JX) || defined(DUK_USE_JC) duk_small_uint_t flag_ext_custom; duk_small_uint_t flag_ext_compatible; duk_small_uint_t flag_ext_custom_or_compatible; #endif duk_int_t recursion_depth; duk_int_t recursion_limit; } duk_json_dec_ctx; #endif /* DUK_JSON_H_INCLUDED */ /* #include duk_js.h */ #line 1 "duk_js.h" /* * Ecmascript execution, support primitives. */ #if !defined(DUK_JS_H_INCLUDED) #define DUK_JS_H_INCLUDED /* Flags for call handling. Lowest flags must match bytecode DUK_BC_CALL_FLAG_xxx 1:1. */ #define DUK_CALL_FLAG_TAILCALL (1U << 0) /* setup for a tail call */ #define DUK_CALL_FLAG_CONSTRUCT (1U << 1) /* constructor call (i.e. called as 'new Foo()') */ #define DUK_CALL_FLAG_CALLED_AS_EVAL (1U << 2) /* call was made using the identifier 'eval' */ #define DUK_CALL_FLAG_ALLOW_ECMATOECMA (1U << 3) /* ecma-to-ecma call with executor reuse is possible */ #define DUK_CALL_FLAG_DIRECT_EVAL (1U << 4) /* call is a direct eval call */ #define DUK_CALL_FLAG_CONSTRUCT_PROXY (1U << 5) /* handled via 'construct' proxy trap, check return value invariant(s) */ #define DUK_CALL_FLAG_DEFAULT_INSTANCE_UPDATED (1U << 6) /* prototype of 'default instance' updated, temporary flag in call handling */ /* Flags for duk_js_equals_helper(). */ #define DUK_EQUALS_FLAG_SAMEVALUE (1U << 0) /* use SameValue instead of non-strict equality */ #define DUK_EQUALS_FLAG_STRICT (1U << 1) /* use strict equality instead of non-strict equality */ /* Flags for duk_js_compare_helper(). */ #define DUK_COMPARE_FLAG_NEGATE (1U << 0) /* negate result */ #define DUK_COMPARE_FLAG_EVAL_LEFT_FIRST (1U << 1) /* eval left argument first */ /* conversions, coercions, comparison, etc */ DUK_INTERNAL_DECL duk_bool_t duk_js_toboolean(duk_tval *tv); DUK_INTERNAL_DECL duk_double_t duk_js_tonumber(duk_hthread *thr, duk_tval *tv); DUK_INTERNAL_DECL duk_double_t duk_js_tointeger_number(duk_double_t x); DUK_INTERNAL_DECL duk_double_t duk_js_tointeger(duk_hthread *thr, duk_tval *tv); DUK_INTERNAL_DECL duk_uint32_t duk_js_touint32(duk_hthread *thr, duk_tval *tv); DUK_INTERNAL_DECL duk_int32_t duk_js_toint32(duk_hthread *thr, duk_tval *tv); DUK_INTERNAL_DECL duk_uint16_t duk_js_touint16(duk_hthread *thr, duk_tval *tv); DUK_INTERNAL_DECL duk_uarridx_t duk_js_to_arrayindex_string(const duk_uint8_t *str, duk_uint32_t blen); #if !defined(DUK_USE_HSTRING_ARRIDX) DUK_INTERNAL_DECL duk_uarridx_t duk_js_to_arrayindex_hstring_fast_known(duk_hstring *h); DUK_INTERNAL_DECL duk_uarridx_t duk_js_to_arrayindex_hstring_fast(duk_hstring *h); #endif DUK_INTERNAL_DECL duk_bool_t duk_js_equals_helper(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_small_uint_t flags); DUK_INTERNAL_DECL duk_small_int_t duk_js_data_compare(const duk_uint8_t *buf1, const duk_uint8_t *buf2, duk_size_t len1, duk_size_t len2); DUK_INTERNAL_DECL duk_small_int_t duk_js_string_compare(duk_hstring *h1, duk_hstring *h2); #if 0 /* unused */ DUK_INTERNAL_DECL duk_small_int_t duk_js_buffer_compare(duk_heap *heap, duk_hbuffer *h1, duk_hbuffer *h2); #endif DUK_INTERNAL_DECL duk_bool_t duk_js_compare_helper(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_small_uint_t flags); DUK_INTERNAL_DECL duk_bool_t duk_js_instanceof(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y); DUK_INTERNAL_DECL duk_bool_t duk_js_in(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y); DUK_INTERNAL_DECL duk_small_uint_t duk_js_typeof_stridx(duk_tval *tv_x); /* arithmetic */ DUK_INTERNAL_DECL double duk_js_arith_pow(double x, double y); DUK_INTERNAL_DECL double duk_js_arith_mod(double x, double y); #define duk_js_equals(thr,tv_x,tv_y) \ duk_js_equals_helper((thr), (tv_x), (tv_y), 0) #define duk_js_strict_equals(tv_x,tv_y) \ duk_js_equals_helper(NULL, (tv_x), (tv_y), DUK_EQUALS_FLAG_STRICT) #define duk_js_samevalue(tv_x,tv_y) \ duk_js_equals_helper(NULL, (tv_x), (tv_y), DUK_EQUALS_FLAG_SAMEVALUE) /* E5 Sections 11.8.1, 11.8.5; x < y */ #define duk_js_lessthan(thr,tv_x,tv_y) \ duk_js_compare_helper((thr), (tv_x), (tv_Y), DUK_COMPARE_FLAG_EVAL_LEFT_FIRST) /* E5 Sections 11.8.2, 11.8.5; x > y --> y < x */ #define duk_js_greaterthan(thr,tv_x,tv_y) \ duk_js_compare_helper((thr), (tv_y), (tv_x), 0) /* E5 Sections 11.8.3, 11.8.5; x <= y --> not (x > y) --> not (y < x) */ #define duk_js_lessthanorequal(thr,tv_x,tv_y) \ duk_js_compare_helper((thr), (tv_y), (tv_x), DUK_COMPARE_FLAG_NEGATE) /* E5 Sections 11.8.4, 11.8.5; x >= y --> not (x < y) */ #define duk_js_greaterthanorequal(thr,tv_x,tv_y) \ duk_js_compare_helper((thr), (tv_x), (tv_y), DUK_COMPARE_FLAG_EVAL_LEFT_FIRST | DUK_COMPARE_FLAG_NEGATE) /* identifiers and environment handling */ #if 0 /*unused*/ DUK_INTERNAL duk_bool_t duk_js_hasvar_envrec(duk_hthread *thr, duk_hobject *env, duk_hstring *name); #endif DUK_INTERNAL_DECL duk_bool_t duk_js_getvar_envrec(duk_hthread *thr, duk_hobject *env, duk_hstring *name, duk_bool_t throw_flag); DUK_INTERNAL_DECL duk_bool_t duk_js_getvar_activation(duk_hthread *thr, duk_activation *act, duk_hstring *name, duk_bool_t throw_flag); DUK_INTERNAL_DECL void duk_js_putvar_envrec(duk_hthread *thr, duk_hobject *env, duk_hstring *name, duk_tval *val, duk_bool_t strict); DUK_INTERNAL_DECL void duk_js_putvar_activation(duk_hthread *thr, duk_activation *act, duk_hstring *name, duk_tval *val, duk_bool_t strict); #if 0 /*unused*/ DUK_INTERNAL_DECL duk_bool_t duk_js_delvar_envrec(duk_hthread *thr, duk_hobject *env, duk_hstring *name); #endif DUK_INTERNAL_DECL duk_bool_t duk_js_delvar_activation(duk_hthread *thr, duk_activation *act, duk_hstring *name); DUK_INTERNAL_DECL duk_bool_t duk_js_declvar_activation(duk_hthread *thr, duk_activation *act, duk_hstring *name, duk_tval *val, duk_small_uint_t prop_flags, duk_bool_t is_func_decl); DUK_INTERNAL_DECL void duk_js_init_activation_environment_records_delayed(duk_hthread *thr, duk_activation *act); DUK_INTERNAL_DECL void duk_js_close_environment_record(duk_hthread *thr, duk_hobject *env); DUK_INTERNAL_DECL duk_hobject *duk_create_activation_environment_record(duk_hthread *thr, duk_hobject *func, duk_size_t bottom_byteoff); DUK_INTERNAL_DECL void duk_js_push_closure(duk_hthread *thr, duk_hcompfunc *fun_temp, duk_hobject *outer_var_env, duk_hobject *outer_lex_env, duk_bool_t add_auto_proto); /* call handling */ DUK_INTERNAL_DECL duk_int_t duk_handle_call_unprotected(duk_hthread *thr, duk_idx_t idx_func, duk_small_uint_t call_flags); DUK_INTERNAL_DECL duk_int_t duk_handle_call_unprotected_nargs(duk_hthread *thr, duk_idx_t nargs, duk_small_uint_t call_flags); DUK_INTERNAL_DECL duk_int_t duk_handle_safe_call(duk_hthread *thr, duk_safe_call_function func, void *udata, duk_idx_t num_stack_args, duk_idx_t num_stack_res); DUK_INTERNAL_DECL void duk_call_construct_postprocess(duk_hthread *thr, duk_small_uint_t proxy_invariant); #if defined(DUK_USE_VERBOSE_ERRORS) DUK_INTERNAL_DECL void duk_call_setup_propcall_error(duk_hthread *thr, duk_tval *tv_targ, duk_tval *tv_base, duk_tval *tv_key); #endif /* bytecode execution */ DUK_INTERNAL_DECL void duk_js_execute_bytecode(duk_hthread *exec_thr); #endif /* DUK_JS_H_INCLUDED */ /* #include duk_numconv.h */ #line 1 "duk_numconv.h" /* * Number-to-string conversion. The semantics of these is very tightly * bound with the Ecmascript semantics required for call sites. */ #if !defined(DUK_NUMCONV_H_INCLUDED) #define DUK_NUMCONV_H_INCLUDED /* Output a specified number of digits instead of using the shortest * form. Used for toPrecision() and toFixed(). */ #define DUK_N2S_FLAG_FIXED_FORMAT (1U << 0) /* Force exponential format. Used for toExponential(). */ #define DUK_N2S_FLAG_FORCE_EXP (1U << 1) /* If number would need zero padding (for whole number part), use * exponential format instead. E.g. if input number is 12300, 3 * digits are generated ("123"), output "1.23e+4" instead of "12300". * Used for toPrecision(). */ #define DUK_N2S_FLAG_NO_ZERO_PAD (1U << 2) /* Digit count indicates number of fractions (i.e. an absolute * digit index instead of a relative one). Used together with * DUK_N2S_FLAG_FIXED_FORMAT for toFixed(). */ #define DUK_N2S_FLAG_FRACTION_DIGITS (1U << 3) /* * String-to-number conversion */ /* Maximum exponent value when parsing numbers. This is not strictly * compliant as there should be no upper limit, but as we parse the * exponent without a bigint, impose some limit. */ #define DUK_S2N_MAX_EXPONENT 1000000000 /* Trim white space (= allow leading and trailing whitespace) */ #define DUK_S2N_FLAG_TRIM_WHITE (1U << 0) /* Allow exponent */ #define DUK_S2N_FLAG_ALLOW_EXP (1U << 1) /* Allow trailing garbage (e.g. treat "123foo" as "123) */ #define DUK_S2N_FLAG_ALLOW_GARBAGE (1U << 2) /* Allow leading plus sign */ #define DUK_S2N_FLAG_ALLOW_PLUS (1U << 3) /* Allow leading minus sign */ #define DUK_S2N_FLAG_ALLOW_MINUS (1U << 4) /* Allow 'Infinity' */ #define DUK_S2N_FLAG_ALLOW_INF (1U << 5) /* Allow fraction part */ #define DUK_S2N_FLAG_ALLOW_FRAC (1U << 6) /* Allow naked fraction (e.g. ".123") */ #define DUK_S2N_FLAG_ALLOW_NAKED_FRAC (1U << 7) /* Allow empty fraction (e.g. "123.") */ #define DUK_S2N_FLAG_ALLOW_EMPTY_FRAC (1U << 8) /* Allow empty string to be interpreted as 0 */ #define DUK_S2N_FLAG_ALLOW_EMPTY_AS_ZERO (1U << 9) /* Allow leading zeroes (e.g. "0123" -> "123") */ #define DUK_S2N_FLAG_ALLOW_LEADING_ZERO (1U << 10) /* Allow automatic detection of hex base ("0x" or "0X" prefix), * overrides radix argument and forces integer mode. */ #define DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT (1U << 11) /* Allow automatic detection of legacy octal base ("0n"), * overrides radix argument and forces integer mode. */ #define DUK_S2N_FLAG_ALLOW_AUTO_LEGACY_OCT_INT (1U << 12) /* Allow automatic detection of ES2015 octal base ("0o123"), * overrides radix argument and forces integer mode. */ #define DUK_S2N_FLAG_ALLOW_AUTO_OCT_INT (1U << 13) /* Allow automatic detection of ES2015 binary base ("0b10001"), * overrides radix argument and forces integer mode. */ #define DUK_S2N_FLAG_ALLOW_AUTO_BIN_INT (1U << 14) /* * Prototypes */ DUK_INTERNAL_DECL void duk_numconv_stringify(duk_hthread *thr, duk_small_int_t radix, duk_small_int_t digits, duk_small_uint_t flags); DUK_INTERNAL_DECL void duk_numconv_parse(duk_hthread *thr, duk_small_int_t radix, duk_small_uint_t flags); #endif /* DUK_NUMCONV_H_INCLUDED */ /* #include duk_bi_protos.h */ #line 1 "duk_bi_protos.h" /* * Prototypes for built-in functions not automatically covered by the * header declarations emitted by genbuiltins.py. */ #if !defined(DUK_BUILTIN_PROTOS_H_INCLUDED) #define DUK_BUILTIN_PROTOS_H_INCLUDED /* Buffer size needed for ISO 8601 formatting. * Accurate value is 32 + 1 for NUL termination: * >>> len('+123456-01-23T12:34:56.123+12:34') * 32 * Include additional space to be safe. */ #define DUK_BI_DATE_ISO8601_BUFSIZE 40 /* Helpers exposed for internal use */ DUK_INTERNAL_DECL void duk_bi_date_timeval_to_parts(duk_double_t d, duk_int_t *parts, duk_double_t *dparts, duk_small_uint_t flags); DUK_INTERNAL_DECL duk_double_t duk_bi_date_get_timeval_from_dparts(duk_double_t *dparts, duk_small_uint_t flags); DUK_INTERNAL_DECL duk_bool_t duk_bi_date_is_leap_year(duk_int_t year); DUK_INTERNAL_DECL duk_bool_t duk_bi_date_timeval_in_valid_range(duk_double_t x); DUK_INTERNAL_DECL duk_bool_t duk_bi_date_year_in_valid_range(duk_double_t year); DUK_INTERNAL_DECL duk_bool_t duk_bi_date_timeval_in_leeway_range(duk_double_t x); /* Built-in providers */ #if defined(DUK_USE_DATE_NOW_GETTIMEOFDAY) DUK_INTERNAL_DECL duk_double_t duk_bi_date_get_now_gettimeofday(void); #endif #if defined(DUK_USE_DATE_NOW_TIME) DUK_INTERNAL_DECL duk_double_t duk_bi_date_get_now_time(void); #endif #if defined(DUK_USE_DATE_NOW_WINDOWS) DUK_INTERNAL_DECL duk_double_t duk_bi_date_get_now_windows(void); #endif #if defined(DUK_USE_DATE_NOW_WINDOWS_SUBMS) DUK_INTERNAL_DECL duk_double_t duk_bi_date_get_now_windows_subms(void); #endif #if defined(DUK_USE_DATE_TZO_GMTIME_R) || defined(DUK_USE_DATE_TZO_GMTIME_S) || defined(DUK_USE_DATE_TZO_GMTIME) DUK_INTERNAL_DECL duk_int_t duk_bi_date_get_local_tzoffset_gmtime(duk_double_t d); #endif #if defined(DUK_USE_DATE_TZO_WINDOWS) DUK_INTERNAL_DECL duk_int_t duk_bi_date_get_local_tzoffset_windows(duk_double_t d); #endif #if defined(DUK_USE_DATE_TZO_WINDOWS_NO_DST) DUK_INTERNAL_DECL duk_int_t duk_bi_date_get_local_tzoffset_windows_no_dst(duk_double_t d); #endif #if defined(DUK_USE_DATE_PRS_STRPTIME) DUK_INTERNAL_DECL duk_bool_t duk_bi_date_parse_string_strptime(duk_hthread *thr, const char *str); #endif #if defined(DUK_USE_DATE_PRS_GETDATE) DUK_INTERNAL_DECL duk_bool_t duk_bi_date_parse_string_getdate(duk_hthread *thr, const char *str); #endif #if defined(DUK_USE_DATE_FMT_STRFTIME) DUK_INTERNAL_DECL duk_bool_t duk_bi_date_format_parts_strftime(duk_hthread *thr, duk_int_t *parts, duk_int_t tzoffset, duk_small_uint_t flags); #endif #if defined(DUK_USE_GET_MONOTONIC_TIME_CLOCK_GETTIME) DUK_INTERNAL_DECL duk_double_t duk_bi_date_get_monotonic_time_clock_gettime(void); #endif #if defined(DUK_USE_GET_MONOTONIC_TIME_WINDOWS_QPC) DUK_INTERNAL_DECL duk_double_t duk_bi_date_get_monotonic_time_windows_qpc(void); #endif DUK_INTERNAL_DECL void duk_bi_json_parse_helper(duk_hthread *thr, duk_idx_t idx_value, duk_idx_t idx_reviver, duk_small_uint_t flags); DUK_INTERNAL_DECL void duk_bi_json_stringify_helper(duk_hthread *thr, duk_idx_t idx_value, duk_idx_t idx_replacer, duk_idx_t idx_space, duk_small_uint_t flags); DUK_INTERNAL_DECL duk_ret_t duk_textdecoder_decode_utf8_nodejs(duk_hthread *thr); #if defined(DUK_USE_ES6_PROXY) DUK_INTERNAL_DECL void duk_proxy_ownkeys_postprocess(duk_hthread *thr, duk_hobject *h_proxy_target, duk_uint_t flags); #endif #endif /* DUK_BUILTIN_PROTOS_H_INCLUDED */ /* #include duk_selftest.h */ #line 1 "duk_selftest.h" /* * Selftest code */ #if !defined(DUK_SELFTEST_H_INCLUDED) #define DUK_SELFTEST_H_INCLUDED #if defined(DUK_USE_SELF_TESTS) DUK_INTERNAL_DECL duk_uint_t duk_selftest_run_tests(duk_alloc_function alloc_func, duk_realloc_function realloc_func, duk_free_function free_func, void *udata); #endif #endif /* DUK_SELFTEST_H_INCLUDED */ #line 82 "duk_internal.h" #endif /* DUK_INTERNAL_H_INCLUDED */ #line 10 "duk_replacements.c" #if defined(DUK_USE_COMPUTED_NAN) DUK_INTERNAL double duk_computed_nan; #endif #if defined(DUK_USE_COMPUTED_INFINITY) DUK_INTERNAL double duk_computed_infinity; #endif #if defined(DUK_USE_REPL_FPCLASSIFY) DUK_INTERNAL int duk_repl_fpclassify(double x) { duk_double_union u; duk_uint_fast16_t expt; duk_small_int_t mzero; u.d = x; expt = (duk_uint_fast16_t) (u.us[DUK_DBL_IDX_US0] & 0x7ff0UL); if (expt > 0x0000UL && expt < 0x7ff0UL) { /* expt values [0x001,0x7fe] = normal */ return DUK_FP_NORMAL; } mzero = (u.ui[DUK_DBL_IDX_UI1] == 0 && (u.ui[DUK_DBL_IDX_UI0] & 0x000fffffUL) == 0); if (expt == 0x0000UL) { /* expt 0x000 is zero/subnormal */ if (mzero) { return DUK_FP_ZERO; } else { return DUK_FP_SUBNORMAL; } } else { /* expt 0xfff is infinite/nan */ if (mzero) { return DUK_FP_INFINITE; } else { return DUK_FP_NAN; } } } #endif #if defined(DUK_USE_REPL_SIGNBIT) DUK_INTERNAL int duk_repl_signbit(double x) { duk_double_union u; u.d = x; return (int) (u.uc[DUK_DBL_IDX_UC0] & 0x80UL); } #endif #if defined(DUK_USE_REPL_ISFINITE) DUK_INTERNAL int duk_repl_isfinite(double x) { int c = DUK_FPCLASSIFY(x); if (c == DUK_FP_NAN || c == DUK_FP_INFINITE) { return 0; } else { return 1; } } #endif #if defined(DUK_USE_REPL_ISNAN) DUK_INTERNAL int duk_repl_isnan(double x) { int c = DUK_FPCLASSIFY(x); return (c == DUK_FP_NAN); } #endif #if defined(DUK_USE_REPL_ISINF) DUK_INTERNAL int duk_repl_isinf(double x) { int c = DUK_FPCLASSIFY(x); return (c == DUK_FP_INFINITE); } #endif #line 1 "duk_debug_macros.c" /* * Debugging macro calls. */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_DEBUG) /* * Debugging enabled */ #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #if !defined(DUK_USE_DEBUG_WRITE) #error debugging enabled (DUK_USE_DEBUG) but DUK_USE_DEBUG_WRITE not defined #endif #define DUK__DEBUG_BUFSIZE DUK_USE_DEBUG_BUFSIZE #if defined(DUK_USE_VARIADIC_MACROS) DUK_INTERNAL void duk_debug_log(duk_int_t level, const char *file, duk_int_t line, const char *func, const char *fmt, ...) { va_list ap; long arg_level; const char *arg_file; long arg_line; const char *arg_func; const char *arg_msg; char buf[DUK__DEBUG_BUFSIZE]; va_start(ap, fmt); DUK_MEMZERO((void *) buf, (size_t) DUK__DEBUG_BUFSIZE); duk_debug_vsnprintf(buf, DUK__DEBUG_BUFSIZE - 1, fmt, ap); arg_level = (long) level; arg_file = (const char *) file; arg_line = (long) line; arg_func = (const char *) func; arg_msg = (const char *) buf; DUK_USE_DEBUG_WRITE(arg_level, arg_file, arg_line, arg_func, arg_msg); va_end(ap); } #else /* DUK_USE_VARIADIC_MACROS */ DUK_INTERNAL char duk_debug_file_stash[DUK_DEBUG_STASH_SIZE]; DUK_INTERNAL duk_int_t duk_debug_line_stash; DUK_INTERNAL char duk_debug_func_stash[DUK_DEBUG_STASH_SIZE]; DUK_INTERNAL duk_int_t duk_debug_level_stash; DUK_INTERNAL void duk_debug_log(const char *fmt, ...) { va_list ap; long arg_level; const char *arg_file; long arg_line; const char *arg_func; const char *arg_msg; char buf[DUK__DEBUG_BUFSIZE]; va_start(ap, fmt); DUK_MEMZERO((void *) buf, (size_t) DUK__DEBUG_BUFSIZE); duk_debug_vsnprintf(buf, DUK__DEBUG_BUFSIZE - 1, fmt, ap); arg_level = (long) duk_debug_level_stash; arg_file = (const char *) duk_debug_file_stash; arg_line = (long) duk_debug_line_stash; arg_func = (const char *) duk_debug_func_stash; arg_msg = (const char *) buf; DUK_USE_DEBUG_WRITE(arg_level, arg_file, arg_line, arg_func, arg_msg); va_end(ap); } #endif /* DUK_USE_VARIADIC_MACROS */ #else /* DUK_USE_DEBUG */ /* * Debugging disabled */ #endif /* DUK_USE_DEBUG */ /* automatic undefs */ #undef DUK__DEBUG_BUFSIZE #line 1 "duk_builtins.c" /* * Automatically generated by genbuiltins.py, do not edit! */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_ASSERTIONS) #define DUK__REFCINIT(refc) 0 /*h_assert_refcount*/, (refc) /*actual*/ #else #define DUK__REFCINIT(refc) (refc) /*actual*/ #endif #if defined(DUK_USE_ROM_STRINGS) #error ROM support not enabled, rerun configure.py with --rom-support #else /* DUK_USE_ROM_STRINGS */ DUK_INTERNAL const duk_uint8_t duk_strings_data[892] = { 79,40,209,144,168,105,6,78,54,139,89,185,44,48,46,90,120,8,154,140,35,103, 35,113,193,73,5,52,112,180,104,166,135,52,188,4,98,12,27,146,156,80,211,31, 129,115,150,64,52,220,109,24,18,68,156,24,38,67,114,36,55,9,119,151,132, 140,93,18,113,128,153,201,212,201,205,2,248,8,196,24,224,104,82,146,40,224, 193,48,114,168,37,147,196,54,123,28,4,98,12,43,148,67,103,177,192,70,32, 196,121,68,54,123,28,18,192,199,144,124,4,98,12,43,136,108,244,117,184,8, 196,24,95,40,134,207,71,91,128,140,65,133,113,13,158,158,151,1,24,131,11, 229,16,217,233,233,112,17,136,48,206,21,110,4,244,244,184,8,196,24,103,10, 183,2,122,218,156,4,98,12,24,203,112,64,179,113,193,79,8,218,155,131,32, 184,70,212,220,13,10,82,68,252,123,144,217,146,38,228,207,18,0,100,37,64, 178,212,11,161,17,104,162,96,10,200,193,57,165,65,169,16,5,100,81,27,70,18, 32,10,200,68,185,13,116,221,197,184,64,89,57,41,197,13,49,234,5,208,156, 113,87,55,118,147,20,187,56,161,166,92,221,212,73,210,236,226,134,153,115, 119,76,201,203,179,138,26,99,73,212,136,136,164,25,174,137,56,32,72,137, 101,23,52,45,13,34,86,9,79,136,104,201,114,149,96,52,138,134,140,151,75, 226,233,186,120,121,22,39,54,83,141,5,55,68,236,36,164,3,16,225,115,150,64, 52,205,163,2,72,154,83,138,26,99,75,12,11,150,103,5,36,20,211,70,140,133, 67,72,49,241,160,227,81,196,52,168,106,39,132,252,183,136,105,80,212,79,2, 249,110,128,126,88,95,133,109,237,237,237,151,235,127,46,249,119,203,190, 186,206,33,181,2,208,61,190,12,19,34,65,19,81,132,108,228,97,1,107,33,12, 32,45,100,137,64,247,175,9,19,155,41,198,130,155,134,69,146,100,227,226, 231,146,51,192,204,73,140,224,145,221,102,241,68,196,157,34,79,143,139,166, 233,225,228,227,138,157,173,167,197,211,118,214,210,38,238,74,113,67,76, 105,187,169,147,154,73,225,228,32,193,48,25,100,105,166,113,200,147,44,166, 1,40,79,18,150,134,147,141,163,2,72,171,115,147,136,4,65,130,96,35,64,194, 32,168,89,56,208,48,135,123,144,217,146,39,220,228,193,19,18,101,220,227, 73,121,167,115,129,196,200,39,12,136,220,225,93,22,1,114,62,231,42,8,176, 15,62,231,36,234,68,68,70,231,30,45,37,161,164,38,231,24,7,159,115,149,4, 72,218,171,115,133,67,64,180,100,145,54,231,42,5,208,135,19,152,244,44,133, 67,95,73,164,145,143,5,18,2,100,65,35,30,76,241,117,134,70,212,103,37,204, 16,72,154,218,130,77,196,145,63,127,123,106,141,25,11,189,243,169,198,132, 251,235,119,247,182,154,6,239,124,234,113,161,62,250,221,253,237,164,52, 187,223,58,156,104,79,190,187,127,123,105,168,105,119,190,117,56,208,159, 125,118,254,246,209,104,209,111,124,234,113,161,62,250,205,253,162,209,162, 249,212,227,66,125,244,161,137,0,162,8,18,33,68,9,136,232,19,155,52,54,132, 64,200,26,24,196,137,198,66,130,139,153,134,69,146,100,16,220,66,46,68,57, 80,208,45,120,25,93,20,22,141,20,208,230,137,5,18,26,164,54,83,3,68,71,20, 109,37,141,18,78,145,105,165,100,76,71,36,206,137,22,103,139,172,57,199,6, 158,30,71,20,117,4,74,39,54,83,37,92,129,150,199,66,200,75,34,103,40,150,9, 72,132,109,24,98,93,238,140,206,75,204,141,28,140,134,61,209,153,101,71, 146,36,109,22,178,78,52,33,74,5,200,138,67,30,178,48,141,156,146,134,204, 145,40,4,65,172,147,59,192,37,0,196,59,226,138,130,100,75,226,233,144,83, 32,204,250,5,104,17,165,48,77,2,46,16,69,140, }; #endif /* DUK_USE_ROM_STRINGS */ #if defined(DUK_USE_ROM_OBJECTS) #error ROM support not enabled, rerun configure.py with --rom-support #else /* DUK_USE_ROM_OBJECTS */ /* native functions: 176 */ DUK_INTERNAL const duk_c_function duk_bi_native_functions[176] = { NULL, duk_bi_array_constructor, duk_bi_array_constructor_is_array, duk_bi_array_prototype_concat, duk_bi_array_prototype_indexof_shared, duk_bi_array_prototype_iter_shared, duk_bi_array_prototype_join_shared, duk_bi_array_prototype_pop, duk_bi_array_prototype_push, duk_bi_array_prototype_reduce_shared, duk_bi_array_prototype_reverse, duk_bi_array_prototype_shift, duk_bi_array_prototype_slice, duk_bi_array_prototype_sort, duk_bi_array_prototype_splice, duk_bi_array_prototype_to_string, duk_bi_array_prototype_unshift, duk_bi_arraybuffer_constructor, duk_bi_arraybuffer_isview, duk_bi_boolean_constructor, duk_bi_boolean_prototype_tostring_shared, duk_bi_buffer_compare_shared, duk_bi_buffer_readfield, duk_bi_buffer_slice_shared, duk_bi_buffer_writefield, duk_bi_dataview_constructor, duk_bi_date_constructor, duk_bi_date_constructor_now, duk_bi_date_constructor_parse, duk_bi_date_constructor_utc, duk_bi_date_prototype_get_shared, duk_bi_date_prototype_get_timezone_offset, duk_bi_date_prototype_set_shared, duk_bi_date_prototype_set_time, duk_bi_date_prototype_to_json, duk_bi_date_prototype_tostring_shared, duk_bi_date_prototype_value_of, duk_bi_duktape_object_act, duk_bi_duktape_object_compact, duk_bi_duktape_object_dec, duk_bi_duktape_object_enc, duk_bi_duktape_object_fin, duk_bi_duktape_object_gc, duk_bi_duktape_object_info, duk_bi_error_constructor_shared, duk_bi_error_prototype_filename_getter, duk_bi_error_prototype_filename_setter, duk_bi_error_prototype_linenumber_getter, duk_bi_error_prototype_linenumber_setter, duk_bi_error_prototype_stack_getter, duk_bi_error_prototype_stack_setter, duk_bi_error_prototype_to_string, duk_bi_function_constructor, duk_bi_function_prototype, duk_bi_function_prototype_apply, duk_bi_function_prototype_bind, duk_bi_function_prototype_call, duk_bi_function_prototype_to_string, duk_bi_global_object_decode_uri, duk_bi_global_object_decode_uri_component, duk_bi_global_object_encode_uri, duk_bi_global_object_encode_uri_component, duk_bi_global_object_escape, duk_bi_global_object_eval, duk_bi_global_object_is_finite, duk_bi_global_object_is_nan, duk_bi_global_object_parse_float, duk_bi_global_object_parse_int, duk_bi_global_object_unescape, duk_bi_json_object_parse, duk_bi_json_object_stringify, duk_bi_math_object_clz32, duk_bi_math_object_hypot, duk_bi_math_object_imul, duk_bi_math_object_max, duk_bi_math_object_min, duk_bi_math_object_onearg_shared, duk_bi_math_object_random, duk_bi_math_object_sign, duk_bi_math_object_twoarg_shared, duk_bi_native_function_length, duk_bi_native_function_name, duk_bi_nodejs_buffer_byte_length, duk_bi_nodejs_buffer_concat, duk_bi_nodejs_buffer_constructor, duk_bi_nodejs_buffer_copy, duk_bi_nodejs_buffer_fill, duk_bi_nodejs_buffer_is_buffer, duk_bi_nodejs_buffer_is_encoding, duk_bi_nodejs_buffer_tojson, duk_bi_nodejs_buffer_tostring, duk_bi_nodejs_buffer_write, duk_bi_number_constructor, duk_bi_number_prototype_to_exponential, duk_bi_number_prototype_to_fixed, duk_bi_number_prototype_to_locale_string, duk_bi_number_prototype_to_precision, duk_bi_number_prototype_to_string, duk_bi_number_prototype_value_of, duk_bi_object_constructor, duk_bi_object_constructor_assign, duk_bi_object_constructor_create, duk_bi_object_constructor_define_properties, duk_bi_object_constructor_define_property, duk_bi_object_constructor_get_own_property_descriptor, duk_bi_object_constructor_is, duk_bi_object_constructor_is_extensible, duk_bi_object_constructor_is_sealed_frozen_shared, duk_bi_object_constructor_keys_shared, duk_bi_object_constructor_prevent_extensions, duk_bi_object_constructor_seal_freeze_shared, duk_bi_object_getprototype_shared, duk_bi_object_prototype_defineaccessor, duk_bi_object_prototype_has_own_property, duk_bi_object_prototype_is_prototype_of, duk_bi_object_prototype_lookupaccessor, duk_bi_object_prototype_property_is_enumerable, duk_bi_object_prototype_to_locale_string, duk_bi_object_prototype_to_string, duk_bi_object_prototype_value_of, duk_bi_object_setprototype_shared, duk_bi_performance_now, duk_bi_pointer_constructor, duk_bi_pointer_prototype_tostring_shared, duk_bi_proxy_constructor, duk_bi_reflect_apply, duk_bi_reflect_construct, duk_bi_reflect_object_delete_property, duk_bi_reflect_object_get, duk_bi_reflect_object_has, duk_bi_reflect_object_set, duk_bi_regexp_constructor, duk_bi_regexp_prototype_exec, duk_bi_regexp_prototype_flags, duk_bi_regexp_prototype_shared_getter, duk_bi_regexp_prototype_test, duk_bi_regexp_prototype_tostring, duk_bi_string_constructor, duk_bi_string_constructor_from_char_code, duk_bi_string_constructor_from_code_point, duk_bi_string_prototype_caseconv_shared, duk_bi_string_prototype_char_at, duk_bi_string_prototype_char_code_at, duk_bi_string_prototype_concat, duk_bi_string_prototype_includes, duk_bi_string_prototype_indexof_shared, duk_bi_string_prototype_locale_compare, duk_bi_string_prototype_match, duk_bi_string_prototype_repeat, duk_bi_string_prototype_replace, duk_bi_string_prototype_search, duk_bi_string_prototype_slice, duk_bi_string_prototype_split, duk_bi_string_prototype_startswith_endswith, duk_bi_string_prototype_substr, duk_bi_string_prototype_substring, duk_bi_string_prototype_to_string, duk_bi_string_prototype_trim, duk_bi_textdecoder_constructor, duk_bi_textdecoder_prototype_decode, duk_bi_textdecoder_prototype_shared_getter, duk_bi_textencoder_constructor, duk_bi_textencoder_prototype_encode, duk_bi_textencoder_prototype_encoding_getter, duk_bi_thread_constructor, duk_bi_thread_current, duk_bi_thread_resume, duk_bi_thread_yield, duk_bi_type_error_thrower, duk_bi_typedarray_buffer_getter, duk_bi_typedarray_bytelength_getter, duk_bi_typedarray_byteoffset_getter, duk_bi_typedarray_constructor, duk_bi_typedarray_set, duk_bi_uint8array_allocplain, duk_bi_uint8array_plainof, }; #if defined(DUK_USE_DOUBLE_LE) DUK_INTERNAL const duk_uint8_t duk_builtins_data[3972] = { 144,148,105,223,160,68,52,228,62,12,104,200,165,132,52,167,194,138,105,242, 252,57,28,211,57,18,64,52,238,62,44,138,111,171,241,164,19,87,125,30,33, 167,16,145,159,8,211,136,9,225,42,5,240,145,139,163,163,8,211,136,10,228, 64,211,19,132,140,93,29,56,70,156,64,119,34,66,146,36,104,137,194,70,46, 142,172,35,78,32,47,146,195,102,11,240,145,139,163,175,8,211,136,9,228,240, 242,112,145,139,163,179,8,211,136,8,237,34,130,118,49,116,118,225,26,48,0, 1,80,29,201,158,46,183,39,135,147,132,140,93,16,132,76,66,33,8,66,16,132, 33,8,66,34,33,154,112,0,1,73,247,35,79,91,237,198,174,192,47,31,23,95,17, 13,51,19,35,93,68,216,209,128,0,10,192,174,79,15,32,248,8,196,24,8,107,192, 0,5,98,118,27,94,0,0,43,19,227,94,0,0,43,20,46,215,128,0,10,197,28,198,188, 0,0,86,41,100,53,224,0,2,177,79,85,175,0,0,21,138,154,45,120,0,0,172,85, 217,107,192,0,5,98,182,243,86,193,106,52,127,66,249,50,94,124,35,68,225, 146,49,13,31,170,23,201,146,243,224,200,39,12,145,136,67,134,11,49,0,0,0,0, 0,0,3,225,255,51,0,0,0,0,0,0,3,193,255,47,18,1,172,19,120,71,10,25,196,136, 113,162,156,136,199,42,57,204,144,115,132,240,149,2,248,72,197,209,58,2, 185,16,52,196,225,35,23,68,233,14,228,72,82,68,141,17,56,72,197,209,58,130, 249,44,54,96,191,9,24,186,39,88,79,39,135,147,132,140,93,19,176,35,180,138, 9,216,197,209,59,82,79,31,40,242,1,248,58,42,96,121,14,232,94,62,46,190,15, 38,31,145,33,86,65,76,242,150,143,69,48,242,179,79,45,56,243,51,207,53,64, 243,116,79,57,72,243,180,207,61,80,243,245,79,65,88,244,34,249,50,94,124, 35,68,225,146,39,163,23,201,146,243,224,200,39,12,145,61,40,183,146,37,116, 88,6,136,158,244,241,174,230,202,80,135,130,50,39,16,217,231,208,20,240,70, 68,225,86,224,79,60,64,84,75,141,7,27,157,32,66,37,194,161,168,153,51,132, 9,25,4,225,147,180,138,50,196,18,25,4,225,147,180,138,5,215,49,238,105,27, 60,185,2,72,209,56,100,237,34,140,193,4,136,209,56,100,237,34,129,117,204, 123,154,70,207,50,64,98,72,64,121,51,68,8,163,73,33,1,228,208,16,0,65,112, 152,56,196,159,31,23,77,211,195,201,199,23,150,73,169,234,34,24,49,39,199, 89,188,124,92,242,70,120,224,201,33,69,15,155,163,196,64,153,137,62,58,205, 227,226,231,146,51,199,26,6,18,92,130,64,192,148,144,102,240,23,129,133,18, 2,100,224,160,56,100,42,26,78,62,46,121,35,60,112,216,32,50,21,13,39,31,23, 60,145,154,9,46,18,1,36,64,47,148,64,98,196,132,201,57,68,132,95,18,84,141, 159,9,121,145,178,67,155,46,73,2,17,46,72,128,89,7,199,32,66,37,194,197, 217,35,120,228,131,17,46,18,243,35,100,128,172,156,98,2,40,152,151,32,130, 166,36,248,235,55,143,139,158,72,207,28,150,24,23,46,92,130,80,72,151,21,0, 100,213,103,229,245,8,186,190,144,24,78,136,24,94,152,3,142,9,113,214,111, 31,23,60,145,158,57,164,13,68,184,248,186,110,158,30,78,56,188,226,10,62, 46,121,35,60,113,18,225,27,70,18,32,10,201,208,32,134,214,208,200,84,52, 156,49,39,50,71,107,107,152,129,13,173,161,144,168,105,57,34,78,100,142, 214,215,49,16,134,214,210,220,229,81,252,49,39,50,71,107,107,158,65,13,173, 165,185,202,163,249,34,78,100,142,214,215,60,146,12,16,28,128,62,175,42,6, 143,36,136,16,64,90,242,135,192,129,67,71,147,62,65,5,215,231,214,6,215,62, 180,8,49,1,3,162,92,4,98,12,41,14,67,40,106,229,1,132,130,8,24,78,104,129, 54,62,96,224,144,13,238,124,32,2,62,146,60,51,224,120,146,164,140,137,20,0, 178,58,11,56,192,5,146,208,34,71,64,36,157,25,200,32,52,158,180,8,146,87, 129,232,217,29,5,156,179,224,116,52,100,191,28,87,62,130,214,9,79,136,104, 201,126,56,174,127,0,31,255,225,73,82,71,16,13,1,36,230,18,1,164,14,87,71, 132,0,143,0,210,131,96,31,0,211,6,42,23,50,70,1,167,13,18,14,130,36,67,232, 46,36,29,4,78,69,6,60,226,31,192,7,255,252,24,192,163,11,23,51,130,56,35, 193,56,100,243,31,6,150,46,103,4,225,147,143,114,27,63,57,241,200,169,194, 133,42,166,175,240,6,23,240,0,97,28,17,224,39,233,32,80,142,8,240,78,25,56, 9,250,136,22,39,12,156,123,144,217,240,19,245,18,6,19,154,32,79,214,124,14, 134,140,151,227,139,237,52,11,88,37,62,33,163,37,248,226,251,77,32,213,184, 64,89,56,39,49,224,137,61,196,5,96,38,35,251,200,15,18,61,96,17,62,40,6, 145,1,17,31,228,64,89,45,2,39,205,0,178,122,209,63,162,2,101,64,202,113,67, 77,247,64,92,221,197,186,196,143,4,9,19,208,1,25,187,139,112,128,178,113, 110,177,35,193,2,68,244,0,46,110,229,30,242,71,130,4,137,232,4,35,55,113, 110,16,22,78,81,239,36,120,32,72,158,128,64,147,138,25,249,0,52,72,242,2, 127,2,5,74,96,140,229,203,34,103,250,154,4,17,163,151,44,137,159,234,105,4, 33,162,93,6,73,123,13,1,165,64,202,113,251,33,6,64,14,71,78,20,101,213,207, 4,194,207,2,12,162,0,158,176,23,218,168,23,66,64,255,255,255,255,255,255, 239,127,19,214,33,187,85,2,232,72,0,32,0,0,0,0,0,0,25,136,0,0,0,0,0,0,31, 15,228,122,247,73,19,69,73,180,134,149,13,68,241,0,0,0,0,0,0,3,193,252,143, 90,67,2,104,169,54,144,210,161,168,158,32,0,0,0,0,0,0,120,127,142,73,78,20, 0,0,0,0,0,0,0,0,8,58,189,233,24,77,217,24,93,240,1,230,238,21,23,32,247,68, 13,155,184,75,189,205,35,102,128,47,114,64,185,187,143,137,4,137,33,205, 222,17,6,96,48,87,130,50,37,114,1,246,147,21,143,224,54,186,213,128,114,90, 112,164,0,0,0,0,0,0,124,63,226,117,119,128,25,55,112,96,153,57,41,197,13, 53,224,65,147,119,38,134,19,146,156,80,211,94,5,194,94,6,37,55,113,110,16, 22,78,12,19,39,37,56,161,166,188,14,74,110,226,220,32,44,156,154,24,78,74, 113,67,77,120,32,97,175,4,28,61,224,133,172,186,70,22,248,1,204,73,242,104, 97,47,128,44,196,159,11,69,175,152,32,35,100,33,142,49,39,218,76,69,237,22, 190,96,128,141,144,136,32,196,159,24,230,204,246,66,40,179,18,125,164,196, 206,185,179,61,144,140,28,196,159,6,9,146,200,71,20,98,79,180,152,135,208, 76,150,66,64,99,18,124,24,49,100,36,137,49,39,218,76,67,232,49,100,37,8,49, 39,195,186,145,149,144,150,44,196,159,105,49,31,174,164,101,100,38,10,49, 39,198,33,180,153,37,100,38,141,49,39,218,76,76,234,27,73,146,86,66,112, 163,18,124,145,4,230,142,86,66,120,211,18,125,164,197,46,144,78,104,229, 100,40,15,49,39,198,33,107,68,136,39,52,114,178,20,73,24,147,237,38,38,117, 11,90,36,65,57,163,149,144,164,68,196,159,38,134,19,46,105,56,226,150,68, 157,160,3,200,147,228,208,194,92,32,124,137,62,49,11,90,36,65,57,163,149, 178,166,74,68,159,105,49,51,168,90,209,34,9,205,28,173,149,65,82,36,249,34, 9,205,28,173,175,170,54,68,159,105,49,75,164,19,154,57,91,95,88,84,137,62, 49,13,164,201,43,111,235,141,145,39,218,76,76,234,27,73,146,86,223,216,17, 34,79,135,117,35,43,115,236,139,145,39,218,76,71,235,169,25,91,159,104,60, 137,62,12,19,37,178,182,42,68,159,105,49,15,160,153,45,149,193,18,36,248, 199,54,103,182,190,232,185,18,125,164,196,206,185,179,61,181,247,133,200, 147,225,104,181,243,4,4,109,191,190,58,68,159,105,49,23,180,90,249,130,2, 54,223,224,67,152,147,230,8,8,217,12,16,121,18,124,193,1,27,101,131,131,56, 7,38,193,198,72,0,0,0,0,0,0,0,0,198,231,240,134,39,63,136,151,95,63,136,49, 89,252,66,98,243,248,133,96,132,185,5,224,32,36,201,41,248,200,213,249,0, 131,64,7,39,192,218,148,124,137,74,216,231,198,227,141,182,124,78,40,217, 231,197,227,4,213,227,192,159,72,10,5,21,218,138,120,74,129,124,36,98,232, 228,74,81,62,160,20,10,107,181,21,114,32,105,137,194,70,46,142,68,165,19, 235,1,64,170,187,81,119,34,66,146,36,104,137,194,70,46,142,68,165,19,236,1, 64,174,187,81,95,37,134,204,23,225,35,23,71,34,82,137,246,128,160,89,93, 168,167,147,195,201,194,70,46,142,68,165,19,238,1,64,182,187,81,71,105,20, 19,177,139,163,145,41,68,16,7,6,15,82,70,72,115,96,0,0,0,0,0,93,105,160,91, 60,149,195,200,194,8,134,149,216,114,1,128,83,192,144,8,194,195,16,12,168, 110,20,120,12,141,22,16,120,12,100,22,12,120,28,78,99,192,41,224,136,115, 36,14,100,197,213,245,193,48,189,112,40,2,237,96,175,131,117,2,178,112,145, 139,163,145,131,114,70,46,142,218,27,182,72,197,209,219,56,26,53,161,166, 28,1,204,178,10,14,38,78,44,141,52,207,31,0,0,21,64,129,100,180,8,148,145, 92,203,176,160,226,100,226,200,211,76,241,240,0,1,84,2,131,137,147,142,41, 100,73,199,192,0,5,88,6,13,10,82,70,62,0,0,42,66,88,115,18,124,67,103,177, 69,49,130,12,73,242,136,108,246,40,165,177,6,36,248,134,207,71,90,138,99, 68,152,147,229,16,217,232,235,81,75,130,12,73,241,13,158,158,149,20,199,9, 49,39,202,33,179,211,210,162,151,69,24,147,225,86,224,79,79,74,138,94,20, 98,79,133,91,129,61,109,74,41,124,60,137,62,33,179,216,166,216,193,18,36, 249,68,54,123,20,218,216,137,18,124,67,103,163,173,77,177,162,100,73,242, 136,108,244,117,169,181,193,18,36,248,134,207,79,74,155,99,132,200,147,229, 16,217,233,233,83,107,162,164,73,240,171,112,39,167,165,77,175,10,145,39, 194,173,192,158,182,165,54,191,153,51,72,71,161,196,201,45,167,146,59,68, 89,24,70,206,0,0,0,0,0,0,7,129,249,153,51,104,71,161,196,201,45,167,146,59, 68,89,24,70,206,0,0,0,0,0,0,7,129,249,153,51,136,71,161,196,201,45,167,146, 59,68,89,24,70,206,0,0,0,0,0,0,7,129,249,153,51,168,71,161,196,201,45,167, 146,59,68,89,24,70,206,0,0,0,0,0,0,0,2,1,153,51,200,71,161,196,201,45,167, 146,59,68,89,24,70,206,0,0,0,0,0,0,0,2,1,153,51,232,71,161,196,201,45,167, 146,59,68,89,24,70,206,0,0,0,0,0,0,0,130,1,153,52,8,71,161,196,201,45,167, 146,59,68,89,24,70,206,0,0,0,0,0,0,0,130,1,153,52,40,71,161,196,201,45,167, 146,59,68,89,24,70,206,0,0,0,0,0,0,0,130,1,153,52,72,71,161,196,201,45,167, 146,59,68,89,24,70,206,0,0,0,0,0,0,1,2,1,135,52,102,32,76,72,1,246,136,235, 103,177,69,1,17,32,7,196,54,123,20,82,88,200,144,3,237,17,214,207,71,91, 171,37,20,65,145,32,7,218,35,173,158,142,183,66,74,41,16,92,72,1,241,13, 158,142,183,86,74,41,48,92,72,1,241,13,158,142,183,66,74,41,80,100,72,1, 246,136,235,103,167,165,213,146,138,40,200,144,3,237,17,214,207,79,75,161, 37,20,138,46,36,0,248,134,207,79,75,171,37,20,154,46,36,0,248,134,207,79, 75,161,37,20,170,46,36,0,248,85,184,19,234,201,69,24,92,72,1,240,171,112, 39,208,146,138,70,25,18,0,124,27,168,21,147,171,37,20,113,145,32,7,193,186, 129,89,58,18,81,72,226,162,64,15,180,71,91,62,172,148,90,0,168,144,3,237, 17,214,207,161,37,22,144,38,36,0,248,134,207,171,37,22,160,38,36,0,248,134, 207,161,37,22,176,42,209,68,201,218,35,173,158,197,54,4,218,40,153,56,134, 207,98,155,75,27,104,162,100,237,17,214,207,71,91,171,37,54,65,182,138,38, 78,209,29,108,244,117,186,18,83,104,131,45,20,76,156,67,103,163,173,213, 146,155,76,25,104,162,100,226,27,61,29,110,132,148,218,160,219,69,19,39, 104,142,182,122,122,93,89,41,178,141,180,81,50,118,136,235,103,167,165,208, 146,155,69,25,104,162,100,226,27,61,61,46,172,148,218,104,203,69,19,39,16, 217,233,233,116,36,166,213,70,90,40,153,56,85,184,19,234,201,77,152,101, 162,137,147,133,91,129,62,132,148,218,48,219,69,19,39,6,234,5,100,234,201, 77,156,109,162,137,147,131,117,2,178,116,36,166,209,197,218,40,153,59,68, 117,179,234,201,78,32,11,180,81,50,118,136,235,103,208,146,156,72,21,104, 162,100,226,27,62,172,148,226,128,171,69,19,39,16,217,244,36,167,22,53,123, 102,53,155,80,2,21,11,94,201,128,196,133,0,185,80,32,56,156,199,130,36,160, 72,16,78,126,54,48,5,146,208,34,82,72,1,109,20,76,155,120,28,34,1,225,32, 52,171,138,69,133,95,130,160,4,234,219,163,161,0,89,86,214,238,197,172,9,0, 31,86,221,40,29,231,63,95,200,69,220,199,225,122,183,27,72,144,63,160,138, 217,81,197,125,207,195,117,110,54,142,129,32,7,114,147,10,189,229,237,159, 130,235,209,0,96,181,17,83,236,132,37,0,63,101,8,207,71,107,74,6,105,219, 251,52,245,7,49,248,94,202,17,158,148,12,211,183,246,105,234,15,99,242,159, 129,228,176,192,185,127,46,155,185,41,197,13,55,38,3,127,255,20,138,160, 192,25,106,8,8,1,58,90,130,64,128,146,27,168,37,8,9,129,186,130,96,160,152, 27,165,171,64,32,131,25,234,10,64,65,17,11,212,19,133,18,243,167,165,163, 32,24,157,45,65,64,6,75,191,80,80,66,149,110,116,117,5,8,41,240,247,79,72, 188,8,134,81,122,84,1,173,198,212,20,48,139,113,180,181,5,36,42,220,109,29, 13,65,74,6,192,95,76,188,6,196,55,78,188,6,247,91,86,136,26,32,104,220,205, 72,1,98,234,52,122,130,136,18,72,51,117,68,3,146,27,168,40,161,37,8,207,80, 81,129,204,13,212,20,112,179,141,26,45,65,75,112,20,43,193,25,19,66,128, 153,78,40,105,144,92,104,152,131,124,27,253,128,0,10,116,3,68,146,163,9, 128,0,10,102,3,138,145,137,27,60,0,0,82,129,7,2,4,16,7,2,70,143,178,203, 164,237,35,14,25,10,134,147,143,139,158,72,207,28,54,77,47,109,13,55,113, 120,96,196,159,29,102,241,241,115,201,25,227,131,36,133,20,62,110,143,17, 16,113,137,62,62,46,155,167,135,147,142,47,44,151,79,221,64,98,37,194,94, 100,108,144,21,147,140,73,168,228,19,17,124,73,82,54,124,37,230,70,201,14, 108,185,36,155,14,243,243,83,212,69,131,132,4,12,137,114,168,37,166,145,7, 10,4,28,200,14,12,40,56,153,56,178,52,211,60,124,0,0,85,0,160,226,100,227, 138,89,18,113,240,0,1,86,1,131,66,148,145,143,128,0,10,144,93,134,0,0,43, 80,17,42,4,17,136,49,73,19,49,134,16,143,67,137,146,91,79,36,118,136,178, 48,141,156,0,0,0,0,0,0,15,3,243,49,135,16,143,67,137,146,91,79,36,118,136, 178,48,141,156,0,0,0,0,0,0,15,3,245,20,5,173,194,227,214,4,55,0,0,21,196,7, 122,192,134,241,197,192,0,5,121,25,140,64,132,122,28,76,146,218,121,35,180, 69,145,132,108,224,0,0,0,0,0,0,120,31,153,140,72,132,122,28,76,146,218,121, 35,180,69,145,132,108,224,0,0,0,0,0,0,0,32,25,140,80,132,122,28,76,146,218, 121,35,180,69,145,132,108,224,0,0,0,0,0,0,0,32,25,140,88,132,122,28,76,146, 218,121,35,180,69,145,132,108,224,0,0,0,0,0,0,8,32,25,140,96,132,122,28,76, 146,218,121,35,180,69,145,132,108,224,0,0,0,0,0,0,8,32,25,140,104,132,122, 28,76,146,218,121,35,180,69,145,132,108,224,0,0,0,0,0,0,8,32,25,140,112, 132,122,28,76,146,218,121,35,180,69,145,132,108,224,0,0,0,0,0,0,16,32,16, 113,225,0,48,156,209,2,122,244,5,34,92,35,68,225,161,166,218,16,33,18,224, 104,82,146,59,50,5,7,19,39,22,70,154,103,215,32,28,78,99,193,18,80,70,131, 165,1,205,34,8,35,68,225,161,166,239,255,4,12,70,137,195,39,248,73,7,78,3, 154,102,16,70,137,195,67,77,223,248,1,74,9,129,125,255,130,9,65,154,232, 147,161,115,59,255,5,64,195,32,156,50,126,197,14,2,3,107,173,213,0, }; #elif defined(DUK_USE_DOUBLE_BE) DUK_INTERNAL const duk_uint8_t duk_builtins_data[3972] = { 144,148,105,223,160,68,52,228,62,12,104,200,165,132,52,167,194,138,105,242, 252,57,28,211,57,18,64,52,238,62,44,138,111,171,241,164,19,87,125,30,33, 167,16,145,159,8,211,136,9,225,42,5,240,145,139,163,163,8,211,136,10,228, 64,211,19,132,140,93,29,56,70,156,64,119,34,66,146,36,104,137,194,70,46, 142,172,35,78,32,47,146,195,102,11,240,145,139,163,175,8,211,136,9,228,240, 242,112,145,139,163,179,8,211,136,8,237,34,130,118,49,116,118,225,26,48,0, 1,80,29,201,158,46,183,39,135,147,132,140,93,16,132,76,66,33,8,66,16,132, 33,8,66,34,33,154,112,0,1,73,247,35,79,91,237,198,174,192,47,31,23,95,17, 13,51,19,35,93,68,216,209,128,0,10,192,174,79,15,32,248,8,196,24,8,107,192, 0,5,98,118,27,94,0,0,43,19,227,94,0,0,43,20,46,215,128,0,10,197,28,198,188, 0,0,86,41,100,53,224,0,2,177,79,85,175,0,0,21,138,154,45,120,0,0,172,85, 217,107,192,0,5,98,182,243,86,193,106,52,127,66,249,50,94,124,35,68,225, 146,49,13,31,170,23,201,146,243,224,200,39,12,145,136,67,134,11,49,1,255, 224,0,0,0,0,0,3,51,1,255,192,0,0,0,0,0,3,47,18,1,172,19,120,71,10,25,196, 136,113,162,156,136,199,42,57,204,144,115,132,240,149,2,248,72,197,209,58, 2,185,16,52,196,225,35,23,68,233,14,228,72,82,68,141,17,56,72,197,209,58, 130,249,44,54,96,191,9,24,186,39,88,79,39,135,147,132,140,93,19,176,35,180, 138,9,216,197,209,59,82,79,31,40,242,1,248,58,42,96,121,14,232,94,62,46, 190,15,38,31,145,33,86,65,76,242,150,143,69,48,242,179,79,45,56,243,51,207, 53,64,243,116,79,57,72,243,180,207,61,80,243,245,79,65,88,244,34,249,50,94, 124,35,68,225,146,39,163,23,201,146,243,224,200,39,12,145,61,40,183,146,37, 116,88,6,136,158,244,241,174,230,202,80,135,130,50,39,16,217,231,208,20, 240,70,68,225,86,224,79,60,64,84,75,141,7,27,157,32,66,37,194,161,168,153, 51,132,9,25,4,225,147,180,138,50,196,18,25,4,225,147,180,138,5,215,49,238, 105,27,60,185,2,72,209,56,100,237,34,140,193,4,136,209,56,100,237,34,129, 117,204,123,154,70,207,50,64,98,72,64,121,51,68,8,163,73,33,1,228,208,16,0, 65,112,152,56,196,159,31,23,77,211,195,201,199,23,150,73,169,234,34,24,49, 39,199,89,188,124,92,242,70,120,224,201,33,69,15,155,163,196,64,153,137,62, 58,205,227,226,231,146,51,199,26,6,18,92,130,64,192,148,144,102,240,23,129, 133,18,2,100,224,160,56,100,42,26,78,62,46,121,35,60,112,216,32,50,21,13, 39,31,23,60,145,154,9,46,18,1,36,64,47,148,64,98,196,132,201,57,68,132,95, 18,84,141,159,9,121,145,178,67,155,46,73,2,17,46,72,128,89,7,199,32,66,37, 194,197,217,35,120,228,131,17,46,18,243,35,100,128,172,156,98,2,40,152,151, 32,130,166,36,248,235,55,143,139,158,72,207,28,150,24,23,46,92,130,80,72, 151,21,0,100,213,103,229,245,8,186,190,144,24,78,136,24,94,152,3,142,9,113, 214,111,31,23,60,145,158,57,164,13,68,184,248,186,110,158,30,78,56,188,226, 10,62,46,121,35,60,113,18,225,27,70,18,32,10,201,208,32,134,214,208,200,84, 52,156,49,39,50,71,107,107,152,129,13,173,161,144,168,105,57,34,78,100,142, 214,215,49,16,134,214,210,220,229,81,252,49,39,50,71,107,107,158,65,13,173, 165,185,202,163,249,34,78,100,142,214,215,60,146,12,16,28,128,62,175,42,6, 143,36,136,16,64,90,242,135,192,129,67,71,147,62,65,5,215,231,214,6,215,62, 180,8,49,1,3,162,92,4,98,12,41,14,67,40,106,229,1,132,130,8,24,78,104,129, 54,62,96,224,144,13,238,124,32,2,62,146,60,51,224,120,146,164,140,137,20,0, 178,58,11,56,192,5,146,208,34,71,64,36,157,25,200,32,52,158,180,8,146,87, 129,232,217,29,5,156,179,224,116,52,100,191,28,87,62,130,214,9,79,136,104, 201,126,56,174,127,0,31,255,225,73,82,71,16,13,1,36,230,18,1,164,14,87,71, 132,0,143,0,210,131,96,31,0,211,6,42,23,50,70,1,167,13,18,14,130,36,67,232, 46,36,29,4,78,69,6,60,226,31,192,7,255,252,24,192,163,11,23,51,130,56,35, 193,56,100,243,31,6,150,46,103,4,225,147,143,114,27,63,57,241,200,169,194, 133,42,166,175,240,6,23,240,0,97,28,17,224,39,233,32,80,142,8,240,78,25,56, 9,250,136,22,39,12,156,123,144,217,240,19,245,18,6,19,154,32,79,214,124,14, 134,140,151,227,139,237,52,11,88,37,62,33,163,37,248,226,251,77,32,213,184, 64,89,56,39,49,224,137,61,196,5,96,38,35,251,200,15,18,61,96,17,62,40,6, 145,1,17,31,228,64,89,45,2,39,205,0,178,122,209,63,162,2,101,64,202,113,67, 77,247,64,92,221,197,186,196,143,4,9,19,208,1,25,187,139,112,128,178,113, 110,177,35,193,2,68,244,0,46,110,229,30,242,71,130,4,137,232,4,35,55,113, 110,16,22,78,81,239,36,120,32,72,158,128,64,147,138,25,249,0,52,72,242,2, 127,2,5,74,96,140,229,203,34,103,250,154,4,17,163,151,44,137,159,234,105,4, 33,162,93,6,73,123,13,1,165,64,202,113,251,33,6,64,14,71,78,20,101,213,207, 4,194,207,2,12,162,0,158,176,23,218,168,23,66,64,127,239,255,255,255,255, 255,255,19,214,33,187,85,2,232,72,0,0,0,0,0,0,0,0,57,136,15,255,0,0,0,0,0, 0,4,122,247,73,19,69,73,180,134,149,13,68,241,1,255,192,0,0,0,0,0,0,143,90, 67,2,104,169,54,144,210,161,168,158,32,127,248,0,0,0,0,0,0,14,73,78,20,0,0, 0,0,0,0,0,0,8,58,189,233,24,77,217,24,93,240,1,230,238,21,23,32,247,68,13, 155,184,75,189,205,35,102,128,47,114,64,185,187,143,137,4,137,33,205,222, 17,6,96,48,87,130,50,37,114,1,246,147,21,143,224,54,186,213,128,114,90,112, 164,63,252,0,0,0,0,0,0,98,117,119,128,25,55,112,96,153,57,41,197,13,53,224, 65,147,119,38,134,19,146,156,80,211,94,5,194,94,6,37,55,113,110,16,22,78, 12,19,39,37,56,161,166,188,14,74,110,226,220,32,44,156,154,24,78,74,113,67, 77,120,32,97,175,4,28,61,224,133,172,186,70,22,248,1,204,73,242,104,97,47, 128,44,196,159,11,69,175,152,32,35,100,33,142,49,39,218,76,69,237,22,190, 96,128,141,144,136,32,196,159,24,230,204,246,66,40,179,18,125,164,196,206, 185,179,61,144,140,28,196,159,6,9,146,200,71,20,98,79,180,152,135,208,76, 150,66,64,99,18,124,24,49,100,36,137,49,39,218,76,67,232,49,100,37,8,49,39, 195,186,145,149,144,150,44,196,159,105,49,31,174,164,101,100,38,10,49,39, 198,33,180,153,37,100,38,141,49,39,218,76,76,234,27,73,146,86,66,112,163, 18,124,145,4,230,142,86,66,120,211,18,125,164,197,46,144,78,104,229,100,40, 15,49,39,198,33,107,68,136,39,52,114,178,20,73,24,147,237,38,38,117,11,90, 36,65,57,163,149,144,164,68,196,159,38,134,19,46,105,56,226,150,68,157,160, 3,200,147,228,208,194,92,32,124,137,62,49,11,90,36,65,57,163,149,178,166, 74,68,159,105,49,51,168,90,209,34,9,205,28,173,149,65,82,36,249,34,9,205, 28,173,175,170,54,68,159,105,49,75,164,19,154,57,91,95,88,84,137,62,49,13, 164,201,43,111,235,141,145,39,218,76,76,234,27,73,146,86,223,216,17,34,79, 135,117,35,43,115,236,139,145,39,218,76,71,235,169,25,91,159,104,60,137,62, 12,19,37,178,182,42,68,159,105,49,15,160,153,45,149,193,18,36,248,199,54, 103,182,190,232,185,18,125,164,196,206,185,179,61,181,247,133,200,147,225, 104,181,243,4,4,109,191,190,58,68,159,105,49,23,180,90,249,130,2,54,223, 224,67,152,147,230,8,8,217,12,16,121,18,124,193,1,27,101,131,131,56,7,38, 193,198,72,0,0,0,0,0,0,0,0,198,231,240,134,39,63,136,151,95,63,136,49,89, 252,66,98,243,248,133,96,132,185,5,224,32,36,201,41,248,200,213,249,0,131, 64,7,39,192,218,148,124,137,74,216,231,198,227,141,182,124,78,40,217,231, 197,227,4,213,227,192,159,72,10,5,21,218,138,120,74,129,124,36,98,232,228, 74,81,62,160,20,10,107,181,21,114,32,105,137,194,70,46,142,68,165,19,235,1, 64,170,187,81,119,34,66,146,36,104,137,194,70,46,142,68,165,19,236,1,64, 174,187,81,95,37,134,204,23,225,35,23,71,34,82,137,246,128,160,89,93,168, 167,147,195,201,194,70,46,142,68,165,19,238,1,64,182,187,81,71,105,20,19, 177,139,163,145,41,68,16,7,6,15,82,70,72,115,96,32,105,221,0,0,0,0,0,91,60, 149,195,200,194,8,134,149,216,114,1,128,83,192,144,8,194,195,16,12,168,110, 20,120,12,141,22,16,120,12,100,22,12,120,28,78,99,192,41,224,136,115,36,14, 100,197,213,245,193,48,189,112,40,2,237,96,175,131,117,2,178,112,145,139, 163,145,131,114,70,46,142,218,27,182,72,197,209,219,56,26,53,161,166,28,1, 204,178,10,14,38,78,44,141,52,207,31,0,0,21,64,129,100,180,8,148,145,92, 203,176,160,226,100,226,200,211,76,241,240,0,1,84,2,131,137,147,142,41,100, 73,199,192,0,5,88,6,13,10,82,70,62,0,0,42,66,88,115,18,124,67,103,177,69, 49,130,12,73,242,136,108,246,40,165,177,6,36,248,134,207,71,90,138,99,68, 152,147,229,16,217,232,235,81,75,130,12,73,241,13,158,158,149,20,199,9,49, 39,202,33,179,211,210,162,151,69,24,147,225,86,224,79,79,74,138,94,20,98, 79,133,91,129,61,109,74,41,124,60,137,62,33,179,216,166,216,193,18,36,249, 68,54,123,20,218,216,137,18,124,67,103,163,173,77,177,162,100,73,242,136, 108,244,117,169,181,193,18,36,248,134,207,79,74,155,99,132,200,147,229,16, 217,233,233,83,107,162,164,73,240,171,112,39,167,165,77,175,10,145,39,194, 173,192,158,182,165,54,191,153,51,72,71,161,196,201,45,167,146,59,68,89,24, 70,206,1,255,128,0,0,0,0,0,1,153,51,104,71,161,196,201,45,167,146,59,68,89, 24,70,206,1,255,128,0,0,0,0,0,1,153,51,136,71,161,196,201,45,167,146,59,68, 89,24,70,206,1,255,128,0,0,0,0,0,1,153,51,168,71,161,196,201,45,167,146,59, 68,89,24,70,206,2,0,0,0,0,0,0,0,1,153,51,200,71,161,196,201,45,167,146,59, 68,89,24,70,206,2,0,0,0,0,0,0,0,1,153,51,232,71,161,196,201,45,167,146,59, 68,89,24,70,206,2,0,128,0,0,0,0,0,1,153,52,8,71,161,196,201,45,167,146,59, 68,89,24,70,206,2,0,128,0,0,0,0,0,1,153,52,40,71,161,196,201,45,167,146,59, 68,89,24,70,206,2,0,128,0,0,0,0,0,1,153,52,72,71,161,196,201,45,167,146,59, 68,89,24,70,206,2,1,0,0,0,0,0,0,1,135,52,102,32,76,72,1,246,136,235,103, 177,69,1,17,32,7,196,54,123,20,82,88,200,144,3,237,17,214,207,71,91,171,37, 20,65,145,32,7,218,35,173,158,142,183,66,74,41,16,92,72,1,241,13,158,142, 183,86,74,41,48,92,72,1,241,13,158,142,183,66,74,41,80,100,72,1,246,136, 235,103,167,165,213,146,138,40,200,144,3,237,17,214,207,79,75,161,37,20, 138,46,36,0,248,134,207,79,75,171,37,20,154,46,36,0,248,134,207,79,75,161, 37,20,170,46,36,0,248,85,184,19,234,201,69,24,92,72,1,240,171,112,39,208, 146,138,70,25,18,0,124,27,168,21,147,171,37,20,113,145,32,7,193,186,129,89, 58,18,81,72,226,162,64,15,180,71,91,62,172,148,90,0,168,144,3,237,17,214, 207,161,37,22,144,38,36,0,248,134,207,171,37,22,160,38,36,0,248,134,207, 161,37,22,176,42,209,68,201,218,35,173,158,197,54,4,218,40,153,56,134,207, 98,155,75,27,104,162,100,237,17,214,207,71,91,171,37,54,65,182,138,38,78, 209,29,108,244,117,186,18,83,104,131,45,20,76,156,67,103,163,173,213,146, 155,76,25,104,162,100,226,27,61,29,110,132,148,218,160,219,69,19,39,104, 142,182,122,122,93,89,41,178,141,180,81,50,118,136,235,103,167,165,208,146, 155,69,25,104,162,100,226,27,61,61,46,172,148,218,104,203,69,19,39,16,217, 233,233,116,36,166,213,70,90,40,153,56,85,184,19,234,201,77,152,101,162, 137,147,133,91,129,62,132,148,218,48,219,69,19,39,6,234,5,100,234,201,77, 156,109,162,137,147,131,117,2,178,116,36,166,209,197,218,40,153,59,68,117, 179,234,201,78,32,11,180,81,50,118,136,235,103,208,146,156,72,21,104,162, 100,226,27,62,172,148,226,128,171,69,19,39,16,217,244,36,167,22,53,123,102, 53,155,80,2,21,11,94,201,128,196,133,0,185,80,32,56,156,199,130,36,160,72, 16,78,126,54,48,5,146,208,34,82,72,1,109,20,76,155,120,28,34,1,225,32,32,2, 223,133,69,138,43,180,132,234,219,163,161,1,0,9,174,198,238,213,84,88,31, 86,221,40,7,252,197,200,95,223,71,61,225,122,183,27,72,144,15,253,197,81, 217,74,224,191,131,117,110,54,142,129,32,31,237,229,189,138,147,114,135,2, 235,209,1,0,36,135,237,81,16,180,96,63,101,8,207,71,107,74,1,255,53,4,243, 51,249,222,104,94,202,17,158,148,3,255,106,9,230,103,243,188,210,159,129, 228,176,192,185,127,46,155,185,41,197,13,55,38,3,127,255,20,138,160,192,25, 106,8,8,1,58,90,130,64,128,146,27,168,37,8,9,129,186,130,96,160,152,27,165, 171,64,32,131,25,234,10,64,65,17,11,212,19,133,18,243,167,165,163,32,24, 157,45,65,64,6,75,191,80,80,66,149,110,116,117,5,8,41,240,247,79,72,188,8, 134,81,122,84,1,173,198,212,20,48,139,113,180,181,5,36,42,220,109,29,13,65, 74,6,192,95,76,188,6,196,55,78,188,6,247,91,86,136,26,32,104,220,205,72,1, 98,234,52,122,130,136,18,72,51,117,68,3,146,27,168,40,161,37,8,207,80,81, 129,204,13,212,20,112,179,141,26,45,65,75,112,20,43,193,25,19,66,128,153, 78,40,105,144,92,104,152,131,124,27,253,128,0,10,116,3,68,146,163,9,128,0, 10,102,3,138,145,137,27,60,0,0,82,129,7,2,4,16,7,2,70,143,178,203,164,237, 35,14,25,10,134,147,143,139,158,72,207,28,54,77,47,109,13,55,113,120,96, 196,159,29,102,241,241,115,201,25,227,131,36,133,20,62,110,143,17,16,113, 137,62,62,46,155,167,135,147,142,47,44,151,79,221,64,98,37,194,94,100,108, 144,21,147,140,73,168,228,19,17,124,73,82,54,124,37,230,70,201,14,108,185, 36,155,14,243,243,83,212,69,131,132,4,12,137,114,168,37,166,145,7,10,4,28, 200,14,12,40,56,153,56,178,52,211,60,124,0,0,85,0,160,226,100,227,138,89, 18,113,240,0,1,86,1,131,66,148,145,143,128,0,10,144,93,134,0,0,43,80,17,42, 4,17,136,49,73,19,49,134,16,143,67,137,146,91,79,36,118,136,178,48,141,156, 3,255,0,0,0,0,0,0,3,49,135,16,143,67,137,146,91,79,36,118,136,178,48,141, 156,3,255,0,0,0,0,0,0,5,20,5,173,194,227,214,4,55,0,0,21,196,7,122,192,134, 241,197,192,0,5,121,25,140,64,132,122,28,76,146,218,121,35,180,69,145,132, 108,224,31,248,0,0,0,0,0,0,25,140,72,132,122,28,76,146,218,121,35,180,69, 145,132,108,224,32,0,0,0,0,0,0,0,25,140,80,132,122,28,76,146,218,121,35, 180,69,145,132,108,224,32,0,0,0,0,0,0,0,25,140,88,132,122,28,76,146,218, 121,35,180,69,145,132,108,224,32,8,0,0,0,0,0,0,25,140,96,132,122,28,76,146, 218,121,35,180,69,145,132,108,224,32,8,0,0,0,0,0,0,25,140,104,132,122,28, 76,146,218,121,35,180,69,145,132,108,224,32,8,0,0,0,0,0,0,25,140,112,132, 122,28,76,146,218,121,35,180,69,145,132,108,224,32,16,0,0,0,0,0,0,16,113, 225,0,48,156,209,2,122,244,5,34,92,35,68,225,161,166,218,16,33,18,224,104, 82,146,59,50,5,7,19,39,22,70,154,103,215,32,28,78,99,193,18,80,70,131,165, 1,205,34,8,35,68,225,161,166,239,255,4,12,70,137,195,39,248,73,7,78,3,154, 102,16,70,137,195,67,77,223,248,1,74,9,129,125,255,130,9,65,154,232,147, 161,115,59,255,5,64,195,32,156,50,126,197,14,2,3,107,173,213,0, }; #elif defined(DUK_USE_DOUBLE_ME) DUK_INTERNAL const duk_uint8_t duk_builtins_data[3972] = { 144,148,105,223,160,68,52,228,62,12,104,200,165,132,52,167,194,138,105,242, 252,57,28,211,57,18,64,52,238,62,44,138,111,171,241,164,19,87,125,30,33, 167,16,145,159,8,211,136,9,225,42,5,240,145,139,163,163,8,211,136,10,228, 64,211,19,132,140,93,29,56,70,156,64,119,34,66,146,36,104,137,194,70,46, 142,172,35,78,32,47,146,195,102,11,240,145,139,163,175,8,211,136,9,228,240, 242,112,145,139,163,179,8,211,136,8,237,34,130,118,49,116,118,225,26,48,0, 1,80,29,201,158,46,183,39,135,147,132,140,93,16,132,76,66,33,8,66,16,132, 33,8,66,34,33,154,112,0,1,73,247,35,79,91,237,198,174,192,47,31,23,95,17, 13,51,19,35,93,68,216,209,128,0,10,192,174,79,15,32,248,8,196,24,8,107,192, 0,5,98,118,27,94,0,0,43,19,227,94,0,0,43,20,46,215,128,0,10,197,28,198,188, 0,0,86,41,100,53,224,0,2,177,79,85,175,0,0,21,138,154,45,120,0,0,172,85, 217,107,192,0,5,98,182,243,86,193,106,52,127,66,249,50,94,124,35,68,225, 146,49,13,31,170,23,201,146,243,224,200,39,12,145,136,67,134,11,49,0,0,3, 225,252,0,0,0,3,51,0,0,3,193,252,0,0,0,3,47,18,1,172,19,120,71,10,25,196, 136,113,162,156,136,199,42,57,204,144,115,132,240,149,2,248,72,197,209,58, 2,185,16,52,196,225,35,23,68,233,14,228,72,82,68,141,17,56,72,197,209,58, 130,249,44,54,96,191,9,24,186,39,88,79,39,135,147,132,140,93,19,176,35,180, 138,9,216,197,209,59,82,79,31,40,242,1,248,58,42,96,121,14,232,94,62,46, 190,15,38,31,145,33,86,65,76,242,150,143,69,48,242,179,79,45,56,243,51,207, 53,64,243,116,79,57,72,243,180,207,61,80,243,245,79,65,88,244,34,249,50,94, 124,35,68,225,146,39,163,23,201,146,243,224,200,39,12,145,61,40,183,146,37, 116,88,6,136,158,244,241,174,230,202,80,135,130,50,39,16,217,231,208,20, 240,70,68,225,86,224,79,60,64,84,75,141,7,27,157,32,66,37,194,161,168,153, 51,132,9,25,4,225,147,180,138,50,196,18,25,4,225,147,180,138,5,215,49,238, 105,27,60,185,2,72,209,56,100,237,34,140,193,4,136,209,56,100,237,34,129, 117,204,123,154,70,207,50,64,98,72,64,121,51,68,8,163,73,33,1,228,208,16,0, 65,112,152,56,196,159,31,23,77,211,195,201,199,23,150,73,169,234,34,24,49, 39,199,89,188,124,92,242,70,120,224,201,33,69,15,155,163,196,64,153,137,62, 58,205,227,226,231,146,51,199,26,6,18,92,130,64,192,148,144,102,240,23,129, 133,18,2,100,224,160,56,100,42,26,78,62,46,121,35,60,112,216,32,50,21,13, 39,31,23,60,145,154,9,46,18,1,36,64,47,148,64,98,196,132,201,57,68,132,95, 18,84,141,159,9,121,145,178,67,155,46,73,2,17,46,72,128,89,7,199,32,66,37, 194,197,217,35,120,228,131,17,46,18,243,35,100,128,172,156,98,2,40,152,151, 32,130,166,36,248,235,55,143,139,158,72,207,28,150,24,23,46,92,130,80,72, 151,21,0,100,213,103,229,245,8,186,190,144,24,78,136,24,94,152,3,142,9,113, 214,111,31,23,60,145,158,57,164,13,68,184,248,186,110,158,30,78,56,188,226, 10,62,46,121,35,60,113,18,225,27,70,18,32,10,201,208,32,134,214,208,200,84, 52,156,49,39,50,71,107,107,152,129,13,173,161,144,168,105,57,34,78,100,142, 214,215,49,16,134,214,210,220,229,81,252,49,39,50,71,107,107,158,65,13,173, 165,185,202,163,249,34,78,100,142,214,215,60,146,12,16,28,128,62,175,42,6, 143,36,136,16,64,90,242,135,192,129,67,71,147,62,65,5,215,231,214,6,215,62, 180,8,49,1,3,162,92,4,98,12,41,14,67,40,106,229,1,132,130,8,24,78,104,129, 54,62,96,224,144,13,238,124,32,2,62,146,60,51,224,120,146,164,140,137,20,0, 178,58,11,56,192,5,146,208,34,71,64,36,157,25,200,32,52,158,180,8,146,87, 129,232,217,29,5,156,179,224,116,52,100,191,28,87,62,130,214,9,79,136,104, 201,126,56,174,127,0,31,255,225,73,82,71,16,13,1,36,230,18,1,164,14,87,71, 132,0,143,0,210,131,96,31,0,211,6,42,23,50,70,1,167,13,18,14,130,36,67,232, 46,36,29,4,78,69,6,60,226,31,192,7,255,252,24,192,163,11,23,51,130,56,35, 193,56,100,243,31,6,150,46,103,4,225,147,143,114,27,63,57,241,200,169,194, 133,42,166,175,240,6,23,240,0,97,28,17,224,39,233,32,80,142,8,240,78,25,56, 9,250,136,22,39,12,156,123,144,217,240,19,245,18,6,19,154,32,79,214,124,14, 134,140,151,227,139,237,52,11,88,37,62,33,163,37,248,226,251,77,32,213,184, 64,89,56,39,49,224,137,61,196,5,96,38,35,251,200,15,18,61,96,17,62,40,6, 145,1,17,31,228,64,89,45,2,39,205,0,178,122,209,63,162,2,101,64,202,113,67, 77,247,64,92,221,197,186,196,143,4,9,19,208,1,25,187,139,112,128,178,113, 110,177,35,193,2,68,244,0,46,110,229,30,242,71,130,4,137,232,4,35,55,113, 110,16,22,78,81,239,36,120,32,72,158,128,64,147,138,25,249,0,52,72,242,2, 127,2,5,74,96,140,229,203,34,103,250,154,4,17,163,151,44,137,159,234,105,4, 33,162,93,6,73,123,13,1,165,64,202,113,251,33,6,64,14,71,78,20,101,213,207, 4,194,207,2,12,162,0,158,176,23,218,168,23,66,64,255,255,239,127,255,255, 255,255,19,214,33,187,85,2,232,72,0,0,0,0,0,32,0,0,25,136,0,0,31,15,224,0, 0,0,4,122,247,73,19,69,73,180,134,149,13,68,241,0,0,3,193,252,0,0,0,0,143, 90,67,2,104,169,54,144,210,161,168,158,32,0,0,120,127,128,0,0,0,14,73,78, 20,0,0,0,0,0,0,0,0,8,58,189,233,24,77,217,24,93,240,1,230,238,21,23,32,247, 68,13,155,184,75,189,205,35,102,128,47,114,64,185,187,143,137,4,137,33,205, 222,17,6,96,48,87,130,50,37,114,1,246,147,21,143,224,54,186,213,128,114,90, 112,164,0,0,124,63,128,0,0,0,98,117,119,128,25,55,112,96,153,57,41,197,13, 53,224,65,147,119,38,134,19,146,156,80,211,94,5,194,94,6,37,55,113,110,16, 22,78,12,19,39,37,56,161,166,188,14,74,110,226,220,32,44,156,154,24,78,74, 113,67,77,120,32,97,175,4,28,61,224,133,172,186,70,22,248,1,204,73,242,104, 97,47,128,44,196,159,11,69,175,152,32,35,100,33,142,49,39,218,76,69,237,22, 190,96,128,141,144,136,32,196,159,24,230,204,246,66,40,179,18,125,164,196, 206,185,179,61,144,140,28,196,159,6,9,146,200,71,20,98,79,180,152,135,208, 76,150,66,64,99,18,124,24,49,100,36,137,49,39,218,76,67,232,49,100,37,8,49, 39,195,186,145,149,144,150,44,196,159,105,49,31,174,164,101,100,38,10,49, 39,198,33,180,153,37,100,38,141,49,39,218,76,76,234,27,73,146,86,66,112, 163,18,124,145,4,230,142,86,66,120,211,18,125,164,197,46,144,78,104,229, 100,40,15,49,39,198,33,107,68,136,39,52,114,178,20,73,24,147,237,38,38,117, 11,90,36,65,57,163,149,144,164,68,196,159,38,134,19,46,105,56,226,150,68, 157,160,3,200,147,228,208,194,92,32,124,137,62,49,11,90,36,65,57,163,149, 178,166,74,68,159,105,49,51,168,90,209,34,9,205,28,173,149,65,82,36,249,34, 9,205,28,173,175,170,54,68,159,105,49,75,164,19,154,57,91,95,88,84,137,62, 49,13,164,201,43,111,235,141,145,39,218,76,76,234,27,73,146,86,223,216,17, 34,79,135,117,35,43,115,236,139,145,39,218,76,71,235,169,25,91,159,104,60, 137,62,12,19,37,178,182,42,68,159,105,49,15,160,153,45,149,193,18,36,248, 199,54,103,182,190,232,185,18,125,164,196,206,185,179,61,181,247,133,200, 147,225,104,181,243,4,4,109,191,190,58,68,159,105,49,23,180,90,249,130,2, 54,223,224,67,152,147,230,8,8,217,12,16,121,18,124,193,1,27,101,131,131,56, 7,38,193,198,72,0,0,0,0,0,0,0,0,198,231,240,134,39,63,136,151,95,63,136,49, 89,252,66,98,243,248,133,96,132,185,5,224,32,36,201,41,248,200,213,249,0, 131,64,7,39,192,218,148,124,137,74,216,231,198,227,141,182,124,78,40,217, 231,197,227,4,213,227,192,159,72,10,5,21,218,138,120,74,129,124,36,98,232, 228,74,81,62,160,20,10,107,181,21,114,32,105,137,194,70,46,142,68,165,19, 235,1,64,170,187,81,119,34,66,146,36,104,137,194,70,46,142,68,165,19,236,1, 64,174,187,81,95,37,134,204,23,225,35,23,71,34,82,137,246,128,160,89,93, 168,167,147,195,201,194,70,46,142,68,165,19,238,1,64,182,187,81,71,105,20, 19,177,139,163,145,41,68,16,7,6,15,82,70,72,115,96,0,93,105,160,0,0,0,0,91, 60,149,195,200,194,8,134,149,216,114,1,128,83,192,144,8,194,195,16,12,168, 110,20,120,12,141,22,16,120,12,100,22,12,120,28,78,99,192,41,224,136,115, 36,14,100,197,213,245,193,48,189,112,40,2,237,96,175,131,117,2,178,112,145, 139,163,145,131,114,70,46,142,218,27,182,72,197,209,219,56,26,53,161,166, 28,1,204,178,10,14,38,78,44,141,52,207,31,0,0,21,64,129,100,180,8,148,145, 92,203,176,160,226,100,226,200,211,76,241,240,0,1,84,2,131,137,147,142,41, 100,73,199,192,0,5,88,6,13,10,82,70,62,0,0,42,66,88,115,18,124,67,103,177, 69,49,130,12,73,242,136,108,246,40,165,177,6,36,248,134,207,71,90,138,99, 68,152,147,229,16,217,232,235,81,75,130,12,73,241,13,158,158,149,20,199,9, 49,39,202,33,179,211,210,162,151,69,24,147,225,86,224,79,79,74,138,94,20, 98,79,133,91,129,61,109,74,41,124,60,137,62,33,179,216,166,216,193,18,36, 249,68,54,123,20,218,216,137,18,124,67,103,163,173,77,177,162,100,73,242, 136,108,244,117,169,181,193,18,36,248,134,207,79,74,155,99,132,200,147,229, 16,217,233,233,83,107,162,164,73,240,171,112,39,167,165,77,175,10,145,39, 194,173,192,158,182,165,54,191,153,51,72,71,161,196,201,45,167,146,59,68, 89,24,70,206,0,0,7,129,248,0,0,0,1,153,51,104,71,161,196,201,45,167,146,59, 68,89,24,70,206,0,0,7,129,248,0,0,0,1,153,51,136,71,161,196,201,45,167,146, 59,68,89,24,70,206,0,0,7,129,248,0,0,0,1,153,51,168,71,161,196,201,45,167, 146,59,68,89,24,70,206,0,0,0,2,0,0,0,0,1,153,51,200,71,161,196,201,45,167, 146,59,68,89,24,70,206,0,0,0,2,0,0,0,0,1,153,51,232,71,161,196,201,45,167, 146,59,68,89,24,70,206,0,0,0,130,0,0,0,0,1,153,52,8,71,161,196,201,45,167, 146,59,68,89,24,70,206,0,0,0,130,0,0,0,0,1,153,52,40,71,161,196,201,45,167, 146,59,68,89,24,70,206,0,0,0,130,0,0,0,0,1,153,52,72,71,161,196,201,45,167, 146,59,68,89,24,70,206,0,0,1,2,0,0,0,0,1,135,52,102,32,76,72,1,246,136,235, 103,177,69,1,17,32,7,196,54,123,20,82,88,200,144,3,237,17,214,207,71,91, 171,37,20,65,145,32,7,218,35,173,158,142,183,66,74,41,16,92,72,1,241,13, 158,142,183,86,74,41,48,92,72,1,241,13,158,142,183,66,74,41,80,100,72,1, 246,136,235,103,167,165,213,146,138,40,200,144,3,237,17,214,207,79,75,161, 37,20,138,46,36,0,248,134,207,79,75,171,37,20,154,46,36,0,248,134,207,79, 75,161,37,20,170,46,36,0,248,85,184,19,234,201,69,24,92,72,1,240,171,112, 39,208,146,138,70,25,18,0,124,27,168,21,147,171,37,20,113,145,32,7,193,186, 129,89,58,18,81,72,226,162,64,15,180,71,91,62,172,148,90,0,168,144,3,237, 17,214,207,161,37,22,144,38,36,0,248,134,207,171,37,22,160,38,36,0,248,134, 207,161,37,22,176,42,209,68,201,218,35,173,158,197,54,4,218,40,153,56,134, 207,98,155,75,27,104,162,100,237,17,214,207,71,91,171,37,54,65,182,138,38, 78,209,29,108,244,117,186,18,83,104,131,45,20,76,156,67,103,163,173,213, 146,155,76,25,104,162,100,226,27,61,29,110,132,148,218,160,219,69,19,39, 104,142,182,122,122,93,89,41,178,141,180,81,50,118,136,235,103,167,165,208, 146,155,69,25,104,162,100,226,27,61,61,46,172,148,218,104,203,69,19,39,16, 217,233,233,116,36,166,213,70,90,40,153,56,85,184,19,234,201,77,152,101, 162,137,147,133,91,129,62,132,148,218,48,219,69,19,39,6,234,5,100,234,201, 77,156,109,162,137,147,131,117,2,178,116,36,166,209,197,218,40,153,59,68, 117,179,234,201,78,32,11,180,81,50,118,136,235,103,208,146,156,72,21,104, 162,100,226,27,62,172,148,226,128,171,69,19,39,16,217,244,36,167,22,53,123, 102,53,155,80,2,21,11,94,201,128,196,133,0,185,80,32,56,156,199,130,36,160, 72,16,78,126,54,48,5,146,208,34,82,72,1,109,20,76,155,120,28,34,1,225,32,5, 95,130,160,52,171,138,69,132,234,219,163,161,2,197,172,9,0,89,86,214,236, 31,86,221,40,8,69,220,199,253,231,63,95,193,122,183,27,72,144,17,197,125, 207,255,160,138,217,67,117,110,54,142,129,32,61,229,237,159,135,114,147,10, 130,235,209,3,236,132,37,0,96,181,17,80,63,101,8,207,71,107,74,4,245,7,49, 254,105,219,251,48,94,202,17,158,148,9,234,15,99,252,211,183,246,98,159, 129,228,176,192,185,127,46,155,185,41,197,13,55,38,3,127,255,20,138,160, 192,25,106,8,8,1,58,90,130,64,128,146,27,168,37,8,9,129,186,130,96,160,152, 27,165,171,64,32,131,25,234,10,64,65,17,11,212,19,133,18,243,167,165,163, 32,24,157,45,65,64,6,75,191,80,80,66,149,110,116,117,5,8,41,240,247,79,72, 188,8,134,81,122,84,1,173,198,212,20,48,139,113,180,181,5,36,42,220,109,29, 13,65,74,6,192,95,76,188,6,196,55,78,188,6,247,91,86,136,26,32,104,220,205, 72,1,98,234,52,122,130,136,18,72,51,117,68,3,146,27,168,40,161,37,8,207,80, 81,129,204,13,212,20,112,179,141,26,45,65,75,112,20,43,193,25,19,66,128, 153,78,40,105,144,92,104,152,131,124,27,253,128,0,10,116,3,68,146,163,9, 128,0,10,102,3,138,145,137,27,60,0,0,82,129,7,2,4,16,7,2,70,143,178,203, 164,237,35,14,25,10,134,147,143,139,158,72,207,28,54,77,47,109,13,55,113, 120,96,196,159,29,102,241,241,115,201,25,227,131,36,133,20,62,110,143,17, 16,113,137,62,62,46,155,167,135,147,142,47,44,151,79,221,64,98,37,194,94, 100,108,144,21,147,140,73,168,228,19,17,124,73,82,54,124,37,230,70,201,14, 108,185,36,155,14,243,243,83,212,69,131,132,4,12,137,114,168,37,166,145,7, 10,4,28,200,14,12,40,56,153,56,178,52,211,60,124,0,0,85,0,160,226,100,227, 138,89,18,113,240,0,1,86,1,131,66,148,145,143,128,0,10,144,93,134,0,0,43, 80,17,42,4,17,136,49,73,19,49,134,16,143,67,137,146,91,79,36,118,136,178, 48,141,156,0,0,15,3,240,0,0,0,3,49,135,16,143,67,137,146,91,79,36,118,136, 178,48,141,156,0,0,15,3,240,0,0,0,5,20,5,173,194,227,214,4,55,0,0,21,196,7, 122,192,134,241,197,192,0,5,121,25,140,64,132,122,28,76,146,218,121,35,180, 69,145,132,108,224,0,0,120,31,128,0,0,0,25,140,72,132,122,28,76,146,218, 121,35,180,69,145,132,108,224,0,0,0,32,0,0,0,0,25,140,80,132,122,28,76,146, 218,121,35,180,69,145,132,108,224,0,0,0,32,0,0,0,0,25,140,88,132,122,28,76, 146,218,121,35,180,69,145,132,108,224,0,0,8,32,0,0,0,0,25,140,96,132,122, 28,76,146,218,121,35,180,69,145,132,108,224,0,0,8,32,0,0,0,0,25,140,104, 132,122,28,76,146,218,121,35,180,69,145,132,108,224,0,0,8,32,0,0,0,0,25, 140,112,132,122,28,76,146,218,121,35,180,69,145,132,108,224,0,0,16,32,0,0, 0,0,16,113,225,0,48,156,209,2,122,244,5,34,92,35,68,225,161,166,218,16,33, 18,224,104,82,146,59,50,5,7,19,39,22,70,154,103,215,32,28,78,99,193,18,80, 70,131,165,1,205,34,8,35,68,225,161,166,239,255,4,12,70,137,195,39,248,73, 7,78,3,154,102,16,70,137,195,67,77,223,248,1,74,9,129,125,255,130,9,65,154, 232,147,161,115,59,255,5,64,195,32,156,50,126,197,14,2,3,107,173,213,0, }; #else #error invalid endianness defines #endif #endif /* DUK_USE_ROM_OBJECTS */ /* automatic undefs */ #undef DUK__REFCINIT #line 1 "duk_error_macros.c" /* * Error and fatal handling. */ /* #include duk_internal.h -> already included */ #define DUK__ERRFMT_BUFSIZE 256 /* size for formatting buffers */ #if defined(DUK_USE_VERBOSE_ERRORS) DUK_INTERNAL DUK_COLD void duk_err_handle_error_fmt(duk_hthread *thr, const char *filename, duk_uint_t line_and_code, const char *fmt, ...) { va_list ap; char msg[DUK__ERRFMT_BUFSIZE]; va_start(ap, fmt); (void) DUK_VSNPRINTF(msg, sizeof(msg), fmt, ap); msg[sizeof(msg) - 1] = (char) 0; duk_err_create_and_throw(thr, (duk_errcode_t) (line_and_code >> 24), msg, filename, (duk_int_t) (line_and_code & 0x00ffffffL)); va_end(ap); /* dead code, but ensures portability (see Linux man page notes) */ } DUK_INTERNAL DUK_COLD void duk_err_handle_error(duk_hthread *thr, const char *filename, duk_uint_t line_and_code, const char *msg) { duk_err_create_and_throw(thr, (duk_errcode_t) (line_and_code >> 24), msg, filename, (duk_int_t) (line_and_code & 0x00ffffffL)); } #else /* DUK_USE_VERBOSE_ERRORS */ DUK_INTERNAL DUK_COLD void duk_err_handle_error(duk_hthread *thr, duk_errcode_t code) { duk_err_create_and_throw(thr, code); } #endif /* DUK_USE_VERBOSE_ERRORS */ /* * Error throwing helpers */ #if defined(DUK_USE_VERBOSE_ERRORS) #if defined(DUK_USE_PARANOID_ERRORS) DUK_INTERNAL DUK_COLD void duk_err_require_type_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t idx, const char *expect_name) { DUK_ERROR_RAW_FMT3(thr, filename, linenumber, DUK_ERR_TYPE_ERROR, "%s required, found %s (stack index %ld)", expect_name, duk_get_type_name(thr, idx), (long) idx); } #else DUK_INTERNAL DUK_COLD void duk_err_require_type_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t idx, const char *expect_name) { DUK_ERROR_RAW_FMT3(thr, filename, linenumber, DUK_ERR_TYPE_ERROR, "%s required, found %s (stack index %ld)", expect_name, duk_push_string_readable(thr, idx), (long) idx); } #endif DUK_INTERNAL DUK_COLD void duk_err_error_internal(duk_hthread *thr, const char *filename, duk_int_t linenumber) { DUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_ERROR, DUK_STR_INTERNAL_ERROR); } DUK_INTERNAL DUK_COLD void duk_err_error_alloc_failed(duk_hthread *thr, const char *filename, duk_int_t linenumber) { DUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_ERROR, DUK_STR_ALLOC_FAILED); } DUK_INTERNAL DUK_COLD void duk_err_error(duk_hthread *thr, const char *filename, duk_int_t linenumber, const char *message) { DUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_ERROR, message); } DUK_INTERNAL DUK_COLD void duk_err_range(duk_hthread *thr, const char *filename, duk_int_t linenumber, const char *message) { DUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_RANGE_ERROR, message); } DUK_INTERNAL DUK_COLD void duk_err_range_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t idx) { DUK_ERROR_RAW_FMT1(thr, filename, linenumber, DUK_ERR_RANGE_ERROR, "invalid stack index %ld", (long) (idx)); } DUK_INTERNAL DUK_COLD void duk_err_range_push_beyond(duk_hthread *thr, const char *filename, duk_int_t linenumber) { DUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_RANGE_ERROR, DUK_STR_PUSH_BEYOND_ALLOC_STACK); } DUK_INTERNAL DUK_COLD void duk_err_type_invalid_args(duk_hthread *thr, const char *filename, duk_int_t linenumber) { DUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_TYPE_ERROR, DUK_STR_INVALID_ARGS); } DUK_INTERNAL DUK_COLD void duk_err_type_invalid_state(duk_hthread *thr, const char *filename, duk_int_t linenumber) { DUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_TYPE_ERROR, DUK_STR_INVALID_STATE); } DUK_INTERNAL DUK_COLD void duk_err_type_invalid_trap_result(duk_hthread *thr, const char *filename, duk_int_t linenumber) { DUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_TYPE_ERROR, DUK_STR_INVALID_TRAP_RESULT); } #else /* The file/line arguments are NULL and 0, they're ignored by DUK_ERROR_RAW() * when non-verbose errors are used. */ DUK_NORETURN(DUK_LOCAL_DECL void duk__err_shared(duk_hthread *thr, duk_errcode_t code)); DUK_LOCAL void duk__err_shared(duk_hthread *thr, duk_errcode_t code) { DUK_ERROR_RAW(thr, NULL, 0, code, NULL); } DUK_INTERNAL DUK_COLD void duk_err_error(duk_hthread *thr) { duk__err_shared(thr, DUK_ERR_ERROR); } DUK_INTERNAL DUK_COLD void duk_err_range(duk_hthread *thr) { duk__err_shared(thr, DUK_ERR_RANGE_ERROR); } DUK_INTERNAL DUK_COLD void duk_err_eval(duk_hthread *thr) { duk__err_shared(thr, DUK_ERR_EVAL_ERROR); } DUK_INTERNAL DUK_COLD void duk_err_reference(duk_hthread *thr) { duk__err_shared(thr, DUK_ERR_REFERENCE_ERROR); } DUK_INTERNAL DUK_COLD void duk_err_syntax(duk_hthread *thr) { duk__err_shared(thr, DUK_ERR_SYNTAX_ERROR); } DUK_INTERNAL DUK_COLD void duk_err_type(duk_hthread *thr) { duk__err_shared(thr, DUK_ERR_TYPE_ERROR); } DUK_INTERNAL DUK_COLD void duk_err_uri(duk_hthread *thr) { duk__err_shared(thr, DUK_ERR_URI_ERROR); } #endif /* * Default fatal error handler */ DUK_INTERNAL DUK_COLD void duk_default_fatal_handler(void *udata, const char *msg) { DUK_UNREF(udata); DUK_UNREF(msg); #if defined(DUK_USE_FATAL_HANDLER) /* duk_config.h provided a custom default fatal handler. */ DUK_D(DUK_DPRINT("custom default fatal error handler called: %s", msg ? msg : "NULL")); DUK_USE_FATAL_HANDLER(udata, msg); #else /* Default behavior is to abort() on error. There's no printout * which makes this awkward, so it's always recommended to use an * explicit fatal error handler. * * ==================================================================== * NOTE: If you are seeing this, you are most likely dealing with an * uncaught error. You should provide a fatal error handler in Duktape * heap creation, and should consider using a protected call as your * first call into an empty Duktape context to properly handle errors. * See: * - http://duktape.org/guide.html#error-handling * - http://wiki.duktape.org/HowtoFatalErrors.html * - http://duktape.org/api.html#taglist-protected * ==================================================================== */ DUK_D(DUK_DPRINT("built-in default fatal error handler called: %s", msg ? msg : "NULL")); DUK_ABORT(); #endif DUK_D(DUK_DPRINT("fatal error handler returned, enter forever loop")); for (;;) { /* Loop forever to ensure we don't return. */ } } /* automatic undefs */ #undef DUK__ERRFMT_BUFSIZE #line 1 "duk_unicode_support.c" /* * Various Unicode help functions for character classification predicates, * case conversion, decoding, etc. */ /* #include duk_internal.h -> already included */ /* * Fast path tables */ #if defined(DUK_USE_IDCHAR_FASTPATH) DUK_INTERNAL const duk_int8_t duk_is_idchar_tab[128] = { /* 0: not IdentifierStart or IdentifierPart * 1: IdentifierStart and IdentifierPart * -1: IdentifierPart only */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00...0x0f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10...0x1f */ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20...0x2f */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, /* 0x30...0x3f */ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x40...0x4f */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 0x50...0x5f */ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x60...0x6f */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 /* 0x70...0x7f */ }; #endif /* * XUTF-8 and CESU-8 encoding/decoding */ DUK_INTERNAL duk_small_int_t duk_unicode_get_xutf8_length(duk_ucodepoint_t cp) { duk_uint_fast32_t x = (duk_uint_fast32_t) cp; if (x < 0x80UL) { /* 7 bits */ return 1; } else if (x < 0x800UL) { /* 11 bits */ return 2; } else if (x < 0x10000UL) { /* 16 bits */ return 3; } else if (x < 0x200000UL) { /* 21 bits */ return 4; } else if (x < 0x4000000UL) { /* 26 bits */ return 5; } else if (x < (duk_ucodepoint_t) 0x80000000UL) { /* 31 bits */ return 6; } else { /* 36 bits */ return 7; } } #if defined(DUK_USE_ASSERTIONS) DUK_INTERNAL duk_small_int_t duk_unicode_get_cesu8_length(duk_ucodepoint_t cp) { duk_uint_fast32_t x = (duk_uint_fast32_t) cp; if (x < 0x80UL) { /* 7 bits */ return 1; } else if (x < 0x800UL) { /* 11 bits */ return 2; } else if (x < 0x10000UL) { /* 16 bits */ return 3; } else { /* Encoded as surrogate pair, each encoding to 3 bytes for * 6 bytes total. Codepoints above U+10FFFF encode as 6 bytes * too, see duk_unicode_encode_cesu8(). */ return 3 + 3; } } #endif /* DUK_USE_ASSERTIONS */ DUK_INTERNAL const duk_uint8_t duk_unicode_xutf8_markers[7] = { 0x00, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe }; /* Encode to extended UTF-8; 'out' must have space for at least * DUK_UNICODE_MAX_XUTF8_LENGTH bytes. Allows encoding of any * 32-bit (unsigned) codepoint. */ DUK_INTERNAL duk_small_int_t duk_unicode_encode_xutf8(duk_ucodepoint_t cp, duk_uint8_t *out) { duk_uint_fast32_t x = (duk_uint_fast32_t) cp; duk_small_int_t len; duk_uint8_t marker; duk_small_int_t i; len = duk_unicode_get_xutf8_length(cp); DUK_ASSERT(len > 0); marker = duk_unicode_xutf8_markers[len - 1]; /* 64-bit OK because always >= 0 */ i = len; DUK_ASSERT(i > 0); do { i--; if (i > 0) { out[i] = (duk_uint8_t) (0x80 + (x & 0x3f)); x >>= 6; } else { /* Note: masking of 'x' is not necessary because of * range check and shifting -> no bits overlapping * the marker should be set. */ out[0] = (duk_uint8_t) (marker + x); } } while (i > 0); return len; } /* Encode to CESU-8; 'out' must have space for at least * DUK_UNICODE_MAX_CESU8_LENGTH bytes; codepoints above U+10FFFF * will encode to garbage but won't overwrite the output buffer. */ DUK_INTERNAL duk_small_int_t duk_unicode_encode_cesu8(duk_ucodepoint_t cp, duk_uint8_t *out) { duk_uint_fast32_t x = (duk_uint_fast32_t) cp; duk_small_int_t len; if (x < 0x80UL) { out[0] = (duk_uint8_t) x; len = 1; } else if (x < 0x800UL) { out[0] = (duk_uint8_t) (0xc0 + ((x >> 6) & 0x1f)); out[1] = (duk_uint8_t) (0x80 + (x & 0x3f)); len = 2; } else if (x < 0x10000UL) { /* surrogate pairs get encoded here */ out[0] = (duk_uint8_t) (0xe0 + ((x >> 12) & 0x0f)); out[1] = (duk_uint8_t) (0x80 + ((x >> 6) & 0x3f)); out[2] = (duk_uint8_t) (0x80 + (x & 0x3f)); len = 3; } else { /* * Unicode codepoints above U+FFFF are encoded as surrogate * pairs here. This ensures that all CESU-8 codepoints are * 16-bit values as expected in Ecmascript. The surrogate * pairs always get a 3-byte encoding (each) in CESU-8. * See: http://en.wikipedia.org/wiki/Surrogate_pair * * 20-bit codepoint, 10 bits (A and B) per surrogate pair: * * x = 0b00000000 0000AAAA AAAAAABB BBBBBBBB * sp1 = 0b110110AA AAAAAAAA (0xd800 + ((x >> 10) & 0x3ff)) * sp2 = 0b110111BB BBBBBBBB (0xdc00 + (x & 0x3ff)) * * Encoded into CESU-8: * * sp1 -> 0b11101101 (0xe0 + ((sp1 >> 12) & 0x0f)) * -> 0b1010AAAA (0x80 + ((sp1 >> 6) & 0x3f)) * -> 0b10AAAAAA (0x80 + (sp1 & 0x3f)) * sp2 -> 0b11101101 (0xe0 + ((sp2 >> 12) & 0x0f)) * -> 0b1011BBBB (0x80 + ((sp2 >> 6) & 0x3f)) * -> 0b10BBBBBB (0x80 + (sp2 & 0x3f)) * * Note that 0x10000 must be subtracted first. The code below * avoids the sp1, sp2 temporaries which saves around 20 bytes * of code. */ x -= 0x10000UL; out[0] = (duk_uint8_t) (0xed); out[1] = (duk_uint8_t) (0xa0 + ((x >> 16) & 0x0f)); out[2] = (duk_uint8_t) (0x80 + ((x >> 10) & 0x3f)); out[3] = (duk_uint8_t) (0xed); out[4] = (duk_uint8_t) (0xb0 + ((x >> 6) & 0x0f)); out[5] = (duk_uint8_t) (0x80 + (x & 0x3f)); len = 6; } return len; } /* Decode helper. Return zero on error. */ DUK_INTERNAL duk_small_int_t duk_unicode_decode_xutf8(duk_hthread *thr, const duk_uint8_t **ptr, const duk_uint8_t *ptr_start, const duk_uint8_t *ptr_end, duk_ucodepoint_t *out_cp) { const duk_uint8_t *p; duk_uint32_t res; duk_uint_fast8_t ch; duk_small_int_t n; DUK_UNREF(thr); p = *ptr; if (p < ptr_start || p >= ptr_end) { goto fail; } /* * UTF-8 decoder which accepts longer than standard byte sequences. * This allows full 32-bit code points to be used. */ ch = (duk_uint_fast8_t) (*p++); if (ch < 0x80) { /* 0xxx xxxx [7 bits] */ res = (duk_uint32_t) (ch & 0x7f); n = 0; } else if (ch < 0xc0) { /* 10xx xxxx -> invalid */ goto fail; } else if (ch < 0xe0) { /* 110x xxxx 10xx xxxx [11 bits] */ res = (duk_uint32_t) (ch & 0x1f); n = 1; } else if (ch < 0xf0) { /* 1110 xxxx 10xx xxxx 10xx xxxx [16 bits] */ res = (duk_uint32_t) (ch & 0x0f); n = 2; } else if (ch < 0xf8) { /* 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx [21 bits] */ res = (duk_uint32_t) (ch & 0x07); n = 3; } else if (ch < 0xfc) { /* 1111 10xx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx [26 bits] */ res = (duk_uint32_t) (ch & 0x03); n = 4; } else if (ch < 0xfe) { /* 1111 110x 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx [31 bits] */ res = (duk_uint32_t) (ch & 0x01); n = 5; } else if (ch < 0xff) { /* 1111 1110 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx [36 bits] */ res = (duk_uint32_t) (0); n = 6; } else { /* 8-byte format could be: * 1111 1111 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx [41 bits] * * However, this format would not have a zero bit following the * leading one bits and would not allow 0xFF to be used as an * "invalid xutf-8" marker for internal keys. Further, 8-byte * encodings (up to 41 bit code points) are not currently needed. */ goto fail; } DUK_ASSERT(p >= ptr_start); /* verified at beginning */ if (p + n > ptr_end) { /* check pointer at end */ goto fail; } while (n > 0) { DUK_ASSERT(p >= ptr_start && p < ptr_end); ch = (duk_uint_fast8_t) (*p++); #if 0 if (ch & 0xc0 != 0x80) { /* not a continuation byte */ p--; *ptr = p; *out_cp = DUK_UNICODE_CP_REPLACEMENT_CHARACTER; return 1; } #endif res = (res << 6) + (duk_uint32_t) (ch & 0x3f); n--; } *ptr = p; *out_cp = res; return 1; fail: return 0; } /* used by e.g. duk_regexp_executor.c, string built-ins */ DUK_INTERNAL duk_ucodepoint_t duk_unicode_decode_xutf8_checked(duk_hthread *thr, const duk_uint8_t **ptr, const duk_uint8_t *ptr_start, const duk_uint8_t *ptr_end) { duk_ucodepoint_t cp; if (duk_unicode_decode_xutf8(thr, ptr, ptr_start, ptr_end, &cp)) { return cp; } DUK_ERROR_INTERNAL(thr); DUK_UNREACHABLE(); return 0; } /* Compute (extended) utf-8 length without codepoint encoding validation, * used for string interning. * * NOTE: This algorithm is performance critical, more so than string hashing * in some cases. It is needed when interning a string and needs to scan * every byte of the string with no skipping. Having an ASCII fast path * is useful if possible in the algorithm. The current algorithms were * chosen from several variants, based on x64 gcc -O2 testing. See: * https://github.com/svaarala/duktape/pull/422 * * NOTE: must match tools/dukutil.py:duk_unicode_unvalidated_utf8_length(). */ #if defined(DUK_USE_PREFER_SIZE) /* Small variant; roughly 150 bytes smaller than the fast variant. */ DUK_INTERNAL duk_size_t duk_unicode_unvalidated_utf8_length(const duk_uint8_t *data, duk_size_t blen) { const duk_uint8_t *p; const duk_uint8_t *p_end; duk_size_t ncont; duk_size_t clen; p = data; p_end = data + blen; ncont = 0; while (p != p_end) { duk_uint8_t x; x = *p++; if (DUK_UNLIKELY(x >= 0x80 && x <= 0xbf)) { ncont++; } } DUK_ASSERT(ncont <= blen); clen = blen - ncont; DUK_ASSERT(clen <= blen); return clen; } #else /* DUK_USE_PREFER_SIZE */ /* This seems like a good overall approach. Fast path for ASCII in 4 byte * blocks. */ DUK_INTERNAL duk_size_t duk_unicode_unvalidated_utf8_length(const duk_uint8_t *data, duk_size_t blen) { const duk_uint8_t *p; const duk_uint8_t *p_end; const duk_uint32_t *p32_end; const duk_uint32_t *p32; duk_size_t ncont; duk_size_t clen; ncont = 0; /* number of continuation (non-initial) bytes in [0x80,0xbf] */ p = data; p_end = data + blen; if (blen < 16) { goto skip_fastpath; } /* Align 'p' to 4; the input data may have arbitrary alignment. * End of string check not needed because blen >= 16. */ while (((duk_size_t) (const void *) p) & 0x03U) { duk_uint8_t x; x = *p++; if (DUK_UNLIKELY(x >= 0x80 && x <= 0xbf)) { ncont++; } } /* Full, aligned 4-byte reads. */ p32_end = (const duk_uint32_t *) (const void *) (p + ((duk_size_t) (p_end - p) & (duk_size_t) (~0x03))); p32 = (const duk_uint32_t *) (const void *) p; while (p32 != (const duk_uint32_t *) p32_end) { duk_uint32_t x; x = *p32++; if (DUK_LIKELY((x & 0x80808080UL) == 0)) { ; /* ASCII fast path */ } else { /* Flip highest bit of each byte which changes * the bit pattern 10xxxxxx into 00xxxxxx which * allows an easy bit mask test. */ x ^= 0x80808080UL; if (DUK_UNLIKELY(!(x & 0xc0000000UL))) { ncont++; } if (DUK_UNLIKELY(!(x & 0x00c00000UL))) { ncont++; } if (DUK_UNLIKELY(!(x & 0x0000c000UL))) { ncont++; } if (DUK_UNLIKELY(!(x & 0x000000c0UL))) { ncont++; } } } p = (const duk_uint8_t *) p32; /* Fall through to handle the rest. */ skip_fastpath: while (p != p_end) { duk_uint8_t x; x = *p++; if (DUK_UNLIKELY(x >= 0x80 && x <= 0xbf)) { ncont++; } } DUK_ASSERT(ncont <= blen); clen = blen - ncont; DUK_ASSERT(clen <= blen); return clen; } #endif /* DUK_USE_PREFER_SIZE */ /* * Unicode range matcher * * Matches a codepoint against a packed bitstream of character ranges. * Used for slow path Unicode matching. */ /* Must match tools/extract_chars.py, generate_match_table3(). */ DUK_LOCAL duk_uint32_t duk__uni_decode_value(duk_bitdecoder_ctx *bd_ctx) { duk_uint32_t t; t = (duk_uint32_t) duk_bd_decode(bd_ctx, 4); if (t <= 0x0eU) { return t; } t = (duk_uint32_t) duk_bd_decode(bd_ctx, 8); if (t <= 0xfdU) { return t + 0x0f; } if (t == 0xfeU) { t = (duk_uint32_t) duk_bd_decode(bd_ctx, 12); return t + 0x0fU + 0xfeU; } else { t = (duk_uint32_t) duk_bd_decode(bd_ctx, 24); return t + 0x0fU + 0xfeU + 0x1000UL; } } DUK_LOCAL duk_small_int_t duk__uni_range_match(const duk_uint8_t *unitab, duk_size_t unilen, duk_codepoint_t cp) { duk_bitdecoder_ctx bd_ctx; duk_codepoint_t prev_re; DUK_MEMZERO(&bd_ctx, sizeof(bd_ctx)); bd_ctx.data = (const duk_uint8_t *) unitab; bd_ctx.length = (duk_size_t) unilen; prev_re = 0; for (;;) { duk_codepoint_t r1, r2; r1 = (duk_codepoint_t) duk__uni_decode_value(&bd_ctx); if (r1 == 0) { break; } r2 = (duk_codepoint_t) duk__uni_decode_value(&bd_ctx); r1 = prev_re + r1; r2 = r1 + r2; prev_re = r2; /* [r1,r2] is the range */ DUK_DDD(DUK_DDDPRINT("duk__uni_range_match: cp=%06lx range=[0x%06lx,0x%06lx]", (unsigned long) cp, (unsigned long) r1, (unsigned long) r2)); if (cp >= r1 && cp <= r2) { return 1; } } return 0; } /* * "WhiteSpace" production check. */ DUK_INTERNAL duk_small_int_t duk_unicode_is_whitespace(duk_codepoint_t cp) { /* * E5 Section 7.2 specifies six characters specifically as * white space: * * 0009;<control>;Cc;0;S;;;;;N;CHARACTER TABULATION;;;; * 000B;<control>;Cc;0;S;;;;;N;LINE TABULATION;;;; * 000C;<control>;Cc;0;WS;;;;;N;FORM FEED (FF);;;; * 0020;SPACE;Zs;0;WS;;;;;N;;;;; * 00A0;NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;NON-BREAKING SPACE;;;; * FEFF;ZERO WIDTH NO-BREAK SPACE;Cf;0;BN;;;;;N;BYTE ORDER MARK;;;; * * It also specifies any Unicode category 'Zs' characters as white * space. These can be extracted with the "tools/extract_chars.py" script. * Current result: * * RAW OUTPUT: * =========== * 0020;SPACE;Zs;0;WS;;;;;N;;;;; * 00A0;NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;NON-BREAKING SPACE;;;; * 1680;OGHAM SPACE MARK;Zs;0;WS;;;;;N;;;;; * 180E;MONGOLIAN VOWEL SEPARATOR;Zs;0;WS;;;;;N;;;;; * 2000;EN QUAD;Zs;0;WS;2002;;;;N;;;;; * 2001;EM QUAD;Zs;0;WS;2003;;;;N;;;;; * 2002;EN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; * 2003;EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; * 2004;THREE-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; * 2005;FOUR-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; * 2006;SIX-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; * 2007;FIGURE SPACE;Zs;0;WS;<noBreak> 0020;;;;N;;;;; * 2008;PUNCTUATION SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; * 2009;THIN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; * 200A;HAIR SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; * 202F;NARROW NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;;;;; * 205F;MEDIUM MATHEMATICAL SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; * 3000;IDEOGRAPHIC SPACE;Zs;0;WS;<wide> 0020;;;;N;;;;; * * RANGES: * ======= * 0x0020 * 0x00a0 * 0x1680 * 0x180e * 0x2000 ... 0x200a * 0x202f * 0x205f * 0x3000 * * A manual decoder (below) is probably most compact for this. */ duk_uint_fast8_t lo; duk_uint_fast32_t hi; /* cp == -1 (EOF) never matches and causes return value 0 */ lo = (duk_uint_fast8_t) (cp & 0xff); hi = (duk_uint_fast32_t) (cp >> 8); /* does not fit into an uchar */ if (hi == 0x0000UL) { if (lo == 0x09U || lo == 0x0bU || lo == 0x0cU || lo == 0x20U || lo == 0xa0U) { return 1; } } else if (hi == 0x0020UL) { if (lo <= 0x0aU || lo == 0x2fU || lo == 0x5fU) { return 1; } } else if (cp == 0x1680L || cp == 0x180eL || cp == 0x3000L || cp == 0xfeffL) { return 1; } return 0; } /* * "LineTerminator" production check. */ DUK_INTERNAL duk_small_int_t duk_unicode_is_line_terminator(duk_codepoint_t cp) { /* * E5 Section 7.3 * * A LineTerminatorSequence essentially merges <CR> <LF> sequences * into a single line terminator. This must be handled by the caller. */ if (cp == 0x000aL || cp == 0x000dL || cp == 0x2028L || cp == 0x2029L) { return 1; } return 0; } /* * "IdentifierStart" production check. */ DUK_INTERNAL duk_small_int_t duk_unicode_is_identifier_start(duk_codepoint_t cp) { /* * E5 Section 7.6: * * IdentifierStart: * UnicodeLetter * $ * _ * \ UnicodeEscapeSequence * * IdentifierStart production has one multi-character production: * * \ UnicodeEscapeSequence * * The '\' character is -not- matched by this function. Rather, the caller * should decode the escape and then call this function to check whether the * decoded character is acceptable (see discussion in E5 Section 7.6). * * The "UnicodeLetter" alternative of the production allows letters * from various Unicode categories. These can be extracted with the * "tools/extract_chars.py" script. * * Because the result has hundreds of Unicode codepoint ranges, matching * for any values >= 0x80 are done using a very slow range-by-range scan * and a packed range format. * * The ASCII portion (codepoints 0x00 ... 0x7f) is fast-pathed below because * it matters the most. The ASCII related ranges of IdentifierStart are: * * 0x0041 ... 0x005a ['A' ... 'Z'] * 0x0061 ... 0x007a ['a' ... 'z'] * 0x0024 ['$'] * 0x005f ['_'] */ /* ASCII (and EOF) fast path -- quick accept and reject */ if (cp <= 0x7fL) { #if defined(DUK_USE_IDCHAR_FASTPATH) return (cp >= 0) && (duk_is_idchar_tab[cp] > 0); #else if ((cp >= 'a' && cp <= 'z') || (cp >= 'A' && cp <= 'Z') || cp == '_' || cp == '$') { return 1; } return 0; #endif } /* Non-ASCII slow path (range-by-range linear comparison), very slow */ #if defined(DUK_USE_SOURCE_NONBMP) if (duk__uni_range_match(duk_unicode_ids_noa, (duk_size_t) sizeof(duk_unicode_ids_noa), (duk_codepoint_t) cp)) { return 1; } return 0; #else if (cp < 0x10000L) { if (duk__uni_range_match(duk_unicode_ids_noabmp, sizeof(duk_unicode_ids_noabmp), (duk_codepoint_t) cp)) { return 1; } return 0; } else { /* without explicit non-BMP support, assume non-BMP characters * are always accepted as identifier characters. */ return 1; } #endif } /* * "IdentifierPart" production check. */ DUK_INTERNAL duk_small_int_t duk_unicode_is_identifier_part(duk_codepoint_t cp) { /* * E5 Section 7.6: * * IdentifierPart: * IdentifierStart * UnicodeCombiningMark * UnicodeDigit * UnicodeConnectorPunctuation * <ZWNJ> [U+200C] * <ZWJ> [U+200D] * * IdentifierPart production has one multi-character production * as part of its IdentifierStart alternative. The '\' character * of an escape sequence is not matched here, see discussion in * duk_unicode_is_identifier_start(). * * To match non-ASCII characters (codepoints >= 0x80), a very slow * linear range-by-range scan is used. The codepoint is first compared * to the IdentifierStart ranges, and if it doesn't match, then to a * set consisting of code points in IdentifierPart but not in * IdentifierStart. This is done to keep the unicode range data small, * at the expense of speed. * * The ASCII fast path consists of: * * 0x0030 ... 0x0039 ['0' ... '9', UnicodeDigit] * 0x0041 ... 0x005a ['A' ... 'Z', IdentifierStart] * 0x0061 ... 0x007a ['a' ... 'z', IdentifierStart] * 0x0024 ['$', IdentifierStart] * 0x005f ['_', IdentifierStart and * UnicodeConnectorPunctuation] * * UnicodeCombiningMark has no code points <= 0x7f. * * The matching code reuses the "identifier start" tables, and then * consults a separate range set for characters in "identifier part" * but not in "identifier start". These can be extracted with the * "tools/extract_chars.py" script. * * UnicodeCombiningMark -> categories Mn, Mc * UnicodeDigit -> categories Nd * UnicodeConnectorPunctuation -> categories Pc */ /* ASCII (and EOF) fast path -- quick accept and reject */ if (cp <= 0x7fL) { #if defined(DUK_USE_IDCHAR_FASTPATH) return (cp >= 0) && (duk_is_idchar_tab[cp] != 0); #else if ((cp >= 'a' && cp <= 'z') || (cp >= 'A' && cp <= 'Z') || (cp >= '0' && cp <= '9') || cp == '_' || cp == '$') { return 1; } return 0; #endif } /* Non-ASCII slow path (range-by-range linear comparison), very slow */ #if defined(DUK_USE_SOURCE_NONBMP) if (duk__uni_range_match(duk_unicode_ids_noa, sizeof(duk_unicode_ids_noa), (duk_codepoint_t) cp) || duk__uni_range_match(duk_unicode_idp_m_ids_noa, sizeof(duk_unicode_idp_m_ids_noa), (duk_codepoint_t) cp)) { return 1; } return 0; #else if (cp < 0x10000L) { if (duk__uni_range_match(duk_unicode_ids_noabmp, sizeof(duk_unicode_ids_noabmp), (duk_codepoint_t) cp) || duk__uni_range_match(duk_unicode_idp_m_ids_noabmp, sizeof(duk_unicode_idp_m_ids_noabmp), (duk_codepoint_t) cp)) { return 1; } return 0; } else { /* without explicit non-BMP support, assume non-BMP characters * are always accepted as identifier characters. */ return 1; } #endif } /* * Unicode letter check. */ DUK_INTERNAL duk_small_int_t duk_unicode_is_letter(duk_codepoint_t cp) { /* * Unicode letter is now taken to be the categories: * * Lu, Ll, Lt, Lm, Lo * * (Not sure if this is exactly correct.) * * The ASCII fast path consists of: * * 0x0041 ... 0x005a ['A' ... 'Z'] * 0x0061 ... 0x007a ['a' ... 'z'] */ /* ASCII (and EOF) fast path -- quick accept and reject */ if (cp <= 0x7fL) { if ((cp >= 'a' && cp <= 'z') || (cp >= 'A' && cp <= 'Z')) { return 1; } return 0; } /* Non-ASCII slow path (range-by-range linear comparison), very slow */ #if defined(DUK_USE_SOURCE_NONBMP) if (duk__uni_range_match(duk_unicode_ids_noa, sizeof(duk_unicode_ids_noa), (duk_codepoint_t) cp) && !duk__uni_range_match(duk_unicode_ids_m_let_noa, sizeof(duk_unicode_ids_m_let_noa), (duk_codepoint_t) cp)) { return 1; } return 0; #else if (cp < 0x10000L) { if (duk__uni_range_match(duk_unicode_ids_noabmp, sizeof(duk_unicode_ids_noabmp), (duk_codepoint_t) cp) && !duk__uni_range_match(duk_unicode_ids_m_let_noabmp, sizeof(duk_unicode_ids_m_let_noabmp), (duk_codepoint_t) cp)) { return 1; } return 0; } else { /* without explicit non-BMP support, assume non-BMP characters * are always accepted as letters. */ return 1; } #endif } /* * Complex case conversion helper which decodes a bit-packed conversion * control stream generated by tools/extract_caseconv.py. The conversion * is very slow because it runs through the conversion data in a linear * fashion to save space (which is why ASCII characters have a special * fast path before arriving here). * * The particular bit counts etc have been determined experimentally to * be small but still sufficient, and must match the Python script * (tools/extract_caseconv.py). * * The return value is the case converted codepoint or -1 if the conversion * results in multiple characters (this is useful for regexp Canonicalization * operation). If 'buf' is not NULL, the result codepoint(s) are also * appended to the hbuffer. * * Context and locale specific rules must be checked before consulting * this function. */ DUK_LOCAL duk_codepoint_t duk__slow_case_conversion(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_codepoint_t cp, duk_bitdecoder_ctx *bd_ctx) { duk_small_int_t skip = 0; duk_small_int_t n; duk_small_int_t t; duk_small_int_t count; duk_codepoint_t tmp_cp; duk_codepoint_t start_i; duk_codepoint_t start_o; DUK_ASSERT(bd_ctx != NULL); DUK_UNREF(thr); DUK_DDD(DUK_DDDPRINT("slow case conversion for codepoint: %ld", (long) cp)); /* range conversion with a "skip" */ DUK_DDD(DUK_DDDPRINT("checking ranges")); for (;;) { skip++; n = (duk_small_int_t) duk_bd_decode(bd_ctx, 6); if (n == 0x3f) { /* end marker */ break; } DUK_DDD(DUK_DDDPRINT("skip=%ld, n=%ld", (long) skip, (long) n)); while (n--) { start_i = (duk_codepoint_t) duk_bd_decode(bd_ctx, 16); start_o = (duk_codepoint_t) duk_bd_decode(bd_ctx, 16); count = (duk_small_int_t) duk_bd_decode(bd_ctx, 7); DUK_DDD(DUK_DDDPRINT("range: start_i=%ld, start_o=%ld, count=%ld, skip=%ld", (long) start_i, (long) start_o, (long) count, (long) skip)); if (cp >= start_i) { tmp_cp = cp - start_i; /* always >= 0 */ if (tmp_cp < (duk_codepoint_t) count * (duk_codepoint_t) skip && (tmp_cp % (duk_codepoint_t) skip) == 0) { DUK_DDD(DUK_DDDPRINT("range matches input codepoint")); cp = start_o + tmp_cp; goto single; } } } } /* 1:1 conversion */ n = (duk_small_int_t) duk_bd_decode(bd_ctx, 7); DUK_DDD(DUK_DDDPRINT("checking 1:1 conversions (count %ld)", (long) n)); while (n--) { start_i = (duk_codepoint_t) duk_bd_decode(bd_ctx, 16); start_o = (duk_codepoint_t) duk_bd_decode(bd_ctx, 16); DUK_DDD(DUK_DDDPRINT("1:1 conversion %ld -> %ld", (long) start_i, (long) start_o)); if (cp == start_i) { DUK_DDD(DUK_DDDPRINT("1:1 matches input codepoint")); cp = start_o; goto single; } } /* complex, multicharacter conversion */ n = (duk_small_int_t) duk_bd_decode(bd_ctx, 7); DUK_DDD(DUK_DDDPRINT("checking 1:n conversions (count %ld)", (long) n)); while (n--) { start_i = (duk_codepoint_t) duk_bd_decode(bd_ctx, 16); t = (duk_small_int_t) duk_bd_decode(bd_ctx, 2); DUK_DDD(DUK_DDDPRINT("1:n conversion %ld -> %ld chars", (long) start_i, (long) t)); if (cp == start_i) { DUK_DDD(DUK_DDDPRINT("1:n matches input codepoint")); if (bw != NULL) { while (t--) { tmp_cp = (duk_codepoint_t) duk_bd_decode(bd_ctx, 16); DUK_BW_WRITE_RAW_XUTF8(thr, bw, (duk_ucodepoint_t) tmp_cp); } } return -1; } else { while (t--) { (void) duk_bd_decode(bd_ctx, 16); } } } /* default: no change */ DUK_DDD(DUK_DDDPRINT("no rule matches, output is same as input")); /* fall through */ single: if (bw != NULL) { DUK_BW_WRITE_RAW_XUTF8(thr, bw, (duk_ucodepoint_t) cp); } return cp; } /* * Case conversion helper, with context/local sensitivity. * For proper case conversion, one needs to know the character * and the preceding and following characters, as well as * locale/language. */ /* XXX: add 'language' argument when locale/language sensitive rule * support added. */ DUK_LOCAL duk_codepoint_t duk__case_transform_helper(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_codepoint_t cp, duk_codepoint_t prev, duk_codepoint_t next, duk_bool_t uppercase) { duk_bitdecoder_ctx bd_ctx; /* fast path for ASCII */ if (cp < 0x80L) { /* XXX: there are language sensitive rules for the ASCII range. * If/when language/locale support is implemented, they need to * be implemented here for the fast path. There are no context * sensitive rules for ASCII range. */ if (uppercase) { if (cp >= 'a' && cp <= 'z') { cp = cp - 'a' + 'A'; } } else { if (cp >= 'A' && cp <= 'Z') { cp = cp - 'A' + 'a'; } } if (bw != NULL) { DUK_BW_WRITE_RAW_U8(thr, bw, (duk_uint8_t) cp); } return cp; } /* context and locale specific rules which cannot currently be represented * in the caseconv bitstream: hardcoded rules in C */ if (uppercase) { /* XXX: turkish / azeri */ } else { /* * Final sigma context specific rule. This is a rather tricky * rule and this handling is probably not 100% correct now. * The rule is not locale/language specific so it is supported. */ if (cp == 0x03a3L && /* U+03A3 = GREEK CAPITAL LETTER SIGMA */ duk_unicode_is_letter(prev) && /* prev exists and is not a letter */ !duk_unicode_is_letter(next)) { /* next does not exist or next is not a letter */ /* Capital sigma occurred at "end of word", lowercase to * U+03C2 = GREEK SMALL LETTER FINAL SIGMA. Otherwise * fall through and let the normal rules lowercase it to * U+03C3 = GREEK SMALL LETTER SIGMA. */ cp = 0x03c2L; goto singlechar; } /* XXX: lithuanian not implemented */ /* XXX: lithuanian, explicit dot rules */ /* XXX: turkish / azeri, lowercase rules */ } /* 1:1 or special conversions, but not locale/context specific: script generated rules */ DUK_MEMZERO(&bd_ctx, sizeof(bd_ctx)); if (uppercase) { bd_ctx.data = (const duk_uint8_t *) duk_unicode_caseconv_uc; bd_ctx.length = (duk_size_t) sizeof(duk_unicode_caseconv_uc); } else { bd_ctx.data = (const duk_uint8_t *) duk_unicode_caseconv_lc; bd_ctx.length = (duk_size_t) sizeof(duk_unicode_caseconv_lc); } return duk__slow_case_conversion(thr, bw, cp, &bd_ctx); singlechar: if (bw != NULL) { DUK_BW_WRITE_RAW_XUTF8(thr, bw, (duk_ucodepoint_t) cp); } return cp; /* unused now, not needed until Turkish/Azeri */ #if 0 nochar: return -1; #endif } /* * Replace valstack top with case converted version. */ DUK_INTERNAL void duk_unicode_case_convert_string(duk_hthread *thr, duk_bool_t uppercase) { duk_hstring *h_input; duk_bufwriter_ctx bw_alloc; duk_bufwriter_ctx *bw; const duk_uint8_t *p, *p_start, *p_end; duk_codepoint_t prev, curr, next; h_input = duk_require_hstring(thr, -1); /* Accept symbols. */ DUK_ASSERT(h_input != NULL); bw = &bw_alloc; DUK_BW_INIT_PUSHBUF(thr, bw, DUK_HSTRING_GET_BYTELEN(h_input)); /* [ ... input buffer ] */ p_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_input); p_end = p_start + DUK_HSTRING_GET_BYTELEN(h_input); p = p_start; prev = -1; DUK_UNREF(prev); curr = -1; next = -1; for (;;) { prev = curr; curr = next; next = -1; if (p < p_end) { next = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(thr, &p, p_start, p_end); } else { /* end of input and last char has been processed */ if (curr < 0) { break; } } /* on first round, skip */ if (curr >= 0) { /* XXX: could add a fast path to process chunks of input codepoints, * but relative benefit would be quite small. */ /* Ensure space for maximum multi-character result; estimate is overkill. */ DUK_BW_ENSURE(thr, bw, 8 * DUK_UNICODE_MAX_XUTF8_LENGTH); duk__case_transform_helper(thr, bw, (duk_codepoint_t) curr, prev, next, uppercase); } } DUK_BW_COMPACT(thr, bw); (void) duk_buffer_to_string(thr, -1); /* Safe, output is encoded. */ /* invalidates h_buf pointer */ duk_remove_m2(thr); } #if defined(DUK_USE_REGEXP_SUPPORT) /* * Canonicalize() abstract operation needed for canonicalization of individual * codepoints during regexp compilation and execution, see E5 Section 15.10.2.8. * Note that codepoints are canonicalized one character at a time, so no context * specific rules can apply. Locale specific rules can apply, though. */ DUK_INTERNAL duk_codepoint_t duk_unicode_re_canonicalize_char(duk_hthread *thr, duk_codepoint_t cp) { #if defined(DUK_USE_REGEXP_CANON_WORKAROUND) /* Fast canonicalization lookup at the cost of 128kB footprint. */ DUK_ASSERT(cp >= 0); DUK_UNREF(thr); if (DUK_LIKELY(cp < 0x10000L)) { return (duk_codepoint_t) duk_unicode_re_canon_lookup[cp]; } return cp; #else /* DUK_USE_REGEXP_CANON_WORKAROUND */ duk_codepoint_t y; y = duk__case_transform_helper(thr, NULL, /* NULL is allowed, no output */ cp, /* curr char */ -1, /* prev char */ -1, /* next char */ 1); /* uppercase */ if ((y < 0) || (cp >= 0x80 && y < 0x80)) { /* multiple codepoint conversion or non-ASCII mapped to ASCII * --> leave as is. */ return cp; } return y; #endif /* DUK_USE_REGEXP_CANON_WORKAROUND */ } /* * E5 Section 15.10.2.6 "IsWordChar" abstract operation. Assume * x < 0 for characters read outside the string. */ DUK_INTERNAL duk_small_int_t duk_unicode_re_is_wordchar(duk_codepoint_t x) { /* * Note: the description in E5 Section 15.10.2.6 has a typo, it * contains 'A' twice and lacks 'a'; the intent is [0-9a-zA-Z_]. */ if ((x >= '0' && x <= '9') || (x >= 'a' && x <= 'z') || (x >= 'A' && x <= 'Z') || (x == '_')) { return 1; } return 0; } /* * Regexp range tables */ /* exposed because lexer needs these too */ DUK_INTERNAL const duk_uint16_t duk_unicode_re_ranges_digit[2] = { (duk_uint16_t) 0x0030UL, (duk_uint16_t) 0x0039UL, }; DUK_INTERNAL const duk_uint16_t duk_unicode_re_ranges_white[22] = { (duk_uint16_t) 0x0009UL, (duk_uint16_t) 0x000DUL, (duk_uint16_t) 0x0020UL, (duk_uint16_t) 0x0020UL, (duk_uint16_t) 0x00A0UL, (duk_uint16_t) 0x00A0UL, (duk_uint16_t) 0x1680UL, (duk_uint16_t) 0x1680UL, (duk_uint16_t) 0x180EUL, (duk_uint16_t) 0x180EUL, (duk_uint16_t) 0x2000UL, (duk_uint16_t) 0x200AUL, (duk_uint16_t) 0x2028UL, (duk_uint16_t) 0x2029UL, (duk_uint16_t) 0x202FUL, (duk_uint16_t) 0x202FUL, (duk_uint16_t) 0x205FUL, (duk_uint16_t) 0x205FUL, (duk_uint16_t) 0x3000UL, (duk_uint16_t) 0x3000UL, (duk_uint16_t) 0xFEFFUL, (duk_uint16_t) 0xFEFFUL, }; DUK_INTERNAL const duk_uint16_t duk_unicode_re_ranges_wordchar[8] = { (duk_uint16_t) 0x0030UL, (duk_uint16_t) 0x0039UL, (duk_uint16_t) 0x0041UL, (duk_uint16_t) 0x005AUL, (duk_uint16_t) 0x005FUL, (duk_uint16_t) 0x005FUL, (duk_uint16_t) 0x0061UL, (duk_uint16_t) 0x007AUL, }; DUK_INTERNAL const duk_uint16_t duk_unicode_re_ranges_not_digit[4] = { (duk_uint16_t) 0x0000UL, (duk_uint16_t) 0x002FUL, (duk_uint16_t) 0x003AUL, (duk_uint16_t) 0xFFFFUL, }; DUK_INTERNAL const duk_uint16_t duk_unicode_re_ranges_not_white[24] = { (duk_uint16_t) 0x0000UL, (duk_uint16_t) 0x0008UL, (duk_uint16_t) 0x000EUL, (duk_uint16_t) 0x001FUL, (duk_uint16_t) 0x0021UL, (duk_uint16_t) 0x009FUL, (duk_uint16_t) 0x00A1UL, (duk_uint16_t) 0x167FUL, (duk_uint16_t) 0x1681UL, (duk_uint16_t) 0x180DUL, (duk_uint16_t) 0x180FUL, (duk_uint16_t) 0x1FFFUL, (duk_uint16_t) 0x200BUL, (duk_uint16_t) 0x2027UL, (duk_uint16_t) 0x202AUL, (duk_uint16_t) 0x202EUL, (duk_uint16_t) 0x2030UL, (duk_uint16_t) 0x205EUL, (duk_uint16_t) 0x2060UL, (duk_uint16_t) 0x2FFFUL, (duk_uint16_t) 0x3001UL, (duk_uint16_t) 0xFEFEUL, (duk_uint16_t) 0xFF00UL, (duk_uint16_t) 0xFFFFUL, }; DUK_INTERNAL const duk_uint16_t duk_unicode_re_ranges_not_wordchar[10] = { (duk_uint16_t) 0x0000UL, (duk_uint16_t) 0x002FUL, (duk_uint16_t) 0x003AUL, (duk_uint16_t) 0x0040UL, (duk_uint16_t) 0x005BUL, (duk_uint16_t) 0x005EUL, (duk_uint16_t) 0x0060UL, (duk_uint16_t) 0x0060UL, (duk_uint16_t) 0x007BUL, (duk_uint16_t) 0xFFFFUL, }; #endif /* DUK_USE_REGEXP_SUPPORT */ #line 1 "duk_util_misc.c" /* * Misc util stuff */ /* #include duk_internal.h -> already included */ /* * Lowercase digits for radix values 2 to 36. Also doubles as lowercase * hex nybble table. */ DUK_INTERNAL const duk_uint8_t duk_lc_digits[36] = { DUK_ASC_0, DUK_ASC_1, DUK_ASC_2, DUK_ASC_3, DUK_ASC_4, DUK_ASC_5, DUK_ASC_6, DUK_ASC_7, DUK_ASC_8, DUK_ASC_9, DUK_ASC_LC_A, DUK_ASC_LC_B, DUK_ASC_LC_C, DUK_ASC_LC_D, DUK_ASC_LC_E, DUK_ASC_LC_F, DUK_ASC_LC_G, DUK_ASC_LC_H, DUK_ASC_LC_I, DUK_ASC_LC_J, DUK_ASC_LC_K, DUK_ASC_LC_L, DUK_ASC_LC_M, DUK_ASC_LC_N, DUK_ASC_LC_O, DUK_ASC_LC_P, DUK_ASC_LC_Q, DUK_ASC_LC_R, DUK_ASC_LC_S, DUK_ASC_LC_T, DUK_ASC_LC_U, DUK_ASC_LC_V, DUK_ASC_LC_W, DUK_ASC_LC_X, DUK_ASC_LC_Y, DUK_ASC_LC_Z }; DUK_INTERNAL const duk_uint8_t duk_uc_nybbles[16] = { DUK_ASC_0, DUK_ASC_1, DUK_ASC_2, DUK_ASC_3, DUK_ASC_4, DUK_ASC_5, DUK_ASC_6, DUK_ASC_7, DUK_ASC_8, DUK_ASC_9, DUK_ASC_UC_A, DUK_ASC_UC_B, DUK_ASC_UC_C, DUK_ASC_UC_D, DUK_ASC_UC_E, DUK_ASC_UC_F }; /* * Table for hex decoding ASCII hex digits */ DUK_INTERNAL const duk_int8_t duk_hex_dectab[256] = { /* -1 if invalid */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x00-0x0f */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x10-0x1f */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x20-0x2f */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, /* 0x30-0x3f */ -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x40-0x4f */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x50-0x5f */ -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x60-0x6f */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x70-0x7f */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x80-0x8f */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x90-0x9f */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xa0-0xaf */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb0-0xbf */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xc0-0xcf */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd0-0xdf */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xe0-0xef */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 /* 0xf0-0xff */ }; #if defined(DUK_USE_HEX_FASTPATH) /* Preshifted << 4. Must use 16-bit entry to allow negative value signaling. */ DUK_INTERNAL const duk_int16_t duk_hex_dectab_shift4[256] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x00-0x0f */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x10-0x1f */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x20-0x2f */ 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, -1, -1, -1, -1, -1, -1, /* 0x30-0x3f */ -1, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0, 0xf0, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x40-0x4f */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x50-0x5f */ -1, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0, 0xf0, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x60-0x6f */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x70-0x7f */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x80-0x8f */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x90-0x9f */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xa0-0xaf */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb0-0xbf */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xc0-0xcf */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd0-0xdf */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xe0-0xef */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 /* 0xf0-0xff */ }; #endif /* * Table for hex encoding bytes */ #if defined(DUK_USE_HEX_FASTPATH) /* Lookup to encode one byte directly into 2 characters: * * def genhextab(bswap): * for i in xrange(256): * t = chr(i).encode('hex') * if bswap: * t = t[1] + t[0] * print('0x' + t.encode('hex') + 'U') * print('big endian'); genhextab(False) * print('little endian'); genhextab(True) */ DUK_INTERNAL const duk_uint16_t duk_hex_enctab[256] = { #if defined(DUK_USE_INTEGER_BE) 0x3030U, 0x3031U, 0x3032U, 0x3033U, 0x3034U, 0x3035U, 0x3036U, 0x3037U, 0x3038U, 0x3039U, 0x3061U, 0x3062U, 0x3063U, 0x3064U, 0x3065U, 0x3066U, 0x3130U, 0x3131U, 0x3132U, 0x3133U, 0x3134U, 0x3135U, 0x3136U, 0x3137U, 0x3138U, 0x3139U, 0x3161U, 0x3162U, 0x3163U, 0x3164U, 0x3165U, 0x3166U, 0x3230U, 0x3231U, 0x3232U, 0x3233U, 0x3234U, 0x3235U, 0x3236U, 0x3237U, 0x3238U, 0x3239U, 0x3261U, 0x3262U, 0x3263U, 0x3264U, 0x3265U, 0x3266U, 0x3330U, 0x3331U, 0x3332U, 0x3333U, 0x3334U, 0x3335U, 0x3336U, 0x3337U, 0x3338U, 0x3339U, 0x3361U, 0x3362U, 0x3363U, 0x3364U, 0x3365U, 0x3366U, 0x3430U, 0x3431U, 0x3432U, 0x3433U, 0x3434U, 0x3435U, 0x3436U, 0x3437U, 0x3438U, 0x3439U, 0x3461U, 0x3462U, 0x3463U, 0x3464U, 0x3465U, 0x3466U, 0x3530U, 0x3531U, 0x3532U, 0x3533U, 0x3534U, 0x3535U, 0x3536U, 0x3537U, 0x3538U, 0x3539U, 0x3561U, 0x3562U, 0x3563U, 0x3564U, 0x3565U, 0x3566U, 0x3630U, 0x3631U, 0x3632U, 0x3633U, 0x3634U, 0x3635U, 0x3636U, 0x3637U, 0x3638U, 0x3639U, 0x3661U, 0x3662U, 0x3663U, 0x3664U, 0x3665U, 0x3666U, 0x3730U, 0x3731U, 0x3732U, 0x3733U, 0x3734U, 0x3735U, 0x3736U, 0x3737U, 0x3738U, 0x3739U, 0x3761U, 0x3762U, 0x3763U, 0x3764U, 0x3765U, 0x3766U, 0x3830U, 0x3831U, 0x3832U, 0x3833U, 0x3834U, 0x3835U, 0x3836U, 0x3837U, 0x3838U, 0x3839U, 0x3861U, 0x3862U, 0x3863U, 0x3864U, 0x3865U, 0x3866U, 0x3930U, 0x3931U, 0x3932U, 0x3933U, 0x3934U, 0x3935U, 0x3936U, 0x3937U, 0x3938U, 0x3939U, 0x3961U, 0x3962U, 0x3963U, 0x3964U, 0x3965U, 0x3966U, 0x6130U, 0x6131U, 0x6132U, 0x6133U, 0x6134U, 0x6135U, 0x6136U, 0x6137U, 0x6138U, 0x6139U, 0x6161U, 0x6162U, 0x6163U, 0x6164U, 0x6165U, 0x6166U, 0x6230U, 0x6231U, 0x6232U, 0x6233U, 0x6234U, 0x6235U, 0x6236U, 0x6237U, 0x6238U, 0x6239U, 0x6261U, 0x6262U, 0x6263U, 0x6264U, 0x6265U, 0x6266U, 0x6330U, 0x6331U, 0x6332U, 0x6333U, 0x6334U, 0x6335U, 0x6336U, 0x6337U, 0x6338U, 0x6339U, 0x6361U, 0x6362U, 0x6363U, 0x6364U, 0x6365U, 0x6366U, 0x6430U, 0x6431U, 0x6432U, 0x6433U, 0x6434U, 0x6435U, 0x6436U, 0x6437U, 0x6438U, 0x6439U, 0x6461U, 0x6462U, 0x6463U, 0x6464U, 0x6465U, 0x6466U, 0x6530U, 0x6531U, 0x6532U, 0x6533U, 0x6534U, 0x6535U, 0x6536U, 0x6537U, 0x6538U, 0x6539U, 0x6561U, 0x6562U, 0x6563U, 0x6564U, 0x6565U, 0x6566U, 0x6630U, 0x6631U, 0x6632U, 0x6633U, 0x6634U, 0x6635U, 0x6636U, 0x6637U, 0x6638U, 0x6639U, 0x6661U, 0x6662U, 0x6663U, 0x6664U, 0x6665U, 0x6666U #else /* DUK_USE_INTEGER_BE */ 0x3030U, 0x3130U, 0x3230U, 0x3330U, 0x3430U, 0x3530U, 0x3630U, 0x3730U, 0x3830U, 0x3930U, 0x6130U, 0x6230U, 0x6330U, 0x6430U, 0x6530U, 0x6630U, 0x3031U, 0x3131U, 0x3231U, 0x3331U, 0x3431U, 0x3531U, 0x3631U, 0x3731U, 0x3831U, 0x3931U, 0x6131U, 0x6231U, 0x6331U, 0x6431U, 0x6531U, 0x6631U, 0x3032U, 0x3132U, 0x3232U, 0x3332U, 0x3432U, 0x3532U, 0x3632U, 0x3732U, 0x3832U, 0x3932U, 0x6132U, 0x6232U, 0x6332U, 0x6432U, 0x6532U, 0x6632U, 0x3033U, 0x3133U, 0x3233U, 0x3333U, 0x3433U, 0x3533U, 0x3633U, 0x3733U, 0x3833U, 0x3933U, 0x6133U, 0x6233U, 0x6333U, 0x6433U, 0x6533U, 0x6633U, 0x3034U, 0x3134U, 0x3234U, 0x3334U, 0x3434U, 0x3534U, 0x3634U, 0x3734U, 0x3834U, 0x3934U, 0x6134U, 0x6234U, 0x6334U, 0x6434U, 0x6534U, 0x6634U, 0x3035U, 0x3135U, 0x3235U, 0x3335U, 0x3435U, 0x3535U, 0x3635U, 0x3735U, 0x3835U, 0x3935U, 0x6135U, 0x6235U, 0x6335U, 0x6435U, 0x6535U, 0x6635U, 0x3036U, 0x3136U, 0x3236U, 0x3336U, 0x3436U, 0x3536U, 0x3636U, 0x3736U, 0x3836U, 0x3936U, 0x6136U, 0x6236U, 0x6336U, 0x6436U, 0x6536U, 0x6636U, 0x3037U, 0x3137U, 0x3237U, 0x3337U, 0x3437U, 0x3537U, 0x3637U, 0x3737U, 0x3837U, 0x3937U, 0x6137U, 0x6237U, 0x6337U, 0x6437U, 0x6537U, 0x6637U, 0x3038U, 0x3138U, 0x3238U, 0x3338U, 0x3438U, 0x3538U, 0x3638U, 0x3738U, 0x3838U, 0x3938U, 0x6138U, 0x6238U, 0x6338U, 0x6438U, 0x6538U, 0x6638U, 0x3039U, 0x3139U, 0x3239U, 0x3339U, 0x3439U, 0x3539U, 0x3639U, 0x3739U, 0x3839U, 0x3939U, 0x6139U, 0x6239U, 0x6339U, 0x6439U, 0x6539U, 0x6639U, 0x3061U, 0x3161U, 0x3261U, 0x3361U, 0x3461U, 0x3561U, 0x3661U, 0x3761U, 0x3861U, 0x3961U, 0x6161U, 0x6261U, 0x6361U, 0x6461U, 0x6561U, 0x6661U, 0x3062U, 0x3162U, 0x3262U, 0x3362U, 0x3462U, 0x3562U, 0x3662U, 0x3762U, 0x3862U, 0x3962U, 0x6162U, 0x6262U, 0x6362U, 0x6462U, 0x6562U, 0x6662U, 0x3063U, 0x3163U, 0x3263U, 0x3363U, 0x3463U, 0x3563U, 0x3663U, 0x3763U, 0x3863U, 0x3963U, 0x6163U, 0x6263U, 0x6363U, 0x6463U, 0x6563U, 0x6663U, 0x3064U, 0x3164U, 0x3264U, 0x3364U, 0x3464U, 0x3564U, 0x3664U, 0x3764U, 0x3864U, 0x3964U, 0x6164U, 0x6264U, 0x6364U, 0x6464U, 0x6564U, 0x6664U, 0x3065U, 0x3165U, 0x3265U, 0x3365U, 0x3465U, 0x3565U, 0x3665U, 0x3765U, 0x3865U, 0x3965U, 0x6165U, 0x6265U, 0x6365U, 0x6465U, 0x6565U, 0x6665U, 0x3066U, 0x3166U, 0x3266U, 0x3366U, 0x3466U, 0x3566U, 0x3666U, 0x3766U, 0x3866U, 0x3966U, 0x6166U, 0x6266U, 0x6366U, 0x6466U, 0x6566U, 0x6666U #endif /* DUK_USE_INTEGER_BE */ }; #endif /* DUK_USE_HEX_FASTPATH */ /* * Table for base-64 encoding */ #if defined(DUK_USE_BASE64_FASTPATH) DUK_INTERNAL const duk_uint8_t duk_base64_enctab[64] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, /* A...P */ 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, /* Q...f */ 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, /* g...v */ 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f /* w.../ */ }; #endif /* DUK_USE_BASE64_FASTPATH */ /* * Table for base-64 decoding */ #if defined(DUK_USE_BASE64_FASTPATH) DUK_INTERNAL const duk_int8_t duk_base64_dectab[256] = { /* -1 = error, -2 = allowed whitespace, -3 = padding ('='), 0...63 decoded bytes */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -2, -1, -1, -2, -1, -1, /* 0x00...0x0f */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x10...0x1f */ -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, /* 0x20...0x2f */ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -3, -1, -1, /* 0x30...0x3f */ -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, /* 0x40...0x4f */ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, /* 0x50...0x5f */ -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, /* 0x60...0x6f */ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, /* 0x70...0x7f */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x80...0x8f */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x90...0x9f */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xa0...0xaf */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb0...0xbf */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xc0...0xcf */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd0...0xdf */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xe0...0xef */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 /* 0xf0...0xff */ }; #endif /* DUK_USE_BASE64_FASTPATH */ /* * Arbitrary byteswap for potentially unaligned values * * Used to byteswap pointers e.g. in debugger code. */ #if defined(DUK_USE_DEBUGGER_SUPPORT) /* For now only needed by the debugger. */ DUK_INTERNAL void duk_byteswap_bytes(duk_uint8_t *p, duk_small_uint_t len) { duk_uint8_t tmp; duk_uint8_t *q = p + len - 1; while (p - q < 0) { tmp = *p; *p = *q; *q = tmp; p++; q--; } } #endif /* * Miscellaneous coercion / clamping helpers. */ /* Check whether a duk_double_t is a whole number in the 32-bit range (reject * negative zero), and if so, return a duk_int32_t. * For compiler use: don't allow negative zero as it will cause trouble with * LDINT+LDINTX, positive zero is OK. */ DUK_INTERNAL duk_bool_t duk_is_whole_get_int32_nonegzero(duk_double_t x, duk_int32_t *ival) { duk_int32_t t; t = (duk_int32_t) x; if (!((duk_double_t) t == x)) { return 0; } if (t == 0) { duk_double_union du; du.d = x; if (DUK_DBLUNION_HAS_SIGNBIT(&du)) { return 0; } } *ival = t; return 1; } /* Check whether a duk_double_t is a whole number in the 32-bit range, and if * so, return a duk_int32_t. */ DUK_INTERNAL duk_bool_t duk_is_whole_get_int32(duk_double_t x, duk_int32_t *ival) { duk_int32_t t; t = (duk_int32_t) x; if (!((duk_double_t) t == x)) { return 0; } *ival = t; return 1; } /* * IEEE double checks */ DUK_INTERNAL duk_bool_t duk_double_is_anyinf(duk_double_t x) { duk_double_union du; du.d = x; return DUK_DBLUNION_IS_ANYINF(&du); } DUK_INTERNAL duk_bool_t duk_double_is_posinf(duk_double_t x) { duk_double_union du; du.d = x; return DUK_DBLUNION_IS_POSINF(&du); } DUK_INTERNAL duk_bool_t duk_double_is_neginf(duk_double_t x) { duk_double_union du; du.d = x; return DUK_DBLUNION_IS_NEGINF(&du); } DUK_INTERNAL duk_bool_t duk_double_is_nan(duk_double_t x) { duk_double_union du; du.d = x; /* Assumes we're dealing with a Duktape internal NaN which is * NaN normalized if duk_tval requires it. */ DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du)); return DUK_DBLUNION_IS_NAN(&du); } DUK_INTERNAL duk_bool_t duk_double_is_nan_or_zero(duk_double_t x) { duk_double_union du; du.d = x; /* Assumes we're dealing with a Duktape internal NaN which is * NaN normalized if duk_tval requires it. */ DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du)); return DUK_DBLUNION_IS_NAN(&du) || DUK_DBLUNION_IS_ANYZERO(&du); } DUK_INTERNAL duk_bool_t duk_double_is_nan_or_inf(duk_double_t x) { duk_double_union du; du.d = x; /* If exponent is 0x7FF the argument is either a NaN or an * infinity. We don't need to check any other fields. */ #if defined(DUK_USE_64BIT_OPS) #if defined(DUK_USE_DOUBLE_ME) return (du.ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x000000007ff00000)) == DUK_U64_CONSTANT(0x000000007ff00000); #else return (du.ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x7ff0000000000000)) == DUK_U64_CONSTANT(0x7ff0000000000000); #endif #else return (du.ui[DUK_DBL_IDX_UI0] & 0x7ff00000UL) == 0x7ff00000UL; #endif } DUK_INTERNAL duk_bool_t duk_double_is_nan_zero_inf(duk_double_t x) { duk_double_union du; #if defined(DUK_USE_64BIT_OPS) duk_uint64_t t; #else duk_uint32_t t; #endif du.d = x; #if defined(DUK_USE_64BIT_OPS) #if defined(DUK_USE_DOUBLE_ME) t = du.ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x000000007ff00000); if (t == DUK_U64_CONSTANT(0x0000000000000000)) { t = du.ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x0000000080000000); return t == 0; } if (t == DUK_U64_CONSTANT(0x000000007ff00000)) { return 1; } #else t = du.ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x7ff0000000000000); if (t == DUK_U64_CONSTANT(0x0000000000000000)) { t = du.ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x8000000000000000); return t == 0; } if (t == DUK_U64_CONSTANT(0x7ff0000000000000)) { return 1; } #endif #else t = du.ui[DUK_DBL_IDX_UI0] & 0x7ff00000UL; if (t == 0x00000000UL) { return DUK_DBLUNION_IS_ANYZERO(&du); } if (t == 0x7ff00000UL) { return 1; } #endif return 0; } DUK_INTERNAL duk_small_uint_t duk_double_signbit(duk_double_t x) { duk_double_union du; du.d = x; return (duk_small_uint_t) DUK_DBLUNION_GET_SIGNBIT(&du); } DUK_INTERNAL duk_double_t duk_double_trunc_towards_zero(duk_double_t x) { /* XXX: optimize */ duk_small_uint_t s = duk_double_signbit(x); x = DUK_FLOOR(DUK_FABS(x)); /* truncate towards zero */ if (s) { x = -x; } return x; } DUK_INTERNAL duk_bool_t duk_double_same_sign(duk_double_t x, duk_double_t y) { duk_double_union du1; duk_double_union du2; du1.d = x; du2.d = y; return (((du1.ui[DUK_DBL_IDX_UI0] ^ du2.ui[DUK_DBL_IDX_UI0]) & 0x80000000UL) == 0); } DUK_INTERNAL duk_double_t duk_double_fmin(duk_double_t x, duk_double_t y) { /* Doesn't replicate fmin() behavior exactly: for fmin() if one * argument is a NaN, the other argument should be returned. * Duktape doesn't rely on this behavior so the replacement can * be simplified. */ return (x < y ? x : y); } DUK_INTERNAL duk_double_t duk_double_fmax(duk_double_t x, duk_double_t y) { /* Doesn't replicate fmax() behavior exactly: for fmax() if one * argument is a NaN, the other argument should be returned. * Duktape doesn't rely on this behavior so the replacement can * be simplified. */ return (x > y ? x : y); } #line 1 "duk_hobject_class.c" /* * Hobject Ecmascript [[Class]]. */ /* #include duk_internal.h -> already included */ #if (DUK_STRIDX_UC_ARGUMENTS > 255) #error constant too large #endif #if (DUK_STRIDX_ARRAY > 255) #error constant too large #endif #if (DUK_STRIDX_UC_BOOLEAN > 255) #error constant too large #endif #if (DUK_STRIDX_DATE > 255) #error constant too large #endif #if (DUK_STRIDX_UC_ERROR > 255) #error constant too large #endif #if (DUK_STRIDX_UC_FUNCTION > 255) #error constant too large #endif #if (DUK_STRIDX_JSON > 255) #error constant too large #endif #if (DUK_STRIDX_MATH > 255) #error constant too large #endif #if (DUK_STRIDX_UC_NUMBER > 255) #error constant too large #endif #if (DUK_STRIDX_UC_OBJECT > 255) #error constant too large #endif #if (DUK_STRIDX_REG_EXP > 255) #error constant too large #endif #if (DUK_STRIDX_UC_STRING > 255) #error constant too large #endif #if (DUK_STRIDX_GLOBAL > 255) #error constant too large #endif #if (DUK_STRIDX_OBJ_ENV > 255) #error constant too large #endif #if (DUK_STRIDX_DEC_ENV > 255) #error constant too large #endif #if (DUK_STRIDX_UC_POINTER > 255) #error constant too large #endif #if (DUK_STRIDX_UC_THREAD > 255) #error constant too large #endif #if (DUK_STRIDX_ARRAY_BUFFER > 255) #error constant too large #endif #if (DUK_STRIDX_DATA_VIEW > 255) #error constant too large #endif #if (DUK_STRIDX_INT8_ARRAY > 255) #error constant too large #endif #if (DUK_STRIDX_UINT8_ARRAY > 255) #error constant too large #endif #if (DUK_STRIDX_UINT8_CLAMPED_ARRAY > 255) #error constant too large #endif #if (DUK_STRIDX_INT16_ARRAY > 255) #error constant too large #endif #if (DUK_STRIDX_UINT16_ARRAY > 255) #error constant too large #endif #if (DUK_STRIDX_INT32_ARRAY > 255) #error constant too large #endif #if (DUK_STRIDX_UINT32_ARRAY > 255) #error constant too large #endif #if (DUK_STRIDX_FLOAT32_ARRAY > 255) #error constant too large #endif #if (DUK_STRIDX_FLOAT64_ARRAY > 255) #error constant too large #endif #if (DUK_STRIDX_EMPTY_STRING > 255) #error constant too large #endif /* Note: assumes that these string indexes are 8-bit, genstrings.py must ensure that */ DUK_INTERNAL duk_uint8_t duk_class_number_to_stridx[32] = { DUK_STRIDX_EMPTY_STRING, /* NONE, intentionally empty */ DUK_STRIDX_UC_OBJECT, DUK_STRIDX_ARRAY, DUK_STRIDX_UC_FUNCTION, DUK_STRIDX_UC_ARGUMENTS, DUK_STRIDX_UC_BOOLEAN, DUK_STRIDX_DATE, DUK_STRIDX_UC_ERROR, DUK_STRIDX_JSON, DUK_STRIDX_MATH, DUK_STRIDX_UC_NUMBER, DUK_STRIDX_REG_EXP, DUK_STRIDX_UC_STRING, DUK_STRIDX_GLOBAL, DUK_STRIDX_UC_SYMBOL, DUK_STRIDX_OBJ_ENV, DUK_STRIDX_DEC_ENV, DUK_STRIDX_UC_POINTER, DUK_STRIDX_UC_THREAD, DUK_STRIDX_ARRAY_BUFFER, DUK_STRIDX_DATA_VIEW, DUK_STRIDX_INT8_ARRAY, DUK_STRIDX_UINT8_ARRAY, DUK_STRIDX_UINT8_CLAMPED_ARRAY, DUK_STRIDX_INT16_ARRAY, DUK_STRIDX_UINT16_ARRAY, DUK_STRIDX_INT32_ARRAY, DUK_STRIDX_UINT32_ARRAY, DUK_STRIDX_FLOAT32_ARRAY, DUK_STRIDX_FLOAT64_ARRAY, DUK_STRIDX_EMPTY_STRING, /* UNUSED, intentionally empty */ DUK_STRIDX_EMPTY_STRING, /* UNUSED, intentionally empty */ }; #line 1 "duk_alloc_default.c" /* * Default allocation functions. * * Assumes behavior such as malloc allowing zero size, yielding * a NULL or a unique pointer which is a no-op for free. */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_PROVIDE_DEFAULT_ALLOC_FUNCTIONS) DUK_INTERNAL void *duk_default_alloc_function(void *udata, duk_size_t size) { void *res; DUK_UNREF(udata); res = DUK_ANSI_MALLOC(size); DUK_DDD(DUK_DDDPRINT("default alloc function: %lu -> %p", (unsigned long) size, (void *) res)); return res; } DUK_INTERNAL void *duk_default_realloc_function(void *udata, void *ptr, duk_size_t newsize) { void *res; DUK_UNREF(udata); res = DUK_ANSI_REALLOC(ptr, newsize); DUK_DDD(DUK_DDDPRINT("default realloc function: %p %lu -> %p", (void *) ptr, (unsigned long) newsize, (void *) res)); return res; } DUK_INTERNAL void duk_default_free_function(void *udata, void *ptr) { DUK_DDD(DUK_DDDPRINT("default free function: %p", (void *) ptr)); DUK_UNREF(udata); DUK_ANSI_FREE(ptr); } #endif /* DUK_USE_PROVIDE_DEFAULT_ALLOC_FUNCTIONS */ #line 1 "duk_api_buffer.c" /* * Buffer */ /* #include duk_internal.h -> already included */ DUK_EXTERNAL void *duk_resize_buffer(duk_hthread *thr, duk_idx_t idx, duk_size_t new_size) { duk_hbuffer_dynamic *h; DUK_ASSERT_API_ENTRY(thr); h = (duk_hbuffer_dynamic *) duk_require_hbuffer(thr, idx); DUK_ASSERT(h != NULL); if (!(DUK_HBUFFER_HAS_DYNAMIC(h) && !DUK_HBUFFER_HAS_EXTERNAL(h))) { DUK_ERROR_TYPE(thr, DUK_STR_WRONG_BUFFER_TYPE); } /* maximum size check is handled by callee */ duk_hbuffer_resize(thr, h, new_size); return DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, h); } DUK_EXTERNAL void *duk_steal_buffer(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size) { duk_hbuffer_dynamic *h; void *ptr; duk_size_t sz; DUK_ASSERT_API_ENTRY(thr); h = (duk_hbuffer_dynamic *) duk_require_hbuffer(thr, idx); DUK_ASSERT(h != NULL); if (!(DUK_HBUFFER_HAS_DYNAMIC(h) && !DUK_HBUFFER_HAS_EXTERNAL(h))) { DUK_ERROR_TYPE(thr, DUK_STR_WRONG_BUFFER_TYPE); } /* Forget the previous allocation, setting size to 0 and alloc to * NULL. Caller is responsible for freeing the previous allocation. * Getting the allocation and clearing it is done in the same API * call to avoid any chance of a realloc. */ ptr = DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, h); sz = DUK_HBUFFER_DYNAMIC_GET_SIZE(h); if (out_size) { *out_size = sz; } DUK_HBUFFER_DYNAMIC_SET_DATA_PTR_NULL(thr->heap, h); DUK_HBUFFER_DYNAMIC_SET_SIZE(h, 0); return ptr; } DUK_EXTERNAL void duk_config_buffer(duk_hthread *thr, duk_idx_t idx, void *ptr, duk_size_t len) { duk_hbuffer_external *h; DUK_ASSERT_API_ENTRY(thr); h = (duk_hbuffer_external *) duk_require_hbuffer(thr, idx); DUK_ASSERT(h != NULL); if (!DUK_HBUFFER_HAS_EXTERNAL(h)) { DUK_ERROR_TYPE(thr, DUK_STR_WRONG_BUFFER_TYPE); } DUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(h)); DUK_HBUFFER_EXTERNAL_SET_DATA_PTR(thr->heap, h, ptr); DUK_HBUFFER_EXTERNAL_SET_SIZE(h, len); } #line 1 "duk_api_bytecode.c" /* * Bytecode dump/load * * The bytecode load primitive is more important performance-wise than the * dump primitive. * * Unlike most Duktape API calls, bytecode dump/load is not guaranteed to be * memory safe for invalid arguments - caller beware! There's little point * in trying to achieve memory safety unless bytecode instructions are also * validated which is not easy to do with indirect register references etc. */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_BYTECODE_DUMP_SUPPORT) #define DUK__SER_MARKER 0xbf #define DUK__SER_STRING 0x00 #define DUK__SER_NUMBER 0x01 #define DUK__BYTECODE_INITIAL_ALLOC 256 #define DUK__NO_FORMALS 0xffffffffUL /* * Dump/load helpers, xxx_raw() helpers do no buffer checks */ DUK_LOCAL duk_uint8_t *duk__load_string_raw(duk_hthread *thr, duk_uint8_t *p) { duk_uint32_t len; len = DUK_RAW_READ_U32_BE(p); duk_push_lstring(thr, (const char *) p, len); p += len; return p; } DUK_LOCAL duk_uint8_t *duk__load_buffer_raw(duk_hthread *thr, duk_uint8_t *p) { duk_uint32_t len; duk_uint8_t *buf; len = DUK_RAW_READ_U32_BE(p); buf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, (duk_size_t) len); DUK_ASSERT(buf != NULL); DUK_MEMCPY((void *) buf, (const void *) p, (size_t) len); p += len; return p; } DUK_LOCAL duk_uint8_t *duk__dump_hstring_raw(duk_uint8_t *p, duk_hstring *h) { duk_size_t len; duk_uint32_t tmp32; DUK_ASSERT(h != NULL); len = DUK_HSTRING_GET_BYTELEN(h); DUK_ASSERT(len <= 0xffffffffUL); /* string limits */ tmp32 = (duk_uint32_t) len; DUK_RAW_WRITE_U32_BE(p, tmp32); DUK_MEMCPY((void *) p, (const void *) DUK_HSTRING_GET_DATA(h), len); p += len; return p; } DUK_LOCAL duk_uint8_t *duk__dump_hbuffer_raw(duk_hthread *thr, duk_uint8_t *p, duk_hbuffer *h) { duk_size_t len; duk_uint32_t tmp32; DUK_ASSERT(thr != NULL); DUK_ASSERT(h != NULL); DUK_UNREF(thr); len = DUK_HBUFFER_GET_SIZE(h); DUK_ASSERT(len <= 0xffffffffUL); /* buffer limits */ tmp32 = (duk_uint32_t) len; DUK_RAW_WRITE_U32_BE(p, tmp32); DUK_MEMCPY((void *) p, (const void *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h), len); p += len; return p; } DUK_LOCAL duk_uint8_t *duk__dump_string_prop(duk_hthread *thr, duk_uint8_t *p, duk_bufwriter_ctx *bw_ctx, duk_hobject *func, duk_small_uint_t stridx) { duk_hstring *h_str; duk_tval *tv; tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) func, DUK_HTHREAD_GET_STRING(thr, stridx)); if (tv != NULL && DUK_TVAL_IS_STRING(tv)) { h_str = DUK_TVAL_GET_STRING(tv); DUK_ASSERT(h_str != NULL); } else { h_str = DUK_HTHREAD_STRING_EMPTY_STRING(thr); DUK_ASSERT(h_str != NULL); } DUK_ASSERT(DUK_HSTRING_MAX_BYTELEN <= 0x7fffffffUL); /* ensures no overflow */ p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U + DUK_HSTRING_GET_BYTELEN(h_str), p); p = duk__dump_hstring_raw(p, h_str); return p; } DUK_LOCAL duk_uint8_t *duk__dump_buffer_prop(duk_hthread *thr, duk_uint8_t *p, duk_bufwriter_ctx *bw_ctx, duk_hobject *func, duk_small_uint_t stridx) { duk_tval *tv; tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) func, DUK_HTHREAD_GET_STRING(thr, stridx)); if (tv != NULL && DUK_TVAL_IS_BUFFER(tv)) { duk_hbuffer *h_buf; h_buf = DUK_TVAL_GET_BUFFER(tv); DUK_ASSERT(h_buf != NULL); DUK_ASSERT(DUK_HBUFFER_MAX_BYTELEN <= 0x7fffffffUL); /* ensures no overflow */ p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U + DUK_HBUFFER_GET_SIZE(h_buf), p); p = duk__dump_hbuffer_raw(thr, p, h_buf); } else { p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U, p); DUK_RAW_WRITE_U32_BE(p, 0); } return p; } DUK_LOCAL duk_uint8_t *duk__dump_uint32_prop(duk_hthread *thr, duk_uint8_t *p, duk_bufwriter_ctx *bw_ctx, duk_hobject *func, duk_small_uint_t stridx, duk_uint32_t def_value) { duk_tval *tv; duk_uint32_t val; tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) func, DUK_HTHREAD_GET_STRING(thr, stridx)); if (tv != NULL && DUK_TVAL_IS_NUMBER(tv)) { val = (duk_uint32_t) DUK_TVAL_GET_NUMBER(tv); } else { val = def_value; } p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U, p); DUK_RAW_WRITE_U32_BE(p, val); return p; } DUK_LOCAL duk_uint8_t *duk__dump_varmap(duk_hthread *thr, duk_uint8_t *p, duk_bufwriter_ctx *bw_ctx, duk_hobject *func) { duk_tval *tv; tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) func, DUK_HTHREAD_STRING_INT_VARMAP(thr)); if (tv != NULL && DUK_TVAL_IS_OBJECT(tv)) { duk_hobject *h; duk_uint_fast32_t i; h = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h != NULL); /* We know _Varmap only has own properties so walk property * table directly. We also know _Varmap is dense and all * values are numbers; assert for these. GC and finalizers * shouldn't affect _Varmap so side effects should be fine. */ for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ENEXT(h); i++) { duk_hstring *key; duk_tval *tv_val; duk_uint32_t val; key = DUK_HOBJECT_E_GET_KEY(thr->heap, h, i); DUK_ASSERT(key != NULL); /* _Varmap is dense */ DUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, h, i)); tv_val = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, h, i); DUK_ASSERT(tv_val != NULL); DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_val)); /* known to be number; in fact an integer */ #if defined(DUK_USE_FASTINT) DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv_val)); DUK_ASSERT(DUK_TVAL_GET_FASTINT(tv_val) == (duk_int64_t) DUK_TVAL_GET_FASTINT_U32(tv_val)); /* known to be 32-bit */ val = DUK_TVAL_GET_FASTINT_U32(tv_val); #else val = (duk_uint32_t) DUK_TVAL_GET_NUMBER(tv_val); #endif DUK_ASSERT(DUK_HSTRING_MAX_BYTELEN <= 0x7fffffffUL); /* ensures no overflow */ p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U + DUK_HSTRING_GET_BYTELEN(key) + 4U, p); p = duk__dump_hstring_raw(p, key); DUK_RAW_WRITE_U32_BE(p, val); } } p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U, p); DUK_RAW_WRITE_U32_BE(p, 0); /* end of _Varmap */ return p; } DUK_LOCAL duk_uint8_t *duk__dump_formals(duk_hthread *thr, duk_uint8_t *p, duk_bufwriter_ctx *bw_ctx, duk_hobject *func) { duk_tval *tv; tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) func, DUK_HTHREAD_STRING_INT_FORMALS(thr)); if (tv != NULL && DUK_TVAL_IS_OBJECT(tv)) { duk_harray *h; duk_uint32_t i; /* Here we rely on _Formals being a dense array containing * strings. This should be the case unless _Formals has been * tweaked by the application (which we don't support right * now). */ h = (duk_harray *) DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h != NULL); DUK_ASSERT(DUK_HOBJECT_IS_ARRAY((duk_hobject *) h)); DUK_ASSERT(h->length <= DUK_HOBJECT_GET_ASIZE((duk_hobject *) h)); p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U, p); DUK_ASSERT(h->length != DUK__NO_FORMALS); /* limits */ DUK_RAW_WRITE_U32_BE(p, h->length); for (i = 0; i < h->length; i++) { duk_tval *tv_val; duk_hstring *varname; tv_val = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, (duk_hobject *) h, i); DUK_ASSERT(tv_val != NULL); DUK_ASSERT(DUK_TVAL_IS_STRING(tv_val)); varname = DUK_TVAL_GET_STRING(tv_val); DUK_ASSERT(varname != NULL); DUK_ASSERT(DUK_HSTRING_GET_BYTELEN(varname) >= 1); DUK_ASSERT(DUK_HSTRING_MAX_BYTELEN <= 0x7fffffffUL); /* ensures no overflow */ p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U + DUK_HSTRING_GET_BYTELEN(varname), p); p = duk__dump_hstring_raw(p, varname); } } else { DUK_DD(DUK_DDPRINT("dumping function without _Formals, emit marker to indicate missing _Formals")); p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U, p); DUK_RAW_WRITE_U32_BE(p, DUK__NO_FORMALS); /* marker: no formals */ } return p; } static duk_uint8_t *duk__dump_func(duk_hthread *thr, duk_hcompfunc *func, duk_bufwriter_ctx *bw_ctx, duk_uint8_t *p) { duk_tval *tv, *tv_end; duk_instr_t *ins, *ins_end; duk_hobject **fn, **fn_end; duk_hstring *h_str; duk_uint32_t count_instr; duk_uint32_t tmp32; duk_uint16_t tmp16; duk_double_t d; DUK_DD(DUK_DDPRINT("dumping function %p to %p: " "consts=[%p,%p[ (%ld bytes, %ld items), " "funcs=[%p,%p[ (%ld bytes, %ld items), " "code=[%p,%p[ (%ld bytes, %ld items)", (void *) func, (void *) p, (void *) DUK_HCOMPFUNC_GET_CONSTS_BASE(thr->heap, func), (void *) DUK_HCOMPFUNC_GET_CONSTS_END(thr->heap, func), (long) DUK_HCOMPFUNC_GET_CONSTS_SIZE(thr->heap, func), (long) DUK_HCOMPFUNC_GET_CONSTS_COUNT(thr->heap, func), (void *) DUK_HCOMPFUNC_GET_FUNCS_BASE(thr->heap, func), (void *) DUK_HCOMPFUNC_GET_FUNCS_END(thr->heap, func), (long) DUK_HCOMPFUNC_GET_FUNCS_SIZE(thr->heap, func), (long) DUK_HCOMPFUNC_GET_FUNCS_COUNT(thr->heap, func), (void *) DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, func), (void *) DUK_HCOMPFUNC_GET_CODE_END(thr->heap, func), (long) DUK_HCOMPFUNC_GET_CODE_SIZE(thr->heap, func), (long) DUK_HCOMPFUNC_GET_CODE_COUNT(thr->heap, func))); DUK_ASSERT(DUK_USE_ESBC_MAX_BYTES <= 0x7fffffffUL); /* ensures no overflow */ count_instr = (duk_uint32_t) DUK_HCOMPFUNC_GET_CODE_COUNT(thr->heap, func); p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 3U * 4U + 2U * 2U + 3U * 4U + count_instr * 4U, p); /* Fixed header info. */ tmp32 = count_instr; DUK_RAW_WRITE_U32_BE(p, tmp32); tmp32 = (duk_uint32_t) DUK_HCOMPFUNC_GET_CONSTS_COUNT(thr->heap, func); DUK_RAW_WRITE_U32_BE(p, tmp32); tmp32 = (duk_uint32_t) DUK_HCOMPFUNC_GET_FUNCS_COUNT(thr->heap, func); DUK_RAW_WRITE_U32_BE(p, tmp32); tmp16 = func->nregs; DUK_RAW_WRITE_U16_BE(p, tmp16); tmp16 = func->nargs; DUK_RAW_WRITE_U16_BE(p, tmp16); #if defined(DUK_USE_DEBUGGER_SUPPORT) tmp32 = func->start_line; DUK_RAW_WRITE_U32_BE(p, tmp32); tmp32 = func->end_line; DUK_RAW_WRITE_U32_BE(p, tmp32); #else DUK_RAW_WRITE_U32_BE(p, 0); DUK_RAW_WRITE_U32_BE(p, 0); #endif tmp32 = DUK_HEAPHDR_GET_FLAGS((duk_heaphdr *) func); /* masks flags, only duk_hobject flags */ tmp32 &= ~(DUK_HOBJECT_FLAG_HAVE_FINALIZER); /* finalizer flag is lost */ DUK_RAW_WRITE_U32_BE(p, tmp32); /* Bytecode instructions: endian conversion needed unless * platform is big endian. */ ins = DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, func); ins_end = DUK_HCOMPFUNC_GET_CODE_END(thr->heap, func); DUK_ASSERT((duk_size_t) (ins_end - ins) == (duk_size_t) count_instr); #if defined(DUK_USE_INTEGER_BE) DUK_MEMCPY((void *) p, (const void *) ins, (size_t) (ins_end - ins)); p += (size_t) (ins_end - ins); #else while (ins != ins_end) { tmp32 = (duk_uint32_t) (*ins); DUK_RAW_WRITE_U32_BE(p, tmp32); ins++; } #endif /* Constants: variable size encoding. */ tv = DUK_HCOMPFUNC_GET_CONSTS_BASE(thr->heap, func); tv_end = DUK_HCOMPFUNC_GET_CONSTS_END(thr->heap, func); while (tv != tv_end) { /* constants are strings or numbers now */ DUK_ASSERT(DUK_TVAL_IS_STRING(tv) || DUK_TVAL_IS_NUMBER(tv)); if (DUK_TVAL_IS_STRING(tv)) { h_str = DUK_TVAL_GET_STRING(tv); DUK_ASSERT(h_str != NULL); DUK_ASSERT(DUK_HSTRING_MAX_BYTELEN <= 0x7fffffffUL); /* ensures no overflow */ p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 1U + 4U + DUK_HSTRING_GET_BYTELEN(h_str), p), *p++ = DUK__SER_STRING; p = duk__dump_hstring_raw(p, h_str); } else { DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 1U + 8U, p); *p++ = DUK__SER_NUMBER; d = DUK_TVAL_GET_NUMBER(tv); DUK_RAW_WRITE_DOUBLE_BE(p, d); } tv++; } /* Inner functions recursively. */ fn = (duk_hobject **) DUK_HCOMPFUNC_GET_FUNCS_BASE(thr->heap, func); fn_end = (duk_hobject **) DUK_HCOMPFUNC_GET_FUNCS_END(thr->heap, func); while (fn != fn_end) { /* XXX: This causes recursion up to inner function depth * which is normally not an issue, e.g. mark-and-sweep uses * a recursion limiter to avoid C stack issues. Avoiding * this would mean some sort of a work list or just refusing * to serialize deep functions. */ DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(*fn)); p = duk__dump_func(thr, (duk_hcompfunc *) *fn, bw_ctx, p); fn++; } /* Lexenv and varenv are not dumped. */ /* Object extra properties. * * There are some difference between function templates and functions. * For example, function templates don't have .length and nargs is * normally used to instantiate the functions. */ p = duk__dump_uint32_prop(thr, p, bw_ctx, (duk_hobject *) func, DUK_STRIDX_LENGTH, (duk_uint32_t) func->nargs); #if defined(DUK_USE_FUNC_NAME_PROPERTY) p = duk__dump_string_prop(thr, p, bw_ctx, (duk_hobject *) func, DUK_STRIDX_NAME); #endif #if defined(DUK_USE_FUNC_FILENAME_PROPERTY) p = duk__dump_string_prop(thr, p, bw_ctx, (duk_hobject *) func, DUK_STRIDX_FILE_NAME); #endif #if defined(DUK_USE_PC2LINE) p = duk__dump_buffer_prop(thr, p, bw_ctx, (duk_hobject *) func, DUK_STRIDX_INT_PC2LINE); #endif p = duk__dump_varmap(thr, p, bw_ctx, (duk_hobject *) func); p = duk__dump_formals(thr, p, bw_ctx, (duk_hobject *) func); DUK_DD(DUK_DDPRINT("serialized function %p -> final pointer %p", (void *) func, (void *) p)); return p; } /* Load a function from bytecode. The function object returned here must * match what is created by duk_js_push_closure() with respect to its flags, * properties, etc. * * NOTE: there are intentionally no input buffer length / bound checks. * Adding them would be easy but wouldn't ensure memory safety as untrusted * or broken bytecode is unsafe during execution unless the opcodes themselves * are validated (which is quite complex, especially for indirect opcodes). */ #define DUK__ASSERT_LEFT(n) do { \ DUK_ASSERT((duk_size_t) (p_end - p) >= (duk_size_t) (n)); \ } while (0) static duk_uint8_t *duk__load_func(duk_hthread *thr, duk_uint8_t *p, duk_uint8_t *p_end) { duk_hcompfunc *h_fun; duk_hbuffer *h_data; duk_size_t data_size; duk_uint32_t count_instr, count_const, count_funcs; duk_uint32_t n; duk_uint32_t tmp32; duk_small_uint_t const_type; duk_uint8_t *fun_data; duk_uint8_t *q; duk_idx_t idx_base; duk_tval *tv1; duk_uarridx_t arr_idx; duk_uarridx_t arr_limit; duk_hobject *func_env; duk_bool_t need_pop; /* XXX: There's some overlap with duk_js_closure() here, but * seems difficult to share code. Ensure that the final function * looks the same as created by duk_js_closure(). */ DUK_ASSERT(thr != NULL); DUK_DD(DUK_DDPRINT("loading function, p=%p, p_end=%p", (void *) p, (void *) p_end)); DUK__ASSERT_LEFT(3 * 4); count_instr = DUK_RAW_READ_U32_BE(p); count_const = DUK_RAW_READ_U32_BE(p); count_funcs = DUK_RAW_READ_U32_BE(p); data_size = sizeof(duk_tval) * count_const + sizeof(duk_hobject *) * count_funcs + sizeof(duk_instr_t) * count_instr; DUK_DD(DUK_DDPRINT("instr=%ld, const=%ld, funcs=%ld, data_size=%ld", (long) count_instr, (long) count_const, (long) count_const, (long) data_size)); /* Value stack is used to ensure reachability of constants and * inner functions being loaded. Require enough space to handle * large functions correctly. */ duk_require_stack(thr, (duk_idx_t) (2 + count_const + count_funcs)); idx_base = duk_get_top(thr); /* Push function object, init flags etc. This must match * duk_js_push_closure() quite carefully. */ h_fun = duk_push_hcompfunc(thr); DUK_ASSERT(h_fun != NULL); DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) h_fun)); DUK_ASSERT(DUK_HCOMPFUNC_GET_DATA(thr->heap, h_fun) == NULL); DUK_ASSERT(DUK_HCOMPFUNC_GET_FUNCS(thr->heap, h_fun) == NULL); DUK_ASSERT(DUK_HCOMPFUNC_GET_BYTECODE(thr->heap, h_fun) == NULL); DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) h_fun) == thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]); h_fun->nregs = DUK_RAW_READ_U16_BE(p); h_fun->nargs = DUK_RAW_READ_U16_BE(p); #if defined(DUK_USE_DEBUGGER_SUPPORT) h_fun->start_line = DUK_RAW_READ_U32_BE(p); h_fun->end_line = DUK_RAW_READ_U32_BE(p); #else p += 8; /* skip line info */ #endif /* duk_hcompfunc flags; quite version specific */ tmp32 = DUK_RAW_READ_U32_BE(p); DUK_HEAPHDR_SET_FLAGS((duk_heaphdr *) h_fun, tmp32); /* masks flags to only change duk_hobject flags */ /* standard prototype (no need to set here, already set) */ DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) h_fun) == thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]); #if 0 DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, &h_fun->obj, thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]); #endif /* assert just a few critical flags */ DUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) h_fun) == DUK_HTYPE_OBJECT); DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(&h_fun->obj)); DUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(&h_fun->obj)); DUK_ASSERT(!DUK_HOBJECT_HAS_NATFUNC(&h_fun->obj)); DUK_ASSERT(!DUK_HOBJECT_IS_THREAD(&h_fun->obj)); DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARRAY(&h_fun->obj)); DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(&h_fun->obj)); DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(&h_fun->obj)); /* Create function 'data' buffer but don't attach it yet. */ fun_data = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, data_size); DUK_ASSERT(fun_data != NULL); /* Load bytecode instructions. */ DUK_ASSERT(sizeof(duk_instr_t) == 4); DUK__ASSERT_LEFT(count_instr * sizeof(duk_instr_t)); #if defined(DUK_USE_INTEGER_BE) q = fun_data + sizeof(duk_tval) * count_const + sizeof(duk_hobject *) * count_funcs; DUK_MEMCPY((void *) q, (const void *) p, sizeof(duk_instr_t) * count_instr); p += sizeof(duk_instr_t) * count_instr; #else q = fun_data + sizeof(duk_tval) * count_const + sizeof(duk_hobject *) * count_funcs; for (n = count_instr; n > 0; n--) { *((duk_instr_t *) (void *) q) = DUK_RAW_READ_U32_BE(p); q += sizeof(duk_instr_t); } #endif /* Load constants onto value stack but don't yet copy to buffer. */ for (n = count_const; n > 0; n--) { DUK__ASSERT_LEFT(1); const_type = DUK_RAW_READ_U8(p); switch (const_type) { case DUK__SER_STRING: { p = duk__load_string_raw(thr, p); break; } case DUK__SER_NUMBER: { /* Important to do a fastint check so that constants are * properly read back as fastints. */ duk_tval tv_tmp; duk_double_t val; DUK__ASSERT_LEFT(8); val = DUK_RAW_READ_DOUBLE_BE(p); DUK_TVAL_SET_NUMBER_CHKFAST_SLOW(&tv_tmp, val); duk_push_tval(thr, &tv_tmp); break; } default: { goto format_error; } } } /* Load inner functions to value stack, but don't yet copy to buffer. */ for (n = count_funcs; n > 0; n--) { p = duk__load_func(thr, p, p_end); if (p == NULL) { goto format_error; } } /* With constants and inner functions on value stack, we can now * atomically finish the function 'data' buffer, bump refcounts, * etc. * * Here we take advantage of the value stack being just a duk_tval * array: we can just memcpy() the constants as long as we incref * them afterwards. */ h_data = (duk_hbuffer *) duk_known_hbuffer(thr, idx_base + 1); DUK_ASSERT(!DUK_HBUFFER_HAS_DYNAMIC(h_data)); DUK_HCOMPFUNC_SET_DATA(thr->heap, h_fun, h_data); DUK_HBUFFER_INCREF(thr, h_data); tv1 = duk_get_tval(thr, idx_base + 2); /* may be NULL if no constants or inner funcs */ DUK_ASSERT((count_const == 0 && count_funcs == 0) || tv1 != NULL); q = fun_data; if (count_const > 0) { /* Explicit zero size check to avoid NULL 'tv1'. */ DUK_MEMCPY((void *) q, (const void *) tv1, sizeof(duk_tval) * count_const); for (n = count_const; n > 0; n--) { DUK_TVAL_INCREF_FAST(thr, (duk_tval *) (void *) q); /* no side effects */ q += sizeof(duk_tval); } tv1 += count_const; } DUK_HCOMPFUNC_SET_FUNCS(thr->heap, h_fun, (duk_hobject **) (void *) q); for (n = count_funcs; n > 0; n--) { duk_hobject *h_obj; DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv1)); h_obj = DUK_TVAL_GET_OBJECT(tv1); DUK_ASSERT(h_obj != NULL); tv1++; DUK_HOBJECT_INCREF(thr, h_obj); *((duk_hobject **) (void *) q) = h_obj; q += sizeof(duk_hobject *); } DUK_HCOMPFUNC_SET_BYTECODE(thr->heap, h_fun, (duk_instr_t *) (void *) q); /* The function object is now reachable and refcounts are fine, * so we can pop off all the temporaries. */ DUK_DDD(DUK_DDDPRINT("function is reachable, reset top; func: %!iT", duk_get_tval(thr, idx_base))); duk_set_top(thr, idx_base + 1); /* Setup function properties. */ tmp32 = DUK_RAW_READ_U32_BE(p); duk_push_u32(thr, tmp32); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_C); #if defined(DUK_USE_FUNC_NAME_PROPERTY) p = duk__load_string_raw(thr, p); /* -> [ func funcname ] */ func_env = thr->builtins[DUK_BIDX_GLOBAL_ENV]; DUK_ASSERT(func_env != NULL); need_pop = 0; if (DUK_HOBJECT_HAS_NAMEBINDING((duk_hobject *) h_fun)) { /* Original function instance/template had NAMEBINDING. * Must create a lexical environment on loading to allow * recursive functions like 'function foo() { foo(); }'. */ duk_hdecenv *new_env; new_env = duk_hdecenv_alloc(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DECENV)); DUK_ASSERT(new_env != NULL); DUK_ASSERT(new_env->thread == NULL); /* Closed. */ DUK_ASSERT(new_env->varmap == NULL); DUK_ASSERT(new_env->regbase_byteoff == 0); DUK_ASSERT_HDECENV_VALID(new_env); DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) new_env) == NULL); DUK_HOBJECT_SET_PROTOTYPE(thr->heap, (duk_hobject *) new_env, func_env); DUK_HOBJECT_INCREF(thr, func_env); func_env = (duk_hobject *) new_env; duk_push_hobject(thr, (duk_hobject *) new_env); duk_dup_m2(thr); /* -> [ func funcname env funcname ] */ duk_dup(thr, idx_base); /* -> [ func funcname env funcname func ] */ duk_xdef_prop(thr, -3, DUK_PROPDESC_FLAGS_NONE); /* -> [ func funcname env ] */ need_pop = 1; /* Need to pop env, but -after- updating h_fun and increfs. */ } DUK_ASSERT(func_env != NULL); DUK_HCOMPFUNC_SET_LEXENV(thr->heap, h_fun, func_env); DUK_HCOMPFUNC_SET_VARENV(thr->heap, h_fun, func_env); DUK_HOBJECT_INCREF(thr, func_env); DUK_HOBJECT_INCREF(thr, func_env); if (need_pop) { duk_pop(thr); } duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_C); #endif /* DUK_USE_FUNC_NAME_PROPERTY */ #if defined(DUK_USE_FUNC_FILENAME_PROPERTY) p = duk__load_string_raw(thr, p); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_FILE_NAME, DUK_PROPDESC_FLAGS_C); #endif /* DUK_USE_FUNC_FILENAME_PROPERTY */ if (DUK_HOBJECT_HAS_CONSTRUCTABLE((duk_hobject *) h_fun)) { /* Restore empty external .prototype only for constructable * functions. */ duk_push_object(thr); duk_dup_m2(thr); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_CONSTRUCTOR, DUK_PROPDESC_FLAGS_WC); /* func.prototype.constructor = func */ duk_compact_m1(thr); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_PROTOTYPE, DUK_PROPDESC_FLAGS_W); } #if defined(DUK_USE_PC2LINE) p = duk__load_buffer_raw(thr, p); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_PC2LINE, DUK_PROPDESC_FLAGS_WC); #endif /* DUK_USE_PC2LINE */ duk_push_object(thr); /* _Varmap */ for (;;) { /* XXX: awkward */ p = duk__load_string_raw(thr, p); if (duk_get_length(thr, -1) == 0) { duk_pop(thr); break; } tmp32 = DUK_RAW_READ_U32_BE(p); duk_push_u32(thr, tmp32); duk_put_prop(thr, -3); } duk_compact_m1(thr); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VARMAP, DUK_PROPDESC_FLAGS_NONE); /* _Formals may have been missing in the original function, which is * handled using a marker length. */ arr_limit = DUK_RAW_READ_U32_BE(p); if (arr_limit != DUK__NO_FORMALS) { duk_push_array(thr); /* _Formals */ for (arr_idx = 0; arr_idx < arr_limit; arr_idx++) { p = duk__load_string_raw(thr, p); duk_put_prop_index(thr, -2, arr_idx); } duk_compact_m1(thr); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_FORMALS, DUK_PROPDESC_FLAGS_NONE); } else { DUK_DD(DUK_DDPRINT("no _Formals in dumped function")); } /* Return with final function pushed on stack top. */ DUK_DD(DUK_DDPRINT("final loaded function: %!iT", duk_get_tval(thr, -1))); DUK_ASSERT_TOP(thr, idx_base + 1); return p; format_error: return NULL; } DUK_EXTERNAL void duk_dump_function(duk_hthread *thr) { duk_hcompfunc *func; duk_bufwriter_ctx bw_ctx_alloc; duk_bufwriter_ctx *bw_ctx = &bw_ctx_alloc; duk_uint8_t *p; DUK_ASSERT_API_ENTRY(thr); /* Bound functions don't have all properties so we'd either need to * lookup the non-bound target function or reject bound functions. * For now, bound functions are rejected with TypeError. */ func = duk_require_hcompfunc(thr, -1); DUK_ASSERT(func != NULL); DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(&func->obj)); /* Estimating the result size beforehand would be costly, so * start with a reasonable size and extend as needed. */ DUK_BW_INIT_PUSHBUF(thr, bw_ctx, DUK__BYTECODE_INITIAL_ALLOC); p = DUK_BW_GET_PTR(thr, bw_ctx); *p++ = DUK__SER_MARKER; p = duk__dump_func(thr, func, bw_ctx, p); DUK_BW_SET_PTR(thr, bw_ctx, p); DUK_BW_COMPACT(thr, bw_ctx); DUK_DD(DUK_DDPRINT("serialized result: %!T", duk_get_tval(thr, -1))); duk_remove_m2(thr); /* [ ... func buf ] -> [ ... buf ] */ } DUK_EXTERNAL void duk_load_function(duk_hthread *thr) { duk_uint8_t *p_buf, *p, *p_end; duk_size_t sz; DUK_ASSERT_API_ENTRY(thr); p_buf = (duk_uint8_t *) duk_require_buffer(thr, -1, &sz); DUK_ASSERT(p_buf != NULL); /* The caller is responsible for being sure that bytecode being loaded * is valid and trusted. Invalid bytecode can cause memory unsafe * behavior directly during loading or later during bytecode execution * (instruction validation would be quite complex to implement). * * This signature check is the only sanity check for detecting * accidental invalid inputs. The initial byte ensures no ordinary * string or Symbol will be accepted by accident. */ p = p_buf; p_end = p_buf + sz; if (sz < 1 || p[0] != DUK__SER_MARKER) { goto format_error; } p++; p = duk__load_func(thr, p, p_end); if (p == NULL) { goto format_error; } duk_remove_m2(thr); /* [ ... buf func ] -> [ ... func ] */ return; format_error: DUK_ERROR_TYPE(thr, DUK_STR_INVALID_BYTECODE); } #else /* DUK_USE_BYTECODE_DUMP_SUPPORT */ DUK_EXTERNAL void duk_dump_function(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); DUK_ERROR_UNSUPPORTED(thr); } DUK_EXTERNAL void duk_load_function(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); DUK_ERROR_UNSUPPORTED(thr); } #endif /* DUK_USE_BYTECODE_DUMP_SUPPORT */ /* automatic undefs */ #undef DUK__ASSERT_LEFT #undef DUK__BYTECODE_INITIAL_ALLOC #undef DUK__NO_FORMALS #undef DUK__SER_MARKER #undef DUK__SER_NUMBER #undef DUK__SER_STRING #line 1 "duk_api_call.c" /* * Calls. * * Protected variants should avoid ever throwing an error. Must be careful * to catch errors related to value stack manipulation and property lookup, * not just the call itself. * * The only exception is when arguments are insane, e.g. nargs/nrets are out * of bounds; in such cases an error is thrown for two reasons. First, we * can't always respect the value stack input/output guarantees in such cases * so the caller would end up with the value stack in an unexpected state. * Second, an attempt to create an error might itself fail (although this * could be avoided by pushing a preallocated object/string or a primitive * value). */ /* #include duk_internal.h -> already included */ /* * Helpers */ struct duk__pcall_prop_args { duk_idx_t obj_idx; duk_idx_t nargs; duk_small_uint_t call_flags; }; typedef struct duk__pcall_prop_args duk__pcall_prop_args; struct duk__pcall_method_args { duk_idx_t nargs; duk_small_uint_t call_flags; }; typedef struct duk__pcall_method_args duk__pcall_method_args; struct duk__pcall_args { duk_idx_t nargs; duk_small_uint_t call_flags; }; typedef struct duk__pcall_args duk__pcall_args; /* Compute and validate idx_func for a certain 'nargs' and 'other' * parameter count (1 or 2, depending on whether 'this' binding is * present). */ DUK_LOCAL duk_idx_t duk__call_get_idx_func(duk_hthread *thr, duk_idx_t nargs, duk_idx_t other) { duk_idx_t idx_func; /* XXX: byte arithmetic? */ DUK_ASSERT(other >= 0); idx_func = duk_get_top(thr) - nargs - other; if (DUK_UNLIKELY((idx_func | nargs) < 0)) { /* idx_func < 0 || nargs < 0; OR sign bits */ DUK_ERROR_TYPE_INVALID_ARGS(thr); /* unreachable */ } DUK_ASSERT(duk_is_valid_index(thr, idx_func)); return idx_func; } /* Compute idx_func, assume index will be valid. This is a valid assumption * for protected calls: nargs < 0 is checked explicitly and duk_safe_call() * validates the argument count. */ DUK_LOCAL duk_idx_t duk__call_get_idx_func_unvalidated(duk_hthread *thr, duk_idx_t nargs, duk_idx_t other) { duk_idx_t idx_func; /* XXX: byte arithmetic? */ DUK_ASSERT(nargs >= 0); DUK_ASSERT(other >= 0); idx_func = duk_get_top(thr) - nargs - other; DUK_ASSERT(idx_func >= 0); DUK_ASSERT(duk_is_valid_index(thr, idx_func)); return idx_func; } /* Prepare value stack for a method call through an object property. * May currently throw an error e.g. when getting the property. */ DUK_LOCAL void duk__call_prop_prep_stack(duk_hthread *thr, duk_idx_t normalized_obj_idx, duk_idx_t nargs) { DUK_ASSERT_CTX_VALID(thr); DUK_ASSERT(nargs >= 0); DUK_DDD(DUK_DDDPRINT("duk__call_prop_prep_stack, normalized_obj_idx=%ld, nargs=%ld, stacktop=%ld", (long) normalized_obj_idx, (long) nargs, (long) duk_get_top(thr))); /* [... key arg1 ... argN] */ /* duplicate key */ duk_dup(thr, -nargs - 1); /* Note: -nargs alone would fail for nargs == 0, this is OK */ (void) duk_get_prop(thr, normalized_obj_idx); DUK_DDD(DUK_DDDPRINT("func: %!T", (duk_tval *) duk_get_tval(thr, -1))); #if defined(DUK_USE_VERBOSE_ERRORS) if (DUK_UNLIKELY(!duk_is_callable(thr, -1))) { duk_tval *tv_targ; duk_tval *tv_base; duk_tval *tv_key; tv_targ = DUK_GET_TVAL_NEGIDX(thr, -1); tv_base = DUK_GET_TVAL_POSIDX(thr, normalized_obj_idx); tv_key = DUK_GET_TVAL_NEGIDX(thr, -nargs - 2); DUK_ASSERT(tv_targ >= thr->valstack_bottom && tv_targ < thr->valstack_top); DUK_ASSERT(tv_base >= thr->valstack_bottom && tv_base < thr->valstack_top); DUK_ASSERT(tv_key >= thr->valstack_bottom && tv_key < thr->valstack_top); duk_call_setup_propcall_error(thr, tv_targ, tv_base, tv_key); } #endif /* [... key arg1 ... argN func] */ duk_replace(thr, -nargs - 2); /* [... func arg1 ... argN] */ duk_dup(thr, normalized_obj_idx); duk_insert(thr, -nargs - 1); /* [... func this arg1 ... argN] */ } DUK_EXTERNAL void duk_call(duk_hthread *thr, duk_idx_t nargs) { duk_small_uint_t call_flags; duk_idx_t idx_func; DUK_ASSERT_API_ENTRY(thr); idx_func = duk__call_get_idx_func(thr, nargs, 1); DUK_ASSERT(duk_is_valid_index(thr, idx_func)); duk_insert_undefined(thr, idx_func + 1); call_flags = 0; /* not protected, respect reclimit, not constructor */ duk_handle_call_unprotected(thr, idx_func, call_flags); } DUK_EXTERNAL void duk_call_method(duk_hthread *thr, duk_idx_t nargs) { duk_small_uint_t call_flags; duk_idx_t idx_func; DUK_ASSERT_API_ENTRY(thr); idx_func = duk__call_get_idx_func(thr, nargs, 2); DUK_ASSERT(duk_is_valid_index(thr, idx_func)); call_flags = 0; /* not protected, respect reclimit, not constructor */ duk_handle_call_unprotected(thr, idx_func, call_flags); } DUK_EXTERNAL void duk_call_prop(duk_hthread *thr, duk_idx_t obj_idx, duk_idx_t nargs) { /* * XXX: if duk_handle_call() took values through indices, this could be * made much more sensible. However, duk_handle_call() needs to fudge * the 'this' and 'func' values to handle bound functions, which is now * done "in-place", so this is not a trivial change. */ DUK_ASSERT_API_ENTRY(thr); obj_idx = duk_require_normalize_index(thr, obj_idx); /* make absolute */ if (DUK_UNLIKELY(nargs < 0)) { DUK_ERROR_TYPE_INVALID_ARGS(thr); } duk__call_prop_prep_stack(thr, obj_idx, nargs); duk_call_method(thr, nargs); } DUK_LOCAL duk_ret_t duk__pcall_raw(duk_hthread *thr, void *udata) { duk__pcall_args *args; duk_idx_t idx_func; duk_int_t ret; DUK_ASSERT_CTX_VALID(thr); DUK_ASSERT(udata != NULL); args = (duk__pcall_args *) udata; idx_func = duk__call_get_idx_func_unvalidated(thr, args->nargs, 1); DUK_ASSERT(duk_is_valid_index(thr, idx_func)); duk_insert_undefined(thr, idx_func + 1); ret = duk_handle_call_unprotected(thr, idx_func, args->call_flags); DUK_ASSERT(ret == 0); DUK_UNREF(ret); return 1; } DUK_EXTERNAL duk_int_t duk_pcall(duk_hthread *thr, duk_idx_t nargs) { duk__pcall_args args; DUK_ASSERT_API_ENTRY(thr); args.nargs = nargs; if (DUK_UNLIKELY(nargs < 0)) { DUK_ERROR_TYPE_INVALID_ARGS(thr); return DUK_EXEC_ERROR; /* unreachable */ } args.call_flags = 0; return duk_safe_call(thr, duk__pcall_raw, (void *) &args /*udata*/, nargs + 1 /*nargs*/, 1 /*nrets*/); } DUK_LOCAL duk_ret_t duk__pcall_method_raw(duk_hthread *thr, void *udata) { duk__pcall_method_args *args; duk_idx_t idx_func; duk_int_t ret; DUK_ASSERT_CTX_VALID(thr); DUK_ASSERT(udata != NULL); args = (duk__pcall_method_args *) udata; idx_func = duk__call_get_idx_func_unvalidated(thr, args->nargs, 2); DUK_ASSERT(duk_is_valid_index(thr, idx_func)); ret = duk_handle_call_unprotected(thr, idx_func, args->call_flags); DUK_ASSERT(ret == 0); DUK_UNREF(ret); return 1; } DUK_INTERNAL duk_int_t duk_pcall_method_flags(duk_hthread *thr, duk_idx_t nargs, duk_small_uint_t call_flags) { duk__pcall_method_args args; DUK_ASSERT_API_ENTRY(thr); args.nargs = nargs; if (DUK_UNLIKELY(nargs < 0)) { DUK_ERROR_TYPE_INVALID_ARGS(thr); return DUK_EXEC_ERROR; /* unreachable */ } args.call_flags = call_flags; return duk_safe_call(thr, duk__pcall_method_raw, (void *) &args /*udata*/, nargs + 2 /*nargs*/, 1 /*nrets*/); } DUK_EXTERNAL duk_int_t duk_pcall_method(duk_hthread *thr, duk_idx_t nargs) { DUK_ASSERT_API_ENTRY(thr); return duk_pcall_method_flags(thr, nargs, 0); } DUK_LOCAL duk_ret_t duk__pcall_prop_raw(duk_hthread *thr, void *udata) { duk__pcall_prop_args *args; duk_idx_t obj_idx; duk_int_t ret; DUK_ASSERT_CTX_VALID(thr); DUK_ASSERT(udata != NULL); args = (duk__pcall_prop_args *) udata; obj_idx = duk_require_normalize_index(thr, args->obj_idx); /* make absolute */ duk__call_prop_prep_stack(thr, obj_idx, args->nargs); ret = duk_handle_call_unprotected_nargs(thr, args->nargs, args->call_flags); DUK_ASSERT(ret == 0); DUK_UNREF(ret); return 1; } DUK_EXTERNAL duk_int_t duk_pcall_prop(duk_hthread *thr, duk_idx_t obj_idx, duk_idx_t nargs) { duk__pcall_prop_args args; DUK_ASSERT_API_ENTRY(thr); args.obj_idx = obj_idx; args.nargs = nargs; if (DUK_UNLIKELY(nargs < 0)) { DUK_ERROR_TYPE_INVALID_ARGS(thr); return DUK_EXEC_ERROR; /* unreachable */ } args.call_flags = 0; return duk_safe_call(thr, duk__pcall_prop_raw, (void *) &args /*udata*/, nargs + 1 /*nargs*/, 1 /*nrets*/); } DUK_EXTERNAL duk_int_t duk_safe_call(duk_hthread *thr, duk_safe_call_function func, void *udata, duk_idx_t nargs, duk_idx_t nrets) { duk_int_t rc; DUK_ASSERT_API_ENTRY(thr); /* nargs condition; fail if: top - bottom < nargs * <=> top < bottom + nargs * nrets condition; fail if: end - (top - nargs) < nrets * <=> end - top + nargs < nrets * <=> end + nargs < top + nrets */ /* XXX: check for any reserve? */ if (DUK_UNLIKELY((nargs | nrets) < 0 || /* nargs < 0 || nrets < 0; OR sign bits */ thr->valstack_top < thr->valstack_bottom + nargs || /* nargs too large compared to top */ thr->valstack_end + nargs < thr->valstack_top + nrets)) { /* nrets too large compared to reserve */ DUK_D(DUK_DPRINT("not enough stack reserve for safe call or invalid arguments: " "nargs=%ld < 0 (?), nrets=%ld < 0 (?), top=%ld < bottom=%ld + nargs=%ld (?), " "end=%ld + nargs=%ld < top=%ld + nrets=%ld (?)", (long) nargs, (long) nrets, (long) (thr->valstack_top - thr->valstack), (long) (thr->valstack_bottom - thr->valstack), (long) nargs, (long) (thr->valstack_end - thr->valstack), (long) nargs, (long) (thr->valstack_top - thr->valstack), (long) nrets)); DUK_ERROR_TYPE_INVALID_ARGS(thr); return DUK_EXEC_ERROR; /* unreachable */ } rc = duk_handle_safe_call(thr, /* thread */ func, /* func */ udata, /* udata */ nargs, /* num_stack_args */ nrets); /* num_stack_res */ return rc; } DUK_EXTERNAL void duk_new(duk_hthread *thr, duk_idx_t nargs) { duk_idx_t idx_func; DUK_ASSERT_API_ENTRY(thr); idx_func = duk__call_get_idx_func(thr, nargs, 1); DUK_ASSERT(duk_is_valid_index(thr, idx_func)); duk_push_object(thr); /* default instance; internal proto updated by call handling */ duk_insert(thr, idx_func + 1); duk_handle_call_unprotected(thr, idx_func, DUK_CALL_FLAG_CONSTRUCT); } DUK_LOCAL duk_ret_t duk__pnew_helper(duk_hthread *thr, void *udata) { duk_idx_t nargs; DUK_ASSERT(udata != NULL); nargs = *((duk_idx_t *) udata); duk_new(thr, nargs); return 1; } DUK_EXTERNAL duk_int_t duk_pnew(duk_hthread *thr, duk_idx_t nargs) { duk_int_t rc; DUK_ASSERT_API_ENTRY(thr); /* For now, just use duk_safe_call() to wrap duk_new(). We can't * simply use a protected duk_handle_call() because pushing the * default instance might throw. */ if (DUK_UNLIKELY(nargs < 0)) { DUK_ERROR_TYPE_INVALID_ARGS(thr); return DUK_EXEC_ERROR; /* unreachable */ } rc = duk_safe_call(thr, duk__pnew_helper, (void *) &nargs /*udata*/, nargs + 1 /*nargs*/, 1 /*nrets*/); return rc; } DUK_EXTERNAL duk_bool_t duk_is_constructor_call(duk_hthread *thr) { duk_activation *act; DUK_ASSERT_API_ENTRY(thr); act = thr->callstack_curr; if (act != NULL) { return ((act->flags & DUK_ACT_FLAG_CONSTRUCT) != 0 ? 1 : 0); } return 0; } /* XXX: Make this obsolete by adding a function flag for rejecting a * non-constructor call automatically? */ DUK_INTERNAL void duk_require_constructor_call(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); if (!duk_is_constructor_call(thr)) { DUK_ERROR_TYPE(thr, DUK_STR_CONSTRUCT_ONLY); } } DUK_EXTERNAL duk_bool_t duk_is_strict_call(duk_hthread *thr) { duk_activation *act; /* For user code this could just return 1 (strict) always * because all Duktape/C functions are considered strict, * and strict is also the default when nothing is running. * However, Duktape may call this function internally when * the current activation is an Ecmascript function, so * this cannot be replaced by a 'return 1' without fixing * the internal call sites. */ DUK_ASSERT_API_ENTRY(thr); act = thr->callstack_curr; if (act != NULL) { return ((act->flags & DUK_ACT_FLAG_STRICT) != 0 ? 1 : 0); } else { /* Strict by default. */ return 1; } } /* * Duktape/C function magic */ DUK_EXTERNAL duk_int_t duk_get_current_magic(duk_hthread *thr) { duk_activation *act; duk_hobject *func; DUK_ASSERT_API_ENTRY(thr); act = thr->callstack_curr; if (act) { func = DUK_ACT_GET_FUNC(act); if (!func) { duk_tval *tv = &act->tv_func; duk_small_uint_t lf_flags; lf_flags = DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv); return (duk_int_t) DUK_LFUNC_FLAGS_GET_MAGIC(lf_flags); } DUK_ASSERT(func != NULL); if (DUK_HOBJECT_IS_NATFUNC(func)) { duk_hnatfunc *nf = (duk_hnatfunc *) func; return (duk_int_t) nf->magic; } } return 0; } DUK_EXTERNAL duk_int_t duk_get_magic(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; duk_hobject *h; DUK_ASSERT_API_ENTRY(thr); tv = duk_require_tval(thr, idx); if (DUK_TVAL_IS_OBJECT(tv)) { h = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h != NULL); if (!DUK_HOBJECT_HAS_NATFUNC(h)) { goto type_error; } return (duk_int_t) ((duk_hnatfunc *) h)->magic; } else if (DUK_TVAL_IS_LIGHTFUNC(tv)) { duk_small_uint_t lf_flags = DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv); return (duk_int_t) DUK_LFUNC_FLAGS_GET_MAGIC(lf_flags); } /* fall through */ type_error: DUK_ERROR_TYPE(thr, DUK_STR_UNEXPECTED_TYPE); return 0; } DUK_EXTERNAL void duk_set_magic(duk_hthread *thr, duk_idx_t idx, duk_int_t magic) { duk_hnatfunc *nf; DUK_ASSERT_API_ENTRY(thr); nf = duk_require_hnatfunc(thr, idx); DUK_ASSERT(nf != NULL); nf->magic = (duk_int16_t) magic; } /* * Misc helpers */ /* Resolve a bound function on value stack top to a non-bound target * (leave other values as is). */ DUK_INTERNAL void duk_resolve_nonbound_function(duk_hthread *thr) { duk_tval *tv; DUK_ASSERT_HTHREAD_VALID(thr); tv = DUK_GET_TVAL_NEGIDX(thr, -1); if (DUK_TVAL_IS_OBJECT(tv)) { duk_hobject *h; h = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h != NULL); if (DUK_HOBJECT_HAS_BOUNDFUNC(h)) { duk_push_tval(thr, &((duk_hboundfunc *) h)->target); duk_replace(thr, -2); #if 0 DUK_TVAL_SET_TVAL(tv, &((duk_hboundfunc *) h)->target); DUK_TVAL_INCREF(thr, tv); DUK_HOBJECT_DECREF_NORZ(thr, h); #endif /* Rely on Function.prototype.bind() on never creating a bound * function whose target is not proper. This is now safe * because the target is not even an internal property but a * struct member. */ DUK_ASSERT(duk_is_lightfunc(thr, -1) || duk_is_callable(thr, -1)); } } /* Lightfuncs cannot be bound but are always callable and * constructable. */ } #line 1 "duk_api_codec.c" /* * Encoding and decoding basic formats: hex, base64. * * These are in-place operations which may allow an optimized implementation. * * Base-64: https://tools.ietf.org/html/rfc4648#section-4 */ /* #include duk_internal.h -> already included */ /* Shared handling for encode/decode argument. Fast path handling for * buffer and string values because they're the most common. In particular, * avoid creating a temporary string or buffer when possible. */ DUK_LOCAL const duk_uint8_t *duk__prep_codec_arg(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len) { void *ptr; duk_bool_t isbuffer; DUK_ASSERT(duk_is_valid_index(thr, idx)); /* checked by caller */ /* XXX: with def_ptr set to a stack related pointer, isbuffer could * be removed from the helper? */ ptr = duk_get_buffer_data_raw(thr, idx, out_len, NULL /*def_ptr*/, 0 /*def_size*/, 0 /*throw_flag*/, &isbuffer); if (isbuffer) { DUK_ASSERT(*out_len == 0 || ptr != NULL); return (const duk_uint8_t *) ptr; } return (const duk_uint8_t *) duk_to_lstring(thr, idx, out_len); } #if defined(DUK_USE_BASE64_FASTPATH) DUK_LOCAL void duk__base64_encode_helper(const duk_uint8_t *src, duk_size_t srclen, duk_uint8_t *dst) { duk_uint_t t; duk_size_t n_full, n_full3, n_final; const duk_uint8_t *src_end_fast; n_full = srclen / 3; /* full 3-byte -> 4-char conversions */ n_full3 = n_full * 3; n_final = srclen - n_full3; DUK_ASSERT_DISABLE(n_final >= 0); DUK_ASSERT(n_final <= 2); src_end_fast = src + n_full3; while (DUK_UNLIKELY(src != src_end_fast)) { t = (duk_uint_t) (*src++); t = (t << 8) + (duk_uint_t) (*src++); t = (t << 8) + (duk_uint_t) (*src++); *dst++ = duk_base64_enctab[t >> 18]; *dst++ = duk_base64_enctab[(t >> 12) & 0x3f]; *dst++ = duk_base64_enctab[(t >> 6) & 0x3f]; *dst++ = duk_base64_enctab[t & 0x3f]; #if 0 /* Tested: not faster on x64 */ /* aaaaaabb bbbbcccc ccdddddd */ dst[0] = duk_base64_enctab[(src[0] >> 2) & 0x3f]; dst[1] = duk_base64_enctab[((src[0] << 4) & 0x30) | ((src[1] >> 4) & 0x0f)]; dst[2] = duk_base64_enctab[((src[1] << 2) & 0x3f) | ((src[2] >> 6) & 0x03)]; dst[3] = duk_base64_enctab[src[2] & 0x3f]; src += 3; dst += 4; #endif } switch (n_final) { /* case 0: nop */ case 1: { /* XX== */ t = (duk_uint_t) (*src++); *dst++ = duk_base64_enctab[t >> 2]; /* XXXXXX-- */ *dst++ = duk_base64_enctab[(t << 4) & 0x3f]; /* ------XX */ *dst++ = DUK_ASC_EQUALS; *dst++ = DUK_ASC_EQUALS; break; } case 2: { /* XXX= */ t = (duk_uint_t) (*src++); t = (t << 8) + (duk_uint_t) (*src++); *dst++ = duk_base64_enctab[t >> 10]; /* XXXXXX-- -------- */ *dst++ = duk_base64_enctab[(t >> 4) & 0x3f]; /* ------XX XXXX---- */ *dst++ = duk_base64_enctab[(t << 2) & 0x3f]; /* -------- ----XXXX */ *dst++ = DUK_ASC_EQUALS; break; } } } #else /* DUK_USE_BASE64_FASTPATH */ DUK_LOCAL void duk__base64_encode_helper(const duk_uint8_t *src, duk_size_t srclen, duk_uint8_t *dst) { duk_small_uint_t i, snip; duk_uint_t t; duk_uint_fast8_t x, y; const duk_uint8_t *src_end; src_end = src + srclen; while (src < src_end) { /* read 3 bytes into 't', padded by zero */ snip = 4; t = 0; for (i = 0; i < 3; i++) { t = t << 8; if (src >= src_end) { snip--; } else { t += (duk_uint_t) (*src++); } } /* * Missing bytes snip base64 example * 0 4 XXXX * 1 3 XXX= * 2 2 XX== */ DUK_ASSERT(snip >= 2 && snip <= 4); for (i = 0; i < 4; i++) { x = (duk_uint_fast8_t) ((t >> 18) & 0x3f); t = t << 6; /* A straightforward 64-byte lookup would be faster * and cleaner, but this is shorter. */ if (i >= snip) { y = '='; } else if (x <= 25) { y = x + 'A'; } else if (x <= 51) { y = x - 26 + 'a'; } else if (x <= 61) { y = x - 52 + '0'; } else if (x == 62) { y = '+'; } else { y = '/'; } *dst++ = (duk_uint8_t) y; } } } #endif /* DUK_USE_BASE64_FASTPATH */ #if defined(DUK_USE_BASE64_FASTPATH) DUK_LOCAL duk_bool_t duk__base64_decode_helper(const duk_uint8_t *src, duk_size_t srclen, duk_uint8_t *dst, duk_uint8_t **out_dst_final) { duk_int_t x; duk_int_t t; duk_small_uint_t n_equal; duk_small_uint_t n_chars; const duk_uint8_t *src_end; const duk_uint8_t *src_end_safe; src_end = src + srclen; src_end_safe = src_end - 4; /* if 'src < src_end_safe', safe to read 4 bytes */ /* Innermost fast path processes 4 valid base-64 characters at a time * but bails out on whitespace, padding chars ('=') and invalid chars. * Once the slow path segment has been processed, we return to the * inner fast path again. This handles e.g. base64 with newlines * reasonably well because the majority of a line is in the fast path. */ for (;;) { /* Fast path, handle units with just actual encoding characters. */ while (src <= src_end_safe) { /* The lookup byte is intentionally sign extended to (at least) * 32 bits and then ORed. This ensures that is at least 1 byte * is negative, the highest bit of 't' will be set at the end * and we don't need to check every byte. */ DUK_DDD(DUK_DDDPRINT("fast loop: src=%p, src_end_safe=%p, src_end=%p", (const void *) src, (const void *) src_end_safe, (const void *) src_end)); t = (duk_int_t) duk_base64_dectab[*src++]; t = (t << 6) | (duk_int_t) duk_base64_dectab[*src++]; t = (t << 6) | (duk_int_t) duk_base64_dectab[*src++]; t = (t << 6) | (duk_int_t) duk_base64_dectab[*src++]; if (DUK_UNLIKELY(t < 0)) { DUK_DDD(DUK_DDDPRINT("fast loop unit was not clean, process one slow path unit")); src -= 4; break; } DUK_ASSERT(t <= 0xffffffL); DUK_ASSERT((t >> 24) == 0); *dst++ = (duk_uint8_t) (t >> 16); *dst++ = (duk_uint8_t) ((t >> 8) & 0xff); *dst++ = (duk_uint8_t) (t & 0xff); } /* Handle one slow path unit (or finish if we're done). */ n_equal = 0; n_chars = 0; t = 0; for (;;) { DUK_DDD(DUK_DDDPRINT("slow loop: src=%p, src_end=%p, n_chars=%ld, n_equal=%ld, t=%ld", (const void *) src, (const void *) src_end, (long) n_chars, (long) n_equal, (long) t)); if (DUK_UNLIKELY(src >= src_end)) { goto done; /* two level break */ } x = duk_base64_dectab[*src++]; if (DUK_UNLIKELY(x < 0)) { if (x == -2) { continue; /* allowed ascii whitespace */ } else if (x == -3) { n_equal++; t <<= 6; } else { DUK_ASSERT(x == -1); goto decode_error; } } else { DUK_ASSERT(x >= 0 && x <= 63); if (n_equal > 0) { /* Don't allow actual chars after equal sign. */ goto decode_error; } t = (t << 6) + x; } if (DUK_UNLIKELY(n_chars == 3)) { /* Emit 3 bytes and backtrack if there was padding. There's * always space for the whole 3 bytes so no check needed. */ DUK_ASSERT(t <= 0xffffffL); DUK_ASSERT((t >> 24) == 0); *dst++ = (duk_uint8_t) (t >> 16); *dst++ = (duk_uint8_t) ((t >> 8) & 0xff); *dst++ = (duk_uint8_t) (t & 0xff); if (DUK_UNLIKELY(n_equal > 0)) { DUK_ASSERT(n_equal <= 4); /* There may be whitespace between the equal signs. */ if (n_equal == 1) { /* XXX= */ dst -= 1; } else if (n_equal == 2) { /* XX== */ dst -= 2; } else { goto decode_error; /* invalid padding */ } /* Continue parsing after padding, allows concatenated, * padded base64. */ } break; /* back to fast loop */ } else { n_chars++; } } } done: DUK_DDD(DUK_DDDPRINT("done; src=%p, src_end=%p, n_chars=%ld", (const void *) src, (const void *) src_end, (long) n_chars)); DUK_ASSERT(src == src_end); if (n_chars != 0) { /* Here we'd have the option of decoding unpadded base64 * (e.g. "xxxxyy" instead of "xxxxyy==". Currently not * accepted. */ goto decode_error; } *out_dst_final = dst; return 1; decode_error: return 0; } #else /* DUK_USE_BASE64_FASTPATH */ DUK_LOCAL duk_bool_t duk__base64_decode_helper(const duk_uint8_t *src, duk_size_t srclen, duk_uint8_t *dst, duk_uint8_t **out_dst_final) { duk_uint_t t; duk_uint_fast8_t x, y; duk_small_uint_t group_idx; duk_small_uint_t n_equal; const duk_uint8_t *src_end; src_end = src + srclen; t = 0; group_idx = 0; n_equal = 0; while (src < src_end) { x = *src++; if (x >= 'A' && x <= 'Z') { y = x - 'A' + 0; } else if (x >= 'a' && x <= 'z') { y = x - 'a' + 26; } else if (x >= '0' && x <= '9') { y = x - '0' + 52; } else if (x == '+') { y = 62; } else if (x == '/') { y = 63; } else if (x == '=') { /* We don't check the zero padding bytes here right now * (that they're actually zero). This seems to be common * behavior for base-64 decoders. */ n_equal++; t <<= 6; /* shift in zeroes */ goto skip_add; } else if (x == 0x09 || x == 0x0a || x == 0x0d || x == 0x20) { /* allow basic ASCII whitespace */ continue; } else { goto decode_error; } if (n_equal > 0) { /* Don't allow mixed padding and actual chars. */ goto decode_error; } t = (t << 6) + y; skip_add: if (group_idx == 3) { /* output 3 bytes from 't' */ *dst++ = (duk_uint8_t) ((t >> 16) & 0xff); *dst++ = (duk_uint8_t) ((t >> 8) & 0xff); *dst++ = (duk_uint8_t) (t & 0xff); if (DUK_UNLIKELY(n_equal > 0)) { /* Backtrack. */ DUK_ASSERT(n_equal <= 4); if (n_equal == 1) { dst -= 1; } else if (n_equal == 2) { dst -= 2; } else { goto decode_error; /* invalid padding */ } /* Here we can choose either to end parsing and ignore * whatever follows, or to continue parsing in case * multiple (possibly padded) base64 strings have been * concatenated. Currently, keep on parsing. */ n_equal = 0; } t = 0; group_idx = 0; } else { group_idx++; } } if (group_idx != 0) { /* Here we'd have the option of decoding unpadded base64 * (e.g. "xxxxyy" instead of "xxxxyy==". Currently not * accepted. */ goto decode_error; } *out_dst_final = dst; return 1; decode_error: return 0; } #endif /* DUK_USE_BASE64_FASTPATH */ DUK_EXTERNAL const char *duk_base64_encode(duk_hthread *thr, duk_idx_t idx) { const duk_uint8_t *src; duk_size_t srclen; duk_size_t dstlen; duk_uint8_t *dst; const char *ret; DUK_ASSERT_API_ENTRY(thr); /* XXX: optimize for string inputs: no need to coerce to a buffer * which makes a copy of the input. */ idx = duk_require_normalize_index(thr, idx); src = duk__prep_codec_arg(thr, idx, &srclen); /* Note: for srclen=0, src may be NULL */ /* Computation must not wrap; this limit works for 32-bit size_t: * >>> srclen = 3221225469 * >>> '%x' % ((srclen + 2) / 3 * 4) * 'fffffffc' */ if (srclen > 3221225469UL) { goto type_error; } dstlen = (srclen + 2) / 3 * 4; dst = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, dstlen); duk__base64_encode_helper((const duk_uint8_t *) src, srclen, dst); ret = duk_buffer_to_string(thr, -1); /* Safe, result is ASCII. */ duk_replace(thr, idx); return ret; type_error: DUK_ERROR_TYPE(thr, DUK_STR_BASE64_ENCODE_FAILED); return NULL; /* never here */ } DUK_EXTERNAL void duk_base64_decode(duk_hthread *thr, duk_idx_t idx) { const duk_uint8_t *src; duk_size_t srclen; duk_size_t dstlen; duk_uint8_t *dst; duk_uint8_t *dst_final; duk_bool_t retval; DUK_ASSERT_API_ENTRY(thr); /* XXX: optimize for buffer inputs: no need to coerce to a string * which causes an unnecessary interning. */ idx = duk_require_normalize_index(thr, idx); src = duk__prep_codec_arg(thr, idx, &srclen); /* Computation must not wrap, only srclen + 3 is at risk of * wrapping because after that the number gets smaller. * This limit works for 32-bit size_t: * 0x100000000 - 3 - 1 = 4294967292 */ if (srclen > 4294967292UL) { goto type_error; } dstlen = (srclen + 3) / 4 * 3; /* upper limit, assuming no whitespace etc */ dst = (duk_uint8_t *) duk_push_dynamic_buffer(thr, dstlen); /* Note: for dstlen=0, dst may be NULL */ retval = duk__base64_decode_helper((const duk_uint8_t *) src, srclen, dst, &dst_final); if (!retval) { goto type_error; } /* XXX: convert to fixed buffer? */ (void) duk_resize_buffer(thr, -1, (duk_size_t) (dst_final - dst)); duk_replace(thr, idx); return; type_error: DUK_ERROR_TYPE(thr, DUK_STR_BASE64_DECODE_FAILED); } DUK_EXTERNAL const char *duk_hex_encode(duk_hthread *thr, duk_idx_t idx) { const duk_uint8_t *inp; duk_size_t len; duk_size_t i; duk_uint8_t *buf; const char *ret; #if defined(DUK_USE_HEX_FASTPATH) duk_size_t len_safe; duk_uint16_t *p16; #endif DUK_ASSERT_API_ENTRY(thr); idx = duk_require_normalize_index(thr, idx); inp = duk__prep_codec_arg(thr, idx, &len); DUK_ASSERT(inp != NULL || len == 0); /* Fixed buffer, no zeroing because we'll fill all the data. */ buf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, len * 2); DUK_ASSERT(buf != NULL); #if defined(DUK_USE_HEX_FASTPATH) DUK_ASSERT((((duk_size_t) buf) & 0x01U) == 0); /* pointer is aligned, guaranteed for fixed buffer */ p16 = (duk_uint16_t *) (void *) buf; len_safe = len & ~0x03U; for (i = 0; i < len_safe; i += 4) { p16[0] = duk_hex_enctab[inp[i]]; p16[1] = duk_hex_enctab[inp[i + 1]]; p16[2] = duk_hex_enctab[inp[i + 2]]; p16[3] = duk_hex_enctab[inp[i + 3]]; p16 += 4; } for (; i < len; i++) { *p16++ = duk_hex_enctab[inp[i]]; } #else /* DUK_USE_HEX_FASTPATH */ for (i = 0; i < len; i++) { duk_small_uint_t t; t = (duk_small_uint_t) inp[i]; buf[i*2 + 0] = duk_lc_digits[t >> 4]; buf[i*2 + 1] = duk_lc_digits[t & 0x0f]; } #endif /* DUK_USE_HEX_FASTPATH */ /* XXX: Using a string return value forces a string intern which is * not always necessary. As a rough performance measure, hex encode * time for tests/perf/test-hex-encode.js dropped from ~35s to ~15s * without string coercion. Change to returning a buffer and let the * caller coerce to string if necessary? */ ret = duk_buffer_to_string(thr, -1); /* Safe, result is ASCII. */ duk_replace(thr, idx); return ret; } DUK_EXTERNAL void duk_hex_decode(duk_hthread *thr, duk_idx_t idx) { const duk_uint8_t *inp; duk_size_t len; duk_size_t i; duk_int_t t; duk_uint8_t *buf; #if defined(DUK_USE_HEX_FASTPATH) duk_int_t chk; duk_uint8_t *p; duk_size_t len_safe; #endif DUK_ASSERT_API_ENTRY(thr); idx = duk_require_normalize_index(thr, idx); inp = duk__prep_codec_arg(thr, idx, &len); DUK_ASSERT(inp != NULL || len == 0); if (len & 0x01) { goto type_error; } /* Fixed buffer, no zeroing because we'll fill all the data. */ buf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, len / 2); DUK_ASSERT(buf != NULL); #if defined(DUK_USE_HEX_FASTPATH) p = buf; len_safe = len & ~0x07U; for (i = 0; i < len_safe; i += 8) { t = ((duk_int_t) duk_hex_dectab_shift4[inp[i]]) | ((duk_int_t) duk_hex_dectab[inp[i + 1]]); chk = t; p[0] = (duk_uint8_t) t; t = ((duk_int_t) duk_hex_dectab_shift4[inp[i + 2]]) | ((duk_int_t) duk_hex_dectab[inp[i + 3]]); chk |= t; p[1] = (duk_uint8_t) t; t = ((duk_int_t) duk_hex_dectab_shift4[inp[i + 4]]) | ((duk_int_t) duk_hex_dectab[inp[i + 5]]); chk |= t; p[2] = (duk_uint8_t) t; t = ((duk_int_t) duk_hex_dectab_shift4[inp[i + 6]]) | ((duk_int_t) duk_hex_dectab[inp[i + 7]]); chk |= t; p[3] = (duk_uint8_t) t; p += 4; /* Check if any lookup above had a negative result. */ if (DUK_UNLIKELY(chk < 0)) { goto type_error; } } for (; i < len; i += 2) { t = (((duk_int_t) duk_hex_dectab[inp[i]]) << 4) | ((duk_int_t) duk_hex_dectab[inp[i + 1]]); if (DUK_UNLIKELY(t < 0)) { goto type_error; } *p++ = (duk_uint8_t) t; } #else /* DUK_USE_HEX_FASTPATH */ for (i = 0; i < len; i += 2) { /* For invalid characters the value -1 gets extended to * at least 16 bits. If either nybble is invalid, the * resulting 't' will be < 0. */ t = (((duk_int_t) duk_hex_dectab[inp[i]]) << 4) | ((duk_int_t) duk_hex_dectab[inp[i + 1]]); if (DUK_UNLIKELY(t < 0)) { goto type_error; } buf[i >> 1] = (duk_uint8_t) t; } #endif /* DUK_USE_HEX_FASTPATH */ duk_replace(thr, idx); return; type_error: DUK_ERROR_TYPE(thr, DUK_STR_HEX_DECODE_FAILED); } #if defined(DUK_USE_JSON_SUPPORT) DUK_EXTERNAL const char *duk_json_encode(duk_hthread *thr, duk_idx_t idx) { #if defined(DUK_USE_ASSERTIONS) duk_idx_t top_at_entry; #endif const char *ret; DUK_ASSERT_API_ENTRY(thr); #if defined(DUK_USE_ASSERTIONS) top_at_entry = duk_get_top(thr); #endif idx = duk_require_normalize_index(thr, idx); duk_bi_json_stringify_helper(thr, idx /*idx_value*/, DUK_INVALID_INDEX /*idx_replacer*/, DUK_INVALID_INDEX /*idx_space*/, 0 /*flags*/); DUK_ASSERT(duk_is_string(thr, -1)); duk_replace(thr, idx); ret = duk_get_string(thr, idx); DUK_ASSERT(duk_get_top(thr) == top_at_entry); return ret; } DUK_EXTERNAL void duk_json_decode(duk_hthread *thr, duk_idx_t idx) { #if defined(DUK_USE_ASSERTIONS) duk_idx_t top_at_entry; #endif DUK_ASSERT_API_ENTRY(thr); #if defined(DUK_USE_ASSERTIONS) top_at_entry = duk_get_top(thr); #endif idx = duk_require_normalize_index(thr, idx); duk_bi_json_parse_helper(thr, idx /*idx_value*/, DUK_INVALID_INDEX /*idx_reviver*/, 0 /*flags*/); duk_replace(thr, idx); DUK_ASSERT(duk_get_top(thr) == top_at_entry); } #else /* DUK_USE_JSON_SUPPORT */ DUK_EXTERNAL const char *duk_json_encode(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); DUK_UNREF(idx); DUK_ERROR_UNSUPPORTED(thr); } DUK_EXTERNAL void duk_json_decode(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); DUK_UNREF(idx); DUK_ERROR_UNSUPPORTED(thr); } #endif /* DUK_USE_JSON_SUPPORT */ #line 1 "duk_api_compile.c" /* * Compilation and evaluation */ /* #include duk_internal.h -> already included */ typedef struct duk__compile_raw_args duk__compile_raw_args; struct duk__compile_raw_args { duk_size_t src_length; /* should be first on 64-bit platforms */ const duk_uint8_t *src_buffer; duk_uint_t flags; }; /* Eval is just a wrapper now. */ DUK_EXTERNAL duk_int_t duk_eval_raw(duk_hthread *thr, const char *src_buffer, duk_size_t src_length, duk_uint_t flags) { duk_int_t rc; DUK_ASSERT_API_ENTRY(thr); /* Note: strictness is *not* inherited from the current Duktape/C. * This would be confusing because the current strictness state * depends on whether we're running inside a Duktape/C activation * (= strict mode) or outside of any activation (= non-strict mode). * See tests/api/test-eval-strictness.c for more discussion. */ /* [ ... source? filename? ] (depends on flags) */ rc = duk_compile_raw(thr, src_buffer, src_length, flags | DUK_COMPILE_EVAL); /* may be safe, or non-safe depending on flags */ /* [ ... closure/error ] */ if (rc != DUK_EXEC_SUCCESS) { rc = DUK_EXEC_ERROR; goto got_rc; } duk_push_global_object(thr); /* explicit 'this' binding, see GH-164 */ if (flags & DUK_COMPILE_SAFE) { rc = duk_pcall_method(thr, 0); } else { duk_call_method(thr, 0); rc = DUK_EXEC_SUCCESS; } /* [ ... result/error ] */ got_rc: if (flags & DUK_COMPILE_NORESULT) { duk_pop(thr); } return rc; } /* Helper which can be called both directly and with duk_safe_call(). */ DUK_LOCAL duk_ret_t duk__do_compile(duk_hthread *thr, void *udata) { duk__compile_raw_args *comp_args; duk_uint_t flags; duk_hcompfunc *h_templ; DUK_ASSERT_CTX_VALID(thr); DUK_ASSERT(udata != NULL); /* Note: strictness is not inherited from the current Duktape/C * context. Otherwise it would not be possible to compile * non-strict code inside a Duktape/C activation (which is * always strict now). See tests/api/test-eval-strictness.c * for discussion. */ /* [ ... source? filename? ] (depends on flags) */ comp_args = (duk__compile_raw_args *) udata; flags = comp_args->flags; if (flags & DUK_COMPILE_NOFILENAME) { /* Automatic filename: 'eval' or 'input'. */ duk_push_hstring_stridx(thr, (flags & DUK_COMPILE_EVAL) ? DUK_STRIDX_EVAL : DUK_STRIDX_INPUT); } /* [ ... source? filename ] */ if (!comp_args->src_buffer) { duk_hstring *h_sourcecode; h_sourcecode = duk_get_hstring(thr, -2); if ((flags & DUK_COMPILE_NOSOURCE) || /* args incorrect */ (h_sourcecode == NULL)) { /* e.g. duk_push_string_file_raw() pushed undefined */ DUK_ERROR_TYPE(thr, DUK_STR_NO_SOURCECODE); } DUK_ASSERT(h_sourcecode != NULL); comp_args->src_buffer = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_sourcecode); comp_args->src_length = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h_sourcecode); } DUK_ASSERT(comp_args->src_buffer != NULL); if (flags & DUK_COMPILE_FUNCTION) { flags |= DUK_COMPILE_EVAL | DUK_COMPILE_FUNCEXPR; } /* [ ... source? filename ] */ duk_js_compile(thr, comp_args->src_buffer, comp_args->src_length, flags); /* [ ... source? func_template ] */ if (flags & DUK_COMPILE_NOSOURCE) { ; } else { duk_remove_m2(thr); } /* [ ... func_template ] */ h_templ = (duk_hcompfunc *) duk_known_hobject(thr, -1); duk_js_push_closure(thr, h_templ, thr->builtins[DUK_BIDX_GLOBAL_ENV], thr->builtins[DUK_BIDX_GLOBAL_ENV], 1 /*add_auto_proto*/); duk_remove_m2(thr); /* -> [ ... closure ] */ /* [ ... closure ] */ return 1; } DUK_EXTERNAL duk_int_t duk_compile_raw(duk_hthread *thr, const char *src_buffer, duk_size_t src_length, duk_uint_t flags) { duk__compile_raw_args comp_args_alloc; duk__compile_raw_args *comp_args = &comp_args_alloc; DUK_ASSERT_API_ENTRY(thr); if ((flags & DUK_COMPILE_STRLEN) && (src_buffer != NULL)) { /* String length is computed here to avoid multiple evaluation * of a macro argument in the calling side. */ src_length = DUK_STRLEN(src_buffer); } comp_args->src_buffer = (const duk_uint8_t *) src_buffer; comp_args->src_length = src_length; comp_args->flags = flags; /* [ ... source? filename? ] (depends on flags) */ if (flags & DUK_COMPILE_SAFE) { duk_int_t rc; duk_int_t nargs; duk_int_t nrets = 1; /* Arguments can be: [ source? filename? &comp_args] so that * nargs is 1 to 3. Call site encodes the correct nargs count * directly into flags. */ nargs = flags & 0x07; DUK_ASSERT(nargs == ((flags & DUK_COMPILE_NOSOURCE) ? 0 : 1) + ((flags & DUK_COMPILE_NOFILENAME) ? 0 : 1)); rc = duk_safe_call(thr, duk__do_compile, (void *) comp_args, nargs, nrets); /* [ ... closure ] */ return rc; } (void) duk__do_compile(thr, (void *) comp_args); /* [ ... closure ] */ return DUK_EXEC_SUCCESS; } #line 1 "duk_api_debug.c" /* * Debugging related API calls */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_JSON_SUPPORT) DUK_EXTERNAL void duk_push_context_dump(duk_hthread *thr) { duk_idx_t idx; duk_idx_t top; DUK_ASSERT_API_ENTRY(thr); /* We don't duk_require_stack() here now, but rely on the caller having * enough space. */ top = duk_get_top(thr); duk_push_array(thr); for (idx = 0; idx < top; idx++) { duk_dup(thr, idx); duk_put_prop_index(thr, -2, (duk_uarridx_t) idx); } /* XXX: conversion errors should not propagate outwards. * Perhaps values need to be coerced individually? */ duk_bi_json_stringify_helper(thr, duk_get_top_index(thr), /*idx_value*/ DUK_INVALID_INDEX, /*idx_replacer*/ DUK_INVALID_INDEX, /*idx_space*/ DUK_JSON_FLAG_EXT_CUSTOM | DUK_JSON_FLAG_ASCII_ONLY | DUK_JSON_FLAG_AVOID_KEY_QUOTES /*flags*/); duk_push_sprintf(thr, "ctx: top=%ld, stack=%s", (long) top, (const char *) duk_safe_to_string(thr, -1)); duk_replace(thr, -3); /* [ ... arr jsonx(arr) res ] -> [ ... res jsonx(arr) ] */ duk_pop(thr); DUK_ASSERT(duk_is_string(thr, -1)); } #else /* DUK_USE_JSON_SUPPORT */ DUK_EXTERNAL void duk_push_context_dump(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); DUK_ERROR_UNSUPPORTED(thr); } #endif /* DUK_USE_JSON_SUPPORT */ #if defined(DUK_USE_DEBUGGER_SUPPORT) DUK_EXTERNAL void duk_debugger_attach(duk_hthread *thr, duk_debug_read_function read_cb, duk_debug_write_function write_cb, duk_debug_peek_function peek_cb, duk_debug_read_flush_function read_flush_cb, duk_debug_write_flush_function write_flush_cb, duk_debug_request_function request_cb, duk_debug_detached_function detached_cb, void *udata) { duk_heap *heap; const char *str; duk_size_t len; /* XXX: should there be an error or an automatic detach if * already attached? */ DUK_D(DUK_DPRINT("application called duk_debugger_attach()")); DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(read_cb != NULL); DUK_ASSERT(write_cb != NULL); /* Other callbacks are optional. */ heap = thr->heap; heap->dbg_read_cb = read_cb; heap->dbg_write_cb = write_cb; heap->dbg_peek_cb = peek_cb; heap->dbg_read_flush_cb = read_flush_cb; heap->dbg_write_flush_cb = write_flush_cb; heap->dbg_request_cb = request_cb; heap->dbg_detached_cb = detached_cb; heap->dbg_udata = udata; heap->dbg_have_next_byte = 0; /* Start in paused state. */ heap->dbg_processing = 0; heap->dbg_state_dirty = 0; heap->dbg_force_restart = 0; heap->dbg_pause_flags = 0; heap->dbg_pause_act = NULL; heap->dbg_pause_startline = 0; heap->dbg_exec_counter = 0; heap->dbg_last_counter = 0; heap->dbg_last_time = 0.0; duk_debug_set_paused(heap); /* XXX: overlap with fields above */ /* Send version identification and flush right afterwards. Note that * we must write raw, unframed bytes here. */ duk_push_sprintf(thr, "%ld %ld %s %s\n", (long) DUK_DEBUG_PROTOCOL_VERSION, (long) DUK_VERSION, (const char *) DUK_GIT_DESCRIBE, (const char *) DUK_USE_TARGET_INFO); str = duk_get_lstring(thr, -1, &len); DUK_ASSERT(str != NULL); duk_debug_write_bytes(thr, (const duk_uint8_t *) str, len); duk_debug_write_flush(thr); duk_pop(thr); } DUK_EXTERNAL void duk_debugger_detach(duk_hthread *thr) { DUK_D(DUK_DPRINT("application called duk_debugger_detach()")); DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(thr->heap != NULL); /* Can be called multiple times with no harm. */ duk_debug_do_detach(thr->heap); } DUK_EXTERNAL void duk_debugger_cooperate(duk_hthread *thr) { duk_bool_t processed_messages; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(thr->heap != NULL); if (!duk_debug_is_attached(thr->heap)) { return; } if (thr->callstack_curr != NULL || thr->heap->dbg_processing) { /* Calling duk_debugger_cooperate() while Duktape is being * called into is not supported. This is not a 100% check * but prevents any damage in most cases. */ return; } processed_messages = duk_debug_process_messages(thr, 1 /*no_block*/); DUK_UNREF(processed_messages); } DUK_EXTERNAL duk_bool_t duk_debugger_notify(duk_hthread *thr, duk_idx_t nvalues) { duk_idx_t top; duk_idx_t idx; duk_bool_t ret = 0; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(thr->heap != NULL); DUK_D(DUK_DPRINT("application called duk_debugger_notify() with nvalues=%ld", (long) nvalues)); top = duk_get_top(thr); if (top < nvalues) { DUK_ERROR_RANGE(thr, "not enough stack values for notify"); return ret; /* unreachable */ } if (duk_debug_is_attached(thr->heap)) { duk_debug_write_notify(thr, DUK_DBG_CMD_APPNOTIFY); for (idx = top - nvalues; idx < top; idx++) { duk_tval *tv = DUK_GET_TVAL_POSIDX(thr, idx); duk_debug_write_tval(thr, tv); } duk_debug_write_eom(thr); /* Return non-zero (true) if we have a good reason to believe * the notify was delivered; if we're still attached at least * a transport error was not indicated by the transport write * callback. This is not a 100% guarantee of course. */ if (duk_debug_is_attached(thr->heap)) { ret = 1; } } duk_pop_n(thr, nvalues); return ret; } DUK_EXTERNAL void duk_debugger_pause(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(thr->heap != NULL); DUK_D(DUK_DPRINT("application called duk_debugger_pause()")); /* Treat like a debugger statement: ignore when not attached. */ if (duk_debug_is_attached(thr->heap)) { if (duk_debug_is_paused(thr->heap)) { DUK_D(DUK_DPRINT("duk_debugger_pause() called when already paused; ignoring")); } else { duk_debug_set_paused(thr->heap); /* Pause on the next opcode executed. This is always safe to do even * inside the debugger message loop: the interrupt counter will be reset * to its proper value when the message loop exits. */ thr->interrupt_init = 1; thr->interrupt_counter = 0; } } } #else /* DUK_USE_DEBUGGER_SUPPORT */ DUK_EXTERNAL void duk_debugger_attach(duk_hthread *thr, duk_debug_read_function read_cb, duk_debug_write_function write_cb, duk_debug_peek_function peek_cb, duk_debug_read_flush_function read_flush_cb, duk_debug_write_flush_function write_flush_cb, duk_debug_request_function request_cb, duk_debug_detached_function detached_cb, void *udata) { DUK_ASSERT_API_ENTRY(thr); DUK_UNREF(read_cb); DUK_UNREF(write_cb); DUK_UNREF(peek_cb); DUK_UNREF(read_flush_cb); DUK_UNREF(write_flush_cb); DUK_UNREF(request_cb); DUK_UNREF(detached_cb); DUK_UNREF(udata); DUK_ERROR_TYPE(thr, "no debugger support"); } DUK_EXTERNAL void duk_debugger_detach(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); DUK_ERROR_TYPE(thr, "no debugger support"); } DUK_EXTERNAL void duk_debugger_cooperate(duk_hthread *thr) { /* nop */ DUK_ASSERT_API_ENTRY(thr); DUK_UNREF(thr); } DUK_EXTERNAL duk_bool_t duk_debugger_notify(duk_hthread *thr, duk_idx_t nvalues) { duk_idx_t top; DUK_ASSERT_API_ENTRY(thr); top = duk_get_top(thr); if (top < nvalues) { DUK_ERROR_RANGE_INVALID_COUNT(thr); return 0; /* unreachable */ } /* No debugger support, just pop values. */ duk_pop_n(thr, nvalues); return 0; } DUK_EXTERNAL void duk_debugger_pause(duk_hthread *thr) { /* Treat like debugger statement: nop */ DUK_ASSERT_API_ENTRY(thr); DUK_UNREF(thr); } #endif /* DUK_USE_DEBUGGER_SUPPORT */ #line 1 "duk_api_heap.c" /* * Heap creation and destruction */ /* #include duk_internal.h -> already included */ typedef struct duk_internal_thread_state duk_internal_thread_state; struct duk_internal_thread_state { duk_ljstate lj; duk_bool_t creating_error; duk_hthread *curr_thread; duk_int_t call_recursion_depth; }; DUK_EXTERNAL duk_hthread *duk_create_heap(duk_alloc_function alloc_func, duk_realloc_function realloc_func, duk_free_function free_func, void *heap_udata, duk_fatal_function fatal_handler) { duk_heap *heap = NULL; duk_hthread *thr; /* Assume that either all memory funcs are NULL or non-NULL, mixed * cases will now be unsafe. */ /* XXX: just assert non-NULL values here and make caller arguments * do the defaulting to the default implementations (smaller code)? */ if (!alloc_func) { DUK_ASSERT(realloc_func == NULL); DUK_ASSERT(free_func == NULL); #if defined(DUK_USE_PROVIDE_DEFAULT_ALLOC_FUNCTIONS) alloc_func = duk_default_alloc_function; realloc_func = duk_default_realloc_function; free_func = duk_default_free_function; #else DUK_D(DUK_DPRINT("no allocation functions given and no default providers")); return NULL; #endif } else { DUK_ASSERT(realloc_func != NULL); DUK_ASSERT(free_func != NULL); } if (!fatal_handler) { fatal_handler = duk_default_fatal_handler; } DUK_ASSERT(alloc_func != NULL); DUK_ASSERT(realloc_func != NULL); DUK_ASSERT(free_func != NULL); DUK_ASSERT(fatal_handler != NULL); heap = duk_heap_alloc(alloc_func, realloc_func, free_func, heap_udata, fatal_handler); if (!heap) { return NULL; } thr = heap->heap_thread; DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->heap != NULL); return thr; } DUK_EXTERNAL void duk_destroy_heap(duk_hthread *thr) { duk_heap *heap; if (!thr) { return; } DUK_ASSERT_API_ENTRY(thr); heap = thr->heap; DUK_ASSERT(heap != NULL); duk_heap_free(heap); } DUK_EXTERNAL void duk_suspend(duk_hthread *thr, duk_thread_state *state) { duk_internal_thread_state *snapshot = (duk_internal_thread_state *) (void *) state; duk_heap *heap; duk_ljstate *lj; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(thr->heap != NULL); DUK_ASSERT(state != NULL); /* unvalidated */ /* Currently not supported when called from within a finalizer. * If that is done, the finalizer will remain running indefinitely, * preventing other finalizers from executing. The assert is a bit * wider, checking that it would be OK to run pending finalizers. */ DUK_ASSERT(thr->heap->pf_prevent_count == 0); /* Currently not supported to duk_suspend() from an errCreate() * call. */ DUK_ASSERT(thr->heap->creating_error == 0); heap = thr->heap; lj = &heap->lj; duk_push_tval(thr, &lj->value1); duk_push_tval(thr, &lj->value2); /* XXX: creating_error == 0 is asserted above, so no need to store. */ DUK_MEMCPY((void *) &snapshot->lj, (const void *) lj, sizeof(duk_ljstate)); snapshot->creating_error = heap->creating_error; snapshot->curr_thread = heap->curr_thread; snapshot->call_recursion_depth = heap->call_recursion_depth; lj->jmpbuf_ptr = NULL; lj->type = DUK_LJ_TYPE_UNKNOWN; DUK_TVAL_SET_UNDEFINED(&lj->value1); DUK_TVAL_SET_UNDEFINED(&lj->value2); heap->creating_error = 0; heap->curr_thread = NULL; heap->call_recursion_depth = 0; } DUK_EXTERNAL void duk_resume(duk_hthread *thr, const duk_thread_state *state) { const duk_internal_thread_state *snapshot = (const duk_internal_thread_state *) (const void *) state; duk_heap *heap; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(thr->heap != NULL); DUK_ASSERT(state != NULL); /* unvalidated */ /* Shouldn't be necessary if duk_suspend() is called before * duk_resume(), but assert in case API sequence is incorrect. */ DUK_ASSERT(thr->heap->pf_prevent_count == 0); DUK_ASSERT(thr->heap->creating_error == 0); heap = thr->heap; DUK_MEMCPY((void *) &heap->lj, (const void *) &snapshot->lj, sizeof(duk_ljstate)); heap->creating_error = snapshot->creating_error; heap->curr_thread = snapshot->curr_thread; heap->call_recursion_depth = snapshot->call_recursion_depth; duk_pop_2(thr); } /* XXX: better place for this */ DUK_EXTERNAL void duk_set_global_object(duk_hthread *thr) { duk_hobject *h_glob; duk_hobject *h_prev_glob; duk_hobjenv *h_env; duk_hobject *h_prev_env; DUK_ASSERT_API_ENTRY(thr); DUK_D(DUK_DPRINT("replace global object with: %!T", duk_get_tval(thr, -1))); h_glob = duk_require_hobject(thr, -1); DUK_ASSERT(h_glob != NULL); /* * Replace global object. */ h_prev_glob = thr->builtins[DUK_BIDX_GLOBAL]; DUK_UNREF(h_prev_glob); thr->builtins[DUK_BIDX_GLOBAL] = h_glob; DUK_HOBJECT_INCREF(thr, h_glob); DUK_HOBJECT_DECREF_ALLOWNULL(thr, h_prev_glob); /* side effects, in theory (referenced by global env) */ /* * Replace lexical environment for global scope * * Create a new object environment for the global lexical scope. * We can't just reset the _Target property of the current one, * because the lexical scope is shared by other threads with the * same (initial) built-ins. */ h_env = duk_hobjenv_alloc(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJENV)); DUK_ASSERT(h_env != NULL); DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) h_env) == NULL); DUK_ASSERT(h_env->target == NULL); DUK_ASSERT(h_glob != NULL); h_env->target = h_glob; DUK_HOBJECT_INCREF(thr, h_glob); DUK_ASSERT(h_env->has_this == 0); /* [ ... new_glob ] */ h_prev_env = thr->builtins[DUK_BIDX_GLOBAL_ENV]; thr->builtins[DUK_BIDX_GLOBAL_ENV] = (duk_hobject *) h_env; DUK_HOBJECT_INCREF(thr, (duk_hobject *) h_env); DUK_HOBJECT_DECREF_ALLOWNULL(thr, h_prev_env); /* side effects */ DUK_UNREF(h_env); /* without refcounts */ DUK_UNREF(h_prev_env); /* [ ... new_glob ] */ duk_pop(thr); /* [ ... ] */ } #line 1 "duk_api_inspect.c" /* * Inspection */ /* #include duk_internal.h -> already included */ /* For footprint efficient multiple value setting: arrays are much better than * varargs, format string with parsing is often better than string pointer arrays. */ DUK_LOCAL void duk__inspect_multiple_uint(duk_hthread *thr, const char *fmt, duk_int_t *vals) { duk_int_t val; const char *p; const char *p_curr; duk_size_t len; for (p = fmt;;) { len = DUK_STRLEN(p); p_curr = p; p += len + 1; if (len == 0) { /* Double NUL (= empty key) terminates. */ break; } val = *vals++; if (val >= 0) { /* Negative values are markers to skip key. */ duk_push_string(thr, p_curr); duk_push_int(thr, val); duk_put_prop(thr, -3); } } } /* Raw helper to extract internal information / statistics about a value. * The return value is an object with properties that are version specific. * The properties must not expose anything that would lead to security * issues (e.g. exposing compiled function 'data' buffer might be an issue). * Currently only counts and sizes and such are given so there shouldn't * be security implications. */ #define DUK__IDX_TYPE 0 #define DUK__IDX_ITAG 1 #define DUK__IDX_REFC 2 #define DUK__IDX_HBYTES 3 #define DUK__IDX_CLASS 4 #define DUK__IDX_PBYTES 5 #define DUK__IDX_ESIZE 6 #define DUK__IDX_ENEXT 7 #define DUK__IDX_ASIZE 8 #define DUK__IDX_HSIZE 9 #define DUK__IDX_BCBYTES 10 #define DUK__IDX_DBYTES 11 #define DUK__IDX_TSTATE 12 #define DUK__IDX_VARIANT 13 DUK_EXTERNAL void duk_inspect_value(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; duk_heaphdr *h; /* The temporary values should be in an array rather than individual * variables which (in practice) ensures that the compiler won't map * them to registers and emit a lot of unnecessary shuffling code. */ duk_int_t vals[14]; DUK_ASSERT_API_ENTRY(thr); /* Assume two's complement and set everything to -1. */ DUK_MEMSET((void *) &vals, (int) 0xff, sizeof(vals)); DUK_ASSERT(vals[DUK__IDX_TYPE] == -1); /* spot check one */ tv = duk_get_tval_or_unused(thr, idx); h = (DUK_TVAL_IS_HEAP_ALLOCATED(tv) ? DUK_TVAL_GET_HEAPHDR(tv) : NULL); vals[DUK__IDX_TYPE] = duk_get_type_tval(tv); vals[DUK__IDX_ITAG] = (duk_int_t) DUK_TVAL_GET_TAG(tv); duk_push_bare_object(thr); /* Invalidates 'tv'. */ tv = NULL; if (h == NULL) { goto finish; } duk_push_pointer(thr, (void *) h); duk_put_prop_string(thr, -2, "hptr"); #if 0 /* Covers a lot of information, e.g. buffer and string variants. */ duk_push_uint(thr, (duk_uint_t) DUK_HEAPHDR_GET_FLAGS(h)); duk_put_prop_string(thr, -2, "hflags"); #endif #if defined(DUK_USE_REFERENCE_COUNTING) vals[DUK__IDX_REFC] = (duk_int_t) DUK_HEAPHDR_GET_REFCOUNT(h); #endif vals[DUK__IDX_VARIANT] = 0; /* Heaphdr size and additional allocation size, followed by * type specific stuff (with varying value count). */ switch ((duk_small_int_t) DUK_HEAPHDR_GET_TYPE(h)) { case DUK_HTYPE_STRING: { duk_hstring *h_str = (duk_hstring *) h; vals[DUK__IDX_HBYTES] = (duk_int_t) (sizeof(duk_hstring) + DUK_HSTRING_GET_BYTELEN(h_str) + 1); #if defined(DUK_USE_HSTRING_EXTDATA) if (DUK_HSTRING_HAS_EXTDATA(h_str)) { vals[DUK__IDX_VARIANT] = 1; } #endif break; } case DUK_HTYPE_OBJECT: { duk_hobject *h_obj = (duk_hobject *) h; /* XXX: variants here are maybe pointless; class is enough? */ if (DUK_HOBJECT_IS_ARRAY(h_obj)) { vals[DUK__IDX_HBYTES] = sizeof(duk_harray); } else if (DUK_HOBJECT_IS_COMPFUNC(h_obj)) { vals[DUK__IDX_HBYTES] = sizeof(duk_hcompfunc); } else if (DUK_HOBJECT_IS_NATFUNC(h_obj)) { vals[DUK__IDX_HBYTES] = sizeof(duk_hnatfunc); } else if (DUK_HOBJECT_IS_THREAD(h_obj)) { vals[DUK__IDX_HBYTES] = sizeof(duk_hthread); vals[DUK__IDX_TSTATE] = ((duk_hthread *) h_obj)->state; #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) } else if (DUK_HOBJECT_IS_BUFOBJ(h_obj)) { vals[DUK__IDX_HBYTES] = sizeof(duk_hbufobj); /* XXX: some size information */ #endif } else { vals[DUK__IDX_HBYTES] = (duk_small_uint_t) sizeof(duk_hobject); } vals[DUK__IDX_CLASS] = (duk_int_t) DUK_HOBJECT_GET_CLASS_NUMBER(h_obj); vals[DUK__IDX_PBYTES] = (duk_int_t) DUK_HOBJECT_P_ALLOC_SIZE(h_obj), vals[DUK__IDX_ESIZE] = (duk_int_t) DUK_HOBJECT_GET_ESIZE(h_obj); vals[DUK__IDX_ENEXT] = (duk_int_t) DUK_HOBJECT_GET_ENEXT(h_obj); vals[DUK__IDX_ASIZE] = (duk_int_t) DUK_HOBJECT_GET_ASIZE(h_obj); vals[DUK__IDX_HSIZE] = (duk_int_t) DUK_HOBJECT_GET_HSIZE(h_obj); /* Note: e_next indicates the number of gc-reachable entries * in the entry part, and also indicates the index where the * next new property would be inserted. It does *not* indicate * the number of non-NULL keys present in the object. That * value could be counted separately but requires a pass through * the key list. */ if (DUK_HOBJECT_IS_COMPFUNC(h_obj)) { duk_hbuffer *h_data = (duk_hbuffer *) DUK_HCOMPFUNC_GET_DATA(thr->heap, (duk_hcompfunc *) h_obj); vals[DUK__IDX_BCBYTES] = (duk_int_t) (h_data ? DUK_HBUFFER_GET_SIZE(h_data) : 0); } break; } case DUK_HTYPE_BUFFER: { duk_hbuffer *h_buf = (duk_hbuffer *) h; if (DUK_HBUFFER_HAS_DYNAMIC(h_buf)) { if (DUK_HBUFFER_HAS_EXTERNAL(h_buf)) { vals[DUK__IDX_VARIANT] = 2; /* buffer variant 2: external */ vals[DUK__IDX_HBYTES] = (duk_uint_t) (sizeof(duk_hbuffer_external)); } else { /* When alloc_size == 0 the second allocation may not * actually exist. */ vals[DUK__IDX_VARIANT] = 1; /* buffer variant 1: dynamic */ vals[DUK__IDX_HBYTES] = (duk_uint_t) (sizeof(duk_hbuffer_dynamic)); } vals[DUK__IDX_DBYTES] = (duk_int_t) (DUK_HBUFFER_GET_SIZE(h_buf)); } else { DUK_ASSERT(vals[DUK__IDX_VARIANT] == 0); /* buffer variant 0: fixed */ vals[DUK__IDX_HBYTES] = (duk_int_t) (sizeof(duk_hbuffer_fixed) + DUK_HBUFFER_GET_SIZE(h_buf)); } break; } } finish: duk__inspect_multiple_uint(thr, "type" "\x00" "itag" "\x00" "refc" "\x00" "hbytes" "\x00" "class" "\x00" "pbytes" "\x00" "esize" "\x00" "enext" "\x00" "asize" "\x00" "hsize" "\x00" "bcbytes" "\x00" "dbytes" "\x00" "tstate" "\x00" "variant" "\x00" "\x00", (duk_int_t *) &vals); } DUK_EXTERNAL void duk_inspect_callstack_entry(duk_hthread *thr, duk_int_t level) { duk_activation *act; duk_uint_fast32_t pc; duk_uint_fast32_t line; DUK_ASSERT_API_ENTRY(thr); /* -1 = top callstack entry * -2 = caller of level -1 * etc */ act = duk_hthread_get_activation_for_level(thr, level); if (act == NULL) { duk_push_undefined(thr); return; } duk_push_bare_object(thr); /* Relevant PC is just before current one because PC is * post-incremented. This should match what error augment * code does. */ pc = duk_hthread_get_act_prev_pc(thr, act); duk_push_tval(thr, &act->tv_func); duk_push_uint(thr, (duk_uint_t) pc); duk_put_prop_stridx_short(thr, -3, DUK_STRIDX_PC); #if defined(DUK_USE_PC2LINE) line = duk_hobject_pc2line_query(thr, -1, pc); #else line = 0; #endif duk_push_uint(thr, (duk_uint_t) line); duk_put_prop_stridx_short(thr, -3, DUK_STRIDX_LINE_NUMBER); duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_LC_FUNCTION); /* Providing access to e.g. act->lex_env would be dangerous: these * internal structures must never be accessible to the application. * Duktape relies on them having consistent data, and this consistency * is only asserted for, not checked for. */ } /* automatic undefs */ #undef DUK__IDX_ASIZE #undef DUK__IDX_BCBYTES #undef DUK__IDX_CLASS #undef DUK__IDX_DBYTES #undef DUK__IDX_ENEXT #undef DUK__IDX_ESIZE #undef DUK__IDX_HBYTES #undef DUK__IDX_HSIZE #undef DUK__IDX_ITAG #undef DUK__IDX_PBYTES #undef DUK__IDX_REFC #undef DUK__IDX_TSTATE #undef DUK__IDX_TYPE #undef DUK__IDX_VARIANT #line 1 "duk_api_memory.c" /* * Memory calls. */ /* #include duk_internal.h -> already included */ DUK_EXTERNAL void *duk_alloc_raw(duk_hthread *thr, duk_size_t size) { DUK_ASSERT_API_ENTRY(thr); return DUK_ALLOC_RAW(thr->heap, size); } DUK_EXTERNAL void duk_free_raw(duk_hthread *thr, void *ptr) { DUK_ASSERT_API_ENTRY(thr); DUK_FREE_RAW(thr->heap, ptr); } DUK_EXTERNAL void *duk_realloc_raw(duk_hthread *thr, void *ptr, duk_size_t size) { DUK_ASSERT_API_ENTRY(thr); return DUK_REALLOC_RAW(thr->heap, ptr, size); } DUK_EXTERNAL void *duk_alloc(duk_hthread *thr, duk_size_t size) { DUK_ASSERT_API_ENTRY(thr); return DUK_ALLOC(thr->heap, size); } DUK_EXTERNAL void duk_free(duk_hthread *thr, void *ptr) { DUK_ASSERT_API_ENTRY(thr); DUK_FREE_CHECKED(thr, ptr); } DUK_EXTERNAL void *duk_realloc(duk_hthread *thr, void *ptr, duk_size_t size) { DUK_ASSERT_API_ENTRY(thr); /* * Note: since this is an exposed API call, there should be * no way a mark-and-sweep could have a side effect on the * memory allocation behind 'ptr'; the pointer should never * be something that Duktape wants to change. * * Thus, no need to use DUK_REALLOC_INDIRECT (and we don't * have the storage location here anyway). */ return DUK_REALLOC(thr->heap, ptr, size); } DUK_EXTERNAL void duk_get_memory_functions(duk_hthread *thr, duk_memory_functions *out_funcs) { duk_heap *heap; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(out_funcs != NULL); DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->heap != NULL); heap = thr->heap; out_funcs->alloc_func = heap->alloc_func; out_funcs->realloc_func = heap->realloc_func; out_funcs->free_func = heap->free_func; out_funcs->udata = heap->heap_udata; } DUK_EXTERNAL void duk_gc(duk_hthread *thr, duk_uint_t flags) { duk_heap *heap; duk_small_uint_t ms_flags; DUK_ASSERT_API_ENTRY(thr); heap = thr->heap; DUK_ASSERT(heap != NULL); DUK_D(DUK_DPRINT("mark-and-sweep requested by application")); DUK_ASSERT(DUK_GC_COMPACT == DUK_MS_FLAG_EMERGENCY); /* Compact flag is 1:1 with emergency flag which forces compaction. */ ms_flags = (duk_small_uint_t) flags; duk_heap_mark_and_sweep(heap, ms_flags); } #line 1 "duk_api_object.c" /* * Object handling: property access and other support functions. */ /* #include duk_internal.h -> already included */ /* * Property handling * * The API exposes only the most common property handling functions. * The caller can invoke Ecmascript built-ins for full control (e.g. * defineProperty, getOwnPropertyDescriptor). */ DUK_EXTERNAL duk_bool_t duk_get_prop(duk_hthread *thr, duk_idx_t obj_idx) { duk_tval *tv_obj; duk_tval *tv_key; duk_bool_t rc; DUK_ASSERT_API_ENTRY(thr); /* Note: copying tv_obj and tv_key to locals to shield against a valstack * resize is not necessary for a property get right now. */ tv_obj = duk_require_tval(thr, obj_idx); tv_key = duk_require_tval(thr, -1); rc = duk_hobject_getprop(thr, tv_obj, tv_key); DUK_ASSERT(rc == 0 || rc == 1); /* a value is left on stack regardless of rc */ duk_remove_m2(thr); /* remove key */ DUK_ASSERT(duk_is_undefined(thr, -1) || rc == 1); return rc; /* 1 if property found, 0 otherwise */ } DUK_EXTERNAL duk_bool_t duk_get_prop_string(duk_hthread *thr, duk_idx_t obj_idx, const char *key) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(key != NULL); obj_idx = duk_require_normalize_index(thr, obj_idx); duk_push_string(thr, key); return duk_get_prop(thr, obj_idx); } DUK_EXTERNAL duk_bool_t duk_get_prop_lstring(duk_hthread *thr, duk_idx_t obj_idx, const char *key, duk_size_t key_len) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(key != NULL); obj_idx = duk_require_normalize_index(thr, obj_idx); duk_push_lstring(thr, key, key_len); return duk_get_prop(thr, obj_idx); } DUK_EXTERNAL duk_bool_t duk_get_prop_index(duk_hthread *thr, duk_idx_t obj_idx, duk_uarridx_t arr_idx) { DUK_ASSERT_API_ENTRY(thr); obj_idx = duk_require_normalize_index(thr, obj_idx); duk_push_uarridx(thr, arr_idx); return duk_get_prop(thr, obj_idx); } DUK_EXTERNAL duk_bool_t duk_get_prop_heapptr(duk_hthread *thr, duk_idx_t obj_idx, void *ptr) { DUK_ASSERT_API_ENTRY(thr); obj_idx = duk_require_normalize_index(thr, obj_idx); duk_push_heapptr(thr, ptr); /* NULL -> 'undefined' */ return duk_get_prop(thr, obj_idx); } DUK_INTERNAL duk_bool_t duk_get_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT_STRIDX_VALID(stridx); obj_idx = duk_require_normalize_index(thr, obj_idx); duk_push_hstring(thr, DUK_HTHREAD_GET_STRING(thr, stridx)); return duk_get_prop(thr, obj_idx); } DUK_INTERNAL duk_bool_t duk_get_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args) { return duk_get_prop_stridx(thr, (duk_idx_t) (duk_int16_t) (packed_args >> 16), (duk_small_uint_t) (packed_args & 0xffffUL)); } DUK_INTERNAL duk_bool_t duk_get_prop_stridx_boolean(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx, duk_bool_t *out_has_prop) { duk_bool_t rc; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT_STRIDX_VALID(stridx); rc = duk_get_prop_stridx(thr, obj_idx, stridx); if (out_has_prop) { *out_has_prop = rc; } rc = duk_to_boolean(thr, -1); DUK_ASSERT(rc == 0 || rc == 1); duk_pop(thr); return rc; } DUK_LOCAL duk_bool_t duk__put_prop_shared(duk_hthread *thr, duk_idx_t obj_idx, duk_idx_t idx_key) { duk_tval *tv_obj; duk_tval *tv_key; duk_tval *tv_val; duk_bool_t throw_flag; duk_bool_t rc; /* Note: copying tv_obj and tv_key to locals to shield against a valstack * resize is not necessary for a property put right now (putprop protects * against it internally). */ /* Key and value indices are either (-2, -1) or (-1, -2). Given idx_key, * idx_val is always (idx_key ^ 0x01). */ DUK_ASSERT((idx_key == -2 && (idx_key ^ 1) == -1) || (idx_key == -1 && (idx_key ^ 1) == -2)); /* XXX: Direct access; faster validation. */ tv_obj = duk_require_tval(thr, obj_idx); tv_key = duk_require_tval(thr, idx_key); tv_val = duk_require_tval(thr, idx_key ^ 1); throw_flag = duk_is_strict_call(thr); rc = duk_hobject_putprop(thr, tv_obj, tv_key, tv_val, throw_flag); DUK_ASSERT(rc == 0 || rc == 1); duk_pop_2(thr); /* remove key and value */ return rc; /* 1 if property found, 0 otherwise */ } DUK_EXTERNAL duk_bool_t duk_put_prop(duk_hthread *thr, duk_idx_t obj_idx) { DUK_ASSERT_API_ENTRY(thr); return duk__put_prop_shared(thr, obj_idx, -2); } DUK_EXTERNAL duk_bool_t duk_put_prop_string(duk_hthread *thr, duk_idx_t obj_idx, const char *key) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(key != NULL); /* Careful here and with other duk_put_prop_xxx() helpers: the * target object and the property value may be in the same value * stack slot (unusual, but still conceptually clear). */ obj_idx = duk_normalize_index(thr, obj_idx); (void) duk_push_string(thr, key); return duk__put_prop_shared(thr, obj_idx, -1); } DUK_EXTERNAL duk_bool_t duk_put_prop_lstring(duk_hthread *thr, duk_idx_t obj_idx, const char *key, duk_size_t key_len) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(key != NULL); obj_idx = duk_normalize_index(thr, obj_idx); (void) duk_push_lstring(thr, key, key_len); return duk__put_prop_shared(thr, obj_idx, -1); } DUK_EXTERNAL duk_bool_t duk_put_prop_index(duk_hthread *thr, duk_idx_t obj_idx, duk_uarridx_t arr_idx) { DUK_ASSERT_API_ENTRY(thr); obj_idx = duk_require_normalize_index(thr, obj_idx); duk_push_uarridx(thr, arr_idx); return duk__put_prop_shared(thr, obj_idx, -1); } DUK_EXTERNAL duk_bool_t duk_put_prop_heapptr(duk_hthread *thr, duk_idx_t obj_idx, void *ptr) { DUK_ASSERT_API_ENTRY(thr); obj_idx = duk_require_normalize_index(thr, obj_idx); duk_push_heapptr(thr, ptr); /* NULL -> 'undefined' */ return duk__put_prop_shared(thr, obj_idx, -1); } DUK_INTERNAL duk_bool_t duk_put_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT_STRIDX_VALID(stridx); obj_idx = duk_require_normalize_index(thr, obj_idx); duk_push_hstring(thr, DUK_HTHREAD_GET_STRING(thr, stridx)); return duk__put_prop_shared(thr, obj_idx, -1); } DUK_INTERNAL duk_bool_t duk_put_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args) { return duk_put_prop_stridx(thr, (duk_idx_t) (duk_int16_t) (packed_args >> 16), (duk_small_uint_t) (packed_args & 0xffffUL)); } DUK_EXTERNAL duk_bool_t duk_del_prop(duk_hthread *thr, duk_idx_t obj_idx) { duk_tval *tv_obj; duk_tval *tv_key; duk_bool_t throw_flag; duk_bool_t rc; DUK_ASSERT_API_ENTRY(thr); /* Note: copying tv_obj and tv_key to locals to shield against a valstack * resize is not necessary for a property delete right now. */ tv_obj = duk_require_tval(thr, obj_idx); tv_key = duk_require_tval(thr, -1); throw_flag = duk_is_strict_call(thr); rc = duk_hobject_delprop(thr, tv_obj, tv_key, throw_flag); DUK_ASSERT(rc == 0 || rc == 1); duk_pop(thr); /* remove key */ return rc; } DUK_EXTERNAL duk_bool_t duk_del_prop_string(duk_hthread *thr, duk_idx_t obj_idx, const char *key) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(key != NULL); obj_idx = duk_require_normalize_index(thr, obj_idx); duk_push_string(thr, key); return duk_del_prop(thr, obj_idx); } DUK_EXTERNAL duk_bool_t duk_del_prop_lstring(duk_hthread *thr, duk_idx_t obj_idx, const char *key, duk_size_t key_len) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(key != NULL); obj_idx = duk_require_normalize_index(thr, obj_idx); duk_push_lstring(thr, key, key_len); return duk_del_prop(thr, obj_idx); } DUK_EXTERNAL duk_bool_t duk_del_prop_index(duk_hthread *thr, duk_idx_t obj_idx, duk_uarridx_t arr_idx) { DUK_ASSERT_API_ENTRY(thr); obj_idx = duk_require_normalize_index(thr, obj_idx); duk_push_uarridx(thr, arr_idx); return duk_del_prop(thr, obj_idx); } DUK_EXTERNAL duk_bool_t duk_del_prop_heapptr(duk_hthread *thr, duk_idx_t obj_idx, void *ptr) { DUK_ASSERT_API_ENTRY(thr); obj_idx = duk_require_normalize_index(thr, obj_idx); duk_push_heapptr(thr, ptr); /* NULL -> 'undefined' */ return duk_del_prop(thr, obj_idx); } DUK_INTERNAL duk_bool_t duk_del_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT_STRIDX_VALID(stridx); obj_idx = duk_require_normalize_index(thr, obj_idx); duk_push_hstring(thr, DUK_HTHREAD_GET_STRING(thr, stridx)); return duk_del_prop(thr, obj_idx); } #if 0 DUK_INTERNAL duk_bool_t duk_del_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args) { return duk_del_prop_stridx(thr, (duk_idx_t) (duk_int16_t) (packed_args >> 16), (duk_small_uint_t) (packed_args & 0xffffUL)); } #endif DUK_EXTERNAL duk_bool_t duk_has_prop(duk_hthread *thr, duk_idx_t obj_idx) { duk_tval *tv_obj; duk_tval *tv_key; duk_bool_t rc; DUK_ASSERT_API_ENTRY(thr); /* Note: copying tv_obj and tv_key to locals to shield against a valstack * resize is not necessary for a property existence check right now. */ tv_obj = duk_require_tval(thr, obj_idx); tv_key = duk_require_tval(thr, -1); rc = duk_hobject_hasprop(thr, tv_obj, tv_key); DUK_ASSERT(rc == 0 || rc == 1); duk_pop(thr); /* remove key */ return rc; /* 1 if property found, 0 otherwise */ } DUK_EXTERNAL duk_bool_t duk_has_prop_string(duk_hthread *thr, duk_idx_t obj_idx, const char *key) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(key != NULL); obj_idx = duk_require_normalize_index(thr, obj_idx); duk_push_string(thr, key); return duk_has_prop(thr, obj_idx); } DUK_EXTERNAL duk_bool_t duk_has_prop_lstring(duk_hthread *thr, duk_idx_t obj_idx, const char *key, duk_size_t key_len) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(key != NULL); obj_idx = duk_require_normalize_index(thr, obj_idx); duk_push_lstring(thr, key, key_len); return duk_has_prop(thr, obj_idx); } DUK_EXTERNAL duk_bool_t duk_has_prop_index(duk_hthread *thr, duk_idx_t obj_idx, duk_uarridx_t arr_idx) { DUK_ASSERT_API_ENTRY(thr); obj_idx = duk_require_normalize_index(thr, obj_idx); duk_push_uarridx(thr, arr_idx); return duk_has_prop(thr, obj_idx); } DUK_EXTERNAL duk_bool_t duk_has_prop_heapptr(duk_hthread *thr, duk_idx_t obj_idx, void *ptr) { DUK_ASSERT_API_ENTRY(thr); obj_idx = duk_require_normalize_index(thr, obj_idx); duk_push_heapptr(thr, ptr); /* NULL -> 'undefined' */ return duk_has_prop(thr, obj_idx); } DUK_INTERNAL duk_bool_t duk_has_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT_STRIDX_VALID(stridx); obj_idx = duk_require_normalize_index(thr, obj_idx); duk_push_hstring(thr, DUK_HTHREAD_GET_STRING(thr, stridx)); return duk_has_prop(thr, obj_idx); } #if 0 DUK_INTERNAL duk_bool_t duk_has_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args) { return duk_has_prop_stridx(thr, (duk_idx_t) (duk_int16_t) (packed_args >> 16), (duk_small_uint_t) (packed_args & 0xffffUL)); } #endif /* Define own property without inheritance lookups and such. This differs from * [[DefineOwnProperty]] because special behaviors (like Array 'length') are * not invoked by this method. The caller must be careful to invoke any such * behaviors if necessary. */ DUK_INTERNAL void duk_xdef_prop(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t desc_flags) { duk_hobject *obj; duk_hstring *key; DUK_ASSERT_API_ENTRY(thr); obj = duk_require_hobject(thr, obj_idx); DUK_ASSERT(obj != NULL); key = duk_to_property_key_hstring(thr, -2); DUK_ASSERT(key != NULL); DUK_ASSERT(duk_require_tval(thr, -1) != NULL); duk_hobject_define_property_internal(thr, obj, key, desc_flags); duk_pop(thr); /* pop key */ } DUK_INTERNAL void duk_xdef_prop_index(duk_hthread *thr, duk_idx_t obj_idx, duk_uarridx_t arr_idx, duk_small_uint_t desc_flags) { duk_hobject *obj; DUK_ASSERT_API_ENTRY(thr); obj = duk_require_hobject(thr, obj_idx); DUK_ASSERT(obj != NULL); duk_hobject_define_property_internal_arridx(thr, obj, arr_idx, desc_flags); /* value popped by call */ } DUK_INTERNAL void duk_xdef_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx, duk_small_uint_t desc_flags) { duk_hobject *obj; duk_hstring *key; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT_STRIDX_VALID(stridx); obj = duk_require_hobject(thr, obj_idx); DUK_ASSERT(obj != NULL); key = DUK_HTHREAD_GET_STRING(thr, stridx); DUK_ASSERT(key != NULL); DUK_ASSERT(duk_require_tval(thr, -1) != NULL); duk_hobject_define_property_internal(thr, obj, key, desc_flags); /* value popped by call */ } DUK_INTERNAL void duk_xdef_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args) { duk_xdef_prop_stridx(thr, (duk_idx_t) (duk_int8_t) (packed_args >> 24), (duk_small_uint_t) (packed_args >> 8) & 0xffffUL, (duk_small_uint_t) (packed_args & 0xffL)); } #if 0 /*unused*/ DUK_INTERNAL void duk_xdef_prop_stridx_builtin(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx, duk_small_int_t builtin_idx, duk_small_uint_t desc_flags) { duk_hobject *obj; duk_hstring *key; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT_STRIDX_VALID(stridx); DUK_ASSERT_BIDX_VALID(builtin_idx); obj = duk_require_hobject(thr, obj_idx); DUK_ASSERT(obj != NULL); key = DUK_HTHREAD_GET_STRING(thr, stridx); DUK_ASSERT(key != NULL); duk_push_hobject(thr, thr->builtins[builtin_idx]); duk_hobject_define_property_internal(thr, obj, key, desc_flags); /* value popped by call */ } #endif /* This is a rare property helper; it sets the global thrower (E5 Section 13.2.3) * setter/getter into an object property. This is needed by the 'arguments' * object creation code, function instance creation code, and Function.prototype.bind(). */ DUK_INTERNAL void duk_xdef_prop_stridx_thrower(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx) { DUK_ASSERT_API_ENTRY(thr); obj_idx = duk_require_normalize_index(thr, obj_idx); duk_push_hstring_stridx(thr, stridx); duk_push_hobject_bidx(thr, DUK_BIDX_TYPE_ERROR_THROWER); duk_dup_top(thr); duk_def_prop(thr, obj_idx, DUK_DEFPROP_HAVE_SETTER | DUK_DEFPROP_HAVE_GETTER | DUK_DEFPROP_FORCE); /* attributes always 0 */ } /* Object.getOwnPropertyDescriptor() equivalent C binding. */ DUK_EXTERNAL void duk_get_prop_desc(duk_hthread *thr, duk_idx_t obj_idx, duk_uint_t flags) { DUK_ASSERT_API_ENTRY(thr); DUK_UNREF(flags); /* no flags defined yet */ duk_hobject_object_get_own_property_descriptor(thr, obj_idx); /* [ ... key ] -> [ ... desc ] */ } /* Object.defineProperty() equivalent C binding. */ DUK_EXTERNAL void duk_def_prop(duk_hthread *thr, duk_idx_t obj_idx, duk_uint_t flags) { duk_idx_t idx_base; duk_hobject *obj; duk_hstring *key; duk_idx_t idx_value; duk_hobject *get; duk_hobject *set; duk_uint_t is_data_desc; duk_uint_t is_acc_desc; DUK_ASSERT_API_ENTRY(thr); obj = duk_require_hobject(thr, obj_idx); is_data_desc = flags & (DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_HAVE_WRITABLE); is_acc_desc = flags & (DUK_DEFPROP_HAVE_GETTER | DUK_DEFPROP_HAVE_SETTER); if (is_data_desc && is_acc_desc) { /* "Have" flags must not be conflicting so that they would * apply to both a plain property and an accessor at the same * time. */ goto fail_invalid_desc; } idx_base = duk_get_top_index(thr); if (flags & DUK_DEFPROP_HAVE_SETTER) { duk_require_type_mask(thr, idx_base, DUK_TYPE_MASK_UNDEFINED | DUK_TYPE_MASK_OBJECT | DUK_TYPE_MASK_LIGHTFUNC); set = duk_get_hobject_promote_lfunc(thr, idx_base); if (set != NULL && !DUK_HOBJECT_IS_CALLABLE(set)) { goto fail_not_callable; } idx_base--; } else { set = NULL; } if (flags & DUK_DEFPROP_HAVE_GETTER) { duk_require_type_mask(thr, idx_base, DUK_TYPE_MASK_UNDEFINED | DUK_TYPE_MASK_OBJECT | DUK_TYPE_MASK_LIGHTFUNC); get = duk_get_hobject_promote_lfunc(thr, idx_base); if (get != NULL && !DUK_HOBJECT_IS_CALLABLE(get)) { goto fail_not_callable; } idx_base--; } else { get = NULL; } if (flags & DUK_DEFPROP_HAVE_VALUE) { idx_value = idx_base; idx_base--; } else { idx_value = (duk_idx_t) -1; } key = duk_to_property_key_hstring(thr, idx_base); DUK_ASSERT(key != NULL); duk_require_valid_index(thr, idx_base); duk_hobject_define_property_helper(thr, flags /*defprop_flags*/, obj, key, idx_value, get, set, 1 /*throw_flag*/); /* Clean up stack */ duk_set_top(thr, idx_base); /* [ ... obj ... ] */ return; fail_invalid_desc: DUK_ERROR_TYPE(thr, DUK_STR_INVALID_DESCRIPTOR); return; fail_not_callable: DUK_ERROR_TYPE(thr, DUK_STR_NOT_CALLABLE); return; } /* * Object related * * Note: seal() and freeze() are accessible through Ecmascript bindings, * and are not exposed through the API. */ DUK_EXTERNAL void duk_compact(duk_hthread *thr, duk_idx_t obj_idx) { duk_hobject *obj; DUK_ASSERT_API_ENTRY(thr); obj = duk_get_hobject(thr, obj_idx); if (obj) { /* Note: this may fail, caller should protect the call if necessary */ duk_hobject_compact_props(thr, obj); } } DUK_INTERNAL void duk_compact_m1(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); duk_compact(thr, -1); } /* XXX: the duk_hobject_enum.c stack APIs should be reworked */ DUK_EXTERNAL void duk_enum(duk_hthread *thr, duk_idx_t obj_idx, duk_uint_t enum_flags) { DUK_ASSERT_API_ENTRY(thr); duk_dup(thr, obj_idx); duk_require_hobject_promote_mask(thr, -1, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER); duk_hobject_enumerator_create(thr, enum_flags); /* [target] -> [enum] */ } DUK_EXTERNAL duk_bool_t duk_next(duk_hthread *thr, duk_idx_t enum_index, duk_bool_t get_value) { DUK_ASSERT_API_ENTRY(thr); duk_require_hobject(thr, enum_index); duk_dup(thr, enum_index); return duk_hobject_enumerator_next(thr, get_value); } DUK_INTERNAL void duk_seal_freeze_raw(duk_hthread *thr, duk_idx_t obj_idx, duk_bool_t is_freeze) { duk_tval *tv; duk_hobject *h; DUK_ASSERT_API_ENTRY(thr); tv = duk_require_tval(thr, obj_idx); DUK_ASSERT(tv != NULL); /* Seal/freeze are quite rare in practice so it'd be nice to get the * correct behavior simply via automatic promotion (at the cost of some * memory churn). However, the promoted objects don't behave the same, * e.g. promoted lightfuncs are extensible. */ switch (DUK_TVAL_GET_TAG(tv)) { case DUK_TAG_BUFFER: /* Plain buffer: already sealed, but not frozen (and can't be frozen * because index properties can't be made non-writable. */ if (is_freeze) { goto fail_cannot_freeze; } break; case DUK_TAG_LIGHTFUNC: /* Lightfunc: already sealed and frozen, success. */ break; case DUK_TAG_OBJECT: h = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h != NULL); if (is_freeze && DUK_HOBJECT_IS_BUFOBJ(h)) { /* Buffer objects cannot be frozen because there's no internal * support for making virtual array indices non-writable. */ DUK_DD(DUK_DDPRINT("cannot freeze a buffer object")); goto fail_cannot_freeze; } duk_hobject_object_seal_freeze_helper(thr, h, is_freeze); /* Sealed and frozen objects cannot gain any more properties, * so this is a good time to compact them. */ duk_hobject_compact_props(thr, h); break; default: /* ES2015 Sections 19.1.2.5, 19.1.2.17 */ break; } return; fail_cannot_freeze: DUK_ERROR_TYPE_INVALID_ARGS(thr); /* XXX: proper error message */ } DUK_EXTERNAL void duk_seal(duk_hthread *thr, duk_idx_t obj_idx) { DUK_ASSERT_API_ENTRY(thr); duk_seal_freeze_raw(thr, obj_idx, 0 /*is_freeze*/); } DUK_EXTERNAL void duk_freeze(duk_hthread *thr, duk_idx_t obj_idx) { DUK_ASSERT_API_ENTRY(thr); duk_seal_freeze_raw(thr, obj_idx, 1 /*is_freeze*/); } /* * Helpers for writing multiple properties */ DUK_EXTERNAL void duk_put_function_list(duk_hthread *thr, duk_idx_t obj_idx, const duk_function_list_entry *funcs) { const duk_function_list_entry *ent = funcs; DUK_ASSERT_API_ENTRY(thr); obj_idx = duk_require_normalize_index(thr, obj_idx); if (ent != NULL) { while (ent->key != NULL) { duk_push_c_function(thr, ent->value, ent->nargs); duk_put_prop_string(thr, obj_idx, ent->key); ent++; } } } DUK_EXTERNAL void duk_put_number_list(duk_hthread *thr, duk_idx_t obj_idx, const duk_number_list_entry *numbers) { const duk_number_list_entry *ent = numbers; duk_tval *tv; DUK_ASSERT_API_ENTRY(thr); obj_idx = duk_require_normalize_index(thr, obj_idx); if (ent != NULL) { while (ent->key != NULL) { tv = thr->valstack_top++; DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv)); /* value stack init policy */ DUK_TVAL_SET_NUMBER_CHKFAST_SLOW(tv, ent->value); /* no need for decref/incref */ duk_put_prop_string(thr, obj_idx, ent->key); ent++; } } } /* * Shortcut for accessing global object properties */ DUK_EXTERNAL duk_bool_t duk_get_global_string(duk_hthread *thr, const char *key) { duk_bool_t ret; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL] != NULL); /* XXX: direct implementation */ duk_push_hobject(thr, thr->builtins[DUK_BIDX_GLOBAL]); ret = duk_get_prop_string(thr, -1, key); duk_remove_m2(thr); return ret; } DUK_EXTERNAL duk_bool_t duk_get_global_lstring(duk_hthread *thr, const char *key, duk_size_t key_len) { duk_bool_t ret; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL] != NULL); /* XXX: direct implementation */ duk_push_hobject(thr, thr->builtins[DUK_BIDX_GLOBAL]); ret = duk_get_prop_lstring(thr, -1, key, key_len); duk_remove_m2(thr); return ret; } DUK_EXTERNAL duk_bool_t duk_put_global_string(duk_hthread *thr, const char *key) { duk_bool_t ret; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL] != NULL); /* XXX: direct implementation */ duk_push_hobject(thr, thr->builtins[DUK_BIDX_GLOBAL]); duk_insert(thr, -2); ret = duk_put_prop_string(thr, -2, key); /* [ ... global val ] -> [ ... global ] */ duk_pop(thr); return ret; } DUK_EXTERNAL duk_bool_t duk_put_global_lstring(duk_hthread *thr, const char *key, duk_size_t key_len) { duk_bool_t ret; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL] != NULL); /* XXX: direct implementation */ duk_push_hobject(thr, thr->builtins[DUK_BIDX_GLOBAL]); duk_insert(thr, -2); ret = duk_put_prop_lstring(thr, -2, key, key_len); /* [ ... global val ] -> [ ... global ] */ duk_pop(thr); return ret; } /* * Object prototype */ DUK_EXTERNAL void duk_get_prototype(duk_hthread *thr, duk_idx_t idx) { duk_hobject *obj; duk_hobject *proto; DUK_ASSERT_API_ENTRY(thr); obj = duk_require_hobject(thr, idx); DUK_ASSERT(obj != NULL); /* XXX: shared helper for duk_push_hobject_or_undefined()? */ proto = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, obj); if (proto) { duk_push_hobject(thr, proto); } else { duk_push_undefined(thr); } } DUK_EXTERNAL void duk_set_prototype(duk_hthread *thr, duk_idx_t idx) { duk_hobject *obj; duk_hobject *proto; DUK_ASSERT_API_ENTRY(thr); obj = duk_require_hobject(thr, idx); DUK_ASSERT(obj != NULL); duk_require_type_mask(thr, -1, DUK_TYPE_MASK_UNDEFINED | DUK_TYPE_MASK_OBJECT); proto = duk_get_hobject(thr, -1); /* proto can also be NULL here (allowed explicitly) */ #if defined(DUK_USE_ROM_OBJECTS) if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)) { DUK_ERROR_TYPE(thr, DUK_STR_NOT_CONFIGURABLE); /* XXX: "read only object"? */ return; } #endif DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, obj, proto); duk_pop(thr); } /* * Object finalizer */ #if defined(DUK_USE_FINALIZER_SUPPORT) /* XXX: these could be implemented as macros calling an internal function * directly. * XXX: same issue as with Duktape.fin: there's no way to delete the property * now (just set it to undefined). */ DUK_EXTERNAL void duk_get_finalizer(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); duk_get_prop_stridx(thr, idx, DUK_STRIDX_INT_FINALIZER); } DUK_EXTERNAL void duk_set_finalizer(duk_hthread *thr, duk_idx_t idx) { duk_hobject *h; duk_bool_t callable; DUK_ASSERT_API_ENTRY(thr); h = duk_require_hobject(thr, idx); /* Get before 'put' so that 'idx' is correct. */ callable = duk_is_callable(thr, -1); duk_put_prop_stridx(thr, idx, DUK_STRIDX_INT_FINALIZER); /* In addition to setting the finalizer property, keep a "have * finalizer" flag in duk_hobject in sync so that refzero can do * a very quick finalizer check by walking the prototype chain * and checking the flag alone. (Note that this means that just * setting _Finalizer on an object won't affect finalizer checks.) * * NOTE: if the argument is a Proxy object, this flag will be set * on the Proxy, not the target. As a result, the target won't get * a finalizer flag and the Proxy also won't be finalized as there's * an explicit Proxy check in finalization now. */ if (callable) { DUK_HOBJECT_SET_HAVE_FINALIZER(h); } else { DUK_HOBJECT_CLEAR_HAVE_FINALIZER(h); } } #else /* DUK_USE_FINALIZER_SUPPORT */ DUK_EXTERNAL void duk_get_finalizer(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); DUK_UNREF(idx); DUK_ERROR_UNSUPPORTED(thr); } DUK_EXTERNAL void duk_set_finalizer(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); DUK_UNREF(idx); DUK_ERROR_UNSUPPORTED(thr); } #endif /* DUK_USE_FINALIZER_SUPPORT */ #line 1 "duk_api_stack.c" /* * API calls related to general value stack manipulation: resizing the value * stack, pushing and popping values, type checking and reading values, * coercing values, etc. * * Also contains internal functions (such as duk_get_tval()), defined * in duk_api_internal.h, with semantics similar to the public API. */ /* XXX: repetition of stack pre-checks -> helper or macro or inline */ /* XXX: shared api error strings, and perhaps even throw code for rare cases? */ /* #include duk_internal.h -> already included */ /* * Forward declarations */ DUK_LOCAL_DECL duk_idx_t duk__push_c_function_raw(duk_hthread *thr, duk_c_function func, duk_idx_t nargs, duk_uint_t flags, duk_small_uint_t proto_bidx); /* * Global state for working around missing variadic macros */ #if !defined(DUK_USE_VARIADIC_MACROS) DUK_EXTERNAL const char *duk_api_global_filename = NULL; DUK_EXTERNAL duk_int_t duk_api_global_line = 0; #endif /* * Misc helpers */ DUK_LOCAL const char * const duk__symbol_type_strings[4] = { "hidden", "global", "local", "wellknown" }; #if !defined(DUK_USE_PACKED_TVAL) DUK_LOCAL const duk_uint_t duk__type_from_tag[] = { DUK_TYPE_NUMBER, DUK_TYPE_NUMBER, /* fastint */ DUK_TYPE_UNDEFINED, DUK_TYPE_NULL, DUK_TYPE_BOOLEAN, DUK_TYPE_POINTER, DUK_TYPE_LIGHTFUNC, DUK_TYPE_NONE, DUK_TYPE_STRING, DUK_TYPE_OBJECT, DUK_TYPE_BUFFER, }; DUK_LOCAL const duk_uint_t duk__type_mask_from_tag[] = { DUK_TYPE_MASK_NUMBER, DUK_TYPE_MASK_NUMBER, /* fastint */ DUK_TYPE_MASK_UNDEFINED, DUK_TYPE_MASK_NULL, DUK_TYPE_MASK_BOOLEAN, DUK_TYPE_MASK_POINTER, DUK_TYPE_MASK_LIGHTFUNC, DUK_TYPE_MASK_NONE, DUK_TYPE_MASK_STRING, DUK_TYPE_MASK_OBJECT, DUK_TYPE_MASK_BUFFER, }; #endif /* !DUK_USE_PACKED_TVAL */ /* Assert that there's room for one value. */ #define DUK__ASSERT_SPACE() do { \ DUK_ASSERT(!(thr->valstack_top >= thr->valstack_end)); \ } while (0) /* Check that there's room to push one value. */ #if defined(DUK_USE_VALSTACK_UNSAFE) /* Faster but value stack overruns are memory unsafe. */ #define DUK__CHECK_SPACE() DUK__ASSERT_SPACE() #else #define DUK__CHECK_SPACE() do { \ if (DUK_UNLIKELY(thr->valstack_top >= thr->valstack_end)) { \ DUK_ERROR_RANGE_PUSH_BEYOND(thr); \ } \ } while (0) #endif DUK_LOCAL duk_small_uint_t duk__get_symbol_type(duk_hstring *h) { const duk_uint8_t *data; duk_size_t len; DUK_ASSERT(h != NULL); DUK_ASSERT(DUK_HSTRING_HAS_SYMBOL(h)); DUK_ASSERT(DUK_HSTRING_GET_BYTELEN(h) >= 1); /* always true, symbol prefix */ data = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h); len = DUK_HSTRING_GET_BYTELEN(h); DUK_ASSERT(len >= 1); /* XXX: differentiate between 0x82 and 0xff (hidden vs. internal?)? */ if (data[0] == 0xffU) { return DUK_SYMBOL_TYPE_HIDDEN; } else if (data[0] == 0x82U) { return DUK_SYMBOL_TYPE_HIDDEN; } else if (data[0] == 0x80U) { return DUK_SYMBOL_TYPE_GLOBAL; } else if (data[len - 1] != 0xffU) { return DUK_SYMBOL_TYPE_LOCAL; } else { return DUK_SYMBOL_TYPE_WELLKNOWN; } } DUK_LOCAL const char *duk__get_symbol_type_string(duk_hstring *h) { duk_small_uint_t idx; idx = duk__get_symbol_type(h); DUK_ASSERT(idx < sizeof(duk__symbol_type_strings)); return duk__symbol_type_strings[idx]; } DUK_LOCAL_DECL duk_heaphdr *duk__get_tagged_heaphdr_raw(duk_hthread *thr, duk_idx_t idx, duk_uint_t tag); DUK_LOCAL duk_int_t duk__api_coerce_d2i(duk_hthread *thr, duk_idx_t idx, duk_int_t def_value, duk_bool_t require) { duk_tval *tv; duk_small_int_t c; duk_double_t d; tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); /* * Special cases like NaN and +/- Infinity are handled explicitly * because a plain C coercion from double to int handles these cases * in undesirable ways. For instance, NaN may coerce to INT_MIN * (not zero), and INT_MAX + 1 may coerce to INT_MIN (not INT_MAX). * * This double-to-int coercion differs from ToInteger() because it * has a finite range (ToInteger() allows e.g. +/- Infinity). It * also differs from ToInt32() because the INT_MIN/INT_MAX clamping * depends on the size of the int type on the platform. In particular, * on platforms with a 64-bit int type, the full range is allowed. */ #if defined(DUK_USE_FASTINT) if (DUK_TVAL_IS_FASTINT(tv)) { duk_int64_t t = DUK_TVAL_GET_FASTINT(tv); #if (DUK_INT_MAX <= 0x7fffffffL) /* Clamping only necessary for 32-bit ints. */ if (t < DUK_INT_MIN) { t = DUK_INT_MIN; } else if (t > DUK_INT_MAX) { t = DUK_INT_MAX; } #endif return (duk_int_t) t; } #endif if (DUK_TVAL_IS_NUMBER(tv)) { d = DUK_TVAL_GET_NUMBER(tv); c = (duk_small_int_t) DUK_FPCLASSIFY(d); if (c == DUK_FP_NAN) { return 0; } else if (d < (duk_double_t) DUK_INT_MIN) { /* covers -Infinity */ return DUK_INT_MIN; } else if (d > (duk_double_t) DUK_INT_MAX) { /* covers +Infinity */ return DUK_INT_MAX; } else { /* coerce towards zero */ return (duk_int_t) d; } } if (require) { DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "number", DUK_STR_NOT_NUMBER); /* not reachable */ } return def_value; } DUK_LOCAL duk_uint_t duk__api_coerce_d2ui(duk_hthread *thr, duk_idx_t idx, duk_uint_t def_value, duk_bool_t require) { duk_tval *tv; duk_small_int_t c; duk_double_t d; /* Same as above but for unsigned int range. */ tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); #if defined(DUK_USE_FASTINT) if (DUK_TVAL_IS_FASTINT(tv)) { duk_int64_t t = DUK_TVAL_GET_FASTINT(tv); if (t < 0) { t = 0; } #if (DUK_UINT_MAX <= 0xffffffffUL) /* Clamping only necessary for 32-bit ints. */ else if (t > DUK_UINT_MAX) { t = DUK_UINT_MAX; } #endif return (duk_uint_t) t; } #endif if (DUK_TVAL_IS_NUMBER(tv)) { d = DUK_TVAL_GET_NUMBER(tv); c = (duk_small_int_t) DUK_FPCLASSIFY(d); if (c == DUK_FP_NAN) { return 0; } else if (d < 0.0) { /* covers -Infinity */ return (duk_uint_t) 0; } else if (d > (duk_double_t) DUK_UINT_MAX) { /* covers +Infinity */ return (duk_uint_t) DUK_UINT_MAX; } else { /* coerce towards zero */ return (duk_uint_t) d; } } if (require) { DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "number", DUK_STR_NOT_NUMBER); /* not reachable */ } return def_value; } /* * Stack index validation/normalization and getting a stack duk_tval ptr. * * These are called by many API entrypoints so the implementations must be * fast and "inlined". * * There's some repetition because of this; keep the functions in sync. */ DUK_EXTERNAL duk_idx_t duk_normalize_index(duk_hthread *thr, duk_idx_t idx) { duk_uidx_t vs_size; duk_uidx_t uidx; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(DUK_INVALID_INDEX < 0); /* Care must be taken to avoid pointer wrapping in the index * validation. For instance, on a 32-bit platform with 8-byte * duk_tval the index 0x20000000UL would wrap the memory space * once. */ /* Assume value stack sizes (in elements) fits into duk_idx_t. */ DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); vs_size = (duk_uidx_t) (thr->valstack_top - thr->valstack_bottom); DUK_ASSERT_DISABLE(vs_size >= 0); /* unsigned */ if (idx < 0) { uidx = vs_size + (duk_uidx_t) idx; } else { /* since index non-negative */ DUK_ASSERT(idx != DUK_INVALID_INDEX); uidx = (duk_uidx_t) idx; } /* DUK_INVALID_INDEX won't be accepted as a valid index. */ DUK_ASSERT(vs_size + (duk_uidx_t) DUK_INVALID_INDEX >= vs_size); if (DUK_LIKELY(uidx < vs_size)) { return (duk_idx_t) uidx; } return DUK_INVALID_INDEX; } DUK_EXTERNAL duk_idx_t duk_require_normalize_index(duk_hthread *thr, duk_idx_t idx) { duk_uidx_t vs_size; duk_uidx_t uidx; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(DUK_INVALID_INDEX < 0); DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); vs_size = (duk_uidx_t) (thr->valstack_top - thr->valstack_bottom); DUK_ASSERT_DISABLE(vs_size >= 0); /* unsigned */ if (idx < 0) { uidx = vs_size + (duk_uidx_t) idx; } else { DUK_ASSERT(idx != DUK_INVALID_INDEX); uidx = (duk_uidx_t) idx; } /* DUK_INVALID_INDEX won't be accepted as a valid index. */ DUK_ASSERT(vs_size + (duk_uidx_t) DUK_INVALID_INDEX >= vs_size); if (DUK_LIKELY(uidx < vs_size)) { return (duk_idx_t) uidx; } DUK_ERROR_RANGE_INDEX(thr, idx); return 0; /* unreachable */ } DUK_INTERNAL duk_tval *duk_get_tval(duk_hthread *thr, duk_idx_t idx) { duk_uidx_t vs_size; duk_uidx_t uidx; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(DUK_INVALID_INDEX < 0); DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); vs_size = (duk_uidx_t) (thr->valstack_top - thr->valstack_bottom); DUK_ASSERT_DISABLE(vs_size >= 0); /* unsigned */ if (idx < 0) { uidx = vs_size + (duk_uidx_t) idx; } else { DUK_ASSERT(idx != DUK_INVALID_INDEX); uidx = (duk_uidx_t) idx; } /* DUK_INVALID_INDEX won't be accepted as a valid index. */ DUK_ASSERT(vs_size + (duk_uidx_t) DUK_INVALID_INDEX >= vs_size); if (DUK_LIKELY(uidx < vs_size)) { return thr->valstack_bottom + uidx; } return NULL; } /* Variant of duk_get_tval() which is guaranteed to return a valid duk_tval * pointer. When duk_get_tval() would return NULL, this variant returns a * pointer to a duk_tval with tag DUK_TAG_UNUSED. This allows the call site * to avoid an unnecessary NULL check which sometimes leads to better code. * The return duk_tval is read only (at least for the UNUSED value). */ DUK_LOCAL const duk_tval_unused duk__const_tval_unused = DUK_TVAL_UNUSED_INITIALIZER(); DUK_INTERNAL duk_tval *duk_get_tval_or_unused(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; DUK_ASSERT_API_ENTRY(thr); tv = duk_get_tval(thr, idx); if (tv != NULL) { return tv; } return (duk_tval *) DUK_LOSE_CONST(&duk__const_tval_unused); } DUK_INTERNAL duk_tval *duk_require_tval(duk_hthread *thr, duk_idx_t idx) { duk_uidx_t vs_size; duk_uidx_t uidx; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(DUK_INVALID_INDEX < 0); DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); vs_size = (duk_uidx_t) (thr->valstack_top - thr->valstack_bottom); DUK_ASSERT_DISABLE(vs_size >= 0); /* unsigned */ /* Use unsigned arithmetic to optimize comparison. */ if (idx < 0) { uidx = vs_size + (duk_uidx_t) idx; } else { DUK_ASSERT(idx != DUK_INVALID_INDEX); uidx = (duk_uidx_t) idx; } /* DUK_INVALID_INDEX won't be accepted as a valid index. */ DUK_ASSERT(vs_size + (duk_uidx_t) DUK_INVALID_INDEX >= vs_size); if (DUK_LIKELY(uidx < vs_size)) { return thr->valstack_bottom + uidx; } DUK_ERROR_RANGE_INDEX(thr, idx); return NULL; } /* Non-critical. */ DUK_EXTERNAL duk_bool_t duk_is_valid_index(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(DUK_INVALID_INDEX < 0); return (duk_normalize_index(thr, idx) >= 0); } /* Non-critical. */ DUK_EXTERNAL void duk_require_valid_index(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(DUK_INVALID_INDEX < 0); if (DUK_UNLIKELY(duk_normalize_index(thr, idx) < 0)) { DUK_ERROR_RANGE_INDEX(thr, idx); return; /* unreachable */ } } /* * Value stack top handling */ DUK_EXTERNAL duk_idx_t duk_get_top(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); return (duk_idx_t) (thr->valstack_top - thr->valstack_bottom); } /* Internal helper to get current top but to require a minimum top value * (TypeError if not met). */ DUK_INTERNAL duk_idx_t duk_get_top_require_min(duk_hthread *thr, duk_idx_t min_top) { duk_idx_t ret; DUK_ASSERT_API_ENTRY(thr); ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom); if (DUK_UNLIKELY(ret < min_top)) { DUK_ERROR_TYPE_INVALID_ARGS(thr); } return ret; } /* Set stack top within currently allocated range, but don't reallocate. * This is performance critical especially for call handling, so whenever * changing, profile and look at generated code. */ DUK_EXTERNAL void duk_set_top(duk_hthread *thr, duk_idx_t idx) { duk_uidx_t vs_size; duk_uidx_t vs_limit; duk_uidx_t uidx; duk_tval *tv; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(DUK_INVALID_INDEX < 0); DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); DUK_ASSERT(thr->valstack_end >= thr->valstack_bottom); vs_size = (duk_uidx_t) (thr->valstack_top - thr->valstack_bottom); vs_limit = (duk_uidx_t) (thr->valstack_end - thr->valstack_bottom); if (idx < 0) { /* Negative indices are always within allocated stack but * must not go below zero index. */ uidx = vs_size + (duk_uidx_t) idx; } else { /* Positive index can be higher than valstack top but must * not go above allocated stack (equality is OK). */ uidx = (duk_uidx_t) idx; } /* DUK_INVALID_INDEX won't be accepted as a valid index. */ DUK_ASSERT(vs_size + (duk_uidx_t) DUK_INVALID_INDEX >= vs_size); DUK_ASSERT(vs_size + (duk_uidx_t) DUK_INVALID_INDEX >= vs_limit); #if defined(DUK_USE_VALSTACK_UNSAFE) DUK_ASSERT(uidx <= vs_limit); DUK_UNREF(vs_limit); #else if (DUK_UNLIKELY(uidx > vs_limit)) { DUK_ERROR_RANGE_INDEX(thr, idx); return; /* unreachable */ } #endif DUK_ASSERT(uidx <= vs_limit); /* Handle change in value stack top. Respect value stack * initialization policy: 'undefined' above top. Note that * DECREF may cause a side effect that reallocates valstack, * so must relookup after DECREF. */ if (uidx >= vs_size) { /* Stack size increases or stays the same. */ #if defined(DUK_USE_ASSERTIONS) duk_uidx_t count; count = uidx - vs_size; while (count != 0) { count--; tv = thr->valstack_top + count; DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv)); } #endif thr->valstack_top = thr->valstack_bottom + uidx; } else { /* Stack size decreases. */ #if defined(DUK_USE_REFERENCE_COUNTING) duk_uidx_t count; duk_tval *tv_end; count = vs_size - uidx; DUK_ASSERT(count > 0); tv = thr->valstack_top; tv_end = tv - count; DUK_ASSERT(tv > tv_end); /* Because count > 0. */ do { tv--; DUK_ASSERT(tv >= thr->valstack_bottom); DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ(thr, tv); } while (tv != tv_end); thr->valstack_top = tv_end; DUK_REFZERO_CHECK_FAST(thr); #else /* DUK_USE_REFERENCE_COUNTING */ duk_uidx_t count; duk_tval *tv_end; count = vs_size - uidx; tv = thr->valstack_top; tv_end = tv - count; DUK_ASSERT(tv > tv_end); do { tv--; DUK_TVAL_SET_UNDEFINED(tv); } while (tv != tv_end); thr->valstack_top = tv_end; #endif /* DUK_USE_REFERENCE_COUNTING */ } } /* Internal variant with a non-negative index and no runtime size checks. */ #if defined(DUK_USE_PREFER_SIZE) DUK_INTERNAL void duk_set_top_unsafe(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); duk_set_top(thr, idx); } #else /* DUK_USE_PREFER_SIZE */ DUK_INTERNAL void duk_set_top_unsafe(duk_hthread *thr, duk_idx_t idx) { duk_uidx_t uidx; duk_uidx_t vs_size; duk_tval *tv; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); DUK_ASSERT(thr->valstack_end >= thr->valstack_bottom); DUK_ASSERT(idx >= 0); DUK_ASSERT(idx <= (duk_idx_t) (thr->valstack_end - thr->valstack_bottom)); /* XXX: byte arithmetic */ uidx = (duk_uidx_t) idx; vs_size = (duk_uidx_t) (thr->valstack_top - thr->valstack_bottom); if (uidx >= vs_size) { /* Stack size increases or stays the same. */ #if defined(DUK_USE_ASSERTIONS) duk_uidx_t count; count = uidx - vs_size; while (count != 0) { count--; tv = thr->valstack_top + count; DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv)); } #endif thr->valstack_top = thr->valstack_bottom + uidx; } else { /* Stack size decreases. */ #if defined(DUK_USE_REFERENCE_COUNTING) duk_uidx_t count; duk_tval *tv_end; count = vs_size - uidx; DUK_ASSERT(count > 0); tv = thr->valstack_top; tv_end = tv - count; DUK_ASSERT(tv > tv_end); /* Because count > 0. */ do { tv--; DUK_ASSERT(tv >= thr->valstack_bottom); DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ(thr, tv); } while (tv != tv_end); thr->valstack_top = tv_end; DUK_REFZERO_CHECK_FAST(thr); #else /* DUK_USE_REFERENCE_COUNTING */ duk_uidx_t count; duk_tval *tv_end; count = vs_size - uidx; tv = thr->valstack_top; tv_end = tv - count; DUK_ASSERT(tv > tv_end); do { tv--; DUK_TVAL_SET_UNDEFINED(tv); } while (tv != tv_end); thr->valstack_top = tv_end; #endif /* DUK_USE_REFERENCE_COUNTING */ } } #endif /* DUK_USE_PREFER_SIZE */ /* Internal helper: set top to 'top', and set [idx_wipe_start,top[ to * 'undefined' (doing nothing if idx_wipe_start == top). Indices are * positive and within value stack reserve. This is used by call handling. */ DUK_INTERNAL void duk_set_top_and_wipe(duk_hthread *thr, duk_idx_t top, duk_idx_t idx_wipe_start) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(top >= 0); DUK_ASSERT(idx_wipe_start >= 0); DUK_ASSERT(idx_wipe_start <= top); DUK_ASSERT(thr->valstack_bottom + top <= thr->valstack_end); DUK_ASSERT(thr->valstack_bottom + idx_wipe_start <= thr->valstack_end); duk_set_top_unsafe(thr, idx_wipe_start); duk_set_top_unsafe(thr, top); } DUK_EXTERNAL duk_idx_t duk_get_top_index(duk_hthread *thr) { duk_idx_t ret; DUK_ASSERT_API_ENTRY(thr); ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom) - 1; if (DUK_UNLIKELY(ret < 0)) { /* Return invalid index; if caller uses this without checking * in another API call, the index won't map to a valid stack * entry. */ return DUK_INVALID_INDEX; } return ret; } /* Internal variant: call assumes there is at least one element on the value * stack frame; this is only asserted for. */ DUK_INTERNAL duk_idx_t duk_get_top_index_unsafe(duk_hthread *thr) { duk_idx_t ret; DUK_ASSERT_API_ENTRY(thr); ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom) - 1; return ret; } DUK_EXTERNAL duk_idx_t duk_require_top_index(duk_hthread *thr) { duk_idx_t ret; DUK_ASSERT_API_ENTRY(thr); ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom) - 1; if (DUK_UNLIKELY(ret < 0)) { DUK_ERROR_RANGE_INDEX(thr, -1); return 0; /* unreachable */ } return ret; } /* * Value stack resizing. * * This resizing happens above the current "top": the value stack can be * grown or shrunk, but the "top" is not affected. The value stack cannot * be resized to a size below the current reserve. * * The low level reallocation primitive must carefully recompute all value * stack pointers, and must also work if ALL pointers are NULL. The resize * is quite tricky because the valstack realloc may cause a mark-and-sweep, * which may run finalizers. Running finalizers may resize the valstack * recursively (the same value stack we're working on). So, after realloc * returns, we know that the valstack bottom, top, and reserve should still * be the same (there should not be live values above the "top"), but its * underlying size, alloc_end, and base pointer may have changed. * * 'new_size' is known to be <= DUK_USE_VALSTACK_LIMIT, which ensures that * size_t and pointer arithmetic won't wrap in duk__resize_valstack(). */ /* Low level valstack resize primitive, used for both grow and shrink. All * adjustments for slack etc have already been done. Doesn't throw but does * have allocation side effects. */ DUK_LOCAL DUK_COLD DUK_NOINLINE duk_bool_t duk__resize_valstack(duk_hthread *thr, duk_size_t new_size) { duk_tval *pre_valstack; duk_tval *pre_bottom; duk_tval *pre_top; duk_tval *pre_end; duk_tval *pre_alloc_end; duk_ptrdiff_t ptr_diff; duk_tval *new_valstack; duk_size_t new_alloc_size; duk_tval *tv_prev_alloc_end; duk_tval *p; DUK_ASSERT_HTHREAD_VALID(thr); DUK_ASSERT(thr->valstack_bottom >= thr->valstack); DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); DUK_ASSERT(thr->valstack_end >= thr->valstack_top); DUK_ASSERT(thr->valstack_alloc_end >= thr->valstack_end); DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack) <= new_size); /* can't resize below 'top' */ DUK_ASSERT(new_size <= DUK_USE_VALSTACK_LIMIT); /* valstack limit caller has check, prevents wrapping */ DUK_ASSERT(new_size <= DUK_SIZE_MAX / sizeof(duk_tval)); /* specific assert for wrapping */ /* Pre-realloc pointer copies for asserts and debug logs. */ pre_valstack = thr->valstack; pre_bottom = thr->valstack_bottom; pre_top = thr->valstack_top; pre_end = thr->valstack_end; pre_alloc_end = thr->valstack_alloc_end; DUK_UNREF(pre_valstack); DUK_UNREF(pre_bottom); DUK_UNREF(pre_top); DUK_UNREF(pre_end); DUK_UNREF(pre_alloc_end); /* If finalizer torture enabled, force base pointer change every time * when it would be allowed. */ #if defined(DUK_USE_FINALIZER_TORTURE) if (thr->heap->pf_prevent_count == 0) { duk_hthread_valstack_torture_realloc(thr); } #endif /* Allocate a new valstack using DUK_REALLOC_DIRECT() to deal with * a side effect changing the base pointer. */ new_alloc_size = sizeof(duk_tval) * new_size; new_valstack = (duk_tval *) DUK_REALLOC_INDIRECT(thr->heap, duk_hthread_get_valstack_ptr, (void *) thr, new_alloc_size); if (DUK_UNLIKELY(new_valstack == NULL)) { /* Because new_size != 0, if condition doesn't need to be * (new_valstack != NULL || new_size == 0). */ DUK_ASSERT(new_size != 0); DUK_D(DUK_DPRINT("failed to resize valstack to %lu entries (%lu bytes)", (unsigned long) new_size, (unsigned long) new_alloc_size)); return 0; } /* Debug log any changes in pointer(s) by side effects. These don't * necessarily imply any incorrect behavior, but should be rare in * practice. */ #if defined(DUK_USE_DEBUG) if (thr->valstack != pre_valstack) { DUK_D(DUK_DPRINT("valstack base pointer changed during valstack resize: %p -> %p", (void *) pre_valstack, (void *) thr->valstack)); } if (thr->valstack_bottom != pre_bottom) { DUK_D(DUK_DPRINT("valstack bottom pointer changed during valstack resize: %p -> %p", (void *) pre_bottom, (void *) thr->valstack_bottom)); } if (thr->valstack_top != pre_top) { DUK_D(DUK_DPRINT("valstack top pointer changed during valstack resize: %p -> %p", (void *) pre_top, (void *) thr->valstack_top)); } if (thr->valstack_end != pre_end) { DUK_D(DUK_DPRINT("valstack end pointer changed during valstack resize: %p -> %p", (void *) pre_end, (void *) thr->valstack_end)); } if (thr->valstack_alloc_end != pre_alloc_end) { DUK_D(DUK_DPRINT("valstack alloc_end pointer changed during valstack resize: %p -> %p", (void *) pre_alloc_end, (void *) thr->valstack_alloc_end)); } #endif /* Assertions: offsets for bottom, top, and end (reserve) must not * have changed even with side effects because they are always * restored in unwind. For alloc_end there's no guarantee: it may * have grown or shrunk (but remain above 'end'). */ DUK_ASSERT(thr->valstack_bottom - thr->valstack == pre_bottom - pre_valstack); DUK_ASSERT(thr->valstack_top - thr->valstack == pre_top - pre_valstack); DUK_ASSERT(thr->valstack_end - thr->valstack == pre_end - pre_valstack); DUK_ASSERT(thr->valstack_alloc_end >= thr->valstack_end); /* Write new pointers. Most pointers can be handled as a pointer * difference. */ ptr_diff = (duk_ptrdiff_t) ((duk_uint8_t *) new_valstack - (duk_uint8_t *) thr->valstack); tv_prev_alloc_end = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_alloc_end + ptr_diff); thr->valstack = new_valstack; thr->valstack_bottom = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_bottom + ptr_diff); thr->valstack_top = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_top + ptr_diff); thr->valstack_end = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_end + ptr_diff); thr->valstack_alloc_end = (duk_tval *) (void *) ((duk_uint8_t *) new_valstack + new_alloc_size); /* Assertions: pointer sanity after pointer updates. */ DUK_ASSERT(thr->valstack_bottom >= thr->valstack); DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); DUK_ASSERT(thr->valstack_end >= thr->valstack_top); DUK_ASSERT(thr->valstack_alloc_end >= thr->valstack_end); DUK_D(DUK_DPRINT("resized valstack %lu -> %lu elements (%lu -> %lu bytes): " "base=%p -> %p, bottom=%p -> %p (%ld), top=%p -> %p (%ld), " "end=%p -> %p (%ld), alloc_end=%p -> %p (%ld);" " tv_prev_alloc_end=%p (-> %ld inits; <0 means shrink)", (unsigned long) (pre_alloc_end - pre_valstack), (unsigned long) new_size, (unsigned long) ((duk_uint8_t *) pre_alloc_end - (duk_uint8_t *) pre_valstack), (unsigned long) new_alloc_size, (void *) pre_valstack, (void *) thr->valstack, (void *) pre_bottom, (void *) thr->valstack_bottom, (long) (thr->valstack_bottom - thr->valstack), (void *) pre_top, (void *) thr->valstack_top, (long) (thr->valstack_top - thr->valstack), (void *) pre_end, (void *) thr->valstack_end, (long) (thr->valstack_end - thr->valstack), (void *) pre_alloc_end, (void *) thr->valstack_alloc_end, (long) (thr->valstack_alloc_end - thr->valstack), (void *) tv_prev_alloc_end, (long) (thr->valstack_alloc_end - tv_prev_alloc_end))); /* If allocation grew, init any new slots to 'undefined'. */ p = tv_prev_alloc_end; while (p < thr->valstack_alloc_end) { /* Never executed if new size is smaller. */ DUK_TVAL_SET_UNDEFINED(p); p++; } /* Assert for value stack initialization policy. */ #if defined(DUK_USE_ASSERTIONS) p = thr->valstack_top; while (p < thr->valstack_alloc_end) { DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(p)); p++; } #endif return 1; } DUK_LOCAL DUK_COLD DUK_NOINLINE duk_bool_t duk__valstack_grow(duk_hthread *thr, duk_size_t min_bytes, duk_bool_t throw_on_error) { duk_size_t min_size; duk_size_t new_size; DUK_ASSERT(min_bytes / sizeof(duk_tval) * sizeof(duk_tval) == min_bytes); min_size = min_bytes / sizeof(duk_tval); /* from bytes to slots */ #if defined(DUK_USE_VALSTACK_GROW_SHIFT) /* New size is minimum size plus a proportional slack, e.g. shift of * 2 means a 25% slack. */ new_size = min_size + (min_size >> DUK_USE_VALSTACK_GROW_SHIFT); #else /* New size is tight with no slack. This is sometimes preferred in * low memory environments. */ new_size = min_size; #endif if (DUK_UNLIKELY(new_size > DUK_USE_VALSTACK_LIMIT || new_size < min_size /*wrap*/)) { /* Note: may be triggered even if minimal new_size would not reach the limit, * plan limit accordingly. */ if (throw_on_error) { DUK_ERROR_RANGE(thr, DUK_STR_VALSTACK_LIMIT); } return 0; } if (duk__resize_valstack(thr, new_size) == 0) { if (throw_on_error) { DUK_ERROR_ALLOC_FAILED(thr); } return 0; } thr->valstack_end = thr->valstack + min_size; DUK_ASSERT(thr->valstack_alloc_end >= thr->valstack_end); return 1; } /* Hot, inlined value stack grow check. Because value stack almost never * grows, the actual resize call is in a NOINLINE helper. */ DUK_INTERNAL DUK_INLINE void duk_valstack_grow_check_throw(duk_hthread *thr, duk_size_t min_bytes) { duk_tval *tv; tv = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + min_bytes); if (DUK_LIKELY(thr->valstack_end >= tv)) { return; } if (DUK_LIKELY(thr->valstack_alloc_end >= tv)) { /* Values in [valstack_top,valstack_alloc_end[ are initialized * to 'undefined' so we can just move the end pointer. */ thr->valstack_end = tv; return; } (void) duk__valstack_grow(thr, min_bytes, 1 /*throw_on_error*/); } /* Hot, inlined value stack grow check which doesn't throw. */ DUK_INTERNAL DUK_INLINE duk_bool_t duk_valstack_grow_check_nothrow(duk_hthread *thr, duk_size_t min_bytes) { duk_tval *tv; tv = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + min_bytes); if (DUK_LIKELY(thr->valstack_end >= tv)) { return 1; } if (DUK_LIKELY(thr->valstack_alloc_end >= tv)) { thr->valstack_end = tv; return 1; } return duk__valstack_grow(thr, min_bytes, 0 /*throw_on_error*/); } /* Value stack shrink check, called from mark-and-sweep. */ DUK_INTERNAL void duk_valstack_shrink_check_nothrow(duk_hthread *thr, duk_bool_t snug) { duk_size_t alloc_bytes; duk_size_t reserve_bytes; duk_size_t shrink_bytes; alloc_bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_alloc_end - (duk_uint8_t *) thr->valstack); reserve_bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack); DUK_ASSERT(alloc_bytes >= reserve_bytes); /* We're free to shrink the value stack allocation down to * reserve_bytes but not more. If 'snug' (emergency GC) * shrink whatever we can. Otherwise only shrink if the new * size would be considerably smaller. */ #if defined(DUK_USE_VALSTACK_SHRINK_CHECK_SHIFT) if (snug) { shrink_bytes = reserve_bytes; } else { duk_size_t proportion, slack; /* Require that value stack shrinks by at least X% of its * current size. For example, shift of 2 means at least * 25%. The proportion is computed as bytes and may not * be a multiple of sizeof(duk_tval); that's OK here. */ proportion = alloc_bytes >> DUK_USE_VALSTACK_SHRINK_CHECK_SHIFT; if (alloc_bytes - reserve_bytes < proportion) { /* Too little would be freed, do nothing. */ return; } /* Keep a slack after shrinking. The slack is again a * proportion of the current size (the proportion should * of course be smaller than the check proportion above). */ #if defined(DUK_USE_VALSTACK_SHRINK_SLACK_SHIFT) DUK_ASSERT(DUK_USE_VALSTACK_SHRINK_SLACK_SHIFT > DUK_USE_VALSTACK_SHRINK_CHECK_SHIFT); slack = alloc_bytes >> DUK_USE_VALSTACK_SHRINK_SLACK_SHIFT; #else slack = 0; #endif shrink_bytes = reserve_bytes + slack / sizeof(duk_tval) * sizeof(duk_tval); /* multiple of duk_tval */ } #else /* DUK_USE_VALSTACK_SHRINK_CHECK_SHIFT */ /* Always snug, useful in some low memory environments. */ DUK_UNREF(snug); shrink_bytes = reserve_bytes; #endif /* DUK_USE_VALSTACK_SHRINK_CHECK_SHIFT */ DUK_D(DUK_DPRINT("valstack shrink check: alloc_bytes=%ld, reserve_bytes=%ld, shrink_bytes=%ld (unvalidated)", (long) alloc_bytes, (long) reserve_bytes, (long) shrink_bytes)); DUK_ASSERT(shrink_bytes >= reserve_bytes); if (shrink_bytes >= alloc_bytes) { /* Skip if shrink target is same as current one (or higher, * though that shouldn't happen in practice). */ return; } DUK_ASSERT(shrink_bytes / sizeof(duk_tval) * sizeof(duk_tval) == shrink_bytes); DUK_D(DUK_DPRINT("valstack shrink check: decided to shrink, snug: %ld", (long) snug)); duk__resize_valstack(thr, shrink_bytes / sizeof(duk_tval)); } DUK_EXTERNAL duk_bool_t duk_check_stack(duk_hthread *thr, duk_idx_t extra) { duk_size_t min_new_bytes; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(thr != NULL); if (DUK_UNLIKELY(extra < 0 || extra > DUK_USE_VALSTACK_LIMIT)) { if (extra < 0) { /* Clamping to zero makes the API more robust to calling code * calculation errors. */ extra = 0; } else { /* Cause grow check to fail without wrapping arithmetic. */ extra = DUK_USE_VALSTACK_LIMIT; } } min_new_bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_top - (duk_uint8_t *) thr->valstack) + sizeof(duk_tval) * ((duk_size_t) extra + DUK_VALSTACK_INTERNAL_EXTRA); return duk_valstack_grow_check_nothrow(thr, min_new_bytes); } DUK_EXTERNAL void duk_require_stack(duk_hthread *thr, duk_idx_t extra) { duk_size_t min_new_bytes; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(thr != NULL); if (DUK_UNLIKELY(extra < 0 || extra > DUK_USE_VALSTACK_LIMIT)) { if (extra < 0) { /* Clamping to zero makes the API more robust to calling code * calculation errors. */ extra = 0; } else { /* Cause grow check to fail without wrapping arithmetic. */ extra = DUK_USE_VALSTACK_LIMIT; } } min_new_bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_top - (duk_uint8_t *) thr->valstack) + sizeof(duk_tval) * ((duk_size_t) extra + DUK_VALSTACK_INTERNAL_EXTRA); duk_valstack_grow_check_throw(thr, min_new_bytes); } DUK_EXTERNAL duk_bool_t duk_check_stack_top(duk_hthread *thr, duk_idx_t top) { duk_size_t min_new_bytes; DUK_ASSERT_API_ENTRY(thr); if (DUK_UNLIKELY(top < 0 || top > DUK_USE_VALSTACK_LIMIT)) { if (top < 0) { /* Clamping to zero makes the API more robust to calling code * calculation errors. */ top = 0; } else { /* Cause grow check to fail without wrapping arithmetic. */ top = DUK_USE_VALSTACK_LIMIT; } } DUK_ASSERT(top >= 0); min_new_bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_bottom - (duk_uint8_t *) thr->valstack) + sizeof(duk_tval) * ((duk_size_t) top + DUK_VALSTACK_INTERNAL_EXTRA); return duk_valstack_grow_check_nothrow(thr, min_new_bytes); } DUK_EXTERNAL void duk_require_stack_top(duk_hthread *thr, duk_idx_t top) { duk_size_t min_new_bytes; DUK_ASSERT_API_ENTRY(thr); if (DUK_UNLIKELY(top < 0 || top > DUK_USE_VALSTACK_LIMIT)) { if (top < 0) { /* Clamping to zero makes the API more robust to calling code * calculation errors. */ top = 0; } else { /* Cause grow check to fail without wrapping arithmetic. */ top = DUK_USE_VALSTACK_LIMIT; } } DUK_ASSERT(top >= 0); min_new_bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_bottom - (duk_uint8_t *) thr->valstack) + sizeof(duk_tval) * ((duk_size_t) top + DUK_VALSTACK_INTERNAL_EXTRA); duk_valstack_grow_check_throw(thr, min_new_bytes); } /* * Basic stack manipulation: swap, dup, insert, replace, etc */ DUK_EXTERNAL void duk_swap(duk_hthread *thr, duk_idx_t idx1, duk_idx_t idx2) { duk_tval *tv1; duk_tval *tv2; duk_tval tv_tmp; DUK_ASSERT_API_ENTRY(thr); tv1 = duk_require_tval(thr, idx1); DUK_ASSERT(tv1 != NULL); tv2 = duk_require_tval(thr, idx2); DUK_ASSERT(tv2 != NULL); /* If tv1==tv2 this is a NOP, no check is needed */ DUK_TVAL_SET_TVAL(&tv_tmp, tv1); DUK_TVAL_SET_TVAL(tv1, tv2); DUK_TVAL_SET_TVAL(tv2, &tv_tmp); } DUK_EXTERNAL void duk_swap_top(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); duk_swap(thr, idx, -1); } DUK_EXTERNAL void duk_dup(duk_hthread *thr, duk_idx_t from_idx) { duk_tval *tv_from; duk_tval *tv_to; DUK_ASSERT_API_ENTRY(thr); DUK__CHECK_SPACE(); tv_from = duk_require_tval(thr, from_idx); tv_to = thr->valstack_top++; DUK_ASSERT(tv_from != NULL); DUK_ASSERT(tv_to != NULL); DUK_TVAL_SET_TVAL(tv_to, tv_from); DUK_TVAL_INCREF(thr, tv_to); /* no side effects */ } DUK_EXTERNAL void duk_dup_top(duk_hthread *thr) { #if defined(DUK_USE_PREFER_SIZE) duk_dup(thr, -1); #else duk_tval *tv_from; duk_tval *tv_to; DUK_ASSERT_API_ENTRY(thr); DUK__CHECK_SPACE(); if (DUK_UNLIKELY(thr->valstack_top - thr->valstack_bottom <= 0)) { DUK_ERROR_RANGE_INDEX(thr, -1); return; /* unreachable */ } tv_from = thr->valstack_top - 1; tv_to = thr->valstack_top++; DUK_ASSERT(tv_from != NULL); DUK_ASSERT(tv_to != NULL); DUK_TVAL_SET_TVAL(tv_to, tv_from); DUK_TVAL_INCREF(thr, tv_to); /* no side effects */ #endif } DUK_INTERNAL void duk_dup_0(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); duk_dup(thr, 0); } DUK_INTERNAL void duk_dup_1(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); duk_dup(thr, 1); } DUK_INTERNAL void duk_dup_2(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); duk_dup(thr, 2); } DUK_INTERNAL void duk_dup_m2(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); duk_dup(thr, -2); } DUK_INTERNAL void duk_dup_m3(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); duk_dup(thr, -3); } DUK_INTERNAL void duk_dup_m4(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); duk_dup(thr, -4); } DUK_EXTERNAL void duk_insert(duk_hthread *thr, duk_idx_t to_idx) { duk_tval *p; duk_tval *q; duk_tval tv_tmp; duk_size_t nbytes; DUK_ASSERT_API_ENTRY(thr); p = duk_require_tval(thr, to_idx); DUK_ASSERT(p != NULL); q = duk_require_tval(thr, -1); DUK_ASSERT(q != NULL); DUK_ASSERT(q >= p); /* nbytes * <---------> * [ ... | p | x | x | q ] * => [ ... | q | p | x | x ] */ nbytes = (duk_size_t) (((duk_uint8_t *) q) - ((duk_uint8_t *) p)); /* Note: 'q' is top-1 */ DUK_DDD(DUK_DDDPRINT("duk_insert: to_idx=%ld, p=%p, q=%p, nbytes=%lu", (long) to_idx, (void *) p, (void *) q, (unsigned long) nbytes)); /* No net refcount changes. */ if (nbytes > 0) { DUK_TVAL_SET_TVAL(&tv_tmp, q); DUK_ASSERT(nbytes > 0); DUK_MEMMOVE((void *) (p + 1), (const void *) p, (size_t) nbytes); DUK_TVAL_SET_TVAL(p, &tv_tmp); } else { /* nop: insert top to top */ DUK_ASSERT(nbytes == 0); DUK_ASSERT(p == q); } } DUK_INTERNAL void duk_insert_undefined(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(idx >= 0); /* Doesn't support negative indices. */ duk_push_undefined(thr); duk_insert(thr, idx); } DUK_INTERNAL void duk_insert_undefined_n(duk_hthread *thr, duk_idx_t idx, duk_idx_t count) { duk_tval *tv, *tv_end; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(idx >= 0); /* Doesn't support negative indices or count. */ DUK_ASSERT(count >= 0); tv = duk_reserve_gap(thr, idx, count); tv_end = tv + count; while (tv != tv_end) { DUK_TVAL_SET_UNDEFINED(tv); tv++; } } DUK_EXTERNAL void duk_replace(duk_hthread *thr, duk_idx_t to_idx) { duk_tval *tv1; duk_tval *tv2; duk_tval tv_tmp; DUK_ASSERT_API_ENTRY(thr); tv1 = duk_require_tval(thr, -1); DUK_ASSERT(tv1 != NULL); tv2 = duk_require_tval(thr, to_idx); DUK_ASSERT(tv2 != NULL); /* For tv1 == tv2, both pointing to stack top, the end result * is same as duk_pop(thr). */ DUK_TVAL_SET_TVAL(&tv_tmp, tv2); DUK_TVAL_SET_TVAL(tv2, tv1); DUK_TVAL_SET_UNDEFINED(tv1); thr->valstack_top--; DUK_TVAL_DECREF(thr, &tv_tmp); /* side effects */ } DUK_EXTERNAL void duk_copy(duk_hthread *thr, duk_idx_t from_idx, duk_idx_t to_idx) { duk_tval *tv1; duk_tval *tv2; DUK_ASSERT_API_ENTRY(thr); tv1 = duk_require_tval(thr, from_idx); DUK_ASSERT(tv1 != NULL); tv2 = duk_require_tval(thr, to_idx); DUK_ASSERT(tv2 != NULL); /* For tv1 == tv2, this is a no-op (no explicit check needed). */ DUK_TVAL_SET_TVAL_UPDREF(thr, tv2, tv1); /* side effects */ } DUK_EXTERNAL void duk_remove(duk_hthread *thr, duk_idx_t idx) { duk_tval *p; duk_tval *q; #if defined(DUK_USE_REFERENCE_COUNTING) duk_tval tv_tmp; #endif duk_size_t nbytes; DUK_ASSERT_API_ENTRY(thr); p = duk_require_tval(thr, idx); DUK_ASSERT(p != NULL); q = duk_require_tval(thr, -1); DUK_ASSERT(q != NULL); DUK_ASSERT(q >= p); /* nbytes zero size case * <---------> * [ ... | p | x | x | q ] [ ... | p==q ] * => [ ... | x | x | q ] [ ... ] */ #if defined(DUK_USE_REFERENCE_COUNTING) /* use a temp: decref only when valstack reachable values are correct */ DUK_TVAL_SET_TVAL(&tv_tmp, p); #endif nbytes = (duk_size_t) (((duk_uint8_t *) q) - ((duk_uint8_t *) p)); /* Note: 'q' is top-1 */ DUK_MEMMOVE((void *) p, (const void *) (p + 1), (size_t) nbytes); /* zero size not an issue: pointers are valid */ DUK_TVAL_SET_UNDEFINED(q); thr->valstack_top--; #if defined(DUK_USE_REFERENCE_COUNTING) DUK_TVAL_DECREF(thr, &tv_tmp); /* side effects */ #endif } DUK_INTERNAL void duk_remove_unsafe(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); duk_remove(thr, idx); /* XXX: no optimization for now */ } DUK_INTERNAL void duk_remove_m2(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); duk_remove(thr, -2); } DUK_INTERNAL void duk_remove_n(duk_hthread *thr, duk_idx_t idx, duk_idx_t count) { #if defined(DUK_USE_PREFER_SIZE) /* XXX: maybe too slow even when preferring size? */ DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(count >= 0); DUK_ASSERT(idx >= 0); while (count-- > 0) { duk_remove(thr, idx); } #else /* DUK_USE_PREFER_SIZE */ duk_tval *tv_src; duk_tval *tv_dst; duk_tval *tv_newtop; duk_tval *tv; duk_size_t bytes; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(count >= 0); DUK_ASSERT(idx >= 0); tv_dst = thr->valstack_bottom + idx; DUK_ASSERT(tv_dst <= thr->valstack_top); tv_src = tv_dst + count; DUK_ASSERT(tv_src <= thr->valstack_top); bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_top - (duk_uint8_t *) tv_src); for (tv = tv_dst; tv < tv_src; tv++) { DUK_TVAL_DECREF_NORZ(thr, tv); } DUK_MEMMOVE((void *) tv_dst, (const void *) tv_src, bytes); tv_newtop = thr->valstack_top - count; for (tv = tv_newtop; tv < thr->valstack_top; tv++) { DUK_TVAL_SET_UNDEFINED(tv); } thr->valstack_top = tv_newtop; /* When not preferring size, only NORZ macros are used; caller * is expected to DUK_REFZERO_CHECK(). */ #endif /* DUK_USE_PREFER_SIZE */ } DUK_INTERNAL void duk_remove_n_unsafe(duk_hthread *thr, duk_idx_t idx, duk_idx_t count) { DUK_ASSERT_API_ENTRY(thr); duk_remove_n(thr, idx, count); /* XXX: no optimization for now */ } /* * Stack slice primitives */ DUK_EXTERNAL void duk_xcopymove_raw(duk_hthread *to_thr, duk_hthread *from_thr, duk_idx_t count, duk_bool_t is_copy) { void *src; duk_size_t nbytes; duk_tval *p; duk_tval *q; /* XXX: several pointer comparison issues here */ DUK_ASSERT_API_ENTRY(to_thr); DUK_ASSERT_CTX_VALID(to_thr); DUK_ASSERT_CTX_VALID(from_thr); DUK_ASSERT(to_thr->heap == from_thr->heap); if (DUK_UNLIKELY(to_thr == from_thr)) { DUK_ERROR_TYPE(to_thr, DUK_STR_INVALID_CONTEXT); return; } if (DUK_UNLIKELY((duk_uidx_t) count > (duk_uidx_t) DUK_USE_VALSTACK_LIMIT)) { /* Maximum value check ensures 'nbytes' won't wrap below. * Also handles negative count. */ DUK_ERROR_RANGE_INVALID_COUNT(to_thr); return; } DUK_ASSERT(count >= 0); nbytes = sizeof(duk_tval) * (duk_size_t) count; if (DUK_UNLIKELY(nbytes == 0)) { return; } DUK_ASSERT(to_thr->valstack_top <= to_thr->valstack_end); if (DUK_UNLIKELY((duk_size_t) ((duk_uint8_t *) to_thr->valstack_end - (duk_uint8_t *) to_thr->valstack_top) < nbytes)) { DUK_ERROR_RANGE_PUSH_BEYOND(to_thr); } src = (void *) ((duk_uint8_t *) from_thr->valstack_top - nbytes); if (DUK_UNLIKELY(src < (void *) from_thr->valstack_bottom)) { DUK_ERROR_RANGE_INVALID_COUNT(to_thr); } /* copy values (no overlap even if to_thr == from_thr; that's not * allowed now anyway) */ DUK_ASSERT(nbytes > 0); DUK_MEMCPY((void *) to_thr->valstack_top, (const void *) src, (size_t) nbytes); p = to_thr->valstack_top; to_thr->valstack_top = (duk_tval *) (void *) (((duk_uint8_t *) p) + nbytes); if (is_copy) { /* Incref copies, keep originals. */ q = to_thr->valstack_top; while (p < q) { DUK_TVAL_INCREF(to_thr, p); /* no side effects */ p++; } } else { /* No net refcount change. */ p = from_thr->valstack_top; q = (duk_tval *) (void *) (((duk_uint8_t *) p) - nbytes); from_thr->valstack_top = q; while (p > q) { p--; DUK_TVAL_SET_UNDEFINED(p); /* XXX: fast primitive to set a bunch of values to UNDEFINED */ } } } /* Internal helper: reserve a gap of 'count' elements at 'idx_base' and return a * pointer to the gap. Values in the gap are garbage and MUST be initialized by * the caller before any side effects may occur. The caller must ensure there's * enough stack reserve for 'count' values. */ DUK_INTERNAL duk_tval *duk_reserve_gap(duk_hthread *thr, duk_idx_t idx_base, duk_idx_t count) { duk_tval *tv_src; duk_tval *tv_dst; duk_size_t gap_bytes; duk_size_t copy_bytes; /* Caller is responsible for ensuring there's enough preallocated * value stack. */ DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(count >= 0); DUK_ASSERT((duk_size_t) (thr->valstack_end - thr->valstack_top) >= (duk_size_t) count); tv_src = thr->valstack_bottom + idx_base; gap_bytes = (duk_size_t) count * sizeof(duk_tval); tv_dst = (duk_tval *) (void *) ((duk_uint8_t *) tv_src + gap_bytes); copy_bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_top - (duk_uint8_t *) tv_src); thr->valstack_top = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_top + gap_bytes); DUK_MEMMOVE((void *) tv_dst, (const void *) tv_src, copy_bytes); /* Values in the gap are left as garbage: caller must fill them in * and INCREF them before any side effects. */ return tv_src; } /* * Get/opt/require */ DUK_EXTERNAL void duk_require_undefined(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; DUK_ASSERT_API_ENTRY(thr); tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); if (DUK_UNLIKELY(!DUK_TVAL_IS_UNDEFINED(tv))) { DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "undefined", DUK_STR_NOT_UNDEFINED); } } DUK_EXTERNAL void duk_require_null(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; DUK_ASSERT_API_ENTRY(thr); tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); if (DUK_UNLIKELY(!DUK_TVAL_IS_NULL(tv))) { DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "null", DUK_STR_NOT_NULL); } } DUK_LOCAL DUK_ALWAYS_INLINE duk_bool_t duk__get_boolean_raw(duk_hthread *thr, duk_idx_t idx, duk_bool_t def_value) { duk_bool_t ret; duk_tval *tv; DUK_ASSERT_CTX_VALID(thr); tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); if (DUK_TVAL_IS_BOOLEAN(tv)) { ret = DUK_TVAL_GET_BOOLEAN(tv); DUK_ASSERT(ret == 0 || ret == 1); } else { ret = def_value; /* Not guaranteed to be 0 or 1. */ } return ret; } DUK_EXTERNAL duk_bool_t duk_get_boolean(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); return duk__get_boolean_raw(thr, idx, 0); /* default: false */ } DUK_EXTERNAL duk_bool_t duk_get_boolean_default(duk_hthread *thr, duk_idx_t idx, duk_bool_t def_value) { DUK_ASSERT_API_ENTRY(thr); return duk__get_boolean_raw(thr, idx, def_value); } DUK_EXTERNAL duk_bool_t duk_require_boolean(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; duk_bool_t ret; DUK_ASSERT_API_ENTRY(thr); tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); if (DUK_LIKELY(DUK_TVAL_IS_BOOLEAN(tv))) { ret = DUK_TVAL_GET_BOOLEAN(tv); DUK_ASSERT(ret == 0 || ret == 1); return ret; } else { DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "boolean", DUK_STR_NOT_BOOLEAN); } } DUK_EXTERNAL duk_bool_t duk_opt_boolean(duk_hthread *thr, duk_idx_t idx, duk_bool_t def_value) { DUK_ASSERT_API_ENTRY(thr); if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) { return def_value; } return duk_require_boolean(thr, idx); } DUK_LOCAL DUK_ALWAYS_INLINE duk_double_t duk__get_number_raw(duk_hthread *thr, duk_idx_t idx, duk_double_t def_value) { duk_double_union ret; duk_tval *tv; DUK_ASSERT_CTX_VALID(thr); tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); #if defined(DUK_USE_FASTINT) if (DUK_TVAL_IS_FASTINT(tv)) { ret.d = (duk_double_t) DUK_TVAL_GET_FASTINT(tv); /* XXX: cast trick */ } else #endif if (DUK_TVAL_IS_DOUBLE(tv)) { /* When using packed duk_tval, number must be in NaN-normalized form * for it to be a duk_tval, so no need to normalize. NOP for unpacked * duk_tval. */ ret.d = DUK_TVAL_GET_DOUBLE(tv); DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&ret)); } else { ret.d = def_value; /* Default value (including NaN) may not be normalized. */ } return ret.d; } DUK_EXTERNAL duk_double_t duk_get_number(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); return duk__get_number_raw(thr, idx, DUK_DOUBLE_NAN); /* default: NaN */ } DUK_EXTERNAL duk_double_t duk_get_number_default(duk_hthread *thr, duk_idx_t idx, duk_double_t def_value) { DUK_ASSERT_API_ENTRY(thr); return duk__get_number_raw(thr, idx, def_value); } DUK_EXTERNAL duk_double_t duk_require_number(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; duk_double_union ret; DUK_ASSERT_API_ENTRY(thr); tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); if (DUK_UNLIKELY(!DUK_TVAL_IS_NUMBER(tv))) { DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "number", DUK_STR_NOT_NUMBER); } ret.d = DUK_TVAL_GET_NUMBER(tv); /* When using packed duk_tval, number must be in NaN-normalized form * for it to be a duk_tval, so no need to normalize. NOP for unpacked * duk_tval. */ DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&ret)); return ret.d; } DUK_EXTERNAL duk_double_t duk_opt_number(duk_hthread *thr, duk_idx_t idx, duk_double_t def_value) { DUK_ASSERT_API_ENTRY(thr); if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) { /* User provided default is not NaN normalized. */ return def_value; } return duk_require_number(thr, idx); } DUK_EXTERNAL duk_int_t duk_get_int(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); return (duk_int_t) duk__api_coerce_d2i(thr, idx, 0 /*def_value*/, 0 /*require*/); } DUK_EXTERNAL duk_uint_t duk_get_uint(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); return (duk_uint_t) duk__api_coerce_d2ui(thr, idx, 0 /*def_value*/, 0 /*require*/); } DUK_EXTERNAL duk_int_t duk_get_int_default(duk_hthread *thr, duk_idx_t idx, duk_int_t def_value) { DUK_ASSERT_API_ENTRY(thr); return (duk_int_t) duk__api_coerce_d2i(thr, idx, def_value, 0 /*require*/); } DUK_EXTERNAL duk_uint_t duk_get_uint_default(duk_hthread *thr, duk_idx_t idx, duk_uint_t def_value) { DUK_ASSERT_API_ENTRY(thr); return (duk_uint_t) duk__api_coerce_d2ui(thr, idx, def_value, 0 /*require*/); } DUK_EXTERNAL duk_int_t duk_require_int(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); return (duk_int_t) duk__api_coerce_d2i(thr, idx, 0 /*def_value*/, 1 /*require*/); } DUK_EXTERNAL duk_uint_t duk_require_uint(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); return (duk_uint_t) duk__api_coerce_d2ui(thr, idx, 0 /*def_value*/, 1 /*require*/); } DUK_EXTERNAL duk_int_t duk_opt_int(duk_hthread *thr, duk_idx_t idx, duk_int_t def_value) { DUK_ASSERT_API_ENTRY(thr); if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) { return def_value; } return duk_require_int(thr, idx); } DUK_EXTERNAL duk_uint_t duk_opt_uint(duk_hthread *thr, duk_idx_t idx, duk_uint_t def_value) { DUK_ASSERT_API_ENTRY(thr); if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) { return def_value; } return duk_require_uint(thr, idx); } DUK_EXTERNAL const char *duk_get_lstring(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len) { duk_hstring *h; const char *ret; duk_size_t len; DUK_ASSERT_API_ENTRY(thr); h = duk_get_hstring(thr, idx); if (h != NULL) { len = DUK_HSTRING_GET_BYTELEN(h); ret = (const char *) DUK_HSTRING_GET_DATA(h); } else { len = 0; ret = NULL; } if (out_len != NULL) { *out_len = len; } return ret; } DUK_EXTERNAL const char *duk_require_lstring(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len) { duk_hstring *h; DUK_ASSERT_API_ENTRY(thr); h = duk_require_hstring(thr, idx); DUK_ASSERT(h != NULL); if (out_len) { *out_len = DUK_HSTRING_GET_BYTELEN(h); } return (const char *) DUK_HSTRING_GET_DATA(h); } DUK_INTERNAL const char *duk_require_lstring_notsymbol(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len) { duk_hstring *h; DUK_ASSERT_API_ENTRY(thr); h = duk_require_hstring_notsymbol(thr, idx); DUK_ASSERT(h != NULL); if (out_len) { *out_len = DUK_HSTRING_GET_BYTELEN(h); } return (const char *) DUK_HSTRING_GET_DATA(h); } DUK_EXTERNAL const char *duk_get_string(duk_hthread *thr, duk_idx_t idx) { duk_hstring *h; DUK_ASSERT_API_ENTRY(thr); h = duk_get_hstring(thr, idx); if (h != NULL) { return (const char *) DUK_HSTRING_GET_DATA(h); } else { return NULL; } } DUK_EXTERNAL const char *duk_opt_lstring(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len, const char *def_ptr, duk_size_t def_len) { DUK_ASSERT_API_ENTRY(thr); if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) { if (out_len != NULL) { *out_len = def_len; } return def_ptr; } return duk_require_lstring(thr, idx, out_len); } DUK_EXTERNAL const char *duk_opt_string(duk_hthread *thr, duk_idx_t idx, const char *def_ptr) { DUK_ASSERT_API_ENTRY(thr); if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) { return def_ptr; } return duk_require_string(thr, idx); } DUK_EXTERNAL const char *duk_get_lstring_default(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len, const char *def_ptr, duk_size_t def_len) { duk_hstring *h; const char *ret; duk_size_t len; DUK_ASSERT_API_ENTRY(thr); h = duk_get_hstring(thr, idx); if (h != NULL) { len = DUK_HSTRING_GET_BYTELEN(h); ret = (const char *) DUK_HSTRING_GET_DATA(h); } else { len = def_len; ret = def_ptr; } if (out_len != NULL) { *out_len = len; } return ret; } DUK_EXTERNAL const char *duk_get_string_default(duk_hthread *thr, duk_idx_t idx, const char *def_value) { duk_hstring *h; DUK_ASSERT_API_ENTRY(thr); h = duk_get_hstring(thr, idx); if (h != NULL) { return (const char *) DUK_HSTRING_GET_DATA(h); } else { return def_value; } } DUK_INTERNAL const char *duk_get_string_notsymbol(duk_hthread *thr, duk_idx_t idx) { duk_hstring *h; DUK_ASSERT_API_ENTRY(thr); h = duk_get_hstring_notsymbol(thr, idx); if (h) { return (const char *) DUK_HSTRING_GET_DATA(h); } else { return NULL; } } DUK_EXTERNAL const char *duk_require_string(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); return duk_require_lstring(thr, idx, NULL); } DUK_INTERNAL const char *duk_require_string_notsymbol(duk_hthread *thr, duk_idx_t idx) { duk_hstring *h; DUK_ASSERT_API_ENTRY(thr); h = duk_require_hstring_notsymbol(thr, idx); DUK_ASSERT(h != NULL); return (const char *) DUK_HSTRING_GET_DATA(h); } DUK_EXTERNAL void duk_require_object(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; DUK_ASSERT_API_ENTRY(thr); tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); if (DUK_UNLIKELY(!DUK_TVAL_IS_OBJECT(tv))) { DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "object", DUK_STR_NOT_OBJECT); } } DUK_LOCAL void *duk__get_pointer_raw(duk_hthread *thr, duk_idx_t idx, void *def_value) { duk_tval *tv; void *p; DUK_ASSERT_CTX_VALID(thr); tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); if (!DUK_TVAL_IS_POINTER(tv)) { return def_value; } p = DUK_TVAL_GET_POINTER(tv); /* may be NULL */ return p; } DUK_EXTERNAL void *duk_get_pointer(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); return duk__get_pointer_raw(thr, idx, NULL /*def_value*/); } DUK_EXTERNAL void *duk_opt_pointer(duk_hthread *thr, duk_idx_t idx, void *def_value) { DUK_ASSERT_API_ENTRY(thr); if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) { return def_value; } return duk_require_pointer(thr, idx); } DUK_EXTERNAL void *duk_get_pointer_default(duk_hthread *thr, duk_idx_t idx, void *def_value) { DUK_ASSERT_API_ENTRY(thr); return duk__get_pointer_raw(thr, idx, def_value); } DUK_EXTERNAL void *duk_require_pointer(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; void *p; DUK_ASSERT_API_ENTRY(thr); /* Note: here we must be wary of the fact that a pointer may be * valid and be a NULL. */ tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); if (DUK_UNLIKELY(!DUK_TVAL_IS_POINTER(tv))) { DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "pointer", DUK_STR_NOT_POINTER); } p = DUK_TVAL_GET_POINTER(tv); /* may be NULL */ return p; } #if 0 /*unused*/ DUK_INTERNAL void *duk_get_voidptr(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; duk_heaphdr *h; DUK_ASSERT_API_ENTRY(thr); tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); if (!DUK_TVAL_IS_HEAP_ALLOCATED(tv)) { return NULL; } h = DUK_TVAL_GET_HEAPHDR(tv); DUK_ASSERT(h != NULL); return (void *) h; } #endif DUK_LOCAL void *duk__get_buffer_helper(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_size, duk_bool_t throw_flag) { duk_hbuffer *h; void *ret; duk_size_t len; duk_tval *tv; DUK_ASSERT_CTX_VALID(thr); if (out_size != NULL) { *out_size = 0; } tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); if (DUK_LIKELY(DUK_TVAL_IS_BUFFER(tv))) { h = DUK_TVAL_GET_BUFFER(tv); DUK_ASSERT(h != NULL); len = DUK_HBUFFER_GET_SIZE(h); ret = DUK_HBUFFER_GET_DATA_PTR(thr->heap, h); } else { if (throw_flag) { DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "buffer", DUK_STR_NOT_BUFFER); } len = def_size; ret = def_ptr; } if (out_size != NULL) { *out_size = len; } return ret; } DUK_EXTERNAL void *duk_get_buffer(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size) { DUK_ASSERT_API_ENTRY(thr); return duk__get_buffer_helper(thr, idx, out_size, NULL /*def_ptr*/, 0 /*def_size*/, 0 /*throw_flag*/); } DUK_EXTERNAL void *duk_opt_buffer(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_size) { DUK_ASSERT_API_ENTRY(thr); if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) { if (out_size != NULL) { *out_size = def_size; } return def_ptr; } return duk_require_buffer(thr, idx, out_size); } DUK_EXTERNAL void *duk_get_buffer_default(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_len) { DUK_ASSERT_API_ENTRY(thr); return duk__get_buffer_helper(thr, idx, out_size, def_ptr, def_len, 0 /*throw_flag*/); } DUK_EXTERNAL void *duk_require_buffer(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size) { DUK_ASSERT_API_ENTRY(thr); return duk__get_buffer_helper(thr, idx, out_size, NULL /*def_ptr*/, 0 /*def_size*/, 1 /*throw_flag*/); } /* Get the active buffer data area for a plain buffer or a buffer object. * Return NULL if the the value is not a buffer. Note that a buffer may * have a NULL data pointer when its size is zero, the optional 'out_isbuffer' * argument allows caller to detect this reliably. */ DUK_INTERNAL void *duk_get_buffer_data_raw(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_size, duk_bool_t throw_flag, duk_bool_t *out_isbuffer) { duk_tval *tv; DUK_ASSERT_API_ENTRY(thr); if (out_isbuffer != NULL) { *out_isbuffer = 0; } if (out_size != NULL) { *out_size = def_size; } tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); if (DUK_TVAL_IS_BUFFER(tv)) { duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv); DUK_ASSERT(h != NULL); if (out_size != NULL) { *out_size = DUK_HBUFFER_GET_SIZE(h); } if (out_isbuffer != NULL) { *out_isbuffer = 1; } return (void *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h); /* may be NULL (but only if size is 0) */ } #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) else if (DUK_TVAL_IS_OBJECT(tv)) { duk_hobject *h = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h != NULL); if (DUK_HOBJECT_IS_BUFOBJ(h)) { /* XXX: this is probably a useful shared helper: for a * duk_hbufobj, get a validated buffer pointer/length. */ duk_hbufobj *h_bufobj = (duk_hbufobj *) h; DUK_ASSERT_HBUFOBJ_VALID(h_bufobj); if (h_bufobj->buf != NULL && DUK_HBUFOBJ_VALID_SLICE(h_bufobj)) { duk_uint8_t *p; p = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufobj->buf); if (out_size != NULL) { *out_size = (duk_size_t) h_bufobj->length; } if (out_isbuffer != NULL) { *out_isbuffer = 1; } return (void *) (p + h_bufobj->offset); } /* if slice not fully valid, treat as error */ } } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ if (throw_flag) { DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "buffer", DUK_STR_NOT_BUFFER); } return def_ptr; } DUK_EXTERNAL void *duk_get_buffer_data(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size) { DUK_ASSERT_API_ENTRY(thr); return duk_get_buffer_data_raw(thr, idx, out_size, NULL /*def_ptr*/, 0 /*def_size*/, 0 /*throw_flag*/, NULL); } DUK_EXTERNAL void *duk_get_buffer_data_default(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_size) { DUK_ASSERT_API_ENTRY(thr); return duk_get_buffer_data_raw(thr, idx, out_size, def_ptr, def_size, 0 /*throw_flag*/, NULL); } DUK_EXTERNAL void *duk_opt_buffer_data(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_size) { DUK_ASSERT_API_ENTRY(thr); if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) { if (out_size != NULL) { *out_size = def_size; } return def_ptr; } return duk_require_buffer_data(thr, idx, out_size); } DUK_EXTERNAL void *duk_require_buffer_data(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size) { DUK_ASSERT_API_ENTRY(thr); return duk_get_buffer_data_raw(thr, idx, out_size, NULL /*def_ptr*/, 0 /*def_size*/, 1 /*throw_flag*/, NULL); } /* Raw helper for getting a value from the stack, checking its tag. * The tag cannot be a number because numbers don't have an internal * tag in the packed representation. */ DUK_LOCAL duk_heaphdr *duk__get_tagged_heaphdr_raw(duk_hthread *thr, duk_idx_t idx, duk_uint_t tag) { duk_tval *tv; duk_heaphdr *ret; DUK_ASSERT_CTX_VALID(thr); tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); if (DUK_TVAL_GET_TAG(tv) != tag) { return (duk_heaphdr *) NULL; } ret = DUK_TVAL_GET_HEAPHDR(tv); DUK_ASSERT(ret != NULL); /* tagged null pointers should never occur */ return ret; } DUK_INTERNAL duk_hstring *duk_get_hstring(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); return (duk_hstring *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_STRING); } DUK_INTERNAL duk_hstring *duk_get_hstring_notsymbol(duk_hthread *thr, duk_idx_t idx) { duk_hstring *h; DUK_ASSERT_API_ENTRY(thr); h = (duk_hstring *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_STRING); if (DUK_UNLIKELY(h && DUK_HSTRING_HAS_SYMBOL(h))) { return NULL; } return h; } DUK_INTERNAL duk_hstring *duk_require_hstring(duk_hthread *thr, duk_idx_t idx) { duk_hstring *h; DUK_ASSERT_API_ENTRY(thr); h = (duk_hstring *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_STRING); if (DUK_UNLIKELY(h == NULL)) { DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "string", DUK_STR_NOT_STRING); } return h; } DUK_INTERNAL duk_hstring *duk_require_hstring_notsymbol(duk_hthread *thr, duk_idx_t idx) { duk_hstring *h; DUK_ASSERT_API_ENTRY(thr); h = (duk_hstring *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_STRING); if (DUK_UNLIKELY(h == NULL || DUK_HSTRING_HAS_SYMBOL(h))) { DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "string", DUK_STR_NOT_STRING); } return h; } DUK_INTERNAL duk_hobject *duk_get_hobject(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); return (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT); } DUK_INTERNAL duk_hobject *duk_require_hobject(duk_hthread *thr, duk_idx_t idx) { duk_hobject *h; DUK_ASSERT_API_ENTRY(thr); h = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT); if (DUK_UNLIKELY(h == NULL)) { DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "object", DUK_STR_NOT_OBJECT); } return h; } DUK_INTERNAL duk_hbuffer *duk_get_hbuffer(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); return (duk_hbuffer *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_BUFFER); } DUK_INTERNAL duk_hbuffer *duk_require_hbuffer(duk_hthread *thr, duk_idx_t idx) { duk_hbuffer *h; DUK_ASSERT_API_ENTRY(thr); h = (duk_hbuffer *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_BUFFER); if (DUK_UNLIKELY(h == NULL)) { DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "buffer", DUK_STR_NOT_BUFFER); } return h; } DUK_INTERNAL duk_hthread *duk_get_hthread(duk_hthread *thr, duk_idx_t idx) { duk_hobject *h; DUK_ASSERT_API_ENTRY(thr); h = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT); if (DUK_UNLIKELY(h != NULL && !DUK_HOBJECT_IS_THREAD(h))) { h = NULL; } return (duk_hthread *) h; } DUK_INTERNAL duk_hthread *duk_require_hthread(duk_hthread *thr, duk_idx_t idx) { duk_hobject *h; DUK_ASSERT_API_ENTRY(thr); h = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT); if (DUK_UNLIKELY(!(h != NULL && DUK_HOBJECT_IS_THREAD(h)))) { DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "thread", DUK_STR_NOT_THREAD); } return (duk_hthread *) h; } DUK_INTERNAL duk_hcompfunc *duk_get_hcompfunc(duk_hthread *thr, duk_idx_t idx) { duk_hobject *h; DUK_ASSERT_API_ENTRY(thr); h = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT); if (DUK_UNLIKELY(h != NULL && !DUK_HOBJECT_IS_COMPFUNC(h))) { h = NULL; } return (duk_hcompfunc *) h; } DUK_INTERNAL duk_hcompfunc *duk_require_hcompfunc(duk_hthread *thr, duk_idx_t idx) { duk_hobject *h; DUK_ASSERT_API_ENTRY(thr); h = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT); if (DUK_UNLIKELY(!(h != NULL && DUK_HOBJECT_IS_COMPFUNC(h)))) { DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "compiledfunction", DUK_STR_NOT_COMPFUNC); } return (duk_hcompfunc *) h; } DUK_INTERNAL duk_hnatfunc *duk_get_hnatfunc(duk_hthread *thr, duk_idx_t idx) { duk_hobject *h; DUK_ASSERT_API_ENTRY(thr); h = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT); if (DUK_UNLIKELY(h != NULL && !DUK_HOBJECT_IS_NATFUNC(h))) { h = NULL; } return (duk_hnatfunc *) h; } DUK_INTERNAL duk_hnatfunc *duk_require_hnatfunc(duk_hthread *thr, duk_idx_t idx) { duk_hobject *h; DUK_ASSERT_API_ENTRY(thr); h = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT); if (DUK_UNLIKELY(!(h != NULL && DUK_HOBJECT_IS_NATFUNC(h)))) { DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "nativefunction", DUK_STR_NOT_NATFUNC); } return (duk_hnatfunc *) h; } DUK_EXTERNAL duk_c_function duk_get_c_function(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; duk_hobject *h; duk_hnatfunc *f; DUK_ASSERT_API_ENTRY(thr); tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); if (DUK_UNLIKELY(!DUK_TVAL_IS_OBJECT(tv))) { return NULL; } h = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h != NULL); if (DUK_UNLIKELY(!DUK_HOBJECT_IS_NATFUNC(h))) { return NULL; } DUK_ASSERT(DUK_HOBJECT_HAS_NATFUNC(h)); f = (duk_hnatfunc *) h; return f->func; } DUK_EXTERNAL duk_c_function duk_opt_c_function(duk_hthread *thr, duk_idx_t idx, duk_c_function def_value) { DUK_ASSERT_API_ENTRY(thr); if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) { return def_value; } return duk_require_c_function(thr, idx); } DUK_EXTERNAL duk_c_function duk_get_c_function_default(duk_hthread *thr, duk_idx_t idx, duk_c_function def_value) { duk_c_function ret; DUK_ASSERT_API_ENTRY(thr); ret = duk_get_c_function(thr, idx); if (ret != NULL) { return ret; } return def_value; } DUK_EXTERNAL duk_c_function duk_require_c_function(duk_hthread *thr, duk_idx_t idx) { duk_c_function ret; DUK_ASSERT_API_ENTRY(thr); ret = duk_get_c_function(thr, idx); if (DUK_UNLIKELY(!ret)) { DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "nativefunction", DUK_STR_NOT_NATFUNC); } return ret; } DUK_EXTERNAL void duk_require_function(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); if (DUK_UNLIKELY(!duk_is_function(thr, idx))) { DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "function", DUK_STR_NOT_FUNCTION); } } DUK_INTERNAL void duk_require_constructable(duk_hthread *thr, duk_idx_t idx) { duk_hobject *h; DUK_ASSERT_API_ENTRY(thr); h = duk_require_hobject_accept_mask(thr, idx, DUK_TYPE_MASK_LIGHTFUNC); if (DUK_UNLIKELY(h != NULL && !DUK_HOBJECT_HAS_CONSTRUCTABLE(h))) { DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "constructable", DUK_STR_NOT_CONSTRUCTABLE); } /* Lightfuncs (h == NULL) are constructable. */ } DUK_EXTERNAL duk_hthread *duk_get_context(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); return duk_get_hthread(thr, idx); } DUK_EXTERNAL duk_hthread *duk_require_context(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); return duk_require_hthread(thr, idx); } DUK_EXTERNAL duk_hthread *duk_opt_context(duk_hthread *thr, duk_idx_t idx, duk_hthread *def_value) { DUK_ASSERT_API_ENTRY(thr); if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) { return def_value; } return duk_require_context(thr, idx); } DUK_EXTERNAL duk_hthread *duk_get_context_default(duk_hthread *thr, duk_idx_t idx, duk_hthread *def_value) { duk_hthread *ret; DUK_ASSERT_API_ENTRY(thr); ret = duk_get_context(thr, idx); if (ret != NULL) { return ret; } return def_value; } DUK_EXTERNAL void *duk_get_heapptr(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; void *ret; DUK_ASSERT_API_ENTRY(thr); tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); if (DUK_UNLIKELY(!DUK_TVAL_IS_HEAP_ALLOCATED(tv))) { return (void *) NULL; } ret = (void *) DUK_TVAL_GET_HEAPHDR(tv); DUK_ASSERT(ret != NULL); return ret; } DUK_EXTERNAL void *duk_opt_heapptr(duk_hthread *thr, duk_idx_t idx, void *def_value) { DUK_ASSERT_API_ENTRY(thr); if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) { return def_value; } return duk_require_heapptr(thr, idx); } DUK_EXTERNAL void *duk_get_heapptr_default(duk_hthread *thr, duk_idx_t idx, void *def_value) { void *ret; DUK_ASSERT_API_ENTRY(thr); ret = duk_get_heapptr(thr, idx); if (ret != NULL) { return ret; } return def_value; } DUK_EXTERNAL void *duk_require_heapptr(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; void *ret; DUK_ASSERT_API_ENTRY(thr); tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); if (DUK_UNLIKELY(!DUK_TVAL_IS_HEAP_ALLOCATED(tv))) { DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "heapobject", DUK_STR_UNEXPECTED_TYPE); } ret = (void *) DUK_TVAL_GET_HEAPHDR(tv); DUK_ASSERT(ret != NULL); return ret; } /* Internal helper for getting/requiring a duk_hobject with possible promotion. */ DUK_LOCAL duk_hobject *duk__get_hobject_promote_mask_raw(duk_hthread *thr, duk_idx_t idx, duk_uint_t type_mask) { duk_uint_t val_mask; duk_hobject *res; DUK_ASSERT_CTX_VALID(thr); res = duk_get_hobject(thr, idx); /* common case, not promoted */ if (DUK_LIKELY(res != NULL)) { DUK_ASSERT(res != NULL); return res; } val_mask = duk_get_type_mask(thr, idx); if (val_mask & type_mask) { if (type_mask & DUK_TYPE_MASK_PROMOTE) { res = duk_to_hobject(thr, idx); DUK_ASSERT(res != NULL); return res; } else { return NULL; /* accept without promoting */ } } if (type_mask & DUK_TYPE_MASK_THROW) { DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "object", DUK_STR_NOT_OBJECT); } return NULL; } /* Get a duk_hobject * at 'idx'; if the value is not an object but matches the * supplied 'type_mask', promote it to an object and return the duk_hobject *. * This is useful for call sites which want an object but also accept a plain * buffer and/or a lightfunc which gets automatically promoted to an object. * Return value is NULL if value is neither an object nor a plain type allowed * by the mask. */ DUK_INTERNAL duk_hobject *duk_get_hobject_promote_mask(duk_hthread *thr, duk_idx_t idx, duk_uint_t type_mask) { DUK_ASSERT_API_ENTRY(thr); return duk__get_hobject_promote_mask_raw(thr, idx, type_mask | DUK_TYPE_MASK_PROMOTE); } /* Like duk_get_hobject_promote_mask() but throw a TypeError instead of * returning a NULL. */ DUK_INTERNAL duk_hobject *duk_require_hobject_promote_mask(duk_hthread *thr, duk_idx_t idx, duk_uint_t type_mask) { DUK_ASSERT_API_ENTRY(thr); return duk__get_hobject_promote_mask_raw(thr, idx, type_mask | DUK_TYPE_MASK_THROW | DUK_TYPE_MASK_PROMOTE); } /* Require a duk_hobject * at 'idx'; if the value is not an object but matches the * supplied 'type_mask', return a NULL instead. Otherwise throw a TypeError. */ DUK_INTERNAL duk_hobject *duk_require_hobject_accept_mask(duk_hthread *thr, duk_idx_t idx, duk_uint_t type_mask) { DUK_ASSERT_API_ENTRY(thr); return duk__get_hobject_promote_mask_raw(thr, idx, type_mask | DUK_TYPE_MASK_THROW); } DUK_INTERNAL duk_hobject *duk_get_hobject_with_class(duk_hthread *thr, duk_idx_t idx, duk_small_uint_t classnum) { duk_hobject *h; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT_DISABLE(classnum >= 0); /* unsigned */ DUK_ASSERT(classnum <= DUK_HOBJECT_CLASS_MAX); h = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT); if (DUK_UNLIKELY(h != NULL && DUK_HOBJECT_GET_CLASS_NUMBER(h) != classnum)) { h = NULL; } return h; } DUK_INTERNAL duk_hobject *duk_require_hobject_with_class(duk_hthread *thr, duk_idx_t idx, duk_small_uint_t classnum) { duk_hobject *h; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT_DISABLE(classnum >= 0); /* unsigned */ DUK_ASSERT(classnum <= DUK_HOBJECT_CLASS_MAX); h = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT); if (DUK_UNLIKELY(!(h != NULL && DUK_HOBJECT_GET_CLASS_NUMBER(h) == classnum))) { duk_hstring *h_class; h_class = DUK_HTHREAD_GET_STRING(thr, DUK_HOBJECT_CLASS_NUMBER_TO_STRIDX(classnum)); DUK_UNREF(h_class); DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, (const char *) DUK_HSTRING_GET_DATA(h_class), DUK_STR_UNEXPECTED_TYPE); } return h; } DUK_EXTERNAL duk_size_t duk_get_length(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; DUK_ASSERT_API_ENTRY(thr); tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); switch (DUK_TVAL_GET_TAG(tv)) { case DUK_TAG_UNDEFINED: case DUK_TAG_NULL: case DUK_TAG_BOOLEAN: case DUK_TAG_POINTER: return 0; #if defined(DUK_USE_PREFER_SIZE) /* String and buffer have a virtual non-configurable .length property * which is within size_t range so it can be looked up without specific * type checks. Lightfuncs inherit from %NativeFunctionPrototype% * which provides an inherited .length accessor; it could be overwritten * to produce unexpected types or values, but just number convert and * duk_size_t cast for now. */ case DUK_TAG_STRING: case DUK_TAG_BUFFER: case DUK_TAG_LIGHTFUNC: { duk_size_t ret; duk_get_prop_stridx(thr, idx, DUK_STRIDX_LENGTH); ret = (duk_size_t) duk_to_number_m1(thr); duk_pop_unsafe(thr); return ret; } #else /* DUK_USE_PREFER_SIZE */ case DUK_TAG_STRING: { duk_hstring *h = DUK_TVAL_GET_STRING(tv); DUK_ASSERT(h != NULL); if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) { return 0; } return (duk_size_t) DUK_HSTRING_GET_CHARLEN(h); } case DUK_TAG_BUFFER: { duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv); DUK_ASSERT(h != NULL); return (duk_size_t) DUK_HBUFFER_GET_SIZE(h); } case DUK_TAG_LIGHTFUNC: { /* We could look up the length from the lightfunc duk_tval, * but since Duktape 2.2 lightfunc .length comes from * %NativeFunctionPrototype% which can be overridden, so * look up the property explicitly. */ duk_size_t ret; duk_get_prop_stridx(thr, idx, DUK_STRIDX_LENGTH); ret = (duk_size_t) duk_to_number_m1(thr); duk_pop_unsafe(thr); return ret; } #endif /* DUK_USE_PREFER_SIZE */ case DUK_TAG_OBJECT: { duk_hobject *h = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h != NULL); return (duk_size_t) duk_hobject_get_length(thr, h); } #if defined(DUK_USE_FASTINT) case DUK_TAG_FASTINT: #endif default: /* number or 'unused' */ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv) || DUK_TVAL_IS_UNUSED(tv)); return 0; } DUK_UNREACHABLE(); } /* * duk_known_xxx() helpers * * Used internally when we're 100% sure that a certain index is valid and * contains an object of a certain type. For example, if we duk_push_object() * we can then safely duk_known_hobject(thr, -1). These helpers just assert * for the index and type, and if the assumptions are not valid, memory unsafe * behavior happens. */ DUK_LOCAL duk_heaphdr *duk__known_heaphdr(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; duk_heaphdr *h; DUK_ASSERT_CTX_VALID(thr); if (idx < 0) { tv = thr->valstack_top + idx; } else { tv = thr->valstack_bottom + idx; } DUK_ASSERT(tv >= thr->valstack_bottom); DUK_ASSERT(tv < thr->valstack_top); h = DUK_TVAL_GET_HEAPHDR(tv); DUK_ASSERT(h != NULL); return h; } DUK_INTERNAL duk_hstring *duk_known_hstring(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(duk_get_hstring(thr, idx) != NULL); return (duk_hstring *) duk__known_heaphdr(thr, idx); } DUK_INTERNAL duk_hobject *duk_known_hobject(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(duk_get_hobject(thr, idx) != NULL); return (duk_hobject *) duk__known_heaphdr(thr, idx); } DUK_INTERNAL duk_hbuffer *duk_known_hbuffer(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(duk_get_hbuffer(thr, idx) != NULL); return (duk_hbuffer *) duk__known_heaphdr(thr, idx); } DUK_INTERNAL duk_hcompfunc *duk_known_hcompfunc(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(duk_get_hcompfunc(thr, idx) != NULL); return (duk_hcompfunc *) duk__known_heaphdr(thr, idx); } DUK_INTERNAL duk_hnatfunc *duk_known_hnatfunc(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(duk_get_hnatfunc(thr, idx) != NULL); return (duk_hnatfunc *) duk__known_heaphdr(thr, idx); } DUK_EXTERNAL void duk_set_length(duk_hthread *thr, duk_idx_t idx, duk_size_t len) { DUK_ASSERT_API_ENTRY(thr); idx = duk_normalize_index(thr, idx); duk_push_uint(thr, (duk_uint_t) len); duk_put_prop_stridx(thr, idx, DUK_STRIDX_LENGTH); } /* * Conversions and coercions * * The conversion/coercions are in-place operations on the value stack. * Some operations are implemented here directly, while others call a * helper in duk_js_ops.c after validating arguments. */ /* E5 Section 8.12.8 */ DUK_LOCAL duk_bool_t duk__defaultvalue_coerce_attempt(duk_hthread *thr, duk_idx_t idx, duk_small_uint_t func_stridx) { if (duk_get_prop_stridx(thr, idx, func_stridx)) { /* [ ... func ] */ if (duk_is_callable(thr, -1)) { duk_dup(thr, idx); /* -> [ ... func this ] */ duk_call_method(thr, 0); /* -> [ ... retval ] */ if (duk_is_primitive(thr, -1)) { duk_replace(thr, idx); return 1; } /* [ ... retval ]; popped below */ } } duk_pop_unsafe(thr); /* [ ... func/retval ] -> [ ... ] */ return 0; } DUK_EXTERNAL void duk_to_undefined(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; DUK_ASSERT_API_ENTRY(thr); tv = duk_require_tval(thr, idx); DUK_ASSERT(tv != NULL); DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv); /* side effects */ } DUK_EXTERNAL void duk_to_null(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; DUK_ASSERT_API_ENTRY(thr); tv = duk_require_tval(thr, idx); DUK_ASSERT(tv != NULL); DUK_TVAL_SET_NULL_UPDREF(thr, tv); /* side effects */ } /* E5 Section 9.1 */ DUK_EXTERNAL void duk_to_primitive(duk_hthread *thr, duk_idx_t idx, duk_int_t hint) { /* inline initializer for coercers[] is not allowed by old compilers like BCC */ duk_small_uint_t coercers[2]; duk_small_uint_t class_number; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(hint == DUK_HINT_NONE || hint == DUK_HINT_NUMBER || hint == DUK_HINT_STRING); idx = duk_require_normalize_index(thr, idx); if (!duk_check_type_mask(thr, idx, DUK_TYPE_MASK_OBJECT | DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER)) { /* Any other values stay as is. */ DUK_ASSERT(!duk_is_buffer(thr, idx)); /* duk_to_string() relies on this behavior */ return; } class_number = duk_get_class_number(thr, idx); /* XXX: Symbol objects normally coerce via the ES2015-revised ToPrimitive() * algorithm which consults value[@@toPrimitive] and avoids calling * .valueOf() and .toString(). Before that is implemented, special * case Symbol objects to behave as if they had the default @@toPrimitive * algorithm of E6 Section 19.4.3.4, i.e. return the plain symbol value * with no further side effects. */ if (class_number == DUK_HOBJECT_CLASS_SYMBOL) { duk_hobject *h_obj; duk_hstring *h_str; /* XXX: pretty awkward, index based API for internal value access? */ h_obj = duk_known_hobject(thr, idx); h_str = duk_hobject_get_internal_value_string(thr->heap, h_obj); if (h_str) { duk_push_hstring(thr, h_str); duk_replace(thr, idx); return; } } /* Objects are coerced based on E5 specification. * Lightfuncs are coerced because they behave like * objects even if they're internally a primitive * type. Same applies to plain buffers, which behave * like ArrayBuffer objects since Duktape 2.x. */ coercers[0] = DUK_STRIDX_VALUE_OF; coercers[1] = DUK_STRIDX_TO_STRING; if (hint == DUK_HINT_NONE) { if (class_number == DUK_HOBJECT_CLASS_DATE) { hint = DUK_HINT_STRING; } else { hint = DUK_HINT_NUMBER; } } if (hint == DUK_HINT_STRING) { coercers[0] = DUK_STRIDX_TO_STRING; coercers[1] = DUK_STRIDX_VALUE_OF; } if (duk__defaultvalue_coerce_attempt(thr, idx, coercers[0])) { DUK_ASSERT(!duk_is_buffer(thr, idx)); /* duk_to_string() relies on this behavior */ return; } if (duk__defaultvalue_coerce_attempt(thr, idx, coercers[1])) { DUK_ASSERT(!duk_is_buffer(thr, idx)); /* duk_to_string() relies on this behavior */ return; } DUK_ERROR_TYPE(thr, DUK_STR_TOPRIMITIVE_FAILED); } /* E5 Section 9.2 */ DUK_EXTERNAL duk_bool_t duk_to_boolean(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; duk_bool_t val; DUK_ASSERT_API_ENTRY(thr); idx = duk_require_normalize_index(thr, idx); tv = DUK_GET_TVAL_POSIDX(thr, idx); DUK_ASSERT(tv != NULL); val = duk_js_toboolean(tv); DUK_ASSERT(val == 0 || val == 1); /* Note: no need to re-lookup tv, conversion is side effect free. */ DUK_ASSERT(tv != NULL); DUK_TVAL_SET_BOOLEAN_UPDREF(thr, tv, val); /* side effects */ return val; } DUK_EXTERNAL duk_double_t duk_to_number(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; duk_double_t d; DUK_ASSERT_API_ENTRY(thr); /* XXX: No need to normalize; the whole operation could be inlined here to * avoid 'tv' re-lookup. */ idx = duk_require_normalize_index(thr, idx); tv = DUK_GET_TVAL_POSIDX(thr, idx); DUK_ASSERT(tv != NULL); d = duk_js_tonumber(thr, tv); /* XXX: fastint coercion? now result will always be a non-fastint */ /* ToNumber() may have side effects so must relookup 'tv'. */ tv = DUK_GET_TVAL_POSIDX(thr, idx); DUK_TVAL_SET_NUMBER_UPDREF(thr, tv, d); /* side effects */ return d; } DUK_INTERNAL duk_double_t duk_to_number_m1(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); return duk_to_number(thr, -1); } DUK_INTERNAL duk_double_t duk_to_number_m2(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); return duk_to_number(thr, -2); } DUK_INTERNAL duk_double_t duk_to_number_tval(duk_hthread *thr, duk_tval *tv) { #if defined(DUK_USE_PREFER_SIZE) duk_double_t res; DUK_ASSERT_API_ENTRY(thr); duk_push_tval(thr, tv); res = duk_to_number_m1(thr); duk_pop_unsafe(thr); return res; #else duk_double_t res; duk_tval *tv_dst; DUK_ASSERT_API_ENTRY(thr); DUK__ASSERT_SPACE(); tv_dst = thr->valstack_top++; DUK_TVAL_SET_TVAL(tv_dst, tv); DUK_TVAL_INCREF(thr, tv_dst); /* decref not necessary */ res = duk_to_number_m1(thr); /* invalidates tv_dst */ tv_dst = --thr->valstack_top; DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_dst)); DUK_ASSERT(!DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv_dst)); /* plain number */ DUK_TVAL_SET_UNDEFINED(tv_dst); /* valstack init policy */ return res; #endif } /* XXX: combine all the integer conversions: they share everything * but the helper function for coercion. */ typedef duk_double_t (*duk__toint_coercer)(duk_hthread *thr, duk_tval *tv); DUK_LOCAL duk_double_t duk__to_int_uint_helper(duk_hthread *thr, duk_idx_t idx, duk__toint_coercer coerce_func) { duk_tval *tv; duk_double_t d; DUK_ASSERT_CTX_VALID(thr); tv = duk_require_tval(thr, idx); DUK_ASSERT(tv != NULL); #if defined(DUK_USE_FASTINT) /* If argument is a fastint, guarantee that it remains one. * There's no downgrade check for other cases. */ if (DUK_TVAL_IS_FASTINT(tv)) { /* XXX: Unnecessary conversion back and forth. */ return (duk_double_t) DUK_TVAL_GET_FASTINT(tv); } #endif d = coerce_func(thr, tv); /* XXX: fastint? */ /* Relookup in case coerce_func() has side effects, e.g. ends up coercing an object */ tv = duk_require_tval(thr, idx); DUK_TVAL_SET_NUMBER_UPDREF(thr, tv, d); /* side effects */ return d; } DUK_EXTERNAL duk_int_t duk_to_int(duk_hthread *thr, duk_idx_t idx) { /* Value coercion (in stack): ToInteger(), E5 Section 9.4, * API return value coercion: custom. */ DUK_ASSERT_API_ENTRY(thr); (void) duk__to_int_uint_helper(thr, idx, duk_js_tointeger); return (duk_int_t) duk__api_coerce_d2i(thr, idx, 0 /*def_value*/, 0 /*require*/); } DUK_EXTERNAL duk_uint_t duk_to_uint(duk_hthread *thr, duk_idx_t idx) { /* Value coercion (in stack): ToInteger(), E5 Section 9.4, * API return value coercion: custom. */ DUK_ASSERT_API_ENTRY(thr); (void) duk__to_int_uint_helper(thr, idx, duk_js_tointeger); return (duk_uint_t) duk__api_coerce_d2ui(thr, idx, 0 /*def_value*/, 0 /*require*/); } DUK_EXTERNAL duk_int32_t duk_to_int32(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; duk_int32_t ret; DUK_ASSERT_API_ENTRY(thr); tv = duk_require_tval(thr, idx); DUK_ASSERT(tv != NULL); ret = duk_js_toint32(thr, tv); /* Relookup in case coerce_func() has side effects, e.g. ends up coercing an object */ tv = duk_require_tval(thr, idx); DUK_TVAL_SET_I32_UPDREF(thr, tv, ret); /* side effects */ return ret; } DUK_EXTERNAL duk_uint32_t duk_to_uint32(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; duk_uint32_t ret; DUK_ASSERT_API_ENTRY(thr); tv = duk_require_tval(thr, idx); DUK_ASSERT(tv != NULL); ret = duk_js_touint32(thr, tv); /* Relookup in case coerce_func() has side effects, e.g. ends up coercing an object */ tv = duk_require_tval(thr, idx); DUK_TVAL_SET_U32_UPDREF(thr, tv, ret); /* side effects */ return ret; } DUK_EXTERNAL duk_uint16_t duk_to_uint16(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; duk_uint16_t ret; DUK_ASSERT_API_ENTRY(thr); tv = duk_require_tval(thr, idx); DUK_ASSERT(tv != NULL); ret = duk_js_touint16(thr, tv); /* Relookup in case coerce_func() has side effects, e.g. ends up coercing an object */ tv = duk_require_tval(thr, idx); DUK_TVAL_SET_U32_UPDREF(thr, tv, ret); /* side effects */ return ret; } #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) /* Special coercion for Uint8ClampedArray. */ DUK_INTERNAL duk_uint8_t duk_to_uint8clamped(duk_hthread *thr, duk_idx_t idx) { duk_double_t d; duk_double_t t; duk_uint8_t ret; DUK_ASSERT_API_ENTRY(thr); /* XXX: Simplify this algorithm, should be possible to come up with * a shorter and faster algorithm by inspecting IEEE representation * directly. */ d = duk_to_number(thr, idx); if (d <= 0.0) { return 0; } else if (d >= 255) { return 255; } else if (DUK_ISNAN(d)) { /* Avoid NaN-to-integer coercion as it is compiler specific. */ return 0; } t = d - DUK_FLOOR(d); if (t == 0.5) { /* Exact halfway, round to even. */ ret = (duk_uint8_t) d; ret = (ret + 1) & 0xfe; /* Example: d=3.5, t=0.5 -> ret = (3 + 1) & 0xfe = 4 & 0xfe = 4 * Example: d=4.5, t=0.5 -> ret = (4 + 1) & 0xfe = 5 & 0xfe = 4 */ } else { /* Not halfway, round to nearest. */ ret = (duk_uint8_t) (d + 0.5); } return ret; } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ DUK_EXTERNAL const char *duk_to_lstring(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len) { DUK_ASSERT_API_ENTRY(thr); (void) duk_to_string(thr, idx); DUK_ASSERT(duk_is_string(thr, idx)); return duk_require_lstring(thr, idx, out_len); } DUK_LOCAL duk_ret_t duk__safe_to_string_raw(duk_hthread *thr, void *udata) { DUK_ASSERT_CTX_VALID(thr); DUK_UNREF(udata); duk_to_string(thr, -1); return 1; } DUK_EXTERNAL const char *duk_safe_to_lstring(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len) { DUK_ASSERT_API_ENTRY(thr); idx = duk_require_normalize_index(thr, idx); /* We intentionally ignore the duk_safe_call() return value and only * check the output type. This way we don't also need to check that * the returned value is indeed a string in the success case. */ duk_dup(thr, idx); (void) duk_safe_call(thr, duk__safe_to_string_raw, NULL /*udata*/, 1 /*nargs*/, 1 /*nrets*/); if (!duk_is_string(thr, -1)) { /* Error: try coercing error to string once. */ (void) duk_safe_call(thr, duk__safe_to_string_raw, NULL /*udata*/, 1 /*nargs*/, 1 /*nrets*/); if (!duk_is_string(thr, -1)) { /* Double error */ duk_pop_unsafe(thr); duk_push_hstring_stridx(thr, DUK_STRIDX_UC_ERROR); } else { ; } } else { /* String; may be a symbol, accepted. */ ; } DUK_ASSERT(duk_is_string(thr, -1)); duk_replace(thr, idx); DUK_ASSERT(duk_get_string(thr, idx) != NULL); return duk_get_lstring(thr, idx, out_len); } DUK_INTERNAL duk_hstring *duk_to_property_key_hstring(duk_hthread *thr, duk_idx_t idx) { duk_hstring *h; DUK_ASSERT_API_ENTRY(thr); duk_to_primitive(thr, idx, DUK_HINT_STRING); /* needed for e.g. Symbol objects */ h = duk_get_hstring(thr, idx); if (h == NULL) { /* The "is string?" check may seem unnecessary, but as things * are duk_to_hstring() invokes ToString() which fails for * symbols. But since symbols are already strings for Duktape * C API, we check for that before doing the coercion. */ h = duk_to_hstring(thr, idx); } DUK_ASSERT(h != NULL); return h; } #if defined(DUK_USE_DEBUGGER_SUPPORT) /* only needed by debugger for now */ DUK_INTERNAL duk_hstring *duk_safe_to_hstring(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); (void) duk_safe_to_string(thr, idx); DUK_ASSERT(duk_is_string(thr, idx)); DUK_ASSERT(duk_get_hstring(thr, idx) != NULL); return duk_known_hstring(thr, idx); } #endif /* Push Object.prototype.toString() output for 'tv'. */ DUK_INTERNAL void duk_push_class_string_tval(duk_hthread *thr, duk_tval *tv) { duk_small_uint_t stridx; duk_hstring *h_strclass; DUK_ASSERT_API_ENTRY(thr); switch (DUK_TVAL_GET_TAG(tv)) { case DUK_TAG_UNUSED: /* Treat like 'undefined', shouldn't happen. */ case DUK_TAG_UNDEFINED: { stridx = DUK_STRIDX_UC_UNDEFINED; break; } case DUK_TAG_NULL: { stridx = DUK_STRIDX_UC_NULL; break; } case DUK_TAG_BOOLEAN: { stridx = DUK_STRIDX_UC_BOOLEAN; break; } case DUK_TAG_POINTER: { stridx = DUK_STRIDX_UC_POINTER; break; } case DUK_TAG_LIGHTFUNC: { stridx = DUK_STRIDX_UC_FUNCTION; break; } case DUK_TAG_STRING: { duk_hstring *h; h = DUK_TVAL_GET_STRING(tv); DUK_ASSERT(h != NULL); if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) { stridx = DUK_STRIDX_UC_SYMBOL; } else { stridx = DUK_STRIDX_UC_STRING; } break; } case DUK_TAG_OBJECT: { duk_hobject *h; duk_small_uint_t classnum; h = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h != NULL); classnum = DUK_HOBJECT_GET_CLASS_NUMBER(h); stridx = DUK_HOBJECT_CLASS_NUMBER_TO_STRIDX(classnum); /* XXX: This is not entirely correct anymore; in ES2015 the * default lookup should use @@toStringTag to come up with * e.g. [object Symbol], [object Uint8Array], etc. See * ES2015 Section 19.1.3.6. The downside of implementing that * directly is that the @@toStringTag lookup may have side * effects, so all call sites must be checked for that. * Some may need a side-effect free lookup, e.g. avoiding * getters which are not typical. */ break; } case DUK_TAG_BUFFER: { stridx = DUK_STRIDX_UINT8_ARRAY; break; } #if defined(DUK_USE_FASTINT) case DUK_TAG_FASTINT: /* Fall through to generic number case. */ #endif default: { DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); /* number (maybe fastint) */ stridx = DUK_STRIDX_UC_NUMBER; break; } } h_strclass = DUK_HTHREAD_GET_STRING(thr, stridx); DUK_ASSERT(h_strclass != NULL); duk_push_sprintf(thr, "[object %s]", (const char *) DUK_HSTRING_GET_DATA(h_strclass)); } /* XXX: other variants like uint, u32 etc */ DUK_INTERNAL duk_int_t duk_to_int_clamped_raw(duk_hthread *thr, duk_idx_t idx, duk_int_t minval, duk_int_t maxval, duk_bool_t *out_clamped) { duk_tval *tv; duk_tval tv_tmp; duk_double_t d, dmin, dmax; duk_int_t res; duk_bool_t clamped = 0; DUK_ASSERT_API_ENTRY(thr); tv = duk_require_tval(thr, idx); DUK_ASSERT(tv != NULL); d = duk_js_tointeger(thr, tv); /* E5 Section 9.4, ToInteger() */ dmin = (duk_double_t) minval; dmax = (duk_double_t) maxval; if (d < dmin) { clamped = 1; res = minval; d = dmin; } else if (d > dmax) { clamped = 1; res = maxval; d = dmax; } else { res = (duk_int_t) d; } DUK_UNREF(d); /* SCANBUILD: with suitable dmin/dmax limits 'd' is unused */ /* 'd' and 'res' agree here */ /* Relookup in case duk_js_tointeger() ends up e.g. coercing an object. */ tv = duk_get_tval(thr, idx); DUK_ASSERT(tv != NULL); /* not popped by side effect */ DUK_TVAL_SET_TVAL(&tv_tmp, tv); #if defined(DUK_USE_FASTINT) #if (DUK_INT_MAX <= 0x7fffffffL) DUK_TVAL_SET_I32(tv, res); #else /* Clamping needed if duk_int_t is 64 bits. */ if (res >= DUK_FASTINT_MIN && res <= DUK_FASTINT_MAX) { DUK_TVAL_SET_FASTINT(tv, res); } else { DUK_TVAL_SET_NUMBER(tv, d); } #endif #else DUK_TVAL_SET_NUMBER(tv, d); /* no need to incref */ #endif DUK_TVAL_DECREF(thr, &tv_tmp); /* side effects */ if (out_clamped) { *out_clamped = clamped; } else { /* coerced value is updated to value stack even when RangeError thrown */ if (clamped) { DUK_ERROR_RANGE(thr, DUK_STR_NUMBER_OUTSIDE_RANGE); } } return res; } DUK_INTERNAL duk_int_t duk_to_int_clamped(duk_hthread *thr, duk_idx_t idx, duk_idx_t minval, duk_idx_t maxval) { duk_bool_t dummy; DUK_ASSERT_API_ENTRY(thr); return duk_to_int_clamped_raw(thr, idx, minval, maxval, &dummy); } DUK_INTERNAL duk_int_t duk_to_int_check_range(duk_hthread *thr, duk_idx_t idx, duk_int_t minval, duk_int_t maxval) { DUK_ASSERT_API_ENTRY(thr); return duk_to_int_clamped_raw(thr, idx, minval, maxval, NULL); /* out_clamped==NULL -> RangeError if outside range */ } DUK_EXTERNAL const char *duk_to_string(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; DUK_ASSERT_API_ENTRY(thr); idx = duk_require_normalize_index(thr, idx); tv = DUK_GET_TVAL_POSIDX(thr, idx); DUK_ASSERT(tv != NULL); switch (DUK_TVAL_GET_TAG(tv)) { case DUK_TAG_UNDEFINED: { duk_push_hstring_stridx(thr, DUK_STRIDX_LC_UNDEFINED); break; } case DUK_TAG_NULL: { duk_push_hstring_stridx(thr, DUK_STRIDX_LC_NULL); break; } case DUK_TAG_BOOLEAN: { if (DUK_TVAL_GET_BOOLEAN(tv)) { duk_push_hstring_stridx(thr, DUK_STRIDX_TRUE); } else { duk_push_hstring_stridx(thr, DUK_STRIDX_FALSE); } break; } case DUK_TAG_STRING: { /* Nop for actual strings, TypeError for Symbols. * Because various internals rely on ToString() coercion of * internal strings, -allow- (NOP) string coercion for hidden * symbols. */ #if 1 duk_hstring *h; h = DUK_TVAL_GET_STRING(tv); DUK_ASSERT(h != NULL); if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) { DUK_ERROR_TYPE(thr, DUK_STR_CANNOT_STRING_COERCE_SYMBOL); } else { goto skip_replace; } #else goto skip_replace; #endif } case DUK_TAG_BUFFER: /* Go through Uint8Array.prototype.toString() for coercion. */ case DUK_TAG_OBJECT: { /* Plain buffers: go through ArrayBuffer.prototype.toString() * for coercion. * * Symbol objects: duk_to_primitive() results in a plain symbol * value, and duk_to_string() then causes a TypeError. */ duk_to_primitive(thr, idx, DUK_HINT_STRING); DUK_ASSERT(!duk_is_buffer(thr, idx)); /* ToPrimitive() must guarantee */ DUK_ASSERT(!duk_is_object(thr, idx)); return duk_to_string(thr, idx); /* Note: recursive call */ } case DUK_TAG_POINTER: { void *ptr = DUK_TVAL_GET_POINTER(tv); if (ptr != NULL) { duk_push_sprintf(thr, DUK_STR_FMT_PTR, (void *) ptr); } else { /* Represent a null pointer as 'null' to be consistent with * the JX format variant. Native '%p' format for a NULL * pointer may be e.g. '(nil)'. */ duk_push_hstring_stridx(thr, DUK_STRIDX_LC_NULL); } break; } case DUK_TAG_LIGHTFUNC: { /* Should match Function.prototype.toString() */ duk_push_lightfunc_tostring(thr, tv); break; } #if defined(DUK_USE_FASTINT) case DUK_TAG_FASTINT: #endif default: { /* number */ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv)); DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); duk_push_tval(thr, tv); duk_numconv_stringify(thr, 10 /*radix*/, 0 /*precision:shortest*/, 0 /*force_exponential*/); break; } } duk_replace(thr, idx); skip_replace: DUK_ASSERT(duk_is_string(thr, idx)); return duk_require_string(thr, idx); } DUK_INTERNAL duk_hstring *duk_to_hstring(duk_hthread *thr, duk_idx_t idx) { duk_hstring *ret; DUK_ASSERT_API_ENTRY(thr); duk_to_string(thr, idx); ret = duk_get_hstring(thr, idx); DUK_ASSERT(ret != NULL); return ret; } DUK_INTERNAL duk_hstring *duk_to_hstring_m1(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); return duk_to_hstring(thr, -1); } DUK_INTERNAL duk_hstring *duk_to_hstring_acceptsymbol(duk_hthread *thr, duk_idx_t idx) { duk_hstring *ret; DUK_ASSERT_API_ENTRY(thr); ret = duk_get_hstring(thr, idx); if (DUK_UNLIKELY(ret && DUK_HSTRING_HAS_SYMBOL(ret))) { return ret; } return duk_to_hstring(thr, idx); } /* Convert a plain buffer or any buffer object into a string, using the buffer * bytes 1:1 in the internal string representation. For views the active byte * slice (not element slice interpreted as an initializer) is used. This is * necessary in Duktape 2.x because ToString(plainBuffer) no longer creates a * string with the same bytes as in the buffer but rather (usually) * '[object ArrayBuffer]'. */ DUK_EXTERNAL const char *duk_buffer_to_string(duk_hthread *thr, duk_idx_t idx) { void *ptr_src; duk_size_t len; const char *res; DUK_ASSERT_API_ENTRY(thr); idx = duk_require_normalize_index(thr, idx); ptr_src = duk_require_buffer_data(thr, idx, &len); DUK_ASSERT(ptr_src != NULL || len == 0); res = duk_push_lstring(thr, (const char *) ptr_src, len); duk_replace(thr, idx); return res; } DUK_EXTERNAL void *duk_to_buffer_raw(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, duk_uint_t mode) { duk_hbuffer *h_buf; const duk_uint8_t *src_data; duk_size_t src_size; duk_uint8_t *dst_data; DUK_ASSERT_API_ENTRY(thr); idx = duk_require_normalize_index(thr, idx); h_buf = duk_get_hbuffer(thr, idx); if (h_buf != NULL) { /* Buffer is kept as is, with the fixed/dynamic nature of the * buffer only changed if requested. An external buffer * is converted into a non-external dynamic buffer in a * duk_to_dynamic_buffer() call. */ duk_uint_t tmp; duk_uint8_t *tmp_ptr; tmp_ptr = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_buf); src_data = (const duk_uint8_t *) tmp_ptr; src_size = DUK_HBUFFER_GET_SIZE(h_buf); tmp = (DUK_HBUFFER_HAS_DYNAMIC(h_buf) ? DUK_BUF_MODE_DYNAMIC : DUK_BUF_MODE_FIXED); if ((tmp == mode && !DUK_HBUFFER_HAS_EXTERNAL(h_buf)) || mode == DUK_BUF_MODE_DONTCARE) { /* Note: src_data may be NULL if input is a zero-size * dynamic buffer. */ dst_data = tmp_ptr; goto skip_copy; } } else { /* Non-buffer value is first ToString() coerced, then converted * to a buffer (fixed buffer is used unless a dynamic buffer is * explicitly requested). Symbols are rejected with a TypeError. * XXX: C API could maybe allow symbol-to-buffer coercion? */ src_data = (const duk_uint8_t *) duk_to_lstring(thr, idx, &src_size); } dst_data = (duk_uint8_t *) duk_push_buffer(thr, src_size, (mode == DUK_BUF_MODE_DYNAMIC) /*dynamic*/); if (DUK_LIKELY(src_size > 0)) { /* When src_size == 0, src_data may be NULL (if source * buffer is dynamic), and dst_data may be NULL (if * target buffer is dynamic). Avoid zero-size memcpy() * with an invalid pointer. */ DUK_MEMCPY((void *) dst_data, (const void *) src_data, (size_t) src_size); } duk_replace(thr, idx); skip_copy: if (out_size) { *out_size = src_size; } return dst_data; } DUK_EXTERNAL void *duk_to_pointer(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; void *res; DUK_ASSERT_API_ENTRY(thr); idx = duk_require_normalize_index(thr, idx); tv = DUK_GET_TVAL_POSIDX(thr, idx); DUK_ASSERT(tv != NULL); switch (DUK_TVAL_GET_TAG(tv)) { case DUK_TAG_UNDEFINED: case DUK_TAG_NULL: case DUK_TAG_BOOLEAN: res = NULL; break; case DUK_TAG_POINTER: res = DUK_TVAL_GET_POINTER(tv); break; case DUK_TAG_STRING: case DUK_TAG_OBJECT: case DUK_TAG_BUFFER: /* Heap allocated: return heap pointer which is NOT useful * for the caller, except for debugging. */ res = (void *) DUK_TVAL_GET_HEAPHDR(tv); break; case DUK_TAG_LIGHTFUNC: /* Function pointers do not always cast correctly to void * * (depends on memory and segmentation model for instance), * so they coerce to NULL. */ res = NULL; break; #if defined(DUK_USE_FASTINT) case DUK_TAG_FASTINT: #endif default: /* number */ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv)); DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); res = NULL; break; } duk_push_pointer(thr, res); duk_replace(thr, idx); return res; } DUK_LOCAL void duk__push_func_from_lightfunc(duk_hthread *thr, duk_c_function func, duk_small_uint_t lf_flags) { duk_idx_t nargs; duk_uint_t flags = 0; /* shared flags for a subset of types */ duk_small_uint_t lf_len; duk_hnatfunc *nf; nargs = (duk_idx_t) DUK_LFUNC_FLAGS_GET_NARGS(lf_flags); if (nargs == DUK_LFUNC_NARGS_VARARGS) { nargs = (duk_idx_t) DUK_VARARGS; } flags = DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_CONSTRUCTABLE | DUK_HOBJECT_FLAG_CALLABLE | DUK_HOBJECT_FLAG_FASTREFS | DUK_HOBJECT_FLAG_NATFUNC | DUK_HOBJECT_FLAG_NEWENV | DUK_HOBJECT_FLAG_STRICT | DUK_HOBJECT_FLAG_NOTAIL | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION); (void) duk__push_c_function_raw(thr, func, nargs, flags, DUK_BIDX_NATIVE_FUNCTION_PROTOTYPE); lf_len = DUK_LFUNC_FLAGS_GET_LENGTH(lf_flags); if ((duk_idx_t) lf_len != nargs) { /* Explicit length is only needed if it differs from 'nargs'. */ duk_push_int(thr, (duk_int_t) lf_len); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_NONE); } #if defined(DUK_USE_FUNC_NAME_PROPERTY) duk_push_lightfunc_name_raw(thr, func, lf_flags); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_C); #endif nf = duk_known_hnatfunc(thr, -1); nf->magic = (duk_int16_t) DUK_LFUNC_FLAGS_GET_MAGIC(lf_flags); } DUK_EXTERNAL void duk_to_object(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; duk_uint_t flags = 0; /* shared flags for a subset of types */ duk_small_int_t proto = 0; DUK_ASSERT_API_ENTRY(thr); idx = duk_require_normalize_index(thr, idx); tv = DUK_GET_TVAL_POSIDX(thr, idx); DUK_ASSERT(tv != NULL); switch (DUK_TVAL_GET_TAG(tv)) { #if !defined(DUK_USE_BUFFEROBJECT_SUPPORT) case DUK_TAG_BUFFER: /* With no bufferobject support, don't object coerce. */ #endif case DUK_TAG_UNDEFINED: case DUK_TAG_NULL: { DUK_ERROR_TYPE(thr, DUK_STR_NOT_OBJECT_COERCIBLE); break; } case DUK_TAG_BOOLEAN: { flags = DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_FASTREFS | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_BOOLEAN); proto = DUK_BIDX_BOOLEAN_PROTOTYPE; goto create_object; } case DUK_TAG_STRING: { duk_hstring *h; h = DUK_TVAL_GET_STRING(tv); DUK_ASSERT(h != NULL); if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) { flags = DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_FASTREFS | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_SYMBOL); proto = DUK_BIDX_SYMBOL_PROTOTYPE; } else { flags = DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_FASTREFS | DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_STRING); proto = DUK_BIDX_STRING_PROTOTYPE; } goto create_object; } case DUK_TAG_OBJECT: { /* nop */ break; } #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) case DUK_TAG_BUFFER: { /* A plain buffer object coerces to a full ArrayBuffer which * is not fully transparent behavior (ToObject() should be a * nop for an object). This behavior matches lightfuncs which * also coerce to an equivalent Function object. There are * also downsides to defining ToObject(plainBuffer) as a no-op; * for example duk_to_hobject() could result in a NULL pointer. */ duk_hbuffer *h_buf; h_buf = DUK_TVAL_GET_BUFFER(tv); DUK_ASSERT(h_buf != NULL); duk_hbufobj_push_uint8array_from_plain(thr, h_buf); goto replace_value; } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ case DUK_TAG_POINTER: { flags = DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_FASTREFS | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_POINTER); proto = DUK_BIDX_POINTER_PROTOTYPE; goto create_object; } case DUK_TAG_LIGHTFUNC: { /* Lightfunc coerces to a Function instance with concrete * properties. Since 'length' is virtual for Duktape/C * functions, don't need to define that. The result is made * extensible to mimic what happens to strings in object * coercion: * * > Object.isExtensible(Object('foo')) * true */ duk_small_uint_t lf_flags; duk_c_function func; DUK_TVAL_GET_LIGHTFUNC(tv, func, lf_flags); duk__push_func_from_lightfunc(thr, func, lf_flags); goto replace_value; } #if defined(DUK_USE_FASTINT) case DUK_TAG_FASTINT: #endif default: { DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv)); DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); flags = DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_FASTREFS | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_NUMBER); proto = DUK_BIDX_NUMBER_PROTOTYPE; goto create_object; } } DUK_ASSERT(duk_is_object(thr, idx)); return; create_object: (void) duk_push_object_helper(thr, flags, proto); /* Note: Boolean prototype's internal value property is not writable, * but duk_xdef_prop_stridx() disregards the write protection. Boolean * instances are immutable. * * String and buffer special behaviors are already enabled which is not * ideal, but a write to the internal value is not affected by them. */ duk_dup(thr, idx); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_NONE); replace_value: duk_replace(thr, idx); DUK_ASSERT(duk_is_object(thr, idx)); } DUK_INTERNAL duk_hobject *duk_to_hobject(duk_hthread *thr, duk_idx_t idx) { duk_hobject *ret; DUK_ASSERT_API_ENTRY(thr); duk_to_object(thr, idx); ret = duk_known_hobject(thr, idx); return ret; } /* * Type checking */ DUK_LOCAL duk_bool_t duk__tag_check(duk_hthread *thr, duk_idx_t idx, duk_small_uint_t tag) { duk_tval *tv; tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); return (DUK_TVAL_GET_TAG(tv) == tag); } DUK_LOCAL duk_bool_t duk__obj_flag_any_default_false(duk_hthread *thr, duk_idx_t idx, duk_uint_t flag_mask) { duk_hobject *obj; DUK_ASSERT_API_ENTRY(thr); obj = duk_get_hobject(thr, idx); if (obj) { return (DUK_HEAPHDR_CHECK_FLAG_BITS((duk_heaphdr *) obj, flag_mask) ? 1 : 0); } return 0; } DUK_INTERNAL duk_int_t duk_get_type_tval(duk_tval *tv) { DUK_ASSERT(tv != NULL); #if defined(DUK_USE_PACKED_TVAL) switch (DUK_TVAL_GET_TAG(tv)) { case DUK_TAG_UNUSED: return DUK_TYPE_NONE; case DUK_TAG_UNDEFINED: return DUK_TYPE_UNDEFINED; case DUK_TAG_NULL: return DUK_TYPE_NULL; case DUK_TAG_BOOLEAN: return DUK_TYPE_BOOLEAN; case DUK_TAG_STRING: return DUK_TYPE_STRING; case DUK_TAG_OBJECT: return DUK_TYPE_OBJECT; case DUK_TAG_BUFFER: return DUK_TYPE_BUFFER; case DUK_TAG_POINTER: return DUK_TYPE_POINTER; case DUK_TAG_LIGHTFUNC: return DUK_TYPE_LIGHTFUNC; #if defined(DUK_USE_FASTINT) case DUK_TAG_FASTINT: #endif default: /* Note: number has no explicit tag (in 8-byte representation) */ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv)); DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); return DUK_TYPE_NUMBER; } #else /* DUK_USE_PACKED_TVAL */ DUK_ASSERT(DUK_TVAL_IS_VALID_TAG(tv)); DUK_ASSERT(sizeof(duk__type_from_tag) / sizeof(duk_uint_t) == DUK_TAG_MAX - DUK_TAG_MIN + 1); return (duk_int_t) duk__type_from_tag[DUK_TVAL_GET_TAG(tv) - DUK_TAG_MIN]; #endif /* DUK_USE_PACKED_TVAL */ } DUK_EXTERNAL duk_int_t duk_get_type(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; DUK_ASSERT_API_ENTRY(thr); tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); return duk_get_type_tval(tv); } #if defined(DUK_USE_VERBOSE_ERRORS) && defined(DUK_USE_PARANOID_ERRORS) DUK_LOCAL const char * const duk__type_names[] = { "none", "undefined", "null", "boolean", "number", "string", "object", "buffer", "pointer", "lightfunc" }; DUK_INTERNAL const char *duk_get_type_name(duk_hthread *thr, duk_idx_t idx) { duk_int_t type_tag; DUK_ASSERT_API_ENTRY(thr); type_tag = duk_get_type(thr, idx); DUK_ASSERT(type_tag >= DUK_TYPE_MIN && type_tag <= DUK_TYPE_MAX); DUK_ASSERT(DUK_TYPE_MIN == 0 && sizeof(duk__type_names) / sizeof(const char *) == DUK_TYPE_MAX + 1); return duk__type_names[type_tag]; } #endif /* DUK_USE_VERBOSE_ERRORS && DUK_USE_PARANOID_ERRORS */ DUK_INTERNAL duk_small_uint_t duk_get_class_number(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; duk_hobject *obj; DUK_ASSERT_API_ENTRY(thr); tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); switch (DUK_TVAL_GET_TAG(tv)) { case DUK_TAG_OBJECT: obj = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(obj != NULL); return DUK_HOBJECT_GET_CLASS_NUMBER(obj); case DUK_TAG_BUFFER: /* Buffers behave like Uint8Array objects. */ return DUK_HOBJECT_CLASS_UINT8ARRAY; case DUK_TAG_LIGHTFUNC: /* Lightfuncs behave like Function objects. */ return DUK_HOBJECT_CLASS_FUNCTION; default: /* Primitive or UNUSED, no class number. */ return DUK_HOBJECT_CLASS_NONE; } } DUK_EXTERNAL duk_bool_t duk_check_type(duk_hthread *thr, duk_idx_t idx, duk_int_t type) { DUK_ASSERT_API_ENTRY(thr); return (duk_get_type(thr, idx) == type) ? 1 : 0; } DUK_INTERNAL duk_uint_t duk_get_type_mask_tval(duk_tval *tv) { DUK_ASSERT(tv != NULL); #if defined(DUK_USE_PACKED_TVAL) switch (DUK_TVAL_GET_TAG(tv)) { case DUK_TAG_UNUSED: return DUK_TYPE_MASK_NONE; case DUK_TAG_UNDEFINED: return DUK_TYPE_MASK_UNDEFINED; case DUK_TAG_NULL: return DUK_TYPE_MASK_NULL; case DUK_TAG_BOOLEAN: return DUK_TYPE_MASK_BOOLEAN; case DUK_TAG_STRING: return DUK_TYPE_MASK_STRING; case DUK_TAG_OBJECT: return DUK_TYPE_MASK_OBJECT; case DUK_TAG_BUFFER: return DUK_TYPE_MASK_BUFFER; case DUK_TAG_POINTER: return DUK_TYPE_MASK_POINTER; case DUK_TAG_LIGHTFUNC: return DUK_TYPE_MASK_LIGHTFUNC; #if defined(DUK_USE_FASTINT) case DUK_TAG_FASTINT: #endif default: /* Note: number has no explicit tag (in 8-byte representation) */ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv)); DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); return DUK_TYPE_MASK_NUMBER; } #else /* DUK_USE_PACKED_TVAL */ DUK_ASSERT(DUK_TVAL_IS_VALID_TAG(tv)); DUK_ASSERT(sizeof(duk__type_mask_from_tag) / sizeof(duk_uint_t) == DUK_TAG_MAX - DUK_TAG_MIN + 1); return duk__type_mask_from_tag[DUK_TVAL_GET_TAG(tv) - DUK_TAG_MIN]; #endif /* DUK_USE_PACKED_TVAL */ } DUK_EXTERNAL duk_uint_t duk_get_type_mask(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; DUK_ASSERT_API_ENTRY(thr); tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); return duk_get_type_mask_tval(tv); } DUK_EXTERNAL duk_bool_t duk_check_type_mask(duk_hthread *thr, duk_idx_t idx, duk_uint_t mask) { DUK_ASSERT_API_ENTRY(thr); if (DUK_LIKELY((duk_get_type_mask(thr, idx) & mask) != 0U)) { return 1; } if (mask & DUK_TYPE_MASK_THROW) { DUK_ERROR_TYPE(thr, DUK_STR_UNEXPECTED_TYPE); DUK_UNREACHABLE(); } return 0; } DUK_EXTERNAL duk_bool_t duk_is_undefined(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); return duk__tag_check(thr, idx, DUK_TAG_UNDEFINED); } DUK_EXTERNAL duk_bool_t duk_is_null(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); return duk__tag_check(thr, idx, DUK_TAG_NULL); } DUK_EXTERNAL duk_bool_t duk_is_boolean(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); return duk__tag_check(thr, idx, DUK_TAG_BOOLEAN); } DUK_EXTERNAL duk_bool_t duk_is_number(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; DUK_ASSERT_API_ENTRY(thr); /* * Number is special because it doesn't have a specific * tag in the 8-byte representation. */ /* XXX: shorter version for unpacked representation? */ tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); return DUK_TVAL_IS_NUMBER(tv); } DUK_EXTERNAL duk_bool_t duk_is_nan(duk_hthread *thr, duk_idx_t idx) { /* XXX: This will now return false for non-numbers, even though they would * coerce to NaN (as a general rule). In particular, duk_get_number() * returns a NaN for non-numbers, so should this function also return * true for non-numbers? */ duk_tval *tv; DUK_ASSERT_API_ENTRY(thr); tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); /* XXX: for packed duk_tval an explicit "is number" check is unnecessary */ if (!DUK_TVAL_IS_NUMBER(tv)) { return 0; } return (duk_bool_t) DUK_ISNAN(DUK_TVAL_GET_NUMBER(tv)); } DUK_EXTERNAL duk_bool_t duk_is_string(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); return duk__tag_check(thr, idx, DUK_TAG_STRING); } DUK_INTERNAL duk_bool_t duk_is_string_notsymbol(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); return duk_get_hstring_notsymbol(thr, idx) != NULL; } DUK_EXTERNAL duk_bool_t duk_is_object(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); return duk__tag_check(thr, idx, DUK_TAG_OBJECT); } DUK_EXTERNAL duk_bool_t duk_is_buffer(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); return duk__tag_check(thr, idx, DUK_TAG_BUFFER); } #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_EXTERNAL duk_bool_t duk_is_buffer_data(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; DUK_ASSERT_API_ENTRY(thr); tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); if (DUK_TVAL_IS_BUFFER(tv)) { return 1; } else if (DUK_TVAL_IS_OBJECT(tv)) { duk_hobject *h = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h != NULL); if (DUK_HOBJECT_IS_BUFOBJ(h)) { return 1; } } return 0; } #else /* DUK_USE_BUFFEROBJECT_SUPPORT */ DUK_EXTERNAL duk_bool_t duk_is_buffer_data(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); return duk_is_buffer(thr, idx); } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ DUK_EXTERNAL duk_bool_t duk_is_pointer(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); return duk__tag_check(thr, idx, DUK_TAG_POINTER); } DUK_EXTERNAL duk_bool_t duk_is_lightfunc(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); return duk__tag_check(thr, idx, DUK_TAG_LIGHTFUNC); } DUK_EXTERNAL duk_bool_t duk_is_symbol(duk_hthread *thr, duk_idx_t idx) { duk_hstring *h; DUK_ASSERT_API_ENTRY(thr); h = duk_get_hstring(thr, idx); /* Use DUK_LIKELY() here because caller may be more likely to type * check an expected symbol than not. */ if (DUK_LIKELY(h != NULL && DUK_HSTRING_HAS_SYMBOL(h))) { return 1; } return 0; } DUK_EXTERNAL duk_bool_t duk_is_array(duk_hthread *thr, duk_idx_t idx) { duk_hobject *obj; DUK_ASSERT_API_ENTRY(thr); obj = duk_get_hobject(thr, idx); if (obj) { return (DUK_HOBJECT_GET_CLASS_NUMBER(obj) == DUK_HOBJECT_CLASS_ARRAY ? 1 : 0); } return 0; } DUK_EXTERNAL duk_bool_t duk_is_function(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; DUK_ASSERT_API_ENTRY(thr); tv = duk_get_tval_or_unused(thr, idx); if (DUK_TVAL_IS_OBJECT(tv)) { duk_hobject *h; h = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h != NULL); return DUK_HOBJECT_HAS_CALLABLE(h) ? 1 : 0; } if (DUK_TVAL_IS_LIGHTFUNC(tv)) { return 1; } return 0; } DUK_INTERNAL duk_bool_t duk_is_callable_tval(duk_hthread *thr, duk_tval *tv) { DUK_ASSERT_API_ENTRY(thr); DUK_UNREF(thr); if (DUK_TVAL_IS_OBJECT(tv)) { duk_hobject *h; h = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h != NULL); return DUK_HOBJECT_HAS_CALLABLE(h) ? 1 : 0; } if (DUK_TVAL_IS_LIGHTFUNC(tv)) { return 1; } return 0; } DUK_EXTERNAL duk_bool_t duk_is_constructable(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; DUK_ASSERT_API_ENTRY(thr); tv = duk_get_tval_or_unused(thr, idx); if (DUK_TVAL_IS_OBJECT(tv)) { duk_hobject *h; h = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h != NULL); return DUK_HOBJECT_HAS_CONSTRUCTABLE(h) ? 1 : 0; } if (DUK_TVAL_IS_LIGHTFUNC(tv)) { return 1; } return 0; } DUK_EXTERNAL duk_bool_t duk_is_c_function(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); return duk__obj_flag_any_default_false(thr, idx, DUK_HOBJECT_FLAG_NATFUNC); } DUK_EXTERNAL duk_bool_t duk_is_ecmascript_function(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); return duk__obj_flag_any_default_false(thr, idx, DUK_HOBJECT_FLAG_COMPFUNC); } DUK_EXTERNAL duk_bool_t duk_is_bound_function(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); return duk__obj_flag_any_default_false(thr, idx, DUK_HOBJECT_FLAG_BOUNDFUNC); } DUK_EXTERNAL duk_bool_t duk_is_thread(duk_hthread *thr, duk_idx_t idx) { duk_hobject *obj; DUK_ASSERT_API_ENTRY(thr); obj = duk_get_hobject(thr, idx); if (obj) { return (DUK_HOBJECT_GET_CLASS_NUMBER(obj) == DUK_HOBJECT_CLASS_THREAD ? 1 : 0); } return 0; } DUK_EXTERNAL duk_bool_t duk_is_fixed_buffer(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; DUK_ASSERT_API_ENTRY(thr); tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); if (DUK_TVAL_IS_BUFFER(tv)) { duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv); DUK_ASSERT(h != NULL); return (DUK_HBUFFER_HAS_DYNAMIC(h) ? 0 : 1); } return 0; } DUK_EXTERNAL duk_bool_t duk_is_dynamic_buffer(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; DUK_ASSERT_API_ENTRY(thr); tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); if (DUK_TVAL_IS_BUFFER(tv)) { duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv); DUK_ASSERT(h != NULL); return (DUK_HBUFFER_HAS_DYNAMIC(h) && !DUK_HBUFFER_HAS_EXTERNAL(h) ? 1 : 0); } return 0; } DUK_EXTERNAL duk_bool_t duk_is_external_buffer(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; DUK_ASSERT_API_ENTRY(thr); tv = duk_get_tval_or_unused(thr, idx); DUK_ASSERT(tv != NULL); if (DUK_TVAL_IS_BUFFER(tv)) { duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv); DUK_ASSERT(h != NULL); return (DUK_HBUFFER_HAS_DYNAMIC(h) && DUK_HBUFFER_HAS_EXTERNAL(h) ? 1 : 0); } return 0; } DUK_EXTERNAL duk_errcode_t duk_get_error_code(duk_hthread *thr, duk_idx_t idx) { duk_hobject *h; duk_uint_t sanity; DUK_ASSERT_API_ENTRY(thr); h = duk_get_hobject(thr, idx); sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY; do { if (!h) { return DUK_ERR_NONE; } /* XXX: something more convenient? */ if (h == thr->builtins[DUK_BIDX_EVAL_ERROR_PROTOTYPE]) { return DUK_ERR_EVAL_ERROR; } if (h == thr->builtins[DUK_BIDX_RANGE_ERROR_PROTOTYPE]) { return DUK_ERR_RANGE_ERROR; } if (h == thr->builtins[DUK_BIDX_REFERENCE_ERROR_PROTOTYPE]) { return DUK_ERR_REFERENCE_ERROR; } if (h == thr->builtins[DUK_BIDX_SYNTAX_ERROR_PROTOTYPE]) { return DUK_ERR_SYNTAX_ERROR; } if (h == thr->builtins[DUK_BIDX_TYPE_ERROR_PROTOTYPE]) { return DUK_ERR_TYPE_ERROR; } if (h == thr->builtins[DUK_BIDX_URI_ERROR_PROTOTYPE]) { return DUK_ERR_URI_ERROR; } if (h == thr->builtins[DUK_BIDX_ERROR_PROTOTYPE]) { return DUK_ERR_ERROR; } h = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h); } while (--sanity > 0); return DUK_ERR_NONE; } /* * Pushers */ DUK_INTERNAL void duk_push_tval(duk_hthread *thr, duk_tval *tv) { duk_tval *tv_slot; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(tv != NULL); DUK__CHECK_SPACE(); tv_slot = thr->valstack_top++; DUK_TVAL_SET_TVAL(tv_slot, tv); DUK_TVAL_INCREF(thr, tv); /* no side effects */ } DUK_EXTERNAL void duk_push_undefined(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); DUK__CHECK_SPACE(); /* Because value stack init policy is 'undefined above top', * we don't need to write, just assert. */ thr->valstack_top++; DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top - 1)); } DUK_EXTERNAL void duk_push_null(duk_hthread *thr) { duk_tval *tv_slot; DUK_ASSERT_API_ENTRY(thr); DUK__CHECK_SPACE(); tv_slot = thr->valstack_top++; DUK_TVAL_SET_NULL(tv_slot); } DUK_EXTERNAL void duk_push_boolean(duk_hthread *thr, duk_bool_t val) { duk_tval *tv_slot; duk_small_int_t b; DUK_ASSERT_API_ENTRY(thr); DUK__CHECK_SPACE(); b = (val ? 1 : 0); /* ensure value is 1 or 0 (not other non-zero) */ tv_slot = thr->valstack_top++; DUK_TVAL_SET_BOOLEAN(tv_slot, b); } DUK_EXTERNAL void duk_push_true(duk_hthread *thr) { duk_tval *tv_slot; DUK_ASSERT_API_ENTRY(thr); DUK__CHECK_SPACE(); tv_slot = thr->valstack_top++; DUK_TVAL_SET_BOOLEAN_TRUE(tv_slot); } DUK_EXTERNAL void duk_push_false(duk_hthread *thr) { duk_tval *tv_slot; DUK_ASSERT_API_ENTRY(thr); DUK__CHECK_SPACE(); tv_slot = thr->valstack_top++; DUK_TVAL_SET_BOOLEAN_FALSE(tv_slot); } /* normalize NaN which may not match our canonical internal NaN */ DUK_EXTERNAL void duk_push_number(duk_hthread *thr, duk_double_t val) { duk_tval *tv_slot; duk_double_union du; DUK_ASSERT_API_ENTRY(thr); DUK__CHECK_SPACE(); du.d = val; DUK_DBLUNION_NORMALIZE_NAN_CHECK(&du); tv_slot = thr->valstack_top++; DUK_TVAL_SET_NUMBER(tv_slot, du.d); } DUK_EXTERNAL void duk_push_int(duk_hthread *thr, duk_int_t val) { #if defined(DUK_USE_FASTINT) duk_tval *tv_slot; DUK_ASSERT_API_ENTRY(thr); DUK__CHECK_SPACE(); tv_slot = thr->valstack_top++; #if DUK_INT_MAX <= 0x7fffffffL DUK_TVAL_SET_I32(tv_slot, (duk_int32_t) val); #else if (val >= DUK_FASTINT_MIN && val <= DUK_FASTINT_MAX) { DUK_TVAL_SET_FASTINT(tv_slot, (duk_int64_t) val); } else { duk_double_t = (duk_double_t) val; DUK_TVAL_SET_NUMBER(tv_slot, d); } #endif #else /* DUK_USE_FASTINT */ duk_tval *tv_slot; duk_double_t d; DUK_ASSERT_API_ENTRY(thr); DUK__CHECK_SPACE(); d = (duk_double_t) val; tv_slot = thr->valstack_top++; DUK_TVAL_SET_NUMBER(tv_slot, d); #endif /* DUK_USE_FASTINT */ } DUK_EXTERNAL void duk_push_uint(duk_hthread *thr, duk_uint_t val) { #if defined(DUK_USE_FASTINT) duk_tval *tv_slot; DUK_ASSERT_API_ENTRY(thr); DUK__CHECK_SPACE(); tv_slot = thr->valstack_top++; #if DUK_UINT_MAX <= 0xffffffffUL DUK_TVAL_SET_U32(tv_slot, (duk_uint32_t) val); #else if (val <= DUK_FASTINT_MAX) { /* val is unsigned so >= 0 */ /* XXX: take advantage of val being unsigned, no need to mask */ DUK_TVAL_SET_FASTINT(tv_slot, (duk_int64_t) val); } else { duk_double_t = (duk_double_t) val; DUK_TVAL_SET_NUMBER(tv_slot, d); } #endif #else /* DUK_USE_FASTINT */ duk_tval *tv_slot; duk_double_t d; DUK_ASSERT_API_ENTRY(thr); DUK__CHECK_SPACE(); d = (duk_double_t) val; tv_slot = thr->valstack_top++; DUK_TVAL_SET_NUMBER(tv_slot, d); #endif /* DUK_USE_FASTINT */ } DUK_EXTERNAL void duk_push_nan(duk_hthread *thr) { duk_tval *tv_slot; duk_double_union du; DUK_ASSERT_API_ENTRY(thr); DUK__CHECK_SPACE(); DUK_DBLUNION_SET_NAN(&du); DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du)); tv_slot = thr->valstack_top++; DUK_TVAL_SET_NUMBER(tv_slot, du.d); } DUK_EXTERNAL const char *duk_push_lstring(duk_hthread *thr, const char *str, duk_size_t len) { duk_hstring *h; duk_tval *tv_slot; DUK_ASSERT_API_ENTRY(thr); /* check stack before interning (avoid hanging temp) */ DUK__CHECK_SPACE(); /* NULL with zero length represents an empty string; NULL with higher * length is also now trated like an empty string although it is * a bit dubious. This is unlike duk_push_string() which pushes a * 'null' if the input string is a NULL. */ if (!str) { len = 0; } /* Check for maximum string length */ if (DUK_UNLIKELY(len > DUK_HSTRING_MAX_BYTELEN)) { DUK_ERROR_RANGE(thr, DUK_STR_STRING_TOO_LONG); } h = duk_heap_strtable_intern_checked(thr, (const duk_uint8_t *) str, (duk_uint32_t) len); DUK_ASSERT(h != NULL); tv_slot = thr->valstack_top++; DUK_TVAL_SET_STRING(tv_slot, h); DUK_HSTRING_INCREF(thr, h); /* no side effects */ return (const char *) DUK_HSTRING_GET_DATA(h); } DUK_EXTERNAL const char *duk_push_string(duk_hthread *thr, const char *str) { DUK_ASSERT_API_ENTRY(thr); if (str) { return duk_push_lstring(thr, str, DUK_STRLEN(str)); } else { duk_push_null(thr); return NULL; } } DUK_EXTERNAL void duk_push_pointer(duk_hthread *thr, void *val) { duk_tval *tv_slot; DUK_ASSERT_API_ENTRY(thr); DUK__CHECK_SPACE(); tv_slot = thr->valstack_top++; DUK_TVAL_SET_POINTER(tv_slot, val); } DUK_INTERNAL duk_hstring *duk_push_uint_to_hstring(duk_hthread *thr, duk_uint_t i) { duk_hstring *h_tmp; DUK_ASSERT_API_ENTRY(thr); /* XXX: this could be a direct DUK_SPRINTF to a buffer followed by duk_push_string() */ duk_push_uint(thr, (duk_uint_t) i); h_tmp = duk_to_hstring_m1(thr); DUK_ASSERT(h_tmp != NULL); return h_tmp; } DUK_LOCAL void duk__push_this_helper(duk_hthread *thr, duk_small_uint_t check_object_coercible) { duk_tval *tv_slot; DUK__CHECK_SPACE(); DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top)); /* because of valstack init policy */ tv_slot = thr->valstack_top++; if (DUK_UNLIKELY(thr->callstack_curr == NULL)) { if (check_object_coercible) { goto type_error; } /* 'undefined' already on stack top */ } else { duk_tval *tv; /* 'this' binding is just before current activation's bottom */ DUK_ASSERT(thr->valstack_bottom > thr->valstack); tv = thr->valstack_bottom - 1; if (check_object_coercible && (DUK_TVAL_IS_UNDEFINED(tv) || DUK_TVAL_IS_NULL(tv))) { /* XXX: better macro for DUK_TVAL_IS_UNDEFINED_OR_NULL(tv) */ goto type_error; } DUK_TVAL_SET_TVAL(tv_slot, tv); DUK_TVAL_INCREF(thr, tv); } return; type_error: DUK_ERROR_TYPE(thr, DUK_STR_NOT_OBJECT_COERCIBLE); } DUK_EXTERNAL void duk_push_this(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); duk__push_this_helper(thr, 0 /*check_object_coercible*/); } DUK_INTERNAL void duk_push_this_check_object_coercible(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); duk__push_this_helper(thr, 1 /*check_object_coercible*/); } DUK_INTERNAL duk_hobject *duk_push_this_coercible_to_object(duk_hthread *thr) { duk_hobject *h; DUK_ASSERT_API_ENTRY(thr); duk__push_this_helper(thr, 1 /*check_object_coercible*/); h = duk_to_hobject(thr, -1); DUK_ASSERT(h != NULL); return h; } DUK_INTERNAL duk_hstring *duk_push_this_coercible_to_string(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); duk__push_this_helper(thr, 1 /*check_object_coercible*/); return duk_to_hstring_m1(thr); /* This will reject all Symbol values; accepts Symbol objects. */ } DUK_INTERNAL duk_tval *duk_get_borrowed_this_tval(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(thr->callstack_top > 0); /* caller required to know */ DUK_ASSERT(thr->callstack_curr != NULL); /* caller required to know */ DUK_ASSERT(thr->valstack_bottom > thr->valstack); /* consequence of above */ DUK_ASSERT(thr->valstack_bottom - 1 >= thr->valstack); /* 'this' binding exists */ return thr->valstack_bottom - 1; } DUK_EXTERNAL void duk_push_current_function(duk_hthread *thr) { duk_activation *act; DUK_ASSERT_API_ENTRY(thr); act = thr->callstack_curr; if (act != NULL) { duk_push_tval(thr, &act->tv_func); } else { duk_push_undefined(thr); } } DUK_EXTERNAL void duk_push_current_thread(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); if (thr->heap->curr_thread) { duk_push_hobject(thr, (duk_hobject *) thr->heap->curr_thread); } else { duk_push_undefined(thr); } } DUK_EXTERNAL void duk_push_global_object(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); duk_push_hobject_bidx(thr, DUK_BIDX_GLOBAL); } /* XXX: size optimize */ DUK_LOCAL void duk__push_stash(duk_hthread *thr) { if (!duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VALUE)) { DUK_DDD(DUK_DDDPRINT("creating heap/global/thread stash on first use")); duk_pop_unsafe(thr); duk_push_bare_object(thr); duk_dup_top(thr); duk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_C); /* [ ... parent stash stash ] -> [ ... parent stash ] */ } duk_remove_m2(thr); } DUK_EXTERNAL void duk_push_heap_stash(duk_hthread *thr) { duk_heap *heap; DUK_ASSERT_API_ENTRY(thr); heap = thr->heap; DUK_ASSERT(heap->heap_object != NULL); duk_push_hobject(thr, heap->heap_object); duk__push_stash(thr); } DUK_EXTERNAL void duk_push_global_stash(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); duk_push_global_object(thr); duk__push_stash(thr); } DUK_EXTERNAL void duk_push_thread_stash(duk_hthread *thr, duk_hthread *target_thr) { DUK_ASSERT_API_ENTRY(thr); if (DUK_UNLIKELY(target_thr == NULL)) { DUK_ERROR_TYPE_INVALID_ARGS(thr); return; /* not reached */ } duk_push_hobject(thr, (duk_hobject *) target_thr); duk__push_stash(thr); } /* XXX: duk_ssize_t would be useful here */ DUK_LOCAL duk_int_t duk__try_push_vsprintf(duk_hthread *thr, void *buf, duk_size_t sz, const char *fmt, va_list ap) { duk_int_t len; DUK_ASSERT_CTX_VALID(thr); DUK_UNREF(thr); /* NUL terminator handling doesn't matter here */ len = DUK_VSNPRINTF((char *) buf, sz, fmt, ap); if (len < (duk_int_t) sz) { /* Return value of 'sz' or more indicates output was (potentially) * truncated. */ return (duk_int_t) len; } return -1; } DUK_EXTERNAL const char *duk_push_vsprintf(duk_hthread *thr, const char *fmt, va_list ap) { duk_uint8_t stack_buf[DUK_PUSH_SPRINTF_INITIAL_SIZE]; duk_size_t sz = DUK_PUSH_SPRINTF_INITIAL_SIZE; duk_bool_t pushed_buf = 0; void *buf; duk_int_t len; /* XXX: duk_ssize_t */ const char *res; DUK_ASSERT_API_ENTRY(thr); /* special handling of fmt==NULL */ if (!fmt) { duk_hstring *h_str; duk_push_hstring_empty(thr); h_str = duk_known_hstring(thr, -1); return (const char *) DUK_HSTRING_GET_DATA(h_str); } /* initial estimate based on format string */ sz = DUK_STRLEN(fmt) + 16; /* format plus something to avoid just missing */ if (sz < DUK_PUSH_SPRINTF_INITIAL_SIZE) { sz = DUK_PUSH_SPRINTF_INITIAL_SIZE; } DUK_ASSERT(sz > 0); /* Try to make do with a stack buffer to avoid allocating a temporary buffer. * This works 99% of the time which is quite nice. */ for (;;) { va_list ap_copy; /* copied so that 'ap' can be reused */ if (sz <= sizeof(stack_buf)) { buf = stack_buf; } else if (!pushed_buf) { pushed_buf = 1; buf = duk_push_dynamic_buffer(thr, sz); } else { buf = duk_resize_buffer(thr, -1, sz); } DUK_ASSERT(buf != NULL); DUK_VA_COPY(ap_copy, ap); len = duk__try_push_vsprintf(thr, buf, sz, fmt, ap_copy); va_end(ap_copy); if (len >= 0) { break; } /* failed, resize and try again */ sz = sz * 2; if (DUK_UNLIKELY(sz >= DUK_PUSH_SPRINTF_SANITY_LIMIT)) { DUK_ERROR_RANGE(thr, DUK_STR_RESULT_TOO_LONG); } } /* Cannot use duk_buffer_to_string() on the buffer because it is * usually larger than 'len'; 'buf' is also usually a stack buffer. */ res = duk_push_lstring(thr, (const char *) buf, (duk_size_t) len); /* [ buf? res ] */ if (pushed_buf) { duk_remove_m2(thr); } return res; } DUK_EXTERNAL const char *duk_push_sprintf(duk_hthread *thr, const char *fmt, ...) { va_list ap; const char *ret; DUK_ASSERT_API_ENTRY(thr); /* allow fmt==NULL */ va_start(ap, fmt); ret = duk_push_vsprintf(thr, fmt, ap); va_end(ap); return ret; } DUK_INTERNAL duk_hobject *duk_push_object_helper(duk_hthread *thr, duk_uint_t hobject_flags_and_class, duk_small_int_t prototype_bidx) { duk_tval *tv_slot; duk_hobject *h; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(prototype_bidx == -1 || (prototype_bidx >= 0 && prototype_bidx < DUK_NUM_BUILTINS)); DUK__CHECK_SPACE(); h = duk_hobject_alloc(thr, hobject_flags_and_class); DUK_ASSERT(h != NULL); DUK_DDD(DUK_DDDPRINT("created object with flags: 0x%08lx", (unsigned long) h->hdr.h_flags)); tv_slot = thr->valstack_top; DUK_TVAL_SET_OBJECT(tv_slot, h); DUK_HOBJECT_INCREF(thr, h); /* no side effects */ thr->valstack_top++; /* object is now reachable */ if (prototype_bidx >= 0) { DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, h, thr->builtins[prototype_bidx]); } else { DUK_ASSERT(prototype_bidx == -1); DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h) == NULL); } return h; } DUK_INTERNAL duk_hobject *duk_push_object_helper_proto(duk_hthread *thr, duk_uint_t hobject_flags_and_class, duk_hobject *proto) { duk_hobject *h; DUK_ASSERT_API_ENTRY(thr); h = duk_push_object_helper(thr, hobject_flags_and_class, -1); DUK_ASSERT(h != NULL); DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, h, proto); return h; } DUK_EXTERNAL duk_idx_t duk_push_object(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); (void) duk_push_object_helper(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_FASTREFS | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT), DUK_BIDX_OBJECT_PROTOTYPE); return duk_get_top_index_unsafe(thr); } DUK_EXTERNAL duk_idx_t duk_push_array(duk_hthread *thr) { duk_uint_t flags; duk_harray *obj; duk_idx_t ret; duk_tval *tv_slot; DUK_ASSERT_API_ENTRY(thr); flags = DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_FASTREFS | DUK_HOBJECT_FLAG_ARRAY_PART | DUK_HOBJECT_FLAG_EXOTIC_ARRAY | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ARRAY); obj = duk_harray_alloc(thr, flags); DUK_ASSERT(obj != NULL); DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) obj, thr->builtins[DUK_BIDX_ARRAY_PROTOTYPE]); tv_slot = thr->valstack_top; DUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) obj); DUK_HOBJECT_INCREF(thr, obj); /* XXX: could preallocate with refcount = 1 */ ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom); thr->valstack_top++; DUK_ASSERT(obj->length == 0); /* Array .length starts at zero. */ return ret; } DUK_INTERNAL duk_harray *duk_push_harray(duk_hthread *thr) { /* XXX: API call could do this directly, cast to void in API macro. */ duk_harray *a; DUK_ASSERT_API_ENTRY(thr); (void) duk_push_array(thr); DUK_ASSERT(DUK_TVAL_IS_OBJECT(thr->valstack_top - 1)); a = (duk_harray *) DUK_TVAL_GET_OBJECT(thr->valstack_top - 1); DUK_ASSERT(a != NULL); return a; } /* Push a duk_harray with preallocated size (.length also set to match size). * Caller may then populate array part of the duk_harray directly. */ DUK_INTERNAL duk_harray *duk_push_harray_with_size(duk_hthread *thr, duk_uint32_t size) { duk_harray *a; DUK_ASSERT_API_ENTRY(thr); a = duk_push_harray(thr); duk_hobject_realloc_props(thr, (duk_hobject *) a, 0, size, 0, 0); a->length = size; return a; } DUK_INTERNAL duk_tval *duk_push_harray_with_size_outptr(duk_hthread *thr, duk_uint32_t size) { duk_harray *a; DUK_ASSERT_API_ENTRY(thr); a = duk_push_harray_with_size(thr, size); DUK_ASSERT(a != NULL); return DUK_HOBJECT_A_GET_BASE(thr->heap, (duk_hobject *) a); } DUK_EXTERNAL duk_idx_t duk_push_thread_raw(duk_hthread *thr, duk_uint_t flags) { duk_hthread *obj; duk_idx_t ret; duk_tval *tv_slot; DUK_ASSERT_API_ENTRY(thr); DUK__CHECK_SPACE(); obj = duk_hthread_alloc(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_THREAD)); DUK_ASSERT(obj != NULL); obj->state = DUK_HTHREAD_STATE_INACTIVE; #if defined(DUK_USE_ROM_STRINGS) /* Nothing to initialize, strs[] is in ROM. */ #else #if defined(DUK_USE_HEAPPTR16) obj->strs16 = thr->strs16; #else obj->strs = thr->strs; #endif #endif DUK_DDD(DUK_DDDPRINT("created thread object with flags: 0x%08lx", (unsigned long) obj->obj.hdr.h_flags)); /* make the new thread reachable */ tv_slot = thr->valstack_top; DUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) obj); DUK_HTHREAD_INCREF(thr, obj); ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom); thr->valstack_top++; /* important to do this *after* pushing, to make the thread reachable for gc */ if (DUK_UNLIKELY(!duk_hthread_init_stacks(thr->heap, obj))) { DUK_ERROR_ALLOC_FAILED(thr); } /* initialize built-ins - either by copying or creating new ones */ if (flags & DUK_THREAD_NEW_GLOBAL_ENV) { duk_hthread_create_builtin_objects(obj); } else { duk_hthread_copy_builtin_objects(thr, obj); } /* default prototype */ DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) obj, obj->builtins[DUK_BIDX_THREAD_PROTOTYPE]); /* Initial stack size satisfies the stack slack constraints so there * is no need to require stack here. */ DUK_ASSERT(DUK_VALSTACK_INITIAL_SIZE >= DUK_VALSTACK_API_ENTRY_MINIMUM + DUK_VALSTACK_INTERNAL_EXTRA); return ret; } DUK_INTERNAL duk_hcompfunc *duk_push_hcompfunc(duk_hthread *thr) { duk_hcompfunc *obj; duk_tval *tv_slot; DUK_ASSERT_API_ENTRY(thr); DUK__CHECK_SPACE(); /* Template functions are not strictly constructable (they don't * have a "prototype" property for instance), so leave the * DUK_HOBJECT_FLAG_CONSRUCTABLE flag cleared here. */ obj = duk_hcompfunc_alloc(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_CALLABLE | DUK_HOBJECT_FLAG_COMPFUNC | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION)); if (DUK_UNLIKELY(obj == NULL)) { DUK_ERROR_ALLOC_FAILED(thr); } DUK_DDD(DUK_DDDPRINT("created compiled function object with flags: 0x%08lx", (unsigned long) obj->obj.hdr.h_flags)); tv_slot = thr->valstack_top; DUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) obj); DUK_HOBJECT_INCREF(thr, obj); thr->valstack_top++; /* default prototype */ DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) obj) == NULL); DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) obj, thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]); return obj; } DUK_INTERNAL duk_hboundfunc *duk_push_hboundfunc(duk_hthread *thr) { duk_hboundfunc *obj; duk_tval *tv_slot; DUK_ASSERT_API_ENTRY(thr); DUK__CHECK_SPACE(); obj = duk_hboundfunc_alloc(thr->heap, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_BOUNDFUNC | DUK_HOBJECT_FLAG_CONSTRUCTABLE | DUK_HOBJECT_FLAG_CALLABLE | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION)); if (!obj) { DUK_ERROR_ALLOC_FAILED(thr); } tv_slot = thr->valstack_top++; DUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) obj); DUK_HOBJECT_INCREF(thr, obj); /* Prototype is left as NULL because the caller always sets it (and * it depends on the target function). */ DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) obj) == NULL); return obj; } DUK_LOCAL duk_idx_t duk__push_c_function_raw(duk_hthread *thr, duk_c_function func, duk_idx_t nargs, duk_uint_t flags, duk_small_uint_t proto_bidx) { duk_hnatfunc *obj; duk_idx_t ret; duk_tval *tv_slot; duk_int16_t func_nargs; DUK_ASSERT_CTX_VALID(thr); DUK__CHECK_SPACE(); if (DUK_UNLIKELY(func == NULL)) { goto api_error; } if (nargs >= 0 && nargs < DUK_HNATFUNC_NARGS_MAX) { func_nargs = (duk_int16_t) nargs; } else if (nargs == DUK_VARARGS) { func_nargs = DUK_HNATFUNC_NARGS_VARARGS; } else { goto api_error; } obj = duk_hnatfunc_alloc(thr, flags); DUK_ASSERT(obj != NULL); obj->func = func; obj->nargs = func_nargs; DUK_DDD(DUK_DDDPRINT("created native function object with flags: 0x%08lx, nargs=%ld", (unsigned long) obj->obj.hdr.h_flags, (long) obj->nargs)); tv_slot = thr->valstack_top; DUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) obj); DUK_HOBJECT_INCREF(thr, obj); ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom); thr->valstack_top++; DUK_ASSERT_BIDX_VALID(proto_bidx); DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) obj, thr->builtins[proto_bidx]); return ret; api_error: DUK_ERROR_TYPE_INVALID_ARGS(thr); return 0; /* not reached */ } DUK_EXTERNAL duk_idx_t duk_push_c_function(duk_hthread *thr, duk_c_function func, duk_int_t nargs) { duk_uint_t flags; DUK_ASSERT_API_ENTRY(thr); flags = DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_CONSTRUCTABLE | DUK_HOBJECT_FLAG_CALLABLE | DUK_HOBJECT_FLAG_FASTREFS | DUK_HOBJECT_FLAG_NATFUNC | DUK_HOBJECT_FLAG_NEWENV | DUK_HOBJECT_FLAG_STRICT | DUK_HOBJECT_FLAG_NOTAIL | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION); /* Default prototype is a Duktape specific %NativeFunctionPrototype% * which provides .length and .name getters. */ return duk__push_c_function_raw(thr, func, nargs, flags, DUK_BIDX_NATIVE_FUNCTION_PROTOTYPE); } DUK_INTERNAL void duk_push_c_function_builtin(duk_hthread *thr, duk_c_function func, duk_int_t nargs) { duk_uint_t flags; DUK_ASSERT_API_ENTRY(thr); flags = DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_CONSTRUCTABLE | DUK_HOBJECT_FLAG_CALLABLE | DUK_HOBJECT_FLAG_FASTREFS | DUK_HOBJECT_FLAG_NATFUNC | DUK_HOBJECT_FLAG_NEWENV | DUK_HOBJECT_FLAG_STRICT | DUK_HOBJECT_FLAG_NOTAIL | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION); /* Must use Function.prototype for standard built-in functions. */ (void) duk__push_c_function_raw(thr, func, nargs, flags, DUK_BIDX_FUNCTION_PROTOTYPE); } DUK_INTERNAL void duk_push_c_function_builtin_noconstruct(duk_hthread *thr, duk_c_function func, duk_int_t nargs) { duk_uint_t flags; DUK_ASSERT_API_ENTRY(thr); flags = DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_CALLABLE | DUK_HOBJECT_FLAG_FASTREFS | DUK_HOBJECT_FLAG_NATFUNC | DUK_HOBJECT_FLAG_NEWENV | DUK_HOBJECT_FLAG_STRICT | DUK_HOBJECT_FLAG_NOTAIL | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION); /* Must use Function.prototype for standard built-in functions. */ (void) duk__push_c_function_raw(thr, func, nargs, flags, DUK_BIDX_FUNCTION_PROTOTYPE); } DUK_EXTERNAL duk_idx_t duk_push_c_lightfunc(duk_hthread *thr, duk_c_function func, duk_idx_t nargs, duk_idx_t length, duk_int_t magic) { duk_small_uint_t lf_flags; duk_tval *tv_slot; DUK_ASSERT_API_ENTRY(thr); DUK__CHECK_SPACE(); if (nargs >= DUK_LFUNC_NARGS_MIN && nargs <= DUK_LFUNC_NARGS_MAX) { /* as is */ } else if (nargs == DUK_VARARGS) { nargs = DUK_LFUNC_NARGS_VARARGS; } else { goto api_error; } if (DUK_UNLIKELY(!(length >= DUK_LFUNC_LENGTH_MIN && length <= DUK_LFUNC_LENGTH_MAX))) { goto api_error; } if (DUK_UNLIKELY(!(magic >= DUK_LFUNC_MAGIC_MIN && magic <= DUK_LFUNC_MAGIC_MAX))) { goto api_error; } lf_flags = DUK_LFUNC_FLAGS_PACK((duk_small_int_t) magic, (duk_small_uint_t) length, (duk_small_uint_t) nargs); tv_slot = thr->valstack_top++; DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv_slot)); DUK_TVAL_SET_LIGHTFUNC(tv_slot, func, lf_flags); DUK_ASSERT(tv_slot >= thr->valstack_bottom); return (duk_idx_t) (tv_slot - thr->valstack_bottom); api_error: DUK_ERROR_TYPE_INVALID_ARGS(thr); return 0; /* not reached */ } #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_INTERNAL duk_hbufobj *duk_push_bufobj_raw(duk_hthread *thr, duk_uint_t hobject_flags_and_class, duk_small_int_t prototype_bidx) { duk_hbufobj *obj; duk_tval *tv_slot; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(prototype_bidx >= 0); DUK__CHECK_SPACE(); obj = duk_hbufobj_alloc(thr, hobject_flags_and_class); DUK_ASSERT(obj != NULL); DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) obj, thr->builtins[prototype_bidx]); DUK_ASSERT_HBUFOBJ_VALID(obj); tv_slot = thr->valstack_top; DUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) obj); DUK_HOBJECT_INCREF(thr, obj); thr->valstack_top++; return obj; } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ /* XXX: There's quite a bit of overlap with buffer creation handling in * duk_bi_buffer.c. Look for overlap and refactor. */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) #define DUK__PACK_ARGS(classnum,protobidx,elemtype,elemshift,istypedarray) \ (((classnum) << 24) | ((protobidx) << 16) | ((elemtype) << 8) | ((elemshift) << 4) | (istypedarray)) static const duk_uint32_t duk__bufobj_flags_lookup[] = { /* Node.js Buffers are Uint8Array instances which inherit from Buffer.prototype. */ DUK__PACK_ARGS(DUK_HOBJECT_CLASS_ARRAYBUFFER, DUK_BIDX_ARRAYBUFFER_PROTOTYPE, DUK_HBUFOBJ_ELEM_UINT8, 0, 0), /* DUK_BUFOBJ_ARRAYBUFFER */ DUK__PACK_ARGS(DUK_HOBJECT_CLASS_UINT8ARRAY, DUK_BIDX_NODEJS_BUFFER_PROTOTYPE, DUK_HBUFOBJ_ELEM_UINT8, 0, 1), /* DUK_BUFOBJ_NODEJS_BUFFER */ DUK__PACK_ARGS(DUK_HOBJECT_CLASS_DATAVIEW, DUK_BIDX_DATAVIEW_PROTOTYPE, DUK_HBUFOBJ_ELEM_UINT8, 0, 0), /* DUK_BUFOBJ_DATAVIEW */ DUK__PACK_ARGS(DUK_HOBJECT_CLASS_INT8ARRAY, DUK_BIDX_INT8ARRAY_PROTOTYPE, DUK_HBUFOBJ_ELEM_INT8, 0, 1), /* DUK_BUFOBJ_INT8ARRAY */ DUK__PACK_ARGS(DUK_HOBJECT_CLASS_UINT8ARRAY, DUK_BIDX_UINT8ARRAY_PROTOTYPE, DUK_HBUFOBJ_ELEM_UINT8, 0, 1), /* DUK_BUFOBJ_UINT8ARRAY */ DUK__PACK_ARGS(DUK_HOBJECT_CLASS_UINT8CLAMPEDARRAY, DUK_BIDX_UINT8CLAMPEDARRAY_PROTOTYPE, DUK_HBUFOBJ_ELEM_UINT8CLAMPED, 0, 1), /* DUK_BUFOBJ_UINT8CLAMPEDARRAY */ DUK__PACK_ARGS(DUK_HOBJECT_CLASS_INT16ARRAY, DUK_BIDX_INT16ARRAY_PROTOTYPE, DUK_HBUFOBJ_ELEM_INT16, 1, 1), /* DUK_BUFOBJ_INT16ARRAY */ DUK__PACK_ARGS(DUK_HOBJECT_CLASS_UINT16ARRAY, DUK_BIDX_UINT16ARRAY_PROTOTYPE, DUK_HBUFOBJ_ELEM_UINT16, 1, 1), /* DUK_BUFOBJ_UINT16ARRAY */ DUK__PACK_ARGS(DUK_HOBJECT_CLASS_INT32ARRAY, DUK_BIDX_INT32ARRAY_PROTOTYPE, DUK_HBUFOBJ_ELEM_INT32, 2, 1), /* DUK_BUFOBJ_INT32ARRAY */ DUK__PACK_ARGS(DUK_HOBJECT_CLASS_UINT32ARRAY, DUK_BIDX_UINT32ARRAY_PROTOTYPE, DUK_HBUFOBJ_ELEM_UINT32, 2, 1), /* DUK_BUFOBJ_UINT32ARRAY */ DUK__PACK_ARGS(DUK_HOBJECT_CLASS_FLOAT32ARRAY, DUK_BIDX_FLOAT32ARRAY_PROTOTYPE, DUK_HBUFOBJ_ELEM_FLOAT32, 2, 1), /* DUK_BUFOBJ_FLOAT32ARRAY */ DUK__PACK_ARGS(DUK_HOBJECT_CLASS_FLOAT64ARRAY, DUK_BIDX_FLOAT64ARRAY_PROTOTYPE, DUK_HBUFOBJ_ELEM_FLOAT64, 3, 1) /* DUK_BUFOBJ_FLOAT64ARRAY */ }; #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_EXTERNAL void duk_push_buffer_object(duk_hthread *thr, duk_idx_t idx_buffer, duk_size_t byte_offset, duk_size_t byte_length, duk_uint_t flags) { duk_hbufobj *h_bufobj; duk_hbuffer *h_val; duk_hobject *h_arraybuf; duk_uint32_t tmp; duk_uint_t classnum; duk_uint_t protobidx; duk_uint_t lookupidx; duk_uint_t uint_offset, uint_length, uint_added; DUK_ASSERT_API_ENTRY(thr); /* The underlying types for offset/length in duk_hbufobj is * duk_uint_t; make sure argument values fit. */ uint_offset = (duk_uint_t) byte_offset; uint_length = (duk_uint_t) byte_length; if (sizeof(duk_size_t) != sizeof(duk_uint_t)) { if (DUK_UNLIKELY((duk_size_t) uint_offset != byte_offset || (duk_size_t) uint_length != byte_length)) { goto range_error; } } DUK_ASSERT_DISABLE(flags >= 0); /* flags is unsigned */ lookupidx = flags; if (DUK_UNLIKELY(lookupidx >= sizeof(duk__bufobj_flags_lookup) / sizeof(duk_uint32_t))) { goto arg_error; } tmp = duk__bufobj_flags_lookup[lookupidx]; classnum = tmp >> 24; protobidx = (tmp >> 16) & 0xff; h_arraybuf = duk_get_hobject(thr, idx_buffer); if (h_arraybuf != NULL && /* argument is an object */ flags != DUK_BUFOBJ_ARRAYBUFFER && /* creating a view */ DUK_HOBJECT_GET_CLASS_NUMBER(h_arraybuf) == DUK_HOBJECT_CLASS_ARRAYBUFFER /* argument is ArrayBuffer */) { duk_uint_t tmp_offset; DUK_ASSERT_HBUFOBJ_VALID((duk_hbufobj *) h_arraybuf); h_val = ((duk_hbufobj *) h_arraybuf)->buf; if (DUK_UNLIKELY(h_val == NULL)) { goto arg_error; } tmp_offset = uint_offset + ((duk_hbufobj *) h_arraybuf)->offset; if (DUK_UNLIKELY(tmp_offset < uint_offset)) { goto range_error; } uint_offset = tmp_offset; /* Note intentional difference to new TypedArray(): we allow * caller to create an uncovered typed array (which is memory * safe); new TypedArray() rejects it. */ } else { /* Handle unexpected object arguments here too, for nice error * messages. */ h_arraybuf = NULL; h_val = duk_require_hbuffer(thr, idx_buffer); } /* Wrap check for offset+length. */ uint_added = uint_offset + uint_length; if (DUK_UNLIKELY(uint_added < uint_offset)) { goto range_error; } DUK_ASSERT(uint_added >= uint_offset && uint_added >= uint_length); DUK_ASSERT(h_val != NULL); h_bufobj = duk_push_bufobj_raw(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_BUFOBJ | DUK_HOBJECT_CLASS_AS_FLAGS(classnum), (duk_small_int_t) protobidx); DUK_ASSERT(h_bufobj != NULL); h_bufobj->buf = h_val; DUK_HBUFFER_INCREF(thr, h_val); h_bufobj->buf_prop = h_arraybuf; DUK_HOBJECT_INCREF_ALLOWNULL(thr, h_arraybuf); h_bufobj->offset = uint_offset; h_bufobj->length = uint_length; h_bufobj->shift = (tmp >> 4) & 0x0f; h_bufobj->elem_type = (tmp >> 8) & 0xff; h_bufobj->is_typedarray = tmp & 0x0f; DUK_ASSERT_HBUFOBJ_VALID(h_bufobj); /* TypedArray views need an automatic ArrayBuffer which must be * provided as .buffer property of the view. The ArrayBuffer is * referenced via duk_hbufobj->buf_prop and an inherited .buffer * accessor returns it. The ArrayBuffer is created lazily on first * access if necessary so we don't need to do anything more here. */ return; range_error: DUK_ERROR_RANGE(thr, DUK_STR_INVALID_ARGS); return; /* not reached */ arg_error: DUK_ERROR_TYPE(thr, DUK_STR_INVALID_ARGS); return; /* not reached */ } #else /* DUK_USE_BUFFEROBJECT_SUPPORT */ DUK_EXTERNAL void duk_push_buffer_object(duk_hthread *thr, duk_idx_t idx_buffer, duk_size_t byte_offset, duk_size_t byte_length, duk_uint_t flags) { DUK_ASSERT_API_ENTRY(thr); DUK_UNREF(idx_buffer); DUK_UNREF(byte_offset); DUK_UNREF(byte_length); DUK_UNREF(flags); DUK_ERROR_UNSUPPORTED(thr); } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ DUK_EXTERNAL duk_idx_t duk_push_error_object_va_raw(duk_hthread *thr, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, va_list ap) { duk_hobject *proto; #if defined(DUK_USE_AUGMENT_ERROR_CREATE) duk_small_uint_t augment_flags; #endif DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(thr != NULL); DUK_UNREF(filename); DUK_UNREF(line); /* Error code also packs a tracedata related flag. */ #if defined(DUK_USE_AUGMENT_ERROR_CREATE) augment_flags = 0; if (err_code & DUK_ERRCODE_FLAG_NOBLAME_FILELINE) { augment_flags = DUK_AUGMENT_FLAG_NOBLAME_FILELINE; } #endif err_code = err_code & (~DUK_ERRCODE_FLAG_NOBLAME_FILELINE); /* error gets its 'name' from the prototype */ proto = duk_error_prototype_from_code(thr, err_code); (void) duk_push_object_helper_proto(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_FASTREFS | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ERROR), proto); /* ... and its 'message' from an instance property */ if (fmt) { duk_push_vsprintf(thr, fmt, ap); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_MESSAGE, DUK_PROPDESC_FLAGS_WC); } else { /* If no explicit message given, put error code into message field * (as a number). This is not fully in keeping with the Ecmascript * error model because messages are supposed to be strings (Error * constructors use ToString() on their argument). However, it's * probably more useful than having a separate 'code' property. */ duk_push_int(thr, err_code); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_MESSAGE, DUK_PROPDESC_FLAGS_WC); } /* XXX: .code = err_code disabled, not sure if useful */ /* Creation time error augmentation */ #if defined(DUK_USE_AUGMENT_ERROR_CREATE) /* filename may be NULL in which case file/line is not recorded */ duk_err_augment_error_create(thr, thr, filename, line, augment_flags); /* may throw an error */ #endif return duk_get_top_index_unsafe(thr); } DUK_EXTERNAL duk_idx_t duk_push_error_object_raw(duk_hthread *thr, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, ...) { va_list ap; duk_idx_t ret; DUK_ASSERT_API_ENTRY(thr); va_start(ap, fmt); ret = duk_push_error_object_va_raw(thr, err_code, filename, line, fmt, ap); va_end(ap); return ret; } #if !defined(DUK_USE_VARIADIC_MACROS) DUK_EXTERNAL duk_idx_t duk_push_error_object_stash(duk_hthread *thr, duk_errcode_t err_code, const char *fmt, ...) { const char *filename = duk_api_global_filename; duk_int_t line = duk_api_global_line; va_list ap; duk_idx_t ret; DUK_ASSERT_API_ENTRY(thr); duk_api_global_filename = NULL; duk_api_global_line = 0; va_start(ap, fmt); ret = duk_push_error_object_va_raw(thr, err_code, filename, line, fmt, ap); va_end(ap); return ret; } #endif /* DUK_USE_VARIADIC_MACROS */ DUK_EXTERNAL void *duk_push_buffer_raw(duk_hthread *thr, duk_size_t size, duk_small_uint_t flags) { duk_tval *tv_slot; duk_hbuffer *h; void *buf_data; DUK_ASSERT_API_ENTRY(thr); DUK__CHECK_SPACE(); /* Check for maximum buffer length. */ if (DUK_UNLIKELY(size > DUK_HBUFFER_MAX_BYTELEN)) { DUK_ERROR_RANGE(thr, DUK_STR_BUFFER_TOO_LONG); } h = duk_hbuffer_alloc(thr->heap, size, flags, &buf_data); if (DUK_UNLIKELY(h == NULL)) { DUK_ERROR_ALLOC_FAILED(thr); } tv_slot = thr->valstack_top; DUK_TVAL_SET_BUFFER(tv_slot, h); DUK_HBUFFER_INCREF(thr, h); thr->valstack_top++; return (void *) buf_data; } DUK_INTERNAL void *duk_push_fixed_buffer_nozero(duk_hthread *thr, duk_size_t len) { DUK_ASSERT_API_ENTRY(thr); return duk_push_buffer_raw(thr, len, DUK_BUF_FLAG_NOZERO); } DUK_INTERNAL void *duk_push_fixed_buffer_zero(duk_hthread *thr, duk_size_t len) { void *ptr; DUK_ASSERT_API_ENTRY(thr); ptr = duk_push_buffer_raw(thr, len, 0); #if !defined(DUK_USE_ZERO_BUFFER_DATA) /* ES2015 requires zeroing even when DUK_USE_ZERO_BUFFER_DATA * is not set. */ DUK_MEMZERO((void *) ptr, (size_t) len); #endif return ptr; } #if defined(DUK_USE_ES6_PROXY) DUK_EXTERNAL duk_idx_t duk_push_proxy(duk_hthread *thr, duk_uint_t proxy_flags) { duk_hobject *h_target; duk_hobject *h_handler; duk_hproxy *h_proxy; duk_tval *tv_slot; duk_uint_t flags; DUK_ASSERT_API_ENTRY(thr); DUK_UNREF(proxy_flags); /* DUK__CHECK_SPACE() unnecessary because the Proxy is written to * value stack in-place. */ #if 0 DUK__CHECK_SPACE(); #endif /* Reject a proxy object as the target because it would need * special handling in property lookups. (ES2015 has no such * restriction.) */ h_target = duk_require_hobject_promote_mask(thr, -2, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER); DUK_ASSERT(h_target != NULL); if (DUK_HOBJECT_IS_PROXY(h_target)) { goto fail_args; } /* Reject a proxy object as the handler because it would cause * potentially unbounded recursion. (ES2015 has no such * restriction.) * * There's little practical reason to use a lightfunc or a plain * buffer as the handler table: one could only provide traps via * their prototype objects (Function.prototype and ArrayBuffer.prototype). * Even so, as lightfuncs and plain buffers mimic their object * counterparts, they're promoted and accepted here. */ h_handler = duk_require_hobject_promote_mask(thr, -1, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER); DUK_ASSERT(h_handler != NULL); if (DUK_HOBJECT_IS_PROXY(h_handler)) { goto fail_args; } /* XXX: Proxy object currently has no prototype, so ToPrimitive() * coercion fails which is a bit confusing. */ /* CALLABLE and CONSTRUCTABLE flags are copied from the (initial) * target, see ES2015 Sections 9.5.15 and 9.5.13. */ flags = DUK_HEAPHDR_GET_FLAGS((duk_heaphdr *) h_target) & (DUK_HOBJECT_FLAG_CALLABLE | DUK_HOBJECT_FLAG_CONSTRUCTABLE); flags |= DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ; if (flags & DUK_HOBJECT_FLAG_CALLABLE) { flags |= DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION) | DUK_HOBJECT_FLAG_SPECIAL_CALL; } else { flags |= DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT); } h_proxy = duk_hproxy_alloc(thr, flags); DUK_ASSERT(h_proxy != NULL); DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) h_proxy) == NULL); /* Initialize Proxy target and handler references; avoid INCREF * by stealing the value stack refcounts via direct value stack * manipulation. INCREF is needed for the Proxy itself however. */ DUK_ASSERT(h_target != NULL); h_proxy->target = h_target; DUK_ASSERT(h_handler != NULL); h_proxy->handler = h_handler; DUK_ASSERT_HPROXY_VALID(h_proxy); DUK_ASSERT(duk_get_hobject(thr, -2) == h_target); DUK_ASSERT(duk_get_hobject(thr, -1) == h_handler); tv_slot = thr->valstack_top - 2; DUK_ASSERT(tv_slot >= thr->valstack_bottom); DUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) h_proxy); DUK_HOBJECT_INCREF(thr, (duk_hobject *) h_proxy); tv_slot++; DUK_TVAL_SET_UNDEFINED(tv_slot); /* [ ... target handler ] -> [ ... proxy undefined ] */ thr->valstack_top = tv_slot; /* -> [ ... proxy ] */ DUK_DD(DUK_DDPRINT("created Proxy: %!iT", duk_get_tval(thr, -1))); return (duk_idx_t) (thr->valstack_top - thr->valstack_bottom - 1); fail_args: DUK_ERROR_TYPE_INVALID_ARGS(thr); } #else /* DUK_USE_ES6_PROXY */ DUK_EXTERNAL duk_idx_t duk_push_proxy(duk_hthread *thr, duk_uint_t proxy_flags) { DUK_ASSERT_API_ENTRY(thr); DUK_UNREF(proxy_flags); DUK_ERROR_UNSUPPORTED(thr); } #endif /* DUK_USE_ES6_PROXY */ #if defined(DUK_USE_ASSERTIONS) DUK_LOCAL void duk__validate_push_heapptr(duk_hthread *thr, void *ptr) { duk_heaphdr *h; duk_heaphdr *curr; duk_bool_t found = 0; h = (duk_heaphdr *) ptr; if (h == NULL) { /* Allowed. */ return; } DUK_ASSERT(h != NULL); DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(h)); /* One particular problem case is where an object has been * queued for finalization but the finalizer hasn't yet been * executed. * * Corner case: we're running in a finalizer for object X, and * user code calls duk_push_heapptr() for X itself. In this * case X will be in finalize_list, and we can detect the case * by seeing that X's FINALIZED flag is set (which is done before * the finalizer starts executing). */ #if defined(DUK_USE_FINALIZER_SUPPORT) for (curr = thr->heap->finalize_list; curr != NULL; curr = DUK_HEAPHDR_GET_NEXT(thr->heap, curr)) { /* FINALIZABLE is set for all objects on finalize_list * except for an object being finalized right now. So * can't assert here. */ #if 0 DUK_ASSERT(DUK_HEAPHDR_HAS_FINALIZABLE(curr)); #endif if (curr == h) { if (DUK_HEAPHDR_HAS_FINALIZED((duk_heaphdr *) h)) { /* Object is currently being finalized. */ DUK_ASSERT(found == 0); /* Would indicate corrupted lists. */ found = 1; } else { /* Not being finalized but on finalize_list, * allowed since Duktape 2.1. */ DUK_ASSERT(found == 0); /* Would indicate corrupted lists. */ found = 1; } } } #endif /* DUK_USE_FINALIZER_SUPPORT */ #if defined(DUK_USE_REFERENCE_COUNTING) /* Because refzero_list is now processed to completion inline with * no side effects, it's always empty here. */ DUK_ASSERT(thr->heap->refzero_list == NULL); #endif /* If not present in finalize_list (or refzero_list), it * must be either in heap_allocated or the string table. */ if (DUK_HEAPHDR_IS_STRING(h)) { duk_uint32_t i; duk_hstring *str; duk_heap *heap = thr->heap; DUK_ASSERT(found == 0); for (i = 0; i < heap->st_size; i++) { #if defined(DUK_USE_STRTAB_PTRCOMP) str = DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, heap->strtable16[i]); #else str = heap->strtable[i]; #endif while (str != NULL) { if (str == (duk_hstring *) h) { DUK_ASSERT(found == 0); /* Would indicate corrupted lists. */ found = 1; break; } str = str->hdr.h_next; } } DUK_ASSERT(found != 0); } else { for (curr = thr->heap->heap_allocated; curr != NULL; curr = DUK_HEAPHDR_GET_NEXT(thr->heap, curr)) { if (curr == h) { DUK_ASSERT(found == 0); /* Would indicate corrupted lists. */ found = 1; } } DUK_ASSERT(found != 0); } } #endif /* DUK_USE_ASSERTIONS */ DUK_EXTERNAL duk_idx_t duk_push_heapptr(duk_hthread *thr, void *ptr) { duk_idx_t ret; duk_tval *tv; DUK_ASSERT_API_ENTRY(thr); /* Reviving an object using a heap pointer is a dangerous API * operation: if the application doesn't guarantee that the * pointer target is always reachable, difficult-to-diagnose * problems may ensue. Try to validate the 'ptr' argument to * the extent possible. */ #if defined(DUK_USE_ASSERTIONS) duk__validate_push_heapptr(thr, ptr); #endif DUK__CHECK_SPACE(); ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom); tv = thr->valstack_top++; if (ptr == NULL) { DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv)); return ret; } DUK_ASSERT_HEAPHDR_VALID((duk_heaphdr *) ptr); /* If the argument is on finalize_list it has technically been * unreachable before duk_push_heapptr() but it's still safe to * push it. Starting from Duktape 2.1 allow application code to * do so. There are two main cases: * * (1) The object is on the finalize_list and we're called by * the finalizer for the object being finalized. In this * case do nothing: finalize_list handling will deal with * the object queueing. This is detected by the object not * having a FINALIZABLE flag despite being on the finalize_list; * the flag is cleared for the object being finalized only. * * (2) The object is on the finalize_list but is not currently * being processed. In this case the object can be queued * back to heap_allocated with a few flags cleared, in effect * cancelling the finalizer. */ if (DUK_UNLIKELY(DUK_HEAPHDR_HAS_FINALIZABLE((duk_heaphdr *) ptr))) { duk_heaphdr *curr; DUK_D(DUK_DPRINT("duk_push_heapptr() with a pointer on finalize_list, autorescue")); curr = (duk_heaphdr *) ptr; DUK_HEAPHDR_CLEAR_FINALIZABLE(curr); /* Because FINALIZED is set prior to finalizer call, it will * be set for the object being currently finalized, but not * for other objects on finalize_list. */ DUK_HEAPHDR_CLEAR_FINALIZED(curr); /* Dequeue object from finalize_list and queue it back to * heap_allocated. */ #if defined(DUK_USE_REFERENCE_COUNTING) DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(curr) >= 1); /* Preincremented on finalize_list insert. */ DUK_HEAPHDR_PREDEC_REFCOUNT(curr); #endif DUK_HEAP_REMOVE_FROM_FINALIZE_LIST(thr->heap, curr); DUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(thr->heap, curr); /* Continue with the rest. */ } switch (DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) ptr)) { case DUK_HTYPE_STRING: DUK_TVAL_SET_STRING(tv, (duk_hstring *) ptr); break; case DUK_HTYPE_OBJECT: DUK_TVAL_SET_OBJECT(tv, (duk_hobject *) ptr); break; default: DUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) ptr) == DUK_HTYPE_BUFFER); DUK_TVAL_SET_BUFFER(tv, (duk_hbuffer *) ptr); break; } DUK_HEAPHDR_INCREF(thr, (duk_heaphdr *) ptr); return ret; } /* Push object with no prototype, i.e. a "bare" object. */ DUK_EXTERNAL duk_idx_t duk_push_bare_object(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); (void) duk_push_object_helper(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_FASTREFS | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT), -1); /* no prototype */ return duk_get_top_index_unsafe(thr); } DUK_INTERNAL void duk_push_hstring(duk_hthread *thr, duk_hstring *h) { duk_tval tv; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(h != NULL); DUK_TVAL_SET_STRING(&tv, h); duk_push_tval(thr, &tv); } DUK_INTERNAL void duk_push_hstring_stridx(duk_hthread *thr, duk_small_uint_t stridx) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT_STRIDX_VALID(stridx); duk_push_hstring(thr, DUK_HTHREAD_GET_STRING(thr, stridx)); } DUK_INTERNAL void duk_push_hstring_empty(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); duk_push_hstring(thr, DUK_HTHREAD_GET_STRING(thr, DUK_STRIDX_EMPTY_STRING)); } DUK_INTERNAL void duk_push_hobject(duk_hthread *thr, duk_hobject *h) { duk_tval tv; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(h != NULL); DUK_TVAL_SET_OBJECT(&tv, h); duk_push_tval(thr, &tv); } DUK_INTERNAL void duk_push_hbuffer(duk_hthread *thr, duk_hbuffer *h) { duk_tval tv; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(h != NULL); DUK_TVAL_SET_BUFFER(&tv, h); duk_push_tval(thr, &tv); } DUK_INTERNAL void duk_push_hobject_bidx(duk_hthread *thr, duk_small_int_t builtin_idx) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(builtin_idx >= 0 && builtin_idx < DUK_NUM_BUILTINS); DUK_ASSERT(thr->builtins[builtin_idx] != NULL); duk_push_hobject(thr, thr->builtins[builtin_idx]); } /* * Poppers */ DUK_LOCAL DUK_ALWAYS_INLINE void duk__pop_n_unsafe_raw(duk_hthread *thr, duk_idx_t count) { duk_tval *tv; #if defined(DUK_USE_REFERENCE_COUNTING) duk_tval *tv_end; #endif DUK_ASSERT_CTX_VALID(thr); DUK_ASSERT(count >= 0); DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) >= (duk_size_t) count); #if defined(DUK_USE_REFERENCE_COUNTING) tv = thr->valstack_top; tv_end = tv - count; while (tv != tv_end) { tv--; DUK_ASSERT(tv >= thr->valstack_bottom); DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ(thr, tv); } thr->valstack_top = tv; DUK_REFZERO_CHECK_FAST(thr); #else tv = thr->valstack_top; while (count > 0) { count--; tv--; DUK_ASSERT(tv >= thr->valstack_bottom); DUK_TVAL_SET_UNDEFINED(tv); } thr->valstack_top = tv; #endif DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); } DUK_EXTERNAL void duk_pop_n(duk_hthread *thr, duk_idx_t count) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); if (DUK_UNLIKELY((duk_uidx_t) (thr->valstack_top - thr->valstack_bottom) < (duk_uidx_t) count)) { DUK_ERROR_RANGE_INVALID_COUNT(thr); return; } DUK_ASSERT(count >= 0); duk__pop_n_unsafe_raw(thr, count); } #if defined(DUK_USE_PREFER_SIZE) DUK_INTERNAL void duk_pop_n_unsafe(duk_hthread *thr, duk_idx_t count) { DUK_ASSERT_API_ENTRY(thr); duk_pop_n(thr, count); } #else /* DUK_USE_PREFER_SIZE */ DUK_INTERNAL void duk_pop_n_unsafe(duk_hthread *thr, duk_idx_t count) { DUK_ASSERT_API_ENTRY(thr); duk__pop_n_unsafe_raw(thr, count); } #endif /* DUK_USE_PREFER_SIZE */ /* Pop N elements without DECREF (in effect "stealing" any actual refcounts). */ #if defined(DUK_USE_REFERENCE_COUNTING) DUK_INTERNAL void duk_pop_n_nodecref_unsafe(duk_hthread *thr, duk_idx_t count) { duk_tval *tv; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(count >= 0); DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) >= (duk_size_t) count); tv = thr->valstack_top; while (count > 0) { count--; tv--; DUK_ASSERT(tv >= thr->valstack_bottom); DUK_TVAL_SET_UNDEFINED(tv); } thr->valstack_top = tv; DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); } #else /* DUK_USE_REFERENCE_COUNTING */ DUK_INTERNAL void duk_pop_n_nodecref_unsafe(duk_hthread *thr, duk_idx_t count) { DUK_ASSERT_API_ENTRY(thr); duk_pop_n_unsafe(thr, count); } #endif /* DUK_USE_REFERENCE_COUNTING */ /* Popping one element is called so often that when footprint is not an issue, * compile a specialized function for it. */ #if defined(DUK_USE_PREFER_SIZE) DUK_EXTERNAL void duk_pop(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); duk_pop_n(thr, 1); } DUK_INTERNAL void duk_pop_unsafe(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); duk_pop_n_unsafe(thr, 1); } DUK_INTERNAL void duk_pop_nodecref_unsafe(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); duk_pop_n_nodecref_unsafe(thr, 1); } #else /* DUK_USE_PREFER_SIZE */ DUK_LOCAL DUK_ALWAYS_INLINE void duk__pop_unsafe_raw(duk_hthread *thr) { duk_tval *tv; DUK_ASSERT_CTX_VALID(thr); DUK_ASSERT(thr->valstack_top != thr->valstack_bottom); DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) >= (duk_size_t) 1); tv = --thr->valstack_top; DUK_ASSERT(tv >= thr->valstack_bottom); #if defined(DUK_USE_REFERENCE_COUNTING) DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv); /* side effects */ #else DUK_TVAL_SET_UNDEFINED(tv); #endif DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); } DUK_EXTERNAL void duk_pop(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); if (DUK_UNLIKELY(thr->valstack_top == thr->valstack_bottom)) { DUK_ERROR_RANGE_INVALID_COUNT(thr); } duk__pop_unsafe_raw(thr); } DUK_INTERNAL void duk_pop_unsafe(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); duk__pop_unsafe_raw(thr); } DUK_INTERNAL void duk_pop_nodecref_unsafe(duk_hthread *thr) { duk_tval *tv; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(thr->valstack_top != thr->valstack_bottom); DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) >= (duk_size_t) 1); tv = --thr->valstack_top; DUK_ASSERT(tv >= thr->valstack_bottom); DUK_TVAL_SET_UNDEFINED(tv); DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); } #endif /* !DUK_USE_PREFER_SIZE */ #if defined(DUK_USE_PREFER_SIZE) DUK_INTERNAL void duk_pop_undefined(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); duk_pop_nodecref_unsafe(thr); } #else /* DUK_USE_PREFER_SIZE */ DUK_INTERNAL void duk_pop_undefined(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(thr->valstack_top != thr->valstack_bottom); DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) >= (duk_size_t) 1); DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top - 1)); thr->valstack_top--; DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); } #endif /* !DUK_USE_PREFER_SIZE */ #if defined(DUK_USE_PREFER_SIZE) DUK_EXTERNAL void duk_pop_2(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); duk_pop_n(thr, 2); } DUK_INTERNAL void duk_pop_2_unsafe(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); duk_pop_n_unsafe(thr, 2); } DUK_INTERNAL void duk_pop_2_nodecref_unsafe(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); duk_pop_n_nodecref_unsafe(thr, 2); } #else DUK_LOCAL DUK_ALWAYS_INLINE void duk__pop_2_unsafe_raw(duk_hthread *thr) { duk_tval *tv; DUK_ASSERT_CTX_VALID(thr); DUK_ASSERT(thr->valstack_top != thr->valstack_bottom); DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) >= (duk_size_t) 2); tv = --thr->valstack_top; DUK_ASSERT(tv >= thr->valstack_bottom); #if defined(DUK_USE_REFERENCE_COUNTING) DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv); /* side effects */ #else DUK_TVAL_SET_UNDEFINED(tv); #endif tv = --thr->valstack_top; DUK_ASSERT(tv >= thr->valstack_bottom); #if defined(DUK_USE_REFERENCE_COUNTING) DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv); /* side effects */ #else DUK_TVAL_SET_UNDEFINED(tv); #endif DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); } DUK_EXTERNAL void duk_pop_2(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); if (DUK_UNLIKELY(thr->valstack_top - 2 < thr->valstack_bottom)) { DUK_ERROR_RANGE_INVALID_COUNT(thr); } duk__pop_2_unsafe_raw(thr); } DUK_INTERNAL void duk_pop_2_unsafe(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); duk__pop_2_unsafe_raw(thr); } DUK_INTERNAL void duk_pop_2_nodecref_unsafe(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(thr->valstack_top != thr->valstack_bottom); DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) >= (duk_size_t) 2); DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top - 1)); DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top - 2)); thr->valstack_top -= 2; DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); } #endif /* !DUK_USE_PREFER_SIZE */ DUK_EXTERNAL void duk_pop_3(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); duk_pop_n(thr, 3); } DUK_INTERNAL void duk_pop_3_unsafe(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); duk_pop_n_unsafe(thr, 3); } DUK_INTERNAL void duk_pop_3_nodecref_unsafe(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); duk_pop_n_nodecref_unsafe(thr, 3); } /* * Pack and unpack (pack value stack entries into an array and vice versa) */ /* XXX: pack index range? array index offset? */ DUK_INTERNAL void duk_pack(duk_hthread *thr, duk_idx_t count) { duk_tval *tv_src; duk_tval *tv_dst; duk_tval *tv_curr; duk_tval *tv_limit; duk_idx_t top; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); top = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom); DUK_ASSERT(top >= 0); if (DUK_UNLIKELY((duk_uidx_t) count > (duk_uidx_t) top)) { /* Also handles negative count. */ DUK_ERROR_RANGE_INVALID_COUNT(thr); return; } DUK_ASSERT(count >= 0); /* Wrapping is controlled by the check above: value stack top can be * at most DUK_USE_VALSTACK_LIMIT which is low enough so that * multiplying with sizeof(duk_tval) won't wrap. */ DUK_ASSERT(count >= 0 && count <= (duk_idx_t) DUK_USE_VALSTACK_LIMIT); DUK_ASSERT((duk_size_t) count <= DUK_SIZE_MAX / sizeof(duk_tval)); /* no wrapping */ tv_dst = duk_push_harray_with_size_outptr(thr, (duk_uint32_t) count); /* XXX: uninitialized would be OK */ DUK_ASSERT(count == 0 || tv_dst != NULL); /* Copy value stack values directly to the array part without * any refcount updates: net refcount changes are zero. */ tv_src = thr->valstack_top - count - 1; DUK_MEMCPY((void *) tv_dst, (const void *) tv_src, (size_t) count * sizeof(duk_tval)); /* Overwrite result array to final value stack location and wipe * the rest; no refcount operations needed. */ tv_dst = tv_src; /* when count == 0, same as tv_src (OK) */ tv_src = thr->valstack_top - 1; DUK_TVAL_SET_TVAL(tv_dst, tv_src); /* XXX: internal helper to wipe a value stack segment? */ tv_curr = tv_dst + 1; tv_limit = thr->valstack_top; while (tv_curr != tv_limit) { /* Wipe policy: keep as 'undefined'. */ DUK_TVAL_SET_UNDEFINED(tv_curr); tv_curr++; } thr->valstack_top = tv_dst + 1; } DUK_INTERNAL duk_idx_t duk_unpack_array_like(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; DUK_ASSERT_API_ENTRY(thr); tv = duk_require_tval(thr, idx); if (DUK_LIKELY(DUK_TVAL_IS_OBJECT(tv))) { duk_hobject *h; duk_uint32_t len; duk_uint32_t i; h = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h != NULL); DUK_UNREF(h); #if defined(DUK_USE_ARRAY_FASTPATH) /* close enough */ if (DUK_LIKELY(DUK_HOBJECT_IS_ARRAY(h) && ((duk_harray *) h)->length <= DUK_HOBJECT_GET_ASIZE(h))) { duk_harray *h_arr; duk_tval *tv_src; duk_tval *tv_dst; h_arr = (duk_harray *) h; len = h_arr->length; if (DUK_UNLIKELY(len >= 0x80000000UL)) { goto fail_over_2g; } duk_require_stack(thr, (duk_idx_t) len); /* The potential allocation in duk_require_stack() may * run a finalizer which modifies the argArray so that * e.g. becomes sparse. So, we need to recheck that the * array didn't change size and that there's still a * valid backing array part. * * XXX: alternatively, could prevent finalizers for the * duration. */ if (DUK_UNLIKELY(len != h_arr->length || h_arr->length > DUK_HOBJECT_GET_ASIZE((duk_hobject *) h_arr))) { goto skip_fast; } /* Main fast path: arguments array is almost always * an actual array (though it might also be an arguments * object). */ DUK_DDD(DUK_DDDPRINT("fast path for %ld elements", (long) h_arr->length)); tv_src = DUK_HOBJECT_A_GET_BASE(thr->heap, h); tv_dst = thr->valstack_top; while (len-- > 0) { DUK_ASSERT(tv_dst < thr->valstack_end); if (DUK_UNLIKELY(DUK_TVAL_IS_UNUSED(tv_src))) { /* Gaps are very unlikely. Skip over them, * without an ancestor lookup (technically * not compliant). */ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv_dst)); /* valstack policy */ } else { DUK_TVAL_SET_TVAL(tv_dst, tv_src); DUK_TVAL_INCREF(thr, tv_dst); } tv_src++; tv_dst++; } DUK_ASSERT(tv_dst <= thr->valstack_end); thr->valstack_top = tv_dst; return (duk_idx_t) h_arr->length; } skip_fast: #endif /* DUK_USE_ARRAY_FASTPATH */ /* Slow path: actual lookups. The initial 'length' lookup * decides the output length, regardless of side effects that * may resize or change the argArray while we read the * indices. */ idx = duk_normalize_index(thr, idx); duk_get_prop_stridx(thr, idx, DUK_STRIDX_LENGTH); len = duk_to_uint32(thr, -1); /* ToUint32() coercion required */ if (DUK_UNLIKELY(len >= 0x80000000UL)) { goto fail_over_2g; } duk_pop_unsafe(thr); DUK_DDD(DUK_DDDPRINT("slow path for %ld elements", (long) len)); duk_require_stack(thr, (duk_idx_t) len); for (i = 0; i < len; i++) { duk_get_prop_index(thr, idx, (duk_uarridx_t) i); } return (duk_idx_t) len; } else if (DUK_TVAL_IS_UNDEFINED(tv) || DUK_TVAL_IS_NULL(tv)) { return 0; } DUK_ERROR_TYPE_INVALID_ARGS(thr); return 0; fail_over_2g: DUK_ERROR_RANGE_INVALID_LENGTH(thr); return 0; } /* * Error throwing */ DUK_EXTERNAL void duk_throw_raw(duk_hthread *thr) { duk_tval *tv_val; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(thr->valstack_bottom >= thr->valstack); DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); DUK_ASSERT(thr->valstack_end >= thr->valstack_top); if (DUK_UNLIKELY(thr->valstack_top == thr->valstack_bottom)) { DUK_ERROR_TYPE_INVALID_ARGS(thr); } /* Errors are augmented when they are created, not when they are * thrown or re-thrown. The current error handler, however, runs * just before an error is thrown. */ /* Sync so that augmentation sees up-to-date activations, NULL * thr->ptr_curr_pc so that it's not used if side effects occur * in augmentation or longjmp handling. */ duk_hthread_sync_and_null_currpc(thr); #if defined(DUK_USE_AUGMENT_ERROR_THROW) DUK_DDD(DUK_DDDPRINT("THROW ERROR (API): %!dT (before throw augment)", (duk_tval *) duk_get_tval(thr, -1))); duk_err_augment_error_throw(thr); #endif DUK_DDD(DUK_DDDPRINT("THROW ERROR (API): %!dT (after throw augment)", (duk_tval *) duk_get_tval(thr, -1))); tv_val = DUK_GET_TVAL_NEGIDX(thr, -1); duk_err_setup_ljstate1(thr, DUK_LJ_TYPE_THROW, tv_val); #if defined(DUK_USE_DEBUGGER_SUPPORT) duk_err_check_debugger_integration(thr); #endif /* thr->heap->lj.jmpbuf_ptr is checked by duk_err_longjmp() so we don't * need to check that here. If the value is NULL, a fatal error occurs * because we can't return. */ duk_err_longjmp(thr); DUK_UNREACHABLE(); } DUK_EXTERNAL void duk_fatal_raw(duk_hthread *thr, const char *err_msg) { DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->heap != NULL); DUK_ASSERT(thr->heap->fatal_func != NULL); DUK_D(DUK_DPRINT("fatal error occurred: %s", err_msg ? err_msg : "NULL")); /* fatal_func should be noreturn, but noreturn declarations on function * pointers has a very spotty support apparently so it's not currently * done. */ thr->heap->fatal_func(thr->heap->heap_udata, err_msg); /* If the fatal handler returns, all bets are off. It'd be nice to * print something here but since we don't want to depend on stdio, * there's no way to do so portably. */ DUK_D(DUK_DPRINT("fatal error handler returned, all bets are off!")); for (;;) { /* loop forever, don't return (function marked noreturn) */ } } DUK_EXTERNAL void duk_error_va_raw(duk_hthread *thr, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, va_list ap) { DUK_ASSERT_API_ENTRY(thr); duk_push_error_object_va_raw(thr, err_code, filename, line, fmt, ap); (void) duk_throw(thr); } DUK_EXTERNAL void duk_error_raw(duk_hthread *thr, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, ...) { va_list ap; DUK_ASSERT_API_ENTRY(thr); va_start(ap, fmt); duk_push_error_object_va_raw(thr, err_code, filename, line, fmt, ap); va_end(ap); (void) duk_throw(thr); } #if !defined(DUK_USE_VARIADIC_MACROS) DUK_NORETURN(DUK_LOCAL_DECL void duk__throw_error_from_stash(duk_hthread *thr, duk_errcode_t err_code, const char *fmt, va_list ap)); DUK_LOCAL void duk__throw_error_from_stash(duk_hthread *thr, duk_errcode_t err_code, const char *fmt, va_list ap) { const char *filename; duk_int_t line; DUK_ASSERT_CTX_VALID(thr); filename = duk_api_global_filename; line = duk_api_global_line; duk_api_global_filename = NULL; duk_api_global_line = 0; duk_push_error_object_va_raw(thr, err_code, filename, line, fmt, ap); (void) duk_throw(thr); } #define DUK__ERROR_STASH_SHARED(code) do { \ va_list ap; \ va_start(ap, fmt); \ duk__throw_error_from_stash(thr, (code), fmt, ap); \ va_end(ap); \ /* Never reached; if return 0 here, gcc/clang will complain. */ \ } while (0) DUK_EXTERNAL duk_ret_t duk_error_stash(duk_hthread *thr, duk_errcode_t err_code, const char *fmt, ...) { DUK_ASSERT_API_ENTRY(thr); DUK__ERROR_STASH_SHARED(err_code); } DUK_EXTERNAL duk_ret_t duk_generic_error_stash(duk_hthread *thr, const char *fmt, ...) { DUK_ASSERT_API_ENTRY(thr); DUK__ERROR_STASH_SHARED(DUK_ERR_ERROR); } DUK_EXTERNAL duk_ret_t duk_eval_error_stash(duk_hthread *thr, const char *fmt, ...) { DUK_ASSERT_API_ENTRY(thr); DUK__ERROR_STASH_SHARED(DUK_ERR_EVAL_ERROR); } DUK_EXTERNAL duk_ret_t duk_range_error_stash(duk_hthread *thr, const char *fmt, ...) { DUK_ASSERT_API_ENTRY(thr); DUK__ERROR_STASH_SHARED(DUK_ERR_RANGE_ERROR); } DUK_EXTERNAL duk_ret_t duk_reference_error_stash(duk_hthread *thr, const char *fmt, ...) { DUK_ASSERT_API_ENTRY(thr); DUK__ERROR_STASH_SHARED(DUK_ERR_REFERENCE_ERROR); } DUK_EXTERNAL duk_ret_t duk_syntax_error_stash(duk_hthread *thr, const char *fmt, ...) { DUK_ASSERT_API_ENTRY(thr); DUK__ERROR_STASH_SHARED(DUK_ERR_SYNTAX_ERROR); } DUK_EXTERNAL duk_ret_t duk_type_error_stash(duk_hthread *thr, const char *fmt, ...) { DUK_ASSERT_API_ENTRY(thr); DUK__ERROR_STASH_SHARED(DUK_ERR_TYPE_ERROR); } DUK_EXTERNAL duk_ret_t duk_uri_error_stash(duk_hthread *thr, const char *fmt, ...) { DUK_ASSERT_API_ENTRY(thr); DUK__ERROR_STASH_SHARED(DUK_ERR_URI_ERROR); } #endif /* DUK_USE_VARIADIC_MACROS */ /* * Comparison */ DUK_EXTERNAL duk_bool_t duk_equals(duk_hthread *thr, duk_idx_t idx1, duk_idx_t idx2) { duk_tval *tv1, *tv2; DUK_ASSERT_API_ENTRY(thr); tv1 = duk_get_tval(thr, idx1); tv2 = duk_get_tval(thr, idx2); if ((tv1 == NULL) || (tv2 == NULL)) { return 0; } /* Coercion may be needed, the helper handles that by pushing the * tagged values to the stack. */ return duk_js_equals(thr, tv1, tv2); } DUK_EXTERNAL duk_bool_t duk_strict_equals(duk_hthread *thr, duk_idx_t idx1, duk_idx_t idx2) { duk_tval *tv1, *tv2; DUK_ASSERT_API_ENTRY(thr); tv1 = duk_get_tval(thr, idx1); tv2 = duk_get_tval(thr, idx2); if ((tv1 == NULL) || (tv2 == NULL)) { return 0; } /* No coercions or other side effects, so safe */ return duk_js_strict_equals(tv1, tv2); } DUK_EXTERNAL duk_bool_t duk_samevalue(duk_hthread *thr, duk_idx_t idx1, duk_idx_t idx2) { duk_tval *tv1, *tv2; DUK_ASSERT_API_ENTRY(thr); tv1 = duk_get_tval(thr, idx1); tv2 = duk_get_tval(thr, idx2); if ((tv1 == NULL) || (tv2 == NULL)) { return 0; } /* No coercions or other side effects, so safe */ return duk_js_samevalue(tv1, tv2); } /* * instanceof */ DUK_EXTERNAL duk_bool_t duk_instanceof(duk_hthread *thr, duk_idx_t idx1, duk_idx_t idx2) { duk_tval *tv1, *tv2; DUK_ASSERT_API_ENTRY(thr); /* Index validation is strict, which differs from duk_equals(). * The strict behavior mimics how instanceof itself works, e.g. * it is a TypeError if rval is not a -callable- object. It would * be somewhat inconsistent if rval would be allowed to be * non-existent without a TypeError. */ tv1 = duk_require_tval(thr, idx1); DUK_ASSERT(tv1 != NULL); tv2 = duk_require_tval(thr, idx2); DUK_ASSERT(tv2 != NULL); return duk_js_instanceof(thr, tv1, tv2); } /* * Lightfunc */ DUK_INTERNAL void duk_push_lightfunc_name_raw(duk_hthread *thr, duk_c_function func, duk_small_uint_t lf_flags) { /* Lightfunc name, includes Duktape/C native function pointer, which * can often be used to locate the function from a symbol table. * The name also includes the 16-bit duk_tval flags field because it * includes the magic value. Because a single native function often * provides different functionality depending on the magic value, it * seems reasonably to include it in the name. * * On the other hand, a complicated name increases string table * pressure in low memory environments (but only when function name * is accessed). */ DUK_ASSERT_API_ENTRY(thr); duk_push_sprintf(thr, "light_"); duk_push_string_funcptr(thr, (duk_uint8_t *) &func, sizeof(func)); duk_push_sprintf(thr, "_%04x", (unsigned int) lf_flags); duk_concat(thr, 3); } DUK_INTERNAL void duk_push_lightfunc_name(duk_hthread *thr, duk_tval *tv) { duk_c_function func; duk_small_uint_t lf_flags; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(tv)); DUK_TVAL_GET_LIGHTFUNC(tv, func, lf_flags); duk_push_lightfunc_name_raw(thr, func, lf_flags); } DUK_INTERNAL void duk_push_lightfunc_tostring(duk_hthread *thr, duk_tval *tv) { duk_c_function func; duk_small_uint_t lf_flags; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(tv)); DUK_TVAL_GET_LIGHTFUNC(tv, func, lf_flags); /* read before 'tv' potentially invalidated */ duk_push_string(thr, "function "); duk_push_lightfunc_name_raw(thr, func, lf_flags); duk_push_string(thr, "() { [lightfunc code] }"); duk_concat(thr, 3); } /* * Function pointers * * Printing function pointers is non-portable, so we do that by hex printing * bytes from memory. */ DUK_INTERNAL void duk_push_string_funcptr(duk_hthread *thr, duk_uint8_t *ptr, duk_size_t sz) { duk_uint8_t buf[32 * 2]; duk_uint8_t *p, *q; duk_small_uint_t i; duk_small_uint_t t; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(sz <= 32); /* sanity limit for function pointer size */ p = buf; #if defined(DUK_USE_INTEGER_LE) q = ptr + sz; #else q = ptr; #endif for (i = 0; i < sz; i++) { #if defined(DUK_USE_INTEGER_LE) t = *(--q); #else t = *(q++); #endif *p++ = duk_lc_digits[t >> 4]; *p++ = duk_lc_digits[t & 0x0f]; } duk_push_lstring(thr, (const char *) buf, sz * 2); } /* * Push readable string summarizing duk_tval. The operation is side effect * free and will only throw from internal errors (e.g. out of memory). * This is used by e.g. property access code to summarize a key/base safely, * and is not intended to be fast (but small and safe). */ /* String limits for summary strings. */ #define DUK__READABLE_SUMMARY_MAXCHARS 96 /* maximum supported by helper */ #define DUK__READABLE_STRING_MAXCHARS 32 /* for strings/symbols */ #define DUK__READABLE_ERRMSG_MAXCHARS 96 /* for error messages */ /* String sanitizer which escapes ASCII control characters and a few other * ASCII characters, passes Unicode as is, and replaces invalid UTF-8 with * question marks. No errors are thrown for any input string, except in out * of memory situations. */ DUK_LOCAL void duk__push_hstring_readable_unicode(duk_hthread *thr, duk_hstring *h_input, duk_small_uint_t maxchars) { const duk_uint8_t *p, *p_start, *p_end; duk_uint8_t buf[DUK_UNICODE_MAX_XUTF8_LENGTH * DUK__READABLE_SUMMARY_MAXCHARS + 2 /*quotes*/ + 3 /*periods*/]; duk_uint8_t *q; duk_ucodepoint_t cp; duk_small_uint_t nchars; DUK_ASSERT_CTX_VALID(thr); DUK_ASSERT(h_input != NULL); DUK_ASSERT(maxchars <= DUK__READABLE_SUMMARY_MAXCHARS); p_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_input); p_end = p_start + DUK_HSTRING_GET_BYTELEN(h_input); p = p_start; q = buf; nchars = 0; *q++ = (duk_uint8_t) DUK_ASC_SINGLEQUOTE; for (;;) { if (p >= p_end) { break; } if (nchars == maxchars) { *q++ = (duk_uint8_t) DUK_ASC_PERIOD; *q++ = (duk_uint8_t) DUK_ASC_PERIOD; *q++ = (duk_uint8_t) DUK_ASC_PERIOD; break; } if (duk_unicode_decode_xutf8(thr, &p, p_start, p_end, &cp)) { if (cp < 0x20 || cp == 0x7f || cp == DUK_ASC_SINGLEQUOTE || cp == DUK_ASC_BACKSLASH) { DUK_ASSERT(DUK_UNICODE_MAX_XUTF8_LENGTH >= 4); /* estimate is valid */ DUK_ASSERT((cp >> 4) <= 0x0f); *q++ = (duk_uint8_t) DUK_ASC_BACKSLASH; *q++ = (duk_uint8_t) DUK_ASC_LC_X; *q++ = (duk_uint8_t) duk_lc_digits[cp >> 4]; *q++ = (duk_uint8_t) duk_lc_digits[cp & 0x0f]; } else { q += duk_unicode_encode_xutf8(cp, q); } } else { p++; /* advance manually */ *q++ = (duk_uint8_t) DUK_ASC_QUESTION; } nchars++; } *q++ = (duk_uint8_t) DUK_ASC_SINGLEQUOTE; duk_push_lstring(thr, (const char *) buf, (duk_size_t) (q - buf)); } DUK_LOCAL const char *duk__push_string_tval_readable(duk_hthread *thr, duk_tval *tv, duk_bool_t error_aware) { DUK_ASSERT_CTX_VALID(thr); /* 'tv' may be NULL */ if (tv == NULL) { duk_push_string(thr, "none"); } else { switch (DUK_TVAL_GET_TAG(tv)) { case DUK_TAG_STRING: { duk_hstring *h = DUK_TVAL_GET_STRING(tv); if (DUK_HSTRING_HAS_SYMBOL(h)) { /* XXX: string summary produces question marks * so this is not very ideal. */ duk_push_string(thr, "[Symbol "); duk_push_string(thr, duk__get_symbol_type_string(h)); duk_push_string(thr, " "); duk__push_hstring_readable_unicode(thr, h, DUK__READABLE_STRING_MAXCHARS); duk_push_string(thr, "]"); duk_concat(thr, 5); break; } duk__push_hstring_readable_unicode(thr, h, DUK__READABLE_STRING_MAXCHARS); break; } case DUK_TAG_OBJECT: { duk_hobject *h = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h != NULL); if (error_aware && duk_hobject_prototype_chain_contains(thr, h, thr->builtins[DUK_BIDX_ERROR_PROTOTYPE], 1 /*ignore_loop*/)) { /* Get error message in a side effect free way if * possible; if not, summarize as a generic object. * Error message currently gets quoted. */ /* XXX: better internal getprop call; get without side effects * but traverse inheritance chain. */ duk_tval *tv_msg; tv_msg = duk_hobject_find_existing_entry_tval_ptr(thr->heap, h, DUK_HTHREAD_STRING_MESSAGE(thr)); if (tv_msg != NULL && DUK_TVAL_IS_STRING(tv_msg)) { /* It's critical to avoid recursion so * only summarize a string .message. */ duk__push_hstring_readable_unicode(thr, DUK_TVAL_GET_STRING(tv_msg), DUK__READABLE_ERRMSG_MAXCHARS); break; } } duk_push_class_string_tval(thr, tv); break; } case DUK_TAG_BUFFER: { /* While plain buffers mimic Uint8Arrays, they summarize differently. * This is useful so that the summarized string accurately reflects the * internal type which may matter for figuring out bugs etc. */ /* XXX: Hex encoded, length limited buffer summary here? */ duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv); DUK_ASSERT(h != NULL); duk_push_sprintf(thr, "[buffer:%ld]", (long) DUK_HBUFFER_GET_SIZE(h)); break; } case DUK_TAG_POINTER: { /* Surround with parentheses like in JX, ensures NULL pointer * is distinguishable from null value ("(null)" vs "null"). */ duk_push_tval(thr, tv); duk_push_sprintf(thr, "(%s)", duk_to_string(thr, -1)); duk_remove_m2(thr); break; } default: { duk_push_tval(thr, tv); break; } } } return duk_to_string(thr, -1); } DUK_INTERNAL const char *duk_push_string_tval_readable(duk_hthread *thr, duk_tval *tv) { DUK_ASSERT_API_ENTRY(thr); return duk__push_string_tval_readable(thr, tv, 0 /*error_aware*/); } DUK_INTERNAL const char *duk_push_string_readable(duk_hthread *thr, duk_idx_t idx) { DUK_ASSERT_API_ENTRY(thr); return duk_push_string_tval_readable(thr, duk_get_tval(thr, idx)); } DUK_INTERNAL const char *duk_push_string_tval_readable_error(duk_hthread *thr, duk_tval *tv) { DUK_ASSERT_API_ENTRY(thr); return duk__push_string_tval_readable(thr, tv, 1 /*error_aware*/); } DUK_INTERNAL void duk_push_symbol_descriptive_string(duk_hthread *thr, duk_hstring *h) { const duk_uint8_t *p; const duk_uint8_t *p_end; const duk_uint8_t *q; DUK_ASSERT_API_ENTRY(thr); /* .toString() */ duk_push_string(thr, "Symbol("); p = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h); p_end = p + DUK_HSTRING_GET_BYTELEN(h); DUK_ASSERT(p[0] == 0xff || (p[0] & 0xc0) == 0x80); p++; for (q = p; q < p_end; q++) { if (*q == 0xffU) { /* Terminate either at end-of-string (but NUL MUST * be accepted without terminating description) or * 0xFF, which is used to mark start of unique trailer * (and cannot occur in CESU-8 / extended UTF-8). */ break; } } duk_push_lstring(thr, (const char *) p, (duk_size_t) (q - p)); duk_push_string(thr, ")"); duk_concat(thr, 3); } /* * Functions */ #if 0 /* not used yet */ DUK_INTERNAL void duk_push_hnatfunc_name(duk_hthread *thr, duk_hnatfunc *h) { duk_c_function func; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(h != NULL); DUK_ASSERT(DUK_HOBJECT_IS_NATFUNC((duk_hobject *) h)); duk_push_sprintf(thr, "native_"); func = h->func; duk_push_string_funcptr(thr, (duk_uint8_t *) &func, sizeof(func)); duk_push_sprintf(thr, "_%04x_%04x", (unsigned int) (duk_uint16_t) h->nargs, (unsigned int) (duk_uint16_t) h->magic); duk_concat(thr, 3); } #endif /* * duk_tval slice copy */ DUK_INTERNAL void duk_copy_tvals_incref(duk_hthread *thr, duk_tval *tv_dst, duk_tval *tv_src, duk_size_t count) { duk_tval *tv; DUK_ASSERT_API_ENTRY(thr); DUK_UNREF(thr); DUK_ASSERT(count * sizeof(duk_tval) >= count); /* no wrap */ DUK_MEMCPY((void *) tv_dst, (const void *) tv_src, count * sizeof(duk_tval)); tv = tv_dst; while (count-- > 0) { DUK_TVAL_INCREF(thr, tv); tv++; } } /* automatic undefs */ #undef DUK__ASSERT_SPACE #undef DUK__CHECK_SPACE #undef DUK__ERROR_STASH_SHARED #undef DUK__PACK_ARGS #undef DUK__READABLE_ERRMSG_MAXCHARS #undef DUK__READABLE_STRING_MAXCHARS #undef DUK__READABLE_SUMMARY_MAXCHARS #line 1 "duk_api_string.c" /* * String manipulation */ /* #include duk_internal.h -> already included */ DUK_LOCAL void duk__concat_and_join_helper(duk_hthread *thr, duk_idx_t count_in, duk_bool_t is_join) { duk_uint_t count; duk_uint_t i; duk_size_t idx; duk_size_t len; duk_hstring *h; duk_uint8_t *buf; DUK_ASSERT_CTX_VALID(thr); if (DUK_UNLIKELY(count_in <= 0)) { if (count_in < 0) { DUK_ERROR_RANGE_INVALID_COUNT(thr); return; } DUK_ASSERT(count_in == 0); duk_push_hstring_empty(thr); return; } count = (duk_uint_t) count_in; if (is_join) { duk_size_t t1, t2, limit; h = duk_to_hstring(thr, -((duk_idx_t) count) - 1); DUK_ASSERT(h != NULL); /* A bit tricky overflow test, see doc/code-issues.rst. */ t1 = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h); t2 = (duk_size_t) (count - 1); limit = (duk_size_t) DUK_HSTRING_MAX_BYTELEN; if (DUK_UNLIKELY(t2 != 0 && t1 > limit / t2)) { /* Combined size of separators already overflows. */ goto error_overflow; } len = (duk_size_t) (t1 * t2); } else { len = (duk_size_t) 0; } for (i = count; i >= 1; i--) { duk_size_t new_len; h = duk_to_hstring(thr, -((duk_idx_t) i)); new_len = len + (duk_size_t) DUK_HSTRING_GET_BYTELEN(h); /* Impose a string maximum length, need to handle overflow * correctly. */ if (new_len < len || /* wrapped */ new_len > (duk_size_t) DUK_HSTRING_MAX_BYTELEN) { goto error_overflow; } len = new_len; } DUK_DDD(DUK_DDDPRINT("join/concat %lu strings, total length %lu bytes", (unsigned long) count, (unsigned long) len)); /* Use stack allocated buffer to ensure reachability in errors * (e.g. intern error). */ buf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, len); DUK_ASSERT(buf != NULL); /* [ ... (sep) str1 str2 ... strN buf ] */ idx = 0; for (i = count; i >= 1; i--) { if (is_join && i != count) { h = duk_require_hstring(thr, -((duk_idx_t) count) - 2); /* extra -1 for buffer */ DUK_MEMCPY(buf + idx, DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h)); idx += DUK_HSTRING_GET_BYTELEN(h); } h = duk_require_hstring(thr, -((duk_idx_t) i) - 1); /* extra -1 for buffer */ DUK_MEMCPY(buf + idx, DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h)); idx += DUK_HSTRING_GET_BYTELEN(h); } DUK_ASSERT(idx == len); /* [ ... (sep) str1 str2 ... strN buf ] */ /* Get rid of the strings early to minimize memory use before intern. */ if (is_join) { duk_replace(thr, -((duk_idx_t) count) - 2); /* overwrite sep */ duk_pop_n(thr, (duk_idx_t) count); } else { duk_replace(thr, -((duk_idx_t) count) - 1); /* overwrite str1 */ duk_pop_n(thr, (duk_idx_t) (count - 1)); } /* [ ... buf ] */ (void) duk_buffer_to_string(thr, -1); /* Safe if inputs are safe. */ /* [ ... res ] */ return; error_overflow: DUK_ERROR_RANGE(thr, DUK_STR_RESULT_TOO_LONG); } DUK_EXTERNAL void duk_concat(duk_hthread *thr, duk_idx_t count) { DUK_ASSERT_API_ENTRY(thr); duk__concat_and_join_helper(thr, count, 0 /*is_join*/); } #if defined(DUK_USE_PREFER_SIZE) DUK_INTERNAL void duk_concat_2(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); duk_concat(thr, 2); } #else /* DUK_USE_PREFER_SIZE */ DUK_INTERNAL void duk_concat_2(duk_hthread *thr) { duk_hstring *h1; duk_hstring *h2; duk_uint8_t *buf; duk_size_t len1; duk_size_t len2; duk_size_t len; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(duk_get_top(thr) >= 2); /* Trusted caller. */ h1 = duk_to_hstring(thr, -2); h2 = duk_to_hstring(thr, -1); len1 = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h1); len2 = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h2); len = len1 + len2; if (DUK_UNLIKELY(len < len1 || /* wrapped */ len > (duk_size_t) DUK_HSTRING_MAX_BYTELEN)) { goto error_overflow; } buf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, len); DUK_ASSERT(buf != NULL); DUK_MEMCPY((void *) buf, (const void *) DUK_HSTRING_GET_DATA(h1), (size_t) len1); DUK_MEMCPY((void *) (buf + len1), (const void *) DUK_HSTRING_GET_DATA(h2), (size_t) len2); (void) duk_buffer_to_string(thr, -1); /* Safe if inputs are safe. */ /* [ ... str1 str2 buf ] */ duk_replace(thr, -3); duk_pop_unsafe(thr); return; error_overflow: DUK_ERROR_RANGE(thr, DUK_STR_RESULT_TOO_LONG); } #endif /* DUK_USE_PREFER_SIZE */ DUK_EXTERNAL void duk_join(duk_hthread *thr, duk_idx_t count) { DUK_ASSERT_API_ENTRY(thr); duk__concat_and_join_helper(thr, count, 1 /*is_join*/); } /* XXX: could map/decode be unified with duk_unicode_support.c code? * Case conversion needs also the character surroundings though. */ DUK_EXTERNAL void duk_decode_string(duk_hthread *thr, duk_idx_t idx, duk_decode_char_function callback, void *udata) { duk_hstring *h_input; const duk_uint8_t *p, *p_start, *p_end; duk_codepoint_t cp; DUK_ASSERT_API_ENTRY(thr); h_input = duk_require_hstring(thr, idx); /* Accept symbols. */ DUK_ASSERT(h_input != NULL); p_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_input); p_end = p_start + DUK_HSTRING_GET_BYTELEN(h_input); p = p_start; for (;;) { if (p >= p_end) { break; } cp = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(thr, &p, p_start, p_end); callback(udata, cp); } } DUK_EXTERNAL void duk_map_string(duk_hthread *thr, duk_idx_t idx, duk_map_char_function callback, void *udata) { duk_hstring *h_input; duk_bufwriter_ctx bw_alloc; duk_bufwriter_ctx *bw; const duk_uint8_t *p, *p_start, *p_end; duk_codepoint_t cp; DUK_ASSERT_API_ENTRY(thr); idx = duk_normalize_index(thr, idx); h_input = duk_require_hstring(thr, idx); /* Accept symbols. */ DUK_ASSERT(h_input != NULL); bw = &bw_alloc; DUK_BW_INIT_PUSHBUF(thr, bw, DUK_HSTRING_GET_BYTELEN(h_input)); /* Reasonable output estimate. */ p_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_input); p_end = p_start + DUK_HSTRING_GET_BYTELEN(h_input); p = p_start; for (;;) { /* XXX: could write output in chunks with fewer ensure calls, * but relative benefit would be small here. */ if (p >= p_end) { break; } cp = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(thr, &p, p_start, p_end); cp = callback(udata, cp); DUK_BW_WRITE_ENSURE_XUTF8(thr, bw, cp); } DUK_BW_COMPACT(thr, bw); (void) duk_buffer_to_string(thr, -1); /* Safe, extended UTF-8 encoded. */ duk_replace(thr, idx); } DUK_EXTERNAL void duk_substring(duk_hthread *thr, duk_idx_t idx, duk_size_t start_offset, duk_size_t end_offset) { duk_hstring *h; duk_hstring *res; duk_size_t start_byte_offset; duk_size_t end_byte_offset; duk_size_t charlen; DUK_ASSERT_API_ENTRY(thr); idx = duk_require_normalize_index(thr, idx); /* Accept symbols. */ h = duk_require_hstring(thr, idx); DUK_ASSERT(h != NULL); charlen = DUK_HSTRING_GET_CHARLEN(h); if (end_offset >= charlen) { end_offset = charlen; } if (start_offset > end_offset) { start_offset = end_offset; } DUK_ASSERT_DISABLE(start_offset >= 0); DUK_ASSERT(start_offset <= end_offset && start_offset <= DUK_HSTRING_GET_CHARLEN(h)); DUK_ASSERT_DISABLE(end_offset >= 0); DUK_ASSERT(end_offset >= start_offset && end_offset <= DUK_HSTRING_GET_CHARLEN(h)); /* Guaranteed by string limits. */ DUK_ASSERT(start_offset <= DUK_UINT32_MAX); DUK_ASSERT(end_offset <= DUK_UINT32_MAX); start_byte_offset = (duk_size_t) duk_heap_strcache_offset_char2byte(thr, h, (duk_uint_fast32_t) start_offset); end_byte_offset = (duk_size_t) duk_heap_strcache_offset_char2byte(thr, h, (duk_uint_fast32_t) end_offset); DUK_ASSERT(end_byte_offset >= start_byte_offset); DUK_ASSERT(end_byte_offset - start_byte_offset <= DUK_UINT32_MAX); /* Guaranteed by string limits. */ /* No size check is necessary. */ res = duk_heap_strtable_intern_checked(thr, DUK_HSTRING_GET_DATA(h) + start_byte_offset, (duk_uint32_t) (end_byte_offset - start_byte_offset)); duk_push_hstring(thr, res); duk_replace(thr, idx); } /* XXX: this is quite clunky. Add Unicode helpers to scan backwards and * forwards with a callback to process codepoints? */ DUK_EXTERNAL void duk_trim(duk_hthread *thr, duk_idx_t idx) { duk_hstring *h; const duk_uint8_t *p, *p_start, *p_end, *p_tmp1, *p_tmp2; /* pointers for scanning */ const duk_uint8_t *q_start, *q_end; /* start (incl) and end (excl) of trimmed part */ duk_codepoint_t cp; DUK_ASSERT_API_ENTRY(thr); idx = duk_require_normalize_index(thr, idx); /* Accept symbols. */ h = duk_require_hstring(thr, idx); DUK_ASSERT(h != NULL); p_start = DUK_HSTRING_GET_DATA(h); p_end = p_start + DUK_HSTRING_GET_BYTELEN(h); p = p_start; while (p < p_end) { p_tmp1 = p; cp = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(thr, &p_tmp1, p_start, p_end); if (!(duk_unicode_is_whitespace(cp) || duk_unicode_is_line_terminator(cp))) { break; } p = p_tmp1; } q_start = p; if (p == p_end) { /* Entire string is whitespace. */ q_end = p; goto scan_done; } p = p_end; while (p > p_start) { p_tmp1 = p; while (p > p_start) { p--; if (((*p) & 0xc0) != 0x80) { break; } } p_tmp2 = p; cp = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(thr, &p_tmp2, p_start, p_end); if (!(duk_unicode_is_whitespace(cp) || duk_unicode_is_line_terminator(cp))) { p = p_tmp1; break; } } q_end = p; scan_done: /* This may happen when forward and backward scanning disagree * (possible for non-extended-UTF-8 strings). */ if (q_end < q_start) { q_end = q_start; } DUK_ASSERT(q_start >= p_start && q_start <= p_end); DUK_ASSERT(q_end >= p_start && q_end <= p_end); DUK_ASSERT(q_end >= q_start); DUK_DDD(DUK_DDDPRINT("trim: p_start=%p, p_end=%p, q_start=%p, q_end=%p", (const void *) p_start, (const void *) p_end, (const void *) q_start, (const void *) q_end)); if (q_start == p_start && q_end == p_end) { DUK_DDD(DUK_DDDPRINT("nothing was trimmed: avoid interning (hashing etc)")); return; } duk_push_lstring(thr, (const char *) q_start, (duk_size_t) (q_end - q_start)); duk_replace(thr, idx); } DUK_EXTERNAL duk_codepoint_t duk_char_code_at(duk_hthread *thr, duk_idx_t idx, duk_size_t char_offset) { duk_hstring *h; duk_ucodepoint_t cp; DUK_ASSERT_API_ENTRY(thr); /* XXX: Share code with String.prototype.charCodeAt? Main difference * is handling of clamped offsets. */ h = duk_require_hstring(thr, idx); /* Accept symbols. */ DUK_ASSERT(h != NULL); DUK_ASSERT_DISABLE(char_offset >= 0); /* Always true, arg is unsigned. */ if (char_offset >= DUK_HSTRING_GET_CHARLEN(h)) { return 0; } DUK_ASSERT(char_offset <= DUK_UINT_MAX); /* Guaranteed by string limits. */ cp = duk_hstring_char_code_at_raw(thr, h, (duk_uint_t) char_offset, 0 /*surrogate_aware*/); return (duk_codepoint_t) cp; } #line 1 "duk_api_time.c" /* * Date/time. */ /* #include duk_internal.h -> already included */ DUK_INTERNAL duk_double_t duk_time_get_ecmascript_time(duk_hthread *thr) { /* Ecmascript time, with millisecond fractions. Exposed via * duk_get_now() for example. */ DUK_UNREF(thr); return (duk_double_t) DUK_USE_DATE_GET_NOW(thr); } DUK_INTERNAL duk_double_t duk_time_get_ecmascript_time_nofrac(duk_hthread *thr) { /* Ecmascript time without millisecond fractions. Exposed via * the Date built-in which doesn't allow fractions. */ DUK_UNREF(thr); return (duk_double_t) DUK_FLOOR(DUK_USE_DATE_GET_NOW(thr)); } DUK_INTERNAL duk_double_t duk_time_get_monotonic_time(duk_hthread *thr) { DUK_UNREF(thr); #if defined(DUK_USE_GET_MONOTONIC_TIME) return (duk_double_t) DUK_USE_GET_MONOTONIC_TIME(thr); #else return (duk_double_t) DUK_USE_DATE_GET_NOW(thr); #endif } DUK_EXTERNAL duk_double_t duk_get_now(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); DUK_UNREF(thr); /* This API intentionally allows millisecond fractions. */ return duk_time_get_ecmascript_time(thr); } #if 0 /* XXX: worth exposing? */ DUK_EXTERNAL duk_double_t duk_get_monotonic_time(duk_hthread *thr) { DUK_ASSERT_API_ENTRY(thr); DUK_UNREF(thr); return duk_time_get_monotonic_time(thr); } #endif DUK_EXTERNAL void duk_time_to_components(duk_hthread *thr, duk_double_t timeval, duk_time_components *comp) { duk_int_t parts[DUK_DATE_IDX_NUM_PARTS]; duk_double_t dparts[DUK_DATE_IDX_NUM_PARTS]; duk_uint_t flags; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(comp != NULL); /* XXX: or check? */ DUK_UNREF(thr); /* Convert as one-based, but change month to zero-based to match the * Ecmascript Date built-in behavior 1:1. */ flags = DUK_DATE_FLAG_ONEBASED | DUK_DATE_FLAG_NAN_TO_ZERO; duk_bi_date_timeval_to_parts(timeval, parts, dparts, flags); /* XXX: sub-millisecond accuracy for the API */ DUK_ASSERT(dparts[DUK_DATE_IDX_MONTH] >= 1.0 && dparts[DUK_DATE_IDX_MONTH] <= 12.0); comp->year = dparts[DUK_DATE_IDX_YEAR]; comp->month = dparts[DUK_DATE_IDX_MONTH] - 1.0; comp->day = dparts[DUK_DATE_IDX_DAY]; comp->hours = dparts[DUK_DATE_IDX_HOUR]; comp->minutes = dparts[DUK_DATE_IDX_MINUTE]; comp->seconds = dparts[DUK_DATE_IDX_SECOND]; comp->milliseconds = dparts[DUK_DATE_IDX_MILLISECOND]; comp->weekday = dparts[DUK_DATE_IDX_WEEKDAY]; } DUK_EXTERNAL duk_double_t duk_components_to_time(duk_hthread *thr, duk_time_components *comp) { duk_double_t d; duk_double_t dparts[DUK_DATE_IDX_NUM_PARTS]; duk_uint_t flags; DUK_ASSERT_API_ENTRY(thr); DUK_ASSERT(comp != NULL); /* XXX: or check? */ DUK_UNREF(thr); /* Match Date constructor behavior (with UTC time). Month is given * as zero-based. Day-of-month is given as one-based so normalize * it to zero-based as the internal conversion helpers expects all * components to be zero-based. */ flags = 0; /* XXX: expensive conversion; use array format in API instead, or unify * time provider and time API to use same struct? */ dparts[DUK_DATE_IDX_YEAR] = comp->year; dparts[DUK_DATE_IDX_MONTH] = comp->month; dparts[DUK_DATE_IDX_DAY] = comp->day - 1.0; dparts[DUK_DATE_IDX_HOUR] = comp->hours; dparts[DUK_DATE_IDX_MINUTE] = comp->minutes; dparts[DUK_DATE_IDX_SECOND] = comp->seconds; dparts[DUK_DATE_IDX_MILLISECOND] = comp->milliseconds; dparts[DUK_DATE_IDX_WEEKDAY] = 0; /* ignored */ d = duk_bi_date_get_timeval_from_dparts(dparts, flags); return d; } #line 1 "duk_bi_array.c" /* * Array built-ins * * Most Array built-ins are intentionally generic in Ecmascript, and are * intended to work even when the 'this' binding is not an Array instance. * This Ecmascript feature is also used by much real world code. For this * reason the implementations here don't assume exotic Array behavior or * e.g. presence of a .length property. However, some algorithms have a * fast path for duk_harray backed actual Array instances, enabled when * footprint is not a concern. * * XXX: the "Throw" flag should be set for (almost?) all [[Put]] and * [[Delete]] operations, but it's currently false throughout. Go through * all put/delete cases and check throw flag use. Need a new API primitive * which allows throws flag to be specified. * * XXX: array lengths above 2G won't work reliably. There are many places * where one needs a full signed 32-bit range ([-0xffffffff, 0xffffffff], * i.e. -33- bits). Although array 'length' cannot be written to be outside * the unsigned 32-bit range (E5.1 Section 15.4.5.1 throws a RangeError if so) * some intermediate values may be above 0xffffffff and this may not be always * correctly handled now (duk_uint32_t is not enough for all algorithms). * For instance, push() can legitimately write entries beyond length 0xffffffff * and cause a RangeError only at the end. To do this properly, the current * push() implementation tracks the array index using a 'double' instead of a * duk_uint32_t (which is somewhat awkward). See test-bi-array-push-maxlen.js. * * On using "put" vs. "def" prop * ============================= * * Code below must be careful to use the appropriate primitive as it matters * for compliance. When using "put" there may be inherited properties in * Array.prototype which cause side effects when values are written. When * using "define" there are no such side effects, and many test262 test cases * check for this (for real world code, such side effects are very rare). * Both "put" and "define" are used in the E5.1 specification; as a rule, * "put" is used when modifying an existing array (or a non-array 'this' * binding) and "define" for setting values into a fresh result array. */ /* #include duk_internal.h -> already included */ /* Perform an intermediate join when this many elements have been pushed * on the value stack. */ #define DUK__ARRAY_MID_JOIN_LIMIT 4096 #if defined(DUK_USE_ARRAY_BUILTIN) /* * Shared helpers. */ /* Shared entry code for many Array built-ins: the 'this' binding is pushed * on the value stack and object coerced, and the current .length is returned. * Note that length is left on stack (it could be popped, but that's not * usually necessary because call handling will clean it up automatically). */ DUK_LOCAL duk_uint32_t duk__push_this_obj_len_u32(duk_hthread *thr) { duk_uint32_t len; /* XXX: push more directly? */ (void) duk_push_this_coercible_to_object(thr); DUK_ASSERT_HOBJECT_VALID(duk_get_hobject(thr, -1)); duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_LENGTH); len = duk_to_uint32(thr, -1); /* -> [ ... ToObject(this) ToUint32(length) ] */ return len; } DUK_LOCAL duk_uint32_t duk__push_this_obj_len_u32_limited(duk_hthread *thr) { /* Range limited to [0, 0x7fffffff] range, i.e. range that can be * represented with duk_int32_t. Use this when the method doesn't * handle the full 32-bit unsigned range correctly. */ duk_uint32_t ret = duk__push_this_obj_len_u32(thr); if (DUK_UNLIKELY(ret >= 0x80000000UL)) { DUK_ERROR_RANGE_INVALID_LENGTH(thr); } return ret; } #if defined(DUK_USE_ARRAY_FASTPATH) /* Check if 'this' binding is an Array instance (duk_harray) which satisfies * a few other guarantees for fast path operation. The fast path doesn't * need to handle all operations, even for duk_harrays, but must handle a * significant fraction to improve performance. Return a non-NULL duk_harray * pointer when all fast path criteria are met, NULL otherwise. */ DUK_LOCAL duk_harray *duk__arraypart_fastpath_this(duk_hthread *thr) { duk_tval *tv; duk_hobject *h; duk_uint_t flags_mask, flags_bits, flags_value; DUK_ASSERT(thr->valstack_bottom > thr->valstack); /* because call in progress */ tv = DUK_GET_THIS_TVAL_PTR(thr); /* Fast path requires that 'this' is a duk_harray. Read only arrays * (ROM backed) are also rejected for simplicity. */ if (!DUK_TVAL_IS_OBJECT(tv)) { DUK_DD(DUK_DDPRINT("reject array fast path: not an object")); return NULL; } h = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h != NULL); flags_mask = DUK_HOBJECT_FLAG_ARRAY_PART | \ DUK_HOBJECT_FLAG_EXOTIC_ARRAY | \ DUK_HEAPHDR_FLAG_READONLY; flags_bits = DUK_HOBJECT_FLAG_ARRAY_PART | \ DUK_HOBJECT_FLAG_EXOTIC_ARRAY; flags_value = DUK_HEAPHDR_GET_FLAGS_RAW((duk_heaphdr *) h); if ((flags_value & flags_mask) != flags_bits) { DUK_DD(DUK_DDPRINT("reject array fast path: object flag check failed")); return NULL; } /* In some cases a duk_harray's 'length' may be larger than the * current array part allocation. Avoid the fast path in these * cases, so that all fast path code can safely assume that all * items in the range [0,length[ are backed by the current array * part allocation. */ if (((duk_harray *) h)->length > DUK_HOBJECT_GET_ASIZE(h)) { DUK_DD(DUK_DDPRINT("reject array fast path: length > array part size")); return NULL; } /* Guarantees for fast path. */ DUK_ASSERT(h != NULL); DUK_ASSERT(DUK_HOBJECT_GET_ASIZE(h) == 0 || DUK_HOBJECT_A_GET_BASE(thr->heap, h) != NULL); DUK_ASSERT(((duk_harray *) h)->length <= DUK_HOBJECT_GET_ASIZE(h)); DUK_DD(DUK_DDPRINT("array fast path allowed for: %!O", (duk_heaphdr *) h)); return (duk_harray *) h; } #endif /* DUK_USE_ARRAY_FASTPATH */ /* * Constructor */ DUK_INTERNAL duk_ret_t duk_bi_array_constructor(duk_hthread *thr) { duk_idx_t nargs; duk_harray *a; duk_double_t d; duk_uint32_t len; duk_uint32_t len_prealloc; nargs = duk_get_top(thr); if (nargs == 1 && duk_is_number(thr, 0)) { /* XXX: expensive check (also shared elsewhere - so add a shared internal API call?) */ d = duk_get_number(thr, 0); len = duk_to_uint32(thr, 0); if (((duk_double_t) len) != d) { DUK_DCERROR_RANGE_INVALID_LENGTH(thr); } /* For small lengths create a dense preallocated array. * For large arrays preallocate an initial part. */ len_prealloc = len < 64 ? len : 64; a = duk_push_harray_with_size(thr, len_prealloc); DUK_ASSERT(a != NULL); a->length = len; return 1; } duk_pack(thr, nargs); return 1; } /* * isArray() */ DUK_INTERNAL duk_ret_t duk_bi_array_constructor_is_array(duk_hthread *thr) { duk_hobject *h; h = duk_get_hobject_with_class(thr, 0, DUK_HOBJECT_CLASS_ARRAY); duk_push_boolean(thr, (h != NULL)); return 1; } /* * toString() */ DUK_INTERNAL duk_ret_t duk_bi_array_prototype_to_string(duk_hthread *thr) { (void) duk_push_this_coercible_to_object(thr); duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_JOIN); /* [ ... this func ] */ if (!duk_is_callable(thr, -1)) { /* Fall back to the initial (original) Object.toString(). We don't * currently have pointers to the built-in functions, only the top * level global objects (like "Array") so this is now done in a bit * of a hacky manner. It would be cleaner to push the (original) * function and use duk_call_method(). */ /* XXX: 'this' will be ToObject() coerced twice, which is incorrect * but should have no visible side effects. */ DUK_DDD(DUK_DDDPRINT("this.join is not callable, fall back to (original) Object.toString")); duk_set_top(thr, 0); return duk_bi_object_prototype_to_string(thr); /* has access to 'this' binding */ } /* [ ... this func ] */ duk_insert(thr, -2); /* [ ... func this ] */ DUK_DDD(DUK_DDDPRINT("calling: func=%!iT, this=%!iT", (duk_tval *) duk_get_tval(thr, -2), (duk_tval *) duk_get_tval(thr, -1))); duk_call_method(thr, 0); return 1; } /* * concat() */ DUK_INTERNAL duk_ret_t duk_bi_array_prototype_concat(duk_hthread *thr) { duk_idx_t i, n; duk_uarridx_t idx, idx_last; duk_uarridx_t j, len; duk_hobject *h; /* XXX: the insert here is a bit expensive if there are a lot of items. * It could also be special cased in the outermost for loop quite easily * (as the element is dup()'d anyway). */ (void) duk_push_this_coercible_to_object(thr); duk_insert(thr, 0); n = duk_get_top(thr); duk_push_array(thr); /* -> [ ToObject(this) item1 ... itemN arr ] */ /* NOTE: The Array special behaviors are NOT invoked by duk_xdef_prop_index() * (which differs from the official algorithm). If no error is thrown, this * doesn't matter as the length is updated at the end. However, if an error * is thrown, the length will be unset. That shouldn't matter because the * caller won't get a reference to the intermediate value. */ idx = 0; idx_last = 0; for (i = 0; i < n; i++) { DUK_ASSERT_TOP(thr, n + 1); /* [ ToObject(this) item1 ... itemN arr ] */ duk_dup(thr, i); h = duk_get_hobject_with_class(thr, -1, DUK_HOBJECT_CLASS_ARRAY); if (!h) { duk_xdef_prop_index_wec(thr, -2, idx++); idx_last = idx; continue; } /* [ ToObject(this) item1 ... itemN arr item(i) ] */ /* XXX: an array can have length higher than 32 bits; this is not handled * correctly now. */ len = (duk_uarridx_t) duk_get_length(thr, -1); for (j = 0; j < len; j++) { if (duk_get_prop_index(thr, -1, j)) { /* [ ToObject(this) item1 ... itemN arr item(i) item(i)[j] ] */ duk_xdef_prop_index_wec(thr, -3, idx++); idx_last = idx; } else { idx++; duk_pop_undefined(thr); #if defined(DUK_USE_NONSTD_ARRAY_CONCAT_TRAILER) /* According to E5.1 Section 15.4.4.4 nonexistent trailing * elements do not affect 'length' of the result. Test262 * and other engines disagree, so update idx_last here too. */ idx_last = idx; #else /* Strict standard behavior, ignore trailing elements for * result 'length'. */ #endif } } duk_pop_unsafe(thr); } /* The E5.1 Section 15.4.4.4 algorithm doesn't set the length explicitly * in the end, but because we're operating with an internal value which * is known to be an array, this should be equivalent. */ duk_push_uarridx(thr, idx_last); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_W); DUK_ASSERT_TOP(thr, n + 1); return 1; } /* * join(), toLocaleString() * * Note: checking valstack is necessary, but only in the per-element loop. * * Note: the trivial approach of pushing all the elements on the value stack * and then calling duk_join() fails when the array contains a large number * of elements. This problem can't be offloaded to duk_join() because the * elements to join must be handled here and have special handling. Current * approach is to do intermediate joins with very large number of elements. * There is no fancy handling; the prefix gets re-joined multiple times. */ DUK_INTERNAL duk_ret_t duk_bi_array_prototype_join_shared(duk_hthread *thr) { duk_uint32_t len, count; duk_uint32_t idx; duk_small_int_t to_locale_string = duk_get_current_magic(thr); duk_idx_t valstack_required; /* For join(), nargs is 1. For toLocaleString(), nargs is 0 and * setting the top essentially pushes an undefined to the stack, * thus defaulting to a comma separator. */ duk_set_top(thr, 1); if (duk_is_undefined(thr, 0)) { duk_pop_undefined(thr); duk_push_hstring_stridx(thr, DUK_STRIDX_COMMA); } else { duk_to_string(thr, 0); } len = duk__push_this_obj_len_u32(thr); /* [ sep ToObject(this) len ] */ DUK_DDD(DUK_DDDPRINT("sep=%!T, this=%!T, len=%lu", (duk_tval *) duk_get_tval(thr, 0), (duk_tval *) duk_get_tval(thr, 1), (unsigned long) len)); /* The extra (+4) is tight. */ valstack_required = (duk_idx_t) ((len >= DUK__ARRAY_MID_JOIN_LIMIT ? DUK__ARRAY_MID_JOIN_LIMIT : len) + 4); duk_require_stack(thr, valstack_required); duk_dup_0(thr); /* [ sep ToObject(this) len sep ] */ count = 0; idx = 0; for (;;) { DUK_DDD(DUK_DDDPRINT("join idx=%ld", (long) idx)); if (count >= DUK__ARRAY_MID_JOIN_LIMIT || /* intermediate join to avoid valstack overflow */ idx >= len) { /* end of loop (careful with len==0) */ /* [ sep ToObject(this) len sep str0 ... str(count-1) ] */ DUK_DDD(DUK_DDDPRINT("mid/final join, count=%ld, idx=%ld, len=%ld", (long) count, (long) idx, (long) len)); duk_join(thr, (duk_idx_t) count); /* -> [ sep ToObject(this) len str ] */ duk_dup_0(thr); /* -> [ sep ToObject(this) len str sep ] */ duk_insert(thr, -2); /* -> [ sep ToObject(this) len sep str ] */ count = 1; } if (idx >= len) { /* if true, the stack already contains the final result */ break; } duk_get_prop_index(thr, 1, (duk_uarridx_t) idx); if (duk_is_null_or_undefined(thr, -1)) { duk_pop_nodecref_unsafe(thr); duk_push_hstring_empty(thr); } else { if (to_locale_string) { duk_to_object(thr, -1); duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_TO_LOCALE_STRING); duk_insert(thr, -2); /* -> [ ... toLocaleString ToObject(val) ] */ duk_call_method(thr, 0); } duk_to_string(thr, -1); } count++; idx++; } /* [ sep ToObject(this) len sep result ] */ return 1; } /* * pop(), push() */ #if defined(DUK_USE_ARRAY_FASTPATH) DUK_LOCAL duk_ret_t duk__array_pop_fastpath(duk_hthread *thr, duk_harray *h_arr) { duk_tval *tv_arraypart; duk_tval *tv_val; duk_uint32_t len; tv_arraypart = DUK_HOBJECT_A_GET_BASE(thr->heap, (duk_hobject *) h_arr); len = h_arr->length; if (len <= 0) { /* nop, return undefined */ return 0; } len--; h_arr->length = len; /* Fast path doesn't check for an index property inherited from * Array.prototype. This is quite often acceptable; if not, * disable fast path. */ DUK_ASSERT_VS_SPACE(thr); tv_val = tv_arraypart + len; if (DUK_TVAL_IS_UNUSED(tv_val)) { /* No net refcount change. Value stack already has * 'undefined' based on value stack init policy. */ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top)); DUK_ASSERT(DUK_TVAL_IS_UNUSED(tv_val)); } else { /* No net refcount change. */ DUK_TVAL_SET_TVAL(thr->valstack_top, tv_val); DUK_TVAL_SET_UNUSED(tv_val); } thr->valstack_top++; /* XXX: there's no shrink check in the fast path now */ return 1; } #endif /* DUK_USE_ARRAY_FASTPATH */ DUK_INTERNAL duk_ret_t duk_bi_array_prototype_pop(duk_hthread *thr) { duk_uint32_t len; duk_uint32_t idx; #if defined(DUK_USE_ARRAY_FASTPATH) duk_harray *h_arr; #endif DUK_ASSERT_TOP(thr, 0); #if defined(DUK_USE_ARRAY_FASTPATH) h_arr = duk__arraypart_fastpath_this(thr); if (h_arr) { return duk__array_pop_fastpath(thr, h_arr); } #endif /* XXX: Merge fastpath check into a related call (push this, coerce length, etc)? */ len = duk__push_this_obj_len_u32(thr); if (len == 0) { duk_push_int(thr, 0); duk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LENGTH); return 0; } idx = len - 1; duk_get_prop_index(thr, 0, (duk_uarridx_t) idx); duk_del_prop_index(thr, 0, (duk_uarridx_t) idx); duk_push_u32(thr, idx); duk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LENGTH); return 1; } #if defined(DUK_USE_ARRAY_FASTPATH) DUK_LOCAL duk_ret_t duk__array_push_fastpath(duk_hthread *thr, duk_harray *h_arr) { duk_tval *tv_arraypart; duk_tval *tv_src; duk_tval *tv_dst; duk_uint32_t len; duk_idx_t i, n; len = h_arr->length; tv_arraypart = DUK_HOBJECT_A_GET_BASE(thr->heap, (duk_hobject *) h_arr); n = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom); DUK_ASSERT(n >= 0); DUK_ASSERT((duk_uint32_t) n <= DUK_UINT32_MAX); if (DUK_UNLIKELY(len + (duk_uint32_t) n < len)) { DUK_D(DUK_DPRINT("Array.prototype.push() would go beyond 32-bit length, throw")); DUK_DCERROR_RANGE_INVALID_LENGTH(thr); /* != 0 return value returned as is by caller */ } if (len + (duk_uint32_t) n > DUK_HOBJECT_GET_ASIZE((duk_hobject *) h_arr)) { /* Array part would need to be extended. Rely on slow path * for now. * * XXX: Rework hobject code a bit and add extend support. */ return 0; } tv_src = thr->valstack_bottom; tv_dst = tv_arraypart + len; for (i = 0; i < n; i++) { /* No net refcount change; reset value stack values to * undefined to satisfy value stack init policy. */ DUK_TVAL_SET_TVAL(tv_dst, tv_src); DUK_TVAL_SET_UNDEFINED(tv_src); tv_src++; tv_dst++; } thr->valstack_top = thr->valstack_bottom; len += (duk_uint32_t) n; h_arr->length = len; DUK_ASSERT((duk_uint_t) len == len); duk_push_uint(thr, (duk_uint_t) len); return 1; } #endif /* DUK_USE_ARRAY_FASTPATH */ DUK_INTERNAL duk_ret_t duk_bi_array_prototype_push(duk_hthread *thr) { /* Note: 'this' is not necessarily an Array object. The push() * algorithm is supposed to work for other kinds of objects too, * so the algorithm has e.g. an explicit update for the 'length' * property which is normally "magical" in arrays. */ duk_uint32_t len; duk_idx_t i, n; #if defined(DUK_USE_ARRAY_FASTPATH) duk_harray *h_arr; #endif #if defined(DUK_USE_ARRAY_FASTPATH) h_arr = duk__arraypart_fastpath_this(thr); if (h_arr) { duk_ret_t rc; rc = duk__array_push_fastpath(thr, h_arr); if (rc != 0) { return rc; } DUK_DD(DUK_DDPRINT("array push() fast path exited, resize case")); } #endif n = duk_get_top(thr); len = duk__push_this_obj_len_u32(thr); /* [ arg1 ... argN obj length ] */ /* Technically Array.prototype.push() can create an Array with length * longer than 2^32-1, i.e. outside the 32-bit range. The final length * is *not* wrapped to 32 bits in the specification. * * This implementation tracks length with a uint32 because it's much * more practical. * * See: test-bi-array-push-maxlen.js. */ if (len + (duk_uint32_t) n < len) { DUK_D(DUK_DPRINT("Array.prototype.push() would go beyond 32-bit length, throw")); DUK_DCERROR_RANGE_INVALID_LENGTH(thr); } for (i = 0; i < n; i++) { duk_dup(thr, i); duk_put_prop_index(thr, -3, (duk_uarridx_t) (len + (duk_uint32_t) i)); } len += (duk_uint32_t) n; duk_push_u32(thr, len); duk_dup_top(thr); duk_put_prop_stridx_short(thr, -4, DUK_STRIDX_LENGTH); /* [ arg1 ... argN obj length new_length ] */ return 1; } /* * sort() * * Currently qsort with random pivot. This is now really, really slow, * because there is no fast path for array parts. * * Signed indices are used because qsort() leaves and degenerate cases * may use a negative offset. */ DUK_LOCAL duk_small_int_t duk__array_sort_compare(duk_hthread *thr, duk_int_t idx1, duk_int_t idx2) { duk_bool_t have1, have2; duk_bool_t undef1, undef2; duk_small_int_t ret; duk_idx_t idx_obj = 1; /* fixed offsets in valstack */ duk_idx_t idx_fn = 0; duk_hstring *h1, *h2; /* Fast exit if indices are identical. This is valid for a non-existent property, * for an undefined value, and almost always for ToString() coerced comparison of * arbitrary values (corner cases where this is not the case include e.g. a an * object with varying ToString() coercion). * * The specification does not prohibit "caching" of values read from the array, so * assuming equality for comparing an index with itself falls into the category of * "caching". * * Also, compareFn may be inconsistent, so skipping a call to compareFn here may * have an effect on the final result. The specification does not require any * specific behavior for inconsistent compare functions, so again, this fast path * is OK. */ if (idx1 == idx2) { DUK_DDD(DUK_DDDPRINT("duk__array_sort_compare: idx1=%ld, idx2=%ld -> indices identical, quick exit", (long) idx1, (long) idx2)); return 0; } have1 = duk_get_prop_index(thr, idx_obj, (duk_uarridx_t) idx1); have2 = duk_get_prop_index(thr, idx_obj, (duk_uarridx_t) idx2); DUK_DDD(DUK_DDDPRINT("duk__array_sort_compare: idx1=%ld, idx2=%ld, have1=%ld, have2=%ld, val1=%!T, val2=%!T", (long) idx1, (long) idx2, (long) have1, (long) have2, (duk_tval *) duk_get_tval(thr, -2), (duk_tval *) duk_get_tval(thr, -1))); if (have1) { if (have2) { ; } else { ret = -1; goto pop_ret; } } else { if (have2) { ret = 1; goto pop_ret; } else { ret = 0; goto pop_ret; } } undef1 = duk_is_undefined(thr, -2); undef2 = duk_is_undefined(thr, -1); if (undef1) { if (undef2) { ret = 0; goto pop_ret; } else { ret = 1; goto pop_ret; } } else { if (undef2) { ret = -1; goto pop_ret; } else { ; } } if (!duk_is_undefined(thr, idx_fn)) { duk_double_t d; /* No need to check callable; duk_call() will do that. */ duk_dup(thr, idx_fn); /* -> [ ... x y fn ] */ duk_insert(thr, -3); /* -> [ ... fn x y ] */ duk_call(thr, 2); /* -> [ ... res ] */ /* ES5 is a bit vague about what to do if the return value is * not a number. ES2015 provides a concrete description: * http://www.ecma-international.org/ecma-262/6.0/#sec-sortcompare. */ d = duk_to_number_m1(thr); if (d < 0.0) { ret = -1; } else if (d > 0.0) { ret = 1; } else { /* Because NaN compares to false, NaN is handled here * without an explicit check above. */ ret = 0; } duk_pop_nodecref_unsafe(thr); DUK_DDD(DUK_DDDPRINT("-> result %ld (from comparefn, after coercion)", (long) ret)); return ret; } /* string compare is the default (a bit oddly) */ /* XXX: any special handling for plain array; causes repeated coercion now? */ h1 = duk_to_hstring(thr, -2); h2 = duk_to_hstring_m1(thr); DUK_ASSERT(h1 != NULL); DUK_ASSERT(h2 != NULL); ret = duk_js_string_compare(h1, h2); /* retval is directly usable */ goto pop_ret; pop_ret: duk_pop_2_unsafe(thr); DUK_DDD(DUK_DDDPRINT("-> result %ld", (long) ret)); return ret; } DUK_LOCAL void duk__array_sort_swap(duk_hthread *thr, duk_int_t l, duk_int_t r) { duk_bool_t have_l, have_r; duk_idx_t idx_obj = 1; /* fixed offset in valstack */ if (l == r) { return; } /* swap elements; deal with non-existent elements correctly */ have_l = duk_get_prop_index(thr, idx_obj, (duk_uarridx_t) l); have_r = duk_get_prop_index(thr, idx_obj, (duk_uarridx_t) r); if (have_r) { /* right exists, [[Put]] regardless whether or not left exists */ duk_put_prop_index(thr, idx_obj, (duk_uarridx_t) l); } else { duk_del_prop_index(thr, idx_obj, (duk_uarridx_t) l); duk_pop_undefined(thr); } if (have_l) { duk_put_prop_index(thr, idx_obj, (duk_uarridx_t) r); } else { duk_del_prop_index(thr, idx_obj, (duk_uarridx_t) r); duk_pop_undefined(thr); } } #if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) /* Debug print which visualizes the qsort partitioning process. */ DUK_LOCAL void duk__debuglog_qsort_state(duk_hthread *thr, duk_int_t lo, duk_int_t hi, duk_int_t pivot) { char buf[4096]; char *ptr = buf; duk_int_t i, n; n = (duk_int_t) duk_get_length(thr, 1); if (n > 4000) { n = 4000; } *ptr++ = '['; for (i = 0; i < n; i++) { if (i == pivot) { *ptr++ = '|'; } else if (i == lo) { *ptr++ = '<'; } else if (i == hi) { *ptr++ = '>'; } else if (i >= lo && i <= hi) { *ptr++ = '-'; } else { *ptr++ = ' '; } } *ptr++ = ']'; *ptr++ = '\0'; DUK_DDD(DUK_DDDPRINT("%s (lo=%ld, hi=%ld, pivot=%ld)", (const char *) buf, (long) lo, (long) hi, (long) pivot)); } #endif DUK_LOCAL void duk__array_qsort(duk_hthread *thr, duk_int_t lo, duk_int_t hi) { duk_int_t p, l, r; /* The lo/hi indices may be crossed and hi < 0 is possible at entry. */ DUK_DDD(DUK_DDDPRINT("duk__array_qsort: lo=%ld, hi=%ld, obj=%!T", (long) lo, (long) hi, (duk_tval *) duk_get_tval(thr, 1))); DUK_ASSERT_TOP(thr, 3); /* In some cases it may be that lo > hi, or hi < 0; these * degenerate cases happen e.g. for empty arrays, and in * recursion leaves. */ /* trivial cases */ if (hi - lo < 1) { DUK_DDD(DUK_DDDPRINT("degenerate case, return immediately")); return; } DUK_ASSERT(hi > lo); DUK_ASSERT(hi - lo + 1 >= 2); /* randomized pivot selection */ p = lo + (duk_int_t) (DUK_UTIL_GET_RANDOM_DOUBLE(thr) * (duk_double_t) (hi - lo + 1)); DUK_ASSERT(p >= lo && p <= hi); DUK_DDD(DUK_DDDPRINT("lo=%ld, hi=%ld, chose pivot p=%ld", (long) lo, (long) hi, (long) p)); /* move pivot out of the way */ duk__array_sort_swap(thr, p, lo); p = lo; DUK_DDD(DUK_DDDPRINT("pivot moved out of the way: %!T", (duk_tval *) duk_get_tval(thr, 1))); l = lo + 1; r = hi; for (;;) { /* find elements to swap */ for (;;) { DUK_DDD(DUK_DDDPRINT("left scan: l=%ld, r=%ld, p=%ld", (long) l, (long) r, (long) p)); if (l >= hi) { break; } if (duk__array_sort_compare(thr, l, p) >= 0) { /* !(l < p) */ break; } l++; } for (;;) { DUK_DDD(DUK_DDDPRINT("right scan: l=%ld, r=%ld, p=%ld", (long) l, (long) r, (long) p)); if (r <= lo) { break; } if (duk__array_sort_compare(thr, p, r) >= 0) { /* !(p < r) */ break; } r--; } if (l >= r) { goto done; } DUK_ASSERT(l < r); DUK_DDD(DUK_DDDPRINT("swap %ld and %ld", (long) l, (long) r)); duk__array_sort_swap(thr, l, r); DUK_DDD(DUK_DDDPRINT("after swap: %!T", (duk_tval *) duk_get_tval(thr, 1))); l++; r--; } done: /* Note that 'l' and 'r' may cross, i.e. r < l */ DUK_ASSERT(l >= lo && l <= hi); DUK_ASSERT(r >= lo && r <= hi); /* XXX: there's no explicit recursion bound here now. For the average * qsort recursion depth O(log n) that's not really necessary: e.g. for * 2**32 recursion depth would be about 32 which is OK. However, qsort * worst case recursion depth is O(n) which may be a problem. */ /* move pivot to its final place */ DUK_DDD(DUK_DDDPRINT("before final pivot swap: %!T", (duk_tval *) duk_get_tval(thr, 1))); duk__array_sort_swap(thr, lo, r); #if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) duk__debuglog_qsort_state(thr, lo, hi, r); #endif DUK_DDD(DUK_DDDPRINT("recurse: pivot=%ld, obj=%!T", (long) r, (duk_tval *) duk_get_tval(thr, 1))); duk__array_qsort(thr, lo, r - 1); duk__array_qsort(thr, r + 1, hi); } DUK_INTERNAL duk_ret_t duk_bi_array_prototype_sort(duk_hthread *thr) { duk_uint32_t len; /* XXX: len >= 0x80000000 won't work below because a signed type * is needed by qsort. */ len = duk__push_this_obj_len_u32_limited(thr); /* stack[0] = compareFn * stack[1] = ToObject(this) * stack[2] = ToUint32(length) */ if (len > 0) { /* avoid degenerate cases, so that (len - 1) won't underflow */ duk__array_qsort(thr, (duk_int_t) 0, (duk_int_t) (len - 1)); } DUK_ASSERT_TOP(thr, 3); duk_pop_nodecref_unsafe(thr); return 1; /* return ToObject(this) */ } /* * splice() */ /* XXX: this compiles to over 500 bytes now, even without special handling * for an array part. Uses signed ints so does not handle full array range correctly. */ /* XXX: can shift() / unshift() use the same helper? * shift() is (close to?) <--> splice(0, 1) * unshift is (close to?) <--> splice(0, 0, [items])? */ DUK_INTERNAL duk_ret_t duk_bi_array_prototype_splice(duk_hthread *thr) { duk_idx_t nargs; duk_uint32_t len_u32; duk_int_t len; duk_bool_t have_delcount; duk_int_t item_count; duk_int_t act_start; duk_int_t del_count; duk_int_t i, n; DUK_UNREF(have_delcount); nargs = duk_get_top(thr); if (nargs < 2) { duk_set_top(thr, 2); nargs = 2; have_delcount = 0; } else { have_delcount = 1; } /* XXX: len >= 0x80000000 won't work below because we need to be * able to represent -len. */ len_u32 = duk__push_this_obj_len_u32_limited(thr); len = (duk_int_t) len_u32; DUK_ASSERT(len >= 0); act_start = duk_to_int_clamped(thr, 0, -len, len); if (act_start < 0) { act_start = len + act_start; } DUK_ASSERT(act_start >= 0 && act_start <= len); #if defined(DUK_USE_NONSTD_ARRAY_SPLICE_DELCOUNT) if (have_delcount) { #endif del_count = duk_to_int_clamped(thr, 1, 0, len - act_start); #if defined(DUK_USE_NONSTD_ARRAY_SPLICE_DELCOUNT) } else { /* E5.1 standard behavior when deleteCount is not given would be * to treat it just like if 'undefined' was given, which coerces * ultimately to 0. Real world behavior is to splice to the end * of array, see test-bi-array-proto-splice-no-delcount.js. */ del_count = len - act_start; } #endif DUK_ASSERT(nargs >= 2); item_count = (duk_int_t) (nargs - 2); DUK_ASSERT(del_count >= 0 && del_count <= len - act_start); DUK_ASSERT(del_count + act_start <= len); /* For now, restrict result array into 32-bit length range. */ if (((duk_double_t) len) - ((duk_double_t) del_count) + ((duk_double_t) item_count) > (duk_double_t) DUK_UINT32_MAX) { DUK_D(DUK_DPRINT("Array.prototype.splice() would go beyond 32-bit length, throw")); DUK_DCERROR_RANGE_INVALID_LENGTH(thr); } duk_push_array(thr); /* stack[0] = start * stack[1] = deleteCount * stack[2...nargs-1] = items * stack[nargs] = ToObject(this) -3 * stack[nargs+1] = ToUint32(length) -2 * stack[nargs+2] = result array -1 */ DUK_ASSERT_TOP(thr, nargs + 3); /* Step 9: copy elements-to-be-deleted into the result array */ for (i = 0; i < del_count; i++) { if (duk_get_prop_index(thr, -3, (duk_uarridx_t) (act_start + i))) { duk_xdef_prop_index_wec(thr, -2, (duk_uarridx_t) i); /* throw flag irrelevant (false in std alg) */ } else { duk_pop_undefined(thr); } } duk_push_u32(thr, (duk_uint32_t) del_count); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_W); /* Steps 12 and 13: reorganize elements to make room for itemCount elements */ if (item_count < del_count) { /* [ A B C D E F G H ] rel_index = 2, del_count 3, item count 1 * -> [ A B F G H ] (conceptual intermediate step) * -> [ A B . F G H ] (placeholder marked) * [ A B C F G H ] (actual result at this point, C will be replaced) */ DUK_ASSERT_TOP(thr, nargs + 3); n = len - del_count; for (i = act_start; i < n; i++) { if (duk_get_prop_index(thr, -3, (duk_uarridx_t) (i + del_count))) { duk_put_prop_index(thr, -4, (duk_uarridx_t) (i + item_count)); } else { duk_pop_undefined(thr); duk_del_prop_index(thr, -3, (duk_uarridx_t) (i + item_count)); } } DUK_ASSERT_TOP(thr, nargs + 3); /* loop iterator init and limit changed from standard algorithm */ n = len - del_count + item_count; for (i = len - 1; i >= n; i--) { duk_del_prop_index(thr, -3, (duk_uarridx_t) i); } DUK_ASSERT_TOP(thr, nargs + 3); } else if (item_count > del_count) { /* [ A B C D E F G H ] rel_index = 2, del_count 3, item count 4 * -> [ A B F G H ] (conceptual intermediate step) * -> [ A B . . . . F G H ] (placeholder marked) * [ A B C D E F F G H ] (actual result at this point) */ DUK_ASSERT_TOP(thr, nargs + 3); /* loop iterator init and limit changed from standard algorithm */ for (i = len - del_count - 1; i >= act_start; i--) { if (duk_get_prop_index(thr, -3, (duk_uarridx_t) (i + del_count))) { duk_put_prop_index(thr, -4, (duk_uarridx_t) (i + item_count)); } else { duk_pop_undefined(thr); duk_del_prop_index(thr, -3, (duk_uarridx_t) (i + item_count)); } } DUK_ASSERT_TOP(thr, nargs + 3); } else { /* [ A B C D E F G H ] rel_index = 2, del_count 3, item count 3 * -> [ A B F G H ] (conceptual intermediate step) * -> [ A B . . . F G H ] (placeholder marked) * [ A B C D E F G H ] (actual result at this point) */ } DUK_ASSERT_TOP(thr, nargs + 3); /* Step 15: insert itemCount elements into the hole made above */ for (i = 0; i < item_count; i++) { duk_dup(thr, i + 2); /* args start at index 2 */ duk_put_prop_index(thr, -4, (duk_uarridx_t) (act_start + i)); } /* Step 16: update length; note that the final length may be above 32 bit range * (but we checked above that this isn't the case here) */ duk_push_u32(thr, (duk_uint32_t) (len - del_count + item_count)); duk_put_prop_stridx_short(thr, -4, DUK_STRIDX_LENGTH); /* result array is already at the top of stack */ DUK_ASSERT_TOP(thr, nargs + 3); return 1; } /* * reverse() */ DUK_INTERNAL duk_ret_t duk_bi_array_prototype_reverse(duk_hthread *thr) { duk_uint32_t len; duk_uint32_t middle; duk_uint32_t lower, upper; duk_bool_t have_lower, have_upper; len = duk__push_this_obj_len_u32(thr); middle = len / 2; /* If len <= 1, middle will be 0 and for-loop bails out * immediately (0 < 0 -> false). */ for (lower = 0; lower < middle; lower++) { DUK_ASSERT(len >= 2); DUK_ASSERT_TOP(thr, 2); DUK_ASSERT(len >= lower + 1); upper = len - lower - 1; have_lower = duk_get_prop_index(thr, -2, (duk_uarridx_t) lower); have_upper = duk_get_prop_index(thr, -3, (duk_uarridx_t) upper); /* [ ToObject(this) ToUint32(length) lowerValue upperValue ] */ if (have_upper) { duk_put_prop_index(thr, -4, (duk_uarridx_t) lower); } else { duk_del_prop_index(thr, -4, (duk_uarridx_t) lower); duk_pop_undefined(thr); } if (have_lower) { duk_put_prop_index(thr, -3, (duk_uarridx_t) upper); } else { duk_del_prop_index(thr, -3, (duk_uarridx_t) upper); duk_pop_undefined(thr); } DUK_ASSERT_TOP(thr, 2); } DUK_ASSERT_TOP(thr, 2); duk_pop_unsafe(thr); /* -> [ ToObject(this) ] */ return 1; } /* * slice() */ DUK_INTERNAL duk_ret_t duk_bi_array_prototype_slice(duk_hthread *thr) { duk_uint32_t len_u32; duk_int_t len; duk_int_t start, end; duk_int_t i; duk_uarridx_t idx; duk_uint32_t res_length = 0; /* XXX: len >= 0x80000000 won't work below because we need to be * able to represent -len. */ len_u32 = duk__push_this_obj_len_u32_limited(thr); len = (duk_int_t) len_u32; DUK_ASSERT(len >= 0); duk_push_array(thr); /* stack[0] = start * stack[1] = end * stack[2] = ToObject(this) * stack[3] = ToUint32(length) * stack[4] = result array */ start = duk_to_int_clamped(thr, 0, -len, len); if (start < 0) { start = len + start; } /* XXX: could duk_is_undefined() provide defaulting undefined to 'len' * (the upper limit)? */ if (duk_is_undefined(thr, 1)) { end = len; } else { end = duk_to_int_clamped(thr, 1, -len, len); if (end < 0) { end = len + end; } } DUK_ASSERT(start >= 0 && start <= len); DUK_ASSERT(end >= 0 && end <= len); idx = 0; for (i = start; i < end; i++) { DUK_ASSERT_TOP(thr, 5); if (duk_get_prop_index(thr, 2, (duk_uarridx_t) i)) { duk_xdef_prop_index_wec(thr, 4, idx); res_length = idx + 1; } else { duk_pop_undefined(thr); } idx++; DUK_ASSERT_TOP(thr, 5); } duk_push_u32(thr, res_length); duk_xdef_prop_stridx_short(thr, 4, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_W); DUK_ASSERT_TOP(thr, 5); return 1; } /* * shift() */ DUK_INTERNAL duk_ret_t duk_bi_array_prototype_shift(duk_hthread *thr) { duk_uint32_t len; duk_uint32_t i; len = duk__push_this_obj_len_u32(thr); if (len == 0) { duk_push_int(thr, 0); duk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LENGTH); return 0; } duk_get_prop_index(thr, 0, 0); /* stack[0] = object (this) * stack[1] = ToUint32(length) * stack[2] = elem at index 0 (retval) */ for (i = 1; i < len; i++) { DUK_ASSERT_TOP(thr, 3); if (duk_get_prop_index(thr, 0, (duk_uarridx_t) i)) { /* fromPresent = true */ duk_put_prop_index(thr, 0, (duk_uarridx_t) (i - 1)); } else { /* fromPresent = false */ duk_del_prop_index(thr, 0, (duk_uarridx_t) (i - 1)); duk_pop_undefined(thr); } } duk_del_prop_index(thr, 0, (duk_uarridx_t) (len - 1)); duk_push_u32(thr, (duk_uint32_t) (len - 1)); duk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LENGTH); DUK_ASSERT_TOP(thr, 3); return 1; } /* * unshift() */ DUK_INTERNAL duk_ret_t duk_bi_array_prototype_unshift(duk_hthread *thr) { duk_idx_t nargs; duk_uint32_t len; duk_uint32_t i; nargs = duk_get_top(thr); len = duk__push_this_obj_len_u32(thr); /* stack[0...nargs-1] = unshift args (vararg) * stack[nargs] = ToObject(this) * stack[nargs+1] = ToUint32(length) */ DUK_ASSERT_TOP(thr, nargs + 2); /* Note: unshift() may operate on indices above unsigned 32-bit range * and the final length may be >= 2**32. However, we restrict the * final result to 32-bit range for practicality. */ if (len + (duk_uint32_t) nargs < len) { DUK_D(DUK_DPRINT("Array.prototype.unshift() would go beyond 32-bit length, throw")); DUK_DCERROR_RANGE_INVALID_LENGTH(thr); } i = len; while (i > 0) { DUK_ASSERT_TOP(thr, nargs + 2); i--; /* k+argCount-1; note that may be above 32-bit range */ if (duk_get_prop_index(thr, -2, (duk_uarridx_t) i)) { /* fromPresent = true */ /* [ ... ToObject(this) ToUint32(length) val ] */ duk_put_prop_index(thr, -3, (duk_uarridx_t) (i + (duk_uint32_t) nargs)); /* -> [ ... ToObject(this) ToUint32(length) ] */ } else { /* fromPresent = false */ /* [ ... ToObject(this) ToUint32(length) val ] */ duk_pop_undefined(thr); duk_del_prop_index(thr, -2, (duk_uarridx_t) (i + (duk_uint32_t) nargs)); /* -> [ ... ToObject(this) ToUint32(length) ] */ } DUK_ASSERT_TOP(thr, nargs + 2); } for (i = 0; i < (duk_uint32_t) nargs; i++) { DUK_ASSERT_TOP(thr, nargs + 2); duk_dup(thr, (duk_idx_t) i); /* -> [ ... ToObject(this) ToUint32(length) arg[i] ] */ duk_put_prop_index(thr, -3, (duk_uarridx_t) i); DUK_ASSERT_TOP(thr, nargs + 2); } DUK_ASSERT_TOP(thr, nargs + 2); duk_push_u32(thr, len + (duk_uint32_t) nargs); duk_dup_top(thr); /* -> [ ... ToObject(this) ToUint32(length) final_len final_len ] */ duk_put_prop_stridx_short(thr, -4, DUK_STRIDX_LENGTH); return 1; } /* * indexOf(), lastIndexOf() */ DUK_INTERNAL duk_ret_t duk_bi_array_prototype_indexof_shared(duk_hthread *thr) { duk_idx_t nargs; duk_int_t i, len; duk_int_t from_idx; duk_small_int_t idx_step = duk_get_current_magic(thr); /* idx_step is +1 for indexOf, -1 for lastIndexOf */ /* lastIndexOf() needs to be a vararg function because we must distinguish * between an undefined fromIndex and a "not given" fromIndex; indexOf() is * made vararg for symmetry although it doesn't strictly need to be. */ nargs = duk_get_top(thr); duk_set_top(thr, 2); /* XXX: must be able to represent -len */ len = (duk_int_t) duk__push_this_obj_len_u32_limited(thr); if (len == 0) { goto not_found; } /* Index clamping is a bit tricky, we must ensure that we'll only iterate * through elements that exist and that the specific requirements from E5.1 * Sections 15.4.4.14 and 15.4.4.15 are fulfilled; especially: * * - indexOf: clamp to [-len,len], negative handling -> [0,len], * if clamped result is len, for-loop bails out immediately * * - lastIndexOf: clamp to [-len-1, len-1], negative handling -> [-1, len-1], * if clamped result is -1, for-loop bails out immediately * * If fromIndex is not given, ToInteger(undefined) = 0, which is correct * for indexOf() but incorrect for lastIndexOf(). Hence special handling, * and why lastIndexOf() needs to be a vararg function. */ if (nargs >= 2) { /* indexOf: clamp fromIndex to [-len, len] * (if fromIndex == len, for-loop terminates directly) * * lastIndexOf: clamp fromIndex to [-len - 1, len - 1] * (if clamped to -len-1 -> fromIndex becomes -1, terminates for-loop directly) */ from_idx = duk_to_int_clamped(thr, 1, (idx_step > 0 ? -len : -len - 1), (idx_step > 0 ? len : len - 1)); if (from_idx < 0) { /* for lastIndexOf, result may be -1 (mark immediate termination) */ from_idx = len + from_idx; } } else { /* for indexOf, ToInteger(undefined) would be 0, i.e. correct, but * handle both indexOf and lastIndexOf specially here. */ if (idx_step > 0) { from_idx = 0; } else { from_idx = len - 1; } } /* stack[0] = searchElement * stack[1] = fromIndex * stack[2] = object * stack[3] = length (not needed, but not popped above) */ for (i = from_idx; i >= 0 && i < len; i += idx_step) { DUK_ASSERT_TOP(thr, 4); if (duk_get_prop_index(thr, 2, (duk_uarridx_t) i)) { DUK_ASSERT_TOP(thr, 5); if (duk_strict_equals(thr, 0, 4)) { duk_push_int(thr, i); return 1; } } duk_pop_unsafe(thr); } not_found: duk_push_int(thr, -1); return 1; } /* * every(), some(), forEach(), map(), filter() */ #define DUK__ITER_EVERY 0 #define DUK__ITER_SOME 1 #define DUK__ITER_FOREACH 2 #define DUK__ITER_MAP 3 #define DUK__ITER_FILTER 4 /* XXX: This helper is a bit awkward because the handling for the different iteration * callers is quite different. This now compiles to a bit less than 500 bytes, so with * 5 callers the net result is about 100 bytes / caller. */ DUK_INTERNAL duk_ret_t duk_bi_array_prototype_iter_shared(duk_hthread *thr) { duk_uint32_t len; duk_uint32_t i; duk_uarridx_t k; duk_bool_t bval; duk_small_int_t iter_type = duk_get_current_magic(thr); duk_uint32_t res_length = 0; /* each call this helper serves has nargs==2 */ DUK_ASSERT_TOP(thr, 2); len = duk__push_this_obj_len_u32(thr); duk_require_callable(thr, 0); /* if thisArg not supplied, behave as if undefined was supplied */ if (iter_type == DUK__ITER_MAP || iter_type == DUK__ITER_FILTER) { duk_push_array(thr); } else { duk_push_undefined(thr); } /* stack[0] = callback * stack[1] = thisArg * stack[2] = object * stack[3] = ToUint32(length) (unused, but avoid unnecessary pop) * stack[4] = result array (or undefined) */ k = 0; /* result index for filter() */ for (i = 0; i < len; i++) { DUK_ASSERT_TOP(thr, 5); if (!duk_get_prop_index(thr, 2, (duk_uarridx_t) i)) { #if defined(DUK_USE_NONSTD_ARRAY_MAP_TRAILER) /* Real world behavior for map(): trailing non-existent * elements don't invoke the user callback, but are still * counted towards result 'length'. */ if (iter_type == DUK__ITER_MAP) { res_length = i + 1; } #else /* Standard behavior for map(): trailing non-existent * elements don't invoke the user callback and are not * counted towards result 'length'. */ #endif duk_pop_undefined(thr); continue; } /* The original value needs to be preserved for filter(), hence * this funny order. We can't re-get the value because of side * effects. */ duk_dup_0(thr); duk_dup_1(thr); duk_dup_m3(thr); duk_push_u32(thr, i); duk_dup_2(thr); /* [ ... val callback thisArg val i obj ] */ duk_call_method(thr, 3); /* -> [ ... val retval ] */ switch (iter_type) { case DUK__ITER_EVERY: bval = duk_to_boolean(thr, -1); if (!bval) { /* stack top contains 'false' */ return 1; } break; case DUK__ITER_SOME: bval = duk_to_boolean(thr, -1); if (bval) { /* stack top contains 'true' */ return 1; } break; case DUK__ITER_FOREACH: /* nop */ break; case DUK__ITER_MAP: duk_dup_top(thr); duk_xdef_prop_index_wec(thr, 4, (duk_uarridx_t) i); /* retval to result[i] */ res_length = i + 1; break; case DUK__ITER_FILTER: bval = duk_to_boolean(thr, -1); if (bval) { duk_dup_m2(thr); /* orig value */ duk_xdef_prop_index_wec(thr, 4, (duk_uarridx_t) k); k++; res_length = k; } break; default: DUK_UNREACHABLE(); break; } duk_pop_2_unsafe(thr); DUK_ASSERT_TOP(thr, 5); } switch (iter_type) { case DUK__ITER_EVERY: duk_push_true(thr); break; case DUK__ITER_SOME: duk_push_false(thr); break; case DUK__ITER_FOREACH: duk_push_undefined(thr); break; case DUK__ITER_MAP: case DUK__ITER_FILTER: DUK_ASSERT_TOP(thr, 5); DUK_ASSERT(duk_is_array(thr, -1)); /* topmost element is the result array already */ duk_push_u32(thr, res_length); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_W); break; default: DUK_UNREACHABLE(); break; } return 1; } /* * reduce(), reduceRight() */ DUK_INTERNAL duk_ret_t duk_bi_array_prototype_reduce_shared(duk_hthread *thr) { duk_idx_t nargs; duk_bool_t have_acc; duk_uint32_t i, len; duk_small_int_t idx_step = duk_get_current_magic(thr); /* idx_step is +1 for reduce, -1 for reduceRight */ /* We're a varargs function because we need to detect whether * initialValue was given or not. */ nargs = duk_get_top(thr); DUK_DDD(DUK_DDDPRINT("nargs=%ld", (long) nargs)); duk_set_top(thr, 2); len = duk__push_this_obj_len_u32(thr); duk_require_callable(thr, 0); /* stack[0] = callback fn * stack[1] = initialValue * stack[2] = object (coerced this) * stack[3] = length (not needed, but not popped above) * stack[4] = accumulator */ have_acc = 0; if (nargs >= 2) { duk_dup_1(thr); have_acc = 1; } DUK_DDD(DUK_DDDPRINT("have_acc=%ld, acc=%!T", (long) have_acc, (duk_tval *) duk_get_tval(thr, 3))); /* For len == 0, i is initialized to len - 1 which underflows. * The condition (i < len) will then exit the for-loop on the * first round which is correct. Similarly, loop termination * happens by i underflowing. */ for (i = (idx_step >= 0 ? 0 : len - 1); i < len; /* i >= 0 would always be true */ i += (duk_uint32_t) idx_step) { DUK_DDD(DUK_DDDPRINT("i=%ld, len=%ld, have_acc=%ld, top=%ld, acc=%!T", (long) i, (long) len, (long) have_acc, (long) duk_get_top(thr), (duk_tval *) duk_get_tval(thr, 4))); DUK_ASSERT((have_acc && duk_get_top(thr) == 5) || (!have_acc && duk_get_top(thr) == 4)); if (!duk_has_prop_index(thr, 2, (duk_uarridx_t) i)) { continue; } if (!have_acc) { DUK_ASSERT_TOP(thr, 4); duk_get_prop_index(thr, 2, (duk_uarridx_t) i); have_acc = 1; DUK_ASSERT_TOP(thr, 5); } else { DUK_ASSERT_TOP(thr, 5); duk_dup_0(thr); duk_dup(thr, 4); duk_get_prop_index(thr, 2, (duk_uarridx_t) i); duk_push_u32(thr, i); duk_dup_2(thr); DUK_DDD(DUK_DDDPRINT("calling reduce function: func=%!T, prev=%!T, curr=%!T, idx=%!T, obj=%!T", (duk_tval *) duk_get_tval(thr, -5), (duk_tval *) duk_get_tval(thr, -4), (duk_tval *) duk_get_tval(thr, -3), (duk_tval *) duk_get_tval(thr, -2), (duk_tval *) duk_get_tval(thr, -1))); duk_call(thr, 4); DUK_DDD(DUK_DDDPRINT("-> result: %!T", (duk_tval *) duk_get_tval(thr, -1))); duk_replace(thr, 4); DUK_ASSERT_TOP(thr, 5); } } if (!have_acc) { DUK_DCERROR_TYPE_INVALID_ARGS(thr); } DUK_ASSERT_TOP(thr, 5); return 1; } #endif /* DUK_USE_ARRAY_BUILTIN */ /* automatic undefs */ #undef DUK__ARRAY_MID_JOIN_LIMIT #undef DUK__ITER_EVERY #undef DUK__ITER_FILTER #undef DUK__ITER_FOREACH #undef DUK__ITER_MAP #undef DUK__ITER_SOME #line 1 "duk_bi_boolean.c" /* * Boolean built-ins */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_BOOLEAN_BUILTIN) /* Shared helper to provide toString() and valueOf(). Checks 'this', gets * the primitive value to stack top, and optionally coerces with ToString(). */ DUK_INTERNAL duk_ret_t duk_bi_boolean_prototype_tostring_shared(duk_hthread *thr) { duk_tval *tv; duk_hobject *h; duk_small_int_t coerce_tostring = duk_get_current_magic(thr); /* XXX: there is room to use a shared helper here, many built-ins * check the 'this' type, and if it's an object, check its class, * then get its internal value, etc. */ duk_push_this(thr); tv = duk_get_tval(thr, -1); DUK_ASSERT(tv != NULL); if (DUK_TVAL_IS_BOOLEAN(tv)) { goto type_ok; } else if (DUK_TVAL_IS_OBJECT(tv)) { h = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h != NULL); if (DUK_HOBJECT_GET_CLASS_NUMBER(h) == DUK_HOBJECT_CLASS_BOOLEAN) { duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VALUE); DUK_ASSERT(duk_is_boolean(thr, -1)); goto type_ok; } } DUK_DCERROR_TYPE_INVALID_ARGS(thr); /* never here */ type_ok: if (coerce_tostring) { duk_to_string(thr, -1); } return 1; } DUK_INTERNAL duk_ret_t duk_bi_boolean_constructor(duk_hthread *thr) { duk_hobject *h_this; duk_to_boolean(thr, 0); if (duk_is_constructor_call(thr)) { /* XXX: helper; rely on Boolean.prototype as being non-writable, non-configurable */ duk_push_this(thr); h_this = duk_known_hobject(thr, -1); DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_this) == thr->builtins[DUK_BIDX_BOOLEAN_PROTOTYPE]); DUK_HOBJECT_SET_CLASS_NUMBER(h_this, DUK_HOBJECT_CLASS_BOOLEAN); duk_dup_0(thr); /* -> [ val obj val ] */ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_NONE); /* XXX: proper flags? */ } /* unbalanced stack */ return 1; } #endif /* DUK_USE_BOOLEAN_BUILTIN */ #line 1 "duk_bi_buffer.c" /* * ES2015 TypedArray and Node.js Buffer built-ins */ /* #include duk_internal.h -> already included */ /* * Helpers for buffer handling, enabled with DUK_USE_BUFFEROBJECT_SUPPORT. */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) /* Map class number (minus DUK_HOBJECT_CLASS_BUFOBJ_MIN) to a bidx for the * default internal prototype. */ static const duk_uint8_t duk__buffer_proto_from_classnum[] = { DUK_BIDX_ARRAYBUFFER_PROTOTYPE, DUK_BIDX_DATAVIEW_PROTOTYPE, DUK_BIDX_INT8ARRAY_PROTOTYPE, DUK_BIDX_UINT8ARRAY_PROTOTYPE, DUK_BIDX_UINT8CLAMPEDARRAY_PROTOTYPE, DUK_BIDX_INT16ARRAY_PROTOTYPE, DUK_BIDX_UINT16ARRAY_PROTOTYPE, DUK_BIDX_INT32ARRAY_PROTOTYPE, DUK_BIDX_UINT32ARRAY_PROTOTYPE, DUK_BIDX_FLOAT32ARRAY_PROTOTYPE, DUK_BIDX_FLOAT64ARRAY_PROTOTYPE }; /* Map DUK_HBUFOBJ_ELEM_xxx to duk_hobject class number. * Sync with duk_hbufobj.h and duk_hobject.h. */ static const duk_uint8_t duk__buffer_class_from_elemtype[9] = { DUK_HOBJECT_CLASS_UINT8ARRAY, DUK_HOBJECT_CLASS_UINT8CLAMPEDARRAY, DUK_HOBJECT_CLASS_INT8ARRAY, DUK_HOBJECT_CLASS_UINT16ARRAY, DUK_HOBJECT_CLASS_INT16ARRAY, DUK_HOBJECT_CLASS_UINT32ARRAY, DUK_HOBJECT_CLASS_INT32ARRAY, DUK_HOBJECT_CLASS_FLOAT32ARRAY, DUK_HOBJECT_CLASS_FLOAT64ARRAY }; /* Map DUK_HBUFOBJ_ELEM_xxx to prototype object built-in index. * Sync with duk_hbufobj.h. */ static const duk_uint8_t duk__buffer_proto_from_elemtype[9] = { DUK_BIDX_UINT8ARRAY_PROTOTYPE, DUK_BIDX_UINT8CLAMPEDARRAY_PROTOTYPE, DUK_BIDX_INT8ARRAY_PROTOTYPE, DUK_BIDX_UINT16ARRAY_PROTOTYPE, DUK_BIDX_INT16ARRAY_PROTOTYPE, DUK_BIDX_UINT32ARRAY_PROTOTYPE, DUK_BIDX_INT32ARRAY_PROTOTYPE, DUK_BIDX_FLOAT32ARRAY_PROTOTYPE, DUK_BIDX_FLOAT64ARRAY_PROTOTYPE }; /* Map DUK__FLD_xxx to byte size. */ static const duk_uint8_t duk__buffer_nbytes_from_fldtype[6] = { 1, /* DUK__FLD_8BIT */ 2, /* DUK__FLD_16BIT */ 4, /* DUK__FLD_32BIT */ 4, /* DUK__FLD_FLOAT */ 8, /* DUK__FLD_DOUBLE */ 0 /* DUK__FLD_VARINT; not relevant here */ }; /* Bitfield for each DUK_HBUFOBJ_ELEM_xxx indicating which element types * are compatible with a blind byte copy for the TypedArray set() method (also * used for TypedArray constructor). Array index is target buffer elem type, * bitfield indicates compatible source types. The types must have same byte * size and they must be coercion compatible. */ #if !defined(DUK_USE_PREFER_SIZE) static duk_uint16_t duk__buffer_elemtype_copy_compatible[9] = { /* xxx -> DUK_HBUFOBJ_ELEM_UINT8 */ (1U << DUK_HBUFOBJ_ELEM_UINT8) | (1U << DUK_HBUFOBJ_ELEM_UINT8CLAMPED) | (1U << DUK_HBUFOBJ_ELEM_INT8), /* xxx -> DUK_HBUFOBJ_ELEM_UINT8CLAMPED * Note: INT8 is -not- copy compatible, e.g. -1 would coerce to 0x00. */ (1U << DUK_HBUFOBJ_ELEM_UINT8) | (1U << DUK_HBUFOBJ_ELEM_UINT8CLAMPED), /* xxx -> DUK_HBUFOBJ_ELEM_INT8 */ (1U << DUK_HBUFOBJ_ELEM_UINT8) | (1U << DUK_HBUFOBJ_ELEM_UINT8CLAMPED) | (1U << DUK_HBUFOBJ_ELEM_INT8), /* xxx -> DUK_HBUFOBJ_ELEM_UINT16 */ (1U << DUK_HBUFOBJ_ELEM_UINT16) | (1U << DUK_HBUFOBJ_ELEM_INT16), /* xxx -> DUK_HBUFOBJ_ELEM_INT16 */ (1U << DUK_HBUFOBJ_ELEM_UINT16) | (1U << DUK_HBUFOBJ_ELEM_INT16), /* xxx -> DUK_HBUFOBJ_ELEM_UINT32 */ (1U << DUK_HBUFOBJ_ELEM_UINT32) | (1U << DUK_HBUFOBJ_ELEM_INT32), /* xxx -> DUK_HBUFOBJ_ELEM_INT32 */ (1U << DUK_HBUFOBJ_ELEM_UINT32) | (1U << DUK_HBUFOBJ_ELEM_INT32), /* xxx -> DUK_HBUFOBJ_ELEM_FLOAT32 */ (1U << DUK_HBUFOBJ_ELEM_FLOAT32), /* xxx -> DUK_HBUFOBJ_ELEM_FLOAT64 */ (1U << DUK_HBUFOBJ_ELEM_FLOAT64) }; #endif /* !DUK_USE_PREFER_SIZE */ DUK_LOCAL duk_hbufobj *duk__hbufobj_promote_this(duk_hthread *thr) { duk_tval *tv_dst; duk_hbufobj *res; duk_push_this(thr); DUK_ASSERT(duk_is_buffer(thr, -1)); res = (duk_hbufobj *) duk_to_hobject(thr, -1); DUK_ASSERT_HBUFOBJ_VALID(res); DUK_DD(DUK_DDPRINT("promoted 'this' automatically to an ArrayBuffer: %!iT", duk_get_tval(thr, -1))); tv_dst = duk_get_borrowed_this_tval(thr); DUK_TVAL_SET_OBJECT_UPDREF(thr, tv_dst, (duk_hobject *) res); duk_pop(thr); return res; } #define DUK__BUFOBJ_FLAG_THROW (1 << 0) #define DUK__BUFOBJ_FLAG_PROMOTE (1 << 1) /* Shared helper. When DUK__BUFOBJ_FLAG_PROMOTE is given, the return value is * always a duk_hbufobj *. Without the flag the return value can also be a * plain buffer, and the caller must check for it using DUK_HEAPHDR_IS_BUFFER(). */ DUK_LOCAL duk_heaphdr *duk__getrequire_bufobj_this(duk_hthread *thr, duk_small_uint_t flags) { duk_tval *tv; duk_hbufobj *h_this; DUK_ASSERT(thr != NULL); tv = duk_get_borrowed_this_tval(thr); DUK_ASSERT(tv != NULL); if (DUK_TVAL_IS_OBJECT(tv)) { h_this = (duk_hbufobj *) DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h_this != NULL); if (DUK_HOBJECT_IS_BUFOBJ((duk_hobject *) h_this)) { DUK_ASSERT_HBUFOBJ_VALID(h_this); return (duk_heaphdr *) h_this; } } else if (DUK_TVAL_IS_BUFFER(tv)) { if (flags & DUK__BUFOBJ_FLAG_PROMOTE) { /* Promote a plain buffer to a Uint8Array. This is very * inefficient but allows plain buffer to be used wherever an * Uint8Array is used with very small cost; hot path functions * like index read/write calls should provide direct buffer * support to avoid promotion. */ /* XXX: make this conditional to a flag if call sites need it? */ h_this = duk__hbufobj_promote_this(thr); DUK_ASSERT(h_this != NULL); DUK_ASSERT_HBUFOBJ_VALID(h_this); return (duk_heaphdr *) h_this; } else { /* XXX: ugly, share return pointer for duk_hbuffer. */ return (duk_heaphdr *) DUK_TVAL_GET_BUFFER(tv); } } if (flags & DUK__BUFOBJ_FLAG_THROW) { DUK_ERROR_TYPE(thr, DUK_STR_NOT_BUFFER); } return NULL; } /* Check that 'this' is a duk_hbufobj and return a pointer to it. */ DUK_LOCAL duk_hbufobj *duk__get_bufobj_this(duk_hthread *thr) { return (duk_hbufobj *) duk__getrequire_bufobj_this(thr, DUK__BUFOBJ_FLAG_PROMOTE); } /* Check that 'this' is a duk_hbufobj and return a pointer to it * (NULL if not). */ DUK_LOCAL duk_hbufobj *duk__require_bufobj_this(duk_hthread *thr) { return (duk_hbufobj *) duk__getrequire_bufobj_this(thr, DUK__BUFOBJ_FLAG_THROW | DUK__BUFOBJ_FLAG_PROMOTE); } /* Check that value is a duk_hbufobj and return a pointer to it. */ DUK_LOCAL duk_hbufobj *duk__require_bufobj_value(duk_hthread *thr, duk_idx_t idx) { duk_tval *tv; duk_hbufobj *h_obj; /* Don't accept relative indices now. */ DUK_ASSERT(idx >= 0); tv = duk_require_tval(thr, idx); DUK_ASSERT(tv != NULL); if (DUK_TVAL_IS_OBJECT(tv)) { h_obj = (duk_hbufobj *) DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h_obj != NULL); if (DUK_HOBJECT_IS_BUFOBJ((duk_hobject *) h_obj)) { DUK_ASSERT_HBUFOBJ_VALID(h_obj); return h_obj; } } else if (DUK_TVAL_IS_BUFFER(tv)) { h_obj = (duk_hbufobj *) duk_to_hobject(thr, idx); DUK_ASSERT(h_obj != NULL); DUK_ASSERT_HBUFOBJ_VALID(h_obj); return h_obj; } DUK_ERROR_TYPE(thr, DUK_STR_NOT_BUFFER); return NULL; /* not reachable */ } DUK_LOCAL void duk__set_bufobj_buffer(duk_hthread *thr, duk_hbufobj *h_bufobj, duk_hbuffer *h_val) { DUK_ASSERT(thr != NULL); DUK_ASSERT(h_bufobj != NULL); DUK_ASSERT(h_bufobj->buf == NULL); /* no need to decref */ DUK_ASSERT(h_val != NULL); DUK_ASSERT_HBUFOBJ_VALID(h_bufobj); DUK_UNREF(thr); h_bufobj->buf = h_val; DUK_HBUFFER_INCREF(thr, h_val); h_bufobj->length = (duk_uint_t) DUK_HBUFFER_GET_SIZE(h_val); DUK_ASSERT(h_bufobj->shift == 0); DUK_ASSERT(h_bufobj->elem_type == DUK_HBUFOBJ_ELEM_UINT8); DUK_ASSERT(h_bufobj->is_typedarray == 0); DUK_ASSERT_HBUFOBJ_VALID(h_bufobj); } /* Shared offset/length coercion helper. */ DUK_LOCAL void duk__resolve_offset_opt_length(duk_hthread *thr, duk_hbufobj *h_bufarg, duk_idx_t idx_offset, duk_idx_t idx_length, duk_uint_t *out_offset, duk_uint_t *out_length, duk_bool_t throw_flag) { duk_int_t offset_signed; duk_int_t length_signed; duk_uint_t offset; duk_uint_t length; offset_signed = duk_to_int(thr, idx_offset); if (offset_signed < 0) { goto fail_range; } offset = (duk_uint_t) offset_signed; if (offset > h_bufarg->length) { goto fail_range; } DUK_ASSERT_DISABLE(offset >= 0); /* unsigned */ DUK_ASSERT(offset <= h_bufarg->length); if (duk_is_undefined(thr, idx_length)) { DUK_ASSERT(h_bufarg->length >= offset); length = h_bufarg->length - offset; /* >= 0 */ } else { length_signed = duk_to_int(thr, idx_length); if (length_signed < 0) { goto fail_range; } length = (duk_uint_t) length_signed; DUK_ASSERT(h_bufarg->length >= offset); if (length > h_bufarg->length - offset) { /* Unlike for negative arguments, some call sites * want length to be clamped if it's positive. */ if (throw_flag) { goto fail_range; } else { length = h_bufarg->length - offset; } } } DUK_ASSERT_DISABLE(length >= 0); /* unsigned */ DUK_ASSERT(offset + length <= h_bufarg->length); *out_offset = offset; *out_length = length; return; fail_range: DUK_ERROR_RANGE(thr, DUK_STR_INVALID_ARGS); } /* Shared lenient buffer length clamping helper. No negative indices, no * element/byte shifting. */ DUK_LOCAL void duk__clamp_startend_nonegidx_noshift(duk_hthread *thr, duk_int_t buffer_length, duk_idx_t idx_start, duk_idx_t idx_end, duk_int_t *out_start_offset, duk_int_t *out_end_offset) { duk_int_t start_offset; duk_int_t end_offset; DUK_ASSERT(out_start_offset != NULL); DUK_ASSERT(out_end_offset != NULL); /* undefined coerces to zero which is correct */ start_offset = duk_to_int_clamped(thr, idx_start, 0, buffer_length); if (duk_is_undefined(thr, idx_end)) { end_offset = buffer_length; } else { end_offset = duk_to_int_clamped(thr, idx_end, start_offset, buffer_length); } DUK_ASSERT(start_offset >= 0); DUK_ASSERT(start_offset <= buffer_length); DUK_ASSERT(end_offset >= 0); DUK_ASSERT(end_offset <= buffer_length); DUK_ASSERT(start_offset <= end_offset); *out_start_offset = start_offset; *out_end_offset = end_offset; } /* Shared lenient buffer length clamping helper. Indices are treated as * element indices (though output values are byte offsets) which only * really matters for TypedArray views as other buffer object have a zero * shift. Negative indices are counted from end of input slice; crossed * indices are clamped to zero length; and final indices are clamped * against input slice. Used for e.g. ArrayBuffer slice(). */ DUK_LOCAL void duk__clamp_startend_negidx_shifted(duk_hthread *thr, duk_int_t buffer_length, duk_uint8_t buffer_shift, duk_idx_t idx_start, duk_idx_t idx_end, duk_int_t *out_start_offset, duk_int_t *out_end_offset) { duk_int_t start_offset; duk_int_t end_offset; DUK_ASSERT(out_start_offset != NULL); DUK_ASSERT(out_end_offset != NULL); buffer_length >>= buffer_shift; /* as (full) elements */ /* Resolve start/end offset as element indices first; arguments * at idx_start/idx_end are element offsets. Working with element * indices first also avoids potential for wrapping. */ start_offset = duk_to_int(thr, idx_start); if (start_offset < 0) { start_offset = buffer_length + start_offset; } if (duk_is_undefined(thr, idx_end)) { end_offset = buffer_length; } else { end_offset = duk_to_int(thr, idx_end); if (end_offset < 0) { end_offset = buffer_length + end_offset; } } /* Note: start_offset/end_offset can still be < 0 here. */ if (start_offset < 0) { start_offset = 0; } else if (start_offset > buffer_length) { start_offset = buffer_length; } if (end_offset < start_offset) { end_offset = start_offset; } else if (end_offset > buffer_length) { end_offset = buffer_length; } DUK_ASSERT(start_offset >= 0); DUK_ASSERT(start_offset <= buffer_length); DUK_ASSERT(end_offset >= 0); DUK_ASSERT(end_offset <= buffer_length); DUK_ASSERT(start_offset <= end_offset); /* Convert indices to byte offsets. */ start_offset <<= buffer_shift; end_offset <<= buffer_shift; *out_start_offset = start_offset; *out_end_offset = end_offset; } DUK_INTERNAL void duk_hbufobj_promote_plain(duk_hthread *thr, duk_idx_t idx) { if (duk_is_buffer(thr, idx)) { duk_to_object(thr, idx); } } DUK_INTERNAL void duk_hbufobj_push_uint8array_from_plain(duk_hthread *thr, duk_hbuffer *h_buf) { /* Push Uint8Array which will share the same underlying buffer as * the plain buffer argument. Also create an ArrayBuffer with the * same backing for the result .buffer property. */ duk_push_hbuffer(thr, h_buf); duk_push_buffer_object(thr, -1, 0, (duk_size_t) DUK_HBUFFER_GET_SIZE(h_buf), DUK_BUFOBJ_UINT8ARRAY); duk_remove_m2(thr); #if 0 /* More verbose equivalent; maybe useful if e.g. .buffer is omitted. */ h_bufobj = duk_push_bufobj_raw(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_BUFOBJ | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_UINT8ARRAY), DUK_BIDX_UINT8ARRAY_PROTOTYPE); DUK_ASSERT(h_bufobj != NULL); duk__set_bufobj_buffer(thr, h_bufobj, h_buf); h_bufobj->is_typedarray = 1; DUK_ASSERT_HBUFOBJ_VALID(h_bufobj); h_arrbuf = duk_push_bufobj_raw(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_BUFOBJ | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ARRAYBUFFER), DUK_BIDX_ARRAYBUFFER_PROTOTYPE); DUK_ASSERT(h_arrbuf != NULL); duk__set_bufobj_buffer(thr, h_arrbuf, h_buf); DUK_ASSERT(h_arrbuf->is_typedarray == 0); DUK_ASSERT_HBUFOBJ_VALID(h_arrbuf); DUK_ASSERT(h_bufobj->buf_prop == NULL); h_bufobj->buf_prop = (duk_hobject *) h_arrbuf; DUK_ASSERT(h_arrbuf != NULL); DUK_HBUFOBJ_INCREF(thr, h_arrbuf); duk_pop(thr); #endif } /* Indexed read helper for buffer objects, also called from outside this file. */ DUK_INTERNAL void duk_hbufobj_push_validated_read(duk_hthread *thr, duk_hbufobj *h_bufobj, duk_uint8_t *p, duk_small_uint_t elem_size) { duk_double_union du; DUK_MEMCPY((void *) du.uc, (const void *) p, (size_t) elem_size); switch (h_bufobj->elem_type) { case DUK_HBUFOBJ_ELEM_UINT8: case DUK_HBUFOBJ_ELEM_UINT8CLAMPED: duk_push_uint(thr, (duk_uint_t) du.uc[0]); break; case DUK_HBUFOBJ_ELEM_INT8: duk_push_int(thr, (duk_int_t) (duk_int8_t) du.uc[0]); break; case DUK_HBUFOBJ_ELEM_UINT16: duk_push_uint(thr, (duk_uint_t) du.us[0]); break; case DUK_HBUFOBJ_ELEM_INT16: duk_push_int(thr, (duk_int_t) (duk_int16_t) du.us[0]); break; case DUK_HBUFOBJ_ELEM_UINT32: duk_push_uint(thr, (duk_uint_t) du.ui[0]); break; case DUK_HBUFOBJ_ELEM_INT32: duk_push_int(thr, (duk_int_t) (duk_int32_t) du.ui[0]); break; case DUK_HBUFOBJ_ELEM_FLOAT32: duk_push_number(thr, (duk_double_t) du.f[0]); break; case DUK_HBUFOBJ_ELEM_FLOAT64: duk_push_number(thr, (duk_double_t) du.d); break; default: DUK_UNREACHABLE(); } } /* Indexed write helper for buffer objects, also called from outside this file. */ DUK_INTERNAL void duk_hbufobj_validated_write(duk_hthread *thr, duk_hbufobj *h_bufobj, duk_uint8_t *p, duk_small_uint_t elem_size) { duk_double_union du; /* NOTE! Caller must ensure that any side effects from the * coercions below are safe. If that cannot be guaranteed * (which is normally the case), caller must coerce the * argument using duk_to_number() before any pointer * validations; the result of duk_to_number() always coerces * without side effects here. */ switch (h_bufobj->elem_type) { case DUK_HBUFOBJ_ELEM_UINT8: du.uc[0] = (duk_uint8_t) duk_to_uint32(thr, -1); break; case DUK_HBUFOBJ_ELEM_UINT8CLAMPED: du.uc[0] = (duk_uint8_t) duk_to_uint8clamped(thr, -1); break; case DUK_HBUFOBJ_ELEM_INT8: du.uc[0] = (duk_uint8_t) duk_to_int32(thr, -1); break; case DUK_HBUFOBJ_ELEM_UINT16: du.us[0] = (duk_uint16_t) duk_to_uint32(thr, -1); break; case DUK_HBUFOBJ_ELEM_INT16: du.us[0] = (duk_uint16_t) duk_to_int32(thr, -1); break; case DUK_HBUFOBJ_ELEM_UINT32: du.ui[0] = (duk_uint32_t) duk_to_uint32(thr, -1); break; case DUK_HBUFOBJ_ELEM_INT32: du.ui[0] = (duk_uint32_t) duk_to_int32(thr, -1); break; case DUK_HBUFOBJ_ELEM_FLOAT32: du.f[0] = (duk_float_t) duk_to_number_m1(thr); break; case DUK_HBUFOBJ_ELEM_FLOAT64: du.d = (duk_double_t) duk_to_number_m1(thr); break; default: DUK_UNREACHABLE(); } DUK_MEMCPY((void *) p, (const void *) du.uc, (size_t) elem_size); } /* Helper to create a fixed buffer from argument value at index 0. * Node.js and allocPlain() compatible. */ DUK_LOCAL duk_hbuffer *duk__hbufobj_fixed_from_argvalue(duk_hthread *thr) { duk_int_t len; duk_int_t i; duk_size_t buf_size; duk_uint8_t *buf; switch (duk_get_type(thr, 0)) { case DUK_TYPE_NUMBER: { len = duk_to_int_clamped(thr, 0, 0, DUK_INT_MAX); (void) duk_push_fixed_buffer_zero(thr, (duk_size_t) len); break; } case DUK_TYPE_BUFFER: { /* Treat like Uint8Array. */ goto slow_copy; } case DUK_TYPE_OBJECT: { duk_hobject *h; duk_hbufobj *h_bufobj; /* For Node.js Buffers "Passing an ArrayBuffer returns a Buffer * that shares allocated memory with the given ArrayBuffer." * https://nodejs.org/api/buffer.html#buffer_buffer_from_buffer_alloc_and_buffer_allocunsafe */ h = duk_known_hobject(thr, 0); if (DUK_HOBJECT_GET_CLASS_NUMBER(h) == DUK_HOBJECT_CLASS_ARRAYBUFFER) { DUK_ASSERT(DUK_HOBJECT_IS_BUFOBJ(h)); h_bufobj = (duk_hbufobj *) h; if (DUK_UNLIKELY(h_bufobj->buf == NULL)) { DUK_ERROR_TYPE_INVALID_ARGS(thr); } if (DUK_UNLIKELY(h_bufobj->offset != 0 || h_bufobj->length != DUK_HBUFFER_GET_SIZE(h_bufobj->buf))) { /* No support for ArrayBuffers with slice * offset/length. */ DUK_ERROR_TYPE_INVALID_ARGS(thr); } duk_push_hbuffer(thr, h_bufobj->buf); return h_bufobj->buf; } goto slow_copy; } case DUK_TYPE_STRING: { /* ignore encoding for now */ duk_require_hstring_notsymbol(thr, 0); duk_dup_0(thr); (void) duk_to_buffer(thr, -1, &buf_size); break; } default: DUK_ERROR_TYPE_INVALID_ARGS(thr); } done: DUK_ASSERT(duk_is_buffer(thr, -1)); return duk_known_hbuffer(thr, -1); slow_copy: /* XXX: fast path for typed arrays and other buffer objects? */ (void) duk_get_prop_stridx_short(thr, 0, DUK_STRIDX_LENGTH); len = duk_to_int_clamped(thr, -1, 0, DUK_INT_MAX); duk_pop(thr); buf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, (duk_size_t) len); /* no zeroing, all indices get initialized */ for (i = 0; i < len; i++) { /* XXX: fast path for array or buffer arguments? */ duk_get_prop_index(thr, 0, (duk_uarridx_t) i); buf[i] = (duk_uint8_t) (duk_to_uint32(thr, -1) & 0xffU); duk_pop(thr); } goto done; } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ /* * Node.js Buffer constructor * * Node.js Buffers are just Uint8Arrays with internal prototype set to * Buffer.prototype so they're handled otherwise the same as Uint8Array. * However, the constructor arguments are very different so a separate * constructor entry point is used. */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_constructor(duk_hthread *thr) { duk_hbuffer *h_buf; h_buf = duk__hbufobj_fixed_from_argvalue(thr); DUK_ASSERT(h_buf != NULL); duk_push_buffer_object(thr, -1, 0, DUK_HBUFFER_FIXED_GET_SIZE((duk_hbuffer_fixed *) h_buf), DUK_BUFOBJ_UINT8ARRAY); duk_push_hobject_bidx(thr, DUK_BIDX_NODEJS_BUFFER_PROTOTYPE); duk_set_prototype(thr, -2); /* XXX: a more direct implementation */ return 1; } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ /* * ArrayBuffer, DataView, and TypedArray constructors */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_INTERNAL duk_ret_t duk_bi_arraybuffer_constructor(duk_hthread *thr) { duk_hbufobj *h_bufobj; duk_hbuffer *h_val; duk_int_t len; DUK_ASSERT_CTX_VALID(thr); duk_require_constructor_call(thr); len = duk_to_int(thr, 0); if (len < 0) { goto fail_length; } (void) duk_push_fixed_buffer_zero(thr, (duk_size_t) len); h_val = (duk_hbuffer *) duk_known_hbuffer(thr, -1); h_bufobj = duk_push_bufobj_raw(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_BUFOBJ | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ARRAYBUFFER), DUK_BIDX_ARRAYBUFFER_PROTOTYPE); DUK_ASSERT(h_bufobj != NULL); duk__set_bufobj_buffer(thr, h_bufobj, h_val); DUK_ASSERT_HBUFOBJ_VALID(h_bufobj); return 1; fail_length: DUK_DCERROR_RANGE_INVALID_LENGTH(thr); } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ /* Format of magic, bits: * 0...1: elem size shift (0-3) * 2...5: elem type (DUK_HBUFOBJ_ELEM_xxx) * * XXX: add prototype bidx explicitly to magic instead of using a mapping? */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_INTERNAL duk_ret_t duk_bi_typedarray_constructor(duk_hthread *thr) { duk_tval *tv; duk_hobject *h_obj; duk_hbufobj *h_bufobj = NULL; duk_hbufobj *h_bufarg = NULL; duk_hbuffer *h_val; duk_small_uint_t magic; duk_small_uint_t shift; duk_small_uint_t elem_type; duk_small_uint_t elem_size; duk_small_uint_t class_num; duk_small_uint_t proto_bidx; duk_uint_t align_mask; duk_uint_t elem_length; duk_int_t elem_length_signed; duk_uint_t byte_length; duk_small_uint_t copy_mode; /* XXX: The same copy helpers could be shared with at least some * buffer functions. */ duk_require_constructor_call(thr); /* We could fit built-in index into magic but that'd make the magic * number dependent on built-in numbering (genbuiltins.py doesn't * handle that yet). So map both class and prototype from the * element type. */ magic = (duk_small_uint_t) duk_get_current_magic(thr); shift = magic & 0x03U; /* bits 0...1: shift */ elem_type = (magic >> 2) & 0x0fU; /* bits 2...5: type */ elem_size = 1U << shift; align_mask = elem_size - 1; DUK_ASSERT(elem_type < sizeof(duk__buffer_proto_from_elemtype) / sizeof(duk_uint8_t)); proto_bidx = duk__buffer_proto_from_elemtype[elem_type]; DUK_ASSERT(proto_bidx < DUK_NUM_BUILTINS); DUK_ASSERT(elem_type < sizeof(duk__buffer_class_from_elemtype) / sizeof(duk_uint8_t)); class_num = duk__buffer_class_from_elemtype[elem_type]; DUK_DD(DUK_DDPRINT("typedarray constructor, magic=%d, shift=%d, elem_type=%d, " "elem_size=%d, proto_bidx=%d, class_num=%d", (int) magic, (int) shift, (int) elem_type, (int) elem_size, (int) proto_bidx, (int) class_num)); /* Argument variants. When the argument is an ArrayBuffer a view to * the same buffer is created; otherwise a new ArrayBuffer is always * created. */ /* XXX: initial iteration to treat a plain buffer like an ArrayBuffer: * coerce to an ArrayBuffer object and use that as .buffer. The underlying * buffer will be the same but result .buffer !== inputPlainBuffer. */ duk_hbufobj_promote_plain(thr, 0); tv = duk_get_tval(thr, 0); DUK_ASSERT(tv != NULL); /* arg count */ if (DUK_TVAL_IS_OBJECT(tv)) { h_obj = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h_obj != NULL); if (DUK_HOBJECT_GET_CLASS_NUMBER(h_obj) == DUK_HOBJECT_CLASS_ARRAYBUFFER) { /* ArrayBuffer: unlike any other argument variant, create * a view into the existing buffer. */ duk_int_t byte_offset_signed; duk_uint_t byte_offset; h_bufarg = (duk_hbufobj *) h_obj; byte_offset_signed = duk_to_int(thr, 1); if (byte_offset_signed < 0) { goto fail_arguments; } byte_offset = (duk_uint_t) byte_offset_signed; if (byte_offset > h_bufarg->length || (byte_offset & align_mask) != 0) { /* Must be >= 0 and multiple of element size. */ goto fail_arguments; } if (duk_is_undefined(thr, 2)) { DUK_ASSERT(h_bufarg->length >= byte_offset); byte_length = h_bufarg->length - byte_offset; if ((byte_length & align_mask) != 0) { /* Must be element size multiple from * start offset to end of buffer. */ goto fail_arguments; } elem_length = (byte_length >> shift); } else { elem_length_signed = duk_to_int(thr, 2); if (elem_length_signed < 0) { goto fail_arguments; } elem_length = (duk_uint_t) elem_length_signed; byte_length = elem_length << shift; if ((byte_length >> shift) != elem_length) { /* Byte length would overflow. */ /* XXX: easier check with less code? */ goto fail_arguments; } DUK_ASSERT(h_bufarg->length >= byte_offset); if (byte_length > h_bufarg->length - byte_offset) { /* Not enough data. */ goto fail_arguments; } } DUK_UNREF(elem_length); DUK_ASSERT_DISABLE(byte_offset >= 0); DUK_ASSERT(byte_offset <= h_bufarg->length); DUK_ASSERT_DISABLE(byte_length >= 0); DUK_ASSERT(byte_offset + byte_length <= h_bufarg->length); DUK_ASSERT((elem_length << shift) == byte_length); h_bufobj = duk_push_bufobj_raw(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_BUFOBJ | DUK_HOBJECT_CLASS_AS_FLAGS(class_num), (duk_small_int_t) proto_bidx); h_val = h_bufarg->buf; if (h_val == NULL) { DUK_DCERROR_TYPE_INVALID_ARGS(thr); } h_bufobj->buf = h_val; DUK_HBUFFER_INCREF(thr, h_val); h_bufobj->offset = h_bufarg->offset + byte_offset; h_bufobj->length = byte_length; h_bufobj->shift = (duk_uint8_t) shift; h_bufobj->elem_type = (duk_uint8_t) elem_type; h_bufobj->is_typedarray = 1; DUK_ASSERT_HBUFOBJ_VALID(h_bufobj); /* Set .buffer to the argument ArrayBuffer. */ DUK_ASSERT(h_bufobj->buf_prop == NULL); h_bufobj->buf_prop = (duk_hobject *) h_bufarg; DUK_ASSERT(h_bufarg != NULL); DUK_HBUFOBJ_INCREF(thr, h_bufarg); return 1; } else if (DUK_HOBJECT_IS_BUFOBJ(h_obj)) { /* TypedArray (or other non-ArrayBuffer duk_hbufobj). * Conceptually same behavior as for an Array-like argument, * with a few fast paths. */ h_bufarg = (duk_hbufobj *) h_obj; DUK_ASSERT_HBUFOBJ_VALID(h_bufarg); elem_length_signed = (duk_int_t) (h_bufarg->length >> h_bufarg->shift); if (h_bufarg->buf == NULL) { DUK_DCERROR_TYPE_INVALID_ARGS(thr); } /* Select copy mode. Must take into account element * compatibility and validity of the underlying source * buffer. */ DUK_DDD(DUK_DDDPRINT("selecting copy mode for bufobj arg, " "src byte_length=%ld, src shift=%d, " "src/dst elem_length=%ld; " "dst shift=%d -> dst byte_length=%ld", (long) h_bufarg->length, (int) h_bufarg->shift, (long) elem_length_signed, (int) shift, (long) (elem_length_signed << shift))); copy_mode = 2; /* default is explicit index read/write copy */ #if !defined(DUK_USE_PREFER_SIZE) /* With a size optimized build copy_mode 2 is enough. * Modes 0 and 1 are faster but conceptually the same. */ DUK_ASSERT(elem_type < sizeof(duk__buffer_elemtype_copy_compatible) / sizeof(duk_uint16_t)); if (DUK_HBUFOBJ_VALID_SLICE(h_bufarg)) { if ((duk__buffer_elemtype_copy_compatible[elem_type] & (1 << h_bufarg->elem_type)) != 0) { DUK_DDD(DUK_DDDPRINT("source/target are copy compatible, memcpy")); DUK_ASSERT(shift == h_bufarg->shift); /* byte sizes will match */ copy_mode = 0; } else { DUK_DDD(DUK_DDDPRINT("source/target not copy compatible but valid, fast copy")); copy_mode = 1; } } #endif /* !DUK_USE_PREFER_SIZE */ } else { /* Array or Array-like */ elem_length_signed = (duk_int_t) duk_get_length(thr, 0); copy_mode = 2; } } else { /* Non-object argument is simply int coerced, matches * V8 behavior (except for "null", which we coerce to * 0 but V8 TypeErrors). */ elem_length_signed = duk_to_int(thr, 0); copy_mode = 3; } if (elem_length_signed < 0) { goto fail_arguments; } elem_length = (duk_uint_t) elem_length_signed; byte_length = (duk_uint_t) (elem_length << shift); if ((byte_length >> shift) != elem_length) { /* Byte length would overflow. */ /* XXX: easier check with less code? */ goto fail_arguments; } DUK_DDD(DUK_DDDPRINT("elem_length=%ld, byte_length=%ld", (long) elem_length, (long) byte_length)); /* ArrayBuffer argument is handled specially above; the rest of the * argument variants are handled by shared code below. * * ArrayBuffer in h_bufobj->buf_prop is intentionally left unset. * It will be automatically created by the .buffer accessor on * first access. */ /* Push the resulting view object on top of a plain fixed buffer. */ (void) duk_push_fixed_buffer(thr, byte_length); h_val = duk_known_hbuffer(thr, -1); DUK_ASSERT(h_val != NULL); h_bufobj = duk_push_bufobj_raw(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_BUFOBJ | DUK_HOBJECT_CLASS_AS_FLAGS(class_num), (duk_small_int_t) proto_bidx); h_bufobj->buf = h_val; DUK_HBUFFER_INCREF(thr, h_val); DUK_ASSERT(h_bufobj->offset == 0); h_bufobj->length = byte_length; h_bufobj->shift = (duk_uint8_t) shift; h_bufobj->elem_type = (duk_uint8_t) elem_type; h_bufobj->is_typedarray = 1; DUK_ASSERT_HBUFOBJ_VALID(h_bufobj); /* Copy values, the copy method depends on the arguments. * * Copy mode decision may depend on the validity of the underlying * buffer of the source argument; there must be no harmful side effects * from there to here for copy_mode to still be valid. */ DUK_DDD(DUK_DDDPRINT("copy mode: %d", (int) copy_mode)); switch (copy_mode) { /* Copy modes 0 and 1 can be omitted in size optimized build, * copy mode 2 handles them (but more slowly). */ #if !defined(DUK_USE_PREFER_SIZE) case 0: { /* Use byte copy. */ duk_uint8_t *p_src; duk_uint8_t *p_dst; DUK_ASSERT(h_bufobj != NULL); DUK_ASSERT(h_bufobj->buf != NULL); DUK_ASSERT(DUK_HBUFOBJ_VALID_SLICE(h_bufobj)); DUK_ASSERT(h_bufarg != NULL); DUK_ASSERT(h_bufarg->buf != NULL); DUK_ASSERT(DUK_HBUFOBJ_VALID_SLICE(h_bufarg)); p_dst = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_bufobj); p_src = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_bufarg); DUK_DDD(DUK_DDDPRINT("using memcpy: p_src=%p, p_dst=%p, byte_length=%ld", (void *) p_src, (void *) p_dst, (long) byte_length)); DUK_MEMCPY((void *) p_dst, (const void *) p_src, (size_t) byte_length); break; } case 1: { /* Copy values through direct validated reads and writes. */ duk_small_uint_t src_elem_size; duk_small_uint_t dst_elem_size; duk_uint8_t *p_src; duk_uint8_t *p_src_end; duk_uint8_t *p_dst; DUK_ASSERT(h_bufobj != NULL); DUK_ASSERT(h_bufobj->buf != NULL); DUK_ASSERT(DUK_HBUFOBJ_VALID_SLICE(h_bufobj)); DUK_ASSERT(h_bufarg != NULL); DUK_ASSERT(h_bufarg->buf != NULL); DUK_ASSERT(DUK_HBUFOBJ_VALID_SLICE(h_bufarg)); src_elem_size = (duk_small_uint_t) (1U << h_bufarg->shift); dst_elem_size = elem_size; p_src = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_bufarg); p_dst = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_bufobj); p_src_end = p_src + h_bufarg->length; DUK_DDD(DUK_DDDPRINT("using fast copy: p_src=%p, p_src_end=%p, p_dst=%p, " "src_elem_size=%d, dst_elem_size=%d", (void *) p_src, (void *) p_src_end, (void *) p_dst, (int) src_elem_size, (int) dst_elem_size)); while (p_src != p_src_end) { DUK_DDD(DUK_DDDPRINT("fast path per element copy loop: " "p_src=%p, p_src_end=%p, p_dst=%p", (void *) p_src, (void *) p_src_end, (void *) p_dst)); /* A validated read() is always a number, so it's write coercion * is always side effect free an won't invalidate pointers etc. */ duk_hbufobj_push_validated_read(thr, h_bufarg, p_src, src_elem_size); duk_hbufobj_validated_write(thr, h_bufobj, p_dst, dst_elem_size); duk_pop(thr); p_src += src_elem_size; p_dst += dst_elem_size; } break; } #endif /* !DUK_USE_PREFER_SIZE */ case 2: { /* Copy values by index reads and writes. Let virtual * property handling take care of coercion. */ duk_uint_t i; DUK_DDD(DUK_DDDPRINT("using slow copy")); for (i = 0; i < elem_length; i++) { duk_get_prop_index(thr, 0, (duk_uarridx_t) i); duk_put_prop_index(thr, -2, (duk_uarridx_t) i); } break; } default: case 3: { /* No copy, leave zero bytes in the buffer. There's no * ambiguity with Float32/Float64 because zero bytes also * represent 0.0. */ DUK_DDD(DUK_DDDPRINT("using no copy")); break; } } return 1; fail_arguments: DUK_DCERROR_RANGE_INVALID_ARGS(thr); } #else /* DUK_USE_BUFFEROBJECT_SUPPORT */ /* When bufferobject support is disabled, new Uint8Array() could still be * supported to create a plain fixed buffer. Disabled for now. */ #if 0 DUK_INTERNAL duk_ret_t duk_bi_typedarray_constructor(duk_hthread *thr) { duk_int_t elem_length_signed; duk_uint_t byte_length; /* XXX: The same copy helpers could be shared with at least some * buffer functions. */ duk_require_constructor_call(thr); elem_length_signed = duk_require_int(thr, 0); if (elem_length_signed < 0) { goto fail_arguments; } byte_length = (duk_uint_t) elem_length_signed; (void) duk_push_fixed_buffer_zero(thr, (duk_size_t) byte_length); return 1; fail_arguments: DUK_DCERROR_RANGE_INVALID_ARGS(thr); } #endif /* 0 */ #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_INTERNAL duk_ret_t duk_bi_dataview_constructor(duk_hthread *thr) { duk_hbufobj *h_bufarg; duk_hbufobj *h_bufobj; duk_hbuffer *h_val; duk_uint_t offset; duk_uint_t length; duk_require_constructor_call(thr); h_bufarg = duk__require_bufobj_value(thr, 0); DUK_ASSERT(h_bufarg != NULL); if (DUK_HOBJECT_GET_CLASS_NUMBER((duk_hobject *) h_bufarg) != DUK_HOBJECT_CLASS_ARRAYBUFFER) { DUK_DCERROR_TYPE_INVALID_ARGS(thr); } duk__resolve_offset_opt_length(thr, h_bufarg, 1, 2, &offset, &length, 1 /*throw_flag*/); DUK_ASSERT(offset <= h_bufarg->length); DUK_ASSERT(offset + length <= h_bufarg->length); h_bufobj = duk_push_bufobj_raw(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_BUFOBJ | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DATAVIEW), DUK_BIDX_DATAVIEW_PROTOTYPE); h_val = h_bufarg->buf; if (h_val == NULL) { DUK_DCERROR_TYPE_INVALID_ARGS(thr); } h_bufobj->buf = h_val; DUK_HBUFFER_INCREF(thr, h_val); h_bufobj->offset = h_bufarg->offset + offset; h_bufobj->length = length; DUK_ASSERT(h_bufobj->shift == 0); DUK_ASSERT(h_bufobj->elem_type == DUK_HBUFOBJ_ELEM_UINT8); DUK_ASSERT(h_bufobj->is_typedarray == 0); DUK_ASSERT(h_bufobj->buf_prop == NULL); h_bufobj->buf_prop = (duk_hobject *) h_bufarg; DUK_ASSERT(h_bufarg != NULL); DUK_HBUFOBJ_INCREF(thr, h_bufarg); DUK_ASSERT_HBUFOBJ_VALID(h_bufobj); return 1; } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ /* * ArrayBuffer.isView() */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_INTERNAL duk_ret_t duk_bi_arraybuffer_isview(duk_hthread *thr) { duk_hobject *h_obj; duk_bool_t ret = 0; if (duk_is_buffer(thr, 0)) { ret = 1; } else { h_obj = duk_get_hobject(thr, 0); if (h_obj != NULL && DUK_HOBJECT_IS_BUFOBJ(h_obj)) { /* DataView needs special casing: ArrayBuffer.isView() is * true, but ->is_typedarray is 0. */ ret = ((duk_hbufobj *) h_obj)->is_typedarray || (DUK_HOBJECT_GET_CLASS_NUMBER(h_obj) == DUK_HOBJECT_CLASS_DATAVIEW); } } duk_push_boolean(thr, ret); return 1; } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ /* * Uint8Array.allocPlain() */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_INTERNAL duk_ret_t duk_bi_uint8array_allocplain(duk_hthread *thr) { duk__hbufobj_fixed_from_argvalue(thr); return 1; } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ /* * Uint8Array.plainOf() */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_INTERNAL duk_ret_t duk_bi_uint8array_plainof(duk_hthread *thr) { duk_hbufobj *h_bufobj; #if !defined(DUK_USE_PREFER_SIZE) /* Avoid churn if argument is already a plain buffer. */ if (duk_is_buffer(thr, 0)) { return 1; } #endif /* Promotes plain buffers to ArrayBuffers, so for a plain buffer * argument we'll create a pointless temporary (but still work * correctly). */ h_bufobj = duk__require_bufobj_value(thr, 0); if (h_bufobj->buf == NULL) { duk_push_undefined(thr); } else { duk_push_hbuffer(thr, h_bufobj->buf); } return 1; } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ /* * Node.js Buffer: toString([encoding], [start], [end]) */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_tostring(duk_hthread *thr) { duk_hbufobj *h_this; duk_int_t start_offset, end_offset; duk_uint8_t *buf_slice; duk_size_t slice_length; h_this = duk__get_bufobj_this(thr); if (h_this == NULL) { /* XXX: happens e.g. when evaluating: String(Buffer.prototype). */ duk_push_string(thr, "[object Object]"); return 1; } DUK_ASSERT_HBUFOBJ_VALID(h_this); /* Ignore encoding for now. */ duk__clamp_startend_nonegidx_noshift(thr, (duk_int_t) h_this->length, 1 /*idx_start*/, 2 /*idx_end*/, &start_offset, &end_offset); slice_length = (duk_size_t) (end_offset - start_offset); buf_slice = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, slice_length); /* all bytes initialized below */ DUK_ASSERT(buf_slice != NULL); /* Neutered or uncovered, TypeError. */ if (h_this->buf == NULL || !DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_this, (duk_size_t) start_offset + slice_length)) { DUK_DCERROR_TYPE_INVALID_ARGS(thr); } /* XXX: ideally we wouldn't make a copy but a view into the buffer for the * decoding process. Or the decoding helper could be changed to accept * the slice info (a buffer pointer is NOT a good approach because guaranteeing * its stability is difficult). */ DUK_ASSERT(DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_this, (duk_size_t) start_offset + slice_length)); DUK_MEMCPY((void *) buf_slice, (const void *) (DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this) + start_offset), (size_t) slice_length); /* Use the equivalent of: new TextEncoder().encode(this) to convert the * string. Result will be valid UTF-8; non-CESU-8 inputs are currently * interpreted loosely. Value stack convention is a bit odd for now. */ duk_replace(thr, 0); duk_set_top(thr, 1); return duk_textdecoder_decode_utf8_nodejs(thr); } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ /* * Node.js Buffer.prototype: toJSON() */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_tojson(duk_hthread *thr) { duk_hbufobj *h_this; duk_uint8_t *buf; duk_uint_t i, n; duk_tval *tv; h_this = duk__require_bufobj_this(thr); DUK_ASSERT(h_this != NULL); if (h_this->buf == NULL || !DUK_HBUFOBJ_VALID_SLICE(h_this)) { /* Serialize uncovered backing buffer as a null; doesn't * really matter as long we're memory safe. */ duk_push_null(thr); return 1; } duk_push_object(thr); duk_push_hstring_stridx(thr, DUK_STRIDX_UC_BUFFER); duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_TYPE); /* XXX: uninitialized would be OK */ DUK_ASSERT_DISABLE((duk_size_t) h_this->length <= (duk_size_t) DUK_UINT32_MAX); tv = duk_push_harray_with_size_outptr(thr, (duk_uint32_t) h_this->length); /* XXX: needs revision with >4G buffers */ DUK_ASSERT(h_this->buf != NULL); buf = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this); for (i = 0, n = h_this->length; i < n; i++) { DUK_TVAL_SET_U32(tv + i, (duk_uint32_t) buf[i]); /* no need for decref or incref */ } duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_DATA); return 1; } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ /* * Node.js Buffer.prototype.equals() * Node.js Buffer.prototype.compare() * Node.js Buffer.compare() */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_INTERNAL duk_ret_t duk_bi_buffer_compare_shared(duk_hthread *thr) { duk_small_uint_t magic; duk_hbufobj *h_bufarg1; duk_hbufobj *h_bufarg2; duk_small_int_t comp_res; /* XXX: keep support for plain buffers and non-Node.js buffers? */ magic = (duk_small_uint_t) duk_get_current_magic(thr); if (magic & 0x02U) { /* Static call style. */ h_bufarg1 = duk__require_bufobj_value(thr, 0); h_bufarg2 = duk__require_bufobj_value(thr, 1); } else { h_bufarg1 = duk__require_bufobj_this(thr); h_bufarg2 = duk__require_bufobj_value(thr, 0); } DUK_ASSERT(h_bufarg1 != NULL); DUK_ASSERT(h_bufarg2 != NULL); /* We want to compare the slice/view areas of the arguments. * If either slice/view is invalid (underlying buffer is shorter) * ensure equals() is false, but otherwise the only thing that * matters is to be memory safe. */ if (DUK_HBUFOBJ_VALID_SLICE(h_bufarg1) && DUK_HBUFOBJ_VALID_SLICE(h_bufarg2)) { comp_res = duk_js_data_compare((const duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufarg1->buf) + h_bufarg1->offset, (const duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufarg2->buf) + h_bufarg2->offset, (duk_size_t) h_bufarg1->length, (duk_size_t) h_bufarg2->length); } else { comp_res = -1; /* either nonzero value is ok */ } if (magic & 0x01U) { /* compare: similar to string comparison but for buffer data. */ duk_push_int(thr, comp_res); } else { /* equals */ duk_push_boolean(thr, (comp_res == 0)); } return 1; } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ /* * Node.js Buffer.prototype.fill() */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_fill(duk_hthread *thr) { duk_hbufobj *h_this; const duk_uint8_t *fill_str_ptr; duk_size_t fill_str_len; duk_uint8_t fill_value; duk_int_t fill_offset; duk_int_t fill_end; duk_size_t fill_length; duk_uint8_t *p; h_this = duk__require_bufobj_this(thr); DUK_ASSERT(h_this != NULL); if (h_this->buf == NULL) { DUK_DCERROR_TYPE_INVALID_ARGS(thr); } /* [ value offset end ] */ if (duk_is_string_notsymbol(thr, 0)) { fill_str_ptr = (const duk_uint8_t *) duk_get_lstring(thr, 0, &fill_str_len); DUK_ASSERT(fill_str_ptr != NULL); } else { /* Symbols get ToNumber() coerced and cause TypeError. */ fill_value = (duk_uint8_t) duk_to_uint32(thr, 0); fill_str_ptr = (const duk_uint8_t *) &fill_value; fill_str_len = 1; } /* Fill offset handling is more lenient than in Node.js. */ duk__clamp_startend_nonegidx_noshift(thr, (duk_int_t) h_this->length, 1 /*idx_start*/, 2 /*idx_end*/, &fill_offset, &fill_end); DUK_DDD(DUK_DDDPRINT("fill: fill_value=%02x, fill_offset=%ld, fill_end=%ld, view length=%ld", (unsigned int) fill_value, (long) fill_offset, (long) fill_end, (long) h_this->length)); DUK_ASSERT(fill_end - fill_offset >= 0); DUK_ASSERT(h_this->buf != NULL); p = (DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this) + fill_offset); fill_length = (duk_size_t) (fill_end - fill_offset); if (fill_str_len == 1) { /* Handle single character fills as memset() even when * the fill data comes from a one-char argument. */ DUK_MEMSET((void *) p, (int) fill_str_ptr[0], (size_t) fill_length); } else if (fill_str_len > 1) { duk_size_t i, n, t; for (i = 0, n = (duk_size_t) (fill_end - fill_offset), t = 0; i < n; i++) { p[i] = fill_str_ptr[t++]; if (t >= fill_str_len) { t = 0; } } } else { DUK_DDD(DUK_DDDPRINT("zero size fill pattern, ignore silently")); } /* Return the Buffer to allow chaining: b.fill(0x11).fill(0x22, 3, 5).toString() */ duk_push_this(thr); return 1; } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ /* * Node.js Buffer.prototype.write(string, [offset], [length], [encoding]) */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_write(duk_hthread *thr) { duk_hbufobj *h_this; duk_uint_t offset; duk_uint_t length; const duk_uint8_t *str_data; duk_size_t str_len; /* XXX: very inefficient support for plain buffers */ h_this = duk__require_bufobj_this(thr); DUK_ASSERT(h_this != NULL); /* Argument must be a string, e.g. a buffer is not allowed. */ str_data = (const duk_uint8_t *) duk_require_lstring_notsymbol(thr, 0, &str_len); duk__resolve_offset_opt_length(thr, h_this, 1, 2, &offset, &length, 0 /*throw_flag*/); DUK_ASSERT(offset <= h_this->length); DUK_ASSERT(offset + length <= h_this->length); /* XXX: encoding is ignored now. */ if (length > str_len) { length = (duk_uint_t) str_len; } if (DUK_HBUFOBJ_VALID_SLICE(h_this)) { /* Cannot overlap. */ DUK_MEMCPY((void *) (DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this) + offset), (const void *) str_data, (size_t) length); } else { DUK_DDD(DUK_DDDPRINT("write() target buffer is not covered, silent ignore")); } duk_push_uint(thr, length); return 1; } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ /* * Node.js Buffer.prototype.copy() */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_copy(duk_hthread *thr) { duk_hbufobj *h_this; duk_hbufobj *h_bufarg; duk_int_t source_length; duk_int_t target_length; duk_int_t target_start, source_start, source_end; duk_uint_t target_ustart, source_ustart, source_uend; duk_uint_t copy_size = 0; /* [ targetBuffer targetStart sourceStart sourceEnd ] */ h_this = duk__require_bufobj_this(thr); h_bufarg = duk__require_bufobj_value(thr, 0); DUK_ASSERT(h_this != NULL); DUK_ASSERT(h_bufarg != NULL); source_length = (duk_int_t) h_this->length; target_length = (duk_int_t) h_bufarg->length; target_start = duk_to_int(thr, 1); source_start = duk_to_int(thr, 2); if (duk_is_undefined(thr, 3)) { source_end = source_length; } else { source_end = duk_to_int(thr, 3); } DUK_DDD(DUK_DDDPRINT("checking copy args: target_start=%ld, target_length=%ld, " "source_start=%ld, source_end=%ld, source_length=%ld", (long) target_start, (long) h_bufarg->length, (long) source_start, (long) source_end, (long) source_length)); /* This behavior mostly mimics Node.js now. */ if (source_start < 0 || source_end < 0 || target_start < 0) { /* Negative offsets cause a RangeError. */ goto fail_bounds; } source_ustart = (duk_uint_t) source_start; source_uend = (duk_uint_t) source_end; target_ustart = (duk_uint_t) target_start; if (source_ustart >= source_uend || /* crossed offsets or zero size */ source_ustart >= (duk_uint_t) source_length || /* source out-of-bounds (but positive) */ target_ustart >= (duk_uint_t) target_length) { /* target out-of-bounds (but positive) */ goto silent_ignore; } if (source_uend >= (duk_uint_t) source_length) { /* Source end clamped silently to available length. */ source_uend = (duk_uint_t) source_length; } copy_size = source_uend - source_ustart; if (target_ustart + copy_size > (duk_uint_t) target_length) { /* Clamp to target's end if too long. * * NOTE: there's no overflow possibility in the comparison; * both target_ustart and copy_size are >= 0 and based on * values in duk_int_t range. Adding them as duk_uint_t * values is then guaranteed not to overflow. */ DUK_ASSERT(target_ustart + copy_size >= target_ustart); /* no overflow */ DUK_ASSERT(target_ustart + copy_size >= copy_size); /* no overflow */ copy_size = (duk_uint_t) target_length - target_ustart; } DUK_DDD(DUK_DDDPRINT("making copy: target_ustart=%lu source_ustart=%lu copy_size=%lu", (unsigned long) target_ustart, (unsigned long) source_ustart, (unsigned long) copy_size)); DUK_ASSERT(copy_size >= 1); DUK_ASSERT(source_ustart <= (duk_uint_t) source_length); DUK_ASSERT(source_ustart + copy_size <= (duk_uint_t) source_length); DUK_ASSERT(target_ustart <= (duk_uint_t) target_length); DUK_ASSERT(target_ustart + copy_size <= (duk_uint_t) target_length); /* Ensure copy is covered by underlying buffers. */ DUK_ASSERT(h_bufarg->buf != NULL); /* length check */ DUK_ASSERT(h_this->buf != NULL); /* length check */ if (DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_bufarg, target_ustart + copy_size) && DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_this, source_ustart + copy_size)) { /* Must use memmove() because copy area may overlap (source and target * buffer may be the same, or from different slices. */ DUK_MEMMOVE((void *) (DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_bufarg) + target_ustart), (const void *) (DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this) + source_ustart), (size_t) copy_size); } else { DUK_DDD(DUK_DDDPRINT("buffer copy not covered by underlying buffer(s), ignoring")); } silent_ignore: /* Return value is like write(), number of bytes written. * The return value matters because of code like: * "off += buf.copy(...)". */ duk_push_uint(thr, copy_size); return 1; fail_bounds: DUK_DCERROR_RANGE_INVALID_ARGS(thr); } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ /* * TypedArray.prototype.set() * * TypedArray set() is pretty interesting to implement because: * * - The source argument may be a plain array or a typedarray. If the * source is a TypedArray, values are decoded and re-encoded into the * target (not as a plain byte copy). This may happen even when the * element byte size is the same, e.g. integer values may be re-encoded * into floats. * * - Source and target may refer to the same underlying buffer, so that * the set() operation may overlap. The specification requires that this * must work as if a copy was made before the operation. Note that this * is NOT a simple memmove() situation because the source and target * byte sizes may be different -- e.g. a 4-byte source (Int8Array) may * expand to a 16-byte target (Uint32Array) so that the target overlaps * the source both from beginning and the end (unlike in typical memmove). * * - Even if 'buf' pointers of the source and target differ, there's no * guarantee that their memory areas don't overlap. This may be the * case with external buffers. * * Even so, it is nice to optimize for the common case: * * - Source and target separate buffers or non-overlapping. * * - Source and target have a compatible type so that a plain byte copy * is possible. Note that while e.g. uint8 and int8 are compatible * (coercion one way or another doesn't change the byte representation), * e.g. int8 and uint8clamped are NOT compatible when writing int8 * values into uint8clamped typedarray (-1 would clamp to 0 for instance). * * See test-bi-typedarray-proto-set.js. */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_INTERNAL duk_ret_t duk_bi_typedarray_set(duk_hthread *thr) { duk_hbufobj *h_this; duk_hobject *h_obj; duk_uarridx_t i, n; duk_int_t offset_signed; duk_uint_t offset_elems; duk_uint_t offset_bytes; h_this = duk__require_bufobj_this(thr); DUK_ASSERT(h_this != NULL); DUK_ASSERT_HBUFOBJ_VALID(h_this); if (h_this->buf == NULL) { DUK_DDD(DUK_DDDPRINT("source neutered, skip copy")); return 0; } duk_hbufobj_promote_plain(thr, 0); h_obj = duk_require_hobject(thr, 0); /* XXX: V8 throws a TypeError for negative values. Would it * be more useful to interpret negative offsets here from the * end of the buffer too? */ offset_signed = duk_to_int(thr, 1); if (offset_signed < 0) { /* For some reason this is a TypeError (at least in V8). */ DUK_DCERROR_TYPE_INVALID_ARGS(thr); } offset_elems = (duk_uint_t) offset_signed; offset_bytes = offset_elems << h_this->shift; if ((offset_bytes >> h_this->shift) != offset_elems) { /* Byte length would overflow. */ /* XXX: easier check with less code? */ goto fail_args; } if (offset_bytes > h_this->length) { /* Equality may be OK but >length not. Checking * this explicitly avoids some overflow cases * below. */ goto fail_args; } DUK_ASSERT(offset_bytes <= h_this->length); /* Fast path: source is a TypedArray (or any bufobj). */ if (DUK_HOBJECT_IS_BUFOBJ(h_obj)) { duk_hbufobj *h_bufarg; #if !defined(DUK_USE_PREFER_SIZE) duk_uint16_t comp_mask; #endif duk_small_int_t no_overlap = 0; duk_uint_t src_length; duk_uint_t dst_length; duk_uint_t dst_length_elems; duk_uint8_t *p_src_base; duk_uint8_t *p_src_end; duk_uint8_t *p_src; duk_uint8_t *p_dst_base; duk_uint8_t *p_dst; duk_small_uint_t src_elem_size; duk_small_uint_t dst_elem_size; h_bufarg = (duk_hbufobj *) h_obj; DUK_ASSERT_HBUFOBJ_VALID(h_bufarg); if (h_bufarg->buf == NULL) { DUK_DDD(DUK_DDDPRINT("target neutered, skip copy")); return 0; } /* Nominal size check. */ src_length = h_bufarg->length; /* bytes in source */ dst_length_elems = (src_length >> h_bufarg->shift); /* elems in source and dest */ dst_length = dst_length_elems << h_this->shift; /* bytes in dest */ if ((dst_length >> h_this->shift) != dst_length_elems) { /* Byte length would overflow. */ /* XXX: easier check with less code? */ goto fail_args; } DUK_DDD(DUK_DDDPRINT("nominal size check: src_length=%ld, dst_length=%ld", (long) src_length, (long) dst_length)); DUK_ASSERT(offset_bytes <= h_this->length); if (dst_length > h_this->length - offset_bytes) { /* Overflow not an issue because subtraction is used on the right * side and guaranteed to be >= 0. */ DUK_DDD(DUK_DDDPRINT("copy exceeds target buffer nominal length")); goto fail_args; } if (!DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_this, offset_bytes + dst_length)) { DUK_DDD(DUK_DDDPRINT("copy not covered by underlying target buffer, ignore")); return 0; } p_src_base = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_bufarg); p_dst_base = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this) + offset_bytes; /* Check actual underlying buffers for validity and that they * cover the copy. No side effects are allowed after the check * so that the validity status doesn't change. */ if (!DUK_HBUFOBJ_VALID_SLICE(h_this) || !DUK_HBUFOBJ_VALID_SLICE(h_bufarg)) { /* The condition could be more narrow and check for the * copy area only, but there's no need for fine grained * behavior when the underlying buffer is misconfigured. */ DUK_DDD(DUK_DDDPRINT("source and/or target not covered by underlying buffer, skip copy")); return 0; } /* We want to do a straight memory copy if possible: this is * an important operation because .set() is the TypedArray * way to copy chunks of memory. However, because set() * conceptually works in terms of elements, not all views are * compatible with direct byte copying. * * If we do manage a direct copy, the "overlap issue" handled * below can just be solved using memmove() because the source * and destination element sizes are necessarily equal. */ #if !defined(DUK_USE_PREFER_SIZE) DUK_ASSERT(h_this->elem_type < sizeof(duk__buffer_elemtype_copy_compatible) / sizeof(duk_uint16_t)); comp_mask = duk__buffer_elemtype_copy_compatible[h_this->elem_type]; if (comp_mask & (1 << h_bufarg->elem_type)) { DUK_ASSERT(src_length == dst_length); DUK_DDD(DUK_DDDPRINT("fast path: able to use memmove() because views are compatible")); DUK_MEMMOVE((void *) p_dst_base, (const void *) p_src_base, (size_t) dst_length); return 0; } DUK_DDD(DUK_DDDPRINT("fast path: views are not compatible with a byte copy, copy by item")); #endif /* !DUK_USE_PREFER_SIZE */ /* We want to avoid making a copy to process set() but that's * not always possible: the source and the target may overlap * and because element sizes are different, the overlap cannot * always be handled with a memmove() or choosing the copy * direction in a certain way. For example, if source type is * uint8 and target type is uint32, the target area may exceed * the source area from both ends! * * Note that because external buffers may point to the same * memory areas, we must ultimately make this check using * pointers. * * NOTE: careful with side effects: any side effect may cause * a buffer resize (or external buffer pointer/length update)! */ DUK_DDD(DUK_DDDPRINT("overlap check: p_src_base=%p, src_length=%ld, " "p_dst_base=%p, dst_length=%ld", (void *) p_src_base, (long) src_length, (void *) p_dst_base, (long) dst_length)); if (p_src_base >= p_dst_base + dst_length || /* source starts after dest ends */ p_src_base + src_length <= p_dst_base) { /* source ends before dest starts */ no_overlap = 1; } if (!no_overlap) { /* There's overlap: the desired end result is that * conceptually a copy is made to avoid "trampling" * of source data by destination writes. We make * an actual temporary copy to handle this case. */ duk_uint8_t *p_src_copy; DUK_DDD(DUK_DDDPRINT("there is overlap, make a copy of the source")); p_src_copy = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, src_length); DUK_ASSERT(p_src_copy != NULL); DUK_MEMCPY((void *) p_src_copy, (const void *) p_src_base, (size_t) src_length); p_src_base = p_src_copy; /* use p_src_base from now on */ } /* Value stack intentionally mixed size here. */ DUK_DDD(DUK_DDDPRINT("after overlap check: p_src_base=%p, src_length=%ld, " "p_dst_base=%p, dst_length=%ld, valstack top=%ld", (void *) p_src_base, (long) src_length, (void *) p_dst_base, (long) dst_length, (long) duk_get_top(thr))); /* Ready to make the copy. We must proceed element by element * and must avoid any side effects that might cause the buffer * validity check above to become invalid. * * Although we work through the value stack here, only plain * numbers are handled which should be side effect safe. */ src_elem_size = (duk_small_uint_t) (1U << h_bufarg->shift); dst_elem_size = (duk_small_uint_t) (1U << h_this->shift); p_src = p_src_base; p_dst = p_dst_base; p_src_end = p_src_base + src_length; while (p_src != p_src_end) { DUK_DDD(DUK_DDDPRINT("fast path per element copy loop: " "p_src=%p, p_src_end=%p, p_dst=%p", (void *) p_src, (void *) p_src_end, (void *) p_dst)); /* A validated read() is always a number, so it's write coercion * is always side effect free an won't invalidate pointers etc. */ duk_hbufobj_push_validated_read(thr, h_bufarg, p_src, src_elem_size); duk_hbufobj_validated_write(thr, h_this, p_dst, dst_elem_size); duk_pop(thr); p_src += src_elem_size; p_dst += dst_elem_size; } return 0; } else { /* Slow path: quite slow, but we save space by using the property code * to write coerce target values. We don't need to worry about overlap * here because the source is not a TypedArray. * * We could use the bufobj write coercion helper but since the * property read may have arbitrary side effects, full validity checks * would be needed for every element anyway. */ n = (duk_uarridx_t) duk_get_length(thr, 0); DUK_ASSERT(offset_bytes <= h_this->length); if ((n << h_this->shift) > h_this->length - offset_bytes) { /* Overflow not an issue because subtraction is used on the right * side and guaranteed to be >= 0. */ DUK_DDD(DUK_DDDPRINT("copy exceeds target buffer nominal length")); goto fail_args; } /* There's no need to check for buffer validity status for the * target here: the property access code will do that for each * element. Moreover, if we did check the validity here, side * effects from reading the source argument might invalidate * the results anyway. */ DUK_ASSERT_TOP(thr, 2); duk_push_this(thr); for (i = 0; i < n; i++) { duk_get_prop_index(thr, 0, i); duk_put_prop_index(thr, 2, offset_elems + i); } } return 0; fail_args: DUK_DCERROR_RANGE_INVALID_ARGS(thr); } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ /* * Node.js Buffer.prototype.slice([start], [end]) * ArrayBuffer.prototype.slice(begin, [end]) * TypedArray.prototype.subarray(begin, [end]) * * The API calls are almost identical; negative indices are counted from end * of buffer, and final indices are clamped (allowing crossed indices). Main * differences: * * - Copy/view behavior; Node.js .slice() and TypedArray .subarray() create * views, ArrayBuffer .slice() creates a copy * * - Resulting object has a different class and prototype depending on the * call (or 'this' argument) * * - TypedArray .subarray() arguments are element indices, not byte offsets * * - Plain buffer argument creates a plain buffer slice */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_LOCAL void duk__arraybuffer_plain_slice(duk_hthread *thr, duk_hbuffer *h_val) { duk_int_t start_offset, end_offset; duk_uint_t slice_length; duk_uint8_t *p_copy; duk_size_t copy_length; duk__clamp_startend_negidx_shifted(thr, (duk_int_t) DUK_HBUFFER_GET_SIZE(h_val), 0 /*buffer_shift*/, 0 /*idx_start*/, 1 /*idx_end*/, &start_offset, &end_offset); DUK_ASSERT(end_offset <= (duk_int_t) DUK_HBUFFER_GET_SIZE(h_val)); DUK_ASSERT(start_offset >= 0); DUK_ASSERT(end_offset >= start_offset); slice_length = (duk_uint_t) (end_offset - start_offset); p_copy = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, (duk_size_t) slice_length); DUK_ASSERT(p_copy != NULL); copy_length = slice_length; DUK_MEMCPY((void *) p_copy, (const void *) ((duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_val) + start_offset), copy_length); } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) /* Shared helper for slice/subarray operation. * Magic: 0x01=isView, 0x02=copy, 0x04=Node.js Buffer special handling. */ DUK_INTERNAL duk_ret_t duk_bi_buffer_slice_shared(duk_hthread *thr) { duk_small_int_t magic; duk_small_uint_t res_class_num; duk_small_int_t res_proto_bidx; duk_hbufobj *h_this; duk_hbufobj *h_bufobj; duk_hbuffer *h_val; duk_int_t start_offset, end_offset; duk_uint_t slice_length; duk_tval *tv; /* [ start end ] */ magic = duk_get_current_magic(thr); tv = duk_get_borrowed_this_tval(thr); DUK_ASSERT(tv != NULL); if (DUK_TVAL_IS_BUFFER(tv)) { /* For plain buffers return a plain buffer slice. */ h_val = DUK_TVAL_GET_BUFFER(tv); DUK_ASSERT(h_val != NULL); if (magic & 0x02) { /* Make copy: ArrayBuffer.prototype.slice() uses this. */ duk__arraybuffer_plain_slice(thr, h_val); return 1; } else { /* View into existing buffer: cannot be done if the * result is a plain buffer because there's no slice * info. So return an ArrayBuffer instance; coerce * the 'this' binding into an object and behave as if * the original call was for an Object-coerced plain * buffer (handled automatically by duk__require_bufobj_this()). */ DUK_DDD(DUK_DDDPRINT("slice() doesn't handle view into plain buffer, coerce 'this' to ArrayBuffer object")); /* fall through */ } } tv = NULL; /* No longer valid nor needed. */ h_this = duk__require_bufobj_this(thr); /* Slice offsets are element (not byte) offsets, which only matters * for TypedArray views, Node.js Buffer and ArrayBuffer have shift * zero so byte and element offsets are the same. Negative indices * are counted from end of slice, crossed indices are allowed (and * result in zero length result), and final values are clamped * against the current slice. There's intentionally no check * against the underlying buffer here. */ duk__clamp_startend_negidx_shifted(thr, (duk_int_t) h_this->length, (duk_uint8_t) h_this->shift, 0 /*idx_start*/, 1 /*idx_end*/, &start_offset, &end_offset); DUK_ASSERT(end_offset >= start_offset); DUK_ASSERT(start_offset >= 0); DUK_ASSERT(end_offset >= 0); slice_length = (duk_uint_t) (end_offset - start_offset); /* The resulting buffer object gets the same class and prototype as * the buffer in 'this', e.g. if the input is a Uint8Array the * result is a Uint8Array; if the input is a Float32Array, the * result is a Float32Array. The result internal prototype should * be the default prototype for the class (e.g. initial value of * Uint8Array.prototype), not copied from the argument (Duktape 1.x * did that). * * Node.js Buffers have special handling: they're Uint8Arrays as far * as the internal class is concerned, so the new Buffer should also * be an Uint8Array but inherit from Buffer.prototype. */ res_class_num = DUK_HOBJECT_GET_CLASS_NUMBER((duk_hobject *) h_this); DUK_ASSERT(res_class_num >= DUK_HOBJECT_CLASS_BUFOBJ_MIN); /* type check guarantees */ DUK_ASSERT(res_class_num <= DUK_HOBJECT_CLASS_BUFOBJ_MAX); res_proto_bidx = duk__buffer_proto_from_classnum[res_class_num - DUK_HOBJECT_CLASS_BUFOBJ_MIN]; if (magic & 0x04) { res_proto_bidx = DUK_BIDX_NODEJS_BUFFER_PROTOTYPE; } h_bufobj = duk_push_bufobj_raw(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_BUFOBJ | DUK_HOBJECT_CLASS_AS_FLAGS(res_class_num), res_proto_bidx); DUK_ASSERT(h_bufobj != NULL); DUK_ASSERT(h_bufobj->length == 0); h_bufobj->shift = h_this->shift; /* inherit */ h_bufobj->elem_type = h_this->elem_type; /* inherit */ h_bufobj->is_typedarray = magic & 0x01; DUK_ASSERT(h_bufobj->is_typedarray == 0 || h_bufobj->is_typedarray == 1); h_val = h_this->buf; if (h_val == NULL) { DUK_DCERROR_TYPE_INVALID_ARGS(thr); } if (magic & 0x02) { /* non-zero: make copy */ duk_uint8_t *p_copy; duk_size_t copy_length; p_copy = (duk_uint8_t *) duk_push_fixed_buffer_zero(thr, (duk_size_t) slice_length); /* must be zeroed, not all bytes always copied */ DUK_ASSERT(p_copy != NULL); /* Copy slice, respecting underlying buffer limits; remainder * is left as zero. */ copy_length = DUK_HBUFOBJ_CLAMP_BYTELENGTH(h_this, slice_length); DUK_MEMCPY((void *) p_copy, (const void *) (DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this) + start_offset), copy_length); h_val = duk_known_hbuffer(thr, -1); h_bufobj->buf = h_val; DUK_HBUFFER_INCREF(thr, h_val); h_bufobj->length = slice_length; DUK_ASSERT(h_bufobj->offset == 0); duk_pop(thr); /* reachable so pop OK */ } else { h_bufobj->buf = h_val; DUK_HBUFFER_INCREF(thr, h_val); h_bufobj->length = slice_length; h_bufobj->offset = h_this->offset + (duk_uint_t) start_offset; /* Copy the .buffer property, needed for TypedArray.prototype.subarray(). * * XXX: limit copy only for TypedArray classes specifically? */ DUK_ASSERT(h_bufobj->buf_prop == NULL); h_bufobj->buf_prop = h_this->buf_prop; /* may be NULL */ DUK_HOBJECT_INCREF_ALLOWNULL(thr, (duk_hobject *) h_bufobj->buf_prop); } /* unbalanced stack on purpose */ DUK_ASSERT_HBUFOBJ_VALID(h_bufobj); return 1; } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ /* * Node.js Buffer.isEncoding() */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_is_encoding(duk_hthread *thr) { const char *encoding; /* only accept lowercase 'utf8' now. */ encoding = duk_to_string(thr, 0); DUK_ASSERT(duk_is_string(thr, 0)); /* guaranteed by duk_to_string() */ duk_push_boolean(thr, DUK_STRCMP(encoding, "utf8") == 0); return 1; } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ /* * Node.js Buffer.isBuffer() */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_is_buffer(duk_hthread *thr) { duk_hobject *h; duk_hobject *h_proto; duk_bool_t ret = 0; DUK_ASSERT(duk_get_top(thr) >= 1); /* nargs */ h = duk_get_hobject(thr, 0); if (h != NULL) { h_proto = thr->builtins[DUK_BIDX_NODEJS_BUFFER_PROTOTYPE]; DUK_ASSERT(h_proto != NULL); h = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h); if (h != NULL) { ret = duk_hobject_prototype_chain_contains(thr, h, h_proto, 0 /*ignore_loop*/); } } duk_push_boolean(thr, ret); return 1; } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ /* * Node.js Buffer.byteLength() */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_byte_length(duk_hthread *thr) { const char *str; duk_size_t len; /* At the moment Buffer(<str>) will just use the string bytes as * is (ignoring encoding), so we return the string length here * unconditionally. */ /* XXX: to be revised; Old Node.js behavior just coerces any buffer * values to string: * $ node * > Buffer.byteLength(new Uint32Array(10)) * 20 * > Buffer.byteLength(new Uint32Array(100)) * 20 * (The 20 comes from '[object Uint32Array]'.length */ str = duk_to_lstring(thr, 0, &len); DUK_UNREF(str); duk_push_size_t(thr, len); return 1; } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ /* * Node.js Buffer.concat() */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_concat(duk_hthread *thr) { duk_hobject *h_arg; duk_uint_t total_length; duk_hbufobj *h_bufobj; duk_hbufobj *h_bufres; duk_hbuffer *h_val; duk_uint_t i, n; duk_uint8_t *p; duk_size_t space_left; duk_size_t copy_size; /* Node.js accepts only actual Arrays. */ h_arg = duk_require_hobject(thr, 0); if (DUK_HOBJECT_GET_CLASS_NUMBER(h_arg) != DUK_HOBJECT_CLASS_ARRAY) { DUK_DCERROR_TYPE_INVALID_ARGS(thr); } /* Compute result length and validate argument buffers. */ n = (duk_uint_t) duk_get_length(thr, 0); total_length = 0; for (i = 0; i < n; i++) { /* Neutered checks not necessary here: neutered buffers have * zero 'length' so we'll effectively skip them. */ DUK_ASSERT_TOP(thr, 2); /* [ array totalLength ] */ duk_get_prop_index(thr, 0, (duk_uarridx_t) i); /* -> [ array totalLength buf ] */ h_bufobj = duk__require_bufobj_value(thr, 2); DUK_ASSERT(h_bufobj != NULL); total_length += h_bufobj->length; if (DUK_UNLIKELY(total_length < h_bufobj->length)) { DUK_DCERROR_RANGE_INVALID_ARGS(thr); /* Wrapped. */ } duk_pop(thr); } /* In Node.js v0.12.1 a 1-element array is special and won't create a * copy, this was fixed later so an explicit check no longer needed. */ /* User totalLength overrides a computed length, but we'll check * every copy in the copy loop. Note that duk_to_int() can * technically have arbitrary side effects so we need to recheck * the buffers in the copy loop. */ if (!duk_is_undefined(thr, 1) && n > 0) { /* For n == 0, Node.js ignores totalLength argument and * returns a zero length buffer. */ duk_int_t total_length_signed; total_length_signed = duk_to_int(thr, 1); if (total_length_signed < 0) { DUK_DCERROR_RANGE_INVALID_ARGS(thr); } total_length = (duk_uint_t) total_length_signed; } h_bufres = duk_push_bufobj_raw(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_BUFOBJ | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_UINT8ARRAY), DUK_BIDX_NODEJS_BUFFER_PROTOTYPE); DUK_ASSERT(h_bufres != NULL); p = (duk_uint8_t *) duk_push_fixed_buffer_zero(thr, total_length); /* must be zeroed, all bytes not necessarily written over */ DUK_ASSERT(p != NULL); space_left = (duk_size_t) total_length; for (i = 0; i < n; i++) { DUK_ASSERT_TOP(thr, 4); /* [ array totalLength bufres buf ] */ duk_get_prop_index(thr, 0, (duk_uarridx_t) i); h_bufobj = duk__require_bufobj_value(thr, 4); DUK_ASSERT(h_bufobj != NULL); copy_size = h_bufobj->length; if (copy_size > space_left) { copy_size = space_left; } if (h_bufobj->buf != NULL && DUK_HBUFOBJ_VALID_SLICE(h_bufobj)) { DUK_MEMCPY((void *) p, (const void *) DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_bufobj), copy_size); } else { /* Just skip, leaving zeroes in the result. */ ; } p += copy_size; space_left -= copy_size; duk_pop(thr); } h_val = duk_known_hbuffer(thr, -1); duk__set_bufobj_buffer(thr, h_bufres, h_val); h_bufres->is_typedarray = 1; DUK_ASSERT_HBUFOBJ_VALID(h_bufres); duk_pop(thr); /* pop plain buffer, now reachable through h_bufres */ return 1; /* return h_bufres */ } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ /* * Shared readfield and writefield methods * * The readfield/writefield methods need support for endianness and field * types. All offsets are byte based so no offset shifting is needed. */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) /* Format of magic, bits: * 0...1: field type; 0=uint8, 1=uint16, 2=uint32, 3=float, 4=double, 5=unused, 6=unused, 7=unused * 3: endianness: 0=little, 1=big * 4: signed: 1=yes, 0=no * 5: typedarray: 1=yes, 0=no */ #define DUK__FLD_8BIT 0 #define DUK__FLD_16BIT 1 #define DUK__FLD_32BIT 2 #define DUK__FLD_FLOAT 3 #define DUK__FLD_DOUBLE 4 #define DUK__FLD_VARINT 5 #define DUK__FLD_BIGENDIAN (1 << 3) #define DUK__FLD_SIGNED (1 << 4) #define DUK__FLD_TYPEDARRAY (1 << 5) /* XXX: split into separate functions for each field type? */ DUK_INTERNAL duk_ret_t duk_bi_buffer_readfield(duk_hthread *thr) { duk_small_int_t magic = (duk_small_int_t) duk_get_current_magic(thr); duk_small_int_t magic_ftype; duk_small_int_t magic_bigendian; duk_small_int_t magic_signed; duk_small_int_t magic_typedarray; duk_small_int_t endswap; duk_hbufobj *h_this; duk_bool_t no_assert; duk_int_t offset_signed; duk_uint_t offset; duk_uint_t buffer_length; duk_uint_t check_length; duk_uint8_t *buf; duk_double_union du; magic_ftype = magic & 0x0007; magic_bigendian = magic & 0x0008; magic_signed = magic & 0x0010; magic_typedarray = magic & 0x0020; h_this = duk__require_bufobj_this(thr); /* XXX: very inefficient for plain buffers */ DUK_ASSERT(h_this != NULL); buffer_length = h_this->length; /* [ offset noAssert ], when ftype != DUK__FLD_VARINT */ /* [ offset fieldByteLength noAssert ], when ftype == DUK__FLD_VARINT */ /* [ offset littleEndian ], when DUK__FLD_TYPEDARRAY (regardless of ftype) */ /* Handle TypedArray vs. Node.js Buffer arg differences */ if (magic_typedarray) { no_assert = 0; #if defined(DUK_USE_INTEGER_LE) endswap = !duk_to_boolean(thr, 1); /* 1=little endian */ #else endswap = duk_to_boolean(thr, 1); /* 1=little endian */ #endif } else { no_assert = duk_to_boolean(thr, (magic_ftype == DUK__FLD_VARINT) ? 2 : 1); #if defined(DUK_USE_INTEGER_LE) endswap = magic_bigendian; #else endswap = !magic_bigendian; #endif } /* Offset is coerced first to signed integer range and then to unsigned. * This ensures we can add a small byte length (1-8) to the offset in * bound checks and not wrap. */ offset_signed = duk_to_int(thr, 0); offset = (duk_uint_t) offset_signed; if (offset_signed < 0) { goto fail_bounds; } DUK_DDD(DUK_DDDPRINT("readfield, buffer_length=%ld, offset=%ld, no_assert=%d, " "magic=%04x, magic_fieldtype=%d, magic_bigendian=%d, magic_signed=%d, " "endswap=%d", (long) buffer_length, (long) offset, (int) no_assert, (unsigned int) magic, (int) magic_ftype, (int) (magic_bigendian >> 3), (int) (magic_signed >> 4), (int) endswap)); /* Update 'buffer_length' to be the effective, safe limit which * takes into account the underlying buffer. This value will be * potentially invalidated by any side effect. */ check_length = DUK_HBUFOBJ_CLAMP_BYTELENGTH(h_this, buffer_length); DUK_DDD(DUK_DDDPRINT("buffer_length=%ld, check_length=%ld", (long) buffer_length, (long) check_length)); if (h_this->buf) { buf = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this); } else { /* Neutered. We could go into the switch-case safely with * buf == NULL because check_length == 0. To avoid scanbuild * warnings, fail directly instead. */ DUK_ASSERT(check_length == 0); goto fail_neutered; } DUK_ASSERT(buf != NULL); switch (magic_ftype) { case DUK__FLD_8BIT: { duk_uint8_t tmp; if (offset + 1U > check_length) { goto fail_bounds; } tmp = buf[offset]; if (magic_signed) { duk_push_int(thr, (duk_int_t) ((duk_int8_t) tmp)); } else { duk_push_uint(thr, (duk_uint_t) tmp); } break; } case DUK__FLD_16BIT: { duk_uint16_t tmp; if (offset + 2U > check_length) { goto fail_bounds; } DUK_MEMCPY((void *) du.uc, (const void *) (buf + offset), 2); tmp = du.us[0]; if (endswap) { tmp = DUK_BSWAP16(tmp); } if (magic_signed) { duk_push_int(thr, (duk_int_t) ((duk_int16_t) tmp)); } else { duk_push_uint(thr, (duk_uint_t) tmp); } break; } case DUK__FLD_32BIT: { duk_uint32_t tmp; if (offset + 4U > check_length) { goto fail_bounds; } DUK_MEMCPY((void *) du.uc, (const void *) (buf + offset), 4); tmp = du.ui[0]; if (endswap) { tmp = DUK_BSWAP32(tmp); } if (magic_signed) { duk_push_int(thr, (duk_int_t) ((duk_int32_t) tmp)); } else { duk_push_uint(thr, (duk_uint_t) tmp); } break; } case DUK__FLD_FLOAT: { duk_uint32_t tmp; if (offset + 4U > check_length) { goto fail_bounds; } DUK_MEMCPY((void *) du.uc, (const void *) (buf + offset), 4); if (endswap) { tmp = du.ui[0]; tmp = DUK_BSWAP32(tmp); du.ui[0] = tmp; } duk_push_number(thr, (duk_double_t) du.f[0]); break; } case DUK__FLD_DOUBLE: { if (offset + 8U > check_length) { goto fail_bounds; } DUK_MEMCPY((void *) du.uc, (const void *) (buf + offset), 8); if (endswap) { DUK_DBLUNION_BSWAP64(&du); } duk_push_number(thr, (duk_double_t) du.d); break; } case DUK__FLD_VARINT: { /* Node.js Buffer variable width integer field. We don't really * care about speed here, so aim for shortest algorithm. */ duk_int_t field_bytelen; duk_int_t i, i_step, i_end; #if defined(DUK_USE_64BIT_OPS) duk_int64_t tmp; duk_small_uint_t shift_tmp; #else duk_double_t tmp; duk_small_int_t highbyte; #endif const duk_uint8_t *p; field_bytelen = duk_get_int(thr, 1); /* avoid side effects! */ if (field_bytelen < 1 || field_bytelen > 6) { goto fail_field_length; } if (offset + (duk_uint_t) field_bytelen > check_length) { goto fail_bounds; } p = (const duk_uint8_t *) (buf + offset); /* Slow gathering of value using either 64-bit arithmetic * or IEEE doubles if 64-bit types not available. Handling * of negative numbers is a bit non-obvious in both cases. */ if (magic_bigendian) { /* Gather in big endian */ i = 0; i_step = 1; i_end = field_bytelen; /* one i_step over */ } else { /* Gather in little endian */ i = field_bytelen - 1; i_step = -1; i_end = -1; /* one i_step over */ } #if defined(DUK_USE_64BIT_OPS) tmp = 0; do { DUK_ASSERT(i >= 0 && i < field_bytelen); tmp = (tmp << 8) + (duk_int64_t) p[i]; i += i_step; } while (i != i_end); if (magic_signed) { /* Shift to sign extend. */ shift_tmp = (duk_small_uint_t) (64U - (duk_small_uint_t) field_bytelen * 8U); tmp = (tmp << shift_tmp) >> shift_tmp; } duk_push_i64(thr, tmp); #else highbyte = p[i]; if (magic_signed && (highbyte & 0x80) != 0) { /* 0xff => 255 - 256 = -1; 0x80 => 128 - 256 = -128 */ tmp = (duk_double_t) (highbyte - 256); } else { tmp = (duk_double_t) highbyte; } for (;;) { i += i_step; if (i == i_end) { break; } DUK_ASSERT(i >= 0 && i < field_bytelen); tmp = (tmp * 256.0) + (duk_double_t) p[i]; } duk_push_number(thr, tmp); #endif break; } default: { /* should never happen but default here */ goto fail_bounds; } } return 1; fail_neutered: fail_field_length: fail_bounds: if (no_assert) { /* Node.js return value for noAssert out-of-bounds reads is * usually (but not always) NaN. Return NaN consistently. */ duk_push_nan(thr); return 1; } DUK_DCERROR_RANGE_INVALID_ARGS(thr); } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) /* XXX: split into separate functions for each field type? */ DUK_INTERNAL duk_ret_t duk_bi_buffer_writefield(duk_hthread *thr) { duk_small_int_t magic = (duk_small_int_t) duk_get_current_magic(thr); duk_small_int_t magic_ftype; duk_small_int_t magic_bigendian; duk_small_int_t magic_signed; duk_small_int_t magic_typedarray; duk_small_int_t endswap; duk_hbufobj *h_this; duk_bool_t no_assert; duk_int_t offset_signed; duk_uint_t offset; duk_uint_t buffer_length; duk_uint_t check_length; duk_uint8_t *buf; duk_double_union du; duk_int_t nbytes = 0; magic_ftype = magic & 0x0007; magic_bigendian = magic & 0x0008; magic_signed = magic & 0x0010; magic_typedarray = magic & 0x0020; DUK_UNREF(magic_signed); h_this = duk__require_bufobj_this(thr); /* XXX: very inefficient for plain buffers */ DUK_ASSERT(h_this != NULL); buffer_length = h_this->length; /* [ value offset noAssert ], when ftype != DUK__FLD_VARINT */ /* [ value offset fieldByteLength noAssert ], when ftype == DUK__FLD_VARINT */ /* [ offset value littleEndian ], when DUK__FLD_TYPEDARRAY (regardless of ftype) */ /* Handle TypedArray vs. Node.js Buffer arg differences */ if (magic_typedarray) { no_assert = 0; #if defined(DUK_USE_INTEGER_LE) endswap = !duk_to_boolean(thr, 2); /* 1=little endian */ #else endswap = duk_to_boolean(thr, 2); /* 1=little endian */ #endif duk_swap(thr, 0, 1); /* offset/value order different from Node.js */ } else { no_assert = duk_to_boolean(thr, (magic_ftype == DUK__FLD_VARINT) ? 3 : 2); #if defined(DUK_USE_INTEGER_LE) endswap = magic_bigendian; #else endswap = !magic_bigendian; #endif } /* Offset is coerced first to signed integer range and then to unsigned. * This ensures we can add a small byte length (1-8) to the offset in * bound checks and not wrap. */ offset_signed = duk_to_int(thr, 1); offset = (duk_uint_t) offset_signed; /* We need 'nbytes' even for a failed offset; return value must be * (offset + nbytes) even when write fails due to invalid offset. */ if (magic_ftype != DUK__FLD_VARINT) { DUK_ASSERT(magic_ftype >= 0 && magic_ftype < (duk_small_int_t) (sizeof(duk__buffer_nbytes_from_fldtype) / sizeof(duk_uint8_t))); nbytes = duk__buffer_nbytes_from_fldtype[magic_ftype]; } else { nbytes = duk_get_int(thr, 2); if (nbytes < 1 || nbytes > 6) { goto fail_field_length; } } DUK_ASSERT(nbytes >= 1 && nbytes <= 8); /* Now we can check offset validity. */ if (offset_signed < 0) { goto fail_bounds; } DUK_DDD(DUK_DDDPRINT("writefield, value=%!T, buffer_length=%ld, offset=%ld, no_assert=%d, " "magic=%04x, magic_fieldtype=%d, magic_bigendian=%d, magic_signed=%d, " "endswap=%d", duk_get_tval(thr, 0), (long) buffer_length, (long) offset, (int) no_assert, (unsigned int) magic, (int) magic_ftype, (int) (magic_bigendian >> 3), (int) (magic_signed >> 4), (int) endswap)); /* Coerce value to a number before computing check_length, so that * the field type specific coercion below can't have side effects * that would invalidate check_length. */ duk_to_number(thr, 0); /* Update 'buffer_length' to be the effective, safe limit which * takes into account the underlying buffer. This value will be * potentially invalidated by any side effect. */ check_length = DUK_HBUFOBJ_CLAMP_BYTELENGTH(h_this, buffer_length); DUK_DDD(DUK_DDDPRINT("buffer_length=%ld, check_length=%ld", (long) buffer_length, (long) check_length)); if (h_this->buf) { buf = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this); } else { /* Neutered. We could go into the switch-case safely with * buf == NULL because check_length == 0. To avoid scanbuild * warnings, fail directly instead. */ DUK_ASSERT(check_length == 0); goto fail_neutered; } DUK_ASSERT(buf != NULL); switch (magic_ftype) { case DUK__FLD_8BIT: { if (offset + 1U > check_length) { goto fail_bounds; } /* sign doesn't matter when writing */ buf[offset] = (duk_uint8_t) duk_to_uint32(thr, 0); break; } case DUK__FLD_16BIT: { duk_uint16_t tmp; if (offset + 2U > check_length) { goto fail_bounds; } tmp = (duk_uint16_t) duk_to_uint32(thr, 0); if (endswap) { tmp = DUK_BSWAP16(tmp); } du.us[0] = tmp; /* sign doesn't matter when writing */ DUK_MEMCPY((void *) (buf + offset), (const void *) du.uc, 2); break; } case DUK__FLD_32BIT: { duk_uint32_t tmp; if (offset + 4U > check_length) { goto fail_bounds; } tmp = (duk_uint32_t) duk_to_uint32(thr, 0); if (endswap) { tmp = DUK_BSWAP32(tmp); } du.ui[0] = tmp; /* sign doesn't matter when writing */ DUK_MEMCPY((void *) (buf + offset), (const void *) du.uc, 4); break; } case DUK__FLD_FLOAT: { duk_uint32_t tmp; if (offset + 4U > check_length) { goto fail_bounds; } du.f[0] = (duk_float_t) duk_to_number(thr, 0); if (endswap) { tmp = du.ui[0]; tmp = DUK_BSWAP32(tmp); du.ui[0] = tmp; } /* sign doesn't matter when writing */ DUK_MEMCPY((void *) (buf + offset), (const void *) du.uc, 4); break; } case DUK__FLD_DOUBLE: { if (offset + 8U > check_length) { goto fail_bounds; } du.d = (duk_double_t) duk_to_number(thr, 0); if (endswap) { DUK_DBLUNION_BSWAP64(&du); } /* sign doesn't matter when writing */ DUK_MEMCPY((void *) (buf + offset), (const void *) du.uc, 8); break; } case DUK__FLD_VARINT: { /* Node.js Buffer variable width integer field. We don't really * care about speed here, so aim for shortest algorithm. */ duk_int_t field_bytelen; duk_int_t i, i_step, i_end; #if defined(DUK_USE_64BIT_OPS) duk_int64_t tmp; #else duk_double_t tmp; #endif duk_uint8_t *p; field_bytelen = (duk_int_t) nbytes; if (offset + (duk_uint_t) field_bytelen > check_length) { goto fail_bounds; } /* Slow writing of value using either 64-bit arithmetic * or IEEE doubles if 64-bit types not available. There's * no special sign handling when writing varints. */ if (magic_bigendian) { /* Write in big endian */ i = field_bytelen; /* one i_step added at top of loop */ i_step = -1; i_end = 0; } else { /* Write in little endian */ i = -1; /* one i_step added at top of loop */ i_step = 1; i_end = field_bytelen - 1; } /* XXX: The duk_to_number() cast followed by integer coercion * is platform specific so NaN, +/- Infinity, and out-of-bounds * values result in platform specific output now. * See: test-bi-nodejs-buffer-proto-varint-special.js */ #if defined(DUK_USE_64BIT_OPS) tmp = (duk_int64_t) duk_to_number(thr, 0); p = (duk_uint8_t *) (buf + offset); do { i += i_step; DUK_ASSERT(i >= 0 && i < field_bytelen); p[i] = (duk_uint8_t) (tmp & 0xff); tmp = tmp >> 8; /* unnecessary shift for last byte */ } while (i != i_end); #else tmp = duk_to_number(thr, 0); p = (duk_uint8_t *) (buf + offset); do { i += i_step; tmp = DUK_FLOOR(tmp); DUK_ASSERT(i >= 0 && i < field_bytelen); p[i] = (duk_uint8_t) (DUK_FMOD(tmp, 256.0)); tmp = tmp / 256.0; /* unnecessary div for last byte */ } while (i != i_end); #endif break; } default: { /* should never happen but default here */ goto fail_bounds; } } /* Node.js Buffer: return offset + #bytes written (i.e. next * write offset). */ if (magic_typedarray) { /* For TypedArrays 'undefined' return value is specified * by ES2015 (matches V8). */ return 0; } duk_push_uint(thr, offset + (duk_uint_t) nbytes); return 1; fail_neutered: fail_field_length: fail_bounds: if (no_assert) { /* Node.js return value for failed writes is offset + #bytes * that would have been written. */ /* XXX: for negative input offsets, 'offset' will be a large * positive value so the result here is confusing. */ if (magic_typedarray) { return 0; } duk_push_uint(thr, offset + (duk_uint_t) nbytes); return 1; } DUK_DCERROR_RANGE_INVALID_ARGS(thr); } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ /* * Accessors for .buffer, .byteLength, .byteOffset */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_LOCAL duk_hbufobj *duk__autospawn_arraybuffer(duk_hthread *thr, duk_hbuffer *h_buf) { duk_hbufobj *h_res; h_res = duk_push_bufobj_raw(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_BUFOBJ | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ARRAYBUFFER), DUK_BIDX_ARRAYBUFFER_PROTOTYPE); DUK_ASSERT(h_res != NULL); DUK_UNREF(h_res); duk__set_bufobj_buffer(thr, h_res, h_buf); DUK_ASSERT_HBUFOBJ_VALID(h_res); DUK_ASSERT(h_res->buf_prop == NULL); return h_res; } DUK_INTERNAL duk_ret_t duk_bi_typedarray_buffer_getter(duk_hthread *thr) { duk_hbufobj *h_bufobj; h_bufobj = (duk_hbufobj *) duk__getrequire_bufobj_this(thr, DUK__BUFOBJ_FLAG_THROW /*flags*/); DUK_ASSERT(h_bufobj != NULL); if (DUK_HEAPHDR_IS_BUFFER((duk_heaphdr *) h_bufobj)) { DUK_DD(DUK_DDPRINT("autospawn ArrayBuffer for plain buffer")); (void) duk__autospawn_arraybuffer(thr, (duk_hbuffer *) h_bufobj); return 1; } else { if (h_bufobj->buf_prop == NULL && DUK_HOBJECT_GET_CLASS_NUMBER((duk_hobject *) h_bufobj) != DUK_HOBJECT_CLASS_ARRAYBUFFER && h_bufobj->buf != NULL) { duk_hbufobj *h_arrbuf; DUK_DD(DUK_DDPRINT("autospawn ArrayBuffer for typed array or DataView")); h_arrbuf = duk__autospawn_arraybuffer(thr, h_bufobj->buf); if (h_bufobj->buf_prop == NULL) { /* Must recheck buf_prop, in case ArrayBuffer * alloc had a side effect which already filled * it! */ /* Set ArrayBuffer's .byteOffset and .byteLength based * on the view so that Arraybuffer[view.byteOffset] * matches view[0]. */ h_arrbuf->offset = 0; DUK_ASSERT(h_bufobj->offset + h_bufobj->length >= h_bufobj->offset); /* Wrap check on creation. */ h_arrbuf->length = h_bufobj->offset + h_bufobj->length; DUK_ASSERT(h_arrbuf->buf_prop == NULL); DUK_ASSERT(h_bufobj->buf_prop == NULL); h_bufobj->buf_prop = (duk_hobject *) h_arrbuf; DUK_HBUFOBJ_INCREF(thr, h_arrbuf); /* Now reachable and accounted for. */ } /* Left on stack; pushed for the second time below (OK). */ } if (h_bufobj->buf_prop) { duk_push_hobject(thr, h_bufobj->buf_prop); return 1; } } return 0; } DUK_INTERNAL duk_ret_t duk_bi_typedarray_byteoffset_getter(duk_hthread *thr) { duk_hbufobj *h_bufobj; h_bufobj = (duk_hbufobj *) duk__getrequire_bufobj_this(thr, DUK__BUFOBJ_FLAG_THROW /*flags*/); DUK_ASSERT(h_bufobj != NULL); if (DUK_HEAPHDR_IS_BUFFER((duk_heaphdr *) h_bufobj)) { duk_push_uint(thr, 0); } else { /* If neutered must return 0; offset is zeroed during * neutering. */ duk_push_uint(thr, h_bufobj->offset); } return 1; } DUK_INTERNAL duk_ret_t duk_bi_typedarray_bytelength_getter(duk_hthread *thr) { duk_hbufobj *h_bufobj; h_bufobj = (duk_hbufobj *) duk__getrequire_bufobj_this(thr, DUK__BUFOBJ_FLAG_THROW /*flags*/); DUK_ASSERT(h_bufobj != NULL); if (DUK_HEAPHDR_IS_BUFFER((duk_heaphdr *) h_bufobj)) { duk_hbuffer *h_buf; h_buf = (duk_hbuffer *) h_bufobj; DUK_ASSERT(DUK_HBUFFER_GET_SIZE(h_buf) <= DUK_UINT_MAX); /* Buffer limits. */ duk_push_uint(thr, (duk_uint_t) DUK_HBUFFER_GET_SIZE(h_buf)); } else { /* If neutered must return 0; length is zeroed during * neutering. */ duk_push_uint(thr, h_bufobj->length); } return 1; } #else /* DUK_USE_BUFFEROBJECT_SUPPORT */ /* No .buffer getter without ArrayBuffer support. */ #if 0 DUK_INTERNAL duk_ret_t duk_bi_typedarray_buffer_getter(duk_hthread *thr) { return 0; } #endif DUK_INTERNAL duk_ret_t duk_bi_typedarray_byteoffset_getter(duk_hthread *thr) { duk_push_uint(thr, 0); return 1; } DUK_INTERNAL duk_ret_t duk_bi_typedarray_bytelength_getter(duk_hthread *thr) { duk_hbuffer *h_buf; /* XXX: helper? */ duk_push_this(thr); h_buf = duk_require_hbuffer(thr, -1); duk_push_uint(thr, DUK_HBUFFER_GET_SIZE(h_buf)); return 1; } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ /* automatic undefs */ #undef DUK__BUFOBJ_FLAG_PROMOTE #undef DUK__BUFOBJ_FLAG_THROW #undef DUK__FLD_16BIT #undef DUK__FLD_32BIT #undef DUK__FLD_8BIT #undef DUK__FLD_BIGENDIAN #undef DUK__FLD_DOUBLE #undef DUK__FLD_FLOAT #undef DUK__FLD_SIGNED #undef DUK__FLD_TYPEDARRAY #undef DUK__FLD_VARINT #line 1 "duk_bi_date.c" /* * Date built-ins * * Unlike most built-ins, Date has some platform dependencies for getting * UTC time, converting between UTC and local time, and parsing and * formatting time values. These are all abstracted behind DUK_USE_xxx * config options. There are built-in platform specific providers for * POSIX and Windows, but external providers can also be used. * * See doc/datetime.rst. * */ /* #include duk_internal.h -> already included */ /* XXX: currently defines unnecessary symbols when DUK_USE_DATE_BUILTIN is disabled. */ /* * Forward declarations */ DUK_LOCAL_DECL duk_double_t duk__push_this_get_timeval_tzoffset(duk_hthread *thr, duk_small_uint_t flags, duk_int_t *out_tzoffset); DUK_LOCAL_DECL duk_double_t duk__push_this_get_timeval(duk_hthread *thr, duk_small_uint_t flags); DUK_LOCAL_DECL void duk__twodigit_year_fixup(duk_hthread *thr, duk_idx_t idx_val); DUK_LOCAL_DECL duk_ret_t duk__set_this_timeval_from_dparts(duk_hthread *thr, duk_double_t *dparts, duk_small_uint_t flags); /* * Other file level defines */ /* Debug macro to print all parts and dparts (used manually because of debug level). */ #define DUK__DPRINT_PARTS_AND_DPARTS(parts,dparts) do { \ DUK_D(DUK_DPRINT("parts: %ld %ld %ld %ld %ld %ld %ld %ld, dparts: %lf %lf %lf %lf %lf %lf %lf %lf", \ (long) (parts)[0], (long) (parts)[1], \ (long) (parts)[2], (long) (parts)[3], \ (long) (parts)[4], (long) (parts)[5], \ (long) (parts)[6], (long) (parts)[7], \ (double) (dparts)[0], (double) (dparts)[1], \ (double) (dparts)[2], (double) (dparts)[3], \ (double) (dparts)[4], (double) (dparts)[5], \ (double) (dparts)[6], (double) (dparts)[7])); \ } while (0) #define DUK__DPRINT_PARTS(parts) do { \ DUK_D(DUK_DPRINT("parts: %ld %ld %ld %ld %ld %ld %ld %ld", \ (long) (parts)[0], (long) (parts)[1], \ (long) (parts)[2], (long) (parts)[3], \ (long) (parts)[4], (long) (parts)[5], \ (long) (parts)[6], (long) (parts)[7])); \ } while (0) #define DUK__DPRINT_DPARTS(dparts) do { \ DUK_D(DUK_DPRINT("dparts: %lf %lf %lf %lf %lf %lf %lf %lf", \ (double) (dparts)[0], (double) (dparts)[1], \ (double) (dparts)[2], (double) (dparts)[3], \ (double) (dparts)[4], (double) (dparts)[5], \ (double) (dparts)[6], (double) (dparts)[7])); \ } while (0) /* Equivalent year for DST calculations outside [1970,2038[ range, see * E5 Section 15.9.1.8. Equivalent year has the same leap-year-ness and * starts with the same weekday on Jan 1. * https://bugzilla.mozilla.org/show_bug.cgi?id=351066 */ #define DUK__YEAR(x) ((duk_uint8_t) ((x) - 1970)) DUK_LOCAL duk_uint8_t duk__date_equivyear[14] = { #if 1 /* This is based on V8 EquivalentYear() algorithm (see util/genequivyear.py): * http://code.google.com/p/v8/source/browse/trunk/src/date.h#146 */ /* non-leap year: sunday, monday, ... */ DUK__YEAR(2023), DUK__YEAR(2035), DUK__YEAR(2019), DUK__YEAR(2031), DUK__YEAR(2015), DUK__YEAR(2027), DUK__YEAR(2011), /* leap year: sunday, monday, ... */ DUK__YEAR(2012), DUK__YEAR(2024), DUK__YEAR(2008), DUK__YEAR(2020), DUK__YEAR(2032), DUK__YEAR(2016), DUK__YEAR(2028) #endif #if 0 /* This is based on Rhino EquivalentYear() algorithm: * https://github.com/mozilla/rhino/blob/f99cc11d616f0cdda2c42bde72b3484df6182947/src/org/mozilla/javascript/NativeDate.java */ /* non-leap year: sunday, monday, ... */ DUK__YEAR(1978), DUK__YEAR(1973), DUK__YEAR(1985), DUK__YEAR(1986), DUK__YEAR(1981), DUK__YEAR(1971), DUK__YEAR(1977), /* leap year: sunday, monday, ... */ DUK__YEAR(1984), DUK__YEAR(1996), DUK__YEAR(1980), DUK__YEAR(1992), DUK__YEAR(1976), DUK__YEAR(1988), DUK__YEAR(1972) #endif }; /* * ISO 8601 subset parser. */ /* Parser part count. */ #define DUK__NUM_ISO8601_PARSER_PARTS 9 /* Parser part indices. */ #define DUK__PI_YEAR 0 #define DUK__PI_MONTH 1 #define DUK__PI_DAY 2 #define DUK__PI_HOUR 3 #define DUK__PI_MINUTE 4 #define DUK__PI_SECOND 5 #define DUK__PI_MILLISECOND 6 #define DUK__PI_TZHOUR 7 #define DUK__PI_TZMINUTE 8 /* Parser part masks. */ #define DUK__PM_YEAR (1 << DUK__PI_YEAR) #define DUK__PM_MONTH (1 << DUK__PI_MONTH) #define DUK__PM_DAY (1 << DUK__PI_DAY) #define DUK__PM_HOUR (1 << DUK__PI_HOUR) #define DUK__PM_MINUTE (1 << DUK__PI_MINUTE) #define DUK__PM_SECOND (1 << DUK__PI_SECOND) #define DUK__PM_MILLISECOND (1 << DUK__PI_MILLISECOND) #define DUK__PM_TZHOUR (1 << DUK__PI_TZHOUR) #define DUK__PM_TZMINUTE (1 << DUK__PI_TZMINUTE) /* Parser separator indices. */ #define DUK__SI_PLUS 0 #define DUK__SI_MINUS 1 #define DUK__SI_T 2 #define DUK__SI_SPACE 3 #define DUK__SI_COLON 4 #define DUK__SI_PERIOD 5 #define DUK__SI_Z 6 #define DUK__SI_NUL 7 /* Parser separator masks. */ #define DUK__SM_PLUS (1 << DUK__SI_PLUS) #define DUK__SM_MINUS (1 << DUK__SI_MINUS) #define DUK__SM_T (1 << DUK__SI_T) #define DUK__SM_SPACE (1 << DUK__SI_SPACE) #define DUK__SM_COLON (1 << DUK__SI_COLON) #define DUK__SM_PERIOD (1 << DUK__SI_PERIOD) #define DUK__SM_Z (1 << DUK__SI_Z) #define DUK__SM_NUL (1 << DUK__SI_NUL) /* Rule control flags. */ #define DUK__CF_NEG (1 << 0) /* continue matching, set neg_tzoffset flag */ #define DUK__CF_ACCEPT (1 << 1) /* accept string */ #define DUK__CF_ACCEPT_NUL (1 << 2) /* accept string if next char is NUL (otherwise reject) */ #define DUK__PACK_RULE(partmask,sepmask,nextpart,flags) \ ((duk_uint32_t) (partmask) + \ (((duk_uint32_t) (sepmask)) << 9) + \ (((duk_uint32_t) (nextpart)) << 17) + \ (((duk_uint32_t) (flags)) << 21)) #define DUK__UNPACK_RULE(rule,var_nextidx,var_flags) do { \ (var_nextidx) = (duk_small_uint_t) (((rule) >> 17) & 0x0f); \ (var_flags) = (duk_small_uint_t) ((rule) >> 21); \ } while (0) #define DUK__RULE_MASK_PART_SEP 0x1ffffUL /* Matching separator index is used in the control table */ DUK_LOCAL const duk_uint8_t duk__parse_iso8601_seps[] = { DUK_ASC_PLUS /*0*/, DUK_ASC_MINUS /*1*/, DUK_ASC_UC_T /*2*/, DUK_ASC_SPACE /*3*/, DUK_ASC_COLON /*4*/, DUK_ASC_PERIOD /*5*/, DUK_ASC_UC_Z /*6*/, DUK_ASC_NUL /*7*/ }; /* Rule table: first matching rule is used to determine what to do next. */ DUK_LOCAL const duk_uint32_t duk__parse_iso8601_control[] = { DUK__PACK_RULE(DUK__PM_YEAR, DUK__SM_MINUS, DUK__PI_MONTH, 0), DUK__PACK_RULE(DUK__PM_MONTH, DUK__SM_MINUS, DUK__PI_DAY, 0), DUK__PACK_RULE(DUK__PM_YEAR | DUK__PM_MONTH | DUK__PM_DAY, DUK__SM_T | DUK__SM_SPACE, DUK__PI_HOUR, 0), DUK__PACK_RULE(DUK__PM_HOUR, DUK__SM_COLON, DUK__PI_MINUTE, 0), DUK__PACK_RULE(DUK__PM_MINUTE, DUK__SM_COLON, DUK__PI_SECOND, 0), DUK__PACK_RULE(DUK__PM_SECOND, DUK__SM_PERIOD, DUK__PI_MILLISECOND, 0), DUK__PACK_RULE(DUK__PM_TZHOUR, DUK__SM_COLON, DUK__PI_TZMINUTE, 0), DUK__PACK_RULE(DUK__PM_YEAR | DUK__PM_MONTH | DUK__PM_DAY | DUK__PM_HOUR /*Note1*/ | DUK__PM_MINUTE | DUK__PM_SECOND | DUK__PM_MILLISECOND, DUK__SM_PLUS, DUK__PI_TZHOUR, 0), DUK__PACK_RULE(DUK__PM_YEAR | DUK__PM_MONTH | DUK__PM_DAY | DUK__PM_HOUR /*Note1*/ | DUK__PM_MINUTE | DUK__PM_SECOND | DUK__PM_MILLISECOND, DUK__SM_MINUS, DUK__PI_TZHOUR, DUK__CF_NEG), DUK__PACK_RULE(DUK__PM_YEAR | DUK__PM_MONTH | DUK__PM_DAY | DUK__PM_HOUR /*Note1*/ | DUK__PM_MINUTE | DUK__PM_SECOND | DUK__PM_MILLISECOND, DUK__SM_Z, 0, DUK__CF_ACCEPT_NUL), DUK__PACK_RULE(DUK__PM_YEAR | DUK__PM_MONTH | DUK__PM_DAY | DUK__PM_HOUR /*Note1*/ | DUK__PM_MINUTE | DUK__PM_SECOND | DUK__PM_MILLISECOND | DUK__PM_TZHOUR /*Note2*/ | DUK__PM_TZMINUTE, DUK__SM_NUL, 0, DUK__CF_ACCEPT) /* Note1: the specification doesn't require matching a time form with * just hours ("HH"), but we accept it here, e.g. "2012-01-02T12Z". * * Note2: the specification doesn't require matching a timezone offset * with just hours ("HH"), but accept it here, e.g. "2012-01-02T03:04:05+02" */ }; DUK_LOCAL duk_bool_t duk__parse_string_iso8601_subset(duk_hthread *thr, const char *str) { duk_int_t parts[DUK__NUM_ISO8601_PARSER_PARTS]; duk_double_t dparts[DUK_DATE_IDX_NUM_PARTS]; duk_double_t d; const duk_uint8_t *p; duk_small_uint_t part_idx = 0; duk_int_t accum = 0; duk_small_uint_t ndigits = 0; duk_bool_t neg_year = 0; duk_bool_t neg_tzoffset = 0; duk_uint_fast8_t ch; duk_small_uint_t i; /* During parsing, month and day are one-based; set defaults here. */ DUK_MEMZERO(parts, sizeof(parts)); DUK_ASSERT(parts[DUK_DATE_IDX_YEAR] == 0); /* don't care value, year is mandatory */ parts[DUK_DATE_IDX_MONTH] = 1; parts[DUK_DATE_IDX_DAY] = 1; /* Special handling for year sign. */ p = (const duk_uint8_t *) str; ch = p[0]; if (ch == DUK_ASC_PLUS) { p++; } else if (ch == DUK_ASC_MINUS) { neg_year = 1; p++; } for (;;) { ch = *p++; DUK_DDD(DUK_DDDPRINT("parsing, part_idx=%ld, char=%ld ('%c')", (long) part_idx, (long) ch, (int) ((ch >= 0x20 && ch <= 0x7e) ? ch : DUK_ASC_QUESTION))); if (ch >= DUK_ASC_0 && ch <= DUK_ASC_9) { if (ndigits >= 9) { DUK_DDD(DUK_DDDPRINT("too many digits -> reject")); goto reject; } if (part_idx == DUK__PI_MILLISECOND && ndigits >= 3) { /* ignore millisecond fractions after 3 */ } else { accum = accum * 10 + ((duk_int_t) ch) - ((duk_int_t) DUK_ASC_0) + 0x00; ndigits++; } } else { duk_uint_fast32_t match_val; duk_small_uint_t sep_idx; if (ndigits <= 0) { goto reject; } if (part_idx == DUK__PI_MILLISECOND) { /* complete the millisecond field */ while (ndigits < 3) { accum *= 10; ndigits++; } } parts[part_idx] = accum; DUK_DDD(DUK_DDDPRINT("wrote part %ld -> value %ld", (long) part_idx, (long) accum)); accum = 0; ndigits = 0; for (i = 0; i < (duk_small_uint_t) (sizeof(duk__parse_iso8601_seps) / sizeof(duk_uint8_t)); i++) { if (duk__parse_iso8601_seps[i] == ch) { break; } } if (i == (duk_small_uint_t) (sizeof(duk__parse_iso8601_seps) / sizeof(duk_uint8_t))) { DUK_DDD(DUK_DDDPRINT("separator character doesn't match -> reject")); goto reject; } sep_idx = i; match_val = (1UL << part_idx) + (1UL << (sep_idx + 9)); /* match against rule part/sep bits */ for (i = 0; i < (duk_small_uint_t) (sizeof(duk__parse_iso8601_control) / sizeof(duk_uint32_t)); i++) { duk_uint_fast32_t rule = duk__parse_iso8601_control[i]; duk_small_uint_t nextpart; duk_small_uint_t cflags; DUK_DDD(DUK_DDDPRINT("part_idx=%ld, sep_idx=%ld, match_val=0x%08lx, considering rule=0x%08lx", (long) part_idx, (long) sep_idx, (unsigned long) match_val, (unsigned long) rule)); if ((rule & match_val) != match_val) { continue; } DUK__UNPACK_RULE(rule, nextpart, cflags); DUK_DDD(DUK_DDDPRINT("rule match -> part_idx=%ld, sep_idx=%ld, match_val=0x%08lx, " "rule=0x%08lx -> nextpart=%ld, cflags=0x%02lx", (long) part_idx, (long) sep_idx, (unsigned long) match_val, (unsigned long) rule, (long) nextpart, (unsigned long) cflags)); if (cflags & DUK__CF_NEG) { neg_tzoffset = 1; } if (cflags & DUK__CF_ACCEPT) { goto accept; } if (cflags & DUK__CF_ACCEPT_NUL) { DUK_ASSERT(*(p - 1) != (char) 0); if (*p == DUK_ASC_NUL) { goto accept; } goto reject; } part_idx = nextpart; break; } /* rule match */ if (i == (duk_small_uint_t) (sizeof(duk__parse_iso8601_control) / sizeof(duk_uint32_t))) { DUK_DDD(DUK_DDDPRINT("no rule matches -> reject")); goto reject; } if (ch == 0) { /* This shouldn't be necessary, but check just in case * to avoid any chance of overruns. */ DUK_DDD(DUK_DDDPRINT("NUL after rule matching (should not happen) -> reject")); goto reject; } } /* if-digit-else-ctrl */ } /* char loop */ /* We should never exit the loop above. */ DUK_UNREACHABLE(); reject: DUK_DDD(DUK_DDDPRINT("reject")); return 0; accept: DUK_DDD(DUK_DDDPRINT("accept")); /* Apply timezone offset to get the main parts in UTC */ if (neg_year) { parts[DUK__PI_YEAR] = -parts[DUK__PI_YEAR]; } if (neg_tzoffset) { parts[DUK__PI_HOUR] += parts[DUK__PI_TZHOUR]; parts[DUK__PI_MINUTE] += parts[DUK__PI_TZMINUTE]; } else { parts[DUK__PI_HOUR] -= parts[DUK__PI_TZHOUR]; parts[DUK__PI_MINUTE] -= parts[DUK__PI_TZMINUTE]; } parts[DUK__PI_MONTH] -= 1; /* zero-based month */ parts[DUK__PI_DAY] -= 1; /* zero-based day */ /* Use double parts, they tolerate unnormalized time. * * Note: DUK_DATE_IDX_WEEKDAY is initialized with a bogus value (DUK__PI_TZHOUR) * on purpose. It won't be actually used by duk_bi_date_get_timeval_from_dparts(), * but will make the value initialized just in case, and avoid any * potential for Valgrind issues. */ for (i = 0; i < DUK_DATE_IDX_NUM_PARTS; i++) { DUK_DDD(DUK_DDDPRINT("part[%ld] = %ld", (long) i, (long) parts[i])); dparts[i] = parts[i]; } d = duk_bi_date_get_timeval_from_dparts(dparts, 0 /*flags*/); duk_push_number(thr, d); return 1; } /* * Date/time parsing helper. * * Parse a datetime string into a time value. We must first try to parse * the input according to the standard format in E5.1 Section 15.9.1.15. * If that fails, we can try to parse using custom parsing, which can * either be platform neutral (custom code) or platform specific (using * existing platform API calls). * * Note in particular that we must parse whatever toString(), toUTCString(), * and toISOString() can produce; see E5.1 Section 15.9.4.2. * * Returns 1 to allow tail calling. * * There is much room for improvement here with respect to supporting * alternative datetime formats. For instance, V8 parses '2012-01-01' as * UTC and '2012/01/01' as local time. */ DUK_LOCAL duk_ret_t duk__parse_string(duk_hthread *thr, const char *str) { /* XXX: there is a small risk here: because the ISO 8601 parser is * very loose, it may end up parsing some datetime values which * would be better parsed with a platform specific parser. */ DUK_ASSERT(str != NULL); DUK_DDD(DUK_DDDPRINT("parse datetime from string '%s'", (const char *) str)); if (duk__parse_string_iso8601_subset(thr, str) != 0) { return 1; } #if defined(DUK_USE_DATE_PARSE_STRING) /* Contract, either: * - Push value on stack and return 1 * - Don't push anything on stack and return 0 */ if (DUK_USE_DATE_PARSE_STRING(thr, str) != 0) { return 1; } #else /* No platform-specific parsing, this is not an error. */ #endif duk_push_nan(thr); return 1; } /* * Calendar helpers * * Some helpers are used for getters and can operate on normalized values * which can be represented with 32-bit signed integers. Other helpers are * needed by setters and operate on un-normalized double values, must watch * out for non-finite numbers etc. */ DUK_LOCAL duk_uint8_t duk__days_in_month[12] = { (duk_uint8_t) 31, (duk_uint8_t) 28, (duk_uint8_t) 31, (duk_uint8_t) 30, (duk_uint8_t) 31, (duk_uint8_t) 30, (duk_uint8_t) 31, (duk_uint8_t) 31, (duk_uint8_t) 30, (duk_uint8_t) 31, (duk_uint8_t) 30, (duk_uint8_t) 31 }; /* Maximum iteration count for computing UTC-to-local time offset when * creating an Ecmascript time value from local parts. */ #define DUK__LOCAL_TZOFFSET_MAXITER 4 /* Because 'day since epoch' can be negative and is used to compute weekday * using a modulo operation, add this multiple of 7 to avoid negative values * when year is below 1970 epoch. Ecmascript time values are restricted to * +/- 100 million days from epoch, so this adder fits nicely into 32 bits. * Round to a multiple of 7 (= floor(100000000 / 7) * 7) and add margin. */ #define DUK__WEEKDAY_MOD_ADDER (20000000 * 7) /* 0x08583b00 */ DUK_INTERNAL duk_bool_t duk_bi_date_is_leap_year(duk_int_t year) { if ((year % 4) != 0) { return 0; } if ((year % 100) != 0) { return 1; } if ((year % 400) != 0) { return 0; } return 1; } DUK_INTERNAL duk_bool_t duk_bi_date_timeval_in_valid_range(duk_double_t x) { return (x >= -DUK_DATE_MSEC_100M_DAYS && x <= DUK_DATE_MSEC_100M_DAYS); } DUK_INTERNAL duk_bool_t duk_bi_date_timeval_in_leeway_range(duk_double_t x) { return (x >= -DUK_DATE_MSEC_100M_DAYS_LEEWAY && x <= DUK_DATE_MSEC_100M_DAYS_LEEWAY); } DUK_INTERNAL duk_bool_t duk_bi_date_year_in_valid_range(duk_double_t x) { return (x >= DUK_DATE_MIN_ECMA_YEAR && x <= DUK_DATE_MAX_ECMA_YEAR); } DUK_LOCAL duk_double_t duk__timeclip(duk_double_t x) { if (!DUK_ISFINITE(x)) { return DUK_DOUBLE_NAN; } if (!duk_bi_date_timeval_in_valid_range(x)) { return DUK_DOUBLE_NAN; } x = duk_js_tointeger_number(x); /* Here we'd have the option to normalize -0 to +0. */ return x; } /* Integer division which floors also negative values correctly. */ DUK_LOCAL duk_int_t duk__div_floor(duk_int_t a, duk_int_t b) { DUK_ASSERT(b > 0); if (a >= 0) { return a / b; } else { /* e.g. a = -4, b = 5 --> -4 - 5 + 1 / 5 --> -8 / 5 --> -1 * a = -5, b = 5 --> -5 - 5 + 1 / 5 --> -9 / 5 --> -1 * a = -6, b = 5 --> -6 - 5 + 1 / 5 --> -10 / 5 --> -2 */ return (a - b + 1) / b; } } /* Compute day number of the first day of a given year. */ DUK_LOCAL duk_int_t duk__day_from_year(duk_int_t year) { /* Note: in integer arithmetic, (x / 4) is same as floor(x / 4) for non-negative * values, but is incorrect for negative ones. */ return 365 * (year - 1970) + duk__div_floor(year - 1969, 4) - duk__div_floor(year - 1901, 100) + duk__div_floor(year - 1601, 400); } /* Given a day number, determine year and day-within-year. */ DUK_LOCAL duk_int_t duk__year_from_day(duk_int_t day, duk_small_int_t *out_day_within_year) { duk_int_t year; duk_int_t diff_days; /* estimate year upwards (towards positive infinity), then back down; * two iterations should be enough */ if (day >= 0) { year = 1970 + day / 365; } else { year = 1970 + day / 366; } for (;;) { diff_days = duk__day_from_year(year) - day; DUK_DDD(DUK_DDDPRINT("year=%ld day=%ld, diff_days=%ld", (long) year, (long) day, (long) diff_days)); if (diff_days <= 0) { DUK_ASSERT(-diff_days < 366); /* fits into duk_small_int_t */ *out_day_within_year = -diff_days; DUK_DDD(DUK_DDDPRINT("--> year=%ld, day-within-year=%ld", (long) year, (long) *out_day_within_year)); DUK_ASSERT(*out_day_within_year >= 0); DUK_ASSERT(*out_day_within_year < (duk_bi_date_is_leap_year(year) ? 366 : 365)); return year; } /* Note: this is very tricky; we must never 'overshoot' the * correction downwards. */ year -= 1 + (diff_days - 1) / 366; /* conservative */ } } /* Given a (year, month, day-within-month) triple, compute day number. * The input triple is un-normalized and may contain non-finite values. */ DUK_LOCAL duk_double_t duk__make_day(duk_double_t year, duk_double_t month, duk_double_t day) { duk_int_t day_num; duk_bool_t is_leap; duk_small_int_t i, n; /* Assume that year, month, day are all coerced to whole numbers. * They may also be NaN or infinity, in which case this function * must return NaN or infinity to ensure time value becomes NaN. * If 'day' is NaN, the final return will end up returning a NaN, * so it doesn't need to be checked here. */ if (!DUK_ISFINITE(year) || !DUK_ISFINITE(month)) { return DUK_DOUBLE_NAN; } year += DUK_FLOOR(month / 12.0); month = DUK_FMOD(month, 12.0); if (month < 0.0) { /* handle negative values */ month += 12.0; } /* The algorithm in E5.1 Section 15.9.1.12 normalizes month, but * does not normalize the day-of-month (nor check whether or not * it is finite) because it's not necessary for finding the day * number which matches the (year,month) pair. * * We assume that duk__day_from_year() is exact here. * * Without an explicit infinity / NaN check in the beginning, * day_num would be a bogus integer here. * * It's possible for 'year' to be out of integer range here. * If so, we need to return NaN without integer overflow. * This fixes test-bug-setyear-overflow.js. */ if (!duk_bi_date_year_in_valid_range(year)) { DUK_DD(DUK_DDPRINT("year not in ecmascript valid range, avoid integer overflow: %lf", (double) year)); return DUK_DOUBLE_NAN; } day_num = duk__day_from_year((duk_int_t) year); is_leap = duk_bi_date_is_leap_year((duk_int_t) year); n = (duk_small_int_t) month; for (i = 0; i < n; i++) { day_num += duk__days_in_month[i]; if (i == 1 && is_leap) { day_num++; } } /* If 'day' is NaN, returns NaN. */ return (duk_double_t) day_num + day; } /* Split time value into parts. The time value may contain fractions (it may * come from duk_time_to_components() API call) which are truncated. Possible * local time adjustment has already been applied when reading the time value. */ DUK_INTERNAL void duk_bi_date_timeval_to_parts(duk_double_t d, duk_int_t *parts, duk_double_t *dparts, duk_small_uint_t flags) { duk_double_t d1, d2; duk_int_t t1, t2; duk_int_t day_since_epoch; duk_int_t year; /* does not fit into 16 bits */ duk_small_int_t day_in_year; duk_small_int_t month; duk_small_int_t day; duk_small_int_t dim; duk_int_t jan1_since_epoch; duk_small_int_t jan1_weekday; duk_int_t equiv_year; duk_small_uint_t i; duk_bool_t is_leap; duk_small_int_t arridx; DUK_ASSERT(DUK_ISFINITE(d)); /* caller checks */ d = DUK_FLOOR(d); /* remove fractions if present */ DUK_ASSERT(DUK_FLOOR(d) == d); /* The timevalue must be in valid Ecmascript range, but since a local * time offset can be applied, we need to allow a +/- 24h leeway to * the value. In other words, although the UTC time is within the * Ecmascript range, the local part values can be just outside of it. */ DUK_UNREF(duk_bi_date_timeval_in_leeway_range); DUK_ASSERT(duk_bi_date_timeval_in_leeway_range(d)); /* These computations are guaranteed to be exact for the valid * E5 time value range, assuming milliseconds without fractions. */ d1 = (duk_double_t) DUK_FMOD(d, (double) DUK_DATE_MSEC_DAY); if (d1 < 0.0) { /* deal with negative values */ d1 += (duk_double_t) DUK_DATE_MSEC_DAY; } d2 = DUK_FLOOR((double) (d / (duk_double_t) DUK_DATE_MSEC_DAY)); DUK_ASSERT(d2 * ((duk_double_t) DUK_DATE_MSEC_DAY) + d1 == d); /* now expected to fit into a 32-bit integer */ t1 = (duk_int_t) d1; t2 = (duk_int_t) d2; day_since_epoch = t2; DUK_ASSERT((duk_double_t) t1 == d1); DUK_ASSERT((duk_double_t) t2 == d2); /* t1 = milliseconds within day (fits 32 bit) * t2 = day number from epoch (fits 32 bit, may be negative) */ parts[DUK_DATE_IDX_MILLISECOND] = t1 % 1000; t1 /= 1000; parts[DUK_DATE_IDX_SECOND] = t1 % 60; t1 /= 60; parts[DUK_DATE_IDX_MINUTE] = t1 % 60; t1 /= 60; parts[DUK_DATE_IDX_HOUR] = t1; DUK_ASSERT(parts[DUK_DATE_IDX_MILLISECOND] >= 0 && parts[DUK_DATE_IDX_MILLISECOND] <= 999); DUK_ASSERT(parts[DUK_DATE_IDX_SECOND] >= 0 && parts[DUK_DATE_IDX_SECOND] <= 59); DUK_ASSERT(parts[DUK_DATE_IDX_MINUTE] >= 0 && parts[DUK_DATE_IDX_MINUTE] <= 59); DUK_ASSERT(parts[DUK_DATE_IDX_HOUR] >= 0 && parts[DUK_DATE_IDX_HOUR] <= 23); DUK_DDD(DUK_DDDPRINT("d=%lf, d1=%lf, d2=%lf, t1=%ld, t2=%ld, parts: hour=%ld min=%ld sec=%ld msec=%ld", (double) d, (double) d1, (double) d2, (long) t1, (long) t2, (long) parts[DUK_DATE_IDX_HOUR], (long) parts[DUK_DATE_IDX_MINUTE], (long) parts[DUK_DATE_IDX_SECOND], (long) parts[DUK_DATE_IDX_MILLISECOND])); /* This assert depends on the input parts representing time inside * the Ecmascript range. */ DUK_ASSERT(t2 + DUK__WEEKDAY_MOD_ADDER >= 0); parts[DUK_DATE_IDX_WEEKDAY] = (t2 + 4 + DUK__WEEKDAY_MOD_ADDER) % 7; /* E5.1 Section 15.9.1.6 */ DUK_ASSERT(parts[DUK_DATE_IDX_WEEKDAY] >= 0 && parts[DUK_DATE_IDX_WEEKDAY] <= 6); year = duk__year_from_day(t2, &day_in_year); day = day_in_year; is_leap = duk_bi_date_is_leap_year(year); for (month = 0; month < 12; month++) { dim = duk__days_in_month[month]; if (month == 1 && is_leap) { dim++; } DUK_DDD(DUK_DDDPRINT("month=%ld, dim=%ld, day=%ld", (long) month, (long) dim, (long) day)); if (day < dim) { break; } day -= dim; } DUK_DDD(DUK_DDDPRINT("final month=%ld", (long) month)); DUK_ASSERT(month >= 0 && month <= 11); DUK_ASSERT(day >= 0 && day <= 31); /* Equivalent year mapping, used to avoid DST trouble when platform * may fail to provide reasonable DST answers for dates outside the * ordinary range (e.g. 1970-2038). An equivalent year has the same * leap-year-ness as the original year and begins on the same weekday * (Jan 1). * * The year 2038 is avoided because there seem to be problems with it * on some platforms. The year 1970 is also avoided as there were * practical problems with it; an equivalent year is used for it too, * which breaks some DST computations for 1970 right now, see e.g. * test-bi-date-tzoffset-brute-fi.js. */ if ((flags & DUK_DATE_FLAG_EQUIVYEAR) && (year < 1971 || year > 2037)) { DUK_ASSERT(is_leap == 0 || is_leap == 1); jan1_since_epoch = day_since_epoch - day_in_year; /* day number for Jan 1 since epoch */ DUK_ASSERT(jan1_since_epoch + DUK__WEEKDAY_MOD_ADDER >= 0); jan1_weekday = (jan1_since_epoch + 4 + DUK__WEEKDAY_MOD_ADDER) % 7; /* E5.1 Section 15.9.1.6 */ DUK_ASSERT(jan1_weekday >= 0 && jan1_weekday <= 6); arridx = jan1_weekday; if (is_leap) { arridx += 7; } DUK_ASSERT(arridx >= 0 && arridx < (duk_small_int_t) (sizeof(duk__date_equivyear) / sizeof(duk_uint8_t))); equiv_year = (duk_int_t) duk__date_equivyear[arridx] + 1970; year = equiv_year; DUK_DDD(DUK_DDDPRINT("equiv year mapping, year=%ld, day_in_year=%ld, day_since_epoch=%ld, " "jan1_since_epoch=%ld, jan1_weekday=%ld -> equiv year %ld", (long) year, (long) day_in_year, (long) day_since_epoch, (long) jan1_since_epoch, (long) jan1_weekday, (long) equiv_year)); } parts[DUK_DATE_IDX_YEAR] = year; parts[DUK_DATE_IDX_MONTH] = month; parts[DUK_DATE_IDX_DAY] = day; if (flags & DUK_DATE_FLAG_ONEBASED) { parts[DUK_DATE_IDX_MONTH]++; /* zero-based -> one-based */ parts[DUK_DATE_IDX_DAY]++; /* -""- */ } if (dparts != NULL) { for (i = 0; i < DUK_DATE_IDX_NUM_PARTS; i++) { dparts[i] = (duk_double_t) parts[i]; } } } /* Compute time value from (double) parts. The parts can be either UTC * or local time; if local, they need to be (conceptually) converted into * UTC time. The parts may represent valid or invalid time, and may be * wildly out of range (but may cancel each other and still come out in * the valid Date range). */ DUK_INTERNAL duk_double_t duk_bi_date_get_timeval_from_dparts(duk_double_t *dparts, duk_small_uint_t flags) { #if defined(DUK_USE_PARANOID_DATE_COMPUTATION) /* See comments below on MakeTime why these are volatile. */ volatile duk_double_t tmp_time; volatile duk_double_t tmp_day; volatile duk_double_t d; #else duk_double_t tmp_time; duk_double_t tmp_day; duk_double_t d; #endif duk_small_uint_t i; duk_int_t tzoff, tzoffprev1, tzoffprev2; /* Expects 'this' at top of stack on entry. */ /* Coerce all finite parts with ToInteger(). ToInteger() must not * be called for NaN/Infinity because it will convert e.g. NaN to * zero. If ToInteger() has already been called, this has no side * effects and is idempotent. * * Don't read dparts[DUK_DATE_IDX_WEEKDAY]; it will cause Valgrind * issues if the value is uninitialized. */ for (i = 0; i <= DUK_DATE_IDX_MILLISECOND; i++) { /* SCANBUILD: scan-build complains here about assigned value * being garbage or undefined. This is correct but operating * on undefined values has no ill effect and is ignored by the * caller in the case where this happens. */ d = dparts[i]; if (DUK_ISFINITE(d)) { dparts[i] = duk_js_tointeger_number(d); } } /* Use explicit steps in computation to try to ensure that * computation happens with intermediate results coerced to * double values (instead of using something more accurate). * E.g. E5.1 Section 15.9.1.11 requires use of IEEE 754 * rules (= Ecmascript '+' and '*' operators). * * Without 'volatile' even this approach fails on some platform * and compiler combinations. For instance, gcc 4.8.1 on Ubuntu * 64-bit, with -m32 and without -std=c99, test-bi-date-canceling.js * would fail because of some optimizations when computing tmp_time * (MakeTime below). Adding 'volatile' to tmp_time solved this * particular problem (annoyingly, also adding debug prints or * running the executable under valgrind hides it). */ /* MakeTime */ tmp_time = 0.0; tmp_time += dparts[DUK_DATE_IDX_HOUR] * ((duk_double_t) DUK_DATE_MSEC_HOUR); tmp_time += dparts[DUK_DATE_IDX_MINUTE] * ((duk_double_t) DUK_DATE_MSEC_MINUTE); tmp_time += dparts[DUK_DATE_IDX_SECOND] * ((duk_double_t) DUK_DATE_MSEC_SECOND); tmp_time += dparts[DUK_DATE_IDX_MILLISECOND]; /* MakeDay */ tmp_day = duk__make_day(dparts[DUK_DATE_IDX_YEAR], dparts[DUK_DATE_IDX_MONTH], dparts[DUK_DATE_IDX_DAY]); /* MakeDate */ d = tmp_day * ((duk_double_t) DUK_DATE_MSEC_DAY) + tmp_time; DUK_DDD(DUK_DDDPRINT("time=%lf day=%lf --> timeval=%lf", (double) tmp_time, (double) tmp_day, (double) d)); /* Optional UTC conversion. */ if (flags & DUK_DATE_FLAG_LOCALTIME) { /* DUK_USE_DATE_GET_LOCAL_TZOFFSET() needs to be called with a * time value computed from UTC parts. At this point we only * have 'd' which is a time value computed from local parts, so * it is off by the UTC-to-local time offset which we don't know * yet. The current solution for computing the UTC-to-local * time offset is to iterate a few times and detect a fixed * point or a two-cycle loop (or a sanity iteration limit), * see test-bi-date-local-parts.js and test-bi-date-tzoffset-basic-fi.js. * * E5.1 Section 15.9.1.9: * UTC(t) = t - LocalTZA - DaylightSavingTA(t - LocalTZA) * * For NaN/inf, DUK_USE_DATE_GET_LOCAL_TZOFFSET() returns 0. */ #if 0 /* Old solution: don't iterate, incorrect */ tzoff = DUK_USE_DATE_GET_LOCAL_TZOFFSET(d); DUK_DDD(DUK_DDDPRINT("tzoffset w/o iteration, tzoff=%ld", (long) tzoff)); d -= tzoff * 1000L; DUK_UNREF(tzoffprev1); DUK_UNREF(tzoffprev2); #endif /* Iteration solution */ tzoff = 0; tzoffprev1 = 999999999L; /* invalid value which never matches */ for (i = 0; i < DUK__LOCAL_TZOFFSET_MAXITER; i++) { tzoffprev2 = tzoffprev1; tzoffprev1 = tzoff; tzoff = DUK_USE_DATE_GET_LOCAL_TZOFFSET(d - tzoff * 1000L); DUK_DDD(DUK_DDDPRINT("tzoffset iteration, i=%d, tzoff=%ld, tzoffprev1=%ld tzoffprev2=%ld", (int) i, (long) tzoff, (long) tzoffprev1, (long) tzoffprev2)); if (tzoff == tzoffprev1) { DUK_DDD(DUK_DDDPRINT("tzoffset iteration finished, i=%d, tzoff=%ld, tzoffprev1=%ld, tzoffprev2=%ld", (int) i, (long) tzoff, (long) tzoffprev1, (long) tzoffprev2)); break; } else if (tzoff == tzoffprev2) { /* Two value cycle, see e.g. test-bi-date-tzoffset-basic-fi.js. * In these cases, favor a higher tzoffset to get a consistent * result which is independent of iteration count. Not sure if * this is a generically correct solution. */ DUK_DDD(DUK_DDDPRINT("tzoffset iteration two-value cycle, i=%d, tzoff=%ld, tzoffprev1=%ld, tzoffprev2=%ld", (int) i, (long) tzoff, (long) tzoffprev1, (long) tzoffprev2)); if (tzoffprev1 > tzoff) { tzoff = tzoffprev1; } break; } } DUK_DDD(DUK_DDDPRINT("tzoffset iteration, tzoff=%ld", (long) tzoff)); d -= tzoff * 1000L; } /* TimeClip(), which also handles Infinity -> NaN conversion */ d = duk__timeclip(d); return d; } /* * API oriented helpers */ /* Push 'this' binding, check that it is a Date object; then push the * internal time value. At the end, stack is: [ ... this timeval ]. * Returns the time value. Local time adjustment is done if requested. */ DUK_LOCAL duk_double_t duk__push_this_get_timeval_tzoffset(duk_hthread *thr, duk_small_uint_t flags, duk_int_t *out_tzoffset) { duk_hobject *h; duk_double_t d; duk_int_t tzoffset = 0; duk_push_this(thr); h = duk_get_hobject(thr, -1); /* XXX: getter with class check, useful in built-ins */ if (h == NULL || DUK_HOBJECT_GET_CLASS_NUMBER(h) != DUK_HOBJECT_CLASS_DATE) { DUK_ERROR_TYPE(thr, "expected Date"); } duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VALUE); d = duk_to_number_m1(thr); duk_pop(thr); if (DUK_ISNAN(d)) { if (flags & DUK_DATE_FLAG_NAN_TO_ZERO) { d = 0.0; } if (flags & DUK_DATE_FLAG_NAN_TO_RANGE_ERROR) { DUK_ERROR_RANGE(thr, "Invalid Date"); } } /* if no NaN handling flag, may still be NaN here, but not Inf */ DUK_ASSERT(!DUK_ISINF(d)); if (flags & DUK_DATE_FLAG_LOCALTIME) { /* Note: DST adjustment is determined using UTC time. * If 'd' is NaN, tzoffset will be 0. */ tzoffset = DUK_USE_DATE_GET_LOCAL_TZOFFSET(d); /* seconds */ d += tzoffset * 1000L; } if (out_tzoffset) { *out_tzoffset = tzoffset; } /* [ ... this ] */ return d; } DUK_LOCAL duk_double_t duk__push_this_get_timeval(duk_hthread *thr, duk_small_uint_t flags) { return duk__push_this_get_timeval_tzoffset(thr, flags, NULL); } /* Set timeval to 'this' from dparts, push the new time value onto the * value stack and return 1 (caller can then tail call us). Expects * the value stack to contain 'this' on the stack top. */ DUK_LOCAL duk_ret_t duk__set_this_timeval_from_dparts(duk_hthread *thr, duk_double_t *dparts, duk_small_uint_t flags) { duk_double_t d; /* [ ... this ] */ d = duk_bi_date_get_timeval_from_dparts(dparts, flags); duk_push_number(thr, d); /* -> [ ... this timeval_new ] */ duk_dup_top(thr); /* -> [ ... this timeval_new timeval_new ] */ duk_put_prop_stridx_short(thr, -3, DUK_STRIDX_INT_VALUE); /* stack top: new time value, return 1 to allow tail calls */ return 1; } /* 'out_buf' must be at least DUK_BI_DATE_ISO8601_BUFSIZE long. */ DUK_LOCAL void duk__format_parts_iso8601(duk_int_t *parts, duk_int_t tzoffset, duk_small_uint_t flags, duk_uint8_t *out_buf) { char yearstr[8]; /* "-123456\0" */ char tzstr[8]; /* "+11:22\0" */ char sep = (flags & DUK_DATE_FLAG_SEP_T) ? DUK_ASC_UC_T : DUK_ASC_SPACE; DUK_ASSERT(parts[DUK_DATE_IDX_MONTH] >= 1 && parts[DUK_DATE_IDX_MONTH] <= 12); DUK_ASSERT(parts[DUK_DATE_IDX_DAY] >= 1 && parts[DUK_DATE_IDX_DAY] <= 31); DUK_ASSERT(parts[DUK_DATE_IDX_YEAR] >= -999999 && parts[DUK_DATE_IDX_YEAR] <= 999999); /* Note: %06d for positive value, %07d for negative value to include * sign and 6 digits. */ DUK_SNPRINTF(yearstr, sizeof(yearstr), (parts[DUK_DATE_IDX_YEAR] >= 0 && parts[DUK_DATE_IDX_YEAR] <= 9999) ? "%04ld" : ((parts[DUK_DATE_IDX_YEAR] >= 0) ? "+%06ld" : "%07ld"), (long) parts[DUK_DATE_IDX_YEAR]); yearstr[sizeof(yearstr) - 1] = (char) 0; if (flags & DUK_DATE_FLAG_LOCALTIME) { /* tzoffset seconds are dropped; 16 bits suffice for * time offset in minutes */ const char *fmt; duk_small_int_t tmp, arg_hours, arg_minutes; if (tzoffset >= 0) { tmp = tzoffset; fmt = "+%02d:%02d"; } else { tmp = -tzoffset; fmt = "-%02d:%02d"; } tmp = tmp / 60; arg_hours = tmp / 60; arg_minutes = tmp % 60; DUK_ASSERT(arg_hours <= 24); /* Even less is actually guaranteed for a valid tzoffset. */ arg_hours = arg_hours & 0x3f; /* For [0,24] this is a no-op, but fixes GCC 7 warning, see https://github.com/svaarala/duktape/issues/1602. */ DUK_SNPRINTF(tzstr, sizeof(tzstr), fmt, (int) arg_hours, (int) arg_minutes); tzstr[sizeof(tzstr) - 1] = (char) 0; } else { tzstr[0] = DUK_ASC_UC_Z; tzstr[1] = (char) 0; } /* Unlike year, the other parts fit into 16 bits so %d format * is portable. */ if ((flags & DUK_DATE_FLAG_TOSTRING_DATE) && (flags & DUK_DATE_FLAG_TOSTRING_TIME)) { DUK_SPRINTF((char *) out_buf, "%s-%02d-%02d%c%02d:%02d:%02d.%03d%s", (const char *) yearstr, (int) parts[DUK_DATE_IDX_MONTH], (int) parts[DUK_DATE_IDX_DAY], (int) sep, (int) parts[DUK_DATE_IDX_HOUR], (int) parts[DUK_DATE_IDX_MINUTE], (int) parts[DUK_DATE_IDX_SECOND], (int) parts[DUK_DATE_IDX_MILLISECOND], (const char *) tzstr); } else if (flags & DUK_DATE_FLAG_TOSTRING_DATE) { DUK_SPRINTF((char *) out_buf, "%s-%02d-%02d", (const char *) yearstr, (int) parts[DUK_DATE_IDX_MONTH], (int) parts[DUK_DATE_IDX_DAY]); } else { DUK_ASSERT(flags & DUK_DATE_FLAG_TOSTRING_TIME); DUK_SPRINTF((char *) out_buf, "%02d:%02d:%02d.%03d%s", (int) parts[DUK_DATE_IDX_HOUR], (int) parts[DUK_DATE_IDX_MINUTE], (int) parts[DUK_DATE_IDX_SECOND], (int) parts[DUK_DATE_IDX_MILLISECOND], (const char *) tzstr); } } /* Helper for string conversion calls: check 'this' binding, get the * internal time value, and format date and/or time in a few formats. * Return value allows tail calls. */ DUK_LOCAL duk_ret_t duk__to_string_helper(duk_hthread *thr, duk_small_uint_t flags) { duk_double_t d; duk_int_t parts[DUK_DATE_IDX_NUM_PARTS]; duk_int_t tzoffset; /* seconds, doesn't fit into 16 bits */ duk_bool_t rc; duk_uint8_t buf[DUK_BI_DATE_ISO8601_BUFSIZE]; DUK_UNREF(rc); /* unreferenced with some options */ d = duk__push_this_get_timeval_tzoffset(thr, flags, &tzoffset); if (DUK_ISNAN(d)) { duk_push_hstring_stridx(thr, DUK_STRIDX_INVALID_DATE); return 1; } DUK_ASSERT(DUK_ISFINITE(d)); /* formatters always get one-based month/day-of-month */ duk_bi_date_timeval_to_parts(d, parts, NULL, DUK_DATE_FLAG_ONEBASED); DUK_ASSERT(parts[DUK_DATE_IDX_MONTH] >= 1 && parts[DUK_DATE_IDX_MONTH] <= 12); DUK_ASSERT(parts[DUK_DATE_IDX_DAY] >= 1 && parts[DUK_DATE_IDX_DAY] <= 31); if (flags & DUK_DATE_FLAG_TOSTRING_LOCALE) { /* try locale specific formatter; if it refuses to format the * string, fall back to an ISO 8601 formatted value in local * time. */ #if defined(DUK_USE_DATE_FORMAT_STRING) /* Contract, either: * - Push string to value stack and return 1 * - Don't push anything and return 0 */ rc = DUK_USE_DATE_FORMAT_STRING(thr, parts, tzoffset, flags); if (rc != 0) { return 1; } #else /* No locale specific formatter; this is OK, we fall back * to ISO 8601. */ #endif } /* Different calling convention than above used because the helper * is shared. */ duk__format_parts_iso8601(parts, tzoffset, flags, buf); duk_push_string(thr, (const char *) buf); return 1; } /* Helper for component getter calls: check 'this' binding, get the * internal time value, split it into parts (either as UTC time or * local time), push a specified component as a return value to the * value stack and return 1 (caller can then tail call us). */ DUK_LOCAL duk_ret_t duk__get_part_helper(duk_hthread *thr, duk_small_uint_t flags_and_idx) { duk_double_t d; duk_int_t parts[DUK_DATE_IDX_NUM_PARTS]; duk_small_uint_t idx_part = (duk_small_uint_t) (flags_and_idx >> DUK_DATE_FLAG_VALUE_SHIFT); /* unpack args */ DUK_ASSERT_DISABLE(idx_part >= 0); /* unsigned */ DUK_ASSERT(idx_part < DUK_DATE_IDX_NUM_PARTS); d = duk__push_this_get_timeval(thr, flags_and_idx); if (DUK_ISNAN(d)) { duk_push_nan(thr); return 1; } DUK_ASSERT(DUK_ISFINITE(d)); duk_bi_date_timeval_to_parts(d, parts, NULL, flags_and_idx); /* no need to mask idx portion */ /* Setter APIs detect special year numbers (0...99) and apply a +1900 * only in certain cases. The legacy getYear() getter applies -1900 * unconditionally. */ duk_push_int(thr, (flags_and_idx & DUK_DATE_FLAG_SUB1900) ? parts[idx_part] - 1900 : parts[idx_part]); return 1; } /* Helper for component setter calls: check 'this' binding, get the * internal time value, split it into parts (either as UTC time or * local time), modify one or more components as specified, recompute * the time value, set it as the internal value. Finally, push the * new time value as a return value to the value stack and return 1 * (caller can then tail call us). */ DUK_LOCAL duk_ret_t duk__set_part_helper(duk_hthread *thr, duk_small_uint_t flags_and_maxnargs) { duk_double_t d; duk_int_t parts[DUK_DATE_IDX_NUM_PARTS]; duk_double_t dparts[DUK_DATE_IDX_NUM_PARTS]; duk_idx_t nargs; duk_small_uint_t maxnargs = (duk_small_uint_t) (flags_and_maxnargs >> DUK_DATE_FLAG_VALUE_SHIFT); /* unpack args */ duk_small_uint_t idx_first, idx; duk_small_uint_t i; nargs = duk_get_top(thr); d = duk__push_this_get_timeval(thr, flags_and_maxnargs); DUK_ASSERT(DUK_ISFINITE(d) || DUK_ISNAN(d)); if (DUK_ISFINITE(d)) { duk_bi_date_timeval_to_parts(d, parts, dparts, flags_and_maxnargs); } else { /* NaN timevalue: we need to coerce the arguments, but * the resulting internal timestamp needs to remain NaN. * This works but is not pretty: parts and dparts will * be partially uninitialized, but we only write to them. */ } /* * Determining which datetime components to overwrite based on * stack arguments is a bit complicated, but important to factor * out from setters themselves for compactness. * * If DUK_DATE_FLAG_TIMESETTER, maxnargs indicates setter type: * * 1 -> millisecond * 2 -> second, [millisecond] * 3 -> minute, [second], [millisecond] * 4 -> hour, [minute], [second], [millisecond] * * Else: * * 1 -> date * 2 -> month, [date] * 3 -> year, [month], [date] * * By comparing nargs and maxnargs (and flags) we know which * components to override. We rely on part index ordering. */ if (flags_and_maxnargs & DUK_DATE_FLAG_TIMESETTER) { DUK_ASSERT(maxnargs >= 1 && maxnargs <= 4); idx_first = DUK_DATE_IDX_MILLISECOND - (maxnargs - 1); } else { DUK_ASSERT(maxnargs >= 1 && maxnargs <= 3); idx_first = DUK_DATE_IDX_DAY - (maxnargs - 1); } DUK_ASSERT_DISABLE(idx_first >= 0); /* unsigned */ DUK_ASSERT(idx_first < DUK_DATE_IDX_NUM_PARTS); for (i = 0; i < maxnargs; i++) { if ((duk_idx_t) i >= nargs) { /* no argument given -> leave components untouched */ break; } idx = idx_first + i; DUK_ASSERT_DISABLE(idx >= 0); /* unsigned */ DUK_ASSERT(idx < DUK_DATE_IDX_NUM_PARTS); if (idx == DUK_DATE_IDX_YEAR && (flags_and_maxnargs & DUK_DATE_FLAG_YEAR_FIXUP)) { duk__twodigit_year_fixup(thr, (duk_idx_t) i); } dparts[idx] = duk_to_number(thr, (duk_idx_t) i); if (idx == DUK_DATE_IDX_DAY) { /* Day-of-month is one-based in the API, but zero-based * internally, so fix here. Note that month is zero-based * both in the API and internally. */ /* SCANBUILD: complains about use of uninitialized values. * The complaint is correct, but operating in undefined * values here is intentional in some cases and the caller * ignores the results. */ dparts[idx] -= 1.0; } } /* Leaves new timevalue on stack top and returns 1, which is correct * for part setters. */ if (DUK_ISFINITE(d)) { return duk__set_this_timeval_from_dparts(thr, dparts, flags_and_maxnargs); } else { /* Internal timevalue is already NaN, so don't touch it. */ duk_push_nan(thr); return 1; } } /* Apply ToNumber() to specified index; if ToInteger(val) in [0,99], add * 1900 and replace value at idx_val. */ DUK_LOCAL void duk__twodigit_year_fixup(duk_hthread *thr, duk_idx_t idx_val) { duk_double_t d; /* XXX: idx_val would fit into 16 bits, but using duk_small_uint_t * might not generate better code due to casting. */ /* E5 Sections 15.9.3.1, B.2.4, B.2.5 */ duk_to_number(thr, idx_val); if (duk_is_nan(thr, idx_val)) { return; } duk_dup(thr, idx_val); duk_to_int(thr, -1); d = duk_get_number(thr, -1); /* get as double to handle huge numbers correctly */ if (d >= 0.0 && d <= 99.0) { d += 1900.0; duk_push_number(thr, d); duk_replace(thr, idx_val); } duk_pop(thr); } /* Set datetime parts from stack arguments, defaulting any missing values. * Day-of-week is not set; it is not required when setting the time value. */ DUK_LOCAL void duk__set_parts_from_args(duk_hthread *thr, duk_double_t *dparts, duk_idx_t nargs) { duk_double_t d; duk_small_uint_t i; duk_small_uint_t idx; /* Causes a ToNumber() coercion, but doesn't break coercion order since * year is coerced first anyway. */ duk__twodigit_year_fixup(thr, 0); /* There are at most 7 args, but we use 8 here so that also * DUK_DATE_IDX_WEEKDAY gets initialized (to zero) to avoid the potential * for any Valgrind gripes later. */ for (i = 0; i < 8; i++) { /* Note: rely on index ordering */ idx = DUK_DATE_IDX_YEAR + i; if ((duk_idx_t) i < nargs) { d = duk_to_number(thr, (duk_idx_t) i); if (idx == DUK_DATE_IDX_DAY) { /* Convert day from one-based to zero-based (internal). This may * cause the day part to be negative, which is OK. */ d -= 1.0; } } else { /* All components default to 0 except day-of-month which defaults * to 1. However, because our internal day-of-month is zero-based, * it also defaults to zero here. */ d = 0.0; } dparts[idx] = d; } DUK_DDD(DUK_DDDPRINT("parts from args -> %lf %lf %lf %lf %lf %lf %lf %lf", (double) dparts[0], (double) dparts[1], (double) dparts[2], (double) dparts[3], (double) dparts[4], (double) dparts[5], (double) dparts[6], (double) dparts[7])); } /* * Indirect magic value lookup for Date methods. * * Date methods don't put their control flags into the function magic value * because they wouldn't fit into a LIGHTFUNC's magic field. Instead, the * magic value is set to an index pointing to the array of control flags * below. * * This must be kept in strict sync with genbuiltins.py! */ static duk_uint16_t duk__date_magics[] = { /* 0: toString */ DUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_TOSTRING_TIME + DUK_DATE_FLAG_LOCALTIME, /* 1: toDateString */ DUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_LOCALTIME, /* 2: toTimeString */ DUK_DATE_FLAG_TOSTRING_TIME + DUK_DATE_FLAG_LOCALTIME, /* 3: toLocaleString */ DUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_TOSTRING_TIME + DUK_DATE_FLAG_TOSTRING_LOCALE + DUK_DATE_FLAG_LOCALTIME, /* 4: toLocaleDateString */ DUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_TOSTRING_LOCALE + DUK_DATE_FLAG_LOCALTIME, /* 5: toLocaleTimeString */ DUK_DATE_FLAG_TOSTRING_TIME + DUK_DATE_FLAG_TOSTRING_LOCALE + DUK_DATE_FLAG_LOCALTIME, /* 6: toUTCString */ DUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_TOSTRING_TIME, /* 7: toISOString */ DUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_TOSTRING_TIME + DUK_DATE_FLAG_NAN_TO_RANGE_ERROR + DUK_DATE_FLAG_SEP_T, /* 8: getFullYear */ DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_YEAR << DUK_DATE_FLAG_VALUE_SHIFT), /* 9: getUTCFullYear */ 0 + (DUK_DATE_IDX_YEAR << DUK_DATE_FLAG_VALUE_SHIFT), /* 10: getMonth */ DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_MONTH << DUK_DATE_FLAG_VALUE_SHIFT), /* 11: getUTCMonth */ 0 + (DUK_DATE_IDX_MONTH << DUK_DATE_FLAG_VALUE_SHIFT), /* 12: getDate */ DUK_DATE_FLAG_ONEBASED + DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_DAY << DUK_DATE_FLAG_VALUE_SHIFT), /* 13: getUTCDate */ DUK_DATE_FLAG_ONEBASED + (DUK_DATE_IDX_DAY << DUK_DATE_FLAG_VALUE_SHIFT), /* 14: getDay */ DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_WEEKDAY << DUK_DATE_FLAG_VALUE_SHIFT), /* 15: getUTCDay */ 0 + (DUK_DATE_IDX_WEEKDAY << DUK_DATE_FLAG_VALUE_SHIFT), /* 16: getHours */ DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_HOUR << DUK_DATE_FLAG_VALUE_SHIFT), /* 17: getUTCHours */ 0 + (DUK_DATE_IDX_HOUR << DUK_DATE_FLAG_VALUE_SHIFT), /* 18: getMinutes */ DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_MINUTE << DUK_DATE_FLAG_VALUE_SHIFT), /* 19: getUTCMinutes */ 0 + (DUK_DATE_IDX_MINUTE << DUK_DATE_FLAG_VALUE_SHIFT), /* 20: getSeconds */ DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_SECOND << DUK_DATE_FLAG_VALUE_SHIFT), /* 21: getUTCSeconds */ 0 + (DUK_DATE_IDX_SECOND << DUK_DATE_FLAG_VALUE_SHIFT), /* 22: getMilliseconds */ DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_MILLISECOND << DUK_DATE_FLAG_VALUE_SHIFT), /* 23: getUTCMilliseconds */ 0 + (DUK_DATE_IDX_MILLISECOND << DUK_DATE_FLAG_VALUE_SHIFT), /* 24: setMilliseconds */ DUK_DATE_FLAG_TIMESETTER + DUK_DATE_FLAG_LOCALTIME + (1 << DUK_DATE_FLAG_VALUE_SHIFT), /* 25: setUTCMilliseconds */ DUK_DATE_FLAG_TIMESETTER + (1 << DUK_DATE_FLAG_VALUE_SHIFT), /* 26: setSeconds */ DUK_DATE_FLAG_TIMESETTER + DUK_DATE_FLAG_LOCALTIME + (2 << DUK_DATE_FLAG_VALUE_SHIFT), /* 27: setUTCSeconds */ DUK_DATE_FLAG_TIMESETTER + (2 << DUK_DATE_FLAG_VALUE_SHIFT), /* 28: setMinutes */ DUK_DATE_FLAG_TIMESETTER + DUK_DATE_FLAG_LOCALTIME + (3 << DUK_DATE_FLAG_VALUE_SHIFT), /* 29: setUTCMinutes */ DUK_DATE_FLAG_TIMESETTER + (3 << DUK_DATE_FLAG_VALUE_SHIFT), /* 30: setHours */ DUK_DATE_FLAG_TIMESETTER + DUK_DATE_FLAG_LOCALTIME + (4 << DUK_DATE_FLAG_VALUE_SHIFT), /* 31: setUTCHours */ DUK_DATE_FLAG_TIMESETTER + (4 << DUK_DATE_FLAG_VALUE_SHIFT), /* 32: setDate */ DUK_DATE_FLAG_LOCALTIME + (1 << DUK_DATE_FLAG_VALUE_SHIFT), /* 33: setUTCDate */ 0 + (1 << DUK_DATE_FLAG_VALUE_SHIFT), /* 34: setMonth */ DUK_DATE_FLAG_LOCALTIME + (2 << DUK_DATE_FLAG_VALUE_SHIFT), /* 35: setUTCMonth */ 0 + (2 << DUK_DATE_FLAG_VALUE_SHIFT), /* 36: setFullYear */ DUK_DATE_FLAG_NAN_TO_ZERO + DUK_DATE_FLAG_LOCALTIME + (3 << DUK_DATE_FLAG_VALUE_SHIFT), /* 37: setUTCFullYear */ DUK_DATE_FLAG_NAN_TO_ZERO + (3 << DUK_DATE_FLAG_VALUE_SHIFT), /* 38: getYear */ DUK_DATE_FLAG_LOCALTIME + DUK_DATE_FLAG_SUB1900 + (DUK_DATE_IDX_YEAR << DUK_DATE_FLAG_VALUE_SHIFT), /* 39: setYear */ DUK_DATE_FLAG_NAN_TO_ZERO + DUK_DATE_FLAG_YEAR_FIXUP + (3 << DUK_DATE_FLAG_VALUE_SHIFT), }; DUK_LOCAL duk_small_uint_t duk__date_get_indirect_magic(duk_hthread *thr) { duk_small_uint_t magicidx = (duk_small_uint_t) duk_get_current_magic(thr); DUK_ASSERT(magicidx < (duk_small_int_t) (sizeof(duk__date_magics) / sizeof(duk_uint16_t))); return (duk_small_uint_t) duk__date_magics[magicidx]; } #if defined(DUK_USE_DATE_BUILTIN) /* * Constructor calls */ DUK_INTERNAL duk_ret_t duk_bi_date_constructor(duk_hthread *thr) { duk_idx_t nargs = duk_get_top(thr); duk_bool_t is_cons = duk_is_constructor_call(thr); duk_double_t dparts[DUK_DATE_IDX_NUM_PARTS]; duk_double_t d; DUK_DDD(DUK_DDDPRINT("Date constructor, nargs=%ld, is_cons=%ld", (long) nargs, (long) is_cons)); (void) duk_push_object_helper(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_FASTREFS | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DATE), DUK_BIDX_DATE_PROTOTYPE); /* Unlike most built-ins, the internal [[PrimitiveValue]] of a Date * is mutable. */ if (nargs == 0 || !is_cons) { d = duk__timeclip(duk_time_get_ecmascript_time_nofrac(thr)); duk_push_number(thr, d); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_W); if (!is_cons) { /* called as a normal function: return new Date().toString() */ duk_to_string(thr, -1); } return 1; } else if (nargs == 1) { const char *str; duk_to_primitive(thr, 0, DUK_HINT_NONE); str = duk_get_string_notsymbol(thr, 0); if (str) { duk__parse_string(thr, str); duk_replace(thr, 0); /* may be NaN */ } d = duk__timeclip(duk_to_number(thr, 0)); /* symbols fail here */ duk_push_number(thr, d); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_W); return 1; } duk__set_parts_from_args(thr, dparts, nargs); /* Parts are in local time, convert when setting. */ (void) duk__set_this_timeval_from_dparts(thr, dparts, DUK_DATE_FLAG_LOCALTIME /*flags*/); /* -> [ ... this timeval ] */ duk_pop(thr); /* -> [ ... this ] */ return 1; } DUK_INTERNAL duk_ret_t duk_bi_date_constructor_parse(duk_hthread *thr) { return duk__parse_string(thr, duk_to_string(thr, 0)); } DUK_INTERNAL duk_ret_t duk_bi_date_constructor_utc(duk_hthread *thr) { duk_idx_t nargs = duk_get_top(thr); duk_double_t dparts[DUK_DATE_IDX_NUM_PARTS]; duk_double_t d; /* Behavior for nargs < 2 is implementation dependent: currently we'll * set a NaN time value (matching V8 behavior) in this case. */ if (nargs < 2) { duk_push_nan(thr); } else { duk__set_parts_from_args(thr, dparts, nargs); d = duk_bi_date_get_timeval_from_dparts(dparts, 0 /*flags*/); duk_push_number(thr, d); } return 1; } DUK_INTERNAL duk_ret_t duk_bi_date_constructor_now(duk_hthread *thr) { duk_double_t d; d = duk_time_get_ecmascript_time_nofrac(thr); DUK_ASSERT(duk__timeclip(d) == d); /* TimeClip() should never be necessary */ duk_push_number(thr, d); return 1; } /* * String/JSON conversions * * Human readable conversions are now basically ISO 8601 with a space * (instead of 'T') as the date/time separator. This is a good baseline * and is platform independent. * * A shared native helper to provide many conversions. Magic value contains * a set of flags. The helper provides: * * toString() * toDateString() * toTimeString() * toLocaleString() * toLocaleDateString() * toLocaleTimeString() * toUTCString() * toISOString() * * Notes: * * - Date.prototype.toGMTString() and Date.prototype.toUTCString() are * required to be the same Ecmascript function object (!), so it is * omitted from here. * * - Date.prototype.toUTCString(): E5.1 specification does not require a * specific format, but result should be human readable. The * specification suggests using ISO 8601 format with a space (instead * of 'T') separator if a more human readable format is not available. * * - Date.prototype.toISOString(): unlike other conversion functions, * toISOString() requires a RangeError for invalid date values. */ DUK_INTERNAL duk_ret_t duk_bi_date_prototype_tostring_shared(duk_hthread *thr) { duk_small_uint_t flags = duk__date_get_indirect_magic(thr); return duk__to_string_helper(thr, flags); } DUK_INTERNAL duk_ret_t duk_bi_date_prototype_value_of(duk_hthread *thr) { /* This native function is also used for Date.prototype.getTime() * as their behavior is identical. */ duk_double_t d = duk__push_this_get_timeval(thr, 0 /*flags*/); /* -> [ this ] */ DUK_ASSERT(DUK_ISFINITE(d) || DUK_ISNAN(d)); duk_push_number(thr, d); return 1; } DUK_INTERNAL duk_ret_t duk_bi_date_prototype_to_json(duk_hthread *thr) { /* Note: toJSON() is a generic function which works even if 'this' * is not a Date. The sole argument is ignored. */ duk_push_this(thr); duk_to_object(thr, -1); duk_dup_top(thr); duk_to_primitive(thr, -1, DUK_HINT_NUMBER); if (duk_is_number(thr, -1)) { duk_double_t d = duk_get_number(thr, -1); if (!DUK_ISFINITE(d)) { duk_push_null(thr); return 1; } } duk_pop(thr); duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_TO_ISO_STRING); duk_dup_m2(thr); /* -> [ O toIsoString O ] */ duk_call_method(thr, 0); return 1; } /* * Getters. * * Implementing getters is quite easy. The internal time value is either * NaN, or represents milliseconds (without fractions) from Jan 1, 1970. * The internal time value can be converted to integer parts, and each * part will be normalized and will fit into a 32-bit signed integer. * * A shared native helper to provide all getters. Magic value contains * a set of flags and also packs the date component index argument. The * helper provides: * * getFullYear() * getUTCFullYear() * getMonth() * getUTCMonth() * getDate() * getUTCDate() * getDay() * getUTCDay() * getHours() * getUTCHours() * getMinutes() * getUTCMinutes() * getSeconds() * getUTCSeconds() * getMilliseconds() * getUTCMilliseconds() * getYear() * * Notes: * * - Date.prototype.getDate(): 'date' means day-of-month, and is * zero-based in internal calculations but public API expects it to * be one-based. * * - Date.prototype.getTime() and Date.prototype.valueOf() have identical * behavior. They have separate function objects, but share the same C * function (duk_bi_date_prototype_value_of). */ DUK_INTERNAL duk_ret_t duk_bi_date_prototype_get_shared(duk_hthread *thr) { duk_small_uint_t flags_and_idx = duk__date_get_indirect_magic(thr); return duk__get_part_helper(thr, flags_and_idx); } DUK_INTERNAL duk_ret_t duk_bi_date_prototype_get_timezone_offset(duk_hthread *thr) { /* * Return (t - LocalTime(t)) in minutes: * * t - LocalTime(t) = t - (t + LocalTZA + DaylightSavingTA(t)) * = -(LocalTZA + DaylightSavingTA(t)) * * where DaylightSavingTA() is checked for time 't'. * * Note that the sign of the result is opposite to common usage, * e.g. for EE(S)T which normally is +2h or +3h from UTC, this * function returns -120 or -180. * */ duk_double_t d; duk_int_t tzoffset; /* Note: DST adjustment is determined using UTC time. */ d = duk__push_this_get_timeval(thr, 0 /*flags*/); DUK_ASSERT(DUK_ISFINITE(d) || DUK_ISNAN(d)); if (DUK_ISNAN(d)) { duk_push_nan(thr); } else { DUK_ASSERT(DUK_ISFINITE(d)); tzoffset = DUK_USE_DATE_GET_LOCAL_TZOFFSET(d); duk_push_int(thr, -tzoffset / 60); } return 1; } /* * Setters. * * Setters are a bit more complicated than getters. Component setters * break down the current time value into its (normalized) component * parts, replace one or more components with -unnormalized- new values, * and the components are then converted back into a time value. As an * example of using unnormalized values: * * var d = new Date(1234567890); * * is equivalent to: * * var d = new Date(0); * d.setUTCMilliseconds(1234567890); * * A shared native helper to provide almost all setters. Magic value * contains a set of flags and also packs the "maxnargs" argument. The * helper provides: * * setMilliseconds() * setUTCMilliseconds() * setSeconds() * setUTCSeconds() * setMinutes() * setUTCMinutes() * setHours() * setUTCHours() * setDate() * setUTCDate() * setMonth() * setUTCMonth() * setFullYear() * setUTCFullYear() * setYear() * * Notes: * * - Date.prototype.setYear() (Section B addition): special year check * is omitted. NaN / Infinity will just flow through and ultimately * result in a NaN internal time value. * * - Date.prototype.setYear() does not have optional arguments for * setting month and day-in-month (like setFullYear()), but we indicate * 'maxnargs' to be 3 to get the year written to the correct component * index in duk__set_part_helper(). The function has nargs == 1, so only * the year will be set regardless of actual argument count. */ DUK_INTERNAL duk_ret_t duk_bi_date_prototype_set_shared(duk_hthread *thr) { duk_small_uint_t flags_and_maxnargs = duk__date_get_indirect_magic(thr); return duk__set_part_helper(thr, flags_and_maxnargs); } DUK_INTERNAL duk_ret_t duk_bi_date_prototype_set_time(duk_hthread *thr) { duk_double_t d; (void) duk__push_this_get_timeval(thr, 0 /*flags*/); /* -> [ timeval this ] */ d = duk__timeclip(duk_to_number(thr, 0)); duk_push_number(thr, d); duk_dup_top(thr); duk_put_prop_stridx_short(thr, -3, DUK_STRIDX_INT_VALUE); /* -> [ timeval this timeval ] */ return 1; } #endif /* DUK_USE_DATE_BUILTIN */ /* automatic undefs */ #undef DUK__CF_ACCEPT #undef DUK__CF_ACCEPT_NUL #undef DUK__CF_NEG #undef DUK__DPRINT_DPARTS #undef DUK__DPRINT_PARTS #undef DUK__DPRINT_PARTS_AND_DPARTS #undef DUK__LOCAL_TZOFFSET_MAXITER #undef DUK__NUM_ISO8601_PARSER_PARTS #undef DUK__PACK_RULE #undef DUK__PI_DAY #undef DUK__PI_HOUR #undef DUK__PI_MILLISECOND #undef DUK__PI_MINUTE #undef DUK__PI_MONTH #undef DUK__PI_SECOND #undef DUK__PI_TZHOUR #undef DUK__PI_TZMINUTE #undef DUK__PI_YEAR #undef DUK__PM_DAY #undef DUK__PM_HOUR #undef DUK__PM_MILLISECOND #undef DUK__PM_MINUTE #undef DUK__PM_MONTH #undef DUK__PM_SECOND #undef DUK__PM_TZHOUR #undef DUK__PM_TZMINUTE #undef DUK__PM_YEAR #undef DUK__RULE_MASK_PART_SEP #undef DUK__SI_COLON #undef DUK__SI_MINUS #undef DUK__SI_NUL #undef DUK__SI_PERIOD #undef DUK__SI_PLUS #undef DUK__SI_SPACE #undef DUK__SI_T #undef DUK__SI_Z #undef DUK__SM_COLON #undef DUK__SM_MINUS #undef DUK__SM_NUL #undef DUK__SM_PERIOD #undef DUK__SM_PLUS #undef DUK__SM_SPACE #undef DUK__SM_T #undef DUK__SM_Z #undef DUK__UNPACK_RULE #undef DUK__WEEKDAY_MOD_ADDER #undef DUK__YEAR #line 1 "duk_bi_date_unix.c" /* * Unix-like Date providers * * Generally useful Unix / POSIX / ANSI Date providers. */ /* #include duk_internal.h -> already included */ /* The necessary #includes are in place in duk_config.h. */ /* Buffer sizes for some UNIX calls. Larger than strictly necessary * to avoid Valgrind errors. */ #define DUK__STRPTIME_BUF_SIZE 64 #define DUK__STRFTIME_BUF_SIZE 64 #if defined(DUK_USE_DATE_NOW_GETTIMEOFDAY) /* Get current Ecmascript time (= UNIX/Posix time, but in milliseconds). */ DUK_INTERNAL duk_double_t duk_bi_date_get_now_gettimeofday(void) { struct timeval tv; duk_double_t d; if (gettimeofday(&tv, NULL) != 0) { DUK_D(DUK_DPRINT("gettimeofday() failed")); return 0.0; } /* As of Duktape 2.2.0 allow fractions. */ d = ((duk_double_t) tv.tv_sec) * 1000.0 + ((duk_double_t) tv.tv_usec) / 1000.0; return d; } #endif /* DUK_USE_DATE_NOW_GETTIMEOFDAY */ #if defined(DUK_USE_DATE_NOW_TIME) /* Not a very good provider: only full seconds are available. */ DUK_INTERNAL duk_double_t duk_bi_date_get_now_time(void) { time_t t; t = time(NULL); if (t == (time_t) -1) { DUK_D(DUK_DPRINT("time() failed")); return 0.0; } return ((duk_double_t) t) * 1000.0; } #endif /* DUK_USE_DATE_NOW_TIME */ #if defined(DUK_USE_DATE_TZO_GMTIME) || defined(DUK_USE_DATE_TZO_GMTIME_R) || defined(DUK_USE_DATE_TZO_GMTIME_S) /* Get local time offset (in seconds) for a certain (UTC) instant 'd'. */ DUK_INTERNAL duk_int_t duk_bi_date_get_local_tzoffset_gmtime(duk_double_t d) { time_t t, t1, t2; duk_int_t parts[DUK_DATE_IDX_NUM_PARTS]; duk_double_t dparts[DUK_DATE_IDX_NUM_PARTS]; struct tm tms[2]; #if defined(DUK_USE_DATE_TZO_GMTIME) struct tm *tm_ptr; #endif /* For NaN/inf, the return value doesn't matter. */ if (!DUK_ISFINITE(d)) { return 0; } /* If not within Ecmascript range, some integer time calculations * won't work correctly (and some asserts will fail), so bail out * if so. This fixes test-bug-date-insane-setyear.js. There is * a +/- 24h leeway in this range check to avoid a test262 corner * case documented in test-bug-date-timeval-edges.js. */ if (!duk_bi_date_timeval_in_leeway_range(d)) { DUK_DD(DUK_DDPRINT("timeval not within valid range, skip tzoffset computation to avoid integer overflows")); return 0; } /* * This is a bit tricky to implement portably. The result depends * on the timestamp (specifically, DST depends on the timestamp). * If e.g. UNIX APIs are used, they'll have portability issues with * very small and very large years. * * Current approach: * * - Stay within portable UNIX limits by using equivalent year mapping. * Avoid year 1970 and 2038 as some conversions start to fail, at * least on some platforms. Avoiding 1970 means that there are * currently DST discrepancies for 1970. * * - Create a UTC and local time breakdowns from 't'. Then create * a time_t using gmtime() and localtime() and compute the time * difference between the two. * * Equivalent year mapping (E5 Section 15.9.1.8): * * If the host environment provides functionality for determining * daylight saving time, the implementation of ECMAScript is free * to map the year in question to an equivalent year (same * leap-year-ness and same starting week day for the year) for which * the host environment provides daylight saving time information. * The only restriction is that all equivalent years should produce * the same result. * * This approach is quite reasonable but not entirely correct, e.g. * the specification also states (E5 Section 15.9.1.8): * * The implementation of ECMAScript should not try to determine * whether the exact time was subject to daylight saving time, but * just whether daylight saving time would have been in effect if * the _current daylight saving time algorithm_ had been used at the * time. This avoids complications such as taking into account the * years that the locale observed daylight saving time year round. * * Since we rely on the platform APIs for conversions between local * time and UTC, we can't guarantee the above. Rather, if the platform * has historical DST rules they will be applied. This seems to be the * general preferred direction in Ecmascript standardization (or at least * implementations) anyway, and even the equivalent year mapping should * be disabled if the platform is known to handle DST properly for the * full Ecmascript range. * * The following has useful discussion and links: * * https://bugzilla.mozilla.org/show_bug.cgi?id=351066 */ duk_bi_date_timeval_to_parts(d, parts, dparts, DUK_DATE_FLAG_EQUIVYEAR /*flags*/); DUK_ASSERT(parts[DUK_DATE_IDX_YEAR] >= 1970 && parts[DUK_DATE_IDX_YEAR] <= 2038); d = duk_bi_date_get_timeval_from_dparts(dparts, 0 /*flags*/); DUK_ASSERT(d >= 0 && d < 2147483648.0 * 1000.0); /* unsigned 31-bit range */ t = (time_t) (d / 1000.0); DUK_DDD(DUK_DDDPRINT("timeval: %lf -> time_t %ld", (double) d, (long) t)); DUK_MEMZERO((void *) tms, sizeof(struct tm) * 2); #if defined(DUK_USE_DATE_TZO_GMTIME_R) (void) gmtime_r(&t, &tms[0]); (void) localtime_r(&t, &tms[1]); #elif defined(DUK_USE_DATE_TZO_GMTIME_S) (void) gmtime_s(&t, &tms[0]); (void) localtime_s(&t, &tms[1]); #elif defined(DUK_USE_DATE_TZO_GMTIME) tm_ptr = gmtime(&t); DUK_MEMCPY((void *) &tms[0], tm_ptr, sizeof(struct tm)); tm_ptr = localtime(&t); DUK_MEMCPY((void *) &tms[1], tm_ptr, sizeof(struct tm)); #else #error internal error #endif DUK_DDD(DUK_DDDPRINT("gmtime result: tm={sec:%ld,min:%ld,hour:%ld,mday:%ld,mon:%ld,year:%ld," "wday:%ld,yday:%ld,isdst:%ld}", (long) tms[0].tm_sec, (long) tms[0].tm_min, (long) tms[0].tm_hour, (long) tms[0].tm_mday, (long) tms[0].tm_mon, (long) tms[0].tm_year, (long) tms[0].tm_wday, (long) tms[0].tm_yday, (long) tms[0].tm_isdst)); DUK_DDD(DUK_DDDPRINT("localtime result: tm={sec:%ld,min:%ld,hour:%ld,mday:%ld,mon:%ld,year:%ld," "wday:%ld,yday:%ld,isdst:%ld}", (long) tms[1].tm_sec, (long) tms[1].tm_min, (long) tms[1].tm_hour, (long) tms[1].tm_mday, (long) tms[1].tm_mon, (long) tms[1].tm_year, (long) tms[1].tm_wday, (long) tms[1].tm_yday, (long) tms[1].tm_isdst)); /* tm_isdst is both an input and an output to mktime(), use 0 to * avoid DST handling in mktime(): * - https://github.com/svaarala/duktape/issues/406 * - http://stackoverflow.com/questions/8558919/mktime-and-tm-isdst */ tms[0].tm_isdst = 0; tms[1].tm_isdst = 0; t1 = mktime(&tms[0]); /* UTC */ t2 = mktime(&tms[1]); /* local */ if (t1 == (time_t) -1 || t2 == (time_t) -1) { /* This check used to be for (t < 0) but on some platforms * time_t is unsigned and apparently the proper way to detect * an mktime() error return is the cast above. See e.g.: * http://pubs.opengroup.org/onlinepubs/009695299/functions/mktime.html */ goto mktime_error; } DUK_DDD(DUK_DDDPRINT("t1=%ld (utc), t2=%ld (local)", (long) t1, (long) t2)); /* Compute final offset in seconds, positive if local time ahead of * UTC (returned value is UTC-to-local offset). * * difftime() returns a double, so coercion to int generates quite * a lot of code. Direct subtraction is not portable, however. * XXX: allow direct subtraction on known platforms. */ #if 0 return (duk_int_t) (t2 - t1); #endif return (duk_int_t) difftime(t2, t1); mktime_error: /* XXX: return something more useful, so that caller can throw? */ DUK_D(DUK_DPRINT("mktime() failed, d=%lf", (double) d)); return 0; } #endif /* DUK_USE_DATE_TZO_GMTIME */ #if defined(DUK_USE_DATE_PRS_STRPTIME) DUK_INTERNAL duk_bool_t duk_bi_date_parse_string_strptime(duk_hthread *thr, const char *str) { struct tm tm; time_t t; char buf[DUK__STRPTIME_BUF_SIZE]; /* Copy to buffer with slack to avoid Valgrind gripes from strptime. */ DUK_ASSERT(str != NULL); DUK_MEMZERO(buf, sizeof(buf)); /* valgrind whine without this */ DUK_SNPRINTF(buf, sizeof(buf), "%s", (const char *) str); buf[sizeof(buf) - 1] = (char) 0; DUK_DDD(DUK_DDDPRINT("parsing: '%s'", (const char *) buf)); DUK_MEMZERO(&tm, sizeof(tm)); if (strptime((const char *) buf, "%c", &tm) != NULL) { DUK_DDD(DUK_DDDPRINT("before mktime: tm={sec:%ld,min:%ld,hour:%ld,mday:%ld,mon:%ld,year:%ld," "wday:%ld,yday:%ld,isdst:%ld}", (long) tm.tm_sec, (long) tm.tm_min, (long) tm.tm_hour, (long) tm.tm_mday, (long) tm.tm_mon, (long) tm.tm_year, (long) tm.tm_wday, (long) tm.tm_yday, (long) tm.tm_isdst)); tm.tm_isdst = -1; /* negative: dst info not available */ t = mktime(&tm); DUK_DDD(DUK_DDDPRINT("mktime() -> %ld", (long) t)); if (t >= 0) { duk_push_number(thr, ((duk_double_t) t) * 1000.0); return 1; } } return 0; } #endif /* DUK_USE_DATE_PRS_STRPTIME */ #if defined(DUK_USE_DATE_PRS_GETDATE) DUK_INTERNAL duk_bool_t duk_bi_date_parse_string_getdate(duk_hthread *thr, const char *str) { struct tm tm; duk_small_int_t rc; time_t t; /* For this to work, DATEMSK must be set, so this is not very * convenient for an embeddable interpreter. */ DUK_MEMZERO(&tm, sizeof(struct tm)); rc = (duk_small_int_t) getdate_r(str, &tm); DUK_DDD(DUK_DDDPRINT("getdate_r() -> %ld", (long) rc)); if (rc == 0) { t = mktime(&tm); DUK_DDD(DUK_DDDPRINT("mktime() -> %ld", (long) t)); if (t >= 0) { duk_push_number(thr, (duk_double_t) t); return 1; } } return 0; } #endif /* DUK_USE_DATE_PRS_GETDATE */ #if defined(DUK_USE_DATE_FMT_STRFTIME) DUK_INTERNAL duk_bool_t duk_bi_date_format_parts_strftime(duk_hthread *thr, duk_int_t *parts, duk_int_t tzoffset, duk_small_uint_t flags) { char buf[DUK__STRFTIME_BUF_SIZE]; struct tm tm; const char *fmt; DUK_UNREF(tzoffset); /* If the platform doesn't support the entire Ecmascript range, we need * to return 0 so that the caller can fall back to the default formatter. * * For now, assume that if time_t is 8 bytes or more, the whole Ecmascript * range is supported. For smaller time_t values (4 bytes in practice), * assumes that the signed 32-bit range is supported. * * XXX: detect this more correctly per platform. The size of time_t is * probably not an accurate guarantee of strftime() supporting or not * supporting a large time range (the full Ecmascript range). */ if (sizeof(time_t) < 8 && (parts[DUK_DATE_IDX_YEAR] < 1970 || parts[DUK_DATE_IDX_YEAR] > 2037)) { /* be paranoid for 32-bit time values (even avoiding negative ones) */ return 0; } DUK_MEMZERO(&tm, sizeof(tm)); tm.tm_sec = parts[DUK_DATE_IDX_SECOND]; tm.tm_min = parts[DUK_DATE_IDX_MINUTE]; tm.tm_hour = parts[DUK_DATE_IDX_HOUR]; tm.tm_mday = parts[DUK_DATE_IDX_DAY]; /* already one-based */ tm.tm_mon = parts[DUK_DATE_IDX_MONTH] - 1; /* one-based -> zero-based */ tm.tm_year = parts[DUK_DATE_IDX_YEAR] - 1900; tm.tm_wday = parts[DUK_DATE_IDX_WEEKDAY]; tm.tm_isdst = 0; DUK_MEMZERO(buf, sizeof(buf)); if ((flags & DUK_DATE_FLAG_TOSTRING_DATE) && (flags & DUK_DATE_FLAG_TOSTRING_TIME)) { fmt = "%c"; } else if (flags & DUK_DATE_FLAG_TOSTRING_DATE) { fmt = "%x"; } else { DUK_ASSERT(flags & DUK_DATE_FLAG_TOSTRING_TIME); fmt = "%X"; } (void) strftime(buf, sizeof(buf) - 1, fmt, &tm); DUK_ASSERT(buf[sizeof(buf) - 1] == 0); duk_push_string(thr, buf); return 1; } #endif /* DUK_USE_DATE_FMT_STRFTIME */ #if defined(DUK_USE_GET_MONOTONIC_TIME_CLOCK_GETTIME) DUK_INTERNAL duk_double_t duk_bi_date_get_monotonic_time_clock_gettime(void) { struct timespec ts; if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) { return (duk_double_t) ts.tv_sec * 1000.0 + (duk_double_t) ts.tv_nsec / 1000000.0; } else { DUK_D(DUK_DPRINT("clock_gettime(CLOCK_MONOTONIC) failed")); return 0.0; } } #endif /* automatic undefs */ #undef DUK__STRFTIME_BUF_SIZE #undef DUK__STRPTIME_BUF_SIZE #line 1 "duk_bi_date_windows.c" /* * Windows Date providers * * Platform specific links: * * - http://msdn.microsoft.com/en-us/library/windows/desktop/ms725473(v=vs.85).aspx */ /* #include duk_internal.h -> already included */ /* The necessary #includes are in place in duk_config.h. */ #if defined(DUK_USE_DATE_NOW_WINDOWS) || defined(DUK_USE_DATE_TZO_WINDOWS) /* Shared Windows helpers. */ DUK_LOCAL void duk__convert_systime_to_ularge(const SYSTEMTIME *st, ULARGE_INTEGER *res) { FILETIME ft; if (SystemTimeToFileTime(st, &ft) == 0) { DUK_D(DUK_DPRINT("SystemTimeToFileTime() failed, returning 0")); res->QuadPart = 0; } else { res->LowPart = ft.dwLowDateTime; res->HighPart = ft.dwHighDateTime; } } DUK_LOCAL void duk__convert_filetime_to_ularge(const FILETIME *ft, ULARGE_INTEGER *res) { res->LowPart = ft->dwLowDateTime; res->HighPart = ft->dwHighDateTime; } DUK_LOCAL void duk__set_systime_jan1970(SYSTEMTIME *st) { DUK_MEMZERO((void *) st, sizeof(*st)); st->wYear = 1970; st->wMonth = 1; st->wDayOfWeek = 4; /* not sure whether or not needed; Thursday */ st->wDay = 1; DUK_ASSERT(st->wHour == 0); DUK_ASSERT(st->wMinute == 0); DUK_ASSERT(st->wSecond == 0); DUK_ASSERT(st->wMilliseconds == 0); } #endif /* defined(DUK_USE_DATE_NOW_WINDOWS) || defined(DUK_USE_DATE_TZO_WINDOWS) */ #if defined(DUK_USE_DATE_NOW_WINDOWS) DUK_INTERNAL duk_double_t duk_bi_date_get_now_windows(void) { /* Suggested step-by-step method from documentation of RtlTimeToSecondsSince1970: * http://msdn.microsoft.com/en-us/library/windows/desktop/ms724928(v=vs.85).aspx */ SYSTEMTIME st1, st2; ULARGE_INTEGER tmp1, tmp2; GetSystemTime(&st1); duk__convert_systime_to_ularge((const SYSTEMTIME *) &st1, &tmp1); duk__set_systime_jan1970(&st2); duk__convert_systime_to_ularge((const SYSTEMTIME *) &st2, &tmp2); /* Difference is in 100ns units, convert to milliseconds, keeping * fractions since Duktape 2.2.0. This is only theoretical because * SYSTEMTIME is limited to milliseconds. */ return (duk_double_t) ((LONGLONG) tmp1.QuadPart - (LONGLONG) tmp2.QuadPart) / 10000.0; } #endif /* DUK_USE_DATE_NOW_WINDOWS */ #if defined(DUK_USE_DATE_NOW_WINDOWS_SUBMS) DUK_INTERNAL duk_double_t duk_bi_date_get_now_windows_subms(void) { /* Variant of the basic algorithm using GetSystemTimePreciseAsFileTime() * for more accuracy. */ FILETIME ft1; SYSTEMTIME st2; ULARGE_INTEGER tmp1, tmp2; GetSystemTimePreciseAsFileTime(&ft1); duk__convert_filetime_to_ularge((const FILETIME *) &ft1, &tmp1); duk__set_systime_jan1970(&st2); duk__convert_systime_to_ularge((const SYSTEMTIME *) &st2, &tmp2); /* Difference is in 100ns units, convert to milliseconds, keeping * fractions since Duktape 2.2.0. */ return (duk_double_t) ((LONGLONG) tmp1.QuadPart - (LONGLONG) tmp2.QuadPart) / 10000.0; } #endif /* DUK_USE_DATE_NOW_WINDOWS */ #if defined(DUK_USE_DATE_TZO_WINDOWS) DUK_INTERNAL duk_int_t duk_bi_date_get_local_tzoffset_windows(duk_double_t d) { SYSTEMTIME st1; SYSTEMTIME st2; SYSTEMTIME st3; ULARGE_INTEGER tmp1; ULARGE_INTEGER tmp2; ULARGE_INTEGER tmp3; FILETIME ft1; /* XXX: handling of timestamps outside Windows supported range. * How does Windows deal with dates before 1600? Does windows * support all Ecmascript years (like -200000 and +200000)? * Should equivalent year mapping be used here too? If so, use * a shared helper (currently integrated into timeval-to-parts). */ /* Use the approach described in "Remarks" of FileTimeToLocalFileTime: * http://msdn.microsoft.com/en-us/library/windows/desktop/ms724277(v=vs.85).aspx */ duk__set_systime_jan1970(&st1); duk__convert_systime_to_ularge((const SYSTEMTIME *) &st1, &tmp1); tmp2.QuadPart = (ULONGLONG) (d * 10000.0); /* millisec -> 100ns units since jan 1, 1970 */ tmp2.QuadPart += tmp1.QuadPart; /* input 'd' in Windows UTC, 100ns units */ ft1.dwLowDateTime = tmp2.LowPart; ft1.dwHighDateTime = tmp2.HighPart; FileTimeToSystemTime((const FILETIME *) &ft1, &st2); if (SystemTimeToTzSpecificLocalTime((LPTIME_ZONE_INFORMATION) NULL, &st2, &st3) == 0) { DUK_D(DUK_DPRINT("SystemTimeToTzSpecificLocalTime() failed, return tzoffset 0")); return 0; } duk__convert_systime_to_ularge((const SYSTEMTIME *) &st3, &tmp3); /* Positive if local time ahead of UTC. */ return (duk_int_t) (((LONGLONG) tmp3.QuadPart - (LONGLONG) tmp2.QuadPart) / DUK_I64_CONSTANT(10000000)); /* seconds */ } #endif /* DUK_USE_DATE_TZO_WINDOWS */ #if defined(DUK_USE_DATE_TZO_WINDOWS_NO_DST) DUK_INTERNAL duk_int_t duk_bi_date_get_local_tzoffset_windows_no_dst(duk_double_t d) { SYSTEMTIME st1; SYSTEMTIME st2; FILETIME ft1; FILETIME ft2; ULARGE_INTEGER tmp1; ULARGE_INTEGER tmp2; /* Do a similar computation to duk_bi_date_get_local_tzoffset_windows * but without accounting for daylight savings time. Use this on * Windows platforms (like Durango) that don't support the * SystemTimeToTzSpecificLocalTime() call. */ /* current time not needed for this computation */ DUK_UNREF(d); duk__set_systime_jan1970(&st1); duk__convert_systime_to_ularge((const SYSTEMTIME *) &st1, &tmp1); ft1.dwLowDateTime = tmp1.LowPart; ft1.dwHighDateTime = tmp1.HighPart; FileTimeToLocalFileTime((const FILETIME *) &ft1, &ft2); FileTimeToSystemTime((const FILETIME *) &ft2, &st2); duk__convert_systime_to_ularge((const SYSTEMTIME *) &st2, &tmp2); return (duk_int_t) (((LONGLONG) tmp2.QuadPart - (LONGLONG) tmp1.QuadPart) / DUK_I64_CONSTANT(10000000)); /* seconds */ } #endif /* DUK_USE_DATE_TZO_WINDOWS_NO_DST */ #if defined(DUK_USE_GET_MONOTONIC_TIME_WINDOWS_QPC) DUK_INTERNAL duk_double_t duk_bi_date_get_monotonic_time_windows_qpc(void) { LARGE_INTEGER count, freq; /* There are legacy issues with QueryPerformanceCounter(): * - Potential jumps: https://support.microsoft.com/en-us/help/274323/performance-counter-value-may-unexpectedly-leap-forward * - Differences between cores (XP): https://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx#qpc_support_in_windows_versions * * We avoid these by enabling QPC by default only for Vista or later. */ if (QueryPerformanceCounter(&count) && QueryPerformanceFrequency(&freq)) { /* XXX: QueryPerformanceFrequency() can be cached */ return (duk_double_t) count.QuadPart / (duk_double_t) freq.QuadPart * 1000.0; } else { /* MSDN: "On systems that run Windows XP or later, the function * will always succeed and will thus never return zero." * Provide minimal error path just in case user enables this * feature in pre-XP Windows. */ return 0.0; } } #endif /* DUK_USE_GET_MONOTONIC_TIME_WINDOWS_QPC */ #line 1 "duk_bi_duktape.c" /* * Duktape built-ins * * Size optimization note: it might seem that vararg multipurpose functions * like fin(), enc(), and dec() are not very size optimal, but using a single * user-visible Ecmascript function saves a lot of run-time footprint; each * Function instance takes >100 bytes. Using a shared native helper and a * 'magic' value won't save much if there are multiple Function instances * anyway. */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_DUKTAPE_BUILTIN) DUK_INTERNAL duk_ret_t duk_bi_duktape_object_info(duk_hthread *thr) { duk_inspect_value(thr, -1); return 1; } DUK_INTERNAL duk_ret_t duk_bi_duktape_object_act(duk_hthread *thr) { duk_int_t level; level = duk_to_int(thr, 0); duk_inspect_callstack_entry(thr, level); return 1; } DUK_INTERNAL duk_ret_t duk_bi_duktape_object_gc(duk_hthread *thr) { duk_small_uint_t flags; flags = (duk_small_uint_t) duk_get_uint(thr, 0); duk_heap_mark_and_sweep(thr->heap, flags); /* XXX: Not sure what the best return value would be in the API. * Return true for now. */ duk_push_true(thr); return 1; } #if defined(DUK_USE_FINALIZER_SUPPORT) DUK_INTERNAL duk_ret_t duk_bi_duktape_object_fin(duk_hthread *thr) { (void) duk_require_hobject(thr, 0); if (duk_get_top(thr) >= 2) { /* Set: currently a finalizer is disabled by setting it to * undefined; this does not remove the property at the moment. * The value could be type checked to be either a function * or something else; if something else, the property could * be deleted. Must use duk_set_finalizer() to keep * DUK_HOBJECT_FLAG_HAVE_FINALIZER in sync. */ duk_set_top(thr, 2); duk_set_finalizer(thr, 0); return 0; } else { /* Get. */ DUK_ASSERT(duk_get_top(thr) == 1); duk_get_finalizer(thr, 0); return 1; } } #endif /* DUK_USE_FINALIZER_SUPPORT */ DUK_INTERNAL duk_ret_t duk_bi_duktape_object_enc(duk_hthread *thr) { duk_hstring *h_str; /* Vararg function: must be careful to check/require arguments. * The JSON helpers accept invalid indices and treat them like * non-existent optional parameters. */ h_str = duk_require_hstring(thr, 0); /* Could reject symbols, but no point: won't match comparisons. */ duk_require_valid_index(thr, 1); if (h_str == DUK_HTHREAD_STRING_HEX(thr)) { duk_set_top(thr, 2); duk_hex_encode(thr, 1); DUK_ASSERT_TOP(thr, 2); } else if (h_str == DUK_HTHREAD_STRING_BASE64(thr)) { duk_set_top(thr, 2); duk_base64_encode(thr, 1); DUK_ASSERT_TOP(thr, 2); #if defined(DUK_USE_JSON_SUPPORT) && defined(DUK_USE_JX) } else if (h_str == DUK_HTHREAD_STRING_JX(thr)) { duk_bi_json_stringify_helper(thr, 1 /*idx_value*/, 2 /*idx_replacer*/, 3 /*idx_space*/, DUK_JSON_FLAG_EXT_CUSTOM | DUK_JSON_FLAG_ASCII_ONLY | DUK_JSON_FLAG_AVOID_KEY_QUOTES /*flags*/); #endif #if defined(DUK_USE_JSON_SUPPORT) && defined(DUK_USE_JC) } else if (h_str == DUK_HTHREAD_STRING_JC(thr)) { duk_bi_json_stringify_helper(thr, 1 /*idx_value*/, 2 /*idx_replacer*/, 3 /*idx_space*/, DUK_JSON_FLAG_EXT_COMPATIBLE | DUK_JSON_FLAG_ASCII_ONLY /*flags*/); #endif } else { DUK_DCERROR_TYPE_INVALID_ARGS(thr); } return 1; } DUK_INTERNAL duk_ret_t duk_bi_duktape_object_dec(duk_hthread *thr) { duk_hstring *h_str; /* Vararg function: must be careful to check/require arguments. * The JSON helpers accept invalid indices and treat them like * non-existent optional parameters. */ h_str = duk_require_hstring(thr, 0); /* Could reject symbols, but no point: won't match comparisons */ duk_require_valid_index(thr, 1); if (h_str == DUK_HTHREAD_STRING_HEX(thr)) { duk_set_top(thr, 2); duk_hex_decode(thr, 1); DUK_ASSERT_TOP(thr, 2); } else if (h_str == DUK_HTHREAD_STRING_BASE64(thr)) { duk_set_top(thr, 2); duk_base64_decode(thr, 1); DUK_ASSERT_TOP(thr, 2); #if defined(DUK_USE_JSON_SUPPORT) && defined(DUK_USE_JX) } else if (h_str == DUK_HTHREAD_STRING_JX(thr)) { duk_bi_json_parse_helper(thr, 1 /*idx_value*/, 2 /*idx_replacer*/, DUK_JSON_FLAG_EXT_CUSTOM /*flags*/); #endif #if defined(DUK_USE_JSON_SUPPORT) && defined(DUK_USE_JC) } else if (h_str == DUK_HTHREAD_STRING_JC(thr)) { duk_bi_json_parse_helper(thr, 1 /*idx_value*/, 2 /*idx_replacer*/, DUK_JSON_FLAG_EXT_COMPATIBLE /*flags*/); #endif } else { DUK_DCERROR_TYPE_INVALID_ARGS(thr); } return 1; } /* * Compact an object */ DUK_INTERNAL duk_ret_t duk_bi_duktape_object_compact(duk_hthread *thr) { DUK_ASSERT_TOP(thr, 1); duk_compact(thr, 0); return 1; /* return the argument object */ } #endif /* DUK_USE_DUKTAPE_BUILTIN */ #line 1 "duk_bi_encoding.c" /* * WHATWG Encoding API built-ins * * API specification: https://encoding.spec.whatwg.org/#api * Web IDL: https://www.w3.org/TR/WebIDL/ */ /* #include duk_internal.h -> already included */ /* * Data structures for encoding/decoding */ typedef struct { duk_uint8_t *out; /* where to write next byte(s) */ duk_codepoint_t lead; /* lead surrogate */ } duk__encode_context; typedef struct { /* UTF-8 decoding state */ duk_codepoint_t codepoint; /* built up incrementally */ duk_uint8_t upper; /* max value of next byte (decode error otherwise) */ duk_uint8_t lower; /* min value of next byte (ditto) */ duk_uint8_t needed; /* how many more bytes we need */ duk_uint8_t bom_handled; /* BOM seen or no longer expected */ /* Decoder configuration */ duk_uint8_t fatal; duk_uint8_t ignore_bom; } duk__decode_context; /* The signed duk_codepoint_t type is used to signal a decoded codepoint * (>= 0) or various other states using negative values. */ #define DUK__CP_CONTINUE (-1) /* continue to next byte, no completed codepoint */ #define DUK__CP_ERROR (-2) /* decoding error */ #define DUK__CP_RETRY (-3) /* decoding error; retry last byte */ /* * Raw helpers for encoding/decoding */ /* Emit UTF-8 (= CESU-8) encoded U+FFFD (replacement char), i.e. ef bf bd. */ DUK_LOCAL duk_uint8_t *duk__utf8_emit_repl(duk_uint8_t *ptr) { *ptr++ = 0xef; *ptr++ = 0xbf; *ptr++ = 0xbd; return ptr; } DUK_LOCAL void duk__utf8_decode_init(duk__decode_context *dec_ctx) { /* (Re)init the decoding state of 'dec_ctx' but leave decoder * configuration fields untouched. */ dec_ctx->codepoint = 0x0000L; dec_ctx->upper = 0xbf; dec_ctx->lower = 0x80; dec_ctx->needed = 0; dec_ctx->bom_handled = 0; } DUK_LOCAL duk_codepoint_t duk__utf8_decode_next(duk__decode_context *dec_ctx, duk_uint8_t x) { /* * UTF-8 algorithm based on the Encoding specification: * https://encoding.spec.whatwg.org/#utf-8-decoder * * Two main states: decoding initial byte vs. decoding continuation * bytes. Shortest length encoding is validated by restricting the * allowed range of first continuation byte using 'lower' and 'upper'. */ if (dec_ctx->needed == 0) { /* process initial byte */ if (x <= 0x7f) { /* U+0000-U+007F, 1 byte (ASCII) */ return (duk_codepoint_t) x; } else if (x >= 0xc2 && x <= 0xdf) { /* U+0080-U+07FF, 2 bytes */ dec_ctx->needed = 1; dec_ctx->codepoint = x & 0x1f; DUK_ASSERT(dec_ctx->lower == 0x80); DUK_ASSERT(dec_ctx->upper == 0xbf); return DUK__CP_CONTINUE; } else if (x >= 0xe0 && x <= 0xef) { /* U+0800-U+FFFF, 3 bytes */ if (x == 0xe0) { dec_ctx->lower = 0xa0; DUK_ASSERT(dec_ctx->upper == 0xbf); } else if (x == 0xed) { DUK_ASSERT(dec_ctx->lower == 0x80); dec_ctx->upper = 0x9f; } dec_ctx->needed = 2; dec_ctx->codepoint = x & 0x0f; return DUK__CP_CONTINUE; } else if (x >= 0xf0 && x <= 0xf4) { /* U+010000-U+10FFFF, 4 bytes */ if (x == 0xf0) { dec_ctx->lower = 0x90; DUK_ASSERT(dec_ctx->upper == 0xbf); } else if (x == 0xf4) { DUK_ASSERT(dec_ctx->lower == 0x80); dec_ctx->upper = 0x8f; } dec_ctx->needed = 3; dec_ctx->codepoint = x & 0x07; return DUK__CP_CONTINUE; } else { /* not a legal initial byte */ return DUK__CP_ERROR; } } else { /* process continuation byte */ if (x >= dec_ctx->lower && x <= dec_ctx->upper) { dec_ctx->lower = 0x80; dec_ctx->upper = 0xbf; dec_ctx->codepoint = (dec_ctx->codepoint << 6) | (x & 0x3f); if (--dec_ctx->needed > 0) { /* need more bytes */ return DUK__CP_CONTINUE; } else { /* got a codepoint */ duk_codepoint_t ret; DUK_ASSERT(dec_ctx->codepoint <= 0x10ffffL); /* Decoding rules guarantee. */ ret = dec_ctx->codepoint; dec_ctx->codepoint = 0x0000L; dec_ctx->needed = 0; return ret; } } else { /* We just encountered an illegal UTF-8 continuation byte. This might * be the initial byte of the next character; if we return a plain * error status and the decoder is in replacement mode, the character * will be masked. We still need to alert the caller to the error * though. */ dec_ctx->codepoint = 0x0000L; dec_ctx->needed = 0; dec_ctx->lower = 0x80; dec_ctx->upper = 0xbf; return DUK__CP_RETRY; } } } #if defined(DUK_USE_ENCODING_BUILTINS) DUK_LOCAL void duk__utf8_encode_char(void *udata, duk_codepoint_t codepoint) { duk__encode_context *enc_ctx; DUK_ASSERT(codepoint >= 0); enc_ctx = (duk__encode_context *) udata; DUK_ASSERT(enc_ctx != NULL); #if !defined(DUK_USE_PREFER_SIZE) if (codepoint <= 0x7f && enc_ctx->lead == 0x0000L) { /* Fast path for ASCII. */ *enc_ctx->out++ = (duk_uint8_t) codepoint; return; } #endif if (DUK_UNLIKELY(codepoint > 0x10ffffL)) { /* cannot legally encode in UTF-8 */ codepoint = DUK_UNICODE_CP_REPLACEMENT_CHARACTER; } else if (codepoint >= 0xd800L && codepoint <= 0xdfffL) { if (codepoint <= 0xdbffL) { /* high surrogate */ duk_codepoint_t prev_lead = enc_ctx->lead; enc_ctx->lead = codepoint; if (prev_lead == 0x0000L) { /* high surrogate, no output */ return; } else { /* consecutive high surrogates, consider first one unpaired */ codepoint = DUK_UNICODE_CP_REPLACEMENT_CHARACTER; } } else { /* low surrogate */ if (enc_ctx->lead != 0x0000L) { codepoint = (duk_codepoint_t) (0x010000L + ((enc_ctx->lead - 0xd800L) << 10) + (codepoint - 0xdc00L)); enc_ctx->lead = 0x0000L; } else { /* unpaired low surrogate */ DUK_ASSERT(enc_ctx->lead == 0x0000L); codepoint = DUK_UNICODE_CP_REPLACEMENT_CHARACTER; } } } else { if (enc_ctx->lead != 0x0000L) { /* unpaired high surrogate: emit replacement character and the input codepoint */ enc_ctx->lead = 0x0000L; enc_ctx->out = duk__utf8_emit_repl(enc_ctx->out); } } /* Codepoint may be original input, a decoded surrogate pair, or may * have been replaced with U+FFFD. */ enc_ctx->out += duk_unicode_encode_xutf8((duk_ucodepoint_t) codepoint, enc_ctx->out); } #endif /* DUK_USE_ENCODING_BUILTINS */ /* Shared helper for buffer-to-string using a TextDecoder() compatible UTF-8 * decoder. */ DUK_LOCAL duk_ret_t duk__decode_helper(duk_hthread *thr, duk__decode_context *dec_ctx) { const duk_uint8_t *input; duk_size_t len = 0; duk_size_t len_tmp; duk_bool_t stream = 0; duk_codepoint_t codepoint; duk_uint8_t *output; const duk_uint8_t *in; duk_uint8_t *out; DUK_ASSERT(dec_ctx != NULL); /* Careful with input buffer pointer: any side effects involving * code execution (e.g. getters, coercion calls, and finalizers) * may cause a resize and invalidate a pointer we've read. This * is why the pointer is actually looked up at the last minute. * Argument validation must still happen first to match WHATWG * required side effect order. */ if (duk_is_undefined(thr, 0)) { duk_push_fixed_buffer_nozero(thr, 0); duk_replace(thr, 0); } (void) duk_require_buffer_data(thr, 0, &len); /* Need 'len', avoid pointer. */ if (duk_check_type_mask(thr, 1, DUK_TYPE_MASK_UNDEFINED | DUK_TYPE_MASK_NULL | DUK_TYPE_MASK_NONE)) { /* Use defaults, treat missing value like undefined. */ } else { duk_require_type_mask(thr, 1, DUK_TYPE_MASK_UNDEFINED | DUK_TYPE_MASK_NULL | DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER | DUK_TYPE_MASK_OBJECT); if (duk_get_prop_string(thr, 1, "stream")) { stream = duk_to_boolean(thr, -1); } } /* Allowance is 3*len in the general case because all bytes may potentially * become U+FFFD. If the first byte completes a non-BMP codepoint it will * decode to a CESU-8 surrogate pair (6 bytes) so we allow 3 extra bytes to * compensate: (1*3)+3 = 6. Non-BMP codepoints are safe otherwise because * the 4->6 expansion is well under the 3x allowance. * * XXX: As with TextEncoder, need a better buffer allocation strategy here. */ if (len >= (DUK_HBUFFER_MAX_BYTELEN / 3) - 3) { DUK_ERROR_TYPE(thr, DUK_STR_RESULT_TOO_LONG); } output = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, 3 + (3 * len)); /* used parts will be always manually written over */ input = (const duk_uint8_t *) duk_get_buffer_data(thr, 0, &len_tmp); DUK_ASSERT(input != NULL || len == 0); if (DUK_UNLIKELY(len != len_tmp)) { /* Very unlikely but possible: source buffer was resized by * a side effect when fixed buffer was pushed. Output buffer * may not be large enough to hold output, so just fail if * length has changed. */ DUK_D(DUK_DPRINT("input buffer resized by side effect, fail")); goto fail_type; } /* From this point onwards it's critical that no side effect occur * which may disturb 'input': finalizer execution, property accesses, * active coercions, etc. Even an allocation related mark-and-sweep * may affect the pointer because it may trigger a pending finalizer. */ in = input; out = output; while (in < input + len) { codepoint = duk__utf8_decode_next(dec_ctx, *in++); if (codepoint < 0) { if (codepoint == DUK__CP_CONTINUE) { continue; } /* Decoding error with or without retry. */ DUK_ASSERT(codepoint == DUK__CP_ERROR || codepoint == DUK__CP_RETRY); if (codepoint == DUK__CP_RETRY) { --in; /* retry last byte */ } /* replacement mode: replace with U+FFFD */ codepoint = DUK_UNICODE_CP_REPLACEMENT_CHARACTER; if (dec_ctx->fatal) { /* fatal mode: throw a TypeError */ goto fail_type; } /* Continue with 'codepoint', Unicode replacement. */ } DUK_ASSERT(codepoint >= 0x0000L && codepoint <= 0x10ffffL); if (!dec_ctx->bom_handled) { dec_ctx->bom_handled = 1; if (codepoint == 0xfeffL && !dec_ctx->ignore_bom) { continue; } } out += duk_unicode_encode_cesu8((duk_ucodepoint_t) codepoint, out); DUK_ASSERT(out <= output + (3 + (3 * len))); } if (!stream) { if (dec_ctx->needed != 0) { /* truncated sequence at end of buffer */ if (dec_ctx->fatal) { goto fail_type; } else { out += duk_unicode_encode_cesu8(DUK_UNICODE_CP_REPLACEMENT_CHARACTER, out); DUK_ASSERT(out <= output + (3 + (3 * len))); } } duk__utf8_decode_init(dec_ctx); /* Initialize decoding state for potential reuse. */ } /* Output buffer is fixed and thus stable even if there had been * side effects (which there shouldn't be). */ duk_push_lstring(thr, (const char *) output, (duk_size_t) (out - output)); return 1; fail_type: DUK_ERROR_TYPE(thr, DUK_STR_UTF8_DECODE_FAILED); DUK_UNREACHABLE(); } /* * Built-in bindings */ #if defined(DUK_USE_ENCODING_BUILTINS) DUK_INTERNAL duk_ret_t duk_bi_textencoder_constructor(duk_hthread *thr) { /* TextEncoder currently requires no persistent state, so the constructor * does nothing on purpose. */ duk_require_constructor_call(thr); return 0; } DUK_INTERNAL duk_ret_t duk_bi_textencoder_prototype_encoding_getter(duk_hthread *thr) { duk_push_string(thr, "utf-8"); return 1; } DUK_INTERNAL duk_ret_t duk_bi_textencoder_prototype_encode(duk_hthread *thr) { duk__encode_context enc_ctx; duk_size_t len; duk_size_t final_len; duk_uint8_t *output; DUK_ASSERT_TOP(thr, 1); if (duk_is_undefined(thr, 0)) { len = 0; } else { duk_hstring *h_input; h_input = duk_to_hstring(thr, 0); DUK_ASSERT(h_input != NULL); len = (duk_size_t) DUK_HSTRING_GET_CHARLEN(h_input); if (len >= DUK_HBUFFER_MAX_BYTELEN / 3) { DUK_ERROR_TYPE(thr, DUK_STR_RESULT_TOO_LONG); } } /* Allowance is 3*len because all bytes can potentially be replaced with * U+FFFD -- which rather inconveniently encodes to 3 bytes in UTF-8. * Rely on dynamic buffer data pointer stability: no other code has * access to the data pointer. * * XXX: The buffer allocation strategy used here is rather inefficient. * Maybe switch to a chunk-based strategy, or preprocess the string to * figure out the space needed ahead of time? */ DUK_ASSERT(3 * len >= len); output = (duk_uint8_t *) duk_push_dynamic_buffer(thr, 3 * len); if (len > 0) { DUK_ASSERT(duk_is_string(thr, 0)); /* True if len > 0. */ /* XXX: duk_decode_string() is used to process the input * string. For standard Ecmascript strings, represented * internally as CESU-8, this is fine. However, behavior * beyond CESU-8 is not very strict: codepoints using an * extended form of UTF-8 are also accepted, and invalid * codepoint sequences (which are allowed in Duktape strings) * are not handled as well as they could (e.g. invalid * continuation bytes may mask following codepoints). * This is how Ecmascript code would also see such strings. * Maybe replace duk_decode_string() with an explicit strict * CESU-8 decoder here? */ enc_ctx.lead = 0x0000L; enc_ctx.out = output; duk_decode_string(thr, 0, duk__utf8_encode_char, (void *) &enc_ctx); if (enc_ctx.lead != 0x0000L) { /* unpaired high surrogate at end of string */ enc_ctx.out = duk__utf8_emit_repl(enc_ctx.out); DUK_ASSERT(enc_ctx.out <= output + (3 * len)); } /* The output buffer is usually very much oversized, so shrink it to * actually needed size. Pointer stability assumed up to this point. */ DUK_ASSERT_TOP(thr, 2); DUK_ASSERT(output == (duk_uint8_t *) duk_get_buffer_data(thr, -1, NULL)); final_len = (duk_size_t) (enc_ctx.out - output); duk_resize_buffer(thr, -1, final_len); /* 'output' and 'enc_ctx.out' are potentially invalidated by the resize. */ } else { final_len = 0; } /* Standard WHATWG output is a Uint8Array. Here the Uint8Array will * be backed by a dynamic buffer which differs from e.g. Uint8Arrays * created as 'new Uint8Array(N)'. Ecmascript code won't see the * difference but C code will. When bufferobjects are not supported, * returns a plain dynamic buffer. */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) duk_push_buffer_object(thr, -1, 0, final_len, DUK_BUFOBJ_UINT8ARRAY); #endif return 1; } DUK_INTERNAL duk_ret_t duk_bi_textdecoder_constructor(duk_hthread *thr) { duk__decode_context *dec_ctx; duk_bool_t fatal = 0; duk_bool_t ignore_bom = 0; DUK_ASSERT_TOP(thr, 2); duk_require_constructor_call(thr); if (!duk_is_undefined(thr, 0)) { /* XXX: For now ignore 'label' (encoding identifier). */ duk_to_string(thr, 0); } if (!duk_is_null_or_undefined(thr, 1)) { if (duk_get_prop_string(thr, 1, "fatal")) { fatal = duk_to_boolean(thr, -1); } if (duk_get_prop_string(thr, 1, "ignoreBOM")) { ignore_bom = duk_to_boolean(thr, -1); } } duk_push_this(thr); /* The decode context is not assumed to be zeroed; all fields are * initialized explicitly. */ dec_ctx = (duk__decode_context *) duk_push_fixed_buffer(thr, sizeof(duk__decode_context)); dec_ctx->fatal = (duk_uint8_t) fatal; dec_ctx->ignore_bom = (duk_uint8_t) ignore_bom; duk__utf8_decode_init(dec_ctx); /* Initializes remaining fields. */ duk_put_prop_string(thr, -2, DUK_INTERNAL_SYMBOL("Context")); return 0; } /* Get TextDecoder context from 'this'; leaves garbage on stack. */ DUK_LOCAL duk__decode_context *duk__get_textdecoder_context(duk_hthread *thr) { duk__decode_context *dec_ctx; duk_push_this(thr); duk_get_prop_string(thr, -1, DUK_INTERNAL_SYMBOL("Context")); dec_ctx = (duk__decode_context *) duk_require_buffer(thr, -1, NULL); DUK_ASSERT(dec_ctx != NULL); return dec_ctx; } DUK_INTERNAL duk_ret_t duk_bi_textdecoder_prototype_shared_getter(duk_hthread *thr) { duk__decode_context *dec_ctx; duk_int_t magic; dec_ctx = duk__get_textdecoder_context(thr); magic = duk_get_current_magic(thr); switch (magic) { case 0: /* Encoding is now fixed, so _Context lookup is only needed to * validate the 'this' binding (TypeError if not TextDecoder-like). */ duk_push_string(thr, "utf-8"); break; case 1: duk_push_boolean(thr, dec_ctx->fatal); break; default: duk_push_boolean(thr, dec_ctx->ignore_bom); break; } return 1; } DUK_INTERNAL duk_ret_t duk_bi_textdecoder_prototype_decode(duk_hthread *thr) { duk__decode_context *dec_ctx; dec_ctx = duk__get_textdecoder_context(thr); return duk__decode_helper(thr, dec_ctx); } #endif /* DUK_USE_ENCODING_BUILTINS */ /* * Internal helper for Node.js Buffer */ /* Internal helper used for Node.js Buffer .toString(). Value stack convention * is currently odd: it mimics TextDecoder .decode() so that argument must be at * index 0, and decode options (not present for Buffer) at index 1. Return value * is a Duktape/C function return value. */ DUK_INTERNAL duk_ret_t duk_textdecoder_decode_utf8_nodejs(duk_hthread *thr) { duk__decode_context dec_ctx; dec_ctx.fatal = 0; /* use replacement chars */ dec_ctx.ignore_bom = 1; /* ignore BOMs (matches Node.js Buffer .toString()) */ duk__utf8_decode_init(&dec_ctx); return duk__decode_helper(thr, &dec_ctx); } /* automatic undefs */ #undef DUK__CP_CONTINUE #undef DUK__CP_ERROR #undef DUK__CP_RETRY #line 1 "duk_bi_error.c" /* * Error built-ins */ /* #include duk_internal.h -> already included */ DUK_INTERNAL duk_ret_t duk_bi_error_constructor_shared(duk_hthread *thr) { /* Behavior for constructor and non-constructor call is * the same except for augmenting the created error. When * called as a constructor, the caller (duk_new()) will handle * augmentation; when called as normal function, we need to do * it here. */ duk_small_int_t bidx_prototype = duk_get_current_magic(thr); /* same for both error and each subclass like TypeError */ duk_uint_t flags_and_class = DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_FASTREFS | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ERROR); (void) duk_push_object_helper(thr, flags_and_class, bidx_prototype); /* If message is undefined, the own property 'message' is not set at * all to save property space. An empty message is inherited anyway. */ if (!duk_is_undefined(thr, 0)) { duk_to_string(thr, 0); duk_dup_0(thr); /* [ message error message ] */ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_MESSAGE, DUK_PROPDESC_FLAGS_WC); } /* Augment the error if called as a normal function. __FILE__ and __LINE__ * are not desirable in this case. */ #if defined(DUK_USE_AUGMENT_ERROR_CREATE) if (!duk_is_constructor_call(thr)) { duk_err_augment_error_create(thr, thr, NULL, 0, DUK_AUGMENT_FLAG_NOBLAME_FILELINE); } #endif return 1; } DUK_INTERNAL duk_ret_t duk_bi_error_prototype_to_string(duk_hthread *thr) { /* XXX: optimize with more direct internal access */ duk_push_this(thr); (void) duk_require_hobject_promote_mask(thr, -1, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER); /* [ ... this ] */ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_NAME); if (duk_is_undefined(thr, -1)) { duk_pop(thr); duk_push_string(thr, "Error"); } else { duk_to_string(thr, -1); } /* [ ... this name ] */ /* XXX: Are steps 6 and 7 in E5 Section 15.11.4.4 duplicated by * accident or are they actually needed? The first ToString() * could conceivably return 'undefined'. */ duk_get_prop_stridx_short(thr, -2, DUK_STRIDX_MESSAGE); if (duk_is_undefined(thr, -1)) { duk_pop(thr); duk_push_hstring_empty(thr); } else { duk_to_string(thr, -1); } /* [ ... this name message ] */ if (duk_get_length(thr, -2) == 0) { /* name is empty -> return message */ return 1; } if (duk_get_length(thr, -1) == 0) { /* message is empty -> return name */ duk_pop(thr); return 1; } duk_push_string(thr, ": "); duk_insert(thr, -2); /* ... name ': ' message */ duk_concat(thr, 3); return 1; } #if defined(DUK_USE_TRACEBACKS) /* * Traceback handling * * The unified helper decodes the traceback and produces various requested * outputs. It should be optimized for size, and may leave garbage on stack, * only the topmost return value matters. For instance, traceback separator * and decoded strings are pushed even when looking for filename only. * * NOTE: although _Tracedata is an internal property, user code can currently * write to the array (or replace it with something other than an array). * The code below must tolerate arbitrary _Tracedata. It can throw errors * etc, but cannot cause a segfault or memory unsafe behavior. */ /* constants arbitrary, chosen for small loads */ #define DUK__OUTPUT_TYPE_TRACEBACK (-1) #define DUK__OUTPUT_TYPE_FILENAME 0 #define DUK__OUTPUT_TYPE_LINENUMBER 1 DUK_LOCAL duk_ret_t duk__error_getter_helper(duk_hthread *thr, duk_small_int_t output_type) { duk_idx_t idx_td; duk_small_int_t i; /* traceback depth fits into 16 bits */ duk_small_int_t t; /* stack type fits into 16 bits */ duk_small_int_t count_func = 0; /* traceback depth ensures fits into 16 bits */ const char *str_tailcall = " tailcall"; const char *str_strict = " strict"; const char *str_construct = " construct"; const char *str_prevyield = " preventsyield"; const char *str_directeval = " directeval"; const char *str_empty = ""; DUK_ASSERT_TOP(thr, 0); /* fixed arg count */ duk_push_this(thr); duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_TRACEDATA); idx_td = duk_get_top_index(thr); duk_push_hstring_stridx(thr, DUK_STRIDX_NEWLINE_4SPACE); duk_push_this(thr); /* [ ... this tracedata sep this ] */ /* XXX: skip null filename? */ if (duk_check_type(thr, idx_td, DUK_TYPE_OBJECT)) { /* Current tracedata contains 2 entries per callstack entry. */ for (i = 0; ; i += 2) { duk_int_t pc; duk_uint_t line; duk_uint_t flags; duk_double_t d; const char *funcname; const char *filename; duk_hobject *h_func; duk_hstring *h_name; duk_require_stack(thr, 5); duk_get_prop_index(thr, idx_td, (duk_uarridx_t) i); duk_get_prop_index(thr, idx_td, (duk_uarridx_t) (i + 1)); d = duk_to_number_m1(thr); pc = (duk_int_t) DUK_FMOD(d, DUK_DOUBLE_2TO32); flags = (duk_uint_t) DUK_FLOOR(d / DUK_DOUBLE_2TO32); t = (duk_small_int_t) duk_get_type(thr, -2); if (t == DUK_TYPE_OBJECT || t == DUK_TYPE_LIGHTFUNC) { /* * Ecmascript/native function call or lightfunc call */ count_func++; /* [ ... v1(func) v2(pc+flags) ] */ /* These may be systematically omitted by Duktape * with certain config options, but allow user to * set them on a case-by-case basis. */ duk_get_prop_stridx_short(thr, -2, DUK_STRIDX_NAME); duk_get_prop_stridx_short(thr, -3, DUK_STRIDX_FILE_NAME); #if defined(DUK_USE_PC2LINE) line = (duk_uint_t) duk_hobject_pc2line_query(thr, -4, (duk_uint_fast32_t) pc); #else line = 0; #endif /* [ ... v1 v2 name filename ] */ /* When looking for .fileName/.lineNumber, blame first * function which has a .fileName. */ if (duk_is_string_notsymbol(thr, -1)) { if (output_type == DUK__OUTPUT_TYPE_FILENAME) { return 1; } else if (output_type == DUK__OUTPUT_TYPE_LINENUMBER) { duk_push_uint(thr, line); return 1; } } /* XXX: Change 'anon' handling here too, to use empty string for anonymous functions? */ /* XXX: Could be improved by coercing to a readable duk_tval (especially string escaping) */ h_name = duk_get_hstring_notsymbol(thr, -2); /* may be NULL */ funcname = (h_name == NULL || h_name == DUK_HTHREAD_STRING_EMPTY_STRING(thr)) ? "[anon]" : (const char *) DUK_HSTRING_GET_DATA(h_name); filename = duk_get_string_notsymbol(thr, -1); filename = filename ? filename : ""; DUK_ASSERT(funcname != NULL); DUK_ASSERT(filename != NULL); h_func = duk_get_hobject(thr, -4); /* NULL for lightfunc */ if (h_func == NULL) { duk_push_sprintf(thr, "at %s light%s%s%s%s%s", (const char *) funcname, (const char *) ((flags & DUK_ACT_FLAG_STRICT) ? str_strict : str_empty), (const char *) ((flags & DUK_ACT_FLAG_TAILCALLED) ? str_tailcall : str_empty), (const char *) ((flags & DUK_ACT_FLAG_CONSTRUCT) ? str_construct : str_empty), (const char *) ((flags & DUK_ACT_FLAG_DIRECT_EVAL) ? str_directeval : str_empty), (const char *) ((flags & DUK_ACT_FLAG_PREVENT_YIELD) ? str_prevyield : str_empty)); } else if (DUK_HOBJECT_HAS_NATFUNC(h_func)) { duk_push_sprintf(thr, "at %s (%s) native%s%s%s%s%s", (const char *) funcname, (const char *) filename, (const char *) ((flags & DUK_ACT_FLAG_STRICT) ? str_strict : str_empty), (const char *) ((flags & DUK_ACT_FLAG_TAILCALLED) ? str_tailcall : str_empty), (const char *) ((flags & DUK_ACT_FLAG_CONSTRUCT) ? str_construct : str_empty), (const char *) ((flags & DUK_ACT_FLAG_DIRECT_EVAL) ? str_directeval : str_empty), (const char *) ((flags & DUK_ACT_FLAG_PREVENT_YIELD) ? str_prevyield : str_empty)); } else { duk_push_sprintf(thr, "at %s (%s:%lu)%s%s%s%s%s", (const char *) funcname, (const char *) filename, (unsigned long) line, (const char *) ((flags & DUK_ACT_FLAG_STRICT) ? str_strict : str_empty), (const char *) ((flags & DUK_ACT_FLAG_TAILCALLED) ? str_tailcall : str_empty), (const char *) ((flags & DUK_ACT_FLAG_CONSTRUCT) ? str_construct : str_empty), (const char *) ((flags & DUK_ACT_FLAG_DIRECT_EVAL) ? str_directeval : str_empty), (const char *) ((flags & DUK_ACT_FLAG_PREVENT_YIELD) ? str_prevyield : str_empty)); } duk_replace(thr, -5); /* [ ... v1 v2 name filename str ] -> [ ... str v2 name filename ] */ duk_pop_3(thr); /* -> [ ... str ] */ } else if (t == DUK_TYPE_STRING) { const char *str_file; /* * __FILE__ / __LINE__ entry, here 'pc' is line number directly. * Sometimes __FILE__ / __LINE__ is reported as the source for * the error (fileName, lineNumber), sometimes not. */ /* [ ... v1(filename) v2(line+flags) ] */ /* When looking for .fileName/.lineNumber, blame compilation * or C call site unless flagged not to do so. */ if (!(flags & DUK_TB_FLAG_NOBLAME_FILELINE)) { if (output_type == DUK__OUTPUT_TYPE_FILENAME) { duk_pop(thr); return 1; } else if (output_type == DUK__OUTPUT_TYPE_LINENUMBER) { duk_push_int(thr, pc); return 1; } } /* Tracedata is trusted but avoid any risk of using a NULL * for %s format because it has undefined behavior. Symbols * don't need to be explicitly rejected as they pose no memory * safety issues. */ str_file = (const char *) duk_get_string(thr, -2); duk_push_sprintf(thr, "at [anon] (%s:%ld) internal", (const char *) (str_file ? str_file : "null"), (long) pc); duk_replace(thr, -3); /* [ ... v1 v2 str ] -> [ ... str v2 ] */ duk_pop(thr); /* -> [ ... str ] */ } else { /* unknown, ignore */ duk_pop_2(thr); break; } } if (count_func >= DUK_USE_TRACEBACK_DEPTH) { /* Possibly truncated; there is no explicit truncation * marker so this is the best we can do. */ duk_push_hstring_stridx(thr, DUK_STRIDX_BRACKETED_ELLIPSIS); } } /* [ ... this tracedata sep this str1 ... strN ] */ if (output_type != DUK__OUTPUT_TYPE_TRACEBACK) { return 0; } else { /* The 'this' after 'sep' will get ToString() coerced by * duk_join() automatically. We don't want to do that * coercion when providing .fileName or .lineNumber (GH-254). */ duk_join(thr, duk_get_top(thr) - (idx_td + 2) /*count, not including sep*/); return 1; } } /* XXX: Output type could be encoded into native function 'magic' value to * save space. For setters the stridx could be encoded into 'magic'. */ DUK_INTERNAL duk_ret_t duk_bi_error_prototype_stack_getter(duk_hthread *thr) { return duk__error_getter_helper(thr, DUK__OUTPUT_TYPE_TRACEBACK); } DUK_INTERNAL duk_ret_t duk_bi_error_prototype_filename_getter(duk_hthread *thr) { return duk__error_getter_helper(thr, DUK__OUTPUT_TYPE_FILENAME); } DUK_INTERNAL duk_ret_t duk_bi_error_prototype_linenumber_getter(duk_hthread *thr) { return duk__error_getter_helper(thr, DUK__OUTPUT_TYPE_LINENUMBER); } #else /* DUK_USE_TRACEBACKS */ /* * Traceback handling when tracebacks disabled. * * The fileName / lineNumber stubs are now necessary because built-in * data will include the accessor properties in Error.prototype. If those * are removed for builds without tracebacks, these can also be removed. * 'stack' should still be present and produce a ToString() equivalent: * this is useful for user code which prints a stacktrace and expects to * see something useful. A normal stacktrace also begins with a ToString() * of the error so this makes sense. */ DUK_INTERNAL duk_ret_t duk_bi_error_prototype_stack_getter(duk_hthread *thr) { /* XXX: remove this native function and map 'stack' accessor * to the toString() implementation directly. */ return duk_bi_error_prototype_to_string(thr); } DUK_INTERNAL duk_ret_t duk_bi_error_prototype_filename_getter(duk_hthread *thr) { DUK_UNREF(thr); return 0; } DUK_INTERNAL duk_ret_t duk_bi_error_prototype_linenumber_getter(duk_hthread *thr) { DUK_UNREF(thr); return 0; } #endif /* DUK_USE_TRACEBACKS */ DUK_LOCAL duk_ret_t duk__error_setter_helper(duk_hthread *thr, duk_small_uint_t stridx_key) { /* Attempt to write 'stack', 'fileName', 'lineNumber' works as if * user code called Object.defineProperty() to create an overriding * own property. This allows user code to overwrite .fileName etc * intuitively as e.g. "err.fileName = 'dummy'" as one might expect. * See https://github.com/svaarala/duktape/issues/387. */ DUK_ASSERT_TOP(thr, 1); /* fixed arg count: value */ duk_push_this(thr); duk_push_hstring_stridx(thr, stridx_key); duk_dup_0(thr); /* [ ... obj key value ] */ DUK_DD(DUK_DDPRINT("error setter: %!T %!T %!T", duk_get_tval(thr, -3), duk_get_tval(thr, -2), duk_get_tval(thr, -1))); duk_def_prop(thr, -3, DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_HAVE_WRITABLE | DUK_DEFPROP_WRITABLE | DUK_DEFPROP_HAVE_ENUMERABLE | /*not enumerable*/ DUK_DEFPROP_HAVE_CONFIGURABLE | DUK_DEFPROP_CONFIGURABLE); return 0; } DUK_INTERNAL duk_ret_t duk_bi_error_prototype_stack_setter(duk_hthread *thr) { return duk__error_setter_helper(thr, DUK_STRIDX_STACK); } DUK_INTERNAL duk_ret_t duk_bi_error_prototype_filename_setter(duk_hthread *thr) { return duk__error_setter_helper(thr, DUK_STRIDX_FILE_NAME); } DUK_INTERNAL duk_ret_t duk_bi_error_prototype_linenumber_setter(duk_hthread *thr) { return duk__error_setter_helper(thr, DUK_STRIDX_LINE_NUMBER); } /* automatic undefs */ #undef DUK__OUTPUT_TYPE_FILENAME #undef DUK__OUTPUT_TYPE_LINENUMBER #undef DUK__OUTPUT_TYPE_TRACEBACK #line 1 "duk_bi_function.c" /* * Function built-ins */ /* #include duk_internal.h -> already included */ /* Needed even when Function built-in is disabled. */ DUK_INTERNAL duk_ret_t duk_bi_function_prototype(duk_hthread *thr) { /* ignore arguments, return undefined (E5 Section 15.3.4) */ DUK_UNREF(thr); return 0; } #if defined(DUK_USE_FUNCTION_BUILTIN) DUK_INTERNAL duk_ret_t duk_bi_function_constructor(duk_hthread *thr) { duk_hstring *h_sourcecode; duk_idx_t nargs; duk_idx_t i; duk_small_uint_t comp_flags; duk_hcompfunc *func; duk_hobject *outer_lex_env; duk_hobject *outer_var_env; /* normal and constructor calls have identical semantics */ nargs = duk_get_top(thr); for (i = 0; i < nargs; i++) { duk_to_string(thr, i); /* Rejects Symbols during coercion. */ } if (nargs == 0) { duk_push_hstring_empty(thr); duk_push_hstring_empty(thr); } else if (nargs == 1) { /* XXX: cover this with the generic >1 case? */ duk_push_hstring_empty(thr); } else { duk_insert(thr, 0); /* [ arg1 ... argN-1 body] -> [body arg1 ... argN-1] */ duk_push_string(thr, ","); duk_insert(thr, 1); duk_join(thr, nargs - 1); } /* [ body formals ], formals is comma separated list that needs to be parsed */ DUK_ASSERT_TOP(thr, 2); /* XXX: this placeholder is not always correct, but use for now. * It will fail in corner cases; see test-dev-func-cons-args.js. */ duk_push_string(thr, "function("); duk_dup_1(thr); duk_push_string(thr, "){"); duk_dup_0(thr); duk_push_string(thr, "}"); duk_concat(thr, 5); /* [ body formals source ] */ DUK_ASSERT_TOP(thr, 3); /* strictness is not inherited, intentional */ comp_flags = DUK_COMPILE_FUNCEXPR; duk_push_hstring_stridx(thr, DUK_STRIDX_COMPILE); /* XXX: copy from caller? */ /* XXX: ignored now */ h_sourcecode = duk_require_hstring(thr, -2); /* no symbol check needed; -2 is concat'd code */ duk_js_compile(thr, (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_sourcecode), (duk_size_t) DUK_HSTRING_GET_BYTELEN(h_sourcecode), comp_flags); /* Force .name to 'anonymous' (ES2015). */ duk_push_string(thr, "anonymous"); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_C); func = (duk_hcompfunc *) duk_known_hobject(thr, -1); DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) func)); DUK_ASSERT(DUK_HOBJECT_HAS_CONSTRUCTABLE((duk_hobject *) func)); /* [ body formals source template ] */ /* only outer_lex_env matters, as functions always get a new * variable declaration environment. */ outer_lex_env = thr->builtins[DUK_BIDX_GLOBAL_ENV]; outer_var_env = thr->builtins[DUK_BIDX_GLOBAL_ENV]; duk_js_push_closure(thr, func, outer_var_env, outer_lex_env, 1 /*add_auto_proto*/); /* [ body formals source template closure ] */ return 1; } #endif /* DUK_USE_FUNCTION_BUILTIN */ #if defined(DUK_USE_FUNCTION_BUILTIN) DUK_INTERNAL duk_ret_t duk_bi_function_prototype_to_string(duk_hthread *thr) { duk_tval *tv; /* * E5 Section 15.3.4.2 places few requirements on the output of * this function: the result is implementation dependent, must * follow FunctionDeclaration syntax (in particular, must have a * name even for anonymous functions or functions with empty name). * The output does NOT need to compile into anything useful. * * E6 Section 19.2.3.5 changes the requirements completely: the * result must either eval() to a functionally equivalent object * OR eval() to a SyntaxError. * * We opt for the SyntaxError approach for now, with a syntax that * mimics V8's native function syntax: * * 'function cos() { [native code] }' * * but extended with [ecmascript code], [bound code], and * [lightfunc code]. */ duk_push_this(thr); tv = DUK_GET_TVAL_NEGIDX(thr, -1); DUK_ASSERT(tv != NULL); if (DUK_TVAL_IS_OBJECT(tv)) { duk_hobject *obj = DUK_TVAL_GET_OBJECT(tv); const char *func_name; /* Function name: missing/undefined is mapped to empty string, * otherwise coerce to string. No handling for invalid identifier * characters or e.g. '{' in the function name. This doesn't * really matter as long as a SyntaxError results. Technically * if the name contained a suitable prefix followed by '//' it * might cause the result to parse without error. */ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_NAME); if (duk_is_undefined(thr, -1)) { func_name = ""; } else { func_name = duk_to_string(thr, -1); DUK_ASSERT(func_name != NULL); } if (DUK_HOBJECT_IS_COMPFUNC(obj)) { duk_push_sprintf(thr, "function %s() { [ecmascript code] }", (const char *) func_name); } else if (DUK_HOBJECT_IS_NATFUNC(obj)) { duk_push_sprintf(thr, "function %s() { [native code] }", (const char *) func_name); } else if (DUK_HOBJECT_IS_BOUNDFUNC(obj)) { duk_push_sprintf(thr, "function %s() { [bound code] }", (const char *) func_name); } else { goto type_error; } } else if (DUK_TVAL_IS_LIGHTFUNC(tv)) { duk_push_lightfunc_tostring(thr, tv); } else { goto type_error; } return 1; type_error: DUK_DCERROR_TYPE_INVALID_ARGS(thr); } #endif /* Always present because the native function pointer is needed in call * handling. */ DUK_INTERNAL duk_ret_t duk_bi_function_prototype_call(duk_hthread *thr) { /* .call() is dealt with in call handling by simulating its * effects so this function is actually never called. */ DUK_UNREF(thr); return DUK_RET_TYPE_ERROR; } DUK_INTERNAL duk_ret_t duk_bi_function_prototype_apply(duk_hthread *thr) { /* Like .call(), never actually called. */ DUK_UNREF(thr); return DUK_RET_TYPE_ERROR; } DUK_INTERNAL duk_ret_t duk_bi_reflect_apply(duk_hthread *thr) { /* Like .call(), never actually called. */ DUK_UNREF(thr); return DUK_RET_TYPE_ERROR; } DUK_INTERNAL duk_ret_t duk_bi_reflect_construct(duk_hthread *thr) { /* Like .call(), never actually called. */ DUK_UNREF(thr); return DUK_RET_TYPE_ERROR; } #if defined(DUK_USE_FUNCTION_BUILTIN) /* Create a bound function which points to a target function which may * be bound or non-bound. If the target is bound, the argument lists * and 'this' binding of the functions are merged and the resulting * function points directly to the non-bound target. */ DUK_INTERNAL duk_ret_t duk_bi_function_prototype_bind(duk_hthread *thr) { duk_hboundfunc *h_bound; duk_idx_t nargs; /* bound args, not counting 'this' binding */ duk_idx_t bound_nargs; duk_int_t bound_len; duk_tval *tv_prevbound; duk_idx_t n_prevbound; duk_tval *tv_res; duk_tval *tv_tmp; /* XXX: C API call, e.g. duk_push_bound_function(thr, target_idx, nargs); */ /* Vararg function, careful arg handling, e.g. thisArg may not * be present. */ nargs = duk_get_top(thr) - 1; /* actual args, not counting 'this' binding */ if (nargs < 0) { nargs++; duk_push_undefined(thr); } DUK_ASSERT(nargs >= 0); /* Limit 'nargs' for bound functions to guarantee arithmetic * below will never wrap. */ if (nargs > (duk_idx_t) DUK_HBOUNDFUNC_MAX_ARGS) { DUK_DCERROR_RANGE_INVALID_COUNT(thr); } duk_push_this(thr); duk_require_callable(thr, -1); /* [ thisArg arg1 ... argN func ] (thisArg+args == nargs+1 total) */ DUK_ASSERT_TOP(thr, nargs + 2); /* Create bound function object. */ h_bound = duk_push_hboundfunc(thr); DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(&h_bound->target)); DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(&h_bound->this_binding)); DUK_ASSERT(h_bound->args == NULL); DUK_ASSERT(h_bound->nargs == 0); DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) h_bound) == NULL); /* [ thisArg arg1 ... argN func boundFunc ] */ /* If the target is a bound function, argument lists must be * merged. The 'this' binding closest to the target function * wins because in call handling the 'this' gets replaced over * and over again until we call the non-bound function. */ tv_prevbound = NULL; n_prevbound = 0; tv_tmp = DUK_GET_TVAL_POSIDX(thr, 0); DUK_TVAL_SET_TVAL(&h_bound->this_binding, tv_tmp); tv_tmp = DUK_GET_TVAL_NEGIDX(thr, -2); DUK_TVAL_SET_TVAL(&h_bound->target, tv_tmp); if (DUK_TVAL_IS_OBJECT(tv_tmp)) { duk_hobject *h_target; duk_hobject *bound_proto; h_target = DUK_TVAL_GET_OBJECT(tv_tmp); DUK_ASSERT(DUK_HOBJECT_IS_CALLABLE(h_target)); /* Internal prototype must be copied from the target. * For lightfuncs Function.prototype is used and is already * in place. */ bound_proto = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_target); DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) h_bound, bound_proto); /* The 'strict' flag is copied to get the special [[Get]] of E5.1 * Section 15.3.5.4 to apply when a 'caller' value is a strict bound * function. Not sure if this is correct, because the specification * is a bit ambiguous on this point but it would make sense. */ /* Strictness is inherited from target. */ if (DUK_HOBJECT_HAS_STRICT(h_target)) { DUK_HOBJECT_SET_STRICT((duk_hobject *) h_bound); } if (DUK_HOBJECT_HAS_BOUNDFUNC(h_target)) { duk_hboundfunc *h_boundtarget; h_boundtarget = (duk_hboundfunc *) h_target; /* The final function should always be non-bound, unless * there's a bug in the internals. Assert for it. */ DUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(&h_boundtarget->target) || (DUK_TVAL_IS_OBJECT(&h_boundtarget->target) && DUK_HOBJECT_IS_CALLABLE(DUK_TVAL_GET_OBJECT(&h_boundtarget->target)) && !DUK_HOBJECT_IS_BOUNDFUNC(DUK_TVAL_GET_OBJECT(&h_boundtarget->target)))); DUK_TVAL_SET_TVAL(&h_bound->target, &h_boundtarget->target); DUK_TVAL_SET_TVAL(&h_bound->this_binding, &h_boundtarget->this_binding); tv_prevbound = h_boundtarget->args; n_prevbound = h_boundtarget->nargs; } } else { /* Lightfuncs are always strict. */ duk_hobject *bound_proto; DUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(tv_tmp)); DUK_HOBJECT_SET_STRICT((duk_hobject *) h_bound); bound_proto = thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]; DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) h_bound, bound_proto); } DUK_TVAL_INCREF(thr, &h_bound->target); /* old values undefined, no decref needed */ DUK_TVAL_INCREF(thr, &h_bound->this_binding); bound_nargs = n_prevbound + nargs; if (bound_nargs > (duk_idx_t) DUK_HBOUNDFUNC_MAX_ARGS) { DUK_DCERROR_RANGE_INVALID_COUNT(thr); } tv_res = (duk_tval *) DUK_ALLOC_CHECKED(thr, ((duk_size_t) bound_nargs) * sizeof(duk_tval)); DUK_ASSERT(tv_res != NULL); DUK_ASSERT(h_bound->args == NULL); DUK_ASSERT(h_bound->nargs == 0); h_bound->args = tv_res; h_bound->nargs = bound_nargs; DUK_ASSERT(n_prevbound >= 0); duk_copy_tvals_incref(thr, tv_res, tv_prevbound, (duk_size_t) n_prevbound); DUK_ASSERT(nargs >= 0); duk_copy_tvals_incref(thr, tv_res + n_prevbound, DUK_GET_TVAL_POSIDX(thr, 1), (duk_size_t) nargs); /* [ thisArg arg1 ... argN func boundFunc ] */ /* Bound function 'length' property is interesting. * For lightfuncs, simply read the virtual property. */ duk_get_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH); bound_len = duk_get_int(thr, -1); /* ES2015: no coercion */ if (bound_len < nargs) { bound_len = 0; } else { bound_len -= nargs; } if (sizeof(duk_int_t) > 4 && bound_len > (duk_int_t) DUK_UINT32_MAX) { bound_len = (duk_int_t) DUK_UINT32_MAX; } duk_pop(thr); DUK_ASSERT(bound_len >= 0); tv_tmp = thr->valstack_top++; DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv_tmp)); DUK_ASSERT(!DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv_tmp)); DUK_TVAL_SET_U32(tv_tmp, (duk_uint32_t) bound_len); /* in-place update, fastint */ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_C); /* attrs in E6 Section 9.2.4 */ /* XXX: could these be virtual? */ /* Caller and arguments must use the same thrower, [[ThrowTypeError]]. */ duk_xdef_prop_stridx_thrower(thr, -1, DUK_STRIDX_CALLER); duk_xdef_prop_stridx_thrower(thr, -1, DUK_STRIDX_LC_ARGUMENTS); /* Function name and fileName (non-standard). */ duk_push_string(thr, "bound "); /* ES2015 19.2.3.2. */ duk_get_prop_stridx(thr, -3, DUK_STRIDX_NAME); if (!duk_is_string_notsymbol(thr, -1)) { /* ES2015 has requirement to check that .name of target is a string * (also must check for Symbol); if not, targetName should be the * empty string. ES2015 19.2.3.2. */ duk_pop(thr); duk_push_hstring_empty(thr); } duk_concat(thr, 2); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_C); #if defined(DUK_USE_FUNC_FILENAME_PROPERTY) duk_get_prop_stridx_short(thr, -2, DUK_STRIDX_FILE_NAME); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_FILE_NAME, DUK_PROPDESC_FLAGS_C); #endif DUK_DDD(DUK_DDDPRINT("created bound function: %!iT", (duk_tval *) duk_get_tval(thr, -1))); return 1; } #endif /* DUK_USE_FUNCTION_BUILTIN */ /* %NativeFunctionPrototype% .length getter. */ DUK_INTERNAL duk_ret_t duk_bi_native_function_length(duk_hthread *thr) { duk_tval *tv; duk_hnatfunc *h; duk_int16_t func_nargs; tv = duk_get_borrowed_this_tval(thr); DUK_ASSERT(tv != NULL); if (DUK_TVAL_IS_OBJECT(tv)) { h = (duk_hnatfunc *) DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h != NULL); if (!DUK_HOBJECT_IS_NATFUNC((duk_hobject *) h)) { goto fail_type; } func_nargs = h->nargs; duk_push_int(thr, func_nargs == DUK_HNATFUNC_NARGS_VARARGS ? 0 : func_nargs); } else if (DUK_TVAL_IS_LIGHTFUNC(tv)) { duk_small_uint_t lf_flags; duk_small_uint_t lf_len; lf_flags = DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv); lf_len = DUK_LFUNC_FLAGS_GET_LENGTH(lf_flags); duk_push_uint(thr, lf_len); } else { goto fail_type; } return 1; fail_type: DUK_DCERROR_TYPE_INVALID_ARGS(thr); } /* %NativeFunctionPrototype% .name getter. */ DUK_INTERNAL duk_ret_t duk_bi_native_function_name(duk_hthread *thr) { duk_tval *tv; duk_hnatfunc *h; tv = duk_get_borrowed_this_tval(thr); DUK_ASSERT(tv != NULL); if (DUK_TVAL_IS_OBJECT(tv)) { h = (duk_hnatfunc *) DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h != NULL); if (!DUK_HOBJECT_IS_NATFUNC((duk_hobject *) h)) { goto fail_type; } #if 0 duk_push_hnatfunc_name(thr, h); #endif duk_push_hstring_empty(thr); } else if (DUK_TVAL_IS_LIGHTFUNC(tv)) { duk_push_lightfunc_name(thr, tv); } else { goto fail_type; } return 1; fail_type: DUK_DCERROR_TYPE_INVALID_ARGS(thr); } #line 1 "duk_bi_global.c" /* * Global object built-ins */ /* #include duk_internal.h -> already included */ /* * Encoding/decoding helpers */ /* XXX: Could add fast path (for each transform callback) with direct byte * lookups (no shifting) and no explicit check for x < 0x80 before table * lookup. */ /* Macros for creating and checking bitmasks for character encoding. * Bit number is a bit counterintuitive, but minimizes code size. */ #define DUK__MKBITS(a,b,c,d,e,f,g,h) ((duk_uint8_t) ( \ ((a) << 0) | ((b) << 1) | ((c) << 2) | ((d) << 3) | \ ((e) << 4) | ((f) << 5) | ((g) << 6) | ((h) << 7) \ )) #define DUK__CHECK_BITMASK(table,cp) ((table)[(cp) >> 3] & (1 << ((cp) & 0x07))) /* E5.1 Section 15.1.3.3: uriReserved + uriUnescaped + '#' */ DUK_LOCAL const duk_uint8_t duk__encode_uriunescaped_table[16] = { DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x00-0x0f */ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x10-0x1f */ DUK__MKBITS(0, 1, 0, 1, 1, 0, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), /* 0x20-0x2f */ DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 0, 1, 0, 1), /* 0x30-0x3f */ DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), /* 0x40-0x4f */ DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 0, 1), /* 0x50-0x5f */ DUK__MKBITS(0, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), /* 0x60-0x6f */ DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 1, 0), /* 0x70-0x7f */ }; /* E5.1 Section 15.1.3.4: uriUnescaped */ DUK_LOCAL const duk_uint8_t duk__encode_uricomponent_unescaped_table[16] = { DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x00-0x0f */ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x10-0x1f */ DUK__MKBITS(0, 1, 0, 0, 0, 0, 0, 1), DUK__MKBITS(1, 1, 1, 0, 0, 1, 1, 0), /* 0x20-0x2f */ DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 0, 0, 0, 0, 0, 0), /* 0x30-0x3f */ DUK__MKBITS(0, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), /* 0x40-0x4f */ DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 0, 1), /* 0x50-0x5f */ DUK__MKBITS(0, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), /* 0x60-0x6f */ DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 1, 0), /* 0x70-0x7f */ }; /* E5.1 Section 15.1.3.1: uriReserved + '#' */ DUK_LOCAL const duk_uint8_t duk__decode_uri_reserved_table[16] = { DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x00-0x0f */ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x10-0x1f */ DUK__MKBITS(0, 0, 0, 1, 1, 0, 1, 0), DUK__MKBITS(0, 0, 0, 1, 1, 0, 0, 1), /* 0x20-0x2f */ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 1, 1, 0, 1, 0, 1), /* 0x30-0x3f */ DUK__MKBITS(1, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x40-0x4f */ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x50-0x5f */ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x60-0x6f */ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x70-0x7f */ }; /* E5.1 Section 15.1.3.2: empty */ DUK_LOCAL const duk_uint8_t duk__decode_uri_component_reserved_table[16] = { DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x00-0x0f */ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x10-0x1f */ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x20-0x2f */ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x30-0x3f */ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x40-0x4f */ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x50-0x5f */ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x60-0x6f */ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x70-0x7f */ }; #if defined(DUK_USE_SECTION_B) /* E5.1 Section B.2.2, step 7. */ DUK_LOCAL const duk_uint8_t duk__escape_unescaped_table[16] = { DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x00-0x0f */ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x10-0x1f */ DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 1, 1, 0, 1, 1, 1), /* 0x20-0x2f */ DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 0, 0, 0, 0, 0, 0), /* 0x30-0x3f */ DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), /* 0x40-0x4f */ DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 0, 1), /* 0x50-0x5f */ DUK__MKBITS(0, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), /* 0x60-0x6f */ DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 0, 0) /* 0x70-0x7f */ }; #endif /* DUK_USE_SECTION_B */ typedef struct { duk_hthread *thr; duk_hstring *h_str; duk_bufwriter_ctx bw; const duk_uint8_t *p; const duk_uint8_t *p_start; const duk_uint8_t *p_end; } duk__transform_context; typedef void (*duk__transform_callback)(duk__transform_context *tfm_ctx, const void *udata, duk_codepoint_t cp); /* XXX: refactor and share with other code */ DUK_LOCAL duk_small_int_t duk__decode_hex_escape(const duk_uint8_t *p, duk_small_int_t n) { duk_small_int_t ch; duk_small_int_t t = 0; while (n > 0) { t = t * 16; ch = (duk_small_int_t) duk_hex_dectab[*p++]; if (DUK_LIKELY(ch >= 0)) { t += ch; } else { return -1; } n--; } return t; } DUK_LOCAL int duk__transform_helper(duk_hthread *thr, duk__transform_callback callback, const void *udata) { duk__transform_context tfm_ctx_alloc; duk__transform_context *tfm_ctx = &tfm_ctx_alloc; duk_codepoint_t cp; tfm_ctx->thr = thr; tfm_ctx->h_str = duk_to_hstring(thr, 0); DUK_ASSERT(tfm_ctx->h_str != NULL); DUK_BW_INIT_PUSHBUF(thr, &tfm_ctx->bw, DUK_HSTRING_GET_BYTELEN(tfm_ctx->h_str)); /* initial size guess */ tfm_ctx->p_start = DUK_HSTRING_GET_DATA(tfm_ctx->h_str); tfm_ctx->p_end = tfm_ctx->p_start + DUK_HSTRING_GET_BYTELEN(tfm_ctx->h_str); tfm_ctx->p = tfm_ctx->p_start; while (tfm_ctx->p < tfm_ctx->p_end) { cp = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(thr, &tfm_ctx->p, tfm_ctx->p_start, tfm_ctx->p_end); callback(tfm_ctx, udata, cp); } DUK_BW_COMPACT(thr, &tfm_ctx->bw); (void) duk_buffer_to_string(thr, -1); /* Safe if transform is safe. */ return 1; } DUK_LOCAL void duk__transform_callback_encode_uri(duk__transform_context *tfm_ctx, const void *udata, duk_codepoint_t cp) { duk_uint8_t xutf8_buf[DUK_UNICODE_MAX_XUTF8_LENGTH]; duk_small_int_t len; duk_codepoint_t cp1, cp2; duk_small_int_t i, t; const duk_uint8_t *unescaped_table = (const duk_uint8_t *) udata; /* UTF-8 encoded bytes escaped as %xx%xx%xx... -> 3 * nbytes. * Codepoint range is restricted so this is a slightly too large * but doesn't matter. */ DUK_BW_ENSURE(tfm_ctx->thr, &tfm_ctx->bw, 3 * DUK_UNICODE_MAX_XUTF8_LENGTH); if (cp < 0) { goto uri_error; } else if ((cp < 0x80L) && DUK__CHECK_BITMASK(unescaped_table, cp)) { DUK_BW_WRITE_RAW_U8(tfm_ctx->thr, &tfm_ctx->bw, (duk_uint8_t) cp); return; } else if (cp >= 0xdc00L && cp <= 0xdfffL) { goto uri_error; } else if (cp >= 0xd800L && cp <= 0xdbffL) { /* Needs lookahead */ if (duk_unicode_decode_xutf8(tfm_ctx->thr, &tfm_ctx->p, tfm_ctx->p_start, tfm_ctx->p_end, (duk_ucodepoint_t *) &cp2) == 0) { goto uri_error; } if (!(cp2 >= 0xdc00L && cp2 <= 0xdfffL)) { goto uri_error; } cp1 = cp; cp = (duk_codepoint_t) (((cp1 - 0xd800L) << 10) + (cp2 - 0xdc00L) + 0x10000L); } else if (cp > 0x10ffffL) { /* Although we can allow non-BMP characters (they'll decode * back into surrogate pairs), we don't allow extended UTF-8 * characters; they would encode to URIs which won't decode * back because of strict UTF-8 checks in URI decoding. * (However, we could just as well allow them here.) */ goto uri_error; } else { /* Non-BMP characters within valid UTF-8 range: encode as is. * They'll decode back into surrogate pairs if the escaped * output is decoded. */ ; } len = duk_unicode_encode_xutf8((duk_ucodepoint_t) cp, xutf8_buf); for (i = 0; i < len; i++) { t = (duk_small_int_t) xutf8_buf[i]; DUK_BW_WRITE_RAW_U8_3(tfm_ctx->thr, &tfm_ctx->bw, DUK_ASC_PERCENT, (duk_uint8_t) duk_uc_nybbles[t >> 4], (duk_uint8_t) duk_uc_nybbles[t & 0x0f]); } return; uri_error: DUK_ERROR_URI(tfm_ctx->thr, DUK_STR_INVALID_INPUT); } DUK_LOCAL void duk__transform_callback_decode_uri(duk__transform_context *tfm_ctx, const void *udata, duk_codepoint_t cp) { const duk_uint8_t *reserved_table = (const duk_uint8_t *) udata; duk_small_uint_t utf8_blen; duk_codepoint_t min_cp; duk_small_int_t t; /* must be signed */ duk_small_uint_t i; /* Maximum write size: XUTF8 path writes max DUK_UNICODE_MAX_XUTF8_LENGTH, * percent escape path writes max two times CESU-8 encoded BMP length. */ DUK_BW_ENSURE(tfm_ctx->thr, &tfm_ctx->bw, (DUK_UNICODE_MAX_XUTF8_LENGTH >= 2 * DUK_UNICODE_MAX_CESU8_BMP_LENGTH ? DUK_UNICODE_MAX_XUTF8_LENGTH : DUK_UNICODE_MAX_CESU8_BMP_LENGTH)); if (cp == (duk_codepoint_t) '%') { const duk_uint8_t *p = tfm_ctx->p; duk_size_t left = (duk_size_t) (tfm_ctx->p_end - p); /* bytes left */ DUK_DDD(DUK_DDDPRINT("percent encoding, left=%ld", (long) left)); if (left < 2) { goto uri_error; } t = duk__decode_hex_escape(p, 2); DUK_DDD(DUK_DDDPRINT("first byte: %ld", (long) t)); if (t < 0) { goto uri_error; } if (t < 0x80) { if (DUK__CHECK_BITMASK(reserved_table, t)) { /* decode '%xx' to '%xx' if decoded char in reserved set */ DUK_ASSERT(tfm_ctx->p - 1 >= tfm_ctx->p_start); DUK_BW_WRITE_RAW_U8_3(tfm_ctx->thr, &tfm_ctx->bw, DUK_ASC_PERCENT, p[0], p[1]); } else { DUK_BW_WRITE_RAW_U8(tfm_ctx->thr, &tfm_ctx->bw, (duk_uint8_t) t); } tfm_ctx->p += 2; return; } /* Decode UTF-8 codepoint from a sequence of hex escapes. The * first byte of the sequence has been decoded to 't'. * * Note that UTF-8 validation must be strict according to the * specification: E5.1 Section 15.1.3, decode algorithm step * 4.d.vii.8. URIError from non-shortest encodings is also * specifically noted in the spec. */ DUK_ASSERT(t >= 0x80); if (t < 0xc0) { /* continuation byte */ goto uri_error; } else if (t < 0xe0) { /* 110x xxxx; 2 bytes */ utf8_blen = 2; min_cp = 0x80L; cp = t & 0x1f; } else if (t < 0xf0) { /* 1110 xxxx; 3 bytes */ utf8_blen = 3; min_cp = 0x800L; cp = t & 0x0f; } else if (t < 0xf8) { /* 1111 0xxx; 4 bytes */ utf8_blen = 4; min_cp = 0x10000L; cp = t & 0x07; } else { /* extended utf-8 not allowed for URIs */ goto uri_error; } if (left < utf8_blen * 3 - 1) { /* '%xx%xx...%xx', p points to char after first '%' */ goto uri_error; } p += 3; for (i = 1; i < utf8_blen; i++) { /* p points to digit part ('%xy', p points to 'x') */ t = duk__decode_hex_escape(p, 2); DUK_DDD(DUK_DDDPRINT("i=%ld utf8_blen=%ld cp=%ld t=0x%02lx", (long) i, (long) utf8_blen, (long) cp, (unsigned long) t)); if (t < 0) { goto uri_error; } if ((t & 0xc0) != 0x80) { goto uri_error; } cp = (cp << 6) + (t & 0x3f); p += 3; } p--; /* p overshoots */ tfm_ctx->p = p; DUK_DDD(DUK_DDDPRINT("final cp=%ld, min_cp=%ld", (long) cp, (long) min_cp)); if (cp < min_cp || cp > 0x10ffffL || (cp >= 0xd800L && cp <= 0xdfffL)) { goto uri_error; } /* The E5.1 algorithm checks whether or not a decoded codepoint * is below 0x80 and perhaps may be in the "reserved" set. * This seems pointless because the single byte UTF-8 case is * handled separately, and non-shortest encodings are rejected. * So, 'cp' cannot be below 0x80 here, and thus cannot be in * the reserved set. */ /* utf-8 validation ensures these */ DUK_ASSERT(cp >= 0x80L && cp <= 0x10ffffL); if (cp >= 0x10000L) { cp -= 0x10000L; DUK_ASSERT(cp < 0x100000L); DUK_BW_WRITE_RAW_XUTF8(tfm_ctx->thr, &tfm_ctx->bw, ((cp >> 10) + 0xd800L)); DUK_BW_WRITE_RAW_XUTF8(tfm_ctx->thr, &tfm_ctx->bw, ((cp & 0x03ffL) + 0xdc00L)); } else { DUK_BW_WRITE_RAW_XUTF8(tfm_ctx->thr, &tfm_ctx->bw, cp); } } else { DUK_BW_WRITE_RAW_XUTF8(tfm_ctx->thr, &tfm_ctx->bw, cp); } return; uri_error: DUK_ERROR_URI(tfm_ctx->thr, DUK_STR_INVALID_INPUT); } #if defined(DUK_USE_SECTION_B) DUK_LOCAL void duk__transform_callback_escape(duk__transform_context *tfm_ctx, const void *udata, duk_codepoint_t cp) { DUK_UNREF(udata); DUK_BW_ENSURE(tfm_ctx->thr, &tfm_ctx->bw, 6); if (cp < 0) { goto esc_error; } else if ((cp < 0x80L) && DUK__CHECK_BITMASK(duk__escape_unescaped_table, cp)) { DUK_BW_WRITE_RAW_U8(tfm_ctx->thr, &tfm_ctx->bw, (duk_uint8_t) cp); } else if (cp < 0x100L) { DUK_BW_WRITE_RAW_U8_3(tfm_ctx->thr, &tfm_ctx->bw, (duk_uint8_t) DUK_ASC_PERCENT, (duk_uint8_t) duk_uc_nybbles[cp >> 4], (duk_uint8_t) duk_uc_nybbles[cp & 0x0f]); } else if (cp < 0x10000L) { DUK_BW_WRITE_RAW_U8_6(tfm_ctx->thr, &tfm_ctx->bw, (duk_uint8_t) DUK_ASC_PERCENT, (duk_uint8_t) DUK_ASC_LC_U, (duk_uint8_t) duk_uc_nybbles[cp >> 12], (duk_uint8_t) duk_uc_nybbles[(cp >> 8) & 0x0f], (duk_uint8_t) duk_uc_nybbles[(cp >> 4) & 0x0f], (duk_uint8_t) duk_uc_nybbles[cp & 0x0f]); } else { /* Characters outside BMP cannot be escape()'d. We could * encode them as surrogate pairs (for codepoints inside * valid UTF-8 range, but not extended UTF-8). Because * escape() and unescape() are legacy functions, we don't. */ goto esc_error; } return; esc_error: DUK_ERROR_TYPE(tfm_ctx->thr, DUK_STR_INVALID_INPUT); } DUK_LOCAL void duk__transform_callback_unescape(duk__transform_context *tfm_ctx, const void *udata, duk_codepoint_t cp) { duk_small_int_t t; DUK_UNREF(udata); if (cp == (duk_codepoint_t) '%') { const duk_uint8_t *p = tfm_ctx->p; duk_size_t left = (duk_size_t) (tfm_ctx->p_end - p); /* bytes left */ if (left >= 5 && p[0] == 'u' && ((t = duk__decode_hex_escape(p + 1, 4)) >= 0)) { cp = (duk_codepoint_t) t; tfm_ctx->p += 5; } else if (left >= 2 && ((t = duk__decode_hex_escape(p, 2)) >= 0)) { cp = (duk_codepoint_t) t; tfm_ctx->p += 2; } } DUK_BW_WRITE_ENSURE_XUTF8(tfm_ctx->thr, &tfm_ctx->bw, cp); } #endif /* DUK_USE_SECTION_B */ /* * Eval * * Eval needs to handle both a "direct eval" and an "indirect eval". * Direct eval handling needs access to the caller's activation so that its * lexical environment can be accessed. A direct eval is only possible from * Ecmascript code; an indirect eval call is possible also from C code. * When an indirect eval call is made from C code, there may not be a * calling activation at all which needs careful handling. */ DUK_INTERNAL duk_ret_t duk_bi_global_object_eval(duk_hthread *thr) { duk_hstring *h; duk_activation *act_caller; duk_activation *act_eval; duk_hcompfunc *func; duk_hobject *outer_lex_env; duk_hobject *outer_var_env; duk_bool_t this_to_global = 1; duk_small_uint_t comp_flags; duk_int_t level = -2; duk_small_uint_t call_flags; DUK_ASSERT(duk_get_top(thr) == 1 || duk_get_top(thr) == 2); /* 2 when called by debugger */ DUK_ASSERT(thr->callstack_top >= 1); /* at least this function exists */ DUK_ASSERT(thr->callstack_curr != NULL); DUK_ASSERT((thr->callstack_curr->flags & DUK_ACT_FLAG_DIRECT_EVAL) == 0 || /* indirect eval */ (thr->callstack_top >= 2)); /* if direct eval, calling activation must exist */ /* * callstack_top - 1 --> this function * callstack_top - 2 --> caller (may not exist) * * If called directly from C, callstack_top might be 1. If calling * activation doesn't exist, call must be indirect. */ h = duk_get_hstring_notsymbol(thr, 0); if (!h) { /* Symbol must be returned as is, like any non-string values. */ return 1; /* return arg as-is */ } #if defined(DUK_USE_DEBUGGER_SUPPORT) /* NOTE: level is used only by the debugger and should never be present * for an Ecmascript eval(). */ DUK_ASSERT(level == -2); /* by default, use caller's environment */ if (duk_get_top(thr) >= 2 && duk_is_number(thr, 1)) { level = duk_get_int(thr, 1); } DUK_ASSERT(level <= -2); /* This is guaranteed by debugger code. */ #endif /* [ source ] */ comp_flags = DUK_COMPILE_EVAL; act_eval = thr->callstack_curr; /* this function */ DUK_ASSERT(act_eval != NULL); act_caller = duk_hthread_get_activation_for_level(thr, level); if (act_caller != NULL) { /* Have a calling activation, check for direct eval (otherwise * assume indirect eval. */ if ((act_caller->flags & DUK_ACT_FLAG_STRICT) && (act_eval->flags & DUK_ACT_FLAG_DIRECT_EVAL)) { /* Only direct eval inherits strictness from calling code * (E5.1 Section 10.1.1). */ comp_flags |= DUK_COMPILE_STRICT; } } else { DUK_ASSERT((act_eval->flags & DUK_ACT_FLAG_DIRECT_EVAL) == 0); } duk_push_hstring_stridx(thr, DUK_STRIDX_INPUT); /* XXX: copy from caller? */ duk_js_compile(thr, (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h), (duk_size_t) DUK_HSTRING_GET_BYTELEN(h), comp_flags); func = (duk_hcompfunc *) duk_known_hobject(thr, -1); DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) func)); /* [ source template ] */ /* E5 Section 10.4.2 */ if (act_eval->flags & DUK_ACT_FLAG_DIRECT_EVAL) { DUK_ASSERT(thr->callstack_top >= 2); DUK_ASSERT(act_caller != NULL); if (act_caller->lex_env == NULL) { DUK_ASSERT(act_caller->var_env == NULL); DUK_DDD(DUK_DDDPRINT("delayed environment initialization")); /* this may have side effects, so re-lookup act */ duk_js_init_activation_environment_records_delayed(thr, act_caller); } DUK_ASSERT(act_caller->lex_env != NULL); DUK_ASSERT(act_caller->var_env != NULL); this_to_global = 0; if (DUK_HOBJECT_HAS_STRICT((duk_hobject *) func)) { duk_hdecenv *new_env; duk_hobject *act_lex_env; DUK_DDD(DUK_DDDPRINT("direct eval call to a strict function -> " "var_env and lex_env to a fresh env, " "this_binding to caller's this_binding")); act_lex_env = act_caller->lex_env; new_env = duk_hdecenv_alloc(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DECENV)); DUK_ASSERT(new_env != NULL); duk_push_hobject(thr, (duk_hobject *) new_env); DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) new_env) == NULL); DUK_HOBJECT_SET_PROTOTYPE(thr->heap, (duk_hobject *) new_env, act_lex_env); DUK_HOBJECT_INCREF_ALLOWNULL(thr, act_lex_env); DUK_DDD(DUK_DDDPRINT("new_env allocated: %!iO", (duk_heaphdr *) new_env)); outer_lex_env = (duk_hobject *) new_env; outer_var_env = (duk_hobject *) new_env; duk_insert(thr, 0); /* stash to bottom of value stack to keep new_env reachable for duration of eval */ /* compiler's responsibility */ DUK_ASSERT(DUK_HOBJECT_HAS_NEWENV((duk_hobject *) func)); } else { DUK_DDD(DUK_DDDPRINT("direct eval call to a non-strict function -> " "var_env and lex_env to caller's envs, " "this_binding to caller's this_binding")); outer_lex_env = act_caller->lex_env; outer_var_env = act_caller->var_env; /* compiler's responsibility */ DUK_ASSERT(!DUK_HOBJECT_HAS_NEWENV((duk_hobject *) func)); } } else { DUK_DDD(DUK_DDDPRINT("indirect eval call -> var_env and lex_env to " "global object, this_binding to global object")); this_to_global = 1; outer_lex_env = thr->builtins[DUK_BIDX_GLOBAL_ENV]; outer_var_env = thr->builtins[DUK_BIDX_GLOBAL_ENV]; } /* Eval code doesn't need an automatic .prototype object. */ duk_js_push_closure(thr, func, outer_var_env, outer_lex_env, 0 /*add_auto_proto*/); /* [ env? source template closure ] */ if (this_to_global) { DUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL] != NULL); duk_push_hobject_bidx(thr, DUK_BIDX_GLOBAL); } else { duk_tval *tv; DUK_ASSERT(thr->callstack_top >= 2); DUK_ASSERT(act_caller != NULL); tv = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + act_caller->bottom_byteoff - sizeof(duk_tval)); /* this is just beneath bottom */ DUK_ASSERT(tv >= thr->valstack); duk_push_tval(thr, tv); } DUK_DDD(DUK_DDDPRINT("eval -> lex_env=%!iO, var_env=%!iO, this_binding=%!T", (duk_heaphdr *) outer_lex_env, (duk_heaphdr *) outer_var_env, duk_get_tval(thr, -1))); /* [ env? source template closure this ] */ call_flags = 0; if (act_eval->flags & DUK_ACT_FLAG_DIRECT_EVAL) { /* Set DIRECT_EVAL flag for the call; it's not strictly * needed for the 'inner' eval call (the eval body) but * current new.target implementation expects to find it * so it can traverse direct eval chains up to the real * calling function. */ call_flags |= DUK_CALL_FLAG_DIRECT_EVAL; } duk_handle_call_unprotected_nargs(thr, 0, call_flags); /* [ env? source template result ] */ return 1; } /* * Parsing of ints and floats */ #if defined(DUK_USE_GLOBAL_BUILTIN) DUK_INTERNAL duk_ret_t duk_bi_global_object_parse_int(duk_hthread *thr) { duk_int32_t radix; duk_small_uint_t s2n_flags; DUK_ASSERT_TOP(thr, 2); duk_to_string(thr, 0); /* Reject symbols. */ radix = duk_to_int32(thr, 1); /* While parseInt() recognizes 0xdeadbeef, it doesn't recognize * ES2015 0o123 or 0b10001. */ s2n_flags = DUK_S2N_FLAG_TRIM_WHITE | DUK_S2N_FLAG_ALLOW_GARBAGE | DUK_S2N_FLAG_ALLOW_PLUS | DUK_S2N_FLAG_ALLOW_MINUS | DUK_S2N_FLAG_ALLOW_LEADING_ZERO | DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT; /* Specification stripPrefix maps to DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT. * * Don't autodetect octals (from leading zeroes), require user code to * provide an explicit radix 8 for parsing octal. See write-up from Mozilla: * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt#ECMAScript_5_Removes_Octal_Interpretation */ if (radix != 0) { if (radix < 2 || radix > 36) { goto ret_nan; } if (radix != 16) { s2n_flags &= ~DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT; } } else { radix = 10; } duk_dup_0(thr); duk_numconv_parse(thr, (duk_small_int_t) radix, s2n_flags); return 1; ret_nan: duk_push_nan(thr); return 1; } #endif /* DUK_USE_GLOBAL_BUILTIN */ #if defined(DUK_USE_GLOBAL_BUILTIN) DUK_INTERNAL duk_ret_t duk_bi_global_object_parse_float(duk_hthread *thr) { duk_small_uint_t s2n_flags; DUK_ASSERT_TOP(thr, 1); duk_to_string(thr, 0); /* Reject symbols. */ /* XXX: check flags */ s2n_flags = DUK_S2N_FLAG_TRIM_WHITE | DUK_S2N_FLAG_ALLOW_EXP | DUK_S2N_FLAG_ALLOW_GARBAGE | DUK_S2N_FLAG_ALLOW_PLUS | DUK_S2N_FLAG_ALLOW_MINUS | DUK_S2N_FLAG_ALLOW_INF | DUK_S2N_FLAG_ALLOW_FRAC | DUK_S2N_FLAG_ALLOW_NAKED_FRAC | DUK_S2N_FLAG_ALLOW_EMPTY_FRAC | DUK_S2N_FLAG_ALLOW_LEADING_ZERO; duk_numconv_parse(thr, 10 /*radix*/, s2n_flags); return 1; } #endif /* DUK_USE_GLOBAL_BUILTIN */ /* * Number checkers */ #if defined(DUK_USE_GLOBAL_BUILTIN) DUK_INTERNAL duk_ret_t duk_bi_global_object_is_nan(duk_hthread *thr) { duk_double_t d = duk_to_number(thr, 0); duk_push_boolean(thr, (duk_bool_t) DUK_ISNAN(d)); return 1; } #endif /* DUK_USE_GLOBAL_BUILTIN */ #if defined(DUK_USE_GLOBAL_BUILTIN) DUK_INTERNAL duk_ret_t duk_bi_global_object_is_finite(duk_hthread *thr) { duk_double_t d = duk_to_number(thr, 0); duk_push_boolean(thr, (duk_bool_t) DUK_ISFINITE(d)); return 1; } #endif /* DUK_USE_GLOBAL_BUILTIN */ /* * URI handling */ #if defined(DUK_USE_GLOBAL_BUILTIN) DUK_INTERNAL duk_ret_t duk_bi_global_object_decode_uri(duk_hthread *thr) { return duk__transform_helper(thr, duk__transform_callback_decode_uri, (const void *) duk__decode_uri_reserved_table); } DUK_INTERNAL duk_ret_t duk_bi_global_object_decode_uri_component(duk_hthread *thr) { return duk__transform_helper(thr, duk__transform_callback_decode_uri, (const void *) duk__decode_uri_component_reserved_table); } DUK_INTERNAL duk_ret_t duk_bi_global_object_encode_uri(duk_hthread *thr) { return duk__transform_helper(thr, duk__transform_callback_encode_uri, (const void *) duk__encode_uriunescaped_table); } DUK_INTERNAL duk_ret_t duk_bi_global_object_encode_uri_component(duk_hthread *thr) { return duk__transform_helper(thr, duk__transform_callback_encode_uri, (const void *) duk__encode_uricomponent_unescaped_table); } #if defined(DUK_USE_SECTION_B) DUK_INTERNAL duk_ret_t duk_bi_global_object_escape(duk_hthread *thr) { return duk__transform_helper(thr, duk__transform_callback_escape, (const void *) NULL); } DUK_INTERNAL duk_ret_t duk_bi_global_object_unescape(duk_hthread *thr) { return duk__transform_helper(thr, duk__transform_callback_unescape, (const void *) NULL); } #endif /* DUK_USE_SECTION_B */ #endif /* DUK_USE_GLOBAL_BUILTIN */ /* automatic undefs */ #undef DUK__CHECK_BITMASK #undef DUK__MKBITS #line 1 "duk_bi_json.c" /* * JSON built-ins. * * See doc/json.rst. * * Codepoints are handled as duk_uint_fast32_t to ensure that the full * unsigned 32-bit range is supported. This matters to e.g. JX. * * Input parsing doesn't do an explicit end-of-input check at all. This is * safe: input string data is always NUL-terminated (0x00) and valid JSON * inputs never contain plain NUL characters, so that as long as syntax checks * are correct, we'll never read past the NUL. This approach reduces code size * and improves parsing performance, but it's critical that syntax checks are * indeed correct! */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_JSON_SUPPORT) /* * Local defines and forward declarations. */ #define DUK__JSON_DECSTR_BUFSIZE 128 #define DUK__JSON_DECSTR_CHUNKSIZE 64 #define DUK__JSON_ENCSTR_CHUNKSIZE 64 #define DUK__JSON_STRINGIFY_BUFSIZE 128 #define DUK__JSON_MAX_ESC_LEN 10 /* '\Udeadbeef' */ DUK_LOCAL_DECL void duk__dec_syntax_error(duk_json_dec_ctx *js_ctx); DUK_LOCAL_DECL void duk__dec_eat_white(duk_json_dec_ctx *js_ctx); #if defined(DUK_USE_JX) DUK_LOCAL_DECL duk_uint8_t duk__dec_peek(duk_json_dec_ctx *js_ctx); #endif DUK_LOCAL_DECL duk_uint8_t duk__dec_get(duk_json_dec_ctx *js_ctx); DUK_LOCAL_DECL duk_uint8_t duk__dec_get_nonwhite(duk_json_dec_ctx *js_ctx); DUK_LOCAL_DECL duk_uint_fast32_t duk__dec_decode_hex_escape(duk_json_dec_ctx *js_ctx, duk_small_uint_t n); DUK_LOCAL_DECL void duk__dec_req_stridx(duk_json_dec_ctx *js_ctx, duk_small_uint_t stridx); DUK_LOCAL_DECL void duk__dec_string(duk_json_dec_ctx *js_ctx); #if defined(DUK_USE_JX) DUK_LOCAL_DECL void duk__dec_plain_string(duk_json_dec_ctx *js_ctx); DUK_LOCAL_DECL void duk__dec_pointer(duk_json_dec_ctx *js_ctx); DUK_LOCAL_DECL void duk__dec_buffer(duk_json_dec_ctx *js_ctx); #endif DUK_LOCAL_DECL void duk__dec_number(duk_json_dec_ctx *js_ctx); DUK_LOCAL_DECL void duk__dec_objarr_entry(duk_json_dec_ctx *js_ctx); DUK_LOCAL_DECL void duk__dec_objarr_exit(duk_json_dec_ctx *js_ctx); DUK_LOCAL_DECL void duk__dec_object(duk_json_dec_ctx *js_ctx); DUK_LOCAL_DECL void duk__dec_array(duk_json_dec_ctx *js_ctx); DUK_LOCAL_DECL void duk__dec_value(duk_json_dec_ctx *js_ctx); DUK_LOCAL_DECL void duk__dec_reviver_walk(duk_json_dec_ctx *js_ctx); DUK_LOCAL_DECL void duk__emit_1(duk_json_enc_ctx *js_ctx, duk_uint_fast8_t ch); DUK_LOCAL_DECL void duk__emit_2(duk_json_enc_ctx *js_ctx, duk_uint_fast8_t ch1, duk_uint_fast8_t ch2); DUK_LOCAL_DECL void duk__unemit_1(duk_json_enc_ctx *js_ctx); DUK_LOCAL_DECL void duk__emit_hstring(duk_json_enc_ctx *js_ctx, duk_hstring *h); #if defined(DUK_USE_FASTINT) DUK_LOCAL_DECL void duk__emit_cstring(duk_json_enc_ctx *js_ctx, const char *p); #endif DUK_LOCAL_DECL void duk__emit_stridx(duk_json_enc_ctx *js_ctx, duk_small_uint_t stridx); DUK_LOCAL_DECL duk_uint8_t *duk__emit_esc_auto_fast(duk_json_enc_ctx *js_ctx, duk_uint_fast32_t cp, duk_uint8_t *q); DUK_LOCAL_DECL void duk__enc_key_autoquote(duk_json_enc_ctx *js_ctx, duk_hstring *k); DUK_LOCAL_DECL void duk__enc_quote_string(duk_json_enc_ctx *js_ctx, duk_hstring *h_str); DUK_LOCAL_DECL void duk__enc_objarr_entry(duk_json_enc_ctx *js_ctx, duk_idx_t *entry_top); DUK_LOCAL_DECL void duk__enc_objarr_exit(duk_json_enc_ctx *js_ctx, duk_idx_t *entry_top); DUK_LOCAL_DECL void duk__enc_object(duk_json_enc_ctx *js_ctx); DUK_LOCAL_DECL void duk__enc_array(duk_json_enc_ctx *js_ctx); DUK_LOCAL_DECL duk_bool_t duk__enc_value(duk_json_enc_ctx *js_ctx, duk_idx_t idx_holder); DUK_LOCAL_DECL duk_bool_t duk__enc_allow_into_proplist(duk_tval *tv); DUK_LOCAL_DECL void duk__enc_double(duk_json_enc_ctx *js_ctx); #if defined(DUK_USE_FASTINT) DUK_LOCAL_DECL void duk__enc_fastint_tval(duk_json_enc_ctx *js_ctx, duk_tval *tv); #endif #if defined(DUK_USE_JX) || defined(DUK_USE_JC) DUK_LOCAL_DECL void duk__enc_buffer_jx_jc(duk_json_enc_ctx *js_ctx, duk_hbuffer *h); DUK_LOCAL_DECL void duk__enc_pointer(duk_json_enc_ctx *js_ctx, void *ptr); #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_LOCAL_DECL void duk__enc_bufobj(duk_json_enc_ctx *js_ctx, duk_hbufobj *h_bufobj); #endif #endif #if defined(DUK_USE_JSON_STRINGIFY_FASTPATH) DUK_LOCAL_DECL void duk__enc_buffer_json_fastpath(duk_json_enc_ctx *js_ctx, duk_hbuffer *h); #endif DUK_LOCAL_DECL void duk__enc_newline_indent(duk_json_enc_ctx *js_ctx, duk_uint_t depth); /* * Helper tables */ #if defined(DUK_USE_JSON_QUOTESTRING_FASTPATH) DUK_LOCAL const duk_uint8_t duk__json_quotestr_lookup[256] = { /* 0x00 ... 0x7f: as is * 0x80: escape generically * 0x81: slow path * 0xa0 ... 0xff: backslash + one char */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xe2, 0xf4, 0xee, 0x80, 0xe6, 0xf2, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x20, 0x21, 0xa2, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0xdc, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81 }; #else /* DUK_USE_JSON_QUOTESTRING_FASTPATH */ DUK_LOCAL const duk_uint8_t duk__json_quotestr_esc[14] = { DUK_ASC_NUL, DUK_ASC_NUL, DUK_ASC_NUL, DUK_ASC_NUL, DUK_ASC_NUL, DUK_ASC_NUL, DUK_ASC_NUL, DUK_ASC_NUL, DUK_ASC_LC_B, DUK_ASC_LC_T, DUK_ASC_LC_N, DUK_ASC_NUL, DUK_ASC_LC_F, DUK_ASC_LC_R }; #endif /* DUK_USE_JSON_QUOTESTRING_FASTPATH */ #if defined(DUK_USE_JSON_DECSTRING_FASTPATH) DUK_LOCAL const duk_uint8_t duk__json_decstr_lookup[256] = { /* 0x00: slow path * other: as is */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x21, 0x00, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x00, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }; #endif /* DUK_USE_JSON_DECSTRING_FASTPATH */ #if defined(DUK_USE_JSON_EATWHITE_FASTPATH) DUK_LOCAL const duk_uint8_t duk__json_eatwhite_lookup[256] = { /* 0x00: finish (non-white) * 0x01: continue */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; #endif /* DUK_USE_JSON_EATWHITE_FASTPATH */ #if defined(DUK_USE_JSON_DECNUMBER_FASTPATH) DUK_LOCAL const duk_uint8_t duk__json_decnumber_lookup[256] = { /* 0x00: finish (not part of number) * 0x01: continue */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; #endif /* DUK_USE_JSON_DECNUMBER_FASTPATH */ /* * Parsing implementation. * * JSON lexer is now separate from duk_lexer.c because there are numerous * small differences making it difficult to share the lexer. * * The parser here works with raw bytes directly; this works because all * JSON delimiters are ASCII characters. Invalid xUTF-8 encoded values * inside strings will be passed on without normalization; this is not a * compliance concern because compliant inputs will always be valid * CESU-8 encodings. */ DUK_LOCAL void duk__dec_syntax_error(duk_json_dec_ctx *js_ctx) { /* Shared handler to minimize parser size. Cause will be * hidden, unfortunately, but we'll have an offset which * is often quite enough. */ DUK_ERROR_FMT1(js_ctx->thr, DUK_ERR_SYNTAX_ERROR, DUK_STR_FMT_INVALID_JSON, (long) (js_ctx->p - js_ctx->p_start)); } DUK_LOCAL void duk__dec_eat_white(duk_json_dec_ctx *js_ctx) { const duk_uint8_t *p; duk_uint8_t t; p = js_ctx->p; for (;;) { DUK_ASSERT(p <= js_ctx->p_end); t = *p; #if defined(DUK_USE_JSON_EATWHITE_FASTPATH) /* This fast path is pretty marginal in practice. * XXX: candidate for removal. */ DUK_ASSERT(duk__json_eatwhite_lookup[0x00] == 0x00); /* end-of-input breaks */ if (duk__json_eatwhite_lookup[t] == 0) { break; } #else /* DUK_USE_JSON_EATWHITE_FASTPATH */ if (!(t == 0x20 || t == 0x0a || t == 0x0d || t == 0x09)) { /* NUL also comes here. Comparison order matters, 0x20 * is most common whitespace. */ break; } #endif /* DUK_USE_JSON_EATWHITE_FASTPATH */ p++; } js_ctx->p = p; } #if defined(DUK_USE_JX) DUK_LOCAL duk_uint8_t duk__dec_peek(duk_json_dec_ctx *js_ctx) { DUK_ASSERT(js_ctx->p <= js_ctx->p_end); return *js_ctx->p; } #endif DUK_LOCAL duk_uint8_t duk__dec_get(duk_json_dec_ctx *js_ctx) { DUK_ASSERT(js_ctx->p <= js_ctx->p_end); return *js_ctx->p++; } DUK_LOCAL duk_uint8_t duk__dec_get_nonwhite(duk_json_dec_ctx *js_ctx) { duk__dec_eat_white(js_ctx); return duk__dec_get(js_ctx); } /* For JX, expressing the whole unsigned 32-bit range matters. */ DUK_LOCAL duk_uint_fast32_t duk__dec_decode_hex_escape(duk_json_dec_ctx *js_ctx, duk_small_uint_t n) { duk_small_uint_t i; duk_uint_fast32_t res = 0; duk_uint8_t x; duk_small_int_t t; for (i = 0; i < n; i++) { /* XXX: share helper from lexer; duk_lexer.c / hexval(). */ x = duk__dec_get(js_ctx); DUK_DDD(DUK_DDDPRINT("decode_hex_escape: i=%ld, n=%ld, res=%ld, x=%ld", (long) i, (long) n, (long) res, (long) x)); /* x == 0x00 (EOF) causes syntax_error */ DUK_ASSERT(duk_hex_dectab[0] == -1); t = duk_hex_dectab[x & 0xff]; if (DUK_LIKELY(t >= 0)) { res = (res * 16) + (duk_uint_fast32_t) t; } else { /* catches EOF and invalid digits */ goto syntax_error; } } DUK_DDD(DUK_DDDPRINT("final hex decoded value: %ld", (long) res)); return res; syntax_error: duk__dec_syntax_error(js_ctx); DUK_UNREACHABLE(); return 0; } DUK_LOCAL void duk__dec_req_stridx(duk_json_dec_ctx *js_ctx, duk_small_uint_t stridx) { duk_hstring *h; const duk_uint8_t *p; duk_uint8_t x, y; /* First character has already been eaten and checked by the caller. * We can scan until a NUL in stridx string because no built-in strings * have internal NULs. */ DUK_ASSERT_STRIDX_VALID(stridx); h = DUK_HTHREAD_GET_STRING(js_ctx->thr, stridx); DUK_ASSERT(h != NULL); p = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h) + 1; DUK_ASSERT(*(js_ctx->p - 1) == *(p - 1)); /* first character has been matched */ for (;;) { x = *p; if (x == 0) { break; } y = duk__dec_get(js_ctx); if (x != y) { /* Catches EOF of JSON input. */ goto syntax_error; } p++; } return; syntax_error: duk__dec_syntax_error(js_ctx); DUK_UNREACHABLE(); } DUK_LOCAL duk_small_int_t duk__dec_string_escape(duk_json_dec_ctx *js_ctx, duk_uint8_t **ext_p) { duk_uint_fast32_t cp; /* EOF (-1) will be cast to an unsigned value first * and then re-cast for the switch. In any case, it * will match the default case (syntax error). */ cp = (duk_uint_fast32_t) duk__dec_get(js_ctx); switch (cp) { case DUK_ASC_BACKSLASH: break; case DUK_ASC_DOUBLEQUOTE: break; case DUK_ASC_SLASH: break; case DUK_ASC_LC_T: cp = 0x09; break; case DUK_ASC_LC_N: cp = 0x0a; break; case DUK_ASC_LC_R: cp = 0x0d; break; case DUK_ASC_LC_F: cp = 0x0c; break; case DUK_ASC_LC_B: cp = 0x08; break; case DUK_ASC_LC_U: { cp = duk__dec_decode_hex_escape(js_ctx, 4); break; } #if defined(DUK_USE_JX) case DUK_ASC_UC_U: { if (js_ctx->flag_ext_custom) { cp = duk__dec_decode_hex_escape(js_ctx, 8); } else { return 1; /* syntax error */ } break; } case DUK_ASC_LC_X: { if (js_ctx->flag_ext_custom) { cp = duk__dec_decode_hex_escape(js_ctx, 2); } else { return 1; /* syntax error */ } break; } #endif /* DUK_USE_JX */ default: /* catches EOF (0x00) */ return 1; /* syntax error */ } DUK_RAW_WRITE_XUTF8(*ext_p, cp); return 0; } DUK_LOCAL void duk__dec_string(duk_json_dec_ctx *js_ctx) { duk_hthread *thr = js_ctx->thr; duk_bufwriter_ctx bw_alloc; duk_bufwriter_ctx *bw; duk_uint8_t *q; /* '"' was eaten by caller */ /* Note that we currently parse -bytes-, not codepoints. * All non-ASCII extended UTF-8 will encode to bytes >= 0x80, * so they'll simply pass through (valid UTF-8 or not). */ bw = &bw_alloc; DUK_BW_INIT_PUSHBUF(js_ctx->thr, bw, DUK__JSON_DECSTR_BUFSIZE); q = DUK_BW_GET_PTR(js_ctx->thr, bw); #if defined(DUK_USE_JSON_DECSTRING_FASTPATH) for (;;) { duk_small_uint_t safe; duk_uint8_t b, x; const duk_uint8_t *p; /* Select a safe loop count where no output checks are * needed assuming we won't encounter escapes. Input * bound checks are not necessary as a NUL (guaranteed) * will cause a SyntaxError before we read out of bounds. */ safe = DUK__JSON_DECSTR_CHUNKSIZE; /* Ensure space for 1:1 output plus one escape. */ q = DUK_BW_ENSURE_RAW(js_ctx->thr, bw, safe + DUK_UNICODE_MAX_XUTF8_LENGTH, q); p = js_ctx->p; /* temp copy, write back for next loop */ for (;;) { if (safe == 0) { js_ctx->p = p; break; } safe--; /* End of input (NUL) goes through slow path and causes SyntaxError. */ DUK_ASSERT(duk__json_decstr_lookup[0] == 0x00); b = *p++; x = (duk_small_int_t) duk__json_decstr_lookup[b]; if (DUK_LIKELY(x != 0)) { /* Fast path, decode as is. */ *q++ = b; } else if (b == DUK_ASC_DOUBLEQUOTE) { js_ctx->p = p; goto found_quote; } else if (b == DUK_ASC_BACKSLASH) { /* We've ensured space for one escaped input; then * bail out and recheck (this makes escape handling * quite slow but it's uncommon). */ js_ctx->p = p; if (duk__dec_string_escape(js_ctx, &q) != 0) { goto syntax_error; } break; } else { js_ctx->p = p; goto syntax_error; } } } found_quote: #else /* DUK_USE_JSON_DECSTRING_FASTPATH */ for (;;) { duk_uint8_t x; q = DUK_BW_ENSURE_RAW(js_ctx->thr, bw, DUK_UNICODE_MAX_XUTF8_LENGTH, q); x = duk__dec_get(js_ctx); if (x == DUK_ASC_DOUBLEQUOTE) { break; } else if (x == DUK_ASC_BACKSLASH) { if (duk__dec_string_escape(js_ctx, &q) != 0) { goto syntax_error; } } else if (x < 0x20) { /* catches EOF (NUL) */ goto syntax_error; } else { *q++ = (duk_uint8_t) x; } } #endif /* DUK_USE_JSON_DECSTRING_FASTPATH */ DUK_BW_SETPTR_AND_COMPACT(js_ctx->thr, bw, q); (void) duk_buffer_to_string(thr, -1); /* Safe if input string is safe. */ /* [ ... str ] */ return; syntax_error: duk__dec_syntax_error(js_ctx); DUK_UNREACHABLE(); } #if defined(DUK_USE_JX) /* Decode a plain string consisting entirely of identifier characters. * Used to parse plain keys (e.g. "foo: 123"). */ DUK_LOCAL void duk__dec_plain_string(duk_json_dec_ctx *js_ctx) { duk_hthread *thr = js_ctx->thr; const duk_uint8_t *p; duk_small_int_t x; /* Caller has already eaten the first char so backtrack one byte. */ js_ctx->p--; /* safe */ p = js_ctx->p; /* Here again we parse bytes, and non-ASCII UTF-8 will cause end of * parsing (which is correct except if there are non-shortest encodings). * There is also no need to check explicitly for end of input buffer as * the input is NUL padded and NUL will exit the parsing loop. * * Because no unescaping takes place, we can just scan to the end of the * plain string and intern from the input buffer. */ for (;;) { x = *p; /* There is no need to check the first character specially here * (i.e. reject digits): the caller only accepts valid initial * characters and won't call us if the first character is a digit. * This also ensures that the plain string won't be empty. */ if (!duk_unicode_is_identifier_part((duk_codepoint_t) x)) { break; } p++; } duk_push_lstring(thr, (const char *) js_ctx->p, (duk_size_t) (p - js_ctx->p)); js_ctx->p = p; /* [ ... str ] */ } #endif /* DUK_USE_JX */ #if defined(DUK_USE_JX) DUK_LOCAL void duk__dec_pointer(duk_json_dec_ctx *js_ctx) { duk_hthread *thr = js_ctx->thr; const duk_uint8_t *p; duk_small_int_t x; void *voidptr; /* Caller has already eaten the first character ('(') which we don't need. */ p = js_ctx->p; for (;;) { x = *p; /* Assume that the native representation never contains a closing * parenthesis. */ if (x == DUK_ASC_RPAREN) { break; } else if (x <= 0) { /* NUL term or -1 (EOF), NUL check would suffice */ goto syntax_error; } p++; } /* There is no need to NUL delimit the sscanf() call: trailing garbage is * ignored and there is always a NUL terminator which will force an error * if no error is encountered before it. It's possible that the scan * would scan further than between [js_ctx->p,p[ though and we'd advance * by less than the scanned value. * * Because pointers are platform specific, a failure to scan a pointer * results in a null pointer which is a better placeholder than a missing * value or an error. */ voidptr = NULL; (void) DUK_SSCANF((const char *) js_ctx->p, DUK_STR_FMT_PTR, &voidptr); duk_push_pointer(thr, voidptr); js_ctx->p = p + 1; /* skip ')' */ /* [ ... ptr ] */ return; syntax_error: duk__dec_syntax_error(js_ctx); DUK_UNREACHABLE(); } #endif /* DUK_USE_JX */ #if defined(DUK_USE_JX) DUK_LOCAL void duk__dec_buffer(duk_json_dec_ctx *js_ctx) { duk_hthread *thr = js_ctx->thr; const duk_uint8_t *p; duk_uint8_t *buf; duk_size_t src_len; duk_small_int_t x; /* Caller has already eaten the first character ('|') which we don't need. */ p = js_ctx->p; /* XXX: Would be nice to share the fast path loop from duk_hex_decode() * and avoid creating a temporary buffer. However, there are some * differences which prevent trivial sharing: * * - Pipe char detection * - EOF detection * - Unknown length of input and output * * The best approach here would be a bufwriter and a reasonaly sized * safe inner loop (e.g. 64 output bytes at a time). */ for (;;) { x = *p; /* This loop intentionally does not ensure characters are valid * ([0-9a-fA-F]) because the hex decode call below will do that. */ if (x == DUK_ASC_PIPE) { break; } else if (x <= 0) { /* NUL term or -1 (EOF), NUL check would suffice */ goto syntax_error; } p++; } /* XXX: this is not very nice; unnecessary copy is made. */ src_len = (duk_size_t) (p - js_ctx->p); buf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, src_len); DUK_ASSERT(buf != NULL); DUK_MEMCPY((void *) buf, (const void *) js_ctx->p, src_len); duk_hex_decode(thr, -1); js_ctx->p = p + 1; /* skip '|' */ /* [ ... buf ] */ return; syntax_error: duk__dec_syntax_error(js_ctx); DUK_UNREACHABLE(); } #endif /* DUK_USE_JX */ /* Parse a number, other than NaN or +/- Infinity */ DUK_LOCAL void duk__dec_number(duk_json_dec_ctx *js_ctx) { duk_hthread *thr = js_ctx->thr; const duk_uint8_t *p_start; const duk_uint8_t *p; duk_uint8_t x; duk_small_uint_t s2n_flags; DUK_DDD(DUK_DDDPRINT("parse_number")); p_start = js_ctx->p; /* First pass parse is very lenient (e.g. allows '1.2.3') and extracts a * string for strict number parsing. */ p = js_ctx->p; for (;;) { x = *p; DUK_DDD(DUK_DDDPRINT("parse_number: p_start=%p, p=%p, p_end=%p, x=%ld", (const void *) p_start, (const void *) p, (const void *) js_ctx->p_end, (long) x)); #if defined(DUK_USE_JSON_DECNUMBER_FASTPATH) /* This fast path is pretty marginal in practice. * XXX: candidate for removal. */ DUK_ASSERT(duk__json_decnumber_lookup[0x00] == 0x00); /* end-of-input breaks */ if (duk__json_decnumber_lookup[x] == 0) { break; } #else /* DUK_USE_JSON_DECNUMBER_FASTPATH */ if (!((x >= DUK_ASC_0 && x <= DUK_ASC_9) || (x == DUK_ASC_PERIOD || x == DUK_ASC_LC_E || x == DUK_ASC_UC_E || x == DUK_ASC_MINUS || x == DUK_ASC_PLUS))) { /* Plus sign must be accepted for positive exponents * (e.g. '1.5e+2'). This clause catches NULs. */ break; } #endif /* DUK_USE_JSON_DECNUMBER_FASTPATH */ p++; /* safe, because matched (NUL causes a break) */ } js_ctx->p = p; DUK_ASSERT(js_ctx->p > p_start); duk_push_lstring(thr, (const char *) p_start, (duk_size_t) (p - p_start)); s2n_flags = DUK_S2N_FLAG_ALLOW_EXP | DUK_S2N_FLAG_ALLOW_MINUS | /* but don't allow leading plus */ DUK_S2N_FLAG_ALLOW_FRAC; DUK_DDD(DUK_DDDPRINT("parse_number: string before parsing: %!T", (duk_tval *) duk_get_tval(thr, -1))); duk_numconv_parse(thr, 10 /*radix*/, s2n_flags); if (duk_is_nan(thr, -1)) { duk__dec_syntax_error(js_ctx); } DUK_ASSERT(duk_is_number(thr, -1)); DUK_DDD(DUK_DDDPRINT("parse_number: final number: %!T", (duk_tval *) duk_get_tval(thr, -1))); /* [ ... num ] */ } DUK_LOCAL void duk__dec_objarr_entry(duk_json_dec_ctx *js_ctx) { duk_hthread *thr = js_ctx->thr; duk_require_stack(thr, DUK_JSON_DEC_REQSTACK); /* c recursion check */ DUK_ASSERT_DISABLE(js_ctx->recursion_depth >= 0); /* unsigned */ DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit); if (js_ctx->recursion_depth >= js_ctx->recursion_limit) { DUK_ERROR_RANGE(thr, DUK_STR_JSONDEC_RECLIMIT); } js_ctx->recursion_depth++; } DUK_LOCAL void duk__dec_objarr_exit(duk_json_dec_ctx *js_ctx) { /* c recursion check */ DUK_ASSERT(js_ctx->recursion_depth > 0); DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit); js_ctx->recursion_depth--; } DUK_LOCAL void duk__dec_object(duk_json_dec_ctx *js_ctx) { duk_hthread *thr = js_ctx->thr; duk_int_t key_count; /* XXX: a "first" flag would suffice */ duk_uint8_t x; DUK_DDD(DUK_DDDPRINT("parse_object")); duk__dec_objarr_entry(js_ctx); duk_push_object(thr); /* Initial '{' has been checked and eaten by caller. */ key_count = 0; for (;;) { x = duk__dec_get_nonwhite(js_ctx); DUK_DDD(DUK_DDDPRINT("parse_object: obj=%!T, x=%ld, key_count=%ld", (duk_tval *) duk_get_tval(thr, -1), (long) x, (long) key_count)); /* handle comma and closing brace */ if (x == DUK_ASC_COMMA && key_count > 0) { /* accept comma, expect new value */ x = duk__dec_get_nonwhite(js_ctx); } else if (x == DUK_ASC_RCURLY) { /* eat closing brace */ break; } else if (key_count == 0) { /* accept anything, expect first value (EOF will be * caught by key parsing below. */ ; } else { /* catches EOF (NUL) and initial comma */ goto syntax_error; } /* parse key and value */ if (x == DUK_ASC_DOUBLEQUOTE) { duk__dec_string(js_ctx); #if defined(DUK_USE_JX) } else if (js_ctx->flag_ext_custom && duk_unicode_is_identifier_start((duk_codepoint_t) x)) { duk__dec_plain_string(js_ctx); #endif } else { goto syntax_error; } /* [ ... obj key ] */ x = duk__dec_get_nonwhite(js_ctx); if (x != DUK_ASC_COLON) { goto syntax_error; } duk__dec_value(js_ctx); /* [ ... obj key val ] */ duk_xdef_prop_wec(thr, -3); /* [ ... obj ] */ key_count++; } /* [ ... obj ] */ DUK_DDD(DUK_DDDPRINT("parse_object: final object is %!T", (duk_tval *) duk_get_tval(thr, -1))); duk__dec_objarr_exit(js_ctx); return; syntax_error: duk__dec_syntax_error(js_ctx); DUK_UNREACHABLE(); } DUK_LOCAL void duk__dec_array(duk_json_dec_ctx *js_ctx) { duk_hthread *thr = js_ctx->thr; duk_uarridx_t arr_idx; duk_uint8_t x; DUK_DDD(DUK_DDDPRINT("parse_array")); duk__dec_objarr_entry(js_ctx); duk_push_array(thr); /* Initial '[' has been checked and eaten by caller. */ arr_idx = 0; for (;;) { x = duk__dec_get_nonwhite(js_ctx); DUK_DDD(DUK_DDDPRINT("parse_array: arr=%!T, x=%ld, arr_idx=%ld", (duk_tval *) duk_get_tval(thr, -1), (long) x, (long) arr_idx)); /* handle comma and closing bracket */ if ((x == DUK_ASC_COMMA) && (arr_idx != 0)) { /* accept comma, expect new value */ ; } else if (x == DUK_ASC_RBRACKET) { /* eat closing bracket */ break; } else if (arr_idx == 0) { /* accept anything, expect first value (EOF will be * caught by duk__dec_value() below. */ js_ctx->p--; /* backtrack (safe) */ } else { /* catches EOF (NUL) and initial comma */ goto syntax_error; } /* parse value */ duk__dec_value(js_ctx); /* [ ... arr val ] */ duk_xdef_prop_index_wec(thr, -2, arr_idx); arr_idx++; } /* Must set 'length' explicitly when using duk_xdef_prop_xxx() to * set the values. */ duk_set_length(thr, -1, arr_idx); /* [ ... arr ] */ DUK_DDD(DUK_DDDPRINT("parse_array: final array is %!T", (duk_tval *) duk_get_tval(thr, -1))); duk__dec_objarr_exit(js_ctx); return; syntax_error: duk__dec_syntax_error(js_ctx); DUK_UNREACHABLE(); } DUK_LOCAL void duk__dec_value(duk_json_dec_ctx *js_ctx) { duk_hthread *thr = js_ctx->thr; duk_uint8_t x; x = duk__dec_get_nonwhite(js_ctx); DUK_DDD(DUK_DDDPRINT("parse_value: initial x=%ld", (long) x)); /* Note: duk__dec_req_stridx() backtracks one char */ if (x == DUK_ASC_DOUBLEQUOTE) { duk__dec_string(js_ctx); } else if ((x >= DUK_ASC_0 && x <= DUK_ASC_9) || (x == DUK_ASC_MINUS)) { #if defined(DUK_USE_JX) if (js_ctx->flag_ext_custom && x == DUK_ASC_MINUS && duk__dec_peek(js_ctx) == DUK_ASC_UC_I) { duk__dec_req_stridx(js_ctx, DUK_STRIDX_MINUS_INFINITY); /* "-Infinity", '-' has been eaten */ duk_push_number(thr, -DUK_DOUBLE_INFINITY); } else { #else { /* unconditional block */ #endif /* We already ate 'x', so backup one byte. */ js_ctx->p--; /* safe */ duk__dec_number(js_ctx); } } else if (x == DUK_ASC_LC_T) { duk__dec_req_stridx(js_ctx, DUK_STRIDX_TRUE); duk_push_true(thr); } else if (x == DUK_ASC_LC_F) { duk__dec_req_stridx(js_ctx, DUK_STRIDX_FALSE); duk_push_false(thr); } else if (x == DUK_ASC_LC_N) { duk__dec_req_stridx(js_ctx, DUK_STRIDX_LC_NULL); duk_push_null(thr); #if defined(DUK_USE_JX) } else if (js_ctx->flag_ext_custom && x == DUK_ASC_LC_U) { duk__dec_req_stridx(js_ctx, DUK_STRIDX_LC_UNDEFINED); duk_push_undefined(thr); } else if (js_ctx->flag_ext_custom && x == DUK_ASC_UC_N) { duk__dec_req_stridx(js_ctx, DUK_STRIDX_NAN); duk_push_nan(thr); } else if (js_ctx->flag_ext_custom && x == DUK_ASC_UC_I) { duk__dec_req_stridx(js_ctx, DUK_STRIDX_INFINITY); duk_push_number(thr, DUK_DOUBLE_INFINITY); } else if (js_ctx->flag_ext_custom && x == DUK_ASC_LPAREN) { duk__dec_pointer(js_ctx); } else if (js_ctx->flag_ext_custom && x == DUK_ASC_PIPE) { duk__dec_buffer(js_ctx); #endif } else if (x == DUK_ASC_LCURLY) { duk__dec_object(js_ctx); } else if (x == DUK_ASC_LBRACKET) { duk__dec_array(js_ctx); } else { /* catches EOF (NUL) */ goto syntax_error; } duk__dec_eat_white(js_ctx); /* [ ... val ] */ return; syntax_error: duk__dec_syntax_error(js_ctx); DUK_UNREACHABLE(); } /* Recursive value reviver, implements the Walk() algorithm. No C recursion * check is done here because the initial parsing step will already ensure * there is a reasonable limit on C recursion depth and hence object depth. */ DUK_LOCAL void duk__dec_reviver_walk(duk_json_dec_ctx *js_ctx) { duk_hthread *thr = js_ctx->thr; duk_hobject *h; duk_uarridx_t i, arr_len; DUK_DDD(DUK_DDDPRINT("walk: top=%ld, holder=%!T, name=%!T", (long) duk_get_top(thr), (duk_tval *) duk_get_tval(thr, -2), (duk_tval *) duk_get_tval(thr, -1))); duk_dup_top(thr); duk_get_prop(thr, -3); /* -> [ ... holder name val ] */ h = duk_get_hobject(thr, -1); if (h != NULL) { if (DUK_HOBJECT_GET_CLASS_NUMBER(h) == DUK_HOBJECT_CLASS_ARRAY) { arr_len = (duk_uarridx_t) duk_get_length(thr, -1); for (i = 0; i < arr_len; i++) { /* [ ... holder name val ] */ DUK_DDD(DUK_DDDPRINT("walk: array, top=%ld, i=%ld, arr_len=%ld, holder=%!T, name=%!T, val=%!T", (long) duk_get_top(thr), (long) i, (long) arr_len, (duk_tval *) duk_get_tval(thr, -3), (duk_tval *) duk_get_tval(thr, -2), (duk_tval *) duk_get_tval(thr, -1))); duk_dup_top(thr); (void) duk_push_uint_to_hstring(thr, (duk_uint_t) i); /* -> [ ... holder name val val ToString(i) ] */ duk__dec_reviver_walk(js_ctx); /* -> [ ... holder name val new_elem ] */ if (duk_is_undefined(thr, -1)) { duk_pop(thr); duk_del_prop_index(thr, -1, i); } else { /* XXX: duk_xdef_prop_index_wec() would be more appropriate * here but it currently makes some assumptions that might * not hold (e.g. that previous property is not an accessor). */ duk_put_prop_index(thr, -2, i); } } } else { /* [ ... holder name val ] */ duk_enum(thr, -1, DUK_ENUM_OWN_PROPERTIES_ONLY /*flags*/); while (duk_next(thr, -1 /*enum_index*/, 0 /*get_value*/)) { DUK_DDD(DUK_DDDPRINT("walk: object, top=%ld, holder=%!T, name=%!T, val=%!T, enum=%!iT, obj_key=%!T", (long) duk_get_top(thr), (duk_tval *) duk_get_tval(thr, -5), (duk_tval *) duk_get_tval(thr, -4), (duk_tval *) duk_get_tval(thr, -3), (duk_tval *) duk_get_tval(thr, -2), (duk_tval *) duk_get_tval(thr, -1))); /* [ ... holder name val enum obj_key ] */ duk_dup_m3(thr); duk_dup_m2(thr); /* [ ... holder name val enum obj_key val obj_key ] */ duk__dec_reviver_walk(js_ctx); /* [ ... holder name val enum obj_key new_elem ] */ if (duk_is_undefined(thr, -1)) { duk_pop(thr); duk_del_prop(thr, -3); } else { /* XXX: duk_xdef_prop_index_wec() would be more appropriate * here but it currently makes some assumptions that might * not hold (e.g. that previous property is not an accessor). * * Using duk_put_prop() works incorrectly with '__proto__' * if the own property with that name has been deleted. This * does not happen normally, but a clever reviver can trigger * that, see complex reviver case in: test-bug-json-parse-__proto__.js. */ duk_put_prop(thr, -4); } } duk_pop(thr); /* pop enum */ } } /* [ ... holder name val ] */ duk_dup(thr, js_ctx->idx_reviver); duk_insert(thr, -4); /* -> [ ... reviver holder name val ] */ duk_call_method(thr, 2); /* -> [ ... res ] */ DUK_DDD(DUK_DDDPRINT("walk: top=%ld, result=%!T", (long) duk_get_top(thr), (duk_tval *) duk_get_tval(thr, -1))); } /* * Stringify implementation. */ #define DUK__EMIT_1(js_ctx,ch) duk__emit_1((js_ctx), (duk_uint_fast8_t) (ch)) #define DUK__EMIT_2(js_ctx,ch1,ch2) duk__emit_2((js_ctx), (duk_uint_fast8_t) (ch1), (duk_uint_fast8_t) (ch2)) #define DUK__EMIT_HSTR(js_ctx,h) duk__emit_hstring((js_ctx), (h)) #if defined(DUK_USE_FASTINT) || defined(DUK_USE_JX) || defined(DUK_USE_JC) #define DUK__EMIT_CSTR(js_ctx,p) duk__emit_cstring((js_ctx), (p)) #endif #define DUK__EMIT_STRIDX(js_ctx,i) duk__emit_stridx((js_ctx), (i)) #define DUK__UNEMIT_1(js_ctx) duk__unemit_1((js_ctx)) DUK_LOCAL void duk__emit_1(duk_json_enc_ctx *js_ctx, duk_uint_fast8_t ch) { DUK_BW_WRITE_ENSURE_U8(js_ctx->thr, &js_ctx->bw, ch); } DUK_LOCAL void duk__emit_2(duk_json_enc_ctx *js_ctx, duk_uint_fast8_t ch1, duk_uint_fast8_t ch2) { DUK_BW_WRITE_ENSURE_U8_2(js_ctx->thr, &js_ctx->bw, ch1, ch2); } DUK_LOCAL void duk__emit_hstring(duk_json_enc_ctx *js_ctx, duk_hstring *h) { DUK_BW_WRITE_ENSURE_HSTRING(js_ctx->thr, &js_ctx->bw, h); } #if defined(DUK_USE_FASTINT) || defined(DUK_USE_JX) || defined(DUK_USE_JC) DUK_LOCAL void duk__emit_cstring(duk_json_enc_ctx *js_ctx, const char *str) { DUK_BW_WRITE_ENSURE_CSTRING(js_ctx->thr, &js_ctx->bw, str); } #endif DUK_LOCAL void duk__emit_stridx(duk_json_enc_ctx *js_ctx, duk_small_uint_t stridx) { duk_hstring *h; DUK_ASSERT_STRIDX_VALID(stridx); h = DUK_HTHREAD_GET_STRING(js_ctx->thr, stridx); DUK_ASSERT(h != NULL); DUK_BW_WRITE_ENSURE_HSTRING(js_ctx->thr, &js_ctx->bw, h); } DUK_LOCAL void duk__unemit_1(duk_json_enc_ctx *js_ctx) { DUK_ASSERT(DUK_BW_GET_SIZE(js_ctx->thr, &js_ctx->bw) >= 1); DUK_BW_ADD_PTR(js_ctx->thr, &js_ctx->bw, -1); } #define DUK__MKESC(nybbles,esc1,esc2) \ (((duk_uint_fast32_t) (nybbles)) << 16) | \ (((duk_uint_fast32_t) (esc1)) << 8) | \ ((duk_uint_fast32_t) (esc2)) DUK_LOCAL duk_uint8_t *duk__emit_esc_auto_fast(duk_json_enc_ctx *js_ctx, duk_uint_fast32_t cp, duk_uint8_t *q) { duk_uint_fast32_t tmp; duk_small_uint_t dig; DUK_UNREF(js_ctx); /* Caller ensures space for at least DUK__JSON_MAX_ESC_LEN. */ /* Select appropriate escape format automatically, and set 'tmp' to a * value encoding both the escape format character and the nybble count: * * (nybble_count << 16) | (escape_char1) | (escape_char2) */ #if defined(DUK_USE_JX) if (DUK_LIKELY(cp < 0x100UL)) { if (DUK_UNLIKELY(js_ctx->flag_ext_custom != 0U)) { tmp = DUK__MKESC(2, DUK_ASC_BACKSLASH, DUK_ASC_LC_X); } else { tmp = DUK__MKESC(4, DUK_ASC_BACKSLASH, DUK_ASC_LC_U); } } else #endif if (DUK_LIKELY(cp < 0x10000UL)) { tmp = DUK__MKESC(4, DUK_ASC_BACKSLASH, DUK_ASC_LC_U); } else { #if defined(DUK_USE_JX) if (DUK_LIKELY(js_ctx->flag_ext_custom != 0U)) { tmp = DUK__MKESC(8, DUK_ASC_BACKSLASH, DUK_ASC_UC_U); } else #endif { /* In compatible mode and standard JSON mode, output * something useful for non-BMP characters. This won't * roundtrip but will still be more or less readable and * more useful than an error. */ tmp = DUK__MKESC(8, DUK_ASC_UC_U, DUK_ASC_PLUS); } } *q++ = (duk_uint8_t) ((tmp >> 8) & 0xff); *q++ = (duk_uint8_t) (tmp & 0xff); tmp = tmp >> 16; while (tmp > 0) { tmp--; dig = (duk_small_uint_t) ((cp >> (4 * tmp)) & 0x0f); *q++ = duk_lc_digits[dig]; } return q; } DUK_LOCAL void duk__enc_key_autoquote(duk_json_enc_ctx *js_ctx, duk_hstring *k) { const duk_int8_t *p, *p_start, *p_end; /* Note: intentionally signed. */ duk_size_t k_len; duk_codepoint_t cp; DUK_ASSERT(k != NULL); /* Accept ASCII strings which conform to identifier requirements * as being emitted without key quotes. Since we only accept ASCII * there's no need for actual decoding: 'p' is intentionally signed * so that bytes >= 0x80 extend to negative values and are rejected * as invalid identifier codepoints. */ if (js_ctx->flag_avoid_key_quotes) { k_len = DUK_HSTRING_GET_BYTELEN(k); p_start = (const duk_int8_t *) DUK_HSTRING_GET_DATA(k); p_end = p_start + k_len; p = p_start; if (p == p_end) { /* Zero length string is not accepted without quotes */ goto quote_normally; } cp = (duk_codepoint_t) (*p++); if (DUK_UNLIKELY(!duk_unicode_is_identifier_start(cp))) { goto quote_normally; } while (p < p_end) { cp = (duk_codepoint_t) (*p++); if (DUK_UNLIKELY(!duk_unicode_is_identifier_part(cp))) { goto quote_normally; } } /* This seems faster than emitting bytes one at a time and * then potentially rewinding. */ DUK__EMIT_HSTR(js_ctx, k); return; } quote_normally: duk__enc_quote_string(js_ctx, k); } /* The Quote(value) operation: quote a string. * * Stack policy: [ ] -> [ ]. */ DUK_LOCAL void duk__enc_quote_string(duk_json_enc_ctx *js_ctx, duk_hstring *h_str) { duk_hthread *thr = js_ctx->thr; const duk_uint8_t *p, *p_start, *p_end, *p_now, *p_tmp; duk_uint8_t *q; duk_ucodepoint_t cp; /* typed for duk_unicode_decode_xutf8() */ DUK_DDD(DUK_DDDPRINT("duk__enc_quote_string: h_str=%!O", (duk_heaphdr *) h_str)); DUK_ASSERT(h_str != NULL); p_start = DUK_HSTRING_GET_DATA(h_str); p_end = p_start + DUK_HSTRING_GET_BYTELEN(h_str); p = p_start; DUK__EMIT_1(js_ctx, DUK_ASC_DOUBLEQUOTE); /* Encode string in small chunks, estimating the maximum expansion so that * there's no need to ensure space while processing the chunk. */ while (p < p_end) { duk_size_t left, now, space; left = (duk_size_t) (p_end - p); now = (left > DUK__JSON_ENCSTR_CHUNKSIZE ? DUK__JSON_ENCSTR_CHUNKSIZE : left); /* Maximum expansion per input byte is 6: * - invalid UTF-8 byte causes "\uXXXX" to be emitted (6/1 = 6). * - 2-byte UTF-8 encodes as "\uXXXX" (6/2 = 3). * - 4-byte UTF-8 encodes as "\Uxxxxxxxx" (10/4 = 2.5). */ space = now * 6; q = DUK_BW_ENSURE_GETPTR(thr, &js_ctx->bw, space); p_now = p + now; while (p < p_now) { #if defined(DUK_USE_JSON_QUOTESTRING_FASTPATH) duk_uint8_t b; b = duk__json_quotestr_lookup[*p++]; if (DUK_LIKELY(b < 0x80)) { /* Most input bytes go through here. */ *q++ = b; } else if (b >= 0xa0) { *q++ = DUK_ASC_BACKSLASH; *q++ = (duk_uint8_t) (b - 0x80); } else if (b == 0x80) { cp = (duk_ucodepoint_t) (*(p - 1)); q = duk__emit_esc_auto_fast(js_ctx, cp, q); } else if (b == 0x7f && js_ctx->flag_ascii_only) { /* 0x7F is special */ DUK_ASSERT(b == 0x81); cp = (duk_ucodepoint_t) 0x7f; q = duk__emit_esc_auto_fast(js_ctx, cp, q); } else { DUK_ASSERT(b == 0x81); p--; /* slow path is shared */ #else /* DUK_USE_JSON_QUOTESTRING_FASTPATH */ cp = *p; if (DUK_LIKELY(cp <= 0x7f)) { /* ascii fast path: avoid decoding utf-8 */ p++; if (cp == 0x22 || cp == 0x5c) { /* double quote or backslash */ *q++ = DUK_ASC_BACKSLASH; *q++ = (duk_uint8_t) cp; } else if (cp < 0x20) { duk_uint_fast8_t esc_char; /* This approach is a bit shorter than a straight * if-else-ladder and also a bit faster. */ if (cp < (sizeof(duk__json_quotestr_esc) / sizeof(duk_uint8_t)) && (esc_char = duk__json_quotestr_esc[cp]) != 0) { *q++ = DUK_ASC_BACKSLASH; *q++ = (duk_uint8_t) esc_char; } else { q = duk__emit_esc_auto_fast(js_ctx, cp, q); } } else if (cp == 0x7f && js_ctx->flag_ascii_only) { q = duk__emit_esc_auto_fast(js_ctx, cp, q); } else { /* any other printable -> as is */ *q++ = (duk_uint8_t) cp; } } else { /* slow path is shared */ #endif /* DUK_USE_JSON_QUOTESTRING_FASTPATH */ /* slow path decode */ /* If XUTF-8 decoding fails, treat the offending byte as a codepoint directly * and go forward one byte. This is of course very lossy, but allows some kind * of output to be produced even for internal strings which don't conform to * XUTF-8. All standard Ecmascript strings are always CESU-8, so this behavior * does not violate the Ecmascript specification. The behavior is applied to * all modes, including Ecmascript standard JSON. Because the current XUTF-8 * decoding is not very strict, this behavior only really affects initial bytes * and truncated codepoints. * * Another alternative would be to scan forwards to start of next codepoint * (or end of input) and emit just one replacement codepoint. */ p_tmp = p; if (!duk_unicode_decode_xutf8(thr, &p, p_start, p_end, &cp)) { /* Decode failed. */ cp = *p_tmp; p = p_tmp + 1; } #if defined(DUK_USE_NONSTD_JSON_ESC_U2028_U2029) if (js_ctx->flag_ascii_only || cp == 0x2028 || cp == 0x2029) { #else if (js_ctx->flag_ascii_only) { #endif q = duk__emit_esc_auto_fast(js_ctx, cp, q); } else { /* as is */ DUK_RAW_WRITE_XUTF8(q, cp); } } } DUK_BW_SET_PTR(thr, &js_ctx->bw, q); } DUK__EMIT_1(js_ctx, DUK_ASC_DOUBLEQUOTE); } /* Encode a double (checked by caller) from stack top. Stack top may be * replaced by serialized string but is not popped (caller does that). */ DUK_LOCAL void duk__enc_double(duk_json_enc_ctx *js_ctx) { duk_hthread *thr; duk_tval *tv; duk_double_t d; duk_small_int_t c; duk_small_int_t s; duk_small_uint_t stridx; duk_small_uint_t n2s_flags; duk_hstring *h_str; DUK_ASSERT(js_ctx != NULL); thr = js_ctx->thr; DUK_ASSERT(thr != NULL); /* Caller must ensure 'tv' is indeed a double and not a fastint! */ tv = DUK_GET_TVAL_NEGIDX(thr, -1); DUK_ASSERT(DUK_TVAL_IS_DOUBLE(tv)); d = DUK_TVAL_GET_DOUBLE(tv); c = (duk_small_int_t) DUK_FPCLASSIFY(d); s = (duk_small_int_t) DUK_SIGNBIT(d); DUK_UNREF(s); if (DUK_LIKELY(!(c == DUK_FP_INFINITE || c == DUK_FP_NAN))) { DUK_ASSERT(DUK_ISFINITE(d)); #if defined(DUK_USE_JX) || defined(DUK_USE_JC) /* Negative zero needs special handling in JX/JC because * it would otherwise serialize to '0', not '-0'. */ if (DUK_UNLIKELY(c == DUK_FP_ZERO && s != 0 && (js_ctx->flag_ext_custom_or_compatible))) { duk_push_hstring_stridx(thr, DUK_STRIDX_MINUS_ZERO); /* '-0' */ } else #endif /* DUK_USE_JX || DUK_USE_JC */ { n2s_flags = 0; /* [ ... number ] -> [ ... string ] */ duk_numconv_stringify(thr, 10 /*radix*/, 0 /*digits*/, n2s_flags); } h_str = duk_known_hstring(thr, -1); DUK__EMIT_HSTR(js_ctx, h_str); return; } #if defined(DUK_USE_JX) || defined(DUK_USE_JC) if (!(js_ctx->flags & (DUK_JSON_FLAG_EXT_CUSTOM | DUK_JSON_FLAG_EXT_COMPATIBLE))) { stridx = DUK_STRIDX_LC_NULL; } else if (c == DUK_FP_NAN) { stridx = js_ctx->stridx_custom_nan; } else if (s == 0) { stridx = js_ctx->stridx_custom_posinf; } else { stridx = js_ctx->stridx_custom_neginf; } #else stridx = DUK_STRIDX_LC_NULL; #endif DUK__EMIT_STRIDX(js_ctx, stridx); } #if defined(DUK_USE_FASTINT) /* Encode a fastint from duk_tval ptr, no value stack effects. */ DUK_LOCAL void duk__enc_fastint_tval(duk_json_enc_ctx *js_ctx, duk_tval *tv) { duk_int64_t v; /* Fastint range is signed 48-bit so longest value is -2^47 = -140737488355328 * (16 chars long), longest signed 64-bit value is -2^63 = -9223372036854775808 * (20 chars long). Alloc space for 64-bit range to be safe. */ duk_uint8_t buf[20 + 1]; /* Caller must ensure 'tv' is indeed a fastint! */ DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv)); v = DUK_TVAL_GET_FASTINT(tv); /* XXX: There are no format strings in duk_config.h yet, could add * one for formatting duk_int64_t. For now, assumes "%lld" and that * "long long" type exists. Could also rely on C99 directly but that * won't work for older MSVC. */ DUK_SPRINTF((char *) buf, "%lld", (long long) v); DUK__EMIT_CSTR(js_ctx, (const char *) buf); } #endif #if defined(DUK_USE_JX) || defined(DUK_USE_JC) #if defined(DUK_USE_HEX_FASTPATH) DUK_LOCAL duk_uint8_t *duk__enc_buffer_data_hex(const duk_uint8_t *src, duk_size_t src_len, duk_uint8_t *dst) { duk_uint8_t *q; duk_uint16_t *q16; duk_small_uint_t x; duk_size_t i, len_safe; #if !defined(DUK_USE_UNALIGNED_ACCESSES_POSSIBLE) duk_bool_t shift_dst; #endif /* Unlike in duk_hex_encode() 'dst' is not necessarily aligned by 2. * For platforms where unaligned accesses are not allowed, shift 'dst' * ahead by 1 byte to get alignment and then DUK_MEMMOVE() the result * in place. The faster encoding loop makes up the difference. * There's always space for one extra byte because a terminator always * follows the hex data and that's been accounted for by the caller. */ #if defined(DUK_USE_UNALIGNED_ACCESSES_POSSIBLE) q16 = (duk_uint16_t *) (void *) dst; #else shift_dst = (duk_bool_t) (((duk_size_t) dst) & 0x01U); if (shift_dst) { DUK_DD(DUK_DDPRINT("unaligned accesses not possible, dst not aligned -> step to dst + 1")); q16 = (duk_uint16_t *) (void *) (dst + 1); } else { DUK_DD(DUK_DDPRINT("unaligned accesses not possible, dst is aligned")); q16 = (duk_uint16_t *) (void *) dst; } DUK_ASSERT((((duk_size_t) q16) & 0x01U) == 0); #endif len_safe = src_len & ~0x03U; for (i = 0; i < len_safe; i += 4) { q16[0] = duk_hex_enctab[src[i]]; q16[1] = duk_hex_enctab[src[i + 1]]; q16[2] = duk_hex_enctab[src[i + 2]]; q16[3] = duk_hex_enctab[src[i + 3]]; q16 += 4; } q = (duk_uint8_t *) q16; #if !defined(DUK_USE_UNALIGNED_ACCESSES_POSSIBLE) if (shift_dst) { q--; DUK_MEMMOVE((void *) dst, (const void *) (dst + 1), 2 * len_safe); DUK_ASSERT(dst + 2 * len_safe == q); } #endif for (; i < src_len; i++) { x = src[i]; *q++ = duk_lc_digits[x >> 4]; *q++ = duk_lc_digits[x & 0x0f]; } return q; } #else /* DUK_USE_HEX_FASTPATH */ DUK_LOCAL duk_uint8_t *duk__enc_buffer_data_hex(const duk_uint8_t *src, duk_size_t src_len, duk_uint8_t *dst) { const duk_uint8_t *p; const duk_uint8_t *p_end; duk_uint8_t *q; duk_small_uint_t x; p = src; p_end = src + src_len; q = dst; while (p != p_end) { x = *p++; *q++ = duk_lc_digits[x >> 4]; *q++ = duk_lc_digits[x & 0x0f]; } return q; } #endif /* DUK_USE_HEX_FASTPATH */ DUK_LOCAL void duk__enc_buffer_data(duk_json_enc_ctx *js_ctx, duk_uint8_t *buf_data, duk_size_t buf_len) { duk_hthread *thr; duk_uint8_t *q; duk_size_t space; thr = js_ctx->thr; DUK_ASSERT(js_ctx->flag_ext_custom || js_ctx->flag_ext_compatible); /* caller checks */ DUK_ASSERT(js_ctx->flag_ext_custom_or_compatible); /* Buffer values are encoded in (lowercase) hex to make the * binary data readable. Base64 or similar would be more * compact but less readable, and the point of JX/JC * variants is to be as useful to a programmer as possible. */ /* The #if defined() clutter here needs to handle the three * cases: (1) JX+JC, (2) JX only, (3) JC only. */ /* Note: space must cater for both JX and JC. */ space = 9 + buf_len * 2 + 2; DUK_ASSERT(DUK_HBUFFER_MAX_BYTELEN <= 0x7ffffffeUL); DUK_ASSERT((space - 2) / 2 >= buf_len); /* overflow not possible, buffer limits */ q = DUK_BW_ENSURE_GETPTR(thr, &js_ctx->bw, space); #if defined(DUK_USE_JX) && defined(DUK_USE_JC) if (js_ctx->flag_ext_custom) #endif #if defined(DUK_USE_JX) { *q++ = DUK_ASC_PIPE; q = duk__enc_buffer_data_hex(buf_data, buf_len, q); *q++ = DUK_ASC_PIPE; } #endif #if defined(DUK_USE_JX) && defined(DUK_USE_JC) else #endif #if defined(DUK_USE_JC) { DUK_ASSERT(js_ctx->flag_ext_compatible); DUK_MEMCPY((void *) q, (const void *) "{\"_buf\":\"", 9); /* len: 9 */ q += 9; q = duk__enc_buffer_data_hex(buf_data, buf_len, q); *q++ = DUK_ASC_DOUBLEQUOTE; *q++ = DUK_ASC_RCURLY; } #endif DUK_BW_SET_PTR(thr, &js_ctx->bw, q); } DUK_LOCAL void duk__enc_buffer_jx_jc(duk_json_enc_ctx *js_ctx, duk_hbuffer *h) { duk__enc_buffer_data(js_ctx, (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(js_ctx->thr->heap, h), (duk_size_t) DUK_HBUFFER_GET_SIZE(h)); } #endif /* DUK_USE_JX || DUK_USE_JC */ #if defined(DUK_USE_JSON_STRINGIFY_FASTPATH) DUK_LOCAL void duk__enc_buffer_json_fastpath(duk_json_enc_ctx *js_ctx, duk_hbuffer *h) { duk_size_t i, n; const duk_uint8_t *buf; duk_uint8_t *q; n = DUK_HBUFFER_GET_SIZE(h); if (n == 0) { DUK__EMIT_2(js_ctx, DUK_ASC_LCURLY, DUK_ASC_RCURLY); return; } DUK__EMIT_1(js_ctx, DUK_ASC_LCURLY); /* Maximum encoded length with 32-bit index: 1 + 10 + 2 + 3 + 1 + 1 = 18, * with 64-bit index: 1 + 20 + 2 + 3 + 1 + 1 = 28. 32 has some slack. * * Note that because the output buffer is reallocated from time to time, * side effects (such as finalizers) affecting the buffer 'h' must be * disabled. This is the case in the JSON.stringify() fast path. */ buf = (const duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(js_ctx->thr->heap, h); if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) { for (i = 0; i < n; i++) { duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth + 1); q = DUK_BW_ENSURE_GETPTR(js_ctx->thr, &js_ctx->bw, 32); q += DUK_SPRINTF((char *) q, "\"%lu\": %u,", (unsigned long) i, (unsigned int) buf[i]); DUK_BW_SET_PTR(js_ctx->thr, &js_ctx->bw, q); } } else { q = DUK_BW_GET_PTR(js_ctx->thr, &js_ctx->bw); for (i = 0; i < n; i++) { q = DUK_BW_ENSURE_RAW(js_ctx->thr, &js_ctx->bw, 32, q); q += DUK_SPRINTF((char *) q, "\"%lu\":%u,", (unsigned long) i, (unsigned int) buf[i]); } DUK_BW_SET_PTR(js_ctx->thr, &js_ctx->bw, q); } DUK__UNEMIT_1(js_ctx); /* eat trailing comma */ if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) { duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth); } DUK__EMIT_1(js_ctx, DUK_ASC_RCURLY); } #endif /* DUK_USE_JSON_STRINGIFY_FASTPATH */ #if defined(DUK_USE_JX) || defined(DUK_USE_JC) DUK_LOCAL void duk__enc_pointer(duk_json_enc_ctx *js_ctx, void *ptr) { char buf[64]; /* XXX: how to figure correct size? */ const char *fmt; DUK_ASSERT(js_ctx->flag_ext_custom || js_ctx->flag_ext_compatible); /* caller checks */ DUK_ASSERT(js_ctx->flag_ext_custom_or_compatible); DUK_MEMZERO(buf, sizeof(buf)); /* The #if defined() clutter here needs to handle the three * cases: (1) JX+JC, (2) JX only, (3) JC only. */ #if defined(DUK_USE_JX) && defined(DUK_USE_JC) if (js_ctx->flag_ext_custom) #endif #if defined(DUK_USE_JX) { fmt = ptr ? "(%p)" : "(null)"; } #endif #if defined(DUK_USE_JX) && defined(DUK_USE_JC) else #endif #if defined(DUK_USE_JC) { DUK_ASSERT(js_ctx->flag_ext_compatible); fmt = ptr ? "{\"_ptr\":\"%p\"}" : "{\"_ptr\":\"null\"}"; } #endif /* When ptr == NULL, the format argument is unused. */ DUK_SNPRINTF(buf, sizeof(buf) - 1, fmt, ptr); /* must not truncate */ DUK__EMIT_CSTR(js_ctx, buf); } #endif /* DUK_USE_JX || DUK_USE_JC */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) #if defined(DUK_USE_JX) || defined(DUK_USE_JC) DUK_LOCAL void duk__enc_bufobj(duk_json_enc_ctx *js_ctx, duk_hbufobj *h_bufobj) { DUK_ASSERT_HBUFOBJ_VALID(h_bufobj); if (h_bufobj->buf == NULL || !DUK_HBUFOBJ_VALID_SLICE(h_bufobj)) { DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL); } else { /* Handle both full and partial slice (as long as covered). */ duk__enc_buffer_data(js_ctx, (duk_uint8_t *) DUK_HBUFOBJ_GET_SLICE_BASE(js_ctx->thr->heap, h_bufobj), (duk_size_t) h_bufobj->length); } } #endif /* DUK_USE_JX || DUK_USE_JC */ #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ /* Indent helper. Calling code relies on js_ctx->recursion_depth also being * directly related to indent depth. */ #if defined(DUK_USE_PREFER_SIZE) DUK_LOCAL void duk__enc_newline_indent(duk_json_enc_ctx *js_ctx, duk_uint_t depth) { DUK_ASSERT(js_ctx->h_gap != NULL); DUK_ASSERT(DUK_HSTRING_GET_BYTELEN(js_ctx->h_gap) > 0); /* caller guarantees */ DUK__EMIT_1(js_ctx, 0x0a); while (depth-- > 0) { DUK__EMIT_HSTR(js_ctx, js_ctx->h_gap); } } #else /* DUK_USE_PREFER_SIZE */ DUK_LOCAL void duk__enc_newline_indent(duk_json_enc_ctx *js_ctx, duk_uint_t depth) { const duk_uint8_t *gap_data; duk_size_t gap_len; duk_size_t avail_bytes; /* bytes of indent available for copying */ duk_size_t need_bytes; /* bytes of indent still needed */ duk_uint8_t *p_start; duk_uint8_t *p; DUK_ASSERT(js_ctx->h_gap != NULL); DUK_ASSERT(DUK_HSTRING_GET_BYTELEN(js_ctx->h_gap) > 0); /* caller guarantees */ DUK__EMIT_1(js_ctx, 0x0a); if (DUK_UNLIKELY(depth == 0)) { return; } /* To handle deeper indents efficiently, make use of copies we've * already emitted. In effect we can emit a sequence of 1, 2, 4, * 8, etc copies, and then finish the last run. Byte counters * avoid multiply with gap_len on every loop. */ gap_data = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(js_ctx->h_gap); gap_len = (duk_size_t) DUK_HSTRING_GET_BYTELEN(js_ctx->h_gap); DUK_ASSERT(gap_len > 0); need_bytes = gap_len * depth; p = DUK_BW_ENSURE_GETPTR(js_ctx->thr, &js_ctx->bw, need_bytes); p_start = p; DUK_MEMCPY((void *) p, (const void *) gap_data, (size_t) gap_len); p += gap_len; avail_bytes = gap_len; DUK_ASSERT(need_bytes >= gap_len); need_bytes -= gap_len; while (need_bytes >= avail_bytes) { DUK_MEMCPY((void *) p, (const void *) p_start, (size_t) avail_bytes); p += avail_bytes; need_bytes -= avail_bytes; avail_bytes <<= 1; } DUK_ASSERT(need_bytes < avail_bytes); /* need_bytes may be zero */ DUK_MEMCPY((void *) p, (const void *) p_start, (size_t) need_bytes); p += need_bytes; /*avail_bytes += need_bytes*/ DUK_BW_SET_PTR(js_ctx->thr, &js_ctx->bw, p); } #endif /* DUK_USE_PREFER_SIZE */ /* Shared entry handling for object/array serialization. */ DUK_LOCAL void duk__enc_objarr_entry(duk_json_enc_ctx *js_ctx, duk_idx_t *entry_top) { duk_hthread *thr = js_ctx->thr; duk_hobject *h_target; duk_uint_fast32_t i, n; *entry_top = duk_get_top(thr); duk_require_stack(thr, DUK_JSON_ENC_REQSTACK); /* Loop check using a hybrid approach: a fixed-size visited[] array * with overflow in a loop check object. */ h_target = duk_known_hobject(thr, -1); /* object or array */ n = js_ctx->recursion_depth; if (DUK_UNLIKELY(n > DUK_JSON_ENC_LOOPARRAY)) { n = DUK_JSON_ENC_LOOPARRAY; } for (i = 0; i < n; i++) { if (DUK_UNLIKELY(js_ctx->visiting[i] == h_target)) { DUK_DD(DUK_DDPRINT("slow path loop detect")); DUK_ERROR_TYPE(thr, DUK_STR_CYCLIC_INPUT); } } if (js_ctx->recursion_depth < DUK_JSON_ENC_LOOPARRAY) { js_ctx->visiting[js_ctx->recursion_depth] = h_target; } else { duk_push_sprintf(thr, DUK_STR_FMT_PTR, (void *) h_target); duk_dup_top(thr); /* -> [ ... voidp voidp ] */ if (duk_has_prop(thr, js_ctx->idx_loop)) { DUK_ERROR_TYPE(thr, DUK_STR_CYCLIC_INPUT); } duk_push_true(thr); /* -> [ ... voidp true ] */ duk_put_prop(thr, js_ctx->idx_loop); /* -> [ ... ] */ } /* C recursion check. */ DUK_ASSERT_DISABLE(js_ctx->recursion_depth >= 0); /* unsigned */ DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit); if (js_ctx->recursion_depth >= js_ctx->recursion_limit) { DUK_ERROR_RANGE(thr, DUK_STR_JSONENC_RECLIMIT); } js_ctx->recursion_depth++; DUK_DDD(DUK_DDDPRINT("shared entry finished: top=%ld, loop=%!T", (long) duk_get_top(thr), (duk_tval *) duk_get_tval(thr, js_ctx->idx_loop))); } /* Shared exit handling for object/array serialization. */ DUK_LOCAL void duk__enc_objarr_exit(duk_json_enc_ctx *js_ctx, duk_idx_t *entry_top) { duk_hthread *thr = js_ctx->thr; duk_hobject *h_target; /* C recursion check. */ DUK_ASSERT(js_ctx->recursion_depth > 0); DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit); js_ctx->recursion_depth--; /* Loop check. */ h_target = duk_known_hobject(thr, *entry_top - 1); /* original target at entry_top - 1 */ if (js_ctx->recursion_depth < DUK_JSON_ENC_LOOPARRAY) { /* Previous entry was inside visited[], nothing to do. */ } else { duk_push_sprintf(thr, DUK_STR_FMT_PTR, (void *) h_target); duk_del_prop(thr, js_ctx->idx_loop); /* -> [ ... ] */ } /* Restore stack top after unbalanced code paths. */ duk_set_top(thr, *entry_top); DUK_DDD(DUK_DDDPRINT("shared entry finished: top=%ld, loop=%!T", (long) duk_get_top(thr), (duk_tval *) duk_get_tval(thr, js_ctx->idx_loop))); } /* The JO(value) operation: encode object. * * Stack policy: [ object ] -> [ object ]. */ DUK_LOCAL void duk__enc_object(duk_json_enc_ctx *js_ctx) { duk_hthread *thr = js_ctx->thr; duk_hstring *h_key; duk_idx_t entry_top; duk_idx_t idx_obj; duk_idx_t idx_keys; duk_bool_t emitted; duk_uarridx_t arr_len, i; duk_size_t prev_size; DUK_DDD(DUK_DDDPRINT("duk__enc_object: obj=%!T", (duk_tval *) duk_get_tval(thr, -1))); duk__enc_objarr_entry(js_ctx, &entry_top); idx_obj = entry_top - 1; if (js_ctx->idx_proplist >= 0) { idx_keys = js_ctx->idx_proplist; } else { /* XXX: would be nice to enumerate an object at specified index */ duk_dup(thr, idx_obj); (void) duk_hobject_get_enumerated_keys(thr, DUK_ENUM_OWN_PROPERTIES_ONLY /*flags*/); /* [ ... target ] -> [ ... target keys ] */ idx_keys = duk_require_normalize_index(thr, -1); /* leave stack unbalanced on purpose */ } DUK_DDD(DUK_DDDPRINT("idx_keys=%ld, h_keys=%!T", (long) idx_keys, (duk_tval *) duk_get_tval(thr, idx_keys))); /* Steps 8-10 have been merged to avoid a "partial" variable. */ DUK__EMIT_1(js_ctx, DUK_ASC_LCURLY); /* XXX: keys is an internal object with all keys to be processed * in its (gapless) array part. Because nobody can touch the keys * object, we could iterate its array part directly (keeping in mind * that it can be reallocated). */ arr_len = (duk_uarridx_t) duk_get_length(thr, idx_keys); emitted = 0; for (i = 0; i < arr_len; i++) { duk_get_prop_index(thr, idx_keys, i); /* -> [ ... key ] */ DUK_DDD(DUK_DDDPRINT("object property loop: holder=%!T, key=%!T", (duk_tval *) duk_get_tval(thr, idx_obj), (duk_tval *) duk_get_tval(thr, -1))); h_key = duk_known_hstring(thr, -1); DUK_ASSERT(h_key != NULL); DUK_ASSERT(!DUK_HSTRING_HAS_SYMBOL(h_key)); /* proplist filtering; enum options */ prev_size = DUK_BW_GET_SIZE(js_ctx->thr, &js_ctx->bw); if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) { duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth); duk__enc_key_autoquote(js_ctx, h_key); DUK__EMIT_2(js_ctx, DUK_ASC_COLON, DUK_ASC_SPACE); } else { duk__enc_key_autoquote(js_ctx, h_key); DUK__EMIT_1(js_ctx, DUK_ASC_COLON); } /* [ ... key ] */ if (DUK_UNLIKELY(duk__enc_value(js_ctx, idx_obj) == 0)) { /* Value would yield 'undefined', so skip key altogether. * Side effects have already happened. */ DUK_BW_SET_SIZE(js_ctx->thr, &js_ctx->bw, prev_size); } else { DUK__EMIT_1(js_ctx, DUK_ASC_COMMA); emitted = 1; } /* [ ... ] */ } if (emitted) { DUK_ASSERT(*((duk_uint8_t *) DUK_BW_GET_PTR(js_ctx->thr, &js_ctx->bw) - 1) == DUK_ASC_COMMA); DUK__UNEMIT_1(js_ctx); /* eat trailing comma */ if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) { DUK_ASSERT(js_ctx->recursion_depth >= 1); duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth - 1U); } } DUK__EMIT_1(js_ctx, DUK_ASC_RCURLY); duk__enc_objarr_exit(js_ctx, &entry_top); DUK_ASSERT_TOP(thr, entry_top); } /* The JA(value) operation: encode array. * * Stack policy: [ array ] -> [ array ]. */ DUK_LOCAL void duk__enc_array(duk_json_enc_ctx *js_ctx) { duk_hthread *thr = js_ctx->thr; duk_idx_t entry_top; duk_idx_t idx_arr; duk_bool_t emitted; duk_uarridx_t i, arr_len; DUK_DDD(DUK_DDDPRINT("duk__enc_array: array=%!T", (duk_tval *) duk_get_tval(thr, -1))); duk__enc_objarr_entry(js_ctx, &entry_top); idx_arr = entry_top - 1; /* Steps 8-10 have been merged to avoid a "partial" variable. */ DUK__EMIT_1(js_ctx, DUK_ASC_LBRACKET); arr_len = (duk_uarridx_t) duk_get_length(thr, idx_arr); emitted = 0; for (i = 0; i < arr_len; i++) { DUK_DDD(DUK_DDDPRINT("array entry loop: array=%!T, index=%ld, arr_len=%ld", (duk_tval *) duk_get_tval(thr, idx_arr), (long) i, (long) arr_len)); if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) { DUK_ASSERT(js_ctx->recursion_depth >= 1); duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth); } (void) duk_push_uint_to_hstring(thr, (duk_uint_t) i); /* -> [ ... key ] */ /* [ ... key ] */ if (DUK_UNLIKELY(duk__enc_value(js_ctx, idx_arr) == 0)) { /* Value would normally be omitted, replace with 'null'. */ DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL); } else { ; } /* [ ... ] */ DUK__EMIT_1(js_ctx, DUK_ASC_COMMA); emitted = 1; } if (emitted) { DUK_ASSERT(*((duk_uint8_t *) DUK_BW_GET_PTR(js_ctx->thr, &js_ctx->bw) - 1) == DUK_ASC_COMMA); DUK__UNEMIT_1(js_ctx); /* eat trailing comma */ if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) { DUK_ASSERT(js_ctx->recursion_depth >= 1); duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth - 1U); } } DUK__EMIT_1(js_ctx, DUK_ASC_RBRACKET); duk__enc_objarr_exit(js_ctx, &entry_top); DUK_ASSERT_TOP(thr, entry_top); } /* The Str(key, holder) operation. * * Stack policy: [ ... key ] -> [ ... ] */ DUK_LOCAL duk_bool_t duk__enc_value(duk_json_enc_ctx *js_ctx, duk_idx_t idx_holder) { duk_hthread *thr = js_ctx->thr; duk_tval *tv; duk_tval *tv_holder; duk_tval *tv_key; duk_small_int_t c; DUK_DDD(DUK_DDDPRINT("duk__enc_value: idx_holder=%ld, holder=%!T, key=%!T", (long) idx_holder, (duk_tval *) duk_get_tval(thr, idx_holder), (duk_tval *) duk_get_tval(thr, -1))); tv_holder = DUK_GET_TVAL_POSIDX(thr, idx_holder); DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv_holder)); tv_key = DUK_GET_TVAL_NEGIDX(thr, -1); DUK_ASSERT(DUK_TVAL_IS_STRING(tv_key)); DUK_ASSERT(!DUK_HSTRING_HAS_SYMBOL(DUK_TVAL_GET_STRING(tv_key))); /* Caller responsible. */ (void) duk_hobject_getprop(thr, tv_holder, tv_key); /* -> [ ... key val ] */ DUK_DDD(DUK_DDDPRINT("value=%!T", (duk_tval *) duk_get_tval(thr, -1))); /* Standard JSON checks for .toJSON() only for actual objects; for * example, setting Number.prototype.toJSON and then serializing a * number won't invoke the .toJSON() method. However, lightfuncs and * plain buffers mimic objects so we check for their .toJSON() method. */ if (duk_check_type_mask(thr, -1, DUK_TYPE_MASK_OBJECT | DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER)) { duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_TO_JSON); if (duk_is_callable(thr, -1)) { /* toJSON() can also be a lightfunc */ DUK_DDD(DUK_DDDPRINT("value is object, has callable toJSON() -> call it")); /* XXX: duk_dup_unvalidated(thr, -2) etc. */ duk_dup_m2(thr); /* -> [ ... key val toJSON val ] */ duk_dup_m4(thr); /* -> [ ... key val toJSON val key ] */ duk_call_method(thr, 1); /* -> [ ... key val val' ] */ duk_remove_m2(thr); /* -> [ ... key val' ] */ } else { duk_pop(thr); /* -> [ ... key val ] */ } } /* [ ... key val ] */ DUK_DDD(DUK_DDDPRINT("value=%!T", (duk_tval *) duk_get_tval(thr, -1))); if (js_ctx->h_replacer) { /* XXX: Here a "slice copy" would be useful. */ DUK_DDD(DUK_DDDPRINT("replacer is set, call replacer")); duk_push_hobject(thr, js_ctx->h_replacer); /* -> [ ... key val replacer ] */ duk_dup(thr, idx_holder); /* -> [ ... key val replacer holder ] */ duk_dup_m4(thr); /* -> [ ... key val replacer holder key ] */ duk_dup_m4(thr); /* -> [ ... key val replacer holder key val ] */ duk_call_method(thr, 2); /* -> [ ... key val val' ] */ duk_remove_m2(thr); /* -> [ ... key val' ] */ } /* [ ... key val ] */ DUK_DDD(DUK_DDDPRINT("value=%!T", (duk_tval *) duk_get_tval(thr, -1))); tv = DUK_GET_TVAL_NEGIDX(thr, -1); if (DUK_TVAL_IS_OBJECT(tv)) { duk_hobject *h; h = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h != NULL); #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) #if defined(DUK_USE_JX) || defined(DUK_USE_JC) if (DUK_HOBJECT_IS_BUFOBJ(h) && js_ctx->flags & (DUK_JSON_FLAG_EXT_CUSTOM | DUK_JSON_FLAG_EXT_COMPATIBLE)) { /* With JX/JC a bufferobject gets serialized specially. */ duk_hbufobj *h_bufobj; h_bufobj = (duk_hbufobj *) h; DUK_ASSERT_HBUFOBJ_VALID(h_bufobj); duk__enc_bufobj(js_ctx, h_bufobj); goto pop2_emitted; } /* Otherwise bufferobjects get serialized as normal objects. */ #endif /* JX || JC */ #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ c = (duk_small_int_t) DUK_HOBJECT_GET_CLASS_NUMBER(h); switch (c) { case DUK_HOBJECT_CLASS_NUMBER: { DUK_DDD(DUK_DDDPRINT("value is a Number object -> coerce with ToNumber()")); duk_to_number_m1(thr); /* The coercion potentially invokes user .valueOf() and .toString() * but can't result in a function value because ToPrimitive() would * reject such a result: test-dev-json-stringify-coercion-1.js. */ DUK_ASSERT(!duk_is_callable(thr, -1)); break; } case DUK_HOBJECT_CLASS_STRING: { DUK_DDD(DUK_DDDPRINT("value is a String object -> coerce with ToString()")); duk_to_string(thr, -1); /* Same coercion behavior as for Number. */ DUK_ASSERT(!duk_is_callable(thr, -1)); break; } #if defined(DUK_USE_JX) || defined(DUK_USE_JC) case DUK_HOBJECT_CLASS_POINTER: #endif case DUK_HOBJECT_CLASS_BOOLEAN: { DUK_DDD(DUK_DDDPRINT("value is a Boolean/Buffer/Pointer object -> get internal value")); duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VALUE); duk_remove_m2(thr); break; } default: { /* Normal object which doesn't get automatically coerced to a * primitive value. Functions are checked for specially. The * primitive value coercions for Number, String, Pointer, and * Boolean can't result in functions so suffices to check here. * Symbol objects are handled like plain objects (their primitive * value is NOT looked up like for e.g. String objects). */ DUK_ASSERT(h != NULL); if (DUK_HOBJECT_IS_CALLABLE(h)) { #if defined(DUK_USE_JX) || defined(DUK_USE_JC) if (js_ctx->flags & (DUK_JSON_FLAG_EXT_CUSTOM | DUK_JSON_FLAG_EXT_COMPATIBLE)) { /* We only get here when doing non-standard JSON encoding */ DUK_DDD(DUK_DDDPRINT("-> function allowed, serialize to custom format")); DUK_ASSERT(js_ctx->flag_ext_custom || js_ctx->flag_ext_compatible); DUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_function); goto pop2_emitted; } else { DUK_DDD(DUK_DDDPRINT("-> will result in undefined (function)")); goto pop2_undef; } #else /* DUK_USE_JX || DUK_USE_JC */ DUK_DDD(DUK_DDDPRINT("-> will result in undefined (function)")); goto pop2_undef; #endif /* DUK_USE_JX || DUK_USE_JC */ } } } /* end switch */ } /* [ ... key val ] */ DUK_DDD(DUK_DDDPRINT("value=%!T", (duk_tval *) duk_get_tval(thr, -1))); if (duk_check_type_mask(thr, -1, js_ctx->mask_for_undefined)) { /* will result in undefined */ DUK_DDD(DUK_DDDPRINT("-> will result in undefined (type mask check)")); goto pop2_undef; } tv = DUK_GET_TVAL_NEGIDX(thr, -1); switch (DUK_TVAL_GET_TAG(tv)) { #if defined(DUK_USE_JX) || defined(DUK_USE_JC) /* When JX/JC not in use, the type mask above will avoid this case if needed. */ case DUK_TAG_UNDEFINED: { DUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_undefined); break; } #endif case DUK_TAG_NULL: { DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL); break; } case DUK_TAG_BOOLEAN: { DUK__EMIT_STRIDX(js_ctx, DUK_TVAL_GET_BOOLEAN(tv) ? DUK_STRIDX_TRUE : DUK_STRIDX_FALSE); break; } #if defined(DUK_USE_JX) || defined(DUK_USE_JC) /* When JX/JC not in use, the type mask above will avoid this case if needed. */ case DUK_TAG_POINTER: { duk__enc_pointer(js_ctx, DUK_TVAL_GET_POINTER(tv)); break; } #endif /* DUK_USE_JX || DUK_USE_JC */ case DUK_TAG_STRING: { duk_hstring *h = DUK_TVAL_GET_STRING(tv); DUK_ASSERT(h != NULL); if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) { goto pop2_undef; } duk__enc_quote_string(js_ctx, h); break; } case DUK_TAG_OBJECT: { duk_hobject *h = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h != NULL); /* Function values are handled completely above (including * coercion results): */ DUK_ASSERT(!DUK_HOBJECT_IS_CALLABLE(h)); if (DUK_HOBJECT_GET_CLASS_NUMBER(h) == DUK_HOBJECT_CLASS_ARRAY) { duk__enc_array(js_ctx); } else { duk__enc_object(js_ctx); } break; } /* Because plain buffers mimics Uint8Array, they have enumerable * index properties [0,byteLength[. Because JSON only serializes * enumerable own properties, no properties can be serialized for * plain buffers (all virtual properties are non-enumerable). However, * there may be a .toJSON() method which was already handled above. */ case DUK_TAG_BUFFER: { #if defined(DUK_USE_JX) || defined(DUK_USE_JC) if (js_ctx->flag_ext_custom_or_compatible) { duk__enc_buffer_jx_jc(js_ctx, DUK_TVAL_GET_BUFFER(tv)); break; } #endif /* Could implement a fastpath, but the fast path would need * to handle realloc side effects correctly. */ duk_to_object(thr, -1); duk__enc_object(js_ctx); break; } case DUK_TAG_LIGHTFUNC: { #if defined(DUK_USE_JX) || defined(DUK_USE_JC) /* We only get here when doing non-standard JSON encoding */ DUK_ASSERT(js_ctx->flag_ext_custom || js_ctx->flag_ext_compatible); DUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_function); #else /* Standard JSON omits functions */ DUK_UNREACHABLE(); #endif break; } #if defined(DUK_USE_FASTINT) case DUK_TAG_FASTINT: /* Number serialization has a significant impact relative to * other fast path code, so careful fast path for fastints. */ duk__enc_fastint_tval(js_ctx, tv); break; #endif default: { /* number */ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv)); DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); /* XXX: A fast path for usual integers would be useful when * fastint support is not enabled. */ duk__enc_double(js_ctx); break; } } #if defined(DUK_USE_JX) || defined(DUK_USE_JC) pop2_emitted: #endif duk_pop_2(thr); /* [ ... key val ] -> [ ... ] */ return 1; /* emitted */ pop2_undef: duk_pop_2(thr); /* [ ... key val ] -> [ ... ] */ return 0; /* not emitted */ } /* E5 Section 15.12.3, main algorithm, step 4.b.ii steps 1-4. */ DUK_LOCAL duk_bool_t duk__enc_allow_into_proplist(duk_tval *tv) { duk_small_int_t c; /* XXX: some kind of external internal type checker? * - type mask; symbol flag; class mask */ DUK_ASSERT(tv != NULL); if (DUK_TVAL_IS_STRING(tv)) { duk_hstring *h; h = DUK_TVAL_GET_STRING(tv); DUK_ASSERT(h != NULL); if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) { return 0; } return 1; } else if (DUK_TVAL_IS_NUMBER(tv)) { return 1; } else if (DUK_TVAL_IS_OBJECT(tv)) { duk_hobject *h; h = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h != NULL); c = (duk_small_int_t) DUK_HOBJECT_GET_CLASS_NUMBER(h); if (c == DUK_HOBJECT_CLASS_STRING || c == DUK_HOBJECT_CLASS_NUMBER) { return 1; } } return 0; } /* * JSON.stringify() fast path * * Otherwise supports full JSON, JX, and JC features, but bails out on any * possible side effect which might change the value being serialized. The * fast path can take advantage of the fact that the value being serialized * is unchanged so that we can walk directly through property tables etc. */ #if defined(DUK_USE_JSON_STRINGIFY_FASTPATH) DUK_LOCAL duk_bool_t duk__json_stringify_fast_value(duk_json_enc_ctx *js_ctx, duk_tval *tv) { duk_uint_fast32_t i, n; DUK_DDD(DUK_DDDPRINT("stringify fast: %!T", tv)); DUK_ASSERT(js_ctx != NULL); DUK_ASSERT(js_ctx->thr != NULL); #if 0 /* disabled for now */ restart_match: #endif DUK_ASSERT(tv != NULL); switch (DUK_TVAL_GET_TAG(tv)) { case DUK_TAG_UNDEFINED: { #if defined(DUK_USE_JX) || defined(DUK_USE_JC) if (js_ctx->flag_ext_custom || js_ctx->flag_ext_compatible) { DUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_undefined); break; } else { goto emit_undefined; } #else goto emit_undefined; #endif } case DUK_TAG_NULL: { DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL); break; } case DUK_TAG_BOOLEAN: { DUK__EMIT_STRIDX(js_ctx, DUK_TVAL_GET_BOOLEAN(tv) ? DUK_STRIDX_TRUE : DUK_STRIDX_FALSE); break; } case DUK_TAG_STRING: { duk_hstring *h; h = DUK_TVAL_GET_STRING(tv); DUK_ASSERT(h != NULL); if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) { goto emit_undefined; } duk__enc_quote_string(js_ctx, h); break; } case DUK_TAG_OBJECT: { duk_hobject *obj; duk_tval *tv_val; duk_bool_t emitted = 0; duk_uint32_t c_bit, c_all, c_array, c_unbox, c_undef, c_func, c_bufobj, c_object, c_abort; /* For objects JSON.stringify() only looks for own, enumerable * properties which is nice for the fast path here. * * For arrays JSON.stringify() uses [[Get]] so it will actually * inherit properties during serialization! This fast path * supports gappy arrays as long as there's no actual inherited * property (which might be a getter etc). * * Since recursion only happens for objects, we can have both * recursion and loop checks here. We use a simple, depth-limited * loop check in the fast path because the object-based tracking * is very slow (when tested, it accounted for 50% of fast path * execution time for input data with a lot of small objects!). */ /* XXX: for real world code, could just ignore array inheritance * and only look at array own properties. */ /* We rely on a few object flag / class number relationships here, * assert for them. */ obj = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(obj != NULL); DUK_ASSERT_HOBJECT_VALID(obj); /* Once recursion depth is increased, exit path must decrease * it (though it's OK to abort the fast path). */ DUK_ASSERT_DISABLE(js_ctx->recursion_depth >= 0); /* unsigned */ DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit); if (js_ctx->recursion_depth >= js_ctx->recursion_limit) { DUK_DD(DUK_DDPRINT("fast path recursion limit")); DUK_ERROR_RANGE(js_ctx->thr, DUK_STR_JSONDEC_RECLIMIT); } for (i = 0, n = (duk_uint_fast32_t) js_ctx->recursion_depth; i < n; i++) { if (DUK_UNLIKELY(js_ctx->visiting[i] == obj)) { DUK_DD(DUK_DDPRINT("fast path loop detect")); DUK_ERROR_TYPE(js_ctx->thr, DUK_STR_CYCLIC_INPUT); } } /* Guaranteed by recursion_limit setup so we don't have to * check twice. */ DUK_ASSERT(js_ctx->recursion_depth < DUK_JSON_ENC_LOOPARRAY); js_ctx->visiting[js_ctx->recursion_depth] = obj; js_ctx->recursion_depth++; /* If object has a .toJSON() property, we can't be certain * that it wouldn't mutate any value arbitrarily, so bail * out of the fast path. * * If an object is a Proxy we also can't avoid side effects * so abandon. */ /* XXX: non-callable .toJSON() doesn't need to cause an abort * but does at the moment, probably not worth fixing. */ if (duk_hobject_hasprop_raw(js_ctx->thr, obj, DUK_HTHREAD_STRING_TO_JSON(js_ctx->thr)) || DUK_HOBJECT_IS_PROXY(obj)) { DUK_DD(DUK_DDPRINT("object has a .toJSON property or object is a Proxy, abort fast path")); goto abort_fastpath; } /* We could use a switch-case for the class number but it turns out * a small if-else ladder on class masks is better. The if-ladder * should be in order of relevancy. */ /* XXX: move masks to js_ctx? they don't change during one * fast path invocation. */ DUK_ASSERT(DUK_HOBJECT_CLASS_MAX <= 31); #if defined(DUK_USE_JX) || defined(DUK_USE_JC) if (js_ctx->flag_ext_custom_or_compatible) { c_all = DUK_HOBJECT_CMASK_ALL; c_array = DUK_HOBJECT_CMASK_ARRAY; c_unbox = DUK_HOBJECT_CMASK_NUMBER | DUK_HOBJECT_CMASK_STRING | DUK_HOBJECT_CMASK_BOOLEAN | DUK_HOBJECT_CMASK_POINTER; /* Symbols are not unboxed. */ c_func = DUK_HOBJECT_CMASK_FUNCTION; c_bufobj = DUK_HOBJECT_CMASK_ALL_BUFOBJS; c_undef = 0; c_abort = 0; c_object = c_all & ~(c_array | c_unbox | c_func | c_bufobj | c_undef | c_abort); } else #endif { c_all = DUK_HOBJECT_CMASK_ALL; c_array = DUK_HOBJECT_CMASK_ARRAY; c_unbox = DUK_HOBJECT_CMASK_NUMBER | DUK_HOBJECT_CMASK_STRING | DUK_HOBJECT_CMASK_BOOLEAN; /* Symbols are not unboxed. */ c_func = 0; c_bufobj = 0; c_undef = DUK_HOBJECT_CMASK_FUNCTION | DUK_HOBJECT_CMASK_POINTER; /* As the fast path doesn't currently properly support * duk_hbufobj virtual properties, abort fast path if * we encounter them in plain JSON mode. */ c_abort = DUK_HOBJECT_CMASK_ALL_BUFOBJS; c_object = c_all & ~(c_array | c_unbox | c_func | c_bufobj | c_undef | c_abort); } c_bit = (duk_uint32_t) DUK_HOBJECT_GET_CLASS_MASK(obj); if (c_bit & c_object) { /* All other object types. */ DUK__EMIT_1(js_ctx, DUK_ASC_LCURLY); /* A non-Array object should not have an array part in practice. * But since it is supported internally (and perhaps used at some * point), check and abandon if that's the case. */ if (DUK_HOBJECT_HAS_ARRAY_PART(obj)) { DUK_DD(DUK_DDPRINT("non-Array object has array part, abort fast path")); goto abort_fastpath; } for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ENEXT(obj); i++) { duk_hstring *k; duk_size_t prev_size; k = DUK_HOBJECT_E_GET_KEY(js_ctx->thr->heap, obj, i); if (!k) { continue; } if (DUK_HSTRING_HAS_ARRIDX(k)) { /* If an object has array index keys we would need * to sort them into the ES2015 enumeration order to * be consistent with the slow path. Abort the fast * path and handle in the slow path for now. */ DUK_DD(DUK_DDPRINT("property key is an array index, abort fast path")); goto abort_fastpath; } if (!DUK_HOBJECT_E_SLOT_IS_ENUMERABLE(js_ctx->thr->heap, obj, i)) { continue; } if (DUK_HOBJECT_E_SLOT_IS_ACCESSOR(js_ctx->thr->heap, obj, i)) { /* Getter might have arbitrary side effects, * so bail out. */ DUK_DD(DUK_DDPRINT("property is an accessor, abort fast path")); goto abort_fastpath; } if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(k))) { continue; } tv_val = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(js_ctx->thr->heap, obj, i); prev_size = DUK_BW_GET_SIZE(js_ctx->thr, &js_ctx->bw); if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) { duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth); duk__enc_key_autoquote(js_ctx, k); DUK__EMIT_2(js_ctx, DUK_ASC_COLON, DUK_ASC_SPACE); } else { duk__enc_key_autoquote(js_ctx, k); DUK__EMIT_1(js_ctx, DUK_ASC_COLON); } if (duk__json_stringify_fast_value(js_ctx, tv_val) == 0) { DUK_DD(DUK_DDPRINT("prop value not supported, rewind key and colon")); DUK_BW_SET_SIZE(js_ctx->thr, &js_ctx->bw, prev_size); } else { DUK__EMIT_1(js_ctx, DUK_ASC_COMMA); emitted = 1; } } /* If any non-Array value had enumerable virtual own * properties, they should be serialized here (actually, * before the explicit properties). Standard types don't. */ if (emitted) { DUK_ASSERT(*((duk_uint8_t *) DUK_BW_GET_PTR(js_ctx->thr, &js_ctx->bw) - 1) == DUK_ASC_COMMA); DUK__UNEMIT_1(js_ctx); /* eat trailing comma */ if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) { DUK_ASSERT(js_ctx->recursion_depth >= 1); duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth - 1U); } } DUK__EMIT_1(js_ctx, DUK_ASC_RCURLY); } else if (c_bit & c_array) { duk_uint_fast32_t arr_len; duk_uint_fast32_t asize; DUK__EMIT_1(js_ctx, DUK_ASC_LBRACKET); /* Assume arrays are dense in the fast path. */ if (!DUK_HOBJECT_HAS_ARRAY_PART(obj)) { DUK_DD(DUK_DDPRINT("Array object is sparse, abort fast path")); goto abort_fastpath; } arr_len = (duk_uint_fast32_t) ((duk_harray *) obj)->length; asize = (duk_uint_fast32_t) DUK_HOBJECT_GET_ASIZE(obj); /* Array part may be larger than 'length'; if so, iterate * only up to array 'length'. Array part may also be smaller * than 'length' in some cases. */ for (i = 0; i < arr_len; i++) { duk_tval *tv_arrval; duk_hstring *h_tmp; duk_bool_t has_inherited; if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) { duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth); } if (DUK_LIKELY(i < asize)) { tv_arrval = DUK_HOBJECT_A_GET_VALUE_PTR(js_ctx->thr->heap, obj, i); if (DUK_LIKELY(!DUK_TVAL_IS_UNUSED(tv_arrval))) { /* Expected case: element is present. */ if (duk__json_stringify_fast_value(js_ctx, tv_arrval) == 0) { DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL); } goto elem_done; } } /* Gap in array; check for inherited property, * bail out if one exists. This should be enough * to support gappy arrays for all practical code. */ h_tmp = duk_push_uint_to_hstring(js_ctx->thr, (duk_uint_t) i); has_inherited = duk_hobject_hasprop_raw(js_ctx->thr, obj, h_tmp); duk_pop(js_ctx->thr); if (has_inherited) { DUK_D(DUK_DPRINT("gap in array, conflicting inherited property, abort fast path")); goto abort_fastpath; } /* Ordinary gap, undefined encodes to 'null' in * standard JSON, but JX/JC use their form for * undefined to better preserve the typing. */ DUK_D(DUK_DPRINT("gap in array, no conflicting inherited property, remain on fast path")); #if defined(DUK_USE_JX) DUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_undefined); #else DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL); #endif /* fall through */ elem_done: DUK__EMIT_1(js_ctx, DUK_ASC_COMMA); emitted = 1; } if (emitted) { DUK_ASSERT(*((duk_uint8_t *) DUK_BW_GET_PTR(js_ctx->thr, &js_ctx->bw) - 1) == DUK_ASC_COMMA); DUK__UNEMIT_1(js_ctx); /* eat trailing comma */ if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) { DUK_ASSERT(js_ctx->recursion_depth >= 1); duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth - 1U); } } DUK__EMIT_1(js_ctx, DUK_ASC_RBRACKET); } else if (c_bit & c_unbox) { /* Certain boxed types are required to go through * automatic unboxing. Rely on internal value being * sane (to avoid infinite recursion). */ DUK_ASSERT((c_bit & DUK_HOBJECT_CMASK_SYMBOL) == 0); /* Symbols are not unboxed. */ #if 1 /* The code below is incorrect if .toString() or .valueOf() have * have been overridden. The correct approach would be to look up * the method(s) and if they resolve to the built-in function we * can safely bypass it and look up the internal value directly. * Unimplemented for now, abort fast path for boxed values. */ goto abort_fastpath; #else /* disabled */ /* Disabled until fixed, see above. */ duk_tval *tv_internal; DUK_DD(DUK_DDPRINT("auto unboxing in fast path")); tv_internal = duk_hobject_get_internal_value_tval_ptr(js_ctx->thr->heap, obj); DUK_ASSERT(tv_internal != NULL); DUK_ASSERT(DUK_TVAL_IS_STRING(tv_internal) || DUK_TVAL_IS_NUMBER(tv_internal) || DUK_TVAL_IS_BOOLEAN(tv_internal) || DUK_TVAL_IS_POINTER(tv_internal)); tv = tv_internal; DUK_ASSERT(js_ctx->recursion_depth > 0); js_ctx->recursion_depth--; /* required to keep recursion depth correct */ goto restart_match; #endif /* disabled */ #if defined(DUK_USE_JX) || defined(DUK_USE_JC) } else if (c_bit & c_func) { DUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_function); #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) } else if (c_bit & c_bufobj) { duk__enc_bufobj(js_ctx, (duk_hbufobj *) obj); #endif #endif } else if (c_bit & c_abort) { DUK_DD(DUK_DDPRINT("abort fast path for unsupported type")); goto abort_fastpath; } else { DUK_ASSERT((c_bit & c_undef) != 0); /* Must decrease recursion depth before returning. */ DUK_ASSERT(js_ctx->recursion_depth > 0); DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit); js_ctx->recursion_depth--; goto emit_undefined; } DUK_ASSERT(js_ctx->recursion_depth > 0); DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit); js_ctx->recursion_depth--; break; } case DUK_TAG_BUFFER: { /* Plain buffers are treated like Uint8Arrays: they have * enumerable indices. Other virtual properties are not * enumerable, and inherited properties are not serialized. * However, there can be a replacer (not relevant here) or * a .toJSON() method (which we need to check for explicitly). */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) if (duk_hobject_hasprop_raw(js_ctx->thr, js_ctx->thr->builtins[DUK_BIDX_UINT8ARRAY_PROTOTYPE], DUK_HTHREAD_STRING_TO_JSON(js_ctx->thr))) { DUK_DD(DUK_DDPRINT("value is a plain buffer and there's an inherited .toJSON, abort fast path")); goto abort_fastpath; } #endif #if defined(DUK_USE_JX) || defined(DUK_USE_JC) if (js_ctx->flag_ext_custom_or_compatible) { duk__enc_buffer_jx_jc(js_ctx, DUK_TVAL_GET_BUFFER(tv)); break; } #endif /* Plain buffers mimic Uint8Arrays, and have enumerable index * properties. */ duk__enc_buffer_json_fastpath(js_ctx, DUK_TVAL_GET_BUFFER(tv)); break; } case DUK_TAG_POINTER: { #if defined(DUK_USE_JX) || defined(DUK_USE_JC) if (js_ctx->flag_ext_custom_or_compatible) { duk__enc_pointer(js_ctx, DUK_TVAL_GET_POINTER(tv)); break; } else { goto emit_undefined; } #else goto emit_undefined; #endif } case DUK_TAG_LIGHTFUNC: { /* A lightfunc might also inherit a .toJSON() so just bail out. */ /* XXX: Could just lookup .toJSON() and continue in fast path, * as it would almost never be defined. */ DUK_DD(DUK_DDPRINT("value is a lightfunc, abort fast path")); goto abort_fastpath; } #if defined(DUK_USE_FASTINT) case DUK_TAG_FASTINT: { /* Number serialization has a significant impact relative to * other fast path code, so careful fast path for fastints. */ duk__enc_fastint_tval(js_ctx, tv); break; } #endif default: { /* XXX: A fast path for usual integers would be useful when * fastint support is not enabled. */ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv)); DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); /* XXX: Stack discipline is annoying, could be changed in numconv. */ duk_push_tval(js_ctx->thr, tv); duk__enc_double(js_ctx); duk_pop(js_ctx->thr); #if 0 /* Could also rely on native sprintf(), but it will handle * values like NaN, Infinity, -0, exponent notation etc in * a JSON-incompatible way. */ duk_double_t d; char buf[64]; DUK_ASSERT(DUK_TVAL_IS_DOUBLE(tv)); d = DUK_TVAL_GET_DOUBLE(tv); DUK_SPRINTF(buf, "%lg", d); DUK__EMIT_CSTR(js_ctx, buf); #endif } } return 1; /* not undefined */ emit_undefined: return 0; /* value was undefined/unsupported */ abort_fastpath: /* Error message doesn't matter: the error is ignored anyway. */ DUK_DD(DUK_DDPRINT("aborting fast path")); DUK_ERROR_INTERNAL(js_ctx->thr); return 0; /* unreachable */ } DUK_LOCAL duk_ret_t duk__json_stringify_fast(duk_hthread *thr, void *udata) { duk_json_enc_ctx *js_ctx; duk_tval *tv; DUK_ASSERT(thr != NULL); DUK_ASSERT(udata != NULL); js_ctx = (duk_json_enc_ctx *) udata; DUK_ASSERT(js_ctx != NULL); tv = DUK_GET_TVAL_NEGIDX(thr, -1); if (duk__json_stringify_fast_value(js_ctx, tv) == 0) { DUK_DD(DUK_DDPRINT("top level value not supported, fail fast path")); DUK_DCERROR_TYPE_INVALID_ARGS(thr); /* Error message is ignored, so doesn't matter. */ } return 0; } #endif /* DUK_USE_JSON_STRINGIFY_FASTPATH */ /* * Top level wrappers */ DUK_INTERNAL void duk_bi_json_parse_helper(duk_hthread *thr, duk_idx_t idx_value, duk_idx_t idx_reviver, duk_small_uint_t flags) { duk_json_dec_ctx js_ctx_alloc; duk_json_dec_ctx *js_ctx = &js_ctx_alloc; duk_hstring *h_text; #if defined(DUK_USE_ASSERTIONS) duk_idx_t entry_top = duk_get_top(thr); #endif /* negative top-relative indices not allowed now */ DUK_ASSERT(idx_value == DUK_INVALID_INDEX || idx_value >= 0); DUK_ASSERT(idx_reviver == DUK_INVALID_INDEX || idx_reviver >= 0); DUK_DDD(DUK_DDDPRINT("JSON parse start: text=%!T, reviver=%!T, flags=0x%08lx, stack_top=%ld", (duk_tval *) duk_get_tval(thr, idx_value), (duk_tval *) duk_get_tval(thr, idx_reviver), (unsigned long) flags, (long) duk_get_top(thr))); DUK_MEMZERO(&js_ctx_alloc, sizeof(js_ctx_alloc)); js_ctx->thr = thr; #if defined(DUK_USE_EXPLICIT_NULL_INIT) /* nothing now */ #endif js_ctx->recursion_limit = DUK_USE_JSON_DEC_RECLIMIT; DUK_ASSERT(js_ctx->recursion_depth == 0); /* Flag handling currently assumes that flags are consistent. This is OK * because the call sites are now strictly controlled. */ js_ctx->flags = flags; #if defined(DUK_USE_JX) js_ctx->flag_ext_custom = flags & DUK_JSON_FLAG_EXT_CUSTOM; #endif #if defined(DUK_USE_JC) js_ctx->flag_ext_compatible = flags & DUK_JSON_FLAG_EXT_COMPATIBLE; #endif #if defined(DUK_USE_JX) || defined(DUK_USE_JC) js_ctx->flag_ext_custom_or_compatible = flags & (DUK_JSON_FLAG_EXT_CUSTOM | DUK_JSON_FLAG_EXT_COMPATIBLE); #endif h_text = duk_to_hstring(thr, idx_value); /* coerce in-place; rejects Symbols */ DUK_ASSERT(h_text != NULL); /* JSON parsing code is allowed to read [p_start,p_end]: p_end is * valid and points to the string NUL terminator (which is always * guaranteed for duk_hstrings. */ js_ctx->p_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_text); js_ctx->p = js_ctx->p_start; js_ctx->p_end = ((const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_text)) + DUK_HSTRING_GET_BYTELEN(h_text); DUK_ASSERT(*(js_ctx->p_end) == 0x00); duk__dec_value(js_ctx); /* -> [ ... value ] */ /* Trailing whitespace has been eaten by duk__dec_value(), so if * we're not at end of input here, it's a SyntaxError. */ if (js_ctx->p != js_ctx->p_end) { duk__dec_syntax_error(js_ctx); } if (duk_is_callable(thr, idx_reviver)) { DUK_DDD(DUK_DDDPRINT("applying reviver: %!T", (duk_tval *) duk_get_tval(thr, idx_reviver))); js_ctx->idx_reviver = idx_reviver; duk_push_object(thr); duk_dup_m2(thr); /* -> [ ... val root val ] */ duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_EMPTY_STRING); /* default attrs ok */ duk_push_hstring_stridx(thr, DUK_STRIDX_EMPTY_STRING); /* -> [ ... val root "" ] */ DUK_DDD(DUK_DDDPRINT("start reviver walk, root=%!T, name=%!T", (duk_tval *) duk_get_tval(thr, -2), (duk_tval *) duk_get_tval(thr, -1))); duk__dec_reviver_walk(js_ctx); /* [ ... val root "" ] -> [ ... val val' ] */ duk_remove_m2(thr); /* -> [ ... val' ] */ } else { DUK_DDD(DUK_DDDPRINT("reviver does not exist or is not callable: %!T", (duk_tval *) duk_get_tval(thr, idx_reviver))); } /* Final result is at stack top. */ DUK_DDD(DUK_DDDPRINT("JSON parse end: text=%!T, reviver=%!T, flags=0x%08lx, result=%!T, stack_top=%ld", (duk_tval *) duk_get_tval(thr, idx_value), (duk_tval *) duk_get_tval(thr, idx_reviver), (unsigned long) flags, (duk_tval *) duk_get_tval(thr, -1), (long) duk_get_top(thr))); DUK_ASSERT(duk_get_top(thr) == entry_top + 1); } DUK_INTERNAL void duk_bi_json_stringify_helper(duk_hthread *thr, duk_idx_t idx_value, duk_idx_t idx_replacer, duk_idx_t idx_space, duk_small_uint_t flags) { duk_json_enc_ctx js_ctx_alloc; duk_json_enc_ctx *js_ctx = &js_ctx_alloc; duk_hobject *h; duk_idx_t idx_holder; duk_idx_t entry_top; /* negative top-relative indices not allowed now */ DUK_ASSERT(idx_value == DUK_INVALID_INDEX || idx_value >= 0); DUK_ASSERT(idx_replacer == DUK_INVALID_INDEX || idx_replacer >= 0); DUK_ASSERT(idx_space == DUK_INVALID_INDEX || idx_space >= 0); DUK_DDD(DUK_DDDPRINT("JSON stringify start: value=%!T, replacer=%!T, space=%!T, flags=0x%08lx, stack_top=%ld", (duk_tval *) duk_get_tval(thr, idx_value), (duk_tval *) duk_get_tval(thr, idx_replacer), (duk_tval *) duk_get_tval(thr, idx_space), (unsigned long) flags, (long) duk_get_top(thr))); entry_top = duk_get_top(thr); /* * Context init */ DUK_MEMZERO(&js_ctx_alloc, sizeof(js_ctx_alloc)); js_ctx->thr = thr; #if defined(DUK_USE_EXPLICIT_NULL_INIT) js_ctx->h_replacer = NULL; js_ctx->h_gap = NULL; #endif js_ctx->idx_proplist = -1; /* Flag handling currently assumes that flags are consistent. This is OK * because the call sites are now strictly controlled. */ js_ctx->flags = flags; js_ctx->flag_ascii_only = flags & DUK_JSON_FLAG_ASCII_ONLY; js_ctx->flag_avoid_key_quotes = flags & DUK_JSON_FLAG_AVOID_KEY_QUOTES; #if defined(DUK_USE_JX) js_ctx->flag_ext_custom = flags & DUK_JSON_FLAG_EXT_CUSTOM; #endif #if defined(DUK_USE_JC) js_ctx->flag_ext_compatible = flags & DUK_JSON_FLAG_EXT_COMPATIBLE; #endif #if defined(DUK_USE_JX) || defined(DUK_USE_JC) js_ctx->flag_ext_custom_or_compatible = flags & (DUK_JSON_FLAG_EXT_CUSTOM | DUK_JSON_FLAG_EXT_COMPATIBLE); #endif /* The #if defined() clutter here handles the JX/JC enable/disable * combinations properly. */ #if defined(DUK_USE_JX) || defined(DUK_USE_JC) js_ctx->stridx_custom_undefined = DUK_STRIDX_LC_NULL; /* standard JSON; array gaps */ #if defined(DUK_USE_JX) if (flags & DUK_JSON_FLAG_EXT_CUSTOM) { js_ctx->stridx_custom_undefined = DUK_STRIDX_LC_UNDEFINED; js_ctx->stridx_custom_nan = DUK_STRIDX_NAN; js_ctx->stridx_custom_neginf = DUK_STRIDX_MINUS_INFINITY; js_ctx->stridx_custom_posinf = DUK_STRIDX_INFINITY; js_ctx->stridx_custom_function = (flags & DUK_JSON_FLAG_AVOID_KEY_QUOTES) ? DUK_STRIDX_JSON_EXT_FUNCTION2 : DUK_STRIDX_JSON_EXT_FUNCTION1; } #endif /* DUK_USE_JX */ #if defined(DUK_USE_JX) && defined(DUK_USE_JC) else #endif /* DUK_USE_JX && DUK_USE_JC */ #if defined(DUK_USE_JC) if (js_ctx->flags & DUK_JSON_FLAG_EXT_COMPATIBLE) { js_ctx->stridx_custom_undefined = DUK_STRIDX_JSON_EXT_UNDEFINED; js_ctx->stridx_custom_nan = DUK_STRIDX_JSON_EXT_NAN; js_ctx->stridx_custom_neginf = DUK_STRIDX_JSON_EXT_NEGINF; js_ctx->stridx_custom_posinf = DUK_STRIDX_JSON_EXT_POSINF; js_ctx->stridx_custom_function = DUK_STRIDX_JSON_EXT_FUNCTION1; } #endif /* DUK_USE_JC */ #endif /* DUK_USE_JX || DUK_USE_JC */ #if defined(DUK_USE_JX) || defined(DUK_USE_JC) if (js_ctx->flags & (DUK_JSON_FLAG_EXT_CUSTOM | DUK_JSON_FLAG_EXT_COMPATIBLE)) { DUK_ASSERT(js_ctx->mask_for_undefined == 0); /* already zero */ } else #endif /* DUK_USE_JX || DUK_USE_JC */ { /* Plain buffer is treated like ArrayBuffer and serialized. * Lightfuncs are treated like objects, but JSON explicitly * skips serializing Function objects so we can just reject * lightfuncs here. */ js_ctx->mask_for_undefined = DUK_TYPE_MASK_UNDEFINED | DUK_TYPE_MASK_POINTER | DUK_TYPE_MASK_LIGHTFUNC; } DUK_BW_INIT_PUSHBUF(thr, &js_ctx->bw, DUK__JSON_STRINGIFY_BUFSIZE); js_ctx->idx_loop = duk_push_bare_object(thr); DUK_ASSERT(js_ctx->idx_loop >= 0); /* [ ... buf loop ] */ /* * Process replacer/proplist (2nd argument to JSON.stringify) */ h = duk_get_hobject(thr, idx_replacer); if (h != NULL) { if (DUK_HOBJECT_IS_CALLABLE(h)) { js_ctx->h_replacer = h; } else if (DUK_HOBJECT_GET_CLASS_NUMBER(h) == DUK_HOBJECT_CLASS_ARRAY) { /* Here the specification requires correct array index enumeration * which is a bit tricky for sparse arrays (it is handled by the * enum setup code). We now enumerate ancestors too, although the * specification is not very clear on whether that is required. */ duk_uarridx_t plist_idx = 0; duk_small_uint_t enum_flags; js_ctx->idx_proplist = duk_push_array(thr); /* XXX: array internal? */ enum_flags = DUK_ENUM_ARRAY_INDICES_ONLY | DUK_ENUM_SORT_ARRAY_INDICES; /* expensive flag */ duk_enum(thr, idx_replacer, enum_flags); while (duk_next(thr, -1 /*enum_index*/, 1 /*get_value*/)) { /* [ ... proplist enum_obj key val ] */ if (duk__enc_allow_into_proplist(duk_get_tval(thr, -1))) { /* XXX: duplicates should be eliminated here */ DUK_DDD(DUK_DDDPRINT("proplist enum: key=%!T, val=%!T --> accept", (duk_tval *) duk_get_tval(thr, -2), (duk_tval *) duk_get_tval(thr, -1))); duk_to_string(thr, -1); /* extra coercion of strings is OK */ duk_put_prop_index(thr, -4, plist_idx); /* -> [ ... proplist enum_obj key ] */ plist_idx++; duk_pop(thr); } else { DUK_DDD(DUK_DDDPRINT("proplist enum: key=%!T, val=%!T --> reject", (duk_tval *) duk_get_tval(thr, -2), (duk_tval *) duk_get_tval(thr, -1))); duk_pop_2(thr); } } duk_pop(thr); /* pop enum */ /* [ ... proplist ] */ } } /* [ ... buf loop (proplist) ] */ /* * Process space (3rd argument to JSON.stringify) */ h = duk_get_hobject(thr, idx_space); if (h != NULL) { duk_small_uint_t c = DUK_HOBJECT_GET_CLASS_NUMBER(h); if (c == DUK_HOBJECT_CLASS_NUMBER) { duk_to_number(thr, idx_space); } else if (c == DUK_HOBJECT_CLASS_STRING) { duk_to_string(thr, idx_space); } } if (duk_is_number(thr, idx_space)) { duk_small_int_t nspace; /* spaces[] must be static to allow initializer with old compilers like BCC */ static const char spaces[10] = { DUK_ASC_SPACE, DUK_ASC_SPACE, DUK_ASC_SPACE, DUK_ASC_SPACE, DUK_ASC_SPACE, DUK_ASC_SPACE, DUK_ASC_SPACE, DUK_ASC_SPACE, DUK_ASC_SPACE, DUK_ASC_SPACE }; /* XXX: helper */ /* ToInteger() coercion; NaN -> 0, infinities are clamped to 0 and 10 */ nspace = (duk_small_int_t) duk_to_int_clamped(thr, idx_space, 0 /*minval*/, 10 /*maxval*/); DUK_ASSERT(nspace >= 0 && nspace <= 10); duk_push_lstring(thr, spaces, (duk_size_t) nspace); js_ctx->h_gap = duk_known_hstring(thr, -1); DUK_ASSERT(js_ctx->h_gap != NULL); } else if (duk_is_string_notsymbol(thr, idx_space)) { duk_dup(thr, idx_space); duk_substring(thr, -1, 0, 10); /* clamp to 10 chars */ js_ctx->h_gap = duk_known_hstring(thr, -1); } else { /* nop */ } if (js_ctx->h_gap != NULL) { /* If gap is empty, behave as if not given at all. Check * against byte length because character length is more * expensive. */ if (DUK_HSTRING_GET_BYTELEN(js_ctx->h_gap) == 0) { js_ctx->h_gap = NULL; } } /* [ ... buf loop (proplist) (gap) ] */ /* * Fast path: assume no mutation, iterate object property tables * directly; bail out if that assumption doesn't hold. */ #if defined(DUK_USE_JSON_STRINGIFY_FASTPATH) if (js_ctx->h_replacer == NULL && /* replacer is a mutation risk */ js_ctx->idx_proplist == -1) { /* proplist is very rare */ duk_int_t pcall_rc; duk_small_uint_t prev_ms_base_flags; DUK_DD(DUK_DDPRINT("try JSON.stringify() fast path")); /* Use recursion_limit to ensure we don't overwrite js_ctx->visiting[] * array so we don't need two counter checks in the fast path. The * slow path has a much larger recursion limit which we'll use if * necessary. */ DUK_ASSERT(DUK_USE_JSON_ENC_RECLIMIT >= DUK_JSON_ENC_LOOPARRAY); js_ctx->recursion_limit = DUK_JSON_ENC_LOOPARRAY; DUK_ASSERT(js_ctx->recursion_depth == 0); /* Execute the fast path in a protected call. If any error is thrown, * fall back to the slow path. This includes e.g. recursion limit * because the fast path has a smaller recursion limit (and simpler, * limited loop detection). */ duk_dup(thr, idx_value); /* Must prevent finalizers which may have arbitrary side effects. */ prev_ms_base_flags = thr->heap->ms_base_flags; thr->heap->ms_base_flags |= DUK_MS_FLAG_NO_OBJECT_COMPACTION; /* Avoid attempt to compact any objects. */ thr->heap->pf_prevent_count++; /* Prevent finalizers. */ DUK_ASSERT(thr->heap->pf_prevent_count != 0); /* Wrap. */ pcall_rc = duk_safe_call(thr, duk__json_stringify_fast, (void *) js_ctx /*udata*/, 1 /*nargs*/, 0 /*nret*/); DUK_ASSERT(thr->heap->pf_prevent_count > 0); thr->heap->pf_prevent_count--; thr->heap->ms_base_flags = prev_ms_base_flags; if (pcall_rc == DUK_EXEC_SUCCESS) { DUK_DD(DUK_DDPRINT("fast path successful")); DUK_BW_PUSH_AS_STRING(thr, &js_ctx->bw); goto replace_finished; } /* We come here for actual aborts (like encountering .toJSON()) * but also for recursion/loop errors. Bufwriter size can be * kept because we'll probably need at least as much as we've * allocated so far. */ DUK_D(DUK_DPRINT("fast path failed, serialize using slow path instead")); DUK_BW_RESET_SIZE(thr, &js_ctx->bw); js_ctx->recursion_depth = 0; } #endif /* * Create wrapper object and serialize */ idx_holder = duk_push_object(thr); duk_dup(thr, idx_value); duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_EMPTY_STRING); DUK_DDD(DUK_DDDPRINT("before: flags=0x%08lx, loop=%!T, replacer=%!O, " "proplist=%!T, gap=%!O, holder=%!T", (unsigned long) js_ctx->flags, (duk_tval *) duk_get_tval(thr, js_ctx->idx_loop), (duk_heaphdr *) js_ctx->h_replacer, (duk_tval *) (js_ctx->idx_proplist >= 0 ? duk_get_tval(thr, js_ctx->idx_proplist) : NULL), (duk_heaphdr *) js_ctx->h_gap, (duk_tval *) duk_get_tval(thr, -1))); /* serialize the wrapper with empty string key */ duk_push_hstring_empty(thr); /* [ ... buf loop (proplist) (gap) holder "" ] */ js_ctx->recursion_limit = DUK_USE_JSON_ENC_RECLIMIT; DUK_ASSERT(js_ctx->recursion_depth == 0); if (DUK_UNLIKELY(duk__enc_value(js_ctx, idx_holder) == 0)) { /* [ ... holder key ] -> [ ... holder ] */ /* Result is undefined. */ duk_push_undefined(thr); } else { /* Convert buffer to result string. */ DUK_BW_PUSH_AS_STRING(thr, &js_ctx->bw); } DUK_DDD(DUK_DDDPRINT("after: flags=0x%08lx, loop=%!T, replacer=%!O, " "proplist=%!T, gap=%!O, holder=%!T", (unsigned long) js_ctx->flags, (duk_tval *) duk_get_tval(thr, js_ctx->idx_loop), (duk_heaphdr *) js_ctx->h_replacer, (duk_tval *) (js_ctx->idx_proplist >= 0 ? duk_get_tval(thr, js_ctx->idx_proplist) : NULL), (duk_heaphdr *) js_ctx->h_gap, (duk_tval *) duk_get_tval(thr, idx_holder))); /* The stack has a variable shape here, so force it to the * desired one explicitly. */ #if defined(DUK_USE_JSON_STRINGIFY_FASTPATH) replace_finished: #endif duk_replace(thr, entry_top); duk_set_top(thr, entry_top + 1); DUK_DDD(DUK_DDDPRINT("JSON stringify end: value=%!T, replacer=%!T, space=%!T, " "flags=0x%08lx, result=%!T, stack_top=%ld", (duk_tval *) duk_get_tval(thr, idx_value), (duk_tval *) duk_get_tval(thr, idx_replacer), (duk_tval *) duk_get_tval(thr, idx_space), (unsigned long) flags, (duk_tval *) duk_get_tval(thr, -1), (long) duk_get_top(thr))); DUK_ASSERT(duk_get_top(thr) == entry_top + 1); } #if defined(DUK_USE_JSON_BUILTIN) /* * Entry points */ DUK_INTERNAL duk_ret_t duk_bi_json_object_parse(duk_hthread *thr) { duk_bi_json_parse_helper(thr, 0 /*idx_value*/, 1 /*idx_replacer*/, 0 /*flags*/); return 1; } DUK_INTERNAL duk_ret_t duk_bi_json_object_stringify(duk_hthread *thr) { duk_bi_json_stringify_helper(thr, 0 /*idx_value*/, 1 /*idx_replacer*/, 2 /*idx_space*/, 0 /*flags*/); return 1; } #endif /* DUK_USE_JSON_BUILTIN */ #endif /* DUK_USE_JSON_SUPPORT */ /* automatic undefs */ #undef DUK__EMIT_1 #undef DUK__EMIT_2 #undef DUK__EMIT_CSTR #undef DUK__EMIT_HSTR #undef DUK__EMIT_STRIDX #undef DUK__JSON_DECSTR_BUFSIZE #undef DUK__JSON_DECSTR_CHUNKSIZE #undef DUK__JSON_ENCSTR_CHUNKSIZE #undef DUK__JSON_MAX_ESC_LEN #undef DUK__JSON_STRINGIFY_BUFSIZE #undef DUK__MKESC #undef DUK__UNEMIT_1 #line 1 "duk_bi_math.c" /* * Math built-ins */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_MATH_BUILTIN) /* * Use static helpers which can work with math.h functions matching * the following signatures. This is not portable if any of these math * functions is actually a macro. * * Typing here is intentionally 'double' wherever values interact with * the standard library APIs. */ typedef double (*duk__one_arg_func)(double); typedef double (*duk__two_arg_func)(double, double); DUK_LOCAL duk_ret_t duk__math_minmax(duk_hthread *thr, duk_double_t initial, duk__two_arg_func min_max) { duk_idx_t n = duk_get_top(thr); duk_idx_t i; duk_double_t res = initial; duk_double_t t; /* * Note: fmax() does not match the E5 semantics. E5 requires * that if -any- input to Math.max() is a NaN, the result is a * NaN. fmax() will return a NaN only if -both- inputs are NaN. * Same applies to fmin(). * * Note: every input value must be coerced with ToNumber(), even * if we know the result will be a NaN anyway: ToNumber() may have * side effects for which even order of evaluation matters. */ for (i = 0; i < n; i++) { t = duk_to_number(thr, i); if (DUK_FPCLASSIFY(t) == DUK_FP_NAN || DUK_FPCLASSIFY(res) == DUK_FP_NAN) { /* Note: not normalized, but duk_push_number() will normalize */ res = (duk_double_t) DUK_DOUBLE_NAN; } else { res = (duk_double_t) min_max(res, (double) t); } } duk_push_number(thr, res); return 1; } DUK_LOCAL double duk__fmin_fixed(double x, double y) { /* fmin() with args -0 and +0 is not guaranteed to return * -0 as Ecmascript requires. */ if (x == 0 && y == 0) { duk_double_union du1, du2; du1.d = x; du2.d = y; /* Already checked to be zero so these must hold, and allow us * to check for "x is -0 or y is -0" by ORing the high parts * for comparison. */ DUK_ASSERT(du1.ui[DUK_DBL_IDX_UI0] == 0 || du1.ui[DUK_DBL_IDX_UI0] == 0x80000000UL); DUK_ASSERT(du2.ui[DUK_DBL_IDX_UI0] == 0 || du2.ui[DUK_DBL_IDX_UI0] == 0x80000000UL); /* XXX: what's the safest way of creating a negative zero? */ if ((du1.ui[DUK_DBL_IDX_UI0] | du2.ui[DUK_DBL_IDX_UI0]) != 0) { /* Enter here if either x or y (or both) is -0. */ return -0.0; } else { return +0.0; } } return duk_double_fmin(x, y); } DUK_LOCAL double duk__fmax_fixed(double x, double y) { /* fmax() with args -0 and +0 is not guaranteed to return * +0 as Ecmascript requires. */ if (x == 0 && y == 0) { if (DUK_SIGNBIT(x) == 0 || DUK_SIGNBIT(y) == 0) { return +0.0; } else { return -0.0; } } return duk_double_fmax(x, y); } #if defined(DUK_USE_ES6) DUK_LOCAL double duk__cbrt(double x) { /* cbrt() is C99. To avoid hassling embedders with the need to provide a * cube root function, we can get by with pow(). The result is not * identical, but that's OK: ES2015 says it's implementation-dependent. */ #if defined(DUK_CBRT) /* cbrt() matches ES2015 requirements. */ return DUK_CBRT(x); #else duk_small_int_t c = (duk_small_int_t) DUK_FPCLASSIFY(x); /* pow() does not, however. */ if (c == DUK_FP_NAN || c == DUK_FP_INFINITE || c == DUK_FP_ZERO) { return x; } if (DUK_SIGNBIT(x)) { return -DUK_POW(-x, 1.0 / 3.0); } else { return DUK_POW(x, 1.0 / 3.0); } #endif } DUK_LOCAL double duk__log2(double x) { #if defined(DUK_LOG2) return DUK_LOG2(x); #else return DUK_LOG(x) * DUK_DOUBLE_LOG2E; #endif } DUK_LOCAL double duk__log10(double x) { #if defined(DUK_LOG10) return DUK_LOG10(x); #else return DUK_LOG(x) * DUK_DOUBLE_LOG10E; #endif } DUK_LOCAL double duk__trunc(double x) { #if defined(DUK_TRUNC) return DUK_TRUNC(x); #else /* Handles -0 correctly: -0.0 matches 'x >= 0.0' but floor() * is required to return -0 when the argument is -0. */ return x >= 0.0 ? DUK_FLOOR(x) : DUK_CEIL(x); #endif } #endif /* DUK_USE_ES6 */ DUK_LOCAL double duk__round_fixed(double x) { /* Numbers half-way between integers must be rounded towards +Infinity, * e.g. -3.5 must be rounded to -3 (not -4). When rounded to zero, zero * sign must be set appropriately. E5.1 Section 15.8.2.15. * * Note that ANSI C round() is "round to nearest integer, away from zero", * which is incorrect for negative values. Here we make do with floor(). */ duk_small_int_t c = (duk_small_int_t) DUK_FPCLASSIFY(x); if (c == DUK_FP_NAN || c == DUK_FP_INFINITE || c == DUK_FP_ZERO) { return x; } /* * x is finite and non-zero * * -1.6 -> floor(-1.1) -> -2 * -1.5 -> floor(-1.0) -> -1 (towards +Inf) * -1.4 -> floor(-0.9) -> -1 * -0.5 -> -0.0 (special case) * -0.1 -> -0.0 (special case) * +0.1 -> +0.0 (special case) * +0.5 -> floor(+1.0) -> 1 (towards +Inf) * +1.4 -> floor(+1.9) -> 1 * +1.5 -> floor(+2.0) -> 2 (towards +Inf) * +1.6 -> floor(+2.1) -> 2 */ if (x >= -0.5 && x < 0.5) { /* +0.5 is handled by floor, this is on purpose */ if (x < 0.0) { return -0.0; } else { return +0.0; } } return DUK_FLOOR(x + 0.5); } /* Wrappers for calling standard math library methods. These may be required * on platforms where one or more of the math built-ins are defined as macros * or inline functions and are thus not suitable to be used as function pointers. */ #if defined(DUK_USE_AVOID_PLATFORM_FUNCPTRS) DUK_LOCAL double duk__fabs(double x) { return DUK_FABS(x); } DUK_LOCAL double duk__acos(double x) { return DUK_ACOS(x); } DUK_LOCAL double duk__asin(double x) { return DUK_ASIN(x); } DUK_LOCAL double duk__atan(double x) { return DUK_ATAN(x); } DUK_LOCAL double duk__ceil(double x) { return DUK_CEIL(x); } DUK_LOCAL double duk__cos(double x) { return DUK_COS(x); } DUK_LOCAL double duk__exp(double x) { return DUK_EXP(x); } DUK_LOCAL double duk__floor(double x) { return DUK_FLOOR(x); } DUK_LOCAL double duk__log(double x) { return DUK_LOG(x); } DUK_LOCAL double duk__sin(double x) { return DUK_SIN(x); } DUK_LOCAL double duk__sqrt(double x) { return DUK_SQRT(x); } DUK_LOCAL double duk__tan(double x) { return DUK_TAN(x); } DUK_LOCAL double duk__atan2_fixed(double x, double y) { #if defined(DUK_USE_ATAN2_WORKAROUNDS) /* Specific fixes to common atan2() implementation issues: * - test-bug-mingw-math-issues.js */ if (DUK_ISINF(x) && DUK_ISINF(y)) { if (DUK_SIGNBIT(x)) { if (DUK_SIGNBIT(y)) { return -2.356194490192345; } else { return -0.7853981633974483; } } else { if (DUK_SIGNBIT(y)) { return 2.356194490192345; } else { return 0.7853981633974483; } } } #else /* Some ISO C assumptions. */ DUK_ASSERT(DUK_ATAN2(DUK_DOUBLE_INFINITY, DUK_DOUBLE_INFINITY) == 0.7853981633974483); DUK_ASSERT(DUK_ATAN2(-DUK_DOUBLE_INFINITY, DUK_DOUBLE_INFINITY) == -0.7853981633974483); DUK_ASSERT(DUK_ATAN2(DUK_DOUBLE_INFINITY, -DUK_DOUBLE_INFINITY) == 2.356194490192345); DUK_ASSERT(DUK_ATAN2(-DUK_DOUBLE_INFINITY, -DUK_DOUBLE_INFINITY) == -2.356194490192345); #endif return DUK_ATAN2(x, y); } #endif /* DUK_USE_AVOID_PLATFORM_FUNCPTRS */ /* order must match constants in genbuiltins.py */ DUK_LOCAL const duk__one_arg_func duk__one_arg_funcs[] = { #if defined(DUK_USE_AVOID_PLATFORM_FUNCPTRS) duk__fabs, duk__acos, duk__asin, duk__atan, duk__ceil, duk__cos, duk__exp, duk__floor, duk__log, duk__round_fixed, duk__sin, duk__sqrt, duk__tan, #if defined(DUK_USE_ES6) duk__cbrt, duk__log2, duk__log10, duk__trunc #endif #else /* DUK_USE_AVOID_PLATFORM_FUNCPTRS */ DUK_FABS, DUK_ACOS, DUK_ASIN, DUK_ATAN, DUK_CEIL, DUK_COS, DUK_EXP, DUK_FLOOR, DUK_LOG, duk__round_fixed, DUK_SIN, DUK_SQRT, DUK_TAN, #if defined(DUK_USE_ES6) duk__cbrt, duk__log2, duk__log10, duk__trunc #endif #endif /* DUK_USE_AVOID_PLATFORM_FUNCPTRS */ }; /* order must match constants in genbuiltins.py */ DUK_LOCAL const duk__two_arg_func duk__two_arg_funcs[] = { #if defined(DUK_USE_AVOID_PLATFORM_FUNCPTRS) duk__atan2_fixed, duk_js_arith_pow #else duk__atan2_fixed, duk_js_arith_pow #endif }; DUK_INTERNAL duk_ret_t duk_bi_math_object_onearg_shared(duk_hthread *thr) { duk_small_int_t fun_idx = duk_get_current_magic(thr); duk__one_arg_func fun; duk_double_t arg1; DUK_ASSERT(fun_idx >= 0); DUK_ASSERT(fun_idx < (duk_small_int_t) (sizeof(duk__one_arg_funcs) / sizeof(duk__one_arg_func))); arg1 = duk_to_number(thr, 0); fun = duk__one_arg_funcs[fun_idx]; duk_push_number(thr, (duk_double_t) fun((double) arg1)); return 1; } DUK_INTERNAL duk_ret_t duk_bi_math_object_twoarg_shared(duk_hthread *thr) { duk_small_int_t fun_idx = duk_get_current_magic(thr); duk__two_arg_func fun; duk_double_t arg1; duk_double_t arg2; DUK_ASSERT(fun_idx >= 0); DUK_ASSERT(fun_idx < (duk_small_int_t) (sizeof(duk__two_arg_funcs) / sizeof(duk__two_arg_func))); arg1 = duk_to_number(thr, 0); /* explicit ordered evaluation to match coercion semantics */ arg2 = duk_to_number(thr, 1); fun = duk__two_arg_funcs[fun_idx]; duk_push_number(thr, (duk_double_t) fun((double) arg1, (double) arg2)); return 1; } DUK_INTERNAL duk_ret_t duk_bi_math_object_max(duk_hthread *thr) { return duk__math_minmax(thr, -DUK_DOUBLE_INFINITY, duk__fmax_fixed); } DUK_INTERNAL duk_ret_t duk_bi_math_object_min(duk_hthread *thr) { return duk__math_minmax(thr, DUK_DOUBLE_INFINITY, duk__fmin_fixed); } DUK_INTERNAL duk_ret_t duk_bi_math_object_random(duk_hthread *thr) { duk_push_number(thr, (duk_double_t) DUK_UTIL_GET_RANDOM_DOUBLE(thr)); return 1; } #if defined(DUK_USE_ES6) DUK_INTERNAL duk_ret_t duk_bi_math_object_hypot(duk_hthread *thr) { /* * E6 Section 20.2.2.18: Math.hypot * * - If no arguments are passed, the result is +0. * - If any argument is +inf, the result is +inf. * - If any argument is -inf, the result is +inf. * - If no argument is +inf or -inf, and any argument is NaN, the result is * NaN. * - If all arguments are either +0 or -0, the result is +0. */ duk_idx_t nargs; duk_idx_t i; duk_bool_t found_nan; duk_double_t max; duk_double_t sum, summand; duk_double_t comp, prelim; duk_double_t t; nargs = duk_get_top(thr); /* Find the highest value. Also ToNumber() coerces. */ max = 0.0; found_nan = 0; for (i = 0; i < nargs; i++) { t = DUK_FABS(duk_to_number(thr, i)); if (DUK_FPCLASSIFY(t) == DUK_FP_NAN) { found_nan = 1; } else { max = duk_double_fmax(max, t); } } /* Early return cases. */ if (max == DUK_DOUBLE_INFINITY) { duk_push_number(thr, DUK_DOUBLE_INFINITY); return 1; } else if (found_nan) { duk_push_number(thr, DUK_DOUBLE_NAN); return 1; } else if (max == 0.0) { duk_push_number(thr, 0.0); /* Otherwise we'd divide by zero. */ return 1; } /* Use Kahan summation and normalize to the highest value to minimize * floating point rounding error and avoid overflow. * * https://en.wikipedia.org/wiki/Kahan_summation_algorithm */ sum = 0.0; comp = 0.0; for (i = 0; i < nargs; i++) { t = DUK_FABS(duk_get_number(thr, i)) / max; summand = (t * t) - comp; prelim = sum + summand; comp = (prelim - sum) - summand; sum = prelim; } duk_push_number(thr, (duk_double_t) DUK_SQRT(sum) * max); return 1; } #endif /* DUK_USE_ES6 */ #if defined(DUK_USE_ES6) DUK_INTERNAL duk_ret_t duk_bi_math_object_sign(duk_hthread *thr) { duk_double_t d; d = duk_to_number(thr, 0); if (duk_double_is_nan(d)) { DUK_ASSERT(duk_is_nan(thr, -1)); return 1; /* NaN input -> return NaN */ } if (d == 0.0) { /* Zero sign kept, i.e. -0 -> -0, +0 -> +0. */ return 1; } duk_push_int(thr, (d > 0.0 ? 1 : -1)); return 1; } #endif /* DUK_USE_ES6 */ #if defined(DUK_USE_ES6) DUK_INTERNAL duk_ret_t duk_bi_math_object_clz32(duk_hthread *thr) { duk_uint32_t x; duk_small_uint_t i; #if defined(DUK_USE_PREFER_SIZE) duk_uint32_t mask; x = duk_to_uint32(thr, 0); for (i = 0, mask = 0x80000000UL; mask != 0; mask >>= 1) { if (x & mask) { break; } i++; } DUK_ASSERT(i <= 32); duk_push_uint(thr, i); return 1; #else /* DUK_USE_PREFER_SIZE */ i = 0; x = duk_to_uint32(thr, 0); if (x & 0xffff0000UL) { x >>= 16; } else { i += 16; } if (x & 0x0000ff00UL) { x >>= 8; } else { i += 8; } if (x & 0x000000f0UL) { x >>= 4; } else { i += 4; } if (x & 0x0000000cUL) { x >>= 2; } else { i += 2; } if (x & 0x00000002UL) { x >>= 1; } else { i += 1; } if (x & 0x00000001UL) { ; } else { i += 1; } DUK_ASSERT(i <= 32); duk_push_uint(thr, i); return 1; #endif /* DUK_USE_PREFER_SIZE */ } #endif /* DUK_USE_ES6 */ #if defined(DUK_USE_ES6) DUK_INTERNAL duk_ret_t duk_bi_math_object_imul(duk_hthread *thr) { duk_uint32_t x, y, z; x = duk_to_uint32(thr, 0); y = duk_to_uint32(thr, 1); z = x * y; /* While arguments are ToUint32() coerced and the multiplication * is unsigned as such, the final result is curiously interpreted * as a signed 32-bit value. */ duk_push_i32(thr, (duk_int32_t) z); return 1; } #endif /* DUK_USE_ES6 */ #endif /* DUK_USE_MATH_BUILTIN */ #line 1 "duk_bi_number.c" /* * Number built-ins */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_NUMBER_BUILTIN) DUK_LOCAL duk_double_t duk__push_this_number_plain(duk_hthread *thr) { duk_hobject *h; /* Number built-in accepts a plain number or a Number object (whose * internal value is operated on). Other types cause TypeError. */ duk_push_this(thr); if (duk_is_number(thr, -1)) { DUK_DDD(DUK_DDDPRINT("plain number value: %!T", (duk_tval *) duk_get_tval(thr, -1))); goto done; } h = duk_get_hobject(thr, -1); if (!h || (DUK_HOBJECT_GET_CLASS_NUMBER(h) != DUK_HOBJECT_CLASS_NUMBER)) { DUK_DDD(DUK_DDDPRINT("unacceptable this value: %!T", (duk_tval *) duk_get_tval(thr, -1))); DUK_ERROR_TYPE(thr, "number expected"); } duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VALUE); DUK_ASSERT(duk_is_number(thr, -1)); DUK_DDD(DUK_DDDPRINT("number object: %!T, internal value: %!T", (duk_tval *) duk_get_tval(thr, -2), (duk_tval *) duk_get_tval(thr, -1))); duk_remove_m2(thr); done: return duk_get_number(thr, -1); } DUK_INTERNAL duk_ret_t duk_bi_number_constructor(duk_hthread *thr) { duk_idx_t nargs; duk_hobject *h_this; /* * The Number constructor uses ToNumber(arg) for number coercion * (coercing an undefined argument to NaN). However, if the * argument is not given at all, +0 must be used instead. To do * this, a vararg function is used. */ nargs = duk_get_top(thr); if (nargs == 0) { duk_push_int(thr, 0); } duk_to_number(thr, 0); duk_set_top(thr, 1); DUK_ASSERT_TOP(thr, 1); if (!duk_is_constructor_call(thr)) { return 1; } /* * E5 Section 15.7.2.1 requires that the constructed object * must have the original Number.prototype as its internal * prototype. However, since Number.prototype is non-writable * and non-configurable, this doesn't have to be enforced here: * The default object (bound to 'this') is OK, though we have * to change its class. * * Internal value set to ToNumber(arg) or +0; if no arg given, * ToNumber(undefined) = NaN, so special treatment is needed * (above). String internal value is immutable. */ /* XXX: helper */ duk_push_this(thr); h_this = duk_known_hobject(thr, -1); DUK_HOBJECT_SET_CLASS_NUMBER(h_this, DUK_HOBJECT_CLASS_NUMBER); DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_this) == thr->builtins[DUK_BIDX_NUMBER_PROTOTYPE]); DUK_ASSERT(DUK_HOBJECT_GET_CLASS_NUMBER(h_this) == DUK_HOBJECT_CLASS_NUMBER); DUK_ASSERT(DUK_HOBJECT_HAS_EXTENSIBLE(h_this)); duk_dup_0(thr); /* -> [ val obj val ] */ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_NONE); return 0; /* no return value -> don't replace created value */ } DUK_INTERNAL duk_ret_t duk_bi_number_prototype_value_of(duk_hthread *thr) { (void) duk__push_this_number_plain(thr); return 1; } DUK_INTERNAL duk_ret_t duk_bi_number_prototype_to_string(duk_hthread *thr) { duk_small_int_t radix; duk_small_uint_t n2s_flags; (void) duk__push_this_number_plain(thr); if (duk_is_undefined(thr, 0)) { radix = 10; } else { radix = (duk_small_int_t) duk_to_int_check_range(thr, 0, 2, 36); } DUK_DDD(DUK_DDDPRINT("radix=%ld", (long) radix)); n2s_flags = 0; duk_numconv_stringify(thr, radix /*radix*/, 0 /*digits*/, n2s_flags /*flags*/); return 1; } DUK_INTERNAL duk_ret_t duk_bi_number_prototype_to_locale_string(duk_hthread *thr) { /* XXX: just use toString() for now; permitted although not recommended. * nargs==1, so radix is passed to toString(). */ return duk_bi_number_prototype_to_string(thr); } /* * toFixed(), toExponential(), toPrecision() */ /* XXX: shared helper for toFixed(), toExponential(), toPrecision()? */ DUK_INTERNAL duk_ret_t duk_bi_number_prototype_to_fixed(duk_hthread *thr) { duk_small_int_t frac_digits; duk_double_t d; duk_small_int_t c; duk_small_uint_t n2s_flags; frac_digits = (duk_small_int_t) duk_to_int_check_range(thr, 0, 0, 20); d = duk__push_this_number_plain(thr); c = (duk_small_int_t) DUK_FPCLASSIFY(d); if (c == DUK_FP_NAN || c == DUK_FP_INFINITE) { goto use_to_string; } if (d >= 1.0e21 || d <= -1.0e21) { goto use_to_string; } n2s_flags = DUK_N2S_FLAG_FIXED_FORMAT | DUK_N2S_FLAG_FRACTION_DIGITS; duk_numconv_stringify(thr, 10 /*radix*/, frac_digits /*digits*/, n2s_flags /*flags*/); return 1; use_to_string: DUK_ASSERT_TOP(thr, 2); duk_to_string(thr, -1); return 1; } DUK_INTERNAL duk_ret_t duk_bi_number_prototype_to_exponential(duk_hthread *thr) { duk_bool_t frac_undefined; duk_small_int_t frac_digits; duk_double_t d; duk_small_int_t c; duk_small_uint_t n2s_flags; d = duk__push_this_number_plain(thr); frac_undefined = duk_is_undefined(thr, 0); duk_to_int(thr, 0); /* for side effects */ c = (duk_small_int_t) DUK_FPCLASSIFY(d); if (c == DUK_FP_NAN || c == DUK_FP_INFINITE) { goto use_to_string; } frac_digits = (duk_small_int_t) duk_to_int_check_range(thr, 0, 0, 20); n2s_flags = DUK_N2S_FLAG_FORCE_EXP | (frac_undefined ? 0 : DUK_N2S_FLAG_FIXED_FORMAT); duk_numconv_stringify(thr, 10 /*radix*/, frac_digits + 1 /*leading digit + fractions*/, n2s_flags /*flags*/); return 1; use_to_string: DUK_ASSERT_TOP(thr, 2); duk_to_string(thr, -1); return 1; } DUK_INTERNAL duk_ret_t duk_bi_number_prototype_to_precision(duk_hthread *thr) { /* The specification has quite awkward order of coercion and * checks for toPrecision(). The operations below are a bit * reordered, within constraints of observable side effects. */ duk_double_t d; duk_small_int_t prec; duk_small_int_t c; duk_small_uint_t n2s_flags; DUK_ASSERT_TOP(thr, 1); d = duk__push_this_number_plain(thr); if (duk_is_undefined(thr, 0)) { goto use_to_string; } DUK_ASSERT_TOP(thr, 2); duk_to_int(thr, 0); /* for side effects */ c = (duk_small_int_t) DUK_FPCLASSIFY(d); if (c == DUK_FP_NAN || c == DUK_FP_INFINITE) { goto use_to_string; } prec = (duk_small_int_t) duk_to_int_check_range(thr, 0, 1, 21); n2s_flags = DUK_N2S_FLAG_FIXED_FORMAT | DUK_N2S_FLAG_NO_ZERO_PAD; duk_numconv_stringify(thr, 10 /*radix*/, prec /*digits*/, n2s_flags /*flags*/); return 1; use_to_string: /* Used when precision is undefined; also used for NaN (-> "NaN"), * and +/- infinity (-> "Infinity", "-Infinity"). */ DUK_ASSERT_TOP(thr, 2); duk_to_string(thr, -1); return 1; } #endif /* DUK_USE_NUMBER_BUILTIN */ #line 1 "duk_bi_object.c" /* * Object built-ins */ /* #include duk_internal.h -> already included */ /* Needed even when Object built-in disabled. */ DUK_INTERNAL duk_ret_t duk_bi_object_prototype_to_string(duk_hthread *thr) { duk_tval *tv; tv = DUK_HTHREAD_THIS_PTR(thr); /* XXX: This is not entirely correct anymore; in ES2015 the * default lookup should use @@toStringTag to come up with * e.g. [object Symbol]. */ duk_push_class_string_tval(thr, tv); return 1; } #if defined(DUK_USE_OBJECT_BUILTIN) DUK_INTERNAL duk_ret_t duk_bi_object_constructor(duk_hthread *thr) { duk_uint_t arg_mask; arg_mask = duk_get_type_mask(thr, 0); if (!duk_is_constructor_call(thr) && /* not a constructor call */ ((arg_mask & (DUK_TYPE_MASK_NULL | DUK_TYPE_MASK_UNDEFINED)) == 0)) { /* and argument not null or undefined */ duk_to_object(thr, 0); return 1; } /* Pointer and buffer primitive values are treated like other * primitives values which have a fully fledged object counterpart: * promote to an object value. Lightfuncs and plain buffers are * coerced with ToObject() even they could also be returned as is. */ if (arg_mask & (DUK_TYPE_MASK_OBJECT | DUK_TYPE_MASK_STRING | DUK_TYPE_MASK_BOOLEAN | DUK_TYPE_MASK_NUMBER | DUK_TYPE_MASK_POINTER | DUK_TYPE_MASK_BUFFER | DUK_TYPE_MASK_LIGHTFUNC)) { /* For DUK_TYPE_OBJECT the coercion is a no-op and could * be checked for explicitly, but Object(obj) calls are * not very common so opt for minimal footprint. */ duk_to_object(thr, 0); return 1; } (void) duk_push_object_helper(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_FASTREFS | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT), DUK_BIDX_OBJECT_PROTOTYPE); return 1; } #endif /* DUK_USE_OBJECT_BUILTIN */ #if defined(DUK_USE_OBJECT_BUILTIN) && defined(DUK_USE_ES6) DUK_INTERNAL duk_ret_t duk_bi_object_constructor_assign(duk_hthread *thr) { duk_idx_t nargs; duk_int_t idx; nargs = duk_get_top_require_min(thr, 1 /*min_top*/); duk_to_object(thr, 0); for (idx = 1; idx < nargs; idx++) { /* E7 19.1.2.1 (step 4a) */ if (duk_is_null_or_undefined(thr, idx)) { continue; } /* duk_enum() respects ES2015+ [[OwnPropertyKeys]] ordering, which is * convenient here. */ duk_to_object(thr, idx); duk_enum(thr, idx, DUK_ENUM_OWN_PROPERTIES_ONLY); while (duk_next(thr, -1, 1 /*get_value*/)) { /* [ target ... enum key value ] */ duk_put_prop(thr, 0); /* [ target ... enum ] */ } /* Could pop enumerator, but unnecessary because of duk_set_top() * below. */ } duk_set_top(thr, 1); return 1; } #endif #if defined(DUK_USE_OBJECT_BUILTIN) && defined(DUK_USE_ES6) DUK_INTERNAL duk_ret_t duk_bi_object_constructor_is(duk_hthread *thr) { DUK_ASSERT_TOP(thr, 2); duk_push_boolean(thr, duk_samevalue(thr, 0, 1)); return 1; } #endif #if defined(DUK_USE_OBJECT_BUILTIN) DUK_INTERNAL duk_ret_t duk_bi_object_constructor_create(duk_hthread *thr) { duk_hobject *proto; DUK_ASSERT_TOP(thr, 2); #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) duk_hbufobj_promote_plain(thr, 0); #endif proto = duk_require_hobject_accept_mask(thr, 0, DUK_TYPE_MASK_NULL); DUK_ASSERT(proto != NULL || duk_is_null(thr, 0)); (void) duk_push_object_helper_proto(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_FASTREFS | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT), proto); if (!duk_is_undefined(thr, 1)) { /* [ O Properties obj ] */ duk_replace(thr, 0); /* [ obj Properties ] */ /* Just call the "original" Object.defineProperties() to * finish up. */ return duk_bi_object_constructor_define_properties(thr); } /* [ O Properties obj ] */ return 1; } #endif /* DUK_USE_OBJECT_BUILTIN */ #if defined(DUK_USE_OBJECT_BUILTIN) DUK_INTERNAL duk_ret_t duk_bi_object_constructor_define_properties(duk_hthread *thr) { duk_small_uint_t pass; duk_uint_t defprop_flags; duk_hobject *obj; duk_idx_t idx_value; duk_hobject *get; duk_hobject *set; /* Lightfunc and plain buffer handling by ToObject() coercion. */ obj = duk_require_hobject_promote_mask(thr, 0, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER); DUK_ASSERT(obj != NULL); duk_to_object(thr, 1); /* properties object */ DUK_DDD(DUK_DDDPRINT("target=%!iT, properties=%!iT", (duk_tval *) duk_get_tval(thr, 0), (duk_tval *) duk_get_tval(thr, 1))); /* * Two pass approach to processing the property descriptors. * On first pass validate and normalize all descriptors before * any changes are made to the target object. On second pass * make the actual modifications to the target object. * * Right now we'll just use the same normalize/validate helper * on both passes, ignoring its outputs on the first pass. */ for (pass = 0; pass < 2; pass++) { duk_set_top(thr, 2); /* -> [ hobject props ] */ duk_enum(thr, 1, DUK_ENUM_OWN_PROPERTIES_ONLY | DUK_ENUM_INCLUDE_SYMBOLS /*enum_flags*/); for (;;) { duk_hstring *key; /* [ hobject props enum(props) ] */ duk_set_top(thr, 3); if (!duk_next(thr, 2, 1 /*get_value*/)) { break; } DUK_DDD(DUK_DDDPRINT("-> key=%!iT, desc=%!iT", (duk_tval *) duk_get_tval(thr, -2), (duk_tval *) duk_get_tval(thr, -1))); /* [ hobject props enum(props) key desc ] */ duk_hobject_prepare_property_descriptor(thr, 4 /*idx_desc*/, &defprop_flags, &idx_value, &get, &set); /* [ hobject props enum(props) key desc [multiple values] ] */ if (pass == 0) { continue; } /* This allows symbols on purpose. */ key = duk_known_hstring(thr, 3); DUK_ASSERT(key != NULL); duk_hobject_define_property_helper(thr, defprop_flags, obj, key, idx_value, get, set, 1 /*throw_flag*/); } } /* * Return target object */ duk_dup_0(thr); return 1; } #endif /* DUK_USE_OBJECT_BUILTIN */ #if defined(DUK_USE_OBJECT_BUILTIN) DUK_INTERNAL duk_ret_t duk_bi_object_constructor_seal_freeze_shared(duk_hthread *thr) { DUK_ASSERT_TOP(thr, 1); duk_seal_freeze_raw(thr, 0, (duk_bool_t) duk_get_current_magic(thr) /*is_freeze*/); return 1; } #endif /* DUK_USE_OBJECT_BUILTIN */ #if defined(DUK_USE_OBJECT_BUILTIN) DUK_INTERNAL duk_ret_t duk_bi_object_constructor_is_sealed_frozen_shared(duk_hthread *thr) { duk_hobject *h; duk_bool_t is_frozen; duk_uint_t mask; is_frozen = (duk_bool_t) duk_get_current_magic(thr); mask = duk_get_type_mask(thr, 0); if (mask & (DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER)) { DUK_ASSERT(is_frozen == 0 || is_frozen == 1); duk_push_boolean(thr, (mask & DUK_TYPE_MASK_LIGHTFUNC) ? 1 : /* lightfunc always frozen and sealed */ (is_frozen ^ 1)); /* buffer sealed but not frozen (index props writable) */ } else { /* ES2015 Sections 19.1.2.12, 19.1.2.13: anything other than an object * is considered to be already sealed and frozen. */ h = duk_get_hobject(thr, 0); duk_push_boolean(thr, (h == NULL) || duk_hobject_object_is_sealed_frozen_helper(thr, h, is_frozen /*is_frozen*/)); } return 1; } #endif /* DUK_USE_OBJECT_BUILTIN */ #if defined(DUK_USE_OBJECT_BUILTIN) DUK_INTERNAL duk_ret_t duk_bi_object_prototype_to_locale_string(duk_hthread *thr) { DUK_ASSERT_TOP(thr, 0); (void) duk_push_this_coercible_to_object(thr); duk_get_prop_stridx_short(thr, 0, DUK_STRIDX_TO_STRING); #if 0 /* This is mentioned explicitly in the E5.1 spec, but duk_call_method() checks for it in practice. */ duk_require_callable(thr, 1); #endif duk_dup_0(thr); /* -> [ O toString O ] */ duk_call_method(thr, 0); /* XXX: call method tail call? */ return 1; } #endif /* DUK_USE_OBJECT_BUILTIN */ #if defined(DUK_USE_OBJECT_BUILTIN) DUK_INTERNAL duk_ret_t duk_bi_object_prototype_value_of(duk_hthread *thr) { /* For lightfuncs and plain buffers, returns Object() coerced. */ (void) duk_push_this_coercible_to_object(thr); return 1; } #endif /* DUK_USE_OBJECT_BUILTIN */ #if defined(DUK_USE_OBJECT_BUILTIN) DUK_INTERNAL duk_ret_t duk_bi_object_prototype_is_prototype_of(duk_hthread *thr) { duk_hobject *h_v; duk_hobject *h_obj; DUK_ASSERT_TOP(thr, 1); h_v = duk_get_hobject(thr, 0); if (!h_v) { duk_push_false(thr); /* XXX: tail call: return duk_push_false(thr) */ return 1; } h_obj = duk_push_this_coercible_to_object(thr); DUK_ASSERT(h_obj != NULL); /* E5.1 Section 15.2.4.6, step 3.a, lookup proto once before compare. * Prototype loops should cause an error to be thrown. */ duk_push_boolean(thr, duk_hobject_prototype_chain_contains(thr, DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_v), h_obj, 0 /*ignore_loop*/)); return 1; } #endif /* DUK_USE_OBJECT_BUILTIN */ #if defined(DUK_USE_OBJECT_BUILTIN) DUK_INTERNAL duk_ret_t duk_bi_object_prototype_has_own_property(duk_hthread *thr) { return (duk_ret_t) duk_hobject_object_ownprop_helper(thr, 0 /*required_desc_flags*/); } #endif /* DUK_USE_OBJECT_BUILTIN */ #if defined(DUK_USE_OBJECT_BUILTIN) DUK_INTERNAL duk_ret_t duk_bi_object_prototype_property_is_enumerable(duk_hthread *thr) { return (duk_ret_t) duk_hobject_object_ownprop_helper(thr, DUK_PROPDESC_FLAG_ENUMERABLE /*required_desc_flags*/); } #endif /* DUK_USE_OBJECT_BUILTIN */ #if defined(DUK_USE_OBJECT_BUILTIN) || defined(DUK_USE_REFLECT_BUILTIN) /* Shared helper to implement Object.getPrototypeOf, * Object.prototype.__proto__ getter, and Reflect.getPrototypeOf. * * http://www.ecma-international.org/ecma-262/6.0/index.html#sec-get-object.prototype.__proto__ */ DUK_INTERNAL duk_ret_t duk_bi_object_getprototype_shared(duk_hthread *thr) { /* * magic = 0: __proto__ getter * magic = 1: Object.getPrototypeOf() * magic = 2: Reflect.getPrototypeOf() */ duk_hobject *h; duk_hobject *proto; duk_tval *tv; duk_int_t magic; magic = duk_get_current_magic(thr); if (magic == 0) { DUK_ASSERT_TOP(thr, 0); duk_push_this_coercible_to_object(thr); } DUK_ASSERT(duk_get_top(thr) >= 1); if (magic < 2) { /* ES2015 Section 19.1.2.9, step 1 */ duk_to_object(thr, 0); } tv = DUK_GET_TVAL_POSIDX(thr, 0); switch (DUK_TVAL_GET_TAG(tv)) { case DUK_TAG_BUFFER: proto = thr->builtins[DUK_BIDX_UINT8ARRAY_PROTOTYPE]; break; case DUK_TAG_LIGHTFUNC: proto = thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]; break; case DUK_TAG_OBJECT: h = DUK_TVAL_GET_OBJECT(tv); proto = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h); break; default: /* This implicitly handles CheckObjectCoercible() caused * TypeError. */ DUK_DCERROR_TYPE_INVALID_ARGS(thr); } if (proto != NULL) { duk_push_hobject(thr, proto); } else { duk_push_null(thr); } return 1; } #endif /* DUK_USE_OBJECT_BUILTIN || DUK_USE_REFLECT_BUILTIN */ #if defined(DUK_USE_OBJECT_BUILTIN) || defined(DUK_USE_REFLECT_BUILTIN) /* Shared helper to implement ES2015 Object.setPrototypeOf, * Object.prototype.__proto__ setter, and Reflect.setPrototypeOf. * * http://www.ecma-international.org/ecma-262/6.0/index.html#sec-get-object.prototype.__proto__ * http://www.ecma-international.org/ecma-262/6.0/index.html#sec-object.setprototypeof */ DUK_INTERNAL duk_ret_t duk_bi_object_setprototype_shared(duk_hthread *thr) { /* * magic = 0: __proto__ setter * magic = 1: Object.setPrototypeOf() * magic = 2: Reflect.setPrototypeOf() */ duk_hobject *h_obj; duk_hobject *h_new_proto; duk_hobject *h_curr; duk_ret_t ret_success = 1; /* retval for success path */ duk_uint_t mask; duk_int_t magic; /* Preliminaries for __proto__ and setPrototypeOf (E6 19.1.2.18 steps 1-4). */ magic = duk_get_current_magic(thr); if (magic == 0) { duk_push_this_check_object_coercible(thr); duk_insert(thr, 0); if (!duk_check_type_mask(thr, 1, DUK_TYPE_MASK_NULL | DUK_TYPE_MASK_OBJECT)) { return 0; } /* __proto__ setter returns 'undefined' on success unlike the * setPrototypeOf() call which returns the target object. */ ret_success = 0; } else { if (magic == 1) { duk_require_object_coercible(thr, 0); } else { duk_require_hobject_accept_mask(thr, 0, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER); } duk_require_type_mask(thr, 1, DUK_TYPE_MASK_NULL | DUK_TYPE_MASK_OBJECT); } h_new_proto = duk_get_hobject(thr, 1); /* h_new_proto may be NULL */ mask = duk_get_type_mask(thr, 0); if (mask & (DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER)) { duk_hobject *curr_proto; curr_proto = thr->builtins[(mask & DUK_TYPE_MASK_LIGHTFUNC) ? DUK_BIDX_FUNCTION_PROTOTYPE : DUK_BIDX_UINT8ARRAY_PROTOTYPE]; if (h_new_proto == curr_proto) { goto skip; } goto fail_nonextensible; } h_obj = duk_get_hobject(thr, 0); if (h_obj == NULL) { goto skip; } DUK_ASSERT(h_obj != NULL); /* [[SetPrototypeOf]] standard behavior, E6 9.1.2. */ /* TODO: implement Proxy object support here */ if (h_new_proto == DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_obj)) { goto skip; } if (!DUK_HOBJECT_HAS_EXTENSIBLE(h_obj)) { goto fail_nonextensible; } for (h_curr = h_new_proto; h_curr != NULL; h_curr = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_curr)) { /* Loop prevention. */ if (h_curr == h_obj) { goto fail_loop; } } DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, h_obj, h_new_proto); /* fall thru */ skip: duk_set_top(thr, 1); if (magic == 2) { duk_push_true(thr); } return ret_success; fail_nonextensible: fail_loop: if (magic != 2) { DUK_DCERROR_TYPE_INVALID_ARGS(thr); } else { duk_push_false(thr); return 1; } } #endif /* DUK_USE_OBJECT_BUILTIN || DUK_USE_REFLECT_BUILTIN */ #if defined(DUK_USE_OBJECT_BUILTIN) || defined(DUK_USE_REFLECT_BUILTIN) DUK_INTERNAL duk_ret_t duk_bi_object_constructor_define_property(duk_hthread *thr) { /* * magic = 0: Object.defineProperty() * magic = 1: Reflect.defineProperty() */ duk_hobject *obj; duk_hstring *key; duk_hobject *get; duk_hobject *set; duk_idx_t idx_value; duk_uint_t defprop_flags; duk_small_uint_t magic; duk_bool_t throw_flag; duk_bool_t ret; DUK_ASSERT(thr != NULL); DUK_DDD(DUK_DDDPRINT("Object.defineProperty(): ctx=%p obj=%!T key=%!T desc=%!T", (void *) thr, (duk_tval *) duk_get_tval(thr, 0), (duk_tval *) duk_get_tval(thr, 1), (duk_tval *) duk_get_tval(thr, 2))); /* [ obj key desc ] */ magic = (duk_small_uint_t) duk_get_current_magic(thr); /* Lightfuncs are currently supported by coercing to a temporary * Function object; changes will be allowed (the coerced value is * extensible) but will be lost. Same for plain buffers. */ obj = duk_require_hobject_promote_mask(thr, 0, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER); DUK_ASSERT(obj != NULL); key = duk_to_property_key_hstring(thr, 1); (void) duk_require_hobject(thr, 2); DUK_ASSERT(obj != NULL); DUK_ASSERT(key != NULL); DUK_ASSERT(duk_get_hobject(thr, 2) != NULL); /* * Validate and convert argument property descriptor (an Ecmascript * object) into a set of defprop_flags and possibly property value, * getter, and/or setter values on the value stack. * * Lightfunc set/get values are coerced to full Functions. */ duk_hobject_prepare_property_descriptor(thr, 2 /*idx_desc*/, &defprop_flags, &idx_value, &get, &set); /* * Use Object.defineProperty() helper for the actual operation. */ DUK_ASSERT(magic == 0U || magic == 1U); throw_flag = magic ^ 1U; ret = duk_hobject_define_property_helper(thr, defprop_flags, obj, key, idx_value, get, set, throw_flag); /* Ignore the normalize/validate helper outputs on the value stack, * they're popped automatically. */ if (magic == 0U) { /* Object.defineProperty(): return target object. */ duk_push_hobject(thr, obj); } else { /* Reflect.defineProperty(): return success/fail. */ duk_push_boolean(thr, ret); } return 1; } #endif /* DUK_USE_OBJECT_BUILTIN || DUK_USE_REFLECT_BUILTIN */ #if defined(DUK_USE_OBJECT_BUILTIN) || defined(DUK_USE_REFLECT_BUILTIN) DUK_INTERNAL duk_ret_t duk_bi_object_constructor_get_own_property_descriptor(duk_hthread *thr) { DUK_ASSERT_TOP(thr, 2); /* ES2015 Section 19.1.2.6, step 1 */ if (duk_get_current_magic(thr) == 0) { duk_to_object(thr, 0); } /* [ obj key ] */ duk_hobject_object_get_own_property_descriptor(thr, -2); return 1; } #endif /* DUK_USE_OBJECT_BUILTIN || DUK_USE_REFLECT_BUILTIN */ #if defined(DUK_USE_OBJECT_BUILTIN) || defined(DUK_USE_REFLECT_BUILTIN) DUK_INTERNAL duk_ret_t duk_bi_object_constructor_is_extensible(duk_hthread *thr) { /* * magic = 0: Object.isExtensible() * magic = 1: Reflect.isExtensible() */ duk_hobject *h; if (duk_get_current_magic(thr) == 0) { h = duk_get_hobject(thr, 0); } else { /* Reflect.isExtensible(): throw if non-object, but we accept lightfuncs * and plain buffers here because they pretend to be objects. */ h = duk_require_hobject_accept_mask(thr, 0, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER); } duk_push_boolean(thr, (h != NULL) && DUK_HOBJECT_HAS_EXTENSIBLE(h)); return 1; } #endif /* DUK_USE_OBJECT_BUILTIN || DUK_USE_REFLECT_BUILTIN */ #if defined(DUK_USE_OBJECT_BUILTIN) || defined(DUK_USE_REFLECT_BUILTIN) /* Shared helper for various key/symbol listings, magic: * 0=Object.keys() * 1=Object.getOwnPropertyNames(), * 2=Object.getOwnPropertySymbols(), * 3=Reflect.ownKeys() */ DUK_LOCAL const duk_small_uint_t duk__object_keys_enum_flags[4] = { /* Object.keys() */ DUK_ENUM_OWN_PROPERTIES_ONLY | DUK_ENUM_NO_PROXY_BEHAVIOR, /* Object.getOwnPropertyNames() */ DUK_ENUM_INCLUDE_NONENUMERABLE | DUK_ENUM_OWN_PROPERTIES_ONLY | DUK_ENUM_NO_PROXY_BEHAVIOR, /* Object.getOwnPropertySymbols() */ DUK_ENUM_INCLUDE_SYMBOLS | DUK_ENUM_OWN_PROPERTIES_ONLY | DUK_ENUM_EXCLUDE_STRINGS | DUK_ENUM_INCLUDE_NONENUMERABLE | DUK_ENUM_NO_PROXY_BEHAVIOR, /* Reflect.ownKeys() */ DUK_ENUM_INCLUDE_SYMBOLS | DUK_ENUM_OWN_PROPERTIES_ONLY | DUK_ENUM_INCLUDE_NONENUMERABLE | DUK_ENUM_NO_PROXY_BEHAVIOR }; DUK_INTERNAL duk_ret_t duk_bi_object_constructor_keys_shared(duk_hthread *thr) { duk_hobject *obj; #if defined(DUK_USE_ES6_PROXY) duk_hobject *h_proxy_target; duk_hobject *h_proxy_handler; duk_hobject *h_trap_result; #endif duk_small_uint_t enum_flags; duk_int_t magic; DUK_ASSERT_TOP(thr, 1); magic = duk_get_current_magic(thr); if (magic == 3) { /* ES2015 Section 26.1.11 requires a TypeError for non-objects. Lightfuncs * and plain buffers pretend to be objects, so accept those too. */ obj = duk_require_hobject_promote_mask(thr, 0, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER); } else { /* ES2015: ToObject coerce. */ obj = duk_to_hobject(thr, 0); } DUK_ASSERT(obj != NULL); DUK_UNREF(obj); /* XXX: proxy chains */ #if defined(DUK_USE_ES6_PROXY) /* XXX: better sharing of code between proxy target call sites */ if (DUK_LIKELY(!duk_hobject_proxy_check(obj, &h_proxy_target, &h_proxy_handler))) { goto skip_proxy; } duk_push_hobject(thr, h_proxy_handler); if (!duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_OWN_KEYS)) { /* Careful with reachability here: don't pop 'obj' before pushing * proxy target. */ DUK_DDD(DUK_DDDPRINT("no ownKeys trap, get keys of target instead")); duk_pop_2(thr); duk_push_hobject(thr, h_proxy_target); duk_replace(thr, 0); DUK_ASSERT_TOP(thr, 1); goto skip_proxy; } /* [ obj handler trap ] */ duk_insert(thr, -2); duk_push_hobject(thr, h_proxy_target); /* -> [ obj trap handler target ] */ duk_call_method(thr, 1 /*nargs*/); /* -> [ obj trap_result ] */ h_trap_result = duk_require_hobject(thr, -1); DUK_UNREF(h_trap_result); magic = duk_get_current_magic(thr); DUK_ASSERT(magic >= 0 && magic < (duk_int_t) (sizeof(duk__object_keys_enum_flags) / sizeof(duk_small_uint_t))); enum_flags = duk__object_keys_enum_flags[magic]; duk_proxy_ownkeys_postprocess(thr, h_proxy_target, enum_flags); return 1; skip_proxy: #endif /* DUK_USE_ES6_PROXY */ DUK_ASSERT_TOP(thr, 1); magic = duk_get_current_magic(thr); DUK_ASSERT(magic >= 0 && magic < (duk_int_t) (sizeof(duk__object_keys_enum_flags) / sizeof(duk_small_uint_t))); enum_flags = duk__object_keys_enum_flags[magic]; return duk_hobject_get_enumerated_keys(thr, enum_flags); } #endif /* DUK_USE_OBJECT_BUILTIN || DUK_USE_REFLECT_BUILTIN */ #if defined(DUK_USE_OBJECT_BUILTIN) || defined(DUK_USE_REFLECT_BUILTIN) DUK_INTERNAL duk_ret_t duk_bi_object_constructor_prevent_extensions(duk_hthread *thr) { /* * magic = 0: Object.preventExtensions() * magic = 1: Reflect.preventExtensions() */ duk_hobject *h; duk_uint_t mask; duk_int_t magic; magic = duk_get_current_magic(thr); /* Silent success for lightfuncs and plain buffers always. */ mask = DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER; /* Object.preventExtensions() silent success for non-object. */ if (magic == 0) { mask |= DUK_TYPE_MASK_UNDEFINED | DUK_TYPE_MASK_NULL | DUK_TYPE_MASK_BOOLEAN | DUK_TYPE_MASK_NUMBER | DUK_TYPE_MASK_STRING | DUK_TYPE_MASK_POINTER; } if (duk_check_type_mask(thr, 0, mask)) { /* Not an object, already non-extensible so always success. */ goto done; } h = duk_require_hobject(thr, 0); DUK_ASSERT(h != NULL); DUK_HOBJECT_CLEAR_EXTENSIBLE(h); /* A non-extensible object cannot gain any more properties, * so this is a good time to compact. */ duk_hobject_compact_props(thr, h); done: if (magic == 1) { duk_push_true(thr); } return 1; } #endif /* DUK_USE_OBJECT_BUILTIN || DUK_USE_REFLECT_BUILTIN */ /* * __defineGetter__, __defineSetter__, __lookupGetter__, __lookupSetter__ */ #if defined(DUK_USE_ES8) DUK_INTERNAL duk_ret_t duk_bi_object_prototype_defineaccessor(duk_hthread *thr) { duk_push_this(thr); duk_insert(thr, 0); duk_to_object(thr, 0); duk_require_callable(thr, 2); /* [ ToObject(this) key getter/setter ] */ /* ToPropertyKey() coercion is not needed, duk_def_prop() does it. */ duk_def_prop(thr, 0, DUK_DEFPROP_SET_ENUMERABLE | DUK_DEFPROP_SET_CONFIGURABLE | (duk_get_current_magic(thr) ? DUK_DEFPROP_HAVE_SETTER : DUK_DEFPROP_HAVE_GETTER)); return 0; } DUK_INTERNAL duk_ret_t duk_bi_object_prototype_lookupaccessor(duk_hthread *thr) { duk_uint_t sanity; duk_push_this(thr); duk_to_object(thr, -1); /* XXX: Prototype walk (with sanity) should be a core property * operation, could add a flag to e.g. duk_get_prop_desc(). */ /* ToPropertyKey() coercion is not needed, duk_get_prop_desc() does it. */ sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY; while (!duk_is_undefined(thr, -1)) { /* [ key obj ] */ duk_dup(thr, 0); duk_get_prop_desc(thr, 1, 0 /*flags*/); if (!duk_is_undefined(thr, -1)) { duk_get_prop_stridx(thr, -1, (duk_get_current_magic(thr) != 0 ? DUK_STRIDX_SET : DUK_STRIDX_GET)); return 1; } duk_pop(thr); if (DUK_UNLIKELY(sanity-- == 0)) { DUK_ERROR_RANGE(thr, DUK_STR_PROTOTYPE_CHAIN_LIMIT); } duk_get_prototype(thr, -1); duk_remove(thr, -2); } return 1; } #endif /* DUK_USE_ES8 */ #line 1 "duk_bi_performance.c" /* * High resolution time API (performance.now() et al) * * API specification: https://encoding.spec.whatwg.org/#ap://www.w3.org/TR/hr-time/ */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_PERFORMANCE_BUILTIN) DUK_INTERNAL duk_ret_t duk_bi_performance_now(duk_hthread *thr) { /* From API spec: * The DOMHighResTimeStamp type is used to store a time value in * milliseconds, measured relative from the time origin, global * monotonic clock, or a time value that represents a duration * between two DOMHighResTimeStamp's. */ duk_push_number(thr, duk_time_get_monotonic_time(thr)); return 1; } #if 0 /* Missing until semantics decided. */ DUK_INTERNAL duk_ret_t duk_bi_performance_timeorigin_getter(duk_hthread *thr) { /* No decision yet how to handle timeOrigins, e.g. should one be * initialized per heap, or per global object set. See * https://www.w3.org/TR/hr-time/#time-origin. */ duk_push_uint(thr, 0); return 1; } #endif /* 0 */ #endif /* DUK_USE_PERFORMANCE_BUILTIN */ #line 1 "duk_bi_pointer.c" /* * Pointer built-ins */ /* #include duk_internal.h -> already included */ /* * Constructor */ DUK_INTERNAL duk_ret_t duk_bi_pointer_constructor(duk_hthread *thr) { /* XXX: this behavior is quite useless now; it would be nice to be able * to create pointer values from e.g. numbers or strings. Numbers are * problematic on 64-bit platforms though. Hex encoded strings? */ if (duk_get_top(thr) == 0) { duk_push_pointer(thr, NULL); } else { duk_to_pointer(thr, 0); } DUK_ASSERT(duk_is_pointer(thr, 0)); duk_set_top(thr, 1); if (duk_is_constructor_call(thr)) { (void) duk_push_object_helper(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_FASTREFS | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_POINTER), DUK_BIDX_POINTER_PROTOTYPE); /* Pointer object internal value is immutable */ duk_dup_0(thr); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_NONE); } /* Note: unbalanced stack on purpose */ return 1; } /* * toString(), valueOf() */ DUK_INTERNAL duk_ret_t duk_bi_pointer_prototype_tostring_shared(duk_hthread *thr) { duk_tval *tv; duk_small_int_t to_string = duk_get_current_magic(thr); duk_push_this(thr); tv = duk_require_tval(thr, -1); DUK_ASSERT(tv != NULL); if (DUK_TVAL_IS_POINTER(tv)) { /* nop */ } else if (DUK_TVAL_IS_OBJECT(tv)) { duk_hobject *h = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h != NULL); /* Must be a "pointer object", i.e. class "Pointer" */ if (DUK_HOBJECT_GET_CLASS_NUMBER(h) != DUK_HOBJECT_CLASS_POINTER) { goto type_error; } duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VALUE); } else { goto type_error; } if (to_string) { duk_to_string(thr, -1); } return 1; type_error: DUK_DCERROR_TYPE_INVALID_ARGS(thr); } #line 1 "duk_bi_promise.c" /* * Promise built-in */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_PROMISE_BUILTIN) DUK_INTERNAL duk_ret_t duk_bi_promise_constructor(duk_hthread *thr) { DUK_ERROR_TYPE(thr, "unimplemented"); return 0; } DUK_INTERNAL duk_ret_t duk_bi_promise_all(duk_hthread *thr) { DUK_ERROR_TYPE(thr, "unimplemented"); return 0; } DUK_INTERNAL duk_ret_t duk_bi_promise_race(duk_hthread *thr) { DUK_ERROR_TYPE(thr, "unimplemented"); return 0; } DUK_INTERNAL duk_ret_t duk_bi_promise_reject(duk_hthread *thr) { DUK_ERROR_TYPE(thr, "unimplemented"); return 0; } DUK_INTERNAL duk_ret_t duk_bi_promise_resolve(duk_hthread *thr) { DUK_ERROR_TYPE(thr, "unimplemented"); return 0; } DUK_INTERNAL duk_ret_t duk_bi_promise_catch(duk_hthread *thr) { DUK_ERROR_TYPE(thr, "unimplemented"); return 0; } DUK_INTERNAL duk_ret_t duk_bi_promise_then(duk_hthread *thr) { DUK_ERROR_TYPE(thr, "unimplemented"); return 0; } #endif /* DUK_USE_PROMISE_BUILTIN */ #line 1 "duk_bi_proxy.c" /* * Proxy built-in (ES2015) */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_ES6_PROXY) /* Post-process a Proxy ownKeys() result at stack top. Push a cleaned up * array of valid result keys (strings or symbols). TypeError for invalid * values. Flags are shared with duk_enum(). */ DUK_INTERNAL void duk_proxy_ownkeys_postprocess(duk_hthread *thr, duk_hobject *h_proxy_target, duk_uint_t flags) { duk_uarridx_t i, len, idx; duk_propdesc desc; DUK_ASSERT_CTX_VALID(thr); DUK_ASSERT(h_proxy_target != NULL); len = (duk_uarridx_t) duk_get_length(thr, -1); idx = 0; duk_push_array(thr); /* XXX: preallocated dense array, fill in directly */ for (i = 0; i < len; i++) { duk_hstring *h; /* [ obj trap_result res_arr ] */ (void) duk_get_prop_index(thr, -2, i); h = duk_get_hstring(thr, -1); if (h == NULL) { DUK_ERROR_TYPE_INVALID_TRAP_RESULT(thr); } if (!(flags & DUK_ENUM_INCLUDE_NONENUMERABLE)) { /* No support for 'getOwnPropertyDescriptor' trap yet, * so check enumerability always from target object * descriptor. */ if (duk_hobject_get_own_propdesc(thr, h_proxy_target, duk_known_hstring(thr, -1), &desc, 0 /*flags*/)) { if ((desc.flags & DUK_PROPDESC_FLAG_ENUMERABLE) == 0) { DUK_DDD(DUK_DDDPRINT("ignore non-enumerable property: %!T", duk_get_tval(thr, -1))); goto skip_key; } } else { DUK_DDD(DUK_DDDPRINT("ignore non-existent property: %!T", duk_get_tval(thr, -1))); goto skip_key; } } if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) { if (!(flags & DUK_ENUM_INCLUDE_SYMBOLS)) { DUK_DDD(DUK_DDDPRINT("ignore symbol property: %!T", duk_get_tval(thr, -1))); goto skip_key; } if (DUK_HSTRING_HAS_HIDDEN(h) && !(flags & DUK_ENUM_INCLUDE_HIDDEN)) { DUK_DDD(DUK_DDDPRINT("ignore hidden symbol property: %!T", duk_get_tval(thr, -1))); goto skip_key; } } else { if (flags & DUK_ENUM_EXCLUDE_STRINGS) { DUK_DDD(DUK_DDDPRINT("ignore string property: %!T", duk_get_tval(thr, -1))); goto skip_key; } } /* [ obj trap_result res_arr propname ] */ duk_put_prop_index(thr, -2, idx++); continue; skip_key: duk_pop(thr); continue; } /* XXX: Missing trap result validation for non-configurable target keys * (must be present), for non-extensible target all target keys must be * present and no extra keys can be present. * http://www.ecma-international.org/ecma-262/6.0/#sec-proxy-object-internal-methods-and-internal-slots-ownpropertykeys */ /* XXX: The key enumerability check should trigger the "getOwnPropertyDescriptor" * trap which has not yet been implemented. In the absence of such a trap, * the enumerability should be checked from the target object; this is * handled above. */ } #endif /* DUK_USE_ES6_PROXY */ #if defined(DUK_USE_ES6_PROXY) DUK_INTERNAL duk_ret_t duk_bi_proxy_constructor(duk_hthread *thr) { DUK_ASSERT_TOP(thr, 2); /* [ target handler ] */ duk_require_constructor_call(thr); duk_push_proxy(thr, 0 /*flags*/); /* [ target handler ] -> [ proxy ] */ return 1; /* replacement */ } #endif /* DUK_USE_ES6_PROXY */ #line 1 "duk_bi_reflect.c" /* * 'Reflect' built-in (ES2016 Section 26.1) * http://www.ecma-international.org/ecma-262/7.0/#sec-reflect-object * * Many Reflect built-in functions are provided by shared helpers in * duk_bi_object.c or duk_bi_function.c. */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_REFLECT_BUILTIN) DUK_INTERNAL duk_ret_t duk_bi_reflect_object_delete_property(duk_hthread *thr) { duk_tval *tv_obj; duk_tval *tv_key; duk_bool_t ret; DUK_ASSERT_TOP(thr, 2); (void) duk_require_hobject(thr, 0); (void) duk_to_string(thr, 1); /* [ target key ] */ DUK_ASSERT(thr != NULL); tv_obj = DUK_GET_TVAL_POSIDX(thr, 0); tv_key = DUK_GET_TVAL_POSIDX(thr, 1); ret = duk_hobject_delprop(thr, tv_obj, tv_key, 0 /*throw_flag*/); duk_push_boolean(thr, ret); return 1; } DUK_INTERNAL duk_ret_t duk_bi_reflect_object_get(duk_hthread *thr) { duk_tval *tv_obj; duk_tval *tv_key; duk_idx_t nargs; DUK_ASSERT(thr != NULL); nargs = duk_get_top_require_min(thr, 2 /*min_top*/); (void) duk_require_hobject(thr, 0); (void) duk_to_string(thr, 1); if (nargs >= 3 && !duk_strict_equals(thr, 0, 2)) { /* XXX: [[Get]] receiver currently unsupported */ DUK_ERROR_UNSUPPORTED(thr); } /* [ target key receiver? ...? ] */ tv_obj = DUK_GET_TVAL_POSIDX(thr, 0); tv_key = DUK_GET_TVAL_POSIDX(thr, 1); (void) duk_hobject_getprop(thr, tv_obj, tv_key); /* This could also be a duk_get_prop(). */ return 1; } DUK_INTERNAL duk_ret_t duk_bi_reflect_object_has(duk_hthread *thr) { duk_tval *tv_obj; duk_tval *tv_key; duk_bool_t ret; DUK_ASSERT(thr != NULL); DUK_ASSERT_TOP(thr, 2); (void) duk_require_hobject(thr, 0); (void) duk_to_string(thr, 1); /* [ target key ] */ tv_obj = DUK_GET_TVAL_POSIDX(thr, 0); tv_key = DUK_GET_TVAL_POSIDX(thr, 1); ret = duk_hobject_hasprop(thr, tv_obj, tv_key); duk_push_boolean(thr, ret); return 1; } DUK_INTERNAL duk_ret_t duk_bi_reflect_object_set(duk_hthread *thr) { duk_tval *tv_obj; duk_tval *tv_key; duk_tval *tv_val; duk_idx_t nargs; duk_bool_t ret; DUK_ASSERT(thr != NULL); nargs = duk_get_top_require_min(thr, 3 /*min_top*/); (void) duk_require_hobject(thr, 0); (void) duk_to_string(thr, 1); if (nargs >= 4 && !duk_strict_equals(thr, 0, 3)) { /* XXX: [[Set]] receiver currently unsupported */ DUK_ERROR_UNSUPPORTED(thr); } /* [ target key value receiver? ...? ] */ tv_obj = DUK_GET_TVAL_POSIDX(thr, 0); tv_key = DUK_GET_TVAL_POSIDX(thr, 1); tv_val = DUK_GET_TVAL_POSIDX(thr, 2); ret = duk_hobject_putprop(thr, tv_obj, tv_key, tv_val, 0 /*throw_flag*/); duk_push_boolean(thr, ret); return 1; } #endif /* DUK_USE_REFLECT_BUILTIN */ #line 1 "duk_bi_regexp.c" /* * RegExp built-ins */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_REGEXP_SUPPORT) DUK_LOCAL void duk__get_this_regexp(duk_hthread *thr) { duk_hobject *h; duk_push_this(thr); h = duk_require_hobject_with_class(thr, -1, DUK_HOBJECT_CLASS_REGEXP); DUK_ASSERT(h != NULL); DUK_UNREF(h); duk_insert(thr, 0); /* prepend regexp to valstack 0 index */ } /* XXX: much to improve (code size) */ DUK_INTERNAL duk_ret_t duk_bi_regexp_constructor(duk_hthread *thr) { duk_hobject *h_pattern; DUK_ASSERT_TOP(thr, 2); h_pattern = duk_get_hobject(thr, 0); if (!duk_is_constructor_call(thr) && h_pattern != NULL && DUK_HOBJECT_GET_CLASS_NUMBER(h_pattern) == DUK_HOBJECT_CLASS_REGEXP && duk_is_undefined(thr, 1)) { /* Called as a function, pattern has [[Class]] "RegExp" and * flags is undefined -> return object as is. */ /* XXX: ES2015 has a NewTarget SameValue() check which is not * yet implemented. */ duk_dup_0(thr); return 1; } /* Else functionality is identical for function call and constructor * call. */ if (h_pattern != NULL && DUK_HOBJECT_GET_CLASS_NUMBER(h_pattern) == DUK_HOBJECT_CLASS_REGEXP) { duk_get_prop_stridx_short(thr, 0, DUK_STRIDX_SOURCE); if (duk_is_undefined(thr, 1)) { /* In ES5 one would need to read the flags individually; * in ES2015 just read .flags. */ duk_get_prop_stridx(thr, 0, DUK_STRIDX_FLAGS); } else { /* In ES2015 allowed; overrides argument RegExp flags. */ duk_dup_1(thr); } } else { if (duk_is_undefined(thr, 0)) { duk_push_hstring_empty(thr); } else { duk_dup_0(thr); duk_to_string(thr, -1); /* Rejects Symbols. */ } if (duk_is_undefined(thr, 1)) { duk_push_hstring_empty(thr); } else { duk_dup_1(thr); duk_to_string(thr, -1); /* Rejects Symbols. */ } /* [ ... pattern flags ] */ } DUK_DDD(DUK_DDDPRINT("RegExp constructor/function call, pattern=%!T, flags=%!T", (duk_tval *) duk_get_tval(thr, -2), (duk_tval *) duk_get_tval(thr, -1))); /* [ ... pattern flags ] (both uncoerced) */ duk_to_string(thr, -2); duk_to_string(thr, -1); duk_regexp_compile(thr); /* [ ... bytecode escaped_source ] */ duk_regexp_create_instance(thr); /* [ ... RegExp ] */ return 1; } DUK_INTERNAL duk_ret_t duk_bi_regexp_prototype_exec(duk_hthread *thr) { duk__get_this_regexp(thr); /* [ regexp input ] */ duk_regexp_match(thr); /* [ result ] */ return 1; } DUK_INTERNAL duk_ret_t duk_bi_regexp_prototype_test(duk_hthread *thr) { duk__get_this_regexp(thr); /* [ regexp input ] */ /* result object is created and discarded; wasteful but saves code space */ duk_regexp_match(thr); /* [ result ] */ duk_push_boolean(thr, (duk_is_null(thr, -1) ? 0 : 1)); return 1; } DUK_INTERNAL duk_ret_t duk_bi_regexp_prototype_tostring(duk_hthread *thr) { /* This must be generic in ES2015 and later. */ DUK_ASSERT_TOP(thr, 0); duk_push_this(thr); duk_push_string(thr, "/"); duk_get_prop_stridx(thr, 0, DUK_STRIDX_SOURCE); duk_dup_m2(thr); /* another "/" */ duk_get_prop_stridx(thr, 0, DUK_STRIDX_FLAGS); duk_concat(thr, 4); return 1; } DUK_INTERNAL duk_ret_t duk_bi_regexp_prototype_flags(duk_hthread *thr) { /* .flags is ES2015 but present even when ES2015 bindings are * disabled because the constructor relies on it. */ duk_uint8_t buf[8]; /* enough for all flags + NUL */ duk_uint8_t *p = buf; /* .flags is generic and works on any object. */ duk_push_this(thr); (void) duk_require_hobject(thr, -1); if (duk_get_prop_stridx_boolean(thr, 0, DUK_STRIDX_GLOBAL, NULL)) { *p++ = DUK_ASC_LC_G; } if (duk_get_prop_stridx_boolean(thr, 0, DUK_STRIDX_IGNORE_CASE, NULL)) { *p++ = DUK_ASC_LC_I; } if (duk_get_prop_stridx_boolean(thr, 0, DUK_STRIDX_MULTILINE, NULL)) { *p++ = DUK_ASC_LC_M; } /* .unicode: to be added */ /* .sticky: to be added */ *p++ = DUK_ASC_NUL; DUK_ASSERT((duk_size_t) (p - buf) <= sizeof(buf)); duk_push_string(thr, (const char *) buf); return 1; } /* Shared helper for providing .source, .global, .multiline, etc getters. */ DUK_INTERNAL duk_ret_t duk_bi_regexp_prototype_shared_getter(duk_hthread *thr) { duk_hstring *h_bc; duk_small_uint_t re_flags; duk_hobject *h; duk_int_t magic; DUK_ASSERT_TOP(thr, 0); duk_push_this(thr); h = duk_require_hobject(thr, -1); magic = duk_get_current_magic(thr); if (DUK_HOBJECT_GET_CLASS_NUMBER(h) == DUK_HOBJECT_CLASS_REGEXP) { duk_get_prop_stridx_short(thr, 0, DUK_STRIDX_INT_SOURCE); duk_get_prop_stridx_short(thr, 0, DUK_STRIDX_INT_BYTECODE); h_bc = duk_require_hstring(thr, -1); re_flags = (duk_small_uint_t) DUK_HSTRING_GET_DATA(h_bc)[0]; /* Safe even if h_bc length is 0 (= NUL) */ duk_pop(thr); } else if (h == thr->builtins[DUK_BIDX_REGEXP_PROTOTYPE]) { /* In ES2015 and ES2016 a TypeError would be thrown here. * However, this had real world issues so ES2017 draft * allows RegExp.prototype specifically, returning '(?:)' * for .source and undefined for all flags. */ if (magic != 16 /* .source */) { return 0; } duk_push_string(thr, "(?:)"); /* .source handled by switch-case */ re_flags = 0; } else { DUK_DCERROR_TYPE_INVALID_ARGS(thr); } /* [ regexp source ] */ switch (magic) { case 0: { /* global */ duk_push_boolean(thr, (re_flags & DUK_RE_FLAG_GLOBAL)); break; } case 1: { /* ignoreCase */ duk_push_boolean(thr, (re_flags & DUK_RE_FLAG_IGNORE_CASE)); break; } case 2: { /* multiline */ duk_push_boolean(thr, (re_flags & DUK_RE_FLAG_MULTILINE)); break; } #if 0 /* Don't provide until implemented to avoid interfering with feature * detection in user code. */ case 3: /* sticky */ case 4: { /* unicode */ duk_push_false(thr); break; } #endif default: { /* source */ /* leave 'source' on top */ break; } } return 1; } #endif /* DUK_USE_REGEXP_SUPPORT */ #line 1 "duk_bi_string.c" /* * String built-ins * * Most String built-ins must only accept strings (or String objects). * Symbols, represented internally as strings, must be generally rejected. * The duk_push_this_coercible_to_string() helper does this automatically. */ /* XXX: There are several limitations in the current implementation for * strings with >= 0x80000000UL characters. In some cases one would need * to be able to represent the range [-0xffffffff,0xffffffff] and so on. * Generally character and byte length are assumed to fit into signed 32 * bits (< 0x80000000UL). Places with issues are not marked explicitly * below in all cases, look for signed type usage (duk_int_t etc) for * offsets/lengths. */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_STRING_BUILTIN) /* * Helpers */ DUK_LOCAL duk_hstring *duk__str_tostring_notregexp(duk_hthread *thr, duk_idx_t idx) { duk_hstring *h; if (duk_get_class_number(thr, idx) == DUK_HOBJECT_CLASS_REGEXP) { DUK_ERROR_TYPE_INVALID_ARGS(thr); } h = duk_to_hstring(thr, idx); DUK_ASSERT(h != NULL); return h; } DUK_LOCAL duk_int_t duk__str_search_shared(duk_hthread *thr, duk_hstring *h_this, duk_hstring *h_search, duk_int_t start_cpos, duk_bool_t backwards) { duk_int_t cpos; duk_int_t bpos; const duk_uint8_t *p_start, *p_end, *p; const duk_uint8_t *q_start; duk_int_t q_blen; duk_uint8_t firstbyte; duk_uint8_t t; cpos = start_cpos; /* Empty searchstring always matches; cpos must be clamped here. * (If q_blen were < 0 due to clamped coercion, it would also be * caught here.) */ q_start = DUK_HSTRING_GET_DATA(h_search); q_blen = (duk_int_t) DUK_HSTRING_GET_BYTELEN(h_search); if (q_blen <= 0) { return cpos; } DUK_ASSERT(q_blen > 0); bpos = (duk_int_t) duk_heap_strcache_offset_char2byte(thr, h_this, (duk_uint32_t) cpos); p_start = DUK_HSTRING_GET_DATA(h_this); p_end = p_start + DUK_HSTRING_GET_BYTELEN(h_this); p = p_start + bpos; /* This loop is optimized for size. For speed, there should be * two separate loops, and we should ensure that memcmp() can be * used without an extra "will searchstring fit" check. Doing * the preconditioning for 'p' and 'p_end' is easy but cpos * must be updated if 'p' is wound back (backward scanning). */ firstbyte = q_start[0]; /* leading byte of match string */ while (p <= p_end && p >= p_start) { t = *p; /* For Ecmascript strings, this check can only match for * initial UTF-8 bytes (not continuation bytes). For other * strings all bets are off. */ if ((t == firstbyte) && ((duk_size_t) (p_end - p) >= (duk_size_t) q_blen)) { DUK_ASSERT(q_blen > 0); /* no issues with memcmp() zero size, even if broken */ if (DUK_MEMCMP((const void *) p, (const void *) q_start, (size_t) q_blen) == 0) { return cpos; } } /* track cpos while scanning */ if (backwards) { /* when going backwards, we decrement cpos 'early'; * 'p' may point to a continuation byte of the char * at offset 'cpos', but that's OK because we'll * backtrack all the way to the initial byte. */ if ((t & 0xc0) != 0x80) { cpos--; } p--; } else { if ((t & 0xc0) != 0x80) { cpos++; } p++; } } /* Not found. Empty string case is handled specially above. */ return -1; } /* * Constructor */ DUK_INTERNAL duk_ret_t duk_bi_string_constructor(duk_hthread *thr) { duk_hstring *h; duk_uint_t flags; /* String constructor needs to distinguish between an argument not given at all * vs. given as 'undefined'. We're a vararg function to handle this properly. */ /* XXX: copy current activation flags to thr, including current magic, * is_constructor_call etc. This takes a few bytes in duk_hthread but * makes call sites smaller (there are >30 is_constructor_call and get * current magic call sites. */ if (duk_get_top(thr) == 0) { duk_push_hstring_empty(thr); } else { h = duk_to_hstring_acceptsymbol(thr, 0); if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h) && !duk_is_constructor_call(thr))) { duk_push_symbol_descriptive_string(thr, h); duk_replace(thr, 0); } } duk_to_string(thr, 0); /* catches symbol argument for constructor call */ DUK_ASSERT(duk_is_string(thr, 0)); duk_set_top(thr, 1); /* Top may be 1 or larger. */ if (duk_is_constructor_call(thr)) { /* String object internal value is immutable */ flags = DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_FASTREFS | DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_STRING); duk_push_object_helper(thr, flags, DUK_BIDX_STRING_PROTOTYPE); duk_dup_0(thr); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_NONE); } /* Note: unbalanced stack on purpose */ return 1; } DUK_LOCAL duk_ret_t duk__construct_from_codepoints(duk_hthread *thr, duk_bool_t nonbmp) { duk_bufwriter_ctx bw_alloc; duk_bufwriter_ctx *bw; duk_idx_t i, n; duk_ucodepoint_t cp; /* XXX: It would be nice to build the string directly but ToUint16() * coercion is needed so a generic helper would not be very * helpful (perhaps coerce the value stack first here and then * build a string from a duk_tval number sequence in one go?). */ n = duk_get_top(thr); bw = &bw_alloc; DUK_BW_INIT_PUSHBUF(thr, bw, (duk_size_t) n); /* initial estimate for ASCII only codepoints */ for (i = 0; i < n; i++) { /* XXX: could improve bufwriter handling to write multiple codepoints * with one ensure call but the relative benefit would be quite small. */ if (nonbmp) { /* ES2015 requires that (1) SameValue(cp, ToInteger(cp)) and * (2) cp >= 0 and cp <= 0x10ffff. This check does not * implement the steps exactly but the outcome should be * the same. */ duk_int32_t i32 = 0; if (!duk_is_whole_get_int32(duk_to_number(thr, i), &i32) || i32 < 0 || i32 > 0x10ffffL) { DUK_DCERROR_RANGE_INVALID_ARGS(thr); } DUK_ASSERT(i32 >= 0 && i32 <= 0x10ffffL); cp = (duk_ucodepoint_t) i32; DUK_BW_WRITE_ENSURE_CESU8(thr, bw, cp); } else { #if defined(DUK_USE_NONSTD_STRING_FROMCHARCODE_32BIT) /* ToUint16() coercion is mandatory in the E5.1 specification, but * this non-compliant behavior makes more sense because we support * non-BMP codepoints. Don't use CESU-8 because that'd create * surrogate pairs. */ cp = (duk_ucodepoint_t) duk_to_uint32(thr, i); DUK_BW_WRITE_ENSURE_XUTF8(thr, bw, cp); #else cp = (duk_ucodepoint_t) duk_to_uint16(thr, i); DUK_ASSERT(cp >= 0 && cp <= 0x10ffffL); DUK_BW_WRITE_ENSURE_CESU8(thr, bw, cp); #endif } } DUK_BW_COMPACT(thr, bw); (void) duk_buffer_to_string(thr, -1); /* Safe, extended UTF-8 or CESU-8 encoded. */ return 1; } DUK_INTERNAL duk_ret_t duk_bi_string_constructor_from_char_code(duk_hthread *thr) { return duk__construct_from_codepoints(thr, 0 /*nonbmp*/); } #if defined(DUK_USE_ES6) DUK_INTERNAL duk_ret_t duk_bi_string_constructor_from_code_point(duk_hthread *thr) { return duk__construct_from_codepoints(thr, 1 /*nonbmp*/); } #endif /* * toString(), valueOf() */ DUK_INTERNAL duk_ret_t duk_bi_string_prototype_to_string(duk_hthread *thr) { duk_tval *tv; duk_push_this(thr); tv = duk_require_tval(thr, -1); DUK_ASSERT(tv != NULL); if (DUK_TVAL_IS_STRING(tv)) { /* return as is */ } else if (DUK_TVAL_IS_OBJECT(tv)) { duk_hobject *h = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h != NULL); /* Must be a "string object", i.e. class "String" */ if (DUK_HOBJECT_GET_CLASS_NUMBER(h) != DUK_HOBJECT_CLASS_STRING) { goto type_error; } duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VALUE); DUK_ASSERT(duk_is_string(thr, -1)); } else { goto type_error; } (void) duk_require_hstring_notsymbol(thr, -1); /* Reject symbols (and wrapped symbols). */ return 1; type_error: DUK_DCERROR_TYPE_INVALID_ARGS(thr); } /* * Character and charcode access */ DUK_INTERNAL duk_ret_t duk_bi_string_prototype_char_at(duk_hthread *thr) { duk_int_t pos; /* XXX: faster implementation */ (void) duk_push_this_coercible_to_string(thr); pos = duk_to_int(thr, 0); duk_substring(thr, -1, (duk_size_t) pos, (duk_size_t) (pos + 1)); return 1; } /* Magic: 0=charCodeAt, 1=codePointAt */ DUK_INTERNAL duk_ret_t duk_bi_string_prototype_char_code_at(duk_hthread *thr) { duk_int_t pos; duk_hstring *h; duk_bool_t clamped; duk_uint32_t cp; duk_int_t magic; /* XXX: faster implementation */ DUK_DDD(DUK_DDDPRINT("arg=%!T", (duk_tval *) duk_get_tval(thr, 0))); h = duk_push_this_coercible_to_string(thr); DUK_ASSERT(h != NULL); pos = duk_to_int_clamped_raw(thr, 0 /*index*/, 0 /*min(incl)*/, (duk_int_t) DUK_HSTRING_GET_CHARLEN(h) - 1 /*max(incl)*/, &clamped /*out_clamped*/); #if defined(DUK_USE_ES6) magic = duk_get_current_magic(thr); #else DUK_ASSERT(duk_get_current_magic(thr) == 0); magic = 0; #endif if (clamped) { /* For out-of-bounds indices .charCodeAt() returns NaN and * .codePointAt() returns undefined. */ if (magic != 0) { return 0; } duk_push_nan(thr); } else { DUK_ASSERT(pos >= 0); cp = (duk_uint32_t) duk_hstring_char_code_at_raw(thr, h, (duk_uint_t) pos, (duk_bool_t) magic /*surrogate_aware*/); duk_push_u32(thr, cp); } return 1; } /* * substring(), substr(), slice() */ /* XXX: any chance of merging these three similar but still slightly * different algorithms so that footprint would be reduced? */ DUK_INTERNAL duk_ret_t duk_bi_string_prototype_substring(duk_hthread *thr) { duk_hstring *h; duk_int_t start_pos, end_pos; duk_int_t len; h = duk_push_this_coercible_to_string(thr); DUK_ASSERT(h != NULL); len = (duk_int_t) DUK_HSTRING_GET_CHARLEN(h); /* [ start end str ] */ start_pos = duk_to_int_clamped(thr, 0, 0, len); if (duk_is_undefined(thr, 1)) { end_pos = len; } else { end_pos = duk_to_int_clamped(thr, 1, 0, len); } DUK_ASSERT(start_pos >= 0 && start_pos <= len); DUK_ASSERT(end_pos >= 0 && end_pos <= len); if (start_pos > end_pos) { duk_int_t tmp = start_pos; start_pos = end_pos; end_pos = tmp; } DUK_ASSERT(end_pos >= start_pos); duk_substring(thr, -1, (duk_size_t) start_pos, (duk_size_t) end_pos); return 1; } #if defined(DUK_USE_SECTION_B) DUK_INTERNAL duk_ret_t duk_bi_string_prototype_substr(duk_hthread *thr) { duk_hstring *h; duk_int_t start_pos, end_pos; duk_int_t len; /* Unlike non-obsolete String calls, substr() algorithm in E5.1 * specification will happily coerce undefined and null to strings * ("undefined" and "null"). */ duk_push_this(thr); h = duk_to_hstring_m1(thr); /* Reject Symbols. */ DUK_ASSERT(h != NULL); len = (duk_int_t) DUK_HSTRING_GET_CHARLEN(h); /* [ start length str ] */ /* The implementation for computing of start_pos and end_pos differs * from the standard algorithm, but is intended to result in the exactly * same behavior. This is not always obvious. */ /* combines steps 2 and 5; -len ensures max() not needed for step 5 */ start_pos = duk_to_int_clamped(thr, 0, -len, len); if (start_pos < 0) { start_pos = len + start_pos; } DUK_ASSERT(start_pos >= 0 && start_pos <= len); /* combines steps 3, 6; step 7 is not needed */ if (duk_is_undefined(thr, 1)) { end_pos = len; } else { DUK_ASSERT(start_pos <= len); end_pos = start_pos + duk_to_int_clamped(thr, 1, 0, len - start_pos); } DUK_ASSERT(start_pos >= 0 && start_pos <= len); DUK_ASSERT(end_pos >= 0 && end_pos <= len); DUK_ASSERT(end_pos >= start_pos); duk_substring(thr, -1, (duk_size_t) start_pos, (duk_size_t) end_pos); return 1; } #endif /* DUK_USE_SECTION_B */ DUK_INTERNAL duk_ret_t duk_bi_string_prototype_slice(duk_hthread *thr) { duk_hstring *h; duk_int_t start_pos, end_pos; duk_int_t len; h = duk_push_this_coercible_to_string(thr); DUK_ASSERT(h != NULL); len = (duk_int_t) DUK_HSTRING_GET_CHARLEN(h); /* [ start end str ] */ start_pos = duk_to_int_clamped(thr, 0, -len, len); if (start_pos < 0) { start_pos = len + start_pos; } if (duk_is_undefined(thr, 1)) { end_pos = len; } else { end_pos = duk_to_int_clamped(thr, 1, -len, len); if (end_pos < 0) { end_pos = len + end_pos; } } DUK_ASSERT(start_pos >= 0 && start_pos <= len); DUK_ASSERT(end_pos >= 0 && end_pos <= len); if (end_pos < start_pos) { end_pos = start_pos; } DUK_ASSERT(end_pos >= start_pos); duk_substring(thr, -1, (duk_size_t) start_pos, (duk_size_t) end_pos); return 1; } /* * Case conversion */ DUK_INTERNAL duk_ret_t duk_bi_string_prototype_caseconv_shared(duk_hthread *thr) { duk_small_int_t uppercase = duk_get_current_magic(thr); (void) duk_push_this_coercible_to_string(thr); duk_unicode_case_convert_string(thr, (duk_bool_t) uppercase); return 1; } /* * indexOf() and lastIndexOf() */ DUK_INTERNAL duk_ret_t duk_bi_string_prototype_indexof_shared(duk_hthread *thr) { duk_hstring *h_this; duk_hstring *h_search; duk_int_t clen_this; duk_int_t cpos; duk_small_uint_t is_lastindexof = (duk_small_uint_t) duk_get_current_magic(thr); /* 0=indexOf, 1=lastIndexOf */ h_this = duk_push_this_coercible_to_string(thr); DUK_ASSERT(h_this != NULL); clen_this = (duk_int_t) DUK_HSTRING_GET_CHARLEN(h_this); h_search = duk_to_hstring(thr, 0); DUK_ASSERT(h_search != NULL); duk_to_number(thr, 1); if (duk_is_nan(thr, 1) && is_lastindexof) { /* indexOf: NaN should cause pos to be zero. * lastIndexOf: NaN should cause pos to be +Infinity * (and later be clamped to len). */ cpos = clen_this; } else { cpos = duk_to_int_clamped(thr, 1, 0, clen_this); } cpos = duk__str_search_shared(thr, h_this, h_search, cpos, is_lastindexof /*backwards*/); duk_push_int(thr, cpos); return 1; } /* * replace() */ /* XXX: the current implementation works but is quite clunky; it compiles * to almost 1,4kB of x86 code so it needs to be simplified (better approach, * shared helpers, etc). Some ideas for refactoring: * * - a primitive to convert a string into a regexp matcher (reduces matching * code at the cost of making matching much slower) * - use replace() as a basic helper for match() and split(), which are both * much simpler * - API call to get_prop and to_boolean */ DUK_INTERNAL duk_ret_t duk_bi_string_prototype_replace(duk_hthread *thr) { duk_hstring *h_input; duk_hstring *h_match; duk_hstring *h_search; duk_hobject *h_re; duk_bufwriter_ctx bw_alloc; duk_bufwriter_ctx *bw; #if defined(DUK_USE_REGEXP_SUPPORT) duk_bool_t is_regexp; duk_bool_t is_global; #endif duk_bool_t is_repl_func; duk_uint32_t match_start_coff, match_start_boff; #if defined(DUK_USE_REGEXP_SUPPORT) duk_int_t match_caps; #endif duk_uint32_t prev_match_end_boff; const duk_uint8_t *r_start, *r_end, *r; /* repl string scan */ duk_size_t tmp_sz; DUK_ASSERT_TOP(thr, 2); h_input = duk_push_this_coercible_to_string(thr); DUK_ASSERT(h_input != NULL); bw = &bw_alloc; DUK_BW_INIT_PUSHBUF(thr, bw, DUK_HSTRING_GET_BYTELEN(h_input)); /* input size is good output starting point */ DUK_ASSERT_TOP(thr, 4); /* stack[0] = search value * stack[1] = replace value * stack[2] = input string * stack[3] = result buffer */ h_re = duk_get_hobject_with_class(thr, 0, DUK_HOBJECT_CLASS_REGEXP); if (h_re) { #if defined(DUK_USE_REGEXP_SUPPORT) is_regexp = 1; is_global = duk_get_prop_stridx_boolean(thr, 0, DUK_STRIDX_GLOBAL, NULL); if (is_global) { /* start match from beginning */ duk_push_int(thr, 0); duk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX); } #else /* DUK_USE_REGEXP_SUPPORT */ DUK_DCERROR_UNSUPPORTED(thr); #endif /* DUK_USE_REGEXP_SUPPORT */ } else { duk_to_string(thr, 0); /* rejects symbols */ #if defined(DUK_USE_REGEXP_SUPPORT) is_regexp = 0; is_global = 0; #endif } if (duk_is_function(thr, 1)) { is_repl_func = 1; r_start = NULL; r_end = NULL; } else { duk_hstring *h_repl; is_repl_func = 0; h_repl = duk_to_hstring(thr, 1); /* reject symbols */ DUK_ASSERT(h_repl != NULL); r_start = DUK_HSTRING_GET_DATA(h_repl); r_end = r_start + DUK_HSTRING_GET_BYTELEN(h_repl); } prev_match_end_boff = 0; for (;;) { /* * If matching with a regexp: * - non-global RegExp: lastIndex not touched on a match, zeroed * on a non-match * - global RegExp: on match, lastIndex will be updated by regexp * executor to point to next char after the matching part (so that * characters in the matching part are not matched again) * * If matching with a string: * - always non-global match, find first occurrence * * We need: * - The character offset of start-of-match for the replacer function * - The byte offsets for start-of-match and end-of-match to implement * the replacement values $&, $`, and $', and to copy non-matching * input string portions (including header and trailer) verbatim. * * NOTE: the E5.1 specification is a bit vague how the RegExp should * behave in the replacement process; e.g. is matching done first for * all matches (in the global RegExp case) before any replacer calls * are made? See: test-bi-string-proto-replace.js for discussion. */ DUK_ASSERT_TOP(thr, 4); #if defined(DUK_USE_REGEXP_SUPPORT) if (is_regexp) { duk_dup_0(thr); duk_dup_2(thr); duk_regexp_match(thr); /* [ ... regexp input ] -> [ res_obj ] */ if (!duk_is_object(thr, -1)) { duk_pop(thr); break; } duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INDEX); DUK_ASSERT(duk_is_number(thr, -1)); match_start_coff = duk_get_uint(thr, -1); duk_pop(thr); duk_get_prop_index(thr, -1, 0); DUK_ASSERT(duk_is_string(thr, -1)); h_match = duk_known_hstring(thr, -1); duk_pop(thr); /* h_match is borrowed, remains reachable through match_obj */ if (DUK_HSTRING_GET_BYTELEN(h_match) == 0) { /* This should be equivalent to match() algorithm step 8.f.iii.2: * detect an empty match and allow it, but don't allow it twice. */ duk_uint32_t last_index; duk_get_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX); last_index = (duk_uint32_t) duk_get_uint(thr, -1); DUK_DDD(DUK_DDDPRINT("empty match, bump lastIndex: %ld -> %ld", (long) last_index, (long) (last_index + 1))); duk_pop(thr); duk_push_uint(thr, (duk_uint_t) (last_index + 1)); duk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX); } DUK_ASSERT(duk_get_length(thr, -1) <= DUK_INT_MAX); /* string limits */ match_caps = (duk_int_t) duk_get_length(thr, -1); } else { #else /* DUK_USE_REGEXP_SUPPORT */ { /* unconditionally */ #endif /* DUK_USE_REGEXP_SUPPORT */ const duk_uint8_t *p_start, *p_end, *p; /* input string scan */ const duk_uint8_t *q_start; /* match string */ duk_size_t q_blen; #if defined(DUK_USE_REGEXP_SUPPORT) DUK_ASSERT(!is_global); /* single match always */ #endif p_start = DUK_HSTRING_GET_DATA(h_input); p_end = p_start + DUK_HSTRING_GET_BYTELEN(h_input); p = p_start; h_search = duk_known_hstring(thr, 0); q_start = DUK_HSTRING_GET_DATA(h_search); q_blen = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h_search); p_end -= q_blen; /* ensure full memcmp() fits in while */ match_start_coff = 0; while (p <= p_end) { DUK_ASSERT(p + q_blen <= DUK_HSTRING_GET_DATA(h_input) + DUK_HSTRING_GET_BYTELEN(h_input)); if (DUK_MEMCMP((const void *) p, (const void *) q_start, (size_t) q_blen) == 0) { duk_dup_0(thr); h_match = duk_known_hstring(thr, -1); #if defined(DUK_USE_REGEXP_SUPPORT) match_caps = 0; #endif goto found; } /* track utf-8 non-continuation bytes */ if ((p[0] & 0xc0) != 0x80) { match_start_coff++; } p++; } /* not found */ break; } found: /* stack[0] = search value * stack[1] = replace value * stack[2] = input string * stack[3] = result buffer * stack[4] = regexp match OR match string */ match_start_boff = (duk_uint32_t) duk_heap_strcache_offset_char2byte(thr, h_input, match_start_coff); tmp_sz = (duk_size_t) (match_start_boff - prev_match_end_boff); DUK_BW_WRITE_ENSURE_BYTES(thr, bw, DUK_HSTRING_GET_DATA(h_input) + prev_match_end_boff, tmp_sz); prev_match_end_boff = match_start_boff + DUK_HSTRING_GET_BYTELEN(h_match); if (is_repl_func) { duk_idx_t idx_args; duk_hstring *h_repl; /* regexp res_obj is at index 4 */ duk_dup_1(thr); idx_args = duk_get_top(thr); #if defined(DUK_USE_REGEXP_SUPPORT) if (is_regexp) { duk_int_t idx; duk_require_stack(thr, match_caps + 2); for (idx = 0; idx < match_caps; idx++) { /* match followed by capture(s) */ duk_get_prop_index(thr, 4, (duk_uarridx_t) idx); } } else { #else /* DUK_USE_REGEXP_SUPPORT */ { /* unconditionally */ #endif /* DUK_USE_REGEXP_SUPPORT */ /* match == search string, by definition */ duk_dup_0(thr); } duk_push_uint(thr, (duk_uint_t) match_start_coff); duk_dup_2(thr); /* [ ... replacer match [captures] match_char_offset input ] */ duk_call(thr, duk_get_top(thr) - idx_args); h_repl = duk_to_hstring_m1(thr); /* -> [ ... repl_value ] */ DUK_ASSERT(h_repl != NULL); DUK_BW_WRITE_ENSURE_HSTRING(thr, bw, h_repl); duk_pop(thr); /* repl_value */ } else { r = r_start; while (r < r_end) { duk_int_t ch1; duk_int_t ch2; #if defined(DUK_USE_REGEXP_SUPPORT) duk_int_t ch3; #endif duk_size_t left; ch1 = *r++; if (ch1 != DUK_ASC_DOLLAR) { goto repl_write; } DUK_ASSERT(r <= r_end); left = (duk_size_t) (r_end - r); if (left <= 0) { goto repl_write; } ch2 = r[0]; switch (ch2) { case DUK_ASC_DOLLAR: { ch1 = (1 << 8) + DUK_ASC_DOLLAR; goto repl_write; } case DUK_ASC_AMP: { DUK_BW_WRITE_ENSURE_HSTRING(thr, bw, h_match); r++; continue; } case DUK_ASC_GRAVE: { tmp_sz = (duk_size_t) match_start_boff; DUK_BW_WRITE_ENSURE_BYTES(thr, bw, DUK_HSTRING_GET_DATA(h_input), tmp_sz); r++; continue; } case DUK_ASC_SINGLEQUOTE: { duk_uint32_t match_end_boff; /* Use match charlen instead of bytelen, just in case the input and * match codepoint encodings would have different lengths. */ /* XXX: charlen computed here, and also in char2byte helper. */ match_end_boff = (duk_uint32_t) duk_heap_strcache_offset_char2byte(thr, h_input, match_start_coff + (duk_uint_fast32_t) DUK_HSTRING_GET_CHARLEN(h_match)); tmp_sz = (duk_size_t) (DUK_HSTRING_GET_BYTELEN(h_input) - match_end_boff); DUK_BW_WRITE_ENSURE_BYTES(thr, bw, DUK_HSTRING_GET_DATA(h_input) + match_end_boff, tmp_sz); r++; continue; } default: { #if defined(DUK_USE_REGEXP_SUPPORT) duk_int_t capnum, captmp, capadv; /* XXX: optional check, match_caps is zero if no regexp, * so dollar will be interpreted literally anyway. */ if (!is_regexp) { goto repl_write; } if (!(ch2 >= DUK_ASC_0 && ch2 <= DUK_ASC_9)) { goto repl_write; } capnum = ch2 - DUK_ASC_0; capadv = 1; if (left >= 2) { ch3 = r[1]; if (ch3 >= DUK_ASC_0 && ch3 <= DUK_ASC_9) { captmp = capnum * 10 + (ch3 - DUK_ASC_0); if (captmp < match_caps) { capnum = captmp; capadv = 2; } } } if (capnum > 0 && capnum < match_caps) { DUK_ASSERT(is_regexp != 0); /* match_caps == 0 without regexps */ /* regexp res_obj is at offset 4 */ duk_get_prop_index(thr, 4, (duk_uarridx_t) capnum); if (duk_is_string(thr, -1)) { duk_hstring *h_tmp_str; h_tmp_str = duk_known_hstring(thr, -1); DUK_BW_WRITE_ENSURE_HSTRING(thr, bw, h_tmp_str); } else { /* undefined -> skip (replaced with empty) */ } duk_pop(thr); r += capadv; continue; } else { goto repl_write; } #else /* DUK_USE_REGEXP_SUPPORT */ goto repl_write; /* unconditionally */ #endif /* DUK_USE_REGEXP_SUPPORT */ } /* default case */ } /* switch (ch2) */ repl_write: /* ch1 = (r_increment << 8) + byte */ DUK_BW_WRITE_ENSURE_U8(thr, bw, (duk_uint8_t) (ch1 & 0xff)); r += ch1 >> 8; } /* while repl */ } /* if (is_repl_func) */ duk_pop(thr); /* pop regexp res_obj or match string */ #if defined(DUK_USE_REGEXP_SUPPORT) if (!is_global) { #else { /* unconditionally; is_global==0 */ #endif break; } } /* trailer */ tmp_sz = (duk_size_t) (DUK_HSTRING_GET_BYTELEN(h_input) - prev_match_end_boff); DUK_BW_WRITE_ENSURE_BYTES(thr, bw, DUK_HSTRING_GET_DATA(h_input) + prev_match_end_boff, tmp_sz); DUK_ASSERT_TOP(thr, 4); DUK_BW_COMPACT(thr, bw); (void) duk_buffer_to_string(thr, -1); /* Safe if inputs are safe. */ return 1; } /* * split() */ /* XXX: very messy now, but works; clean up, remove unused variables (nomimally * used so compiler doesn't complain). */ DUK_INTERNAL duk_ret_t duk_bi_string_prototype_split(duk_hthread *thr) { duk_hstring *h_input; duk_hstring *h_sep; duk_uint32_t limit; duk_uint32_t arr_idx; #if defined(DUK_USE_REGEXP_SUPPORT) duk_bool_t is_regexp; #endif duk_bool_t matched; /* set to 1 if any match exists (needed for empty input special case) */ duk_uint32_t prev_match_end_coff, prev_match_end_boff; duk_uint32_t match_start_boff, match_start_coff; duk_uint32_t match_end_boff, match_end_coff; h_input = duk_push_this_coercible_to_string(thr); DUK_ASSERT(h_input != NULL); duk_push_array(thr); if (duk_is_undefined(thr, 1)) { limit = 0xffffffffUL; } else { limit = duk_to_uint32(thr, 1); } if (limit == 0) { return 1; } /* If the separator is a RegExp, make a "clone" of it. The specification * algorithm calls [[Match]] directly for specific indices; we emulate this * by tweaking lastIndex and using a "force global" variant of duk_regexp_match() * which will use global-style matching even when the RegExp itself is non-global. */ if (duk_is_undefined(thr, 0)) { /* The spec algorithm first does "R = ToString(separator)" before checking * whether separator is undefined. Since this is side effect free, we can * skip the ToString() here. */ duk_dup_2(thr); duk_put_prop_index(thr, 3, 0); return 1; } else if (duk_get_hobject_with_class(thr, 0, DUK_HOBJECT_CLASS_REGEXP) != NULL) { #if defined(DUK_USE_REGEXP_SUPPORT) duk_push_hobject_bidx(thr, DUK_BIDX_REGEXP_CONSTRUCTOR); duk_dup_0(thr); duk_new(thr, 1); /* [ ... RegExp val ] -> [ ... res ] */ duk_replace(thr, 0); /* lastIndex is initialized to zero by new RegExp() */ is_regexp = 1; #else DUK_DCERROR_UNSUPPORTED(thr); #endif } else { duk_to_string(thr, 0); #if defined(DUK_USE_REGEXP_SUPPORT) is_regexp = 0; #endif } /* stack[0] = separator (string or regexp) * stack[1] = limit * stack[2] = input string * stack[3] = result array */ prev_match_end_boff = 0; prev_match_end_coff = 0; arr_idx = 0; matched = 0; for (;;) { /* * The specification uses RegExp [[Match]] to attempt match at specific * offsets. We don't have such a primitive, so we use an actual RegExp * and tweak lastIndex. Since the RegExp may be non-global, we use a * special variant which forces global-like behavior for matching. */ DUK_ASSERT_TOP(thr, 4); #if defined(DUK_USE_REGEXP_SUPPORT) if (is_regexp) { duk_dup_0(thr); duk_dup_2(thr); duk_regexp_match_force_global(thr); /* [ ... regexp input ] -> [ res_obj ] */ if (!duk_is_object(thr, -1)) { duk_pop(thr); break; } matched = 1; duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INDEX); DUK_ASSERT(duk_is_number(thr, -1)); match_start_coff = duk_get_uint(thr, -1); match_start_boff = (duk_uint32_t) duk_heap_strcache_offset_char2byte(thr, h_input, match_start_coff); duk_pop(thr); if (match_start_coff == DUK_HSTRING_GET_CHARLEN(h_input)) { /* don't allow an empty match at the end of the string */ duk_pop(thr); break; } duk_get_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX); DUK_ASSERT(duk_is_number(thr, -1)); match_end_coff = duk_get_uint(thr, -1); match_end_boff = (duk_uint32_t) duk_heap_strcache_offset_char2byte(thr, h_input, match_end_coff); duk_pop(thr); /* empty match -> bump and continue */ if (prev_match_end_boff == match_end_boff) { duk_push_uint(thr, (duk_uint_t) (match_end_coff + 1)); duk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX); duk_pop(thr); continue; } } else { #else /* DUK_USE_REGEXP_SUPPORT */ { /* unconditionally */ #endif /* DUK_USE_REGEXP_SUPPORT */ const duk_uint8_t *p_start, *p_end, *p; /* input string scan */ const duk_uint8_t *q_start; /* match string */ duk_size_t q_blen, q_clen; p_start = DUK_HSTRING_GET_DATA(h_input); p_end = p_start + DUK_HSTRING_GET_BYTELEN(h_input); p = p_start + prev_match_end_boff; h_sep = duk_known_hstring(thr, 0); /* symbol already rejected above */ q_start = DUK_HSTRING_GET_DATA(h_sep); q_blen = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h_sep); q_clen = (duk_size_t) DUK_HSTRING_GET_CHARLEN(h_sep); p_end -= q_blen; /* ensure full memcmp() fits in while */ match_start_coff = prev_match_end_coff; if (q_blen == 0) { /* Handle empty separator case: it will always match, and always * triggers the check in step 13.c.iii initially. Note that we * must skip to either end of string or start of first codepoint, * skipping over any continuation bytes! * * Don't allow an empty string to match at the end of the input. */ matched = 1; /* empty separator can always match */ match_start_coff++; p++; while (p < p_end) { if ((p[0] & 0xc0) != 0x80) { goto found; } p++; } goto not_found; } DUK_ASSERT(q_blen > 0 && q_clen > 0); while (p <= p_end) { DUK_ASSERT(p + q_blen <= DUK_HSTRING_GET_DATA(h_input) + DUK_HSTRING_GET_BYTELEN(h_input)); DUK_ASSERT(q_blen > 0); /* no issues with empty memcmp() */ if (DUK_MEMCMP((const void *) p, (const void *) q_start, (size_t) q_blen) == 0) { /* never an empty match, so step 13.c.iii can't be triggered */ goto found; } /* track utf-8 non-continuation bytes */ if ((p[0] & 0xc0) != 0x80) { match_start_coff++; } p++; } not_found: /* not found */ break; found: matched = 1; match_start_boff = (duk_uint32_t) (p - p_start); match_end_coff = (duk_uint32_t) (match_start_coff + q_clen); /* constrained by string length */ match_end_boff = (duk_uint32_t) (match_start_boff + q_blen); /* ditto */ /* empty match (may happen with empty separator) -> bump and continue */ if (prev_match_end_boff == match_end_boff) { prev_match_end_boff++; prev_match_end_coff++; continue; } } /* if (is_regexp) */ /* stack[0] = separator (string or regexp) * stack[1] = limit * stack[2] = input string * stack[3] = result array * stack[4] = regexp res_obj (if is_regexp) */ DUK_DDD(DUK_DDDPRINT("split; match_start b=%ld,c=%ld, match_end b=%ld,c=%ld, prev_end b=%ld,c=%ld", (long) match_start_boff, (long) match_start_coff, (long) match_end_boff, (long) match_end_coff, (long) prev_match_end_boff, (long) prev_match_end_coff)); duk_push_lstring(thr, (const char *) (DUK_HSTRING_GET_DATA(h_input) + prev_match_end_boff), (duk_size_t) (match_start_boff - prev_match_end_boff)); duk_put_prop_index(thr, 3, arr_idx); arr_idx++; if (arr_idx >= limit) { goto hit_limit; } #if defined(DUK_USE_REGEXP_SUPPORT) if (is_regexp) { duk_size_t i, len; len = duk_get_length(thr, 4); for (i = 1; i < len; i++) { DUK_ASSERT(i <= DUK_UARRIDX_MAX); /* cannot have >4G captures */ duk_get_prop_index(thr, 4, (duk_uarridx_t) i); duk_put_prop_index(thr, 3, arr_idx); arr_idx++; if (arr_idx >= limit) { goto hit_limit; } } duk_pop(thr); /* lastIndex already set up for next match */ } else { #else /* DUK_USE_REGEXP_SUPPORT */ { /* unconditionally */ #endif /* DUK_USE_REGEXP_SUPPORT */ /* no action */ } prev_match_end_boff = match_end_boff; prev_match_end_coff = match_end_coff; continue; } /* for */ /* Combined step 11 (empty string special case) and 14-15. */ DUK_DDD(DUK_DDDPRINT("split trailer; prev_end b=%ld,c=%ld", (long) prev_match_end_boff, (long) prev_match_end_coff)); if (DUK_HSTRING_GET_BYTELEN(h_input) > 0 || !matched) { /* Add trailer if: * a) non-empty input * b) empty input and no (zero size) match found (step 11) */ duk_push_lstring(thr, (const char *) DUK_HSTRING_GET_DATA(h_input) + prev_match_end_boff, (duk_size_t) (DUK_HSTRING_GET_BYTELEN(h_input) - prev_match_end_boff)); duk_put_prop_index(thr, 3, arr_idx); /* No arr_idx update or limit check */ } return 1; hit_limit: #if defined(DUK_USE_REGEXP_SUPPORT) if (is_regexp) { duk_pop(thr); } #endif return 1; } /* * Various */ #if defined(DUK_USE_REGEXP_SUPPORT) DUK_LOCAL void duk__to_regexp_helper(duk_hthread *thr, duk_idx_t idx, duk_bool_t force_new) { duk_hobject *h; /* Shared helper for match() steps 3-4, search() steps 3-4. */ DUK_ASSERT(idx >= 0); if (force_new) { goto do_new; } h = duk_get_hobject_with_class(thr, idx, DUK_HOBJECT_CLASS_REGEXP); if (!h) { goto do_new; } return; do_new: duk_push_hobject_bidx(thr, DUK_BIDX_REGEXP_CONSTRUCTOR); duk_dup(thr, idx); duk_new(thr, 1); /* [ ... RegExp val ] -> [ ... res ] */ duk_replace(thr, idx); } #endif /* DUK_USE_REGEXP_SUPPORT */ #if defined(DUK_USE_REGEXP_SUPPORT) DUK_INTERNAL duk_ret_t duk_bi_string_prototype_search(duk_hthread *thr) { /* Easiest way to implement the search required by the specification * is to do a RegExp test() with lastIndex forced to zero. To avoid * side effects on the argument, "clone" the RegExp if a RegExp was * given as input. * * The global flag of the RegExp should be ignored; setting lastIndex * to zero (which happens when "cloning" the RegExp) should have an * equivalent effect. */ DUK_ASSERT_TOP(thr, 1); (void) duk_push_this_coercible_to_string(thr); /* at index 1 */ duk__to_regexp_helper(thr, 0 /*index*/, 1 /*force_new*/); /* stack[0] = regexp * stack[1] = string */ /* Avoid using RegExp.prototype methods, as they're writable and * configurable and may have been changed. */ duk_dup_0(thr); duk_dup_1(thr); /* [ ... re_obj input ] */ duk_regexp_match(thr); /* -> [ ... res_obj ] */ if (!duk_is_object(thr, -1)) { duk_push_int(thr, -1); return 1; } duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INDEX); DUK_ASSERT(duk_is_number(thr, -1)); return 1; } #endif /* DUK_USE_REGEXP_SUPPORT */ #if defined(DUK_USE_REGEXP_SUPPORT) DUK_INTERNAL duk_ret_t duk_bi_string_prototype_match(duk_hthread *thr) { duk_bool_t global; duk_int_t prev_last_index; duk_int_t this_index; duk_int_t arr_idx; DUK_ASSERT_TOP(thr, 1); (void) duk_push_this_coercible_to_string(thr); duk__to_regexp_helper(thr, 0 /*index*/, 0 /*force_new*/); global = duk_get_prop_stridx_boolean(thr, 0, DUK_STRIDX_GLOBAL, NULL); DUK_ASSERT_TOP(thr, 2); /* stack[0] = regexp * stack[1] = string */ if (!global) { duk_regexp_match(thr); /* -> [ res_obj ] */ return 1; /* return 'res_obj' */ } /* Global case is more complex. */ /* [ regexp string ] */ duk_push_int(thr, 0); duk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX); duk_push_array(thr); /* [ regexp string res_arr ] */ prev_last_index = 0; arr_idx = 0; for (;;) { DUK_ASSERT_TOP(thr, 3); duk_dup_0(thr); duk_dup_1(thr); duk_regexp_match(thr); /* -> [ ... regexp string ] -> [ ... res_obj ] */ if (!duk_is_object(thr, -1)) { duk_pop(thr); break; } duk_get_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX); DUK_ASSERT(duk_is_number(thr, -1)); this_index = duk_get_int(thr, -1); duk_pop(thr); if (this_index == prev_last_index) { this_index++; duk_push_int(thr, this_index); duk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX); } prev_last_index = this_index; duk_get_prop_index(thr, -1, 0); /* match string */ duk_put_prop_index(thr, 2, (duk_uarridx_t) arr_idx); arr_idx++; duk_pop(thr); /* res_obj */ } if (arr_idx == 0) { duk_push_null(thr); } return 1; /* return 'res_arr' or 'null' */ } #endif /* DUK_USE_REGEXP_SUPPORT */ DUK_INTERNAL duk_ret_t duk_bi_string_prototype_concat(duk_hthread *thr) { /* duk_concat() coerces arguments with ToString() in correct order */ (void) duk_push_this_coercible_to_string(thr); duk_insert(thr, 0); /* this is relatively expensive */ duk_concat(thr, duk_get_top(thr)); return 1; } DUK_INTERNAL duk_ret_t duk_bi_string_prototype_trim(duk_hthread *thr) { DUK_ASSERT_TOP(thr, 0); (void) duk_push_this_coercible_to_string(thr); duk_trim(thr, 0); DUK_ASSERT_TOP(thr, 1); return 1; } #if defined(DUK_USE_ES6) DUK_INTERNAL duk_ret_t duk_bi_string_prototype_repeat(duk_hthread *thr) { duk_hstring *h_input; duk_size_t input_blen; duk_size_t result_len; duk_int_t count_signed; duk_uint_t count; const duk_uint8_t *src; duk_uint8_t *buf; duk_uint8_t *p; duk_double_t d; #if !defined(DUK_USE_PREFER_SIZE) duk_size_t copy_size; duk_uint8_t *p_end; #endif DUK_ASSERT_TOP(thr, 1); h_input = duk_push_this_coercible_to_string(thr); DUK_ASSERT(h_input != NULL); input_blen = DUK_HSTRING_GET_BYTELEN(h_input); /* Count is ToNumber() coerced; +Infinity must be always rejected * (even if input string is zero length), as well as negative values * and -Infinity. -Infinity doesn't require an explicit check * because duk_get_int() clamps it to DUK_INT_MIN which gets rejected * as a negative value (regardless of input string length). */ d = duk_to_number(thr, 0); if (duk_double_is_posinf(d)) { goto fail_range; } count_signed = duk_get_int(thr, 0); if (count_signed < 0) { goto fail_range; } count = (duk_uint_t) count_signed; /* Overflow check for result length. */ result_len = count * input_blen; if (count != 0 && result_len / count != input_blen) { goto fail_range; } /* Temporary fixed buffer, later converted to string. */ buf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, result_len); src = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_input); #if defined(DUK_USE_PREFER_SIZE) p = buf; while (count-- > 0) { DUK_MEMCPY((void *) p, (const void *) src, input_blen); /* copy size may be zero */ p += input_blen; } #else /* DUK_USE_PREFER_SIZE */ /* Take advantage of already copied pieces to speed up the process * especially for small repeated strings. */ p = buf; p_end = p + result_len; copy_size = input_blen; for (;;) { duk_size_t remain = (duk_size_t) (p_end - p); DUK_DDD(DUK_DDDPRINT("remain=%ld, copy_size=%ld, input_blen=%ld, result_len=%ld", (long) remain, (long) copy_size, (long) input_blen, (long) result_len)); if (remain <= copy_size) { /* If result_len is zero, this case is taken and does * a zero size copy. */ DUK_MEMCPY((void *) p, (const void *) src, remain); break; } else { DUK_MEMCPY((void *) p, (const void *) src, copy_size); p += copy_size; } src = (const duk_uint8_t *) buf; /* Use buf as source for larger copies. */ copy_size = (duk_size_t) (p - buf); } #endif /* DUK_USE_PREFER_SIZE */ /* XXX: It would be useful to be able to create a duk_hstring with * a certain byte size whose data area wasn't initialized and which * wasn't in the string table yet. This would allow a string to be * constructed directly without a buffer temporary and when it was * finished, it could be injected into the string table. Currently * this isn't possible because duk_hstrings are only tracked by the * intern table (they are not in heap_allocated). */ duk_buffer_to_string(thr, -1); /* Safe if input is safe. */ return 1; fail_range: DUK_DCERROR_RANGE_INVALID_ARGS(thr); } #endif /* DUK_USE_ES6 */ DUK_INTERNAL duk_ret_t duk_bi_string_prototype_locale_compare(duk_hthread *thr) { duk_hstring *h1; duk_hstring *h2; duk_size_t h1_len, h2_len, prefix_len; duk_small_int_t ret = 0; duk_small_int_t rc; /* The current implementation of localeCompare() is simply a codepoint * by codepoint comparison, implemented with a simple string compare * because UTF-8 should preserve codepoint ordering (assuming valid * shortest UTF-8 encoding). * * The specification requires that the return value must be related * to the sort order: e.g. negative means that 'this' comes before * 'that' in sort order. We assume an ascending sort order. */ /* XXX: could share code with duk_js_ops.c, duk_js_compare_helper */ h1 = duk_push_this_coercible_to_string(thr); DUK_ASSERT(h1 != NULL); h2 = duk_to_hstring(thr, 0); DUK_ASSERT(h2 != NULL); h1_len = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h1); h2_len = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h2); prefix_len = (h1_len <= h2_len ? h1_len : h2_len); /* Zero size compare not an issue with DUK_MEMCMP. */ rc = (duk_small_int_t) DUK_MEMCMP((const void *) DUK_HSTRING_GET_DATA(h1), (const void *) DUK_HSTRING_GET_DATA(h2), (size_t) prefix_len); if (rc < 0) { ret = -1; goto done; } else if (rc > 0) { ret = 1; goto done; } /* prefix matches, lengths matter now */ if (h1_len > h2_len) { ret = 1; goto done; } else if (h1_len == h2_len) { DUK_ASSERT(ret == 0); goto done; } ret = -1; goto done; done: duk_push_int(thr, (duk_int_t) ret); return 1; } #if defined(DUK_USE_ES6) DUK_INTERNAL duk_ret_t duk_bi_string_prototype_startswith_endswith(duk_hthread *thr) { duk_int_t magic; duk_hstring *h; duk_hstring *h_search; duk_size_t blen_search; const duk_uint8_t *p_cmp_start; duk_bool_t result; h = duk_push_this_coercible_to_string(thr); DUK_ASSERT(h != NULL); h_search = duk__str_tostring_notregexp(thr, 0); DUK_ASSERT(h_search != NULL); magic = duk_get_current_magic(thr); p_cmp_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h); blen_search = DUK_HSTRING_GET_BYTELEN(h_search); if (duk_is_undefined(thr, 1)) { if (magic) { p_cmp_start += DUK_HSTRING_GET_BYTELEN(h) - blen_search; } else { /* p_cmp_start already OK */ } } else { duk_int_t len; duk_int_t pos; DUK_ASSERT(DUK_HSTRING_MAX_BYTELEN <= DUK_INT_MAX); len = (duk_int_t) DUK_HSTRING_GET_CHARLEN(h); pos = duk_to_int_clamped(thr, 1, 0, len); DUK_ASSERT(pos >= 0 && pos <= len); if (magic) { p_cmp_start -= blen_search; /* Conceptually subtracted last, but do already here. */ } DUK_ASSERT(pos >= 0 && pos <= len); p_cmp_start += duk_heap_strcache_offset_char2byte(thr, h, (duk_uint_fast32_t) pos); } /* The main comparison can be done using a memcmp() rather than * doing codepoint comparisons: for CESU-8 strings there is a * canonical representation for every codepoint. But we do need * to deal with the char/byte offset translation to find the * comparison range. */ result = 0; if (p_cmp_start >= DUK_HSTRING_GET_DATA(h) && (duk_size_t) (p_cmp_start - (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h)) + blen_search <= DUK_HSTRING_GET_BYTELEN(h)) { if (DUK_MEMCMP((const void *) p_cmp_start, (const void *) DUK_HSTRING_GET_DATA(h_search), (size_t) blen_search) == 0) { result = 1; } } duk_push_boolean(thr, result); return 1; } #endif /* DUK_USE_ES6 */ #if defined(DUK_USE_ES6) DUK_INTERNAL duk_ret_t duk_bi_string_prototype_includes(duk_hthread *thr) { duk_hstring *h; duk_hstring *h_search; duk_int_t len; duk_int_t pos; h = duk_push_this_coercible_to_string(thr); DUK_ASSERT(h != NULL); h_search = duk__str_tostring_notregexp(thr, 0); DUK_ASSERT(h_search != NULL); len = (duk_int_t) DUK_HSTRING_GET_CHARLEN(h); pos = duk_to_int_clamped(thr, 1, 0, len); DUK_ASSERT(pos >= 0 && pos <= len); pos = duk__str_search_shared(thr, h, h_search, pos, 0 /*backwards*/); duk_push_boolean(thr, pos >= 0); return 1; } #endif /* DUK_USE_ES6 */ #endif /* DUK_USE_STRING_BUILTIN */ #line 1 "duk_bi_symbol.c" /* * Symbol built-in */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_SYMBOL_BUILTIN) /* * Constructor */ DUK_INTERNAL duk_ret_t duk_bi_symbol_constructor_shared(duk_hthread *thr) { const duk_uint8_t *desc; duk_size_t len; duk_uint8_t *buf; duk_uint8_t *p; duk_int_t magic; magic = duk_get_current_magic(thr); if (duk_is_undefined(thr, 0) && (magic == 0)) { /* Symbol() accepts undefined and empty string, but they are * treated differently. */ desc = NULL; len = 0; } else { /* Symbol.for() coerces undefined to 'undefined' */ desc = (const duk_uint8_t *) duk_to_lstring(thr, 0, &len); } /* Maximum symbol data length: * +1 initial byte (0x80 or 0x81) * +len description * +1 0xff after description, before unique suffix * +17 autogenerated unique suffix: 'ffffffff-ffffffff' is longest * +1 0xff after unique suffix for symbols with undefined description */ buf = (duk_uint8_t *) duk_push_fixed_buffer(thr, 1 + len + 1 + 17 + 1); p = buf + 1; DUK_ASSERT(desc != NULL || len == 0); /* may be NULL if len is 0 */ DUK_MEMCPY((void *) p, (const void *) desc, len); p += len; if (magic == 0) { /* Symbol(): create unique symbol. Use two 32-bit values * to avoid dependency on 64-bit types and 64-bit integer * formatting (at least for now). */ if (++thr->heap->sym_counter[0] == 0) { thr->heap->sym_counter[1]++; } p += DUK_SPRINTF((char *) p, "\xFF" "%lx-%lx", (unsigned long) thr->heap->sym_counter[1], (unsigned long) thr->heap->sym_counter[0]); if (desc == NULL) { /* Special case for 'undefined' description, trailing * 0xff distinguishes from empty string description, * but needs minimal special case handling elsewhere. */ *p++ = 0xff; } buf[0] = 0x81; } else { /* Symbol.for(): create a global symbol */ buf[0] = 0x80; } duk_push_lstring(thr, (const char *) buf, (duk_size_t) (p - buf)); DUK_DDD(DUK_DDDPRINT("created symbol: %!T", duk_get_tval(thr, -1))); return 1; } DUK_LOCAL duk_hstring *duk__auto_unbox_symbol(duk_hthread *thr, duk_tval *tv_arg) { duk_tval *tv; duk_tval tv_val; duk_hobject *h_obj; duk_hstring *h_str; DUK_ASSERT(tv_arg != NULL); /* XXX: add internal helper: duk_auto_unbox_tval(thr, tv, mask); */ /* XXX: add internal helper: duk_auto_unbox(thr, tv, idx); */ tv = tv_arg; if (DUK_TVAL_IS_OBJECT(tv)) { h_obj = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h_obj != NULL); if (DUK_HOBJECT_GET_CLASS_NUMBER(h_obj) == DUK_HOBJECT_CLASS_SYMBOL) { if (!duk_hobject_get_internal_value(thr->heap, h_obj, &tv_val)) { return NULL; } tv = &tv_val; } else { return NULL; } } if (!DUK_TVAL_IS_STRING(tv)) { return NULL; } h_str = DUK_TVAL_GET_STRING(tv); DUK_ASSERT(h_str != NULL); /* Here symbol is more expected than not. */ if (DUK_UNLIKELY(!DUK_HSTRING_HAS_SYMBOL(h_str))) { return NULL; } return h_str; } DUK_INTERNAL duk_ret_t duk_bi_symbol_tostring_shared(duk_hthread *thr) { duk_hstring *h_str; h_str = duk__auto_unbox_symbol(thr, DUK_HTHREAD_THIS_PTR(thr)); if (h_str == NULL) { return DUK_RET_TYPE_ERROR; } if (duk_get_current_magic(thr) == 0) { /* .toString() */ duk_push_symbol_descriptive_string(thr, h_str); } else { /* .valueOf() */ duk_push_hstring(thr, h_str); } return 1; } DUK_INTERNAL duk_ret_t duk_bi_symbol_key_for(duk_hthread *thr) { duk_hstring *h; const duk_uint8_t *p; /* Argument must be a symbol but not checked here. The initial byte * check will catch non-symbol strings. */ h = duk_require_hstring(thr, 0); DUK_ASSERT(h != NULL); p = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h); DUK_ASSERT(p != NULL); /* Even for zero length strings there's at least one NUL byte so * we can safely check the initial byte. */ if (p[0] == 0x80) { /* Global symbol, return its key (bytes just after the initial byte). */ duk_push_lstring(thr, (const char *) (p + 1), (duk_size_t) (DUK_HSTRING_GET_BYTELEN(h) - 1)); return 1; } else if (p[0] == 0x81 || p[0] == 0x82 || p[0] == 0xff) { /* Local symbol or hidden symbol, return undefined. */ return 0; } /* Covers normal strings and unknown initial bytes. */ return DUK_RET_TYPE_ERROR; } DUK_INTERNAL duk_ret_t duk_bi_symbol_toprimitive(duk_hthread *thr) { duk_hstring *h_str; h_str = duk__auto_unbox_symbol(thr, DUK_HTHREAD_THIS_PTR(thr)); if (h_str == NULL) { return DUK_RET_TYPE_ERROR; } duk_push_hstring(thr, h_str); return 1; } #endif /* DUK_USE_SYMBOL_BUILTIN */ #line 1 "duk_bi_thread.c" /* * Thread builtins */ /* #include duk_internal.h -> already included */ /* * Constructor */ #if defined(DUK_USE_COROUTINE_SUPPORT) DUK_INTERNAL duk_ret_t duk_bi_thread_constructor(duk_hthread *thr) { duk_hthread *new_thr; duk_hobject *func; /* Check that the argument is callable; this is not 100% because we * don't allow native functions to be a thread's initial function. * Resume will reject such functions in any case. */ /* XXX: need a duk_require_func_promote_lfunc() */ func = duk_require_hobject_promote_lfunc(thr, 0); DUK_ASSERT(func != NULL); duk_require_callable(thr, 0); duk_push_thread(thr); new_thr = (duk_hthread *) duk_known_hobject(thr, -1); new_thr->state = DUK_HTHREAD_STATE_INACTIVE; /* push initial function call to new thread stack; this is * picked up by resume(). */ duk_push_hobject(new_thr, func); return 1; /* return thread */ } #endif /* * Resume a thread. * * The thread must be in resumable state, either (a) new thread which hasn't * yet started, or (b) a thread which has previously yielded. This method * must be called from an Ecmascript function. * * Args: * - thread * - value * - isError (defaults to false) * * Note: yield and resume handling is currently asymmetric. */ #if defined(DUK_USE_COROUTINE_SUPPORT) DUK_INTERNAL duk_ret_t duk_bi_thread_resume(duk_hthread *ctx) { duk_hthread *thr = (duk_hthread *) ctx; duk_hthread *thr_resume; duk_hobject *caller_func; duk_small_uint_t is_error; DUK_DDD(DUK_DDDPRINT("Duktape.Thread.resume(): thread=%!T, value=%!T, is_error=%!T", (duk_tval *) duk_get_tval(thr, 0), (duk_tval *) duk_get_tval(thr, 1), (duk_tval *) duk_get_tval(thr, 2))); DUK_ASSERT(thr->state == DUK_HTHREAD_STATE_RUNNING); DUK_ASSERT(thr->heap->curr_thread == thr); thr_resume = duk_require_hthread(thr, 0); is_error = (duk_small_uint_t) duk_to_boolean(thr, 2); duk_set_top(thr, 2); /* [ thread value ] */ /* * Thread state and calling context checks */ if (thr->callstack_top < 2) { DUK_DD(DUK_DDPRINT("resume state invalid: callstack should contain at least 2 entries (caller and Duktape.Thread.resume)")); goto state_error; } DUK_ASSERT(thr->callstack_curr != NULL); DUK_ASSERT(thr->callstack_curr->parent != NULL); DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL); /* us */ DUK_ASSERT(DUK_HOBJECT_IS_NATFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr))); DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr->parent) != NULL); /* caller */ caller_func = DUK_ACT_GET_FUNC(thr->callstack_curr->parent); if (!DUK_HOBJECT_IS_COMPFUNC(caller_func)) { DUK_DD(DUK_DDPRINT("resume state invalid: caller must be Ecmascript code")); goto state_error; } /* Note: there is no requirement that: 'thr->callstack_preventcount == 1' * like for yield. */ if (thr_resume->state != DUK_HTHREAD_STATE_INACTIVE && thr_resume->state != DUK_HTHREAD_STATE_YIELDED) { DUK_DD(DUK_DDPRINT("resume state invalid: target thread must be INACTIVE or YIELDED")); goto state_error; } DUK_ASSERT(thr_resume->state == DUK_HTHREAD_STATE_INACTIVE || thr_resume->state == DUK_HTHREAD_STATE_YIELDED); /* Further state-dependent pre-checks */ if (thr_resume->state == DUK_HTHREAD_STATE_YIELDED) { /* no pre-checks now, assume a previous yield() has left things in * tip-top shape (longjmp handler will assert for these). */ } else { duk_hobject *h_fun; DUK_ASSERT(thr_resume->state == DUK_HTHREAD_STATE_INACTIVE); /* The initial function must be an Ecmascript function (but * can be bound). We must make sure of that before we longjmp * because an error in the RESUME handler call processing will * not be handled very cleanly. */ if ((thr_resume->callstack_top != 0) || (thr_resume->valstack_top - thr_resume->valstack != 1)) { goto state_error; } duk_push_tval(thr, DUK_GET_TVAL_NEGIDX(thr_resume, -1)); duk_resolve_nonbound_function(thr); h_fun = duk_require_hobject(thr, -1); /* reject lightfuncs on purpose */ if (!DUK_HOBJECT_IS_CALLABLE(h_fun) || !DUK_HOBJECT_IS_COMPFUNC(h_fun)) { goto state_error; } duk_pop(thr); } /* * The error object has been augmented with a traceback and other * info from its creation point -- usually another thread. The * error handler is called here right before throwing, but it also * runs in the resumer's thread. It might be nice to get a traceback * from the resumee but this is not the case now. */ #if defined(DUK_USE_AUGMENT_ERROR_THROW) if (is_error) { DUK_ASSERT_TOP(thr, 2); /* value (error) is at stack top */ duk_err_augment_error_throw(thr); /* in resumer's context */ } #endif #if defined(DUK_USE_DEBUG) if (is_error) { DUK_DDD(DUK_DDDPRINT("RESUME ERROR: thread=%!T, value=%!T", (duk_tval *) duk_get_tval(thr, 0), (duk_tval *) duk_get_tval(thr, 1))); } else if (thr_resume->state == DUK_HTHREAD_STATE_YIELDED) { DUK_DDD(DUK_DDDPRINT("RESUME NORMAL: thread=%!T, value=%!T", (duk_tval *) duk_get_tval(thr, 0), (duk_tval *) duk_get_tval(thr, 1))); } else { DUK_DDD(DUK_DDDPRINT("RESUME INITIAL: thread=%!T, value=%!T", (duk_tval *) duk_get_tval(thr, 0), (duk_tval *) duk_get_tval(thr, 1))); } #endif thr->heap->lj.type = DUK_LJ_TYPE_RESUME; /* lj value2: thread */ DUK_ASSERT(thr->valstack_bottom < thr->valstack_top); DUK_TVAL_SET_TVAL_UPDREF(thr, &thr->heap->lj.value2, &thr->valstack_bottom[0]); /* side effects */ /* lj value1: value */ DUK_ASSERT(thr->valstack_bottom + 1 < thr->valstack_top); DUK_TVAL_SET_TVAL_UPDREF(thr, &thr->heap->lj.value1, &thr->valstack_bottom[1]); /* side effects */ DUK_TVAL_CHKFAST_INPLACE_SLOW(&thr->heap->lj.value1); thr->heap->lj.iserror = is_error; DUK_ASSERT(thr->heap->lj.jmpbuf_ptr != NULL); /* call is from executor, so we know we have a jmpbuf */ duk_err_longjmp(thr); /* execution resumes in bytecode executor */ DUK_UNREACHABLE(); /* Never here, fall through to error (from compiler point of view). */ state_error: DUK_DCERROR_TYPE_INVALID_STATE(thr); } #endif /* * Yield the current thread. * * The thread must be in yieldable state: it must have a resumer, and there * must not be any yield-preventing calls (native calls and constructor calls, * currently) in the thread's call stack (otherwise a resume would not be * possible later). This method must be called from an Ecmascript function. * * Args: * - value * - isError (defaults to false) * * Note: yield and resume handling is currently asymmetric. */ #if defined(DUK_USE_COROUTINE_SUPPORT) DUK_INTERNAL duk_ret_t duk_bi_thread_yield(duk_hthread *thr) { duk_hobject *caller_func; duk_small_uint_t is_error; DUK_DDD(DUK_DDDPRINT("Duktape.Thread.yield(): value=%!T, is_error=%!T", (duk_tval *) duk_get_tval(thr, 0), (duk_tval *) duk_get_tval(thr, 1))); DUK_ASSERT(thr->state == DUK_HTHREAD_STATE_RUNNING); DUK_ASSERT(thr->heap->curr_thread == thr); is_error = (duk_small_uint_t) duk_to_boolean(thr, 1); duk_set_top(thr, 1); /* [ value ] */ /* * Thread state and calling context checks */ if (!thr->resumer) { DUK_DD(DUK_DDPRINT("yield state invalid: current thread must have a resumer")); goto state_error; } DUK_ASSERT(thr->resumer->state == DUK_HTHREAD_STATE_RESUMED); if (thr->callstack_top < 2) { DUK_DD(DUK_DDPRINT("yield state invalid: callstack should contain at least 2 entries (caller and Duktape.Thread.yield)")); goto state_error; } DUK_ASSERT(thr->callstack_curr != NULL); DUK_ASSERT(thr->callstack_curr->parent != NULL); DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL); /* us */ DUK_ASSERT(DUK_HOBJECT_IS_NATFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr))); DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr->parent) != NULL); /* caller */ caller_func = DUK_ACT_GET_FUNC(thr->callstack_curr->parent); if (!DUK_HOBJECT_IS_COMPFUNC(caller_func)) { DUK_DD(DUK_DDPRINT("yield state invalid: caller must be Ecmascript code")); goto state_error; } DUK_ASSERT(thr->callstack_preventcount >= 1); /* should never be zero, because we (Duktape.Thread.yield) are on the stack */ if (thr->callstack_preventcount != 1) { /* Note: the only yield-preventing call is Duktape.Thread.yield(), hence check for 1, not 0 */ DUK_DD(DUK_DDPRINT("yield state invalid: there must be no yield-preventing calls in current thread callstack (preventcount is %ld)", (long) thr->callstack_preventcount)); goto state_error; } /* * The error object has been augmented with a traceback and other * info from its creation point -- usually the current thread. * The error handler, however, is called right before throwing * and runs in the yielder's thread. */ #if defined(DUK_USE_AUGMENT_ERROR_THROW) if (is_error) { DUK_ASSERT_TOP(thr, 1); /* value (error) is at stack top */ duk_err_augment_error_throw(thr); /* in yielder's context */ } #endif #if defined(DUK_USE_DEBUG) if (is_error) { DUK_DDD(DUK_DDDPRINT("YIELD ERROR: value=%!T", (duk_tval *) duk_get_tval(thr, 0))); } else { DUK_DDD(DUK_DDDPRINT("YIELD NORMAL: value=%!T", (duk_tval *) duk_get_tval(thr, 0))); } #endif /* * Process yield * * After longjmp(), processing continues in bytecode executor longjmp * handler, which will e.g. update thr->resumer to NULL. */ thr->heap->lj.type = DUK_LJ_TYPE_YIELD; /* lj value1: value */ DUK_ASSERT(thr->valstack_bottom < thr->valstack_top); DUK_TVAL_SET_TVAL_UPDREF(thr, &thr->heap->lj.value1, &thr->valstack_bottom[0]); /* side effects */ DUK_TVAL_CHKFAST_INPLACE_SLOW(&thr->heap->lj.value1); thr->heap->lj.iserror = is_error; DUK_ASSERT(thr->heap->lj.jmpbuf_ptr != NULL); /* call is from executor, so we know we have a jmpbuf */ duk_err_longjmp(thr); /* execution resumes in bytecode executor */ DUK_UNREACHABLE(); /* Never here, fall through to error (from compiler point of view). */ state_error: DUK_DCERROR_TYPE_INVALID_STATE(thr); } #endif #if defined(DUK_USE_COROUTINE_SUPPORT) DUK_INTERNAL duk_ret_t duk_bi_thread_current(duk_hthread *thr) { duk_push_current_thread(thr); return 1; } #endif #line 1 "duk_bi_thrower.c" /* * Type error thrower, E5 Section 13.2.3. */ /* #include duk_internal.h -> already included */ DUK_INTERNAL duk_ret_t duk_bi_type_error_thrower(duk_hthread *thr) { DUK_DCERROR_TYPE_INVALID_ARGS(thr); } #line 1 "duk_debug_fixedbuffer.c" /* * Fixed buffer helper useful for debugging, requires no allocation * which is critical for debugging. */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_DEBUG) DUK_INTERNAL void duk_fb_put_bytes(duk_fixedbuffer *fb, const duk_uint8_t *buffer, duk_size_t length) { duk_size_t avail; duk_size_t copylen; avail = (fb->offset >= fb->length ? (duk_size_t) 0 : (duk_size_t) (fb->length - fb->offset)); if (length > avail) { copylen = avail; fb->truncated = 1; } else { copylen = length; } DUK_MEMCPY(fb->buffer + fb->offset, buffer, copylen); fb->offset += copylen; } DUK_INTERNAL void duk_fb_put_byte(duk_fixedbuffer *fb, duk_uint8_t x) { duk_fb_put_bytes(fb, (const duk_uint8_t *) &x, 1); } DUK_INTERNAL void duk_fb_put_cstring(duk_fixedbuffer *fb, const char *x) { duk_fb_put_bytes(fb, (const duk_uint8_t *) x, (duk_size_t) DUK_STRLEN(x)); } DUK_INTERNAL void duk_fb_sprintf(duk_fixedbuffer *fb, const char *fmt, ...) { duk_size_t avail; va_list ap; va_start(ap, fmt); avail = (fb->offset >= fb->length ? (duk_size_t) 0 : (duk_size_t) (fb->length - fb->offset)); if (avail > 0) { duk_int_t res = (duk_int_t) DUK_VSNPRINTF((char *) (fb->buffer + fb->offset), avail, fmt, ap); if (res < 0) { /* error */ } else if ((duk_size_t) res >= avail) { /* (maybe) truncated */ fb->offset += avail; if ((duk_size_t) res > avail) { /* actual chars dropped (not just NUL term) */ fb->truncated = 1; } } else { /* normal */ fb->offset += (duk_size_t) res; } } va_end(ap); } DUK_INTERNAL void duk_fb_put_funcptr(duk_fixedbuffer *fb, duk_uint8_t *fptr, duk_size_t fptr_size) { char buf[64+1]; duk_debug_format_funcptr(buf, sizeof(buf), fptr, fptr_size); buf[sizeof(buf) - 1] = (char) 0; duk_fb_put_cstring(fb, buf); } DUK_INTERNAL duk_bool_t duk_fb_is_full(duk_fixedbuffer *fb) { return (fb->offset >= fb->length); } #endif /* DUK_USE_DEBUG */ #line 1 "duk_debug_vsnprintf.c" /* * Custom formatter for debug printing, allowing Duktape specific data * structures (such as tagged values and heap objects) to be printed with * a nice format string. Because debug printing should not affect execution * state, formatting here must be independent of execution (see implications * below) and must not allocate memory. * * Custom format tags begin with a '%!' to safely distinguish them from * standard format tags. The following conversions are supported: * * %!T tagged value (duk_tval *) * %!O heap object (duk_heaphdr *) * %!I decoded bytecode instruction * %!C bytecode instruction opcode name (arg is long) * * Everything is serialized in a JSON-like manner. The default depth is one * level, internal prototype is not followed, and internal properties are not * serialized. The following modifiers change this behavior: * * @ print pointers * # print binary representations (where applicable) * d deep traversal of own properties (not prototype) * p follow prototype chain (useless without 'd') * i include internal properties (other than prototype) * x hexdump buffers * h heavy formatting * * For instance, the following serializes objects recursively, but does not * follow the prototype chain nor print internal properties: "%!dO". * * Notes: * * * Standard snprintf return value semantics seem to vary. This * implementation returns the number of bytes it actually wrote * (excluding the null terminator). If retval == buffer size, * output was truncated (except for corner cases). * * * Output format is intentionally different from Ecmascript * formatting requirements, as formatting here serves debugging * of internals. * * * Depth checking (and updating) is done in each type printer * separately, to allow them to call each other freely. * * * Some pathological structures might take ages to print (e.g. * self recursion with 100 properties pointing to the object * itself). To guard against these, each printer also checks * whether the output buffer is full; if so, early exit. * * * Reference loops are detected using a loop stack. */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_DEBUG) /* #include stdio.h -> already included */ /* #include stdarg.h -> already included */ #include <string.h> /* list of conversion specifiers that terminate a format tag; * this is unfortunately guesswork. */ #define DUK__ALLOWED_STANDARD_SPECIFIERS "diouxXeEfFgGaAcsCSpnm" /* maximum length of standard format tag that we support */ #define DUK__MAX_FORMAT_TAG_LENGTH 32 /* heapobj recursion depth when deep printing is selected */ #define DUK__DEEP_DEPTH_LIMIT 8 /* maximum recursion depth for loop detection stacks */ #define DUK__LOOP_STACK_DEPTH 256 /* must match bytecode defines now; build autogenerate? */ DUK_LOCAL const char * const duk__bc_optab[256] = { "LDREG", "STREG", "JUMP", "LDCONST", "LDINT", "LDINTX", "LDTHIS", "LDUNDEF", "LDNULL", "LDTRUE", "LDFALSE", "GETVAR", "BNOT", "LNOT", "UNM", "UNP", "EQ_RR", "EQ_CR", "EQ_RC", "EQ_CC", "NEQ_RR", "NEQ_CR", "NEQ_RC", "NEQ_CC", "SEQ_RR", "SEQ_CR", "SEQ_RC", "SEQ_CC", "SNEQ_RR", "SNEQ_CR", "SNEQ_RC", "SNEQ_CC", "GT_RR", "GT_CR", "GT_RC", "GT_CC", "GE_RR", "GE_CR", "GE_RC", "GE_CC", "LT_RR", "LT_CR", "LT_RC", "LT_CC", "LE_RR", "LE_CR", "LE_RC", "LE_CC", "IFTRUE_R", "IFTRUE_C", "IFFALSE_R", "IFFALSE_C", "ADD_RR", "ADD_CR", "ADD_RC", "ADD_CC", "SUB_RR", "SUB_CR", "SUB_RC", "SUB_CC", "MUL_RR", "MUL_CR", "MUL_RC", "MUL_CC", "DIV_RR", "DIV_CR", "DIV_RC", "DIV_CC", "MOD_RR", "MOD_CR", "MOD_RC", "MOD_CC", "EXP_RR", "EXP_CR", "EXP_RC", "EXP_CC", "BAND_RR", "BAND_CR", "BAND_RC", "BAND_CC", "BOR_RR", "BOR_CR", "BOR_RC", "BOR_CC", "BXOR_RR", "BXOR_CR", "BXOR_RC", "BXOR_CC", "BASL_RR", "BASL_CR", "BASL_RC", "BASL_CC", "BLSR_RR", "BLSR_CR", "BLSR_RC", "BLSR_CC", "BASR_RR", "BASR_CR", "BASR_RC", "BASR_CC", "INSTOF_RR", "INSTOF_CR", "INSTOF_RC", "INSTOF_CC", "IN_RR", "IN_CR", "IN_RC", "IN_CC", "GETPROP_RR", "GETPROP_CR", "GETPROP_RC", "GETPROP_CC", "PUTPROP_RR", "PUTPROP_CR", "PUTPROP_RC", "PUTPROP_CC", "DELPROP_RR", "DELPROP_CR", "DELPROP_RC", "DELPROP_CC", "PREINCR", "PREDECR", "POSTINCR", "POSTDECR", "PREINCV", "PREDECV", "POSTINCV", "POSTDECV", "PREINCP_RR", "PREINCP_CR", "PREINCP_RC", "PREINCP_CC", "PREDECP_RR", "PREDECP_CR", "PREDECP_RC", "PREDECP_CC", "POSTINCP_RR", "POSTINCP_CR", "POSTINCP_RC", "POSTINCP_CC", "POSTDECP_RR", "POSTDECP_CR", "POSTDECP_RC", "POSTDECP_CC", "DECLVAR_RR", "DECLVAR_CR", "DECLVAR_RC", "DECLVAR_CC", "REGEXP_RR", "REGEXP_RC", "REGEXP_CR", "REGEXP_CC", "CLOSURE", "TYPEOF", "TYPEOFID", "PUTVAR", "DELVAR", "RETREG", "RETUNDEF", "RETCONST", "RETCONSTN", "LABEL", "ENDLABEL", "BREAK", "CONTINUE", "TRYCATCH", "ENDTRY", "ENDCATCH", "ENDFIN", "THROW", "INVLHS", "CSREG", "CSVAR_RR", "CSVAR_CR", "CSVAR_RC", "CSVAR_CC", "CALL0", "CALL1", "CALL2", "CALL3", "CALL4", "CALL5", "CALL6", "CALL7", "CALL8", "CALL9", "CALL10", "CALL11", "CALL12", "CALL13", "CALL14", "CALL15", "NEWOBJ", "NEWARR", "MPUTOBJ", "MPUTOBJI", "INITSET", "INITGET", "MPUTARR", "MPUTARRI", "SETALEN", "INITENUM", "NEXTENUM", "NEWTARGET", "DEBUGGER", "NOP", "INVALID", "UNUSED207", "GETPROPC_RR", "GETPROPC_CR", "GETPROPC_RC", "GETPROPC_CC", "UNUSED212", "UNUSED213", "UNUSED214", "UNUSED215", "UNUSED216", "UNUSED217", "UNUSED218", "UNUSED219", "UNUSED220", "UNUSED221", "UNUSED222", "UNUSED223", "UNUSED224", "UNUSED225", "UNUSED226", "UNUSED227", "UNUSED228", "UNUSED229", "UNUSED230", "UNUSED231", "UNUSED232", "UNUSED233", "UNUSED234", "UNUSED235", "UNUSED236", "UNUSED237", "UNUSED238", "UNUSED239", "UNUSED240", "UNUSED241", "UNUSED242", "UNUSED243", "UNUSED244", "UNUSED245", "UNUSED246", "UNUSED247", "UNUSED248", "UNUSED249", "UNUSED250", "UNUSED251", "UNUSED252", "UNUSED253", "UNUSED254", "UNUSED255" }; typedef struct duk__dprint_state duk__dprint_state; struct duk__dprint_state { duk_fixedbuffer *fb; /* loop_stack_index could be perhaps be replaced by 'depth', but it's nice * to not couple these two mechanisms unnecessarily. */ duk_hobject *loop_stack[DUK__LOOP_STACK_DEPTH]; duk_int_t loop_stack_index; duk_int_t loop_stack_limit; duk_int_t depth; duk_int_t depth_limit; duk_bool_t pointer; duk_bool_t heavy; duk_bool_t binary; duk_bool_t follow_proto; duk_bool_t internal; duk_bool_t hexdump; }; /* helpers */ DUK_LOCAL_DECL void duk__print_hstring(duk__dprint_state *st, duk_hstring *k, duk_bool_t quotes); DUK_LOCAL_DECL void duk__print_hobject(duk__dprint_state *st, duk_hobject *h); DUK_LOCAL_DECL void duk__print_hbuffer(duk__dprint_state *st, duk_hbuffer *h); DUK_LOCAL_DECL void duk__print_tval(duk__dprint_state *st, duk_tval *tv); DUK_LOCAL_DECL void duk__print_instr(duk__dprint_state *st, duk_instr_t ins); DUK_LOCAL_DECL void duk__print_heaphdr(duk__dprint_state *st, duk_heaphdr *h); DUK_LOCAL_DECL void duk__print_shared_heaphdr(duk__dprint_state *st, duk_heaphdr *h); DUK_LOCAL_DECL void duk__print_shared_heaphdr_string(duk__dprint_state *st, duk_heaphdr_string *h); DUK_LOCAL void duk__print_shared_heaphdr(duk__dprint_state *st, duk_heaphdr *h) { duk_fixedbuffer *fb = st->fb; if (st->heavy) { duk_fb_sprintf(fb, "(%p)", (void *) h); } if (!h) { return; } if (st->binary) { duk_size_t i; duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_LBRACKET); for (i = 0; i < (duk_size_t) sizeof(*h); i++) { duk_fb_sprintf(fb, "%02lx", (unsigned long) ((duk_uint8_t *)h)[i]); } duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_RBRACKET); } #if defined(DUK_USE_REFERENCE_COUNTING) /* currently implicitly also DUK_USE_DOUBLE_LINKED_HEAP */ if (st->heavy) { duk_fb_sprintf(fb, "[h_next=%p,h_prev=%p,h_refcount=%lu,h_flags=%08lx,type=%ld," "reachable=%ld,temproot=%ld,finalizable=%ld,finalized=%ld]", (void *) DUK_HEAPHDR_GET_NEXT(NULL, h), (void *) DUK_HEAPHDR_GET_PREV(NULL, h), (unsigned long) DUK_HEAPHDR_GET_REFCOUNT(h), (unsigned long) DUK_HEAPHDR_GET_FLAGS(h), (long) DUK_HEAPHDR_GET_TYPE(h), (long) (DUK_HEAPHDR_HAS_REACHABLE(h) ? 1 : 0), (long) (DUK_HEAPHDR_HAS_TEMPROOT(h) ? 1 : 0), (long) (DUK_HEAPHDR_HAS_FINALIZABLE(h) ? 1 : 0), (long) (DUK_HEAPHDR_HAS_FINALIZED(h) ? 1 : 0)); } #else if (st->heavy) { duk_fb_sprintf(fb, "[h_next=%p,h_flags=%08lx,type=%ld,reachable=%ld,temproot=%ld,finalizable=%ld,finalized=%ld]", (void *) DUK_HEAPHDR_GET_NEXT(NULL, h), (unsigned long) DUK_HEAPHDR_GET_FLAGS(h), (long) DUK_HEAPHDR_GET_TYPE(h), (long) (DUK_HEAPHDR_HAS_REACHABLE(h) ? 1 : 0), (long) (DUK_HEAPHDR_HAS_TEMPROOT(h) ? 1 : 0), (long) (DUK_HEAPHDR_HAS_FINALIZABLE(h) ? 1 : 0), (long) (DUK_HEAPHDR_HAS_FINALIZED(h) ? 1 : 0)); } #endif } DUK_LOCAL void duk__print_shared_heaphdr_string(duk__dprint_state *st, duk_heaphdr_string *h) { duk_fixedbuffer *fb = st->fb; if (st->heavy) { duk_fb_sprintf(fb, "(%p)", (void *) h); } if (!h) { return; } if (st->binary) { duk_size_t i; duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_LBRACKET); for (i = 0; i < (duk_size_t) sizeof(*h); i++) { duk_fb_sprintf(fb, "%02lx", (unsigned long) ((duk_uint8_t *)h)[i]); } duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_RBRACKET); } #if defined(DUK_USE_REFERENCE_COUNTING) if (st->heavy) { duk_fb_sprintf(fb, "[h_refcount=%lu,h_flags=%08lx,type=%ld,reachable=%ld,temproot=%ld,finalizable=%ld,finalized=%ld]", (unsigned long) DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) h), (unsigned long) DUK_HEAPHDR_GET_FLAGS((duk_heaphdr *) h), (long) DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) h), (long) (DUK_HEAPHDR_HAS_REACHABLE((duk_heaphdr *) h) ? 1 : 0), (long) (DUK_HEAPHDR_HAS_TEMPROOT((duk_heaphdr *) h) ? 1 : 0), (long) (DUK_HEAPHDR_HAS_FINALIZABLE((duk_heaphdr *) h) ? 1 : 0), (long) (DUK_HEAPHDR_HAS_FINALIZED((duk_heaphdr *) h) ? 1 : 0)); } #else if (st->heavy) { duk_fb_sprintf(fb, "[h_flags=%08lx,type=%ld,reachable=%ld,temproot=%ld,finalizable=%ld,finalized=%ld]", (unsigned long) DUK_HEAPHDR_GET_FLAGS((duk_heaphdr *) h), (long) DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) h), (long) (DUK_HEAPHDR_HAS_REACHABLE((duk_heaphdr *) h) ? 1 : 0), (long) (DUK_HEAPHDR_HAS_TEMPROOT((duk_heaphdr *) h) ? 1 : 0), (long) (DUK_HEAPHDR_HAS_FINALIZABLE((duk_heaphdr *) h) ? 1 : 0), (long) (DUK_HEAPHDR_HAS_FINALIZED((duk_heaphdr *) h) ? 1 : 0)); } #endif } DUK_LOCAL void duk__print_hstring(duk__dprint_state *st, duk_hstring *h, duk_bool_t quotes) { duk_fixedbuffer *fb = st->fb; const duk_uint8_t *p; const duk_uint8_t *p_end; /* terminal type: no depth check */ if (duk_fb_is_full(fb)) { return; } duk__print_shared_heaphdr_string(st, &h->hdr); if (!h) { duk_fb_put_cstring(fb, "NULL"); return; } p = DUK_HSTRING_GET_DATA(h); p_end = p + DUK_HSTRING_GET_BYTELEN(h); if (p_end > p && p[0] == DUK_ASC_UNDERSCORE) { /* If property key begins with underscore, encode it with * forced quotes (e.g. "_Foo") to distinguish it from encoded * internal properties (e.g. \x82Bar -> _Bar). */ quotes = 1; } if (quotes) { duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_DOUBLEQUOTE); } while (p < p_end) { duk_uint8_t ch = *p++; /* two special escapes: '\' and '"', other printables as is */ if (ch == '\\') { duk_fb_sprintf(fb, "\\\\"); } else if (ch == '"') { duk_fb_sprintf(fb, "\\\""); } else if (ch >= 0x20 && ch <= 0x7e) { duk_fb_put_byte(fb, ch); } else if (ch == 0x82 && !quotes) { /* encode \x82Bar as _Bar if no quotes are * applied, this is for readable internal keys. */ duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_UNDERSCORE); } else { duk_fb_sprintf(fb, "\\x%02lx", (unsigned long) ch); } } if (quotes) { duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_DOUBLEQUOTE); } #if defined(DUK_USE_REFERENCE_COUNTING) /* XXX: limit to quoted strings only, to save keys from being cluttered? */ duk_fb_sprintf(fb, "/%lu", (unsigned long) DUK_HEAPHDR_GET_REFCOUNT(&h->hdr)); #endif } #define DUK__COMMA() do { \ if (first) { \ first = 0; \ } else { \ duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_COMMA); \ } \ } while (0) DUK_LOCAL void duk__print_hobject(duk__dprint_state *st, duk_hobject *h) { duk_fixedbuffer *fb = st->fb; duk_uint_fast32_t i; duk_tval *tv; duk_hstring *key; duk_bool_t first = 1; const char *brace1 = "{"; const char *brace2 = "}"; duk_bool_t pushed_loopstack = 0; if (duk_fb_is_full(fb)) { return; } duk__print_shared_heaphdr(st, &h->hdr); if (h && DUK_HOBJECT_HAS_ARRAY_PART(h)) { brace1 = "["; brace2 = "]"; } if (!h) { duk_fb_put_cstring(fb, "NULL"); goto finished; } if (st->depth >= st->depth_limit) { const char *subtype = "generic"; if (DUK_HOBJECT_IS_COMPFUNC(h)) { subtype = "compfunc"; } else if (DUK_HOBJECT_IS_NATFUNC(h)) { subtype = "natfunc"; } else if (DUK_HOBJECT_IS_THREAD(h)) { subtype = "thread"; } else if (DUK_HOBJECT_IS_BUFOBJ(h)) { subtype = "bufobj"; } else if (DUK_HOBJECT_IS_ARRAY(h)) { subtype = "array"; } duk_fb_sprintf(fb, "%sobject/%s %p%s", (const char *) brace1, subtype, (void *) h, (const char *) brace2); return; } for (i = 0; i < (duk_uint_fast32_t) st->loop_stack_index; i++) { if (st->loop_stack[i] == h) { duk_fb_sprintf(fb, "%sLOOP:%p%s", (const char *) brace1, (void *) h, (const char *) brace2); return; } } /* after this, return paths should 'goto finished' for decrement */ st->depth++; if (st->loop_stack_index >= st->loop_stack_limit) { duk_fb_sprintf(fb, "%sOUT-OF-LOOP-STACK%s", (const char *) brace1, (const char *) brace2); goto finished; } st->loop_stack[st->loop_stack_index++] = h; pushed_loopstack = 1; /* * Notation: double underscore used for internal properties which are not * stored in the property allocation (e.g. '__valstack'). */ duk_fb_put_cstring(fb, brace1); if (DUK_HOBJECT_GET_PROPS(NULL, h)) { duk_uint32_t a_limit; a_limit = DUK_HOBJECT_GET_ASIZE(h); if (st->internal) { /* dump all allocated entries, unused entries print as 'unused', * note that these may extend beyond current 'length' and look * a bit funny. */ } else { /* leave out trailing 'unused' elements */ while (a_limit > 0) { tv = DUK_HOBJECT_A_GET_VALUE_PTR(NULL, h, a_limit - 1); if (!DUK_TVAL_IS_UNUSED(tv)) { break; } a_limit--; } } for (i = 0; i < a_limit; i++) { tv = DUK_HOBJECT_A_GET_VALUE_PTR(NULL, h, i); DUK__COMMA(); duk__print_tval(st, tv); } for (i = 0; i < DUK_HOBJECT_GET_ENEXT(h); i++) { key = DUK_HOBJECT_E_GET_KEY(NULL, h, i); if (!key) { continue; } if (!st->internal && DUK_HSTRING_HAS_HIDDEN(key)) { continue; } DUK__COMMA(); duk__print_hstring(st, key, 0); duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_COLON); if (DUK_HOBJECT_E_SLOT_IS_ACCESSOR(NULL, h, i)) { duk_fb_sprintf(fb, "[get:%p,set:%p]", (void *) DUK_HOBJECT_E_GET_VALUE(NULL, h, i).a.get, (void *) DUK_HOBJECT_E_GET_VALUE(NULL, h, i).a.set); } else { tv = &DUK_HOBJECT_E_GET_VALUE(NULL, h, i).v; duk__print_tval(st, tv); } if (st->heavy) { duk_fb_sprintf(fb, "<%02lx>", (unsigned long) DUK_HOBJECT_E_GET_FLAGS(NULL, h, i)); } } } if (st->internal) { if (DUK_HOBJECT_IS_ARRAY(h)) { DUK__COMMA(); duk_fb_sprintf(fb, "__array:true"); } if (DUK_HOBJECT_HAS_EXTENSIBLE(h)) { DUK__COMMA(); duk_fb_sprintf(fb, "__extensible:true"); } if (DUK_HOBJECT_HAS_CONSTRUCTABLE(h)) { DUK__COMMA(); duk_fb_sprintf(fb, "__constructable:true"); } if (DUK_HOBJECT_HAS_BOUNDFUNC(h)) { DUK__COMMA(); duk_fb_sprintf(fb, "__boundfunc:true"); } if (DUK_HOBJECT_HAS_COMPFUNC(h)) { DUK__COMMA(); duk_fb_sprintf(fb, "__compfunc:true"); } if (DUK_HOBJECT_HAS_NATFUNC(h)) { DUK__COMMA(); duk_fb_sprintf(fb, "__natfunc:true"); } if (DUK_HOBJECT_HAS_BUFOBJ(h)) { DUK__COMMA(); duk_fb_sprintf(fb, "__bufobj:true"); } if (DUK_HOBJECT_IS_THREAD(h)) { DUK__COMMA(); duk_fb_sprintf(fb, "__thread:true"); } if (DUK_HOBJECT_HAS_ARRAY_PART(h)) { DUK__COMMA(); duk_fb_sprintf(fb, "__array_part:true"); } if (DUK_HOBJECT_HAS_STRICT(h)) { DUK__COMMA(); duk_fb_sprintf(fb, "__strict:true"); } if (DUK_HOBJECT_HAS_NOTAIL(h)) { DUK__COMMA(); duk_fb_sprintf(fb, "__notail:true"); } if (DUK_HOBJECT_HAS_NEWENV(h)) { DUK__COMMA(); duk_fb_sprintf(fb, "__newenv:true"); } if (DUK_HOBJECT_HAS_NAMEBINDING(h)) { DUK__COMMA(); duk_fb_sprintf(fb, "__namebinding:true"); } if (DUK_HOBJECT_HAS_CREATEARGS(h)) { DUK__COMMA(); duk_fb_sprintf(fb, "__createargs:true"); } if (DUK_HOBJECT_HAS_EXOTIC_ARRAY(h)) { DUK__COMMA(); duk_fb_sprintf(fb, "__exotic_array:true"); } if (DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(h)) { DUK__COMMA(); duk_fb_sprintf(fb, "__exotic_stringobj:true"); } if (DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(h)) { DUK__COMMA(); duk_fb_sprintf(fb, "__exotic_arguments:true"); } if (DUK_HOBJECT_IS_BUFOBJ(h)) { DUK__COMMA(); duk_fb_sprintf(fb, "__exotic_bufobj:true"); } if (DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ(h)) { DUK__COMMA(); duk_fb_sprintf(fb, "__exotic_proxyobj:true"); } } if (st->internal && DUK_HOBJECT_IS_ARRAY(h)) { duk_harray *a = (duk_harray *) h; DUK__COMMA(); duk_fb_sprintf(fb, "__length:%ld", (long) a->length); DUK__COMMA(); duk_fb_sprintf(fb, "__length_nonwritable:%ld", (long) a->length_nonwritable); } else if (st->internal && DUK_HOBJECT_IS_COMPFUNC(h)) { duk_hcompfunc *f = (duk_hcompfunc *) h; DUK__COMMA(); duk_fb_put_cstring(fb, "__data:"); duk__print_hbuffer(st, (duk_hbuffer *) DUK_HCOMPFUNC_GET_DATA(NULL, f)); DUK__COMMA(); duk_fb_put_cstring(fb, "__lexenv:"); duk__print_hobject(st, DUK_HCOMPFUNC_GET_LEXENV(NULL, f)); DUK__COMMA(); duk_fb_put_cstring(fb, "__varenv:"); duk__print_hobject(st, DUK_HCOMPFUNC_GET_VARENV(NULL, f)); DUK__COMMA(); duk_fb_sprintf(fb, "__nregs:%ld", (long) f->nregs); DUK__COMMA(); duk_fb_sprintf(fb, "__nargs:%ld", (long) f->nargs); #if defined(DUK_USE_DEBUGGER_SUPPORT) DUK__COMMA(); duk_fb_sprintf(fb, "__start_line:%ld", (long) f->start_line); DUK__COMMA(); duk_fb_sprintf(fb, "__end_line:%ld", (long) f->end_line); #endif DUK__COMMA(); duk_fb_put_cstring(fb, "__data:"); duk__print_hbuffer(st, (duk_hbuffer *) DUK_HCOMPFUNC_GET_DATA(NULL, f)); } else if (st->internal && DUK_HOBJECT_IS_NATFUNC(h)) { duk_hnatfunc *f = (duk_hnatfunc *) h; DUK__COMMA(); duk_fb_sprintf(fb, "__func:"); duk_fb_put_funcptr(fb, (duk_uint8_t *) &f->func, sizeof(f->func)); DUK__COMMA(); duk_fb_sprintf(fb, "__nargs:%ld", (long) f->nargs); DUK__COMMA(); duk_fb_sprintf(fb, "__magic:%ld", (long) f->magic); } else if (st->internal && DUK_HOBJECT_IS_DECENV(h)) { duk_hdecenv *e = (duk_hdecenv *) h; DUK__COMMA(); duk_fb_sprintf(fb, "__thread:"); duk__print_hobject(st, (duk_hobject *) e->thread); DUK__COMMA(); duk_fb_sprintf(fb, "__varmap:"); duk__print_hobject(st, (duk_hobject *) e->varmap); DUK__COMMA(); duk_fb_sprintf(fb, "__regbase_byteoff:%ld", (long) e->regbase_byteoff); } else if (st->internal && DUK_HOBJECT_IS_OBJENV(h)) { duk_hobjenv *e = (duk_hobjenv *) h; DUK__COMMA(); duk_fb_sprintf(fb, "__target:"); duk__print_hobject(st, (duk_hobject *) e->target); DUK__COMMA(); duk_fb_sprintf(fb, "__has_this:%ld", (long) e->has_this); #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) } else if (st->internal && DUK_HOBJECT_IS_BUFOBJ(h)) { duk_hbufobj *b = (duk_hbufobj *) h; DUK__COMMA(); duk_fb_sprintf(fb, "__buf:"); duk__print_hbuffer(st, (duk_hbuffer *) b->buf); DUK__COMMA(); duk_fb_sprintf(fb, "__buf_prop:"); duk__print_hobject(st, (duk_hobject *) b->buf_prop); DUK__COMMA(); duk_fb_sprintf(fb, "__offset:%ld", (long) b->offset); DUK__COMMA(); duk_fb_sprintf(fb, "__length:%ld", (long) b->length); DUK__COMMA(); duk_fb_sprintf(fb, "__shift:%ld", (long) b->shift); DUK__COMMA(); duk_fb_sprintf(fb, "__elemtype:%ld", (long) b->elem_type); #endif } else if (st->internal && DUK_HOBJECT_IS_PROXY(h)) { duk_hproxy *p = (duk_hproxy *) h; DUK__COMMA(); duk_fb_sprintf(fb, "__target:"); duk__print_hobject(st, p->target); DUK__COMMA(); duk_fb_sprintf(fb, "__handler:"); duk__print_hobject(st, p->handler); } else if (st->internal && DUK_HOBJECT_IS_THREAD(h)) { duk_hthread *t = (duk_hthread *) h; DUK__COMMA(); duk_fb_sprintf(fb, "__ptr_curr_pc:%p", (void *) t->ptr_curr_pc); DUK__COMMA(); duk_fb_sprintf(fb, "__heap:%p", (void *) t->heap); DUK__COMMA(); duk_fb_sprintf(fb, "__strict:%ld", (long) t->strict); DUK__COMMA(); duk_fb_sprintf(fb, "__state:%ld", (long) t->state); DUK__COMMA(); duk_fb_sprintf(fb, "__unused1:%ld", (long) t->unused1); DUK__COMMA(); duk_fb_sprintf(fb, "__unused2:%ld", (long) t->unused2); DUK__COMMA(); duk_fb_sprintf(fb, "__valstack:%p", (void *) t->valstack); DUK__COMMA(); duk_fb_sprintf(fb, "__valstack_end:%p/%ld", (void *) t->valstack_end, (long) (t->valstack_end - t->valstack)); DUK__COMMA(); duk_fb_sprintf(fb, "__valstack_alloc_end:%p/%ld", (void *) t->valstack_alloc_end, (long) (t->valstack_alloc_end - t->valstack)); DUK__COMMA(); duk_fb_sprintf(fb, "__valstack_bottom:%p/%ld", (void *) t->valstack_bottom, (long) (t->valstack_bottom - t->valstack)); DUK__COMMA(); duk_fb_sprintf(fb, "__valstack_top:%p/%ld", (void *) t->valstack_top, (long) (t->valstack_top - t->valstack)); DUK__COMMA(); duk_fb_sprintf(fb, "__callstack_curr:%p", (void *) t->callstack_curr); DUK__COMMA(); duk_fb_sprintf(fb, "__callstack_top:%ld", (long) t->callstack_top); DUK__COMMA(); duk_fb_sprintf(fb, "__callstack_preventcount:%ld", (long) t->callstack_preventcount); DUK__COMMA(); duk_fb_sprintf(fb, "__resumer:"); duk__print_hobject(st, (duk_hobject *) t->resumer); DUK__COMMA(); duk_fb_sprintf(fb, "__compile_ctx:%p", (void *) t->compile_ctx); #if defined(DUK_USE_INTERRUPT_COUNTER) DUK__COMMA(); duk_fb_sprintf(fb, "__interrupt_counter:%ld", (long) t->interrupt_counter); DUK__COMMA(); duk_fb_sprintf(fb, "__interrupt_init:%ld", (long) t->interrupt_init); #endif /* XXX: print built-ins array? */ } #if defined(DUK_USE_REFERENCE_COUNTING) if (st->internal) { DUK__COMMA(); duk_fb_sprintf(fb, "__refcount:%lu", (unsigned long) DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) h)); } #endif if (st->internal) { DUK__COMMA(); duk_fb_sprintf(fb, "__class:%ld", (long) DUK_HOBJECT_GET_CLASS_NUMBER(h)); } DUK__COMMA(); duk_fb_sprintf(fb, "__heapptr:%p", (void *) h); /* own pointer */ /* prototype should be last, for readability */ if (DUK_HOBJECT_GET_PROTOTYPE(NULL, h)) { if (st->follow_proto) { DUK__COMMA(); duk_fb_put_cstring(fb, "__prototype:"); duk__print_hobject(st, DUK_HOBJECT_GET_PROTOTYPE(NULL, h)); } else { DUK__COMMA(); duk_fb_sprintf(fb, "__prototype:%p", (void *) DUK_HOBJECT_GET_PROTOTYPE(NULL, h)); } } duk_fb_put_cstring(fb, brace2); #if defined(DUK_USE_HOBJECT_HASH_PART) if (st->heavy && DUK_HOBJECT_GET_HSIZE(h) > 0) { duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_LANGLE); for (i = 0; i < DUK_HOBJECT_GET_HSIZE(h); i++) { duk_uint_t h_idx = DUK_HOBJECT_H_GET_INDEX(NULL, h, i); if (i > 0) { duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_COMMA); } if (h_idx == DUK_HOBJECT_HASHIDX_UNUSED) { duk_fb_sprintf(fb, "u"); } else if (h_idx == DUK_HOBJECT_HASHIDX_DELETED) { duk_fb_sprintf(fb, "d"); } else { duk_fb_sprintf(fb, "%ld", (long) h_idx); } } duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_RANGLE); } #endif finished: st->depth--; if (pushed_loopstack) { st->loop_stack_index--; st->loop_stack[st->loop_stack_index] = NULL; } } DUK_LOCAL void duk__print_hbuffer(duk__dprint_state *st, duk_hbuffer *h) { duk_fixedbuffer *fb = st->fb; duk_size_t i, n; duk_uint8_t *p; if (duk_fb_is_full(fb)) { return; } /* terminal type: no depth check */ if (!h) { duk_fb_put_cstring(fb, "NULL"); return; } if (DUK_HBUFFER_HAS_DYNAMIC(h)) { if (DUK_HBUFFER_HAS_EXTERNAL(h)) { duk_hbuffer_external *g = (duk_hbuffer_external *) h; duk_fb_sprintf(fb, "buffer:external:%p:%ld", (void *) DUK_HBUFFER_EXTERNAL_GET_DATA_PTR(NULL, g), (long) DUK_HBUFFER_EXTERNAL_GET_SIZE(g)); } else { duk_hbuffer_dynamic *g = (duk_hbuffer_dynamic *) h; duk_fb_sprintf(fb, "buffer:dynamic:%p:%ld", (void *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(NULL, g), (long) DUK_HBUFFER_DYNAMIC_GET_SIZE(g)); } } else { duk_fb_sprintf(fb, "buffer:fixed:%ld", (long) DUK_HBUFFER_GET_SIZE(h)); } #if defined(DUK_USE_REFERENCE_COUNTING) duk_fb_sprintf(fb, "/%lu", (unsigned long) DUK_HEAPHDR_GET_REFCOUNT(&h->hdr)); #endif if (st->hexdump) { duk_fb_sprintf(fb, "=["); n = DUK_HBUFFER_GET_SIZE(h); p = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(NULL, h); for (i = 0; i < n; i++) { duk_fb_sprintf(fb, "%02lx", (unsigned long) p[i]); } duk_fb_sprintf(fb, "]"); } } DUK_LOCAL void duk__print_heaphdr(duk__dprint_state *st, duk_heaphdr *h) { duk_fixedbuffer *fb = st->fb; if (duk_fb_is_full(fb)) { return; } if (!h) { duk_fb_put_cstring(fb, "NULL"); return; } switch (DUK_HEAPHDR_GET_TYPE(h)) { case DUK_HTYPE_STRING: duk__print_hstring(st, (duk_hstring *) h, 1); break; case DUK_HTYPE_OBJECT: duk__print_hobject(st, (duk_hobject *) h); break; case DUK_HTYPE_BUFFER: duk__print_hbuffer(st, (duk_hbuffer *) h); break; default: duk_fb_sprintf(fb, "[unknown htype %ld]", (long) DUK_HEAPHDR_GET_TYPE(h)); break; } } DUK_LOCAL void duk__print_tval(duk__dprint_state *st, duk_tval *tv) { duk_fixedbuffer *fb = st->fb; if (duk_fb_is_full(fb)) { return; } /* depth check is done when printing an actual type */ if (st->heavy) { duk_fb_sprintf(fb, "(%p)", (void *) tv); } if (!tv) { duk_fb_put_cstring(fb, "NULL"); return; } if (st->binary) { duk_size_t i; duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_LBRACKET); for (i = 0; i < (duk_size_t) sizeof(*tv); i++) { duk_fb_sprintf(fb, "%02lx", (unsigned long) ((duk_uint8_t *)tv)[i]); } duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_RBRACKET); } if (st->heavy) { duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_LANGLE); } switch (DUK_TVAL_GET_TAG(tv)) { case DUK_TAG_UNDEFINED: { duk_fb_put_cstring(fb, "undefined"); break; } case DUK_TAG_UNUSED: { duk_fb_put_cstring(fb, "unused"); break; } case DUK_TAG_NULL: { duk_fb_put_cstring(fb, "null"); break; } case DUK_TAG_BOOLEAN: { duk_fb_put_cstring(fb, DUK_TVAL_GET_BOOLEAN(tv) ? "true" : "false"); break; } case DUK_TAG_STRING: { /* Note: string is a terminal heap object, so no depth check here */ duk__print_hstring(st, DUK_TVAL_GET_STRING(tv), 1); break; } case DUK_TAG_OBJECT: { duk__print_hobject(st, DUK_TVAL_GET_OBJECT(tv)); break; } case DUK_TAG_BUFFER: { duk__print_hbuffer(st, DUK_TVAL_GET_BUFFER(tv)); break; } case DUK_TAG_POINTER: { duk_fb_sprintf(fb, "pointer:%p", (void *) DUK_TVAL_GET_POINTER(tv)); break; } case DUK_TAG_LIGHTFUNC: { duk_c_function func; duk_small_uint_t lf_flags; DUK_TVAL_GET_LIGHTFUNC(tv, func, lf_flags); duk_fb_sprintf(fb, "lightfunc:"); duk_fb_put_funcptr(fb, (duk_uint8_t *) &func, sizeof(func)); duk_fb_sprintf(fb, ":%04lx", (long) lf_flags); break; } #if defined(DUK_USE_FASTINT) case DUK_TAG_FASTINT: DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv)); DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); duk_fb_sprintf(fb, "%.18g_F", (double) DUK_TVAL_GET_NUMBER(tv)); break; #endif default: { /* IEEE double is approximately 16 decimal digits; print a couple extra */ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv)); DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); duk_fb_sprintf(fb, "%.18g", (double) DUK_TVAL_GET_NUMBER(tv)); break; } } if (st->heavy) { duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_RANGLE); } } DUK_LOCAL void duk__print_instr(duk__dprint_state *st, duk_instr_t ins) { duk_fixedbuffer *fb = st->fb; duk_small_int_t op; const char *op_name; op = (duk_small_int_t) DUK_DEC_OP(ins); op_name = duk__bc_optab[op]; /* XXX: option to fix opcode length so it lines up nicely */ if (op == DUK_OP_JUMP) { duk_int_t diff1 = (duk_int_t) (DUK_DEC_ABC(ins) - DUK_BC_JUMP_BIAS); /* from next pc */ duk_int_t diff2 = diff1 + 1; /* from curr pc */ duk_fb_sprintf(fb, "%s %ld (to pc%c%ld)", (const char *) op_name, (long) diff1, (int) (diff2 >= 0 ? '+' : '-'), /* char format: use int */ (long) (diff2 >= 0 ? diff2 : -diff2)); } else { duk_fb_sprintf(fb, "%s %ld, %ld, %ld", (const char *) op_name, (long) DUK_DEC_A(ins), (long) DUK_DEC_B(ins), (long) DUK_DEC_C(ins)); } } DUK_LOCAL void duk__print_opcode(duk__dprint_state *st, duk_small_int_t opcode) { duk_fixedbuffer *fb = st->fb; if (opcode < DUK_BC_OP_MIN || opcode > DUK_BC_OP_MAX) { duk_fb_sprintf(fb, "?(%ld)", (long) opcode); } else { duk_fb_sprintf(fb, "%s", (const char *) duk__bc_optab[opcode]); } } DUK_INTERNAL duk_int_t duk_debug_vsnprintf(char *str, duk_size_t size, const char *format, va_list ap) { duk_fixedbuffer fb; const char *p = format; const char *p_end = p + DUK_STRLEN(format); duk_int_t retval; DUK_MEMZERO(&fb, sizeof(fb)); fb.buffer = (duk_uint8_t *) str; fb.length = size; fb.offset = 0; fb.truncated = 0; while (p < p_end) { char ch = *p++; const char *p_begfmt = NULL; duk_bool_t got_exclamation = 0; duk_bool_t got_long = 0; /* %lf, %ld etc */ duk__dprint_state st; if (ch != DUK_ASC_PERCENT) { duk_fb_put_byte(&fb, (duk_uint8_t) ch); continue; } /* * Format tag parsing. Since we don't understand all the * possible format tags allowed, we just scan for a terminating * specifier and keep track of relevant modifiers that we do * understand. See man 3 printf. */ DUK_MEMZERO(&st, sizeof(st)); st.fb = &fb; st.depth = 0; st.depth_limit = 1; st.loop_stack_index = 0; st.loop_stack_limit = DUK__LOOP_STACK_DEPTH; p_begfmt = p - 1; while (p < p_end) { ch = *p++; if (ch == DUK_ASC_STAR) { /* unsupported: would consume multiple args */ goto format_error; } else if (ch == DUK_ASC_PERCENT) { duk_fb_put_byte(&fb, (duk_uint8_t) DUK_ASC_PERCENT); break; } else if (ch == DUK_ASC_EXCLAMATION) { got_exclamation = 1; } else if (!got_exclamation && ch == DUK_ASC_LC_L) { got_long = 1; } else if (got_exclamation && ch == DUK_ASC_LC_D) { st.depth_limit = DUK__DEEP_DEPTH_LIMIT; } else if (got_exclamation && ch == DUK_ASC_LC_P) { st.follow_proto = 1; } else if (got_exclamation && ch == DUK_ASC_LC_I) { st.internal = 1; } else if (got_exclamation && ch == DUK_ASC_LC_X) { st.hexdump = 1; } else if (got_exclamation && ch == DUK_ASC_LC_H) { st.heavy = 1; } else if (got_exclamation && ch == DUK_ASC_ATSIGN) { st.pointer = 1; } else if (got_exclamation && ch == DUK_ASC_HASH) { st.binary = 1; } else if (got_exclamation && ch == DUK_ASC_UC_T) { duk_tval *t = va_arg(ap, duk_tval *); if (st.pointer && !st.heavy) { duk_fb_sprintf(&fb, "(%p)", (void *) t); } duk__print_tval(&st, t); break; } else if (got_exclamation && ch == DUK_ASC_UC_O) { duk_heaphdr *t = va_arg(ap, duk_heaphdr *); if (st.pointer && !st.heavy) { duk_fb_sprintf(&fb, "(%p)", (void *) t); } duk__print_heaphdr(&st, t); break; } else if (got_exclamation && ch == DUK_ASC_UC_I) { duk_instr_t t = va_arg(ap, duk_instr_t); duk__print_instr(&st, t); break; } else if (got_exclamation && ch == DUK_ASC_UC_C) { long t = va_arg(ap, long); duk__print_opcode(&st, (duk_small_int_t) t); break; } else if (!got_exclamation && strchr(DUK__ALLOWED_STANDARD_SPECIFIERS, (int) ch)) { char fmtbuf[DUK__MAX_FORMAT_TAG_LENGTH]; duk_size_t fmtlen; DUK_ASSERT(p >= p_begfmt); fmtlen = (duk_size_t) (p - p_begfmt); if (fmtlen >= sizeof(fmtbuf)) { /* format is too large, abort */ goto format_error; } DUK_MEMZERO(fmtbuf, sizeof(fmtbuf)); DUK_MEMCPY(fmtbuf, p_begfmt, fmtlen); /* assume exactly 1 arg, which is why '*' is forbidden; arg size still * depends on type though. */ if (ch == DUK_ASC_LC_F || ch == DUK_ASC_LC_G || ch == DUK_ASC_LC_E) { /* %f and %lf both consume a 'long' */ double arg = va_arg(ap, double); duk_fb_sprintf(&fb, fmtbuf, arg); } else if (ch == DUK_ASC_LC_D && got_long) { /* %ld */ long arg = va_arg(ap, long); duk_fb_sprintf(&fb, fmtbuf, arg); } else if (ch == DUK_ASC_LC_D) { /* %d; only 16 bits are guaranteed */ int arg = va_arg(ap, int); duk_fb_sprintf(&fb, fmtbuf, arg); } else if (ch == DUK_ASC_LC_U && got_long) { /* %lu */ unsigned long arg = va_arg(ap, unsigned long); duk_fb_sprintf(&fb, fmtbuf, arg); } else if (ch == DUK_ASC_LC_U) { /* %u; only 16 bits are guaranteed */ unsigned int arg = va_arg(ap, unsigned int); duk_fb_sprintf(&fb, fmtbuf, arg); } else if (ch == DUK_ASC_LC_X && got_long) { /* %lx */ unsigned long arg = va_arg(ap, unsigned long); duk_fb_sprintf(&fb, fmtbuf, arg); } else if (ch == DUK_ASC_LC_X) { /* %x; only 16 bits are guaranteed */ unsigned int arg = va_arg(ap, unsigned int); duk_fb_sprintf(&fb, fmtbuf, arg); } else if (ch == DUK_ASC_LC_S) { /* %s */ const char *arg = va_arg(ap, const char *); if (arg == NULL) { /* '%s' and NULL is not portable, so special case * it for debug printing. */ duk_fb_sprintf(&fb, "NULL"); } else { duk_fb_sprintf(&fb, fmtbuf, arg); } } else if (ch == DUK_ASC_LC_P) { /* %p */ void *arg = va_arg(ap, void *); if (arg == NULL) { /* '%p' and NULL is portable, but special case it * anyway to get a standard NULL marker in logs. */ duk_fb_sprintf(&fb, "NULL"); } else { duk_fb_sprintf(&fb, fmtbuf, arg); } } else if (ch == DUK_ASC_LC_C) { /* '%c', passed concretely as int */ int arg = va_arg(ap, int); duk_fb_sprintf(&fb, fmtbuf, arg); } else { /* Should not happen. */ duk_fb_sprintf(&fb, "INVALID-FORMAT(%s)", (const char *) fmtbuf); } break; } else { /* ignore */ } } } goto done; format_error: duk_fb_put_cstring(&fb, "FMTERR"); /* fall through */ done: retval = (duk_int_t) fb.offset; duk_fb_put_byte(&fb, (duk_uint8_t) 0); /* return total chars written excluding terminator */ return retval; } #if 0 /*unused*/ DUK_INTERNAL duk_int_t duk_debug_snprintf(char *str, duk_size_t size, const char *format, ...) { duk_int_t retval; va_list ap; va_start(ap, format); retval = duk_debug_vsnprintf(str, size, format, ap); va_end(ap); return retval; } #endif /* Formatting function pointers is tricky: there is no standard pointer for * function pointers and the size of a function pointer may depend on the * specific pointer type. This helper formats a function pointer based on * its memory layout to get something useful on most platforms. */ DUK_INTERNAL void duk_debug_format_funcptr(char *buf, duk_size_t buf_size, duk_uint8_t *fptr, duk_size_t fptr_size) { duk_size_t i; duk_uint8_t *p = (duk_uint8_t *) buf; duk_uint8_t *p_end = (duk_uint8_t *) (buf + buf_size - 1); DUK_MEMZERO(buf, buf_size); for (i = 0; i < fptr_size; i++) { duk_int_t left = (duk_int_t) (p_end - p); duk_uint8_t ch; if (left <= 0) { break; } /* Quite approximate but should be useful for little and big endian. */ #if defined(DUK_USE_INTEGER_BE) ch = fptr[i]; #else ch = fptr[fptr_size - 1 - i]; #endif p += DUK_SNPRINTF((char *) p, (duk_size_t) left, "%02lx", (unsigned long) ch); } } #endif /* DUK_USE_DEBUG */ /* automatic undefs */ #undef DUK__ALLOWED_STANDARD_SPECIFIERS #undef DUK__COMMA #undef DUK__DEEP_DEPTH_LIMIT #undef DUK__LOOP_STACK_DEPTH #undef DUK__MAX_FORMAT_TAG_LENGTH #line 1 "duk_debugger.c" /* * Duktape debugger */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_DEBUGGER_SUPPORT) /* * Assert helpers */ #if defined(DUK_USE_ASSERTIONS) #define DUK__DBG_TPORT_ENTER() do { \ DUK_ASSERT(heap->dbg_calling_transport == 0); \ heap->dbg_calling_transport = 1; \ } while (0) #define DUK__DBG_TPORT_EXIT() do { \ DUK_ASSERT(heap->dbg_calling_transport == 1); \ heap->dbg_calling_transport = 0; \ } while (0) #else #define DUK__DBG_TPORT_ENTER() do {} while (0) #define DUK__DBG_TPORT_EXIT() do {} while (0) #endif /* * Helper structs */ typedef union { void *p; duk_uint_t b[1]; /* Use b[] to access the size of the union, which is strictly not * correct. Can't use fixed size unless there's feature detection * for pointer byte size. */ } duk__ptr_union; /* * Detach handling */ #define DUK__SET_CONN_BROKEN(thr,reason) do { \ /* For now shared handler is fine. */ \ duk__debug_do_detach1((thr)->heap, (reason)); \ } while (0) DUK_LOCAL void duk__debug_do_detach1(duk_heap *heap, duk_int_t reason) { /* Can be called multiple times with no harm. Mark the transport * bad (dbg_read_cb == NULL) and clear state except for the detached * callback and the udata field. The detached callback is delayed * to the message loop so that it can be called between messages; * this avoids corner cases related to immediate debugger reattach * inside the detached callback. */ if (heap->dbg_detaching) { DUK_D(DUK_DPRINT("debugger already detaching, ignore detach1")); return; } DUK_D(DUK_DPRINT("debugger transport detaching, marking transport broken")); heap->dbg_detaching = 1; /* prevent multiple in-progress detaches */ if (heap->dbg_write_cb != NULL) { duk_hthread *thr; thr = heap->heap_thread; DUK_ASSERT(thr != NULL); duk_debug_write_notify(thr, DUK_DBG_CMD_DETACHING); duk_debug_write_int(thr, reason); duk_debug_write_eom(thr); } heap->dbg_read_cb = NULL; heap->dbg_write_cb = NULL; heap->dbg_peek_cb = NULL; heap->dbg_read_flush_cb = NULL; heap->dbg_write_flush_cb = NULL; heap->dbg_request_cb = NULL; /* heap->dbg_detached_cb: keep */ /* heap->dbg_udata: keep */ /* heap->dbg_processing: keep on purpose to avoid debugger re-entry in detaching state */ heap->dbg_state_dirty = 0; heap->dbg_force_restart = 0; heap->dbg_pause_flags = 0; heap->dbg_pause_act = NULL; heap->dbg_pause_startline = 0; heap->dbg_have_next_byte = 0; duk_debug_clear_paused(heap); /* XXX: some overlap with field inits above */ heap->dbg_state_dirty = 0; /* XXX: clear_paused sets dirty; rework? */ /* Ensure there are no stale active breakpoint pointers. * Breakpoint list is currently kept - we could empty it * here but we'd need to handle refcounts correctly, and * we'd need a 'thr' reference for that. * * XXX: clear breakpoint on either attach or detach? */ heap->dbg_breakpoints_active[0] = (duk_breakpoint *) NULL; } DUK_LOCAL void duk__debug_do_detach2(duk_heap *heap) { duk_debug_detached_function detached_cb; void *detached_udata; duk_hthread *thr; thr = heap->heap_thread; if (thr == NULL) { DUK_ASSERT(heap->dbg_detached_cb == NULL); return; } /* Safe to call multiple times. */ detached_cb = heap->dbg_detached_cb; detached_udata = heap->dbg_udata; heap->dbg_detached_cb = NULL; heap->dbg_udata = NULL; if (detached_cb) { /* Careful here: state must be wiped before the call * so that we can cleanly handle a re-attach from * inside the callback. */ DUK_D(DUK_DPRINT("detached during message loop, delayed call to detached_cb")); detached_cb(thr, detached_udata); } heap->dbg_detaching = 0; } DUK_INTERNAL void duk_debug_do_detach(duk_heap *heap) { duk__debug_do_detach1(heap, 0); duk__debug_do_detach2(heap); } /* Called on a read/write error: NULL all callbacks except the detached * callback so that we never accidentally call them after a read/write * error has been indicated. This is especially important for the transport * I/O callbacks to fulfill guaranteed callback semantics. */ DUK_LOCAL void duk__debug_null_most_callbacks(duk_hthread *thr) { duk_heap *heap; DUK_ASSERT(thr != NULL); heap = thr->heap; DUK_D(DUK_DPRINT("transport read/write error, NULL all callbacks expected detached")); heap->dbg_read_cb = NULL; heap->dbg_write_cb = NULL; /* this is especially critical to avoid another write call in detach1() */ heap->dbg_peek_cb = NULL; heap->dbg_read_flush_cb = NULL; heap->dbg_write_flush_cb = NULL; heap->dbg_request_cb = NULL; /* keep heap->dbg_detached_cb */ } /* * Pause handling */ DUK_LOCAL void duk__debug_set_pause_state(duk_hthread *thr, duk_heap *heap, duk_small_uint_t pause_flags) { duk_uint_fast32_t line; line = duk_debug_curr_line(thr); if (line == 0) { /* No line info for current function. */ duk_small_uint_t updated_flags; updated_flags = pause_flags & ~(DUK_PAUSE_FLAG_LINE_CHANGE); DUK_D(DUK_DPRINT("no line info for current activation, disable line-based pause flags: 0x%08lx -> 0x%08lx", (long) pause_flags, (long) updated_flags)); pause_flags = updated_flags; } heap->dbg_pause_flags = pause_flags; heap->dbg_pause_act = thr->callstack_curr; heap->dbg_pause_startline = (duk_uint32_t) line; heap->dbg_state_dirty = 1; DUK_D(DUK_DPRINT("set state for automatic pause triggers, flags=0x%08lx, act=%p, startline=%ld", (long) heap->dbg_pause_flags, (void *) heap->dbg_pause_act, (long) heap->dbg_pause_startline)); } /* * Debug connection peek and flush primitives */ DUK_INTERNAL duk_bool_t duk_debug_read_peek(duk_hthread *thr) { duk_heap *heap; duk_bool_t ret; DUK_ASSERT(thr != NULL); heap = thr->heap; DUK_ASSERT(heap != NULL); if (heap->dbg_read_cb == NULL) { DUK_D(DUK_DPRINT("attempt to peek in detached state, return zero (= no data)")); return 0; } if (heap->dbg_peek_cb == NULL) { DUK_DD(DUK_DDPRINT("no peek callback, return zero (= no data)")); return 0; } DUK__DBG_TPORT_ENTER(); ret = (duk_bool_t) (heap->dbg_peek_cb(heap->dbg_udata) > 0); DUK__DBG_TPORT_EXIT(); return ret; } DUK_INTERNAL void duk_debug_read_flush(duk_hthread *thr) { duk_heap *heap; DUK_ASSERT(thr != NULL); heap = thr->heap; DUK_ASSERT(heap != NULL); if (heap->dbg_read_cb == NULL) { DUK_D(DUK_DPRINT("attempt to read flush in detached state, ignore")); return; } if (heap->dbg_read_flush_cb == NULL) { DUK_DD(DUK_DDPRINT("no read flush callback, ignore")); return; } DUK__DBG_TPORT_ENTER(); heap->dbg_read_flush_cb(heap->dbg_udata); DUK__DBG_TPORT_EXIT(); } DUK_INTERNAL void duk_debug_write_flush(duk_hthread *thr) { duk_heap *heap; DUK_ASSERT(thr != NULL); heap = thr->heap; DUK_ASSERT(heap != NULL); if (heap->dbg_read_cb == NULL) { DUK_D(DUK_DPRINT("attempt to write flush in detached state, ignore")); return; } if (heap->dbg_write_flush_cb == NULL) { DUK_DD(DUK_DDPRINT("no write flush callback, ignore")); return; } DUK__DBG_TPORT_ENTER(); heap->dbg_write_flush_cb(heap->dbg_udata); DUK__DBG_TPORT_EXIT(); } /* * Debug connection skip primitives */ /* Skip fully. */ DUK_INTERNAL void duk_debug_skip_bytes(duk_hthread *thr, duk_size_t length) { duk_uint8_t dummy[64]; duk_size_t now; DUK_ASSERT(thr != NULL); while (length > 0) { now = (length > sizeof(dummy) ? sizeof(dummy) : length); duk_debug_read_bytes(thr, dummy, now); length -= now; } } DUK_INTERNAL void duk_debug_skip_byte(duk_hthread *thr) { DUK_ASSERT(thr != NULL); (void) duk_debug_read_byte(thr); } /* * Debug connection read primitives */ /* Peek ahead in the stream one byte. */ DUK_INTERNAL uint8_t duk_debug_peek_byte(duk_hthread *thr) { /* It is important not to call this if the last byte read was an EOM. * Reading ahead in this scenario would cause unnecessary blocking if * another message is not available. */ duk_uint8_t x; x = duk_debug_read_byte(thr); thr->heap->dbg_have_next_byte = 1; thr->heap->dbg_next_byte = x; return x; } /* Read fully. */ DUK_INTERNAL void duk_debug_read_bytes(duk_hthread *thr, duk_uint8_t *data, duk_size_t length) { duk_heap *heap; duk_uint8_t *p; duk_size_t left; duk_size_t got; DUK_ASSERT(thr != NULL); heap = thr->heap; DUK_ASSERT(heap != NULL); if (heap->dbg_read_cb == NULL) { DUK_D(DUK_DPRINT("attempt to read %ld bytes in detached state, return zero data", (long) length)); goto fail; } /* NOTE: length may be zero */ p = data; if (length >= 1 && heap->dbg_have_next_byte) { heap->dbg_have_next_byte = 0; *p++ = heap->dbg_next_byte; } for (;;) { left = (duk_size_t) ((data + length) - p); if (left == 0) { break; } DUK_ASSERT(heap->dbg_read_cb != NULL); DUK_ASSERT(left >= 1); #if defined(DUK_USE_DEBUGGER_TRANSPORT_TORTURE) left = 1; #endif DUK__DBG_TPORT_ENTER(); got = heap->dbg_read_cb(heap->dbg_udata, (char *) p, left); DUK__DBG_TPORT_EXIT(); if (got == 0 || got > left) { DUK_D(DUK_DPRINT("connection error during read, return zero data")); duk__debug_null_most_callbacks(thr); /* avoid calling write callback in detach1() */ DUK__SET_CONN_BROKEN(thr, 1); goto fail; } p += got; } return; fail: DUK_MEMZERO((void *) data, (size_t) length); } DUK_INTERNAL duk_uint8_t duk_debug_read_byte(duk_hthread *thr) { duk_uint8_t x; x = 0; /* just in case callback is broken and won't write 'x' */ duk_debug_read_bytes(thr, &x, 1); return x; } DUK_LOCAL duk_uint32_t duk__debug_read_uint32_raw(duk_hthread *thr) { duk_uint8_t buf[4]; DUK_ASSERT(thr != NULL); duk_debug_read_bytes(thr, buf, 4); return ((duk_uint32_t) buf[0] << 24) | ((duk_uint32_t) buf[1] << 16) | ((duk_uint32_t) buf[2] << 8) | (duk_uint32_t) buf[3]; } DUK_LOCAL duk_int32_t duk__debug_read_int32_raw(duk_hthread *thr) { return (duk_int32_t) duk__debug_read_uint32_raw(thr); } DUK_LOCAL duk_uint16_t duk__debug_read_uint16_raw(duk_hthread *thr) { duk_uint8_t buf[2]; DUK_ASSERT(thr != NULL); duk_debug_read_bytes(thr, buf, 2); return ((duk_uint16_t) buf[0] << 8) | (duk_uint16_t) buf[1]; } DUK_INTERNAL duk_int32_t duk_debug_read_int(duk_hthread *thr) { duk_small_uint_t x; duk_small_uint_t t; DUK_ASSERT(thr != NULL); x = duk_debug_read_byte(thr); if (x >= 0xc0) { t = duk_debug_read_byte(thr); return (duk_int32_t) (((x - 0xc0) << 8) + t); } else if (x >= 0x80) { return (duk_int32_t) (x - 0x80); } else if (x == DUK_DBG_IB_INT4) { return (duk_int32_t) duk__debug_read_uint32_raw(thr); } DUK_D(DUK_DPRINT("debug connection error: failed to decode int")); DUK__SET_CONN_BROKEN(thr, 1); return 0; } DUK_LOCAL duk_hstring *duk__debug_read_hstring_raw(duk_hthread *thr, duk_uint32_t len) { duk_uint8_t buf[31]; duk_uint8_t *p; if (len <= sizeof(buf)) { duk_debug_read_bytes(thr, buf, (duk_size_t) len); duk_push_lstring(thr, (const char *) buf, (duk_size_t) len); } else { p = (duk_uint8_t *) duk_push_fixed_buffer(thr, (duk_size_t) len); /* zero for paranoia */ DUK_ASSERT(p != NULL); duk_debug_read_bytes(thr, p, (duk_size_t) len); (void) duk_buffer_to_string(thr, -1); /* Safety relies on debug client, which is OK. */ } return duk_require_hstring(thr, -1); } DUK_INTERNAL duk_hstring *duk_debug_read_hstring(duk_hthread *thr) { duk_small_uint_t x; duk_uint32_t len; DUK_ASSERT(thr != NULL); x = duk_debug_read_byte(thr); if (x >= 0x60 && x <= 0x7f) { /* For short strings, use a fixed temp buffer. */ len = (duk_uint32_t) (x - 0x60); } else if (x == DUK_DBG_IB_STR2) { len = (duk_uint32_t) duk__debug_read_uint16_raw(thr); } else if (x == DUK_DBG_IB_STR4) { len = (duk_uint32_t) duk__debug_read_uint32_raw(thr); } else { goto fail; } return duk__debug_read_hstring_raw(thr, len); fail: DUK_D(DUK_DPRINT("debug connection error: failed to decode int")); DUK__SET_CONN_BROKEN(thr, 1); duk_push_hstring_empty(thr); /* always push some string */ return duk_require_hstring(thr, -1); } DUK_LOCAL duk_hbuffer *duk__debug_read_hbuffer_raw(duk_hthread *thr, duk_uint32_t len) { duk_uint8_t *p; p = (duk_uint8_t *) duk_push_fixed_buffer(thr, (duk_size_t) len); /* zero for paranoia */ DUK_ASSERT(p != NULL); duk_debug_read_bytes(thr, p, (duk_size_t) len); return duk_require_hbuffer(thr, -1); } DUK_LOCAL void *duk__debug_read_pointer_raw(duk_hthread *thr) { duk_small_uint_t x; duk__ptr_union pu; DUK_ASSERT(thr != NULL); x = duk_debug_read_byte(thr); if (x != sizeof(pu)) { goto fail; } duk_debug_read_bytes(thr, (duk_uint8_t *) &pu.p, sizeof(pu)); #if defined(DUK_USE_INTEGER_LE) duk_byteswap_bytes((duk_uint8_t *) pu.b, sizeof(pu)); #endif return (void *) pu.p; fail: DUK_D(DUK_DPRINT("debug connection error: failed to decode pointer")); DUK__SET_CONN_BROKEN(thr, 1); return (void *) NULL; } DUK_LOCAL duk_double_t duk__debug_read_double_raw(duk_hthread *thr) { duk_double_union du; DUK_ASSERT(sizeof(du.uc) == 8); duk_debug_read_bytes(thr, (duk_uint8_t *) du.uc, sizeof(du.uc)); DUK_DBLUNION_DOUBLE_NTOH(&du); return du.d; } #if 0 DUK_INTERNAL duk_heaphdr *duk_debug_read_heapptr(duk_hthread *thr) { duk_small_uint_t x; DUK_ASSERT(thr != NULL); x = duk_debug_read_byte(thr); if (x != DUK_DBG_IB_HEAPPTR) { goto fail; } return (duk_heaphdr *) duk__debug_read_pointer_raw(thr); fail: DUK_D(DUK_DPRINT("debug connection error: failed to decode heapptr")); DUK__SET_CONN_BROKEN(thr, 1); return NULL; } #endif DUK_INTERNAL duk_heaphdr *duk_debug_read_any_ptr(duk_hthread *thr) { duk_small_uint_t x; DUK_ASSERT(thr != NULL); x = duk_debug_read_byte(thr); switch (x) { case DUK_DBG_IB_OBJECT: case DUK_DBG_IB_POINTER: case DUK_DBG_IB_HEAPPTR: /* Accept any pointer-like value; for 'object' dvalue, read * and ignore the class number. */ if (x == DUK_DBG_IB_OBJECT) { duk_debug_skip_byte(thr); } break; default: goto fail; } return (duk_heaphdr *) duk__debug_read_pointer_raw(thr); fail: DUK_D(DUK_DPRINT("debug connection error: failed to decode any pointer (object, pointer, heapptr)")); DUK__SET_CONN_BROKEN(thr, 1); return NULL; } DUK_INTERNAL duk_tval *duk_debug_read_tval(duk_hthread *thr) { duk_uint8_t x; duk_uint_t t; duk_uint32_t len; DUK_ASSERT(thr != NULL); x = duk_debug_read_byte(thr); if (x >= 0xc0) { t = (duk_uint_t) (x - 0xc0); t = (t << 8) + duk_debug_read_byte(thr); duk_push_uint(thr, (duk_uint_t) t); goto return_ptr; } if (x >= 0x80) { duk_push_uint(thr, (duk_uint_t) (x - 0x80)); goto return_ptr; } if (x >= 0x60) { len = (duk_uint32_t) (x - 0x60); duk__debug_read_hstring_raw(thr, len); goto return_ptr; } switch (x) { case DUK_DBG_IB_INT4: { duk_int32_t i = duk__debug_read_int32_raw(thr); duk_push_i32(thr, i); break; } case DUK_DBG_IB_STR4: { len = duk__debug_read_uint32_raw(thr); duk__debug_read_hstring_raw(thr, len); break; } case DUK_DBG_IB_STR2: { len = duk__debug_read_uint16_raw(thr); duk__debug_read_hstring_raw(thr, len); break; } case DUK_DBG_IB_BUF4: { len = duk__debug_read_uint32_raw(thr); duk__debug_read_hbuffer_raw(thr, len); break; } case DUK_DBG_IB_BUF2: { len = duk__debug_read_uint16_raw(thr); duk__debug_read_hbuffer_raw(thr, len); break; } case DUK_DBG_IB_UNDEFINED: { duk_push_undefined(thr); break; } case DUK_DBG_IB_NULL: { duk_push_null(thr); break; } case DUK_DBG_IB_TRUE: { duk_push_true(thr); break; } case DUK_DBG_IB_FALSE: { duk_push_false(thr); break; } case DUK_DBG_IB_NUMBER: { duk_double_t d; d = duk__debug_read_double_raw(thr); duk_push_number(thr, d); break; } case DUK_DBG_IB_OBJECT: { duk_heaphdr *h; duk_debug_skip_byte(thr); h = (duk_heaphdr *) duk__debug_read_pointer_raw(thr); duk_push_heapptr(thr, (void *) h); break; } case DUK_DBG_IB_POINTER: { void *ptr; ptr = duk__debug_read_pointer_raw(thr); duk_push_pointer(thr, ptr); break; } case DUK_DBG_IB_LIGHTFUNC: { /* XXX: Not needed for now, so not implemented. Note that * function pointers may have different size/layout than * a void pointer. */ DUK_D(DUK_DPRINT("reading lightfunc values unimplemented")); goto fail; } case DUK_DBG_IB_HEAPPTR: { duk_heaphdr *h; h = (duk_heaphdr *) duk__debug_read_pointer_raw(thr); duk_push_heapptr(thr, (void *) h); break; } case DUK_DBG_IB_UNUSED: /* unused: not accepted in inbound messages */ default: goto fail; } return_ptr: return DUK_GET_TVAL_NEGIDX(thr, -1); fail: DUK_D(DUK_DPRINT("debug connection error: failed to decode tval")); DUK__SET_CONN_BROKEN(thr, 1); return NULL; } /* * Debug connection write primitives */ /* Write fully. */ DUK_INTERNAL void duk_debug_write_bytes(duk_hthread *thr, const duk_uint8_t *data, duk_size_t length) { duk_heap *heap; const duk_uint8_t *p; duk_size_t left; duk_size_t got; DUK_ASSERT(thr != NULL); DUK_ASSERT(length == 0 || data != NULL); heap = thr->heap; DUK_ASSERT(heap != NULL); if (heap->dbg_write_cb == NULL) { DUK_D(DUK_DPRINT("attempt to write %ld bytes in detached state, ignore", (long) length)); return; } if (length == 0) { /* Avoid doing an actual write callback with length == 0, * because that's reserved for a write flush. */ return; } DUK_ASSERT(data != NULL); p = data; for (;;) { left = (duk_size_t) ((data + length) - p); if (left == 0) { break; } DUK_ASSERT(heap->dbg_write_cb != NULL); DUK_ASSERT(left >= 1); #if defined(DUK_USE_DEBUGGER_TRANSPORT_TORTURE) left = 1; #endif DUK__DBG_TPORT_ENTER(); got = heap->dbg_write_cb(heap->dbg_udata, (const char *) p, left); DUK__DBG_TPORT_EXIT(); if (got == 0 || got > left) { duk__debug_null_most_callbacks(thr); /* avoid calling write callback in detach1() */ DUK_D(DUK_DPRINT("connection error during write")); DUK__SET_CONN_BROKEN(thr, 1); return; } p += got; } } DUK_INTERNAL void duk_debug_write_byte(duk_hthread *thr, duk_uint8_t x) { duk_debug_write_bytes(thr, (const duk_uint8_t *) &x, 1); } DUK_INTERNAL void duk_debug_write_unused(duk_hthread *thr) { duk_debug_write_byte(thr, DUK_DBG_IB_UNUSED); } DUK_INTERNAL void duk_debug_write_undefined(duk_hthread *thr) { duk_debug_write_byte(thr, DUK_DBG_IB_UNDEFINED); } #if defined(DUK_USE_DEBUGGER_INSPECT) DUK_INTERNAL void duk_debug_write_null(duk_hthread *thr) { duk_debug_write_byte(thr, DUK_DBG_IB_NULL); } #endif DUK_INTERNAL void duk_debug_write_boolean(duk_hthread *thr, duk_uint_t val) { duk_debug_write_byte(thr, val ? DUK_DBG_IB_TRUE : DUK_DBG_IB_FALSE); } /* Write signed 32-bit integer. */ DUK_INTERNAL void duk_debug_write_int(duk_hthread *thr, duk_int32_t x) { duk_uint8_t buf[5]; duk_size_t len; DUK_ASSERT(thr != NULL); if (x >= 0 && x <= 0x3fL) { buf[0] = (duk_uint8_t) (0x80 + x); len = 1; } else if (x >= 0 && x <= 0x3fffL) { buf[0] = (duk_uint8_t) (0xc0 + (x >> 8)); buf[1] = (duk_uint8_t) (x & 0xff); len = 2; } else { /* Signed integers always map to 4 bytes now. */ buf[0] = (duk_uint8_t) DUK_DBG_IB_INT4; buf[1] = (duk_uint8_t) ((x >> 24) & 0xff); buf[2] = (duk_uint8_t) ((x >> 16) & 0xff); buf[3] = (duk_uint8_t) ((x >> 8) & 0xff); buf[4] = (duk_uint8_t) (x & 0xff); len = 5; } duk_debug_write_bytes(thr, buf, len); } /* Write unsigned 32-bit integer. */ DUK_INTERNAL void duk_debug_write_uint(duk_hthread *thr, duk_uint32_t x) { /* The debugger protocol doesn't support a plain integer encoding for * the full 32-bit unsigned range (only 32-bit signed). For now, * unsigned 32-bit values simply written as signed ones. This is not * a concrete issue except for 32-bit heaphdr fields. Proper solutions * would be to (a) write such integers as IEEE doubles or (b) add an * unsigned 32-bit dvalue. */ if (x >= 0x80000000UL) { DUK_D(DUK_DPRINT("writing unsigned integer 0x%08lx as signed integer", (long) x)); } duk_debug_write_int(thr, (duk_int32_t) x); } DUK_INTERNAL void duk_debug_write_strbuf(duk_hthread *thr, const char *data, duk_size_t length, duk_uint8_t marker_base) { duk_uint8_t buf[5]; duk_size_t buflen; DUK_ASSERT(thr != NULL); DUK_ASSERT(length == 0 || data != NULL); if (length <= 0x1fUL && marker_base == DUK_DBG_IB_STR4) { /* For strings, special form for short lengths. */ buf[0] = (duk_uint8_t) (0x60 + length); buflen = 1; } else if (length <= 0xffffUL) { buf[0] = (duk_uint8_t) (marker_base + 1); buf[1] = (duk_uint8_t) (length >> 8); buf[2] = (duk_uint8_t) (length & 0xff); buflen = 3; } else { buf[0] = (duk_uint8_t) marker_base; buf[1] = (duk_uint8_t) (length >> 24); buf[2] = (duk_uint8_t) ((length >> 16) & 0xff); buf[3] = (duk_uint8_t) ((length >> 8) & 0xff); buf[4] = (duk_uint8_t) (length & 0xff); buflen = 5; } duk_debug_write_bytes(thr, (const duk_uint8_t *) buf, buflen); duk_debug_write_bytes(thr, (const duk_uint8_t *) data, length); } DUK_INTERNAL void duk_debug_write_string(duk_hthread *thr, const char *data, duk_size_t length) { duk_debug_write_strbuf(thr, data, length, DUK_DBG_IB_STR4); } DUK_INTERNAL void duk_debug_write_cstring(duk_hthread *thr, const char *data) { DUK_ASSERT(thr != NULL); duk_debug_write_string(thr, data, data ? DUK_STRLEN(data) : 0); } DUK_INTERNAL void duk_debug_write_hstring(duk_hthread *thr, duk_hstring *h) { DUK_ASSERT(thr != NULL); /* XXX: differentiate null pointer from empty string? */ duk_debug_write_string(thr, (h != NULL ? (const char *) DUK_HSTRING_GET_DATA(h) : NULL), (h != NULL ? (duk_size_t) DUK_HSTRING_GET_BYTELEN(h) : 0)); } DUK_LOCAL void duk__debug_write_hstring_safe_top(duk_hthread *thr) { duk_debug_write_hstring(thr, duk_safe_to_hstring(thr, -1)); } DUK_INTERNAL void duk_debug_write_buffer(duk_hthread *thr, const char *data, duk_size_t length) { duk_debug_write_strbuf(thr, data, length, DUK_DBG_IB_BUF4); } DUK_INTERNAL void duk_debug_write_hbuffer(duk_hthread *thr, duk_hbuffer *h) { DUK_ASSERT(thr != NULL); duk_debug_write_buffer(thr, (h != NULL ? (const char *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h) : NULL), (h != NULL ? (duk_size_t) DUK_HBUFFER_GET_SIZE(h) : 0)); } DUK_LOCAL void duk__debug_write_pointer_raw(duk_hthread *thr, void *ptr, duk_uint8_t ibyte) { duk_uint8_t buf[2]; duk__ptr_union pu; DUK_ASSERT(thr != NULL); DUK_ASSERT(sizeof(ptr) >= 1 && sizeof(ptr) <= 16); /* ptr may be NULL */ buf[0] = ibyte; buf[1] = sizeof(pu); duk_debug_write_bytes(thr, buf, 2); pu.p = (void *) ptr; #if defined(DUK_USE_INTEGER_LE) duk_byteswap_bytes((duk_uint8_t *) pu.b, sizeof(pu)); #endif duk_debug_write_bytes(thr, (const duk_uint8_t *) &pu.p, (duk_size_t) sizeof(pu)); } DUK_INTERNAL void duk_debug_write_pointer(duk_hthread *thr, void *ptr) { duk__debug_write_pointer_raw(thr, ptr, DUK_DBG_IB_POINTER); } #if defined(DUK_USE_DEBUGGER_DUMPHEAP) || defined(DUK_USE_DEBUGGER_INSPECT) DUK_INTERNAL void duk_debug_write_heapptr(duk_hthread *thr, duk_heaphdr *h) { duk__debug_write_pointer_raw(thr, (void *) h, DUK_DBG_IB_HEAPPTR); } #endif /* DUK_USE_DEBUGGER_DUMPHEAP || DUK_USE_DEBUGGER_INSPECT */ DUK_INTERNAL void duk_debug_write_hobject(duk_hthread *thr, duk_hobject *obj) { duk_uint8_t buf[3]; duk__ptr_union pu; DUK_ASSERT(thr != NULL); DUK_ASSERT(sizeof(obj) >= 1 && sizeof(obj) <= 16); DUK_ASSERT(obj != NULL); buf[0] = DUK_DBG_IB_OBJECT; buf[1] = (duk_uint8_t) DUK_HOBJECT_GET_CLASS_NUMBER(obj); buf[2] = sizeof(pu); duk_debug_write_bytes(thr, buf, 3); pu.p = (void *) obj; #if defined(DUK_USE_INTEGER_LE) duk_byteswap_bytes((duk_uint8_t *) pu.b, sizeof(pu)); #endif duk_debug_write_bytes(thr, (const duk_uint8_t *) &pu.p, (duk_size_t) sizeof(pu)); } DUK_INTERNAL void duk_debug_write_tval(duk_hthread *thr, duk_tval *tv) { duk_c_function lf_func; duk_small_uint_t lf_flags; duk_uint8_t buf[4]; duk_double_union du1; duk_double_union du2; duk_int32_t i32; DUK_ASSERT(thr != NULL); DUK_ASSERT(tv != NULL); switch (DUK_TVAL_GET_TAG(tv)) { case DUK_TAG_UNDEFINED: duk_debug_write_byte(thr, DUK_DBG_IB_UNDEFINED); break; case DUK_TAG_UNUSED: duk_debug_write_byte(thr, DUK_DBG_IB_UNUSED); break; case DUK_TAG_NULL: duk_debug_write_byte(thr, DUK_DBG_IB_NULL); break; case DUK_TAG_BOOLEAN: DUK_ASSERT(DUK_TVAL_GET_BOOLEAN(tv) == 0 || DUK_TVAL_GET_BOOLEAN(tv) == 1); duk_debug_write_boolean(thr, DUK_TVAL_GET_BOOLEAN(tv)); break; case DUK_TAG_POINTER: duk_debug_write_pointer(thr, (void *) DUK_TVAL_GET_POINTER(tv)); break; case DUK_TAG_LIGHTFUNC: DUK_TVAL_GET_LIGHTFUNC(tv, lf_func, lf_flags); buf[0] = DUK_DBG_IB_LIGHTFUNC; buf[1] = (duk_uint8_t) (lf_flags >> 8); buf[2] = (duk_uint8_t) (lf_flags & 0xff); buf[3] = sizeof(lf_func); duk_debug_write_bytes(thr, buf, 4); duk_debug_write_bytes(thr, (const duk_uint8_t *) &lf_func, sizeof(lf_func)); break; case DUK_TAG_STRING: duk_debug_write_hstring(thr, DUK_TVAL_GET_STRING(tv)); break; case DUK_TAG_OBJECT: duk_debug_write_hobject(thr, DUK_TVAL_GET_OBJECT(tv)); break; case DUK_TAG_BUFFER: duk_debug_write_hbuffer(thr, DUK_TVAL_GET_BUFFER(tv)); break; #if defined(DUK_USE_FASTINT) case DUK_TAG_FASTINT: #endif default: /* Numbers are normalized to big (network) endian. We can * (but are not required) to use integer dvalues when there's * no loss of precision. * * XXX: share check with other code; this check is slow but * reliable and doesn't require careful exponent/mantissa * mask tricks as in the fastint downgrade code. */ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv)); DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); du1.d = DUK_TVAL_GET_NUMBER(tv); i32 = (duk_int32_t) du1.d; du2.d = (duk_double_t) i32; DUK_DD(DUK_DDPRINT("i32=%ld du1=%02x%02x%02x%02x%02x%02x%02x%02x " "du2=%02x%02x%02x%02x%02x%02x%02x%02x", (long) i32, (unsigned int) du1.uc[0], (unsigned int) du1.uc[1], (unsigned int) du1.uc[2], (unsigned int) du1.uc[3], (unsigned int) du1.uc[4], (unsigned int) du1.uc[5], (unsigned int) du1.uc[6], (unsigned int) du1.uc[7], (unsigned int) du2.uc[0], (unsigned int) du2.uc[1], (unsigned int) du2.uc[2], (unsigned int) du2.uc[3], (unsigned int) du2.uc[4], (unsigned int) du2.uc[5], (unsigned int) du2.uc[6], (unsigned int) du2.uc[7])); if (DUK_MEMCMP((const void *) du1.uc, (const void *) du2.uc, sizeof(du1.uc)) == 0) { duk_debug_write_int(thr, i32); } else { DUK_DBLUNION_DOUBLE_HTON(&du1); duk_debug_write_byte(thr, DUK_DBG_IB_NUMBER); duk_debug_write_bytes(thr, (const duk_uint8_t *) du1.uc, sizeof(du1.uc)); } } } #if defined(DUK_USE_DEBUGGER_DUMPHEAP) /* Variant for writing duk_tvals so that any heap allocated values are * written out as tagged heap pointers. */ DUK_LOCAL void duk__debug_write_tval_heapptr(duk_hthread *thr, duk_tval *tv) { if (DUK_TVAL_IS_HEAP_ALLOCATED(tv)) { duk_heaphdr *h = DUK_TVAL_GET_HEAPHDR(tv); duk_debug_write_heapptr(thr, h); } else { duk_debug_write_tval(thr, tv); } } #endif /* DUK_USE_DEBUGGER_DUMPHEAP */ /* * Debug connection message write helpers */ #if 0 /* unused */ DUK_INTERNAL void duk_debug_write_request(duk_hthread *thr, duk_small_uint_t command) { duk_debug_write_byte(thr, DUK_DBG_IB_REQUEST); duk_debug_write_int(thr, command); } #endif DUK_INTERNAL void duk_debug_write_reply(duk_hthread *thr) { duk_debug_write_byte(thr, DUK_DBG_IB_REPLY); } DUK_INTERNAL void duk_debug_write_error_eom(duk_hthread *thr, duk_small_uint_t err_code, const char *msg) { /* Allow NULL 'msg' */ duk_debug_write_byte(thr, DUK_DBG_IB_ERROR); duk_debug_write_int(thr, (duk_int32_t) err_code); duk_debug_write_cstring(thr, msg); duk_debug_write_eom(thr); } DUK_INTERNAL void duk_debug_write_notify(duk_hthread *thr, duk_small_uint_t command) { duk_debug_write_byte(thr, DUK_DBG_IB_NOTIFY); duk_debug_write_int(thr, (duk_int32_t) command); } DUK_INTERNAL void duk_debug_write_eom(duk_hthread *thr) { duk_debug_write_byte(thr, DUK_DBG_IB_EOM); /* As an initial implementation, write flush after every EOM (and the * version identifier). A better implementation would flush only when * Duktape is finished processing messages so that a flush only happens * after all outbound messages are finished on that occasion. */ duk_debug_write_flush(thr); } /* * Status message and helpers */ DUK_INTERNAL duk_uint_fast32_t duk_debug_curr_line(duk_hthread *thr) { duk_activation *act; duk_uint_fast32_t line; duk_uint_fast32_t pc; act = thr->callstack_curr; if (act == NULL) { return 0; } /* We're conceptually between two opcodes; act->pc indicates the next * instruction to be executed. This is usually the correct pc/line to * indicate in Status. (For the 'debugger' statement this now reports * the pc/line after the debugger statement because the debugger opcode * has already been executed.) */ pc = duk_hthread_get_act_curr_pc(thr, act); /* XXX: this should be optimized to be a raw query and avoid valstack * operations if possible. */ duk_push_tval(thr, &act->tv_func); line = duk_hobject_pc2line_query(thr, -1, pc); duk_pop(thr); return line; } DUK_INTERNAL void duk_debug_send_status(duk_hthread *thr) { duk_activation *act; duk_debug_write_notify(thr, DUK_DBG_CMD_STATUS); duk_debug_write_int(thr, (DUK_HEAP_HAS_DEBUGGER_PAUSED(thr->heap) ? 1 : 0)); act = thr->callstack_curr; if (act == NULL) { duk_debug_write_undefined(thr); duk_debug_write_undefined(thr); duk_debug_write_int(thr, 0); duk_debug_write_int(thr, 0); } else { duk_push_tval(thr, &act->tv_func); duk_get_prop_string(thr, -1, "fileName"); duk__debug_write_hstring_safe_top(thr); duk_get_prop_string(thr, -2, "name"); duk__debug_write_hstring_safe_top(thr); duk_pop_3(thr); /* Report next pc/line to be executed. */ duk_debug_write_uint(thr, (duk_uint32_t) duk_debug_curr_line(thr)); duk_debug_write_uint(thr, (duk_uint32_t) duk_hthread_get_act_curr_pc(thr, act)); } duk_debug_write_eom(thr); } #if defined(DUK_USE_DEBUGGER_THROW_NOTIFY) DUK_INTERNAL void duk_debug_send_throw(duk_hthread *thr, duk_bool_t fatal) { /* * NFY <int: 5> <int: fatal> <str: msg> <str: filename> <int: linenumber> EOM */ duk_activation *act; duk_uint32_t pc; DUK_ASSERT(thr->valstack_top > thr->valstack); /* At least: ... [err] */ duk_debug_write_notify(thr, DUK_DBG_CMD_THROW); duk_debug_write_int(thr, (duk_int32_t) fatal); /* Report thrown value to client coerced to string */ duk_dup_top(thr); duk__debug_write_hstring_safe_top(thr); duk_pop(thr); if (duk_is_error(thr, -1)) { /* Error instance, use augmented error data directly */ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_FILE_NAME); duk__debug_write_hstring_safe_top(thr); duk_get_prop_stridx_short(thr, -2, DUK_STRIDX_LINE_NUMBER); duk_debug_write_uint(thr, duk_get_uint(thr, -1)); duk_pop_2(thr); } else { /* For anything other than an Error instance, we calculate the * error location directly from the current activation if one * exists. */ act = thr->callstack_curr; if (act != NULL) { duk_push_tval(thr, &act->tv_func); duk_get_prop_string(thr, -1, "fileName"); duk__debug_write_hstring_safe_top(thr); pc = (duk_uint32_t) duk_hthread_get_act_prev_pc(thr, act); duk_debug_write_uint(thr, (duk_uint32_t) duk_hobject_pc2line_query(thr, -2, pc)); duk_pop_2(thr); } else { /* Can happen if duk_throw() is called on an empty * callstack. */ duk_debug_write_cstring(thr, ""); duk_debug_write_uint(thr, 0); } } duk_debug_write_eom(thr); } #endif /* DUK_USE_DEBUGGER_THROW_NOTIFY */ /* * Debug message processing */ /* Skip dvalue. */ DUK_LOCAL duk_bool_t duk__debug_skip_dvalue(duk_hthread *thr) { duk_uint8_t x; duk_uint32_t len; x = duk_debug_read_byte(thr); if (x >= 0xc0) { duk_debug_skip_byte(thr); return 0; } if (x >= 0x80) { return 0; } if (x >= 0x60) { duk_debug_skip_bytes(thr, (duk_size_t) (x - 0x60)); return 0; } switch(x) { case DUK_DBG_IB_EOM: return 1; /* Return 1: got EOM */ case DUK_DBG_IB_REQUEST: case DUK_DBG_IB_REPLY: case DUK_DBG_IB_ERROR: case DUK_DBG_IB_NOTIFY: break; case DUK_DBG_IB_INT4: (void) duk__debug_read_uint32_raw(thr); break; case DUK_DBG_IB_STR4: case DUK_DBG_IB_BUF4: len = duk__debug_read_uint32_raw(thr); duk_debug_skip_bytes(thr, len); break; case DUK_DBG_IB_STR2: case DUK_DBG_IB_BUF2: len = duk__debug_read_uint16_raw(thr); duk_debug_skip_bytes(thr, len); break; case DUK_DBG_IB_UNUSED: case DUK_DBG_IB_UNDEFINED: case DUK_DBG_IB_NULL: case DUK_DBG_IB_TRUE: case DUK_DBG_IB_FALSE: break; case DUK_DBG_IB_NUMBER: duk_debug_skip_bytes(thr, 8); break; case DUK_DBG_IB_OBJECT: duk_debug_skip_byte(thr); len = duk_debug_read_byte(thr); duk_debug_skip_bytes(thr, len); break; case DUK_DBG_IB_POINTER: case DUK_DBG_IB_HEAPPTR: len = duk_debug_read_byte(thr); duk_debug_skip_bytes(thr, len); break; case DUK_DBG_IB_LIGHTFUNC: duk_debug_skip_bytes(thr, 2); len = duk_debug_read_byte(thr); duk_debug_skip_bytes(thr, len); break; default: goto fail; } return 0; fail: DUK__SET_CONN_BROKEN(thr, 1); return 1; /* Pretend like we got EOM */ } /* Skip dvalues to EOM. */ DUK_LOCAL void duk__debug_skip_to_eom(duk_hthread *thr) { for (;;) { if (duk__debug_skip_dvalue(thr)) { break; } } } /* Read and validate a call stack index. If index is invalid, write out an * error message and return zero. */ DUK_LOCAL duk_int32_t duk__debug_read_validate_csindex(duk_hthread *thr) { duk_int32_t level; level = duk_debug_read_int(thr); if (level >= 0 || -level > (duk_int32_t) thr->callstack_top) { duk_debug_write_error_eom(thr, DUK_DBG_ERR_NOTFOUND, "invalid callstack index"); return 0; /* zero indicates failure */ } return level; } /* Read a call stack index and lookup the corresponding duk_activation. * If index is invalid, write out an error message and return NULL. */ DUK_LOCAL duk_activation *duk__debug_read_level_get_activation(duk_hthread *thr) { duk_activation *act; duk_int32_t level; level = duk_debug_read_int(thr); act = duk_hthread_get_activation_for_level(thr, level); if (act == NULL) { duk_debug_write_error_eom(thr, DUK_DBG_ERR_NOTFOUND, "invalid callstack index"); } return act; } /* * Simple commands */ DUK_LOCAL void duk__debug_handle_basic_info(duk_hthread *thr, duk_heap *heap) { DUK_UNREF(heap); DUK_D(DUK_DPRINT("debug command Version")); duk_debug_write_reply(thr); duk_debug_write_int(thr, DUK_VERSION); duk_debug_write_cstring(thr, DUK_GIT_DESCRIBE); duk_debug_write_cstring(thr, DUK_USE_TARGET_INFO); #if defined(DUK_USE_DOUBLE_LE) duk_debug_write_int(thr, 1); #elif defined(DUK_USE_DOUBLE_ME) duk_debug_write_int(thr, 2); #elif defined(DUK_USE_DOUBLE_BE) duk_debug_write_int(thr, 3); #else duk_debug_write_int(thr, 0); #endif duk_debug_write_int(thr, (duk_int_t) sizeof(void *)); duk_debug_write_eom(thr); } DUK_LOCAL void duk__debug_handle_trigger_status(duk_hthread *thr, duk_heap *heap) { DUK_UNREF(heap); DUK_D(DUK_DPRINT("debug command TriggerStatus")); duk_debug_write_reply(thr); duk_debug_write_eom(thr); heap->dbg_state_dirty = 1; } DUK_LOCAL void duk__debug_handle_pause(duk_hthread *thr, duk_heap *heap) { DUK_D(DUK_DPRINT("debug command Pause")); duk_debug_set_paused(heap); duk_debug_write_reply(thr); duk_debug_write_eom(thr); } DUK_LOCAL void duk__debug_handle_resume(duk_hthread *thr, duk_heap *heap) { duk_small_uint_t pause_flags; DUK_D(DUK_DPRINT("debug command Resume")); duk_debug_clear_paused(heap); pause_flags = 0; #if 0 /* manual testing */ pause_flags |= DUK_PAUSE_FLAG_ONE_OPCODE; pause_flags |= DUK_PAUSE_FLAG_CAUGHT_ERROR; pause_flags |= DUK_PAUSE_FLAG_UNCAUGHT_ERROR; #endif #if defined(DUK_USE_DEBUGGER_PAUSE_UNCAUGHT) pause_flags |= DUK_PAUSE_FLAG_UNCAUGHT_ERROR; #endif duk__debug_set_pause_state(thr, heap, pause_flags); duk_debug_write_reply(thr); duk_debug_write_eom(thr); } DUK_LOCAL void duk__debug_handle_step(duk_hthread *thr, duk_heap *heap, duk_int32_t cmd) { duk_small_uint_t pause_flags; DUK_D(DUK_DPRINT("debug command StepInto/StepOver/StepOut: %d", (int) cmd)); if (cmd == DUK_DBG_CMD_STEPINTO) { pause_flags = DUK_PAUSE_FLAG_LINE_CHANGE | DUK_PAUSE_FLAG_FUNC_ENTRY | DUK_PAUSE_FLAG_FUNC_EXIT; } else if (cmd == DUK_DBG_CMD_STEPOVER) { pause_flags = DUK_PAUSE_FLAG_LINE_CHANGE | DUK_PAUSE_FLAG_FUNC_EXIT; } else { DUK_ASSERT(cmd == DUK_DBG_CMD_STEPOUT); pause_flags = DUK_PAUSE_FLAG_FUNC_EXIT; } #if defined(DUK_USE_DEBUGGER_PAUSE_UNCAUGHT) pause_flags |= DUK_PAUSE_FLAG_UNCAUGHT_ERROR; #endif /* If current activation doesn't have line information, line-based * pause flags are automatically disabled. As a result, e.g. * StepInto will then pause on (native) function entry or exit. */ duk_debug_clear_paused(heap); duk__debug_set_pause_state(thr, heap, pause_flags); duk_debug_write_reply(thr); duk_debug_write_eom(thr); } DUK_LOCAL void duk__debug_handle_list_break(duk_hthread *thr, duk_heap *heap) { duk_small_int_t i; DUK_D(DUK_DPRINT("debug command ListBreak")); duk_debug_write_reply(thr); for (i = 0; i < (duk_small_int_t) heap->dbg_breakpoint_count; i++) { duk_debug_write_hstring(thr, heap->dbg_breakpoints[i].filename); duk_debug_write_uint(thr, (duk_uint32_t) heap->dbg_breakpoints[i].line); } duk_debug_write_eom(thr); } DUK_LOCAL void duk__debug_handle_add_break(duk_hthread *thr, duk_heap *heap) { duk_hstring *filename; duk_uint32_t linenumber; duk_small_int_t idx; DUK_UNREF(heap); filename = duk_debug_read_hstring(thr); linenumber = (duk_uint32_t) duk_debug_read_int(thr); DUK_D(DUK_DPRINT("debug command AddBreak: %!O:%ld", (duk_hobject *) filename, (long) linenumber)); idx = duk_debug_add_breakpoint(thr, filename, linenumber); if (idx >= 0) { duk_debug_write_reply(thr); duk_debug_write_int(thr, (duk_int32_t) idx); duk_debug_write_eom(thr); } else { duk_debug_write_error_eom(thr, DUK_DBG_ERR_TOOMANY, "no space for breakpoint"); } } DUK_LOCAL void duk__debug_handle_del_break(duk_hthread *thr, duk_heap *heap) { duk_small_uint_t idx; DUK_UNREF(heap); DUK_D(DUK_DPRINT("debug command DelBreak")); idx = (duk_small_uint_t) duk_debug_read_int(thr); if (duk_debug_remove_breakpoint(thr, idx)) { duk_debug_write_reply(thr); duk_debug_write_eom(thr); } else { duk_debug_write_error_eom(thr, DUK_DBG_ERR_NOTFOUND, "invalid breakpoint index"); } } DUK_LOCAL void duk__debug_handle_get_var(duk_hthread *thr, duk_heap *heap) { duk_activation *act; duk_hstring *str; duk_bool_t rc; DUK_UNREF(heap); DUK_D(DUK_DPRINT("debug command GetVar")); act = duk__debug_read_level_get_activation(thr); if (act == NULL) { return; } str = duk_debug_read_hstring(thr); /* push to stack */ DUK_ASSERT(str != NULL); rc = duk_js_getvar_activation(thr, act, str, 0); duk_debug_write_reply(thr); if (rc) { duk_debug_write_int(thr, 1); DUK_ASSERT(duk_get_tval(thr, -2) != NULL); duk_debug_write_tval(thr, duk_get_tval(thr, -2)); } else { duk_debug_write_int(thr, 0); duk_debug_write_unused(thr); } duk_debug_write_eom(thr); } DUK_LOCAL void duk__debug_handle_put_var(duk_hthread *thr, duk_heap *heap) { duk_activation *act; duk_hstring *str; duk_tval *tv; DUK_UNREF(heap); DUK_D(DUK_DPRINT("debug command PutVar")); act = duk__debug_read_level_get_activation(thr); if (act == NULL) { return; } str = duk_debug_read_hstring(thr); /* push to stack */ DUK_ASSERT(str != NULL); tv = duk_debug_read_tval(thr); if (tv == NULL) { /* detached */ return; } duk_js_putvar_activation(thr, act, str, tv, 0); /* XXX: Current putvar implementation doesn't have a success flag, * add one and send to debug client? */ duk_debug_write_reply(thr); duk_debug_write_eom(thr); } DUK_LOCAL void duk__debug_handle_get_call_stack(duk_hthread *thr, duk_heap *heap) { duk_hthread *curr_thr = thr; duk_activation *curr_act; duk_uint_fast32_t pc; duk_uint_fast32_t line; DUK_ASSERT(thr != NULL); DUK_UNREF(heap); duk_debug_write_reply(thr); while (curr_thr != NULL) { for (curr_act = curr_thr->callstack_curr; curr_act != NULL; curr_act = curr_act->parent) { /* PC/line semantics here are: * - For callstack top we're conceptually between two * opcodes and current PC indicates next line to * execute, so report that (matches Status). * - For other activations we're conceptually still * executing the instruction at PC-1, so report that * (matches error stacktrace behavior). * - See: https://github.com/svaarala/duktape/issues/281 */ /* XXX: optimize to use direct reads, i.e. avoid * value stack operations. */ duk_push_tval(thr, &curr_act->tv_func); duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_FILE_NAME); duk__debug_write_hstring_safe_top(thr); duk_get_prop_stridx_short(thr, -2, DUK_STRIDX_NAME); duk__debug_write_hstring_safe_top(thr); pc = duk_hthread_get_act_curr_pc(thr, curr_act); if (curr_act != curr_thr->callstack_curr && pc > 0) { pc--; } line = duk_hobject_pc2line_query(thr, -3, pc); duk_debug_write_uint(thr, (duk_uint32_t) line); duk_debug_write_uint(thr, (duk_uint32_t) pc); duk_pop_3(thr); } curr_thr = curr_thr->resumer; } /* SCANBUILD: warning about 'thr' potentially being NULL here, * warning is incorrect because thr != NULL always here. */ duk_debug_write_eom(thr); } DUK_LOCAL void duk__debug_handle_get_locals(duk_hthread *thr, duk_heap *heap) { duk_activation *act; duk_hstring *varname; DUK_UNREF(heap); act = duk__debug_read_level_get_activation(thr); if (act == NULL) { return; } duk_debug_write_reply(thr); /* XXX: several nice-to-have improvements here: * - Use direct reads avoiding value stack operations * - Avoid triggering getters, indicate getter values to debug client * - If side effects are possible, add error catching */ duk_push_tval(thr, &act->tv_func); duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VARMAP); if (duk_is_object(thr, -1)) { duk_enum(thr, -1, 0 /*enum_flags*/); while (duk_next(thr, -1 /*enum_index*/, 0 /*get_value*/)) { varname = duk_known_hstring(thr, -1); duk_js_getvar_activation(thr, act, varname, 0 /*throw_flag*/); /* [ ... func varmap enum key value this ] */ duk_debug_write_hstring(thr, duk_get_hstring(thr, -3)); duk_debug_write_tval(thr, duk_get_tval(thr, -2)); duk_pop_3(thr); /* -> [ ... func varmap enum ] */ } } else { DUK_D(DUK_DPRINT("varmap is not an object in GetLocals, ignore")); } duk_debug_write_eom(thr); } DUK_LOCAL void duk__debug_handle_eval(duk_hthread *thr, duk_heap *heap) { duk_small_uint_t call_flags; duk_int_t call_ret; duk_small_int_t eval_err; duk_bool_t direct_eval; duk_int32_t level; duk_idx_t idx_func; DUK_UNREF(heap); DUK_D(DUK_DPRINT("debug command Eval")); /* The eval code is executed within the lexical environment of a specified * activation. For now, use global object eval() function, with the eval * considered a 'direct call to eval'. * * Callstack index for debug commands only affects scope -- the callstack * as seen by, e.g. Duktape.act() will be the same regardless. */ /* nargs == 2 so we can pass a callstack index to eval(). */ idx_func = duk_get_top(thr); duk_push_c_function(thr, duk_bi_global_object_eval, 2 /*nargs*/); duk_push_undefined(thr); /* 'this' binding shouldn't matter here */ /* Read callstack index, if non-null. */ if (duk_debug_peek_byte(thr) == DUK_DBG_IB_NULL) { direct_eval = 0; level = -1; /* Not needed, but silences warning. */ (void) duk_debug_read_byte(thr); } else { direct_eval = 1; level = duk__debug_read_validate_csindex(thr); if (level == 0) { return; } } DUK_ASSERT(!direct_eval || (level < 0 && -level <= (duk_int32_t) thr->callstack_top)); (void) duk_debug_read_hstring(thr); if (direct_eval) { duk_push_int(thr, level - 1); /* compensate for eval() call */ } /* [ ... eval "eval" eval_input level? ] */ call_flags = 0; if (direct_eval) { duk_activation *act; duk_hobject *fun; act = duk_hthread_get_activation_for_level(thr, level); if (act != NULL) { fun = DUK_ACT_GET_FUNC(act); if (fun != NULL && DUK_HOBJECT_IS_COMPFUNC(fun)) { /* Direct eval requires that there's a current * activation and it is an Ecmascript function. * When Eval is executed from e.g. cooperate API * call we'll need to do an indirect eval instead. */ call_flags |= DUK_CALL_FLAG_DIRECT_EVAL; } } } call_ret = duk_pcall_method_flags(thr, duk_get_top(thr) - (idx_func + 2), call_flags); if (call_ret == DUK_EXEC_SUCCESS) { eval_err = 0; /* Use result value as is. */ } else { /* For errors a string coerced result is most informative * right now, as the debug client doesn't have the capability * to traverse the error object. */ eval_err = 1; duk_safe_to_string(thr, -1); } /* [ ... result ] */ duk_debug_write_reply(thr); duk_debug_write_int(thr, (duk_int32_t) eval_err); DUK_ASSERT(duk_get_tval(thr, -1) != NULL); duk_debug_write_tval(thr, duk_get_tval(thr, -1)); duk_debug_write_eom(thr); } DUK_LOCAL void duk__debug_handle_detach(duk_hthread *thr, duk_heap *heap) { DUK_UNREF(heap); DUK_D(DUK_DPRINT("debug command Detach")); duk_debug_write_reply(thr); duk_debug_write_eom(thr); DUK_D(DUK_DPRINT("debug connection detached, mark broken")); DUK__SET_CONN_BROKEN(thr, 0); /* not an error */ } DUK_LOCAL void duk__debug_handle_apprequest(duk_hthread *thr, duk_heap *heap) { duk_idx_t old_top; DUK_D(DUK_DPRINT("debug command AppRequest")); old_top = duk_get_top(thr); /* save stack top */ if (heap->dbg_request_cb != NULL) { duk_idx_t nrets; duk_idx_t nvalues = 0; duk_idx_t top, idx; /* Read tvals from the message and push them onto the valstack, * then call the request callback to process the request. */ while (duk_debug_peek_byte(thr) != DUK_DBG_IB_EOM) { duk_tval *tv; if (!duk_check_stack(thr, 1)) { DUK_D(DUK_DPRINT("failed to allocate space for request dvalue(s)")); goto fail; } tv = duk_debug_read_tval(thr); /* push to stack */ if (tv == NULL) { /* detached */ return; } nvalues++; } DUK_ASSERT(duk_get_top(thr) == old_top + nvalues); /* Request callback should push values for reply to client onto valstack */ DUK_D(DUK_DPRINT("calling into AppRequest request_cb with nvalues=%ld, old_top=%ld, top=%ld", (long) nvalues, (long) old_top, (long) duk_get_top(thr))); nrets = heap->dbg_request_cb(thr, heap->dbg_udata, nvalues); DUK_D(DUK_DPRINT("returned from AppRequest request_cb; nvalues=%ld -> nrets=%ld, old_top=%ld, top=%ld", (long) nvalues, (long) nrets, (long) old_top, (long) duk_get_top(thr))); if (nrets >= 0) { DUK_ASSERT(duk_get_top(thr) >= old_top + nrets); if (duk_get_top(thr) < old_top + nrets) { DUK_D(DUK_DPRINT("AppRequest callback doesn't match value stack configuration, " "top=%ld < old_top=%ld + nrets=%ld; " "this might mean it's unsafe to continue!", (long) duk_get_top(thr), (long) old_top, (long) nrets)); goto fail; } /* Reply with tvals pushed by request callback */ duk_debug_write_byte(thr, DUK_DBG_IB_REPLY); top = duk_get_top(thr); for (idx = top - nrets; idx < top; idx++) { duk_debug_write_tval(thr, DUK_GET_TVAL_POSIDX(thr, idx)); } duk_debug_write_eom(thr); } else { DUK_ASSERT(duk_get_top(thr) >= old_top + 1); if (duk_get_top(thr) < old_top + 1) { DUK_D(DUK_DPRINT("request callback return value doesn't match value stack configuration")); goto fail; } duk_debug_write_error_eom(thr, DUK_DBG_ERR_APPLICATION, duk_get_string(thr, -1)); } duk_set_top(thr, old_top); /* restore stack top */ } else { DUK_D(DUK_DPRINT("no request callback, treat AppRequest as unsupported")); duk_debug_write_error_eom(thr, DUK_DBG_ERR_UNSUPPORTED, "AppRequest unsupported by target"); } return; fail: duk_set_top(thr, old_top); /* restore stack top */ DUK__SET_CONN_BROKEN(thr, 1); } /* * DumpHeap command */ #if defined(DUK_USE_DEBUGGER_DUMPHEAP) /* XXX: this has some overlap with object inspection; remove this and make * DumpHeap return lists of heapptrs instead? */ DUK_LOCAL void duk__debug_dump_heaphdr(duk_hthread *thr, duk_heap *heap, duk_heaphdr *hdr) { DUK_UNREF(heap); duk_debug_write_heapptr(thr, hdr); duk_debug_write_uint(thr, (duk_uint32_t) DUK_HEAPHDR_GET_TYPE(hdr)); duk_debug_write_uint(thr, (duk_uint32_t) DUK_HEAPHDR_GET_FLAGS_RAW(hdr)); #if defined(DUK_USE_REFERENCE_COUNTING) duk_debug_write_uint(thr, (duk_uint32_t) DUK_HEAPHDR_GET_REFCOUNT(hdr)); #else duk_debug_write_int(thr, (duk_int32_t) -1); #endif switch (DUK_HEAPHDR_GET_TYPE(hdr)) { case DUK_HTYPE_STRING: { duk_hstring *h = (duk_hstring *) hdr; duk_debug_write_uint(thr, (duk_uint32_t) DUK_HSTRING_GET_BYTELEN(h)); duk_debug_write_uint(thr, (duk_uint32_t) DUK_HSTRING_GET_CHARLEN(h)); duk_debug_write_uint(thr, (duk_uint32_t) DUK_HSTRING_GET_HASH(h)); duk_debug_write_hstring(thr, h); break; } case DUK_HTYPE_OBJECT: { duk_hobject *h = (duk_hobject *) hdr; duk_hstring *k; duk_uint_fast32_t i; duk_debug_write_uint(thr, (duk_uint32_t) DUK_HOBJECT_GET_CLASS_NUMBER(h)); duk_debug_write_heapptr(thr, (duk_heaphdr *) DUK_HOBJECT_GET_PROTOTYPE(heap, h)); duk_debug_write_uint(thr, (duk_uint32_t) DUK_HOBJECT_GET_ESIZE(h)); duk_debug_write_uint(thr, (duk_uint32_t) DUK_HOBJECT_GET_ENEXT(h)); duk_debug_write_uint(thr, (duk_uint32_t) DUK_HOBJECT_GET_ASIZE(h)); duk_debug_write_uint(thr, (duk_uint32_t) DUK_HOBJECT_GET_HSIZE(h)); for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ENEXT(h); i++) { duk_debug_write_uint(thr, (duk_uint32_t) DUK_HOBJECT_E_GET_FLAGS(heap, h, i)); k = DUK_HOBJECT_E_GET_KEY(heap, h, i); duk_debug_write_heapptr(thr, (duk_heaphdr *) k); if (k == NULL) { duk_debug_write_int(thr, 0); /* isAccessor */ duk_debug_write_unused(thr); continue; } if (DUK_HOBJECT_E_SLOT_IS_ACCESSOR(heap, h, i)) { duk_debug_write_int(thr, 1); /* isAccessor */ duk_debug_write_heapptr(thr, (duk_heaphdr *) DUK_HOBJECT_E_GET_VALUE_PTR(heap, h, i)->a.get); duk_debug_write_heapptr(thr, (duk_heaphdr *) DUK_HOBJECT_E_GET_VALUE_PTR(heap, h, i)->a.set); } else { duk_debug_write_int(thr, 0); /* isAccessor */ duk__debug_write_tval_heapptr(thr, &DUK_HOBJECT_E_GET_VALUE_PTR(heap, h, i)->v); } } for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ASIZE(h); i++) { /* Note: array dump will include elements beyond * 'length'. */ duk__debug_write_tval_heapptr(thr, DUK_HOBJECT_A_GET_VALUE_PTR(heap, h, i)); } break; } case DUK_HTYPE_BUFFER: { duk_hbuffer *h = (duk_hbuffer *) hdr; duk_debug_write_uint(thr, (duk_uint32_t) DUK_HBUFFER_GET_SIZE(h)); duk_debug_write_buffer(thr, (const char *) DUK_HBUFFER_GET_DATA_PTR(heap, h), (duk_size_t) DUK_HBUFFER_GET_SIZE(h)); break; } default: { DUK_D(DUK_DPRINT("invalid htype: %d", (int) DUK_HEAPHDR_GET_TYPE(hdr))); } } } DUK_LOCAL void duk__debug_dump_heap_allocated(duk_hthread *thr, duk_heap *heap) { duk_heaphdr *hdr; hdr = heap->heap_allocated; while (hdr != NULL) { duk__debug_dump_heaphdr(thr, heap, hdr); hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr); } } DUK_LOCAL void duk__debug_dump_strtab(duk_hthread *thr, duk_heap *heap) { duk_uint32_t i; duk_hstring *h; for (i = 0; i < heap->st_size; i++) { #if defined(DUK_USE_STRTAB_PTRCOMP) h = DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, heap->strtable16[i]); #else h = heap->strtable[i]; #endif while (h != NULL) { duk__debug_dump_heaphdr(thr, heap, (duk_heaphdr *) h); h = h->hdr.h_next; } } } DUK_LOCAL void duk__debug_handle_dump_heap(duk_hthread *thr, duk_heap *heap) { DUK_D(DUK_DPRINT("debug command DumpHeap")); duk_debug_write_reply(thr); duk__debug_dump_heap_allocated(thr, heap); duk__debug_dump_strtab(thr, heap); duk_debug_write_eom(thr); } #endif /* DUK_USE_DEBUGGER_DUMPHEAP */ DUK_LOCAL void duk__debug_handle_get_bytecode(duk_hthread *thr, duk_heap *heap) { duk_activation *act; duk_hcompfunc *fun = NULL; duk_size_t i, n; duk_tval *tv; duk_hobject **fn; duk_int32_t level = -1; duk_uint8_t ibyte; DUK_UNREF(heap); DUK_D(DUK_DPRINT("debug command GetBytecode")); ibyte = duk_debug_peek_byte(thr); if (ibyte != DUK_DBG_IB_EOM) { tv = duk_debug_read_tval(thr); if (tv == NULL) { /* detached */ return; } if (DUK_TVAL_IS_OBJECT(tv)) { /* tentative, checked later */ fun = (duk_hcompfunc *) DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(fun != NULL); } else if (DUK_TVAL_IS_NUMBER(tv)) { level = (duk_int32_t) DUK_TVAL_GET_NUMBER(tv); } else { DUK_D(DUK_DPRINT("invalid argument to GetBytecode: %!T", tv)); goto fail_args; } } if (fun == NULL) { act = duk_hthread_get_activation_for_level(thr, level); if (act == NULL) { goto fail_index; } fun = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act); } if (fun == NULL || !DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) fun)) { DUK_D(DUK_DPRINT("invalid argument to GetBytecode: %!O", fun)); goto fail_args; } DUK_ASSERT(fun != NULL && DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) fun)); duk_debug_write_reply(thr); n = DUK_HCOMPFUNC_GET_CONSTS_COUNT(heap, fun); duk_debug_write_int(thr, (duk_int32_t) n); tv = DUK_HCOMPFUNC_GET_CONSTS_BASE(heap, fun); for (i = 0; i < n; i++) { duk_debug_write_tval(thr, tv); tv++; } n = DUK_HCOMPFUNC_GET_FUNCS_COUNT(heap, fun); duk_debug_write_int(thr, (duk_int32_t) n); fn = DUK_HCOMPFUNC_GET_FUNCS_BASE(heap, fun); for (i = 0; i < n; i++) { duk_debug_write_hobject(thr, *fn); fn++; } duk_debug_write_string(thr, (const char *) DUK_HCOMPFUNC_GET_CODE_BASE(heap, fun), (duk_size_t) DUK_HCOMPFUNC_GET_CODE_SIZE(heap, fun)); duk_debug_write_eom(thr); return; fail_args: duk_debug_write_error_eom(thr, DUK_DBG_ERR_UNKNOWN, "invalid argument"); return; fail_index: duk_debug_write_error_eom(thr, DUK_DBG_ERR_NOTFOUND, "invalid callstack index"); return; } /* * Object inspection commands: GetHeapObjInfo, GetObjPropDesc, * GetObjPropDescRange */ #if defined(DUK_USE_DEBUGGER_INSPECT) #if 0 /* pruned */ DUK_LOCAL const char * const duk__debug_getinfo_heaphdr_keys[] = { "reachable", "temproot", "finalizable", "finalized", "readonly" /* NULL not needed here */ }; DUK_LOCAL duk_uint_t duk__debug_getinfo_heaphdr_masks[] = { DUK_HEAPHDR_FLAG_REACHABLE, DUK_HEAPHDR_FLAG_TEMPROOT, DUK_HEAPHDR_FLAG_FINALIZABLE, DUK_HEAPHDR_FLAG_FINALIZED, DUK_HEAPHDR_FLAG_READONLY, 0 /* terminator */ }; #endif DUK_LOCAL const char * const duk__debug_getinfo_hstring_keys[] = { #if 0 "arridx", "symbol", "hidden", "reserved_word", "strict_reserved_word", "eval_or_arguments", #endif "extdata" /* NULL not needed here */ }; DUK_LOCAL duk_uint_t duk__debug_getinfo_hstring_masks[] = { #if 0 DUK_HSTRING_FLAG_ARRIDX, DUK_HSTRING_FLAG_SYMBOL, DUK_HSTRING_FLAG_HIDDEN, DUK_HSTRING_FLAG_RESERVED_WORD, DUK_HSTRING_FLAG_STRICT_RESERVED_WORD, DUK_HSTRING_FLAG_EVAL_OR_ARGUMENTS, #endif DUK_HSTRING_FLAG_EXTDATA, 0 /* terminator */ }; DUK_LOCAL const char * const duk__debug_getinfo_hobject_keys[] = { "extensible", "constructable", "callable", "boundfunc", "compfunc", "natfunc", "bufobj", "fastrefs", "array_part", "strict", "notail", "newenv", "namebinding", "createargs", "have_finalizer", "exotic_array", "exotic_stringobj", "exotic_arguments", "exotic_proxyobj", "special_call" /* NULL not needed here */ }; DUK_LOCAL duk_uint_t duk__debug_getinfo_hobject_masks[] = { DUK_HOBJECT_FLAG_EXTENSIBLE, DUK_HOBJECT_FLAG_CONSTRUCTABLE, DUK_HOBJECT_FLAG_CALLABLE, DUK_HOBJECT_FLAG_BOUNDFUNC, DUK_HOBJECT_FLAG_COMPFUNC, DUK_HOBJECT_FLAG_NATFUNC, DUK_HOBJECT_FLAG_BUFOBJ, DUK_HOBJECT_FLAG_FASTREFS, DUK_HOBJECT_FLAG_ARRAY_PART, DUK_HOBJECT_FLAG_STRICT, DUK_HOBJECT_FLAG_NOTAIL, DUK_HOBJECT_FLAG_NEWENV, DUK_HOBJECT_FLAG_NAMEBINDING, DUK_HOBJECT_FLAG_CREATEARGS, DUK_HOBJECT_FLAG_HAVE_FINALIZER, DUK_HOBJECT_FLAG_EXOTIC_ARRAY, DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ, DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS, DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ, DUK_HOBJECT_FLAG_SPECIAL_CALL, 0 /* terminator */ }; DUK_LOCAL const char * const duk__debug_getinfo_hbuffer_keys[] = { "dynamic", "external" /* NULL not needed here */ }; DUK_LOCAL duk_uint_t duk__debug_getinfo_hbuffer_masks[] = { DUK_HBUFFER_FLAG_DYNAMIC, DUK_HBUFFER_FLAG_EXTERNAL, 0 /* terminator */ }; DUK_LOCAL void duk__debug_getinfo_flags_key(duk_hthread *thr, const char *key) { duk_debug_write_uint(thr, 0); duk_debug_write_cstring(thr, key); } DUK_LOCAL void duk__debug_getinfo_prop_uint(duk_hthread *thr, const char *key, duk_uint_t val) { duk_debug_write_uint(thr, 0); duk_debug_write_cstring(thr, key); duk_debug_write_uint(thr, val); } DUK_LOCAL void duk__debug_getinfo_prop_int(duk_hthread *thr, const char *key, duk_int_t val) { duk_debug_write_uint(thr, 0); duk_debug_write_cstring(thr, key); duk_debug_write_int(thr, val); } DUK_LOCAL void duk__debug_getinfo_prop_bool(duk_hthread *thr, const char *key, duk_bool_t val) { duk_debug_write_uint(thr, 0); duk_debug_write_cstring(thr, key); duk_debug_write_boolean(thr, val); } DUK_LOCAL void duk__debug_getinfo_bitmask(duk_hthread *thr, const char * const * keys, duk_uint_t *masks, duk_uint_t flags) { const char *key; duk_uint_t mask; for (;;) { mask = *masks++; if (mask == 0) { break; } key = *keys++; DUK_ASSERT(key != NULL); DUK_DD(DUK_DDPRINT("inspect bitmask: key=%s, mask=0x%08lx, flags=0x%08lx", key, (unsigned long) mask, (unsigned long) flags)); duk__debug_getinfo_prop_bool(thr, key, flags & mask); } } /* Inspect a property using a virtual index into a conceptual property list * consisting of (1) all array part items from [0,a_size[ (even when above * .length) and (2) all entry part items from [0,e_next[. Unused slots are * indicated using dvalue 'unused'. */ DUK_LOCAL duk_bool_t duk__debug_getprop_index(duk_hthread *thr, duk_heap *heap, duk_hobject *h_obj, duk_uint_t idx) { duk_uint_t a_size; duk_tval *tv; duk_hstring *h_key; duk_hobject *h_getset; duk_uint_t flags; DUK_UNREF(heap); a_size = DUK_HOBJECT_GET_ASIZE(h_obj); if (idx < a_size) { duk_debug_write_uint(thr, DUK_PROPDESC_FLAGS_WEC); duk_debug_write_uint(thr, idx); tv = DUK_HOBJECT_A_GET_VALUE_PTR(heap, h_obj, idx); duk_debug_write_tval(thr, tv); return 1; } idx -= a_size; if (idx >= DUK_HOBJECT_GET_ENEXT(h_obj)) { return 0; } h_key = DUK_HOBJECT_E_GET_KEY(heap, h_obj, idx); if (h_key == NULL) { duk_debug_write_uint(thr, 0); duk_debug_write_null(thr); duk_debug_write_unused(thr); return 1; } flags = DUK_HOBJECT_E_GET_FLAGS(heap, h_obj, idx); if (DUK_HSTRING_HAS_SYMBOL(h_key)) { flags |= DUK_DBG_PROPFLAG_SYMBOL; } if (DUK_HSTRING_HAS_HIDDEN(h_key)) { flags |= DUK_DBG_PROPFLAG_HIDDEN; } duk_debug_write_uint(thr, flags); duk_debug_write_hstring(thr, h_key); if (flags & DUK_PROPDESC_FLAG_ACCESSOR) { h_getset = DUK_HOBJECT_E_GET_VALUE_GETTER(heap, h_obj, idx); if (h_getset) { duk_debug_write_hobject(thr, h_getset); } else { duk_debug_write_null(thr); } h_getset = DUK_HOBJECT_E_GET_VALUE_SETTER(heap, h_obj, idx); if (h_getset) { duk_debug_write_hobject(thr, h_getset); } else { duk_debug_write_null(thr); } } else { tv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(heap, h_obj, idx); duk_debug_write_tval(thr, tv); } return 1; } DUK_LOCAL void duk__debug_handle_get_heap_obj_info(duk_hthread *thr, duk_heap *heap) { duk_heaphdr *h; DUK_D(DUK_DPRINT("debug command GetHeapObjInfo")); DUK_UNREF(heap); DUK_ASSERT(sizeof(duk__debug_getinfo_hstring_keys) / sizeof(const char *) == sizeof(duk__debug_getinfo_hstring_masks) / sizeof(duk_uint_t) - 1); DUK_ASSERT(sizeof(duk__debug_getinfo_hobject_keys) / sizeof(const char *) == sizeof(duk__debug_getinfo_hobject_masks) / sizeof(duk_uint_t) - 1); DUK_ASSERT(sizeof(duk__debug_getinfo_hbuffer_keys) / sizeof(const char *) == sizeof(duk__debug_getinfo_hbuffer_masks) / sizeof(duk_uint_t) - 1); h = duk_debug_read_any_ptr(thr); if (!h) { duk_debug_write_error_eom(thr, DUK_DBG_ERR_UNKNOWN, "invalid target"); return; } duk_debug_write_reply(thr); /* As with all inspection code, we rely on the debug client providing * a valid, non-stale pointer: there's no portable way to safely * validate the pointer here. */ duk__debug_getinfo_flags_key(thr, "heapptr"); duk_debug_write_heapptr(thr, h); /* XXX: comes out as signed now */ duk__debug_getinfo_prop_uint(thr, "heaphdr_flags", (duk_uint_t) DUK_HEAPHDR_GET_FLAGS(h)); duk__debug_getinfo_prop_uint(thr, "heaphdr_type", (duk_uint_t) DUK_HEAPHDR_GET_TYPE(h)); #if defined(DUK_USE_REFERENCE_COUNTING) duk__debug_getinfo_prop_uint(thr, "refcount", (duk_uint_t) DUK_HEAPHDR_GET_REFCOUNT(h)); #endif #if 0 /* pruned */ duk__debug_getinfo_bitmask(thr, duk__debug_getinfo_heaphdr_keys, duk__debug_getinfo_heaphdr_masks, DUK_HEAPHDR_GET_FLAGS_RAW(h)); #endif switch (DUK_HEAPHDR_GET_TYPE(h)) { case DUK_HTYPE_STRING: { duk_hstring *h_str; h_str = (duk_hstring *) h; duk__debug_getinfo_bitmask(thr, duk__debug_getinfo_hstring_keys, duk__debug_getinfo_hstring_masks, DUK_HEAPHDR_GET_FLAGS_RAW(h)); duk__debug_getinfo_prop_uint(thr, "bytelen", (duk_uint_t) DUK_HSTRING_GET_BYTELEN(h_str)); duk__debug_getinfo_prop_uint(thr, "charlen", (duk_uint_t) DUK_HSTRING_GET_CHARLEN(h_str)); duk__debug_getinfo_prop_uint(thr, "hash", (duk_uint_t) DUK_HSTRING_GET_HASH(h_str)); duk__debug_getinfo_flags_key(thr, "data"); duk_debug_write_hstring(thr, h_str); break; } case DUK_HTYPE_OBJECT: { duk_hobject *h_obj; duk_hobject *h_proto; h_obj = (duk_hobject *) h; h_proto = DUK_HOBJECT_GET_PROTOTYPE(heap, h_obj); /* duk_hobject specific fields. */ duk__debug_getinfo_bitmask(thr, duk__debug_getinfo_hobject_keys, duk__debug_getinfo_hobject_masks, DUK_HEAPHDR_GET_FLAGS_RAW(h)); duk__debug_getinfo_prop_uint(thr, "class_number", DUK_HOBJECT_GET_CLASS_NUMBER(h_obj)); duk__debug_getinfo_flags_key(thr, "class_name"); duk_debug_write_hstring(thr, DUK_HOBJECT_GET_CLASS_STRING(heap, h_obj)); duk__debug_getinfo_flags_key(thr, "prototype"); if (h_proto != NULL) { duk_debug_write_hobject(thr, h_proto); } else { duk_debug_write_null(thr); } duk__debug_getinfo_flags_key(thr, "props"); duk_debug_write_pointer(thr, (void *) DUK_HOBJECT_GET_PROPS(heap, h_obj)); duk__debug_getinfo_prop_uint(thr, "e_size", (duk_uint_t) DUK_HOBJECT_GET_ESIZE(h_obj)); duk__debug_getinfo_prop_uint(thr, "e_next", (duk_uint_t) DUK_HOBJECT_GET_ENEXT(h_obj)); duk__debug_getinfo_prop_uint(thr, "a_size", (duk_uint_t) DUK_HOBJECT_GET_ASIZE(h_obj)); duk__debug_getinfo_prop_uint(thr, "h_size", (duk_uint_t) DUK_HOBJECT_GET_HSIZE(h_obj)); if (DUK_HOBJECT_IS_ARRAY(h_obj)) { duk_harray *h_arr; h_arr = (duk_harray *) h_obj; duk__debug_getinfo_prop_uint(thr, "length", (duk_uint_t) h_arr->length); duk__debug_getinfo_prop_bool(thr, "length_nonwritable", h_arr->length_nonwritable); } if (DUK_HOBJECT_IS_NATFUNC(h_obj)) { duk_hnatfunc *h_fun; h_fun = (duk_hnatfunc *) h_obj; duk__debug_getinfo_prop_int(thr, "nargs", h_fun->nargs); duk__debug_getinfo_prop_int(thr, "magic", h_fun->magic); duk__debug_getinfo_prop_bool(thr, "varargs", h_fun->magic == DUK_HNATFUNC_NARGS_VARARGS); /* Native function pointer may be different from a void pointer, * and we serialize it from memory directly now (no byte swapping etc). */ duk__debug_getinfo_flags_key(thr, "funcptr"); duk_debug_write_buffer(thr, (const char *) &h_fun->func, sizeof(h_fun->func)); } if (DUK_HOBJECT_IS_COMPFUNC(h_obj)) { duk_hcompfunc *h_fun; duk_hbuffer *h_buf; duk_hobject *h_lexenv; duk_hobject *h_varenv; h_fun = (duk_hcompfunc *) h_obj; duk__debug_getinfo_prop_int(thr, "nregs", h_fun->nregs); duk__debug_getinfo_prop_int(thr, "nargs", h_fun->nargs); duk__debug_getinfo_flags_key(thr, "lex_env"); h_lexenv = DUK_HCOMPFUNC_GET_LEXENV(thr->heap, h_fun); if (h_lexenv != NULL) { duk_debug_write_hobject(thr, h_lexenv); } else { duk_debug_write_null(thr); } duk__debug_getinfo_flags_key(thr, "var_env"); h_varenv = DUK_HCOMPFUNC_GET_VARENV(thr->heap, h_fun); if (h_varenv != NULL) { duk_debug_write_hobject(thr, h_varenv); } else { duk_debug_write_null(thr); } duk__debug_getinfo_prop_uint(thr, "start_line", h_fun->start_line); duk__debug_getinfo_prop_uint(thr, "end_line", h_fun->end_line); h_buf = (duk_hbuffer *) DUK_HCOMPFUNC_GET_DATA(thr->heap, h_fun); if (h_buf != NULL) { duk__debug_getinfo_flags_key(thr, "data"); duk_debug_write_heapptr(thr, (duk_heaphdr *) h_buf); } } if (DUK_HOBJECT_IS_BOUNDFUNC(h_obj)) { duk_hboundfunc *h_bfun; h_bfun = (duk_hboundfunc *) h_obj; duk__debug_getinfo_flags_key(thr, "target"); duk_debug_write_tval(thr, &h_bfun->target); duk__debug_getinfo_flags_key(thr, "this_binding"); duk_debug_write_tval(thr, &h_bfun->this_binding); duk__debug_getinfo_flags_key(thr, "nargs"); duk_debug_write_int(thr, h_bfun->nargs); /* h_bfun->args not exposed now */ } if (DUK_HOBJECT_IS_THREAD(h_obj)) { /* XXX: Currently no inspection of threads, e.g. value stack, call * stack, catch stack, etc. */ duk_hthread *h_thr; h_thr = (duk_hthread *) h_obj; DUK_UNREF(h_thr); } if (DUK_HOBJECT_IS_DECENV(h_obj)) { duk_hdecenv *h_env; h_env = (duk_hdecenv *) h_obj; duk__debug_getinfo_flags_key(thr, "thread"); duk_debug_write_heapptr(thr, (duk_heaphdr *) (h_env->thread)); duk__debug_getinfo_flags_key(thr, "varmap"); duk_debug_write_heapptr(thr, (duk_heaphdr *) (h_env->varmap)); duk__debug_getinfo_prop_uint(thr, "regbase", (duk_uint_t) h_env->regbase_byteoff); } if (DUK_HOBJECT_IS_OBJENV(h_obj)) { duk_hobjenv *h_env; h_env = (duk_hobjenv *) h_obj; duk__debug_getinfo_flags_key(thr, "target"); duk_debug_write_heapptr(thr, (duk_heaphdr *) (h_env->target)); duk__debug_getinfo_prop_bool(thr, "has_this", h_env->has_this); } #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) if (DUK_HOBJECT_IS_BUFOBJ(h_obj)) { duk_hbufobj *h_bufobj; h_bufobj = (duk_hbufobj *) h_obj; duk__debug_getinfo_prop_uint(thr, "slice_offset", h_bufobj->offset); duk__debug_getinfo_prop_uint(thr, "slice_length", h_bufobj->length); duk__debug_getinfo_prop_uint(thr, "elem_shift", (duk_uint_t) h_bufobj->shift); duk__debug_getinfo_prop_uint(thr, "elem_type", (duk_uint_t) h_bufobj->elem_type); duk__debug_getinfo_prop_bool(thr, "is_typedarray", (duk_uint_t) h_bufobj->is_typedarray); if (h_bufobj->buf != NULL) { duk__debug_getinfo_flags_key(thr, "buffer"); duk_debug_write_heapptr(thr, (duk_heaphdr *) h_bufobj->buf); } } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ break; } case DUK_HTYPE_BUFFER: { duk_hbuffer *h_buf; h_buf = (duk_hbuffer *) h; duk__debug_getinfo_bitmask(thr, duk__debug_getinfo_hbuffer_keys, duk__debug_getinfo_hbuffer_masks, DUK_HEAPHDR_GET_FLAGS_RAW(h)); duk__debug_getinfo_prop_uint(thr, "size", (duk_uint_t) DUK_HBUFFER_GET_SIZE(h_buf)); duk__debug_getinfo_flags_key(thr, "dataptr"); duk_debug_write_pointer(thr, (void *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_buf)); duk__debug_getinfo_flags_key(thr, "data"); duk_debug_write_hbuffer(thr, h_buf); /* tolerates NULL h_buf */ break; } default: { /* Since we already started writing the reply, just emit nothing. */ DUK_D(DUK_DPRINT("inspect target pointer has invalid heaphdr type")); } } duk_debug_write_eom(thr); } DUK_LOCAL void duk__debug_handle_get_obj_prop_desc(duk_hthread *thr, duk_heap *heap) { duk_heaphdr *h; duk_hobject *h_obj; duk_hstring *h_key; duk_propdesc desc; DUK_D(DUK_DPRINT("debug command GetObjPropDesc")); DUK_UNREF(heap); h = duk_debug_read_any_ptr(thr); if (!h) { duk_debug_write_error_eom(thr, DUK_DBG_ERR_UNKNOWN, "invalid target"); return; } h_key = duk_debug_read_hstring(thr); if (h == NULL || DUK_HEAPHDR_GET_TYPE(h) != DUK_HTYPE_OBJECT || h_key == NULL) { goto fail_args; } h_obj = (duk_hobject *) h; if (duk_hobject_get_own_propdesc(thr, h_obj, h_key, &desc, 0 /*flags*/)) { duk_int_t virtual_idx; duk_bool_t rc; /* To use the shared helper need the virtual index. */ DUK_ASSERT(desc.e_idx >= 0 || desc.a_idx >= 0); virtual_idx = (desc.a_idx >= 0 ? desc.a_idx : (duk_int_t) DUK_HOBJECT_GET_ASIZE(h_obj) + desc.e_idx); duk_debug_write_reply(thr); rc = duk__debug_getprop_index(thr, heap, h_obj, (duk_uint_t) virtual_idx); DUK_ASSERT(rc == 1); DUK_UNREF(rc); duk_debug_write_eom(thr); } else { duk_debug_write_error_eom(thr, DUK_DBG_ERR_NOTFOUND, "not found"); } return; fail_args: duk_debug_write_error_eom(thr, DUK_DBG_ERR_UNKNOWN, "invalid args"); } DUK_LOCAL void duk__debug_handle_get_obj_prop_desc_range(duk_hthread *thr, duk_heap *heap) { duk_heaphdr *h; duk_hobject *h_obj; duk_uint_t idx, idx_start, idx_end; DUK_D(DUK_DPRINT("debug command GetObjPropDescRange")); DUK_UNREF(heap); h = duk_debug_read_any_ptr(thr); idx_start = (duk_uint_t) duk_debug_read_int(thr); idx_end = (duk_uint_t) duk_debug_read_int(thr); if (h == NULL || DUK_HEAPHDR_GET_TYPE(h) != DUK_HTYPE_OBJECT) { goto fail_args; } h_obj = (duk_hobject *) h; /* The index range space is conceptually the array part followed by the * entry part. Unlike normal enumeration all slots are exposed here as * is and return 'unused' if the slots are not in active use. In particular * the array part is included for the full a_size regardless of what the * array .length is. */ duk_debug_write_reply(thr); for (idx = idx_start; idx < idx_end; idx++) { if (!duk__debug_getprop_index(thr, heap, h_obj, idx)) { break; } } duk_debug_write_eom(thr); return; fail_args: duk_debug_write_error_eom(thr, DUK_DBG_ERR_UNKNOWN, "invalid args"); } #endif /* DUK_USE_DEBUGGER_INSPECT */ /* * Process incoming debug requests * * Individual request handlers can push temporaries on the value stack and * rely on duk__debug_process_message() to restore the value stack top * automatically. */ /* Process one debug message. Automatically restore value stack top to its * entry value, so that individual message handlers don't need exact value * stack handling which is convenient. */ DUK_LOCAL void duk__debug_process_message(duk_hthread *thr) { duk_heap *heap; duk_uint8_t x; duk_int32_t cmd; duk_idx_t entry_top; DUK_ASSERT(thr != NULL); heap = thr->heap; DUK_ASSERT(heap != NULL); entry_top = duk_get_top(thr); x = duk_debug_read_byte(thr); switch (x) { case DUK_DBG_IB_REQUEST: { cmd = duk_debug_read_int(thr); switch (cmd) { case DUK_DBG_CMD_BASICINFO: { duk__debug_handle_basic_info(thr, heap); break; } case DUK_DBG_CMD_TRIGGERSTATUS: { duk__debug_handle_trigger_status(thr, heap); break; } case DUK_DBG_CMD_PAUSE: { duk__debug_handle_pause(thr, heap); break; } case DUK_DBG_CMD_RESUME: { duk__debug_handle_resume(thr, heap); break; } case DUK_DBG_CMD_STEPINTO: case DUK_DBG_CMD_STEPOVER: case DUK_DBG_CMD_STEPOUT: { duk__debug_handle_step(thr, heap, cmd); break; } case DUK_DBG_CMD_LISTBREAK: { duk__debug_handle_list_break(thr, heap); break; } case DUK_DBG_CMD_ADDBREAK: { duk__debug_handle_add_break(thr, heap); break; } case DUK_DBG_CMD_DELBREAK: { duk__debug_handle_del_break(thr, heap); break; } case DUK_DBG_CMD_GETVAR: { duk__debug_handle_get_var(thr, heap); break; } case DUK_DBG_CMD_PUTVAR: { duk__debug_handle_put_var(thr, heap); break; } case DUK_DBG_CMD_GETCALLSTACK: { duk__debug_handle_get_call_stack(thr, heap); break; } case DUK_DBG_CMD_GETLOCALS: { duk__debug_handle_get_locals(thr, heap); break; } case DUK_DBG_CMD_EVAL: { duk__debug_handle_eval(thr, heap); break; } case DUK_DBG_CMD_DETACH: { /* The actual detached_cb call is postponed to message loop so * we don't need any special precautions here (just skip to EOM * on the already closed connection). */ duk__debug_handle_detach(thr, heap); break; } #if defined(DUK_USE_DEBUGGER_DUMPHEAP) case DUK_DBG_CMD_DUMPHEAP: { duk__debug_handle_dump_heap(thr, heap); break; } #endif /* DUK_USE_DEBUGGER_DUMPHEAP */ case DUK_DBG_CMD_GETBYTECODE: { duk__debug_handle_get_bytecode(thr, heap); break; } case DUK_DBG_CMD_APPREQUEST: { duk__debug_handle_apprequest(thr, heap); break; } #if defined(DUK_USE_DEBUGGER_INSPECT) case DUK_DBG_CMD_GETHEAPOBJINFO: { duk__debug_handle_get_heap_obj_info(thr, heap); break; } case DUK_DBG_CMD_GETOBJPROPDESC: { duk__debug_handle_get_obj_prop_desc(thr, heap); break; } case DUK_DBG_CMD_GETOBJPROPDESCRANGE: { duk__debug_handle_get_obj_prop_desc_range(thr, heap); break; } #endif /* DUK_USE_DEBUGGER_INSPECT */ default: { DUK_D(DUK_DPRINT("debug command unsupported: %d", (int) cmd)); duk_debug_write_error_eom(thr, DUK_DBG_ERR_UNSUPPORTED, "unsupported command"); } } /* switch cmd */ break; } case DUK_DBG_IB_REPLY: { DUK_D(DUK_DPRINT("debug reply, skipping")); break; } case DUK_DBG_IB_ERROR: { DUK_D(DUK_DPRINT("debug error, skipping")); break; } case DUK_DBG_IB_NOTIFY: { DUK_D(DUK_DPRINT("debug notify, skipping")); break; } default: { DUK_D(DUK_DPRINT("invalid initial byte, drop connection: %d", (int) x)); goto fail; } } /* switch initial byte */ DUK_ASSERT(duk_get_top(thr) >= entry_top); duk_set_top(thr, entry_top); duk__debug_skip_to_eom(thr); return; fail: DUK_ASSERT(duk_get_top(thr) >= entry_top); duk_set_top(thr, entry_top); DUK__SET_CONN_BROKEN(thr, 1); return; } DUK_LOCAL void duk__check_resend_status(duk_hthread *thr) { if (thr->heap->dbg_read_cb != NULL && thr->heap->dbg_state_dirty) { duk_debug_send_status(thr); thr->heap->dbg_state_dirty = 0; } } DUK_INTERNAL duk_bool_t duk_debug_process_messages(duk_hthread *thr, duk_bool_t no_block) { #if defined(DUK_USE_ASSERTIONS) duk_idx_t entry_top; #endif duk_bool_t retval = 0; DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->heap != NULL); #if defined(DUK_USE_ASSERTIONS) entry_top = duk_get_top(thr); #endif DUK_D(DUK_DPRINT("process debug messages: read_cb=%s, no_block=%ld, detaching=%ld, processing=%ld", thr->heap->dbg_read_cb ? "not NULL" : "NULL", (long) no_block, (long) thr->heap->dbg_detaching, (long) thr->heap->dbg_processing)); DUK_DD(DUK_DDPRINT("top at entry: %ld", (long) duk_get_top(thr))); /* thr->heap->dbg_detaching may be != 0 if a debugger write outside * the message loop caused a transport error and detach1() to run. */ DUK_ASSERT(thr->heap->dbg_detaching == 0 || thr->heap->dbg_detaching == 1); DUK_ASSERT(thr->heap->dbg_processing == 0); thr->heap->dbg_processing = 1; /* Ensure dirty state causes a Status even if never process any * messages. This is expected by the bytecode executor when in * the running state. */ duk__check_resend_status(thr); for (;;) { /* Process messages until we're no longer paused or we peek * and see there's nothing to read right now. */ DUK_DD(DUK_DDPRINT("top at loop top: %ld", (long) duk_get_top(thr))); DUK_ASSERT(thr->heap->dbg_processing == 1); while (thr->heap->dbg_read_cb == NULL && thr->heap->dbg_detaching) { /* Detach is pending; can be triggered from outside the * debugger loop (e.g. Status notify write error) or by * previous message handling. Call detached callback * here, in a controlled state, to ensure a possible * reattach inside the detached_cb is handled correctly. * * Recheck for detach in a while loop: an immediate * reattach involves a call to duk_debugger_attach() * which writes a debugger handshake line immediately * inside the API call. If the transport write fails * for that handshake, we can immediately end up in a * "transport broken, detaching" case several times here. * Loop back until we're either cleanly attached or * fully detached. * * NOTE: Reset dbg_processing = 1 forcibly, in case we * re-attached; duk_debugger_attach() sets dbg_processing * to 0 at the moment. */ DUK_D(DUK_DPRINT("detach pending (dbg_read_cb == NULL, dbg_detaching != 0), call detach2")); duk__debug_do_detach2(thr->heap); thr->heap->dbg_processing = 1; /* may be set to 0 by duk_debugger_attach() inside callback */ DUK_D(DUK_DPRINT("after detach2 (and possible reattach): dbg_read_cb=%s, dbg_detaching=%ld", thr->heap->dbg_read_cb ? "not NULL" : "NULL", (long) thr->heap->dbg_detaching)); } DUK_ASSERT(thr->heap->dbg_detaching == 0); /* true even with reattach */ DUK_ASSERT(thr->heap->dbg_processing == 1); /* even after a detach and possible reattach */ if (thr->heap->dbg_read_cb == NULL) { DUK_D(DUK_DPRINT("debug connection broken (and not detaching), stop processing messages")); break; } if (!DUK_HEAP_HAS_DEBUGGER_PAUSED(thr->heap) || no_block) { if (!duk_debug_read_peek(thr)) { /* Note: peek cannot currently trigger a detach * so the dbg_detaching == 0 assert outside the * loop is correct. */ DUK_D(DUK_DPRINT("processing debug message, peek indicated no data, stop processing messages")); break; } DUK_D(DUK_DPRINT("processing debug message, peek indicated there is data, handle it")); } else { DUK_D(DUK_DPRINT("paused, process debug message, blocking if necessary")); } duk__check_resend_status(thr); duk__debug_process_message(thr); duk__check_resend_status(thr); retval = 1; /* processed one or more messages */ } DUK_ASSERT(thr->heap->dbg_detaching == 0); DUK_ASSERT(thr->heap->dbg_processing == 1); thr->heap->dbg_processing = 0; /* As an initial implementation, read flush after exiting the message * loop. If transport is broken, this is a no-op (with debug logs). */ duk_debug_read_flush(thr); /* this cannot initiate a detach */ DUK_ASSERT(thr->heap->dbg_detaching == 0); DUK_DD(DUK_DDPRINT("top at exit: %ld", (long) duk_get_top(thr))); #if defined(DUK_USE_ASSERTIONS) /* Easy to get wrong, so assert for it. */ DUK_ASSERT(entry_top == duk_get_top(thr)); #endif return retval; } /* * Halt execution helper */ /* Halt execution and enter a debugger message loop until execution is resumed * by the client. PC for the current activation may be temporarily decremented * so that the "current" instruction will be shown by the client. This helper * is callable from anywhere, also outside bytecode executor. */ DUK_INTERNAL void duk_debug_halt_execution(duk_hthread *thr, duk_bool_t use_prev_pc) { duk_activation *act; duk_hcompfunc *fun; duk_instr_t *old_pc = NULL; DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->heap != NULL); DUK_ASSERT(duk_debug_is_attached(thr->heap)); DUK_ASSERT(thr->heap->dbg_processing == 0); DUK_ASSERT(!duk_debug_is_paused(thr->heap)); duk_debug_set_paused(thr->heap); act = thr->callstack_curr; /* NOTE: act may be NULL if an error is thrown outside of any activation, * which may happen in the case of, e.g. syntax errors. */ /* Decrement PC if that was requested, this requires a PC sync. */ if (act != NULL) { duk_hthread_sync_currpc(thr); old_pc = act->curr_pc; fun = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act); /* Short circuit if is safe: if act->curr_pc != NULL, 'fun' is * guaranteed to be a non-NULL Ecmascript function. */ DUK_ASSERT(act->curr_pc == NULL || (fun != NULL && DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) fun))); if (use_prev_pc && act->curr_pc != NULL && act->curr_pc > DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, fun)) { act->curr_pc--; } } /* Process debug messages until we are no longer paused. */ /* NOTE: This is a bit fragile. It's important to ensure that * duk_debug_process_messages() never throws an error or * act->curr_pc will never be reset. */ thr->heap->dbg_state_dirty = 1; while (DUK_HEAP_HAS_DEBUGGER_PAUSED(thr->heap)) { DUK_ASSERT(duk_debug_is_attached(thr->heap)); DUK_ASSERT(thr->heap->dbg_processing == 0); duk_debug_process_messages(thr, 0 /*no_block*/); } /* XXX: Decrementing and restoring act->curr_pc works now, but if the * debugger message loop gains the ability to adjust the current PC * (e.g. a forced jump) restoring the PC here will break. Another * approach would be to use a state flag for the "decrement 1 from * topmost activation's PC" and take it into account whenever dealing * with PC values. */ if (act != NULL) { act->curr_pc = old_pc; /* restore PC */ } } /* * Breakpoint management */ DUK_INTERNAL duk_small_int_t duk_debug_add_breakpoint(duk_hthread *thr, duk_hstring *filename, duk_uint32_t line) { duk_heap *heap; duk_breakpoint *b; /* Caller must trigger recomputation of active breakpoint list. To * ensure stale values are not used if that doesn't happen, clear the * active breakpoint list here. */ DUK_ASSERT(thr != NULL); DUK_ASSERT(filename != NULL); heap = thr->heap; DUK_ASSERT(heap != NULL); if (heap->dbg_breakpoint_count >= DUK_HEAP_MAX_BREAKPOINTS) { DUK_D(DUK_DPRINT("failed to add breakpoint for %O:%ld, all breakpoint slots used", (duk_heaphdr *) filename, (long) line)); return -1; } heap->dbg_breakpoints_active[0] = (duk_breakpoint *) NULL; b = heap->dbg_breakpoints + (heap->dbg_breakpoint_count++); b->filename = filename; b->line = line; DUK_HSTRING_INCREF(thr, filename); return (duk_small_int_t) (heap->dbg_breakpoint_count - 1); /* index */ } DUK_INTERNAL duk_bool_t duk_debug_remove_breakpoint(duk_hthread *thr, duk_small_uint_t breakpoint_index) { duk_heap *heap; duk_hstring *h; duk_breakpoint *b; duk_size_t move_size; /* Caller must trigger recomputation of active breakpoint list. To * ensure stale values are not used if that doesn't happen, clear the * active breakpoint list here. */ DUK_ASSERT(thr != NULL); heap = thr->heap; DUK_ASSERT(heap != NULL); DUK_ASSERT(duk_debug_is_attached(thr->heap)); DUK_ASSERT_DISABLE(breakpoint_index >= 0); /* unsigned */ if (breakpoint_index >= heap->dbg_breakpoint_count) { DUK_D(DUK_DPRINT("invalid breakpoint index: %ld", (long) breakpoint_index)); return 0; } b = heap->dbg_breakpoints + breakpoint_index; h = b->filename; DUK_ASSERT(h != NULL); move_size = sizeof(duk_breakpoint) * (heap->dbg_breakpoint_count - breakpoint_index - 1); if (move_size > 0) { DUK_MEMMOVE((void *) b, (const void *) (b + 1), (size_t) move_size); } heap->dbg_breakpoint_count--; heap->dbg_breakpoints_active[0] = (duk_breakpoint *) NULL; DUK_HSTRING_DECREF(thr, h); /* side effects */ DUK_UNREF(h); /* w/o refcounting */ /* Breakpoint entries above the used area are left as garbage. */ return 1; } /* * Misc state management */ DUK_INTERNAL duk_bool_t duk_debug_is_attached(duk_heap *heap) { return (heap->dbg_read_cb != NULL); } DUK_INTERNAL duk_bool_t duk_debug_is_paused(duk_heap *heap) { return (DUK_HEAP_HAS_DEBUGGER_PAUSED(heap) != 0); } DUK_INTERNAL void duk_debug_set_paused(duk_heap *heap) { if (duk_debug_is_paused(heap)) { DUK_D(DUK_DPRINT("trying to set paused state when already paused, ignoring")); } else { DUK_HEAP_SET_DEBUGGER_PAUSED(heap); heap->dbg_state_dirty = 1; duk_debug_clear_pause_state(heap); DUK_ASSERT(heap->ms_running == 0); /* debugger can't be triggered within mark-and-sweep */ heap->ms_running = 1; /* prevent mark-and-sweep, prevent refzero queueing */ heap->ms_prevent_count++; DUK_ASSERT(heap->ms_prevent_count != 0); /* Wrap. */ DUK_ASSERT(heap->heap_thread != NULL); } } DUK_INTERNAL void duk_debug_clear_paused(duk_heap *heap) { if (duk_debug_is_paused(heap)) { DUK_HEAP_CLEAR_DEBUGGER_PAUSED(heap); heap->dbg_state_dirty = 1; duk_debug_clear_pause_state(heap); DUK_ASSERT(heap->ms_running == 1); DUK_ASSERT(heap->ms_prevent_count > 0); heap->ms_prevent_count--; heap->ms_running = 0; DUK_ASSERT(heap->heap_thread != NULL); } else { DUK_D(DUK_DPRINT("trying to clear paused state when not paused, ignoring")); } } DUK_INTERNAL void duk_debug_clear_pause_state(duk_heap *heap) { heap->dbg_pause_flags = 0; heap->dbg_pause_act = NULL; heap->dbg_pause_startline = 0; } #else /* DUK_USE_DEBUGGER_SUPPORT */ /* No debugger support. */ #endif /* DUK_USE_DEBUGGER_SUPPORT */ /* automatic undefs */ #undef DUK__DBG_TPORT_ENTER #undef DUK__DBG_TPORT_EXIT #undef DUK__SET_CONN_BROKEN #line 1 "duk_error_augment.c" /* * Augmenting errors at their creation site and their throw site. * * When errors are created, traceback data is added by built-in code * and a user error handler (if defined) can process or replace the * error. Similarly, when errors are thrown, a user error handler * (if defined) can process or replace the error. * * Augmentation and other processing at error creation time is nice * because an error is only created once, but it may be thrown and * rethrown multiple times. User error handler registered for processing * an error at its throw site must be careful to handle rethrowing in * a useful manner. * * Error augmentation may throw an internal error (e.g. alloc error). * * Ecmascript allows throwing any values, so all values cannot be * augmented. Currently, the built-in augmentation at error creation * only augments error values which are Error instances (= have the * built-in Error.prototype in their prototype chain) and are also * extensible. User error handlers have no limitations in this respect. */ /* #include duk_internal.h -> already included */ /* * Helper for calling a user error handler. * * 'thr' must be the currently active thread; the error handler is called * in its context. The valstack of 'thr' must have the error value on * top, and will be replaced by another error value based on the return * value of the error handler. * * The helper calls duk_handle_call() recursively in protected mode. * Before that call happens, no longjmps should happen; as a consequence, * we must assume that the valstack contains enough temporary space for * arguments and such. * * While the error handler runs, any errors thrown will not trigger a * recursive error handler call (this is implemented using a heap level * flag which will "follow" through any coroutines resumed inside the * error handler). If the error handler is not callable or throws an * error, the resulting error replaces the original error (for Duktape * internal errors, duk_error_throw.c further substitutes this error with * a DoubleError which is not ideal). This would be easy to change and * even signal to the caller. * * The user error handler is stored in 'Duktape.errCreate' or * 'Duktape.errThrow' depending on whether we're augmenting the error at * creation or throw time. There are several alternatives to this approach, * see doc/error-objects.rst for discussion. * * Note: since further longjmp()s may occur while calling the error handler * (for many reasons, e.g. a labeled 'break' inside the handler), the * caller can make no assumptions on the thr->heap->lj state after the * call (this affects especially duk_error_throw.c). This is not an issue * as long as the caller writes to the lj state only after the error handler * finishes. */ #if defined(DUK_USE_ERRTHROW) || defined(DUK_USE_ERRCREATE) DUK_LOCAL void duk__err_augment_user(duk_hthread *thr, duk_small_uint_t stridx_cb) { duk_tval *tv_hnd; duk_int_t rc; DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->heap != NULL); DUK_ASSERT_STRIDX_VALID(stridx_cb); if (thr->heap->augmenting_error) { DUK_D(DUK_DPRINT("recursive call to error augmentation, ignore")); return; } /* * Check whether or not we have an error handler. * * We must be careful of not triggering an error when looking up the * property. For instance, if the property is a getter, we don't want * to call it, only plain values are allowed. The value, if it exists, * is not checked. If the value is not a function, a TypeError happens * when it is called and that error replaces the original one. */ DUK_ASSERT_VALSTACK_SPACE(thr, 4); /* 3 entries actually needed below */ /* [ ... errval ] */ if (thr->builtins[DUK_BIDX_DUKTAPE] == NULL) { /* When creating built-ins, some of the built-ins may not be set * and we want to tolerate that when throwing errors. */ DUK_DD(DUK_DDPRINT("error occurred when DUK_BIDX_DUKTAPE is NULL, ignoring")); return; } tv_hnd = duk_hobject_find_existing_entry_tval_ptr(thr->heap, thr->builtins[DUK_BIDX_DUKTAPE], DUK_HTHREAD_GET_STRING(thr, stridx_cb)); if (tv_hnd == NULL) { DUK_DD(DUK_DDPRINT("error handler does not exist or is not a plain value: %!T", (duk_tval *) tv_hnd)); return; } DUK_DDD(DUK_DDDPRINT("error handler dump (callability not checked): %!T", (duk_tval *) tv_hnd)); duk_push_tval(thr, tv_hnd); /* [ ... errval errhandler ] */ duk_insert(thr, -2); /* -> [ ... errhandler errval ] */ duk_push_undefined(thr); duk_insert(thr, -2); /* -> [ ... errhandler undefined(= this) errval ] */ /* [ ... errhandler undefined errval ] */ /* * heap->augmenting_error prevents recursive re-entry and also causes * call handling to use a larger (but not unbounded) call stack limit * for the duration of error augmentation. * * We ignore errors now: a success return and an error value both * replace the original error value. (This would be easy to change.) */ DUK_ASSERT(thr->heap->augmenting_error == 0); thr->heap->augmenting_error = 1; rc = duk_pcall_method(thr, 1); DUK_UNREF(rc); /* no need to check now: both success and error are OK */ DUK_ASSERT(thr->heap->augmenting_error == 1); thr->heap->augmenting_error = 0; /* [ ... errval ] */ } #endif /* DUK_USE_ERRTHROW || DUK_USE_ERRCREATE */ /* * Add ._Tracedata to an error on the stack top. */ #if defined(DUK_USE_TRACEBACKS) DUK_LOCAL void duk__add_traceback(duk_hthread *thr, duk_hthread *thr_callstack, const char *c_filename, duk_int_t c_line, duk_small_uint_t flags) { duk_activation *act; duk_int_t depth; duk_int_t arr_size; duk_tval *tv; duk_hstring *s; duk_uint32_t u32; duk_double_t d; DUK_ASSERT(thr != NULL); DUK_ASSERT(thr_callstack != NULL); /* [ ... error ] */ /* * The traceback format is pretty arcane in an attempt to keep it compact * and cheap to create. It may change arbitrarily from version to version. * It should be decoded/accessed through version specific accessors only. * * See doc/error-objects.rst. */ DUK_DDD(DUK_DDDPRINT("adding traceback to object: %!T", (duk_tval *) duk_get_tval(thr, -1))); /* Preallocate array to correct size, so that we can just write out * the _Tracedata values into the array part. */ act = thr->callstack_curr; depth = DUK_USE_TRACEBACK_DEPTH; DUK_ASSERT(thr_callstack->callstack_top <= DUK_INT_MAX); /* callstack limits */ if (depth > (duk_int_t) thr_callstack->callstack_top) { depth = (duk_int_t) thr_callstack->callstack_top; } if (depth > 0) { if (flags & DUK_AUGMENT_FLAG_SKIP_ONE) { DUK_ASSERT(act != NULL); act = act->parent; depth--; } } arr_size = depth * 2; if (thr->compile_ctx != NULL && thr->compile_ctx->h_filename != NULL) { arr_size += 2; } if (c_filename) { /* We need the C filename to be interned before getting the * array part pointer to avoid any GC interference while the * array part is populated. */ duk_push_string(thr, c_filename); arr_size += 2; } /* XXX: uninitialized would be OK */ DUK_D(DUK_DPRINT("preallocated _Tracedata to %ld items", (long) arr_size)); tv = duk_push_harray_with_size_outptr(thr, (duk_uint32_t) arr_size); DUK_ASSERT(arr_size == 0 || tv != NULL); /* Compiler SyntaxErrors (and other errors) come first, and are * blamed by default (not flagged "noblame"). */ if (thr->compile_ctx != NULL && thr->compile_ctx->h_filename != NULL) { s = thr->compile_ctx->h_filename; DUK_TVAL_SET_STRING(tv, s); DUK_HSTRING_INCREF(thr, s); tv++; u32 = (duk_uint32_t) thr->compile_ctx->curr_token.start_line; /* (flags<<32) + (line), flags = 0 */ DUK_TVAL_SET_U32(tv, u32); tv++; } /* Filename/line from C macros (__FILE__, __LINE__) are added as an * entry with a special format: (string, number). The number contains * the line and flags. */ /* [ ... error c_filename? arr ] */ if (c_filename) { DUK_ASSERT(DUK_TVAL_IS_STRING(thr->valstack_top - 2)); s = DUK_TVAL_GET_STRING(thr->valstack_top - 2); /* interned c_filename */ DUK_ASSERT(s != NULL); DUK_TVAL_SET_STRING(tv, s); DUK_HSTRING_INCREF(thr, s); tv++; d = ((flags & DUK_AUGMENT_FLAG_NOBLAME_FILELINE) ? ((duk_double_t) DUK_TB_FLAG_NOBLAME_FILELINE) * DUK_DOUBLE_2TO32 : 0.0) + (duk_double_t) c_line; DUK_TVAL_SET_DOUBLE(tv, d); tv++; } /* Traceback depth doesn't take into account the filename/line * special handling above (intentional). */ for (; depth-- > 0; act = act->parent) { duk_uint32_t pc; duk_tval *tv_src; /* [... arr] */ DUK_ASSERT(act != NULL); /* depth check above, assumes book-keeping is correct */ DUK_ASSERT_DISABLE(act->pc >= 0); /* unsigned */ /* Add function object. */ tv_src = &act->tv_func; /* object (function) or lightfunc */ DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv_src) || DUK_TVAL_IS_LIGHTFUNC(tv_src)); DUK_TVAL_SET_TVAL(tv, tv_src); DUK_TVAL_INCREF(thr, tv); tv++; /* Add a number containing: pc, activation flags. * * PC points to next instruction, find offending PC. Note that * PC == 0 for native code. */ pc = (duk_uint32_t) duk_hthread_get_act_prev_pc(thr_callstack, act); DUK_ASSERT_DISABLE(pc >= 0); /* unsigned */ DUK_ASSERT((duk_double_t) pc < DUK_DOUBLE_2TO32); /* assume PC is at most 32 bits and non-negative */ d = ((duk_double_t) act->flags) * DUK_DOUBLE_2TO32 + (duk_double_t) pc; DUK_TVAL_SET_DOUBLE(tv, d); tv++; } #if defined(DUK_USE_ASSERTIONS) { duk_harray *a; a = (duk_harray *) duk_known_hobject(thr, -1); DUK_ASSERT(a != NULL); DUK_ASSERT((duk_uint32_t) (tv - DUK_HOBJECT_A_GET_BASE(thr->heap, (duk_hobject *) a)) == a->length); DUK_ASSERT(a->length == (duk_uint32_t) arr_size); } #endif /* [ ... error c_filename? arr ] */ if (c_filename) { duk_remove_m2(thr); } /* [ ... error arr ] */ duk_xdef_prop_stridx_short_wec(thr, -2, DUK_STRIDX_INT_TRACEDATA); /* -> [ ... error ] */ } #endif /* DUK_USE_TRACEBACKS */ /* * Add .fileName and .lineNumber to an error on the stack top. */ #if defined(DUK_USE_AUGMENT_ERROR_CREATE) && !defined(DUK_USE_TRACEBACKS) DUK_LOCAL void duk__add_fileline(duk_hthread *thr, duk_hthread *thr_callstack, const char *c_filename, duk_int_t c_line, duk_small_uint_t flags) { #if defined(DUK_USE_ASSERTIONS) duk_int_t entry_top; #endif #if defined(DUK_USE_ASSERTIONS) entry_top = duk_get_top(thr); #endif /* * If tracebacks are disabled, 'fileName' and 'lineNumber' are added * as plain own properties. Since Error.prototype has accessors of * the same name, we need to define own properties directly (cannot * just use e.g. duk_put_prop_stridx). Existing properties are not * overwritten in case they already exist. */ if (thr->compile_ctx != NULL && thr->compile_ctx->h_filename != NULL) { /* Compiler SyntaxError (or other error) gets the primary blame. * Currently no flag to prevent blaming. */ duk_push_uint(thr, (duk_uint_t) thr->compile_ctx->curr_token.start_line); duk_push_hstring(thr, thr->compile_ctx->h_filename); } else if (c_filename && (flags & DUK_AUGMENT_FLAG_NOBLAME_FILELINE) == 0) { /* C call site gets blamed next, unless flagged not to do so. * XXX: file/line is disabled in minimal builds, so disable this * too when appropriate. */ duk_push_int(thr, c_line); duk_push_string(thr, c_filename); } else { /* Finally, blame the innermost callstack entry which has a * .fileName property. */ duk_small_uint_t depth; duk_uint32_t ecma_line; duk_activation *act; DUK_ASSERT(thr_callstack->callstack_top <= DUK_INT_MAX); /* callstack limits */ depth = DUK_USE_TRACEBACK_DEPTH; if (depth > thr_callstack->callstack_top) { depth = thr_callstack->callstack_top; } for (act = thr_callstack->callstack_curr; depth-- > 0; act = act->parent) { duk_hobject *func; duk_uint32_t pc; DUK_ASSERT(act != NULL); func = DUK_ACT_GET_FUNC(act); if (func == NULL) { /* Lightfunc, not blamed now. */ continue; } /* PC points to next instruction, find offending PC, * PC == 0 for native code. */ pc = duk_hthread_get_act_prev_pc(thr, act); /* thr argument only used for thr->heap, so specific thread doesn't matter */ DUK_UNREF(pc); DUK_ASSERT_DISABLE(pc >= 0); /* unsigned */ DUK_ASSERT((duk_double_t) pc < DUK_DOUBLE_2TO32); /* assume PC is at most 32 bits and non-negative */ act = NULL; /* invalidated by pushes, so get out of the way */ duk_push_hobject(thr, func); /* [ ... error func ] */ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_FILE_NAME); if (!duk_is_string_notsymbol(thr, -1)) { duk_pop_2(thr); continue; } /* [ ... error func fileName ] */ ecma_line = 0; #if defined(DUK_USE_PC2LINE) if (DUK_HOBJECT_IS_COMPFUNC(func)) { ecma_line = duk_hobject_pc2line_query(thr, -2, (duk_uint_fast32_t) pc); } else { /* Native function, no relevant lineNumber. */ } #endif /* DUK_USE_PC2LINE */ duk_push_u32(thr, ecma_line); /* [ ... error func fileName lineNumber ] */ duk_replace(thr, -3); /* [ ... error lineNumber fileName ] */ goto define_props; } /* No activation matches, use undefined for both .fileName and * .lineNumber (matches what we do with a _Tracedata based * no-match lookup. */ duk_push_undefined(thr); duk_push_undefined(thr); } define_props: /* [ ... error lineNumber fileName ] */ #if defined(DUK_USE_ASSERTIONS) DUK_ASSERT(duk_get_top(thr) == entry_top + 2); #endif duk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_FILE_NAME, DUK_PROPDESC_FLAGS_C | DUK_PROPDESC_FLAG_NO_OVERWRITE); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LINE_NUMBER, DUK_PROPDESC_FLAGS_C | DUK_PROPDESC_FLAG_NO_OVERWRITE); } #endif /* DUK_USE_AUGMENT_ERROR_CREATE && !DUK_USE_TRACEBACKS */ /* * Add line number to a compiler error. */ #if defined(DUK_USE_AUGMENT_ERROR_CREATE) DUK_LOCAL void duk__add_compiler_error_line(duk_hthread *thr) { /* Append a "(line NNN)" to the "message" property of any error * thrown during compilation. Usually compilation errors are * SyntaxErrors but they can also be out-of-memory errors and * the like. */ /* [ ... error ] */ DUK_ASSERT(duk_is_object(thr, -1)); if (!(thr->compile_ctx != NULL && thr->compile_ctx->h_filename != NULL)) { return; } DUK_DDD(DUK_DDDPRINT("compile error, before adding line info: %!T", (duk_tval *) duk_get_tval(thr, -1))); if (duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_MESSAGE)) { duk_push_sprintf(thr, " (line %ld)", (long) thr->compile_ctx->curr_token.start_line); duk_concat(thr, 2); duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_MESSAGE); } else { duk_pop(thr); } DUK_DDD(DUK_DDDPRINT("compile error, after adding line info: %!T", (duk_tval *) duk_get_tval(thr, -1))); } #endif /* DUK_USE_AUGMENT_ERROR_CREATE */ /* * Augment an error being created using Duktape specific properties * like _Tracedata or .fileName/.lineNumber. */ #if defined(DUK_USE_AUGMENT_ERROR_CREATE) DUK_LOCAL void duk__err_augment_builtin_create(duk_hthread *thr, duk_hthread *thr_callstack, const char *c_filename, duk_int_t c_line, duk_hobject *obj, duk_small_uint_t flags) { #if defined(DUK_USE_ASSERTIONS) duk_int_t entry_top; #endif #if defined(DUK_USE_ASSERTIONS) entry_top = duk_get_top(thr); #endif DUK_ASSERT(obj != NULL); DUK_UNREF(obj); /* unreferenced w/o tracebacks */ duk__add_compiler_error_line(thr); #if defined(DUK_USE_TRACEBACKS) /* If tracebacks are enabled, the '_Tracedata' property is the only * thing we need: 'fileName' and 'lineNumber' are virtual properties * which use '_Tracedata'. */ if (duk_hobject_hasprop_raw(thr, obj, DUK_HTHREAD_STRING_INT_TRACEDATA(thr))) { DUK_DDD(DUK_DDDPRINT("error value already has a '_Tracedata' property, not modifying it")); } else { duk__add_traceback(thr, thr_callstack, c_filename, c_line, flags); } #else /* Without tracebacks the concrete .fileName and .lineNumber need * to be added directly. */ duk__add_fileline(thr, thr_callstack, c_filename, c_line, flags); #endif #if defined(DUK_USE_ASSERTIONS) DUK_ASSERT(duk_get_top(thr) == entry_top); #endif } #endif /* DUK_USE_AUGMENT_ERROR_CREATE */ /* * Augment an error at creation time with _Tracedata/fileName/lineNumber * and allow a user error handler (if defined) to process/replace the error. * The error to be augmented is at the stack top. * * thr: thread containing the error value * thr_callstack: thread which should be used for generating callstack etc. * c_filename: C __FILE__ related to the error * c_line: C __LINE__ related to the error * flags & DUK_AUGMENT_FLAG_NOBLAME_FILELINE: * if true, don't fileName/line as error source, otherwise use traceback * (needed because user code filename/line are reported but internal ones * are not) */ #if defined(DUK_USE_AUGMENT_ERROR_CREATE) DUK_INTERNAL void duk_err_augment_error_create(duk_hthread *thr, duk_hthread *thr_callstack, const char *c_filename, duk_int_t c_line, duk_small_uint_t flags) { duk_hobject *obj; DUK_ASSERT(thr != NULL); DUK_ASSERT(thr_callstack != NULL); /* [ ... error ] */ /* * Criteria for augmenting: * * - augmentation enabled in build (naturally) * - error value internal prototype chain contains the built-in * Error prototype object (i.e. 'val instanceof Error') * * Additional criteria for built-in augmenting: * * - error value is an extensible object */ obj = duk_get_hobject(thr, -1); if (!obj) { DUK_DDD(DUK_DDDPRINT("value is not an object, skip both built-in and user augment")); return; } if (!duk_hobject_prototype_chain_contains(thr, obj, thr->builtins[DUK_BIDX_ERROR_PROTOTYPE], 1 /*ignore_loop*/)) { /* If the value has a prototype loop, it's critical not to * throw here. Instead, assume the value is not to be * augmented. */ DUK_DDD(DUK_DDDPRINT("value is not an error instance, skip both built-in and user augment")); return; } if (DUK_HOBJECT_HAS_EXTENSIBLE(obj)) { DUK_DDD(DUK_DDDPRINT("error meets criteria, built-in augment")); duk__err_augment_builtin_create(thr, thr_callstack, c_filename, c_line, obj, flags); } else { DUK_DDD(DUK_DDDPRINT("error does not meet criteria, no built-in augment")); } /* [ ... error ] */ #if defined(DUK_USE_ERRCREATE) duk__err_augment_user(thr, DUK_STRIDX_ERR_CREATE); #endif } #endif /* DUK_USE_AUGMENT_ERROR_CREATE */ /* * Augment an error at throw time; allow a user error handler (if defined) * to process/replace the error. The error to be augmented is at the * stack top. */ #if defined(DUK_USE_AUGMENT_ERROR_THROW) DUK_INTERNAL void duk_err_augment_error_throw(duk_hthread *thr) { #if defined(DUK_USE_ERRTHROW) duk__err_augment_user(thr, DUK_STRIDX_ERR_THROW); #endif /* DUK_USE_ERRTHROW */ } #endif /* DUK_USE_AUGMENT_ERROR_THROW */ #line 1 "duk_error_longjmp.c" /* * Do a longjmp call, calling the fatal error handler if no * catchpoint exists. */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_PREFER_SIZE) DUK_LOCAL void duk__uncaught_minimal(duk_hthread *thr) { (void) duk_fatal(thr, "uncaught error"); } #endif #if 0 DUK_LOCAL void duk__uncaught_readable(duk_hthread *thr) { const char *summary; char buf[DUK_USE_FATAL_MAXLEN]; summary = duk_push_string_tval_readable(thr, &thr->heap->lj.value1); DUK_SNPRINTF(buf, sizeof(buf), "uncaught: %s", summary); buf[sizeof(buf) - 1] = (char) 0; (void) duk_fatal(thr, (const char *) buf); } #endif #if !defined(DUK_USE_PREFER_SIZE) DUK_LOCAL void duk__uncaught_error_aware(duk_hthread *thr) { const char *summary; char buf[DUK_USE_FATAL_MAXLEN]; summary = duk_push_string_tval_readable_error(thr, &thr->heap->lj.value1); DUK_ASSERT(summary != NULL); DUK_SNPRINTF(buf, sizeof(buf), "uncaught: %s", summary); buf[sizeof(buf) - 1] = (char) 0; (void) duk_fatal(thr, (const char *) buf); } #endif DUK_INTERNAL void duk_err_longjmp(duk_hthread *thr) { DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->heap != NULL); DUK_DD(DUK_DDPRINT("longjmp error: type=%d iserror=%d value1=%!T value2=%!T", (int) thr->heap->lj.type, (int) thr->heap->lj.iserror, &thr->heap->lj.value1, &thr->heap->lj.value2)); /* Prevent finalizer execution during error handling. All error * handling sites will process pending finalizers once error handling * is complete and we're ready for the side effects. Does not prevent * refzero freeing or mark-and-sweep during error handling. * * NOTE: when we come here some calling code may have used DECREF * NORZ macros without an explicit DUK_REFZERO_CHECK_xxx() call. * We don't want to do it here because it would just check for * pending finalizers and we prevent that explicitly. Instead, * the error catcher will run the finalizers once error handling * is complete. */ DUK_ASSERT_LJSTATE_SET(thr->heap); thr->heap->pf_prevent_count++; DUK_ASSERT(thr->heap->pf_prevent_count != 0); /* Wrap. */ #if defined(DUK_USE_ASSERTIONS) /* XXX: set this immediately when longjmp state is set */ DUK_ASSERT(thr->heap->error_not_allowed == 0); /* Detect error within critical section. */ thr->heap->error_not_allowed = 1; #endif DUK_DD(DUK_DDPRINT("about to longjmp, pf_prevent_count=%ld", (long) thr->heap->pf_prevent_count)); #if !defined(DUK_USE_CPP_EXCEPTIONS) /* If we don't have a jmpbuf_ptr, there is little we can do except * cause a fatal error. The caller's expectation is that we never * return. * * With C++ exceptions we now just propagate an uncaught error * instead of invoking the fatal error handler. Because there's * a dummy jmpbuf for C++ exceptions now, this could be changed. */ if (!thr->heap->lj.jmpbuf_ptr) { DUK_D(DUK_DPRINT("uncaught error: type=%d iserror=%d value1=%!T value2=%!T", (int) thr->heap->lj.type, (int) thr->heap->lj.iserror, &thr->heap->lj.value1, &thr->heap->lj.value2)); #if defined(DUK_USE_PREFER_SIZE) duk__uncaught_minimal(thr); #else duk__uncaught_error_aware(thr); #endif DUK_UNREACHABLE(); } #endif /* DUK_USE_CPP_EXCEPTIONS */ #if defined(DUK_USE_CPP_EXCEPTIONS) { duk_internal_exception exc; /* dummy */ throw exc; } #else /* DUK_USE_CPP_EXCEPTIONS */ DUK_LONGJMP(thr->heap->lj.jmpbuf_ptr->jb); #endif /* DUK_USE_CPP_EXCEPTIONS */ DUK_UNREACHABLE(); } #line 1 "duk_error_misc.c" /* * Error helpers */ /* #include duk_internal.h -> already included */ /* * Helper to walk the thread chain and see if there is an active error * catcher. Protected calls or finally blocks aren't considered catching. */ #if defined(DUK_USE_DEBUGGER_SUPPORT) DUK_LOCAL duk_bool_t duk__have_active_catcher(duk_hthread *thr) { /* As noted above, a protected API call won't be counted as a * catcher. This is usually convenient, e.g. in the case of a top- * level duk_pcall(), but may not always be desirable. Perhaps add * an argument to treat them as catchers? */ duk_activation *act; duk_catcher *cat; DUK_ASSERT(thr != NULL); for (; thr != NULL; thr = thr->resumer) { for (act = thr->callstack_curr; act != NULL; act = act->parent) { for (cat = act->cat; cat != NULL; cat = cat->parent) { if (DUK_CAT_HAS_CATCH_ENABLED(cat)) { return 1; /* all we need to know */ } } } } return 0; } #endif /* DUK_USE_DEBUGGER_SUPPORT */ /* * Get prototype object for an integer error code. */ DUK_INTERNAL duk_hobject *duk_error_prototype_from_code(duk_hthread *thr, duk_errcode_t code) { switch (code) { case DUK_ERR_EVAL_ERROR: return thr->builtins[DUK_BIDX_EVAL_ERROR_PROTOTYPE]; case DUK_ERR_RANGE_ERROR: return thr->builtins[DUK_BIDX_RANGE_ERROR_PROTOTYPE]; case DUK_ERR_REFERENCE_ERROR: return thr->builtins[DUK_BIDX_REFERENCE_ERROR_PROTOTYPE]; case DUK_ERR_SYNTAX_ERROR: return thr->builtins[DUK_BIDX_SYNTAX_ERROR_PROTOTYPE]; case DUK_ERR_TYPE_ERROR: return thr->builtins[DUK_BIDX_TYPE_ERROR_PROTOTYPE]; case DUK_ERR_URI_ERROR: return thr->builtins[DUK_BIDX_URI_ERROR_PROTOTYPE]; case DUK_ERR_ERROR: default: return thr->builtins[DUK_BIDX_ERROR_PROTOTYPE]; } } /* * Helper for debugger throw notify and pause-on-uncaught integration. */ #if defined(DUK_USE_DEBUGGER_SUPPORT) DUK_INTERNAL void duk_err_check_debugger_integration(duk_hthread *thr) { duk_bool_t uncaught; duk_tval *tv_obj; /* If something is thrown with the debugger attached and nobody will * catch it, execution is paused before the longjmp, turning over * control to the debug client. This allows local state to be examined * before the stack is unwound. Errors are not intercepted when debug * message loop is active (e.g. for Eval). */ DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->heap != NULL); /* XXX: Allow customizing the pause and notify behavior at runtime * using debugger runtime flags. For now the behavior is fixed using * config options. */ if (!duk_debug_is_attached(thr->heap) || thr->heap->dbg_processing || thr->heap->lj.type != DUK_LJ_TYPE_THROW || thr->heap->creating_error) { DUK_D(DUK_DPRINT("skip debugger error integration; not attached, debugger processing, not THROW, or error thrown while creating error")); return; } /* Don't intercept a DoubleError, we may have caused the initial double * fault and attempting to intercept it will cause us to be called * recursively and exhaust the C stack. (This should no longer happen * for the initial throw because DoubleError path doesn't do a debugger * integration check, but it might happen for rethrows.) */ tv_obj = &thr->heap->lj.value1; if (DUK_TVAL_IS_OBJECT(tv_obj) && DUK_TVAL_GET_OBJECT(tv_obj) == thr->builtins[DUK_BIDX_DOUBLE_ERROR]) { DUK_D(DUK_DPRINT("built-in DoubleError instance (re)thrown, not intercepting")); return; } uncaught = !duk__have_active_catcher(thr); /* Debugger code expects the value at stack top. This also serves * as a backup: we need to store/restore the longjmp state because * when the debugger is paused Eval commands may be executed and * they can arbitrarily clobber the longjmp state. */ duk_push_tval(thr, tv_obj); /* Store and reset longjmp state. */ DUK_ASSERT_LJSTATE_SET(thr->heap); DUK_TVAL_DECREF_NORZ(thr, tv_obj); DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(&thr->heap->lj.value2)); /* Always for THROW type. */ DUK_TVAL_SET_UNDEFINED(tv_obj); thr->heap->lj.type = DUK_LJ_TYPE_UNKNOWN; DUK_ASSERT_LJSTATE_UNSET(thr->heap); #if defined(DUK_USE_DEBUGGER_THROW_NOTIFY) /* Report it to the debug client */ DUK_D(DUK_DPRINT("throw with debugger attached, report to client")); duk_debug_send_throw(thr, uncaught); #endif if (uncaught) { if (thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_UNCAUGHT_ERROR) { DUK_D(DUK_DPRINT("PAUSE TRIGGERED by uncaught error")); duk_debug_halt_execution(thr, 1 /*use_prev_pc*/); } } else { if (thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_CAUGHT_ERROR) { DUK_D(DUK_DPRINT("PAUSE TRIGGERED by caught error")); duk_debug_halt_execution(thr, 1 /*use_prev_pc*/); } } /* Restore longjmp state. */ DUK_ASSERT_LJSTATE_UNSET(thr->heap); thr->heap->lj.type = DUK_LJ_TYPE_THROW; tv_obj = DUK_GET_TVAL_NEGIDX(thr, -1); DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(&thr->heap->lj.value1)); DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(&thr->heap->lj.value2)); DUK_TVAL_SET_TVAL(&thr->heap->lj.value1, tv_obj); DUK_TVAL_INCREF(thr, tv_obj); DUK_ASSERT_LJSTATE_SET(thr->heap); duk_pop(thr); } #endif /* DUK_USE_DEBUGGER_SUPPORT */ /* * Helpers for setting up heap longjmp state. */ DUK_INTERNAL void duk_err_setup_ljstate1(duk_hthread *thr, duk_small_uint_t lj_type, duk_tval *tv_val) { duk_heap *heap; DUK_ASSERT(thr != NULL); heap = thr->heap; DUK_ASSERT(heap != NULL); DUK_ASSERT(tv_val != NULL); DUK_ASSERT_LJSTATE_UNSET(heap); heap->lj.type = lj_type; DUK_TVAL_SET_TVAL(&heap->lj.value1, tv_val); DUK_TVAL_INCREF(thr, tv_val); DUK_ASSERT_LJSTATE_SET(heap); } #line 1 "duk_error_throw.c" /* * Create and throw an Ecmascript error object based on a code and a message. * * Used when we throw errors internally. Ecmascript generated error objects * are created by Ecmascript code, and the throwing is handled by the bytecode * executor. */ /* #include duk_internal.h -> already included */ /* * Create and throw an error (originating from Duktape internally) * * Push an error object on top of the stack, possibly throw augmenting * the error, and finally longjmp. * * If an error occurs while we're dealing with the current error, we might * enter an infinite recursion loop. This is prevented by detecting a * "double fault" through the heap->creating_error flag; the recursion * then stops at the second level. */ #if defined(DUK_USE_VERBOSE_ERRORS) DUK_INTERNAL void duk_err_create_and_throw(duk_hthread *thr, duk_errcode_t code, const char *msg, const char *filename, duk_int_t line) { #else DUK_INTERNAL void duk_err_create_and_throw(duk_hthread *thr, duk_errcode_t code) { #endif #if defined(DUK_USE_VERBOSE_ERRORS) DUK_DD(DUK_DDPRINT("duk_err_create_and_throw(): code=%ld, msg=%s, filename=%s, line=%ld", (long) code, (const char *) msg, (const char *) filename, (long) line)); #else DUK_DD(DUK_DDPRINT("duk_err_create_and_throw(): code=%ld", (long) code)); #endif DUK_ASSERT(thr != NULL); /* Even though nested call is possible because we throw an error when * trying to create an error, the potential errors must happen before * the longjmp state is configured. */ DUK_ASSERT_LJSTATE_UNSET(thr->heap); /* Sync so that augmentation sees up-to-date activations, NULL * thr->ptr_curr_pc so that it's not used if side effects occur * in augmentation or longjmp handling. */ duk_hthread_sync_and_null_currpc(thr); /* * Create and push an error object onto the top of stack. * The error is potentially augmented before throwing. * * If a "double error" occurs, use a fixed error instance * to avoid further trouble. */ if (thr->heap->creating_error) { duk_tval tv_val; duk_hobject *h_err; thr->heap->creating_error = 0; h_err = thr->builtins[DUK_BIDX_DOUBLE_ERROR]; if (h_err != NULL) { DUK_D(DUK_DPRINT("double fault detected -> use built-in fixed 'double error' instance")); DUK_TVAL_SET_OBJECT(&tv_val, h_err); } else { DUK_D(DUK_DPRINT("double fault detected; there is no built-in fixed 'double error' instance " "-> use the error code as a number")); DUK_TVAL_SET_I32(&tv_val, (duk_int32_t) code); } duk_err_setup_ljstate1(thr, DUK_LJ_TYPE_THROW, &tv_val); /* No augmentation to avoid any allocations or side effects. */ } else { /* Prevent infinite recursion. Extra call stack and C * recursion headroom (see GH-191) is added for augmentation. * That is now signalled by heap->augmenting error and taken * into account in call handling without an explicit limit bump. */ thr->heap->creating_error = 1; duk_require_stack(thr, 1); /* XXX: usually unnecessary '%s' formatting here, but cannot * use 'msg' as a format string directly. */ #if defined(DUK_USE_VERBOSE_ERRORS) duk_push_error_object_raw(thr, code | DUK_ERRCODE_FLAG_NOBLAME_FILELINE, filename, line, "%s", (const char *) msg); #else duk_push_error_object_raw(thr, code | DUK_ERRCODE_FLAG_NOBLAME_FILELINE, NULL, 0, NULL); #endif /* Note that an alloc error may happen during error augmentation. * This may happen both when the original error is an alloc error * and when it's something else. Because any error in augmentation * must be handled correctly anyway, there's no special check for * avoiding it for alloc errors (this differs from Duktape 1.x). */ #if defined(DUK_USE_AUGMENT_ERROR_THROW) DUK_DDD(DUK_DDDPRINT("THROW ERROR (INTERNAL): %!iT (before throw augment)", (duk_tval *) duk_get_tval(thr, -1))); duk_err_augment_error_throw(thr); #endif duk_err_setup_ljstate1(thr, DUK_LJ_TYPE_THROW, DUK_GET_TVAL_NEGIDX(thr, -1)); thr->heap->creating_error = 0; /* Error is now created and we assume no errors can occur any * more. Check for debugger Throw integration only when the * error is complete. If we enter debugger message loop, * creating_error must be 0 so that errors can be thrown in * the paused state, e.g. in Eval commands. */ #if defined(DUK_USE_DEBUGGER_SUPPORT) duk_err_check_debugger_integration(thr); #endif } /* * Finally, longjmp */ DUK_DDD(DUK_DDDPRINT("THROW ERROR (INTERNAL): %!iT, %!iT (after throw augment)", (duk_tval *) &thr->heap->lj.value1, (duk_tval *) &thr->heap->lj.value2)); duk_err_longjmp(thr); DUK_UNREACHABLE(); } /* * Helper for C function call negative return values. */ DUK_INTERNAL void duk_error_throw_from_negative_rc(duk_hthread *thr, duk_ret_t rc) { DUK_ASSERT(thr != NULL); DUK_ASSERT(rc < 0); /* * The __FILE__ and __LINE__ information is intentionally not used in the * creation of the error object, as it isn't useful in the tracedata. The * tracedata still contains the function which returned the negative return * code, and having the file/line of this function isn't very useful. * * The error messages for DUK_RET_xxx shorthand are intentionally very * minimal: they're only really useful for low memory targets. */ duk_error_raw(thr, -rc, NULL, 0, "error (rc %ld)", (long) rc); DUK_UNREACHABLE(); } #line 1 "duk_hbuffer_alloc.c" /* * duk_hbuffer allocation and freeing. */ /* #include duk_internal.h -> already included */ /* Allocate a new duk_hbuffer of a certain type and return a pointer to it * (NULL on error). Write buffer data pointer to 'out_bufdata' (only if * allocation successful). */ DUK_INTERNAL duk_hbuffer *duk_hbuffer_alloc(duk_heap *heap, duk_size_t size, duk_small_uint_t flags, void **out_bufdata) { duk_hbuffer *res = NULL; duk_size_t header_size; duk_size_t alloc_size; DUK_ASSERT(heap != NULL); DUK_ASSERT(out_bufdata != NULL); DUK_DDD(DUK_DDDPRINT("allocate hbuffer")); /* Size sanity check. Should not be necessary because caller is * required to check this, but we don't want to cause a segfault * if the size wraps either in duk_size_t computation or when * storing the size in a 16-bit field. */ if (size > DUK_HBUFFER_MAX_BYTELEN) { DUK_D(DUK_DPRINT("hbuffer alloc failed: size too large: %ld", (long) size)); return NULL; /* no need to write 'out_bufdata' */ } if (flags & DUK_BUF_FLAG_EXTERNAL) { header_size = sizeof(duk_hbuffer_external); alloc_size = sizeof(duk_hbuffer_external); } else if (flags & DUK_BUF_FLAG_DYNAMIC) { header_size = sizeof(duk_hbuffer_dynamic); alloc_size = sizeof(duk_hbuffer_dynamic); } else { header_size = sizeof(duk_hbuffer_fixed); alloc_size = sizeof(duk_hbuffer_fixed) + size; DUK_ASSERT(alloc_size >= sizeof(duk_hbuffer_fixed)); /* no wrapping */ } res = (duk_hbuffer *) DUK_ALLOC(heap, alloc_size); if (DUK_UNLIKELY(res == NULL)) { goto alloc_error; } /* zero everything unless requested not to do so */ #if defined(DUK_USE_ZERO_BUFFER_DATA) DUK_MEMZERO((void *) res, (flags & DUK_BUF_FLAG_NOZERO) ? header_size : alloc_size); #else DUK_MEMZERO((void *) res, header_size); #endif if (flags & DUK_BUF_FLAG_EXTERNAL) { duk_hbuffer_external *h; h = (duk_hbuffer_external *) res; DUK_UNREF(h); *out_bufdata = NULL; #if defined(DUK_USE_EXPLICIT_NULL_INIT) #if defined(DUK_USE_HEAPPTR16) /* the compressed pointer is zeroed which maps to NULL, so nothing to do. */ #else DUK_HBUFFER_EXTERNAL_SET_DATA_PTR(heap, h, NULL); #endif #endif DUK_ASSERT(DUK_HBUFFER_EXTERNAL_GET_DATA_PTR(heap, h) == NULL); } else if (flags & DUK_BUF_FLAG_DYNAMIC) { duk_hbuffer_dynamic *h = (duk_hbuffer_dynamic *) res; void *ptr; if (size > 0) { DUK_ASSERT(!(flags & DUK_BUF_FLAG_EXTERNAL)); /* alloc external with size zero */ DUK_DDD(DUK_DDDPRINT("dynamic buffer with nonzero size, alloc actual buffer")); #if defined(DUK_USE_ZERO_BUFFER_DATA) ptr = DUK_ALLOC_ZEROED(heap, size); #else ptr = DUK_ALLOC(heap, size); #endif if (DUK_UNLIKELY(ptr == NULL)) { /* Because size > 0, NULL check is correct */ goto alloc_error; } *out_bufdata = ptr; DUK_HBUFFER_DYNAMIC_SET_DATA_PTR(heap, h, ptr); } else { *out_bufdata = NULL; #if defined(DUK_USE_EXPLICIT_NULL_INIT) #if defined(DUK_USE_HEAPPTR16) /* the compressed pointer is zeroed which maps to NULL, so nothing to do. */ #else DUK_HBUFFER_DYNAMIC_SET_DATA_PTR(heap, h, NULL); #endif #endif DUK_ASSERT(DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap, h) == NULL); } } else { *out_bufdata = (void *) ((duk_hbuffer_fixed *) res + 1); } DUK_HBUFFER_SET_SIZE(res, size); DUK_HEAPHDR_SET_TYPE(&res->hdr, DUK_HTYPE_BUFFER); if (flags & DUK_BUF_FLAG_DYNAMIC) { DUK_HBUFFER_SET_DYNAMIC(res); if (flags & DUK_BUF_FLAG_EXTERNAL) { DUK_HBUFFER_SET_EXTERNAL(res); } } else { DUK_ASSERT(!(flags & DUK_BUF_FLAG_EXTERNAL)); } DUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(heap, &res->hdr); DUK_DDD(DUK_DDDPRINT("allocated hbuffer: %p", (void *) res)); return res; alloc_error: DUK_DD(DUK_DDPRINT("hbuffer allocation failed")); DUK_FREE(heap, res); return NULL; /* no need to write 'out_bufdata' */ } /* For indirect allocs. */ DUK_INTERNAL void *duk_hbuffer_get_dynalloc_ptr(duk_heap *heap, void *ud) { duk_hbuffer_dynamic *buf = (duk_hbuffer_dynamic *) ud; DUK_UNREF(heap); return (void *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap, buf); } #line 1 "duk_hbuffer_ops.c" /* * duk_hbuffer operations such as resizing and inserting/appending data to * a dynamic buffer. */ /* #include duk_internal.h -> already included */ /* * Resizing */ DUK_INTERNAL void duk_hbuffer_resize(duk_hthread *thr, duk_hbuffer_dynamic *buf, duk_size_t new_size) { void *res; duk_size_t prev_size; DUK_ASSERT(thr != NULL); DUK_ASSERT(buf != NULL); DUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(buf)); DUK_ASSERT(!DUK_HBUFFER_HAS_EXTERNAL(buf)); /* * Maximum size check */ if (new_size > DUK_HBUFFER_MAX_BYTELEN) { DUK_ERROR_RANGE(thr, "buffer too long"); } /* * Note: use indirect realloc variant just in case mark-and-sweep * (finalizers) might resize this same buffer during garbage * collection. */ res = DUK_REALLOC_INDIRECT(thr->heap, duk_hbuffer_get_dynalloc_ptr, (void *) buf, new_size); if (DUK_LIKELY(res != NULL || new_size == 0)) { /* 'res' may be NULL if new allocation size is 0. */ DUK_DDD(DUK_DDDPRINT("resized dynamic buffer %p:%ld -> %p:%ld", (void *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, buf), (long) DUK_HBUFFER_DYNAMIC_GET_SIZE(buf), (void *) res, (long) new_size)); /* * The entire allocated buffer area, regardless of actual used * size, is kept zeroed in resizes for simplicity. If the buffer * is grown, zero the new part. */ prev_size = DUK_HBUFFER_DYNAMIC_GET_SIZE(buf); if (new_size > prev_size) { DUK_ASSERT(new_size - prev_size > 0); #if defined(DUK_USE_ZERO_BUFFER_DATA) DUK_MEMZERO((void *) ((char *) res + prev_size), (duk_size_t) (new_size - prev_size)); #endif } DUK_HBUFFER_DYNAMIC_SET_SIZE(buf, new_size); DUK_HBUFFER_DYNAMIC_SET_DATA_PTR(thr->heap, buf, res); } else { DUK_ERROR_ALLOC_FAILED(thr); } DUK_ASSERT(res != NULL || new_size == 0); } DUK_INTERNAL void duk_hbuffer_reset(duk_hthread *thr, duk_hbuffer_dynamic *buf) { DUK_ASSERT(thr != NULL); DUK_ASSERT(buf != NULL); DUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(buf)); DUK_ASSERT(!DUK_HBUFFER_HAS_EXTERNAL(buf)); duk_hbuffer_resize(thr, buf, 0); } /* #include duk_internal.h -> already included */ #line 2 "duk_hbufobj_misc.c" #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_INTERNAL duk_uint_t duk_hbufobj_clamp_bytelength(duk_hbufobj *h_bufobj, duk_uint_t len) { duk_uint_t buf_size; duk_uint_t buf_avail; DUK_ASSERT(h_bufobj != NULL); DUK_ASSERT(h_bufobj->buf != NULL); buf_size = (duk_uint_t) DUK_HBUFFER_GET_SIZE(h_bufobj->buf); if (h_bufobj->offset > buf_size) { /* Slice starting point is beyond current length. */ return 0; } buf_avail = buf_size - h_bufobj->offset; return buf_avail >= len ? len : buf_avail; } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ #line 1 "duk_heap_alloc.c" /* * duk_heap allocation and freeing. */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_ROM_STRINGS) /* Fixed seed value used with ROM strings. */ #define DUK__FIXED_HASH_SEED 0xabcd1234 #endif /* * Free a heap object. * * Free heap object and its internal (non-heap) pointers. Assumes that * caller has removed the object from heap allocated list or the string * intern table, and any weak references (which strings may have) have * been already dealt with. */ DUK_INTERNAL void duk_free_hobject(duk_heap *heap, duk_hobject *h) { DUK_ASSERT(heap != NULL); DUK_ASSERT(h != NULL); DUK_FREE(heap, DUK_HOBJECT_GET_PROPS(heap, h)); if (DUK_HOBJECT_IS_COMPFUNC(h)) { duk_hcompfunc *f = (duk_hcompfunc *) h; DUK_UNREF(f); /* Currently nothing to free; 'data' is a heap object */ } else if (DUK_HOBJECT_IS_NATFUNC(h)) { duk_hnatfunc *f = (duk_hnatfunc *) h; DUK_UNREF(f); /* Currently nothing to free */ } else if (DUK_HOBJECT_IS_THREAD(h)) { duk_hthread *t = (duk_hthread *) h; duk_activation *act; DUK_FREE(heap, t->valstack); /* Don't free h->resumer because it exists in the heap. * Callstack entries also contain function pointers which * are not freed for the same reason. They are decref * finalized and the targets are freed if necessary based * on their refcount (or reachability). */ for (act = t->callstack_curr; act != NULL;) { duk_activation *act_next; duk_catcher *cat; for (cat = act->cat; cat != NULL;) { duk_catcher *cat_next; cat_next = cat->parent; DUK_FREE(heap, (void *) cat); cat = cat_next; } act_next = act->parent; DUK_FREE(heap, (void *) act); act = act_next; } /* XXX: with 'caller' property the callstack would need * to be unwound to update the 'caller' properties of * functions in the callstack. */ } else if (DUK_HOBJECT_IS_BOUNDFUNC(h)) { duk_hboundfunc *f = (duk_hboundfunc *) h; DUK_FREE(heap, f->args); } DUK_FREE(heap, (void *) h); } DUK_INTERNAL void duk_free_hbuffer(duk_heap *heap, duk_hbuffer *h) { DUK_ASSERT(heap != NULL); DUK_ASSERT(h != NULL); if (DUK_HBUFFER_HAS_DYNAMIC(h) && !DUK_HBUFFER_HAS_EXTERNAL(h)) { duk_hbuffer_dynamic *g = (duk_hbuffer_dynamic *) h; DUK_DDD(DUK_DDDPRINT("free dynamic buffer %p", (void *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap, g))); DUK_FREE(heap, DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap, g)); } DUK_FREE(heap, (void *) h); } DUK_INTERNAL void duk_free_hstring(duk_heap *heap, duk_hstring *h) { DUK_ASSERT(heap != NULL); DUK_ASSERT(h != NULL); DUK_UNREF(heap); DUK_UNREF(h); #if defined(DUK_USE_HSTRING_EXTDATA) && defined(DUK_USE_EXTSTR_FREE) if (DUK_HSTRING_HAS_EXTDATA(h)) { DUK_DDD(DUK_DDDPRINT("free extstr: hstring %!O, extdata: %p", h, DUK_HSTRING_GET_EXTDATA((duk_hstring_external *) h))); DUK_USE_EXTSTR_FREE(heap->heap_udata, (const void *) DUK_HSTRING_GET_EXTDATA((duk_hstring_external *) h)); } #endif DUK_FREE(heap, (void *) h); } DUK_INTERNAL void duk_heap_free_heaphdr_raw(duk_heap *heap, duk_heaphdr *hdr) { DUK_ASSERT(heap); DUK_ASSERT(hdr); DUK_DDD(DUK_DDDPRINT("free heaphdr %p, htype %ld", (void *) hdr, (long) DUK_HEAPHDR_GET_TYPE(hdr))); switch (DUK_HEAPHDR_GET_TYPE(hdr)) { case DUK_HTYPE_STRING: duk_free_hstring(heap, (duk_hstring *) hdr); break; case DUK_HTYPE_OBJECT: duk_free_hobject(heap, (duk_hobject *) hdr); break; default: DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(hdr) == DUK_HTYPE_BUFFER); duk_free_hbuffer(heap, (duk_hbuffer *) hdr); } } /* * Free the heap. * * Frees heap-related non-heap-tracked allocations such as the * string intern table; then frees the heap allocated objects; * and finally frees the heap structure itself. Reference counts * and GC markers are ignored (and not updated) in this process, * and finalizers won't be called. * * The heap pointer and heap object pointers must not be used * after this call. */ #if defined(DUK_USE_CACHE_ACTIVATION) DUK_LOCAL duk_size_t duk__heap_free_activation_freelist(duk_heap *heap) { duk_activation *act; duk_activation *act_next; duk_size_t count_act = 0; for (act = heap->activation_free; act != NULL;) { act_next = act->parent; DUK_FREE(heap, (void *) act); act = act_next; #if defined(DUK_USE_DEBUG) count_act++; #endif } heap->activation_free = NULL; /* needed when called from mark-and-sweep */ return count_act; } #endif /* DUK_USE_CACHE_ACTIVATION */ #if defined(DUK_USE_CACHE_CATCHER) DUK_LOCAL duk_size_t duk__heap_free_catcher_freelist(duk_heap *heap) { duk_catcher *cat; duk_catcher *cat_next; duk_size_t count_cat = 0; for (cat = heap->catcher_free; cat != NULL;) { cat_next = cat->parent; DUK_FREE(heap, (void *) cat); cat = cat_next; #if defined(DUK_USE_DEBUG) count_cat++; #endif } heap->catcher_free = NULL; /* needed when called from mark-and-sweep */ return count_cat; } #endif /* DUK_USE_CACHE_CATCHER */ DUK_INTERNAL void duk_heap_free_freelists(duk_heap *heap) { duk_size_t count_act = 0; duk_size_t count_cat = 0; #if defined(DUK_USE_CACHE_ACTIVATION) count_act = duk__heap_free_activation_freelist(heap); #endif #if defined(DUK_USE_CACHE_CATCHER) count_cat = duk__heap_free_catcher_freelist(heap); #endif DUK_UNREF(heap); DUK_UNREF(count_act); DUK_UNREF(count_cat); DUK_D(DUK_DPRINT("freed %ld activation freelist entries, %ld catcher freelist entries", (long) count_act, (long) count_cat)); } DUK_LOCAL void duk__free_allocated(duk_heap *heap) { duk_heaphdr *curr; duk_heaphdr *next; curr = heap->heap_allocated; while (curr) { /* We don't log or warn about freeing zero refcount objects * because they may happen with finalizer processing. */ DUK_DDD(DUK_DDDPRINT("FINALFREE (allocated): %!iO", (duk_heaphdr *) curr)); next = DUK_HEAPHDR_GET_NEXT(heap, curr); duk_heap_free_heaphdr_raw(heap, curr); curr = next; } } #if defined(DUK_USE_FINALIZER_SUPPORT) DUK_LOCAL void duk__free_finalize_list(duk_heap *heap) { duk_heaphdr *curr; duk_heaphdr *next; curr = heap->finalize_list; while (curr) { DUK_DDD(DUK_DDDPRINT("FINALFREE (finalize_list): %!iO", (duk_heaphdr *) curr)); next = DUK_HEAPHDR_GET_NEXT(heap, curr); duk_heap_free_heaphdr_raw(heap, curr); curr = next; } } #endif /* DUK_USE_FINALIZER_SUPPORT */ DUK_LOCAL void duk__free_stringtable(duk_heap *heap) { /* strings are only tracked by stringtable */ duk_heap_strtable_free(heap); } #if defined(DUK_USE_FINALIZER_SUPPORT) DUK_LOCAL void duk__free_run_finalizers(duk_heap *heap) { duk_heaphdr *curr; duk_uint_t round_no; duk_size_t count_all; duk_size_t count_finalized; duk_size_t curr_limit; DUK_ASSERT(heap != NULL); #if defined(DUK_USE_REFERENCE_COUNTING) DUK_ASSERT(heap->refzero_list == NULL); /* refzero not running -> must be empty */ #endif DUK_ASSERT(heap->finalize_list == NULL); /* mark-and-sweep last pass */ if (heap->heap_thread == NULL) { /* May happen when heap allocation fails right off. There * cannot be any finalizable objects in this case. */ DUK_D(DUK_DPRINT("no heap_thread in heap destruct, assume no finalizable objects")); return; } /* Prevent finalize_list processing and mark-and-sweep entirely. * Setting ms_running = 1 also prevents refzero handling from moving * objects away from the heap_allocated list (the flag name is a bit * misleading here). */ DUK_ASSERT(heap->pf_prevent_count == 0); heap->pf_prevent_count = 1; DUK_ASSERT(heap->ms_running == 0); heap->ms_running = 1; DUK_ASSERT(heap->ms_prevent_count == 0); heap->ms_prevent_count = 1; /* Bump, because mark-and-sweep assumes it's bumped when ms_running is set. */ curr_limit = 0; /* suppress warning, not used */ for (round_no = 0; ; round_no++) { curr = heap->heap_allocated; count_all = 0; count_finalized = 0; while (curr) { count_all++; if (DUK_HEAPHDR_IS_OBJECT(curr)) { /* Only objects in heap_allocated may have finalizers. Check that * the object itself has a _Finalizer property (own or inherited) * so that we don't execute finalizers for e.g. Proxy objects. */ DUK_ASSERT(curr != NULL); if (DUK_HOBJECT_HAS_FINALIZER_FAST(heap, (duk_hobject *) curr)) { if (!DUK_HEAPHDR_HAS_FINALIZED((duk_heaphdr *) curr)) { DUK_ASSERT(DUK_HEAP_HAS_FINALIZER_NORESCUE(heap)); /* maps to finalizer 2nd argument */ duk_heap_run_finalizer(heap, (duk_hobject *) curr); count_finalized++; } } } curr = DUK_HEAPHDR_GET_NEXT(heap, curr); } /* Each round of finalizer execution may spawn new finalizable objects * which is normal behavior for some applications. Allow multiple * rounds of finalization, but use a shrinking limit based on the * first round to detect the case where a runaway finalizer creates * an unbounded amount of new finalizable objects. Finalizer rescue * is not supported: the semantics are unclear because most of the * objects being finalized here are already reachable. The finalizer * is given a boolean to indicate that rescue is not possible. * * See discussion in: https://github.com/svaarala/duktape/pull/473 */ if (round_no == 0) { /* Cannot wrap: each object is at least 8 bytes so count is * at most 1/8 of that. */ curr_limit = count_all * 2; } else { curr_limit = (curr_limit * 3) / 4; /* Decrease by 25% every round */ } DUK_D(DUK_DPRINT("finalizer round %ld complete, %ld objects, tried to execute %ld finalizers, current limit is %ld", (long) round_no, (long) count_all, (long) count_finalized, (long) curr_limit)); if (count_finalized == 0) { DUK_D(DUK_DPRINT("no more finalizable objects, forced finalization finished")); break; } if (count_finalized >= curr_limit) { DUK_D(DUK_DPRINT("finalizer count above limit, potentially runaway finalizer; skip remaining finalizers")); break; } } DUK_ASSERT(heap->ms_running == 1); heap->ms_running = 0; DUK_ASSERT(heap->pf_prevent_count == 1); heap->pf_prevent_count = 0; } #endif /* DUK_USE_FINALIZER_SUPPORT */ DUK_INTERNAL void duk_heap_free(duk_heap *heap) { DUK_D(DUK_DPRINT("free heap: %p", (void *) heap)); #if defined(DUK_USE_DEBUG) duk_heap_strtable_dump(heap); #endif #if defined(DUK_USE_DEBUGGER_SUPPORT) /* Detach a debugger if attached (can be called multiple times) * safely. */ /* XXX: Add a flag to reject an attempt to re-attach? Otherwise * the detached callback may immediately reattach. */ duk_debug_do_detach(heap); #endif /* Execute finalizers before freeing the heap, even for reachable * objects. This gives finalizers the chance to free any native * resources like file handles, allocations made outside Duktape, * etc. This is quite tricky to get right, so that all finalizer * guarantees are honored. * * Run mark-and-sweep a few times just in case (unreachable object * finalizers run already here). The last round must rescue objects * from the previous round without running any more finalizers. This * ensures rescued objects get their FINALIZED flag cleared so that * their finalizer is called once more in forced finalization to * satisfy finalizer guarantees. However, we don't want to run any * more finalizers because that'd required one more loop, and so on. * * XXX: this perhaps requires an execution time limit. */ DUK_D(DUK_DPRINT("execute finalizers before freeing heap")); DUK_ASSERT(heap->pf_skip_finalizers == 0); DUK_D(DUK_DPRINT("forced gc #1 in heap destruction")); duk_heap_mark_and_sweep(heap, 0); DUK_D(DUK_DPRINT("forced gc #2 in heap destruction")); duk_heap_mark_and_sweep(heap, 0); DUK_D(DUK_DPRINT("forced gc #3 in heap destruction (don't run finalizers)")); heap->pf_skip_finalizers = 1; duk_heap_mark_and_sweep(heap, 0); /* Skip finalizers; queue finalizable objects to heap_allocated. */ /* There are never objects in refzero_list at this point, or at any * point beyond a DECREF (even a DECREF_NORZ). Since Duktape 2.1 * refzero_list processing is side effect free, so it is always * processed to completion by a DECREF initially triggering a zero * refcount. */ #if defined(DUK_USE_REFERENCE_COUNTING) DUK_ASSERT(heap->refzero_list == NULL); /* Always processed to completion inline. */ #endif #if defined(DUK_USE_FINALIZER_SUPPORT) DUK_ASSERT(heap->finalize_list == NULL); /* Last mark-and-sweep with skip_finalizers. */ #endif #if defined(DUK_USE_FINALIZER_SUPPORT) DUK_D(DUK_DPRINT("run finalizers for remaining finalizable objects")); DUK_HEAP_SET_FINALIZER_NORESCUE(heap); /* Rescue no longer supported. */ duk__free_run_finalizers(heap); #endif /* DUK_USE_FINALIZER_SUPPORT */ /* Note: heap->heap_thread, heap->curr_thread, and heap->heap_object * are on the heap allocated list. */ DUK_D(DUK_DPRINT("freeing temporary freelists")); duk_heap_free_freelists(heap); DUK_D(DUK_DPRINT("freeing heap_allocated of heap: %p", (void *) heap)); duk__free_allocated(heap); #if defined(DUK_USE_REFERENCE_COUNTING) DUK_ASSERT(heap->refzero_list == NULL); /* Always processed to completion inline. */ #endif #if defined(DUK_USE_FINALIZER_SUPPORT) DUK_D(DUK_DPRINT("freeing finalize_list of heap: %p", (void *) heap)); duk__free_finalize_list(heap); #endif DUK_D(DUK_DPRINT("freeing string table of heap: %p", (void *) heap)); duk__free_stringtable(heap); DUK_D(DUK_DPRINT("freeing heap structure: %p", (void *) heap)); heap->free_func(heap->heap_udata, heap); } /* * Allocate a heap. * * String table is initialized with built-in strings from genbuiltins.py, * either by dynamically creating the strings or by referring to ROM strings. */ #if defined(DUK_USE_ROM_STRINGS) DUK_LOCAL duk_bool_t duk__init_heap_strings(duk_heap *heap) { #if defined(DUK_USE_ASSERTIONS) duk_small_uint_t i; #endif DUK_UNREF(heap); /* With ROM-based strings, heap->strs[] and thr->strs[] are omitted * so nothing to initialize for strs[]. */ #if defined(DUK_USE_ASSERTIONS) for (i = 0; i < sizeof(duk_rom_strings_lookup) / sizeof(const duk_hstring *); i++) { const duk_hstring *h; duk_uint32_t hash; h = duk_rom_strings_lookup[i]; while (h != NULL) { hash = duk_heap_hashstring(heap, (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h)); DUK_DD(DUK_DDPRINT("duk_rom_strings_lookup[%d] -> hash 0x%08lx, computed 0x%08lx", (int) i, (unsigned long) DUK_HSTRING_GET_HASH(h), (unsigned long) hash)); DUK_ASSERT(hash == (duk_uint32_t) DUK_HSTRING_GET_HASH(h)); h = (const duk_hstring *) h->hdr.h_next; } } #endif return 1; } #else /* DUK_USE_ROM_STRINGS */ DUK_LOCAL duk_bool_t duk__init_heap_strings(duk_heap *heap) { duk_bitdecoder_ctx bd_ctx; duk_bitdecoder_ctx *bd = &bd_ctx; /* convenience */ duk_small_uint_t i; DUK_MEMZERO(&bd_ctx, sizeof(bd_ctx)); bd->data = (const duk_uint8_t *) duk_strings_data; bd->length = (duk_size_t) DUK_STRDATA_DATA_LENGTH; for (i = 0; i < DUK_HEAP_NUM_STRINGS; i++) { duk_uint8_t tmp[DUK_STRDATA_MAX_STRLEN]; duk_small_uint_t len; duk_hstring *h; len = duk_bd_decode_bitpacked_string(bd, tmp); /* No need to length check string: it will never exceed even * the 16-bit length maximum. */ DUK_ASSERT(len <= 0xffffUL); DUK_DDD(DUK_DDDPRINT("intern built-in string %ld", (long) i)); h = duk_heap_strtable_intern(heap, tmp, len); if (!h) { goto failed; } DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) h)); /* Special flags checks. Since these strings are always * reachable and a string cannot appear twice in the string * table, there's no need to check/set these flags elsewhere. * The 'internal' flag is set by string intern code. */ if (i == DUK_STRIDX_EVAL || i == DUK_STRIDX_LC_ARGUMENTS) { DUK_HSTRING_SET_EVAL_OR_ARGUMENTS(h); } if (i >= DUK_STRIDX_START_RESERVED && i < DUK_STRIDX_END_RESERVED) { DUK_HSTRING_SET_RESERVED_WORD(h); if (i >= DUK_STRIDX_START_STRICT_RESERVED) { DUK_HSTRING_SET_STRICT_RESERVED_WORD(h); } } DUK_DDD(DUK_DDDPRINT("interned: %!O", (duk_heaphdr *) h)); /* XXX: The incref macro takes a thread pointer but doesn't * use it right now. */ DUK_HSTRING_INCREF(_never_referenced_, h); #if defined(DUK_USE_HEAPPTR16) heap->strs16[i] = DUK_USE_HEAPPTR_ENC16(heap->heap_udata, (void *) h); #else heap->strs[i] = h; #endif } return 1; failed: return 0; } #endif /* DUK_USE_ROM_STRINGS */ DUK_LOCAL duk_bool_t duk__init_heap_thread(duk_heap *heap) { duk_hthread *thr; DUK_D(DUK_DPRINT("heap init: alloc heap thread")); thr = duk_hthread_alloc_unchecked(heap, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_THREAD)); if (thr == NULL) { DUK_D(DUK_DPRINT("failed to alloc heap_thread")); return 0; } thr->state = DUK_HTHREAD_STATE_INACTIVE; #if defined(DUK_USE_ROM_STRINGS) /* No strs[] pointer. */ #else /* DUK_USE_ROM_STRINGS */ #if defined(DUK_USE_HEAPPTR16) thr->strs16 = heap->strs16; #else thr->strs = heap->strs; #endif #endif /* DUK_USE_ROM_STRINGS */ heap->heap_thread = thr; DUK_HTHREAD_INCREF(thr, thr); /* Note: first argument not really used */ /* 'thr' is now reachable */ DUK_D(DUK_DPRINT("heap init: init heap thread stacks")); if (!duk_hthread_init_stacks(heap, thr)) { return 0; } /* XXX: this may now fail, and is not handled correctly */ duk_hthread_create_builtin_objects(thr); /* default prototype */ DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) thr, thr->builtins[DUK_BIDX_THREAD_PROTOTYPE]); return 1; } #if defined(DUK_USE_DEBUG) #define DUK__DUMPSZ(t) do { \ DUK_D(DUK_DPRINT("" #t "=%ld", (long) sizeof(t))); \ } while (0) /* These is not 100% because format would need to be non-portable "long long". * Also print out as doubles to catch cases where the "long" type is not wide * enough; the limits will then not be printed accurately but the magnitude * will be correct. */ #define DUK__DUMPLM_SIGNED_RAW(t,a,b) do { \ DUK_D(DUK_DPRINT(t "=[%ld,%ld]=[%lf,%lf]", \ (long) (a), (long) (b), \ (double) (a), (double) (b))); \ } while (0) #define DUK__DUMPLM_UNSIGNED_RAW(t,a,b) do { \ DUK_D(DUK_DPRINT(t "=[%lu,%lu]=[%lf,%lf]", \ (unsigned long) (a), (unsigned long) (b), \ (double) (a), (double) (b))); \ } while (0) #define DUK__DUMPLM_SIGNED(t) do { \ DUK__DUMPLM_SIGNED_RAW("DUK_" #t "_{MIN,MAX}", DUK_##t##_MIN, DUK_##t##_MAX); \ } while (0) #define DUK__DUMPLM_UNSIGNED(t) do { \ DUK__DUMPLM_UNSIGNED_RAW("DUK_" #t "_{MIN,MAX}", DUK_##t##_MIN, DUK_##t##_MAX); \ } while (0) DUK_LOCAL void duk__dump_type_sizes(void) { DUK_D(DUK_DPRINT("sizeof()")); /* basic platform types */ DUK__DUMPSZ(char); DUK__DUMPSZ(short); DUK__DUMPSZ(int); DUK__DUMPSZ(long); DUK__DUMPSZ(double); DUK__DUMPSZ(void *); DUK__DUMPSZ(size_t); /* basic types from duk_features.h */ DUK__DUMPSZ(duk_uint8_t); DUK__DUMPSZ(duk_int8_t); DUK__DUMPSZ(duk_uint16_t); DUK__DUMPSZ(duk_int16_t); DUK__DUMPSZ(duk_uint32_t); DUK__DUMPSZ(duk_int32_t); DUK__DUMPSZ(duk_uint64_t); DUK__DUMPSZ(duk_int64_t); DUK__DUMPSZ(duk_uint_least8_t); DUK__DUMPSZ(duk_int_least8_t); DUK__DUMPSZ(duk_uint_least16_t); DUK__DUMPSZ(duk_int_least16_t); DUK__DUMPSZ(duk_uint_least32_t); DUK__DUMPSZ(duk_int_least32_t); #if defined(DUK_USE_64BIT_OPS) DUK__DUMPSZ(duk_uint_least64_t); DUK__DUMPSZ(duk_int_least64_t); #endif DUK__DUMPSZ(duk_uint_fast8_t); DUK__DUMPSZ(duk_int_fast8_t); DUK__DUMPSZ(duk_uint_fast16_t); DUK__DUMPSZ(duk_int_fast16_t); DUK__DUMPSZ(duk_uint_fast32_t); DUK__DUMPSZ(duk_int_fast32_t); #if defined(DUK_USE_64BIT_OPS) DUK__DUMPSZ(duk_uint_fast64_t); DUK__DUMPSZ(duk_int_fast64_t); #endif DUK__DUMPSZ(duk_uintptr_t); DUK__DUMPSZ(duk_intptr_t); DUK__DUMPSZ(duk_uintmax_t); DUK__DUMPSZ(duk_intmax_t); DUK__DUMPSZ(duk_double_t); /* important chosen base types */ DUK__DUMPSZ(duk_int_t); DUK__DUMPSZ(duk_uint_t); DUK__DUMPSZ(duk_int_fast_t); DUK__DUMPSZ(duk_uint_fast_t); DUK__DUMPSZ(duk_small_int_t); DUK__DUMPSZ(duk_small_uint_t); DUK__DUMPSZ(duk_small_int_fast_t); DUK__DUMPSZ(duk_small_uint_fast_t); /* some derived types */ DUK__DUMPSZ(duk_codepoint_t); DUK__DUMPSZ(duk_ucodepoint_t); DUK__DUMPSZ(duk_idx_t); DUK__DUMPSZ(duk_errcode_t); DUK__DUMPSZ(duk_uarridx_t); /* tval */ DUK__DUMPSZ(duk_double_union); DUK__DUMPSZ(duk_tval); /* structs from duk_forwdecl.h */ DUK__DUMPSZ(duk_jmpbuf); /* just one 'int' for C++ exceptions */ DUK__DUMPSZ(duk_heaphdr); DUK__DUMPSZ(duk_heaphdr_string); DUK__DUMPSZ(duk_hstring); DUK__DUMPSZ(duk_hstring_external); DUK__DUMPSZ(duk_hobject); DUK__DUMPSZ(duk_harray); DUK__DUMPSZ(duk_hcompfunc); DUK__DUMPSZ(duk_hnatfunc); DUK__DUMPSZ(duk_hdecenv); DUK__DUMPSZ(duk_hobjenv); DUK__DUMPSZ(duk_hthread); #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK__DUMPSZ(duk_hbufobj); #endif DUK__DUMPSZ(duk_hproxy); DUK__DUMPSZ(duk_hbuffer); DUK__DUMPSZ(duk_hbuffer_fixed); DUK__DUMPSZ(duk_hbuffer_dynamic); DUK__DUMPSZ(duk_hbuffer_external); DUK__DUMPSZ(duk_propaccessor); DUK__DUMPSZ(duk_propvalue); DUK__DUMPSZ(duk_propdesc); DUK__DUMPSZ(duk_heap); DUK__DUMPSZ(duk_activation); DUK__DUMPSZ(duk_catcher); DUK__DUMPSZ(duk_strcache); DUK__DUMPSZ(duk_ljstate); DUK__DUMPSZ(duk_fixedbuffer); DUK__DUMPSZ(duk_bitdecoder_ctx); DUK__DUMPSZ(duk_bitencoder_ctx); DUK__DUMPSZ(duk_token); DUK__DUMPSZ(duk_re_token); DUK__DUMPSZ(duk_lexer_point); DUK__DUMPSZ(duk_lexer_ctx); DUK__DUMPSZ(duk_compiler_instr); DUK__DUMPSZ(duk_compiler_func); DUK__DUMPSZ(duk_compiler_ctx); DUK__DUMPSZ(duk_re_matcher_ctx); DUK__DUMPSZ(duk_re_compiler_ctx); } DUK_LOCAL void duk__dump_type_limits(void) { DUK_D(DUK_DPRINT("limits")); /* basic types */ DUK__DUMPLM_SIGNED(INT8); DUK__DUMPLM_UNSIGNED(UINT8); DUK__DUMPLM_SIGNED(INT_FAST8); DUK__DUMPLM_UNSIGNED(UINT_FAST8); DUK__DUMPLM_SIGNED(INT_LEAST8); DUK__DUMPLM_UNSIGNED(UINT_LEAST8); DUK__DUMPLM_SIGNED(INT16); DUK__DUMPLM_UNSIGNED(UINT16); DUK__DUMPLM_SIGNED(INT_FAST16); DUK__DUMPLM_UNSIGNED(UINT_FAST16); DUK__DUMPLM_SIGNED(INT_LEAST16); DUK__DUMPLM_UNSIGNED(UINT_LEAST16); DUK__DUMPLM_SIGNED(INT32); DUK__DUMPLM_UNSIGNED(UINT32); DUK__DUMPLM_SIGNED(INT_FAST32); DUK__DUMPLM_UNSIGNED(UINT_FAST32); DUK__DUMPLM_SIGNED(INT_LEAST32); DUK__DUMPLM_UNSIGNED(UINT_LEAST32); #if defined(DUK_USE_64BIT_OPS) DUK__DUMPLM_SIGNED(INT64); DUK__DUMPLM_UNSIGNED(UINT64); DUK__DUMPLM_SIGNED(INT_FAST64); DUK__DUMPLM_UNSIGNED(UINT_FAST64); DUK__DUMPLM_SIGNED(INT_LEAST64); DUK__DUMPLM_UNSIGNED(UINT_LEAST64); #endif DUK__DUMPLM_SIGNED(INTPTR); DUK__DUMPLM_UNSIGNED(UINTPTR); DUK__DUMPLM_SIGNED(INTMAX); DUK__DUMPLM_UNSIGNED(UINTMAX); /* derived types */ DUK__DUMPLM_SIGNED(INT); DUK__DUMPLM_UNSIGNED(UINT); DUK__DUMPLM_SIGNED(INT_FAST); DUK__DUMPLM_UNSIGNED(UINT_FAST); DUK__DUMPLM_SIGNED(SMALL_INT); DUK__DUMPLM_UNSIGNED(SMALL_UINT); DUK__DUMPLM_SIGNED(SMALL_INT_FAST); DUK__DUMPLM_UNSIGNED(SMALL_UINT_FAST); } DUK_LOCAL void duk__dump_misc_options(void) { DUK_D(DUK_DPRINT("DUK_VERSION: %ld", (long) DUK_VERSION)); DUK_D(DUK_DPRINT("DUK_GIT_DESCRIBE: %s", DUK_GIT_DESCRIBE)); DUK_D(DUK_DPRINT("OS string: %s", DUK_USE_OS_STRING)); DUK_D(DUK_DPRINT("architecture string: %s", DUK_USE_ARCH_STRING)); DUK_D(DUK_DPRINT("compiler string: %s", DUK_USE_COMPILER_STRING)); DUK_D(DUK_DPRINT("debug level: %ld", (long) DUK_USE_DEBUG_LEVEL)); #if defined(DUK_USE_PACKED_TVAL) DUK_D(DUK_DPRINT("DUK_USE_PACKED_TVAL: yes")); #else DUK_D(DUK_DPRINT("DUK_USE_PACKED_TVAL: no")); #endif #if defined(DUK_USE_VARIADIC_MACROS) DUK_D(DUK_DPRINT("DUK_USE_VARIADIC_MACROS: yes")); #else DUK_D(DUK_DPRINT("DUK_USE_VARIADIC_MACROS: no")); #endif #if defined(DUK_USE_INTEGER_LE) DUK_D(DUK_DPRINT("integer endianness: little")); #elif defined(DUK_USE_INTEGER_ME) DUK_D(DUK_DPRINT("integer endianness: mixed")); #elif defined(DUK_USE_INTEGER_BE) DUK_D(DUK_DPRINT("integer endianness: big")); #else DUK_D(DUK_DPRINT("integer endianness: ???")); #endif #if defined(DUK_USE_DOUBLE_LE) DUK_D(DUK_DPRINT("IEEE double endianness: little")); #elif defined(DUK_USE_DOUBLE_ME) DUK_D(DUK_DPRINT("IEEE double endianness: mixed")); #elif defined(DUK_USE_DOUBLE_BE) DUK_D(DUK_DPRINT("IEEE double endianness: big")); #else DUK_D(DUK_DPRINT("IEEE double endianness: ???")); #endif } #endif /* DUK_USE_DEBUG */ DUK_INTERNAL duk_heap *duk_heap_alloc(duk_alloc_function alloc_func, duk_realloc_function realloc_func, duk_free_function free_func, void *heap_udata, duk_fatal_function fatal_func) { duk_heap *res = NULL; duk_uint32_t st_initsize; DUK_D(DUK_DPRINT("allocate heap")); /* * Random config sanity asserts */ DUK_ASSERT(DUK_USE_STRTAB_MINSIZE >= 64); DUK_ASSERT((DUK_HTYPE_STRING & 0x01U) == 0); DUK_ASSERT((DUK_HTYPE_BUFFER & 0x01U) == 0); DUK_ASSERT((DUK_HTYPE_OBJECT & 0x01U) == 1); /* DUK_HEAPHDR_IS_OBJECT() relies ont his. */ /* * Debug dump type sizes */ #if defined(DUK_USE_DEBUG) duk__dump_misc_options(); duk__dump_type_sizes(); duk__dump_type_limits(); #endif /* * If selftests enabled, run them as early as possible. */ #if defined(DUK_USE_SELF_TESTS) DUK_D(DUK_DPRINT("run self tests")); if (duk_selftest_run_tests(alloc_func, realloc_func, free_func, heap_udata) > 0) { fatal_func(heap_udata, "self test(s) failed"); } DUK_D(DUK_DPRINT("self tests passed")); #endif /* * Important assert-like checks that should be enabled even * when assertions are otherwise not enabled. */ #if defined(DUK_USE_EXEC_REGCONST_OPTIMIZE) /* Can't check sizeof() using preprocessor so explicit check. * This will be optimized away in practice; unfortunately a * warning is generated on some compilers as a result. */ #if defined(DUK_USE_PACKED_TVAL) if (sizeof(duk_tval) != 8) { #else if (sizeof(duk_tval) != 16) { #endif fatal_func(heap_udata, "sizeof(duk_tval) not 8 or 16, cannot use DUK_USE_EXEC_REGCONST_OPTIMIZE option"); } #endif /* DUK_USE_EXEC_REGCONST_OPTIMIZE */ /* * Computed values (e.g. INFINITY) */ #if defined(DUK_USE_COMPUTED_NAN) do { /* Workaround for some exotic platforms where NAN is missing * and the expression (0.0 / 0.0) does NOT result in a NaN. * Such platforms use the global 'duk_computed_nan' which must * be initialized at runtime. Use 'volatile' to ensure that * the compiler will actually do the computation and not try * to do constant folding which might result in the original * problem. */ volatile double dbl1 = 0.0; volatile double dbl2 = 0.0; duk_computed_nan = dbl1 / dbl2; } while (0); #endif #if defined(DUK_USE_COMPUTED_INFINITY) do { /* Similar workaround for INFINITY. */ volatile double dbl1 = 1.0; volatile double dbl2 = 0.0; duk_computed_infinity = dbl1 / dbl2; } while (0); #endif /* * Allocate heap struct * * Use a raw call, all macros expect the heap to be initialized */ #if defined(DUK_USE_INJECT_HEAP_ALLOC_ERROR) && (DUK_USE_INJECT_HEAP_ALLOC_ERROR == 1) goto failed; #endif DUK_D(DUK_DPRINT("alloc duk_heap object")); res = (duk_heap *) alloc_func(heap_udata, sizeof(duk_heap)); if (!res) { goto failed; } /* * Zero the struct, and start initializing roughly in order */ DUK_MEMZERO(res, sizeof(*res)); #if defined(DUK_USE_ASSERTIONS) res->heap_initializing = 1; #endif /* explicit NULL inits */ #if defined(DUK_USE_EXPLICIT_NULL_INIT) res->heap_udata = NULL; res->heap_allocated = NULL; #if defined(DUK_USE_REFERENCE_COUNTING) res->refzero_list = NULL; #endif #if defined(DUK_USE_FINALIZER_SUPPORT) res->finalize_list = NULL; #if defined(DUK_USE_ASSERTIONS) res->currently_finalizing = NULL; #endif #endif #if defined(DUK_USE_CACHE_ACTIVATION) res->activation_free = NULL; #endif #if defined(DUK_USE_CACHE_CATCHER) res->catcher_free = NULL; #endif res->heap_thread = NULL; res->curr_thread = NULL; res->heap_object = NULL; #if defined(DUK_USE_STRTAB_PTRCOMP) res->strtable16 = NULL; #else res->strtable = NULL; #endif #if defined(DUK_USE_ROM_STRINGS) /* no res->strs[] */ #else /* DUK_USE_ROM_STRINGS */ #if defined(DUK_USE_HEAPPTR16) /* res->strs16[] is zeroed and zero decodes to NULL, so no NULL inits. */ #else { duk_small_uint_t i; for (i = 0; i < DUK_HEAP_NUM_STRINGS; i++) { res->strs[i] = NULL; } } #endif #endif /* DUK_USE_ROM_STRINGS */ #if defined(DUK_USE_DEBUGGER_SUPPORT) res->dbg_read_cb = NULL; res->dbg_write_cb = NULL; res->dbg_peek_cb = NULL; res->dbg_read_flush_cb = NULL; res->dbg_write_flush_cb = NULL; res->dbg_request_cb = NULL; res->dbg_udata = NULL; res->dbg_pause_act = NULL; #endif #endif /* DUK_USE_EXPLICIT_NULL_INIT */ res->alloc_func = alloc_func; res->realloc_func = realloc_func; res->free_func = free_func; res->heap_udata = heap_udata; res->fatal_func = fatal_func; /* XXX: for now there's a pointer packing zero assumption, i.e. * NULL <=> compressed pointer 0. If this is removed, may need * to precompute e.g. null16 here. */ /* res->ms_trigger_counter == 0 -> now causes immediate GC; which is OK */ /* Prevent mark-and-sweep and finalizer execution until heap is completely * initialized. */ DUK_ASSERT(res->ms_prevent_count == 0); DUK_ASSERT(res->pf_prevent_count == 0); res->ms_prevent_count = 1; res->pf_prevent_count = 1; DUK_ASSERT(res->ms_running == 0); res->call_recursion_depth = 0; res->call_recursion_limit = DUK_USE_NATIVE_CALL_RECLIMIT; /* XXX: use the pointer as a seed for now: mix in time at least */ /* The casts through duk_intptr_t is to avoid the following GCC warning: * * warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] * * This still generates a /Wp64 warning on VS2010 when compiling for x86. */ #if defined(DUK_USE_ROM_STRINGS) /* XXX: make a common DUK_USE_ option, and allow custom fixed seed? */ DUK_D(DUK_DPRINT("using rom strings, force heap hash_seed to fixed value 0x%08lx", (long) DUK__FIXED_HASH_SEED)); res->hash_seed = (duk_uint32_t) DUK__FIXED_HASH_SEED; #else /* DUK_USE_ROM_STRINGS */ res->hash_seed = (duk_uint32_t) (duk_intptr_t) res; #if !defined(DUK_USE_STRHASH_DENSE) res->hash_seed ^= 5381; /* Bernstein hash init value is normally 5381; XOR it in in case pointer low bits are 0 */ #endif #endif /* DUK_USE_ROM_STRINGS */ #if defined(DUK_USE_EXPLICIT_NULL_INIT) res->lj.jmpbuf_ptr = NULL; #endif DUK_ASSERT(res->lj.type == DUK_LJ_TYPE_UNKNOWN); /* zero */ DUK_ASSERT(res->lj.iserror == 0); DUK_TVAL_SET_UNDEFINED(&res->lj.value1); DUK_TVAL_SET_UNDEFINED(&res->lj.value2); DUK_ASSERT_LJSTATE_UNSET(res); /* * Init stringtable: fixed variant */ st_initsize = DUK_USE_STRTAB_MINSIZE; #if defined(DUK_USE_STRTAB_PTRCOMP) res->strtable16 = (duk_uint16_t *) alloc_func(heap_udata, sizeof(duk_uint16_t) * st_initsize); if (res->strtable16 == NULL) { goto failed; } #else res->strtable = (duk_hstring **) alloc_func(heap_udata, sizeof(duk_hstring *) * st_initsize); if (res->strtable == NULL) { goto failed; } #endif res->st_size = st_initsize; res->st_mask = st_initsize - 1; #if (DUK_USE_STRTAB_MINSIZE != DUK_USE_STRTAB_MAXSIZE) DUK_ASSERT(res->st_count == 0); #endif #if defined(DUK_USE_STRTAB_PTRCOMP) /* zero assumption */ DUK_MEMZERO(res->strtable16, sizeof(duk_uint16_t) * st_initsize); #else #if defined(DUK_USE_EXPLICIT_NULL_INIT) { duk_small_uint_t i; for (i = 0; i < st_initsize; i++) { res->strtable[i] = NULL; } } #else DUK_MEMZERO(res->strtable, sizeof(duk_hstring *) * st_initsize); #endif /* DUK_USE_EXPLICIT_NULL_INIT */ #endif /* DUK_USE_STRTAB_PTRCOMP */ /* * Init stringcache */ #if defined(DUK_USE_EXPLICIT_NULL_INIT) { duk_small_uint_t i; for (i = 0; i < DUK_HEAP_STRCACHE_SIZE; i++) { res->strcache[i].h = NULL; } } #endif /* XXX: error handling is incomplete. It would be cleanest if * there was a setjmp catchpoint, so that all init code could * freely throw errors. If that were the case, the return code * passing here could be removed. */ /* * Init built-in strings */ #if defined(DUK_USE_INJECT_HEAP_ALLOC_ERROR) && (DUK_USE_INJECT_HEAP_ALLOC_ERROR == 2) goto failed; #endif DUK_D(DUK_DPRINT("heap init: initialize heap strings")); if (!duk__init_heap_strings(res)) { goto failed; } /* * Init the heap thread */ #if defined(DUK_USE_INJECT_HEAP_ALLOC_ERROR) && (DUK_USE_INJECT_HEAP_ALLOC_ERROR == 3) goto failed; #endif DUK_D(DUK_DPRINT("heap init: initialize heap thread")); if (!duk__init_heap_thread(res)) { goto failed; } /* * Init the heap object */ #if defined(DUK_USE_INJECT_HEAP_ALLOC_ERROR) && (DUK_USE_INJECT_HEAP_ALLOC_ERROR == 4) goto failed; #endif DUK_D(DUK_DPRINT("heap init: initialize heap object")); DUK_ASSERT(res->heap_thread != NULL); res->heap_object = duk_hobject_alloc_unchecked(res, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_FASTREFS | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT)); if (res->heap_object == NULL) { goto failed; } DUK_HOBJECT_INCREF(res->heap_thread, res->heap_object); /* * Odds and ends depending on the heap thread */ #if !defined(DUK_USE_GET_RANDOM_DOUBLE) #if defined(DUK_USE_PREFER_SIZE) || !defined(DUK_USE_64BIT_OPS) res->rnd_state = (duk_uint32_t) duk_time_get_ecmascript_time(res->heap_thread); duk_util_tinyrandom_prepare_seed(res->heap_thread); #else res->rnd_state[0] = (duk_uint64_t) duk_time_get_ecmascript_time(res->heap_thread); DUK_ASSERT(res->rnd_state[1] == 0); /* Not filled here, filled in by seed preparation. */ #if 0 /* Manual test values matching misc/xoroshiro128plus_test.c. */ res->rnd_state[0] = DUK_U64_CONSTANT(0xdeadbeef12345678); res->rnd_state[1] = DUK_U64_CONSTANT(0xcafed00d12345678); #endif duk_util_tinyrandom_prepare_seed(res->heap_thread); /* Mix in heap pointer: this ensures that if two Duktape heaps are * created on the same millisecond, they get a different PRNG * sequence (unless e.g. virtual memory addresses cause also the * heap object pointer to be the same). */ { duk_uint64_t tmp_u64; tmp_u64 = 0; DUK_MEMCPY((void *) &tmp_u64, (const void *) &res, (size_t) (sizeof(void *) >= sizeof(duk_uint64_t) ? sizeof(duk_uint64_t) : sizeof(void *))); res->rnd_state[1] ^= tmp_u64; } do { duk_small_uint_t i; for (i = 0; i < 10; i++) { /* Throw away a few initial random numbers just in * case. Probably unnecessary due to SplitMix64 * preparation. */ (void) duk_util_tinyrandom_get_double(res->heap_thread); } } while (0); #endif #endif /* * Allow finalizer and mark-and-sweep processing. */ DUK_D(DUK_DPRINT("heap init: allow finalizer/mark-and-sweep processing")); DUK_ASSERT(res->ms_prevent_count == 1); DUK_ASSERT(res->pf_prevent_count == 1); res->ms_prevent_count = 0; res->pf_prevent_count = 0; DUK_ASSERT(res->ms_running == 0); #if defined(DUK_USE_ASSERTIONS) res->heap_initializing = 0; #endif /* * All done. */ DUK_D(DUK_DPRINT("allocated heap: %p", (void *) res)); return res; failed: DUK_D(DUK_DPRINT("heap allocation failed")); if (res != NULL) { /* Assumes that allocated pointers and alloc funcs are valid * if res exists. */ DUK_ASSERT(res->ms_prevent_count == 1); DUK_ASSERT(res->pf_prevent_count == 1); DUK_ASSERT(res->ms_running == 0); if (res->heap_thread != NULL) { res->ms_prevent_count = 0; res->pf_prevent_count = 0; } #if defined(DUK_USE_ASSERTIONS) res->heap_initializing = 0; #endif DUK_ASSERT(res->alloc_func != NULL); DUK_ASSERT(res->realloc_func != NULL); DUK_ASSERT(res->free_func != NULL); duk_heap_free(res); } return NULL; } /* automatic undefs */ #undef DUK__DUMPLM_SIGNED #undef DUK__DUMPLM_SIGNED_RAW #undef DUK__DUMPLM_UNSIGNED #undef DUK__DUMPLM_UNSIGNED_RAW #undef DUK__DUMPSZ #undef DUK__FIXED_HASH_SEED #line 1 "duk_heap_finalize.c" /* * Finalizer handling. */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_FINALIZER_SUPPORT) /* * Fake torture finalizer. */ #if defined(DUK_USE_FINALIZER_TORTURE) DUK_LOCAL duk_ret_t duk__fake_global_finalizer(duk_hthread *thr) { DUK_DD(DUK_DDPRINT("fake global torture finalizer executed")); /* Require a lot of stack to force a value stack grow/shrink. */ duk_require_stack(thr, 100000); /* Force a reallocation with pointer change for value stack * to maximize side effects. */ duk_hthread_valstack_torture_realloc(thr); /* Inner function call, error throw. */ duk_eval_string_noresult(thr, "(function dummy() {\n" " dummy.prototype = null; /* break reference loop */\n" " try {\n" " throw 'fake-finalizer-dummy-error';\n" " } catch (e) {\n" " void e;\n" " }\n" "})()"); /* The above creates garbage (e.g. a function instance). Because * the function/prototype reference loop is broken, it gets collected * immediately by DECREF. If Function.prototype has a _Finalizer * property (happens in some test cases), the garbage gets queued to * finalize_list. This still won't cause an infinite loop because * the torture finalizer is called once per finalize_list run and * the garbage gets handled in the same run. (If the garbage needs * mark-and-sweep collection, an infinite loop might ensue.) */ return 0; } DUK_LOCAL void duk__run_global_torture_finalizer(duk_hthread *thr) { DUK_ASSERT(thr != NULL); /* Avoid fake finalization when callstack limit is near. Otherwise * a callstack limit error will be created, then refzero'ed. The * +5 headroom is conservative. */ if (thr->heap->call_recursion_depth + 5 >= thr->heap->call_recursion_limit || thr->callstack_top + 5 >= DUK_USE_CALLSTACK_LIMIT) { DUK_D(DUK_DPRINT("skip global torture finalizer, too little headroom for call recursion or call stack size")); return; } /* Run fake finalizer. Avoid creating unnecessary garbage. */ duk_push_c_function(thr, duk__fake_global_finalizer, 0 /*nargs*/); (void) duk_pcall(thr, 0 /*nargs*/); duk_pop(thr); } #endif /* DUK_USE_FINALIZER_TORTURE */ /* * Process the finalize_list to completion. * * An object may be placed on finalize_list by either refcounting or * mark-and-sweep. The refcount of objects placed by refcounting will be * zero; the refcount of objects placed by mark-and-sweep is > 0. In both * cases the refcount is bumped by 1 artificially so that a REFZERO event * can never happen while an object is waiting for finalization. Without * this bump a REFZERO could now happen because user code may call * duk_push_heapptr() and then pop a value even when it's on finalize_list. * * List processing assumes refcounts are kept up-to-date at all times, so * that once the finalizer returns, a zero refcount is a reliable reason to * free the object immediately rather than place it back to the heap. This * is the case because we run outside of refzero_list processing so that * DECREF cascades are handled fully inline. * * For mark-and-sweep queued objects (had_zero_refcount false) the object * may be freed immediately if its refcount is zero after the finalizer call * (i.e. finalizer removed the reference loop for the object). If not, the * next mark-and-sweep will collect the object unless it has become reachable * (i.e. rescued) by that time and its refcount hasn't fallen to zero before * that. Mark-and-sweep detects these objects because their FINALIZED flag * is set. * * There's an inherent limitation for mark-and-sweep finalizer rescuing: an * object won't get refinalized if (1) it's rescued, but (2) becomes * unreachable before mark-and-sweep has had time to notice it. The next * mark-and-sweep round simply doesn't have any information of whether the * object has been unreachable the whole time or not (the only way to get * that information would be a mark-and-sweep pass for *every finalized * object*). This is awkward for the application because the mark-and-sweep * round is not generally visible or under full application control. * * For refcount queued objects (had_zero_refcount true) the object is either * immediately freed or rescued, and waiting for a mark-and-sweep round is not * necessary (or desirable); FINALIZED is cleared when a rescued object is * queued back to heap_allocated. The object is eligible for finalization * again (either via refcounting or mark-and-sweep) immediately after being * rescued. If a refcount finalized object is placed into an unreachable * reference loop by its finalizer, it will get collected by mark-and-sweep * and currently the finalizer will execute again. * * There's a special case where: * * - Mark-and-sweep queues an object to finalize_list for finalization. * - The finalizer is executed, FINALIZED is set, and object is queued * back to heap_allocated, waiting for a new mark-and-sweep round. * - The object's refcount drops to zero before mark-and-sweep has a * chance to run another round and make a rescue/free decision. * * This is now handled by refzero code: if an object has a finalizer but * FINALIZED is already set, the object is freed without finalizer processing. * The outcome is the same as if mark-and-sweep was executed at that point; * mark-and-sweep would also free the object without another finalizer run. * This could also be changed so that the refzero-triggered finalizer *IS* * executed: being refzero collected implies someone has operated on the * object so it hasn't been totally unreachable the whole time. This would * risk a finalizer loop however. */ DUK_INTERNAL void duk_heap_process_finalize_list(duk_heap *heap) { duk_heaphdr *curr; #if defined(DUK_USE_DEBUG) duk_size_t count = 0; #endif DUK_DDD(DUK_DDDPRINT("duk_heap_process_finalize_list: %p", (void *) heap)); if (heap->pf_prevent_count != 0) { DUK_DDD(DUK_DDDPRINT("skip finalize_list processing: pf_prevent_count != 0")); return; } /* Heap alloc prevents mark-and-sweep before heap_thread is ready. */ DUK_ASSERT(heap != NULL); DUK_ASSERT(heap->heap_thread != NULL); DUK_ASSERT(heap->heap_thread->valstack != NULL); #if defined(DUK_USE_REFERENCE_COUNTING) DUK_ASSERT(heap->refzero_list == NULL); #endif DUK_ASSERT(heap->pf_prevent_count == 0); heap->pf_prevent_count = 1; /* Mark-and-sweep no longer needs to be prevented when running * finalizers: mark-and-sweep skips any rescue decisions if there * are any objects in finalize_list when mark-and-sweep is entered. * This protects finalized objects from incorrect rescue decisions * caused by finalize_list being a reachability root and only * partially processed. Freeing decisions are not postponed. */ /* When finalizer torture is enabled, make a fake finalizer call with * maximum side effects regardless of whether finalize_list is empty. */ #if defined(DUK_USE_FINALIZER_TORTURE) duk__run_global_torture_finalizer(heap->heap_thread); #endif /* Process finalize_list until it becomes empty. There's currently no * protection against a finalizer always creating more garbage. */ while ((curr = heap->finalize_list) != NULL) { #if defined(DUK_USE_REFERENCE_COUNTING) duk_bool_t queue_back; #endif DUK_DD(DUK_DDPRINT("processing finalize_list entry: %p -> %!iO", (void *) curr, curr)); DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(curr) == DUK_HTYPE_OBJECT); /* Only objects have finalizers. */ DUK_ASSERT(!DUK_HEAPHDR_HAS_REACHABLE(curr)); DUK_ASSERT(!DUK_HEAPHDR_HAS_TEMPROOT(curr)); DUK_ASSERT(DUK_HEAPHDR_HAS_FINALIZABLE(curr)); /* All objects on finalize_list will have this flag (except object being finalized right now). */ DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZED(curr)); /* Queueing code ensures. */ DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY(curr)); /* ROM objects never get freed (or finalized). */ #if defined(DUK_USE_ASSERTIONS) DUK_ASSERT(heap->currently_finalizing == NULL); heap->currently_finalizing = curr; #endif /* Clear FINALIZABLE for object being finalized, so that * duk_push_heapptr() can properly ignore the object. */ DUK_HEAPHDR_CLEAR_FINALIZABLE(curr); if (DUK_LIKELY(!heap->pf_skip_finalizers)) { /* Run the finalizer, duk_heap_run_finalizer() sets * and checks for FINALIZED to prevent the finalizer * from executing multiple times per finalization cycle. * (This safeguard shouldn't be actually needed anymore). */ #if defined(DUK_USE_REFERENCE_COUNTING) duk_bool_t had_zero_refcount; #endif /* The object's refcount is >0 throughout so it won't be * refzero processed prematurely. */ #if defined(DUK_USE_REFERENCE_COUNTING) DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(curr) >= 1); had_zero_refcount = (DUK_HEAPHDR_GET_REFCOUNT(curr) == 1); /* Preincremented on finalize_list insert. */ #endif DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZED(curr)); duk_heap_run_finalizer(heap, (duk_hobject *) curr); /* must never longjmp */ DUK_ASSERT(DUK_HEAPHDR_HAS_FINALIZED(curr)); /* XXX: assert that object is still in finalize_list * when duk_push_heapptr() allows automatic rescue. */ #if defined(DUK_USE_REFERENCE_COUNTING) DUK_DD(DUK_DDPRINT("refcount after finalizer (includes bump): %ld", (long) DUK_HEAPHDR_GET_REFCOUNT(curr))); if (DUK_HEAPHDR_GET_REFCOUNT(curr) == 1) { /* Only artificial bump in refcount? */ #if defined(DUK_USE_DEBUG) if (had_zero_refcount) { DUK_DD(DUK_DDPRINT("finalized object's refcount is zero -> free immediately (refcount queued)")); } else { DUK_DD(DUK_DDPRINT("finalized object's refcount is zero -> free immediately (mark-and-sweep queued)")); } #endif queue_back = 0; } else #endif { #if defined(DUK_USE_REFERENCE_COUNTING) queue_back = 1; if (had_zero_refcount) { /* When finalization is triggered * by refzero and we queue the object * back, clear FINALIZED right away * so that the object can be refinalized * immediately if necessary. */ DUK_HEAPHDR_CLEAR_FINALIZED(curr); } #endif } } else { /* Used during heap destruction: don't actually run finalizers * because we're heading into forced finalization. Instead, * queue finalizable objects back to the heap_allocated list. */ DUK_D(DUK_DPRINT("skip finalizers flag set, queue object to heap_allocated without finalizing")); DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZED(curr)); #if defined(DUK_USE_REFERENCE_COUNTING) queue_back = 1; #endif } /* Dequeue object from finalize_list. Note that 'curr' may no * longer be finalize_list head because new objects may have * been queued to the list. As a result we can't optimize for * the single-linked heap case and must scan the list for * removal, typically the scan is very short however. */ DUK_HEAP_REMOVE_FROM_FINALIZE_LIST(heap, curr); /* Queue back to heap_allocated or free immediately. */ #if defined(DUK_USE_REFERENCE_COUNTING) if (queue_back) { /* FINALIZED is only cleared if object originally * queued for finalization by refcounting. For * mark-and-sweep FINALIZED is left set, so that * next mark-and-sweep round can make a rescue/free * decision. */ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(curr) >= 1); DUK_HEAPHDR_PREDEC_REFCOUNT(curr); /* Remove artificial refcount bump. */ DUK_HEAPHDR_CLEAR_FINALIZABLE(curr); DUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(heap, curr); } else { /* No need to remove the refcount bump here. */ DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(curr) == DUK_HTYPE_OBJECT); /* currently, always the case */ DUK_DD(DUK_DDPRINT("refcount finalize after finalizer call: %!O", curr)); duk_hobject_refcount_finalize_norz(heap, (duk_hobject *) curr); duk_free_hobject(heap, (duk_hobject *) curr); DUK_DD(DUK_DDPRINT("freed hobject after finalization: %p", (void *) curr)); } #else /* DUK_USE_REFERENCE_COUNTING */ DUK_HEAPHDR_CLEAR_FINALIZABLE(curr); DUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(heap, curr); #endif /* DUK_USE_REFERENCE_COUNTING */ #if defined(DUK_USE_DEBUG) count++; #endif #if defined(DUK_USE_ASSERTIONS) DUK_ASSERT(heap->currently_finalizing != NULL); heap->currently_finalizing = NULL; #endif } /* finalize_list will always be processed completely. */ DUK_ASSERT(heap->finalize_list == NULL); #if 0 /* While NORZ macros are used above, this is unnecessary because the * only pending side effects are now finalizers, and finalize_list is * empty. */ DUK_REFZERO_CHECK_SLOW(heap->heap_thread); #endif /* Prevent count may be bumped while finalizers run, but should always * be reliably unbumped by the time we get here. */ DUK_ASSERT(heap->pf_prevent_count == 1); heap->pf_prevent_count = 0; #if defined(DUK_USE_DEBUG) DUK_DD(DUK_DDPRINT("duk_heap_process_finalize_list: %ld finalizers called", (long) count)); #endif } /* * Run an duk_hobject finalizer. Must never throw an uncaught error * (but may throw caught errors). * * There is no return value. Any return value or error thrown by * the finalizer is ignored (although errors are debug logged). * * Notes: * * - The finalizer thread 'top' assertions are there because it is * critical that strict stack policy is observed (i.e. no cruft * left on the finalizer stack). */ DUK_LOCAL duk_ret_t duk__finalize_helper(duk_hthread *thr, void *udata) { DUK_ASSERT(thr != NULL); DUK_UNREF(udata); DUK_DDD(DUK_DDDPRINT("protected finalization helper running")); /* [... obj] */ /* _Finalizer property is read without checking if the value is * callable or even exists. This is intentional, and handled * by throwing an error which is caught by the safe call wrapper. * * XXX: Finalizer lookup should traverse the prototype chain (to allow * inherited finalizers) but should not invoke accessors or proxy object * behavior. At the moment this lookup will invoke proxy behavior, so * caller must ensure that this function is not called if the target is * a Proxy. */ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_FINALIZER); /* -> [... obj finalizer] */ duk_dup_m2(thr); duk_push_boolean(thr, DUK_HEAP_HAS_FINALIZER_NORESCUE(thr->heap)); DUK_DDD(DUK_DDDPRINT("calling finalizer")); duk_call(thr, 2); /* [ ... obj finalizer obj heapDestruct ] -> [ ... obj retval ] */ DUK_DDD(DUK_DDDPRINT("finalizer returned successfully")); return 0; /* Note: we rely on duk_safe_call() to fix up the stack for the caller, * so we don't need to pop stuff here. There is no return value; * caller determines rescued status based on object refcount. */ } DUK_INTERNAL void duk_heap_run_finalizer(duk_heap *heap, duk_hobject *obj) { duk_hthread *thr; duk_ret_t rc; #if defined(DUK_USE_ASSERTIONS) duk_idx_t entry_top; #endif DUK_DD(DUK_DDPRINT("running duk_hobject finalizer for object: %p", (void *) obj)); DUK_ASSERT(heap != NULL); DUK_ASSERT(heap->heap_thread != NULL); thr = heap->heap_thread; DUK_ASSERT(obj != NULL); DUK_ASSERT_VALSTACK_SPACE(heap->heap_thread, 1); #if defined(DUK_USE_ASSERTIONS) entry_top = duk_get_top(thr); #endif /* * Get and call the finalizer. All of this must be wrapped * in a protected call, because even getting the finalizer * may trigger an error (getter may throw one, for instance). */ /* ROM objects could inherit a finalizer, but they are never deemed * unreachable by mark-and-sweep, and their refcount never falls to 0. */ DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)); /* Duktape 2.1: finalize_list never contains objects with FINALIZED * set, so no need to check here. */ DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZED((duk_heaphdr *) obj)); #if 0 if (DUK_HEAPHDR_HAS_FINALIZED((duk_heaphdr *) obj)) { DUK_D(DUK_DPRINT("object already finalized, avoid running finalizer twice: %!O", obj)); return; } #endif DUK_HEAPHDR_SET_FINALIZED((duk_heaphdr *) obj); /* ensure never re-entered until rescue cycle complete */ #if defined(DUK_USE_ES6_PROXY) if (DUK_HOBJECT_IS_PROXY(obj)) { /* This may happen if duk_set_finalizer() or Duktape.fin() is * called for a Proxy object. In such cases the fast finalizer * flag will be set on the Proxy, not the target, and neither * will be finalized. */ DUK_D(DUK_DPRINT("object is a Proxy, skip finalizer call")); return; } #endif /* DUK_USE_ES6_PROXY */ duk_push_hobject(thr, obj); /* this also increases refcount by one */ rc = duk_safe_call(thr, duk__finalize_helper, NULL /*udata*/, 0 /*nargs*/, 1 /*nrets*/); /* -> [... obj retval/error] */ DUK_ASSERT_TOP(thr, entry_top + 2); /* duk_safe_call discipline */ if (rc != DUK_EXEC_SUCCESS) { /* Note: we ask for one return value from duk_safe_call to get this * error debugging here. */ DUK_D(DUK_DPRINT("wrapped finalizer call failed for object %p (ignored); error: %!T", (void *) obj, (duk_tval *) duk_get_tval(thr, -1))); } duk_pop_2(thr); /* -> [...] */ DUK_ASSERT_TOP(thr, entry_top); } #else /* DUK_USE_FINALIZER_SUPPORT */ /* nothing */ #endif /* DUK_USE_FINALIZER_SUPPORT */ #line 1 "duk_heap_hashstring.c" /* * String hash computation (interning). * * String hashing is performance critical because a string hash is computed * for all new strings which are candidates to be added to the string table. * However, strings actually added to the string table go through a codepoint * length calculation which dominates performance because it goes through * every byte of the input string (but only for strings added). * * The string hash algorithm should be fast, but on the other hand provide * good enough hashes to ensure both string table and object property table * hash tables work reasonably well (i.e., there aren't too many collisions * with real world inputs). Unless the hash is cryptographic, it's always * possible to craft inputs with maximal hash collisions. * * NOTE: The hash algorithms must match tools/dukutil.py:duk_heap_hashstring() * for ROM string support! */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_STRHASH_DENSE) /* Constants for duk_hashstring(). */ #define DUK__STRHASH_SHORTSTRING 4096L #define DUK__STRHASH_MEDIUMSTRING (256L * 1024L) #define DUK__STRHASH_BLOCKSIZE 256L DUK_INTERNAL duk_uint32_t duk_heap_hashstring(duk_heap *heap, const duk_uint8_t *str, duk_size_t len) { duk_uint32_t hash; /* Use Murmurhash2 directly for short strings, and use "block skipping" * for long strings: hash an initial part and then sample the rest of * the string with reasonably sized chunks. An initial offset for the * sampling is computed based on a hash of the initial part of the string; * this is done to (usually) avoid the case where all long strings have * certain offset ranges which are never sampled. * * Skip should depend on length and bound the total time to roughly * logarithmic. With current values: * * 1M string => 256 * 241 = 61696 bytes (0.06M) of hashing * 1G string => 256 * 16321 = 4178176 bytes (3.98M) of hashing * * XXX: It would be better to compute the skip offset more "smoothly" * instead of having a few boundary values. */ /* note: mixing len into seed improves hashing when skipping */ duk_uint32_t str_seed = heap->hash_seed ^ ((duk_uint32_t) len); if (len <= DUK__STRHASH_SHORTSTRING) { hash = duk_util_hashbytes(str, len, str_seed); } else { duk_size_t off; duk_size_t skip; if (len <= DUK__STRHASH_MEDIUMSTRING) { skip = (duk_size_t) (16 * DUK__STRHASH_BLOCKSIZE + DUK__STRHASH_BLOCKSIZE); } else { skip = (duk_size_t) (256 * DUK__STRHASH_BLOCKSIZE + DUK__STRHASH_BLOCKSIZE); } hash = duk_util_hashbytes(str, (duk_size_t) DUK__STRHASH_SHORTSTRING, str_seed); off = DUK__STRHASH_SHORTSTRING + (skip * (hash % 256)) / 256; /* XXX: inefficient loop */ while (off < len) { duk_size_t left = len - off; duk_size_t now = (duk_size_t) (left > DUK__STRHASH_BLOCKSIZE ? DUK__STRHASH_BLOCKSIZE : left); hash ^= duk_util_hashbytes(str + off, now, str_seed); off += skip; } } #if defined(DUK_USE_STRHASH16) /* Truncate to 16 bits here, so that a computed hash can be compared * against a hash stored in a 16-bit field. */ hash &= 0x0000ffffUL; #endif return hash; } #else /* DUK_USE_STRHASH_DENSE */ DUK_INTERNAL duk_uint32_t duk_heap_hashstring(duk_heap *heap, const duk_uint8_t *str, duk_size_t len) { duk_uint32_t hash; duk_size_t step; duk_size_t off; /* Slightly modified "Bernstein hash" from: * * http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx * * Modifications: string skipping and reverse direction similar to * Lua 5.1.5, and different hash initializer. * * The reverse direction ensures last byte it always included in the * hash which is a good default as changing parts of the string are * more often in the suffix than in the prefix. */ hash = heap->hash_seed ^ ((duk_uint32_t) len); /* Bernstein hash init value is normally 5381 */ step = (len >> DUK_USE_STRHASH_SKIP_SHIFT) + 1; for (off = len; off >= step; off -= step) { DUK_ASSERT(off >= 1); /* off >= step, and step >= 1 */ hash = (hash * 33) + str[off - 1]; } #if defined(DUK_USE_STRHASH16) /* Truncate to 16 bits here, so that a computed hash can be compared * against a hash stored in a 16-bit field. */ hash &= 0x0000ffffUL; #endif return hash; } #endif /* DUK_USE_STRHASH_DENSE */ /* automatic undefs */ #undef DUK__STRHASH_BLOCKSIZE #undef DUK__STRHASH_MEDIUMSTRING #undef DUK__STRHASH_SHORTSTRING #line 1 "duk_heap_markandsweep.c" /* * Mark-and-sweep garbage collection. */ /* #include duk_internal.h -> already included */ DUK_LOCAL_DECL void duk__mark_heaphdr(duk_heap *heap, duk_heaphdr *h); DUK_LOCAL_DECL void duk__mark_heaphdr_nonnull(duk_heap *heap, duk_heaphdr *h); DUK_LOCAL_DECL void duk__mark_tval(duk_heap *heap, duk_tval *tv); DUK_LOCAL_DECL void duk__mark_tvals(duk_heap *heap, duk_tval *tv, duk_idx_t count); /* * Marking functions for heap types: mark children recursively. */ DUK_LOCAL void duk__mark_hstring(duk_heap *heap, duk_hstring *h) { DUK_UNREF(heap); DUK_UNREF(h); DUK_DDD(DUK_DDDPRINT("duk__mark_hstring: %p", (void *) h)); DUK_ASSERT(h); /* nothing to process */ } DUK_LOCAL void duk__mark_hobject(duk_heap *heap, duk_hobject *h) { duk_uint_fast32_t i; DUK_DDD(DUK_DDDPRINT("duk__mark_hobject: %p", (void *) h)); DUK_ASSERT(h); /* XXX: use advancing pointers instead of index macros -> faster and smaller? */ for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ENEXT(h); i++) { duk_hstring *key = DUK_HOBJECT_E_GET_KEY(heap, h, i); if (key == NULL) { continue; } duk__mark_heaphdr_nonnull(heap, (duk_heaphdr *) key); if (DUK_HOBJECT_E_SLOT_IS_ACCESSOR(heap, h, i)) { duk__mark_heaphdr(heap, (duk_heaphdr *) DUK_HOBJECT_E_GET_VALUE_PTR(heap, h, i)->a.get); duk__mark_heaphdr(heap, (duk_heaphdr *) DUK_HOBJECT_E_GET_VALUE_PTR(heap, h, i)->a.set); } else { duk__mark_tval(heap, &DUK_HOBJECT_E_GET_VALUE_PTR(heap, h, i)->v); } } for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ASIZE(h); i++) { duk__mark_tval(heap, DUK_HOBJECT_A_GET_VALUE_PTR(heap, h, i)); } /* Hash part is a 'weak reference' and does not contribute. */ duk__mark_heaphdr(heap, (duk_heaphdr *) DUK_HOBJECT_GET_PROTOTYPE(heap, h)); /* Fast path for objects which don't have a subclass struct, or have a * subclass struct but nothing that needs marking in the subclass struct. */ if (DUK_HOBJECT_HAS_FASTREFS(h)) { DUK_ASSERT(DUK_HOBJECT_ALLOWS_FASTREFS(h)); return; } DUK_ASSERT(DUK_HOBJECT_PROHIBITS_FASTREFS(h)); /* XXX: reorg, more common first */ if (DUK_HOBJECT_IS_COMPFUNC(h)) { duk_hcompfunc *f = (duk_hcompfunc *) h; duk_tval *tv, *tv_end; duk_hobject **fn, **fn_end; DUK_ASSERT_HCOMPFUNC_VALID(f); /* 'data' is reachable through every compiled function which * contains a reference. */ duk__mark_heaphdr(heap, (duk_heaphdr *) DUK_HCOMPFUNC_GET_DATA(heap, f)); duk__mark_heaphdr(heap, (duk_heaphdr *) DUK_HCOMPFUNC_GET_LEXENV(heap, f)); duk__mark_heaphdr(heap, (duk_heaphdr *) DUK_HCOMPFUNC_GET_VARENV(heap, f)); if (DUK_HCOMPFUNC_GET_DATA(heap, f) != NULL) { tv = DUK_HCOMPFUNC_GET_CONSTS_BASE(heap, f); tv_end = DUK_HCOMPFUNC_GET_CONSTS_END(heap, f); while (tv < tv_end) { duk__mark_tval(heap, tv); tv++; } fn = DUK_HCOMPFUNC_GET_FUNCS_BASE(heap, f); fn_end = DUK_HCOMPFUNC_GET_FUNCS_END(heap, f); while (fn < fn_end) { duk__mark_heaphdr_nonnull(heap, (duk_heaphdr *) *fn); fn++; } } else { /* May happen in some out-of-memory corner cases. */ DUK_D(DUK_DPRINT("duk_hcompfunc 'data' is NULL, skipping marking")); } } else if (DUK_HOBJECT_IS_DECENV(h)) { duk_hdecenv *e = (duk_hdecenv *) h; DUK_ASSERT_HDECENV_VALID(e); duk__mark_heaphdr(heap, (duk_heaphdr *) e->thread); duk__mark_heaphdr(heap, (duk_heaphdr *) e->varmap); } else if (DUK_HOBJECT_IS_OBJENV(h)) { duk_hobjenv *e = (duk_hobjenv *) h; DUK_ASSERT_HOBJENV_VALID(e); duk__mark_heaphdr_nonnull(heap, (duk_heaphdr *) e->target); #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) } else if (DUK_HOBJECT_IS_BUFOBJ(h)) { duk_hbufobj *b = (duk_hbufobj *) h; DUK_ASSERT_HBUFOBJ_VALID(b); duk__mark_heaphdr(heap, (duk_heaphdr *) b->buf); duk__mark_heaphdr(heap, (duk_heaphdr *) b->buf_prop); #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ } else if (DUK_HOBJECT_IS_BOUNDFUNC(h)) { duk_hboundfunc *f = (duk_hboundfunc *) h; DUK_ASSERT_HBOUNDFUNC_VALID(f); duk__mark_tval(heap, &f->target); duk__mark_tval(heap, &f->this_binding); duk__mark_tvals(heap, f->args, f->nargs); #if defined(DUK_USE_ES6_PROXY) } else if (DUK_HOBJECT_IS_PROXY(h)) { duk_hproxy *p = (duk_hproxy *) h; DUK_ASSERT_HPROXY_VALID(p); duk__mark_heaphdr_nonnull(heap, (duk_heaphdr *) p->target); duk__mark_heaphdr_nonnull(heap, (duk_heaphdr *) p->handler); #endif /* DUK_USE_ES6_PROXY */ } else if (DUK_HOBJECT_IS_THREAD(h)) { duk_hthread *t = (duk_hthread *) h; duk_activation *act; duk_tval *tv; DUK_ASSERT_HTHREAD_VALID(t); tv = t->valstack; while (tv < t->valstack_top) { duk__mark_tval(heap, tv); tv++; } for (act = t->callstack_curr; act != NULL; act = act->parent) { duk__mark_heaphdr(heap, (duk_heaphdr *) DUK_ACT_GET_FUNC(act)); duk__mark_heaphdr(heap, (duk_heaphdr *) act->var_env); duk__mark_heaphdr(heap, (duk_heaphdr *) act->lex_env); #if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY) duk__mark_heaphdr(heap, (duk_heaphdr *) act->prev_caller); #endif #if 0 /* nothing now */ for (cat = act->cat; cat != NULL; cat = cat->parent) { } #endif } duk__mark_heaphdr(heap, (duk_heaphdr *) t->resumer); for (i = 0; i < DUK_NUM_BUILTINS; i++) { duk__mark_heaphdr(heap, (duk_heaphdr *) t->builtins[i]); } } else { /* We may come here if the object should have a FASTREFS flag * but it's missing for some reason. Assert for never getting * here; however, other than performance, this is harmless. */ DUK_D(DUK_DPRINT("missing FASTREFS flag for: %!iO", h)); DUK_ASSERT(0); } } /* Mark any duk_heaphdr type. Recursion tracking happens only here. */ DUK_LOCAL void duk__mark_heaphdr(duk_heap *heap, duk_heaphdr *h) { DUK_DDD(DUK_DDDPRINT("duk__mark_heaphdr %p, type %ld", (void *) h, (h != NULL ? (long) DUK_HEAPHDR_GET_TYPE(h) : (long) -1))); /* XXX: add non-null variant? */ if (h == NULL) { return; } DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY(h) || DUK_HEAPHDR_HAS_REACHABLE(h)); #if defined(DUK_USE_ASSERTIONS) && defined(DUK_USE_REFERENCE_COUNTING) if (!DUK_HEAPHDR_HAS_READONLY(h)) { h->h_assert_refcount++; /* Comparison refcount: bump even if already reachable. */ } #endif if (DUK_HEAPHDR_HAS_REACHABLE(h)) { DUK_DDD(DUK_DDDPRINT("already marked reachable, skip")); return; } #if defined(DUK_USE_ROM_OBJECTS) /* READONLY objects always have REACHABLE set, so the check above * will prevent READONLY objects from being marked here. */ DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY(h)); #endif DUK_HEAPHDR_SET_REACHABLE(h); if (heap->ms_recursion_depth >= DUK_USE_MARK_AND_SWEEP_RECLIMIT) { DUK_D(DUK_DPRINT("mark-and-sweep recursion limit reached, marking as temproot: %p", (void *) h)); DUK_HEAP_SET_MARKANDSWEEP_RECLIMIT_REACHED(heap); DUK_HEAPHDR_SET_TEMPROOT(h); return; } heap->ms_recursion_depth++; DUK_ASSERT(heap->ms_recursion_depth != 0); /* Wrap. */ switch (DUK_HEAPHDR_GET_TYPE(h)) { case DUK_HTYPE_STRING: duk__mark_hstring(heap, (duk_hstring *) h); break; case DUK_HTYPE_OBJECT: duk__mark_hobject(heap, (duk_hobject *) h); break; case DUK_HTYPE_BUFFER: /* nothing to mark */ break; default: DUK_D(DUK_DPRINT("attempt to mark heaphdr %p with invalid htype %ld", (void *) h, (long) DUK_HEAPHDR_GET_TYPE(h))); DUK_UNREACHABLE(); } DUK_ASSERT(heap->ms_recursion_depth > 0); heap->ms_recursion_depth--; } DUK_LOCAL void duk__mark_tval(duk_heap *heap, duk_tval *tv) { DUK_DDD(DUK_DDDPRINT("duk__mark_tval %p", (void *) tv)); if (tv == NULL) { return; } if (DUK_TVAL_IS_HEAP_ALLOCATED(tv)) { duk_heaphdr *h; h = DUK_TVAL_GET_HEAPHDR(tv); DUK_ASSERT(h != NULL); duk__mark_heaphdr_nonnull(heap, h); } } DUK_LOCAL void duk__mark_tvals(duk_heap *heap, duk_tval *tv, duk_idx_t count) { DUK_ASSERT(count == 0 || tv != NULL); while (count-- > 0) { if (DUK_TVAL_IS_HEAP_ALLOCATED(tv)) { duk_heaphdr *h; h = DUK_TVAL_GET_HEAPHDR(tv); DUK_ASSERT(h != NULL); duk__mark_heaphdr_nonnull(heap, h); } tv++; } } /* Mark any duk_heaphdr type, caller guarantees a non-NULL pointer. */ DUK_LOCAL void duk__mark_heaphdr_nonnull(duk_heap *heap, duk_heaphdr *h) { /* For now, just call the generic handler. Change when call sites * are changed too. */ duk__mark_heaphdr(heap, h); } /* * Mark the heap. */ DUK_LOCAL void duk__mark_roots_heap(duk_heap *heap) { duk_small_uint_t i; DUK_DD(DUK_DDPRINT("duk__mark_roots_heap: %p", (void *) heap)); duk__mark_heaphdr(heap, (duk_heaphdr *) heap->heap_thread); duk__mark_heaphdr(heap, (duk_heaphdr *) heap->heap_object); for (i = 0; i < DUK_HEAP_NUM_STRINGS; i++) { duk_hstring *h = DUK_HEAP_GET_STRING(heap, i); duk__mark_heaphdr(heap, (duk_heaphdr *) h); } duk__mark_tval(heap, &heap->lj.value1); duk__mark_tval(heap, &heap->lj.value2); #if defined(DUK_USE_DEBUGGER_SUPPORT) for (i = 0; i < heap->dbg_breakpoint_count; i++) { duk__mark_heaphdr(heap, (duk_heaphdr *) heap->dbg_breakpoints[i].filename); } #endif } /* * Mark unreachable, finalizable objects. * * Such objects will be moved aside and their finalizers run later. They * have to be treated as reachability roots for their properties etc to * remain allocated. This marking is only done for unreachable values which * would be swept later. * * Objects are first marked FINALIZABLE and only then marked as reachability * roots; otherwise circular references might be handled inconsistently. */ #if defined(DUK_USE_FINALIZER_SUPPORT) DUK_LOCAL void duk__mark_finalizable(duk_heap *heap) { duk_heaphdr *hdr; duk_size_t count_finalizable = 0; DUK_DD(DUK_DDPRINT("duk__mark_finalizable: %p", (void *) heap)); DUK_ASSERT(heap->heap_thread != NULL); hdr = heap->heap_allocated; while (hdr != NULL) { /* A finalizer is looked up from the object and up its * prototype chain (which allows inherited finalizers). * The finalizer is checked for using a duk_hobject flag * which is kept in sync with the presence and callability * of a _Finalizer hidden symbol. */ if (!DUK_HEAPHDR_HAS_REACHABLE(hdr) && DUK_HEAPHDR_IS_OBJECT(hdr) && !DUK_HEAPHDR_HAS_FINALIZED(hdr) && DUK_HOBJECT_HAS_FINALIZER_FAST(heap, (duk_hobject *) hdr)) { /* heaphdr: * - is not reachable * - is an object * - is not a finalized object waiting for rescue/keep decision * - has a finalizer */ DUK_DD(DUK_DDPRINT("unreachable heap object will be " "finalized -> mark as finalizable " "and treat as a reachability root: %p", (void *) hdr)); DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY(hdr)); DUK_HEAPHDR_SET_FINALIZABLE(hdr); count_finalizable++; } hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr); } if (count_finalizable == 0) { return; } DUK_DD(DUK_DDPRINT("marked %ld heap objects as finalizable, now mark them reachable", (long) count_finalizable)); hdr = heap->heap_allocated; while (hdr != NULL) { if (DUK_HEAPHDR_HAS_FINALIZABLE(hdr)) { duk__mark_heaphdr_nonnull(heap, hdr); } hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr); } /* Caller will finish the marking process if we hit a recursion limit. */ } #endif /* DUK_USE_FINALIZER_SUPPORT */ /* * Mark objects on finalize_list. */ #if defined(DUK_USE_FINALIZER_SUPPORT) DUK_LOCAL void duk__mark_finalize_list(duk_heap *heap) { duk_heaphdr *hdr; #if defined(DUK_USE_DEBUG) duk_size_t count_finalize_list = 0; #endif DUK_DD(DUK_DDPRINT("duk__mark_finalize_list: %p", (void *) heap)); hdr = heap->finalize_list; while (hdr != NULL) { duk__mark_heaphdr_nonnull(heap, hdr); hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr); #if defined(DUK_USE_DEBUG) count_finalize_list++; #endif } #if defined(DUK_USE_DEBUG) if (count_finalize_list > 0) { DUK_D(DUK_DPRINT("marked %ld objects on the finalize_list as reachable (previous finalizer run skipped)", (long) count_finalize_list)); } #endif } #endif /* DUK_USE_FINALIZER_SUPPORT */ /* * Fallback marking handler if recursion limit is reached. * * Iterates 'temproots' until recursion limit is no longer hit. Temproots * can be in heap_allocated or finalize_list; refzero_list is now always * empty for mark-and-sweep. A temproot may occur in finalize_list now if * there are objects on the finalize_list and user code creates a reference * from an object in heap_allocated to the object in finalize_list (which is * now allowed), and it happened to coincide with the recursion depth limit. * * This is a slow scan, but guarantees that we finish with a bounded C stack. * * Note that nodes may have been marked as temproots before this scan begun, * OR they may have been marked during the scan (as we process nodes * recursively also during the scan). This is intended behavior. */ #if defined(DUK_USE_DEBUG) DUK_LOCAL void duk__handle_temproot(duk_heap *heap, duk_heaphdr *hdr, duk_size_t *count) { #else DUK_LOCAL void duk__handle_temproot(duk_heap *heap, duk_heaphdr *hdr) { #endif DUK_ASSERT(hdr != NULL); if (!DUK_HEAPHDR_HAS_TEMPROOT(hdr)) { DUK_DDD(DUK_DDDPRINT("not a temp root: %p", (void *) hdr)); return; } DUK_DDD(DUK_DDDPRINT("found a temp root: %p", (void *) hdr)); DUK_HEAPHDR_CLEAR_TEMPROOT(hdr); DUK_HEAPHDR_CLEAR_REACHABLE(hdr); /* Done so that duk__mark_heaphdr() works correctly. */ #if defined(DUK_USE_ASSERTIONS) && defined(DUK_USE_REFERENCE_COUNTING) hdr->h_assert_refcount--; /* Same node visited twice. */ #endif duk__mark_heaphdr_nonnull(heap, hdr); #if defined(DUK_USE_DEBUG) (*count)++; #endif } DUK_LOCAL void duk__mark_temproots_by_heap_scan(duk_heap *heap) { duk_heaphdr *hdr; #if defined(DUK_USE_DEBUG) duk_size_t count; #endif DUK_DD(DUK_DDPRINT("duk__mark_temproots_by_heap_scan: %p", (void *) heap)); while (DUK_HEAP_HAS_MARKANDSWEEP_RECLIMIT_REACHED(heap)) { DUK_DD(DUK_DDPRINT("recursion limit reached, doing heap scan to continue from temproots")); #if defined(DUK_USE_DEBUG) count = 0; #endif DUK_HEAP_CLEAR_MARKANDSWEEP_RECLIMIT_REACHED(heap); hdr = heap->heap_allocated; while (hdr) { #if defined(DUK_USE_DEBUG) duk__handle_temproot(heap, hdr, &count); #else duk__handle_temproot(heap, hdr); #endif hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr); } #if defined(DUK_USE_FINALIZER_SUPPORT) hdr = heap->finalize_list; while (hdr) { #if defined(DUK_USE_DEBUG) duk__handle_temproot(heap, hdr, &count); #else duk__handle_temproot(heap, hdr); #endif hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr); } #endif #if defined(DUK_USE_DEBUG) DUK_DD(DUK_DDPRINT("temproot mark heap scan processed %ld temp roots", (long) count)); #endif } } /* * Finalize refcounts for heap elements just about to be freed. * This must be done for all objects before freeing to avoid any * stale pointer dereferences. * * Note that this must deduce the set of objects to be freed * identically to duk__sweep_heap(). */ #if defined(DUK_USE_REFERENCE_COUNTING) DUK_LOCAL void duk__finalize_refcounts(duk_heap *heap) { duk_heaphdr *hdr; DUK_ASSERT(heap->heap_thread != NULL); DUK_DD(DUK_DDPRINT("duk__finalize_refcounts: heap=%p", (void *) heap)); hdr = heap->heap_allocated; while (hdr) { if (!DUK_HEAPHDR_HAS_REACHABLE(hdr)) { /* * Unreachable object about to be swept. Finalize target refcounts * (objects which the unreachable object points to) without doing * refzero processing. Recursive decrefs are also prevented when * refzero processing is disabled. * * Value cannot be a finalizable object, as they have been made * temporarily reachable for this round. */ DUK_DDD(DUK_DDDPRINT("unreachable object, refcount finalize before sweeping: %p", (void *) hdr)); /* Finalize using heap->heap_thread; DECREF has a * suppress check for mark-and-sweep which is based * on heap->ms_running. */ duk_heaphdr_refcount_finalize_norz(heap, hdr); } hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr); } } #endif /* DUK_USE_REFERENCE_COUNTING */ /* * Clear (reachable) flags of finalize_list. * * We could mostly do in the sweep phase when we move objects from the * heap into the finalize_list. However, if a finalizer run is skipped * during a mark-and-sweep, the objects on the finalize_list will be marked * reachable during the next mark-and-sweep. Since they're already on the * finalize_list, no-one will be clearing their REACHABLE flag so we do it * here. (This now overlaps with the sweep handling in a harmless way.) */ #if defined(DUK_USE_FINALIZER_SUPPORT) DUK_LOCAL void duk__clear_finalize_list_flags(duk_heap *heap) { duk_heaphdr *hdr; DUK_DD(DUK_DDPRINT("duk__clear_finalize_list_flags: %p", (void *) heap)); hdr = heap->finalize_list; while (hdr) { DUK_HEAPHDR_CLEAR_REACHABLE(hdr); #if defined(DUK_USE_ASSERTIONS) DUK_ASSERT(DUK_HEAPHDR_HAS_FINALIZABLE(hdr) || \ (heap->currently_finalizing == hdr)); #endif /* DUK_HEAPHDR_FLAG_FINALIZED may be set. */ DUK_ASSERT(!DUK_HEAPHDR_HAS_TEMPROOT(hdr)); hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr); } } #endif /* DUK_USE_FINALIZER_SUPPORT */ /* * Sweep stringtable. */ DUK_LOCAL void duk__sweep_stringtable(duk_heap *heap, duk_size_t *out_count_keep) { duk_hstring *h; duk_hstring *prev; duk_uint32_t i; #if defined(DUK_USE_DEBUG) duk_size_t count_free = 0; #endif duk_size_t count_keep = 0; DUK_DD(DUK_DDPRINT("duk__sweep_stringtable: %p", (void *) heap)); #if defined(DUK_USE_STRTAB_PTRCOMP) if (heap->strtable16 == NULL) { #else if (heap->strtable == NULL) { #endif goto done; } for (i = 0; i < heap->st_size; i++) { #if defined(DUK_USE_STRTAB_PTRCOMP) h = DUK_USE_HEAPPTR_DEC16(heap->heap_udata, heap->strtable16[i]); #else h = heap->strtable[i]; #endif prev = NULL; while (h != NULL) { duk_hstring *next; next = h->hdr.h_next; if (DUK_HEAPHDR_HAS_REACHABLE((duk_heaphdr *) h)) { DUK_HEAPHDR_CLEAR_REACHABLE((duk_heaphdr *) h); count_keep++; prev = h; } else { #if defined(DUK_USE_DEBUG) count_free++; #endif #if defined(DUK_USE_REFERENCE_COUNTING) /* Non-zero refcounts should not happen for unreachable strings, * because we refcount finalize all unreachable objects which * should have decreased unreachable string refcounts to zero * (even for cycles). */ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) h) == 0); #endif /* Deal with weak references first. */ duk_heap_strcache_string_remove(heap, (duk_hstring *) h); /* Remove the string from the string table. */ duk_heap_strtable_unlink_prev(heap, (duk_hstring *) h, (duk_hstring *) prev); /* Free inner references (these exist e.g. when external * strings are enabled) and the struct itself. */ duk_free_hstring(heap, (duk_hstring *) h); /* Don't update 'prev'; it should be last string kept. */ } h = next; } } done: #if defined(DUK_USE_DEBUG) DUK_D(DUK_DPRINT("mark-and-sweep sweep stringtable: %ld freed, %ld kept", (long) count_free, (long) count_keep)); #endif *out_count_keep = count_keep; } /* * Sweep heap. */ DUK_LOCAL void duk__sweep_heap(duk_heap *heap, duk_small_uint_t flags, duk_size_t *out_count_keep) { duk_heaphdr *prev; /* last element that was left in the heap */ duk_heaphdr *curr; duk_heaphdr *next; #if defined(DUK_USE_DEBUG) duk_size_t count_free = 0; duk_size_t count_finalize = 0; duk_size_t count_rescue = 0; #endif duk_size_t count_keep = 0; DUK_DD(DUK_DDPRINT("duk__sweep_heap: %p", (void *) heap)); prev = NULL; curr = heap->heap_allocated; heap->heap_allocated = NULL; while (curr) { /* Strings and ROM objects are never placed on the heap allocated list. */ DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(curr) != DUK_HTYPE_STRING); DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY(curr)); next = DUK_HEAPHDR_GET_NEXT(heap, curr); if (DUK_HEAPHDR_HAS_REACHABLE(curr)) { /* * Reachable object: * - If FINALIZABLE -> actually unreachable (but marked * artificially reachable), queue to finalize_list. * - If !FINALIZABLE but FINALIZED -> rescued after * finalizer execution. * - Otherwise just a normal, reachable object. * * Objects which are kept are queued to heap_allocated * tail (we're essentially filtering heap_allocated in * practice). */ #if defined(DUK_USE_FINALIZER_SUPPORT) if (DUK_UNLIKELY(DUK_HEAPHDR_HAS_FINALIZABLE(curr))) { DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZED(curr)); DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(curr) == DUK_HTYPE_OBJECT); DUK_DD(DUK_DDPRINT("sweep; reachable, finalizable --> move to finalize_list: %p", (void *) curr)); #if defined(DUK_USE_REFERENCE_COUNTING) DUK_HEAPHDR_PREINC_REFCOUNT(curr); /* Bump refcount so that refzero never occurs when pending a finalizer call. */ #endif DUK_HEAP_INSERT_INTO_FINALIZE_LIST(heap, curr); #if defined(DUK_USE_DEBUG) count_finalize++; #endif } else #endif /* DUK_USE_FINALIZER_SUPPORT */ { if (DUK_UNLIKELY(DUK_HEAPHDR_HAS_FINALIZED(curr))) { DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZABLE(curr)); DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(curr) == DUK_HTYPE_OBJECT); if (flags & DUK_MS_FLAG_POSTPONE_RESCUE) { DUK_DD(DUK_DDPRINT("sweep; reachable, finalized, but postponing rescue decisions --> keep object (with FINALIZED set): %!iO", curr)); count_keep++; } else { DUK_DD(DUK_DDPRINT("sweep; reachable, finalized --> rescued after finalization: %p", (void *) curr)); #if defined(DUK_USE_FINALIZER_SUPPORT) DUK_HEAPHDR_CLEAR_FINALIZED(curr); #endif #if defined(DUK_USE_DEBUG) count_rescue++; #endif } } else { DUK_DD(DUK_DDPRINT("sweep; reachable --> keep: %!iO", curr)); count_keep++; } if (prev != NULL) { DUK_ASSERT(heap->heap_allocated != NULL); DUK_HEAPHDR_SET_NEXT(heap, prev, curr); } else { DUK_ASSERT(heap->heap_allocated == NULL); heap->heap_allocated = curr; } #if defined(DUK_USE_DOUBLE_LINKED_HEAP) DUK_HEAPHDR_SET_PREV(heap, curr, prev); #endif DUK_ASSERT_HEAPHDR_LINKS(heap, prev); DUK_ASSERT_HEAPHDR_LINKS(heap, curr); prev = curr; } /* * Shrink check for value stacks here. We're inside * ms_prevent_count protection which prevents recursive * mark-and-sweep and refzero finalizers, so there are * no side effects that would affect the heap lists. */ if (DUK_HEAPHDR_IS_OBJECT(curr) && DUK_HOBJECT_IS_THREAD((duk_hobject *) curr)) { duk_hthread *thr_curr = (duk_hthread *) curr; DUK_DD(DUK_DDPRINT("value stack shrink check for thread: %!O", curr)); duk_valstack_shrink_check_nothrow(thr_curr, flags & DUK_MS_FLAG_EMERGENCY /*snug*/); } DUK_HEAPHDR_CLEAR_REACHABLE(curr); /* Keep FINALIZED if set, used if rescue decisions are postponed. */ /* Keep FINALIZABLE for objects on finalize_list. */ DUK_ASSERT(!DUK_HEAPHDR_HAS_REACHABLE(curr)); } else { /* * Unreachable object: * - If FINALIZED, object was finalized but not * rescued. This doesn't affect freeing. * - Otherwise normal unreachable object. * * There's no guard preventing a FINALIZED object * from being freed while finalizers execute: the * artificial finalize_list reachability roots can't * cause an incorrect free decision (but can cause * an incorrect rescue decision). */ #if defined(DUK_USE_REFERENCE_COUNTING) /* Non-zero refcounts should not happen because we refcount * finalize all unreachable objects which should cancel out * refcounts (even for cycles). */ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(curr) == 0); #endif DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZABLE(curr)); #if defined(DUK_USE_DEBUG) if (DUK_HEAPHDR_HAS_FINALIZED(curr)) { DUK_DD(DUK_DDPRINT("sweep; unreachable, finalized --> finalized object not rescued: %p", (void *) curr)); } else { DUK_DD(DUK_DDPRINT("sweep; not reachable --> free: %p", (void *) curr)); } #endif /* Note: object cannot be a finalizable unreachable object, as * they have been marked temporarily reachable for this round, * and are handled above. */ #if defined(DUK_USE_DEBUG) count_free++; #endif /* Weak refs should be handled here, but no weak refs for * any non-string objects exist right now. */ /* Free object and all auxiliary (non-heap) allocs. */ duk_heap_free_heaphdr_raw(heap, curr); } curr = next; } if (prev != NULL) { DUK_HEAPHDR_SET_NEXT(heap, prev, NULL); } DUK_ASSERT_HEAPHDR_LINKS(heap, prev); #if defined(DUK_USE_DEBUG) DUK_D(DUK_DPRINT("mark-and-sweep sweep objects (non-string): %ld freed, %ld kept, %ld rescued, %ld queued for finalization", (long) count_free, (long) count_keep, (long) count_rescue, (long) count_finalize)); #endif *out_count_keep = count_keep; } /* * Object compaction. * * Compaction is assumed to never throw an error. */ DUK_LOCAL int duk__protected_compact_object(duk_hthread *thr, void *udata) { duk_hobject *obj; /* XXX: for threads, compact stacks? */ DUK_UNREF(udata); obj = duk_known_hobject(thr, -1); duk_hobject_compact_props(thr, obj); return 0; } #if defined(DUK_USE_DEBUG) DUK_LOCAL void duk__compact_object_list(duk_heap *heap, duk_hthread *thr, duk_heaphdr *start, duk_size_t *p_count_check, duk_size_t *p_count_compact, duk_size_t *p_count_bytes_saved) { #else DUK_LOCAL void duk__compact_object_list(duk_heap *heap, duk_hthread *thr, duk_heaphdr *start) { #endif duk_heaphdr *curr; #if defined(DUK_USE_DEBUG) duk_size_t old_size, new_size; #endif duk_hobject *obj; DUK_UNREF(heap); curr = start; while (curr) { DUK_DDD(DUK_DDDPRINT("mark-and-sweep compact: %p", (void *) curr)); if (DUK_HEAPHDR_GET_TYPE(curr) != DUK_HTYPE_OBJECT) { goto next; } obj = (duk_hobject *) curr; #if defined(DUK_USE_DEBUG) old_size = DUK_HOBJECT_P_COMPUTE_SIZE(DUK_HOBJECT_GET_ESIZE(obj), DUK_HOBJECT_GET_ASIZE(obj), DUK_HOBJECT_GET_HSIZE(obj)); #endif DUK_DD(DUK_DDPRINT("compact object: %p", (void *) obj)); duk_push_hobject(thr, obj); /* XXX: disable error handlers for duration of compaction? */ duk_safe_call(thr, duk__protected_compact_object, NULL, 1, 0); #if defined(DUK_USE_DEBUG) new_size = DUK_HOBJECT_P_COMPUTE_SIZE(DUK_HOBJECT_GET_ESIZE(obj), DUK_HOBJECT_GET_ASIZE(obj), DUK_HOBJECT_GET_HSIZE(obj)); #endif #if defined(DUK_USE_DEBUG) (*p_count_compact)++; (*p_count_bytes_saved) += (duk_size_t) (old_size - new_size); #endif next: curr = DUK_HEAPHDR_GET_NEXT(heap, curr); #if defined(DUK_USE_DEBUG) (*p_count_check)++; #endif } } DUK_LOCAL void duk__compact_objects(duk_heap *heap) { /* XXX: which lists should participate? to be finalized? */ #if defined(DUK_USE_DEBUG) duk_size_t count_check = 0; duk_size_t count_compact = 0; duk_size_t count_bytes_saved = 0; #endif DUK_DD(DUK_DDPRINT("duk__compact_objects: %p", (void *) heap)); DUK_ASSERT(heap->heap_thread != NULL); #if defined(DUK_USE_DEBUG) duk__compact_object_list(heap, heap->heap_thread, heap->heap_allocated, &count_check, &count_compact, &count_bytes_saved); #if defined(DUK_USE_FINALIZER_SUPPORT) duk__compact_object_list(heap, heap->heap_thread, heap->finalize_list, &count_check, &count_compact, &count_bytes_saved); #endif #else duk__compact_object_list(heap, heap->heap_thread, heap->heap_allocated); #if defined(DUK_USE_FINALIZER_SUPPORT) duk__compact_object_list(heap, heap->heap_thread, heap->finalize_list); #endif #endif #if defined(DUK_USE_REFERENCE_COUNTING) DUK_ASSERT(heap->refzero_list == NULL); /* Always handled to completion inline in DECREF. */ #endif #if defined(DUK_USE_DEBUG) DUK_D(DUK_DPRINT("mark-and-sweep compact objects: %ld checked, %ld compaction attempts, %ld bytes saved by compaction", (long) count_check, (long) count_compact, (long) count_bytes_saved)); #endif } /* * Assertion helpers. */ #if defined(DUK_USE_ASSERTIONS) DUK_LOCAL void duk__assert_heaphdr_flags(duk_heap *heap) { duk_heaphdr *hdr; hdr = heap->heap_allocated; while (hdr) { DUK_ASSERT(!DUK_HEAPHDR_HAS_REACHABLE(hdr)); DUK_ASSERT(!DUK_HEAPHDR_HAS_TEMPROOT(hdr)); DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZABLE(hdr)); /* may have FINALIZED */ hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr); } #if defined(DUK_USE_REFERENCE_COUNTING) DUK_ASSERT(heap->refzero_list == NULL); /* Always handled to completion inline in DECREF. */ #endif } #if defined(DUK_USE_REFERENCE_COUNTING) DUK_LOCAL void duk__assert_valid_refcounts(duk_heap *heap) { duk_heaphdr *hdr = heap->heap_allocated; while (hdr) { /* Cannot really assert much w.r.t. refcounts now. */ if (DUK_HEAPHDR_GET_REFCOUNT(hdr) == 0 && DUK_HEAPHDR_HAS_FINALIZED(hdr)) { /* An object may be in heap_allocated list with a zero * refcount if it has just been finalized and is waiting * to be collected by the next cycle. * (This doesn't currently happen however.) */ } else if (DUK_HEAPHDR_GET_REFCOUNT(hdr) == 0) { /* An object may be in heap_allocated list with a zero * refcount also if it is a temporary object created * during debugger paused state. It will get collected * by mark-and-sweep based on its reachability status * (presumably not reachable because refcount is 0). */ } DUK_ASSERT_DISABLE(DUK_HEAPHDR_GET_REFCOUNT(hdr) >= 0); /* Unsigned. */ hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr); } } DUK_LOCAL void duk__clear_assert_refcounts(duk_heap *heap) { duk_heaphdr *curr; duk_uint32_t i; for (curr = heap->heap_allocated; curr != NULL; curr = DUK_HEAPHDR_GET_NEXT(heap, curr)) { curr->h_assert_refcount = 0; } #if defined(DUK_USE_FINALIZER_SUPPORT) for (curr = heap->finalize_list; curr != NULL; curr = DUK_HEAPHDR_GET_NEXT(heap, curr)) { curr->h_assert_refcount = 0; } #endif #if defined(DUK_USE_REFERENCE_COUNTING) for (curr = heap->refzero_list; curr != NULL; curr = DUK_HEAPHDR_GET_NEXT(heap, curr)) { curr->h_assert_refcount = 0; } #endif for (i = 0; i < heap->st_size; i++) { duk_hstring *h; #if defined(DUK_USE_STRTAB_PTRCOMP) h = DUK_USE_HEAPPTR_DEC16(heap->heap_udata, heap->strtable16[i]); #else h = heap->strtable[i]; #endif while (h != NULL) { ((duk_heaphdr *) h)->h_assert_refcount = 0; h = h->hdr.h_next; } } } DUK_LOCAL void duk__check_refcount_heaphdr(duk_heaphdr *hdr) { duk_bool_t count_ok; /* The refcount check only makes sense for reachable objects on * heap_allocated or string table, after the sweep phase. Prior to * sweep phase refcounts will include references that are not visible * via reachability roots. * * Because we're called after the sweep phase, all heap objects on * heap_allocated are reachable. REACHABLE flags have already been * cleared so we can't check them. */ /* ROM objects have intentionally incorrect refcount (1), but we won't * check them. */ DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY(hdr)); count_ok = ((duk_size_t) DUK_HEAPHDR_GET_REFCOUNT(hdr) == hdr->h_assert_refcount); if (!count_ok) { DUK_D(DUK_DPRINT("refcount mismatch for: %p: header=%ld counted=%ld --> %!iO", (void *) hdr, (long) DUK_HEAPHDR_GET_REFCOUNT(hdr), (long) hdr->h_assert_refcount, hdr)); DUK_ASSERT(0); } } DUK_LOCAL void duk__check_assert_refcounts(duk_heap *heap) { duk_heaphdr *curr; duk_uint32_t i; for (curr = heap->heap_allocated; curr != NULL; curr = DUK_HEAPHDR_GET_NEXT(heap, curr)) { duk__check_refcount_heaphdr(curr); } #if defined(DUK_USE_FINALIZER_SUPPORT) for (curr = heap->finalize_list; curr != NULL; curr = DUK_HEAPHDR_GET_NEXT(heap, curr)) { duk__check_refcount_heaphdr(curr); } #endif for (i = 0; i < heap->st_size; i++) { duk_hstring *h; #if defined(DUK_USE_STRTAB_PTRCOMP) h = DUK_USE_HEAPPTR_DEC16(heap->heap_udata, heap->strtable16[i]); #else h = heap->strtable[i]; #endif while (h != NULL) { duk__check_refcount_heaphdr((duk_heaphdr *) h); h = h->hdr.h_next; } } } #endif /* DUK_USE_REFERENCE_COUNTING */ #endif /* DUK_USE_ASSERTIONS */ /* * Stats dump. */ #if defined(DUK_USE_DEBUG) DUK_LOCAL void duk__dump_stats(duk_heap *heap) { DUK_D(DUK_DPRINT("stats executor: opcodes=%ld, interrupt=%ld, throw=%ld", (long) heap->stats_exec_opcodes, (long) heap->stats_exec_interrupt, (long) heap->stats_exec_throw)); DUK_D(DUK_DPRINT("stats call: all=%ld, tailcall=%ld, ecmatoecma=%ld", (long) heap->stats_call_all, (long) heap->stats_call_tailcall, (long) heap->stats_call_ecmatoecma)); DUK_D(DUK_DPRINT("stats safecall: all=%ld, nothrow=%ld, throw=%ld", (long) heap->stats_safecall_all, (long) heap->stats_safecall_nothrow, (long) heap->stats_safecall_throw)); DUK_D(DUK_DPRINT("stats mark-and-sweep: try_count=%ld, skip_count=%ld, emergency_count=%ld", (long) heap->stats_ms_try_count, (long) heap->stats_ms_skip_count, (long) heap->stats_ms_emergency_count)); DUK_D(DUK_DPRINT("stats stringtable: intern_hit=%ld, intern_miss=%ld, resize_check=%ld, resize_grow=%ld, resize_shrink=%ld", (long) heap->stats_strtab_intern_hit, (long) heap->stats_strtab_intern_miss, (long) heap->stats_strtab_resize_check, (long) heap->stats_strtab_resize_grow, (long) heap->stats_strtab_resize_shrink)); DUK_D(DUK_DPRINT("stats object: realloc_props=%ld, abandon_array=%ld", (long) heap->stats_object_realloc_props, (long) heap->stats_object_abandon_array)); DUK_D(DUK_DPRINT("stats getownpropdesc: count=%ld, hit=%ld, miss=%ld", (long) heap->stats_getownpropdesc_count, (long) heap->stats_getownpropdesc_hit, (long) heap->stats_getownpropdesc_miss)); DUK_D(DUK_DPRINT("stats getpropdesc: count=%ld, hit=%ld, miss=%ld", (long) heap->stats_getpropdesc_count, (long) heap->stats_getpropdesc_hit, (long) heap->stats_getpropdesc_miss)); DUK_D(DUK_DPRINT("stats getprop: all=%ld, arrayidx=%ld, bufobjidx=%ld, " "bufferidx=%ld, bufferlen=%ld, stringidx=%ld, stringlen=%ld, " "proxy=%ld, arguments=%ld", (long) heap->stats_getprop_all, (long) heap->stats_getprop_arrayidx, (long) heap->stats_getprop_bufobjidx, (long) heap->stats_getprop_bufferidx, (long) heap->stats_getprop_bufferlen, (long) heap->stats_getprop_stringidx, (long) heap->stats_getprop_stringlen, (long) heap->stats_getprop_proxy, (long) heap->stats_getprop_arguments)); DUK_D(DUK_DPRINT("stats putprop: all=%ld, arrayidx=%ld, bufobjidx=%ld, " "bufferidx=%ld, proxy=%ld", (long) heap->stats_putprop_all, (long) heap->stats_putprop_arrayidx, (long) heap->stats_putprop_bufobjidx, (long) heap->stats_putprop_bufferidx, (long) heap->stats_putprop_proxy)); DUK_D(DUK_DPRINT("stats getvar: all=%ld", (long) heap->stats_getvar_all)); DUK_D(DUK_DPRINT("stats putvar: all=%ld", (long) heap->stats_putvar_all)); } #endif /* DUK_USE_DEBUG */ /* * Main mark-and-sweep function. * * 'flags' represents the features requested by the caller. The current * heap->ms_base_flags is ORed automatically into the flags; the base flags * mask typically prevents certain mark-and-sweep operation to avoid trouble. */ DUK_INTERNAL void duk_heap_mark_and_sweep(duk_heap *heap, duk_small_uint_t flags) { duk_size_t count_keep_obj; duk_size_t count_keep_str; #if defined(DUK_USE_VOLUNTARY_GC) duk_size_t tmp; #endif DUK_STATS_INC(heap, stats_ms_try_count); #if defined(DUK_USE_DEBUG) if (flags & DUK_MS_FLAG_EMERGENCY) { DUK_STATS_INC(heap, stats_ms_emergency_count); } #endif /* If debugger is paused, garbage collection is disabled by default. * This is achieved by bumping ms_prevent_count when becoming paused. */ DUK_ASSERT(!DUK_HEAP_HAS_DEBUGGER_PAUSED(heap) || heap->ms_prevent_count > 0); /* Prevention/recursion check as soon as possible because we may * be called a number of times when voluntary mark-and-sweep is * pending. */ if (heap->ms_prevent_count != 0) { DUK_DD(DUK_DDPRINT("reject recursive mark-and-sweep")); DUK_STATS_INC(heap, stats_ms_skip_count); return; } DUK_ASSERT(heap->ms_running == 0); /* ms_prevent_count is bumped when ms_running is set */ /* Heap_thread is used during mark-and-sweep for refcount finalization * (it's also used for finalizer execution once mark-and-sweep is * complete). Heap allocation code ensures heap_thread is set and * properly initialized before setting ms_prevent_count to 0. */ DUK_ASSERT(heap->heap_thread != NULL); DUK_ASSERT(heap->heap_thread->valstack != NULL); DUK_D(DUK_DPRINT("garbage collect (mark-and-sweep) starting, requested flags: 0x%08lx, effective flags: 0x%08lx", (unsigned long) flags, (unsigned long) (flags | heap->ms_base_flags))); flags |= heap->ms_base_flags; #if defined(DUK_USE_FINALIZER_SUPPORT) if (heap->finalize_list != NULL) { flags |= DUK_MS_FLAG_POSTPONE_RESCUE; } #endif /* * Assertions before */ #if defined(DUK_USE_ASSERTIONS) DUK_ASSERT(heap->ms_prevent_count == 0); DUK_ASSERT(heap->ms_running == 0); DUK_ASSERT(!DUK_HEAP_HAS_DEBUGGER_PAUSED(heap)); DUK_ASSERT(!DUK_HEAP_HAS_MARKANDSWEEP_RECLIMIT_REACHED(heap)); DUK_ASSERT(heap->ms_recursion_depth == 0); duk__assert_heaphdr_flags(heap); #if defined(DUK_USE_REFERENCE_COUNTING) /* Note: heap->refzero_free_running may be true; a refcount * finalizer may trigger a mark-and-sweep. */ duk__assert_valid_refcounts(heap); #endif /* DUK_USE_REFERENCE_COUNTING */ #endif /* DUK_USE_ASSERTIONS */ /* * Begin */ DUK_ASSERT(heap->ms_prevent_count == 0); DUK_ASSERT(heap->ms_running == 0); heap->ms_prevent_count = 1; heap->ms_running = 1; /* * Free activation/catcher freelists on every mark-and-sweep for now. * This is an initial rough draft; ideally we'd keep count of the * freelist size and free only excess entries. */ DUK_D(DUK_DPRINT("freeing temporary freelists")); duk_heap_free_freelists(heap); /* * Mark roots, hoping that recursion limit is not normally hit. * If recursion limit is hit, run additional reachability rounds * starting from "temproots" until marking is complete. * * Marking happens in two phases: first we mark actual reachability * roots (and run "temproots" to complete the process). Then we * check which objects are unreachable and are finalizable; such * objects are marked as FINALIZABLE and marked as reachability * (and "temproots" is run again to complete the process). * * The heap finalize_list must also be marked as a reachability root. * There may be objects on the list from a previous round if the * previous run had finalizer skip flag. */ #if defined(DUK_USE_ASSERTIONS) && defined(DUK_USE_REFERENCE_COUNTING) duk__clear_assert_refcounts(heap); #endif duk__mark_roots_heap(heap); /* Mark main reachability roots. */ #if defined(DUK_USE_REFERENCE_COUNTING) DUK_ASSERT(heap->refzero_list == NULL); /* Always handled to completion inline in DECREF. */ #endif duk__mark_temproots_by_heap_scan(heap); /* Temproots. */ #if defined(DUK_USE_FINALIZER_SUPPORT) duk__mark_finalizable(heap); /* Mark finalizable as reachability roots. */ duk__mark_finalize_list(heap); /* Mark finalizer work list as reachability roots. */ #endif duk__mark_temproots_by_heap_scan(heap); /* Temproots. */ /* * Sweep garbage and remove marking flags, and move objects with * finalizers to the finalizer work list. * * Objects to be swept need to get their refcounts finalized before * they are swept. In other words, their target object refcounts * need to be decreased. This has to be done before freeing any * objects to avoid decref'ing dangling pointers (which may happen * even without bugs, e.g. with reference loops) * * Because strings don't point to other heap objects, similar * finalization is not necessary for strings. */ /* XXX: more emergency behavior, e.g. find smaller hash sizes etc */ #if defined(DUK_USE_REFERENCE_COUNTING) duk__finalize_refcounts(heap); #endif duk__sweep_heap(heap, flags, &count_keep_obj); duk__sweep_stringtable(heap, &count_keep_str); #if defined(DUK_USE_ASSERTIONS) && defined(DUK_USE_REFERENCE_COUNTING) duk__check_assert_refcounts(heap); #endif #if defined(DUK_USE_REFERENCE_COUNTING) DUK_ASSERT(heap->refzero_list == NULL); /* Always handled to completion inline in DECREF. */ #endif #if defined(DUK_USE_FINALIZER_SUPPORT) duk__clear_finalize_list_flags(heap); #endif /* * Object compaction (emergency only). * * Object compaction is a separate step after sweeping, as there is * more free memory for it to work with. Also, currently compaction * may insert new objects into the heap allocated list and the string * table which we don't want to do during a sweep (the reachability * flags of such objects would be incorrect). The objects inserted * are currently: * * - a temporary duk_hbuffer for a new properties allocation * - if array part is abandoned, string keys are interned * * The object insertions go to the front of the list, so they do not * cause an infinite loop (they are not compacted). */ if ((flags & DUK_MS_FLAG_EMERGENCY) && !(flags & DUK_MS_FLAG_NO_OBJECT_COMPACTION)) { duk__compact_objects(heap); } /* * String table resize check. * * This is mainly useful in emergency GC: if the string table load * factor is really low for some reason, we can shrink the string * table to a smaller size and free some memory in the process. * Only execute in emergency GC. String table has internal flags * to protect against recursive resizing if this mark-and-sweep pass * was triggered by a string table resize. */ if (flags & DUK_MS_FLAG_EMERGENCY) { DUK_D(DUK_DPRINT("stringtable resize check in emergency gc")); duk_heap_strtable_force_resize(heap); } /* * Finish */ DUK_ASSERT(heap->ms_prevent_count == 1); heap->ms_prevent_count = 0; DUK_ASSERT(heap->ms_running == 1); heap->ms_running = 0; /* * Assertions after */ #if defined(DUK_USE_ASSERTIONS) DUK_ASSERT(heap->ms_prevent_count == 0); DUK_ASSERT(!DUK_HEAP_HAS_MARKANDSWEEP_RECLIMIT_REACHED(heap)); DUK_ASSERT(heap->ms_recursion_depth == 0); duk__assert_heaphdr_flags(heap); #if defined(DUK_USE_REFERENCE_COUNTING) /* Note: heap->refzero_free_running may be true; a refcount * finalizer may trigger a mark-and-sweep. */ duk__assert_valid_refcounts(heap); #endif /* DUK_USE_REFERENCE_COUNTING */ #endif /* DUK_USE_ASSERTIONS */ /* * Reset trigger counter */ #if defined(DUK_USE_VOLUNTARY_GC) tmp = (count_keep_obj + count_keep_str) / 256; heap->ms_trigger_counter = (duk_int_t) ( (tmp * DUK_HEAP_MARK_AND_SWEEP_TRIGGER_MULT) + DUK_HEAP_MARK_AND_SWEEP_TRIGGER_ADD); DUK_D(DUK_DPRINT("garbage collect (mark-and-sweep) finished: %ld objects kept, %ld strings kept, trigger reset to %ld", (long) count_keep_obj, (long) count_keep_str, (long) heap->ms_trigger_counter)); #else DUK_D(DUK_DPRINT("garbage collect (mark-and-sweep) finished: %ld objects kept, %ld strings kept, no voluntary trigger", (long) count_keep_obj, (long) count_keep_str)); #endif /* * Stats dump */ #if defined(DUK_USE_DEBUG) duk__dump_stats(heap); #endif /* * Finalize objects in the finalization work list. Finalized * objects are queued back to heap_allocated with FINALIZED set. * * Since finalizers may cause arbitrary side effects, they are * prevented e.g. during string table and object property allocation * resizing using heap->pf_prevent_count. In this case the objects * remain in the finalization work list after mark-and-sweep exits * and they may be finalized on the next pass or any DECREF checking * for finalize_list. * * As of Duktape 2.1 finalization happens outside mark-and-sweep * protection. Mark-and-sweep is allowed while the finalize_list * is being processed, but no rescue decisions are done while the * process is on-going. This avoids incorrect rescue decisions * if an object is considered reachable (and thus rescued) because * of a reference via finalize_list (which is considered a reachability * root). When finalize_list is being processed, reachable objects * with FINALIZED set will just keep their FINALIZED flag for later * mark-and-sweep processing. * * This could also be handled (a bit better) by having a more refined * notion of reachability for rescue/free decisions. * * XXX: avoid finalizer execution when doing emergency GC? */ #if defined(DUK_USE_FINALIZER_SUPPORT) /* Attempt to process finalize_list, pf_prevent_count check * is inside the target. */ duk_heap_process_finalize_list(heap); #endif /* DUK_USE_FINALIZER_SUPPORT */ } #line 1 "duk_heap_memory.c" /* * Memory allocation handling. */ /* #include duk_internal.h -> already included */ /* * Voluntary GC check */ #if defined(DUK_USE_VOLUNTARY_GC) DUK_LOCAL DUK_INLINE void duk__check_voluntary_gc(duk_heap *heap) { if (DUK_UNLIKELY(--(heap)->ms_trigger_counter < 0)) { #if defined(DUK_USE_DEBUG) if (heap->ms_prevent_count == 0) { DUK_D(DUK_DPRINT("triggering voluntary mark-and-sweep")); } else { DUK_DD(DUK_DDPRINT("gc blocked -> skip voluntary mark-and-sweep now")); } #endif /* Prevention checks in the call target handle cases where * voluntary GC is not allowed. The voluntary GC trigger * counter is only rewritten if mark-and-sweep actually runs. */ duk_heap_mark_and_sweep(heap, DUK_MS_FLAG_VOLUNTARY /*flags*/); } } #define DUK__VOLUNTARY_PERIODIC_GC(heap) do { duk__check_voluntary_gc((heap)); } while (0) #else #define DUK__VOLUNTARY_PERIODIC_GC(heap) /* no voluntary gc */ #endif /* DUK_USE_VOLUNTARY_GC */ /* * Allocate memory with garbage collection */ DUK_INTERNAL void *duk_heap_mem_alloc(duk_heap *heap, duk_size_t size) { void *res; duk_small_int_t i; DUK_ASSERT(heap != NULL); DUK_ASSERT_DISABLE(size >= 0); /* * Voluntary periodic GC (if enabled) */ DUK__VOLUNTARY_PERIODIC_GC(heap); /* * First attempt */ #if defined(DUK_USE_GC_TORTURE) /* Simulate alloc failure on every alloc, except when mark-and-sweep * is running. */ if (heap->ms_prevent_count == 0) { DUK_DDD(DUK_DDDPRINT("gc torture enabled, pretend that first alloc attempt fails")); res = NULL; DUK_UNREF(res); goto skip_attempt; } #endif res = heap->alloc_func(heap->heap_udata, size); if (DUK_LIKELY(res || size == 0)) { /* For zero size allocations NULL is allowed. */ return res; } #if defined(DUK_USE_GC_TORTURE) skip_attempt: #endif DUK_D(DUK_DPRINT("first alloc attempt failed, attempt to gc and retry")); #if 0 /* * Avoid a GC if GC is already running. This can happen at a late * stage in a GC when we try to e.g. resize the stringtable * or compact objects. * * NOTE: explicit handling isn't actually be needed: if the GC is * not allowed, duk_heap_mark_and_sweep() will reject it for every * attempt in the loop below, resulting in a NULL same as here. */ if (heap->ms_prevent_count != 0) { DUK_D(DUK_DPRINT("duk_heap_mem_alloc() failed, gc in progress (gc skipped), alloc size %ld", (long) size)); return NULL; } #endif /* * Retry with several GC attempts. Initial attempts are made without * emergency mode; later attempts use emergency mode which minimizes * memory allocations forcibly. */ for (i = 0; i < DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_LIMIT; i++) { duk_small_uint_t flags; flags = 0; if (i >= DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_EMERGENCY_LIMIT - 1) { flags |= DUK_MS_FLAG_EMERGENCY; } duk_heap_mark_and_sweep(heap, flags); res = heap->alloc_func(heap->heap_udata, size); if (res) { DUK_D(DUK_DPRINT("duk_heap_mem_alloc() succeeded after gc (pass %ld), alloc size %ld", (long) (i + 1), (long) size)); return res; } } DUK_D(DUK_DPRINT("duk_heap_mem_alloc() failed even after gc, alloc size %ld", (long) size)); return NULL; } DUK_INTERNAL void *duk_heap_mem_alloc_zeroed(duk_heap *heap, duk_size_t size) { void *res; DUK_ASSERT(heap != NULL); DUK_ASSERT_DISABLE(size >= 0); res = DUK_ALLOC(heap, size); if (DUK_LIKELY(res != NULL)) { /* assume memset with zero size is OK */ DUK_MEMZERO(res, size); } return res; } DUK_INTERNAL void *duk_heap_mem_alloc_checked(duk_hthread *thr, duk_size_t size) { void *res; DUK_ASSERT(thr != NULL); res = duk_heap_mem_alloc(thr->heap, size); if (DUK_LIKELY(res != NULL || size == 0)) { return res; } DUK_ERROR_ALLOC_FAILED(thr); return NULL; } DUK_INTERNAL void *duk_heap_mem_alloc_checked_zeroed(duk_hthread *thr, duk_size_t size) { void *res; DUK_ASSERT(thr != NULL); res = duk_heap_mem_alloc_zeroed(thr->heap, size); if (DUK_LIKELY(res != NULL || size == 0)) { return res; } DUK_ERROR_ALLOC_FAILED(thr); return NULL; } /* * Reallocate memory with garbage collection */ DUK_INTERNAL void *duk_heap_mem_realloc(duk_heap *heap, void *ptr, duk_size_t newsize) { void *res; duk_small_int_t i; DUK_ASSERT(heap != NULL); /* ptr may be NULL */ DUK_ASSERT_DISABLE(newsize >= 0); /* * Voluntary periodic GC (if enabled) */ DUK__VOLUNTARY_PERIODIC_GC(heap); /* * First attempt */ #if defined(DUK_USE_GC_TORTURE) /* Simulate alloc failure on every realloc, except when mark-and-sweep * is running. */ if (heap->ms_prevent_count == 0) { DUK_DDD(DUK_DDDPRINT("gc torture enabled, pretend that first realloc attempt fails")); res = NULL; DUK_UNREF(res); goto skip_attempt; } #endif res = heap->realloc_func(heap->heap_udata, ptr, newsize); if (DUK_LIKELY(res || newsize == 0)) { /* For zero size allocations NULL is allowed. */ return res; } #if defined(DUK_USE_GC_TORTURE) skip_attempt: #endif DUK_D(DUK_DPRINT("first realloc attempt failed, attempt to gc and retry")); #if 0 /* * Avoid a GC if GC is already running. See duk_heap_mem_alloc(). */ if (heap->ms_prevent_count != 0) { DUK_D(DUK_DPRINT("duk_heap_mem_realloc() failed, gc in progress (gc skipped), alloc size %ld", (long) newsize)); return NULL; } #endif /* * Retry with several GC attempts. Initial attempts are made without * emergency mode; later attempts use emergency mode which minimizes * memory allocations forcibly. */ for (i = 0; i < DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_LIMIT; i++) { duk_small_uint_t flags; flags = 0; if (i >= DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_EMERGENCY_LIMIT - 1) { flags |= DUK_MS_FLAG_EMERGENCY; } duk_heap_mark_and_sweep(heap, flags); res = heap->realloc_func(heap->heap_udata, ptr, newsize); if (res || newsize == 0) { DUK_D(DUK_DPRINT("duk_heap_mem_realloc() succeeded after gc (pass %ld), alloc size %ld", (long) (i + 1), (long) newsize)); return res; } } DUK_D(DUK_DPRINT("duk_heap_mem_realloc() failed even after gc, alloc size %ld", (long) newsize)); return NULL; } /* * Reallocate memory with garbage collection, using a callback to provide * the current allocated pointer. This variant is used when a mark-and-sweep * (e.g. finalizers) might change the original pointer. */ DUK_INTERNAL void *duk_heap_mem_realloc_indirect(duk_heap *heap, duk_mem_getptr cb, void *ud, duk_size_t newsize) { void *res; duk_small_int_t i; DUK_ASSERT(heap != NULL); DUK_ASSERT_DISABLE(newsize >= 0); /* * Voluntary periodic GC (if enabled) */ DUK__VOLUNTARY_PERIODIC_GC(heap); /* * First attempt */ #if defined(DUK_USE_GC_TORTURE) /* Simulate alloc failure on every realloc, except when mark-and-sweep * is running. */ if (heap->ms_prevent_count == 0) { DUK_DDD(DUK_DDDPRINT("gc torture enabled, pretend that first indirect realloc attempt fails")); res = NULL; DUK_UNREF(res); goto skip_attempt; } #endif res = heap->realloc_func(heap->heap_udata, cb(heap, ud), newsize); if (DUK_LIKELY(res || newsize == 0)) { /* For zero size allocations NULL is allowed. */ return res; } #if defined(DUK_USE_GC_TORTURE) skip_attempt: #endif DUK_D(DUK_DPRINT("first indirect realloc attempt failed, attempt to gc and retry")); #if 0 /* * Avoid a GC if GC is already running. See duk_heap_mem_alloc(). */ if (heap->ms_prevent_count != 0) { DUK_D(DUK_DPRINT("duk_heap_mem_realloc_indirect() failed, gc in progress (gc skipped), alloc size %ld", (long) newsize)); return NULL; } #endif /* * Retry with several GC attempts. Initial attempts are made without * emergency mode; later attempts use emergency mode which minimizes * memory allocations forcibly. */ for (i = 0; i < DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_LIMIT; i++) { duk_small_uint_t flags; #if defined(DUK_USE_DEBUG) void *ptr_pre; void *ptr_post; #endif #if defined(DUK_USE_DEBUG) ptr_pre = cb(heap, ud); #endif flags = 0; if (i >= DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_EMERGENCY_LIMIT - 1) { flags |= DUK_MS_FLAG_EMERGENCY; } duk_heap_mark_and_sweep(heap, flags); #if defined(DUK_USE_DEBUG) ptr_post = cb(heap, ud); if (ptr_pre != ptr_post) { DUK_DD(DUK_DDPRINT("realloc base pointer changed by mark-and-sweep: %p -> %p", (void *) ptr_pre, (void *) ptr_post)); } #endif /* Note: key issue here is to re-lookup the base pointer on every attempt. * The pointer being reallocated may change after every mark-and-sweep. */ res = heap->realloc_func(heap->heap_udata, cb(heap, ud), newsize); if (res || newsize == 0) { DUK_D(DUK_DPRINT("duk_heap_mem_realloc_indirect() succeeded after gc (pass %ld), alloc size %ld", (long) (i + 1), (long) newsize)); return res; } } DUK_D(DUK_DPRINT("duk_heap_mem_realloc_indirect() failed even after gc, alloc size %ld", (long) newsize)); return NULL; } /* * Free memory */ DUK_INTERNAL void duk_heap_mem_free(duk_heap *heap, void *ptr) { DUK_ASSERT(heap != NULL); /* ptr may be NULL */ /* Must behave like a no-op with NULL and any pointer returned from * malloc/realloc with zero size. */ heap->free_func(heap->heap_udata, ptr); /* Never perform a GC (even voluntary) in a memory free, otherwise * all call sites doing frees would need to deal with the side effects. * No need to update voluntary GC counter either. */ } /* automatic undefs */ #undef DUK__VOLUNTARY_PERIODIC_GC #line 1 "duk_heap_misc.c" /* * Support functions for duk_heap. */ /* #include duk_internal.h -> already included */ DUK_INTERNAL void duk_heap_insert_into_heap_allocated(duk_heap *heap, duk_heaphdr *hdr) { duk_heaphdr *root; DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(hdr) != DUK_HTYPE_STRING); root = heap->heap_allocated; #if defined(DUK_USE_DOUBLE_LINKED_HEAP) if (root != NULL) { DUK_ASSERT(DUK_HEAPHDR_GET_PREV(heap, root) == NULL); DUK_HEAPHDR_SET_PREV(heap, root, hdr); } DUK_HEAPHDR_SET_PREV(heap, hdr, NULL); #endif DUK_HEAPHDR_SET_NEXT(heap, hdr, root); DUK_ASSERT_HEAPHDR_LINKS(heap, hdr); DUK_ASSERT_HEAPHDR_LINKS(heap, root); heap->heap_allocated = hdr; } #if defined(DUK_USE_REFERENCE_COUNTING) DUK_INTERNAL void duk_heap_remove_from_heap_allocated(duk_heap *heap, duk_heaphdr *hdr) { duk_heaphdr *prev; duk_heaphdr *next; /* Strings are in string table. */ DUK_ASSERT(hdr != NULL); DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(hdr) != DUK_HTYPE_STRING); /* Target 'hdr' must be in heap_allocated (not e.g. finalize_list). * If not, heap lists will become corrupted so assert early for it. */ #if defined(DUK_USE_ASSERTIONS) { duk_heaphdr *tmp; for (tmp = heap->heap_allocated; tmp != NULL; tmp = DUK_HEAPHDR_GET_NEXT(heap, tmp)) { if (tmp == hdr) { break; } } DUK_ASSERT(tmp == hdr); } #endif /* Read/write only once to minimize pointer compression calls. */ prev = DUK_HEAPHDR_GET_PREV(heap, hdr); next = DUK_HEAPHDR_GET_NEXT(heap, hdr); if (prev != NULL) { DUK_ASSERT(heap->heap_allocated != hdr); DUK_HEAPHDR_SET_NEXT(heap, prev, next); } else { DUK_ASSERT(heap->heap_allocated == hdr); heap->heap_allocated = next; } if (next != NULL) { DUK_HEAPHDR_SET_PREV(heap, next, prev); } else { ; } } #endif /* DUK_USE_REFERENCE_COUNTING */ #if defined(DUK_USE_FINALIZER_SUPPORT) DUK_INTERNAL void duk_heap_insert_into_finalize_list(duk_heap *heap, duk_heaphdr *hdr) { duk_heaphdr *root; root = heap->finalize_list; #if defined(DUK_USE_DOUBLE_LINKED_HEAP) DUK_HEAPHDR_SET_PREV(heap, hdr, NULL); if (root != NULL) { DUK_ASSERT(DUK_HEAPHDR_GET_PREV(heap, root) == NULL); DUK_HEAPHDR_SET_PREV(heap, root, hdr); } #endif DUK_HEAPHDR_SET_NEXT(heap, hdr, root); DUK_ASSERT_HEAPHDR_LINKS(heap, hdr); DUK_ASSERT_HEAPHDR_LINKS(heap, root); heap->finalize_list = hdr; } #endif /* DUK_USE_FINALIZER_SUPPORT */ #if defined(DUK_USE_FINALIZER_SUPPORT) DUK_INTERNAL void duk_heap_remove_from_finalize_list(duk_heap *heap, duk_heaphdr *hdr) { #if defined(DUK_USE_DOUBLE_LINKED_HEAP) duk_heaphdr *next; duk_heaphdr *prev; next = DUK_HEAPHDR_GET_NEXT(heap, hdr); prev = DUK_HEAPHDR_GET_PREV(heap, hdr); if (next != NULL) { DUK_ASSERT(DUK_HEAPHDR_GET_PREV(heap, next) == hdr); DUK_HEAPHDR_SET_PREV(heap, next, prev); } if (prev == NULL) { DUK_ASSERT(hdr == heap->finalize_list); heap->finalize_list = next; } else { DUK_ASSERT(hdr != heap->finalize_list); DUK_HEAPHDR_SET_NEXT(heap, prev, next); } #else duk_heaphdr *next; duk_heaphdr *curr; /* Random removal is expensive: we need to locate the previous element * because we don't have a 'prev' pointer. */ curr = heap->finalize_list; if (curr == hdr) { heap->finalize_list = DUK_HEAPHDR_GET_NEXT(heap, curr); } else { DUK_ASSERT(hdr != heap->finalize_list); for (;;) { DUK_ASSERT(curr != NULL); /* Caller responsibility. */ next = DUK_HEAPHDR_GET_NEXT(heap, curr); if (next == hdr) { next = DUK_HEAPHDR_GET_NEXT(heap, hdr); DUK_HEAPHDR_SET_NEXT(heap, curr, next); break; } } } #endif } #endif /* DUK_USE_FINALIZER_SUPPORT */ #if defined(DUK_USE_ASSERTIONS) DUK_INTERNAL duk_bool_t duk_heap_in_heap_allocated(duk_heap *heap, duk_heaphdr *ptr) { duk_heaphdr *curr; DUK_ASSERT(heap != NULL); for (curr = heap->heap_allocated; curr != NULL; curr = DUK_HEAPHDR_GET_NEXT(heap, curr)) { if (curr == ptr) { return 1; } } return 0; } #endif /* DUK_USE_ASSERTIONS */ #if defined(DUK_USE_INTERRUPT_COUNTER) DUK_INTERNAL void duk_heap_switch_thread(duk_heap *heap, duk_hthread *new_thr) { duk_hthread *curr_thr; DUK_ASSERT(heap != NULL); if (new_thr != NULL) { curr_thr = heap->curr_thread; if (curr_thr == NULL) { /* For initial entry use default value; zero forces an * interrupt before executing the first insturction. */ DUK_DD(DUK_DDPRINT("switch thread, initial entry, init default interrupt counter")); new_thr->interrupt_counter = 0; new_thr->interrupt_init = 0; } else { /* Copy interrupt counter/init value state to new thread (if any). * It's OK for new_thr to be the same as curr_thr. */ #if defined(DUK_USE_DEBUG) if (new_thr != curr_thr) { DUK_DD(DUK_DDPRINT("switch thread, not initial entry, copy interrupt counter")); } #endif new_thr->interrupt_counter = curr_thr->interrupt_counter; new_thr->interrupt_init = curr_thr->interrupt_init; } } else { DUK_DD(DUK_DDPRINT("switch thread, new thread is NULL, no interrupt counter changes")); } heap->curr_thread = new_thr; /* may be NULL */ } #endif /* DUK_USE_INTERRUPT_COUNTER */ #line 1 "duk_heap_refcount.c" /* * Reference counting implementation. * * INCREF/DECREF, finalization and freeing of objects whose refcount reaches * zero (refzero). These operations are very performance sensitive, so * various small tricks are used in an attempt to maximize speed. */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_REFERENCE_COUNTING) #if !defined(DUK_USE_DOUBLE_LINKED_HEAP) #error internal error, reference counting requires a double linked heap #endif /* * Heap object refcount finalization. * * When an object is about to be freed, all other objects it refers to must * be decref'd. Refcount finalization does NOT free the object or its inner * allocations (mark-and-sweep shares these helpers), it just manipulates * the refcounts. * * Note that any of the DECREFs may cause a refcount to drop to zero. If so, * the object won't be refzero processed inline, but will just be queued to * refzero_list and processed by an earlier caller working on refzero_list, * eliminating C recursion from even long refzero cascades. If refzero * finalization is triggered by mark-and-sweep, refzero conditions are ignored * (objects are not even queued to refzero_list) because mark-and-sweep deals * with them; refcounts are still updated so that they remain in sync with * actual references. */ DUK_LOCAL void duk__decref_tvals_norz(duk_hthread *thr, duk_tval *tv, duk_idx_t count) { DUK_ASSERT(count == 0 || tv != NULL); while (count-- > 0) { DUK_TVAL_DECREF_NORZ(thr, tv); tv++; } } DUK_INTERNAL void duk_hobject_refcount_finalize_norz(duk_heap *heap, duk_hobject *h) { duk_hthread *thr; duk_uint_fast32_t i; duk_uint_fast32_t n; duk_propvalue *p_val; duk_tval *p_tv; duk_hstring **p_key; duk_uint8_t *p_flag; duk_hobject *h_proto; DUK_ASSERT(heap != NULL); DUK_ASSERT(heap->heap_thread != NULL); DUK_ASSERT(h); DUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) h) == DUK_HTYPE_OBJECT); thr = heap->heap_thread; DUK_ASSERT(thr != NULL); p_key = DUK_HOBJECT_E_GET_KEY_BASE(heap, h); p_val = DUK_HOBJECT_E_GET_VALUE_BASE(heap, h); p_flag = DUK_HOBJECT_E_GET_FLAGS_BASE(heap, h); n = DUK_HOBJECT_GET_ENEXT(h); while (n-- > 0) { duk_hstring *key; key = p_key[n]; if (DUK_UNLIKELY(key == NULL)) { continue; } DUK_HSTRING_DECREF_NORZ(thr, key); if (DUK_UNLIKELY(p_flag[n] & DUK_PROPDESC_FLAG_ACCESSOR)) { duk_hobject *h_getset; h_getset = p_val[n].a.get; DUK_ASSERT(h_getset == NULL || DUK_HEAPHDR_IS_OBJECT((duk_heaphdr *) h_getset)); DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, h_getset); h_getset = p_val[n].a.set; DUK_ASSERT(h_getset == NULL || DUK_HEAPHDR_IS_OBJECT((duk_heaphdr *) h_getset)); DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, h_getset); } else { duk_tval *tv_val; tv_val = &p_val[n].v; DUK_TVAL_DECREF_NORZ(thr, tv_val); } } p_tv = DUK_HOBJECT_A_GET_BASE(heap, h); n = DUK_HOBJECT_GET_ASIZE(h); while (n-- > 0) { duk_tval *tv_val; tv_val = p_tv + n; DUK_TVAL_DECREF_NORZ(thr, tv_val); } /* Hash part is a 'weak reference' and doesn't contribute to refcounts. */ h_proto = (duk_hobject *) DUK_HOBJECT_GET_PROTOTYPE(heap, h); DUK_ASSERT(h_proto == NULL || DUK_HEAPHDR_IS_OBJECT((duk_heaphdr *) h_proto)); DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, h_proto); /* XXX: Object subclass tests are quite awkward at present, ideally * we should be able to switch-case here with a dense index (subtype * number or something). For now, fast path plain objects and arrays * and bit test the rest individually. */ if (DUK_HOBJECT_HAS_FASTREFS(h)) { /* Plain object or array, nothing more to do. While a * duk_harray has additional fields, none of them need * DECREF updates. */ DUK_ASSERT(DUK_HOBJECT_ALLOWS_FASTREFS(h)); return; } DUK_ASSERT(DUK_HOBJECT_PROHIBITS_FASTREFS(h)); /* Slow path: special object, start bit checks from most likely. */ /* XXX: reorg, more common first */ if (DUK_HOBJECT_IS_COMPFUNC(h)) { duk_hcompfunc *f = (duk_hcompfunc *) h; duk_tval *tv, *tv_end; duk_hobject **funcs, **funcs_end; DUK_ASSERT_HCOMPFUNC_VALID(f); if (DUK_LIKELY(DUK_HCOMPFUNC_GET_DATA(heap, f) != NULL)) { tv = DUK_HCOMPFUNC_GET_CONSTS_BASE(heap, f); tv_end = DUK_HCOMPFUNC_GET_CONSTS_END(heap, f); while (tv < tv_end) { DUK_TVAL_DECREF_NORZ(thr, tv); tv++; } funcs = DUK_HCOMPFUNC_GET_FUNCS_BASE(heap, f); funcs_end = DUK_HCOMPFUNC_GET_FUNCS_END(heap, f); while (funcs < funcs_end) { duk_hobject *h_func; h_func = *funcs; DUK_ASSERT(h_func != NULL); DUK_ASSERT(DUK_HEAPHDR_IS_OBJECT((duk_heaphdr *) h_func)); DUK_HCOMPFUNC_DECREF_NORZ(thr, (duk_hcompfunc *) h_func); funcs++; } } else { /* May happen in some out-of-memory corner cases. */ DUK_D(DUK_DPRINT("duk_hcompfunc 'data' is NULL, skipping decref")); } DUK_HEAPHDR_DECREF_ALLOWNULL(thr, (duk_heaphdr *) DUK_HCOMPFUNC_GET_LEXENV(heap, f)); DUK_HEAPHDR_DECREF_ALLOWNULL(thr, (duk_heaphdr *) DUK_HCOMPFUNC_GET_VARENV(heap, f)); DUK_HEAPHDR_DECREF_ALLOWNULL(thr, (duk_hbuffer *) DUK_HCOMPFUNC_GET_DATA(heap, f)); } else if (DUK_HOBJECT_IS_DECENV(h)) { duk_hdecenv *e = (duk_hdecenv *) h; DUK_ASSERT_HDECENV_VALID(e); DUK_HTHREAD_DECREF_NORZ_ALLOWNULL(thr, e->thread); DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, e->varmap); } else if (DUK_HOBJECT_IS_OBJENV(h)) { duk_hobjenv *e = (duk_hobjenv *) h; DUK_ASSERT_HOBJENV_VALID(e); DUK_ASSERT(e->target != NULL); /* Required for object environments. */ DUK_HOBJECT_DECREF_NORZ(thr, e->target); #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) } else if (DUK_HOBJECT_IS_BUFOBJ(h)) { duk_hbufobj *b = (duk_hbufobj *) h; DUK_ASSERT_HBUFOBJ_VALID(b); DUK_HBUFFER_DECREF_NORZ_ALLOWNULL(thr, (duk_hbuffer *) b->buf); DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, (duk_hobject *) b->buf_prop); #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ } else if (DUK_HOBJECT_IS_BOUNDFUNC(h)) { duk_hboundfunc *f = (duk_hboundfunc *) h; DUK_ASSERT_HBOUNDFUNC_VALID(f); DUK_TVAL_DECREF_NORZ(thr, &f->target); DUK_TVAL_DECREF_NORZ(thr, &f->this_binding); duk__decref_tvals_norz(thr, f->args, f->nargs); #if defined(DUK_USE_ES6_PROXY) } else if (DUK_HOBJECT_IS_PROXY(h)) { duk_hproxy *p = (duk_hproxy *) h; DUK_ASSERT_HPROXY_VALID(p); DUK_HOBJECT_DECREF_NORZ(thr, p->target); DUK_HOBJECT_DECREF_NORZ(thr, p->handler); #endif /* DUK_USE_ES6_PROXY */ } else if (DUK_HOBJECT_IS_THREAD(h)) { duk_hthread *t = (duk_hthread *) h; duk_activation *act; duk_tval *tv; DUK_ASSERT_HTHREAD_VALID(t); tv = t->valstack; while (tv < t->valstack_top) { DUK_TVAL_DECREF_NORZ(thr, tv); tv++; } for (act = t->callstack_curr; act != NULL; act = act->parent) { DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, (duk_hobject *) DUK_ACT_GET_FUNC(act)); DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, (duk_hobject *) act->var_env); DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, (duk_hobject *) act->lex_env); #if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY) DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, (duk_hobject *) act->prev_caller); #endif #if 0 /* nothing now */ for (cat = act->cat; cat != NULL; cat = cat->parent) { } #endif } for (i = 0; i < DUK_NUM_BUILTINS; i++) { DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, (duk_hobject *) t->builtins[i]); } DUK_HTHREAD_DECREF_NORZ_ALLOWNULL(thr, (duk_hthread *) t->resumer); } else { /* We may come here if the object should have a FASTREFS flag * but it's missing for some reason. Assert for never getting * here; however, other than performance, this is harmless. */ DUK_D(DUK_DPRINT("missing FASTREFS flag for: %!iO", h)); DUK_ASSERT(0); } } DUK_INTERNAL void duk_heaphdr_refcount_finalize_norz(duk_heap *heap, duk_heaphdr *hdr) { DUK_ASSERT(heap != NULL); DUK_ASSERT(heap->heap_thread != NULL); DUK_ASSERT(hdr != NULL); if (DUK_HEAPHDR_IS_OBJECT(hdr)) { duk_hobject_refcount_finalize_norz(heap, (duk_hobject *) hdr); } /* DUK_HTYPE_BUFFER: nothing to finalize */ /* DUK_HTYPE_STRING: nothing to finalize */ } /* * Refzero processing for duk_hobject: queue a refzero'ed object to either * finalize_list or refzero_list and process the relevent list(s) if * necessary. * * Refzero_list is single linked, with only 'prev' pointers set and valid. * All 'next' pointers are intentionally left as garbage. This doesn't * matter because refzero_list is processed to completion before any other * code (like mark-and-sweep) might walk the list. * * In more detail: * * - On first insert refzero_list is NULL and the new object becomes the * first and only element on the list; duk__refcount_free_pending() is * called and it starts processing the list from the initial element, * i.e. the list tail. * * - As each object is refcount finalized, new objects may be queued to * refzero_list head. Their 'next' pointers are left as garbage, but * 'prev' points are set correctly, with the element at refzero_list * having a NULL 'prev' pointer. The fact that refzero_list is non-NULL * is used to reject (1) recursive duk__refcount_free_pending() and * (2) finalize_list processing calls. * * - When we're done with the current object, read its 'prev' pointer and * free the object. If 'prev' is NULL, we've reached head of list and are * done: set refzero_list to NULL and process pending finalizers. Otherwise * continue processing the list. * * A refzero cascade is free of side effects because it only involves * queueing more objects and freeing memory; finalizer execution is blocked * in the code path queueing objects to finalize_list. As a result the * initial refzero call (which triggers duk__refcount_free_pending()) must * check finalize_list so that finalizers are executed snappily. * * If finalize_list processing starts first, refzero may occur while we're * processing finalizers. That's fine: that particular refzero cascade is * handled to completion without side effects. Once the cascade is complete, * we'll run pending finalizers but notice that we're already doing that and * return. * * This could be expanded to allow incremental freeing: just bail out * early and resume at a future alloc/decref/refzero. However, if that * were done, the list structure would need to be kept consistent at all * times, mark-and-sweep would need to handle refzero_list, etc. */ DUK_LOCAL void duk__refcount_free_pending(duk_heap *heap) { duk_heaphdr *curr; #if defined(DUK_USE_DEBUG) duk_int_t count = 0; #endif DUK_ASSERT(heap != NULL); curr = heap->refzero_list; DUK_ASSERT(curr != NULL); DUK_ASSERT(DUK_HEAPHDR_GET_PREV(heap, curr) == NULL); /* We're called on initial insert only. */ /* curr->next is GARBAGE. */ do { duk_heaphdr *prev; DUK_DDD(DUK_DDDPRINT("refzero processing %p: %!O", (void *) curr, (duk_heaphdr *) curr)); #if defined(DUK_USE_DEBUG) count++; #endif DUK_ASSERT(curr != NULL); DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(curr) == DUK_HTYPE_OBJECT); /* currently, always the case */ /* FINALIZED may be set; don't care about flags here. */ /* Refcount finalize 'curr'. Refzero_list must be non-NULL * here to prevent recursive entry to duk__refcount_free_pending(). */ DUK_ASSERT(heap->refzero_list != NULL); duk_hobject_refcount_finalize_norz(heap, (duk_hobject *) curr); prev = DUK_HEAPHDR_GET_PREV(heap, curr); DUK_ASSERT((prev == NULL && heap->refzero_list == curr) || \ (prev != NULL && heap->refzero_list != curr)); /* prev->next is intentionally not updated and is garbage. */ duk_free_hobject(heap, (duk_hobject *) curr); /* Invalidates 'curr'. */ curr = prev; } while (curr != NULL); heap->refzero_list = NULL; DUK_DD(DUK_DDPRINT("refzero processed %ld objects", (long) count)); } DUK_LOCAL DUK_INLINE void duk__refcount_refzero_hobject(duk_heap *heap, duk_hobject *obj, duk_bool_t skip_free_pending) { duk_heaphdr *hdr; duk_heaphdr *root; DUK_ASSERT(heap != NULL); DUK_ASSERT(heap->heap_thread != NULL); DUK_ASSERT(obj != NULL); DUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) obj) == DUK_HTYPE_OBJECT); hdr = (duk_heaphdr *) obj; /* Refzero'd objects must be in heap_allocated. They can't be in * finalize_list because all objects on finalize_list have an * artificial +1 refcount bump. */ #if defined(DUK_USE_ASSERTIONS) DUK_ASSERT(duk_heap_in_heap_allocated(heap, (duk_heaphdr *) obj)); #endif DUK_HEAP_REMOVE_FROM_HEAP_ALLOCATED(heap, hdr); #if defined(DUK_USE_FINALIZER_SUPPORT) /* This finalizer check MUST BE side effect free. It should also be * as fast as possible because it's applied to every object freed. */ if (DUK_UNLIKELY(DUK_HOBJECT_HAS_FINALIZER_FAST(heap, (duk_hobject *) hdr) != 0U)) { /* Special case: FINALIZED may be set if mark-and-sweep queued * object for finalization, the finalizer was executed (and * FINALIZED set), mark-and-sweep hasn't yet processed the * object again, but its refcount drops to zero. Free without * running the finalizer again. */ if (DUK_HEAPHDR_HAS_FINALIZED(hdr)) { DUK_D(DUK_DPRINT("refzero'd object has finalizer and FINALIZED is set -> free")); } else { /* Set FINALIZABLE flag so that all objects on finalize_list * will have it set and are thus detectable based on the * flag alone. */ DUK_HEAPHDR_SET_FINALIZABLE(hdr); DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZED(hdr)); #if defined(DUK_USE_REFERENCE_COUNTING) /* Bump refcount on finalize_list insert so that a * refzero can never occur when an object is waiting * for its finalizer call. Refzero might otherwise * now happen because we allow duk_push_heapptr() for * objects pending finalization. */ DUK_HEAPHDR_PREINC_REFCOUNT(hdr); #endif DUK_HEAP_INSERT_INTO_FINALIZE_LIST(heap, hdr); /* Process finalizers unless skipping is explicitly * requested (NORZ) or refzero_list is being processed * (avoids side effects during a refzero cascade). * If refzero_list is processed, the initial refzero * call will run pending finalizers when refzero_list * is done. */ if (!skip_free_pending && heap->refzero_list == NULL) { duk_heap_process_finalize_list(heap); } return; } } #endif /* DUK_USE_FINALIZER_SUPPORT */ /* No need to finalize, free object via refzero_list. */ root = heap->refzero_list; DUK_HEAPHDR_SET_PREV(heap, hdr, NULL); /* 'next' is left as GARBAGE. */ heap->refzero_list = hdr; if (root == NULL) { /* Object is now queued. Refzero_list was NULL so * no-one is currently processing it; do it here. * With refzero processing just doing a cascade of * free calls, we can process it directly even when * NORZ macros are used: there are no side effects. */ duk__refcount_free_pending(heap); DUK_ASSERT(heap->refzero_list == NULL); /* Process finalizers only after the entire cascade * is finished. In most cases there's nothing to * finalize, so fast path check to avoid a call. */ #if defined(DUK_USE_FINALIZER_SUPPORT) if (!skip_free_pending && DUK_UNLIKELY(heap->finalize_list != NULL)) { duk_heap_process_finalize_list(heap); } #endif } else { DUK_ASSERT(DUK_HEAPHDR_GET_PREV(heap, root) == NULL); DUK_HEAPHDR_SET_PREV(heap, root, hdr); /* Object is now queued. Because refzero_list was * non-NULL, it's already being processed by someone * in the C call stack, so we're done. */ } } #if defined(DUK_USE_FINALIZER_SUPPORT) DUK_INTERNAL DUK_ALWAYS_INLINE void duk_refzero_check_fast(duk_hthread *thr) { DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->heap != NULL); DUK_ASSERT(thr->heap->refzero_list == NULL); /* Processed to completion inline. */ if (DUK_UNLIKELY(thr->heap->finalize_list != NULL)) { duk_heap_process_finalize_list(thr->heap); } } DUK_INTERNAL void duk_refzero_check_slow(duk_hthread *thr) { DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->heap != NULL); DUK_ASSERT(thr->heap->refzero_list == NULL); /* Processed to completion inline. */ if (DUK_UNLIKELY(thr->heap->finalize_list != NULL)) { duk_heap_process_finalize_list(thr->heap); } } #endif /* DUK_USE_FINALIZER_SUPPORT */ /* * Refzero processing for duk_hstring. */ DUK_LOCAL DUK_INLINE void duk__refcount_refzero_hstring(duk_heap *heap, duk_hstring *str) { DUK_ASSERT(heap != NULL); DUK_ASSERT(heap->heap_thread != NULL); DUK_ASSERT(str != NULL); DUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) str) == DUK_HTYPE_STRING); duk_heap_strcache_string_remove(heap, str); duk_heap_strtable_unlink(heap, str); duk_free_hstring(heap, str); } /* * Refzero processing for duk_hbuffer. */ DUK_LOCAL DUK_INLINE void duk__refcount_refzero_hbuffer(duk_heap *heap, duk_hbuffer *buf) { DUK_ASSERT(heap != NULL); DUK_ASSERT(heap->heap_thread != NULL); DUK_ASSERT(buf != NULL); DUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) buf) == DUK_HTYPE_BUFFER); DUK_HEAP_REMOVE_FROM_HEAP_ALLOCATED(heap, (duk_heaphdr *) buf); duk_free_hbuffer(heap, buf); } /* * Incref and decref functions. * * Decref may trigger immediate refzero handling, which may free and finalize * an arbitrary number of objects (a "DECREF cascade"). * * Refzero handling is skipped entirely if (1) mark-and-sweep is running or * (2) execution is paused in the debugger. The objects are left in the heap, * and will be freed by mark-and-sweep or eventual heap destruction. * * This is necessary during mark-and-sweep because refcounts are also updated * during the sweep phase (otherwise objects referenced by a swept object * would have incorrect refcounts) which then calls here. This could be * avoided by using separate decref macros in mark-and-sweep; however, * mark-and-sweep also calls finalizers which would use the ordinary decref * macros anyway. * * We can't process refzeros (= free objects) when the debugger is running * as the debugger might make an object unreachable but still continue * inspecting it (or even cause it to be pushed back). So we must rely on * mark-and-sweep to collect them. * * The DUK__RZ_SUPPRESS_CHECK() condition is also used in heap destruction * when running finalizers for remaining objects: the flag prevents objects * from being moved around in heap linked lists while that's being done. * * The suppress condition is important to performance. */ #define DUK__RZ_SUPPRESS_ASSERT1() do { \ DUK_ASSERT(thr != NULL); \ DUK_ASSERT(thr->heap != NULL); \ /* When mark-and-sweep runs, heap_thread must exist. */ \ DUK_ASSERT(thr->heap->ms_running == 0 || thr->heap->heap_thread != NULL); \ /* When mark-and-sweep runs, the 'thr' argument always matches heap_thread. \ * This could be used to e.g. suppress check against 'thr' directly (and \ * knowing it would be heap_thread); not really used now. \ */ \ DUK_ASSERT(thr->heap->ms_running == 0 || thr == thr->heap->heap_thread); \ /* We may be called when the heap is initializing and we process \ * refzeros normally, but mark-and-sweep and finalizers are prevented \ * if that's the case. \ */ \ DUK_ASSERT(thr->heap->heap_initializing == 0 || thr->heap->ms_prevent_count > 0); \ DUK_ASSERT(thr->heap->heap_initializing == 0 || thr->heap->pf_prevent_count > 0); \ } while (0) #if defined(DUK_USE_DEBUGGER_SUPPORT) #define DUK__RZ_SUPPRESS_ASSERT2() do { \ /* When debugger is paused, ms_running is set. */ \ DUK_ASSERT(!DUK_HEAP_HAS_DEBUGGER_PAUSED(thr->heap) || thr->heap->ms_running != 0); \ } while (0) #define DUK__RZ_SUPPRESS_COND() (heap->ms_running != 0) #else #define DUK__RZ_SUPPRESS_ASSERT2() do { } while (0) #define DUK__RZ_SUPPRESS_COND() (heap->ms_running != 0) #endif /* DUK_USE_DEBUGGER_SUPPORT */ #define DUK__RZ_SUPPRESS_CHECK() do { \ DUK__RZ_SUPPRESS_ASSERT1(); \ DUK__RZ_SUPPRESS_ASSERT2(); \ if (DUK_UNLIKELY(DUK__RZ_SUPPRESS_COND())) { \ DUK_DDD(DUK_DDDPRINT("refzero handling suppressed (not even queued) when mark-and-sweep running, object: %p", (void *) h)); \ return; \ } \ } while (0) #define DUK__RZ_STRING() do { \ duk__refcount_refzero_hstring(heap, (duk_hstring *) h); \ } while (0) #define DUK__RZ_BUFFER() do { \ duk__refcount_refzero_hbuffer(heap, (duk_hbuffer *) h); \ } while (0) #define DUK__RZ_OBJECT() do { \ duk__refcount_refzero_hobject(heap, (duk_hobject *) h, skip_free_pending); \ } while (0) /* XXX: test the effect of inlining here vs. NOINLINE in refzero helpers */ #if defined(DUK_USE_FAST_REFCOUNT_DEFAULT) #define DUK__RZ_INLINE DUK_ALWAYS_INLINE #else #define DUK__RZ_INLINE /*nop*/ #endif DUK_LOCAL DUK__RZ_INLINE void duk__hstring_refzero_helper(duk_hthread *thr, duk_hstring *h) { duk_heap *heap; DUK_ASSERT(thr != NULL); DUK_ASSERT(h != NULL); heap = thr->heap; DUK__RZ_SUPPRESS_CHECK(); DUK__RZ_STRING(); } DUK_LOCAL DUK__RZ_INLINE void duk__hbuffer_refzero_helper(duk_hthread *thr, duk_hbuffer *h) { duk_heap *heap; DUK_ASSERT(thr != NULL); DUK_ASSERT(h != NULL); heap = thr->heap; DUK__RZ_SUPPRESS_CHECK(); DUK__RZ_BUFFER(); } DUK_LOCAL DUK__RZ_INLINE void duk__hobject_refzero_helper(duk_hthread *thr, duk_hobject *h, duk_bool_t skip_free_pending) { duk_heap *heap; DUK_ASSERT(thr != NULL); DUK_ASSERT(h != NULL); heap = thr->heap; DUK__RZ_SUPPRESS_CHECK(); DUK__RZ_OBJECT(); } DUK_LOCAL DUK__RZ_INLINE void duk__heaphdr_refzero_helper(duk_hthread *thr, duk_heaphdr *h, duk_bool_t skip_free_pending) { duk_heap *heap; duk_small_uint_t htype; DUK_ASSERT(thr != NULL); DUK_ASSERT(h != NULL); heap = thr->heap; htype = (duk_small_uint_t) DUK_HEAPHDR_GET_TYPE(h); DUK__RZ_SUPPRESS_CHECK(); switch (htype) { case DUK_HTYPE_STRING: /* Strings have no internal references but do have "weak" * references in the string cache. Also note that strings * are not on the heap_allocated list like other heap * elements. */ DUK__RZ_STRING(); break; case DUK_HTYPE_OBJECT: /* Objects have internal references. Must finalize through * the "refzero" work list. */ DUK__RZ_OBJECT(); break; default: /* Buffers have no internal references. However, a dynamic * buffer has a separate allocation for the buffer. This is * freed by duk_heap_free_heaphdr_raw(). */ DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(h) == DUK_HTYPE_BUFFER); DUK__RZ_BUFFER(); break; } } DUK_INTERNAL DUK_NOINLINE void duk_heaphdr_refzero(duk_hthread *thr, duk_heaphdr *h) { duk__heaphdr_refzero_helper(thr, h, 0 /*skip_free_pending*/); } DUK_INTERNAL DUK_NOINLINE void duk_heaphdr_refzero_norz(duk_hthread *thr, duk_heaphdr *h) { duk__heaphdr_refzero_helper(thr, h, 1 /*skip_free_pending*/); } DUK_INTERNAL DUK_NOINLINE void duk_hstring_refzero(duk_hthread *thr, duk_hstring *h) { duk__hstring_refzero_helper(thr, h); } DUK_INTERNAL DUK_NOINLINE void duk_hbuffer_refzero(duk_hthread *thr, duk_hbuffer *h) { duk__hbuffer_refzero_helper(thr, h); } DUK_INTERNAL DUK_NOINLINE void duk_hobject_refzero(duk_hthread *thr, duk_hobject *h) { duk__hobject_refzero_helper(thr, h, 0 /*skip_free_pending*/); } DUK_INTERNAL DUK_NOINLINE void duk_hobject_refzero_norz(duk_hthread *thr, duk_hobject *h) { duk__hobject_refzero_helper(thr, h, 1 /*skip_free_pending*/); } #if !defined(DUK_USE_FAST_REFCOUNT_DEFAULT) DUK_INTERNAL void duk_tval_incref(duk_tval *tv) { DUK_ASSERT(tv != NULL); if (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv)) { duk_heaphdr *h = DUK_TVAL_GET_HEAPHDR(tv); DUK_ASSERT(h != NULL); DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(h)); DUK_ASSERT_DISABLE(h->h_refcount >= 0); DUK_HEAPHDR_PREINC_REFCOUNT(h); DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(h) != 0); /* No wrapping. */ } } DUK_INTERNAL void duk_tval_decref(duk_hthread *thr, duk_tval *tv) { DUK_ASSERT(thr != NULL); DUK_ASSERT(tv != NULL); if (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv)) { duk_heaphdr *h = DUK_TVAL_GET_HEAPHDR(tv); DUK_ASSERT(h != NULL); DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(h)); DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(h) >= 1); #if 0 if (DUK_HEAPHDR_PREDEC_REFCOUNT(h) != 0) { return; } duk_heaphdr_refzero(thr, h); #else duk_heaphdr_decref(thr, h); #endif } } DUK_INTERNAL void duk_tval_decref_norz(duk_hthread *thr, duk_tval *tv) { DUK_ASSERT(thr != NULL); DUK_ASSERT(tv != NULL); if (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv)) { duk_heaphdr *h = DUK_TVAL_GET_HEAPHDR(tv); DUK_ASSERT(h != NULL); DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(h)); DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(h) >= 1); #if 0 if (DUK_HEAPHDR_PREDEC_REFCOUNT(h) != 0) { return; } duk_heaphdr_refzero_norz(thr, h); #else duk_heaphdr_decref_norz(thr, h); #endif } } #endif /* !DUK_USE_FAST_REFCOUNT_DEFAULT */ #define DUK__DECREF_ASSERTS() do { \ DUK_ASSERT(thr != NULL); \ DUK_ASSERT(thr->heap != NULL); \ DUK_ASSERT(h != NULL); \ DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID((duk_heaphdr *) h)); \ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) h) >= 1); \ } while (0) #if defined(DUK_USE_ROM_OBJECTS) #define DUK__INCREF_SHARED() do { \ if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) h)) { \ return; \ } \ DUK_HEAPHDR_PREINC_REFCOUNT((duk_heaphdr *) h); \ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) h) != 0); /* No wrapping. */ \ } while (0) #define DUK__DECREF_SHARED() do { \ if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) h)) { \ return; \ } \ if (DUK_HEAPHDR_PREDEC_REFCOUNT((duk_heaphdr *) h) != 0) { \ return; \ } \ } while (0) #else #define DUK__INCREF_SHARED() do { \ DUK_HEAPHDR_PREINC_REFCOUNT((duk_heaphdr *) h); \ DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) h) != 0); /* No wrapping. */ \ } while (0) #define DUK__DECREF_SHARED() do { \ if (DUK_HEAPHDR_PREDEC_REFCOUNT((duk_heaphdr *) h) != 0) { \ return; \ } \ } while (0) #endif #if !defined(DUK_USE_FAST_REFCOUNT_DEFAULT) /* This will in practice be inlined because it's just an INC instructions * and a bit test + INC when ROM objects are enabled. */ DUK_INTERNAL void duk_heaphdr_incref(duk_heaphdr *h) { DUK_ASSERT(h != NULL); DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(h)); DUK_ASSERT_DISABLE(DUK_HEAPHDR_GET_REFCOUNT(h) >= 0); DUK__INCREF_SHARED(); } DUK_INTERNAL void duk_heaphdr_decref(duk_hthread *thr, duk_heaphdr *h) { DUK__DECREF_ASSERTS(); DUK__DECREF_SHARED(); duk_heaphdr_refzero(thr, h); /* Forced mark-and-sweep when GC torture enabled; this could happen * on any DECREF (but not DECREF_NORZ). */ DUK_GC_TORTURE(thr->heap); } DUK_INTERNAL void duk_heaphdr_decref_norz(duk_hthread *thr, duk_heaphdr *h) { DUK__DECREF_ASSERTS(); DUK__DECREF_SHARED(); duk_heaphdr_refzero_norz(thr, h); } #endif /* !DUK_USE_FAST_REFCOUNT_DEFAULT */ #if 0 /* Not needed. */ DUK_INTERNAL void duk_hstring_decref(duk_hthread *thr, duk_hstring *h) { DUK__DECREF_ASSERTS(); DUK__DECREF_SHARED(); duk_hstring_refzero(thr, h); } DUK_INTERNAL void duk_hstring_decref_norz(duk_hthread *thr, duk_hstring *h) { DUK__DECREF_ASSERTS(); DUK__DECREF_SHARED(); duk_hstring_refzero_norz(thr, h); } DUK_INTERNAL void duk_hbuffer_decref(duk_hthread *thr, duk_hbuffer *h) { DUK__DECREF_ASSERTS(); DUK__DECREF_SHARED(); duk_hbuffer_refzero(thr, h); } DUK_INTERNAL void duk_hbuffer_decref_norz(duk_hthread *thr, duk_hbuffer *h) { DUK__DECREF_ASSERTS(); DUK__DECREF_SHARED(); duk_hbuffer_refzero_norz(thr, h); } DUK_INTERNAL void duk_hobject_decref(duk_hthread *thr, duk_hobject *h) { DUK__DECREF_ASSERTS(); DUK__DECREF_SHARED(); duk_hobject_refzero(thr, h); } DUK_INTERNAL void duk_hobject_decref_norz(duk_hthread *thr, duk_hobject *h) { DUK__DECREF_ASSERTS(); DUK__DECREF_SHARED(); duk_hobject_refzero_norz(thr, h); } #endif #else /* DUK_USE_REFERENCE_COUNTING */ /* no refcounting */ #endif /* DUK_USE_REFERENCE_COUNTING */ /* automatic undefs */ #undef DUK__DECREF_ASSERTS #undef DUK__DECREF_SHARED #undef DUK__INCREF_SHARED #undef DUK__RZ_BUFFER #undef DUK__RZ_INLINE #undef DUK__RZ_OBJECT #undef DUK__RZ_STRING #undef DUK__RZ_SUPPRESS_ASSERT1 #undef DUK__RZ_SUPPRESS_ASSERT2 #undef DUK__RZ_SUPPRESS_CHECK #undef DUK__RZ_SUPPRESS_COND #line 1 "duk_heap_stringcache.c" /* * String cache. * * Provides a cache to optimize indexed string lookups. The cache keeps * track of (byte offset, char offset) states for a fixed number of strings. * Otherwise we'd need to scan from either end of the string, as we store * strings in (extended) UTF-8. */ /* #include duk_internal.h -> already included */ /* * Delete references to given hstring from the heap string cache. * * String cache references are 'weak': they are not counted towards * reference counts, nor serve as roots for mark-and-sweep. When an * object is about to be freed, such references need to be removed. */ DUK_INTERNAL void duk_heap_strcache_string_remove(duk_heap *heap, duk_hstring *h) { duk_small_int_t i; for (i = 0; i < DUK_HEAP_STRCACHE_SIZE; i++) { duk_strcache *c = heap->strcache + i; if (c->h == h) { DUK_DD(DUK_DDPRINT("deleting weak strcache reference to hstring %p from heap %p", (void *) h, (void *) heap)); c->h = NULL; /* XXX: the string shouldn't appear twice, but we now loop to the * end anyway; if fixed, add a looping assertion to ensure there * is no duplicate. */ } } } /* * String scanning helpers * * All bytes other than UTF-8 continuation bytes ([0x80,0xbf]) are * considered to contribute a character. This must match how string * character length is computed. */ DUK_LOCAL const duk_uint8_t *duk__scan_forwards(const duk_uint8_t *p, const duk_uint8_t *q, duk_uint_fast32_t n) { while (n > 0) { for (;;) { p++; if (p >= q) { return NULL; } if ((*p & 0xc0) != 0x80) { break; } } n--; } return p; } DUK_LOCAL const duk_uint8_t *duk__scan_backwards(const duk_uint8_t *p, const duk_uint8_t *q, duk_uint_fast32_t n) { while (n > 0) { for (;;) { p--; if (p < q) { return NULL; } if ((*p & 0xc0) != 0x80) { break; } } n--; } return p; } /* * Convert char offset to byte offset * * Avoid using the string cache if possible: for ASCII strings byte and * char offsets are equal and for short strings direct scanning may be * better than using the string cache (which may evict a more important * entry). * * Typing now assumes 32-bit string byte/char offsets (duk_uint_fast32_t). * Better typing might be to use duk_size_t. * * Caller should ensure 'char_offset' is within the string bounds [0,charlen] * (endpoint is inclusive). If this is not the case, no memory unsafe * behavior will happen but an error will be thrown. */ DUK_INTERNAL duk_uint_fast32_t duk_heap_strcache_offset_char2byte(duk_hthread *thr, duk_hstring *h, duk_uint_fast32_t char_offset) { duk_heap *heap; duk_strcache *sce; duk_uint_fast32_t byte_offset; duk_small_int_t i; duk_bool_t use_cache; duk_uint_fast32_t dist_start, dist_end, dist_sce; duk_uint_fast32_t char_length; const duk_uint8_t *p_start; const duk_uint8_t *p_end; const duk_uint8_t *p_found; /* * For ASCII strings, the answer is simple. */ if (DUK_LIKELY(DUK_HSTRING_IS_ASCII(h))) { return char_offset; } char_length = (duk_uint_fast32_t) DUK_HSTRING_GET_CHARLEN(h); DUK_ASSERT(char_offset <= char_length); if (DUK_LIKELY(DUK_HSTRING_IS_ASCII(h))) { /* Must recheck because the 'is ascii' flag may be set * lazily. Alternatively, we could just compare charlen * to bytelen. */ return char_offset; } /* * For non-ASCII strings, we need to scan forwards or backwards * from some starting point. The starting point may be the start * or end of the string, or some cached midpoint in the string * cache. * * For "short" strings we simply scan without checking or updating * the cache. For longer strings we check and update the cache as * necessary, inserting a new cache entry if none exists. */ DUK_DDD(DUK_DDDPRINT("non-ascii string %p, char_offset=%ld, clen=%ld, blen=%ld", (void *) h, (long) char_offset, (long) DUK_HSTRING_GET_CHARLEN(h), (long) DUK_HSTRING_GET_BYTELEN(h))); heap = thr->heap; sce = NULL; use_cache = (char_length > DUK_HEAP_STRINGCACHE_NOCACHE_LIMIT); if (use_cache) { #if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) DUK_DDD(DUK_DDDPRINT("stringcache before char2byte (using cache):")); for (i = 0; i < DUK_HEAP_STRCACHE_SIZE; i++) { duk_strcache *c = heap->strcache + i; DUK_DDD(DUK_DDDPRINT(" [%ld] -> h=%p, cidx=%ld, bidx=%ld", (long) i, (void *) c->h, (long) c->cidx, (long) c->bidx)); } #endif for (i = 0; i < DUK_HEAP_STRCACHE_SIZE; i++) { duk_strcache *c = heap->strcache + i; if (c->h == h) { sce = c; break; } } } /* * Scan from shortest distance: * - start of string * - end of string * - cache entry (if exists) */ DUK_ASSERT(DUK_HSTRING_GET_CHARLEN(h) >= char_offset); dist_start = char_offset; dist_end = char_length - char_offset; dist_sce = 0; DUK_UNREF(dist_sce); /* initialize for debug prints, needed if sce==NULL */ p_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h); p_end = (const duk_uint8_t *) (p_start + DUK_HSTRING_GET_BYTELEN(h)); p_found = NULL; if (sce) { if (char_offset >= sce->cidx) { dist_sce = char_offset - sce->cidx; if ((dist_sce <= dist_start) && (dist_sce <= dist_end)) { DUK_DDD(DUK_DDDPRINT("non-ascii string, use_cache=%ld, sce=%p:%ld:%ld, " "dist_start=%ld, dist_end=%ld, dist_sce=%ld => " "scan forwards from sce", (long) use_cache, (void *) (sce ? sce->h : NULL), (sce ? (long) sce->cidx : (long) -1), (sce ? (long) sce->bidx : (long) -1), (long) dist_start, (long) dist_end, (long) dist_sce)); p_found = duk__scan_forwards(p_start + sce->bidx, p_end, dist_sce); goto scan_done; } } else { dist_sce = sce->cidx - char_offset; if ((dist_sce <= dist_start) && (dist_sce <= dist_end)) { DUK_DDD(DUK_DDDPRINT("non-ascii string, use_cache=%ld, sce=%p:%ld:%ld, " "dist_start=%ld, dist_end=%ld, dist_sce=%ld => " "scan backwards from sce", (long) use_cache, (void *) (sce ? sce->h : NULL), (sce ? (long) sce->cidx : (long) -1), (sce ? (long) sce->bidx : (long) -1), (long) dist_start, (long) dist_end, (long) dist_sce)); p_found = duk__scan_backwards(p_start + sce->bidx, p_start, dist_sce); goto scan_done; } } } /* no sce, or sce scan not best */ if (dist_start <= dist_end) { DUK_DDD(DUK_DDDPRINT("non-ascii string, use_cache=%ld, sce=%p:%ld:%ld, " "dist_start=%ld, dist_end=%ld, dist_sce=%ld => " "scan forwards from string start", (long) use_cache, (void *) (sce ? sce->h : NULL), (sce ? (long) sce->cidx : (long) -1), (sce ? (long) sce->bidx : (long) -1), (long) dist_start, (long) dist_end, (long) dist_sce)); p_found = duk__scan_forwards(p_start, p_end, dist_start); } else { DUK_DDD(DUK_DDDPRINT("non-ascii string, use_cache=%ld, sce=%p:%ld:%ld, " "dist_start=%ld, dist_end=%ld, dist_sce=%ld => " "scan backwards from string end", (long) use_cache, (void *) (sce ? sce->h : NULL), (sce ? (long) sce->cidx : (long) -1), (sce ? (long) sce->bidx : (long) -1), (long) dist_start, (long) dist_end, (long) dist_sce)); p_found = duk__scan_backwards(p_end, p_start, dist_end); } scan_done: if (DUK_UNLIKELY(p_found == NULL)) { /* Scan error: this shouldn't normally happen; it could happen if * string is not valid UTF-8 data, and clen/blen are not consistent * with the scanning algorithm. */ goto scan_error; } DUK_ASSERT(p_found >= p_start); DUK_ASSERT(p_found <= p_end); /* may be equal */ byte_offset = (duk_uint32_t) (p_found - p_start); DUK_DDD(DUK_DDDPRINT("-> string %p, cidx %ld -> bidx %ld", (void *) h, (long) char_offset, (long) byte_offset)); /* * Update cache entry (allocating if necessary), and move the * cache entry to the first place (in an "LRU" policy). */ if (use_cache) { /* update entry, allocating if necessary */ if (!sce) { sce = heap->strcache + DUK_HEAP_STRCACHE_SIZE - 1; /* take last entry */ sce->h = h; } DUK_ASSERT(sce != NULL); sce->bidx = (duk_uint32_t) (p_found - p_start); sce->cidx = (duk_uint32_t) char_offset; /* LRU: move our entry to first */ if (sce > &heap->strcache[0]) { /* * A C * B A * C <- sce ==> B * D D */ duk_strcache tmp; tmp = *sce; DUK_MEMMOVE((void *) (&heap->strcache[1]), (const void *) (&heap->strcache[0]), (size_t) (((char *) sce) - ((char *) &heap->strcache[0]))); heap->strcache[0] = tmp; /* 'sce' points to the wrong entry here, but is no longer used */ } #if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) DUK_DDD(DUK_DDDPRINT("stringcache after char2byte (using cache):")); for (i = 0; i < DUK_HEAP_STRCACHE_SIZE; i++) { duk_strcache *c = heap->strcache + i; DUK_DDD(DUK_DDDPRINT(" [%ld] -> h=%p, cidx=%ld, bidx=%ld", (long) i, (void *) c->h, (long) c->cidx, (long) c->bidx)); } #endif } return byte_offset; scan_error: DUK_ERROR_INTERNAL(thr); return 0; } #line 1 "duk_heap_stringtable.c" /* * Heap string table handling, string interning. */ /* #include duk_internal.h -> already included */ /* Resize checks not needed if minsize == maxsize, typical for low memory * targets. */ #define DUK__STRTAB_RESIZE_CHECK #if (DUK_USE_STRTAB_MINSIZE == DUK_USE_STRTAB_MAXSIZE) #undef DUK__STRTAB_RESIZE_CHECK #endif #if defined(DUK_USE_STRTAB_PTRCOMP) #define DUK__HEAPPTR_ENC16(heap,ptr) DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (ptr)) #define DUK__HEAPPTR_DEC16(heap,val) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (val)) #define DUK__GET_STRTABLE(heap) ((heap)->strtable16) #else #define DUK__HEAPPTR_ENC16(heap,ptr) (ptr) #define DUK__HEAPPTR_DEC16(heap,val) (val) #define DUK__GET_STRTABLE(heap) ((heap)->strtable) #endif #define DUK__STRTAB_U32_MAX_STRLEN 10 /* 4'294'967'295 */ /* * Debug dump stringtable. */ #if defined(DUK_USE_DEBUG) DUK_INTERNAL void duk_heap_strtable_dump(duk_heap *heap) { #if defined(DUK_USE_STRTAB_PTRCOMP) duk_uint16_t *strtable; #else duk_hstring **strtable; #endif duk_uint32_t i; duk_hstring *h; duk_size_t count_total = 0; duk_size_t count_chain; duk_size_t count_chain_min = DUK_SIZE_MAX; duk_size_t count_chain_max = 0; duk_size_t count_len[8]; /* chain lengths from 0 to 7 */ if (heap == NULL) { DUK_D(DUK_DPRINT("string table, heap=NULL")); return; } strtable = DUK__GET_STRTABLE(heap); if (strtable == NULL) { DUK_D(DUK_DPRINT("string table, strtab=NULL")); return; } DUK_MEMZERO((void *) count_len, sizeof(count_len)); for (i = 0; i < heap->st_size; i++) { h = DUK__HEAPPTR_DEC16(heap, strtable[i]); count_chain = 0; while (h != NULL) { count_chain++; h = h->hdr.h_next; } if (count_chain < sizeof(count_len) / sizeof(duk_size_t)) { count_len[count_chain]++; } count_chain_max = (count_chain > count_chain_max ? count_chain : count_chain_max); count_chain_min = (count_chain < count_chain_min ? count_chain : count_chain_min); count_total += count_chain; } DUK_D(DUK_DPRINT("string table, strtab=%p, count=%lu, chain min=%lu max=%lu avg=%lf: " "counts: %lu %lu %lu %lu %lu %lu %lu %lu ...", (void *) heap->strtable, (unsigned long) count_total, (unsigned long) count_chain_min, (unsigned long) count_chain_max, (double) count_total / (double) heap->st_size, (unsigned long) count_len[0], (unsigned long) count_len[1], (unsigned long) count_len[2], (unsigned long) count_len[3], (unsigned long) count_len[4], (unsigned long) count_len[5], (unsigned long) count_len[6], (unsigned long) count_len[7])); } #endif /* DUK_USE_DEBUG */ /* * Assertion helper to ensure strtable is populated correctly. */ #if defined(DUK_USE_ASSERTIONS) DUK_LOCAL void duk__strtable_assert_checks(duk_heap *heap) { #if defined(DUK_USE_STRTAB_PTRCOMP) duk_uint16_t *strtable; #else duk_hstring **strtable; #endif duk_uint32_t i; duk_hstring *h; duk_size_t count = 0; DUK_ASSERT(heap != NULL); strtable = DUK__GET_STRTABLE(heap); if (strtable != NULL) { DUK_ASSERT(heap->st_size != 0); DUK_ASSERT(heap->st_mask == heap->st_size - 1); for (i = 0; i < heap->st_size; i++) { h = DUK__HEAPPTR_DEC16(heap, strtable[i]); while (h != NULL) { DUK_ASSERT((DUK_HSTRING_GET_HASH(h) & heap->st_mask) == i); count++; h = h->hdr.h_next; } } } else { DUK_ASSERT(heap->st_size == 0); DUK_ASSERT(heap->st_mask == 0); } #if defined(DUK__STRTAB_RESIZE_CHECK) DUK_ASSERT(count == (duk_size_t) heap->st_count); #endif } #endif /* DUK_USE_ASSERTIONS */ /* * Allocate and initialize a duk_hstring. * * Returns a NULL if allocation or initialization fails for some reason. * * The string won't be inserted into the string table and isn't tracked in * any way (link pointers will be NULL). The caller must place the string * into the string table without any risk of a longjmp, otherwise the string * is leaked. */ DUK_LOCAL duk_hstring *duk__strtable_alloc_hstring(duk_heap *heap, const duk_uint8_t *str, duk_uint32_t blen, duk_uint32_t strhash, const duk_uint8_t *extdata) { duk_hstring *res; const duk_uint8_t *data; #if !defined(DUK_USE_HSTRING_ARRIDX) duk_uarridx_t dummy; #endif DUK_ASSERT(heap != NULL); DUK_UNREF(extdata); #if defined(DUK_USE_STRLEN16) /* If blen <= 0xffffUL, clen is also guaranteed to be <= 0xffffUL. */ if (blen > 0xffffUL) { DUK_D(DUK_DPRINT("16-bit string blen/clen active and blen over 16 bits, reject intern")); goto alloc_error; } #endif /* XXX: Memzeroing the allocated structure is not really necessary * because we could just initialize all fields explicitly (almost * all fields are initialized explicitly anyway). */ #if defined(DUK_USE_HSTRING_EXTDATA) && defined(DUK_USE_EXTSTR_INTERN_CHECK) if (extdata) { res = (duk_hstring *) DUK_ALLOC(heap, sizeof(duk_hstring_external)); if (DUK_UNLIKELY(res == NULL)) { goto alloc_error; } DUK_MEMZERO(res, sizeof(duk_hstring_external)); #if defined(DUK_USE_EXPLICIT_NULL_INIT) DUK_HEAPHDR_STRING_INIT_NULLS(&res->hdr); #endif DUK_HEAPHDR_SET_TYPE_AND_FLAGS(&res->hdr, DUK_HTYPE_STRING, DUK_HSTRING_FLAG_EXTDATA); DUK_ASSERT(extdata[blen] == 0); /* Application responsibility. */ data = extdata; ((duk_hstring_external *) res)->extdata = extdata; } else #endif /* DUK_USE_HSTRING_EXTDATA && DUK_USE_EXTSTR_INTERN_CHECK */ { duk_uint8_t *data_tmp; /* NUL terminate for convenient C access */ DUK_ASSERT(sizeof(duk_hstring) + blen + 1 > blen); /* No wrap, limits ensure. */ res = (duk_hstring *) DUK_ALLOC(heap, sizeof(duk_hstring) + blen + 1); if (DUK_UNLIKELY(res == NULL)) { goto alloc_error; } DUK_MEMZERO(res, sizeof(duk_hstring)); #if defined(DUK_USE_EXPLICIT_NULL_INIT) DUK_HEAPHDR_STRING_INIT_NULLS(&res->hdr); #endif DUK_HEAPHDR_SET_TYPE_AND_FLAGS(&res->hdr, DUK_HTYPE_STRING, 0); data_tmp = (duk_uint8_t *) (res + 1); DUK_MEMCPY(data_tmp, str, blen); data_tmp[blen] = (duk_uint8_t) 0; data = (const duk_uint8_t *) data_tmp; } DUK_HSTRING_SET_BYTELEN(res, blen); DUK_HSTRING_SET_HASH(res, strhash); DUK_ASSERT(!DUK_HSTRING_HAS_ARRIDX(res)); #if defined(DUK_USE_HSTRING_ARRIDX) res->arridx = duk_js_to_arrayindex_string(data, blen); if (res->arridx != DUK_HSTRING_NO_ARRAY_INDEX) { #else dummy = duk_js_to_arrayindex_string(data, blen); if (dummy != DUK_HSTRING_NO_ARRAY_INDEX) { #endif /* Array index strings cannot be symbol strings, * and they're always pure ASCII so blen == clen. */ DUK_HSTRING_SET_ARRIDX(res); DUK_HSTRING_SET_ASCII(res); DUK_ASSERT(duk_unicode_unvalidated_utf8_length(data, (duk_size_t) blen) == blen); } else { /* Because 'data' is NUL-terminated, we don't need a * blen > 0 check here. For NUL (0x00) the symbol * checks will be false. */ if (DUK_UNLIKELY(data[0] >= 0x80U)) { if (data[0] <= 0x81) { DUK_HSTRING_SET_SYMBOL(res); } else if (data[0] == 0x82U || data[0] == 0xffU) { DUK_HSTRING_SET_HIDDEN(res); DUK_HSTRING_SET_SYMBOL(res); } } /* Using an explicit 'ASCII' flag has larger footprint (one call site * only) but is quite useful for the case when there's no explicit * 'clen' in duk_hstring. * * The flag is set lazily for RAM strings. */ DUK_ASSERT(!DUK_HSTRING_HAS_ASCII(res)); #if defined(DUK_USE_HSTRING_LAZY_CLEN) /* Charlen initialized to 0, updated on-the-fly. */ #else duk_hstring_init_charlen(res); /* Also sets ASCII flag. */ #endif } DUK_DDD(DUK_DDDPRINT("interned string, hash=0x%08lx, blen=%ld, has_arridx=%ld, has_extdata=%ld", (unsigned long) DUK_HSTRING_GET_HASH(res), (long) DUK_HSTRING_GET_BYTELEN(res), (long) (DUK_HSTRING_HAS_ARRIDX(res) ? 1 : 0), (long) (DUK_HSTRING_HAS_EXTDATA(res) ? 1 : 0))); DUK_ASSERT(res != NULL); return res; alloc_error: return NULL; } /* * Grow strtable allocation in-place. */ #if defined(DUK__STRTAB_RESIZE_CHECK) DUK_LOCAL void duk__strtable_grow_inplace(duk_heap *heap) { duk_uint32_t new_st_size; duk_uint32_t old_st_size; duk_uint32_t i; duk_hstring *h; duk_hstring *next; duk_hstring *prev; #if defined(DUK_USE_STRTAB_PTRCOMP) duk_uint16_t *new_ptr; duk_uint16_t *new_ptr_high; #else duk_hstring **new_ptr; duk_hstring **new_ptr_high; #endif DUK_DD(DUK_DDPRINT("grow in-place: %lu -> %lu", (unsigned long) heap->st_size, (unsigned long) heap->st_size * 2)); DUK_ASSERT(heap != NULL); DUK_ASSERT(heap->st_resizing == 1); DUK_ASSERT(heap->st_size >= 2); DUK_ASSERT((heap->st_size & (heap->st_size - 1)) == 0); /* 2^N */ DUK_ASSERT(DUK__GET_STRTABLE(heap) != NULL); DUK_STATS_INC(heap, stats_strtab_resize_grow); new_st_size = heap->st_size << 1U; DUK_ASSERT(new_st_size > heap->st_size); /* No overflow. */ /* Reallocate the strtable first and then work in-place to rehash * strings. We don't need an indirect allocation here: even if GC * is triggered to satisfy the allocation, recursive strtable resize * is prevented by flags. This is also why we don't need to use * DUK_REALLOC_INDIRECT(). */ #if defined(DUK_USE_STRTAB_PTRCOMP) new_ptr = (duk_uint16_t *) DUK_REALLOC(heap, heap->strtable16, sizeof(duk_uint16_t) * new_st_size); #else new_ptr = (duk_hstring **) DUK_REALLOC(heap, heap->strtable, sizeof(duk_hstring *) * new_st_size); #endif if (DUK_UNLIKELY(new_ptr == NULL)) { /* If realloc fails we can continue normally: the string table * won't "fill up" although chains will gradually get longer. * When string insertions continue, we'll quite soon try again * with no special handling. */ DUK_D(DUK_DPRINT("string table grow failed, ignoring")); return; } #if defined(DUK_USE_STRTAB_PTRCOMP) heap->strtable16 = new_ptr; #else heap->strtable = new_ptr; #endif /* Rehash a single bucket into two separate ones. When we grow * by x2 the highest 'new' bit determines whether a string remains * in its old position (bit is 0) or goes to a new one (bit is 1). */ old_st_size = heap->st_size; new_ptr_high = new_ptr + old_st_size; for (i = 0; i < old_st_size; i++) { duk_hstring *new_root; duk_hstring *new_root_high; h = DUK__HEAPPTR_DEC16(heap, new_ptr[i]); new_root = h; new_root_high = NULL; prev = NULL; while (h != NULL) { duk_uint32_t mask; DUK_ASSERT((DUK_HSTRING_GET_HASH(h) & heap->st_mask) == i); next = h->hdr.h_next; /* Example: if previous size was 256, previous mask is 0xFF * and size is 0x100 which corresponds to the new bit that * comes into play. */ DUK_ASSERT(heap->st_mask == old_st_size - 1); mask = old_st_size; if (DUK_HSTRING_GET_HASH(h) & mask) { if (prev != NULL) { prev->hdr.h_next = h->hdr.h_next; } else { DUK_ASSERT(h == new_root); new_root = h->hdr.h_next; } h->hdr.h_next = new_root_high; new_root_high = h; } else { prev = h; } h = next; } new_ptr[i] = DUK__HEAPPTR_ENC16(heap, new_root); new_ptr_high[i] = DUK__HEAPPTR_ENC16(heap, new_root_high); } heap->st_size = new_st_size; heap->st_mask = new_st_size - 1; #if defined(DUK_USE_ASSERTIONS) duk__strtable_assert_checks(heap); #endif } #endif /* DUK__STRTAB_RESIZE_CHECK */ /* * Shrink strtable allocation in-place. */ #if defined(DUK__STRTAB_RESIZE_CHECK) DUK_LOCAL void duk__strtable_shrink_inplace(duk_heap *heap) { duk_uint32_t new_st_size; duk_uint32_t i; duk_hstring *h; duk_hstring *other; duk_hstring *root; #if defined(DUK_USE_STRTAB_PTRCOMP) duk_uint16_t *old_ptr; duk_uint16_t *old_ptr_high; duk_uint16_t *new_ptr; #else duk_hstring **old_ptr; duk_hstring **old_ptr_high; duk_hstring **new_ptr; #endif DUK_DD(DUK_DDPRINT("shrink in-place: %lu -> %lu", (unsigned long) heap->st_size, (unsigned long) heap->st_size / 2)); DUK_ASSERT(heap != NULL); DUK_ASSERT(heap->st_resizing == 1); DUK_ASSERT(heap->st_size >= 2); DUK_ASSERT((heap->st_size & (heap->st_size - 1)) == 0); /* 2^N */ DUK_ASSERT(DUK__GET_STRTABLE(heap) != NULL); DUK_STATS_INC(heap, stats_strtab_resize_shrink); new_st_size = heap->st_size >> 1U; /* Combine two buckets into a single one. When we shrink, one hash * bit (highest) disappears. */ old_ptr = DUK__GET_STRTABLE(heap); old_ptr_high = old_ptr + new_st_size; for (i = 0; i < new_st_size; i++) { h = DUK__HEAPPTR_DEC16(heap, old_ptr[i]); other = DUK__HEAPPTR_DEC16(heap, old_ptr_high[i]); if (h == NULL) { /* First chain is empty, so use second one as is. */ root = other; } else { /* Find end of first chain, and link in the second. */ root = h; while (h->hdr.h_next != NULL) { h = h->hdr.h_next; } h->hdr.h_next = other; } old_ptr[i] = DUK__HEAPPTR_ENC16(heap, root); } heap->st_size = new_st_size; heap->st_mask = new_st_size - 1; /* The strtable is now consistent and we can realloc safely. Even * if side effects cause string interning or removal the strtable * updates are safe. Recursive resize has been prevented by caller. * This is also why we don't need to use DUK_REALLOC_INDIRECT(). * * We assume a realloc() to a smaller size is guaranteed to succeed. * It would be relatively straightforward to handle the error by * essentially performing a "grow" step to recover. */ #if defined(DUK_USE_STRTAB_PTRCOMP) new_ptr = (duk_uint16_t *) DUK_REALLOC(heap, heap->strtable16, sizeof(duk_uint16_t) * new_st_size); DUK_ASSERT(new_ptr != NULL); heap->strtable16 = new_ptr; #else new_ptr = (duk_hstring **) DUK_REALLOC(heap, heap->strtable, sizeof(duk_hstring *) * new_st_size); DUK_ASSERT(new_ptr != NULL); heap->strtable = new_ptr; #endif #if defined(DUK_USE_ASSERTIONS) duk__strtable_assert_checks(heap); #endif } #endif /* DUK__STRTAB_RESIZE_CHECK */ /* * Grow/shrink check. */ #if defined(DUK__STRTAB_RESIZE_CHECK) DUK_LOCAL DUK_COLD DUK_NOINLINE void duk__strtable_resize_check(duk_heap *heap) { duk_uint32_t load_factor; /* fixed point */ DUK_ASSERT(heap != NULL); #if defined(DUK_USE_STRTAB_PTRCOMP) DUK_ASSERT(heap->strtable16 != NULL); #else DUK_ASSERT(heap->strtable != NULL); #endif DUK_STATS_INC(heap, stats_strtab_resize_check); /* Prevent recursive resizing. */ if (DUK_UNLIKELY(heap->st_resizing != 0U)) { DUK_D(DUK_DPRINT("prevent recursive strtable resize")); return; } heap->st_resizing = 1; DUK_ASSERT(heap->st_size >= 16U); DUK_ASSERT((heap->st_size >> 4U) >= 1); load_factor = heap->st_count / (heap->st_size >> 4U); DUK_DD(DUK_DDPRINT("resize check string table: size=%lu, count=%lu, load_factor=%lu (fixed point .4; float %lf)", (unsigned long) heap->st_size, (unsigned long) heap->st_count, (unsigned long) load_factor, (double) heap->st_count / (double) heap->st_size)); if (load_factor >= DUK_USE_STRTAB_GROW_LIMIT) { if (heap->st_size >= DUK_USE_STRTAB_MAXSIZE) { DUK_DD(DUK_DDPRINT("want to grow strtable (based on load factor) but already maximum size")); } else { DUK_D(DUK_DPRINT("grow string table: %lu -> %lu", (unsigned long) heap->st_size, (unsigned long) heap->st_size * 2)); #if defined(DUK_USE_DEBUG) duk_heap_strtable_dump(heap); #endif duk__strtable_grow_inplace(heap); } } else if (load_factor <= DUK_USE_STRTAB_SHRINK_LIMIT) { if (heap->st_size <= DUK_USE_STRTAB_MINSIZE) { DUK_DD(DUK_DDPRINT("want to shrink strtable (based on load factor) but already minimum size")); } else { DUK_D(DUK_DPRINT("shrink string table: %lu -> %lu", (unsigned long) heap->st_size, (unsigned long) heap->st_size / 2)); #if defined(DUK_USE_DEBUG) duk_heap_strtable_dump(heap); #endif duk__strtable_shrink_inplace(heap); } } else { DUK_DD(DUK_DDPRINT("no need for strtable resize")); } heap->st_resizing = 0; } #endif /* DUK__STRTAB_RESIZE_CHECK */ /* * Torture grow/shrink: unconditionally grow and shrink back. */ #if defined(DUK_USE_STRTAB_TORTURE) && defined(DUK__STRTAB_RESIZE_CHECK) DUK_LOCAL void duk__strtable_resize_torture(duk_heap *heap) { duk_uint32_t old_st_size; DUK_ASSERT(heap != NULL); old_st_size = heap->st_size; if (old_st_size >= DUK_USE_STRTAB_MAXSIZE) { return; } heap->st_resizing = 1; duk__strtable_grow_inplace(heap); if (heap->st_size > old_st_size) { duk__strtable_shrink_inplace(heap); } heap->st_resizing = 0; } #endif /* DUK_USE_STRTAB_TORTURE && DUK__STRTAB_RESIZE_CHECK */ /* * Raw intern; string already checked not to be present. */ DUK_LOCAL duk_hstring *duk__strtable_do_intern(duk_heap *heap, const duk_uint8_t *str, duk_uint32_t blen, duk_uint32_t strhash) { duk_hstring *res; const duk_uint8_t *extdata; #if defined(DUK_USE_STRTAB_PTRCOMP) duk_uint16_t *slot; #else duk_hstring **slot; #endif DUK_DDD(DUK_DDDPRINT("do_intern: heap=%p, str=%p, blen=%lu, strhash=%lx, st_size=%lu, st_count=%lu, load=%lf", (void *) heap, (const void *) str, (unsigned long) blen, (unsigned long) strhash, (unsigned long) heap->st_size, (unsigned long) heap->st_count, (double) heap->st_count / (double) heap->st_size)); DUK_ASSERT(heap != NULL); /* Prevent any side effects on the string table and the caller provided * str/blen arguments while interning is in progress. For example, if * the caller provided str/blen from a dynamic buffer, a finalizer * might resize or modify that dynamic buffer, invalidating the call * arguments. * * While finalizers must be prevented, mark-and-sweep itself is fine. * Recursive string table resize is prevented explicitly here. */ heap->pf_prevent_count++; DUK_ASSERT(heap->pf_prevent_count != 0); /* Wrap. */ #if defined(DUK_USE_STRTAB_TORTURE) && defined(DUK__STRTAB_RESIZE_CHECK) duk__strtable_resize_torture(heap); #endif /* String table grow/shrink check. Because of chaining (and no * accumulation issues as with hash probe chains and DELETED * markers) there's never a mandatory need to resize right now. * Check for the resize only periodically, based on st_count * bit pattern. Because string table removal doesn't do a shrink * check, we do that also here. * * Do the resize and possible grow/shrink before the new duk_hstring * has been allocated. Otherwise we may trigger a GC when the result * duk_hstring is not yet strongly referenced. */ #if defined(DUK__STRTAB_RESIZE_CHECK) if (DUK_UNLIKELY((heap->st_count & DUK_USE_STRTAB_RESIZE_CHECK_MASK) == 0)) { duk__strtable_resize_check(heap); } #endif /* External string check (low memory optimization). */ #if defined(DUK_USE_HSTRING_EXTDATA) && defined(DUK_USE_EXTSTR_INTERN_CHECK) extdata = (const duk_uint8_t *) DUK_USE_EXTSTR_INTERN_CHECK(heap->heap_udata, (void *) DUK_LOSE_CONST(str), (duk_size_t) blen); #else extdata = (const duk_uint8_t *) NULL; #endif /* Allocate and initialize string, not yet linked. This may cause a * GC which may cause other strings to be interned and inserted into * the string table before we insert our string. Finalizer execution * is disabled intentionally to avoid a finalizer from e.g. resizing * a buffer used as a data area for 'str'. */ res = duk__strtable_alloc_hstring(heap, str, blen, strhash, extdata); /* Allow side effects again: GC must be avoided until duk_hstring * result (if successful) has been INCREF'd. */ DUK_ASSERT(heap->pf_prevent_count > 0); heap->pf_prevent_count--; /* Alloc error handling. */ if (DUK_UNLIKELY(res == NULL)) { #if defined(DUK_USE_HSTRING_EXTDATA) && defined(DUK_USE_EXTSTR_INTERN_CHECK) if (extdata != NULL) { DUK_USE_EXTSTR_FREE(heap->heap_udata, (const void *) extdata); } #endif return NULL; } /* Insert into string table. */ #if defined(DUK_USE_STRTAB_PTRCOMP) slot = heap->strtable16 + (strhash & heap->st_mask); #else slot = heap->strtable + (strhash & heap->st_mask); #endif DUK_ASSERT(res->hdr.h_next == NULL); /* This is the case now, but unnecessary zeroing/NULLing. */ res->hdr.h_next = DUK__HEAPPTR_DEC16(heap, *slot); *slot = DUK__HEAPPTR_ENC16(heap, res); /* Update string count only for successful inserts. */ #if defined(DUK__STRTAB_RESIZE_CHECK) heap->st_count++; #endif /* The duk_hstring is in the string table but is not yet strongly * reachable. Calling code MUST NOT make any allocations or other * side effects before the duk_hstring has been INCREF'd and made * reachable. */ return res; } /* * Intern a string from str/blen, returning either an existing duk_hstring * or adding a new one into the string table. The input string does -not- * need to be NUL terminated. * * The input 'str' argument may point to a Duktape managed data area such as * the data area of a dynamic buffer. It's crucial to avoid any side effects * that might affect the data area (e.g. resize the dynamic buffer, or write * to the buffer) before the string is fully interned. */ #if defined(DUK_USE_ROM_STRINGS) DUK_LOCAL duk_hstring *duk__strtab_romstring_lookup(duk_heap *heap, const duk_uint8_t *str, duk_size_t blen, duk_uint32_t strhash) { duk_size_t lookup_hash; duk_hstring *curr; DUK_ASSERT(heap != NULL); DUK_UNREF(heap); lookup_hash = (blen << 4); if (blen > 0) { lookup_hash += str[0]; } lookup_hash &= 0xff; curr = DUK_LOSE_CONST(duk_rom_strings_lookup[lookup_hash]); while (curr != NULL) { if (strhash == DUK_HSTRING_GET_HASH(curr) && blen == DUK_HSTRING_GET_BYTELEN(curr) && DUK_MEMCMP((const void *) str, (const void *) DUK_HSTRING_GET_DATA(curr), blen) == 0) { DUK_DDD(DUK_DDDPRINT("intern check: rom string: %!O, computed hash 0x%08lx, rom hash 0x%08lx", curr, (unsigned long) strhash, (unsigned long) DUK_HSTRING_GET_HASH(curr))); return curr; } curr = curr->hdr.h_next; } return NULL; } #endif /* DUK_USE_ROM_STRINGS */ DUK_INTERNAL duk_hstring *duk_heap_strtable_intern(duk_heap *heap, const duk_uint8_t *str, duk_uint32_t blen) { duk_uint32_t strhash; duk_hstring *h; DUK_DDD(DUK_DDDPRINT("intern check: heap=%p, str=%p, blen=%lu", (void *) heap, (const void *) str, (unsigned long) blen)); /* Preliminaries. */ DUK_ASSERT(heap != NULL); DUK_ASSERT(blen == 0 || str != NULL); DUK_ASSERT(blen <= DUK_HSTRING_MAX_BYTELEN); /* Caller is responsible for ensuring this. */ strhash = duk_heap_hashstring(heap, str, (duk_size_t) blen); /* String table lookup. */ DUK_ASSERT(DUK__GET_STRTABLE(heap) != NULL); DUK_ASSERT(heap->st_size > 0); DUK_ASSERT(heap->st_size == heap->st_mask + 1); #if defined(DUK_USE_STRTAB_PTRCOMP) h = DUK__HEAPPTR_DEC16(heap, heap->strtable16[strhash & heap->st_mask]); #else h = heap->strtable[strhash & heap->st_mask]; #endif while (h != NULL) { if (DUK_HSTRING_GET_HASH(h) == strhash && DUK_HSTRING_GET_BYTELEN(h) == blen && DUK_MEMCMP((const void *) str, (const void *) DUK_HSTRING_GET_DATA(h), (size_t) blen) == 0) { /* Found existing entry. */ DUK_STATS_INC(heap, stats_strtab_intern_hit); return h; } h = h->hdr.h_next; } /* ROM table lookup. Because this lookup is slower, do it only after * RAM lookup. This works because no ROM string is ever interned into * the RAM string table. */ #if defined(DUK_USE_ROM_STRINGS) h = duk__strtab_romstring_lookup(heap, str, blen, strhash); if (h != NULL) { DUK_STATS_INC(heap, stats_strtab_intern_hit); return h; } #endif /* Not found in string table; insert. */ DUK_STATS_INC(heap, stats_strtab_intern_miss); h = duk__strtable_do_intern(heap, str, blen, strhash); return h; /* may be NULL */ } /* * Intern a string from u32. */ /* XXX: Could arrange some special handling because we know that the result * will have an arridx flag and an ASCII flag, won't need a clen check, etc. */ DUK_INTERNAL duk_hstring *duk_heap_strtable_intern_u32(duk_heap *heap, duk_uint32_t val) { duk_uint8_t buf[DUK__STRTAB_U32_MAX_STRLEN]; duk_uint8_t *p; DUK_ASSERT(heap != NULL); /* This is smaller and faster than a %lu sprintf. */ p = buf + sizeof(buf); do { p--; *p = duk_lc_digits[val % 10]; val = val / 10; } while (val != 0); /* For val == 0, emit exactly one '0'. */ DUK_ASSERT(p >= buf); return duk_heap_strtable_intern(heap, (const duk_uint8_t *) p, (duk_uint32_t) ((buf + sizeof(buf)) - p)); } /* * Checked convenience variants. * * XXX: Because the main use case is for the checked variants, make them the * main functionality and provide a safe variant separately (it is only needed * during heap init). The problem with that is that longjmp state and error * creation must already be possible to throw. */ DUK_INTERNAL duk_hstring *duk_heap_strtable_intern_checked(duk_hthread *thr, const duk_uint8_t *str, duk_uint32_t blen) { duk_hstring *res; DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->heap != NULL); DUK_ASSERT(blen == 0 || str != NULL); res = duk_heap_strtable_intern(thr->heap, str, blen); if (DUK_UNLIKELY(res == NULL)) { DUK_ERROR_ALLOC_FAILED(thr); } return res; } DUK_INTERNAL duk_hstring *duk_heap_strtable_intern_u32_checked(duk_hthread *thr, duk_uint32_t val) { duk_hstring *res; DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->heap != NULL); res = duk_heap_strtable_intern_u32(thr->heap, val); if (DUK_UNLIKELY(res == NULL)) { DUK_ERROR_ALLOC_FAILED(thr); } return res; } /* * Remove (unlink) a string from the string table. * * Just unlinks the duk_hstring, leaving link pointers as garbage. * Caller must free the string itself. */ #if defined(DUK_USE_REFERENCE_COUNTING) /* Unlink without a 'prev' pointer. */ DUK_INTERNAL void duk_heap_strtable_unlink(duk_heap *heap, duk_hstring *h) { #if defined(DUK_USE_STRTAB_PTRCOMP) duk_uint16_t *slot; #else duk_hstring **slot; #endif duk_hstring *other; duk_hstring *prev; DUK_DDD(DUK_DDDPRINT("remove: heap=%p, h=%p, blen=%lu, strhash=%lx", (void *) heap, (void *) h, (unsigned long) (h != NULL ? DUK_HSTRING_GET_BYTELEN(h) : 0), (unsigned long) (h != NULL ? DUK_HSTRING_GET_HASH(h) : 0))); DUK_ASSERT(heap != NULL); DUK_ASSERT(h != NULL); #if defined(DUK__STRTAB_RESIZE_CHECK) DUK_ASSERT(heap->st_count > 0); heap->st_count--; #endif #if defined(DUK_USE_STRTAB_PTRCOMP) slot = heap->strtable16 + (DUK_HSTRING_GET_HASH(h) & heap->st_mask); #else slot = heap->strtable + (DUK_HSTRING_GET_HASH(h) & heap->st_mask); #endif other = DUK__HEAPPTR_DEC16(heap, *slot); DUK_ASSERT(other != NULL); /* At least argument string is in the chain. */ prev = NULL; while (other != h) { prev = other; other = other->hdr.h_next; DUK_ASSERT(other != NULL); /* We'll eventually find 'h'. */ } if (prev != NULL) { /* Middle of list. */ prev->hdr.h_next = h->hdr.h_next; } else { /* Head of list. */ *slot = DUK__HEAPPTR_ENC16(heap, h->hdr.h_next); } /* There's no resize check on a string free. The next string * intern will do one. */ } #endif /* DUK_USE_REFERENCE_COUNTING */ /* Unlink with a 'prev' pointer. */ DUK_INTERNAL void duk_heap_strtable_unlink_prev(duk_heap *heap, duk_hstring *h, duk_hstring *prev) { #if defined(DUK_USE_STRTAB_PTRCOMP) duk_uint16_t *slot; #else duk_hstring **slot; #endif DUK_DDD(DUK_DDDPRINT("remove: heap=%p, prev=%p, h=%p, blen=%lu, strhash=%lx", (void *) heap, (void *) prev, (void *) h, (unsigned long) (h != NULL ? DUK_HSTRING_GET_BYTELEN(h) : 0), (unsigned long) (h != NULL ? DUK_HSTRING_GET_HASH(h) : 0))); DUK_ASSERT(heap != NULL); DUK_ASSERT(h != NULL); DUK_ASSERT(prev == NULL || prev->hdr.h_next == h); #if defined(DUK__STRTAB_RESIZE_CHECK) DUK_ASSERT(heap->st_count > 0); heap->st_count--; #endif if (prev != NULL) { /* Middle of list. */ prev->hdr.h_next = h->hdr.h_next; } else { /* Head of list. */ #if defined(DUK_USE_STRTAB_PTRCOMP) slot = heap->strtable16 + (DUK_HSTRING_GET_HASH(h) & heap->st_mask); #else slot = heap->strtable + (DUK_HSTRING_GET_HASH(h) & heap->st_mask); #endif DUK_ASSERT(DUK__HEAPPTR_DEC16(heap, *slot) == h); *slot = DUK__HEAPPTR_ENC16(heap, h->hdr.h_next); } } /* * Force string table resize check in mark-and-sweep. */ DUK_INTERNAL void duk_heap_strtable_force_resize(duk_heap *heap) { /* Does only one grow/shrink step if needed. The heap->st_resizing * flag protects against recursive resizing. */ DUK_ASSERT(heap != NULL); DUK_UNREF(heap); #if defined(DUK__STRTAB_RESIZE_CHECK) #if defined(DUK_USE_STRTAB_PTRCOMP) if (heap->strtable16 != NULL) { #else if (heap->strtable != NULL) { #endif duk__strtable_resize_check(heap); } #endif } /* * Free strings in the string table and the string table itself. */ DUK_INTERNAL void duk_heap_strtable_free(duk_heap *heap) { #if defined(DUK_USE_STRTAB_PTRCOMP) duk_uint16_t *strtable; duk_uint16_t *st; #else duk_hstring **strtable; duk_hstring **st; #endif duk_hstring *h; DUK_ASSERT(heap != NULL); #if defined(DUK_USE_ASSERTIONS) duk__strtable_assert_checks(heap); #endif /* Strtable can be NULL if heap init fails. However, in that case * heap->st_size is 0, so strtable == strtable_end and we skip the * loop without a special check. */ strtable = DUK__GET_STRTABLE(heap); st = strtable + heap->st_size; DUK_ASSERT(strtable != NULL || heap->st_size == 0); while (strtable != st) { --st; h = DUK__HEAPPTR_DEC16(heap, *st); while (h) { duk_hstring *h_next; h_next = h->hdr.h_next; /* Strings may have inner refs (extdata) in some cases. */ duk_free_hstring(heap, h); h = h_next; } } DUK_FREE(heap, strtable); } /* automatic undefs */ #undef DUK__GET_STRTABLE #undef DUK__HEAPPTR_DEC16 #undef DUK__HEAPPTR_ENC16 #undef DUK__STRTAB_U32_MAX_STRLEN #line 1 "duk_hobject_alloc.c" /* * Hobject allocation. * * Provides primitive allocation functions for all object types (plain object, * compiled function, native function, thread). The object return is not yet * in "heap allocated" list and has a refcount of zero, so caller must careful. */ /* XXX: In most cases there's no need for plain allocation without pushing * to the value stack. Maybe rework contract? */ /* #include duk_internal.h -> already included */ /* * Helpers. */ DUK_LOCAL void duk__init_object_parts(duk_heap *heap, duk_uint_t hobject_flags, duk_hobject *obj) { DUK_ASSERT(obj != NULL); /* Zeroed by caller. */ obj->hdr.h_flags = hobject_flags | DUK_HTYPE_OBJECT; DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(&obj->hdr) == DUK_HTYPE_OBJECT); /* Assume zero shift. */ #if defined(DUK_USE_EXPLICIT_NULL_INIT) DUK_HOBJECT_SET_PROTOTYPE(heap, obj, NULL); DUK_HOBJECT_SET_PROPS(heap, obj, NULL); #endif #if defined(DUK_USE_HEAPPTR16) /* Zero encoded pointer is required to match NULL. */ DUK_HEAPHDR_SET_NEXT(heap, &obj->hdr, NULL); #if defined(DUK_USE_DOUBLE_LINKED_HEAP) DUK_HEAPHDR_SET_PREV(heap, &obj->hdr, NULL); #endif #endif DUK_ASSERT_HEAPHDR_LINKS(heap, &obj->hdr); DUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(heap, &obj->hdr); /* obj->props is intentionally left as NULL, and duk_hobject_props.c must deal * with this properly. This is intentional: empty objects consume a minimum * amount of memory. Further, an initial allocation might fail and cause * 'obj' to "leak" (require a mark-and-sweep) since it is not reachable yet. */ } DUK_LOCAL void *duk__hobject_alloc_init(duk_hthread *thr, duk_uint_t hobject_flags, duk_size_t size) { void *res; res = (void *) DUK_ALLOC_CHECKED_ZEROED(thr, size); DUK_ASSERT(res != NULL); duk__init_object_parts(thr->heap, hobject_flags, (duk_hobject *) res); return res; } /* * Allocate an duk_hobject. * * The allocated object has no allocation for properties; the caller may * want to force a resize if a desired size is known. * * The allocated object has zero reference count and is not reachable. * The caller MUST make the object reachable and increase its reference * count before invoking any operation that might require memory allocation. */ DUK_INTERNAL duk_hobject *duk_hobject_alloc_unchecked(duk_heap *heap, duk_uint_t hobject_flags) { duk_hobject *res; DUK_ASSERT(heap != NULL); /* different memory layout, alloc size, and init */ DUK_ASSERT((hobject_flags & DUK_HOBJECT_FLAG_COMPFUNC) == 0); DUK_ASSERT((hobject_flags & DUK_HOBJECT_FLAG_NATFUNC) == 0); DUK_ASSERT((hobject_flags & DUK_HOBJECT_FLAG_BOUNDFUNC) == 0); res = (duk_hobject *) DUK_ALLOC_ZEROED(heap, sizeof(duk_hobject)); if (DUK_UNLIKELY(res == NULL)) { return NULL; } DUK_ASSERT(!DUK_HOBJECT_IS_THREAD(res)); duk__init_object_parts(heap, hobject_flags, res); DUK_ASSERT(!DUK_HOBJECT_IS_THREAD(res)); return res; } DUK_INTERNAL duk_hobject *duk_hobject_alloc(duk_hthread *thr, duk_uint_t hobject_flags) { duk_hobject *res; res = (duk_hobject *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_hobject)); return res; } DUK_INTERNAL duk_hcompfunc *duk_hcompfunc_alloc(duk_hthread *thr, duk_uint_t hobject_flags) { duk_hcompfunc *res; res = (duk_hcompfunc *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_hcompfunc)); #if defined(DUK_USE_EXPLICIT_NULL_INIT) #if defined(DUK_USE_HEAPPTR16) /* NULL pointer is required to encode to zero, so memset is enough. */ #else res->data = NULL; res->funcs = NULL; res->bytecode = NULL; #endif res->lex_env = NULL; res->var_env = NULL; #endif return res; } DUK_INTERNAL duk_hnatfunc *duk_hnatfunc_alloc(duk_hthread *thr, duk_uint_t hobject_flags) { duk_hnatfunc *res; res = (duk_hnatfunc *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_hnatfunc)); #if defined(DUK_USE_EXPLICIT_NULL_INIT) res->func = NULL; #endif return res; } DUK_INTERNAL duk_hboundfunc *duk_hboundfunc_alloc(duk_heap *heap, duk_uint_t hobject_flags) { duk_hboundfunc *res; res = (duk_hboundfunc *) DUK_ALLOC(heap, sizeof(duk_hboundfunc)); if (!res) { return NULL; } DUK_MEMZERO(res, sizeof(duk_hboundfunc)); duk__init_object_parts(heap, hobject_flags, &res->obj); DUK_TVAL_SET_UNDEFINED(&res->target); DUK_TVAL_SET_UNDEFINED(&res->this_binding); #if defined(DUK_USE_EXPLICIT_NULL_INIT) res->args = NULL; #endif return res; } #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_INTERNAL duk_hbufobj *duk_hbufobj_alloc(duk_hthread *thr, duk_uint_t hobject_flags) { duk_hbufobj *res; res = (duk_hbufobj *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_hbufobj)); #if defined(DUK_USE_EXPLICIT_NULL_INIT) res->buf = NULL; res->buf_prop = NULL; #endif DUK_ASSERT_HBUFOBJ_VALID(res); return res; } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ /* Allocate a new thread. * * Leaves the built-ins array uninitialized. The caller must either * initialize a new global context or share existing built-ins from * another thread. */ DUK_INTERNAL duk_hthread *duk_hthread_alloc_unchecked(duk_heap *heap, duk_uint_t hobject_flags) { duk_hthread *res; res = (duk_hthread *) DUK_ALLOC(heap, sizeof(duk_hthread)); if (DUK_UNLIKELY(res == NULL)) { return NULL; } DUK_MEMZERO(res, sizeof(duk_hthread)); duk__init_object_parts(heap, hobject_flags, &res->obj); #if defined(DUK_USE_EXPLICIT_NULL_INIT) res->ptr_curr_pc = NULL; res->heap = NULL; res->valstack = NULL; res->valstack_end = NULL; res->valstack_alloc_end = NULL; res->valstack_bottom = NULL; res->valstack_top = NULL; res->callstack_curr = NULL; res->resumer = NULL; res->compile_ctx = NULL, #if defined(DUK_USE_HEAPPTR16) res->strs16 = NULL; #else res->strs = NULL; #endif { duk_small_uint_t i; for (i = 0; i < DUK_NUM_BUILTINS; i++) { res->builtins[i] = NULL; } } #endif /* When nothing is running, API calls are in non-strict mode. */ DUK_ASSERT(res->strict == 0); res->heap = heap; /* XXX: Any reason not to merge duk_hthread_alloc.c here? */ return res; } DUK_INTERNAL duk_hthread *duk_hthread_alloc(duk_hthread *thr, duk_uint_t hobject_flags) { duk_hthread *res; res = duk_hthread_alloc_unchecked(thr->heap, hobject_flags); if (res == NULL) { DUK_ERROR_ALLOC_FAILED(thr); } return res; } DUK_INTERNAL duk_harray *duk_harray_alloc(duk_hthread *thr, duk_uint_t hobject_flags) { duk_harray *res; res = (duk_harray *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_harray)); DUK_ASSERT(res->length == 0); return res; } DUK_INTERNAL duk_hdecenv *duk_hdecenv_alloc(duk_hthread *thr, duk_uint_t hobject_flags) { duk_hdecenv *res; res = (duk_hdecenv *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_hdecenv)); #if defined(DUK_USE_EXPLICIT_NULL_INIT) res->thread = NULL; res->varmap = NULL; #endif DUK_ASSERT(res->thread == NULL); DUK_ASSERT(res->varmap == NULL); DUK_ASSERT(res->regbase_byteoff == 0); return res; } DUK_INTERNAL duk_hobjenv *duk_hobjenv_alloc(duk_hthread *thr, duk_uint_t hobject_flags) { duk_hobjenv *res; res = (duk_hobjenv *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_hobjenv)); #if defined(DUK_USE_EXPLICIT_NULL_INIT) res->target = NULL; #endif DUK_ASSERT(res->target == NULL); return res; } DUK_INTERNAL duk_hproxy *duk_hproxy_alloc(duk_hthread *thr, duk_uint_t hobject_flags) { duk_hproxy *res; res = (duk_hproxy *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_hproxy)); /* Leave ->target and ->handler uninitialized, as caller will always * explicitly initialize them before any side effects are possible. */ return res; } #line 1 "duk_hobject_enum.c" /* * Object enumeration support. * * Creates an internal enumeration state object to be used e.g. with for-in * enumeration. The state object contains a snapshot of target object keys * and internal control state for enumeration. Enumerator flags allow caller * to e.g. request internal/non-enumerable properties, and to enumerate only * "own" properties. * * Also creates the result value for e.g. Object.keys() based on the same * internal structure. * * This snapshot-based enumeration approach is used to simplify enumeration: * non-snapshot-based approaches are difficult to reconcile with mutating * the enumeration target, running multiple long-lived enumerators at the * same time, garbage collection details, etc. The downside is that the * enumerator object is memory inefficient especially for iterating arrays. */ /* #include duk_internal.h -> already included */ /* XXX: identify enumeration target with an object index (not top of stack) */ /* First enumerated key index in enumerator object, must match exactly the * number of control properties inserted to the enumerator. */ #define DUK__ENUM_START_INDEX 2 /* Current implementation suffices for ES2015 for now because there's no symbol * sorting, so commented out for now. */ /* * Helper to sort enumeration keys using a callback for pairwise duk_hstring * comparisons. The keys are in the enumeration object entry part, starting * from DUK__ENUM_START_INDEX, and the entry part is dense. Entry part values * are all "true", e.g. "1" -> true, "3" -> true, "foo" -> true, "2" -> true, * so it suffices to just switch keys without switching values. * * ES2015 [[OwnPropertyKeys]] enumeration order for ordinary objects: * (1) array indices in ascending order, * (2) non-array-index keys in insertion order, and * (3) symbols in insertion order. * http://www.ecma-international.org/ecma-262/6.0/#sec-ordinary-object-internal-methods-and-internal-slots-ownpropertykeys. * * This rule is applied to "own properties" at each inheritance level; * non-duplicate parent keys always follow child keys. For example, * an inherited array index will enumerate -after- a symbol in the * child. * * Insertion sort is used because (1) it's simple and compact, (2) works * in-place, (3) minimizes operations if data is already nearly sorted, * (4) doesn't reorder elements considered equal. * http://en.wikipedia.org/wiki/Insertion_sort */ /* Sort key, must hold array indices, "not array index" marker, and one more * higher value for symbols. */ #if !defined(DUK_USE_SYMBOL_BUILTIN) typedef duk_uint32_t duk__sort_key_t; #elif defined(DUK_USE_64BIT_OPS) typedef duk_uint64_t duk__sort_key_t; #else typedef duk_double_t duk__sort_key_t; #endif /* Get sort key for a duk_hstring. */ DUK_LOCAL duk__sort_key_t duk__hstring_sort_key(duk_hstring *x) { duk__sort_key_t val; /* For array indices [0,0xfffffffe] use the array index as is. * For strings, use 0xffffffff, the marker 'arridx' already in * duk_hstring. For symbols, any value above 0xffffffff works, * as long as it is the same for all symbols; currently just add * the masked flag field into the arridx temporary. */ DUK_ASSERT(x != NULL); DUK_ASSERT(!DUK_HSTRING_HAS_SYMBOL(x) || DUK_HSTRING_GET_ARRIDX_FAST(x) == DUK_HSTRING_NO_ARRAY_INDEX); val = (duk__sort_key_t) DUK_HSTRING_GET_ARRIDX_FAST(x); #if defined(DUK_USE_SYMBOL_BUILTIN) val = val + (duk__sort_key_t) (DUK_HEAPHDR_GET_FLAGS_RAW((duk_heaphdr *) x) & DUK_HSTRING_FLAG_SYMBOL); #endif return (duk__sort_key_t) val; } /* Insert element 'b' after element 'a'? */ DUK_LOCAL duk_bool_t duk__sort_compare_es6(duk_hstring *a, duk_hstring *b, duk__sort_key_t val_b) { duk__sort_key_t val_a; DUK_ASSERT(a != NULL); DUK_ASSERT(b != NULL); DUK_UNREF(b); /* Not actually needed now, val_b suffices. */ val_a = duk__hstring_sort_key(a); if (val_a > val_b) { return 0; } else { return 1; } } DUK_LOCAL void duk__sort_enum_keys_es6(duk_hthread *thr, duk_hobject *h_obj, duk_int_fast32_t idx_start, duk_int_fast32_t idx_end) { duk_hstring **keys; duk_int_fast32_t idx; DUK_ASSERT(h_obj != NULL); DUK_ASSERT(idx_start >= DUK__ENUM_START_INDEX); DUK_ASSERT(idx_end >= idx_start); DUK_UNREF(thr); if (idx_end <= idx_start + 1) { return; /* Zero or one element(s). */ } keys = DUK_HOBJECT_E_GET_KEY_BASE(thr->heap, h_obj); for (idx = idx_start + 1; idx < idx_end; idx++) { duk_hstring *h_curr; duk_int_fast32_t idx_insert; duk__sort_key_t val_curr; h_curr = keys[idx]; DUK_ASSERT(h_curr != NULL); /* Scan backwards for insertion place. This works very well * when the elements are nearly in order which is the common * (and optimized for) case. */ val_curr = duk__hstring_sort_key(h_curr); /* Remains same during scanning. */ for (idx_insert = idx - 1; idx_insert >= idx_start; idx_insert--) { duk_hstring *h_insert; h_insert = keys[idx_insert]; DUK_ASSERT(h_insert != NULL); if (duk__sort_compare_es6(h_insert, h_curr, val_curr)) { break; } } /* If we're out of indices, idx_insert == idx_start - 1 and idx_insert++ * brings us back to idx_start. */ idx_insert++; DUK_ASSERT(idx_insert >= 0 && idx_insert <= idx); /* .-- p_insert .-- p_curr * v v * | ... | insert | ... | curr */ /* This could also done when the keys are in order, i.e. * idx_insert == idx. The result would be an unnecessary * memmove() but we use an explicit check because the keys * are very often in order already. */ if (idx != idx_insert) { DUK_MEMMOVE((void *) (keys + idx_insert + 1), (const void *) (keys + idx_insert), ((size_t) (idx - idx_insert) * sizeof(duk_hstring *))); keys[idx_insert] = h_curr; } } } /* * Create an internal enumerator object E, which has its keys ordered * to match desired enumeration ordering. Also initialize internal control * properties for enumeration. * * Note: if an array was used to hold enumeration keys instead, an array * scan would be needed to eliminate duplicates found in the prototype chain. */ DUK_LOCAL void duk__add_enum_key(duk_hthread *thr, duk_hstring *k) { /* 'k' may be unreachable on entry so must push without any * potential for GC. */ duk_push_hstring(thr, k); duk_push_true(thr); duk_put_prop(thr, -3); } DUK_LOCAL void duk__add_enum_key_stridx(duk_hthread *thr, duk_small_uint_t stridx) { duk__add_enum_key(thr, DUK_HTHREAD_GET_STRING(thr, stridx)); } DUK_INTERNAL void duk_hobject_enumerator_create(duk_hthread *thr, duk_small_uint_t enum_flags) { duk_hobject *enum_target; duk_hobject *curr; duk_hobject *res; #if defined(DUK_USE_ES6_PROXY) duk_hobject *h_proxy_target; duk_hobject *h_proxy_handler; duk_hobject *h_trap_result; #endif duk_uint_fast32_t i, len; /* used for array, stack, and entry indices */ duk_uint_fast32_t sort_start_index; DUK_ASSERT(thr != NULL); enum_target = duk_require_hobject(thr, -1); DUK_ASSERT(enum_target != NULL); duk_push_bare_object(thr); res = duk_known_hobject(thr, -1); /* [enum_target res] */ /* Target must be stored so that we can recheck whether or not * keys still exist when we enumerate. This is not done if the * enumeration result comes from a proxy trap as there is no * real object to check against. */ duk_push_hobject(thr, enum_target); duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_INT_TARGET); /* Initialize index so that we skip internal control keys. */ duk_push_int(thr, DUK__ENUM_START_INDEX); duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_INT_NEXT); /* * Proxy object handling */ #if defined(DUK_USE_ES6_PROXY) if (DUK_LIKELY((enum_flags & DUK_ENUM_NO_PROXY_BEHAVIOR) != 0)) { goto skip_proxy; } if (DUK_LIKELY(!duk_hobject_proxy_check(enum_target, &h_proxy_target, &h_proxy_handler))) { goto skip_proxy; } /* XXX: share code with Object.keys() Proxy handling */ /* In ES2015 for-in invoked the "enumerate" trap; in ES2016 "enumerate" * has been obsoleted and "ownKeys" is used instead. */ DUK_DDD(DUK_DDDPRINT("proxy enumeration")); duk_push_hobject(thr, h_proxy_handler); if (!duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_OWN_KEYS)) { /* No need to replace the 'enum_target' value in stack, only the * enum_target reference. This also ensures that the original * enum target is reachable, which keeps the proxy and the proxy * target reachable. We do need to replace the internal _Target. */ DUK_DDD(DUK_DDDPRINT("no ownKeys trap, enumerate proxy target instead")); DUK_DDD(DUK_DDDPRINT("h_proxy_target=%!O", (duk_heaphdr *) h_proxy_target)); enum_target = h_proxy_target; duk_push_hobject(thr, enum_target); /* -> [ ... enum_target res handler undefined target ] */ duk_put_prop_stridx_short(thr, -4, DUK_STRIDX_INT_TARGET); duk_pop_2(thr); /* -> [ ... enum_target res ] */ goto skip_proxy; } /* [ ... enum_target res handler trap ] */ duk_insert(thr, -2); duk_push_hobject(thr, h_proxy_target); /* -> [ ... enum_target res trap handler target ] */ duk_call_method(thr, 1 /*nargs*/); /* -> [ ... enum_target res trap_result ] */ h_trap_result = duk_require_hobject(thr, -1); DUK_UNREF(h_trap_result); duk_proxy_ownkeys_postprocess(thr, h_proxy_target, enum_flags); /* -> [ ... enum_target res trap_result keys_array ] */ /* Copy cleaned up trap result keys into the enumerator object. */ /* XXX: result is a dense array; could make use of that. */ DUK_ASSERT(duk_is_array(thr, -1)); len = (duk_uint_fast32_t) duk_get_length(thr, -1); for (i = 0; i < len; i++) { (void) duk_get_prop_index(thr, -1, (duk_uarridx_t) i); DUK_ASSERT(duk_is_string(thr, -1)); /* postprocess cleaned up */ /* [ ... enum_target res trap_result keys_array val ] */ duk_push_true(thr); /* [ ... enum_target res trap_result keys_array val true ] */ duk_put_prop(thr, -5); } /* [ ... enum_target res trap_result keys_array ] */ duk_pop_2(thr); duk_remove_m2(thr); /* [ ... res ] */ /* The internal _Target property is kept pointing to the original * enumeration target (the proxy object), so that the enumerator * 'next' operation can read property values if so requested. The * fact that the _Target is a proxy disables key existence check * during enumeration. */ DUK_DDD(DUK_DDDPRINT("proxy enumeration, final res: %!O", (duk_heaphdr *) res)); goto compact_and_return; skip_proxy: #endif /* DUK_USE_ES6_PROXY */ curr = enum_target; sort_start_index = DUK__ENUM_START_INDEX; DUK_ASSERT(DUK_HOBJECT_GET_ENEXT(res) == DUK__ENUM_START_INDEX); while (curr) { duk_uint_fast32_t sort_end_index; #if !defined(DUK_USE_PREFER_SIZE) duk_bool_t need_sort = 0; #endif /* Enumeration proceeds by inheritance level. Virtual * properties need to be handled specially, followed by * array part, and finally entry part. * * If there are array index keys in the entry part or any * other risk of the ES2015 [[OwnPropertyKeys]] order being * violated, need_sort is set and an explicit ES2015 sort is * done for the inheritance level. */ /* XXX: inheriting from proxy */ /* * Virtual properties. * * String and buffer indices are virtual and always enumerable, * 'length' is virtual and non-enumerable. Array and arguments * object props have special behavior but are concrete. * * String and buffer objects don't have an array part so as long * as virtual array index keys are enumerated first, we don't * need to set need_sort. */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) if (DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(curr) || DUK_HOBJECT_IS_BUFOBJ(curr)) { #else if (DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(curr)) { #endif duk_bool_t have_length = 1; /* String and buffer enumeration behavior is identical now, * so use shared handler. */ if (DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(curr)) { duk_hstring *h_val; h_val = duk_hobject_get_internal_value_string(thr->heap, curr); DUK_ASSERT(h_val != NULL); /* string objects must not created without internal value */ len = (duk_uint_fast32_t) DUK_HSTRING_GET_CHARLEN(h_val); } #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) else { duk_hbufobj *h_bufobj; DUK_ASSERT(DUK_HOBJECT_IS_BUFOBJ(curr)); h_bufobj = (duk_hbufobj *) curr; if (h_bufobj == NULL || !h_bufobj->is_typedarray) { /* Zero length seems like a good behavior for neutered buffers. * ArrayBuffer (non-view) and DataView don't have index properties * or .length property. */ len = 0; have_length = 0; } else { /* There's intentionally no check for * current underlying buffer length. */ len = (duk_uint_fast32_t) (h_bufobj->length >> h_bufobj->shift); } } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ for (i = 0; i < len; i++) { duk_hstring *k; /* This is a bit fragile: the string is not * reachable until it is pushed by the helper. */ k = duk_heap_strtable_intern_u32_checked(thr, (duk_uint32_t) i); DUK_ASSERT(k); duk__add_enum_key(thr, k); /* [enum_target res] */ } /* 'length' and other virtual properties are not * enumerable, but are included if non-enumerable * properties are requested. */ if (have_length && (enum_flags & DUK_ENUM_INCLUDE_NONENUMERABLE)) { duk__add_enum_key_stridx(thr, DUK_STRIDX_LENGTH); } } /* * Array part */ for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ASIZE(curr); i++) { duk_hstring *k; duk_tval *tv; tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, curr, i); if (DUK_TVAL_IS_UNUSED(tv)) { continue; } k = duk_heap_strtable_intern_u32_checked(thr, (duk_uint32_t) i); /* Fragile reachability. */ DUK_ASSERT(k); duk__add_enum_key(thr, k); /* [enum_target res] */ } if (DUK_HOBJECT_HAS_EXOTIC_ARRAY(curr)) { /* Array .length comes after numeric indices. */ if (enum_flags & DUK_ENUM_INCLUDE_NONENUMERABLE) { duk__add_enum_key_stridx(thr, DUK_STRIDX_LENGTH); } } /* * Entries part */ for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ENEXT(curr); i++) { duk_hstring *k; k = DUK_HOBJECT_E_GET_KEY(thr->heap, curr, i); if (!k) { continue; } if (!(enum_flags & DUK_ENUM_INCLUDE_NONENUMERABLE) && !DUK_HOBJECT_E_SLOT_IS_ENUMERABLE(thr->heap, curr, i)) { continue; } if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(k))) { if (!(enum_flags & DUK_ENUM_INCLUDE_HIDDEN) && DUK_HSTRING_HAS_HIDDEN(k)) { continue; } if (!(enum_flags & DUK_ENUM_INCLUDE_SYMBOLS)) { continue; } #if !defined(DUK_USE_PREFER_SIZE) need_sort = 1; #endif } else { DUK_ASSERT(!DUK_HSTRING_HAS_HIDDEN(k)); /* would also have symbol flag */ if (enum_flags & DUK_ENUM_EXCLUDE_STRINGS) { continue; } } if (DUK_HSTRING_HAS_ARRIDX(k)) { /* This in currently only possible if the * object has no array part: the array part * is exhaustive when it is present. */ #if !defined(DUK_USE_PREFER_SIZE) need_sort = 1; #endif } else { if (enum_flags & DUK_ENUM_ARRAY_INDICES_ONLY) { continue; } } DUK_ASSERT(DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, curr, i) || !DUK_TVAL_IS_UNUSED(&DUK_HOBJECT_E_GET_VALUE_PTR(thr->heap, curr, i)->v)); duk__add_enum_key(thr, k); /* [enum_target res] */ } /* Sort enumerated keys according to ES2015 requirements for * the "inheritance level" just processed. This is far from * optimal, ES2015 semantics could be achieved more efficiently * by handling array index string keys (and symbol keys) * specially above in effect doing the sort inline. * * Skip the sort if array index sorting is requested because * we must consider all keys, also inherited, so an explicit * sort is done for the whole result after we're done with the * prototype chain. * * Also skip the sort if need_sort == 0, i.e. we know for * certain that the enumerated order is already correct. */ sort_end_index = DUK_HOBJECT_GET_ENEXT(res); if (!(enum_flags & DUK_ENUM_SORT_ARRAY_INDICES)) { #if defined(DUK_USE_PREFER_SIZE) duk__sort_enum_keys_es6(thr, res, (duk_int_fast32_t) sort_start_index, (duk_int_fast32_t) sort_end_index); #else if (need_sort) { DUK_DDD(DUK_DDDPRINT("need to sort")); duk__sort_enum_keys_es6(thr, res, (duk_int_fast32_t) sort_start_index, (duk_int_fast32_t) sort_end_index); } else { DUK_DDD(DUK_DDDPRINT("no need to sort")); } #endif } sort_start_index = sort_end_index; if (enum_flags & DUK_ENUM_OWN_PROPERTIES_ONLY) { break; } curr = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, curr); } /* [enum_target res] */ duk_remove_m2(thr); /* [res] */ if (enum_flags & DUK_ENUM_SORT_ARRAY_INDICES) { /* Some E5/E5.1 algorithms require that array indices are iterated * in a strictly ascending order. This is the case for e.g. * Array.prototype.forEach() and JSON.stringify() PropertyList * handling. The caller can request an explicit sort in these * cases. */ /* Sort to ES2015 order which works for pure array incides but * also for mixed keys. */ duk__sort_enum_keys_es6(thr, res, (duk_int_fast32_t) DUK__ENUM_START_INDEX, (duk_int_fast32_t) DUK_HOBJECT_GET_ENEXT(res)); } #if defined(DUK_USE_ES6_PROXY) compact_and_return: #endif /* compact; no need to seal because object is internal */ duk_hobject_compact_props(thr, res); DUK_DDD(DUK_DDDPRINT("created enumerator object: %!iT", (duk_tval *) duk_get_tval(thr, -1))); } /* * Returns non-zero if a key and/or value was enumerated, and: * * [enum] -> [key] (get_value == 0) * [enum] -> [key value] (get_value == 1) * * Returns zero without pushing anything on the stack otherwise. */ DUK_INTERNAL duk_bool_t duk_hobject_enumerator_next(duk_hthread *thr, duk_bool_t get_value) { duk_hobject *e; duk_hobject *enum_target; duk_hstring *res = NULL; duk_uint_fast32_t idx; duk_bool_t check_existence; DUK_ASSERT(thr != NULL); /* [... enum] */ e = duk_require_hobject(thr, -1); /* XXX use get tval ptr, more efficient */ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_NEXT); idx = (duk_uint_fast32_t) duk_require_uint(thr, -1); duk_pop(thr); DUK_DDD(DUK_DDDPRINT("enumeration: index is: %ld", (long) idx)); /* Enumeration keys are checked against the enumeration target (to see * that they still exist). In the proxy enumeration case _Target will * be the proxy, and checking key existence against the proxy is not * required (or sensible, as the keys may be fully virtual). */ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_TARGET); enum_target = duk_require_hobject(thr, -1); DUK_ASSERT(enum_target != NULL); #if defined(DUK_USE_ES6_PROXY) check_existence = (!DUK_HOBJECT_IS_PROXY(enum_target)); #else check_existence = 1; #endif duk_pop(thr); /* still reachable */ DUK_DDD(DUK_DDDPRINT("getting next enum value, enum_target=%!iO, enumerator=%!iT", (duk_heaphdr *) enum_target, (duk_tval *) duk_get_tval(thr, -1))); /* no array part */ for (;;) { duk_hstring *k; if (idx >= DUK_HOBJECT_GET_ENEXT(e)) { DUK_DDD(DUK_DDDPRINT("enumeration: ran out of elements")); break; } /* we know these because enum objects are internally created */ k = DUK_HOBJECT_E_GET_KEY(thr->heap, e, idx); DUK_ASSERT(k != NULL); DUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, e, idx)); DUK_ASSERT(!DUK_TVAL_IS_UNUSED(&DUK_HOBJECT_E_GET_VALUE(thr->heap, e, idx).v)); idx++; /* recheck that the property still exists */ if (check_existence && !duk_hobject_hasprop_raw(thr, enum_target, k)) { DUK_DDD(DUK_DDDPRINT("property deleted during enumeration, skip")); continue; } DUK_DDD(DUK_DDDPRINT("enumeration: found element, key: %!O", (duk_heaphdr *) k)); res = k; break; } DUK_DDD(DUK_DDDPRINT("enumeration: updating next index to %ld", (long) idx)); duk_push_u32(thr, (duk_uint32_t) idx); duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_INT_NEXT); /* [... enum] */ if (res) { duk_push_hstring(thr, res); if (get_value) { duk_push_hobject(thr, enum_target); duk_dup_m2(thr); /* -> [... enum key enum_target key] */ duk_get_prop(thr, -2); /* -> [... enum key enum_target val] */ duk_remove_m2(thr); /* -> [... enum key val] */ duk_remove(thr, -3); /* -> [... key val] */ } else { duk_remove_m2(thr); /* -> [... key] */ } return 1; } else { duk_pop(thr); /* -> [...] */ return 0; } } /* * Get enumerated keys in an Ecmascript array. Matches Object.keys() behavior * described in E5 Section 15.2.3.14. */ DUK_INTERNAL duk_ret_t duk_hobject_get_enumerated_keys(duk_hthread *thr, duk_small_uint_t enum_flags) { duk_hobject *e; duk_hstring **keys; duk_tval *tv; duk_uint_fast32_t count; DUK_ASSERT(thr != NULL); DUK_ASSERT(duk_get_hobject(thr, -1) != NULL); /* Create a temporary enumerator to get the (non-duplicated) key list; * the enumerator state is initialized without being needed, but that * has little impact. */ duk_hobject_enumerator_create(thr, enum_flags); e = duk_known_hobject(thr, -1); /* [enum_target enum res] */ /* Create dense result array to exact size. */ DUK_ASSERT(DUK_HOBJECT_GET_ENEXT(e) >= DUK__ENUM_START_INDEX); count = (duk_uint32_t) (DUK_HOBJECT_GET_ENEXT(e) - DUK__ENUM_START_INDEX); /* XXX: uninit would be OK */ tv = duk_push_harray_with_size_outptr(thr, (duk_uint32_t) count); DUK_ASSERT(count == 0 || tv != NULL); /* Fill result array, no side effects. */ keys = DUK_HOBJECT_E_GET_KEY_BASE(thr->heap, e); keys += DUK__ENUM_START_INDEX; while (count-- > 0) { duk_hstring *k; k = *keys++; DUK_ASSERT(k != NULL); /* enumerator must have no keys deleted */ DUK_TVAL_SET_STRING(tv, k); tv++; DUK_HSTRING_INCREF(thr, k); } /* [enum_target enum res] */ duk_remove_m2(thr); /* [enum_target res] */ return 1; /* return 1 to allow callers to tail call */ } /* automatic undefs */ #undef DUK__ENUM_START_INDEX #line 1 "duk_hobject_misc.c" /* * Misc support functions */ /* #include duk_internal.h -> already included */ DUK_INTERNAL duk_bool_t duk_hobject_prototype_chain_contains(duk_hthread *thr, duk_hobject *h, duk_hobject *p, duk_bool_t ignore_loop) { duk_uint_t sanity; DUK_ASSERT(thr != NULL); /* False if the object is NULL or the prototype 'p' is NULL. * In particular, false if both are NULL (don't compare equal). */ if (h == NULL || p == NULL) { return 0; } sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY; do { if (h == p) { return 1; } if (sanity-- == 0) { if (ignore_loop) { break; } else { DUK_ERROR_RANGE(thr, DUK_STR_PROTOTYPE_CHAIN_LIMIT); } } h = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h); } while (h); return 0; } DUK_INTERNAL void duk_hobject_set_prototype_updref(duk_hthread *thr, duk_hobject *h, duk_hobject *p) { #if defined(DUK_USE_REFERENCE_COUNTING) duk_hobject *tmp; DUK_ASSERT(h); tmp = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h); DUK_HOBJECT_SET_PROTOTYPE(thr->heap, h, p); DUK_HOBJECT_INCREF_ALLOWNULL(thr, p); /* avoid problems if p == h->prototype */ DUK_HOBJECT_DECREF_ALLOWNULL(thr, tmp); #else DUK_ASSERT(h); DUK_UNREF(thr); DUK_HOBJECT_SET_PROTOTYPE(thr->heap, h, p); #endif } #line 1 "duk_hobject_pc2line.c" /* * Helpers for creating and querying pc2line debug data, which * converts a bytecode program counter to a source line number. * * The run-time pc2line data is bit-packed, and documented in: * * doc/function-objects.rst */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_PC2LINE) /* Generate pc2line data for an instruction sequence, leaving a buffer on stack top. */ DUK_INTERNAL void duk_hobject_pc2line_pack(duk_hthread *thr, duk_compiler_instr *instrs, duk_uint_fast32_t length) { duk_hbuffer_dynamic *h_buf; duk_bitencoder_ctx be_ctx_alloc; duk_bitencoder_ctx *be_ctx = &be_ctx_alloc; duk_uint32_t *hdr; duk_size_t new_size; duk_uint_fast32_t num_header_entries; duk_uint_fast32_t curr_offset; duk_int_fast32_t curr_line, next_line, diff_line; duk_uint_fast32_t curr_pc; duk_uint_fast32_t hdr_index; DUK_ASSERT(length <= DUK_COMPILER_MAX_BYTECODE_LENGTH); num_header_entries = (length + DUK_PC2LINE_SKIP - 1) / DUK_PC2LINE_SKIP; curr_offset = (duk_uint_fast32_t) (sizeof(duk_uint32_t) + num_header_entries * sizeof(duk_uint32_t) * 2); duk_push_dynamic_buffer(thr, (duk_size_t) curr_offset); h_buf = (duk_hbuffer_dynamic *) duk_known_hbuffer(thr, -1); DUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(h_buf) && !DUK_HBUFFER_HAS_EXTERNAL(h_buf)); hdr = (duk_uint32_t *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, h_buf); DUK_ASSERT(hdr != NULL); hdr[0] = (duk_uint32_t) length; /* valid pc range is [0, length[ */ curr_pc = 0U; while (curr_pc < length) { new_size = (duk_size_t) (curr_offset + DUK_PC2LINE_MAX_DIFF_LENGTH); duk_hbuffer_resize(thr, h_buf, new_size); hdr = (duk_uint32_t *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, h_buf); DUK_ASSERT(hdr != NULL); DUK_ASSERT(curr_pc < length); hdr_index = 1 + (curr_pc / DUK_PC2LINE_SKIP) * 2; curr_line = (duk_int_fast32_t) instrs[curr_pc].line; hdr[hdr_index + 0] = (duk_uint32_t) curr_line; hdr[hdr_index + 1] = (duk_uint32_t) curr_offset; #if 0 DUK_DDD(DUK_DDDPRINT("hdr[%ld]: pc=%ld line=%ld offset=%ld", (long) (curr_pc / DUK_PC2LINE_SKIP), (long) curr_pc, (long) hdr[hdr_index + 0], (long) hdr[hdr_index + 1])); #endif DUK_MEMZERO(be_ctx, sizeof(*be_ctx)); be_ctx->data = ((duk_uint8_t *) hdr) + curr_offset; be_ctx->length = (duk_size_t) DUK_PC2LINE_MAX_DIFF_LENGTH; for (;;) { curr_pc++; if ( ((curr_pc % DUK_PC2LINE_SKIP) == 0) || /* end of diff run */ (curr_pc >= length) ) { /* end of bytecode */ break; } DUK_ASSERT(curr_pc < length); next_line = (duk_int32_t) instrs[curr_pc].line; diff_line = next_line - curr_line; #if 0 DUK_DDD(DUK_DDDPRINT("curr_line=%ld, next_line=%ld -> diff_line=%ld", (long) curr_line, (long) next_line, (long) diff_line)); #endif if (diff_line == 0) { /* 0 */ duk_be_encode(be_ctx, 0, 1); } else if (diff_line >= 1 && diff_line <= 4) { /* 1 0 <2 bits> */ duk_be_encode(be_ctx, (duk_uint32_t) ((0x02 << 2) + (diff_line - 1)), 4); } else if (diff_line >= -0x80 && diff_line <= 0x7f) { /* 1 1 0 <8 bits> */ DUK_ASSERT(diff_line + 0x80 >= 0 && diff_line + 0x80 <= 0xff); duk_be_encode(be_ctx, (duk_uint32_t) ((0x06 << 8) + (diff_line + 0x80)), 11); } else { /* 1 1 1 <32 bits> * Encode in two parts to avoid bitencode 24-bit limitation */ duk_be_encode(be_ctx, (duk_uint32_t) ((0x07 << 16) + ((next_line >> 16) & 0xffff)), 19); duk_be_encode(be_ctx, (duk_uint32_t) (next_line & 0xffff), 16); } curr_line = next_line; } duk_be_finish(be_ctx); DUK_ASSERT(!be_ctx->truncated); /* be_ctx->offset == length of encoded bitstream */ curr_offset += (duk_uint_fast32_t) be_ctx->offset; } /* compact */ new_size = (duk_size_t) curr_offset; duk_hbuffer_resize(thr, h_buf, new_size); (void) duk_to_fixed_buffer(thr, -1, NULL); DUK_DDD(DUK_DDDPRINT("final pc2line data: pc_limit=%ld, length=%ld, %lf bits/opcode --> %!ixT", (long) length, (long) new_size, (double) new_size * 8.0 / (double) length, (duk_tval *) duk_get_tval(thr, -1))); } /* PC is unsigned. If caller does PC arithmetic and gets a negative result, * it will map to a large PC which is out of bounds and causes a zero to be * returned. */ DUK_LOCAL duk_uint_fast32_t duk__hobject_pc2line_query_raw(duk_hthread *thr, duk_hbuffer_fixed *buf, duk_uint_fast32_t pc) { duk_bitdecoder_ctx bd_ctx_alloc; duk_bitdecoder_ctx *bd_ctx = &bd_ctx_alloc; duk_uint32_t *hdr; duk_uint_fast32_t start_offset; duk_uint_fast32_t pc_limit; duk_uint_fast32_t hdr_index; duk_uint_fast32_t pc_base; duk_uint_fast32_t n; duk_uint_fast32_t curr_line; DUK_ASSERT(buf != NULL); DUK_ASSERT(!DUK_HBUFFER_HAS_DYNAMIC((duk_hbuffer *) buf) && !DUK_HBUFFER_HAS_EXTERNAL((duk_hbuffer *) buf)); DUK_UNREF(thr); /* * Use the index in the header to find the right starting point */ hdr_index = pc / DUK_PC2LINE_SKIP; pc_base = hdr_index * DUK_PC2LINE_SKIP; n = pc - pc_base; if (DUK_HBUFFER_FIXED_GET_SIZE(buf) <= sizeof(duk_uint32_t)) { DUK_DD(DUK_DDPRINT("pc2line lookup failed: buffer is smaller than minimal header")); goto pc2line_error; } hdr = (duk_uint32_t *) (void *) DUK_HBUFFER_FIXED_GET_DATA_PTR(thr->heap, buf); pc_limit = hdr[0]; if (pc >= pc_limit) { /* Note: pc is unsigned and cannot be negative */ DUK_DD(DUK_DDPRINT("pc2line lookup failed: pc out of bounds (pc=%ld, limit=%ld)", (long) pc, (long) pc_limit)); goto pc2line_error; } curr_line = hdr[1 + hdr_index * 2]; start_offset = hdr[1 + hdr_index * 2 + 1]; if ((duk_size_t) start_offset > DUK_HBUFFER_FIXED_GET_SIZE(buf)) { DUK_DD(DUK_DDPRINT("pc2line lookup failed: start_offset out of bounds (start_offset=%ld, buffer_size=%ld)", (long) start_offset, (long) DUK_HBUFFER_GET_SIZE((duk_hbuffer *) buf))); goto pc2line_error; } /* * Iterate the bitstream (line diffs) until PC is reached */ DUK_MEMZERO(bd_ctx, sizeof(*bd_ctx)); bd_ctx->data = ((duk_uint8_t *) hdr) + start_offset; bd_ctx->length = (duk_size_t) (DUK_HBUFFER_FIXED_GET_SIZE(buf) - start_offset); #if 0 DUK_DDD(DUK_DDDPRINT("pc2line lookup: pc=%ld -> hdr_index=%ld, pc_base=%ld, n=%ld, start_offset=%ld", (long) pc, (long) hdr_index, (long) pc_base, (long) n, (long) start_offset)); #endif while (n > 0) { #if 0 DUK_DDD(DUK_DDDPRINT("lookup: n=%ld, curr_line=%ld", (long) n, (long) curr_line)); #endif if (duk_bd_decode_flag(bd_ctx)) { if (duk_bd_decode_flag(bd_ctx)) { if (duk_bd_decode_flag(bd_ctx)) { /* 1 1 1 <32 bits> */ duk_uint_fast32_t t; t = duk_bd_decode(bd_ctx, 16); /* workaround: max nbits = 24 now */ t = (t << 16) + duk_bd_decode(bd_ctx, 16); curr_line = t; } else { /* 1 1 0 <8 bits> */ duk_uint_fast32_t t; t = duk_bd_decode(bd_ctx, 8); curr_line = curr_line + t - 0x80; } } else { /* 1 0 <2 bits> */ duk_uint_fast32_t t; t = duk_bd_decode(bd_ctx, 2); curr_line = curr_line + t + 1; } } else { /* 0: no change */ } n--; } DUK_DDD(DUK_DDDPRINT("pc2line lookup result: pc %ld -> line %ld", (long) pc, (long) curr_line)); return curr_line; pc2line_error: DUK_D(DUK_DPRINT("pc2line conversion failed for pc=%ld", (long) pc)); return 0; } DUK_INTERNAL duk_uint_fast32_t duk_hobject_pc2line_query(duk_hthread *thr, duk_idx_t idx_func, duk_uint_fast32_t pc) { duk_hbuffer_fixed *pc2line; duk_uint_fast32_t line; /* XXX: now that pc2line is used by the debugger quite heavily in * checked execution, this should be optimized to avoid value stack * and perhaps also implement some form of pc2line caching (see * future work in debugger.rst). */ duk_get_prop_stridx(thr, idx_func, DUK_STRIDX_INT_PC2LINE); pc2line = (duk_hbuffer_fixed *) duk_get_hbuffer(thr, -1); if (pc2line != NULL) { DUK_ASSERT(!DUK_HBUFFER_HAS_DYNAMIC((duk_hbuffer *) pc2line) && !DUK_HBUFFER_HAS_EXTERNAL((duk_hbuffer *) pc2line)); line = duk__hobject_pc2line_query_raw(thr, pc2line, (duk_uint_fast32_t) pc); } else { line = 0; } duk_pop(thr); return line; } #endif /* DUK_USE_PC2LINE */ #line 1 "duk_hobject_props.c" /* * duk_hobject property access functionality. * * This is very central functionality for size, performance, and compliance. * It is also rather intricate; see hobject-algorithms.rst for discussion on * the algorithms and memory-management.rst for discussion on refcounts and * side effect issues. * * Notes: * * - It might be tempting to assert "refcount nonzero" for objects * being operated on, but that's not always correct: objects with * a zero refcount may be operated on by the refcount implementation * (finalization) for instance. Hence, no refcount assertions are made. * * - Many operations (memory allocation, identifier operations, etc) * may cause arbitrary side effects (e.g. through GC and finalization). * These side effects may invalidate duk_tval pointers which point to * areas subject to reallocation (like value stack). Heap objects * themselves have stable pointers. Holding heap object pointers or * duk_tval copies is not problematic with respect to side effects; * care must be taken when holding and using argument duk_tval pointers. * * - If a finalizer is executed, it may operate on the the same object * we're currently dealing with. For instance, the finalizer might * delete a certain property which has already been looked up and * confirmed to exist. Ideally finalizers would be disabled if GC * happens during property access. At the moment property table realloc * disables finalizers, and all DECREFs may cause arbitrary changes so * handle DECREF carefully. * * - The order of operations for a DECREF matters. When DECREF is executed, * the entire object graph must be consistent; note that a refzero may * lead to a mark-and-sweep through a refcount finalizer. Use NORZ macros * and an explicit DUK_REFZERO_CHECK_xxx() if achieving correct order is hard. */ /* * XXX: array indices are mostly typed as duk_uint32_t here; duk_uarridx_t * might be more appropriate. */ /* #include duk_internal.h -> already included */ /* * Local defines */ #define DUK__NO_ARRAY_INDEX DUK_HSTRING_NO_ARRAY_INDEX /* Marker values for hash part. */ #define DUK__HASH_UNUSED DUK_HOBJECT_HASHIDX_UNUSED #define DUK__HASH_DELETED DUK_HOBJECT_HASHIDX_DELETED /* Valstack space that suffices for all local calls, excluding any recursion * into Ecmascript or Duktape/C calls (Proxy, getters, etc). */ #define DUK__VALSTACK_SPACE 10 /* Valstack space allocated especially for proxy lookup which does a * recursive property lookup. */ #define DUK__VALSTACK_PROXY_LOOKUP 20 /* * Local prototypes */ DUK_LOCAL_DECL duk_bool_t duk__check_arguments_map_for_get(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc); DUK_LOCAL_DECL void duk__check_arguments_map_for_put(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc, duk_bool_t throw_flag); DUK_LOCAL_DECL void duk__check_arguments_map_for_delete(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc); DUK_LOCAL_DECL duk_bool_t duk__handle_put_array_length_smaller(duk_hthread *thr, duk_hobject *obj, duk_uint32_t old_len, duk_uint32_t new_len, duk_bool_t force_flag, duk_uint32_t *out_result_len); DUK_LOCAL_DECL duk_bool_t duk__handle_put_array_length(duk_hthread *thr, duk_hobject *obj); DUK_LOCAL_DECL duk_bool_t duk__get_propdesc(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *out_desc, duk_small_uint_t flags); DUK_LOCAL_DECL duk_bool_t duk__get_own_propdesc_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_uint32_t arr_idx, duk_propdesc *out_desc, duk_small_uint_t flags); /* * Misc helpers */ /* Convert a duk_tval number (caller checks) to a 32-bit index. Returns * DUK__NO_ARRAY_INDEX if the number is not whole or not a valid array * index. */ /* XXX: for fastints, could use a variant which assumes a double duk_tval * (and doesn't need to check for fastint again). */ DUK_LOCAL duk_uint32_t duk__tval_number_to_arr_idx(duk_tval *tv) { duk_double_t dbl; duk_uint32_t idx; DUK_ASSERT(tv != NULL); DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); /* -0 is accepted here as index 0 because ToString(-0) == "0" which is * in canonical form and thus an array index. */ dbl = DUK_TVAL_GET_NUMBER(tv); idx = (duk_uint32_t) dbl; if ((duk_double_t) idx == dbl) { /* Is whole and within 32 bit range. If the value happens to be 0xFFFFFFFF, * it's not a valid array index but will then match DUK__NO_ARRAY_INDEX. */ return idx; } return DUK__NO_ARRAY_INDEX; } #if defined(DUK_USE_FASTINT) /* Convert a duk_tval fastint (caller checks) to a 32-bit index. */ DUK_LOCAL duk_uint32_t duk__tval_fastint_to_arr_idx(duk_tval *tv) { duk_int64_t t; DUK_ASSERT(tv != NULL); DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv)); t = DUK_TVAL_GET_FASTINT(tv); if (((duk_uint64_t) t & ~DUK_U64_CONSTANT(0xffffffff)) != 0) { /* Catches >0x100000000 and negative values. */ return DUK__NO_ARRAY_INDEX; } /* If the value happens to be 0xFFFFFFFF, it's not a valid array index * but will then match DUK__NO_ARRAY_INDEX. */ return (duk_uint32_t) t; } #endif /* DUK_USE_FASTINT */ /* Convert a duk_tval on the value stack (in a trusted index we don't validate) * to a string or symbol using ES2015 ToPropertyKey(): * http://www.ecma-international.org/ecma-262/6.0/#sec-topropertykey. * * Also check if it's a valid array index and return that (or DUK__NO_ARRAY_INDEX * if not). */ DUK_LOCAL duk_uint32_t duk__to_property_key(duk_hthread *thr, duk_idx_t idx, duk_hstring **out_h) { duk_uint32_t arr_idx; duk_hstring *h; duk_tval *tv_dst; DUK_ASSERT(thr != NULL); DUK_ASSERT(out_h != NULL); DUK_ASSERT(duk_is_valid_index(thr, idx)); DUK_ASSERT(idx < 0); /* XXX: The revised ES2015 ToPropertyKey() handling (ES5.1 was just * ToString()) involves a ToPrimitive(), a symbol check, and finally * a ToString(). Figure out the best way to have a good fast path * but still be compliant and share code. */ tv_dst = DUK_GET_TVAL_NEGIDX(thr, idx); /* intentionally unvalidated */ if (DUK_TVAL_IS_STRING(tv_dst)) { /* Most important path: strings and plain symbols are used as * is. For symbols the array index check below is unnecessary * (they're never valid array indices) but checking that the * string is a symbol would make the plain string path slower * unnecessarily. */ h = DUK_TVAL_GET_STRING(tv_dst); } else { h = duk_to_property_key_hstring(thr, idx); } DUK_ASSERT(h != NULL); *out_h = h; arr_idx = DUK_HSTRING_GET_ARRIDX_FAST(h); return arr_idx; } DUK_LOCAL duk_uint32_t duk__push_tval_to_property_key(duk_hthread *thr, duk_tval *tv_key, duk_hstring **out_h) { duk_push_tval(thr, tv_key); /* XXX: could use an unsafe push here */ return duk__to_property_key(thr, -1, out_h); } /* String is an own (virtual) property of a plain buffer. */ DUK_LOCAL duk_bool_t duk__key_is_plain_buf_ownprop(duk_hthread *thr, duk_hbuffer *buf, duk_hstring *key, duk_uint32_t arr_idx) { DUK_UNREF(thr); /* Virtual index properties. Checking explicitly for * 'arr_idx != DUK__NO_ARRAY_INDEX' is not necessary * because DUK__NO_ARRAY_INDEXi is always larger than * maximum allowed buffer size. */ DUK_ASSERT(DUK__NO_ARRAY_INDEX >= DUK_HBUFFER_GET_SIZE(buf)); if (arr_idx < DUK_HBUFFER_GET_SIZE(buf)) { return 1; } /* Other virtual properties. */ return (key == DUK_HTHREAD_STRING_LENGTH(thr)); } /* * Helpers for managing property storage size */ /* Get default hash part size for a certain entry part size. */ #if defined(DUK_USE_HOBJECT_HASH_PART) DUK_LOCAL duk_uint32_t duk__get_default_h_size(duk_uint32_t e_size) { DUK_ASSERT(e_size <= DUK_HOBJECT_MAX_PROPERTIES); if (e_size >= DUK_USE_HOBJECT_HASH_PROP_LIMIT) { duk_uint32_t res; duk_uint32_t tmp; /* Hash size should be 2^N where N is chosen so that 2^N is * larger than e_size. Extra shifting is used to ensure hash * is relatively sparse. */ tmp = e_size; res = 2; /* Result will be 2 ** (N + 1). */ while (tmp >= 0x40) { tmp >>= 6; res <<= 6; } while (tmp != 0) { tmp >>= 1; res <<= 1; } DUK_ASSERT((DUK_HOBJECT_MAX_PROPERTIES << 2U) > DUK_HOBJECT_MAX_PROPERTIES); /* Won't wrap, even shifted by 2. */ DUK_ASSERT(res > e_size); return res; } else { return 0; } } #endif /* USE_PROP_HASH_PART */ /* Get minimum entry part growth for a certain size. */ DUK_LOCAL duk_uint32_t duk__get_min_grow_e(duk_uint32_t e_size) { duk_uint32_t res; DUK_ASSERT(e_size <= DUK_HOBJECT_MAX_PROPERTIES); res = (e_size + DUK_USE_HOBJECT_ENTRY_MINGROW_ADD) / DUK_USE_HOBJECT_ENTRY_MINGROW_DIVISOR; DUK_ASSERT(res >= 1); /* important for callers */ return res; } /* Get minimum array part growth for a certain size. */ DUK_LOCAL duk_uint32_t duk__get_min_grow_a(duk_uint32_t a_size) { duk_uint32_t res; DUK_ASSERT((duk_size_t) a_size <= DUK_HOBJECT_MAX_PROPERTIES); res = (a_size + DUK_USE_HOBJECT_ARRAY_MINGROW_ADD) / DUK_USE_HOBJECT_ARRAY_MINGROW_DIVISOR; DUK_ASSERT(res >= 1); /* important for callers */ return res; } /* Count actually used entry part entries (non-NULL keys). */ DUK_LOCAL duk_uint32_t duk__count_used_e_keys(duk_hthread *thr, duk_hobject *obj) { duk_uint_fast32_t i; duk_uint_fast32_t n = 0; duk_hstring **e; DUK_ASSERT(obj != NULL); DUK_UNREF(thr); e = DUK_HOBJECT_E_GET_KEY_BASE(thr->heap, obj); for (i = 0; i < DUK_HOBJECT_GET_ENEXT(obj); i++) { if (*e++) { n++; } } return (duk_uint32_t) n; } /* Count actually used array part entries and array minimum size. * NOTE: 'out_min_size' can be computed much faster by starting from the * end and breaking out early when finding first used entry, but this is * not needed now. */ DUK_LOCAL void duk__compute_a_stats(duk_hthread *thr, duk_hobject *obj, duk_uint32_t *out_used, duk_uint32_t *out_min_size) { duk_uint_fast32_t i; duk_uint_fast32_t used = 0; duk_uint_fast32_t highest_idx = (duk_uint_fast32_t) -1; /* see below */ duk_tval *a; DUK_ASSERT(obj != NULL); DUK_ASSERT(out_used != NULL); DUK_ASSERT(out_min_size != NULL); DUK_UNREF(thr); a = DUK_HOBJECT_A_GET_BASE(thr->heap, obj); for (i = 0; i < DUK_HOBJECT_GET_ASIZE(obj); i++) { duk_tval *tv = a++; if (!DUK_TVAL_IS_UNUSED(tv)) { used++; highest_idx = i; } } /* Initial value for highest_idx is -1 coerced to unsigned. This * is a bit odd, but (highest_idx + 1) will then wrap to 0 below * for out_min_size as intended. */ *out_used = (duk_uint32_t) used; *out_min_size = (duk_uint32_t) (highest_idx + 1); /* 0 if no used entries */ } /* Check array density and indicate whether or not the array part should be abandoned. */ DUK_LOCAL duk_bool_t duk__abandon_array_density_check(duk_uint32_t a_used, duk_uint32_t a_size) { /* * Array abandon check; abandon if: * * new_used / new_size < limit * new_used < limit * new_size || limit is 3 bits fixed point * new_used < limit' / 8 * new_size || *8 * 8*new_used < limit' * new_size || :8 * new_used < limit' * (new_size / 8) * * Here, new_used = a_used, new_size = a_size. * * Note: some callers use approximate values for a_used and/or a_size * (e.g. dropping a '+1' term). This doesn't affect the usefulness * of the check, but may confuse debugging. */ return (a_used < DUK_USE_HOBJECT_ARRAY_ABANDON_LIMIT * (a_size >> 3)); } /* Fast check for extending array: check whether or not a slow density check is required. */ DUK_LOCAL duk_bool_t duk__abandon_array_slow_check_required(duk_uint32_t arr_idx, duk_uint32_t old_size) { /* * In a fast check we assume old_size equals old_used (i.e., existing * array is fully dense). * * Slow check if: * * (new_size - old_size) / old_size > limit * new_size - old_size > limit * old_size * new_size > (1 + limit) * old_size || limit' is 3 bits fixed point * new_size > (1 + (limit' / 8)) * old_size || * 8 * 8 * new_size > (8 + limit') * old_size || : 8 * new_size > (8 + limit') * (old_size / 8) * new_size > limit'' * (old_size / 8) || limit'' = 9 -> max 25% increase * arr_idx + 1 > limit'' * (old_size / 8) * * This check doesn't work well for small values, so old_size is rounded * up for the check (and the '+ 1' of arr_idx can be ignored in practice): * * arr_idx > limit'' * ((old_size + 7) / 8) */ return (arr_idx > DUK_USE_HOBJECT_ARRAY_FAST_RESIZE_LIMIT * ((old_size + 7) >> 3)); } /* * Proxy helpers */ #if defined(DUK_USE_ES6_PROXY) DUK_INTERNAL duk_bool_t duk_hobject_proxy_check(duk_hobject *obj, duk_hobject **out_target, duk_hobject **out_handler) { duk_hproxy *h_proxy; DUK_ASSERT(obj != NULL); DUK_ASSERT(out_target != NULL); DUK_ASSERT(out_handler != NULL); /* Caller doesn't need to check exotic proxy behavior (but does so for * some fast paths). */ if (DUK_LIKELY(!DUK_HOBJECT_IS_PROXY(obj))) { return 0; } h_proxy = (duk_hproxy *) obj; DUK_ASSERT_HPROXY_VALID(h_proxy); DUK_ASSERT(h_proxy->handler != NULL); DUK_ASSERT(h_proxy->target != NULL); *out_handler = h_proxy->handler; *out_target = h_proxy->target; return 1; } #endif /* DUK_USE_ES6_PROXY */ /* Get Proxy target object. If the argument is not a Proxy, return it as is. * If a Proxy is revoked, an error is thrown. */ #if defined(DUK_USE_ES6_PROXY) DUK_INTERNAL duk_hobject *duk_hobject_resolve_proxy_target(duk_hobject *obj) { DUK_ASSERT(obj != NULL); /* Resolve Proxy targets until Proxy chain ends. No explicit check for * a Proxy loop: user code cannot create such a loop (it would only be * possible by editing duk_hproxy references directly). */ while (DUK_HOBJECT_IS_PROXY(obj)) { duk_hproxy *h_proxy; h_proxy = (duk_hproxy *) obj; DUK_ASSERT_HPROXY_VALID(h_proxy); obj = h_proxy->target; DUK_ASSERT(obj != NULL); } DUK_ASSERT(obj != NULL); return obj; } #endif /* DUK_USE_ES6_PROXY */ #if defined(DUK_USE_ES6_PROXY) DUK_LOCAL duk_bool_t duk__proxy_check_prop(duk_hthread *thr, duk_hobject *obj, duk_small_uint_t stridx_trap, duk_tval *tv_key, duk_hobject **out_target) { duk_hobject *h_handler; DUK_ASSERT(thr != NULL); DUK_ASSERT(obj != NULL); DUK_ASSERT(tv_key != NULL); DUK_ASSERT(out_target != NULL); if (!duk_hobject_proxy_check(obj, out_target, &h_handler)) { return 0; } DUK_ASSERT(*out_target != NULL); DUK_ASSERT(h_handler != NULL); /* XXX: At the moment Duktape accesses internal keys like _Finalizer using a * normal property set/get which would allow a proxy handler to interfere with * such behavior and to get access to internal key strings. This is not a problem * as such because internal key strings can be created in other ways too (e.g. * through buffers). The best fix is to change Duktape internal lookups to * skip proxy behavior. Until that, internal property accesses bypass the * proxy and are applied to the target (as if the handler did not exist). * This has some side effects, see test-bi-proxy-internal-keys.js. */ if (DUK_TVAL_IS_STRING(tv_key)) { duk_hstring *h_key = (duk_hstring *) DUK_TVAL_GET_STRING(tv_key); DUK_ASSERT(h_key != NULL); if (DUK_HSTRING_HAS_HIDDEN(h_key)) { /* Symbol accesses must go through proxy lookup in ES2015. * Hidden symbols behave like Duktape 1.x internal keys * and currently won't. */ DUK_DDD(DUK_DDDPRINT("hidden key, skip proxy handler and apply to target")); return 0; } } /* The handler is looked up with a normal property lookup; it may be an * accessor or the handler object itself may be a proxy object. If the * handler is a proxy, we need to extend the valstack as we make a * recursive proxy check without a function call in between (in fact * there is no limit to the potential recursion here). * * (For sanity, proxy creation rejects another proxy object as either * the handler or the target at the moment so recursive proxy cases * are not realized now.) */ /* XXX: C recursion limit if proxies are allowed as handler/target values */ duk_require_stack(thr, DUK__VALSTACK_PROXY_LOOKUP); duk_push_hobject(thr, h_handler); if (duk_get_prop_stridx_short(thr, -1, stridx_trap)) { /* -> [ ... handler trap ] */ duk_insert(thr, -2); /* -> [ ... trap handler ] */ /* stack prepped for func call: [ ... trap handler ] */ return 1; } else { duk_pop_2_unsafe(thr); return 0; } } #endif /* DUK_USE_ES6_PROXY */ /* * Reallocate property allocation, moving properties to the new allocation. * * Includes key compaction, rehashing, and can also optionally abandon * the array part, 'migrating' array entries into the beginning of the * new entry part. * * There is no support for in-place reallocation or just compacting keys * without resizing the property allocation. This is intentional to keep * code size minimal, but would be useful future work. * * The implementation is relatively straightforward, except for the array * abandonment process. Array abandonment requires that new string keys * are interned, which may trigger GC. All keys interned so far must be * reachable for GC at all times and correctly refcounted for; valstack is * used for that now. * * Also, a GC triggered during this reallocation process must not interfere * with the object being resized. This is currently controlled by preventing * finalizers (as they may affect ANY object) and object compaction in * mark-and-sweep. It would suffice to protect only this particular object * from compaction, however. DECREF refzero cascades are side effect free * and OK. * * Note: because we need to potentially resize the valstack (as part * of abandoning the array part), any tval pointers to the valstack * will become invalid after this call. */ DUK_INTERNAL void duk_hobject_realloc_props(duk_hthread *thr, duk_hobject *obj, duk_uint32_t new_e_size, duk_uint32_t new_a_size, duk_uint32_t new_h_size, duk_bool_t abandon_array) { duk_small_uint_t prev_ms_base_flags; duk_uint32_t new_alloc_size; duk_uint32_t new_e_size_adjusted; duk_uint8_t *new_p; duk_hstring **new_e_k; duk_propvalue *new_e_pv; duk_uint8_t *new_e_f; duk_tval *new_a; duk_uint32_t *new_h; duk_uint32_t new_e_next; duk_uint_fast32_t i; duk_size_t array_copy_size; #if defined(DUK_USE_ASSERTIONS) duk_bool_t prev_error_not_allowed; #endif DUK_ASSERT(thr != NULL); DUK_ASSERT(obj != NULL); DUK_ASSERT(!abandon_array || new_a_size == 0); /* if abandon_array, new_a_size must be 0 */ DUK_ASSERT(DUK_HOBJECT_GET_PROPS(thr->heap, obj) != NULL || (DUK_HOBJECT_GET_ESIZE(obj) == 0 && DUK_HOBJECT_GET_ASIZE(obj) == 0)); DUK_ASSERT(new_h_size == 0 || new_h_size >= new_e_size); /* required to guarantee success of rehashing, * intentionally use unadjusted new_e_size */ DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)); DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); DUK_STATS_INC(thr->heap, stats_object_realloc_props); /* * Pre resize assertions. */ #if defined(DUK_USE_ASSERTIONS) /* XXX: pre-checks (such as no duplicate keys) */ #endif /* * For property layout 1, tweak e_size to ensure that the whole entry * part (key + val + flags) is a suitable multiple for alignment * (platform specific). * * Property layout 2 does not require this tweaking and is preferred * on low RAM platforms requiring alignment. */ #if defined(DUK_USE_HOBJECT_LAYOUT_2) || defined(DUK_USE_HOBJECT_LAYOUT_3) DUK_DDD(DUK_DDDPRINT("using layout 2 or 3, no need to pad e_size: %ld", (long) new_e_size)); new_e_size_adjusted = new_e_size; #elif defined(DUK_USE_HOBJECT_LAYOUT_1) && (DUK_HOBJECT_ALIGN_TARGET == 1) DUK_DDD(DUK_DDDPRINT("using layout 1, but no need to pad e_size: %ld", (long) new_e_size)); new_e_size_adjusted = new_e_size; #elif defined(DUK_USE_HOBJECT_LAYOUT_1) && ((DUK_HOBJECT_ALIGN_TARGET == 4) || (DUK_HOBJECT_ALIGN_TARGET == 8)) new_e_size_adjusted = (new_e_size + (duk_uint32_t) DUK_HOBJECT_ALIGN_TARGET - 1U) & (~((duk_uint32_t) DUK_HOBJECT_ALIGN_TARGET - 1U)); DUK_DDD(DUK_DDDPRINT("using layout 1, and alignment target is %ld, adjusted e_size: %ld -> %ld", (long) DUK_HOBJECT_ALIGN_TARGET, (long) new_e_size, (long) new_e_size_adjusted)); DUK_ASSERT(new_e_size_adjusted >= new_e_size); #else #error invalid hobject layout defines #endif /* * Debug logging after adjustment. */ DUK_DDD(DUK_DDDPRINT("attempt to resize hobject %p props (%ld -> %ld bytes), from {p=%p,e_size=%ld,e_next=%ld,a_size=%ld,h_size=%ld} to " "{e_size=%ld,a_size=%ld,h_size=%ld}, abandon_array=%ld, unadjusted new_e_size=%ld", (void *) obj, (long) DUK_HOBJECT_P_COMPUTE_SIZE(DUK_HOBJECT_GET_ESIZE(obj), DUK_HOBJECT_GET_ASIZE(obj), DUK_HOBJECT_GET_HSIZE(obj)), (long) DUK_HOBJECT_P_COMPUTE_SIZE(new_e_size_adjusted, new_a_size, new_h_size), (void *) DUK_HOBJECT_GET_PROPS(thr->heap, obj), (long) DUK_HOBJECT_GET_ESIZE(obj), (long) DUK_HOBJECT_GET_ENEXT(obj), (long) DUK_HOBJECT_GET_ASIZE(obj), (long) DUK_HOBJECT_GET_HSIZE(obj), (long) new_e_size_adjusted, (long) new_a_size, (long) new_h_size, (long) abandon_array, (long) new_e_size)); /* * Property count check. This is the only point where we ensure that * we don't get more (allocated) property space that we can handle. * There aren't hard limits as such, but some algorithms may fail * if we get too close to the 4G property limit. * * Since this works based on allocation size (not actually used size), * the limit is a bit approximate but good enough in practice. */ if (new_e_size_adjusted + new_a_size > DUK_HOBJECT_MAX_PROPERTIES) { DUK_ERROR_ALLOC_FAILED(thr); } /* * Compute new alloc size and alloc new area. * * The new area is not tracked in the heap at all, so it's critical * we get to free/keep it in a controlled manner. */ #if defined(DUK_USE_ASSERTIONS) /* Whole path must be error throw free, but we may be called from * within error handling so can't assert for error_not_allowed == 0. */ prev_error_not_allowed = thr->heap->error_not_allowed; thr->heap->error_not_allowed = 1; #endif prev_ms_base_flags = thr->heap->ms_base_flags; thr->heap->ms_base_flags |= DUK_MS_FLAG_NO_OBJECT_COMPACTION; /* Avoid attempt to compact the current object (all objects really). */ thr->heap->pf_prevent_count++; /* Avoid finalizers. */ DUK_ASSERT(thr->heap->pf_prevent_count != 0); /* Wrap. */ new_alloc_size = DUK_HOBJECT_P_COMPUTE_SIZE(new_e_size_adjusted, new_a_size, new_h_size); DUK_DDD(DUK_DDDPRINT("new hobject allocation size is %ld", (long) new_alloc_size)); if (new_alloc_size == 0) { DUK_ASSERT(new_e_size_adjusted == 0); DUK_ASSERT(new_a_size == 0); DUK_ASSERT(new_h_size == 0); new_p = NULL; } else { /* Alloc may trigger mark-and-sweep but no compaction, and * cannot throw. */ #if 0 /* XXX: inject test */ if (1) { new_p = NULL; goto alloc_failed; } #endif new_p = (duk_uint8_t *) DUK_ALLOC(thr->heap, new_alloc_size); if (new_p == NULL) { /* NULL always indicates alloc failure because * new_alloc_size > 0. */ goto alloc_failed; } } /* Set up pointers to the new property area: this is hidden behind a macro * because it is memory layout specific. */ DUK_HOBJECT_P_SET_REALLOC_PTRS(new_p, new_e_k, new_e_pv, new_e_f, new_a, new_h, new_e_size_adjusted, new_a_size, new_h_size); DUK_UNREF(new_h); /* happens when hash part dropped */ new_e_next = 0; /* if new_p == NULL, all of these pointers are NULL */ DUK_ASSERT((new_p != NULL) || (new_e_k == NULL && new_e_pv == NULL && new_e_f == NULL && new_a == NULL && new_h == NULL)); DUK_DDD(DUK_DDDPRINT("new alloc size %ld, new_e_k=%p, new_e_pv=%p, new_e_f=%p, new_a=%p, new_h=%p", (long) new_alloc_size, (void *) new_e_k, (void *) new_e_pv, (void *) new_e_f, (void *) new_a, (void *) new_h)); /* * Migrate array part to start of entries if requested. * * Note: from an enumeration perspective the order of entry keys matters. * Array keys should appear wherever they appeared before the array abandon * operation. (This no longer matters much because keys are ES2015 sorted.) */ if (abandon_array) { /* Assuming new_a_size == 0, and that entry part contains * no conflicting keys, refcounts do not need to be adjusted for * the values, as they remain exactly the same. * * The keys, however, need to be interned, incref'd, and be * reachable for GC. Any intern attempt may trigger a GC and * claim any non-reachable strings, so every key must be reachable * at all times. Refcounts must be correct to satisfy refcount * assertions. * * A longjmp must not occur here, as the new_p allocation would * leak. Refcounts would come out correctly as the interned * strings are valstack tracked. */ DUK_ASSERT(new_a_size == 0); DUK_STATS_INC(thr->heap, stats_object_abandon_array); for (i = 0; i < DUK_HOBJECT_GET_ASIZE(obj); i++) { duk_tval *tv1; duk_tval *tv2; duk_hstring *key; DUK_ASSERT(DUK_HOBJECT_GET_PROPS(thr->heap, obj) != NULL); tv1 = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, i); if (DUK_TVAL_IS_UNUSED(tv1)) { continue; } DUK_ASSERT(new_p != NULL && new_e_k != NULL && new_e_pv != NULL && new_e_f != NULL); /* * Intern key via the valstack to ensure reachability behaves * properly. We must avoid longjmp's here so use non-checked * primitives. * * Note: duk_check_stack() potentially reallocs the valstack, * invalidating any duk_tval pointers to valstack. Callers * must be careful. */ #if 0 /* XXX: inject test */ if (1) { goto abandon_error; } #endif /* Never shrinks; auto-adds DUK_VALSTACK_INTERNAL_EXTRA, which * is generous. */ if (!duk_check_stack(thr, 1)) { goto abandon_error; } DUK_ASSERT_VALSTACK_SPACE(thr, 1); key = duk_heap_strtable_intern_u32(thr->heap, (duk_uint32_t) i); if (key == NULL) { goto abandon_error; } duk_push_hstring(thr, key); /* keep key reachable for GC etc; guaranteed not to fail */ /* Key is now reachable in the valstack, don't INCREF * the new allocation yet (we'll steal the refcounts * from the value stack once all keys are done). */ new_e_k[new_e_next] = key; tv2 = &new_e_pv[new_e_next].v; /* array entries are all plain values */ DUK_TVAL_SET_TVAL(tv2, tv1); new_e_f[new_e_next] = DUK_PROPDESC_FLAG_WRITABLE | DUK_PROPDESC_FLAG_ENUMERABLE | DUK_PROPDESC_FLAG_CONFIGURABLE; new_e_next++; /* Note: new_e_next matches pushed temp key count, and nothing can * fail above between the push and this point. */ } /* Steal refcounts from value stack. */ DUK_DDD(DUK_DDDPRINT("abandon array: pop %ld key temps from valstack", (long) new_e_next)); duk_pop_n_nodecref_unsafe(thr, (duk_idx_t) new_e_next); } /* * Copy keys and values in the entry part (compacting them at the same time). */ for (i = 0; i < DUK_HOBJECT_GET_ENEXT(obj); i++) { duk_hstring *key; DUK_ASSERT(DUK_HOBJECT_GET_PROPS(thr->heap, obj) != NULL); key = DUK_HOBJECT_E_GET_KEY(thr->heap, obj, i); if (key == NULL) { continue; } DUK_ASSERT(new_p != NULL && new_e_k != NULL && new_e_pv != NULL && new_e_f != NULL); new_e_k[new_e_next] = key; new_e_pv[new_e_next] = DUK_HOBJECT_E_GET_VALUE(thr->heap, obj, i); new_e_f[new_e_next] = DUK_HOBJECT_E_GET_FLAGS(thr->heap, obj, i); new_e_next++; } /* the entries [new_e_next, new_e_size_adjusted[ are left uninitialized on purpose (ok, not gc reachable) */ /* * Copy array elements to new array part. If the new array part is * larger, initialize the unused entries as UNUSED because they are * GC reachable. */ #if defined(DUK_USE_ASSERTIONS) /* Caller must have decref'd values above new_a_size (if that is necessary). */ if (!abandon_array) { for (i = new_a_size; i < DUK_HOBJECT_GET_ASIZE(obj); i++) { duk_tval *tv; tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, i); DUK_ASSERT(DUK_TVAL_IS_UNUSED(tv)); } } #endif if (new_a_size > DUK_HOBJECT_GET_ASIZE(obj)) { array_copy_size = sizeof(duk_tval) * DUK_HOBJECT_GET_ASIZE(obj); } else { array_copy_size = sizeof(duk_tval) * new_a_size; } if (array_copy_size > 0) { /* Avoid zero copy with an invalid pointer. If obj->p is NULL, * the 'new_a' pointer will be invalid which is not allowed even * when copy size is zero. */ DUK_ASSERT(new_a != NULL); DUK_ASSERT(DUK_HOBJECT_GET_PROPS(thr->heap, obj) != NULL); DUK_ASSERT(DUK_HOBJECT_GET_ASIZE(obj) > 0); DUK_MEMCPY((void *) new_a, (const void *) DUK_HOBJECT_A_GET_BASE(thr->heap, obj), array_copy_size); } for (i = DUK_HOBJECT_GET_ASIZE(obj); i < new_a_size; i++) { duk_tval *tv = &new_a[i]; DUK_TVAL_SET_UNUSED(tv); } /* * Rebuild the hash part always from scratch (guaranteed to finish * as long as caller gave consistent parameters). * * Any resize of hash part requires rehashing. In addition, by rehashing * get rid of any elements marked deleted (DUK__HASH_DELETED) which is critical * to ensuring the hash part never fills up. */ #if defined(DUK_USE_HOBJECT_HASH_PART) if (new_h_size == 0) { DUK_DDD(DUK_DDDPRINT("no hash part, no rehash")); } else { duk_uint32_t mask; DUK_ASSERT(new_h != NULL); /* fill new_h with u32 0xff = UNUSED */ DUK_ASSERT(new_h_size > 0); DUK_MEMSET(new_h, 0xff, sizeof(duk_uint32_t) * new_h_size); DUK_ASSERT(new_e_next <= new_h_size); /* equality not actually possible */ mask = new_h_size - 1; for (i = 0; i < new_e_next; i++) { duk_hstring *key = new_e_k[i]; duk_uint32_t j, step; DUK_ASSERT(key != NULL); j = DUK_HSTRING_GET_HASH(key) & mask; step = 1; /* Cache friendly but clustering prone. */ for (;;) { DUK_ASSERT(new_h[j] != DUK__HASH_DELETED); /* should never happen */ if (new_h[j] == DUK__HASH_UNUSED) { DUK_DDD(DUK_DDDPRINT("rebuild hit %ld -> %ld", (long) j, (long) i)); new_h[j] = (duk_uint32_t) i; break; } DUK_DDD(DUK_DDDPRINT("rebuild miss %ld, step %ld", (long) j, (long) step)); j = (j + step) & mask; /* Guaranteed to finish (hash is larger than #props). */ } } } #endif /* DUK_USE_HOBJECT_HASH_PART */ /* * Nice debug log. */ DUK_DD(DUK_DDPRINT("resized hobject %p props (%ld -> %ld bytes), from {p=%p,e_size=%ld,e_next=%ld,a_size=%ld,h_size=%ld} to " "{p=%p,e_size=%ld,e_next=%ld,a_size=%ld,h_size=%ld}, abandon_array=%ld, unadjusted new_e_size=%ld", (void *) obj, (long) DUK_HOBJECT_P_COMPUTE_SIZE(DUK_HOBJECT_GET_ESIZE(obj), DUK_HOBJECT_GET_ASIZE(obj), DUK_HOBJECT_GET_HSIZE(obj)), (long) new_alloc_size, (void *) DUK_HOBJECT_GET_PROPS(thr->heap, obj), (long) DUK_HOBJECT_GET_ESIZE(obj), (long) DUK_HOBJECT_GET_ENEXT(obj), (long) DUK_HOBJECT_GET_ASIZE(obj), (long) DUK_HOBJECT_GET_HSIZE(obj), (void *) new_p, (long) new_e_size_adjusted, (long) new_e_next, (long) new_a_size, (long) new_h_size, (long) abandon_array, (long) new_e_size)); /* * All done, switch properties ('p') allocation to new one. */ DUK_FREE_CHECKED(thr, DUK_HOBJECT_GET_PROPS(thr->heap, obj)); /* NULL obj->p is OK */ DUK_HOBJECT_SET_PROPS(thr->heap, obj, new_p); DUK_HOBJECT_SET_ESIZE(obj, new_e_size_adjusted); DUK_HOBJECT_SET_ENEXT(obj, new_e_next); DUK_HOBJECT_SET_ASIZE(obj, new_a_size); DUK_HOBJECT_SET_HSIZE(obj, new_h_size); /* Clear array part flag only after switching. */ if (abandon_array) { DUK_HOBJECT_CLEAR_ARRAY_PART(obj); } DUK_DDD(DUK_DDDPRINT("resize result: %!O", (duk_heaphdr *) obj)); DUK_ASSERT(thr->heap->pf_prevent_count > 0); thr->heap->pf_prevent_count--; thr->heap->ms_base_flags = prev_ms_base_flags; #if defined(DUK_USE_ASSERTIONS) DUK_ASSERT(thr->heap->error_not_allowed == 1); thr->heap->error_not_allowed = prev_error_not_allowed; #endif /* * Post resize assertions. */ #if defined(DUK_USE_ASSERTIONS) /* XXX: post-checks (such as no duplicate keys) */ #endif return; /* * Abandon array failed. We don't need to DECREF anything * because the references in the new allocation are not * INCREF'd until abandon is complete. The string interned * keys are on the value stack and are handled normally by * unwind. */ abandon_error: alloc_failed: DUK_D(DUK_DPRINT("object property table resize failed")); DUK_FREE_CHECKED(thr, new_p); /* OK for NULL. */ thr->heap->pf_prevent_count--; thr->heap->ms_base_flags = prev_ms_base_flags; #if defined(DUK_USE_ASSERTIONS) DUK_ASSERT(thr->heap->error_not_allowed == 1); thr->heap->error_not_allowed = prev_error_not_allowed; #endif DUK_ERROR_ALLOC_FAILED(thr); } /* * Helpers to resize properties allocation on specific needs. */ DUK_INTERNAL void duk_hobject_resize_entrypart(duk_hthread *thr, duk_hobject *obj, duk_uint32_t new_e_size) { duk_uint32_t old_e_size; duk_uint32_t new_a_size; duk_uint32_t new_h_size; DUK_ASSERT(thr != NULL); DUK_ASSERT(obj != NULL); old_e_size = DUK_HOBJECT_GET_ESIZE(obj); if (old_e_size > new_e_size) { new_e_size = old_e_size; } #if defined(DUK_USE_HOBJECT_HASH_PART) new_h_size = duk__get_default_h_size(new_e_size); #else new_h_size = 0; #endif new_a_size = DUK_HOBJECT_GET_ASIZE(obj); duk_hobject_realloc_props(thr, obj, new_e_size, new_a_size, new_h_size, 0); } #if 0 /*unused */ DUK_INTERNAL void duk_hobject_resize_arraypart(duk_hthread *thr, duk_hobject *obj, duk_uint32_t new_a_size) { duk_uint32_t old_a_size; duk_uint32_t new_e_size; duk_uint32_t new_h_size; DUK_ASSERT(thr != NULL); DUK_ASSERT(obj != NULL); if (!DUK_HOBJECT_HAS_ARRAY_PART(obj)) { return; } old_a_size = DUK_HOBJECT_GET_ASIZE(obj); if (old_a_size > new_a_size) { new_a_size = old_a_size; } new_e_size = DUK_HOBJECT_GET_ESIZE(obj); new_h_size = DUK_HOBJECT_GET_HSIZE(obj); duk_hobject_realloc_props(thr, obj, new_e_size, new_a_size, new_h_size, 0); } #endif /* Grow entry part allocation for one additional entry. */ DUK_LOCAL void duk__grow_props_for_new_entry_item(duk_hthread *thr, duk_hobject *obj) { duk_uint32_t old_e_used; /* actually used, non-NULL entries */ duk_uint32_t new_e_size; duk_uint32_t new_a_size; duk_uint32_t new_h_size; DUK_ASSERT(thr != NULL); DUK_ASSERT(obj != NULL); /* Duktape 0.11.0 and prior tried to optimize the resize by not * counting the number of actually used keys prior to the resize. * This worked mostly well but also caused weird leak-like behavior * as in: test-bug-object-prop-alloc-unbounded.js. So, now we count * the keys explicitly to compute the new entry part size. */ old_e_used = duk__count_used_e_keys(thr, obj); new_e_size = old_e_used + duk__get_min_grow_e(old_e_used); #if defined(DUK_USE_HOBJECT_HASH_PART) new_h_size = duk__get_default_h_size(new_e_size); #else new_h_size = 0; #endif new_a_size = DUK_HOBJECT_GET_ASIZE(obj); DUK_ASSERT(new_e_size >= old_e_used + 1); /* duk__get_min_grow_e() is always >= 1 */ duk_hobject_realloc_props(thr, obj, new_e_size, new_a_size, new_h_size, 0); } /* Grow array part for a new highest array index. */ DUK_LOCAL void duk__grow_props_for_array_item(duk_hthread *thr, duk_hobject *obj, duk_uint32_t highest_arr_idx) { duk_uint32_t new_e_size; duk_uint32_t new_a_size; duk_uint32_t new_h_size; DUK_ASSERT(thr != NULL); DUK_ASSERT(obj != NULL); DUK_ASSERT(highest_arr_idx >= DUK_HOBJECT_GET_ASIZE(obj)); /* minimum new length is highest_arr_idx + 1 */ new_e_size = DUK_HOBJECT_GET_ESIZE(obj); new_h_size = DUK_HOBJECT_GET_HSIZE(obj); new_a_size = highest_arr_idx + duk__get_min_grow_a(highest_arr_idx); DUK_ASSERT(new_a_size >= highest_arr_idx + 1); /* duk__get_min_grow_a() is always >= 1 */ duk_hobject_realloc_props(thr, obj, new_e_size, new_a_size, new_h_size, 0); } /* Abandon array part, moving array entries into entries part. * This requires a props resize, which is a heavy operation. * We also compact the entries part while we're at it, although * this is not strictly required. */ DUK_LOCAL void duk__abandon_array_checked(duk_hthread *thr, duk_hobject *obj) { duk_uint32_t new_e_size; duk_uint32_t new_a_size; duk_uint32_t new_h_size; duk_uint32_t e_used; /* actually used, non-NULL keys */ duk_uint32_t a_used; duk_uint32_t a_size; DUK_ASSERT(thr != NULL); DUK_ASSERT(obj != NULL); e_used = duk__count_used_e_keys(thr, obj); duk__compute_a_stats(thr, obj, &a_used, &a_size); /* * Must guarantee all actually used array entries will fit into * new entry part. Add one growth step to ensure we don't run out * of space right away. */ new_e_size = e_used + a_used; new_e_size = new_e_size + duk__get_min_grow_e(new_e_size); new_a_size = 0; #if defined(DUK_USE_HOBJECT_HASH_PART) new_h_size = duk__get_default_h_size(new_e_size); #else new_h_size = 0; #endif DUK_DD(DUK_DDPRINT("abandon array part for hobject %p, " "array stats before: e_used=%ld, a_used=%ld, a_size=%ld; " "resize to e_size=%ld, a_size=%ld, h_size=%ld", (void *) obj, (long) e_used, (long) a_used, (long) a_size, (long) new_e_size, (long) new_a_size, (long) new_h_size)); duk_hobject_realloc_props(thr, obj, new_e_size, new_a_size, new_h_size, 1); } /* * Compact an object. Minimizes allocation size for objects which are * not likely to be extended. This is useful for internal and non- * extensible objects, but can also be called for non-extensible objects. * May abandon the array part if it is computed to be too sparse. * * This call is relatively expensive, as it needs to scan both the * entries and the array part. * * The call may fail due to allocation error. */ DUK_INTERNAL void duk_hobject_compact_props(duk_hthread *thr, duk_hobject *obj) { duk_uint32_t e_size; /* currently used -> new size */ duk_uint32_t a_size; /* currently required */ duk_uint32_t a_used; /* actually used */ duk_uint32_t h_size; duk_bool_t abandon_array; DUK_ASSERT(thr != NULL); DUK_ASSERT(obj != NULL); #if defined(DUK_USE_ROM_OBJECTS) if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)) { DUK_DD(DUK_DDPRINT("ignore attempt to compact a rom object")); return; } #endif e_size = duk__count_used_e_keys(thr, obj); duk__compute_a_stats(thr, obj, &a_used, &a_size); DUK_DD(DUK_DDPRINT("compacting hobject, used e keys %ld, used a keys %ld, min a size %ld, " "resized array density would be: %ld/%ld = %lf", (long) e_size, (long) a_used, (long) a_size, (long) a_used, (long) a_size, (double) a_used / (double) a_size)); if (duk__abandon_array_density_check(a_used, a_size)) { DUK_DD(DUK_DDPRINT("decided to abandon array during compaction, a_used=%ld, a_size=%ld", (long) a_used, (long) a_size)); abandon_array = 1; e_size += a_used; a_size = 0; } else { DUK_DD(DUK_DDPRINT("decided to keep array during compaction")); abandon_array = 0; } #if defined(DUK_USE_HOBJECT_HASH_PART) if (e_size >= DUK_USE_HOBJECT_HASH_PROP_LIMIT) { h_size = duk__get_default_h_size(e_size); } else { h_size = 0; } #else h_size = 0; #endif DUK_DD(DUK_DDPRINT("compacting hobject -> new e_size %ld, new a_size=%ld, new h_size=%ld, abandon_array=%ld", (long) e_size, (long) a_size, (long) h_size, (long) abandon_array)); duk_hobject_realloc_props(thr, obj, e_size, a_size, h_size, abandon_array); } /* * Find an existing key from entry part either by linear scan or by * using the hash index (if it exists). * * Sets entry index (and possibly the hash index) to output variables, * which allows the caller to update the entry and hash entries in-place. * If entry is not found, both values are set to -1. If entry is found * but there is no hash part, h_idx is set to -1. */ DUK_INTERNAL duk_bool_t duk_hobject_find_existing_entry(duk_heap *heap, duk_hobject *obj, duk_hstring *key, duk_int_t *e_idx, duk_int_t *h_idx) { DUK_ASSERT(obj != NULL); DUK_ASSERT(key != NULL); DUK_ASSERT(e_idx != NULL); DUK_ASSERT(h_idx != NULL); DUK_UNREF(heap); if (DUK_LIKELY(DUK_HOBJECT_GET_HSIZE(obj) == 0)) { /* Linear scan: more likely because most objects are small. * This is an important fast path. * * XXX: this might be worth inlining for property lookups. */ duk_uint_fast32_t i; duk_uint_fast32_t n; duk_hstring **h_keys_base; DUK_DDD(DUK_DDDPRINT("duk_hobject_find_existing_entry() using linear scan for lookup")); h_keys_base = DUK_HOBJECT_E_GET_KEY_BASE(heap, obj); n = DUK_HOBJECT_GET_ENEXT(obj); for (i = 0; i < n; i++) { if (h_keys_base[i] == key) { *e_idx = (duk_int_t) i; *h_idx = -1; return 1; } } } #if defined(DUK_USE_HOBJECT_HASH_PART) else { /* hash lookup */ duk_uint32_t n; duk_uint32_t i, step; duk_uint32_t *h_base; duk_uint32_t mask; DUK_DDD(DUK_DDDPRINT("duk_hobject_find_existing_entry() using hash part for lookup")); h_base = DUK_HOBJECT_H_GET_BASE(heap, obj); n = DUK_HOBJECT_GET_HSIZE(obj); mask = n - 1; i = DUK_HSTRING_GET_HASH(key) & mask; step = 1; /* Cache friendly but clustering prone. */ for (;;) { duk_uint32_t t; DUK_ASSERT_DISABLE(i >= 0); /* unsigned */ DUK_ASSERT(i < DUK_HOBJECT_GET_HSIZE(obj)); t = h_base[i]; DUK_ASSERT(t == DUK__HASH_UNUSED || t == DUK__HASH_DELETED || (t < DUK_HOBJECT_GET_ESIZE(obj))); /* t >= 0 always true, unsigned */ if (t == DUK__HASH_UNUSED) { break; } else if (t == DUK__HASH_DELETED) { DUK_DDD(DUK_DDDPRINT("lookup miss (deleted) i=%ld, t=%ld", (long) i, (long) t)); } else { DUK_ASSERT(t < DUK_HOBJECT_GET_ESIZE(obj)); if (DUK_HOBJECT_E_GET_KEY(heap, obj, t) == key) { DUK_DDD(DUK_DDDPRINT("lookup hit i=%ld, t=%ld -> key %p", (long) i, (long) t, (void *) key)); *e_idx = (duk_int_t) t; *h_idx = (duk_int_t) i; return 1; } DUK_DDD(DUK_DDDPRINT("lookup miss i=%ld, t=%ld", (long) i, (long) t)); } i = (i + step) & mask; /* Guaranteed to finish (hash is larger than #props). */ } } #endif /* DUK_USE_HOBJECT_HASH_PART */ /* Not found, leave e_idx and h_idx unset. */ return 0; } /* For internal use: get non-accessor entry value */ DUK_INTERNAL duk_tval *duk_hobject_find_existing_entry_tval_ptr(duk_heap *heap, duk_hobject *obj, duk_hstring *key) { duk_int_t e_idx; duk_int_t h_idx; DUK_ASSERT(obj != NULL); DUK_ASSERT(key != NULL); DUK_UNREF(heap); if (duk_hobject_find_existing_entry(heap, obj, key, &e_idx, &h_idx)) { DUK_ASSERT(e_idx >= 0); if (!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(heap, obj, e_idx)) { return DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(heap, obj, e_idx); } } return NULL; } /* For internal use: get non-accessor entry value and attributes */ DUK_INTERNAL duk_tval *duk_hobject_find_existing_entry_tval_ptr_and_attrs(duk_heap *heap, duk_hobject *obj, duk_hstring *key, duk_uint_t *out_attrs) { duk_int_t e_idx; duk_int_t h_idx; DUK_ASSERT(obj != NULL); DUK_ASSERT(key != NULL); DUK_ASSERT(out_attrs != NULL); DUK_UNREF(heap); if (duk_hobject_find_existing_entry(heap, obj, key, &e_idx, &h_idx)) { DUK_ASSERT(e_idx >= 0); if (!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(heap, obj, e_idx)) { *out_attrs = DUK_HOBJECT_E_GET_FLAGS(heap, obj, e_idx); return DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(heap, obj, e_idx); } } /* If not found, out_attrs is left unset. */ return NULL; } /* For internal use: get array part value */ DUK_INTERNAL duk_tval *duk_hobject_find_existing_array_entry_tval_ptr(duk_heap *heap, duk_hobject *obj, duk_uarridx_t i) { duk_tval *tv; DUK_ASSERT(obj != NULL); DUK_UNREF(heap); if (!DUK_HOBJECT_HAS_ARRAY_PART(obj)) { return NULL; } if (i >= DUK_HOBJECT_GET_ASIZE(obj)) { return NULL; } tv = DUK_HOBJECT_A_GET_VALUE_PTR(heap, obj, i); return tv; } /* * Allocate and initialize a new entry, resizing the properties allocation * if necessary. Returns entry index (e_idx) or throws an error if alloc fails. * * Sets the key of the entry (increasing the key's refcount), and updates * the hash part if it exists. Caller must set value and flags, and update * the entry value refcount. A decref for the previous value is not necessary. */ DUK_LOCAL duk_int_t duk__hobject_alloc_entry_checked(duk_hthread *thr, duk_hobject *obj, duk_hstring *key) { duk_uint32_t idx; DUK_ASSERT(thr != NULL); DUK_ASSERT(obj != NULL); DUK_ASSERT(key != NULL); DUK_ASSERT(DUK_HOBJECT_GET_ENEXT(obj) <= DUK_HOBJECT_GET_ESIZE(obj)); #if defined(DUK_USE_ASSERTIONS) /* key must not already exist in entry part */ { duk_uint_fast32_t i; for (i = 0; i < DUK_HOBJECT_GET_ENEXT(obj); i++) { DUK_ASSERT(DUK_HOBJECT_E_GET_KEY(thr->heap, obj, i) != key); } } #endif if (DUK_HOBJECT_GET_ENEXT(obj) >= DUK_HOBJECT_GET_ESIZE(obj)) { /* only need to guarantee 1 more slot, but allocation growth is in chunks */ DUK_DDD(DUK_DDDPRINT("entry part full, allocate space for one more entry")); duk__grow_props_for_new_entry_item(thr, obj); } DUK_ASSERT(DUK_HOBJECT_GET_ENEXT(obj) < DUK_HOBJECT_GET_ESIZE(obj)); idx = DUK_HOBJECT_POSTINC_ENEXT(obj); /* previous value is assumed to be garbage, so don't touch it */ DUK_HOBJECT_E_SET_KEY(thr->heap, obj, idx, key); DUK_HSTRING_INCREF(thr, key); #if defined(DUK_USE_HOBJECT_HASH_PART) if (DUK_UNLIKELY(DUK_HOBJECT_GET_HSIZE(obj) > 0)) { duk_uint32_t n, mask; duk_uint32_t i, step; duk_uint32_t *h_base = DUK_HOBJECT_H_GET_BASE(thr->heap, obj); n = DUK_HOBJECT_GET_HSIZE(obj); mask = n - 1; i = DUK_HSTRING_GET_HASH(key) & mask; step = 1; /* Cache friendly but clustering prone. */ for (;;) { duk_uint32_t t = h_base[i]; if (t == DUK__HASH_UNUSED || t == DUK__HASH_DELETED) { DUK_DDD(DUK_DDDPRINT("duk__hobject_alloc_entry_checked() inserted key into hash part, %ld -> %ld", (long) i, (long) idx)); DUK_ASSERT_DISABLE(i >= 0); /* unsigned */ DUK_ASSERT(i < DUK_HOBJECT_GET_HSIZE(obj)); DUK_ASSERT_DISABLE(idx >= 0); DUK_ASSERT(idx < DUK_HOBJECT_GET_ESIZE(obj)); h_base[i] = idx; break; } DUK_DDD(DUK_DDDPRINT("duk__hobject_alloc_entry_checked() miss %ld", (long) i)); i = (i + step) & mask; /* Guaranteed to finish (hash is larger than #props). */ } } #endif /* DUK_USE_HOBJECT_HASH_PART */ /* Note: we could return the hash index here too, but it's not * needed right now. */ DUK_ASSERT_DISABLE(idx >= 0); DUK_ASSERT(idx < DUK_HOBJECT_GET_ESIZE(obj)); DUK_ASSERT(idx < DUK_HOBJECT_GET_ENEXT(obj)); return (duk_int_t) idx; } /* * Object internal value * * Returned value is guaranteed to be reachable / incref'd, caller does not need * to incref OR decref. No proxies or accessors are invoked, no prototype walk. */ DUK_INTERNAL duk_bool_t duk_hobject_get_internal_value(duk_heap *heap, duk_hobject *obj, duk_tval *tv_out) { duk_int_t e_idx; duk_int_t h_idx; DUK_ASSERT(heap != NULL); DUK_ASSERT(obj != NULL); DUK_ASSERT(tv_out != NULL); /* Always in entry part, no need to look up parents etc. */ if (duk_hobject_find_existing_entry(heap, obj, DUK_HEAP_STRING_INT_VALUE(heap), &e_idx, &h_idx)) { DUK_ASSERT(e_idx >= 0); DUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(heap, obj, e_idx)); DUK_TVAL_SET_TVAL(tv_out, DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(heap, obj, e_idx)); return 1; } DUK_TVAL_SET_UNDEFINED(tv_out); return 0; } DUK_INTERNAL duk_hstring *duk_hobject_get_internal_value_string(duk_heap *heap, duk_hobject *obj) { duk_tval tv; DUK_ASSERT(heap != NULL); DUK_ASSERT(obj != NULL); /* This is not strictly necessary, but avoids compiler warnings; e.g. * gcc won't reliably detect that no uninitialized data is read below. */ DUK_MEMZERO((void *) &tv, sizeof(duk_tval)); if (duk_hobject_get_internal_value(heap, obj, &tv)) { duk_hstring *h; DUK_ASSERT(DUK_TVAL_IS_STRING(&tv)); h = DUK_TVAL_GET_STRING(&tv); /* No explicit check for string vs. symbol, accept both. */ return h; } return NULL; } /* * Arguments handling helpers (argument map mainly). * * An arguments object has exotic behavior for some numeric indices. * Accesses may translate to identifier operations which may have * arbitrary side effects (potentially invalidating any duk_tval * pointers). */ /* Lookup 'key' from arguments internal 'map', perform a variable lookup * if mapped, and leave the result on top of stack (and return non-zero). * Used in E5 Section 10.6 algorithms [[Get]] and [[GetOwnProperty]]. */ DUK_LOCAL duk_bool_t duk__lookup_arguments_map(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc, duk_hobject **out_map, duk_hobject **out_varenv) { duk_hobject *map; duk_hobject *varenv; duk_bool_t rc; DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); DUK_DDD(DUK_DDDPRINT("arguments map lookup: thr=%p, obj=%p, key=%p, temp_desc=%p " "(obj -> %!O, key -> %!O)", (void *) thr, (void *) obj, (void *) key, (void *) temp_desc, (duk_heaphdr *) obj, (duk_heaphdr *) key)); if (!duk_hobject_get_own_propdesc(thr, obj, DUK_HTHREAD_STRING_INT_MAP(thr), temp_desc, DUK_GETDESC_FLAG_PUSH_VALUE)) { DUK_DDD(DUK_DDDPRINT("-> no 'map'")); return 0; } map = duk_require_hobject(thr, -1); DUK_ASSERT(map != NULL); duk_pop_unsafe(thr); /* map is reachable through obj */ if (!duk_hobject_get_own_propdesc(thr, map, key, temp_desc, DUK_GETDESC_FLAG_PUSH_VALUE)) { DUK_DDD(DUK_DDDPRINT("-> 'map' exists, but key not in map")); return 0; } /* [... varname] */ DUK_DDD(DUK_DDDPRINT("-> 'map' exists, and contains key, key is mapped to argument/variable binding %!T", (duk_tval *) duk_get_tval(thr, -1))); DUK_ASSERT(duk_is_string(thr, -1)); /* guaranteed when building arguments */ /* get varenv for varname (callee's declarative lexical environment) */ rc = duk_hobject_get_own_propdesc(thr, obj, DUK_HTHREAD_STRING_INT_VARENV(thr), temp_desc, DUK_GETDESC_FLAG_PUSH_VALUE); DUK_UNREF(rc); DUK_ASSERT(rc != 0); /* arguments MUST have an initialized lexical environment reference */ varenv = duk_require_hobject(thr, -1); DUK_ASSERT(varenv != NULL); duk_pop_unsafe(thr); /* varenv remains reachable through 'obj' */ DUK_DDD(DUK_DDDPRINT("arguments varenv is: %!dO", (duk_heaphdr *) varenv)); /* success: leave varname in stack */ *out_map = map; *out_varenv = varenv; return 1; /* [... varname] */ } /* Lookup 'key' from arguments internal 'map', and leave replacement value * on stack top if mapped (and return non-zero). * Used in E5 Section 10.6 algorithm for [[GetOwnProperty]] (used by [[Get]]). */ DUK_LOCAL duk_bool_t duk__check_arguments_map_for_get(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc) { duk_hobject *map; duk_hobject *varenv; duk_hstring *varname; DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); if (!duk__lookup_arguments_map(thr, obj, key, temp_desc, &map, &varenv)) { DUK_DDD(DUK_DDDPRINT("arguments: key not mapped, no exotic get behavior")); return 0; } /* [... varname] */ varname = duk_require_hstring(thr, -1); DUK_ASSERT(varname != NULL); duk_pop_unsafe(thr); /* varname is still reachable */ DUK_DDD(DUK_DDDPRINT("arguments object automatic getvar for a bound variable; " "key=%!O, varname=%!O", (duk_heaphdr *) key, (duk_heaphdr *) varname)); (void) duk_js_getvar_envrec(thr, varenv, varname, 1 /*throw*/); /* [... value this_binding] */ duk_pop_unsafe(thr); /* leave result on stack top */ return 1; } /* Lookup 'key' from arguments internal 'map', perform a variable write if mapped. * Used in E5 Section 10.6 algorithm for [[DefineOwnProperty]] (used by [[Put]]). * Assumes stack top contains 'put' value (which is NOT popped). */ DUK_LOCAL void duk__check_arguments_map_for_put(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc, duk_bool_t throw_flag) { duk_hobject *map; duk_hobject *varenv; duk_hstring *varname; DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); if (!duk__lookup_arguments_map(thr, obj, key, temp_desc, &map, &varenv)) { DUK_DDD(DUK_DDDPRINT("arguments: key not mapped, no exotic put behavior")); return; } /* [... put_value varname] */ varname = duk_require_hstring(thr, -1); DUK_ASSERT(varname != NULL); duk_pop_unsafe(thr); /* varname is still reachable */ DUK_DDD(DUK_DDDPRINT("arguments object automatic putvar for a bound variable; " "key=%!O, varname=%!O, value=%!T", (duk_heaphdr *) key, (duk_heaphdr *) varname, (duk_tval *) duk_require_tval(thr, -1))); /* [... put_value] */ /* * Note: although arguments object variable mappings are only established * for non-strict functions (and a call to a non-strict function created * the arguments object in question), an inner strict function may be doing * the actual property write. Hence the throw_flag applied here comes from * the property write call. */ duk_js_putvar_envrec(thr, varenv, varname, duk_require_tval(thr, -1), throw_flag); /* [... put_value] */ } /* Lookup 'key' from arguments internal 'map', delete mapping if found. * Used in E5 Section 10.6 algorithm for [[Delete]]. Note that the * variable/argument itself (where the map points) is not deleted. */ DUK_LOCAL void duk__check_arguments_map_for_delete(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc) { duk_hobject *map; DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); if (!duk_hobject_get_own_propdesc(thr, obj, DUK_HTHREAD_STRING_INT_MAP(thr), temp_desc, DUK_GETDESC_FLAG_PUSH_VALUE)) { DUK_DDD(DUK_DDDPRINT("arguments: key not mapped, no exotic delete behavior")); return; } map = duk_require_hobject(thr, -1); DUK_ASSERT(map != NULL); duk_pop_unsafe(thr); /* map is reachable through obj */ DUK_DDD(DUK_DDDPRINT("-> have 'map', delete key %!O from map (if exists)); ignore result", (duk_heaphdr *) key)); /* Note: no recursion issue, we can trust 'map' to behave */ DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_BEHAVIOR(map)); DUK_DDD(DUK_DDDPRINT("map before deletion: %!O", (duk_heaphdr *) map)); (void) duk_hobject_delprop_raw(thr, map, key, 0); /* ignore result */ DUK_DDD(DUK_DDDPRINT("map after deletion: %!O", (duk_heaphdr *) map)); } /* * Ecmascript compliant [[GetOwnProperty]](P), for internal use only. * * If property is found: * - Fills descriptor fields to 'out_desc' * - If DUK_GETDESC_FLAG_PUSH_VALUE is set, pushes a value related to the * property onto the stack ('undefined' for accessor properties). * - Returns non-zero * * If property is not found: * - 'out_desc' is left in untouched state (possibly garbage) * - Nothing is pushed onto the stack (not even with DUK_GETDESC_FLAG_PUSH_VALUE * set) * - Returns zero * * Notes: * * - Getting a property descriptor may cause an allocation (and hence * GC) to take place, hence reachability and refcount of all related * values matter. Reallocation of value stack, properties, etc may * invalidate many duk_tval pointers (concretely, those which reside * in memory areas subject to reallocation). However, heap object * pointers are never affected (heap objects have stable pointers). * * - The value of a plain property is always reachable and has a non-zero * reference count. * * - The value of a virtual property is not necessarily reachable from * elsewhere and may have a refcount of zero. Hence we push it onto * the valstack for the caller, which ensures it remains reachable * while it is needed. * * - There are no virtual accessor properties. Hence, all getters and * setters are always related to concretely stored properties, which * ensures that the get/set functions in the resulting descriptor are * reachable and have non-zero refcounts. Should there be virtual * accessor properties later, this would need to change. */ DUK_LOCAL duk_bool_t duk__get_own_propdesc_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_uint32_t arr_idx, duk_propdesc *out_desc, duk_small_uint_t flags) { duk_tval *tv; DUK_DDD(DUK_DDDPRINT("duk_hobject_get_own_propdesc: thr=%p, obj=%p, key=%p, out_desc=%p, flags=%lx, " "arr_idx=%ld (obj -> %!O, key -> %!O)", (void *) thr, (void *) obj, (void *) key, (void *) out_desc, (long) flags, (long) arr_idx, (duk_heaphdr *) obj, (duk_heaphdr *) key)); DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->heap != NULL); DUK_ASSERT(obj != NULL); DUK_ASSERT(key != NULL); DUK_ASSERT(out_desc != NULL); DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); DUK_STATS_INC(thr->heap, stats_getownpropdesc_count); /* Each code path returning 1 (= found) must fill in all the output * descriptor fields. We don't do it beforehand because it'd be * unnecessary work if the property isn't found and would happen * multiple times for an inheritance chain. */ DUK_ASSERT_SET_GARBAGE(out_desc, sizeof(*out_desc)); #if 0 out_desc->flags = 0; out_desc->get = NULL; out_desc->set = NULL; out_desc->e_idx = -1; out_desc->h_idx = -1; out_desc->a_idx = -1; #endif /* * Try entries part first because it's the common case. * * Array part lookups are usually handled by the array fast path, and * are not usually inherited. Array and entry parts never contain the * same keys so the entry part vs. array part order doesn't matter. */ if (duk_hobject_find_existing_entry(thr->heap, obj, key, &out_desc->e_idx, &out_desc->h_idx)) { duk_int_t e_idx = out_desc->e_idx; DUK_ASSERT(out_desc->e_idx >= 0); out_desc->a_idx = -1; out_desc->flags = DUK_HOBJECT_E_GET_FLAGS(thr->heap, obj, e_idx); out_desc->get = NULL; out_desc->set = NULL; if (DUK_UNLIKELY(out_desc->flags & DUK_PROPDESC_FLAG_ACCESSOR)) { DUK_DDD(DUK_DDDPRINT("-> found accessor property in entry part")); out_desc->get = DUK_HOBJECT_E_GET_VALUE_GETTER(thr->heap, obj, e_idx); out_desc->set = DUK_HOBJECT_E_GET_VALUE_SETTER(thr->heap, obj, e_idx); if (flags & DUK_GETDESC_FLAG_PUSH_VALUE) { /* a dummy undefined value is pushed to make valstack * behavior uniform for caller */ duk_push_undefined(thr); } } else { DUK_DDD(DUK_DDDPRINT("-> found plain property in entry part")); tv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, e_idx); if (flags & DUK_GETDESC_FLAG_PUSH_VALUE) { duk_push_tval(thr, tv); } } goto prop_found; } /* * Try array part. */ if (DUK_HOBJECT_HAS_ARRAY_PART(obj) && arr_idx != DUK__NO_ARRAY_INDEX) { if (arr_idx < DUK_HOBJECT_GET_ASIZE(obj)) { tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, arr_idx); if (!DUK_TVAL_IS_UNUSED(tv)) { DUK_DDD(DUK_DDDPRINT("-> found in array part")); if (flags & DUK_GETDESC_FLAG_PUSH_VALUE) { duk_push_tval(thr, tv); } /* implicit attributes */ out_desc->flags = DUK_PROPDESC_FLAG_WRITABLE | DUK_PROPDESC_FLAG_CONFIGURABLE | DUK_PROPDESC_FLAG_ENUMERABLE; out_desc->get = NULL; out_desc->set = NULL; out_desc->e_idx = -1; out_desc->h_idx = -1; out_desc->a_idx = (duk_int_t) arr_idx; /* XXX: limit 2G due to being signed */ goto prop_found; } } } DUK_DDD(DUK_DDDPRINT("-> not found as a concrete property")); /* * Not found as a concrete property, check for virtual properties. */ if (!DUK_HOBJECT_HAS_VIRTUAL_PROPERTIES(obj)) { /* Quick skip. */ goto prop_not_found; } if (DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)) { duk_harray *a; DUK_DDD(DUK_DDDPRINT("array object exotic property get for key: %!O, arr_idx: %ld", (duk_heaphdr *) key, (long) arr_idx)); a = (duk_harray *) obj; DUK_ASSERT_HARRAY_VALID(a); if (key == DUK_HTHREAD_STRING_LENGTH(thr)) { DUK_DDD(DUK_DDDPRINT("-> found, key is 'length', length exotic behavior")); if (flags & DUK_GETDESC_FLAG_PUSH_VALUE) { duk_push_uint(thr, (duk_uint_t) a->length); } out_desc->flags = DUK_PROPDESC_FLAG_VIRTUAL; if (DUK_HARRAY_LENGTH_WRITABLE(a)) { out_desc->flags |= DUK_PROPDESC_FLAG_WRITABLE; } out_desc->get = NULL; out_desc->set = NULL; out_desc->e_idx = -1; out_desc->h_idx = -1; out_desc->a_idx = -1; DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj)); goto prop_found_noexotic; /* cannot be arguments exotic */ } } else if (DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(obj)) { DUK_DDD(DUK_DDDPRINT("string object exotic property get for key: %!O, arr_idx: %ld", (duk_heaphdr *) key, (long) arr_idx)); /* XXX: charlen; avoid multiple lookups? */ if (arr_idx != DUK__NO_ARRAY_INDEX) { duk_hstring *h_val; DUK_DDD(DUK_DDDPRINT("array index exists")); h_val = duk_hobject_get_internal_value_string(thr->heap, obj); DUK_ASSERT(h_val); if (arr_idx < DUK_HSTRING_GET_CHARLEN(h_val)) { DUK_DDD(DUK_DDDPRINT("-> found, array index inside string")); if (flags & DUK_GETDESC_FLAG_PUSH_VALUE) { duk_push_hstring(thr, h_val); duk_substring(thr, -1, arr_idx, arr_idx + 1); /* [str] -> [substr] */ } out_desc->flags = DUK_PROPDESC_FLAG_ENUMERABLE | /* E5 Section 15.5.5.2 */ DUK_PROPDESC_FLAG_VIRTUAL; out_desc->get = NULL; out_desc->set = NULL; out_desc->e_idx = -1; out_desc->h_idx = -1; out_desc->a_idx = -1; DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj)); goto prop_found_noexotic; /* cannot be arguments exotic */ } else { /* index is above internal string length -> property is fully normal */ DUK_DDD(DUK_DDDPRINT("array index outside string -> normal property")); } } else if (key == DUK_HTHREAD_STRING_LENGTH(thr)) { duk_hstring *h_val; DUK_DDD(DUK_DDDPRINT("-> found, key is 'length', length exotic behavior")); h_val = duk_hobject_get_internal_value_string(thr->heap, obj); DUK_ASSERT(h_val != NULL); if (flags & DUK_GETDESC_FLAG_PUSH_VALUE) { duk_push_uint(thr, (duk_uint_t) DUK_HSTRING_GET_CHARLEN(h_val)); } out_desc->flags = DUK_PROPDESC_FLAG_VIRTUAL; /* E5 Section 15.5.5.1 */ out_desc->get = NULL; out_desc->set = NULL; out_desc->e_idx = -1; out_desc->h_idx = -1; out_desc->a_idx = -1; DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj)); goto prop_found_noexotic; /* cannot be arguments exotic */ } } #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) else if (DUK_HOBJECT_IS_BUFOBJ(obj)) { duk_hbufobj *h_bufobj; duk_uint_t byte_off; duk_small_uint_t elem_size; h_bufobj = (duk_hbufobj *) obj; DUK_ASSERT_HBUFOBJ_VALID(h_bufobj); DUK_DDD(DUK_DDDPRINT("bufobj property get for key: %!O, arr_idx: %ld", (duk_heaphdr *) key, (long) arr_idx)); if (arr_idx != DUK__NO_ARRAY_INDEX && DUK_HBUFOBJ_HAS_VIRTUAL_INDICES(h_bufobj)) { DUK_DDD(DUK_DDDPRINT("array index exists")); /* Careful with wrapping: arr_idx upshift may easily wrap, whereas * length downshift won't. */ if (arr_idx < (h_bufobj->length >> h_bufobj->shift)) { byte_off = arr_idx << h_bufobj->shift; /* no wrap assuming h_bufobj->length is valid */ elem_size = (duk_small_uint_t) (1U << h_bufobj->shift); if (flags & DUK_GETDESC_FLAG_PUSH_VALUE) { duk_uint8_t *data; if (h_bufobj->buf != NULL && DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_bufobj, byte_off + elem_size)) { data = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufobj->buf) + h_bufobj->offset + byte_off; duk_hbufobj_push_validated_read(thr, h_bufobj, data, elem_size); } else { DUK_D(DUK_DPRINT("bufobj access out of underlying buffer, ignoring (read zero)")); duk_push_uint(thr, 0); } } out_desc->flags = DUK_PROPDESC_FLAG_WRITABLE | DUK_PROPDESC_FLAG_VIRTUAL; if (DUK_HOBJECT_GET_CLASS_NUMBER(obj) != DUK_HOBJECT_CLASS_ARRAYBUFFER) { /* ArrayBuffer indices are non-standard and are * non-enumerable to avoid their serialization. */ out_desc->flags |= DUK_PROPDESC_FLAG_ENUMERABLE; } out_desc->get = NULL; out_desc->set = NULL; out_desc->e_idx = -1; out_desc->h_idx = -1; out_desc->a_idx = -1; DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj)); goto prop_found_noexotic; /* cannot be e.g. arguments exotic, since exotic 'traits' are mutually exclusive */ } else { /* index is above internal buffer length -> property is fully normal */ DUK_DDD(DUK_DDDPRINT("array index outside buffer -> normal property")); } } else if (key == DUK_HTHREAD_STRING_LENGTH(thr) && DUK_HBUFOBJ_HAS_VIRTUAL_INDICES(h_bufobj)) { DUK_DDD(DUK_DDDPRINT("-> found, key is 'length', length exotic behavior")); if (flags & DUK_GETDESC_FLAG_PUSH_VALUE) { /* Length in elements: take into account shift, but * intentionally don't check the underlying buffer here. */ duk_push_uint(thr, h_bufobj->length >> h_bufobj->shift); } out_desc->flags = DUK_PROPDESC_FLAG_VIRTUAL; out_desc->get = NULL; out_desc->set = NULL; out_desc->e_idx = -1; out_desc->h_idx = -1; out_desc->a_idx = -1; DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj)); goto prop_found_noexotic; /* cannot be arguments exotic */ } } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ /* Array properties have exotic behavior but they are concrete, * so no special handling here. * * Arguments exotic behavior (E5 Section 10.6, [[GetOwnProperty]] * is only relevant as a post-check implemented below; hence no * check here. */ /* * Not found as concrete or virtual. */ prop_not_found: DUK_DDD(DUK_DDDPRINT("-> not found (virtual, entry part, or array part)")); DUK_STATS_INC(thr->heap, stats_getownpropdesc_miss); return 0; /* * Found. * * Arguments object has exotic post-processing, see E5 Section 10.6, * description of [[GetOwnProperty]] variant for arguments. */ prop_found: DUK_DDD(DUK_DDDPRINT("-> property found, checking for arguments exotic post-behavior")); /* Notes: * - Only numbered indices are relevant, so arr_idx fast reject is good * (this is valid unless there are more than 4**32-1 arguments). * - Since variable lookup has no side effects, this can be skipped if * DUK_GETDESC_FLAG_PUSH_VALUE is not set. */ if (DUK_UNLIKELY(DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj) && arr_idx != DUK__NO_ARRAY_INDEX && (flags & DUK_GETDESC_FLAG_PUSH_VALUE))) { duk_propdesc temp_desc; /* Magically bound variable cannot be an accessor. However, * there may be an accessor property (or a plain property) in * place with magic behavior removed. This happens e.g. when * a magic property is redefined with defineProperty(). * Cannot assert for "not accessor" here. */ /* replaces top of stack with new value if necessary */ DUK_ASSERT((flags & DUK_GETDESC_FLAG_PUSH_VALUE) != 0); /* This can perform a variable lookup but only into a declarative * environment which has no side effects. */ if (duk__check_arguments_map_for_get(thr, obj, key, &temp_desc)) { DUK_DDD(DUK_DDDPRINT("-> arguments exotic behavior overrides result: %!T -> %!T", (duk_tval *) duk_get_tval(thr, -2), (duk_tval *) duk_get_tval(thr, -1))); /* [... old_result result] -> [... result] */ duk_remove_m2(thr); } } prop_found_noexotic: DUK_STATS_INC(thr->heap, stats_getownpropdesc_hit); return 1; } DUK_INTERNAL duk_bool_t duk_hobject_get_own_propdesc(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *out_desc, duk_small_uint_t flags) { DUK_ASSERT(thr != NULL); DUK_ASSERT(obj != NULL); DUK_ASSERT(key != NULL); DUK_ASSERT(out_desc != NULL); DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); return duk__get_own_propdesc_raw(thr, obj, key, DUK_HSTRING_GET_ARRIDX_SLOW(key), out_desc, flags); } /* * Ecmascript compliant [[GetProperty]](P), for internal use only. * * If property is found: * - Fills descriptor fields to 'out_desc' * - If DUK_GETDESC_FLAG_PUSH_VALUE is set, pushes a value related to the * property onto the stack ('undefined' for accessor properties). * - Returns non-zero * * If property is not found: * - 'out_desc' is left in untouched state (possibly garbage) * - Nothing is pushed onto the stack (not even with DUK_GETDESC_FLAG_PUSH_VALUE * set) * - Returns zero * * May cause arbitrary side effects and invalidate (most) duk_tval * pointers. */ DUK_LOCAL duk_bool_t duk__get_propdesc(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *out_desc, duk_small_uint_t flags) { duk_hobject *curr; duk_uint32_t arr_idx; duk_uint_t sanity; DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->heap != NULL); DUK_ASSERT(obj != NULL); DUK_ASSERT(key != NULL); DUK_ASSERT(out_desc != NULL); DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); DUK_STATS_INC(thr->heap, stats_getpropdesc_count); arr_idx = DUK_HSTRING_GET_ARRIDX_FAST(key); DUK_DDD(DUK_DDDPRINT("duk__get_propdesc: thr=%p, obj=%p, key=%p, out_desc=%p, flags=%lx, " "arr_idx=%ld (obj -> %!O, key -> %!O)", (void *) thr, (void *) obj, (void *) key, (void *) out_desc, (long) flags, (long) arr_idx, (duk_heaphdr *) obj, (duk_heaphdr *) key)); curr = obj; DUK_ASSERT(curr != NULL); sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY; do { if (duk__get_own_propdesc_raw(thr, curr, key, arr_idx, out_desc, flags)) { /* stack contains value (if requested), 'out_desc' is set */ DUK_STATS_INC(thr->heap, stats_getpropdesc_hit); return 1; } /* not found in 'curr', next in prototype chain; impose max depth */ if (DUK_UNLIKELY(sanity-- == 0)) { if (flags & DUK_GETDESC_FLAG_IGNORE_PROTOLOOP) { /* treat like property not found */ break; } else { DUK_ERROR_RANGE(thr, DUK_STR_PROTOTYPE_CHAIN_LIMIT); } } curr = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, curr); } while (curr != NULL); /* out_desc is left untouched (possibly garbage), caller must use return * value to determine whether out_desc can be looked up */ DUK_STATS_INC(thr->heap, stats_getpropdesc_miss); return 0; } /* * Shallow fast path checks for accessing array elements with numeric * indices. The goal is to try to avoid coercing an array index to an * (interned) string for the most common lookups, in particular, for * standard Array objects. * * Interning is avoided but only for a very narrow set of cases: * - Object has array part, index is within array allocation, and * value is not unused (= key exists) * - Object has no interfering exotic behavior (e.g. arguments or * string object exotic behaviors interfere, array exotic * behavior does not). * * Current shortcoming: if key does not exist (even if it is within * the array allocation range) a slow path lookup with interning is * always required. This can probably be fixed so that there is a * quick fast path for non-existent elements as well, at least for * standard Array objects. */ #if defined(DUK_USE_ARRAY_PROP_FASTPATH) DUK_LOCAL duk_tval *duk__getprop_shallow_fastpath_array_tval(duk_hthread *thr, duk_hobject *obj, duk_tval *tv_key) { duk_tval *tv; duk_uint32_t idx; DUK_UNREF(thr); if (!(DUK_HOBJECT_HAS_ARRAY_PART(obj) && !DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj) && !DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(obj) && !DUK_HOBJECT_IS_BUFOBJ(obj) && !DUK_HOBJECT_IS_PROXY(obj))) { /* Must have array part and no conflicting exotic behaviors. * Doesn't need to have array special behavior, e.g. Arguments * object has array part. */ return NULL; } /* Arrays never have other exotic behaviors. */ DUK_DDD(DUK_DDDPRINT("fast path attempt (no exotic string/arguments/buffer " "behavior, object has array part)")); #if defined(DUK_USE_FASTINT) if (DUK_TVAL_IS_FASTINT(tv_key)) { idx = duk__tval_fastint_to_arr_idx(tv_key); } else #endif if (DUK_TVAL_IS_DOUBLE(tv_key)) { idx = duk__tval_number_to_arr_idx(tv_key); } else { DUK_DDD(DUK_DDDPRINT("key is not a number")); return NULL; } /* If index is not valid, idx will be DUK__NO_ARRAY_INDEX which * is 0xffffffffUL. We don't need to check for that explicitly * because 0xffffffffUL will never be inside object 'a_size'. */ if (idx >= DUK_HOBJECT_GET_ASIZE(obj)) { DUK_DDD(DUK_DDDPRINT("key is not an array index or outside array part")); return NULL; } DUK_ASSERT(idx != 0xffffffffUL); DUK_ASSERT(idx != DUK__NO_ARRAY_INDEX); /* XXX: for array instances we could take a shortcut here and assume * Array.prototype doesn't contain an array index property. */ DUK_DDD(DUK_DDDPRINT("key is a valid array index and inside array part")); tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, idx); if (!DUK_TVAL_IS_UNUSED(tv)) { DUK_DDD(DUK_DDDPRINT("-> fast path successful")); return tv; } DUK_DDD(DUK_DDDPRINT("fast path attempt failed, fall back to slow path")); return NULL; } DUK_LOCAL duk_bool_t duk__putprop_shallow_fastpath_array_tval(duk_hthread *thr, duk_hobject *obj, duk_tval *tv_key, duk_tval *tv_val) { duk_tval *tv; duk_harray *a; duk_uint32_t idx; duk_uint32_t old_len, new_len; if (!(DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj) && DUK_HOBJECT_HAS_ARRAY_PART(obj) && DUK_HOBJECT_HAS_EXTENSIBLE(obj))) { return 0; } DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)); /* caller ensures */ a = (duk_harray *) obj; DUK_ASSERT_HARRAY_VALID(a); #if defined(DUK_USE_FASTINT) if (DUK_TVAL_IS_FASTINT(tv_key)) { idx = duk__tval_fastint_to_arr_idx(tv_key); } else #endif if (DUK_TVAL_IS_DOUBLE(tv_key)) { idx = duk__tval_number_to_arr_idx(tv_key); } else { DUK_DDD(DUK_DDDPRINT("key is not a number")); return 0; } /* If index is not valid, idx will be DUK__NO_ARRAY_INDEX which * is 0xffffffffUL. We don't need to check for that explicitly * because 0xffffffffUL will never be inside object 'a_size'. */ if (idx >= DUK_HOBJECT_GET_ASIZE(obj)) { /* for resizing of array part, use slow path */ return 0; } DUK_ASSERT(idx != 0xffffffffUL); DUK_ASSERT(idx != DUK__NO_ARRAY_INDEX); old_len = a->length; if (idx >= old_len) { DUK_DDD(DUK_DDDPRINT("write new array entry requires length update " "(arr_idx=%ld, old_len=%ld)", (long) idx, (long) old_len)); if (DUK_HARRAY_LENGTH_NONWRITABLE(a)) { /* The correct behavior here is either a silent error * or a TypeError, depending on strictness. Fall back * to the slow path to handle the situation. */ return 0; } new_len = idx + 1; ((duk_harray *) obj)->length = new_len; } tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, idx); DUK_TVAL_SET_TVAL_UPDREF(thr, tv, tv_val); /* side effects */ DUK_DDD(DUK_DDDPRINT("array fast path success for index %ld", (long) idx)); return 1; } #endif /* DUK_USE_ARRAY_PROP_FASTPATH */ /* * Fast path for bufobj getprop/putprop */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_LOCAL duk_bool_t duk__getprop_fastpath_bufobj_tval(duk_hthread *thr, duk_hobject *obj, duk_tval *tv_key) { duk_uint32_t idx; duk_hbufobj *h_bufobj; duk_uint_t byte_off; duk_small_uint_t elem_size; duk_uint8_t *data; if (!DUK_HOBJECT_IS_BUFOBJ(obj)) { return 0; } h_bufobj = (duk_hbufobj *) obj; if (!DUK_HBUFOBJ_HAS_VIRTUAL_INDICES(h_bufobj)) { return 0; } #if defined(DUK_USE_FASTINT) if (DUK_TVAL_IS_FASTINT(tv_key)) { idx = duk__tval_fastint_to_arr_idx(tv_key); } else #endif if (DUK_TVAL_IS_DOUBLE(tv_key)) { idx = duk__tval_number_to_arr_idx(tv_key); } else { return 0; } /* If index is not valid, idx will be DUK__NO_ARRAY_INDEX which * is 0xffffffffUL. We don't need to check for that explicitly * because 0xffffffffUL will never be inside bufobj length. */ /* Careful with wrapping (left shifting idx would be unsafe). */ if (idx >= (h_bufobj->length >> h_bufobj->shift)) { return 0; } DUK_ASSERT(idx != DUK__NO_ARRAY_INDEX); byte_off = idx << h_bufobj->shift; /* no wrap assuming h_bufobj->length is valid */ elem_size = (duk_small_uint_t) (1U << h_bufobj->shift); if (h_bufobj->buf != NULL && DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_bufobj, byte_off + elem_size)) { data = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufobj->buf) + h_bufobj->offset + byte_off; duk_hbufobj_push_validated_read(thr, h_bufobj, data, elem_size); } else { DUK_D(DUK_DPRINT("bufobj access out of underlying buffer, ignoring (read zero)")); duk_push_uint(thr, 0); } return 1; } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) DUK_LOCAL duk_bool_t duk__putprop_fastpath_bufobj_tval(duk_hthread *thr, duk_hobject *obj, duk_tval *tv_key, duk_tval *tv_val) { duk_uint32_t idx; duk_hbufobj *h_bufobj; duk_uint_t byte_off; duk_small_uint_t elem_size; duk_uint8_t *data; if (!(DUK_HOBJECT_IS_BUFOBJ(obj) && DUK_TVAL_IS_NUMBER(tv_val))) { return 0; } DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)); /* caller ensures; rom objects are never bufobjs now */ h_bufobj = (duk_hbufobj *) obj; if (!DUK_HBUFOBJ_HAS_VIRTUAL_INDICES(h_bufobj)) { return 0; } #if defined(DUK_USE_FASTINT) if (DUK_TVAL_IS_FASTINT(tv_key)) { idx = duk__tval_fastint_to_arr_idx(tv_key); } else #endif if (DUK_TVAL_IS_DOUBLE(tv_key)) { idx = duk__tval_number_to_arr_idx(tv_key); } else { return 0; } /* If index is not valid, idx will be DUK__NO_ARRAY_INDEX which * is 0xffffffffUL. We don't need to check for that explicitly * because 0xffffffffUL will never be inside bufobj length. */ /* Careful with wrapping (left shifting idx would be unsafe). */ if (idx >= (h_bufobj->length >> h_bufobj->shift)) { return 0; } DUK_ASSERT(idx != DUK__NO_ARRAY_INDEX); byte_off = idx << h_bufobj->shift; /* no wrap assuming h_bufobj->length is valid */ elem_size = (duk_small_uint_t) (1U << h_bufobj->shift); /* Value is required to be a number in the fast path so there * are no side effects in write coercion. */ duk_push_tval(thr, tv_val); DUK_ASSERT(duk_is_number(thr, -1)); if (h_bufobj->buf != NULL && DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_bufobj, byte_off + elem_size)) { data = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufobj->buf) + h_bufobj->offset + byte_off; duk_hbufobj_validated_write(thr, h_bufobj, data, elem_size); } else { DUK_D(DUK_DPRINT("bufobj access out of underlying buffer, ignoring (write skipped)")); } duk_pop_unsafe(thr); return 1; } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ /* * GETPROP: Ecmascript property read. */ DUK_INTERNAL duk_bool_t duk_hobject_getprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key) { duk_tval tv_obj_copy; duk_tval tv_key_copy; duk_hobject *curr = NULL; duk_hstring *key = NULL; duk_uint32_t arr_idx = DUK__NO_ARRAY_INDEX; duk_propdesc desc; duk_uint_t sanity; DUK_DDD(DUK_DDDPRINT("getprop: thr=%p, obj=%p, key=%p (obj -> %!T, key -> %!T)", (void *) thr, (void *) tv_obj, (void *) tv_key, (duk_tval *) tv_obj, (duk_tval *) tv_key)); DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->heap != NULL); DUK_ASSERT(tv_obj != NULL); DUK_ASSERT(tv_key != NULL); DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); DUK_STATS_INC(thr->heap, stats_getprop_all); /* * Make a copy of tv_obj, tv_key, and tv_val to avoid any issues of * them being invalidated by a valstack resize. * * XXX: this is now an overkill for many fast paths. Rework this * to be faster (although switching to a valstack discipline might * be a better solution overall). */ DUK_TVAL_SET_TVAL(&tv_obj_copy, tv_obj); DUK_TVAL_SET_TVAL(&tv_key_copy, tv_key); tv_obj = &tv_obj_copy; tv_key = &tv_key_copy; /* * Coercion and fast path processing */ switch (DUK_TVAL_GET_TAG(tv_obj)) { case DUK_TAG_UNDEFINED: case DUK_TAG_NULL: { /* Note: unconditional throw */ DUK_DDD(DUK_DDDPRINT("base object is undefined or null -> reject")); #if defined(DUK_USE_PARANOID_ERRORS) DUK_ERROR_TYPE(thr, DUK_STR_INVALID_BASE); #else DUK_ERROR_FMT2(thr, DUK_ERR_TYPE_ERROR, "cannot read property %s of %s", duk_push_string_tval_readable(thr, tv_key), duk_push_string_tval_readable(thr, tv_obj)); #endif return 0; } case DUK_TAG_BOOLEAN: { DUK_DDD(DUK_DDDPRINT("base object is a boolean, start lookup from boolean prototype")); curr = thr->builtins[DUK_BIDX_BOOLEAN_PROTOTYPE]; break; } case DUK_TAG_STRING: { duk_hstring *h = DUK_TVAL_GET_STRING(tv_obj); duk_int_t pop_count; if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) { /* Symbols (ES2015 or hidden) don't have virtual properties. */ DUK_DDD(DUK_DDDPRINT("base object is a symbol, start lookup from symbol prototype")); curr = thr->builtins[DUK_BIDX_SYMBOL_PROTOTYPE]; break; } #if defined(DUK_USE_FASTINT) if (DUK_TVAL_IS_FASTINT(tv_key)) { arr_idx = duk__tval_fastint_to_arr_idx(tv_key); DUK_DDD(DUK_DDDPRINT("base object string, key is a fast-path fastint; arr_idx %ld", (long) arr_idx)); pop_count = 0; } else #endif if (DUK_TVAL_IS_NUMBER(tv_key)) { arr_idx = duk__tval_number_to_arr_idx(tv_key); DUK_DDD(DUK_DDDPRINT("base object string, key is a fast-path number; arr_idx %ld", (long) arr_idx)); pop_count = 0; } else { arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); DUK_ASSERT(key != NULL); DUK_DDD(DUK_DDDPRINT("base object string, key is a non-fast-path number; after " "coercion key is %!T, arr_idx %ld", (duk_tval *) duk_get_tval(thr, -1), (long) arr_idx)); pop_count = 1; } if (arr_idx != DUK__NO_ARRAY_INDEX && arr_idx < DUK_HSTRING_GET_CHARLEN(h)) { duk_pop_n_unsafe(thr, pop_count); duk_push_hstring(thr, h); duk_substring(thr, -1, arr_idx, arr_idx + 1); /* [str] -> [substr] */ DUK_STATS_INC(thr->heap, stats_getprop_stringidx); DUK_DDD(DUK_DDDPRINT("-> %!T (base is string, key is an index inside string length " "after coercion -> return char)", (duk_tval *) duk_get_tval(thr, -1))); return 1; } if (pop_count == 0) { /* This is a pretty awkward control flow, but we need to recheck the * key coercion here. */ arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); DUK_ASSERT(key != NULL); DUK_DDD(DUK_DDDPRINT("base object string, key is a non-fast-path number; after " "coercion key is %!T, arr_idx %ld", (duk_tval *) duk_get_tval(thr, -1), (long) arr_idx)); } if (key == DUK_HTHREAD_STRING_LENGTH(thr)) { duk_pop_unsafe(thr); /* [key] -> [] */ duk_push_uint(thr, (duk_uint_t) DUK_HSTRING_GET_CHARLEN(h)); /* [] -> [res] */ DUK_STATS_INC(thr->heap, stats_getprop_stringlen); DUK_DDD(DUK_DDDPRINT("-> %!T (base is string, key is 'length' after coercion -> " "return string length)", (duk_tval *) duk_get_tval(thr, -1))); return 1; } DUK_DDD(DUK_DDDPRINT("base object is a string, start lookup from string prototype")); curr = thr->builtins[DUK_BIDX_STRING_PROTOTYPE]; goto lookup; /* avoid double coercion */ } case DUK_TAG_OBJECT: { #if defined(DUK_USE_ARRAY_PROP_FASTPATH) duk_tval *tmp; #endif curr = DUK_TVAL_GET_OBJECT(tv_obj); DUK_ASSERT(curr != NULL); /* XXX: array .length fast path (important in e.g. loops)? */ #if defined(DUK_USE_ARRAY_PROP_FASTPATH) tmp = duk__getprop_shallow_fastpath_array_tval(thr, curr, tv_key); if (tmp) { duk_push_tval(thr, tmp); DUK_DDD(DUK_DDDPRINT("-> %!T (base is object, key is a number, array part " "fast path)", (duk_tval *) duk_get_tval(thr, -1))); DUK_STATS_INC(thr->heap, stats_getprop_arrayidx); return 1; } #endif #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) if (duk__getprop_fastpath_bufobj_tval(thr, curr, tv_key) != 0) { /* Read value pushed on stack. */ DUK_DDD(DUK_DDDPRINT("-> %!T (base is bufobj, key is a number, bufobj " "fast path)", (duk_tval *) duk_get_tval(thr, -1))); DUK_STATS_INC(thr->heap, stats_getprop_bufobjidx); return 1; } #endif #if defined(DUK_USE_ES6_PROXY) if (DUK_UNLIKELY(DUK_HOBJECT_IS_PROXY(curr))) { duk_hobject *h_target; if (duk__proxy_check_prop(thr, curr, DUK_STRIDX_GET, tv_key, &h_target)) { /* -> [ ... trap handler ] */ DUK_DDD(DUK_DDDPRINT("-> proxy object 'get' for key %!T", (duk_tval *) tv_key)); DUK_STATS_INC(thr->heap, stats_getprop_proxy); duk_push_hobject(thr, h_target); /* target */ duk_push_tval(thr, tv_key); /* P */ duk_push_tval(thr, tv_obj); /* Receiver: Proxy object */ duk_call_method(thr, 3 /*nargs*/); /* Target object must be checked for a conflicting * non-configurable property. */ arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); DUK_ASSERT(key != NULL); if (duk__get_own_propdesc_raw(thr, h_target, key, arr_idx, &desc, DUK_GETDESC_FLAG_PUSH_VALUE)) { duk_tval *tv_hook = duk_require_tval(thr, -3); /* value from hook */ duk_tval *tv_targ = duk_require_tval(thr, -1); /* value from target */ duk_bool_t datadesc_reject; duk_bool_t accdesc_reject; DUK_DDD(DUK_DDDPRINT("proxy 'get': target has matching property %!O, check for " "conflicting property; tv_hook=%!T, tv_targ=%!T, desc.flags=0x%08lx, " "desc.get=%p, desc.set=%p", (duk_heaphdr *) key, (duk_tval *) tv_hook, (duk_tval *) tv_targ, (unsigned long) desc.flags, (void *) desc.get, (void *) desc.set)); datadesc_reject = !(desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) && !(desc.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && !(desc.flags & DUK_PROPDESC_FLAG_WRITABLE) && !duk_js_samevalue(tv_hook, tv_targ); accdesc_reject = (desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) && !(desc.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && (desc.get == NULL) && !DUK_TVAL_IS_UNDEFINED(tv_hook); if (datadesc_reject || accdesc_reject) { DUK_ERROR_TYPE(thr, DUK_STR_PROXY_REJECTED); } duk_pop_2_unsafe(thr); } else { duk_pop_unsafe(thr); } return 1; /* return value */ } curr = h_target; /* resume lookup from target */ DUK_TVAL_SET_OBJECT(tv_obj, curr); } #endif /* DUK_USE_ES6_PROXY */ if (DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(curr)) { arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); DUK_ASSERT(key != NULL); DUK_STATS_INC(thr->heap, stats_getprop_arguments); if (duk__check_arguments_map_for_get(thr, curr, key, &desc)) { DUK_DDD(DUK_DDDPRINT("-> %!T (base is object with arguments exotic behavior, " "key matches magically bound property -> skip standard " "Get with replacement value)", (duk_tval *) duk_get_tval(thr, -1))); /* no need for 'caller' post-check, because 'key' must be an array index */ duk_remove_m2(thr); /* [key result] -> [result] */ return 1; } goto lookup; /* avoid double coercion */ } break; } /* Buffer has virtual properties similar to string, but indexed values * are numbers, not 1-byte buffers/strings which would perform badly. */ case DUK_TAG_BUFFER: { duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv_obj); duk_int_t pop_count; /* * Because buffer values are often looped over, a number fast path * is important. */ #if defined(DUK_USE_FASTINT) if (DUK_TVAL_IS_FASTINT(tv_key)) { arr_idx = duk__tval_fastint_to_arr_idx(tv_key); DUK_DDD(DUK_DDDPRINT("base object buffer, key is a fast-path fastint; arr_idx %ld", (long) arr_idx)); pop_count = 0; } else #endif if (DUK_TVAL_IS_NUMBER(tv_key)) { arr_idx = duk__tval_number_to_arr_idx(tv_key); DUK_DDD(DUK_DDDPRINT("base object buffer, key is a fast-path number; arr_idx %ld", (long) arr_idx)); pop_count = 0; } else { arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); DUK_ASSERT(key != NULL); DUK_DDD(DUK_DDDPRINT("base object buffer, key is a non-fast-path number; after " "coercion key is %!T, arr_idx %ld", (duk_tval *) duk_get_tval(thr, -1), (long) arr_idx)); pop_count = 1; } if (arr_idx != DUK__NO_ARRAY_INDEX && arr_idx < DUK_HBUFFER_GET_SIZE(h)) { duk_pop_n_unsafe(thr, pop_count); duk_push_uint(thr, ((duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h))[arr_idx]); DUK_STATS_INC(thr->heap, stats_getprop_bufferidx); DUK_DDD(DUK_DDDPRINT("-> %!T (base is buffer, key is an index inside buffer length " "after coercion -> return byte as number)", (duk_tval *) duk_get_tval(thr, -1))); return 1; } if (pop_count == 0) { /* This is a pretty awkward control flow, but we need to recheck the * key coercion here. */ arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); DUK_ASSERT(key != NULL); DUK_DDD(DUK_DDDPRINT("base object buffer, key is a non-fast-path number; after " "coercion key is %!T, arr_idx %ld", (duk_tval *) duk_get_tval(thr, -1), (long) arr_idx)); } if (key == DUK_HTHREAD_STRING_LENGTH(thr)) { duk_pop_unsafe(thr); /* [key] -> [] */ duk_push_uint(thr, (duk_uint_t) DUK_HBUFFER_GET_SIZE(h)); /* [] -> [res] */ DUK_STATS_INC(thr->heap, stats_getprop_bufferlen); DUK_DDD(DUK_DDDPRINT("-> %!T (base is buffer, key is 'length' " "after coercion -> return buffer length)", (duk_tval *) duk_get_tval(thr, -1))); return 1; } DUK_DDD(DUK_DDDPRINT("base object is a buffer, start lookup from Uint8Array prototype")); curr = thr->builtins[DUK_BIDX_UINT8ARRAY_PROTOTYPE]; goto lookup; /* avoid double coercion */ } case DUK_TAG_POINTER: { DUK_DDD(DUK_DDDPRINT("base object is a pointer, start lookup from pointer prototype")); curr = thr->builtins[DUK_BIDX_POINTER_PROTOTYPE]; break; } case DUK_TAG_LIGHTFUNC: { /* Lightfuncs inherit getter .name and .length from %NativeFunctionPrototype%. */ DUK_DDD(DUK_DDDPRINT("base object is a lightfunc, start lookup from function prototype")); curr = thr->builtins[DUK_BIDX_NATIVE_FUNCTION_PROTOTYPE]; break; } #if defined(DUK_USE_FASTINT) case DUK_TAG_FASTINT: #endif default: { /* number */ DUK_DDD(DUK_DDDPRINT("base object is a number, start lookup from number prototype")); DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv_obj)); DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_obj)); curr = thr->builtins[DUK_BIDX_NUMBER_PROTOTYPE]; break; } } /* key coercion (unless already coerced above) */ DUK_ASSERT(key == NULL); arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); DUK_ASSERT(key != NULL); /* * Property lookup */ lookup: /* [key] (coerced) */ DUK_ASSERT(curr != NULL); DUK_ASSERT(key != NULL); sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY; do { if (!duk__get_own_propdesc_raw(thr, curr, key, arr_idx, &desc, DUK_GETDESC_FLAG_PUSH_VALUE)) { goto next_in_chain; } if (desc.get != NULL) { /* accessor with defined getter */ DUK_ASSERT((desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) != 0); duk_pop_unsafe(thr); /* [key undefined] -> [key] */ duk_push_hobject(thr, desc.get); duk_push_tval(thr, tv_obj); /* note: original, uncoerced base */ #if defined(DUK_USE_NONSTD_GETTER_KEY_ARGUMENT) duk_dup_m3(thr); duk_call_method(thr, 1); /* [key getter this key] -> [key retval] */ #else duk_call_method(thr, 0); /* [key getter this] -> [key retval] */ #endif } else { /* [key value] or [key undefined] */ /* data property or accessor without getter */ DUK_ASSERT(((desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) == 0) || (desc.get == NULL)); /* if accessor without getter, return value is undefined */ DUK_ASSERT(((desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) == 0) || duk_is_undefined(thr, -1)); /* Note: for an accessor without getter, falling through to * check for "caller" exotic behavior is unnecessary as * "undefined" will never activate the behavior. But it does * no harm, so we'll do it anyway. */ } goto found; /* [key result] */ next_in_chain: /* XXX: option to pretend property doesn't exist if sanity limit is * hit might be useful. */ if (DUK_UNLIKELY(sanity-- == 0)) { DUK_ERROR_RANGE(thr, DUK_STR_PROTOTYPE_CHAIN_LIMIT); } curr = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, curr); } while (curr != NULL); /* * Not found */ duk_to_undefined(thr, -1); /* [key] -> [undefined] (default value) */ DUK_DDD(DUK_DDDPRINT("-> %!T (not found)", (duk_tval *) duk_get_tval(thr, -1))); return 0; /* * Found; post-processing (Function and arguments objects) */ found: /* [key result] */ #if !defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY) /* Special behavior for 'caller' property of (non-bound) function objects * and non-strict Arguments objects: if 'caller' -value- (!) is a strict * mode function, throw a TypeError (E5 Sections 15.3.5.4, 10.6). * Quite interestingly, a non-strict function with no formal arguments * will get an arguments object -without- special 'caller' behavior! * * The E5.1 spec is a bit ambiguous if this special behavior applies when * a bound function is the base value (not the 'caller' value): Section * 15.3.4.5 (describing bind()) states that [[Get]] for bound functions * matches that of Section 15.3.5.4 ([[Get]] for Function instances). * However, Section 13.3.5.4 has "NOTE: Function objects created using * Function.prototype.bind use the default [[Get]] internal method." * The current implementation assumes this means that bound functions * should not have the special [[Get]] behavior. * * The E5.1 spec is also a bit unclear if the TypeError throwing is * applied if the 'caller' value is a strict bound function. The * current implementation will throw even for both strict non-bound * and strict bound functions. * * See test-dev-strict-func-as-caller-prop-value.js for quite extensive * tests. * * This exotic behavior is disabled when the non-standard 'caller' property * is enabled, as it conflicts with the free use of 'caller'. */ if (key == DUK_HTHREAD_STRING_CALLER(thr) && DUK_TVAL_IS_OBJECT(tv_obj)) { duk_hobject *orig = DUK_TVAL_GET_OBJECT(tv_obj); DUK_ASSERT(orig != NULL); if (DUK_HOBJECT_IS_NONBOUND_FUNCTION(orig) || DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(orig)) { duk_hobject *h; /* XXX: The TypeError is currently not applied to bound * functions because the 'strict' flag is not copied by * bind(). This may or may not be correct, the specification * only refers to the value being a "strict mode Function * object" which is ambiguous. */ DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(orig)); h = duk_get_hobject(thr, -1); /* NULL if not an object */ if (h && DUK_HOBJECT_IS_FUNCTION(h) && DUK_HOBJECT_HAS_STRICT(h)) { /* XXX: sufficient to check 'strict', assert for 'is function' */ DUK_ERROR_TYPE(thr, DUK_STR_STRICT_CALLER_READ); } } } #endif /* !DUK_USE_NONSTD_FUNC_CALLER_PROPERTY */ duk_remove_m2(thr); /* [key result] -> [result] */ DUK_DDD(DUK_DDDPRINT("-> %!T (found)", (duk_tval *) duk_get_tval(thr, -1))); return 1; } /* * HASPROP: Ecmascript property existence check ("in" operator). * * Interestingly, the 'in' operator does not do any coercion of * the target object. */ DUK_INTERNAL duk_bool_t duk_hobject_hasprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key) { duk_tval tv_key_copy; duk_hobject *obj; duk_hstring *key; duk_uint32_t arr_idx; duk_bool_t rc; duk_propdesc desc; DUK_DDD(DUK_DDDPRINT("hasprop: thr=%p, obj=%p, key=%p (obj -> %!T, key -> %!T)", (void *) thr, (void *) tv_obj, (void *) tv_key, (duk_tval *) tv_obj, (duk_tval *) tv_key)); DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->heap != NULL); DUK_ASSERT(tv_obj != NULL); DUK_ASSERT(tv_key != NULL); DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); DUK_TVAL_SET_TVAL(&tv_key_copy, tv_key); tv_key = &tv_key_copy; /* * The 'in' operator requires an object as its right hand side, * throwing a TypeError unconditionally if this is not the case. * * However, lightfuncs need to behave like fully fledged objects * here to be maximally transparent, so we need to handle them * here. Same goes for plain buffers which behave like ArrayBuffers. */ /* XXX: Refactor key coercion so that it's only called once. It can't * be trivially lifted here because the object must be type checked * first. */ if (DUK_TVAL_IS_OBJECT(tv_obj)) { obj = DUK_TVAL_GET_OBJECT(tv_obj); DUK_ASSERT(obj != NULL); arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); } else if (DUK_TVAL_IS_BUFFER(tv_obj)) { arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); if (duk__key_is_plain_buf_ownprop(thr, DUK_TVAL_GET_BUFFER(tv_obj), key, arr_idx)) { rc = 1; goto pop_and_return; } obj = thr->builtins[DUK_BIDX_UINT8ARRAY_PROTOTYPE]; } else if (DUK_TVAL_IS_LIGHTFUNC(tv_obj)) { arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); /* If not found, resume existence check from %NativeFunctionPrototype%. * We can just substitute the value in this case; nothing will * need the original base value (as would be the case with e.g. * setters/getters. */ obj = thr->builtins[DUK_BIDX_NATIVE_FUNCTION_PROTOTYPE]; } else { /* Note: unconditional throw */ DUK_DDD(DUK_DDDPRINT("base object is not an object -> reject")); DUK_ERROR_TYPE(thr, DUK_STR_INVALID_BASE); } /* XXX: fast path for arrays? */ DUK_ASSERT(key != NULL); DUK_ASSERT(obj != NULL); DUK_UNREF(arr_idx); #if defined(DUK_USE_ES6_PROXY) if (DUK_UNLIKELY(DUK_HOBJECT_IS_PROXY(obj))) { duk_hobject *h_target; duk_bool_t tmp_bool; /* XXX: the key in 'key in obj' is string coerced before we're called * (which is the required behavior in E5/E5.1/E6) so the key is a string * here already. */ if (duk__proxy_check_prop(thr, obj, DUK_STRIDX_HAS, tv_key, &h_target)) { /* [ ... key trap handler ] */ DUK_DDD(DUK_DDDPRINT("-> proxy object 'has' for key %!T", (duk_tval *) tv_key)); duk_push_hobject(thr, h_target); /* target */ duk_push_tval(thr, tv_key); /* P */ duk_call_method(thr, 2 /*nargs*/); tmp_bool = duk_to_boolean(thr, -1); if (!tmp_bool) { /* Target object must be checked for a conflicting * non-configurable property. */ if (duk__get_own_propdesc_raw(thr, h_target, key, arr_idx, &desc, 0 /*flags*/)) { /* don't push value */ DUK_DDD(DUK_DDDPRINT("proxy 'has': target has matching property %!O, check for " "conflicting property; desc.flags=0x%08lx, " "desc.get=%p, desc.set=%p", (duk_heaphdr *) key, (unsigned long) desc.flags, (void *) desc.get, (void *) desc.set)); /* XXX: Extensibility check for target uses IsExtensible(). If we * implemented the isExtensible trap and didn't reject proxies as * proxy targets, it should be respected here. */ if (!((desc.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && /* property is configurable and */ DUK_HOBJECT_HAS_EXTENSIBLE(h_target))) { /* ... target is extensible */ DUK_ERROR_TYPE(thr, DUK_STR_PROXY_REJECTED); } } } duk_pop_2_unsafe(thr); /* [ key trap_result ] -> [] */ return tmp_bool; } obj = h_target; /* resume check from proxy target */ } #endif /* DUK_USE_ES6_PROXY */ /* XXX: inline into a prototype walking loop? */ rc = duk__get_propdesc(thr, obj, key, &desc, 0 /*flags*/); /* don't push value */ /* fall through */ pop_and_return: duk_pop_unsafe(thr); /* [ key ] -> [] */ return rc; } /* * HASPROP variant used internally. * * This primitive must never throw an error, callers rely on this. * In particular, don't throw an error for prototype loops; instead, * pretend like the property doesn't exist if a prototype sanity limit * is reached. * * Does not implement proxy behavior: if applied to a proxy object, * returns key existence on the proxy object itself. */ DUK_INTERNAL duk_bool_t duk_hobject_hasprop_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key) { duk_propdesc dummy; DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->heap != NULL); DUK_ASSERT(obj != NULL); DUK_ASSERT(key != NULL); DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); return duk__get_propdesc(thr, obj, key, &dummy, DUK_GETDESC_FLAG_IGNORE_PROTOLOOP); /* don't push value */ } /* * Helper: handle Array object 'length' write which automatically * deletes properties, see E5 Section 15.4.5.1, step 3. This is * quite tricky to get right. * * Used by duk_hobject_putprop(). */ /* Coerce a new .length candidate to a number and check that it's a valid * .length. */ DUK_LOCAL duk_uint32_t duk__to_new_array_length_checked(duk_hthread *thr, duk_tval *tv) { duk_uint32_t res; duk_double_t d; #if !defined(DUK_USE_PREFER_SIZE) #if defined(DUK_USE_FASTINT) /* When fastints are enabled, the most interesting case is assigning * a fastint to .length (e.g. arr.length = 0). */ if (DUK_TVAL_IS_FASTINT(tv)) { /* Very common case. */ duk_int64_t fi; fi = DUK_TVAL_GET_FASTINT(tv); if (fi < 0 || fi > DUK_I64_CONSTANT(0xffffffff)) { goto fail_range; } return (duk_uint32_t) fi; } #else /* DUK_USE_FASTINT */ /* When fastints are not enabled, the most interesting case is any * number. */ if (DUK_TVAL_IS_DOUBLE(tv)) { d = DUK_TVAL_GET_NUMBER(tv); } #endif /* DUK_USE_FASTINT */ else #endif /* !DUK_USE_PREFER_SIZE */ { /* In all other cases, and when doing a size optimized build, * fall back to the comprehensive handler. */ d = duk_js_tonumber(thr, tv); } /* Refuse to update an Array's 'length' to a value outside the * 32-bit range. Negative zero is accepted as zero. */ res = (duk_uint32_t) d; if ((duk_double_t) res != d) { goto fail_range; } return res; fail_range: DUK_ERROR_RANGE(thr, DUK_STR_INVALID_ARRAY_LENGTH); return 0; /* unreachable */ } /* Delete elements required by a smaller length, taking into account * potentially non-configurable elements. Returns non-zero if all * elements could be deleted, and zero if all or some elements could * not be deleted. Also writes final "target length" to 'out_result_len'. * This is the length value that should go into the 'length' property * (must be set by the caller). Never throws an error. */ DUK_LOCAL duk_bool_t duk__handle_put_array_length_smaller(duk_hthread *thr, duk_hobject *obj, duk_uint32_t old_len, duk_uint32_t new_len, duk_bool_t force_flag, duk_uint32_t *out_result_len) { duk_uint32_t target_len; duk_uint_fast32_t i; duk_uint32_t arr_idx; duk_hstring *key; duk_tval *tv; duk_bool_t rc; DUK_DDD(DUK_DDDPRINT("new array length smaller than old (%ld -> %ld), " "probably need to remove elements", (long) old_len, (long) new_len)); /* * New length is smaller than old length, need to delete properties above * the new length. * * If array part exists, this is straightforward: array entries cannot * be non-configurable so this is guaranteed to work. * * If array part does not exist, array-indexed values are scattered * in the entry part, and some may not be configurable (preventing length * from becoming lower than their index + 1). To handle the algorithm * in E5 Section 15.4.5.1, step l correctly, we scan the entire property * set twice. */ DUK_ASSERT(thr != NULL); DUK_ASSERT(obj != NULL); DUK_ASSERT(new_len < old_len); DUK_ASSERT(out_result_len != NULL); DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); DUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)); DUK_ASSERT(DUK_HOBJECT_IS_ARRAY(obj)); if (DUK_HOBJECT_HAS_ARRAY_PART(obj)) { /* * All defined array-indexed properties are in the array part * (we assume the array part is comprehensive), and all array * entries are writable, configurable, and enumerable. Thus, * nothing can prevent array entries from being deleted. */ DUK_DDD(DUK_DDDPRINT("have array part, easy case")); if (old_len < DUK_HOBJECT_GET_ASIZE(obj)) { /* XXX: assertion that entries >= old_len are already unused */ i = old_len; } else { i = DUK_HOBJECT_GET_ASIZE(obj); } DUK_ASSERT(i <= DUK_HOBJECT_GET_ASIZE(obj)); while (i > new_len) { i--; tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, i); DUK_TVAL_SET_UNUSED_UPDREF(thr, tv); /* side effects */ } *out_result_len = new_len; return 1; } else { /* * Entries part is a bit more complex. */ /* Stage 1: find highest preventing non-configurable entry (if any). * When forcing, ignore non-configurability. */ DUK_DDD(DUK_DDDPRINT("no array part, slow case")); DUK_DDD(DUK_DDDPRINT("array length write, no array part, stage 1: find target_len " "(highest preventing non-configurable entry (if any))")); target_len = new_len; if (force_flag) { DUK_DDD(DUK_DDDPRINT("array length write, no array part; force flag -> skip stage 1")); goto skip_stage1; } for (i = 0; i < DUK_HOBJECT_GET_ENEXT(obj); i++) { key = DUK_HOBJECT_E_GET_KEY(thr->heap, obj, i); if (!key) { DUK_DDD(DUK_DDDPRINT("skip entry index %ld: null key", (long) i)); continue; } if (!DUK_HSTRING_HAS_ARRIDX(key)) { DUK_DDD(DUK_DDDPRINT("skip entry index %ld: key not an array index", (long) i)); continue; } DUK_ASSERT(DUK_HSTRING_HAS_ARRIDX(key)); /* XXX: macro checks for array index flag, which is unnecessary here */ arr_idx = DUK_HSTRING_GET_ARRIDX_SLOW(key); DUK_ASSERT(arr_idx != DUK__NO_ARRAY_INDEX); DUK_ASSERT(arr_idx < old_len); /* consistency requires this */ if (arr_idx < new_len) { DUK_DDD(DUK_DDDPRINT("skip entry index %ld: key is array index %ld, below new_len", (long) i, (long) arr_idx)); continue; } if (DUK_HOBJECT_E_SLOT_IS_CONFIGURABLE(thr->heap, obj, i)) { DUK_DDD(DUK_DDDPRINT("skip entry index %ld: key is a relevant array index %ld, but configurable", (long) i, (long) arr_idx)); continue; } /* relevant array index is non-configurable, blocks write */ if (arr_idx >= target_len) { DUK_DDD(DUK_DDDPRINT("entry at index %ld has arr_idx %ld, is not configurable, " "update target_len %ld -> %ld", (long) i, (long) arr_idx, (long) target_len, (long) (arr_idx + 1))); target_len = arr_idx + 1; } } skip_stage1: /* stage 2: delete configurable entries above target length */ DUK_DDD(DUK_DDDPRINT("old_len=%ld, new_len=%ld, target_len=%ld", (long) old_len, (long) new_len, (long) target_len)); DUK_DDD(DUK_DDDPRINT("array length write, no array part, stage 2: remove " "entries >= target_len")); for (i = 0; i < DUK_HOBJECT_GET_ENEXT(obj); i++) { key = DUK_HOBJECT_E_GET_KEY(thr->heap, obj, i); if (!key) { DUK_DDD(DUK_DDDPRINT("skip entry index %ld: null key", (long) i)); continue; } if (!DUK_HSTRING_HAS_ARRIDX(key)) { DUK_DDD(DUK_DDDPRINT("skip entry index %ld: key not an array index", (long) i)); continue; } DUK_ASSERT(DUK_HSTRING_HAS_ARRIDX(key)); /* XXX: macro checks for array index flag, which is unnecessary here */ arr_idx = DUK_HSTRING_GET_ARRIDX_SLOW(key); DUK_ASSERT(arr_idx != DUK__NO_ARRAY_INDEX); DUK_ASSERT(arr_idx < old_len); /* consistency requires this */ if (arr_idx < target_len) { DUK_DDD(DUK_DDDPRINT("skip entry index %ld: key is array index %ld, below target_len", (long) i, (long) arr_idx)); continue; } DUK_ASSERT(force_flag || DUK_HOBJECT_E_SLOT_IS_CONFIGURABLE(thr->heap, obj, i)); /* stage 1 guarantees */ DUK_DDD(DUK_DDDPRINT("delete entry index %ld: key is array index %ld", (long) i, (long) arr_idx)); /* * Slow delete, but we don't care as we're already in a very slow path. * The delete always succeeds: key has no exotic behavior, property * is configurable, and no resize occurs. */ rc = duk_hobject_delprop_raw(thr, obj, key, force_flag ? DUK_DELPROP_FLAG_FORCE : 0); DUK_UNREF(rc); DUK_ASSERT(rc != 0); } /* stage 3: update length (done by caller), decide return code */ DUK_DDD(DUK_DDDPRINT("array length write, no array part, stage 3: update length (done by caller)")); *out_result_len = target_len; if (target_len == new_len) { DUK_DDD(DUK_DDDPRINT("target_len matches new_len, return success")); return 1; } DUK_DDD(DUK_DDDPRINT("target_len does not match new_len (some entry prevented " "full length adjustment), return error")); return 0; } DUK_UNREACHABLE(); } /* XXX: is valstack top best place for argument? */ DUK_LOCAL duk_bool_t duk__handle_put_array_length(duk_hthread *thr, duk_hobject *obj) { duk_harray *a; duk_uint32_t old_len; duk_uint32_t new_len; duk_uint32_t result_len; duk_bool_t rc; DUK_DDD(DUK_DDDPRINT("handling a put operation to array 'length' exotic property, " "new val: %!T", (duk_tval *) duk_get_tval(thr, -1))); DUK_ASSERT(thr != NULL); DUK_ASSERT(obj != NULL); DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); DUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)); DUK_ASSERT(DUK_HOBJECT_IS_ARRAY(obj)); a = (duk_harray *) obj; DUK_ASSERT_HARRAY_VALID(a); DUK_ASSERT(duk_is_valid_index(thr, -1)); /* * Get old and new length */ old_len = a->length; new_len = duk__to_new_array_length_checked(thr, DUK_GET_TVAL_NEGIDX(thr, -1)); DUK_DDD(DUK_DDDPRINT("old_len=%ld, new_len=%ld", (long) old_len, (long) new_len)); /* * Writability check */ if (DUK_HARRAY_LENGTH_NONWRITABLE(a)) { DUK_DDD(DUK_DDDPRINT("length is not writable, fail")); return 0; } /* * New length not lower than old length => no changes needed * (not even array allocation). */ if (new_len >= old_len) { DUK_DDD(DUK_DDDPRINT("new length is same or higher than old length, just update length, no deletions")); a->length = new_len; return 1; } DUK_DDD(DUK_DDDPRINT("new length is lower than old length, probably must delete entries")); /* * New length lower than old length => delete elements, then * update length. * * Note: even though a bunch of elements have been deleted, the 'desc' is * still valid as properties haven't been resized (and entries compacted). */ rc = duk__handle_put_array_length_smaller(thr, obj, old_len, new_len, 0 /*force_flag*/, &result_len); DUK_ASSERT(result_len >= new_len && result_len <= old_len); a->length = result_len; /* XXX: shrink array allocation or entries compaction here? */ return rc; } /* * PUTPROP: Ecmascript property write. * * Unlike Ecmascript primitive which returns nothing, returns 1 to indicate * success and 0 to indicate failure (assuming throw is not set). * * This is an extremely tricky function. Some examples: * * * Currently a decref may trigger a GC, which may compact an object's * property allocation. Consequently, any entry indices (e_idx) will * be potentially invalidated by a decref. * * * Exotic behaviors (strings, arrays, arguments object) require, * among other things: * * - Preprocessing before and postprocessing after an actual property * write. For example, array index write requires pre-checking the * array 'length' property for access control, and may require an * array 'length' update after the actual write has succeeded (but * not if it fails). * * - Deletion of multiple entries, as a result of array 'length' write. * * * Input values are taken as pointers which may point to the valstack. * If valstack is resized because of the put (this may happen at least * when the array part is abandoned), the pointers can be invalidated. * (We currently make a copy of all of the input values to avoid issues.) */ DUK_INTERNAL duk_bool_t duk_hobject_putprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key, duk_tval *tv_val, duk_bool_t throw_flag) { duk_tval tv_obj_copy; duk_tval tv_key_copy; duk_tval tv_val_copy; duk_hobject *orig = NULL; /* NULL if tv_obj is primitive */ duk_hobject *curr; duk_hstring *key = NULL; duk_propdesc desc; duk_tval *tv; duk_uint32_t arr_idx; duk_bool_t rc; duk_int_t e_idx; duk_uint_t sanity; duk_uint32_t new_array_length = 0; /* 0 = no update */ DUK_DDD(DUK_DDDPRINT("putprop: thr=%p, obj=%p, key=%p, val=%p, throw=%ld " "(obj -> %!T, key -> %!T, val -> %!T)", (void *) thr, (void *) tv_obj, (void *) tv_key, (void *) tv_val, (long) throw_flag, (duk_tval *) tv_obj, (duk_tval *) tv_key, (duk_tval *) tv_val)); DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->heap != NULL); DUK_ASSERT(tv_obj != NULL); DUK_ASSERT(tv_key != NULL); DUK_ASSERT(tv_val != NULL); DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); DUK_STATS_INC(thr->heap, stats_putprop_all); /* * Make a copy of tv_obj, tv_key, and tv_val to avoid any issues of * them being invalidated by a valstack resize. * * XXX: this is an overkill for some paths, so optimize this later * (or maybe switch to a stack arguments model entirely). */ DUK_TVAL_SET_TVAL(&tv_obj_copy, tv_obj); DUK_TVAL_SET_TVAL(&tv_key_copy, tv_key); DUK_TVAL_SET_TVAL(&tv_val_copy, tv_val); tv_obj = &tv_obj_copy; tv_key = &tv_key_copy; tv_val = &tv_val_copy; /* * Coercion and fast path processing. */ switch (DUK_TVAL_GET_TAG(tv_obj)) { case DUK_TAG_UNDEFINED: case DUK_TAG_NULL: { /* Note: unconditional throw */ DUK_DDD(DUK_DDDPRINT("base object is undefined or null -> reject (object=%!iT)", (duk_tval *) tv_obj)); #if defined(DUK_USE_PARANOID_ERRORS) DUK_ERROR_TYPE(thr, DUK_STR_INVALID_BASE); #else DUK_ERROR_FMT2(thr, DUK_ERR_TYPE_ERROR, "cannot write property %s of %s", duk_push_string_tval_readable(thr, tv_key), duk_push_string_tval_readable(thr, tv_obj)); #endif return 0; } case DUK_TAG_BOOLEAN: { DUK_DDD(DUK_DDDPRINT("base object is a boolean, start lookup from boolean prototype")); curr = thr->builtins[DUK_BIDX_BOOLEAN_PROTOTYPE]; break; } case DUK_TAG_STRING: { duk_hstring *h = DUK_TVAL_GET_STRING(tv_obj); /* * Note: currently no fast path for array index writes. * They won't be possible anyway as strings are immutable. */ DUK_ASSERT(key == NULL); arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); DUK_ASSERT(key != NULL); if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) { /* Symbols (ES2015 or hidden) don't have virtual properties. */ curr = thr->builtins[DUK_BIDX_SYMBOL_PROTOTYPE]; goto lookup; } if (key == DUK_HTHREAD_STRING_LENGTH(thr)) { goto fail_not_writable; } if (arr_idx != DUK__NO_ARRAY_INDEX && arr_idx < DUK_HSTRING_GET_CHARLEN(h)) { goto fail_not_writable; } DUK_DDD(DUK_DDDPRINT("base object is a string, start lookup from string prototype")); curr = thr->builtins[DUK_BIDX_STRING_PROTOTYPE]; goto lookup; /* avoid double coercion */ } case DUK_TAG_OBJECT: { orig = DUK_TVAL_GET_OBJECT(tv_obj); DUK_ASSERT(orig != NULL); #if defined(DUK_USE_ROM_OBJECTS) /* With this check in place fast paths won't need read-only * object checks. This is technically incorrect if there are * setters that cause no writes to ROM objects, but current * built-ins don't have such setters. */ if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) orig)) { DUK_DD(DUK_DDPRINT("attempt to putprop on read-only target object")); goto fail_not_writable_no_pop; /* Must avoid duk_pop() in exit path */ } #endif /* The fast path for array property put is not fully compliant: * If one places conflicting number-indexed properties into * Array.prototype (for example, a non-writable Array.prototype[7]) * the fast path will incorrectly ignore them. * * This fast path could be made compliant by falling through * to the slow path if the previous value was UNUSED. This would * also remove the need to check for extensibility. Right now a * non-extensible array is slower than an extensible one as far * as writes are concerned. * * The fast path behavior is documented in more detail here: * tests/ecmascript/test-misc-array-fast-write.js */ /* XXX: array .length? */ #if defined(DUK_USE_ARRAY_PROP_FASTPATH) if (duk__putprop_shallow_fastpath_array_tval(thr, orig, tv_key, tv_val) != 0) { DUK_DDD(DUK_DDDPRINT("array fast path success")); DUK_STATS_INC(thr->heap, stats_putprop_arrayidx); return 1; } #endif #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) if (duk__putprop_fastpath_bufobj_tval(thr, orig, tv_key, tv_val) != 0) { DUK_DDD(DUK_DDDPRINT("base is bufobj, key is a number, bufobj fast path")); DUK_STATS_INC(thr->heap, stats_putprop_bufobjidx); return 1; } #endif #if defined(DUK_USE_ES6_PROXY) if (DUK_UNLIKELY(DUK_HOBJECT_IS_PROXY(orig))) { duk_hobject *h_target; duk_bool_t tmp_bool; if (duk__proxy_check_prop(thr, orig, DUK_STRIDX_SET, tv_key, &h_target)) { /* -> [ ... trap handler ] */ DUK_DDD(DUK_DDDPRINT("-> proxy object 'set' for key %!T", (duk_tval *) tv_key)); DUK_STATS_INC(thr->heap, stats_putprop_proxy); duk_push_hobject(thr, h_target); /* target */ duk_push_tval(thr, tv_key); /* P */ duk_push_tval(thr, tv_val); /* V */ duk_push_tval(thr, tv_obj); /* Receiver: Proxy object */ duk_call_method(thr, 4 /*nargs*/); tmp_bool = duk_to_boolean(thr, -1); duk_pop_nodecref_unsafe(thr); if (!tmp_bool) { goto fail_proxy_rejected; } /* Target object must be checked for a conflicting * non-configurable property. */ arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); DUK_ASSERT(key != NULL); if (duk__get_own_propdesc_raw(thr, h_target, key, arr_idx, &desc, DUK_GETDESC_FLAG_PUSH_VALUE)) { duk_tval *tv_targ = duk_require_tval(thr, -1); duk_bool_t datadesc_reject; duk_bool_t accdesc_reject; DUK_DDD(DUK_DDDPRINT("proxy 'set': target has matching property %!O, check for " "conflicting property; tv_val=%!T, tv_targ=%!T, desc.flags=0x%08lx, " "desc.get=%p, desc.set=%p", (duk_heaphdr *) key, (duk_tval *) tv_val, (duk_tval *) tv_targ, (unsigned long) desc.flags, (void *) desc.get, (void *) desc.set)); datadesc_reject = !(desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) && !(desc.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && !(desc.flags & DUK_PROPDESC_FLAG_WRITABLE) && !duk_js_samevalue(tv_val, tv_targ); accdesc_reject = (desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) && !(desc.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && (desc.set == NULL); if (datadesc_reject || accdesc_reject) { DUK_ERROR_TYPE(thr, DUK_STR_PROXY_REJECTED); } duk_pop_2_unsafe(thr); } else { duk_pop_unsafe(thr); } return 1; /* success */ } orig = h_target; /* resume write to target */ DUK_TVAL_SET_OBJECT(tv_obj, orig); } #endif /* DUK_USE_ES6_PROXY */ curr = orig; break; } case DUK_TAG_BUFFER: { duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv_obj); duk_int_t pop_count = 0; /* * Because buffer values may be looped over and read/written * from, an array index fast path is important. */ #if defined(DUK_USE_FASTINT) if (DUK_TVAL_IS_FASTINT(tv_key)) { arr_idx = duk__tval_fastint_to_arr_idx(tv_key); DUK_DDD(DUK_DDDPRINT("base object buffer, key is a fast-path fastint; arr_idx %ld", (long) arr_idx)); pop_count = 0; } else #endif if (DUK_TVAL_IS_NUMBER(tv_key)) { arr_idx = duk__tval_number_to_arr_idx(tv_key); DUK_DDD(DUK_DDDPRINT("base object buffer, key is a fast-path number; arr_idx %ld", (long) arr_idx)); pop_count = 0; } else { arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); DUK_ASSERT(key != NULL); DUK_DDD(DUK_DDDPRINT("base object buffer, key is a non-fast-path number; after " "coercion key is %!T, arr_idx %ld", (duk_tval *) duk_get_tval(thr, -1), (long) arr_idx)); pop_count = 1; } if (arr_idx != DUK__NO_ARRAY_INDEX && arr_idx < DUK_HBUFFER_GET_SIZE(h)) { duk_uint8_t *data; DUK_DDD(DUK_DDDPRINT("writing to buffer data at index %ld", (long) arr_idx)); data = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h); /* XXX: duk_to_int() ensures we'll get 8 lowest bits as * as input is within duk_int_t range (capped outside it). */ #if defined(DUK_USE_FASTINT) /* Buffer writes are often integers. */ if (DUK_TVAL_IS_FASTINT(tv_val)) { data[arr_idx] = (duk_uint8_t) DUK_TVAL_GET_FASTINT_U32(tv_val); } else #endif { duk_push_tval(thr, tv_val); data[arr_idx] = (duk_uint8_t) duk_to_uint32(thr, -1); pop_count++; } duk_pop_n_unsafe(thr, pop_count); DUK_DDD(DUK_DDDPRINT("result: success (buffer data write)")); DUK_STATS_INC(thr->heap, stats_putprop_bufferidx); return 1; } if (pop_count == 0) { /* This is a pretty awkward control flow, but we need to recheck the * key coercion here. */ arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); DUK_ASSERT(key != NULL); DUK_DDD(DUK_DDDPRINT("base object buffer, key is a non-fast-path number; after " "coercion key is %!T, arr_idx %ld", (duk_tval *) duk_get_tval(thr, -1), (long) arr_idx)); } if (key == DUK_HTHREAD_STRING_LENGTH(thr)) { goto fail_not_writable; } DUK_DDD(DUK_DDDPRINT("base object is a buffer, start lookup from Uint8Array prototype")); curr = thr->builtins[DUK_BIDX_UINT8ARRAY_PROTOTYPE]; goto lookup; /* avoid double coercion */ } case DUK_TAG_POINTER: { DUK_DDD(DUK_DDDPRINT("base object is a pointer, start lookup from pointer prototype")); curr = thr->builtins[DUK_BIDX_POINTER_PROTOTYPE]; break; } case DUK_TAG_LIGHTFUNC: { /* Lightfuncs have no own properties and are considered non-extensible. * However, the write may be captured by an inherited setter which * means we can't stop the lookup here. */ DUK_DDD(DUK_DDDPRINT("base object is a lightfunc, start lookup from function prototype")); curr = thr->builtins[DUK_BIDX_NATIVE_FUNCTION_PROTOTYPE]; break; } #if defined(DUK_USE_FASTINT) case DUK_TAG_FASTINT: #endif default: { /* number */ DUK_DDD(DUK_DDDPRINT("base object is a number, start lookup from number prototype")); DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_obj)); curr = thr->builtins[DUK_BIDX_NUMBER_PROTOTYPE]; break; } } DUK_ASSERT(key == NULL); arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); DUK_ASSERT(key != NULL); lookup: /* * Check whether the property already exists in the prototype chain. * Note that the actual write goes into the original base object * (except if an accessor property captures the write). */ /* [key] */ DUK_ASSERT(curr != NULL); sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY; do { if (!duk__get_own_propdesc_raw(thr, curr, key, arr_idx, &desc, 0 /*flags*/)) { /* don't push value */ goto next_in_chain; } if (desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) { /* * Found existing accessor property (own or inherited). * Call setter with 'this' set to orig, and value as the only argument. * Setter calls are OK even for ROM objects. * * Note: no exotic arguments object behavior, because [[Put]] never * calls [[DefineOwnProperty]] (E5 Section 8.12.5, step 5.b). */ duk_hobject *setter; DUK_DD(DUK_DDPRINT("put to an own or inherited accessor, calling setter")); setter = DUK_HOBJECT_E_GET_VALUE_SETTER(thr->heap, curr, desc.e_idx); if (!setter) { goto fail_no_setter; } duk_push_hobject(thr, setter); duk_push_tval(thr, tv_obj); /* note: original, uncoerced base */ duk_push_tval(thr, tv_val); /* [key setter this val] */ #if defined(DUK_USE_NONSTD_SETTER_KEY_ARGUMENT) duk_dup_m4(thr); duk_call_method(thr, 2); /* [key setter this val key] -> [key retval] */ #else duk_call_method(thr, 1); /* [key setter this val] -> [key retval] */ #endif duk_pop_unsafe(thr); /* ignore retval -> [key] */ goto success_no_arguments_exotic; } if (orig == NULL) { /* * Found existing own or inherited plain property, but original * base is a primitive value. */ DUK_DD(DUK_DDPRINT("attempt to create a new property in a primitive base object")); goto fail_base_primitive; } if (curr != orig) { /* * Found existing inherited plain property. * Do an access control check, and if OK, write * new property to 'orig'. */ if (!DUK_HOBJECT_HAS_EXTENSIBLE(orig)) { DUK_DD(DUK_DDPRINT("found existing inherited plain property, but original object is not extensible")); goto fail_not_extensible; } if (!(desc.flags & DUK_PROPDESC_FLAG_WRITABLE)) { DUK_DD(DUK_DDPRINT("found existing inherited plain property, original object is extensible, but inherited property is not writable")); goto fail_not_writable; } DUK_DD(DUK_DDPRINT("put to new property, object extensible, inherited property found and is writable")); goto create_new; } else { /* * Found existing own (non-inherited) plain property. * Do an access control check and update in place. */ if (!(desc.flags & DUK_PROPDESC_FLAG_WRITABLE)) { DUK_DD(DUK_DDPRINT("found existing own (non-inherited) plain property, but property is not writable")); goto fail_not_writable; } if (desc.flags & DUK_PROPDESC_FLAG_VIRTUAL) { DUK_DD(DUK_DDPRINT("found existing own (non-inherited) virtual property, property is writable")); if (DUK_HOBJECT_IS_ARRAY(curr)) { /* * Write to 'length' of an array is a very complex case * handled in a helper which updates both the array elements * and writes the new 'length'. The write may result in an * unconditional RangeError or a partial write (indicated * by a return code). * * Note: the helper has an unnecessary writability check * for 'length', we already know it is writable. */ DUK_ASSERT(key == DUK_HTHREAD_STRING_LENGTH(thr)); /* only virtual array property */ DUK_DDD(DUK_DDDPRINT("writing existing 'length' property to array exotic, invoke complex helper")); /* XXX: the helper currently assumes stack top contains new * 'length' value and the whole calling convention is not very * compatible with what we need. */ duk_push_tval(thr, tv_val); /* [key val] */ rc = duk__handle_put_array_length(thr, orig); duk_pop_unsafe(thr); /* [key val] -> [key] */ if (!rc) { goto fail_array_length_partial; } /* key is 'length', cannot match argument exotic behavior */ goto success_no_arguments_exotic; } #if defined(DUK_USE_BUFFEROBJECT_SUPPORT) else if (DUK_HOBJECT_IS_BUFOBJ(curr)) { duk_hbufobj *h_bufobj; duk_uint_t byte_off; duk_small_uint_t elem_size; h_bufobj = (duk_hbufobj *) curr; DUK_ASSERT_HBUFOBJ_VALID(h_bufobj); DUK_DD(DUK_DDPRINT("writable virtual property is in buffer object")); /* Careful with wrapping: arr_idx upshift may easily wrap, whereas * length downshift won't. */ if (arr_idx < (h_bufobj->length >> h_bufobj->shift) && DUK_HBUFOBJ_HAS_VIRTUAL_INDICES(h_bufobj)) { duk_uint8_t *data; DUK_DDD(DUK_DDDPRINT("writing to buffer data at index %ld", (long) arr_idx)); DUK_ASSERT(arr_idx != DUK__NO_ARRAY_INDEX); /* index/length check guarantees */ byte_off = arr_idx << h_bufobj->shift; /* no wrap assuming h_bufobj->length is valid */ elem_size = (duk_small_uint_t) (1U << h_bufobj->shift); /* Coerce to number before validating pointers etc so that the * number coercions in duk_hbufobj_validated_write() are * guaranteed to be side effect free and not invalidate the * pointer checks we do here. */ duk_push_tval(thr, tv_val); (void) duk_to_number_m1(thr); if (h_bufobj->buf != NULL && DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_bufobj, byte_off + elem_size)) { data = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufobj->buf) + h_bufobj->offset + byte_off; duk_hbufobj_validated_write(thr, h_bufobj, data, elem_size); } else { DUK_D(DUK_DPRINT("bufobj access out of underlying buffer, ignoring (write skipped)")); } duk_pop_unsafe(thr); goto success_no_arguments_exotic; } } #endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ DUK_D(DUK_DPRINT("should not happen, key %!O", key)); goto fail_internal; /* should not happen */ } DUK_DD(DUK_DDPRINT("put to existing own plain property, property is writable")); goto update_old; } DUK_UNREACHABLE(); next_in_chain: /* XXX: option to pretend property doesn't exist if sanity limit is * hit might be useful. */ if (DUK_UNLIKELY(sanity-- == 0)) { DUK_ERROR_RANGE(thr, DUK_STR_PROTOTYPE_CHAIN_LIMIT); } curr = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, curr); } while (curr != NULL); /* * Property not found in prototype chain. */ DUK_DDD(DUK_DDDPRINT("property not found in prototype chain")); if (orig == NULL) { DUK_DD(DUK_DDPRINT("attempt to create a new property in a primitive base object")); goto fail_base_primitive; } if (!DUK_HOBJECT_HAS_EXTENSIBLE(orig)) { DUK_DD(DUK_DDPRINT("put to a new property (not found in prototype chain), but original object not extensible")); goto fail_not_extensible; } goto create_new; update_old: /* * Update an existing property of the base object. */ /* [key] */ DUK_DDD(DUK_DDDPRINT("update an existing property of the original object")); DUK_ASSERT(orig != NULL); #if defined(DUK_USE_ROM_OBJECTS) /* This should not happen because DUK_TAG_OBJECT case checks * for this already, but check just in case. */ if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) orig)) { goto fail_not_writable; } #endif /* Although there are writable virtual properties (e.g. plain buffer * and buffer object number indices), they are handled before we come * here. */ DUK_ASSERT((desc.flags & DUK_PROPDESC_FLAG_VIRTUAL) == 0); DUK_ASSERT(desc.a_idx >= 0 || desc.e_idx >= 0); /* Array own property .length is handled above. */ DUK_ASSERT(!(DUK_HOBJECT_IS_ARRAY(orig) && key == DUK_HTHREAD_STRING_LENGTH(thr))); if (desc.e_idx >= 0) { tv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, orig, desc.e_idx); DUK_DDD(DUK_DDDPRINT("previous entry value: %!iT", (duk_tval *) tv)); DUK_TVAL_SET_TVAL_UPDREF(thr, tv, tv_val); /* side effects; e_idx may be invalidated */ /* don't touch property attributes or hash part */ DUK_DD(DUK_DDPRINT("put to an existing entry at index %ld -> new value %!iT", (long) desc.e_idx, (duk_tval *) tv)); } else { /* Note: array entries are always writable, so the writability check * above is pointless for them. The check could be avoided with some * refactoring but is probably not worth it. */ DUK_ASSERT(desc.a_idx >= 0); tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, orig, desc.a_idx); DUK_DDD(DUK_DDDPRINT("previous array value: %!iT", (duk_tval *) tv)); DUK_TVAL_SET_TVAL_UPDREF(thr, tv, tv_val); /* side effects; a_idx may be invalidated */ DUK_DD(DUK_DDPRINT("put to an existing array entry at index %ld -> new value %!iT", (long) desc.a_idx, (duk_tval *) tv)); } /* Regardless of whether property is found in entry or array part, * it may have arguments exotic behavior (array indices may reside * in entry part for abandoned / non-existent array parts). */ goto success_with_arguments_exotic; create_new: /* * Create a new property in the original object. * * Exotic properties need to be reconsidered here from a write * perspective (not just property attributes perspective). * However, the property does not exist in the object already, * so this limits the kind of exotic properties that apply. */ /* [key] */ DUK_DDD(DUK_DDDPRINT("create new property to original object")); DUK_ASSERT(orig != NULL); /* Array own property .length is handled above. */ DUK_ASSERT(!(DUK_HOBJECT_IS_ARRAY(orig) && key == DUK_HTHREAD_STRING_LENGTH(thr))); #if defined(DUK_USE_ROM_OBJECTS) /* This should not happen because DUK_TAG_OBJECT case checks * for this already, but check just in case. */ if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) orig)) { goto fail_not_writable; } #endif /* Not possible because array object 'length' is present * from its creation and cannot be deleted, and is thus * caught as an existing property above. */ DUK_ASSERT(!(DUK_HOBJECT_HAS_EXOTIC_ARRAY(orig) && key == DUK_HTHREAD_STRING_LENGTH(thr))); if (DUK_HOBJECT_HAS_EXOTIC_ARRAY(orig) && arr_idx != DUK__NO_ARRAY_INDEX) { /* automatic length update */ duk_uint32_t old_len; duk_harray *a; a = (duk_harray *) orig; DUK_ASSERT_HARRAY_VALID(a); old_len = a->length; if (arr_idx >= old_len) { DUK_DDD(DUK_DDDPRINT("write new array entry requires length update " "(arr_idx=%ld, old_len=%ld)", (long) arr_idx, (long) old_len)); if (DUK_HARRAY_LENGTH_NONWRITABLE(a)) { DUK_DD(DUK_DDPRINT("attempt to extend array, but array 'length' is not writable")); goto fail_not_writable; } /* Note: actual update happens once write has been completed * without error below. The write should always succeed * from a specification viewpoint, but we may e.g. run out * of memory. It's safer in this order. */ DUK_ASSERT(arr_idx != 0xffffffffUL); new_array_length = arr_idx + 1; /* flag for later write */ } else { DUK_DDD(DUK_DDDPRINT("write new array entry does not require length update " "(arr_idx=%ld, old_len=%ld)", (long) arr_idx, (long) old_len)); } } /* write_to_array_part: */ /* * Write to array part? * * Note: array abandonding requires a property resize which uses * 'rechecks' valstack for temporaries and may cause any existing * valstack pointers to be invalidated. To protect against this, * tv_obj, tv_key, and tv_val are copies of the original inputs. */ if (arr_idx != DUK__NO_ARRAY_INDEX && DUK_HOBJECT_HAS_ARRAY_PART(orig)) { if (arr_idx < DUK_HOBJECT_GET_ASIZE(orig)) { goto no_array_growth; } /* * Array needs to grow, but we don't want it becoming too sparse. * If it were to become sparse, abandon array part, moving all * array entries into the entries part (for good). * * Since we don't keep track of actual density (used vs. size) of * the array part, we need to estimate somehow. The check is made * in two parts: * * - Check whether the resize need is small compared to the * current size (relatively); if so, resize without further * checking (essentially we assume that the original part is * "dense" so that the result would be dense enough). * * - Otherwise, compute the resize using an actual density * measurement based on counting the used array entries. */ DUK_DDD(DUK_DDDPRINT("write to new array requires array resize, decide whether to do a " "fast resize without abandon check (arr_idx=%ld, old_size=%ld)", (long) arr_idx, (long) DUK_HOBJECT_GET_ASIZE(orig))); if (duk__abandon_array_slow_check_required(arr_idx, DUK_HOBJECT_GET_ASIZE(orig))) { duk_uint32_t old_used; duk_uint32_t old_size; DUK_DDD(DUK_DDDPRINT("=> fast check is NOT OK, do slow check for array abandon")); duk__compute_a_stats(thr, orig, &old_used, &old_size); DUK_DDD(DUK_DDDPRINT("abandon check, array stats: old_used=%ld, old_size=%ld, arr_idx=%ld", (long) old_used, (long) old_size, (long) arr_idx)); /* Note: intentionally use approximations to shave a few instructions: * a_used = old_used (accurate: old_used + 1) * a_size = arr_idx (accurate: arr_idx + 1) */ if (duk__abandon_array_density_check(old_used, arr_idx)) { DUK_DD(DUK_DDPRINT("write to new array entry beyond current length, " "decided to abandon array part (would become too sparse)")); /* abandoning requires a props allocation resize and * 'rechecks' the valstack, invalidating any existing * valstack value pointers! */ duk__abandon_array_checked(thr, orig); DUK_ASSERT(!DUK_HOBJECT_HAS_ARRAY_PART(orig)); goto write_to_entry_part; } DUK_DDD(DUK_DDDPRINT("=> decided to keep array part")); } else { DUK_DDD(DUK_DDDPRINT("=> fast resize is OK")); } DUK_DD(DUK_DDPRINT("write to new array entry beyond current length, " "decided to extend current allocation")); duk__grow_props_for_array_item(thr, orig, arr_idx); no_array_growth: /* Note: assume array part is comprehensive, so that either * the write goes to the array part, or we've abandoned the * array above (and will not come here). */ DUK_ASSERT(DUK_HOBJECT_HAS_ARRAY_PART(orig)); DUK_ASSERT(arr_idx < DUK_HOBJECT_GET_ASIZE(orig)); tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, orig, arr_idx); /* prev value must be unused, no decref */ DUK_ASSERT(DUK_TVAL_IS_UNUSED(tv)); DUK_TVAL_SET_TVAL(tv, tv_val); DUK_TVAL_INCREF(thr, tv); DUK_DD(DUK_DDPRINT("put to new array entry: %ld -> %!T", (long) arr_idx, (duk_tval *) tv)); /* Note: array part values are [[Writable]], [[Enumerable]], * and [[Configurable]] which matches the required attributes * here. */ goto entry_updated; } write_to_entry_part: /* * Write to entry part */ /* entry allocation updates hash part and increases the key * refcount; may need a props allocation resize but doesn't * 'recheck' the valstack. */ e_idx = duk__hobject_alloc_entry_checked(thr, orig, key); DUK_ASSERT(e_idx >= 0); tv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, orig, e_idx); /* prev value can be garbage, no decref */ DUK_TVAL_SET_TVAL(tv, tv_val); DUK_TVAL_INCREF(thr, tv); DUK_HOBJECT_E_SET_FLAGS(thr->heap, orig, e_idx, DUK_PROPDESC_FLAGS_WEC); goto entry_updated; entry_updated: /* * Possible pending array length update, which must only be done * if the actual entry write succeeded. */ if (new_array_length > 0) { /* Note: zero works as a "no update" marker because the new length * can never be zero after a new property is written. */ DUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_ARRAY(orig)); DUK_DDD(DUK_DDDPRINT("write successful, pending array length update to: %ld", (long) new_array_length)); ((duk_harray *) orig)->length = new_array_length; } /* * Arguments exotic behavior not possible for new properties: all * magically bound properties are initially present in the arguments * object, and if they are deleted, the binding is also removed from * parameter map. */ goto success_no_arguments_exotic; success_with_arguments_exotic: /* * Arguments objects have exotic [[DefineOwnProperty]] which updates * the internal 'map' of arguments for writes to currently mapped * arguments. More conretely, writes to mapped arguments generate * a write to a bound variable. * * The [[Put]] algorithm invokes [[DefineOwnProperty]] for existing * data properties and new properties, but not for existing accessors. * Hence, in E5 Section 10.6 ([[DefinedOwnProperty]] algorithm), we * have a Desc with 'Value' (and possibly other properties too), and * we end up in step 5.b.i. */ if (arr_idx != DUK__NO_ARRAY_INDEX && DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(orig)) { /* Note: only numbered indices are relevant, so arr_idx fast reject * is good (this is valid unless there are more than 4**32-1 arguments). */ DUK_DDD(DUK_DDDPRINT("putprop successful, arguments exotic behavior needed")); /* Note: we can reuse 'desc' here */ /* XXX: top of stack must contain value, which helper doesn't touch, * rework to use tv_val directly? */ duk_push_tval(thr, tv_val); (void) duk__check_arguments_map_for_put(thr, orig, key, &desc, throw_flag); duk_pop_unsafe(thr); } /* fall thru */ success_no_arguments_exotic: /* shared exit path now */ DUK_DDD(DUK_DDDPRINT("result: success")); duk_pop_unsafe(thr); /* remove key */ return 1; #if defined(DUK_USE_ES6_PROXY) fail_proxy_rejected: DUK_DDD(DUK_DDDPRINT("result: error, proxy rejects")); if (throw_flag) { DUK_ERROR_TYPE(thr, DUK_STR_PROXY_REJECTED); } /* Note: no key on stack */ return 0; #endif fail_base_primitive: DUK_DDD(DUK_DDDPRINT("result: error, base primitive")); if (throw_flag) { #if defined(DUK_USE_PARANOID_ERRORS) DUK_ERROR_TYPE(thr, DUK_STR_INVALID_BASE); #else DUK_ERROR_FMT2(thr, DUK_ERR_TYPE_ERROR, "cannot write property %s of %s", duk_push_string_tval_readable(thr, tv_key), duk_push_string_tval_readable(thr, tv_obj)); #endif } duk_pop_unsafe(thr); /* remove key */ return 0; fail_not_extensible: DUK_DDD(DUK_DDDPRINT("result: error, not extensible")); if (throw_flag) { DUK_ERROR_TYPE(thr, DUK_STR_NOT_EXTENSIBLE); } duk_pop_unsafe(thr); /* remove key */ return 0; fail_not_writable: DUK_DDD(DUK_DDDPRINT("result: error, not writable")); if (throw_flag) { DUK_ERROR_TYPE(thr, DUK_STR_NOT_WRITABLE); } duk_pop_unsafe(thr); /* remove key */ return 0; #if defined(DUK_USE_ROM_OBJECTS) fail_not_writable_no_pop: DUK_DDD(DUK_DDDPRINT("result: error, not writable")); if (throw_flag) { DUK_ERROR_TYPE(thr, DUK_STR_NOT_WRITABLE); } return 0; #endif fail_array_length_partial: DUK_DD(DUK_DDPRINT("result: error, array length write only partially successful")); if (throw_flag) { DUK_ERROR_TYPE(thr, DUK_STR_NOT_CONFIGURABLE); } duk_pop_unsafe(thr); /* remove key */ return 0; fail_no_setter: DUK_DDD(DUK_DDDPRINT("result: error, accessor property without setter")); if (throw_flag) { DUK_ERROR_TYPE(thr, DUK_STR_SETTER_UNDEFINED); } duk_pop_unsafe(thr); /* remove key */ return 0; fail_internal: DUK_DDD(DUK_DDDPRINT("result: error, internal")); if (throw_flag) { DUK_ERROR_INTERNAL(thr); } duk_pop_unsafe(thr); /* remove key */ return 0; } /* * Ecmascript compliant [[Delete]](P, Throw). */ DUK_INTERNAL duk_bool_t duk_hobject_delprop_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_small_uint_t flags) { duk_propdesc desc; duk_tval *tv; duk_uint32_t arr_idx; duk_bool_t throw_flag; duk_bool_t force_flag; throw_flag = (flags & DUK_DELPROP_FLAG_THROW); force_flag = (flags & DUK_DELPROP_FLAG_FORCE); DUK_DDD(DUK_DDDPRINT("delprop_raw: thr=%p, obj=%p, key=%p, throw=%ld, force=%ld (obj -> %!O, key -> %!O)", (void *) thr, (void *) obj, (void *) key, (long) throw_flag, (long) force_flag, (duk_heaphdr *) obj, (duk_heaphdr *) key)); DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->heap != NULL); DUK_ASSERT(obj != NULL); DUK_ASSERT(key != NULL); DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); arr_idx = DUK_HSTRING_GET_ARRIDX_FAST(key); /* 0 = don't push current value */ if (!duk__get_own_propdesc_raw(thr, obj, key, arr_idx, &desc, 0 /*flags*/)) { /* don't push value */ DUK_DDD(DUK_DDDPRINT("property not found, succeed always")); goto success; } #if defined(DUK_USE_ROM_OBJECTS) if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)) { DUK_DD(DUK_DDPRINT("attempt to delprop on read-only target object")); goto fail_not_configurable; } #endif if ((desc.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) == 0 && !force_flag) { goto fail_not_configurable; } if (desc.a_idx < 0 && desc.e_idx < 0) { /* Currently there are no deletable virtual properties, but * with force_flag we might attempt to delete one. */ DUK_DD(DUK_DDPRINT("delete failed: property found, force flag, but virtual (and implicitly non-configurable)")); goto fail_virtual; } if (desc.a_idx >= 0) { DUK_ASSERT(desc.e_idx < 0); tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, desc.a_idx); DUK_TVAL_SET_UNUSED_UPDREF(thr, tv); /* side effects */ goto success; } else { DUK_ASSERT(desc.a_idx < 0); /* remove hash entry (no decref) */ #if defined(DUK_USE_HOBJECT_HASH_PART) if (desc.h_idx >= 0) { duk_uint32_t *h_base = DUK_HOBJECT_H_GET_BASE(thr->heap, obj); DUK_DDD(DUK_DDDPRINT("removing hash entry at h_idx %ld", (long) desc.h_idx)); DUK_ASSERT(DUK_HOBJECT_GET_HSIZE(obj) > 0); DUK_ASSERT((duk_uint32_t) desc.h_idx < DUK_HOBJECT_GET_HSIZE(obj)); h_base[desc.h_idx] = DUK__HASH_DELETED; } else { DUK_ASSERT(DUK_HOBJECT_GET_HSIZE(obj) == 0); } #else DUK_ASSERT(DUK_HOBJECT_GET_HSIZE(obj) == 0); #endif /* Remove value. This requires multiple writes so avoid side * effects via no-refzero macros so that e_idx is not * invalidated. */ DUK_DDD(DUK_DDDPRINT("before removing value, e_idx %ld, key %p, key at slot %p", (long) desc.e_idx, (void *) key, (void *) DUK_HOBJECT_E_GET_KEY(thr->heap, obj, desc.e_idx))); DUK_DDD(DUK_DDDPRINT("removing value at e_idx %ld", (long) desc.e_idx)); if (DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, obj, desc.e_idx)) { duk_hobject *tmp; tmp = DUK_HOBJECT_E_GET_VALUE_GETTER(thr->heap, obj, desc.e_idx); DUK_HOBJECT_E_SET_VALUE_GETTER(thr->heap, obj, desc.e_idx, NULL); DUK_UNREF(tmp); DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, tmp); tmp = DUK_HOBJECT_E_GET_VALUE_SETTER(thr->heap, obj, desc.e_idx); DUK_HOBJECT_E_SET_VALUE_SETTER(thr->heap, obj, desc.e_idx, NULL); DUK_UNREF(tmp); DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, tmp); } else { tv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, desc.e_idx); DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ(thr, tv); } #if 0 /* Not strictly necessary because if key == NULL, flag MUST be ignored. */ DUK_HOBJECT_E_SET_FLAGS(thr->heap, obj, desc.e_idx, 0); #endif /* Remove key. */ DUK_DDD(DUK_DDDPRINT("before removing key, e_idx %ld, key %p, key at slot %p", (long) desc.e_idx, (void *) key, (void *) DUK_HOBJECT_E_GET_KEY(thr->heap, obj, desc.e_idx))); DUK_DDD(DUK_DDDPRINT("removing key at e_idx %ld", (long) desc.e_idx)); DUK_ASSERT(key == DUK_HOBJECT_E_GET_KEY(thr->heap, obj, desc.e_idx)); DUK_HOBJECT_E_SET_KEY(thr->heap, obj, desc.e_idx, NULL); DUK_HSTRING_DECREF_NORZ(thr, key); /* Trigger refzero side effects only when we're done as a * finalizer might operate on the object and affect the * e_idx we're supposed to use. */ DUK_REFZERO_CHECK_SLOW(thr); goto success; } DUK_UNREACHABLE(); success: /* * Argument exotic [[Delete]] behavior (E5 Section 10.6) is * a post-check, keeping arguments internal 'map' in sync with * any successful deletes (note that property does not need to * exist for delete to 'succeed'). * * Delete key from 'map'. Since 'map' only contains array index * keys, we can use arr_idx for a fast skip. */ DUK_DDD(DUK_DDDPRINT("delete successful, check for arguments exotic behavior")); if (arr_idx != DUK__NO_ARRAY_INDEX && DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj)) { /* Note: only numbered indices are relevant, so arr_idx fast reject * is good (this is valid unless there are more than 4**32-1 arguments). */ DUK_DDD(DUK_DDDPRINT("delete successful, arguments exotic behavior needed")); /* Note: we can reuse 'desc' here */ (void) duk__check_arguments_map_for_delete(thr, obj, key, &desc); } DUK_DDD(DUK_DDDPRINT("delete successful")); return 1; fail_virtual: /* just use the same "not configurable" error message */ fail_not_configurable: DUK_DDD(DUK_DDDPRINT("delete failed: property found, not configurable")); if (throw_flag) { DUK_ERROR_TYPE(thr, DUK_STR_NOT_CONFIGURABLE); } return 0; } /* * DELPROP: Ecmascript property deletion. */ DUK_INTERNAL duk_bool_t duk_hobject_delprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key, duk_bool_t throw_flag) { duk_hstring *key = NULL; #if defined(DUK_USE_ES6_PROXY) duk_propdesc desc; #endif duk_int_t entry_top; duk_uint32_t arr_idx = DUK__NO_ARRAY_INDEX; duk_bool_t rc; DUK_DDD(DUK_DDDPRINT("delprop: thr=%p, obj=%p, key=%p (obj -> %!T, key -> %!T)", (void *) thr, (void *) tv_obj, (void *) tv_key, (duk_tval *) tv_obj, (duk_tval *) tv_key)); DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->heap != NULL); DUK_ASSERT(tv_obj != NULL); DUK_ASSERT(tv_key != NULL); DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); /* Storing the entry top is cheaper here to ensure stack is correct at exit, * as there are several paths out. */ entry_top = duk_get_top(thr); if (DUK_TVAL_IS_UNDEFINED(tv_obj) || DUK_TVAL_IS_NULL(tv_obj)) { DUK_DDD(DUK_DDDPRINT("base object is undefined or null -> reject")); goto fail_invalid_base_uncond; } duk_push_tval(thr, tv_obj); duk_push_tval(thr, tv_key); tv_obj = DUK_GET_TVAL_NEGIDX(thr, -2); if (DUK_TVAL_IS_OBJECT(tv_obj)) { duk_hobject *obj = DUK_TVAL_GET_OBJECT(tv_obj); DUK_ASSERT(obj != NULL); #if defined(DUK_USE_ES6_PROXY) if (DUK_UNLIKELY(DUK_HOBJECT_IS_PROXY(obj))) { duk_hobject *h_target; duk_bool_t tmp_bool; /* Note: proxy handling must happen before key is string coerced. */ if (duk__proxy_check_prop(thr, obj, DUK_STRIDX_DELETE_PROPERTY, tv_key, &h_target)) { /* -> [ ... obj key trap handler ] */ DUK_DDD(DUK_DDDPRINT("-> proxy object 'deleteProperty' for key %!T", (duk_tval *) tv_key)); duk_push_hobject(thr, h_target); /* target */ duk_dup_m4(thr); /* P */ duk_call_method(thr, 2 /*nargs*/); tmp_bool = duk_to_boolean(thr, -1); duk_pop_nodecref_unsafe(thr); if (!tmp_bool) { goto fail_proxy_rejected; /* retval indicates delete failed */ } /* Target object must be checked for a conflicting * non-configurable property. */ tv_key = DUK_GET_TVAL_NEGIDX(thr, -1); arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); DUK_ASSERT(key != NULL); if (duk__get_own_propdesc_raw(thr, h_target, key, arr_idx, &desc, 0 /*flags*/)) { /* don't push value */ duk_small_int_t desc_reject; DUK_DDD(DUK_DDDPRINT("proxy 'deleteProperty': target has matching property %!O, check for " "conflicting property; desc.flags=0x%08lx, " "desc.get=%p, desc.set=%p", (duk_heaphdr *) key, (unsigned long) desc.flags, (void *) desc.get, (void *) desc.set)); desc_reject = !(desc.flags & DUK_PROPDESC_FLAG_CONFIGURABLE); if (desc_reject) { /* unconditional */ DUK_ERROR_TYPE(thr, DUK_STR_PROXY_REJECTED); } } rc = 1; /* success */ goto done_rc; } obj = h_target; /* resume delete to target */ } #endif /* DUK_USE_ES6_PROXY */ arr_idx = duk__to_property_key(thr, -1, &key); DUK_ASSERT(key != NULL); rc = duk_hobject_delprop_raw(thr, obj, key, throw_flag ? DUK_DELPROP_FLAG_THROW : 0); goto done_rc; } else if (DUK_TVAL_IS_STRING(tv_obj)) { /* String has .length and array index virtual properties * which can't be deleted. No need for a symbol check; * no offending virtual symbols exist. */ /* XXX: unnecessary string coercion for array indices, * intentional to keep small. */ duk_hstring *h = DUK_TVAL_GET_STRING(tv_obj); DUK_ASSERT(h != NULL); arr_idx = duk__to_property_key(thr, -1, &key); DUK_ASSERT(key != NULL); if (key == DUK_HTHREAD_STRING_LENGTH(thr)) { goto fail_not_configurable; } if (arr_idx != DUK__NO_ARRAY_INDEX && arr_idx < DUK_HSTRING_GET_CHARLEN(h)) { goto fail_not_configurable; } } else if (DUK_TVAL_IS_BUFFER(tv_obj)) { /* XXX: unnecessary string coercion for array indices, * intentional to keep small; some overlap with string * handling. */ duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv_obj); DUK_ASSERT(h != NULL); arr_idx = duk__to_property_key(thr, -1, &key); DUK_ASSERT(key != NULL); if (key == DUK_HTHREAD_STRING_LENGTH(thr)) { goto fail_not_configurable; } if (arr_idx != DUK__NO_ARRAY_INDEX && arr_idx < DUK_HBUFFER_GET_SIZE(h)) { goto fail_not_configurable; } } else if (DUK_TVAL_IS_LIGHTFUNC(tv_obj)) { /* Lightfunc has no virtual properties since Duktape 2.2 * so success. Still must coerce key for side effects. */ arr_idx = duk__to_property_key(thr, -1, &key); DUK_ASSERT(key != NULL); DUK_UNREF(key); } /* non-object base, no offending virtual property */ rc = 1; goto done_rc; done_rc: duk_set_top_unsafe(thr, entry_top); return rc; fail_invalid_base_uncond: /* Note: unconditional throw */ DUK_ASSERT(duk_get_top(thr) == entry_top); #if defined(DUK_USE_PARANOID_ERRORS) DUK_ERROR_TYPE(thr, DUK_STR_INVALID_BASE); #else DUK_ERROR_FMT2(thr, DUK_ERR_TYPE_ERROR, "cannot delete property %s of %s", duk_push_string_tval_readable(thr, tv_key), duk_push_string_tval_readable(thr, tv_obj)); #endif return 0; #if defined(DUK_USE_ES6_PROXY) fail_proxy_rejected: if (throw_flag) { DUK_ERROR_TYPE(thr, DUK_STR_PROXY_REJECTED); } duk_set_top_unsafe(thr, entry_top); return 0; #endif fail_not_configurable: if (throw_flag) { DUK_ERROR_TYPE(thr, DUK_STR_NOT_CONFIGURABLE); } duk_set_top_unsafe(thr, entry_top); return 0; } /* * Internal helper to define a property with specific flags, ignoring * normal semantics such as extensibility, write protection etc. * Overwrites any existing value and attributes unless caller requests * that value only be updated if it doesn't already exists. * * Does not support: * - virtual properties (error if write attempted) * - getter/setter properties (error if write attempted) * - non-default (!= WEC) attributes for array entries (error if attempted) * - array abandoning: if array part exists, it is always extended * - array 'length' updating * * Stack: [... in_val] -> [] * * Used for e.g. built-in initialization and environment record * operations. */ DUK_INTERNAL void duk_hobject_define_property_internal(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_small_uint_t flags) { duk_propdesc desc; duk_uint32_t arr_idx; duk_int_t e_idx; duk_tval *tv1 = NULL; duk_tval *tv2 = NULL; duk_small_uint_t propflags = flags & DUK_PROPDESC_FLAGS_MASK; /* mask out flags not actually stored */ DUK_DDD(DUK_DDDPRINT("define new property (internal): thr=%p, obj=%!O, key=%!O, flags=0x%02lx, val=%!T", (void *) thr, (duk_heaphdr *) obj, (duk_heaphdr *) key, (unsigned long) flags, (duk_tval *) duk_get_tval(thr, -1))); DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->heap != NULL); DUK_ASSERT(obj != NULL); DUK_ASSERT(key != NULL); DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)); DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); DUK_ASSERT(duk_is_valid_index(thr, -1)); /* contains value */ arr_idx = DUK_HSTRING_GET_ARRIDX_SLOW(key); if (duk__get_own_propdesc_raw(thr, obj, key, arr_idx, &desc, 0 /*flags*/)) { /* don't push value */ if (desc.e_idx >= 0) { if (flags & DUK_PROPDESC_FLAG_NO_OVERWRITE) { DUK_DDD(DUK_DDDPRINT("property already exists in the entry part -> skip as requested")); goto pop_exit; } DUK_DDD(DUK_DDDPRINT("property already exists in the entry part -> update value and attributes")); if (DUK_UNLIKELY(DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, obj, desc.e_idx))) { DUK_D(DUK_DPRINT("existing property is an accessor, not supported")); goto error_internal; } DUK_HOBJECT_E_SET_FLAGS(thr->heap, obj, desc.e_idx, propflags); tv1 = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, desc.e_idx); } else if (desc.a_idx >= 0) { if (flags & DUK_PROPDESC_FLAG_NO_OVERWRITE) { DUK_DDD(DUK_DDDPRINT("property already exists in the array part -> skip as requested")); goto pop_exit; } DUK_DDD(DUK_DDDPRINT("property already exists in the array part -> update value (assert attributes)")); if (propflags != DUK_PROPDESC_FLAGS_WEC) { DUK_D(DUK_DPRINT("existing property in array part, but propflags not WEC (0x%02lx)", (unsigned long) propflags)); goto error_internal; } tv1 = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, desc.a_idx); } else { if (flags & DUK_PROPDESC_FLAG_NO_OVERWRITE) { DUK_DDD(DUK_DDDPRINT("property already exists but is virtual -> skip as requested")); goto pop_exit; } if (key == DUK_HTHREAD_STRING_LENGTH(thr) && DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)) { duk_uint32_t new_len; #if defined(DUK_USE_DEBUG) duk_uint32_t prev_len; prev_len = ((duk_harray *) obj)->length; #endif new_len = duk__to_new_array_length_checked(thr, DUK_GET_TVAL_NEGIDX(thr, -1)); ((duk_harray *) obj)->length = new_len; DUK_D(DUK_DPRINT("internal define property for array .length: %ld -> %ld", (long) prev_len, (long) ((duk_harray *) obj)->length)); goto pop_exit; } DUK_DD(DUK_DDPRINT("property already exists but is virtual -> failure")); goto error_virtual; } goto write_value; } if (DUK_HOBJECT_HAS_ARRAY_PART(obj)) { if (arr_idx != DUK__NO_ARRAY_INDEX) { DUK_DDD(DUK_DDDPRINT("property does not exist, object has array part -> possibly extend array part and write value (assert attributes)")); DUK_ASSERT(propflags == DUK_PROPDESC_FLAGS_WEC); /* always grow the array, no sparse / abandon support here */ if (arr_idx >= DUK_HOBJECT_GET_ASIZE(obj)) { duk__grow_props_for_array_item(thr, obj, arr_idx); } DUK_ASSERT(arr_idx < DUK_HOBJECT_GET_ASIZE(obj)); tv1 = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, arr_idx); goto write_value; } } DUK_DDD(DUK_DDDPRINT("property does not exist, object belongs in entry part -> allocate new entry and write value and attributes")); e_idx = duk__hobject_alloc_entry_checked(thr, obj, key); /* increases key refcount */ DUK_ASSERT(e_idx >= 0); DUK_HOBJECT_E_SET_FLAGS(thr->heap, obj, e_idx, propflags); tv1 = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, e_idx); /* new entry: previous value is garbage; set to undefined to share write_value */ DUK_TVAL_SET_UNDEFINED(tv1); goto write_value; write_value: /* tv1 points to value storage */ tv2 = duk_require_tval(thr, -1); /* late lookup, avoid side effects */ DUK_DDD(DUK_DDDPRINT("writing/updating value: %!T -> %!T", (duk_tval *) tv1, (duk_tval *) tv2)); DUK_TVAL_SET_TVAL_UPDREF(thr, tv1, tv2); /* side effects */ goto pop_exit; pop_exit: duk_pop_unsafe(thr); /* remove in_val */ return; error_virtual: /* share error message */ error_internal: DUK_ERROR_INTERNAL(thr); return; } /* * Fast path for defining array indexed values without interning the key. * This is used by e.g. code for Array prototype and traceback creation so * must avoid interning. */ DUK_INTERNAL void duk_hobject_define_property_internal_arridx(duk_hthread *thr, duk_hobject *obj, duk_uarridx_t arr_idx, duk_small_uint_t flags) { duk_hstring *key; duk_tval *tv1, *tv2; DUK_DDD(DUK_DDDPRINT("define new property (internal) arr_idx fast path: thr=%p, obj=%!O, " "arr_idx=%ld, flags=0x%02lx, val=%!T", (void *) thr, obj, (long) arr_idx, (unsigned long) flags, (duk_tval *) duk_get_tval(thr, -1))); DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->heap != NULL); DUK_ASSERT(obj != NULL); DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)); if (DUK_HOBJECT_HAS_ARRAY_PART(obj) && arr_idx != DUK__NO_ARRAY_INDEX && flags == DUK_PROPDESC_FLAGS_WEC) { DUK_ASSERT((flags & DUK_PROPDESC_FLAG_NO_OVERWRITE) == 0); /* covered by comparison */ DUK_DDD(DUK_DDDPRINT("define property to array part (property may or may not exist yet)")); /* always grow the array, no sparse / abandon support here */ if (arr_idx >= DUK_HOBJECT_GET_ASIZE(obj)) { duk__grow_props_for_array_item(thr, obj, arr_idx); } DUK_ASSERT(arr_idx < DUK_HOBJECT_GET_ASIZE(obj)); tv1 = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, arr_idx); tv2 = duk_require_tval(thr, -1); DUK_TVAL_SET_TVAL_UPDREF(thr, tv1, tv2); /* side effects */ duk_pop_unsafe(thr); /* [ ...val ] -> [ ... ] */ return; } DUK_DDD(DUK_DDDPRINT("define property fast path didn't work, use slow path")); key = duk_push_uint_to_hstring(thr, (duk_uint_t) arr_idx); DUK_ASSERT(key != NULL); duk_insert(thr, -2); /* [ ... val key ] -> [ ... key val ] */ duk_hobject_define_property_internal(thr, obj, key, flags); duk_pop_unsafe(thr); /* [ ... key ] -> [ ... ] */ } /* * Internal helpers for managing object 'length' */ DUK_INTERNAL duk_size_t duk_hobject_get_length(duk_hthread *thr, duk_hobject *obj) { duk_double_t val; DUK_ASSERT_CTX_VALID(thr); DUK_ASSERT(obj != NULL); /* Fast path for Arrays. */ if (DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)) { return ((duk_harray *) obj)->length; } /* Slow path, .length can be e.g. accessor, obj can be a Proxy, etc. */ duk_push_hobject(thr, obj); duk_push_hstring_stridx(thr, DUK_STRIDX_LENGTH); (void) duk_hobject_getprop(thr, DUK_GET_TVAL_NEGIDX(thr, -2), DUK_GET_TVAL_NEGIDX(thr, -1)); val = duk_to_number_m1(thr); duk_pop_3_unsafe(thr); /* This isn't part of Ecmascript semantics; return a value within * duk_size_t range, or 0 otherwise. */ if (val >= 0.0 && val <= (duk_double_t) DUK_SIZE_MAX) { return (duk_size_t) val; } return 0; } /* * Fast finalizer check for an object. Walks the prototype chain, checking * for finalizer presence using DUK_HOBJECT_FLAG_HAVE_FINALIZER which is kept * in sync with the actual property when setting/removing the finalizer. */ #if defined(DUK_USE_HEAPPTR16) DUK_INTERNAL duk_bool_t duk_hobject_has_finalizer_fast_raw(duk_heap *heap, duk_hobject *obj) { #else DUK_INTERNAL duk_bool_t duk_hobject_has_finalizer_fast_raw(duk_hobject *obj) { #endif duk_uint_t sanity; DUK_ASSERT(obj != NULL); sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY; do { if (DUK_UNLIKELY(DUK_HOBJECT_HAS_HAVE_FINALIZER(obj))) { return 1; } if (DUK_UNLIKELY(sanity-- == 0)) { DUK_D(DUK_DPRINT("prototype loop when checking for finalizer existence; returning false")); return 0; } #if defined(DUK_USE_HEAPPTR16) DUK_ASSERT(heap != NULL); obj = DUK_HOBJECT_GET_PROTOTYPE(heap, obj); #else obj = DUK_HOBJECT_GET_PROTOTYPE(NULL, obj); /* 'heap' arg ignored */ #endif } while (obj != NULL); return 0; } /* * Object.getOwnPropertyDescriptor() (E5 Sections 15.2.3.3, 8.10.4) * * [ ... key ] -> [ ... desc/undefined ] */ DUK_INTERNAL void duk_hobject_object_get_own_property_descriptor(duk_hthread *thr, duk_idx_t obj_idx) { duk_hobject *obj; duk_hstring *key; duk_propdesc pd; DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->heap != NULL); obj = duk_require_hobject_promote_mask(thr, obj_idx, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER); key = duk_to_property_key_hstring(thr, -1); DUK_ASSERT(key != NULL); DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); if (!duk_hobject_get_own_propdesc(thr, obj, key, &pd, DUK_GETDESC_FLAG_PUSH_VALUE)) { duk_push_undefined(thr); duk_remove_m2(thr); return; } duk_push_object(thr); /* [ ... key value desc ] */ if (DUK_PROPDESC_IS_ACCESSOR(&pd)) { /* If a setter/getter is missing (undefined), the descriptor must * still have the property present with the value 'undefined'. */ if (pd.get) { duk_push_hobject(thr, pd.get); } else { duk_push_undefined(thr); } duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_GET); if (pd.set) { duk_push_hobject(thr, pd.set); } else { duk_push_undefined(thr); } duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_SET); } else { duk_dup_m2(thr); duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_VALUE); duk_push_boolean(thr, DUK_PROPDESC_IS_WRITABLE(&pd)); duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_WRITABLE); } duk_push_boolean(thr, DUK_PROPDESC_IS_ENUMERABLE(&pd)); duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_ENUMERABLE); duk_push_boolean(thr, DUK_PROPDESC_IS_CONFIGURABLE(&pd)); duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_CONFIGURABLE); /* [ ... key value desc ] */ duk_replace(thr, -3); duk_pop_unsafe(thr); /* -> [ ... desc ] */ } /* * NormalizePropertyDescriptor() related helper. * * Internal helper which validates and normalizes a property descriptor * represented as an Ecmascript object (e.g. argument to defineProperty()). * The output of this conversion is a set of defprop_flags and possibly * some values pushed on the value stack to (1) ensure borrowed pointers * remain valid, and (2) avoid unnecessary pops for footprint reasons. * Caller must manage stack top carefully because the number of values * pushed depends on the input property descriptor. * * The original descriptor object must not be altered in the process. */ /* XXX: very basic optimization -> duk_get_prop_stridx_top */ DUK_INTERNAL void duk_hobject_prepare_property_descriptor(duk_hthread *thr, duk_idx_t idx_in, duk_uint_t *out_defprop_flags, duk_idx_t *out_idx_value, duk_hobject **out_getter, duk_hobject **out_setter) { duk_idx_t idx_value = -1; duk_hobject *getter = NULL; duk_hobject *setter = NULL; duk_bool_t is_data_desc = 0; duk_bool_t is_acc_desc = 0; duk_uint_t defprop_flags = 0; DUK_ASSERT(out_defprop_flags != NULL); DUK_ASSERT(out_idx_value != NULL); DUK_ASSERT(out_getter != NULL); DUK_ASSERT(out_setter != NULL); DUK_ASSERT(idx_in <= 0x7fffL); /* short variants would be OK, but not used to avoid shifts */ /* Must be an object, otherwise TypeError (E5.1 Section 8.10.5, step 1). */ idx_in = duk_require_normalize_index(thr, idx_in); (void) duk_require_hobject(thr, idx_in); /* The coercion order must match the ToPropertyDescriptor() algorithm * so that side effects in coercion happen in the correct order. * (This order also happens to be compatible with duk_def_prop(), * although it doesn't matter in practice.) */ if (duk_get_prop_stridx(thr, idx_in, DUK_STRIDX_VALUE)) { is_data_desc = 1; defprop_flags |= DUK_DEFPROP_HAVE_VALUE; idx_value = duk_get_top_index(thr); } if (duk_get_prop_stridx(thr, idx_in, DUK_STRIDX_WRITABLE)) { is_data_desc = 1; if (duk_to_boolean(thr, -1)) { defprop_flags |= DUK_DEFPROP_HAVE_WRITABLE | DUK_DEFPROP_WRITABLE; } else { defprop_flags |= DUK_DEFPROP_HAVE_WRITABLE; } } if (duk_get_prop_stridx(thr, idx_in, DUK_STRIDX_GET)) { duk_tval *tv = duk_require_tval(thr, -1); duk_hobject *h_get; if (DUK_TVAL_IS_UNDEFINED(tv)) { /* undefined is accepted */ DUK_ASSERT(getter == NULL); } else { /* NOTE: lightfuncs are coerced to full functions because * lightfuncs don't fit into a property value slot. This * has some side effects, see test-dev-lightfunc-accessor.js. */ h_get = duk_get_hobject_promote_lfunc(thr, -1); if (h_get == NULL || !DUK_HOBJECT_IS_CALLABLE(h_get)) { goto type_error; } getter = h_get; } is_acc_desc = 1; defprop_flags |= DUK_DEFPROP_HAVE_GETTER; } if (duk_get_prop_stridx(thr, idx_in, DUK_STRIDX_SET)) { duk_tval *tv = duk_require_tval(thr, -1); duk_hobject *h_set; if (DUK_TVAL_IS_UNDEFINED(tv)) { /* undefined is accepted */ DUK_ASSERT(setter == NULL); } else { /* NOTE: lightfuncs are coerced to full functions because * lightfuncs don't fit into a property value slot. This * has some side effects, see test-dev-lightfunc-accessor.js. */ h_set = duk_get_hobject_promote_lfunc(thr, -1); if (h_set == NULL || !DUK_HOBJECT_IS_CALLABLE(h_set)) { goto type_error; } setter = h_set; } is_acc_desc = 1; defprop_flags |= DUK_DEFPROP_HAVE_SETTER; } if (duk_get_prop_stridx(thr, idx_in, DUK_STRIDX_ENUMERABLE)) { if (duk_to_boolean(thr, -1)) { defprop_flags |= DUK_DEFPROP_HAVE_ENUMERABLE | DUK_DEFPROP_ENUMERABLE; } else { defprop_flags |= DUK_DEFPROP_HAVE_ENUMERABLE; } } if (duk_get_prop_stridx(thr, idx_in, DUK_STRIDX_CONFIGURABLE)) { if (duk_to_boolean(thr, -1)) { defprop_flags |= DUK_DEFPROP_HAVE_CONFIGURABLE | DUK_DEFPROP_CONFIGURABLE; } else { defprop_flags |= DUK_DEFPROP_HAVE_CONFIGURABLE; } } if (is_data_desc && is_acc_desc) { goto type_error; } *out_defprop_flags = defprop_flags; *out_idx_value = idx_value; *out_getter = getter; *out_setter = setter; /* [ ... [multiple values] ] */ return; type_error: DUK_ERROR_TYPE(thr, DUK_STR_INVALID_DESCRIPTOR); } /* * Object.defineProperty() related helper (E5 Section 15.2.3.6). * Also handles ES2015 Reflect.defineProperty(). * * Inlines all [[DefineOwnProperty]] exotic behaviors. * * Note: Ecmascript compliant [[DefineOwnProperty]](P, Desc, Throw) is not * implemented directly, but Object.defineProperty() serves its purpose. * We don't need the [[DefineOwnProperty]] internally and we don't have a * property descriptor with 'missing values' so it's easier to avoid it * entirely. * * Note: this is only called for actual objects, not primitive values. * This must support virtual properties for full objects (e.g. Strings) * but not for plain values (e.g. strings). Lightfuncs, even though * primitive in a sense, are treated like objects and accepted as target * values. */ /* XXX: this is a major target for size optimization */ DUK_INTERNAL duk_bool_t duk_hobject_define_property_helper(duk_hthread *thr, duk_uint_t defprop_flags, duk_hobject *obj, duk_hstring *key, duk_idx_t idx_value, duk_hobject *get, duk_hobject *set, duk_bool_t throw_flag) { duk_uint32_t arr_idx; duk_tval tv; duk_bool_t has_enumerable; duk_bool_t has_configurable; duk_bool_t has_writable; duk_bool_t has_value; duk_bool_t has_get; duk_bool_t has_set; duk_bool_t is_enumerable; duk_bool_t is_configurable; duk_bool_t is_writable; duk_bool_t force_flag; duk_small_uint_t new_flags; duk_propdesc curr; duk_uint32_t arridx_new_array_length; /* != 0 => post-update for array 'length' (used when key is an array index) */ duk_uint32_t arrlen_old_len; duk_uint32_t arrlen_new_len; duk_bool_t pending_write_protect; DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->heap != NULL); DUK_ASSERT(obj != NULL); DUK_ASSERT(key != NULL); /* idx_value may be < 0 (no value), set and get may be NULL */ DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); /* All the flags fit in 16 bits, so will fit into duk_bool_t. */ has_writable = (defprop_flags & DUK_DEFPROP_HAVE_WRITABLE); has_enumerable = (defprop_flags & DUK_DEFPROP_HAVE_ENUMERABLE); has_configurable = (defprop_flags & DUK_DEFPROP_HAVE_CONFIGURABLE); has_value = (defprop_flags & DUK_DEFPROP_HAVE_VALUE); has_get = (defprop_flags & DUK_DEFPROP_HAVE_GETTER); has_set = (defprop_flags & DUK_DEFPROP_HAVE_SETTER); is_writable = (defprop_flags & DUK_DEFPROP_WRITABLE); is_enumerable = (defprop_flags & DUK_DEFPROP_ENUMERABLE); is_configurable = (defprop_flags & DUK_DEFPROP_CONFIGURABLE); force_flag = (defprop_flags & DUK_DEFPROP_FORCE); arr_idx = DUK_HSTRING_GET_ARRIDX_SLOW(key); arridx_new_array_length = 0; pending_write_protect = 0; arrlen_old_len = 0; arrlen_new_len = 0; DUK_DDD(DUK_DDDPRINT("has_enumerable=%ld is_enumerable=%ld " "has_configurable=%ld is_configurable=%ld " "has_writable=%ld is_writable=%ld " "has_value=%ld value=%!T " "has_get=%ld get=%p=%!O " "has_set=%ld set=%p=%!O " "arr_idx=%ld throw_flag=!%ld", (long) has_enumerable, (long) is_enumerable, (long) has_configurable, (long) is_configurable, (long) has_writable, (long) is_writable, (long) has_value, (duk_tval *) (idx_value >= 0 ? duk_get_tval(thr, idx_value) : NULL), (long) has_get, (void *) get, (duk_heaphdr *) get, (long) has_set, (void *) set, (duk_heaphdr *) set, (long) arr_idx, (long) throw_flag)); /* * Array exotic behaviors can be implemented at this point. The local variables * are essentially a 'value copy' of the input descriptor (Desc), which is modified * by the Array [[DefineOwnProperty]] (E5 Section 15.4.5.1). */ if (!DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)) { goto skip_array_exotic; } if (key == DUK_HTHREAD_STRING_LENGTH(thr)) { duk_harray *a; /* E5 Section 15.4.5.1, step 3, steps a - i are implemented here, j - n at the end */ if (!has_value) { DUK_DDD(DUK_DDDPRINT("exotic array behavior for 'length', but no value in descriptor -> normal behavior")); goto skip_array_exotic; } DUK_DDD(DUK_DDDPRINT("exotic array behavior for 'length', value present in descriptor -> exotic behavior")); /* * Get old and new length */ a = (duk_harray *) obj; DUK_ASSERT_HARRAY_VALID(a); arrlen_old_len = a->length; DUK_ASSERT(idx_value >= 0); arrlen_new_len = duk__to_new_array_length_checked(thr, DUK_GET_TVAL_POSIDX(thr, idx_value)); duk_push_u32(thr, arrlen_new_len); duk_replace(thr, idx_value); /* step 3.e: replace 'Desc.[[Value]]' */ DUK_DDD(DUK_DDDPRINT("old_len=%ld, new_len=%ld", (long) arrlen_old_len, (long) arrlen_new_len)); if (arrlen_new_len >= arrlen_old_len) { /* standard behavior, step 3.f.i */ DUK_DDD(DUK_DDDPRINT("new length is same or higher as previous => standard behavior")); goto skip_array_exotic; } DUK_DDD(DUK_DDDPRINT("new length is smaller than previous => exotic post behavior")); /* XXX: consolidated algorithm step 15.f -> redundant? */ if (DUK_HARRAY_LENGTH_NONWRITABLE(a) && !force_flag) { /* Array .length is always non-configurable; if it's also * non-writable, don't allow it to be written. */ goto fail_not_configurable; } /* steps 3.h and 3.i */ if (has_writable && !is_writable) { DUK_DDD(DUK_DDDPRINT("desc writable is false, force it back to true, and flag pending write protect")); is_writable = 1; pending_write_protect = 1; } /* remaining actual steps are carried out if standard DefineOwnProperty succeeds */ } else if (arr_idx != DUK__NO_ARRAY_INDEX) { /* XXX: any chance of unifying this with the 'length' key handling? */ /* E5 Section 15.4.5.1, step 4 */ duk_uint32_t old_len; duk_harray *a; a = (duk_harray *) obj; DUK_ASSERT_HARRAY_VALID(a); old_len = a->length; if (arr_idx >= old_len) { DUK_DDD(DUK_DDDPRINT("defineProperty requires array length update " "(arr_idx=%ld, old_len=%ld)", (long) arr_idx, (long) old_len)); if (DUK_HARRAY_LENGTH_NONWRITABLE(a) && !force_flag) { /* Array .length is always non-configurable, so * if it's also non-writable, don't allow a value * write. With force flag allow writing. */ goto fail_not_configurable; } /* actual update happens once write has been completed without * error below. */ DUK_ASSERT(arr_idx != 0xffffffffUL); arridx_new_array_length = arr_idx + 1; } else { DUK_DDD(DUK_DDDPRINT("defineProperty does not require length update " "(arr_idx=%ld, old_len=%ld) -> standard behavior", (long) arr_idx, (long) old_len)); } } skip_array_exotic: /* XXX: There is currently no support for writing buffer object * indexed elements here. Attempt to do so will succeed and * write a concrete property into the buffer object. This should * be fixed at some point but because buffers are a custom feature * anyway, this is relatively unimportant. */ /* * Actual Object.defineProperty() default algorithm. */ /* * First check whether property exists; if not, simple case. This covers * steps 1-4. */ if (!duk__get_own_propdesc_raw(thr, obj, key, arr_idx, &curr, DUK_GETDESC_FLAG_PUSH_VALUE)) { DUK_DDD(DUK_DDDPRINT("property does not exist")); if (!DUK_HOBJECT_HAS_EXTENSIBLE(obj) && !force_flag) { goto fail_not_extensible; } #if defined(DUK_USE_ROM_OBJECTS) /* ROM objects are never extensible but force flag may * allow us to come here anyway. */ DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj) || !DUK_HOBJECT_HAS_EXTENSIBLE(obj)); if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)) { DUK_D(DUK_DPRINT("attempt to define property on a read-only target object")); goto fail_not_configurable; } #endif /* XXX: share final setting code for value and flags? difficult because * refcount code is different. Share entry allocation? But can't allocate * until array index checked. */ /* steps 4.a and 4.b are tricky */ if (has_set || has_get) { duk_int_t e_idx; DUK_DDD(DUK_DDDPRINT("create new accessor property")); DUK_ASSERT(has_set || set == NULL); DUK_ASSERT(has_get || get == NULL); DUK_ASSERT(!has_value); DUK_ASSERT(!has_writable); new_flags = DUK_PROPDESC_FLAG_ACCESSOR; /* defaults, E5 Section 8.6.1, Table 7 */ if (has_enumerable && is_enumerable) { new_flags |= DUK_PROPDESC_FLAG_ENUMERABLE; } if (has_configurable && is_configurable) { new_flags |= DUK_PROPDESC_FLAG_CONFIGURABLE; } if (arr_idx != DUK__NO_ARRAY_INDEX && DUK_HOBJECT_HAS_ARRAY_PART(obj)) { DUK_DDD(DUK_DDDPRINT("accessor cannot go to array part, abandon array")); duk__abandon_array_checked(thr, obj); } /* write to entry part */ e_idx = duk__hobject_alloc_entry_checked(thr, obj, key); DUK_ASSERT(e_idx >= 0); DUK_HOBJECT_E_SET_VALUE_GETTER(thr->heap, obj, e_idx, get); DUK_HOBJECT_E_SET_VALUE_SETTER(thr->heap, obj, e_idx, set); DUK_HOBJECT_INCREF_ALLOWNULL(thr, get); DUK_HOBJECT_INCREF_ALLOWNULL(thr, set); DUK_HOBJECT_E_SET_FLAGS(thr->heap, obj, e_idx, new_flags); goto success_exotics; } else { duk_int_t e_idx; duk_tval *tv2; DUK_DDD(DUK_DDDPRINT("create new data property")); DUK_ASSERT(!has_set); DUK_ASSERT(!has_get); new_flags = 0; /* defaults, E5 Section 8.6.1, Table 7 */ if (has_writable && is_writable) { new_flags |= DUK_PROPDESC_FLAG_WRITABLE; } if (has_enumerable && is_enumerable) { new_flags |= DUK_PROPDESC_FLAG_ENUMERABLE; } if (has_configurable && is_configurable) { new_flags |= DUK_PROPDESC_FLAG_CONFIGURABLE; } if (has_value) { duk_tval *tv_tmp = duk_require_tval(thr, idx_value); DUK_TVAL_SET_TVAL(&tv, tv_tmp); } else { DUK_TVAL_SET_UNDEFINED(&tv); /* default value */ } if (arr_idx != DUK__NO_ARRAY_INDEX && DUK_HOBJECT_HAS_ARRAY_PART(obj)) { if (new_flags == DUK_PROPDESC_FLAGS_WEC) { #if 0 DUK_DDD(DUK_DDDPRINT("new data property attributes match array defaults, attempt to write to array part")); /* may become sparse...*/ #endif /* XXX: handling for array part missing now; this doesn't affect * compliance but causes array entry writes using defineProperty() * to always abandon array part. */ } DUK_DDD(DUK_DDDPRINT("new data property cannot go to array part, abandon array")); duk__abandon_array_checked(thr, obj); /* fall through */ } /* write to entry part */ e_idx = duk__hobject_alloc_entry_checked(thr, obj, key); DUK_ASSERT(e_idx >= 0); tv2 = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, e_idx); DUK_TVAL_SET_TVAL(tv2, &tv); DUK_TVAL_INCREF(thr, tv2); DUK_HOBJECT_E_SET_FLAGS(thr->heap, obj, e_idx, new_flags); goto success_exotics; } DUK_UNREACHABLE(); } /* we currently assume virtual properties are not configurable (as none of them are) */ DUK_ASSERT((curr.e_idx >= 0 || curr.a_idx >= 0) || !(curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE)); /* [obj key desc value get set curr_value] */ /* * Property already exists. Steps 5-6 detect whether any changes need * to be made. */ if (has_enumerable) { if (is_enumerable) { if (!(curr.flags & DUK_PROPDESC_FLAG_ENUMERABLE)) { goto need_check; } } else { if (curr.flags & DUK_PROPDESC_FLAG_ENUMERABLE) { goto need_check; } } } if (has_configurable) { if (is_configurable) { if (!(curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE)) { goto need_check; } } else { if (curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) { goto need_check; } } } if (has_value) { duk_tval *tmp1; duk_tval *tmp2; /* attempt to change from accessor to data property */ if (curr.flags & DUK_PROPDESC_FLAG_ACCESSOR) { goto need_check; } tmp1 = duk_require_tval(thr, -1); /* curr value */ tmp2 = duk_require_tval(thr, idx_value); /* new value */ if (!duk_js_samevalue(tmp1, tmp2)) { goto need_check; } } if (has_writable) { /* attempt to change from accessor to data property */ if (curr.flags & DUK_PROPDESC_FLAG_ACCESSOR) { goto need_check; } if (is_writable) { if (!(curr.flags & DUK_PROPDESC_FLAG_WRITABLE)) { goto need_check; } } else { if (curr.flags & DUK_PROPDESC_FLAG_WRITABLE) { goto need_check; } } } if (has_set) { if (curr.flags & DUK_PROPDESC_FLAG_ACCESSOR) { if (set != curr.set) { goto need_check; } } else { goto need_check; } } if (has_get) { if (curr.flags & DUK_PROPDESC_FLAG_ACCESSOR) { if (get != curr.get) { goto need_check; } } else { goto need_check; } } /* property exists, either 'desc' is empty, or all values * match (SameValue) */ goto success_no_exotics; need_check: /* * Some change(s) need to be made. Steps 7-11. */ /* shared checks for all descriptor types */ if (!(curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && !force_flag) { if (has_configurable && is_configurable) { goto fail_not_configurable; } if (has_enumerable) { if (curr.flags & DUK_PROPDESC_FLAG_ENUMERABLE) { if (!is_enumerable) { goto fail_not_configurable; } } else { if (is_enumerable) { goto fail_not_configurable; } } } } /* Virtual properties don't have backing so they can't mostly be * edited. Some virtual properties are, however, writable: for * example, virtual index properties of buffer objects and Array * instance .length. These are not configurable so the checks * above mostly cover attempts to change them, except when the * duk_def_prop() call is used with DUK_DEFPROP_FORCE; even in * that case we can't forcibly change the property attributes * because they don't have concrete backing. */ /* XXX: for ROM objects too it'd be best if value modify was * allowed if the value matches SameValue. */ /* Reject attempt to change a read-only object. */ #if defined(DUK_USE_ROM_OBJECTS) if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)) { DUK_DD(DUK_DDPRINT("attempt to define property on read-only target object")); goto fail_not_configurable; } #endif /* descriptor type specific checks */ if (has_set || has_get) { /* IsAccessorDescriptor(desc) == true */ DUK_ASSERT(!has_writable); DUK_ASSERT(!has_value); if (curr.flags & DUK_PROPDESC_FLAG_ACCESSOR) { /* curr and desc are accessors */ if (!(curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && !force_flag) { if (has_set && set != curr.set) { goto fail_not_configurable; } if (has_get && get != curr.get) { goto fail_not_configurable; } } } else { duk_bool_t rc; duk_tval *tv1; /* curr is data, desc is accessor */ if (!(curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && !force_flag) { goto fail_not_configurable; } DUK_DDD(DUK_DDDPRINT("convert property to accessor property")); if (curr.a_idx >= 0) { DUK_DDD(DUK_DDDPRINT("property to convert is stored in an array entry, abandon array and re-lookup")); duk__abandon_array_checked(thr, obj); duk_pop_unsafe(thr); /* remove old value */ rc = duk__get_own_propdesc_raw(thr, obj, key, arr_idx, &curr, DUK_GETDESC_FLAG_PUSH_VALUE); DUK_UNREF(rc); DUK_ASSERT(rc != 0); DUK_ASSERT(curr.e_idx >= 0 && curr.a_idx < 0); } if (curr.e_idx < 0) { DUK_ASSERT(curr.a_idx < 0 && curr.e_idx < 0); goto fail_virtual; /* safeguard for virtual property */ } DUK_ASSERT(curr.e_idx >= 0); DUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, obj, curr.e_idx)); tv1 = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, curr.e_idx); DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ(thr, tv1); /* XXX: just decref */ DUK_HOBJECT_E_SET_VALUE_GETTER(thr->heap, obj, curr.e_idx, NULL); DUK_HOBJECT_E_SET_VALUE_SETTER(thr->heap, obj, curr.e_idx, NULL); DUK_HOBJECT_E_SLOT_CLEAR_WRITABLE(thr->heap, obj, curr.e_idx); DUK_HOBJECT_E_SLOT_SET_ACCESSOR(thr->heap, obj, curr.e_idx); DUK_DDD(DUK_DDDPRINT("flags after data->accessor conversion: 0x%02lx", (unsigned long) DUK_HOBJECT_E_GET_FLAGS(thr->heap, obj, curr.e_idx))); /* Update curr.flags; faster than a re-lookup. */ curr.flags &= ~DUK_PROPDESC_FLAG_WRITABLE; curr.flags |= DUK_PROPDESC_FLAG_ACCESSOR; } } else if (has_value || has_writable) { /* IsDataDescriptor(desc) == true */ DUK_ASSERT(!has_set); DUK_ASSERT(!has_get); if (curr.flags & DUK_PROPDESC_FLAG_ACCESSOR) { duk_hobject *tmp; /* curr is accessor, desc is data */ if (!(curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && !force_flag) { goto fail_not_configurable; } /* curr is accessor -> cannot be in array part. */ DUK_ASSERT(curr.a_idx < 0); if (curr.e_idx < 0) { goto fail_virtual; /* safeguard; no virtual accessors now */ } DUK_DDD(DUK_DDDPRINT("convert property to data property")); DUK_ASSERT(DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, obj, curr.e_idx)); tmp = DUK_HOBJECT_E_GET_VALUE_GETTER(thr->heap, obj, curr.e_idx); DUK_UNREF(tmp); DUK_HOBJECT_E_SET_VALUE_GETTER(thr->heap, obj, curr.e_idx, NULL); DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, tmp); tmp = DUK_HOBJECT_E_GET_VALUE_SETTER(thr->heap, obj, curr.e_idx); DUK_UNREF(tmp); DUK_HOBJECT_E_SET_VALUE_SETTER(thr->heap, obj, curr.e_idx, NULL); DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, tmp); DUK_TVAL_SET_UNDEFINED(DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, curr.e_idx)); DUK_HOBJECT_E_SLOT_CLEAR_WRITABLE(thr->heap, obj, curr.e_idx); DUK_HOBJECT_E_SLOT_CLEAR_ACCESSOR(thr->heap, obj, curr.e_idx); DUK_DDD(DUK_DDDPRINT("flags after accessor->data conversion: 0x%02lx", (unsigned long) DUK_HOBJECT_E_GET_FLAGS(thr->heap, obj, curr.e_idx))); /* Update curr.flags; faster than a re-lookup. */ curr.flags &= ~(DUK_PROPDESC_FLAG_WRITABLE | DUK_PROPDESC_FLAG_ACCESSOR); } else { /* curr and desc are data */ if (!(curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && !force_flag) { if (!(curr.flags & DUK_PROPDESC_FLAG_WRITABLE) && has_writable && is_writable) { goto fail_not_configurable; } /* Note: changing from writable to non-writable is OK */ if (!(curr.flags & DUK_PROPDESC_FLAG_WRITABLE) && has_value) { duk_tval *tmp1 = duk_require_tval(thr, -1); /* curr value */ duk_tval *tmp2 = duk_require_tval(thr, idx_value); /* new value */ if (!duk_js_samevalue(tmp1, tmp2)) { goto fail_not_configurable; } } } } } else { /* IsGenericDescriptor(desc) == true; this means in practice that 'desc' * only has [[Enumerable]] or [[Configurable]] flag updates, which are * allowed at this point. */ DUK_ASSERT(!has_value && !has_writable && !has_get && !has_set); } /* * Start doing property attributes updates. Steps 12-13. * * Start by computing new attribute flags without writing yet. * Property type conversion is done above if necessary. */ new_flags = curr.flags; if (has_enumerable) { if (is_enumerable) { new_flags |= DUK_PROPDESC_FLAG_ENUMERABLE; } else { new_flags &= ~DUK_PROPDESC_FLAG_ENUMERABLE; } } if (has_configurable) { if (is_configurable) { new_flags |= DUK_PROPDESC_FLAG_CONFIGURABLE; } else { new_flags &= ~DUK_PROPDESC_FLAG_CONFIGURABLE; } } if (has_writable) { if (is_writable) { new_flags |= DUK_PROPDESC_FLAG_WRITABLE; } else { new_flags &= ~DUK_PROPDESC_FLAG_WRITABLE; } } /* XXX: write protect after flag? -> any chance of handling it here? */ DUK_DDD(DUK_DDDPRINT("new flags that we want to write: 0x%02lx", (unsigned long) new_flags)); /* * Check whether we need to abandon an array part (if it exists) */ if (curr.a_idx >= 0) { duk_bool_t rc; DUK_ASSERT(curr.e_idx < 0); if (new_flags == DUK_PROPDESC_FLAGS_WEC) { duk_tval *tv1, *tv2; DUK_DDD(DUK_DDDPRINT("array index, new property attributes match array defaults, update in-place")); DUK_ASSERT(curr.flags == DUK_PROPDESC_FLAGS_WEC); /* must have been, since in array part */ DUK_ASSERT(!has_set); DUK_ASSERT(!has_get); DUK_ASSERT(idx_value >= 0); /* must be: if attributes match and we get here the value must differ (otherwise no change) */ tv2 = duk_require_tval(thr, idx_value); tv1 = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, curr.a_idx); DUK_TVAL_SET_TVAL_UPDREF(thr, tv1, tv2); /* side effects; may invalidate a_idx */ goto success_exotics; } DUK_DDD(DUK_DDDPRINT("array index, new property attributes do not match array defaults, abandon array and re-lookup")); duk__abandon_array_checked(thr, obj); duk_pop_unsafe(thr); /* remove old value */ rc = duk__get_own_propdesc_raw(thr, obj, key, arr_idx, &curr, DUK_GETDESC_FLAG_PUSH_VALUE); DUK_UNREF(rc); DUK_ASSERT(rc != 0); DUK_ASSERT(curr.e_idx >= 0 && curr.a_idx < 0); } DUK_DDD(DUK_DDDPRINT("updating existing property in entry part")); /* Array case is handled comprehensively above: either in entry * part or a virtual property. */ DUK_ASSERT(curr.a_idx < 0); DUK_DDD(DUK_DDDPRINT("update existing property attributes")); if (curr.e_idx >= 0) { DUK_HOBJECT_E_SET_FLAGS(thr->heap, obj, curr.e_idx, new_flags); } else { /* For Array .length the only allowed transition is for .length * to become non-writable. */ if (key == DUK_HTHREAD_STRING_LENGTH(thr) && DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)) { duk_harray *a; a = (duk_harray *) obj; DUK_DD(DUK_DDPRINT("Object.defineProperty() attribute update for duk_harray .length -> %02lx", (unsigned long) new_flags)); DUK_ASSERT_HARRAY_VALID(a); if ((new_flags & DUK_PROPDESC_FLAGS_EC) != (curr.flags & DUK_PROPDESC_FLAGS_EC)) { DUK_D(DUK_DPRINT("Object.defineProperty() attempt to change virtual array .length enumerable or configurable attribute, fail")); goto fail_virtual; } if (new_flags & DUK_PROPDESC_FLAG_WRITABLE) { DUK_HARRAY_SET_LENGTH_WRITABLE(a); } else { DUK_HARRAY_SET_LENGTH_NONWRITABLE(a); } } } if (has_set) { duk_hobject *tmp; /* Virtual properties are non-configurable but with a 'force' * flag we might come here so check explicitly for virtual. */ if (curr.e_idx < 0) { goto fail_virtual; } DUK_DDD(DUK_DDDPRINT("update existing property setter")); DUK_ASSERT(DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, obj, curr.e_idx)); tmp = DUK_HOBJECT_E_GET_VALUE_SETTER(thr->heap, obj, curr.e_idx); DUK_UNREF(tmp); DUK_HOBJECT_E_SET_VALUE_SETTER(thr->heap, obj, curr.e_idx, set); DUK_HOBJECT_INCREF_ALLOWNULL(thr, set); DUK_HOBJECT_DECREF_ALLOWNULL(thr, tmp); /* side effects; may invalidate e_idx */ } if (has_get) { duk_hobject *tmp; if (curr.e_idx < 0) { goto fail_virtual; } DUK_DDD(DUK_DDDPRINT("update existing property getter")); DUK_ASSERT(DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, obj, curr.e_idx)); tmp = DUK_HOBJECT_E_GET_VALUE_GETTER(thr->heap, obj, curr.e_idx); DUK_UNREF(tmp); DUK_HOBJECT_E_SET_VALUE_GETTER(thr->heap, obj, curr.e_idx, get); DUK_HOBJECT_INCREF_ALLOWNULL(thr, get); DUK_HOBJECT_DECREF_ALLOWNULL(thr, tmp); /* side effects; may invalidate e_idx */ } if (has_value) { duk_tval *tv1, *tv2; DUK_DDD(DUK_DDDPRINT("update existing property value")); if (curr.e_idx >= 0) { DUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, obj, curr.e_idx)); tv2 = duk_require_tval(thr, idx_value); tv1 = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, curr.e_idx); DUK_TVAL_SET_TVAL_UPDREF(thr, tv1, tv2); /* side effects; may invalidate e_idx */ } else { DUK_ASSERT(curr.a_idx < 0); /* array part case handled comprehensively previously */ DUK_DD(DUK_DDPRINT("Object.defineProperty(), value update for virtual property")); /* XXX: Uint8Array and other typed array virtual writes not currently * handled. */ if (key == DUK_HTHREAD_STRING_LENGTH(thr) && DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)) { duk_harray *a; a = (duk_harray *) obj; DUK_DD(DUK_DDPRINT("Object.defineProperty() value update for duk_harray .length -> %ld", (long) arrlen_new_len)); DUK_ASSERT_HARRAY_VALID(a); a->length = arrlen_new_len; } else { goto fail_virtual; /* should not happen */ } } } /* * Standard algorithm succeeded without errors, check for exotic post-behaviors. * * Arguments exotic behavior in E5 Section 10.6 occurs after the standard * [[DefineOwnProperty]] has completed successfully. * * Array exotic behavior in E5 Section 15.4.5.1 is implemented partly * prior to the default [[DefineOwnProperty]], but: * - for an array index key (e.g. "10") the final 'length' update occurs here * - for 'length' key the element deletion and 'length' update occurs here */ success_exotics: /* curr.a_idx or curr.e_idx may have been invalidated by side effects * above. */ /* [obj key desc value get set curr_value] */ if (DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)) { duk_harray *a; a = (duk_harray *) obj; DUK_ASSERT_HARRAY_VALID(a); if (arridx_new_array_length > 0) { /* * Note: zero works as a "no update" marker because the new length * can never be zero after a new property is written. */ /* E5 Section 15.4.5.1, steps 4.e.i - 4.e.ii */ DUK_DDD(DUK_DDDPRINT("defineProperty successful, pending array length update to: %ld", (long) arridx_new_array_length)); a->length = arridx_new_array_length; } if (key == DUK_HTHREAD_STRING_LENGTH(thr) && arrlen_new_len < arrlen_old_len) { /* * E5 Section 15.4.5.1, steps 3.k - 3.n. The order at the end combines * the error case 3.l.iii and the success case 3.m-3.n. */ /* XXX: investigate whether write protect can be handled above, if we * just update length here while ignoring its protected status */ duk_uint32_t result_len; duk_bool_t rc; DUK_DDD(DUK_DDDPRINT("defineProperty successful, key is 'length', exotic array behavior, " "doing array element deletion and length update")); rc = duk__handle_put_array_length_smaller(thr, obj, arrlen_old_len, arrlen_new_len, force_flag, &result_len); /* update length (curr points to length, and we assume it's still valid) */ DUK_ASSERT(result_len >= arrlen_new_len && result_len <= arrlen_old_len); a->length = result_len; if (pending_write_protect) { DUK_DDD(DUK_DDDPRINT("setting array length non-writable (pending writability update)")); DUK_HARRAY_SET_LENGTH_NONWRITABLE(a); } /* XXX: shrink array allocation or entries compaction here? */ if (!rc) { DUK_DD(DUK_DDPRINT("array length write only partially successful")); goto fail_not_configurable; } } } else if (arr_idx != DUK__NO_ARRAY_INDEX && DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj)) { duk_hobject *map; duk_hobject *varenv; DUK_ASSERT(arridx_new_array_length == 0); DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)); /* traits are separate; in particular, arguments not an array */ map = NULL; varenv = NULL; if (!duk__lookup_arguments_map(thr, obj, key, &curr, &map, &varenv)) { goto success_no_exotics; } DUK_ASSERT(map != NULL); DUK_ASSERT(varenv != NULL); /* [obj key desc value get set curr_value varname] */ if (has_set || has_get) { /* = IsAccessorDescriptor(Desc) */ DUK_DDD(DUK_DDDPRINT("defineProperty successful, key mapped to arguments 'map' " "changed to an accessor, delete arguments binding")); (void) duk_hobject_delprop_raw(thr, map, key, 0); /* ignore result */ } else { /* Note: this order matters (final value before deleting map entry must be done) */ DUK_DDD(DUK_DDDPRINT("defineProperty successful, key mapped to arguments 'map', " "check for value update / binding deletion")); if (has_value) { duk_hstring *varname; DUK_DDD(DUK_DDDPRINT("defineProperty successful, key mapped to arguments 'map', " "update bound value (variable/argument)")); varname = duk_require_hstring(thr, -1); DUK_ASSERT(varname != NULL); DUK_DDD(DUK_DDDPRINT("arguments object automatic putvar for a bound variable; " "key=%!O, varname=%!O, value=%!T", (duk_heaphdr *) key, (duk_heaphdr *) varname, (duk_tval *) duk_require_tval(thr, idx_value))); /* strict flag for putvar comes from our caller (currently: fixed) */ duk_js_putvar_envrec(thr, varenv, varname, duk_require_tval(thr, idx_value), 1 /*throw_flag*/); } if (has_writable && !is_writable) { DUK_DDD(DUK_DDDPRINT("defineProperty successful, key mapped to arguments 'map', " "changed to non-writable, delete arguments binding")); (void) duk_hobject_delprop_raw(thr, map, key, 0); /* ignore result */ } } /* 'varname' is in stack in this else branch, leaving an unbalanced stack below, * but this doesn't matter now. */ } success_no_exotics: /* Some code paths use NORZ macros for simplicity, ensure refzero * handling is completed. */ DUK_REFZERO_CHECK_SLOW(thr); return 1; fail_not_extensible: if (throw_flag) { DUK_ERROR_TYPE(thr, DUK_STR_NOT_EXTENSIBLE); } return 0; fail_virtual: /* just use the same "not configurable" error message" */ fail_not_configurable: if (throw_flag) { DUK_ERROR_TYPE(thr, DUK_STR_NOT_CONFIGURABLE); } return 0; } /* * Object.prototype.hasOwnProperty() and Object.prototype.propertyIsEnumerable(). */ DUK_INTERNAL duk_bool_t duk_hobject_object_ownprop_helper(duk_hthread *thr, duk_small_uint_t required_desc_flags) { duk_hstring *h_v; duk_hobject *h_obj; duk_propdesc desc; duk_bool_t ret; /* coercion order matters */ h_v = duk_to_hstring_acceptsymbol(thr, 0); DUK_ASSERT(h_v != NULL); h_obj = duk_push_this_coercible_to_object(thr); DUK_ASSERT(h_obj != NULL); ret = duk_hobject_get_own_propdesc(thr, h_obj, h_v, &desc, 0 /*flags*/); /* don't push value */ duk_push_boolean(thr, ret && ((desc.flags & required_desc_flags) == required_desc_flags)); return 1; } /* * Object.seal() and Object.freeze() (E5 Sections 15.2.3.8 and 15.2.3.9) * * Since the algorithms are similar, a helper provides both functions. * Freezing is essentially sealing + making plain properties non-writable. * * Note: virtual (non-concrete) properties which are non-configurable but * writable would pose some problems, but such properties do not currently * exist (all virtual properties are non-configurable and non-writable). * If they did exist, the non-configurability does NOT prevent them from * becoming non-writable. However, this change should be recorded somehow * so that it would turn up (e.g. when getting the property descriptor), * requiring some additional flags in the object. */ DUK_INTERNAL void duk_hobject_object_seal_freeze_helper(duk_hthread *thr, duk_hobject *obj, duk_bool_t is_freeze) { duk_uint_fast32_t i; DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->heap != NULL); DUK_ASSERT(obj != NULL); DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); #if defined(DUK_USE_ROM_OBJECTS) if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)) { DUK_DD(DUK_DDPRINT("attempt to seal/freeze a readonly object, reject")); DUK_ERROR_TYPE(thr, DUK_STR_NOT_CONFIGURABLE); } #endif /* * Abandon array part because all properties must become non-configurable. * Note that this is now done regardless of whether this is always the case * (skips check, but performance problem if caller would do this many times * for the same object; not likely). */ duk__abandon_array_checked(thr, obj); DUK_ASSERT(DUK_HOBJECT_GET_ASIZE(obj) == 0); for (i = 0; i < DUK_HOBJECT_GET_ENEXT(obj); i++) { duk_uint8_t *fp; /* since duk__abandon_array_checked() causes a resize, there should be no gaps in keys */ DUK_ASSERT(DUK_HOBJECT_E_GET_KEY(thr->heap, obj, i) != NULL); /* avoid multiple computations of flags address; bypasses macros */ fp = DUK_HOBJECT_E_GET_FLAGS_PTR(thr->heap, obj, i); if (is_freeze && !((*fp) & DUK_PROPDESC_FLAG_ACCESSOR)) { *fp &= ~(DUK_PROPDESC_FLAG_WRITABLE | DUK_PROPDESC_FLAG_CONFIGURABLE); } else { *fp &= ~DUK_PROPDESC_FLAG_CONFIGURABLE; } } DUK_HOBJECT_CLEAR_EXTENSIBLE(obj); /* no need to compact since we already did that in duk__abandon_array_checked() * (regardless of whether an array part existed or not. */ return; } /* * Object.isSealed() and Object.isFrozen() (E5 Sections 15.2.3.11, 15.2.3.13) * * Since the algorithms are similar, a helper provides both functions. * Freezing is essentially sealing + making plain properties non-writable. * * Note: all virtual (non-concrete) properties are currently non-configurable * and non-writable (and there are no accessor virtual properties), so they don't * need to be considered here now. */ DUK_INTERNAL duk_bool_t duk_hobject_object_is_sealed_frozen_helper(duk_hthread *thr, duk_hobject *obj, duk_bool_t is_frozen) { duk_uint_fast32_t i; DUK_ASSERT(obj != NULL); DUK_UNREF(thr); /* Note: no allocation pressure, no need to check refcounts etc */ /* must not be extensible */ if (DUK_HOBJECT_HAS_EXTENSIBLE(obj)) { return 0; } /* all virtual properties are non-configurable and non-writable */ /* entry part must not contain any configurable properties, or * writable properties (if is_frozen). */ for (i = 0; i < DUK_HOBJECT_GET_ENEXT(obj); i++) { duk_small_uint_t flags; if (!DUK_HOBJECT_E_GET_KEY(thr->heap, obj, i)) { continue; } /* avoid multiple computations of flags address; bypasses macros */ flags = (duk_small_uint_t) DUK_HOBJECT_E_GET_FLAGS(thr->heap, obj, i); if (flags & DUK_PROPDESC_FLAG_CONFIGURABLE) { return 0; } if (is_frozen && !(flags & DUK_PROPDESC_FLAG_ACCESSOR) && (flags & DUK_PROPDESC_FLAG_WRITABLE)) { return 0; } } /* array part must not contain any non-unused properties, as they would * be configurable and writable. */ for (i = 0; i < DUK_HOBJECT_GET_ASIZE(obj); i++) { duk_tval *tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, i); if (!DUK_TVAL_IS_UNUSED(tv)) { return 0; } } return 1; } /* * Object.preventExtensions() and Object.isExtensible() (E5 Sections 15.2.3.10, 15.2.3.13) * * Not needed, implemented by macros DUK_HOBJECT_{HAS,CLEAR,SET}_EXTENSIBLE * and the Object built-in bindings. */ /* automatic undefs */ #undef DUK__HASH_DELETED #undef DUK__HASH_UNUSED #undef DUK__NO_ARRAY_INDEX #undef DUK__VALSTACK_PROXY_LOOKUP #undef DUK__VALSTACK_SPACE #line 1 "duk_hstring_misc.c" /* * Misc support functions */ /* #include duk_internal.h -> already included */ /* * duk_hstring charCodeAt, with and without surrogate awareness */ DUK_INTERNAL duk_ucodepoint_t duk_hstring_char_code_at_raw(duk_hthread *thr, duk_hstring *h, duk_uint_t pos, duk_bool_t surrogate_aware) { duk_uint32_t boff; const duk_uint8_t *p, *p_start, *p_end; duk_ucodepoint_t cp1; duk_ucodepoint_t cp2; /* Caller must check character offset to be inside the string. */ DUK_ASSERT(thr != NULL); DUK_ASSERT(h != NULL); DUK_ASSERT_DISABLE(pos >= 0); /* unsigned */ DUK_ASSERT(pos < (duk_uint_t) DUK_HSTRING_GET_CHARLEN(h)); boff = (duk_uint32_t) duk_heap_strcache_offset_char2byte(thr, h, (duk_uint32_t) pos); DUK_DDD(DUK_DDDPRINT("charCodeAt: pos=%ld -> boff=%ld, str=%!O", (long) pos, (long) boff, (duk_heaphdr *) h)); DUK_ASSERT_DISABLE(boff >= 0); DUK_ASSERT(boff < DUK_HSTRING_GET_BYTELEN(h)); p_start = DUK_HSTRING_GET_DATA(h); p_end = p_start + DUK_HSTRING_GET_BYTELEN(h); p = p_start + boff; DUK_DDD(DUK_DDDPRINT("p_start=%p, p_end=%p, p=%p", (const void *) p_start, (const void *) p_end, (const void *) p)); /* For invalid UTF-8 (never happens for standard Ecmascript strings) * return U+FFFD replacement character. */ if (duk_unicode_decode_xutf8(thr, &p, p_start, p_end, &cp1)) { if (surrogate_aware && cp1 >= 0xd800UL && cp1 <= 0xdbffUL) { /* The decode helper is memory safe even if 'cp1' was * decoded at the end of the string and 'p' is no longer * within string memory range. */ cp2 = 0; /* If call fails, this is left untouched and won't match cp2 check. */ (void) duk_unicode_decode_xutf8(thr, &p, p_start, p_end, &cp2); if (cp2 >= 0xdc00UL && cp2 <= 0xdfffUL) { cp1 = (duk_ucodepoint_t) (((cp1 - 0xd800UL) << 10) + (cp2 - 0xdc00UL) + 0x10000UL); } } } else { cp1 = DUK_UNICODE_CP_REPLACEMENT_CHARACTER; } return cp1; } /* * duk_hstring charlen, when lazy charlen disabled */ #if !defined(DUK_USE_HSTRING_LAZY_CLEN) #if !defined(DUK_USE_HSTRING_CLEN) #error non-lazy duk_hstring charlen but DUK_USE_HSTRING_CLEN not set #endif DUK_INTERNAL void duk_hstring_init_charlen(duk_hstring *h) { duk_uint32_t clen; DUK_ASSERT(h != NULL); DUK_ASSERT(!DUK_HSTRING_HAS_ASCII(h)); DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) h)); clen = duk_unicode_unvalidated_utf8_length(DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h)); #if defined(DUK_USE_STRLEN16) DUK_ASSERT(clen <= 0xffffUL); /* Bytelength checked during interning. */ h->clen16 = (duk_uint16_t) clen; #else h->clen = (duk_uint32_t) clen; #endif if (DUK_LIKELY(clen == DUK_HSTRING_GET_BYTELEN(h))) { DUK_HSTRING_SET_ASCII(h); } } DUK_INTERNAL DUK_HOT duk_size_t duk_hstring_get_charlen(duk_hstring *h) { #if defined(DUK_USE_STRLEN16) return h->clen16; #else return h->clen; #endif } #endif /* !DUK_USE_HSTRING_LAZY_CLEN */ /* * duk_hstring charlen, when lazy charlen enabled */ #if defined(DUK_USE_HSTRING_LAZY_CLEN) #if defined(DUK_USE_HSTRING_CLEN) DUK_LOCAL DUK_COLD duk_size_t duk__hstring_get_charlen_slowpath(duk_hstring *h) { duk_size_t res; DUK_ASSERT(h->clen == 0); /* Checked by caller. */ #if defined(DUK_USE_ROM_STRINGS) /* ROM strings have precomputed clen, but if the computed clen is zero * we can still come here and can't write anything. */ if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) h)) { return 0; } #endif res = duk_unicode_unvalidated_utf8_length(DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h)); #if defined(DUK_USE_STRLEN16) DUK_ASSERT(res <= 0xffffUL); /* Bytelength checked during interning. */ h->clen16 = (duk_uint16_t) res; #else h->clen = (duk_uint32_t) res; #endif if (DUK_LIKELY(res == DUK_HSTRING_GET_BYTELEN(h))) { DUK_HSTRING_SET_ASCII(h); } return res; } #else /* DUK_USE_HSTRING_CLEN */ DUK_LOCAL duk_size_t duk__hstring_get_charlen_slowpath(duk_hstring *h) { if (DUK_LIKELY(DUK_HSTRING_HAS_ASCII(h))) { /* Most practical strings will go here. */ return DUK_HSTRING_GET_BYTELEN(h); } else { /* ASCII flag is lazy, so set it here. */ duk_size_t res; /* XXX: here we could use the strcache to speed up the * computation (matters for 'i < str.length' loops). */ res = duk_unicode_unvalidated_utf8_length(DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h)); #if defined(DUK_USE_ROM_STRINGS) if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) h)) { /* For ROM strings, can't write anything; ASCII flag * is preset so we don't need to update it. */ return res; } #endif if (DUK_LIKELY(res == DUK_HSTRING_GET_BYTELEN(h))) { DUK_HSTRING_SET_ASCII(h); } return res; } } #endif /* DUK_USE_HSTRING_CLEN */ #if defined(DUK_USE_HSTRING_CLEN) DUK_INTERNAL DUK_HOT duk_size_t duk_hstring_get_charlen(duk_hstring *h) { #if defined(DUK_USE_STRLEN16) if (DUK_LIKELY(h->clen16 != 0)) { return h->clen16; } #else if (DUK_LIKELY(h->clen != 0)) { return h->clen; } #endif return duk__hstring_get_charlen_slowpath(h); } #else /* DUK_USE_HSTRING_CLEN */ DUK_INTERNAL DUK_HOT duk_size_t duk_hstring_get_charlen(duk_hstring *h) { /* Always use slow path. */ return duk__hstring_get_charlen_slowpath(h); } #endif /* DUK_USE_HSTRING_CLEN */ #endif /* DUK_USE_HSTRING_LAZY_CLEN */ /* * Compare duk_hstring to an ASCII cstring. */ DUK_INTERNAL duk_bool_t duk_hstring_equals_ascii_cstring(duk_hstring *h, const char *cstr) { duk_size_t len; DUK_ASSERT(h != NULL); DUK_ASSERT(cstr != NULL); len = DUK_STRLEN(cstr); if (len != DUK_HSTRING_GET_BYTELEN(h)) { return 0; } if (DUK_MEMCMP((const void *) cstr, (const void *) DUK_HSTRING_GET_DATA(h), len) == 0) { return 1; } return 0; } #line 1 "duk_hthread_alloc.c" /* * duk_hthread allocation and freeing. */ /* #include duk_internal.h -> already included */ /* * Allocate initial stacks for a thread. Note that 'thr' must be reachable * as a garbage collection may be triggered by the allocation attempts. * Returns zero (without leaking memory) if init fails. */ DUK_INTERNAL duk_bool_t duk_hthread_init_stacks(duk_heap *heap, duk_hthread *thr) { duk_size_t alloc_size; duk_size_t i; DUK_ASSERT(heap != NULL); DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->valstack == NULL); DUK_ASSERT(thr->valstack_end == NULL); DUK_ASSERT(thr->valstack_alloc_end == NULL); DUK_ASSERT(thr->valstack_bottom == NULL); DUK_ASSERT(thr->valstack_top == NULL); DUK_ASSERT(thr->callstack_curr == NULL); /* valstack */ DUK_ASSERT(DUK_VALSTACK_API_ENTRY_MINIMUM <= DUK_VALSTACK_INITIAL_SIZE); alloc_size = sizeof(duk_tval) * DUK_VALSTACK_INITIAL_SIZE; thr->valstack = (duk_tval *) DUK_ALLOC(heap, alloc_size); if (!thr->valstack) { goto fail; } DUK_MEMZERO(thr->valstack, alloc_size); thr->valstack_end = thr->valstack + DUK_VALSTACK_API_ENTRY_MINIMUM; thr->valstack_alloc_end = thr->valstack + DUK_VALSTACK_INITIAL_SIZE; thr->valstack_bottom = thr->valstack; thr->valstack_top = thr->valstack; for (i = 0; i < DUK_VALSTACK_INITIAL_SIZE; i++) { DUK_TVAL_SET_UNDEFINED(&thr->valstack[i]); } return 1; fail: DUK_FREE(heap, thr->valstack); DUK_ASSERT(thr->callstack_curr == NULL); thr->valstack = NULL; return 0; } /* For indirect allocs. */ DUK_INTERNAL void *duk_hthread_get_valstack_ptr(duk_heap *heap, void *ud) { duk_hthread *thr = (duk_hthread *) ud; DUK_UNREF(heap); return (void *) thr->valstack; } #line 1 "duk_hthread_builtins.c" /* * Initialize built-in objects. Current thread must have a valstack * and initialization errors may longjmp, so a setjmp() catch point * must exist. */ /* #include duk_internal.h -> already included */ /* * Encoding constants, must match genbuiltins.py */ #define DUK__PROP_FLAGS_BITS 3 #define DUK__LENGTH_PROP_BITS 3 #define DUK__NARGS_BITS 3 #define DUK__PROP_TYPE_BITS 3 #define DUK__NARGS_VARARGS_MARKER 0x07 #define DUK__PROP_TYPE_DOUBLE 0 #define DUK__PROP_TYPE_STRING 1 #define DUK__PROP_TYPE_STRIDX 2 #define DUK__PROP_TYPE_BUILTIN 3 #define DUK__PROP_TYPE_UNDEFINED 4 #define DUK__PROP_TYPE_BOOLEAN_TRUE 5 #define DUK__PROP_TYPE_BOOLEAN_FALSE 6 #define DUK__PROP_TYPE_ACCESSOR 7 /* * Create built-in objects by parsing an init bitstream generated * by genbuiltins.py. */ #if defined(DUK_USE_ROM_OBJECTS) #if defined(DUK_USE_ROM_GLOBAL_CLONE) || defined(DUK_USE_ROM_GLOBAL_INHERIT) DUK_LOCAL void duk__duplicate_ram_global_object(duk_hthread *thr) { duk_hobject *h_global; #if defined(DUK_USE_ROM_GLOBAL_CLONE) duk_hobject *h_oldglobal; duk_uint8_t *props; duk_size_t alloc_size; #endif duk_hobject *h_objenv; /* XXX: refactor into internal helper, duk_clone_hobject() */ #if defined(DUK_USE_ROM_GLOBAL_INHERIT) /* Inherit from ROM-based global object: less RAM usage, less transparent. */ h_global = duk_push_object_helper(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_FASTREFS | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_GLOBAL), DUK_BIDX_GLOBAL); DUK_ASSERT(h_global != NULL); #elif defined(DUK_USE_ROM_GLOBAL_CLONE) /* Clone the properties of the ROM-based global object to create a * fully RAM-based global object. Uses more memory than the inherit * model but more compliant. */ h_global = duk_push_object_helper(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_FASTREFS | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_GLOBAL), DUK_BIDX_OBJECT_PROTOTYPE); DUK_ASSERT(h_global != NULL); h_oldglobal = thr->builtins[DUK_BIDX_GLOBAL]; DUK_ASSERT(h_oldglobal != NULL); /* Copy the property table verbatim; this handles attributes etc. * For ROM objects it's not necessary (or possible) to update * refcounts so leave them as is. */ alloc_size = DUK_HOBJECT_P_ALLOC_SIZE(h_oldglobal); DUK_ASSERT(alloc_size > 0); props = DUK_ALLOC_CHECKED(thr, alloc_size); DUK_ASSERT(props != NULL); DUK_ASSERT(DUK_HOBJECT_GET_PROPS(thr->heap, h_oldglobal) != NULL); DUK_MEMCPY((void *) props, (const void *) DUK_HOBJECT_GET_PROPS(thr->heap, h_oldglobal), alloc_size); /* XXX: keep property attributes or tweak them here? * Properties will now be non-configurable even when they're * normally configurable for the global object. */ DUK_ASSERT(DUK_HOBJECT_GET_PROPS(thr->heap, h_global) == NULL); DUK_HOBJECT_SET_PROPS(thr->heap, h_global, props); DUK_HOBJECT_SET_ESIZE(h_global, DUK_HOBJECT_GET_ESIZE(h_oldglobal)); DUK_HOBJECT_SET_ENEXT(h_global, DUK_HOBJECT_GET_ENEXT(h_oldglobal)); DUK_HOBJECT_SET_ASIZE(h_global, DUK_HOBJECT_GET_ASIZE(h_oldglobal)); DUK_HOBJECT_SET_HSIZE(h_global, DUK_HOBJECT_GET_HSIZE(h_oldglobal)); #else #error internal error in config defines #endif duk_hobject_compact_props(thr, h_global); DUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL] != NULL); DUK_ASSERT(!DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE((duk_heaphdr *) thr->builtins[DUK_BIDX_GLOBAL])); /* no need to decref: ROM object */ thr->builtins[DUK_BIDX_GLOBAL] = h_global; DUK_HOBJECT_INCREF(thr, h_global); DUK_D(DUK_DPRINT("duplicated global object: %!O", h_global)); /* Create a fresh object environment for the global scope. This is * needed so that the global scope points to the newly created RAM-based * global object. */ h_objenv = (duk_hobject *) duk_hobjenv_alloc(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJENV)); DUK_ASSERT(h_objenv != NULL); DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_objenv) == NULL); duk_push_hobject(thr, h_objenv); DUK_ASSERT(h_global != NULL); ((duk_hobjenv *) h_objenv)->target = h_global; DUK_HOBJECT_INCREF(thr, h_global); DUK_ASSERT(((duk_hobjenv *) h_objenv)->has_this == 0); DUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL_ENV] != NULL); DUK_ASSERT(!DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE((duk_heaphdr *) thr->builtins[DUK_BIDX_GLOBAL_ENV])); /* no need to decref: ROM object */ thr->builtins[DUK_BIDX_GLOBAL_ENV] = h_objenv; DUK_HOBJECT_INCREF(thr, h_objenv); DUK_D(DUK_DPRINT("duplicated global env: %!O", h_objenv)); DUK_ASSERT_HOBJENV_VALID((duk_hobjenv *) h_objenv); duk_pop_2(thr); /* Pop global object and global env. */ } #endif /* DUK_USE_ROM_GLOBAL_CLONE || DUK_USE_ROM_GLOBAL_INHERIT */ DUK_INTERNAL void duk_hthread_create_builtin_objects(duk_hthread *thr) { /* Setup builtins from ROM objects. All heaps/threads will share * the same readonly objects. */ duk_small_uint_t i; for (i = 0; i < DUK_NUM_BUILTINS; i++) { duk_hobject *h; h = (duk_hobject *) DUK_LOSE_CONST(duk_rom_builtins_bidx[i]); DUK_ASSERT(h != NULL); thr->builtins[i] = h; } #if defined(DUK_USE_ROM_GLOBAL_CLONE) || defined(DUK_USE_ROM_GLOBAL_INHERIT) /* By default the global object is read-only which is often much * more of an issue than having read-only built-in objects (like * RegExp, Date, etc). Use a RAM-based copy of the global object * and the global environment object for convenience. */ duk__duplicate_ram_global_object(thr); #endif } #else /* DUK_USE_ROM_OBJECTS */ DUK_LOCAL void duk__push_stridx(duk_hthread *thr, duk_bitdecoder_ctx *bd) { duk_small_uint_t n; n = (duk_small_uint_t) duk_bd_decode_varuint(bd); DUK_ASSERT_DISABLE(n >= 0); /* unsigned */ DUK_ASSERT(n < DUK_HEAP_NUM_STRINGS); duk_push_hstring_stridx(thr, n); } DUK_LOCAL void duk__push_string(duk_hthread *thr, duk_bitdecoder_ctx *bd) { /* XXX: built-ins data could provide a maximum length that is * actually needed; bitpacked max length is now 256 bytes. */ duk_uint8_t tmp[DUK_BD_BITPACKED_STRING_MAXLEN]; duk_small_uint_t len; len = duk_bd_decode_bitpacked_string(bd, tmp); duk_push_lstring(thr, (const char *) tmp, (duk_size_t) len); } DUK_LOCAL void duk__push_stridx_or_string(duk_hthread *thr, duk_bitdecoder_ctx *bd) { duk_small_uint_t n; n = (duk_small_uint_t) duk_bd_decode_varuint(bd); if (n == 0) { duk__push_string(thr, bd); } else { n--; DUK_ASSERT(n < DUK_HEAP_NUM_STRINGS); duk_push_hstring_stridx(thr, n); } } DUK_LOCAL void duk__push_double(duk_hthread *thr, duk_bitdecoder_ctx *bd) { duk_double_union du; duk_small_uint_t i; for (i = 0; i < 8; i++) { /* Encoding endianness must match target memory layout, * build scripts and genbuiltins.py must ensure this. */ du.uc[i] = (duk_uint8_t) duk_bd_decode(bd, 8); } duk_push_number(thr, du.d); /* push operation normalizes NaNs */ } DUK_INTERNAL void duk_hthread_create_builtin_objects(duk_hthread *thr) { duk_bitdecoder_ctx bd_ctx; duk_bitdecoder_ctx *bd = &bd_ctx; /* convenience */ duk_hobject *h; duk_small_uint_t i, j; DUK_D(DUK_DPRINT("INITBUILTINS BEGIN: DUK_NUM_BUILTINS=%d, DUK_NUM_BUILTINS_ALL=%d", (int) DUK_NUM_BUILTINS, (int) DUK_NUM_ALL_BUILTINS)); DUK_MEMZERO(&bd_ctx, sizeof(bd_ctx)); bd->data = (const duk_uint8_t *) duk_builtins_data; bd->length = (duk_size_t) DUK_BUILTINS_DATA_LENGTH; /* * First create all built-in bare objects on the empty valstack. * * Built-ins in the index range [0,DUK_NUM_BUILTINS-1] have value * stack indices matching their eventual thr->builtins[] index. * * Built-ins in the index range [DUK_NUM_BUILTINS,DUK_NUM_ALL_BUILTINS] * will exist on the value stack during init but won't be placed * into thr->builtins[]. These are objects referenced in some way * from thr->builtins[] roots but which don't need to be indexed by * Duktape through thr->builtins[] (e.g. user custom objects). * * Internal prototypes will be incorrect (NULL) at this stage. */ duk_require_stack(thr, DUK_NUM_ALL_BUILTINS); DUK_DD(DUK_DDPRINT("create empty built-ins")); DUK_ASSERT_TOP(thr, 0); for (i = 0; i < DUK_NUM_ALL_BUILTINS; i++) { duk_small_uint_t class_num; duk_small_int_t len = -1; /* must be signed */ class_num = (duk_small_uint_t) duk_bd_decode_varuint(bd); len = (duk_small_int_t) duk_bd_decode_flagged_signed(bd, DUK__LENGTH_PROP_BITS, (duk_int32_t) -1 /*def_value*/); if (class_num == DUK_HOBJECT_CLASS_FUNCTION) { duk_small_uint_t natidx; duk_small_int_t c_nargs; /* must hold DUK_VARARGS */ duk_c_function c_func; duk_int16_t magic; DUK_DDD(DUK_DDDPRINT("len=%ld", (long) len)); DUK_ASSERT(len >= 0); natidx = (duk_small_uint_t) duk_bd_decode_varuint(bd); DUK_ASSERT(natidx != 0); c_func = duk_bi_native_functions[natidx]; DUK_ASSERT(c_func != NULL); c_nargs = (duk_small_int_t) duk_bd_decode_flagged_signed(bd, DUK__NARGS_BITS, len /*def_value*/); if (c_nargs == DUK__NARGS_VARARGS_MARKER) { c_nargs = DUK_VARARGS; } /* XXX: set magic directly here? (it could share the c_nargs arg) */ (void) duk_push_c_function_builtin(thr, c_func, c_nargs); h = duk_known_hobject(thr, -1); /* Currently all built-in native functions are strict. * duk_push_c_function() now sets strict flag, so * assert for it. */ DUK_ASSERT(DUK_HOBJECT_HAS_STRICT(h)); /* XXX: function properties */ duk__push_stridx_or_string(thr, bd); #if defined(DUK_USE_FUNC_NAME_PROPERTY) duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_C); #else duk_pop(thr); /* Not very ideal but good enough for now. */ #endif /* Almost all global level Function objects are constructable * but not all: Function.prototype is a non-constructable, * callable Function. */ if (duk_bd_decode_flag(bd)) { DUK_ASSERT(DUK_HOBJECT_HAS_CONSTRUCTABLE(h)); } else { DUK_HOBJECT_CLEAR_CONSTRUCTABLE(h); } /* Cast converts magic to 16-bit signed value */ magic = (duk_int16_t) duk_bd_decode_varuint(bd); ((duk_hnatfunc *) h)->magic = magic; } else if (class_num == DUK_HOBJECT_CLASS_ARRAY) { duk_push_array(thr); } else if (class_num == DUK_HOBJECT_CLASS_OBJENV) { duk_hobjenv *env; duk_hobject *global; DUK_ASSERT(i == DUK_BIDX_GLOBAL_ENV); DUK_ASSERT(DUK_BIDX_GLOBAL_ENV > DUK_BIDX_GLOBAL); env = duk_hobjenv_alloc(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJENV)); DUK_ASSERT(env->target == NULL); duk_push_hobject(thr, (duk_hobject *) env); global = duk_known_hobject(thr, DUK_BIDX_GLOBAL); DUK_ASSERT(global != NULL); env->target = global; DUK_HOBJECT_INCREF(thr, global); DUK_ASSERT(env->has_this == 0); DUK_ASSERT_HOBJENV_VALID(env); } else { DUK_ASSERT(class_num != DUK_HOBJECT_CLASS_DECENV); (void) duk_push_object_helper(thr, DUK_HOBJECT_FLAG_FASTREFS | DUK_HOBJECT_FLAG_EXTENSIBLE, -1); /* no prototype or class yet */ } h = duk_known_hobject(thr, -1); DUK_HOBJECT_SET_CLASS_NUMBER(h, class_num); if (i < DUK_NUM_BUILTINS) { thr->builtins[i] = h; DUK_HOBJECT_INCREF(thr, &h->hdr); } if (len >= 0) { /* In ES2015+ built-in function object .length property * has property attributes C (configurable only): * http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-standard-built-in-objects * * Array.prototype remains an Array instance in ES2015+ * and its length has attributes W (writable only). * Because .length is now virtual for duk_harray, it is * not encoded explicitly in init data. */ DUK_ASSERT(class_num != DUK_HOBJECT_CLASS_ARRAY); /* .length is virtual */ duk_push_int(thr, len); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_C); } /* enable exotic behaviors last */ if (class_num == DUK_HOBJECT_CLASS_ARRAY) { DUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_ARRAY(h)); /* set by duk_push_array() */ } if (class_num == DUK_HOBJECT_CLASS_STRING) { DUK_HOBJECT_SET_EXOTIC_STRINGOBJ(h); } /* some assertions */ DUK_ASSERT(DUK_HOBJECT_HAS_EXTENSIBLE(h)); /* DUK_HOBJECT_FLAG_CONSTRUCTABLE varies */ DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(h)); DUK_ASSERT(!DUK_HOBJECT_HAS_COMPFUNC(h)); /* DUK_HOBJECT_FLAG_NATFUNC varies */ DUK_ASSERT(!DUK_HOBJECT_IS_THREAD(h)); DUK_ASSERT(!DUK_HOBJECT_HAS_ARRAY_PART(h) || class_num == DUK_HOBJECT_CLASS_ARRAY); /* DUK_HOBJECT_FLAG_STRICT varies */ DUK_ASSERT(!DUK_HOBJECT_HAS_NATFUNC(h) || /* all native functions have NEWENV */ DUK_HOBJECT_HAS_NEWENV(h)); DUK_ASSERT(!DUK_HOBJECT_HAS_NAMEBINDING(h)); DUK_ASSERT(!DUK_HOBJECT_HAS_CREATEARGS(h)); /* DUK_HOBJECT_FLAG_EXOTIC_ARRAY varies */ /* DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ varies */ DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(h)); DUK_DDD(DUK_DDDPRINT("created built-in %ld, class=%ld, length=%ld", (long) i, (long) class_num, (long) len)); } /* * Then decode the builtins init data (see genbuiltins.py) to * init objects. Internal prototypes are set at this stage, * with thr->builtins[] populated. */ DUK_DD(DUK_DDPRINT("initialize built-in object properties")); for (i = 0; i < DUK_NUM_ALL_BUILTINS; i++) { duk_small_uint_t t; duk_small_uint_t num; DUK_DDD(DUK_DDDPRINT("initializing built-in object at index %ld", (long) i)); h = duk_known_hobject(thr, (duk_idx_t) i); t = (duk_small_uint_t) duk_bd_decode_varuint(bd); if (t > 0) { t--; DUK_DDD(DUK_DDDPRINT("set internal prototype: built-in %ld", (long) t)); DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, h, duk_known_hobject(thr, (duk_idx_t) t)); } else if (DUK_HOBJECT_IS_NATFUNC(h)) { /* Standard native built-ins cannot inherit from * %NativeFunctionPrototype%, they are required to * inherit from Function.prototype directly. */ DUK_ASSERT(thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE] != NULL); DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, h, thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]); } t = (duk_small_uint_t) duk_bd_decode_varuint(bd); if (t > 0) { /* 'prototype' property for all built-in objects (which have it) has attributes: * [[Writable]] = false, * [[Enumerable]] = false, * [[Configurable]] = false */ t--; DUK_DDD(DUK_DDDPRINT("set external prototype: built-in %ld", (long) t)); duk_dup(thr, (duk_idx_t) t); duk_xdef_prop_stridx(thr, (duk_idx_t) i, DUK_STRIDX_PROTOTYPE, DUK_PROPDESC_FLAGS_NONE); } t = (duk_small_uint_t) duk_bd_decode_varuint(bd); if (t > 0) { /* 'constructor' property for all built-in objects (which have it) has attributes: * [[Writable]] = true, * [[Enumerable]] = false, * [[Configurable]] = true */ t--; DUK_DDD(DUK_DDDPRINT("set external constructor: built-in %ld", (long) t)); duk_dup(thr, (duk_idx_t) t); duk_xdef_prop_stridx(thr, (duk_idx_t) i, DUK_STRIDX_CONSTRUCTOR, DUK_PROPDESC_FLAGS_WC); } /* normal valued properties */ num = (duk_small_uint_t) duk_bd_decode_varuint(bd); DUK_DDD(DUK_DDDPRINT("built-in object %ld, %ld normal valued properties", (long) i, (long) num)); for (j = 0; j < num; j++) { duk_small_uint_t defprop_flags; duk__push_stridx_or_string(thr, bd); /* * Property attribute defaults are defined in E5 Section 15 (first * few pages); there is a default for all properties and a special * default for 'length' properties. Variation from the defaults is * signaled using a single flag bit in the bitstream. */ if (duk_bd_decode_flag(bd)) { defprop_flags = (duk_small_uint_t) duk_bd_decode(bd, DUK__PROP_FLAGS_BITS); } else { defprop_flags = DUK_PROPDESC_FLAGS_WC; } defprop_flags |= DUK_DEFPROP_FORCE | DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_HAVE_WRITABLE | DUK_DEFPROP_HAVE_ENUMERABLE | DUK_DEFPROP_HAVE_CONFIGURABLE; /* Defaults for data properties. */ /* The writable, enumerable, configurable flags in prop_flags * match both duk_def_prop() and internal property flags. */ DUK_ASSERT(DUK_PROPDESC_FLAG_WRITABLE == DUK_DEFPROP_WRITABLE); DUK_ASSERT(DUK_PROPDESC_FLAG_ENUMERABLE == DUK_DEFPROP_ENUMERABLE); DUK_ASSERT(DUK_PROPDESC_FLAG_CONFIGURABLE == DUK_DEFPROP_CONFIGURABLE); t = (duk_small_uint_t) duk_bd_decode(bd, DUK__PROP_TYPE_BITS); DUK_DDD(DUK_DDDPRINT("built-in %ld, normal-valued property %ld, key %!T, flags 0x%02lx, type %ld", (long) i, (long) j, duk_get_tval(thr, -1), (unsigned long) defprop_flags, (long) t)); switch (t) { case DUK__PROP_TYPE_DOUBLE: { duk__push_double(thr, bd); break; } case DUK__PROP_TYPE_STRING: { duk__push_string(thr, bd); break; } case DUK__PROP_TYPE_STRIDX: { duk__push_stridx(thr, bd); break; } case DUK__PROP_TYPE_BUILTIN: { duk_small_uint_t bidx; bidx = (duk_small_uint_t) duk_bd_decode_varuint(bd); duk_dup(thr, (duk_idx_t) bidx); break; } case DUK__PROP_TYPE_UNDEFINED: { duk_push_undefined(thr); break; } case DUK__PROP_TYPE_BOOLEAN_TRUE: { duk_push_true(thr); break; } case DUK__PROP_TYPE_BOOLEAN_FALSE: { duk_push_false(thr); break; } case DUK__PROP_TYPE_ACCESSOR: { duk_small_uint_t natidx_getter = (duk_small_uint_t) duk_bd_decode_varuint(bd); duk_small_uint_t natidx_setter = (duk_small_uint_t) duk_bd_decode_varuint(bd); duk_small_uint_t accessor_magic = (duk_small_uint_t) duk_bd_decode_varuint(bd); duk_c_function c_func_getter; duk_c_function c_func_setter; DUK_DDD(DUK_DDDPRINT("built-in accessor property: objidx=%ld, key=%!T, getteridx=%ld, setteridx=%ld, flags=0x%04lx", (long) i, duk_get_tval(thr, -1), (long) natidx_getter, (long) natidx_setter, (unsigned long) defprop_flags)); c_func_getter = duk_bi_native_functions[natidx_getter]; if (c_func_getter != NULL) { duk_push_c_function_builtin_noconstruct(thr, c_func_getter, 0); /* always 0 args */ duk_set_magic(thr, -1, (duk_int_t) accessor_magic); defprop_flags |= DUK_DEFPROP_HAVE_GETTER; } c_func_setter = duk_bi_native_functions[natidx_setter]; if (c_func_setter != NULL) { duk_push_c_function_builtin_noconstruct(thr, c_func_setter, 1); /* always 1 arg */ duk_set_magic(thr, -1, (duk_int_t) accessor_magic); defprop_flags |= DUK_DEFPROP_HAVE_SETTER; } /* Writable flag doesn't make sense for an accessor. */ DUK_ASSERT((defprop_flags & DUK_PROPDESC_FLAG_WRITABLE) == 0); /* genbuiltins.py ensures */ defprop_flags &= ~(DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_HAVE_WRITABLE); defprop_flags |= DUK_DEFPROP_HAVE_ENUMERABLE | DUK_DEFPROP_HAVE_CONFIGURABLE; break; } default: { /* exhaustive */ DUK_UNREACHABLE(); } } duk_def_prop(thr, (duk_idx_t) i, defprop_flags); DUK_ASSERT_TOP(thr, DUK_NUM_ALL_BUILTINS); } /* native function properties */ num = (duk_small_uint_t) duk_bd_decode_varuint(bd); DUK_DDD(DUK_DDDPRINT("built-in object %ld, %ld function valued properties", (long) i, (long) num)); for (j = 0; j < num; j++) { duk_hstring *h_key; duk_small_uint_t natidx; duk_int_t c_nargs; /* must hold DUK_VARARGS */ duk_small_uint_t c_length; duk_int16_t magic; duk_c_function c_func; duk_hnatfunc *h_func; #if defined(DUK_USE_LIGHTFUNC_BUILTINS) duk_small_int_t lightfunc_eligible; #endif duk__push_stridx_or_string(thr, bd); h_key = duk_known_hstring(thr, -1); DUK_UNREF(h_key); natidx = (duk_small_uint_t) duk_bd_decode_varuint(bd); c_length = (duk_small_uint_t) duk_bd_decode(bd, DUK__LENGTH_PROP_BITS); c_nargs = (duk_int_t) duk_bd_decode_flagged(bd, DUK__NARGS_BITS, (duk_uint32_t) c_length /*def_value*/); if (c_nargs == DUK__NARGS_VARARGS_MARKER) { c_nargs = DUK_VARARGS; } c_func = duk_bi_native_functions[natidx]; DUK_DDD(DUK_DDDPRINT("built-in %ld, function-valued property %ld, key %!O, natidx %ld, length %ld, nargs %ld", (long) i, (long) j, (duk_heaphdr *) h_key, (long) natidx, (long) c_length, (c_nargs == DUK_VARARGS ? (long) -1 : (long) c_nargs))); /* Cast converts magic to 16-bit signed value */ magic = (duk_int16_t) duk_bd_decode_varuint(bd); #if defined(DUK_USE_LIGHTFUNC_BUILTINS) lightfunc_eligible = ((c_nargs >= DUK_LFUNC_NARGS_MIN && c_nargs <= DUK_LFUNC_NARGS_MAX) || (c_nargs == DUK_VARARGS)) && (c_length <= DUK_LFUNC_LENGTH_MAX) && (magic >= DUK_LFUNC_MAGIC_MIN && magic <= DUK_LFUNC_MAGIC_MAX); /* These functions have trouble working as lightfuncs. * Some of them have specific asserts and some may have * additional properties (e.g. 'require.id' may be written). */ if (c_func == duk_bi_global_object_eval) { lightfunc_eligible = 0; } #if defined(DUK_USE_COROUTINE_SUPPORT) if (c_func == duk_bi_thread_yield || c_func == duk_bi_thread_resume) { lightfunc_eligible = 0; } #endif if (c_func == duk_bi_function_prototype_call || c_func == duk_bi_function_prototype_apply || c_func == duk_bi_reflect_apply || c_func == duk_bi_reflect_construct) { lightfunc_eligible = 0; } if (lightfunc_eligible) { duk_tval tv_lfunc; duk_small_uint_t lf_nargs = (duk_small_uint_t) (c_nargs == DUK_VARARGS ? DUK_LFUNC_NARGS_VARARGS : c_nargs); duk_small_uint_t lf_flags = DUK_LFUNC_FLAGS_PACK(magic, c_length, lf_nargs); DUK_TVAL_SET_LIGHTFUNC(&tv_lfunc, c_func, lf_flags); duk_push_tval(thr, &tv_lfunc); DUK_D(DUK_DPRINT("built-in function eligible as light function: i=%d, j=%d c_length=%ld, c_nargs=%ld, magic=%ld -> %!iT", (int) i, (int) j, (long) c_length, (long) c_nargs, (long) magic, duk_get_tval(thr, -1))); goto lightfunc_skip; } DUK_D(DUK_DPRINT("built-in function NOT ELIGIBLE as light function: i=%d, j=%d c_length=%ld, c_nargs=%ld, magic=%ld", (int) i, (int) j, (long) c_length, (long) c_nargs, (long) magic)); #endif /* DUK_USE_LIGHTFUNC_BUILTINS */ /* [ (builtin objects) name ] */ duk_push_c_function_builtin_noconstruct(thr, c_func, c_nargs); h_func = duk_known_hnatfunc(thr, -1); DUK_UNREF(h_func); /* XXX: add into init data? */ /* Special call handling, not described in init data. */ if (c_func == duk_bi_global_object_eval || c_func == duk_bi_function_prototype_call || c_func == duk_bi_function_prototype_apply || c_func == duk_bi_reflect_apply || c_func == duk_bi_reflect_construct) { DUK_HOBJECT_SET_SPECIAL_CALL((duk_hobject *) h_func); } /* Currently all built-in native functions are strict. * This doesn't matter for many functions, but e.g. * String.prototype.charAt (and other string functions) * rely on being strict so that their 'this' binding is * not automatically coerced. */ DUK_HOBJECT_SET_STRICT((duk_hobject *) h_func); /* No built-in functions are constructable except the top * level ones (Number, etc). */ DUK_ASSERT(!DUK_HOBJECT_HAS_CONSTRUCTABLE((duk_hobject *) h_func)); /* XXX: any way to avoid decoding magic bit; there are quite * many function properties and relatively few with magic values. */ h_func->magic = magic; /* [ (builtin objects) name func ] */ duk_push_uint(thr, c_length); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_C); duk_dup_m2(thr); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_C); /* XXX: other properties of function instances; 'arguments', 'caller'. */ DUK_DD(DUK_DDPRINT("built-in object %ld, function property %ld -> %!T", (long) i, (long) j, (duk_tval *) duk_get_tval(thr, -1))); /* [ (builtin objects) name func ] */ /* * The default property attributes are correct for all * function valued properties of built-in objects now. */ #if defined(DUK_USE_LIGHTFUNC_BUILTINS) lightfunc_skip: #endif /* XXX: So far all ES builtins are 'wc' but e.g. * performance.now() should be 'wec'. */ duk_xdef_prop(thr, (duk_idx_t) i, DUK_PROPDESC_FLAGS_WC); /* [ (builtin objects) ] */ } } /* * Special post-tweaks, for cases not covered by the init data format. * * - Set Date.prototype.toGMTString to Date.prototype.toUTCString. * toGMTString is required to have the same Function object as * toUTCString in E5 Section B.2.6. Note that while Smjs respects * this, V8 does not (the Function objects are distinct). * * - Make DoubleError non-extensible. * * - Add info about most important effective compile options to Duktape. * * - Possibly remove some properties (values or methods) which are not * desirable with current feature options but are not currently * conditional in init data. */ #if defined(DUK_USE_DATE_BUILTIN) duk_get_prop_stridx_short(thr, DUK_BIDX_DATE_PROTOTYPE, DUK_STRIDX_TO_UTC_STRING); duk_xdef_prop_stridx_short(thr, DUK_BIDX_DATE_PROTOTYPE, DUK_STRIDX_TO_GMT_STRING, DUK_PROPDESC_FLAGS_WC); #endif h = duk_known_hobject(thr, DUK_BIDX_DOUBLE_ERROR); DUK_HOBJECT_CLEAR_EXTENSIBLE(h); #if !defined(DUK_USE_ES6_OBJECT_PROTO_PROPERTY) DUK_DD(DUK_DDPRINT("delete Object.prototype.__proto__ built-in which is not enabled in features")); (void) duk_hobject_delprop_raw(thr, thr->builtins[DUK_BIDX_OBJECT_PROTOTYPE], DUK_HTHREAD_STRING___PROTO__(thr), DUK_DELPROP_FLAG_THROW); #endif #if !defined(DUK_USE_ES6_OBJECT_SETPROTOTYPEOF) DUK_DD(DUK_DDPRINT("delete Object.setPrototypeOf built-in which is not enabled in features")); (void) duk_hobject_delprop_raw(thr, thr->builtins[DUK_BIDX_OBJECT_CONSTRUCTOR], DUK_HTHREAD_STRING_SET_PROTOTYPE_OF(thr), DUK_DELPROP_FLAG_THROW); #endif /* XXX: relocate */ duk_push_string(thr, /* Endianness indicator */ #if defined(DUK_USE_INTEGER_LE) "l" #elif defined(DUK_USE_INTEGER_BE) "b" #elif defined(DUK_USE_INTEGER_ME) /* integer mixed endian not really used now */ "m" #else "?" #endif #if defined(DUK_USE_DOUBLE_LE) "l" #elif defined(DUK_USE_DOUBLE_BE) "b" #elif defined(DUK_USE_DOUBLE_ME) "m" #else "?" #endif " " /* Packed or unpacked tval */ #if defined(DUK_USE_PACKED_TVAL) "p" #else "u" #endif #if defined(DUK_USE_FASTINT) "f" #endif " " /* Low memory options */ #if defined(DUK_USE_STRTAB_PTRCOMP) "s" #endif #if !defined(DUK_USE_HEAPPTR16) && !defined(DUK_DATAPTR16) && !defined(DUK_FUNCPTR16) "n" #endif #if defined(DUK_USE_HEAPPTR16) "h" #endif #if defined(DUK_USE_DATAPTR16) "d" #endif #if defined(DUK_USE_FUNCPTR16) "f" #endif #if defined(DUK_USE_REFCOUNT16) "R" #endif #if defined(DUK_USE_STRHASH16) "H" #endif #if defined(DUK_USE_STRLEN16) "S" #endif #if defined(DUK_USE_BUFLEN16) "B" #endif #if defined(DUK_USE_OBJSIZES16) "O" #endif #if defined(DUK_USE_LIGHTFUNC_BUILTINS) "L" #endif #if defined(DUK_USE_ROM_STRINGS) || defined(DUK_USE_ROM_OBJECTS) /* XXX: This won't be shown in practice now * because this code is not run when builtins * are in ROM. */ "Z" #endif " " /* Object property allocation layout */ #if defined(DUK_USE_HOBJECT_LAYOUT_1) "p1" #elif defined(DUK_USE_HOBJECT_LAYOUT_2) "p2" #elif defined(DUK_USE_HOBJECT_LAYOUT_3) "p3" #else "p?" #endif " " /* Alignment guarantee */ #if (DUK_USE_ALIGN_BY == 4) "a4" #elif (DUK_USE_ALIGN_BY == 8) "a8" #elif (DUK_USE_ALIGN_BY == 1) "a1" #else #error invalid DUK_USE_ALIGN_BY #endif " " /* Architecture, OS, and compiler strings */ DUK_USE_ARCH_STRING " " DUK_USE_OS_STRING " " DUK_USE_COMPILER_STRING); duk_xdef_prop_stridx_short(thr, DUK_BIDX_DUKTAPE, DUK_STRIDX_ENV, DUK_PROPDESC_FLAGS_WC); /* * Since built-ins are not often extended, compact them. */ DUK_DD(DUK_DDPRINT("compact built-ins")); for (i = 0; i < DUK_NUM_ALL_BUILTINS; i++) { duk_hobject_compact_props(thr, duk_known_hobject(thr, (duk_idx_t) i)); } DUK_D(DUK_DPRINT("INITBUILTINS END")); #if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 1) for (i = 0; i < DUK_NUM_ALL_BUILTINS; i++) { DUK_DD(DUK_DDPRINT("built-in object %ld after initialization and compacting: %!@iO", (long) i, (duk_heaphdr *) duk_require_hobject(thr, i))); } #endif /* * Pop built-ins from stack: they are now INCREF'd and * reachable from the builtins[] array or indirectly * through builtins[]. */ duk_set_top(thr, 0); DUK_ASSERT_TOP(thr, 0); } #endif /* DUK_USE_ROM_OBJECTS */ DUK_INTERNAL void duk_hthread_copy_builtin_objects(duk_hthread *thr_from, duk_hthread *thr_to) { duk_small_uint_t i; for (i = 0; i < DUK_NUM_BUILTINS; i++) { thr_to->builtins[i] = thr_from->builtins[i]; DUK_HOBJECT_INCREF_ALLOWNULL(thr_to, thr_to->builtins[i]); /* side effect free */ } } /* automatic undefs */ #undef DUK__LENGTH_PROP_BITS #undef DUK__NARGS_BITS #undef DUK__NARGS_VARARGS_MARKER #undef DUK__PROP_FLAGS_BITS #undef DUK__PROP_TYPE_ACCESSOR #undef DUK__PROP_TYPE_BITS #undef DUK__PROP_TYPE_BOOLEAN_FALSE #undef DUK__PROP_TYPE_BOOLEAN_TRUE #undef DUK__PROP_TYPE_BUILTIN #undef DUK__PROP_TYPE_DOUBLE #undef DUK__PROP_TYPE_STRIDX #undef DUK__PROP_TYPE_STRING #undef DUK__PROP_TYPE_UNDEFINED #line 1 "duk_hthread_misc.c" /* * Thread support. */ /* #include duk_internal.h -> already included */ DUK_INTERNAL void duk_hthread_terminate(duk_hthread *thr) { DUK_ASSERT(thr != NULL); while (thr->callstack_curr != NULL) { duk_hthread_activation_unwind_norz(thr); } thr->valstack_bottom = thr->valstack; duk_set_top(thr, 0); /* unwinds valstack, updating refcounts */ thr->state = DUK_HTHREAD_STATE_TERMINATED; /* Here we could remove references to built-ins, but it may not be * worth the effort because built-ins are quite likely to be shared * with another (unterminated) thread, and terminated threads are also * usually garbage collected quite quickly. * * We could also shrink the value stack here, but that also may not * be worth the effort for the same reason. */ DUK_REFZERO_CHECK_SLOW(thr); } #if defined(DUK_USE_DEBUGGER_SUPPORT) DUK_INTERNAL duk_uint_fast32_t duk_hthread_get_act_curr_pc(duk_hthread *thr, duk_activation *act) { duk_instr_t *bcode; DUK_ASSERT(thr != NULL); DUK_ASSERT(act != NULL); DUK_UNREF(thr); /* XXX: store 'bcode' pointer to activation for faster lookup? */ if (act->func && DUK_HOBJECT_IS_COMPFUNC(act->func)) { bcode = DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, (duk_hcompfunc *) (act->func)); return (duk_uint_fast32_t) (act->curr_pc - bcode); } return 0; } #endif /* DUK_USE_DEBUGGER_SUPPORT */ DUK_INTERNAL duk_uint_fast32_t duk_hthread_get_act_prev_pc(duk_hthread *thr, duk_activation *act) { duk_instr_t *bcode; duk_uint_fast32_t ret; DUK_ASSERT(thr != NULL); DUK_ASSERT(act != NULL); DUK_UNREF(thr); if (act->func && DUK_HOBJECT_IS_COMPFUNC(act->func)) { bcode = DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, (duk_hcompfunc *) (act->func)); ret = (duk_uint_fast32_t) (act->curr_pc - bcode); if (ret > 0) { ret--; } return ret; } return 0; } /* Write bytecode executor's curr_pc back to topmost activation (if any). */ DUK_INTERNAL void duk_hthread_sync_currpc(duk_hthread *thr) { duk_activation *act; DUK_ASSERT(thr != NULL); if (thr->ptr_curr_pc != NULL) { /* ptr_curr_pc != NULL only when bytecode executor is active. */ DUK_ASSERT(thr->callstack_top > 0); DUK_ASSERT(thr->callstack_curr != NULL); act = thr->callstack_curr; DUK_ASSERT(act != NULL); act->curr_pc = *thr->ptr_curr_pc; } } DUK_INTERNAL void duk_hthread_sync_and_null_currpc(duk_hthread *thr) { duk_activation *act; DUK_ASSERT(thr != NULL); if (thr->ptr_curr_pc != NULL) { /* ptr_curr_pc != NULL only when bytecode executor is active. */ DUK_ASSERT(thr->callstack_top > 0); DUK_ASSERT(thr->callstack_curr != NULL); act = thr->callstack_curr; DUK_ASSERT(act != NULL); act->curr_pc = *thr->ptr_curr_pc; thr->ptr_curr_pc = NULL; } } #line 1 "duk_hthread_stacks.c" /* * Thread stack (mainly call stack) primitives: allocation of activations, * unwinding catchers and activations, etc. * * Value stack handling is a part of the API implementation. */ /* #include duk_internal.h -> already included */ /* Unwind the topmost catcher of the current activation (caller must check that * both exist) without side effects. */ DUK_INTERNAL void duk_hthread_catcher_unwind_norz(duk_hthread *thr, duk_activation *act) { duk_catcher *cat; DUK_ASSERT(thr != NULL); DUK_ASSERT(act != NULL); DUK_ASSERT(act->cat != NULL); /* caller must check */ cat = act->cat; DUK_ASSERT(cat != NULL); DUK_DDD(DUK_DDDPRINT("unwinding catch stack entry %p (lexenv check is done)", (void *) cat)); if (DUK_CAT_HAS_LEXENV_ACTIVE(cat)) { duk_hobject *env; env = act->lex_env; /* current lex_env of the activation (created for catcher) */ DUK_ASSERT(env != NULL); /* must be, since env was created when catcher was created */ act->lex_env = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, env); /* prototype is lex_env before catcher created */ DUK_HOBJECT_INCREF(thr, act->lex_env); DUK_HOBJECT_DECREF_NORZ(thr, env); /* There is no need to decref anything else than 'env': if 'env' * becomes unreachable, refzero will handle decref'ing its prototype. */ } act->cat = cat->parent; duk_hthread_catcher_free(thr, cat); } /* Same as above, but caller is certain no catcher-related lexenv may exist. */ DUK_INTERNAL void duk_hthread_catcher_unwind_nolexenv_norz(duk_hthread *thr, duk_activation *act) { duk_catcher *cat; DUK_ASSERT(thr != NULL); DUK_ASSERT(act != NULL); DUK_ASSERT(act->cat != NULL); /* caller must check */ cat = act->cat; DUK_ASSERT(cat != NULL); DUK_DDD(DUK_DDDPRINT("unwinding catch stack entry %p (lexenv check is not done)", (void *) cat)); DUK_ASSERT(!DUK_CAT_HAS_LEXENV_ACTIVE(cat)); act->cat = cat->parent; duk_hthread_catcher_free(thr, cat); } DUK_LOCAL #if defined(DUK_USE_CACHE_CATCHER) DUK_NOINLINE #endif duk_catcher *duk__hthread_catcher_alloc_slow(duk_hthread *thr) { duk_catcher *cat; cat = (duk_catcher *) DUK_ALLOC_CHECKED(thr, sizeof(duk_catcher)); DUK_ASSERT(cat != NULL); return cat; } #if defined(DUK_USE_CACHE_CATCHER) DUK_INTERNAL DUK_INLINE duk_catcher *duk_hthread_catcher_alloc(duk_hthread *thr) { duk_catcher *cat; DUK_ASSERT(thr != NULL); cat = thr->heap->catcher_free; if (DUK_LIKELY(cat != NULL)) { thr->heap->catcher_free = cat->parent; return cat; } return duk__hthread_catcher_alloc_slow(thr); } #else /* DUK_USE_CACHE_CATCHER */ DUK_INTERNAL duk_catcher *duk_hthread_catcher_alloc(duk_hthread *thr) { return duk__hthread_catcher_alloc_slow(thr); } #endif /* DUK_USE_CACHE_CATCHER */ DUK_INTERNAL void duk_hthread_catcher_free(duk_hthread *thr, duk_catcher *cat) { DUK_ASSERT(thr != NULL); DUK_ASSERT(cat != NULL); #if defined(DUK_USE_CACHE_CATCHER) /* Unconditional caching for now; freed in mark-and-sweep. */ cat->parent = thr->heap->catcher_free; thr->heap->catcher_free = cat; #else DUK_FREE_CHECKED(thr, (void *) cat); #endif } DUK_LOCAL #if defined(DUK_USE_CACHE_ACTIVATION) DUK_NOINLINE #endif duk_activation *duk__hthread_activation_alloc_slow(duk_hthread *thr) { duk_activation *act; act = (duk_activation *) DUK_ALLOC_CHECKED(thr, sizeof(duk_activation)); DUK_ASSERT(act != NULL); return act; } #if defined(DUK_USE_CACHE_ACTIVATION) DUK_INTERNAL DUK_INLINE duk_activation *duk_hthread_activation_alloc(duk_hthread *thr) { duk_activation *act; DUK_ASSERT(thr != NULL); act = thr->heap->activation_free; if (DUK_LIKELY(act != NULL)) { thr->heap->activation_free = act->parent; return act; } return duk__hthread_activation_alloc_slow(thr); } #else /* DUK_USE_CACHE_ACTIVATION */ DUK_INTERNAL duk_activation *duk_hthread_activation_alloc(duk_hthread *thr) { return duk__hthread_activation_alloc_slow(thr); } #endif /* DUK_USE_CACHE_ACTIVATION */ DUK_INTERNAL void duk_hthread_activation_free(duk_hthread *thr, duk_activation *act) { DUK_ASSERT(thr != NULL); DUK_ASSERT(act != NULL); #if defined(DUK_USE_CACHE_ACTIVATION) /* Unconditional caching for now; freed in mark-and-sweep. */ act->parent = thr->heap->activation_free; thr->heap->activation_free = act; #else DUK_FREE_CHECKED(thr, (void *) act); #endif } /* Internal helper: process the unwind for the topmost activation of a thread, * but leave the duk_activation in place for possible tailcall reuse. */ DUK_LOCAL void duk__activation_unwind_nofree_norz(duk_hthread *thr) { #if defined(DUK_USE_DEBUGGER_SUPPORT) duk_heap *heap; #endif duk_activation *act; duk_hobject *func; duk_hobject *tmp; DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->callstack_curr != NULL); /* caller must check */ DUK_ASSERT(thr->callstack_top > 0); act = thr->callstack_curr; DUK_ASSERT(act != NULL); /* With lightfuncs, act 'func' may be NULL. */ /* With duk_activation records allocated separately, 'act' is a stable * pointer and not affected by side effects. */ #if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY) /* * Restore 'caller' property for non-strict callee functions. */ func = DUK_ACT_GET_FUNC(act); if (func != NULL && !DUK_HOBJECT_HAS_STRICT(func)) { duk_tval *tv_caller; duk_tval tv_tmp; duk_hobject *h_tmp; tv_caller = duk_hobject_find_existing_entry_tval_ptr(thr->heap, func, DUK_HTHREAD_STRING_CALLER(thr)); /* The act->prev_caller should only be set if the entry for 'caller' * exists (as it is only set in that case, and the property is not * configurable), but handle all the cases anyway. */ if (tv_caller) { DUK_TVAL_SET_TVAL(&tv_tmp, tv_caller); if (act->prev_caller) { /* Just transfer the refcount from act->prev_caller to tv_caller, * so no need for a refcount update. This is the expected case. */ DUK_TVAL_SET_OBJECT(tv_caller, act->prev_caller); act->prev_caller = NULL; } else { DUK_TVAL_SET_NULL(tv_caller); /* no incref needed */ DUK_ASSERT(act->prev_caller == NULL); } DUK_TVAL_DECREF_NORZ(thr, &tv_tmp); } else { h_tmp = act->prev_caller; if (h_tmp) { act->prev_caller = NULL; DUK_HOBJECT_DECREF_NORZ(thr, h_tmp); } } DUK_ASSERT(act->prev_caller == NULL); } #endif /* * Unwind debugger state. If we unwind while stepping * (for any step type), pause execution. This is the * only place explicitly handling a step out. */ #if defined(DUK_USE_DEBUGGER_SUPPORT) heap = thr->heap; if (heap->dbg_pause_act == thr->callstack_curr) { if (heap->dbg_pause_flags & DUK_PAUSE_FLAG_FUNC_EXIT) { DUK_D(DUK_DPRINT("PAUSE TRIGGERED by function exit")); duk_debug_set_paused(heap); } else { DUK_D(DUK_DPRINT("unwound past dbg_pause_act, set to NULL")); heap->dbg_pause_act = NULL; /* avoid stale pointers */ } DUK_ASSERT(heap->dbg_pause_act == NULL); } #endif /* * Unwind catchers. * * Since there are no references in the catcher structure, * unwinding is quite simple. The only thing we need to * look out for is popping a possible lexical environment * established for an active catch clause. */ while (act->cat != NULL) { duk_hthread_catcher_unwind_norz(thr, act); } /* * Close environment record(s) if they exist. * * Only variable environments are closed. If lex_env != var_env, it * cannot currently contain any register bound declarations. * * Only environments created for a NEWENV function are closed. If an * environment is created for e.g. an eval call, it must not be closed. */ func = DUK_ACT_GET_FUNC(act); if (func != NULL && !DUK_HOBJECT_HAS_NEWENV(func)) { DUK_DDD(DUK_DDDPRINT("skip closing environments, envs not owned by this activation")); goto skip_env_close; } /* func is NULL for lightfunc */ /* Catch sites are required to clean up their environments * in FINALLY part before propagating, so this should * always hold here. */ DUK_ASSERT(act->lex_env == act->var_env); /* XXX: Closing the environment record copies values from registers * into the scope object. It's side effect free as such, but may * currently run out of memory which causes an error throw. This is * an actual sandboxing problem for error unwinds, and needs to be * fixed e.g. by preallocating the scope property slots. */ if (act->var_env != NULL) { DUK_DDD(DUK_DDDPRINT("closing var_env record %p -> %!O", (void *) act->var_env, (duk_heaphdr *) act->var_env)); duk_js_close_environment_record(thr, act->var_env); } skip_env_close: /* * Update preventcount */ if (act->flags & DUK_ACT_FLAG_PREVENT_YIELD) { DUK_ASSERT(thr->callstack_preventcount >= 1); thr->callstack_preventcount--; } /* * Reference count updates, using NORZ macros so we don't * need to handle side effects. * * duk_activation pointers like act->var_env are intentionally * left as garbage and not NULLed. Without side effects they * can't be used when the values are dangling/garbage. */ DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, act->var_env); DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, act->lex_env); tmp = DUK_ACT_GET_FUNC(act); DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, tmp); DUK_UNREF(tmp); } /* Unwind topmost duk_activation of a thread, caller must ensure that an * activation exists. The call is side effect free, except that scope * closure may currently throw an out-of-memory error. */ DUK_INTERNAL void duk_hthread_activation_unwind_norz(duk_hthread *thr) { duk_activation *act; duk__activation_unwind_nofree_norz(thr); DUK_ASSERT(thr->callstack_curr != NULL); DUK_ASSERT(thr->callstack_top > 0); act = thr->callstack_curr; thr->callstack_curr = act->parent; thr->callstack_top--; /* Ideally we'd restore value stack reserve here to caller's value. * This doesn't work for current unwind call sites however, because * the current (unwound) value stack top may be above the reserve. * Thus value stack reserve is restored by the call sites. */ /* XXX: inline for performance builds? */ duk_hthread_activation_free(thr, act); /* We could clear the book-keeping variables like retval_byteoff for * the topmost activation, but don't do so now as it's not necessary. */ } DUK_INTERNAL void duk_hthread_activation_unwind_reuse_norz(duk_hthread *thr) { duk__activation_unwind_nofree_norz(thr); } /* Get duk_activation for given callstack level or NULL if level is invalid * or deeper than the call stack. Level -1 refers to current activation, -2 * to its caller, etc. Starting from Duktape 2.2 finding the activation is * a linked list scan which gets more expensive the deeper the lookup is. */ DUK_INTERNAL duk_activation *duk_hthread_get_activation_for_level(duk_hthread *thr, duk_int_t level) { duk_activation *act; if (level >= 0) { return NULL; } act = thr->callstack_curr; for (;;) { if (act == NULL) { return act; } if (level == -1) { return act; } level++; act = act->parent; } /* never here */ } #if defined(DUK_USE_FINALIZER_TORTURE) DUK_INTERNAL void duk_hthread_valstack_torture_realloc(duk_hthread *thr) { duk_size_t alloc_size; duk_tval *new_ptr; duk_ptrdiff_t alloc_end_off; duk_ptrdiff_t end_off; duk_ptrdiff_t bottom_off; duk_ptrdiff_t top_off; if (thr->valstack == NULL) { DUK_D(DUK_DPRINT("skip valstack torture realloc, valstack is NULL")); return; } alloc_end_off = (duk_ptrdiff_t) ((duk_uint8_t *) thr->valstack_alloc_end - (duk_uint8_t *) thr->valstack); end_off = (duk_ptrdiff_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack); bottom_off = (duk_ptrdiff_t) ((duk_uint8_t *) thr->valstack_bottom - (duk_uint8_t *) thr->valstack); top_off = (duk_ptrdiff_t) ((duk_uint8_t *) thr->valstack_top - (duk_uint8_t *) thr->valstack); alloc_size = (duk_size_t) alloc_end_off; if (alloc_size == 0) { DUK_D(DUK_DPRINT("skip valstack torture realloc, alloc_size is zero")); return; } /* Use DUK_ALLOC_RAW() to avoid side effects. */ new_ptr = (duk_tval *) DUK_ALLOC_RAW(thr->heap, alloc_size); if (new_ptr != NULL) { DUK_MEMCPY((void *) new_ptr, (const void *) thr->valstack, alloc_size); DUK_MEMSET((void *) thr->valstack, 0x55, alloc_size); DUK_FREE_CHECKED(thr, (void *) thr->valstack); thr->valstack = new_ptr; thr->valstack_alloc_end = (duk_tval *) ((duk_uint8_t *) new_ptr + alloc_end_off); thr->valstack_end = (duk_tval *) ((duk_uint8_t *) new_ptr + end_off); thr->valstack_bottom = (duk_tval *) ((duk_uint8_t *) new_ptr + bottom_off); thr->valstack_top = (duk_tval *) ((duk_uint8_t *) new_ptr + top_off); } else { DUK_D(DUK_DPRINT("failed to realloc valstack for torture, ignore")); } } #endif /* DUK_USE_FINALIZER_TORTURE */ #line 1 "duk_js_arith.c" /* * Shared helpers for arithmetic operations */ /* #include duk_internal.h -> already included */ /* Ecmascript modulus ('%') does not match IEEE 754 "remainder" operation * (implemented by remainder() in C99) but does seem to match ANSI C fmod(). * Compare E5 Section 11.5.3 and "man fmod". */ DUK_INTERNAL double duk_js_arith_mod(double d1, double d2) { #if defined(DUK_USE_POW_WORKAROUNDS) /* Specific fixes to common fmod() implementation issues: * - test-bug-mingw-math-issues.js */ if (DUK_ISINF(d2)) { if (DUK_ISINF(d1)) { return DUK_DOUBLE_NAN; } else { return d1; } } else if (d1 == 0.0) { /* d1 +/-0 is returned as is (preserving sign) except when * d2 is zero or NaN. */ if (d2 == 0.0 || DUK_ISNAN(d2)) { return DUK_DOUBLE_NAN; } else { return d1; } } #else /* Some ISO C assumptions. */ DUK_ASSERT(DUK_FMOD(1.0, DUK_DOUBLE_INFINITY) == 1.0); DUK_ASSERT(DUK_FMOD(-1.0, DUK_DOUBLE_INFINITY) == -1.0); DUK_ASSERT(DUK_FMOD(1.0, -DUK_DOUBLE_INFINITY) == 1.0); DUK_ASSERT(DUK_FMOD(-1.0, -DUK_DOUBLE_INFINITY) == -1.0); DUK_ASSERT(DUK_ISNAN(DUK_FMOD(DUK_DOUBLE_INFINITY, DUK_DOUBLE_INFINITY))); DUK_ASSERT(DUK_ISNAN(DUK_FMOD(DUK_DOUBLE_INFINITY, -DUK_DOUBLE_INFINITY))); DUK_ASSERT(DUK_ISNAN(DUK_FMOD(-DUK_DOUBLE_INFINITY, DUK_DOUBLE_INFINITY))); DUK_ASSERT(DUK_ISNAN(DUK_FMOD(-DUK_DOUBLE_INFINITY, -DUK_DOUBLE_INFINITY))); DUK_ASSERT(DUK_FMOD(0.0, 1.0) == 0.0 && DUK_SIGNBIT(DUK_FMOD(0.0, 1.0)) == 0); DUK_ASSERT(DUK_FMOD(-0.0, 1.0) == 0.0 && DUK_SIGNBIT(DUK_FMOD(-0.0, 1.0)) != 0); DUK_ASSERT(DUK_FMOD(0.0, DUK_DOUBLE_INFINITY) == 0.0 && DUK_SIGNBIT(DUK_FMOD(0.0, DUK_DOUBLE_INFINITY)) == 0); DUK_ASSERT(DUK_FMOD(-0.0, DUK_DOUBLE_INFINITY) == 0.0 && DUK_SIGNBIT(DUK_FMOD(-0.0, DUK_DOUBLE_INFINITY)) != 0); DUK_ASSERT(DUK_FMOD(0.0, -DUK_DOUBLE_INFINITY) == 0.0 && DUK_SIGNBIT(DUK_FMOD(0.0, DUK_DOUBLE_INFINITY)) == 0); DUK_ASSERT(DUK_FMOD(-0.0, -DUK_DOUBLE_INFINITY) == 0.0 && DUK_SIGNBIT(DUK_FMOD(-0.0, -DUK_DOUBLE_INFINITY)) != 0); DUK_ASSERT(DUK_ISNAN(DUK_FMOD(0.0, 0.0))); DUK_ASSERT(DUK_ISNAN(DUK_FMOD(-0.0, 0.0))); DUK_ASSERT(DUK_ISNAN(DUK_FMOD(0.0, -0.0))); DUK_ASSERT(DUK_ISNAN(DUK_FMOD(-0.0, -0.0))); DUK_ASSERT(DUK_ISNAN(DUK_FMOD(0.0, DUK_DOUBLE_NAN))); DUK_ASSERT(DUK_ISNAN(DUK_FMOD(-0.0, DUK_DOUBLE_NAN))); #endif return (duk_double_t) DUK_FMOD((double) d1, (double) d2); } /* Shared helper for Math.pow() and exponentiation operator. */ DUK_INTERNAL double duk_js_arith_pow(double x, double y) { /* The ANSI C pow() semantics differ from Ecmascript. * * E.g. when x==1 and y is +/- infinite, the Ecmascript required * result is NaN, while at least Linux pow() returns 1. */ duk_small_int_t cx, cy, sx; DUK_UNREF(cx); DUK_UNREF(sx); cy = (duk_small_int_t) DUK_FPCLASSIFY(y); if (cy == DUK_FP_NAN) { goto ret_nan; } if (DUK_FABS(x) == 1.0 && cy == DUK_FP_INFINITE) { goto ret_nan; } #if defined(DUK_USE_POW_WORKAROUNDS) /* Specific fixes to common pow() implementation issues: * - test-bug-netbsd-math-pow.js: NetBSD 6.0 on x86 (at least) * - test-bug-mingw-math-issues.js */ cx = (duk_small_int_t) DUK_FPCLASSIFY(x); if (cx == DUK_FP_ZERO && y < 0.0) { sx = (duk_small_int_t) DUK_SIGNBIT(x); if (sx == 0) { /* Math.pow(+0,y) should be Infinity when y<0. NetBSD pow() * returns -Infinity instead when y is <0 and finite. The * if-clause also catches y == -Infinity (which works even * without the fix). */ return DUK_DOUBLE_INFINITY; } else { /* Math.pow(-0,y) where y<0 should be: * - -Infinity if y<0 and an odd integer * - Infinity if y<0 but not an odd integer * NetBSD pow() returns -Infinity for all finite y<0. The * if-clause also catches y == -Infinity (which works even * without the fix). */ /* fmod() return value has same sign as input (negative) so * the result here will be in the range ]-2,0], -1 indicates * odd. If x is -Infinity, NaN is returned and the odd check * always concludes "not odd" which results in desired outcome. */ double tmp = DUK_FMOD(y, 2); if (tmp == -1.0) { return -DUK_DOUBLE_INFINITY; } else { /* Not odd, or y == -Infinity */ return DUK_DOUBLE_INFINITY; } } } else if (cx == DUK_FP_NAN) { if (y == 0.0) { /* NaN ** +/- 0 should always be 1, but is NaN on * at least some Cygwin/MinGW versions. */ return 1.0; } } #else /* Some ISO C assumptions. */ DUK_ASSERT(DUK_POW(DUK_DOUBLE_NAN, 0.0) == 1.0); DUK_ASSERT(DUK_ISINF(DUK_POW(0.0, -1.0)) && DUK_SIGNBIT(DUK_POW(0.0, -1.0)) == 0); DUK_ASSERT(DUK_ISINF(DUK_POW(-0.0, -2.0)) && DUK_SIGNBIT(DUK_POW(-0.0, -2.0)) == 0); DUK_ASSERT(DUK_ISINF(DUK_POW(-0.0, -3.0)) && DUK_SIGNBIT(DUK_POW(-0.0, -3.0)) != 0); #endif return DUK_POW(x, y); ret_nan: return DUK_DOUBLE_NAN; } #line 1 "duk_js_call.c" /* * Call handling. * * duk_handle_call_unprotected(): * * - Unprotected call to Ecmascript or Duktape/C function, from native * code or bytecode executor. * * - Also handles Ecma-to-Ecma calls which reuses a currently running * executor instance to avoid native recursion. Call setup is done * normally, but just before calling the bytecode executor a special * return code is used to indicate that a calling executor is reused. * * - Also handles tailcalls, i.e. reuse of current duk_activation. * * - Also handles setup for initial Duktape.Thread.resume(). * * duk_handle_safe_call(): * * - Protected C call within current activation. * * setjmp() and local variables have a nasty interaction, see execution.rst; * non-volatile locals modified after setjmp() call are not guaranteed to * keep their value and can cause compiler or compiler version specific * difficult to replicate issues. * * See 'execution.rst'. */ /* #include duk_internal.h -> already included */ /* XXX: heap->error_not_allowed for success path too? */ /* * Limit check helpers. */ /* Allow headroom for calls during error augmentation (see GH-191). * We allow space for 10 additional recursions, with one extra * for, e.g. a print() call at the deepest level, and an extra * +1 for protected call wrapping. */ #define DUK__AUGMENT_CALL_RELAX_COUNT (10 + 2) DUK_LOCAL DUK_NOINLINE void duk__call_c_recursion_limit_check_slowpath(duk_hthread *thr) { /* When augmenting an error, the effective limit is a bit higher. * Check for it only if the fast path check fails. */ #if defined(DUK_USE_AUGMENT_ERROR_THROW) || defined(DUK_USE_AUGMENT_ERROR_CREATE) if (thr->heap->augmenting_error) { if (thr->heap->call_recursion_depth < thr->heap->call_recursion_limit + DUK__AUGMENT_CALL_RELAX_COUNT) { DUK_D(DUK_DPRINT("C recursion limit reached but augmenting error and within relaxed limit")); return; } } #endif DUK_D(DUK_DPRINT("call prevented because C recursion limit reached")); DUK_ERROR_RANGE(thr, DUK_STR_C_CALLSTACK_LIMIT); } DUK_LOCAL DUK_ALWAYS_INLINE void duk__call_c_recursion_limit_check(duk_hthread *thr) { DUK_ASSERT(thr->heap->call_recursion_depth >= 0); DUK_ASSERT(thr->heap->call_recursion_depth <= thr->heap->call_recursion_limit); /* This check is forcibly inlined because it's very cheap and almost * always passes. The slow path is forcibly noinline. */ if (DUK_LIKELY(thr->heap->call_recursion_depth < thr->heap->call_recursion_limit)) { return; } duk__call_c_recursion_limit_check_slowpath(thr); } DUK_LOCAL DUK_NOINLINE void duk__call_callstack_limit_check_slowpath(duk_hthread *thr) { /* When augmenting an error, the effective limit is a bit higher. * Check for it only if the fast path check fails. */ #if defined(DUK_USE_AUGMENT_ERROR_THROW) || defined(DUK_USE_AUGMENT_ERROR_CREATE) if (thr->heap->augmenting_error) { if (thr->callstack_top < DUK_USE_CALLSTACK_LIMIT + DUK__AUGMENT_CALL_RELAX_COUNT) { DUK_D(DUK_DPRINT("call stack limit reached but augmenting error and within relaxed limit")); return; } } #endif /* XXX: error message is a bit misleading: we reached a recursion * limit which is also essentially the same as a C callstack limit * (except perhaps with some relaxed threading assumptions). */ DUK_D(DUK_DPRINT("call prevented because call stack limit reached")); DUK_ERROR_RANGE(thr, DUK_STR_CALLSTACK_LIMIT); } DUK_LOCAL DUK_ALWAYS_INLINE void duk__call_callstack_limit_check(duk_hthread *thr) { /* This check is forcibly inlined because it's very cheap and almost * always passes. The slow path is forcibly noinline. */ if (DUK_LIKELY(thr->callstack_top < DUK_USE_CALLSTACK_LIMIT)) { return; } duk__call_callstack_limit_check_slowpath(thr); } /* * Interrupt counter fixup (for development only). */ #if defined(DUK_USE_INTERRUPT_COUNTER) && defined(DUK_USE_DEBUG) DUK_LOCAL void duk__interrupt_fixup(duk_hthread *thr, duk_hthread *entry_curr_thread) { /* Currently the bytecode executor and executor interrupt * instruction counts are off because we don't execute the * interrupt handler when we're about to exit from the initial * user call into Duktape. * * If we were to execute the interrupt handler here, the counts * would match. You can enable this block manually to check * that this is the case. */ DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->heap != NULL); #if defined(DUK_USE_INTERRUPT_DEBUG_FIXUP) if (entry_curr_thread == NULL) { thr->interrupt_init = thr->interrupt_init - thr->interrupt_counter; thr->heap->inst_count_interrupt += thr->interrupt_init; DUK_DD(DUK_DDPRINT("debug test: updated interrupt count on exit to " "user code, instruction counts: executor=%ld, interrupt=%ld", (long) thr->heap->inst_count_exec, (long) thr->heap->inst_count_interrupt)); DUK_ASSERT(thr->heap->inst_count_exec == thr->heap->inst_count_interrupt); } #else DUK_UNREF(thr); DUK_UNREF(entry_curr_thread); #endif } #endif /* * Arguments object creation. * * Creating arguments objects involves many small details, see E5 Section * 10.6 for the specific requirements. Much of the arguments object exotic * behavior is implemented in duk_hobject_props.c, and is enabled by the * object flag DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS. */ DUK_LOCAL void duk__create_arguments_object(duk_hthread *thr, duk_hobject *func, duk_hobject *varenv, duk_idx_t idx_args) { duk_hobject *arg; /* 'arguments' */ duk_hobject *formals; /* formals for 'func' (may be NULL if func is a C function) */ duk_idx_t i_arg; duk_idx_t i_map; duk_idx_t i_mappednames; duk_idx_t i_formals; duk_idx_t i_argbase; duk_idx_t n_formals; duk_idx_t idx; duk_idx_t num_stack_args; duk_bool_t need_map; DUK_ASSERT(thr != NULL); DUK_ASSERT(func != NULL); DUK_ASSERT(DUK_HOBJECT_IS_NONBOUND_FUNCTION(func)); DUK_ASSERT(varenv != NULL); /* [ ... func this arg1(@idx_args) ... argN envobj ] * [ arg1(@idx_args) ... argN envobj ] (for tailcalls) */ need_map = 0; i_argbase = idx_args; num_stack_args = duk_get_top(thr) - i_argbase - 1; DUK_ASSERT(i_argbase >= 0); DUK_ASSERT(num_stack_args >= 0); duk_push_hobject(thr, func); duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_FORMALS); formals = duk_get_hobject(thr, -1); if (formals) { n_formals = (duk_idx_t) duk_get_length(thr, -1); } else { /* This shouldn't happen without tampering of internal * properties: if a function accesses 'arguments', _Formals * is kept. Check for the case anyway in case internal * properties have been modified manually. */ DUK_D(DUK_DPRINT("_Formals is undefined when creating arguments, use n_formals == 0")); n_formals = 0; } duk_remove_m2(thr); /* leave formals on stack for later use */ i_formals = duk_require_top_index(thr); DUK_ASSERT(n_formals >= 0); DUK_ASSERT(formals != NULL || n_formals == 0); DUK_DDD(DUK_DDDPRINT("func=%!O, formals=%!O, n_formals=%ld", (duk_heaphdr *) func, (duk_heaphdr *) formals, (long) n_formals)); /* [ ... formals ] */ /* * Create required objects: * - 'arguments' object: array-like, but not an array * - 'map' object: internal object, tied to 'arguments' * - 'mappedNames' object: temporary value used during construction */ arg = duk_push_object_helper(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_FASTREFS | DUK_HOBJECT_FLAG_ARRAY_PART | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ARGUMENTS), DUK_BIDX_OBJECT_PROTOTYPE); DUK_ASSERT(arg != NULL); (void) duk_push_object_helper(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_FASTREFS | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT), -1); /* no prototype */ (void) duk_push_object_helper(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_FLAG_FASTREFS | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT), -1); /* no prototype */ i_arg = duk_get_top(thr) - 3; i_map = i_arg + 1; i_mappednames = i_arg + 2; /* [ ... formals arguments map mappedNames ] */ DUK_DDD(DUK_DDDPRINT("created arguments related objects: " "arguments at index %ld -> %!O " "map at index %ld -> %!O " "mappednames at index %ld -> %!O", (long) i_arg, (duk_heaphdr *) duk_get_hobject(thr, i_arg), (long) i_map, (duk_heaphdr *) duk_get_hobject(thr, i_map), (long) i_mappednames, (duk_heaphdr *) duk_get_hobject(thr, i_mappednames))); /* * Init arguments properties, map, etc. */ duk_push_int(thr, num_stack_args); duk_xdef_prop_stridx(thr, i_arg, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_WC); /* * Init argument related properties. */ /* step 11 */ idx = num_stack_args - 1; while (idx >= 0) { DUK_DDD(DUK_DDDPRINT("arg idx %ld, argbase=%ld, argidx=%ld", (long) idx, (long) i_argbase, (long) (i_argbase + idx))); DUK_DDD(DUK_DDDPRINT("define arguments[%ld]=arg", (long) idx)); duk_dup(thr, i_argbase + idx); duk_xdef_prop_index_wec(thr, i_arg, (duk_uarridx_t) idx); DUK_DDD(DUK_DDDPRINT("defined arguments[%ld]=arg", (long) idx)); /* step 11.c is relevant only if non-strict (checked in 11.c.ii) */ if (!DUK_HOBJECT_HAS_STRICT(func) && idx < n_formals) { DUK_ASSERT(formals != NULL); DUK_DDD(DUK_DDDPRINT("strict function, index within formals (%ld < %ld)", (long) idx, (long) n_formals)); duk_get_prop_index(thr, i_formals, (duk_uarridx_t) idx); DUK_ASSERT(duk_is_string(thr, -1)); duk_dup_top(thr); /* [ ... name name ] */ if (!duk_has_prop(thr, i_mappednames)) { /* steps 11.c.ii.1 - 11.c.ii.4, but our internal book-keeping * differs from the reference model */ /* [ ... name ] */ need_map = 1; DUK_DDD(DUK_DDDPRINT("set mappednames[%s]=%ld", (const char *) duk_get_string(thr, -1), (long) idx)); duk_dup_top(thr); /* name */ (void) duk_push_uint_to_hstring(thr, (duk_uint_t) idx); /* index */ duk_xdef_prop_wec(thr, i_mappednames); /* out of spec, must be configurable */ DUK_DDD(DUK_DDDPRINT("set map[%ld]=%s", (long) idx, duk_get_string(thr, -1))); duk_dup_top(thr); /* name */ duk_xdef_prop_index_wec(thr, i_map, (duk_uarridx_t) idx); /* out of spec, must be configurable */ } else { /* duk_has_prop() popped the second 'name' */ } /* [ ... name ] */ duk_pop(thr); /* pop 'name' */ } idx--; } DUK_DDD(DUK_DDDPRINT("actual arguments processed")); /* step 12 */ if (need_map) { DUK_DDD(DUK_DDDPRINT("adding 'map' and 'varenv' to arguments object")); /* should never happen for a strict callee */ DUK_ASSERT(!DUK_HOBJECT_HAS_STRICT(func)); duk_dup(thr, i_map); duk_xdef_prop_stridx(thr, i_arg, DUK_STRIDX_INT_MAP, DUK_PROPDESC_FLAGS_NONE); /* out of spec, don't care */ /* The variable environment for magic variable bindings needs to be * given by the caller and recorded in the arguments object. * * See E5 Section 10.6, the creation of setters/getters. * * The variable environment also provides access to the callee, so * an explicit (internal) callee property is not needed. */ duk_push_hobject(thr, varenv); duk_xdef_prop_stridx(thr, i_arg, DUK_STRIDX_INT_VARENV, DUK_PROPDESC_FLAGS_NONE); /* out of spec, don't care */ } /* steps 13-14 */ if (DUK_HOBJECT_HAS_STRICT(func)) { /* Callee/caller are throwers and are not deletable etc. They * could be implemented as virtual properties, but currently * there is no support for virtual properties which are accessors * (only plain virtual properties). This would not be difficult * to change in duk_hobject_props, but we can make the throwers * normal, concrete properties just as easily. * * Note that the specification requires that the *same* thrower * built-in object is used here! See E5 Section 10.6 main * algoritm, step 14, and Section 13.2.3 which describes the * thrower. See test case test-arguments-throwers.js. */ DUK_DDD(DUK_DDDPRINT("strict function, setting caller/callee to throwers")); duk_xdef_prop_stridx_thrower(thr, i_arg, DUK_STRIDX_CALLER); duk_xdef_prop_stridx_thrower(thr, i_arg, DUK_STRIDX_CALLEE); } else { DUK_DDD(DUK_DDDPRINT("non-strict function, setting callee to actual value")); duk_push_hobject(thr, func); duk_xdef_prop_stridx(thr, i_arg, DUK_STRIDX_CALLEE, DUK_PROPDESC_FLAGS_WC); } /* set exotic behavior only after we're done */ if (need_map) { /* Exotic behaviors are only enabled for arguments objects * which have a parameter map (see E5 Section 10.6 main * algorithm, step 12). * * In particular, a non-strict arguments object with no * mapped formals does *NOT* get exotic behavior, even * for e.g. "caller" property. This seems counterintuitive * but seems to be the case. */ /* cannot be strict (never mapped variables) */ DUK_ASSERT(!DUK_HOBJECT_HAS_STRICT(func)); DUK_DDD(DUK_DDDPRINT("enabling exotic behavior for arguments object")); DUK_HOBJECT_SET_EXOTIC_ARGUMENTS(arg); } else { DUK_DDD(DUK_DDDPRINT("not enabling exotic behavior for arguments object")); } DUK_DDD(DUK_DDDPRINT("final arguments related objects: " "arguments at index %ld -> %!O " "map at index %ld -> %!O " "mappednames at index %ld -> %!O", (long) i_arg, (duk_heaphdr *) duk_get_hobject(thr, i_arg), (long) i_map, (duk_heaphdr *) duk_get_hobject(thr, i_map), (long) i_mappednames, (duk_heaphdr *) duk_get_hobject(thr, i_mappednames))); /* [ args(n) envobj formals arguments map mappednames ] */ duk_pop_2(thr); duk_remove_m2(thr); /* [ args(n) envobj arguments ] */ } /* Helper for creating the arguments object and adding it to the env record * on top of the value stack. */ DUK_LOCAL void duk__handle_createargs_for_call(duk_hthread *thr, duk_hobject *func, duk_hobject *env, duk_idx_t idx_args) { DUK_DDD(DUK_DDDPRINT("creating arguments object for function call")); DUK_ASSERT(thr != NULL); DUK_ASSERT(func != NULL); DUK_ASSERT(env != NULL); DUK_ASSERT(DUK_HOBJECT_HAS_CREATEARGS(func)); /* [ ... arg1 ... argN envobj ] */ duk__create_arguments_object(thr, func, env, idx_args); /* [ ... arg1 ... argN envobj argobj ] */ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LC_ARGUMENTS, DUK_HOBJECT_HAS_STRICT(func) ? DUK_PROPDESC_FLAGS_E : /* strict: non-deletable, non-writable */ DUK_PROPDESC_FLAGS_WE); /* non-strict: non-deletable, writable */ /* [ ... arg1 ... argN envobj ] */ } /* * Helpers for constructor call handling. * * There are two [[Construct]] operations in the specification: * * - E5 Section 13.2.2: for Function objects * - E5 Section 15.3.4.5.2: for "bound" Function objects * * The chain of bound functions is resolved in Section 15.3.4.5.2, * with arguments "piling up" until the [[Construct]] internal * method is called on the final, actual Function object. Note * that the "prototype" property is looked up *only* from the * final object, *before* calling the constructor. * * Since Duktape 2.2 bound functions are represented with the * duk_hboundfunc internal type, and bound function chains are * collapsed when a bound function is created. As a result, the * direct target of a duk_hboundfunc is always non-bound and the * this/argument lists have been resolved. * * When constructing new Array instances, an unnecessary object is * created and discarded now: the standard [[Construct]] creates an * object, and calls the Array constructor. The Array constructor * returns an Array instance, which is used as the result value for * the "new" operation; the object created before the Array constructor * call is discarded. * * This would be easy to fix, e.g. by knowing that the Array constructor * will always create a replacement object and skip creating the fallback * object in that case. */ /* Update default instance prototype for constructor call. */ DUK_LOCAL void duk__update_default_instance_proto(duk_hthread *thr, duk_idx_t idx_func) { duk_hobject *proto; duk_hobject *fallback; DUK_ASSERT(duk_is_constructable(thr, idx_func)); duk_get_prop_stridx_short(thr, idx_func, DUK_STRIDX_PROTOTYPE); proto = duk_get_hobject(thr, -1); if (proto == NULL) { DUK_DDD(DUK_DDDPRINT("constructor has no 'prototype' property, or value not an object " "-> leave standard Object prototype as fallback prototype")); } else { DUK_DDD(DUK_DDDPRINT("constructor has 'prototype' property with object value " "-> set fallback prototype to that value: %!iO", (duk_heaphdr *) proto)); /* Original fallback (default instance) is untouched when * resolving bound functions etc. */ fallback = duk_known_hobject(thr, idx_func + 1); DUK_ASSERT(fallback != NULL); DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, fallback, proto); } duk_pop(thr); } /* Postprocess: return value special handling, error augmentation. */ DUK_INTERNAL void duk_call_construct_postprocess(duk_hthread *thr, duk_small_uint_t proxy_invariant) { /* Use either fallback (default instance) or retval depending * on retval type. Needs to be called before unwind because * the default instance is read from the current (immutable) * 'this' binding. * * For Proxy 'construct' calls the return value must be an * Object (we accept object-like values like buffers and * lightfuncs too). If not, TypeError. */ if (duk_check_type_mask(thr, -1, DUK_TYPE_MASK_OBJECT | DUK_TYPE_MASK_BUFFER | DUK_TYPE_MASK_LIGHTFUNC)) { DUK_DDD(DUK_DDDPRINT("replacement value")); } else { if (DUK_UNLIKELY(proxy_invariant != 0U)) { /* Proxy 'construct' return value invariant violated. */ DUK_ERROR_TYPE_INVALID_TRAP_RESULT(thr); } /* XXX: direct value stack access */ duk_pop(thr); duk_push_this(thr); } #if defined(DUK_USE_AUGMENT_ERROR_CREATE) /* Augment created errors upon creation, not when they are thrown or * rethrown. __FILE__ and __LINE__ are not desirable here; the call * stack reflects the caller which is correct. Skip topmost, unwound * activation when creating a traceback. If thr->ptr_curr_pc was != * NULL we'd need to sync the current PC so that the traceback comes * out right; however it is always synced here so just assert for it. */ DUK_ASSERT(thr->ptr_curr_pc == NULL); duk_err_augment_error_create(thr, thr, NULL, 0, DUK_AUGMENT_FLAG_NOBLAME_FILELINE | DUK_AUGMENT_FLAG_SKIP_ONE); #endif } /* * Helper for handling a bound function when a call is being made. * * Assumes that bound function chains have been "collapsed" so that either * the target is non-bound or there is one bound function that points to a * nonbound target. * * Prepends the bound arguments to the value stack (at idx_func + 2). * The 'this' binding is also updated if necessary (at idx_func + 1). * Note that for constructor calls the 'this' binding is never updated by * [[BoundThis]]. */ DUK_LOCAL void duk__handle_bound_chain_for_call(duk_hthread *thr, duk_idx_t idx_func, duk_bool_t is_constructor_call) { duk_tval *tv_func; duk_hobject *func; duk_idx_t len; DUK_ASSERT(thr != NULL); /* On entry, item at idx_func is a bound, non-lightweight function, * but we don't rely on that below. */ DUK_ASSERT(duk_get_top(thr) >= idx_func + 2); tv_func = duk_require_tval(thr, idx_func); DUK_ASSERT(tv_func != NULL); if (DUK_TVAL_IS_OBJECT(tv_func)) { func = DUK_TVAL_GET_OBJECT(tv_func); /* XXX: separate helper function, out of fast path? */ if (DUK_HOBJECT_HAS_BOUNDFUNC(func)) { duk_hboundfunc *h_bound; duk_tval *tv_args; duk_tval *tv_gap; h_bound = (duk_hboundfunc *) func; tv_args = h_bound->args; len = h_bound->nargs; DUK_ASSERT(len == 0 || tv_args != NULL); DUK_DDD(DUK_DDDPRINT("bound function encountered, ptr=%p: %!T", (void *) DUK_TVAL_GET_OBJECT(tv_func), tv_func)); /* [ ... func this arg1 ... argN ] */ if (is_constructor_call) { /* See: tests/ecmascript/test-spec-bound-constructor.js */ DUK_DDD(DUK_DDDPRINT("constructor call: don't update this binding")); } else { /* XXX: duk_replace_tval */ duk_push_tval(thr, &h_bound->this_binding); duk_replace(thr, idx_func + 1); /* idx_this = idx_func + 1 */ } /* [ ... func this arg1 ... argN ] */ duk_require_stack(thr, len); tv_gap = duk_reserve_gap(thr, idx_func + 2, len); duk_copy_tvals_incref(thr, tv_gap, tv_args, (duk_size_t) len); /* [ ... func this <bound args> arg1 ... argN ] */ duk_push_tval(thr, &h_bound->target); duk_replace(thr, idx_func); /* replace in stack */ DUK_DDD(DUK_DDDPRINT("bound function handled, idx_func=%ld, curr func=%!T", (long) idx_func, duk_get_tval(thr, idx_func))); } } else if (DUK_TVAL_IS_LIGHTFUNC(tv_func)) { /* Lightweight function: never bound, so terminate. */ ; } else { /* Shouldn't happen, so ugly error is enough. */ DUK_ERROR_INTERNAL(thr); } DUK_ASSERT(duk_get_top(thr) >= idx_func + 2); DUK_DDD(DUK_DDDPRINT("final non-bound function is: %!T", duk_get_tval(thr, idx_func))); #if defined(DUK_USE_ASSERTIONS) tv_func = duk_require_tval(thr, idx_func); DUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(tv_func) || DUK_TVAL_IS_OBJECT(tv_func)); if (DUK_TVAL_IS_OBJECT(tv_func)) { func = DUK_TVAL_GET_OBJECT(tv_func); DUK_ASSERT(func != NULL); DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(func)); DUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(func) || DUK_HOBJECT_HAS_NATFUNC(func)); } #endif } /* * Helper for inline handling of .call(), .apply(), and .construct(). */ DUK_LOCAL duk_bool_t duk__handle_specialfuncs_for_call(duk_hthread *thr, duk_idx_t idx_func, duk_hobject *func, duk_small_uint_t *call_flags, duk_bool_t first) { #if defined(DUK_USE_ASSERTIONS) duk_c_function natfunc; #endif duk_tval *tv_args; DUK_ASSERT(func != NULL); DUK_ASSERT((*call_flags & DUK_CALL_FLAG_CONSTRUCT) == 0); /* Caller. */ #if defined(DUK_USE_ASSERTIONS) natfunc = ((duk_hnatfunc *) func)->func; DUK_ASSERT(natfunc != NULL); #endif /* On every round of function resolution at least target function and * 'this' binding are set. We can assume that here, and must guarantee * it on exit. Value stack reserve is extended for bound function and * .apply() unpacking so we don't need to extend it here when we need a * few slots. */ DUK_ASSERT(duk_get_top(thr) >= idx_func + 2); /* Handle native 'eval' specially. A direct eval check is only made * for the first resolution attempt; e.g. a bound eval call is -not- * a direct eval call. */ if (DUK_UNLIKELY(((duk_hnatfunc *) func)->magic == 15)) { /* For now no special handling except for direct eval * detection. */ DUK_ASSERT(((duk_hnatfunc *) func)->func == duk_bi_global_object_eval); if (first && (*call_flags & DUK_CALL_FLAG_CALLED_AS_EVAL)) { *call_flags = (*call_flags & ~DUK_CALL_FLAG_CALLED_AS_EVAL) | DUK_CALL_FLAG_DIRECT_EVAL; } DUK_ASSERT(duk_get_top(thr) >= idx_func + 2); return 1; /* stop resolving */ } /* Handle special functions based on the DUK_HOBJECT_FLAG_SPECIAL_CALL * flag; their magic value is used for switch-case. * * NOTE: duk_unpack_array_like() reserves value stack space * for the result values (unlike most other value stack calls). */ switch (((duk_hnatfunc *) func)->magic) { case 0: { /* 0=Function.prototype.call() */ /* Value stack: * idx_func + 0: Function.prototype.call() [removed] * idx_func + 1: this binding for .call (target function) * idx_func + 2: 1st argument to .call, desired 'this' binding * idx_func + 3: 2nd argument to .call, desired 1st argument for ultimate target * ... * * Remove idx_func + 0 to get: * idx_func + 0: target function * idx_func + 1: this binding * idx_func + 2: call arguments * ... */ DUK_ASSERT(natfunc == duk_bi_function_prototype_call); duk_remove_unsafe(thr, idx_func); tv_args = thr->valstack_bottom + idx_func + 2; if (thr->valstack_top < tv_args) { DUK_ASSERT(tv_args <= thr->valstack_end); thr->valstack_top = tv_args; /* at least target function and 'this' binding present */ } break; } case 1: { /* 1=Function.prototype.apply() */ /* Value stack: * idx_func + 0: Function.prototype.apply() [removed] * idx_func + 1: this binding for .apply (target function) * idx_func + 2: 1st argument to .apply, desired 'this' binding * idx_func + 3: 2nd argument to .apply, argArray * [anything after this MUST be ignored] * * Remove idx_func + 0 and unpack the argArray to get: * idx_func + 0: target function * idx_func + 1: this binding * idx_func + 2: call arguments * ... */ DUK_ASSERT(natfunc == duk_bi_function_prototype_apply); duk_remove_unsafe(thr, idx_func); goto apply_shared; } #if defined(DUK_USE_REFLECT_BUILTIN) case 2: { /* 2=Reflect.apply() */ /* Value stack: * idx_func + 0: Reflect.apply() [removed] * idx_func + 1: this binding for .apply (ignored, usually Reflect) [removed] * idx_func + 2: 1st argument to .apply, target function * idx_func + 3: 2nd argument to .apply, desired 'this' binding * idx_func + 4: 3rd argument to .apply, argArray * [anything after this MUST be ignored] * * Remove idx_func + 0 and idx_func + 1, and unpack the argArray to get: * idx_func + 0: target function * idx_func + 1: this binding * idx_func + 2: call arguments * ... */ DUK_ASSERT(natfunc == duk_bi_reflect_apply); duk_remove_n_unsafe(thr, idx_func, 2); goto apply_shared; } case 3: { /* 3=Reflect.construct() */ /* Value stack: * idx_func + 0: Reflect.construct() [removed] * idx_func + 1: this binding for .construct (ignored, usually Reflect) [removed] * idx_func + 2: 1st argument to .construct, target function * idx_func + 3: 2nd argument to .construct, argArray * idx_func + 4: 3rd argument to .construct, newTarget * [anything after this MUST be ignored] * * Remove idx_func + 0 and idx_func + 1, unpack the argArray, * and insert default instance (prototype not yet updated), to get: * idx_func + 0: target function * idx_func + 1: this binding (default instance) * idx_func + 2: constructor call arguments * ... * * Call flags must be updated to reflect the fact that we're * now dealing with a constructor call, and e.g. the 'this' * binding cannot be overwritten if the target is bound. * * newTarget is checked but not yet passed onwards. */ duk_idx_t top; DUK_ASSERT(natfunc == duk_bi_reflect_construct); *call_flags |= DUK_CALL_FLAG_CONSTRUCT; duk_remove_n_unsafe(thr, idx_func, 2); top = duk_get_top(thr); if (!duk_is_constructable(thr, idx_func)) { /* Target constructability must be checked before * unpacking argArray (which may cause side effects). * Just return; caller will throw the error. */ duk_set_top_unsafe(thr, idx_func + 2); /* satisfy asserts */ break; } duk_push_object(thr); duk_insert(thr, idx_func + 1); /* default instance */ /* [ ... func default_instance argArray newTarget? ] */ top = duk_get_top(thr); if (top < idx_func + 3) { /* argArray is a mandatory argument for Reflect.construct(). */ DUK_ERROR_TYPE_INVALID_ARGS(thr); } if (top > idx_func + 3) { if (!duk_strict_equals(thr, idx_func, idx_func + 3)) { /* XXX: [[Construct]] newTarget currently unsupported */ DUK_ERROR_UNSUPPORTED(thr); } duk_set_top_unsafe(thr, idx_func + 3); /* remove any args beyond argArray */ } DUK_ASSERT(duk_get_top(thr) == idx_func + 3); DUK_ASSERT(duk_is_valid_index(thr, idx_func + 2)); (void) duk_unpack_array_like(thr, idx_func + 2); /* XXX: should also remove target to be symmetric with duk_pack()? */ duk_remove(thr, idx_func + 2); DUK_ASSERT(duk_get_top(thr) >= idx_func + 2); break; } #endif /* DUK_USE_REFLECT_BUILTIN */ default: { DUK_ASSERT(0); DUK_UNREACHABLE(); } } DUK_ASSERT(duk_get_top(thr) >= idx_func + 2); return 0; /* keep resolving */ apply_shared: tv_args = thr->valstack_bottom + idx_func + 2; if (thr->valstack_top <= tv_args) { DUK_ASSERT(tv_args <= thr->valstack_end); thr->valstack_top = tv_args; /* at least target func and 'this' binding present */ /* No need to check for argArray. */ } else { DUK_ASSERT(duk_get_top(thr) >= idx_func + 3); /* idx_func + 2 covered above */ if (thr->valstack_top > tv_args + 1) { duk_set_top_unsafe(thr, idx_func + 3); /* remove any args beyond argArray */ } DUK_ASSERT(duk_is_valid_index(thr, idx_func + 2)); if (!duk_is_callable(thr, idx_func)) { /* Avoid unpack side effects if the target isn't callable. * Calling code will throw the actual error. */ } else { (void) duk_unpack_array_like(thr, idx_func + 2); duk_remove(thr, idx_func + 2); } } DUK_ASSERT(duk_get_top(thr) >= idx_func + 2); return 0; /* keep resolving */ } /* * Helper for Proxy handling. */ #if defined(DUK_USE_ES6_PROXY) DUK_LOCAL void duk__handle_proxy_for_call(duk_hthread *thr, duk_idx_t idx_func, duk_hproxy *h_proxy, duk_small_uint_t *call_flags) { duk_bool_t rc; /* Value stack: * idx_func + 0: Proxy object * idx_func + 1: this binding for call * idx_func + 2: 1st argument for call * idx_func + 3: 2nd argument for call * ... * * If Proxy doesn't have a trap for the call ('apply' or 'construct'), * replace Proxy object with target object. * * If we're dealing with a normal call and the Proxy has an 'apply' * trap, manipulate value stack to: * * idx_func + 0: trap * idx_func + 1: Proxy's handler * idx_func + 2: Proxy's target * idx_func + 3: this binding for call (from idx_func + 1) * idx_func + 4: call arguments packed to an array * * If we're dealing with a constructor call and the Proxy has a * 'construct' trap, manipulate value stack to: * * idx_func + 0: trap * idx_func + 1: Proxy's handler * idx_func + 2: Proxy's target * idx_func + 3: call arguments packed to an array * idx_func + 4: newTarget == Proxy object here * * As we don't yet have proper newTarget support, the newTarget at * idx_func + 3 is just the original constructor being called, i.e. * the Proxy object (not the target). Note that the default instance * (original 'this' binding) is dropped and ignored. */ duk_push_hobject(thr, h_proxy->handler); rc = duk_get_prop_stridx_short(thr, -1, (*call_flags & DUK_CALL_FLAG_CONSTRUCT) ? DUK_STRIDX_CONSTRUCT : DUK_STRIDX_APPLY); if (rc == 0) { /* Not found, continue to target. If this is a construct * call, update default instance prototype using the Proxy, * not the target. */ if (*call_flags & DUK_CALL_FLAG_CONSTRUCT) { if (!(*call_flags & DUK_CALL_FLAG_DEFAULT_INSTANCE_UPDATED)) { *call_flags |= DUK_CALL_FLAG_DEFAULT_INSTANCE_UPDATED; duk__update_default_instance_proto(thr, idx_func); } } duk_pop_2(thr); duk_push_hobject(thr, h_proxy->target); duk_replace(thr, idx_func); return; } /* Here we must be careful not to replace idx_func while * h_proxy is still needed, otherwise h_proxy may become * dangling. This could be improved e.g. using a * duk_pack_slice() with a freeform slice. */ /* Here: * idx_func + 0: Proxy object * idx_func + 1: this binding for call * idx_func + 2: 1st argument for call * idx_func + 3: 2nd argument for call * ... * idx_func + N: handler * idx_func + N + 1: trap */ duk_insert(thr, idx_func + 1); duk_insert(thr, idx_func + 2); duk_push_hobject(thr, h_proxy->target); duk_insert(thr, idx_func + 3); duk_pack(thr, duk_get_top(thr) - (idx_func + 5)); /* Here: * idx_func + 0: Proxy object * idx_func + 1: trap * idx_func + 2: Proxy's handler * idx_func + 3: Proxy's target * idx_func + 4: this binding for call * idx_func + 5: arguments array */ DUK_ASSERT(duk_get_top(thr) == idx_func + 6); if (*call_flags & DUK_CALL_FLAG_CONSTRUCT) { *call_flags |= DUK_CALL_FLAG_CONSTRUCT_PROXY; /* Enable 'construct' trap return invariant check. */ *call_flags &= ~(DUK_CALL_FLAG_CONSTRUCT); /* Resume as non-constructor call to the trap. */ /* 'apply' args: target, thisArg, argArray * 'construct' args: target, argArray, newTarget */ duk_remove(thr, idx_func + 4); duk_push_hobject(thr, (duk_hobject *) h_proxy); } /* Finalize value stack layout by removing Proxy reference. */ duk_remove(thr, idx_func); h_proxy = NULL; /* invalidated */ DUK_ASSERT(duk_get_top(thr) == idx_func + 5); } #endif /* DUK_USE_ES6_PROXY */ /* * Helper for setting up var_env and lex_env of an activation, * assuming it does NOT have the DUK_HOBJECT_FLAG_NEWENV flag. */ DUK_LOCAL void duk__handle_oldenv_for_call(duk_hthread *thr, duk_hobject *func, duk_activation *act) { duk_hcompfunc *f; duk_hobject *h_lex; duk_hobject *h_var; DUK_ASSERT(thr != NULL); DUK_ASSERT(func != NULL); DUK_ASSERT(act != NULL); DUK_ASSERT(!DUK_HOBJECT_HAS_NEWENV(func)); DUK_ASSERT(!DUK_HOBJECT_HAS_CREATEARGS(func)); DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(func)); DUK_UNREF(thr); f = (duk_hcompfunc *) func; h_lex = DUK_HCOMPFUNC_GET_LEXENV(thr->heap, f); h_var = DUK_HCOMPFUNC_GET_VARENV(thr->heap, f); DUK_ASSERT(h_lex != NULL); /* Always true for closures (not for templates) */ DUK_ASSERT(h_var != NULL); act->lex_env = h_lex; act->var_env = h_var; DUK_HOBJECT_INCREF(thr, h_lex); DUK_HOBJECT_INCREF(thr, h_var); } /* * Helper for updating callee 'caller' property. */ #if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY) DUK_LOCAL void duk__update_func_caller_prop(duk_hthread *thr, duk_hobject *func) { duk_tval *tv_caller; duk_hobject *h_tmp; duk_activation *act_callee; duk_activation *act_caller; DUK_ASSERT(thr != NULL); DUK_ASSERT(func != NULL); DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(func)); /* bound chain resolved */ DUK_ASSERT(thr->callstack_top >= 1); if (DUK_HOBJECT_HAS_STRICT(func)) { /* Strict functions don't get their 'caller' updated. */ return; } DUK_ASSERT(thr->callstack_top > 0); act_callee = thr->callstack_curr; DUK_ASSERT(act_callee != NULL); act_caller = (thr->callstack_top >= 2 ? act_callee->parent : NULL); /* XXX: check .caller writability? */ /* Backup 'caller' property and update its value. */ tv_caller = duk_hobject_find_existing_entry_tval_ptr(thr->heap, func, DUK_HTHREAD_STRING_CALLER(thr)); if (tv_caller) { /* If caller is global/eval code, 'caller' should be set to * 'null'. * * XXX: there is no exotic flag to infer this correctly now. * The NEWENV flag is used now which works as intended for * everything (global code, non-strict eval code, and functions) * except strict eval code. Bound functions are never an issue * because 'func' has been resolved to a non-bound function. */ if (act_caller != NULL) { /* act_caller->func may be NULL in some finalization cases, * just treat like we don't know the caller. */ if (act_caller->func && !DUK_HOBJECT_HAS_NEWENV(act_caller->func)) { /* Setting to NULL causes 'caller' to be set to * 'null' as desired. */ act_caller = NULL; } } if (DUK_TVAL_IS_OBJECT(tv_caller)) { h_tmp = DUK_TVAL_GET_OBJECT(tv_caller); DUK_ASSERT(h_tmp != NULL); act_callee->prev_caller = h_tmp; /* Previous value doesn't need refcount changes because its ownership * is transferred to prev_caller. */ if (act_caller != NULL) { DUK_ASSERT(act_caller->func != NULL); DUK_TVAL_SET_OBJECT(tv_caller, act_caller->func); DUK_TVAL_INCREF(thr, tv_caller); } else { DUK_TVAL_SET_NULL(tv_caller); /* no incref */ } } else { /* 'caller' must only take on 'null' or function value */ DUK_ASSERT(!DUK_TVAL_IS_HEAP_ALLOCATED(tv_caller)); DUK_ASSERT(act_callee->prev_caller == NULL); if (act_caller != NULL && act_caller->func) { /* Tolerate act_caller->func == NULL which happens in * some finalization cases; treat like unknown caller. */ DUK_TVAL_SET_OBJECT(tv_caller, act_caller->func); DUK_TVAL_INCREF(thr, tv_caller); } else { DUK_TVAL_SET_NULL(tv_caller); /* no incref */ } } } } #endif /* DUK_USE_NONSTD_FUNC_CALLER_PROPERTY */ /* * Shared helpers for resolving the final, non-bound target function of the * call and the effective 'this' binding. Resolves bound functions and * applies .call(), .apply(), and .construct() inline. * * Proxy traps are also handled inline so that if the target is a Proxy with * a 'call' or 'construct' trap, the trap handler is called with a modified * argument list. * * Once the bound function / .call() / .apply() / .construct() sequence has * been resolved, the value at idx_func + 1 may need coercion described in * E5 Section 10.4.3. * * A call that begins as a non-constructor call may be converted into a * constructor call during the resolution process if Reflect.construct() * is invoked. This is handled by updating the caller's call_flags. * * For global and eval code (E5 Sections 10.4.1 and 10.4.2), we assume * that the caller has provided the correct 'this' binding explicitly * when calling, i.e.: * * - global code: this=global object * - direct eval: this=copy from eval() caller's this binding * - other eval: this=global object * * The 'this' coercion may cause a recursive function call with arbitrary * side effects, because ToObject() may be called. */ DUK_LOCAL DUK_INLINE void duk__coerce_nonstrict_this_binding(duk_hthread *thr, duk_idx_t idx_this) { duk_tval *tv_this; duk_hobject *obj_global; tv_this = thr->valstack_bottom + idx_this; switch (DUK_TVAL_GET_TAG(tv_this)) { case DUK_TAG_OBJECT: DUK_DDD(DUK_DDDPRINT("this binding: non-strict, object -> use directly")); break; case DUK_TAG_UNDEFINED: case DUK_TAG_NULL: DUK_DDD(DUK_DDDPRINT("this binding: non-strict, undefined/null -> use global object")); obj_global = thr->builtins[DUK_BIDX_GLOBAL]; /* XXX: avoid this check somehow */ if (DUK_LIKELY(obj_global != NULL)) { DUK_ASSERT(!DUK_TVAL_IS_HEAP_ALLOCATED(tv_this)); /* no need to decref previous value */ DUK_TVAL_SET_OBJECT(tv_this, obj_global); DUK_HOBJECT_INCREF(thr, obj_global); } else { /* This may only happen if built-ins are being "torn down". * This behavior is out of specification scope. */ DUK_D(DUK_DPRINT("this binding: wanted to use global object, but it is NULL -> using undefined instead")); DUK_ASSERT(!DUK_TVAL_IS_HEAP_ALLOCATED(tv_this)); /* no need to decref previous value */ DUK_TVAL_SET_UNDEFINED(tv_this); /* nothing to incref */ } break; default: /* Plain buffers and lightfuncs are object coerced. Lightfuncs * very rarely come here however, because the call target would * need to be a non-strict non-lightfunc (lightfuncs are considered * strict) with an explicit lightfunc 'this' binding. */ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv_this)); DUK_DDD(DUK_DDDPRINT("this binding: non-strict, not object/undefined/null -> use ToObject(value)")); duk_to_object(thr, idx_this); /* may have side effects */ break; } } DUK_LOCAL DUK_ALWAYS_INLINE duk_bool_t duk__resolve_target_fastpath_check(duk_hthread *thr, duk_idx_t idx_func, duk_hobject **out_func, duk_small_uint_t call_flags) { #if defined(DUK_USE_PREFER_SIZE) DUK_UNREF(thr); DUK_UNREF(idx_func); DUK_UNREF(out_func); DUK_UNREF(call_flags); #else /* DUK_USE_PREFER_SIZE */ duk_tval *tv_func; duk_hobject *func; if (DUK_UNLIKELY(call_flags & DUK_CALL_FLAG_CONSTRUCT)) { return 0; } tv_func = DUK_GET_TVAL_POSIDX(thr, idx_func); DUK_ASSERT(tv_func != NULL); if (DUK_LIKELY(DUK_TVAL_IS_OBJECT(tv_func))) { func = DUK_TVAL_GET_OBJECT(tv_func); if (DUK_HOBJECT_IS_CALLABLE(func) && !DUK_HOBJECT_HAS_BOUNDFUNC(func) && !DUK_HOBJECT_HAS_SPECIAL_CALL(func)) { *out_func = func; if (DUK_HOBJECT_HAS_STRICT(func)) { /* Strict function: no 'this' coercion. */ return 1; } duk__coerce_nonstrict_this_binding(thr, idx_func + 1); return 1; } } else if (DUK_TVAL_IS_LIGHTFUNC(tv_func)) { *out_func = NULL; /* Lightfuncs are considered strict, so 'this' binding is * used as is. They're never bound, always constructable, * and never special functions. */ return 1; } #endif /* DUK_USE_PREFER_SIZE */ return 0; /* let slow path deal with it */ } DUK_LOCAL duk_hobject *duk__resolve_target_func_and_this_binding(duk_hthread *thr, duk_idx_t idx_func, duk_small_uint_t *call_flags) { duk_tval *tv_func; duk_hobject *func; duk_bool_t first; DUK_ASSERT(duk_get_top(thr) >= idx_func + 2); for (first = 1;; first = 0) { DUK_ASSERT(duk_get_top(thr) >= idx_func + 2); tv_func = DUK_GET_TVAL_POSIDX(thr, idx_func); DUK_ASSERT(tv_func != NULL); if (DUK_TVAL_IS_OBJECT(tv_func)) { func = DUK_TVAL_GET_OBJECT(tv_func); if (*call_flags & DUK_CALL_FLAG_CONSTRUCT) { if (DUK_UNLIKELY(!DUK_HOBJECT_HAS_CONSTRUCTABLE(func))) { goto not_constructable; } } else { if (DUK_UNLIKELY(!DUK_HOBJECT_IS_CALLABLE(func))) { goto not_callable; } } if (DUK_LIKELY(!DUK_HOBJECT_HAS_BOUNDFUNC(func) && !DUK_HOBJECT_HAS_SPECIAL_CALL(func) && !DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ(func))) { /* Common case, so test for using a single bitfield test. * Break out to handle this coercion etc. */ break; } /* XXX: could set specialcall for boundfuncs too, simplify check above */ if (DUK_HOBJECT_HAS_BOUNDFUNC(func)) { DUK_ASSERT(!DUK_HOBJECT_HAS_SPECIAL_CALL(func)); DUK_ASSERT(!DUK_HOBJECT_IS_NATFUNC(func)); /* Callable/constructable flags are the same * for the bound function and its target, so * we don't need to check them here, we can * check them from the target only. */ duk__handle_bound_chain_for_call(thr, idx_func, *call_flags & DUK_CALL_FLAG_CONSTRUCT); DUK_ASSERT(DUK_TVAL_IS_OBJECT(duk_require_tval(thr, idx_func)) || DUK_TVAL_IS_LIGHTFUNC(duk_require_tval(thr, idx_func))); } else { DUK_ASSERT(DUK_HOBJECT_HAS_SPECIAL_CALL(func)); #if defined(DUK_USE_ES6_PROXY) if (DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ(func)) { /* If no trap, resume processing from Proxy trap. * If trap exists, helper converts call into a trap * call; this may change a constructor call into a * normal (non-constructor) trap call. We must * continue processing even when a trap is found as * the trap may be bound. */ duk__handle_proxy_for_call(thr, idx_func, (duk_hproxy *) func, call_flags); } else #endif { DUK_ASSERT(DUK_HOBJECT_IS_NATFUNC(func)); DUK_ASSERT(DUK_HOBJECT_HAS_CALLABLE(func)); DUK_ASSERT(!DUK_HOBJECT_HAS_CONSTRUCTABLE(func)); /* Constructable check already done above. */ if (duk__handle_specialfuncs_for_call(thr, idx_func, func, call_flags, first) != 0) { /* Encountered native eval call, normal call * context. Break out, handle this coercion etc. */ break; } } } /* Retry loop. */ } else if (DUK_TVAL_IS_LIGHTFUNC(tv_func)) { /* Lightfuncs are: * - Always strict, so no 'this' coercion. * - Always callable. * - Always constructable. * - Never specialfuncs. */ func = NULL; goto finished; } else { goto not_callable; } } DUK_ASSERT(func != NULL); if (!DUK_HOBJECT_HAS_STRICT(func)) { /* Non-strict target needs 'this' coercion. * This has potential side effects invalidating * 'tv_func'. */ duk__coerce_nonstrict_this_binding(thr, idx_func + 1); } if (*call_flags & DUK_CALL_FLAG_CONSTRUCT) { if (!(*call_flags & DUK_CALL_FLAG_DEFAULT_INSTANCE_UPDATED)) { *call_flags |= DUK_CALL_FLAG_DEFAULT_INSTANCE_UPDATED; duk__update_default_instance_proto(thr, idx_func); } } finished: #if defined(DUK_USE_ASSERTIONS) { duk_tval *tv_tmp; tv_tmp = duk_get_tval(thr, idx_func); DUK_ASSERT(tv_tmp != NULL); DUK_ASSERT((DUK_TVAL_IS_OBJECT(tv_tmp) && DUK_HOBJECT_IS_CALLABLE(DUK_TVAL_GET_OBJECT(tv_tmp))) || DUK_TVAL_IS_LIGHTFUNC(tv_tmp)); DUK_ASSERT(func == NULL || !DUK_HOBJECT_HAS_BOUNDFUNC(func)); DUK_ASSERT(func == NULL || (DUK_HOBJECT_IS_COMPFUNC(func) || DUK_HOBJECT_IS_NATFUNC(func))); DUK_ASSERT(func == NULL || (DUK_HOBJECT_HAS_CONSTRUCTABLE(func) || (*call_flags & DUK_CALL_FLAG_CONSTRUCT) == 0)); } #endif return func; not_callable: DUK_ASSERT(tv_func != NULL); #if defined(DUK_USE_VERBOSE_ERRORS) /* GETPROPC delayed error handling: when target is not callable, * GETPROPC replaces idx_func+0 with an Error (non-callable) with * a hidden Symbol to signify it's to be thrown as is here. The * hidden Symbol is only checked as an own property, not inherited * (which would be dangerous). */ if (DUK_TVAL_IS_OBJECT(tv_func)) { if (duk_hobject_find_existing_entry_tval_ptr(thr->heap, DUK_TVAL_GET_OBJECT(tv_func), DUK_HTHREAD_STRING_INT_TARGET(thr)) != NULL) { duk_push_tval(thr, tv_func); (void) duk_throw(thr); } } #endif #if defined(DUK_USE_VERBOSE_ERRORS) #if defined(DUK_USE_PARANOID_ERRORS) DUK_ERROR_FMT1(thr, DUK_ERR_TYPE_ERROR, "%s not callable", duk_get_type_name(thr, idx_func)); #else DUK_ERROR_FMT1(thr, DUK_ERR_TYPE_ERROR, "%s not callable", duk_push_string_tval_readable(thr, tv_func)); #endif #else DUK_ERROR_TYPE(thr, DUK_STR_NOT_CALLABLE); #endif DUK_UNREACHABLE(); return NULL; /* never executed */ not_constructable: /* For now GETPROPC delayed error not needed for constructor calls. */ #if defined(DUK_USE_VERBOSE_ERRORS) #if defined(DUK_USE_PARANOID_ERRORS) DUK_ERROR_FMT1(thr, DUK_ERR_TYPE_ERROR, "%s not constructable", duk_get_type_name(thr, idx_func)); #else DUK_ERROR_FMT1(thr, DUK_ERR_TYPE_ERROR, "%s not constructable", duk_push_string_tval_readable(thr, tv_func)); #endif #else DUK_ERROR_TYPE(thr, DUK_STR_NOT_CONSTRUCTABLE); #endif DUK_UNREACHABLE(); return NULL; /* never executed */ } /* * Manipulate value stack so that exactly 'num_stack_rets' return * values are at 'idx_retbase' in every case, assuming there are * 'rc' return values on top of stack. * * This is a bit tricky, because the called C function operates in * the same activation record and may have e.g. popped the stack * empty (below idx_retbase). */ DUK_LOCAL void duk__safe_call_adjust_valstack(duk_hthread *thr, duk_idx_t idx_retbase, duk_idx_t num_stack_rets, duk_idx_t num_actual_rets) { duk_idx_t idx_rcbase; DUK_ASSERT(thr != NULL); DUK_ASSERT(idx_retbase >= 0); DUK_ASSERT(num_stack_rets >= 0); DUK_ASSERT(num_actual_rets >= 0); idx_rcbase = duk_get_top(thr) - num_actual_rets; /* base of known return values */ if (DUK_UNLIKELY(idx_rcbase < 0)) { DUK_ERROR_TYPE(thr, DUK_STR_INVALID_CFUNC_RC); } DUK_DDD(DUK_DDDPRINT("adjust valstack after func call: " "num_stack_rets=%ld, num_actual_rets=%ld, stack_top=%ld, idx_retbase=%ld, idx_rcbase=%ld", (long) num_stack_rets, (long) num_actual_rets, (long) duk_get_top(thr), (long) idx_retbase, (long) idx_rcbase)); DUK_ASSERT(idx_rcbase >= 0); /* caller must check */ /* Space for num_stack_rets was reserved before the safe call. * Because value stack reserve cannot shrink except in call returns, * the reserve is still in place. Adjust valstack, carefully * ensuring we don't overstep the reserve. */ /* Match idx_rcbase with idx_retbase so that the return values * start at the correct index. */ if (idx_rcbase > idx_retbase) { duk_idx_t count = idx_rcbase - idx_retbase; DUK_DDD(DUK_DDDPRINT("elements at/after idx_retbase have enough to cover func retvals " "(idx_retbase=%ld, idx_rcbase=%ld)", (long) idx_retbase, (long) idx_rcbase)); /* Remove values between irc_rcbase (start of intended return * values) and idx_retbase to lower return values to idx_retbase. */ DUK_ASSERT(count > 0); duk_remove_n(thr, idx_retbase, count); /* may be NORZ */ } else { duk_idx_t count = idx_retbase - idx_rcbase; DUK_DDD(DUK_DDDPRINT("not enough elements at/after idx_retbase to cover func retvals " "(idx_retbase=%ld, idx_rcbase=%ld)", (long) idx_retbase, (long) idx_rcbase)); /* Insert 'undefined' at idx_rcbase (start of intended return * values) to lift return values to idx_retbase. */ DUK_ASSERT(count >= 0); DUK_ASSERT(thr->valstack_end - thr->valstack_top >= count); /* reserve cannot shrink */ duk_insert_undefined_n(thr, idx_rcbase, count); } /* Chop extra retvals away / extend with undefined. */ duk_set_top_unsafe(thr, idx_retbase + num_stack_rets); } /* * Activation setup for tailcalls and non-tailcalls. */ #if defined(DUK_USE_TAILCALL) DUK_LOCAL duk_small_uint_t duk__call_setup_act_attempt_tailcall(duk_hthread *thr, duk_small_uint_t call_flags, duk_idx_t idx_func, duk_hobject *func, duk_size_t entry_valstack_bottom_byteoff, duk_size_t entry_valstack_end_byteoff, duk_idx_t *out_nargs, duk_idx_t *out_nregs, duk_size_t *out_vs_min_bytes, duk_activation **out_act) { duk_activation *act; duk_tval *tv1, *tv2; duk_idx_t idx_args; duk_small_uint_t flags1, flags2; #if defined(DUK_USE_DEBUGGER_SUPPORT) duk_activation *prev_pause_act; #endif DUK_UNREF(entry_valstack_end_byteoff); /* Tailcall cannot be flagged to resume calls, and a * previous frame must exist. */ DUK_ASSERT(thr->callstack_top >= 1); act = thr->callstack_curr; DUK_ASSERT(act != NULL); *out_act = act; if (func == NULL || !DUK_HOBJECT_IS_COMPFUNC(func)) { DUK_DDD(DUK_DDDPRINT("tail call prevented by target not being ecma function")); return 0; } if (act->flags & DUK_ACT_FLAG_PREVENT_YIELD) { DUK_DDD(DUK_DDDPRINT("tail call prevented by current activation having DUK_ACT_FLAG_PREVENT_YIELD")); return 0; } /* Tailcall is only allowed if current and candidate * function have identical return value handling. There * are three possible return value handling cases: * 1. Normal function call, no special return value handling. * 2. Constructor call, return value replacement object check. * 3. Proxy 'construct' trap call, return value invariant check. */ flags1 = (duk_small_uint_t) ((act->flags & DUK_ACT_FLAG_CONSTRUCT) ? 1 : 0) #if defined(DUK_USE_ES6_PROXY) | (duk_small_uint_t) ((act->flags & DUK_ACT_FLAG_CONSTRUCT_PROXY) ? 2 : 0) #endif ; flags2 = (duk_small_uint_t) ((call_flags & DUK_CALL_FLAG_CONSTRUCT) ? 1 : 0) #if defined(DUK_USE_ES6_PROXY) | (duk_small_uint_t) ((call_flags & DUK_CALL_FLAG_CONSTRUCT_PROXY) ? 2 : 0); #endif ; if (flags1 != flags2) { DUK_DDD(DUK_DDDPRINT("tail call prevented by incompatible return value handling")); return 0; } DUK_ASSERT(((act->flags & DUK_ACT_FLAG_CONSTRUCT) && (call_flags & DUK_CALL_FLAG_CONSTRUCT)) || (!(act->flags & DUK_ACT_FLAG_CONSTRUCT) && !(call_flags & DUK_CALL_FLAG_CONSTRUCT))); DUK_ASSERT(((act->flags & DUK_ACT_FLAG_CONSTRUCT_PROXY) && (call_flags & DUK_CALL_FLAG_CONSTRUCT_PROXY)) || (!(act->flags & DUK_ACT_FLAG_CONSTRUCT_PROXY) && !(call_flags & DUK_CALL_FLAG_CONSTRUCT_PROXY))); if (DUK_HOBJECT_HAS_NOTAIL(func)) { /* See: test-bug-tailcall-preventyield-assert.c. */ DUK_DDD(DUK_DDDPRINT("tail call prevented by function having a notail flag")); return 0; } /* * Tailcall handling * * Although the callstack entry is reused, we need to explicitly unwind * the current activation (or simulate an unwind). In particular, the * current activation must be closed, otherwise something like * test-bug-reduce-judofyr.js results. Also catchers need to be unwound * because there may be non-error-catching label entries in valid tail calls. * * Special attention is needed for debugger and pause behavior when * reusing an activation. * - Disable StepOut processing for the activation unwind because * we reuse the activation, see: * https://github.com/svaarala/duktape/issues/1684. * - Disable line change pause flag permanently (if set) because * it would no longer be relevant, see: * https://github.com/svaarala/duktape/issues/1726. * - Check for function entry (e.g. StepInto) pause flag here, because * the executor pause check won't trigger due to shared activation, see: * https://github.com/svaarala/duktape/issues/1726. */ DUK_DDD(DUK_DDDPRINT("is tail call, reusing activation at callstack top, at index %ld", (long) (thr->callstack_top - 1))); DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(func)); DUK_ASSERT(!DUK_HOBJECT_HAS_NATFUNC(func)); DUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(func)); DUK_ASSERT((act->flags & DUK_ACT_FLAG_PREVENT_YIELD) == 0); DUK_ASSERT(call_flags & DUK_CALL_FLAG_ALLOW_ECMATOECMA); /* Unwind the topmost callstack entry before reusing it. This * also unwinds the catchers related to the topmost entry. */ DUK_ASSERT(thr->callstack_top > 0); DUK_ASSERT(thr->callstack_curr != NULL); #if defined(DUK_USE_DEBUGGER_SUPPORT) prev_pause_act = thr->heap->dbg_pause_act; thr->heap->dbg_pause_act = NULL; thr->heap->dbg_pause_flags &= ~DUK_PAUSE_FLAG_LINE_CHANGE; if (thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_FUNC_ENTRY) { DUK_D(DUK_DPRINT("PAUSE TRIGGERED by function entry (tailcall)")); duk_debug_set_paused(thr->heap); } #endif duk_hthread_activation_unwind_reuse_norz(thr); #if defined(DUK_USE_DEBUGGER_SUPPORT) thr->heap->dbg_pause_act = prev_pause_act; #endif DUK_ASSERT(act == thr->callstack_curr); /* XXX: We could restore the caller's value stack reserve * here, as if we did an actual unwind-and-call. Without * the restoration, value stack reserve may remain higher * than would otherwise be possible until we return to a * non-tailcall. */ /* Then reuse the unwound activation. */ act->cat = NULL; act->var_env = NULL; act->lex_env = NULL; DUK_ASSERT(func != NULL); DUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(func)); act->func = func; /* don't want an intermediate exposed state with func == NULL */ #if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY) act->prev_caller = NULL; #endif /* don't want an intermediate exposed state with invalid pc */ act->curr_pc = DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, (duk_hcompfunc *) func); #if defined(DUK_USE_DEBUGGER_SUPPORT) act->prev_line = 0; #endif DUK_TVAL_SET_OBJECT(&act->tv_func, func); /* borrowed, no refcount */ DUK_HOBJECT_INCREF(thr, func); act->flags = DUK_ACT_FLAG_TAILCALLED; if (DUK_HOBJECT_HAS_STRICT(func)) { act->flags |= DUK_ACT_FLAG_STRICT; } if (call_flags & DUK_CALL_FLAG_CONSTRUCT) { act->flags |= DUK_ACT_FLAG_CONSTRUCT; } #if defined(DUK_USE_ES6_PROXY) if (call_flags & DUK_CALL_FLAG_CONSTRUCT_PROXY) { act->flags |= DUK_ACT_FLAG_CONSTRUCT_PROXY; } #endif DUK_ASSERT(DUK_ACT_GET_FUNC(act) == func); /* already updated */ DUK_ASSERT(act->var_env == NULL); DUK_ASSERT(act->lex_env == NULL); act->bottom_byteoff = entry_valstack_bottom_byteoff; /* tail call -> reuse current "frame" */ #if 0 /* Topmost activation retval_byteoff is considered garbage, no need to init. */ act->retval_byteoff = 0; #endif /* Filled in when final reserve is known, dummy value doesn't matter * even in error unwind because reserve_byteoff is only used when * returning to -this- activation. */ act->reserve_byteoff = 0; /* * Manipulate valstack so that args are on the current bottom and the * previous caller's 'this' binding (which is the value preceding the * current bottom) is replaced with the new 'this' binding: * * [ ... this_old | (crud) func this_new arg1 ... argN ] * --> [ ... this_new | arg1 ... argN ] * * For tail calling to work properly, the valstack bottom must not grow * here; otherwise crud would accumulate on the valstack. */ tv1 = thr->valstack_bottom - 1; tv2 = thr->valstack_bottom + idx_func + 1; DUK_ASSERT(tv1 >= thr->valstack && tv1 < thr->valstack_top); /* tv1 is -below- valstack_bottom */ DUK_ASSERT(tv2 >= thr->valstack_bottom && tv2 < thr->valstack_top); DUK_TVAL_SET_TVAL_UPDREF(thr, tv1, tv2); /* side effects */ idx_args = idx_func + 2; duk_remove_n(thr, 0, idx_args); /* may be NORZ */ idx_func = 0; DUK_UNREF(idx_func); /* really 'not applicable' anymore, should not be referenced after this */ idx_args = 0; *out_nargs = ((duk_hcompfunc *) func)->nargs; *out_nregs = ((duk_hcompfunc *) func)->nregs; DUK_ASSERT(*out_nregs >= 0); DUK_ASSERT(*out_nregs >= *out_nargs); *out_vs_min_bytes = entry_valstack_bottom_byteoff + sizeof(duk_tval) * ((duk_size_t) *out_nregs + DUK_VALSTACK_INTERNAL_EXTRA); #if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY) #if defined(DUK_USE_TAILCALL) #error incorrect options: tail calls enabled with function caller property #endif /* XXX: This doesn't actually work properly for tail calls, so * tail calls are disabled when DUK_USE_NONSTD_FUNC_CALLER_PROPERTY * is in use. */ duk__update_func_caller_prop(thr, func); #endif /* [ ... this_new | arg1 ... argN ] */ return 1; } #endif /* DUK_USE_TAILCALL */ DUK_LOCAL void duk__call_setup_act_not_tailcall(duk_hthread *thr, duk_small_uint_t call_flags, duk_idx_t idx_func, duk_hobject *func, duk_size_t entry_valstack_bottom_byteoff, duk_size_t entry_valstack_end_byteoff, duk_idx_t *out_nargs, duk_idx_t *out_nregs, duk_size_t *out_vs_min_bytes, duk_activation **out_act) { duk_activation *act; duk_activation *new_act; DUK_UNREF(entry_valstack_end_byteoff); DUK_DDD(DUK_DDDPRINT("not a tail call, pushing a new activation to callstack, to index %ld", (long) (thr->callstack_top))); duk__call_callstack_limit_check(thr); new_act = duk_hthread_activation_alloc(thr); DUK_ASSERT(new_act != NULL); act = thr->callstack_curr; if (act != NULL) { /* * Update return value stack index of current activation (if any). * * Although it might seem this is not necessary (bytecode executor * does this for Ecmascript-to-Ecmascript calls; other calls are * handled here), this turns out to be necessary for handling yield * and resume. For them, an Ecmascript-to-native call happens, and * the Ecmascript call's retval_byteoff must be set for things to work. */ act->retval_byteoff = entry_valstack_bottom_byteoff + (duk_size_t) idx_func * sizeof(duk_tval); } new_act->parent = act; thr->callstack_curr = new_act; thr->callstack_top++; act = new_act; *out_act = act; DUK_ASSERT(thr->valstack_top > thr->valstack_bottom); /* at least effective 'this' */ DUK_ASSERT(func == NULL || !DUK_HOBJECT_HAS_BOUNDFUNC(func)); act->cat = NULL; act->flags = 0; if (call_flags & DUK_CALL_FLAG_CONSTRUCT) { act->flags |= DUK_ACT_FLAG_CONSTRUCT; } #if defined(DUK_USE_ES6_PROXY) if (call_flags & DUK_CALL_FLAG_CONSTRUCT_PROXY) { act->flags |= DUK_ACT_FLAG_CONSTRUCT_PROXY; } #endif if (call_flags & DUK_CALL_FLAG_DIRECT_EVAL) { act->flags |= DUK_ACT_FLAG_DIRECT_EVAL; } /* start of arguments: idx_func + 2. */ act->func = func; /* NULL for lightfunc */ if (DUK_LIKELY(func != NULL)) { DUK_TVAL_SET_OBJECT(&act->tv_func, func); /* borrowed, no refcount */ if (DUK_HOBJECT_HAS_STRICT(func)) { act->flags |= DUK_ACT_FLAG_STRICT; } if (DUK_HOBJECT_IS_COMPFUNC(func)) { *out_nargs = ((duk_hcompfunc *) func)->nargs; *out_nregs = ((duk_hcompfunc *) func)->nregs; DUK_ASSERT(*out_nregs >= 0); DUK_ASSERT(*out_nregs >= *out_nargs); *out_vs_min_bytes = entry_valstack_bottom_byteoff + sizeof(duk_tval) * ((duk_size_t) idx_func + 2U + (duk_size_t) *out_nregs + DUK_VALSTACK_INTERNAL_EXTRA); } else { /* True because of call target lookup checks. */ DUK_ASSERT(DUK_HOBJECT_IS_NATFUNC(func)); *out_nargs = ((duk_hnatfunc *) func)->nargs; *out_nregs = *out_nargs; if (*out_nargs >= 0) { *out_vs_min_bytes = entry_valstack_bottom_byteoff + sizeof(duk_tval) * ((duk_size_t) idx_func + 2U + (duk_size_t) *out_nregs + DUK_VALSTACK_API_ENTRY_MINIMUM + DUK_VALSTACK_INTERNAL_EXTRA); } else { /* Vararg function. */ duk_size_t valstack_top_byteoff = (duk_size_t) ((duk_uint8_t *) thr->valstack_top - ((duk_uint8_t *) thr->valstack)); *out_vs_min_bytes = valstack_top_byteoff + sizeof(duk_tval) * (DUK_VALSTACK_API_ENTRY_MINIMUM + DUK_VALSTACK_INTERNAL_EXTRA); } } } else { duk_small_uint_t lf_flags; duk_tval *tv_func; act->flags |= DUK_ACT_FLAG_STRICT; tv_func = DUK_GET_TVAL_POSIDX(thr, idx_func); DUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(tv_func)); DUK_TVAL_SET_TVAL(&act->tv_func, tv_func); /* borrowed, no refcount */ lf_flags = DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv_func); *out_nargs = DUK_LFUNC_FLAGS_GET_NARGS(lf_flags); if (*out_nargs != DUK_LFUNC_NARGS_VARARGS) { *out_vs_min_bytes = entry_valstack_bottom_byteoff + sizeof(duk_tval) * ((duk_size_t) idx_func + 2U + (duk_size_t) *out_nargs + DUK_VALSTACK_API_ENTRY_MINIMUM + DUK_VALSTACK_INTERNAL_EXTRA); } else { duk_size_t valstack_top_byteoff = (duk_size_t) ((duk_uint8_t *) thr->valstack_top - ((duk_uint8_t *) thr->valstack)); *out_vs_min_bytes = valstack_top_byteoff + sizeof(duk_tval) * (DUK_VALSTACK_API_ENTRY_MINIMUM + DUK_VALSTACK_INTERNAL_EXTRA); *out_nargs = -1; /* vararg */ } *out_nregs = *out_nargs; } act->var_env = NULL; act->lex_env = NULL; #if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY) act->prev_caller = NULL; #endif act->curr_pc = NULL; #if defined(DUK_USE_DEBUGGER_SUPPORT) act->prev_line = 0; #endif act->bottom_byteoff = entry_valstack_bottom_byteoff + sizeof(duk_tval) * ((duk_size_t) idx_func + 2U); #if 0 act->retval_byteoff = 0; /* topmost activation retval_byteoff is considered garbage, no need to init */ #endif /* Filled in when final reserve is known, dummy value doesn't matter * even in error unwind because reserve_byteoff is only used when * returning to -this- activation. */ act->reserve_byteoff = 0; /* filled in by caller */ /* XXX: Is this INCREF necessary? 'func' is always a borrowed * reference reachable through the value stack? If changed, stack * unwind code also needs to be fixed to match. */ DUK_HOBJECT_INCREF_ALLOWNULL(thr, func); /* act->func */ #if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY) if (func) { duk__update_func_caller_prop(thr, func); } #endif } /* * Environment setup. */ DUK_LOCAL void duk__call_env_setup(duk_hthread *thr, duk_hobject *func, duk_activation *act, duk_idx_t idx_args) { duk_hobject *env; DUK_ASSERT(func == NULL || !DUK_HOBJECT_HAS_BOUNDFUNC(func)); /* bound function has already been resolved */ if (DUK_LIKELY(func != NULL)) { if (DUK_LIKELY(DUK_HOBJECT_HAS_NEWENV(func))) { if (DUK_LIKELY(!DUK_HOBJECT_HAS_CREATEARGS(func))) { /* Use a new environment but there's no 'arguments' object; * delayed environment initialization. This is the most * common case. */ DUK_ASSERT(act->lex_env == NULL); DUK_ASSERT(act->var_env == NULL); } else { /* Use a new environment and there's an 'arguments' object. * We need to initialize it right now. */ /* third arg: absolute index (to entire valstack) of bottom_byteoff of new activation */ env = duk_create_activation_environment_record(thr, func, act->bottom_byteoff); DUK_ASSERT(env != NULL); /* [ ... func this arg1 ... argN envobj ] */ DUK_ASSERT(DUK_HOBJECT_HAS_CREATEARGS(func)); duk__handle_createargs_for_call(thr, func, env, idx_args); /* [ ... func this arg1 ... argN envobj ] */ act->lex_env = env; act->var_env = env; DUK_HOBJECT_INCREF(thr, env); DUK_HOBJECT_INCREF(thr, env); /* XXX: incref by count (2) directly */ duk_pop(thr); } } else { /* Use existing env (e.g. for non-strict eval); cannot have * an own 'arguments' object (but can refer to an existing one). */ DUK_ASSERT(!DUK_HOBJECT_HAS_CREATEARGS(func)); duk__handle_oldenv_for_call(thr, func, act); DUK_ASSERT(act->lex_env != NULL); DUK_ASSERT(act->var_env != NULL); } } else { /* Lightfuncs are always native functions and have "newenv". */ DUK_ASSERT(act->lex_env == NULL); DUK_ASSERT(act->var_env == NULL); } } /* * Misc shared helpers. */ /* Check thread state, update current thread. */ DUK_LOCAL void duk__call_thread_state_update(duk_hthread *thr) { DUK_ASSERT(thr != NULL); if (DUK_LIKELY(thr == thr->heap->curr_thread)) { if (DUK_UNLIKELY(thr->state != DUK_HTHREAD_STATE_RUNNING)) { /* Should actually never happen, but check anyway. */ goto thread_state_error; } } else { DUK_ASSERT(thr->heap->curr_thread == NULL || thr->heap->curr_thread->state == DUK_HTHREAD_STATE_RUNNING); if (DUK_UNLIKELY(thr->state != DUK_HTHREAD_STATE_INACTIVE)) { goto thread_state_error; } DUK_HEAP_SWITCH_THREAD(thr->heap, thr); thr->state = DUK_HTHREAD_STATE_RUNNING; /* Multiple threads may be simultaneously in the RUNNING * state, but not in the same "resume chain". */ } DUK_ASSERT(thr->heap->curr_thread == thr); DUK_ASSERT(thr->state == DUK_HTHREAD_STATE_RUNNING); return; thread_state_error: DUK_ERROR_FMT1(thr, DUK_ERR_TYPE_ERROR, "invalid thread state (%ld)", (long) thr->state); DUK_UNREACHABLE(); } /* * Main unprotected call handler, handles: * * - All combinations of native/Ecmascript caller and native/Ecmascript * target. * * - Optimized Ecmascript-to-Ecmascript call where call handling only * sets up a new duk_activation but reuses an existing bytecode executor * (the caller) without native recursion. * * - Tailcalls, where an activation is reused without increasing call * stack (duk_activation) depth. * * - Setup for an initial Duktape.Thread.resume(). * * The call handler doesn't provide any protection guarantees, protected calls * must be implemented e.g. by wrapping the call in a duk_safe_call(). * Call setup may fail at any stage, even when the new activation is in * place; the only guarantee is that the state is consistent for unwinding. */ DUK_LOCAL duk_int_t duk__handle_call_raw(duk_hthread *thr, duk_idx_t idx_func, duk_small_uint_t call_flags) { #if defined(DUK_USE_ASSERTIONS) duk_activation *entry_act; duk_size_t entry_callstack_top; #endif duk_size_t entry_valstack_bottom_byteoff; duk_size_t entry_valstack_end_byteoff; duk_int_t entry_call_recursion_depth; duk_hthread *entry_curr_thread; duk_uint_fast8_t entry_thread_state; duk_instr_t **entry_ptr_curr_pc; duk_idx_t idx_args; duk_idx_t nargs; /* # argument registers target function wants (< 0 => "as is") */ duk_idx_t nregs; /* # total registers target function wants on entry (< 0 => "as is") */ duk_size_t vs_min_bytes; /* minimum value stack size (bytes) for handling call */ duk_hobject *func; /* 'func' on stack (borrowed reference) */ duk_activation *act; duk_ret_t rc; duk_small_uint_t use_tailcall; DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->heap != NULL); /* Asserts for heap->curr_thread omitted: it may be NULL, 'thr', or * any other thread (e.g. when heap thread is used to run finalizers). */ DUK_ASSERT_CTX_VALID(thr); DUK_ASSERT(duk_is_valid_index(thr, idx_func)); DUK_ASSERT(idx_func >= 0); DUK_STATS_INC(thr->heap, stats_call_all); /* If a tail call: * - an Ecmascript activation must be on top of the callstack * - there cannot be any catch stack entries that would catch * a return */ #if defined(DUK_USE_ASSERTIONS) if (call_flags & DUK_CALL_FLAG_TAILCALL) { duk_activation *tmp_act; duk_catcher *tmp_cat; DUK_ASSERT(thr->callstack_top >= 1); DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL); DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr))); /* No entry in the catch stack which would actually catch a * throw can refer to the callstack entry being reused. * There *can* be catch stack entries referring to the current * callstack entry as long as they don't catch (e.g. label sites). */ tmp_act = thr->callstack_curr; for (tmp_cat = tmp_act->cat; tmp_cat != NULL; tmp_cat = tmp_cat->parent) { DUK_ASSERT(DUK_CAT_GET_TYPE(tmp_cat) == DUK_CAT_TYPE_LABEL); /* a non-catching entry */ } } #endif /* DUK_USE_ASSERTIONS */ /* * Store entry state. */ #if defined(DUK_USE_ASSERTIONS) entry_act = thr->callstack_curr; entry_callstack_top = thr->callstack_top; #endif entry_valstack_bottom_byteoff = (duk_size_t) ((duk_uint8_t *) thr->valstack_bottom - (duk_uint8_t *) thr->valstack); entry_valstack_end_byteoff = (duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack); entry_call_recursion_depth = thr->heap->call_recursion_depth; entry_curr_thread = thr->heap->curr_thread; /* may be NULL if first call */ entry_thread_state = thr->state; entry_ptr_curr_pc = thr->ptr_curr_pc; /* may be NULL */ /* If thr->ptr_curr_pc is set, sync curr_pc to act->pc. Then NULL * thr->ptr_curr_pc so that it's not accidentally used with an incorrect * activation when side effects occur. */ duk_hthread_sync_and_null_currpc(thr); DUK_ASSERT(thr->ptr_curr_pc == NULL); DUK_DD(DUK_DDPRINT("duk__handle_call_raw: thr=%p, idx_func=%ld, " "call_flags=0x%08lx (constructor=%ld), " "valstack_top=%ld, idx_func=%ld, idx_args=%ld, rec_depth=%ld/%ld, " "entry_valstack_bottom_byteoff=%ld, entry_valstack_end_byteoff=%ld, " "entry_call_recursion_depth=%ld, " "entry_curr_thread=%p, entry_thread_state=%ld", (void *) thr, (long) idx_func, (unsigned long) call_flags, (long) ((call_flags & DUK_CALL_FLAG_CONSTRUCT) != 0 ? 1 : 0), (long) duk_get_top(thr), (long) idx_func, (long) (idx_func + 2), (long) thr->heap->call_recursion_depth, (long) thr->heap->call_recursion_limit, (long) entry_valstack_bottom_byteoff, (long) entry_valstack_end_byteoff, (long) entry_call_recursion_depth, (void *) entry_curr_thread, (long) entry_thread_state)); /* * Thread state check and book-keeping. */ duk__call_thread_state_update(thr); /* * Resolve final target function; handle bound functions and special * functions like .call() and .apply(). Also figure out the effective * 'this' binding, which replaces the current value at idx_func + 1. */ if (DUK_LIKELY(duk__resolve_target_fastpath_check(thr, idx_func, &func, call_flags) != 0U)) { DUK_DDD(DUK_DDDPRINT("fast path target resolve")); } else { DUK_DDD(DUK_DDDPRINT("slow path target resolve")); func = duk__resolve_target_func_and_this_binding(thr, idx_func, &call_flags); } DUK_ASSERT(duk_get_top(thr) - idx_func >= 2); /* at least func and this present */ DUK_ASSERT(func == NULL || !DUK_HOBJECT_HAS_BOUNDFUNC(func)); DUK_ASSERT(func == NULL || (DUK_HOBJECT_IS_COMPFUNC(func) || DUK_HOBJECT_IS_NATFUNC(func))); /* [ ... func this arg1 ... argN ] */ /* * Setup a preliminary activation and figure out nargs/nregs and * value stack minimum size. * * Don't touch valstack_bottom or valstack_top yet so that Duktape API * calls work normally. * * Because 'act' is not zeroed, all fields must be filled in. */ #if defined(DUK_USE_TAILCALL) use_tailcall = (call_flags & DUK_CALL_FLAG_TAILCALL); if (use_tailcall) { use_tailcall = duk__call_setup_act_attempt_tailcall(thr, call_flags, idx_func, func, entry_valstack_bottom_byteoff, entry_valstack_end_byteoff, &nargs, &nregs, &vs_min_bytes, &act); } #else DUK_ASSERT((call_flags & DUK_CALL_FLAG_TAILCALL) == 0); /* compiler ensures this */ use_tailcall = 0; #endif if (use_tailcall) { idx_args = 0; DUK_STATS_INC(thr->heap, stats_call_tailcall); } else { duk__call_setup_act_not_tailcall(thr, call_flags, idx_func, func, entry_valstack_bottom_byteoff, entry_valstack_end_byteoff, &nargs, &nregs, &vs_min_bytes, &act); idx_args = idx_func + 2; } /* After this point idx_func is no longer valid for tailcalls. */ DUK_ASSERT(act != NULL); /* [ ... func this arg1 ... argN ] */ /* * Environment record creation and 'arguments' object creation. * Named function expression name binding is handled by the * compiler; the compiled function's parent env will contain * the (immutable) binding already. * * This handling is now identical for C and Ecmascript functions. * C functions always have the 'NEWENV' flag set, so their * environment record initialization is delayed (which is good). * * Delayed creation (on demand) is handled in duk_js_var.c. */ duk__call_env_setup(thr, func, act, idx_args); /* [ ... func this arg1 ... argN ] */ /* * Setup value stack: clamp to 'nargs', fill up to 'nregs', * ensure value stack size matches target requirements, and * switch value stack bottom. Valstack top is kept. * * Value stack can only grow here. */ duk_valstack_grow_check_throw(thr, vs_min_bytes); act->reserve_byteoff = (duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack); if (use_tailcall) { DUK_ASSERT(nregs >= 0); DUK_ASSERT(nregs >= nargs); duk_set_top_and_wipe(thr, nregs, nargs); } else { if (nregs >= 0) { DUK_ASSERT(nregs >= nargs); duk_set_top_and_wipe(thr, idx_func + 2 + nregs, idx_func + 2 + nargs); } else { ; } thr->valstack_bottom = thr->valstack_bottom + idx_func + 2; } DUK_ASSERT(thr->valstack_bottom >= thr->valstack); DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); DUK_ASSERT(thr->valstack_end >= thr->valstack_top); /* * Make the actual call. For Ecma-to-Ecma calls detect that * setup is complete, then return with a status code that allows * the caller to reuse the running executor. */ if (func != NULL && DUK_HOBJECT_IS_COMPFUNC(func)) { /* * Ecmascript call. */ DUK_ASSERT(func != NULL); DUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(func)); act->curr_pc = DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, (duk_hcompfunc *) func); if (call_flags & DUK_CALL_FLAG_ALLOW_ECMATOECMA) { DUK_DD(DUK_DDPRINT("avoid native call, use existing executor")); DUK_STATS_INC(thr->heap, stats_call_ecmatoecma); DUK_ASSERT((act->flags & DUK_ACT_FLAG_PREVENT_YIELD) == 0); DUK_REFZERO_CHECK_FAST(thr); DUK_ASSERT(thr->ptr_curr_pc == NULL); return 1; /* 1=reuse executor */ } DUK_ASSERT(use_tailcall == 0); /* duk_hthread_activation_unwind_norz() will decrease this on unwind */ DUK_ASSERT((act->flags & DUK_ACT_FLAG_PREVENT_YIELD) == 0); act->flags |= DUK_ACT_FLAG_PREVENT_YIELD; thr->callstack_preventcount++; /* XXX: we could just do this on entry regardless of reuse, as long * as recursion depth is decreased for e2e case. */ duk__call_c_recursion_limit_check(thr); thr->heap->call_recursion_depth++; /* [ ... func this | arg1 ... argN ] ('this' must precede new bottom) */ /* * Bytecode executor call. * * Execute bytecode, handling any recursive function calls and * thread resumptions. Returns when execution would return from * the entry level activation. When the executor returns, a * single return value is left on the stack top. * * The only possible longjmp() is an error (DUK_LJ_TYPE_THROW), * other types are handled internally by the executor. */ /* thr->ptr_curr_pc is set by bytecode executor early on entry */ DUK_ASSERT(thr->ptr_curr_pc == NULL); DUK_DDD(DUK_DDDPRINT("entering bytecode execution")); duk_js_execute_bytecode(thr); DUK_DDD(DUK_DDDPRINT("returned from bytecode execution")); } else { /* * Native call. */ DUK_ASSERT(func == NULL || ((duk_hnatfunc *) func)->func != NULL); DUK_ASSERT(use_tailcall == 0); /* [ ... func this | arg1 ... argN ] ('this' must precede new bottom) */ /* duk_hthread_activation_unwind_norz() will decrease this on unwind */ DUK_ASSERT((act->flags & DUK_ACT_FLAG_PREVENT_YIELD) == 0); act->flags |= DUK_ACT_FLAG_PREVENT_YIELD; thr->callstack_preventcount++; /* XXX: we could just do this on entry regardless of reuse, as long * as recursion depth is decreased for e2e case. */ duk__call_c_recursion_limit_check(thr); thr->heap->call_recursion_depth++; /* For native calls must be NULL so we don't sync back */ DUK_ASSERT(thr->ptr_curr_pc == NULL); /* XXX: native funcptr could come out of call setup. */ if (func) { rc = ((duk_hnatfunc *) func)->func(thr); } else { duk_tval *tv_func; duk_c_function funcptr; tv_func = &act->tv_func; DUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(tv_func)); funcptr = DUK_TVAL_GET_LIGHTFUNC_FUNCPTR(tv_func); rc = funcptr(thr); } /* Automatic error throwing, retval check. */ if (rc == 0) { DUK_ASSERT(thr->valstack < thr->valstack_end); DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top)); thr->valstack_top++; } else if (rc == 1) { ; } else if (rc < 0) { duk_error_throw_from_negative_rc(thr, rc); DUK_UNREACHABLE(); } else { DUK_ERROR_TYPE(thr, DUK_STR_INVALID_CFUNC_RC); } } DUK_ASSERT(thr->ptr_curr_pc == NULL); DUK_ASSERT(use_tailcall == 0); /* * Constructor call post processing. */ #if defined(DUK_USE_ES6_PROXY) if (call_flags & (DUK_CALL_FLAG_CONSTRUCT | DUK_CALL_FLAG_CONSTRUCT_PROXY)) { duk_call_construct_postprocess(thr, call_flags & DUK_CALL_FLAG_CONSTRUCT_PROXY); } #else if (call_flags & DUK_CALL_FLAG_CONSTRUCT) { duk_call_construct_postprocess(thr, 0); } #endif /* * Unwind, restore valstack bottom and other book-keeping. */ DUK_ASSERT(thr->callstack_curr != NULL); DUK_ASSERT(thr->callstack_curr->parent == entry_act); DUK_ASSERT(thr->callstack_top == entry_callstack_top + 1); duk_hthread_activation_unwind_norz(thr); DUK_ASSERT(thr->callstack_curr == entry_act); DUK_ASSERT(thr->callstack_top == entry_callstack_top); thr->valstack_bottom = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + entry_valstack_bottom_byteoff); /* keep current valstack_top */ DUK_ASSERT(thr->valstack_bottom >= thr->valstack); DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); DUK_ASSERT(thr->valstack_end >= thr->valstack_top); DUK_ASSERT(thr->valstack_top - thr->valstack_bottom >= idx_func + 1); /* Return value handling. */ /* [ ... func this (crud) retval ] */ { duk_tval *tv_ret; duk_tval *tv_funret; tv_ret = thr->valstack_bottom + idx_func; tv_funret = thr->valstack_top - 1; #if defined(DUK_USE_FASTINT) /* Explicit check for fastint downgrade. */ DUK_TVAL_CHKFAST_INPLACE_FAST(tv_funret); #endif DUK_TVAL_SET_TVAL_UPDREF(thr, tv_ret, tv_funret); /* side effects */ } duk_set_top_unsafe(thr, idx_func + 1); /* [ ... retval ] */ /* Restore caller's value stack reserve (cannot fail). */ DUK_ASSERT((duk_uint8_t *) thr->valstack + entry_valstack_end_byteoff >= (duk_uint8_t *) thr->valstack_top); DUK_ASSERT((duk_uint8_t *) thr->valstack + entry_valstack_end_byteoff <= (duk_uint8_t *) thr->valstack_alloc_end); thr->valstack_end = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + entry_valstack_end_byteoff); /* XXX: Trial value stack shrink would be OK here, but we'd need * to prevent side effects of the potential realloc. */ /* Restore entry thread executor curr_pc stack frame pointer. */ thr->ptr_curr_pc = entry_ptr_curr_pc; DUK_HEAP_SWITCH_THREAD(thr->heap, entry_curr_thread); /* may be NULL */ thr->state = (duk_uint8_t) entry_thread_state; /* Disabled assert: triggered with some torture tests. */ #if 0 DUK_ASSERT((thr->state == DUK_HTHREAD_STATE_INACTIVE && thr->heap->curr_thread == NULL) || /* first call */ (thr->state == DUK_HTHREAD_STATE_INACTIVE && thr->heap->curr_thread != NULL) || /* other call */ (thr->state == DUK_HTHREAD_STATE_RUNNING && thr->heap->curr_thread == thr)); /* current thread */ #endif thr->heap->call_recursion_depth = entry_call_recursion_depth; /* If the debugger is active we need to force an interrupt so that * debugger breakpoints are rechecked. This is important for function * calls caused by side effects (e.g. when doing a DUK_OP_GETPROP), see * GH-303. Only needed for success path, error path always causes a * breakpoint recheck in the executor. It would be enough to set this * only when returning to an Ecmascript activation, but setting the flag * on every return should have no ill effect. */ #if defined(DUK_USE_DEBUGGER_SUPPORT) if (duk_debug_is_attached(thr->heap)) { DUK_DD(DUK_DDPRINT("returning with debugger enabled, force interrupt")); DUK_ASSERT(thr->interrupt_counter <= thr->interrupt_init); thr->interrupt_init -= thr->interrupt_counter; thr->interrupt_counter = 0; thr->heap->dbg_force_restart = 1; } #endif #if defined(DUK_USE_INTERRUPT_COUNTER) && defined(DUK_USE_DEBUG) duk__interrupt_fixup(thr, entry_curr_thread); #endif /* Restored by success path. */ DUK_ASSERT(thr->heap->call_recursion_depth == entry_call_recursion_depth); DUK_ASSERT(thr->ptr_curr_pc == entry_ptr_curr_pc); DUK_ASSERT_LJSTATE_UNSET(thr->heap); DUK_REFZERO_CHECK_FAST(thr); return 0; /* 0=call handled inline */ } DUK_INTERNAL duk_int_t duk_handle_call_unprotected_nargs(duk_hthread *thr, duk_idx_t nargs, duk_small_uint_t call_flags) { duk_idx_t idx_func; DUK_ASSERT(duk_get_top(thr) >= nargs + 2); idx_func = duk_get_top(thr) - (nargs + 2); DUK_ASSERT(idx_func >= 0); return duk_handle_call_unprotected(thr, idx_func, call_flags); } DUK_INTERNAL duk_int_t duk_handle_call_unprotected(duk_hthread *thr, duk_idx_t idx_func, duk_small_uint_t call_flags) { DUK_ASSERT(duk_is_valid_index(thr, idx_func)); DUK_ASSERT(idx_func >= 0); return duk__handle_call_raw(thr, idx_func, call_flags); } /* * duk_handle_safe_call(): make a "C protected call" within the * current activation. * * The allowed thread states for making a call are the same as for * duk_handle_call_protected(). * * Even though this call is protected, errors are thrown for insane arguments * and may result in a fatal error unless there's another protected call which * catches such errors. * * The error handling path should be error free, even for out-of-memory * errors, to ensure safe sandboxing. (As of Duktape 2.2.0 this is not * yet the case for environment closing which may run out of memory, see * XXX notes below.) */ DUK_LOCAL void duk__handle_safe_call_inner(duk_hthread *thr, duk_safe_call_function func, void *udata, #if defined(DUK_USE_ASSERTIONS) duk_size_t entry_valstack_bottom_byteoff, duk_size_t entry_callstack_top, #endif duk_hthread *entry_curr_thread, duk_uint_fast8_t entry_thread_state, duk_idx_t idx_retbase, duk_idx_t num_stack_rets) { duk_ret_t rc; DUK_ASSERT(thr != NULL); DUK_ASSERT_CTX_VALID(thr); /* * Thread state check and book-keeping. */ duk__call_thread_state_update(thr); /* * Recursion limit check. */ duk__call_c_recursion_limit_check(thr); thr->heap->call_recursion_depth++; /* * Make the C call. */ rc = func(thr, udata); DUK_DDD(DUK_DDDPRINT("safe_call, func rc=%ld", (long) rc)); /* * Valstack manipulation for results. */ /* we're running inside the caller's activation, so no change in call/catch stack or valstack bottom */ DUK_ASSERT(thr->callstack_top == entry_callstack_top); DUK_ASSERT(thr->valstack_bottom >= thr->valstack); DUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_bottom - (duk_uint8_t *) thr->valstack) == entry_valstack_bottom_byteoff); DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); DUK_ASSERT(thr->valstack_end >= thr->valstack_top); if (DUK_UNLIKELY(rc < 0)) { duk_error_throw_from_negative_rc(thr, rc); } DUK_ASSERT(rc >= 0); duk__safe_call_adjust_valstack(thr, idx_retbase, num_stack_rets, rc); /* throws for insane rc */ DUK_HEAP_SWITCH_THREAD(thr->heap, entry_curr_thread); /* may be NULL */ thr->state = (duk_uint8_t) entry_thread_state; } DUK_LOCAL void duk__handle_safe_call_error(duk_hthread *thr, duk_activation *entry_act, #if defined(DUK_USE_ASSERTIONS) duk_size_t entry_callstack_top, #endif duk_hthread *entry_curr_thread, duk_uint_fast8_t entry_thread_state, duk_idx_t idx_retbase, duk_idx_t num_stack_rets, duk_size_t entry_valstack_bottom_byteoff, duk_jmpbuf *old_jmpbuf_ptr) { DUK_ASSERT(thr != NULL); DUK_ASSERT_CTX_VALID(thr); /* * Error during call. The error value is at heap->lj.value1. * * The very first thing we do is restore the previous setjmp catcher. * This means that any error in error handling will propagate outwards * instead of causing a setjmp() re-entry above. */ DUK_DDD(DUK_DDDPRINT("error caught during protected duk_handle_safe_call()")); /* Other longjmp types are handled by executor before propagating * the error here. */ DUK_ASSERT(thr->heap->lj.type == DUK_LJ_TYPE_THROW); DUK_ASSERT_LJSTATE_SET(thr->heap); /* Either pointer may be NULL (at entry), so don't assert. */ thr->heap->lj.jmpbuf_ptr = old_jmpbuf_ptr; /* XXX: callstack unwind may now throw an error when closing * scopes; this is a sandboxing issue, described in: * https://github.com/svaarala/duktape/issues/476 */ /* XXX: "unwind to" primitive? */ DUK_ASSERT(thr->callstack_top >= entry_callstack_top); while (thr->callstack_curr != entry_act) { DUK_ASSERT(thr->callstack_curr != NULL); duk_hthread_activation_unwind_norz(thr); } DUK_ASSERT(thr->callstack_top == entry_callstack_top); /* Switch active thread before any side effects to avoid a * dangling curr_thread pointer. */ DUK_HEAP_SWITCH_THREAD(thr->heap, entry_curr_thread); /* may be NULL */ thr->state = (duk_uint8_t) entry_thread_state; DUK_ASSERT(thr->heap->curr_thread == entry_curr_thread); DUK_ASSERT(thr->state == entry_thread_state); /* Restore valstack bottom. */ thr->valstack_bottom = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + entry_valstack_bottom_byteoff); /* [ ... | (crud) ] */ /* XXX: ensure space in valstack (now relies on internal reserve)? */ duk_push_tval(thr, &thr->heap->lj.value1); /* [ ... | (crud) errobj ] */ DUK_ASSERT(duk_get_top(thr) >= 1); /* at least errobj must be on stack */ duk__safe_call_adjust_valstack(thr, idx_retbase, num_stack_rets, 1); /* 1 = num actual 'return values' */ /* [ ... | ] or [ ... | errobj (M * undefined)] where M = num_stack_rets - 1 */ /* Reset longjmp state. */ thr->heap->lj.type = DUK_LJ_TYPE_UNKNOWN; thr->heap->lj.iserror = 0; DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ(thr, &thr->heap->lj.value1); DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ(thr, &thr->heap->lj.value2); /* Error handling complete, remove side effect protections. Caller * will process pending finalizers. */ #if defined(DUK_USE_ASSERTIONS) DUK_ASSERT(thr->heap->error_not_allowed == 1); thr->heap->error_not_allowed = 0; #endif DUK_ASSERT(thr->heap->pf_prevent_count > 0); thr->heap->pf_prevent_count--; DUK_DD(DUK_DDPRINT("safe call error handled, pf_prevent_count updated to %ld", (long) thr->heap->pf_prevent_count)); /* thr->ptr_curr_pc is restored by * duk__handle_safe_call_shared_unwind() which is also used for * success path. */ } DUK_LOCAL void duk__handle_safe_call_shared_unwind(duk_hthread *thr, duk_idx_t idx_retbase, duk_idx_t num_stack_rets, #if defined(DUK_USE_ASSERTIONS) duk_size_t entry_callstack_top, #endif duk_int_t entry_call_recursion_depth, duk_hthread *entry_curr_thread, duk_instr_t **entry_ptr_curr_pc) { DUK_ASSERT(thr != NULL); DUK_ASSERT_CTX_VALID(thr); DUK_UNREF(idx_retbase); DUK_UNREF(num_stack_rets); DUK_UNREF(entry_curr_thread); DUK_ASSERT(thr->callstack_top == entry_callstack_top); /* Restore entry thread executor curr_pc stack frame pointer. * XXX: would be enough to do in error path only, should nest * cleanly in success path. */ thr->ptr_curr_pc = entry_ptr_curr_pc; thr->heap->call_recursion_depth = entry_call_recursion_depth; /* stack discipline consistency check */ DUK_ASSERT(duk_get_top(thr) == idx_retbase + num_stack_rets); /* A debugger forced interrupt check is not needed here, as * problematic safe calls are not caused by side effects. */ #if defined(DUK_USE_INTERRUPT_COUNTER) && defined(DUK_USE_DEBUG) duk__interrupt_fixup(thr, entry_curr_thread); #endif } DUK_INTERNAL duk_int_t duk_handle_safe_call(duk_hthread *thr, duk_safe_call_function func, void *udata, duk_idx_t num_stack_args, duk_idx_t num_stack_rets) { duk_activation *entry_act; duk_size_t entry_valstack_bottom_byteoff; #if defined(DUK_USE_ASSERTIONS) duk_size_t entry_valstack_end_byteoff; duk_size_t entry_callstack_top; duk_size_t entry_callstack_preventcount; #endif duk_int_t entry_call_recursion_depth; duk_hthread *entry_curr_thread; duk_uint_fast8_t entry_thread_state; duk_instr_t **entry_ptr_curr_pc; duk_jmpbuf *old_jmpbuf_ptr = NULL; duk_jmpbuf our_jmpbuf; duk_idx_t idx_retbase; duk_int_t retval; DUK_ASSERT(thr != NULL); DUK_ASSERT(duk_get_top(thr) >= num_stack_args); /* Caller ensures. */ DUK_STATS_INC(thr->heap, stats_safecall_all); /* Value stack reserve handling: safe call assumes caller has reserved * space for nrets (assuming optimal unwind processing). Value stack * reserve is not stored/restored as for normal calls because a safe * call conceptually happens in the same activation. */ /* Careful with indices like '-x'; if 'x' is zero, it refers to bottom */ entry_act = thr->callstack_curr; entry_valstack_bottom_byteoff = (duk_size_t) ((duk_uint8_t *) thr->valstack_bottom - (duk_uint8_t *) thr->valstack); #if defined(DUK_USE_ASSERTIONS) entry_valstack_end_byteoff = (duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack); entry_callstack_top = thr->callstack_top; entry_callstack_preventcount = thr->callstack_preventcount; #endif entry_call_recursion_depth = thr->heap->call_recursion_depth; entry_curr_thread = thr->heap->curr_thread; /* may be NULL if first call */ entry_thread_state = thr->state; entry_ptr_curr_pc = thr->ptr_curr_pc; /* may be NULL */ idx_retbase = duk_get_top(thr) - num_stack_args; /* not a valid stack index if num_stack_args == 0 */ DUK_ASSERT(idx_retbase >= 0); DUK_ASSERT((duk_idx_t) (thr->valstack_top - thr->valstack_bottom) >= num_stack_args); /* Caller ensures. */ DUK_ASSERT((duk_idx_t) (thr->valstack_end - (thr->valstack_bottom + idx_retbase)) >= num_stack_rets); /* Caller ensures. */ /* Cannot portably debug print a function pointer, hence 'func' not printed! */ DUK_DD(DUK_DDPRINT("duk_handle_safe_call: thr=%p, num_stack_args=%ld, num_stack_rets=%ld, " "valstack_top=%ld, idx_retbase=%ld, rec_depth=%ld/%ld, " "entry_act=%p, entry_valstack_bottom_byteoff=%ld, entry_call_recursion_depth=%ld, " "entry_curr_thread=%p, entry_thread_state=%ld", (void *) thr, (long) num_stack_args, (long) num_stack_rets, (long) duk_get_top(thr), (long) idx_retbase, (long) thr->heap->call_recursion_depth, (long) thr->heap->call_recursion_limit, (void *) entry_act, (long) entry_valstack_bottom_byteoff, (long) entry_call_recursion_depth, (void *) entry_curr_thread, (long) entry_thread_state)); /* Setjmp catchpoint setup. */ old_jmpbuf_ptr = thr->heap->lj.jmpbuf_ptr; thr->heap->lj.jmpbuf_ptr = &our_jmpbuf; /* Prevent yields for the duration of the safe call. This only * matters if the executor makes safe calls to functions that * yield, this doesn't currently happen. */ thr->callstack_preventcount++; #if defined(DUK_USE_CPP_EXCEPTIONS) try { #else DUK_ASSERT(thr->heap->lj.jmpbuf_ptr == &our_jmpbuf); if (DUK_SETJMP(our_jmpbuf.jb) == 0) { /* Success path. */ #endif DUK_DDD(DUK_DDDPRINT("safe_call setjmp catchpoint setup complete")); duk__handle_safe_call_inner(thr, func, udata, #if defined(DUK_USE_ASSERTIONS) entry_valstack_bottom_byteoff, entry_callstack_top, #endif entry_curr_thread, entry_thread_state, idx_retbase, num_stack_rets); DUK_STATS_INC(thr->heap, stats_safecall_nothrow); /* Either pointer may be NULL (at entry), so don't assert */ thr->heap->lj.jmpbuf_ptr = old_jmpbuf_ptr; /* If calls happen inside the safe call, these are restored by * whatever calls are made. Reserve cannot decrease. */ DUK_ASSERT(thr->callstack_curr == entry_act); DUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack) >= entry_valstack_end_byteoff); retval = DUK_EXEC_SUCCESS; #if defined(DUK_USE_CPP_EXCEPTIONS) } catch (duk_internal_exception &exc) { DUK_UNREF(exc); #else } else { /* Error path. */ #endif DUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack) >= entry_valstack_end_byteoff); DUK_STATS_INC(thr->heap, stats_safecall_throw); duk__handle_safe_call_error(thr, entry_act, #if defined(DUK_USE_ASSERTIONS) entry_callstack_top, #endif entry_curr_thread, entry_thread_state, idx_retbase, num_stack_rets, entry_valstack_bottom_byteoff, old_jmpbuf_ptr); retval = DUK_EXEC_ERROR; } #if defined(DUK_USE_CPP_EXCEPTIONS) catch (std::exception &exc) { const char *what = exc.what(); DUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack) >= entry_valstack_end_byteoff); DUK_STATS_INC(thr->heap, stats_safecall_throw); if (!what) { what = "unknown"; } DUK_D(DUK_DPRINT("unexpected c++ std::exception (perhaps thrown by user code)")); try { DUK_ERROR_FMT1(thr, DUK_ERR_TYPE_ERROR, "caught invalid c++ std::exception '%s' (perhaps thrown by user code)", what); } catch (duk_internal_exception exc) { DUK_D(DUK_DPRINT("caught api error thrown from unexpected c++ std::exception")); DUK_UNREF(exc); duk__handle_safe_call_error(thr, entry_act, #if defined(DUK_USE_ASSERTIONS) entry_callstack_top, #endif entry_curr_thread, entry_thread_state, idx_retbase, num_stack_rets, entry_valstack_bottom_byteoff, old_jmpbuf_ptr); retval = DUK_EXEC_ERROR; } } catch (...) { DUK_D(DUK_DPRINT("unexpected c++ exception (perhaps thrown by user code)")); DUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack) >= entry_valstack_end_byteoff); DUK_STATS_INC(thr->heap, stats_safecall_throw); try { DUK_ERROR_TYPE(thr, "caught invalid c++ exception (perhaps thrown by user code)"); } catch (duk_internal_exception exc) { DUK_D(DUK_DPRINT("caught api error thrown from unexpected c++ exception")); DUK_UNREF(exc); duk__handle_safe_call_error(thr, entry_act, #if defined(DUK_USE_ASSERTIONS) entry_callstack_top, #endif entry_curr_thread, entry_thread_state, idx_retbase, num_stack_rets, entry_valstack_bottom_byteoff, old_jmpbuf_ptr); retval = DUK_EXEC_ERROR; } } #endif DUK_ASSERT(thr->heap->lj.jmpbuf_ptr == old_jmpbuf_ptr); /* success/error path both do this */ DUK_ASSERT_LJSTATE_UNSET(thr->heap); DUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack) >= entry_valstack_end_byteoff); duk__handle_safe_call_shared_unwind(thr, idx_retbase, num_stack_rets, #if defined(DUK_USE_ASSERTIONS) entry_callstack_top, #endif entry_call_recursion_depth, entry_curr_thread, entry_ptr_curr_pc); /* Restore preventcount. */ thr->callstack_preventcount--; DUK_ASSERT(thr->callstack_preventcount == entry_callstack_preventcount); /* Final asserts. */ DUK_ASSERT(thr->callstack_curr == entry_act); DUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_bottom - (duk_uint8_t *) thr->valstack) == entry_valstack_bottom_byteoff); DUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack) >= entry_valstack_end_byteoff); DUK_ASSERT(thr->callstack_top == entry_callstack_top); DUK_ASSERT(thr->heap->call_recursion_depth == entry_call_recursion_depth); DUK_ASSERT(thr->heap->curr_thread == entry_curr_thread); DUK_ASSERT(thr->state == entry_thread_state); DUK_ASSERT(thr->ptr_curr_pc == entry_ptr_curr_pc); DUK_ASSERT(duk_get_top(thr) == idx_retbase + num_stack_rets); DUK_ASSERT_LJSTATE_UNSET(thr->heap); /* Pending side effects. */ DUK_REFZERO_CHECK_FAST(thr); return retval; } /* * Property-based call (foo.noSuch()) error setup: replace target function * on stack top with a specially tagged (hidden Symbol) error which gets * thrown in call handling at the proper spot to follow Ecmascript semantics. */ #if defined(DUK_USE_VERBOSE_ERRORS) DUK_INTERNAL DUK_NOINLINE DUK_COLD void duk_call_setup_propcall_error(duk_hthread *thr, duk_tval *tv_targ, duk_tval *tv_base, duk_tval *tv_key) { const char *str1, *str2, *str3; duk_idx_t entry_top; entry_top = duk_get_top(thr); /* Must stabilize pointers first. Argument convention is a bit awkward, * it comes from the executor call site where some arguments may not be * on the value stack (consts). */ duk_push_tval(thr, tv_base); duk_push_tval(thr, tv_key); duk_push_tval(thr, tv_targ); DUK_GC_TORTURE(thr->heap); /* We only push an error, replacing the call target (at idx_func) * with the error to ensure side effects come out correctly: * - Property read * - Call argument evaluation * - Callability check and error thrown. * * A hidden Symbol on the error object pushed here is used by * call handling to figure out the error is to be thrown as is. * It is CRITICAL that the hidden Symbol can never occur on a * user visible object that may get thrown. */ #if defined(DUK_USE_PARANOID_ERRORS) str1 = duk_get_type_name(thr, -1); str2 = duk_get_type_name(thr, -2); str3 = duk_get_type_name(thr, -3); duk_push_error_object(thr, DUK_ERR_TYPE_ERROR | DUK_ERRCODE_FLAG_NOBLAME_FILELINE, "%s not callable (property %s of %s)", str1, str2, str3); #else str1 = duk_push_string_readable(thr, -1); str2 = duk_push_string_readable(thr, -3); str3 = duk_push_string_readable(thr, -5); duk_push_error_object(thr, DUK_ERR_TYPE_ERROR | DUK_ERRCODE_FLAG_NOBLAME_FILELINE, "%s not callable (property %s of %s)", str1, str2, str3); #endif duk_push_true(thr); duk_put_prop_stridx(thr, -2, DUK_STRIDX_INT_TARGET); /* Marker property, reuse _Target. */ /* [ <nregs> propValue <variable> error ] */ duk_replace(thr, entry_top - 1); duk_set_top(thr, entry_top); DUK_ASSERT(!duk_is_callable(thr, -1)); /* Critical so that call handling will throw the error. */ } #endif /* DUK_USE_VERBOSE_ERRORS */ /* automatic undefs */ #undef DUK__AUGMENT_CALL_RELAX_COUNT #line 1 "duk_js_compiler.c" /* * Ecmascript compiler. * * Parses an input string and generates a function template result. * Compilation may happen in multiple contexts (global code, eval * code, function code). * * The parser uses a traditional top-down recursive parsing for the * statement level, and an operator precedence based top-down approach * for the expression level. The attempt is to minimize the C stack * depth. Bytecode is generated directly without an intermediate * representation (tree), at the cost of needing two (and sometimes * three) passes over each function. * * The top-down recursive parser functions are named "duk__parse_XXX". * * Recursion limits are in key functions to prevent arbitrary C recursion: * function body parsing, statement parsing, and expression parsing. * * See doc/compiler.rst for discussion on the design. * * A few typing notes: * * - duk_regconst_t: signed, highest bit set (< 0) means constant, * some call sites use -1 for "none" (equivalent to constant 0x7fffffff) * - PC values: duk_int_t, negative values used as markers */ /* #include duk_internal.h -> already included */ /* If highest bit of a register number is set, it refers to a constant instead. * When interpreted as a signed value, this means const values are always * negative (when interpreted as two's complement). For example DUK__ISREG_TEMP() * uses this approach to avoid an explicit DUK__ISREG() check (the condition is * logically "'x' is a register AND 'x' >= temp_first"). */ #define DUK__CONST_MARKER DUK_REGCONST_CONST_MARKER #define DUK__REMOVECONST(x) ((x) & ~DUK__CONST_MARKER) #define DUK__ISREG(x) ((x) >= 0) #define DUK__ISCONST(x) ((x) < 0) #define DUK__ISREG_TEMP(comp_ctx,x) ((duk_int32_t) (x) >= (duk_int32_t) ((comp_ctx)->curr_func.temp_first)) /* Check for x >= temp_first && x >= 0 by comparing as signed. */ #define DUK__ISREG_NOTTEMP(comp_ctx,x) ((duk_uint32_t) (x) < (duk_uint32_t) ((comp_ctx)->curr_func.temp_first)) /* Check for x >= 0 && x < temp_first by interpreting as unsigned. */ #define DUK__GETTEMP(comp_ctx) ((comp_ctx)->curr_func.temp_next) #define DUK__SETTEMP(comp_ctx,x) ((comp_ctx)->curr_func.temp_next = (x)) /* dangerous: must only lower (temp_max not updated) */ #define DUK__SETTEMP_CHECKMAX(comp_ctx,x) duk__settemp_checkmax((comp_ctx),(x)) #define DUK__ALLOCTEMP(comp_ctx) duk__alloctemp((comp_ctx)) #define DUK__ALLOCTEMPS(comp_ctx,count) duk__alloctemps((comp_ctx),(count)) /* Init value set size for array and object literals. */ #define DUK__MAX_ARRAY_INIT_VALUES 20 #define DUK__MAX_OBJECT_INIT_PAIRS 10 /* XXX: hack, remove when const lookup is not O(n) */ #define DUK__GETCONST_MAX_CONSTS_CHECK 256 /* These limits are based on bytecode limits. Max temps is limited * by duk_hcompfunc nargs/nregs fields being 16 bits. */ #define DUK__MAX_CONSTS DUK_BC_BC_MAX #define DUK__MAX_FUNCS DUK_BC_BC_MAX #define DUK__MAX_TEMPS 0xffffL /* Initial bytecode size allocation. */ #if defined(DUK_USE_PREFER_SIZE) #define DUK__BC_INITIAL_INSTS 16 #else #define DUK__BC_INITIAL_INSTS 256 #endif #define DUK__RECURSION_INCREASE(comp_ctx,thr) do { \ DUK_DDD(DUK_DDDPRINT("RECURSION INCREASE: %s:%ld", (const char *) DUK_FILE_MACRO, (long) DUK_LINE_MACRO)); \ duk__comp_recursion_increase((comp_ctx)); \ } while (0) #define DUK__RECURSION_DECREASE(comp_ctx,thr) do { \ DUK_DDD(DUK_DDDPRINT("RECURSION DECREASE: %s:%ld", (const char *) DUK_FILE_MACRO, (long) DUK_LINE_MACRO)); \ duk__comp_recursion_decrease((comp_ctx)); \ } while (0) /* Value stack slot limits: these are quite approximate right now, and * because they overlap in control flow, some could be eliminated. */ #define DUK__COMPILE_ENTRY_SLOTS 8 #define DUK__FUNCTION_INIT_REQUIRE_SLOTS 16 #define DUK__FUNCTION_BODY_REQUIRE_SLOTS 16 #define DUK__PARSE_STATEMENTS_SLOTS 16 #define DUK__PARSE_EXPR_SLOTS 16 /* Temporary structure used to pass a stack allocated region through * duk_safe_call(). */ typedef struct { duk_small_uint_t flags; duk_compiler_ctx comp_ctx_alloc; duk_lexer_point lex_pt_alloc; } duk__compiler_stkstate; /* * Prototypes */ /* lexing */ DUK_LOCAL_DECL void duk__advance_helper(duk_compiler_ctx *comp_ctx, duk_small_int_t expect); DUK_LOCAL_DECL void duk__advance_expect(duk_compiler_ctx *comp_ctx, duk_small_int_t expect); DUK_LOCAL_DECL void duk__advance(duk_compiler_ctx *ctx); /* function helpers */ DUK_LOCAL_DECL void duk__init_func_valstack_slots(duk_compiler_ctx *comp_ctx); DUK_LOCAL_DECL void duk__reset_func_for_pass2(duk_compiler_ctx *comp_ctx); DUK_LOCAL_DECL void duk__init_varmap_and_prologue_for_pass2(duk_compiler_ctx *comp_ctx, duk_regconst_t *out_stmt_value_reg); DUK_LOCAL_DECL void duk__convert_to_func_template(duk_compiler_ctx *comp_ctx); DUK_LOCAL_DECL duk_int_t duk__cleanup_varmap(duk_compiler_ctx *comp_ctx); /* code emission */ DUK_LOCAL_DECL duk_int_t duk__get_current_pc(duk_compiler_ctx *comp_ctx); DUK_LOCAL_DECL duk_compiler_instr *duk__get_instr_ptr(duk_compiler_ctx *comp_ctx, duk_int_t pc); DUK_LOCAL_DECL void duk__emit(duk_compiler_ctx *comp_ctx, duk_instr_t ins); DUK_LOCAL_DECL void duk__emit_op_only(duk_compiler_ctx *comp_ctx, duk_small_uint_t op); DUK_LOCAL_DECL void duk__emit_a_b_c(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t a, duk_regconst_t b, duk_regconst_t c); DUK_LOCAL_DECL void duk__emit_a_b(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t a, duk_regconst_t b); DUK_LOCAL_DECL void duk__emit_b_c(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t b, duk_regconst_t c); #if 0 /* unused */ DUK_LOCAL_DECL void duk__emit_a(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t a); DUK_LOCAL_DECL void duk__emit_b(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t b); #endif DUK_LOCAL_DECL void duk__emit_a_bc(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t a, duk_regconst_t bc); DUK_LOCAL_DECL void duk__emit_bc(duk_compiler_ctx *comp_ctx, duk_small_uint_t op, duk_regconst_t bc); DUK_LOCAL_DECL void duk__emit_abc(duk_compiler_ctx *comp_ctx, duk_small_uint_t op, duk_regconst_t abc); DUK_LOCAL_DECL void duk__emit_load_int32(duk_compiler_ctx *comp_ctx, duk_regconst_t reg, duk_int32_t val); DUK_LOCAL_DECL void duk__emit_load_int32_noshuffle(duk_compiler_ctx *comp_ctx, duk_regconst_t reg, duk_int32_t val); DUK_LOCAL_DECL void duk__emit_jump(duk_compiler_ctx *comp_ctx, duk_int_t target_pc); DUK_LOCAL_DECL duk_int_t duk__emit_jump_empty(duk_compiler_ctx *comp_ctx); DUK_LOCAL_DECL void duk__insert_jump_entry(duk_compiler_ctx *comp_ctx, duk_int_t jump_pc); DUK_LOCAL_DECL void duk__patch_jump(duk_compiler_ctx *comp_ctx, duk_int_t jump_pc, duk_int_t target_pc); DUK_LOCAL_DECL void duk__patch_jump_here(duk_compiler_ctx *comp_ctx, duk_int_t jump_pc); DUK_LOCAL_DECL void duk__patch_trycatch(duk_compiler_ctx *comp_ctx, duk_int_t ldconst_pc, duk_int_t trycatch_pc, duk_regconst_t reg_catch, duk_regconst_t const_varname, duk_small_uint_t flags); DUK_LOCAL_DECL void duk__emit_if_false_skip(duk_compiler_ctx *comp_ctx, duk_regconst_t regconst); DUK_LOCAL_DECL void duk__emit_if_true_skip(duk_compiler_ctx *comp_ctx, duk_regconst_t regconst); DUK_LOCAL_DECL void duk__emit_invalid(duk_compiler_ctx *comp_ctx); /* ivalue/ispec helpers */ DUK_LOCAL_DECL void duk__ivalue_regconst(duk_ivalue *x, duk_regconst_t regconst); DUK_LOCAL_DECL void duk__ivalue_plain_fromstack(duk_compiler_ctx *comp_ctx, duk_ivalue *x); DUK_LOCAL_DECL void duk__ivalue_var_fromstack(duk_compiler_ctx *comp_ctx, duk_ivalue *x); DUK_LOCAL_DECL void duk__ivalue_var_hstring(duk_compiler_ctx *comp_ctx, duk_ivalue *x, duk_hstring *h); DUK_LOCAL_DECL void duk__copy_ispec(duk_compiler_ctx *comp_ctx, duk_ispec *src, duk_ispec *dst); DUK_LOCAL_DECL void duk__copy_ivalue(duk_compiler_ctx *comp_ctx, duk_ivalue *src, duk_ivalue *dst); DUK_LOCAL_DECL duk_regconst_t duk__alloctemps(duk_compiler_ctx *comp_ctx, duk_small_int_t num); DUK_LOCAL_DECL duk_regconst_t duk__alloctemp(duk_compiler_ctx *comp_ctx); DUK_LOCAL_DECL void duk__settemp_checkmax(duk_compiler_ctx *comp_ctx, duk_regconst_t temp_next); DUK_LOCAL_DECL duk_regconst_t duk__getconst(duk_compiler_ctx *comp_ctx); DUK_LOCAL_DECL duk_regconst_t duk__ispec_toregconst_raw(duk_compiler_ctx *comp_ctx, duk_ispec *x, duk_regconst_t forced_reg, duk_small_uint_t flags); DUK_LOCAL_DECL void duk__ispec_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ispec *x, duk_regconst_t forced_reg); DUK_LOCAL_DECL void duk__ivalue_toplain_raw(duk_compiler_ctx *comp_ctx, duk_ivalue *x, duk_regconst_t forced_reg); DUK_LOCAL_DECL void duk__ivalue_toplain(duk_compiler_ctx *comp_ctx, duk_ivalue *x); DUK_LOCAL_DECL void duk__ivalue_toplain_ignore(duk_compiler_ctx *comp_ctx, duk_ivalue *x); DUK_LOCAL_DECL duk_regconst_t duk__ivalue_toregconst_raw(duk_compiler_ctx *comp_ctx, duk_ivalue *x, duk_regconst_t forced_reg, duk_small_uint_t flags); DUK_LOCAL_DECL duk_regconst_t duk__ivalue_toreg(duk_compiler_ctx *comp_ctx, duk_ivalue *x); #if 0 /* unused */ DUK_LOCAL_DECL duk_regconst_t duk__ivalue_totemp(duk_compiler_ctx *comp_ctx, duk_ivalue *x); #endif DUK_LOCAL_DECL void duk__ivalue_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ivalue *x, duk_int_t forced_reg); DUK_LOCAL_DECL duk_regconst_t duk__ivalue_toregconst(duk_compiler_ctx *comp_ctx, duk_ivalue *x); DUK_LOCAL_DECL duk_regconst_t duk__ivalue_totempconst(duk_compiler_ctx *comp_ctx, duk_ivalue *x); /* identifier handling */ DUK_LOCAL_DECL duk_regconst_t duk__lookup_active_register_binding(duk_compiler_ctx *comp_ctx); DUK_LOCAL_DECL duk_bool_t duk__lookup_lhs(duk_compiler_ctx *ctx, duk_regconst_t *out_reg_varbind, duk_regconst_t *out_rc_varname); /* label handling */ DUK_LOCAL_DECL void duk__add_label(duk_compiler_ctx *comp_ctx, duk_hstring *h_label, duk_int_t pc_label, duk_int_t label_id); DUK_LOCAL_DECL void duk__update_label_flags(duk_compiler_ctx *comp_ctx, duk_int_t label_id, duk_small_uint_t flags); DUK_LOCAL_DECL void duk__lookup_active_label(duk_compiler_ctx *comp_ctx, duk_hstring *h_label, duk_bool_t is_break, duk_int_t *out_label_id, duk_int_t *out_label_catch_depth, duk_int_t *out_label_pc, duk_bool_t *out_is_closest); DUK_LOCAL_DECL void duk__reset_labels_to_length(duk_compiler_ctx *comp_ctx, duk_size_t len); /* top-down expression parser */ DUK_LOCAL_DECL void duk__expr_nud(duk_compiler_ctx *comp_ctx, duk_ivalue *res); DUK_LOCAL_DECL void duk__expr_led(duk_compiler_ctx *comp_ctx, duk_ivalue *left, duk_ivalue *res); DUK_LOCAL_DECL duk_small_uint_t duk__expr_lbp(duk_compiler_ctx *comp_ctx); DUK_LOCAL_DECL duk_bool_t duk__expr_is_empty(duk_compiler_ctx *comp_ctx); /* exprtop is the top level variant which resets nud/led counts */ DUK_LOCAL_DECL void duk__expr(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags); DUK_LOCAL_DECL void duk__exprtop(duk_compiler_ctx *ctx, duk_ivalue *res, duk_small_uint_t rbp_flags); /* convenience helpers */ #if 0 /* unused */ DUK_LOCAL_DECL duk_regconst_t duk__expr_toreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags); #endif #if 0 /* unused */ DUK_LOCAL_DECL duk_regconst_t duk__expr_totemp(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags); #endif DUK_LOCAL_DECL void duk__expr_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags, duk_regconst_t forced_reg); DUK_LOCAL_DECL duk_regconst_t duk__expr_toregconst(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags); #if 0 /* unused */ DUK_LOCAL_DECL duk_regconst_t duk__expr_totempconst(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags); #endif DUK_LOCAL_DECL void duk__expr_toplain(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags); DUK_LOCAL_DECL void duk__expr_toplain_ignore(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags); DUK_LOCAL_DECL duk_regconst_t duk__exprtop_toreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags); #if 0 /* unused */ DUK_LOCAL_DECL duk_regconst_t duk__exprtop_totemp(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags); #endif DUK_LOCAL_DECL void duk__exprtop_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags, duk_regconst_t forced_reg); DUK_LOCAL_DECL duk_regconst_t duk__exprtop_toregconst(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags); #if 0 /* unused */ DUK_LOCAL_DECL void duk__exprtop_toplain_ignore(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags); #endif /* expression parsing helpers */ DUK_LOCAL_DECL duk_int_t duk__parse_arguments(duk_compiler_ctx *comp_ctx, duk_ivalue *res); DUK_LOCAL_DECL void duk__nud_array_literal(duk_compiler_ctx *comp_ctx, duk_ivalue *res); DUK_LOCAL_DECL void duk__nud_object_literal(duk_compiler_ctx *comp_ctx, duk_ivalue *res); /* statement parsing */ DUK_LOCAL_DECL void duk__parse_var_decl(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t expr_flags, duk_regconst_t *out_reg_varbind, duk_regconst_t *out_rc_varname); DUK_LOCAL_DECL void duk__parse_var_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t expr_flags); DUK_LOCAL_DECL void duk__parse_for_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site); DUK_LOCAL_DECL void duk__parse_switch_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site); DUK_LOCAL_DECL void duk__parse_if_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res); DUK_LOCAL_DECL void duk__parse_do_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site); DUK_LOCAL_DECL void duk__parse_while_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site); DUK_LOCAL_DECL void duk__parse_break_or_continue_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res); DUK_LOCAL_DECL void duk__parse_return_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res); DUK_LOCAL_DECL void duk__parse_throw_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res); DUK_LOCAL_DECL void duk__parse_try_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res); DUK_LOCAL_DECL void duk__parse_with_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res); DUK_LOCAL_DECL void duk__parse_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_bool_t allow_source_elem); DUK_LOCAL_DECL duk_int_t duk__stmt_label_site(duk_compiler_ctx *comp_ctx, duk_int_t label_id); DUK_LOCAL_DECL void duk__parse_stmts(duk_compiler_ctx *comp_ctx, duk_bool_t allow_source_elem, duk_bool_t expect_eof); DUK_LOCAL_DECL void duk__parse_func_body(duk_compiler_ctx *comp_ctx, duk_bool_t expect_eof, duk_bool_t implicit_return_value, duk_small_int_t expect_token); DUK_LOCAL_DECL void duk__parse_func_formals(duk_compiler_ctx *comp_ctx); DUK_LOCAL_DECL void duk__parse_func_like_raw(duk_compiler_ctx *comp_ctx, duk_small_uint_t flags); DUK_LOCAL_DECL duk_int_t duk__parse_func_like_fnum(duk_compiler_ctx *comp_ctx, duk_small_uint_t flags); #define DUK__FUNC_FLAG_DECL (1 << 0) /* Parsing a function declaration. */ #define DUK__FUNC_FLAG_GETSET (1 << 1) /* Parsing an object literal getter/setter. */ #define DUK__FUNC_FLAG_METDEF (1 << 2) /* Parsing an object literal method definition shorthand. */ #define DUK__FUNC_FLAG_PUSHNAME_PASS1 (1 << 3) /* Push function name when creating template (first pass only). */ #define DUK__FUNC_FLAG_USE_PREVTOKEN (1 << 4) /* Use prev_token to start function parsing (workaround for object literal). */ /* * Parser control values for tokens. The token table is ordered by the * DUK_TOK_XXX defines. * * The binding powers are for lbp() use (i.e. for use in led() context). * Binding powers are positive for typing convenience, and bits at the * top should be reserved for flags. Binding power step must be higher * than 1 so that binding power "lbp - 1" can be used for right associative * operators. Currently a step of 2 is used (which frees one more bit for * flags). */ /* XXX: actually single step levels would work just fine, clean up */ /* binding power "levels" (see doc/compiler.rst) */ #define DUK__BP_INVALID 0 /* always terminates led() */ #define DUK__BP_EOF 2 #define DUK__BP_CLOSING 4 /* token closes expression, e.g. ')', ']' */ #define DUK__BP_FOR_EXPR DUK__BP_CLOSING /* bp to use when parsing a top level Expression */ #define DUK__BP_COMMA 6 #define DUK__BP_ASSIGNMENT 8 #define DUK__BP_CONDITIONAL 10 #define DUK__BP_LOR 12 #define DUK__BP_LAND 14 #define DUK__BP_BOR 16 #define DUK__BP_BXOR 18 #define DUK__BP_BAND 20 #define DUK__BP_EQUALITY 22 #define DUK__BP_RELATIONAL 24 #define DUK__BP_SHIFT 26 #define DUK__BP_ADDITIVE 28 #define DUK__BP_MULTIPLICATIVE 30 #define DUK__BP_EXPONENTIATION 32 #define DUK__BP_POSTFIX 34 #define DUK__BP_CALL 36 #define DUK__BP_MEMBER 38 #define DUK__TOKEN_LBP_BP_MASK 0x1f #define DUK__TOKEN_LBP_FLAG_NO_REGEXP (1 << 5) /* regexp literal must not follow this token */ #define DUK__TOKEN_LBP_FLAG_TERMINATES (1 << 6) /* terminates expression; e.g. post-increment/-decrement */ #define DUK__TOKEN_LBP_FLAG_UNUSED (1 << 7) /* unused */ #define DUK__TOKEN_LBP_GET_BP(x) ((duk_small_uint_t) (((x) & DUK__TOKEN_LBP_BP_MASK) * 2)) #define DUK__MK_LBP(bp) ((bp) >> 1) /* bp is assumed to be even */ #define DUK__MK_LBP_FLAGS(bp,flags) (((bp) >> 1) | (flags)) DUK_LOCAL const duk_uint8_t duk__token_lbp[] = { DUK__MK_LBP(DUK__BP_EOF), /* DUK_TOK_EOF */ DUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_IDENTIFIER */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_BREAK */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_CASE */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_CATCH */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_CONTINUE */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_DEBUGGER */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_DEFAULT */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_DELETE */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_DO */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_ELSE */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_FINALLY */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_FOR */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_FUNCTION */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_IF */ DUK__MK_LBP(DUK__BP_RELATIONAL), /* DUK_TOK_IN */ DUK__MK_LBP(DUK__BP_RELATIONAL), /* DUK_TOK_INSTANCEOF */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_NEW */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_RETURN */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_SWITCH */ DUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_THIS */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_THROW */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_TRY */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_TYPEOF */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_VAR */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_CONST */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_VOID */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_WHILE */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_WITH */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_CLASS */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_ENUM */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_EXPORT */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_EXTENDS */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_IMPORT */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_SUPER */ DUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_NULL */ DUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_TRUE */ DUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_FALSE */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_GET */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_SET */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_IMPLEMENTS */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_INTERFACE */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_LET */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_PACKAGE */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_PRIVATE */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_PROTECTED */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_PUBLIC */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_STATIC */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_YIELD */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_LCURLY */ DUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_RCURLY */ DUK__MK_LBP(DUK__BP_MEMBER), /* DUK_TOK_LBRACKET */ DUK__MK_LBP_FLAGS(DUK__BP_CLOSING, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_RBRACKET */ DUK__MK_LBP(DUK__BP_CALL), /* DUK_TOK_LPAREN */ DUK__MK_LBP_FLAGS(DUK__BP_CLOSING, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_RPAREN */ DUK__MK_LBP(DUK__BP_MEMBER), /* DUK_TOK_PERIOD */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_SEMICOLON */ DUK__MK_LBP(DUK__BP_COMMA), /* DUK_TOK_COMMA */ DUK__MK_LBP(DUK__BP_RELATIONAL), /* DUK_TOK_LT */ DUK__MK_LBP(DUK__BP_RELATIONAL), /* DUK_TOK_GT */ DUK__MK_LBP(DUK__BP_RELATIONAL), /* DUK_TOK_LE */ DUK__MK_LBP(DUK__BP_RELATIONAL), /* DUK_TOK_GE */ DUK__MK_LBP(DUK__BP_EQUALITY), /* DUK_TOK_EQ */ DUK__MK_LBP(DUK__BP_EQUALITY), /* DUK_TOK_NEQ */ DUK__MK_LBP(DUK__BP_EQUALITY), /* DUK_TOK_SEQ */ DUK__MK_LBP(DUK__BP_EQUALITY), /* DUK_TOK_SNEQ */ DUK__MK_LBP(DUK__BP_ADDITIVE), /* DUK_TOK_ADD */ DUK__MK_LBP(DUK__BP_ADDITIVE), /* DUK_TOK_SUB */ DUK__MK_LBP(DUK__BP_MULTIPLICATIVE), /* DUK_TOK_MUL */ DUK__MK_LBP(DUK__BP_MULTIPLICATIVE), /* DUK_TOK_DIV */ DUK__MK_LBP(DUK__BP_MULTIPLICATIVE), /* DUK_TOK_MOD */ DUK__MK_LBP(DUK__BP_EXPONENTIATION), /* DUK_TOK_EXP */ DUK__MK_LBP(DUK__BP_POSTFIX), /* DUK_TOK_INCREMENT */ DUK__MK_LBP(DUK__BP_POSTFIX), /* DUK_TOK_DECREMENT */ DUK__MK_LBP(DUK__BP_SHIFT), /* DUK_TOK_ALSHIFT */ DUK__MK_LBP(DUK__BP_SHIFT), /* DUK_TOK_ARSHIFT */ DUK__MK_LBP(DUK__BP_SHIFT), /* DUK_TOK_RSHIFT */ DUK__MK_LBP(DUK__BP_BAND), /* DUK_TOK_BAND */ DUK__MK_LBP(DUK__BP_BOR), /* DUK_TOK_BOR */ DUK__MK_LBP(DUK__BP_BXOR), /* DUK_TOK_BXOR */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_LNOT */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_BNOT */ DUK__MK_LBP(DUK__BP_LAND), /* DUK_TOK_LAND */ DUK__MK_LBP(DUK__BP_LOR), /* DUK_TOK_LOR */ DUK__MK_LBP(DUK__BP_CONDITIONAL), /* DUK_TOK_QUESTION */ DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_COLON */ DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_EQUALSIGN */ DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_ADD_EQ */ DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_SUB_EQ */ DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_MUL_EQ */ DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_DIV_EQ */ DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_MOD_EQ */ DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_EXP_EQ */ DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_ALSHIFT_EQ */ DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_ARSHIFT_EQ */ DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_RSHIFT_EQ */ DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_BAND_EQ */ DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_BOR_EQ */ DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_BXOR_EQ */ DUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_NUMBER */ DUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_STRING */ DUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_REGEXP */ }; /* * Misc helpers */ DUK_LOCAL void duk__comp_recursion_increase(duk_compiler_ctx *comp_ctx) { DUK_ASSERT(comp_ctx != NULL); DUK_ASSERT(comp_ctx->recursion_depth >= 0); if (comp_ctx->recursion_depth >= comp_ctx->recursion_limit) { DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_COMPILER_RECURSION_LIMIT); } comp_ctx->recursion_depth++; } DUK_LOCAL void duk__comp_recursion_decrease(duk_compiler_ctx *comp_ctx) { DUK_ASSERT(comp_ctx != NULL); DUK_ASSERT(comp_ctx->recursion_depth > 0); comp_ctx->recursion_depth--; } DUK_LOCAL duk_bool_t duk__hstring_is_eval_or_arguments(duk_compiler_ctx *comp_ctx, duk_hstring *h) { DUK_UNREF(comp_ctx); DUK_ASSERT(h != NULL); return DUK_HSTRING_HAS_EVAL_OR_ARGUMENTS(h); } DUK_LOCAL duk_bool_t duk__hstring_is_eval_or_arguments_in_strict_mode(duk_compiler_ctx *comp_ctx, duk_hstring *h) { DUK_ASSERT(h != NULL); return (comp_ctx->curr_func.is_strict && DUK_HSTRING_HAS_EVAL_OR_ARGUMENTS(h)); } /* * Parser duk__advance() token eating functions */ /* XXX: valstack handling is awkward. Add a valstack helper which * avoids dup():ing; valstack_copy(src, dst)? */ DUK_LOCAL void duk__advance_helper(duk_compiler_ctx *comp_ctx, duk_small_int_t expect) { duk_hthread *thr = comp_ctx->thr; duk_bool_t regexp; DUK_ASSERT_DISABLE(comp_ctx->curr_token.t >= 0); /* unsigned */ DUK_ASSERT(comp_ctx->curr_token.t <= DUK_TOK_MAXVAL); /* MAXVAL is inclusive */ /* * Use current token to decide whether a RegExp can follow. * * We can use either 't' or 't_nores'; the latter would not * recognize keywords. Some keywords can be followed by a * RegExp (e.g. "return"), so using 't' is better. This is * not trivial, see doc/compiler.rst. */ regexp = 1; if (duk__token_lbp[comp_ctx->curr_token.t] & DUK__TOKEN_LBP_FLAG_NO_REGEXP) { regexp = 0; } if (comp_ctx->curr_func.reject_regexp_in_adv) { comp_ctx->curr_func.reject_regexp_in_adv = 0; regexp = 0; } if (expect >= 0 && comp_ctx->curr_token.t != (duk_small_uint_t) expect) { DUK_D(DUK_DPRINT("parse error: expect=%ld, got=%ld", (long) expect, (long) comp_ctx->curr_token.t)); DUK_ERROR_SYNTAX(thr, DUK_STR_PARSE_ERROR); } /* make current token the previous; need to fiddle with valstack "backing store" */ DUK_MEMCPY(&comp_ctx->prev_token, &comp_ctx->curr_token, sizeof(duk_token)); duk_copy(thr, comp_ctx->tok11_idx, comp_ctx->tok21_idx); duk_copy(thr, comp_ctx->tok12_idx, comp_ctx->tok22_idx); /* parse new token */ duk_lexer_parse_js_input_element(&comp_ctx->lex, &comp_ctx->curr_token, comp_ctx->curr_func.is_strict, regexp); DUK_DDD(DUK_DDDPRINT("advance: curr: tok=%ld/%ld,%ld,term=%ld,%!T,%!T " "prev: tok=%ld/%ld,%ld,term=%ld,%!T,%!T", (long) comp_ctx->curr_token.t, (long) comp_ctx->curr_token.t_nores, (long) comp_ctx->curr_token.start_line, (long) comp_ctx->curr_token.lineterm, (duk_tval *) duk_get_tval(thr, comp_ctx->tok11_idx), (duk_tval *) duk_get_tval(thr, comp_ctx->tok12_idx), (long) comp_ctx->prev_token.t, (long) comp_ctx->prev_token.t_nores, (long) comp_ctx->prev_token.start_line, (long) comp_ctx->prev_token.lineterm, (duk_tval *) duk_get_tval(thr, comp_ctx->tok21_idx), (duk_tval *) duk_get_tval(thr, comp_ctx->tok22_idx))); } /* advance, expecting current token to be a specific token; parse next token in regexp context */ DUK_LOCAL void duk__advance_expect(duk_compiler_ctx *comp_ctx, duk_small_int_t expect) { duk__advance_helper(comp_ctx, expect); } /* advance, whatever the current token is; parse next token in regexp context */ DUK_LOCAL void duk__advance(duk_compiler_ctx *comp_ctx) { duk__advance_helper(comp_ctx, -1); } /* * Helpers for duk_compiler_func. */ /* init function state: inits valstack allocations */ DUK_LOCAL void duk__init_func_valstack_slots(duk_compiler_ctx *comp_ctx) { duk_compiler_func *func = &comp_ctx->curr_func; duk_hthread *thr = comp_ctx->thr; duk_idx_t entry_top; entry_top = duk_get_top(thr); DUK_MEMZERO(func, sizeof(*func)); /* intentional overlap with earlier memzero */ #if defined(DUK_USE_EXPLICIT_NULL_INIT) func->h_name = NULL; func->h_consts = NULL; func->h_funcs = NULL; func->h_decls = NULL; func->h_labelnames = NULL; func->h_labelinfos = NULL; func->h_argnames = NULL; func->h_varmap = NULL; #endif duk_require_stack(thr, DUK__FUNCTION_INIT_REQUIRE_SLOTS); DUK_BW_INIT_PUSHBUF(thr, &func->bw_code, DUK__BC_INITIAL_INSTS * sizeof(duk_compiler_instr)); /* code_idx = entry_top + 0 */ duk_push_array(thr); func->consts_idx = entry_top + 1; func->h_consts = DUK_GET_HOBJECT_POSIDX(thr, entry_top + 1); DUK_ASSERT(func->h_consts != NULL); duk_push_array(thr); func->funcs_idx = entry_top + 2; func->h_funcs = DUK_GET_HOBJECT_POSIDX(thr, entry_top + 2); DUK_ASSERT(func->h_funcs != NULL); DUK_ASSERT(func->fnum_next == 0); duk_push_array(thr); func->decls_idx = entry_top + 3; func->h_decls = DUK_GET_HOBJECT_POSIDX(thr, entry_top + 3); DUK_ASSERT(func->h_decls != NULL); duk_push_array(thr); func->labelnames_idx = entry_top + 4; func->h_labelnames = DUK_GET_HOBJECT_POSIDX(thr, entry_top + 4); DUK_ASSERT(func->h_labelnames != NULL); duk_push_dynamic_buffer(thr, 0); func->labelinfos_idx = entry_top + 5; func->h_labelinfos = (duk_hbuffer_dynamic *) duk_known_hbuffer(thr, entry_top + 5); DUK_ASSERT(func->h_labelinfos != NULL); DUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(func->h_labelinfos) && !DUK_HBUFFER_HAS_EXTERNAL(func->h_labelinfos)); duk_push_array(thr); func->argnames_idx = entry_top + 6; func->h_argnames = DUK_GET_HOBJECT_POSIDX(thr, entry_top + 6); DUK_ASSERT(func->h_argnames != NULL); duk_push_bare_object(thr); func->varmap_idx = entry_top + 7; func->h_varmap = DUK_GET_HOBJECT_POSIDX(thr, entry_top + 7); DUK_ASSERT(func->h_varmap != NULL); } /* reset function state (prepare for pass 2) */ DUK_LOCAL void duk__reset_func_for_pass2(duk_compiler_ctx *comp_ctx) { duk_compiler_func *func = &comp_ctx->curr_func; duk_hthread *thr = comp_ctx->thr; /* reset bytecode buffer but keep current size; pass 2 will * require same amount or more. */ DUK_BW_RESET_SIZE(thr, &func->bw_code); duk_set_length(thr, func->consts_idx, 0); /* keep func->h_funcs; inner functions are not reparsed to avoid O(depth^2) parsing */ func->fnum_next = 0; /* duk_set_length(thr, func->funcs_idx, 0); */ duk_set_length(thr, func->labelnames_idx, 0); duk_hbuffer_reset(thr, func->h_labelinfos); /* keep func->h_argnames; it is fixed for all passes */ /* truncated in case pass 3 needed */ duk_push_bare_object(thr); duk_replace(thr, func->varmap_idx); func->h_varmap = DUK_GET_HOBJECT_POSIDX(thr, func->varmap_idx); DUK_ASSERT(func->h_varmap != NULL); } /* cleanup varmap from any null entries, compact it, etc; returns number * of final entries after cleanup. */ DUK_LOCAL duk_int_t duk__cleanup_varmap(duk_compiler_ctx *comp_ctx) { duk_hthread *thr = comp_ctx->thr; duk_hobject *h_varmap; duk_hstring *h_key; duk_tval *tv; duk_uint32_t i, e_next; duk_int_t ret; /* [ ... varmap ] */ h_varmap = DUK_GET_HOBJECT_NEGIDX(thr, -1); DUK_ASSERT(h_varmap != NULL); ret = 0; e_next = DUK_HOBJECT_GET_ENEXT(h_varmap); for (i = 0; i < e_next; i++) { h_key = DUK_HOBJECT_E_GET_KEY(thr->heap, h_varmap, i); if (!h_key) { continue; } DUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, h_varmap, i)); /* The entries can either be register numbers or 'null' values. * Thus, no need to DECREF them and get side effects. DECREF'ing * the keys (strings) can cause memory to be freed but no side * effects as strings don't have finalizers. This is why we can * rely on the object properties not changing from underneath us. */ tv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, h_varmap, i); if (!DUK_TVAL_IS_NUMBER(tv)) { DUK_ASSERT(!DUK_TVAL_IS_HEAP_ALLOCATED(tv)); DUK_HOBJECT_E_SET_KEY(thr->heap, h_varmap, i, NULL); DUK_HSTRING_DECREF(thr, h_key); /* when key is NULL, value is garbage so no need to set */ } else { ret++; } } duk_compact_m1(thr); return ret; } /* Convert duk_compiler_func into a function template, leaving the result * on top of stack. */ /* XXX: awkward and bloated asm -- use faster internal accesses */ DUK_LOCAL void duk__convert_to_func_template(duk_compiler_ctx *comp_ctx) { duk_compiler_func *func = &comp_ctx->curr_func; duk_hthread *thr = comp_ctx->thr; duk_hcompfunc *h_res; duk_hbuffer_fixed *h_data; duk_size_t consts_count; duk_size_t funcs_count; duk_size_t code_count; duk_size_t code_size; duk_size_t data_size; duk_size_t i; duk_tval *p_const; duk_hobject **p_func; duk_instr_t *p_instr; duk_compiler_instr *q_instr; duk_tval *tv; duk_bool_t keep_varmap; duk_bool_t keep_formals; #if !defined(DUK_USE_DEBUGGER_SUPPORT) duk_size_t formals_length; #endif DUK_DDD(DUK_DDDPRINT("converting duk_compiler_func to function/template")); /* * Push result object and init its flags */ /* Valstack should suffice here, required on function valstack init */ h_res = duk_push_hcompfunc(thr); DUK_ASSERT(h_res != NULL); DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) h_res) == thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]); DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, (duk_hobject *) h_res, NULL); /* Function templates are "bare objects". */ if (func->is_function) { DUK_DDD(DUK_DDDPRINT("function -> set NEWENV")); DUK_HOBJECT_SET_NEWENV((duk_hobject *) h_res); if (!func->is_arguments_shadowed) { /* arguments object would be accessible; note that shadowing * bindings are arguments or function declarations, neither * of which are deletable, so this is safe. */ if (func->id_access_arguments || func->may_direct_eval) { DUK_DDD(DUK_DDDPRINT("function may access 'arguments' object directly or " "indirectly -> set CREATEARGS")); DUK_HOBJECT_SET_CREATEARGS((duk_hobject *) h_res); } } } else if (func->is_eval && func->is_strict) { DUK_DDD(DUK_DDDPRINT("strict eval code -> set NEWENV")); DUK_HOBJECT_SET_NEWENV((duk_hobject *) h_res); } else { /* non-strict eval: env is caller's env or global env (direct vs. indirect call) * global code: env is is global env */ DUK_DDD(DUK_DDDPRINT("non-strict eval code or global code -> no NEWENV")); DUK_ASSERT(!DUK_HOBJECT_HAS_NEWENV((duk_hobject *) h_res)); } #if defined(DUK_USE_FUNC_NAME_PROPERTY) if (func->is_function && func->is_namebinding && func->h_name != NULL) { /* Object literal set/get functions have a name (property * name) but must not have a lexical name binding, see * test-bug-getset-func-name.js. */ DUK_DDD(DUK_DDDPRINT("function expression with a name -> set NAMEBINDING")); DUK_HOBJECT_SET_NAMEBINDING((duk_hobject *) h_res); } #endif if (func->is_strict) { DUK_DDD(DUK_DDDPRINT("function is strict -> set STRICT")); DUK_HOBJECT_SET_STRICT((duk_hobject *) h_res); } if (func->is_notail) { DUK_DDD(DUK_DDDPRINT("function is notail -> set NOTAIL")); DUK_HOBJECT_SET_NOTAIL((duk_hobject *) h_res); } if (func->is_constructable) { DUK_DDD(DUK_DDDPRINT("function is constructable -> set CONSTRUCTABLE")); DUK_HOBJECT_SET_CONSTRUCTABLE((duk_hobject *) h_res); } /* * Build function fixed size 'data' buffer, which contains bytecode, * constants, and inner function references. * * During the building phase 'data' is reachable but incomplete. * Only incref's occur during building (no refzero or GC happens), * so the building process is atomic. */ consts_count = duk_hobject_get_length(thr, func->h_consts); funcs_count = duk_hobject_get_length(thr, func->h_funcs) / 3; code_count = DUK_BW_GET_SIZE(thr, &func->bw_code) / sizeof(duk_compiler_instr); code_size = code_count * sizeof(duk_instr_t); data_size = consts_count * sizeof(duk_tval) + funcs_count * sizeof(duk_hobject *) + code_size; DUK_DDD(DUK_DDDPRINT("consts_count=%ld, funcs_count=%ld, code_size=%ld -> " "data_size=%ld*%ld + %ld*%ld + %ld = %ld", (long) consts_count, (long) funcs_count, (long) code_size, (long) consts_count, (long) sizeof(duk_tval), (long) funcs_count, (long) sizeof(duk_hobject *), (long) code_size, (long) data_size)); duk_push_fixed_buffer_nozero(thr, data_size); h_data = (duk_hbuffer_fixed *) duk_known_hbuffer(thr, -1); DUK_HCOMPFUNC_SET_DATA(thr->heap, h_res, (duk_hbuffer *) h_data); DUK_HEAPHDR_INCREF(thr, h_data); p_const = (duk_tval *) (void *) DUK_HBUFFER_FIXED_GET_DATA_PTR(thr->heap, h_data); for (i = 0; i < consts_count; i++) { DUK_ASSERT(i <= DUK_UARRIDX_MAX); /* const limits */ tv = duk_hobject_find_existing_array_entry_tval_ptr(thr->heap, func->h_consts, (duk_uarridx_t) i); DUK_ASSERT(tv != NULL); DUK_TVAL_SET_TVAL(p_const, tv); p_const++; DUK_TVAL_INCREF(thr, tv); /* may be a string constant */ DUK_DDD(DUK_DDDPRINT("constant: %!T", (duk_tval *) tv)); } p_func = (duk_hobject **) p_const; DUK_HCOMPFUNC_SET_FUNCS(thr->heap, h_res, p_func); for (i = 0; i < funcs_count; i++) { duk_hobject *h; DUK_ASSERT(i * 3 <= DUK_UARRIDX_MAX); /* func limits */ tv = duk_hobject_find_existing_array_entry_tval_ptr(thr->heap, func->h_funcs, (duk_uarridx_t) (i * 3)); DUK_ASSERT(tv != NULL); DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv)); h = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(h != NULL); DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(h)); *p_func++ = h; DUK_HOBJECT_INCREF(thr, h); DUK_DDD(DUK_DDDPRINT("inner function: %p -> %!iO", (void *) h, (duk_heaphdr *) h)); } p_instr = (duk_instr_t *) p_func; DUK_HCOMPFUNC_SET_BYTECODE(thr->heap, h_res, p_instr); /* copy bytecode instructions one at a time */ q_instr = (duk_compiler_instr *) (void *) DUK_BW_GET_BASEPTR(thr, &func->bw_code); for (i = 0; i < code_count; i++) { p_instr[i] = q_instr[i].ins; } /* Note: 'q_instr' is still used below */ DUK_ASSERT((duk_uint8_t *) (p_instr + code_count) == DUK_HBUFFER_FIXED_GET_DATA_PTR(thr->heap, h_data) + data_size); duk_pop(thr); /* 'data' (and everything in it) is reachable through h_res now */ /* * Init non-property result fields * * 'nregs' controls how large a register frame is allocated. * * 'nargs' controls how many formal arguments are written to registers: * r0, ... r(nargs-1). The remaining registers are initialized to * undefined. */ DUK_ASSERT(func->temp_max >= 0); h_res->nregs = (duk_uint16_t) func->temp_max; h_res->nargs = (duk_uint16_t) duk_hobject_get_length(thr, func->h_argnames); DUK_ASSERT(h_res->nregs >= h_res->nargs); /* pass2 allocation handles this */ #if defined(DUK_USE_DEBUGGER_SUPPORT) h_res->start_line = (duk_uint32_t) func->min_line; h_res->end_line = (duk_uint32_t) func->max_line; #endif /* * Init object properties * * Properties should be added in decreasing order of access frequency. * (Not very critical for function templates.) */ DUK_DDD(DUK_DDDPRINT("init function properties")); /* [ ... res ] */ /* _Varmap: omitted if function is guaranteed not to do a slow path * identifier access that might be caught by locally declared variables. * The varmap can also be omitted if it turns out empty of actual * register mappings after a cleanup. When debugging is enabled, we * always need the varmap to be able to lookup variables at any point. */ #if defined(DUK_USE_DEBUGGER_SUPPORT) DUK_DD(DUK_DDPRINT("keeping _Varmap because debugger support is enabled")); keep_varmap = 1; #else if (func->id_access_slow_own || /* directly uses slow accesses that may match own variables */ func->id_access_arguments || /* accesses 'arguments' directly */ func->may_direct_eval || /* may indirectly slow access through a direct eval */ funcs_count > 0) { /* has inner functions which may slow access (XXX: this can be optimized by looking at the inner functions) */ DUK_DD(DUK_DDPRINT("keeping _Varmap because of direct eval, slow path access that may match local variables, or presence of inner functions")); keep_varmap = 1; } else { DUK_DD(DUK_DDPRINT("dropping _Varmap")); keep_varmap = 0; } #endif if (keep_varmap) { duk_int_t num_used; duk_dup(thr, func->varmap_idx); num_used = duk__cleanup_varmap(comp_ctx); DUK_DDD(DUK_DDDPRINT("cleaned up varmap: %!T (num_used=%ld)", (duk_tval *) duk_get_tval(thr, -1), (long) num_used)); if (num_used > 0) { duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VARMAP, DUK_PROPDESC_FLAGS_NONE); } else { DUK_DD(DUK_DDPRINT("varmap is empty after cleanup -> no need to add")); duk_pop(thr); } } /* _Formals: omitted if function is guaranteed not to need a (non-strict) * arguments object, and _Formals.length matches nargs exactly. * * Non-arrow functions can't see an outer function's 'argument' binding * (because they have their own), but arrow functions can. When arrow * functions are added, this condition would need to be added: * inner_arrow_funcs_count > 0 inner arrow functions may access 'arguments' */ #if defined(DUK_USE_DEBUGGER_SUPPORT) DUK_DD(DUK_DDPRINT("keeping _Formals because debugger support is enabled")); keep_formals = 1; #else formals_length = duk_get_length(thr, func->argnames_idx); if (formals_length != (duk_size_t) h_res->nargs) { /* Nargs not enough for closure .length: keep _Formals regardless * of its length. Shouldn't happen in practice at the moment. */ DUK_DD(DUK_DDPRINT("keeping _Formals because _Formals.length != nargs")); keep_formals = 1; } else if ((func->id_access_arguments || func->may_direct_eval) && (formals_length > 0)) { /* Direct eval (may access 'arguments') or accesses 'arguments' * explicitly: keep _Formals unless it is zero length. */ DUK_DD(DUK_DDPRINT("keeping _Formals because of direct eval or explicit access to 'arguments', and _Formals.length != 0")); keep_formals = 1; } else { DUK_DD(DUK_DDPRINT("omitting _Formals, nargs matches _Formals.length, so no properties added")); keep_formals = 0; } #endif if (keep_formals) { duk_dup(thr, func->argnames_idx); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_FORMALS, DUK_PROPDESC_FLAGS_NONE); } /* name */ #if defined(DUK_USE_FUNC_NAME_PROPERTY) if (func->h_name) { duk_push_hstring(thr, func->h_name); DUK_DD(DUK_DDPRINT("setting function template .name to %!T", duk_get_tval(thr, -1))); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_NONE); } #endif /* DUK_USE_FUNC_NAME_PROPERTY */ /* _Source */ #if defined(DUK_USE_NONSTD_FUNC_SOURCE_PROPERTY) if (0) { /* XXX: Currently function source code is not stored, as it is not * required by the standard. Source code should not be stored by * default (user should enable it explicitly), and the source should * probably be compressed with a trivial text compressor; average * compression of 20-30% is quite easy to achieve even with a trivial * compressor (RLE + backwards lookup). * * Debugging needs source code to be useful: sometimes input code is * not found in files as it may be generated and then eval()'d, given * by dynamic C code, etc. * * Other issues: * * - Need tokenizer indices for start and end to substring * - Always normalize function declaration part? * - If we keep _Formals, only need to store body */ /* * For global or eval code this is straightforward. For functions * created with the Function constructor we only get the source for * the body and must manufacture the "function ..." part. * * For instance, for constructed functions (v8): * * > a = new Function("foo", "bar", "print(foo)"); * [Function] * > a.toString() * 'function anonymous(foo,bar) {\nprint(foo)\n}' * * Similarly for e.g. getters (v8): * * > x = { get a(foo,bar) { print(foo); } } * { a: [Getter] } * > Object.getOwnPropertyDescriptor(x, 'a').get.toString() * 'function a(foo,bar) { print(foo); }' */ #if 0 duk_push_string(thr, "XXX"); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_SOURCE, DUK_PROPDESC_FLAGS_NONE); #endif } #endif /* DUK_USE_NONSTD_FUNC_SOURCE_PROPERTY */ /* _Pc2line */ #if defined(DUK_USE_PC2LINE) if (1) { /* * Size-optimized pc->line mapping. */ DUK_ASSERT(code_count <= DUK_COMPILER_MAX_BYTECODE_LENGTH); duk_hobject_pc2line_pack(thr, q_instr, (duk_uint_fast32_t) code_count); /* -> pushes fixed buffer */ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_PC2LINE, DUK_PROPDESC_FLAGS_NONE); /* XXX: if assertions enabled, walk through all valid PCs * and check line mapping. */ } #endif /* DUK_USE_PC2LINE */ /* fileName */ #if defined(DUK_USE_FUNC_FILENAME_PROPERTY) if (comp_ctx->h_filename) { /* * Source filename (or equivalent), for identifying thrown errors. */ duk_push_hstring(thr, comp_ctx->h_filename); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_FILE_NAME, DUK_PROPDESC_FLAGS_NONE); } #endif DUK_DD(DUK_DDPRINT("converted function: %!ixT", (duk_tval *) duk_get_tval(thr, -1))); /* * Compact the function template. */ duk_compact_m1(thr); /* * Debug dumping */ #if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) { duk_hcompfunc *h; duk_instr_t *p, *p_start, *p_end; h = (duk_hcompfunc *) duk_get_hobject(thr, -1); p_start = (duk_instr_t *) DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, h); p_end = (duk_instr_t *) DUK_HCOMPFUNC_GET_CODE_END(thr->heap, h); p = p_start; while (p < p_end) { DUK_DDD(DUK_DDDPRINT("BC %04ld: %!I ; 0x%08lx op=%ld (%!C) a=%ld b=%ld c=%ld", (long) (p - p_start), (duk_instr_t) (*p), (unsigned long) (*p), (long) DUK_DEC_OP(*p), (long) DUK_DEC_OP(*p), (long) DUK_DEC_A(*p), (long) DUK_DEC_B(*p), (long) DUK_DEC_C(*p))); p++; } } #endif } /* * Code emission helpers * * Some emission helpers understand the range of target and source reg/const * values and automatically emit shuffling code if necessary. This is the * case when the slot in question (A, B, C) is used in the standard way and * for opcodes the emission helpers explicitly understand (like DUK_OP_MPUTOBJ). * * The standard way is that: * - slot A is a target register * - slot B is a source register/constant * - slot C is a source register/constant * * If a slot is used in a non-standard way the caller must indicate this * somehow. If a slot is used as a target instead of a source (or vice * versa), this can be indicated with a flag to trigger proper shuffling * (e.g. DUK__EMIT_FLAG_B_IS_TARGET). If the value in the slot is not * register/const related at all, the caller must ensure that the raw value * fits into the corresponding slot so as to not trigger shuffling. The * caller must set a "no shuffle" flag to ensure compilation fails if * shuffling were to be triggered because of an internal error. * * For slots B and C the raw slot size is 9 bits but one bit is reserved for * the reg/const indicator. To use the full 9-bit range for a raw value, * shuffling must be disabled with the DUK__EMIT_FLAG_NO_SHUFFLE_{B,C} flag. * Shuffling is only done for A, B, and C slots, not the larger BC or ABC slots. * * There is call handling specific understanding in the A-B-C emitter to * convert call setup and call instructions into indirect ones if necessary. */ /* Code emission flags, passed in the 'opcode' field. Opcode + flags * fit into 16 bits for now, so use duk_small_uint_t. */ #define DUK__EMIT_FLAG_NO_SHUFFLE_A (1 << 8) #define DUK__EMIT_FLAG_NO_SHUFFLE_B (1 << 9) #define DUK__EMIT_FLAG_NO_SHUFFLE_C (1 << 10) #define DUK__EMIT_FLAG_A_IS_SOURCE (1 << 11) /* slot A is a source (default: target) */ #define DUK__EMIT_FLAG_B_IS_TARGET (1 << 12) /* slot B is a target (default: source) */ #define DUK__EMIT_FLAG_C_IS_TARGET (1 << 13) /* slot C is a target (default: source) */ #define DUK__EMIT_FLAG_BC_REGCONST (1 << 14) /* slots B and C are reg/const */ #define DUK__EMIT_FLAG_RESERVE_JUMPSLOT (1 << 15) /* reserve a jumpslot after instr before target spilling, used for NEXTENUM */ /* XXX: macro smaller than call? */ DUK_LOCAL duk_int_t duk__get_current_pc(duk_compiler_ctx *comp_ctx) { duk_compiler_func *func; func = &comp_ctx->curr_func; return (duk_int_t) (DUK_BW_GET_SIZE(comp_ctx->thr, &func->bw_code) / sizeof(duk_compiler_instr)); } DUK_LOCAL duk_compiler_instr *duk__get_instr_ptr(duk_compiler_ctx *comp_ctx, duk_int_t pc) { DUK_ASSERT(pc >= 0); DUK_ASSERT((duk_size_t) pc < (duk_size_t) (DUK_BW_GET_SIZE(comp_ctx->thr, &comp_ctx->curr_func.bw_code) / sizeof(duk_compiler_instr))); return ((duk_compiler_instr *) (void *) DUK_BW_GET_BASEPTR(comp_ctx->thr, &comp_ctx->curr_func.bw_code)) + pc; } /* emit instruction; could return PC but that's not needed in the majority * of cases. */ DUK_LOCAL void duk__emit(duk_compiler_ctx *comp_ctx, duk_instr_t ins) { #if defined(DUK_USE_PC2LINE) duk_int_t line; #endif duk_compiler_instr *instr; DUK_DDD(DUK_DDDPRINT("duk__emit: 0x%08lx curr_token.start_line=%ld prev_token.start_line=%ld pc=%ld --> %!I", (unsigned long) ins, (long) comp_ctx->curr_token.start_line, (long) comp_ctx->prev_token.start_line, (long) duk__get_current_pc(comp_ctx), (duk_instr_t) ins)); instr = (duk_compiler_instr *) (void *) DUK_BW_ENSURE_GETPTR(comp_ctx->thr, &comp_ctx->curr_func.bw_code, sizeof(duk_compiler_instr)); DUK_BW_ADD_PTR(comp_ctx->thr, &comp_ctx->curr_func.bw_code, sizeof(duk_compiler_instr)); #if defined(DUK_USE_PC2LINE) /* The line number tracking is a bit inconsistent right now, which * affects debugger accuracy. Mostly call sites emit opcodes when * they have parsed a token (say a terminating semicolon) and called * duk__advance(). In this case the line number of the previous * token is the most accurate one (except in prologue where * prev_token.start_line is 0). This is probably not 100% correct * right now. */ /* approximation, close enough */ line = comp_ctx->prev_token.start_line; if (line == 0) { line = comp_ctx->curr_token.start_line; } #endif instr->ins = ins; #if defined(DUK_USE_PC2LINE) instr->line = (duk_uint32_t) line; #endif #if defined(DUK_USE_DEBUGGER_SUPPORT) if (line < comp_ctx->curr_func.min_line) { comp_ctx->curr_func.min_line = line; } if (line > comp_ctx->curr_func.max_line) { comp_ctx->curr_func.max_line = line; } #endif /* Limit checks for bytecode byte size and line number. */ if (DUK_UNLIKELY(DUK_BW_GET_SIZE(comp_ctx->thr, &comp_ctx->curr_func.bw_code) > DUK_USE_ESBC_MAX_BYTES)) { goto fail_bc_limit; } #if defined(DUK_USE_PC2LINE) && defined(DUK_USE_ESBC_LIMITS) #if defined(DUK_USE_BUFLEN16) /* Buffer length is bounded to 0xffff automatically, avoid compile warning. */ if (DUK_UNLIKELY(line > DUK_USE_ESBC_MAX_LINENUMBER)) { goto fail_bc_limit; } #else if (DUK_UNLIKELY(line > DUK_USE_ESBC_MAX_LINENUMBER)) { goto fail_bc_limit; } #endif #endif return; fail_bc_limit: DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_BYTECODE_LIMIT); } /* Update function min/max line from current token. Needed to improve * function line range information for debugging, so that e.g. opening * curly brace is covered by line range even when no opcodes are emitted * for the line containing the brace. */ DUK_LOCAL void duk__update_lineinfo_currtoken(duk_compiler_ctx *comp_ctx) { #if defined(DUK_USE_DEBUGGER_SUPPORT) duk_int_t line; line = comp_ctx->curr_token.start_line; if (line == 0) { return; } if (line < comp_ctx->curr_func.min_line) { comp_ctx->curr_func.min_line = line; } if (line > comp_ctx->curr_func.max_line) { comp_ctx->curr_func.max_line = line; } #else DUK_UNREF(comp_ctx); #endif } DUK_LOCAL void duk__emit_op_only(duk_compiler_ctx *comp_ctx, duk_small_uint_t op) { duk__emit(comp_ctx, DUK_ENC_OP_ABC(op, 0)); } /* Important main primitive. */ DUK_LOCAL void duk__emit_a_b_c(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t a, duk_regconst_t b, duk_regconst_t c) { duk_instr_t ins = 0; duk_int_t a_out = -1; duk_int_t b_out = -1; duk_int_t c_out = -1; duk_int_t tmp; duk_small_uint_t op = op_flags & 0xffU; DUK_DDD(DUK_DDDPRINT("emit: op_flags=%04lx, a=%ld, b=%ld, c=%ld", (unsigned long) op_flags, (long) a, (long) b, (long) c)); /* We could rely on max temp/const checks: if they don't exceed BC * limit, nothing here can either (just asserts would be enough). * Currently we check for the limits, which provides additional * protection against creating invalid bytecode due to compiler * bugs. */ DUK_ASSERT_DISABLE((op_flags & 0xff) >= DUK_BC_OP_MIN); /* unsigned */ DUK_ASSERT((op_flags & 0xff) <= DUK_BC_OP_MAX); DUK_ASSERT(DUK__ISREG(a)); DUK_ASSERT(b != -1); /* Not 'none'. */ DUK_ASSERT(c != -1); /* Not 'none'. */ /* Input shuffling happens before the actual operation, while output * shuffling happens afterwards. Output shuffling decisions are still * made at the same time to reduce branch clutter; output shuffle decisions * are recorded into X_out variables. */ /* Slot A: currently no support for reg/const. */ #if defined(DUK_USE_SHUFFLE_TORTURE) if (a <= DUK_BC_A_MAX && (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_A)) { #else if (a <= DUK_BC_A_MAX) { #endif ; } else if (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_A) { DUK_D(DUK_DPRINT("out of regs: 'a' (reg) needs shuffling but shuffle prohibited, a: %ld", (long) a)); goto error_outofregs; } else if (a <= DUK_BC_BC_MAX) { comp_ctx->curr_func.needs_shuffle = 1; tmp = comp_ctx->curr_func.shuffle1; if (op_flags & DUK__EMIT_FLAG_A_IS_SOURCE) { duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_LDREG, tmp, a)); } else { /* Output shuffle needed after main operation */ a_out = a; /* The DUK_OP_CSVAR output shuffle assumes shuffle registers are * consecutive. */ DUK_ASSERT((comp_ctx->curr_func.shuffle1 == 0 && comp_ctx->curr_func.shuffle2 == 0) || (comp_ctx->curr_func.shuffle2 == comp_ctx->curr_func.shuffle1 + 1)); if (op == DUK_OP_CSVAR) { /* For CSVAR the limit is one smaller because output shuffle * must be able to express 'a + 1' in BC. */ if (a + 1 > DUK_BC_BC_MAX) { goto error_outofregs; } } } a = tmp; } else { DUK_D(DUK_DPRINT("out of regs: 'a' (reg) needs shuffling but does not fit into BC, a: %ld", (long) a)); goto error_outofregs; } /* Slot B: reg/const support, mapped to bit 0 of opcode. */ if ((b & DUK__CONST_MARKER) != 0) { DUK_ASSERT((op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_B) == 0); DUK_ASSERT((op_flags & DUK__EMIT_FLAG_B_IS_TARGET) == 0); b = b & ~DUK__CONST_MARKER; #if defined(DUK_USE_SHUFFLE_TORTURE) if (0) { #else if (b <= 0xff) { #endif if (op_flags & DUK__EMIT_FLAG_BC_REGCONST) { /* Opcode follows B/C reg/const convention. */ DUK_ASSERT((op & 0x01) == 0); ins |= DUK_ENC_OP_A_B_C(0x01, 0, 0, 0); /* const flag for B */ } else { DUK_D(DUK_DPRINT("B is const, opcode is not B/C reg/const: %x", op_flags)); } } else if (b <= DUK_BC_BC_MAX) { comp_ctx->curr_func.needs_shuffle = 1; tmp = comp_ctx->curr_func.shuffle2; duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_LDCONST, tmp, b)); b = tmp; } else { DUK_D(DUK_DPRINT("out of regs: 'b' (const) needs shuffling but does not fit into BC, b: %ld", (long) b)); goto error_outofregs; } } else { #if defined(DUK_USE_SHUFFLE_TORTURE) if (b <= 0xff && (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_B)) { #else if (b <= 0xff) { #endif ; } else if (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_B) { if (b > DUK_BC_B_MAX) { /* Note: 0xff != DUK_BC_B_MAX */ DUK_D(DUK_DPRINT("out of regs: 'b' (reg) needs shuffling but shuffle prohibited, b: %ld", (long) b)); goto error_outofregs; } } else if (b <= DUK_BC_BC_MAX) { comp_ctx->curr_func.needs_shuffle = 1; tmp = comp_ctx->curr_func.shuffle2; if (op_flags & DUK__EMIT_FLAG_B_IS_TARGET) { /* Output shuffle needed after main operation */ b_out = b; } if (!(op_flags & DUK__EMIT_FLAG_B_IS_TARGET)) { if (op == DUK_OP_MPUTOBJ || op == DUK_OP_MPUTARR) { /* Special handling for MPUTOBJ/MPUTARR shuffling. * For each, slot B identifies the first register of a range * of registers, so normal shuffling won't work. Instead, * an indirect version of the opcode is used. */ DUK_ASSERT((op_flags & DUK__EMIT_FLAG_B_IS_TARGET) == 0); duk__emit_load_int32_noshuffle(comp_ctx, tmp, b); DUK_ASSERT(DUK_OP_MPUTOBJI == DUK_OP_MPUTOBJ + 1); DUK_ASSERT(DUK_OP_MPUTARRI == DUK_OP_MPUTARR + 1); op_flags++; /* indirect opcode follows direct */ } else { duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_LDREG, tmp, b)); } } b = tmp; } else { DUK_D(DUK_DPRINT("out of regs: 'b' (reg) needs shuffling but does not fit into BC, b: %ld", (long) b)); goto error_outofregs; } } /* Slot C: reg/const support, mapped to bit 1 of opcode. */ if ((c & DUK__CONST_MARKER) != 0) { DUK_ASSERT((op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_C) == 0); DUK_ASSERT((op_flags & DUK__EMIT_FLAG_C_IS_TARGET) == 0); c = c & ~DUK__CONST_MARKER; #if defined(DUK_USE_SHUFFLE_TORTURE) if (0) { #else if (c <= 0xff) { #endif if (op_flags & DUK__EMIT_FLAG_BC_REGCONST) { /* Opcode follows B/C reg/const convention. */ DUK_ASSERT((op & 0x02) == 0); ins |= DUK_ENC_OP_A_B_C(0x02, 0, 0, 0); /* const flag for C */ } else { DUK_D(DUK_DPRINT("C is const, opcode is not B/C reg/const: %x", op_flags)); } } else if (c <= DUK_BC_BC_MAX) { comp_ctx->curr_func.needs_shuffle = 1; tmp = comp_ctx->curr_func.shuffle3; duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_LDCONST, tmp, c)); c = tmp; } else { DUK_D(DUK_DPRINT("out of regs: 'c' (const) needs shuffling but does not fit into BC, c: %ld", (long) c)); goto error_outofregs; } } else { #if defined(DUK_USE_SHUFFLE_TORTURE) if (c <= 0xff && (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_C)) { #else if (c <= 0xff) { #endif ; } else if (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_C) { if (c > DUK_BC_C_MAX) { /* Note: 0xff != DUK_BC_C_MAX */ DUK_D(DUK_DPRINT("out of regs: 'c' (reg) needs shuffling but shuffle prohibited, c: %ld", (long) c)); goto error_outofregs; } } else if (c <= DUK_BC_BC_MAX) { comp_ctx->curr_func.needs_shuffle = 1; tmp = comp_ctx->curr_func.shuffle3; if (op_flags & DUK__EMIT_FLAG_C_IS_TARGET) { /* Output shuffle needed after main operation */ c_out = c; } else { duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_LDREG, tmp, c)); } c = tmp; } else { DUK_D(DUK_DPRINT("out of regs: 'c' (reg) needs shuffling but does not fit into BC, c: %ld", (long) c)); goto error_outofregs; } } /* Main operation */ DUK_ASSERT(a >= DUK_BC_A_MIN); DUK_ASSERT(a <= DUK_BC_A_MAX); DUK_ASSERT(b >= DUK_BC_B_MIN); DUK_ASSERT(b <= DUK_BC_B_MAX); DUK_ASSERT(c >= DUK_BC_C_MIN); DUK_ASSERT(c <= DUK_BC_C_MAX); ins |= DUK_ENC_OP_A_B_C(op_flags & 0xff, a, b, c); duk__emit(comp_ctx, ins); /* NEXTENUM needs a jump slot right after the main instruction. * When the JUMP is taken, output spilling is not needed so this * workaround is possible. The jump slot PC is exceptionally * plumbed through comp_ctx to minimize call sites. */ if (op_flags & DUK__EMIT_FLAG_RESERVE_JUMPSLOT) { comp_ctx->emit_jumpslot_pc = duk__get_current_pc(comp_ctx); duk__emit_abc(comp_ctx, DUK_OP_JUMP, 0); } /* Output shuffling: only one output register is realistically possible. * * (Zero would normally be an OK marker value: if the target register * was zero, it would never be shuffled. But with DUK_USE_SHUFFLE_TORTURE * this is no longer true, so use -1 as a marker instead.) */ if (a_out >= 0) { DUK_ASSERT(b_out < 0); DUK_ASSERT(c_out < 0); duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_STREG, a, a_out)); if (op == DUK_OP_CSVAR) { /* Special handling for CSVAR shuffling. The variable lookup * results in a <value, this binding> pair in successive * registers so use two shuffle registers and two output * loads. (In practice this is dead code because temp/const * limit is reached first.) */ duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_STREG, a + 1, a_out + 1)); } } else if (b_out >= 0) { DUK_ASSERT(a_out < 0); DUK_ASSERT(c_out < 0); duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_STREG, b, b_out)); } else if (c_out >= 0) { DUK_ASSERT(b_out < 0); DUK_ASSERT(c_out < 0); duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_STREG, c, c_out)); } return; error_outofregs: DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_REG_LIMIT); } /* For many of the helpers below it'd be technically correct to add * "no shuffle" flags for parameters passed in as zero. For example, * duk__emit_a_b() should call duk__emit_a_b_c() with C set to 0, and * DUK__EMIT_FLAG_NO_SHUFFLE_C added to op_flags. However, since the * C value is 0, it'll never get shuffled so adding the flag is just * unnecessary additional code. This is unfortunately not true for * "shuffle torture" mode which needs special handling. */ DUK_LOCAL void duk__emit_a_b(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t a, duk_regconst_t b) { #if defined(DUK_USE_SHUFFLE_TORTURE) op_flags |= DUK__EMIT_FLAG_NO_SHUFFLE_C; #endif duk__emit_a_b_c(comp_ctx, op_flags, a, b, 0); } DUK_LOCAL void duk__emit_b_c(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t b, duk_regconst_t c) { #if defined(DUK_USE_SHUFFLE_TORTURE) op_flags |= DUK__EMIT_FLAG_NO_SHUFFLE_A; #endif duk__emit_a_b_c(comp_ctx, op_flags, 0, b, c); } #if 0 /* unused */ DUK_LOCAL void duk__emit_a(duk_compiler_ctx *comp_ctx, int op_flags, int a) { #if defined(DUK_USE_SHUFFLE_TORTURE) op_flags |= DUK__EMIT_FLAG_NO_SHUFFLE_B | DUK__EMIT_FLAG_NO_SHUFFLE_C; #endif duk__emit_a_b_c(comp_ctx, op_flags, a, 0, 0); } #endif #if 0 /* unused */ DUK_LOCAL void duk__emit_b(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t b) { #if defined(DUK_USE_SHUFFLE_TORTURE) op_flags |= DUK__EMIT_FLAG_NO_SHUFFLE_A | DUK__EMIT_FLAG_NO_SHUFFLE_C; #endif duk__emit_a_b_c(comp_ctx, op_flags, 0, b, 0); } #endif DUK_LOCAL void duk__emit_a_bc(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t a, duk_regconst_t bc) { duk_instr_t ins; duk_int_t tmp; /* allow caller to give a const number with the DUK__CONST_MARKER */ DUK_ASSERT(bc != -1); /* Not 'none'. */ bc = bc & (~DUK__CONST_MARKER); DUK_ASSERT_DISABLE((op_flags & 0xff) >= DUK_BC_OP_MIN); /* unsigned */ DUK_ASSERT((op_flags & 0xff) <= DUK_BC_OP_MAX); DUK_ASSERT(bc >= DUK_BC_BC_MIN); DUK_ASSERT(bc <= DUK_BC_BC_MAX); DUK_ASSERT((bc & DUK__CONST_MARKER) == 0); if (bc <= DUK_BC_BC_MAX) { ; } else { /* No BC shuffling now. */ goto error_outofregs; } #if defined(DUK_USE_SHUFFLE_TORTURE) if (a <= DUK_BC_A_MAX && (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_A)) { #else if (a <= DUK_BC_A_MAX) { #endif ins = DUK_ENC_OP_A_BC(op_flags & 0xff, a, bc); duk__emit(comp_ctx, ins); } else if (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_A) { goto error_outofregs; } else if ((op_flags & 0xf0U) == DUK_OP_CALL0) { comp_ctx->curr_func.needs_shuffle = 1; tmp = comp_ctx->curr_func.shuffle1; duk__emit_load_int32_noshuffle(comp_ctx, tmp, a); op_flags |= DUK_BC_CALL_FLAG_INDIRECT; ins = DUK_ENC_OP_A_BC(op_flags & 0xff, tmp, bc); duk__emit(comp_ctx, ins); } else if (a <= DUK_BC_BC_MAX) { comp_ctx->curr_func.needs_shuffle = 1; tmp = comp_ctx->curr_func.shuffle1; ins = DUK_ENC_OP_A_BC(op_flags & 0xff, tmp, bc); if (op_flags & DUK__EMIT_FLAG_A_IS_SOURCE) { duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_LDREG, tmp, a)); duk__emit(comp_ctx, ins); } else { duk__emit(comp_ctx, ins); duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_STREG, tmp, a)); } } else { goto error_outofregs; } return; error_outofregs: DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_REG_LIMIT); } DUK_LOCAL void duk__emit_bc(duk_compiler_ctx *comp_ctx, duk_small_uint_t op, duk_regconst_t bc) { #if defined(DUK_USE_SHUFFLE_TORTURE) op |= DUK__EMIT_FLAG_NO_SHUFFLE_A; #endif duk__emit_a_bc(comp_ctx, op, 0, bc); } DUK_LOCAL void duk__emit_abc(duk_compiler_ctx *comp_ctx, duk_small_uint_t op, duk_regconst_t abc) { duk_instr_t ins; DUK_ASSERT_DISABLE(op >= DUK_BC_OP_MIN); /* unsigned */ DUK_ASSERT(op <= DUK_BC_OP_MAX); DUK_ASSERT_DISABLE(abc >= DUK_BC_ABC_MIN); /* unsigned */ DUK_ASSERT(abc <= DUK_BC_ABC_MAX); DUK_ASSERT((abc & DUK__CONST_MARKER) == 0); DUK_ASSERT(abc != -1); /* Not 'none'. */ if (abc <= DUK_BC_ABC_MAX) { ; } else { goto error_outofregs; } ins = DUK_ENC_OP_ABC(op, abc); DUK_DDD(DUK_DDDPRINT("duk__emit_abc: 0x%08lx line=%ld pc=%ld op=%ld (%!C) abc=%ld (%!I)", (unsigned long) ins, (long) comp_ctx->curr_token.start_line, (long) duk__get_current_pc(comp_ctx), (long) op, (long) op, (long) abc, (duk_instr_t) ins)); duk__emit(comp_ctx, ins); return; error_outofregs: DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_REG_LIMIT); } DUK_LOCAL void duk__emit_load_int32_raw(duk_compiler_ctx *comp_ctx, duk_regconst_t reg, duk_int32_t val, duk_small_uint_t op_flags) { /* XXX: Shuffling support could be implemented here so that LDINT+LDINTX * would only shuffle once (instead of twice). The current code works * though, and has a smaller compiler footprint. */ if ((val >= (duk_int32_t) DUK_BC_BC_MIN - (duk_int32_t) DUK_BC_LDINT_BIAS) && (val <= (duk_int32_t) DUK_BC_BC_MAX - (duk_int32_t) DUK_BC_LDINT_BIAS)) { DUK_DDD(DUK_DDDPRINT("emit LDINT to reg %ld for %ld", (long) reg, (long) val)); duk__emit_a_bc(comp_ctx, DUK_OP_LDINT | op_flags, reg, (duk_regconst_t) (val + (duk_int32_t) DUK_BC_LDINT_BIAS)); } else { duk_int32_t hi = val >> DUK_BC_LDINTX_SHIFT; duk_int32_t lo = val & ((((duk_int32_t) 1) << DUK_BC_LDINTX_SHIFT) - 1); DUK_ASSERT(lo >= 0); DUK_DDD(DUK_DDDPRINT("emit LDINT+LDINTX to reg %ld for %ld -> hi %ld, lo %ld", (long) reg, (long) val, (long) hi, (long) lo)); duk__emit_a_bc(comp_ctx, DUK_OP_LDINT | op_flags, reg, (duk_regconst_t) (hi + (duk_int32_t) DUK_BC_LDINT_BIAS)); duk__emit_a_bc(comp_ctx, DUK_OP_LDINTX | op_flags, reg, (duk_regconst_t) lo); } } DUK_LOCAL void duk__emit_load_int32(duk_compiler_ctx *comp_ctx, duk_regconst_t reg, duk_int32_t val) { duk__emit_load_int32_raw(comp_ctx, reg, val, 0 /*op_flags*/); } #if defined(DUK_USE_SHUFFLE_TORTURE) /* Used by duk__emit*() calls so that we don't shuffle the loadints that * are needed to handle indirect opcodes. */ DUK_LOCAL void duk__emit_load_int32_noshuffle(duk_compiler_ctx *comp_ctx, duk_regconst_t reg, duk_int32_t val) { duk__emit_load_int32_raw(comp_ctx, reg, val, DUK__EMIT_FLAG_NO_SHUFFLE_A /*op_flags*/); } #else DUK_LOCAL void duk__emit_load_int32_noshuffle(duk_compiler_ctx *comp_ctx, duk_regconst_t reg, duk_int32_t val) { /* When torture not enabled, can just use the same helper because * 'reg' won't get spilled. */ DUK_ASSERT(reg <= DUK_BC_A_MAX); duk__emit_load_int32(comp_ctx, reg, val); } #endif DUK_LOCAL void duk__emit_jump(duk_compiler_ctx *comp_ctx, duk_int_t target_pc) { duk_int_t curr_pc; duk_int_t offset; curr_pc = (duk_int_t) (DUK_BW_GET_SIZE(comp_ctx->thr, &comp_ctx->curr_func.bw_code) / sizeof(duk_compiler_instr)); offset = (duk_int_t) target_pc - (duk_int_t) curr_pc - 1; DUK_ASSERT(offset + DUK_BC_JUMP_BIAS >= DUK_BC_ABC_MIN); DUK_ASSERT(offset + DUK_BC_JUMP_BIAS <= DUK_BC_ABC_MAX); duk__emit_abc(comp_ctx, DUK_OP_JUMP, (duk_regconst_t) (offset + DUK_BC_JUMP_BIAS)); } DUK_LOCAL duk_int_t duk__emit_jump_empty(duk_compiler_ctx *comp_ctx) { duk_int_t ret; ret = duk__get_current_pc(comp_ctx); /* useful for patching jumps later */ duk__emit_op_only(comp_ctx, DUK_OP_JUMP); return ret; } /* Insert an empty jump in the middle of code emitted earlier. This is * currently needed for compiling for-in. */ DUK_LOCAL void duk__insert_jump_entry(duk_compiler_ctx *comp_ctx, duk_int_t jump_pc) { #if defined(DUK_USE_PC2LINE) duk_int_t line; #endif duk_compiler_instr *instr; duk_size_t offset; DUK_ASSERT(jump_pc >= 0); offset = (duk_size_t) jump_pc * sizeof(duk_compiler_instr); instr = (duk_compiler_instr *) (void *) DUK_BW_INSERT_ENSURE_AREA(comp_ctx->thr, &comp_ctx->curr_func.bw_code, offset, sizeof(duk_compiler_instr)); #if defined(DUK_USE_PC2LINE) line = comp_ctx->curr_token.start_line; /* approximation, close enough */ #endif instr->ins = DUK_ENC_OP_ABC(DUK_OP_JUMP, 0); #if defined(DUK_USE_PC2LINE) instr->line = (duk_uint32_t) line; #endif DUK_BW_ADD_PTR(comp_ctx->thr, &comp_ctx->curr_func.bw_code, sizeof(duk_compiler_instr)); if (DUK_UNLIKELY(DUK_BW_GET_SIZE(comp_ctx->thr, &comp_ctx->curr_func.bw_code) > DUK_USE_ESBC_MAX_BYTES)) { goto fail_bc_limit; } return; fail_bc_limit: DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_BYTECODE_LIMIT); } /* Does not assume that jump_pc contains a DUK_OP_JUMP previously; this is intentional * to allow e.g. an INVALID opcode be overwritten with a JUMP (label management uses this). */ DUK_LOCAL void duk__patch_jump(duk_compiler_ctx *comp_ctx, duk_int_t jump_pc, duk_int_t target_pc) { duk_compiler_instr *instr; duk_int_t offset; /* allow negative PCs, behave as a no-op */ if (jump_pc < 0) { DUK_DDD(DUK_DDDPRINT("duk__patch_jump(): nop call, jump_pc=%ld (<0), target_pc=%ld", (long) jump_pc, (long) target_pc)); return; } DUK_ASSERT(jump_pc >= 0); /* XXX: range assert */ instr = duk__get_instr_ptr(comp_ctx, jump_pc); DUK_ASSERT(instr != NULL); /* XXX: range assert */ offset = target_pc - jump_pc - 1; instr->ins = DUK_ENC_OP_ABC(DUK_OP_JUMP, offset + DUK_BC_JUMP_BIAS); DUK_DDD(DUK_DDDPRINT("duk__patch_jump(): jump_pc=%ld, target_pc=%ld, offset=%ld", (long) jump_pc, (long) target_pc, (long) offset)); } DUK_LOCAL void duk__patch_jump_here(duk_compiler_ctx *comp_ctx, duk_int_t jump_pc) { duk__patch_jump(comp_ctx, jump_pc, duk__get_current_pc(comp_ctx)); } DUK_LOCAL void duk__patch_trycatch(duk_compiler_ctx *comp_ctx, duk_int_t ldconst_pc, duk_int_t trycatch_pc, duk_regconst_t reg_catch, duk_regconst_t const_varname, duk_small_uint_t flags) { duk_compiler_instr *instr; DUK_ASSERT(DUK__ISREG(reg_catch)); instr = duk__get_instr_ptr(comp_ctx, ldconst_pc); DUK_ASSERT(DUK_DEC_OP(instr->ins) == DUK_OP_LDCONST); DUK_ASSERT(instr != NULL); if (const_varname & DUK__CONST_MARKER) { /* Have a catch variable. */ const_varname = const_varname & (~DUK__CONST_MARKER); if (reg_catch > DUK_BC_BC_MAX || const_varname > DUK_BC_BC_MAX) { /* Catch attempts to use out-of-range reg/const. Without this * check Duktape 0.12.0 could generate invalid code which caused * an assert failure on execution. This error is triggered e.g. * for functions with a lot of constants and a try-catch statement. * Shuffling or opcode semantics change is needed to fix the issue. * See: test-bug-trycatch-many-constants.js. */ DUK_D(DUK_DPRINT("failed to patch trycatch: flags=%ld, reg_catch=%ld, const_varname=%ld (0x%08lx)", (long) flags, (long) reg_catch, (long) const_varname, (long) const_varname)); DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_REG_LIMIT); } instr->ins |= DUK_ENC_OP_A_BC(0, 0, const_varname); } else { /* No catch variable, e.g. a try-finally; replace LDCONST with * NOP to avoid a bogus LDCONST. */ instr->ins = DUK_ENC_OP(DUK_OP_NOP); } instr = duk__get_instr_ptr(comp_ctx, trycatch_pc); DUK_ASSERT(instr != NULL); DUK_ASSERT_DISABLE(flags >= DUK_BC_A_MIN); DUK_ASSERT(flags <= DUK_BC_A_MAX); instr->ins = DUK_ENC_OP_A_BC(DUK_OP_TRYCATCH, flags, reg_catch); } DUK_LOCAL void duk__emit_if_false_skip(duk_compiler_ctx *comp_ctx, duk_regconst_t regconst) { duk_small_uint_t op; op = DUK__ISREG(regconst) ? DUK_OP_IFFALSE_R : DUK_OP_IFFALSE_C; duk__emit_bc(comp_ctx, op, regconst); /* helper will remove const flag */ } DUK_LOCAL void duk__emit_if_true_skip(duk_compiler_ctx *comp_ctx, duk_regconst_t regconst) { duk_small_uint_t op; op = DUK__ISREG(regconst) ? DUK_OP_IFTRUE_R : DUK_OP_IFTRUE_C; duk__emit_bc(comp_ctx, op, regconst); /* helper will remove const flag */ } DUK_LOCAL void duk__emit_invalid(duk_compiler_ctx *comp_ctx) { duk__emit_op_only(comp_ctx, DUK_OP_INVALID); } /* * Peephole optimizer for finished bytecode. * * Does not remove opcodes; currently only straightens out unconditional * jump chains which are generated by several control structures. */ DUK_LOCAL void duk__peephole_optimize_bytecode(duk_compiler_ctx *comp_ctx) { duk_compiler_instr *bc; duk_small_uint_t iter; duk_int_t i, n; duk_int_t count_opt; bc = (duk_compiler_instr *) (void *) DUK_BW_GET_BASEPTR(comp_ctx->thr, &comp_ctx->curr_func.bw_code); #if defined(DUK_USE_BUFLEN16) /* No need to assert, buffer size maximum is 0xffff. */ #else DUK_ASSERT((duk_size_t) DUK_BW_GET_SIZE(comp_ctx->thr, &comp_ctx->curr_func.bw_code) / sizeof(duk_compiler_instr) <= (duk_size_t) DUK_INT_MAX); /* bytecode limits */ #endif n = (duk_int_t) (DUK_BW_GET_SIZE(comp_ctx->thr, &comp_ctx->curr_func.bw_code) / sizeof(duk_compiler_instr)); for (iter = 0; iter < DUK_COMPILER_PEEPHOLE_MAXITER; iter++) { count_opt = 0; for (i = 0; i < n; i++) { duk_instr_t ins; duk_int_t target_pc1; duk_int_t target_pc2; ins = bc[i].ins; if (DUK_DEC_OP(ins) != DUK_OP_JUMP) { continue; } target_pc1 = i + 1 + (duk_int_t) DUK_DEC_ABC(ins) - (duk_int_t) DUK_BC_JUMP_BIAS; DUK_DDD(DUK_DDDPRINT("consider jump at pc %ld; target_pc=%ld", (long) i, (long) target_pc1)); DUK_ASSERT(target_pc1 >= 0); DUK_ASSERT(target_pc1 < n); /* Note: if target_pc1 == i, we'll optimize a jump to itself. * This does not need to be checked for explicitly; the case * is rare and max iter breaks us out. */ ins = bc[target_pc1].ins; if (DUK_DEC_OP(ins) != DUK_OP_JUMP) { continue; } target_pc2 = target_pc1 + 1 + (duk_int_t) DUK_DEC_ABC(ins) - (duk_int_t) DUK_BC_JUMP_BIAS; DUK_DDD(DUK_DDDPRINT("optimizing jump at pc %ld; old target is %ld -> new target is %ld", (long) i, (long) target_pc1, (long) target_pc2)); bc[i].ins = DUK_ENC_OP_ABC(DUK_OP_JUMP, target_pc2 - (i + 1) + DUK_BC_JUMP_BIAS); count_opt++; } DUK_DD(DUK_DDPRINT("optimized %ld jumps on peephole round %ld", (long) count_opt, (long) (iter + 1))); if (count_opt == 0) { break; } } } /* * Intermediate value helpers */ /* Flags for intermediate value coercions. A flag for using a forced reg * is not needed, the forced_reg argument suffices and generates better * code (it is checked as it is used). */ /* XXX: DUK__IVAL_FLAG_REQUIRE_SHORT is passed but not currently implemented * by ispec/ivalue operations. */ #define DUK__IVAL_FLAG_ALLOW_CONST (1 << 0) /* allow a constant to be returned */ #define DUK__IVAL_FLAG_REQUIRE_TEMP (1 << 1) /* require a (mutable) temporary as a result (or a const if allowed) */ #define DUK__IVAL_FLAG_REQUIRE_SHORT (1 << 2) /* require a short (8-bit) reg/const which fits into bytecode B/C slot */ /* XXX: some code might benefit from DUK__SETTEMP_IFTEMP(thr,x) */ #if 0 /* enable manually for dumping */ #define DUK__DUMP_ISPEC(compctx,ispec) do { duk__dump_ispec((compctx), (ispec)); } while (0) #define DUK__DUMP_IVALUE(compctx,ivalue) do { duk__dump_ivalue((compctx), (ivalue)); } while (0) DUK_LOCAL void duk__dump_ispec(duk_compiler_ctx *comp_ctx, duk_ispec *x) { DUK_D(DUK_DPRINT("ispec dump: t=%ld regconst=0x%08lx, valstack_idx=%ld, value=%!T", (long) x->t, (unsigned long) x->regconst, (long) x->valstack_idx, duk_get_tval(comp_ctx->thr, x->valstack_idx))); } DUK_LOCAL void duk__dump_ivalue(duk_compiler_ctx *comp_ctx, duk_ivalue *x) { DUK_D(DUK_DPRINT("ivalue dump: t=%ld op=%ld " "x1={t=%ld regconst=0x%08lx valstack_idx=%ld value=%!T} " "x2={t=%ld regconst=0x%08lx valstack_idx=%ld value=%!T}", (long) x->t, (long) x->op, (long) x->x1.t, (unsigned long) x->x1.regconst, (long) x->x1.valstack_idx, duk_get_tval(comp_ctx->thr, x->x1.valstack_idx), (long) x->x2.t, (unsigned long) x->x2.regconst, (long) x->x2.valstack_idx, duk_get_tval(comp_ctx->thr, x->x2.valstack_idx))); } #else #define DUK__DUMP_ISPEC(comp_ctx,x) do {} while (0) #define DUK__DUMP_IVALUE(comp_ctx,x) do {} while (0) #endif DUK_LOCAL void duk__ivalue_regconst(duk_ivalue *x, duk_regconst_t regconst) { x->t = DUK_IVAL_PLAIN; x->x1.t = DUK_ISPEC_REGCONST; x->x1.regconst = regconst; } DUK_LOCAL void duk__ivalue_plain_fromstack(duk_compiler_ctx *comp_ctx, duk_ivalue *x) { x->t = DUK_IVAL_PLAIN; x->x1.t = DUK_ISPEC_VALUE; duk_replace(comp_ctx->thr, x->x1.valstack_idx); } DUK_LOCAL void duk__ivalue_var_fromstack(duk_compiler_ctx *comp_ctx, duk_ivalue *x) { x->t = DUK_IVAL_VAR; x->x1.t = DUK_ISPEC_VALUE; duk_replace(comp_ctx->thr, x->x1.valstack_idx); } DUK_LOCAL_DECL void duk__ivalue_var_hstring(duk_compiler_ctx *comp_ctx, duk_ivalue *x, duk_hstring *h) { DUK_ASSERT(h != NULL); duk_push_hstring(comp_ctx->thr, h); duk__ivalue_var_fromstack(comp_ctx, x); } DUK_LOCAL void duk__copy_ispec(duk_compiler_ctx *comp_ctx, duk_ispec *src, duk_ispec *dst) { dst->t = src->t; dst->regconst = src->regconst; duk_copy(comp_ctx->thr, src->valstack_idx, dst->valstack_idx); } DUK_LOCAL void duk__copy_ivalue(duk_compiler_ctx *comp_ctx, duk_ivalue *src, duk_ivalue *dst) { dst->t = src->t; dst->op = src->op; dst->x1.t = src->x1.t; dst->x1.regconst = src->x1.regconst; dst->x2.t = src->x2.t; dst->x2.regconst = src->x2.regconst; duk_copy(comp_ctx->thr, src->x1.valstack_idx, dst->x1.valstack_idx); duk_copy(comp_ctx->thr, src->x2.valstack_idx, dst->x2.valstack_idx); } DUK_LOCAL duk_regconst_t duk__alloctemps(duk_compiler_ctx *comp_ctx, duk_small_int_t num) { duk_regconst_t res; res = comp_ctx->curr_func.temp_next; comp_ctx->curr_func.temp_next += num; if (comp_ctx->curr_func.temp_next > DUK__MAX_TEMPS) { /* == DUK__MAX_TEMPS is OK */ DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_TEMP_LIMIT); } /* maintain highest 'used' temporary, needed to figure out nregs of function */ if (comp_ctx->curr_func.temp_next > comp_ctx->curr_func.temp_max) { comp_ctx->curr_func.temp_max = comp_ctx->curr_func.temp_next; } return res; } DUK_LOCAL duk_regconst_t duk__alloctemp(duk_compiler_ctx *comp_ctx) { return duk__alloctemps(comp_ctx, 1); } DUK_LOCAL void duk__settemp_checkmax(duk_compiler_ctx *comp_ctx, duk_regconst_t temp_next) { comp_ctx->curr_func.temp_next = temp_next; if (temp_next > comp_ctx->curr_func.temp_max) { comp_ctx->curr_func.temp_max = temp_next; } } /* get const for value at valstack top */ DUK_LOCAL duk_regconst_t duk__getconst(duk_compiler_ctx *comp_ctx) { duk_hthread *thr = comp_ctx->thr; duk_compiler_func *f = &comp_ctx->curr_func; duk_tval *tv1; duk_int_t i, n, n_check; n = (duk_int_t) duk_get_length(thr, f->consts_idx); tv1 = DUK_GET_TVAL_NEGIDX(thr, -1); DUK_ASSERT(tv1 != NULL); #if defined(DUK_USE_FASTINT) /* Explicit check for fastint downgrade. */ DUK_TVAL_CHKFAST_INPLACE_SLOW(tv1); #endif /* Sanity workaround for handling functions with a large number of * constants at least somewhat reasonably. Otherwise checking whether * we already have the constant would grow very slow (as it is O(N^2)). */ n_check = (n > DUK__GETCONST_MAX_CONSTS_CHECK ? DUK__GETCONST_MAX_CONSTS_CHECK : n); for (i = 0; i < n_check; i++) { duk_tval *tv2 = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, f->h_consts, i); /* Strict equality is NOT enough, because we cannot use the same * constant for e.g. +0 and -0. */ if (duk_js_samevalue(tv1, tv2)) { DUK_DDD(DUK_DDDPRINT("reused existing constant for %!T -> const index %ld", (duk_tval *) tv1, (long) i)); duk_pop(thr); return (duk_regconst_t) i | (duk_regconst_t) DUK__CONST_MARKER; } } if (n > DUK__MAX_CONSTS) { DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_CONST_LIMIT); } DUK_DDD(DUK_DDDPRINT("allocating new constant for %!T -> const index %ld", (duk_tval *) tv1, (long) n)); (void) duk_put_prop_index(thr, f->consts_idx, (duk_uarridx_t) n); /* invalidates tv1, tv2 */ return (duk_regconst_t) n | (duk_regconst_t) DUK__CONST_MARKER; } DUK_LOCAL duk_bool_t duk__const_needs_refcount(duk_compiler_ctx *comp_ctx, duk_regconst_t rc) { #if defined(DUK_USE_REFERENCE_COUNTING) duk_compiler_func *f = &comp_ctx->curr_func; duk_bool_t ret; DUK_ASSERT((rc & DUK__CONST_MARKER) == 0); /* caller removes const marker */ (void) duk_get_prop_index(comp_ctx->thr, f->consts_idx, (duk_uarridx_t) rc); ret = !duk_is_number(comp_ctx->thr, -1); /* now only number/string, so conservative check */ duk_pop(comp_ctx->thr); return ret; #else DUK_UNREF(comp_ctx); DUK_UNREF(rc); DUK_ASSERT((rc & DUK__CONST_MARKER) == 0); /* caller removes const marker */ return 0; #endif } /* Get the value represented by an duk_ispec to a register or constant. * The caller can control the result by indicating whether or not: * * (1) a constant is allowed (sometimes the caller needs the result to * be in a register) * * (2) a temporary register is required (usually when caller requires * the register to be safely mutable; normally either a bound * register or a temporary register are both OK) * * (3) a forced register target needs to be used * * Bytecode may be emitted to generate the necessary value. The return * value is either a register or a constant. */ DUK_LOCAL duk_regconst_t duk__ispec_toregconst_raw(duk_compiler_ctx *comp_ctx, duk_ispec *x, duk_regconst_t forced_reg, duk_small_uint_t flags) { duk_hthread *thr = comp_ctx->thr; DUK_DDD(DUK_DDDPRINT("duk__ispec_toregconst_raw(): x={%ld:%ld:%!T}, " "forced_reg=%ld, flags 0x%08lx: allow_const=%ld require_temp=%ld require_short=%ld", (long) x->t, (long) x->regconst, (duk_tval *) duk_get_tval(thr, x->valstack_idx), (long) forced_reg, (unsigned long) flags, (long) ((flags & DUK__IVAL_FLAG_ALLOW_CONST) ? 1 : 0), (long) ((flags & DUK__IVAL_FLAG_REQUIRE_TEMP) ? 1 : 0), (long) ((flags & DUK__IVAL_FLAG_REQUIRE_SHORT) ? 1 : 0))); switch (x->t) { case DUK_ISPEC_VALUE: { duk_tval *tv; tv = DUK_GET_TVAL_POSIDX(thr, x->valstack_idx); DUK_ASSERT(tv != NULL); switch (DUK_TVAL_GET_TAG(tv)) { case DUK_TAG_UNDEFINED: { /* Note: although there is no 'undefined' literal, undefined * values can occur during compilation as a result of e.g. * the 'void' operator. */ duk_regconst_t dest = (forced_reg >= 0 ? forced_reg : DUK__ALLOCTEMP(comp_ctx)); duk__emit_bc(comp_ctx, DUK_OP_LDUNDEF, dest); return dest; } case DUK_TAG_NULL: { duk_regconst_t dest = (forced_reg >= 0 ? forced_reg : DUK__ALLOCTEMP(comp_ctx)); duk__emit_bc(comp_ctx, DUK_OP_LDNULL, dest); return dest; } case DUK_TAG_BOOLEAN: { duk_regconst_t dest = (forced_reg >= 0 ? forced_reg : DUK__ALLOCTEMP(comp_ctx)); duk__emit_bc(comp_ctx, (DUK_TVAL_GET_BOOLEAN(tv) ? DUK_OP_LDTRUE : DUK_OP_LDFALSE), dest); return dest; } case DUK_TAG_POINTER: { DUK_UNREACHABLE(); break; } case DUK_TAG_STRING: { duk_hstring *h; duk_regconst_t dest; duk_regconst_t constidx; h = DUK_TVAL_GET_STRING(tv); DUK_UNREF(h); DUK_ASSERT(h != NULL); #if 0 /* XXX: to be implemented? */ /* Use special opcodes to load short strings */ if (DUK_HSTRING_GET_BYTELEN(h) <= 2) { /* Encode into a single opcode (18 bits can encode 1-2 bytes + length indicator) */ } else if (DUK_HSTRING_GET_BYTELEN(h) <= 6) { /* Encode into a double constant (53 bits can encode 6*8 = 48 bits + 3-bit length */ } #endif duk_dup(thr, x->valstack_idx); constidx = duk__getconst(comp_ctx); if (flags & DUK__IVAL_FLAG_ALLOW_CONST) { return constidx; } dest = (forced_reg >= 0 ? forced_reg : DUK__ALLOCTEMP(comp_ctx)); duk__emit_a_bc(comp_ctx, DUK_OP_LDCONST, dest, constidx); return dest; } case DUK_TAG_OBJECT: { DUK_UNREACHABLE(); break; } case DUK_TAG_BUFFER: { DUK_UNREACHABLE(); break; } case DUK_TAG_LIGHTFUNC: { DUK_UNREACHABLE(); break; } #if defined(DUK_USE_FASTINT) case DUK_TAG_FASTINT: #endif default: { /* number */ duk_regconst_t dest; duk_regconst_t constidx; duk_double_t dval; duk_int32_t ival; DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv)); DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); dval = DUK_TVAL_GET_NUMBER(tv); if (!(flags & DUK__IVAL_FLAG_ALLOW_CONST)) { /* A number can be loaded either through a constant, using * LDINT, or using LDINT+LDINTX. LDINT is always a size win, * LDINT+LDINTX is not if the constant is used multiple times. * Currently always prefer LDINT+LDINTX over a double constant. */ if (duk_is_whole_get_int32_nonegzero(dval, &ival)) { dest = (forced_reg >= 0 ? forced_reg : DUK__ALLOCTEMP(comp_ctx)); duk__emit_load_int32(comp_ctx, dest, ival); return dest; } } duk_dup(thr, x->valstack_idx); constidx = duk__getconst(comp_ctx); if (flags & DUK__IVAL_FLAG_ALLOW_CONST) { return constidx; } else { dest = (forced_reg >= 0 ? forced_reg : DUK__ALLOCTEMP(comp_ctx)); duk__emit_a_bc(comp_ctx, DUK_OP_LDCONST, dest, constidx); return dest; } } } /* end switch */ } case DUK_ISPEC_REGCONST: { if (forced_reg >= 0) { if (DUK__ISCONST(x->regconst)) { duk__emit_a_bc(comp_ctx, DUK_OP_LDCONST, forced_reg, x->regconst); } else if (x->regconst != forced_reg) { duk__emit_a_bc(comp_ctx, DUK_OP_LDREG, forced_reg, x->regconst); } else { ; /* already in correct reg */ } return forced_reg; } DUK_ASSERT(forced_reg < 0); if (DUK__ISCONST(x->regconst)) { if (!(flags & DUK__IVAL_FLAG_ALLOW_CONST)) { duk_regconst_t dest = DUK__ALLOCTEMP(comp_ctx); duk__emit_a_bc(comp_ctx, DUK_OP_LDCONST, dest, x->regconst); return dest; } return x->regconst; } DUK_ASSERT(forced_reg < 0 && !DUK__ISCONST(x->regconst)); if ((flags & DUK__IVAL_FLAG_REQUIRE_TEMP) && !DUK__ISREG_TEMP(comp_ctx, x->regconst)) { duk_regconst_t dest = DUK__ALLOCTEMP(comp_ctx); duk__emit_a_bc(comp_ctx, DUK_OP_LDREG, dest, x->regconst); return dest; } return x->regconst; } default: { break; } } DUK_ERROR_INTERNAL(thr); return 0; } DUK_LOCAL void duk__ispec_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ispec *x, duk_regconst_t forced_reg) { DUK_ASSERT(forced_reg >= 0); (void) duk__ispec_toregconst_raw(comp_ctx, x, forced_reg, 0 /*flags*/); } /* Coerce an duk_ivalue to a 'plain' value by generating the necessary * arithmetic operations, property access, or variable access bytecode. * The duk_ivalue argument ('x') is converted into a plain value as a * side effect. */ DUK_LOCAL void duk__ivalue_toplain_raw(duk_compiler_ctx *comp_ctx, duk_ivalue *x, duk_regconst_t forced_reg) { duk_hthread *thr = comp_ctx->thr; DUK_DDD(DUK_DDDPRINT("duk__ivalue_toplain_raw(): x={t=%ld,op=%ld,x1={%ld:%ld:%!T},x2={%ld:%ld:%!T}}, " "forced_reg=%ld", (long) x->t, (long) x->op, (long) x->x1.t, (long) x->x1.regconst, (duk_tval *) duk_get_tval(thr, x->x1.valstack_idx), (long) x->x2.t, (long) x->x2.regconst, (duk_tval *) duk_get_tval(thr, x->x2.valstack_idx), (long) forced_reg)); switch (x->t) { case DUK_IVAL_PLAIN: { return; } /* XXX: support unary arithmetic ivalues (useful?) */ case DUK_IVAL_ARITH: { duk_regconst_t arg1; duk_regconst_t arg2; duk_regconst_t dest; duk_tval *tv1; duk_tval *tv2; DUK_DDD(DUK_DDDPRINT("arith to plain conversion")); /* inline arithmetic check for constant values */ /* XXX: use the exactly same arithmetic function here as in executor */ if (x->x1.t == DUK_ISPEC_VALUE && x->x2.t == DUK_ISPEC_VALUE && x->t == DUK_IVAL_ARITH) { tv1 = DUK_GET_TVAL_POSIDX(thr, x->x1.valstack_idx); tv2 = DUK_GET_TVAL_POSIDX(thr, x->x2.valstack_idx); DUK_ASSERT(tv1 != NULL); DUK_ASSERT(tv2 != NULL); DUK_DDD(DUK_DDDPRINT("arith: tv1=%!T, tv2=%!T", (duk_tval *) tv1, (duk_tval *) tv2)); if (DUK_TVAL_IS_NUMBER(tv1) && DUK_TVAL_IS_NUMBER(tv2)) { duk_double_t d1 = DUK_TVAL_GET_NUMBER(tv1); duk_double_t d2 = DUK_TVAL_GET_NUMBER(tv2); duk_double_t d3; duk_bool_t accept_fold = 1; DUK_DDD(DUK_DDDPRINT("arith inline check: d1=%lf, d2=%lf, op=%ld", (double) d1, (double) d2, (long) x->op)); switch (x->op) { case DUK_OP_ADD: { d3 = d1 + d2; break; } case DUK_OP_SUB: { d3 = d1 - d2; break; } case DUK_OP_MUL: { d3 = d1 * d2; break; } case DUK_OP_DIV: { d3 = d1 / d2; break; } case DUK_OP_EXP: { d3 = (duk_double_t) duk_js_arith_pow((double) d1, (double) d2); break; } default: { d3 = 0.0; /* Won't be used, but silence MSVC /W4 warning. */ accept_fold = 0; break; } } if (accept_fold) { duk_double_union du; du.d = d3; DUK_DBLUNION_NORMALIZE_NAN_CHECK(&du); d3 = du.d; x->t = DUK_IVAL_PLAIN; DUK_ASSERT(x->x1.t == DUK_ISPEC_VALUE); DUK_TVAL_SET_NUMBER(tv1, d3); /* old value is number: no refcount */ return; } } else if (x->op == DUK_OP_ADD && DUK_TVAL_IS_STRING(tv1) && DUK_TVAL_IS_STRING(tv2)) { /* Inline string concatenation. No need to check for * symbols, as all inputs are valid Ecmascript strings. */ duk_dup(thr, x->x1.valstack_idx); duk_dup(thr, x->x2.valstack_idx); duk_concat(thr, 2); duk_replace(thr, x->x1.valstack_idx); x->t = DUK_IVAL_PLAIN; DUK_ASSERT(x->x1.t == DUK_ISPEC_VALUE); return; } } arg1 = duk__ispec_toregconst_raw(comp_ctx, &x->x1, -1, DUK__IVAL_FLAG_ALLOW_CONST | DUK__IVAL_FLAG_REQUIRE_SHORT /*flags*/); arg2 = duk__ispec_toregconst_raw(comp_ctx, &x->x2, -1, DUK__IVAL_FLAG_ALLOW_CONST | DUK__IVAL_FLAG_REQUIRE_SHORT /*flags*/); /* If forced reg, use it as destination. Otherwise try to * use either coerced ispec if it is a temporary. */ if (forced_reg >= 0) { dest = forced_reg; } else if (DUK__ISREG_TEMP(comp_ctx, arg1)) { dest = arg1; } else if (DUK__ISREG_TEMP(comp_ctx, arg2)) { dest = arg2; } else { dest = DUK__ALLOCTEMP(comp_ctx); } DUK_ASSERT(DUK__ISREG(dest)); duk__emit_a_b_c(comp_ctx, x->op | DUK__EMIT_FLAG_BC_REGCONST, dest, arg1, arg2); duk__ivalue_regconst(x, dest); return; } case DUK_IVAL_PROP: { /* XXX: very similar to DUK_IVAL_ARITH - merge? */ duk_regconst_t arg1; duk_regconst_t arg2; duk_regconst_t dest; /* Need a short reg/const, does not have to be a mutable temp. */ arg1 = duk__ispec_toregconst_raw(comp_ctx, &x->x1, -1, DUK__IVAL_FLAG_ALLOW_CONST | DUK__IVAL_FLAG_REQUIRE_SHORT /*flags*/); arg2 = duk__ispec_toregconst_raw(comp_ctx, &x->x2, -1, DUK__IVAL_FLAG_ALLOW_CONST | DUK__IVAL_FLAG_REQUIRE_SHORT /*flags*/); /* Pick a destination register. If either base value or key * happens to be a temp value, reuse it as the destination. * * XXX: The temp must be a "mutable" one, i.e. such that no * other expression is using it anymore. Here this should be * the case because the value of a property access expression * is neither the base nor the key, but the lookup result. */ if (forced_reg >= 0) { dest = forced_reg; } else if (DUK__ISREG_TEMP(comp_ctx, arg1)) { dest = arg1; } else if (DUK__ISREG_TEMP(comp_ctx, arg2)) { dest = arg2; } else { dest = DUK__ALLOCTEMP(comp_ctx); } duk__emit_a_b_c(comp_ctx, DUK_OP_GETPROP | DUK__EMIT_FLAG_BC_REGCONST, dest, arg1, arg2); duk__ivalue_regconst(x, dest); return; } case DUK_IVAL_VAR: { /* x1 must be a string */ duk_regconst_t dest; duk_regconst_t reg_varbind; duk_regconst_t rc_varname; DUK_ASSERT(x->x1.t == DUK_ISPEC_VALUE); duk_dup(thr, x->x1.valstack_idx); if (duk__lookup_lhs(comp_ctx, ®_varbind, &rc_varname)) { duk__ivalue_regconst(x, reg_varbind); } else { dest = (forced_reg >= 0 ? forced_reg : DUK__ALLOCTEMP(comp_ctx)); duk__emit_a_bc(comp_ctx, DUK_OP_GETVAR, dest, rc_varname); duk__ivalue_regconst(x, dest); } return; } case DUK_IVAL_NONE: default: { DUK_D(DUK_DPRINT("invalid ivalue type: %ld", (long) x->t)); break; } } DUK_ERROR_INTERNAL(thr); return; } /* evaluate to plain value, no forced register (temp/bound reg both ok) */ DUK_LOCAL void duk__ivalue_toplain(duk_compiler_ctx *comp_ctx, duk_ivalue *x) { duk__ivalue_toplain_raw(comp_ctx, x, -1 /*forced_reg*/); } /* evaluate to final form (e.g. coerce GETPROP to code), throw away temp */ DUK_LOCAL void duk__ivalue_toplain_ignore(duk_compiler_ctx *comp_ctx, duk_ivalue *x) { duk_regconst_t temp; /* If duk__ivalue_toplain_raw() allocates a temp, forget it and * restore next temp state. */ temp = DUK__GETTEMP(comp_ctx); duk__ivalue_toplain_raw(comp_ctx, x, -1 /*forced_reg*/); DUK__SETTEMP(comp_ctx, temp); } /* Coerce an duk_ivalue to a register or constant; result register may * be a temp or a bound register. * * The duk_ivalue argument ('x') is converted into a regconst as a * side effect. */ DUK_LOCAL duk_regconst_t duk__ivalue_toregconst_raw(duk_compiler_ctx *comp_ctx, duk_ivalue *x, duk_regconst_t forced_reg, duk_small_uint_t flags) { duk_hthread *thr = comp_ctx->thr; duk_regconst_t reg; DUK_UNREF(thr); DUK_DDD(DUK_DDDPRINT("duk__ivalue_toregconst_raw(): x={t=%ld,op=%ld,x1={%ld:%ld:%!T},x2={%ld:%ld:%!T}}, " "forced_reg=%ld, flags 0x%08lx: allow_const=%ld require_temp=%ld require_short=%ld", (long) x->t, (long) x->op, (long) x->x1.t, (long) x->x1.regconst, (duk_tval *) duk_get_tval(thr, x->x1.valstack_idx), (long) x->x2.t, (long) x->x2.regconst, (duk_tval *) duk_get_tval(thr, x->x2.valstack_idx), (long) forced_reg, (unsigned long) flags, (long) ((flags & DUK__IVAL_FLAG_ALLOW_CONST) ? 1 : 0), (long) ((flags & DUK__IVAL_FLAG_REQUIRE_TEMP) ? 1 : 0), (long) ((flags & DUK__IVAL_FLAG_REQUIRE_SHORT) ? 1 : 0))); /* first coerce to a plain value */ duk__ivalue_toplain_raw(comp_ctx, x, forced_reg); DUK_ASSERT(x->t == DUK_IVAL_PLAIN); /* then to a register */ reg = duk__ispec_toregconst_raw(comp_ctx, &x->x1, forced_reg, flags); duk__ivalue_regconst(x, reg); return reg; } DUK_LOCAL duk_regconst_t duk__ivalue_toreg(duk_compiler_ctx *comp_ctx, duk_ivalue *x) { return duk__ivalue_toregconst_raw(comp_ctx, x, -1, 0 /*flags*/); } #if 0 /* unused */ DUK_LOCAL duk_regconst_t duk__ivalue_totemp(duk_compiler_ctx *comp_ctx, duk_ivalue *x) { return duk__ivalue_toregconst_raw(comp_ctx, x, -1, DUK__IVAL_FLAG_REQUIRE_TEMP /*flags*/); } #endif DUK_LOCAL void duk__ivalue_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ivalue *x, duk_int_t forced_reg) { DUK_ASSERT(forced_reg >= 0); (void) duk__ivalue_toregconst_raw(comp_ctx, x, forced_reg, 0 /*flags*/); } DUK_LOCAL duk_regconst_t duk__ivalue_toregconst(duk_compiler_ctx *comp_ctx, duk_ivalue *x) { return duk__ivalue_toregconst_raw(comp_ctx, x, -1, DUK__IVAL_FLAG_ALLOW_CONST /*flags*/); } DUK_LOCAL duk_regconst_t duk__ivalue_totempconst(duk_compiler_ctx *comp_ctx, duk_ivalue *x) { return duk__ivalue_toregconst_raw(comp_ctx, x, -1, DUK__IVAL_FLAG_ALLOW_CONST | DUK__IVAL_FLAG_REQUIRE_TEMP /*flags*/); } /* The issues below can be solved with better flags */ /* XXX: many operations actually want toforcedtemp() -- brand new temp? */ /* XXX: need a toplain_ignore() which will only coerce a value to a temp * register if it might have a side effect. Side-effect free values do not * need to be coerced. */ /* * Identifier handling */ DUK_LOCAL duk_regconst_t duk__lookup_active_register_binding(duk_compiler_ctx *comp_ctx) { duk_hthread *thr = comp_ctx->thr; duk_hstring *h_varname; duk_regconst_t ret; DUK_DDD(DUK_DDDPRINT("resolving identifier reference to '%!T'", (duk_tval *) duk_get_tval(thr, -1))); /* * Special name handling */ h_varname = duk_known_hstring(thr, -1); if (h_varname == DUK_HTHREAD_STRING_LC_ARGUMENTS(thr)) { DUK_DDD(DUK_DDDPRINT("flagging function as accessing 'arguments'")); comp_ctx->curr_func.id_access_arguments = 1; } /* * Inside one or more 'with' statements fall back to slow path always. * (See e.g. test-stmt-with.js.) */ if (comp_ctx->curr_func.with_depth > 0) { DUK_DDD(DUK_DDDPRINT("identifier lookup inside a 'with' -> fall back to slow path")); goto slow_path_own; } /* * Any catch bindings ("catch (e)") also affect identifier binding. * * Currently, the varmap is modified for the duration of the catch * clause to ensure any identifier accesses with the catch variable * name will use slow path. */ duk_get_prop(thr, comp_ctx->curr_func.varmap_idx); if (duk_is_number(thr, -1)) { ret = duk_to_int(thr, -1); duk_pop(thr); } else { duk_pop(thr); if (comp_ctx->curr_func.catch_depth > 0 || comp_ctx->curr_func.with_depth > 0) { DUK_DDD(DUK_DDDPRINT("slow path access from inside a try-catch or with needs _Varmap")); goto slow_path_own; } else { /* In this case we're doing a variable lookup that doesn't * match our own variables, so _Varmap won't be needed at * run time. */ DUK_DDD(DUK_DDDPRINT("slow path access outside of try-catch and with, no need for _Varmap")); goto slow_path_notown; } } DUK_DDD(DUK_DDDPRINT("identifier lookup -> reg %ld", (long) ret)); return ret; slow_path_notown: DUK_DDD(DUK_DDDPRINT("identifier lookup -> slow path, not own variable")); comp_ctx->curr_func.id_access_slow = 1; return (duk_regconst_t) -1; slow_path_own: DUK_DDD(DUK_DDDPRINT("identifier lookup -> slow path, may be own variable")); comp_ctx->curr_func.id_access_slow = 1; comp_ctx->curr_func.id_access_slow_own = 1; return (duk_regconst_t) -1; } /* Lookup an identifier name in the current varmap, indicating whether the * identifier is register-bound and if not, allocating a constant for the * identifier name. Returns 1 if register-bound, 0 otherwise. Caller can * also check (out_reg_varbind >= 0) to check whether or not identifier is * register bound. The caller must NOT use out_rc_varname at all unless * return code is 0 or out_reg_varbind is < 0; this is becuase out_rc_varname * is unsigned and doesn't have a "unused" / none value. */ DUK_LOCAL duk_bool_t duk__lookup_lhs(duk_compiler_ctx *comp_ctx, duk_regconst_t *out_reg_varbind, duk_regconst_t *out_rc_varname) { duk_hthread *thr = comp_ctx->thr; duk_regconst_t reg_varbind; duk_regconst_t rc_varname; /* [ ... varname ] */ duk_dup_top(thr); reg_varbind = duk__lookup_active_register_binding(comp_ctx); if (reg_varbind >= 0) { *out_reg_varbind = reg_varbind; *out_rc_varname = 0; /* duk_regconst_t is unsigned, so use 0 as dummy value (ignored by caller) */ duk_pop(thr); return 1; } else { rc_varname = duk__getconst(comp_ctx); *out_reg_varbind = -1; *out_rc_varname = rc_varname; return 0; } } /* * Label handling * * Labels are initially added with flags prohibiting both break and continue. * When the statement type is finally uncovered (after potentially multiple * labels), all the labels are updated to allow/prohibit break and continue. */ DUK_LOCAL void duk__add_label(duk_compiler_ctx *comp_ctx, duk_hstring *h_label, duk_int_t pc_label, duk_int_t label_id) { duk_hthread *thr = comp_ctx->thr; duk_size_t n; duk_size_t new_size; duk_uint8_t *p; duk_labelinfo *li_start, *li; /* Duplicate (shadowing) labels are not allowed, except for the empty * labels (which are used as default labels for switch and iteration * statements). * * We could also allow shadowing of non-empty pending labels without any * other issues than breaking the required label shadowing requirements * of the E5 specification, see Section 12.12. */ p = (duk_uint8_t *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, comp_ctx->curr_func.h_labelinfos); li_start = (duk_labelinfo *) (void *) p; li = (duk_labelinfo *) (void *) (p + DUK_HBUFFER_GET_SIZE(comp_ctx->curr_func.h_labelinfos)); n = (duk_size_t) (li - li_start); while (li > li_start) { li--; if (li->h_label == h_label && h_label != DUK_HTHREAD_STRING_EMPTY_STRING(thr)) { DUK_ERROR_SYNTAX(thr, DUK_STR_DUPLICATE_LABEL); } } duk_push_hstring(thr, h_label); DUK_ASSERT(n <= DUK_UARRIDX_MAX); /* label limits */ (void) duk_put_prop_index(thr, comp_ctx->curr_func.labelnames_idx, (duk_uarridx_t) n); new_size = (n + 1) * sizeof(duk_labelinfo); duk_hbuffer_resize(thr, comp_ctx->curr_func.h_labelinfos, new_size); /* XXX: slack handling, slow now */ /* relookup after possible realloc */ p = (duk_uint8_t *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, comp_ctx->curr_func.h_labelinfos); li_start = (duk_labelinfo *) (void *) p; DUK_UNREF(li_start); /* silence scan-build warning */ li = (duk_labelinfo *) (void *) (p + DUK_HBUFFER_GET_SIZE(comp_ctx->curr_func.h_labelinfos)); li--; /* Labels can be used for iteration statements but also for other statements, * in particular a label can be used for a block statement. All cases of a * named label accept a 'break' so that flag is set here. Iteration statements * also allow 'continue', so that flag is updated when we figure out the * statement type. */ li->flags = DUK_LABEL_FLAG_ALLOW_BREAK; li->label_id = label_id; li->h_label = h_label; li->catch_depth = comp_ctx->curr_func.catch_depth; /* catch depth from current func */ li->pc_label = pc_label; DUK_DDD(DUK_DDDPRINT("registered label: flags=0x%08lx, id=%ld, name=%!O, catch_depth=%ld, pc_label=%ld", (unsigned long) li->flags, (long) li->label_id, (duk_heaphdr *) li->h_label, (long) li->catch_depth, (long) li->pc_label)); } /* Update all labels with matching label_id. */ DUK_LOCAL void duk__update_label_flags(duk_compiler_ctx *comp_ctx, duk_int_t label_id, duk_small_uint_t flags) { duk_uint8_t *p; duk_labelinfo *li_start, *li; p = (duk_uint8_t *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(comp_ctx->thr->heap, comp_ctx->curr_func.h_labelinfos); li_start = (duk_labelinfo *) (void *) p; li = (duk_labelinfo *) (void *) (p + DUK_HBUFFER_GET_SIZE(comp_ctx->curr_func.h_labelinfos)); /* Match labels starting from latest; once label_id no longer matches, we can * safely exit without checking the rest of the labels (only the topmost labels * are ever updated). */ while (li > li_start) { li--; if (li->label_id != label_id) { break; } DUK_DDD(DUK_DDDPRINT("updating (overwriting) label flags for li=%p, label_id=%ld, flags=%ld", (void *) li, (long) label_id, (long) flags)); li->flags = flags; } } /* Lookup active label information. Break/continue distinction is necessary to handle switch * statement related labels correctly: a switch will only catch a 'break', not a 'continue'. * * An explicit label cannot appear multiple times in the active set, but empty labels (unlabelled * iteration and switch statements) can. A break will match the closest unlabelled or labelled * statement. A continue will match the closest unlabelled or labelled iteration statement. It is * a syntax error if a continue matches a labelled switch statement; because an explicit label cannot * be duplicated, the continue cannot match any valid label outside the switch. * * A side effect of these rules is that a LABEL statement related to a switch should never actually * catch a continue abrupt completion at run-time. Hence an INVALID opcode can be placed in the * continue slot of the switch's LABEL statement. */ /* XXX: awkward, especially the bunch of separate output values -> output struct? */ DUK_LOCAL void duk__lookup_active_label(duk_compiler_ctx *comp_ctx, duk_hstring *h_label, duk_bool_t is_break, duk_int_t *out_label_id, duk_int_t *out_label_catch_depth, duk_int_t *out_label_pc, duk_bool_t *out_is_closest) { duk_hthread *thr = comp_ctx->thr; duk_uint8_t *p; duk_labelinfo *li_start, *li_end, *li; duk_bool_t match = 0; DUK_DDD(DUK_DDDPRINT("looking up active label: label='%!O', is_break=%ld", (duk_heaphdr *) h_label, (long) is_break)); DUK_UNREF(thr); p = (duk_uint8_t *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, comp_ctx->curr_func.h_labelinfos); li_start = (duk_labelinfo *) (void *) p; li_end = (duk_labelinfo *) (void *) (p + DUK_HBUFFER_GET_SIZE(comp_ctx->curr_func.h_labelinfos)); li = li_end; /* Match labels starting from latest label because there can be duplicate empty * labels in the label set. */ while (li > li_start) { li--; if (li->h_label != h_label) { DUK_DDD(DUK_DDDPRINT("labelinfo[%ld] ->'%!O' != %!O", (long) (li - li_start), (duk_heaphdr *) li->h_label, (duk_heaphdr *) h_label)); continue; } DUK_DDD(DUK_DDDPRINT("labelinfo[%ld] -> '%!O' label name matches (still need to check type)", (long) (li - li_start), (duk_heaphdr *) h_label)); /* currently all labels accept a break, so no explicit check for it now */ DUK_ASSERT(li->flags & DUK_LABEL_FLAG_ALLOW_BREAK); if (is_break) { /* break matches always */ match = 1; break; } else if (li->flags & DUK_LABEL_FLAG_ALLOW_CONTINUE) { /* iteration statements allow continue */ match = 1; break; } else { /* continue matched this label -- we can only continue if this is the empty * label, for which duplication is allowed, and thus there is hope of * finding a match deeper in the label stack. */ if (h_label != DUK_HTHREAD_STRING_EMPTY_STRING(thr)) { DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_LABEL); } else { DUK_DDD(DUK_DDDPRINT("continue matched an empty label which does not " "allow a continue -> continue lookup deeper in label stack")); } } } /* XXX: match flag is awkward, rework */ if (!match) { DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_LABEL); } DUK_DDD(DUK_DDDPRINT("label match: %!O -> label_id %ld, catch_depth=%ld, pc_label=%ld", (duk_heaphdr *) h_label, (long) li->label_id, (long) li->catch_depth, (long) li->pc_label)); *out_label_id = li->label_id; *out_label_catch_depth = li->catch_depth; *out_label_pc = li->pc_label; *out_is_closest = (li == li_end - 1); } DUK_LOCAL void duk__reset_labels_to_length(duk_compiler_ctx *comp_ctx, duk_size_t len) { duk_hthread *thr = comp_ctx->thr; duk_set_length(thr, comp_ctx->curr_func.labelnames_idx, len); duk_hbuffer_resize(thr, comp_ctx->curr_func.h_labelinfos, sizeof(duk_labelinfo) * len); } /* * Expression parsing: duk__expr_nud(), duk__expr_led(), duk__expr_lbp(), and helpers. * * - duk__expr_nud(): ("null denotation"): process prev_token as a "start" of an expression (e.g. literal) * - duk__expr_led(): ("left denotation"): process prev_token in the "middle" of an expression (e.g. operator) * - duk__expr_lbp(): ("left-binding power"): return left-binding power of curr_token */ /* object literal key tracking flags */ #define DUK__OBJ_LIT_KEY_PLAIN (1 << 0) /* key encountered as a plain property */ #define DUK__OBJ_LIT_KEY_GET (1 << 1) /* key encountered as a getter */ #define DUK__OBJ_LIT_KEY_SET (1 << 2) /* key encountered as a setter */ DUK_LOCAL void duk__nud_array_literal(duk_compiler_ctx *comp_ctx, duk_ivalue *res) { duk_hthread *thr = comp_ctx->thr; duk_regconst_t reg_obj; /* result reg */ duk_regconst_t reg_temp; /* temp reg */ duk_regconst_t temp_start; /* temp reg value for start of loop */ duk_small_uint_t max_init_values; /* max # of values initialized in one MPUTARR set */ duk_small_uint_t num_values; /* number of values in current MPUTARR set */ duk_uarridx_t curr_idx; /* current (next) array index */ duk_uarridx_t start_idx; /* start array index of current MPUTARR set */ duk_uarridx_t init_idx; /* last array index explicitly initialized, +1 */ duk_bool_t require_comma; /* next loop requires a comma */ #if !defined(DUK_USE_PREFER_SIZE) duk_int_t pc_newarr; duk_compiler_instr *instr; #endif /* DUK_TOK_LBRACKET already eaten, current token is right after that */ DUK_ASSERT(comp_ctx->prev_token.t == DUK_TOK_LBRACKET); max_init_values = DUK__MAX_ARRAY_INIT_VALUES; /* XXX: depend on available temps? */ reg_obj = DUK__ALLOCTEMP(comp_ctx); #if !defined(DUK_USE_PREFER_SIZE) pc_newarr = duk__get_current_pc(comp_ctx); #endif duk__emit_bc(comp_ctx, DUK_OP_NEWARR, reg_obj); /* XXX: patch initial size hint afterwards? */ temp_start = DUK__GETTEMP(comp_ctx); /* * Emit initializers in sets of maximum max_init_values. * Corner cases such as single value initializers do not have * special handling now. * * Elided elements must not be emitted as 'undefined' values, * because such values would be enumerable (which is incorrect). * Also note that trailing elisions must be reflected in the * length of the final array but cause no elements to be actually * inserted. */ curr_idx = 0; init_idx = 0; /* tracks maximum initialized index + 1 */ start_idx = 0; require_comma = 0; for (;;) { num_values = 0; DUK__SETTEMP(comp_ctx, temp_start); if (comp_ctx->curr_token.t == DUK_TOK_RBRACKET) { break; } for (;;) { if (comp_ctx->curr_token.t == DUK_TOK_RBRACKET) { /* the outer loop will recheck and exit */ break; } /* comma check */ if (require_comma) { if (comp_ctx->curr_token.t == DUK_TOK_COMMA) { /* comma after a value, expected */ duk__advance(comp_ctx); require_comma = 0; continue; } else { goto syntax_error; } } else { if (comp_ctx->curr_token.t == DUK_TOK_COMMA) { /* elision - flush */ curr_idx++; duk__advance(comp_ctx); /* if num_values > 0, MPUTARR emitted by outer loop after break */ break; } } /* else an array initializer element */ /* initial index */ if (num_values == 0) { start_idx = curr_idx; reg_temp = DUK__ALLOCTEMP(comp_ctx); duk__emit_load_int32(comp_ctx, reg_temp, (duk_int32_t) start_idx); } reg_temp = DUK__ALLOCTEMP(comp_ctx); /* alloc temp just in case, to update max temp */ DUK__SETTEMP(comp_ctx, reg_temp); duk__expr_toforcedreg(comp_ctx, res, DUK__BP_COMMA /*rbp_flags*/, reg_temp /*forced_reg*/); DUK__SETTEMP(comp_ctx, reg_temp + 1); num_values++; curr_idx++; require_comma = 1; if (num_values >= max_init_values) { /* MPUTARR emitted by outer loop */ break; } } if (num_values > 0) { /* - A is a source register (it's not a write target, but used * to identify the target object) but can be shuffled. * - B cannot be shuffled normally because it identifies a range * of registers, the emitter has special handling for this * (the "no shuffle" flag must not be set). * - C is a non-register number and cannot be shuffled, but * never needs to be. */ duk__emit_a_b_c(comp_ctx, DUK_OP_MPUTARR | DUK__EMIT_FLAG_NO_SHUFFLE_C | DUK__EMIT_FLAG_A_IS_SOURCE, reg_obj, temp_start, (duk_regconst_t) (num_values + 1)); init_idx = start_idx + num_values; /* num_values and temp_start reset at top of outer loop */ } } /* Update initil size for NEWARR, doesn't need to be exact and is * capped at A field limit. */ #if !defined(DUK_USE_PREFER_SIZE) instr = duk__get_instr_ptr(comp_ctx, pc_newarr); instr->ins |= DUK_ENC_OP_A(0, curr_idx > DUK_BC_A_MAX ? DUK_BC_A_MAX : curr_idx); #endif DUK_ASSERT(comp_ctx->curr_token.t == DUK_TOK_RBRACKET); duk__advance(comp_ctx); DUK_DDD(DUK_DDDPRINT("array literal done, curridx=%ld, initidx=%ld", (long) curr_idx, (long) init_idx)); /* trailing elisions? */ if (curr_idx > init_idx) { /* yes, must set array length explicitly */ DUK_DDD(DUK_DDDPRINT("array literal has trailing elisions which affect its length")); reg_temp = DUK__ALLOCTEMP(comp_ctx); duk__emit_load_int32(comp_ctx, reg_temp, (duk_int_t) curr_idx); duk__emit_a_bc(comp_ctx, DUK_OP_SETALEN | DUK__EMIT_FLAG_A_IS_SOURCE, reg_obj, reg_temp); } DUK__SETTEMP(comp_ctx, temp_start); duk__ivalue_regconst(res, reg_obj); return; syntax_error: DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_ARRAY_LITERAL); } typedef struct { duk_regconst_t reg_obj; duk_regconst_t temp_start; duk_small_uint_t num_pairs; duk_small_uint_t num_total_pairs; } duk__objlit_state; DUK_LOCAL void duk__objlit_flush_keys(duk_compiler_ctx *comp_ctx, duk__objlit_state *st) { if (st->num_pairs > 0) { /* - A is a source register (it's not a write target, but used * to identify the target object) but can be shuffled. * - B cannot be shuffled normally because it identifies a range * of registers, the emitter has special handling for this * (the "no shuffle" flag must not be set). * - C is a non-register number and cannot be shuffled, but * never needs to be. */ DUK_ASSERT(st->num_pairs > 0); duk__emit_a_b_c(comp_ctx, DUK_OP_MPUTOBJ | DUK__EMIT_FLAG_NO_SHUFFLE_C | DUK__EMIT_FLAG_A_IS_SOURCE, st->reg_obj, st->temp_start, (duk_regconst_t) (st->num_pairs * 2)); st->num_total_pairs += st->num_pairs; st->num_pairs = 0; } DUK__SETTEMP(comp_ctx, st->temp_start); } DUK_LOCAL duk_bool_t duk__objlit_load_key(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_token *tok, duk_regconst_t reg_temp) { if (tok->t_nores == DUK_TOK_IDENTIFIER || tok->t_nores == DUK_TOK_STRING) { /* same handling for identifiers and strings */ DUK_ASSERT(tok->str1 != NULL); duk_push_hstring(comp_ctx->thr, tok->str1); } else if (tok->t == DUK_TOK_NUMBER) { /* numbers can be loaded as numbers and coerced on the fly */ duk_push_number(comp_ctx->thr, tok->num); } else { return 1; /* error */ } duk__ivalue_plain_fromstack(comp_ctx, res); DUK__SETTEMP(comp_ctx, reg_temp + 1); duk__ivalue_toforcedreg(comp_ctx, res, reg_temp); DUK__SETTEMP(comp_ctx, reg_temp + 1); return 0; } DUK_LOCAL void duk__nud_object_literal(duk_compiler_ctx *comp_ctx, duk_ivalue *res) { duk_hthread *thr = comp_ctx->thr; duk__objlit_state st; duk_regconst_t reg_temp; /* temp reg */ duk_small_uint_t max_init_pairs; /* max # of key-value pairs initialized in one MPUTOBJ set */ duk_bool_t first; /* first value: comma must not precede the value */ duk_bool_t is_set, is_get; /* temps */ #if !defined(DUK_USE_PREFER_SIZE) duk_int_t pc_newobj; duk_compiler_instr *instr; #endif DUK_ASSERT(comp_ctx->prev_token.t == DUK_TOK_LCURLY); max_init_pairs = DUK__MAX_OBJECT_INIT_PAIRS; /* XXX: depend on available temps? */ st.reg_obj = DUK__ALLOCTEMP(comp_ctx); /* target object */ st.temp_start = DUK__GETTEMP(comp_ctx); /* start of MPUTOBJ argument list */ st.num_pairs = 0; /* number of key/value pairs emitted for current MPUTOBJ set */ st.num_total_pairs = 0; /* number of key/value pairs emitted overall */ #if !defined(DUK_USE_PREFER_SIZE) pc_newobj = duk__get_current_pc(comp_ctx); #endif duk__emit_bc(comp_ctx, DUK_OP_NEWOBJ, st.reg_obj); /* * Emit initializers in sets of maximum max_init_pairs keys. * Setter/getter is handled separately and terminates the * current set of initializer values. Corner cases such as * single value initializers do not have special handling now. */ first = 1; for (;;) { /* * ES5 and ES2015+ provide a lot of different PropertyDefinition * formats, see http://www.ecma-international.org/ecma-262/6.0/#sec-object-initializer. * * PropertyName can be IdentifierName (includes reserved words), a string * literal, or a number literal. Note that IdentifierName allows 'get' and * 'set' too, so we need to look ahead to the next token to distinguish: * * { get : 1 } * * and * * { get foo() { return 1 } } * { get get() { return 1 } } // 'get' as getter propertyname * * Finally, a trailing comma is allowed. * * Key name is coerced to string at compile time (and ends up as a * a string constant) even for numeric keys (e.g. "{1:'foo'}"). * These could be emitted using e.g. LDINT, but that seems hardly * worth the effort and would increase code size. */ DUK_DDD(DUK_DDDPRINT("object literal loop, curr_token->t = %ld", (long) comp_ctx->curr_token.t)); if (comp_ctx->curr_token.t == DUK_TOK_RCURLY) { break; } if (first) { first = 0; } else { if (comp_ctx->curr_token.t != DUK_TOK_COMMA) { goto syntax_error; } duk__advance(comp_ctx); if (comp_ctx->curr_token.t == DUK_TOK_RCURLY) { /* trailing comma followed by rcurly */ break; } } /* Advance to get one step of lookup. */ duk__advance(comp_ctx); /* Flush current MPUTOBJ if enough many pairs gathered. */ if (st.num_pairs >= max_init_pairs) { duk__objlit_flush_keys(comp_ctx, &st); DUK_ASSERT(st.num_pairs == 0); } /* Reset temp register state and reserve reg_temp and * reg_temp + 1 for handling the current property. */ DUK__SETTEMP(comp_ctx, st.temp_start + 2 * (duk_regconst_t) st.num_pairs); reg_temp = DUK__ALLOCTEMPS(comp_ctx, 2); /* NOTE: "get" and "set" are not officially ReservedWords and the lexer * currently treats them always like ordinary identifiers (DUK_TOK_GET * and DUK_TOK_SET are unused). They need to be detected based on the * identifier string content. */ is_get = (comp_ctx->prev_token.t == DUK_TOK_IDENTIFIER && comp_ctx->prev_token.str1 == DUK_HTHREAD_STRING_GET(thr)); is_set = (comp_ctx->prev_token.t == DUK_TOK_IDENTIFIER && comp_ctx->prev_token.str1 == DUK_HTHREAD_STRING_SET(thr)); if ((is_get || is_set) && comp_ctx->curr_token.t != DUK_TOK_COLON) { /* getter/setter */ duk_int_t fnum; duk__objlit_flush_keys(comp_ctx, &st); DUK_ASSERT(DUK__GETTEMP(comp_ctx) == st.temp_start); /* 2 regs are guaranteed to be allocated w.r.t. temp_max */ reg_temp = DUK__ALLOCTEMPS(comp_ctx, 2); if (duk__objlit_load_key(comp_ctx, res, &comp_ctx->curr_token, reg_temp) != 0) { goto syntax_error; } /* curr_token = get/set name */ fnum = duk__parse_func_like_fnum(comp_ctx, DUK__FUNC_FLAG_GETSET); duk__emit_a_bc(comp_ctx, DUK_OP_CLOSURE, st.temp_start + 1, (duk_regconst_t) fnum); /* Slot C is used in a non-standard fashion (range of regs), * emitter code has special handling for it (must not set the * "no shuffle" flag). */ duk__emit_a_bc(comp_ctx, (is_get ? DUK_OP_INITGET : DUK_OP_INITSET) | DUK__EMIT_FLAG_A_IS_SOURCE, st.reg_obj, st.temp_start); /* temp_start+0 = key, temp_start+1 = closure */ DUK_ASSERT(st.num_pairs == 0); /* temp state is reset on next loop */ #if defined(DUK_USE_ES6) } else if (comp_ctx->prev_token.t == DUK_TOK_IDENTIFIER && (comp_ctx->curr_token.t == DUK_TOK_COMMA || comp_ctx->curr_token.t == DUK_TOK_RCURLY)) { duk_bool_t load_rc; load_rc = duk__objlit_load_key(comp_ctx, res, &comp_ctx->prev_token, reg_temp); DUK_UNREF(load_rc); DUK_ASSERT(load_rc == 0); /* always succeeds because token is identifier */ duk__ivalue_var_hstring(comp_ctx, res, comp_ctx->prev_token.str1); DUK_ASSERT(DUK__GETTEMP(comp_ctx) == reg_temp + 1); duk__ivalue_toforcedreg(comp_ctx, res, reg_temp + 1); st.num_pairs++; } else if ((comp_ctx->prev_token.t == DUK_TOK_IDENTIFIER || comp_ctx->prev_token.t == DUK_TOK_STRING || comp_ctx->prev_token.t == DUK_TOK_NUMBER) && comp_ctx->curr_token.t == DUK_TOK_LPAREN) { duk_int_t fnum; /* Parsing-wise there's a small hickup here: the token parsing * state is one step too advanced for the function parse helper * compared to other cases. The current solution is an extra * flag to indicate whether function parsing should use the * current or the previous token to starting parsing from. */ if (duk__objlit_load_key(comp_ctx, res, &comp_ctx->prev_token, reg_temp) != 0) { goto syntax_error; } fnum = duk__parse_func_like_fnum(comp_ctx, DUK__FUNC_FLAG_USE_PREVTOKEN | DUK__FUNC_FLAG_METDEF); duk__emit_a_bc(comp_ctx, DUK_OP_CLOSURE, reg_temp + 1, (duk_regconst_t) fnum); st.num_pairs++; #endif /* DUK_USE_ES6 */ } else { #if defined(DUK_USE_ES6) if (comp_ctx->prev_token.t == DUK_TOK_LBRACKET) { /* ES2015 computed property name. Executor ToPropertyKey() * coerces the key at runtime. */ DUK__SETTEMP(comp_ctx, reg_temp); duk__expr_toforcedreg(comp_ctx, res, DUK__BP_FOR_EXPR, reg_temp); duk__advance_expect(comp_ctx, DUK_TOK_RBRACKET); /* XXX: If next token is '(' we're dealing with * the method shorthand with a computed name, * e.g. { [Symbol.for('foo')](a,b) {} }. This * form is not yet supported and causes a * SyntaxError on the DUK_TOK_COLON check below. */ } else #endif /* DUK_USE_ES6 */ { if (duk__objlit_load_key(comp_ctx, res, &comp_ctx->prev_token, reg_temp) != 0) { goto syntax_error; } } duk__advance_expect(comp_ctx, DUK_TOK_COLON); DUK__SETTEMP(comp_ctx, reg_temp + 1); duk__expr_toforcedreg(comp_ctx, res, DUK__BP_COMMA /*rbp_flags*/, reg_temp + 1 /*forced_reg*/); st.num_pairs++; } } /* property loop */ /* Flush remaining properties. */ duk__objlit_flush_keys(comp_ctx, &st); DUK_ASSERT(st.num_pairs == 0); DUK_ASSERT(DUK__GETTEMP(comp_ctx) == st.temp_start); /* Update initial size for NEWOBJ. The init size doesn't need to be * exact as the purpose is just to avoid object resizes in common * cases. The size is capped to field A limit, and will be too high * if the object literal contains duplicate keys (this is harmless but * increases memory traffic if the object is compacted later on). */ #if !defined(DUK_USE_PREFER_SIZE) instr = duk__get_instr_ptr(comp_ctx, pc_newobj); instr->ins |= DUK_ENC_OP_A(0, st.num_total_pairs > DUK_BC_A_MAX ? DUK_BC_A_MAX : st.num_total_pairs); #endif DUK_ASSERT(comp_ctx->curr_token.t == DUK_TOK_RCURLY); duk__advance(comp_ctx); duk__ivalue_regconst(res, st.reg_obj); return; syntax_error: DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_OBJECT_LITERAL); } /* Parse argument list. Arguments are written to temps starting from * "next temp". Returns number of arguments parsed. Expects left paren * to be already eaten, and eats the right paren before returning. */ DUK_LOCAL duk_int_t duk__parse_arguments(duk_compiler_ctx *comp_ctx, duk_ivalue *res) { duk_int_t nargs = 0; duk_regconst_t reg_temp; /* Note: expect that caller has already eaten the left paren */ DUK_DDD(DUK_DDDPRINT("start parsing arguments, prev_token.t=%ld, curr_token.t=%ld", (long) comp_ctx->prev_token.t, (long) comp_ctx->curr_token.t)); for (;;) { if (comp_ctx->curr_token.t == DUK_TOK_RPAREN) { break; } if (nargs > 0) { duk__advance_expect(comp_ctx, DUK_TOK_COMMA); } /* We want the argument expression value to go to "next temp" * without additional moves. That should almost always be the * case, but we double check after expression parsing. * * This is not the cleanest possible approach. */ reg_temp = DUK__ALLOCTEMP(comp_ctx); /* bump up "allocated" reg count, just in case */ DUK__SETTEMP(comp_ctx, reg_temp); /* binding power must be high enough to NOT allow comma expressions directly */ duk__expr_toforcedreg(comp_ctx, res, DUK__BP_COMMA /*rbp_flags*/, reg_temp); /* always allow 'in', coerce to 'tr' just in case */ DUK__SETTEMP(comp_ctx, reg_temp + 1); nargs++; DUK_DDD(DUK_DDDPRINT("argument #%ld written into reg %ld", (long) nargs, (long) reg_temp)); } /* eat the right paren */ duk__advance_expect(comp_ctx, DUK_TOK_RPAREN); DUK_DDD(DUK_DDDPRINT("end parsing arguments")); return nargs; } DUK_LOCAL duk_bool_t duk__expr_is_empty(duk_compiler_ctx *comp_ctx) { /* empty expressions can be detected conveniently with nud/led counts */ return (comp_ctx->curr_func.nud_count == 0) && (comp_ctx->curr_func.led_count == 0); } DUK_LOCAL void duk__expr_nud(duk_compiler_ctx *comp_ctx, duk_ivalue *res) { duk_hthread *thr = comp_ctx->thr; duk_token *tk; duk_regconst_t temp_at_entry; duk_small_uint_t tok; duk_uint32_t args; /* temp variable to pass constants and flags to shared code */ /* * ctx->prev_token token to process with duk__expr_nud() * ctx->curr_token updated by caller * * Note: the token in the switch below has already been eaten. */ temp_at_entry = DUK__GETTEMP(comp_ctx); comp_ctx->curr_func.nud_count++; tk = &comp_ctx->prev_token; tok = tk->t; res->t = DUK_IVAL_NONE; DUK_DDD(DUK_DDDPRINT("duk__expr_nud(), prev_token.t=%ld, allow_in=%ld, paren_level=%ld", (long) tk->t, (long) comp_ctx->curr_func.allow_in, (long) comp_ctx->curr_func.paren_level)); switch (tok) { /* PRIMARY EXPRESSIONS */ case DUK_TOK_THIS: { duk_regconst_t reg_temp; reg_temp = DUK__ALLOCTEMP(comp_ctx); duk__emit_bc(comp_ctx, DUK_OP_LDTHIS, reg_temp); duk__ivalue_regconst(res, reg_temp); return; } case DUK_TOK_IDENTIFIER: { duk__ivalue_var_hstring(comp_ctx, res, tk->str1); return; } case DUK_TOK_NULL: { duk_push_null(thr); goto plain_value; } case DUK_TOK_TRUE: { duk_push_true(thr); goto plain_value; } case DUK_TOK_FALSE: { duk_push_false(thr); goto plain_value; } case DUK_TOK_NUMBER: { duk_push_number(thr, tk->num); goto plain_value; } case DUK_TOK_STRING: { DUK_ASSERT(tk->str1 != NULL); duk_push_hstring(thr, tk->str1); goto plain_value; } case DUK_TOK_REGEXP: { #if defined(DUK_USE_REGEXP_SUPPORT) duk_regconst_t reg_temp; duk_regconst_t rc_re_bytecode; /* const */ duk_regconst_t rc_re_source; /* const */ DUK_ASSERT(tk->str1 != NULL); DUK_ASSERT(tk->str2 != NULL); DUK_DDD(DUK_DDDPRINT("emitting regexp op, str1=%!O, str2=%!O", (duk_heaphdr *) tk->str1, (duk_heaphdr *) tk->str2)); reg_temp = DUK__ALLOCTEMP(comp_ctx); duk_push_hstring(thr, tk->str1); duk_push_hstring(thr, tk->str2); /* [ ... pattern flags ] */ duk_regexp_compile(thr); /* [ ... escaped_source bytecode ] */ rc_re_bytecode = duk__getconst(comp_ctx); rc_re_source = duk__getconst(comp_ctx); duk__emit_a_b_c(comp_ctx, DUK_OP_REGEXP | DUK__EMIT_FLAG_BC_REGCONST, reg_temp /*a*/, rc_re_bytecode /*b*/, rc_re_source /*c*/); duk__ivalue_regconst(res, reg_temp); return; #else /* DUK_USE_REGEXP_SUPPORT */ goto syntax_error; #endif /* DUK_USE_REGEXP_SUPPORT */ } case DUK_TOK_LBRACKET: { DUK_DDD(DUK_DDDPRINT("parsing array literal")); duk__nud_array_literal(comp_ctx, res); return; } case DUK_TOK_LCURLY: { DUK_DDD(DUK_DDDPRINT("parsing object literal")); duk__nud_object_literal(comp_ctx, res); return; } case DUK_TOK_LPAREN: { duk_bool_t prev_allow_in; comp_ctx->curr_func.paren_level++; prev_allow_in = comp_ctx->curr_func.allow_in; comp_ctx->curr_func.allow_in = 1; /* reset 'allow_in' for parenthesized expression */ duk__expr(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/); /* Expression, terminates at a ')' */ duk__advance_expect(comp_ctx, DUK_TOK_RPAREN); comp_ctx->curr_func.allow_in = prev_allow_in; comp_ctx->curr_func.paren_level--; return; } /* MEMBER/NEW/CALL EXPRESSIONS */ case DUK_TOK_NEW: { /* * Parsing an expression starting with 'new' is tricky because * there are multiple possible productions deriving from * LeftHandSideExpression which begin with 'new'. * * We currently resort to one-token lookahead to distinguish the * cases. Hopefully this is correct. The binding power must be * such that parsing ends at an LPAREN (CallExpression) but not at * a PERIOD or LBRACKET (MemberExpression). * * See doc/compiler.rst for discussion on the parsing approach, * and testcases/test-dev-new.js for a bunch of documented tests. */ duk_regconst_t reg_target; duk_int_t nargs; DUK_DDD(DUK_DDDPRINT("begin parsing new expression")); reg_target = DUK__ALLOCTEMPS(comp_ctx, 2); #if defined(DUK_USE_ES6) if (comp_ctx->curr_token.t == DUK_TOK_PERIOD) { /* new.target */ DUK_DDD(DUK_DDDPRINT("new.target")); duk__advance(comp_ctx); if (comp_ctx->curr_token.t_nores != DUK_TOK_IDENTIFIER || !duk_hstring_equals_ascii_cstring(comp_ctx->curr_token.str1, "target")) { goto syntax_error_newtarget; } if (comp_ctx->curr_func.is_global) { goto syntax_error_newtarget; } duk__advance(comp_ctx); duk__emit_bc(comp_ctx, DUK_OP_NEWTARGET, reg_target); duk__ivalue_regconst(res, reg_target); return; } #endif /* DUK_USE_ES6 */ duk__expr_toforcedreg(comp_ctx, res, DUK__BP_CALL /*rbp_flags*/, reg_target /*forced_reg*/); duk__emit_bc(comp_ctx, DUK_OP_NEWOBJ, reg_target + 1); /* default instance */ DUK__SETTEMP(comp_ctx, reg_target + 2); /* XXX: 'new obj.noSuch()' doesn't use GETPROPC now which * makes the error message worse than for obj.noSuch(). */ if (comp_ctx->curr_token.t == DUK_TOK_LPAREN) { /* 'new' MemberExpression Arguments */ DUK_DDD(DUK_DDDPRINT("new expression has argument list")); duk__advance(comp_ctx); nargs = duk__parse_arguments(comp_ctx, res); /* parse args starting from "next temp", reg_target + 1 */ /* right paren eaten */ } else { /* 'new' MemberExpression */ DUK_DDD(DUK_DDDPRINT("new expression has no argument list")); nargs = 0; } duk__emit_a_bc(comp_ctx, DUK_OP_CALL0 | DUK_BC_CALL_FLAG_CONSTRUCT, nargs /*num_args*/, reg_target /*target*/); DUK_DDD(DUK_DDDPRINT("end parsing new expression")); duk__ivalue_regconst(res, reg_target); return; } /* FUNCTION EXPRESSIONS */ case DUK_TOK_FUNCTION: { /* Function expression. Note that any statement beginning with 'function' * is handled by the statement parser as a function declaration, or a * non-standard function expression/statement (or a SyntaxError). We only * handle actual function expressions (occurring inside an expression) here. * * O(depth^2) parse count for inner functions is handled by recording a * lexer offset on the first compilation pass, so that the function can * be efficiently skipped on the second pass. This is encapsulated into * duk__parse_func_like_fnum(). */ duk_regconst_t reg_temp; duk_int_t fnum; reg_temp = DUK__ALLOCTEMP(comp_ctx); /* curr_token follows 'function' */ fnum = duk__parse_func_like_fnum(comp_ctx, 0 /*flags*/); DUK_DDD(DUK_DDDPRINT("parsed inner function -> fnum %ld", (long) fnum)); duk__emit_a_bc(comp_ctx, DUK_OP_CLOSURE, reg_temp /*a*/, (duk_regconst_t) fnum /*bc*/); duk__ivalue_regconst(res, reg_temp); return; } /* UNARY EXPRESSIONS */ case DUK_TOK_DELETE: { /* Delete semantics are a bit tricky. The description in E5 specification * is kind of confusing, because it distinguishes between resolvability of * a reference (which is only known at runtime) seemingly at compile time * (= SyntaxError throwing). */ duk__expr(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/); /* UnaryExpression */ if (res->t == DUK_IVAL_VAR) { /* not allowed in strict mode, regardless of whether resolves; * in non-strict mode DELVAR handles both non-resolving and * resolving cases (the specification description is a bit confusing). */ duk_regconst_t reg_temp; duk_regconst_t reg_varbind; duk_regconst_t rc_varname; if (comp_ctx->curr_func.is_strict) { DUK_ERROR_SYNTAX(thr, DUK_STR_CANNOT_DELETE_IDENTIFIER); } DUK__SETTEMP(comp_ctx, temp_at_entry); reg_temp = DUK__ALLOCTEMP(comp_ctx); duk_dup(thr, res->x1.valstack_idx); if (duk__lookup_lhs(comp_ctx, ®_varbind, &rc_varname)) { /* register bound variables are non-configurable -> always false */ duk__emit_bc(comp_ctx, DUK_OP_LDFALSE, reg_temp); } else { duk_dup(thr, res->x1.valstack_idx); rc_varname = duk__getconst(comp_ctx); duk__emit_a_bc(comp_ctx, DUK_OP_DELVAR, reg_temp, rc_varname); } duk__ivalue_regconst(res, reg_temp); } else if (res->t == DUK_IVAL_PROP) { duk_regconst_t reg_temp; duk_regconst_t reg_obj; duk_regconst_t rc_key; DUK__SETTEMP(comp_ctx, temp_at_entry); reg_temp = DUK__ALLOCTEMP(comp_ctx); reg_obj = duk__ispec_toregconst_raw(comp_ctx, &res->x1, -1 /*forced_reg*/, 0 /*flags*/); /* don't allow const */ rc_key = duk__ispec_toregconst_raw(comp_ctx, &res->x2, -1 /*forced_reg*/, DUK__IVAL_FLAG_ALLOW_CONST /*flags*/); duk__emit_a_b_c(comp_ctx, DUK_OP_DELPROP | DUK__EMIT_FLAG_BC_REGCONST, reg_temp, reg_obj, rc_key); duk__ivalue_regconst(res, reg_temp); } else { /* non-Reference deletion is always 'true', even in strict mode */ duk_push_true(thr); goto plain_value; } return; } case DUK_TOK_VOID: { duk__expr_toplain_ignore(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/); /* UnaryExpression */ duk_push_undefined(thr); goto plain_value; } case DUK_TOK_TYPEOF: { /* 'typeof' must handle unresolvable references without throwing * a ReferenceError (E5 Section 11.4.3). Register mapped values * will never be unresolvable so special handling is only required * when an identifier is a "slow path" one. */ duk__expr(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/); /* UnaryExpression */ if (res->t == DUK_IVAL_VAR) { duk_regconst_t reg_varbind; duk_regconst_t rc_varname; duk_regconst_t reg_temp; duk_dup(thr, res->x1.valstack_idx); if (!duk__lookup_lhs(comp_ctx, ®_varbind, &rc_varname)) { DUK_DDD(DUK_DDDPRINT("typeof for an identifier name which could not be resolved " "at compile time, need to use special run-time handling")); reg_temp = DUK__ALLOCTEMP(comp_ctx); duk__emit_a_bc(comp_ctx, DUK_OP_TYPEOFID, reg_temp, rc_varname); duk__ivalue_regconst(res, reg_temp); return; } } args = DUK_OP_TYPEOF; goto unary; } case DUK_TOK_INCREMENT: { args = (DUK_OP_PREINCP << 8) + DUK_OP_PREINCR; goto preincdec; } case DUK_TOK_DECREMENT: { args = (DUK_OP_PREDECP << 8) + DUK_OP_PREDECR; goto preincdec; } case DUK_TOK_ADD: { /* unary plus */ duk__expr(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/); /* UnaryExpression */ if (res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_VALUE && duk_is_number(thr, res->x1.valstack_idx)) { /* unary plus of a number is identity */ return; } args = DUK_OP_UNP; goto unary; } case DUK_TOK_SUB: { /* unary minus */ duk__expr(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/); /* UnaryExpression */ if (res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_VALUE && duk_is_number(thr, res->x1.valstack_idx)) { /* this optimization is important to handle negative literals * (which are not directly provided by the lexical grammar) */ duk_tval *tv_num; duk_double_union du; tv_num = DUK_GET_TVAL_POSIDX(thr, res->x1.valstack_idx); DUK_ASSERT(tv_num != NULL); DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_num)); du.d = DUK_TVAL_GET_NUMBER(tv_num); du.d = -du.d; DUK_DBLUNION_NORMALIZE_NAN_CHECK(&du); DUK_TVAL_SET_NUMBER(tv_num, du.d); return; } args = DUK_OP_UNM; goto unary; } case DUK_TOK_BNOT: { duk__expr(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/); /* UnaryExpression */ args = DUK_OP_BNOT; goto unary; } case DUK_TOK_LNOT: { duk__expr(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/); /* UnaryExpression */ if (res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_VALUE) { /* Very minimal inlining to handle common idioms '!0' and '!1', * and also boolean arguments like '!false' and '!true'. */ duk_tval *tv_val; tv_val = DUK_GET_TVAL_POSIDX(thr, res->x1.valstack_idx); DUK_ASSERT(tv_val != NULL); if (DUK_TVAL_IS_NUMBER(tv_val)) { duk_double_t d; d = DUK_TVAL_GET_NUMBER(tv_val); if (d == 0.0) { /* Matches both +0 and -0 on purpose. */ DUK_DDD(DUK_DDDPRINT("inlined lnot: !0 -> true")); DUK_TVAL_SET_BOOLEAN_TRUE(tv_val); return; } else if (d == 1.0) { DUK_DDD(DUK_DDDPRINT("inlined lnot: !1 -> false")); DUK_TVAL_SET_BOOLEAN_FALSE(tv_val); return; } } else if (DUK_TVAL_IS_BOOLEAN(tv_val)) { duk_small_uint_t v; v = DUK_TVAL_GET_BOOLEAN(tv_val); DUK_DDD(DUK_DDDPRINT("inlined lnot boolean: %ld", (long) v)); DUK_ASSERT(v == 0 || v == 1); DUK_TVAL_SET_BOOLEAN(tv_val, v ^ 0x01); return; } } args = DUK_OP_LNOT; goto unary; } } /* end switch */ DUK_ERROR_SYNTAX(thr, DUK_STR_PARSE_ERROR); return; unary: { /* Unary opcodes use just the 'BC' register source because it * matches current shuffle limits, and maps cleanly to 16 high * bits of the opcode. */ duk_regconst_t reg_src, reg_res; reg_src = duk__ivalue_toregconst_raw(comp_ctx, res, -1 /*forced_reg*/, 0 /*flags*/); if (DUK__ISREG_TEMP(comp_ctx, reg_src)) { reg_res = reg_src; } else { reg_res = DUK__ALLOCTEMP(comp_ctx); } duk__emit_a_bc(comp_ctx, args, reg_res, reg_src); duk__ivalue_regconst(res, reg_res); return; } preincdec: { /* preincrement and predecrement */ duk_regconst_t reg_res; duk_small_uint_t args_op1 = args & 0xff; /* DUK_OP_PREINCR/DUK_OP_PREDECR */ duk_small_uint_t args_op2 = args >> 8; /* DUK_OP_PREINCP_RR/DUK_OP_PREDECP_RR */ /* Specific assumptions for opcode numbering. */ DUK_ASSERT(DUK_OP_PREINCR + 4 == DUK_OP_PREINCV); DUK_ASSERT(DUK_OP_PREDECR + 4 == DUK_OP_PREDECV); reg_res = DUK__ALLOCTEMP(comp_ctx); duk__expr(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/); /* UnaryExpression */ if (res->t == DUK_IVAL_VAR) { duk_hstring *h_varname; duk_regconst_t reg_varbind; duk_regconst_t rc_varname; h_varname = duk_known_hstring(thr, res->x1.valstack_idx); if (duk__hstring_is_eval_or_arguments_in_strict_mode(comp_ctx, h_varname)) { goto syntax_error; } duk_dup(thr, res->x1.valstack_idx); if (duk__lookup_lhs(comp_ctx, ®_varbind, &rc_varname)) { duk__emit_a_bc(comp_ctx, args_op1, /* e.g. DUK_OP_PREINCR */ reg_res, reg_varbind); } else { duk__emit_a_bc(comp_ctx, args_op1 + 4, /* e.g. DUK_OP_PREINCV */ reg_res, rc_varname); } DUK_DDD(DUK_DDDPRINT("preincdec to '%!O' -> reg_varbind=%ld, rc_varname=%ld", (duk_heaphdr *) h_varname, (long) reg_varbind, (long) rc_varname)); } else if (res->t == DUK_IVAL_PROP) { duk_regconst_t reg_obj; /* allocate to reg only (not const) */ duk_regconst_t rc_key; reg_obj = duk__ispec_toregconst_raw(comp_ctx, &res->x1, -1 /*forced_reg*/, 0 /*flags*/); /* don't allow const */ rc_key = duk__ispec_toregconst_raw(comp_ctx, &res->x2, -1 /*forced_reg*/, DUK__IVAL_FLAG_ALLOW_CONST /*flags*/); duk__emit_a_b_c(comp_ctx, args_op2 | DUK__EMIT_FLAG_BC_REGCONST, /* e.g. DUK_OP_PREINCP */ reg_res, reg_obj, rc_key); } else { /* Technically return value is not needed because INVLHS will * unconditially throw a ReferenceError. Coercion is necessary * for proper semantics (consider ToNumber() called for an object). * Use DUK_OP_UNP with a dummy register to get ToNumber(). */ duk__ivalue_toforcedreg(comp_ctx, res, reg_res); duk__emit_bc(comp_ctx, DUK_OP_UNP, reg_res); /* for side effects, result ignored */ duk__emit_op_only(comp_ctx, DUK_OP_INVLHS); } DUK__SETTEMP(comp_ctx, reg_res + 1); duk__ivalue_regconst(res, reg_res); return; } plain_value: { /* Stack top contains plain value */ duk__ivalue_plain_fromstack(comp_ctx, res); return; } #if defined(DUK_USE_ES6) syntax_error_newtarget: DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_NEWTARGET); #endif syntax_error: DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_EXPRESSION); } /* XXX: add flag to indicate whether caller cares about return value; this * affects e.g. handling of assignment expressions. This change needs API * changes elsewhere too. */ DUK_LOCAL void duk__expr_led(duk_compiler_ctx *comp_ctx, duk_ivalue *left, duk_ivalue *res) { duk_hthread *thr = comp_ctx->thr; duk_token *tk; duk_small_uint_t tok; duk_uint32_t args; /* temp variable to pass constants and flags to shared code */ /* * ctx->prev_token token to process with duk__expr_led() * ctx->curr_token updated by caller */ comp_ctx->curr_func.led_count++; /* The token in the switch has already been eaten here */ tk = &comp_ctx->prev_token; tok = tk->t; DUK_DDD(DUK_DDDPRINT("duk__expr_led(), prev_token.t=%ld, allow_in=%ld, paren_level=%ld", (long) tk->t, (long) comp_ctx->curr_func.allow_in, (long) comp_ctx->curr_func.paren_level)); /* XXX: default priority for infix operators is duk__expr_lbp(tok) -> get it here? */ switch (tok) { /* PRIMARY EXPRESSIONS */ case DUK_TOK_PERIOD: { /* Property access expressions are critical for correct LHS ordering, * see comments in duk__expr()! * * A conservative approach would be to use duk__ivalue_totempconst() * for 'left'. However, allowing a reg-bound variable seems safe here * and is nice because "foo.bar" is a common expression. If the ivalue * is used in an expression a GETPROP will occur before any changes to * the base value can occur. If the ivalue is used as an assignment * LHS, the assignment code will ensure the base value is safe from * RHS mutation. */ /* XXX: This now coerces an identifier into a GETVAR to a temp, which * causes an extra LDREG in call setup. It's sufficient to coerce to a * unary ivalue? */ duk__ivalue_toplain(comp_ctx, left); /* NB: must accept reserved words as property name */ if (comp_ctx->curr_token.t_nores != DUK_TOK_IDENTIFIER) { DUK_ERROR_SYNTAX(thr, DUK_STR_EXPECTED_IDENTIFIER); } res->t = DUK_IVAL_PROP; duk__copy_ispec(comp_ctx, &left->x1, &res->x1); /* left.x1 -> res.x1 */ DUK_ASSERT(comp_ctx->curr_token.str1 != NULL); duk_push_hstring(thr, comp_ctx->curr_token.str1); duk_replace(thr, res->x2.valstack_idx); res->x2.t = DUK_ISPEC_VALUE; /* special RegExp literal handling after IdentifierName */ comp_ctx->curr_func.reject_regexp_in_adv = 1; duk__advance(comp_ctx); return; } case DUK_TOK_LBRACKET: { /* Property access expressions are critical for correct LHS ordering, * see comments in duk__expr()! */ /* XXX: optimize temp reg use */ /* XXX: similar coercion issue as in DUK_TOK_PERIOD */ /* XXX: coerce to regs? it might be better for enumeration use, where the * same PROP ivalue is used multiple times. Or perhaps coerce PROP further * there? */ /* XXX: for simple cases like x['y'] an unnecessary LDREG is * emitted for the base value; could avoid it if we knew that * the key expression is safe (e.g. just a single literal). */ /* The 'left' value must not be a register bound variable * because it may be mutated during the rest of the expression * and E5.1 Section 11.2.1 specifies the order of evaluation * so that the base value is evaluated first. * See: test-bug-nested-prop-mutate.js. */ duk__ivalue_totempconst(comp_ctx, left); duk__expr_toplain(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/); /* Expression, ']' terminates */ duk__advance_expect(comp_ctx, DUK_TOK_RBRACKET); res->t = DUK_IVAL_PROP; duk__copy_ispec(comp_ctx, &res->x1, &res->x2); /* res.x1 -> res.x2 */ duk__copy_ispec(comp_ctx, &left->x1, &res->x1); /* left.x1 -> res.x1 */ return; } case DUK_TOK_LPAREN: { /* function call */ duk_regconst_t reg_cs = DUK__ALLOCTEMPS(comp_ctx, 2); duk_int_t nargs; duk_small_uint_t call_op = DUK_OP_CALL0; /* XXX: attempt to get the call result to "next temp" whenever * possible to avoid unnecessary register shuffles. */ /* * Setup call: target and 'this' binding. Three cases: * * 1. Identifier base (e.g. "foo()") * 2. Property base (e.g. "foo.bar()") * 3. Register base (e.g. "foo()()"; i.e. when a return value is a function) */ if (left->t == DUK_IVAL_VAR) { duk_hstring *h_varname; duk_regconst_t reg_varbind; duk_regconst_t rc_varname; DUK_DDD(DUK_DDDPRINT("function call with identifier base")); h_varname = duk_known_hstring(thr, left->x1.valstack_idx); if (h_varname == DUK_HTHREAD_STRING_EVAL(thr)) { /* Potential direct eval call detected, flag the CALL * so that a run-time "direct eval" check is made and * special behavior may be triggered. Note that this * does not prevent 'eval' from being register bound. */ DUK_DDD(DUK_DDDPRINT("function call with identifier 'eval' " "-> using EVALCALL, marking function " "as may_direct_eval")); call_op |= DUK_BC_CALL_FLAG_CALLED_AS_EVAL; comp_ctx->curr_func.may_direct_eval = 1; } duk_dup(thr, left->x1.valstack_idx); if (duk__lookup_lhs(comp_ctx, ®_varbind, &rc_varname)) { duk__emit_a_bc(comp_ctx, DUK_OP_CSREG | DUK__EMIT_FLAG_A_IS_SOURCE, reg_varbind, reg_cs + 0); } else { /* XXX: expand target register or constant field to * reduce shuffling. */ DUK_ASSERT(DUK__ISCONST(rc_varname)); duk__emit_a_b(comp_ctx, DUK_OP_CSVAR | DUK__EMIT_FLAG_BC_REGCONST, reg_cs + 0, rc_varname); } } else if (left->t == DUK_IVAL_PROP) { /* Call through a property lookup, E5 Section 11.2.3, step 6.a.i, * E5 Section 10.4.3. There used to be a separate CSPROP opcode * but a typical call setup took 3 opcodes (e.g. LDREG, LDCONST, * CSPROP) and the same can be achieved with ordinary loads. */ #if defined(DUK_USE_VERBOSE_ERRORS) duk_regconst_t reg_key; #endif DUK_DDD(DUK_DDDPRINT("function call with property base")); /* XXX: For Math.sin() this generates: LDCONST + LDREG + * GETPROPC + call. The LDREG is unnecessary because LDCONST * could be loaded directly into reg_cs + 1. This doesn't * happen now because a variable cannot be in left->x1 of a * DUK_IVAL_PROP. We could notice that left->x1 is a temp * and reuse, but it would still be in the wrong position * (reg_cs + 0 rather than reg_cs + 1). */ duk__ispec_toforcedreg(comp_ctx, &left->x1, reg_cs + 1); /* base */ #if defined(DUK_USE_VERBOSE_ERRORS) reg_key = duk__ispec_toregconst_raw(comp_ctx, &left->x2, -1, DUK__IVAL_FLAG_ALLOW_CONST /*flags*/); duk__emit_a_b_c(comp_ctx, DUK_OP_GETPROPC | DUK__EMIT_FLAG_BC_REGCONST, reg_cs + 0, reg_cs + 1, reg_key); #else duk__ivalue_toforcedreg(comp_ctx, left, reg_cs + 0); /* base[key] */ #endif } else { DUK_DDD(DUK_DDDPRINT("function call with register base")); duk__ivalue_toforcedreg(comp_ctx, left, reg_cs + 0); #if 0 duk__emit_a_bc(comp_ctx, DUK_OP_CSREG | DUK__EMIT_FLAG_A_IS_SOURCE, reg_cs + 0, reg_cs + 0); /* in-place setup */ #endif /* Because of in-place setup, REGCS is equivalent to * just this LDUNDEF. */ duk__emit_bc(comp_ctx, DUK_OP_LDUNDEF, reg_cs + 1); } DUK__SETTEMP(comp_ctx, reg_cs + 2); nargs = duk__parse_arguments(comp_ctx, res); /* parse args starting from "next temp" */ /* Tailcalls are handled by back-patching the already emitted opcode * later in return statement parser. */ duk__emit_a_bc(comp_ctx, call_op, (duk_regconst_t) nargs /*numargs*/, reg_cs /*basereg*/); DUK__SETTEMP(comp_ctx, reg_cs + 1); /* result in csreg */ duk__ivalue_regconst(res, reg_cs); return; } /* POSTFIX EXPRESSION */ case DUK_TOK_INCREMENT: { args = (DUK_OP_POSTINCP_RR << 16) + (DUK_OP_POSTINCR << 8) + 0; goto postincdec; } case DUK_TOK_DECREMENT: { args = (DUK_OP_POSTDECP_RR << 16) + (DUK_OP_POSTDECR << 8) + 0; goto postincdec; } /* EXPONENTIATION EXPRESSION */ #if defined(DUK_USE_ES7_EXP_OPERATOR) case DUK_TOK_EXP: { args = (DUK_OP_EXP << 8) + DUK__BP_EXPONENTIATION - 1; /* UnaryExpression */ goto binary; } #endif /* MULTIPLICATIVE EXPRESSION */ case DUK_TOK_MUL: { args = (DUK_OP_MUL << 8) + DUK__BP_MULTIPLICATIVE; /* ExponentiationExpression */ goto binary; } case DUK_TOK_DIV: { args = (DUK_OP_DIV << 8) + DUK__BP_MULTIPLICATIVE; /* ExponentiationExpression */ goto binary; } case DUK_TOK_MOD: { args = (DUK_OP_MOD << 8) + DUK__BP_MULTIPLICATIVE; /* ExponentiationExpression */ goto binary; } /* ADDITIVE EXPRESSION */ case DUK_TOK_ADD: { args = (DUK_OP_ADD << 8) + DUK__BP_ADDITIVE; /* MultiplicativeExpression */ goto binary; } case DUK_TOK_SUB: { args = (DUK_OP_SUB << 8) + DUK__BP_ADDITIVE; /* MultiplicativeExpression */ goto binary; } /* SHIFT EXPRESSION */ case DUK_TOK_ALSHIFT: { /* << */ args = (DUK_OP_BASL << 8) + DUK__BP_SHIFT; goto binary; } case DUK_TOK_ARSHIFT: { /* >> */ args = (DUK_OP_BASR << 8) + DUK__BP_SHIFT; goto binary; } case DUK_TOK_RSHIFT: { /* >>> */ args = (DUK_OP_BLSR << 8) + DUK__BP_SHIFT; goto binary; } /* RELATIONAL EXPRESSION */ case DUK_TOK_LT: { /* < */ args = (DUK_OP_LT << 8) + DUK__BP_RELATIONAL; goto binary; } case DUK_TOK_GT: { args = (DUK_OP_GT << 8) + DUK__BP_RELATIONAL; goto binary; } case DUK_TOK_LE: { args = (DUK_OP_LE << 8) + DUK__BP_RELATIONAL; goto binary; } case DUK_TOK_GE: { args = (DUK_OP_GE << 8) + DUK__BP_RELATIONAL; goto binary; } case DUK_TOK_INSTANCEOF: { args = (DUK_OP_INSTOF << 8) + DUK__BP_RELATIONAL; goto binary; } case DUK_TOK_IN: { args = (DUK_OP_IN << 8) + DUK__BP_RELATIONAL; goto binary; } /* EQUALITY EXPRESSION */ case DUK_TOK_EQ: { args = (DUK_OP_EQ << 8) + DUK__BP_EQUALITY; goto binary; } case DUK_TOK_NEQ: { args = (DUK_OP_NEQ << 8) + DUK__BP_EQUALITY; goto binary; } case DUK_TOK_SEQ: { args = (DUK_OP_SEQ << 8) + DUK__BP_EQUALITY; goto binary; } case DUK_TOK_SNEQ: { args = (DUK_OP_SNEQ << 8) + DUK__BP_EQUALITY; goto binary; } /* BITWISE EXPRESSIONS */ case DUK_TOK_BAND: { args = (DUK_OP_BAND << 8) + DUK__BP_BAND; goto binary; } case DUK_TOK_BXOR: { args = (DUK_OP_BXOR << 8) + DUK__BP_BXOR; goto binary; } case DUK_TOK_BOR: { args = (DUK_OP_BOR << 8) + DUK__BP_BOR; goto binary; } /* LOGICAL EXPRESSIONS */ case DUK_TOK_LAND: { /* syntactically left-associative but parsed as right-associative */ args = (1 << 8) + DUK__BP_LAND - 1; goto binary_logical; } case DUK_TOK_LOR: { /* syntactically left-associative but parsed as right-associative */ args = (0 << 8) + DUK__BP_LOR - 1; goto binary_logical; } /* CONDITIONAL EXPRESSION */ case DUK_TOK_QUESTION: { /* XXX: common reg allocation need is to reuse a sub-expression's temp reg, * but only if it really is a temp. Nothing fancy here now. */ duk_regconst_t reg_temp; duk_int_t pc_jump1; duk_int_t pc_jump2; reg_temp = DUK__ALLOCTEMP(comp_ctx); duk__ivalue_toforcedreg(comp_ctx, left, reg_temp); duk__emit_if_true_skip(comp_ctx, reg_temp); pc_jump1 = duk__emit_jump_empty(comp_ctx); /* jump to false */ duk__expr_toforcedreg(comp_ctx, res, DUK__BP_COMMA /*rbp_flags*/, reg_temp /*forced_reg*/); /* AssignmentExpression */ duk__advance_expect(comp_ctx, DUK_TOK_COLON); pc_jump2 = duk__emit_jump_empty(comp_ctx); /* jump to end */ duk__patch_jump_here(comp_ctx, pc_jump1); duk__expr_toforcedreg(comp_ctx, res, DUK__BP_COMMA /*rbp_flags*/, reg_temp /*forced_reg*/); /* AssignmentExpression */ duk__patch_jump_here(comp_ctx, pc_jump2); DUK__SETTEMP(comp_ctx, reg_temp + 1); duk__ivalue_regconst(res, reg_temp); return; } /* ASSIGNMENT EXPRESSION */ case DUK_TOK_EQUALSIGN: { /* * Assignments are right associative, allows e.g. * a = 5; * a += b = 9; // same as a += (b = 9) * -> expression value 14, a = 14, b = 9 * * Right associativiness is reflected in the BP for recursion, * "-1" ensures assignment operations are allowed. * * XXX: just use DUK__BP_COMMA (i.e. no need for 2-step bp levels)? */ args = (DUK_OP_NONE << 8) + DUK__BP_ASSIGNMENT - 1; /* DUK_OP_NONE marks a 'plain' assignment */ goto assign; } case DUK_TOK_ADD_EQ: { /* right associative */ args = (DUK_OP_ADD << 8) + DUK__BP_ASSIGNMENT - 1; goto assign; } case DUK_TOK_SUB_EQ: { /* right associative */ args = (DUK_OP_SUB << 8) + DUK__BP_ASSIGNMENT - 1; goto assign; } case DUK_TOK_MUL_EQ: { /* right associative */ args = (DUK_OP_MUL << 8) + DUK__BP_ASSIGNMENT - 1; goto assign; } case DUK_TOK_DIV_EQ: { /* right associative */ args = (DUK_OP_DIV << 8) + DUK__BP_ASSIGNMENT - 1; goto assign; } case DUK_TOK_MOD_EQ: { /* right associative */ args = (DUK_OP_MOD << 8) + DUK__BP_ASSIGNMENT - 1; goto assign; } #if defined(DUK_USE_ES7_EXP_OPERATOR) case DUK_TOK_EXP_EQ: { /* right associative */ args = (DUK_OP_EXP << 8) + DUK__BP_ASSIGNMENT - 1; goto assign; } #endif case DUK_TOK_ALSHIFT_EQ: { /* right associative */ args = (DUK_OP_BASL << 8) + DUK__BP_ASSIGNMENT - 1; goto assign; } case DUK_TOK_ARSHIFT_EQ: { /* right associative */ args = (DUK_OP_BASR << 8) + DUK__BP_ASSIGNMENT - 1; goto assign; } case DUK_TOK_RSHIFT_EQ: { /* right associative */ args = (DUK_OP_BLSR << 8) + DUK__BP_ASSIGNMENT - 1; goto assign; } case DUK_TOK_BAND_EQ: { /* right associative */ args = (DUK_OP_BAND << 8) + DUK__BP_ASSIGNMENT - 1; goto assign; } case DUK_TOK_BOR_EQ: { /* right associative */ args = (DUK_OP_BOR << 8) + DUK__BP_ASSIGNMENT - 1; goto assign; } case DUK_TOK_BXOR_EQ: { /* right associative */ args = (DUK_OP_BXOR << 8) + DUK__BP_ASSIGNMENT - 1; goto assign; } /* COMMA */ case DUK_TOK_COMMA: { /* right associative */ duk__ivalue_toplain_ignore(comp_ctx, left); /* need side effects, not value */ duk__expr_toplain(comp_ctx, res, DUK__BP_COMMA - 1 /*rbp_flags*/); /* return 'res' (of right part) as our result */ return; } default: { break; } } DUK_D(DUK_DPRINT("parse error: unexpected token: %ld", (long) tok)); DUK_ERROR_SYNTAX(thr, DUK_STR_PARSE_ERROR); return; #if 0 /* XXX: shared handling for 'duk__expr_lhs'? */ if (comp_ctx->curr_func.paren_level == 0 && XXX) { comp_ctx->curr_func.duk__expr_lhs = 0; } #endif binary: /* * Shared handling of binary operations * * args = (opcode << 8) + rbp */ { duk__ivalue_toplain(comp_ctx, left); duk__expr_toplain(comp_ctx, res, args & 0xff /*rbp_flags*/); /* combine left->x1 and res->x1 (right->x1, really) -> (left->x1 OP res->x1) */ DUK_ASSERT(left->t == DUK_IVAL_PLAIN); DUK_ASSERT(res->t == DUK_IVAL_PLAIN); res->t = DUK_IVAL_ARITH; res->op = (args >> 8) & 0xff; res->x2.t = res->x1.t; res->x2.regconst = res->x1.regconst; duk_copy(thr, res->x1.valstack_idx, res->x2.valstack_idx); res->x1.t = left->x1.t; res->x1.regconst = left->x1.regconst; duk_copy(thr, left->x1.valstack_idx, res->x1.valstack_idx); DUK_DDD(DUK_DDDPRINT("binary op, res: t=%ld, x1.t=%ld, x1.regconst=0x%08lx, x2.t=%ld, x2.regconst=0x%08lx", (long) res->t, (long) res->x1.t, (unsigned long) res->x1.regconst, (long) res->x2.t, (unsigned long) res->x2.regconst)); return; } binary_logical: /* * Shared handling for logical AND and logical OR. * * args = (truthval << 8) + rbp * * Truthval determines when to skip right-hand-side. * For logical AND truthval=1, for logical OR truthval=0. * * See doc/compiler.rst for discussion on compiling logical * AND and OR expressions. The approach here is very simplistic, * generating extra jumps and multiple evaluations of truth values, * but generates code on-the-fly with only local back-patching. * * Both logical AND and OR are syntactically left-associated. * However, logical ANDs are compiled as right associative * expressions, i.e. "A && B && C" as "A && (B && C)", to allow * skip jumps to skip over the entire tail. Similarly for logical OR. */ { duk_regconst_t reg_temp; duk_int_t pc_jump; duk_small_uint_t args_truthval = args >> 8; duk_small_uint_t args_rbp = args & 0xff; /* XXX: unoptimal use of temps, resetting */ reg_temp = DUK__ALLOCTEMP(comp_ctx); duk__ivalue_toforcedreg(comp_ctx, left, reg_temp); DUK_ASSERT(DUK__ISREG(reg_temp)); duk__emit_bc(comp_ctx, (args_truthval ? DUK_OP_IFTRUE_R : DUK_OP_IFFALSE_R), reg_temp); /* skip jump conditionally */ pc_jump = duk__emit_jump_empty(comp_ctx); duk__expr_toforcedreg(comp_ctx, res, args_rbp /*rbp_flags*/, reg_temp /*forced_reg*/); duk__patch_jump_here(comp_ctx, pc_jump); duk__ivalue_regconst(res, reg_temp); return; } assign: /* * Shared assignment expression handling * * args = (opcode << 8) + rbp * * If 'opcode' is DUK_OP_NONE, plain assignment without arithmetic. * Syntactically valid left-hand-side forms which are not accepted as * left-hand-side values (e.g. as in "f() = 1") must NOT cause a * SyntaxError, but rather a run-time ReferenceError. * * When evaluating X <op>= Y, the LHS (X) is conceptually evaluated * to a temporary first. The RHS is then evaluated. Finally, the * <op> is applied to the initial value of RHS (not the value after * RHS evaluation), and written to X. Doing so concretely generates * inefficient code so we'd like to avoid the temporary when possible. * See: https://github.com/svaarala/duktape/pull/992. * * The expression value (final LHS value, written to RHS) is * conceptually copied into a fresh temporary so that it won't * change even if the LHS/RHS values change in outer expressions. * For example, it'd be generally incorrect for the expression value * to be the RHS register binding, unless there's a guarantee that it * won't change during further expression evaluation. Using the * temporary concretely produces inefficient bytecode, so we try to * avoid the extra temporary for some known-to-be-safe cases. * Currently the only safe case we detect is a "top level assignment", * for example "x = y + z;", where the assignment expression value is * ignored. * See: test-dev-assign-expr.js and test-bug-assign-mutate-gh381.js. */ { duk_small_uint_t args_op = args >> 8; duk_small_uint_t args_rbp = args & 0xff; duk_bool_t toplevel_assign; /* XXX: here we need to know if 'left' is left-hand-side compatible. * That information is no longer available from current expr parsing * state; it would need to be carried into the 'left' ivalue or by * some other means. */ /* A top-level assignment is e.g. "x = y;". For these it's safe * to use the RHS as-is as the expression value, even if the RHS * is a reg-bound identifier. The RHS ('res') is right associative * so it has consumed all other assignment level operations; the * only relevant lower binding power construct is comma operator * which will ignore the expression value provided here. Usually * the top level assignment expression value is ignored, but it * is relevant for e.g. eval code. */ toplevel_assign = (comp_ctx->curr_func.nud_count == 1 && /* one token before */ comp_ctx->curr_func.led_count == 1); /* one operator (= assign) */ DUK_DDD(DUK_DDDPRINT("assignment: nud_count=%ld, led_count=%ld, toplevel_assign=%ld", (long) comp_ctx->curr_func.nud_count, (long) comp_ctx->curr_func.led_count, (long) toplevel_assign)); if (left->t == DUK_IVAL_VAR) { duk_hstring *h_varname; duk_regconst_t reg_varbind; duk_regconst_t rc_varname; DUK_ASSERT(left->x1.t == DUK_ISPEC_VALUE); /* LHS is already side effect free */ h_varname = duk_known_hstring(thr, left->x1.valstack_idx); if (duk__hstring_is_eval_or_arguments_in_strict_mode(comp_ctx, h_varname)) { /* E5 Section 11.13.1 (and others for other assignments), step 4. */ goto syntax_error_lvalue; } duk_dup(thr, left->x1.valstack_idx); (void) duk__lookup_lhs(comp_ctx, ®_varbind, &rc_varname); if (args_op == DUK_OP_NONE) { duk__expr(comp_ctx, res, args_rbp /*rbp_flags*/); if (toplevel_assign) { /* Any 'res' will do. */ DUK_DDD(DUK_DDDPRINT("plain assignment, toplevel assign, use as is")); } else { /* 'res' must be a plain ivalue, and not register-bound variable. */ DUK_DDD(DUK_DDDPRINT("plain assignment, not toplevel assign, ensure not a reg-bound identifier")); if (res->t != DUK_IVAL_PLAIN || (res->x1.t == DUK_ISPEC_REGCONST && DUK__ISREG_NOTTEMP(comp_ctx, res->x1.regconst))) { duk__ivalue_totempconst(comp_ctx, res); } } } else { /* For X <op>= Y we need to evaluate the pre-op * value of X before evaluating the RHS: the RHS * can change X, but when we do <op> we must use * the pre-op value. */ duk_regconst_t reg_temp; reg_temp = DUK__ALLOCTEMP(comp_ctx); if (reg_varbind >= 0) { duk_regconst_t reg_res; duk_regconst_t reg_src; duk_int_t pc_temp_load; duk_int_t pc_before_rhs; duk_int_t pc_after_rhs; if (toplevel_assign) { /* 'reg_varbind' is the operation result and can also * become the expression value for top level assignments * such as: "var x; x += y;". */ DUK_DD(DUK_DDPRINT("<op>= expression is top level, write directly to reg_varbind")); reg_res = reg_varbind; } else { /* Not safe to use 'reg_varbind' as assignment expression * value, so go through a temp. */ DUK_DD(DUK_DDPRINT("<op>= expression is not top level, write to reg_temp")); reg_res = reg_temp; /* reg_res should be smallest possible */ reg_temp = DUK__ALLOCTEMP(comp_ctx); } /* Try to optimize X <op>= Y for reg-bound * variables. Detect side-effect free RHS * narrowly by seeing whether it emits code. * If not, rewind the code emitter and overwrite * the unnecessary temp reg load. */ pc_temp_load = duk__get_current_pc(comp_ctx); duk__emit_a_bc(comp_ctx, DUK_OP_LDREG, reg_temp, reg_varbind); pc_before_rhs = duk__get_current_pc(comp_ctx); duk__expr_toregconst(comp_ctx, res, args_rbp /*rbp_flags*/); DUK_ASSERT(res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_REGCONST); pc_after_rhs = duk__get_current_pc(comp_ctx); DUK_DD(DUK_DDPRINT("pc_temp_load=%ld, pc_before_rhs=%ld, pc_after_rhs=%ld", (long) pc_temp_load, (long) pc_before_rhs, (long) pc_after_rhs)); if (pc_after_rhs == pc_before_rhs) { /* Note: if the reg_temp load generated shuffling * instructions, we may need to rewind more than * one instruction, so use explicit PC computation. */ DUK_DD(DUK_DDPRINT("rhs is side effect free, rewind and avoid unnecessary temp for reg-based <op>=")); DUK_BW_ADD_PTR(comp_ctx->thr, &comp_ctx->curr_func.bw_code, (duk_size_t) (pc_temp_load - pc_before_rhs) * sizeof(duk_compiler_instr)); reg_src = reg_varbind; } else { DUK_DD(DUK_DDPRINT("rhs evaluation emitted code, not sure if rhs is side effect free; use temp reg for LHS")); reg_src = reg_temp; } duk__emit_a_b_c(comp_ctx, args_op | DUK__EMIT_FLAG_BC_REGCONST, reg_res, reg_src, res->x1.regconst); res->x1.regconst = reg_res; /* Ensure compact use of temps. */ if (DUK__ISREG_TEMP(comp_ctx, reg_res)) { DUK__SETTEMP(comp_ctx, reg_res + 1); } } else { /* When LHS is not register bound, always go through a * temporary. No optimization for top level assignment. */ duk__emit_a_bc(comp_ctx, DUK_OP_GETVAR, reg_temp, rc_varname); duk__expr_toregconst(comp_ctx, res, args_rbp /*rbp_flags*/); DUK_ASSERT(res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_REGCONST); duk__emit_a_b_c(comp_ctx, args_op | DUK__EMIT_FLAG_BC_REGCONST, reg_temp, reg_temp, res->x1.regconst); res->x1.regconst = reg_temp; } DUK_ASSERT(res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_REGCONST); } /* At this point 'res' holds the potential expression value. * It can be basically any ivalue here, including a reg-bound * identifier (if code above deems it safe) or a unary/binary * operation. Operations must be resolved to a side effect free * plain value, and the side effects must happen exactly once. */ if (reg_varbind >= 0) { if (res->t != DUK_IVAL_PLAIN) { /* Resolve 'res' directly into the LHS binding, and use * that as the expression value if safe. If not safe, * resolve to a temp/const and copy to LHS. */ if (toplevel_assign) { duk__ivalue_toforcedreg(comp_ctx, res, (duk_int_t) reg_varbind); } else { duk__ivalue_totempconst(comp_ctx, res); duk__copy_ivalue(comp_ctx, res, left); /* use 'left' as a temp */ duk__ivalue_toforcedreg(comp_ctx, left, (duk_int_t) reg_varbind); } } else { /* Use 'res' as the expression value (it's side effect * free and may be a plain value, a register, or a * constant) and write it to the LHS binding too. */ duk__copy_ivalue(comp_ctx, res, left); /* use 'left' as a temp */ duk__ivalue_toforcedreg(comp_ctx, left, (duk_int_t) reg_varbind); } } else { /* Only a reg fits into 'A' so coerce 'res' into a register * for PUTVAR. * * XXX: here the current A/B/C split is suboptimal: we could * just use 9 bits for reg_res (and support constants) and 17 * instead of 18 bits for the varname const index. */ duk__ivalue_toreg(comp_ctx, res); duk__emit_a_bc(comp_ctx, DUK_OP_PUTVAR | DUK__EMIT_FLAG_A_IS_SOURCE, res->x1.regconst, rc_varname); } /* 'res' contains expression value */ } else if (left->t == DUK_IVAL_PROP) { /* E5 Section 11.13.1 (and others) step 4 never matches for prop writes -> no check */ duk_regconst_t reg_obj; duk_regconst_t rc_key; duk_regconst_t rc_res; duk_regconst_t reg_temp; /* Property access expressions ('a[b]') are critical to correct * LHS evaluation ordering, see test-dev-assign-eval-order*.js. * We must make sure that the LHS target slot (base object and * key) don't change during RHS evaluation. The only concrete * problem is a register reference to a variable-bound register * (i.e., non-temp). Require temp regs for both key and base. * * Don't allow a constant for the object (even for a number * etc), as it goes into the 'A' field of the opcode. */ reg_obj = duk__ispec_toregconst_raw(comp_ctx, &left->x1, -1 /*forced_reg*/, DUK__IVAL_FLAG_REQUIRE_TEMP /*flags*/); rc_key = duk__ispec_toregconst_raw(comp_ctx, &left->x2, -1 /*forced_reg*/, DUK__IVAL_FLAG_REQUIRE_TEMP | DUK__IVAL_FLAG_ALLOW_CONST /*flags*/); /* Evaluate RHS only when LHS is safe. */ if (args_op == DUK_OP_NONE) { duk__expr_toregconst(comp_ctx, res, args_rbp /*rbp_flags*/); DUK_ASSERT(res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_REGCONST); rc_res = res->x1.regconst; } else { reg_temp = DUK__ALLOCTEMP(comp_ctx); duk__emit_a_b_c(comp_ctx, DUK_OP_GETPROP | DUK__EMIT_FLAG_BC_REGCONST, reg_temp, reg_obj, rc_key); duk__expr_toregconst(comp_ctx, res, args_rbp /*rbp_flags*/); DUK_ASSERT(res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_REGCONST); duk__emit_a_b_c(comp_ctx, args_op | DUK__EMIT_FLAG_BC_REGCONST, reg_temp, reg_temp, res->x1.regconst); rc_res = reg_temp; } duk__emit_a_b_c(comp_ctx, DUK_OP_PUTPROP | DUK__EMIT_FLAG_A_IS_SOURCE | DUK__EMIT_FLAG_BC_REGCONST, reg_obj, rc_key, rc_res); duk__ivalue_regconst(res, rc_res); } else { /* No support for lvalues returned from new or function call expressions. * However, these must NOT cause compile-time SyntaxErrors, but run-time * ReferenceErrors. Both left and right sides of the assignment must be * evaluated before throwing a ReferenceError. For instance: * * f() = g(); * * must result in f() being evaluated, then g() being evaluated, and * finally, a ReferenceError being thrown. See E5 Section 11.13.1. */ duk_regconst_t rc_res; /* First evaluate LHS fully to ensure all side effects are out. */ duk__ivalue_toplain_ignore(comp_ctx, left); /* Then evaluate RHS fully (its value becomes the expression value too). * Technically we'd need the side effect safety check here too, but because * we always throw using INVLHS the result doesn't matter. */ rc_res = duk__expr_toregconst(comp_ctx, res, args_rbp /*rbp_flags*/); duk__emit_op_only(comp_ctx, DUK_OP_INVLHS); duk__ivalue_regconst(res, rc_res); } return; } postincdec: { /* * Post-increment/decrement will return the original value as its * result value. However, even that value will be coerced using * ToNumber() which is quite awkward. Specific bytecode opcodes * are used to handle these semantics. * * Note that post increment/decrement has a "no LineTerminator here" * restriction. This is handled by duk__expr_lbp(), which forcibly terminates * the previous expression if a LineTerminator occurs before '++'/'--'. */ duk_regconst_t reg_res; duk_small_uint_t args_op1 = (args >> 8) & 0xff; /* DUK_OP_POSTINCR/DUK_OP_POSTDECR */ duk_small_uint_t args_op2 = args >> 16; /* DUK_OP_POSTINCP_RR/DUK_OP_POSTDECP_RR */ /* Specific assumptions for opcode numbering. */ DUK_ASSERT(DUK_OP_POSTINCR + 4 == DUK_OP_POSTINCV); DUK_ASSERT(DUK_OP_POSTDECR + 4 == DUK_OP_POSTDECV); reg_res = DUK__ALLOCTEMP(comp_ctx); if (left->t == DUK_IVAL_VAR) { duk_hstring *h_varname; duk_regconst_t reg_varbind; duk_regconst_t rc_varname; h_varname = duk_known_hstring(thr, left->x1.valstack_idx); if (duk__hstring_is_eval_or_arguments_in_strict_mode(comp_ctx, h_varname)) { goto syntax_error; } duk_dup(thr, left->x1.valstack_idx); if (duk__lookup_lhs(comp_ctx, ®_varbind, &rc_varname)) { duk__emit_a_bc(comp_ctx, args_op1, /* e.g. DUK_OP_POSTINCR */ reg_res, reg_varbind); } else { duk__emit_a_bc(comp_ctx, args_op1 + 4, /* e.g. DUK_OP_POSTINCV */ reg_res, rc_varname); } DUK_DDD(DUK_DDDPRINT("postincdec to '%!O' -> reg_varbind=%ld, rc_varname=%ld", (duk_heaphdr *) h_varname, (long) reg_varbind, (long) rc_varname)); } else if (left->t == DUK_IVAL_PROP) { duk_regconst_t reg_obj; /* allocate to reg only (not const) */ duk_regconst_t rc_key; reg_obj = duk__ispec_toregconst_raw(comp_ctx, &left->x1, -1 /*forced_reg*/, 0 /*flags*/); /* don't allow const */ rc_key = duk__ispec_toregconst_raw(comp_ctx, &left->x2, -1 /*forced_reg*/, DUK__IVAL_FLAG_ALLOW_CONST /*flags*/); duk__emit_a_b_c(comp_ctx, args_op2 | DUK__EMIT_FLAG_BC_REGCONST, /* e.g. DUK_OP_POSTINCP */ reg_res, reg_obj, rc_key); } else { /* Technically return value is not needed because INVLHS will * unconditially throw a ReferenceError. Coercion is necessary * for proper semantics (consider ToNumber() called for an object). * Use DUK_OP_UNP with a dummy register to get ToNumber(). */ duk__ivalue_toforcedreg(comp_ctx, left, reg_res); duk__emit_bc(comp_ctx, DUK_OP_UNP, reg_res); /* for side effects, result ignored */ duk__emit_op_only(comp_ctx, DUK_OP_INVLHS); } DUK__SETTEMP(comp_ctx, reg_res + 1); duk__ivalue_regconst(res, reg_res); return; } syntax_error: DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_EXPRESSION); return; syntax_error_lvalue: DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_LVALUE); return; } DUK_LOCAL duk_small_uint_t duk__expr_lbp(duk_compiler_ctx *comp_ctx) { duk_small_uint_t tok = comp_ctx->curr_token.t; DUK_ASSERT_DISABLE(tok >= DUK_TOK_MINVAL); /* unsigned */ DUK_ASSERT(tok <= DUK_TOK_MAXVAL); DUK_ASSERT(sizeof(duk__token_lbp) == DUK_TOK_MAXVAL + 1); /* XXX: integrate support for this into led() instead? * Similar issue as post-increment/post-decrement. */ /* prevent duk__expr_led() by using a binding power less than anything valid */ if (tok == DUK_TOK_IN && !comp_ctx->curr_func.allow_in) { return 0; } if ((tok == DUK_TOK_DECREMENT || tok == DUK_TOK_INCREMENT) && (comp_ctx->curr_token.lineterm)) { /* '++' or '--' in a post-increment/decrement position, * and a LineTerminator occurs between the operator and * the preceding expression. Force the previous expr * to terminate, in effect treating e.g. "a,b\n++" as * "a,b;++" (= SyntaxError). */ return 0; } return DUK__TOKEN_LBP_GET_BP(duk__token_lbp[tok]); /* format is bit packed */ } /* * Expression parsing. * * Upon entry to 'expr' and its variants, 'curr_tok' is assumed to be the * first token of the expression. Upon exit, 'curr_tok' will be the first * token not part of the expression (e.g. semicolon terminating an expression * statement). */ #define DUK__EXPR_RBP_MASK 0xff #define DUK__EXPR_FLAG_REJECT_IN (1 << 8) /* reject 'in' token (used for for-in) */ #define DUK__EXPR_FLAG_ALLOW_EMPTY (1 << 9) /* allow empty expression */ #define DUK__EXPR_FLAG_REQUIRE_INIT (1 << 10) /* require initializer for var/const */ /* main expression parser function */ DUK_LOCAL void duk__expr(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) { duk_hthread *thr = comp_ctx->thr; duk_ivalue tmp_alloc; /* 'res' is used for "left", and 'tmp' for "right" */ duk_ivalue *tmp = &tmp_alloc; duk_small_uint_t rbp; DUK__RECURSION_INCREASE(comp_ctx, thr); duk_require_stack(thr, DUK__PARSE_EXPR_SLOTS); /* filter out flags from exprtop rbp_flags here to save space */ rbp = rbp_flags & DUK__EXPR_RBP_MASK; DUK_DDD(DUK_DDDPRINT("duk__expr(), rbp_flags=%ld, rbp=%ld, allow_in=%ld, paren_level=%ld", (long) rbp_flags, (long) rbp, (long) comp_ctx->curr_func.allow_in, (long) comp_ctx->curr_func.paren_level)); DUK_MEMZERO(&tmp_alloc, sizeof(tmp_alloc)); tmp->x1.valstack_idx = duk_get_top(thr); tmp->x2.valstack_idx = tmp->x1.valstack_idx + 1; duk_push_undefined(thr); duk_push_undefined(thr); /* XXX: where to release temp regs in intermediate expressions? * e.g. 1+2+3 -> don't inflate temp register count when parsing this. * that particular expression temp regs can be forced here. */ /* XXX: increase ctx->expr_tokens here for every consumed token * (this would be a nice statistic)? */ if (comp_ctx->curr_token.t == DUK_TOK_SEMICOLON || comp_ctx->curr_token.t == DUK_TOK_RPAREN) { /* XXX: possibly incorrect handling of empty expression */ DUK_DDD(DUK_DDDPRINT("empty expression")); if (!(rbp_flags & DUK__EXPR_FLAG_ALLOW_EMPTY)) { DUK_ERROR_SYNTAX(thr, DUK_STR_EMPTY_EXPR_NOT_ALLOWED); } duk_push_undefined(thr); duk__ivalue_plain_fromstack(comp_ctx, res); goto cleanup; } duk__advance(comp_ctx); duk__expr_nud(comp_ctx, res); /* reuse 'res' as 'left' */ while (rbp < duk__expr_lbp(comp_ctx)) { duk__advance(comp_ctx); duk__expr_led(comp_ctx, res, tmp); duk__copy_ivalue(comp_ctx, tmp, res); /* tmp -> res */ } cleanup: /* final result is already in 'res' */ duk_pop_2(thr); DUK__RECURSION_DECREASE(comp_ctx, thr); } DUK_LOCAL void duk__exprtop(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) { duk_hthread *thr = comp_ctx->thr; /* Note: these variables must reside in 'curr_func' instead of the global * context: when parsing function expressions, expression parsing is nested. */ comp_ctx->curr_func.nud_count = 0; comp_ctx->curr_func.led_count = 0; comp_ctx->curr_func.paren_level = 0; comp_ctx->curr_func.expr_lhs = 1; comp_ctx->curr_func.allow_in = (rbp_flags & DUK__EXPR_FLAG_REJECT_IN ? 0 : 1); duk__expr(comp_ctx, res, rbp_flags); if (!(rbp_flags & DUK__EXPR_FLAG_ALLOW_EMPTY) && duk__expr_is_empty(comp_ctx)) { DUK_ERROR_SYNTAX(thr, DUK_STR_EMPTY_EXPR_NOT_ALLOWED); } } /* A bunch of helpers (for size optimization) that combine duk__expr()/duk__exprtop() * and result conversions. * * Each helper needs at least 2-3 calls to make it worth while to wrap. */ #if 0 /* unused */ DUK_LOCAL duk_regconst_t duk__expr_toreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) { duk__expr(comp_ctx, res, rbp_flags); return duk__ivalue_toreg(comp_ctx, res); } #endif #if 0 /* unused */ DUK_LOCAL duk_regconst_t duk__expr_totemp(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) { duk__expr(comp_ctx, res, rbp_flags); return duk__ivalue_totemp(comp_ctx, res); } #endif DUK_LOCAL void duk__expr_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags, duk_regconst_t forced_reg) { DUK_ASSERT(forced_reg >= 0); duk__expr(comp_ctx, res, rbp_flags); duk__ivalue_toforcedreg(comp_ctx, res, forced_reg); } DUK_LOCAL duk_regconst_t duk__expr_toregconst(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) { duk__expr(comp_ctx, res, rbp_flags); return duk__ivalue_toregconst(comp_ctx, res); } #if 0 /* unused */ DUK_LOCAL duk_regconst_t duk__expr_totempconst(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) { duk__expr(comp_ctx, res, rbp_flags); return duk__ivalue_totempconst(comp_ctx, res); } #endif DUK_LOCAL void duk__expr_toplain(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) { duk__expr(comp_ctx, res, rbp_flags); duk__ivalue_toplain(comp_ctx, res); } DUK_LOCAL void duk__expr_toplain_ignore(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) { duk__expr(comp_ctx, res, rbp_flags); duk__ivalue_toplain_ignore(comp_ctx, res); } DUK_LOCAL duk_regconst_t duk__exprtop_toreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) { duk__exprtop(comp_ctx, res, rbp_flags); return duk__ivalue_toreg(comp_ctx, res); } #if 0 /* unused */ DUK_LOCAL duk_regconst_t duk__exprtop_totemp(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) { duk__exprtop(comp_ctx, res, rbp_flags); return duk__ivalue_totemp(comp_ctx, res); } #endif DUK_LOCAL void duk__exprtop_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags, duk_regconst_t forced_reg) { DUK_ASSERT(forced_reg >= 0); duk__exprtop(comp_ctx, res, rbp_flags); duk__ivalue_toforcedreg(comp_ctx, res, forced_reg); } DUK_LOCAL duk_regconst_t duk__exprtop_toregconst(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) { duk__exprtop(comp_ctx, res, rbp_flags); return duk__ivalue_toregconst(comp_ctx, res); } #if 0 /* unused */ DUK_LOCAL void duk__exprtop_toplain_ignore(duk_compiler_ctx *comp_ctx, duk_ivalue *res, int rbp_flags) { duk__exprtop(comp_ctx, res, rbp_flags); duk__ivalue_toplain_ignore(comp_ctx, res); } #endif /* * Parse an individual source element (top level statement) or a statement. * * Handles labeled statements automatically (peeling away labels before * parsing an expression that follows the label(s)). * * Upon entry, 'curr_tok' contains the first token of the statement (parsed * in "allow regexp literal" mode). Upon exit, 'curr_tok' contains the first * token following the statement (if the statement has a terminator, this is * the token after the terminator). */ #define DUK__HAS_VAL (1 << 0) /* stmt has non-empty value */ #define DUK__HAS_TERM (1 << 1) /* stmt has explicit/implicit semicolon terminator */ #define DUK__ALLOW_AUTO_SEMI_ALWAYS (1 << 2) /* allow automatic semicolon even without lineterm (compatibility) */ #define DUK__STILL_PROLOGUE (1 << 3) /* statement does not terminate directive prologue */ #define DUK__IS_TERMINAL (1 << 4) /* statement is guaranteed to be terminal (control doesn't flow to next statement) */ /* Parse a single variable declaration (e.g. "i" or "i=10"). A leading 'var' * has already been eaten. These is no return value in 'res', it is used only * as a temporary. * * When called from 'for-in' statement parser, the initializer expression must * not allow the 'in' token. The caller supply additional expression parsing * flags (like DUK__EXPR_FLAG_REJECT_IN) in 'expr_flags'. * * Finally, out_rc_varname and out_reg_varbind are updated to reflect where * the identifier is bound: * * If register bound: out_reg_varbind >= 0, out_rc_varname == 0 (ignore) * If not register bound: out_reg_varbind < 0, out_rc_varname >= 0 * * These allow the caller to use the variable for further assignment, e.g. * as is done in 'for-in' parsing. */ DUK_LOCAL void duk__parse_var_decl(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t expr_flags, duk_regconst_t *out_reg_varbind, duk_regconst_t *out_rc_varname) { duk_hthread *thr = comp_ctx->thr; duk_hstring *h_varname; duk_regconst_t reg_varbind; duk_regconst_t rc_varname; /* assume 'var' has been eaten */ /* Note: Identifier rejects reserved words */ if (comp_ctx->curr_token.t != DUK_TOK_IDENTIFIER) { goto syntax_error; } h_varname = comp_ctx->curr_token.str1; DUK_ASSERT(h_varname != NULL); /* strict mode restrictions (E5 Section 12.2.1) */ if (duk__hstring_is_eval_or_arguments_in_strict_mode(comp_ctx, h_varname)) { goto syntax_error; } /* register declarations in first pass */ if (comp_ctx->curr_func.in_scanning) { duk_uarridx_t n; DUK_DDD(DUK_DDDPRINT("register variable declaration %!O in pass 1", (duk_heaphdr *) h_varname)); n = (duk_uarridx_t) duk_get_length(thr, comp_ctx->curr_func.decls_idx); duk_push_hstring(thr, h_varname); duk_put_prop_index(thr, comp_ctx->curr_func.decls_idx, n); duk_push_int(thr, DUK_DECL_TYPE_VAR + (0 << 8)); duk_put_prop_index(thr, comp_ctx->curr_func.decls_idx, n + 1); } duk_push_hstring(thr, h_varname); /* push before advancing to keep reachable */ /* register binding lookup is based on varmap (even in first pass) */ duk_dup_top(thr); (void) duk__lookup_lhs(comp_ctx, ®_varbind, &rc_varname); duk__advance(comp_ctx); /* eat identifier */ if (comp_ctx->curr_token.t == DUK_TOK_EQUALSIGN) { duk__advance(comp_ctx); DUK_DDD(DUK_DDDPRINT("vardecl, assign to '%!O' -> reg_varbind=%ld, rc_varname=%ld", (duk_heaphdr *) h_varname, (long) reg_varbind, (long) rc_varname)); duk__exprtop(comp_ctx, res, DUK__BP_COMMA | expr_flags /*rbp_flags*/); /* AssignmentExpression */ if (reg_varbind >= 0) { duk__ivalue_toforcedreg(comp_ctx, res, reg_varbind); } else { duk_regconst_t reg_val; reg_val = duk__ivalue_toreg(comp_ctx, res); duk__emit_a_bc(comp_ctx, DUK_OP_PUTVAR | DUK__EMIT_FLAG_A_IS_SOURCE, reg_val, rc_varname); } } else { if (expr_flags & DUK__EXPR_FLAG_REQUIRE_INIT) { /* Used for minimal 'const': initializer required. */ goto syntax_error; } } duk_pop(thr); /* pop varname */ *out_rc_varname = rc_varname; *out_reg_varbind = reg_varbind; return; syntax_error: DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_VAR_DECLARATION); } DUK_LOCAL void duk__parse_var_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t expr_flags) { duk_regconst_t reg_varbind; duk_regconst_t rc_varname; duk__advance(comp_ctx); /* eat 'var' */ for (;;) { /* rc_varname and reg_varbind are ignored here */ duk__parse_var_decl(comp_ctx, res, 0 | expr_flags, ®_varbind, &rc_varname); if (comp_ctx->curr_token.t != DUK_TOK_COMMA) { break; } duk__advance(comp_ctx); } } DUK_LOCAL void duk__parse_for_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site) { duk_hthread *thr = comp_ctx->thr; duk_int_t pc_v34_lhs; /* start variant 3/4 left-hand-side code (L1 in doc/compiler.rst example) */ duk_regconst_t temp_reset; /* knock back "next temp" to this whenever possible */ duk_regconst_t reg_temps; /* preallocated temporaries (2) for variants 3 and 4 */ DUK_DDD(DUK_DDDPRINT("start parsing a for/for-in statement")); /* Two temporaries are preallocated here for variants 3 and 4 which need * registers which are never clobbered by expressions in the loop * (concretely: for the enumerator object and the next enumerated value). * Variants 1 and 2 "release" these temps. */ reg_temps = DUK__ALLOCTEMPS(comp_ctx, 2); temp_reset = DUK__GETTEMP(comp_ctx); /* * For/for-in main variants are: * * 1. for (ExpressionNoIn_opt; Expression_opt; Expression_opt) Statement * 2. for (var VariableDeclarationNoIn; Expression_opt; Expression_opt) Statement * 3. for (LeftHandSideExpression in Expression) Statement * 4. for (var VariableDeclarationNoIn in Expression) Statement * * Parsing these without arbitrary lookahead or backtracking is relatively * tricky but we manage to do so for now. * * See doc/compiler.rst for a detailed discussion of control flow * issues, evaluation order issues, etc. */ duk__advance(comp_ctx); /* eat 'for' */ duk__advance_expect(comp_ctx, DUK_TOK_LPAREN); DUK_DDD(DUK_DDDPRINT("detecting for/for-in loop variant, pc=%ld", (long) duk__get_current_pc(comp_ctx))); /* a label site has been emitted by duk__parse_stmt() automatically * (it will also emit the ENDLABEL). */ if (comp_ctx->curr_token.t == DUK_TOK_VAR) { /* * Variant 2 or 4 */ duk_regconst_t reg_varbind; /* variable binding register if register-bound (otherwise < 0) */ duk_regconst_t rc_varname; /* variable name reg/const, if variable not register-bound */ duk__advance(comp_ctx); /* eat 'var' */ duk__parse_var_decl(comp_ctx, res, DUK__EXPR_FLAG_REJECT_IN, ®_varbind, &rc_varname); DUK__SETTEMP(comp_ctx, temp_reset); if (comp_ctx->curr_token.t == DUK_TOK_IN) { /* * Variant 4 */ DUK_DDD(DUK_DDDPRINT("detected for variant 4: for (var VariableDeclarationNoIn in Expression) Statement")); pc_v34_lhs = duk__get_current_pc(comp_ctx); /* jump is inserted here */ if (reg_varbind >= 0) { duk__emit_a_bc(comp_ctx, DUK_OP_LDREG, reg_varbind, reg_temps + 0); } else { duk__emit_a_bc(comp_ctx, DUK_OP_PUTVAR | DUK__EMIT_FLAG_A_IS_SOURCE, reg_temps + 0, rc_varname); } goto parse_3_or_4; } else { /* * Variant 2 */ DUK_DDD(DUK_DDDPRINT("detected for variant 2: for (var VariableDeclarationNoIn; Expression_opt; Expression_opt) Statement")); for (;;) { /* more initializers */ if (comp_ctx->curr_token.t != DUK_TOK_COMMA) { break; } DUK_DDD(DUK_DDDPRINT("variant 2 has another variable initializer")); duk__advance(comp_ctx); /* eat comma */ duk__parse_var_decl(comp_ctx, res, DUK__EXPR_FLAG_REJECT_IN, ®_varbind, &rc_varname); } goto parse_1_or_2; } } else { /* * Variant 1 or 3 */ pc_v34_lhs = duk__get_current_pc(comp_ctx); /* jump is inserted here (variant 3) */ /* Note that duk__exprtop() here can clobber any reg above current temp_next, * so any loop variables (e.g. enumerator) must be "preallocated". */ /* don't coerce yet to a plain value (variant 3 needs special handling) */ duk__exprtop(comp_ctx, res, DUK__BP_FOR_EXPR | DUK__EXPR_FLAG_REJECT_IN | DUK__EXPR_FLAG_ALLOW_EMPTY /*rbp_flags*/); /* Expression */ if (comp_ctx->curr_token.t == DUK_TOK_IN) { /* * Variant 3 */ /* XXX: need to determine LHS type, and check that it is LHS compatible */ DUK_DDD(DUK_DDDPRINT("detected for variant 3: for (LeftHandSideExpression in Expression) Statement")); if (duk__expr_is_empty(comp_ctx)) { goto syntax_error; /* LeftHandSideExpression does not allow empty expression */ } if (res->t == DUK_IVAL_VAR) { duk_regconst_t reg_varbind; duk_regconst_t rc_varname; duk_dup(thr, res->x1.valstack_idx); if (duk__lookup_lhs(comp_ctx, ®_varbind, &rc_varname)) { duk__emit_a_bc(comp_ctx, DUK_OP_LDREG, reg_varbind, reg_temps + 0); } else { duk__emit_a_bc(comp_ctx, DUK_OP_PUTVAR | DUK__EMIT_FLAG_A_IS_SOURCE, reg_temps + 0, rc_varname); } } else if (res->t == DUK_IVAL_PROP) { /* Don't allow a constant for the object (even for a number etc), as * it goes into the 'A' field of the opcode. */ duk_regconst_t reg_obj; duk_regconst_t rc_key; reg_obj = duk__ispec_toregconst_raw(comp_ctx, &res->x1, -1 /*forced_reg*/, 0 /*flags*/); /* don't allow const */ rc_key = duk__ispec_toregconst_raw(comp_ctx, &res->x2, -1 /*forced_reg*/, DUK__IVAL_FLAG_ALLOW_CONST /*flags*/); duk__emit_a_b_c(comp_ctx, DUK_OP_PUTPROP | DUK__EMIT_FLAG_A_IS_SOURCE | DUK__EMIT_FLAG_BC_REGCONST, reg_obj, rc_key, reg_temps + 0); } else { duk__ivalue_toplain_ignore(comp_ctx, res); /* just in case */ duk__emit_op_only(comp_ctx, DUK_OP_INVLHS); } goto parse_3_or_4; } else { /* * Variant 1 */ DUK_DDD(DUK_DDDPRINT("detected for variant 1: for (ExpressionNoIn_opt; Expression_opt; Expression_opt) Statement")); duk__ivalue_toplain_ignore(comp_ctx, res); goto parse_1_or_2; } } parse_1_or_2: /* * Parse variant 1 or 2. The first part expression (which differs * in the variants) has already been parsed and its code emitted. * * reg_temps + 0: unused * reg_temps + 1: unused */ { duk_regconst_t rc_cond; duk_int_t pc_l1, pc_l2, pc_l3, pc_l4; duk_int_t pc_jumpto_l3, pc_jumpto_l4; duk_bool_t expr_c_empty; DUK_DDD(DUK_DDDPRINT("shared code for parsing variants 1 and 2")); /* "release" preallocated temps since we won't need them */ temp_reset = reg_temps + 0; DUK__SETTEMP(comp_ctx, temp_reset); duk__advance_expect(comp_ctx, DUK_TOK_SEMICOLON); pc_l1 = duk__get_current_pc(comp_ctx); duk__exprtop(comp_ctx, res, DUK__BP_FOR_EXPR | DUK__EXPR_FLAG_ALLOW_EMPTY /*rbp_flags*/); /* Expression_opt */ if (duk__expr_is_empty(comp_ctx)) { /* no need to coerce */ pc_jumpto_l3 = duk__emit_jump_empty(comp_ctx); /* to body */ pc_jumpto_l4 = -1; /* omitted */ } else { rc_cond = duk__ivalue_toregconst(comp_ctx, res); duk__emit_if_false_skip(comp_ctx, rc_cond); pc_jumpto_l3 = duk__emit_jump_empty(comp_ctx); /* to body */ pc_jumpto_l4 = duk__emit_jump_empty(comp_ctx); /* to exit */ } DUK__SETTEMP(comp_ctx, temp_reset); duk__advance_expect(comp_ctx, DUK_TOK_SEMICOLON); pc_l2 = duk__get_current_pc(comp_ctx); duk__exprtop(comp_ctx, res, DUK__BP_FOR_EXPR | DUK__EXPR_FLAG_ALLOW_EMPTY /*rbp_flags*/); /* Expression_opt */ if (duk__expr_is_empty(comp_ctx)) { /* no need to coerce */ expr_c_empty = 1; /* JUMP L1 omitted */ } else { duk__ivalue_toplain_ignore(comp_ctx, res); expr_c_empty = 0; duk__emit_jump(comp_ctx, pc_l1); } DUK__SETTEMP(comp_ctx, temp_reset); duk__advance_expect(comp_ctx, DUK_TOK_RPAREN); pc_l3 = duk__get_current_pc(comp_ctx); duk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/); if (expr_c_empty) { duk__emit_jump(comp_ctx, pc_l1); } else { duk__emit_jump(comp_ctx, pc_l2); } /* temp reset is not necessary after duk__parse_stmt(), which already does it */ pc_l4 = duk__get_current_pc(comp_ctx); DUK_DDD(DUK_DDDPRINT("patching jumps: jumpto_l3: %ld->%ld, jumpto_l4: %ld->%ld, " "break: %ld->%ld, continue: %ld->%ld", (long) pc_jumpto_l3, (long) pc_l3, (long) pc_jumpto_l4, (long) pc_l4, (long) (pc_label_site + 1), (long) pc_l4, (long) (pc_label_site + 2), (long) pc_l2)); duk__patch_jump(comp_ctx, pc_jumpto_l3, pc_l3); duk__patch_jump(comp_ctx, pc_jumpto_l4, pc_l4); duk__patch_jump(comp_ctx, pc_label_site + 1, pc_l4); /* break jump */ duk__patch_jump(comp_ctx, pc_label_site + 2, expr_c_empty ? pc_l1 : pc_l2); /* continue jump */ } goto finished; parse_3_or_4: /* * Parse variant 3 or 4. * * For variant 3 (e.g. "for (A in C) D;") the code for A (except the * final property/variable write) has already been emitted. The first * instruction of that code is at pc_v34_lhs; a JUMP needs to be inserted * there to satisfy control flow needs. * * For variant 4, if the variable declaration had an initializer * (e.g. "for (var A = B in C) D;") the code for the assignment * (B) has already been emitted. * * Variables set before entering here: * * pc_v34_lhs: insert a "JUMP L2" here (see doc/compiler.rst example). * reg_temps + 0: iteration target value (written to LHS) * reg_temps + 1: enumerator object */ { duk_int_t pc_l1, pc_l2, pc_l3, pc_l4, pc_l5; duk_int_t pc_jumpto_l2, pc_jumpto_l3, pc_jumpto_l4, pc_jumpto_l5; duk_regconst_t reg_target; DUK_DDD(DUK_DDDPRINT("shared code for parsing variants 3 and 4, pc_v34_lhs=%ld", (long) pc_v34_lhs)); DUK__SETTEMP(comp_ctx, temp_reset); /* First we need to insert a jump in the middle of previously * emitted code to get the control flow right. No jumps can * cross the position where the jump is inserted. See doc/compiler.rst * for discussion on the intricacies of control flow and side effects * for variants 3 and 4. */ duk__insert_jump_entry(comp_ctx, pc_v34_lhs); pc_jumpto_l2 = pc_v34_lhs; /* inserted jump */ pc_l1 = pc_v34_lhs + 1; /* +1, right after inserted jump */ /* The code for writing reg_temps + 0 to the left hand side has already * been emitted. */ pc_jumpto_l3 = duk__emit_jump_empty(comp_ctx); /* -> loop body */ duk__advance(comp_ctx); /* eat 'in' */ /* Parse enumeration target and initialize enumerator. For 'null' and 'undefined', * INITENUM will creates a 'null' enumerator which works like an empty enumerator * (E5 Section 12.6.4, step 3). Note that INITENUM requires the value to be in a * register (constant not allowed). */ pc_l2 = duk__get_current_pc(comp_ctx); reg_target = duk__exprtop_toreg(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/); /* Expression */ duk__emit_b_c(comp_ctx, DUK_OP_INITENUM | DUK__EMIT_FLAG_B_IS_TARGET, reg_temps + 1, reg_target); pc_jumpto_l4 = duk__emit_jump_empty(comp_ctx); DUK__SETTEMP(comp_ctx, temp_reset); duk__advance_expect(comp_ctx, DUK_TOK_RPAREN); pc_l3 = duk__get_current_pc(comp_ctx); duk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/); /* temp reset is not necessary after duk__parse_stmt(), which already does it */ /* NEXTENUM needs a jump slot right after the main opcode. * We need the code emitter to reserve the slot: if there's * target shuffling, the target shuffle opcodes must happen * after the jump slot (for NEXTENUM the shuffle opcodes are * not needed if the enum is finished). */ pc_l4 = duk__get_current_pc(comp_ctx); duk__emit_b_c(comp_ctx, DUK_OP_NEXTENUM | DUK__EMIT_FLAG_B_IS_TARGET | DUK__EMIT_FLAG_RESERVE_JUMPSLOT, reg_temps + 0, reg_temps + 1); pc_jumpto_l5 = comp_ctx->emit_jumpslot_pc; /* NEXTENUM jump slot: executed when enum finished */ duk__emit_jump(comp_ctx, pc_l1); /* jump to next loop, using reg_v34_iter as iterated value */ pc_l5 = duk__get_current_pc(comp_ctx); /* XXX: since the enumerator may be a memory expensive object, * perhaps clear it explicitly here? If so, break jump must * go through this clearing operation. */ DUK_DDD(DUK_DDDPRINT("patching jumps: jumpto_l2: %ld->%ld, jumpto_l3: %ld->%ld, " "jumpto_l4: %ld->%ld, jumpto_l5: %ld->%ld, " "break: %ld->%ld, continue: %ld->%ld", (long) pc_jumpto_l2, (long) pc_l2, (long) pc_jumpto_l3, (long) pc_l3, (long) pc_jumpto_l4, (long) pc_l4, (long) pc_jumpto_l5, (long) pc_l5, (long) (pc_label_site + 1), (long) pc_l5, (long) (pc_label_site + 2), (long) pc_l4)); duk__patch_jump(comp_ctx, pc_jumpto_l2, pc_l2); duk__patch_jump(comp_ctx, pc_jumpto_l3, pc_l3); duk__patch_jump(comp_ctx, pc_jumpto_l4, pc_l4); duk__patch_jump(comp_ctx, pc_jumpto_l5, pc_l5); duk__patch_jump(comp_ctx, pc_label_site + 1, pc_l5); /* break jump */ duk__patch_jump(comp_ctx, pc_label_site + 2, pc_l4); /* continue jump */ } goto finished; finished: DUK_DDD(DUK_DDDPRINT("end parsing a for/for-in statement")); return; syntax_error: DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_FOR); } DUK_LOCAL void duk__parse_switch_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site) { duk_hthread *thr = comp_ctx->thr; duk_regconst_t temp_at_loop; duk_regconst_t rc_switch; /* reg/const for switch value */ duk_regconst_t rc_case; /* reg/const for case value */ duk_regconst_t reg_temp; /* general temp register */ duk_int_t pc_prevcase = -1; duk_int_t pc_prevstmt = -1; duk_int_t pc_default = -1; /* -1 == not set, -2 == pending (next statement list) */ /* Note: negative pc values are ignored when patching jumps, so no explicit checks needed */ /* * Switch is pretty complicated because of several conflicting concerns: * * - Want to generate code without an intermediate representation, * i.e., in one go * * - Case selectors are expressions, not values, and may thus e.g. throw * exceptions (which causes evaluation order concerns) * * - Evaluation semantics of case selectors and default clause need to be * carefully implemented to provide correct behavior even with case value * side effects * * - Fall through case and default clauses; avoiding dead JUMPs if case * ends with an unconditional jump (a break or a continue) * * - The same case value may occur multiple times, but evaluation rules * only process the first match before switching to a "propagation" mode * where case values are no longer evaluated * * See E5 Section 12.11. Also see doc/compiler.rst for compilation * discussion. */ duk__advance(comp_ctx); duk__advance_expect(comp_ctx, DUK_TOK_LPAREN); rc_switch = duk__exprtop_toregconst(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/); duk__advance_expect(comp_ctx, DUK_TOK_RPAREN); duk__advance_expect(comp_ctx, DUK_TOK_LCURLY); DUK_DDD(DUK_DDDPRINT("switch value in register %ld", (long) rc_switch)); temp_at_loop = DUK__GETTEMP(comp_ctx); for (;;) { duk_int_t num_stmts; duk_small_uint_t tok; /* sufficient for keeping temp reg numbers in check */ DUK__SETTEMP(comp_ctx, temp_at_loop); if (comp_ctx->curr_token.t == DUK_TOK_RCURLY) { break; } /* * Parse a case or default clause. */ if (comp_ctx->curr_token.t == DUK_TOK_CASE) { /* * Case clause. * * Note: cannot use reg_case as a temp register (for SEQ target) * because it may be a constant. */ duk__patch_jump_here(comp_ctx, pc_prevcase); /* chain jumps for case * evaluation and checking */ duk__advance(comp_ctx); rc_case = duk__exprtop_toregconst(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/); duk__advance_expect(comp_ctx, DUK_TOK_COLON); reg_temp = DUK__ALLOCTEMP(comp_ctx); duk__emit_a_b_c(comp_ctx, DUK_OP_SEQ | DUK__EMIT_FLAG_BC_REGCONST, reg_temp, rc_switch, rc_case); duk__emit_if_true_skip(comp_ctx, reg_temp); /* jump to next case clause */ pc_prevcase = duk__emit_jump_empty(comp_ctx); /* no match, next case */ /* statements go here (if any) on next loop */ } else if (comp_ctx->curr_token.t == DUK_TOK_DEFAULT) { /* * Default clause. */ if (pc_default >= 0) { goto syntax_error; } duk__advance(comp_ctx); duk__advance_expect(comp_ctx, DUK_TOK_COLON); /* Fix for https://github.com/svaarala/duktape/issues/155: * If 'default' is first clause (detected by pc_prevcase < 0) * we need to ensure we stay in the matching chain. */ if (pc_prevcase < 0) { DUK_DD(DUK_DDPRINT("default clause is first, emit prevcase jump")); pc_prevcase = duk__emit_jump_empty(comp_ctx); } /* default clause matches next statement list (if any) */ pc_default = -2; } else { /* Code is not accepted before the first case/default clause */ goto syntax_error; } /* * Parse code after the clause. Possible terminators are * 'case', 'default', and '}'. * * Note that there may be no code at all, not even an empty statement, * between case clauses. This must be handled just like an empty statement * (omitting seemingly pointless JUMPs), to avoid situations like * test-bug-case-fallthrough.js. */ num_stmts = 0; if (pc_default == -2) { pc_default = duk__get_current_pc(comp_ctx); } /* Note: this is correct even for default clause statements: * they participate in 'fall-through' behavior even if the * default clause is in the middle. */ duk__patch_jump_here(comp_ctx, pc_prevstmt); /* chain jumps for 'fall-through' * after a case matches. */ for (;;) { tok = comp_ctx->curr_token.t; if (tok == DUK_TOK_CASE || tok == DUK_TOK_DEFAULT || tok == DUK_TOK_RCURLY) { break; } num_stmts++; duk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/); } /* fall-through jump to next code of next case (backpatched) */ pc_prevstmt = duk__emit_jump_empty(comp_ctx); /* XXX: would be nice to omit this jump when the jump is not * reachable, at least in the obvious cases (such as the case * ending with a 'break'. * * Perhaps duk__parse_stmt() could provide some info on whether * the statement is a "dead end"? * * If implemented, just set pc_prevstmt to -1 when not needed. */ } DUK_ASSERT(comp_ctx->curr_token.t == DUK_TOK_RCURLY); duk__advance(comp_ctx); /* default case control flow patchup; note that if pc_prevcase < 0 * (i.e. no case clauses), control enters default case automatically. */ if (pc_default >= 0) { /* default case exists: go there if no case matches */ duk__patch_jump(comp_ctx, pc_prevcase, pc_default); } else { /* default case does not exist, or no statements present * after default case: finish case evaluation */ duk__patch_jump_here(comp_ctx, pc_prevcase); } /* fall-through control flow patchup; note that pc_prevstmt may be * < 0 (i.e. no case clauses), in which case this is a no-op. */ duk__patch_jump_here(comp_ctx, pc_prevstmt); /* continue jump not patched, an INVALID opcode remains there */ duk__patch_jump_here(comp_ctx, pc_label_site + 1); /* break jump */ /* Note: 'fast' breaks will jump to pc_label_site + 1, which will * then jump here. The double jump will be eliminated by a * peephole pass, resulting in an optimal jump here. The label * site jumps will remain in bytecode and will waste code size. */ return; syntax_error: DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_SWITCH); } DUK_LOCAL void duk__parse_if_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res) { duk_regconst_t temp_reset; duk_regconst_t rc_cond; duk_int_t pc_jump_false; DUK_DDD(DUK_DDDPRINT("begin parsing if statement")); temp_reset = DUK__GETTEMP(comp_ctx); duk__advance(comp_ctx); /* eat 'if' */ duk__advance_expect(comp_ctx, DUK_TOK_LPAREN); rc_cond = duk__exprtop_toregconst(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/); duk__emit_if_true_skip(comp_ctx, rc_cond); pc_jump_false = duk__emit_jump_empty(comp_ctx); /* jump to end or else part */ DUK__SETTEMP(comp_ctx, temp_reset); duk__advance_expect(comp_ctx, DUK_TOK_RPAREN); duk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/); /* The 'else' ambiguity is resolved by 'else' binding to the innermost * construct, so greedy matching is correct here. */ if (comp_ctx->curr_token.t == DUK_TOK_ELSE) { duk_int_t pc_jump_end; DUK_DDD(DUK_DDDPRINT("if has else part")); duk__advance(comp_ctx); pc_jump_end = duk__emit_jump_empty(comp_ctx); /* jump from true part to end */ duk__patch_jump_here(comp_ctx, pc_jump_false); duk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/); duk__patch_jump_here(comp_ctx, pc_jump_end); } else { DUK_DDD(DUK_DDDPRINT("if does not have else part")); duk__patch_jump_here(comp_ctx, pc_jump_false); } DUK_DDD(DUK_DDDPRINT("end parsing if statement")); } DUK_LOCAL void duk__parse_do_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site) { duk_regconst_t rc_cond; duk_int_t pc_start; DUK_DDD(DUK_DDDPRINT("begin parsing do statement")); duk__advance(comp_ctx); /* eat 'do' */ pc_start = duk__get_current_pc(comp_ctx); duk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/); duk__patch_jump_here(comp_ctx, pc_label_site + 2); /* continue jump */ duk__advance_expect(comp_ctx, DUK_TOK_WHILE); duk__advance_expect(comp_ctx, DUK_TOK_LPAREN); rc_cond = duk__exprtop_toregconst(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/); duk__emit_if_false_skip(comp_ctx, rc_cond); duk__emit_jump(comp_ctx, pc_start); /* no need to reset temps, as we're finished emitting code */ duk__advance_expect(comp_ctx, DUK_TOK_RPAREN); duk__patch_jump_here(comp_ctx, pc_label_site + 1); /* break jump */ DUK_DDD(DUK_DDDPRINT("end parsing do statement")); } DUK_LOCAL void duk__parse_while_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site) { duk_regconst_t temp_reset; duk_regconst_t rc_cond; duk_int_t pc_start; duk_int_t pc_jump_false; DUK_DDD(DUK_DDDPRINT("begin parsing while statement")); temp_reset = DUK__GETTEMP(comp_ctx); duk__advance(comp_ctx); /* eat 'while' */ duk__advance_expect(comp_ctx, DUK_TOK_LPAREN); pc_start = duk__get_current_pc(comp_ctx); duk__patch_jump_here(comp_ctx, pc_label_site + 2); /* continue jump */ rc_cond = duk__exprtop_toregconst(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/); duk__emit_if_true_skip(comp_ctx, rc_cond); pc_jump_false = duk__emit_jump_empty(comp_ctx); DUK__SETTEMP(comp_ctx, temp_reset); duk__advance_expect(comp_ctx, DUK_TOK_RPAREN); duk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/); duk__emit_jump(comp_ctx, pc_start); duk__patch_jump_here(comp_ctx, pc_jump_false); duk__patch_jump_here(comp_ctx, pc_label_site + 1); /* break jump */ DUK_DDD(DUK_DDDPRINT("end parsing while statement")); } DUK_LOCAL void duk__parse_break_or_continue_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res) { duk_hthread *thr = comp_ctx->thr; duk_bool_t is_break = (comp_ctx->curr_token.t == DUK_TOK_BREAK); duk_int_t label_id; duk_int_t label_catch_depth; duk_int_t label_pc; /* points to LABEL; pc+1 = jump site for break; pc+2 = jump site for continue */ duk_bool_t label_is_closest; DUK_UNREF(res); duk__advance(comp_ctx); /* eat 'break' or 'continue' */ if (comp_ctx->curr_token.t == DUK_TOK_SEMICOLON || /* explicit semi follows */ comp_ctx->curr_token.lineterm || /* automatic semi will be inserted */ comp_ctx->curr_token.allow_auto_semi) { /* automatic semi will be inserted */ /* break/continue without label */ duk__lookup_active_label(comp_ctx, DUK_HTHREAD_STRING_EMPTY_STRING(thr), is_break, &label_id, &label_catch_depth, &label_pc, &label_is_closest); } else if (comp_ctx->curr_token.t == DUK_TOK_IDENTIFIER) { /* break/continue with label (label cannot be a reserved word, production is 'Identifier' */ DUK_ASSERT(comp_ctx->curr_token.str1 != NULL); duk__lookup_active_label(comp_ctx, comp_ctx->curr_token.str1, is_break, &label_id, &label_catch_depth, &label_pc, &label_is_closest); duk__advance(comp_ctx); } else { DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_BREAK_CONT_LABEL); } /* Use a fast break/continue when possible. A fast break/continue is * just a jump to the LABEL break/continue jump slot, which then jumps * to an appropriate place (for break, going through ENDLABEL correctly). * The peephole optimizer will optimize the jump to a direct one. */ if (label_catch_depth == comp_ctx->curr_func.catch_depth && label_is_closest) { DUK_DDD(DUK_DDDPRINT("break/continue: is_break=%ld, label_id=%ld, label_is_closest=%ld, " "label_catch_depth=%ld, catch_depth=%ld " "-> use fast variant (direct jump)", (long) is_break, (long) label_id, (long) label_is_closest, (long) label_catch_depth, (long) comp_ctx->curr_func.catch_depth)); duk__emit_jump(comp_ctx, label_pc + (is_break ? 1 : 2)); } else { DUK_DDD(DUK_DDDPRINT("break/continue: is_break=%ld, label_id=%ld, label_is_closest=%ld, " "label_catch_depth=%ld, catch_depth=%ld " "-> use slow variant (longjmp)", (long) is_break, (long) label_id, (long) label_is_closest, (long) label_catch_depth, (long) comp_ctx->curr_func.catch_depth)); duk__emit_bc(comp_ctx, is_break ? DUK_OP_BREAK : DUK_OP_CONTINUE, (duk_regconst_t) label_id); } } DUK_LOCAL void duk__parse_return_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res) { duk_hthread *thr = comp_ctx->thr; duk_regconst_t rc_val; duk__advance(comp_ctx); /* eat 'return' */ /* A 'return' statement is only allowed inside an actual function body, * not as part of eval or global code. */ if (!comp_ctx->curr_func.is_function) { DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_RETURN); } if (comp_ctx->curr_token.t == DUK_TOK_SEMICOLON || /* explicit semi follows */ comp_ctx->curr_token.lineterm || /* automatic semi will be inserted */ comp_ctx->curr_token.allow_auto_semi) { /* automatic semi will be inserted */ DUK_DDD(DUK_DDDPRINT("empty return value -> undefined")); duk__emit_op_only(comp_ctx, DUK_OP_RETUNDEF); } else { duk_int_t pc_before_expr; duk_int_t pc_after_expr; DUK_DDD(DUK_DDDPRINT("return with a value")); DUK_UNREF(pc_before_expr); DUK_UNREF(pc_after_expr); pc_before_expr = duk__get_current_pc(comp_ctx); rc_val = duk__exprtop_toregconst(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/); pc_after_expr = duk__get_current_pc(comp_ctx); /* Tail call check: if last opcode emitted was CALL, and * the context allows it, add a tailcall flag to the CALL. * This doesn't guarantee that a tail call will be allowed at * runtime, so the RETURN must still be emitted. (Duktape * 0.10.0 avoided this and simulated a RETURN if a tail call * couldn't be used at runtime; but this didn't work * correctly with a thread yield/resume, see * test-bug-tailcall-thread-yield-resume.js for discussion.) * * In addition to the last opcode being CALL, we also need to * be sure that 'rc_val' is the result register of the CALL. * For instance, for the expression 'return 0, (function () * { return 1; }), 2' the last opcode emitted is CALL (no * bytecode is emitted for '2') but 'rc_val' indicates * constant '2'. Similarly if '2' is replaced by a register * bound variable, no opcodes are emitted but tail call would * be incorrect. * * This is tricky and easy to get wrong. It would be best to * track enough expression metadata to check that 'rc_val' came * from that last CALL instruction. We don't have that metadata * now, so we check that 'rc_val' is a temporary register result * (not a constant or a register bound variable). There should * be no way currently for 'rc_val' to be a temporary for an * expression following the CALL instruction without emitting * some opcodes following the CALL. This proxy check is used * below. * * See: test-bug-comma-expr-gh131.js. * * The non-standard 'caller' property disables tail calls * because they pose some special cases which haven't been * fixed yet. */ #if defined(DUK_USE_TAILCALL) if (comp_ctx->curr_func.catch_depth == 0 && /* no catchers */ pc_after_expr > pc_before_expr) { /* at least one opcode emitted */ duk_compiler_instr *instr; duk_instr_t ins; duk_small_uint_t op; instr = duk__get_instr_ptr(comp_ctx, pc_after_expr - 1); DUK_ASSERT(instr != NULL); ins = instr->ins; op = (duk_small_uint_t) DUK_DEC_OP(ins); if ((op & ~0x0fU) == DUK_OP_CALL0 && DUK__ISREG_TEMP(comp_ctx, rc_val) /* see above */) { DUK_DDD(DUK_DDDPRINT("return statement detected a tail call opportunity: " "catch depth is 0, duk__exprtop() emitted >= 1 instructions, " "and last instruction is a CALL " "-> change to TAILCALL")); ins |= DUK_ENC_OP(DUK_BC_CALL_FLAG_TAILCALL); instr->ins = ins; } } #endif /* DUK_USE_TAILCALL */ if (DUK__ISREG(rc_val)) { duk__emit_bc(comp_ctx, DUK_OP_RETREG, rc_val); } else { rc_val = DUK__REMOVECONST(rc_val); if (duk__const_needs_refcount(comp_ctx, rc_val)) { duk__emit_bc(comp_ctx, DUK_OP_RETCONST, rc_val); } else { duk__emit_bc(comp_ctx, DUK_OP_RETCONSTN, rc_val); } } } } DUK_LOCAL void duk__parse_throw_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res) { duk_regconst_t reg_val; duk__advance(comp_ctx); /* eat 'throw' */ /* Unlike break/continue, throw statement does not allow an empty value. */ if (comp_ctx->curr_token.lineterm) { DUK_ERROR_SYNTAX(comp_ctx->thr, DUK_STR_INVALID_THROW); } reg_val = duk__exprtop_toreg(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/); duk__emit_bc(comp_ctx, DUK_OP_THROW, reg_val); } DUK_LOCAL void duk__parse_try_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res) { duk_hthread *thr = comp_ctx->thr; duk_regconst_t reg_catch; /* reg_catch+0 and reg_catch+1 are reserved for TRYCATCH */ duk_regconst_t rc_varname = 0; duk_small_uint_t trycatch_flags = 0; duk_int_t pc_ldconst = -1; duk_int_t pc_trycatch = -1; duk_int_t pc_catch = -1; duk_int_t pc_finally = -1; DUK_UNREF(res); /* * See the following documentation for discussion: * * doc/execution.rst: control flow details * * Try, catch, and finally "parts" are Blocks, not Statements, so * they must always be delimited by curly braces. This is unlike e.g. * the if statement, which accepts any Statement. This eliminates any * questions of matching parts of nested try statements. The Block * parsing is implemented inline here (instead of calling out). * * Finally part has a 'let scoped' variable, which requires a few kinks * here. */ comp_ctx->curr_func.catch_depth++; duk__advance(comp_ctx); /* eat 'try' */ reg_catch = DUK__ALLOCTEMPS(comp_ctx, 2); /* The target for this LDCONST may need output shuffling, but we assume * that 'pc_ldconst' will be the LDCONST that we can patch later. This * should be the case because there's no input shuffling. (If there's * no catch clause, this LDCONST will be replaced with a NOP.) */ pc_ldconst = duk__get_current_pc(comp_ctx); duk__emit_a_bc(comp_ctx, DUK_OP_LDCONST, reg_catch, 0 /*patched later*/); pc_trycatch = duk__get_current_pc(comp_ctx); duk__emit_invalid(comp_ctx); /* TRYCATCH, cannot emit now (not enough info) */ duk__emit_invalid(comp_ctx); /* jump for 'catch' case */ duk__emit_invalid(comp_ctx); /* jump for 'finally' case or end (if no finally) */ /* try part */ duk__advance_expect(comp_ctx, DUK_TOK_LCURLY); duk__parse_stmts(comp_ctx, 0 /*allow_source_elem*/, 0 /*expect_eof*/); /* the DUK_TOK_RCURLY is eaten by duk__parse_stmts() */ duk__emit_op_only(comp_ctx, DUK_OP_ENDTRY); if (comp_ctx->curr_token.t == DUK_TOK_CATCH) { /* * The catch variable must be updated to reflect the new allocated * register for the duration of the catch clause. We need to store * and restore the original value for the varmap entry (if any). */ /* * Note: currently register bindings must be fixed for the entire * function. So, even though the catch variable is in a register * we know, we must use an explicit environment record and slow path * accesses to read/write the catch binding to make closures created * within the catch clause work correctly. This restriction should * be fixable (at least in common cases) later. * * See: test-bug-catch-binding-2.js. * * XXX: improve to get fast path access to most catch clauses. */ duk_hstring *h_var; duk_int_t varmap_value; /* for storing/restoring the varmap binding for catch variable */ DUK_DDD(DUK_DDDPRINT("stack top at start of catch clause: %ld", (long) duk_get_top(thr))); trycatch_flags |= DUK_BC_TRYCATCH_FLAG_HAVE_CATCH; pc_catch = duk__get_current_pc(comp_ctx); duk__advance(comp_ctx); duk__advance_expect(comp_ctx, DUK_TOK_LPAREN); if (comp_ctx->curr_token.t != DUK_TOK_IDENTIFIER) { /* Identifier, i.e. don't allow reserved words */ goto syntax_error; } h_var = comp_ctx->curr_token.str1; DUK_ASSERT(h_var != NULL); duk_push_hstring(thr, h_var); /* keep in on valstack, use borrowed ref below */ if (comp_ctx->curr_func.is_strict && ((h_var == DUK_HTHREAD_STRING_EVAL(thr)) || (h_var == DUK_HTHREAD_STRING_LC_ARGUMENTS(thr)))) { DUK_DDD(DUK_DDDPRINT("catch identifier 'eval' or 'arguments' in strict mode -> SyntaxError")); goto syntax_error; } duk_dup_top(thr); rc_varname = duk__getconst(comp_ctx); DUK_DDD(DUK_DDDPRINT("catch clause, rc_varname=0x%08lx (%ld)", (unsigned long) rc_varname, (long) rc_varname)); duk__advance(comp_ctx); duk__advance_expect(comp_ctx, DUK_TOK_RPAREN); duk__advance_expect(comp_ctx, DUK_TOK_LCURLY); DUK_DDD(DUK_DDDPRINT("varmap before modifying for catch clause: %!iT", (duk_tval *) duk_get_tval(thr, comp_ctx->curr_func.varmap_idx))); duk_dup_top(thr); duk_get_prop(thr, comp_ctx->curr_func.varmap_idx); if (duk_is_undefined(thr, -1)) { varmap_value = -2; } else if (duk_is_null(thr, -1)) { varmap_value = -1; } else { DUK_ASSERT(duk_is_number(thr, -1)); varmap_value = duk_get_int(thr, -1); DUK_ASSERT(varmap_value >= 0); } duk_pop(thr); #if 0 /* It'd be nice to do something like this - but it doesn't * work for closures created inside the catch clause. */ duk_dup_top(thr); duk_push_int(thr, (duk_int_t) (reg_catch + 0)); duk_put_prop(thr, comp_ctx->curr_func.varmap_idx); #endif duk_dup_top(thr); duk_push_null(thr); duk_put_prop(thr, comp_ctx->curr_func.varmap_idx); duk__emit_a_bc(comp_ctx, DUK_OP_PUTVAR | DUK__EMIT_FLAG_A_IS_SOURCE, reg_catch + 0 /*value*/, rc_varname /*varname*/); DUK_DDD(DUK_DDDPRINT("varmap before parsing catch clause: %!iT", (duk_tval *) duk_get_tval(thr, comp_ctx->curr_func.varmap_idx))); duk__parse_stmts(comp_ctx, 0 /*allow_source_elem*/, 0 /*expect_eof*/); /* the DUK_TOK_RCURLY is eaten by duk__parse_stmts() */ if (varmap_value == -2) { /* not present */ duk_del_prop(thr, comp_ctx->curr_func.varmap_idx); } else { if (varmap_value == -1) { duk_push_null(thr); } else { DUK_ASSERT(varmap_value >= 0); duk_push_int(thr, varmap_value); } duk_put_prop(thr, comp_ctx->curr_func.varmap_idx); } /* varname is popped by above code */ DUK_DDD(DUK_DDDPRINT("varmap after restore catch clause: %!iT", (duk_tval *) duk_get_tval(thr, comp_ctx->curr_func.varmap_idx))); duk__emit_op_only(comp_ctx, DUK_OP_ENDCATCH); /* * XXX: for now, indicate that an expensive catch binding * declarative environment is always needed. If we don't * need it, we don't need the const_varname either. */ trycatch_flags |= DUK_BC_TRYCATCH_FLAG_CATCH_BINDING; DUK_DDD(DUK_DDDPRINT("stack top at end of catch clause: %ld", (long) duk_get_top(thr))); } if (comp_ctx->curr_token.t == DUK_TOK_FINALLY) { trycatch_flags |= DUK_BC_TRYCATCH_FLAG_HAVE_FINALLY; pc_finally = duk__get_current_pc(comp_ctx); duk__advance(comp_ctx); duk__advance_expect(comp_ctx, DUK_TOK_LCURLY); duk__parse_stmts(comp_ctx, 0 /*allow_source_elem*/, 0 /*expect_eof*/); /* the DUK_TOK_RCURLY is eaten by duk__parse_stmts() */ duk__emit_abc(comp_ctx, DUK_OP_ENDFIN, reg_catch); /* rethrow */ } if (!(trycatch_flags & DUK_BC_TRYCATCH_FLAG_HAVE_CATCH) && !(trycatch_flags & DUK_BC_TRYCATCH_FLAG_HAVE_FINALLY)) { /* must have catch and/or finally */ goto syntax_error; } /* If there's no catch block, rc_varname will be 0 and duk__patch_trycatch() * will replace the LDCONST with a NOP. For any actual constant (including * constant 0) the DUK__CONST_MARKER flag will be set in rc_varname. */ duk__patch_trycatch(comp_ctx, pc_ldconst, pc_trycatch, reg_catch, rc_varname, trycatch_flags); if (trycatch_flags & DUK_BC_TRYCATCH_FLAG_HAVE_CATCH) { DUK_ASSERT(pc_catch >= 0); duk__patch_jump(comp_ctx, pc_trycatch + 1, pc_catch); } if (trycatch_flags & DUK_BC_TRYCATCH_FLAG_HAVE_FINALLY) { DUK_ASSERT(pc_finally >= 0); duk__patch_jump(comp_ctx, pc_trycatch + 2, pc_finally); } else { /* without finally, the second jump slot is used to jump to end of stmt */ duk__patch_jump_here(comp_ctx, pc_trycatch + 2); } comp_ctx->curr_func.catch_depth--; return; syntax_error: DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_TRY); } DUK_LOCAL void duk__parse_with_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res) { duk_int_t pc_trycatch; duk_int_t pc_finished; duk_regconst_t reg_catch; duk_small_uint_t trycatch_flags; if (comp_ctx->curr_func.is_strict) { DUK_ERROR_SYNTAX(comp_ctx->thr, DUK_STR_WITH_IN_STRICT_MODE); } comp_ctx->curr_func.catch_depth++; duk__advance(comp_ctx); /* eat 'with' */ reg_catch = DUK__ALLOCTEMPS(comp_ctx, 2); duk__advance_expect(comp_ctx, DUK_TOK_LPAREN); duk__exprtop_toforcedreg(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/, reg_catch); duk__advance_expect(comp_ctx, DUK_TOK_RPAREN); pc_trycatch = duk__get_current_pc(comp_ctx); trycatch_flags = DUK_BC_TRYCATCH_FLAG_WITH_BINDING; duk__emit_a_bc(comp_ctx, DUK_OP_TRYCATCH | DUK__EMIT_FLAG_NO_SHUFFLE_A, (duk_regconst_t) trycatch_flags /*a*/, reg_catch /*bc*/); duk__emit_invalid(comp_ctx); /* catch jump */ duk__emit_invalid(comp_ctx); /* finished jump */ duk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/); duk__emit_op_only(comp_ctx, DUK_OP_ENDTRY); pc_finished = duk__get_current_pc(comp_ctx); duk__patch_jump(comp_ctx, pc_trycatch + 2, pc_finished); comp_ctx->curr_func.catch_depth--; } DUK_LOCAL duk_int_t duk__stmt_label_site(duk_compiler_ctx *comp_ctx, duk_int_t label_id) { /* if a site already exists, nop: max one label site per statement */ if (label_id >= 0) { return label_id; } label_id = comp_ctx->curr_func.label_next++; DUK_DDD(DUK_DDDPRINT("allocated new label id for label site: %ld", (long) label_id)); duk__emit_bc(comp_ctx, DUK_OP_LABEL, (duk_regconst_t) label_id); duk__emit_invalid(comp_ctx); duk__emit_invalid(comp_ctx); return label_id; } /* Parse a single statement. * * Creates a label site (with an empty label) automatically for iteration * statements. Also "peels off" any label statements for explicit labels. */ DUK_LOCAL void duk__parse_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_bool_t allow_source_elem) { duk_hthread *thr = comp_ctx->thr; duk_bool_t dir_prol_at_entry; /* directive prologue status at entry */ duk_regconst_t temp_at_entry; duk_size_t labels_len_at_entry; duk_int_t pc_at_entry; /* assumed to also be PC of "LABEL" */ duk_int_t stmt_id; duk_small_uint_t stmt_flags = 0; duk_int_t label_id = -1; duk_small_uint_t tok; duk_bool_t test_func_decl; DUK__RECURSION_INCREASE(comp_ctx, thr); temp_at_entry = DUK__GETTEMP(comp_ctx); pc_at_entry = duk__get_current_pc(comp_ctx); labels_len_at_entry = duk_get_length(thr, comp_ctx->curr_func.labelnames_idx); stmt_id = comp_ctx->curr_func.stmt_next++; dir_prol_at_entry = comp_ctx->curr_func.in_directive_prologue; DUK_UNREF(stmt_id); DUK_DDD(DUK_DDDPRINT("parsing a statement, stmt_id=%ld, temp_at_entry=%ld, labels_len_at_entry=%ld, " "is_strict=%ld, in_directive_prologue=%ld, catch_depth=%ld", (long) stmt_id, (long) temp_at_entry, (long) labels_len_at_entry, (long) comp_ctx->curr_func.is_strict, (long) comp_ctx->curr_func.in_directive_prologue, (long) comp_ctx->curr_func.catch_depth)); /* The directive prologue flag is cleared by default so that it is * unset for any recursive statement parsing. It is only "revived" * if a directive is detected. (We could also make directives only * allowed if 'allow_source_elem' was true.) */ comp_ctx->curr_func.in_directive_prologue = 0; retry_parse: DUK_DDD(DUK_DDDPRINT("try stmt parse, stmt_id=%ld, label_id=%ld, allow_source_elem=%ld, catch_depth=%ld", (long) stmt_id, (long) label_id, (long) allow_source_elem, (long) comp_ctx->curr_func.catch_depth)); /* * Detect iteration statements; if encountered, establish an * empty label. */ tok = comp_ctx->curr_token.t; if (tok == DUK_TOK_FOR || tok == DUK_TOK_DO || tok == DUK_TOK_WHILE || tok == DUK_TOK_SWITCH) { DUK_DDD(DUK_DDDPRINT("iteration/switch statement -> add empty label")); label_id = duk__stmt_label_site(comp_ctx, label_id); duk__add_label(comp_ctx, DUK_HTHREAD_STRING_EMPTY_STRING(thr), pc_at_entry /*pc_label*/, label_id); } /* * Main switch for statement / source element type. */ switch (comp_ctx->curr_token.t) { case DUK_TOK_FUNCTION: { /* * Function declaration, function expression, or (non-standard) * function statement. * * The E5 specification only allows function declarations at * the top level (in "source elements"). An ExpressionStatement * is explicitly not allowed to begin with a "function" keyword * (E5 Section 12.4). Hence any non-error semantics for such * non-top-level statements are non-standard. Duktape semantics * for function statements are modelled after V8, see * test-dev-func-decl-outside-top.js. */ test_func_decl = allow_source_elem; #if defined(DUK_USE_NONSTD_FUNC_STMT) /* Lenient: allow function declarations outside top level in * non-strict mode but reject them in strict mode. */ test_func_decl = test_func_decl || !comp_ctx->curr_func.is_strict; #endif /* DUK_USE_NONSTD_FUNC_STMT */ /* Strict: never allow function declarations outside top level. */ if (test_func_decl) { /* FunctionDeclaration: not strictly a statement but handled as such. * * O(depth^2) parse count for inner functions is handled by recording a * lexer offset on the first compilation pass, so that the function can * be efficiently skipped on the second pass. This is encapsulated into * duk__parse_func_like_fnum(). */ duk_int_t fnum; #if defined(DUK_USE_ASSERTIONS) duk_idx_t top_before; #endif DUK_DDD(DUK_DDDPRINT("function declaration statement")); #if defined(DUK_USE_ASSERTIONS) top_before = duk_get_top(thr); #endif duk__advance(comp_ctx); /* eat 'function' */ fnum = duk__parse_func_like_fnum(comp_ctx, DUK__FUNC_FLAG_DECL | DUK__FUNC_FLAG_PUSHNAME_PASS1); /* The value stack convention here is a bit odd: the function * name is only pushed on pass 1 (in_scanning), and is needed * to process function declarations. */ if (comp_ctx->curr_func.in_scanning) { duk_uarridx_t n; #if defined(DUK_USE_ASSERTIONS) DUK_ASSERT(duk_get_top(thr) == top_before + 1); #endif DUK_DDD(DUK_DDDPRINT("register function declaration %!T in pass 1, fnum %ld", duk_get_tval(thr, -1), (long) fnum)); n = (duk_uarridx_t) duk_get_length(thr, comp_ctx->curr_func.decls_idx); /* funcname is at index -1 */ duk_put_prop_index(thr, comp_ctx->curr_func.decls_idx, n); duk_push_int(thr, (duk_int_t) (DUK_DECL_TYPE_FUNC + (fnum << 8))); duk_put_prop_index(thr, comp_ctx->curr_func.decls_idx, n + 1); } else { #if defined(DUK_USE_ASSERTIONS) DUK_ASSERT(duk_get_top(thr) == top_before); #endif } /* no statement value (unlike function expression) */ stmt_flags = 0; break; } else { DUK_ERROR_SYNTAX(thr, DUK_STR_FUNC_STMT_NOT_ALLOWED); } break; } case DUK_TOK_LCURLY: { DUK_DDD(DUK_DDDPRINT("block statement")); duk__advance(comp_ctx); duk__parse_stmts(comp_ctx, 0 /*allow_source_elem*/, 0 /*expect_eof*/); /* the DUK_TOK_RCURLY is eaten by duk__parse_stmts() */ if (label_id >= 0) { duk__patch_jump_here(comp_ctx, pc_at_entry + 1); /* break jump */ } stmt_flags = 0; break; } case DUK_TOK_CONST: { DUK_DDD(DUK_DDDPRINT("constant declaration statement")); duk__parse_var_stmt(comp_ctx, res, DUK__EXPR_FLAG_REQUIRE_INIT /*expr_flags*/); stmt_flags = DUK__HAS_TERM; break; } case DUK_TOK_VAR: { DUK_DDD(DUK_DDDPRINT("variable declaration statement")); duk__parse_var_stmt(comp_ctx, res, 0 /*expr_flags*/); stmt_flags = DUK__HAS_TERM; break; } case DUK_TOK_SEMICOLON: { /* empty statement with an explicit semicolon */ DUK_DDD(DUK_DDDPRINT("empty statement")); stmt_flags = DUK__HAS_TERM; break; } case DUK_TOK_IF: { DUK_DDD(DUK_DDDPRINT("if statement")); duk__parse_if_stmt(comp_ctx, res); if (label_id >= 0) { duk__patch_jump_here(comp_ctx, pc_at_entry + 1); /* break jump */ } stmt_flags = 0; break; } case DUK_TOK_DO: { /* * Do-while statement is mostly trivial, but there is special * handling for automatic semicolon handling (triggered by the * DUK__ALLOW_AUTO_SEMI_ALWAYS) flag related to a bug filed at: * * https://bugs.ecmascript.org/show_bug.cgi?id=8 * * See doc/compiler.rst for details. */ DUK_DDD(DUK_DDDPRINT("do statement")); DUK_ASSERT(label_id >= 0); duk__update_label_flags(comp_ctx, label_id, DUK_LABEL_FLAG_ALLOW_BREAK | DUK_LABEL_FLAG_ALLOW_CONTINUE); duk__parse_do_stmt(comp_ctx, res, pc_at_entry); stmt_flags = DUK__HAS_TERM | DUK__ALLOW_AUTO_SEMI_ALWAYS; /* DUK__ALLOW_AUTO_SEMI_ALWAYS workaround */ break; } case DUK_TOK_WHILE: { DUK_DDD(DUK_DDDPRINT("while statement")); DUK_ASSERT(label_id >= 0); duk__update_label_flags(comp_ctx, label_id, DUK_LABEL_FLAG_ALLOW_BREAK | DUK_LABEL_FLAG_ALLOW_CONTINUE); duk__parse_while_stmt(comp_ctx, res, pc_at_entry); stmt_flags = 0; break; } case DUK_TOK_FOR: { /* * For/for-in statement is complicated to parse because * determining the statement type (three-part for vs. a * for-in) requires potential backtracking. * * See the helper for the messy stuff. */ DUK_DDD(DUK_DDDPRINT("for/for-in statement")); DUK_ASSERT(label_id >= 0); duk__update_label_flags(comp_ctx, label_id, DUK_LABEL_FLAG_ALLOW_BREAK | DUK_LABEL_FLAG_ALLOW_CONTINUE); duk__parse_for_stmt(comp_ctx, res, pc_at_entry); stmt_flags = 0; break; } case DUK_TOK_CONTINUE: case DUK_TOK_BREAK: { DUK_DDD(DUK_DDDPRINT("break/continue statement")); duk__parse_break_or_continue_stmt(comp_ctx, res); stmt_flags = DUK__HAS_TERM | DUK__IS_TERMINAL; break; } case DUK_TOK_RETURN: { DUK_DDD(DUK_DDDPRINT("return statement")); duk__parse_return_stmt(comp_ctx, res); stmt_flags = DUK__HAS_TERM | DUK__IS_TERMINAL; break; } case DUK_TOK_WITH: { DUK_DDD(DUK_DDDPRINT("with statement")); comp_ctx->curr_func.with_depth++; duk__parse_with_stmt(comp_ctx, res); if (label_id >= 0) { duk__patch_jump_here(comp_ctx, pc_at_entry + 1); /* break jump */ } comp_ctx->curr_func.with_depth--; stmt_flags = 0; break; } case DUK_TOK_SWITCH: { /* * The switch statement is pretty messy to compile. * See the helper for details. */ DUK_DDD(DUK_DDDPRINT("switch statement")); DUK_ASSERT(label_id >= 0); duk__update_label_flags(comp_ctx, label_id, DUK_LABEL_FLAG_ALLOW_BREAK); /* don't allow continue */ duk__parse_switch_stmt(comp_ctx, res, pc_at_entry); stmt_flags = 0; break; } case DUK_TOK_THROW: { DUK_DDD(DUK_DDDPRINT("throw statement")); duk__parse_throw_stmt(comp_ctx, res); stmt_flags = DUK__HAS_TERM | DUK__IS_TERMINAL; break; } case DUK_TOK_TRY: { DUK_DDD(DUK_DDDPRINT("try statement")); duk__parse_try_stmt(comp_ctx, res); stmt_flags = 0; break; } case DUK_TOK_DEBUGGER: { duk__advance(comp_ctx); #if defined(DUK_USE_DEBUGGER_SUPPORT) DUK_DDD(DUK_DDDPRINT("debugger statement: debugging enabled, emit debugger opcode")); duk__emit_op_only(comp_ctx, DUK_OP_DEBUGGER); #else DUK_DDD(DUK_DDDPRINT("debugger statement: ignored")); #endif stmt_flags = DUK__HAS_TERM; break; } default: { /* * Else, must be one of: * - ExpressionStatement, possibly a directive (String) * - LabelledStatement (Identifier followed by ':') * * Expressions beginning with 'function' keyword are covered by a case * above (such expressions are not allowed in standard E5 anyway). * Also expressions starting with '{' are interpreted as block * statements. See E5 Section 12.4. * * Directive detection is tricky; see E5 Section 14.1 on directive * prologue. A directive is an expression statement with a single * string literal and an explicit or automatic semicolon. Escape * characters are significant and no parens etc are allowed: * * 'use strict'; // valid 'use strict' directive * 'use\u0020strict'; // valid directive, not a 'use strict' directive * ('use strict'); // not a valid directive * * The expression is determined to consist of a single string literal * based on duk__expr_nud() and duk__expr_led() call counts. The string literal * of a 'use strict' directive is determined to lack any escapes based * num_escapes count from the lexer. Note that other directives may be * allowed to contain escapes, so a directive with escapes does not * terminate a directive prologue. * * We rely on the fact that the expression parser will not emit any * code for a single token expression. However, it will generate an * intermediate value which we will then successfully ignore. * * A similar approach is used for labels. */ duk_bool_t single_token; DUK_DDD(DUK_DDDPRINT("expression statement")); duk__exprtop(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/); single_token = (comp_ctx->curr_func.nud_count == 1 && /* one token */ comp_ctx->curr_func.led_count == 0); /* no operators */ if (single_token && comp_ctx->prev_token.t == DUK_TOK_IDENTIFIER && comp_ctx->curr_token.t == DUK_TOK_COLON) { /* * Detected label */ duk_hstring *h_lab; /* expected ival */ DUK_ASSERT(res->t == DUK_IVAL_VAR); DUK_ASSERT(res->x1.t == DUK_ISPEC_VALUE); DUK_ASSERT(DUK_TVAL_IS_STRING(duk_get_tval(thr, res->x1.valstack_idx))); h_lab = comp_ctx->prev_token.str1; DUK_ASSERT(h_lab != NULL); DUK_DDD(DUK_DDDPRINT("explicit label site for label '%!O'", (duk_heaphdr *) h_lab)); duk__advance(comp_ctx); /* eat colon */ label_id = duk__stmt_label_site(comp_ctx, label_id); duk__add_label(comp_ctx, h_lab, pc_at_entry /*pc_label*/, label_id); /* a statement following a label cannot be a source element * (a function declaration). */ allow_source_elem = 0; DUK_DDD(DUK_DDDPRINT("label handled, retry statement parsing")); goto retry_parse; } stmt_flags = 0; if (dir_prol_at_entry && /* still in prologue */ single_token && /* single string token */ comp_ctx->prev_token.t == DUK_TOK_STRING) { /* * Detected a directive */ duk_hstring *h_dir; /* expected ival */ DUK_ASSERT(res->t == DUK_IVAL_PLAIN); DUK_ASSERT(res->x1.t == DUK_ISPEC_VALUE); DUK_ASSERT(DUK_TVAL_IS_STRING(duk_get_tval(thr, res->x1.valstack_idx))); h_dir = comp_ctx->prev_token.str1; DUK_ASSERT(h_dir != NULL); DUK_DDD(DUK_DDDPRINT("potential directive: %!O", h_dir)); stmt_flags |= DUK__STILL_PROLOGUE; /* Note: escaped characters differentiate directives */ if (comp_ctx->prev_token.num_escapes > 0) { DUK_DDD(DUK_DDDPRINT("directive contains escapes: valid directive " "but we ignore such directives")); } else { /* * The length comparisons are present to handle * strings like "use strict\u0000foo" as required. */ if (DUK_HSTRING_GET_BYTELEN(h_dir) == 10 && DUK_STRNCMP((const char *) DUK_HSTRING_GET_DATA(h_dir), "use strict", 10) == 0) { #if defined(DUK_USE_STRICT_DECL) DUK_DDD(DUK_DDDPRINT("use strict directive detected: strict flag %ld -> %ld", (long) comp_ctx->curr_func.is_strict, (long) 1)); comp_ctx->curr_func.is_strict = 1; #else DUK_DDD(DUK_DDDPRINT("use strict detected but strict declarations disabled, ignoring")); #endif } else if (DUK_HSTRING_GET_BYTELEN(h_dir) == 14 && DUK_STRNCMP((const char *) DUK_HSTRING_GET_DATA(h_dir), "use duk notail", 14) == 0) { DUK_DDD(DUK_DDDPRINT("use duk notail directive detected: notail flag %ld -> %ld", (long) comp_ctx->curr_func.is_notail, (long) 1)); comp_ctx->curr_func.is_notail = 1; } else { DUK_DD(DUK_DDPRINT("unknown directive: '%!O', ignoring but not terminating " "directive prologue", (duk_hobject *) h_dir)); } } } else { DUK_DDD(DUK_DDDPRINT("non-directive expression statement or no longer in prologue; " "prologue terminated if still active")); } stmt_flags |= DUK__HAS_VAL | DUK__HAS_TERM; } } /* end switch (tok) */ /* * Statement value handling. * * Global code and eval code has an implicit return value * which comes from the last statement with a value * (technically a non-"empty" continuation, which is * different from an empty statement). * * Since we don't know whether a later statement will * override the value of the current statement, we need * to coerce the statement value to a register allocated * for implicit return values. In other cases we need * to coerce the statement value to a plain value to get * any side effects out (consider e.g. "foo.bar;"). */ /* XXX: what about statements which leave a half-cooked value in 'res' * but have no stmt value? Any such statements? */ if (stmt_flags & DUK__HAS_VAL) { duk_regconst_t reg_stmt_value = comp_ctx->curr_func.reg_stmt_value; if (reg_stmt_value >= 0) { duk__ivalue_toforcedreg(comp_ctx, res, reg_stmt_value); } else { duk__ivalue_toplain_ignore(comp_ctx, res); } } else { ; } /* * Statement terminator check, including automatic semicolon * handling. After this step, 'curr_tok' should be the first * token after a possible statement terminator. */ if (stmt_flags & DUK__HAS_TERM) { if (comp_ctx->curr_token.t == DUK_TOK_SEMICOLON) { DUK_DDD(DUK_DDDPRINT("explicit semicolon terminates statement")); duk__advance(comp_ctx); } else { if (comp_ctx->curr_token.allow_auto_semi) { DUK_DDD(DUK_DDDPRINT("automatic semicolon terminates statement")); } else if (stmt_flags & DUK__ALLOW_AUTO_SEMI_ALWAYS) { /* XXX: make this lenience dependent on flags or strictness? */ DUK_DDD(DUK_DDDPRINT("automatic semicolon terminates statement (allowed for compatibility " "even though no lineterm present before next token)")); } else { DUK_ERROR_SYNTAX(thr, DUK_STR_UNTERMINATED_STMT); } } } else { DUK_DDD(DUK_DDDPRINT("statement has no terminator")); } /* * Directive prologue tracking. */ if (stmt_flags & DUK__STILL_PROLOGUE) { DUK_DDD(DUK_DDDPRINT("setting in_directive_prologue")); comp_ctx->curr_func.in_directive_prologue = 1; } /* * Cleanups (all statement parsing flows through here). * * Pop label site and reset labels. Reset 'next temp' to value at * entry to reuse temps. */ if (label_id >= 0) { duk__emit_bc(comp_ctx, DUK_OP_ENDLABEL, (duk_regconst_t) label_id); } DUK__SETTEMP(comp_ctx, temp_at_entry); duk__reset_labels_to_length(comp_ctx, labels_len_at_entry); /* XXX: return indication of "terminalness" (e.g. a 'throw' is terminal) */ DUK__RECURSION_DECREASE(comp_ctx, thr); } /* * Parse a statement list. * * Handles automatic semicolon insertion and implicit return value. * * Upon entry, 'curr_tok' should contain the first token of the first * statement (parsed in the "allow regexp literal" mode). Upon exit, * 'curr_tok' contains the token following the statement list terminator * (EOF or closing brace). */ DUK_LOCAL void duk__parse_stmts(duk_compiler_ctx *comp_ctx, duk_bool_t allow_source_elem, duk_bool_t expect_eof) { duk_hthread *thr = comp_ctx->thr; duk_ivalue res_alloc; duk_ivalue *res = &res_alloc; /* Setup state. Initial ivalue is 'undefined'. */ duk_require_stack(thr, DUK__PARSE_STATEMENTS_SLOTS); /* XXX: 'res' setup can be moved to function body level; in fact, two 'res' * intermediate values suffice for parsing of each function. Nesting is needed * for nested functions (which may occur inside expressions). */ DUK_MEMZERO(&res_alloc, sizeof(res_alloc)); res->t = DUK_IVAL_PLAIN; res->x1.t = DUK_ISPEC_VALUE; res->x1.valstack_idx = duk_get_top(thr); res->x2.valstack_idx = res->x1.valstack_idx + 1; duk_push_undefined(thr); duk_push_undefined(thr); /* Parse statements until a closing token (EOF or '}') is found. */ for (;;) { /* Check whether statement list ends. */ if (expect_eof) { if (comp_ctx->curr_token.t == DUK_TOK_EOF) { break; } } else { if (comp_ctx->curr_token.t == DUK_TOK_RCURLY) { break; } } /* Check statement type based on the first token type. * * Note: expression parsing helpers expect 'curr_tok' to * contain the first token of the expression upon entry. */ DUK_DDD(DUK_DDDPRINT("TOKEN %ld (non-whitespace, non-comment)", (long) comp_ctx->curr_token.t)); duk__parse_stmt(comp_ctx, res, allow_source_elem); } duk__advance(comp_ctx); /* Tear down state. */ duk_pop_2(thr); } /* * Declaration binding instantiation conceptually happens when calling a * function; for us it essentially means that function prologue. The * conceptual process is described in E5 Section 10.5. * * We need to keep track of all encountered identifiers to (1) create an * identifier-to-register map ("varmap"); and (2) detect duplicate * declarations. Identifiers which are not bound to registers still need * to be tracked for detecting duplicates. Currently such identifiers * are put into the varmap with a 'null' value, which is later cleaned up. * * To support functions with a large number of variable and function * declarations, registers are not allocated beyond a certain limit; * after that limit, variables and functions need slow path access. * Arguments are currently always register bound, which imposes a hard * (and relatively small) argument count limit. * * Some bindings in E5 are not configurable (= deletable) and almost all * are mutable (writable). Exceptions are: * * - The 'arguments' binding, established only if no shadowing argument * or function declaration exists. We handle 'arguments' creation * and binding through an explicit slow path environment record. * * - The "name" binding for a named function expression. This is also * handled through an explicit slow path environment record. */ /* XXX: add support for variables to not be register bound always, to * handle cases with a very large number of variables? */ DUK_LOCAL void duk__init_varmap_and_prologue_for_pass2(duk_compiler_ctx *comp_ctx, duk_regconst_t *out_stmt_value_reg) { duk_hthread *thr = comp_ctx->thr; duk_hstring *h_name; duk_bool_t configurable_bindings; duk_uarridx_t num_args; duk_uarridx_t num_decls; duk_regconst_t rc_name; duk_small_uint_t declvar_flags; duk_uarridx_t i; #if defined(DUK_USE_ASSERTIONS) duk_idx_t entry_top; #endif #if defined(DUK_USE_ASSERTIONS) entry_top = duk_get_top(thr); #endif /* * Preliminaries */ configurable_bindings = comp_ctx->curr_func.is_eval; DUK_DDD(DUK_DDDPRINT("configurable_bindings=%ld", (long) configurable_bindings)); /* varmap is already in comp_ctx->curr_func.varmap_idx */ /* * Function formal arguments, always bound to registers * (there's no support for shuffling them now). */ num_args = (duk_uarridx_t) duk_get_length(thr, comp_ctx->curr_func.argnames_idx); DUK_DDD(DUK_DDDPRINT("num_args=%ld", (long) num_args)); /* XXX: check num_args */ for (i = 0; i < num_args; i++) { duk_get_prop_index(thr, comp_ctx->curr_func.argnames_idx, i); h_name = duk_known_hstring(thr, -1); if (comp_ctx->curr_func.is_strict) { if (duk__hstring_is_eval_or_arguments(comp_ctx, h_name)) { DUK_DDD(DUK_DDDPRINT("arg named 'eval' or 'arguments' in strict mode -> SyntaxError")); goto error_argname; } duk_dup_top(thr); if (duk_has_prop(thr, comp_ctx->curr_func.varmap_idx)) { DUK_DDD(DUK_DDDPRINT("duplicate arg name in strict mode -> SyntaxError")); goto error_argname; } /* Ensure argument name is not a reserved word in current * (final) strictness. Formal argument parsing may not * catch reserved names if strictness changes during * parsing. * * We only need to do this in strict mode because non-strict * keyword are always detected in formal argument parsing. */ if (DUK_HSTRING_HAS_STRICT_RESERVED_WORD(h_name)) { goto error_argname; } } /* overwrite any previous binding of the same name; the effect is * that last argument of a certain name wins. */ /* only functions can have arguments */ DUK_ASSERT(comp_ctx->curr_func.is_function); duk_push_uarridx(thr, i); /* -> [ ... name index ] */ duk_put_prop(thr, comp_ctx->curr_func.varmap_idx); /* -> [ ... ] */ /* no code needs to be emitted, the regs already have values */ } /* use temp_next for tracking register allocations */ DUK__SETTEMP_CHECKMAX(comp_ctx, (duk_regconst_t) num_args); /* * After arguments, allocate special registers (like shuffling temps) */ if (out_stmt_value_reg) { *out_stmt_value_reg = DUK__ALLOCTEMP(comp_ctx); } if (comp_ctx->curr_func.needs_shuffle) { duk_regconst_t shuffle_base = DUK__ALLOCTEMPS(comp_ctx, 3); comp_ctx->curr_func.shuffle1 = shuffle_base; comp_ctx->curr_func.shuffle2 = shuffle_base + 1; comp_ctx->curr_func.shuffle3 = shuffle_base + 2; DUK_D(DUK_DPRINT("shuffle registers needed by function, allocated: %ld %ld %ld", (long) comp_ctx->curr_func.shuffle1, (long) comp_ctx->curr_func.shuffle2, (long) comp_ctx->curr_func.shuffle3)); } if (comp_ctx->curr_func.temp_next > 0x100) { DUK_D(DUK_DPRINT("not enough 8-bit regs: temp_next=%ld", (long) comp_ctx->curr_func.temp_next)); goto error_outofregs; } /* * Function declarations */ num_decls = (duk_uarridx_t) duk_get_length(thr, comp_ctx->curr_func.decls_idx); DUK_DDD(DUK_DDDPRINT("num_decls=%ld -> %!T", (long) num_decls, (duk_tval *) duk_get_tval(thr, comp_ctx->curr_func.decls_idx))); for (i = 0; i < num_decls; i += 2) { duk_int_t decl_type; duk_int_t fnum; duk_get_prop_index(thr, comp_ctx->curr_func.decls_idx, i + 1); /* decl type */ decl_type = duk_to_int(thr, -1); fnum = decl_type >> 8; /* XXX: macros */ decl_type = decl_type & 0xff; duk_pop(thr); if (decl_type != DUK_DECL_TYPE_FUNC) { continue; } duk_get_prop_index(thr, comp_ctx->curr_func.decls_idx, i); /* decl name */ /* XXX: spilling */ if (comp_ctx->curr_func.is_function) { duk_regconst_t reg_bind; duk_dup_top(thr); if (duk_has_prop(thr, comp_ctx->curr_func.varmap_idx)) { /* shadowed; update value */ duk_dup_top(thr); duk_get_prop(thr, comp_ctx->curr_func.varmap_idx); reg_bind = duk_to_int(thr, -1); /* [ ... name reg_bind ] */ duk__emit_a_bc(comp_ctx, DUK_OP_CLOSURE, reg_bind, (duk_regconst_t) fnum); } else { /* function: always register bound */ reg_bind = DUK__ALLOCTEMP(comp_ctx); duk__emit_a_bc(comp_ctx, DUK_OP_CLOSURE, reg_bind, (duk_regconst_t) fnum); duk_push_int(thr, (duk_int_t) reg_bind); } } else { /* Function declaration for global/eval code is emitted even * for duplicates, because of E5 Section 10.5, step 5.e of * E5.1 (special behavior for variable bound to global object). * * DECLVAR will not re-declare a variable as such, but will * update the binding value. */ duk_regconst_t reg_temp = DUK__ALLOCTEMP(comp_ctx); duk_dup_top(thr); rc_name = duk__getconst(comp_ctx); duk_push_null(thr); duk__emit_a_bc(comp_ctx, DUK_OP_CLOSURE, reg_temp, (duk_regconst_t) fnum); declvar_flags = DUK_PROPDESC_FLAG_WRITABLE | DUK_PROPDESC_FLAG_ENUMERABLE | DUK_BC_DECLVAR_FLAG_FUNC_DECL; if (configurable_bindings) { declvar_flags |= DUK_PROPDESC_FLAG_CONFIGURABLE; } duk__emit_a_b_c(comp_ctx, DUK_OP_DECLVAR | DUK__EMIT_FLAG_NO_SHUFFLE_A | DUK__EMIT_FLAG_BC_REGCONST, (duk_regconst_t) declvar_flags /*flags*/, rc_name /*name*/, reg_temp /*value*/); DUK__SETTEMP(comp_ctx, reg_temp); /* forget temp */ } DUK_DDD(DUK_DDDPRINT("function declaration to varmap: %!T -> %!T", (duk_tval *) duk_get_tval(thr, -2), (duk_tval *) duk_get_tval(thr, -1))); #if defined(DUK_USE_FASTINT) DUK_ASSERT(DUK_TVAL_IS_NULL(duk_get_tval(thr, -1)) || DUK_TVAL_IS_FASTINT(duk_get_tval(thr, -1))); #endif duk_put_prop(thr, comp_ctx->curr_func.varmap_idx); /* [ ... name reg/null ] -> [ ... ] */ } /* * 'arguments' binding is special; if a shadowing argument or * function declaration exists, an arguments object will * definitely not be needed, regardless of whether the identifier * 'arguments' is referenced inside the function body. */ if (duk_has_prop_stridx(thr, comp_ctx->curr_func.varmap_idx, DUK_STRIDX_LC_ARGUMENTS)) { DUK_DDD(DUK_DDDPRINT("'arguments' is shadowed by argument or function declaration " "-> arguments object creation can be skipped")); comp_ctx->curr_func.is_arguments_shadowed = 1; } /* * Variable declarations. * * Unlike function declarations, variable declaration values don't get * assigned on entry. If a binding of the same name already exists, just * ignore it silently. */ for (i = 0; i < num_decls; i += 2) { duk_int_t decl_type; duk_get_prop_index(thr, comp_ctx->curr_func.decls_idx, i + 1); /* decl type */ decl_type = duk_to_int(thr, -1); decl_type = decl_type & 0xff; duk_pop(thr); if (decl_type != DUK_DECL_TYPE_VAR) { continue; } duk_get_prop_index(thr, comp_ctx->curr_func.decls_idx, i); /* decl name */ if (duk_has_prop(thr, comp_ctx->curr_func.varmap_idx)) { /* shadowed, ignore */ } else { duk_get_prop_index(thr, comp_ctx->curr_func.decls_idx, i); /* decl name */ h_name = duk_known_hstring(thr, -1); if (h_name == DUK_HTHREAD_STRING_LC_ARGUMENTS(thr) && !comp_ctx->curr_func.is_arguments_shadowed) { /* E5 Section steps 7-8 */ DUK_DDD(DUK_DDDPRINT("'arguments' not shadowed by a function declaration, " "but appears as a variable declaration -> treat as " "a no-op for variable declaration purposes")); duk_pop(thr); continue; } /* XXX: spilling */ if (comp_ctx->curr_func.is_function) { duk_regconst_t reg_bind = DUK__ALLOCTEMP(comp_ctx); /* no need to init reg, it will be undefined on entry */ duk_push_int(thr, (duk_int_t) reg_bind); } else { duk_dup_top(thr); rc_name = duk__getconst(comp_ctx); duk_push_null(thr); declvar_flags = DUK_PROPDESC_FLAG_WRITABLE | DUK_PROPDESC_FLAG_ENUMERABLE; if (configurable_bindings) { declvar_flags |= DUK_PROPDESC_FLAG_CONFIGURABLE; } duk__emit_a_b_c(comp_ctx, DUK_OP_DECLVAR | DUK__EMIT_FLAG_NO_SHUFFLE_A | DUK__EMIT_FLAG_BC_REGCONST, (duk_regconst_t) declvar_flags /*flags*/, rc_name /*name*/, 0 /*value*/); } duk_put_prop(thr, comp_ctx->curr_func.varmap_idx); /* [ ... name reg/null ] -> [ ... ] */ } } /* * Wrap up */ DUK_DDD(DUK_DDDPRINT("varmap: %!T, is_arguments_shadowed=%ld", (duk_tval *) duk_get_tval(thr, comp_ctx->curr_func.varmap_idx), (long) comp_ctx->curr_func.is_arguments_shadowed)); DUK_ASSERT_TOP(thr, entry_top); return; error_outofregs: DUK_ERROR_RANGE(thr, DUK_STR_REG_LIMIT); DUK_UNREACHABLE(); return; error_argname: DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_ARG_NAME); DUK_UNREACHABLE(); return; } /* * Parse a function-body-like expression (FunctionBody or Program * in E5 grammar) using a two-pass parse. The productions appear * in the following contexts: * * - function expression * - function statement * - function declaration * - getter in object literal * - setter in object literal * - global code * - eval code * - Function constructor body * * This function only parses the statement list of the body; the argument * list and possible function name must be initialized by the caller. * For instance, for Function constructor, the argument names are originally * on the value stack. The parsing of statements ends either at an EOF or * a closing brace; this is controlled by an input flag. * * Note that there are many differences affecting parsing and even code * generation: * * - Global and eval code have an implicit return value generated * by the last statement; function code does not * * - Global code, eval code, and Function constructor body end in * an EOF, other bodies in a closing brace ('}') * * Upon entry, 'curr_tok' is ignored and the function will pull in the * first token on its own. Upon exit, 'curr_tok' is the terminating * token (EOF or closing brace). */ DUK_LOCAL void duk__parse_func_body(duk_compiler_ctx *comp_ctx, duk_bool_t expect_eof, duk_bool_t implicit_return_value, duk_small_int_t expect_token) { duk_compiler_func *func; duk_hthread *thr; duk_regconst_t reg_stmt_value = -1; duk_lexer_point lex_pt; duk_regconst_t temp_first; duk_small_int_t compile_round = 1; DUK_ASSERT(comp_ctx != NULL); thr = comp_ctx->thr; DUK_ASSERT(thr != NULL); func = &comp_ctx->curr_func; DUK_ASSERT(func != NULL); DUK__RECURSION_INCREASE(comp_ctx, thr); duk_require_stack(thr, DUK__FUNCTION_BODY_REQUIRE_SLOTS); /* * Store lexer position for a later rewind */ DUK_LEXER_GETPOINT(&comp_ctx->lex, &lex_pt); /* * Program code (global and eval code) has an implicit return value * from the last statement value (e.g. eval("1; 2+3;") returns 3). * This is not the case with functions. If implicit statement return * value is requested, all statements are coerced to a register * allocated here, and used in the implicit return statement below. */ /* XXX: this is pointless here because pass 1 is throw-away */ if (implicit_return_value) { reg_stmt_value = DUK__ALLOCTEMP(comp_ctx); /* If an implicit return value is needed by caller, it must be * initialized to 'undefined' because we don't know whether any * non-empty (where "empty" is a continuation type, and different * from an empty statement) statements will be executed. * * However, since 1st pass is a throwaway one, no need to emit * it here. */ #if 0 duk__emit_bc(comp_ctx, DUK_OP_LDUNDEF, 0); #endif } /* * First pass. * * Gather variable/function declarations needed for second pass. * Code generated is dummy and discarded. */ func->in_directive_prologue = 1; func->in_scanning = 1; func->may_direct_eval = 0; func->id_access_arguments = 0; func->id_access_slow = 0; func->id_access_slow_own = 0; func->reg_stmt_value = reg_stmt_value; #if defined(DUK_USE_DEBUGGER_SUPPORT) func->min_line = DUK_INT_MAX; func->max_line = 0; #endif /* duk__parse_stmts() expects curr_tok to be set; parse in "allow regexp literal" mode with current strictness */ if (expect_token >= 0) { /* Eating a left curly; regexp mode is allowed by left curly * based on duk__token_lbp[] automatically. */ DUK_ASSERT(expect_token == DUK_TOK_LCURLY); duk__update_lineinfo_currtoken(comp_ctx); duk__advance_expect(comp_ctx, expect_token); } else { /* Need to set curr_token.t because lexing regexp mode depends on current * token type. Zero value causes "allow regexp" mode. */ comp_ctx->curr_token.t = 0; duk__advance(comp_ctx); } DUK_DDD(DUK_DDDPRINT("begin 1st pass")); duk__parse_stmts(comp_ctx, 1, /* allow source elements */ expect_eof); /* expect EOF instead of } */ DUK_DDD(DUK_DDDPRINT("end 1st pass")); /* * Second (and possibly third) pass. * * Generate actual code. In most cases the need for shuffle * registers is detected during pass 1, but in some corner cases * we'll only detect it during pass 2 and a third pass is then * needed (see GH-115). */ for (;;) { duk_bool_t needs_shuffle_before = comp_ctx->curr_func.needs_shuffle; compile_round++; /* * Rewind lexer. * * duk__parse_stmts() expects curr_tok to be set; parse in "allow regexp * literal" mode with current strictness. * * curr_token line number info should be initialized for pass 2 before * generating prologue, to ensure prologue bytecode gets nice line numbers. */ DUK_DDD(DUK_DDDPRINT("rewind lexer")); DUK_LEXER_SETPOINT(&comp_ctx->lex, &lex_pt); comp_ctx->curr_token.t = 0; /* this is needed for regexp mode */ comp_ctx->curr_token.start_line = 0; /* needed for line number tracking (becomes prev_token.start_line) */ duk__advance(comp_ctx); /* * Reset function state and perform register allocation, which creates * 'varmap' for second pass. Function prologue for variable declarations, * binding value initializations etc is emitted as a by-product. * * Strict mode restrictions for duplicate and invalid argument * names are checked here now that we know whether the function * is actually strict. See: test-dev-strict-mode-boundary.js. * * Inner functions are compiled during pass 1 and are not reset. */ duk__reset_func_for_pass2(comp_ctx); func->in_directive_prologue = 1; func->in_scanning = 0; /* must be able to emit code, alloc consts, etc. */ duk__init_varmap_and_prologue_for_pass2(comp_ctx, (implicit_return_value ? ®_stmt_value : NULL)); func->reg_stmt_value = reg_stmt_value; temp_first = DUK__GETTEMP(comp_ctx); func->temp_first = temp_first; func->temp_next = temp_first; func->stmt_next = 0; func->label_next = 0; /* XXX: init or assert catch depth etc -- all values */ func->id_access_arguments = 0; func->id_access_slow = 0; func->id_access_slow_own = 0; /* * Check function name validity now that we know strictness. * This only applies to function declarations and expressions, * not setter/getter name. * * See: test-dev-strict-mode-boundary.js */ if (func->is_function && !func->is_setget && func->h_name != NULL) { if (func->is_strict) { if (duk__hstring_is_eval_or_arguments(comp_ctx, func->h_name)) { DUK_DDD(DUK_DDDPRINT("func name is 'eval' or 'arguments' in strict mode")); goto error_funcname; } if (DUK_HSTRING_HAS_STRICT_RESERVED_WORD(func->h_name)) { DUK_DDD(DUK_DDDPRINT("func name is a reserved word in strict mode")); goto error_funcname; } } else { if (DUK_HSTRING_HAS_RESERVED_WORD(func->h_name) && !DUK_HSTRING_HAS_STRICT_RESERVED_WORD(func->h_name)) { DUK_DDD(DUK_DDDPRINT("func name is a reserved word in non-strict mode")); goto error_funcname; } } } /* * Second pass parsing. */ if (implicit_return_value) { /* Default implicit return value. */ duk__emit_bc(comp_ctx, DUK_OP_LDUNDEF, 0); } DUK_DDD(DUK_DDDPRINT("begin 2nd pass")); duk__parse_stmts(comp_ctx, 1, /* allow source elements */ expect_eof); /* expect EOF instead of } */ DUK_DDD(DUK_DDDPRINT("end 2nd pass")); duk__update_lineinfo_currtoken(comp_ctx); if (needs_shuffle_before == comp_ctx->curr_func.needs_shuffle) { /* Shuffle decision not changed. */ break; } if (compile_round >= 3) { /* Should never happen but avoid infinite loop just in case. */ DUK_D(DUK_DPRINT("more than 3 compile passes needed, should never happen")); DUK_ERROR_INTERNAL(thr); } DUK_D(DUK_DPRINT("need additional round to compile function, round now %d", (int) compile_round)); } /* * Emit a final RETURN. * * It would be nice to avoid emitting an unnecessary "return" opcode * if the current PC is not reachable. However, this cannot be reliably * detected; even if the previous instruction is an unconditional jump, * there may be a previous jump which jumps to current PC (which is the * case for iteration and conditional statements, for instance). */ /* XXX: request a "last statement is terminal" from duk__parse_stmt() and duk__parse_stmts(); * we could avoid the last RETURN if we could ensure there is no way to get here * (directly or via a jump) */ DUK_ASSERT(comp_ctx->curr_func.catch_depth == 0); if (reg_stmt_value >= 0) { DUK_ASSERT(DUK__ISREG(reg_stmt_value)); duk__emit_bc(comp_ctx, DUK_OP_RETREG, reg_stmt_value /*reg*/); } else { duk__emit_op_only(comp_ctx, DUK_OP_RETUNDEF); } /* * Peephole optimize JUMP chains. */ duk__peephole_optimize_bytecode(comp_ctx); /* * comp_ctx->curr_func is now ready to be converted into an actual * function template. */ DUK__RECURSION_DECREASE(comp_ctx, thr); return; error_funcname: DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_FUNC_NAME); } /* * Parse a function-like expression: * * - function expression * - function declaration * - function statement (non-standard) * - setter/getter * * Adds the function to comp_ctx->curr_func function table and returns the * function number. * * On entry, curr_token points to: * * - the token after 'function' for function expression/declaration/statement * - the token after 'set' or 'get' for setter/getter */ /* Parse formals. */ DUK_LOCAL void duk__parse_func_formals(duk_compiler_ctx *comp_ctx) { duk_hthread *thr = comp_ctx->thr; duk_bool_t first = 1; duk_uarridx_t n; for (;;) { if (comp_ctx->curr_token.t == DUK_TOK_RPAREN) { break; } if (first) { /* no comma */ first = 0; } else { duk__advance_expect(comp_ctx, DUK_TOK_COMMA); } /* Note: when parsing a formal list in non-strict context, e.g. * "implements" is parsed as an identifier. When the function is * later detected to be strict, the argument list must be rechecked * against a larger set of reserved words (that of strict mode). * This is handled by duk__parse_func_body(). Here we recognize * whatever tokens are considered reserved in current strictness * (which is not always enough). */ if (comp_ctx->curr_token.t != DUK_TOK_IDENTIFIER) { DUK_ERROR_SYNTAX(thr, DUK_STR_EXPECTED_IDENTIFIER); } DUK_ASSERT(comp_ctx->curr_token.t == DUK_TOK_IDENTIFIER); DUK_ASSERT(comp_ctx->curr_token.str1 != NULL); DUK_DDD(DUK_DDDPRINT("formal argument: %!O", (duk_heaphdr *) comp_ctx->curr_token.str1)); /* XXX: append primitive */ duk_push_hstring(thr, comp_ctx->curr_token.str1); n = (duk_uarridx_t) duk_get_length(thr, comp_ctx->curr_func.argnames_idx); duk_put_prop_index(thr, comp_ctx->curr_func.argnames_idx, n); duk__advance(comp_ctx); /* eat identifier */ } } /* Parse a function-like expression, assuming that 'comp_ctx->curr_func' is * correctly set up. Assumes that curr_token is just after 'function' (or * 'set'/'get' etc). */ DUK_LOCAL void duk__parse_func_like_raw(duk_compiler_ctx *comp_ctx, duk_small_uint_t flags) { duk_hthread *thr = comp_ctx->thr; duk_token *tok; duk_bool_t no_advance; DUK_ASSERT(comp_ctx->curr_func.num_formals == 0); DUK_ASSERT(comp_ctx->curr_func.is_function == 1); DUK_ASSERT(comp_ctx->curr_func.is_eval == 0); DUK_ASSERT(comp_ctx->curr_func.is_global == 0); DUK_ASSERT(comp_ctx->curr_func.is_setget == ((flags & DUK__FUNC_FLAG_GETSET) != 0)); duk__update_lineinfo_currtoken(comp_ctx); /* * Function name (if any) * * We don't check for prohibited names here, because we don't * yet know whether the function will be strict. Function body * parsing handles this retroactively. * * For function expressions and declarations function name must * be an Identifer (excludes reserved words). For setter/getter * it is a PropertyName which allows reserved words and also * strings and numbers (e.g. "{ get 1() { ... } }"). * * Function parsing may start either from prev_token or curr_token * (object literal method definition uses prev_token for example). * This is dealt with for the initial token. */ no_advance = (flags & DUK__FUNC_FLAG_USE_PREVTOKEN); if (no_advance) { tok = &comp_ctx->prev_token; } else { tok = &comp_ctx->curr_token; } if (flags & DUK__FUNC_FLAG_GETSET) { /* PropertyName -> IdentifierName | StringLiteral | NumericLiteral */ if (tok->t_nores == DUK_TOK_IDENTIFIER || tok->t == DUK_TOK_STRING) { duk_push_hstring(thr, tok->str1); /* keep in valstack */ } else if (tok->t == DUK_TOK_NUMBER) { duk_push_number(thr, tok->num); duk_to_string(thr, -1); } else { DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_GETSET_NAME); } comp_ctx->curr_func.h_name = duk_known_hstring(thr, -1); /* borrowed reference */ } else { /* Function name is an Identifier (not IdentifierName), but we get * the raw name (not recognizing keywords) here and perform the name * checks only after pass 1. */ if (tok->t_nores == DUK_TOK_IDENTIFIER) { duk_push_hstring(thr, tok->str1); /* keep in valstack */ comp_ctx->curr_func.h_name = duk_known_hstring(thr, -1); /* borrowed reference */ } else { /* valstack will be unbalanced, which is OK */ DUK_ASSERT((flags & DUK__FUNC_FLAG_GETSET) == 0); DUK_ASSERT(comp_ctx->curr_func.h_name == NULL); no_advance = 1; if (flags & DUK__FUNC_FLAG_DECL) { DUK_ERROR_SYNTAX(thr, DUK_STR_FUNC_NAME_REQUIRED); } } } DUK_DD(DUK_DDPRINT("function name: %!O", (duk_heaphdr *) comp_ctx->curr_func.h_name)); if (!no_advance) { duk__advance(comp_ctx); } /* * Formal argument list * * We don't check for prohibited names or for duplicate argument * names here, becase we don't yet know whether the function will * be strict. Function body parsing handles this retroactively. */ duk__advance_expect(comp_ctx, DUK_TOK_LPAREN); duk__parse_func_formals(comp_ctx); DUK_ASSERT(comp_ctx->curr_token.t == DUK_TOK_RPAREN); duk__advance(comp_ctx); /* * Parse function body */ duk__parse_func_body(comp_ctx, 0, /* expect_eof */ 0, /* implicit_return_value */ DUK_TOK_LCURLY); /* expect_token */ /* * Convert duk_compiler_func to a function template and add it * to the parent function table. */ duk__convert_to_func_template(comp_ctx); /* -> [ ... func ] */ } /* Parse an inner function, adding the function template to the current function's * function table. Return a function number to be used by the outer function. * * Avoiding O(depth^2) inner function parsing is handled here. On the first pass, * compile and register the function normally into the 'funcs' array, also recording * a lexer point (offset/line) to the closing brace of the function. On the second * pass, skip the function and return the same 'fnum' as on the first pass by using * a running counter. * * An unfortunate side effect of this is that when parsing the inner function, almost * nothing is known of the outer function, i.e. the inner function's scope. We don't * need that information at the moment, but it would allow some optimizations if it * were used. */ DUK_LOCAL duk_int_t duk__parse_func_like_fnum(duk_compiler_ctx *comp_ctx, duk_small_uint_t flags) { duk_hthread *thr = comp_ctx->thr; duk_compiler_func old_func; duk_idx_t entry_top; duk_int_t fnum; /* * On second pass, skip the function. */ if (!comp_ctx->curr_func.in_scanning) { duk_lexer_point lex_pt; fnum = comp_ctx->curr_func.fnum_next++; duk_get_prop_index(thr, comp_ctx->curr_func.funcs_idx, (duk_uarridx_t) (fnum * 3 + 1)); lex_pt.offset = (duk_size_t) duk_to_uint(thr, -1); duk_pop(thr); duk_get_prop_index(thr, comp_ctx->curr_func.funcs_idx, (duk_uarridx_t) (fnum * 3 + 2)); lex_pt.line = duk_to_int(thr, -1); duk_pop(thr); DUK_DDD(DUK_DDDPRINT("second pass of an inner func, skip the function, reparse closing brace; lex offset=%ld, line=%ld", (long) lex_pt.offset, (long) lex_pt.line)); DUK_LEXER_SETPOINT(&comp_ctx->lex, &lex_pt); comp_ctx->curr_token.t = 0; /* this is needed for regexp mode */ comp_ctx->curr_token.start_line = 0; /* needed for line number tracking (becomes prev_token.start_line) */ duk__advance(comp_ctx); duk__advance_expect(comp_ctx, DUK_TOK_RCURLY); return fnum; } /* * On first pass, perform actual parsing. Remember valstack top on entry * to restore it later, and switch to using a new function in comp_ctx. */ entry_top = duk_get_top(thr); DUK_DDD(DUK_DDDPRINT("before func: entry_top=%ld, curr_tok.start_offset=%ld", (long) entry_top, (long) comp_ctx->curr_token.start_offset)); DUK_MEMCPY(&old_func, &comp_ctx->curr_func, sizeof(duk_compiler_func)); DUK_MEMZERO(&comp_ctx->curr_func, sizeof(duk_compiler_func)); duk__init_func_valstack_slots(comp_ctx); DUK_ASSERT(comp_ctx->curr_func.num_formals == 0); /* inherit initial strictness from parent */ comp_ctx->curr_func.is_strict = old_func.is_strict; /* XXX: It might be better to just store the flags into the curr_func * struct and use them as is without this flag interpretation step * here. */ DUK_ASSERT(comp_ctx->curr_func.is_notail == 0); comp_ctx->curr_func.is_function = 1; DUK_ASSERT(comp_ctx->curr_func.is_eval == 0); DUK_ASSERT(comp_ctx->curr_func.is_global == 0); comp_ctx->curr_func.is_setget = ((flags & DUK__FUNC_FLAG_GETSET) != 0); comp_ctx->curr_func.is_namebinding = !(flags & (DUK__FUNC_FLAG_GETSET | DUK__FUNC_FLAG_METDEF | DUK__FUNC_FLAG_DECL)); /* no name binding for: declarations, objlit getset, objlit method def */ comp_ctx->curr_func.is_constructable = !(flags & (DUK__FUNC_FLAG_GETSET | DUK__FUNC_FLAG_METDEF)); /* not constructable: objlit getset, objlit method def */ /* * Parse inner function */ duk__parse_func_like_raw(comp_ctx, flags); /* pushes function template */ /* prev_token.start_offset points to the closing brace here; when skipping * we're going to reparse the closing brace to ensure semicolon insertion * etc work as expected. */ DUK_DDD(DUK_DDDPRINT("after func: prev_tok.start_offset=%ld, curr_tok.start_offset=%ld", (long) comp_ctx->prev_token.start_offset, (long) comp_ctx->curr_token.start_offset)); DUK_ASSERT(comp_ctx->lex.input[comp_ctx->prev_token.start_offset] == (duk_uint8_t) DUK_ASC_RCURLY); /* XXX: append primitive */ DUK_ASSERT(duk_get_length(thr, old_func.funcs_idx) == (duk_size_t) (old_func.fnum_next * 3)); fnum = old_func.fnum_next++; if (fnum > DUK__MAX_FUNCS) { DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_FUNC_LIMIT); } /* array writes autoincrement length */ (void) duk_put_prop_index(thr, old_func.funcs_idx, (duk_uarridx_t) (fnum * 3)); duk_push_size_t(thr, comp_ctx->prev_token.start_offset); (void) duk_put_prop_index(thr, old_func.funcs_idx, (duk_uarridx_t) (fnum * 3 + 1)); duk_push_int(thr, comp_ctx->prev_token.start_line); (void) duk_put_prop_index(thr, old_func.funcs_idx, (duk_uarridx_t) (fnum * 3 + 2)); /* * Cleanup: restore original function, restore valstack state. * * Function declaration handling needs the function name to be pushed * on the value stack. */ if (flags & DUK__FUNC_FLAG_PUSHNAME_PASS1) { DUK_ASSERT(comp_ctx->curr_func.h_name != NULL); duk_push_hstring(thr, comp_ctx->curr_func.h_name); duk_replace(thr, entry_top); duk_set_top(thr, entry_top + 1); } else { duk_set_top(thr, entry_top); } DUK_MEMCPY((void *) &comp_ctx->curr_func, (void *) &old_func, sizeof(duk_compiler_func)); return fnum; } /* * Compile input string into an executable function template without * arguments. * * The string is parsed as the "Program" production of Ecmascript E5. * Compilation context can be either global code or eval code (see E5 * Sections 14 and 15.1.2.1). * * Input stack: [ ... filename ] * Output stack: [ ... func_template ] */ /* XXX: source code property */ DUK_LOCAL duk_ret_t duk__js_compile_raw(duk_hthread *thr, void *udata) { duk_hstring *h_filename; duk__compiler_stkstate *comp_stk; duk_compiler_ctx *comp_ctx; duk_lexer_point *lex_pt; duk_compiler_func *func; duk_idx_t entry_top; duk_bool_t is_strict; duk_bool_t is_eval; duk_bool_t is_funcexpr; duk_small_uint_t flags; DUK_ASSERT(thr != NULL); DUK_ASSERT(udata != NULL); /* * Arguments check */ entry_top = duk_get_top(thr); DUK_ASSERT(entry_top >= 1); comp_stk = (duk__compiler_stkstate *) udata; comp_ctx = &comp_stk->comp_ctx_alloc; lex_pt = &comp_stk->lex_pt_alloc; DUK_ASSERT(comp_ctx != NULL); DUK_ASSERT(lex_pt != NULL); flags = comp_stk->flags; is_eval = (flags & DUK_COMPILE_EVAL ? 1 : 0); is_strict = (flags & DUK_COMPILE_STRICT ? 1 : 0); is_funcexpr = (flags & DUK_COMPILE_FUNCEXPR ? 1 : 0); h_filename = duk_get_hstring(thr, -1); /* may be undefined */ /* * Init compiler and lexer contexts */ func = &comp_ctx->curr_func; #if defined(DUK_USE_EXPLICIT_NULL_INIT) comp_ctx->thr = NULL; comp_ctx->h_filename = NULL; comp_ctx->prev_token.str1 = NULL; comp_ctx->prev_token.str2 = NULL; comp_ctx->curr_token.str1 = NULL; comp_ctx->curr_token.str2 = NULL; #endif duk_require_stack(thr, DUK__COMPILE_ENTRY_SLOTS); duk_push_dynamic_buffer(thr, 0); /* entry_top + 0 */ duk_push_undefined(thr); /* entry_top + 1 */ duk_push_undefined(thr); /* entry_top + 2 */ duk_push_undefined(thr); /* entry_top + 3 */ duk_push_undefined(thr); /* entry_top + 4 */ comp_ctx->thr = thr; comp_ctx->h_filename = h_filename; comp_ctx->tok11_idx = entry_top + 1; comp_ctx->tok12_idx = entry_top + 2; comp_ctx->tok21_idx = entry_top + 3; comp_ctx->tok22_idx = entry_top + 4; comp_ctx->recursion_limit = DUK_USE_COMPILER_RECLIMIT; /* comp_ctx->lex has been pre-initialized by caller: it has been * zeroed and input/input_length has been set. */ comp_ctx->lex.thr = thr; /* comp_ctx->lex.input and comp_ctx->lex.input_length filled by caller */ comp_ctx->lex.slot1_idx = comp_ctx->tok11_idx; comp_ctx->lex.slot2_idx = comp_ctx->tok12_idx; comp_ctx->lex.buf_idx = entry_top + 0; comp_ctx->lex.buf = (duk_hbuffer_dynamic *) duk_known_hbuffer(thr, entry_top + 0); DUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(comp_ctx->lex.buf) && !DUK_HBUFFER_HAS_EXTERNAL(comp_ctx->lex.buf)); comp_ctx->lex.token_limit = DUK_COMPILER_TOKEN_LIMIT; lex_pt->offset = 0; lex_pt->line = 1; DUK_LEXER_SETPOINT(&comp_ctx->lex, lex_pt); /* fills window */ comp_ctx->curr_token.start_line = 0; /* needed for line number tracking (becomes prev_token.start_line) */ /* * Initialize function state for a zero-argument function */ duk__init_func_valstack_slots(comp_ctx); DUK_ASSERT(func->num_formals == 0); if (is_funcexpr) { /* Name will be filled from function expression, not by caller. * This case is used by Function constructor and duk_compile() * API with the DUK_COMPILE_FUNCTION option. */ DUK_ASSERT(func->h_name == NULL); } else { duk_push_hstring_stridx(thr, (is_eval ? DUK_STRIDX_EVAL : DUK_STRIDX_GLOBAL)); func->h_name = duk_get_hstring(thr, -1); } /* * Parse a function body or a function-like expression, depending * on flags. */ DUK_ASSERT(func->is_setget == 0); func->is_strict = (duk_uint8_t) is_strict; DUK_ASSERT(func->is_notail == 0); if (is_funcexpr) { func->is_function = 1; DUK_ASSERT(func->is_eval == 0); DUK_ASSERT(func->is_global == 0); func->is_namebinding = 1; func->is_constructable = 1; duk__advance(comp_ctx); /* init 'curr_token' */ duk__advance_expect(comp_ctx, DUK_TOK_FUNCTION); (void) duk__parse_func_like_raw(comp_ctx, 0 /*flags*/); } else { DUK_ASSERT(func->is_function == 0); DUK_ASSERT(is_eval == 0 || is_eval == 1); func->is_eval = (duk_uint8_t) is_eval; func->is_global = (duk_uint8_t) !is_eval; DUK_ASSERT(func->is_namebinding == 0); DUK_ASSERT(func->is_constructable == 0); duk__parse_func_body(comp_ctx, 1, /* expect_eof */ 1, /* implicit_return_value */ -1); /* expect_token */ } /* * Convert duk_compiler_func to a function template */ duk__convert_to_func_template(comp_ctx); /* * Wrapping duk_safe_call() will mangle the stack, just return stack top */ /* [ ... filename (temps) func ] */ return 1; } DUK_INTERNAL void duk_js_compile(duk_hthread *thr, const duk_uint8_t *src_buffer, duk_size_t src_length, duk_small_uint_t flags) { duk__compiler_stkstate comp_stk; duk_compiler_ctx *prev_ctx; duk_ret_t safe_rc; DUK_ASSERT(thr != NULL); DUK_ASSERT(src_buffer != NULL); /* preinitialize lexer state partially */ DUK_MEMZERO(&comp_stk, sizeof(comp_stk)); comp_stk.flags = flags; DUK_LEXER_INITCTX(&comp_stk.comp_ctx_alloc.lex); comp_stk.comp_ctx_alloc.lex.input = src_buffer; comp_stk.comp_ctx_alloc.lex.input_length = src_length; comp_stk.comp_ctx_alloc.lex.flags = flags; /* Forward flags directly for now. */ /* [ ... filename ] */ prev_ctx = thr->compile_ctx; thr->compile_ctx = &comp_stk.comp_ctx_alloc; /* for duk_error_augment.c */ safe_rc = duk_safe_call(thr, duk__js_compile_raw, (void *) &comp_stk /*udata*/, 1 /*nargs*/, 1 /*nrets*/); thr->compile_ctx = prev_ctx; /* must restore reliably before returning */ if (safe_rc != DUK_EXEC_SUCCESS) { DUK_D(DUK_DPRINT("compilation failed: %!T", duk_get_tval(thr, -1))); (void) duk_throw(thr); } /* [ ... template ] */ } /* automatic undefs */ #undef DUK__ALLOCTEMP #undef DUK__ALLOCTEMPS #undef DUK__ALLOW_AUTO_SEMI_ALWAYS #undef DUK__BC_INITIAL_INSTS #undef DUK__BP_ADDITIVE #undef DUK__BP_ASSIGNMENT #undef DUK__BP_BAND #undef DUK__BP_BOR #undef DUK__BP_BXOR #undef DUK__BP_CALL #undef DUK__BP_CLOSING #undef DUK__BP_COMMA #undef DUK__BP_CONDITIONAL #undef DUK__BP_EOF #undef DUK__BP_EQUALITY #undef DUK__BP_EXPONENTIATION #undef DUK__BP_FOR_EXPR #undef DUK__BP_INVALID #undef DUK__BP_LAND #undef DUK__BP_LOR #undef DUK__BP_MEMBER #undef DUK__BP_MULTIPLICATIVE #undef DUK__BP_POSTFIX #undef DUK__BP_RELATIONAL #undef DUK__BP_SHIFT #undef DUK__COMPILE_ENTRY_SLOTS #undef DUK__CONST_MARKER #undef DUK__DUMP_ISPEC #undef DUK__DUMP_IVALUE #undef DUK__EMIT_FLAG_A_IS_SOURCE #undef DUK__EMIT_FLAG_BC_REGCONST #undef DUK__EMIT_FLAG_B_IS_TARGET #undef DUK__EMIT_FLAG_C_IS_TARGET #undef DUK__EMIT_FLAG_NO_SHUFFLE_A #undef DUK__EMIT_FLAG_NO_SHUFFLE_B #undef DUK__EMIT_FLAG_NO_SHUFFLE_C #undef DUK__EMIT_FLAG_RESERVE_JUMPSLOT #undef DUK__EXPR_FLAG_ALLOW_EMPTY #undef DUK__EXPR_FLAG_REJECT_IN #undef DUK__EXPR_FLAG_REQUIRE_INIT #undef DUK__EXPR_RBP_MASK #undef DUK__FUNCTION_BODY_REQUIRE_SLOTS #undef DUK__FUNCTION_INIT_REQUIRE_SLOTS #undef DUK__FUNC_FLAG_DECL #undef DUK__FUNC_FLAG_GETSET #undef DUK__FUNC_FLAG_METDEF #undef DUK__FUNC_FLAG_PUSHNAME_PASS1 #undef DUK__FUNC_FLAG_USE_PREVTOKEN #undef DUK__GETCONST_MAX_CONSTS_CHECK #undef DUK__GETTEMP #undef DUK__HAS_TERM #undef DUK__HAS_VAL #undef DUK__ISCONST #undef DUK__ISREG #undef DUK__ISREG_NOTTEMP #undef DUK__ISREG_TEMP #undef DUK__IS_TERMINAL #undef DUK__IVAL_FLAG_ALLOW_CONST #undef DUK__IVAL_FLAG_REQUIRE_SHORT #undef DUK__IVAL_FLAG_REQUIRE_TEMP #undef DUK__MAX_ARRAY_INIT_VALUES #undef DUK__MAX_CONSTS #undef DUK__MAX_FUNCS #undef DUK__MAX_OBJECT_INIT_PAIRS #undef DUK__MAX_TEMPS #undef DUK__MK_LBP #undef DUK__MK_LBP_FLAGS #undef DUK__OBJ_LIT_KEY_GET #undef DUK__OBJ_LIT_KEY_PLAIN #undef DUK__OBJ_LIT_KEY_SET #undef DUK__PARSE_EXPR_SLOTS #undef DUK__PARSE_STATEMENTS_SLOTS #undef DUK__RECURSION_DECREASE #undef DUK__RECURSION_INCREASE #undef DUK__REMOVECONST #undef DUK__SETTEMP #undef DUK__SETTEMP_CHECKMAX #undef DUK__STILL_PROLOGUE #undef DUK__TOKEN_LBP_BP_MASK #undef DUK__TOKEN_LBP_FLAG_NO_REGEXP #undef DUK__TOKEN_LBP_FLAG_TERMINATES #undef DUK__TOKEN_LBP_FLAG_UNUSED #undef DUK__TOKEN_LBP_GET_BP #line 1 "duk_js_executor.c" /* * Ecmascript bytecode executor. */ /* #include duk_internal.h -> already included */ /* * Local declarations. */ DUK_LOCAL_DECL void duk__js_execute_bytecode_inner(duk_hthread *entry_thread, duk_activation *entry_act); /* * Misc helpers. */ /* Forced inline declaration, only applied for performance oriented build. */ #if defined(DUK_USE_EXEC_PREFER_SIZE) #define DUK__INLINE_PERF #define DUK__NOINLINE_PERF #else #define DUK__INLINE_PERF DUK_ALWAYS_INLINE #define DUK__NOINLINE_PERF DUK_NOINLINE #endif /* Replace value stack top to value at 'tv_ptr'. Optimize for * performance by only applying the net refcount change. */ #define DUK__REPLACE_TO_TVPTR(thr,tv_ptr) do { \ duk_hthread *duk__thr; \ duk_tval *duk__tvsrc; \ duk_tval *duk__tvdst; \ duk_tval duk__tvtmp; \ duk__thr = (thr); \ duk__tvsrc = DUK_GET_TVAL_NEGIDX(duk__thr, -1); \ duk__tvdst = (tv_ptr); \ DUK_TVAL_SET_TVAL(&duk__tvtmp, duk__tvdst); \ DUK_TVAL_SET_TVAL(duk__tvdst, duk__tvsrc); \ DUK_TVAL_SET_UNDEFINED(duk__tvsrc); /* value stack init policy */ \ duk__thr->valstack_top = duk__tvsrc; \ DUK_TVAL_DECREF(duk__thr, &duk__tvtmp); \ } while (0) /* XXX: candidate of being an internal shared API call */ #if 0 /* unused */ DUK_LOCAL void duk__push_tvals_incref_only(duk_hthread *thr, duk_tval *tv_src, duk_small_uint_fast_t count) { duk_tval *tv_dst; duk_size_t copy_size; duk_size_t i; tv_dst = thr->valstack_top; copy_size = sizeof(duk_tval) * count; DUK_MEMCPY((void *) tv_dst, (const void *) tv_src, copy_size); for (i = 0; i < count; i++) { DUK_TVAL_INCREF(thr, tv_dst); tv_dst++; } thr->valstack_top = tv_dst; } #endif /* * Arithmetic, binary, and logical helpers. * * Note: there is no opcode for logical AND or logical OR; this is on * purpose, because the evalution order semantics for them make such * opcodes pretty pointless: short circuiting means they are most * comfortably implemented as jumps. However, a logical NOT opcode * is useful. * * Note: careful with duk_tval pointers here: they are potentially * invalidated by any DECREF and almost any API call. It's still * preferable to work without making a copy but that's not always * possible. */ DUK_LOCAL DUK__INLINE_PERF duk_double_t duk__compute_mod(duk_double_t d1, duk_double_t d2) { return (duk_double_t) duk_js_arith_mod((double) d1, (double) d2); } #if defined(DUK_USE_ES7_EXP_OPERATOR) DUK_LOCAL DUK__INLINE_PERF duk_double_t duk__compute_exp(duk_double_t d1, duk_double_t d2) { return (duk_double_t) duk_js_arith_pow((double) d1, (double) d2); } #endif DUK_LOCAL DUK__INLINE_PERF void duk__vm_arith_add(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_small_uint_fast_t idx_z) { /* * Addition operator is different from other arithmetic * operations in that it also provides string concatenation. * Hence it is implemented separately. * * There is a fast path for number addition. Other cases go * through potentially multiple coercions as described in the * E5 specification. It may be possible to reduce the number * of coercions, but this must be done carefully to preserve * the exact semantics. * * E5 Section 11.6.1. * * Custom types also have special behavior implemented here. */ duk_double_union du; DUK_ASSERT(thr != NULL); DUK_ASSERT(tv_x != NULL); /* may be reg or const */ DUK_ASSERT(tv_y != NULL); /* may be reg or const */ DUK_ASSERT_DISABLE(idx_z >= 0); /* unsigned */ DUK_ASSERT((duk_uint_t) idx_z < (duk_uint_t) duk_get_top(thr)); /* * Fast paths */ #if defined(DUK_USE_FASTINT) if (DUK_TVAL_IS_FASTINT(tv_x) && DUK_TVAL_IS_FASTINT(tv_y)) { duk_int64_t v1, v2, v3; duk_int32_t v3_hi; duk_tval *tv_z; /* Input values are signed 48-bit so we can detect overflow * reliably from high bits or just a comparison. */ v1 = DUK_TVAL_GET_FASTINT(tv_x); v2 = DUK_TVAL_GET_FASTINT(tv_y); v3 = v1 + v2; v3_hi = (duk_int32_t) (v3 >> 32); if (DUK_LIKELY(v3_hi >= DUK_I64_CONSTANT(-0x8000) && v3_hi <= DUK_I64_CONSTANT(0x7fff))) { tv_z = thr->valstack_bottom + idx_z; DUK_TVAL_SET_FASTINT_UPDREF(thr, tv_z, v3); /* side effects */ return; } else { /* overflow, fall through */ ; } } #endif /* DUK_USE_FASTINT */ if (DUK_TVAL_IS_NUMBER(tv_x) && DUK_TVAL_IS_NUMBER(tv_y)) { #if !defined(DUK_USE_EXEC_PREFER_SIZE) duk_tval *tv_z; #endif du.d = DUK_TVAL_GET_NUMBER(tv_x) + DUK_TVAL_GET_NUMBER(tv_y); #if defined(DUK_USE_EXEC_PREFER_SIZE) duk_push_number(thr, du.d); /* will NaN normalize result */ duk_replace(thr, (duk_idx_t) idx_z); #else /* DUK_USE_EXEC_PREFER_SIZE */ DUK_DBLUNION_NORMALIZE_NAN_CHECK(&du); DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du)); tv_z = thr->valstack_bottom + idx_z; DUK_TVAL_SET_NUMBER_UPDREF(thr, tv_z, du.d); /* side effects */ #endif /* DUK_USE_EXEC_PREFER_SIZE */ return; } /* * Slow path: potentially requires function calls for coercion */ duk_push_tval(thr, tv_x); duk_push_tval(thr, tv_y); duk_to_primitive(thr, -2, DUK_HINT_NONE); /* side effects -> don't use tv_x, tv_y after */ duk_to_primitive(thr, -1, DUK_HINT_NONE); /* Since Duktape 2.x plain buffers are treated like ArrayBuffer. */ if (duk_is_string(thr, -2) || duk_is_string(thr, -1)) { /* Symbols shouldn't technically be handled here, but should * go into the default ToNumber() coercion path instead and * fail there with a TypeError. However, there's a ToString() * in duk_concat_2() which also fails with TypeError so no * explicit check is needed. */ duk_concat_2(thr); /* [... s1 s2] -> [... s1+s2] */ } else { duk_double_t d1, d2; d1 = duk_to_number_m2(thr); d2 = duk_to_number_m1(thr); DUK_ASSERT(duk_is_number(thr, -2)); DUK_ASSERT(duk_is_number(thr, -1)); DUK_ASSERT_DOUBLE_IS_NORMALIZED(d1); DUK_ASSERT_DOUBLE_IS_NORMALIZED(d2); du.d = d1 + d2; duk_pop_2_unsafe(thr); duk_push_number(thr, du.d); /* will NaN normalize result */ } duk_replace(thr, (duk_idx_t) idx_z); /* side effects */ } DUK_LOCAL DUK__INLINE_PERF void duk__vm_arith_binary_op(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_uint_fast_t idx_z, duk_small_uint_fast_t opcode) { /* * Arithmetic operations other than '+' have number-only semantics * and are implemented here. The separate switch-case here means a * "double dispatch" of the arithmetic opcode, but saves code space. * * E5 Sections 11.5, 11.5.1, 11.5.2, 11.5.3, 11.6, 11.6.1, 11.6.2, 11.6.3. */ duk_double_t d1, d2; duk_double_union du; duk_small_uint_fast_t opcode_shifted; #if defined(DUK_USE_FASTINT) || !defined(DUK_USE_EXEC_PREFER_SIZE) duk_tval *tv_z; #endif DUK_ASSERT(thr != NULL); DUK_ASSERT(tv_x != NULL); /* may be reg or const */ DUK_ASSERT(tv_y != NULL); /* may be reg or const */ DUK_ASSERT_DISABLE(idx_z >= 0); /* unsigned */ DUK_ASSERT((duk_uint_t) idx_z < (duk_uint_t) duk_get_top(thr)); opcode_shifted = opcode >> 2; /* Get base opcode without reg/const modifiers. */ #if defined(DUK_USE_FASTINT) if (DUK_TVAL_IS_FASTINT(tv_x) && DUK_TVAL_IS_FASTINT(tv_y)) { duk_int64_t v1, v2, v3; duk_int32_t v3_hi; v1 = DUK_TVAL_GET_FASTINT(tv_x); v2 = DUK_TVAL_GET_FASTINT(tv_y); switch (opcode_shifted) { case DUK_OP_SUB >> 2: { v3 = v1 - v2; break; } case DUK_OP_MUL >> 2: { /* Must ensure result is 64-bit (no overflow); a * simple and sufficient fast path is to allow only * 32-bit inputs. Avoid zero inputs to avoid * negative zero issues (-1 * 0 = -0, for instance). */ if (v1 >= DUK_I64_CONSTANT(-0x80000000) && v1 <= DUK_I64_CONSTANT(0x7fffffff) && v1 != 0 && v2 >= DUK_I64_CONSTANT(-0x80000000) && v2 <= DUK_I64_CONSTANT(0x7fffffff) && v2 != 0) { v3 = v1 * v2; } else { goto skip_fastint; } break; } case DUK_OP_DIV >> 2: { /* Don't allow a zero divisor. Fast path check by * "verifying" with multiplication. Also avoid zero * dividend to avoid negative zero issues (0 / -1 = -0 * for instance). */ if (v1 == 0 || v2 == 0) { goto skip_fastint; } v3 = v1 / v2; if (v3 * v2 != v1) { goto skip_fastint; } break; } case DUK_OP_MOD >> 2: { /* Don't allow a zero divisor. Restrict both v1 and * v2 to positive values to avoid compiler specific * behavior. */ if (v1 < 1 || v2 < 1) { goto skip_fastint; } v3 = v1 % v2; DUK_ASSERT(v3 >= 0); DUK_ASSERT(v3 < v2); DUK_ASSERT(v1 - (v1 / v2) * v2 == v3); break; } default: { /* Possible with DUK_OP_EXP. */ goto skip_fastint; } } v3_hi = (duk_int32_t) (v3 >> 32); if (DUK_LIKELY(v3_hi >= DUK_I64_CONSTANT(-0x8000) && v3_hi <= DUK_I64_CONSTANT(0x7fff))) { tv_z = thr->valstack_bottom + idx_z; DUK_TVAL_SET_FASTINT_UPDREF(thr, tv_z, v3); /* side effects */ return; } /* fall through if overflow etc */ } skip_fastint: #endif /* DUK_USE_FASTINT */ if (DUK_TVAL_IS_NUMBER(tv_x) && DUK_TVAL_IS_NUMBER(tv_y)) { /* fast path */ d1 = DUK_TVAL_GET_NUMBER(tv_x); d2 = DUK_TVAL_GET_NUMBER(tv_y); } else { duk_push_tval(thr, tv_x); duk_push_tval(thr, tv_y); d1 = duk_to_number_m2(thr); /* side effects */ d2 = duk_to_number_m1(thr); DUK_ASSERT(duk_is_number(thr, -2)); DUK_ASSERT(duk_is_number(thr, -1)); DUK_ASSERT_DOUBLE_IS_NORMALIZED(d1); DUK_ASSERT_DOUBLE_IS_NORMALIZED(d2); duk_pop_2_unsafe(thr); } switch (opcode_shifted) { case DUK_OP_SUB >> 2: { du.d = d1 - d2; break; } case DUK_OP_MUL >> 2: { du.d = d1 * d2; break; } case DUK_OP_DIV >> 2: { du.d = d1 / d2; break; } case DUK_OP_MOD >> 2: { du.d = duk__compute_mod(d1, d2); break; } #if defined(DUK_USE_ES7_EXP_OPERATOR) case DUK_OP_EXP >> 2: { du.d = duk__compute_exp(d1, d2); break; } #endif default: { DUK_UNREACHABLE(); du.d = DUK_DOUBLE_NAN; /* should not happen */ break; } } #if defined(DUK_USE_EXEC_PREFER_SIZE) duk_push_number(thr, du.d); /* will NaN normalize result */ duk_replace(thr, (duk_idx_t) idx_z); #else /* DUK_USE_EXEC_PREFER_SIZE */ /* important to use normalized NaN with 8-byte tagged types */ DUK_DBLUNION_NORMALIZE_NAN_CHECK(&du); DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du)); tv_z = thr->valstack_bottom + idx_z; DUK_TVAL_SET_NUMBER_UPDREF(thr, tv_z, du.d); /* side effects */ #endif /* DUK_USE_EXEC_PREFER_SIZE */ } DUK_LOCAL DUK__INLINE_PERF void duk__vm_bitwise_binary_op(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_small_uint_fast_t idx_z, duk_small_uint_fast_t opcode) { /* * Binary bitwise operations use different coercions (ToInt32, ToUint32) * depending on the operation. We coerce the arguments first using * ToInt32(), and then cast to an 32-bit value if necessary. Note that * such casts must be correct even if there is no native 32-bit type * (e.g., duk_int32_t and duk_uint32_t are 64-bit). * * E5 Sections 11.10, 11.7.1, 11.7.2, 11.7.3 */ duk_int32_t i1, i2, i3; duk_uint32_t u1, u2, u3; #if defined(DUK_USE_FASTINT) duk_int64_t fi3; #else duk_double_t d3; #endif duk_small_uint_fast_t opcode_shifted; #if defined(DUK_USE_FASTINT) || !defined(DUK_USE_EXEC_PREFER_SIZE) duk_tval *tv_z; #endif DUK_ASSERT(thr != NULL); DUK_ASSERT(tv_x != NULL); /* may be reg or const */ DUK_ASSERT(tv_y != NULL); /* may be reg or const */ DUK_ASSERT_DISABLE(idx_z >= 0); /* unsigned */ DUK_ASSERT((duk_uint_t) idx_z < (duk_uint_t) duk_get_top(thr)); opcode_shifted = opcode >> 2; /* Get base opcode without reg/const modifiers. */ #if defined(DUK_USE_FASTINT) if (DUK_TVAL_IS_FASTINT(tv_x) && DUK_TVAL_IS_FASTINT(tv_y)) { i1 = (duk_int32_t) DUK_TVAL_GET_FASTINT_I32(tv_x); i2 = (duk_int32_t) DUK_TVAL_GET_FASTINT_I32(tv_y); } else #endif /* DUK_USE_FASTINT */ { duk_push_tval(thr, tv_x); duk_push_tval(thr, tv_y); i1 = duk_to_int32(thr, -2); i2 = duk_to_int32(thr, -1); duk_pop_2_unsafe(thr); } switch (opcode_shifted) { case DUK_OP_BAND >> 2: { i3 = i1 & i2; break; } case DUK_OP_BOR >> 2: { i3 = i1 | i2; break; } case DUK_OP_BXOR >> 2: { i3 = i1 ^ i2; break; } case DUK_OP_BASL >> 2: { /* Signed shift, named "arithmetic" (asl) because the result * is signed, e.g. 4294967295 << 1 -> -2. Note that result * must be masked. */ u2 = ((duk_uint32_t) i2) & 0xffffffffUL; i3 = (duk_int32_t) (((duk_uint32_t) i1) << (u2 & 0x1fUL)); /* E5 Section 11.7.1, steps 7 and 8 */ i3 = i3 & ((duk_int32_t) 0xffffffffUL); /* Note: left shift, should mask */ break; } case DUK_OP_BASR >> 2: { /* signed shift */ u2 = ((duk_uint32_t) i2) & 0xffffffffUL; i3 = i1 >> (u2 & 0x1fUL); /* E5 Section 11.7.2, steps 7 and 8 */ break; } case DUK_OP_BLSR >> 2: { /* unsigned shift */ u1 = ((duk_uint32_t) i1) & 0xffffffffUL; u2 = ((duk_uint32_t) i2) & 0xffffffffUL; /* special result value handling */ u3 = u1 >> (u2 & 0x1fUL); /* E5 Section 11.7.2, steps 7 and 8 */ #if defined(DUK_USE_FASTINT) fi3 = (duk_int64_t) u3; goto fastint_result_set; #else d3 = (duk_double_t) u3; goto result_set; #endif } default: { DUK_UNREACHABLE(); i3 = 0; /* should not happen */ break; } } #if defined(DUK_USE_FASTINT) /* Result is always fastint compatible. */ /* XXX: Set 32-bit result (but must then handle signed and * unsigned results separately). */ fi3 = (duk_int64_t) i3; fastint_result_set: tv_z = thr->valstack_bottom + idx_z; DUK_TVAL_SET_FASTINT_UPDREF(thr, tv_z, fi3); /* side effects */ #else /* DUK_USE_FASTINT */ d3 = (duk_double_t) i3; result_set: DUK_ASSERT(!DUK_ISNAN(d3)); /* 'd3' is never NaN, so no need to normalize */ DUK_ASSERT_DOUBLE_IS_NORMALIZED(d3); /* always normalized */ #if defined(DUK_USE_EXEC_PREFER_SIZE) duk_push_number(thr, d3); /* would NaN normalize result, but unnecessary */ duk_replace(thr, (duk_idx_t) idx_z); #else /* DUK_USE_EXEC_PREFER_SIZE */ tv_z = thr->valstack_bottom + idx_z; DUK_TVAL_SET_NUMBER_UPDREF(thr, tv_z, d3); /* side effects */ #endif /* DUK_USE_EXEC_PREFER_SIZE */ #endif /* DUK_USE_FASTINT */ } /* In-place unary operation. */ DUK_LOCAL DUK__INLINE_PERF void duk__vm_arith_unary_op(duk_hthread *thr, duk_uint_fast_t idx_src, duk_uint_fast_t idx_dst, duk_small_uint_fast_t opcode) { /* * Arithmetic operations other than '+' have number-only semantics * and are implemented here. The separate switch-case here means a * "double dispatch" of the arithmetic opcode, but saves code space. * * E5 Sections 11.5, 11.5.1, 11.5.2, 11.5.3, 11.6, 11.6.1, 11.6.2, 11.6.3. */ duk_tval *tv; duk_double_t d1; duk_double_union du; DUK_ASSERT(thr != NULL); DUK_ASSERT(opcode == DUK_OP_UNM || opcode == DUK_OP_UNP); DUK_ASSERT_DISABLE(idx_src >= 0); DUK_ASSERT_DISABLE(idx_dst >= 0); tv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_src); #if defined(DUK_USE_FASTINT) if (DUK_TVAL_IS_FASTINT(tv)) { duk_int64_t v1, v2; v1 = DUK_TVAL_GET_FASTINT(tv); if (opcode == DUK_OP_UNM) { /* The smallest fastint is no longer 48-bit when * negated. Positive zero becames negative zero * (cannot be represented) when negated. */ if (DUK_LIKELY(v1 != DUK_FASTINT_MIN && v1 != 0)) { v2 = -v1; tv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_dst); DUK_TVAL_SET_FASTINT_UPDREF(thr, tv, v2); return; } } else { /* ToNumber() for a fastint is a no-op. */ DUK_ASSERT(opcode == DUK_OP_UNP); v2 = v1; tv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_dst); DUK_TVAL_SET_FASTINT_UPDREF(thr, tv, v2); return; } /* fall through if overflow etc */ } #endif /* DUK_USE_FASTINT */ if (DUK_TVAL_IS_NUMBER(tv)) { d1 = DUK_TVAL_GET_NUMBER(tv); } else { d1 = duk_to_number_tval(thr, tv); /* side effects */ } if (opcode == DUK_OP_UNP) { /* ToNumber() for a double is a no-op, but unary plus is * used to force a fastint check so do that here. */ du.d = d1; DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du)); #if defined(DUK_USE_FASTINT) tv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_dst); DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF(thr, tv, du.d); /* always 'fast', i.e. inlined */ return; #endif } else { DUK_ASSERT(opcode == DUK_OP_UNM); du.d = -d1; DUK_DBLUNION_NORMALIZE_NAN_CHECK(&du); /* mandatory if du.d is a NaN */ DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du)); } /* XXX: size optimize: push+replace? */ tv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_dst); DUK_TVAL_SET_NUMBER_UPDREF(thr, tv, du.d); } DUK_LOCAL DUK__INLINE_PERF void duk__vm_bitwise_not(duk_hthread *thr, duk_uint_fast_t idx_src, duk_uint_fast_t idx_dst) { /* * E5 Section 11.4.8 */ duk_tval *tv; duk_int32_t i1, i2; DUK_ASSERT(thr != NULL); DUK_ASSERT_DISABLE(idx_src >= 0); DUK_ASSERT_DISABLE(idx_dst >= 0); DUK_ASSERT((duk_uint_t) idx_src < (duk_uint_t) duk_get_top(thr)); DUK_ASSERT((duk_uint_t) idx_dst < (duk_uint_t) duk_get_top(thr)); tv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_src); #if defined(DUK_USE_FASTINT) if (DUK_TVAL_IS_FASTINT(tv)) { i1 = (duk_int32_t) DUK_TVAL_GET_FASTINT_I32(tv); } else #endif /* DUK_USE_FASTINT */ { duk_push_tval(thr, tv); i1 = duk_to_int32(thr, -1); /* side effects */ duk_pop_unsafe(thr); } /* Result is always fastint compatible. */ i2 = ~i1; tv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_dst); DUK_TVAL_SET_I32_UPDREF(thr, tv, i2); /* side effects */ } DUK_LOCAL DUK__INLINE_PERF void duk__vm_logical_not(duk_hthread *thr, duk_uint_fast_t idx_src, duk_uint_fast_t idx_dst) { /* * E5 Section 11.4.9 */ duk_tval *tv; duk_bool_t res; DUK_ASSERT(thr != NULL); DUK_ASSERT_DISABLE(idx_src >= 0); DUK_ASSERT_DISABLE(idx_dst >= 0); DUK_ASSERT((duk_uint_t) idx_src < (duk_uint_t) duk_get_top(thr)); DUK_ASSERT((duk_uint_t) idx_dst < (duk_uint_t) duk_get_top(thr)); /* ToBoolean() does not require any operations with side effects so * we can do it efficiently. For footprint it would be better to use * duk_js_toboolean() and then push+replace to the result slot. */ tv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_src); res = duk_js_toboolean(tv); /* does not modify 'tv' */ DUK_ASSERT(res == 0 || res == 1); res ^= 1; tv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_dst); /* XXX: size optimize: push+replace? */ DUK_TVAL_SET_BOOLEAN_UPDREF(thr, tv, res); /* side effects */ } /* XXX: size optimized variant */ DUK_LOCAL DUK__INLINE_PERF void duk__prepost_incdec_reg_helper(duk_hthread *thr, duk_tval *tv_dst, duk_tval *tv_src, duk_small_uint_t op) { duk_double_t x, y, z; /* Two lowest bits of opcode are used to distinguish * variants. Bit 0 = inc(0)/dec(1), bit 1 = pre(0)/post(1). */ DUK_ASSERT((DUK_OP_PREINCR & 0x03) == 0x00); DUK_ASSERT((DUK_OP_PREDECR & 0x03) == 0x01); DUK_ASSERT((DUK_OP_POSTINCR & 0x03) == 0x02); DUK_ASSERT((DUK_OP_POSTDECR & 0x03) == 0x03); #if defined(DUK_USE_FASTINT) if (DUK_TVAL_IS_FASTINT(tv_src)) { duk_int64_t x_fi, y_fi, z_fi; x_fi = DUK_TVAL_GET_FASTINT(tv_src); if (op & 0x01) { if (DUK_UNLIKELY(x_fi == DUK_FASTINT_MIN)) { goto skip_fastint; } y_fi = x_fi - 1; } else { if (DUK_UNLIKELY(x_fi == DUK_FASTINT_MAX)) { goto skip_fastint; } y_fi = x_fi + 1; } DUK_TVAL_SET_FASTINT(tv_src, y_fi); /* no need for refcount update */ z_fi = (op & 0x02) ? x_fi : y_fi; DUK_TVAL_SET_FASTINT_UPDREF(thr, tv_dst, z_fi); /* side effects */ return; } skip_fastint: #endif if (DUK_TVAL_IS_NUMBER(tv_src)) { /* Fast path for the case where the register * is a number (e.g. loop counter). */ x = DUK_TVAL_GET_NUMBER(tv_src); if (op & 0x01) { y = x - 1.0; } else { y = x + 1.0; } DUK_TVAL_SET_NUMBER(tv_src, y); /* no need for refcount update */ } else { /* Preserve duk_tval pointer(s) across a potential valstack * resize by converting them into offsets temporarily. */ duk_idx_t bc; duk_size_t off_dst; off_dst = (duk_size_t) ((duk_uint8_t *) tv_dst - (duk_uint8_t *) thr->valstack_bottom); bc = (duk_idx_t) (tv_src - thr->valstack_bottom); /* XXX: pass index explicitly? */ tv_src = NULL; /* no longer referenced */ x = duk_to_number(thr, bc); if (op & 0x01) { y = x - 1.0; } else { y = x + 1.0; } duk_push_number(thr, y); duk_replace(thr, bc); tv_dst = (duk_tval *) (void *) (((duk_uint8_t *) thr->valstack_bottom) + off_dst); } z = (op & 0x02) ? x : y; DUK_TVAL_SET_NUMBER_UPDREF(thr, tv_dst, z); /* side effects */ } DUK_LOCAL DUK__INLINE_PERF void duk__prepost_incdec_var_helper(duk_hthread *thr, duk_small_uint_t idx_dst, duk_tval *tv_id, duk_small_uint_t op, duk_small_uint_t is_strict) { duk_activation *act; duk_double_t x, y; duk_hstring *name; /* XXX: The pre/post inc/dec for an identifier lookup is * missing the important fast path where the identifier * has a storage location e.g. in a scope object so that * it can be updated in-place. In particular, the case * where the identifier has a storage location AND the * previous value is a number should be optimized because * it's side effect free. */ /* Two lowest bits of opcode are used to distinguish * variants. Bit 0 = inc(0)/dec(1), bit 1 = pre(0)/post(1). */ DUK_ASSERT((DUK_OP_PREINCV & 0x03) == 0x00); DUK_ASSERT((DUK_OP_PREDECV & 0x03) == 0x01); DUK_ASSERT((DUK_OP_POSTINCV & 0x03) == 0x02); DUK_ASSERT((DUK_OP_POSTDECV & 0x03) == 0x03); DUK_ASSERT(DUK_TVAL_IS_STRING(tv_id)); name = DUK_TVAL_GET_STRING(tv_id); DUK_ASSERT(name != NULL); act = thr->callstack_curr; (void) duk_js_getvar_activation(thr, act, name, 1 /*throw*/); /* -> [ ... val this ] */ /* XXX: Fastint fast path would be useful here. Also fastints * now lose their fastint status in current handling which is * not intuitive. */ x = duk_to_number_m2(thr); if (op & 0x01) { y = x - 1.0; } else { y = x + 1.0; } /* [... x this] */ if (op & 0x02) { duk_push_number(thr, y); /* -> [ ... x this y ] */ DUK_ASSERT(act == thr->callstack_curr); duk_js_putvar_activation(thr, act, name, DUK_GET_TVAL_NEGIDX(thr, -1), is_strict); duk_pop_2_unsafe(thr); /* -> [ ... x ] */ } else { duk_pop_2_unsafe(thr); /* -> [ ... ] */ duk_push_number(thr, y); /* -> [ ... y ] */ DUK_ASSERT(act == thr->callstack_curr); duk_js_putvar_activation(thr, act, name, DUK_GET_TVAL_NEGIDX(thr, -1), is_strict); } #if defined(DUK_USE_EXEC_PREFER_SIZE) duk_replace(thr, (duk_idx_t) idx_dst); #else /* DUK_USE_EXEC_PREFER_SIZE */ DUK__REPLACE_TO_TVPTR(thr, DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_dst)); #endif /* DUK_USE_EXEC_PREFER_SIZE */ } /* * Longjmp and other control flow transfer for the bytecode executor. * * The longjmp handler can handle all longjmp types: error, yield, and * resume (pseudotypes are never actually thrown). * * Error policy for longjmp: should not ordinarily throw errors; if errors * occur (e.g. due to out-of-memory) they bubble outwards rather than being * handled recursively. */ #define DUK__LONGJMP_RESTART 0 /* state updated, restart bytecode execution */ #define DUK__LONGJMP_RETHROW 1 /* exit bytecode executor by rethrowing an error to caller */ #define DUK__RETHAND_RESTART 0 /* state updated, restart bytecode execution */ #define DUK__RETHAND_FINISHED 1 /* exit bytecode execution with return value */ /* XXX: optimize reconfig valstack operations so that resize, clamp, and setting * top are combined into one pass. */ /* Reconfigure value stack for return to an Ecmascript function at * callstack top (caller unwinds). */ DUK_LOCAL void duk__reconfig_valstack_ecma_return(duk_hthread *thr) { duk_activation *act; duk_hcompfunc *h_func; duk_idx_t clamp_top; DUK_ASSERT(thr != NULL); act = thr->callstack_curr; DUK_ASSERT(act != NULL); DUK_ASSERT(DUK_ACT_GET_FUNC(act) != NULL); DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(act))); /* Clamp so that values at 'clamp_top' and above are wiped and won't * retain reachable garbage. Then extend to 'nregs' because we're * returning to an Ecmascript function. */ h_func = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act); thr->valstack_bottom = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + act->bottom_byteoff); DUK_ASSERT(act->retval_byteoff >= act->bottom_byteoff); clamp_top = (duk_idx_t) ((act->retval_byteoff - act->bottom_byteoff + sizeof(duk_tval)) / sizeof(duk_tval)); /* +1 = one retval */ duk_set_top_and_wipe(thr, h_func->nregs, clamp_top); DUK_ASSERT((duk_uint8_t *) thr->valstack_end >= (duk_uint8_t *) thr->valstack + act->reserve_byteoff); thr->valstack_end = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + act->reserve_byteoff); /* XXX: a best effort shrink check would be OK here */ } /* Reconfigure value stack for an Ecmascript catcher. Use topmost catcher * in 'act'. */ DUK_LOCAL void duk__reconfig_valstack_ecma_catcher(duk_hthread *thr, duk_activation *act) { duk_catcher *cat; duk_hcompfunc *h_func; duk_size_t idx_bottom; duk_idx_t clamp_top; DUK_ASSERT(thr != NULL); DUK_ASSERT(act != NULL); DUK_ASSERT(DUK_ACT_GET_FUNC(act) != NULL); DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(act))); cat = act->cat; DUK_ASSERT(cat != NULL); h_func = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act); thr->valstack_bottom = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + act->bottom_byteoff); idx_bottom = (duk_size_t) (thr->valstack_bottom - thr->valstack); DUK_ASSERT(cat->idx_base >= idx_bottom); clamp_top = (duk_idx_t) (cat->idx_base - idx_bottom + 2); /* +2 = catcher value, catcher lj_type */ duk_set_top_and_wipe(thr, h_func->nregs, clamp_top); DUK_ASSERT((duk_uint8_t *) thr->valstack_end >= (duk_uint8_t *) thr->valstack + act->reserve_byteoff); thr->valstack_end = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + act->reserve_byteoff); /* XXX: a best effort shrink check would be OK here */ } /* Set catcher regs: idx_base+0 = value, idx_base+1 = lj_type. * No side effects. */ DUK_LOCAL void duk__set_catcher_regs_norz(duk_hthread *thr, duk_catcher *cat, duk_tval *tv_val_unstable, duk_small_uint_t lj_type) { duk_tval *tv1; DUK_ASSERT(thr != NULL); DUK_ASSERT(tv_val_unstable != NULL); tv1 = thr->valstack + cat->idx_base; DUK_ASSERT(tv1 < thr->valstack_top); DUK_TVAL_SET_TVAL_UPDREF_NORZ(thr, tv1, tv_val_unstable); tv1++; DUK_ASSERT(tv1 == thr->valstack + cat->idx_base + 1); DUK_ASSERT(tv1 < thr->valstack_top); DUK_TVAL_SET_U32_UPDREF_NORZ(thr, tv1, (duk_uint32_t) lj_type); } DUK_LOCAL void duk__handle_catch(duk_hthread *thr, duk_tval *tv_val_unstable, duk_small_uint_t lj_type) { duk_activation *act; duk_catcher *cat; DUK_ASSERT(thr != NULL); DUK_ASSERT(tv_val_unstable != NULL); act = thr->callstack_curr; DUK_ASSERT(act != NULL); DUK_ASSERT(act->cat != NULL); DUK_ASSERT(DUK_CAT_GET_TYPE(act->cat) == DUK_CAT_TYPE_TCF); duk__set_catcher_regs_norz(thr, act->cat, tv_val_unstable, lj_type); DUK_ASSERT(thr->callstack_top >= 1); DUK_ASSERT(thr->callstack_curr != NULL); DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL); DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr))); DUK_ASSERT(thr->callstack_top >= 1); DUK_ASSERT(act == thr->callstack_curr); DUK_ASSERT(act != NULL); duk__reconfig_valstack_ecma_catcher(thr, act); DUK_ASSERT(thr->callstack_top >= 1); DUK_ASSERT(act == thr->callstack_curr); DUK_ASSERT(act != NULL); cat = act->cat; DUK_ASSERT(cat != NULL); act->curr_pc = cat->pc_base + 0; /* +0 = catch */ /* * If entering a 'catch' block which requires an automatic * catch variable binding, create the lexical environment. * * The binding is mutable (= writable) but not deletable. * Step 4 for the catch production in E5 Section 12.14; * no value is given for CreateMutableBinding 'D' argument, * which implies the binding is not deletable. */ if (DUK_CAT_HAS_CATCH_BINDING_ENABLED(cat)) { duk_hdecenv *new_env; DUK_DDD(DUK_DDDPRINT("catcher has an automatic catch binding")); DUK_ASSERT(thr->callstack_top >= 1); DUK_ASSERT(act == thr->callstack_curr); DUK_ASSERT(act != NULL); if (act->lex_env == NULL) { DUK_ASSERT(act->var_env == NULL); DUK_DDD(DUK_DDDPRINT("delayed environment initialization")); duk_js_init_activation_environment_records_delayed(thr, act); DUK_ASSERT(act == thr->callstack_curr); DUK_ASSERT(act != NULL); } DUK_ASSERT(act->lex_env != NULL); DUK_ASSERT(act->var_env != NULL); DUK_ASSERT(DUK_ACT_GET_FUNC(act) != NULL); /* XXX: If an out-of-memory happens here, longjmp state asserts * will be triggered at present and a try-catch fails to catch. * That's not sandboxing fatal (C API protected calls are what * matters), and script catch code can immediately throw anyway * for almost any operation. */ new_env = duk_hdecenv_alloc(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DECENV)); DUK_ASSERT(new_env != NULL); duk_push_hobject(thr, (duk_hobject *) new_env); DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) new_env) == NULL); DUK_DDD(DUK_DDDPRINT("new_env allocated: %!iO", (duk_heaphdr *) new_env)); /* Note: currently the catch binding is handled without a register * binding because we don't support dynamic register bindings (they * must be fixed for an entire function). So, there is no need to * record regbases etc. */ /* XXX: duk_xdef_prop() may cause an out-of-memory, see above. */ DUK_ASSERT(cat->h_varname != NULL); duk_push_hstring(thr, cat->h_varname); duk_push_tval(thr, thr->valstack + cat->idx_base); duk_xdef_prop(thr, -3, DUK_PROPDESC_FLAGS_W); /* writable, not configurable */ DUK_ASSERT(act == thr->callstack_curr); DUK_ASSERT(act != NULL); DUK_HOBJECT_SET_PROTOTYPE(thr->heap, (duk_hobject *) new_env, act->lex_env); act->lex_env = (duk_hobject *) new_env; DUK_HOBJECT_INCREF(thr, (duk_hobject *) new_env); /* reachable through activation */ /* Net refcount change to act->lex_env is 0: incref for new_env's * prototype, decref for act->lex_env overwrite. */ DUK_CAT_SET_LEXENV_ACTIVE(cat); duk_pop_unsafe(thr); DUK_DDD(DUK_DDDPRINT("new_env finished: %!iO", (duk_heaphdr *) new_env)); } DUK_CAT_CLEAR_CATCH_ENABLED(cat); } DUK_LOCAL void duk__handle_finally(duk_hthread *thr, duk_tval *tv_val_unstable, duk_small_uint_t lj_type) { duk_activation *act; duk_catcher *cat; DUK_ASSERT(thr != NULL); DUK_ASSERT(tv_val_unstable != NULL); act = thr->callstack_curr; DUK_ASSERT(act != NULL); DUK_ASSERT(act->cat != NULL); DUK_ASSERT(DUK_CAT_GET_TYPE(act->cat) == DUK_CAT_TYPE_TCF); duk__set_catcher_regs_norz(thr, act->cat, tv_val_unstable, lj_type); DUK_ASSERT(thr->callstack_top >= 1); DUK_ASSERT(thr->callstack_curr != NULL); DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL); DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr))); DUK_ASSERT(thr->callstack_top >= 1); DUK_ASSERT(act == thr->callstack_curr); DUK_ASSERT(act != NULL); duk__reconfig_valstack_ecma_catcher(thr, act); DUK_ASSERT(thr->callstack_top >= 1); DUK_ASSERT(act == thr->callstack_curr); DUK_ASSERT(act != NULL); cat = act->cat; DUK_ASSERT(cat != NULL); act->curr_pc = cat->pc_base + 1; /* +1 = finally */ DUK_CAT_CLEAR_FINALLY_ENABLED(cat); } DUK_LOCAL void duk__handle_label(duk_hthread *thr, duk_small_uint_t lj_type) { duk_activation *act; duk_catcher *cat; DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->callstack_top >= 1); act = thr->callstack_curr; DUK_ASSERT(act != NULL); DUK_ASSERT(DUK_ACT_GET_FUNC(act) != NULL); DUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(DUK_ACT_GET_FUNC(act))); /* +0 = break, +1 = continue */ cat = act->cat; DUK_ASSERT(cat != NULL); DUK_ASSERT(DUK_CAT_GET_TYPE(cat) == DUK_CAT_TYPE_LABEL); act->curr_pc = cat->pc_base + (lj_type == DUK_LJ_TYPE_CONTINUE ? 1 : 0); /* valstack should not need changes */ #if defined(DUK_USE_ASSERTIONS) DUK_ASSERT(thr->callstack_top >= 1); DUK_ASSERT(act == thr->callstack_curr); DUK_ASSERT(act != NULL); DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) == (duk_size_t) ((duk_hcompfunc *) DUK_ACT_GET_FUNC(act))->nregs); #endif } /* Called for handling both a longjmp() with type DUK_LJ_TYPE_YIELD and * when a RETURN opcode terminates a thread and yields to the resumer. * Caller unwinds so that top of callstack is the activation we return to. */ #if defined(DUK_USE_COROUTINE_SUPPORT) DUK_LOCAL void duk__handle_yield(duk_hthread *thr, duk_hthread *resumer, duk_tval *tv_val_unstable) { duk_activation *act_resumer; duk_tval *tv1; DUK_ASSERT(thr != NULL); DUK_ASSERT(resumer != NULL); DUK_ASSERT(tv_val_unstable != NULL); act_resumer = resumer->callstack_curr; DUK_ASSERT(act_resumer != NULL); DUK_ASSERT(DUK_ACT_GET_FUNC(act_resumer) != NULL); DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(act_resumer))); /* resume caller must be an ecmascript func */ tv1 = (duk_tval *) (void *) ((duk_uint8_t *) resumer->valstack + act_resumer->retval_byteoff); /* return value from Duktape.Thread.resume() */ DUK_TVAL_SET_TVAL_UPDREF(thr, tv1, tv_val_unstable); /* side effects */ /* XXX: avoid side effects */ duk__reconfig_valstack_ecma_return(resumer); /* caller must change active thread, and set thr->resumer to NULL */ } #endif /* DUK_USE_COROUTINE_SUPPORT */ DUK_LOCAL duk_small_uint_t duk__handle_longjmp(duk_hthread *thr, duk_activation *entry_act) { duk_small_uint_t retval = DUK__LONGJMP_RESTART; DUK_ASSERT(thr != NULL); DUK_ASSERT(entry_act != NULL); /* 'thr' is the current thread, as no-one resumes except us and we * switch 'thr' in that case. */ DUK_ASSERT(thr == thr->heap->curr_thread); /* * (Re)try handling the longjmp. * * A longjmp handler may convert the longjmp to a different type and * "virtually" rethrow by goto'ing to 'check_longjmp'. Before the goto, * the following must be updated: * - the heap 'lj' state * - 'thr' must reflect the "throwing" thread */ check_longjmp: DUK_DD(DUK_DDPRINT("handling longjmp: type=%ld, value1=%!T, value2=%!T, iserror=%ld", (long) thr->heap->lj.type, (duk_tval *) &thr->heap->lj.value1, (duk_tval *) &thr->heap->lj.value2, (long) thr->heap->lj.iserror)); switch (thr->heap->lj.type) { #if defined(DUK_USE_COROUTINE_SUPPORT) case DUK_LJ_TYPE_RESUME: { /* * Note: lj.value1 is 'value', lj.value2 is 'resumee'. * This differs from YIELD. */ duk_tval *tv; duk_tval *tv2; duk_hthread *resumee; /* duk_bi_duk_object_yield() and duk_bi_duk_object_resume() ensure all of these are met */ DUK_ASSERT(thr->state == DUK_HTHREAD_STATE_RUNNING); /* unchanged by Duktape.Thread.resume() */ DUK_ASSERT(thr->callstack_top >= 2); /* Ecmascript activation + Duktape.Thread.resume() activation */ DUK_ASSERT(thr->callstack_curr != NULL); DUK_ASSERT(thr->callstack_curr->parent != NULL); DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL && DUK_HOBJECT_IS_NATFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr)) && ((duk_hnatfunc *) DUK_ACT_GET_FUNC(thr->callstack_curr))->func == duk_bi_thread_resume); tv = &thr->heap->lj.value2; /* resumee */ DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv)); DUK_ASSERT(DUK_TVAL_GET_OBJECT(tv) != NULL); DUK_ASSERT(DUK_HOBJECT_IS_THREAD(DUK_TVAL_GET_OBJECT(tv))); resumee = (duk_hthread *) DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(resumee != NULL); DUK_ASSERT(resumee->resumer == NULL); DUK_ASSERT(resumee->state == DUK_HTHREAD_STATE_INACTIVE || resumee->state == DUK_HTHREAD_STATE_YIELDED); /* checked by Duktape.Thread.resume() */ DUK_ASSERT(resumee->state != DUK_HTHREAD_STATE_YIELDED || resumee->callstack_top >= 2); /* YIELDED: Ecmascript activation + Duktape.Thread.yield() activation */ DUK_ASSERT(resumee->state != DUK_HTHREAD_STATE_YIELDED || (DUK_ACT_GET_FUNC(resumee->callstack_curr) != NULL && DUK_HOBJECT_IS_NATFUNC(DUK_ACT_GET_FUNC(resumee->callstack_curr)) && ((duk_hnatfunc *) DUK_ACT_GET_FUNC(resumee->callstack_curr))->func == duk_bi_thread_yield)); DUK_ASSERT(resumee->state != DUK_HTHREAD_STATE_INACTIVE || resumee->callstack_top == 0); /* INACTIVE: no activation, single function value on valstack */ if (thr->heap->lj.iserror) { /* * Throw the error in the resumed thread's context; the * error value is pushed onto the resumee valstack. * * Note: the callstack of the target may empty in this case * too (i.e. the target thread has never been resumed). The * value stack will contain the initial function in that case, * which we simply ignore. */ DUK_ASSERT(resumee->resumer == NULL); resumee->resumer = thr; DUK_HTHREAD_INCREF(thr, thr); resumee->state = DUK_HTHREAD_STATE_RUNNING; thr->state = DUK_HTHREAD_STATE_RESUMED; DUK_HEAP_SWITCH_THREAD(thr->heap, resumee); thr = resumee; thr->heap->lj.type = DUK_LJ_TYPE_THROW; /* thr->heap->lj.value1 is already the value to throw */ /* thr->heap->lj.value2 is 'thread', will be wiped out at the end */ DUK_ASSERT(thr->heap->lj.iserror); /* already set */ DUK_DD(DUK_DDPRINT("-> resume with an error, converted to a throw in the resumee, propagate")); goto check_longjmp; } else if (resumee->state == DUK_HTHREAD_STATE_YIELDED) { /* Unwind previous Duktape.Thread.yield() call. The * activation remaining must always be an Ecmascript * call now (yield() accepts calls from Ecmascript * only). */ duk_activation *act_resumee; DUK_ASSERT(resumee->callstack_top >= 2); act_resumee = resumee->callstack_curr; /* Duktape.Thread.yield() */ DUK_ASSERT(act_resumee != NULL); act_resumee = act_resumee->parent; /* Ecmascript call site for yield() */ DUK_ASSERT(act_resumee != NULL); tv = (duk_tval *) (void *) ((duk_uint8_t *) resumee->valstack + act_resumee->retval_byteoff); /* return value from Duktape.Thread.yield() */ DUK_ASSERT(tv >= resumee->valstack && tv < resumee->valstack_top); tv2 = &thr->heap->lj.value1; DUK_TVAL_SET_TVAL_UPDREF(thr, tv, tv2); /* side effects */ /* XXX: avoid side effects */ duk_hthread_activation_unwind_norz(resumee); /* unwind to 'yield' caller */ /* no need to unwind catch stack */ duk__reconfig_valstack_ecma_return(resumee); DUK_ASSERT(resumee->resumer == NULL); resumee->resumer = thr; DUK_HTHREAD_INCREF(thr, thr); resumee->state = DUK_HTHREAD_STATE_RUNNING; thr->state = DUK_HTHREAD_STATE_RESUMED; DUK_HEAP_SWITCH_THREAD(thr->heap, resumee); #if 0 thr = resumee; /* not needed, as we exit right away */ #endif DUK_DD(DUK_DDPRINT("-> resume with a value, restart execution in resumee")); retval = DUK__LONGJMP_RESTART; goto wipe_and_return; } else { /* Initial resume call. */ duk_small_uint_t call_flags; duk_int_t setup_rc; /* resumee: [... initial_func] (currently actually: [initial_func]) */ duk_push_undefined(resumee); tv = &thr->heap->lj.value1; duk_push_tval(resumee, tv); /* resumee: [... initial_func undefined(= this) resume_value ] */ call_flags = DUK_CALL_FLAG_ALLOW_ECMATOECMA; /* not tailcall, ecma-to-ecma (assumed to succeed) */ setup_rc = duk_handle_call_unprotected_nargs(resumee, 1 /*nargs*/, call_flags); if (setup_rc == 0) { /* This shouldn't happen; Duktape.Thread.resume() * should make sure of that. If it does happen * this internal error will propagate out of the * executor which can be quite misleading. */ DUK_ERROR_INTERNAL(thr); } DUK_ASSERT(resumee->resumer == NULL); resumee->resumer = thr; DUK_HTHREAD_INCREF(thr, thr); resumee->state = DUK_HTHREAD_STATE_RUNNING; thr->state = DUK_HTHREAD_STATE_RESUMED; DUK_HEAP_SWITCH_THREAD(thr->heap, resumee); #if 0 thr = resumee; /* not needed, as we exit right away */ #endif DUK_DD(DUK_DDPRINT("-> resume with a value, restart execution in resumee")); retval = DUK__LONGJMP_RESTART; goto wipe_and_return; } DUK_UNREACHABLE(); break; /* never here */ } case DUK_LJ_TYPE_YIELD: { /* * Currently only allowed only if yielding thread has only * Ecmascript activations (except for the Duktape.Thread.yield() * call at the callstack top) and none of them constructor * calls. * * This excludes the 'entry' thread which will always have * a preventcount > 0. */ duk_hthread *resumer; /* duk_bi_duk_object_yield() and duk_bi_duk_object_resume() ensure all of these are met */ #if 0 /* entry_thread not available for assert */ DUK_ASSERT(thr != entry_thread); /* Duktape.Thread.yield() should prevent */ #endif DUK_ASSERT(thr->state == DUK_HTHREAD_STATE_RUNNING); /* unchanged from Duktape.Thread.yield() */ DUK_ASSERT(thr->callstack_top >= 2); /* Ecmascript activation + Duktape.Thread.yield() activation */ DUK_ASSERT(thr->callstack_curr != NULL); DUK_ASSERT(thr->callstack_curr->parent != NULL); DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL && DUK_HOBJECT_IS_NATFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr)) && ((duk_hnatfunc *) DUK_ACT_GET_FUNC(thr->callstack_curr))->func == duk_bi_thread_yield); DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr->parent) != NULL && DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr->parent))); /* an Ecmascript function */ resumer = thr->resumer; DUK_ASSERT(resumer != NULL); DUK_ASSERT(resumer->state == DUK_HTHREAD_STATE_RESUMED); /* written by a previous RESUME handling */ DUK_ASSERT(resumer->callstack_top >= 2); /* Ecmascript activation + Duktape.Thread.resume() activation */ DUK_ASSERT(resumer->callstack_curr != NULL); DUK_ASSERT(resumer->callstack_curr->parent != NULL); DUK_ASSERT(DUK_ACT_GET_FUNC(resumer->callstack_curr) != NULL && DUK_HOBJECT_IS_NATFUNC(DUK_ACT_GET_FUNC(resumer->callstack_curr)) && ((duk_hnatfunc *) DUK_ACT_GET_FUNC(resumer->callstack_curr))->func == duk_bi_thread_resume); DUK_ASSERT(DUK_ACT_GET_FUNC(resumer->callstack_curr->parent) != NULL && DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(resumer->callstack_curr->parent))); /* an Ecmascript function */ if (thr->heap->lj.iserror) { thr->state = DUK_HTHREAD_STATE_YIELDED; thr->resumer = NULL; DUK_HTHREAD_DECREF_NORZ(thr, resumer); resumer->state = DUK_HTHREAD_STATE_RUNNING; DUK_HEAP_SWITCH_THREAD(thr->heap, resumer); thr = resumer; thr->heap->lj.type = DUK_LJ_TYPE_THROW; /* lj.value1 is already set */ DUK_ASSERT(thr->heap->lj.iserror); /* already set */ DUK_DD(DUK_DDPRINT("-> yield an error, converted to a throw in the resumer, propagate")); goto check_longjmp; } else { duk_hthread_activation_unwind_norz(resumer); duk__handle_yield(thr, resumer, &thr->heap->lj.value1); thr->state = DUK_HTHREAD_STATE_YIELDED; thr->resumer = NULL; DUK_HTHREAD_DECREF_NORZ(thr, resumer); resumer->state = DUK_HTHREAD_STATE_RUNNING; DUK_HEAP_SWITCH_THREAD(thr->heap, resumer); #if 0 thr = resumer; /* not needed, as we exit right away */ #endif DUK_DD(DUK_DDPRINT("-> yield a value, restart execution in resumer")); retval = DUK__LONGJMP_RESTART; goto wipe_and_return; } DUK_UNREACHABLE(); break; /* never here */ } #endif /* DUK_USE_COROUTINE_SUPPORT */ case DUK_LJ_TYPE_THROW: { /* * Three possible outcomes: * * A try or finally catcher is found => resume there. * (or) * * The error propagates to the bytecode executor entry * level (and we're in the entry thread) => rethrow * with a new longjmp(), after restoring the previous * catchpoint. * * The error is not caught in the current thread, so * the thread finishes with an error. This works like * a yielded error, except that the thread is finished * and can no longer be resumed. (There is always a * resumer in this case.) * * Note: until we hit the entry level, there can only be * Ecmascript activations. */ duk_activation *act; duk_catcher *cat; duk_hthread *resumer; for (;;) { act = thr->callstack_curr; if (act == NULL) { break; } for (;;) { cat = act->cat; if (cat == NULL) { break; } if (DUK_CAT_HAS_CATCH_ENABLED(cat)) { DUK_ASSERT(DUK_CAT_GET_TYPE(cat) == DUK_CAT_TYPE_TCF); duk__handle_catch(thr, &thr->heap->lj.value1, DUK_LJ_TYPE_THROW); DUK_DD(DUK_DDPRINT("-> throw caught by a 'catch' clause, restart execution")); retval = DUK__LONGJMP_RESTART; goto wipe_and_return; } if (DUK_CAT_HAS_FINALLY_ENABLED(cat)) { DUK_ASSERT(DUK_CAT_GET_TYPE(cat) == DUK_CAT_TYPE_TCF); DUK_ASSERT(!DUK_CAT_HAS_CATCH_ENABLED(cat)); duk__handle_finally(thr, &thr->heap->lj.value1, DUK_LJ_TYPE_THROW); DUK_DD(DUK_DDPRINT("-> throw caught by a 'finally' clause, restart execution")); retval = DUK__LONGJMP_RESTART; goto wipe_and_return; } duk_hthread_catcher_unwind_norz(thr, act); } if (act == entry_act) { /* Not caught by anything before entry level; rethrow and let the * final catcher finish unwinding (esp. value stack). */ DUK_D(DUK_DPRINT("-> throw propagated up to entry level, rethrow and exit bytecode executor")); retval = DUK__LONGJMP_RETHROW; goto just_return; } duk_hthread_activation_unwind_norz(thr); } DUK_DD(DUK_DDPRINT("-> throw not caught by current thread, yield error to resumer and recheck longjmp")); /* Not caught by current thread, thread terminates (yield error to resumer); * note that this may cause a cascade if the resumer terminates with an uncaught * exception etc (this is OK, but needs careful testing). */ DUK_ASSERT(thr->resumer != NULL); DUK_ASSERT(thr->resumer->callstack_top >= 2); /* Ecmascript activation + Duktape.Thread.resume() activation */ DUK_ASSERT(thr->resumer->callstack_curr != NULL); DUK_ASSERT(thr->resumer->callstack_curr->parent != NULL); DUK_ASSERT(DUK_ACT_GET_FUNC(thr->resumer->callstack_curr->parent) != NULL && DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->resumer->callstack_curr->parent))); /* an Ecmascript function */ resumer = thr->resumer; /* reset longjmp */ DUK_ASSERT(thr->heap->lj.type == DUK_LJ_TYPE_THROW); /* already set */ /* lj.value1 already set */ duk_hthread_terminate(thr); /* updates thread state, minimizes its allocations */ DUK_ASSERT(thr->state == DUK_HTHREAD_STATE_TERMINATED); thr->resumer = NULL; DUK_HTHREAD_DECREF_NORZ(thr, resumer); resumer->state = DUK_HTHREAD_STATE_RUNNING; DUK_HEAP_SWITCH_THREAD(thr->heap, resumer); thr = resumer; goto check_longjmp; } case DUK_LJ_TYPE_BREAK: /* pseudotypes, not used in actual longjmps */ case DUK_LJ_TYPE_CONTINUE: case DUK_LJ_TYPE_RETURN: case DUK_LJ_TYPE_NORMAL: default: { /* should never happen, but be robust */ DUK_D(DUK_DPRINT("caught unknown longjmp type %ld, treat as internal error", (long) thr->heap->lj.type)); goto convert_to_internal_error; } } /* end switch */ DUK_UNREACHABLE(); wipe_and_return: /* this is not strictly necessary, but helps debugging */ thr->heap->lj.type = DUK_LJ_TYPE_UNKNOWN; thr->heap->lj.iserror = 0; DUK_TVAL_SET_UNDEFINED_UPDREF(thr, &thr->heap->lj.value1); /* side effects */ DUK_TVAL_SET_UNDEFINED_UPDREF(thr, &thr->heap->lj.value2); /* side effects */ DUK_GC_TORTURE(thr->heap); just_return: return retval; convert_to_internal_error: /* This could also be thrown internally (set the error, goto check_longjmp), * but it's better for internal errors to bubble outwards so that we won't * infinite loop in this catchpoint. */ DUK_ERROR_INTERNAL(thr); DUK_UNREACHABLE(); return retval; } /* Handle a BREAK/CONTINUE opcode. Avoid using longjmp() for BREAK/CONTINUE * handling because it has a measurable performance impact in ordinary * environments and an extreme impact in Emscripten (GH-342). */ DUK_LOCAL DUK__NOINLINE_PERF void duk__handle_break_or_continue(duk_hthread *thr, duk_uint_t label_id, duk_small_uint_t lj_type) { duk_activation *act; duk_catcher *cat; DUK_ASSERT(thr != NULL); /* Find a matching label catcher or 'finally' catcher in * the same function, unwinding catchers as we go. * * A label catcher must always exist and will match unless * a 'finally' captures the break/continue first. It is the * compiler's responsibility to ensure that labels are used * correctly. */ act = thr->callstack_curr; DUK_ASSERT(act != NULL); for (;;) { cat = act->cat; if (cat == NULL) { break; } DUK_DDD(DUK_DDDPRINT("considering catcher %p: type=%ld label=%ld", (void *) cat, (long) DUK_CAT_GET_TYPE(cat), (long) DUK_CAT_GET_LABEL(cat))); /* XXX: bit mask test; FINALLY <-> TCF, single bit mask would suffice? */ if (DUK_CAT_GET_TYPE(cat) == DUK_CAT_TYPE_TCF && DUK_CAT_HAS_FINALLY_ENABLED(cat)) { duk_tval tv_tmp; DUK_TVAL_SET_U32(&tv_tmp, (duk_uint32_t) label_id); duk__handle_finally(thr, &tv_tmp, lj_type); DUK_DD(DUK_DDPRINT("-> break/continue caught by 'finally', restart execution")); return; } if (DUK_CAT_GET_TYPE(cat) == DUK_CAT_TYPE_LABEL && (duk_uint_t) DUK_CAT_GET_LABEL(cat) == label_id) { duk__handle_label(thr, lj_type); DUK_DD(DUK_DDPRINT("-> break/continue caught by a label catcher (in the same function), restart execution")); return; } duk_hthread_catcher_unwind_norz(thr, act); } /* Should never happen, but be robust. */ DUK_D(DUK_DPRINT("-> break/continue not caught by anything in the current function (should never happen), throw internal error")); DUK_ERROR_INTERNAL(thr); return; } /* Handle a RETURN opcode. Avoid using longjmp() for return handling because * it has a measurable performance impact in ordinary environments and an extreme * impact in Emscripten (GH-342). Return value is on value stack top. */ DUK_LOCAL duk_small_uint_t duk__handle_return(duk_hthread *thr, duk_activation *entry_act) { duk_tval *tv1; duk_tval *tv2; #if defined(DUK_USE_COROUTINE_SUPPORT) duk_hthread *resumer; #endif duk_activation *act; duk_catcher *cat; /* We can directly access value stack here. */ DUK_ASSERT(thr != NULL); DUK_ASSERT(entry_act != NULL); DUK_ASSERT(thr->valstack_top - 1 >= thr->valstack_bottom); tv1 = thr->valstack_top - 1; DUK_TVAL_CHKFAST_INPLACE_FAST(tv1); /* fastint downgrade check for return values */ /* * Four possible outcomes: * * 1. A 'finally' in the same function catches the 'return'. * It may continue to propagate when 'finally' is finished, * or it may be neutralized by 'finally' (both handled by * ENDFIN). * * 2. The return happens at the entry level of the bytecode * executor, so return from the executor (in C stack). * * 3. There is a calling (Ecmascript) activation in the call * stack => return to it, in the same executor instance. * * 4. There is no calling activation, and the thread is * terminated. There is always a resumer in this case, * which gets the return value similarly to a 'yield' * (except that the current thread can no longer be * resumed). */ DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->callstack_top >= 1); act = thr->callstack_curr; DUK_ASSERT(act != NULL); for (;;) { cat = act->cat; if (cat == NULL) { break; } if (DUK_CAT_GET_TYPE(cat) == DUK_CAT_TYPE_TCF && DUK_CAT_HAS_FINALLY_ENABLED(cat)) { DUK_ASSERT(thr->valstack_top - 1 >= thr->valstack_bottom); duk__handle_finally(thr, thr->valstack_top - 1, DUK_LJ_TYPE_RETURN); DUK_DD(DUK_DDPRINT("-> return caught by 'finally', restart execution")); return DUK__RETHAND_RESTART; } duk_hthread_catcher_unwind_norz(thr, act); } if (act == entry_act) { /* Return to the bytecode executor caller who will unwind stacks * and handle constructor post-processing. * Return value is already on the stack top: [ ... retval ]. */ DUK_DDD(DUK_DDDPRINT("-> return propagated up to entry level, exit bytecode executor")); return DUK__RETHAND_FINISHED; } if (thr->callstack_top >= 2) { /* There is a caller; it MUST be an Ecmascript caller (otherwise it would * match entry_act check). */ DUK_DDD(DUK_DDDPRINT("return to Ecmascript caller, retval_byteoff=%ld, lj_value1=%!T", (long) (thr->callstack_curr->parent->retval_byteoff), (duk_tval *) &thr->heap->lj.value1)); DUK_ASSERT(thr->callstack_curr != NULL); DUK_ASSERT(thr->callstack_curr->parent != NULL); DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr->parent))); /* must be ecmascript */ #if defined(DUK_USE_ES6_PROXY) if (thr->callstack_curr->flags & (DUK_ACT_FLAG_CONSTRUCT | DUK_ACT_FLAG_CONSTRUCT_PROXY)) { duk_call_construct_postprocess(thr, thr->callstack_curr->flags & DUK_ACT_FLAG_CONSTRUCT_PROXY); /* side effects */ } #else if (thr->callstack_curr->flags & DUK_ACT_FLAG_CONSTRUCT) { duk_call_construct_postprocess(thr, 0); /* side effects */ } #endif tv1 = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + thr->callstack_curr->parent->retval_byteoff); DUK_ASSERT(thr->valstack_top - 1 >= thr->valstack_bottom); tv2 = thr->valstack_top - 1; DUK_TVAL_SET_TVAL_UPDREF(thr, tv1, tv2); /* side effects */ /* Catch stack unwind happens inline in callstack unwind. */ duk_hthread_activation_unwind_norz(thr); duk__reconfig_valstack_ecma_return(thr); DUK_DD(DUK_DDPRINT("-> return not intercepted, restart execution in caller")); return DUK__RETHAND_RESTART; } #if defined(DUK_USE_COROUTINE_SUPPORT) DUK_DD(DUK_DDPRINT("no calling activation, thread finishes (similar to yield)")); DUK_ASSERT(thr->resumer != NULL); DUK_ASSERT(thr->resumer->callstack_top >= 2); /* Ecmascript activation + Duktape.Thread.resume() activation */ DUK_ASSERT(thr->resumer->callstack_curr != NULL); DUK_ASSERT(thr->resumer->callstack_curr->parent != NULL); DUK_ASSERT(DUK_ACT_GET_FUNC(thr->resumer->callstack_curr) != NULL && DUK_HOBJECT_IS_NATFUNC(DUK_ACT_GET_FUNC(thr->resumer->callstack_curr)) && ((duk_hnatfunc *) DUK_ACT_GET_FUNC(thr->resumer->callstack_curr))->func == duk_bi_thread_resume); /* Duktape.Thread.resume() */ DUK_ASSERT(DUK_ACT_GET_FUNC(thr->resumer->callstack_curr->parent) != NULL && DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->resumer->callstack_curr->parent))); /* an Ecmascript function */ DUK_ASSERT(thr->state == DUK_HTHREAD_STATE_RUNNING); DUK_ASSERT(thr->resumer->state == DUK_HTHREAD_STATE_RESUMED); resumer = thr->resumer; /* Share yield longjmp handler. */ DUK_ASSERT(thr->valstack_top - 1 >= thr->valstack_bottom); duk_hthread_activation_unwind_norz(resumer); duk__handle_yield(thr, resumer, thr->valstack_top - 1); duk_hthread_terminate(thr); /* updates thread state, minimizes its allocations */ DUK_ASSERT(thr->state == DUK_HTHREAD_STATE_TERMINATED); thr->resumer = NULL; DUK_HTHREAD_DECREF(thr, resumer); resumer->state = DUK_HTHREAD_STATE_RUNNING; DUK_HEAP_SWITCH_THREAD(thr->heap, resumer); #if 0 thr = resumer; /* not needed */ #endif DUK_DD(DUK_DDPRINT("-> return not caught, thread terminated; handle like yield, restart execution in resumer")); return DUK__RETHAND_RESTART; #else /* Without coroutine support this case should never happen. */ DUK_ERROR_INTERNAL(thr); return DUK__RETHAND_FINISHED; /* not executed */ #endif } /* * Executor interrupt handling * * The handler is called whenever the interrupt countdown reaches zero * (or below). The handler must perform whatever checks are activated, * e.g. check for cumulative step count to impose an execution step * limit or check for breakpoints or other debugger interaction. * * When the actions are done, the handler must reinit the interrupt * init and counter values. The 'init' value must indicate how many * bytecode instructions are executed before the next interrupt. The * counter must interface with the bytecode executor loop. Concretely, * the new init value is normally one higher than the new counter value. * For instance, to execute exactly one bytecode instruction the init * value is set to 1 and the counter to 0. If an error is thrown by the * interrupt handler, the counters are set to the same value (e.g. both * to 0 to cause an interrupt when the next bytecode instruction is about * to be executed after error handling). * * Maintaining the init/counter value properly is important for accurate * behavior. For instance, executor step limit needs a cumulative step * count which is simply computed as a sum of 'init' values. This must * work accurately even when single stepping. */ #if defined(DUK_USE_INTERRUPT_COUNTER) #define DUK__INT_NOACTION 0 /* no specific action, resume normal execution */ #define DUK__INT_RESTART 1 /* must "goto restart_execution", e.g. breakpoints changed */ #if defined(DUK_USE_DEBUGGER_SUPPORT) DUK_LOCAL void duk__interrupt_handle_debugger(duk_hthread *thr, duk_bool_t *out_immediate, duk_small_uint_t *out_interrupt_retval) { duk_activation *act; duk_breakpoint *bp; duk_breakpoint **bp_active; duk_uint_fast32_t line = 0; duk_bool_t process_messages; duk_bool_t processed_messages = 0; DUK_ASSERT(thr->heap->dbg_processing == 0); /* don't re-enter e.g. during Eval */ act = thr->callstack_curr; DUK_ASSERT(act != NULL); /* It might seem that replacing 'thr->heap' with just 'heap' below * might be a good idea, but it increases code size slightly * (probably due to unnecessary spilling) at least on x64. */ /* * Single opcode step check */ if (thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_ONE_OPCODE_ACTIVE) { DUK_D(DUK_DPRINT("PAUSE TRIGGERED by one opcode step")); duk_debug_set_paused(thr->heap); } /* * Breakpoint and step state checks */ if (act->flags & DUK_ACT_FLAG_BREAKPOINT_ACTIVE || (thr->heap->dbg_pause_act == thr->callstack_curr)) { line = duk_debug_curr_line(thr); if (act->prev_line != line) { /* Stepped? Step out is handled by callstack unwind. */ if ((thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_LINE_CHANGE) && (thr->heap->dbg_pause_act == thr->callstack_curr) && (line != thr->heap->dbg_pause_startline)) { DUK_D(DUK_DPRINT("PAUSE TRIGGERED by line change, at line %ld", (long) line)); duk_debug_set_paused(thr->heap); } /* Check for breakpoints only on line transition. * Breakpoint is triggered when we enter the target * line from a different line, and the previous line * was within the same function. * * This condition is tricky: the condition used to be * that transition to -or across- the breakpoint line * triggered the breakpoint. This seems intuitively * better because it handles breakpoints on lines with * no emitted opcodes; but this leads to the issue * described in: https://github.com/svaarala/duktape/issues/263. */ bp_active = thr->heap->dbg_breakpoints_active; for (;;) { bp = *bp_active++; if (bp == NULL) { break; } DUK_ASSERT(bp->filename != NULL); if (act->prev_line != bp->line && line == bp->line) { DUK_D(DUK_DPRINT("PAUSE TRIGGERED by breakpoint at %!O:%ld", (duk_heaphdr *) bp->filename, (long) bp->line)); duk_debug_set_paused(thr->heap); } } } else { ; } act->prev_line = (duk_uint32_t) line; } /* * Rate limit check for sending status update or peeking into * the debug transport. Both can be expensive operations that * we don't want to do on every opcode. * * Making sure the interval remains reasonable on a wide variety * of targets and bytecode is difficult without a timestamp, so * we use a Date-provided timestamp for the rate limit check. * But since it's also expensive to get a timestamp, a bytecode * counter is used to rate limit getting timestamps. */ process_messages = 0; if (thr->heap->dbg_state_dirty || DUK_HEAP_HAS_DEBUGGER_PAUSED(thr->heap) || thr->heap->dbg_detaching) { /* Enter message processing loop for sending Status notifys and * to finish a pending detach. */ process_messages = 1; } /* XXX: remove heap->dbg_exec_counter, use heap->inst_count_interrupt instead? */ DUK_ASSERT(thr->interrupt_init >= 0); thr->heap->dbg_exec_counter += (duk_uint_t) thr->interrupt_init; if (thr->heap->dbg_exec_counter - thr->heap->dbg_last_counter >= DUK_HEAP_DBG_RATELIMIT_OPCODES) { /* Overflow of the execution counter is fine and doesn't break * anything here. */ duk_double_t now, diff_last; thr->heap->dbg_last_counter = thr->heap->dbg_exec_counter; now = duk_time_get_monotonic_time(thr); diff_last = now - thr->heap->dbg_last_time; if (diff_last < 0.0 || diff_last >= (duk_double_t) DUK_HEAP_DBG_RATELIMIT_MILLISECS) { /* Monotonic time should not experience time jumps, * but the provider may be missing and we're actually * using Ecmascript time. So, tolerate negative values * so that a time jump works reasonably. * * Same interval is now used for status sending and * peeking. */ thr->heap->dbg_last_time = now; thr->heap->dbg_state_dirty = 1; process_messages = 1; } } /* * Process messages and send status if necessary. * * If we're paused, we'll block for new messages. If we're not * paused, we'll process anything we can peek but won't block * for more. Detach (and re-attach) handling is all localized * to duk_debug_process_messages() too. * * Debugger writes outside the message loop may cause debugger * detach1 phase to run, after which dbg_read_cb == NULL and * dbg_detaching != 0. The message loop will finish the detach * by running detach2 phase, so enter the message loop also when * detaching. */ if (process_messages) { DUK_ASSERT(thr->heap->dbg_processing == 0); processed_messages = duk_debug_process_messages(thr, 0 /*no_block*/); DUK_ASSERT(thr->heap->dbg_processing == 0); } /* Continue checked execution if there are breakpoints or we're stepping. * Also use checked execution if paused flag is active - it shouldn't be * because the debug message loop shouldn't terminate if it was. Step out * is handled by callstack unwind and doesn't need checked execution. * Note that debugger may have detached due to error or explicit request * above, so we must recheck attach status. */ if (duk_debug_is_attached(thr->heap)) { DUK_ASSERT(act == thr->callstack_curr); DUK_ASSERT(act != NULL); if (act->flags & DUK_ACT_FLAG_BREAKPOINT_ACTIVE || (thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_ONE_OPCODE) || ((thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_LINE_CHANGE) && thr->heap->dbg_pause_act == thr->callstack_curr) || DUK_HEAP_HAS_DEBUGGER_PAUSED(thr->heap)) { *out_immediate = 1; } /* If we processed any debug messages breakpoints may have * changed; restart execution to re-check active breakpoints. */ if (processed_messages) { DUK_D(DUK_DPRINT("processed debug messages, restart execution to recheck possibly changed breakpoints")); *out_interrupt_retval = DUK__INT_RESTART; } else { if (thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_ONE_OPCODE) { /* Set 'pause after one opcode' active only when we're * actually just about to execute code. */ thr->heap->dbg_pause_flags |= DUK_PAUSE_FLAG_ONE_OPCODE_ACTIVE; } } } else { DUK_D(DUK_DPRINT("debugger became detached, resume normal execution")); } } #endif /* DUK_USE_DEBUGGER_SUPPORT */ DUK_LOCAL DUK__NOINLINE_PERF DUK_COLD duk_small_uint_t duk__executor_interrupt(duk_hthread *thr) { duk_int_t ctr; duk_activation *act; duk_hcompfunc *fun; duk_bool_t immediate = 0; duk_small_uint_t retval; DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->heap != NULL); DUK_ASSERT(thr->callstack_top > 0); #if defined(DUK_USE_DEBUG) thr->heap->inst_count_interrupt += thr->interrupt_init; DUK_DD(DUK_DDPRINT("execution interrupt, counter=%ld, init=%ld, " "instruction counts: executor=%ld, interrupt=%ld", (long) thr->interrupt_counter, (long) thr->interrupt_init, (long) thr->heap->inst_count_exec, (long) thr->heap->inst_count_interrupt)); #endif retval = DUK__INT_NOACTION; ctr = DUK_HTHREAD_INTCTR_DEFAULT; /* * Avoid nested calls. Concretely this happens during debugging, e.g. * when we eval() an expression. * * Also don't interrupt if we're currently doing debug processing * (which can be initiated outside the bytecode executor) as this * may cause the debugger to be called recursively. Check required * for correct operation of throw intercept and other "exotic" halting * scenarios. */ #if defined(DUK_USE_DEBUGGER_SUPPORT) if (DUK_HEAP_HAS_INTERRUPT_RUNNING(thr->heap) || thr->heap->dbg_processing) { #else if (DUK_HEAP_HAS_INTERRUPT_RUNNING(thr->heap)) { #endif DUK_DD(DUK_DDPRINT("nested executor interrupt, ignoring")); /* Set a high interrupt counter; the original executor * interrupt invocation will rewrite before exiting. */ thr->interrupt_init = ctr; thr->interrupt_counter = ctr - 1; return DUK__INT_NOACTION; } DUK_HEAP_SET_INTERRUPT_RUNNING(thr->heap); act = thr->callstack_curr; DUK_ASSERT(act != NULL); fun = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act); DUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC((duk_hobject *) fun)); DUK_UNREF(fun); #if defined(DUK_USE_EXEC_TIMEOUT_CHECK) /* * Execution timeout check */ if (DUK_USE_EXEC_TIMEOUT_CHECK(thr->heap->heap_udata)) { /* Keep throwing an error whenever we get here. The unusual values * are set this way because no instruction is ever executed, we just * throw an error until all try/catch/finally and other catchpoints * have been exhausted. Duktape/C code gets control at each protected * call but whenever it enters back into Duktape the RangeError gets * raised. User exec timeout check must consistently indicate a timeout * until we've fully bubbled out of Duktape. */ DUK_D(DUK_DPRINT("execution timeout, throwing a RangeError")); thr->interrupt_init = 0; thr->interrupt_counter = 0; DUK_HEAP_CLEAR_INTERRUPT_RUNNING(thr->heap); DUK_ERROR_RANGE(thr, "execution timeout"); } #endif /* DUK_USE_EXEC_TIMEOUT_CHECK */ #if defined(DUK_USE_DEBUGGER_SUPPORT) if (!thr->heap->dbg_processing && (thr->heap->dbg_read_cb != NULL || thr->heap->dbg_detaching)) { /* Avoid recursive re-entry; enter when we're attached or * detaching (to finish off the pending detach). */ duk__interrupt_handle_debugger(thr, &immediate, &retval); DUK_ASSERT(act == thr->callstack_curr); } #endif /* DUK_USE_DEBUGGER_SUPPORT */ /* * Update the interrupt counter */ if (immediate) { /* Cause an interrupt after executing one instruction. */ ctr = 1; } /* The counter value is one less than the init value: init value should * indicate how many instructions are executed before interrupt. To * execute 1 instruction (after interrupt handler return), counter must * be 0. */ DUK_ASSERT(ctr >= 1); thr->interrupt_init = ctr; thr->interrupt_counter = ctr - 1; DUK_HEAP_CLEAR_INTERRUPT_RUNNING(thr->heap); return retval; } #endif /* DUK_USE_INTERRUPT_COUNTER */ /* * Debugger handling for executor restart * * Check for breakpoints, stepping, etc, and figure out if we should execute * in checked or normal mode. Note that we can't do this when an activation * is created, because breakpoint status (and stepping status) may change * later, so we must recheck every time we're executing an activation. * This primitive should be side effect free to avoid changes during check. */ #if defined(DUK_USE_DEBUGGER_SUPPORT) DUK_LOCAL void duk__executor_recheck_debugger(duk_hthread *thr, duk_activation *act, duk_hcompfunc *fun) { duk_heap *heap; duk_tval *tv_tmp; duk_hstring *filename; duk_small_uint_t bp_idx; duk_breakpoint **bp_active; DUK_ASSERT(thr != NULL); DUK_ASSERT(act != NULL); DUK_ASSERT(fun != NULL); heap = thr->heap; bp_active = heap->dbg_breakpoints_active; act->flags &= ~DUK_ACT_FLAG_BREAKPOINT_ACTIVE; tv_tmp = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) fun, DUK_HTHREAD_STRING_FILE_NAME(thr)); if (tv_tmp && DUK_TVAL_IS_STRING(tv_tmp)) { filename = DUK_TVAL_GET_STRING(tv_tmp); /* Figure out all active breakpoints. A breakpoint is * considered active if the current function's fileName * matches the breakpoint's fileName, AND there is no * inner function that has matching line numbers * (otherwise a breakpoint would be triggered both * inside and outside of the inner function which would * be confusing). Example: * * function foo() { * print('foo'); * function bar() { <-. breakpoints in these * print('bar'); | lines should not affect * } <-' foo() execution * bar(); * } * * We need a few things that are only available when * debugger support is enabled: (1) a line range for * each function, and (2) access to the function * template to access the inner functions (and their * line ranges). * * It's important to have a narrow match for active * breakpoints so that we don't enter checked execution * when that's not necessary. For instance, if we're * running inside a certain function and there's * breakpoint outside in (after the call site), we * don't want to slow down execution of the function. */ for (bp_idx = 0; bp_idx < heap->dbg_breakpoint_count; bp_idx++) { duk_breakpoint *bp = heap->dbg_breakpoints + bp_idx; duk_hobject **funcs, **funcs_end; duk_hcompfunc *inner_fun; duk_bool_t bp_match; if (bp->filename == filename && bp->line >= fun->start_line && bp->line <= fun->end_line) { bp_match = 1; DUK_DD(DUK_DDPRINT("breakpoint filename and line match: " "%s:%ld vs. %s (line %ld vs. %ld-%ld)", DUK_HSTRING_GET_DATA(bp->filename), (long) bp->line, DUK_HSTRING_GET_DATA(filename), (long) bp->line, (long) fun->start_line, (long) fun->end_line)); funcs = DUK_HCOMPFUNC_GET_FUNCS_BASE(thr->heap, fun); funcs_end = DUK_HCOMPFUNC_GET_FUNCS_END(thr->heap, fun); while (funcs != funcs_end) { inner_fun = (duk_hcompfunc *) *funcs; DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) inner_fun)); if (bp->line >= inner_fun->start_line && bp->line <= inner_fun->end_line) { DUK_DD(DUK_DDPRINT("inner function masks ('captures') breakpoint")); bp_match = 0; break; } funcs++; } if (bp_match) { /* No need to check for size of bp_active list, * it's always larger than maximum number of * breakpoints. */ act->flags |= DUK_ACT_FLAG_BREAKPOINT_ACTIVE; *bp_active = heap->dbg_breakpoints + bp_idx; bp_active++; } } } } *bp_active = NULL; /* terminate */ DUK_DD(DUK_DDPRINT("ACTIVE BREAKPOINTS: %ld", (long) (bp_active - thr->heap->dbg_breakpoints_active))); /* Force pause if we were doing "step into" in another activation. */ if ((thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_FUNC_ENTRY) && thr->heap->dbg_pause_act != thr->callstack_curr) { DUK_D(DUK_DPRINT("PAUSE TRIGGERED by function entry")); duk_debug_set_paused(thr->heap); } /* Force interrupt right away if we're paused or in "checked mode". * Step out is handled by callstack unwind. */ if ((act->flags & DUK_ACT_FLAG_BREAKPOINT_ACTIVE) || DUK_HEAP_HAS_DEBUGGER_PAUSED(thr->heap) || ((thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_LINE_CHANGE) && thr->heap->dbg_pause_act == thr->callstack_curr)) { /* We'll need to interrupt early so recompute the init * counter to reflect the number of bytecode instructions * executed so that step counts for e.g. debugger rate * limiting are accurate. */ DUK_ASSERT(thr->interrupt_counter <= thr->interrupt_init); thr->interrupt_init = thr->interrupt_init - thr->interrupt_counter; thr->interrupt_counter = 0; } } #endif /* DUK_USE_DEBUGGER_SUPPORT */ /* * Opcode handlers for opcodes with a lot of code and which are relatively * rare; NOINLINE to reduce amount of code in main bytecode dispatcher. */ DUK_LOCAL DUK__NOINLINE_PERF void duk__handle_op_initset_initget(duk_hthread *thr, duk_uint_fast32_t ins) { duk_bool_t is_set = (DUK_DEC_OP(ins) == DUK_OP_INITSET); duk_uint_fast_t idx; duk_uint_t defprop_flags; /* A -> object register (acts as a source) * BC -> BC+0 contains key, BC+1 closure (value) */ /* INITSET/INITGET are only used to initialize object literal keys. * There may be a previous propery in ES2015 because duplicate property * names are allowed. */ /* This could be made more optimal by accessing internals directly. */ idx = (duk_uint_fast_t) DUK_DEC_BC(ins); duk_dup(thr, (duk_idx_t) (idx + 0)); /* key */ duk_dup(thr, (duk_idx_t) (idx + 1)); /* getter/setter */ if (is_set) { defprop_flags = DUK_DEFPROP_HAVE_SETTER | DUK_DEFPROP_FORCE | DUK_DEFPROP_SET_ENUMERABLE | DUK_DEFPROP_SET_CONFIGURABLE; } else { defprop_flags = DUK_DEFPROP_HAVE_GETTER | DUK_DEFPROP_FORCE | DUK_DEFPROP_SET_ENUMERABLE | DUK_DEFPROP_SET_CONFIGURABLE; } duk_def_prop(thr, (duk_idx_t) DUK_DEC_A(ins), defprop_flags); } DUK_LOCAL DUK__NOINLINE_PERF void duk__handle_op_trycatch(duk_hthread *thr, duk_uint_fast32_t ins, duk_instr_t *curr_pc) { duk_activation *act; duk_catcher *cat; duk_tval *tv1; duk_small_uint_fast_t a; duk_small_uint_fast_t bc; /* A -> flags * BC -> reg_catch; base register for two registers used both during * trycatch setup and when catch is triggered * * If DUK_BC_TRYCATCH_FLAG_CATCH_BINDING set: * reg_catch + 0: catch binding variable name (string). * Automatic declarative environment is established for * the duration of the 'catch' clause. * * If DUK_BC_TRYCATCH_FLAG_WITH_BINDING set: * reg_catch + 0: with 'target value', which is coerced to * an object and then used as a bindind object for an * environment record. The binding is initialized here, for * the 'try' clause. * * Note that a TRYCATCH generated for a 'with' statement has no * catch or finally parts. */ /* XXX: TRYCATCH handling should be reworked to avoid creating * an explicit scope unless it is actually needed (e.g. function * instances or eval is executed inside the catch block). This * rework is not trivial because the compiler doesn't have an * intermediate representation. When the rework is done, the * opcode format can also be made more straightforward. */ /* XXX: side effect handling is quite awkward here */ DUK_DDD(DUK_DDDPRINT("TRYCATCH: reg_catch=%ld, have_catch=%ld, " "have_finally=%ld, catch_binding=%ld, with_binding=%ld (flags=0x%02lx)", (long) DUK_DEC_BC(ins), (long) (DUK_DEC_A(ins) & DUK_BC_TRYCATCH_FLAG_HAVE_CATCH ? 1 : 0), (long) (DUK_DEC_A(ins) & DUK_BC_TRYCATCH_FLAG_HAVE_FINALLY ? 1 : 0), (long) (DUK_DEC_A(ins) & DUK_BC_TRYCATCH_FLAG_CATCH_BINDING ? 1 : 0), (long) (DUK_DEC_A(ins) & DUK_BC_TRYCATCH_FLAG_WITH_BINDING ? 1 : 0), (unsigned long) DUK_DEC_A(ins))); a = DUK_DEC_A(ins); bc = DUK_DEC_BC(ins); /* Registers 'bc' and 'bc + 1' are written in longjmp handling * and if their previous values (which are temporaries) become * unreachable -and- have a finalizer, there'll be a function * call during error handling which is not supported now (GH-287). * Ensure that both 'bc' and 'bc + 1' have primitive values to * guarantee no finalizer calls in error handling. Scrubbing also * ensures finalizers for the previous values run here rather than * later. Error handling related values are also written to 'bc' * and 'bc + 1' but those values never become unreachable during * error handling, so there's no side effect problem even if the * error value has a finalizer. */ duk_dup(thr, (duk_idx_t) bc); /* Stabilize value. */ duk_to_undefined(thr, (duk_idx_t) bc); duk_to_undefined(thr, (duk_idx_t) (bc + 1)); /* Allocate catcher and populate it. Doesn't have to * be fully atomic, but the catcher must be in a * consistent state if side effects (such as finalizer * calls) occur. */ cat = duk_hthread_catcher_alloc(thr); DUK_ASSERT(cat != NULL); cat->flags = DUK_CAT_TYPE_TCF; cat->h_varname = NULL; cat->pc_base = (duk_instr_t *) curr_pc; /* pre-incremented, points to first jump slot */ cat->idx_base = (duk_size_t) (thr->valstack_bottom - thr->valstack) + bc; act = thr->callstack_curr; DUK_ASSERT(act != NULL); cat->parent = act->cat; act->cat = cat; if (a & DUK_BC_TRYCATCH_FLAG_HAVE_CATCH) { cat->flags |= DUK_CAT_FLAG_CATCH_ENABLED; } if (a & DUK_BC_TRYCATCH_FLAG_HAVE_FINALLY) { cat->flags |= DUK_CAT_FLAG_FINALLY_ENABLED; } if (a & DUK_BC_TRYCATCH_FLAG_CATCH_BINDING) { DUK_DDD(DUK_DDDPRINT("catch binding flag set to catcher")); cat->flags |= DUK_CAT_FLAG_CATCH_BINDING_ENABLED; tv1 = DUK_GET_TVAL_NEGIDX(thr, -1); DUK_ASSERT(DUK_TVAL_IS_STRING(tv1)); /* borrowed reference; although 'tv1' comes from a register, * its value was loaded using LDCONST so the constant will * also exist and be reachable. */ cat->h_varname = DUK_TVAL_GET_STRING(tv1); } else if (a & DUK_BC_TRYCATCH_FLAG_WITH_BINDING) { duk_hobjenv *env; duk_hobject *target; /* Delayed env initialization for activation (if needed). */ DUK_ASSERT(thr->callstack_top >= 1); DUK_ASSERT(act == thr->callstack_curr); DUK_ASSERT(act != NULL); if (act->lex_env == NULL) { DUK_DDD(DUK_DDDPRINT("delayed environment initialization")); DUK_ASSERT(act->var_env == NULL); duk_js_init_activation_environment_records_delayed(thr, act); DUK_ASSERT(act == thr->callstack_curr); DUK_UNREF(act); /* 'act' is no longer accessed, scanbuild fix */ } DUK_ASSERT(act->lex_env != NULL); DUK_ASSERT(act->var_env != NULL); /* Coerce 'with' target. */ target = duk_to_hobject(thr, -1); DUK_ASSERT(target != NULL); /* Create an object environment; it is not pushed * so avoid side effects very carefully until it is * referenced. */ env = duk_hobjenv_alloc(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJENV)); DUK_ASSERT(env != NULL); DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) env) == NULL); env->target = target; /* always provideThis=true */ DUK_HOBJECT_INCREF(thr, target); env->has_this = 1; DUK_ASSERT_HOBJENV_VALID(env); DUK_DDD(DUK_DDDPRINT("environment for with binding: %!iO", env)); DUK_ASSERT(act == thr->callstack_curr); DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) env) == NULL); DUK_ASSERT(act->lex_env != NULL); DUK_HOBJECT_SET_PROTOTYPE(thr->heap, (duk_hobject *) env, act->lex_env); act->lex_env = (duk_hobject *) env; /* Now reachable. */ DUK_HOBJECT_INCREF(thr, (duk_hobject *) env); /* Net refcount change to act->lex_env is 0: incref for env's * prototype, decref for act->lex_env overwrite. */ /* Set catcher lex_env active (affects unwind) * only when the whole setup is complete. */ cat = act->cat; /* XXX: better to relookup? not mandatory because 'cat' is stable */ cat->flags |= DUK_CAT_FLAG_LEXENV_ACTIVE; } else { ; } DUK_DDD(DUK_DDDPRINT("TRYCATCH catcher: flags=0x%08lx, pc_base=%ld, " "idx_base=%ld, h_varname=%!O", (unsigned long) cat->flags, (long) cat->pc_base, (long) cat->idx_base, (duk_heaphdr *) cat->h_varname)); duk_pop_unsafe(thr); } DUK_LOCAL DUK__NOINLINE_PERF duk_instr_t *duk__handle_op_endtry(duk_hthread *thr, duk_uint_fast32_t ins) { duk_activation *act; duk_catcher *cat; duk_tval *tv1; duk_instr_t *pc_base; DUK_UNREF(ins); DUK_ASSERT(thr->callstack_top >= 1); act = thr->callstack_curr; DUK_ASSERT(act != NULL); cat = act->cat; DUK_ASSERT(cat != NULL); DUK_ASSERT(DUK_CAT_GET_TYPE(act->cat) == DUK_CAT_TYPE_TCF); DUK_DDD(DUK_DDDPRINT("ENDTRY: clearing catch active flag (regardless of whether it was set or not)")); DUK_CAT_CLEAR_CATCH_ENABLED(cat); pc_base = cat->pc_base; if (DUK_CAT_HAS_FINALLY_ENABLED(cat)) { DUK_DDD(DUK_DDDPRINT("ENDTRY: finally part is active, jump through 2nd jump slot with 'normal continuation'")); tv1 = thr->valstack + cat->idx_base; DUK_ASSERT(tv1 >= thr->valstack && tv1 < thr->valstack_top); DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv1); /* side effects */ tv1 = NULL; tv1 = thr->valstack + cat->idx_base + 1; DUK_ASSERT(tv1 >= thr->valstack && tv1 < thr->valstack_top); DUK_TVAL_SET_U32_UPDREF(thr, tv1, (duk_uint32_t) DUK_LJ_TYPE_NORMAL); /* side effects */ tv1 = NULL; DUK_CAT_CLEAR_FINALLY_ENABLED(cat); } else { DUK_DDD(DUK_DDDPRINT("ENDTRY: no finally part, dismantle catcher, jump through 2nd jump slot (to end of statement)")); duk_hthread_catcher_unwind_norz(thr, act); /* lexenv may be set for 'with' binding */ /* no need to unwind callstack */ } return pc_base + 1; /* new curr_pc value */ } DUK_LOCAL DUK__NOINLINE_PERF duk_instr_t *duk__handle_op_endcatch(duk_hthread *thr, duk_uint_fast32_t ins) { duk_activation *act; duk_catcher *cat; duk_tval *tv1; duk_instr_t *pc_base; DUK_UNREF(ins); DUK_ASSERT(thr->callstack_top >= 1); act = thr->callstack_curr; DUK_ASSERT(act != NULL); cat = act->cat; DUK_ASSERT(cat != NULL); DUK_ASSERT(!DUK_CAT_HAS_CATCH_ENABLED(cat)); /* cleared before entering catch part */ if (DUK_CAT_HAS_LEXENV_ACTIVE(cat)) { duk_hobject *prev_env; /* 'with' binding has no catch clause, so can't be here unless a normal try-catch */ DUK_ASSERT(DUK_CAT_HAS_CATCH_BINDING_ENABLED(cat)); DUK_ASSERT(act->lex_env != NULL); DUK_DDD(DUK_DDDPRINT("ENDCATCH: popping catcher part lexical environment")); prev_env = act->lex_env; DUK_ASSERT(prev_env != NULL); act->lex_env = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, prev_env); DUK_CAT_CLEAR_LEXENV_ACTIVE(cat); DUK_HOBJECT_INCREF(thr, act->lex_env); DUK_HOBJECT_DECREF(thr, prev_env); /* side effects */ DUK_ASSERT(act == thr->callstack_curr); DUK_ASSERT(act != NULL); } pc_base = cat->pc_base; if (DUK_CAT_HAS_FINALLY_ENABLED(cat)) { DUK_DDD(DUK_DDDPRINT("ENDCATCH: finally part is active, jump through 2nd jump slot with 'normal continuation'")); tv1 = thr->valstack + cat->idx_base; DUK_ASSERT(tv1 >= thr->valstack && tv1 < thr->valstack_top); DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv1); /* side effects */ tv1 = NULL; tv1 = thr->valstack + cat->idx_base + 1; DUK_ASSERT(tv1 >= thr->valstack && tv1 < thr->valstack_top); DUK_TVAL_SET_U32_UPDREF(thr, tv1, (duk_uint32_t) DUK_LJ_TYPE_NORMAL); /* side effects */ tv1 = NULL; DUK_CAT_CLEAR_FINALLY_ENABLED(cat); } else { DUK_DDD(DUK_DDDPRINT("ENDCATCH: no finally part, dismantle catcher, jump through 2nd jump slot (to end of statement)")); duk_hthread_catcher_unwind_norz(thr, act); /* no need to unwind callstack */ } return pc_base + 1; /* new curr_pc value */ } DUK_LOCAL DUK__NOINLINE_PERF duk_small_uint_t duk__handle_op_endfin(duk_hthread *thr, duk_uint_fast32_t ins, duk_activation *entry_act) { duk_activation *act; duk_tval *tv1; duk_uint_t reg_catch; duk_small_uint_t cont_type; duk_small_uint_t ret_result; DUK_ASSERT(thr->ptr_curr_pc == NULL); DUK_ASSERT(thr->callstack_top >= 1); act = thr->callstack_curr; DUK_ASSERT(act != NULL); reg_catch = DUK_DEC_ABC(ins); /* CATCH flag may be enabled or disabled here; it may be enabled if * the statement has a catch block but the try block does not throw * an error. */ DUK_DDD(DUK_DDDPRINT("ENDFIN: completion value=%!T, type=%!T", (duk_tval *) (thr->valstack_bottom + reg_catch + 0), (duk_tval *) (thr->valstack_bottom + reg_catch + 1))); tv1 = thr->valstack_bottom + reg_catch + 1; /* type */ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1)); #if defined(DUK_USE_FASTINT) DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv1)); cont_type = (duk_small_uint_t) DUK_TVAL_GET_FASTINT_U32(tv1); #else cont_type = (duk_small_uint_t) DUK_TVAL_GET_NUMBER(tv1); #endif tv1--; /* value */ switch (cont_type) { case DUK_LJ_TYPE_NORMAL: { DUK_DDD(DUK_DDDPRINT("ENDFIN: finally part finishing with 'normal' (non-abrupt) completion -> " "dismantle catcher, resume execution after ENDFIN")); duk_hthread_catcher_unwind_norz(thr, act); /* no need to unwind callstack */ return 0; /* restart execution */ } case DUK_LJ_TYPE_RETURN: { DUK_DDD(DUK_DDDPRINT("ENDFIN: finally part finishing with 'return' complation -> dismantle " "catcher, handle return, lj.value1=%!T", tv1)); /* Not necessary to unwind catch stack: return handling will * do it. The finally flag of 'cat' is no longer set. The * catch flag may be set, but it's not checked by return handling. */ duk_push_tval(thr, tv1); ret_result = duk__handle_return(thr, entry_act); if (ret_result == DUK__RETHAND_RESTART) { return 0; /* restart execution */ } DUK_ASSERT(ret_result == DUK__RETHAND_FINISHED); DUK_DDD(DUK_DDDPRINT("exiting executor after ENDFIN and RETURN (pseudo) longjmp type")); return 1; /* exit executor */ } case DUK_LJ_TYPE_BREAK: case DUK_LJ_TYPE_CONTINUE: { duk_uint_t label_id; duk_small_uint_t lj_type; /* Not necessary to unwind catch stack: break/continue * handling will do it. The finally flag of 'cat' is * no longer set. The catch flag may be set, but it's * not checked by break/continue handling. */ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1)); #if defined(DUK_USE_FASTINT) DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv1)); label_id = (duk_small_uint_t) DUK_TVAL_GET_FASTINT_U32(tv1); #else label_id = (duk_small_uint_t) DUK_TVAL_GET_NUMBER(tv1); #endif lj_type = cont_type; duk__handle_break_or_continue(thr, label_id, lj_type); return 0; /* restart execution */ } default: { DUK_DDD(DUK_DDDPRINT("ENDFIN: finally part finishing with abrupt completion, lj_type=%ld -> " "dismantle catcher, re-throw error", (long) cont_type)); duk_err_setup_ljstate1(thr, (duk_small_uint_t) cont_type, tv1); /* No debugger Throw notify check on purpose (rethrow). */ DUK_ASSERT(thr->heap->lj.jmpbuf_ptr != NULL); /* always in executor */ duk_err_longjmp(thr); DUK_UNREACHABLE(); } } DUK_UNREACHABLE(); return 0; } DUK_LOCAL DUK__NOINLINE_PERF void duk__handle_op_initenum(duk_hthread *thr, duk_uint_fast32_t ins) { duk_small_uint_t b; duk_small_uint_t c; /* * Enumeration semantics come from for-in statement, E5 Section 12.6.4. * If called with 'null' or 'undefined', this opcode returns 'null' as * the enumerator, which is special cased in NEXTENUM. This simplifies * the compiler part */ /* B -> register for writing enumerator object * C -> value to be enumerated (register) */ b = DUK_DEC_B(ins); c = DUK_DEC_C(ins); if (duk_is_null_or_undefined(thr, (duk_idx_t) c)) { duk_push_null(thr); duk_replace(thr, (duk_idx_t) b); } else { duk_dup(thr, (duk_idx_t) c); duk_to_object(thr, -1); duk_hobject_enumerator_create(thr, 0 /*enum_flags*/); /* [ ... val ] --> [ ... enum ] */ duk_replace(thr, (duk_idx_t) b); } } DUK_LOCAL DUK__NOINLINE_PERF duk_small_uint_t duk__handle_op_nextenum(duk_hthread *thr, duk_uint_fast32_t ins) { duk_small_uint_t b; duk_small_uint_t c; duk_small_uint_t pc_skip = 0; /* * NEXTENUM checks whether the enumerator still has unenumerated * keys. If so, the next key is loaded to the target register * and the next instruction is skipped. Otherwise the next instruction * will be executed, jumping out of the enumeration loop. */ /* B -> target register for next key * C -> enum register */ b = DUK_DEC_B(ins); c = DUK_DEC_C(ins); DUK_DDD(DUK_DDDPRINT("NEXTENUM: b->%!T, c->%!T", (duk_tval *) duk_get_tval(thr, (duk_idx_t) b), (duk_tval *) duk_get_tval(thr, (duk_idx_t) c))); if (duk_is_object(thr, (duk_idx_t) c)) { /* XXX: assert 'c' is an enumerator */ duk_dup(thr, (duk_idx_t) c); if (duk_hobject_enumerator_next(thr, 0 /*get_value*/)) { /* [ ... enum ] -> [ ... next_key ] */ DUK_DDD(DUK_DDDPRINT("enum active, next key is %!T, skip jump slot ", (duk_tval *) duk_get_tval(thr, -1))); pc_skip = 1; } else { /* [ ... enum ] -> [ ... ] */ DUK_DDD(DUK_DDDPRINT("enum finished, execute jump slot")); DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top)); /* valstack policy */ thr->valstack_top++; } duk_replace(thr, (duk_idx_t) b); } else { /* 'null' enumerator case -> behave as with an empty enumerator */ DUK_ASSERT(duk_is_null(thr, (duk_idx_t) c)); DUK_DDD(DUK_DDDPRINT("enum is null, execute jump slot")); } return pc_skip; } /* * Call handling helpers. */ DUK_LOCAL duk_bool_t duk__executor_handle_call(duk_hthread *thr, duk_idx_t idx, duk_idx_t nargs, duk_small_uint_t call_flags) { duk_bool_t rc; duk_set_top_unsafe(thr, (duk_idx_t) (idx + nargs + 2)); /* [ ... func this arg1 ... argN ] */ /* Attempt an Ecma-to-Ecma call setup. If the call * target is (directly or indirectly) Reflect.construct(), * the call may change into a constructor call on the fly. */ rc = (duk_bool_t) duk_handle_call_unprotected(thr, idx, call_flags); if (rc != 0) { /* Ecma-to-ecma call possible, may or may not * be a tail call. Avoid C recursion by * reusing current executor instance. */ DUK_DDD(DUK_DDDPRINT("ecma-to-ecma call setup possible, restart execution")); /* curr_pc synced by duk_handle_call_unprotected() */ DUK_ASSERT(thr->ptr_curr_pc == NULL); return rc; } else { /* Call was handled inline. */ } DUK_ASSERT(thr->ptr_curr_pc != NULL); return rc; } /* * Ecmascript bytecode executor. * * Resume execution for the current thread from its current activation. * Returns when execution would return from the entry level activation, * leaving a single return value on top of the stack. Function calls * and thread resumptions are handled internally. If an error occurs, * a longjmp() with type DUK_LJ_TYPE_THROW is called on the entry level * setjmp() jmpbuf. * * Ecmascript function calls and coroutine resumptions are handled * internally (by the outer executor function) without recursive C calls. * Other function calls are handled using duk_handle_call(), increasing * C recursion depth. * * Abrupt completions (= long control tranfers) are handled either * directly by reconfiguring relevant stacks and restarting execution, * or via a longjmp. Longjmp-free handling is preferable for performance * (especially Emscripten performance), and is used for: break, continue, * and return. * * For more detailed notes, see doc/execution.rst. * * Also see doc/code-issues.rst for discussion of setjmp(), longjmp(), * and volatile. */ /* Presence of 'fun' is config based, there's a marginal performance * difference and the best option is architecture dependent. */ #if defined(DUK_USE_EXEC_FUN_LOCAL) #define DUK__FUN() fun #else #define DUK__FUN() ((duk_hcompfunc *) DUK_ACT_GET_FUNC((thr)->callstack_curr)) #endif /* Strict flag. */ #define DUK__STRICT() ((duk_small_uint_t) DUK_HOBJECT_HAS_STRICT((duk_hobject *) DUK__FUN())) /* Reg/const access macros: these are very footprint and performance sensitive * so modify with care. Arguments are sometimes evaluated multiple times which * is not ideal. */ #define DUK__REG(x) (*(thr->valstack_bottom + (x))) #define DUK__REGP(x) (thr->valstack_bottom + (x)) #define DUK__CONST(x) (*(consts + (x))) #define DUK__CONSTP(x) (consts + (x)) /* Reg/const access macros which take the 32-bit instruction and avoid an * explicit field decoding step by using shifts and masks. These must be * kept in sync with duk_js_bytecode.h. The shift/mask values are chosen * so that 'ins' can be shifted and masked and used as a -byte- offset * instead of a duk_tval offset which needs further shifting (which is an * issue on some, but not all, CPUs). */ #define DUK__RCBIT_B DUK_BC_REGCONST_B #define DUK__RCBIT_C DUK_BC_REGCONST_C #if defined(DUK_USE_EXEC_REGCONST_OPTIMIZE) #if defined(DUK_USE_PACKED_TVAL) #define DUK__TVAL_SHIFT 3 /* sizeof(duk_tval) == 8 */ #else #define DUK__TVAL_SHIFT 4 /* sizeof(duk_tval) == 16; not always the case so also asserted for */ #endif #define DUK__SHIFT_A (DUK_BC_SHIFT_A - DUK__TVAL_SHIFT) #define DUK__SHIFT_B (DUK_BC_SHIFT_B - DUK__TVAL_SHIFT) #define DUK__SHIFT_C (DUK_BC_SHIFT_C - DUK__TVAL_SHIFT) #define DUK__SHIFT_BC (DUK_BC_SHIFT_BC - DUK__TVAL_SHIFT) #define DUK__MASK_A (DUK_BC_UNSHIFTED_MASK_A << DUK__TVAL_SHIFT) #define DUK__MASK_B (DUK_BC_UNSHIFTED_MASK_B << DUK__TVAL_SHIFT) #define DUK__MASK_C (DUK_BC_UNSHIFTED_MASK_C << DUK__TVAL_SHIFT) #define DUK__MASK_BC (DUK_BC_UNSHIFTED_MASK_BC << DUK__TVAL_SHIFT) #define DUK__BYTEOFF_A(ins) (((ins) >> DUK__SHIFT_A) & DUK__MASK_A) #define DUK__BYTEOFF_B(ins) (((ins) >> DUK__SHIFT_B) & DUK__MASK_B) #define DUK__BYTEOFF_C(ins) (((ins) >> DUK__SHIFT_C) & DUK__MASK_C) #define DUK__BYTEOFF_BC(ins) (((ins) >> DUK__SHIFT_BC) & DUK__MASK_BC) #define DUK__REGP_A(ins) ((duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_bottom + DUK__BYTEOFF_A((ins)))) #define DUK__REGP_B(ins) ((duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_bottom + DUK__BYTEOFF_B((ins)))) #define DUK__REGP_C(ins) ((duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_bottom + DUK__BYTEOFF_C((ins)))) #define DUK__REGP_BC(ins) ((duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_bottom + DUK__BYTEOFF_BC((ins)))) #define DUK__CONSTP_A(ins) ((duk_tval *) (void *) ((duk_uint8_t *) consts + DUK__BYTEOFF_A((ins)))) #define DUK__CONSTP_B(ins) ((duk_tval *) (void *) ((duk_uint8_t *) consts + DUK__BYTEOFF_B((ins)))) #define DUK__CONSTP_C(ins) ((duk_tval *) (void *) ((duk_uint8_t *) consts + DUK__BYTEOFF_C((ins)))) #define DUK__CONSTP_BC(ins) ((duk_tval *) (void *) ((duk_uint8_t *) consts + DUK__BYTEOFF_BC((ins)))) #define DUK__REGCONSTP_B(ins) ((duk_tval *) (void *) ((duk_uint8_t *) (((ins) & DUK__RCBIT_B) ? consts : thr->valstack_bottom) + DUK__BYTEOFF_B((ins)))) #define DUK__REGCONSTP_C(ins) ((duk_tval *) (void *) ((duk_uint8_t *) (((ins) & DUK__RCBIT_C) ? consts : thr->valstack_bottom) + DUK__BYTEOFF_C((ins)))) #else /* DUK_USE_EXEC_REGCONST_OPTIMIZE */ /* Safe alternatives, no assumption about duk_tval size. */ #define DUK__REGP_A(ins) DUK__REGP(DUK_DEC_A((ins))) #define DUK__REGP_B(ins) DUK__REGP(DUK_DEC_B((ins))) #define DUK__REGP_C(ins) DUK__REGP(DUK_DEC_C((ins))) #define DUK__REGP_BC(ins) DUK__REGP(DUK_DEC_BC((ins))) #define DUK__CONSTP_A(ins) DUK__CONSTP(DUK_DEC_A((ins))) #define DUK__CONSTP_B(ins) DUK__CONSTP(DUK_DEC_B((ins))) #define DUK__CONSTP_C(ins) DUK__CONSTP(DUK_DEC_C((ins))) #define DUK__CONSTP_BC(ins) DUK__CONSTP(DUK_DEC_BC((ins))) #define DUK__REGCONSTP_B(ins) ((((ins) & DUK__RCBIT_B) ? consts : thr->valstack_bottom) + DUK_DEC_B((ins))) #define DUK__REGCONSTP_C(ins) ((((ins) & DUK__RCBIT_C) ? consts : thr->valstack_bottom) + DUK_DEC_C((ins))) #endif /* DUK_USE_EXEC_REGCONST_OPTIMIZE */ #if defined(DUK_USE_VERBOSE_EXECUTOR_ERRORS) #define DUK__INTERNAL_ERROR(msg) do { \ DUK_ERROR_ERROR(thr, (msg)); \ } while (0) #else #define DUK__INTERNAL_ERROR(msg) do { \ goto internal_error; \ } while (0) #endif #define DUK__SYNC_CURR_PC() do { \ duk_activation *duk__act; \ duk__act = thr->callstack_curr; \ duk__act->curr_pc = curr_pc; \ } while (0) #define DUK__SYNC_AND_NULL_CURR_PC() do { \ duk_activation *duk__act; \ duk__act = thr->callstack_curr; \ duk__act->curr_pc = curr_pc; \ thr->ptr_curr_pc = NULL; \ } while (0) #if defined(DUK_USE_EXEC_PREFER_SIZE) #define DUK__LOOKUP_INDIRECT(idx) do { \ (idx) = (duk_uint_fast_t) duk_get_uint(thr, (duk_idx_t) (idx)); \ } while (0) #elif defined(DUK_USE_FASTINT) #define DUK__LOOKUP_INDIRECT(idx) do { \ duk_tval *tv_ind; \ tv_ind = DUK__REGP((idx)); \ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_ind)); \ DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv_ind)); /* compiler guarantees */ \ (idx) = (duk_uint_fast_t) DUK_TVAL_GET_FASTINT_U32(tv_ind); \ } while (0) #else #define DUK__LOOKUP_INDIRECT(idx) do { \ duk_tval *tv_ind; \ tv_ind = DUK__REGP(idx); \ DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_ind)); \ idx = (duk_uint_fast_t) DUK_TVAL_GET_NUMBER(tv_ind); \ } while (0) #endif DUK_LOCAL void duk__handle_executor_error(duk_heap *heap, duk_activation *entry_act, duk_int_t entry_call_recursion_depth, duk_jmpbuf *entry_jmpbuf_ptr) { duk_small_uint_t lj_ret; /* Longjmp callers are required to sync-and-null thr->ptr_curr_pc * before longjmp. */ DUK_ASSERT(heap->curr_thread != NULL); DUK_ASSERT(heap->curr_thread->ptr_curr_pc == NULL); /* XXX: signalling the need to shrink check (only if unwound) */ /* Must be restored here to handle e.g. yields properly. */ heap->call_recursion_depth = entry_call_recursion_depth; /* Switch to caller's setjmp() catcher so that if an error occurs * during error handling, it is always propagated outwards instead * of causing an infinite loop in our own handler. */ heap->lj.jmpbuf_ptr = (duk_jmpbuf *) entry_jmpbuf_ptr; lj_ret = duk__handle_longjmp(heap->curr_thread, entry_act); /* Error handling complete, remove side effect protections. */ #if defined(DUK_USE_ASSERTIONS) DUK_ASSERT(heap->error_not_allowed == 1); heap->error_not_allowed = 0; #endif DUK_ASSERT(heap->pf_prevent_count > 0); heap->pf_prevent_count--; DUK_DD(DUK_DDPRINT("executor error handled, pf_prevent_count updated to %ld", (long) heap->pf_prevent_count)); if (lj_ret == DUK__LONGJMP_RESTART) { /* Restart bytecode execution, possibly with a changed thread. */ DUK_REFZERO_CHECK_SLOW(heap->curr_thread); } else { /* If an error is propagated, don't run refzero checks here. * The next catcher will deal with that. Pf_prevent_count * will be re-bumped by the longjmp. */ DUK_ASSERT(lj_ret == DUK__LONGJMP_RETHROW); /* Rethrow error to calling state. */ DUK_ASSERT(heap->lj.jmpbuf_ptr == entry_jmpbuf_ptr); /* Longjmp handling has restored jmpbuf_ptr. */ /* Thread may have changed, e.g. YIELD converted to THROW. */ duk_err_longjmp(heap->curr_thread); DUK_UNREACHABLE(); } } /* Outer executor with setjmp/longjmp handling. */ DUK_INTERNAL void duk_js_execute_bytecode(duk_hthread *exec_thr) { /* Entry level info. */ duk_hthread *entry_thread; duk_activation *entry_act; duk_int_t entry_call_recursion_depth; duk_jmpbuf *entry_jmpbuf_ptr; duk_jmpbuf our_jmpbuf; duk_heap *heap; DUK_ASSERT(exec_thr != NULL); DUK_ASSERT(exec_thr->heap != NULL); DUK_ASSERT(exec_thr->heap->curr_thread != NULL); DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR((duk_heaphdr *) exec_thr); DUK_ASSERT(exec_thr->callstack_top >= 1); /* at least one activation, ours */ DUK_ASSERT(exec_thr->callstack_curr != NULL); DUK_ASSERT(DUK_ACT_GET_FUNC(exec_thr->callstack_curr) != NULL); DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(exec_thr->callstack_curr))); DUK_GC_TORTURE(exec_thr->heap); entry_thread = exec_thr; heap = entry_thread->heap; entry_act = entry_thread->callstack_curr; DUK_ASSERT(entry_act != NULL); entry_call_recursion_depth = entry_thread->heap->call_recursion_depth; entry_jmpbuf_ptr = entry_thread->heap->lj.jmpbuf_ptr; /* * Note: we currently assume that the setjmp() catchpoint is * not re-entrant (longjmp() cannot be called more than once * for a single setjmp()). * * See doc/code-issues.rst for notes on variable assignment * before and after setjmp(). */ for (;;) { heap->lj.jmpbuf_ptr = &our_jmpbuf; DUK_ASSERT(heap->lj.jmpbuf_ptr != NULL); #if defined(DUK_USE_CPP_EXCEPTIONS) try { #else DUK_ASSERT(heap->lj.jmpbuf_ptr == &our_jmpbuf); if (DUK_SETJMP(our_jmpbuf.jb) == 0) { #endif /* Execute bytecode until returned or longjmp(). */ duk__js_execute_bytecode_inner(entry_thread, entry_act); /* Successful return: restore jmpbuf and return to caller. */ heap->lj.jmpbuf_ptr = entry_jmpbuf_ptr; return; #if defined(DUK_USE_CPP_EXCEPTIONS) } catch (duk_internal_exception &exc) { #else } else { #endif #if defined(DUK_USE_CPP_EXCEPTIONS) DUK_UNREF(exc); #endif DUK_DDD(DUK_DDDPRINT("longjmp caught by bytecode executor")); DUK_STATS_INC(exec_thr->heap, stats_exec_throw); duk__handle_executor_error(heap, entry_act, entry_call_recursion_depth, entry_jmpbuf_ptr); } #if defined(DUK_USE_CPP_EXCEPTIONS) catch (std::exception &exc) { const char *what = exc.what(); if (!what) { what = "unknown"; } DUK_D(DUK_DPRINT("unexpected c++ std::exception (perhaps thrown by user code)")); DUK_STATS_INC(exec_thr->heap, stats_exec_throw); try { DUK_ASSERT(heap->curr_thread != NULL); DUK_ERROR_FMT1(heap->curr_thread, DUK_ERR_TYPE_ERROR, "caught invalid c++ std::exception '%s' (perhaps thrown by user code)", what); } catch (duk_internal_exception exc) { DUK_D(DUK_DPRINT("caught api error thrown from unexpected c++ std::exception")); DUK_UNREF(exc); duk__handle_executor_error(heap, entry_act, entry_call_recursion_depth, entry_jmpbuf_ptr); } } catch (...) { DUK_D(DUK_DPRINT("unexpected c++ exception (perhaps thrown by user code)")); DUK_STATS_INC(exec_thr->heap, stats_exec_throw); try { DUK_ASSERT(heap->curr_thread != NULL); DUK_ERROR_TYPE(heap->curr_thread, "caught invalid c++ exception (perhaps thrown by user code)"); } catch (duk_internal_exception exc) { DUK_D(DUK_DPRINT("caught api error thrown from unexpected c++ exception")); DUK_UNREF(exc); duk__handle_executor_error(heap, entry_act, entry_call_recursion_depth, entry_jmpbuf_ptr); } } #endif } DUK_UNREACHABLE(); } /* Inner executor, performance critical. */ DUK_LOCAL DUK_NOINLINE DUK_HOT void duk__js_execute_bytecode_inner(duk_hthread *entry_thread, duk_activation *entry_act) { /* Current PC, accessed by other functions through thr->ptr_to_curr_pc. * Critical for performance. It would be safest to make this volatile, * but that eliminates performance benefits; aliasing guarantees * should be enough though. */ duk_instr_t *curr_pc; /* bytecode has a stable pointer */ /* Hot variables for interpretation. Critical for performance, * but must add sparingly to minimize register shuffling. */ duk_hthread *thr; /* stable */ duk_tval *consts; /* stable */ duk_uint_fast32_t ins; /* 'funcs' is quite rarely used, so no local for it */ #if defined(DUK_USE_EXEC_FUN_LOCAL) duk_hcompfunc *fun; #else /* 'fun' is quite rarely used, so no local for it */ #endif #if defined(DUK_USE_INTERRUPT_COUNTER) duk_int_t int_ctr; #endif #if defined(DUK_USE_ASSERTIONS) duk_size_t valstack_top_base; /* valstack top, should match before interpreting each op (no leftovers) */ #endif /* Optimized reg/const access macros assume sizeof(duk_tval) to be * either 8 or 16. Heap allocation checks this even without asserts * enabled now because it can't be autodetected in duk_config.h. */ #if 1 #if defined(DUK_USE_PACKED_TVAL) DUK_ASSERT(sizeof(duk_tval) == 8); #else DUK_ASSERT(sizeof(duk_tval) == 16); #endif #endif DUK_GC_TORTURE(entry_thread->heap); /* * Restart execution by reloading thread state. * * Note that 'thr' and any thread configuration may have changed, * so all local variables are suspect and we need to reinitialize. * * The number of local variables should be kept to a minimum: if * the variables are spilled, they will need to be loaded from * memory anyway. * * Any 'goto restart_execution;' code path in opcode dispatch must * ensure 'curr_pc' is synced back to act->curr_pc before the goto * takes place. * * The interpreter must be very careful with memory pointers, as * many pointers are not guaranteed to be 'stable' and may be * reallocated and relocated on-the-fly quite easily (e.g. by a * memory allocation or a property access). * * The following are assumed to have stable pointers: * - the current thread * - the current function * - the bytecode, constant table, inner function table of the * current function (as they are a part of the function allocation) * * The following are assumed to have semi-stable pointers: * - the current activation entry: stable as long as callstack * is not changed (reallocated by growing or shrinking), or * by any garbage collection invocation (through finalizers) * - Note in particular that ANY DECREF can invalidate the * activation pointer, so for the most part a fresh lookup * is required * * The following are not assumed to have stable pointers at all: * - the value stack (registers) of the current thread * * See execution.rst for discussion. */ restart_execution: /* Lookup current thread; use the stable 'entry_thread' for this to * avoid clobber warnings. Any valid, reachable 'thr' value would be * fine for this, so using 'entry_thread' is just to silence warnings. */ thr = entry_thread->heap->curr_thread; DUK_ASSERT(thr != NULL); DUK_ASSERT(thr->callstack_top >= 1); DUK_ASSERT(thr->callstack_curr != NULL); DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL); DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr))); DUK_GC_TORTURE(thr->heap); thr->ptr_curr_pc = &curr_pc; /* Relookup and initialize dispatch loop variables. Debugger check. */ { duk_activation *act; #if !defined(DUK_USE_EXEC_FUN_LOCAL) duk_hcompfunc *fun; #endif /* Assume interrupt init/counter are properly initialized here. */ /* Assume that thr->valstack_bottom has been set-up before getting here. */ act = thr->callstack_curr; DUK_ASSERT(act != NULL); fun = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act); DUK_ASSERT(fun != NULL); DUK_ASSERT(thr->valstack_top - thr->valstack_bottom == fun->nregs); consts = DUK_HCOMPFUNC_GET_CONSTS_BASE(thr->heap, fun); DUK_ASSERT(consts != NULL); #if defined(DUK_USE_DEBUGGER_SUPPORT) if (DUK_UNLIKELY(duk_debug_is_attached(thr->heap) && !thr->heap->dbg_processing)) { duk__executor_recheck_debugger(thr, act, fun); DUK_ASSERT(act == thr->callstack_curr); DUK_ASSERT(act != NULL); } #endif /* DUK_USE_DEBUGGER_SUPPORT */ #if defined(DUK_USE_ASSERTIONS) valstack_top_base = (duk_size_t) (thr->valstack_top - thr->valstack); #endif /* Set up curr_pc for opcode dispatch. */ curr_pc = act->curr_pc; } DUK_DD(DUK_DDPRINT("restarting execution, thr %p, act idx %ld, fun %p," "consts %p, funcs %p, lev %ld, regbot %ld, regtop %ld, " "preventcount=%ld", (void *) thr, (long) (thr->callstack_top - 1), (void *) DUK__FUN(), (void *) DUK_HCOMPFUNC_GET_CONSTS_BASE(thr->heap, DUK__FUN()), (void *) DUK_HCOMPFUNC_GET_FUNCS_BASE(thr->heap, DUK__FUN()), (long) (thr->callstack_top - 1), (long) (thr->valstack_bottom - thr->valstack), (long) (thr->valstack_top - thr->valstack), (long) thr->callstack_preventcount)); /* Dispatch loop. */ for (;;) { duk_uint8_t op; DUK_ASSERT(thr->callstack_top >= 1); DUK_ASSERT(thr->valstack_top - thr->valstack_bottom == DUK__FUN()->nregs); DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack) == valstack_top_base); /* Executor interrupt counter check, used to implement breakpoints, * debugging interface, execution timeouts, etc. The counter is heap * specific but is maintained in the current thread to make the check * as fast as possible. The counter is copied back to the heap struct * whenever a thread switch occurs by the DUK_HEAP_SWITCH_THREAD() macro. */ #if defined(DUK_USE_INTERRUPT_COUNTER) int_ctr = thr->interrupt_counter; if (DUK_LIKELY(int_ctr > 0)) { thr->interrupt_counter = int_ctr - 1; } else { /* Trigger at zero or below */ duk_small_uint_t exec_int_ret; DUK_STATS_INC(thr->heap, stats_exec_interrupt); /* Write curr_pc back for the debugger. */ { duk_activation *act; DUK_ASSERT(thr->callstack_top > 0); act = thr->callstack_curr; DUK_ASSERT(act != NULL); act->curr_pc = (duk_instr_t *) curr_pc; } /* Forced restart caused by a function return; must recheck * debugger breakpoints before checking line transitions, * see GH-303. Restart and then handle interrupt_counter * zero again. */ #if defined(DUK_USE_DEBUGGER_SUPPORT) if (thr->heap->dbg_force_restart) { DUK_DD(DUK_DDPRINT("dbg_force_restart flag forced restart execution")); /* GH-303 */ thr->heap->dbg_force_restart = 0; goto restart_execution; } #endif exec_int_ret = duk__executor_interrupt(thr); if (exec_int_ret == DUK__INT_RESTART) { /* curr_pc synced back above */ goto restart_execution; } } #endif /* DUK_USE_INTERRUPT_COUNTER */ #if defined(DUK_USE_INTERRUPT_COUNTER) && defined(DUK_USE_DEBUG) /* For cross-checking during development: ensure dispatch count * matches cumulative interrupt counter init value sums. */ thr->heap->inst_count_exec++; #endif #if defined(DUK_USE_ASSERTIONS) || defined(DUK_USE_DEBUG) { duk_activation *act; act = thr->callstack_curr; DUK_ASSERT(curr_pc >= DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, DUK__FUN())); DUK_ASSERT(curr_pc < DUK_HCOMPFUNC_GET_CODE_END(thr->heap, DUK__FUN())); DUK_UNREF(act); /* if debugging disabled */ DUK_DDD(DUK_DDDPRINT("executing bytecode: pc=%ld, ins=0x%08lx, op=%ld, valstack_top=%ld/%ld, nregs=%ld --> %!I", (long) (curr_pc - DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, DUK__FUN())), (unsigned long) *curr_pc, (long) DUK_DEC_OP(*curr_pc), (long) (thr->valstack_top - thr->valstack), (long) (thr->valstack_end - thr->valstack), (long) (DUK__FUN() ? DUK__FUN()->nregs : -1), (duk_instr_t) *curr_pc)); } #endif #if defined(DUK_USE_ASSERTIONS) /* Quite heavy assert: check valstack policy. Improper * shuffle instructions can write beyond valstack_top/end * so this check catches them in the act. */ { duk_tval *tv; tv = thr->valstack_top; while (tv != thr->valstack_end) { DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv)); tv++; } } #endif ins = *curr_pc++; DUK_STATS_INC(thr->heap, stats_exec_opcodes); /* Typing: use duk_small_(u)int_fast_t when decoding small * opcode fields (op, A, B, C, BC) which fit into 16 bits * and duk_(u)int_fast_t when decoding larger fields (e.g. * ABC). Use unsigned variant by default, signed when the * value is used in signed arithmetic. Using variable names * such as 'a', 'b', 'c', 'bc', etc makes it easier to spot * typing mismatches. */ /* Switch based on opcode. Cast to 8-bit unsigned value and * use a fully populated case clauses so that the compiler * will (at least usually) omit a bounds check. */ op = (duk_uint8_t) DUK_DEC_OP(ins); switch (op) { /* Some useful macros. These access inner executor variables * directly so they only apply within the executor. */ #if defined(DUK_USE_EXEC_PREFER_SIZE) #define DUK__REPLACE_TOP_A_BREAK() { goto replace_top_a; } #define DUK__REPLACE_TOP_BC_BREAK() { goto replace_top_bc; } #define DUK__REPLACE_BOOL_A_BREAK(bval) { \ duk_bool_t duk__bval; \ duk__bval = (bval); \ DUK_ASSERT(duk__bval == 0 || duk__bval == 1); \ duk_push_boolean(thr, duk__bval); \ DUK__REPLACE_TOP_A_BREAK(); \ } #else #define DUK__REPLACE_TOP_A_BREAK() { DUK__REPLACE_TO_TVPTR(thr, DUK__REGP_A(ins)); break; } #define DUK__REPLACE_TOP_BC_BREAK() { DUK__REPLACE_TO_TVPTR(thr, DUK__REGP_BC(ins)); break; } #define DUK__REPLACE_BOOL_A_BREAK(bval) { \ duk_bool_t duk__bval; \ duk_tval *duk__tvdst; \ duk__bval = (bval); \ DUK_ASSERT(duk__bval == 0 || duk__bval == 1); \ duk__tvdst = DUK__REGP_A(ins); \ DUK_TVAL_SET_BOOLEAN_UPDREF(thr, duk__tvdst, duk__bval); \ break; \ } #endif /* XXX: 12 + 12 bit variant might make sense too, for both reg and * const loads. */ /* For LDREG, STREG, LDCONST footprint optimized variants would just * duk_dup() + duk_replace(), but because they're used quite a lot * they're currently intentionally not size optimized. */ case DUK_OP_LDREG: { duk_tval *tv1, *tv2; tv1 = DUK__REGP_A(ins); tv2 = DUK__REGP_BC(ins); DUK_TVAL_SET_TVAL_UPDREF_FAST(thr, tv1, tv2); /* side effects */ break; } case DUK_OP_STREG: { duk_tval *tv1, *tv2; tv1 = DUK__REGP_A(ins); tv2 = DUK__REGP_BC(ins); DUK_TVAL_SET_TVAL_UPDREF_FAST(thr, tv2, tv1); /* side effects */ break; } case DUK_OP_LDCONST: { duk_tval *tv1, *tv2; tv1 = DUK__REGP_A(ins); tv2 = DUK__CONSTP_BC(ins); DUK_TVAL_SET_TVAL_UPDREF_FAST(thr, tv1, tv2); /* side effects */ break; } /* LDINT and LDINTX are intended to load an arbitrary signed * 32-bit value. Only an LDINT+LDINTX sequence is supported. * This also guarantees all values remain fastints. */ #if defined(DUK_USE_EXEC_PREFER_SIZE) case DUK_OP_LDINT: { duk_int32_t val; val = (duk_int32_t) DUK_DEC_BC(ins) - (duk_int32_t) DUK_BC_LDINT_BIAS; duk_push_int(thr, val); DUK__REPLACE_TOP_A_BREAK(); } case DUK_OP_LDINTX: { duk_int32_t val; val = (duk_int32_t) duk_get_int(thr, DUK_DEC_A(ins)); val = (val << DUK_BC_LDINTX_SHIFT) + (duk_int32_t) DUK_DEC_BC(ins); /* no bias */ duk_push_int(thr, val); DUK__REPLACE_TOP_A_BREAK(); } #else /* DUK_USE_EXEC_PREFER_SIZE */ case DUK_OP_LDINT: { duk_tval *tv1; duk_int32_t val; val = (duk_int32_t) DUK_DEC_BC(ins) - (duk_int32_t) DUK_BC_LDINT_BIAS; tv1 = DUK__REGP_A(ins); DUK_TVAL_SET_I32_UPDREF(thr, tv1, val); /* side effects */ break; } case DUK_OP_LDINTX: { duk_tval *tv1; duk_int32_t val; tv1 = DUK__REGP_A(ins); DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1)); #if defined(DUK_USE_FASTINT) DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv1)); val = DUK_TVAL_GET_FASTINT_I32(tv1); #else /* XXX: fast double-to-int conversion, we know number is integer in [-0x80000000,0xffffffff]. */ val = (duk_int32_t) DUK_TVAL_GET_NUMBER(tv1); #endif val = (val << DUK_BC_LDINTX_SHIFT) + (duk_int32_t) DUK_DEC_BC(ins); /* no bias */ DUK_TVAL_SET_I32_UPDREF(thr, tv1, val); /* side effects */ break; } #endif /* DUK_USE_EXEC_PREFER_SIZE */ #if defined(DUK_USE_EXEC_PREFER_SIZE) case DUK_OP_LDTHIS: { duk_push_this(thr); DUK__REPLACE_TOP_BC_BREAK(); } case DUK_OP_LDUNDEF: { duk_to_undefined(thr, (duk_idx_t) DUK_DEC_BC(ins)); break; } case DUK_OP_LDNULL: { duk_to_null(thr, (duk_idx_t) DUK_DEC_BC(ins)); break; } case DUK_OP_LDTRUE: { duk_push_true(thr); DUK__REPLACE_TOP_BC_BREAK(); } case DUK_OP_LDFALSE: { duk_push_false(thr); DUK__REPLACE_TOP_BC_BREAK(); } #else /* DUK_USE_EXEC_PREFER_SIZE */ case DUK_OP_LDTHIS: { /* Note: 'this' may be bound to any value, not just an object */ duk_tval *tv1, *tv2; tv1 = DUK__REGP_BC(ins); tv2 = thr->valstack_bottom - 1; /* 'this binding' is just under bottom */ DUK_ASSERT(tv2 >= thr->valstack); DUK_TVAL_SET_TVAL_UPDREF_FAST(thr, tv1, tv2); /* side effects */ break; } case DUK_OP_LDUNDEF: { duk_tval *tv1; tv1 = DUK__REGP_BC(ins); DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv1); /* side effects */ break; } case DUK_OP_LDNULL: { duk_tval *tv1; tv1 = DUK__REGP_BC(ins); DUK_TVAL_SET_NULL_UPDREF(thr, tv1); /* side effects */ break; } case DUK_OP_LDTRUE: { duk_tval *tv1; tv1 = DUK__REGP_BC(ins); DUK_TVAL_SET_BOOLEAN_UPDREF(thr, tv1, 1); /* side effects */ break; } case DUK_OP_LDFALSE: { duk_tval *tv1; tv1 = DUK__REGP_BC(ins); DUK_TVAL_SET_BOOLEAN_UPDREF(thr, tv1, 0); /* side effects */ break; } #endif /* DUK_USE_EXEC_PREFER_SIZE */ case DUK_OP_BNOT: { duk__vm_bitwise_not(thr, DUK_DEC_BC(ins), DUK_DEC_A(ins)); break; } case DUK_OP_LNOT: { duk__vm_logical_not(thr, DUK_DEC_BC(ins), DUK_DEC_A(ins)); break; } #if defined(DUK_USE_EXEC_PREFER_SIZE) case DUK_OP_UNM: case DUK_OP_UNP: { duk__vm_arith_unary_op(thr, DUK_DEC_BC(ins), DUK_DEC_A(ins), op); break; } #else /* DUK_USE_EXEC_PREFER_SIZE */ case DUK_OP_UNM: { duk__vm_arith_unary_op(thr, DUK_DEC_BC(ins), DUK_DEC_A(ins), DUK_OP_UNM); break; } case DUK_OP_UNP: { duk__vm_arith_unary_op(thr, DUK_DEC_BC(ins), DUK_DEC_A(ins), DUK_OP_UNP); break; } #endif /* DUK_USE_EXEC_PREFER_SIZE */ #if defined(DUK_USE_EXEC_PREFER_SIZE) case DUK_OP_TYPEOF: { duk_small_uint_t stridx; stridx = duk_js_typeof_stridx(DUK__REGP_BC(ins)); DUK_ASSERT_STRIDX_VALID(stridx); duk_push_hstring_stridx(thr, stridx); DUK__REPLACE_TOP_A_BREAK(); } #else /* DUK_USE_EXEC_PREFER_SIZE */ case DUK_OP_TYPEOF: { duk_tval *tv; duk_small_uint_t stridx; duk_hstring *h_str; tv = DUK__REGP_BC(ins); stridx = duk_js_typeof_stridx(tv); DUK_ASSERT_STRIDX_VALID(stridx); h_str = DUK_HTHREAD_GET_STRING(thr, stridx); tv = DUK__REGP_A(ins); DUK_TVAL_SET_STRING_UPDREF(thr, tv, h_str); break; } #endif /* DUK_USE_EXEC_PREFER_SIZE */ case DUK_OP_TYPEOFID: { duk_small_uint_t stridx; #if !defined(DUK_USE_EXEC_PREFER_SIZE) duk_hstring *h_str; #endif duk_activation *act; duk_hstring *name; duk_tval *tv; /* A -> target register * BC -> constant index of identifier name */ tv = DUK__CONSTP_BC(ins); DUK_ASSERT(DUK_TVAL_IS_STRING(tv)); name = DUK_TVAL_GET_STRING(tv); tv = NULL; /* lookup has side effects */ act = thr->callstack_curr; if (duk_js_getvar_activation(thr, act, name, 0 /*throw*/)) { /* -> [... val this] */ tv = DUK_GET_TVAL_NEGIDX(thr, -2); stridx = duk_js_typeof_stridx(tv); tv = NULL; /* no longer needed */ duk_pop_2_unsafe(thr); } else { /* unresolvable, no stack changes */ stridx = DUK_STRIDX_LC_UNDEFINED; } DUK_ASSERT_STRIDX_VALID(stridx); #if defined(DUK_USE_EXEC_PREFER_SIZE) duk_push_hstring_stridx(thr, stridx); DUK__REPLACE_TOP_A_BREAK(); #else /* DUK_USE_EXEC_PREFER_SIZE */ h_str = DUK_HTHREAD_GET_STRING(thr, stridx); tv = DUK__REGP_A(ins); DUK_TVAL_SET_STRING_UPDREF(thr, tv, h_str); break; #endif /* DUK_USE_EXEC_PREFER_SIZE */ } /* Equality: E5 Sections 11.9.1, 11.9.3 */ #define DUK__EQ_BODY(barg,carg) { \ duk_bool_t tmp; \ tmp = duk_js_equals(thr, (barg), (carg)); \ DUK_ASSERT(tmp == 0 || tmp == 1); \ DUK__REPLACE_BOOL_A_BREAK(tmp); \ } #define DUK__NEQ_BODY(barg,carg) { \ duk_bool_t tmp; \ tmp = duk_js_equals(thr, (barg), (carg)); \ DUK_ASSERT(tmp == 0 || tmp == 1); \ tmp ^= 1; \ DUK__REPLACE_BOOL_A_BREAK(tmp); \ } #define DUK__SEQ_BODY(barg,carg) { \ duk_bool_t tmp; \ tmp = duk_js_strict_equals((barg), (carg)); \ DUK_ASSERT(tmp == 0 || tmp == 1); \ DUK__REPLACE_BOOL_A_BREAK(tmp); \ } #define DUK__SNEQ_BODY(barg,carg) { \ duk_bool_t tmp; \ tmp = duk_js_strict_equals((barg), (carg)); \ DUK_ASSERT(tmp == 0 || tmp == 1); \ tmp ^= 1; \ DUK__REPLACE_BOOL_A_BREAK(tmp); \ } #if defined(DUK_USE_EXEC_PREFER_SIZE) case DUK_OP_EQ_RR: case DUK_OP_EQ_CR: case DUK_OP_EQ_RC: case DUK_OP_EQ_CC: DUK__EQ_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); case DUK_OP_NEQ_RR: case DUK_OP_NEQ_CR: case DUK_OP_NEQ_RC: case DUK_OP_NEQ_CC: DUK__NEQ_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); case DUK_OP_SEQ_RR: case DUK_OP_SEQ_CR: case DUK_OP_SEQ_RC: case DUK_OP_SEQ_CC: DUK__SEQ_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); case DUK_OP_SNEQ_RR: case DUK_OP_SNEQ_CR: case DUK_OP_SNEQ_RC: case DUK_OP_SNEQ_CC: DUK__SNEQ_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); #else /* DUK_USE_EXEC_PREFER_SIZE */ case DUK_OP_EQ_RR: DUK__EQ_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); case DUK_OP_EQ_CR: DUK__EQ_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); case DUK_OP_EQ_RC: DUK__EQ_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); case DUK_OP_EQ_CC: DUK__EQ_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); case DUK_OP_NEQ_RR: DUK__NEQ_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); case DUK_OP_NEQ_CR: DUK__NEQ_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); case DUK_OP_NEQ_RC: DUK__NEQ_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); case DUK_OP_NEQ_CC: DUK__NEQ_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); case DUK_OP_SEQ_RR: DUK__SEQ_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); case DUK_OP_SEQ_CR: DUK__SEQ_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); case DUK_OP_SEQ_RC: DUK__SEQ_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); case DUK_OP_SEQ_CC: DUK__SEQ_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); case DUK_OP_SNEQ_RR: DUK__SNEQ_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); case DUK_OP_SNEQ_CR: DUK__SNEQ_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); case DUK_OP_SNEQ_RC: DUK__SNEQ_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); case DUK_OP_SNEQ_CC: DUK__SNEQ_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); #endif /* DUK_USE_EXEC_PREFER_SIZE */ #define DUK__COMPARE_BODY(arg1,arg2,flags) { \ duk_bool_t tmp; \ tmp = duk_js_compare_helper(thr, (arg1), (arg2), (flags)); \ DUK_ASSERT(tmp == 0 || tmp == 1); \ DUK__REPLACE_BOOL_A_BREAK(tmp); \ } #define DUK__GT_BODY(barg,carg) DUK__COMPARE_BODY((carg), (barg), 0) #define DUK__GE_BODY(barg,carg) DUK__COMPARE_BODY((barg), (carg), DUK_COMPARE_FLAG_EVAL_LEFT_FIRST | DUK_COMPARE_FLAG_NEGATE) #define DUK__LT_BODY(barg,carg) DUK__COMPARE_BODY((barg), (carg), DUK_COMPARE_FLAG_EVAL_LEFT_FIRST) #define DUK__LE_BODY(barg,carg) DUK__COMPARE_BODY((carg), (barg), DUK_COMPARE_FLAG_NEGATE) #if defined(DUK_USE_EXEC_PREFER_SIZE) case DUK_OP_GT_RR: case DUK_OP_GT_CR: case DUK_OP_GT_RC: case DUK_OP_GT_CC: DUK__GT_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); case DUK_OP_GE_RR: case DUK_OP_GE_CR: case DUK_OP_GE_RC: case DUK_OP_GE_CC: DUK__GE_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); case DUK_OP_LT_RR: case DUK_OP_LT_CR: case DUK_OP_LT_RC: case DUK_OP_LT_CC: DUK__LT_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); case DUK_OP_LE_RR: case DUK_OP_LE_CR: case DUK_OP_LE_RC: case DUK_OP_LE_CC: DUK__LE_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); #else /* DUK_USE_EXEC_PREFER_SIZE */ case DUK_OP_GT_RR: DUK__GT_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); case DUK_OP_GT_CR: DUK__GT_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); case DUK_OP_GT_RC: DUK__GT_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); case DUK_OP_GT_CC: DUK__GT_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); case DUK_OP_GE_RR: DUK__GE_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); case DUK_OP_GE_CR: DUK__GE_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); case DUK_OP_GE_RC: DUK__GE_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); case DUK_OP_GE_CC: DUK__GE_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); case DUK_OP_LT_RR: DUK__LT_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); case DUK_OP_LT_CR: DUK__LT_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); case DUK_OP_LT_RC: DUK__LT_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); case DUK_OP_LT_CC: DUK__LT_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); case DUK_OP_LE_RR: DUK__LE_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); case DUK_OP_LE_CR: DUK__LE_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); case DUK_OP_LE_RC: DUK__LE_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); case DUK_OP_LE_CC: DUK__LE_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); #endif /* DUK_USE_EXEC_PREFER_SIZE */ /* No size optimized variant at present for IF. */ case DUK_OP_IFTRUE_R: { if (duk_js_toboolean(DUK__REGP_BC(ins)) != 0) { curr_pc++; } break; } case DUK_OP_IFTRUE_C: { if (duk_js_toboolean(DUK__CONSTP_BC(ins)) != 0) { curr_pc++; } break; } case DUK_OP_IFFALSE_R: { if (duk_js_toboolean(DUK__REGP_BC(ins)) == 0) { curr_pc++; } break; } case DUK_OP_IFFALSE_C: { if (duk_js_toboolean(DUK__CONSTP_BC(ins)) == 0) { curr_pc++; } break; } #if defined(DUK_USE_EXEC_PREFER_SIZE) case DUK_OP_ADD_RR: case DUK_OP_ADD_CR: case DUK_OP_ADD_RC: case DUK_OP_ADD_CC: { /* XXX: could leave value on stack top and goto replace_top_a; */ duk__vm_arith_add(thr, DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins), DUK_DEC_A(ins)); break; } #else /* DUK_USE_EXEC_PREFER_SIZE */ case DUK_OP_ADD_RR: { duk__vm_arith_add(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins)); break; } case DUK_OP_ADD_CR: { duk__vm_arith_add(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins)); break; } case DUK_OP_ADD_RC: { duk__vm_arith_add(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins)); break; } case DUK_OP_ADD_CC: { duk__vm_arith_add(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins)); break; } #endif /* DUK_USE_EXEC_PREFER_SIZE */ #if defined(DUK_USE_EXEC_PREFER_SIZE) case DUK_OP_SUB_RR: case DUK_OP_SUB_CR: case DUK_OP_SUB_RC: case DUK_OP_SUB_CC: case DUK_OP_MUL_RR: case DUK_OP_MUL_CR: case DUK_OP_MUL_RC: case DUK_OP_MUL_CC: case DUK_OP_DIV_RR: case DUK_OP_DIV_CR: case DUK_OP_DIV_RC: case DUK_OP_DIV_CC: case DUK_OP_MOD_RR: case DUK_OP_MOD_CR: case DUK_OP_MOD_RC: case DUK_OP_MOD_CC: #if defined(DUK_USE_ES7_EXP_OPERATOR) case DUK_OP_EXP_RR: case DUK_OP_EXP_CR: case DUK_OP_EXP_RC: case DUK_OP_EXP_CC: #endif /* DUK_USE_ES7_EXP_OPERATOR */ { /* XXX: could leave value on stack top and goto replace_top_a; */ duk__vm_arith_binary_op(thr, DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins), DUK_DEC_A(ins), op); break; } #else /* DUK_USE_EXEC_PREFER_SIZE */ case DUK_OP_SUB_RR: { duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_SUB); break; } case DUK_OP_SUB_CR: { duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_SUB); break; } case DUK_OP_SUB_RC: { duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_SUB); break; } case DUK_OP_SUB_CC: { duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_SUB); break; } case DUK_OP_MUL_RR: { duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_MUL); break; } case DUK_OP_MUL_CR: { duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_MUL); break; } case DUK_OP_MUL_RC: { duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_MUL); break; } case DUK_OP_MUL_CC: { duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_MUL); break; } case DUK_OP_DIV_RR: { duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_DIV); break; } case DUK_OP_DIV_CR: { duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_DIV); break; } case DUK_OP_DIV_RC: { duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_DIV); break; } case DUK_OP_DIV_CC: { duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_DIV); break; } case DUK_OP_MOD_RR: { duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_MOD); break; } case DUK_OP_MOD_CR: { duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_MOD); break; } case DUK_OP_MOD_RC: { duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_MOD); break; } case DUK_OP_MOD_CC: { duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_MOD); break; } #if defined(DUK_USE_ES7_EXP_OPERATOR) case DUK_OP_EXP_RR: { duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_EXP); break; } case DUK_OP_EXP_CR: { duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_EXP); break; } case DUK_OP_EXP_RC: { duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_EXP); break; } case DUK_OP_EXP_CC: { duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_EXP); break; } #endif /* DUK_USE_ES7_EXP_OPERATOR */ #endif /* DUK_USE_EXEC_PREFER_SIZE */ #if defined(DUK_USE_EXEC_PREFER_SIZE) case DUK_OP_BAND_RR: case DUK_OP_BAND_CR: case DUK_OP_BAND_RC: case DUK_OP_BAND_CC: case DUK_OP_BOR_RR: case DUK_OP_BOR_CR: case DUK_OP_BOR_RC: case DUK_OP_BOR_CC: case DUK_OP_BXOR_RR: case DUK_OP_BXOR_CR: case DUK_OP_BXOR_RC: case DUK_OP_BXOR_CC: case DUK_OP_BASL_RR: case DUK_OP_BASL_CR: case DUK_OP_BASL_RC: case DUK_OP_BASL_CC: case DUK_OP_BLSR_RR: case DUK_OP_BLSR_CR: case DUK_OP_BLSR_RC: case DUK_OP_BLSR_CC: case DUK_OP_BASR_RR: case DUK_OP_BASR_CR: case DUK_OP_BASR_RC: case DUK_OP_BASR_CC: { /* XXX: could leave value on stack top and goto replace_top_a; */ duk__vm_bitwise_binary_op(thr, DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins), DUK_DEC_A(ins), op); break; } #else /* DUK_USE_EXEC_PREFER_SIZE */ case DUK_OP_BAND_RR: { duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BAND); break; } case DUK_OP_BAND_CR: { duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BAND); break; } case DUK_OP_BAND_RC: { duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BAND); break; } case DUK_OP_BAND_CC: { duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BAND); break; } case DUK_OP_BOR_RR: { duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BOR); break; } case DUK_OP_BOR_CR: { duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BOR); break; } case DUK_OP_BOR_RC: { duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BOR); break; } case DUK_OP_BOR_CC: { duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BOR); break; } case DUK_OP_BXOR_RR: { duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BXOR); break; } case DUK_OP_BXOR_CR: { duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BXOR); break; } case DUK_OP_BXOR_RC: { duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BXOR); break; } case DUK_OP_BXOR_CC: { duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BXOR); break; } case DUK_OP_BASL_RR: { duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BASL); break; } case DUK_OP_BASL_CR: { duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BASL); break; } case DUK_OP_BASL_RC: { duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BASL); break; } case DUK_OP_BASL_CC: { duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BASL); break; } case DUK_OP_BLSR_RR: { duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BLSR); break; } case DUK_OP_BLSR_CR: { duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BLSR); break; } case DUK_OP_BLSR_RC: { duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BLSR); break; } case DUK_OP_BLSR_CC: { duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BLSR); break; } case DUK_OP_BASR_RR: { duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BASR); break; } case DUK_OP_BASR_CR: { duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BASR); break; } case DUK_OP_BASR_RC: { duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BASR); break; } case DUK_OP_BASR_CC: { duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BASR); break; } #endif /* DUK_USE_EXEC_PREFER_SIZE */ /* For INSTOF and IN, B is always a register. */ #define DUK__INSTOF_BODY(barg,carg) { \ duk_bool_t tmp; \ tmp = duk_js_instanceof(thr, (barg), (carg)); \ DUK_ASSERT(tmp == 0 || tmp == 1); \ DUK__REPLACE_BOOL_A_BREAK(tmp); \ } #define DUK__IN_BODY(barg,carg) { \ duk_bool_t tmp; \ tmp = duk_js_in(thr, (barg), (carg)); \ DUK_ASSERT(tmp == 0 || tmp == 1); \ DUK__REPLACE_BOOL_A_BREAK(tmp); \ } #if defined(DUK_USE_EXEC_PREFER_SIZE) case DUK_OP_INSTOF_RR: case DUK_OP_INSTOF_CR: case DUK_OP_INSTOF_RC: case DUK_OP_INSTOF_CC: DUK__INSTOF_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); case DUK_OP_IN_RR: case DUK_OP_IN_CR: case DUK_OP_IN_RC: case DUK_OP_IN_CC: DUK__IN_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); #else /* DUK_USE_EXEC_PREFER_SIZE */ case DUK_OP_INSTOF_RR: DUK__INSTOF_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); case DUK_OP_INSTOF_CR: DUK__INSTOF_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); case DUK_OP_INSTOF_RC: DUK__INSTOF_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); case DUK_OP_INSTOF_CC: DUK__INSTOF_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); case DUK_OP_IN_RR: DUK__IN_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); case DUK_OP_IN_CR: DUK__IN_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); case DUK_OP_IN_RC: DUK__IN_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); case DUK_OP_IN_CC: DUK__IN_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); #endif /* DUK_USE_EXEC_PREFER_SIZE */ /* Pre/post inc/dec for register variables, important for loops. */ #if defined(DUK_USE_EXEC_PREFER_SIZE) case DUK_OP_PREINCR: case DUK_OP_PREDECR: case DUK_OP_POSTINCR: case DUK_OP_POSTDECR: { duk__prepost_incdec_reg_helper(thr, DUK__REGP_A(ins), DUK__REGP_BC(ins), op); break; } case DUK_OP_PREINCV: case DUK_OP_PREDECV: case DUK_OP_POSTINCV: case DUK_OP_POSTDECV: { duk__prepost_incdec_var_helper(thr, DUK_DEC_A(ins), DUK__CONSTP_BC(ins), op, DUK__STRICT()); break; } #else /* DUK_USE_EXEC_PREFER_SIZE */ case DUK_OP_PREINCR: { duk__prepost_incdec_reg_helper(thr, DUK__REGP_A(ins), DUK__REGP_BC(ins), DUK_OP_PREINCR); break; } case DUK_OP_PREDECR: { duk__prepost_incdec_reg_helper(thr, DUK__REGP_A(ins), DUK__REGP_BC(ins), DUK_OP_PREDECR); break; } case DUK_OP_POSTINCR: { duk__prepost_incdec_reg_helper(thr, DUK__REGP_A(ins), DUK__REGP_BC(ins), DUK_OP_POSTINCR); break; } case DUK_OP_POSTDECR: { duk__prepost_incdec_reg_helper(thr, DUK__REGP_A(ins), DUK__REGP_BC(ins), DUK_OP_POSTDECR); break; } case DUK_OP_PREINCV: { duk__prepost_incdec_var_helper(thr, DUK_DEC_A(ins), DUK__CONSTP_BC(ins), DUK_OP_PREINCV, DUK__STRICT()); break; } case DUK_OP_PREDECV: { duk__prepost_incdec_var_helper(thr, DUK_DEC_A(ins), DUK__CONSTP_BC(ins), DUK_OP_PREDECV, DUK__STRICT()); break; } case DUK_OP_POSTINCV: { duk__prepost_incdec_var_helper(thr, DUK_DEC_A(ins), DUK__CONSTP_BC(ins), DUK_OP_POSTINCV, DUK__STRICT()); break; } case DUK_OP_POSTDECV: { duk__prepost_incdec_var_helper(thr, DUK_DEC_A(ins), DUK__CONSTP_BC(ins), DUK_OP_POSTDECV, DUK__STRICT()); break; } #endif /* DUK_USE_EXEC_PREFER_SIZE */ /* XXX: Move to separate helper, optimize for perf/size separately. */ /* Preinc/predec for object properties. */ case DUK_OP_PREINCP_RR: case DUK_OP_PREINCP_CR: case DUK_OP_PREINCP_RC: case DUK_OP_PREINCP_CC: case DUK_OP_PREDECP_RR: case DUK_OP_PREDECP_CR: case DUK_OP_PREDECP_RC: case DUK_OP_PREDECP_CC: case DUK_OP_POSTINCP_RR: case DUK_OP_POSTINCP_CR: case DUK_OP_POSTINCP_RC: case DUK_OP_POSTINCP_CC: case DUK_OP_POSTDECP_RR: case DUK_OP_POSTDECP_CR: case DUK_OP_POSTDECP_RC: case DUK_OP_POSTDECP_CC: { duk_tval *tv_obj; duk_tval *tv_key; duk_tval *tv_val; duk_bool_t rc; duk_double_t x, y, z; #if !defined(DUK_USE_EXEC_PREFER_SIZE) duk_tval *tv_dst; #endif /* DUK_USE_EXEC_PREFER_SIZE */ /* A -> target reg * B -> object reg/const (may be const e.g. in "'foo'[1]") * C -> key reg/const */ /* Opcode bits 0-1 are used to distinguish reg/const variants. * Opcode bits 2-3 are used to distinguish inc/dec variants: * Bit 2 = inc(0)/dec(1), bit 3 = pre(0)/post(1). */ DUK_ASSERT((DUK_OP_PREINCP_RR & 0x0c) == 0x00); DUK_ASSERT((DUK_OP_PREDECP_RR & 0x0c) == 0x04); DUK_ASSERT((DUK_OP_POSTINCP_RR & 0x0c) == 0x08); DUK_ASSERT((DUK_OP_POSTDECP_RR & 0x0c) == 0x0c); tv_obj = DUK__REGCONSTP_B(ins); tv_key = DUK__REGCONSTP_C(ins); rc = duk_hobject_getprop(thr, tv_obj, tv_key); /* -> [val] */ DUK_UNREF(rc); /* ignore */ tv_obj = NULL; /* invalidated */ tv_key = NULL; /* invalidated */ /* XXX: Fastint fast path would be useful here. Also fastints * now lose their fastint status in current handling which is * not intuitive. */ x = duk_to_number_m1(thr); duk_pop_unsafe(thr); if (ins & DUK_BC_INCDECP_FLAG_DEC) { y = x - 1.0; } else { y = x + 1.0; } duk_push_number(thr, y); tv_val = DUK_GET_TVAL_NEGIDX(thr, -1); DUK_ASSERT(tv_val != NULL); tv_obj = DUK__REGCONSTP_B(ins); tv_key = DUK__REGCONSTP_C(ins); rc = duk_hobject_putprop(thr, tv_obj, tv_key, tv_val, DUK__STRICT()); DUK_UNREF(rc); /* ignore */ tv_obj = NULL; /* invalidated */ tv_key = NULL; /* invalidated */ duk_pop_unsafe(thr); z = (ins & DUK_BC_INCDECP_FLAG_POST) ? x : y; #if defined(DUK_USE_EXEC_PREFER_SIZE) duk_push_number(thr, z); DUK__REPLACE_TOP_A_BREAK(); #else tv_dst = DUK__REGP_A(ins); DUK_TVAL_SET_NUMBER_UPDREF(thr, tv_dst, z); break; #endif } /* XXX: GETPROP where object is 'this', GETPROPT? * Occurs relatively often in object oriented code. */ #define DUK__GETPROP_BODY(barg,carg) { \ /* A -> target reg \ * B -> object reg/const (may be const e.g. in "'foo'[1]") \ * C -> key reg/const \ */ \ (void) duk_hobject_getprop(thr, (barg), (carg)); \ DUK__REPLACE_TOP_A_BREAK(); \ } #define DUK__GETPROPC_BODY(barg,carg) { \ /* Same as GETPROP but callability check for property-based calls. */ \ duk_tval *tv__targ; \ (void) duk_hobject_getprop(thr, (barg), (carg)); \ DUK_GC_TORTURE(thr->heap); \ tv__targ = DUK_GET_TVAL_NEGIDX(thr, -1); \ if (DUK_UNLIKELY(!duk_is_callable_tval(thr, tv__targ))) { \ /* Here we intentionally re-evaluate the macro \ * arguments to deal with potentially changed \ * valstack base pointer! \ */ \ duk_call_setup_propcall_error(thr, tv__targ, (barg), (carg)); \ } \ DUK__REPLACE_TOP_A_BREAK(); \ } #define DUK__PUTPROP_BODY(aarg,barg,carg) { \ /* A -> object reg \ * B -> key reg/const \ * C -> value reg/const \ * \ * Note: intentional difference to register arrangement \ * of e.g. GETPROP; 'A' must contain a register-only value. \ */ \ (void) duk_hobject_putprop(thr, (aarg), (barg), (carg), DUK__STRICT()); \ break; \ } #define DUK__DELPROP_BODY(barg,carg) { \ /* A -> result reg \ * B -> object reg \ * C -> key reg/const \ */ \ duk_bool_t rc; \ rc = duk_hobject_delprop(thr, (barg), (carg), DUK__STRICT()); \ DUK_ASSERT(rc == 0 || rc == 1); \ DUK__REPLACE_BOOL_A_BREAK(rc); \ } #if defined(DUK_USE_EXEC_PREFER_SIZE) case DUK_OP_GETPROP_RR: case DUK_OP_GETPROP_CR: case DUK_OP_GETPROP_RC: case DUK_OP_GETPROP_CC: DUK__GETPROP_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); #if defined(DUK_USE_VERBOSE_ERRORS) case DUK_OP_GETPROPC_RR: case DUK_OP_GETPROPC_CR: case DUK_OP_GETPROPC_RC: case DUK_OP_GETPROPC_CC: DUK__GETPROPC_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); #endif case DUK_OP_PUTPROP_RR: case DUK_OP_PUTPROP_CR: case DUK_OP_PUTPROP_RC: case DUK_OP_PUTPROP_CC: DUK__PUTPROP_BODY(DUK__REGP_A(ins), DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); case DUK_OP_DELPROP_RR: case DUK_OP_DELPROP_RC: /* B is always reg */ DUK__DELPROP_BODY(DUK__REGP_B(ins), DUK__REGCONSTP_C(ins)); #else /* DUK_USE_EXEC_PREFER_SIZE */ case DUK_OP_GETPROP_RR: DUK__GETPROP_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); case DUK_OP_GETPROP_CR: DUK__GETPROP_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); case DUK_OP_GETPROP_RC: DUK__GETPROP_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); case DUK_OP_GETPROP_CC: DUK__GETPROP_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); #if defined(DUK_USE_VERBOSE_ERRORS) case DUK_OP_GETPROPC_RR: DUK__GETPROPC_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); case DUK_OP_GETPROPC_CR: DUK__GETPROPC_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); case DUK_OP_GETPROPC_RC: DUK__GETPROPC_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); case DUK_OP_GETPROPC_CC: DUK__GETPROPC_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); #endif case DUK_OP_PUTPROP_RR: DUK__PUTPROP_BODY(DUK__REGP_A(ins), DUK__REGP_B(ins), DUK__REGP_C(ins)); case DUK_OP_PUTPROP_CR: DUK__PUTPROP_BODY(DUK__REGP_A(ins), DUK__CONSTP_B(ins), DUK__REGP_C(ins)); case DUK_OP_PUTPROP_RC: DUK__PUTPROP_BODY(DUK__REGP_A(ins), DUK__REGP_B(ins), DUK__CONSTP_C(ins)); case DUK_OP_PUTPROP_CC: DUK__PUTPROP_BODY(DUK__REGP_A(ins), DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); case DUK_OP_DELPROP_RR: /* B is always reg */ DUK__DELPROP_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); case DUK_OP_DELPROP_RC: DUK__DELPROP_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); #endif /* DUK_USE_EXEC_PREFER_SIZE */ /* No fast path for DECLVAR now, it's quite a rare instruction. */ case DUK_OP_DECLVAR_RR: case DUK_OP_DECLVAR_CR: case DUK_OP_DECLVAR_RC: case DUK_OP_DECLVAR_CC: { duk_activation *act; duk_small_uint_fast_t a = DUK_DEC_A(ins); duk_tval *tv1; duk_hstring *name; duk_small_uint_t prop_flags; duk_bool_t is_func_decl; tv1 = DUK__REGCONSTP_B(ins); DUK_ASSERT(DUK_TVAL_IS_STRING(tv1)); name = DUK_TVAL_GET_STRING(tv1); DUK_ASSERT(name != NULL); is_func_decl = ((a & DUK_BC_DECLVAR_FLAG_FUNC_DECL) != 0); /* XXX: declvar takes an duk_tval pointer, which is awkward and * should be reworked. */ /* Compiler is responsible for selecting property flags (configurability, * writability, etc). */ prop_flags = a & DUK_PROPDESC_FLAGS_MASK; if (is_func_decl) { duk_push_tval(thr, DUK__REGCONSTP_C(ins)); } else { DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top)); /* valstack policy */ thr->valstack_top++; } tv1 = DUK_GET_TVAL_NEGIDX(thr, -1); act = thr->callstack_curr; if (duk_js_declvar_activation(thr, act, name, tv1, prop_flags, is_func_decl)) { if (is_func_decl) { /* Already declared, update value. */ tv1 = DUK_GET_TVAL_NEGIDX(thr, -1); duk_js_putvar_activation(thr, act, name, tv1, DUK__STRICT()); } else { /* Already declared but no initializer value * (e.g. 'var xyz;'), no-op. */ } } duk_pop_unsafe(thr); break; } #if defined(DUK_USE_REGEXP_SUPPORT) /* The compiler should never emit DUK_OP_REGEXP if there is no * regexp support. */ case DUK_OP_REGEXP_RR: case DUK_OP_REGEXP_CR: case DUK_OP_REGEXP_RC: case DUK_OP_REGEXP_CC: { /* A -> target register * B -> bytecode (also contains flags) * C -> escaped source */ duk_push_tval(thr, DUK__REGCONSTP_C(ins)); duk_push_tval(thr, DUK__REGCONSTP_B(ins)); /* -> [ ... escaped_source bytecode ] */ duk_regexp_create_instance(thr); /* -> [ ... regexp_instance ] */ DUK__REPLACE_TOP_A_BREAK(); } #endif /* DUK_USE_REGEXP_SUPPORT */ /* XXX: 'c' is unused, use whole BC, etc. */ case DUK_OP_CSVAR_RR: case DUK_OP_CSVAR_CR: case DUK_OP_CSVAR_RC: case DUK_OP_CSVAR_CC: { /* The speciality of calling through a variable binding is that the * 'this' value may be provided by the variable lookup: E5 Section 6.b.i. * * The only (standard) case where the 'this' binding is non-null is when * (1) the variable is found in an object environment record, and * (2) that object environment record is a 'with' block. */ duk_activation *act; duk_uint_fast_t idx; duk_tval *tv1; duk_hstring *name; /* A -> target registers (A, A + 1) for call setup * B -> identifier name, usually constant but can be a register due to shuffling */ tv1 = DUK__REGCONSTP_B(ins); DUK_ASSERT(DUK_TVAL_IS_STRING(tv1)); name = DUK_TVAL_GET_STRING(tv1); DUK_ASSERT(name != NULL); act = thr->callstack_curr; (void) duk_js_getvar_activation(thr, act, name, 1 /*throw*/); /* -> [... val this] */ idx = (duk_uint_fast_t) DUK_DEC_A(ins); /* Could add direct value stack handling. */ duk_replace(thr, (duk_idx_t) (idx + 1)); /* 'this' binding */ duk_replace(thr, (duk_idx_t) idx); /* variable value (function, we hope, not checked here) */ break; } case DUK_OP_CLOSURE: { duk_activation *act; duk_hcompfunc *fun_act; duk_small_uint_fast_t bc = DUK_DEC_BC(ins); duk_hobject *fun_temp; /* A -> target reg * BC -> inner function index */ DUK_DDD(DUK_DDDPRINT("CLOSURE to target register %ld, fnum %ld (count %ld)", (long) DUK_DEC_A(ins), (long) DUK_DEC_BC(ins), (long) DUK_HCOMPFUNC_GET_FUNCS_COUNT(thr->heap, DUK__FUN()))); DUK_ASSERT_DISABLE(bc >= 0); /* unsigned */ DUK_ASSERT((duk_uint_t) bc < (duk_uint_t) DUK_HCOMPFUNC_GET_FUNCS_COUNT(thr->heap, DUK__FUN())); act = thr->callstack_curr; fun_act = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act); fun_temp = DUK_HCOMPFUNC_GET_FUNCS_BASE(thr->heap, fun_act)[bc]; DUK_ASSERT(fun_temp != NULL); DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(fun_temp)); DUK_DDD(DUK_DDDPRINT("CLOSURE: function template is: %p -> %!O", (void *) fun_temp, (duk_heaphdr *) fun_temp)); if (act->lex_env == NULL) { DUK_ASSERT(act->var_env == NULL); duk_js_init_activation_environment_records_delayed(thr, act); act = thr->callstack_curr; } DUK_ASSERT(act->lex_env != NULL); DUK_ASSERT(act->var_env != NULL); /* functions always have a NEWENV flag, i.e. they get a * new variable declaration environment, so only lex_env * matters here. */ duk_js_push_closure(thr, (duk_hcompfunc *) fun_temp, act->var_env, act->lex_env, 1 /*add_auto_proto*/); DUK__REPLACE_TOP_A_BREAK(); } case DUK_OP_GETVAR: { duk_activation *act; duk_tval *tv1; duk_hstring *name; tv1 = DUK__CONSTP_BC(ins); DUK_ASSERT(DUK_TVAL_IS_STRING(tv1)); name = DUK_TVAL_GET_STRING(tv1); DUK_ASSERT(name != NULL); act = thr->callstack_curr; DUK_ASSERT(act != NULL); (void) duk_js_getvar_activation(thr, act, name, 1 /*throw*/); /* -> [... val this] */ duk_pop_unsafe(thr); /* 'this' binding is not needed here */ DUK__REPLACE_TOP_A_BREAK(); } case DUK_OP_PUTVAR: { duk_activation *act; duk_tval *tv1; duk_hstring *name; tv1 = DUK__CONSTP_BC(ins); DUK_ASSERT(DUK_TVAL_IS_STRING(tv1)); name = DUK_TVAL_GET_STRING(tv1); DUK_ASSERT(name != NULL); /* XXX: putvar takes a duk_tval pointer, which is awkward and * should be reworked. */ tv1 = DUK__REGP_A(ins); /* val */ act = thr->callstack_curr; duk_js_putvar_activation(thr, act, name, tv1, DUK__STRICT()); break; } case DUK_OP_DELVAR: { duk_activation *act; duk_tval *tv1; duk_hstring *name; duk_bool_t rc; tv1 = DUK__CONSTP_BC(ins); DUK_ASSERT(DUK_TVAL_IS_STRING(tv1)); name = DUK_TVAL_GET_STRING(tv1); DUK_ASSERT(name != NULL); act = thr->callstack_curr; rc = duk_js_delvar_activation(thr, act, name); DUK__REPLACE_BOOL_A_BREAK(rc); } case DUK_OP_JUMP: { /* Note: without explicit cast to signed, MSVC will * apparently generate a large positive jump when the * bias-corrected value would normally be negative. */ curr_pc += (duk_int_fast_t) DUK_DEC_ABC(ins) - (duk_int_fast_t) DUK_BC_JUMP_BIAS; break; } #define DUK__RETURN_SHARED() do { \ duk_small_uint_t ret_result; \ /* duk__handle_return() is guaranteed never to throw, except \ * for potential out-of-memory situations which will then \ * propagate out of the executor longjmp handler. \ */ \ DUK_ASSERT(thr->ptr_curr_pc == NULL); \ ret_result = duk__handle_return(thr, entry_act); \ if (ret_result == DUK__RETHAND_RESTART) { \ goto restart_execution; \ } \ DUK_ASSERT(ret_result == DUK__RETHAND_FINISHED); \ return; \ } while (0) #if defined(DUK_USE_EXEC_PREFER_SIZE) case DUK_OP_RETREG: case DUK_OP_RETCONST: case DUK_OP_RETCONSTN: case DUK_OP_RETUNDEF: { /* BC -> return value reg/const */ DUK__SYNC_AND_NULL_CURR_PC(); if (op == DUK_OP_RETREG) { duk_push_tval(thr, DUK__REGP_BC(ins)); } else if (op == DUK_OP_RETUNDEF) { DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top)); /* valstack policy */ thr->valstack_top++; } else { DUK_ASSERT(op == DUK_OP_RETCONST || op == DUK_OP_RETCONSTN); duk_push_tval(thr, DUK__CONSTP_BC(ins)); } DUK__RETURN_SHARED(); } #else /* DUK_USE_EXEC_PREFER_SIZE */ case DUK_OP_RETREG: { duk_tval *tv; DUK__SYNC_AND_NULL_CURR_PC(); tv = DUK__REGP_BC(ins); DUK_TVAL_SET_TVAL(thr->valstack_top, tv); DUK_TVAL_INCREF(thr, tv); thr->valstack_top++; DUK__RETURN_SHARED(); } /* This will be unused without refcounting. */ case DUK_OP_RETCONST: { duk_tval *tv; DUK__SYNC_AND_NULL_CURR_PC(); tv = DUK__CONSTP_BC(ins); DUK_TVAL_SET_TVAL(thr->valstack_top, tv); DUK_TVAL_INCREF(thr, tv); thr->valstack_top++; DUK__RETURN_SHARED(); } case DUK_OP_RETCONSTN: { duk_tval *tv; DUK__SYNC_AND_NULL_CURR_PC(); tv = DUK__CONSTP_BC(ins); DUK_TVAL_SET_TVAL(thr->valstack_top, tv); #if defined(DUK_USE_REFERENCE_COUNTING) /* Without refcounting only RETCONSTN is used. */ DUK_ASSERT(!DUK_TVAL_IS_HEAP_ALLOCATED(tv)); /* no INCREF for this constant */ #endif thr->valstack_top++; DUK__RETURN_SHARED(); } case DUK_OP_RETUNDEF: { DUK__SYNC_AND_NULL_CURR_PC(); thr->valstack_top++; /* value at valstack top is already undefined by valstack policy */ DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top)); DUK__RETURN_SHARED(); } #endif /* DUK_USE_EXEC_PREFER_SIZE */ case DUK_OP_LABEL: { duk_activation *act; duk_catcher *cat; duk_small_uint_fast_t bc = DUK_DEC_BC(ins); /* Allocate catcher and populate it (must be atomic). */ cat = duk_hthread_catcher_alloc(thr); DUK_ASSERT(cat != NULL); cat->flags = (duk_uint32_t) (DUK_CAT_TYPE_LABEL | (bc << DUK_CAT_LABEL_SHIFT)); cat->pc_base = (duk_instr_t *) curr_pc; /* pre-incremented, points to first jump slot */ cat->idx_base = 0; /* unused for label */ cat->h_varname = NULL; act = thr->callstack_curr; DUK_ASSERT(act != NULL); cat->parent = act->cat; act->cat = cat; DUK_DDD(DUK_DDDPRINT("LABEL catcher: flags=0x%08lx, pc_base=%ld, " "idx_base=%ld, h_varname=%!O, label_id=%ld", (long) cat->flags, (long) cat->pc_base, (long) cat->idx_base, (duk_heaphdr *) cat->h_varname, (long) DUK_CAT_GET_LABEL(cat))); curr_pc += 2; /* skip jump slots */ break; } case DUK_OP_ENDLABEL: { duk_activation *act; #if (defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)) || defined(DUK_USE_ASSERTIONS) duk_small_uint_fast_t bc = DUK_DEC_BC(ins); #endif #if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) DUK_DDD(DUK_DDDPRINT("ENDLABEL %ld", (long) bc)); #endif act = thr->callstack_curr; DUK_ASSERT(act->cat != NULL); DUK_ASSERT(DUK_CAT_GET_TYPE(act->cat) == DUK_CAT_TYPE_LABEL); DUK_ASSERT((duk_uint_fast_t) DUK_CAT_GET_LABEL(act->cat) == bc); duk_hthread_catcher_unwind_nolexenv_norz(thr, act); /* no need to unwind callstack */ break; } case DUK_OP_BREAK: { duk_small_uint_fast_t bc = DUK_DEC_BC(ins); DUK__SYNC_AND_NULL_CURR_PC(); duk__handle_break_or_continue(thr, (duk_uint_t) bc, DUK_LJ_TYPE_BREAK); goto restart_execution; } case DUK_OP_CONTINUE: { duk_small_uint_fast_t bc = DUK_DEC_BC(ins); DUK__SYNC_AND_NULL_CURR_PC(); duk__handle_break_or_continue(thr, (duk_uint_t) bc, DUK_LJ_TYPE_CONTINUE); goto restart_execution; } /* XXX: move to helper, too large to be inline here */ case DUK_OP_TRYCATCH: { duk__handle_op_trycatch(thr, ins, curr_pc); curr_pc += 2; /* skip jump slots */ break; } case DUK_OP_ENDTRY: { curr_pc = duk__handle_op_endtry(thr, ins); break; } case DUK_OP_ENDCATCH: { duk__handle_op_endcatch(thr, ins); break; } case DUK_OP_ENDFIN: { /* Sync and NULL early. */ DUK__SYNC_AND_NULL_CURR_PC(); if (duk__handle_op_endfin(thr, ins, entry_act) != 0) { return; } /* Must restart because we NULLed out curr_pc. */ goto restart_execution; } case DUK_OP_THROW: { duk_small_uint_fast_t bc = DUK_DEC_BC(ins); /* Note: errors are augmented when they are created, not * when they are thrown. So, don't augment here, it would * break re-throwing for instance. */ /* Sync so that augmentation sees up-to-date activations, NULL * thr->ptr_curr_pc so that it's not used if side effects occur * in augmentation or longjmp handling. */ DUK__SYNC_AND_NULL_CURR_PC(); duk_dup(thr, (duk_idx_t) bc); DUK_DDD(DUK_DDDPRINT("THROW ERROR (BYTECODE): %!dT (before throw augment)", (duk_tval *) duk_get_tval(thr, -1))); #if defined(DUK_USE_AUGMENT_ERROR_THROW) duk_err_augment_error_throw(thr); DUK_DDD(DUK_DDDPRINT("THROW ERROR (BYTECODE): %!dT (after throw augment)", (duk_tval *) duk_get_tval(thr, -1))); #endif duk_err_setup_ljstate1(thr, DUK_LJ_TYPE_THROW, DUK_GET_TVAL_NEGIDX(thr, -1)); #if defined(DUK_USE_DEBUGGER_SUPPORT) duk_err_check_debugger_integration(thr); #endif DUK_ASSERT(thr->heap->lj.jmpbuf_ptr != NULL); /* always in executor */ duk_err_longjmp(thr); DUK_UNREACHABLE(); break; } case DUK_OP_CSREG: { /* * Assuming a register binds to a variable declared within this * function (a declarative binding), the 'this' for the call * setup is always 'undefined'. E5 Section 10.2.1.1.6. */ duk_small_uint_fast_t a = DUK_DEC_A(ins); duk_small_uint_fast_t bc = DUK_DEC_BC(ins); /* A -> register containing target function (not type checked here) * BC -> target registers (BC, BC + 1) for call setup */ #if defined(DUK_USE_PREFER_SIZE) duk_dup(thr, (duk_idx_t) a); duk_replace(thr, (duk_idx_t) bc); duk_to_undefined(thr, (duk_idx_t) (bc + 1)); #else duk_tval *tv1; duk_tval *tv2; duk_tval *tv3; duk_tval tv_tmp1; duk_tval tv_tmp2; tv1 = DUK__REGP(bc); tv2 = tv1 + 1; DUK_TVAL_SET_TVAL(&tv_tmp1, tv1); DUK_TVAL_SET_TVAL(&tv_tmp2, tv2); tv3 = DUK__REGP(a); DUK_TVAL_SET_TVAL(tv1, tv3); DUK_TVAL_INCREF(thr, tv1); /* no side effects */ DUK_TVAL_SET_UNDEFINED(tv2); /* no need for incref */ DUK_TVAL_DECREF(thr, &tv_tmp1); DUK_TVAL_DECREF(thr, &tv_tmp2); #endif break; } /* XXX: in some cases it's faster NOT to reuse the value * stack but rather copy the arguments on top of the stack * (mainly when the calling value stack is large and the value * stack resize would be large). */ case DUK_OP_CALL0: case DUK_OP_CALL1: case DUK_OP_CALL2: case DUK_OP_CALL3: case DUK_OP_CALL4: case DUK_OP_CALL5: case DUK_OP_CALL6: case DUK_OP_CALL7: { /* Opcode packs 4 flag bits: 1 for indirect, 3 map * 1:1 to three lowest call handling flags. * * A -> nargs or register with nargs (indirect) * BC -> base register for call (base -> func, base+1 -> this, base+2 -> arg1 ... base+2+N-1 -> argN) */ duk_idx_t nargs; duk_idx_t idx; duk_small_uint_t call_flags; #if !defined(DUK_USE_EXEC_FUN_LOCAL) duk_hcompfunc *fun; #endif DUK_ASSERT((DUK_OP_CALL0 & 0x0fU) == 0); DUK_ASSERT((ins & DUK_BC_CALL_FLAG_INDIRECT) == 0); nargs = (duk_idx_t) DUK_DEC_A(ins); call_flags = (ins & 0x07U) | DUK_CALL_FLAG_ALLOW_ECMATOECMA; idx = (duk_idx_t) DUK_DEC_BC(ins); if (duk__executor_handle_call(thr, idx, nargs, call_flags)) { /* curr_pc synced by duk_handle_call_unprotected() */ DUK_ASSERT(thr->ptr_curr_pc == NULL); goto restart_execution; } DUK_ASSERT(thr->ptr_curr_pc != NULL); /* duk_js_call.c is required to restore the stack reserve * so we only need to reset the top. */ #if !defined(DUK_USE_EXEC_FUN_LOCAL) fun = DUK__FUN(); #endif duk_set_top_unsafe(thr, (duk_idx_t) fun->nregs); /* No need to reinit setjmp() catchpoint, as call handling * will store and restore our state. * * When debugger is enabled, we need to recheck the activation * status after returning. This is now handled by call handling * and heap->dbg_force_restart. */ break; } case DUK_OP_CALL8: case DUK_OP_CALL9: case DUK_OP_CALL10: case DUK_OP_CALL11: case DUK_OP_CALL12: case DUK_OP_CALL13: case DUK_OP_CALL14: case DUK_OP_CALL15: { /* Indirect variant. */ duk_uint_fast_t nargs; duk_idx_t idx; duk_small_uint_t call_flags; #if !defined(DUK_USE_EXEC_FUN_LOCAL) duk_hcompfunc *fun; #endif DUK_ASSERT((DUK_OP_CALL0 & 0x0fU) == 0); DUK_ASSERT((ins & DUK_BC_CALL_FLAG_INDIRECT) != 0); nargs = (duk_uint_fast_t) DUK_DEC_A(ins); DUK__LOOKUP_INDIRECT(nargs); call_flags = (ins & 0x07U) | DUK_CALL_FLAG_ALLOW_ECMATOECMA; idx = (duk_idx_t) DUK_DEC_BC(ins); if (duk__executor_handle_call(thr, idx, (duk_idx_t) nargs, call_flags)) { DUK_ASSERT(thr->ptr_curr_pc == NULL); goto restart_execution; } DUK_ASSERT(thr->ptr_curr_pc != NULL); #if !defined(DUK_USE_EXEC_FUN_LOCAL) fun = DUK__FUN(); #endif duk_set_top_unsafe(thr, (duk_idx_t) fun->nregs); break; } case DUK_OP_NEWOBJ: { duk_push_object(thr); #if defined(DUK_USE_ASSERTIONS) { duk_hobject *h; h = duk_require_hobject(thr, -1); DUK_ASSERT(DUK_HOBJECT_GET_ESIZE(h) == 0); DUK_ASSERT(DUK_HOBJECT_GET_ENEXT(h) == 0); DUK_ASSERT(DUK_HOBJECT_GET_ASIZE(h) == 0); DUK_ASSERT(DUK_HOBJECT_GET_HSIZE(h) == 0); } #endif #if !defined(DUK_USE_PREFER_SIZE) /* XXX: could do a direct props realloc, but need hash size */ duk_hobject_resize_entrypart(thr, duk_known_hobject(thr, -1), DUK_DEC_A(ins)); #endif DUK__REPLACE_TOP_BC_BREAK(); } case DUK_OP_NEWARR: { duk_push_array(thr); #if defined(DUK_USE_ASSERTIONS) { duk_hobject *h; h = duk_require_hobject(thr, -1); DUK_ASSERT(DUK_HOBJECT_GET_ESIZE(h) == 0); DUK_ASSERT(DUK_HOBJECT_GET_ENEXT(h) == 0); DUK_ASSERT(DUK_HOBJECT_GET_ASIZE(h) == 0); DUK_ASSERT(DUK_HOBJECT_GET_HSIZE(h) == 0); DUK_ASSERT(DUK_HOBJECT_HAS_ARRAY_PART(h)); } #endif #if !defined(DUK_USE_PREFER_SIZE) duk_hobject_realloc_props(thr, duk_known_hobject(thr, -1), 0 /*new_e_size*/, DUK_DEC_A(ins) /*new_a_size*/, 0 /*new_h_size*/, 0 /*abandon_array*/); #if 0 duk_hobject_resize_arraypart(thr, duk_known_hobject(thr, -1), DUK_DEC_A(ins)); #endif #endif DUK__REPLACE_TOP_BC_BREAK(); } case DUK_OP_MPUTOBJ: case DUK_OP_MPUTOBJI: { duk_idx_t obj_idx; duk_uint_fast_t idx, idx_end; duk_small_uint_fast_t count; /* A -> register of target object * B -> first register of key/value pair list * or register containing first register number if indirect * C -> number of key/value pairs * 2 * (= number of value stack indices used starting from 'B') */ obj_idx = DUK_DEC_A(ins); DUK_ASSERT(duk_is_object(thr, obj_idx)); idx = (duk_uint_fast_t) DUK_DEC_B(ins); if (DUK_DEC_OP(ins) == DUK_OP_MPUTOBJI) { DUK__LOOKUP_INDIRECT(idx); } count = (duk_small_uint_fast_t) DUK_DEC_C(ins); DUK_ASSERT(count > 0); /* compiler guarantees */ idx_end = idx + count; #if defined(DUK_USE_EXEC_INDIRECT_BOUND_CHECK) if (DUK_UNLIKELY(idx_end > (duk_uint_fast_t) duk_get_top(thr))) { /* XXX: use duk_is_valid_index() instead? */ /* XXX: improve check; check against nregs, not against top */ DUK__INTERNAL_ERROR("MPUTOBJ out of bounds"); } #endif /* Use 'force' flag to duk_def_prop() to ensure that any * inherited properties don't prevent the operation. * With ES2015 duplicate properties are allowed, so that we * must overwrite any previous data or accessor property. * * With ES2015 computed property names the literal keys * may be arbitrary values and need to be ToPropertyKey() * coerced at runtime. */ do { /* XXX: faster initialization (direct access or better primitives) */ duk_dup(thr, (duk_idx_t) idx); duk_dup(thr, (duk_idx_t) (idx + 1)); duk_def_prop(thr, obj_idx, DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_FORCE | DUK_DEFPROP_SET_WRITABLE | DUK_DEFPROP_SET_ENUMERABLE | DUK_DEFPROP_SET_CONFIGURABLE); idx += 2; } while (idx < idx_end); break; } case DUK_OP_INITSET: case DUK_OP_INITGET: { duk__handle_op_initset_initget(thr, ins); break; } case DUK_OP_MPUTARR: case DUK_OP_MPUTARRI: { duk_idx_t obj_idx; duk_uint_fast_t idx, idx_end; duk_small_uint_fast_t count; duk_tval *tv1; duk_uint32_t arr_idx; /* A -> register of target object * B -> first register of value data (start_index, value1, value2, ..., valueN) * or register containing first register number if indirect * C -> number of key/value pairs (N) */ obj_idx = DUK_DEC_A(ins); DUK_ASSERT(duk_is_object(thr, obj_idx)); idx = (duk_uint_fast_t) DUK_DEC_B(ins); if (DUK_DEC_OP(ins) == DUK_OP_MPUTARRI) { DUK__LOOKUP_INDIRECT(idx); } count = (duk_small_uint_fast_t) DUK_DEC_C(ins); DUK_ASSERT(count > 0 + 1); /* compiler guarantees */ idx_end = idx + count; #if defined(DUK_USE_EXEC_INDIRECT_BOUND_CHECK) if (idx_end > (duk_uint_fast_t) duk_get_top(thr)) { /* XXX: use duk_is_valid_index() instead? */ /* XXX: improve check; check against nregs, not against top */ DUK__INTERNAL_ERROR("MPUTARR out of bounds"); } #endif tv1 = DUK__REGP(idx); DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1)); #if defined(DUK_USE_FASTINT) DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv1)); arr_idx = (duk_uint32_t) DUK_TVAL_GET_FASTINT_U32(tv1); #else arr_idx = (duk_uint32_t) DUK_TVAL_GET_NUMBER(tv1); #endif idx++; do { /* duk_xdef_prop() will define an own property without any array * special behaviors. We'll need to set the array length explicitly * in the end. For arrays with elisions, the compiler will emit an * explicit SETALEN which will update the length. */ /* XXX: because we're dealing with 'own' properties of a fresh array, * the array initializer should just ensure that the array has a large * enough array part and write the values directly into array part, * and finally set 'length' manually in the end (as already happens now). */ duk_dup(thr, (duk_idx_t) idx); duk_xdef_prop_index_wec(thr, obj_idx, arr_idx); idx++; arr_idx++; } while (idx < idx_end); /* XXX: E5.1 Section 11.1.4 coerces the final length through * ToUint32() which is odd but happens now as a side effect of * 'arr_idx' type. */ duk_set_length(thr, obj_idx, (duk_size_t) (duk_uarridx_t) arr_idx); break; } case DUK_OP_SETALEN: { duk_tval *tv1; duk_hobject *h; duk_uint32_t len; tv1 = DUK__REGP_A(ins); DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv1)); h = DUK_TVAL_GET_OBJECT(tv1); DUK_ASSERT(DUK_HOBJECT_IS_ARRAY(h)); tv1 = DUK__REGP_BC(ins); DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1)); #if defined(DUK_USE_FASTINT) DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv1)); len = (duk_uint32_t) DUK_TVAL_GET_FASTINT_U32(tv1); #else len = (duk_uint32_t) DUK_TVAL_GET_NUMBER(tv1); #endif ((duk_harray *) h)->length = len; break; } case DUK_OP_INITENUM: { duk__handle_op_initenum(thr, ins); break; } case DUK_OP_NEXTENUM: { curr_pc += duk__handle_op_nextenum(thr, ins); break; } case DUK_OP_INVLHS: { DUK_ERROR_REFERENCE(thr, DUK_STR_INVALID_LVALUE); DUK_UNREACHABLE(); break; } case DUK_OP_DEBUGGER: { /* Opcode only emitted by compiler when debugger * support is enabled. Ignore it silently without * debugger support, in case it has been loaded * from precompiled bytecode. */ #if defined(DUK_USE_DEBUGGER_SUPPORT) if (duk_debug_is_attached(thr->heap)) { DUK_D(DUK_DPRINT("DEBUGGER statement encountered, halt execution")); DUK__SYNC_AND_NULL_CURR_PC(); duk_debug_halt_execution(thr, 1 /*use_prev_pc*/); DUK_D(DUK_DPRINT("DEBUGGER statement finished, resume execution")); goto restart_execution; } else { DUK_D(DUK_DPRINT("DEBUGGER statement ignored, debugger not attached")); } #else DUK_D(DUK_DPRINT("DEBUGGER statement ignored, no debugger support")); #endif break; } case DUK_OP_NOP: { /* Nop, ignored, but ABC fields may carry a value e.g. * for indirect opcode handling. */ break; } case DUK_OP_INVALID: { DUK_ERROR_FMT1(thr, DUK_ERR_ERROR, "INVALID opcode (%ld)", (long) DUK_DEC_ABC(ins)); break; } #if defined(DUK_USE_ES6) case DUK_OP_NEWTARGET: { /* https://www.ecma-international.org/ecma-262/6.0/#sec-meta-properties-runtime-semantics-evaluation * https://www.ecma-international.org/ecma-262/6.0/#sec-getnewtarget * * No newTarget support now, so as a first approximation * use the resolved (non-bound) target function. */ /* XXX: C API: push_new_target()? */ duk_activation *act; act = thr->callstack_curr; DUK_ASSERT(act != NULL); /* Check CONSTRUCT flag from current function, or if running * direct eval, from a non-direct-eval parent (with possibly * more than one nested direct eval). An alternative to this * would be to store [[NewTarget]] as a hidden symbol of the * lexical scope, and then just look up that variable. */ for (;;) { if (act == NULL) { duk_push_undefined(thr); break; } if (act->flags & DUK_ACT_FLAG_CONSTRUCT) { duk_push_tval(thr, &act->tv_func); break; } else if (act->flags & DUK_ACT_FLAG_DIRECT_EVAL) { act = act->parent; } else { duk_push_undefined(thr); break; } } DUK__REPLACE_TOP_BC_BREAK(); } #endif /* DUK_USE_ES6 */ #if !defined(DUK_USE_EXEC_PREFER_SIZE) #if !defined(DUK_USE_ES7_EXP_OPERATOR) case DUK_OP_EXP_RR: case DUK_OP_EXP_CR: case DUK_OP_EXP_RC: case DUK_OP_EXP_CC: #endif #if !defined(DUK_USE_ES6) case DUK_OP_NEWTARGET: #endif #if !defined(DUK_USE_VERBOSE_ERRORS) case DUK_OP_GETPROPC_RR: case DUK_OP_GETPROPC_CR: case DUK_OP_GETPROPC_RC: case DUK_OP_GETPROPC_CC: #endif case DUK_OP_UNUSED207: case DUK_OP_UNUSED212: case DUK_OP_UNUSED213: case DUK_OP_UNUSED214: case DUK_OP_UNUSED215: case DUK_OP_UNUSED216: case DUK_OP_UNUSED217: case DUK_OP_UNUSED218: case DUK_OP_UNUSED219: case DUK_OP_UNUSED220: case DUK_OP_UNUSED221: case DUK_OP_UNUSED222: case DUK_OP_UNUSED223: case DUK_OP_UNUSED224: case DUK_OP_UNUSED225: case DUK_OP_UNUSED226: case DUK_OP_UNUSED227: case DUK_OP_UNUSED228: case DUK_OP_UNUSED229: case DUK_OP_UNUSED230: case DUK_OP_UNUSED231: case DUK_OP_UNUSED232: case DUK_OP_UNUSED233: case DUK_OP_UNUSED234: case DUK_OP_UNUSED235: case DUK_OP_UNUSED236: case DUK_OP_UNUSED237: case DUK_OP_UNUSED238: case DUK_OP_UNUSED239: case DUK_OP_UNUSED240: case DUK_OP_UNUSED241: case DUK_OP_UNUSED242: case DUK_OP_UNUSED243: case DUK_OP_UNUSED244: case DUK_OP_UNUSED245: case DUK_OP_UNUSED246: case DUK_OP_UNUSED247: case DUK_OP_UNUSED248: case DUK_OP_UNUSED249: case DUK_OP_UNUSED250: case DUK_OP_UNUSED251: case DUK_OP_UNUSED252: case DUK_OP_UNUSED253: case DUK_OP_UNUSED254: case DUK_OP_UNUSED255: /* Force all case clauses to map to an actual handler * so that the compiler can emit a jump without a bounds * check: the switch argument is a duk_uint8_t so that * the compiler may be able to figure it out. This is * a small detail and obviously compiler dependent. */ /* default: clause omitted on purpose */ #else /* DUK_USE_EXEC_PREFER_SIZE */ default: #endif /* DUK_USE_EXEC_PREFER_SIZE */ { /* Default case catches invalid/unsupported opcodes. */ DUK_D(DUK_DPRINT("invalid opcode: %ld - %!I", (long) op, ins)); DUK__INTERNAL_ERROR("invalid opcode"); break; } } /* end switch */ continue; /* Some shared exit paths for opcode handling below. These * are mostly useful to reduce code footprint when multiple * opcodes have a similar epilogue (like replacing stack top * with index 'a'). */ #if defined(DUK_USE_EXEC_PREFER_SIZE) replace_top_a: DUK__REPLACE_TO_TVPTR(thr, DUK__REGP_A(ins)); continue; replace_top_bc: DUK__REPLACE_TO_TVPTR(thr, DUK__REGP_BC(ins)); continue; #endif } DUK_UNREACHABLE(); #if !defined(DUK_USE_VERBOSE_EXECUTOR_ERRORS) internal_error: DUK_ERROR_INTERNAL(thr); #endif } /* automatic undefs */ #undef DUK__BYTEOFF_A #undef DUK__BYTEOFF_B #undef DUK__BYTEOFF_BC #undef DUK__BYTEOFF_C #undef DUK__COMPARE_BODY #undef DUK__CONST #undef DUK__CONSTP #undef DUK__CONSTP_A #undef DUK__CONSTP_B #undef DUK__CONSTP_BC #undef DUK__CONSTP_C #undef DUK__DELPROP_BODY #undef DUK__EQ_BODY #undef DUK__FUN #undef DUK__GETPROPC_BODY #undef DUK__GETPROP_BODY #undef DUK__GE_BODY #undef DUK__GT_BODY #undef DUK__INLINE_PERF #undef DUK__INSTOF_BODY #undef DUK__INTERNAL_ERROR #undef DUK__INT_NOACTION #undef DUK__INT_RESTART #undef DUK__IN_BODY #undef DUK__LE_BODY #undef DUK__LONGJMP_RESTART #undef DUK__LONGJMP_RETHROW #undef DUK__LOOKUP_INDIRECT #undef DUK__LT_BODY #undef DUK__MASK_A #undef DUK__MASK_B #undef DUK__MASK_BC #undef DUK__MASK_C #undef DUK__NEQ_BODY #undef DUK__NOINLINE_PERF #undef DUK__PUTPROP_BODY #undef DUK__RCBIT_B #undef DUK__RCBIT_C #undef DUK__REG #undef DUK__REGCONSTP_B #undef DUK__REGCONSTP_C #undef DUK__REGP #undef DUK__REGP_A #undef DUK__REGP_B #undef DUK__REGP_BC #undef DUK__REGP_C #undef DUK__REPLACE_BOOL_A_BREAK #undef DUK__REPLACE_TOP_A_BREAK #undef DUK__REPLACE_TOP_BC_BREAK #undef DUK__REPLACE_TO_TVPTR #undef DUK__RETHAND_FINISHED #undef DUK__RETHAND_RESTART #undef DUK__RETURN_SHARED #undef DUK__SEQ_BODY #undef DUK__SHIFT_A #undef DUK__SHIFT_B #undef DUK__SHIFT_BC #undef DUK__SHIFT_C #undef DUK__SNEQ_BODY #undef DUK__STRICT #undef DUK__SYNC_AND_NULL_CURR_PC #undef DUK__SYNC_CURR_PC #undef DUK__TVAL_SHIFT #line 1 "duk_js_ops.c" /* * Ecmascript specification algorithm and conversion helpers. * * These helpers encapsulate the primitive Ecmascript operation semantics, * and are used by the bytecode executor and the API (among other places). * Some primitives are only implemented as part of the API and have no * "internal" helper. This is the case when an internal helper would not * really be useful; e.g. the operation is rare, uses value stack heavily, * etc. * * The operation arguments depend on what is required to implement * the operation: * * - If an operation is simple and stateless, and has no side * effects, it won't take an duk_hthread argument and its * arguments may be duk_tval pointers (which are safe as long * as no side effects take place). * * - If complex coercions are required (e.g. a "ToNumber" coercion) * or errors may be thrown, the operation takes an duk_hthread * argument. This also implies that the operation may have * arbitrary side effects, invalidating any duk_tval pointers. * * - For operations with potential side effects, arguments can be * taken in several ways: * * a) as duk_tval pointers, which makes sense if the "common case" * can be resolved without side effects (e.g. coercion); the * arguments are pushed to the valstack for coercion if * necessary * * b) as duk_tval values * * c) implicitly on value stack top * * d) as indices to the value stack * * Future work: * * - Argument styles may not be the most sensible in every case now. * * - In-place coercions might be useful for several operations, if * in-place coercion is OK for the bytecode executor and the API. */ /* #include duk_internal.h -> already included */ /* * ToPrimitive() (E5 Section 9.1) * * ==> implemented in the API. */ /* * ToBoolean() (E5 Section 9.2) */ DUK_INTERNAL duk_bool_t duk_js_toboolean(duk_tval *tv) { switch (DUK_TVAL_GET_TAG(tv)) { case DUK_TAG_UNDEFINED: case DUK_TAG_NULL: return 0; case DUK_TAG_BOOLEAN: DUK_ASSERT(DUK_TVAL_GET_BOOLEAN(tv) == 0 || DUK_TVAL_GET_BOOLEAN(tv) == 1); return DUK_TVAL_GET_BOOLEAN(tv); case DUK_TAG_STRING: { /* Symbols ToBoolean() coerce to true, regardless of their * description. This happens with no explicit check because * of the symbol representation byte prefix. */ duk_hstring *h = DUK_TVAL_GET_STRING(tv); DUK_ASSERT(h != NULL); return (DUK_HSTRING_GET_BYTELEN(h) > 0 ? 1 : 0); } case DUK_TAG_OBJECT: { return 1; } case DUK_TAG_BUFFER: { /* Mimic Uint8Array semantics: objects coerce true, regardless * of buffer length (zero or not) or context. */ return 1; } case DUK_TAG_POINTER: { void *p = DUK_TVAL_GET_POINTER(tv); return (p != NULL ? 1 : 0); } case DUK_TAG_LIGHTFUNC: { return 1; } #if defined(DUK_USE_FASTINT) case DUK_TAG_FASTINT: if (DUK_TVAL_GET_FASTINT(tv) != 0) { return 1; } else { return 0; } #endif default: { /* number */ duk_double_t d; #if defined(DUK_USE_PREFER_SIZE) int c; #endif DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv)); DUK_ASSERT(DUK_TVAL_IS_DOUBLE(tv)); d = DUK_TVAL_GET_DOUBLE(tv); #if defined(DUK_USE_PREFER_SIZE) c = DUK_FPCLASSIFY((double) d); if (c == DUK_FP_ZERO || c == DUK_FP_NAN) { return 0; } else { return 1; } #else DUK_ASSERT(duk_double_is_nan_or_zero(d) == 0 || duk_double_is_nan_or_zero(d) == 1); return duk_double_is_nan_or_zero(d) ^ 1; #endif } } DUK_UNREACHABLE(); } /* * ToNumber() (E5 Section 9.3) * * Value to convert must be on stack top, and is popped before exit. * * See: http://www.cs.indiana.edu/~burger/FP-Printing-PLDI96.pdf * http://www.cs.indiana.edu/~burger/fp/index.html * * Notes on the conversion: * * - There are specific requirements on the accuracy of the conversion * through a "Mathematical Value" (MV), so this conversion is not * trivial. * * - Quick rejects (e.g. based on first char) are difficult because * the grammar allows leading and trailing white space. * * - Quick reject based on string length is difficult even after * accounting for white space; there may be arbitrarily many * decimal digits. * * - Standard grammar allows decimal values ("123"), hex values * ("0x123") and infinities * * - Unlike source code literals, ToNumber() coerces empty strings * and strings with only whitespace to zero (not NaN). */ /* E5 Section 9.3.1 */ DUK_LOCAL duk_double_t duk__tonumber_string_raw(duk_hthread *thr) { duk_small_uint_t s2n_flags; duk_double_t d; DUK_ASSERT(duk_is_string(thr, -1)); /* Quite lenient, e.g. allow empty as zero, but don't allow trailing * garbage. */ s2n_flags = DUK_S2N_FLAG_TRIM_WHITE | DUK_S2N_FLAG_ALLOW_EXP | DUK_S2N_FLAG_ALLOW_PLUS | DUK_S2N_FLAG_ALLOW_MINUS | DUK_S2N_FLAG_ALLOW_INF | DUK_S2N_FLAG_ALLOW_FRAC | DUK_S2N_FLAG_ALLOW_NAKED_FRAC | DUK_S2N_FLAG_ALLOW_EMPTY_FRAC | DUK_S2N_FLAG_ALLOW_EMPTY_AS_ZERO | DUK_S2N_FLAG_ALLOW_LEADING_ZERO | DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT | DUK_S2N_FLAG_ALLOW_AUTO_OCT_INT | DUK_S2N_FLAG_ALLOW_AUTO_BIN_INT; duk_numconv_parse(thr, 10 /*radix*/, s2n_flags); #if defined(DUK_USE_PREFER_SIZE) d = duk_get_number(thr, -1); duk_pop_unsafe(thr); #else thr->valstack_top--; DUK_ASSERT(DUK_TVAL_IS_NUMBER(thr->valstack_top)); DUK_ASSERT(DUK_TVAL_IS_DOUBLE(thr->valstack_top)); /* no fastint conversion in numconv now */ DUK_ASSERT(!DUK_TVAL_NEEDS_REFCOUNT_UPDATE(thr->valstack_top)); d = DUK_TVAL_GET_DOUBLE(thr->valstack_top); /* assumes not a fastint */ DUK_TVAL_SET_UNDEFINED(thr->valstack_top); #endif return d; } DUK_INTERNAL duk_double_t duk_js_tonumber(duk_hthread *thr, duk_tval *tv) { DUK_ASSERT(thr != NULL); DUK_ASSERT(tv != NULL); switch (DUK_TVAL_GET_TAG(tv)) { case DUK_TAG_UNDEFINED: { /* return a specific NaN (although not strictly necessary) */ duk_double_union du; DUK_DBLUNION_SET_NAN(&du); DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du)); return du.d; } case DUK_TAG_NULL: { /* +0.0 */ return 0.0; } case DUK_TAG_BOOLEAN: { if (DUK_TVAL_IS_BOOLEAN_TRUE(tv)) { return 1.0; } return 0.0; } case DUK_TAG_STRING: { /* For Symbols ToNumber() is always a TypeError. */ duk_hstring *h = DUK_TVAL_GET_STRING(tv); if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) { DUK_ERROR_TYPE(thr, DUK_STR_CANNOT_NUMBER_COERCE_SYMBOL); } duk_push_hstring(thr, h); return duk__tonumber_string_raw(thr); } case DUK_TAG_BUFFER: /* plain buffer treated like object */ case DUK_TAG_OBJECT: { duk_double_t d; duk_push_tval(thr, tv); duk_to_primitive(thr, -1, DUK_HINT_NUMBER); /* 'tv' becomes invalid */ /* recursive call for a primitive value (guaranteed not to cause second * recursion). */ DUK_ASSERT(duk_get_tval(thr, -1) != NULL); d = duk_js_tonumber(thr, duk_get_tval(thr, -1)); duk_pop_unsafe(thr); return d; } case DUK_TAG_POINTER: { /* Coerce like boolean */ void *p = DUK_TVAL_GET_POINTER(tv); return (p != NULL ? 1.0 : 0.0); } case DUK_TAG_LIGHTFUNC: { /* +(function(){}) -> NaN */ return DUK_DOUBLE_NAN; } #if defined(DUK_USE_FASTINT) case DUK_TAG_FASTINT: return (duk_double_t) DUK_TVAL_GET_FASTINT(tv); #endif default: { /* number */ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv)); DUK_ASSERT(DUK_TVAL_IS_DOUBLE(tv)); return DUK_TVAL_GET_DOUBLE(tv); } } DUK_UNREACHABLE(); } /* * ToInteger() (E5 Section 9.4) */ /* exposed, used by e.g. duk_bi_date.c */ DUK_INTERNAL duk_double_t duk_js_tointeger_number(duk_double_t x) { #if defined(DUK_USE_PREFER_SIZE) duk_small_int_t c = (duk_small_int_t) DUK_FPCLASSIFY(x); if (DUK_UNLIKELY(c == DUK_FP_NAN)) { return 0.0; } else if (DUK_UNLIKELY(c == DUK_FP_INFINITE)) { return x; } else { /* Finite, including neg/pos zero. Neg zero sign must be * preserved. */ return duk_double_trunc_towards_zero(x); } #else /* DUK_USE_PREFER_SIZE */ /* NaN and Infinity have the same exponent so it's a cheap * initial check for the rare path. */ if (DUK_UNLIKELY(duk_double_is_nan_or_inf(x) != 0U)) { if (duk_double_is_nan(x)) { return 0.0; } else { return x; } } else { return duk_double_trunc_towards_zero(x); } #endif /* DUK_USE_PREFER_SIZE */ } DUK_INTERNAL duk_double_t duk_js_tointeger(duk_hthread *thr, duk_tval *tv) { /* XXX: fastint */ duk_double_t d = duk_js_tonumber(thr, tv); /* invalidates tv */ return duk_js_tointeger_number(d); } /* * ToInt32(), ToUint32(), ToUint16() (E5 Sections 9.5, 9.6, 9.7) */ /* combined algorithm matching E5 Sections 9.5 and 9.6 */ DUK_LOCAL duk_double_t duk__toint32_touint32_helper(duk_double_t x, duk_bool_t is_toint32) { #if defined (DUK_USE_PREFER_SIZE) duk_small_int_t c; #endif #if defined (DUK_USE_PREFER_SIZE) c = (duk_small_int_t) DUK_FPCLASSIFY(x); if (c == DUK_FP_NAN || c == DUK_FP_ZERO || c == DUK_FP_INFINITE) { return 0.0; } #else if (duk_double_is_nan_zero_inf(x)) { return 0.0; } #endif /* x = sign(x) * floor(abs(x)), i.e. truncate towards zero, keep sign */ x = duk_double_trunc_towards_zero(x); /* NOTE: fmod(x) result sign is same as sign of x, which * differs from what Javascript wants (see Section 9.6). */ x = DUK_FMOD(x, DUK_DOUBLE_2TO32); /* -> x in ]-2**32, 2**32[ */ if (x < 0.0) { x += DUK_DOUBLE_2TO32; } DUK_ASSERT(x >= 0 && x < DUK_DOUBLE_2TO32); /* -> x in [0, 2**32[ */ if (is_toint32) { if (x >= DUK_DOUBLE_2TO31) { /* x in [2**31, 2**32[ */ x -= DUK_DOUBLE_2TO32; /* -> x in [-2**31,2**31[ */ } } return x; } DUK_INTERNAL duk_int32_t duk_js_toint32(duk_hthread *thr, duk_tval *tv) { duk_double_t d; #if defined(DUK_USE_FASTINT) if (DUK_TVAL_IS_FASTINT(tv)) { return DUK_TVAL_GET_FASTINT_I32(tv); } #endif d = duk_js_tonumber(thr, tv); /* invalidates tv */ d = duk__toint32_touint32_helper(d, 1); DUK_ASSERT(DUK_FPCLASSIFY(d) == DUK_FP_ZERO || DUK_FPCLASSIFY(d) == DUK_FP_NORMAL); DUK_ASSERT(d >= -2147483648.0 && d <= 2147483647.0); /* [-0x80000000,0x7fffffff] */ DUK_ASSERT(d == ((duk_double_t) ((duk_int32_t) d))); /* whole, won't clip */ return (duk_int32_t) d; } DUK_INTERNAL duk_uint32_t duk_js_touint32(duk_hthread *thr, duk_tval *tv) { duk_double_t d; #if defined(DUK_USE_FASTINT) if (DUK_TVAL_IS_FASTINT(tv)) { return DUK_TVAL_GET_FASTINT_U32(tv); } #endif d = duk_js_tonumber(thr, tv); /* invalidates tv */ d = duk__toint32_touint32_helper(d, 0); DUK_ASSERT(DUK_FPCLASSIFY(d) == DUK_FP_ZERO || DUK_FPCLASSIFY(d) == DUK_FP_NORMAL); DUK_ASSERT(d >= 0.0 && d <= 4294967295.0); /* [0x00000000, 0xffffffff] */ DUK_ASSERT(d == ((duk_double_t) ((duk_uint32_t) d))); /* whole, won't clip */ return (duk_uint32_t) d; } DUK_INTERNAL duk_uint16_t duk_js_touint16(duk_hthread *thr, duk_tval *tv) { /* should be a safe way to compute this */ return (duk_uint16_t) (duk_js_touint32(thr, tv) & 0x0000ffffU); } /* * ToString() (E5 Section 9.8) * ToObject() (E5 Section 9.9) * CheckObjectCoercible() (E5 Section 9.10) * IsCallable() (E5 Section 9.11) * * ==> implemented in the API. */ /* * Loose equality, strict equality, and SameValue (E5 Sections 11.9.1, 11.9.4, * 9.12). These have much in common so they can share some helpers. * * Future work notes: * * - Current implementation (and spec definition) has recursion; this should * be fixed if possible. * * - String-to-number coercion should be possible without going through the * value stack (and be more compact) if a shared helper is invoked. */ /* Note that this is the same operation for strict and loose equality: * - E5 Section 11.9.3, step 1.c (loose) * - E5 Section 11.9.6, step 4 (strict) */ DUK_LOCAL duk_bool_t duk__js_equals_number(duk_double_t x, duk_double_t y) { #if defined(DUK_USE_PARANOID_MATH) /* Straightforward algorithm, makes fewer compiler assumptions. */ duk_small_int_t cx = (duk_small_int_t) DUK_FPCLASSIFY(x); duk_small_int_t cy = (duk_small_int_t) DUK_FPCLASSIFY(y); if (cx == DUK_FP_NAN || cy == DUK_FP_NAN) { return 0; } if (cx == DUK_FP_ZERO && cy == DUK_FP_ZERO) { return 1; } if (x == y) { return 1; } return 0; #else /* DUK_USE_PARANOID_MATH */ /* Better equivalent algorithm. If the compiler is compliant, C and * Ecmascript semantics are identical for this particular comparison. * In particular, NaNs must never compare equal and zeroes must compare * equal regardless of sign. Could also use a macro, but this inlines * already nicely (no difference on gcc, for instance). */ if (x == y) { /* IEEE requires that NaNs compare false */ DUK_ASSERT(DUK_FPCLASSIFY(x) != DUK_FP_NAN); DUK_ASSERT(DUK_FPCLASSIFY(y) != DUK_FP_NAN); return 1; } else { /* IEEE requires that zeros compare the same regardless * of their signed, so if both x and y are zeroes, they * are caught above. */ DUK_ASSERT(!(DUK_FPCLASSIFY(x) == DUK_FP_ZERO && DUK_FPCLASSIFY(y) == DUK_FP_ZERO)); return 0; } #endif /* DUK_USE_PARANOID_MATH */ } DUK_LOCAL duk_bool_t duk__js_samevalue_number(duk_double_t x, duk_double_t y) { #if defined(DUK_USE_PARANOID_MATH) duk_small_int_t cx = (duk_small_int_t) DUK_FPCLASSIFY(x); duk_small_int_t cy = (duk_small_int_t) DUK_FPCLASSIFY(y); if (cx == DUK_FP_NAN && cy == DUK_FP_NAN) { /* SameValue(NaN, NaN) = true, regardless of NaN sign or extra bits */ return 1; } if (cx == DUK_FP_ZERO && cy == DUK_FP_ZERO) { /* Note: cannot assume that a non-zero return value of signbit() would * always be the same -- hence cannot (portably) use something like: * * signbit(x) == signbit(y) */ duk_small_int_t sx = DUK_SIGNBIT(x) ? 1 : 0; duk_small_int_t sy = DUK_SIGNBIT(y) ? 1 : 0; return (sx == sy); } /* normal comparison; known: * - both x and y are not NaNs (but one of them can be) * - both x and y are not zero (but one of them can be) * - x and y may be denormal or infinite */ return (x == y); #else /* DUK_USE_PARANOID_MATH */ duk_small_int_t cx = (duk_small_int_t) DUK_FPCLASSIFY(x); duk_small_int_t cy = (duk_small_int_t) DUK_FPCLASSIFY(y); if (x == y) { /* IEEE requires that NaNs compare false */ DUK_ASSERT(DUK_FPCLASSIFY(x) != DUK_FP_NAN); DUK_ASSERT(DUK_FPCLASSIFY(y) != DUK_FP_NAN); /* Using classification has smaller footprint than direct comparison. */ if (DUK_UNLIKELY(cx == DUK_FP_ZERO && cy == DUK_FP_ZERO)) { /* Note: cannot assume that a non-zero return value of signbit() would * always be the same -- hence cannot (portably) use something like: * * signbit(x) == signbit(y) */ return duk_double_same_sign(x, y); } return 1; } else { /* IEEE requires that zeros compare the same regardless * of their sign, so if both x and y are zeroes, they * are caught above. */ DUK_ASSERT(!(DUK_FPCLASSIFY(x) == DUK_FP_ZERO && DUK_FPCLASSIFY(y) == DUK_FP_ZERO)); /* Difference to non-strict/strict comparison is that NaNs compare * equal and signed zero signs matter. */ if (DUK_UNLIKELY(cx == DUK_FP_NAN && cy == DUK_FP_NAN)) { /* SameValue(NaN, NaN) = true, regardless of NaN sign or extra bits */ return 1; } return 0; } #endif /* DUK_USE_PARANOID_MATH */ } DUK_INTERNAL duk_bool_t duk_js_equals_helper(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_small_uint_t flags) { duk_uint_t type_mask_x; duk_uint_t type_mask_y; /* If flags != 0 (strict or SameValue), thr can be NULL. For loose * equals comparison it must be != NULL. */ DUK_ASSERT(flags != 0 || thr != NULL); /* * Same type? * * Note: since number values have no explicit tag in the 8-byte * representation, need the awkward if + switch. */ #if defined(DUK_USE_FASTINT) if (DUK_TVAL_IS_FASTINT(tv_x) && DUK_TVAL_IS_FASTINT(tv_y)) { if (DUK_TVAL_GET_FASTINT(tv_x) == DUK_TVAL_GET_FASTINT(tv_y)) { return 1; } else { return 0; } } else #endif if (DUK_TVAL_IS_NUMBER(tv_x) && DUK_TVAL_IS_NUMBER(tv_y)) { duk_double_t d1, d2; /* Catches both doubles and cases where only one argument is * a fastint so can't assume a double. */ d1 = DUK_TVAL_GET_NUMBER(tv_x); d2 = DUK_TVAL_GET_NUMBER(tv_y); if (DUK_UNLIKELY((flags & DUK_EQUALS_FLAG_SAMEVALUE) != 0)) { /* SameValue */ return duk__js_samevalue_number(d1, d2); } else { /* equals and strict equals */ return duk__js_equals_number(d1, d2); } } else if (DUK_TVAL_GET_TAG(tv_x) == DUK_TVAL_GET_TAG(tv_y)) { switch (DUK_TVAL_GET_TAG(tv_x)) { case DUK_TAG_UNDEFINED: case DUK_TAG_NULL: { return 1; } case DUK_TAG_BOOLEAN: { return DUK_TVAL_GET_BOOLEAN(tv_x) == DUK_TVAL_GET_BOOLEAN(tv_y); } case DUK_TAG_POINTER: { return DUK_TVAL_GET_POINTER(tv_x) == DUK_TVAL_GET_POINTER(tv_y); } case DUK_TAG_STRING: case DUK_TAG_OBJECT: { /* Heap pointer comparison suffices for strings and objects. * Symbols compare equal if they have the same internal * representation; again heap pointer comparison suffices. */ return DUK_TVAL_GET_HEAPHDR(tv_x) == DUK_TVAL_GET_HEAPHDR(tv_y); } case DUK_TAG_BUFFER: { /* In Duktape 2.x plain buffers mimic Uint8Array objects * so always compare by heap pointer. In Duktape 1.x * strict comparison would compare heap pointers and * non-strict would compare contents. */ return DUK_TVAL_GET_HEAPHDR(tv_x) == DUK_TVAL_GET_HEAPHDR(tv_y); } case DUK_TAG_LIGHTFUNC: { /* At least 'magic' has a significant impact on function * identity. */ duk_small_uint_t lf_flags_x; duk_small_uint_t lf_flags_y; duk_c_function func_x; duk_c_function func_y; DUK_TVAL_GET_LIGHTFUNC(tv_x, func_x, lf_flags_x); DUK_TVAL_GET_LIGHTFUNC(tv_y, func_y, lf_flags_y); return ((func_x == func_y) && (lf_flags_x == lf_flags_y)) ? 1 : 0; } #if defined(DUK_USE_FASTINT) case DUK_TAG_FASTINT: #endif default: { DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv_x)); DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv_y)); DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_x)); DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_y)); DUK_UNREACHABLE(); return 0; } } } if ((flags & (DUK_EQUALS_FLAG_STRICT | DUK_EQUALS_FLAG_SAMEVALUE)) != 0) { return 0; } DUK_ASSERT(flags == 0); /* non-strict equality from here on */ /* * Types are different; various cases for non-strict comparison * * Since comparison is symmetric, we use a "swap trick" to reduce * code size. */ type_mask_x = duk_get_type_mask_tval(tv_x); type_mask_y = duk_get_type_mask_tval(tv_y); /* Undefined/null are considered equal (e.g. "null == undefined" -> true). */ if ((type_mask_x & (DUK_TYPE_MASK_UNDEFINED | DUK_TYPE_MASK_NULL)) && (type_mask_y & (DUK_TYPE_MASK_NULL | DUK_TYPE_MASK_UNDEFINED))) { return 1; } /* Number/string -> coerce string to number (e.g. "'1.5' == 1.5" -> true). */ if ((type_mask_x & DUK_TYPE_MASK_NUMBER) && (type_mask_y & DUK_TYPE_MASK_STRING)) { if (!DUK_TVAL_STRING_IS_SYMBOL(tv_y)) { duk_double_t d1, d2; d1 = DUK_TVAL_GET_NUMBER(tv_x); d2 = duk_to_number_tval(thr, tv_y); return duk__js_equals_number(d1, d2); } } if ((type_mask_x & DUK_TYPE_MASK_STRING) && (type_mask_y & DUK_TYPE_MASK_NUMBER)) { if (!DUK_TVAL_STRING_IS_SYMBOL(tv_x)) { duk_double_t d1, d2; d1 = DUK_TVAL_GET_NUMBER(tv_y); d2 = duk_to_number_tval(thr, tv_x); return duk__js_equals_number(d1, d2); } } /* Boolean/any -> coerce boolean to number and try again. If boolean is * compared to a pointer, the final comparison after coercion now always * yields false (as pointer vs. number compares to false), but this is * not special cased. * * ToNumber(bool) is +1.0 or 0.0. Tagged boolean value is always 0 or 1. */ if (type_mask_x & DUK_TYPE_MASK_BOOLEAN) { DUK_ASSERT(DUK_TVAL_GET_BOOLEAN(tv_x) == 0 || DUK_TVAL_GET_BOOLEAN(tv_x) == 1); duk_push_uint(thr, DUK_TVAL_GET_BOOLEAN(tv_x)); duk_push_tval(thr, tv_y); goto recursive_call; } if (type_mask_y & DUK_TYPE_MASK_BOOLEAN) { DUK_ASSERT(DUK_TVAL_GET_BOOLEAN(tv_y) == 0 || DUK_TVAL_GET_BOOLEAN(tv_y) == 1); duk_push_tval(thr, tv_x); duk_push_uint(thr, DUK_TVAL_GET_BOOLEAN(tv_y)); goto recursive_call; } /* String-number-symbol/object -> coerce object to primitive (apparently without hint), then try again. */ if ((type_mask_x & (DUK_TYPE_MASK_STRING | DUK_TYPE_MASK_NUMBER)) && (type_mask_y & DUK_TYPE_MASK_OBJECT)) { /* No symbol check needed because symbols and strings are accepted. */ duk_push_tval(thr, tv_x); duk_push_tval(thr, tv_y); duk_to_primitive(thr, -1, DUK_HINT_NONE); /* apparently no hint? */ goto recursive_call; } if ((type_mask_x & DUK_TYPE_MASK_OBJECT) && (type_mask_y & (DUK_TYPE_MASK_STRING | DUK_TYPE_MASK_NUMBER))) { /* No symbol check needed because symbols and strings are accepted. */ duk_push_tval(thr, tv_x); duk_push_tval(thr, tv_y); duk_to_primitive(thr, -2, DUK_HINT_NONE); /* apparently no hint? */ goto recursive_call; } /* Nothing worked -> not equal. */ return 0; recursive_call: /* Shared code path to call the helper again with arguments on stack top. */ { duk_bool_t rc; rc = duk_js_equals_helper(thr, DUK_GET_TVAL_NEGIDX(thr, -2), DUK_GET_TVAL_NEGIDX(thr, -1), 0 /*flags:nonstrict*/); duk_pop_2_unsafe(thr); return rc; } } /* * Comparisons (x >= y, x > y, x <= y, x < y) * * E5 Section 11.8.5: implement 'x < y' and then use negate and eval_left_first * flags to get the rest. */ /* XXX: this should probably just operate on the stack top, because it * needs to push stuff on the stack anyway... */ DUK_INTERNAL duk_small_int_t duk_js_data_compare(const duk_uint8_t *buf1, const duk_uint8_t *buf2, duk_size_t len1, duk_size_t len2) { duk_size_t prefix_len; duk_small_int_t rc; prefix_len = (len1 <= len2 ? len1 : len2); /* DUK_MEMCMP() is guaranteed to return zero (equal) for zero length * inputs so no zero length check is needed. */ rc = DUK_MEMCMP((const void *) buf1, (const void *) buf2, (size_t) prefix_len); if (rc < 0) { return -1; } else if (rc > 0) { return 1; } /* prefix matches, lengths matter now */ if (len1 < len2) { /* e.g. "x" < "xx" */ return -1; } else if (len1 > len2) { return 1; } return 0; } DUK_INTERNAL duk_small_int_t duk_js_string_compare(duk_hstring *h1, duk_hstring *h2) { /* * String comparison (E5 Section 11.8.5, step 4), which * needs to compare codepoint by codepoint. * * However, UTF-8 allows us to use strcmp directly: the shared * prefix will be encoded identically (UTF-8 has unique encoding) * and the first differing character can be compared with a simple * unsigned byte comparison (which strcmp does). * * This will not work properly for non-xutf-8 strings, but this * is not an issue for compliance. */ DUK_ASSERT(h1 != NULL); DUK_ASSERT(h2 != NULL); return duk_js_data_compare((const duk_uint8_t *) DUK_HSTRING_GET_DATA(h1), (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h2), (duk_size_t) DUK_HSTRING_GET_BYTELEN(h1), (duk_size_t) DUK_HSTRING_GET_BYTELEN(h2)); } #if 0 /* unused */ DUK_INTERNAL duk_small_int_t duk_js_buffer_compare(duk_heap *heap, duk_hbuffer *h1, duk_hbuffer *h2) { /* Similar to String comparison. */ DUK_ASSERT(h1 != NULL); DUK_ASSERT(h2 != NULL); DUK_UNREF(heap); return duk_js_data_compare((const duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(heap, h1), (const duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(heap, h2), (duk_size_t) DUK_HBUFFER_GET_SIZE(h1), (duk_size_t) DUK_HBUFFER_GET_SIZE(h2)); } #endif #if defined(DUK_USE_FASTINT) DUK_LOCAL duk_bool_t duk__compare_fastint(duk_bool_t retval, duk_int64_t v1, duk_int64_t v2) { DUK_ASSERT(retval == 0 || retval == 1); if (v1 < v2) { return retval ^ 1; } else { return retval; } } #endif #if defined(DUK_USE_PARANOID_MATH) DUK_LOCAL duk_bool_t duk__compare_number(duk_bool_t retval, duk_double_t d1, duk_double_t d2) { duk_small_int_t c1, s1, c2, s2; DUK_ASSERT(retval == 0 || retval == 1); c1 = (duk_small_int_t) DUK_FPCLASSIFY(d1); s1 = (duk_small_int_t) DUK_SIGNBIT(d1); c2 = (duk_small_int_t) DUK_FPCLASSIFY(d2); s2 = (duk_small_int_t) DUK_SIGNBIT(d2); if (c1 == DUK_FP_NAN || c2 == DUK_FP_NAN) { return 0; /* Always false, regardless of negation. */ } if (c1 == DUK_FP_ZERO && c2 == DUK_FP_ZERO) { /* For all combinations: +0 < +0, +0 < -0, -0 < +0, -0 < -0, * steps e, f, and g. */ return retval; /* false */ } if (d1 == d2) { return retval; /* false */ } if (c1 == DUK_FP_INFINITE && s1 == 0) { /* x == +Infinity */ return retval; /* false */ } if (c2 == DUK_FP_INFINITE && s2 == 0) { /* y == +Infinity */ return retval ^ 1; /* true */ } if (c2 == DUK_FP_INFINITE && s2 != 0) { /* y == -Infinity */ return retval; /* false */ } if (c1 == DUK_FP_INFINITE && s1 != 0) { /* x == -Infinity */ return retval ^ 1; /* true */ } if (d1 < d2) { return retval ^ 1; /* true */ } return retval; /* false */ } #else /* DUK_USE_PARANOID_MATH */ DUK_LOCAL duk_bool_t duk__compare_number(duk_bool_t retval, duk_double_t d1, duk_double_t d2) { /* This comparison tree relies doesn't match the exact steps in * E5 Section 11.8.5 but should produce the same results. The * steps rely on exact IEEE semantics for NaNs, etc. */ DUK_ASSERT(retval == 0 || retval == 1); if (d1 < d2) { /* In no case should both (d1 < d2) and (d2 < d1) be true. * It's possible that neither is true though, and that's * handled below. */ DUK_ASSERT(!(d2 < d1)); /* - d1 < d2, both d1/d2 are normals (not Infinity, not NaN) * - d2 is +Infinity, d1 != +Infinity and NaN * - d1 is -Infinity, d2 != -Infinity and NaN */ return retval ^ 1; } else { if (d2 < d1) { /* - !(d1 < d2), both d1/d2 are normals (not Infinity, not NaN) * - d1 is +Infinity, d2 != +Infinity and NaN * - d2 is -Infinity, d1 != -Infinity and NaN */ return retval; } else { /* - d1 and/or d2 is NaN * - d1 and d2 are both +/- 0 * - d1 == d2 (including infinities) */ if (duk_double_is_nan(d1) || duk_double_is_nan(d2)) { /* Note: undefined from Section 11.8.5 always * results in false return (see e.g. Section * 11.8.3) - hence special treatment here. */ return 0; /* zero regardless of negation */ } else { return retval; } } } } #endif /* DUK_USE_PARANOID_MATH */ DUK_INTERNAL duk_bool_t duk_js_compare_helper(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_small_uint_t flags) { duk_double_t d1, d2; duk_small_int_t rc; duk_bool_t retval; DUK_ASSERT(DUK_COMPARE_FLAG_NEGATE == 1); /* Rely on this flag being lowest. */ retval = flags & DUK_COMPARE_FLAG_NEGATE; DUK_ASSERT(retval == 0 || retval == 1); /* Fast path for fastints */ #if defined(DUK_USE_FASTINT) if (DUK_LIKELY(DUK_TVAL_IS_FASTINT(tv_x) && DUK_TVAL_IS_FASTINT(tv_y))) { return duk__compare_fastint(retval, DUK_TVAL_GET_FASTINT(tv_x), DUK_TVAL_GET_FASTINT(tv_y)); } #endif /* DUK_USE_FASTINT */ /* Fast path for numbers (one of which may be a fastint) */ #if !defined(DUK_USE_PREFER_SIZE) if (DUK_LIKELY(DUK_TVAL_IS_NUMBER(tv_x) && DUK_TVAL_IS_NUMBER(tv_y))) { return duk__compare_number(retval, DUK_TVAL_GET_NUMBER(tv_x), DUK_TVAL_GET_NUMBER(tv_y)); } #endif /* Slow path */ duk_push_tval(thr, tv_x); duk_push_tval(thr, tv_y); if (flags & DUK_COMPARE_FLAG_EVAL_LEFT_FIRST) { duk_to_primitive(thr, -2, DUK_HINT_NUMBER); duk_to_primitive(thr, -1, DUK_HINT_NUMBER); } else { duk_to_primitive(thr, -1, DUK_HINT_NUMBER); duk_to_primitive(thr, -2, DUK_HINT_NUMBER); } /* Note: reuse variables */ tv_x = DUK_GET_TVAL_NEGIDX(thr, -2); tv_y = DUK_GET_TVAL_NEGIDX(thr, -1); if (DUK_TVAL_IS_STRING(tv_x) && DUK_TVAL_IS_STRING(tv_y)) { duk_hstring *h1 = DUK_TVAL_GET_STRING(tv_x); duk_hstring *h2 = DUK_TVAL_GET_STRING(tv_y); DUK_ASSERT(h1 != NULL); DUK_ASSERT(h2 != NULL); if (DUK_LIKELY(!DUK_HSTRING_HAS_SYMBOL(h1) && !DUK_HSTRING_HAS_SYMBOL(h2))) { rc = duk_js_string_compare(h1, h2); duk_pop_2_unsafe(thr); if (rc < 0) { return retval ^ 1; } else { return retval; } } /* One or both are Symbols: fall through to handle in the * generic path. Concretely, ToNumber() will fail. */ } /* Ordering should not matter (E5 Section 11.8.5, step 3.a). */ #if 0 if (flags & DUK_COMPARE_FLAG_EVAL_LEFT_FIRST) { d1 = duk_to_number_m2(thr); d2 = duk_to_number_m1(thr); } else { d2 = duk_to_number_m1(thr); d1 = duk_to_number_m2(thr); } #endif d1 = duk_to_number_m2(thr); d2 = duk_to_number_m1(thr); /* We want to duk_pop_2_unsafe(thr); because the values are numbers * no decref check is needed. */ #if defined(DUK_USE_PREFER_SIZE) duk_pop_2_nodecref_unsafe(thr); #else DUK_ASSERT(!DUK_TVAL_NEEDS_REFCOUNT_UPDATE(duk_get_tval(thr, -2))); DUK_ASSERT(!DUK_TVAL_NEEDS_REFCOUNT_UPDATE(duk_get_tval(thr, -1))); DUK_ASSERT(duk_get_top(thr) >= 2); thr->valstack_top -= 2; tv_x = thr->valstack_top; tv_y = tv_x + 1; DUK_TVAL_SET_UNDEFINED(tv_x); /* Value stack policy */ DUK_TVAL_SET_UNDEFINED(tv_y); #endif return duk__compare_number(retval, d1, d2); } /* * instanceof */ /* * E5 Section 11.8.6 describes the main algorithm, which uses * [[HasInstance]]. [[HasInstance]] is defined for only * function objects: * * - Normal functions: * E5 Section 15.3.5.3 * - Functions established with Function.prototype.bind(): * E5 Section 15.3.4.5.3 * * For other objects, a TypeError is thrown. * * Limited Proxy support: don't support 'getPrototypeOf' trap but * continue lookup in Proxy target if the value is a Proxy. */ DUK_INTERNAL duk_bool_t duk_js_instanceof(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y) { duk_hobject *func; duk_hobject *val; duk_hobject *proto; duk_tval *tv; duk_bool_t skip_first; duk_uint_t sanity; /* * Get the values onto the stack first. It would be possible to cover * some normal cases without resorting to the value stack. * * The right hand side could be a light function (as they generally * behave like objects). Light functions never have a 'prototype' * property so E5.1 Section 15.3.5.3 step 3 always throws a TypeError. * Using duk_require_hobject() is thus correct (except for error msg). */ duk_push_tval(thr, tv_x); duk_push_tval(thr, tv_y); func = duk_require_hobject(thr, -1); DUK_ASSERT(func != NULL); /* * For bound objects, [[HasInstance]] just calls the target function * [[HasInstance]]. If that is again a bound object, repeat until * we find a non-bound Function object. * * The bound function chain is now "collapsed" so there can be only * one bound function in the chain. */ if (!DUK_HOBJECT_IS_CALLABLE(func)) { /* * Note: of native Ecmascript objects, only Function instances * have a [[HasInstance]] internal property. Custom objects might * also have it, but not in current implementation. * * XXX: add a separate flag, DUK_HOBJECT_FLAG_ALLOW_INSTANCEOF? */ goto error_invalid_rval; } if (DUK_HOBJECT_HAS_BOUNDFUNC(func)) { duk_push_tval(thr, &((duk_hboundfunc *) func)->target); duk_replace(thr, -2); func = duk_require_hobject(thr, -1); /* lightfunc throws */ /* Rely on Function.prototype.bind() never creating bound * functions whose target is not proper. */ DUK_ASSERT(func != NULL); DUK_ASSERT(DUK_HOBJECT_IS_CALLABLE(func)); } /* * 'func' is now a non-bound object which supports [[HasInstance]] * (which here just means DUK_HOBJECT_FLAG_CALLABLE). Move on * to execute E5 Section 15.3.5.3. */ DUK_ASSERT(func != NULL); DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(func)); DUK_ASSERT(DUK_HOBJECT_IS_CALLABLE(func)); /* [ ... lval rval(func) ] */ /* For lightfuncs, buffers, and pointers start the comparison directly * from the virtual prototype object. */ skip_first = 0; tv = DUK_GET_TVAL_NEGIDX(thr, -2); switch (DUK_TVAL_GET_TAG(tv)) { case DUK_TAG_LIGHTFUNC: val = thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]; DUK_ASSERT(val != NULL); break; case DUK_TAG_BUFFER: val = thr->builtins[DUK_BIDX_UINT8ARRAY_PROTOTYPE]; DUK_ASSERT(val != NULL); break; case DUK_TAG_POINTER: val = thr->builtins[DUK_BIDX_POINTER_PROTOTYPE]; DUK_ASSERT(val != NULL); break; case DUK_TAG_OBJECT: skip_first = 1; /* Ignore object itself on first round. */ val = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(val != NULL); break; default: goto pop2_and_false; } DUK_ASSERT(val != NULL); /* Loop doesn't actually rely on this. */ /* Look up .prototype of rval. Leave it on the value stack in case it * has been virtualized (e.g. getter, Proxy trap). */ duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_PROTOTYPE); /* -> [ ... lval rval rval.prototype ] */ #if defined(DUK_USE_VERBOSE_ERRORS) proto = duk_get_hobject(thr, -1); if (proto == NULL) { goto error_invalid_rval_noproto; } #else proto = duk_require_hobject(thr, -1); #endif sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY; do { /* * Note: prototype chain is followed BEFORE first comparison. This * means that the instanceof lval is never itself compared to the * rval.prototype property. This is apparently intentional, see E5 * Section 15.3.5.3, step 4.a. * * Also note: * * js> (function() {}) instanceof Function * true * js> Function instanceof Function * true * * For the latter, h_proto will be Function.prototype, which is the * built-in Function prototype. Because Function.[[Prototype]] is * also the built-in Function prototype, the result is true. */ if (!val) { goto pop3_and_false; } DUK_ASSERT(val != NULL); #if defined(DUK_USE_ES6_PROXY) val = duk_hobject_resolve_proxy_target(val); #endif if (skip_first) { skip_first = 0; } else if (val == proto) { goto pop3_and_true; } DUK_ASSERT(val != NULL); val = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, val); } while (--sanity > 0); if (DUK_UNLIKELY(sanity == 0)) { DUK_ERROR_RANGE(thr, DUK_STR_PROTOTYPE_CHAIN_LIMIT); } DUK_UNREACHABLE(); pop2_and_false: duk_pop_2_unsafe(thr); return 0; pop3_and_false: duk_pop_3_unsafe(thr); return 0; pop3_and_true: duk_pop_3_unsafe(thr); return 1; error_invalid_rval: DUK_ERROR_TYPE(thr, DUK_STR_INVALID_INSTANCEOF_RVAL); return 0; #if defined(DUK_USE_VERBOSE_ERRORS) error_invalid_rval_noproto: DUK_ERROR_TYPE(thr, DUK_STR_INVALID_INSTANCEOF_RVAL_NOPROTO); return 0; #endif } /* * in */ /* * E5 Sections 11.8.7, 8.12.6. * * Basically just a property existence check using [[HasProperty]]. */ DUK_INTERNAL duk_bool_t duk_js_in(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y) { duk_bool_t retval; /* * Get the values onto the stack first. It would be possible to cover * some normal cases without resorting to the value stack (e.g. if * lval is already a string). */ /* XXX: The ES5/5.1/6 specifications require that the key in 'key in obj' * must be string coerced before the internal HasProperty() algorithm is * invoked. A fast path skipping coercion could be safely implemented for * numbers (as number-to-string coercion has no side effects). For ES2015 * proxy behavior, the trap 'key' argument must be in a string coerced * form (which is a shame). */ /* TypeError if rval is not an object or object like (e.g. lightfunc * or plain buffer). */ duk_push_tval(thr, tv_x); duk_push_tval(thr, tv_y); duk_require_type_mask(thr, -1, DUK_TYPE_MASK_OBJECT | DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER); (void) duk_to_property_key_hstring(thr, -2); retval = duk_hobject_hasprop(thr, DUK_GET_TVAL_NEGIDX(thr, -1), DUK_GET_TVAL_NEGIDX(thr, -2)); duk_pop_2_unsafe(thr); return retval; } /* * typeof * * E5 Section 11.4.3. * * Very straightforward. The only question is what to return for our * non-standard tag / object types. * * There is an unfortunate string constant define naming problem with * typeof return values for e.g. "Object" and "object"; careful with * the built-in string defines. The LC_XXX defines are used for the * lowercase variants now. */ DUK_INTERNAL duk_small_uint_t duk_js_typeof_stridx(duk_tval *tv_x) { duk_small_uint_t stridx = 0; switch (DUK_TVAL_GET_TAG(tv_x)) { case DUK_TAG_UNDEFINED: { stridx = DUK_STRIDX_LC_UNDEFINED; break; } case DUK_TAG_NULL: { /* Note: not a typo, "object" is returned for a null value. */ stridx = DUK_STRIDX_LC_OBJECT; break; } case DUK_TAG_BOOLEAN: { stridx = DUK_STRIDX_LC_BOOLEAN; break; } case DUK_TAG_POINTER: { /* Implementation specific. */ stridx = DUK_STRIDX_LC_POINTER; break; } case DUK_TAG_STRING: { duk_hstring *str; /* All internal keys are identified as Symbols. */ str = DUK_TVAL_GET_STRING(tv_x); DUK_ASSERT(str != NULL); if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(str))) { stridx = DUK_STRIDX_LC_SYMBOL; } else { stridx = DUK_STRIDX_LC_STRING; } break; } case DUK_TAG_OBJECT: { duk_hobject *obj = DUK_TVAL_GET_OBJECT(tv_x); DUK_ASSERT(obj != NULL); if (DUK_HOBJECT_IS_CALLABLE(obj)) { stridx = DUK_STRIDX_LC_FUNCTION; } else { stridx = DUK_STRIDX_LC_OBJECT; } break; } case DUK_TAG_BUFFER: { /* Implementation specific. In Duktape 1.x this would be * 'buffer', in Duktape 2.x changed to 'object' because plain * buffers now mimic Uint8Array objects. */ stridx = DUK_STRIDX_LC_OBJECT; break; } case DUK_TAG_LIGHTFUNC: { stridx = DUK_STRIDX_LC_FUNCTION; break; } #if defined(DUK_USE_FASTINT) case DUK_TAG_FASTINT: #endif default: { /* number */ DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv_x)); DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_x)); stridx = DUK_STRIDX_LC_NUMBER; break; } } DUK_ASSERT_STRIDX_VALID(stridx); return stridx; } /* * Array index and length * * Array index: E5 Section 15.4 * Array length: E5 Section 15.4.5.1 steps 3.c - 3.d (array length write) */ /* Compure array index from string context, or return a "not array index" * indicator. */ DUK_INTERNAL duk_uarridx_t duk_js_to_arrayindex_string(const duk_uint8_t *str, duk_uint32_t blen) { duk_uarridx_t res; /* Only strings with byte length 1-10 can be 32-bit array indices. * Leading zeroes (except '0' alone), plus/minus signs are not allowed. * We could do a lot of prechecks here, but since most strings won't * start with any digits, it's simpler to just parse the number and * fail quickly. */ res = 0; if (blen == 0) { goto parse_fail; } do { duk_uarridx_t dig; dig = (duk_uarridx_t) (*str++) - DUK_ASC_0; if (dig <= 9U) { /* Careful overflow handling. When multiplying by 10: * - 0x19999998 x 10 = 0xfffffff0: no overflow, and adding * 0...9 is safe. * - 0x19999999 x 10 = 0xfffffffa: no overflow, adding * 0...5 is safe, 6...9 overflows. * - 0x1999999a x 10 = 0x100000004: always overflow. */ if (DUK_UNLIKELY(res >= 0x19999999UL)) { if (res >= 0x1999999aUL) { /* Always overflow. */ goto parse_fail; } DUK_ASSERT(res == 0x19999999UL); if (dig >= 6U) { goto parse_fail; } res = 0xfffffffaUL + dig; DUK_ASSERT(res >= 0xfffffffaUL); DUK_ASSERT_DISABLE(res <= 0xffffffffUL); /* range */ } else { res = res * 10U + dig; if (DUK_UNLIKELY(res == 0)) { /* If 'res' is 0, previous 'res' must * have been 0 and we scanned in a zero. * This is only allowed if blen == 1, * i.e. the exact string '0'. */ if (blen == (duk_uint32_t) 1) { return 0; } goto parse_fail; } } } else { /* Because 'dig' is unsigned, catches both values * above '9' and below '0'. */ goto parse_fail; } } while (--blen > 0); return res; parse_fail: return DUK_HSTRING_NO_ARRAY_INDEX; } #if !defined(DUK_USE_HSTRING_ARRIDX) /* Get array index for a string which is known to be an array index. This helper * is needed when duk_hstring doesn't concretely store the array index, but strings * are flagged as array indices at intern time. */ DUK_INTERNAL duk_uarridx_t duk_js_to_arrayindex_hstring_fast_known(duk_hstring *h) { const duk_uint8_t *p; duk_uarridx_t res; duk_uint8_t t; DUK_ASSERT(h != NULL); DUK_ASSERT(DUK_HSTRING_HAS_ARRIDX(h)); p = DUK_HSTRING_GET_DATA(h); res = 0; for (;;) { t = *p++; if (DUK_UNLIKELY(t == 0)) { /* Scanning to NUL is always safe for interned strings. */ break; } DUK_ASSERT(t >= (duk_uint8_t) DUK_ASC_0 && t <= (duk_uint8_t) DUK_ASC_9); res = res * 10U + (duk_uarridx_t) t - (duk_uarridx_t) DUK_ASC_0; } return res; } DUK_INTERNAL duk_uarridx_t duk_js_to_arrayindex_hstring_fast(duk_hstring *h) { DUK_ASSERT(h != NULL); if (!DUK_HSTRING_HAS_ARRIDX(h)) { return DUK_HSTRING_NO_ARRAY_INDEX; } return duk_js_to_arrayindex_hstring_fast_known(h); } #endif /* DUK_USE_HSTRING_ARRIDX */ #line 1 "duk_js_var.c" /* * Identifier access and function closure handling. * * Provides the primitives for slow path identifier accesses: GETVAR, * PUTVAR, DELVAR, etc. The fast path, direct register accesses, should * be used for most identifier accesses. Consequently, these slow path * primitives should be optimized for maximum compactness. * * Ecmascript environment records (declarative and object) are represented * as internal objects with control keys. Environment records have a * parent record ("outer environment reference") which is represented by * the implicit prototype for technical reasons (in other words, it is a * convenient field). The prototype chain is not followed in the ordinary * sense for variable lookups. * * See identifier-handling.rst for more details on the identifier algorithms * and the internal representation. See function-objects.rst for details on * what function templates and instances are expected to look like. * * Care must be taken to avoid duk_tval pointer invalidation caused by * e.g. value stack or object resizing. * * TODO: properties for function instances could be initialized much more * efficiently by creating a property allocation for a certain size and * filling in keys and values directly (and INCREFing both with "bulk incref" * primitives. * * XXX: duk_hobject_getprop() and duk_hobject_putprop() calls are a bit * awkward (especially because they follow the prototype chain); rework * if "raw" own property helpers are added. */ /* #include duk_internal.h -> already included */ /* * Local result type for duk__get_identifier_reference() lookup. */ typedef struct { duk_hobject *env; duk_hobject *holder; /* for object-bound identifiers */ duk_tval *value; /* for register-bound and declarative env identifiers */ duk_uint_t attrs; /* property attributes for identifier (relevant if value != NULL) */ duk_bool_t has_this; /* for object-bound identifiers: provide 'this' binding */ } duk__id_lookup_result; /* * Create a new function object based on a "template function" which contains * compiled bytecode, constants, etc, but lacks a lexical environment. * * Ecmascript requires that each created closure is a separate object, with * its own set of editable properties. However, structured property values * (such as the formal arguments list and the variable map) are shared. * Also the bytecode, constants, and inner functions are shared. * * See E5 Section 13.2 for detailed requirements on the function objects; * there are no similar requirements for function "templates" which are an * implementation dependent internal feature. Also see function-objects.rst * for a discussion on the function instance properties provided by this * implementation. * * Notes: * * * Order of internal properties should match frequency of use, since the * properties will be linearly scanned on lookup (functions usually don't * have enough properties to warrant a hash part). * * * The created closure is independent of its template; they do share the * same 'data' buffer object, but the template object itself can be freed * even if the closure object remains reachable. */ DUK_LOCAL void duk__inc_data_inner_refcounts(duk_hthread *thr, duk_hcompfunc *f) { duk_tval *tv, *tv_end; duk_hobject **funcs, **funcs_end; DUK_UNREF(thr); /* If function creation fails due to out-of-memory, the data buffer * pointer may be NULL in some cases. That's actually possible for * GC code, but shouldn't be possible here because the incomplete * function will be unwound from the value stack and never instantiated. */ DUK_ASSERT(DUK_HCOMPFUNC_GET_DATA(thr->heap, f) != NULL); tv = DUK_HCOMPFUNC_GET_CONSTS_BASE(thr->heap, f); tv_end = DUK_HCOMPFUNC_GET_CONSTS_END(thr->heap, f); while (tv < tv_end) { DUK_TVAL_INCREF(thr, tv); tv++; } funcs = DUK_HCOMPFUNC_GET_FUNCS_BASE(thr->heap, f); funcs_end = DUK_HCOMPFUNC_GET_FUNCS_END(thr->heap, f); while (funcs < funcs_end) { DUK_HEAPHDR_INCREF(thr, (duk_heaphdr *) *funcs); funcs++; } } /* Push a new closure on the stack. * * Note: if fun_temp has NEWENV, i.e. a new lexical and variable declaration * is created when the function is called, only outer_lex_env matters * (outer_var_env is ignored and may or may not be same as outer_lex_env). */ DUK_LOCAL const duk_uint16_t duk__closure_copy_proplist[] = { /* order: most frequent to least frequent */ DUK_STRIDX_INT_VARMAP, DUK_STRIDX_INT_FORMALS, #if defined(DUK_USE_PC2LINE) DUK_STRIDX_INT_PC2LINE, #endif #if defined(DUK_USE_FUNC_FILENAME_PROPERTY) DUK_STRIDX_FILE_NAME, #endif #if defined(DUK_USE_NONSTD_FUNC_SOURCE_PROPERTY) DUK_STRIDX_INT_SOURCE #endif }; DUK_INTERNAL void duk_js_push_closure(duk_hthread *thr, duk_hcompfunc *fun_temp, duk_hobject *outer_var_env, duk_hobject *outer_lex_env, duk_bool_t add_auto_proto) { duk_hcompfunc *fun_clos; duk_small_uint_t i; duk_uint_t len_value; DUK_ASSERT(fun_temp != NULL); DUK_ASSERT(DUK_HCOMPFUNC_GET_DATA(thr->heap, fun_temp) != NULL); DUK_ASSERT(DUK_HCOMPFUNC_GET_FUNCS(thr->heap, fun_temp) != NULL); DUK_ASSERT(DUK_HCOMPFUNC_GET_BYTECODE(thr->heap, fun_temp) != NULL); DUK_ASSERT(outer_var_env != NULL); DUK_ASSERT(outer_lex_env != NULL); DUK_UNREF(len_value); fun_clos = duk_push_hcompfunc(thr); DUK_ASSERT(fun_clos != NULL); DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) fun_clos) == thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]); duk_push_hobject(thr, &fun_temp->obj); /* -> [ ... closure template ] */ DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) fun_clos)); DUK_ASSERT(DUK_HCOMPFUNC_GET_DATA(thr->heap, fun_clos) == NULL); DUK_ASSERT(DUK_HCOMPFUNC_GET_FUNCS(thr->heap, fun_clos) == NULL); DUK_ASSERT(DUK_HCOMPFUNC_GET_BYTECODE(thr->heap, fun_clos) == NULL); DUK_HCOMPFUNC_SET_DATA(thr->heap, fun_clos, DUK_HCOMPFUNC_GET_DATA(thr->heap, fun_temp)); DUK_HCOMPFUNC_SET_FUNCS(thr->heap, fun_clos, DUK_HCOMPFUNC_GET_FUNCS(thr->heap, fun_temp)); DUK_HCOMPFUNC_SET_BYTECODE(thr->heap, fun_clos, DUK_HCOMPFUNC_GET_BYTECODE(thr->heap, fun_temp)); /* Note: all references inside 'data' need to get their refcounts * upped too. This is the case because refcounts are decreased * through every function referencing 'data' independently. */ DUK_HBUFFER_INCREF(thr, DUK_HCOMPFUNC_GET_DATA(thr->heap, fun_clos)); duk__inc_data_inner_refcounts(thr, fun_temp); fun_clos->nregs = fun_temp->nregs; fun_clos->nargs = fun_temp->nargs; #if defined(DUK_USE_DEBUGGER_SUPPORT) fun_clos->start_line = fun_temp->start_line; fun_clos->end_line = fun_temp->end_line; #endif DUK_ASSERT(DUK_HCOMPFUNC_GET_DATA(thr->heap, fun_clos) != NULL); DUK_ASSERT(DUK_HCOMPFUNC_GET_FUNCS(thr->heap, fun_clos) != NULL); DUK_ASSERT(DUK_HCOMPFUNC_GET_BYTECODE(thr->heap, fun_clos) != NULL); /* XXX: Could also copy from template, but there's no way to have any * other value here now (used code has no access to the template). * Prototype is set by duk_push_hcompfunc(). */ DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, &fun_clos->obj) == thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]); #if 0 DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, &fun_clos->obj, thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]); #endif /* Copy duk_hobject flags as is from the template using a mask. * Leave out duk_heaphdr owned flags just in case (e.g. if there's * some GC flag or similar). Some flags can then be adjusted * separately if necessary. */ /* DUK_HEAPHDR_SET_FLAGS() masks changes to non-duk_heaphdr flags only. */ DUK_HEAPHDR_SET_FLAGS((duk_heaphdr *) fun_clos, DUK_HEAPHDR_GET_FLAGS_RAW((duk_heaphdr *) fun_temp)); DUK_DD(DUK_DDPRINT("fun_temp heaphdr flags: 0x%08lx, fun_clos heaphdr flags: 0x%08lx", (unsigned long) DUK_HEAPHDR_GET_FLAGS_RAW((duk_heaphdr *) fun_temp), (unsigned long) DUK_HEAPHDR_GET_FLAGS_RAW((duk_heaphdr *) fun_clos))); DUK_ASSERT(DUK_HOBJECT_HAS_EXTENSIBLE(&fun_clos->obj)); DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(&fun_clos->obj)); DUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(&fun_clos->obj)); DUK_ASSERT(!DUK_HOBJECT_HAS_NATFUNC(&fun_clos->obj)); DUK_ASSERT(!DUK_HOBJECT_IS_THREAD(&fun_clos->obj)); /* DUK_HOBJECT_FLAG_ARRAY_PART: don't care */ /* DUK_HOBJECT_FLAG_NEWENV: handled below */ DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARRAY(&fun_clos->obj)); DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(&fun_clos->obj)); DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(&fun_clos->obj)); if (!DUK_HOBJECT_HAS_CONSTRUCTABLE(&fun_clos->obj)) { /* If the template is not constructable don't add an automatic * .prototype property. This is the case for e.g. ES2015 object * literal getters/setters and method definitions. */ add_auto_proto = 0; } /* * Setup environment record properties based on the template and * its flags. * * If DUK_HOBJECT_HAS_NEWENV(fun_temp) is true, the environment * records represent identifiers "outside" the function; the * "inner" environment records are created on demand. Otherwise, * the environment records are those that will be directly used * (e.g. for declarations). * * _Lexenv is always set; _Varenv defaults to _Lexenv if missing, * so _Varenv is only set if _Lexenv != _Varenv. * * This is relatively complex, see doc/identifier-handling.rst. */ if (DUK_HOBJECT_HAS_NEWENV(&fun_clos->obj)) { #if defined(DUK_USE_FUNC_NAME_PROPERTY) if (DUK_HOBJECT_HAS_NAMEBINDING(&fun_clos->obj)) { duk_hobject *proto; duk_hdecenv *new_env; /* * Named function expression, name needs to be bound * in an intermediate environment record. The "outer" * lexical/variable environment will thus be: * * a) { funcname: <func>, __prototype: outer_lex_env } * b) { funcname: <func>, __prototype: <globalenv> } (if outer_lex_env missing) */ if (outer_lex_env) { proto = outer_lex_env; } else { proto = thr->builtins[DUK_BIDX_GLOBAL_ENV]; } /* -> [ ... closure template env ] */ new_env = duk_hdecenv_alloc(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DECENV)); DUK_ASSERT(new_env != NULL); duk_push_hobject(thr, (duk_hobject *) new_env); DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) new_env) == NULL); DUK_HOBJECT_SET_PROTOTYPE(thr->heap, (duk_hobject *) new_env, proto); DUK_HOBJECT_INCREF_ALLOWNULL(thr, proto); DUK_ASSERT(new_env->thread == NULL); /* Closed. */ DUK_ASSERT(new_env->varmap == NULL); /* It's important that duk_xdef_prop() is a 'raw define' so that any * properties in an ancestor are never an issue (they should never be * e.g. non-writable, but just in case). * * Because template objects are not visible to user code, the case * where .name is missing shouldn't happen in practice. It it does, * the name 'undefined' gets bound and maps to the closure (which is * a bit odd, but safe). */ (void) duk_get_prop_stridx_short(thr, -2, DUK_STRIDX_NAME); /* -> [ ... closure template env funcname ] */ duk_dup_m4(thr); /* -> [ ... closure template env funcname closure ] */ duk_xdef_prop(thr, -3, DUK_PROPDESC_FLAGS_NONE); /* -> [ ... closure template env ] */ /* env[funcname] = closure */ /* [ ... closure template env ] */ DUK_HCOMPFUNC_SET_LEXENV(thr->heap, fun_clos, (duk_hobject *) new_env); DUK_HCOMPFUNC_SET_VARENV(thr->heap, fun_clos, (duk_hobject *) new_env); DUK_HOBJECT_INCREF(thr, (duk_hobject *) new_env); DUK_HOBJECT_INCREF(thr, (duk_hobject *) new_env); duk_pop_unsafe(thr); /* [ ... closure template ] */ } else #endif /* DUK_USE_FUNC_NAME_PROPERTY */ { /* * Other cases (function declaration, anonymous function expression, * strict direct eval code). The "outer" environment will be whatever * the caller gave us. */ DUK_HCOMPFUNC_SET_LEXENV(thr->heap, fun_clos, outer_lex_env); DUK_HCOMPFUNC_SET_VARENV(thr->heap, fun_clos, outer_lex_env); DUK_HOBJECT_INCREF(thr, outer_lex_env); DUK_HOBJECT_INCREF(thr, outer_lex_env); /* [ ... closure template ] */ } } else { /* * Function gets no new environment when called. This is the * case for global code, indirect eval code, and non-strict * direct eval code. There is no direct correspondence to the * E5 specification, as global/eval code is not exposed as a * function. */ DUK_ASSERT(!DUK_HOBJECT_HAS_NAMEBINDING(&fun_temp->obj)); DUK_HCOMPFUNC_SET_LEXENV(thr->heap, fun_clos, outer_lex_env); DUK_HCOMPFUNC_SET_VARENV(thr->heap, fun_clos, outer_var_env); DUK_HOBJECT_INCREF(thr, outer_lex_env); /* NULLs not allowed; asserted on entry */ DUK_HOBJECT_INCREF(thr, outer_var_env); } DUK_DDD(DUK_DDDPRINT("closure varenv -> %!ipO, lexenv -> %!ipO", (duk_heaphdr *) fun_clos->var_env, (duk_heaphdr *) fun_clos->lex_env)); /* Call handling assumes this for all callable closures. */ DUK_ASSERT(DUK_HCOMPFUNC_GET_LEXENV(thr->heap, fun_clos) != NULL); DUK_ASSERT(DUK_HCOMPFUNC_GET_VARENV(thr->heap, fun_clos) != NULL); /* * Copy some internal properties directly * * The properties will be non-writable and non-enumerable, but * configurable. */ /* [ ... closure template ] */ DUK_DDD(DUK_DDDPRINT("copying properties: closure=%!iT, template=%!iT", (duk_tval *) duk_get_tval(thr, -2), (duk_tval *) duk_get_tval(thr, -1))); for (i = 0; i < (duk_small_uint_t) (sizeof(duk__closure_copy_proplist) / sizeof(duk_uint16_t)); i++) { duk_small_int_t stridx = (duk_small_int_t) duk__closure_copy_proplist[i]; if (duk_get_prop_stridx_short(thr, -1, stridx)) { /* [ ... closure template val ] */ DUK_DDD(DUK_DDDPRINT("copying property, stridx=%ld -> found", (long) stridx)); duk_xdef_prop_stridx_short(thr, -3, stridx, DUK_PROPDESC_FLAGS_C); } else { DUK_DDD(DUK_DDDPRINT("copying property, stridx=%ld -> not found", (long) stridx)); duk_pop_unsafe(thr); } } /* * "length" maps to number of formals (E5 Section 13.2) for function * declarations/expressions (non-bound functions). Note that 'nargs' * is NOT necessarily equal to the number of arguments. Use length * of _Formals; if missing, assume nargs matches .length. */ /* [ ... closure template ] */ /* XXX: these lookups should be just own property lookups instead of * looking up the inheritance chain. */ if (duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_FORMALS)) { /* [ ... closure template formals ] */ len_value = (duk_uint_t) duk_get_length(thr, -1); /* could access duk_harray directly, not important */ DUK_DD(DUK_DDPRINT("closure length from _Formals -> %ld", (long) len_value)); } else { len_value = fun_temp->nargs; DUK_DD(DUK_DDPRINT("closure length defaulted from nargs -> %ld", (long) len_value)); } duk_pop_unsafe(thr); duk_push_uint(thr, len_value); /* [ ... closure template len_value ] */ duk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_C); /* * "prototype" is, by default, a fresh object with the "constructor" * property. * * Note that this creates a circular reference for every function * instance (closure) which prevents refcount-based collection of * function instances. * * XXX: Try to avoid creating the default prototype object, because * many functions are not used as constructors and the default * prototype is unnecessary. Perhaps it could be created on-demand * when it is first accessed? */ /* [ ... closure template ] */ if (add_auto_proto) { duk_push_object(thr); /* -> [ ... closure template newobj ] */ duk_dup_m3(thr); /* -> [ ... closure template newobj closure ] */ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_CONSTRUCTOR, DUK_PROPDESC_FLAGS_WC); /* -> [ ... closure template newobj ] */ duk_compact(thr, -1); /* compact the prototype */ duk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_PROTOTYPE, DUK_PROPDESC_FLAGS_W); /* -> [ ... closure template ] */ } /* * "arguments" and "caller" must be mapped to throwers for strict * mode and bound functions (E5 Section 15.3.5). * * XXX: This is expensive to have for every strict function instance. * Try to implement as virtual properties or on-demand created properties. */ /* [ ... closure template ] */ if (DUK_HOBJECT_HAS_STRICT(&fun_clos->obj)) { duk_xdef_prop_stridx_thrower(thr, -2, DUK_STRIDX_CALLER); duk_xdef_prop_stridx_thrower(thr, -2, DUK_STRIDX_LC_ARGUMENTS); } else { #if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY) DUK_DDD(DUK_DDDPRINT("function is non-strict and non-standard 'caller' property in use, add initial 'null' value")); duk_push_null(thr); duk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_CALLER, DUK_PROPDESC_FLAGS_NONE); #else DUK_DDD(DUK_DDDPRINT("function is non-strict and non-standard 'caller' property not used")); #endif } /* * "name" used to be non-standard but is now defined by ES2015. * In ES2015/ES2016 the .name property is configurable. */ /* [ ... closure template ] */ #if defined(DUK_USE_FUNC_NAME_PROPERTY) /* XXX: Look for own property only; doesn't matter much because * templates are bare objects. */ if (duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_NAME)) { /* [ ... closure template name ] */ DUK_ASSERT(duk_is_string(thr, -1)); DUK_DD(DUK_DDPRINT("setting function instance name to %!T", duk_get_tval(thr, -1))); duk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_C); /* -> [ ... closure template ] */ } else { /* Anonymous functions don't have a .name in ES2015, so don't set * it on the instance either. The instance will then inherit * it from Function.prototype.name. */ DUK_DD(DUK_DDPRINT("not setting function instance .name")); duk_pop_unsafe(thr); } #endif /* * Compact the closure, in most cases no properties will be added later. * Also, without this the closures end up having unused property slots * (e.g. in Duktape 0.9.0, 8 slots would be allocated and only 7 used). * A better future solution would be to allocate the closure directly * to correct size (and setup the properties directly without going * through the API). */ duk_compact(thr, -2); /* * Some assertions (E5 Section 13.2). */ DUK_ASSERT(DUK_HOBJECT_GET_CLASS_NUMBER(&fun_clos->obj) == DUK_HOBJECT_CLASS_FUNCTION); DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, &fun_clos->obj) == thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]); DUK_ASSERT(DUK_HOBJECT_HAS_EXTENSIBLE(&fun_clos->obj)); DUK_ASSERT(duk_has_prop_stridx(thr, -2, DUK_STRIDX_LENGTH) != 0); DUK_ASSERT(add_auto_proto == 0 || duk_has_prop_stridx(thr, -2, DUK_STRIDX_PROTOTYPE) != 0); /* May be missing .name */ DUK_ASSERT(!DUK_HOBJECT_HAS_STRICT(&fun_clos->obj) || duk_has_prop_stridx(thr, -2, DUK_STRIDX_CALLER) != 0); DUK_ASSERT(!DUK_HOBJECT_HAS_STRICT(&fun_clos->obj) || duk_has_prop_stridx(thr, -2, DUK_STRIDX_LC_ARGUMENTS) != 0); /* * Finish */ /* [ ... closure template ] */ DUK_DDD(DUK_DDDPRINT("created function instance: template=%!iT -> closure=%!iT", (duk_tval *) duk_get_tval(thr, -1), (duk_tval *) duk_get_tval(thr, -2))); duk_pop_unsafe(thr); /* [ ... closure ] */ } /* * Delayed activation environment record initialization (for functions * with NEWENV). * * The non-delayed initialization is handled by duk_handle_call(). */ /* shared helper */ DUK_INTERNAL duk_hobject *duk_create_activation_environment_record(duk_hthread *thr, duk_hobject *func, duk_size_t bottom_byteoff) { duk_hdecenv *env; duk_hobject *parent; duk_hcompfunc *f; DUK_ASSERT(thr != NULL); DUK_ASSERT(func != NULL); f = (duk_hcompfunc *) func; parent = DUK_HCOMPFUNC_GET_LEXENV(thr->heap, f); if (!parent) { parent = thr->builtins[DUK_BIDX_GLOBAL_ENV]; } env = duk_hdecenv_alloc(thr, DUK_HOBJECT_FLAG_EXTENSIBLE | DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DECENV)); DUK_ASSERT(env != NULL); duk_push_hobject(thr, (duk_hobject *) env); DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) env) == NULL); DUK_HOBJECT_SET_PROTOTYPE(thr->heap, (duk_hobject *) env, parent); DUK_HOBJECT_INCREF_ALLOWNULL(thr, parent); /* parent env is the prototype */ /* open scope information, for compiled functions only */ DUK_ASSERT(env->thread == NULL); DUK_ASSERT(env->varmap == NULL); DUK_ASSERT(env->regbase_byteoff == 0); if (DUK_HOBJECT_IS_COMPFUNC(func)) { duk_hobject *varmap; duk_tval *tv; tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, func, DUK_HTHREAD_STRING_INT_VARMAP(thr)); if (tv != NULL && DUK_TVAL_IS_OBJECT(tv)) { DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv)); varmap = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(varmap != NULL); env->varmap = varmap; DUK_HOBJECT_INCREF(thr, varmap); env->thread = thr; DUK_HTHREAD_INCREF(thr, thr); env->regbase_byteoff = bottom_byteoff; } else { /* If function has no _Varmap, leave the environment closed. */ DUK_ASSERT(env->thread == NULL); DUK_ASSERT(env->varmap == NULL); DUK_ASSERT(env->regbase_byteoff == 0); } } return (duk_hobject *) env; } DUK_INTERNAL void duk_js_init_activation_environment_records_delayed(duk_hthread *thr, duk_activation *act) { duk_hobject *func; duk_hobject *env; DUK_ASSERT(thr != NULL); func = DUK_ACT_GET_FUNC(act); DUK_ASSERT(func != NULL); DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(func)); /* bound functions are never in act 'func' */ /* * Delayed initialization only occurs for 'NEWENV' functions. */ DUK_ASSERT(DUK_HOBJECT_HAS_NEWENV(func)); DUK_ASSERT(act->lex_env == NULL); DUK_ASSERT(act->var_env == NULL); env = duk_create_activation_environment_record(thr, func, act->bottom_byteoff); DUK_ASSERT(env != NULL); /* 'act' is a stable pointer, so still OK. */ DUK_DDD(DUK_DDDPRINT("created delayed fresh env: %!ipO", (duk_heaphdr *) env)); #if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) { duk_hobject *p = env; while (p) { DUK_DDD(DUK_DDDPRINT(" -> %!ipO", (duk_heaphdr *) p)); p = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, p); } } #endif act->lex_env = env; act->var_env = env; DUK_HOBJECT_INCREF(thr, env); /* XXX: incref by count (here 2 times) */ DUK_HOBJECT_INCREF(thr, env); duk_pop_unsafe(thr); } /* * Closing environment records. * * The environment record MUST be closed with the thread where its activation * is; i.e. if 'env' is open, 'thr' must match env->thread, and the regbase * and varmap must still be valid. On entry, 'env' must be reachable. */ DUK_INTERNAL void duk_js_close_environment_record(duk_hthread *thr, duk_hobject *env) { duk_uint_fast32_t i; duk_hobject *varmap; duk_hstring *key; duk_tval *tv; duk_uint_t regnum; DUK_ASSERT(thr != NULL); DUK_ASSERT(env != NULL); if (DUK_UNLIKELY(!DUK_HOBJECT_IS_DECENV(env))) { DUK_DDD(DUK_DDDPRINT("env not a declarative record: %!iO", (duk_heaphdr *) env)); return; } varmap = ((duk_hdecenv *) env)->varmap; if (varmap == NULL) { DUK_DDD(DUK_DDDPRINT("env already closed: %!iO", (duk_heaphdr *) env)); return; } DUK_ASSERT(((duk_hdecenv *) env)->thread != NULL); DUK_ASSERT_HDECENV_VALID((duk_hdecenv *) env); DUK_DDD(DUK_DDDPRINT("closing env: %!iO", (duk_heaphdr *) env)); DUK_DDD(DUK_DDDPRINT("varmap: %!O", (duk_heaphdr *) varmap)); /* Env must be closed in the same thread as where it runs. */ DUK_ASSERT(((duk_hdecenv *) env)->thread == thr); /* XXX: additional conditions when to close variables? we don't want to do it * unless the environment may have "escaped" (referenced in a function closure). * With delayed environments, the existence is probably good enough of a check. */ /* Note: we rely on the _Varmap having a bunch of nice properties, like: * - being compacted and unmodified during this process * - not containing an array part * - having correct value types */ DUK_DDD(DUK_DDDPRINT("copying bound register values, %ld bound regs", (long) DUK_HOBJECT_GET_ENEXT(varmap))); /* Copy over current variable values from value stack to the * environment record. The scope object is empty but may * inherit from another scope which has conflicting names. */ /* XXX: Do this using a once allocated entry area, no side effects. * Hash part would need special treatment however (maybe copy, and * then realloc with hash part if large enough). */ for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ENEXT(varmap); i++) { duk_size_t regbase_byteoff; key = DUK_HOBJECT_E_GET_KEY(thr->heap, varmap, i); DUK_ASSERT(key != NULL); /* assume keys are compact in _Varmap */ DUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, varmap, i)); /* assume plain values */ tv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, varmap, i); DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); DUK_ASSERT(DUK_TVAL_GET_NUMBER(tv) <= (duk_double_t) DUK_UINT32_MAX); /* limits */ #if defined(DUK_USE_FASTINT) DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv)); regnum = (duk_uint_t) DUK_TVAL_GET_FASTINT_U32(tv); #else regnum = (duk_uint_t) DUK_TVAL_GET_NUMBER(tv); #endif regbase_byteoff = ((duk_hdecenv *) env)->regbase_byteoff; DUK_ASSERT((duk_uint8_t *) thr->valstack + regbase_byteoff + sizeof(duk_tval) * regnum >= (duk_uint8_t *) thr->valstack); DUK_ASSERT((duk_uint8_t *) thr->valstack + regbase_byteoff + sizeof(duk_tval) * regnum < (duk_uint8_t *) thr->valstack_top); /* If property already exists, overwrites silently. * Property is writable, but not deletable (not configurable * in terms of property attributes). */ duk_push_tval(thr, (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + regbase_byteoff + sizeof(duk_tval) * regnum)); DUK_DDD(DUK_DDDPRINT("closing identifier %!O -> reg %ld, value %!T", (duk_heaphdr *) key, (long) regnum, (duk_tval *) duk_get_tval(thr, -1))); duk_hobject_define_property_internal(thr, env, key, DUK_PROPDESC_FLAGS_WE); } /* NULL atomically to avoid inconsistent state + side effects. */ DUK_HOBJECT_DECREF_NORZ(thr, ((duk_hdecenv *) env)->thread); DUK_HOBJECT_DECREF_NORZ(thr, ((duk_hdecenv *) env)->varmap); ((duk_hdecenv *) env)->thread = NULL; ((duk_hdecenv *) env)->varmap = NULL; DUK_DDD(DUK_DDDPRINT("env after closing: %!O", (duk_heaphdr *) env)); } /* * GETIDREF: a GetIdentifierReference-like helper. * * Provides a parent traversing lookup and a single level lookup * (for HasBinding). * * Instead of returning the value, returns a bunch of values allowing * the caller to read, write, or delete the binding. Value pointers * are duk_tval pointers which can be mutated directly as long as * refcounts are properly updated. Note that any operation which may * reallocate valstacks or compact objects may invalidate the returned * duk_tval (but not object) pointers, so caller must be very careful. * * If starting environment record 'env' is given, 'act' is ignored. * However, if 'env' is NULL, the caller may identify, in 'act', an * activation which hasn't had its declarative environment initialized * yet. The activation registers are then looked up, and its parent * traversed normally. * * The 'out' structure values are only valid if the function returns * success (non-zero). */ /* lookup name from an open declarative record's registers */ DUK_LOCAL duk_bool_t duk__getid_open_decl_env_regs(duk_hthread *thr, duk_hstring *name, duk_hdecenv *env, duk__id_lookup_result *out) { duk_tval *tv; duk_size_t reg_rel; DUK_ASSERT(thr != NULL); DUK_ASSERT(name != NULL); DUK_ASSERT(env != NULL); DUK_ASSERT(out != NULL); DUK_ASSERT(DUK_HOBJECT_IS_DECENV((duk_hobject *) env)); DUK_ASSERT_HDECENV_VALID(env); if (env->thread == NULL) { /* already closed */ return 0; } DUK_ASSERT(env->varmap != NULL); tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, env->varmap, name); if (DUK_UNLIKELY(tv == NULL)) { return 0; } DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); DUK_ASSERT(DUK_TVAL_GET_NUMBER(tv) <= (duk_double_t) DUK_UINT32_MAX); /* limits */ #if defined(DUK_USE_FASTINT) DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv)); reg_rel = (duk_size_t) DUK_TVAL_GET_FASTINT_U32(tv); #else reg_rel = (duk_size_t) DUK_TVAL_GET_NUMBER(tv); #endif DUK_ASSERT_DISABLE(reg_rel >= 0); /* unsigned */ tv = (duk_tval *) (void *) ((duk_uint8_t *) env->thread->valstack + env->regbase_byteoff + sizeof(duk_tval) * reg_rel); DUK_ASSERT(tv >= env->thread->valstack && tv < env->thread->valstack_end); /* XXX: more accurate? */ out->value = tv; out->attrs = DUK_PROPDESC_FLAGS_W; /* registers are mutable, non-deletable */ out->env = (duk_hobject *) env; out->holder = NULL; out->has_this = 0; return 1; } /* lookup name from current activation record's functions' registers */ DUK_LOCAL duk_bool_t duk__getid_activation_regs(duk_hthread *thr, duk_hstring *name, duk_activation *act, duk__id_lookup_result *out) { duk_tval *tv; duk_hobject *func; duk_hobject *varmap; duk_size_t reg_rel; DUK_ASSERT(thr != NULL); DUK_ASSERT(name != NULL); DUK_ASSERT(act != NULL); DUK_ASSERT(out != NULL); func = DUK_ACT_GET_FUNC(act); DUK_ASSERT(func != NULL); DUK_ASSERT(DUK_HOBJECT_HAS_NEWENV(func)); if (!DUK_HOBJECT_IS_COMPFUNC(func)) { return 0; } /* XXX: move varmap to duk_hcompfunc struct field. */ tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, func, DUK_HTHREAD_STRING_INT_VARMAP(thr)); if (!tv) { return 0; } DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv)); varmap = DUK_TVAL_GET_OBJECT(tv); DUK_ASSERT(varmap != NULL); tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, varmap, name); if (!tv) { return 0; } DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); reg_rel = (duk_size_t) DUK_TVAL_GET_NUMBER(tv); DUK_ASSERT_DISABLE(reg_rel >= 0); DUK_ASSERT(reg_rel < ((duk_hcompfunc *) func)->nregs); tv = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + act->bottom_byteoff); tv += reg_rel; out->value = tv; out->attrs = DUK_PROPDESC_FLAGS_W; /* registers are mutable, non-deletable */ out->env = NULL; out->holder = NULL; out->has_this = 0; return 1; } DUK_LOCAL duk_bool_t duk__get_identifier_reference(duk_hthread *thr, duk_hobject *env, duk_hstring *name, duk_activation *act, duk_bool_t parents, duk__id_lookup_result *out) { duk_tval *tv; duk_uint_t sanity; DUK_ASSERT(thr != NULL); DUK_ASSERT(env != NULL || act != NULL); DUK_ASSERT(name != NULL); DUK_ASSERT(out != NULL); DUK_ASSERT(!env || DUK_HOBJECT_IS_ENV(env)); DUK_ASSERT(!env || !DUK_HOBJECT_HAS_ARRAY_PART(env)); /* * Conceptually, we look for the identifier binding by starting from * 'env' and following to chain of environment records (represented * by the prototype chain). * * If 'env' is NULL, the current activation does not yet have an * allocated declarative environment record; this should be treated * exactly as if the environment record existed but had no bindings * other than register bindings. * * Note: we assume that with the DUK_HOBJECT_FLAG_NEWENV cleared * the environment will always be initialized immediately; hence * a NULL 'env' should only happen with the flag set. This is the * case for: (1) function calls, and (2) strict, direct eval calls. */ if (env == NULL && act != NULL) { duk_hobject *func; duk_hcompfunc *f; DUK_DDD(DUK_DDDPRINT("duk__get_identifier_reference: env is NULL, activation is non-NULL -> " "delayed env case, look up activation regs first")); /* * Try registers */ if (duk__getid_activation_regs(thr, name, act, out)) { DUK_DDD(DUK_DDDPRINT("duk__get_identifier_reference successful: " "name=%!O -> value=%!T, attrs=%ld, has_this=%ld, env=%!O, holder=%!O " "(found from register bindings when env=NULL)", (duk_heaphdr *) name, (duk_tval *) out->value, (long) out->attrs, (long) out->has_this, (duk_heaphdr *) out->env, (duk_heaphdr *) out->holder)); return 1; } DUK_DDD(DUK_DDDPRINT("not found in current activation regs")); /* * Not found in registers, proceed to the parent record. * Here we need to determine what the parent would be, * if 'env' was not NULL (i.e. same logic as when initializing * the record). * * Note that environment initialization is only deferred when * DUK_HOBJECT_HAS_NEWENV is set, and this only happens for: * - Function code * - Strict eval code * * We only need to check _Lexenv here; _Varenv exists only if it * differs from _Lexenv (and thus _Lexenv will also be present). */ if (!parents) { DUK_DDD(DUK_DDDPRINT("duk__get_identifier_reference failed, no parent traversal " "(not found from register bindings when env=NULL)")); goto fail_not_found; } func = DUK_ACT_GET_FUNC(act); DUK_ASSERT(func != NULL); DUK_ASSERT(DUK_HOBJECT_HAS_NEWENV(func)); f = (duk_hcompfunc *) func; env = DUK_HCOMPFUNC_GET_LEXENV(thr->heap, f); if (!env) { env = thr->builtins[DUK_BIDX_GLOBAL_ENV]; } DUK_DDD(DUK_DDDPRINT("continue lookup from env: %!iO", (duk_heaphdr *) env)); } /* * Prototype walking starting from 'env'. * * ('act' is not needed anywhere here.) */ sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY; while (env != NULL) { duk_small_uint_t cl; duk_uint_t attrs; DUK_DDD(DUK_DDDPRINT("duk__get_identifier_reference, name=%!O, considering env=%p -> %!iO", (duk_heaphdr *) name, (void *) env, (duk_heaphdr *) env)); DUK_ASSERT(env != NULL); DUK_ASSERT(DUK_HOBJECT_IS_ENV(env)); DUK_ASSERT(!DUK_HOBJECT_HAS_ARRAY_PART(env)); cl = DUK_HOBJECT_GET_CLASS_NUMBER(env); DUK_ASSERT(cl == DUK_HOBJECT_CLASS_OBJENV || cl == DUK_HOBJECT_CLASS_DECENV); if (cl == DUK_HOBJECT_CLASS_DECENV) { /* * Declarative environment record. * * Identifiers can never be stored in ancestors and are * always plain values, so we can use an internal helper * and access the value directly with an duk_tval ptr. * * A closed environment is only indicated by it missing * the "book-keeping" properties required for accessing * register-bound variables. */ DUK_ASSERT_HDECENV_VALID((duk_hdecenv *) env); if (duk__getid_open_decl_env_regs(thr, name, (duk_hdecenv *) env, out)) { DUK_DDD(DUK_DDDPRINT("duk__get_identifier_reference successful: " "name=%!O -> value=%!T, attrs=%ld, has_this=%ld, env=%!O, holder=%!O " "(declarative environment record, scope open, found in regs)", (duk_heaphdr *) name, (duk_tval *) out->value, (long) out->attrs, (long) out->has_this, (duk_heaphdr *) out->env, (duk_heaphdr *) out->holder)); return 1; } tv = duk_hobject_find_existing_entry_tval_ptr_and_attrs(thr->heap, env, name, &attrs); if (tv) { out->value = tv; out->attrs = attrs; out->env = env; out->holder = env; out->has_this = 0; DUK_DDD(DUK_DDDPRINT("duk__get_identifier_reference successful: " "name=%!O -> value=%!T, attrs=%ld, has_this=%ld, env=%!O, holder=%!O " "(declarative environment record, found in properties)", (duk_heaphdr *) name, (duk_tval *) out->value, (long) out->attrs, (long) out->has_this, (duk_heaphdr *) out->env, (duk_heaphdr *) out->holder)); return 1; } } else { /* * Object environment record. * * Binding (target) object is an external, uncontrolled object. * Identifier may be bound in an ancestor property, and may be * an accessor. Target can also be a Proxy which we must support * here. */ /* XXX: we could save space by using _Target OR _This. If _Target, assume * this binding is undefined. If _This, assumes this binding is _This, and * target is also _This. One property would then be enough. */ duk_hobject *target; duk_bool_t found; DUK_ASSERT(cl == DUK_HOBJECT_CLASS_OBJENV); DUK_ASSERT_HOBJENV_VALID((duk_hobjenv *) env); target = ((duk_hobjenv *) env)->target; DUK_ASSERT(target != NULL); /* Target may be a Proxy or property may be an accessor, so we must * use an actual, Proxy-aware hasprop check here. * * out->holder is NOT set to the actual duk_hobject where the * property is found, but rather the object binding target object. */ #if defined(DUK_USE_ES6_PROXY) if (DUK_UNLIKELY(DUK_HOBJECT_IS_PROXY(target))) { duk_tval tv_name; duk_tval tv_target_tmp; DUK_ASSERT(name != NULL); DUK_TVAL_SET_STRING(&tv_name, name); DUK_TVAL_SET_OBJECT(&tv_target_tmp, target); found = duk_hobject_hasprop(thr, &tv_target_tmp, &tv_name); } else #endif /* DUK_USE_ES6_PROXY */ { /* XXX: duk_hobject_hasprop() would be correct for * non-Proxy objects too, but it is about ~20-25% * slower at present so separate code paths for * Proxy and non-Proxy now. */ found = duk_hobject_hasprop_raw(thr, target, name); } if (found) { out->value = NULL; /* can't get value, may be accessor */ out->attrs = 0; /* irrelevant when out->value == NULL */ out->env = env; out->holder = target; out->has_this = ((duk_hobjenv *) env)->has_this; DUK_DDD(DUK_DDDPRINT("duk__get_identifier_reference successful: " "name=%!O -> value=%!T, attrs=%ld, has_this=%ld, env=%!O, holder=%!O " "(object environment record)", (duk_heaphdr *) name, (duk_tval *) out->value, (long) out->attrs, (long) out->has_this, (duk_heaphdr *) out->env, (duk_heaphdr *) out->holder)); return 1; } } if (!parents) { DUK_DDD(DUK_DDDPRINT("duk__get_identifier_reference failed, no parent traversal " "(not found from first traversed env)")); goto fail_not_found; } if (DUK_UNLIKELY(sanity-- == 0)) { DUK_ERROR_RANGE(thr, DUK_STR_PROTOTYPE_CHAIN_LIMIT); } env = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, env); } /* * Not found (even in global object) */ fail_not_found: return 0; } /* * HASVAR: check identifier binding from a given environment record * without traversing its parents. * * This primitive is not exposed to user code as such, but is used * internally for e.g. declaration binding instantiation. * * See E5 Sections: * 10.2.1.1.1 HasBinding(N) * 10.2.1.2.1 HasBinding(N) * * Note: strictness has no bearing on this check. Hence we don't take * a 'strict' parameter. */ #if 0 /*unused*/ DUK_INTERNAL duk_bool_t duk_js_hasvar_envrec(duk_hthread *thr, duk_hobject *env, duk_hstring *name) { duk__id_lookup_result ref; duk_bool_t parents; DUK_DDD(DUK_DDDPRINT("hasvar: thr=%p, env=%p, name=%!O " "(env -> %!dO)", (void *) thr, (void *) env, (duk_heaphdr *) name, (duk_heaphdr *) env)); DUK_ASSERT(thr != NULL); DUK_ASSERT(env != NULL); DUK_ASSERT(name != NULL); DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(env); DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(name); DUK_ASSERT(DUK_HOBJECT_IS_ENV(env)); DUK_ASSERT(!DUK_HOBJECT_HAS_ARRAY_PART(env)); /* lookup results is ignored */ parents = 0; return duk__get_identifier_reference(thr, env, name, NULL, parents, &ref); } #endif /* * GETVAR * * See E5 Sections: * 11.1.2 Identifier Reference * 10.3.1 Identifier Resolution * 11.13.1 Simple Assignment [example of where the Reference is GetValue'd] * 8.7.1 GetValue (V) * 8.12.1 [[GetOwnProperty]] (P) * 8.12.2 [[GetProperty]] (P) * 8.12.3 [[Get]] (P) * * If 'throw' is true, always leaves two values on top of stack: [val this]. * * If 'throw' is false, returns 0 if identifier cannot be resolved, and the * stack will be unaffected in this case. If identifier is resolved, returns * 1 and leaves [val this] on top of stack. * * Note: the 'strict' flag of a reference returned by GetIdentifierReference * is ignored by GetValue. Hence we don't take a 'strict' parameter. * * The 'throw' flag is needed for implementing 'typeof' for an unreferenced * identifier. An unreference identifier in other contexts generates a * ReferenceError. */ DUK_LOCAL duk_bool_t duk__getvar_helper(duk_hthread *thr, duk_hobject *env, duk_activation *act, duk_hstring *name, duk_bool_t throw_flag) { duk__id_lookup_result ref; duk_tval tv_tmp_obj; duk_tval tv_tmp_key; duk_bool_t parents; DUK_DDD(DUK_DDDPRINT("getvar: thr=%p, env=%p, act=%p, name=%!O " "(env -> %!dO)", (void *) thr, (void *) env, (void *) act, (duk_heaphdr *) name, (duk_heaphdr *) env)); DUK_ASSERT(thr != NULL); DUK_ASSERT(name != NULL); /* env and act may be NULL */ DUK_STATS_INC(thr->heap, stats_getvar_all); DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(env); DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(name); parents = 1; /* follow parent chain */ if (duk__get_identifier_reference(thr, env, name, act, parents, &ref)) { if (ref.value) { duk_push_tval(thr, ref.value); duk_push_undefined(thr); } else { DUK_ASSERT(ref.holder != NULL); /* ref.holder is safe across the getprop call (even * with side effects) because 'env' is reachable and * ref.holder is a direct heap pointer. */ DUK_TVAL_SET_OBJECT(&tv_tmp_obj, ref.holder); DUK_TVAL_SET_STRING(&tv_tmp_key, name); (void) duk_hobject_getprop(thr, &tv_tmp_obj, &tv_tmp_key); /* [value] */ if (ref.has_this) { duk_push_hobject(thr, ref.holder); } else { duk_push_undefined(thr); } /* [value this] */ } return 1; } else { if (throw_flag) { DUK_ERROR_FMT1(thr, DUK_ERR_REFERENCE_ERROR, "identifier '%s' undefined", (const char *) DUK_HSTRING_GET_DATA(name)); } return 0; } } DUK_INTERNAL duk_bool_t duk_js_getvar_envrec(duk_hthread *thr, duk_hobject *env, duk_hstring *name, duk_bool_t throw_flag) { return duk__getvar_helper(thr, env, NULL, name, throw_flag); } DUK_INTERNAL duk_bool_t duk_js_getvar_activation(duk_hthread *thr, duk_activation *act, duk_hstring *name, duk_bool_t throw_flag) { DUK_ASSERT(act != NULL); return duk__getvar_helper(thr, act->lex_env, act, name, throw_flag); } /* * PUTVAR * * See E5 Sections: * 11.1.2 Identifier Reference * 10.3.1 Identifier Resolution * 11.13.1 Simple Assignment [example of where the Reference is PutValue'd] * 8.7.2 PutValue (V,W) [see especially step 3.b, undefined -> automatic global in non-strict mode] * 8.12.4 [[CanPut]] (P) * 8.12.5 [[Put]] (P) * * Note: may invalidate any valstack (or object) duk_tval pointers because * putting a value may reallocate any object or any valstack. Caller beware. */ DUK_LOCAL void duk__putvar_helper(duk_hthread *thr, duk_hobject *env, duk_activation *act, duk_hstring *name, duk_tval *val, duk_bool_t strict) { duk__id_lookup_result ref; duk_tval tv_tmp_obj; duk_tval tv_tmp_key; duk_bool_t parents; DUK_STATS_INC(thr->heap, stats_putvar_all); DUK_DDD(DUK_DDDPRINT("putvar: thr=%p, env=%p, act=%p, name=%!O, val=%p, strict=%ld " "(env -> %!dO, val -> %!T)", (void *) thr, (void *) env, (void *) act, (duk_heaphdr *) name, (void *) val, (long) strict, (duk_heaphdr *) env, (duk_tval *) val)); DUK_ASSERT(thr != NULL); DUK_ASSERT(name != NULL); DUK_ASSERT(val != NULL); /* env and act may be NULL */ DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(env); DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(name); DUK_ASSERT_REFCOUNT_NONZERO_TVAL(val); /* * In strict mode E5 protects 'eval' and 'arguments' from being * assigned to (or even declared anywhere). Attempt to do so * should result in a compile time SyntaxError. See the internal * design documentation for details. * * Thus, we should never come here, run-time, for strict code, * and name 'eval' or 'arguments'. */ DUK_ASSERT(!strict || (name != DUK_HTHREAD_STRING_EVAL(thr) && name != DUK_HTHREAD_STRING_LC_ARGUMENTS(thr))); /* * Lookup variable and update in-place if found. */ parents = 1; /* follow parent chain */ if (duk__get_identifier_reference(thr, env, name, act, parents, &ref)) { if (ref.value && (ref.attrs & DUK_PROPDESC_FLAG_WRITABLE)) { /* Update duk_tval in-place if pointer provided and the * property is writable. If the property is not writable * (immutable binding), use duk_hobject_putprop() which * will respect mutability. */ duk_tval *tv_val; tv_val = ref.value; DUK_ASSERT(tv_val != NULL); DUK_TVAL_SET_TVAL_UPDREF(thr, tv_val, val); /* side effects */ /* ref.value invalidated here */ } else { DUK_ASSERT(ref.holder != NULL); DUK_TVAL_SET_OBJECT(&tv_tmp_obj, ref.holder); DUK_TVAL_SET_STRING(&tv_tmp_key, name); (void) duk_hobject_putprop(thr, &tv_tmp_obj, &tv_tmp_key, val, strict); /* ref.value invalidated here */ } return; } /* * Not found: write to global object (non-strict) or ReferenceError * (strict); see E5 Section 8.7.2, step 3. */ if (strict) { DUK_DDD(DUK_DDDPRINT("identifier binding not found, strict => reference error")); DUK_ERROR_FMT1(thr, DUK_ERR_REFERENCE_ERROR, "identifier '%s' undefined", (const char *) DUK_HSTRING_GET_DATA(name)); } DUK_DDD(DUK_DDDPRINT("identifier binding not found, not strict => set to global")); DUK_TVAL_SET_OBJECT(&tv_tmp_obj, thr->builtins[DUK_BIDX_GLOBAL]); DUK_TVAL_SET_STRING(&tv_tmp_key, name); (void) duk_hobject_putprop(thr, &tv_tmp_obj, &tv_tmp_key, val, 0); /* 0 = no throw */ /* NB: 'val' may be invalidated here because put_value may realloc valstack, * caller beware. */ } DUK_INTERNAL void duk_js_putvar_envrec(duk_hthread *thr, duk_hobject *env, duk_hstring *name, duk_tval *val, duk_bool_t strict) { duk__putvar_helper(thr, env, NULL, name, val, strict); } DUK_INTERNAL void duk_js_putvar_activation(duk_hthread *thr, duk_activation *act, duk_hstring *name, duk_tval *val, duk_bool_t strict) { DUK_ASSERT(act != NULL); duk__putvar_helper(thr, act->lex_env, act, name, val, strict); } /* * DELVAR * * See E5 Sections: * 11.4.1 The delete operator * 10.2.1.1.5 DeleteBinding (N) [declarative environment record] * 10.2.1.2.5 DeleteBinding (N) [object environment record] * * Variable bindings established inside eval() are deletable (configurable), * other bindings are not, including variables declared in global level. * Registers are always non-deletable, and the deletion of other bindings * is controlled by the configurable flag. * * For strict mode code, the 'delete' operator should fail with a compile * time SyntaxError if applied to identifiers. Hence, no strict mode * run-time deletion of identifiers should ever happen. This function * should never be called from strict mode code! */ DUK_LOCAL duk_bool_t duk__delvar_helper(duk_hthread *thr, duk_hobject *env, duk_activation *act, duk_hstring *name) { duk__id_lookup_result ref; duk_bool_t parents; DUK_DDD(DUK_DDDPRINT("delvar: thr=%p, env=%p, act=%p, name=%!O " "(env -> %!dO)", (void *) thr, (void *) env, (void *) act, (duk_heaphdr *) name, (duk_heaphdr *) env)); DUK_ASSERT(thr != NULL); DUK_ASSERT(name != NULL); /* env and act may be NULL */ DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(name); parents = 1; /* follow parent chain */ if (duk__get_identifier_reference(thr, env, name, act, parents, &ref)) { if (ref.value && !(ref.attrs & DUK_PROPDESC_FLAG_CONFIGURABLE)) { /* Identifier found in registers (always non-deletable) * or declarative environment record and non-configurable. */ return 0; } DUK_ASSERT(ref.holder != NULL); return duk_hobject_delprop_raw(thr, ref.holder, name, 0); } /* * Not found (even in global object). * * In non-strict mode this is a silent SUCCESS (!), see E5 Section 11.4.1, * step 3.b. In strict mode this case is a compile time SyntaxError so * we should not come here. */ DUK_DDD(DUK_DDDPRINT("identifier to be deleted not found: name=%!O " "(treated as silent success)", (duk_heaphdr *) name)); return 1; } #if 0 /*unused*/ DUK_INTERNAL duk_bool_t duk_js_delvar_envrec(duk_hthread *thr, duk_hobject *env, duk_hstring *name) { return duk__delvar_helper(thr, env, NULL, name); } #endif DUK_INTERNAL duk_bool_t duk_js_delvar_activation(duk_hthread *thr, duk_activation *act, duk_hstring *name) { DUK_ASSERT(act != NULL); return duk__delvar_helper(thr, act->lex_env, act, name); } /* * DECLVAR * * See E5 Sections: * 10.4.3 Entering Function Code * 10.5 Declaration Binding Instantion * 12.2 Variable Statement * 11.1.2 Identifier Reference * 10.3.1 Identifier Resolution * * Variable declaration behavior is mainly discussed in Section 10.5, * and is not discussed in the execution semantics (Sections 11-13). * * Conceptually declarations happen when code (global, eval, function) * is entered, before any user code is executed. In practice, register- * bound identifiers are 'declared' automatically (by virtue of being * allocated to registers with the initial value 'undefined'). Other * identifiers are declared in the function prologue with this primitive. * * Since non-register bindings eventually back to an internal object's * properties, the 'prop_flags' argument is used to specify binding * type: * * - Immutable binding: set DUK_PROPDESC_FLAG_WRITABLE to false * - Non-deletable binding: set DUK_PROPDESC_FLAG_CONFIGURABLE to false * - The flag DUK_PROPDESC_FLAG_ENUMERABLE should be set, although it * doesn't really matter for internal objects * * All bindings are non-deletable mutable bindings except: * * - Declarations in eval code (mutable, deletable) * - 'arguments' binding in strict function code (immutable) * - Function name binding of a function expression (immutable) * * Declarations may go to declarative environment records (always * so for functions), but may also go to object environment records * (e.g. global code). The global object environment has special * behavior when re-declaring a function (but not a variable); see * E5.1 specification, Section 10.5, step 5.e. * * Declarations always go to the 'top-most' environment record, i.e. * we never check the record chain. It's not an error even if a * property (even an immutable or non-deletable one) of the same name * already exists. * * If a declared variable already exists, its value needs to be updated * (if possible). Returns 1 if a PUTVAR needs to be done by the caller; * otherwise returns 0. */ DUK_LOCAL duk_bool_t duk__declvar_helper(duk_hthread *thr, duk_hobject *env, duk_hstring *name, duk_tval *val, duk_small_uint_t prop_flags, duk_bool_t is_func_decl) { duk_hobject *holder; duk_bool_t parents; duk__id_lookup_result ref; duk_tval *tv; DUK_DDD(DUK_DDDPRINT("declvar: thr=%p, env=%p, name=%!O, val=%!T, prop_flags=0x%08lx, is_func_decl=%ld " "(env -> %!iO)", (void *) thr, (void *) env, (duk_heaphdr *) name, (duk_tval *) val, (unsigned long) prop_flags, (unsigned int) is_func_decl, (duk_heaphdr *) env)); DUK_ASSERT(thr != NULL); DUK_ASSERT(env != NULL); DUK_ASSERT(name != NULL); DUK_ASSERT(val != NULL); /* Note: in strict mode the compiler should reject explicit * declaration of 'eval' or 'arguments'. However, internal * bytecode may declare 'arguments' in the function prologue. * We don't bother checking (or asserting) for these now. */ /* Note: val is a stable duk_tval pointer. The caller makes * a value copy into its stack frame, so 'tv_val' is not subject * to side effects here. */ /* * Check whether already declared. * * We need to check whether the binding exists in the environment * without walking its parents. However, we still need to check * register-bound identifiers and the prototype chain of an object * environment target object. */ parents = 0; /* just check 'env' */ if (duk__get_identifier_reference(thr, env, name, NULL, parents, &ref)) { duk_int_t e_idx; duk_int_t h_idx; duk_small_uint_t flags; /* * Variable already declared, ignore re-declaration. * The only exception is the updated behavior of E5.1 for * global function declarations, E5.1 Section 10.5, step 5.e. * This behavior does not apply to global variable declarations. */ if (!(is_func_decl && env == thr->builtins[DUK_BIDX_GLOBAL_ENV])) { DUK_DDD(DUK_DDDPRINT("re-declare a binding, ignoring")); return 1; /* 1 -> needs a PUTVAR */ } /* * Special behavior in E5.1. * * Note that even though parents == 0, the conflicting property * may be an inherited property (currently our global object's * prototype is Object.prototype). Step 5.e first operates on * the existing property (which is potentially in an ancestor) * and then defines a new property in the global object (and * never modifies the ancestor). * * Also note that this logic would become even more complicated * if the conflicting property might be a virtual one. Object * prototype has no virtual properties, though. * * XXX: this is now very awkward, rework. */ DUK_DDD(DUK_DDDPRINT("re-declare a function binding in global object, " "updated E5.1 processing")); DUK_ASSERT(ref.holder != NULL); holder = ref.holder; /* holder will be set to the target object, not the actual object * where the property was found (see duk__get_identifier_reference()). */ DUK_ASSERT(DUK_HOBJECT_GET_CLASS_NUMBER(holder) == DUK_HOBJECT_CLASS_GLOBAL); DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARRAY(holder)); /* global object doesn't have array part */ /* XXX: use a helper for prototype traversal; no loop check here */ /* must be found: was found earlier, and cannot be inherited */ for (;;) { DUK_ASSERT(holder != NULL); if (duk_hobject_find_existing_entry(thr->heap, holder, name, &e_idx, &h_idx)) { DUK_ASSERT(e_idx >= 0); break; } /* SCANBUILD: NULL pointer dereference, doesn't actually trigger, * asserted above. */ holder = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, holder); } DUK_ASSERT(holder != NULL); DUK_ASSERT(e_idx >= 0); /* SCANBUILD: scan-build produces a NULL pointer dereference warning * below; it never actually triggers because holder is actually never * NULL. */ /* ref.holder is global object, holder is the object with the * conflicting property. */ flags = DUK_HOBJECT_E_GET_FLAGS(thr->heap, holder, e_idx); if (!(flags & DUK_PROPDESC_FLAG_CONFIGURABLE)) { if (flags & DUK_PROPDESC_FLAG_ACCESSOR) { DUK_DDD(DUK_DDDPRINT("existing property is a non-configurable " "accessor -> reject")); goto fail_existing_attributes; } if (!((flags & DUK_PROPDESC_FLAG_WRITABLE) && (flags & DUK_PROPDESC_FLAG_ENUMERABLE))) { DUK_DDD(DUK_DDDPRINT("existing property is a non-configurable " "plain property which is not writable and " "enumerable -> reject")); goto fail_existing_attributes; } DUK_DDD(DUK_DDDPRINT("existing property is not configurable but " "is plain, enumerable, and writable -> " "allow redeclaration")); } if (holder == ref.holder) { /* XXX: if duk_hobject_define_property_internal() was updated * to handle a pre-existing accessor property, this would be * a simple call (like for the ancestor case). */ DUK_DDD(DUK_DDDPRINT("redefine, offending property in global object itself")); if (flags & DUK_PROPDESC_FLAG_ACCESSOR) { duk_hobject *tmp; tmp = DUK_HOBJECT_E_GET_VALUE_GETTER(thr->heap, holder, e_idx); DUK_HOBJECT_E_SET_VALUE_GETTER(thr->heap, holder, e_idx, NULL); DUK_HOBJECT_DECREF_ALLOWNULL(thr, tmp); DUK_UNREF(tmp); tmp = DUK_HOBJECT_E_GET_VALUE_SETTER(thr->heap, holder, e_idx); DUK_HOBJECT_E_SET_VALUE_SETTER(thr->heap, holder, e_idx, NULL); DUK_HOBJECT_DECREF_ALLOWNULL(thr, tmp); DUK_UNREF(tmp); } else { tv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, holder, e_idx); DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv); } /* Here val would be potentially invalid if we didn't make * a value copy at the caller. */ tv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, holder, e_idx); DUK_TVAL_SET_TVAL(tv, val); DUK_TVAL_INCREF(thr, tv); DUK_HOBJECT_E_SET_FLAGS(thr->heap, holder, e_idx, prop_flags); DUK_DDD(DUK_DDDPRINT("updated global binding, final result: " "value -> %!T, prop_flags=0x%08lx", (duk_tval *) DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, holder, e_idx), (unsigned long) prop_flags)); } else { DUK_DDD(DUK_DDDPRINT("redefine, offending property in ancestor")); DUK_ASSERT(ref.holder == thr->builtins[DUK_BIDX_GLOBAL]); duk_push_tval(thr, val); duk_hobject_define_property_internal(thr, ref.holder, name, prop_flags); } return 0; } /* * Not found (in registers or record objects). Declare * to current variable environment. */ /* * Get holder object */ if (DUK_HOBJECT_IS_DECENV(env)) { DUK_ASSERT_HDECENV_VALID((duk_hdecenv *) env); holder = env; } else { DUK_ASSERT_HOBJENV_VALID((duk_hobjenv *) env); holder = ((duk_hobjenv *) env)->target; DUK_ASSERT(holder != NULL); } /* * Define new property * * Note: this may fail if the holder is not extensible. */ /* XXX: this is awkward as we use an internal method which doesn't handle * extensibility etc correctly. Basically we'd want to do a [[DefineOwnProperty]] * or Object.defineProperty() here. */ if (!DUK_HOBJECT_HAS_EXTENSIBLE(holder)) { goto fail_not_extensible; } duk_push_hobject(thr, holder); duk_push_hstring(thr, name); duk_push_tval(thr, val); duk_xdef_prop(thr, -3, prop_flags); /* [holder name val] -> [holder] */ duk_pop_unsafe(thr); return 0; fail_existing_attributes: fail_not_extensible: DUK_ERROR_TYPE(thr, "declaration failed"); return 0; } DUK_INTERNAL duk_bool_t duk_js_declvar_activation(duk_hthread *thr, duk_activation *act, duk_hstring *name, duk_tval *val, duk_small_uint_t prop_flags, duk_bool_t is_func_decl) { duk_hobject *env; duk_tval tv_val_copy; DUK_ASSERT(act != NULL); /* * Make a value copy of the input val. This ensures that * side effects cannot invalidate the pointer. */ DUK_TVAL_SET_TVAL(&tv_val_copy, val); val = &tv_val_copy; /* * Delayed env creation check */ if (!act->var_env) { DUK_ASSERT(act->lex_env == NULL); duk_js_init_activation_environment_records_delayed(thr, act); /* 'act' is a stable pointer, so still OK. */ } DUK_ASSERT(act->lex_env != NULL); DUK_ASSERT(act->var_env != NULL); env = act->var_env; DUK_ASSERT(env != NULL); DUK_ASSERT(DUK_HOBJECT_IS_ENV(env)); return duk__declvar_helper(thr, env, name, val, prop_flags, is_func_decl); } #line 1 "duk_lexer.c" /* * Lexer for source files, ToNumber() string conversions, RegExp expressions, * and JSON. * * Provides a stream of Ecmascript tokens from an UTF-8/CESU-8 buffer. The * caller can also rewind the token stream into a certain position which is * needed by the compiler part for multi-pass scanning. Tokens are * represented as duk_token structures, and contain line number information. * Token types are identified with DUK_TOK_* defines. * * Characters are decoded into a fixed size lookup window consisting of * decoded Unicode code points, with window positions past the end of the * input filled with an invalid codepoint (-1). The tokenizer can thus * perform multiple character lookups efficiently and with few sanity * checks (such as access outside the end of the input), which keeps the * tokenization code small at the cost of performance. * * Character data in tokens, such as identifier names and string literals, * is encoded into CESU-8 format on-the-fly while parsing the token in * question. The string data is made reachable to garbage collection by * placing the token-related values in value stack entries allocated for * this purpose by the caller. The characters exist in Unicode code point * form only in the fixed size lookup window, which keeps character data * expansion (of especially ASCII data) low. * * Token parsing supports the full range of Unicode characters as described * in the E5 specification. Parsing has been optimized for ASCII characters * because ordinary Ecmascript code consists almost entirely of ASCII * characters. Matching of complex Unicode codepoint sets (such as in the * IdentifierStart and IdentifierPart productions) is optimized for size, * and is done using a linear scan of a bit-packed list of ranges. This is * very slow, but should never be entered unless the source code actually * contains Unicode characters. * * Ecmascript tokenization is partially context sensitive. First, * additional future reserved words are recognized in strict mode (see E5 * Section 7.6.1.2). Second, a forward slash character ('/') can be * recognized either as starting a RegExp literal or as a division operator, * depending on context. The caller must provide necessary context flags * when requesting a new token. * * Future work: * * * Make line number tracking optional, as it consumes space. * * * Add a feature flag for disabling UTF-8 decoding of input, as most * source code is ASCII. Because of Unicode escapes written in ASCII, * this does not allow Unicode support to be removed from e.g. * duk_unicode_is_identifier_start() nor does it allow removal of CESU-8 * encoding of e.g. string literals. * * * Add a feature flag for disabling Unicode compliance of e.g. identifier * names. This allows for a build more than a kilobyte smaller, because * Unicode ranges needed by duk_unicode_is_identifier_start() and * duk_unicode_is_identifier_part() can be dropped. String literals * should still be allowed to contain escaped Unicode, so this still does * not allow removal of CESU-8 encoding of e.g. string literals. * * * Character lookup tables for codepoints above BMP could be stripped. * * * Strictly speaking, E5 specification requires that source code consists * of 16-bit code units, and if not, must be conceptually converted to * that format first. The current lexer processes Unicode code points * and allows characters outside the BMP. These should be converted to * surrogate pairs while reading the source characters into the window, * not after tokens have been formed (as is done now). However, the fix * is not trivial because two characters are decoded from one codepoint. * * * Optimize for speed as well as size. Large if-else ladders are (at * least potentially) slow. */ /* #include duk_internal.h -> already included */ /* * Various defines and file specific helper macros */ #define DUK__MAX_RE_DECESC_DIGITS 9 #define DUK__MAX_RE_QUANT_DIGITS 9 /* Does not allow e.g. 2**31-1, but one more would allow overflows of u32. */ /* whether to use macros or helper function depends on call count */ #define DUK__ISDIGIT(x) ((x) >= DUK_ASC_0 && (x) <= DUK_ASC_9) #define DUK__ISHEXDIGIT(x) duk__is_hex_digit((x)) #define DUK__ISOCTDIGIT(x) ((x) >= DUK_ASC_0 && (x) <= DUK_ASC_7) #define DUK__ISDIGIT03(x) ((x) >= DUK_ASC_0 && (x) <= DUK_ASC_3) #define DUK__ISDIGIT47(x) ((x) >= DUK_ASC_4 && (x) <= DUK_ASC_7) /* lexer character window helpers */ #define DUK__LOOKUP(lex_ctx,idx) ((lex_ctx)->window[(idx)].codepoint) #define DUK__ADVANCECHARS(lex_ctx,count) duk__advance_chars((lex_ctx), (count)) #define DUK__ADVANCEBYTES(lex_ctx,count) duk__advance_bytes((lex_ctx), (count)) #define DUK__INITBUFFER(lex_ctx) duk__initbuffer((lex_ctx)) #define DUK__APPENDBUFFER(lex_ctx,x) duk__appendbuffer((lex_ctx), (duk_codepoint_t) (x)) #define DUK__APPENDBUFFER_ASCII(lex_ctx,x) duk__appendbuffer_ascii((lex_ctx), (duk_codepoint_t) (x)) /* lookup shorthands (note: assume context variable is named 'lex_ctx') */ #define DUK__L0() DUK__LOOKUP(lex_ctx, 0) #define DUK__L1() DUK__LOOKUP(lex_ctx, 1) #define DUK__L2() DUK__LOOKUP(lex_ctx, 2) #define DUK__L3() DUK__LOOKUP(lex_ctx, 3) #define DUK__L4() DUK__LOOKUP(lex_ctx, 4) #define DUK__L5() DUK__LOOKUP(lex_ctx, 5) /* packed advance/token number macro used by multiple functions */ #define DUK__ADVTOK(advbytes,tok) ((((advbytes) * sizeof(duk_lexer_codepoint)) << 8) + (tok)) /* * Advance lookup window by N characters, filling in new characters as * necessary. After returning caller is guaranteed a character window of * at least DUK_LEXER_WINDOW_SIZE characters. * * The main function duk__advance_bytes() is called at least once per every * token so it has a major lexer/compiler performance impact. There are two * variants for the main duk__advance_bytes() algorithm: a sliding window * approach which is slightly faster at the cost of larger code footprint, * and a simple copying one. * * Decoding directly from the source string would be another lexing option. * But the lookup window based approach has the advantage of hiding the * source string and its encoding effectively which gives more flexibility * going forward to e.g. support chunked streaming of source from flash. * * Decodes UTF-8/CESU-8 leniently with support for code points from U+0000 to * U+10FFFF, causing an error if the input is unparseable. Leniency means: * * * Unicode code point validation is intentionally not performed, * except to check that the codepoint does not exceed 0x10ffff. * * * In particular, surrogate pairs are allowed and not combined, which * allows source files to represent all SourceCharacters with CESU-8. * Broken surrogate pairs are allowed, as Ecmascript does not mandate * their validation. * * * Allow non-shortest UTF-8 encodings. * * Leniency here causes few security concerns because all character data is * decoded into Unicode codepoints before lexer processing, and is then * re-encoded into CESU-8. The source can be parsed as strict UTF-8 with * a compiler option. However, Ecmascript source characters include -all- * 16-bit unsigned integer codepoints, so leniency seems to be appropriate. * * Note that codepoints above the BMP are not strictly SourceCharacters, * but the lexer still accepts them as such. Before ending up in a string * or an identifier name, codepoints above BMP are converted into surrogate * pairs and then CESU-8 encoded, resulting in 16-bit Unicode data as * expected by Ecmascript. * * An alternative approach to dealing with invalid or partial sequences * would be to skip them and replace them with e.g. the Unicode replacement * character U+FFFD. This has limited utility because a replacement character * will most likely cause a parse error, unless it occurs inside a string. * Further, Ecmascript source is typically pure ASCII. * * See: * * http://en.wikipedia.org/wiki/UTF-8 * http://en.wikipedia.org/wiki/CESU-8 * http://tools.ietf.org/html/rfc3629 * http://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences * * Future work: * * * Reject other invalid Unicode sequences (see Wikipedia entry for examples) * in strict UTF-8 mode. * * * Size optimize. An attempt to use a 16-byte lookup table for the first * byte resulted in a code increase though. * * * Is checking against maximum 0x10ffff really useful? 4-byte encoding * imposes a certain limit anyway. * * * Support chunked streaming of source code. Can be implemented either * by streaming chunks of bytes or chunks of codepoints. */ #if defined(DUK_USE_LEXER_SLIDING_WINDOW) DUK_LOCAL void duk__fill_lexer_buffer(duk_lexer_ctx *lex_ctx, duk_small_uint_t start_offset_bytes) { duk_lexer_codepoint *cp, *cp_end; duk_ucodepoint_t x; duk_small_uint_t contlen; const duk_uint8_t *p, *p_end; #if defined(DUK_USE_STRICT_UTF8_SOURCE) duk_ucodepoint_t mincp; #endif duk_int_t input_line; /* Use temporaries and update lex_ctx only when finished. */ input_line = lex_ctx->input_line; p = lex_ctx->input + lex_ctx->input_offset; p_end = lex_ctx->input + lex_ctx->input_length; cp = (duk_lexer_codepoint *) (void *) ((duk_uint8_t *) lex_ctx->buffer + start_offset_bytes); cp_end = lex_ctx->buffer + DUK_LEXER_BUFFER_SIZE; for (; cp != cp_end; cp++) { cp->offset = (duk_size_t) (p - lex_ctx->input); cp->line = input_line; /* XXX: potential issue with signed pointers, p_end < p. */ if (DUK_UNLIKELY(p >= p_end)) { /* If input_offset were assigned a negative value, it would * result in a large positive value. Most likely it would be * larger than input_length and be caught here. In any case * no memory unsafe behavior would happen. */ cp->codepoint = -1; continue; } x = (duk_ucodepoint_t) (*p++); /* Fast path. */ if (DUK_LIKELY(x < 0x80UL)) { DUK_ASSERT(x != 0x2028UL && x != 0x2029UL); /* not LS/PS */ if (DUK_UNLIKELY(x <= 0x000dUL)) { if ((x == 0x000aUL) || ((x == 0x000dUL) && (p >= p_end || *p != 0x000aUL))) { /* lookup for 0x000a above assumes shortest encoding now */ /* E5 Section 7.3, treat the following as newlines: * LF * CR [not followed by LF] * LS * PS * * For CR LF, CR is ignored if it is followed by LF, and the LF will bump * the line number. */ input_line++; } } cp->codepoint = (duk_codepoint_t) x; continue; } /* Slow path. */ if (x < 0xc0UL) { /* 10xx xxxx -> invalid */ goto error_encoding; } else if (x < 0xe0UL) { /* 110x xxxx 10xx xxxx */ contlen = 1; #if defined(DUK_USE_STRICT_UTF8_SOURCE) mincp = 0x80UL; #endif x = x & 0x1fUL; } else if (x < 0xf0UL) { /* 1110 xxxx 10xx xxxx 10xx xxxx */ contlen = 2; #if defined(DUK_USE_STRICT_UTF8_SOURCE) mincp = 0x800UL; #endif x = x & 0x0fUL; } else if (x < 0xf8UL) { /* 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx */ contlen = 3; #if defined(DUK_USE_STRICT_UTF8_SOURCE) mincp = 0x10000UL; #endif x = x & 0x07UL; } else { /* no point in supporting encodings of 5 or more bytes */ goto error_encoding; } DUK_ASSERT(p_end >= p); if ((duk_size_t) contlen > (duk_size_t) (p_end - p)) { goto error_clipped; } while (contlen > 0) { duk_small_uint_t y; y = *p++; if ((y & 0xc0U) != 0x80U) { /* check that byte has the form 10xx xxxx */ goto error_encoding; } x = x << 6; x += y & 0x3fUL; contlen--; } /* check final character validity */ if (x > 0x10ffffUL) { goto error_encoding; } #if defined(DUK_USE_STRICT_UTF8_SOURCE) if (x < mincp || (x >= 0xd800UL && x <= 0xdfffUL) || x == 0xfffeUL) { goto error_encoding; } #endif DUK_ASSERT(x != 0x000aUL && x != 0x000dUL); if ((x == 0x2028UL) || (x == 0x2029UL)) { input_line++; } cp->codepoint = (duk_codepoint_t) x; } lex_ctx->input_offset = (duk_size_t) (p - lex_ctx->input); lex_ctx->input_line = input_line; return; error_clipped: /* clipped codepoint */ error_encoding: /* invalid codepoint encoding or codepoint */ lex_ctx->input_offset = (duk_size_t) (p - lex_ctx->input); lex_ctx->input_line = input_line; DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_SOURCE_DECODE_FAILED); } DUK_LOCAL void duk__advance_bytes(duk_lexer_ctx *lex_ctx, duk_small_uint_t count_bytes) { duk_small_uint_t used_bytes, avail_bytes; DUK_ASSERT_DISABLE(count_bytes >= 0); /* unsigned */ DUK_ASSERT(count_bytes <= (duk_small_uint_t) (DUK_LEXER_WINDOW_SIZE * sizeof(duk_lexer_codepoint))); DUK_ASSERT(lex_ctx->window >= lex_ctx->buffer); DUK_ASSERT(lex_ctx->window < lex_ctx->buffer + DUK_LEXER_BUFFER_SIZE); DUK_ASSERT((duk_uint8_t *) lex_ctx->window + count_bytes <= (duk_uint8_t *) lex_ctx->buffer + DUK_LEXER_BUFFER_SIZE * sizeof(duk_lexer_codepoint)); /* Zero 'count' is also allowed to make call sites easier. * Arithmetic in bytes generates better code in GCC. */ lex_ctx->window = (duk_lexer_codepoint *) (void *) ((duk_uint8_t *) lex_ctx->window + count_bytes); /* avoid multiply */ used_bytes = (duk_small_uint_t) ((duk_uint8_t *) lex_ctx->window - (duk_uint8_t *) lex_ctx->buffer); avail_bytes = DUK_LEXER_BUFFER_SIZE * sizeof(duk_lexer_codepoint) - used_bytes; if (avail_bytes < (duk_small_uint_t) (DUK_LEXER_WINDOW_SIZE * sizeof(duk_lexer_codepoint))) { /* Not enough data to provide a full window, so "scroll" window to * start of buffer and fill up the rest. */ DUK_MEMMOVE((void *) lex_ctx->buffer, (const void *) lex_ctx->window, (size_t) avail_bytes); lex_ctx->window = lex_ctx->buffer; duk__fill_lexer_buffer(lex_ctx, avail_bytes); } } DUK_LOCAL void duk__init_lexer_window(duk_lexer_ctx *lex_ctx) { lex_ctx->window = lex_ctx->buffer; duk__fill_lexer_buffer(lex_ctx, 0); } #else /* DUK_USE_LEXER_SLIDING_WINDOW */ DUK_LOCAL duk_codepoint_t duk__read_char(duk_lexer_ctx *lex_ctx) { duk_ucodepoint_t x; duk_small_uint_t len; duk_small_uint_t i; const duk_uint8_t *p; #if defined(DUK_USE_STRICT_UTF8_SOURCE) duk_ucodepoint_t mincp; #endif duk_size_t input_offset; input_offset = lex_ctx->input_offset; if (DUK_UNLIKELY(input_offset >= lex_ctx->input_length)) { /* If input_offset were assigned a negative value, it would * result in a large positive value. Most likely it would be * larger than input_length and be caught here. In any case * no memory unsafe behavior would happen. */ return -1; } p = lex_ctx->input + input_offset; x = (duk_ucodepoint_t) (*p); if (DUK_LIKELY(x < 0x80UL)) { /* 0xxx xxxx -> fast path */ /* input offset tracking */ lex_ctx->input_offset++; DUK_ASSERT(x != 0x2028UL && x != 0x2029UL); /* not LS/PS */ if (DUK_UNLIKELY(x <= 0x000dUL)) { if ((x == 0x000aUL) || ((x == 0x000dUL) && (lex_ctx->input_offset >= lex_ctx->input_length || lex_ctx->input[lex_ctx->input_offset] != 0x000aUL))) { /* lookup for 0x000a above assumes shortest encoding now */ /* E5 Section 7.3, treat the following as newlines: * LF * CR [not followed by LF] * LS * PS * * For CR LF, CR is ignored if it is followed by LF, and the LF will bump * the line number. */ lex_ctx->input_line++; } } return (duk_codepoint_t) x; } /* Slow path. */ if (x < 0xc0UL) { /* 10xx xxxx -> invalid */ goto error_encoding; } else if (x < 0xe0UL) { /* 110x xxxx 10xx xxxx */ len = 2; #if defined(DUK_USE_STRICT_UTF8_SOURCE) mincp = 0x80UL; #endif x = x & 0x1fUL; } else if (x < 0xf0UL) { /* 1110 xxxx 10xx xxxx 10xx xxxx */ len = 3; #if defined(DUK_USE_STRICT_UTF8_SOURCE) mincp = 0x800UL; #endif x = x & 0x0fUL; } else if (x < 0xf8UL) { /* 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx */ len = 4; #if defined(DUK_USE_STRICT_UTF8_SOURCE) mincp = 0x10000UL; #endif x = x & 0x07UL; } else { /* no point in supporting encodings of 5 or more bytes */ goto error_encoding; } DUK_ASSERT(lex_ctx->input_length >= lex_ctx->input_offset); if ((duk_size_t) len > (duk_size_t) (lex_ctx->input_length - lex_ctx->input_offset)) { goto error_clipped; } p++; for (i = 1; i < len; i++) { duk_small_uint_t y; y = *p++; if ((y & 0xc0U) != 0x80U) { /* check that byte has the form 10xx xxxx */ goto error_encoding; } x = x << 6; x += y & 0x3fUL; } /* check final character validity */ if (x > 0x10ffffUL) { goto error_encoding; } #if defined(DUK_USE_STRICT_UTF8_SOURCE) if (x < mincp || (x >= 0xd800UL && x <= 0xdfffUL) || x == 0xfffeUL) { goto error_encoding; } #endif /* input offset tracking */ lex_ctx->input_offset += len; /* line tracking */ DUK_ASSERT(x != 0x000aUL && x != 0x000dUL); if ((x == 0x2028UL) || (x == 0x2029UL)) { lex_ctx->input_line++; } return (duk_codepoint_t) x; error_clipped: /* clipped codepoint */ error_encoding: /* invalid codepoint encoding or codepoint */ DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_SOURCE_DECODE_FAILED); return 0; } DUK_LOCAL void duk__advance_bytes(duk_lexer_ctx *lex_ctx, duk_small_uint_t count_bytes) { duk_small_uint_t keep_bytes; duk_lexer_codepoint *cp, *cp_end; DUK_ASSERT_DISABLE(count_bytes >= 0); /* unsigned */ DUK_ASSERT(count_bytes <= (duk_small_uint_t) (DUK_LEXER_WINDOW_SIZE * sizeof(duk_lexer_codepoint))); /* Zero 'count' is also allowed to make call sites easier. */ keep_bytes = DUK_LEXER_WINDOW_SIZE * sizeof(duk_lexer_codepoint) - count_bytes; DUK_MEMMOVE((void *) lex_ctx->window, (const void *) ((duk_uint8_t *) lex_ctx->window + count_bytes), (size_t) keep_bytes); cp = (duk_lexer_codepoint *) ((duk_uint8_t *) lex_ctx->window + keep_bytes); cp_end = lex_ctx->window + DUK_LEXER_WINDOW_SIZE; for (; cp != cp_end; cp++) { cp->offset = lex_ctx->input_offset; cp->line = lex_ctx->input_line; cp->codepoint = duk__read_char(lex_ctx); } } DUK_LOCAL void duk__init_lexer_window(duk_lexer_ctx *lex_ctx) { /* Call with count == DUK_LEXER_WINDOW_SIZE to fill buffer initially. */ duk__advance_bytes(lex_ctx, DUK_LEXER_WINDOW_SIZE * sizeof(duk_lexer_codepoint)); /* fill window */ } #endif /* DUK_USE_LEXER_SLIDING_WINDOW */ DUK_LOCAL void duk__advance_chars(duk_lexer_ctx *lex_ctx, duk_small_uint_t count_chars) { duk__advance_bytes(lex_ctx, count_chars * sizeof(duk_lexer_codepoint)); } /* * (Re)initialize the temporary byte buffer. May be called extra times * with little impact. */ DUK_LOCAL void duk__initbuffer(duk_lexer_ctx *lex_ctx) { /* Reuse buffer as is unless buffer has grown large. */ if (DUK_HBUFFER_DYNAMIC_GET_SIZE(lex_ctx->buf) < DUK_LEXER_TEMP_BUF_LIMIT) { /* Keep current size */ } else { duk_hbuffer_resize(lex_ctx->thr, lex_ctx->buf, DUK_LEXER_TEMP_BUF_LIMIT); } DUK_BW_INIT_WITHBUF(lex_ctx->thr, &lex_ctx->bw, lex_ctx->buf); } /* * Append a Unicode codepoint to the temporary byte buffer. Performs * CESU-8 surrogate pair encoding for codepoints above the BMP. * Existing surrogate pairs are allowed and also encoded into CESU-8. */ DUK_LOCAL void duk__appendbuffer(duk_lexer_ctx *lex_ctx, duk_codepoint_t x) { /* * Since character data is only generated by decoding the source or by * the compiler itself, we rely on the input codepoints being correct * and avoid a check here. * * Character data can also come here through decoding of Unicode * escapes ("\udead\ubeef") so all 16-but unsigned values can be * present, even when the source file itself is strict UTF-8. */ DUK_ASSERT(x >= 0 && x <= 0x10ffffL); DUK_BW_WRITE_ENSURE_CESU8(lex_ctx->thr, &lex_ctx->bw, (duk_ucodepoint_t) x); } DUK_LOCAL void duk__appendbuffer_ascii(duk_lexer_ctx *lex_ctx, duk_codepoint_t x) { /* ASCII characters can be emitted as a single byte without encoding * which matters for some fast paths. */ DUK_ASSERT(x >= 0 && x <= 0x7f); DUK_BW_WRITE_ENSURE_U8(lex_ctx->thr, &lex_ctx->bw, (duk_uint8_t) x); } /* * Intern the temporary byte buffer into a valstack slot * (in practice, slot1 or slot2). */ DUK_LOCAL duk_hstring *duk__internbuffer(duk_lexer_ctx *lex_ctx, duk_idx_t valstack_idx) { DUK_ASSERT(valstack_idx == lex_ctx->slot1_idx || valstack_idx == lex_ctx->slot2_idx); DUK_BW_PUSH_AS_STRING(lex_ctx->thr, &lex_ctx->bw); duk_replace(lex_ctx->thr, valstack_idx); return duk_known_hstring(lex_ctx->thr, valstack_idx); } /* * Init lexer context */ DUK_INTERNAL void duk_lexer_initctx(duk_lexer_ctx *lex_ctx) { DUK_ASSERT(lex_ctx != NULL); DUK_MEMZERO(lex_ctx, sizeof(*lex_ctx)); #if defined(DUK_USE_EXPLICIT_NULL_INIT) #if defined(DUK_USE_LEXER_SLIDING_WINDOW) lex_ctx->window = NULL; #endif lex_ctx->thr = NULL; lex_ctx->input = NULL; lex_ctx->buf = NULL; #endif } /* * Set lexer input position and reinitialize lookup window. */ DUK_INTERNAL void duk_lexer_getpoint(duk_lexer_ctx *lex_ctx, duk_lexer_point *pt) { pt->offset = lex_ctx->window[0].offset; pt->line = lex_ctx->window[0].line; } DUK_INTERNAL void duk_lexer_setpoint(duk_lexer_ctx *lex_ctx, duk_lexer_point *pt) { DUK_ASSERT_DISABLE(pt->offset >= 0); /* unsigned */ DUK_ASSERT(pt->line >= 1); lex_ctx->input_offset = pt->offset; lex_ctx->input_line = pt->line; duk__init_lexer_window(lex_ctx); } /* * Lexing helpers */ /* Numeric value of a hex digit (also covers octal and decimal digits) or * -1 if not a valid hex digit. */ DUK_LOCAL duk_codepoint_t duk__hexval_validate(duk_codepoint_t x) { duk_small_int_t t; /* Here 'x' is a Unicode codepoint */ if (DUK_LIKELY(x >= 0 && x <= 0xff)) { t = duk_hex_dectab[x]; if (DUK_LIKELY(t >= 0)) { return t; } } return -1; } /* Just a wrapper for call sites where 'x' is known to be valid so * we assert for it before decoding. */ DUK_LOCAL duk_codepoint_t duk__hexval(duk_codepoint_t x) { duk_codepoint_t ret; DUK_ASSERT((x >= DUK_ASC_0 && x <= DUK_ASC_9) || (x >= DUK_ASC_LC_A && x <= DUK_ASC_LC_F) || (x >= DUK_ASC_UC_A && x <= DUK_ASC_UC_F)); ret = duk__hexval_validate(x); DUK_ASSERT(ret >= 0 && ret <= 15); return ret; } /* having this as a separate function provided a size benefit */ DUK_LOCAL duk_bool_t duk__is_hex_digit(duk_codepoint_t x) { if (DUK_LIKELY(x >= 0 && x <= 0xff)) { return (duk_hex_dectab[x] >= 0); } return 0; } /* Parse a Unicode escape of the form \xHH, \uHHHH, or \u{H+}. Shared by * source and RegExp parsing. */ DUK_LOCAL duk_codepoint_t duk__lexer_parse_escape(duk_lexer_ctx *lex_ctx, duk_bool_t allow_es6) { duk_small_int_t digits; /* Initial value 2 or 4 for fixed length escapes, 0 for ES2015 \u{H+}. */ duk_codepoint_t escval; duk_codepoint_t x; duk_small_uint_t adv; DUK_ASSERT(DUK__L0() == DUK_ASC_BACKSLASH); /* caller responsibilities */ DUK_ASSERT(DUK__L1() == DUK_ASC_LC_X || DUK__L1() == DUK_ASC_LC_U); DUK_UNREF(allow_es6); adv = 2; digits = 2; if (DUK__L1() == DUK_ASC_LC_U) { digits = 4; #if defined(DUK_USE_ES6_UNICODE_ESCAPE) if (DUK__L2() == DUK_ASC_LCURLY && allow_es6) { digits = 0; adv = 3; } #endif } DUK__ADVANCECHARS(lex_ctx, adv); escval = 0; for (;;) { /* One of the escape forms: \xHH, \uHHHH, \u{H+}. * The 'digits' variable tracks parsing state and is * initialized to: * * \xHH 2 * \uHH 4 * \u{H+} 0 first time, updated to -1 to indicate * at least one digit has been parsed * * Octal parsing is handled separately because it can be * done with fixed lookahead and also has validation * rules which depend on the escape length (which is * variable). * * We don't need a specific check for x < 0 (end of * input) or duk_unicode_is_line_terminator(x) * because the 'dig' decode will fail and lead to a * SyntaxError. */ duk_codepoint_t dig; x = DUK__L0(); DUK__ADVANCECHARS(lex_ctx, 1); dig = duk__hexval_validate(x); if (digits > 0) { digits--; if (dig < 0) { goto fail_escape; } DUK_ASSERT(dig >= 0x00 && dig <= 0x0f); escval = (escval << 4) + dig; if (digits == 0) { DUK_ASSERT(escval >= 0 && escval <= 0xffffL); break; } } else { #if defined(DUK_USE_ES6_UNICODE_ESCAPE) DUK_ASSERT(digits == 0 /* first time */ || digits == -1 /* others */); if (dig >= 0) { DUK_ASSERT(dig >= 0x00 && dig <= 0x0f); escval = (escval << 4) + dig; if (escval > 0x10ffffL) { goto fail_escape; } } else if (x == DUK_ASC_RCURLY) { if (digits == 0) { /* Empty escape, \u{}. */ goto fail_escape; } DUK_ASSERT(escval >= 0 && escval <= 0x10ffffL); break; } else { goto fail_escape; } digits = -1; /* Indicate we have at least one digit. */ #else /* DUK_USE_ES6_UNICODE_ESCAPE */ DUK_ASSERT(0); /* Never happens if \u{H+} support disabled. */ #endif /* DUK_USE_ES6_UNICODE_ESCAPE */ } } return escval; fail_escape: DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_ESCAPE); } /* Parse legacy octal escape of the form \N{1,3}, e.g. \0, \5, \0377. Maximum * allowed value is \0377 (U+00FF), longest match is used. Used for both string * RegExp octal escape parsing. Window[0] must be the slash '\' and the first * digit must already be validated to be in [0-9] by the caller. */ DUK_LOCAL duk_codepoint_t duk__lexer_parse_legacy_octal(duk_lexer_ctx *lex_ctx, duk_small_uint_t *out_adv, duk_bool_t reject_annex_b) { duk_codepoint_t cp; duk_small_uint_t lookup_idx; duk_small_uint_t adv; duk_codepoint_t tmp; DUK_ASSERT(out_adv != NULL); DUK_ASSERT(DUK__LOOKUP(lex_ctx, 0) == DUK_ASC_BACKSLASH); DUK_ASSERT(DUK__LOOKUP(lex_ctx, 1) >= DUK_ASC_0 && DUK__LOOKUP(lex_ctx, 1) <= DUK_ASC_9); cp = 0; tmp = 0; for (lookup_idx = 1; lookup_idx <= 3; lookup_idx++) { DUK_DDD(DUK_DDDPRINT("lookup_idx=%ld, cp=%ld", (long) lookup_idx, (long) cp)); tmp = DUK__LOOKUP(lex_ctx, lookup_idx); if (tmp < DUK_ASC_0 || tmp > DUK_ASC_7) { /* No more valid digits. */ break; } tmp = (cp << 3) + (tmp - DUK_ASC_0); if (tmp > 0xff) { /* Three digit octal escapes above \377 (= 0xff) * are not allowed. */ break; } cp = tmp; } DUK_DDD(DUK_DDDPRINT("final lookup_idx=%ld, cp=%ld", (long) lookup_idx, (long) cp)); adv = lookup_idx; if (lookup_idx == 1) { DUK_DDD(DUK_DDDPRINT("\\8 or \\9 -> treat as literal, accept in strict mode too")); DUK_ASSERT(tmp == DUK_ASC_8 || tmp == DUK_ASC_9); cp = tmp; adv++; /* correction to above, eat offending character */ } else if (lookup_idx == 2 && cp == 0) { /* Note: 'foo\0bar' is OK in strict mode, but 'foo\00bar' is not. * It won't be interpreted as 'foo\u{0}0bar' but as a SyntaxError. */ DUK_DDD(DUK_DDDPRINT("\\0 -> accept in strict mode too")); } else { /* This clause also handles non-shortest zero, e.g. \00. */ if (reject_annex_b) { DUK_DDD(DUK_DDDPRINT("non-zero octal literal %ld -> reject in strict-mode", (long) cp)); cp = -1; } else { DUK_DDD(DUK_DDDPRINT("non-zero octal literal %ld -> accepted", (long) cp)); DUK_ASSERT(cp >= 0 && cp <= 0xff); } } *out_adv = adv; DUK_ASSERT((cp >= 0 && cp <= 0xff) || (cp == -1 && reject_annex_b)); return cp; } /* XXX: move strict mode to lex_ctx? */ DUK_LOCAL void duk__lexer_parse_string_literal(duk_lexer_ctx *lex_ctx, duk_token *out_token, duk_small_int_t quote, duk_bool_t strict_mode) { duk_small_uint_t adv; for (adv = 1 /* initial quote */ ;;) { duk_codepoint_t x; DUK__ADVANCECHARS(lex_ctx, adv); /* eat opening quote on first loop */ x = DUK__L0(); adv = 1; if (x == quote) { DUK__ADVANCECHARS(lex_ctx, 1); /* eat closing quote */ break; } else if (x == '\\') { /* DUK__L0 -> '\' char * DUK__L1 ... DUK__L5 -> more lookup */ duk_small_int_t emitcp = -1; x = DUK__L1(); /* How much to advance before next loop. */ adv = 2; /* note: long live range */ switch (x) { case '\'': emitcp = 0x0027; break; case '"': emitcp = 0x0022; break; case '\\': emitcp = 0x005c; break; case 'b': emitcp = 0x0008; break; case 'f': emitcp = 0x000c; break; case 'n': emitcp = 0x000a; break; case 'r': emitcp = 0x000d; break; case 't': emitcp = 0x0009; break; case 'v': emitcp = 0x000b; break; case 'x': case 'u': { duk_codepoint_t esc_cp; esc_cp = duk__lexer_parse_escape(lex_ctx, 1 /*allow_es6*/); DUK__APPENDBUFFER(lex_ctx, esc_cp); adv = 0; break; } default: { if (duk_unicode_is_line_terminator(x)) { /* line continuation */ if (x == 0x000d && DUK__L2() == 0x000a) { /* CR LF again a special case */ adv = 3; /* line terminator, CR, LF */ } } else if (DUK__ISDIGIT(x)) { /* * Octal escape or zero escape: * \0 (lookahead not OctalDigit) * \1 ... \7 (lookahead not OctalDigit) * \ZeroToThree OctalDigit (lookahead not OctalDigit) * \FourToSeven OctalDigit (no lookahead restrictions) * \ZeroToThree OctalDigit OctalDigit (no lookahead restrictions) * * Zero escape is part of the standard syntax. Octal escapes are * defined in E5 Section B.1.2, and are only allowed in non-strict mode. * Any other productions starting with a decimal digit are invalid * but are in practice treated like identity escapes. * * Parse octal (up to 3 digits) from the lookup window. */ emitcp = duk__lexer_parse_legacy_octal(lex_ctx, &adv, strict_mode /*reject_annex_b*/); if (emitcp < 0) { goto fail_escape; } } else if (x < 0) { goto fail_unterminated; } else { /* escaped NonEscapeCharacter */ DUK__APPENDBUFFER(lex_ctx, x); } } /* end default clause */ } /* end switch */ /* Shared handling for single codepoint escapes. */ if (emitcp >= 0) { DUK__APPENDBUFFER(lex_ctx, emitcp); } /* Track number of escapes; count not really needed but directive * prologues need to detect whether there were any escapes or line * continuations or not. */ out_token->num_escapes++; } else if (x >= 0x20 && x <= 0x7f) { /* Fast path for ASCII case, avoids line terminator * check and CESU-8 encoding. */ DUK_ASSERT(x >= 0); DUK_ASSERT(!duk_unicode_is_line_terminator(x)); DUK_ASSERT(x != quote); DUK_ASSERT(x != DUK_ASC_BACKSLASH); DUK__APPENDBUFFER_ASCII(lex_ctx, x); } else if (x < 0 || duk_unicode_is_line_terminator(x)) { goto fail_unterminated; } else { /* Character which is part of the string but wasn't handled * by the fast path. */ DUK__APPENDBUFFER(lex_ctx, x); } } /* string parse loop */ return; fail_escape: DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_ESCAPE); return; fail_unterminated: DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_UNTERMINATED_STRING); return; } /* Skip to end-of-line (or end-of-file), used for single line comments. */ DUK_LOCAL void duk__lexer_skip_to_endofline(duk_lexer_ctx *lex_ctx) { for (;;) { duk_codepoint_t x; x = DUK__L0(); if (x < 0 || duk_unicode_is_line_terminator(x)) { break; } DUK__ADVANCECHARS(lex_ctx, 1); } } /* * Parse Ecmascript source InputElementDiv or InputElementRegExp * (E5 Section 7), skipping whitespace, comments, and line terminators. * * Possible results are: * (1) a token * (2) a line terminator (skipped) * (3) a comment (skipped) * (4) EOF * * White space is automatically skipped from the current position (but * not after the input element). If input has already ended, returns * DUK_TOK_EOF indefinitely. If a parse error occurs, uses an DUK_ERROR() * macro call (and hence a longjmp through current heap longjmp context). * Comments and line terminator tokens are automatically skipped. * * The input element being matched is determined by regexp_mode; if set, * parses a InputElementRegExp, otherwise a InputElementDiv. The * difference between these are handling of productions starting with a * forward slash. * * If strict_mode is set, recognizes additional future reserved words * specific to strict mode, and refuses to parse octal literals. * * The matching strategy below is to (currently) use a six character * lookup window to quickly determine which production is the -longest- * matching one, and then parse that. The top-level if-else clauses * match the first character, and the code blocks for each clause * handle -all- alternatives for that first character. Ecmascript * specification uses the "longest match wins" semantics, so the order * of the if-clauses matters. * * Misc notes: * * * Ecmascript numeric literals do not accept a sign character. * Consequently e.g. "-1.0" is parsed as two tokens: a negative * sign and a positive numeric literal. The compiler performs * the negation during compilation, so this has no adverse impact. * * * There is no token for "undefined": it is just a value available * from the global object (or simply established by doing a reference * to an undefined value). * * * Some contexts want Identifier tokens, which are IdentifierNames * excluding reserved words, while some contexts want IdentifierNames * directly. In the latter case e.g. "while" is interpreted as an * identifier name, not a DUK_TOK_WHILE token. The solution here is * to provide both token types: DUK_TOK_WHILE goes to 't' while * DUK_TOK_IDENTIFIER goes to 't_nores', and 'slot1' always contains * the identifier / keyword name. * * * Directive prologue needs to identify string literals such as * "use strict" and 'use strict', which are sensitive to line * continuations and escape sequences. For instance, "use\u0020strict" * is a valid directive but is distinct from "use strict". The solution * here is to decode escapes while tokenizing, but to keep track of the * number of escapes. Directive detection can then check that the * number of escapes is zero. * * * Multi-line comments with one or more internal LineTerminator are * treated like a line terminator to comply with automatic semicolon * insertion. */ DUK_INTERNAL void duk_lexer_parse_js_input_element(duk_lexer_ctx *lex_ctx, duk_token *out_token, duk_bool_t strict_mode, duk_bool_t regexp_mode) { duk_codepoint_t x; /* temporary, must be signed and 32-bit to hold Unicode code points */ duk_small_uint_t advtok = 0; /* (advance << 8) + token_type, updated at function end, * init is unnecessary but suppresses "may be used uninitialized" warnings. */ duk_bool_t got_lineterm = 0; /* got lineterm preceding non-whitespace, non-lineterm token */ if (++lex_ctx->token_count >= lex_ctx->token_limit) { goto fail_token_limit; } out_token->t = DUK_TOK_EOF; out_token->t_nores = DUK_TOK_INVALID; /* marker: copy t if not changed */ #if 0 /* not necessary to init, disabled for faster parsing */ out_token->num = DUK_DOUBLE_NAN; out_token->str1 = NULL; out_token->str2 = NULL; #endif out_token->num_escapes = 0; /* out_token->lineterm set by caller */ /* This would be nice, but parsing is faster without resetting the * value slots. The only side effect is that references to temporary * string values may linger until lexing is finished; they're then * freed normally. */ #if 0 duk_to_undefined(lex_ctx->thr, lex_ctx->slot1_idx); duk_to_undefined(lex_ctx->thr, lex_ctx->slot2_idx); #endif /* 'advtok' indicates how much to advance and which token id to assign * at the end. This shared functionality minimizes code size. All * code paths are required to set 'advtok' to some value, so no default * init value is used. Code paths calling DUK_ERROR() never return so * they don't need to set advtok. */ /* * Matching order: * * Punctuator first chars, also covers comments, regexps * LineTerminator * Identifier or reserved word, also covers null/true/false literals * NumericLiteral * StringLiteral * EOF * * The order does not matter as long as the longest match is * always correctly identified. There are order dependencies * in the clauses, so it's not trivial to convert to a switch. */ restart_lineupdate: out_token->start_line = lex_ctx->window[0].line; restart: out_token->start_offset = lex_ctx->window[0].offset; x = DUK__L0(); switch (x) { case DUK_ASC_SPACE: case DUK_ASC_HT: /* fast paths for space and tab */ DUK__ADVANCECHARS(lex_ctx, 1); goto restart; case DUK_ASC_LF: /* LF line terminator; CR LF and Unicode lineterms are handled in slow path */ DUK__ADVANCECHARS(lex_ctx, 1); got_lineterm = 1; goto restart_lineupdate; #if defined(DUK_USE_SHEBANG_COMMENTS) case DUK_ASC_HASH: /* '#' */ if (DUK__L1() == DUK_ASC_EXCLAMATION && lex_ctx->window[0].offset == 0 && (lex_ctx->flags & DUK_COMPILE_SHEBANG)) { /* "Shebang" comment ('#! ...') on first line. */ /* DUK__ADVANCECHARS(lex_ctx, 2) would be correct here, but not necessary */ duk__lexer_skip_to_endofline(lex_ctx); goto restart; /* line terminator will be handled on next round */ } goto fail_token; #endif /* DUK_USE_SHEBANG_COMMENTS */ case DUK_ASC_SLASH: /* '/' */ if (DUK__L1() == DUK_ASC_SLASH) { /* * E5 Section 7.4, allow SourceCharacter (which is any 16-bit * code point). */ /* DUK__ADVANCECHARS(lex_ctx, 2) would be correct here, but not necessary */ duk__lexer_skip_to_endofline(lex_ctx); goto restart; /* line terminator will be handled on next round */ } else if (DUK__L1() == DUK_ASC_STAR) { /* * E5 Section 7.4. If the multi-line comment contains a newline, * it is treated like a single line terminator for automatic * semicolon insertion. */ duk_bool_t last_asterisk = 0; DUK__ADVANCECHARS(lex_ctx, 2); for (;;) { x = DUK__L0(); if (x < 0) { goto fail_unterm_comment; } DUK__ADVANCECHARS(lex_ctx, 1); if (last_asterisk && x == DUK_ASC_SLASH) { break; } if (duk_unicode_is_line_terminator(x)) { got_lineterm = 1; } last_asterisk = (x == DUK_ASC_STAR); } goto restart_lineupdate; } else if (regexp_mode) { #if defined(DUK_USE_REGEXP_SUPPORT) /* * "/" followed by something in regexp mode. See E5 Section 7.8.5. * * RegExp parsing is a bit complex. First, the regexp body is delimited * by forward slashes, but the body may also contain forward slashes as * part of an escape sequence or inside a character class (delimited by * square brackets). A mini state machine is used to implement these. * * Further, an early (parse time) error must be thrown if the regexp * would cause a run-time error when used in the expression new RegExp(...). * Parsing here simply extracts the (candidate) regexp, and also accepts * invalid regular expressions (which are delimited properly). The caller * (compiler) must perform final validation and regexp compilation. * * RegExp first char may not be '/' (single line comment) or '*' (multi- * line comment). These have already been checked above, so there is no * need below for special handling of the first regexp character as in * the E5 productions. * * About unicode escapes within regexp literals: * * E5 Section 7.8.5 grammar does NOT accept \uHHHH escapes. * However, Section 6 states that regexps accept the escapes, * see paragraph starting with "In string literals...". * The regexp grammar, which sees the decoded regexp literal * (after lexical parsing) DOES have a \uHHHH unicode escape. * So, for instance: * * /\u1234/ * * should first be parsed by the lexical grammar as: * * '\' 'u' RegularExpressionBackslashSequence * '1' RegularExpressionNonTerminator * '2' RegularExpressionNonTerminator * '3' RegularExpressionNonTerminator * '4' RegularExpressionNonTerminator * * and the escape itself is then parsed by the regexp engine. * This is the current implementation. * * Minor spec inconsistency: * * E5 Section 7.8.5 RegularExpressionBackslashSequence is: * * \ RegularExpressionNonTerminator * * while Section A.1 RegularExpressionBackslashSequence is: * * \ NonTerminator * * The latter is not normative and a typo. * */ /* first, parse regexp body roughly */ duk_small_int_t state = 0; /* 0=base, 1=esc, 2=class, 3=class+esc */ DUK__INITBUFFER(lex_ctx); for (;;) { DUK__ADVANCECHARS(lex_ctx, 1); /* skip opening slash on first loop */ x = DUK__L0(); if (x < 0 || duk_unicode_is_line_terminator(x)) { goto fail_unterm_regexp; } x = DUK__L0(); /* re-read to avoid spill / fetch */ if (state == 0) { if (x == DUK_ASC_SLASH) { DUK__ADVANCECHARS(lex_ctx, 1); /* eat closing slash */ break; } else if (x == DUK_ASC_BACKSLASH) { state = 1; } else if (x == DUK_ASC_LBRACKET) { state = 2; } } else if (state == 1) { state = 0; } else if (state == 2) { if (x == DUK_ASC_RBRACKET) { state = 0; } else if (x == DUK_ASC_BACKSLASH) { state = 3; } } else { /* state == 3 */ state = 2; } DUK__APPENDBUFFER(lex_ctx, x); } out_token->str1 = duk__internbuffer(lex_ctx, lex_ctx->slot1_idx); /* second, parse flags */ DUK__INITBUFFER(lex_ctx); for (;;) { x = DUK__L0(); if (!duk_unicode_is_identifier_part(x)) { break; } x = DUK__L0(); /* re-read to avoid spill / fetch */ DUK__APPENDBUFFER(lex_ctx, x); DUK__ADVANCECHARS(lex_ctx, 1); } out_token->str2 = duk__internbuffer(lex_ctx, lex_ctx->slot2_idx); DUK__INITBUFFER(lex_ctx); /* free some memory */ /* validation of the regexp is caller's responsibility */ advtok = DUK__ADVTOK(0, DUK_TOK_REGEXP); #else /* DUK_USE_REGEXP_SUPPORT */ goto fail_regexp_support; #endif /* DUK_USE_REGEXP_SUPPORT */ } else if (DUK__L1() == DUK_ASC_EQUALS) { /* "/=" and not in regexp mode */ advtok = DUK__ADVTOK(2, DUK_TOK_DIV_EQ); } else { /* "/" and not in regexp mode */ advtok = DUK__ADVTOK(1, DUK_TOK_DIV); } break; case DUK_ASC_LCURLY: /* '{' */ advtok = DUK__ADVTOK(1, DUK_TOK_LCURLY); break; case DUK_ASC_RCURLY: /* '}' */ advtok = DUK__ADVTOK(1, DUK_TOK_RCURLY); break; case DUK_ASC_LPAREN: /* '(' */ advtok = DUK__ADVTOK(1, DUK_TOK_LPAREN); break; case DUK_ASC_RPAREN: /* ')' */ advtok = DUK__ADVTOK(1, DUK_TOK_RPAREN); break; case DUK_ASC_LBRACKET: /* '[' */ advtok = DUK__ADVTOK(1, DUK_TOK_LBRACKET); break; case DUK_ASC_RBRACKET: /* ']' */ advtok = DUK__ADVTOK(1, DUK_TOK_RBRACKET); break; case DUK_ASC_PERIOD: /* '.' */ if (DUK__ISDIGIT(DUK__L1())) { /* Period followed by a digit can only start DecimalLiteral * (handled in slow path). We could jump straight into the * DecimalLiteral handling but should avoid goto to inside * a block. */ goto slow_path; } advtok = DUK__ADVTOK(1, DUK_TOK_PERIOD); break; case DUK_ASC_SEMICOLON: /* ';' */ advtok = DUK__ADVTOK(1, DUK_TOK_SEMICOLON); break; case DUK_ASC_COMMA: /* ',' */ advtok = DUK__ADVTOK(1, DUK_TOK_COMMA); break; case DUK_ASC_LANGLE: /* '<' */ #if defined(DUK_USE_HTML_COMMENTS) if (DUK__L1() == DUK_ASC_EXCLAMATION && DUK__L2() == DUK_ASC_MINUS && DUK__L3() == DUK_ASC_MINUS) { /* * ES2015: B.1.3, handle "<!--" SingleLineHTMLOpenComment */ /* DUK__ADVANCECHARS(lex_ctx, 4) would be correct here, but not necessary */ duk__lexer_skip_to_endofline(lex_ctx); goto restart; /* line terminator will be handled on next round */ } else #endif /* DUK_USE_HTML_COMMENTS */ if (DUK__L1() == DUK_ASC_LANGLE && DUK__L2() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(3, DUK_TOK_ALSHIFT_EQ); } else if (DUK__L1() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(2, DUK_TOK_LE); } else if (DUK__L1() == DUK_ASC_LANGLE) { advtok = DUK__ADVTOK(2, DUK_TOK_ALSHIFT); } else { advtok = DUK__ADVTOK(1, DUK_TOK_LT); } break; case DUK_ASC_RANGLE: /* '>' */ if (DUK__L1() == DUK_ASC_RANGLE && DUK__L2() == DUK_ASC_RANGLE && DUK__L3() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(4, DUK_TOK_RSHIFT_EQ); } else if (DUK__L1() == DUK_ASC_RANGLE && DUK__L2() == DUK_ASC_RANGLE) { advtok = DUK__ADVTOK(3, DUK_TOK_RSHIFT); } else if (DUK__L1() == DUK_ASC_RANGLE && DUK__L2() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(3, DUK_TOK_ARSHIFT_EQ); } else if (DUK__L1() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(2, DUK_TOK_GE); } else if (DUK__L1() == DUK_ASC_RANGLE) { advtok = DUK__ADVTOK(2, DUK_TOK_ARSHIFT); } else { advtok = DUK__ADVTOK(1, DUK_TOK_GT); } break; case DUK_ASC_EQUALS: /* '=' */ if (DUK__L1() == DUK_ASC_EQUALS && DUK__L2() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(3, DUK_TOK_SEQ); } else if (DUK__L1() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(2, DUK_TOK_EQ); } else { advtok = DUK__ADVTOK(1, DUK_TOK_EQUALSIGN); } break; case DUK_ASC_EXCLAMATION: /* '!' */ if (DUK__L1() == DUK_ASC_EQUALS && DUK__L2() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(3, DUK_TOK_SNEQ); } else if (DUK__L1() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(2, DUK_TOK_NEQ); } else { advtok = DUK__ADVTOK(1, DUK_TOK_LNOT); } break; case DUK_ASC_PLUS: /* '+' */ if (DUK__L1() == DUK_ASC_PLUS) { advtok = DUK__ADVTOK(2, DUK_TOK_INCREMENT); } else if (DUK__L1() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(2, DUK_TOK_ADD_EQ); } else { advtok = DUK__ADVTOK(1, DUK_TOK_ADD); } break; case DUK_ASC_MINUS: /* '-' */ #if defined(DUK_USE_HTML_COMMENTS) if (got_lineterm && DUK__L1() == DUK_ASC_MINUS && DUK__L2() == DUK_ASC_RANGLE) { /* * ES2015: B.1.3, handle "-->" SingleLineHTMLCloseComment * Only allowed: * - on new line * - preceded only by whitespace * - preceded by end of multiline comment and optional whitespace * * Since whitespace generates no tokens, and multiline comments * are treated as a line ending, consulting `got_lineterm` is * sufficient to test for these three options. */ /* DUK__ADVANCECHARS(lex_ctx, 3) would be correct here, but not necessary */ duk__lexer_skip_to_endofline(lex_ctx); goto restart; /* line terminator will be handled on next round */ } else #endif /* DUK_USE_HTML_COMMENTS */ if (DUK__L1() == DUK_ASC_MINUS) { advtok = DUK__ADVTOK(2, DUK_TOK_DECREMENT); } else if (DUK__L1() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(2, DUK_TOK_SUB_EQ); } else { advtok = DUK__ADVTOK(1, DUK_TOK_SUB); } break; case DUK_ASC_STAR: /* '*' */ #if defined(DUK_USE_ES7_EXP_OPERATOR) if (DUK__L1() == DUK_ASC_STAR && DUK__L2() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(3, DUK_TOK_EXP_EQ); } else if (DUK__L1() == DUK_ASC_STAR) { advtok = DUK__ADVTOK(2, DUK_TOK_EXP); } else #endif if (DUK__L1() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(2, DUK_TOK_MUL_EQ); } else { advtok = DUK__ADVTOK(1, DUK_TOK_MUL); } break; case DUK_ASC_PERCENT: /* '%' */ if (DUK__L1() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(2, DUK_TOK_MOD_EQ); } else { advtok = DUK__ADVTOK(1, DUK_TOK_MOD); } break; case DUK_ASC_AMP: /* '&' */ if (DUK__L1() == DUK_ASC_AMP) { advtok = DUK__ADVTOK(2, DUK_TOK_LAND); } else if (DUK__L1() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(2, DUK_TOK_BAND_EQ); } else { advtok = DUK__ADVTOK(1, DUK_TOK_BAND); } break; case DUK_ASC_PIPE: /* '|' */ if (DUK__L1() == DUK_ASC_PIPE) { advtok = DUK__ADVTOK(2, DUK_TOK_LOR); } else if (DUK__L1() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(2, DUK_TOK_BOR_EQ); } else { advtok = DUK__ADVTOK(1, DUK_TOK_BOR); } break; case DUK_ASC_CARET: /* '^' */ if (DUK__L1() == DUK_ASC_EQUALS) { advtok = DUK__ADVTOK(2, DUK_TOK_BXOR_EQ); } else { advtok = DUK__ADVTOK(1, DUK_TOK_BXOR); } break; case DUK_ASC_TILDE: /* '~' */ advtok = DUK__ADVTOK(1, DUK_TOK_BNOT); break; case DUK_ASC_QUESTION: /* '?' */ advtok = DUK__ADVTOK(1, DUK_TOK_QUESTION); break; case DUK_ASC_COLON: /* ':' */ advtok = DUK__ADVTOK(1, DUK_TOK_COLON); break; case DUK_ASC_DOUBLEQUOTE: /* '"' */ case DUK_ASC_SINGLEQUOTE: { /* '\'' */ DUK__INITBUFFER(lex_ctx); duk__lexer_parse_string_literal(lex_ctx, out_token, x /*quote*/, strict_mode); duk__internbuffer(lex_ctx, lex_ctx->slot1_idx); out_token->str1 = duk_known_hstring(lex_ctx->thr, lex_ctx->slot1_idx); DUK__INITBUFFER(lex_ctx); /* free some memory */ advtok = DUK__ADVTOK(0, DUK_TOK_STRING); break; } default: goto slow_path; } /* switch */ goto skip_slow_path; slow_path: if (duk_unicode_is_line_terminator(x)) { if (x == 0x000d && DUK__L1() == 0x000a) { /* * E5 Section 7.3: CR LF is detected as a single line terminator for * line numbers. Here we also detect it as a single line terminator * token. */ DUK__ADVANCECHARS(lex_ctx, 2); } else { DUK__ADVANCECHARS(lex_ctx, 1); } got_lineterm = 1; goto restart_lineupdate; } else if (duk_unicode_is_identifier_start(x) || x == DUK_ASC_BACKSLASH) { /* * Parse an identifier and then check whether it is: * - reserved word (keyword or other reserved word) * - "null" (NullLiteral) * - "true" (BooleanLiteral) * - "false" (BooleanLiteral) * - anything else => identifier * * This does not follow the E5 productions cleanly, but is * useful and compact. * * Note that identifiers may contain Unicode escapes, * see E5 Sections 6 and 7.6. They must be decoded first, * and the result checked against allowed characters. * The above if-clause accepts an identifier start and an * '\' character -- no other token can begin with a '\'. * * Note that "get" and "set" are not reserved words in E5 * specification so they are recognized as plain identifiers * (the tokens DUK_TOK_GET and DUK_TOK_SET are actually not * used now). The compiler needs to work around this. * * Strictly speaking, following Ecmascript longest match * specification, an invalid escape for the first character * should cause a syntax error. However, an invalid escape * for IdentifierParts should just terminate the identifier * early (longest match), and let the next tokenization * fail. For instance Rhino croaks with 'foo\z' when * parsing the identifier. This has little practical impact. */ duk_small_uint_t i, i_end; duk_bool_t first = 1; duk_hstring *str; DUK__INITBUFFER(lex_ctx); for (;;) { /* re-lookup first char on first loop */ if (DUK__L0() == DUK_ASC_BACKSLASH) { duk_codepoint_t esc_cp; if (DUK__L1() != DUK_ASC_LC_U) { goto fail_escape; } esc_cp = duk__lexer_parse_escape(lex_ctx, 1 /*allow_es6*/); DUK__APPENDBUFFER(lex_ctx, esc_cp); /* IdentifierStart is stricter than IdentifierPart, so if the first * character is escaped, must have a stricter check here. */ if (!(first ? duk_unicode_is_identifier_start(esc_cp) : duk_unicode_is_identifier_part(esc_cp))) { goto fail_escape; } /* Track number of escapes: necessary for proper keyword * detection. */ out_token->num_escapes++; } else { /* Note: first character is checked against this. But because * IdentifierPart includes all IdentifierStart characters, and * the first character (if unescaped) has already been checked * in the if condition, this is OK. */ if (!duk_unicode_is_identifier_part(DUK__L0())) { break; } DUK__APPENDBUFFER(lex_ctx, DUK__L0()); DUK__ADVANCECHARS(lex_ctx, 1); } first = 0; } out_token->str1 = duk__internbuffer(lex_ctx, lex_ctx->slot1_idx); str = out_token->str1; out_token->t_nores = DUK_TOK_IDENTIFIER; DUK__INITBUFFER(lex_ctx); /* free some memory */ /* * Interned identifier is compared against reserved words, which are * currently interned into the heap context. See genbuiltins.py. * * Note that an escape in the identifier disables recognition of * keywords; e.g. "\u0069f = 1;" is a valid statement (assigns to * identifier named "if"). This is not necessarily compliant, * see test-dec-escaped-char-in-keyword.js. * * Note: "get" and "set" are awkward. They are not officially * ReservedWords (and indeed e.g. "var set = 1;" is valid), and * must come out as DUK_TOK_IDENTIFIER. The compiler needs to * work around this a bit. */ /* XXX: optimize by adding the token numbers directly into the * always interned duk_hstring objects (there should be enough * flag bits free for that)? */ i_end = (strict_mode ? DUK_STRIDX_END_RESERVED : DUK_STRIDX_START_STRICT_RESERVED); advtok = DUK__ADVTOK(0, DUK_TOK_IDENTIFIER); if (out_token->num_escapes == 0) { for (i = DUK_STRIDX_START_RESERVED; i < i_end; i++) { DUK_ASSERT_DISABLE(i >= 0); /* unsigned */ DUK_ASSERT(i < DUK_HEAP_NUM_STRINGS); if (DUK_HTHREAD_GET_STRING(lex_ctx->thr, i) == str) { advtok = DUK__ADVTOK(0, DUK_STRIDX_TO_TOK(i)); break; } } } } else if (DUK__ISDIGIT(x) || (x == DUK_ASC_PERIOD)) { /* Note: decimal number may start with a period, but must be followed by a digit */ /* * Pre-parsing for decimal, hex, octal (both legacy and ES2015), * and binary literals, followed by an actual parser step * provided by numconv. * * Note: the leading sign character ('+' or '-') is -not- part of * the production in E5 grammar, and that the a DecimalLiteral * starting with a '0' must be followed by a non-digit. * * XXX: the two step parsing process is quite awkward, it would * be more straightforward to allow numconv to parse the longest * valid prefix (it already does that, it only needs to indicate * where the input ended). However, the lexer decodes characters * using a limited lookup window, so this is not a trivial change. */ /* XXX: because of the final check below (that the literal is not * followed by a digit), this could maybe be simplified, if we bail * out early from a leading zero (and if there are no periods etc). * Maybe too complex. */ duk_double_t val; duk_bool_t legacy_oct = 0; duk_small_int_t state; /* 0=before period/exp, * 1=after period, before exp * 2=after exp, allow '+' or '-' * 3=after exp and exp sign */ duk_small_uint_t s2n_flags; duk_codepoint_t y, z; duk_small_int_t s2n_radix = 10; duk_small_uint_t pre_adv = 0; DUK__INITBUFFER(lex_ctx); y = DUK__L1(); if (x == DUK_ASC_0) { z = DUK_LOWERCASE_CHAR_ASCII(y); pre_adv = 2; /* default for 0xNNN, 0oNNN, 0bNNN. */ if (z == DUK_ASC_LC_X) { s2n_radix = 16; } else if (z == DUK_ASC_LC_O) { s2n_radix = 8; } else if (z == DUK_ASC_LC_B) { s2n_radix = 2; } else { pre_adv = 0; if (DUK__ISDIGIT(y)) { if (strict_mode) { /* Reject octal like \07 but also octal-lookalike * decimal like \08 in strict mode. */ goto fail_number_literal; } else { /* Legacy OctalIntegerLiteral or octal-lookalice * decimal. Deciding between the two happens below * in digit scanning. */ DUK__APPENDBUFFER(lex_ctx, x); pre_adv = 1; legacy_oct = 1; s2n_radix = 8; /* tentative unless conflicting digits found */ } } } } DUK__ADVANCECHARS(lex_ctx, pre_adv); /* XXX: we could parse integers here directly, and fall back * to numconv only when encountering a fractional expression * or when an octal literal turned out to be decimal (0778 etc). */ state = 0; for (;;) { x = DUK__L0(); /* re-lookup curr char on first round */ if (DUK__ISDIGIT(x)) { /* Note: intentionally allow leading zeroes here, as the * actual parser will check for them. */ if (state == 0 && legacy_oct && (x == DUK_ASC_8 || x == DUK_ASC_9)) { /* Started out as an octal-lookalike * but interpreted as decimal, e.g. * '0779' -> 779. This also means * that fractions are allowed, e.g. * '0779.123' is allowed but '0777.123' * is not! */ s2n_radix = 10; } if (state == 2) { state = 3; } } else if (s2n_radix == 16 && DUK__ISHEXDIGIT(x)) { /* Note: 'e' and 'E' are also accepted here. */ ; } else if (x == DUK_ASC_PERIOD) { if (state >= 1 || s2n_radix != 10) { break; } else { state = 1; } } else if (x == DUK_ASC_LC_E || x == DUK_ASC_UC_E) { if (state >= 2 || s2n_radix != 10) { break; } else { state = 2; } } else if (x == DUK_ASC_MINUS || x == DUK_ASC_PLUS) { if (state != 2) { break; } else { state = 3; } } else { break; } DUK__APPENDBUFFER(lex_ctx, x); DUK__ADVANCECHARS(lex_ctx, 1); } /* XXX: better coercion */ (void) duk__internbuffer(lex_ctx, lex_ctx->slot1_idx); if (s2n_radix != 10) { /* For bases other than 10, integer only. */ s2n_flags = DUK_S2N_FLAG_ALLOW_LEADING_ZERO; } else { s2n_flags = DUK_S2N_FLAG_ALLOW_EXP | DUK_S2N_FLAG_ALLOW_FRAC | DUK_S2N_FLAG_ALLOW_NAKED_FRAC | DUK_S2N_FLAG_ALLOW_EMPTY_FRAC | DUK_S2N_FLAG_ALLOW_LEADING_ZERO; } duk_dup(lex_ctx->thr, lex_ctx->slot1_idx); duk_numconv_parse(lex_ctx->thr, s2n_radix, s2n_flags); val = duk_to_number_m1(lex_ctx->thr); if (DUK_ISNAN(val)) { goto fail_number_literal; } duk_replace(lex_ctx->thr, lex_ctx->slot1_idx); /* could also just pop? */ DUK__INITBUFFER(lex_ctx); /* free some memory */ /* Section 7.8.3 (note): NumericLiteral must be followed by something other than * IdentifierStart or DecimalDigit. */ if (DUK__ISDIGIT(DUK__L0()) || duk_unicode_is_identifier_start(DUK__L0())) { goto fail_number_literal; } out_token->num = val; advtok = DUK__ADVTOK(0, DUK_TOK_NUMBER); } else if (duk_unicode_is_whitespace(DUK__LOOKUP(lex_ctx, 0))) { DUK__ADVANCECHARS(lex_ctx, 1); goto restart; } else if (x < 0) { advtok = DUK__ADVTOK(0, DUK_TOK_EOF); } else { goto fail_token; } skip_slow_path: /* * Shared exit path */ DUK__ADVANCEBYTES(lex_ctx, advtok >> 8); out_token->t = advtok & 0xff; if (out_token->t_nores == DUK_TOK_INVALID) { out_token->t_nores = out_token->t; } out_token->lineterm = got_lineterm; /* Automatic semicolon insertion is allowed if a token is preceded * by line terminator(s), or terminates a statement list (right curly * or EOF). */ if (got_lineterm || out_token->t == DUK_TOK_RCURLY || out_token->t == DUK_TOK_EOF) { out_token->allow_auto_semi = 1; } else { out_token->allow_auto_semi = 0; } return; fail_token_limit: DUK_ERROR_RANGE(lex_ctx->thr, DUK_STR_TOKEN_LIMIT); return; fail_token: DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_TOKEN); return; fail_number_literal: DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_NUMBER_LITERAL); return; fail_escape: DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_ESCAPE); return; fail_unterm_regexp: DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_UNTERMINATED_REGEXP); return; fail_unterm_comment: DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_UNTERMINATED_COMMENT); return; #if !defined(DUK_USE_REGEXP_SUPPORT) fail_regexp_support: DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_REGEXP_SUPPORT_DISABLED); return; #endif } #if defined(DUK_USE_REGEXP_SUPPORT) /* * Parse a RegExp token. The grammar is described in E5 Section 15.10. * Terminal constructions (such as quantifiers) are parsed directly here. * * 0xffffffffU is used as a marker for "infinity" in quantifiers. Further, * DUK__MAX_RE_QUANT_DIGITS limits the maximum number of digits that * will be accepted for a quantifier. */ DUK_INTERNAL void duk_lexer_parse_re_token(duk_lexer_ctx *lex_ctx, duk_re_token *out_token) { duk_small_uint_t advtok = 0; /* init is unnecessary but suppresses "may be used uninitialized" warnings */ duk_codepoint_t x, y; if (++lex_ctx->token_count >= lex_ctx->token_limit) { goto fail_token_limit; } DUK_MEMZERO(out_token, sizeof(*out_token)); x = DUK__L0(); y = DUK__L1(); DUK_DDD(DUK_DDDPRINT("parsing regexp token, L0=%ld, L1=%ld", (long) x, (long) y)); switch (x) { case DUK_ASC_PIPE: { advtok = DUK__ADVTOK(1, DUK_RETOK_DISJUNCTION); break; } case DUK_ASC_CARET: { advtok = DUK__ADVTOK(1, DUK_RETOK_ASSERT_START); break; } case DUK_ASC_DOLLAR: { advtok = DUK__ADVTOK(1, DUK_RETOK_ASSERT_END); break; } case DUK_ASC_QUESTION: { out_token->qmin = 0; out_token->qmax = 1; if (y == DUK_ASC_QUESTION) { advtok = DUK__ADVTOK(2, DUK_RETOK_QUANTIFIER); out_token->greedy = 0; } else { advtok = DUK__ADVTOK(1, DUK_RETOK_QUANTIFIER); out_token->greedy = 1; } break; } case DUK_ASC_STAR: { out_token->qmin = 0; out_token->qmax = DUK_RE_QUANTIFIER_INFINITE; if (y == DUK_ASC_QUESTION) { advtok = DUK__ADVTOK(2, DUK_RETOK_QUANTIFIER); out_token->greedy = 0; } else { advtok = DUK__ADVTOK(1, DUK_RETOK_QUANTIFIER); out_token->greedy = 1; } break; } case DUK_ASC_PLUS: { out_token->qmin = 1; out_token->qmax = DUK_RE_QUANTIFIER_INFINITE; if (y == DUK_ASC_QUESTION) { advtok = DUK__ADVTOK(2, DUK_RETOK_QUANTIFIER); out_token->greedy = 0; } else { advtok = DUK__ADVTOK(1, DUK_RETOK_QUANTIFIER); out_token->greedy = 1; } break; } case DUK_ASC_LCURLY: { /* Production allows 'DecimalDigits', including leading zeroes */ duk_uint32_t val1 = 0; duk_uint32_t val2 = DUK_RE_QUANTIFIER_INFINITE; duk_small_int_t digits = 0; #if defined(DUK_USE_ES6_REGEXP_SYNTAX) duk_lexer_point lex_pt; #endif #if defined(DUK_USE_ES6_REGEXP_SYNTAX) /* Store lexer position, restoring if quantifier is invalid. */ DUK_LEXER_GETPOINT(lex_ctx, &lex_pt); #endif for (;;) { DUK__ADVANCECHARS(lex_ctx, 1); /* eat '{' on entry */ x = DUK__L0(); if (DUK__ISDIGIT(x)) { digits++; val1 = val1 * 10 + (duk_uint32_t) duk__hexval(x); } else if (x == DUK_ASC_COMMA) { if (digits > DUK__MAX_RE_QUANT_DIGITS) { goto invalid_quantifier; } if (val2 != DUK_RE_QUANTIFIER_INFINITE) { goto invalid_quantifier; } if (DUK__L1() == DUK_ASC_RCURLY) { /* form: { DecimalDigits , }, val1 = min count */ if (digits == 0) { goto invalid_quantifier; } out_token->qmin = val1; out_token->qmax = DUK_RE_QUANTIFIER_INFINITE; DUK__ADVANCECHARS(lex_ctx, 2); break; } val2 = val1; val1 = 0; digits = 0; /* not strictly necessary because of lookahead '}' above */ } else if (x == DUK_ASC_RCURLY) { if (digits > DUK__MAX_RE_QUANT_DIGITS) { goto invalid_quantifier; } if (digits == 0) { goto invalid_quantifier; } if (val2 != DUK_RE_QUANTIFIER_INFINITE) { /* val2 = min count, val1 = max count */ out_token->qmin = val2; out_token->qmax = val1; } else { /* val1 = count */ out_token->qmin = val1; out_token->qmax = val1; } DUK__ADVANCECHARS(lex_ctx, 1); break; } else { goto invalid_quantifier; } } if (DUK__L0() == DUK_ASC_QUESTION) { out_token->greedy = 0; DUK__ADVANCECHARS(lex_ctx, 1); } else { out_token->greedy = 1; } advtok = DUK__ADVTOK(0, DUK_RETOK_QUANTIFIER); break; invalid_quantifier: #if defined(DUK_USE_ES6_REGEXP_SYNTAX) /* Failed to match the quantifier, restore lexer and parse * opening brace as a literal. */ DUK_LEXER_SETPOINT(lex_ctx, &lex_pt); advtok = DUK__ADVTOK(1, DUK_RETOK_ATOM_CHAR); out_token->num = DUK_ASC_LCURLY; #else goto fail_quantifier; #endif break; } case DUK_ASC_PERIOD: { advtok = DUK__ADVTOK(1, DUK_RETOK_ATOM_PERIOD); break; } case DUK_ASC_BACKSLASH: { /* The E5.1 specification does not seem to allow IdentifierPart characters * to be used as identity escapes. Unfortunately this includes '$', which * cannot be escaped as '\$'; it needs to be escaped e.g. as '\u0024'. * Many other implementations (including V8 and Rhino, for instance) do * accept '\$' as a valid identity escape, which is quite pragmatic, and * ES2015 Annex B relaxes the rules to allow these (and other) real world forms. */ advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_CHAR); /* default: char escape (two chars) */ if (y == DUK_ASC_LC_B) { advtok = DUK__ADVTOK(2, DUK_RETOK_ASSERT_WORD_BOUNDARY); } else if (y == DUK_ASC_UC_B) { advtok = DUK__ADVTOK(2, DUK_RETOK_ASSERT_NOT_WORD_BOUNDARY); } else if (y == DUK_ASC_LC_F) { out_token->num = 0x000c; } else if (y == DUK_ASC_LC_N) { out_token->num = 0x000a; } else if (y == DUK_ASC_LC_T) { out_token->num = 0x0009; } else if (y == DUK_ASC_LC_R) { out_token->num = 0x000d; } else if (y == DUK_ASC_LC_V) { out_token->num = 0x000b; } else if (y == DUK_ASC_LC_C) { x = DUK__L2(); if ((x >= DUK_ASC_LC_A && x <= DUK_ASC_LC_Z) || (x >= DUK_ASC_UC_A && x <= DUK_ASC_UC_Z)) { out_token->num = (duk_uint32_t) (x % 32); advtok = DUK__ADVTOK(3, DUK_RETOK_ATOM_CHAR); } else { goto fail_escape; } } else if (y == DUK_ASC_LC_X || y == DUK_ASC_LC_U) { /* The token value is the Unicode codepoint without * it being decode into surrogate pair characters * here. The \u{H+} is only allowed in Unicode mode * which we don't support yet. */ out_token->num = (duk_uint32_t) duk__lexer_parse_escape(lex_ctx, 0 /*allow_es6*/); advtok = DUK__ADVTOK(0, DUK_RETOK_ATOM_CHAR); } else if (y == DUK_ASC_LC_D) { advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_DIGIT); } else if (y == DUK_ASC_UC_D) { advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_NOT_DIGIT); } else if (y == DUK_ASC_LC_S) { advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_WHITE); } else if (y == DUK_ASC_UC_S) { advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_NOT_WHITE); } else if (y == DUK_ASC_LC_W) { advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_WORD_CHAR); } else if (y == DUK_ASC_UC_W) { advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_NOT_WORD_CHAR); } else if (DUK__ISDIGIT(y)) { /* E5 Section 15.10.2.11 */ if (y == DUK_ASC_0) { if (DUK__ISDIGIT(DUK__L2())) { goto fail_escape; } out_token->num = 0x0000; advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_CHAR); } else { /* XXX: shared parsing? */ duk_uint32_t val = 0; duk_small_int_t i; for (i = 0; ; i++) { if (i >= DUK__MAX_RE_DECESC_DIGITS) { goto fail_escape; } DUK__ADVANCECHARS(lex_ctx, 1); /* eat backslash on entry */ x = DUK__L0(); if (!DUK__ISDIGIT(x)) { break; } val = val * 10 + (duk_uint32_t) duk__hexval(x); } /* DUK__L0() cannot be a digit, because the loop doesn't terminate if it is */ advtok = DUK__ADVTOK(0, DUK_RETOK_ATOM_BACKREFERENCE); out_token->num = val; } #if defined(DUK_USE_ES6_REGEXP_SYNTAX) } else if (y >= 0) { /* For ES2015 Annex B, accept any source character as identity * escape except 'c' which is used for control characters. * http://www.ecma-international.org/ecma-262/6.0/#sec-regular-expressions-patterns * Careful not to match end-of-buffer (<0) here. * This is not yet full ES2015 Annex B because cases above * (like hex escape) won't backtrack. */ DUK_ASSERT(y != DUK_ASC_LC_C); /* covered above */ #else /* DUK_USE_ES6_REGEXP_SYNTAX */ } else if ((y >= 0 && !duk_unicode_is_identifier_part(y)) || y == DUK_UNICODE_CP_ZWNJ || y == DUK_UNICODE_CP_ZWJ) { /* For ES5.1 identity escapes are not allowed for identifier * parts. This conflicts with a lot of real world code as this * doesn't e.g. allow escaping a dollar sign as /\$/, see * test-regexp-identity-escape-dollar.js. */ #endif /* DUK_USE_ES6_REGEXP_SYNTAX */ out_token->num = (duk_uint32_t) y; } else { goto fail_escape; } break; } case DUK_ASC_LPAREN: { /* XXX: naming is inconsistent: ATOM_END_GROUP ends an ASSERT_START_LOOKAHEAD */ if (y == DUK_ASC_QUESTION) { if (DUK__L2() == DUK_ASC_EQUALS) { /* (?= */ advtok = DUK__ADVTOK(3, DUK_RETOK_ASSERT_START_POS_LOOKAHEAD); } else if (DUK__L2() == DUK_ASC_EXCLAMATION) { /* (?! */ advtok = DUK__ADVTOK(3, DUK_RETOK_ASSERT_START_NEG_LOOKAHEAD); } else if (DUK__L2() == DUK_ASC_COLON) { /* (?: */ advtok = DUK__ADVTOK(3, DUK_RETOK_ATOM_START_NONCAPTURE_GROUP); } else { goto fail_group; } } else { /* ( */ advtok = DUK__ADVTOK(1, DUK_RETOK_ATOM_START_CAPTURE_GROUP); } break; } case DUK_ASC_RPAREN: { advtok = DUK__ADVTOK(1, DUK_RETOK_ATOM_END_GROUP); break; } case DUK_ASC_LBRACKET: { /* * To avoid creating a heavy intermediate value for the list of ranges, * only the start token ('[' or '[^') is parsed here. The regexp * compiler parses the ranges itself. */ /* XXX: with DUK_USE_ES6_REGEXP_SYNTAX we should allow left bracket * literal too, but it's not easy to parse without backtracking. */ advtok = DUK__ADVTOK(1, DUK_RETOK_ATOM_START_CHARCLASS); if (y == DUK_ASC_CARET) { advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_START_CHARCLASS_INVERTED); } break; } #if !defined(DUK_USE_ES6_REGEXP_SYNTAX) case DUK_ASC_RCURLY: case DUK_ASC_RBRACKET: { /* Although these could be parsed as PatternCharacters unambiguously (here), * E5 Section 15.10.1 grammar explicitly forbids these as PatternCharacters. */ goto fail_invalid_char; break; } #endif case -1: { /* EOF */ advtok = DUK__ADVTOK(0, DUK_TOK_EOF); break; } default: { /* PatternCharacter, all excluded characters are matched by cases above */ advtok = DUK__ADVTOK(1, DUK_RETOK_ATOM_CHAR); out_token->num = (duk_uint32_t) x; break; } } /* * Shared exit path */ DUK__ADVANCEBYTES(lex_ctx, advtok >> 8); out_token->t = advtok & 0xff; return; fail_token_limit: DUK_ERROR_RANGE(lex_ctx->thr, DUK_STR_TOKEN_LIMIT); return; fail_escape: DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_REGEXP_ESCAPE); return; fail_group: DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_REGEXP_GROUP); return; #if !defined(DUK_USE_ES6_REGEXP_SYNTAX) fail_invalid_char: DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_REGEXP_CHARACTER); return; fail_quantifier: DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_QUANTIFIER); return; #endif } /* * Special parser for character classes; calls callback for every * range parsed and returns the number of ranges present. */ /* XXX: this duplicates functionality in duk_regexp.c where a similar loop is * required anyway. We could use that BUT we need to update the regexp compiler * 'nranges' too. Work this out a bit more cleanly to save space. */ /* XXX: the handling of character range detection is a bit convoluted. * Try to simplify and make smaller. */ /* XXX: logic for handling character ranges is now incorrect, it will accept * e.g. [\d-z] whereas it should croak from it? SMJS accepts this too, though. * * Needs a read through and a lot of additional tests. */ DUK_LOCAL void duk__emit_u16_direct_ranges(duk_lexer_ctx *lex_ctx, duk_re_range_callback gen_range, void *userdata, const duk_uint16_t *ranges, duk_small_int_t num) { const duk_uint16_t *ranges_end; DUK_UNREF(lex_ctx); ranges_end = ranges + num; while (ranges < ranges_end) { /* mark range 'direct', bypass canonicalization (see Wiki) */ gen_range(userdata, (duk_codepoint_t) ranges[0], (duk_codepoint_t) ranges[1], 1); ranges += 2; } } DUK_INTERNAL void duk_lexer_parse_re_ranges(duk_lexer_ctx *lex_ctx, duk_re_range_callback gen_range, void *userdata) { duk_codepoint_t start = -1; duk_codepoint_t ch; duk_codepoint_t x; duk_bool_t dash = 0; duk_small_uint_t adv = 0; DUK_DD(DUK_DDPRINT("parsing regexp ranges")); for (;;) { DUK__ADVANCECHARS(lex_ctx, adv); adv = 1; x = DUK__L0(); ch = -1; /* not strictly necessary, but avoids "uninitialized variable" warnings */ DUK_UNREF(ch); if (x < 0) { goto fail_unterm_charclass; } else if (x == DUK_ASC_RBRACKET) { if (start >= 0) { gen_range(userdata, start, start, 0); } DUK__ADVANCECHARS(lex_ctx, 1); /* eat ']' before finishing */ break; } else if (x == DUK_ASC_MINUS) { if (start >= 0 && !dash && DUK__L1() != DUK_ASC_RBRACKET) { /* '-' as a range indicator */ dash = 1; continue; } else { /* '-' verbatim */ ch = x; } } else if (x == DUK_ASC_BACKSLASH) { /* * The escapes are same as outside a character class, except that \b has a * different meaning, and \B and backreferences are prohibited (see E5 * Section 15.10.2.19). However, it's difficult to share code because we * handle e.g. "\n" very differently: here we generate a single character * range for it. */ /* XXX: ES2015 surrogate pair handling. */ x = DUK__L1(); adv = 2; if (x == DUK_ASC_LC_B) { /* Note: '\b' in char class is different than outside (assertion), * '\B' is not allowed and is caught by the duk_unicode_is_identifier_part() * check below. */ ch = 0x0008; } else if (x == DUK_ASC_LC_F) { ch = 0x000c; } else if (x == DUK_ASC_LC_N) { ch = 0x000a; } else if (x == DUK_ASC_LC_T) { ch = 0x0009; } else if (x == DUK_ASC_LC_R) { ch = 0x000d; } else if (x == DUK_ASC_LC_V) { ch = 0x000b; } else if (x == DUK_ASC_LC_C) { x = DUK__L2(); adv = 3; if ((x >= DUK_ASC_LC_A && x <= DUK_ASC_LC_Z) || (x >= DUK_ASC_UC_A && x <= DUK_ASC_UC_Z)) { ch = (x % 32); } else { goto fail_escape; } } else if (x == DUK_ASC_LC_X || x == DUK_ASC_LC_U) { /* The \u{H+} form is only allowed in Unicode mode which * we don't support yet. */ ch = duk__lexer_parse_escape(lex_ctx, 0 /*allow_es6*/); adv = 0; } else if (x == DUK_ASC_LC_D) { duk__emit_u16_direct_ranges(lex_ctx, gen_range, userdata, duk_unicode_re_ranges_digit, sizeof(duk_unicode_re_ranges_digit) / sizeof(duk_uint16_t)); ch = -1; } else if (x == DUK_ASC_UC_D) { duk__emit_u16_direct_ranges(lex_ctx, gen_range, userdata, duk_unicode_re_ranges_not_digit, sizeof(duk_unicode_re_ranges_not_digit) / sizeof(duk_uint16_t)); ch = -1; } else if (x == DUK_ASC_LC_S) { duk__emit_u16_direct_ranges(lex_ctx, gen_range, userdata, duk_unicode_re_ranges_white, sizeof(duk_unicode_re_ranges_white) / sizeof(duk_uint16_t)); ch = -1; } else if (x == DUK_ASC_UC_S) { duk__emit_u16_direct_ranges(lex_ctx, gen_range, userdata, duk_unicode_re_ranges_not_white, sizeof(duk_unicode_re_ranges_not_white) / sizeof(duk_uint16_t)); ch = -1; } else if (x == DUK_ASC_LC_W) { duk__emit_u16_direct_ranges(lex_ctx, gen_range, userdata, duk_unicode_re_ranges_wordchar, sizeof(duk_unicode_re_ranges_wordchar) / sizeof(duk_uint16_t)); ch = -1; } else if (x == DUK_ASC_UC_W) { duk__emit_u16_direct_ranges(lex_ctx, gen_range, userdata, duk_unicode_re_ranges_not_wordchar, sizeof(duk_unicode_re_ranges_not_wordchar) / sizeof(duk_uint16_t)); ch = -1; } else if (DUK__ISDIGIT(x)) { /* DecimalEscape, only \0 is allowed, no leading * zeroes are allowed. * * ES2015 Annex B also allows (maximal match) legacy * octal escapes up to \377 and \8 and \9 are * accepted as literal '8' and '9', also in strict mode. */ #if defined(DUK_USE_ES6_REGEXP_SYNTAX) ch = duk__lexer_parse_legacy_octal(lex_ctx, &adv, 0 /*reject_annex_b*/); DUK_ASSERT(ch >= 0); /* no rejections */ #else if (x == DUK_ASC_0 && !DUK__ISDIGIT(DUK__L2())) { ch = 0x0000; } else { goto fail_escape; } #endif #if defined(DUK_USE_ES6_REGEXP_SYNTAX) } else if (x >= 0) { /* IdentityEscape: ES2015 Annex B allows almost all * source characters here. Match anything except * EOF here. */ ch = x; #else /* DUK_USE_ES6_REGEXP_SYNTAX */ } else if (!duk_unicode_is_identifier_part(x)) { /* IdentityEscape: ES5.1 doesn't allow identity escape * for identifier part characters, which conflicts with * some real world code. For example, it doesn't allow * /[\$]/ which is awkward. */ ch = x; #endif /* DUK_USE_ES6_REGEXP_SYNTAX */ } else { goto fail_escape; } } else { /* character represents itself */ ch = x; } /* ch is a literal character here or -1 if parsed entity was * an escape such as "\s". */ if (ch < 0) { /* multi-character sets not allowed as part of ranges, see * E5 Section 15.10.2.15, abstract operation CharacterRange. */ if (start >= 0) { if (dash) { goto fail_range; } else { gen_range(userdata, start, start, 0); start = -1; /* dash is already 0 */ } } } else { if (start >= 0) { if (dash) { if (start > ch) { goto fail_range; } gen_range(userdata, start, ch, 0); start = -1; dash = 0; } else { gen_range(userdata, start, start, 0); start = ch; /* dash is already 0 */ } } else { start = ch; } } } return; fail_escape: DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_REGEXP_ESCAPE); return; fail_range: DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_RANGE); return; fail_unterm_charclass: DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_UNTERMINATED_CHARCLASS); return; } #endif /* DUK_USE_REGEXP_SUPPORT */ /* automatic undefs */ #undef DUK__ADVANCEBYTES #undef DUK__ADVANCECHARS #undef DUK__ADVTOK #undef DUK__APPENDBUFFER #undef DUK__APPENDBUFFER_ASCII #undef DUK__INITBUFFER #undef DUK__ISDIGIT #undef DUK__ISDIGIT03 #undef DUK__ISDIGIT47 #undef DUK__ISHEXDIGIT #undef DUK__ISOCTDIGIT #undef DUK__L0 #undef DUK__L1 #undef DUK__L2 #undef DUK__L3 #undef DUK__L4 #undef DUK__L5 #undef DUK__LOOKUP #undef DUK__MAX_RE_DECESC_DIGITS #undef DUK__MAX_RE_QUANT_DIGITS #line 1 "duk_numconv.c" /* * Number-to-string and string-to-number conversions. * * Slow path number-to-string and string-to-number conversion is based on * a Dragon4 variant, with fast paths for small integers. Big integer * arithmetic is needed for guaranteeing that the conversion is correct * and uses a minimum number of digits. The big number arithmetic has a * fixed maximum size and does not require dynamic allocations. * * See: doc/number-conversion.rst. */ /* #include duk_internal.h -> already included */ #define DUK__IEEE_DOUBLE_EXP_BIAS 1023 #define DUK__IEEE_DOUBLE_EXP_MIN (-1022) /* biased exp == 0 -> denormal, exp -1022 */ #define DUK__DIGITCHAR(x) duk_lc_digits[(x)] /* * Tables generated with util/gennumdigits.py. * * duk__str2num_digits_for_radix indicates, for each radix, how many input * digits should be considered significant for string-to-number conversion. * The input is also padded to this many digits to give the Dragon4 * conversion enough (apparent) precision to work with. * * duk__str2num_exp_limits indicates, for each radix, the radix-specific * minimum/maximum exponent values (for a Dragon4 integer mantissa) * below and above which the number is guaranteed to underflow to zero * or overflow to Infinity. This allows parsing to keep bigint values * bounded. */ DUK_LOCAL const duk_uint8_t duk__str2num_digits_for_radix[] = { 69, 44, 35, 30, 27, 25, 23, 22, 20, 20, /* 2 to 11 */ 20, 19, 19, 18, 18, 17, 17, 17, 16, 16, /* 12 to 21 */ 16, 16, 16, 15, 15, 15, 15, 15, 15, 14, /* 22 to 31 */ 14, 14, 14, 14, 14 /* 31 to 36 */ }; typedef struct { duk_int16_t upper; duk_int16_t lower; } duk__exp_limits; DUK_LOCAL const duk__exp_limits duk__str2num_exp_limits[] = { { 957, -1147 }, { 605, -725 }, { 479, -575 }, { 414, -496 }, { 372, -446 }, { 342, -411 }, { 321, -384 }, { 304, -364 }, { 291, -346 }, { 279, -334 }, { 268, -323 }, { 260, -312 }, { 252, -304 }, { 247, -296 }, { 240, -289 }, { 236, -283 }, { 231, -278 }, { 227, -273 }, { 223, -267 }, { 220, -263 }, { 216, -260 }, { 213, -256 }, { 210, -253 }, { 208, -249 }, { 205, -246 }, { 203, -244 }, { 201, -241 }, { 198, -239 }, { 196, -237 }, { 195, -234 }, { 193, -232 }, { 191, -230 }, { 190, -228 }, { 188, -226 }, { 187, -225 }, }; /* * Limited functionality bigint implementation. * * Restricted to non-negative numbers with less than 32 * DUK__BI_MAX_PARTS bits, * with the caller responsible for ensuring this is never exceeded. No memory * allocation (except stack) is needed for bigint computation. Operations * have been tailored for number conversion needs. * * Argument order is "assignment order", i.e. target first, then arguments: * x <- y * z --> duk__bi_mul(x, y, z); */ /* This upper value has been experimentally determined; debug build will check * bigint size with assertions. */ #define DUK__BI_MAX_PARTS 37 /* 37x32 = 1184 bits */ #if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) #define DUK__BI_PRINT(name,x) duk__bi_print((name),(x)) #else #define DUK__BI_PRINT(name,x) #endif /* Current size is about 152 bytes. */ typedef struct { duk_small_int_t n; duk_uint32_t v[DUK__BI_MAX_PARTS]; /* low to high */ } duk__bigint; #if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) DUK_LOCAL void duk__bi_print(const char *name, duk__bigint *x) { /* Overestimate required size; debug code so not critical to be tight. */ char buf[DUK__BI_MAX_PARTS * 9 + 64]; char *p = buf; duk_small_int_t i; /* No NUL term checks in this debug code. */ p += DUK_SPRINTF(p, "%p n=%ld", (void *) x, (long) x->n); if (x->n == 0) { p += DUK_SPRINTF(p, " 0"); } for (i = x->n - 1; i >= 0; i--) { p += DUK_SPRINTF(p, " %08lx", (unsigned long) x->v[i]); } DUK_DDD(DUK_DDDPRINT("%s: %s", (const char *) name, (const char *) buf)); } #endif #if defined(DUK_USE_ASSERTIONS) DUK_LOCAL duk_small_int_t duk__bi_is_valid(duk__bigint *x) { return (duk_small_int_t) ( ((x->n >= 0) && (x->n <= DUK__BI_MAX_PARTS)) /* is valid size */ && ((x->n == 0) || (x->v[x->n - 1] != 0)) /* is normalized */ ); } #endif DUK_LOCAL void duk__bi_normalize(duk__bigint *x) { duk_small_int_t i; for (i = x->n - 1; i >= 0; i--) { if (x->v[i] != 0) { break; } } /* Note: if 'x' is zero, x->n becomes 0 here */ x->n = i + 1; DUK_ASSERT(duk__bi_is_valid(x)); } /* x <- y */ DUK_LOCAL void duk__bi_copy(duk__bigint *x, duk__bigint *y) { duk_small_int_t n; n = y->n; x->n = n; if (n == 0) { return; } DUK_MEMCPY((void *) x->v, (const void *) y->v, (size_t) (sizeof(duk_uint32_t) * (size_t) n)); } DUK_LOCAL void duk__bi_set_small(duk__bigint *x, duk_uint32_t v) { if (v == 0U) { x->n = 0; } else { x->n = 1; x->v[0] = v; } DUK_ASSERT(duk__bi_is_valid(x)); } /* Return value: <0 <=> x < y * 0 <=> x == y * >0 <=> x > y */ DUK_LOCAL int duk__bi_compare(duk__bigint *x, duk__bigint *y) { duk_small_int_t i, nx, ny; duk_uint32_t tx, ty; DUK_ASSERT(duk__bi_is_valid(x)); DUK_ASSERT(duk__bi_is_valid(y)); nx = x->n; ny = y->n; if (nx > ny) { goto ret_gt; } if (nx < ny) { goto ret_lt; } for (i = nx - 1; i >= 0; i--) { tx = x->v[i]; ty = y->v[i]; if (tx > ty) { goto ret_gt; } if (tx < ty) { goto ret_lt; } } return 0; ret_gt: return 1; ret_lt: return -1; } /* x <- y + z */ #if defined(DUK_USE_64BIT_OPS) DUK_LOCAL void duk__bi_add(duk__bigint *x, duk__bigint *y, duk__bigint *z) { duk_uint64_t tmp; duk_small_int_t i, ny, nz; DUK_ASSERT(duk__bi_is_valid(y)); DUK_ASSERT(duk__bi_is_valid(z)); if (z->n > y->n) { duk__bigint *t; t = y; y = z; z = t; } DUK_ASSERT(y->n >= z->n); ny = y->n; nz = z->n; tmp = 0U; for (i = 0; i < ny; i++) { DUK_ASSERT(i < DUK__BI_MAX_PARTS); tmp += y->v[i]; if (i < nz) { tmp += z->v[i]; } x->v[i] = (duk_uint32_t) (tmp & 0xffffffffUL); tmp = tmp >> 32; } if (tmp != 0U) { DUK_ASSERT(i < DUK__BI_MAX_PARTS); x->v[i++] = (duk_uint32_t) tmp; } x->n = i; DUK_ASSERT(x->n <= DUK__BI_MAX_PARTS); /* no need to normalize */ DUK_ASSERT(duk__bi_is_valid(x)); } #else /* DUK_USE_64BIT_OPS */ DUK_LOCAL void duk__bi_add(duk__bigint *x, duk__bigint *y, duk__bigint *z) { duk_uint32_t carry, tmp1, tmp2; duk_small_int_t i, ny, nz; DUK_ASSERT(duk__bi_is_valid(y)); DUK_ASSERT(duk__bi_is_valid(z)); if (z->n > y->n) { duk__bigint *t; t = y; y = z; z = t; } DUK_ASSERT(y->n >= z->n); ny = y->n; nz = z->n; carry = 0U; for (i = 0; i < ny; i++) { /* Carry is detected based on wrapping which relies on exact 32-bit * types. */ DUK_ASSERT(i < DUK__BI_MAX_PARTS); tmp1 = y->v[i]; tmp2 = tmp1; if (i < nz) { tmp2 += z->v[i]; } /* Careful with carry condition: * - If carry not added: 0x12345678 + 0 + 0xffffffff = 0x12345677 (< 0x12345678) * - If carry added: 0x12345678 + 1 + 0xffffffff = 0x12345678 (== 0x12345678) */ if (carry) { tmp2++; carry = (tmp2 <= tmp1 ? 1U : 0U); } else { carry = (tmp2 < tmp1 ? 1U : 0U); } x->v[i] = tmp2; } if (carry) { DUK_ASSERT(i < DUK__BI_MAX_PARTS); DUK_ASSERT(carry == 1U); x->v[i++] = carry; } x->n = i; DUK_ASSERT(x->n <= DUK__BI_MAX_PARTS); /* no need to normalize */ DUK_ASSERT(duk__bi_is_valid(x)); } #endif /* DUK_USE_64BIT_OPS */ /* x <- y + z */ DUK_LOCAL void duk__bi_add_small(duk__bigint *x, duk__bigint *y, duk_uint32_t z) { duk__bigint tmp; DUK_ASSERT(duk__bi_is_valid(y)); /* XXX: this could be optimized; there is only one call site now though */ duk__bi_set_small(&tmp, z); duk__bi_add(x, y, &tmp); DUK_ASSERT(duk__bi_is_valid(x)); } #if 0 /* unused */ /* x <- x + y, use t as temp */ DUK_LOCAL void duk__bi_add_copy(duk__bigint *x, duk__bigint *y, duk__bigint *t) { duk__bi_add(t, x, y); duk__bi_copy(x, t); } #endif /* x <- y - z, require x >= y => z >= 0, i.e. y >= z */ #if defined(DUK_USE_64BIT_OPS) DUK_LOCAL void duk__bi_sub(duk__bigint *x, duk__bigint *y, duk__bigint *z) { duk_small_int_t i, ny, nz; duk_uint32_t ty, tz; duk_int64_t tmp; DUK_ASSERT(duk__bi_is_valid(y)); DUK_ASSERT(duk__bi_is_valid(z)); DUK_ASSERT(duk__bi_compare(y, z) >= 0); DUK_ASSERT(y->n >= z->n); ny = y->n; nz = z->n; tmp = 0; for (i = 0; i < ny; i++) { ty = y->v[i]; if (i < nz) { tz = z->v[i]; } else { tz = 0; } tmp = (duk_int64_t) ty - (duk_int64_t) tz + tmp; x->v[i] = (duk_uint32_t) ((duk_uint64_t) tmp & 0xffffffffUL); tmp = tmp >> 32; /* 0 or -1 */ } DUK_ASSERT(tmp == 0); x->n = i; duk__bi_normalize(x); /* need to normalize, may even cancel to 0 */ DUK_ASSERT(duk__bi_is_valid(x)); } #else DUK_LOCAL void duk__bi_sub(duk__bigint *x, duk__bigint *y, duk__bigint *z) { duk_small_int_t i, ny, nz; duk_uint32_t tmp1, tmp2, borrow; DUK_ASSERT(duk__bi_is_valid(y)); DUK_ASSERT(duk__bi_is_valid(z)); DUK_ASSERT(duk__bi_compare(y, z) >= 0); DUK_ASSERT(y->n >= z->n); ny = y->n; nz = z->n; borrow = 0U; for (i = 0; i < ny; i++) { /* Borrow is detected based on wrapping which relies on exact 32-bit * types. */ tmp1 = y->v[i]; tmp2 = tmp1; if (i < nz) { tmp2 -= z->v[i]; } /* Careful with borrow condition: * - If borrow not subtracted: 0x12345678 - 0 - 0xffffffff = 0x12345679 (> 0x12345678) * - If borrow subtracted: 0x12345678 - 1 - 0xffffffff = 0x12345678 (== 0x12345678) */ if (borrow) { tmp2--; borrow = (tmp2 >= tmp1 ? 1U : 0U); } else { borrow = (tmp2 > tmp1 ? 1U : 0U); } x->v[i] = tmp2; } DUK_ASSERT(borrow == 0U); x->n = i; duk__bi_normalize(x); /* need to normalize, may even cancel to 0 */ DUK_ASSERT(duk__bi_is_valid(x)); } #endif #if 0 /* unused */ /* x <- y - z */ DUK_LOCAL void duk__bi_sub_small(duk__bigint *x, duk__bigint *y, duk_uint32_t z) { duk__bigint tmp; DUK_ASSERT(duk__bi_is_valid(y)); /* XXX: this could be optimized */ duk__bi_set_small(&tmp, z); duk__bi_sub(x, y, &tmp); DUK_ASSERT(duk__bi_is_valid(x)); } #endif /* x <- x - y, use t as temp */ DUK_LOCAL void duk__bi_sub_copy(duk__bigint *x, duk__bigint *y, duk__bigint *t) { duk__bi_sub(t, x, y); duk__bi_copy(x, t); } /* x <- y * z */ DUK_LOCAL void duk__bi_mul(duk__bigint *x, duk__bigint *y, duk__bigint *z) { duk_small_int_t i, j, nx, nz; DUK_ASSERT(duk__bi_is_valid(y)); DUK_ASSERT(duk__bi_is_valid(z)); nx = y->n + z->n; /* max possible */ DUK_ASSERT(nx <= DUK__BI_MAX_PARTS); if (nx == 0) { /* Both inputs are zero; cases where only one is zero can go * through main algorithm. */ x->n = 0; return; } DUK_MEMZERO((void *) x->v, (size_t) (sizeof(duk_uint32_t) * (size_t) nx)); x->n = nx; nz = z->n; for (i = 0; i < y->n; i++) { #if defined(DUK_USE_64BIT_OPS) duk_uint64_t tmp = 0U; for (j = 0; j < nz; j++) { tmp += (duk_uint64_t) y->v[i] * (duk_uint64_t) z->v[j] + x->v[i+j]; x->v[i+j] = (duk_uint32_t) (tmp & 0xffffffffUL); tmp = tmp >> 32; } if (tmp > 0) { DUK_ASSERT(i + j < nx); DUK_ASSERT(i + j < DUK__BI_MAX_PARTS); DUK_ASSERT(x->v[i+j] == 0U); x->v[i+j] = (duk_uint32_t) tmp; } #else /* * Multiply + add + carry for 32-bit components using only 16x16->32 * multiplies and carry detection based on unsigned overflow. * * 1st mult, 32-bit: (A*2^16 + B) * 2nd mult, 32-bit: (C*2^16 + D) * 3rd add, 32-bit: E * 4th add, 32-bit: F * * (AC*2^16 + B) * (C*2^16 + D) + E + F * = AC*2^32 + AD*2^16 + BC*2^16 + BD + E + F * = AC*2^32 + (AD + BC)*2^16 + (BD + E + F) * = AC*2^32 + AD*2^16 + BC*2^16 + (BD + E + F) */ duk_uint32_t a, b, c, d, e, f; duk_uint32_t r, s, t; a = y->v[i]; b = a & 0xffffUL; a = a >> 16; f = 0; for (j = 0; j < nz; j++) { c = z->v[j]; d = c & 0xffffUL; c = c >> 16; e = x->v[i+j]; /* build result as: (r << 32) + s: start with (BD + E + F) */ r = 0; s = b * d; /* add E */ t = s + e; if (t < s) { r++; } /* carry */ s = t; /* add F */ t = s + f; if (t < s) { r++; } /* carry */ s = t; /* add BC*2^16 */ t = b * c; r += (t >> 16); t = s + ((t & 0xffffUL) << 16); if (t < s) { r++; } /* carry */ s = t; /* add AD*2^16 */ t = a * d; r += (t >> 16); t = s + ((t & 0xffffUL) << 16); if (t < s) { r++; } /* carry */ s = t; /* add AC*2^32 */ t = a * c; r += t; DUK_DDD(DUK_DDDPRINT("ab=%08lx cd=%08lx ef=%08lx -> rs=%08lx %08lx", (unsigned long) y->v[i], (unsigned long) z->v[j], (unsigned long) x->v[i+j], (unsigned long) r, (unsigned long) s)); x->v[i+j] = s; f = r; } if (f > 0U) { DUK_ASSERT(i + j < nx); DUK_ASSERT(i + j < DUK__BI_MAX_PARTS); DUK_ASSERT(x->v[i+j] == 0U); x->v[i+j] = (duk_uint32_t) f; } #endif /* DUK_USE_64BIT_OPS */ } duk__bi_normalize(x); DUK_ASSERT(duk__bi_is_valid(x)); } /* x <- y * z */ DUK_LOCAL void duk__bi_mul_small(duk__bigint *x, duk__bigint *y, duk_uint32_t z) { duk__bigint tmp; DUK_ASSERT(duk__bi_is_valid(y)); /* XXX: this could be optimized */ duk__bi_set_small(&tmp, z); duk__bi_mul(x, y, &tmp); DUK_ASSERT(duk__bi_is_valid(x)); } /* x <- x * y, use t as temp */ DUK_LOCAL void duk__bi_mul_copy(duk__bigint *x, duk__bigint *y, duk__bigint *t) { duk__bi_mul(t, x, y); duk__bi_copy(x, t); } /* x <- x * y, use t as temp */ DUK_LOCAL void duk__bi_mul_small_copy(duk__bigint *x, duk_uint32_t y, duk__bigint *t) { duk__bi_mul_small(t, x, y); duk__bi_copy(x, t); } DUK_LOCAL int duk__bi_is_even(duk__bigint *x) { DUK_ASSERT(duk__bi_is_valid(x)); return (x->n == 0) || ((x->v[0] & 0x01) == 0); } DUK_LOCAL int duk__bi_is_zero(duk__bigint *x) { DUK_ASSERT(duk__bi_is_valid(x)); return (x->n == 0); /* this is the case for normalized numbers */ } /* Bigint is 2^52. Used to detect normalized IEEE double mantissa values * which are at the lowest edge (next floating point value downwards has * a different exponent). The lowest mantissa has the form: * * 1000........000 (52 zeroes; only "hidden bit" is set) */ DUK_LOCAL duk_small_int_t duk__bi_is_2to52(duk__bigint *x) { DUK_ASSERT(duk__bi_is_valid(x)); return (duk_small_int_t) (x->n == 2) && (x->v[0] == 0U) && (x->v[1] == (1U << (52-32))); } /* x <- (1<<y) */ DUK_LOCAL void duk__bi_twoexp(duk__bigint *x, duk_small_int_t y) { duk_small_int_t n, r; n = (y / 32) + 1; DUK_ASSERT(n > 0); r = y % 32; DUK_MEMZERO((void *) x->v, sizeof(duk_uint32_t) * (size_t) n); x->n = n; x->v[n - 1] = (((duk_uint32_t) 1) << r); } /* x <- b^y; use t1 and t2 as temps */ DUK_LOCAL void duk__bi_exp_small(duk__bigint *x, duk_small_int_t b, duk_small_int_t y, duk__bigint *t1, duk__bigint *t2) { /* Fast path the binary case */ DUK_ASSERT(x != t1 && x != t2 && t1 != t2); /* distinct bignums, easy mistake to make */ DUK_ASSERT(b >= 0); DUK_ASSERT(y >= 0); if (b == 2) { duk__bi_twoexp(x, y); return; } /* http://en.wikipedia.org/wiki/Exponentiation_by_squaring */ DUK_DDD(DUK_DDDPRINT("exp_small: b=%ld, y=%ld", (long) b, (long) y)); duk__bi_set_small(x, 1); duk__bi_set_small(t1, (duk_uint32_t) b); for (;;) { /* Loop structure ensures that we don't compute t1^2 unnecessarily * on the final round, as that might create a bignum exceeding the * current DUK__BI_MAX_PARTS limit. */ if (y & 0x01) { duk__bi_mul_copy(x, t1, t2); } y = y >> 1; if (y == 0) { break; } duk__bi_mul_copy(t1, t1, t2); } DUK__BI_PRINT("exp_small result", x); } /* * A Dragon4 number-to-string variant, based on: * * Guy L. Steele Jr., Jon L. White: "How to Print Floating-Point Numbers * Accurately" * * Robert G. Burger, R. Kent Dybvig: "Printing Floating-Point Numbers * Quickly and Accurately" * * The current algorithm is based on Figure 1 of the Burger-Dybvig paper, * i.e. the base implementation without logarithm estimation speedups * (these would increase code footprint considerably). Fixed-format output * does not follow the suggestions in the paper; instead, we generate an * extra digit and round-with-carry. * * The same algorithm is used for number parsing (with b=10 and B=2) * by generating one extra digit and doing rounding manually. * * See doc/number-conversion.rst for limitations. */ /* Maximum number of digits generated. */ #define DUK__MAX_OUTPUT_DIGITS 1040 /* (Number.MAX_VALUE).toString(2).length == 1024, + slack */ /* Maximum number of characters in formatted value. */ #define DUK__MAX_FORMATTED_LENGTH 1040 /* (-Number.MAX_VALUE).toString(2).length == 1025, + slack */ /* Number and (minimum) size of bigints in the nc_ctx structure. */ #define DUK__NUMCONV_CTX_NUM_BIGINTS 7 #define DUK__NUMCONV_CTX_BIGINTS_SIZE (sizeof(duk__bigint) * DUK__NUMCONV_CTX_NUM_BIGINTS) typedef struct { /* Currently about 7*152 = 1064 bytes. The space for these * duk__bigints is used also as a temporary buffer for generating * the final string. This is a bit awkard; a union would be * more correct. */ duk__bigint f, r, s, mp, mm, t1, t2; duk_small_int_t is_s2n; /* if 1, doing a string-to-number; else doing a number-to-string */ duk_small_int_t is_fixed; /* if 1, doing a fixed format output (not free format) */ duk_small_int_t req_digits; /* requested number of output digits; 0 = free-format */ duk_small_int_t abs_pos; /* digit position is absolute, not relative */ duk_small_int_t e; /* exponent for 'f' */ duk_small_int_t b; /* input radix */ duk_small_int_t B; /* output radix */ duk_small_int_t k; /* see algorithm */ duk_small_int_t low_ok; /* see algorithm */ duk_small_int_t high_ok; /* see algorithm */ duk_small_int_t unequal_gaps; /* m+ != m- (very rarely) */ /* Buffer used for generated digits, values are in the range [0,B-1]. */ duk_uint8_t digits[DUK__MAX_OUTPUT_DIGITS]; duk_small_int_t count; /* digit count */ } duk__numconv_stringify_ctx; /* Note: computes with 'idx' in assertions, so caller beware. * 'idx' is preincremented, i.e. '1' on first call, because it * is more convenient for the caller. */ #define DUK__DRAGON4_OUTPUT_PREINC(nc_ctx,preinc_idx,x) do { \ DUK_ASSERT((preinc_idx) - 1 >= 0); \ DUK_ASSERT((preinc_idx) - 1 < DUK__MAX_OUTPUT_DIGITS); \ ((nc_ctx)->digits[(preinc_idx) - 1]) = (duk_uint8_t) (x); \ } while (0) DUK_LOCAL duk_size_t duk__dragon4_format_uint32(duk_uint8_t *buf, duk_uint32_t x, duk_small_int_t radix) { duk_uint8_t *p; duk_size_t len; duk_small_int_t dig; duk_uint32_t t; DUK_ASSERT(radix >= 2 && radix <= 36); /* A 32-bit unsigned integer formats to at most 32 digits (the * worst case happens with radix == 2). Output the digits backwards, * and use a memmove() to get them in the right place. */ p = buf + 32; for (;;) { t = x / (duk_uint32_t) radix; dig = (duk_small_int_t) (x - t * (duk_uint32_t) radix); x = t; DUK_ASSERT(dig >= 0 && dig < 36); *(--p) = DUK__DIGITCHAR(dig); if (x == 0) { break; } } len = (duk_size_t) ((buf + 32) - p); DUK_MEMMOVE((void *) buf, (const void *) p, (size_t) len); return len; } DUK_LOCAL void duk__dragon4_prepare(duk__numconv_stringify_ctx *nc_ctx) { duk_small_int_t lowest_mantissa; #if 1 /* Assume IEEE round-to-even, so that shorter encoding can be used * when round-to-even would produce correct result. By removing * this check (and having low_ok == high_ok == 0) the results would * still be accurate but in some cases longer than necessary. */ if (duk__bi_is_even(&nc_ctx->f)) { DUK_DDD(DUK_DDDPRINT("f is even")); nc_ctx->low_ok = 1; nc_ctx->high_ok = 1; } else { DUK_DDD(DUK_DDDPRINT("f is odd")); nc_ctx->low_ok = 0; nc_ctx->high_ok = 0; } #else /* Note: not honoring round-to-even should work but now generates incorrect * results. For instance, 1e23 serializes to "a000...", i.e. the first digit * equals the radix (10). Scaling stops one step too early in this case. * Don't know why this is the case, but since this code path is unused, it * doesn't matter. */ nc_ctx->low_ok = 0; nc_ctx->high_ok = 0; #endif /* For string-to-number, pretend we never have the lowest mantissa as there * is no natural "precision" for inputs. Having lowest_mantissa == 0, we'll * fall into the base cases for both e >= 0 and e < 0. */ if (nc_ctx->is_s2n) { lowest_mantissa = 0; } else { lowest_mantissa = duk__bi_is_2to52(&nc_ctx->f); } nc_ctx->unequal_gaps = 0; if (nc_ctx->e >= 0) { /* exponent non-negative (and thus not minimum exponent) */ if (lowest_mantissa) { /* (>= e 0) AND (= f (expt b (- p 1))) * * be <- (expt b e) == b^e * be1 <- (* be b) == (expt b (+ e 1)) == b^(e+1) * r <- (* f be1 2) == 2 * f * b^(e+1) [if b==2 -> f * b^(e+2)] * s <- (* b 2) [if b==2 -> 4] * m+ <- be1 == b^(e+1) * m- <- be == b^e * k <- 0 * B <- B * low_ok <- round * high_ok <- round */ DUK_DDD(DUK_DDDPRINT("non-negative exponent (not smallest exponent); " "lowest mantissa value for this exponent -> " "unequal gaps")); duk__bi_exp_small(&nc_ctx->mm, nc_ctx->b, nc_ctx->e, &nc_ctx->t1, &nc_ctx->t2); /* mm <- b^e */ duk__bi_mul_small(&nc_ctx->mp, &nc_ctx->mm, (duk_uint32_t) nc_ctx->b); /* mp <- b^(e+1) */ duk__bi_mul_small(&nc_ctx->t1, &nc_ctx->f, 2); duk__bi_mul(&nc_ctx->r, &nc_ctx->t1, &nc_ctx->mp); /* r <- (2 * f) * b^(e+1) */ duk__bi_set_small(&nc_ctx->s, (duk_uint32_t) (nc_ctx->b * 2)); /* s <- 2 * b */ nc_ctx->unequal_gaps = 1; } else { /* (>= e 0) AND (not (= f (expt b (- p 1)))) * * be <- (expt b e) == b^e * r <- (* f be 2) == 2 * f * b^e [if b==2 -> f * b^(e+1)] * s <- 2 * m+ <- be == b^e * m- <- be == b^e * k <- 0 * B <- B * low_ok <- round * high_ok <- round */ DUK_DDD(DUK_DDDPRINT("non-negative exponent (not smallest exponent); " "not lowest mantissa for this exponent -> " "equal gaps")); duk__bi_exp_small(&nc_ctx->mm, nc_ctx->b, nc_ctx->e, &nc_ctx->t1, &nc_ctx->t2); /* mm <- b^e */ duk__bi_copy(&nc_ctx->mp, &nc_ctx->mm); /* mp <- b^e */ duk__bi_mul_small(&nc_ctx->t1, &nc_ctx->f, 2); duk__bi_mul(&nc_ctx->r, &nc_ctx->t1, &nc_ctx->mp); /* r <- (2 * f) * b^e */ duk__bi_set_small(&nc_ctx->s, 2); /* s <- 2 */ } } else { /* When doing string-to-number, lowest_mantissa is always 0 so * the exponent check, while incorrect, won't matter. */ if (nc_ctx->e > DUK__IEEE_DOUBLE_EXP_MIN /*not minimum exponent*/ && lowest_mantissa /* lowest mantissa for this exponent*/) { /* r <- (* f b 2) [if b==2 -> (* f 4)] * s <- (* (expt b (- 1 e)) 2) == b^(1-e) * 2 [if b==2 -> b^(2-e)] * m+ <- b == 2 * m- <- 1 * k <- 0 * B <- B * low_ok <- round * high_ok <- round */ DUK_DDD(DUK_DDDPRINT("negative exponent; not minimum exponent and " "lowest mantissa for this exponent -> " "unequal gaps")); duk__bi_mul_small(&nc_ctx->r, &nc_ctx->f, (duk_uint32_t) (nc_ctx->b * 2)); /* r <- (2 * b) * f */ duk__bi_exp_small(&nc_ctx->t1, nc_ctx->b, 1 - nc_ctx->e, &nc_ctx->s, &nc_ctx->t2); /* NB: use 's' as temp on purpose */ duk__bi_mul_small(&nc_ctx->s, &nc_ctx->t1, 2); /* s <- b^(1-e) * 2 */ duk__bi_set_small(&nc_ctx->mp, 2); duk__bi_set_small(&nc_ctx->mm, 1); nc_ctx->unequal_gaps = 1; } else { /* r <- (* f 2) * s <- (* (expt b (- e)) 2) == b^(-e) * 2 [if b==2 -> b^(1-e)] * m+ <- 1 * m- <- 1 * k <- 0 * B <- B * low_ok <- round * high_ok <- round */ DUK_DDD(DUK_DDDPRINT("negative exponent; minimum exponent or not " "lowest mantissa for this exponent -> " "equal gaps")); duk__bi_mul_small(&nc_ctx->r, &nc_ctx->f, 2); /* r <- 2 * f */ duk__bi_exp_small(&nc_ctx->t1, nc_ctx->b, -nc_ctx->e, &nc_ctx->s, &nc_ctx->t2); /* NB: use 's' as temp on purpose */ duk__bi_mul_small(&nc_ctx->s, &nc_ctx->t1, 2); /* s <- b^(-e) * 2 */ duk__bi_set_small(&nc_ctx->mp, 1); duk__bi_set_small(&nc_ctx->mm, 1); } } } DUK_LOCAL void duk__dragon4_scale(duk__numconv_stringify_ctx *nc_ctx) { duk_small_int_t k = 0; /* This is essentially the 'scale' algorithm, with recursion removed. * Note that 'k' is either correct immediately, or will move in one * direction in the loop. There's no need to do the low/high checks * on every round (like the Scheme algorithm does). * * The scheme algorithm finds 'k' and updates 's' simultaneously, * while the logical algorithm finds 'k' with 's' having its initial * value, after which 's' is updated separately (see the Burger-Dybvig * paper, Section 3.1, steps 2 and 3). * * The case where m+ == m- (almost always) is optimized for, because * it reduces the bigint operations considerably and almost always * applies. The scale loop only needs to work with m+, so this works. */ /* XXX: this algorithm could be optimized quite a lot by using e.g. * a logarithm based estimator for 'k' and performing B^n multiplication * using a lookup table or using some bit-representation based exp * algorithm. Currently we just loop, with significant performance * impact for very large and very small numbers. */ DUK_DDD(DUK_DDDPRINT("scale: B=%ld, low_ok=%ld, high_ok=%ld", (long) nc_ctx->B, (long) nc_ctx->low_ok, (long) nc_ctx->high_ok)); DUK__BI_PRINT("r(init)", &nc_ctx->r); DUK__BI_PRINT("s(init)", &nc_ctx->s); DUK__BI_PRINT("mp(init)", &nc_ctx->mp); DUK__BI_PRINT("mm(init)", &nc_ctx->mm); for (;;) { DUK_DDD(DUK_DDDPRINT("scale loop (inc k), k=%ld", (long) k)); DUK__BI_PRINT("r", &nc_ctx->r); DUK__BI_PRINT("s", &nc_ctx->s); DUK__BI_PRINT("m+", &nc_ctx->mp); DUK__BI_PRINT("m-", &nc_ctx->mm); duk__bi_add(&nc_ctx->t1, &nc_ctx->r, &nc_ctx->mp); /* t1 = (+ r m+) */ if (duk__bi_compare(&nc_ctx->t1, &nc_ctx->s) >= (nc_ctx->high_ok ? 0 : 1)) { DUK_DDD(DUK_DDDPRINT("k is too low")); /* r <- r * s <- (* s B) * m+ <- m+ * m- <- m- * k <- (+ k 1) */ duk__bi_mul_small_copy(&nc_ctx->s, (duk_uint32_t) nc_ctx->B, &nc_ctx->t1); k++; } else { break; } } /* k > 0 -> k was too low, and cannot be too high */ if (k > 0) { goto skip_dec_k; } for (;;) { DUK_DDD(DUK_DDDPRINT("scale loop (dec k), k=%ld", (long) k)); DUK__BI_PRINT("r", &nc_ctx->r); DUK__BI_PRINT("s", &nc_ctx->s); DUK__BI_PRINT("m+", &nc_ctx->mp); DUK__BI_PRINT("m-", &nc_ctx->mm); duk__bi_add(&nc_ctx->t1, &nc_ctx->r, &nc_ctx->mp); /* t1 = (+ r m+) */ duk__bi_mul_small(&nc_ctx->t2, &nc_ctx->t1, (duk_uint32_t) nc_ctx->B); /* t2 = (* (+ r m+) B) */ if (duk__bi_compare(&nc_ctx->t2, &nc_ctx->s) <= (nc_ctx->high_ok ? -1 : 0)) { DUK_DDD(DUK_DDDPRINT("k is too high")); /* r <- (* r B) * s <- s * m+ <- (* m+ B) * m- <- (* m- B) * k <- (- k 1) */ duk__bi_mul_small_copy(&nc_ctx->r, (duk_uint32_t) nc_ctx->B, &nc_ctx->t1); duk__bi_mul_small_copy(&nc_ctx->mp, (duk_uint32_t) nc_ctx->B, &nc_ctx->t1); if (nc_ctx->unequal_gaps) { DUK_DDD(DUK_DDDPRINT("m+ != m- -> need to update m- too")); duk__bi_mul_small_copy(&nc_ctx->mm, (duk_uint32_t) nc_ctx->B, &nc_ctx->t1); } k--; } else { break; } } skip_dec_k: if (!nc_ctx->unequal_gaps) { DUK_DDD(DUK_DDDPRINT("equal gaps, copy m- from m+")); duk__bi_copy(&nc_ctx->mm, &nc_ctx->mp); /* mm <- mp */ } nc_ctx->k = k; DUK_DDD(DUK_DDDPRINT("final k: %ld", (long) k)); DUK__BI_PRINT("r(final)", &nc_ctx->r); DUK__BI_PRINT("s(final)", &nc_ctx->s); DUK__BI_PRINT("mp(final)", &nc_ctx->mp); DUK__BI_PRINT("mm(final)", &nc_ctx->mm); } DUK_LOCAL void duk__dragon4_generate(duk__numconv_stringify_ctx *nc_ctx) { duk_small_int_t tc1, tc2; /* terminating conditions */ duk_small_int_t d; /* current digit */ duk_small_int_t count = 0; /* digit count */ /* * Digit generation loop. * * Different termination conditions: * * 1. Free format output. Terminate when shortest accurate * representation found. * * 2. Fixed format output, with specific number of digits. * Ignore termination conditions, terminate when digits * generated. Caller requests an extra digit and rounds. * * 3. Fixed format output, with a specific absolute cut-off * position (e.g. 10 digits after decimal point). Note * that we always generate at least one digit, even if * the digit is below the cut-off point already. */ for (;;) { DUK_DDD(DUK_DDDPRINT("generate loop, count=%ld, k=%ld, B=%ld, low_ok=%ld, high_ok=%ld", (long) count, (long) nc_ctx->k, (long) nc_ctx->B, (long) nc_ctx->low_ok, (long) nc_ctx->high_ok)); DUK__BI_PRINT("r", &nc_ctx->r); DUK__BI_PRINT("s", &nc_ctx->s); DUK__BI_PRINT("m+", &nc_ctx->mp); DUK__BI_PRINT("m-", &nc_ctx->mm); /* (quotient-remainder (* r B) s) using a dummy subtraction loop */ duk__bi_mul_small(&nc_ctx->t1, &nc_ctx->r, (duk_uint32_t) nc_ctx->B); /* t1 <- (* r B) */ d = 0; for (;;) { if (duk__bi_compare(&nc_ctx->t1, &nc_ctx->s) < 0) { break; } duk__bi_sub_copy(&nc_ctx->t1, &nc_ctx->s, &nc_ctx->t2); /* t1 <- t1 - s */ d++; } duk__bi_copy(&nc_ctx->r, &nc_ctx->t1); /* r <- (remainder (* r B) s) */ /* d <- (quotient (* r B) s) (in range 0...B-1) */ DUK_DDD(DUK_DDDPRINT("-> d(quot)=%ld", (long) d)); DUK__BI_PRINT("r(rem)", &nc_ctx->r); duk__bi_mul_small_copy(&nc_ctx->mp, (duk_uint32_t) nc_ctx->B, &nc_ctx->t2); /* m+ <- (* m+ B) */ duk__bi_mul_small_copy(&nc_ctx->mm, (duk_uint32_t) nc_ctx->B, &nc_ctx->t2); /* m- <- (* m- B) */ DUK__BI_PRINT("mp(upd)", &nc_ctx->mp); DUK__BI_PRINT("mm(upd)", &nc_ctx->mm); /* Terminating conditions. For fixed width output, we just ignore the * terminating conditions (and pretend that tc1 == tc2 == false). The * the current shortcut for fixed-format output is to generate a few * extra digits and use rounding (with carry) to finish the output. */ if (nc_ctx->is_fixed == 0) { /* free-form */ tc1 = (duk__bi_compare(&nc_ctx->r, &nc_ctx->mm) <= (nc_ctx->low_ok ? 0 : -1)); duk__bi_add(&nc_ctx->t1, &nc_ctx->r, &nc_ctx->mp); /* t1 <- (+ r m+) */ tc2 = (duk__bi_compare(&nc_ctx->t1, &nc_ctx->s) >= (nc_ctx->high_ok ? 0 : 1)); DUK_DDD(DUK_DDDPRINT("tc1=%ld, tc2=%ld", (long) tc1, (long) tc2)); } else { /* fixed-format */ tc1 = 0; tc2 = 0; } /* Count is incremented before DUK__DRAGON4_OUTPUT_PREINC() call * on purpose, which is taken into account by the macro. */ count++; if (tc1) { if (tc2) { /* tc1 = true, tc2 = true */ duk__bi_mul_small(&nc_ctx->t1, &nc_ctx->r, 2); if (duk__bi_compare(&nc_ctx->t1, &nc_ctx->s) < 0) { /* (< (* r 2) s) */ DUK_DDD(DUK_DDDPRINT("tc1=true, tc2=true, 2r > s: output d --> %ld (k=%ld)", (long) d, (long) nc_ctx->k)); DUK__DRAGON4_OUTPUT_PREINC(nc_ctx, count, d); } else { DUK_DDD(DUK_DDDPRINT("tc1=true, tc2=true, 2r <= s: output d+1 --> %ld (k=%ld)", (long) (d + 1), (long) nc_ctx->k)); DUK__DRAGON4_OUTPUT_PREINC(nc_ctx, count, d + 1); } break; } else { /* tc1 = true, tc2 = false */ DUK_DDD(DUK_DDDPRINT("tc1=true, tc2=false: output d --> %ld (k=%ld)", (long) d, (long) nc_ctx->k)); DUK__DRAGON4_OUTPUT_PREINC(nc_ctx, count, d); break; } } else { if (tc2) { /* tc1 = false, tc2 = true */ DUK_DDD(DUK_DDDPRINT("tc1=false, tc2=true: output d+1 --> %ld (k=%ld)", (long) (d + 1), (long) nc_ctx->k)); DUK__DRAGON4_OUTPUT_PREINC(nc_ctx, count, d + 1); break; } else { /* tc1 = false, tc2 = false */ DUK_DDD(DUK_DDDPRINT("tc1=false, tc2=false: output d --> %ld (k=%ld)", (long) d, (long) nc_ctx->k)); DUK__DRAGON4_OUTPUT_PREINC(nc_ctx, count, d); /* r <- r (updated above: r <- (remainder (* r B) s) * s <- s * m+ <- m+ (updated above: m+ <- (* m+ B) * m- <- m- (updated above: m- <- (* m- B) * B, low_ok, high_ok are fixed */ /* fall through and continue for-loop */ } } /* fixed-format termination conditions */ if (nc_ctx->is_fixed) { if (nc_ctx->abs_pos) { int pos = nc_ctx->k - count + 1; /* count is already incremented, take into account */ DUK_DDD(DUK_DDDPRINT("fixed format, absolute: abs pos=%ld, k=%ld, count=%ld, req=%ld", (long) pos, (long) nc_ctx->k, (long) count, (long) nc_ctx->req_digits)); if (pos <= nc_ctx->req_digits) { DUK_DDD(DUK_DDDPRINT("digit position reached req_digits, end generate loop")); break; } } else { DUK_DDD(DUK_DDDPRINT("fixed format, relative: k=%ld, count=%ld, req=%ld", (long) nc_ctx->k, (long) count, (long) nc_ctx->req_digits)); if (count >= nc_ctx->req_digits) { DUK_DDD(DUK_DDDPRINT("digit count reached req_digits, end generate loop")); break; } } } } /* for */ nc_ctx->count = count; DUK_DDD(DUK_DDDPRINT("generate finished")); #if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) { duk_uint8_t buf[2048]; duk_small_int_t i, t; DUK_MEMZERO(buf, sizeof(buf)); for (i = 0; i < nc_ctx->count; i++) { t = nc_ctx->digits[i]; if (t < 0 || t > 36) { buf[i] = (duk_uint8_t) '?'; } else { buf[i] = (duk_uint8_t) DUK__DIGITCHAR(t); } } DUK_DDD(DUK_DDDPRINT("-> generated digits; k=%ld, digits='%s'", (long) nc_ctx->k, (const char *) buf)); } #endif } /* Round up digits to a given position. If position is out-of-bounds, * does nothing. If carry propagates over the first digit, a '1' is * prepended to digits and 'k' will be updated. Return value indicates * whether carry propagated over the first digit. * * Note that nc_ctx->count is NOT updated based on the rounding position * (it is updated only if carry overflows over the first digit and an * extra digit is prepended). */ DUK_LOCAL duk_small_int_t duk__dragon4_fixed_format_round(duk__numconv_stringify_ctx *nc_ctx, duk_small_int_t round_idx) { duk_small_int_t t; duk_uint8_t *p; duk_uint8_t roundup_limit; duk_small_int_t ret = 0; /* * round_idx points to the digit which is considered for rounding; the * digit to its left is the final digit of the rounded value. If round_idx * is zero, rounding will be performed; the result will either be an empty * rounded value or if carry happens a '1' digit is generated. */ if (round_idx >= nc_ctx->count) { DUK_DDD(DUK_DDDPRINT("round_idx out of bounds (%ld >= %ld (count)) -> no rounding", (long) round_idx, (long) nc_ctx->count)); return 0; } else if (round_idx < 0) { DUK_DDD(DUK_DDDPRINT("round_idx out of bounds (%ld < 0) -> no rounding", (long) round_idx)); return 0; } /* * Round-up limit. * * For even values, divides evenly, e.g. 10 -> roundup_limit=5. * * For odd values, rounds up, e.g. 3 -> roundup_limit=2. * If radix is 3, 0/3 -> down, 1/3 -> down, 2/3 -> up. */ roundup_limit = (duk_uint8_t) ((nc_ctx->B + 1) / 2); p = &nc_ctx->digits[round_idx]; if (*p >= roundup_limit) { DUK_DDD(DUK_DDDPRINT("fixed-format rounding carry required")); /* carry */ for (;;) { *p = 0; if (p == &nc_ctx->digits[0]) { DUK_DDD(DUK_DDDPRINT("carry propagated to first digit -> special case handling")); DUK_MEMMOVE((void *) (&nc_ctx->digits[1]), (const void *) (&nc_ctx->digits[0]), (size_t) (sizeof(char) * (size_t) nc_ctx->count)); nc_ctx->digits[0] = 1; /* don't increase 'count' */ nc_ctx->k++; /* position of highest digit changed */ nc_ctx->count++; /* number of digits changed */ ret = 1; break; } DUK_DDD(DUK_DDDPRINT("fixed-format rounding carry: B=%ld, roundup_limit=%ld, p=%p, digits=%p", (long) nc_ctx->B, (long) roundup_limit, (void *) p, (void *) nc_ctx->digits)); p--; t = *p; DUK_DDD(DUK_DDDPRINT("digit before carry: %ld", (long) t)); if (++t < nc_ctx->B) { DUK_DDD(DUK_DDDPRINT("rounding carry terminated")); *p = (duk_uint8_t) t; break; } DUK_DDD(DUK_DDDPRINT("wraps, carry to next digit")); } } return ret; } #define DUK__NO_EXP (65536) /* arbitrary marker, outside valid exp range */ DUK_LOCAL void duk__dragon4_convert_and_push(duk__numconv_stringify_ctx *nc_ctx, duk_hthread *thr, duk_small_int_t radix, duk_small_int_t digits, duk_small_uint_t flags, duk_small_int_t neg) { duk_small_int_t k; duk_small_int_t pos, pos_end; duk_small_int_t expt; duk_small_int_t dig; duk_uint8_t *q; duk_uint8_t *buf; /* * The string conversion here incorporates all the necessary Ecmascript * semantics without attempting to be generic. nc_ctx->digits contains * nc_ctx->count digits (>= 1), with the topmost digit's 'position' * indicated by nc_ctx->k as follows: * * digits="123" count=3 k=0 --> 0.123 * digits="123" count=3 k=1 --> 1.23 * digits="123" count=3 k=5 --> 12300 * digits="123" count=3 k=-1 --> 0.0123 * * Note that the identifier names used for format selection are different * in Burger-Dybvig paper and Ecmascript specification (quite confusingly * so, because e.g. 'k' has a totally different meaning in each). See * documentation for discussion. * * Ecmascript doesn't specify any specific behavior for format selection * (e.g. when to use exponent notation) for non-base-10 numbers. * * The bigint space in the context is reused for string output, as there * is more than enough space for that (>1kB at the moment), and we avoid * allocating even more stack. */ DUK_ASSERT(DUK__NUMCONV_CTX_BIGINTS_SIZE >= DUK__MAX_FORMATTED_LENGTH); DUK_ASSERT(nc_ctx->count >= 1); k = nc_ctx->k; buf = (duk_uint8_t *) &nc_ctx->f; /* XXX: union would be more correct */ q = buf; /* Exponent handling: if exponent format is used, record exponent value and * fake k such that one leading digit is generated (e.g. digits=123 -> "1.23"). * * toFixed() prevents exponent use; otherwise apply a set of criteria to * match the other API calls (toString(), toPrecision, etc). */ expt = DUK__NO_EXP; if (!nc_ctx->abs_pos /* toFixed() */) { if ((flags & DUK_N2S_FLAG_FORCE_EXP) || /* exponential notation forced */ ((flags & DUK_N2S_FLAG_NO_ZERO_PAD) && /* fixed precision and zero padding would be required */ (k - digits >= 1)) || /* (e.g. k=3, digits=2 -> "12X") */ ((k > 21 || k <= -6) && (radix == 10))) { /* toString() conditions */ DUK_DDD(DUK_DDDPRINT("use exponential notation: k=%ld -> expt=%ld", (long) k, (long) (k - 1))); expt = k - 1; /* e.g. 12.3 -> digits="123" k=2 -> 1.23e1 */ k = 1; /* generate mantissa with a single leading whole number digit */ } } if (neg) { *q++ = '-'; } /* Start position (inclusive) and end position (exclusive) */ pos = (k >= 1 ? k : 1); if (nc_ctx->is_fixed) { if (nc_ctx->abs_pos) { /* toFixed() */ pos_end = -digits; } else { pos_end = k - digits; } } else { pos_end = k - nc_ctx->count; } if (pos_end > 0) { pos_end = 0; } DUK_DDD(DUK_DDDPRINT("expt=%ld, k=%ld, count=%ld, pos=%ld, pos_end=%ld, is_fixed=%ld, " "digits=%ld, abs_pos=%ld", (long) expt, (long) k, (long) nc_ctx->count, (long) pos, (long) pos_end, (long) nc_ctx->is_fixed, (long) digits, (long) nc_ctx->abs_pos)); /* Digit generation */ while (pos > pos_end) { DUK_DDD(DUK_DDDPRINT("digit generation: pos=%ld, pos_end=%ld", (long) pos, (long) pos_end)); if (pos == 0) { *q++ = (duk_uint8_t) '.'; } if (pos > k) { *q++ = (duk_uint8_t) '0'; } else if (pos <= k - nc_ctx->count) { *q++ = (duk_uint8_t) '0'; } else { dig = nc_ctx->digits[k - pos]; DUK_ASSERT(dig >= 0 && dig < nc_ctx->B); *q++ = (duk_uint8_t) DUK__DIGITCHAR(dig); } pos--; } DUK_ASSERT(pos <= 1); /* Exponent */ if (expt != DUK__NO_EXP) { /* * Exponent notation for non-base-10 numbers isn't specified in Ecmascript * specification, as it never explicitly turns up: non-decimal numbers can * only be formatted with Number.prototype.toString([radix]) and for that, * behavior is not explicitly specified. * * Logical choices include formatting the exponent as decimal (e.g. binary * 100000 as 1e+5) or in current radix (e.g. binary 100000 as 1e+101). * The Dragon4 algorithm (in the original paper) prints the exponent value * in the target radix B. However, for radix values 15 and above, the * exponent separator 'e' is no longer easily parseable. Consider, for * instance, the number "1.faecee+1c". */ duk_size_t len; char expt_sign; *q++ = 'e'; if (expt >= 0) { expt_sign = '+'; } else { expt_sign = '-'; expt = -expt; } *q++ = (duk_uint8_t) expt_sign; len = duk__dragon4_format_uint32(q, (duk_uint32_t) expt, radix); q += len; } duk_push_lstring(thr, (const char *) buf, (size_t) (q - buf)); } /* * Conversion helpers */ DUK_LOCAL void duk__dragon4_double_to_ctx(duk__numconv_stringify_ctx *nc_ctx, duk_double_t x) { duk_double_union u; duk_uint32_t tmp; duk_small_int_t expt; /* * seeeeeee eeeeffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff * A B C D E F G H * * s sign bit * eee... exponent field * fff... fraction * * ieee value = 1.ffff... * 2^(e - 1023) (normal) * = 0.ffff... * 2^(-1022) (denormal) * * algorithm v = f * b^e */ DUK_DBLUNION_SET_DOUBLE(&u, x); nc_ctx->f.n = 2; tmp = DUK_DBLUNION_GET_LOW32(&u); nc_ctx->f.v[0] = tmp; tmp = DUK_DBLUNION_GET_HIGH32(&u); nc_ctx->f.v[1] = tmp & 0x000fffffUL; expt = (duk_small_int_t) ((tmp >> 20) & 0x07ffUL); if (expt == 0) { /* denormal */ expt = DUK__IEEE_DOUBLE_EXP_MIN - 52; duk__bi_normalize(&nc_ctx->f); } else { /* normal: implicit leading 1-bit */ nc_ctx->f.v[1] |= 0x00100000UL; expt = expt - DUK__IEEE_DOUBLE_EXP_BIAS - 52; DUK_ASSERT(duk__bi_is_valid(&nc_ctx->f)); /* true, because v[1] has at least one bit set */ } DUK_ASSERT(duk__bi_is_valid(&nc_ctx->f)); nc_ctx->e = expt; } DUK_LOCAL void duk__dragon4_ctx_to_double(duk__numconv_stringify_ctx *nc_ctx, duk_double_t *x) { duk_double_union u; duk_small_int_t expt; duk_small_int_t i; duk_small_int_t bitstart; duk_small_int_t bitround; duk_small_int_t bitidx; duk_small_int_t skip_round; duk_uint32_t t, v; DUK_ASSERT(nc_ctx->count == 53 + 1); /* Sometimes this assert is not true right now; it will be true after * rounding. See: test-bug-numconv-mantissa-assert.js. */ DUK_ASSERT_DISABLE(nc_ctx->digits[0] == 1); /* zero handled by caller */ /* Should not be required because the code below always sets both high * and low parts, but at least gcc-4.4.5 fails to deduce this correctly * (perhaps because the low part is set (seemingly) conditionally in a * loop), so this is here to avoid the bogus warning. */ DUK_MEMZERO((void *) &u, sizeof(u)); /* * Figure out how generated digits match up with the mantissa, * and then perform rounding. If mantissa overflows, need to * recompute the exponent (it is bumped and may overflow to * infinity). * * For normal numbers the leading '1' is hidden and ignored, * and the last bit is used for rounding: * * rounding pt * <--------52------->| * 1 x x x x ... x x x x|y ==> x x x x ... x x x x * * For denormals, the leading '1' is included in the number, * and the rounding point is different: * * rounding pt * <--52 or less--->| * 1 x x x x ... x x|x x y ==> 0 0 ... 1 x x ... x x * * The largest denormals will have a mantissa beginning with * a '1' (the explicit leading bit); smaller denormals will * have leading zero bits. * * If the exponent would become too high, the result becomes * Infinity. If the exponent is so small that the entire * mantissa becomes zero, the result becomes zero. * * Note: the Dragon4 'k' is off-by-one with respect to the IEEE * exponent. For instance, k==0 indicates that the leading '1' * digit is at the first binary fraction position (0.1xxx...); * the corresponding IEEE exponent would be -1. */ skip_round = 0; recheck_exp: expt = nc_ctx->k - 1; /* IEEE exp without bias */ if (expt > 1023) { /* Infinity */ bitstart = -255; /* needed for inf: causes mantissa to become zero, * and rounding to be skipped. */ expt = 2047; } else if (expt >= -1022) { /* normal */ bitstart = 1; /* skip leading digit */ expt += DUK__IEEE_DOUBLE_EXP_BIAS; DUK_ASSERT(expt >= 1 && expt <= 2046); } else { /* denormal or zero */ bitstart = 1023 + expt; /* expt==-1023 -> bitstart=0 (leading 1); * expt==-1024 -> bitstart=-1 (one left of leading 1), etc */ expt = 0; } bitround = bitstart + 52; DUK_DDD(DUK_DDDPRINT("ieee expt=%ld, bitstart=%ld, bitround=%ld", (long) expt, (long) bitstart, (long) bitround)); if (!skip_round) { if (duk__dragon4_fixed_format_round(nc_ctx, bitround)) { /* Corner case: see test-numconv-parse-mant-carry.js. We could * just bump the exponent and update bitstart, but it's more robust * to recompute (but avoid rounding twice). */ DUK_DDD(DUK_DDDPRINT("rounding caused exponent to be bumped, recheck exponent")); skip_round = 1; goto recheck_exp; } } /* * Create mantissa */ t = 0; for (i = 0; i < 52; i++) { bitidx = bitstart + 52 - 1 - i; if (bitidx >= nc_ctx->count) { v = 0; } else if (bitidx < 0) { v = 0; } else { v = nc_ctx->digits[bitidx]; } DUK_ASSERT(v == 0 || v == 1); t += v << (i % 32); if (i == 31) { /* low 32 bits is complete */ DUK_DBLUNION_SET_LOW32(&u, t); t = 0; } } /* t has high mantissa */ DUK_DDD(DUK_DDDPRINT("mantissa is complete: %08lx %08lx", (unsigned long) t, (unsigned long) DUK_DBLUNION_GET_LOW32(&u))); DUK_ASSERT(expt >= 0 && expt <= 0x7ffL); t += ((duk_uint32_t) expt) << 20; #if 0 /* caller handles sign change */ if (negative) { t |= 0x80000000U; } #endif DUK_DBLUNION_SET_HIGH32(&u, t); DUK_DDD(DUK_DDDPRINT("number is complete: %08lx %08lx", (unsigned long) DUK_DBLUNION_GET_HIGH32(&u), (unsigned long) DUK_DBLUNION_GET_LOW32(&u))); *x = DUK_DBLUNION_GET_DOUBLE(&u); } /* * Exposed number-to-string API * * Input: [ number ] * Output: [ string ] */ DUK_INTERNAL void duk_numconv_stringify(duk_hthread *thr, duk_small_int_t radix, duk_small_int_t digits, duk_small_uint_t flags) { duk_double_t x; duk_small_int_t c; duk_small_int_t neg; duk_uint32_t uval; duk__numconv_stringify_ctx nc_ctx_alloc; /* large context; around 2kB now */ duk__numconv_stringify_ctx *nc_ctx = &nc_ctx_alloc; x = (duk_double_t) duk_require_number(thr, -1); duk_pop(thr); /* * Handle special cases (NaN, infinity, zero). */ c = (duk_small_int_t) DUK_FPCLASSIFY(x); if (DUK_SIGNBIT((double) x)) { x = -x; neg = 1; } else { neg = 0; } /* NaN sign bit is platform specific with unpacked, un-normalized NaNs */ DUK_ASSERT(c == DUK_FP_NAN || DUK_SIGNBIT((double) x) == 0); if (c == DUK_FP_NAN) { duk_push_hstring_stridx(thr, DUK_STRIDX_NAN); return; } else if (c == DUK_FP_INFINITE) { if (neg) { /* -Infinity */ duk_push_hstring_stridx(thr, DUK_STRIDX_MINUS_INFINITY); } else { /* Infinity */ duk_push_hstring_stridx(thr, DUK_STRIDX_INFINITY); } return; } else if (c == DUK_FP_ZERO) { /* We can't shortcut zero here if it goes through special formatting * (such as forced exponential notation). */ ; } /* * Handle integers in 32-bit range (that is, [-(2**32-1),2**32-1]) * specially, as they're very likely for embedded programs. This * is now done for all radix values. We must be careful not to use * the fast path when special formatting (e.g. forced exponential) * is in force. * * XXX: could save space by supporting radix 10 only and using * sprintf "%lu" for the fast path and for exponent formatting. */ uval = (unsigned int) x; if (((double) uval) == x && /* integer number in range */ flags == 0) { /* no special formatting */ /* use bigint area as a temp */ duk_uint8_t *buf = (duk_uint8_t *) (&nc_ctx->f); duk_uint8_t *p = buf; DUK_ASSERT(DUK__NUMCONV_CTX_BIGINTS_SIZE >= 32 + 1); /* max size: radix=2 + sign */ if (neg && uval != 0) { /* no negative sign for zero */ *p++ = (duk_uint8_t) '-'; } p += duk__dragon4_format_uint32(p, uval, radix); duk_push_lstring(thr, (const char *) buf, (duk_size_t) (p - buf)); return; } /* * Dragon4 setup. * * Convert double from IEEE representation for conversion; * normal finite values have an implicit leading 1-bit. The * slow path algorithm doesn't handle zero, so zero is special * cased here but still creates a valid nc_ctx, and goes * through normal formatting in case special formatting has * been requested (e.g. forced exponential format: 0 -> "0e+0"). */ /* Would be nice to bulk clear the allocation, but the context * is 1-2 kilobytes and nothing should rely on it being zeroed. */ #if 0 DUK_MEMZERO((void *) nc_ctx, sizeof(*nc_ctx)); /* slow init, do only for slow path cases */ #endif nc_ctx->is_s2n = 0; nc_ctx->b = 2; nc_ctx->B = radix; nc_ctx->abs_pos = 0; if (flags & DUK_N2S_FLAG_FIXED_FORMAT) { nc_ctx->is_fixed = 1; if (flags & DUK_N2S_FLAG_FRACTION_DIGITS) { /* absolute req_digits; e.g. digits = 1 -> last digit is 0, * but add an extra digit for rounding. */ nc_ctx->abs_pos = 1; nc_ctx->req_digits = (-digits + 1) - 1; } else { nc_ctx->req_digits = digits + 1; } } else { nc_ctx->is_fixed = 0; nc_ctx->req_digits = 0; } if (c == DUK_FP_ZERO) { /* Zero special case: fake requested number of zero digits; ensure * no sign bit is printed. Relative and absolute fixed format * require separate handling. */ duk_small_int_t count; if (nc_ctx->is_fixed) { if (nc_ctx->abs_pos) { count = digits + 2; /* lead zero + 'digits' fractions + 1 for rounding */ } else { count = digits + 1; /* + 1 for rounding */ } } else { count = 1; } DUK_DDD(DUK_DDDPRINT("count=%ld", (long) count)); DUK_ASSERT(count >= 1); DUK_MEMZERO((void *) nc_ctx->digits, (size_t) count); nc_ctx->count = count; nc_ctx->k = 1; /* 0.000... */ neg = 0; goto zero_skip; } duk__dragon4_double_to_ctx(nc_ctx, x); /* -> sets 'f' and 'e' */ DUK__BI_PRINT("f", &nc_ctx->f); DUK_DDD(DUK_DDDPRINT("e=%ld", (long) nc_ctx->e)); /* * Dragon4 slow path digit generation. */ duk__dragon4_prepare(nc_ctx); /* setup many variables in nc_ctx */ DUK_DDD(DUK_DDDPRINT("after prepare:")); DUK__BI_PRINT("r", &nc_ctx->r); DUK__BI_PRINT("s", &nc_ctx->s); DUK__BI_PRINT("mp", &nc_ctx->mp); DUK__BI_PRINT("mm", &nc_ctx->mm); duk__dragon4_scale(nc_ctx); DUK_DDD(DUK_DDDPRINT("after scale; k=%ld", (long) nc_ctx->k)); DUK__BI_PRINT("r", &nc_ctx->r); DUK__BI_PRINT("s", &nc_ctx->s); DUK__BI_PRINT("mp", &nc_ctx->mp); DUK__BI_PRINT("mm", &nc_ctx->mm); duk__dragon4_generate(nc_ctx); /* * Convert and push final string. */ zero_skip: if (flags & DUK_N2S_FLAG_FIXED_FORMAT) { /* Perform fixed-format rounding. */ duk_small_int_t roundpos; if (flags & DUK_N2S_FLAG_FRACTION_DIGITS) { /* 'roundpos' is relative to nc_ctx->k and increases to the right * (opposite of how 'k' changes). */ roundpos = -digits; /* absolute position for digit considered for rounding */ roundpos = nc_ctx->k - roundpos; } else { roundpos = digits; } DUK_DDD(DUK_DDDPRINT("rounding: k=%ld, count=%ld, digits=%ld, roundpos=%ld", (long) nc_ctx->k, (long) nc_ctx->count, (long) digits, (long) roundpos)); (void) duk__dragon4_fixed_format_round(nc_ctx, roundpos); /* Note: 'count' is currently not adjusted by rounding (i.e. the * digits are not "chopped off". That shouldn't matter because * the digit position (absolute or relative) is passed on to the * convert-and-push function. */ } duk__dragon4_convert_and_push(nc_ctx, thr, radix, digits, flags, neg); } /* * Exposed string-to-number API * * Input: [ string ] * Output: [ number ] * * If number parsing fails, a NaN is pushed as the result. If number parsing * fails due to an internal error, an InternalError is thrown. */ DUK_INTERNAL void duk_numconv_parse(duk_hthread *thr, duk_small_int_t radix, duk_small_uint_t flags) { duk__numconv_stringify_ctx nc_ctx_alloc; /* large context; around 2kB now */ duk__numconv_stringify_ctx *nc_ctx = &nc_ctx_alloc; duk_double_t res; duk_hstring *h_str; duk_small_int_t expt; duk_small_int_t expt_neg; duk_small_int_t expt_adj; duk_small_int_t neg; duk_small_int_t dig; duk_small_int_t dig_whole; duk_small_int_t dig_lzero; duk_small_int_t dig_frac; duk_small_int_t dig_expt; duk_small_int_t dig_prec; const duk__exp_limits *explim; const duk_uint8_t *p; duk_small_int_t ch; DUK_DDD(DUK_DDDPRINT("parse number: %!T, radix=%ld, flags=0x%08lx", (duk_tval *) duk_get_tval(thr, -1), (long) radix, (unsigned long) flags)); DUK_ASSERT(radix >= 2 && radix <= 36); DUK_ASSERT(radix - 2 < (duk_small_int_t) sizeof(duk__str2num_digits_for_radix)); /* * Preliminaries: trim, sign, Infinity check * * We rely on the interned string having a NUL terminator, which will * cause a parse failure wherever it is encountered. As a result, we * don't need separate pointer checks. * * There is no special parsing for 'NaN' in the specification although * 'Infinity' (with an optional sign) is allowed in some contexts. * Some contexts allow plus/minus sign, while others only allow the * minus sign (like JSON.parse()). * * Automatic hex number detection (leading '0x' or '0X') and octal * number detection (leading '0' followed by at least one octal digit) * is done here too. * * Symbols are not explicitly rejected here (that's up to the caller). * If a symbol were passed here, it should ultimately safely fail * parsing due to a syntax error. */ if (flags & DUK_S2N_FLAG_TRIM_WHITE) { /* Leading / trailing whitespace is sometimes accepted and * sometimes not. After white space trimming, all valid input * characters are pure ASCII. */ duk_trim(thr, -1); } h_str = duk_require_hstring(thr, -1); DUK_ASSERT(h_str != NULL); p = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_str); neg = 0; ch = *p; if (ch == (duk_small_int_t) '+') { if ((flags & DUK_S2N_FLAG_ALLOW_PLUS) == 0) { DUK_DDD(DUK_DDDPRINT("parse failed: leading plus sign not allowed")); goto parse_fail; } p++; } else if (ch == (duk_small_int_t) '-') { if ((flags & DUK_S2N_FLAG_ALLOW_MINUS) == 0) { DUK_DDD(DUK_DDDPRINT("parse failed: leading minus sign not allowed")); goto parse_fail; } p++; neg = 1; } if ((flags & DUK_S2N_FLAG_ALLOW_INF) && DUK_STRNCMP((const char *) p, "Infinity", 8) == 0) { /* Don't check for Infinity unless the context allows it. * 'Infinity' is a valid integer literal in e.g. base-36: * * parseInt('Infinity', 36) * 1461559270678 */ if ((flags & DUK_S2N_FLAG_ALLOW_GARBAGE) == 0 && p[8] != DUK_ASC_NUL) { DUK_DDD(DUK_DDDPRINT("parse failed: trailing garbage after matching 'Infinity' not allowed")); goto parse_fail; } else { res = DUK_DOUBLE_INFINITY; goto negcheck_and_ret; } } ch = *p; if (ch == (duk_small_int_t) '0') { duk_small_int_t detect_radix = 0; ch = DUK_LOWERCASE_CHAR_ASCII(p[1]); /* 'x' or 'X' -> 'x' */ if ((flags & DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT) && ch == DUK_ASC_LC_X) { DUK_DDD(DUK_DDDPRINT("detected 0x/0X hex prefix, changing radix and preventing fractions and exponent")); detect_radix = 16; #if 0 } else if ((flags & DUK_S2N_FLAG_ALLOW_AUTO_LEGACY_OCT_INT) && (ch >= (duk_small_int_t) '0' && ch <= (duk_small_int_t) '9')) { DUK_DDD(DUK_DDDPRINT("detected 0n oct prefix, changing radix and preventing fractions and exponent")); detect_radix = 8; /* NOTE: if this legacy octal case is added back, it has * different flags and 'p' advance so this needs to be * reworked. */ flags |= DUK_S2N_FLAG_ALLOW_EMPTY_AS_ZERO; /* interpret e.g. '09' as '0', not NaN */ p += 1; #endif } else if ((flags & DUK_S2N_FLAG_ALLOW_AUTO_OCT_INT) && ch == DUK_ASC_LC_O) { DUK_DDD(DUK_DDDPRINT("detected 0o oct prefix, changing radix and preventing fractions and exponent")); detect_radix = 8; } else if ((flags & DUK_S2N_FLAG_ALLOW_AUTO_BIN_INT) && ch == DUK_ASC_LC_B) { DUK_DDD(DUK_DDDPRINT("detected 0b bin prefix, changing radix and preventing fractions and exponent")); detect_radix = 2; } if (detect_radix > 0) { radix = detect_radix; /* Clear empty as zero flag: interpret e.g. '0x' and '0xg' as a NaN (= parse error) */ flags &= ~(DUK_S2N_FLAG_ALLOW_EXP | DUK_S2N_FLAG_ALLOW_EMPTY_FRAC | DUK_S2N_FLAG_ALLOW_FRAC | DUK_S2N_FLAG_ALLOW_NAKED_FRAC | DUK_S2N_FLAG_ALLOW_EMPTY_AS_ZERO); flags |= DUK_S2N_FLAG_ALLOW_LEADING_ZERO; /* allow e.g. '0x0009' and '0b00010001' */ p += 2; } } /* * Scan number and setup for Dragon4. * * The fast path case is detected during setup: an integer which * can be converted without rounding, no net exponent. The fast * path could be implemented as a separate scan, but may not really * be worth it: the multiplications for building 'f' are not * expensive when 'f' is small. * * The significand ('f') must contain enough bits of (apparent) * accuracy, so that Dragon4 will generate enough binary output digits. * For decimal numbers, this means generating a 20-digit significand, * which should yield enough practical accuracy to parse IEEE doubles. * In fact, the Ecmascript specification explicitly allows an * implementation to treat digits beyond 20 as zeroes (and even * to round the 20th digit upwards). For non-decimal numbers, the * appropriate number of digits has been precomputed for comparable * accuracy. * * Digit counts: * * [ dig_lzero ] * | * .+-..---[ dig_prec ]----. * | || | * 0000123.456789012345678901234567890e+123456 * | | | | | | * `--+--' `------[ dig_frac ]-------' `-+--' * | | * [ dig_whole ] [ dig_expt ] * * dig_frac and dig_expt are -1 if not present * dig_lzero is only computed for whole number part * * Parsing state * * Parsing whole part dig_frac < 0 AND dig_expt < 0 * Parsing fraction part dig_frac >= 0 AND dig_expt < 0 * Parsing exponent part dig_expt >= 0 (dig_frac may be < 0 or >= 0) * * Note: in case we hit an implementation limit (like exponent range), * we should throw an error, NOT return NaN or Infinity. Even with * very large exponent (or significand) values the final result may be * finite, so NaN/Infinity would be incorrect. */ duk__bi_set_small(&nc_ctx->f, 0); dig_prec = 0; dig_lzero = 0; dig_whole = 0; dig_frac = -1; dig_expt = -1; expt = 0; expt_adj = 0; /* essentially tracks digit position of lowest 'f' digit */ expt_neg = 0; for (;;) { ch = *p++; DUK_DDD(DUK_DDDPRINT("parse digits: p=%p, ch='%c' (%ld), expt=%ld, expt_adj=%ld, " "dig_whole=%ld, dig_frac=%ld, dig_expt=%ld, dig_lzero=%ld, dig_prec=%ld", (const void *) p, (int) ((ch >= 0x20 && ch <= 0x7e) ? ch : '?'), (long) ch, (long) expt, (long) expt_adj, (long) dig_whole, (long) dig_frac, (long) dig_expt, (long) dig_lzero, (long) dig_prec)); DUK__BI_PRINT("f", &nc_ctx->f); /* Most common cases first. */ if (ch >= (duk_small_int_t) '0' && ch <= (duk_small_int_t) '9') { dig = (duk_small_int_t) ch - '0' + 0; } else if (ch == (duk_small_int_t) '.') { /* A leading digit is not required in some cases, e.g. accept ".123". * In other cases (JSON.parse()) a leading digit is required. This * is checked for after the loop. */ if (dig_frac >= 0 || dig_expt >= 0) { if (flags & DUK_S2N_FLAG_ALLOW_GARBAGE) { DUK_DDD(DUK_DDDPRINT("garbage termination (invalid period)")); break; } else { DUK_DDD(DUK_DDDPRINT("parse failed: period not allowed")); goto parse_fail; } } if ((flags & DUK_S2N_FLAG_ALLOW_FRAC) == 0) { /* Some contexts don't allow fractions at all; this can't be a * post-check because the state ('f' and expt) would be incorrect. */ if (flags & DUK_S2N_FLAG_ALLOW_GARBAGE) { DUK_DDD(DUK_DDDPRINT("garbage termination (invalid first period)")); break; } else { DUK_DDD(DUK_DDDPRINT("parse failed: fraction part not allowed")); } } DUK_DDD(DUK_DDDPRINT("start fraction part")); dig_frac = 0; continue; } else if (ch == (duk_small_int_t) 0) { DUK_DDD(DUK_DDDPRINT("NUL termination")); break; } else if ((flags & DUK_S2N_FLAG_ALLOW_EXP) && dig_expt < 0 && (ch == (duk_small_int_t) 'e' || ch == (duk_small_int_t) 'E')) { /* Note: we don't parse back exponent notation for anything else * than radix 10, so this is not an ambiguous check (e.g. hex * exponent values may have 'e' either as a significand digit * or as an exponent separator). * * If the exponent separator occurs twice, 'e' will be interpreted * as a digit (= 14) and will be rejected as an invalid decimal * digit. */ DUK_DDD(DUK_DDDPRINT("start exponent part")); /* Exponent without a sign or with a +/- sign is accepted * by all call sites (even JSON.parse()). */ ch = *p; if (ch == (duk_small_int_t) '-') { expt_neg = 1; p++; } else if (ch == (duk_small_int_t) '+') { p++; } dig_expt = 0; continue; } else if (ch >= (duk_small_int_t) 'a' && ch <= (duk_small_int_t) 'z') { dig = (duk_small_int_t) (ch - (duk_small_int_t) 'a' + 0x0a); } else if (ch >= (duk_small_int_t) 'A' && ch <= (duk_small_int_t) 'Z') { dig = (duk_small_int_t) (ch - (duk_small_int_t) 'A' + 0x0a); } else { dig = 255; /* triggers garbage digit check below */ } DUK_ASSERT((dig >= 0 && dig <= 35) || dig == 255); if (dig >= radix) { if (flags & DUK_S2N_FLAG_ALLOW_GARBAGE) { DUK_DDD(DUK_DDDPRINT("garbage termination")); break; } else { DUK_DDD(DUK_DDDPRINT("parse failed: trailing garbage or invalid digit")); goto parse_fail; } } if (dig_expt < 0) { /* whole or fraction digit */ if (dig_prec < duk__str2num_digits_for_radix[radix - 2]) { /* significant from precision perspective */ duk_small_int_t f_zero = duk__bi_is_zero(&nc_ctx->f); if (f_zero && dig == 0) { /* Leading zero is not counted towards precision digits; not * in the integer part, nor in the fraction part. */ if (dig_frac < 0) { dig_lzero++; } } else { /* XXX: join these ops (multiply-accumulate), but only if * code footprint decreases. */ duk__bi_mul_small(&nc_ctx->t1, &nc_ctx->f, (duk_uint32_t) radix); duk__bi_add_small(&nc_ctx->f, &nc_ctx->t1, (duk_uint32_t) dig); dig_prec++; } } else { /* Ignore digits beyond a radix-specific limit, but note them * in expt_adj. */ expt_adj++; } if (dig_frac >= 0) { dig_frac++; expt_adj--; } else { dig_whole++; } } else { /* exponent digit */ expt = expt * radix + dig; if (expt > DUK_S2N_MAX_EXPONENT) { /* impose a reasonable exponent limit, so that exp * doesn't need to get tracked using a bigint. */ DUK_DDD(DUK_DDDPRINT("parse failed: exponent too large")); goto parse_explimit_error; } dig_expt++; } } /* Leading zero. */ if (dig_lzero > 0 && dig_whole > 1) { if ((flags & DUK_S2N_FLAG_ALLOW_LEADING_ZERO) == 0) { DUK_DDD(DUK_DDDPRINT("parse failed: leading zeroes not allowed in integer part")); goto parse_fail; } } /* Validity checks for various fraction formats ("0.1", ".1", "1.", "."). */ if (dig_whole == 0) { if (dig_frac == 0) { /* "." is not accepted in any format */ DUK_DDD(DUK_DDDPRINT("parse failed: plain period without leading or trailing digits")); goto parse_fail; } else if (dig_frac > 0) { /* ".123" */ if ((flags & DUK_S2N_FLAG_ALLOW_NAKED_FRAC) == 0) { DUK_DDD(DUK_DDDPRINT("parse failed: fraction part not allowed without " "leading integer digit(s)")); goto parse_fail; } } else { /* empty ("") is allowed in some formats (e.g. Number(''), as zero */ if ((flags & DUK_S2N_FLAG_ALLOW_EMPTY_AS_ZERO) == 0) { DUK_DDD(DUK_DDDPRINT("parse failed: empty string not allowed (as zero)")); goto parse_fail; } } } else { if (dig_frac == 0) { /* "123." is allowed in some formats */ if ((flags & DUK_S2N_FLAG_ALLOW_EMPTY_FRAC) == 0) { DUK_DDD(DUK_DDDPRINT("parse failed: empty fractions")); goto parse_fail; } } else if (dig_frac > 0) { /* "123.456" */ ; } else { /* "123" */ ; } } /* Exponent without digits (e.g. "1e" or "1e+"). If trailing garbage is * allowed, ignore exponent part as garbage (= parse as "1", i.e. exp 0). */ if (dig_expt == 0) { if ((flags & DUK_S2N_FLAG_ALLOW_GARBAGE) == 0) { DUK_DDD(DUK_DDDPRINT("parse failed: empty exponent")); goto parse_fail; } DUK_ASSERT(expt == 0); } if (expt_neg) { expt = -expt; } DUK_DDD(DUK_DDDPRINT("expt=%ld, expt_adj=%ld, net exponent -> %ld", (long) expt, (long) expt_adj, (long) (expt + expt_adj))); expt += expt_adj; /* Fast path check. */ if (nc_ctx->f.n <= 1 && /* 32-bit value */ expt == 0 /* no net exponent */) { /* Fast path is triggered for no exponent and also for balanced exponent * and fraction parts, e.g. for "1.23e2" == "123". Remember to respect * zero sign. */ /* XXX: could accept numbers larger than 32 bits, e.g. up to 53 bits? */ DUK_DDD(DUK_DDDPRINT("fast path number parse")); if (nc_ctx->f.n == 1) { res = (double) nc_ctx->f.v[0]; } else { res = 0.0; } goto negcheck_and_ret; } /* Significand ('f') padding. */ while (dig_prec < duk__str2num_digits_for_radix[radix - 2]) { /* Pad significand with "virtual" zero digits so that Dragon4 will * have enough (apparent) precision to work with. */ DUK_DDD(DUK_DDDPRINT("dig_prec=%ld, pad significand with zero", (long) dig_prec)); duk__bi_mul_small_copy(&nc_ctx->f, (duk_uint32_t) radix, &nc_ctx->t1); DUK__BI_PRINT("f", &nc_ctx->f); expt--; dig_prec++; } DUK_DDD(DUK_DDDPRINT("final exponent: %ld", (long) expt)); /* Detect zero special case. */ if (nc_ctx->f.n == 0) { /* This may happen even after the fast path check, if exponent is * not balanced (e.g. "0e1"). Remember to respect zero sign. */ DUK_DDD(DUK_DDDPRINT("significand is zero")); res = 0.0; goto negcheck_and_ret; } /* Quick reject of too large or too small exponents. This check * would be incorrect for zero (e.g. "0e1000" is zero, not Infinity) * so zero check must be above. */ explim = &duk__str2num_exp_limits[radix - 2]; if (expt > explim->upper) { DUK_DDD(DUK_DDDPRINT("exponent too large -> infinite")); res = (duk_double_t) DUK_DOUBLE_INFINITY; goto negcheck_and_ret; } else if (expt < explim->lower) { DUK_DDD(DUK_DDDPRINT("exponent too small -> zero")); res = (duk_double_t) 0.0; goto negcheck_and_ret; } nc_ctx->is_s2n = 1; nc_ctx->e = expt; nc_ctx->b = radix; nc_ctx->B = 2; nc_ctx->is_fixed = 1; nc_ctx->abs_pos = 0; nc_ctx->req_digits = 53 + 1; DUK__BI_PRINT("f", &nc_ctx->f); DUK_DDD(DUK_DDDPRINT("e=%ld", (long) nc_ctx->e)); /* * Dragon4 slow path (binary) digit generation. * An extra digit is generated for rounding. */ duk__dragon4_prepare(nc_ctx); /* setup many variables in nc_ctx */ DUK_DDD(DUK_DDDPRINT("after prepare:")); DUK__BI_PRINT("r", &nc_ctx->r); DUK__BI_PRINT("s", &nc_ctx->s); DUK__BI_PRINT("mp", &nc_ctx->mp); DUK__BI_PRINT("mm", &nc_ctx->mm); duk__dragon4_scale(nc_ctx); DUK_DDD(DUK_DDDPRINT("after scale; k=%ld", (long) nc_ctx->k)); DUK__BI_PRINT("r", &nc_ctx->r); DUK__BI_PRINT("s", &nc_ctx->s); DUK__BI_PRINT("mp", &nc_ctx->mp); DUK__BI_PRINT("mm", &nc_ctx->mm); duk__dragon4_generate(nc_ctx); DUK_ASSERT(nc_ctx->count == 53 + 1); /* * Convert binary digits into an IEEE double. Need to handle * denormals and rounding correctly. * * Some call sites currently assume the result is always a * non-fastint double. If this is changed, check all call * sites. */ duk__dragon4_ctx_to_double(nc_ctx, &res); goto negcheck_and_ret; negcheck_and_ret: if (neg) { res = -res; } duk_pop(thr); duk_push_number(thr, (double) res); DUK_DDD(DUK_DDDPRINT("result: %!T", (duk_tval *) duk_get_tval(thr, -1))); return; parse_fail: DUK_DDD(DUK_DDDPRINT("parse failed")); duk_pop(thr); duk_push_nan(thr); return; parse_explimit_error: DUK_DDD(DUK_DDDPRINT("parse failed, internal error, can't return a value")); DUK_ERROR_RANGE(thr, "exponent too large"); return; } /* automatic undefs */ #undef DUK__BI_MAX_PARTS #undef DUK__BI_PRINT #undef DUK__DIGITCHAR #undef DUK__DRAGON4_OUTPUT_PREINC #undef DUK__IEEE_DOUBLE_EXP_BIAS #undef DUK__IEEE_DOUBLE_EXP_MIN #undef DUK__MAX_FORMATTED_LENGTH #undef DUK__MAX_OUTPUT_DIGITS #undef DUK__NO_EXP #undef DUK__NUMCONV_CTX_BIGINTS_SIZE #undef DUK__NUMCONV_CTX_NUM_BIGINTS #line 1 "duk_regexp_compiler.c" /* * Regexp compilation. * * See doc/regexp.rst for a discussion of the compilation approach and * current limitations. * * Regexp bytecode assumes jumps can be expressed with signed 32-bit * integers. Consequently the bytecode size must not exceed 0x7fffffffL. * The implementation casts duk_size_t (buffer size) to duk_(u)int32_t * in many places. Although this could be changed, the bytecode format * limit would still prevent regexps exceeding the signed 32-bit limit * from working. * * XXX: The implementation does not prevent bytecode from exceeding the * maximum supported size. This could be done by limiting the maximum * input string size (assuming an upper bound can be computed for number * of bytecode bytes emitted per input byte) or checking buffer maximum * size when emitting bytecode (slower). */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_REGEXP_SUPPORT) /* * Helper macros */ #define DUK__RE_INITIAL_BUFSIZE 64 #define DUK__RE_BUFLEN(re_ctx) \ DUK_BW_GET_SIZE(re_ctx->thr, &re_ctx->bw) /* * Disjunction struct: result of parsing a disjunction */ typedef struct { /* Number of characters that the atom matches (e.g. 3 for 'abc'), * -1 if atom is complex and number of matched characters either * varies or is not known. */ duk_int32_t charlen; #if 0 /* These are not needed to implement quantifier capture handling, * but might be needed at some point. */ /* re_ctx->captures at start and end of atom parsing. * Since 'captures' indicates highest capture number emitted * so far in a DUK_REOP_SAVE, the captures numbers saved by * the atom are: ]start_captures,end_captures]. */ duk_uint32_t start_captures; duk_uint32_t end_captures; #endif } duk__re_disjunction_info; /* * Encoding helpers * * Some of the typing is bytecode based, e.g. slice sizes are unsigned 32-bit * even though the buffer operations will use duk_size_t. */ /* XXX: the insert helpers should ensure that the bytecode result is not * larger than expected (or at least assert for it). Many things in the * bytecode, like skip offsets, won't work correctly if the bytecode is * larger than say 2G. */ DUK_LOCAL duk_uint32_t duk__encode_i32(duk_int32_t x) { if (x < 0) { return ((duk_uint32_t) (-x)) * 2 + 1; } else { return ((duk_uint32_t) x) * 2; } } /* XXX: return type should probably be duk_size_t, or explicit checks are needed for * maximum size. */ DUK_LOCAL duk_uint32_t duk__insert_u32(duk_re_compiler_ctx *re_ctx, duk_uint32_t offset, duk_uint32_t x) { duk_uint8_t buf[DUK_UNICODE_MAX_XUTF8_LENGTH]; duk_small_int_t len; len = duk_unicode_encode_xutf8((duk_ucodepoint_t) x, buf); DUK_ASSERT(len >= 0); DUK_BW_INSERT_ENSURE_BYTES(re_ctx->thr, &re_ctx->bw, offset, buf, (duk_size_t) len); return (duk_uint32_t) len; } DUK_LOCAL void duk__append_u32(duk_re_compiler_ctx *re_ctx, duk_uint32_t x) { DUK_BW_WRITE_ENSURE_XUTF8(re_ctx->thr, &re_ctx->bw, x); } DUK_LOCAL void duk__append_7bit(duk_re_compiler_ctx *re_ctx, duk_uint32_t x) { #if defined(DUK_USE_PREFER_SIZE) duk__append_u32(re_ctx, x); #else DUK_ASSERT(x <= 0x7fU); DUK_BW_WRITE_ENSURE_U8(re_ctx->thr, &re_ctx->bw, (duk_uint8_t) x); #endif } #if 0 DUK_LOCAL void duk__append_2bytes(duk_re_compiler_ctx *re_ctx, duk_uint8_t x, duk_uint8_t y) { DUK_BW_WRITE_ENSURE_U8_2(re_ctx->thr, &re_ctx->bw, x, y); } #endif DUK_LOCAL duk_uint32_t duk__insert_i32(duk_re_compiler_ctx *re_ctx, duk_uint32_t offset, duk_int32_t x) { return duk__insert_u32(re_ctx, offset, duk__encode_i32(x)); } DUK_LOCAL void duk__append_reop(duk_re_compiler_ctx *re_ctx, duk_uint32_t reop) { DUK_ASSERT(reop <= 0x7fU); (void) duk__append_7bit(re_ctx, reop); } #if 0 /* unused */ DUK_LOCAL void duk__append_i32(duk_re_compiler_ctx *re_ctx, duk_int32_t x) { duk__append_u32(re_ctx, duk__encode_i32(x)); } #endif /* special helper for emitting u16 lists (used for character ranges for built-in char classes) */ DUK_LOCAL void duk__append_u16_list(duk_re_compiler_ctx *re_ctx, const duk_uint16_t *values, duk_uint32_t count) { /* Call sites don't need the result length so it's not accumulated. */ while (count-- > 0) { duk__append_u32(re_ctx, (duk_uint32_t) (*values++)); } } DUK_LOCAL void duk__insert_slice(duk_re_compiler_ctx *re_ctx, duk_uint32_t offset, duk_uint32_t data_offset, duk_uint32_t data_length) { DUK_BW_INSERT_ENSURE_SLICE(re_ctx->thr, &re_ctx->bw, offset, data_offset, data_length); } DUK_LOCAL void duk__append_slice(duk_re_compiler_ctx *re_ctx, duk_uint32_t data_offset, duk_uint32_t data_length) { DUK_BW_WRITE_ENSURE_SLICE(re_ctx->thr, &re_ctx->bw, data_offset, data_length); } DUK_LOCAL void duk__remove_slice(duk_re_compiler_ctx *re_ctx, duk_uint32_t data_offset, duk_uint32_t data_length) { DUK_BW_REMOVE_ENSURE_SLICE(re_ctx->thr, &re_ctx->bw, data_offset, data_length); } /* * Insert a jump offset at 'offset' to complete an instruction * (the jump offset is always the last component of an instruction). * The 'skip' argument must be computed relative to 'offset', * -without- taking into account the skip field being inserted. * * ... A B C ins X Y Z ... (ins may be a JUMP, SPLIT1/SPLIT2, etc) * => ... A B C ins SKIP X Y Z * * Computing the final (adjusted) skip value, which is relative to the * first byte of the next instruction, is a bit tricky because of the * variable length UTF-8 encoding. See doc/regexp.rst for discussion. */ DUK_LOCAL duk_uint32_t duk__insert_jump_offset(duk_re_compiler_ctx *re_ctx, duk_uint32_t offset, duk_int32_t skip) { #if 0 /* Iterative solution. */ if (skip < 0) { duk_small_int_t len; /* two encoding attempts suffices */ len = duk_unicode_get_xutf8_length((duk_codepoint_t) duk__encode_i32(skip)); len = duk_unicode_get_xutf8_length((duk_codepoint_t) duk__encode_i32(skip - (duk_int32_t) len)); DUK_ASSERT(duk_unicode_get_xutf8_length(duk__encode_i32(skip - (duk_int32_t) len)) == len); /* no change */ skip -= (duk_int32_t) len; } #endif #if defined(DUK_USE_PREFER_SIZE) /* Closed form solution, this produces smallest code. * See re_neg_jump_offset (closed2). */ if (skip < 0) { skip--; if (skip < -0x3fL) { skip--; } if (skip < -0x3ffL) { skip--; } if (skip < -0x7fffL) { skip--; } if (skip < -0xfffffL) { skip--; } if (skip < -0x1ffffffL) { skip--; } if (skip < -0x3fffffffL) { skip--; } } #else /* DUK_USE_PREFER_SIZE */ /* Closed form solution, this produces fastest code. * See re_neg_jump_offset (closed1). */ if (skip < 0) { if (skip >= -0x3eL) { skip -= 1; } else if (skip >= -0x3fdL) { skip -= 2; } else if (skip >= -0x7ffcL) { skip -= 3; } else if (skip >= -0xffffbL) { skip -= 4; } else if (skip >= -0x1fffffaL) { skip -= 5; } else if (skip >= -0x3ffffff9L) { skip -= 6; } else { skip -= 7; } } #endif /* DUK_USE_PREFER_SIZE */ return duk__insert_i32(re_ctx, offset, skip); } DUK_LOCAL duk_uint32_t duk__append_jump_offset(duk_re_compiler_ctx *re_ctx, duk_int32_t skip) { return (duk_uint32_t) duk__insert_jump_offset(re_ctx, (duk_uint32_t) DUK__RE_BUFLEN(re_ctx), skip); } /* * duk_re_range_callback for generating character class ranges. * * When ignoreCase is false, the range is simply emitted as is. We don't, * for instance, eliminate duplicates or overlapping ranges in a character * class. * * When ignoreCase is true but the 'direct' flag is set, the caller knows * that the range canonicalizes to itself for case insensitive matching, * so the range is emitted as is. This is mainly useful for built-in ranges * like \W. * * Otherwise, when ignoreCase is true, the range needs to be normalized * through canonicalization. Unfortunately a canonicalized version of a * continuous range is not necessarily continuous (e.g. [x-{] is continuous * but [X-{] is not). As a result, a single input range may expand to a lot * of output ranges. The current algorithm creates the canonicalized ranges * footprint efficiently at the cost of compile time execution time; see * doc/regexp.rst for discussion, and some more details below. * * Note that the ctx->nranges is a context-wide temporary value. This is OK * because there cannot be multiple character classes being parsed * simultaneously. * * More detail on canonicalization: * * Conceptually, a range is canonicalized by scanning the entire range, * normalizing each codepoint by converting it to uppercase, and generating * a set of result ranges. * * Ideally a minimal set of output ranges would be emitted by merging all * possible ranges even if they're emitted out of sequence. Because the * input string is also case normalized during matching, some codepoints * never occur at runtime; these "don't care" codepoints can be included or * excluded from ranges when merging/optimizing ranges. * * The current algorithm does not do optimal range merging. Rather, output * codepoints are generated in sequence, and when the output codepoints are * continuous (CP, CP+1, CP+2, ...), they are merged locally into as large a * range as possible. A small canonicalization bitmap is used to reduce * actual codepoint canonicalizations which are quite slow at present. The * bitmap provides a "codepoint block is continuous with respect to * canonicalization" for N-codepoint blocks. This allows blocks to be * skipped quickly. * * There are a number of shortcomings and future work here: * * - Individual codepoint normalizations are slow because they involve * walking bit-packed rules without a lookup index. * * - The conceptual algorithm needs to canonicalize every codepoint in the * input range to figure out the output range(s). Even with the small * canonicalization bitmap the algorithm runs quite slowly for worst case * inputs. There are many data structure alternatives to improve this. * * - While the current algorithm generates maximal output ranges when the * output codepoints are emitted linearly, output ranges are not sorted or * merged otherwise. In the worst case a lot of ranges are emitted when * most of the ranges could be merged. In this process one could take * advantage of "don't care" codepoints, which are never matched against at * runtime due to canonicalization of input codepoints before comparison, * to merge otherwise discontinuous output ranges. * * - The runtime data structure is just a linear list of ranges to match * against. This can be quite slow if there are a lot of output ranges. * There are various ways to make matching against the ranges faster, * e.g. sorting the ranges and using a binary search; skip lists; tree * based representations; full or approximate codepoint bitmaps, etc. * * - Only BMP is supported, codepoints above BMP are assumed to canonicalize * to themselves. For now this is one place where we don't want to * support chars outside the BMP, because the exhaustive search would be * massively larger. It would be possible to support non-BMP with a * different algorithm, or perhaps doing case normalization only at match * time. */ DUK_LOCAL void duk__regexp_emit_range(duk_re_compiler_ctx *re_ctx, duk_codepoint_t r1, duk_codepoint_t r2) { DUK_ASSERT(r2 >= r1); duk__append_u32(re_ctx, (duk_uint32_t) r1); duk__append_u32(re_ctx, (duk_uint32_t) r2); re_ctx->nranges++; } #if defined(DUK_USE_REGEXP_CANON_BITMAP) /* Find next canonicalization discontinuity (conservative estimate) starting * from 'start', not exceeding 'end'. If continuity is fine up to 'end' * inclusive, returns end. Minimum possible return value is start. */ DUK_LOCAL duk_codepoint_t duk__re_canon_next_discontinuity(duk_codepoint_t start, duk_codepoint_t end) { duk_uint_t start_blk; duk_uint_t end_blk; duk_uint_t blk; duk_uint_t offset; duk_uint8_t mask; /* Inclusive block range. */ DUK_ASSERT(start >= 0); DUK_ASSERT(end >= 0); DUK_ASSERT(end >= start); start_blk = (duk_uint_t) (start >> DUK_CANON_BITMAP_BLKSHIFT); end_blk = (duk_uint_t) (end >> DUK_CANON_BITMAP_BLKSHIFT); for (blk = start_blk; blk <= end_blk; blk++) { offset = blk >> 3; mask = 1U << (blk & 0x07); if (offset >= sizeof(duk_unicode_re_canon_bitmap)) { /* Reached non-BMP range which is assumed continuous. */ return end; } DUK_ASSERT(offset < sizeof(duk_unicode_re_canon_bitmap)); if ((duk_unicode_re_canon_bitmap[offset] & mask) == 0) { /* Block is discontinuous, continuity is guaranteed * only up to end of previous block (+1 for exclusive * return value => start of current block). Start * block requires special handling. */ if (blk > start_blk) { return (duk_codepoint_t) (blk << DUK_CANON_BITMAP_BLKSHIFT); } else { return start; } } } DUK_ASSERT(blk == end_blk + 1); /* Reached end block which is continuous. */ return end; } #else /* DUK_USE_REGEXP_CANON_BITMAP */ DUK_LOCAL duk_codepoint_t duk__re_canon_next_discontinuity(duk_codepoint_t start, duk_codepoint_t end) { DUK_ASSERT(start >= 0); DUK_ASSERT(end >= 0); DUK_ASSERT(end >= start); if (start >= 0x10000) { /* Even without the bitmap, treat non-BMP as continuous. */ return end; } return start; } #endif /* DUK_USE_REGEXP_CANON_BITMAP */ DUK_LOCAL void duk__regexp_generate_ranges(void *userdata, duk_codepoint_t r1, duk_codepoint_t r2, duk_bool_t direct) { duk_re_compiler_ctx *re_ctx = (duk_re_compiler_ctx *) userdata; duk_codepoint_t r_start; duk_codepoint_t r_end; duk_codepoint_t i; duk_codepoint_t t; duk_codepoint_t r_disc; DUK_DD(DUK_DDPRINT("duk__regexp_generate_ranges(): re_ctx=%p, range=[%ld,%ld] direct=%ld", (void *) re_ctx, (long) r1, (long) r2, (long) direct)); DUK_ASSERT(r2 >= r1); /* SyntaxError for out of order range. */ if (direct || (re_ctx->re_flags & DUK_RE_FLAG_IGNORE_CASE) == 0) { DUK_DD(DUK_DDPRINT("direct or not case sensitive, emit range: [%ld,%ld]", (long) r1, (long) r2)); duk__regexp_emit_range(re_ctx, r1, r2); return; } DUK_DD(DUK_DDPRINT("case sensitive, process range: [%ld,%ld]", (long) r1, (long) r2)); r_start = duk_unicode_re_canonicalize_char(re_ctx->thr, r1); r_end = r_start; for (i = r1 + 1; i <= r2;) { /* Input codepoint space processed up to i-1, and * current range in r_{start,end} is up-to-date * (inclusive) and may either break or continue. */ r_disc = duk__re_canon_next_discontinuity(i, r2); DUK_ASSERT(r_disc >= i); DUK_ASSERT(r_disc <= r2); r_end += r_disc - i; /* May be zero. */ t = duk_unicode_re_canonicalize_char(re_ctx->thr, r_disc); if (t == r_end + 1) { /* Not actually a discontinuity, continue range * to r_disc and recheck. */ r_end = t; } else { duk__regexp_emit_range(re_ctx, r_start, r_end); r_start = t; r_end = t; } i = r_disc + 1; /* Guarantees progress. */ } duk__regexp_emit_range(re_ctx, r_start, r_end); #if 0 /* Exhaustive search, very slow. */ r_start = duk_unicode_re_canonicalize_char(re_ctx->thr, r1); r_end = r_start; for (i = r1 + 1; i <= r2; i++) { t = duk_unicode_re_canonicalize_char(re_ctx->thr, i); if (t == r_end + 1) { r_end = t; } else { DUK_DD(DUK_DDPRINT("canonicalized, emit range: [%ld,%ld]", (long) r_start, (long) r_end)); duk__append_u32(re_ctx, (duk_uint32_t) r_start); duk__append_u32(re_ctx, (duk_uint32_t) r_end); re_ctx->nranges++; r_start = t; r_end = t; } } DUK_DD(DUK_DDPRINT("canonicalized, emit range: [%ld,%ld]", (long) r_start, (long) r_end)); duk__append_u32(re_ctx, (duk_uint32_t) r_start); duk__append_u32(re_ctx, (duk_uint32_t) r_end); re_ctx->nranges++; #endif } /* * Parse regexp Disjunction. Most of regexp compilation happens here. * * Handles Disjunction, Alternative, and Term productions directly without * recursion. The only constructs requiring recursion are positive/negative * lookaheads, capturing parentheses, and non-capturing parentheses. * * The function determines whether the entire disjunction is a 'simple atom' * (see doc/regexp.rst discussion on 'simple quantifiers') and if so, * returns the atom character length which is needed by the caller to keep * track of its own atom character length. A disjunction with more than one * alternative is never considered a simple atom (although in some cases * that might be the case). * * Return value: simple atom character length or < 0 if not a simple atom. * Appends the bytecode for the disjunction matcher to the end of the temp * buffer. * * Regexp top level structure is: * * Disjunction = Term* * | Term* | Disjunction * * Term = Assertion * | Atom * | Atom Quantifier * * An empty Term sequence is a valid disjunction alternative (e.g. /|||c||/). * * Notes: * * * Tracking of the 'simple-ness' of the current atom vs. the entire * disjunction are separate matters. For instance, the disjunction * may be complex, but individual atoms may be simple. Furthermore, * simple quantifiers are used whenever possible, even if the * disjunction as a whole is complex. * * * The estimate of whether an atom is simple is conservative now, * and it would be possible to expand it. For instance, captures * cause the disjunction to be marked complex, even though captures * -can- be handled by simple quantifiers with some minor modifications. * * * Disjunction 'tainting' as 'complex' is handled at the end of the * main for loop collectively for atoms. Assertions, quantifiers, * and '|' tokens need to taint the result manually if necessary. * Assertions cannot add to result char length, only atoms (and * quantifiers) can; currently quantifiers will taint the result * as complex though. */ DUK_LOCAL const duk_uint16_t * const duk__re_range_lookup1[3] = { duk_unicode_re_ranges_digit, duk_unicode_re_ranges_white, duk_unicode_re_ranges_wordchar }; DUK_LOCAL const duk_uint8_t duk__re_range_lookup2[3] = { sizeof(duk_unicode_re_ranges_digit) / (2 * sizeof(duk_uint16_t)), sizeof(duk_unicode_re_ranges_white) / (2 * sizeof(duk_uint16_t)), sizeof(duk_unicode_re_ranges_wordchar) / (2 * sizeof(duk_uint16_t)) }; DUK_LOCAL void duk__append_range_atom_matcher(duk_re_compiler_ctx *re_ctx, duk_small_uint_t re_op, const duk_uint16_t *ranges, duk_small_uint_t count) { #if 0 DUK_ASSERT(re_op <= 0x7fUL); DUK_ASSERT(count <= 0x7fUL); duk__append_2bytes(re_ctx, (duk_uint8_t) re_op, (duk_uint8_t) count); #endif duk__append_reop(re_ctx, re_op); duk__append_7bit(re_ctx, count); duk__append_u16_list(re_ctx, ranges, count * 2); } DUK_LOCAL void duk__parse_disjunction(duk_re_compiler_ctx *re_ctx, duk_bool_t expect_eof, duk__re_disjunction_info *out_atom_info) { duk_int32_t atom_start_offset = -1; /* negative -> no atom matched on previous round */ duk_int32_t atom_char_length = 0; /* negative -> complex atom */ duk_uint32_t atom_start_captures = re_ctx->captures; /* value of re_ctx->captures at start of atom */ duk_int32_t unpatched_disjunction_split = -1; duk_int32_t unpatched_disjunction_jump = -1; duk_uint32_t entry_offset = (duk_uint32_t) DUK__RE_BUFLEN(re_ctx); duk_int32_t res_charlen = 0; /* -1 if disjunction is complex, char length if simple */ duk__re_disjunction_info tmp_disj; DUK_ASSERT(out_atom_info != NULL); if (re_ctx->recursion_depth >= re_ctx->recursion_limit) { DUK_ERROR_RANGE(re_ctx->thr, DUK_STR_REGEXP_COMPILER_RECURSION_LIMIT); } re_ctx->recursion_depth++; #if 0 out_atom_info->start_captures = re_ctx->captures; #endif for (;;) { /* atom_char_length, atom_start_offset, atom_start_offset reflect the * atom matched on the previous loop. If a quantifier is encountered * on this loop, these are needed to handle the quantifier correctly. * new_atom_char_length etc are for the atom parsed on this round; * they're written to atom_char_length etc at the end of the round. */ duk_int32_t new_atom_char_length; /* char length of the atom parsed in this loop */ duk_int32_t new_atom_start_offset; /* bytecode start offset of the atom parsed in this loop * (allows quantifiers to copy the atom bytecode) */ duk_uint32_t new_atom_start_captures; /* re_ctx->captures at the start of the atom parsed in this loop */ duk_lexer_parse_re_token(&re_ctx->lex, &re_ctx->curr_token); DUK_DD(DUK_DDPRINT("re token: %ld (num=%ld, char=%c)", (long) re_ctx->curr_token.t, (long) re_ctx->curr_token.num, (re_ctx->curr_token.num >= 0x20 && re_ctx->curr_token.num <= 0x7e) ? (int) re_ctx->curr_token.num : (int) '?')); /* set by atom case clauses */ new_atom_start_offset = -1; new_atom_char_length = -1; new_atom_start_captures = re_ctx->captures; switch (re_ctx->curr_token.t) { case DUK_RETOK_DISJUNCTION: { /* * The handling here is a bit tricky. If a previous '|' has been processed, * we have a pending split1 and a pending jump (for a previous match). These * need to be back-patched carefully. See docs for a detailed example. */ /* patch pending jump and split */ if (unpatched_disjunction_jump >= 0) { duk_uint32_t offset; DUK_ASSERT(unpatched_disjunction_split >= 0); offset = (duk_uint32_t) unpatched_disjunction_jump; offset += duk__insert_jump_offset(re_ctx, offset, (duk_int32_t) (DUK__RE_BUFLEN(re_ctx) - offset)); /* offset is now target of the pending split (right after jump) */ duk__insert_jump_offset(re_ctx, (duk_uint32_t) unpatched_disjunction_split, (duk_int32_t) offset - unpatched_disjunction_split); } /* add a new pending split to the beginning of the entire disjunction */ (void) duk__insert_u32(re_ctx, entry_offset, DUK_REOP_SPLIT1); /* prefer direct execution */ unpatched_disjunction_split = (duk_int32_t) (entry_offset + 1); /* +1 for opcode */ /* add a new pending match jump for latest finished alternative */ duk__append_reop(re_ctx, DUK_REOP_JUMP); unpatched_disjunction_jump = (duk_int32_t) DUK__RE_BUFLEN(re_ctx); /* 'taint' result as complex */ res_charlen = -1; break; } case DUK_RETOK_QUANTIFIER: { if (atom_start_offset < 0) { DUK_ERROR_SYNTAX(re_ctx->thr, DUK_STR_INVALID_QUANTIFIER_NO_ATOM); } if (re_ctx->curr_token.qmin > re_ctx->curr_token.qmax) { DUK_ERROR_SYNTAX(re_ctx->thr, DUK_STR_INVALID_QUANTIFIER_VALUES); } if (atom_char_length >= 0) { /* * Simple atom * * If atom_char_length is zero, we'll have unbounded execution time for e.g. * /()*x/.exec('x'). We can't just skip the match because it might have some * side effects (for instance, if we allowed captures in simple atoms, the * capture needs to happen). The simple solution below is to force the * quantifier to match at most once, since the additional matches have no effect. * * With a simple atom there can be no capture groups, so no captures need * to be reset. */ duk_int32_t atom_code_length; duk_uint32_t offset; duk_uint32_t qmin, qmax; qmin = re_ctx->curr_token.qmin; qmax = re_ctx->curr_token.qmax; if (atom_char_length == 0) { /* qmin and qmax will be 0 or 1 */ if (qmin > 1) { qmin = 1; } if (qmax > 1) { qmax = 1; } } duk__append_reop(re_ctx, DUK_REOP_MATCH); /* complete 'sub atom' */ atom_code_length = (duk_int32_t) (DUK__RE_BUFLEN(re_ctx) - (duk_size_t) atom_start_offset); offset = (duk_uint32_t) atom_start_offset; if (re_ctx->curr_token.greedy) { offset += duk__insert_u32(re_ctx, offset, DUK_REOP_SQGREEDY); offset += duk__insert_u32(re_ctx, offset, qmin); offset += duk__insert_u32(re_ctx, offset, qmax); offset += duk__insert_u32(re_ctx, offset, (duk_uint32_t) atom_char_length); offset += duk__insert_jump_offset(re_ctx, offset, atom_code_length); } else { offset += duk__insert_u32(re_ctx, offset, DUK_REOP_SQMINIMAL); offset += duk__insert_u32(re_ctx, offset, qmin); offset += duk__insert_u32(re_ctx, offset, qmax); offset += duk__insert_jump_offset(re_ctx, offset, atom_code_length); } DUK_UNREF(offset); /* silence scan-build warning */ } else { /* * Complex atom * * The original code is used as a template, and removed at the end * (this differs from the handling of simple quantifiers). * * NOTE: there is no current solution for empty atoms in complex * quantifiers. This would need some sort of a 'progress' instruction. * * XXX: impose limit on maximum result size, i.e. atom_code_len * atom_copies? */ duk_int32_t atom_code_length; duk_uint32_t atom_copies; duk_uint32_t tmp_qmin, tmp_qmax; /* pre-check how many atom copies we're willing to make (atom_copies not needed below) */ atom_copies = (re_ctx->curr_token.qmax == DUK_RE_QUANTIFIER_INFINITE) ? re_ctx->curr_token.qmin : re_ctx->curr_token.qmax; if (atom_copies > DUK_RE_MAX_ATOM_COPIES) { DUK_ERROR_RANGE(re_ctx->thr, DUK_STR_QUANTIFIER_TOO_MANY_COPIES); } /* wipe the capture range made by the atom (if any) */ DUK_ASSERT(atom_start_captures <= re_ctx->captures); if (atom_start_captures != re_ctx->captures) { DUK_ASSERT(atom_start_captures < re_ctx->captures); DUK_DDD(DUK_DDDPRINT("must wipe ]atom_start_captures,re_ctx->captures]: ]%ld,%ld]", (long) atom_start_captures, (long) re_ctx->captures)); /* insert (DUK_REOP_WIPERANGE, start, count) in reverse order so the order ends up right */ duk__insert_u32(re_ctx, (duk_uint32_t) atom_start_offset, (re_ctx->captures - atom_start_captures) * 2U); duk__insert_u32(re_ctx, (duk_uint32_t) atom_start_offset, (atom_start_captures + 1) * 2); duk__insert_u32(re_ctx, (duk_uint32_t) atom_start_offset, DUK_REOP_WIPERANGE); } else { DUK_DDD(DUK_DDDPRINT("no need to wipe captures: atom_start_captures == re_ctx->captures == %ld", (long) atom_start_captures)); } atom_code_length = (duk_int32_t) DUK__RE_BUFLEN(re_ctx) - atom_start_offset; /* insert the required matches (qmin) by copying the atom */ tmp_qmin = re_ctx->curr_token.qmin; tmp_qmax = re_ctx->curr_token.qmax; while (tmp_qmin > 0) { duk__append_slice(re_ctx, (duk_uint32_t) atom_start_offset, (duk_uint32_t) atom_code_length); tmp_qmin--; if (tmp_qmax != DUK_RE_QUANTIFIER_INFINITE) { tmp_qmax--; } } DUK_ASSERT(tmp_qmin == 0); /* insert code for matching the remainder - infinite or finite */ if (tmp_qmax == DUK_RE_QUANTIFIER_INFINITE) { /* reuse last emitted atom for remaining 'infinite' quantifier */ if (re_ctx->curr_token.qmin == 0) { /* Special case: original qmin was zero so there is nothing * to repeat. Emit an atom copy but jump over it here. */ duk__append_reop(re_ctx, DUK_REOP_JUMP); duk__append_jump_offset(re_ctx, atom_code_length); duk__append_slice(re_ctx, (duk_uint32_t) atom_start_offset, (duk_uint32_t) atom_code_length); } if (re_ctx->curr_token.greedy) { duk__append_reop(re_ctx, DUK_REOP_SPLIT2); /* prefer jump */ } else { duk__append_reop(re_ctx, DUK_REOP_SPLIT1); /* prefer direct */ } duk__append_jump_offset(re_ctx, -atom_code_length - 1); /* -1 for opcode */ } else { /* * The remaining matches are emitted as sequence of SPLITs and atom * copies; the SPLITs skip the remaining copies and match the sequel. * This sequence needs to be emitted starting from the last copy * because the SPLITs are variable length due to the variable length * skip offset. This causes a lot of memory copying now. * * Example structure (greedy, match maximum # atoms): * * SPLIT1 LSEQ * (atom) * SPLIT1 LSEQ ; <- the byte length of this instruction is needed * (atom) ; to encode the above SPLIT1 correctly * ... * LSEQ: */ duk_uint32_t offset = (duk_uint32_t) DUK__RE_BUFLEN(re_ctx); while (tmp_qmax > 0) { duk__insert_slice(re_ctx, offset, (duk_uint32_t) atom_start_offset, (duk_uint32_t) atom_code_length); if (re_ctx->curr_token.greedy) { duk__insert_u32(re_ctx, offset, DUK_REOP_SPLIT1); /* prefer direct */ } else { duk__insert_u32(re_ctx, offset, DUK_REOP_SPLIT2); /* prefer jump */ } duk__insert_jump_offset(re_ctx, offset + 1, /* +1 for opcode */ (duk_int32_t) (DUK__RE_BUFLEN(re_ctx) - (offset + 1))); tmp_qmax--; } } /* remove the original 'template' atom */ duk__remove_slice(re_ctx, (duk_uint32_t) atom_start_offset, (duk_uint32_t) atom_code_length); } /* 'taint' result as complex */ res_charlen = -1; break; } case DUK_RETOK_ASSERT_START: { duk__append_reop(re_ctx, DUK_REOP_ASSERT_START); break; } case DUK_RETOK_ASSERT_END: { duk__append_reop(re_ctx, DUK_REOP_ASSERT_END); break; } case DUK_RETOK_ASSERT_WORD_BOUNDARY: { duk__append_reop(re_ctx, DUK_REOP_ASSERT_WORD_BOUNDARY); break; } case DUK_RETOK_ASSERT_NOT_WORD_BOUNDARY: { duk__append_reop(re_ctx, DUK_REOP_ASSERT_NOT_WORD_BOUNDARY); break; } case DUK_RETOK_ASSERT_START_POS_LOOKAHEAD: case DUK_RETOK_ASSERT_START_NEG_LOOKAHEAD: { duk_uint32_t offset; duk_uint32_t opcode = (re_ctx->curr_token.t == DUK_RETOK_ASSERT_START_POS_LOOKAHEAD) ? DUK_REOP_LOOKPOS : DUK_REOP_LOOKNEG; offset = (duk_uint32_t) DUK__RE_BUFLEN(re_ctx); duk__parse_disjunction(re_ctx, 0, &tmp_disj); duk__append_reop(re_ctx, DUK_REOP_MATCH); (void) duk__insert_u32(re_ctx, offset, opcode); (void) duk__insert_jump_offset(re_ctx, offset + 1, /* +1 for opcode */ (duk_int32_t) (DUK__RE_BUFLEN(re_ctx) - (offset + 1))); /* 'taint' result as complex -- this is conservative, * as lookaheads do not backtrack. */ res_charlen = -1; break; } case DUK_RETOK_ATOM_PERIOD: { new_atom_char_length = 1; new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx); duk__append_reop(re_ctx, DUK_REOP_PERIOD); break; } case DUK_RETOK_ATOM_CHAR: { /* Note: successive characters could be joined into string matches * but this is not trivial (consider e.g. '/xyz+/); see docs for * more discussion. * * No support for \u{H+} yet. While only BMP Unicode escapes are * supported for RegExps at present, 'ch' may still be a non-BMP * codepoint if it is decoded straight from source text UTF-8. * There's no non-BMP support yet so this is handled simply by * matching the non-BMP character (which is custom behavior). */ duk_uint32_t ch; new_atom_char_length = 1; new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx); duk__append_reop(re_ctx, DUK_REOP_CHAR); ch = re_ctx->curr_token.num; if (re_ctx->re_flags & DUK_RE_FLAG_IGNORE_CASE) { ch = (duk_uint32_t) duk_unicode_re_canonicalize_char(re_ctx->thr, (duk_codepoint_t) ch); } duk__append_u32(re_ctx, ch); break; } case DUK_RETOK_ATOM_DIGIT: case DUK_RETOK_ATOM_NOT_DIGIT: case DUK_RETOK_ATOM_WHITE: case DUK_RETOK_ATOM_NOT_WHITE: case DUK_RETOK_ATOM_WORD_CHAR: case DUK_RETOK_ATOM_NOT_WORD_CHAR: { duk_small_uint_t re_op; duk_small_uint_t idx; new_atom_char_length = 1; new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx); DUK_ASSERT((DUK_RETOK_ATOM_DIGIT & 0x01) != 0); DUK_ASSERT((DUK_RETOK_ATOM_WHITE & 0x01) != 0); DUK_ASSERT((DUK_RETOK_ATOM_WORD_CHAR & 0x01) != 0); DUK_ASSERT((DUK_RETOK_ATOM_NOT_DIGIT & 0x01) == 0); DUK_ASSERT((DUK_RETOK_ATOM_NOT_WHITE & 0x01) == 0); DUK_ASSERT((DUK_RETOK_ATOM_NOT_WORD_CHAR & 0x01) == 0); re_op = (re_ctx->curr_token.t & 0x01) ? DUK_REOP_RANGES : DUK_REOP_INVRANGES; DUK_ASSERT(DUK_RETOK_ATOM_WHITE == DUK_RETOK_ATOM_DIGIT + 2); DUK_ASSERT(DUK_RETOK_ATOM_WORD_CHAR == DUK_RETOK_ATOM_DIGIT + 4); idx = (duk_small_uint_t) ((re_ctx->curr_token.t - DUK_RETOK_ATOM_DIGIT) >> 1U); DUK_ASSERT(idx <= 2U); /* Assume continuous token numbers; also checks negative underflow. */ duk__append_range_atom_matcher(re_ctx, re_op, duk__re_range_lookup1[idx], duk__re_range_lookup2[idx]); break; } case DUK_RETOK_ATOM_BACKREFERENCE: { duk_uint32_t backref = (duk_uint32_t) re_ctx->curr_token.num; if (backref > re_ctx->highest_backref) { re_ctx->highest_backref = backref; } new_atom_char_length = -1; /* mark as complex */ new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx); duk__append_reop(re_ctx, DUK_REOP_BACKREFERENCE); duk__append_u32(re_ctx, backref); break; } case DUK_RETOK_ATOM_START_CAPTURE_GROUP: { duk_uint32_t cap; new_atom_char_length = -1; /* mark as complex (capture handling) */ new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx); cap = ++re_ctx->captures; duk__append_reop(re_ctx, DUK_REOP_SAVE); duk__append_u32(re_ctx, cap * 2); duk__parse_disjunction(re_ctx, 0, &tmp_disj); /* retval (sub-atom char length) unused, tainted as complex above */ duk__append_reop(re_ctx, DUK_REOP_SAVE); duk__append_u32(re_ctx, cap * 2 + 1); break; } case DUK_RETOK_ATOM_START_NONCAPTURE_GROUP: { new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx); duk__parse_disjunction(re_ctx, 0, &tmp_disj); new_atom_char_length = tmp_disj.charlen; break; } case DUK_RETOK_ATOM_START_CHARCLASS: case DUK_RETOK_ATOM_START_CHARCLASS_INVERTED: { /* * Range parsing is done with a special lexer function which calls * us for every range parsed. This is different from how rest of * the parsing works, but avoids a heavy, arbitrary size intermediate * value type to hold the ranges. * * Another complication is the handling of character ranges when * case insensitive matching is used (see docs for discussion). * The range handler callback given to the lexer takes care of this * as well. * * Note that duplicate ranges are not eliminated when parsing character * classes, so that canonicalization of * * [0-9a-fA-Fx-{] * * creates the result (note the duplicate ranges): * * [0-9A-FA-FX-Z{-{] * * where [x-{] is split as a result of canonicalization. The duplicate * ranges are not a semantics issue: they work correctly. */ duk_uint32_t offset; DUK_DD(DUK_DDPRINT("character class")); /* insert ranges instruction, range count patched in later */ new_atom_char_length = 1; new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx); duk__append_reop(re_ctx, (re_ctx->curr_token.t == DUK_RETOK_ATOM_START_CHARCLASS) ? DUK_REOP_RANGES : DUK_REOP_INVRANGES); offset = (duk_uint32_t) DUK__RE_BUFLEN(re_ctx); /* patch in range count later */ /* parse ranges until character class ends */ re_ctx->nranges = 0; /* note: ctx-wide temporary */ duk_lexer_parse_re_ranges(&re_ctx->lex, duk__regexp_generate_ranges, (void *) re_ctx); /* insert range count */ duk__insert_u32(re_ctx, offset, re_ctx->nranges); break; } case DUK_RETOK_ATOM_END_GROUP: { if (expect_eof) { DUK_ERROR_SYNTAX(re_ctx->thr, DUK_STR_UNEXPECTED_CLOSING_PAREN); } goto done; } case DUK_RETOK_EOF: { if (!expect_eof) { DUK_ERROR_SYNTAX(re_ctx->thr, DUK_STR_UNEXPECTED_END_OF_PATTERN); } goto done; } default: { DUK_ERROR_SYNTAX(re_ctx->thr, DUK_STR_UNEXPECTED_REGEXP_TOKEN); } } /* a complex (new) atom taints the result */ if (new_atom_start_offset >= 0) { if (new_atom_char_length < 0) { res_charlen = -1; } else if (res_charlen >= 0) { /* only advance if not tainted */ res_charlen += new_atom_char_length; } } /* record previous atom info in case next token is a quantifier */ atom_start_offset = new_atom_start_offset; atom_char_length = new_atom_char_length; atom_start_captures = new_atom_start_captures; } done: /* finish up pending jump and split for last alternative */ if (unpatched_disjunction_jump >= 0) { duk_uint32_t offset; DUK_ASSERT(unpatched_disjunction_split >= 0); offset = (duk_uint32_t) unpatched_disjunction_jump; offset += duk__insert_jump_offset(re_ctx, offset, (duk_int32_t) (DUK__RE_BUFLEN(re_ctx) - offset)); /* offset is now target of the pending split (right after jump) */ duk__insert_jump_offset(re_ctx, (duk_uint32_t) unpatched_disjunction_split, (duk_int32_t) offset - unpatched_disjunction_split); } #if 0 out_atom_info->end_captures = re_ctx->captures; #endif out_atom_info->charlen = res_charlen; DUK_DDD(DUK_DDDPRINT("parse disjunction finished: charlen=%ld", (long) out_atom_info->charlen)); re_ctx->recursion_depth--; } /* * Flags parsing (see E5 Section 15.10.4.1). */ DUK_LOCAL duk_uint32_t duk__parse_regexp_flags(duk_hthread *thr, duk_hstring *h) { const duk_uint8_t *p; const duk_uint8_t *p_end; duk_uint32_t flags = 0; p = DUK_HSTRING_GET_DATA(h); p_end = p + DUK_HSTRING_GET_BYTELEN(h); /* Note: can be safely scanned as bytes (undecoded) */ while (p < p_end) { duk_uint8_t c = *p++; switch (c) { case (duk_uint8_t) 'g': { if (flags & DUK_RE_FLAG_GLOBAL) { goto flags_error; } flags |= DUK_RE_FLAG_GLOBAL; break; } case (duk_uint8_t) 'i': { if (flags & DUK_RE_FLAG_IGNORE_CASE) { goto flags_error; } flags |= DUK_RE_FLAG_IGNORE_CASE; break; } case (duk_uint8_t) 'm': { if (flags & DUK_RE_FLAG_MULTILINE) { goto flags_error; } flags |= DUK_RE_FLAG_MULTILINE; break; } default: { goto flags_error; } } } return flags; flags_error: DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_REGEXP_FLAGS); return 0; /* never here */ } /* * Create escaped RegExp source (E5 Section 15.10.3). * * The current approach is to special case the empty RegExp * ('' -> '(?:)') and otherwise replace unescaped '/' characters * with '\/' regardless of where they occur in the regexp. * * Note that normalization does not seem to be necessary for * RegExp literals (e.g. '/foo/') because to be acceptable as * a RegExp literal, the text between forward slashes must * already match the escaping requirements (e.g. must not contain * unescaped forward slashes or be empty). Escaping IS needed * for expressions like 'new Regexp("...", "")' however. * Currently, we re-escape in either case. * * Also note that we process the source here in UTF-8 encoded * form. This is correct, because any non-ASCII characters are * passed through without change. */ DUK_LOCAL void duk__create_escaped_source(duk_hthread *thr, int idx_pattern) { duk_hstring *h; const duk_uint8_t *p; duk_bufwriter_ctx bw_alloc; duk_bufwriter_ctx *bw; duk_uint8_t *q; duk_size_t i, n; duk_uint_fast8_t c_prev, c; h = duk_known_hstring(thr, idx_pattern); p = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h); n = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h); if (n == 0) { duk_push_string(thr, "(?:)"); return; } bw = &bw_alloc; DUK_BW_INIT_PUSHBUF(thr, bw, n); q = DUK_BW_GET_PTR(thr, bw); c_prev = (duk_uint_fast8_t) 0; for (i = 0; i < n; i++) { c = p[i]; q = DUK_BW_ENSURE_RAW(thr, bw, 2, q); if (c == (duk_uint_fast8_t) '/' && c_prev != (duk_uint_fast8_t) '\\') { /* Unescaped '/' ANYWHERE in the regexp (in disjunction, * inside a character class, ...) => same escape works. */ *q++ = DUK_ASC_BACKSLASH; } *q++ = (duk_uint8_t) c; c_prev = c; } DUK_BW_SETPTR_AND_COMPACT(thr, bw, q); (void) duk_buffer_to_string(thr, -1); /* Safe if input is safe. */ /* [ ... escaped_source ] */ } /* * Exposed regexp compilation primitive. * * Sets up a regexp compilation context, and calls duk__parse_disjunction() to do the * actual parsing. Handles generation of the compiled regexp header and the * "boilerplate" capture of the matching substring (save 0 and 1). Also does some * global level regexp checks after recursive compilation has finished. * * An escaped version of the regexp source, suitable for use as a RegExp instance * 'source' property (see E5 Section 15.10.3), is also left on the stack. * * Input stack: [ pattern flags ] * Output stack: [ bytecode escaped_source ] (both as strings) */ DUK_INTERNAL void duk_regexp_compile(duk_hthread *thr) { duk_re_compiler_ctx re_ctx; duk_lexer_point lex_point; duk_hstring *h_pattern; duk_hstring *h_flags; duk__re_disjunction_info ign_disj; DUK_ASSERT(thr != NULL); /* * Args validation */ /* TypeError if fails */ h_pattern = duk_require_hstring_notsymbol(thr, -2); h_flags = duk_require_hstring_notsymbol(thr, -1); /* * Create normalized 'source' property (E5 Section 15.10.3). */ /* [ ... pattern flags ] */ duk__create_escaped_source(thr, -2); /* [ ... pattern flags escaped_source ] */ /* * Init compilation context */ /* [ ... pattern flags escaped_source buffer ] */ DUK_MEMZERO(&re_ctx, sizeof(re_ctx)); DUK_LEXER_INITCTX(&re_ctx.lex); /* duplicate zeroing, expect for (possible) NULL inits */ re_ctx.thr = thr; re_ctx.lex.thr = thr; re_ctx.lex.input = DUK_HSTRING_GET_DATA(h_pattern); re_ctx.lex.input_length = DUK_HSTRING_GET_BYTELEN(h_pattern); re_ctx.lex.token_limit = DUK_RE_COMPILE_TOKEN_LIMIT; re_ctx.recursion_limit = DUK_USE_REGEXP_COMPILER_RECLIMIT; re_ctx.re_flags = duk__parse_regexp_flags(thr, h_flags); DUK_BW_INIT_PUSHBUF(thr, &re_ctx.bw, DUK__RE_INITIAL_BUFSIZE); DUK_DD(DUK_DDPRINT("regexp compiler ctx initialized, flags=0x%08lx, recursion_limit=%ld", (unsigned long) re_ctx.re_flags, (long) re_ctx.recursion_limit)); /* * Init lexer */ lex_point.offset = 0; /* expensive init, just want to fill window */ lex_point.line = 1; DUK_LEXER_SETPOINT(&re_ctx.lex, &lex_point); /* * Compilation */ DUK_DD(DUK_DDPRINT("starting regexp compilation")); duk__append_reop(&re_ctx, DUK_REOP_SAVE); duk__append_7bit(&re_ctx, 0); duk__parse_disjunction(&re_ctx, 1 /*expect_eof*/, &ign_disj); duk__append_reop(&re_ctx, DUK_REOP_SAVE); duk__append_7bit(&re_ctx, 1); duk__append_reop(&re_ctx, DUK_REOP_MATCH); /* * Check for invalid backreferences; note that it is NOT an error * to back-reference a capture group which has not yet been introduced * in the pattern (as in /\1(foo)/); in fact, the backreference will * always match! It IS an error to back-reference a capture group * which will never be introduced in the pattern. Thus, we can check * for such references only after parsing is complete. */ if (re_ctx.highest_backref > re_ctx.captures) { DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_BACKREFS); } /* * Emit compiled regexp header: flags, ncaptures * (insertion order inverted on purpose) */ duk__insert_u32(&re_ctx, 0, (re_ctx.captures + 1) * 2); duk__insert_u32(&re_ctx, 0, re_ctx.re_flags); /* [ ... pattern flags escaped_source buffer ] */ DUK_BW_COMPACT(thr, &re_ctx.bw); (void) duk_buffer_to_string(thr, -1); /* Safe because flags is at most 7 bit. */ /* [ ... pattern flags escaped_source bytecode ] */ /* * Finalize stack */ duk_remove(thr, -4); /* -> [ ... flags escaped_source bytecode ] */ duk_remove(thr, -3); /* -> [ ... escaped_source bytecode ] */ DUK_DD(DUK_DDPRINT("regexp compilation successful, bytecode: %!T, escaped source: %!T", (duk_tval *) duk_get_tval(thr, -1), (duk_tval *) duk_get_tval(thr, -2))); } /* * Create a RegExp instance (E5 Section 15.10.7). * * Note: the output stack left by duk_regexp_compile() is directly compatible * with the input here. * * Input stack: [ escaped_source bytecode ] (both as strings) * Output stack: [ RegExp ] */ DUK_INTERNAL void duk_regexp_create_instance(duk_hthread *thr) { duk_hobject *h; /* [ ... escaped_source bytecode ] */ duk_push_object(thr); h = duk_known_hobject(thr, -1); duk_insert(thr, -3); /* [ ... regexp_object escaped_source bytecode ] */ DUK_HOBJECT_SET_CLASS_NUMBER(h, DUK_HOBJECT_CLASS_REGEXP); DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, h, thr->builtins[DUK_BIDX_REGEXP_PROTOTYPE]); duk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_INT_BYTECODE, DUK_PROPDESC_FLAGS_NONE); /* [ ... regexp_object escaped_source ] */ /* In ES2015 .source, and the .global, .multiline, etc flags are * inherited getters. Store the escaped source as an internal * property for the getter. */ duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_SOURCE, DUK_PROPDESC_FLAGS_NONE); /* [ ... regexp_object ] */ duk_push_int(thr, 0); duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LAST_INDEX, DUK_PROPDESC_FLAGS_W); /* [ ... regexp_object ] */ } #else /* DUK_USE_REGEXP_SUPPORT */ /* regexp support disabled */ #endif /* DUK_USE_REGEXP_SUPPORT */ /* automatic undefs */ #undef DUK__RE_BUFLEN #undef DUK__RE_INITIAL_BUFSIZE #line 1 "duk_regexp_executor.c" /* * Regexp executor. * * Safety: the Ecmascript executor should prevent user from reading and * replacing regexp bytecode. Even so, the executor must validate all * memory accesses etc. When an invalid access is detected (e.g. a 'save' * opcode to invalid, unallocated index) it should fail with an internal * error but not cause a segmentation fault. * * Notes: * * - Backtrack counts are limited to unsigned 32 bits but should * technically be duk_size_t for strings longer than 4G chars. * This also requires a regexp bytecode change. */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_REGEXP_SUPPORT) /* * Helpers for UTF-8 handling * * For bytecode readers the duk_uint32_t and duk_int32_t types are correct * because they're used for more than just codepoints. */ DUK_LOCAL duk_uint32_t duk__bc_get_u32(duk_re_matcher_ctx *re_ctx, const duk_uint8_t **pc) { return (duk_uint32_t) duk_unicode_decode_xutf8_checked(re_ctx->thr, pc, re_ctx->bytecode, re_ctx->bytecode_end); } DUK_LOCAL duk_int32_t duk__bc_get_i32(duk_re_matcher_ctx *re_ctx, const duk_uint8_t **pc) { duk_uint32_t t; /* signed integer encoding needed to work with UTF-8 */ t = (duk_uint32_t) duk_unicode_decode_xutf8_checked(re_ctx->thr, pc, re_ctx->bytecode, re_ctx->bytecode_end); if (t & 1) { return -((duk_int32_t) (t >> 1)); } else { return (duk_int32_t) (t >> 1); } } DUK_LOCAL const duk_uint8_t *duk__utf8_backtrack(duk_hthread *thr, const duk_uint8_t **ptr, const duk_uint8_t *ptr_start, const duk_uint8_t *ptr_end, duk_uint_fast32_t count) { const duk_uint8_t *p; /* Note: allow backtracking from p == ptr_end */ p = *ptr; if (p < ptr_start || p > ptr_end) { goto fail; } while (count > 0) { for (;;) { p--; if (p < ptr_start) { goto fail; } if ((*p & 0xc0) != 0x80) { /* utf-8 continuation bytes have the form 10xx xxxx */ break; } } count--; } *ptr = p; return p; fail: DUK_ERROR_INTERNAL(thr); return NULL; /* never here */ } DUK_LOCAL const duk_uint8_t *duk__utf8_advance(duk_hthread *thr, const duk_uint8_t **ptr, const duk_uint8_t *ptr_start, const duk_uint8_t *ptr_end, duk_uint_fast32_t count) { const duk_uint8_t *p; p = *ptr; if (p < ptr_start || p >= ptr_end) { goto fail; } while (count > 0) { for (;;) { p++; /* Note: if encoding ends by hitting end of input, we don't check that * the encoding is valid, we just assume it is. */ if (p >= ptr_end || ((*p & 0xc0) != 0x80)) { /* utf-8 continuation bytes have the form 10xx xxxx */ break; } } count--; } *ptr = p; return p; fail: DUK_ERROR_INTERNAL(thr); return NULL; /* never here */ } /* * Helpers for dealing with the input string */ /* Get a (possibly canonicalized) input character from current sp. The input * itself is never modified, and captures always record non-canonicalized * characters even in case-insensitive matching. Return <0 if out of input. */ DUK_LOCAL duk_codepoint_t duk__inp_get_cp(duk_re_matcher_ctx *re_ctx, const duk_uint8_t **sp) { duk_codepoint_t res; if (*sp >= re_ctx->input_end) { return -1; } res = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(re_ctx->thr, sp, re_ctx->input, re_ctx->input_end); if (re_ctx->re_flags & DUK_RE_FLAG_IGNORE_CASE) { res = duk_unicode_re_canonicalize_char(re_ctx->thr, res); } return res; } DUK_LOCAL const duk_uint8_t *duk__inp_backtrack(duk_re_matcher_ctx *re_ctx, const duk_uint8_t **sp, duk_uint_fast32_t count) { return duk__utf8_backtrack(re_ctx->thr, sp, re_ctx->input, re_ctx->input_end, count); } /* Backtrack utf-8 input and return a (possibly canonicalized) input character. */ DUK_LOCAL duk_codepoint_t duk__inp_get_prev_cp(duk_re_matcher_ctx *re_ctx, const duk_uint8_t *sp) { /* note: caller 'sp' is intentionally not updated here */ (void) duk__inp_backtrack(re_ctx, &sp, (duk_uint_fast32_t) 1); return duk__inp_get_cp(re_ctx, &sp); } /* * Regexp recursive matching function. * * Returns 'sp' on successful match (points to character after last matched one), * NULL otherwise. * * The C recursion depth limit check is only performed in this function, this * suffices because the function is present in all true recursion required by * regexp execution. */ DUK_LOCAL const duk_uint8_t *duk__match_regexp(duk_re_matcher_ctx *re_ctx, const duk_uint8_t *pc, const duk_uint8_t *sp) { if (re_ctx->recursion_depth >= re_ctx->recursion_limit) { DUK_ERROR_RANGE(re_ctx->thr, DUK_STR_REGEXP_EXECUTOR_RECURSION_LIMIT); } re_ctx->recursion_depth++; for (;;) { duk_small_int_t op; if (re_ctx->steps_count >= re_ctx->steps_limit) { DUK_ERROR_RANGE(re_ctx->thr, DUK_STR_REGEXP_EXECUTOR_STEP_LIMIT); } re_ctx->steps_count++; /* Opcodes are at most 7 bits now so they encode to one byte. If this * were not the case or 'pc' is invalid here (due to a bug etc) we'll * still fail safely through the switch default case. */ DUK_ASSERT(pc[0] <= 0x7fU); #if 0 op = (duk_small_int_t) duk__bc_get_u32(re_ctx, &pc); #endif op = *pc++; DUK_DDD(DUK_DDDPRINT("match: rec=%ld, steps=%ld, pc (after op)=%ld, sp=%ld, op=%ld", (long) re_ctx->recursion_depth, (long) re_ctx->steps_count, (long) (pc - re_ctx->bytecode), (long) (sp - re_ctx->input), (long) op)); switch (op) { case DUK_REOP_MATCH: { goto match; } case DUK_REOP_CHAR: { /* * Byte-based matching would be possible for case-sensitive * matching but not for case-insensitive matching. So, we * match by decoding the input and bytecode character normally. * * Bytecode characters are assumed to be already canonicalized. * Input characters are canonicalized automatically by * duk__inp_get_cp() if necessary. * * There is no opcode for matching multiple characters. The * regexp compiler has trouble joining strings efficiently * during compilation. See doc/regexp.rst for more discussion. */ duk_codepoint_t c1, c2; c1 = (duk_codepoint_t) duk__bc_get_u32(re_ctx, &pc); DUK_ASSERT(!(re_ctx->re_flags & DUK_RE_FLAG_IGNORE_CASE) || c1 == duk_unicode_re_canonicalize_char(re_ctx->thr, c1)); /* canonicalized by compiler */ c2 = duk__inp_get_cp(re_ctx, &sp); /* No need to check for c2 < 0 (end of input): because c1 >= 0, it * will fail the match below automatically and cause goto fail. */ #if 0 if (c2 < 0) { goto fail; } #endif DUK_ASSERT(c1 >= 0); DUK_DDD(DUK_DDDPRINT("char match, c1=%ld, c2=%ld", (long) c1, (long) c2)); if (c1 != c2) { goto fail; } break; } case DUK_REOP_PERIOD: { duk_codepoint_t c; c = duk__inp_get_cp(re_ctx, &sp); if (c < 0 || duk_unicode_is_line_terminator(c)) { /* E5 Sections 15.10.2.8, 7.3 */ goto fail; } break; } case DUK_REOP_RANGES: case DUK_REOP_INVRANGES: { duk_uint32_t n; duk_codepoint_t c; duk_small_int_t match; n = duk__bc_get_u32(re_ctx, &pc); c = duk__inp_get_cp(re_ctx, &sp); if (c < 0) { goto fail; } match = 0; while (n) { duk_codepoint_t r1, r2; r1 = (duk_codepoint_t) duk__bc_get_u32(re_ctx, &pc); r2 = (duk_codepoint_t) duk__bc_get_u32(re_ctx, &pc); DUK_DDD(DUK_DDDPRINT("matching ranges/invranges, n=%ld, r1=%ld, r2=%ld, c=%ld", (long) n, (long) r1, (long) r2, (long) c)); if (c >= r1 && c <= r2) { /* Note: don't bail out early, we must read all the ranges from * bytecode. Another option is to skip them efficiently after * breaking out of here. Prefer smallest code. */ match = 1; } n--; } if (op == DUK_REOP_RANGES) { if (!match) { goto fail; } } else { DUK_ASSERT(op == DUK_REOP_INVRANGES); if (match) { goto fail; } } break; } case DUK_REOP_ASSERT_START: { duk_codepoint_t c; if (sp <= re_ctx->input) { break; } if (!(re_ctx->re_flags & DUK_RE_FLAG_MULTILINE)) { goto fail; } c = duk__inp_get_prev_cp(re_ctx, sp); if (duk_unicode_is_line_terminator(c)) { /* E5 Sections 15.10.2.8, 7.3 */ break; } goto fail; } case DUK_REOP_ASSERT_END: { duk_codepoint_t c; const duk_uint8_t *tmp_sp; tmp_sp = sp; c = duk__inp_get_cp(re_ctx, &tmp_sp); if (c < 0) { break; } if (!(re_ctx->re_flags & DUK_RE_FLAG_MULTILINE)) { goto fail; } if (duk_unicode_is_line_terminator(c)) { /* E5 Sections 15.10.2.8, 7.3 */ break; } goto fail; } case DUK_REOP_ASSERT_WORD_BOUNDARY: case DUK_REOP_ASSERT_NOT_WORD_BOUNDARY: { /* * E5 Section 15.10.2.6. The previous and current character * should -not- be canonicalized as they are now. However, * canonicalization does not affect the result of IsWordChar() * (which depends on Unicode characters never canonicalizing * into ASCII characters) so this does not matter. */ duk_small_int_t w1, w2; if (sp <= re_ctx->input) { w1 = 0; /* not a wordchar */ } else { duk_codepoint_t c; c = duk__inp_get_prev_cp(re_ctx, sp); w1 = duk_unicode_re_is_wordchar(c); } if (sp >= re_ctx->input_end) { w2 = 0; /* not a wordchar */ } else { const duk_uint8_t *tmp_sp = sp; /* dummy so sp won't get updated */ duk_codepoint_t c; c = duk__inp_get_cp(re_ctx, &tmp_sp); w2 = duk_unicode_re_is_wordchar(c); } if (op == DUK_REOP_ASSERT_WORD_BOUNDARY) { if (w1 == w2) { goto fail; } } else { DUK_ASSERT(op == DUK_REOP_ASSERT_NOT_WORD_BOUNDARY); if (w1 != w2) { goto fail; } } break; } case DUK_REOP_JUMP: { duk_int32_t skip; skip = duk__bc_get_i32(re_ctx, &pc); pc += skip; break; } case DUK_REOP_SPLIT1: { /* split1: prefer direct execution (no jump) */ const duk_uint8_t *sub_sp; duk_int32_t skip; skip = duk__bc_get_i32(re_ctx, &pc); sub_sp = duk__match_regexp(re_ctx, pc, sp); if (sub_sp) { sp = sub_sp; goto match; } pc += skip; break; } case DUK_REOP_SPLIT2: { /* split2: prefer jump execution (not direct) */ const duk_uint8_t *sub_sp; duk_int32_t skip; skip = duk__bc_get_i32(re_ctx, &pc); sub_sp = duk__match_regexp(re_ctx, pc + skip, sp); if (sub_sp) { sp = sub_sp; goto match; } break; } case DUK_REOP_SQMINIMAL: { duk_uint32_t q, qmin, qmax; duk_int32_t skip; const duk_uint8_t *sub_sp; qmin = duk__bc_get_u32(re_ctx, &pc); qmax = duk__bc_get_u32(re_ctx, &pc); skip = duk__bc_get_i32(re_ctx, &pc); DUK_DDD(DUK_DDDPRINT("minimal quantifier, qmin=%lu, qmax=%lu, skip=%ld", (unsigned long) qmin, (unsigned long) qmax, (long) skip)); q = 0; while (q <= qmax) { if (q >= qmin) { sub_sp = duk__match_regexp(re_ctx, pc + skip, sp); if (sub_sp) { sp = sub_sp; goto match; } } sub_sp = duk__match_regexp(re_ctx, pc, sp); if (!sub_sp) { break; } sp = sub_sp; q++; } goto fail; } case DUK_REOP_SQGREEDY: { duk_uint32_t q, qmin, qmax, atomlen; duk_int32_t skip; const duk_uint8_t *sub_sp; qmin = duk__bc_get_u32(re_ctx, &pc); qmax = duk__bc_get_u32(re_ctx, &pc); atomlen = duk__bc_get_u32(re_ctx, &pc); skip = duk__bc_get_i32(re_ctx, &pc); DUK_DDD(DUK_DDDPRINT("greedy quantifier, qmin=%lu, qmax=%lu, atomlen=%lu, skip=%ld", (unsigned long) qmin, (unsigned long) qmax, (unsigned long) atomlen, (long) skip)); q = 0; while (q < qmax) { sub_sp = duk__match_regexp(re_ctx, pc, sp); if (!sub_sp) { break; } sp = sub_sp; q++; } while (q >= qmin) { sub_sp = duk__match_regexp(re_ctx, pc + skip, sp); if (sub_sp) { sp = sub_sp; goto match; } if (q == qmin) { break; } /* Note: if atom were to contain e.g. captures, we would need to * re-match the atom to get correct captures. Simply quantifiers * do not allow captures in their atom now, so this is not an issue. */ DUK_DDD(DUK_DDDPRINT("greedy quantifier, backtrack %ld characters (atomlen)", (long) atomlen)); sp = duk__inp_backtrack(re_ctx, &sp, (duk_uint_fast32_t) atomlen); q--; } goto fail; } case DUK_REOP_SAVE: { duk_uint32_t idx; const duk_uint8_t *old; const duk_uint8_t *sub_sp; idx = duk__bc_get_u32(re_ctx, &pc); if (idx >= re_ctx->nsaved) { /* idx is unsigned, < 0 check is not necessary */ DUK_D(DUK_DPRINT("internal error, regexp save index insane: idx=%ld", (long) idx)); goto internal_error; } old = re_ctx->saved[idx]; re_ctx->saved[idx] = sp; sub_sp = duk__match_regexp(re_ctx, pc, sp); if (sub_sp) { sp = sub_sp; goto match; } re_ctx->saved[idx] = old; goto fail; } case DUK_REOP_WIPERANGE: { /* Wipe capture range and save old values for backtracking. * * XXX: this typically happens with a relatively small idx_count. * It might be useful to handle cases where the count is small * (say <= 8) by saving the values in stack instead. This would * reduce memory churn and improve performance, at the cost of a * slightly higher code footprint. */ duk_uint32_t idx_start, idx_count; #if defined(DUK_USE_EXPLICIT_NULL_INIT) duk_uint32_t idx_end, idx; #endif duk_uint8_t **range_save; const duk_uint8_t *sub_sp; idx_start = duk__bc_get_u32(re_ctx, &pc); idx_count = duk__bc_get_u32(re_ctx, &pc); DUK_DDD(DUK_DDDPRINT("wipe saved range: start=%ld, count=%ld -> [%ld,%ld] (captures [%ld,%ld])", (long) idx_start, (long) idx_count, (long) idx_start, (long) (idx_start + idx_count - 1), (long) (idx_start / 2), (long) ((idx_start + idx_count - 1) / 2))); if (idx_start + idx_count > re_ctx->nsaved || idx_count == 0) { /* idx is unsigned, < 0 check is not necessary */ DUK_D(DUK_DPRINT("internal error, regexp wipe indices insane: idx_start=%ld, idx_count=%ld", (long) idx_start, (long) idx_count)); goto internal_error; } DUK_ASSERT(idx_count > 0); duk_require_stack(re_ctx->thr, 1); range_save = (duk_uint8_t **) duk_push_fixed_buffer_nozero(re_ctx->thr, sizeof(duk_uint8_t *) * idx_count); DUK_ASSERT(range_save != NULL); DUK_MEMCPY(range_save, re_ctx->saved + idx_start, sizeof(duk_uint8_t *) * idx_count); #if defined(DUK_USE_EXPLICIT_NULL_INIT) idx_end = idx_start + idx_count; for (idx = idx_start; idx < idx_end; idx++) { re_ctx->saved[idx] = NULL; } #else DUK_MEMZERO((void *) (re_ctx->saved + idx_start), sizeof(duk_uint8_t *) * idx_count); #endif sub_sp = duk__match_regexp(re_ctx, pc, sp); if (sub_sp) { /* match: keep wiped/resaved values */ DUK_DDD(DUK_DDDPRINT("match: keep wiped/resaved values [%ld,%ld] (captures [%ld,%ld])", (long) idx_start, (long) (idx_start + idx_count - 1), (long) (idx_start / 2), (long) ((idx_start + idx_count - 1) / 2))); duk_pop_unsafe(re_ctx->thr); sp = sub_sp; goto match; } /* fail: restore saves */ DUK_DDD(DUK_DDDPRINT("fail: restore wiped/resaved values [%ld,%ld] (captures [%ld,%ld])", (long) idx_start, (long) (idx_start + idx_count - 1), (long) (idx_start / 2), (long) ((idx_start + idx_count - 1) / 2))); DUK_MEMCPY((void *) (re_ctx->saved + idx_start), (const void *) range_save, sizeof(duk_uint8_t *) * idx_count); duk_pop_unsafe(re_ctx->thr); goto fail; } case DUK_REOP_LOOKPOS: case DUK_REOP_LOOKNEG: { /* * Needs a save of multiple saved[] entries depending on what range * may be overwritten. Because the regexp parser does no such analysis, * we currently save the entire saved array here. Lookaheads are thus * a bit expensive. Note that the saved array is not needed for just * the lookahead sub-match, but for the matching of the entire sequel. * * The temporary save buffer is pushed on to the valstack to handle * errors correctly. Each lookahead causes a C recursion and pushes * more stuff on the value stack. If the C recursion limit is less * than the value stack slack, there is no need to check the stack. * We do so regardless, just in case. */ duk_int32_t skip; duk_uint8_t **full_save; const duk_uint8_t *sub_sp; DUK_ASSERT(re_ctx->nsaved > 0); duk_require_stack(re_ctx->thr, 1); full_save = (duk_uint8_t **) duk_push_fixed_buffer_nozero(re_ctx->thr, sizeof(duk_uint8_t *) * re_ctx->nsaved); DUK_ASSERT(full_save != NULL); DUK_MEMCPY(full_save, re_ctx->saved, sizeof(duk_uint8_t *) * re_ctx->nsaved); skip = duk__bc_get_i32(re_ctx, &pc); sub_sp = duk__match_regexp(re_ctx, pc, sp); if (op == DUK_REOP_LOOKPOS) { if (!sub_sp) { goto lookahead_fail; } } else { if (sub_sp) { goto lookahead_fail; } } sub_sp = duk__match_regexp(re_ctx, pc + skip, sp); if (sub_sp) { /* match: keep saves */ duk_pop_unsafe(re_ctx->thr); sp = sub_sp; goto match; } /* fall through */ lookahead_fail: /* fail: restore saves */ DUK_MEMCPY((void *) re_ctx->saved, (const void *) full_save, sizeof(duk_uint8_t *) * re_ctx->nsaved); duk_pop_unsafe(re_ctx->thr); goto fail; } case DUK_REOP_BACKREFERENCE: { /* * Byte matching for back-references would be OK in case- * sensitive matching. In case-insensitive matching we need * to canonicalize characters, so back-reference matching needs * to be done with codepoints instead. So, we just decode * everything normally here, too. * * Note: back-reference index which is 0 or higher than * NCapturingParens (= number of capturing parens in the * -entire- regexp) is a compile time error. However, a * backreference referring to a valid capture which has * not matched anything always succeeds! See E5 Section * 15.10.2.9, step 5, sub-step 3. */ duk_uint32_t idx; const duk_uint8_t *p; idx = duk__bc_get_u32(re_ctx, &pc); idx = idx << 1; /* backref n -> saved indices [n*2, n*2+1] */ if (idx < 2 || idx + 1 >= re_ctx->nsaved) { /* regexp compiler should catch these */ DUK_D(DUK_DPRINT("internal error, backreference index insane")); goto internal_error; } if (!re_ctx->saved[idx] || !re_ctx->saved[idx+1]) { /* capture is 'undefined', always matches! */ DUK_DDD(DUK_DDDPRINT("backreference: saved[%ld,%ld] not complete, always match", (long) idx, (long) (idx + 1))); break; } DUK_DDD(DUK_DDDPRINT("backreference: match saved[%ld,%ld]", (long) idx, (long) (idx + 1))); p = re_ctx->saved[idx]; while (p < re_ctx->saved[idx+1]) { duk_codepoint_t c1, c2; /* Note: not necessary to check p against re_ctx->input_end: * the memory access is checked by duk__inp_get_cp(), while * valid compiled regexps cannot write a saved[] entry * which points to outside the string. */ c1 = duk__inp_get_cp(re_ctx, &p); DUK_ASSERT(c1 >= 0); c2 = duk__inp_get_cp(re_ctx, &sp); /* No need for an explicit c2 < 0 check: because c1 >= 0, * the comparison will always fail if c2 < 0. */ #if 0 if (c2 < 0) { goto fail; } #endif if (c1 != c2) { goto fail; } } break; } default: { DUK_D(DUK_DPRINT("internal error, regexp opcode error: %ld", (long) op)); goto internal_error; } } } match: re_ctx->recursion_depth--; return sp; fail: re_ctx->recursion_depth--; return NULL; internal_error: DUK_ERROR_INTERNAL(re_ctx->thr); return NULL; /* never here */ } /* * Exposed matcher function which provides the semantics of RegExp.prototype.exec(). * * RegExp.prototype.test() has the same semantics as exec() but does not return the * result object (which contains the matching string and capture groups). Currently * there is no separate test() helper, so a temporary result object is created and * discarded if test() is needed. This is intentional, to save code space. * * Input stack: [ ... re_obj input ] * Output stack: [ ... result ] */ DUK_LOCAL void duk__regexp_match_helper(duk_hthread *thr, duk_small_int_t force_global) { duk_re_matcher_ctx re_ctx; duk_hobject *h_regexp; duk_hstring *h_bytecode; duk_hstring *h_input; duk_uint8_t *p_buf; const duk_uint8_t *pc; const duk_uint8_t *sp; duk_small_int_t match = 0; duk_small_int_t global; duk_uint_fast32_t i; double d; duk_uint32_t char_offset; DUK_ASSERT(thr != NULL); DUK_DD(DUK_DDPRINT("regexp match: regexp=%!T, input=%!T", (duk_tval *) duk_get_tval(thr, -2), (duk_tval *) duk_get_tval(thr, -1))); /* * Regexp instance check, bytecode check, input coercion. * * See E5 Section 15.10.6. */ /* TypeError if wrong; class check, see E5 Section 15.10.6 */ h_regexp = duk_require_hobject_with_class(thr, -2, DUK_HOBJECT_CLASS_REGEXP); DUK_ASSERT(h_regexp != NULL); DUK_ASSERT(DUK_HOBJECT_GET_CLASS_NUMBER(h_regexp) == DUK_HOBJECT_CLASS_REGEXP); DUK_UNREF(h_regexp); h_input = duk_to_hstring(thr, -1); DUK_ASSERT(h_input != NULL); duk_get_prop_stridx_short(thr, -2, DUK_STRIDX_INT_BYTECODE); /* [ ... re_obj input ] -> [ ... re_obj input bc ] */ h_bytecode = duk_require_hstring(thr, -1); /* no regexp instance should exist without a non-configurable bytecode property */ DUK_ASSERT(h_bytecode != NULL); /* * Basic context initialization. * * Some init values are read from the bytecode header * whose format is (UTF-8 codepoints): * * uint flags * uint nsaved (even, 2n+2 where n = num captures) */ /* [ ... re_obj input bc ] */ DUK_MEMZERO(&re_ctx, sizeof(re_ctx)); re_ctx.thr = thr; re_ctx.input = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_input); re_ctx.input_end = re_ctx.input + DUK_HSTRING_GET_BYTELEN(h_input); re_ctx.bytecode = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_bytecode); re_ctx.bytecode_end = re_ctx.bytecode + DUK_HSTRING_GET_BYTELEN(h_bytecode); re_ctx.saved = NULL; re_ctx.recursion_limit = DUK_USE_REGEXP_EXECUTOR_RECLIMIT; re_ctx.steps_limit = DUK_RE_EXECUTE_STEPS_LIMIT; /* read header */ pc = re_ctx.bytecode; re_ctx.re_flags = duk__bc_get_u32(&re_ctx, &pc); re_ctx.nsaved = duk__bc_get_u32(&re_ctx, &pc); re_ctx.bytecode = pc; DUK_ASSERT(DUK_RE_FLAG_GLOBAL < 0x10000UL); /* must fit into duk_small_int_t */ global = (duk_small_int_t) (force_global | (duk_small_int_t) (re_ctx.re_flags & DUK_RE_FLAG_GLOBAL)); DUK_ASSERT(re_ctx.nsaved >= 2); DUK_ASSERT((re_ctx.nsaved % 2) == 0); p_buf = (duk_uint8_t *) duk_push_fixed_buffer(thr, sizeof(duk_uint8_t *) * re_ctx.nsaved); /* rely on zeroing */ DUK_UNREF(p_buf); re_ctx.saved = (const duk_uint8_t **) duk_get_buffer(thr, -1, NULL); DUK_ASSERT(re_ctx.saved != NULL); /* [ ... re_obj input bc saved_buf ] */ #if defined(DUK_USE_EXPLICIT_NULL_INIT) for (i = 0; i < re_ctx.nsaved; i++) { re_ctx.saved[i] = (duk_uint8_t *) NULL; } #elif defined(DUK_USE_ZERO_BUFFER_DATA) /* buffer is automatically zeroed */ #else DUK_MEMZERO((void *) p_buf, sizeof(duk_uint8_t *) * re_ctx.nsaved); #endif DUK_DDD(DUK_DDDPRINT("regexp ctx initialized, flags=0x%08lx, nsaved=%ld, recursion_limit=%ld, steps_limit=%ld", (unsigned long) re_ctx.re_flags, (long) re_ctx.nsaved, (long) re_ctx.recursion_limit, (long) re_ctx.steps_limit)); /* * Get starting character offset for match, and initialize 'sp' based on it. * * Note: lastIndex is non-configurable so it must be present (we check the * internal class of the object above, so we know it is). User code can set * its value to an arbitrary (garbage) value though; E5 requires that lastIndex * be coerced to a number before using. The code below works even if the * property is missing: the value will then be coerced to zero. * * Note: lastIndex may be outside Uint32 range even after ToInteger() coercion. * For instance, ToInteger(+Infinity) = +Infinity. We track the match offset * as an integer, but pre-check it to be inside the 32-bit range before the loop. * If not, the check in E5 Section 15.10.6.2, step 9.a applies. */ /* XXX: lastIndex handling produces a lot of asm */ /* [ ... re_obj input bc saved_buf ] */ duk_get_prop_stridx_short(thr, -4, DUK_STRIDX_LAST_INDEX); /* -> [ ... re_obj input bc saved_buf lastIndex ] */ (void) duk_to_int(thr, -1); /* ToInteger(lastIndex) */ d = duk_get_number(thr, -1); /* integer, but may be +/- Infinite, +/- zero (not NaN, though) */ duk_pop_nodecref_unsafe(thr); if (global) { if (d < 0.0 || d > (double) DUK_HSTRING_GET_CHARLEN(h_input)) { /* match fail */ char_offset = 0; /* not really necessary */ DUK_ASSERT(match == 0); goto match_over; } char_offset = (duk_uint32_t) d; } else { /* lastIndex must be ignored for non-global regexps, but get the * value for (theoretical) side effects. No side effects can * really occur, because lastIndex is a normal property and is * always non-configurable for RegExp instances. */ char_offset = (duk_uint32_t) 0; } DUK_ASSERT(char_offset <= DUK_HSTRING_GET_CHARLEN(h_input)); sp = re_ctx.input + duk_heap_strcache_offset_char2byte(thr, h_input, char_offset); /* * Match loop. * * Try matching at different offsets until match found or input exhausted. */ /* [ ... re_obj input bc saved_buf ] */ DUK_ASSERT(match == 0); for (;;) { /* char offset in [0, h_input->clen] (both ends inclusive), checked before entry */ DUK_ASSERT_DISABLE(char_offset >= 0); DUK_ASSERT(char_offset <= DUK_HSTRING_GET_CHARLEN(h_input)); /* Note: re_ctx.steps is intentionally not reset, it applies to the entire unanchored match */ DUK_ASSERT(re_ctx.recursion_depth == 0); DUK_DDD(DUK_DDDPRINT("attempt match at char offset %ld; %p [%p,%p]", (long) char_offset, (const void *) sp, (const void *) re_ctx.input, (const void *) re_ctx.input_end)); /* * Note: * * - duk__match_regexp() is required not to longjmp() in ordinary "non-match" * conditions; a longjmp() will terminate the entire matching process. * * - Clearing saved[] is not necessary because backtracking does it * * - Backtracking also rewinds re_ctx.recursion back to zero, unless an * internal/limit error occurs (which causes a longjmp()) * * - If we supported anchored matches, we would break out here * unconditionally; however, Ecmascript regexps don't have anchored * matches. It might make sense to implement a fast bail-out if * the regexp begins with '^' and sp is not 0: currently we'll just * run through the entire input string, trivially failing the match * at every non-zero offset. */ if (duk__match_regexp(&re_ctx, re_ctx.bytecode, sp) != NULL) { DUK_DDD(DUK_DDDPRINT("match at offset %ld", (long) char_offset)); match = 1; break; } /* advance by one character (code point) and one char_offset */ char_offset++; if (char_offset > DUK_HSTRING_GET_CHARLEN(h_input)) { /* * Note: * * - Intentionally attempt (empty) match at char_offset == k_input->clen * * - Negative char_offsets have been eliminated and char_offset is duk_uint32_t * -> no need or use for a negative check */ DUK_DDD(DUK_DDDPRINT("no match after trying all sp offsets")); break; } /* avoid calling at end of input, will DUK_ERROR (above check suffices to avoid this) */ (void) duk__utf8_advance(thr, &sp, re_ctx.input, re_ctx.input_end, (duk_uint_fast32_t) 1); } match_over: /* * Matching complete, create result array or return a 'null'. Update lastIndex * if necessary. See E5 Section 15.10.6.2. * * Because lastIndex is a character (not byte) offset, we need the character * length of the match which we conveniently get as a side effect of interning * the matching substring (0th index of result array). * * saved[0] start pointer (~ byte offset) of current match * saved[1] end pointer (~ byte offset) of current match (exclusive) * char_offset start character offset of current match (-> .index of result) * char_end_offset end character offset (computed below) */ /* [ ... re_obj input bc saved_buf ] */ if (match) { #if defined(DUK_USE_ASSERTIONS) duk_hobject *h_res; #endif duk_uint32_t char_end_offset = 0; DUK_DDD(DUK_DDDPRINT("regexp matches at char_offset %ld", (long) char_offset)); DUK_ASSERT(re_ctx.nsaved >= 2); /* must have start and end */ DUK_ASSERT((re_ctx.nsaved % 2) == 0); /* and even number */ /* XXX: Array size is known before and (2 * re_ctx.nsaved) but not taken * advantage of now. The array is not compacted either, as regexp match * objects are usually short lived. */ duk_push_array(thr); #if defined(DUK_USE_ASSERTIONS) h_res = duk_require_hobject(thr, -1); DUK_ASSERT(DUK_HOBJECT_HAS_EXTENSIBLE(h_res)); DUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_ARRAY(h_res)); DUK_ASSERT(DUK_HOBJECT_GET_CLASS_NUMBER(h_res) == DUK_HOBJECT_CLASS_ARRAY); #endif /* [ ... re_obj input bc saved_buf res_obj ] */ duk_push_u32(thr, char_offset); duk_xdef_prop_stridx_short_wec(thr, -2, DUK_STRIDX_INDEX); duk_dup_m4(thr); duk_xdef_prop_stridx_short_wec(thr, -2, DUK_STRIDX_INPUT); for (i = 0; i < re_ctx.nsaved; i += 2) { /* Captures which are undefined have NULL pointers and are returned * as 'undefined'. The same is done when saved[] pointers are insane * (this should, of course, never happen in practice). */ if (re_ctx.saved[i] && re_ctx.saved[i + 1] && re_ctx.saved[i + 1] >= re_ctx.saved[i]) { duk_push_lstring(thr, (const char *) re_ctx.saved[i], (duk_size_t) (re_ctx.saved[i+1] - re_ctx.saved[i])); if (i == 0) { /* Assumes that saved[0] and saved[1] are always * set by regexp bytecode (if not, char_end_offset * will be zero). Also assumes clen reflects the * correct char length. */ char_end_offset = char_offset + (duk_uint32_t) duk_get_length(thr, -1); /* add charlen */ } } else { duk_push_undefined(thr); } /* [ ... re_obj input bc saved_buf res_obj val ] */ duk_put_prop_index(thr, -2, (duk_uarridx_t) (i / 2)); } /* [ ... re_obj input bc saved_buf res_obj ] */ /* NB: 'length' property is automatically updated by the array setup loop */ if (global) { /* global regexp: lastIndex updated on match */ duk_push_u32(thr, char_end_offset); duk_put_prop_stridx_short(thr, -6, DUK_STRIDX_LAST_INDEX); } else { /* non-global regexp: lastIndex never updated on match */ ; } } else { /* * No match, E5 Section 15.10.6.2, step 9.a.i - 9.a.ii apply, regardless * of 'global' flag of the RegExp. In particular, if lastIndex is invalid * initially, it is reset to zero. */ DUK_DDD(DUK_DDDPRINT("regexp does not match")); duk_push_null(thr); /* [ ... re_obj input bc saved_buf res_obj ] */ duk_push_int(thr, 0); duk_put_prop_stridx_short(thr, -6, DUK_STRIDX_LAST_INDEX); } /* [ ... re_obj input bc saved_buf res_obj ] */ duk_insert(thr, -5); /* [ ... res_obj re_obj input bc saved_buf ] */ duk_pop_n_unsafe(thr, 4); /* [ ... res_obj ] */ /* XXX: these last tricks are unnecessary if the function is made * a genuine native function. */ } DUK_INTERNAL void duk_regexp_match(duk_hthread *thr) { duk__regexp_match_helper(thr, 0 /*force_global*/); } /* This variant is needed by String.prototype.split(); it needs to perform * global-style matching on a cloned RegExp which is potentially non-global. */ DUK_INTERNAL void duk_regexp_match_force_global(duk_hthread *thr) { duk__regexp_match_helper(thr, 1 /*force_global*/); } #else /* DUK_USE_REGEXP_SUPPORT */ /* regexp support disabled */ #endif /* DUK_USE_REGEXP_SUPPORT */ #line 1 "duk_selftest.c" /* * Self tests to ensure execution environment is sane. Intended to catch * compiler/platform problems which cannot be detected at compile time. */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_SELF_TESTS) /* * Unions and structs for self tests */ typedef union { double d; duk_uint8_t x[8]; } duk__test_double_union; /* Self test failed. Expects a local variable 'error_count' to exist. */ #define DUK__FAILED(msg) do { \ DUK_D(DUK_DPRINT("self test failed: " #msg " at " DUK_FILE_MACRO ":" DUK_MACRO_STRINGIFY(DUK_LINE_MACRO))); \ error_count++; \ } while (0) #define DUK__DBLUNION_CMP_TRUE(a,b) do { \ if (DUK_MEMCMP((const void *) (a), (const void *) (b), sizeof(duk__test_double_union)) != 0) { \ DUK__FAILED("double union compares false (expected true)"); \ } \ } while (0) #define DUK__DBLUNION_CMP_FALSE(a,b) do { \ if (DUK_MEMCMP((const void *) (a), (const void *) (b), sizeof(duk__test_double_union)) == 0) { \ DUK__FAILED("double union compares true (expected false)"); \ } \ } while (0) typedef union { duk_uint32_t i; duk_uint8_t x[8]; } duk__test_u32_union; #if defined(DUK_USE_INTEGER_LE) #define DUK__U32_INIT(u, a, b, c, d) do { \ (u)->x[0] = (d); (u)->x[1] = (c); (u)->x[2] = (b); (u)->x[3] = (a); \ } while (0) #elif defined(DUK_USE_INTEGER_ME) #error integer mixed endian not supported now #elif defined(DUK_USE_INTEGER_BE) #define DUK__U32_INIT(u, a, b, c, d) do { \ (u)->x[0] = (a); (u)->x[1] = (b); (u)->x[2] = (c); (u)->x[3] = (d); \ } while (0) #else #error unknown integer endianness #endif #if defined(DUK_USE_DOUBLE_LE) #define DUK__DOUBLE_INIT(u, a, b, c, d, e, f, g, h) do { \ (u)->x[0] = (h); (u)->x[1] = (g); (u)->x[2] = (f); (u)->x[3] = (e); \ (u)->x[4] = (d); (u)->x[5] = (c); (u)->x[6] = (b); (u)->x[7] = (a); \ } while (0) #define DUK__DOUBLE_COMPARE(u, a, b, c, d, e, f, g, h) \ ((u)->x[0] == (h) && (u)->x[1] == (g) && (u)->x[2] == (f) && (u)->x[3] == (e) && \ (u)->x[4] == (d) && (u)->x[5] == (c) && (u)->x[6] == (b) && (u)->x[7] == (a)) #elif defined(DUK_USE_DOUBLE_ME) #define DUK__DOUBLE_INIT(u, a, b, c, d, e, f, g, h) do { \ (u)->x[0] = (d); (u)->x[1] = (c); (u)->x[2] = (b); (u)->x[3] = (a); \ (u)->x[4] = (h); (u)->x[5] = (g); (u)->x[6] = (f); (u)->x[7] = (e); \ } while (0) #define DUK__DOUBLE_COMPARE(u, a, b, c, d, e, f, g, h) \ ((u)->x[0] == (d) && (u)->x[1] == (c) && (u)->x[2] == (b) && (u)->x[3] == (a) && \ (u)->x[4] == (h) && (u)->x[5] == (g) && (u)->x[6] == (f) && (u)->x[7] == (e)) #elif defined(DUK_USE_DOUBLE_BE) #define DUK__DOUBLE_INIT(u, a, b, c, d, e, f, g, h) do { \ (u)->x[0] = (a); (u)->x[1] = (b); (u)->x[2] = (c); (u)->x[3] = (d); \ (u)->x[4] = (e); (u)->x[5] = (f); (u)->x[6] = (g); (u)->x[7] = (h); \ } while (0) #define DUK__DOUBLE_COMPARE(u, a, b, c, d, e, f, g, h) \ ((u)->x[0] == (a) && (u)->x[1] == (b) && (u)->x[2] == (c) && (u)->x[3] == (d) && \ (u)->x[4] == (e) && (u)->x[5] == (f) && (u)->x[6] == (g) && (u)->x[7] == (h)) #else #error unknown double endianness #endif /* * Various sanity checks for typing */ DUK_LOCAL duk_uint_t duk__selftest_types(void) { duk_uint_t error_count = 0; if (!(sizeof(duk_int8_t) == 1 && sizeof(duk_uint8_t) == 1 && sizeof(duk_int16_t) == 2 && sizeof(duk_uint16_t) == 2 && sizeof(duk_int32_t) == 4 && sizeof(duk_uint32_t) == 4)) { DUK__FAILED("duk_(u)int{8,16,32}_t size"); } #if defined(DUK_USE_64BIT_OPS) if (!(sizeof(duk_int64_t) == 8 && sizeof(duk_uint64_t) == 8)) { DUK__FAILED("duk_(u)int64_t size"); } #endif if (!(sizeof(duk_size_t) >= sizeof(duk_uint_t))) { /* Some internal code now assumes that all duk_uint_t values * can be expressed with a duk_size_t. */ DUK__FAILED("duk_size_t is smaller than duk_uint_t"); } if (!(sizeof(duk_int_t) >= 4)) { DUK__FAILED("duk_int_t is not 32 bits"); } return error_count; } /* * Packed tval sanity */ DUK_LOCAL duk_uint_t duk__selftest_packed_tval(void) { duk_uint_t error_count = 0; #if defined(DUK_USE_PACKED_TVAL) if (sizeof(void *) > 4) { DUK__FAILED("packed duk_tval in use but sizeof(void *) > 4"); } #endif return error_count; } /* * Two's complement arithmetic. */ DUK_LOCAL duk_uint_t duk__selftest_twos_complement(void) { duk_uint_t error_count = 0; volatile int test; test = -1; /* Note that byte order doesn't affect this test: all bytes in * 'test' will be 0xFF for two's complement. */ if (((volatile duk_uint8_t *) &test)[0] != (duk_uint8_t) 0xff) { DUK__FAILED("two's complement arithmetic"); } return error_count; } /* * Byte order. Important to self check, because on some exotic platforms * there is no actual detection but rather assumption based on platform * defines. */ DUK_LOCAL duk_uint_t duk__selftest_byte_order(void) { duk_uint_t error_count = 0; duk__test_u32_union u1; duk__test_double_union u2; /* * >>> struct.pack('>d', 102030405060).encode('hex') * '4237c17c6dc40000' */ DUK__U32_INIT(&u1, 0xde, 0xad, 0xbe, 0xef); DUK__DOUBLE_INIT(&u2, 0x42, 0x37, 0xc1, 0x7c, 0x6d, 0xc4, 0x00, 0x00); if (u1.i != (duk_uint32_t) 0xdeadbeefUL) { DUK__FAILED("duk_uint32_t byte order"); } if (u2.d != (double) 102030405060.0) { DUK__FAILED("double byte order"); } return error_count; } /* * DUK_BSWAP macros */ DUK_LOCAL duk_uint_t duk__selftest_bswap_macros(void) { duk_uint_t error_count = 0; duk_uint32_t x32; duk_uint16_t x16; duk_double_union du; duk_double_t du_diff; x16 = 0xbeefUL; x16 = DUK_BSWAP16(x16); if (x16 != (duk_uint16_t) 0xefbeUL) { DUK__FAILED("DUK_BSWAP16"); } x32 = 0xdeadbeefUL; x32 = DUK_BSWAP32(x32); if (x32 != (duk_uint32_t) 0xefbeaddeUL) { DUK__FAILED("DUK_BSWAP32"); } /* >>> struct.unpack('>d', '4000112233445566'.decode('hex')) * (2.008366013071895,) */ du.uc[0] = 0x40; du.uc[1] = 0x00; du.uc[2] = 0x11; du.uc[3] = 0x22; du.uc[4] = 0x33; du.uc[5] = 0x44; du.uc[6] = 0x55; du.uc[7] = 0x66; DUK_DBLUNION_DOUBLE_NTOH(&du); du_diff = du.d - 2.008366013071895; #if 0 DUK_D(DUK_DPRINT("du_diff: %lg\n", (double) du_diff)); #endif if (du_diff > 1e-15) { /* Allow very small lenience because some compilers won't parse * exact IEEE double constants (happened in matrix testing with * Linux gcc-4.8 -m32 at least). */ #if 0 DUK_D(DUK_DPRINT("Result of DUK_DBLUNION_DOUBLE_NTOH: %02x %02x %02x %02x %02x %02x %02x %02x\n", (unsigned int) du.uc[0], (unsigned int) du.uc[1], (unsigned int) du.uc[2], (unsigned int) du.uc[3], (unsigned int) du.uc[4], (unsigned int) du.uc[5], (unsigned int) du.uc[6], (unsigned int) du.uc[7])); #endif DUK__FAILED("DUK_DBLUNION_DOUBLE_NTOH"); } return error_count; } /* * Basic double / byte union memory layout. */ DUK_LOCAL duk_uint_t duk__selftest_double_union_size(void) { duk_uint_t error_count = 0; if (sizeof(duk__test_double_union) != 8) { DUK__FAILED("invalid union size"); } return error_count; } /* * Union aliasing, see misc/clang_aliasing.c. */ DUK_LOCAL duk_uint_t duk__selftest_double_aliasing(void) { /* This testcase fails when Emscripten-generated code runs on Firefox. * It's not an issue because the failure should only affect packed * duk_tval representation, which is not used with Emscripten. */ #if defined(DUK_USE_PACKED_TVAL) duk_uint_t error_count = 0; duk__test_double_union a, b; /* Test signaling NaN and alias assignment in all endianness combinations. */ /* little endian */ a.x[0] = 0x11; a.x[1] = 0x22; a.x[2] = 0x33; a.x[3] = 0x44; a.x[4] = 0x00; a.x[5] = 0x00; a.x[6] = 0xf1; a.x[7] = 0xff; b = a; DUK__DBLUNION_CMP_TRUE(&a, &b); /* big endian */ a.x[0] = 0xff; a.x[1] = 0xf1; a.x[2] = 0x00; a.x[3] = 0x00; a.x[4] = 0x44; a.x[5] = 0x33; a.x[6] = 0x22; a.x[7] = 0x11; b = a; DUK__DBLUNION_CMP_TRUE(&a, &b); /* mixed endian */ a.x[0] = 0x00; a.x[1] = 0x00; a.x[2] = 0xf1; a.x[3] = 0xff; a.x[4] = 0x11; a.x[5] = 0x22; a.x[6] = 0x33; a.x[7] = 0x44; b = a; DUK__DBLUNION_CMP_TRUE(&a, &b); return error_count; #else DUK_D(DUK_DPRINT("skip double aliasing self test when duk_tval is not packed")); return 0; #endif } /* * Zero sign, see misc/tcc_zerosign2.c. */ DUK_LOCAL duk_uint_t duk__selftest_double_zero_sign(void) { duk_uint_t error_count = 0; duk__test_double_union a, b; a.d = 0.0; b.d = -a.d; DUK__DBLUNION_CMP_FALSE(&a, &b); return error_count; } /* * Rounding mode: Duktape assumes round-to-nearest, check that this is true. * If we had C99 fenv.h we could check that fegetround() == FE_TONEAREST, * but we don't want to rely on that header; and even if we did, it's good * to ensure the rounding actually works. */ DUK_LOCAL duk_uint_t duk__selftest_double_rounding(void) { duk_uint_t error_count = 0; duk__test_double_union a, b, c; #if 0 /* Include <fenv.h> and test manually; these trigger failures: */ fesetround(FE_UPWARD); fesetround(FE_DOWNWARD); fesetround(FE_TOWARDZERO); /* This is the default and passes. */ fesetround(FE_TONEAREST); #endif /* Rounding tests check that none of the other modes (round to * +Inf, round to -Inf, round to zero) can be active: * http://www.gnu.org/software/libc/manual/html_node/Rounding.html */ /* 1.0 + 2^(-53): result is midway between 1.0 and 1.0 + ulp. * Round to nearest: 1.0 * Round to +Inf: 1.0 + ulp * Round to -Inf: 1.0 * Round to zero: 1.0 * => Correct result eliminates round to +Inf. */ DUK__DOUBLE_INIT(&a, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); DUK__DOUBLE_INIT(&b, 0x3c, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); DUK_MEMSET((void *) &c, 0, sizeof(c)); c.d = a.d + b.d; if (!DUK__DOUBLE_COMPARE(&c, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)) { DUK_D(DUK_DPRINT("broken result (native endiannesss): %02x %02x %02x %02x %02x %02x %02x %02x", (unsigned int) c.x[0], (unsigned int) c.x[1], (unsigned int) c.x[2], (unsigned int) c.x[3], (unsigned int) c.x[4], (unsigned int) c.x[5], (unsigned int) c.x[6], (unsigned int) c.x[7])); DUK__FAILED("invalid result from 1.0 + 0.5ulp"); } /* (1.0 + ulp) + 2^(-53): result is midway between 1.0 + ulp and 1.0 + 2*ulp. * Round to nearest: 1.0 + 2*ulp (round to even mantissa) * Round to +Inf: 1.0 + 2*ulp * Round to -Inf: 1.0 + ulp * Round to zero: 1.0 + ulp * => Correct result eliminates round to -Inf and round to zero. */ DUK__DOUBLE_INIT(&a, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01); DUK__DOUBLE_INIT(&b, 0x3c, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); DUK_MEMSET((void *) &c, 0, sizeof(c)); c.d = a.d + b.d; if (!DUK__DOUBLE_COMPARE(&c, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02)) { DUK_D(DUK_DPRINT("broken result (native endiannesss): %02x %02x %02x %02x %02x %02x %02x %02x", (unsigned int) c.x[0], (unsigned int) c.x[1], (unsigned int) c.x[2], (unsigned int) c.x[3], (unsigned int) c.x[4], (unsigned int) c.x[5], (unsigned int) c.x[6], (unsigned int) c.x[7])); DUK__FAILED("invalid result from (1.0 + ulp) + 0.5ulp"); } /* Could do negative number testing too, but the tests above should * differentiate between IEEE 754 rounding modes. */ return error_count; } /* * fmod(): often a portability issue in embedded or bare platform targets. * Check for at least minimally correct behavior. Unlike some other math * functions (like cos()) Duktape relies on fmod() internally too. */ DUK_LOCAL duk_uint_t duk__selftest_fmod(void) { duk_uint_t error_count = 0; duk__test_double_union u1, u2; volatile duk_double_t t1, t2, t3; /* fmod() with integer argument and exponent 2^32 is used by e.g. * ToUint32() and some Duktape internals. */ u1.d = DUK_FMOD(10.0, 4294967296.0); u2.d = 10.0; DUK__DBLUNION_CMP_TRUE(&u1, &u2); u1.d = DUK_FMOD(4294967306.0, 4294967296.0); u2.d = 10.0; DUK__DBLUNION_CMP_TRUE(&u1, &u2); u1.d = DUK_FMOD(73014444042.0, 4294967296.0); u2.d = 10.0; DUK__DBLUNION_CMP_TRUE(&u1, &u2); /* 52-bit integer split into two parts: * >>> 0x1fedcba9876543 * 8987183256397123 * >>> float(0x1fedcba9876543) / float(2**53) * 0.9977777777777778 */ u1.d = DUK_FMOD(8987183256397123.0, 4294967296.0); u2.d = (duk_double_t) 0xa9876543UL; DUK__DBLUNION_CMP_TRUE(&u1, &u2); t1 = 8987183256397123.0; t2 = 4294967296.0; t3 = t1 / t2; u1.d = DUK_FLOOR(t3); u2.d = (duk_double_t) 0x1fedcbUL; DUK__DBLUNION_CMP_TRUE(&u1, &u2); /* C99 behavior is for fmod() result sign to mathc argument sign. */ u1.d = DUK_FMOD(-10.0, 4294967296.0); u2.d = -10.0; DUK__DBLUNION_CMP_TRUE(&u1, &u2); u1.d = DUK_FMOD(-4294967306.0, 4294967296.0); u2.d = -10.0; DUK__DBLUNION_CMP_TRUE(&u1, &u2); u1.d = DUK_FMOD(-73014444042.0, 4294967296.0); u2.d = -10.0; DUK__DBLUNION_CMP_TRUE(&u1, &u2); return error_count; } /* * Struct size/alignment if platform requires it * * There are some compiler specific struct padding pragmas etc in use, this * selftest ensures they're correctly detected and used. */ DUK_LOCAL duk_uint_t duk__selftest_struct_align(void) { duk_uint_t error_count = 0; #if (DUK_USE_ALIGN_BY == 4) if ((sizeof(duk_hbuffer_fixed) % 4) != 0) { DUK__FAILED("sizeof(duk_hbuffer_fixed) not aligned to 4"); } #elif (DUK_USE_ALIGN_BY == 8) if ((sizeof(duk_hbuffer_fixed) % 8) != 0) { DUK__FAILED("sizeof(duk_hbuffer_fixed) not aligned to 8"); } #elif (DUK_USE_ALIGN_BY == 1) /* no check */ #else #error invalid DUK_USE_ALIGN_BY #endif return error_count; } /* * 64-bit arithmetic * * There are some platforms/compilers where 64-bit types are available * but don't work correctly. Test for known cases. */ DUK_LOCAL duk_uint_t duk__selftest_64bit_arithmetic(void) { duk_uint_t error_count = 0; #if defined(DUK_USE_64BIT_OPS) volatile duk_int64_t i; volatile duk_double_t d; /* Catch a double-to-int64 cast issue encountered in practice. */ d = 2147483648.0; i = (duk_int64_t) d; if (i != DUK_I64_CONSTANT(0x80000000)) { DUK__FAILED("casting 2147483648.0 to duk_int64_t failed"); } #else /* nop */ #endif return error_count; } /* * Casting */ DUK_LOCAL duk_uint_t duk__selftest_cast_double_to_small_uint(void) { /* * https://github.com/svaarala/duktape/issues/127#issuecomment-77863473 */ duk_uint_t error_count = 0; duk_double_t d1, d2; duk_small_uint_t u; duk_double_t d1v, d2v; duk_small_uint_t uv; /* Test without volatiles */ d1 = 1.0; u = (duk_small_uint_t) d1; d2 = (duk_double_t) u; if (!(d1 == 1.0 && u == 1 && d2 == 1.0 && d1 == d2)) { DUK__FAILED("double to duk_small_uint_t cast failed"); } /* Same test with volatiles */ d1v = 1.0; uv = (duk_small_uint_t) d1v; d2v = (duk_double_t) uv; if (!(d1v == 1.0 && uv == 1 && d2v == 1.0 && d1v == d2v)) { DUK__FAILED("double to duk_small_uint_t cast failed"); } return error_count; } DUK_LOCAL duk_uint_t duk__selftest_cast_double_to_uint32(void) { /* * This test fails on an exotic ARM target; double-to-uint * cast is incorrectly clamped to -signed- int highest value. * * https://github.com/svaarala/duktape/issues/336 */ duk_uint_t error_count = 0; duk_double_t dv; duk_uint32_t uv; dv = 3735928559.0; /* 0xdeadbeef in decimal */ uv = (duk_uint32_t) dv; if (uv != 0xdeadbeefUL) { DUK__FAILED("double to duk_uint32_t cast failed"); } return error_count; } /* * Minimal test of user supplied allocation functions * * - Basic alloc + realloc + free cycle * * - Realloc to significantly larger size to (hopefully) trigger a * relocation and check that relocation copying works */ DUK_LOCAL duk_uint_t duk__selftest_alloc_funcs(duk_alloc_function alloc_func, duk_realloc_function realloc_func, duk_free_function free_func, void *udata) { duk_uint_t error_count = 0; void *ptr; void *new_ptr; duk_small_int_t i, j; unsigned char x; if (alloc_func == NULL || realloc_func == NULL || free_func == NULL) { return 0; } for (i = 1; i <= 256; i++) { ptr = alloc_func(udata, (duk_size_t) i); if (ptr == NULL) { DUK_D(DUK_DPRINT("alloc failed, ignore")); continue; /* alloc failed, ignore */ } for (j = 0; j < i; j++) { ((unsigned char *) ptr)[j] = (unsigned char) (0x80 + j); } new_ptr = realloc_func(udata, ptr, 1024); if (new_ptr == NULL) { DUK_D(DUK_DPRINT("realloc failed, ignore")); free_func(udata, ptr); continue; /* realloc failed, ignore */ } ptr = new_ptr; for (j = 0; j < i; j++) { x = ((unsigned char *) ptr)[j]; if (x != (unsigned char) (0x80 + j)) { DUK_D(DUK_DPRINT("byte at index %ld doesn't match after realloc: %02lx", (long) j, (unsigned long) x)); DUK__FAILED("byte compare after realloc"); break; } } free_func(udata, ptr); } return error_count; } /* * Self test main */ DUK_INTERNAL duk_uint_t duk_selftest_run_tests(duk_alloc_function alloc_func, duk_realloc_function realloc_func, duk_free_function free_func, void *udata) { duk_uint_t error_count = 0; DUK_D(DUK_DPRINT("self test starting")); error_count += duk__selftest_types(); error_count += duk__selftest_packed_tval(); error_count += duk__selftest_twos_complement(); error_count += duk__selftest_byte_order(); error_count += duk__selftest_bswap_macros(); error_count += duk__selftest_double_union_size(); error_count += duk__selftest_double_aliasing(); error_count += duk__selftest_double_zero_sign(); error_count += duk__selftest_double_rounding(); error_count += duk__selftest_fmod(); error_count += duk__selftest_struct_align(); error_count += duk__selftest_64bit_arithmetic(); error_count += duk__selftest_cast_double_to_small_uint(); error_count += duk__selftest_cast_double_to_uint32(); error_count += duk__selftest_alloc_funcs(alloc_func, realloc_func, free_func, udata); DUK_D(DUK_DPRINT("self test complete, total error count: %ld", (long) error_count)); return error_count; } #endif /* DUK_USE_SELF_TESTS */ /* automatic undefs */ #undef DUK__DBLUNION_CMP_FALSE #undef DUK__DBLUNION_CMP_TRUE #undef DUK__DOUBLE_COMPARE #undef DUK__DOUBLE_INIT #undef DUK__FAILED #undef DUK__U32_INIT /* #include duk_internal.h -> already included */ #line 2 "duk_tval.c" #if defined(DUK_USE_FASTINT) /* * Manually optimized double-to-fastint downgrade check. * * This check has a large impact on performance, especially for fastint * slow paths, so must be changed carefully. The code should probably be * optimized for the case where the result does not fit into a fastint, * to minimize the penalty for "slow path code" dealing with fractions etc. * * At least on one tested soft float ARM platform double-to-int64 coercion * is very slow (and sometimes produces incorrect results, see self tests). * This algorithm combines a fastint compatibility check and extracting the * integer value from an IEEE double for setting the tagged fastint. For * other platforms a more naive approach might be better. * * See doc/fastint.rst for details. */ DUK_INTERNAL DUK_ALWAYS_INLINE void duk_tval_set_number_chkfast_fast(duk_tval *tv, duk_double_t x) { duk_double_union du; duk_int64_t i; duk_small_int_t expt; duk_small_int_t shift; /* XXX: optimize for packed duk_tval directly? */ du.d = x; i = (duk_int64_t) DUK_DBLUNION_GET_INT64(&du); expt = (duk_small_int_t) ((i >> 52) & 0x07ff); shift = expt - 1023; if (shift >= 0 && shift <= 46) { /* exponents 1023 to 1069 */ duk_int64_t t; if (((DUK_I64_CONSTANT(0x000fffffffffffff) >> shift) & i) == 0) { t = i | DUK_I64_CONSTANT(0x0010000000000000); /* implicit leading one */ t = t & DUK_I64_CONSTANT(0x001fffffffffffff); t = t >> (52 - shift); if (i < 0) { t = -t; } DUK_TVAL_SET_FASTINT(tv, t); return; } } else if (shift == -1023) { /* exponent 0 */ if (i >= 0 && (i & DUK_I64_CONSTANT(0x000fffffffffffff)) == 0) { /* Note: reject negative zero. */ DUK_TVAL_SET_FASTINT(tv, (duk_int64_t) 0); return; } } else if (shift == 47) { /* exponent 1070 */ if (i < 0 && (i & DUK_I64_CONSTANT(0x000fffffffffffff)) == 0) { DUK_TVAL_SET_FASTINT(tv, (duk_int64_t) DUK_FASTINT_MIN); return; } } DUK_TVAL_SET_DOUBLE(tv, x); return; } DUK_INTERNAL DUK_NOINLINE void duk_tval_set_number_chkfast_slow(duk_tval *tv, duk_double_t x) { duk_tval_set_number_chkfast_fast(tv, x); } /* * Manually optimized number-to-double conversion */ #if defined(DUK_USE_FASTINT) && defined(DUK_USE_PACKED_TVAL) DUK_INTERNAL DUK_ALWAYS_INLINE duk_double_t duk_tval_get_number_packed(duk_tval *tv) { duk_double_union du; duk_uint64_t t; t = (duk_uint64_t) DUK_DBLUNION_GET_UINT64(tv); if ((t >> 48) != DUK_TAG_FASTINT) { return tv->d; } else if (t & DUK_U64_CONSTANT(0x0000800000000000)) { t = (duk_uint64_t) (-((duk_int64_t) t)); /* avoid unary minus on unsigned */ t = t & DUK_U64_CONSTANT(0x0000ffffffffffff); /* negative */ t |= DUK_U64_CONSTANT(0xc330000000000000); DUK_DBLUNION_SET_UINT64(&du, t); return du.d + 4503599627370496.0; /* 1 << 52 */ } else if (t != 0) { t &= DUK_U64_CONSTANT(0x0000ffffffffffff); /* positive */ t |= DUK_U64_CONSTANT(0x4330000000000000); DUK_DBLUNION_SET_UINT64(&du, t); return du.d - 4503599627370496.0; /* 1 << 52 */ } else { return 0.0; /* zero */ } } #endif /* DUK_USE_FASTINT && DUK_USE_PACKED_TVAL */ #if 0 /* unused */ #if defined(DUK_USE_FASTINT) && !defined(DUK_USE_PACKED_TVAL) DUK_INTERNAL DUK_ALWAYS_INLINE duk_double_t duk_tval_get_number_unpacked(duk_tval *tv) { duk_double_union du; duk_uint64_t t; DUK_ASSERT(tv->t == DUK_TAG_NUMBER || tv->t == DUK_TAG_FASTINT); if (tv->t == DUK_TAG_FASTINT) { if (tv->v.fi >= 0) { t = DUK_U64_CONSTANT(0x4330000000000000) | (duk_uint64_t) tv->v.fi; DUK_DBLUNION_SET_UINT64(&du, t); return du.d - 4503599627370496.0; /* 1 << 52 */ } else { t = DUK_U64_CONSTANT(0xc330000000000000) | (duk_uint64_t) (-tv->v.fi); DUK_DBLUNION_SET_UINT64(&du, t); return du.d + 4503599627370496.0; /* 1 << 52 */ } } else { return tv->v.d; } } #endif /* DUK_USE_FASTINT && DUK_USE_PACKED_TVAL */ #endif /* 0 */ #if defined(DUK_USE_FASTINT) && !defined(DUK_USE_PACKED_TVAL) DUK_INTERNAL DUK_ALWAYS_INLINE duk_double_t duk_tval_get_number_unpacked_fastint(duk_tval *tv) { duk_double_union du; duk_uint64_t t; DUK_ASSERT(tv->t == DUK_TAG_FASTINT); if (tv->v.fi >= 0) { t = DUK_U64_CONSTANT(0x4330000000000000) | (duk_uint64_t) tv->v.fi; DUK_DBLUNION_SET_UINT64(&du, t); return du.d - 4503599627370496.0; /* 1 << 52 */ } else { t = DUK_U64_CONSTANT(0xc330000000000000) | (duk_uint64_t) (-tv->v.fi); DUK_DBLUNION_SET_UINT64(&du, t); return du.d + 4503599627370496.0; /* 1 << 52 */ } } #endif /* DUK_USE_FASTINT && DUK_USE_PACKED_TVAL */ #endif /* DUK_USE_FASTINT */ #line 1 "duk_unicode_tables.c" /* * Unicode support tables automatically generated during build. */ /* #include duk_internal.h -> already included */ /* * Unicode tables containing ranges of Unicode characters in a * packed format. These tables are used to match non-ASCII * characters of complex productions by resorting to a linear * range-by-range comparison. This is very slow, but is expected * to be very rare in practical Ecmascript source code, and thus * compactness is most important. * * The tables are matched using uni_range_match() and the format * is described in tools/extract_chars.py. */ #if defined(DUK_USE_SOURCE_NONBMP) /* IdentifierStart production with ASCII excluded */ /* duk_unicode_ids_noa[] */ /* * Automatically generated by extract_chars.py, do not edit! */ const duk_uint8_t duk_unicode_ids_noa[1036] = { 249,176,176,80,111,7,47,15,47,254,11,197,191,0,72,2,15,115,66,19,50,7,2,34, 2,240,66,244,50,247,185,249,98,241,99,8,241,127,58,240,182,47,31,241,191, 21,18,245,50,15,1,24,27,35,15,2,2,240,239,15,244,156,15,10,241,26,21,6,240, 101,10,4,15,9,240,159,57,240,82,127,56,242,100,15,4,8,159,1,240,5,115,19, 240,98,98,4,52,15,2,14,18,47,0,31,5,85,19,240,98,98,18,18,31,17,50,15,5,47, 2,130,34,240,98,98,18,68,15,4,15,1,31,9,12,115,19,240,98,98,18,68,15,16,18, 47,1,15,3,2,84,34,52,18,2,20,20,36,191,8,15,38,114,34,240,114,240,4,15,12, 38,31,16,5,114,34,240,114,146,68,15,18,2,31,1,31,4,114,34,241,147,15,2,6, 41,47,10,86,240,36,240,130,130,3,111,44,242,2,29,111,44,18,3,18,3,7,50,98, 34,2,3,18,50,26,3,66,15,7,63,18,15,49,114,241,79,13,79,101,241,191,6,15,2, 85,52,4,24,37,205,15,3,241,98,6,3,241,178,255,224,63,35,54,32,35,63,25,35, 63,17,35,54,32,35,62,47,41,35,63,51,241,127,0,240,47,70,53,79,254,21,227, 240,18,240,166,243,180,168,194,63,0,240,47,0,240,47,0,194,47,1,242,79,21,5, 15,53,244,137,67,241,34,6,243,107,240,255,35,240,227,76,241,197,240,175,40, 240,122,242,95,68,15,79,241,255,3,111,41,240,238,27,241,207,12,241,79,27, 43,241,67,143,82,50,52,26,251,15,50,255,224,8,53,63,22,53,55,32,32,32,47, 15,63,37,38,32,66,38,67,53,92,98,38,246,96,224,240,44,245,112,80,57,32,68, 112,32,32,35,42,51,100,80,240,63,25,255,233,107,241,242,241,242,247,87,52, 29,241,98,6,3,242,136,15,2,240,122,98,98,98,98,98,98,98,111,66,15,254,12, 146,240,184,132,52,95,70,114,47,74,35,111,25,79,78,240,63,11,242,127,0,255, 224,244,255,240,0,138,143,60,255,240,4,12,143,28,255,227,127,243,95,30,63, 253,79,0,177,240,111,31,240,47,15,63,64,241,152,63,87,63,20,39,243,26,34, 35,47,7,240,255,36,240,15,34,243,5,64,32,223,12,191,7,240,191,13,143,31, 240,224,240,36,41,180,47,25,240,146,39,240,111,7,64,79,34,32,65,52,48,32, 240,162,58,130,213,53,53,166,38,47,27,41,191,99,240,255,255,0,26,150,223,7, 95,33,255,240,0,255,143,254,6,3,245,175,24,109,70,2,146,194,66,2,18,18,245, 207,19,255,224,93,240,79,48,63,38,241,171,246,100,47,119,241,111,10,127,10, 207,73,69,53,53,50,241,91,47,10,47,3,33,46,61,241,79,107,243,127,37,255, 223,13,79,33,242,31,16,240,47,11,111,22,191,14,63,20,87,36,241,207,142,240, 79,20,95,20,95,24,159,36,248,239,254,2,154,240,107,127,138,83,2,241,194,20, 3,240,123,240,122,240,255,51,240,50,27,240,107,240,175,56,242,135,31,50,15, 1,50,34,240,191,30,240,212,240,223,21,114,240,207,13,242,107,240,107,240, 62,240,47,96,243,159,41,242,62,242,63,254,32,79,37,243,223,29,241,47,9,240, 207,20,241,191,19,64,223,32,240,3,240,112,32,241,95,2,47,9,244,102,32,35, 46,41,143,31,241,135,49,63,6,38,33,36,64,240,64,212,249,15,37,240,67,242, 127,32,240,97,32,250,175,31,241,179,241,111,32,240,96,242,223,27,244,127, 10,255,224,122,243,15,17,15,254,11,79,41,255,152,47,21,240,48,242,63,14, 255,226,100,255,226,140,245,143,95,240,63,180,255,233,176,255,227,33,255, 238,197,255,225,57,255,240,1,10,223,254,18,184,240,255,99,240,239,4,242,15, 2,63,17,240,86,240,63,254,38,79,53,192,243,76,243,32,241,31,255,0,6,223, 240,95,254,30,95,255,0,20,1,31,254,175,47,91,108,72,137,255,240,0,101,175, 69,47,55,33,48,49,51,43,32,38,47,49,35,55,38,47,12,35,36,32,70,47,254,4,99, 240,146,240,146,240,242,240,146,240,242,240,146,240,242,240,146,240,242, 240,146,127,254,242,143,181,242,223,52,255,227,176,50,240,178,18,3,2,146, 50,2,7,5,2,2,2,34,18,3,2,2,2,2,2,18,3,50,98,50,50,2,146,240,22,34,66,240, 31,255,0,0,56,255,240,9,92,159,27,255,239,39,207,206,63,255,0,5,116,255, 240,1,133,47,254,17,0, }; #else /* IdentifierStart production with ASCII and non-BMP excluded */ /* duk_unicode_ids_noabmp[] */ /* * Automatically generated by extract_chars.py, do not edit! */ const duk_uint8_t duk_unicode_ids_noabmp[625] = { 249,176,176,80,111,7,47,15,47,254,11,197,191,0,72,2,15,115,66,19,50,7,2,34, 2,240,66,244,50,247,185,249,98,241,99,8,241,127,58,240,182,47,31,241,191, 21,18,245,50,15,1,24,27,35,15,2,2,240,239,15,244,156,15,10,241,26,21,6,240, 101,10,4,15,9,240,159,57,240,82,127,56,242,100,15,4,8,159,1,240,5,115,19, 240,98,98,4,52,15,2,14,18,47,0,31,5,85,19,240,98,98,18,18,31,17,50,15,5,47, 2,130,34,240,98,98,18,68,15,4,15,1,31,9,12,115,19,240,98,98,18,68,15,16,18, 47,1,15,3,2,84,34,52,18,2,20,20,36,191,8,15,38,114,34,240,114,240,4,15,12, 38,31,16,5,114,34,240,114,146,68,15,18,2,31,1,31,4,114,34,241,147,15,2,6, 41,47,10,86,240,36,240,130,130,3,111,44,242,2,29,111,44,18,3,18,3,7,50,98, 34,2,3,18,50,26,3,66,15,7,63,18,15,49,114,241,79,13,79,101,241,191,6,15,2, 85,52,4,24,37,205,15,3,241,98,6,3,241,178,255,224,63,35,54,32,35,63,25,35, 63,17,35,54,32,35,62,47,41,35,63,51,241,127,0,240,47,70,53,79,254,21,227, 240,18,240,166,243,180,168,194,63,0,240,47,0,240,47,0,194,47,1,242,79,21,5, 15,53,244,137,67,241,34,6,243,107,240,255,35,240,227,76,241,197,240,175,40, 240,122,242,95,68,15,79,241,255,3,111,41,240,238,27,241,207,12,241,79,27, 43,241,67,143,82,50,52,26,251,15,50,255,224,8,53,63,22,53,55,32,32,32,47, 15,63,37,38,32,66,38,67,53,92,98,38,246,96,224,240,44,245,112,80,57,32,68, 112,32,32,35,42,51,100,80,240,63,25,255,233,107,241,242,241,242,247,87,52, 29,241,98,6,3,242,136,15,2,240,122,98,98,98,98,98,98,98,111,66,15,254,12, 146,240,184,132,52,95,70,114,47,74,35,111,25,79,78,240,63,11,242,127,0,255, 224,244,255,240,0,138,143,60,255,240,4,12,143,28,255,227,127,243,95,30,63, 253,79,0,177,240,111,31,240,47,15,63,64,241,152,63,87,63,20,39,243,26,34, 35,47,7,240,255,36,240,15,34,243,5,64,32,223,12,191,7,240,191,13,143,31, 240,224,240,36,41,180,47,25,240,146,39,240,111,7,64,79,34,32,65,52,48,32, 240,162,58,130,213,53,53,166,38,47,27,41,191,99,240,255,255,0,26,150,223,7, 95,33,255,240,0,255,143,254,6,3,245,175,24,109,70,2,146,194,66,2,18,18,245, 207,19,255,224,93,240,79,48,63,38,241,171,246,100,47,119,241,111,10,127,10, 207,73,69,53,53,50,0, }; #endif #if defined(DUK_USE_SOURCE_NONBMP) /* IdentifierStart production with Letter and ASCII excluded */ /* duk_unicode_ids_m_let_noa[] */ /* * Automatically generated by extract_chars.py, do not edit! */ const duk_uint8_t duk_unicode_ids_m_let_noa[42] = { 255,240,0,94,18,255,233,99,241,51,63,254,215,32,240,184,240,2,255,240,6,89, 249,255,240,4,148,79,37,255,224,192,9,15,120,79,255,0,15,30,245,240, }; #else /* IdentifierStart production with Letter, ASCII, and non-BMP excluded */ /* duk_unicode_ids_m_let_noabmp[] */ /* * Automatically generated by extract_chars.py, do not edit! */ const duk_uint8_t duk_unicode_ids_m_let_noabmp[24] = { 255,240,0,94,18,255,233,99,241,51,63,254,215,32,240,184,240,2,255,240,6,89, 249,0, }; #endif #if defined(DUK_USE_SOURCE_NONBMP) /* IdentifierPart production with IdentifierStart and ASCII excluded */ /* duk_unicode_idp_m_ids_noa[] */ /* * Automatically generated by extract_chars.py, do not edit! */ const duk_uint8_t duk_unicode_idp_m_ids_noa[530] = { 255,225,243,246,15,254,0,116,255,191,29,32,33,33,32,243,170,242,47,15,112, 245,118,53,49,35,57,240,144,241,15,11,244,218,240,25,241,56,241,67,40,34, 36,241,210,246,173,47,17,242,130,47,2,38,177,57,240,50,242,160,38,49,50, 160,177,57,240,50,242,160,36,81,50,64,240,107,64,194,242,160,39,34,34,240, 97,57,240,50,242,160,38,49,50,145,177,57,240,64,242,212,66,35,160,240,9, 240,35,242,198,34,35,129,193,57,240,50,242,160,38,34,35,129,193,57,240,50, 242,198,34,35,160,177,57,240,65,243,128,85,32,39,121,49,242,240,54,215,41, 244,144,53,33,197,57,243,1,121,192,32,32,81,242,63,4,33,106,47,20,160,245, 111,4,41,211,82,34,54,67,235,46,255,225,179,47,254,42,98,240,242,240,241, 241,1,243,47,16,160,57,241,50,57,245,209,241,64,246,139,91,185,247,41,242, 244,242,185,47,13,58,121,240,141,243,68,242,31,1,201,240,56,210,241,12,57, 241,237,242,47,4,153,121,246,130,47,5,80,82,65,251,143,38,100,255,225,0,31, 35,31,5,15,109,197,4,191,254,175,34,247,240,245,47,16,255,225,30,95,91,31, 255,0,100,121,159,55,5,159,18,31,66,31,254,0,64,64,80,240,148,244,161,242, 79,2,185,127,2,240,9,240,231,240,188,241,227,242,29,240,25,192,185,242,29, 208,145,57,241,50,242,64,34,49,97,32,241,180,97,253,231,33,57,255,240,3, 225,128,255,225,213,240,15,2,240,4,31,10,47,178,159,23,15,254,27,16,253,64, 248,116,255,224,25,159,254,68,178,33,99,241,162,80,249,113,255,228,13,47, 39,239,17,159,1,63,31,175,39,151,47,22,210,159,37,13,47,34,218,36,159,68, 183,15,146,182,151,63,42,2,99,19,42,11,19,100,79,178,240,42,159,72,240,77, 159,199,99,143,13,31,68,240,31,1,159,67,201,159,69,229,159,254,9,169,255, 226,57,114,127,2,159,42,240,98,223,255,0,60,157,159,120,79,45,111,11,159, 254,46,191,30,240,35,255,240,3,191,225,255,240,0,59,164,69,151,54,241,3, 248,98,255,228,125,242,47,254,15,79,39,95,34,144,240,0,240,132,46,255,228, 68,98,240,19,98,18,79,254,121,150,245,246,105,255,240,192,105,175,224,0, }; #else /* IdentifierPart production with IdentifierStart, ASCII, and non-BMP excluded */ /* duk_unicode_idp_m_ids_noabmp[] */ /* * Automatically generated by extract_chars.py, do not edit! */ const duk_uint8_t duk_unicode_idp_m_ids_noabmp[357] = { 255,225,243,246,15,254,0,116,255,191,29,32,33,33,32,243,170,242,47,15,112, 245,118,53,49,35,57,240,144,241,15,11,244,218,240,25,241,56,241,67,40,34, 36,241,210,246,173,47,17,242,130,47,2,38,177,57,240,50,242,160,38,49,50, 160,177,57,240,50,242,160,36,81,50,64,240,107,64,194,242,160,39,34,34,240, 97,57,240,50,242,160,38,49,50,145,177,57,240,64,242,212,66,35,160,240,9, 240,35,242,198,34,35,129,193,57,240,50,242,160,38,34,35,129,193,57,240,50, 242,198,34,35,160,177,57,240,65,243,128,85,32,39,121,49,242,240,54,215,41, 244,144,53,33,197,57,243,1,121,192,32,32,81,242,63,4,33,106,47,20,160,245, 111,4,41,211,82,34,54,67,235,46,255,225,179,47,254,42,98,240,242,240,241, 241,1,243,47,16,160,57,241,50,57,245,209,241,64,246,139,91,185,247,41,242, 244,242,185,47,13,58,121,240,141,243,68,242,31,1,201,240,56,210,241,12,57, 241,237,242,47,4,153,121,246,130,47,5,80,82,65,251,143,38,100,255,225,0,31, 35,31,5,15,109,197,4,191,254,175,34,247,240,245,47,16,255,225,30,95,91,31, 255,0,100,121,159,55,5,159,18,31,66,31,254,0,64,64,80,240,148,244,161,242, 79,2,185,127,2,240,9,240,231,240,188,241,227,242,29,240,25,192,185,242,29, 208,145,57,241,50,242,64,34,49,97,32,241,180,97,253,231,33,57,255,240,3, 225,128,255,225,213,240,15,2,240,4,31,10,47,178,159,23,0, }; #endif /* * Case conversion tables generated using tools/extract_caseconv.py. */ /* duk_unicode_caseconv_uc[] */ /* duk_unicode_caseconv_lc[] */ /* * Automatically generated by extract_caseconv.py, do not edit! */ const duk_uint8_t duk_unicode_caseconv_uc[1386] = { 144,3,128,3,0,184,7,192,6,192,112,35,242,199,224,64,74,192,49,32,128,162, 128,108,65,1,189,129,254,131,3,173,3,136,6,7,98,7,34,68,15,12,14,140,72,30, 104,28,112,32,67,0,65,4,0,138,0,128,4,1,88,65,76,83,9,252,9,248,6,28,131,4, 33,4,62,0,62,16,32,124,64,124,96,48,249,0,249,64,129,243,1,243,129,3,232,3, 233,1,135,216,7,218,4,15,184,15,221,2,31,114,31,200,8,62,236,63,180,8,125, 224,127,224,16,251,208,255,80,33,247,193,255,160,67,246,3,247,0,135,244,7, 246,1,15,240,15,244,2,33,112,33,96,32,73,160,73,108,104,176,192,176,1,121, 104,0,133,2,106,183,1,58,10,31,232,63,228,38,162,1,1,1,0,48,2,102,2,100,12, 4,232,4,228,64,10,88,10,81,112,23,160,23,144,96,48,96,48,64,128,104,64,104, 1,128,218,0,217,130,1,206,1,205,16,3,190,3,188,36,7,228,7,224,160,17,24,17, 16,144,36,112,36,96,160,110,32,110,0,128,246,64,246,6,2,48,130,48,17,4,139, 4,138,54,9,132,9,130,28,19,68,19,65,128,240,8,240,4,177,234,17,234,6,3,234, 35,235,33,11,26,11,25,193,150,64,150,64,50,44,236,44,235,5,76,131,76,128, 94,154,6,154,0,117,57,29,57,16,122,115,58,115,35,244,239,84,239,32,169,223, 233,223,130,211,200,211,200,2,167,151,167,150,21,79,107,79,104,8,112,26, 208,26,192,64,56,160,56,128,192,113,128,113,1,128,249,0,248,130,2,128,1, 166,4,7,240,7,238,8,177,204,177,200,16,96,49,0,48,224,128,110,64,110,1,1, 51,83,213,2,0,48,35,192,35,176,64,77,32,50,192,139,73,196,49,193,127,48,2, 212,14,112,3,252,5,224,4,196,1,36,5,252,1,76,6,0,9,12,6,72,6,68,6,84,7,216, 6,100,6,96,6,104,8,244,6,120,8,128,6,160,6,156,6,252,7,220,7,116,6,56,7, 204,7,196,9,64,177,188,9,68,177,180,9,72,177,192,9,76,6,4,9,80,6,24,9,100, 6,60,9,108,6,64,9,114,158,172,9,128,6,76,9,134,158,176,9,140,6,80,9,150, 158,52,9,160,6,92,9,172,177,136,9,178,158,180,9,196,177,184,9,200,6,116,9, 212,6,124,9,244,177,144,10,30,158,196,10,32,6,184,10,36,9,16,10,48,9,20,10, 72,6,220,10,118,158,200,10,122,158,192,13,20,14,100,13,220,13,216,14,176, 14,24,15,8,14,140,15,48,14,48,15,64,14,72,15,68,14,96,15,84,14,152,15,88, 14,128,15,92,15,60,15,192,14,104,15,196,14,132,15,200,15,228,15,204,13,252, 15,212,14,84,19,60,19,0,114,0,16,72,114,4,16,80,114,8,16,120,114,20,16,136, 114,24,16,168,114,28,17,136,114,34,153,40,117,230,157,244,117,244,177,140, 122,108,121,128,126,248,14,100,127,148,127,176,133,56,132,200,134,16,134, 12,177,132,177,128,177,148,8,232,177,152,8,248,179,204,179,202,158,50,158, 46,173,78,158,207,48,6,252,0,166,0,166,2,147,1,94,0,39,0,248,64,9,64,97, 128,114,24,28,200,24,64,24,8,29,134,7,74,6,16,6,2,11,15,2,154,130,169,15, 75,64,9,0,102,35,210,240,2,160,24,64,244,196,0,174,6,20,61,51,0,44,129,133, 15,77,64,8,32,87,195,234,16,29,40,24,152,250,150,7,74,6,38,6,0,62,169,129, 210,129,137,129,128,143,171,96,116,160,98,96,104,67,240,16,248,64,28,200, 252,12,62,18,7,50,63,5,15,133,1,204,143,193,195,225,96,115,35,240,144,248, 96,28,200,252,44,62,26,7,50,63,13,15,135,1,204,143,195,195,225,224,115,35, 241,16,248,64,28,200,252,76,62,18,7,50,63,21,15,133,1,204,143,197,195,225, 96,115,35,241,144,248,96,28,200,252,108,62,26,7,50,63,29,15,135,1,204,143, 199,195,225,224,115,35,242,16,249,64,28,200,252,140,62,82,7,50,63,37,15, 149,1,204,143,201,195,229,96,115,35,242,144,249,96,28,200,252,172,62,90,7, 50,63,45,15,151,1,204,143,203,195,229,224,115,35,243,16,249,64,28,200,252, 204,62,82,7,50,63,53,15,149,1,204,143,205,195,229,96,115,35,243,144,249,96, 28,200,252,236,62,90,7,50,63,61,15,151,1,204,143,207,195,229,224,115,35, 244,16,251,64,28,200,253,12,62,210,7,50,63,69,15,181,1,204,143,209,195,237, 96,115,35,244,144,251,96,28,200,253,44,62,218,7,50,63,77,15,183,1,204,143, 211,195,237,224,115,35,245,16,251,64,28,200,253,76,62,210,7,50,63,85,15, 181,1,204,143,213,195,237,96,115,35,245,144,251,96,28,200,253,108,62,218,7, 50,63,93,15,183,1,204,143,215,195,237,224,115,35,246,80,253,208,28,200,253, 156,7,34,7,50,63,105,1,195,1,204,143,219,64,114,32,104,67,246,248,28,136, 26,16,28,200,253,228,7,34,7,50,63,133,15,229,1,204,143,225,192,114,224,115, 35,248,144,28,72,28,200,254,52,7,46,6,132,63,143,129,203,129,161,1,204,143, 230,64,114,224,115,35,250,88,28,200,24,64,24,0,254,158,7,50,6,16,6,2,63, 173,1,204,129,161,15,235,224,115,32,97,0,104,67,252,88,29,40,24,64,24,0, 255,30,7,74,6,16,6,2,63,201,1,208,129,137,143,243,64,116,160,104,67,252, 248,29,40,24,64,26,16,255,148,63,244,7,50,63,231,1,212,129,204,143,250,64, 113,224,115,35,254,208,29,72,26,16,255,190,7,82,6,132,7,50,63,249,1,212, 129,204,253,128,64,8,192,8,223,96,48,2,48,2,79,216,20,0,140,0,153,246,7, 128,35,0,35,0,36,253,130,96,8,192,8,192,9,159,96,176,2,152,2,167,216,52,0, 166,0,169,246,39,2,162,2,163,125,138,64,168,128,166,191,98,176,42,32,41, 223,216,180,10,156,10,141,246,47,2,162,2,158,128, }; const duk_uint8_t duk_unicode_caseconv_lc[680] = { 152,3,0,3,128,184,6,192,7,192,112,24,144,37,96,64,54,32,81,64,128,226,0, 235,65,129,199,1,230,130,3,145,3,177,34,7,70,7,134,36,15,244,13,236,24,32, 0,34,129,0,65,0,67,4,0,166,32,172,41,132,40,11,64,19,9,208,85,184,80,19, 240,19,248,12,62,16,62,0,32,124,96,124,64,48,249,64,249,0,129,243,129,243, 1,3,233,3,232,1,135,218,7,216,4,15,196,15,192,8,31,152,31,144,16,63,80,63, 64,32,126,224,126,192,16,253,208,251,128,33,252,129,247,32,131,251,3,250,0, 135,246,135,221,129,15,244,15,240,2,31,234,31,122,4,63,240,62,240,8,127, 232,125,240,17,11,1,11,129,2,75,98,77,3,69,128,5,134,11,203,31,128,143,193, 127,144,255,160,154,140,4,0,4,4,192,9,144,9,152,48,19,144,19,161,0,41,64, 41,101,192,94,64,94,129,128,193,0,193,130,1,160,1,161,6,3,102,3,104,8,7,44, 7,48,72,14,240,14,248,144,31,32,31,48,64,63,0,63,37,0,136,128,136,196,129, 35,1,35,133,3,112,3,113,4,7,176,7,178,48,17,128,17,132,136,36,80,36,89,176, 76,16,76,32,224,154,0,154,44,7,128,7,128,101,143,80,15,80,176,31,89,31,81, 8,88,206,88,208,12,178,0,178,5,145,103,89,103,96,42,100,10,100,18,244,208, 20,208,35,169,200,169,200,195,211,153,83,153,159,167,121,167,122,5,78,253, 78,254,22,158,66,158,68,21,60,181,60,184,170,123,74,123,80,67,0,211,1,64,2, 1,172,1,173,4,3,136,3,140,12,7,20,7,24,16,31,184,31,192,34,199,34,199,48, 65,128,195,128,196,2,1,184,1,185,5,79,84,4,204,8,0,192,101,128,154,65,1,29, 129,30,2,16,199,45,39,5,251,240,23,128,15,240,24,16,37,48,24,96,37,64,24, 224,29,208,24,240,37,144,25,0,37,176,25,16,25,32,25,48,38,0,25,64,38,48,25, 112,38,128,25,128,25,144,25,208,39,32,25,240,39,80,26,112,26,128,26,224,40, 128,27,112,41,32,31,16,31,48,31,96,25,80,31,112,27,240,34,0,25,224,35,162, 198,80,35,208,25,160,35,226,198,96,36,48,24,0,36,64,40,144,36,80,40,192,55, 96,55,112,55,240,63,48,56,96,58,192,56,192,60,192,60,240,61,112,63,64,59, 128,63,144,63,32,76,0,76,241,233,224,13,241,251,193,251,49,252,193,252,49, 254,193,254,81,255,193,255,50,18,96,60,146,18,160,6,178,18,176,14,82,19,34, 20,226,24,50,24,66,198,2,198,18,198,32,38,178,198,49,215,210,198,64,39,210, 198,208,37,18,198,224,39,18,198,240,37,2,199,0,37,34,207,34,207,58,119,209, 215,154,120,186,120,202,120,208,38,90,122,176,37,202,122,192,38,26,122,208, 38,202,123,0,41,234,123,16,40,122,123,32,41,218,123,58,181,48,32,38,16,3, 72,24,56, }; #if defined(DUK_USE_REGEXP_CANON_WORKAROUND) /* * Automatically generated by extract_caseconv.py, do not edit! */ const duk_uint16_t duk_unicode_re_canon_lookup[65536] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27, 28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52, 53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77, 78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,65,66,67,68,69,70, 71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,123,124,125, 126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161, 162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179, 180,924,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197, 198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215, 216,217,218,219,220,221,222,223,192,193,194,195,196,197,198,199,200,201, 202,203,204,205,206,207,208,209,210,211,212,213,214,247,216,217,218,219, 220,221,222,376,256,256,258,258,260,260,262,262,264,264,266,266,268,268, 270,270,272,272,274,274,276,276,278,278,280,280,282,282,284,284,286,286, 288,288,290,290,292,292,294,294,296,296,298,298,300,300,302,302,304,305, 306,306,308,308,310,310,312,313,313,315,315,317,317,319,319,321,321,323, 323,325,325,327,327,329,330,330,332,332,334,334,336,336,338,338,340,340, 342,342,344,344,346,346,348,348,350,350,352,352,354,354,356,356,358,358, 360,360,362,362,364,364,366,366,368,368,370,370,372,372,374,374,376,377, 377,379,379,381,381,383,579,385,386,386,388,388,390,391,391,393,394,395, 395,397,398,399,400,401,401,403,404,502,406,407,408,408,573,411,412,413, 544,415,416,416,418,418,420,420,422,423,423,425,426,427,428,428,430,431, 431,433,434,435,435,437,437,439,440,440,442,443,444,444,446,503,448,449, 450,451,452,452,452,455,455,455,458,458,458,461,461,463,463,465,465,467, 467,469,469,471,471,473,473,475,475,398,478,478,480,480,482,482,484,484, 486,486,488,488,490,490,492,492,494,494,496,497,497,497,500,500,502,503, 504,504,506,506,508,508,510,510,512,512,514,514,516,516,518,518,520,520, 522,522,524,524,526,526,528,528,530,530,532,532,534,534,536,536,538,538, 540,540,542,542,544,545,546,546,548,548,550,550,552,552,554,554,556,556, 558,558,560,560,562,562,564,565,566,567,568,569,570,571,571,573,574,11390, 11391,577,577,579,580,581,582,582,584,584,586,586,588,588,590,590,11375, 11373,11376,385,390,597,393,394,600,399,602,400,42923L,605,606,607,403, 42924L,610,404,612,42893L,42922L,615,407,406,42926L,11362,42925L,621,622, 412,624,11374,413,627,628,415,630,631,632,633,634,635,636,11364,638,639, 422,641,642,425,644,645,646,42929L,430,580,433,434,581,653,654,655,656,657, 439,659,660,661,662,663,664,665,666,667,668,42930L,42928L,671,672,673,674, 675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692, 693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710, 711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728, 729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746, 747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764, 765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782, 783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800, 801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818, 819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836, 921,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854, 855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872, 873,874,875,876,877,878,879,880,880,882,882,884,885,886,886,888,889,890, 1021,1022,1023,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908, 909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926, 927,928,929,930,931,932,933,934,935,936,937,938,939,902,904,905,906,944, 913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931, 931,932,933,934,935,936,937,938,939,908,910,911,975,914,920,978,979,980, 934,928,975,984,984,986,986,988,988,990,990,992,992,994,994,996,996,998, 998,1000,1000,1002,1002,1004,1004,1006,1006,922,929,1017,895,1012,917,1014, 1015,1015,1017,1018,1018,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029, 1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044, 1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059, 1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1040,1041,1042, 1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057, 1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1024, 1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039, 1120,1120,1122,1122,1124,1124,1126,1126,1128,1128,1130,1130,1132,1132,1134, 1134,1136,1136,1138,1138,1140,1140,1142,1142,1144,1144,1146,1146,1148,1148, 1150,1150,1152,1152,1154,1155,1156,1157,1158,1159,1160,1161,1162,1162,1164, 1164,1166,1166,1168,1168,1170,1170,1172,1172,1174,1174,1176,1176,1178,1178, 1180,1180,1182,1182,1184,1184,1186,1186,1188,1188,1190,1190,1192,1192,1194, 1194,1196,1196,1198,1198,1200,1200,1202,1202,1204,1204,1206,1206,1208,1208, 1210,1210,1212,1212,1214,1214,1216,1217,1217,1219,1219,1221,1221,1223,1223, 1225,1225,1227,1227,1229,1229,1216,1232,1232,1234,1234,1236,1236,1238,1238, 1240,1240,1242,1242,1244,1244,1246,1246,1248,1248,1250,1250,1252,1252,1254, 1254,1256,1256,1258,1258,1260,1260,1262,1262,1264,1264,1266,1266,1268,1268, 1270,1270,1272,1272,1274,1274,1276,1276,1278,1278,1280,1280,1282,1282,1284, 1284,1286,1286,1288,1288,1290,1290,1292,1292,1294,1294,1296,1296,1298,1298, 1300,1300,1302,1302,1304,1304,1306,1306,1308,1308,1310,1310,1312,1312,1314, 1314,1316,1316,1318,1318,1320,1320,1322,1322,1324,1324,1326,1326,1328,1329, 1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344, 1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359, 1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374, 1375,1376,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341, 1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356, 1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1415,1416,1417,1418,1419, 1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434, 1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449, 1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464, 1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479, 1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494, 1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509, 1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524, 1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539, 1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554, 1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569, 1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584, 1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599, 1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614, 1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629, 1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644, 1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659, 1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674, 1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689, 1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704, 1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719, 1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734, 1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749, 1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764, 1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779, 1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794, 1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809, 1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824, 1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839, 1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854, 1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869, 1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884, 1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899, 1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914, 1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929, 1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944, 1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959, 1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974, 1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989, 1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004, 2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019, 2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034, 2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049, 2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064, 2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2076,2077,2078,2079, 2080,2081,2082,2083,2084,2085,2086,2087,2088,2089,2090,2091,2092,2093,2094, 2095,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109, 2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124, 2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139, 2140,2141,2142,2143,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154, 2155,2156,2157,2158,2159,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169, 2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2184, 2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198,2199, 2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2210,2211,2212,2213,2214, 2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229, 2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244, 2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259, 2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274, 2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289, 2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304, 2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319, 2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334, 2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349, 2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364, 2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379, 2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394, 2395,2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2409, 2410,2411,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424, 2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436,2437,2438,2439, 2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453,2454, 2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469, 2470,2471,2472,2473,2474,2475,2476,2477,2478,2479,2480,2481,2482,2483,2484, 2485,2486,2487,2488,2489,2490,2491,2492,2493,2494,2495,2496,2497,2498,2499, 2500,2501,2502,2503,2504,2505,2506,2507,2508,2509,2510,2511,2512,2513,2514, 2515,2516,2517,2518,2519,2520,2521,2522,2523,2524,2525,2526,2527,2528,2529, 2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544, 2545,2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2557,2558,2559, 2560,2561,2562,2563,2564,2565,2566,2567,2568,2569,2570,2571,2572,2573,2574, 2575,2576,2577,2578,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589, 2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2601,2602,2603,2604, 2605,2606,2607,2608,2609,2610,2611,2612,2613,2614,2615,2616,2617,2618,2619, 2620,2621,2622,2623,2624,2625,2626,2627,2628,2629,2630,2631,2632,2633,2634, 2635,2636,2637,2638,2639,2640,2641,2642,2643,2644,2645,2646,2647,2648,2649, 2650,2651,2652,2653,2654,2655,2656,2657,2658,2659,2660,2661,2662,2663,2664, 2665,2666,2667,2668,2669,2670,2671,2672,2673,2674,2675,2676,2677,2678,2679, 2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690,2691,2692,2693,2694, 2695,2696,2697,2698,2699,2700,2701,2702,2703,2704,2705,2706,2707,2708,2709, 2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724, 2725,2726,2727,2728,2729,2730,2731,2732,2733,2734,2735,2736,2737,2738,2739, 2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,2751,2752,2753,2754, 2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,2766,2767,2768,2769, 2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,2780,2781,2782,2783,2784, 2785,2786,2787,2788,2789,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799, 2800,2801,2802,2803,2804,2805,2806,2807,2808,2809,2810,2811,2812,2813,2814, 2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,2825,2826,2827,2828,2829, 2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844, 2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2857,2858,2859, 2860,2861,2862,2863,2864,2865,2866,2867,2868,2869,2870,2871,2872,2873,2874, 2875,2876,2877,2878,2879,2880,2881,2882,2883,2884,2885,2886,2887,2888,2889, 2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,2900,2901,2902,2903,2904, 2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,2916,2917,2918,2919, 2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,2931,2932,2933,2934, 2935,2936,2937,2938,2939,2940,2941,2942,2943,2944,2945,2946,2947,2948,2949, 2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961,2962,2963,2964, 2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976,2977,2978,2979, 2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992,2993,2994, 2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,3009, 3010,3011,3012,3013,3014,3015,3016,3017,3018,3019,3020,3021,3022,3023,3024, 3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,3038,3039, 3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,3051,3052,3053,3054, 3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,3067,3068,3069, 3070,3071,3072,3073,3074,3075,3076,3077,3078,3079,3080,3081,3082,3083,3084, 3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099, 3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3113,3114, 3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129, 3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,3141,3142,3143,3144, 3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156,3157,3158,3159, 3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,3173,3174, 3175,3176,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187,3188,3189, 3190,3191,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201,3202,3203,3204, 3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217,3218,3219, 3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234, 3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,3249, 3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264, 3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,3278,3279, 3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294, 3295,3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309, 3310,3311,3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324, 3325,3326,3327,3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339, 3340,3341,3342,3343,3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354, 3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369, 3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384, 3385,3386,3387,3388,3389,3390,3391,3392,3393,3394,3395,3396,3397,3398,3399, 3400,3401,3402,3403,3404,3405,3406,3407,3408,3409,3410,3411,3412,3413,3414, 3415,3416,3417,3418,3419,3420,3421,3422,3423,3424,3425,3426,3427,3428,3429, 3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3440,3441,3442,3443,3444, 3445,3446,3447,3448,3449,3450,3451,3452,3453,3454,3455,3456,3457,3458,3459, 3460,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474, 3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488,3489, 3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504, 3505,3506,3507,3508,3509,3510,3511,3512,3513,3514,3515,3516,3517,3518,3519, 3520,3521,3522,3523,3524,3525,3526,3527,3528,3529,3530,3531,3532,3533,3534, 3535,3536,3537,3538,3539,3540,3541,3542,3543,3544,3545,3546,3547,3548,3549, 3550,3551,3552,3553,3554,3555,3556,3557,3558,3559,3560,3561,3562,3563,3564, 3565,3566,3567,3568,3569,3570,3571,3572,3573,3574,3575,3576,3577,3578,3579, 3580,3581,3582,3583,3584,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594, 3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609, 3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624, 3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639, 3640,3641,3642,3643,3644,3645,3646,3647,3648,3649,3650,3651,3652,3653,3654, 3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669, 3670,3671,3672,3673,3674,3675,3676,3677,3678,3679,3680,3681,3682,3683,3684, 3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695,3696,3697,3698,3699, 3700,3701,3702,3703,3704,3705,3706,3707,3708,3709,3710,3711,3712,3713,3714, 3715,3716,3717,3718,3719,3720,3721,3722,3723,3724,3725,3726,3727,3728,3729, 3730,3731,3732,3733,3734,3735,3736,3737,3738,3739,3740,3741,3742,3743,3744, 3745,3746,3747,3748,3749,3750,3751,3752,3753,3754,3755,3756,3757,3758,3759, 3760,3761,3762,3763,3764,3765,3766,3767,3768,3769,3770,3771,3772,3773,3774, 3775,3776,3777,3778,3779,3780,3781,3782,3783,3784,3785,3786,3787,3788,3789, 3790,3791,3792,3793,3794,3795,3796,3797,3798,3799,3800,3801,3802,3803,3804, 3805,3806,3807,3808,3809,3810,3811,3812,3813,3814,3815,3816,3817,3818,3819, 3820,3821,3822,3823,3824,3825,3826,3827,3828,3829,3830,3831,3832,3833,3834, 3835,3836,3837,3838,3839,3840,3841,3842,3843,3844,3845,3846,3847,3848,3849, 3850,3851,3852,3853,3854,3855,3856,3857,3858,3859,3860,3861,3862,3863,3864, 3865,3866,3867,3868,3869,3870,3871,3872,3873,3874,3875,3876,3877,3878,3879, 3880,3881,3882,3883,3884,3885,3886,3887,3888,3889,3890,3891,3892,3893,3894, 3895,3896,3897,3898,3899,3900,3901,3902,3903,3904,3905,3906,3907,3908,3909, 3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924, 3925,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939, 3940,3941,3942,3943,3944,3945,3946,3947,3948,3949,3950,3951,3952,3953,3954, 3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,3965,3966,3967,3968,3969, 3970,3971,3972,3973,3974,3975,3976,3977,3978,3979,3980,3981,3982,3983,3984, 3985,3986,3987,3988,3989,3990,3991,3992,3993,3994,3995,3996,3997,3998,3999, 4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4014, 4015,4016,4017,4018,4019,4020,4021,4022,4023,4024,4025,4026,4027,4028,4029, 4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040,4041,4042,4043,4044, 4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055,4056,4057,4058,4059, 4060,4061,4062,4063,4064,4065,4066,4067,4068,4069,4070,4071,4072,4073,4074, 4075,4076,4077,4078,4079,4080,4081,4082,4083,4084,4085,4086,4087,4088,4089, 4090,4091,4092,4093,4094,4095,4096,4097,4098,4099,4100,4101,4102,4103,4104, 4105,4106,4107,4108,4109,4110,4111,4112,4113,4114,4115,4116,4117,4118,4119, 4120,4121,4122,4123,4124,4125,4126,4127,4128,4129,4130,4131,4132,4133,4134, 4135,4136,4137,4138,4139,4140,4141,4142,4143,4144,4145,4146,4147,4148,4149, 4150,4151,4152,4153,4154,4155,4156,4157,4158,4159,4160,4161,4162,4163,4164, 4165,4166,4167,4168,4169,4170,4171,4172,4173,4174,4175,4176,4177,4178,4179, 4180,4181,4182,4183,4184,4185,4186,4187,4188,4189,4190,4191,4192,4193,4194, 4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205,4206,4207,4208,4209, 4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,4220,4221,4222,4223,4224, 4225,4226,4227,4228,4229,4230,4231,4232,4233,4234,4235,4236,4237,4238,4239, 4240,4241,4242,4243,4244,4245,4246,4247,4248,4249,4250,4251,4252,4253,4254, 4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,4266,4267,4268,4269, 4270,4271,4272,4273,4274,4275,4276,4277,4278,4279,4280,4281,4282,4283,4284, 4285,4286,4287,4288,4289,4290,4291,4292,4293,4294,4295,4296,4297,4298,4299, 4300,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310,4311,4312,4313,4314, 4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,4327,4328,4329, 4330,4331,4332,4333,4334,4335,4336,4337,4338,4339,4340,4341,4342,4343,4344, 4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357,4358,4359, 4360,4361,4362,4363,4364,4365,4366,4367,4368,4369,4370,4371,4372,4373,4374, 4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387,4388,4389, 4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403,4404, 4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,4417,4418,4419, 4420,4421,4422,4423,4424,4425,4426,4427,4428,4429,4430,4431,4432,4433,4434, 4435,4436,4437,4438,4439,4440,4441,4442,4443,4444,4445,4446,4447,4448,4449, 4450,4451,4452,4453,4454,4455,4456,4457,4458,4459,4460,4461,4462,4463,4464, 4465,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476,4477,4478,4479, 4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,4490,4491,4492,4493,4494, 4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507,4508,4509, 4510,4511,4512,4513,4514,4515,4516,4517,4518,4519,4520,4521,4522,4523,4524, 4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,4536,4537,4538,4539, 4540,4541,4542,4543,4544,4545,4546,4547,4548,4549,4550,4551,4552,4553,4554, 4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567,4568,4569, 4570,4571,4572,4573,4574,4575,4576,4577,4578,4579,4580,4581,4582,4583,4584, 4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,4596,4597,4598,4599, 4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611,4612,4613,4614, 4615,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626,4627,4628,4629, 4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642,4643,4644, 4645,4646,4647,4648,4649,4650,4651,4652,4653,4654,4655,4656,4657,4658,4659, 4660,4661,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672,4673,4674, 4675,4676,4677,4678,4679,4680,4681,4682,4683,4684,4685,4686,4687,4688,4689, 4690,4691,4692,4693,4694,4695,4696,4697,4698,4699,4700,4701,4702,4703,4704, 4705,4706,4707,4708,4709,4710,4711,4712,4713,4714,4715,4716,4717,4718,4719, 4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731,4732,4733,4734, 4735,4736,4737,4738,4739,4740,4741,4742,4743,4744,4745,4746,4747,4748,4749, 4750,4751,4752,4753,4754,4755,4756,4757,4758,4759,4760,4761,4762,4763,4764, 4765,4766,4767,4768,4769,4770,4771,4772,4773,4774,4775,4776,4777,4778,4779, 4780,4781,4782,4783,4784,4785,4786,4787,4788,4789,4790,4791,4792,4793,4794, 4795,4796,4797,4798,4799,4800,4801,4802,4803,4804,4805,4806,4807,4808,4809, 4810,4811,4812,4813,4814,4815,4816,4817,4818,4819,4820,4821,4822,4823,4824, 4825,4826,4827,4828,4829,4830,4831,4832,4833,4834,4835,4836,4837,4838,4839, 4840,4841,4842,4843,4844,4845,4846,4847,4848,4849,4850,4851,4852,4853,4854, 4855,4856,4857,4858,4859,4860,4861,4862,4863,4864,4865,4866,4867,4868,4869, 4870,4871,4872,4873,4874,4875,4876,4877,4878,4879,4880,4881,4882,4883,4884, 4885,4886,4887,4888,4889,4890,4891,4892,4893,4894,4895,4896,4897,4898,4899, 4900,4901,4902,4903,4904,4905,4906,4907,4908,4909,4910,4911,4912,4913,4914, 4915,4916,4917,4918,4919,4920,4921,4922,4923,4924,4925,4926,4927,4928,4929, 4930,4931,4932,4933,4934,4935,4936,4937,4938,4939,4940,4941,4942,4943,4944, 4945,4946,4947,4948,4949,4950,4951,4952,4953,4954,4955,4956,4957,4958,4959, 4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970,4971,4972,4973,4974, 4975,4976,4977,4978,4979,4980,4981,4982,4983,4984,4985,4986,4987,4988,4989, 4990,4991,4992,4993,4994,4995,4996,4997,4998,4999,5000,5001,5002,5003,5004, 5005,5006,5007,5008,5009,5010,5011,5012,5013,5014,5015,5016,5017,5018,5019, 5020,5021,5022,5023,5024,5025,5026,5027,5028,5029,5030,5031,5032,5033,5034, 5035,5036,5037,5038,5039,5040,5041,5042,5043,5044,5045,5046,5047,5048,5049, 5050,5051,5052,5053,5054,5055,5056,5057,5058,5059,5060,5061,5062,5063,5064, 5065,5066,5067,5068,5069,5070,5071,5072,5073,5074,5075,5076,5077,5078,5079, 5080,5081,5082,5083,5084,5085,5086,5087,5088,5089,5090,5091,5092,5093,5094, 5095,5096,5097,5098,5099,5100,5101,5102,5103,5104,5105,5106,5107,5108,5109, 5110,5111,5104,5105,5106,5107,5108,5109,5118,5119,5120,5121,5122,5123,5124, 5125,5126,5127,5128,5129,5130,5131,5132,5133,5134,5135,5136,5137,5138,5139, 5140,5141,5142,5143,5144,5145,5146,5147,5148,5149,5150,5151,5152,5153,5154, 5155,5156,5157,5158,5159,5160,5161,5162,5163,5164,5165,5166,5167,5168,5169, 5170,5171,5172,5173,5174,5175,5176,5177,5178,5179,5180,5181,5182,5183,5184, 5185,5186,5187,5188,5189,5190,5191,5192,5193,5194,5195,5196,5197,5198,5199, 5200,5201,5202,5203,5204,5205,5206,5207,5208,5209,5210,5211,5212,5213,5214, 5215,5216,5217,5218,5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229, 5230,5231,5232,5233,5234,5235,5236,5237,5238,5239,5240,5241,5242,5243,5244, 5245,5246,5247,5248,5249,5250,5251,5252,5253,5254,5255,5256,5257,5258,5259, 5260,5261,5262,5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274, 5275,5276,5277,5278,5279,5280,5281,5282,5283,5284,5285,5286,5287,5288,5289, 5290,5291,5292,5293,5294,5295,5296,5297,5298,5299,5300,5301,5302,5303,5304, 5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319, 5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,5334, 5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347,5348,5349, 5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364, 5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, 5380,5381,5382,5383,5384,5385,5386,5387,5388,5389,5390,5391,5392,5393,5394, 5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408,5409, 5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, 5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439, 5440,5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454, 5455,5456,5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469, 5470,5471,5472,5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484, 5485,5486,5487,5488,5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499, 5500,5501,5502,5503,5504,5505,5506,5507,5508,5509,5510,5511,5512,5513,5514, 5515,5516,5517,5518,5519,5520,5521,5522,5523,5524,5525,5526,5527,5528,5529, 5530,5531,5532,5533,5534,5535,5536,5537,5538,5539,5540,5541,5542,5543,5544, 5545,5546,5547,5548,5549,5550,5551,5552,5553,5554,5555,5556,5557,5558,5559, 5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570,5571,5572,5573,5574, 5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585,5586,5587,5588,5589, 5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600,5601,5602,5603,5604, 5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616,5617,5618,5619, 5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632,5633,5634, 5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648,5649, 5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, 5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679, 5680,5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694, 5695,5696,5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709, 5710,5711,5712,5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724, 5725,5726,5727,5728,5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739, 5740,5741,5742,5743,5744,5745,5746,5747,5748,5749,5750,5751,5752,5753,5754, 5755,5756,5757,5758,5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,5769, 5770,5771,5772,5773,5774,5775,5776,5777,5778,5779,5780,5781,5782,5783,5784, 5785,5786,5787,5788,5789,5790,5791,5792,5793,5794,5795,5796,5797,5798,5799, 5800,5801,5802,5803,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814, 5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829, 5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844, 5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859, 5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874, 5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888,5889, 5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, 5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919, 5920,5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934, 5935,5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949, 5950,5951,5952,5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964, 5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979, 5980,5981,5982,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993,5994, 5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009, 6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024, 6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039, 6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054, 6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069, 6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084, 6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099, 6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114, 6115,6116,6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129, 6130,6131,6132,6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144, 6145,6146,6147,6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159, 6160,6161,6162,6163,6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174, 6175,6176,6177,6178,6179,6180,6181,6182,6183,6184,6185,6186,6187,6188,6189, 6190,6191,6192,6193,6194,6195,6196,6197,6198,6199,6200,6201,6202,6203,6204, 6205,6206,6207,6208,6209,6210,6211,6212,6213,6214,6215,6216,6217,6218,6219, 6220,6221,6222,6223,6224,6225,6226,6227,6228,6229,6230,6231,6232,6233,6234, 6235,6236,6237,6238,6239,6240,6241,6242,6243,6244,6245,6246,6247,6248,6249, 6250,6251,6252,6253,6254,6255,6256,6257,6258,6259,6260,6261,6262,6263,6264, 6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275,6276,6277,6278,6279, 6280,6281,6282,6283,6284,6285,6286,6287,6288,6289,6290,6291,6292,6293,6294, 6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305,6306,6307,6308,6309, 6310,6311,6312,6313,6314,6315,6316,6317,6318,6319,6320,6321,6322,6323,6324, 6325,6326,6327,6328,6329,6330,6331,6332,6333,6334,6335,6336,6337,6338,6339, 6340,6341,6342,6343,6344,6345,6346,6347,6348,6349,6350,6351,6352,6353,6354, 6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365,6366,6367,6368,6369, 6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381,6382,6383,6384, 6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,6396,6397,6398,6399, 6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411,6412,6413,6414, 6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,6426,6427,6428,6429, 6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443,6444, 6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456,6457,6458,6459, 6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,6473,6474, 6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488,6489, 6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,6504, 6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516,6517,6518,6519, 6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534, 6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549, 6550,6551,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564, 6565,6566,6567,6568,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579, 6580,6581,6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594, 6595,6596,6597,6598,6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609, 6610,6611,6612,6613,6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624, 6625,6626,6627,6628,6629,6630,6631,6632,6633,6634,6635,6636,6637,6638,6639, 6640,6641,6642,6643,6644,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654, 6655,6656,6657,6658,6659,6660,6661,6662,6663,6664,6665,6666,6667,6668,6669, 6670,6671,6672,6673,6674,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684, 6685,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,6698,6699, 6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714, 6715,6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729, 6730,6731,6732,6733,6734,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744, 6745,6746,6747,6748,6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759, 6760,6761,6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774, 6775,6776,6777,6778,6779,6780,6781,6782,6783,6784,6785,6786,6787,6788,6789, 6790,6791,6792,6793,6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804, 6805,6806,6807,6808,6809,6810,6811,6812,6813,6814,6815,6816,6817,6818,6819, 6820,6821,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6834, 6835,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,6847,6848,6849, 6850,6851,6852,6853,6854,6855,6856,6857,6858,6859,6860,6861,6862,6863,6864, 6865,6866,6867,6868,6869,6870,6871,6872,6873,6874,6875,6876,6877,6878,6879, 6880,6881,6882,6883,6884,6885,6886,6887,6888,6889,6890,6891,6892,6893,6894, 6895,6896,6897,6898,6899,6900,6901,6902,6903,6904,6905,6906,6907,6908,6909, 6910,6911,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924, 6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,6935,6936,6937,6938,6939, 6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950,6951,6952,6953,6954, 6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968,6969, 6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984, 6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,6995,6996,6997,6998,6999, 7000,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013,7014, 7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,7028,7029, 7030,7031,7032,7033,7034,7035,7036,7037,7038,7039,7040,7041,7042,7043,7044, 7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059, 7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074, 7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089, 7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104, 7105,7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119, 7120,7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134, 7135,7136,7137,7138,7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149, 7150,7151,7152,7153,7154,7155,7156,7157,7158,7159,7160,7161,7162,7163,7164, 7165,7166,7167,7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179, 7180,7181,7182,7183,7184,7185,7186,7187,7188,7189,7190,7191,7192,7193,7194, 7195,7196,7197,7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209, 7210,7211,7212,7213,7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224, 7225,7226,7227,7228,7229,7230,7231,7232,7233,7234,7235,7236,7237,7238,7239, 7240,7241,7242,7243,7244,7245,7246,7247,7248,7249,7250,7251,7252,7253,7254, 7255,7256,7257,7258,7259,7260,7261,7262,7263,7264,7265,7266,7267,7268,7269, 7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280,7281,7282,7283,7284, 7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,1042,1044,1054,1057, 1058,1058,1066,1122,42570L,7305,7306,7307,7308,7309,7310,7311,7312,7313, 7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327,7328, 7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343, 7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7355,7356,7357,7358, 7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372,7373, 7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388, 7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403, 7404,7405,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418, 7419,7420,7421,7422,7423,7424,7425,7426,7427,7428,7429,7430,7431,7432,7433, 7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447,7448, 7449,7450,7451,7452,7453,7454,7455,7456,7457,7458,7459,7460,7461,7462,7463, 7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,7475,7476,7477,7478, 7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491,7492,7493, 7494,7495,7496,7497,7498,7499,7500,7501,7502,7503,7504,7505,7506,7507,7508, 7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,7522,7523, 7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537,7538, 7539,7540,7541,7542,7543,7544,42877L,7546,7547,7548,11363,7550,7551,7552, 7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, 7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582, 7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597, 7598,7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612, 7613,7614,7615,7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627, 7628,7629,7630,7631,7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642, 7643,7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657, 7658,7659,7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,7671,7672, 7673,7674,7675,7676,7677,7678,7679,7680,7680,7682,7682,7684,7684,7686,7686, 7688,7688,7690,7690,7692,7692,7694,7694,7696,7696,7698,7698,7700,7700,7702, 7702,7704,7704,7706,7706,7708,7708,7710,7710,7712,7712,7714,7714,7716,7716, 7718,7718,7720,7720,7722,7722,7724,7724,7726,7726,7728,7728,7730,7730,7732, 7732,7734,7734,7736,7736,7738,7738,7740,7740,7742,7742,7744,7744,7746,7746, 7748,7748,7750,7750,7752,7752,7754,7754,7756,7756,7758,7758,7760,7760,7762, 7762,7764,7764,7766,7766,7768,7768,7770,7770,7772,7772,7774,7774,7776,7776, 7778,7778,7780,7780,7782,7782,7784,7784,7786,7786,7788,7788,7790,7790,7792, 7792,7794,7794,7796,7796,7798,7798,7800,7800,7802,7802,7804,7804,7806,7806, 7808,7808,7810,7810,7812,7812,7814,7814,7816,7816,7818,7818,7820,7820,7822, 7822,7824,7824,7826,7826,7828,7828,7830,7831,7832,7833,7834,7776,7836,7837, 7838,7839,7840,7840,7842,7842,7844,7844,7846,7846,7848,7848,7850,7850,7852, 7852,7854,7854,7856,7856,7858,7858,7860,7860,7862,7862,7864,7864,7866,7866, 7868,7868,7870,7870,7872,7872,7874,7874,7876,7876,7878,7878,7880,7880,7882, 7882,7884,7884,7886,7886,7888,7888,7890,7890,7892,7892,7894,7894,7896,7896, 7898,7898,7900,7900,7902,7902,7904,7904,7906,7906,7908,7908,7910,7910,7912, 7912,7914,7914,7916,7916,7918,7918,7920,7920,7922,7922,7924,7924,7926,7926, 7928,7928,7930,7930,7932,7932,7934,7934,7944,7945,7946,7947,7948,7949,7950, 7951,7944,7945,7946,7947,7948,7949,7950,7951,7960,7961,7962,7963,7964,7965, 7958,7959,7960,7961,7962,7963,7964,7965,7966,7967,7976,7977,7978,7979,7980, 7981,7982,7983,7976,7977,7978,7979,7980,7981,7982,7983,7992,7993,7994,7995, 7996,7997,7998,7999,7992,7993,7994,7995,7996,7997,7998,7999,8008,8009,8010, 8011,8012,8013,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,8016,8025, 8018,8027,8020,8029,8022,8031,8024,8025,8026,8027,8028,8029,8030,8031,8040, 8041,8042,8043,8044,8045,8046,8047,8040,8041,8042,8043,8044,8045,8046,8047, 8122,8123,8136,8137,8138,8139,8154,8155,8184,8185,8170,8171,8186,8187,8062, 8063,8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077, 8078,8079,8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092, 8093,8094,8095,8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107, 8108,8109,8110,8111,8120,8121,8114,8115,8116,8117,8118,8119,8120,8121,8122, 8123,8124,8125,921,8127,8128,8129,8130,8131,8132,8133,8134,8135,8136,8137, 8138,8139,8140,8141,8142,8143,8152,8153,8146,8147,8148,8149,8150,8151,8152, 8153,8154,8155,8156,8157,8158,8159,8168,8169,8162,8163,8164,8172,8166,8167, 8168,8169,8170,8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181,8182, 8183,8184,8185,8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197, 8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212, 8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227, 8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,8240,8241,8242, 8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,8256,8257, 8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272, 8273,8274,8275,8276,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8287, 8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302, 8303,8304,8305,8306,8307,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317, 8318,8319,8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332, 8333,8334,8335,8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347, 8348,8349,8350,8351,8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362, 8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373,8374,8375,8376,8377, 8378,8379,8380,8381,8382,8383,8384,8385,8386,8387,8388,8389,8390,8391,8392, 8393,8394,8395,8396,8397,8398,8399,8400,8401,8402,8403,8404,8405,8406,8407, 8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421,8422, 8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8433,8434,8435,8436,8437, 8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,8448,8449,8450,8451,8452, 8453,8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467, 8468,8469,8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,8480,8481,8482, 8483,8484,8485,8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,8496,8497, 8498,8499,8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,8512, 8513,8514,8515,8516,8517,8518,8519,8520,8521,8522,8523,8524,8525,8498,8527, 8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542, 8543,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557, 8558,8559,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556, 8557,8558,8559,8576,8577,8578,8579,8579,8581,8582,8583,8584,8585,8586,8587, 8588,8589,8590,8591,8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602, 8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613,8614,8615,8616,8617, 8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629,8630,8631,8632, 8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645,8646,8647, 8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661,8662, 8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677, 8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692, 8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707, 8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722, 8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737, 8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749,8750,8751,8752, 8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,8764,8765,8766,8767, 8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780,8781,8782, 8783,8784,8785,8786,8787,8788,8789,8790,8791,8792,8793,8794,8795,8796,8797, 8798,8799,8800,8801,8802,8803,8804,8805,8806,8807,8808,8809,8810,8811,8812, 8813,8814,8815,8816,8817,8818,8819,8820,8821,8822,8823,8824,8825,8826,8827, 8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839,8840,8841,8842, 8843,8844,8845,8846,8847,8848,8849,8850,8851,8852,8853,8854,8855,8856,8857, 8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870,8871,8872, 8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,8885,8886,8887, 8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901,8902, 8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917, 8918,8919,8920,8921,8922,8923,8924,8925,8926,8927,8928,8929,8930,8931,8932, 8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,8944,8945,8946,8947, 8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962, 8963,8964,8965,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977, 8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992, 8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007, 9008,9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,9022, 9023,9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037, 9038,9039,9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052, 9053,9054,9055,9056,9057,9058,9059,9060,9061,9062,9063,9064,9065,9066,9067, 9068,9069,9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082, 9083,9084,9085,9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097, 9098,9099,9100,9101,9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112, 9113,9114,9115,9116,9117,9118,9119,9120,9121,9122,9123,9124,9125,9126,9127, 9128,9129,9130,9131,9132,9133,9134,9135,9136,9137,9138,9139,9140,9141,9142, 9143,9144,9145,9146,9147,9148,9149,9150,9151,9152,9153,9154,9155,9156,9157, 9158,9159,9160,9161,9162,9163,9164,9165,9166,9167,9168,9169,9170,9171,9172, 9173,9174,9175,9176,9177,9178,9179,9180,9181,9182,9183,9184,9185,9186,9187, 9188,9189,9190,9191,9192,9193,9194,9195,9196,9197,9198,9199,9200,9201,9202, 9203,9204,9205,9206,9207,9208,9209,9210,9211,9212,9213,9214,9215,9216,9217, 9218,9219,9220,9221,9222,9223,9224,9225,9226,9227,9228,9229,9230,9231,9232, 9233,9234,9235,9236,9237,9238,9239,9240,9241,9242,9243,9244,9245,9246,9247, 9248,9249,9250,9251,9252,9253,9254,9255,9256,9257,9258,9259,9260,9261,9262, 9263,9264,9265,9266,9267,9268,9269,9270,9271,9272,9273,9274,9275,9276,9277, 9278,9279,9280,9281,9282,9283,9284,9285,9286,9287,9288,9289,9290,9291,9292, 9293,9294,9295,9296,9297,9298,9299,9300,9301,9302,9303,9304,9305,9306,9307, 9308,9309,9310,9311,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322, 9323,9324,9325,9326,9327,9328,9329,9330,9331,9332,9333,9334,9335,9336,9337, 9338,9339,9340,9341,9342,9343,9344,9345,9346,9347,9348,9349,9350,9351,9352, 9353,9354,9355,9356,9357,9358,9359,9360,9361,9362,9363,9364,9365,9366,9367, 9368,9369,9370,9371,9372,9373,9374,9375,9376,9377,9378,9379,9380,9381,9382, 9383,9384,9385,9386,9387,9388,9389,9390,9391,9392,9393,9394,9395,9396,9397, 9398,9399,9400,9401,9402,9403,9404,9405,9406,9407,9408,9409,9410,9411,9412, 9413,9414,9415,9416,9417,9418,9419,9420,9421,9422,9423,9398,9399,9400,9401, 9402,9403,9404,9405,9406,9407,9408,9409,9410,9411,9412,9413,9414,9415,9416, 9417,9418,9419,9420,9421,9422,9423,9450,9451,9452,9453,9454,9455,9456,9457, 9458,9459,9460,9461,9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9472, 9473,9474,9475,9476,9477,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487, 9488,9489,9490,9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502, 9503,9504,9505,9506,9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517, 9518,9519,9520,9521,9522,9523,9524,9525,9526,9527,9528,9529,9530,9531,9532, 9533,9534,9535,9536,9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547, 9548,9549,9550,9551,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562, 9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577, 9578,9579,9580,9581,9582,9583,9584,9585,9586,9587,9588,9589,9590,9591,9592, 9593,9594,9595,9596,9597,9598,9599,9600,9601,9602,9603,9604,9605,9606,9607, 9608,9609,9610,9611,9612,9613,9614,9615,9616,9617,9618,9619,9620,9621,9622, 9623,9624,9625,9626,9627,9628,9629,9630,9631,9632,9633,9634,9635,9636,9637, 9638,9639,9640,9641,9642,9643,9644,9645,9646,9647,9648,9649,9650,9651,9652, 9653,9654,9655,9656,9657,9658,9659,9660,9661,9662,9663,9664,9665,9666,9667, 9668,9669,9670,9671,9672,9673,9674,9675,9676,9677,9678,9679,9680,9681,9682, 9683,9684,9685,9686,9687,9688,9689,9690,9691,9692,9693,9694,9695,9696,9697, 9698,9699,9700,9701,9702,9703,9704,9705,9706,9707,9708,9709,9710,9711,9712, 9713,9714,9715,9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727, 9728,9729,9730,9731,9732,9733,9734,9735,9736,9737,9738,9739,9740,9741,9742, 9743,9744,9745,9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757, 9758,9759,9760,9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772, 9773,9774,9775,9776,9777,9778,9779,9780,9781,9782,9783,9784,9785,9786,9787, 9788,9789,9790,9791,9792,9793,9794,9795,9796,9797,9798,9799,9800,9801,9802, 9803,9804,9805,9806,9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817, 9818,9819,9820,9821,9822,9823,9824,9825,9826,9827,9828,9829,9830,9831,9832, 9833,9834,9835,9836,9837,9838,9839,9840,9841,9842,9843,9844,9845,9846,9847, 9848,9849,9850,9851,9852,9853,9854,9855,9856,9857,9858,9859,9860,9861,9862, 9863,9864,9865,9866,9867,9868,9869,9870,9871,9872,9873,9874,9875,9876,9877, 9878,9879,9880,9881,9882,9883,9884,9885,9886,9887,9888,9889,9890,9891,9892, 9893,9894,9895,9896,9897,9898,9899,9900,9901,9902,9903,9904,9905,9906,9907, 9908,9909,9910,9911,9912,9913,9914,9915,9916,9917,9918,9919,9920,9921,9922, 9923,9924,9925,9926,9927,9928,9929,9930,9931,9932,9933,9934,9935,9936,9937, 9938,9939,9940,9941,9942,9943,9944,9945,9946,9947,9948,9949,9950,9951,9952, 9953,9954,9955,9956,9957,9958,9959,9960,9961,9962,9963,9964,9965,9966,9967, 9968,9969,9970,9971,9972,9973,9974,9975,9976,9977,9978,9979,9980,9981,9982, 9983,9984,9985,9986,9987,9988,9989,9990,9991,9992,9993,9994,9995,9996,9997, 9998,9999,10000,10001,10002,10003,10004,10005,10006,10007,10008,10009, 10010,10011,10012,10013,10014,10015,10016,10017,10018,10019,10020,10021, 10022,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033, 10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045, 10046,10047,10048,10049,10050,10051,10052,10053,10054,10055,10056,10057, 10058,10059,10060,10061,10062,10063,10064,10065,10066,10067,10068,10069, 10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080,10081, 10082,10083,10084,10085,10086,10087,10088,10089,10090,10091,10092,10093, 10094,10095,10096,10097,10098,10099,10100,10101,10102,10103,10104,10105, 10106,10107,10108,10109,10110,10111,10112,10113,10114,10115,10116,10117, 10118,10119,10120,10121,10122,10123,10124,10125,10126,10127,10128,10129, 10130,10131,10132,10133,10134,10135,10136,10137,10138,10139,10140,10141, 10142,10143,10144,10145,10146,10147,10148,10149,10150,10151,10152,10153, 10154,10155,10156,10157,10158,10159,10160,10161,10162,10163,10164,10165, 10166,10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177, 10178,10179,10180,10181,10182,10183,10184,10185,10186,10187,10188,10189, 10190,10191,10192,10193,10194,10195,10196,10197,10198,10199,10200,10201, 10202,10203,10204,10205,10206,10207,10208,10209,10210,10211,10212,10213, 10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225, 10226,10227,10228,10229,10230,10231,10232,10233,10234,10235,10236,10237, 10238,10239,10240,10241,10242,10243,10244,10245,10246,10247,10248,10249, 10250,10251,10252,10253,10254,10255,10256,10257,10258,10259,10260,10261, 10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273, 10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285, 10286,10287,10288,10289,10290,10291,10292,10293,10294,10295,10296,10297, 10298,10299,10300,10301,10302,10303,10304,10305,10306,10307,10308,10309, 10310,10311,10312,10313,10314,10315,10316,10317,10318,10319,10320,10321, 10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333, 10334,10335,10336,10337,10338,10339,10340,10341,10342,10343,10344,10345, 10346,10347,10348,10349,10350,10351,10352,10353,10354,10355,10356,10357, 10358,10359,10360,10361,10362,10363,10364,10365,10366,10367,10368,10369, 10370,10371,10372,10373,10374,10375,10376,10377,10378,10379,10380,10381, 10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,10393, 10394,10395,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405, 10406,10407,10408,10409,10410,10411,10412,10413,10414,10415,10416,10417, 10418,10419,10420,10421,10422,10423,10424,10425,10426,10427,10428,10429, 10430,10431,10432,10433,10434,10435,10436,10437,10438,10439,10440,10441, 10442,10443,10444,10445,10446,10447,10448,10449,10450,10451,10452,10453, 10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465, 10466,10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477, 10478,10479,10480,10481,10482,10483,10484,10485,10486,10487,10488,10489, 10490,10491,10492,10493,10494,10495,10496,10497,10498,10499,10500,10501, 10502,10503,10504,10505,10506,10507,10508,10509,10510,10511,10512,10513, 10514,10515,10516,10517,10518,10519,10520,10521,10522,10523,10524,10525, 10526,10527,10528,10529,10530,10531,10532,10533,10534,10535,10536,10537, 10538,10539,10540,10541,10542,10543,10544,10545,10546,10547,10548,10549, 10550,10551,10552,10553,10554,10555,10556,10557,10558,10559,10560,10561, 10562,10563,10564,10565,10566,10567,10568,10569,10570,10571,10572,10573, 10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585, 10586,10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597, 10598,10599,10600,10601,10602,10603,10604,10605,10606,10607,10608,10609, 10610,10611,10612,10613,10614,10615,10616,10617,10618,10619,10620,10621, 10622,10623,10624,10625,10626,10627,10628,10629,10630,10631,10632,10633, 10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645, 10646,10647,10648,10649,10650,10651,10652,10653,10654,10655,10656,10657, 10658,10659,10660,10661,10662,10663,10664,10665,10666,10667,10668,10669, 10670,10671,10672,10673,10674,10675,10676,10677,10678,10679,10680,10681, 10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692,10693, 10694,10695,10696,10697,10698,10699,10700,10701,10702,10703,10704,10705, 10706,10707,10708,10709,10710,10711,10712,10713,10714,10715,10716,10717, 10718,10719,10720,10721,10722,10723,10724,10725,10726,10727,10728,10729, 10730,10731,10732,10733,10734,10735,10736,10737,10738,10739,10740,10741, 10742,10743,10744,10745,10746,10747,10748,10749,10750,10751,10752,10753, 10754,10755,10756,10757,10758,10759,10760,10761,10762,10763,10764,10765, 10766,10767,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777, 10778,10779,10780,10781,10782,10783,10784,10785,10786,10787,10788,10789, 10790,10791,10792,10793,10794,10795,10796,10797,10798,10799,10800,10801, 10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812,10813, 10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825, 10826,10827,10828,10829,10830,10831,10832,10833,10834,10835,10836,10837, 10838,10839,10840,10841,10842,10843,10844,10845,10846,10847,10848,10849, 10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860,10861, 10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873, 10874,10875,10876,10877,10878,10879,10880,10881,10882,10883,10884,10885, 10886,10887,10888,10889,10890,10891,10892,10893,10894,10895,10896,10897, 10898,10899,10900,10901,10902,10903,10904,10905,10906,10907,10908,10909, 10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,10920,10921, 10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,10933, 10934,10935,10936,10937,10938,10939,10940,10941,10942,10943,10944,10945, 10946,10947,10948,10949,10950,10951,10952,10953,10954,10955,10956,10957, 10958,10959,10960,10961,10962,10963,10964,10965,10966,10967,10968,10969, 10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981, 10982,10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993, 10994,10995,10996,10997,10998,10999,11000,11001,11002,11003,11004,11005, 11006,11007,11008,11009,11010,11011,11012,11013,11014,11015,11016,11017, 11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029, 11030,11031,11032,11033,11034,11035,11036,11037,11038,11039,11040,11041, 11042,11043,11044,11045,11046,11047,11048,11049,11050,11051,11052,11053, 11054,11055,11056,11057,11058,11059,11060,11061,11062,11063,11064,11065, 11066,11067,11068,11069,11070,11071,11072,11073,11074,11075,11076,11077, 11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088,11089, 11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101, 11102,11103,11104,11105,11106,11107,11108,11109,11110,11111,11112,11113, 11114,11115,11116,11117,11118,11119,11120,11121,11122,11123,11124,11125, 11126,11127,11128,11129,11130,11131,11132,11133,11134,11135,11136,11137, 11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149, 11150,11151,11152,11153,11154,11155,11156,11157,11158,11159,11160,11161, 11162,11163,11164,11165,11166,11167,11168,11169,11170,11171,11172,11173, 11174,11175,11176,11177,11178,11179,11180,11181,11182,11183,11184,11185, 11186,11187,11188,11189,11190,11191,11192,11193,11194,11195,11196,11197, 11198,11199,11200,11201,11202,11203,11204,11205,11206,11207,11208,11209, 11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221, 11222,11223,11224,11225,11226,11227,11228,11229,11230,11231,11232,11233, 11234,11235,11236,11237,11238,11239,11240,11241,11242,11243,11244,11245, 11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257, 11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269, 11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281, 11282,11283,11284,11285,11286,11287,11288,11289,11290,11291,11292,11293, 11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304,11305, 11306,11307,11308,11309,11310,11311,11264,11265,11266,11267,11268,11269, 11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281, 11282,11283,11284,11285,11286,11287,11288,11289,11290,11291,11292,11293, 11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304,11305, 11306,11307,11308,11309,11310,11359,11360,11360,11362,11363,11364,570,574, 11367,11367,11369,11369,11371,11371,11373,11374,11375,11376,11377,11378, 11378,11380,11381,11381,11383,11384,11385,11386,11387,11388,11389,11390, 11391,11392,11392,11394,11394,11396,11396,11398,11398,11400,11400,11402, 11402,11404,11404,11406,11406,11408,11408,11410,11410,11412,11412,11414, 11414,11416,11416,11418,11418,11420,11420,11422,11422,11424,11424,11426, 11426,11428,11428,11430,11430,11432,11432,11434,11434,11436,11436,11438, 11438,11440,11440,11442,11442,11444,11444,11446,11446,11448,11448,11450, 11450,11452,11452,11454,11454,11456,11456,11458,11458,11460,11460,11462, 11462,11464,11464,11466,11466,11468,11468,11470,11470,11472,11472,11474, 11474,11476,11476,11478,11478,11480,11480,11482,11482,11484,11484,11486, 11486,11488,11488,11490,11490,11492,11493,11494,11495,11496,11497,11498, 11499,11499,11501,11501,11503,11504,11505,11506,11506,11508,11509,11510, 11511,11512,11513,11514,11515,11516,11517,11518,11519,4256,4257,4258,4259, 4260,4261,4262,4263,4264,4265,4266,4267,4268,4269,4270,4271,4272,4273,4274, 4275,4276,4277,4278,4279,4280,4281,4282,4283,4284,4285,4286,4287,4288,4289, 4290,4291,4292,4293,11558,4295,11560,11561,11562,11563,11564,4301,11566, 11567,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578, 11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590, 11591,11592,11593,11594,11595,11596,11597,11598,11599,11600,11601,11602, 11603,11604,11605,11606,11607,11608,11609,11610,11611,11612,11613,11614, 11615,11616,11617,11618,11619,11620,11621,11622,11623,11624,11625,11626, 11627,11628,11629,11630,11631,11632,11633,11634,11635,11636,11637,11638, 11639,11640,11641,11642,11643,11644,11645,11646,11647,11648,11649,11650, 11651,11652,11653,11654,11655,11656,11657,11658,11659,11660,11661,11662, 11663,11664,11665,11666,11667,11668,11669,11670,11671,11672,11673,11674, 11675,11676,11677,11678,11679,11680,11681,11682,11683,11684,11685,11686, 11687,11688,11689,11690,11691,11692,11693,11694,11695,11696,11697,11698, 11699,11700,11701,11702,11703,11704,11705,11706,11707,11708,11709,11710, 11711,11712,11713,11714,11715,11716,11717,11718,11719,11720,11721,11722, 11723,11724,11725,11726,11727,11728,11729,11730,11731,11732,11733,11734, 11735,11736,11737,11738,11739,11740,11741,11742,11743,11744,11745,11746, 11747,11748,11749,11750,11751,11752,11753,11754,11755,11756,11757,11758, 11759,11760,11761,11762,11763,11764,11765,11766,11767,11768,11769,11770, 11771,11772,11773,11774,11775,11776,11777,11778,11779,11780,11781,11782, 11783,11784,11785,11786,11787,11788,11789,11790,11791,11792,11793,11794, 11795,11796,11797,11798,11799,11800,11801,11802,11803,11804,11805,11806, 11807,11808,11809,11810,11811,11812,11813,11814,11815,11816,11817,11818, 11819,11820,11821,11822,11823,11824,11825,11826,11827,11828,11829,11830, 11831,11832,11833,11834,11835,11836,11837,11838,11839,11840,11841,11842, 11843,11844,11845,11846,11847,11848,11849,11850,11851,11852,11853,11854, 11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866, 11867,11868,11869,11870,11871,11872,11873,11874,11875,11876,11877,11878, 11879,11880,11881,11882,11883,11884,11885,11886,11887,11888,11889,11890, 11891,11892,11893,11894,11895,11896,11897,11898,11899,11900,11901,11902, 11903,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913,11914, 11915,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926, 11927,11928,11929,11930,11931,11932,11933,11934,11935,11936,11937,11938, 11939,11940,11941,11942,11943,11944,11945,11946,11947,11948,11949,11950, 11951,11952,11953,11954,11955,11956,11957,11958,11959,11960,11961,11962, 11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974, 11975,11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986, 11987,11988,11989,11990,11991,11992,11993,11994,11995,11996,11997,11998, 11999,12000,12001,12002,12003,12004,12005,12006,12007,12008,12009,12010, 12011,12012,12013,12014,12015,12016,12017,12018,12019,12020,12021,12022, 12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12034, 12035,12036,12037,12038,12039,12040,12041,12042,12043,12044,12045,12046, 12047,12048,12049,12050,12051,12052,12053,12054,12055,12056,12057,12058, 12059,12060,12061,12062,12063,12064,12065,12066,12067,12068,12069,12070, 12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082, 12083,12084,12085,12086,12087,12088,12089,12090,12091,12092,12093,12094, 12095,12096,12097,12098,12099,12100,12101,12102,12103,12104,12105,12106, 12107,12108,12109,12110,12111,12112,12113,12114,12115,12116,12117,12118, 12119,12120,12121,12122,12123,12124,12125,12126,12127,12128,12129,12130, 12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142, 12143,12144,12145,12146,12147,12148,12149,12150,12151,12152,12153,12154, 12155,12156,12157,12158,12159,12160,12161,12162,12163,12164,12165,12166, 12167,12168,12169,12170,12171,12172,12173,12174,12175,12176,12177,12178, 12179,12180,12181,12182,12183,12184,12185,12186,12187,12188,12189,12190, 12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202, 12203,12204,12205,12206,12207,12208,12209,12210,12211,12212,12213,12214, 12215,12216,12217,12218,12219,12220,12221,12222,12223,12224,12225,12226, 12227,12228,12229,12230,12231,12232,12233,12234,12235,12236,12237,12238, 12239,12240,12241,12242,12243,12244,12245,12246,12247,12248,12249,12250, 12251,12252,12253,12254,12255,12256,12257,12258,12259,12260,12261,12262, 12263,12264,12265,12266,12267,12268,12269,12270,12271,12272,12273,12274, 12275,12276,12277,12278,12279,12280,12281,12282,12283,12284,12285,12286, 12287,12288,12289,12290,12291,12292,12293,12294,12295,12296,12297,12298, 12299,12300,12301,12302,12303,12304,12305,12306,12307,12308,12309,12310, 12311,12312,12313,12314,12315,12316,12317,12318,12319,12320,12321,12322, 12323,12324,12325,12326,12327,12328,12329,12330,12331,12332,12333,12334, 12335,12336,12337,12338,12339,12340,12341,12342,12343,12344,12345,12346, 12347,12348,12349,12350,12351,12352,12353,12354,12355,12356,12357,12358, 12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370, 12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382, 12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394, 12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406, 12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418, 12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430, 12431,12432,12433,12434,12435,12436,12437,12438,12439,12440,12441,12442, 12443,12444,12445,12446,12447,12448,12449,12450,12451,12452,12453,12454, 12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466, 12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478, 12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490, 12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502, 12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514, 12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526, 12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538, 12539,12540,12541,12542,12543,12544,12545,12546,12547,12548,12549,12550, 12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562, 12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574, 12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,12586, 12587,12588,12589,12590,12591,12592,12593,12594,12595,12596,12597,12598, 12599,12600,12601,12602,12603,12604,12605,12606,12607,12608,12609,12610, 12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621,12622, 12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634, 12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646, 12647,12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658, 12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,12670, 12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682, 12683,12684,12685,12686,12687,12688,12689,12690,12691,12692,12693,12694, 12695,12696,12697,12698,12699,12700,12701,12702,12703,12704,12705,12706, 12707,12708,12709,12710,12711,12712,12713,12714,12715,12716,12717,12718, 12719,12720,12721,12722,12723,12724,12725,12726,12727,12728,12729,12730, 12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742, 12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754, 12755,12756,12757,12758,12759,12760,12761,12762,12763,12764,12765,12766, 12767,12768,12769,12770,12771,12772,12773,12774,12775,12776,12777,12778, 12779,12780,12781,12782,12783,12784,12785,12786,12787,12788,12789,12790, 12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802, 12803,12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814, 12815,12816,12817,12818,12819,12820,12821,12822,12823,12824,12825,12826, 12827,12828,12829,12830,12831,12832,12833,12834,12835,12836,12837,12838, 12839,12840,12841,12842,12843,12844,12845,12846,12847,12848,12849,12850, 12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,12862, 12863,12864,12865,12866,12867,12868,12869,12870,12871,12872,12873,12874, 12875,12876,12877,12878,12879,12880,12881,12882,12883,12884,12885,12886, 12887,12888,12889,12890,12891,12892,12893,12894,12895,12896,12897,12898, 12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910, 12911,12912,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922, 12923,12924,12925,12926,12927,12928,12929,12930,12931,12932,12933,12934, 12935,12936,12937,12938,12939,12940,12941,12942,12943,12944,12945,12946, 12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,12957,12958, 12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970, 12971,12972,12973,12974,12975,12976,12977,12978,12979,12980,12981,12982, 12983,12984,12985,12986,12987,12988,12989,12990,12991,12992,12993,12994, 12995,12996,12997,12998,12999,13000,13001,13002,13003,13004,13005,13006, 13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018, 13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,13030, 13031,13032,13033,13034,13035,13036,13037,13038,13039,13040,13041,13042, 13043,13044,13045,13046,13047,13048,13049,13050,13051,13052,13053,13054, 13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065,13066, 13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078, 13079,13080,13081,13082,13083,13084,13085,13086,13087,13088,13089,13090, 13091,13092,13093,13094,13095,13096,13097,13098,13099,13100,13101,13102, 13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113,13114, 13115,13116,13117,13118,13119,13120,13121,13122,13123,13124,13125,13126, 13127,13128,13129,13130,13131,13132,13133,13134,13135,13136,13137,13138, 13139,13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150, 13151,13152,13153,13154,13155,13156,13157,13158,13159,13160,13161,13162, 13163,13164,13165,13166,13167,13168,13169,13170,13171,13172,13173,13174, 13175,13176,13177,13178,13179,13180,13181,13182,13183,13184,13185,13186, 13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198, 13199,13200,13201,13202,13203,13204,13205,13206,13207,13208,13209,13210, 13211,13212,13213,13214,13215,13216,13217,13218,13219,13220,13221,13222, 13223,13224,13225,13226,13227,13228,13229,13230,13231,13232,13233,13234, 13235,13236,13237,13238,13239,13240,13241,13242,13243,13244,13245,13246, 13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258, 13259,13260,13261,13262,13263,13264,13265,13266,13267,13268,13269,13270, 13271,13272,13273,13274,13275,13276,13277,13278,13279,13280,13281,13282, 13283,13284,13285,13286,13287,13288,13289,13290,13291,13292,13293,13294, 13295,13296,13297,13298,13299,13300,13301,13302,13303,13304,13305,13306, 13307,13308,13309,13310,13311,13312,13313,13314,13315,13316,13317,13318, 13319,13320,13321,13322,13323,13324,13325,13326,13327,13328,13329,13330, 13331,13332,13333,13334,13335,13336,13337,13338,13339,13340,13341,13342, 13343,13344,13345,13346,13347,13348,13349,13350,13351,13352,13353,13354, 13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366, 13367,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378, 13379,13380,13381,13382,13383,13384,13385,13386,13387,13388,13389,13390, 13391,13392,13393,13394,13395,13396,13397,13398,13399,13400,13401,13402, 13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414, 13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426, 13427,13428,13429,13430,13431,13432,13433,13434,13435,13436,13437,13438, 13439,13440,13441,13442,13443,13444,13445,13446,13447,13448,13449,13450, 13451,13452,13453,13454,13455,13456,13457,13458,13459,13460,13461,13462, 13463,13464,13465,13466,13467,13468,13469,13470,13471,13472,13473,13474, 13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486, 13487,13488,13489,13490,13491,13492,13493,13494,13495,13496,13497,13498, 13499,13500,13501,13502,13503,13504,13505,13506,13507,13508,13509,13510, 13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522, 13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534, 13535,13536,13537,13538,13539,13540,13541,13542,13543,13544,13545,13546, 13547,13548,13549,13550,13551,13552,13553,13554,13555,13556,13557,13558, 13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570, 13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582, 13583,13584,13585,13586,13587,13588,13589,13590,13591,13592,13593,13594, 13595,13596,13597,13598,13599,13600,13601,13602,13603,13604,13605,13606, 13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618, 13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630, 13631,13632,13633,13634,13635,13636,13637,13638,13639,13640,13641,13642, 13643,13644,13645,13646,13647,13648,13649,13650,13651,13652,13653,13654, 13655,13656,13657,13658,13659,13660,13661,13662,13663,13664,13665,13666, 13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678, 13679,13680,13681,13682,13683,13684,13685,13686,13687,13688,13689,13690, 13691,13692,13693,13694,13695,13696,13697,13698,13699,13700,13701,13702, 13703,13704,13705,13706,13707,13708,13709,13710,13711,13712,13713,13714, 13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726, 13727,13728,13729,13730,13731,13732,13733,13734,13735,13736,13737,13738, 13739,13740,13741,13742,13743,13744,13745,13746,13747,13748,13749,13750, 13751,13752,13753,13754,13755,13756,13757,13758,13759,13760,13761,13762, 13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774, 13775,13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786, 13787,13788,13789,13790,13791,13792,13793,13794,13795,13796,13797,13798, 13799,13800,13801,13802,13803,13804,13805,13806,13807,13808,13809,13810, 13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822, 13823,13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834, 13835,13836,13837,13838,13839,13840,13841,13842,13843,13844,13845,13846, 13847,13848,13849,13850,13851,13852,13853,13854,13855,13856,13857,13858, 13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870, 13871,13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882, 13883,13884,13885,13886,13887,13888,13889,13890,13891,13892,13893,13894, 13895,13896,13897,13898,13899,13900,13901,13902,13903,13904,13905,13906, 13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918, 13919,13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930, 13931,13932,13933,13934,13935,13936,13937,13938,13939,13940,13941,13942, 13943,13944,13945,13946,13947,13948,13949,13950,13951,13952,13953,13954, 13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966, 13967,13968,13969,13970,13971,13972,13973,13974,13975,13976,13977,13978, 13979,13980,13981,13982,13983,13984,13985,13986,13987,13988,13989,13990, 13991,13992,13993,13994,13995,13996,13997,13998,13999,14000,14001,14002, 14003,14004,14005,14006,14007,14008,14009,14010,14011,14012,14013,14014, 14015,14016,14017,14018,14019,14020,14021,14022,14023,14024,14025,14026, 14027,14028,14029,14030,14031,14032,14033,14034,14035,14036,14037,14038, 14039,14040,14041,14042,14043,14044,14045,14046,14047,14048,14049,14050, 14051,14052,14053,14054,14055,14056,14057,14058,14059,14060,14061,14062, 14063,14064,14065,14066,14067,14068,14069,14070,14071,14072,14073,14074, 14075,14076,14077,14078,14079,14080,14081,14082,14083,14084,14085,14086, 14087,14088,14089,14090,14091,14092,14093,14094,14095,14096,14097,14098, 14099,14100,14101,14102,14103,14104,14105,14106,14107,14108,14109,14110, 14111,14112,14113,14114,14115,14116,14117,14118,14119,14120,14121,14122, 14123,14124,14125,14126,14127,14128,14129,14130,14131,14132,14133,14134, 14135,14136,14137,14138,14139,14140,14141,14142,14143,14144,14145,14146, 14147,14148,14149,14150,14151,14152,14153,14154,14155,14156,14157,14158, 14159,14160,14161,14162,14163,14164,14165,14166,14167,14168,14169,14170, 14171,14172,14173,14174,14175,14176,14177,14178,14179,14180,14181,14182, 14183,14184,14185,14186,14187,14188,14189,14190,14191,14192,14193,14194, 14195,14196,14197,14198,14199,14200,14201,14202,14203,14204,14205,14206, 14207,14208,14209,14210,14211,14212,14213,14214,14215,14216,14217,14218, 14219,14220,14221,14222,14223,14224,14225,14226,14227,14228,14229,14230, 14231,14232,14233,14234,14235,14236,14237,14238,14239,14240,14241,14242, 14243,14244,14245,14246,14247,14248,14249,14250,14251,14252,14253,14254, 14255,14256,14257,14258,14259,14260,14261,14262,14263,14264,14265,14266, 14267,14268,14269,14270,14271,14272,14273,14274,14275,14276,14277,14278, 14279,14280,14281,14282,14283,14284,14285,14286,14287,14288,14289,14290, 14291,14292,14293,14294,14295,14296,14297,14298,14299,14300,14301,14302, 14303,14304,14305,14306,14307,14308,14309,14310,14311,14312,14313,14314, 14315,14316,14317,14318,14319,14320,14321,14322,14323,14324,14325,14326, 14327,14328,14329,14330,14331,14332,14333,14334,14335,14336,14337,14338, 14339,14340,14341,14342,14343,14344,14345,14346,14347,14348,14349,14350, 14351,14352,14353,14354,14355,14356,14357,14358,14359,14360,14361,14362, 14363,14364,14365,14366,14367,14368,14369,14370,14371,14372,14373,14374, 14375,14376,14377,14378,14379,14380,14381,14382,14383,14384,14385,14386, 14387,14388,14389,14390,14391,14392,14393,14394,14395,14396,14397,14398, 14399,14400,14401,14402,14403,14404,14405,14406,14407,14408,14409,14410, 14411,14412,14413,14414,14415,14416,14417,14418,14419,14420,14421,14422, 14423,14424,14425,14426,14427,14428,14429,14430,14431,14432,14433,14434, 14435,14436,14437,14438,14439,14440,14441,14442,14443,14444,14445,14446, 14447,14448,14449,14450,14451,14452,14453,14454,14455,14456,14457,14458, 14459,14460,14461,14462,14463,14464,14465,14466,14467,14468,14469,14470, 14471,14472,14473,14474,14475,14476,14477,14478,14479,14480,14481,14482, 14483,14484,14485,14486,14487,14488,14489,14490,14491,14492,14493,14494, 14495,14496,14497,14498,14499,14500,14501,14502,14503,14504,14505,14506, 14507,14508,14509,14510,14511,14512,14513,14514,14515,14516,14517,14518, 14519,14520,14521,14522,14523,14524,14525,14526,14527,14528,14529,14530, 14531,14532,14533,14534,14535,14536,14537,14538,14539,14540,14541,14542, 14543,14544,14545,14546,14547,14548,14549,14550,14551,14552,14553,14554, 14555,14556,14557,14558,14559,14560,14561,14562,14563,14564,14565,14566, 14567,14568,14569,14570,14571,14572,14573,14574,14575,14576,14577,14578, 14579,14580,14581,14582,14583,14584,14585,14586,14587,14588,14589,14590, 14591,14592,14593,14594,14595,14596,14597,14598,14599,14600,14601,14602, 14603,14604,14605,14606,14607,14608,14609,14610,14611,14612,14613,14614, 14615,14616,14617,14618,14619,14620,14621,14622,14623,14624,14625,14626, 14627,14628,14629,14630,14631,14632,14633,14634,14635,14636,14637,14638, 14639,14640,14641,14642,14643,14644,14645,14646,14647,14648,14649,14650, 14651,14652,14653,14654,14655,14656,14657,14658,14659,14660,14661,14662, 14663,14664,14665,14666,14667,14668,14669,14670,14671,14672,14673,14674, 14675,14676,14677,14678,14679,14680,14681,14682,14683,14684,14685,14686, 14687,14688,14689,14690,14691,14692,14693,14694,14695,14696,14697,14698, 14699,14700,14701,14702,14703,14704,14705,14706,14707,14708,14709,14710, 14711,14712,14713,14714,14715,14716,14717,14718,14719,14720,14721,14722, 14723,14724,14725,14726,14727,14728,14729,14730,14731,14732,14733,14734, 14735,14736,14737,14738,14739,14740,14741,14742,14743,14744,14745,14746, 14747,14748,14749,14750,14751,14752,14753,14754,14755,14756,14757,14758, 14759,14760,14761,14762,14763,14764,14765,14766,14767,14768,14769,14770, 14771,14772,14773,14774,14775,14776,14777,14778,14779,14780,14781,14782, 14783,14784,14785,14786,14787,14788,14789,14790,14791,14792,14793,14794, 14795,14796,14797,14798,14799,14800,14801,14802,14803,14804,14805,14806, 14807,14808,14809,14810,14811,14812,14813,14814,14815,14816,14817,14818, 14819,14820,14821,14822,14823,14824,14825,14826,14827,14828,14829,14830, 14831,14832,14833,14834,14835,14836,14837,14838,14839,14840,14841,14842, 14843,14844,14845,14846,14847,14848,14849,14850,14851,14852,14853,14854, 14855,14856,14857,14858,14859,14860,14861,14862,14863,14864,14865,14866, 14867,14868,14869,14870,14871,14872,14873,14874,14875,14876,14877,14878, 14879,14880,14881,14882,14883,14884,14885,14886,14887,14888,14889,14890, 14891,14892,14893,14894,14895,14896,14897,14898,14899,14900,14901,14902, 14903,14904,14905,14906,14907,14908,14909,14910,14911,14912,14913,14914, 14915,14916,14917,14918,14919,14920,14921,14922,14923,14924,14925,14926, 14927,14928,14929,14930,14931,14932,14933,14934,14935,14936,14937,14938, 14939,14940,14941,14942,14943,14944,14945,14946,14947,14948,14949,14950, 14951,14952,14953,14954,14955,14956,14957,14958,14959,14960,14961,14962, 14963,14964,14965,14966,14967,14968,14969,14970,14971,14972,14973,14974, 14975,14976,14977,14978,14979,14980,14981,14982,14983,14984,14985,14986, 14987,14988,14989,14990,14991,14992,14993,14994,14995,14996,14997,14998, 14999,15000,15001,15002,15003,15004,15005,15006,15007,15008,15009,15010, 15011,15012,15013,15014,15015,15016,15017,15018,15019,15020,15021,15022, 15023,15024,15025,15026,15027,15028,15029,15030,15031,15032,15033,15034, 15035,15036,15037,15038,15039,15040,15041,15042,15043,15044,15045,15046, 15047,15048,15049,15050,15051,15052,15053,15054,15055,15056,15057,15058, 15059,15060,15061,15062,15063,15064,15065,15066,15067,15068,15069,15070, 15071,15072,15073,15074,15075,15076,15077,15078,15079,15080,15081,15082, 15083,15084,15085,15086,15087,15088,15089,15090,15091,15092,15093,15094, 15095,15096,15097,15098,15099,15100,15101,15102,15103,15104,15105,15106, 15107,15108,15109,15110,15111,15112,15113,15114,15115,15116,15117,15118, 15119,15120,15121,15122,15123,15124,15125,15126,15127,15128,15129,15130, 15131,15132,15133,15134,15135,15136,15137,15138,15139,15140,15141,15142, 15143,15144,15145,15146,15147,15148,15149,15150,15151,15152,15153,15154, 15155,15156,15157,15158,15159,15160,15161,15162,15163,15164,15165,15166, 15167,15168,15169,15170,15171,15172,15173,15174,15175,15176,15177,15178, 15179,15180,15181,15182,15183,15184,15185,15186,15187,15188,15189,15190, 15191,15192,15193,15194,15195,15196,15197,15198,15199,15200,15201,15202, 15203,15204,15205,15206,15207,15208,15209,15210,15211,15212,15213,15214, 15215,15216,15217,15218,15219,15220,15221,15222,15223,15224,15225,15226, 15227,15228,15229,15230,15231,15232,15233,15234,15235,15236,15237,15238, 15239,15240,15241,15242,15243,15244,15245,15246,15247,15248,15249,15250, 15251,15252,15253,15254,15255,15256,15257,15258,15259,15260,15261,15262, 15263,15264,15265,15266,15267,15268,15269,15270,15271,15272,15273,15274, 15275,15276,15277,15278,15279,15280,15281,15282,15283,15284,15285,15286, 15287,15288,15289,15290,15291,15292,15293,15294,15295,15296,15297,15298, 15299,15300,15301,15302,15303,15304,15305,15306,15307,15308,15309,15310, 15311,15312,15313,15314,15315,15316,15317,15318,15319,15320,15321,15322, 15323,15324,15325,15326,15327,15328,15329,15330,15331,15332,15333,15334, 15335,15336,15337,15338,15339,15340,15341,15342,15343,15344,15345,15346, 15347,15348,15349,15350,15351,15352,15353,15354,15355,15356,15357,15358, 15359,15360,15361,15362,15363,15364,15365,15366,15367,15368,15369,15370, 15371,15372,15373,15374,15375,15376,15377,15378,15379,15380,15381,15382, 15383,15384,15385,15386,15387,15388,15389,15390,15391,15392,15393,15394, 15395,15396,15397,15398,15399,15400,15401,15402,15403,15404,15405,15406, 15407,15408,15409,15410,15411,15412,15413,15414,15415,15416,15417,15418, 15419,15420,15421,15422,15423,15424,15425,15426,15427,15428,15429,15430, 15431,15432,15433,15434,15435,15436,15437,15438,15439,15440,15441,15442, 15443,15444,15445,15446,15447,15448,15449,15450,15451,15452,15453,15454, 15455,15456,15457,15458,15459,15460,15461,15462,15463,15464,15465,15466, 15467,15468,15469,15470,15471,15472,15473,15474,15475,15476,15477,15478, 15479,15480,15481,15482,15483,15484,15485,15486,15487,15488,15489,15490, 15491,15492,15493,15494,15495,15496,15497,15498,15499,15500,15501,15502, 15503,15504,15505,15506,15507,15508,15509,15510,15511,15512,15513,15514, 15515,15516,15517,15518,15519,15520,15521,15522,15523,15524,15525,15526, 15527,15528,15529,15530,15531,15532,15533,15534,15535,15536,15537,15538, 15539,15540,15541,15542,15543,15544,15545,15546,15547,15548,15549,15550, 15551,15552,15553,15554,15555,15556,15557,15558,15559,15560,15561,15562, 15563,15564,15565,15566,15567,15568,15569,15570,15571,15572,15573,15574, 15575,15576,15577,15578,15579,15580,15581,15582,15583,15584,15585,15586, 15587,15588,15589,15590,15591,15592,15593,15594,15595,15596,15597,15598, 15599,15600,15601,15602,15603,15604,15605,15606,15607,15608,15609,15610, 15611,15612,15613,15614,15615,15616,15617,15618,15619,15620,15621,15622, 15623,15624,15625,15626,15627,15628,15629,15630,15631,15632,15633,15634, 15635,15636,15637,15638,15639,15640,15641,15642,15643,15644,15645,15646, 15647,15648,15649,15650,15651,15652,15653,15654,15655,15656,15657,15658, 15659,15660,15661,15662,15663,15664,15665,15666,15667,15668,15669,15670, 15671,15672,15673,15674,15675,15676,15677,15678,15679,15680,15681,15682, 15683,15684,15685,15686,15687,15688,15689,15690,15691,15692,15693,15694, 15695,15696,15697,15698,15699,15700,15701,15702,15703,15704,15705,15706, 15707,15708,15709,15710,15711,15712,15713,15714,15715,15716,15717,15718, 15719,15720,15721,15722,15723,15724,15725,15726,15727,15728,15729,15730, 15731,15732,15733,15734,15735,15736,15737,15738,15739,15740,15741,15742, 15743,15744,15745,15746,15747,15748,15749,15750,15751,15752,15753,15754, 15755,15756,15757,15758,15759,15760,15761,15762,15763,15764,15765,15766, 15767,15768,15769,15770,15771,15772,15773,15774,15775,15776,15777,15778, 15779,15780,15781,15782,15783,15784,15785,15786,15787,15788,15789,15790, 15791,15792,15793,15794,15795,15796,15797,15798,15799,15800,15801,15802, 15803,15804,15805,15806,15807,15808,15809,15810,15811,15812,15813,15814, 15815,15816,15817,15818,15819,15820,15821,15822,15823,15824,15825,15826, 15827,15828,15829,15830,15831,15832,15833,15834,15835,15836,15837,15838, 15839,15840,15841,15842,15843,15844,15845,15846,15847,15848,15849,15850, 15851,15852,15853,15854,15855,15856,15857,15858,15859,15860,15861,15862, 15863,15864,15865,15866,15867,15868,15869,15870,15871,15872,15873,15874, 15875,15876,15877,15878,15879,15880,15881,15882,15883,15884,15885,15886, 15887,15888,15889,15890,15891,15892,15893,15894,15895,15896,15897,15898, 15899,15900,15901,15902,15903,15904,15905,15906,15907,15908,15909,15910, 15911,15912,15913,15914,15915,15916,15917,15918,15919,15920,15921,15922, 15923,15924,15925,15926,15927,15928,15929,15930,15931,15932,15933,15934, 15935,15936,15937,15938,15939,15940,15941,15942,15943,15944,15945,15946, 15947,15948,15949,15950,15951,15952,15953,15954,15955,15956,15957,15958, 15959,15960,15961,15962,15963,15964,15965,15966,15967,15968,15969,15970, 15971,15972,15973,15974,15975,15976,15977,15978,15979,15980,15981,15982, 15983,15984,15985,15986,15987,15988,15989,15990,15991,15992,15993,15994, 15995,15996,15997,15998,15999,16000,16001,16002,16003,16004,16005,16006, 16007,16008,16009,16010,16011,16012,16013,16014,16015,16016,16017,16018, 16019,16020,16021,16022,16023,16024,16025,16026,16027,16028,16029,16030, 16031,16032,16033,16034,16035,16036,16037,16038,16039,16040,16041,16042, 16043,16044,16045,16046,16047,16048,16049,16050,16051,16052,16053,16054, 16055,16056,16057,16058,16059,16060,16061,16062,16063,16064,16065,16066, 16067,16068,16069,16070,16071,16072,16073,16074,16075,16076,16077,16078, 16079,16080,16081,16082,16083,16084,16085,16086,16087,16088,16089,16090, 16091,16092,16093,16094,16095,16096,16097,16098,16099,16100,16101,16102, 16103,16104,16105,16106,16107,16108,16109,16110,16111,16112,16113,16114, 16115,16116,16117,16118,16119,16120,16121,16122,16123,16124,16125,16126, 16127,16128,16129,16130,16131,16132,16133,16134,16135,16136,16137,16138, 16139,16140,16141,16142,16143,16144,16145,16146,16147,16148,16149,16150, 16151,16152,16153,16154,16155,16156,16157,16158,16159,16160,16161,16162, 16163,16164,16165,16166,16167,16168,16169,16170,16171,16172,16173,16174, 16175,16176,16177,16178,16179,16180,16181,16182,16183,16184,16185,16186, 16187,16188,16189,16190,16191,16192,16193,16194,16195,16196,16197,16198, 16199,16200,16201,16202,16203,16204,16205,16206,16207,16208,16209,16210, 16211,16212,16213,16214,16215,16216,16217,16218,16219,16220,16221,16222, 16223,16224,16225,16226,16227,16228,16229,16230,16231,16232,16233,16234, 16235,16236,16237,16238,16239,16240,16241,16242,16243,16244,16245,16246, 16247,16248,16249,16250,16251,16252,16253,16254,16255,16256,16257,16258, 16259,16260,16261,16262,16263,16264,16265,16266,16267,16268,16269,16270, 16271,16272,16273,16274,16275,16276,16277,16278,16279,16280,16281,16282, 16283,16284,16285,16286,16287,16288,16289,16290,16291,16292,16293,16294, 16295,16296,16297,16298,16299,16300,16301,16302,16303,16304,16305,16306, 16307,16308,16309,16310,16311,16312,16313,16314,16315,16316,16317,16318, 16319,16320,16321,16322,16323,16324,16325,16326,16327,16328,16329,16330, 16331,16332,16333,16334,16335,16336,16337,16338,16339,16340,16341,16342, 16343,16344,16345,16346,16347,16348,16349,16350,16351,16352,16353,16354, 16355,16356,16357,16358,16359,16360,16361,16362,16363,16364,16365,16366, 16367,16368,16369,16370,16371,16372,16373,16374,16375,16376,16377,16378, 16379,16380,16381,16382,16383,16384,16385,16386,16387,16388,16389,16390, 16391,16392,16393,16394,16395,16396,16397,16398,16399,16400,16401,16402, 16403,16404,16405,16406,16407,16408,16409,16410,16411,16412,16413,16414, 16415,16416,16417,16418,16419,16420,16421,16422,16423,16424,16425,16426, 16427,16428,16429,16430,16431,16432,16433,16434,16435,16436,16437,16438, 16439,16440,16441,16442,16443,16444,16445,16446,16447,16448,16449,16450, 16451,16452,16453,16454,16455,16456,16457,16458,16459,16460,16461,16462, 16463,16464,16465,16466,16467,16468,16469,16470,16471,16472,16473,16474, 16475,16476,16477,16478,16479,16480,16481,16482,16483,16484,16485,16486, 16487,16488,16489,16490,16491,16492,16493,16494,16495,16496,16497,16498, 16499,16500,16501,16502,16503,16504,16505,16506,16507,16508,16509,16510, 16511,16512,16513,16514,16515,16516,16517,16518,16519,16520,16521,16522, 16523,16524,16525,16526,16527,16528,16529,16530,16531,16532,16533,16534, 16535,16536,16537,16538,16539,16540,16541,16542,16543,16544,16545,16546, 16547,16548,16549,16550,16551,16552,16553,16554,16555,16556,16557,16558, 16559,16560,16561,16562,16563,16564,16565,16566,16567,16568,16569,16570, 16571,16572,16573,16574,16575,16576,16577,16578,16579,16580,16581,16582, 16583,16584,16585,16586,16587,16588,16589,16590,16591,16592,16593,16594, 16595,16596,16597,16598,16599,16600,16601,16602,16603,16604,16605,16606, 16607,16608,16609,16610,16611,16612,16613,16614,16615,16616,16617,16618, 16619,16620,16621,16622,16623,16624,16625,16626,16627,16628,16629,16630, 16631,16632,16633,16634,16635,16636,16637,16638,16639,16640,16641,16642, 16643,16644,16645,16646,16647,16648,16649,16650,16651,16652,16653,16654, 16655,16656,16657,16658,16659,16660,16661,16662,16663,16664,16665,16666, 16667,16668,16669,16670,16671,16672,16673,16674,16675,16676,16677,16678, 16679,16680,16681,16682,16683,16684,16685,16686,16687,16688,16689,16690, 16691,16692,16693,16694,16695,16696,16697,16698,16699,16700,16701,16702, 16703,16704,16705,16706,16707,16708,16709,16710,16711,16712,16713,16714, 16715,16716,16717,16718,16719,16720,16721,16722,16723,16724,16725,16726, 16727,16728,16729,16730,16731,16732,16733,16734,16735,16736,16737,16738, 16739,16740,16741,16742,16743,16744,16745,16746,16747,16748,16749,16750, 16751,16752,16753,16754,16755,16756,16757,16758,16759,16760,16761,16762, 16763,16764,16765,16766,16767,16768,16769,16770,16771,16772,16773,16774, 16775,16776,16777,16778,16779,16780,16781,16782,16783,16784,16785,16786, 16787,16788,16789,16790,16791,16792,16793,16794,16795,16796,16797,16798, 16799,16800,16801,16802,16803,16804,16805,16806,16807,16808,16809,16810, 16811,16812,16813,16814,16815,16816,16817,16818,16819,16820,16821,16822, 16823,16824,16825,16826,16827,16828,16829,16830,16831,16832,16833,16834, 16835,16836,16837,16838,16839,16840,16841,16842,16843,16844,16845,16846, 16847,16848,16849,16850,16851,16852,16853,16854,16855,16856,16857,16858, 16859,16860,16861,16862,16863,16864,16865,16866,16867,16868,16869,16870, 16871,16872,16873,16874,16875,16876,16877,16878,16879,16880,16881,16882, 16883,16884,16885,16886,16887,16888,16889,16890,16891,16892,16893,16894, 16895,16896,16897,16898,16899,16900,16901,16902,16903,16904,16905,16906, 16907,16908,16909,16910,16911,16912,16913,16914,16915,16916,16917,16918, 16919,16920,16921,16922,16923,16924,16925,16926,16927,16928,16929,16930, 16931,16932,16933,16934,16935,16936,16937,16938,16939,16940,16941,16942, 16943,16944,16945,16946,16947,16948,16949,16950,16951,16952,16953,16954, 16955,16956,16957,16958,16959,16960,16961,16962,16963,16964,16965,16966, 16967,16968,16969,16970,16971,16972,16973,16974,16975,16976,16977,16978, 16979,16980,16981,16982,16983,16984,16985,16986,16987,16988,16989,16990, 16991,16992,16993,16994,16995,16996,16997,16998,16999,17000,17001,17002, 17003,17004,17005,17006,17007,17008,17009,17010,17011,17012,17013,17014, 17015,17016,17017,17018,17019,17020,17021,17022,17023,17024,17025,17026, 17027,17028,17029,17030,17031,17032,17033,17034,17035,17036,17037,17038, 17039,17040,17041,17042,17043,17044,17045,17046,17047,17048,17049,17050, 17051,17052,17053,17054,17055,17056,17057,17058,17059,17060,17061,17062, 17063,17064,17065,17066,17067,17068,17069,17070,17071,17072,17073,17074, 17075,17076,17077,17078,17079,17080,17081,17082,17083,17084,17085,17086, 17087,17088,17089,17090,17091,17092,17093,17094,17095,17096,17097,17098, 17099,17100,17101,17102,17103,17104,17105,17106,17107,17108,17109,17110, 17111,17112,17113,17114,17115,17116,17117,17118,17119,17120,17121,17122, 17123,17124,17125,17126,17127,17128,17129,17130,17131,17132,17133,17134, 17135,17136,17137,17138,17139,17140,17141,17142,17143,17144,17145,17146, 17147,17148,17149,17150,17151,17152,17153,17154,17155,17156,17157,17158, 17159,17160,17161,17162,17163,17164,17165,17166,17167,17168,17169,17170, 17171,17172,17173,17174,17175,17176,17177,17178,17179,17180,17181,17182, 17183,17184,17185,17186,17187,17188,17189,17190,17191,17192,17193,17194, 17195,17196,17197,17198,17199,17200,17201,17202,17203,17204,17205,17206, 17207,17208,17209,17210,17211,17212,17213,17214,17215,17216,17217,17218, 17219,17220,17221,17222,17223,17224,17225,17226,17227,17228,17229,17230, 17231,17232,17233,17234,17235,17236,17237,17238,17239,17240,17241,17242, 17243,17244,17245,17246,17247,17248,17249,17250,17251,17252,17253,17254, 17255,17256,17257,17258,17259,17260,17261,17262,17263,17264,17265,17266, 17267,17268,17269,17270,17271,17272,17273,17274,17275,17276,17277,17278, 17279,17280,17281,17282,17283,17284,17285,17286,17287,17288,17289,17290, 17291,17292,17293,17294,17295,17296,17297,17298,17299,17300,17301,17302, 17303,17304,17305,17306,17307,17308,17309,17310,17311,17312,17313,17314, 17315,17316,17317,17318,17319,17320,17321,17322,17323,17324,17325,17326, 17327,17328,17329,17330,17331,17332,17333,17334,17335,17336,17337,17338, 17339,17340,17341,17342,17343,17344,17345,17346,17347,17348,17349,17350, 17351,17352,17353,17354,17355,17356,17357,17358,17359,17360,17361,17362, 17363,17364,17365,17366,17367,17368,17369,17370,17371,17372,17373,17374, 17375,17376,17377,17378,17379,17380,17381,17382,17383,17384,17385,17386, 17387,17388,17389,17390,17391,17392,17393,17394,17395,17396,17397,17398, 17399,17400,17401,17402,17403,17404,17405,17406,17407,17408,17409,17410, 17411,17412,17413,17414,17415,17416,17417,17418,17419,17420,17421,17422, 17423,17424,17425,17426,17427,17428,17429,17430,17431,17432,17433,17434, 17435,17436,17437,17438,17439,17440,17441,17442,17443,17444,17445,17446, 17447,17448,17449,17450,17451,17452,17453,17454,17455,17456,17457,17458, 17459,17460,17461,17462,17463,17464,17465,17466,17467,17468,17469,17470, 17471,17472,17473,17474,17475,17476,17477,17478,17479,17480,17481,17482, 17483,17484,17485,17486,17487,17488,17489,17490,17491,17492,17493,17494, 17495,17496,17497,17498,17499,17500,17501,17502,17503,17504,17505,17506, 17507,17508,17509,17510,17511,17512,17513,17514,17515,17516,17517,17518, 17519,17520,17521,17522,17523,17524,17525,17526,17527,17528,17529,17530, 17531,17532,17533,17534,17535,17536,17537,17538,17539,17540,17541,17542, 17543,17544,17545,17546,17547,17548,17549,17550,17551,17552,17553,17554, 17555,17556,17557,17558,17559,17560,17561,17562,17563,17564,17565,17566, 17567,17568,17569,17570,17571,17572,17573,17574,17575,17576,17577,17578, 17579,17580,17581,17582,17583,17584,17585,17586,17587,17588,17589,17590, 17591,17592,17593,17594,17595,17596,17597,17598,17599,17600,17601,17602, 17603,17604,17605,17606,17607,17608,17609,17610,17611,17612,17613,17614, 17615,17616,17617,17618,17619,17620,17621,17622,17623,17624,17625,17626, 17627,17628,17629,17630,17631,17632,17633,17634,17635,17636,17637,17638, 17639,17640,17641,17642,17643,17644,17645,17646,17647,17648,17649,17650, 17651,17652,17653,17654,17655,17656,17657,17658,17659,17660,17661,17662, 17663,17664,17665,17666,17667,17668,17669,17670,17671,17672,17673,17674, 17675,17676,17677,17678,17679,17680,17681,17682,17683,17684,17685,17686, 17687,17688,17689,17690,17691,17692,17693,17694,17695,17696,17697,17698, 17699,17700,17701,17702,17703,17704,17705,17706,17707,17708,17709,17710, 17711,17712,17713,17714,17715,17716,17717,17718,17719,17720,17721,17722, 17723,17724,17725,17726,17727,17728,17729,17730,17731,17732,17733,17734, 17735,17736,17737,17738,17739,17740,17741,17742,17743,17744,17745,17746, 17747,17748,17749,17750,17751,17752,17753,17754,17755,17756,17757,17758, 17759,17760,17761,17762,17763,17764,17765,17766,17767,17768,17769,17770, 17771,17772,17773,17774,17775,17776,17777,17778,17779,17780,17781,17782, 17783,17784,17785,17786,17787,17788,17789,17790,17791,17792,17793,17794, 17795,17796,17797,17798,17799,17800,17801,17802,17803,17804,17805,17806, 17807,17808,17809,17810,17811,17812,17813,17814,17815,17816,17817,17818, 17819,17820,17821,17822,17823,17824,17825,17826,17827,17828,17829,17830, 17831,17832,17833,17834,17835,17836,17837,17838,17839,17840,17841,17842, 17843,17844,17845,17846,17847,17848,17849,17850,17851,17852,17853,17854, 17855,17856,17857,17858,17859,17860,17861,17862,17863,17864,17865,17866, 17867,17868,17869,17870,17871,17872,17873,17874,17875,17876,17877,17878, 17879,17880,17881,17882,17883,17884,17885,17886,17887,17888,17889,17890, 17891,17892,17893,17894,17895,17896,17897,17898,17899,17900,17901,17902, 17903,17904,17905,17906,17907,17908,17909,17910,17911,17912,17913,17914, 17915,17916,17917,17918,17919,17920,17921,17922,17923,17924,17925,17926, 17927,17928,17929,17930,17931,17932,17933,17934,17935,17936,17937,17938, 17939,17940,17941,17942,17943,17944,17945,17946,17947,17948,17949,17950, 17951,17952,17953,17954,17955,17956,17957,17958,17959,17960,17961,17962, 17963,17964,17965,17966,17967,17968,17969,17970,17971,17972,17973,17974, 17975,17976,17977,17978,17979,17980,17981,17982,17983,17984,17985,17986, 17987,17988,17989,17990,17991,17992,17993,17994,17995,17996,17997,17998, 17999,18000,18001,18002,18003,18004,18005,18006,18007,18008,18009,18010, 18011,18012,18013,18014,18015,18016,18017,18018,18019,18020,18021,18022, 18023,18024,18025,18026,18027,18028,18029,18030,18031,18032,18033,18034, 18035,18036,18037,18038,18039,18040,18041,18042,18043,18044,18045,18046, 18047,18048,18049,18050,18051,18052,18053,18054,18055,18056,18057,18058, 18059,18060,18061,18062,18063,18064,18065,18066,18067,18068,18069,18070, 18071,18072,18073,18074,18075,18076,18077,18078,18079,18080,18081,18082, 18083,18084,18085,18086,18087,18088,18089,18090,18091,18092,18093,18094, 18095,18096,18097,18098,18099,18100,18101,18102,18103,18104,18105,18106, 18107,18108,18109,18110,18111,18112,18113,18114,18115,18116,18117,18118, 18119,18120,18121,18122,18123,18124,18125,18126,18127,18128,18129,18130, 18131,18132,18133,18134,18135,18136,18137,18138,18139,18140,18141,18142, 18143,18144,18145,18146,18147,18148,18149,18150,18151,18152,18153,18154, 18155,18156,18157,18158,18159,18160,18161,18162,18163,18164,18165,18166, 18167,18168,18169,18170,18171,18172,18173,18174,18175,18176,18177,18178, 18179,18180,18181,18182,18183,18184,18185,18186,18187,18188,18189,18190, 18191,18192,18193,18194,18195,18196,18197,18198,18199,18200,18201,18202, 18203,18204,18205,18206,18207,18208,18209,18210,18211,18212,18213,18214, 18215,18216,18217,18218,18219,18220,18221,18222,18223,18224,18225,18226, 18227,18228,18229,18230,18231,18232,18233,18234,18235,18236,18237,18238, 18239,18240,18241,18242,18243,18244,18245,18246,18247,18248,18249,18250, 18251,18252,18253,18254,18255,18256,18257,18258,18259,18260,18261,18262, 18263,18264,18265,18266,18267,18268,18269,18270,18271,18272,18273,18274, 18275,18276,18277,18278,18279,18280,18281,18282,18283,18284,18285,18286, 18287,18288,18289,18290,18291,18292,18293,18294,18295,18296,18297,18298, 18299,18300,18301,18302,18303,18304,18305,18306,18307,18308,18309,18310, 18311,18312,18313,18314,18315,18316,18317,18318,18319,18320,18321,18322, 18323,18324,18325,18326,18327,18328,18329,18330,18331,18332,18333,18334, 18335,18336,18337,18338,18339,18340,18341,18342,18343,18344,18345,18346, 18347,18348,18349,18350,18351,18352,18353,18354,18355,18356,18357,18358, 18359,18360,18361,18362,18363,18364,18365,18366,18367,18368,18369,18370, 18371,18372,18373,18374,18375,18376,18377,18378,18379,18380,18381,18382, 18383,18384,18385,18386,18387,18388,18389,18390,18391,18392,18393,18394, 18395,18396,18397,18398,18399,18400,18401,18402,18403,18404,18405,18406, 18407,18408,18409,18410,18411,18412,18413,18414,18415,18416,18417,18418, 18419,18420,18421,18422,18423,18424,18425,18426,18427,18428,18429,18430, 18431,18432,18433,18434,18435,18436,18437,18438,18439,18440,18441,18442, 18443,18444,18445,18446,18447,18448,18449,18450,18451,18452,18453,18454, 18455,18456,18457,18458,18459,18460,18461,18462,18463,18464,18465,18466, 18467,18468,18469,18470,18471,18472,18473,18474,18475,18476,18477,18478, 18479,18480,18481,18482,18483,18484,18485,18486,18487,18488,18489,18490, 18491,18492,18493,18494,18495,18496,18497,18498,18499,18500,18501,18502, 18503,18504,18505,18506,18507,18508,18509,18510,18511,18512,18513,18514, 18515,18516,18517,18518,18519,18520,18521,18522,18523,18524,18525,18526, 18527,18528,18529,18530,18531,18532,18533,18534,18535,18536,18537,18538, 18539,18540,18541,18542,18543,18544,18545,18546,18547,18548,18549,18550, 18551,18552,18553,18554,18555,18556,18557,18558,18559,18560,18561,18562, 18563,18564,18565,18566,18567,18568,18569,18570,18571,18572,18573,18574, 18575,18576,18577,18578,18579,18580,18581,18582,18583,18584,18585,18586, 18587,18588,18589,18590,18591,18592,18593,18594,18595,18596,18597,18598, 18599,18600,18601,18602,18603,18604,18605,18606,18607,18608,18609,18610, 18611,18612,18613,18614,18615,18616,18617,18618,18619,18620,18621,18622, 18623,18624,18625,18626,18627,18628,18629,18630,18631,18632,18633,18634, 18635,18636,18637,18638,18639,18640,18641,18642,18643,18644,18645,18646, 18647,18648,18649,18650,18651,18652,18653,18654,18655,18656,18657,18658, 18659,18660,18661,18662,18663,18664,18665,18666,18667,18668,18669,18670, 18671,18672,18673,18674,18675,18676,18677,18678,18679,18680,18681,18682, 18683,18684,18685,18686,18687,18688,18689,18690,18691,18692,18693,18694, 18695,18696,18697,18698,18699,18700,18701,18702,18703,18704,18705,18706, 18707,18708,18709,18710,18711,18712,18713,18714,18715,18716,18717,18718, 18719,18720,18721,18722,18723,18724,18725,18726,18727,18728,18729,18730, 18731,18732,18733,18734,18735,18736,18737,18738,18739,18740,18741,18742, 18743,18744,18745,18746,18747,18748,18749,18750,18751,18752,18753,18754, 18755,18756,18757,18758,18759,18760,18761,18762,18763,18764,18765,18766, 18767,18768,18769,18770,18771,18772,18773,18774,18775,18776,18777,18778, 18779,18780,18781,18782,18783,18784,18785,18786,18787,18788,18789,18790, 18791,18792,18793,18794,18795,18796,18797,18798,18799,18800,18801,18802, 18803,18804,18805,18806,18807,18808,18809,18810,18811,18812,18813,18814, 18815,18816,18817,18818,18819,18820,18821,18822,18823,18824,18825,18826, 18827,18828,18829,18830,18831,18832,18833,18834,18835,18836,18837,18838, 18839,18840,18841,18842,18843,18844,18845,18846,18847,18848,18849,18850, 18851,18852,18853,18854,18855,18856,18857,18858,18859,18860,18861,18862, 18863,18864,18865,18866,18867,18868,18869,18870,18871,18872,18873,18874, 18875,18876,18877,18878,18879,18880,18881,18882,18883,18884,18885,18886, 18887,18888,18889,18890,18891,18892,18893,18894,18895,18896,18897,18898, 18899,18900,18901,18902,18903,18904,18905,18906,18907,18908,18909,18910, 18911,18912,18913,18914,18915,18916,18917,18918,18919,18920,18921,18922, 18923,18924,18925,18926,18927,18928,18929,18930,18931,18932,18933,18934, 18935,18936,18937,18938,18939,18940,18941,18942,18943,18944,18945,18946, 18947,18948,18949,18950,18951,18952,18953,18954,18955,18956,18957,18958, 18959,18960,18961,18962,18963,18964,18965,18966,18967,18968,18969,18970, 18971,18972,18973,18974,18975,18976,18977,18978,18979,18980,18981,18982, 18983,18984,18985,18986,18987,18988,18989,18990,18991,18992,18993,18994, 18995,18996,18997,18998,18999,19000,19001,19002,19003,19004,19005,19006, 19007,19008,19009,19010,19011,19012,19013,19014,19015,19016,19017,19018, 19019,19020,19021,19022,19023,19024,19025,19026,19027,19028,19029,19030, 19031,19032,19033,19034,19035,19036,19037,19038,19039,19040,19041,19042, 19043,19044,19045,19046,19047,19048,19049,19050,19051,19052,19053,19054, 19055,19056,19057,19058,19059,19060,19061,19062,19063,19064,19065,19066, 19067,19068,19069,19070,19071,19072,19073,19074,19075,19076,19077,19078, 19079,19080,19081,19082,19083,19084,19085,19086,19087,19088,19089,19090, 19091,19092,19093,19094,19095,19096,19097,19098,19099,19100,19101,19102, 19103,19104,19105,19106,19107,19108,19109,19110,19111,19112,19113,19114, 19115,19116,19117,19118,19119,19120,19121,19122,19123,19124,19125,19126, 19127,19128,19129,19130,19131,19132,19133,19134,19135,19136,19137,19138, 19139,19140,19141,19142,19143,19144,19145,19146,19147,19148,19149,19150, 19151,19152,19153,19154,19155,19156,19157,19158,19159,19160,19161,19162, 19163,19164,19165,19166,19167,19168,19169,19170,19171,19172,19173,19174, 19175,19176,19177,19178,19179,19180,19181,19182,19183,19184,19185,19186, 19187,19188,19189,19190,19191,19192,19193,19194,19195,19196,19197,19198, 19199,19200,19201,19202,19203,19204,19205,19206,19207,19208,19209,19210, 19211,19212,19213,19214,19215,19216,19217,19218,19219,19220,19221,19222, 19223,19224,19225,19226,19227,19228,19229,19230,19231,19232,19233,19234, 19235,19236,19237,19238,19239,19240,19241,19242,19243,19244,19245,19246, 19247,19248,19249,19250,19251,19252,19253,19254,19255,19256,19257,19258, 19259,19260,19261,19262,19263,19264,19265,19266,19267,19268,19269,19270, 19271,19272,19273,19274,19275,19276,19277,19278,19279,19280,19281,19282, 19283,19284,19285,19286,19287,19288,19289,19290,19291,19292,19293,19294, 19295,19296,19297,19298,19299,19300,19301,19302,19303,19304,19305,19306, 19307,19308,19309,19310,19311,19312,19313,19314,19315,19316,19317,19318, 19319,19320,19321,19322,19323,19324,19325,19326,19327,19328,19329,19330, 19331,19332,19333,19334,19335,19336,19337,19338,19339,19340,19341,19342, 19343,19344,19345,19346,19347,19348,19349,19350,19351,19352,19353,19354, 19355,19356,19357,19358,19359,19360,19361,19362,19363,19364,19365,19366, 19367,19368,19369,19370,19371,19372,19373,19374,19375,19376,19377,19378, 19379,19380,19381,19382,19383,19384,19385,19386,19387,19388,19389,19390, 19391,19392,19393,19394,19395,19396,19397,19398,19399,19400,19401,19402, 19403,19404,19405,19406,19407,19408,19409,19410,19411,19412,19413,19414, 19415,19416,19417,19418,19419,19420,19421,19422,19423,19424,19425,19426, 19427,19428,19429,19430,19431,19432,19433,19434,19435,19436,19437,19438, 19439,19440,19441,19442,19443,19444,19445,19446,19447,19448,19449,19450, 19451,19452,19453,19454,19455,19456,19457,19458,19459,19460,19461,19462, 19463,19464,19465,19466,19467,19468,19469,19470,19471,19472,19473,19474, 19475,19476,19477,19478,19479,19480,19481,19482,19483,19484,19485,19486, 19487,19488,19489,19490,19491,19492,19493,19494,19495,19496,19497,19498, 19499,19500,19501,19502,19503,19504,19505,19506,19507,19508,19509,19510, 19511,19512,19513,19514,19515,19516,19517,19518,19519,19520,19521,19522, 19523,19524,19525,19526,19527,19528,19529,19530,19531,19532,19533,19534, 19535,19536,19537,19538,19539,19540,19541,19542,19543,19544,19545,19546, 19547,19548,19549,19550,19551,19552,19553,19554,19555,19556,19557,19558, 19559,19560,19561,19562,19563,19564,19565,19566,19567,19568,19569,19570, 19571,19572,19573,19574,19575,19576,19577,19578,19579,19580,19581,19582, 19583,19584,19585,19586,19587,19588,19589,19590,19591,19592,19593,19594, 19595,19596,19597,19598,19599,19600,19601,19602,19603,19604,19605,19606, 19607,19608,19609,19610,19611,19612,19613,19614,19615,19616,19617,19618, 19619,19620,19621,19622,19623,19624,19625,19626,19627,19628,19629,19630, 19631,19632,19633,19634,19635,19636,19637,19638,19639,19640,19641,19642, 19643,19644,19645,19646,19647,19648,19649,19650,19651,19652,19653,19654, 19655,19656,19657,19658,19659,19660,19661,19662,19663,19664,19665,19666, 19667,19668,19669,19670,19671,19672,19673,19674,19675,19676,19677,19678, 19679,19680,19681,19682,19683,19684,19685,19686,19687,19688,19689,19690, 19691,19692,19693,19694,19695,19696,19697,19698,19699,19700,19701,19702, 19703,19704,19705,19706,19707,19708,19709,19710,19711,19712,19713,19714, 19715,19716,19717,19718,19719,19720,19721,19722,19723,19724,19725,19726, 19727,19728,19729,19730,19731,19732,19733,19734,19735,19736,19737,19738, 19739,19740,19741,19742,19743,19744,19745,19746,19747,19748,19749,19750, 19751,19752,19753,19754,19755,19756,19757,19758,19759,19760,19761,19762, 19763,19764,19765,19766,19767,19768,19769,19770,19771,19772,19773,19774, 19775,19776,19777,19778,19779,19780,19781,19782,19783,19784,19785,19786, 19787,19788,19789,19790,19791,19792,19793,19794,19795,19796,19797,19798, 19799,19800,19801,19802,19803,19804,19805,19806,19807,19808,19809,19810, 19811,19812,19813,19814,19815,19816,19817,19818,19819,19820,19821,19822, 19823,19824,19825,19826,19827,19828,19829,19830,19831,19832,19833,19834, 19835,19836,19837,19838,19839,19840,19841,19842,19843,19844,19845,19846, 19847,19848,19849,19850,19851,19852,19853,19854,19855,19856,19857,19858, 19859,19860,19861,19862,19863,19864,19865,19866,19867,19868,19869,19870, 19871,19872,19873,19874,19875,19876,19877,19878,19879,19880,19881,19882, 19883,19884,19885,19886,19887,19888,19889,19890,19891,19892,19893,19894, 19895,19896,19897,19898,19899,19900,19901,19902,19903,19904,19905,19906, 19907,19908,19909,19910,19911,19912,19913,19914,19915,19916,19917,19918, 19919,19920,19921,19922,19923,19924,19925,19926,19927,19928,19929,19930, 19931,19932,19933,19934,19935,19936,19937,19938,19939,19940,19941,19942, 19943,19944,19945,19946,19947,19948,19949,19950,19951,19952,19953,19954, 19955,19956,19957,19958,19959,19960,19961,19962,19963,19964,19965,19966, 19967,19968,19969,19970,19971,19972,19973,19974,19975,19976,19977,19978, 19979,19980,19981,19982,19983,19984,19985,19986,19987,19988,19989,19990, 19991,19992,19993,19994,19995,19996,19997,19998,19999,20000,20001,20002, 20003,20004,20005,20006,20007,20008,20009,20010,20011,20012,20013,20014, 20015,20016,20017,20018,20019,20020,20021,20022,20023,20024,20025,20026, 20027,20028,20029,20030,20031,20032,20033,20034,20035,20036,20037,20038, 20039,20040,20041,20042,20043,20044,20045,20046,20047,20048,20049,20050, 20051,20052,20053,20054,20055,20056,20057,20058,20059,20060,20061,20062, 20063,20064,20065,20066,20067,20068,20069,20070,20071,20072,20073,20074, 20075,20076,20077,20078,20079,20080,20081,20082,20083,20084,20085,20086, 20087,20088,20089,20090,20091,20092,20093,20094,20095,20096,20097,20098, 20099,20100,20101,20102,20103,20104,20105,20106,20107,20108,20109,20110, 20111,20112,20113,20114,20115,20116,20117,20118,20119,20120,20121,20122, 20123,20124,20125,20126,20127,20128,20129,20130,20131,20132,20133,20134, 20135,20136,20137,20138,20139,20140,20141,20142,20143,20144,20145,20146, 20147,20148,20149,20150,20151,20152,20153,20154,20155,20156,20157,20158, 20159,20160,20161,20162,20163,20164,20165,20166,20167,20168,20169,20170, 20171,20172,20173,20174,20175,20176,20177,20178,20179,20180,20181,20182, 20183,20184,20185,20186,20187,20188,20189,20190,20191,20192,20193,20194, 20195,20196,20197,20198,20199,20200,20201,20202,20203,20204,20205,20206, 20207,20208,20209,20210,20211,20212,20213,20214,20215,20216,20217,20218, 20219,20220,20221,20222,20223,20224,20225,20226,20227,20228,20229,20230, 20231,20232,20233,20234,20235,20236,20237,20238,20239,20240,20241,20242, 20243,20244,20245,20246,20247,20248,20249,20250,20251,20252,20253,20254, 20255,20256,20257,20258,20259,20260,20261,20262,20263,20264,20265,20266, 20267,20268,20269,20270,20271,20272,20273,20274,20275,20276,20277,20278, 20279,20280,20281,20282,20283,20284,20285,20286,20287,20288,20289,20290, 20291,20292,20293,20294,20295,20296,20297,20298,20299,20300,20301,20302, 20303,20304,20305,20306,20307,20308,20309,20310,20311,20312,20313,20314, 20315,20316,20317,20318,20319,20320,20321,20322,20323,20324,20325,20326, 20327,20328,20329,20330,20331,20332,20333,20334,20335,20336,20337,20338, 20339,20340,20341,20342,20343,20344,20345,20346,20347,20348,20349,20350, 20351,20352,20353,20354,20355,20356,20357,20358,20359,20360,20361,20362, 20363,20364,20365,20366,20367,20368,20369,20370,20371,20372,20373,20374, 20375,20376,20377,20378,20379,20380,20381,20382,20383,20384,20385,20386, 20387,20388,20389,20390,20391,20392,20393,20394,20395,20396,20397,20398, 20399,20400,20401,20402,20403,20404,20405,20406,20407,20408,20409,20410, 20411,20412,20413,20414,20415,20416,20417,20418,20419,20420,20421,20422, 20423,20424,20425,20426,20427,20428,20429,20430,20431,20432,20433,20434, 20435,20436,20437,20438,20439,20440,20441,20442,20443,20444,20445,20446, 20447,20448,20449,20450,20451,20452,20453,20454,20455,20456,20457,20458, 20459,20460,20461,20462,20463,20464,20465,20466,20467,20468,20469,20470, 20471,20472,20473,20474,20475,20476,20477,20478,20479,20480,20481,20482, 20483,20484,20485,20486,20487,20488,20489,20490,20491,20492,20493,20494, 20495,20496,20497,20498,20499,20500,20501,20502,20503,20504,20505,20506, 20507,20508,20509,20510,20511,20512,20513,20514,20515,20516,20517,20518, 20519,20520,20521,20522,20523,20524,20525,20526,20527,20528,20529,20530, 20531,20532,20533,20534,20535,20536,20537,20538,20539,20540,20541,20542, 20543,20544,20545,20546,20547,20548,20549,20550,20551,20552,20553,20554, 20555,20556,20557,20558,20559,20560,20561,20562,20563,20564,20565,20566, 20567,20568,20569,20570,20571,20572,20573,20574,20575,20576,20577,20578, 20579,20580,20581,20582,20583,20584,20585,20586,20587,20588,20589,20590, 20591,20592,20593,20594,20595,20596,20597,20598,20599,20600,20601,20602, 20603,20604,20605,20606,20607,20608,20609,20610,20611,20612,20613,20614, 20615,20616,20617,20618,20619,20620,20621,20622,20623,20624,20625,20626, 20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638, 20639,20640,20641,20642,20643,20644,20645,20646,20647,20648,20649,20650, 20651,20652,20653,20654,20655,20656,20657,20658,20659,20660,20661,20662, 20663,20664,20665,20666,20667,20668,20669,20670,20671,20672,20673,20674, 20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686, 20687,20688,20689,20690,20691,20692,20693,20694,20695,20696,20697,20698, 20699,20700,20701,20702,20703,20704,20705,20706,20707,20708,20709,20710, 20711,20712,20713,20714,20715,20716,20717,20718,20719,20720,20721,20722, 20723,20724,20725,20726,20727,20728,20729,20730,20731,20732,20733,20734, 20735,20736,20737,20738,20739,20740,20741,20742,20743,20744,20745,20746, 20747,20748,20749,20750,20751,20752,20753,20754,20755,20756,20757,20758, 20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,20769,20770, 20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782, 20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794, 20795,20796,20797,20798,20799,20800,20801,20802,20803,20804,20805,20806, 20807,20808,20809,20810,20811,20812,20813,20814,20815,20816,20817,20818, 20819,20820,20821,20822,20823,20824,20825,20826,20827,20828,20829,20830, 20831,20832,20833,20834,20835,20836,20837,20838,20839,20840,20841,20842, 20843,20844,20845,20846,20847,20848,20849,20850,20851,20852,20853,20854, 20855,20856,20857,20858,20859,20860,20861,20862,20863,20864,20865,20866, 20867,20868,20869,20870,20871,20872,20873,20874,20875,20876,20877,20878, 20879,20880,20881,20882,20883,20884,20885,20886,20887,20888,20889,20890, 20891,20892,20893,20894,20895,20896,20897,20898,20899,20900,20901,20902, 20903,20904,20905,20906,20907,20908,20909,20910,20911,20912,20913,20914, 20915,20916,20917,20918,20919,20920,20921,20922,20923,20924,20925,20926, 20927,20928,20929,20930,20931,20932,20933,20934,20935,20936,20937,20938, 20939,20940,20941,20942,20943,20944,20945,20946,20947,20948,20949,20950, 20951,20952,20953,20954,20955,20956,20957,20958,20959,20960,20961,20962, 20963,20964,20965,20966,20967,20968,20969,20970,20971,20972,20973,20974, 20975,20976,20977,20978,20979,20980,20981,20982,20983,20984,20985,20986, 20987,20988,20989,20990,20991,20992,20993,20994,20995,20996,20997,20998, 20999,21000,21001,21002,21003,21004,21005,21006,21007,21008,21009,21010, 21011,21012,21013,21014,21015,21016,21017,21018,21019,21020,21021,21022, 21023,21024,21025,21026,21027,21028,21029,21030,21031,21032,21033,21034, 21035,21036,21037,21038,21039,21040,21041,21042,21043,21044,21045,21046, 21047,21048,21049,21050,21051,21052,21053,21054,21055,21056,21057,21058, 21059,21060,21061,21062,21063,21064,21065,21066,21067,21068,21069,21070, 21071,21072,21073,21074,21075,21076,21077,21078,21079,21080,21081,21082, 21083,21084,21085,21086,21087,21088,21089,21090,21091,21092,21093,21094, 21095,21096,21097,21098,21099,21100,21101,21102,21103,21104,21105,21106, 21107,21108,21109,21110,21111,21112,21113,21114,21115,21116,21117,21118, 21119,21120,21121,21122,21123,21124,21125,21126,21127,21128,21129,21130, 21131,21132,21133,21134,21135,21136,21137,21138,21139,21140,21141,21142, 21143,21144,21145,21146,21147,21148,21149,21150,21151,21152,21153,21154, 21155,21156,21157,21158,21159,21160,21161,21162,21163,21164,21165,21166, 21167,21168,21169,21170,21171,21172,21173,21174,21175,21176,21177,21178, 21179,21180,21181,21182,21183,21184,21185,21186,21187,21188,21189,21190, 21191,21192,21193,21194,21195,21196,21197,21198,21199,21200,21201,21202, 21203,21204,21205,21206,21207,21208,21209,21210,21211,21212,21213,21214, 21215,21216,21217,21218,21219,21220,21221,21222,21223,21224,21225,21226, 21227,21228,21229,21230,21231,21232,21233,21234,21235,21236,21237,21238, 21239,21240,21241,21242,21243,21244,21245,21246,21247,21248,21249,21250, 21251,21252,21253,21254,21255,21256,21257,21258,21259,21260,21261,21262, 21263,21264,21265,21266,21267,21268,21269,21270,21271,21272,21273,21274, 21275,21276,21277,21278,21279,21280,21281,21282,21283,21284,21285,21286, 21287,21288,21289,21290,21291,21292,21293,21294,21295,21296,21297,21298, 21299,21300,21301,21302,21303,21304,21305,21306,21307,21308,21309,21310, 21311,21312,21313,21314,21315,21316,21317,21318,21319,21320,21321,21322, 21323,21324,21325,21326,21327,21328,21329,21330,21331,21332,21333,21334, 21335,21336,21337,21338,21339,21340,21341,21342,21343,21344,21345,21346, 21347,21348,21349,21350,21351,21352,21353,21354,21355,21356,21357,21358, 21359,21360,21361,21362,21363,21364,21365,21366,21367,21368,21369,21370, 21371,21372,21373,21374,21375,21376,21377,21378,21379,21380,21381,21382, 21383,21384,21385,21386,21387,21388,21389,21390,21391,21392,21393,21394, 21395,21396,21397,21398,21399,21400,21401,21402,21403,21404,21405,21406, 21407,21408,21409,21410,21411,21412,21413,21414,21415,21416,21417,21418, 21419,21420,21421,21422,21423,21424,21425,21426,21427,21428,21429,21430, 21431,21432,21433,21434,21435,21436,21437,21438,21439,21440,21441,21442, 21443,21444,21445,21446,21447,21448,21449,21450,21451,21452,21453,21454, 21455,21456,21457,21458,21459,21460,21461,21462,21463,21464,21465,21466, 21467,21468,21469,21470,21471,21472,21473,21474,21475,21476,21477,21478, 21479,21480,21481,21482,21483,21484,21485,21486,21487,21488,21489,21490, 21491,21492,21493,21494,21495,21496,21497,21498,21499,21500,21501,21502, 21503,21504,21505,21506,21507,21508,21509,21510,21511,21512,21513,21514, 21515,21516,21517,21518,21519,21520,21521,21522,21523,21524,21525,21526, 21527,21528,21529,21530,21531,21532,21533,21534,21535,21536,21537,21538, 21539,21540,21541,21542,21543,21544,21545,21546,21547,21548,21549,21550, 21551,21552,21553,21554,21555,21556,21557,21558,21559,21560,21561,21562, 21563,21564,21565,21566,21567,21568,21569,21570,21571,21572,21573,21574, 21575,21576,21577,21578,21579,21580,21581,21582,21583,21584,21585,21586, 21587,21588,21589,21590,21591,21592,21593,21594,21595,21596,21597,21598, 21599,21600,21601,21602,21603,21604,21605,21606,21607,21608,21609,21610, 21611,21612,21613,21614,21615,21616,21617,21618,21619,21620,21621,21622, 21623,21624,21625,21626,21627,21628,21629,21630,21631,21632,21633,21634, 21635,21636,21637,21638,21639,21640,21641,21642,21643,21644,21645,21646, 21647,21648,21649,21650,21651,21652,21653,21654,21655,21656,21657,21658, 21659,21660,21661,21662,21663,21664,21665,21666,21667,21668,21669,21670, 21671,21672,21673,21674,21675,21676,21677,21678,21679,21680,21681,21682, 21683,21684,21685,21686,21687,21688,21689,21690,21691,21692,21693,21694, 21695,21696,21697,21698,21699,21700,21701,21702,21703,21704,21705,21706, 21707,21708,21709,21710,21711,21712,21713,21714,21715,21716,21717,21718, 21719,21720,21721,21722,21723,21724,21725,21726,21727,21728,21729,21730, 21731,21732,21733,21734,21735,21736,21737,21738,21739,21740,21741,21742, 21743,21744,21745,21746,21747,21748,21749,21750,21751,21752,21753,21754, 21755,21756,21757,21758,21759,21760,21761,21762,21763,21764,21765,21766, 21767,21768,21769,21770,21771,21772,21773,21774,21775,21776,21777,21778, 21779,21780,21781,21782,21783,21784,21785,21786,21787,21788,21789,21790, 21791,21792,21793,21794,21795,21796,21797,21798,21799,21800,21801,21802, 21803,21804,21805,21806,21807,21808,21809,21810,21811,21812,21813,21814, 21815,21816,21817,21818,21819,21820,21821,21822,21823,21824,21825,21826, 21827,21828,21829,21830,21831,21832,21833,21834,21835,21836,21837,21838, 21839,21840,21841,21842,21843,21844,21845,21846,21847,21848,21849,21850, 21851,21852,21853,21854,21855,21856,21857,21858,21859,21860,21861,21862, 21863,21864,21865,21866,21867,21868,21869,21870,21871,21872,21873,21874, 21875,21876,21877,21878,21879,21880,21881,21882,21883,21884,21885,21886, 21887,21888,21889,21890,21891,21892,21893,21894,21895,21896,21897,21898, 21899,21900,21901,21902,21903,21904,21905,21906,21907,21908,21909,21910, 21911,21912,21913,21914,21915,21916,21917,21918,21919,21920,21921,21922, 21923,21924,21925,21926,21927,21928,21929,21930,21931,21932,21933,21934, 21935,21936,21937,21938,21939,21940,21941,21942,21943,21944,21945,21946, 21947,21948,21949,21950,21951,21952,21953,21954,21955,21956,21957,21958, 21959,21960,21961,21962,21963,21964,21965,21966,21967,21968,21969,21970, 21971,21972,21973,21974,21975,21976,21977,21978,21979,21980,21981,21982, 21983,21984,21985,21986,21987,21988,21989,21990,21991,21992,21993,21994, 21995,21996,21997,21998,21999,22000,22001,22002,22003,22004,22005,22006, 22007,22008,22009,22010,22011,22012,22013,22014,22015,22016,22017,22018, 22019,22020,22021,22022,22023,22024,22025,22026,22027,22028,22029,22030, 22031,22032,22033,22034,22035,22036,22037,22038,22039,22040,22041,22042, 22043,22044,22045,22046,22047,22048,22049,22050,22051,22052,22053,22054, 22055,22056,22057,22058,22059,22060,22061,22062,22063,22064,22065,22066, 22067,22068,22069,22070,22071,22072,22073,22074,22075,22076,22077,22078, 22079,22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090, 22091,22092,22093,22094,22095,22096,22097,22098,22099,22100,22101,22102, 22103,22104,22105,22106,22107,22108,22109,22110,22111,22112,22113,22114, 22115,22116,22117,22118,22119,22120,22121,22122,22123,22124,22125,22126, 22127,22128,22129,22130,22131,22132,22133,22134,22135,22136,22137,22138, 22139,22140,22141,22142,22143,22144,22145,22146,22147,22148,22149,22150, 22151,22152,22153,22154,22155,22156,22157,22158,22159,22160,22161,22162, 22163,22164,22165,22166,22167,22168,22169,22170,22171,22172,22173,22174, 22175,22176,22177,22178,22179,22180,22181,22182,22183,22184,22185,22186, 22187,22188,22189,22190,22191,22192,22193,22194,22195,22196,22197,22198, 22199,22200,22201,22202,22203,22204,22205,22206,22207,22208,22209,22210, 22211,22212,22213,22214,22215,22216,22217,22218,22219,22220,22221,22222, 22223,22224,22225,22226,22227,22228,22229,22230,22231,22232,22233,22234, 22235,22236,22237,22238,22239,22240,22241,22242,22243,22244,22245,22246, 22247,22248,22249,22250,22251,22252,22253,22254,22255,22256,22257,22258, 22259,22260,22261,22262,22263,22264,22265,22266,22267,22268,22269,22270, 22271,22272,22273,22274,22275,22276,22277,22278,22279,22280,22281,22282, 22283,22284,22285,22286,22287,22288,22289,22290,22291,22292,22293,22294, 22295,22296,22297,22298,22299,22300,22301,22302,22303,22304,22305,22306, 22307,22308,22309,22310,22311,22312,22313,22314,22315,22316,22317,22318, 22319,22320,22321,22322,22323,22324,22325,22326,22327,22328,22329,22330, 22331,22332,22333,22334,22335,22336,22337,22338,22339,22340,22341,22342, 22343,22344,22345,22346,22347,22348,22349,22350,22351,22352,22353,22354, 22355,22356,22357,22358,22359,22360,22361,22362,22363,22364,22365,22366, 22367,22368,22369,22370,22371,22372,22373,22374,22375,22376,22377,22378, 22379,22380,22381,22382,22383,22384,22385,22386,22387,22388,22389,22390, 22391,22392,22393,22394,22395,22396,22397,22398,22399,22400,22401,22402, 22403,22404,22405,22406,22407,22408,22409,22410,22411,22412,22413,22414, 22415,22416,22417,22418,22419,22420,22421,22422,22423,22424,22425,22426, 22427,22428,22429,22430,22431,22432,22433,22434,22435,22436,22437,22438, 22439,22440,22441,22442,22443,22444,22445,22446,22447,22448,22449,22450, 22451,22452,22453,22454,22455,22456,22457,22458,22459,22460,22461,22462, 22463,22464,22465,22466,22467,22468,22469,22470,22471,22472,22473,22474, 22475,22476,22477,22478,22479,22480,22481,22482,22483,22484,22485,22486, 22487,22488,22489,22490,22491,22492,22493,22494,22495,22496,22497,22498, 22499,22500,22501,22502,22503,22504,22505,22506,22507,22508,22509,22510, 22511,22512,22513,22514,22515,22516,22517,22518,22519,22520,22521,22522, 22523,22524,22525,22526,22527,22528,22529,22530,22531,22532,22533,22534, 22535,22536,22537,22538,22539,22540,22541,22542,22543,22544,22545,22546, 22547,22548,22549,22550,22551,22552,22553,22554,22555,22556,22557,22558, 22559,22560,22561,22562,22563,22564,22565,22566,22567,22568,22569,22570, 22571,22572,22573,22574,22575,22576,22577,22578,22579,22580,22581,22582, 22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594, 22595,22596,22597,22598,22599,22600,22601,22602,22603,22604,22605,22606, 22607,22608,22609,22610,22611,22612,22613,22614,22615,22616,22617,22618, 22619,22620,22621,22622,22623,22624,22625,22626,22627,22628,22629,22630, 22631,22632,22633,22634,22635,22636,22637,22638,22639,22640,22641,22642, 22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,22654, 22655,22656,22657,22658,22659,22660,22661,22662,22663,22664,22665,22666, 22667,22668,22669,22670,22671,22672,22673,22674,22675,22676,22677,22678, 22679,22680,22681,22682,22683,22684,22685,22686,22687,22688,22689,22690, 22691,22692,22693,22694,22695,22696,22697,22698,22699,22700,22701,22702, 22703,22704,22705,22706,22707,22708,22709,22710,22711,22712,22713,22714, 22715,22716,22717,22718,22719,22720,22721,22722,22723,22724,22725,22726, 22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22737,22738, 22739,22740,22741,22742,22743,22744,22745,22746,22747,22748,22749,22750, 22751,22752,22753,22754,22755,22756,22757,22758,22759,22760,22761,22762, 22763,22764,22765,22766,22767,22768,22769,22770,22771,22772,22773,22774, 22775,22776,22777,22778,22779,22780,22781,22782,22783,22784,22785,22786, 22787,22788,22789,22790,22791,22792,22793,22794,22795,22796,22797,22798, 22799,22800,22801,22802,22803,22804,22805,22806,22807,22808,22809,22810, 22811,22812,22813,22814,22815,22816,22817,22818,22819,22820,22821,22822, 22823,22824,22825,22826,22827,22828,22829,22830,22831,22832,22833,22834, 22835,22836,22837,22838,22839,22840,22841,22842,22843,22844,22845,22846, 22847,22848,22849,22850,22851,22852,22853,22854,22855,22856,22857,22858, 22859,22860,22861,22862,22863,22864,22865,22866,22867,22868,22869,22870, 22871,22872,22873,22874,22875,22876,22877,22878,22879,22880,22881,22882, 22883,22884,22885,22886,22887,22888,22889,22890,22891,22892,22893,22894, 22895,22896,22897,22898,22899,22900,22901,22902,22903,22904,22905,22906, 22907,22908,22909,22910,22911,22912,22913,22914,22915,22916,22917,22918, 22919,22920,22921,22922,22923,22924,22925,22926,22927,22928,22929,22930, 22931,22932,22933,22934,22935,22936,22937,22938,22939,22940,22941,22942, 22943,22944,22945,22946,22947,22948,22949,22950,22951,22952,22953,22954, 22955,22956,22957,22958,22959,22960,22961,22962,22963,22964,22965,22966, 22967,22968,22969,22970,22971,22972,22973,22974,22975,22976,22977,22978, 22979,22980,22981,22982,22983,22984,22985,22986,22987,22988,22989,22990, 22991,22992,22993,22994,22995,22996,22997,22998,22999,23000,23001,23002, 23003,23004,23005,23006,23007,23008,23009,23010,23011,23012,23013,23014, 23015,23016,23017,23018,23019,23020,23021,23022,23023,23024,23025,23026, 23027,23028,23029,23030,23031,23032,23033,23034,23035,23036,23037,23038, 23039,23040,23041,23042,23043,23044,23045,23046,23047,23048,23049,23050, 23051,23052,23053,23054,23055,23056,23057,23058,23059,23060,23061,23062, 23063,23064,23065,23066,23067,23068,23069,23070,23071,23072,23073,23074, 23075,23076,23077,23078,23079,23080,23081,23082,23083,23084,23085,23086, 23087,23088,23089,23090,23091,23092,23093,23094,23095,23096,23097,23098, 23099,23100,23101,23102,23103,23104,23105,23106,23107,23108,23109,23110, 23111,23112,23113,23114,23115,23116,23117,23118,23119,23120,23121,23122, 23123,23124,23125,23126,23127,23128,23129,23130,23131,23132,23133,23134, 23135,23136,23137,23138,23139,23140,23141,23142,23143,23144,23145,23146, 23147,23148,23149,23150,23151,23152,23153,23154,23155,23156,23157,23158, 23159,23160,23161,23162,23163,23164,23165,23166,23167,23168,23169,23170, 23171,23172,23173,23174,23175,23176,23177,23178,23179,23180,23181,23182, 23183,23184,23185,23186,23187,23188,23189,23190,23191,23192,23193,23194, 23195,23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206, 23207,23208,23209,23210,23211,23212,23213,23214,23215,23216,23217,23218, 23219,23220,23221,23222,23223,23224,23225,23226,23227,23228,23229,23230, 23231,23232,23233,23234,23235,23236,23237,23238,23239,23240,23241,23242, 23243,23244,23245,23246,23247,23248,23249,23250,23251,23252,23253,23254, 23255,23256,23257,23258,23259,23260,23261,23262,23263,23264,23265,23266, 23267,23268,23269,23270,23271,23272,23273,23274,23275,23276,23277,23278, 23279,23280,23281,23282,23283,23284,23285,23286,23287,23288,23289,23290, 23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,23301,23302, 23303,23304,23305,23306,23307,23308,23309,23310,23311,23312,23313,23314, 23315,23316,23317,23318,23319,23320,23321,23322,23323,23324,23325,23326, 23327,23328,23329,23330,23331,23332,23333,23334,23335,23336,23337,23338, 23339,23340,23341,23342,23343,23344,23345,23346,23347,23348,23349,23350, 23351,23352,23353,23354,23355,23356,23357,23358,23359,23360,23361,23362, 23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374, 23375,23376,23377,23378,23379,23380,23381,23382,23383,23384,23385,23386, 23387,23388,23389,23390,23391,23392,23393,23394,23395,23396,23397,23398, 23399,23400,23401,23402,23403,23404,23405,23406,23407,23408,23409,23410, 23411,23412,23413,23414,23415,23416,23417,23418,23419,23420,23421,23422, 23423,23424,23425,23426,23427,23428,23429,23430,23431,23432,23433,23434, 23435,23436,23437,23438,23439,23440,23441,23442,23443,23444,23445,23446, 23447,23448,23449,23450,23451,23452,23453,23454,23455,23456,23457,23458, 23459,23460,23461,23462,23463,23464,23465,23466,23467,23468,23469,23470, 23471,23472,23473,23474,23475,23476,23477,23478,23479,23480,23481,23482, 23483,23484,23485,23486,23487,23488,23489,23490,23491,23492,23493,23494, 23495,23496,23497,23498,23499,23500,23501,23502,23503,23504,23505,23506, 23507,23508,23509,23510,23511,23512,23513,23514,23515,23516,23517,23518, 23519,23520,23521,23522,23523,23524,23525,23526,23527,23528,23529,23530, 23531,23532,23533,23534,23535,23536,23537,23538,23539,23540,23541,23542, 23543,23544,23545,23546,23547,23548,23549,23550,23551,23552,23553,23554, 23555,23556,23557,23558,23559,23560,23561,23562,23563,23564,23565,23566, 23567,23568,23569,23570,23571,23572,23573,23574,23575,23576,23577,23578, 23579,23580,23581,23582,23583,23584,23585,23586,23587,23588,23589,23590, 23591,23592,23593,23594,23595,23596,23597,23598,23599,23600,23601,23602, 23603,23604,23605,23606,23607,23608,23609,23610,23611,23612,23613,23614, 23615,23616,23617,23618,23619,23620,23621,23622,23623,23624,23625,23626, 23627,23628,23629,23630,23631,23632,23633,23634,23635,23636,23637,23638, 23639,23640,23641,23642,23643,23644,23645,23646,23647,23648,23649,23650, 23651,23652,23653,23654,23655,23656,23657,23658,23659,23660,23661,23662, 23663,23664,23665,23666,23667,23668,23669,23670,23671,23672,23673,23674, 23675,23676,23677,23678,23679,23680,23681,23682,23683,23684,23685,23686, 23687,23688,23689,23690,23691,23692,23693,23694,23695,23696,23697,23698, 23699,23700,23701,23702,23703,23704,23705,23706,23707,23708,23709,23710, 23711,23712,23713,23714,23715,23716,23717,23718,23719,23720,23721,23722, 23723,23724,23725,23726,23727,23728,23729,23730,23731,23732,23733,23734, 23735,23736,23737,23738,23739,23740,23741,23742,23743,23744,23745,23746, 23747,23748,23749,23750,23751,23752,23753,23754,23755,23756,23757,23758, 23759,23760,23761,23762,23763,23764,23765,23766,23767,23768,23769,23770, 23771,23772,23773,23774,23775,23776,23777,23778,23779,23780,23781,23782, 23783,23784,23785,23786,23787,23788,23789,23790,23791,23792,23793,23794, 23795,23796,23797,23798,23799,23800,23801,23802,23803,23804,23805,23806, 23807,23808,23809,23810,23811,23812,23813,23814,23815,23816,23817,23818, 23819,23820,23821,23822,23823,23824,23825,23826,23827,23828,23829,23830, 23831,23832,23833,23834,23835,23836,23837,23838,23839,23840,23841,23842, 23843,23844,23845,23846,23847,23848,23849,23850,23851,23852,23853,23854, 23855,23856,23857,23858,23859,23860,23861,23862,23863,23864,23865,23866, 23867,23868,23869,23870,23871,23872,23873,23874,23875,23876,23877,23878, 23879,23880,23881,23882,23883,23884,23885,23886,23887,23888,23889,23890, 23891,23892,23893,23894,23895,23896,23897,23898,23899,23900,23901,23902, 23903,23904,23905,23906,23907,23908,23909,23910,23911,23912,23913,23914, 23915,23916,23917,23918,23919,23920,23921,23922,23923,23924,23925,23926, 23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23938, 23939,23940,23941,23942,23943,23944,23945,23946,23947,23948,23949,23950, 23951,23952,23953,23954,23955,23956,23957,23958,23959,23960,23961,23962, 23963,23964,23965,23966,23967,23968,23969,23970,23971,23972,23973,23974, 23975,23976,23977,23978,23979,23980,23981,23982,23983,23984,23985,23986, 23987,23988,23989,23990,23991,23992,23993,23994,23995,23996,23997,23998, 23999,24000,24001,24002,24003,24004,24005,24006,24007,24008,24009,24010, 24011,24012,24013,24014,24015,24016,24017,24018,24019,24020,24021,24022, 24023,24024,24025,24026,24027,24028,24029,24030,24031,24032,24033,24034, 24035,24036,24037,24038,24039,24040,24041,24042,24043,24044,24045,24046, 24047,24048,24049,24050,24051,24052,24053,24054,24055,24056,24057,24058, 24059,24060,24061,24062,24063,24064,24065,24066,24067,24068,24069,24070, 24071,24072,24073,24074,24075,24076,24077,24078,24079,24080,24081,24082, 24083,24084,24085,24086,24087,24088,24089,24090,24091,24092,24093,24094, 24095,24096,24097,24098,24099,24100,24101,24102,24103,24104,24105,24106, 24107,24108,24109,24110,24111,24112,24113,24114,24115,24116,24117,24118, 24119,24120,24121,24122,24123,24124,24125,24126,24127,24128,24129,24130, 24131,24132,24133,24134,24135,24136,24137,24138,24139,24140,24141,24142, 24143,24144,24145,24146,24147,24148,24149,24150,24151,24152,24153,24154, 24155,24156,24157,24158,24159,24160,24161,24162,24163,24164,24165,24166, 24167,24168,24169,24170,24171,24172,24173,24174,24175,24176,24177,24178, 24179,24180,24181,24182,24183,24184,24185,24186,24187,24188,24189,24190, 24191,24192,24193,24194,24195,24196,24197,24198,24199,24200,24201,24202, 24203,24204,24205,24206,24207,24208,24209,24210,24211,24212,24213,24214, 24215,24216,24217,24218,24219,24220,24221,24222,24223,24224,24225,24226, 24227,24228,24229,24230,24231,24232,24233,24234,24235,24236,24237,24238, 24239,24240,24241,24242,24243,24244,24245,24246,24247,24248,24249,24250, 24251,24252,24253,24254,24255,24256,24257,24258,24259,24260,24261,24262, 24263,24264,24265,24266,24267,24268,24269,24270,24271,24272,24273,24274, 24275,24276,24277,24278,24279,24280,24281,24282,24283,24284,24285,24286, 24287,24288,24289,24290,24291,24292,24293,24294,24295,24296,24297,24298, 24299,24300,24301,24302,24303,24304,24305,24306,24307,24308,24309,24310, 24311,24312,24313,24314,24315,24316,24317,24318,24319,24320,24321,24322, 24323,24324,24325,24326,24327,24328,24329,24330,24331,24332,24333,24334, 24335,24336,24337,24338,24339,24340,24341,24342,24343,24344,24345,24346, 24347,24348,24349,24350,24351,24352,24353,24354,24355,24356,24357,24358, 24359,24360,24361,24362,24363,24364,24365,24366,24367,24368,24369,24370, 24371,24372,24373,24374,24375,24376,24377,24378,24379,24380,24381,24382, 24383,24384,24385,24386,24387,24388,24389,24390,24391,24392,24393,24394, 24395,24396,24397,24398,24399,24400,24401,24402,24403,24404,24405,24406, 24407,24408,24409,24410,24411,24412,24413,24414,24415,24416,24417,24418, 24419,24420,24421,24422,24423,24424,24425,24426,24427,24428,24429,24430, 24431,24432,24433,24434,24435,24436,24437,24438,24439,24440,24441,24442, 24443,24444,24445,24446,24447,24448,24449,24450,24451,24452,24453,24454, 24455,24456,24457,24458,24459,24460,24461,24462,24463,24464,24465,24466, 24467,24468,24469,24470,24471,24472,24473,24474,24475,24476,24477,24478, 24479,24480,24481,24482,24483,24484,24485,24486,24487,24488,24489,24490, 24491,24492,24493,24494,24495,24496,24497,24498,24499,24500,24501,24502, 24503,24504,24505,24506,24507,24508,24509,24510,24511,24512,24513,24514, 24515,24516,24517,24518,24519,24520,24521,24522,24523,24524,24525,24526, 24527,24528,24529,24530,24531,24532,24533,24534,24535,24536,24537,24538, 24539,24540,24541,24542,24543,24544,24545,24546,24547,24548,24549,24550, 24551,24552,24553,24554,24555,24556,24557,24558,24559,24560,24561,24562, 24563,24564,24565,24566,24567,24568,24569,24570,24571,24572,24573,24574, 24575,24576,24577,24578,24579,24580,24581,24582,24583,24584,24585,24586, 24587,24588,24589,24590,24591,24592,24593,24594,24595,24596,24597,24598, 24599,24600,24601,24602,24603,24604,24605,24606,24607,24608,24609,24610, 24611,24612,24613,24614,24615,24616,24617,24618,24619,24620,24621,24622, 24623,24624,24625,24626,24627,24628,24629,24630,24631,24632,24633,24634, 24635,24636,24637,24638,24639,24640,24641,24642,24643,24644,24645,24646, 24647,24648,24649,24650,24651,24652,24653,24654,24655,24656,24657,24658, 24659,24660,24661,24662,24663,24664,24665,24666,24667,24668,24669,24670, 24671,24672,24673,24674,24675,24676,24677,24678,24679,24680,24681,24682, 24683,24684,24685,24686,24687,24688,24689,24690,24691,24692,24693,24694, 24695,24696,24697,24698,24699,24700,24701,24702,24703,24704,24705,24706, 24707,24708,24709,24710,24711,24712,24713,24714,24715,24716,24717,24718, 24719,24720,24721,24722,24723,24724,24725,24726,24727,24728,24729,24730, 24731,24732,24733,24734,24735,24736,24737,24738,24739,24740,24741,24742, 24743,24744,24745,24746,24747,24748,24749,24750,24751,24752,24753,24754, 24755,24756,24757,24758,24759,24760,24761,24762,24763,24764,24765,24766, 24767,24768,24769,24770,24771,24772,24773,24774,24775,24776,24777,24778, 24779,24780,24781,24782,24783,24784,24785,24786,24787,24788,24789,24790, 24791,24792,24793,24794,24795,24796,24797,24798,24799,24800,24801,24802, 24803,24804,24805,24806,24807,24808,24809,24810,24811,24812,24813,24814, 24815,24816,24817,24818,24819,24820,24821,24822,24823,24824,24825,24826, 24827,24828,24829,24830,24831,24832,24833,24834,24835,24836,24837,24838, 24839,24840,24841,24842,24843,24844,24845,24846,24847,24848,24849,24850, 24851,24852,24853,24854,24855,24856,24857,24858,24859,24860,24861,24862, 24863,24864,24865,24866,24867,24868,24869,24870,24871,24872,24873,24874, 24875,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886, 24887,24888,24889,24890,24891,24892,24893,24894,24895,24896,24897,24898, 24899,24900,24901,24902,24903,24904,24905,24906,24907,24908,24909,24910, 24911,24912,24913,24914,24915,24916,24917,24918,24919,24920,24921,24922, 24923,24924,24925,24926,24927,24928,24929,24930,24931,24932,24933,24934, 24935,24936,24937,24938,24939,24940,24941,24942,24943,24944,24945,24946, 24947,24948,24949,24950,24951,24952,24953,24954,24955,24956,24957,24958, 24959,24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970, 24971,24972,24973,24974,24975,24976,24977,24978,24979,24980,24981,24982, 24983,24984,24985,24986,24987,24988,24989,24990,24991,24992,24993,24994, 24995,24996,24997,24998,24999,25000,25001,25002,25003,25004,25005,25006, 25007,25008,25009,25010,25011,25012,25013,25014,25015,25016,25017,25018, 25019,25020,25021,25022,25023,25024,25025,25026,25027,25028,25029,25030, 25031,25032,25033,25034,25035,25036,25037,25038,25039,25040,25041,25042, 25043,25044,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054, 25055,25056,25057,25058,25059,25060,25061,25062,25063,25064,25065,25066, 25067,25068,25069,25070,25071,25072,25073,25074,25075,25076,25077,25078, 25079,25080,25081,25082,25083,25084,25085,25086,25087,25088,25089,25090, 25091,25092,25093,25094,25095,25096,25097,25098,25099,25100,25101,25102, 25103,25104,25105,25106,25107,25108,25109,25110,25111,25112,25113,25114, 25115,25116,25117,25118,25119,25120,25121,25122,25123,25124,25125,25126, 25127,25128,25129,25130,25131,25132,25133,25134,25135,25136,25137,25138, 25139,25140,25141,25142,25143,25144,25145,25146,25147,25148,25149,25150, 25151,25152,25153,25154,25155,25156,25157,25158,25159,25160,25161,25162, 25163,25164,25165,25166,25167,25168,25169,25170,25171,25172,25173,25174, 25175,25176,25177,25178,25179,25180,25181,25182,25183,25184,25185,25186, 25187,25188,25189,25190,25191,25192,25193,25194,25195,25196,25197,25198, 25199,25200,25201,25202,25203,25204,25205,25206,25207,25208,25209,25210, 25211,25212,25213,25214,25215,25216,25217,25218,25219,25220,25221,25222, 25223,25224,25225,25226,25227,25228,25229,25230,25231,25232,25233,25234, 25235,25236,25237,25238,25239,25240,25241,25242,25243,25244,25245,25246, 25247,25248,25249,25250,25251,25252,25253,25254,25255,25256,25257,25258, 25259,25260,25261,25262,25263,25264,25265,25266,25267,25268,25269,25270, 25271,25272,25273,25274,25275,25276,25277,25278,25279,25280,25281,25282, 25283,25284,25285,25286,25287,25288,25289,25290,25291,25292,25293,25294, 25295,25296,25297,25298,25299,25300,25301,25302,25303,25304,25305,25306, 25307,25308,25309,25310,25311,25312,25313,25314,25315,25316,25317,25318, 25319,25320,25321,25322,25323,25324,25325,25326,25327,25328,25329,25330, 25331,25332,25333,25334,25335,25336,25337,25338,25339,25340,25341,25342, 25343,25344,25345,25346,25347,25348,25349,25350,25351,25352,25353,25354, 25355,25356,25357,25358,25359,25360,25361,25362,25363,25364,25365,25366, 25367,25368,25369,25370,25371,25372,25373,25374,25375,25376,25377,25378, 25379,25380,25381,25382,25383,25384,25385,25386,25387,25388,25389,25390, 25391,25392,25393,25394,25395,25396,25397,25398,25399,25400,25401,25402, 25403,25404,25405,25406,25407,25408,25409,25410,25411,25412,25413,25414, 25415,25416,25417,25418,25419,25420,25421,25422,25423,25424,25425,25426, 25427,25428,25429,25430,25431,25432,25433,25434,25435,25436,25437,25438, 25439,25440,25441,25442,25443,25444,25445,25446,25447,25448,25449,25450, 25451,25452,25453,25454,25455,25456,25457,25458,25459,25460,25461,25462, 25463,25464,25465,25466,25467,25468,25469,25470,25471,25472,25473,25474, 25475,25476,25477,25478,25479,25480,25481,25482,25483,25484,25485,25486, 25487,25488,25489,25490,25491,25492,25493,25494,25495,25496,25497,25498, 25499,25500,25501,25502,25503,25504,25505,25506,25507,25508,25509,25510, 25511,25512,25513,25514,25515,25516,25517,25518,25519,25520,25521,25522, 25523,25524,25525,25526,25527,25528,25529,25530,25531,25532,25533,25534, 25535,25536,25537,25538,25539,25540,25541,25542,25543,25544,25545,25546, 25547,25548,25549,25550,25551,25552,25553,25554,25555,25556,25557,25558, 25559,25560,25561,25562,25563,25564,25565,25566,25567,25568,25569,25570, 25571,25572,25573,25574,25575,25576,25577,25578,25579,25580,25581,25582, 25583,25584,25585,25586,25587,25588,25589,25590,25591,25592,25593,25594, 25595,25596,25597,25598,25599,25600,25601,25602,25603,25604,25605,25606, 25607,25608,25609,25610,25611,25612,25613,25614,25615,25616,25617,25618, 25619,25620,25621,25622,25623,25624,25625,25626,25627,25628,25629,25630, 25631,25632,25633,25634,25635,25636,25637,25638,25639,25640,25641,25642, 25643,25644,25645,25646,25647,25648,25649,25650,25651,25652,25653,25654, 25655,25656,25657,25658,25659,25660,25661,25662,25663,25664,25665,25666, 25667,25668,25669,25670,25671,25672,25673,25674,25675,25676,25677,25678, 25679,25680,25681,25682,25683,25684,25685,25686,25687,25688,25689,25690, 25691,25692,25693,25694,25695,25696,25697,25698,25699,25700,25701,25702, 25703,25704,25705,25706,25707,25708,25709,25710,25711,25712,25713,25714, 25715,25716,25717,25718,25719,25720,25721,25722,25723,25724,25725,25726, 25727,25728,25729,25730,25731,25732,25733,25734,25735,25736,25737,25738, 25739,25740,25741,25742,25743,25744,25745,25746,25747,25748,25749,25750, 25751,25752,25753,25754,25755,25756,25757,25758,25759,25760,25761,25762, 25763,25764,25765,25766,25767,25768,25769,25770,25771,25772,25773,25774, 25775,25776,25777,25778,25779,25780,25781,25782,25783,25784,25785,25786, 25787,25788,25789,25790,25791,25792,25793,25794,25795,25796,25797,25798, 25799,25800,25801,25802,25803,25804,25805,25806,25807,25808,25809,25810, 25811,25812,25813,25814,25815,25816,25817,25818,25819,25820,25821,25822, 25823,25824,25825,25826,25827,25828,25829,25830,25831,25832,25833,25834, 25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846, 25847,25848,25849,25850,25851,25852,25853,25854,25855,25856,25857,25858, 25859,25860,25861,25862,25863,25864,25865,25866,25867,25868,25869,25870, 25871,25872,25873,25874,25875,25876,25877,25878,25879,25880,25881,25882, 25883,25884,25885,25886,25887,25888,25889,25890,25891,25892,25893,25894, 25895,25896,25897,25898,25899,25900,25901,25902,25903,25904,25905,25906, 25907,25908,25909,25910,25911,25912,25913,25914,25915,25916,25917,25918, 25919,25920,25921,25922,25923,25924,25925,25926,25927,25928,25929,25930, 25931,25932,25933,25934,25935,25936,25937,25938,25939,25940,25941,25942, 25943,25944,25945,25946,25947,25948,25949,25950,25951,25952,25953,25954, 25955,25956,25957,25958,25959,25960,25961,25962,25963,25964,25965,25966, 25967,25968,25969,25970,25971,25972,25973,25974,25975,25976,25977,25978, 25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990, 25991,25992,25993,25994,25995,25996,25997,25998,25999,26000,26001,26002, 26003,26004,26005,26006,26007,26008,26009,26010,26011,26012,26013,26014, 26015,26016,26017,26018,26019,26020,26021,26022,26023,26024,26025,26026, 26027,26028,26029,26030,26031,26032,26033,26034,26035,26036,26037,26038, 26039,26040,26041,26042,26043,26044,26045,26046,26047,26048,26049,26050, 26051,26052,26053,26054,26055,26056,26057,26058,26059,26060,26061,26062, 26063,26064,26065,26066,26067,26068,26069,26070,26071,26072,26073,26074, 26075,26076,26077,26078,26079,26080,26081,26082,26083,26084,26085,26086, 26087,26088,26089,26090,26091,26092,26093,26094,26095,26096,26097,26098, 26099,26100,26101,26102,26103,26104,26105,26106,26107,26108,26109,26110, 26111,26112,26113,26114,26115,26116,26117,26118,26119,26120,26121,26122, 26123,26124,26125,26126,26127,26128,26129,26130,26131,26132,26133,26134, 26135,26136,26137,26138,26139,26140,26141,26142,26143,26144,26145,26146, 26147,26148,26149,26150,26151,26152,26153,26154,26155,26156,26157,26158, 26159,26160,26161,26162,26163,26164,26165,26166,26167,26168,26169,26170, 26171,26172,26173,26174,26175,26176,26177,26178,26179,26180,26181,26182, 26183,26184,26185,26186,26187,26188,26189,26190,26191,26192,26193,26194, 26195,26196,26197,26198,26199,26200,26201,26202,26203,26204,26205,26206, 26207,26208,26209,26210,26211,26212,26213,26214,26215,26216,26217,26218, 26219,26220,26221,26222,26223,26224,26225,26226,26227,26228,26229,26230, 26231,26232,26233,26234,26235,26236,26237,26238,26239,26240,26241,26242, 26243,26244,26245,26246,26247,26248,26249,26250,26251,26252,26253,26254, 26255,26256,26257,26258,26259,26260,26261,26262,26263,26264,26265,26266, 26267,26268,26269,26270,26271,26272,26273,26274,26275,26276,26277,26278, 26279,26280,26281,26282,26283,26284,26285,26286,26287,26288,26289,26290, 26291,26292,26293,26294,26295,26296,26297,26298,26299,26300,26301,26302, 26303,26304,26305,26306,26307,26308,26309,26310,26311,26312,26313,26314, 26315,26316,26317,26318,26319,26320,26321,26322,26323,26324,26325,26326, 26327,26328,26329,26330,26331,26332,26333,26334,26335,26336,26337,26338, 26339,26340,26341,26342,26343,26344,26345,26346,26347,26348,26349,26350, 26351,26352,26353,26354,26355,26356,26357,26358,26359,26360,26361,26362, 26363,26364,26365,26366,26367,26368,26369,26370,26371,26372,26373,26374, 26375,26376,26377,26378,26379,26380,26381,26382,26383,26384,26385,26386, 26387,26388,26389,26390,26391,26392,26393,26394,26395,26396,26397,26398, 26399,26400,26401,26402,26403,26404,26405,26406,26407,26408,26409,26410, 26411,26412,26413,26414,26415,26416,26417,26418,26419,26420,26421,26422, 26423,26424,26425,26426,26427,26428,26429,26430,26431,26432,26433,26434, 26435,26436,26437,26438,26439,26440,26441,26442,26443,26444,26445,26446, 26447,26448,26449,26450,26451,26452,26453,26454,26455,26456,26457,26458, 26459,26460,26461,26462,26463,26464,26465,26466,26467,26468,26469,26470, 26471,26472,26473,26474,26475,26476,26477,26478,26479,26480,26481,26482, 26483,26484,26485,26486,26487,26488,26489,26490,26491,26492,26493,26494, 26495,26496,26497,26498,26499,26500,26501,26502,26503,26504,26505,26506, 26507,26508,26509,26510,26511,26512,26513,26514,26515,26516,26517,26518, 26519,26520,26521,26522,26523,26524,26525,26526,26527,26528,26529,26530, 26531,26532,26533,26534,26535,26536,26537,26538,26539,26540,26541,26542, 26543,26544,26545,26546,26547,26548,26549,26550,26551,26552,26553,26554, 26555,26556,26557,26558,26559,26560,26561,26562,26563,26564,26565,26566, 26567,26568,26569,26570,26571,26572,26573,26574,26575,26576,26577,26578, 26579,26580,26581,26582,26583,26584,26585,26586,26587,26588,26589,26590, 26591,26592,26593,26594,26595,26596,26597,26598,26599,26600,26601,26602, 26603,26604,26605,26606,26607,26608,26609,26610,26611,26612,26613,26614, 26615,26616,26617,26618,26619,26620,26621,26622,26623,26624,26625,26626, 26627,26628,26629,26630,26631,26632,26633,26634,26635,26636,26637,26638, 26639,26640,26641,26642,26643,26644,26645,26646,26647,26648,26649,26650, 26651,26652,26653,26654,26655,26656,26657,26658,26659,26660,26661,26662, 26663,26664,26665,26666,26667,26668,26669,26670,26671,26672,26673,26674, 26675,26676,26677,26678,26679,26680,26681,26682,26683,26684,26685,26686, 26687,26688,26689,26690,26691,26692,26693,26694,26695,26696,26697,26698, 26699,26700,26701,26702,26703,26704,26705,26706,26707,26708,26709,26710, 26711,26712,26713,26714,26715,26716,26717,26718,26719,26720,26721,26722, 26723,26724,26725,26726,26727,26728,26729,26730,26731,26732,26733,26734, 26735,26736,26737,26738,26739,26740,26741,26742,26743,26744,26745,26746, 26747,26748,26749,26750,26751,26752,26753,26754,26755,26756,26757,26758, 26759,26760,26761,26762,26763,26764,26765,26766,26767,26768,26769,26770, 26771,26772,26773,26774,26775,26776,26777,26778,26779,26780,26781,26782, 26783,26784,26785,26786,26787,26788,26789,26790,26791,26792,26793,26794, 26795,26796,26797,26798,26799,26800,26801,26802,26803,26804,26805,26806, 26807,26808,26809,26810,26811,26812,26813,26814,26815,26816,26817,26818, 26819,26820,26821,26822,26823,26824,26825,26826,26827,26828,26829,26830, 26831,26832,26833,26834,26835,26836,26837,26838,26839,26840,26841,26842, 26843,26844,26845,26846,26847,26848,26849,26850,26851,26852,26853,26854, 26855,26856,26857,26858,26859,26860,26861,26862,26863,26864,26865,26866, 26867,26868,26869,26870,26871,26872,26873,26874,26875,26876,26877,26878, 26879,26880,26881,26882,26883,26884,26885,26886,26887,26888,26889,26890, 26891,26892,26893,26894,26895,26896,26897,26898,26899,26900,26901,26902, 26903,26904,26905,26906,26907,26908,26909,26910,26911,26912,26913,26914, 26915,26916,26917,26918,26919,26920,26921,26922,26923,26924,26925,26926, 26927,26928,26929,26930,26931,26932,26933,26934,26935,26936,26937,26938, 26939,26940,26941,26942,26943,26944,26945,26946,26947,26948,26949,26950, 26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962, 26963,26964,26965,26966,26967,26968,26969,26970,26971,26972,26973,26974, 26975,26976,26977,26978,26979,26980,26981,26982,26983,26984,26985,26986, 26987,26988,26989,26990,26991,26992,26993,26994,26995,26996,26997,26998, 26999,27000,27001,27002,27003,27004,27005,27006,27007,27008,27009,27010, 27011,27012,27013,27014,27015,27016,27017,27018,27019,27020,27021,27022, 27023,27024,27025,27026,27027,27028,27029,27030,27031,27032,27033,27034, 27035,27036,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046, 27047,27048,27049,27050,27051,27052,27053,27054,27055,27056,27057,27058, 27059,27060,27061,27062,27063,27064,27065,27066,27067,27068,27069,27070, 27071,27072,27073,27074,27075,27076,27077,27078,27079,27080,27081,27082, 27083,27084,27085,27086,27087,27088,27089,27090,27091,27092,27093,27094, 27095,27096,27097,27098,27099,27100,27101,27102,27103,27104,27105,27106, 27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27117,27118, 27119,27120,27121,27122,27123,27124,27125,27126,27127,27128,27129,27130, 27131,27132,27133,27134,27135,27136,27137,27138,27139,27140,27141,27142, 27143,27144,27145,27146,27147,27148,27149,27150,27151,27152,27153,27154, 27155,27156,27157,27158,27159,27160,27161,27162,27163,27164,27165,27166, 27167,27168,27169,27170,27171,27172,27173,27174,27175,27176,27177,27178, 27179,27180,27181,27182,27183,27184,27185,27186,27187,27188,27189,27190, 27191,27192,27193,27194,27195,27196,27197,27198,27199,27200,27201,27202, 27203,27204,27205,27206,27207,27208,27209,27210,27211,27212,27213,27214, 27215,27216,27217,27218,27219,27220,27221,27222,27223,27224,27225,27226, 27227,27228,27229,27230,27231,27232,27233,27234,27235,27236,27237,27238, 27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27249,27250, 27251,27252,27253,27254,27255,27256,27257,27258,27259,27260,27261,27262, 27263,27264,27265,27266,27267,27268,27269,27270,27271,27272,27273,27274, 27275,27276,27277,27278,27279,27280,27281,27282,27283,27284,27285,27286, 27287,27288,27289,27290,27291,27292,27293,27294,27295,27296,27297,27298, 27299,27300,27301,27302,27303,27304,27305,27306,27307,27308,27309,27310, 27311,27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322, 27323,27324,27325,27326,27327,27328,27329,27330,27331,27332,27333,27334, 27335,27336,27337,27338,27339,27340,27341,27342,27343,27344,27345,27346, 27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358, 27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370, 27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382, 27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,27394, 27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406, 27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418, 27419,27420,27421,27422,27423,27424,27425,27426,27427,27428,27429,27430, 27431,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27442, 27443,27444,27445,27446,27447,27448,27449,27450,27451,27452,27453,27454, 27455,27456,27457,27458,27459,27460,27461,27462,27463,27464,27465,27466, 27467,27468,27469,27470,27471,27472,27473,27474,27475,27476,27477,27478, 27479,27480,27481,27482,27483,27484,27485,27486,27487,27488,27489,27490, 27491,27492,27493,27494,27495,27496,27497,27498,27499,27500,27501,27502, 27503,27504,27505,27506,27507,27508,27509,27510,27511,27512,27513,27514, 27515,27516,27517,27518,27519,27520,27521,27522,27523,27524,27525,27526, 27527,27528,27529,27530,27531,27532,27533,27534,27535,27536,27537,27538, 27539,27540,27541,27542,27543,27544,27545,27546,27547,27548,27549,27550, 27551,27552,27553,27554,27555,27556,27557,27558,27559,27560,27561,27562, 27563,27564,27565,27566,27567,27568,27569,27570,27571,27572,27573,27574, 27575,27576,27577,27578,27579,27580,27581,27582,27583,27584,27585,27586, 27587,27588,27589,27590,27591,27592,27593,27594,27595,27596,27597,27598, 27599,27600,27601,27602,27603,27604,27605,27606,27607,27608,27609,27610, 27611,27612,27613,27614,27615,27616,27617,27618,27619,27620,27621,27622, 27623,27624,27625,27626,27627,27628,27629,27630,27631,27632,27633,27634, 27635,27636,27637,27638,27639,27640,27641,27642,27643,27644,27645,27646, 27647,27648,27649,27650,27651,27652,27653,27654,27655,27656,27657,27658, 27659,27660,27661,27662,27663,27664,27665,27666,27667,27668,27669,27670, 27671,27672,27673,27674,27675,27676,27677,27678,27679,27680,27681,27682, 27683,27684,27685,27686,27687,27688,27689,27690,27691,27692,27693,27694, 27695,27696,27697,27698,27699,27700,27701,27702,27703,27704,27705,27706, 27707,27708,27709,27710,27711,27712,27713,27714,27715,27716,27717,27718, 27719,27720,27721,27722,27723,27724,27725,27726,27727,27728,27729,27730, 27731,27732,27733,27734,27735,27736,27737,27738,27739,27740,27741,27742, 27743,27744,27745,27746,27747,27748,27749,27750,27751,27752,27753,27754, 27755,27756,27757,27758,27759,27760,27761,27762,27763,27764,27765,27766, 27767,27768,27769,27770,27771,27772,27773,27774,27775,27776,27777,27778, 27779,27780,27781,27782,27783,27784,27785,27786,27787,27788,27789,27790, 27791,27792,27793,27794,27795,27796,27797,27798,27799,27800,27801,27802, 27803,27804,27805,27806,27807,27808,27809,27810,27811,27812,27813,27814, 27815,27816,27817,27818,27819,27820,27821,27822,27823,27824,27825,27826, 27827,27828,27829,27830,27831,27832,27833,27834,27835,27836,27837,27838, 27839,27840,27841,27842,27843,27844,27845,27846,27847,27848,27849,27850, 27851,27852,27853,27854,27855,27856,27857,27858,27859,27860,27861,27862, 27863,27864,27865,27866,27867,27868,27869,27870,27871,27872,27873,27874, 27875,27876,27877,27878,27879,27880,27881,27882,27883,27884,27885,27886, 27887,27888,27889,27890,27891,27892,27893,27894,27895,27896,27897,27898, 27899,27900,27901,27902,27903,27904,27905,27906,27907,27908,27909,27910, 27911,27912,27913,27914,27915,27916,27917,27918,27919,27920,27921,27922, 27923,27924,27925,27926,27927,27928,27929,27930,27931,27932,27933,27934, 27935,27936,27937,27938,27939,27940,27941,27942,27943,27944,27945,27946, 27947,27948,27949,27950,27951,27952,27953,27954,27955,27956,27957,27958, 27959,27960,27961,27962,27963,27964,27965,27966,27967,27968,27969,27970, 27971,27972,27973,27974,27975,27976,27977,27978,27979,27980,27981,27982, 27983,27984,27985,27986,27987,27988,27989,27990,27991,27992,27993,27994, 27995,27996,27997,27998,27999,28000,28001,28002,28003,28004,28005,28006, 28007,28008,28009,28010,28011,28012,28013,28014,28015,28016,28017,28018, 28019,28020,28021,28022,28023,28024,28025,28026,28027,28028,28029,28030, 28031,28032,28033,28034,28035,28036,28037,28038,28039,28040,28041,28042, 28043,28044,28045,28046,28047,28048,28049,28050,28051,28052,28053,28054, 28055,28056,28057,28058,28059,28060,28061,28062,28063,28064,28065,28066, 28067,28068,28069,28070,28071,28072,28073,28074,28075,28076,28077,28078, 28079,28080,28081,28082,28083,28084,28085,28086,28087,28088,28089,28090, 28091,28092,28093,28094,28095,28096,28097,28098,28099,28100,28101,28102, 28103,28104,28105,28106,28107,28108,28109,28110,28111,28112,28113,28114, 28115,28116,28117,28118,28119,28120,28121,28122,28123,28124,28125,28126, 28127,28128,28129,28130,28131,28132,28133,28134,28135,28136,28137,28138, 28139,28140,28141,28142,28143,28144,28145,28146,28147,28148,28149,28150, 28151,28152,28153,28154,28155,28156,28157,28158,28159,28160,28161,28162, 28163,28164,28165,28166,28167,28168,28169,28170,28171,28172,28173,28174, 28175,28176,28177,28178,28179,28180,28181,28182,28183,28184,28185,28186, 28187,28188,28189,28190,28191,28192,28193,28194,28195,28196,28197,28198, 28199,28200,28201,28202,28203,28204,28205,28206,28207,28208,28209,28210, 28211,28212,28213,28214,28215,28216,28217,28218,28219,28220,28221,28222, 28223,28224,28225,28226,28227,28228,28229,28230,28231,28232,28233,28234, 28235,28236,28237,28238,28239,28240,28241,28242,28243,28244,28245,28246, 28247,28248,28249,28250,28251,28252,28253,28254,28255,28256,28257,28258, 28259,28260,28261,28262,28263,28264,28265,28266,28267,28268,28269,28270, 28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282, 28283,28284,28285,28286,28287,28288,28289,28290,28291,28292,28293,28294, 28295,28296,28297,28298,28299,28300,28301,28302,28303,28304,28305,28306, 28307,28308,28309,28310,28311,28312,28313,28314,28315,28316,28317,28318, 28319,28320,28321,28322,28323,28324,28325,28326,28327,28328,28329,28330, 28331,28332,28333,28334,28335,28336,28337,28338,28339,28340,28341,28342, 28343,28344,28345,28346,28347,28348,28349,28350,28351,28352,28353,28354, 28355,28356,28357,28358,28359,28360,28361,28362,28363,28364,28365,28366, 28367,28368,28369,28370,28371,28372,28373,28374,28375,28376,28377,28378, 28379,28380,28381,28382,28383,28384,28385,28386,28387,28388,28389,28390, 28391,28392,28393,28394,28395,28396,28397,28398,28399,28400,28401,28402, 28403,28404,28405,28406,28407,28408,28409,28410,28411,28412,28413,28414, 28415,28416,28417,28418,28419,28420,28421,28422,28423,28424,28425,28426, 28427,28428,28429,28430,28431,28432,28433,28434,28435,28436,28437,28438, 28439,28440,28441,28442,28443,28444,28445,28446,28447,28448,28449,28450, 28451,28452,28453,28454,28455,28456,28457,28458,28459,28460,28461,28462, 28463,28464,28465,28466,28467,28468,28469,28470,28471,28472,28473,28474, 28475,28476,28477,28478,28479,28480,28481,28482,28483,28484,28485,28486, 28487,28488,28489,28490,28491,28492,28493,28494,28495,28496,28497,28498, 28499,28500,28501,28502,28503,28504,28505,28506,28507,28508,28509,28510, 28511,28512,28513,28514,28515,28516,28517,28518,28519,28520,28521,28522, 28523,28524,28525,28526,28527,28528,28529,28530,28531,28532,28533,28534, 28535,28536,28537,28538,28539,28540,28541,28542,28543,28544,28545,28546, 28547,28548,28549,28550,28551,28552,28553,28554,28555,28556,28557,28558, 28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570, 28571,28572,28573,28574,28575,28576,28577,28578,28579,28580,28581,28582, 28583,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594, 28595,28596,28597,28598,28599,28600,28601,28602,28603,28604,28605,28606, 28607,28608,28609,28610,28611,28612,28613,28614,28615,28616,28617,28618, 28619,28620,28621,28622,28623,28624,28625,28626,28627,28628,28629,28630, 28631,28632,28633,28634,28635,28636,28637,28638,28639,28640,28641,28642, 28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,28654, 28655,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666, 28667,28668,28669,28670,28671,28672,28673,28674,28675,28676,28677,28678, 28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28689,28690, 28691,28692,28693,28694,28695,28696,28697,28698,28699,28700,28701,28702, 28703,28704,28705,28706,28707,28708,28709,28710,28711,28712,28713,28714, 28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28725,28726, 28727,28728,28729,28730,28731,28732,28733,28734,28735,28736,28737,28738, 28739,28740,28741,28742,28743,28744,28745,28746,28747,28748,28749,28750, 28751,28752,28753,28754,28755,28756,28757,28758,28759,28760,28761,28762, 28763,28764,28765,28766,28767,28768,28769,28770,28771,28772,28773,28774, 28775,28776,28777,28778,28779,28780,28781,28782,28783,28784,28785,28786, 28787,28788,28789,28790,28791,28792,28793,28794,28795,28796,28797,28798, 28799,28800,28801,28802,28803,28804,28805,28806,28807,28808,28809,28810, 28811,28812,28813,28814,28815,28816,28817,28818,28819,28820,28821,28822, 28823,28824,28825,28826,28827,28828,28829,28830,28831,28832,28833,28834, 28835,28836,28837,28838,28839,28840,28841,28842,28843,28844,28845,28846, 28847,28848,28849,28850,28851,28852,28853,28854,28855,28856,28857,28858, 28859,28860,28861,28862,28863,28864,28865,28866,28867,28868,28869,28870, 28871,28872,28873,28874,28875,28876,28877,28878,28879,28880,28881,28882, 28883,28884,28885,28886,28887,28888,28889,28890,28891,28892,28893,28894, 28895,28896,28897,28898,28899,28900,28901,28902,28903,28904,28905,28906, 28907,28908,28909,28910,28911,28912,28913,28914,28915,28916,28917,28918, 28919,28920,28921,28922,28923,28924,28925,28926,28927,28928,28929,28930, 28931,28932,28933,28934,28935,28936,28937,28938,28939,28940,28941,28942, 28943,28944,28945,28946,28947,28948,28949,28950,28951,28952,28953,28954, 28955,28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28966, 28967,28968,28969,28970,28971,28972,28973,28974,28975,28976,28977,28978, 28979,28980,28981,28982,28983,28984,28985,28986,28987,28988,28989,28990, 28991,28992,28993,28994,28995,28996,28997,28998,28999,29000,29001,29002, 29003,29004,29005,29006,29007,29008,29009,29010,29011,29012,29013,29014, 29015,29016,29017,29018,29019,29020,29021,29022,29023,29024,29025,29026, 29027,29028,29029,29030,29031,29032,29033,29034,29035,29036,29037,29038, 29039,29040,29041,29042,29043,29044,29045,29046,29047,29048,29049,29050, 29051,29052,29053,29054,29055,29056,29057,29058,29059,29060,29061,29062, 29063,29064,29065,29066,29067,29068,29069,29070,29071,29072,29073,29074, 29075,29076,29077,29078,29079,29080,29081,29082,29083,29084,29085,29086, 29087,29088,29089,29090,29091,29092,29093,29094,29095,29096,29097,29098, 29099,29100,29101,29102,29103,29104,29105,29106,29107,29108,29109,29110, 29111,29112,29113,29114,29115,29116,29117,29118,29119,29120,29121,29122, 29123,29124,29125,29126,29127,29128,29129,29130,29131,29132,29133,29134, 29135,29136,29137,29138,29139,29140,29141,29142,29143,29144,29145,29146, 29147,29148,29149,29150,29151,29152,29153,29154,29155,29156,29157,29158, 29159,29160,29161,29162,29163,29164,29165,29166,29167,29168,29169,29170, 29171,29172,29173,29174,29175,29176,29177,29178,29179,29180,29181,29182, 29183,29184,29185,29186,29187,29188,29189,29190,29191,29192,29193,29194, 29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206, 29207,29208,29209,29210,29211,29212,29213,29214,29215,29216,29217,29218, 29219,29220,29221,29222,29223,29224,29225,29226,29227,29228,29229,29230, 29231,29232,29233,29234,29235,29236,29237,29238,29239,29240,29241,29242, 29243,29244,29245,29246,29247,29248,29249,29250,29251,29252,29253,29254, 29255,29256,29257,29258,29259,29260,29261,29262,29263,29264,29265,29266, 29267,29268,29269,29270,29271,29272,29273,29274,29275,29276,29277,29278, 29279,29280,29281,29282,29283,29284,29285,29286,29287,29288,29289,29290, 29291,29292,29293,29294,29295,29296,29297,29298,29299,29300,29301,29302, 29303,29304,29305,29306,29307,29308,29309,29310,29311,29312,29313,29314, 29315,29316,29317,29318,29319,29320,29321,29322,29323,29324,29325,29326, 29327,29328,29329,29330,29331,29332,29333,29334,29335,29336,29337,29338, 29339,29340,29341,29342,29343,29344,29345,29346,29347,29348,29349,29350, 29351,29352,29353,29354,29355,29356,29357,29358,29359,29360,29361,29362, 29363,29364,29365,29366,29367,29368,29369,29370,29371,29372,29373,29374, 29375,29376,29377,29378,29379,29380,29381,29382,29383,29384,29385,29386, 29387,29388,29389,29390,29391,29392,29393,29394,29395,29396,29397,29398, 29399,29400,29401,29402,29403,29404,29405,29406,29407,29408,29409,29410, 29411,29412,29413,29414,29415,29416,29417,29418,29419,29420,29421,29422, 29423,29424,29425,29426,29427,29428,29429,29430,29431,29432,29433,29434, 29435,29436,29437,29438,29439,29440,29441,29442,29443,29444,29445,29446, 29447,29448,29449,29450,29451,29452,29453,29454,29455,29456,29457,29458, 29459,29460,29461,29462,29463,29464,29465,29466,29467,29468,29469,29470, 29471,29472,29473,29474,29475,29476,29477,29478,29479,29480,29481,29482, 29483,29484,29485,29486,29487,29488,29489,29490,29491,29492,29493,29494, 29495,29496,29497,29498,29499,29500,29501,29502,29503,29504,29505,29506, 29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29517,29518, 29519,29520,29521,29522,29523,29524,29525,29526,29527,29528,29529,29530, 29531,29532,29533,29534,29535,29536,29537,29538,29539,29540,29541,29542, 29543,29544,29545,29546,29547,29548,29549,29550,29551,29552,29553,29554, 29555,29556,29557,29558,29559,29560,29561,29562,29563,29564,29565,29566, 29567,29568,29569,29570,29571,29572,29573,29574,29575,29576,29577,29578, 29579,29580,29581,29582,29583,29584,29585,29586,29587,29588,29589,29590, 29591,29592,29593,29594,29595,29596,29597,29598,29599,29600,29601,29602, 29603,29604,29605,29606,29607,29608,29609,29610,29611,29612,29613,29614, 29615,29616,29617,29618,29619,29620,29621,29622,29623,29624,29625,29626, 29627,29628,29629,29630,29631,29632,29633,29634,29635,29636,29637,29638, 29639,29640,29641,29642,29643,29644,29645,29646,29647,29648,29649,29650, 29651,29652,29653,29654,29655,29656,29657,29658,29659,29660,29661,29662, 29663,29664,29665,29666,29667,29668,29669,29670,29671,29672,29673,29674, 29675,29676,29677,29678,29679,29680,29681,29682,29683,29684,29685,29686, 29687,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698, 29699,29700,29701,29702,29703,29704,29705,29706,29707,29708,29709,29710, 29711,29712,29713,29714,29715,29716,29717,29718,29719,29720,29721,29722, 29723,29724,29725,29726,29727,29728,29729,29730,29731,29732,29733,29734, 29735,29736,29737,29738,29739,29740,29741,29742,29743,29744,29745,29746, 29747,29748,29749,29750,29751,29752,29753,29754,29755,29756,29757,29758, 29759,29760,29761,29762,29763,29764,29765,29766,29767,29768,29769,29770, 29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29781,29782, 29783,29784,29785,29786,29787,29788,29789,29790,29791,29792,29793,29794, 29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29805,29806, 29807,29808,29809,29810,29811,29812,29813,29814,29815,29816,29817,29818, 29819,29820,29821,29822,29823,29824,29825,29826,29827,29828,29829,29830, 29831,29832,29833,29834,29835,29836,29837,29838,29839,29840,29841,29842, 29843,29844,29845,29846,29847,29848,29849,29850,29851,29852,29853,29854, 29855,29856,29857,29858,29859,29860,29861,29862,29863,29864,29865,29866, 29867,29868,29869,29870,29871,29872,29873,29874,29875,29876,29877,29878, 29879,29880,29881,29882,29883,29884,29885,29886,29887,29888,29889,29890, 29891,29892,29893,29894,29895,29896,29897,29898,29899,29900,29901,29902, 29903,29904,29905,29906,29907,29908,29909,29910,29911,29912,29913,29914, 29915,29916,29917,29918,29919,29920,29921,29922,29923,29924,29925,29926, 29927,29928,29929,29930,29931,29932,29933,29934,29935,29936,29937,29938, 29939,29940,29941,29942,29943,29944,29945,29946,29947,29948,29949,29950, 29951,29952,29953,29954,29955,29956,29957,29958,29959,29960,29961,29962, 29963,29964,29965,29966,29967,29968,29969,29970,29971,29972,29973,29974, 29975,29976,29977,29978,29979,29980,29981,29982,29983,29984,29985,29986, 29987,29988,29989,29990,29991,29992,29993,29994,29995,29996,29997,29998, 29999,30000,30001,30002,30003,30004,30005,30006,30007,30008,30009,30010, 30011,30012,30013,30014,30015,30016,30017,30018,30019,30020,30021,30022, 30023,30024,30025,30026,30027,30028,30029,30030,30031,30032,30033,30034, 30035,30036,30037,30038,30039,30040,30041,30042,30043,30044,30045,30046, 30047,30048,30049,30050,30051,30052,30053,30054,30055,30056,30057,30058, 30059,30060,30061,30062,30063,30064,30065,30066,30067,30068,30069,30070, 30071,30072,30073,30074,30075,30076,30077,30078,30079,30080,30081,30082, 30083,30084,30085,30086,30087,30088,30089,30090,30091,30092,30093,30094, 30095,30096,30097,30098,30099,30100,30101,30102,30103,30104,30105,30106, 30107,30108,30109,30110,30111,30112,30113,30114,30115,30116,30117,30118, 30119,30120,30121,30122,30123,30124,30125,30126,30127,30128,30129,30130, 30131,30132,30133,30134,30135,30136,30137,30138,30139,30140,30141,30142, 30143,30144,30145,30146,30147,30148,30149,30150,30151,30152,30153,30154, 30155,30156,30157,30158,30159,30160,30161,30162,30163,30164,30165,30166, 30167,30168,30169,30170,30171,30172,30173,30174,30175,30176,30177,30178, 30179,30180,30181,30182,30183,30184,30185,30186,30187,30188,30189,30190, 30191,30192,30193,30194,30195,30196,30197,30198,30199,30200,30201,30202, 30203,30204,30205,30206,30207,30208,30209,30210,30211,30212,30213,30214, 30215,30216,30217,30218,30219,30220,30221,30222,30223,30224,30225,30226, 30227,30228,30229,30230,30231,30232,30233,30234,30235,30236,30237,30238, 30239,30240,30241,30242,30243,30244,30245,30246,30247,30248,30249,30250, 30251,30252,30253,30254,30255,30256,30257,30258,30259,30260,30261,30262, 30263,30264,30265,30266,30267,30268,30269,30270,30271,30272,30273,30274, 30275,30276,30277,30278,30279,30280,30281,30282,30283,30284,30285,30286, 30287,30288,30289,30290,30291,30292,30293,30294,30295,30296,30297,30298, 30299,30300,30301,30302,30303,30304,30305,30306,30307,30308,30309,30310, 30311,30312,30313,30314,30315,30316,30317,30318,30319,30320,30321,30322, 30323,30324,30325,30326,30327,30328,30329,30330,30331,30332,30333,30334, 30335,30336,30337,30338,30339,30340,30341,30342,30343,30344,30345,30346, 30347,30348,30349,30350,30351,30352,30353,30354,30355,30356,30357,30358, 30359,30360,30361,30362,30363,30364,30365,30366,30367,30368,30369,30370, 30371,30372,30373,30374,30375,30376,30377,30378,30379,30380,30381,30382, 30383,30384,30385,30386,30387,30388,30389,30390,30391,30392,30393,30394, 30395,30396,30397,30398,30399,30400,30401,30402,30403,30404,30405,30406, 30407,30408,30409,30410,30411,30412,30413,30414,30415,30416,30417,30418, 30419,30420,30421,30422,30423,30424,30425,30426,30427,30428,30429,30430, 30431,30432,30433,30434,30435,30436,30437,30438,30439,30440,30441,30442, 30443,30444,30445,30446,30447,30448,30449,30450,30451,30452,30453,30454, 30455,30456,30457,30458,30459,30460,30461,30462,30463,30464,30465,30466, 30467,30468,30469,30470,30471,30472,30473,30474,30475,30476,30477,30478, 30479,30480,30481,30482,30483,30484,30485,30486,30487,30488,30489,30490, 30491,30492,30493,30494,30495,30496,30497,30498,30499,30500,30501,30502, 30503,30504,30505,30506,30507,30508,30509,30510,30511,30512,30513,30514, 30515,30516,30517,30518,30519,30520,30521,30522,30523,30524,30525,30526, 30527,30528,30529,30530,30531,30532,30533,30534,30535,30536,30537,30538, 30539,30540,30541,30542,30543,30544,30545,30546,30547,30548,30549,30550, 30551,30552,30553,30554,30555,30556,30557,30558,30559,30560,30561,30562, 30563,30564,30565,30566,30567,30568,30569,30570,30571,30572,30573,30574, 30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30585,30586, 30587,30588,30589,30590,30591,30592,30593,30594,30595,30596,30597,30598, 30599,30600,30601,30602,30603,30604,30605,30606,30607,30608,30609,30610, 30611,30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622, 30623,30624,30625,30626,30627,30628,30629,30630,30631,30632,30633,30634, 30635,30636,30637,30638,30639,30640,30641,30642,30643,30644,30645,30646, 30647,30648,30649,30650,30651,30652,30653,30654,30655,30656,30657,30658, 30659,30660,30661,30662,30663,30664,30665,30666,30667,30668,30669,30670, 30671,30672,30673,30674,30675,30676,30677,30678,30679,30680,30681,30682, 30683,30684,30685,30686,30687,30688,30689,30690,30691,30692,30693,30694, 30695,30696,30697,30698,30699,30700,30701,30702,30703,30704,30705,30706, 30707,30708,30709,30710,30711,30712,30713,30714,30715,30716,30717,30718, 30719,30720,30721,30722,30723,30724,30725,30726,30727,30728,30729,30730, 30731,30732,30733,30734,30735,30736,30737,30738,30739,30740,30741,30742, 30743,30744,30745,30746,30747,30748,30749,30750,30751,30752,30753,30754, 30755,30756,30757,30758,30759,30760,30761,30762,30763,30764,30765,30766, 30767,30768,30769,30770,30771,30772,30773,30774,30775,30776,30777,30778, 30779,30780,30781,30782,30783,30784,30785,30786,30787,30788,30789,30790, 30791,30792,30793,30794,30795,30796,30797,30798,30799,30800,30801,30802, 30803,30804,30805,30806,30807,30808,30809,30810,30811,30812,30813,30814, 30815,30816,30817,30818,30819,30820,30821,30822,30823,30824,30825,30826, 30827,30828,30829,30830,30831,30832,30833,30834,30835,30836,30837,30838, 30839,30840,30841,30842,30843,30844,30845,30846,30847,30848,30849,30850, 30851,30852,30853,30854,30855,30856,30857,30858,30859,30860,30861,30862, 30863,30864,30865,30866,30867,30868,30869,30870,30871,30872,30873,30874, 30875,30876,30877,30878,30879,30880,30881,30882,30883,30884,30885,30886, 30887,30888,30889,30890,30891,30892,30893,30894,30895,30896,30897,30898, 30899,30900,30901,30902,30903,30904,30905,30906,30907,30908,30909,30910, 30911,30912,30913,30914,30915,30916,30917,30918,30919,30920,30921,30922, 30923,30924,30925,30926,30927,30928,30929,30930,30931,30932,30933,30934, 30935,30936,30937,30938,30939,30940,30941,30942,30943,30944,30945,30946, 30947,30948,30949,30950,30951,30952,30953,30954,30955,30956,30957,30958, 30959,30960,30961,30962,30963,30964,30965,30966,30967,30968,30969,30970, 30971,30972,30973,30974,30975,30976,30977,30978,30979,30980,30981,30982, 30983,30984,30985,30986,30987,30988,30989,30990,30991,30992,30993,30994, 30995,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,31006, 31007,31008,31009,31010,31011,31012,31013,31014,31015,31016,31017,31018, 31019,31020,31021,31022,31023,31024,31025,31026,31027,31028,31029,31030, 31031,31032,31033,31034,31035,31036,31037,31038,31039,31040,31041,31042, 31043,31044,31045,31046,31047,31048,31049,31050,31051,31052,31053,31054, 31055,31056,31057,31058,31059,31060,31061,31062,31063,31064,31065,31066, 31067,31068,31069,31070,31071,31072,31073,31074,31075,31076,31077,31078, 31079,31080,31081,31082,31083,31084,31085,31086,31087,31088,31089,31090, 31091,31092,31093,31094,31095,31096,31097,31098,31099,31100,31101,31102, 31103,31104,31105,31106,31107,31108,31109,31110,31111,31112,31113,31114, 31115,31116,31117,31118,31119,31120,31121,31122,31123,31124,31125,31126, 31127,31128,31129,31130,31131,31132,31133,31134,31135,31136,31137,31138, 31139,31140,31141,31142,31143,31144,31145,31146,31147,31148,31149,31150, 31151,31152,31153,31154,31155,31156,31157,31158,31159,31160,31161,31162, 31163,31164,31165,31166,31167,31168,31169,31170,31171,31172,31173,31174, 31175,31176,31177,31178,31179,31180,31181,31182,31183,31184,31185,31186, 31187,31188,31189,31190,31191,31192,31193,31194,31195,31196,31197,31198, 31199,31200,31201,31202,31203,31204,31205,31206,31207,31208,31209,31210, 31211,31212,31213,31214,31215,31216,31217,31218,31219,31220,31221,31222, 31223,31224,31225,31226,31227,31228,31229,31230,31231,31232,31233,31234, 31235,31236,31237,31238,31239,31240,31241,31242,31243,31244,31245,31246, 31247,31248,31249,31250,31251,31252,31253,31254,31255,31256,31257,31258, 31259,31260,31261,31262,31263,31264,31265,31266,31267,31268,31269,31270, 31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,31282, 31283,31284,31285,31286,31287,31288,31289,31290,31291,31292,31293,31294, 31295,31296,31297,31298,31299,31300,31301,31302,31303,31304,31305,31306, 31307,31308,31309,31310,31311,31312,31313,31314,31315,31316,31317,31318, 31319,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330, 31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342, 31343,31344,31345,31346,31347,31348,31349,31350,31351,31352,31353,31354, 31355,31356,31357,31358,31359,31360,31361,31362,31363,31364,31365,31366, 31367,31368,31369,31370,31371,31372,31373,31374,31375,31376,31377,31378, 31379,31380,31381,31382,31383,31384,31385,31386,31387,31388,31389,31390, 31391,31392,31393,31394,31395,31396,31397,31398,31399,31400,31401,31402, 31403,31404,31405,31406,31407,31408,31409,31410,31411,31412,31413,31414, 31415,31416,31417,31418,31419,31420,31421,31422,31423,31424,31425,31426, 31427,31428,31429,31430,31431,31432,31433,31434,31435,31436,31437,31438, 31439,31440,31441,31442,31443,31444,31445,31446,31447,31448,31449,31450, 31451,31452,31453,31454,31455,31456,31457,31458,31459,31460,31461,31462, 31463,31464,31465,31466,31467,31468,31469,31470,31471,31472,31473,31474, 31475,31476,31477,31478,31479,31480,31481,31482,31483,31484,31485,31486, 31487,31488,31489,31490,31491,31492,31493,31494,31495,31496,31497,31498, 31499,31500,31501,31502,31503,31504,31505,31506,31507,31508,31509,31510, 31511,31512,31513,31514,31515,31516,31517,31518,31519,31520,31521,31522, 31523,31524,31525,31526,31527,31528,31529,31530,31531,31532,31533,31534, 31535,31536,31537,31538,31539,31540,31541,31542,31543,31544,31545,31546, 31547,31548,31549,31550,31551,31552,31553,31554,31555,31556,31557,31558, 31559,31560,31561,31562,31563,31564,31565,31566,31567,31568,31569,31570, 31571,31572,31573,31574,31575,31576,31577,31578,31579,31580,31581,31582, 31583,31584,31585,31586,31587,31588,31589,31590,31591,31592,31593,31594, 31595,31596,31597,31598,31599,31600,31601,31602,31603,31604,31605,31606, 31607,31608,31609,31610,31611,31612,31613,31614,31615,31616,31617,31618, 31619,31620,31621,31622,31623,31624,31625,31626,31627,31628,31629,31630, 31631,31632,31633,31634,31635,31636,31637,31638,31639,31640,31641,31642, 31643,31644,31645,31646,31647,31648,31649,31650,31651,31652,31653,31654, 31655,31656,31657,31658,31659,31660,31661,31662,31663,31664,31665,31666, 31667,31668,31669,31670,31671,31672,31673,31674,31675,31676,31677,31678, 31679,31680,31681,31682,31683,31684,31685,31686,31687,31688,31689,31690, 31691,31692,31693,31694,31695,31696,31697,31698,31699,31700,31701,31702, 31703,31704,31705,31706,31707,31708,31709,31710,31711,31712,31713,31714, 31715,31716,31717,31718,31719,31720,31721,31722,31723,31724,31725,31726, 31727,31728,31729,31730,31731,31732,31733,31734,31735,31736,31737,31738, 31739,31740,31741,31742,31743,31744,31745,31746,31747,31748,31749,31750, 31751,31752,31753,31754,31755,31756,31757,31758,31759,31760,31761,31762, 31763,31764,31765,31766,31767,31768,31769,31770,31771,31772,31773,31774, 31775,31776,31777,31778,31779,31780,31781,31782,31783,31784,31785,31786, 31787,31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798, 31799,31800,31801,31802,31803,31804,31805,31806,31807,31808,31809,31810, 31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31821,31822, 31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834, 31835,31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846, 31847,31848,31849,31850,31851,31852,31853,31854,31855,31856,31857,31858, 31859,31860,31861,31862,31863,31864,31865,31866,31867,31868,31869,31870, 31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31881,31882, 31883,31884,31885,31886,31887,31888,31889,31890,31891,31892,31893,31894, 31895,31896,31897,31898,31899,31900,31901,31902,31903,31904,31905,31906, 31907,31908,31909,31910,31911,31912,31913,31914,31915,31916,31917,31918, 31919,31920,31921,31922,31923,31924,31925,31926,31927,31928,31929,31930, 31931,31932,31933,31934,31935,31936,31937,31938,31939,31940,31941,31942, 31943,31944,31945,31946,31947,31948,31949,31950,31951,31952,31953,31954, 31955,31956,31957,31958,31959,31960,31961,31962,31963,31964,31965,31966, 31967,31968,31969,31970,31971,31972,31973,31974,31975,31976,31977,31978, 31979,31980,31981,31982,31983,31984,31985,31986,31987,31988,31989,31990, 31991,31992,31993,31994,31995,31996,31997,31998,31999,32000,32001,32002, 32003,32004,32005,32006,32007,32008,32009,32010,32011,32012,32013,32014, 32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026, 32027,32028,32029,32030,32031,32032,32033,32034,32035,32036,32037,32038, 32039,32040,32041,32042,32043,32044,32045,32046,32047,32048,32049,32050, 32051,32052,32053,32054,32055,32056,32057,32058,32059,32060,32061,32062, 32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074, 32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086, 32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098, 32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32110, 32111,32112,32113,32114,32115,32116,32117,32118,32119,32120,32121,32122, 32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134, 32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146, 32147,32148,32149,32150,32151,32152,32153,32154,32155,32156,32157,32158, 32159,32160,32161,32162,32163,32164,32165,32166,32167,32168,32169,32170, 32171,32172,32173,32174,32175,32176,32177,32178,32179,32180,32181,32182, 32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194, 32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206, 32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218, 32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230, 32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242, 32243,32244,32245,32246,32247,32248,32249,32250,32251,32252,32253,32254, 32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266, 32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278, 32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290, 32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302, 32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,32314, 32315,32316,32317,32318,32319,32320,32321,32322,32323,32324,32325,32326, 32327,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338, 32339,32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,32350, 32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362, 32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374, 32375,32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32386, 32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398, 32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,32410, 32411,32412,32413,32414,32415,32416,32417,32418,32419,32420,32421,32422, 32423,32424,32425,32426,32427,32428,32429,32430,32431,32432,32433,32434, 32435,32436,32437,32438,32439,32440,32441,32442,32443,32444,32445,32446, 32447,32448,32449,32450,32451,32452,32453,32454,32455,32456,32457,32458, 32459,32460,32461,32462,32463,32464,32465,32466,32467,32468,32469,32470, 32471,32472,32473,32474,32475,32476,32477,32478,32479,32480,32481,32482, 32483,32484,32485,32486,32487,32488,32489,32490,32491,32492,32493,32494, 32495,32496,32497,32498,32499,32500,32501,32502,32503,32504,32505,32506, 32507,32508,32509,32510,32511,32512,32513,32514,32515,32516,32517,32518, 32519,32520,32521,32522,32523,32524,32525,32526,32527,32528,32529,32530, 32531,32532,32533,32534,32535,32536,32537,32538,32539,32540,32541,32542, 32543,32544,32545,32546,32547,32548,32549,32550,32551,32552,32553,32554, 32555,32556,32557,32558,32559,32560,32561,32562,32563,32564,32565,32566, 32567,32568,32569,32570,32571,32572,32573,32574,32575,32576,32577,32578, 32579,32580,32581,32582,32583,32584,32585,32586,32587,32588,32589,32590, 32591,32592,32593,32594,32595,32596,32597,32598,32599,32600,32601,32602, 32603,32604,32605,32606,32607,32608,32609,32610,32611,32612,32613,32614, 32615,32616,32617,32618,32619,32620,32621,32622,32623,32624,32625,32626, 32627,32628,32629,32630,32631,32632,32633,32634,32635,32636,32637,32638, 32639,32640,32641,32642,32643,32644,32645,32646,32647,32648,32649,32650, 32651,32652,32653,32654,32655,32656,32657,32658,32659,32660,32661,32662, 32663,32664,32665,32666,32667,32668,32669,32670,32671,32672,32673,32674, 32675,32676,32677,32678,32679,32680,32681,32682,32683,32684,32685,32686, 32687,32688,32689,32690,32691,32692,32693,32694,32695,32696,32697,32698, 32699,32700,32701,32702,32703,32704,32705,32706,32707,32708,32709,32710, 32711,32712,32713,32714,32715,32716,32717,32718,32719,32720,32721,32722, 32723,32724,32725,32726,32727,32728,32729,32730,32731,32732,32733,32734, 32735,32736,32737,32738,32739,32740,32741,32742,32743,32744,32745,32746, 32747,32748,32749,32750,32751,32752,32753,32754,32755,32756,32757,32758, 32759,32760,32761,32762,32763,32764,32765,32766,32767,32768L,32769L,32770L, 32771L,32772L,32773L,32774L,32775L,32776L,32777L,32778L,32779L,32780L, 32781L,32782L,32783L,32784L,32785L,32786L,32787L,32788L,32789L,32790L, 32791L,32792L,32793L,32794L,32795L,32796L,32797L,32798L,32799L,32800L, 32801L,32802L,32803L,32804L,32805L,32806L,32807L,32808L,32809L,32810L, 32811L,32812L,32813L,32814L,32815L,32816L,32817L,32818L,32819L,32820L, 32821L,32822L,32823L,32824L,32825L,32826L,32827L,32828L,32829L,32830L, 32831L,32832L,32833L,32834L,32835L,32836L,32837L,32838L,32839L,32840L, 32841L,32842L,32843L,32844L,32845L,32846L,32847L,32848L,32849L,32850L, 32851L,32852L,32853L,32854L,32855L,32856L,32857L,32858L,32859L,32860L, 32861L,32862L,32863L,32864L,32865L,32866L,32867L,32868L,32869L,32870L, 32871L,32872L,32873L,32874L,32875L,32876L,32877L,32878L,32879L,32880L, 32881L,32882L,32883L,32884L,32885L,32886L,32887L,32888L,32889L,32890L, 32891L,32892L,32893L,32894L,32895L,32896L,32897L,32898L,32899L,32900L, 32901L,32902L,32903L,32904L,32905L,32906L,32907L,32908L,32909L,32910L, 32911L,32912L,32913L,32914L,32915L,32916L,32917L,32918L,32919L,32920L, 32921L,32922L,32923L,32924L,32925L,32926L,32927L,32928L,32929L,32930L, 32931L,32932L,32933L,32934L,32935L,32936L,32937L,32938L,32939L,32940L, 32941L,32942L,32943L,32944L,32945L,32946L,32947L,32948L,32949L,32950L, 32951L,32952L,32953L,32954L,32955L,32956L,32957L,32958L,32959L,32960L, 32961L,32962L,32963L,32964L,32965L,32966L,32967L,32968L,32969L,32970L, 32971L,32972L,32973L,32974L,32975L,32976L,32977L,32978L,32979L,32980L, 32981L,32982L,32983L,32984L,32985L,32986L,32987L,32988L,32989L,32990L, 32991L,32992L,32993L,32994L,32995L,32996L,32997L,32998L,32999L,33000L, 33001L,33002L,33003L,33004L,33005L,33006L,33007L,33008L,33009L,33010L, 33011L,33012L,33013L,33014L,33015L,33016L,33017L,33018L,33019L,33020L, 33021L,33022L,33023L,33024L,33025L,33026L,33027L,33028L,33029L,33030L, 33031L,33032L,33033L,33034L,33035L,33036L,33037L,33038L,33039L,33040L, 33041L,33042L,33043L,33044L,33045L,33046L,33047L,33048L,33049L,33050L, 33051L,33052L,33053L,33054L,33055L,33056L,33057L,33058L,33059L,33060L, 33061L,33062L,33063L,33064L,33065L,33066L,33067L,33068L,33069L,33070L, 33071L,33072L,33073L,33074L,33075L,33076L,33077L,33078L,33079L,33080L, 33081L,33082L,33083L,33084L,33085L,33086L,33087L,33088L,33089L,33090L, 33091L,33092L,33093L,33094L,33095L,33096L,33097L,33098L,33099L,33100L, 33101L,33102L,33103L,33104L,33105L,33106L,33107L,33108L,33109L,33110L, 33111L,33112L,33113L,33114L,33115L,33116L,33117L,33118L,33119L,33120L, 33121L,33122L,33123L,33124L,33125L,33126L,33127L,33128L,33129L,33130L, 33131L,33132L,33133L,33134L,33135L,33136L,33137L,33138L,33139L,33140L, 33141L,33142L,33143L,33144L,33145L,33146L,33147L,33148L,33149L,33150L, 33151L,33152L,33153L,33154L,33155L,33156L,33157L,33158L,33159L,33160L, 33161L,33162L,33163L,33164L,33165L,33166L,33167L,33168L,33169L,33170L, 33171L,33172L,33173L,33174L,33175L,33176L,33177L,33178L,33179L,33180L, 33181L,33182L,33183L,33184L,33185L,33186L,33187L,33188L,33189L,33190L, 33191L,33192L,33193L,33194L,33195L,33196L,33197L,33198L,33199L,33200L, 33201L,33202L,33203L,33204L,33205L,33206L,33207L,33208L,33209L,33210L, 33211L,33212L,33213L,33214L,33215L,33216L,33217L,33218L,33219L,33220L, 33221L,33222L,33223L,33224L,33225L,33226L,33227L,33228L,33229L,33230L, 33231L,33232L,33233L,33234L,33235L,33236L,33237L,33238L,33239L,33240L, 33241L,33242L,33243L,33244L,33245L,33246L,33247L,33248L,33249L,33250L, 33251L,33252L,33253L,33254L,33255L,33256L,33257L,33258L,33259L,33260L, 33261L,33262L,33263L,33264L,33265L,33266L,33267L,33268L,33269L,33270L, 33271L,33272L,33273L,33274L,33275L,33276L,33277L,33278L,33279L,33280L, 33281L,33282L,33283L,33284L,33285L,33286L,33287L,33288L,33289L,33290L, 33291L,33292L,33293L,33294L,33295L,33296L,33297L,33298L,33299L,33300L, 33301L,33302L,33303L,33304L,33305L,33306L,33307L,33308L,33309L,33310L, 33311L,33312L,33313L,33314L,33315L,33316L,33317L,33318L,33319L,33320L, 33321L,33322L,33323L,33324L,33325L,33326L,33327L,33328L,33329L,33330L, 33331L,33332L,33333L,33334L,33335L,33336L,33337L,33338L,33339L,33340L, 33341L,33342L,33343L,33344L,33345L,33346L,33347L,33348L,33349L,33350L, 33351L,33352L,33353L,33354L,33355L,33356L,33357L,33358L,33359L,33360L, 33361L,33362L,33363L,33364L,33365L,33366L,33367L,33368L,33369L,33370L, 33371L,33372L,33373L,33374L,33375L,33376L,33377L,33378L,33379L,33380L, 33381L,33382L,33383L,33384L,33385L,33386L,33387L,33388L,33389L,33390L, 33391L,33392L,33393L,33394L,33395L,33396L,33397L,33398L,33399L,33400L, 33401L,33402L,33403L,33404L,33405L,33406L,33407L,33408L,33409L,33410L, 33411L,33412L,33413L,33414L,33415L,33416L,33417L,33418L,33419L,33420L, 33421L,33422L,33423L,33424L,33425L,33426L,33427L,33428L,33429L,33430L, 33431L,33432L,33433L,33434L,33435L,33436L,33437L,33438L,33439L,33440L, 33441L,33442L,33443L,33444L,33445L,33446L,33447L,33448L,33449L,33450L, 33451L,33452L,33453L,33454L,33455L,33456L,33457L,33458L,33459L,33460L, 33461L,33462L,33463L,33464L,33465L,33466L,33467L,33468L,33469L,33470L, 33471L,33472L,33473L,33474L,33475L,33476L,33477L,33478L,33479L,33480L, 33481L,33482L,33483L,33484L,33485L,33486L,33487L,33488L,33489L,33490L, 33491L,33492L,33493L,33494L,33495L,33496L,33497L,33498L,33499L,33500L, 33501L,33502L,33503L,33504L,33505L,33506L,33507L,33508L,33509L,33510L, 33511L,33512L,33513L,33514L,33515L,33516L,33517L,33518L,33519L,33520L, 33521L,33522L,33523L,33524L,33525L,33526L,33527L,33528L,33529L,33530L, 33531L,33532L,33533L,33534L,33535L,33536L,33537L,33538L,33539L,33540L, 33541L,33542L,33543L,33544L,33545L,33546L,33547L,33548L,33549L,33550L, 33551L,33552L,33553L,33554L,33555L,33556L,33557L,33558L,33559L,33560L, 33561L,33562L,33563L,33564L,33565L,33566L,33567L,33568L,33569L,33570L, 33571L,33572L,33573L,33574L,33575L,33576L,33577L,33578L,33579L,33580L, 33581L,33582L,33583L,33584L,33585L,33586L,33587L,33588L,33589L,33590L, 33591L,33592L,33593L,33594L,33595L,33596L,33597L,33598L,33599L,33600L, 33601L,33602L,33603L,33604L,33605L,33606L,33607L,33608L,33609L,33610L, 33611L,33612L,33613L,33614L,33615L,33616L,33617L,33618L,33619L,33620L, 33621L,33622L,33623L,33624L,33625L,33626L,33627L,33628L,33629L,33630L, 33631L,33632L,33633L,33634L,33635L,33636L,33637L,33638L,33639L,33640L, 33641L,33642L,33643L,33644L,33645L,33646L,33647L,33648L,33649L,33650L, 33651L,33652L,33653L,33654L,33655L,33656L,33657L,33658L,33659L,33660L, 33661L,33662L,33663L,33664L,33665L,33666L,33667L,33668L,33669L,33670L, 33671L,33672L,33673L,33674L,33675L,33676L,33677L,33678L,33679L,33680L, 33681L,33682L,33683L,33684L,33685L,33686L,33687L,33688L,33689L,33690L, 33691L,33692L,33693L,33694L,33695L,33696L,33697L,33698L,33699L,33700L, 33701L,33702L,33703L,33704L,33705L,33706L,33707L,33708L,33709L,33710L, 33711L,33712L,33713L,33714L,33715L,33716L,33717L,33718L,33719L,33720L, 33721L,33722L,33723L,33724L,33725L,33726L,33727L,33728L,33729L,33730L, 33731L,33732L,33733L,33734L,33735L,33736L,33737L,33738L,33739L,33740L, 33741L,33742L,33743L,33744L,33745L,33746L,33747L,33748L,33749L,33750L, 33751L,33752L,33753L,33754L,33755L,33756L,33757L,33758L,33759L,33760L, 33761L,33762L,33763L,33764L,33765L,33766L,33767L,33768L,33769L,33770L, 33771L,33772L,33773L,33774L,33775L,33776L,33777L,33778L,33779L,33780L, 33781L,33782L,33783L,33784L,33785L,33786L,33787L,33788L,33789L,33790L, 33791L,33792L,33793L,33794L,33795L,33796L,33797L,33798L,33799L,33800L, 33801L,33802L,33803L,33804L,33805L,33806L,33807L,33808L,33809L,33810L, 33811L,33812L,33813L,33814L,33815L,33816L,33817L,33818L,33819L,33820L, 33821L,33822L,33823L,33824L,33825L,33826L,33827L,33828L,33829L,33830L, 33831L,33832L,33833L,33834L,33835L,33836L,33837L,33838L,33839L,33840L, 33841L,33842L,33843L,33844L,33845L,33846L,33847L,33848L,33849L,33850L, 33851L,33852L,33853L,33854L,33855L,33856L,33857L,33858L,33859L,33860L, 33861L,33862L,33863L,33864L,33865L,33866L,33867L,33868L,33869L,33870L, 33871L,33872L,33873L,33874L,33875L,33876L,33877L,33878L,33879L,33880L, 33881L,33882L,33883L,33884L,33885L,33886L,33887L,33888L,33889L,33890L, 33891L,33892L,33893L,33894L,33895L,33896L,33897L,33898L,33899L,33900L, 33901L,33902L,33903L,33904L,33905L,33906L,33907L,33908L,33909L,33910L, 33911L,33912L,33913L,33914L,33915L,33916L,33917L,33918L,33919L,33920L, 33921L,33922L,33923L,33924L,33925L,33926L,33927L,33928L,33929L,33930L, 33931L,33932L,33933L,33934L,33935L,33936L,33937L,33938L,33939L,33940L, 33941L,33942L,33943L,33944L,33945L,33946L,33947L,33948L,33949L,33950L, 33951L,33952L,33953L,33954L,33955L,33956L,33957L,33958L,33959L,33960L, 33961L,33962L,33963L,33964L,33965L,33966L,33967L,33968L,33969L,33970L, 33971L,33972L,33973L,33974L,33975L,33976L,33977L,33978L,33979L,33980L, 33981L,33982L,33983L,33984L,33985L,33986L,33987L,33988L,33989L,33990L, 33991L,33992L,33993L,33994L,33995L,33996L,33997L,33998L,33999L,34000L, 34001L,34002L,34003L,34004L,34005L,34006L,34007L,34008L,34009L,34010L, 34011L,34012L,34013L,34014L,34015L,34016L,34017L,34018L,34019L,34020L, 34021L,34022L,34023L,34024L,34025L,34026L,34027L,34028L,34029L,34030L, 34031L,34032L,34033L,34034L,34035L,34036L,34037L,34038L,34039L,34040L, 34041L,34042L,34043L,34044L,34045L,34046L,34047L,34048L,34049L,34050L, 34051L,34052L,34053L,34054L,34055L,34056L,34057L,34058L,34059L,34060L, 34061L,34062L,34063L,34064L,34065L,34066L,34067L,34068L,34069L,34070L, 34071L,34072L,34073L,34074L,34075L,34076L,34077L,34078L,34079L,34080L, 34081L,34082L,34083L,34084L,34085L,34086L,34087L,34088L,34089L,34090L, 34091L,34092L,34093L,34094L,34095L,34096L,34097L,34098L,34099L,34100L, 34101L,34102L,34103L,34104L,34105L,34106L,34107L,34108L,34109L,34110L, 34111L,34112L,34113L,34114L,34115L,34116L,34117L,34118L,34119L,34120L, 34121L,34122L,34123L,34124L,34125L,34126L,34127L,34128L,34129L,34130L, 34131L,34132L,34133L,34134L,34135L,34136L,34137L,34138L,34139L,34140L, 34141L,34142L,34143L,34144L,34145L,34146L,34147L,34148L,34149L,34150L, 34151L,34152L,34153L,34154L,34155L,34156L,34157L,34158L,34159L,34160L, 34161L,34162L,34163L,34164L,34165L,34166L,34167L,34168L,34169L,34170L, 34171L,34172L,34173L,34174L,34175L,34176L,34177L,34178L,34179L,34180L, 34181L,34182L,34183L,34184L,34185L,34186L,34187L,34188L,34189L,34190L, 34191L,34192L,34193L,34194L,34195L,34196L,34197L,34198L,34199L,34200L, 34201L,34202L,34203L,34204L,34205L,34206L,34207L,34208L,34209L,34210L, 34211L,34212L,34213L,34214L,34215L,34216L,34217L,34218L,34219L,34220L, 34221L,34222L,34223L,34224L,34225L,34226L,34227L,34228L,34229L,34230L, 34231L,34232L,34233L,34234L,34235L,34236L,34237L,34238L,34239L,34240L, 34241L,34242L,34243L,34244L,34245L,34246L,34247L,34248L,34249L,34250L, 34251L,34252L,34253L,34254L,34255L,34256L,34257L,34258L,34259L,34260L, 34261L,34262L,34263L,34264L,34265L,34266L,34267L,34268L,34269L,34270L, 34271L,34272L,34273L,34274L,34275L,34276L,34277L,34278L,34279L,34280L, 34281L,34282L,34283L,34284L,34285L,34286L,34287L,34288L,34289L,34290L, 34291L,34292L,34293L,34294L,34295L,34296L,34297L,34298L,34299L,34300L, 34301L,34302L,34303L,34304L,34305L,34306L,34307L,34308L,34309L,34310L, 34311L,34312L,34313L,34314L,34315L,34316L,34317L,34318L,34319L,34320L, 34321L,34322L,34323L,34324L,34325L,34326L,34327L,34328L,34329L,34330L, 34331L,34332L,34333L,34334L,34335L,34336L,34337L,34338L,34339L,34340L, 34341L,34342L,34343L,34344L,34345L,34346L,34347L,34348L,34349L,34350L, 34351L,34352L,34353L,34354L,34355L,34356L,34357L,34358L,34359L,34360L, 34361L,34362L,34363L,34364L,34365L,34366L,34367L,34368L,34369L,34370L, 34371L,34372L,34373L,34374L,34375L,34376L,34377L,34378L,34379L,34380L, 34381L,34382L,34383L,34384L,34385L,34386L,34387L,34388L,34389L,34390L, 34391L,34392L,34393L,34394L,34395L,34396L,34397L,34398L,34399L,34400L, 34401L,34402L,34403L,34404L,34405L,34406L,34407L,34408L,34409L,34410L, 34411L,34412L,34413L,34414L,34415L,34416L,34417L,34418L,34419L,34420L, 34421L,34422L,34423L,34424L,34425L,34426L,34427L,34428L,34429L,34430L, 34431L,34432L,34433L,34434L,34435L,34436L,34437L,34438L,34439L,34440L, 34441L,34442L,34443L,34444L,34445L,34446L,34447L,34448L,34449L,34450L, 34451L,34452L,34453L,34454L,34455L,34456L,34457L,34458L,34459L,34460L, 34461L,34462L,34463L,34464L,34465L,34466L,34467L,34468L,34469L,34470L, 34471L,34472L,34473L,34474L,34475L,34476L,34477L,34478L,34479L,34480L, 34481L,34482L,34483L,34484L,34485L,34486L,34487L,34488L,34489L,34490L, 34491L,34492L,34493L,34494L,34495L,34496L,34497L,34498L,34499L,34500L, 34501L,34502L,34503L,34504L,34505L,34506L,34507L,34508L,34509L,34510L, 34511L,34512L,34513L,34514L,34515L,34516L,34517L,34518L,34519L,34520L, 34521L,34522L,34523L,34524L,34525L,34526L,34527L,34528L,34529L,34530L, 34531L,34532L,34533L,34534L,34535L,34536L,34537L,34538L,34539L,34540L, 34541L,34542L,34543L,34544L,34545L,34546L,34547L,34548L,34549L,34550L, 34551L,34552L,34553L,34554L,34555L,34556L,34557L,34558L,34559L,34560L, 34561L,34562L,34563L,34564L,34565L,34566L,34567L,34568L,34569L,34570L, 34571L,34572L,34573L,34574L,34575L,34576L,34577L,34578L,34579L,34580L, 34581L,34582L,34583L,34584L,34585L,34586L,34587L,34588L,34589L,34590L, 34591L,34592L,34593L,34594L,34595L,34596L,34597L,34598L,34599L,34600L, 34601L,34602L,34603L,34604L,34605L,34606L,34607L,34608L,34609L,34610L, 34611L,34612L,34613L,34614L,34615L,34616L,34617L,34618L,34619L,34620L, 34621L,34622L,34623L,34624L,34625L,34626L,34627L,34628L,34629L,34630L, 34631L,34632L,34633L,34634L,34635L,34636L,34637L,34638L,34639L,34640L, 34641L,34642L,34643L,34644L,34645L,34646L,34647L,34648L,34649L,34650L, 34651L,34652L,34653L,34654L,34655L,34656L,34657L,34658L,34659L,34660L, 34661L,34662L,34663L,34664L,34665L,34666L,34667L,34668L,34669L,34670L, 34671L,34672L,34673L,34674L,34675L,34676L,34677L,34678L,34679L,34680L, 34681L,34682L,34683L,34684L,34685L,34686L,34687L,34688L,34689L,34690L, 34691L,34692L,34693L,34694L,34695L,34696L,34697L,34698L,34699L,34700L, 34701L,34702L,34703L,34704L,34705L,34706L,34707L,34708L,34709L,34710L, 34711L,34712L,34713L,34714L,34715L,34716L,34717L,34718L,34719L,34720L, 34721L,34722L,34723L,34724L,34725L,34726L,34727L,34728L,34729L,34730L, 34731L,34732L,34733L,34734L,34735L,34736L,34737L,34738L,34739L,34740L, 34741L,34742L,34743L,34744L,34745L,34746L,34747L,34748L,34749L,34750L, 34751L,34752L,34753L,34754L,34755L,34756L,34757L,34758L,34759L,34760L, 34761L,34762L,34763L,34764L,34765L,34766L,34767L,34768L,34769L,34770L, 34771L,34772L,34773L,34774L,34775L,34776L,34777L,34778L,34779L,34780L, 34781L,34782L,34783L,34784L,34785L,34786L,34787L,34788L,34789L,34790L, 34791L,34792L,34793L,34794L,34795L,34796L,34797L,34798L,34799L,34800L, 34801L,34802L,34803L,34804L,34805L,34806L,34807L,34808L,34809L,34810L, 34811L,34812L,34813L,34814L,34815L,34816L,34817L,34818L,34819L,34820L, 34821L,34822L,34823L,34824L,34825L,34826L,34827L,34828L,34829L,34830L, 34831L,34832L,34833L,34834L,34835L,34836L,34837L,34838L,34839L,34840L, 34841L,34842L,34843L,34844L,34845L,34846L,34847L,34848L,34849L,34850L, 34851L,34852L,34853L,34854L,34855L,34856L,34857L,34858L,34859L,34860L, 34861L,34862L,34863L,34864L,34865L,34866L,34867L,34868L,34869L,34870L, 34871L,34872L,34873L,34874L,34875L,34876L,34877L,34878L,34879L,34880L, 34881L,34882L,34883L,34884L,34885L,34886L,34887L,34888L,34889L,34890L, 34891L,34892L,34893L,34894L,34895L,34896L,34897L,34898L,34899L,34900L, 34901L,34902L,34903L,34904L,34905L,34906L,34907L,34908L,34909L,34910L, 34911L,34912L,34913L,34914L,34915L,34916L,34917L,34918L,34919L,34920L, 34921L,34922L,34923L,34924L,34925L,34926L,34927L,34928L,34929L,34930L, 34931L,34932L,34933L,34934L,34935L,34936L,34937L,34938L,34939L,34940L, 34941L,34942L,34943L,34944L,34945L,34946L,34947L,34948L,34949L,34950L, 34951L,34952L,34953L,34954L,34955L,34956L,34957L,34958L,34959L,34960L, 34961L,34962L,34963L,34964L,34965L,34966L,34967L,34968L,34969L,34970L, 34971L,34972L,34973L,34974L,34975L,34976L,34977L,34978L,34979L,34980L, 34981L,34982L,34983L,34984L,34985L,34986L,34987L,34988L,34989L,34990L, 34991L,34992L,34993L,34994L,34995L,34996L,34997L,34998L,34999L,35000L, 35001L,35002L,35003L,35004L,35005L,35006L,35007L,35008L,35009L,35010L, 35011L,35012L,35013L,35014L,35015L,35016L,35017L,35018L,35019L,35020L, 35021L,35022L,35023L,35024L,35025L,35026L,35027L,35028L,35029L,35030L, 35031L,35032L,35033L,35034L,35035L,35036L,35037L,35038L,35039L,35040L, 35041L,35042L,35043L,35044L,35045L,35046L,35047L,35048L,35049L,35050L, 35051L,35052L,35053L,35054L,35055L,35056L,35057L,35058L,35059L,35060L, 35061L,35062L,35063L,35064L,35065L,35066L,35067L,35068L,35069L,35070L, 35071L,35072L,35073L,35074L,35075L,35076L,35077L,35078L,35079L,35080L, 35081L,35082L,35083L,35084L,35085L,35086L,35087L,35088L,35089L,35090L, 35091L,35092L,35093L,35094L,35095L,35096L,35097L,35098L,35099L,35100L, 35101L,35102L,35103L,35104L,35105L,35106L,35107L,35108L,35109L,35110L, 35111L,35112L,35113L,35114L,35115L,35116L,35117L,35118L,35119L,35120L, 35121L,35122L,35123L,35124L,35125L,35126L,35127L,35128L,35129L,35130L, 35131L,35132L,35133L,35134L,35135L,35136L,35137L,35138L,35139L,35140L, 35141L,35142L,35143L,35144L,35145L,35146L,35147L,35148L,35149L,35150L, 35151L,35152L,35153L,35154L,35155L,35156L,35157L,35158L,35159L,35160L, 35161L,35162L,35163L,35164L,35165L,35166L,35167L,35168L,35169L,35170L, 35171L,35172L,35173L,35174L,35175L,35176L,35177L,35178L,35179L,35180L, 35181L,35182L,35183L,35184L,35185L,35186L,35187L,35188L,35189L,35190L, 35191L,35192L,35193L,35194L,35195L,35196L,35197L,35198L,35199L,35200L, 35201L,35202L,35203L,35204L,35205L,35206L,35207L,35208L,35209L,35210L, 35211L,35212L,35213L,35214L,35215L,35216L,35217L,35218L,35219L,35220L, 35221L,35222L,35223L,35224L,35225L,35226L,35227L,35228L,35229L,35230L, 35231L,35232L,35233L,35234L,35235L,35236L,35237L,35238L,35239L,35240L, 35241L,35242L,35243L,35244L,35245L,35246L,35247L,35248L,35249L,35250L, 35251L,35252L,35253L,35254L,35255L,35256L,35257L,35258L,35259L,35260L, 35261L,35262L,35263L,35264L,35265L,35266L,35267L,35268L,35269L,35270L, 35271L,35272L,35273L,35274L,35275L,35276L,35277L,35278L,35279L,35280L, 35281L,35282L,35283L,35284L,35285L,35286L,35287L,35288L,35289L,35290L, 35291L,35292L,35293L,35294L,35295L,35296L,35297L,35298L,35299L,35300L, 35301L,35302L,35303L,35304L,35305L,35306L,35307L,35308L,35309L,35310L, 35311L,35312L,35313L,35314L,35315L,35316L,35317L,35318L,35319L,35320L, 35321L,35322L,35323L,35324L,35325L,35326L,35327L,35328L,35329L,35330L, 35331L,35332L,35333L,35334L,35335L,35336L,35337L,35338L,35339L,35340L, 35341L,35342L,35343L,35344L,35345L,35346L,35347L,35348L,35349L,35350L, 35351L,35352L,35353L,35354L,35355L,35356L,35357L,35358L,35359L,35360L, 35361L,35362L,35363L,35364L,35365L,35366L,35367L,35368L,35369L,35370L, 35371L,35372L,35373L,35374L,35375L,35376L,35377L,35378L,35379L,35380L, 35381L,35382L,35383L,35384L,35385L,35386L,35387L,35388L,35389L,35390L, 35391L,35392L,35393L,35394L,35395L,35396L,35397L,35398L,35399L,35400L, 35401L,35402L,35403L,35404L,35405L,35406L,35407L,35408L,35409L,35410L, 35411L,35412L,35413L,35414L,35415L,35416L,35417L,35418L,35419L,35420L, 35421L,35422L,35423L,35424L,35425L,35426L,35427L,35428L,35429L,35430L, 35431L,35432L,35433L,35434L,35435L,35436L,35437L,35438L,35439L,35440L, 35441L,35442L,35443L,35444L,35445L,35446L,35447L,35448L,35449L,35450L, 35451L,35452L,35453L,35454L,35455L,35456L,35457L,35458L,35459L,35460L, 35461L,35462L,35463L,35464L,35465L,35466L,35467L,35468L,35469L,35470L, 35471L,35472L,35473L,35474L,35475L,35476L,35477L,35478L,35479L,35480L, 35481L,35482L,35483L,35484L,35485L,35486L,35487L,35488L,35489L,35490L, 35491L,35492L,35493L,35494L,35495L,35496L,35497L,35498L,35499L,35500L, 35501L,35502L,35503L,35504L,35505L,35506L,35507L,35508L,35509L,35510L, 35511L,35512L,35513L,35514L,35515L,35516L,35517L,35518L,35519L,35520L, 35521L,35522L,35523L,35524L,35525L,35526L,35527L,35528L,35529L,35530L, 35531L,35532L,35533L,35534L,35535L,35536L,35537L,35538L,35539L,35540L, 35541L,35542L,35543L,35544L,35545L,35546L,35547L,35548L,35549L,35550L, 35551L,35552L,35553L,35554L,35555L,35556L,35557L,35558L,35559L,35560L, 35561L,35562L,35563L,35564L,35565L,35566L,35567L,35568L,35569L,35570L, 35571L,35572L,35573L,35574L,35575L,35576L,35577L,35578L,35579L,35580L, 35581L,35582L,35583L,35584L,35585L,35586L,35587L,35588L,35589L,35590L, 35591L,35592L,35593L,35594L,35595L,35596L,35597L,35598L,35599L,35600L, 35601L,35602L,35603L,35604L,35605L,35606L,35607L,35608L,35609L,35610L, 35611L,35612L,35613L,35614L,35615L,35616L,35617L,35618L,35619L,35620L, 35621L,35622L,35623L,35624L,35625L,35626L,35627L,35628L,35629L,35630L, 35631L,35632L,35633L,35634L,35635L,35636L,35637L,35638L,35639L,35640L, 35641L,35642L,35643L,35644L,35645L,35646L,35647L,35648L,35649L,35650L, 35651L,35652L,35653L,35654L,35655L,35656L,35657L,35658L,35659L,35660L, 35661L,35662L,35663L,35664L,35665L,35666L,35667L,35668L,35669L,35670L, 35671L,35672L,35673L,35674L,35675L,35676L,35677L,35678L,35679L,35680L, 35681L,35682L,35683L,35684L,35685L,35686L,35687L,35688L,35689L,35690L, 35691L,35692L,35693L,35694L,35695L,35696L,35697L,35698L,35699L,35700L, 35701L,35702L,35703L,35704L,35705L,35706L,35707L,35708L,35709L,35710L, 35711L,35712L,35713L,35714L,35715L,35716L,35717L,35718L,35719L,35720L, 35721L,35722L,35723L,35724L,35725L,35726L,35727L,35728L,35729L,35730L, 35731L,35732L,35733L,35734L,35735L,35736L,35737L,35738L,35739L,35740L, 35741L,35742L,35743L,35744L,35745L,35746L,35747L,35748L,35749L,35750L, 35751L,35752L,35753L,35754L,35755L,35756L,35757L,35758L,35759L,35760L, 35761L,35762L,35763L,35764L,35765L,35766L,35767L,35768L,35769L,35770L, 35771L,35772L,35773L,35774L,35775L,35776L,35777L,35778L,35779L,35780L, 35781L,35782L,35783L,35784L,35785L,35786L,35787L,35788L,35789L,35790L, 35791L,35792L,35793L,35794L,35795L,35796L,35797L,35798L,35799L,35800L, 35801L,35802L,35803L,35804L,35805L,35806L,35807L,35808L,35809L,35810L, 35811L,35812L,35813L,35814L,35815L,35816L,35817L,35818L,35819L,35820L, 35821L,35822L,35823L,35824L,35825L,35826L,35827L,35828L,35829L,35830L, 35831L,35832L,35833L,35834L,35835L,35836L,35837L,35838L,35839L,35840L, 35841L,35842L,35843L,35844L,35845L,35846L,35847L,35848L,35849L,35850L, 35851L,35852L,35853L,35854L,35855L,35856L,35857L,35858L,35859L,35860L, 35861L,35862L,35863L,35864L,35865L,35866L,35867L,35868L,35869L,35870L, 35871L,35872L,35873L,35874L,35875L,35876L,35877L,35878L,35879L,35880L, 35881L,35882L,35883L,35884L,35885L,35886L,35887L,35888L,35889L,35890L, 35891L,35892L,35893L,35894L,35895L,35896L,35897L,35898L,35899L,35900L, 35901L,35902L,35903L,35904L,35905L,35906L,35907L,35908L,35909L,35910L, 35911L,35912L,35913L,35914L,35915L,35916L,35917L,35918L,35919L,35920L, 35921L,35922L,35923L,35924L,35925L,35926L,35927L,35928L,35929L,35930L, 35931L,35932L,35933L,35934L,35935L,35936L,35937L,35938L,35939L,35940L, 35941L,35942L,35943L,35944L,35945L,35946L,35947L,35948L,35949L,35950L, 35951L,35952L,35953L,35954L,35955L,35956L,35957L,35958L,35959L,35960L, 35961L,35962L,35963L,35964L,35965L,35966L,35967L,35968L,35969L,35970L, 35971L,35972L,35973L,35974L,35975L,35976L,35977L,35978L,35979L,35980L, 35981L,35982L,35983L,35984L,35985L,35986L,35987L,35988L,35989L,35990L, 35991L,35992L,35993L,35994L,35995L,35996L,35997L,35998L,35999L,36000L, 36001L,36002L,36003L,36004L,36005L,36006L,36007L,36008L,36009L,36010L, 36011L,36012L,36013L,36014L,36015L,36016L,36017L,36018L,36019L,36020L, 36021L,36022L,36023L,36024L,36025L,36026L,36027L,36028L,36029L,36030L, 36031L,36032L,36033L,36034L,36035L,36036L,36037L,36038L,36039L,36040L, 36041L,36042L,36043L,36044L,36045L,36046L,36047L,36048L,36049L,36050L, 36051L,36052L,36053L,36054L,36055L,36056L,36057L,36058L,36059L,36060L, 36061L,36062L,36063L,36064L,36065L,36066L,36067L,36068L,36069L,36070L, 36071L,36072L,36073L,36074L,36075L,36076L,36077L,36078L,36079L,36080L, 36081L,36082L,36083L,36084L,36085L,36086L,36087L,36088L,36089L,36090L, 36091L,36092L,36093L,36094L,36095L,36096L,36097L,36098L,36099L,36100L, 36101L,36102L,36103L,36104L,36105L,36106L,36107L,36108L,36109L,36110L, 36111L,36112L,36113L,36114L,36115L,36116L,36117L,36118L,36119L,36120L, 36121L,36122L,36123L,36124L,36125L,36126L,36127L,36128L,36129L,36130L, 36131L,36132L,36133L,36134L,36135L,36136L,36137L,36138L,36139L,36140L, 36141L,36142L,36143L,36144L,36145L,36146L,36147L,36148L,36149L,36150L, 36151L,36152L,36153L,36154L,36155L,36156L,36157L,36158L,36159L,36160L, 36161L,36162L,36163L,36164L,36165L,36166L,36167L,36168L,36169L,36170L, 36171L,36172L,36173L,36174L,36175L,36176L,36177L,36178L,36179L,36180L, 36181L,36182L,36183L,36184L,36185L,36186L,36187L,36188L,36189L,36190L, 36191L,36192L,36193L,36194L,36195L,36196L,36197L,36198L,36199L,36200L, 36201L,36202L,36203L,36204L,36205L,36206L,36207L,36208L,36209L,36210L, 36211L,36212L,36213L,36214L,36215L,36216L,36217L,36218L,36219L,36220L, 36221L,36222L,36223L,36224L,36225L,36226L,36227L,36228L,36229L,36230L, 36231L,36232L,36233L,36234L,36235L,36236L,36237L,36238L,36239L,36240L, 36241L,36242L,36243L,36244L,36245L,36246L,36247L,36248L,36249L,36250L, 36251L,36252L,36253L,36254L,36255L,36256L,36257L,36258L,36259L,36260L, 36261L,36262L,36263L,36264L,36265L,36266L,36267L,36268L,36269L,36270L, 36271L,36272L,36273L,36274L,36275L,36276L,36277L,36278L,36279L,36280L, 36281L,36282L,36283L,36284L,36285L,36286L,36287L,36288L,36289L,36290L, 36291L,36292L,36293L,36294L,36295L,36296L,36297L,36298L,36299L,36300L, 36301L,36302L,36303L,36304L,36305L,36306L,36307L,36308L,36309L,36310L, 36311L,36312L,36313L,36314L,36315L,36316L,36317L,36318L,36319L,36320L, 36321L,36322L,36323L,36324L,36325L,36326L,36327L,36328L,36329L,36330L, 36331L,36332L,36333L,36334L,36335L,36336L,36337L,36338L,36339L,36340L, 36341L,36342L,36343L,36344L,36345L,36346L,36347L,36348L,36349L,36350L, 36351L,36352L,36353L,36354L,36355L,36356L,36357L,36358L,36359L,36360L, 36361L,36362L,36363L,36364L,36365L,36366L,36367L,36368L,36369L,36370L, 36371L,36372L,36373L,36374L,36375L,36376L,36377L,36378L,36379L,36380L, 36381L,36382L,36383L,36384L,36385L,36386L,36387L,36388L,36389L,36390L, 36391L,36392L,36393L,36394L,36395L,36396L,36397L,36398L,36399L,36400L, 36401L,36402L,36403L,36404L,36405L,36406L,36407L,36408L,36409L,36410L, 36411L,36412L,36413L,36414L,36415L,36416L,36417L,36418L,36419L,36420L, 36421L,36422L,36423L,36424L,36425L,36426L,36427L,36428L,36429L,36430L, 36431L,36432L,36433L,36434L,36435L,36436L,36437L,36438L,36439L,36440L, 36441L,36442L,36443L,36444L,36445L,36446L,36447L,36448L,36449L,36450L, 36451L,36452L,36453L,36454L,36455L,36456L,36457L,36458L,36459L,36460L, 36461L,36462L,36463L,36464L,36465L,36466L,36467L,36468L,36469L,36470L, 36471L,36472L,36473L,36474L,36475L,36476L,36477L,36478L,36479L,36480L, 36481L,36482L,36483L,36484L,36485L,36486L,36487L,36488L,36489L,36490L, 36491L,36492L,36493L,36494L,36495L,36496L,36497L,36498L,36499L,36500L, 36501L,36502L,36503L,36504L,36505L,36506L,36507L,36508L,36509L,36510L, 36511L,36512L,36513L,36514L,36515L,36516L,36517L,36518L,36519L,36520L, 36521L,36522L,36523L,36524L,36525L,36526L,36527L,36528L,36529L,36530L, 36531L,36532L,36533L,36534L,36535L,36536L,36537L,36538L,36539L,36540L, 36541L,36542L,36543L,36544L,36545L,36546L,36547L,36548L,36549L,36550L, 36551L,36552L,36553L,36554L,36555L,36556L,36557L,36558L,36559L,36560L, 36561L,36562L,36563L,36564L,36565L,36566L,36567L,36568L,36569L,36570L, 36571L,36572L,36573L,36574L,36575L,36576L,36577L,36578L,36579L,36580L, 36581L,36582L,36583L,36584L,36585L,36586L,36587L,36588L,36589L,36590L, 36591L,36592L,36593L,36594L,36595L,36596L,36597L,36598L,36599L,36600L, 36601L,36602L,36603L,36604L,36605L,36606L,36607L,36608L,36609L,36610L, 36611L,36612L,36613L,36614L,36615L,36616L,36617L,36618L,36619L,36620L, 36621L,36622L,36623L,36624L,36625L,36626L,36627L,36628L,36629L,36630L, 36631L,36632L,36633L,36634L,36635L,36636L,36637L,36638L,36639L,36640L, 36641L,36642L,36643L,36644L,36645L,36646L,36647L,36648L,36649L,36650L, 36651L,36652L,36653L,36654L,36655L,36656L,36657L,36658L,36659L,36660L, 36661L,36662L,36663L,36664L,36665L,36666L,36667L,36668L,36669L,36670L, 36671L,36672L,36673L,36674L,36675L,36676L,36677L,36678L,36679L,36680L, 36681L,36682L,36683L,36684L,36685L,36686L,36687L,36688L,36689L,36690L, 36691L,36692L,36693L,36694L,36695L,36696L,36697L,36698L,36699L,36700L, 36701L,36702L,36703L,36704L,36705L,36706L,36707L,36708L,36709L,36710L, 36711L,36712L,36713L,36714L,36715L,36716L,36717L,36718L,36719L,36720L, 36721L,36722L,36723L,36724L,36725L,36726L,36727L,36728L,36729L,36730L, 36731L,36732L,36733L,36734L,36735L,36736L,36737L,36738L,36739L,36740L, 36741L,36742L,36743L,36744L,36745L,36746L,36747L,36748L,36749L,36750L, 36751L,36752L,36753L,36754L,36755L,36756L,36757L,36758L,36759L,36760L, 36761L,36762L,36763L,36764L,36765L,36766L,36767L,36768L,36769L,36770L, 36771L,36772L,36773L,36774L,36775L,36776L,36777L,36778L,36779L,36780L, 36781L,36782L,36783L,36784L,36785L,36786L,36787L,36788L,36789L,36790L, 36791L,36792L,36793L,36794L,36795L,36796L,36797L,36798L,36799L,36800L, 36801L,36802L,36803L,36804L,36805L,36806L,36807L,36808L,36809L,36810L, 36811L,36812L,36813L,36814L,36815L,36816L,36817L,36818L,36819L,36820L, 36821L,36822L,36823L,36824L,36825L,36826L,36827L,36828L,36829L,36830L, 36831L,36832L,36833L,36834L,36835L,36836L,36837L,36838L,36839L,36840L, 36841L,36842L,36843L,36844L,36845L,36846L,36847L,36848L,36849L,36850L, 36851L,36852L,36853L,36854L,36855L,36856L,36857L,36858L,36859L,36860L, 36861L,36862L,36863L,36864L,36865L,36866L,36867L,36868L,36869L,36870L, 36871L,36872L,36873L,36874L,36875L,36876L,36877L,36878L,36879L,36880L, 36881L,36882L,36883L,36884L,36885L,36886L,36887L,36888L,36889L,36890L, 36891L,36892L,36893L,36894L,36895L,36896L,36897L,36898L,36899L,36900L, 36901L,36902L,36903L,36904L,36905L,36906L,36907L,36908L,36909L,36910L, 36911L,36912L,36913L,36914L,36915L,36916L,36917L,36918L,36919L,36920L, 36921L,36922L,36923L,36924L,36925L,36926L,36927L,36928L,36929L,36930L, 36931L,36932L,36933L,36934L,36935L,36936L,36937L,36938L,36939L,36940L, 36941L,36942L,36943L,36944L,36945L,36946L,36947L,36948L,36949L,36950L, 36951L,36952L,36953L,36954L,36955L,36956L,36957L,36958L,36959L,36960L, 36961L,36962L,36963L,36964L,36965L,36966L,36967L,36968L,36969L,36970L, 36971L,36972L,36973L,36974L,36975L,36976L,36977L,36978L,36979L,36980L, 36981L,36982L,36983L,36984L,36985L,36986L,36987L,36988L,36989L,36990L, 36991L,36992L,36993L,36994L,36995L,36996L,36997L,36998L,36999L,37000L, 37001L,37002L,37003L,37004L,37005L,37006L,37007L,37008L,37009L,37010L, 37011L,37012L,37013L,37014L,37015L,37016L,37017L,37018L,37019L,37020L, 37021L,37022L,37023L,37024L,37025L,37026L,37027L,37028L,37029L,37030L, 37031L,37032L,37033L,37034L,37035L,37036L,37037L,37038L,37039L,37040L, 37041L,37042L,37043L,37044L,37045L,37046L,37047L,37048L,37049L,37050L, 37051L,37052L,37053L,37054L,37055L,37056L,37057L,37058L,37059L,37060L, 37061L,37062L,37063L,37064L,37065L,37066L,37067L,37068L,37069L,37070L, 37071L,37072L,37073L,37074L,37075L,37076L,37077L,37078L,37079L,37080L, 37081L,37082L,37083L,37084L,37085L,37086L,37087L,37088L,37089L,37090L, 37091L,37092L,37093L,37094L,37095L,37096L,37097L,37098L,37099L,37100L, 37101L,37102L,37103L,37104L,37105L,37106L,37107L,37108L,37109L,37110L, 37111L,37112L,37113L,37114L,37115L,37116L,37117L,37118L,37119L,37120L, 37121L,37122L,37123L,37124L,37125L,37126L,37127L,37128L,37129L,37130L, 37131L,37132L,37133L,37134L,37135L,37136L,37137L,37138L,37139L,37140L, 37141L,37142L,37143L,37144L,37145L,37146L,37147L,37148L,37149L,37150L, 37151L,37152L,37153L,37154L,37155L,37156L,37157L,37158L,37159L,37160L, 37161L,37162L,37163L,37164L,37165L,37166L,37167L,37168L,37169L,37170L, 37171L,37172L,37173L,37174L,37175L,37176L,37177L,37178L,37179L,37180L, 37181L,37182L,37183L,37184L,37185L,37186L,37187L,37188L,37189L,37190L, 37191L,37192L,37193L,37194L,37195L,37196L,37197L,37198L,37199L,37200L, 37201L,37202L,37203L,37204L,37205L,37206L,37207L,37208L,37209L,37210L, 37211L,37212L,37213L,37214L,37215L,37216L,37217L,37218L,37219L,37220L, 37221L,37222L,37223L,37224L,37225L,37226L,37227L,37228L,37229L,37230L, 37231L,37232L,37233L,37234L,37235L,37236L,37237L,37238L,37239L,37240L, 37241L,37242L,37243L,37244L,37245L,37246L,37247L,37248L,37249L,37250L, 37251L,37252L,37253L,37254L,37255L,37256L,37257L,37258L,37259L,37260L, 37261L,37262L,37263L,37264L,37265L,37266L,37267L,37268L,37269L,37270L, 37271L,37272L,37273L,37274L,37275L,37276L,37277L,37278L,37279L,37280L, 37281L,37282L,37283L,37284L,37285L,37286L,37287L,37288L,37289L,37290L, 37291L,37292L,37293L,37294L,37295L,37296L,37297L,37298L,37299L,37300L, 37301L,37302L,37303L,37304L,37305L,37306L,37307L,37308L,37309L,37310L, 37311L,37312L,37313L,37314L,37315L,37316L,37317L,37318L,37319L,37320L, 37321L,37322L,37323L,37324L,37325L,37326L,37327L,37328L,37329L,37330L, 37331L,37332L,37333L,37334L,37335L,37336L,37337L,37338L,37339L,37340L, 37341L,37342L,37343L,37344L,37345L,37346L,37347L,37348L,37349L,37350L, 37351L,37352L,37353L,37354L,37355L,37356L,37357L,37358L,37359L,37360L, 37361L,37362L,37363L,37364L,37365L,37366L,37367L,37368L,37369L,37370L, 37371L,37372L,37373L,37374L,37375L,37376L,37377L,37378L,37379L,37380L, 37381L,37382L,37383L,37384L,37385L,37386L,37387L,37388L,37389L,37390L, 37391L,37392L,37393L,37394L,37395L,37396L,37397L,37398L,37399L,37400L, 37401L,37402L,37403L,37404L,37405L,37406L,37407L,37408L,37409L,37410L, 37411L,37412L,37413L,37414L,37415L,37416L,37417L,37418L,37419L,37420L, 37421L,37422L,37423L,37424L,37425L,37426L,37427L,37428L,37429L,37430L, 37431L,37432L,37433L,37434L,37435L,37436L,37437L,37438L,37439L,37440L, 37441L,37442L,37443L,37444L,37445L,37446L,37447L,37448L,37449L,37450L, 37451L,37452L,37453L,37454L,37455L,37456L,37457L,37458L,37459L,37460L, 37461L,37462L,37463L,37464L,37465L,37466L,37467L,37468L,37469L,37470L, 37471L,37472L,37473L,37474L,37475L,37476L,37477L,37478L,37479L,37480L, 37481L,37482L,37483L,37484L,37485L,37486L,37487L,37488L,37489L,37490L, 37491L,37492L,37493L,37494L,37495L,37496L,37497L,37498L,37499L,37500L, 37501L,37502L,37503L,37504L,37505L,37506L,37507L,37508L,37509L,37510L, 37511L,37512L,37513L,37514L,37515L,37516L,37517L,37518L,37519L,37520L, 37521L,37522L,37523L,37524L,37525L,37526L,37527L,37528L,37529L,37530L, 37531L,37532L,37533L,37534L,37535L,37536L,37537L,37538L,37539L,37540L, 37541L,37542L,37543L,37544L,37545L,37546L,37547L,37548L,37549L,37550L, 37551L,37552L,37553L,37554L,37555L,37556L,37557L,37558L,37559L,37560L, 37561L,37562L,37563L,37564L,37565L,37566L,37567L,37568L,37569L,37570L, 37571L,37572L,37573L,37574L,37575L,37576L,37577L,37578L,37579L,37580L, 37581L,37582L,37583L,37584L,37585L,37586L,37587L,37588L,37589L,37590L, 37591L,37592L,37593L,37594L,37595L,37596L,37597L,37598L,37599L,37600L, 37601L,37602L,37603L,37604L,37605L,37606L,37607L,37608L,37609L,37610L, 37611L,37612L,37613L,37614L,37615L,37616L,37617L,37618L,37619L,37620L, 37621L,37622L,37623L,37624L,37625L,37626L,37627L,37628L,37629L,37630L, 37631L,37632L,37633L,37634L,37635L,37636L,37637L,37638L,37639L,37640L, 37641L,37642L,37643L,37644L,37645L,37646L,37647L,37648L,37649L,37650L, 37651L,37652L,37653L,37654L,37655L,37656L,37657L,37658L,37659L,37660L, 37661L,37662L,37663L,37664L,37665L,37666L,37667L,37668L,37669L,37670L, 37671L,37672L,37673L,37674L,37675L,37676L,37677L,37678L,37679L,37680L, 37681L,37682L,37683L,37684L,37685L,37686L,37687L,37688L,37689L,37690L, 37691L,37692L,37693L,37694L,37695L,37696L,37697L,37698L,37699L,37700L, 37701L,37702L,37703L,37704L,37705L,37706L,37707L,37708L,37709L,37710L, 37711L,37712L,37713L,37714L,37715L,37716L,37717L,37718L,37719L,37720L, 37721L,37722L,37723L,37724L,37725L,37726L,37727L,37728L,37729L,37730L, 37731L,37732L,37733L,37734L,37735L,37736L,37737L,37738L,37739L,37740L, 37741L,37742L,37743L,37744L,37745L,37746L,37747L,37748L,37749L,37750L, 37751L,37752L,37753L,37754L,37755L,37756L,37757L,37758L,37759L,37760L, 37761L,37762L,37763L,37764L,37765L,37766L,37767L,37768L,37769L,37770L, 37771L,37772L,37773L,37774L,37775L,37776L,37777L,37778L,37779L,37780L, 37781L,37782L,37783L,37784L,37785L,37786L,37787L,37788L,37789L,37790L, 37791L,37792L,37793L,37794L,37795L,37796L,37797L,37798L,37799L,37800L, 37801L,37802L,37803L,37804L,37805L,37806L,37807L,37808L,37809L,37810L, 37811L,37812L,37813L,37814L,37815L,37816L,37817L,37818L,37819L,37820L, 37821L,37822L,37823L,37824L,37825L,37826L,37827L,37828L,37829L,37830L, 37831L,37832L,37833L,37834L,37835L,37836L,37837L,37838L,37839L,37840L, 37841L,37842L,37843L,37844L,37845L,37846L,37847L,37848L,37849L,37850L, 37851L,37852L,37853L,37854L,37855L,37856L,37857L,37858L,37859L,37860L, 37861L,37862L,37863L,37864L,37865L,37866L,37867L,37868L,37869L,37870L, 37871L,37872L,37873L,37874L,37875L,37876L,37877L,37878L,37879L,37880L, 37881L,37882L,37883L,37884L,37885L,37886L,37887L,37888L,37889L,37890L, 37891L,37892L,37893L,37894L,37895L,37896L,37897L,37898L,37899L,37900L, 37901L,37902L,37903L,37904L,37905L,37906L,37907L,37908L,37909L,37910L, 37911L,37912L,37913L,37914L,37915L,37916L,37917L,37918L,37919L,37920L, 37921L,37922L,37923L,37924L,37925L,37926L,37927L,37928L,37929L,37930L, 37931L,37932L,37933L,37934L,37935L,37936L,37937L,37938L,37939L,37940L, 37941L,37942L,37943L,37944L,37945L,37946L,37947L,37948L,37949L,37950L, 37951L,37952L,37953L,37954L,37955L,37956L,37957L,37958L,37959L,37960L, 37961L,37962L,37963L,37964L,37965L,37966L,37967L,37968L,37969L,37970L, 37971L,37972L,37973L,37974L,37975L,37976L,37977L,37978L,37979L,37980L, 37981L,37982L,37983L,37984L,37985L,37986L,37987L,37988L,37989L,37990L, 37991L,37992L,37993L,37994L,37995L,37996L,37997L,37998L,37999L,38000L, 38001L,38002L,38003L,38004L,38005L,38006L,38007L,38008L,38009L,38010L, 38011L,38012L,38013L,38014L,38015L,38016L,38017L,38018L,38019L,38020L, 38021L,38022L,38023L,38024L,38025L,38026L,38027L,38028L,38029L,38030L, 38031L,38032L,38033L,38034L,38035L,38036L,38037L,38038L,38039L,38040L, 38041L,38042L,38043L,38044L,38045L,38046L,38047L,38048L,38049L,38050L, 38051L,38052L,38053L,38054L,38055L,38056L,38057L,38058L,38059L,38060L, 38061L,38062L,38063L,38064L,38065L,38066L,38067L,38068L,38069L,38070L, 38071L,38072L,38073L,38074L,38075L,38076L,38077L,38078L,38079L,38080L, 38081L,38082L,38083L,38084L,38085L,38086L,38087L,38088L,38089L,38090L, 38091L,38092L,38093L,38094L,38095L,38096L,38097L,38098L,38099L,38100L, 38101L,38102L,38103L,38104L,38105L,38106L,38107L,38108L,38109L,38110L, 38111L,38112L,38113L,38114L,38115L,38116L,38117L,38118L,38119L,38120L, 38121L,38122L,38123L,38124L,38125L,38126L,38127L,38128L,38129L,38130L, 38131L,38132L,38133L,38134L,38135L,38136L,38137L,38138L,38139L,38140L, 38141L,38142L,38143L,38144L,38145L,38146L,38147L,38148L,38149L,38150L, 38151L,38152L,38153L,38154L,38155L,38156L,38157L,38158L,38159L,38160L, 38161L,38162L,38163L,38164L,38165L,38166L,38167L,38168L,38169L,38170L, 38171L,38172L,38173L,38174L,38175L,38176L,38177L,38178L,38179L,38180L, 38181L,38182L,38183L,38184L,38185L,38186L,38187L,38188L,38189L,38190L, 38191L,38192L,38193L,38194L,38195L,38196L,38197L,38198L,38199L,38200L, 38201L,38202L,38203L,38204L,38205L,38206L,38207L,38208L,38209L,38210L, 38211L,38212L,38213L,38214L,38215L,38216L,38217L,38218L,38219L,38220L, 38221L,38222L,38223L,38224L,38225L,38226L,38227L,38228L,38229L,38230L, 38231L,38232L,38233L,38234L,38235L,38236L,38237L,38238L,38239L,38240L, 38241L,38242L,38243L,38244L,38245L,38246L,38247L,38248L,38249L,38250L, 38251L,38252L,38253L,38254L,38255L,38256L,38257L,38258L,38259L,38260L, 38261L,38262L,38263L,38264L,38265L,38266L,38267L,38268L,38269L,38270L, 38271L,38272L,38273L,38274L,38275L,38276L,38277L,38278L,38279L,38280L, 38281L,38282L,38283L,38284L,38285L,38286L,38287L,38288L,38289L,38290L, 38291L,38292L,38293L,38294L,38295L,38296L,38297L,38298L,38299L,38300L, 38301L,38302L,38303L,38304L,38305L,38306L,38307L,38308L,38309L,38310L, 38311L,38312L,38313L,38314L,38315L,38316L,38317L,38318L,38319L,38320L, 38321L,38322L,38323L,38324L,38325L,38326L,38327L,38328L,38329L,38330L, 38331L,38332L,38333L,38334L,38335L,38336L,38337L,38338L,38339L,38340L, 38341L,38342L,38343L,38344L,38345L,38346L,38347L,38348L,38349L,38350L, 38351L,38352L,38353L,38354L,38355L,38356L,38357L,38358L,38359L,38360L, 38361L,38362L,38363L,38364L,38365L,38366L,38367L,38368L,38369L,38370L, 38371L,38372L,38373L,38374L,38375L,38376L,38377L,38378L,38379L,38380L, 38381L,38382L,38383L,38384L,38385L,38386L,38387L,38388L,38389L,38390L, 38391L,38392L,38393L,38394L,38395L,38396L,38397L,38398L,38399L,38400L, 38401L,38402L,38403L,38404L,38405L,38406L,38407L,38408L,38409L,38410L, 38411L,38412L,38413L,38414L,38415L,38416L,38417L,38418L,38419L,38420L, 38421L,38422L,38423L,38424L,38425L,38426L,38427L,38428L,38429L,38430L, 38431L,38432L,38433L,38434L,38435L,38436L,38437L,38438L,38439L,38440L, 38441L,38442L,38443L,38444L,38445L,38446L,38447L,38448L,38449L,38450L, 38451L,38452L,38453L,38454L,38455L,38456L,38457L,38458L,38459L,38460L, 38461L,38462L,38463L,38464L,38465L,38466L,38467L,38468L,38469L,38470L, 38471L,38472L,38473L,38474L,38475L,38476L,38477L,38478L,38479L,38480L, 38481L,38482L,38483L,38484L,38485L,38486L,38487L,38488L,38489L,38490L, 38491L,38492L,38493L,38494L,38495L,38496L,38497L,38498L,38499L,38500L, 38501L,38502L,38503L,38504L,38505L,38506L,38507L,38508L,38509L,38510L, 38511L,38512L,38513L,38514L,38515L,38516L,38517L,38518L,38519L,38520L, 38521L,38522L,38523L,38524L,38525L,38526L,38527L,38528L,38529L,38530L, 38531L,38532L,38533L,38534L,38535L,38536L,38537L,38538L,38539L,38540L, 38541L,38542L,38543L,38544L,38545L,38546L,38547L,38548L,38549L,38550L, 38551L,38552L,38553L,38554L,38555L,38556L,38557L,38558L,38559L,38560L, 38561L,38562L,38563L,38564L,38565L,38566L,38567L,38568L,38569L,38570L, 38571L,38572L,38573L,38574L,38575L,38576L,38577L,38578L,38579L,38580L, 38581L,38582L,38583L,38584L,38585L,38586L,38587L,38588L,38589L,38590L, 38591L,38592L,38593L,38594L,38595L,38596L,38597L,38598L,38599L,38600L, 38601L,38602L,38603L,38604L,38605L,38606L,38607L,38608L,38609L,38610L, 38611L,38612L,38613L,38614L,38615L,38616L,38617L,38618L,38619L,38620L, 38621L,38622L,38623L,38624L,38625L,38626L,38627L,38628L,38629L,38630L, 38631L,38632L,38633L,38634L,38635L,38636L,38637L,38638L,38639L,38640L, 38641L,38642L,38643L,38644L,38645L,38646L,38647L,38648L,38649L,38650L, 38651L,38652L,38653L,38654L,38655L,38656L,38657L,38658L,38659L,38660L, 38661L,38662L,38663L,38664L,38665L,38666L,38667L,38668L,38669L,38670L, 38671L,38672L,38673L,38674L,38675L,38676L,38677L,38678L,38679L,38680L, 38681L,38682L,38683L,38684L,38685L,38686L,38687L,38688L,38689L,38690L, 38691L,38692L,38693L,38694L,38695L,38696L,38697L,38698L,38699L,38700L, 38701L,38702L,38703L,38704L,38705L,38706L,38707L,38708L,38709L,38710L, 38711L,38712L,38713L,38714L,38715L,38716L,38717L,38718L,38719L,38720L, 38721L,38722L,38723L,38724L,38725L,38726L,38727L,38728L,38729L,38730L, 38731L,38732L,38733L,38734L,38735L,38736L,38737L,38738L,38739L,38740L, 38741L,38742L,38743L,38744L,38745L,38746L,38747L,38748L,38749L,38750L, 38751L,38752L,38753L,38754L,38755L,38756L,38757L,38758L,38759L,38760L, 38761L,38762L,38763L,38764L,38765L,38766L,38767L,38768L,38769L,38770L, 38771L,38772L,38773L,38774L,38775L,38776L,38777L,38778L,38779L,38780L, 38781L,38782L,38783L,38784L,38785L,38786L,38787L,38788L,38789L,38790L, 38791L,38792L,38793L,38794L,38795L,38796L,38797L,38798L,38799L,38800L, 38801L,38802L,38803L,38804L,38805L,38806L,38807L,38808L,38809L,38810L, 38811L,38812L,38813L,38814L,38815L,38816L,38817L,38818L,38819L,38820L, 38821L,38822L,38823L,38824L,38825L,38826L,38827L,38828L,38829L,38830L, 38831L,38832L,38833L,38834L,38835L,38836L,38837L,38838L,38839L,38840L, 38841L,38842L,38843L,38844L,38845L,38846L,38847L,38848L,38849L,38850L, 38851L,38852L,38853L,38854L,38855L,38856L,38857L,38858L,38859L,38860L, 38861L,38862L,38863L,38864L,38865L,38866L,38867L,38868L,38869L,38870L, 38871L,38872L,38873L,38874L,38875L,38876L,38877L,38878L,38879L,38880L, 38881L,38882L,38883L,38884L,38885L,38886L,38887L,38888L,38889L,38890L, 38891L,38892L,38893L,38894L,38895L,38896L,38897L,38898L,38899L,38900L, 38901L,38902L,38903L,38904L,38905L,38906L,38907L,38908L,38909L,38910L, 38911L,38912L,38913L,38914L,38915L,38916L,38917L,38918L,38919L,38920L, 38921L,38922L,38923L,38924L,38925L,38926L,38927L,38928L,38929L,38930L, 38931L,38932L,38933L,38934L,38935L,38936L,38937L,38938L,38939L,38940L, 38941L,38942L,38943L,38944L,38945L,38946L,38947L,38948L,38949L,38950L, 38951L,38952L,38953L,38954L,38955L,38956L,38957L,38958L,38959L,38960L, 38961L,38962L,38963L,38964L,38965L,38966L,38967L,38968L,38969L,38970L, 38971L,38972L,38973L,38974L,38975L,38976L,38977L,38978L,38979L,38980L, 38981L,38982L,38983L,38984L,38985L,38986L,38987L,38988L,38989L,38990L, 38991L,38992L,38993L,38994L,38995L,38996L,38997L,38998L,38999L,39000L, 39001L,39002L,39003L,39004L,39005L,39006L,39007L,39008L,39009L,39010L, 39011L,39012L,39013L,39014L,39015L,39016L,39017L,39018L,39019L,39020L, 39021L,39022L,39023L,39024L,39025L,39026L,39027L,39028L,39029L,39030L, 39031L,39032L,39033L,39034L,39035L,39036L,39037L,39038L,39039L,39040L, 39041L,39042L,39043L,39044L,39045L,39046L,39047L,39048L,39049L,39050L, 39051L,39052L,39053L,39054L,39055L,39056L,39057L,39058L,39059L,39060L, 39061L,39062L,39063L,39064L,39065L,39066L,39067L,39068L,39069L,39070L, 39071L,39072L,39073L,39074L,39075L,39076L,39077L,39078L,39079L,39080L, 39081L,39082L,39083L,39084L,39085L,39086L,39087L,39088L,39089L,39090L, 39091L,39092L,39093L,39094L,39095L,39096L,39097L,39098L,39099L,39100L, 39101L,39102L,39103L,39104L,39105L,39106L,39107L,39108L,39109L,39110L, 39111L,39112L,39113L,39114L,39115L,39116L,39117L,39118L,39119L,39120L, 39121L,39122L,39123L,39124L,39125L,39126L,39127L,39128L,39129L,39130L, 39131L,39132L,39133L,39134L,39135L,39136L,39137L,39138L,39139L,39140L, 39141L,39142L,39143L,39144L,39145L,39146L,39147L,39148L,39149L,39150L, 39151L,39152L,39153L,39154L,39155L,39156L,39157L,39158L,39159L,39160L, 39161L,39162L,39163L,39164L,39165L,39166L,39167L,39168L,39169L,39170L, 39171L,39172L,39173L,39174L,39175L,39176L,39177L,39178L,39179L,39180L, 39181L,39182L,39183L,39184L,39185L,39186L,39187L,39188L,39189L,39190L, 39191L,39192L,39193L,39194L,39195L,39196L,39197L,39198L,39199L,39200L, 39201L,39202L,39203L,39204L,39205L,39206L,39207L,39208L,39209L,39210L, 39211L,39212L,39213L,39214L,39215L,39216L,39217L,39218L,39219L,39220L, 39221L,39222L,39223L,39224L,39225L,39226L,39227L,39228L,39229L,39230L, 39231L,39232L,39233L,39234L,39235L,39236L,39237L,39238L,39239L,39240L, 39241L,39242L,39243L,39244L,39245L,39246L,39247L,39248L,39249L,39250L, 39251L,39252L,39253L,39254L,39255L,39256L,39257L,39258L,39259L,39260L, 39261L,39262L,39263L,39264L,39265L,39266L,39267L,39268L,39269L,39270L, 39271L,39272L,39273L,39274L,39275L,39276L,39277L,39278L,39279L,39280L, 39281L,39282L,39283L,39284L,39285L,39286L,39287L,39288L,39289L,39290L, 39291L,39292L,39293L,39294L,39295L,39296L,39297L,39298L,39299L,39300L, 39301L,39302L,39303L,39304L,39305L,39306L,39307L,39308L,39309L,39310L, 39311L,39312L,39313L,39314L,39315L,39316L,39317L,39318L,39319L,39320L, 39321L,39322L,39323L,39324L,39325L,39326L,39327L,39328L,39329L,39330L, 39331L,39332L,39333L,39334L,39335L,39336L,39337L,39338L,39339L,39340L, 39341L,39342L,39343L,39344L,39345L,39346L,39347L,39348L,39349L,39350L, 39351L,39352L,39353L,39354L,39355L,39356L,39357L,39358L,39359L,39360L, 39361L,39362L,39363L,39364L,39365L,39366L,39367L,39368L,39369L,39370L, 39371L,39372L,39373L,39374L,39375L,39376L,39377L,39378L,39379L,39380L, 39381L,39382L,39383L,39384L,39385L,39386L,39387L,39388L,39389L,39390L, 39391L,39392L,39393L,39394L,39395L,39396L,39397L,39398L,39399L,39400L, 39401L,39402L,39403L,39404L,39405L,39406L,39407L,39408L,39409L,39410L, 39411L,39412L,39413L,39414L,39415L,39416L,39417L,39418L,39419L,39420L, 39421L,39422L,39423L,39424L,39425L,39426L,39427L,39428L,39429L,39430L, 39431L,39432L,39433L,39434L,39435L,39436L,39437L,39438L,39439L,39440L, 39441L,39442L,39443L,39444L,39445L,39446L,39447L,39448L,39449L,39450L, 39451L,39452L,39453L,39454L,39455L,39456L,39457L,39458L,39459L,39460L, 39461L,39462L,39463L,39464L,39465L,39466L,39467L,39468L,39469L,39470L, 39471L,39472L,39473L,39474L,39475L,39476L,39477L,39478L,39479L,39480L, 39481L,39482L,39483L,39484L,39485L,39486L,39487L,39488L,39489L,39490L, 39491L,39492L,39493L,39494L,39495L,39496L,39497L,39498L,39499L,39500L, 39501L,39502L,39503L,39504L,39505L,39506L,39507L,39508L,39509L,39510L, 39511L,39512L,39513L,39514L,39515L,39516L,39517L,39518L,39519L,39520L, 39521L,39522L,39523L,39524L,39525L,39526L,39527L,39528L,39529L,39530L, 39531L,39532L,39533L,39534L,39535L,39536L,39537L,39538L,39539L,39540L, 39541L,39542L,39543L,39544L,39545L,39546L,39547L,39548L,39549L,39550L, 39551L,39552L,39553L,39554L,39555L,39556L,39557L,39558L,39559L,39560L, 39561L,39562L,39563L,39564L,39565L,39566L,39567L,39568L,39569L,39570L, 39571L,39572L,39573L,39574L,39575L,39576L,39577L,39578L,39579L,39580L, 39581L,39582L,39583L,39584L,39585L,39586L,39587L,39588L,39589L,39590L, 39591L,39592L,39593L,39594L,39595L,39596L,39597L,39598L,39599L,39600L, 39601L,39602L,39603L,39604L,39605L,39606L,39607L,39608L,39609L,39610L, 39611L,39612L,39613L,39614L,39615L,39616L,39617L,39618L,39619L,39620L, 39621L,39622L,39623L,39624L,39625L,39626L,39627L,39628L,39629L,39630L, 39631L,39632L,39633L,39634L,39635L,39636L,39637L,39638L,39639L,39640L, 39641L,39642L,39643L,39644L,39645L,39646L,39647L,39648L,39649L,39650L, 39651L,39652L,39653L,39654L,39655L,39656L,39657L,39658L,39659L,39660L, 39661L,39662L,39663L,39664L,39665L,39666L,39667L,39668L,39669L,39670L, 39671L,39672L,39673L,39674L,39675L,39676L,39677L,39678L,39679L,39680L, 39681L,39682L,39683L,39684L,39685L,39686L,39687L,39688L,39689L,39690L, 39691L,39692L,39693L,39694L,39695L,39696L,39697L,39698L,39699L,39700L, 39701L,39702L,39703L,39704L,39705L,39706L,39707L,39708L,39709L,39710L, 39711L,39712L,39713L,39714L,39715L,39716L,39717L,39718L,39719L,39720L, 39721L,39722L,39723L,39724L,39725L,39726L,39727L,39728L,39729L,39730L, 39731L,39732L,39733L,39734L,39735L,39736L,39737L,39738L,39739L,39740L, 39741L,39742L,39743L,39744L,39745L,39746L,39747L,39748L,39749L,39750L, 39751L,39752L,39753L,39754L,39755L,39756L,39757L,39758L,39759L,39760L, 39761L,39762L,39763L,39764L,39765L,39766L,39767L,39768L,39769L,39770L, 39771L,39772L,39773L,39774L,39775L,39776L,39777L,39778L,39779L,39780L, 39781L,39782L,39783L,39784L,39785L,39786L,39787L,39788L,39789L,39790L, 39791L,39792L,39793L,39794L,39795L,39796L,39797L,39798L,39799L,39800L, 39801L,39802L,39803L,39804L,39805L,39806L,39807L,39808L,39809L,39810L, 39811L,39812L,39813L,39814L,39815L,39816L,39817L,39818L,39819L,39820L, 39821L,39822L,39823L,39824L,39825L,39826L,39827L,39828L,39829L,39830L, 39831L,39832L,39833L,39834L,39835L,39836L,39837L,39838L,39839L,39840L, 39841L,39842L,39843L,39844L,39845L,39846L,39847L,39848L,39849L,39850L, 39851L,39852L,39853L,39854L,39855L,39856L,39857L,39858L,39859L,39860L, 39861L,39862L,39863L,39864L,39865L,39866L,39867L,39868L,39869L,39870L, 39871L,39872L,39873L,39874L,39875L,39876L,39877L,39878L,39879L,39880L, 39881L,39882L,39883L,39884L,39885L,39886L,39887L,39888L,39889L,39890L, 39891L,39892L,39893L,39894L,39895L,39896L,39897L,39898L,39899L,39900L, 39901L,39902L,39903L,39904L,39905L,39906L,39907L,39908L,39909L,39910L, 39911L,39912L,39913L,39914L,39915L,39916L,39917L,39918L,39919L,39920L, 39921L,39922L,39923L,39924L,39925L,39926L,39927L,39928L,39929L,39930L, 39931L,39932L,39933L,39934L,39935L,39936L,39937L,39938L,39939L,39940L, 39941L,39942L,39943L,39944L,39945L,39946L,39947L,39948L,39949L,39950L, 39951L,39952L,39953L,39954L,39955L,39956L,39957L,39958L,39959L,39960L, 39961L,39962L,39963L,39964L,39965L,39966L,39967L,39968L,39969L,39970L, 39971L,39972L,39973L,39974L,39975L,39976L,39977L,39978L,39979L,39980L, 39981L,39982L,39983L,39984L,39985L,39986L,39987L,39988L,39989L,39990L, 39991L,39992L,39993L,39994L,39995L,39996L,39997L,39998L,39999L,40000L, 40001L,40002L,40003L,40004L,40005L,40006L,40007L,40008L,40009L,40010L, 40011L,40012L,40013L,40014L,40015L,40016L,40017L,40018L,40019L,40020L, 40021L,40022L,40023L,40024L,40025L,40026L,40027L,40028L,40029L,40030L, 40031L,40032L,40033L,40034L,40035L,40036L,40037L,40038L,40039L,40040L, 40041L,40042L,40043L,40044L,40045L,40046L,40047L,40048L,40049L,40050L, 40051L,40052L,40053L,40054L,40055L,40056L,40057L,40058L,40059L,40060L, 40061L,40062L,40063L,40064L,40065L,40066L,40067L,40068L,40069L,40070L, 40071L,40072L,40073L,40074L,40075L,40076L,40077L,40078L,40079L,40080L, 40081L,40082L,40083L,40084L,40085L,40086L,40087L,40088L,40089L,40090L, 40091L,40092L,40093L,40094L,40095L,40096L,40097L,40098L,40099L,40100L, 40101L,40102L,40103L,40104L,40105L,40106L,40107L,40108L,40109L,40110L, 40111L,40112L,40113L,40114L,40115L,40116L,40117L,40118L,40119L,40120L, 40121L,40122L,40123L,40124L,40125L,40126L,40127L,40128L,40129L,40130L, 40131L,40132L,40133L,40134L,40135L,40136L,40137L,40138L,40139L,40140L, 40141L,40142L,40143L,40144L,40145L,40146L,40147L,40148L,40149L,40150L, 40151L,40152L,40153L,40154L,40155L,40156L,40157L,40158L,40159L,40160L, 40161L,40162L,40163L,40164L,40165L,40166L,40167L,40168L,40169L,40170L, 40171L,40172L,40173L,40174L,40175L,40176L,40177L,40178L,40179L,40180L, 40181L,40182L,40183L,40184L,40185L,40186L,40187L,40188L,40189L,40190L, 40191L,40192L,40193L,40194L,40195L,40196L,40197L,40198L,40199L,40200L, 40201L,40202L,40203L,40204L,40205L,40206L,40207L,40208L,40209L,40210L, 40211L,40212L,40213L,40214L,40215L,40216L,40217L,40218L,40219L,40220L, 40221L,40222L,40223L,40224L,40225L,40226L,40227L,40228L,40229L,40230L, 40231L,40232L,40233L,40234L,40235L,40236L,40237L,40238L,40239L,40240L, 40241L,40242L,40243L,40244L,40245L,40246L,40247L,40248L,40249L,40250L, 40251L,40252L,40253L,40254L,40255L,40256L,40257L,40258L,40259L,40260L, 40261L,40262L,40263L,40264L,40265L,40266L,40267L,40268L,40269L,40270L, 40271L,40272L,40273L,40274L,40275L,40276L,40277L,40278L,40279L,40280L, 40281L,40282L,40283L,40284L,40285L,40286L,40287L,40288L,40289L,40290L, 40291L,40292L,40293L,40294L,40295L,40296L,40297L,40298L,40299L,40300L, 40301L,40302L,40303L,40304L,40305L,40306L,40307L,40308L,40309L,40310L, 40311L,40312L,40313L,40314L,40315L,40316L,40317L,40318L,40319L,40320L, 40321L,40322L,40323L,40324L,40325L,40326L,40327L,40328L,40329L,40330L, 40331L,40332L,40333L,40334L,40335L,40336L,40337L,40338L,40339L,40340L, 40341L,40342L,40343L,40344L,40345L,40346L,40347L,40348L,40349L,40350L, 40351L,40352L,40353L,40354L,40355L,40356L,40357L,40358L,40359L,40360L, 40361L,40362L,40363L,40364L,40365L,40366L,40367L,40368L,40369L,40370L, 40371L,40372L,40373L,40374L,40375L,40376L,40377L,40378L,40379L,40380L, 40381L,40382L,40383L,40384L,40385L,40386L,40387L,40388L,40389L,40390L, 40391L,40392L,40393L,40394L,40395L,40396L,40397L,40398L,40399L,40400L, 40401L,40402L,40403L,40404L,40405L,40406L,40407L,40408L,40409L,40410L, 40411L,40412L,40413L,40414L,40415L,40416L,40417L,40418L,40419L,40420L, 40421L,40422L,40423L,40424L,40425L,40426L,40427L,40428L,40429L,40430L, 40431L,40432L,40433L,40434L,40435L,40436L,40437L,40438L,40439L,40440L, 40441L,40442L,40443L,40444L,40445L,40446L,40447L,40448L,40449L,40450L, 40451L,40452L,40453L,40454L,40455L,40456L,40457L,40458L,40459L,40460L, 40461L,40462L,40463L,40464L,40465L,40466L,40467L,40468L,40469L,40470L, 40471L,40472L,40473L,40474L,40475L,40476L,40477L,40478L,40479L,40480L, 40481L,40482L,40483L,40484L,40485L,40486L,40487L,40488L,40489L,40490L, 40491L,40492L,40493L,40494L,40495L,40496L,40497L,40498L,40499L,40500L, 40501L,40502L,40503L,40504L,40505L,40506L,40507L,40508L,40509L,40510L, 40511L,40512L,40513L,40514L,40515L,40516L,40517L,40518L,40519L,40520L, 40521L,40522L,40523L,40524L,40525L,40526L,40527L,40528L,40529L,40530L, 40531L,40532L,40533L,40534L,40535L,40536L,40537L,40538L,40539L,40540L, 40541L,40542L,40543L,40544L,40545L,40546L,40547L,40548L,40549L,40550L, 40551L,40552L,40553L,40554L,40555L,40556L,40557L,40558L,40559L,40560L, 40561L,40562L,40563L,40564L,40565L,40566L,40567L,40568L,40569L,40570L, 40571L,40572L,40573L,40574L,40575L,40576L,40577L,40578L,40579L,40580L, 40581L,40582L,40583L,40584L,40585L,40586L,40587L,40588L,40589L,40590L, 40591L,40592L,40593L,40594L,40595L,40596L,40597L,40598L,40599L,40600L, 40601L,40602L,40603L,40604L,40605L,40606L,40607L,40608L,40609L,40610L, 40611L,40612L,40613L,40614L,40615L,40616L,40617L,40618L,40619L,40620L, 40621L,40622L,40623L,40624L,40625L,40626L,40627L,40628L,40629L,40630L, 40631L,40632L,40633L,40634L,40635L,40636L,40637L,40638L,40639L,40640L, 40641L,40642L,40643L,40644L,40645L,40646L,40647L,40648L,40649L,40650L, 40651L,40652L,40653L,40654L,40655L,40656L,40657L,40658L,40659L,40660L, 40661L,40662L,40663L,40664L,40665L,40666L,40667L,40668L,40669L,40670L, 40671L,40672L,40673L,40674L,40675L,40676L,40677L,40678L,40679L,40680L, 40681L,40682L,40683L,40684L,40685L,40686L,40687L,40688L,40689L,40690L, 40691L,40692L,40693L,40694L,40695L,40696L,40697L,40698L,40699L,40700L, 40701L,40702L,40703L,40704L,40705L,40706L,40707L,40708L,40709L,40710L, 40711L,40712L,40713L,40714L,40715L,40716L,40717L,40718L,40719L,40720L, 40721L,40722L,40723L,40724L,40725L,40726L,40727L,40728L,40729L,40730L, 40731L,40732L,40733L,40734L,40735L,40736L,40737L,40738L,40739L,40740L, 40741L,40742L,40743L,40744L,40745L,40746L,40747L,40748L,40749L,40750L, 40751L,40752L,40753L,40754L,40755L,40756L,40757L,40758L,40759L,40760L, 40761L,40762L,40763L,40764L,40765L,40766L,40767L,40768L,40769L,40770L, 40771L,40772L,40773L,40774L,40775L,40776L,40777L,40778L,40779L,40780L, 40781L,40782L,40783L,40784L,40785L,40786L,40787L,40788L,40789L,40790L, 40791L,40792L,40793L,40794L,40795L,40796L,40797L,40798L,40799L,40800L, 40801L,40802L,40803L,40804L,40805L,40806L,40807L,40808L,40809L,40810L, 40811L,40812L,40813L,40814L,40815L,40816L,40817L,40818L,40819L,40820L, 40821L,40822L,40823L,40824L,40825L,40826L,40827L,40828L,40829L,40830L, 40831L,40832L,40833L,40834L,40835L,40836L,40837L,40838L,40839L,40840L, 40841L,40842L,40843L,40844L,40845L,40846L,40847L,40848L,40849L,40850L, 40851L,40852L,40853L,40854L,40855L,40856L,40857L,40858L,40859L,40860L, 40861L,40862L,40863L,40864L,40865L,40866L,40867L,40868L,40869L,40870L, 40871L,40872L,40873L,40874L,40875L,40876L,40877L,40878L,40879L,40880L, 40881L,40882L,40883L,40884L,40885L,40886L,40887L,40888L,40889L,40890L, 40891L,40892L,40893L,40894L,40895L,40896L,40897L,40898L,40899L,40900L, 40901L,40902L,40903L,40904L,40905L,40906L,40907L,40908L,40909L,40910L, 40911L,40912L,40913L,40914L,40915L,40916L,40917L,40918L,40919L,40920L, 40921L,40922L,40923L,40924L,40925L,40926L,40927L,40928L,40929L,40930L, 40931L,40932L,40933L,40934L,40935L,40936L,40937L,40938L,40939L,40940L, 40941L,40942L,40943L,40944L,40945L,40946L,40947L,40948L,40949L,40950L, 40951L,40952L,40953L,40954L,40955L,40956L,40957L,40958L,40959L,40960L, 40961L,40962L,40963L,40964L,40965L,40966L,40967L,40968L,40969L,40970L, 40971L,40972L,40973L,40974L,40975L,40976L,40977L,40978L,40979L,40980L, 40981L,40982L,40983L,40984L,40985L,40986L,40987L,40988L,40989L,40990L, 40991L,40992L,40993L,40994L,40995L,40996L,40997L,40998L,40999L,41000L, 41001L,41002L,41003L,41004L,41005L,41006L,41007L,41008L,41009L,41010L, 41011L,41012L,41013L,41014L,41015L,41016L,41017L,41018L,41019L,41020L, 41021L,41022L,41023L,41024L,41025L,41026L,41027L,41028L,41029L,41030L, 41031L,41032L,41033L,41034L,41035L,41036L,41037L,41038L,41039L,41040L, 41041L,41042L,41043L,41044L,41045L,41046L,41047L,41048L,41049L,41050L, 41051L,41052L,41053L,41054L,41055L,41056L,41057L,41058L,41059L,41060L, 41061L,41062L,41063L,41064L,41065L,41066L,41067L,41068L,41069L,41070L, 41071L,41072L,41073L,41074L,41075L,41076L,41077L,41078L,41079L,41080L, 41081L,41082L,41083L,41084L,41085L,41086L,41087L,41088L,41089L,41090L, 41091L,41092L,41093L,41094L,41095L,41096L,41097L,41098L,41099L,41100L, 41101L,41102L,41103L,41104L,41105L,41106L,41107L,41108L,41109L,41110L, 41111L,41112L,41113L,41114L,41115L,41116L,41117L,41118L,41119L,41120L, 41121L,41122L,41123L,41124L,41125L,41126L,41127L,41128L,41129L,41130L, 41131L,41132L,41133L,41134L,41135L,41136L,41137L,41138L,41139L,41140L, 41141L,41142L,41143L,41144L,41145L,41146L,41147L,41148L,41149L,41150L, 41151L,41152L,41153L,41154L,41155L,41156L,41157L,41158L,41159L,41160L, 41161L,41162L,41163L,41164L,41165L,41166L,41167L,41168L,41169L,41170L, 41171L,41172L,41173L,41174L,41175L,41176L,41177L,41178L,41179L,41180L, 41181L,41182L,41183L,41184L,41185L,41186L,41187L,41188L,41189L,41190L, 41191L,41192L,41193L,41194L,41195L,41196L,41197L,41198L,41199L,41200L, 41201L,41202L,41203L,41204L,41205L,41206L,41207L,41208L,41209L,41210L, 41211L,41212L,41213L,41214L,41215L,41216L,41217L,41218L,41219L,41220L, 41221L,41222L,41223L,41224L,41225L,41226L,41227L,41228L,41229L,41230L, 41231L,41232L,41233L,41234L,41235L,41236L,41237L,41238L,41239L,41240L, 41241L,41242L,41243L,41244L,41245L,41246L,41247L,41248L,41249L,41250L, 41251L,41252L,41253L,41254L,41255L,41256L,41257L,41258L,41259L,41260L, 41261L,41262L,41263L,41264L,41265L,41266L,41267L,41268L,41269L,41270L, 41271L,41272L,41273L,41274L,41275L,41276L,41277L,41278L,41279L,41280L, 41281L,41282L,41283L,41284L,41285L,41286L,41287L,41288L,41289L,41290L, 41291L,41292L,41293L,41294L,41295L,41296L,41297L,41298L,41299L,41300L, 41301L,41302L,41303L,41304L,41305L,41306L,41307L,41308L,41309L,41310L, 41311L,41312L,41313L,41314L,41315L,41316L,41317L,41318L,41319L,41320L, 41321L,41322L,41323L,41324L,41325L,41326L,41327L,41328L,41329L,41330L, 41331L,41332L,41333L,41334L,41335L,41336L,41337L,41338L,41339L,41340L, 41341L,41342L,41343L,41344L,41345L,41346L,41347L,41348L,41349L,41350L, 41351L,41352L,41353L,41354L,41355L,41356L,41357L,41358L,41359L,41360L, 41361L,41362L,41363L,41364L,41365L,41366L,41367L,41368L,41369L,41370L, 41371L,41372L,41373L,41374L,41375L,41376L,41377L,41378L,41379L,41380L, 41381L,41382L,41383L,41384L,41385L,41386L,41387L,41388L,41389L,41390L, 41391L,41392L,41393L,41394L,41395L,41396L,41397L,41398L,41399L,41400L, 41401L,41402L,41403L,41404L,41405L,41406L,41407L,41408L,41409L,41410L, 41411L,41412L,41413L,41414L,41415L,41416L,41417L,41418L,41419L,41420L, 41421L,41422L,41423L,41424L,41425L,41426L,41427L,41428L,41429L,41430L, 41431L,41432L,41433L,41434L,41435L,41436L,41437L,41438L,41439L,41440L, 41441L,41442L,41443L,41444L,41445L,41446L,41447L,41448L,41449L,41450L, 41451L,41452L,41453L,41454L,41455L,41456L,41457L,41458L,41459L,41460L, 41461L,41462L,41463L,41464L,41465L,41466L,41467L,41468L,41469L,41470L, 41471L,41472L,41473L,41474L,41475L,41476L,41477L,41478L,41479L,41480L, 41481L,41482L,41483L,41484L,41485L,41486L,41487L,41488L,41489L,41490L, 41491L,41492L,41493L,41494L,41495L,41496L,41497L,41498L,41499L,41500L, 41501L,41502L,41503L,41504L,41505L,41506L,41507L,41508L,41509L,41510L, 41511L,41512L,41513L,41514L,41515L,41516L,41517L,41518L,41519L,41520L, 41521L,41522L,41523L,41524L,41525L,41526L,41527L,41528L,41529L,41530L, 41531L,41532L,41533L,41534L,41535L,41536L,41537L,41538L,41539L,41540L, 41541L,41542L,41543L,41544L,41545L,41546L,41547L,41548L,41549L,41550L, 41551L,41552L,41553L,41554L,41555L,41556L,41557L,41558L,41559L,41560L, 41561L,41562L,41563L,41564L,41565L,41566L,41567L,41568L,41569L,41570L, 41571L,41572L,41573L,41574L,41575L,41576L,41577L,41578L,41579L,41580L, 41581L,41582L,41583L,41584L,41585L,41586L,41587L,41588L,41589L,41590L, 41591L,41592L,41593L,41594L,41595L,41596L,41597L,41598L,41599L,41600L, 41601L,41602L,41603L,41604L,41605L,41606L,41607L,41608L,41609L,41610L, 41611L,41612L,41613L,41614L,41615L,41616L,41617L,41618L,41619L,41620L, 41621L,41622L,41623L,41624L,41625L,41626L,41627L,41628L,41629L,41630L, 41631L,41632L,41633L,41634L,41635L,41636L,41637L,41638L,41639L,41640L, 41641L,41642L,41643L,41644L,41645L,41646L,41647L,41648L,41649L,41650L, 41651L,41652L,41653L,41654L,41655L,41656L,41657L,41658L,41659L,41660L, 41661L,41662L,41663L,41664L,41665L,41666L,41667L,41668L,41669L,41670L, 41671L,41672L,41673L,41674L,41675L,41676L,41677L,41678L,41679L,41680L, 41681L,41682L,41683L,41684L,41685L,41686L,41687L,41688L,41689L,41690L, 41691L,41692L,41693L,41694L,41695L,41696L,41697L,41698L,41699L,41700L, 41701L,41702L,41703L,41704L,41705L,41706L,41707L,41708L,41709L,41710L, 41711L,41712L,41713L,41714L,41715L,41716L,41717L,41718L,41719L,41720L, 41721L,41722L,41723L,41724L,41725L,41726L,41727L,41728L,41729L,41730L, 41731L,41732L,41733L,41734L,41735L,41736L,41737L,41738L,41739L,41740L, 41741L,41742L,41743L,41744L,41745L,41746L,41747L,41748L,41749L,41750L, 41751L,41752L,41753L,41754L,41755L,41756L,41757L,41758L,41759L,41760L, 41761L,41762L,41763L,41764L,41765L,41766L,41767L,41768L,41769L,41770L, 41771L,41772L,41773L,41774L,41775L,41776L,41777L,41778L,41779L,41780L, 41781L,41782L,41783L,41784L,41785L,41786L,41787L,41788L,41789L,41790L, 41791L,41792L,41793L,41794L,41795L,41796L,41797L,41798L,41799L,41800L, 41801L,41802L,41803L,41804L,41805L,41806L,41807L,41808L,41809L,41810L, 41811L,41812L,41813L,41814L,41815L,41816L,41817L,41818L,41819L,41820L, 41821L,41822L,41823L,41824L,41825L,41826L,41827L,41828L,41829L,41830L, 41831L,41832L,41833L,41834L,41835L,41836L,41837L,41838L,41839L,41840L, 41841L,41842L,41843L,41844L,41845L,41846L,41847L,41848L,41849L,41850L, 41851L,41852L,41853L,41854L,41855L,41856L,41857L,41858L,41859L,41860L, 41861L,41862L,41863L,41864L,41865L,41866L,41867L,41868L,41869L,41870L, 41871L,41872L,41873L,41874L,41875L,41876L,41877L,41878L,41879L,41880L, 41881L,41882L,41883L,41884L,41885L,41886L,41887L,41888L,41889L,41890L, 41891L,41892L,41893L,41894L,41895L,41896L,41897L,41898L,41899L,41900L, 41901L,41902L,41903L,41904L,41905L,41906L,41907L,41908L,41909L,41910L, 41911L,41912L,41913L,41914L,41915L,41916L,41917L,41918L,41919L,41920L, 41921L,41922L,41923L,41924L,41925L,41926L,41927L,41928L,41929L,41930L, 41931L,41932L,41933L,41934L,41935L,41936L,41937L,41938L,41939L,41940L, 41941L,41942L,41943L,41944L,41945L,41946L,41947L,41948L,41949L,41950L, 41951L,41952L,41953L,41954L,41955L,41956L,41957L,41958L,41959L,41960L, 41961L,41962L,41963L,41964L,41965L,41966L,41967L,41968L,41969L,41970L, 41971L,41972L,41973L,41974L,41975L,41976L,41977L,41978L,41979L,41980L, 41981L,41982L,41983L,41984L,41985L,41986L,41987L,41988L,41989L,41990L, 41991L,41992L,41993L,41994L,41995L,41996L,41997L,41998L,41999L,42000L, 42001L,42002L,42003L,42004L,42005L,42006L,42007L,42008L,42009L,42010L, 42011L,42012L,42013L,42014L,42015L,42016L,42017L,42018L,42019L,42020L, 42021L,42022L,42023L,42024L,42025L,42026L,42027L,42028L,42029L,42030L, 42031L,42032L,42033L,42034L,42035L,42036L,42037L,42038L,42039L,42040L, 42041L,42042L,42043L,42044L,42045L,42046L,42047L,42048L,42049L,42050L, 42051L,42052L,42053L,42054L,42055L,42056L,42057L,42058L,42059L,42060L, 42061L,42062L,42063L,42064L,42065L,42066L,42067L,42068L,42069L,42070L, 42071L,42072L,42073L,42074L,42075L,42076L,42077L,42078L,42079L,42080L, 42081L,42082L,42083L,42084L,42085L,42086L,42087L,42088L,42089L,42090L, 42091L,42092L,42093L,42094L,42095L,42096L,42097L,42098L,42099L,42100L, 42101L,42102L,42103L,42104L,42105L,42106L,42107L,42108L,42109L,42110L, 42111L,42112L,42113L,42114L,42115L,42116L,42117L,42118L,42119L,42120L, 42121L,42122L,42123L,42124L,42125L,42126L,42127L,42128L,42129L,42130L, 42131L,42132L,42133L,42134L,42135L,42136L,42137L,42138L,42139L,42140L, 42141L,42142L,42143L,42144L,42145L,42146L,42147L,42148L,42149L,42150L, 42151L,42152L,42153L,42154L,42155L,42156L,42157L,42158L,42159L,42160L, 42161L,42162L,42163L,42164L,42165L,42166L,42167L,42168L,42169L,42170L, 42171L,42172L,42173L,42174L,42175L,42176L,42177L,42178L,42179L,42180L, 42181L,42182L,42183L,42184L,42185L,42186L,42187L,42188L,42189L,42190L, 42191L,42192L,42193L,42194L,42195L,42196L,42197L,42198L,42199L,42200L, 42201L,42202L,42203L,42204L,42205L,42206L,42207L,42208L,42209L,42210L, 42211L,42212L,42213L,42214L,42215L,42216L,42217L,42218L,42219L,42220L, 42221L,42222L,42223L,42224L,42225L,42226L,42227L,42228L,42229L,42230L, 42231L,42232L,42233L,42234L,42235L,42236L,42237L,42238L,42239L,42240L, 42241L,42242L,42243L,42244L,42245L,42246L,42247L,42248L,42249L,42250L, 42251L,42252L,42253L,42254L,42255L,42256L,42257L,42258L,42259L,42260L, 42261L,42262L,42263L,42264L,42265L,42266L,42267L,42268L,42269L,42270L, 42271L,42272L,42273L,42274L,42275L,42276L,42277L,42278L,42279L,42280L, 42281L,42282L,42283L,42284L,42285L,42286L,42287L,42288L,42289L,42290L, 42291L,42292L,42293L,42294L,42295L,42296L,42297L,42298L,42299L,42300L, 42301L,42302L,42303L,42304L,42305L,42306L,42307L,42308L,42309L,42310L, 42311L,42312L,42313L,42314L,42315L,42316L,42317L,42318L,42319L,42320L, 42321L,42322L,42323L,42324L,42325L,42326L,42327L,42328L,42329L,42330L, 42331L,42332L,42333L,42334L,42335L,42336L,42337L,42338L,42339L,42340L, 42341L,42342L,42343L,42344L,42345L,42346L,42347L,42348L,42349L,42350L, 42351L,42352L,42353L,42354L,42355L,42356L,42357L,42358L,42359L,42360L, 42361L,42362L,42363L,42364L,42365L,42366L,42367L,42368L,42369L,42370L, 42371L,42372L,42373L,42374L,42375L,42376L,42377L,42378L,42379L,42380L, 42381L,42382L,42383L,42384L,42385L,42386L,42387L,42388L,42389L,42390L, 42391L,42392L,42393L,42394L,42395L,42396L,42397L,42398L,42399L,42400L, 42401L,42402L,42403L,42404L,42405L,42406L,42407L,42408L,42409L,42410L, 42411L,42412L,42413L,42414L,42415L,42416L,42417L,42418L,42419L,42420L, 42421L,42422L,42423L,42424L,42425L,42426L,42427L,42428L,42429L,42430L, 42431L,42432L,42433L,42434L,42435L,42436L,42437L,42438L,42439L,42440L, 42441L,42442L,42443L,42444L,42445L,42446L,42447L,42448L,42449L,42450L, 42451L,42452L,42453L,42454L,42455L,42456L,42457L,42458L,42459L,42460L, 42461L,42462L,42463L,42464L,42465L,42466L,42467L,42468L,42469L,42470L, 42471L,42472L,42473L,42474L,42475L,42476L,42477L,42478L,42479L,42480L, 42481L,42482L,42483L,42484L,42485L,42486L,42487L,42488L,42489L,42490L, 42491L,42492L,42493L,42494L,42495L,42496L,42497L,42498L,42499L,42500L, 42501L,42502L,42503L,42504L,42505L,42506L,42507L,42508L,42509L,42510L, 42511L,42512L,42513L,42514L,42515L,42516L,42517L,42518L,42519L,42520L, 42521L,42522L,42523L,42524L,42525L,42526L,42527L,42528L,42529L,42530L, 42531L,42532L,42533L,42534L,42535L,42536L,42537L,42538L,42539L,42540L, 42541L,42542L,42543L,42544L,42545L,42546L,42547L,42548L,42549L,42550L, 42551L,42552L,42553L,42554L,42555L,42556L,42557L,42558L,42559L,42560L, 42560L,42562L,42562L,42564L,42564L,42566L,42566L,42568L,42568L,42570L, 42570L,42572L,42572L,42574L,42574L,42576L,42576L,42578L,42578L,42580L, 42580L,42582L,42582L,42584L,42584L,42586L,42586L,42588L,42588L,42590L, 42590L,42592L,42592L,42594L,42594L,42596L,42596L,42598L,42598L,42600L, 42600L,42602L,42602L,42604L,42604L,42606L,42607L,42608L,42609L,42610L, 42611L,42612L,42613L,42614L,42615L,42616L,42617L,42618L,42619L,42620L, 42621L,42622L,42623L,42624L,42624L,42626L,42626L,42628L,42628L,42630L, 42630L,42632L,42632L,42634L,42634L,42636L,42636L,42638L,42638L,42640L, 42640L,42642L,42642L,42644L,42644L,42646L,42646L,42648L,42648L,42650L, 42650L,42652L,42653L,42654L,42655L,42656L,42657L,42658L,42659L,42660L, 42661L,42662L,42663L,42664L,42665L,42666L,42667L,42668L,42669L,42670L, 42671L,42672L,42673L,42674L,42675L,42676L,42677L,42678L,42679L,42680L, 42681L,42682L,42683L,42684L,42685L,42686L,42687L,42688L,42689L,42690L, 42691L,42692L,42693L,42694L,42695L,42696L,42697L,42698L,42699L,42700L, 42701L,42702L,42703L,42704L,42705L,42706L,42707L,42708L,42709L,42710L, 42711L,42712L,42713L,42714L,42715L,42716L,42717L,42718L,42719L,42720L, 42721L,42722L,42723L,42724L,42725L,42726L,42727L,42728L,42729L,42730L, 42731L,42732L,42733L,42734L,42735L,42736L,42737L,42738L,42739L,42740L, 42741L,42742L,42743L,42744L,42745L,42746L,42747L,42748L,42749L,42750L, 42751L,42752L,42753L,42754L,42755L,42756L,42757L,42758L,42759L,42760L, 42761L,42762L,42763L,42764L,42765L,42766L,42767L,42768L,42769L,42770L, 42771L,42772L,42773L,42774L,42775L,42776L,42777L,42778L,42779L,42780L, 42781L,42782L,42783L,42784L,42785L,42786L,42786L,42788L,42788L,42790L, 42790L,42792L,42792L,42794L,42794L,42796L,42796L,42798L,42798L,42800L, 42801L,42802L,42802L,42804L,42804L,42806L,42806L,42808L,42808L,42810L, 42810L,42812L,42812L,42814L,42814L,42816L,42816L,42818L,42818L,42820L, 42820L,42822L,42822L,42824L,42824L,42826L,42826L,42828L,42828L,42830L, 42830L,42832L,42832L,42834L,42834L,42836L,42836L,42838L,42838L,42840L, 42840L,42842L,42842L,42844L,42844L,42846L,42846L,42848L,42848L,42850L, 42850L,42852L,42852L,42854L,42854L,42856L,42856L,42858L,42858L,42860L, 42860L,42862L,42862L,42864L,42865L,42866L,42867L,42868L,42869L,42870L, 42871L,42872L,42873L,42873L,42875L,42875L,42877L,42878L,42878L,42880L, 42880L,42882L,42882L,42884L,42884L,42886L,42886L,42888L,42889L,42890L, 42891L,42891L,42893L,42894L,42895L,42896L,42896L,42898L,42898L,42900L, 42901L,42902L,42902L,42904L,42904L,42906L,42906L,42908L,42908L,42910L, 42910L,42912L,42912L,42914L,42914L,42916L,42916L,42918L,42918L,42920L, 42920L,42922L,42923L,42924L,42925L,42926L,42927L,42928L,42929L,42930L, 42931L,42932L,42932L,42934L,42934L,42936L,42937L,42938L,42939L,42940L, 42941L,42942L,42943L,42944L,42945L,42946L,42947L,42948L,42949L,42950L, 42951L,42952L,42953L,42954L,42955L,42956L,42957L,42958L,42959L,42960L, 42961L,42962L,42963L,42964L,42965L,42966L,42967L,42968L,42969L,42970L, 42971L,42972L,42973L,42974L,42975L,42976L,42977L,42978L,42979L,42980L, 42981L,42982L,42983L,42984L,42985L,42986L,42987L,42988L,42989L,42990L, 42991L,42992L,42993L,42994L,42995L,42996L,42997L,42998L,42999L,43000L, 43001L,43002L,43003L,43004L,43005L,43006L,43007L,43008L,43009L,43010L, 43011L,43012L,43013L,43014L,43015L,43016L,43017L,43018L,43019L,43020L, 43021L,43022L,43023L,43024L,43025L,43026L,43027L,43028L,43029L,43030L, 43031L,43032L,43033L,43034L,43035L,43036L,43037L,43038L,43039L,43040L, 43041L,43042L,43043L,43044L,43045L,43046L,43047L,43048L,43049L,43050L, 43051L,43052L,43053L,43054L,43055L,43056L,43057L,43058L,43059L,43060L, 43061L,43062L,43063L,43064L,43065L,43066L,43067L,43068L,43069L,43070L, 43071L,43072L,43073L,43074L,43075L,43076L,43077L,43078L,43079L,43080L, 43081L,43082L,43083L,43084L,43085L,43086L,43087L,43088L,43089L,43090L, 43091L,43092L,43093L,43094L,43095L,43096L,43097L,43098L,43099L,43100L, 43101L,43102L,43103L,43104L,43105L,43106L,43107L,43108L,43109L,43110L, 43111L,43112L,43113L,43114L,43115L,43116L,43117L,43118L,43119L,43120L, 43121L,43122L,43123L,43124L,43125L,43126L,43127L,43128L,43129L,43130L, 43131L,43132L,43133L,43134L,43135L,43136L,43137L,43138L,43139L,43140L, 43141L,43142L,43143L,43144L,43145L,43146L,43147L,43148L,43149L,43150L, 43151L,43152L,43153L,43154L,43155L,43156L,43157L,43158L,43159L,43160L, 43161L,43162L,43163L,43164L,43165L,43166L,43167L,43168L,43169L,43170L, 43171L,43172L,43173L,43174L,43175L,43176L,43177L,43178L,43179L,43180L, 43181L,43182L,43183L,43184L,43185L,43186L,43187L,43188L,43189L,43190L, 43191L,43192L,43193L,43194L,43195L,43196L,43197L,43198L,43199L,43200L, 43201L,43202L,43203L,43204L,43205L,43206L,43207L,43208L,43209L,43210L, 43211L,43212L,43213L,43214L,43215L,43216L,43217L,43218L,43219L,43220L, 43221L,43222L,43223L,43224L,43225L,43226L,43227L,43228L,43229L,43230L, 43231L,43232L,43233L,43234L,43235L,43236L,43237L,43238L,43239L,43240L, 43241L,43242L,43243L,43244L,43245L,43246L,43247L,43248L,43249L,43250L, 43251L,43252L,43253L,43254L,43255L,43256L,43257L,43258L,43259L,43260L, 43261L,43262L,43263L,43264L,43265L,43266L,43267L,43268L,43269L,43270L, 43271L,43272L,43273L,43274L,43275L,43276L,43277L,43278L,43279L,43280L, 43281L,43282L,43283L,43284L,43285L,43286L,43287L,43288L,43289L,43290L, 43291L,43292L,43293L,43294L,43295L,43296L,43297L,43298L,43299L,43300L, 43301L,43302L,43303L,43304L,43305L,43306L,43307L,43308L,43309L,43310L, 43311L,43312L,43313L,43314L,43315L,43316L,43317L,43318L,43319L,43320L, 43321L,43322L,43323L,43324L,43325L,43326L,43327L,43328L,43329L,43330L, 43331L,43332L,43333L,43334L,43335L,43336L,43337L,43338L,43339L,43340L, 43341L,43342L,43343L,43344L,43345L,43346L,43347L,43348L,43349L,43350L, 43351L,43352L,43353L,43354L,43355L,43356L,43357L,43358L,43359L,43360L, 43361L,43362L,43363L,43364L,43365L,43366L,43367L,43368L,43369L,43370L, 43371L,43372L,43373L,43374L,43375L,43376L,43377L,43378L,43379L,43380L, 43381L,43382L,43383L,43384L,43385L,43386L,43387L,43388L,43389L,43390L, 43391L,43392L,43393L,43394L,43395L,43396L,43397L,43398L,43399L,43400L, 43401L,43402L,43403L,43404L,43405L,43406L,43407L,43408L,43409L,43410L, 43411L,43412L,43413L,43414L,43415L,43416L,43417L,43418L,43419L,43420L, 43421L,43422L,43423L,43424L,43425L,43426L,43427L,43428L,43429L,43430L, 43431L,43432L,43433L,43434L,43435L,43436L,43437L,43438L,43439L,43440L, 43441L,43442L,43443L,43444L,43445L,43446L,43447L,43448L,43449L,43450L, 43451L,43452L,43453L,43454L,43455L,43456L,43457L,43458L,43459L,43460L, 43461L,43462L,43463L,43464L,43465L,43466L,43467L,43468L,43469L,43470L, 43471L,43472L,43473L,43474L,43475L,43476L,43477L,43478L,43479L,43480L, 43481L,43482L,43483L,43484L,43485L,43486L,43487L,43488L,43489L,43490L, 43491L,43492L,43493L,43494L,43495L,43496L,43497L,43498L,43499L,43500L, 43501L,43502L,43503L,43504L,43505L,43506L,43507L,43508L,43509L,43510L, 43511L,43512L,43513L,43514L,43515L,43516L,43517L,43518L,43519L,43520L, 43521L,43522L,43523L,43524L,43525L,43526L,43527L,43528L,43529L,43530L, 43531L,43532L,43533L,43534L,43535L,43536L,43537L,43538L,43539L,43540L, 43541L,43542L,43543L,43544L,43545L,43546L,43547L,43548L,43549L,43550L, 43551L,43552L,43553L,43554L,43555L,43556L,43557L,43558L,43559L,43560L, 43561L,43562L,43563L,43564L,43565L,43566L,43567L,43568L,43569L,43570L, 43571L,43572L,43573L,43574L,43575L,43576L,43577L,43578L,43579L,43580L, 43581L,43582L,43583L,43584L,43585L,43586L,43587L,43588L,43589L,43590L, 43591L,43592L,43593L,43594L,43595L,43596L,43597L,43598L,43599L,43600L, 43601L,43602L,43603L,43604L,43605L,43606L,43607L,43608L,43609L,43610L, 43611L,43612L,43613L,43614L,43615L,43616L,43617L,43618L,43619L,43620L, 43621L,43622L,43623L,43624L,43625L,43626L,43627L,43628L,43629L,43630L, 43631L,43632L,43633L,43634L,43635L,43636L,43637L,43638L,43639L,43640L, 43641L,43642L,43643L,43644L,43645L,43646L,43647L,43648L,43649L,43650L, 43651L,43652L,43653L,43654L,43655L,43656L,43657L,43658L,43659L,43660L, 43661L,43662L,43663L,43664L,43665L,43666L,43667L,43668L,43669L,43670L, 43671L,43672L,43673L,43674L,43675L,43676L,43677L,43678L,43679L,43680L, 43681L,43682L,43683L,43684L,43685L,43686L,43687L,43688L,43689L,43690L, 43691L,43692L,43693L,43694L,43695L,43696L,43697L,43698L,43699L,43700L, 43701L,43702L,43703L,43704L,43705L,43706L,43707L,43708L,43709L,43710L, 43711L,43712L,43713L,43714L,43715L,43716L,43717L,43718L,43719L,43720L, 43721L,43722L,43723L,43724L,43725L,43726L,43727L,43728L,43729L,43730L, 43731L,43732L,43733L,43734L,43735L,43736L,43737L,43738L,43739L,43740L, 43741L,43742L,43743L,43744L,43745L,43746L,43747L,43748L,43749L,43750L, 43751L,43752L,43753L,43754L,43755L,43756L,43757L,43758L,43759L,43760L, 43761L,43762L,43763L,43764L,43765L,43766L,43767L,43768L,43769L,43770L, 43771L,43772L,43773L,43774L,43775L,43776L,43777L,43778L,43779L,43780L, 43781L,43782L,43783L,43784L,43785L,43786L,43787L,43788L,43789L,43790L, 43791L,43792L,43793L,43794L,43795L,43796L,43797L,43798L,43799L,43800L, 43801L,43802L,43803L,43804L,43805L,43806L,43807L,43808L,43809L,43810L, 43811L,43812L,43813L,43814L,43815L,43816L,43817L,43818L,43819L,43820L, 43821L,43822L,43823L,43824L,43825L,43826L,43827L,43828L,43829L,43830L, 43831L,43832L,43833L,43834L,43835L,43836L,43837L,43838L,43839L,43840L, 43841L,43842L,43843L,43844L,43845L,43846L,43847L,43848L,43849L,43850L, 43851L,43852L,43853L,43854L,43855L,43856L,43857L,43858L,42931L,43860L, 43861L,43862L,43863L,43864L,43865L,43866L,43867L,43868L,43869L,43870L, 43871L,43872L,43873L,43874L,43875L,43876L,43877L,43878L,43879L,43880L, 43881L,43882L,43883L,43884L,43885L,43886L,43887L,5024,5025,5026,5027,5028, 5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,5040,5041,5042,5043, 5044,5045,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,5056,5057,5058, 5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072,5073, 5074,5075,5076,5077,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,5088, 5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103, 43968L,43969L,43970L,43971L,43972L,43973L,43974L,43975L,43976L,43977L, 43978L,43979L,43980L,43981L,43982L,43983L,43984L,43985L,43986L,43987L, 43988L,43989L,43990L,43991L,43992L,43993L,43994L,43995L,43996L,43997L, 43998L,43999L,44000L,44001L,44002L,44003L,44004L,44005L,44006L,44007L, 44008L,44009L,44010L,44011L,44012L,44013L,44014L,44015L,44016L,44017L, 44018L,44019L,44020L,44021L,44022L,44023L,44024L,44025L,44026L,44027L, 44028L,44029L,44030L,44031L,44032L,44033L,44034L,44035L,44036L,44037L, 44038L,44039L,44040L,44041L,44042L,44043L,44044L,44045L,44046L,44047L, 44048L,44049L,44050L,44051L,44052L,44053L,44054L,44055L,44056L,44057L, 44058L,44059L,44060L,44061L,44062L,44063L,44064L,44065L,44066L,44067L, 44068L,44069L,44070L,44071L,44072L,44073L,44074L,44075L,44076L,44077L, 44078L,44079L,44080L,44081L,44082L,44083L,44084L,44085L,44086L,44087L, 44088L,44089L,44090L,44091L,44092L,44093L,44094L,44095L,44096L,44097L, 44098L,44099L,44100L,44101L,44102L,44103L,44104L,44105L,44106L,44107L, 44108L,44109L,44110L,44111L,44112L,44113L,44114L,44115L,44116L,44117L, 44118L,44119L,44120L,44121L,44122L,44123L,44124L,44125L,44126L,44127L, 44128L,44129L,44130L,44131L,44132L,44133L,44134L,44135L,44136L,44137L, 44138L,44139L,44140L,44141L,44142L,44143L,44144L,44145L,44146L,44147L, 44148L,44149L,44150L,44151L,44152L,44153L,44154L,44155L,44156L,44157L, 44158L,44159L,44160L,44161L,44162L,44163L,44164L,44165L,44166L,44167L, 44168L,44169L,44170L,44171L,44172L,44173L,44174L,44175L,44176L,44177L, 44178L,44179L,44180L,44181L,44182L,44183L,44184L,44185L,44186L,44187L, 44188L,44189L,44190L,44191L,44192L,44193L,44194L,44195L,44196L,44197L, 44198L,44199L,44200L,44201L,44202L,44203L,44204L,44205L,44206L,44207L, 44208L,44209L,44210L,44211L,44212L,44213L,44214L,44215L,44216L,44217L, 44218L,44219L,44220L,44221L,44222L,44223L,44224L,44225L,44226L,44227L, 44228L,44229L,44230L,44231L,44232L,44233L,44234L,44235L,44236L,44237L, 44238L,44239L,44240L,44241L,44242L,44243L,44244L,44245L,44246L,44247L, 44248L,44249L,44250L,44251L,44252L,44253L,44254L,44255L,44256L,44257L, 44258L,44259L,44260L,44261L,44262L,44263L,44264L,44265L,44266L,44267L, 44268L,44269L,44270L,44271L,44272L,44273L,44274L,44275L,44276L,44277L, 44278L,44279L,44280L,44281L,44282L,44283L,44284L,44285L,44286L,44287L, 44288L,44289L,44290L,44291L,44292L,44293L,44294L,44295L,44296L,44297L, 44298L,44299L,44300L,44301L,44302L,44303L,44304L,44305L,44306L,44307L, 44308L,44309L,44310L,44311L,44312L,44313L,44314L,44315L,44316L,44317L, 44318L,44319L,44320L,44321L,44322L,44323L,44324L,44325L,44326L,44327L, 44328L,44329L,44330L,44331L,44332L,44333L,44334L,44335L,44336L,44337L, 44338L,44339L,44340L,44341L,44342L,44343L,44344L,44345L,44346L,44347L, 44348L,44349L,44350L,44351L,44352L,44353L,44354L,44355L,44356L,44357L, 44358L,44359L,44360L,44361L,44362L,44363L,44364L,44365L,44366L,44367L, 44368L,44369L,44370L,44371L,44372L,44373L,44374L,44375L,44376L,44377L, 44378L,44379L,44380L,44381L,44382L,44383L,44384L,44385L,44386L,44387L, 44388L,44389L,44390L,44391L,44392L,44393L,44394L,44395L,44396L,44397L, 44398L,44399L,44400L,44401L,44402L,44403L,44404L,44405L,44406L,44407L, 44408L,44409L,44410L,44411L,44412L,44413L,44414L,44415L,44416L,44417L, 44418L,44419L,44420L,44421L,44422L,44423L,44424L,44425L,44426L,44427L, 44428L,44429L,44430L,44431L,44432L,44433L,44434L,44435L,44436L,44437L, 44438L,44439L,44440L,44441L,44442L,44443L,44444L,44445L,44446L,44447L, 44448L,44449L,44450L,44451L,44452L,44453L,44454L,44455L,44456L,44457L, 44458L,44459L,44460L,44461L,44462L,44463L,44464L,44465L,44466L,44467L, 44468L,44469L,44470L,44471L,44472L,44473L,44474L,44475L,44476L,44477L, 44478L,44479L,44480L,44481L,44482L,44483L,44484L,44485L,44486L,44487L, 44488L,44489L,44490L,44491L,44492L,44493L,44494L,44495L,44496L,44497L, 44498L,44499L,44500L,44501L,44502L,44503L,44504L,44505L,44506L,44507L, 44508L,44509L,44510L,44511L,44512L,44513L,44514L,44515L,44516L,44517L, 44518L,44519L,44520L,44521L,44522L,44523L,44524L,44525L,44526L,44527L, 44528L,44529L,44530L,44531L,44532L,44533L,44534L,44535L,44536L,44537L, 44538L,44539L,44540L,44541L,44542L,44543L,44544L,44545L,44546L,44547L, 44548L,44549L,44550L,44551L,44552L,44553L,44554L,44555L,44556L,44557L, 44558L,44559L,44560L,44561L,44562L,44563L,44564L,44565L,44566L,44567L, 44568L,44569L,44570L,44571L,44572L,44573L,44574L,44575L,44576L,44577L, 44578L,44579L,44580L,44581L,44582L,44583L,44584L,44585L,44586L,44587L, 44588L,44589L,44590L,44591L,44592L,44593L,44594L,44595L,44596L,44597L, 44598L,44599L,44600L,44601L,44602L,44603L,44604L,44605L,44606L,44607L, 44608L,44609L,44610L,44611L,44612L,44613L,44614L,44615L,44616L,44617L, 44618L,44619L,44620L,44621L,44622L,44623L,44624L,44625L,44626L,44627L, 44628L,44629L,44630L,44631L,44632L,44633L,44634L,44635L,44636L,44637L, 44638L,44639L,44640L,44641L,44642L,44643L,44644L,44645L,44646L,44647L, 44648L,44649L,44650L,44651L,44652L,44653L,44654L,44655L,44656L,44657L, 44658L,44659L,44660L,44661L,44662L,44663L,44664L,44665L,44666L,44667L, 44668L,44669L,44670L,44671L,44672L,44673L,44674L,44675L,44676L,44677L, 44678L,44679L,44680L,44681L,44682L,44683L,44684L,44685L,44686L,44687L, 44688L,44689L,44690L,44691L,44692L,44693L,44694L,44695L,44696L,44697L, 44698L,44699L,44700L,44701L,44702L,44703L,44704L,44705L,44706L,44707L, 44708L,44709L,44710L,44711L,44712L,44713L,44714L,44715L,44716L,44717L, 44718L,44719L,44720L,44721L,44722L,44723L,44724L,44725L,44726L,44727L, 44728L,44729L,44730L,44731L,44732L,44733L,44734L,44735L,44736L,44737L, 44738L,44739L,44740L,44741L,44742L,44743L,44744L,44745L,44746L,44747L, 44748L,44749L,44750L,44751L,44752L,44753L,44754L,44755L,44756L,44757L, 44758L,44759L,44760L,44761L,44762L,44763L,44764L,44765L,44766L,44767L, 44768L,44769L,44770L,44771L,44772L,44773L,44774L,44775L,44776L,44777L, 44778L,44779L,44780L,44781L,44782L,44783L,44784L,44785L,44786L,44787L, 44788L,44789L,44790L,44791L,44792L,44793L,44794L,44795L,44796L,44797L, 44798L,44799L,44800L,44801L,44802L,44803L,44804L,44805L,44806L,44807L, 44808L,44809L,44810L,44811L,44812L,44813L,44814L,44815L,44816L,44817L, 44818L,44819L,44820L,44821L,44822L,44823L,44824L,44825L,44826L,44827L, 44828L,44829L,44830L,44831L,44832L,44833L,44834L,44835L,44836L,44837L, 44838L,44839L,44840L,44841L,44842L,44843L,44844L,44845L,44846L,44847L, 44848L,44849L,44850L,44851L,44852L,44853L,44854L,44855L,44856L,44857L, 44858L,44859L,44860L,44861L,44862L,44863L,44864L,44865L,44866L,44867L, 44868L,44869L,44870L,44871L,44872L,44873L,44874L,44875L,44876L,44877L, 44878L,44879L,44880L,44881L,44882L,44883L,44884L,44885L,44886L,44887L, 44888L,44889L,44890L,44891L,44892L,44893L,44894L,44895L,44896L,44897L, 44898L,44899L,44900L,44901L,44902L,44903L,44904L,44905L,44906L,44907L, 44908L,44909L,44910L,44911L,44912L,44913L,44914L,44915L,44916L,44917L, 44918L,44919L,44920L,44921L,44922L,44923L,44924L,44925L,44926L,44927L, 44928L,44929L,44930L,44931L,44932L,44933L,44934L,44935L,44936L,44937L, 44938L,44939L,44940L,44941L,44942L,44943L,44944L,44945L,44946L,44947L, 44948L,44949L,44950L,44951L,44952L,44953L,44954L,44955L,44956L,44957L, 44958L,44959L,44960L,44961L,44962L,44963L,44964L,44965L,44966L,44967L, 44968L,44969L,44970L,44971L,44972L,44973L,44974L,44975L,44976L,44977L, 44978L,44979L,44980L,44981L,44982L,44983L,44984L,44985L,44986L,44987L, 44988L,44989L,44990L,44991L,44992L,44993L,44994L,44995L,44996L,44997L, 44998L,44999L,45000L,45001L,45002L,45003L,45004L,45005L,45006L,45007L, 45008L,45009L,45010L,45011L,45012L,45013L,45014L,45015L,45016L,45017L, 45018L,45019L,45020L,45021L,45022L,45023L,45024L,45025L,45026L,45027L, 45028L,45029L,45030L,45031L,45032L,45033L,45034L,45035L,45036L,45037L, 45038L,45039L,45040L,45041L,45042L,45043L,45044L,45045L,45046L,45047L, 45048L,45049L,45050L,45051L,45052L,45053L,45054L,45055L,45056L,45057L, 45058L,45059L,45060L,45061L,45062L,45063L,45064L,45065L,45066L,45067L, 45068L,45069L,45070L,45071L,45072L,45073L,45074L,45075L,45076L,45077L, 45078L,45079L,45080L,45081L,45082L,45083L,45084L,45085L,45086L,45087L, 45088L,45089L,45090L,45091L,45092L,45093L,45094L,45095L,45096L,45097L, 45098L,45099L,45100L,45101L,45102L,45103L,45104L,45105L,45106L,45107L, 45108L,45109L,45110L,45111L,45112L,45113L,45114L,45115L,45116L,45117L, 45118L,45119L,45120L,45121L,45122L,45123L,45124L,45125L,45126L,45127L, 45128L,45129L,45130L,45131L,45132L,45133L,45134L,45135L,45136L,45137L, 45138L,45139L,45140L,45141L,45142L,45143L,45144L,45145L,45146L,45147L, 45148L,45149L,45150L,45151L,45152L,45153L,45154L,45155L,45156L,45157L, 45158L,45159L,45160L,45161L,45162L,45163L,45164L,45165L,45166L,45167L, 45168L,45169L,45170L,45171L,45172L,45173L,45174L,45175L,45176L,45177L, 45178L,45179L,45180L,45181L,45182L,45183L,45184L,45185L,45186L,45187L, 45188L,45189L,45190L,45191L,45192L,45193L,45194L,45195L,45196L,45197L, 45198L,45199L,45200L,45201L,45202L,45203L,45204L,45205L,45206L,45207L, 45208L,45209L,45210L,45211L,45212L,45213L,45214L,45215L,45216L,45217L, 45218L,45219L,45220L,45221L,45222L,45223L,45224L,45225L,45226L,45227L, 45228L,45229L,45230L,45231L,45232L,45233L,45234L,45235L,45236L,45237L, 45238L,45239L,45240L,45241L,45242L,45243L,45244L,45245L,45246L,45247L, 45248L,45249L,45250L,45251L,45252L,45253L,45254L,45255L,45256L,45257L, 45258L,45259L,45260L,45261L,45262L,45263L,45264L,45265L,45266L,45267L, 45268L,45269L,45270L,45271L,45272L,45273L,45274L,45275L,45276L,45277L, 45278L,45279L,45280L,45281L,45282L,45283L,45284L,45285L,45286L,45287L, 45288L,45289L,45290L,45291L,45292L,45293L,45294L,45295L,45296L,45297L, 45298L,45299L,45300L,45301L,45302L,45303L,45304L,45305L,45306L,45307L, 45308L,45309L,45310L,45311L,45312L,45313L,45314L,45315L,45316L,45317L, 45318L,45319L,45320L,45321L,45322L,45323L,45324L,45325L,45326L,45327L, 45328L,45329L,45330L,45331L,45332L,45333L,45334L,45335L,45336L,45337L, 45338L,45339L,45340L,45341L,45342L,45343L,45344L,45345L,45346L,45347L, 45348L,45349L,45350L,45351L,45352L,45353L,45354L,45355L,45356L,45357L, 45358L,45359L,45360L,45361L,45362L,45363L,45364L,45365L,45366L,45367L, 45368L,45369L,45370L,45371L,45372L,45373L,45374L,45375L,45376L,45377L, 45378L,45379L,45380L,45381L,45382L,45383L,45384L,45385L,45386L,45387L, 45388L,45389L,45390L,45391L,45392L,45393L,45394L,45395L,45396L,45397L, 45398L,45399L,45400L,45401L,45402L,45403L,45404L,45405L,45406L,45407L, 45408L,45409L,45410L,45411L,45412L,45413L,45414L,45415L,45416L,45417L, 45418L,45419L,45420L,45421L,45422L,45423L,45424L,45425L,45426L,45427L, 45428L,45429L,45430L,45431L,45432L,45433L,45434L,45435L,45436L,45437L, 45438L,45439L,45440L,45441L,45442L,45443L,45444L,45445L,45446L,45447L, 45448L,45449L,45450L,45451L,45452L,45453L,45454L,45455L,45456L,45457L, 45458L,45459L,45460L,45461L,45462L,45463L,45464L,45465L,45466L,45467L, 45468L,45469L,45470L,45471L,45472L,45473L,45474L,45475L,45476L,45477L, 45478L,45479L,45480L,45481L,45482L,45483L,45484L,45485L,45486L,45487L, 45488L,45489L,45490L,45491L,45492L,45493L,45494L,45495L,45496L,45497L, 45498L,45499L,45500L,45501L,45502L,45503L,45504L,45505L,45506L,45507L, 45508L,45509L,45510L,45511L,45512L,45513L,45514L,45515L,45516L,45517L, 45518L,45519L,45520L,45521L,45522L,45523L,45524L,45525L,45526L,45527L, 45528L,45529L,45530L,45531L,45532L,45533L,45534L,45535L,45536L,45537L, 45538L,45539L,45540L,45541L,45542L,45543L,45544L,45545L,45546L,45547L, 45548L,45549L,45550L,45551L,45552L,45553L,45554L,45555L,45556L,45557L, 45558L,45559L,45560L,45561L,45562L,45563L,45564L,45565L,45566L,45567L, 45568L,45569L,45570L,45571L,45572L,45573L,45574L,45575L,45576L,45577L, 45578L,45579L,45580L,45581L,45582L,45583L,45584L,45585L,45586L,45587L, 45588L,45589L,45590L,45591L,45592L,45593L,45594L,45595L,45596L,45597L, 45598L,45599L,45600L,45601L,45602L,45603L,45604L,45605L,45606L,45607L, 45608L,45609L,45610L,45611L,45612L,45613L,45614L,45615L,45616L,45617L, 45618L,45619L,45620L,45621L,45622L,45623L,45624L,45625L,45626L,45627L, 45628L,45629L,45630L,45631L,45632L,45633L,45634L,45635L,45636L,45637L, 45638L,45639L,45640L,45641L,45642L,45643L,45644L,45645L,45646L,45647L, 45648L,45649L,45650L,45651L,45652L,45653L,45654L,45655L,45656L,45657L, 45658L,45659L,45660L,45661L,45662L,45663L,45664L,45665L,45666L,45667L, 45668L,45669L,45670L,45671L,45672L,45673L,45674L,45675L,45676L,45677L, 45678L,45679L,45680L,45681L,45682L,45683L,45684L,45685L,45686L,45687L, 45688L,45689L,45690L,45691L,45692L,45693L,45694L,45695L,45696L,45697L, 45698L,45699L,45700L,45701L,45702L,45703L,45704L,45705L,45706L,45707L, 45708L,45709L,45710L,45711L,45712L,45713L,45714L,45715L,45716L,45717L, 45718L,45719L,45720L,45721L,45722L,45723L,45724L,45725L,45726L,45727L, 45728L,45729L,45730L,45731L,45732L,45733L,45734L,45735L,45736L,45737L, 45738L,45739L,45740L,45741L,45742L,45743L,45744L,45745L,45746L,45747L, 45748L,45749L,45750L,45751L,45752L,45753L,45754L,45755L,45756L,45757L, 45758L,45759L,45760L,45761L,45762L,45763L,45764L,45765L,45766L,45767L, 45768L,45769L,45770L,45771L,45772L,45773L,45774L,45775L,45776L,45777L, 45778L,45779L,45780L,45781L,45782L,45783L,45784L,45785L,45786L,45787L, 45788L,45789L,45790L,45791L,45792L,45793L,45794L,45795L,45796L,45797L, 45798L,45799L,45800L,45801L,45802L,45803L,45804L,45805L,45806L,45807L, 45808L,45809L,45810L,45811L,45812L,45813L,45814L,45815L,45816L,45817L, 45818L,45819L,45820L,45821L,45822L,45823L,45824L,45825L,45826L,45827L, 45828L,45829L,45830L,45831L,45832L,45833L,45834L,45835L,45836L,45837L, 45838L,45839L,45840L,45841L,45842L,45843L,45844L,45845L,45846L,45847L, 45848L,45849L,45850L,45851L,45852L,45853L,45854L,45855L,45856L,45857L, 45858L,45859L,45860L,45861L,45862L,45863L,45864L,45865L,45866L,45867L, 45868L,45869L,45870L,45871L,45872L,45873L,45874L,45875L,45876L,45877L, 45878L,45879L,45880L,45881L,45882L,45883L,45884L,45885L,45886L,45887L, 45888L,45889L,45890L,45891L,45892L,45893L,45894L,45895L,45896L,45897L, 45898L,45899L,45900L,45901L,45902L,45903L,45904L,45905L,45906L,45907L, 45908L,45909L,45910L,45911L,45912L,45913L,45914L,45915L,45916L,45917L, 45918L,45919L,45920L,45921L,45922L,45923L,45924L,45925L,45926L,45927L, 45928L,45929L,45930L,45931L,45932L,45933L,45934L,45935L,45936L,45937L, 45938L,45939L,45940L,45941L,45942L,45943L,45944L,45945L,45946L,45947L, 45948L,45949L,45950L,45951L,45952L,45953L,45954L,45955L,45956L,45957L, 45958L,45959L,45960L,45961L,45962L,45963L,45964L,45965L,45966L,45967L, 45968L,45969L,45970L,45971L,45972L,45973L,45974L,45975L,45976L,45977L, 45978L,45979L,45980L,45981L,45982L,45983L,45984L,45985L,45986L,45987L, 45988L,45989L,45990L,45991L,45992L,45993L,45994L,45995L,45996L,45997L, 45998L,45999L,46000L,46001L,46002L,46003L,46004L,46005L,46006L,46007L, 46008L,46009L,46010L,46011L,46012L,46013L,46014L,46015L,46016L,46017L, 46018L,46019L,46020L,46021L,46022L,46023L,46024L,46025L,46026L,46027L, 46028L,46029L,46030L,46031L,46032L,46033L,46034L,46035L,46036L,46037L, 46038L,46039L,46040L,46041L,46042L,46043L,46044L,46045L,46046L,46047L, 46048L,46049L,46050L,46051L,46052L,46053L,46054L,46055L,46056L,46057L, 46058L,46059L,46060L,46061L,46062L,46063L,46064L,46065L,46066L,46067L, 46068L,46069L,46070L,46071L,46072L,46073L,46074L,46075L,46076L,46077L, 46078L,46079L,46080L,46081L,46082L,46083L,46084L,46085L,46086L,46087L, 46088L,46089L,46090L,46091L,46092L,46093L,46094L,46095L,46096L,46097L, 46098L,46099L,46100L,46101L,46102L,46103L,46104L,46105L,46106L,46107L, 46108L,46109L,46110L,46111L,46112L,46113L,46114L,46115L,46116L,46117L, 46118L,46119L,46120L,46121L,46122L,46123L,46124L,46125L,46126L,46127L, 46128L,46129L,46130L,46131L,46132L,46133L,46134L,46135L,46136L,46137L, 46138L,46139L,46140L,46141L,46142L,46143L,46144L,46145L,46146L,46147L, 46148L,46149L,46150L,46151L,46152L,46153L,46154L,46155L,46156L,46157L, 46158L,46159L,46160L,46161L,46162L,46163L,46164L,46165L,46166L,46167L, 46168L,46169L,46170L,46171L,46172L,46173L,46174L,46175L,46176L,46177L, 46178L,46179L,46180L,46181L,46182L,46183L,46184L,46185L,46186L,46187L, 46188L,46189L,46190L,46191L,46192L,46193L,46194L,46195L,46196L,46197L, 46198L,46199L,46200L,46201L,46202L,46203L,46204L,46205L,46206L,46207L, 46208L,46209L,46210L,46211L,46212L,46213L,46214L,46215L,46216L,46217L, 46218L,46219L,46220L,46221L,46222L,46223L,46224L,46225L,46226L,46227L, 46228L,46229L,46230L,46231L,46232L,46233L,46234L,46235L,46236L,46237L, 46238L,46239L,46240L,46241L,46242L,46243L,46244L,46245L,46246L,46247L, 46248L,46249L,46250L,46251L,46252L,46253L,46254L,46255L,46256L,46257L, 46258L,46259L,46260L,46261L,46262L,46263L,46264L,46265L,46266L,46267L, 46268L,46269L,46270L,46271L,46272L,46273L,46274L,46275L,46276L,46277L, 46278L,46279L,46280L,46281L,46282L,46283L,46284L,46285L,46286L,46287L, 46288L,46289L,46290L,46291L,46292L,46293L,46294L,46295L,46296L,46297L, 46298L,46299L,46300L,46301L,46302L,46303L,46304L,46305L,46306L,46307L, 46308L,46309L,46310L,46311L,46312L,46313L,46314L,46315L,46316L,46317L, 46318L,46319L,46320L,46321L,46322L,46323L,46324L,46325L,46326L,46327L, 46328L,46329L,46330L,46331L,46332L,46333L,46334L,46335L,46336L,46337L, 46338L,46339L,46340L,46341L,46342L,46343L,46344L,46345L,46346L,46347L, 46348L,46349L,46350L,46351L,46352L,46353L,46354L,46355L,46356L,46357L, 46358L,46359L,46360L,46361L,46362L,46363L,46364L,46365L,46366L,46367L, 46368L,46369L,46370L,46371L,46372L,46373L,46374L,46375L,46376L,46377L, 46378L,46379L,46380L,46381L,46382L,46383L,46384L,46385L,46386L,46387L, 46388L,46389L,46390L,46391L,46392L,46393L,46394L,46395L,46396L,46397L, 46398L,46399L,46400L,46401L,46402L,46403L,46404L,46405L,46406L,46407L, 46408L,46409L,46410L,46411L,46412L,46413L,46414L,46415L,46416L,46417L, 46418L,46419L,46420L,46421L,46422L,46423L,46424L,46425L,46426L,46427L, 46428L,46429L,46430L,46431L,46432L,46433L,46434L,46435L,46436L,46437L, 46438L,46439L,46440L,46441L,46442L,46443L,46444L,46445L,46446L,46447L, 46448L,46449L,46450L,46451L,46452L,46453L,46454L,46455L,46456L,46457L, 46458L,46459L,46460L,46461L,46462L,46463L,46464L,46465L,46466L,46467L, 46468L,46469L,46470L,46471L,46472L,46473L,46474L,46475L,46476L,46477L, 46478L,46479L,46480L,46481L,46482L,46483L,46484L,46485L,46486L,46487L, 46488L,46489L,46490L,46491L,46492L,46493L,46494L,46495L,46496L,46497L, 46498L,46499L,46500L,46501L,46502L,46503L,46504L,46505L,46506L,46507L, 46508L,46509L,46510L,46511L,46512L,46513L,46514L,46515L,46516L,46517L, 46518L,46519L,46520L,46521L,46522L,46523L,46524L,46525L,46526L,46527L, 46528L,46529L,46530L,46531L,46532L,46533L,46534L,46535L,46536L,46537L, 46538L,46539L,46540L,46541L,46542L,46543L,46544L,46545L,46546L,46547L, 46548L,46549L,46550L,46551L,46552L,46553L,46554L,46555L,46556L,46557L, 46558L,46559L,46560L,46561L,46562L,46563L,46564L,46565L,46566L,46567L, 46568L,46569L,46570L,46571L,46572L,46573L,46574L,46575L,46576L,46577L, 46578L,46579L,46580L,46581L,46582L,46583L,46584L,46585L,46586L,46587L, 46588L,46589L,46590L,46591L,46592L,46593L,46594L,46595L,46596L,46597L, 46598L,46599L,46600L,46601L,46602L,46603L,46604L,46605L,46606L,46607L, 46608L,46609L,46610L,46611L,46612L,46613L,46614L,46615L,46616L,46617L, 46618L,46619L,46620L,46621L,46622L,46623L,46624L,46625L,46626L,46627L, 46628L,46629L,46630L,46631L,46632L,46633L,46634L,46635L,46636L,46637L, 46638L,46639L,46640L,46641L,46642L,46643L,46644L,46645L,46646L,46647L, 46648L,46649L,46650L,46651L,46652L,46653L,46654L,46655L,46656L,46657L, 46658L,46659L,46660L,46661L,46662L,46663L,46664L,46665L,46666L,46667L, 46668L,46669L,46670L,46671L,46672L,46673L,46674L,46675L,46676L,46677L, 46678L,46679L,46680L,46681L,46682L,46683L,46684L,46685L,46686L,46687L, 46688L,46689L,46690L,46691L,46692L,46693L,46694L,46695L,46696L,46697L, 46698L,46699L,46700L,46701L,46702L,46703L,46704L,46705L,46706L,46707L, 46708L,46709L,46710L,46711L,46712L,46713L,46714L,46715L,46716L,46717L, 46718L,46719L,46720L,46721L,46722L,46723L,46724L,46725L,46726L,46727L, 46728L,46729L,46730L,46731L,46732L,46733L,46734L,46735L,46736L,46737L, 46738L,46739L,46740L,46741L,46742L,46743L,46744L,46745L,46746L,46747L, 46748L,46749L,46750L,46751L,46752L,46753L,46754L,46755L,46756L,46757L, 46758L,46759L,46760L,46761L,46762L,46763L,46764L,46765L,46766L,46767L, 46768L,46769L,46770L,46771L,46772L,46773L,46774L,46775L,46776L,46777L, 46778L,46779L,46780L,46781L,46782L,46783L,46784L,46785L,46786L,46787L, 46788L,46789L,46790L,46791L,46792L,46793L,46794L,46795L,46796L,46797L, 46798L,46799L,46800L,46801L,46802L,46803L,46804L,46805L,46806L,46807L, 46808L,46809L,46810L,46811L,46812L,46813L,46814L,46815L,46816L,46817L, 46818L,46819L,46820L,46821L,46822L,46823L,46824L,46825L,46826L,46827L, 46828L,46829L,46830L,46831L,46832L,46833L,46834L,46835L,46836L,46837L, 46838L,46839L,46840L,46841L,46842L,46843L,46844L,46845L,46846L,46847L, 46848L,46849L,46850L,46851L,46852L,46853L,46854L,46855L,46856L,46857L, 46858L,46859L,46860L,46861L,46862L,46863L,46864L,46865L,46866L,46867L, 46868L,46869L,46870L,46871L,46872L,46873L,46874L,46875L,46876L,46877L, 46878L,46879L,46880L,46881L,46882L,46883L,46884L,46885L,46886L,46887L, 46888L,46889L,46890L,46891L,46892L,46893L,46894L,46895L,46896L,46897L, 46898L,46899L,46900L,46901L,46902L,46903L,46904L,46905L,46906L,46907L, 46908L,46909L,46910L,46911L,46912L,46913L,46914L,46915L,46916L,46917L, 46918L,46919L,46920L,46921L,46922L,46923L,46924L,46925L,46926L,46927L, 46928L,46929L,46930L,46931L,46932L,46933L,46934L,46935L,46936L,46937L, 46938L,46939L,46940L,46941L,46942L,46943L,46944L,46945L,46946L,46947L, 46948L,46949L,46950L,46951L,46952L,46953L,46954L,46955L,46956L,46957L, 46958L,46959L,46960L,46961L,46962L,46963L,46964L,46965L,46966L,46967L, 46968L,46969L,46970L,46971L,46972L,46973L,46974L,46975L,46976L,46977L, 46978L,46979L,46980L,46981L,46982L,46983L,46984L,46985L,46986L,46987L, 46988L,46989L,46990L,46991L,46992L,46993L,46994L,46995L,46996L,46997L, 46998L,46999L,47000L,47001L,47002L,47003L,47004L,47005L,47006L,47007L, 47008L,47009L,47010L,47011L,47012L,47013L,47014L,47015L,47016L,47017L, 47018L,47019L,47020L,47021L,47022L,47023L,47024L,47025L,47026L,47027L, 47028L,47029L,47030L,47031L,47032L,47033L,47034L,47035L,47036L,47037L, 47038L,47039L,47040L,47041L,47042L,47043L,47044L,47045L,47046L,47047L, 47048L,47049L,47050L,47051L,47052L,47053L,47054L,47055L,47056L,47057L, 47058L,47059L,47060L,47061L,47062L,47063L,47064L,47065L,47066L,47067L, 47068L,47069L,47070L,47071L,47072L,47073L,47074L,47075L,47076L,47077L, 47078L,47079L,47080L,47081L,47082L,47083L,47084L,47085L,47086L,47087L, 47088L,47089L,47090L,47091L,47092L,47093L,47094L,47095L,47096L,47097L, 47098L,47099L,47100L,47101L,47102L,47103L,47104L,47105L,47106L,47107L, 47108L,47109L,47110L,47111L,47112L,47113L,47114L,47115L,47116L,47117L, 47118L,47119L,47120L,47121L,47122L,47123L,47124L,47125L,47126L,47127L, 47128L,47129L,47130L,47131L,47132L,47133L,47134L,47135L,47136L,47137L, 47138L,47139L,47140L,47141L,47142L,47143L,47144L,47145L,47146L,47147L, 47148L,47149L,47150L,47151L,47152L,47153L,47154L,47155L,47156L,47157L, 47158L,47159L,47160L,47161L,47162L,47163L,47164L,47165L,47166L,47167L, 47168L,47169L,47170L,47171L,47172L,47173L,47174L,47175L,47176L,47177L, 47178L,47179L,47180L,47181L,47182L,47183L,47184L,47185L,47186L,47187L, 47188L,47189L,47190L,47191L,47192L,47193L,47194L,47195L,47196L,47197L, 47198L,47199L,47200L,47201L,47202L,47203L,47204L,47205L,47206L,47207L, 47208L,47209L,47210L,47211L,47212L,47213L,47214L,47215L,47216L,47217L, 47218L,47219L,47220L,47221L,47222L,47223L,47224L,47225L,47226L,47227L, 47228L,47229L,47230L,47231L,47232L,47233L,47234L,47235L,47236L,47237L, 47238L,47239L,47240L,47241L,47242L,47243L,47244L,47245L,47246L,47247L, 47248L,47249L,47250L,47251L,47252L,47253L,47254L,47255L,47256L,47257L, 47258L,47259L,47260L,47261L,47262L,47263L,47264L,47265L,47266L,47267L, 47268L,47269L,47270L,47271L,47272L,47273L,47274L,47275L,47276L,47277L, 47278L,47279L,47280L,47281L,47282L,47283L,47284L,47285L,47286L,47287L, 47288L,47289L,47290L,47291L,47292L,47293L,47294L,47295L,47296L,47297L, 47298L,47299L,47300L,47301L,47302L,47303L,47304L,47305L,47306L,47307L, 47308L,47309L,47310L,47311L,47312L,47313L,47314L,47315L,47316L,47317L, 47318L,47319L,47320L,47321L,47322L,47323L,47324L,47325L,47326L,47327L, 47328L,47329L,47330L,47331L,47332L,47333L,47334L,47335L,47336L,47337L, 47338L,47339L,47340L,47341L,47342L,47343L,47344L,47345L,47346L,47347L, 47348L,47349L,47350L,47351L,47352L,47353L,47354L,47355L,47356L,47357L, 47358L,47359L,47360L,47361L,47362L,47363L,47364L,47365L,47366L,47367L, 47368L,47369L,47370L,47371L,47372L,47373L,47374L,47375L,47376L,47377L, 47378L,47379L,47380L,47381L,47382L,47383L,47384L,47385L,47386L,47387L, 47388L,47389L,47390L,47391L,47392L,47393L,47394L,47395L,47396L,47397L, 47398L,47399L,47400L,47401L,47402L,47403L,47404L,47405L,47406L,47407L, 47408L,47409L,47410L,47411L,47412L,47413L,47414L,47415L,47416L,47417L, 47418L,47419L,47420L,47421L,47422L,47423L,47424L,47425L,47426L,47427L, 47428L,47429L,47430L,47431L,47432L,47433L,47434L,47435L,47436L,47437L, 47438L,47439L,47440L,47441L,47442L,47443L,47444L,47445L,47446L,47447L, 47448L,47449L,47450L,47451L,47452L,47453L,47454L,47455L,47456L,47457L, 47458L,47459L,47460L,47461L,47462L,47463L,47464L,47465L,47466L,47467L, 47468L,47469L,47470L,47471L,47472L,47473L,47474L,47475L,47476L,47477L, 47478L,47479L,47480L,47481L,47482L,47483L,47484L,47485L,47486L,47487L, 47488L,47489L,47490L,47491L,47492L,47493L,47494L,47495L,47496L,47497L, 47498L,47499L,47500L,47501L,47502L,47503L,47504L,47505L,47506L,47507L, 47508L,47509L,47510L,47511L,47512L,47513L,47514L,47515L,47516L,47517L, 47518L,47519L,47520L,47521L,47522L,47523L,47524L,47525L,47526L,47527L, 47528L,47529L,47530L,47531L,47532L,47533L,47534L,47535L,47536L,47537L, 47538L,47539L,47540L,47541L,47542L,47543L,47544L,47545L,47546L,47547L, 47548L,47549L,47550L,47551L,47552L,47553L,47554L,47555L,47556L,47557L, 47558L,47559L,47560L,47561L,47562L,47563L,47564L,47565L,47566L,47567L, 47568L,47569L,47570L,47571L,47572L,47573L,47574L,47575L,47576L,47577L, 47578L,47579L,47580L,47581L,47582L,47583L,47584L,47585L,47586L,47587L, 47588L,47589L,47590L,47591L,47592L,47593L,47594L,47595L,47596L,47597L, 47598L,47599L,47600L,47601L,47602L,47603L,47604L,47605L,47606L,47607L, 47608L,47609L,47610L,47611L,47612L,47613L,47614L,47615L,47616L,47617L, 47618L,47619L,47620L,47621L,47622L,47623L,47624L,47625L,47626L,47627L, 47628L,47629L,47630L,47631L,47632L,47633L,47634L,47635L,47636L,47637L, 47638L,47639L,47640L,47641L,47642L,47643L,47644L,47645L,47646L,47647L, 47648L,47649L,47650L,47651L,47652L,47653L,47654L,47655L,47656L,47657L, 47658L,47659L,47660L,47661L,47662L,47663L,47664L,47665L,47666L,47667L, 47668L,47669L,47670L,47671L,47672L,47673L,47674L,47675L,47676L,47677L, 47678L,47679L,47680L,47681L,47682L,47683L,47684L,47685L,47686L,47687L, 47688L,47689L,47690L,47691L,47692L,47693L,47694L,47695L,47696L,47697L, 47698L,47699L,47700L,47701L,47702L,47703L,47704L,47705L,47706L,47707L, 47708L,47709L,47710L,47711L,47712L,47713L,47714L,47715L,47716L,47717L, 47718L,47719L,47720L,47721L,47722L,47723L,47724L,47725L,47726L,47727L, 47728L,47729L,47730L,47731L,47732L,47733L,47734L,47735L,47736L,47737L, 47738L,47739L,47740L,47741L,47742L,47743L,47744L,47745L,47746L,47747L, 47748L,47749L,47750L,47751L,47752L,47753L,47754L,47755L,47756L,47757L, 47758L,47759L,47760L,47761L,47762L,47763L,47764L,47765L,47766L,47767L, 47768L,47769L,47770L,47771L,47772L,47773L,47774L,47775L,47776L,47777L, 47778L,47779L,47780L,47781L,47782L,47783L,47784L,47785L,47786L,47787L, 47788L,47789L,47790L,47791L,47792L,47793L,47794L,47795L,47796L,47797L, 47798L,47799L,47800L,47801L,47802L,47803L,47804L,47805L,47806L,47807L, 47808L,47809L,47810L,47811L,47812L,47813L,47814L,47815L,47816L,47817L, 47818L,47819L,47820L,47821L,47822L,47823L,47824L,47825L,47826L,47827L, 47828L,47829L,47830L,47831L,47832L,47833L,47834L,47835L,47836L,47837L, 47838L,47839L,47840L,47841L,47842L,47843L,47844L,47845L,47846L,47847L, 47848L,47849L,47850L,47851L,47852L,47853L,47854L,47855L,47856L,47857L, 47858L,47859L,47860L,47861L,47862L,47863L,47864L,47865L,47866L,47867L, 47868L,47869L,47870L,47871L,47872L,47873L,47874L,47875L,47876L,47877L, 47878L,47879L,47880L,47881L,47882L,47883L,47884L,47885L,47886L,47887L, 47888L,47889L,47890L,47891L,47892L,47893L,47894L,47895L,47896L,47897L, 47898L,47899L,47900L,47901L,47902L,47903L,47904L,47905L,47906L,47907L, 47908L,47909L,47910L,47911L,47912L,47913L,47914L,47915L,47916L,47917L, 47918L,47919L,47920L,47921L,47922L,47923L,47924L,47925L,47926L,47927L, 47928L,47929L,47930L,47931L,47932L,47933L,47934L,47935L,47936L,47937L, 47938L,47939L,47940L,47941L,47942L,47943L,47944L,47945L,47946L,47947L, 47948L,47949L,47950L,47951L,47952L,47953L,47954L,47955L,47956L,47957L, 47958L,47959L,47960L,47961L,47962L,47963L,47964L,47965L,47966L,47967L, 47968L,47969L,47970L,47971L,47972L,47973L,47974L,47975L,47976L,47977L, 47978L,47979L,47980L,47981L,47982L,47983L,47984L,47985L,47986L,47987L, 47988L,47989L,47990L,47991L,47992L,47993L,47994L,47995L,47996L,47997L, 47998L,47999L,48000L,48001L,48002L,48003L,48004L,48005L,48006L,48007L, 48008L,48009L,48010L,48011L,48012L,48013L,48014L,48015L,48016L,48017L, 48018L,48019L,48020L,48021L,48022L,48023L,48024L,48025L,48026L,48027L, 48028L,48029L,48030L,48031L,48032L,48033L,48034L,48035L,48036L,48037L, 48038L,48039L,48040L,48041L,48042L,48043L,48044L,48045L,48046L,48047L, 48048L,48049L,48050L,48051L,48052L,48053L,48054L,48055L,48056L,48057L, 48058L,48059L,48060L,48061L,48062L,48063L,48064L,48065L,48066L,48067L, 48068L,48069L,48070L,48071L,48072L,48073L,48074L,48075L,48076L,48077L, 48078L,48079L,48080L,48081L,48082L,48083L,48084L,48085L,48086L,48087L, 48088L,48089L,48090L,48091L,48092L,48093L,48094L,48095L,48096L,48097L, 48098L,48099L,48100L,48101L,48102L,48103L,48104L,48105L,48106L,48107L, 48108L,48109L,48110L,48111L,48112L,48113L,48114L,48115L,48116L,48117L, 48118L,48119L,48120L,48121L,48122L,48123L,48124L,48125L,48126L,48127L, 48128L,48129L,48130L,48131L,48132L,48133L,48134L,48135L,48136L,48137L, 48138L,48139L,48140L,48141L,48142L,48143L,48144L,48145L,48146L,48147L, 48148L,48149L,48150L,48151L,48152L,48153L,48154L,48155L,48156L,48157L, 48158L,48159L,48160L,48161L,48162L,48163L,48164L,48165L,48166L,48167L, 48168L,48169L,48170L,48171L,48172L,48173L,48174L,48175L,48176L,48177L, 48178L,48179L,48180L,48181L,48182L,48183L,48184L,48185L,48186L,48187L, 48188L,48189L,48190L,48191L,48192L,48193L,48194L,48195L,48196L,48197L, 48198L,48199L,48200L,48201L,48202L,48203L,48204L,48205L,48206L,48207L, 48208L,48209L,48210L,48211L,48212L,48213L,48214L,48215L,48216L,48217L, 48218L,48219L,48220L,48221L,48222L,48223L,48224L,48225L,48226L,48227L, 48228L,48229L,48230L,48231L,48232L,48233L,48234L,48235L,48236L,48237L, 48238L,48239L,48240L,48241L,48242L,48243L,48244L,48245L,48246L,48247L, 48248L,48249L,48250L,48251L,48252L,48253L,48254L,48255L,48256L,48257L, 48258L,48259L,48260L,48261L,48262L,48263L,48264L,48265L,48266L,48267L, 48268L,48269L,48270L,48271L,48272L,48273L,48274L,48275L,48276L,48277L, 48278L,48279L,48280L,48281L,48282L,48283L,48284L,48285L,48286L,48287L, 48288L,48289L,48290L,48291L,48292L,48293L,48294L,48295L,48296L,48297L, 48298L,48299L,48300L,48301L,48302L,48303L,48304L,48305L,48306L,48307L, 48308L,48309L,48310L,48311L,48312L,48313L,48314L,48315L,48316L,48317L, 48318L,48319L,48320L,48321L,48322L,48323L,48324L,48325L,48326L,48327L, 48328L,48329L,48330L,48331L,48332L,48333L,48334L,48335L,48336L,48337L, 48338L,48339L,48340L,48341L,48342L,48343L,48344L,48345L,48346L,48347L, 48348L,48349L,48350L,48351L,48352L,48353L,48354L,48355L,48356L,48357L, 48358L,48359L,48360L,48361L,48362L,48363L,48364L,48365L,48366L,48367L, 48368L,48369L,48370L,48371L,48372L,48373L,48374L,48375L,48376L,48377L, 48378L,48379L,48380L,48381L,48382L,48383L,48384L,48385L,48386L,48387L, 48388L,48389L,48390L,48391L,48392L,48393L,48394L,48395L,48396L,48397L, 48398L,48399L,48400L,48401L,48402L,48403L,48404L,48405L,48406L,48407L, 48408L,48409L,48410L,48411L,48412L,48413L,48414L,48415L,48416L,48417L, 48418L,48419L,48420L,48421L,48422L,48423L,48424L,48425L,48426L,48427L, 48428L,48429L,48430L,48431L,48432L,48433L,48434L,48435L,48436L,48437L, 48438L,48439L,48440L,48441L,48442L,48443L,48444L,48445L,48446L,48447L, 48448L,48449L,48450L,48451L,48452L,48453L,48454L,48455L,48456L,48457L, 48458L,48459L,48460L,48461L,48462L,48463L,48464L,48465L,48466L,48467L, 48468L,48469L,48470L,48471L,48472L,48473L,48474L,48475L,48476L,48477L, 48478L,48479L,48480L,48481L,48482L,48483L,48484L,48485L,48486L,48487L, 48488L,48489L,48490L,48491L,48492L,48493L,48494L,48495L,48496L,48497L, 48498L,48499L,48500L,48501L,48502L,48503L,48504L,48505L,48506L,48507L, 48508L,48509L,48510L,48511L,48512L,48513L,48514L,48515L,48516L,48517L, 48518L,48519L,48520L,48521L,48522L,48523L,48524L,48525L,48526L,48527L, 48528L,48529L,48530L,48531L,48532L,48533L,48534L,48535L,48536L,48537L, 48538L,48539L,48540L,48541L,48542L,48543L,48544L,48545L,48546L,48547L, 48548L,48549L,48550L,48551L,48552L,48553L,48554L,48555L,48556L,48557L, 48558L,48559L,48560L,48561L,48562L,48563L,48564L,48565L,48566L,48567L, 48568L,48569L,48570L,48571L,48572L,48573L,48574L,48575L,48576L,48577L, 48578L,48579L,48580L,48581L,48582L,48583L,48584L,48585L,48586L,48587L, 48588L,48589L,48590L,48591L,48592L,48593L,48594L,48595L,48596L,48597L, 48598L,48599L,48600L,48601L,48602L,48603L,48604L,48605L,48606L,48607L, 48608L,48609L,48610L,48611L,48612L,48613L,48614L,48615L,48616L,48617L, 48618L,48619L,48620L,48621L,48622L,48623L,48624L,48625L,48626L,48627L, 48628L,48629L,48630L,48631L,48632L,48633L,48634L,48635L,48636L,48637L, 48638L,48639L,48640L,48641L,48642L,48643L,48644L,48645L,48646L,48647L, 48648L,48649L,48650L,48651L,48652L,48653L,48654L,48655L,48656L,48657L, 48658L,48659L,48660L,48661L,48662L,48663L,48664L,48665L,48666L,48667L, 48668L,48669L,48670L,48671L,48672L,48673L,48674L,48675L,48676L,48677L, 48678L,48679L,48680L,48681L,48682L,48683L,48684L,48685L,48686L,48687L, 48688L,48689L,48690L,48691L,48692L,48693L,48694L,48695L,48696L,48697L, 48698L,48699L,48700L,48701L,48702L,48703L,48704L,48705L,48706L,48707L, 48708L,48709L,48710L,48711L,48712L,48713L,48714L,48715L,48716L,48717L, 48718L,48719L,48720L,48721L,48722L,48723L,48724L,48725L,48726L,48727L, 48728L,48729L,48730L,48731L,48732L,48733L,48734L,48735L,48736L,48737L, 48738L,48739L,48740L,48741L,48742L,48743L,48744L,48745L,48746L,48747L, 48748L,48749L,48750L,48751L,48752L,48753L,48754L,48755L,48756L,48757L, 48758L,48759L,48760L,48761L,48762L,48763L,48764L,48765L,48766L,48767L, 48768L,48769L,48770L,48771L,48772L,48773L,48774L,48775L,48776L,48777L, 48778L,48779L,48780L,48781L,48782L,48783L,48784L,48785L,48786L,48787L, 48788L,48789L,48790L,48791L,48792L,48793L,48794L,48795L,48796L,48797L, 48798L,48799L,48800L,48801L,48802L,48803L,48804L,48805L,48806L,48807L, 48808L,48809L,48810L,48811L,48812L,48813L,48814L,48815L,48816L,48817L, 48818L,48819L,48820L,48821L,48822L,48823L,48824L,48825L,48826L,48827L, 48828L,48829L,48830L,48831L,48832L,48833L,48834L,48835L,48836L,48837L, 48838L,48839L,48840L,48841L,48842L,48843L,48844L,48845L,48846L,48847L, 48848L,48849L,48850L,48851L,48852L,48853L,48854L,48855L,48856L,48857L, 48858L,48859L,48860L,48861L,48862L,48863L,48864L,48865L,48866L,48867L, 48868L,48869L,48870L,48871L,48872L,48873L,48874L,48875L,48876L,48877L, 48878L,48879L,48880L,48881L,48882L,48883L,48884L,48885L,48886L,48887L, 48888L,48889L,48890L,48891L,48892L,48893L,48894L,48895L,48896L,48897L, 48898L,48899L,48900L,48901L,48902L,48903L,48904L,48905L,48906L,48907L, 48908L,48909L,48910L,48911L,48912L,48913L,48914L,48915L,48916L,48917L, 48918L,48919L,48920L,48921L,48922L,48923L,48924L,48925L,48926L,48927L, 48928L,48929L,48930L,48931L,48932L,48933L,48934L,48935L,48936L,48937L, 48938L,48939L,48940L,48941L,48942L,48943L,48944L,48945L,48946L,48947L, 48948L,48949L,48950L,48951L,48952L,48953L,48954L,48955L,48956L,48957L, 48958L,48959L,48960L,48961L,48962L,48963L,48964L,48965L,48966L,48967L, 48968L,48969L,48970L,48971L,48972L,48973L,48974L,48975L,48976L,48977L, 48978L,48979L,48980L,48981L,48982L,48983L,48984L,48985L,48986L,48987L, 48988L,48989L,48990L,48991L,48992L,48993L,48994L,48995L,48996L,48997L, 48998L,48999L,49000L,49001L,49002L,49003L,49004L,49005L,49006L,49007L, 49008L,49009L,49010L,49011L,49012L,49013L,49014L,49015L,49016L,49017L, 49018L,49019L,49020L,49021L,49022L,49023L,49024L,49025L,49026L,49027L, 49028L,49029L,49030L,49031L,49032L,49033L,49034L,49035L,49036L,49037L, 49038L,49039L,49040L,49041L,49042L,49043L,49044L,49045L,49046L,49047L, 49048L,49049L,49050L,49051L,49052L,49053L,49054L,49055L,49056L,49057L, 49058L,49059L,49060L,49061L,49062L,49063L,49064L,49065L,49066L,49067L, 49068L,49069L,49070L,49071L,49072L,49073L,49074L,49075L,49076L,49077L, 49078L,49079L,49080L,49081L,49082L,49083L,49084L,49085L,49086L,49087L, 49088L,49089L,49090L,49091L,49092L,49093L,49094L,49095L,49096L,49097L, 49098L,49099L,49100L,49101L,49102L,49103L,49104L,49105L,49106L,49107L, 49108L,49109L,49110L,49111L,49112L,49113L,49114L,49115L,49116L,49117L, 49118L,49119L,49120L,49121L,49122L,49123L,49124L,49125L,49126L,49127L, 49128L,49129L,49130L,49131L,49132L,49133L,49134L,49135L,49136L,49137L, 49138L,49139L,49140L,49141L,49142L,49143L,49144L,49145L,49146L,49147L, 49148L,49149L,49150L,49151L,49152L,49153L,49154L,49155L,49156L,49157L, 49158L,49159L,49160L,49161L,49162L,49163L,49164L,49165L,49166L,49167L, 49168L,49169L,49170L,49171L,49172L,49173L,49174L,49175L,49176L,49177L, 49178L,49179L,49180L,49181L,49182L,49183L,49184L,49185L,49186L,49187L, 49188L,49189L,49190L,49191L,49192L,49193L,49194L,49195L,49196L,49197L, 49198L,49199L,49200L,49201L,49202L,49203L,49204L,49205L,49206L,49207L, 49208L,49209L,49210L,49211L,49212L,49213L,49214L,49215L,49216L,49217L, 49218L,49219L,49220L,49221L,49222L,49223L,49224L,49225L,49226L,49227L, 49228L,49229L,49230L,49231L,49232L,49233L,49234L,49235L,49236L,49237L, 49238L,49239L,49240L,49241L,49242L,49243L,49244L,49245L,49246L,49247L, 49248L,49249L,49250L,49251L,49252L,49253L,49254L,49255L,49256L,49257L, 49258L,49259L,49260L,49261L,49262L,49263L,49264L,49265L,49266L,49267L, 49268L,49269L,49270L,49271L,49272L,49273L,49274L,49275L,49276L,49277L, 49278L,49279L,49280L,49281L,49282L,49283L,49284L,49285L,49286L,49287L, 49288L,49289L,49290L,49291L,49292L,49293L,49294L,49295L,49296L,49297L, 49298L,49299L,49300L,49301L,49302L,49303L,49304L,49305L,49306L,49307L, 49308L,49309L,49310L,49311L,49312L,49313L,49314L,49315L,49316L,49317L, 49318L,49319L,49320L,49321L,49322L,49323L,49324L,49325L,49326L,49327L, 49328L,49329L,49330L,49331L,49332L,49333L,49334L,49335L,49336L,49337L, 49338L,49339L,49340L,49341L,49342L,49343L,49344L,49345L,49346L,49347L, 49348L,49349L,49350L,49351L,49352L,49353L,49354L,49355L,49356L,49357L, 49358L,49359L,49360L,49361L,49362L,49363L,49364L,49365L,49366L,49367L, 49368L,49369L,49370L,49371L,49372L,49373L,49374L,49375L,49376L,49377L, 49378L,49379L,49380L,49381L,49382L,49383L,49384L,49385L,49386L,49387L, 49388L,49389L,49390L,49391L,49392L,49393L,49394L,49395L,49396L,49397L, 49398L,49399L,49400L,49401L,49402L,49403L,49404L,49405L,49406L,49407L, 49408L,49409L,49410L,49411L,49412L,49413L,49414L,49415L,49416L,49417L, 49418L,49419L,49420L,49421L,49422L,49423L,49424L,49425L,49426L,49427L, 49428L,49429L,49430L,49431L,49432L,49433L,49434L,49435L,49436L,49437L, 49438L,49439L,49440L,49441L,49442L,49443L,49444L,49445L,49446L,49447L, 49448L,49449L,49450L,49451L,49452L,49453L,49454L,49455L,49456L,49457L, 49458L,49459L,49460L,49461L,49462L,49463L,49464L,49465L,49466L,49467L, 49468L,49469L,49470L,49471L,49472L,49473L,49474L,49475L,49476L,49477L, 49478L,49479L,49480L,49481L,49482L,49483L,49484L,49485L,49486L,49487L, 49488L,49489L,49490L,49491L,49492L,49493L,49494L,49495L,49496L,49497L, 49498L,49499L,49500L,49501L,49502L,49503L,49504L,49505L,49506L,49507L, 49508L,49509L,49510L,49511L,49512L,49513L,49514L,49515L,49516L,49517L, 49518L,49519L,49520L,49521L,49522L,49523L,49524L,49525L,49526L,49527L, 49528L,49529L,49530L,49531L,49532L,49533L,49534L,49535L,49536L,49537L, 49538L,49539L,49540L,49541L,49542L,49543L,49544L,49545L,49546L,49547L, 49548L,49549L,49550L,49551L,49552L,49553L,49554L,49555L,49556L,49557L, 49558L,49559L,49560L,49561L,49562L,49563L,49564L,49565L,49566L,49567L, 49568L,49569L,49570L,49571L,49572L,49573L,49574L,49575L,49576L,49577L, 49578L,49579L,49580L,49581L,49582L,49583L,49584L,49585L,49586L,49587L, 49588L,49589L,49590L,49591L,49592L,49593L,49594L,49595L,49596L,49597L, 49598L,49599L,49600L,49601L,49602L,49603L,49604L,49605L,49606L,49607L, 49608L,49609L,49610L,49611L,49612L,49613L,49614L,49615L,49616L,49617L, 49618L,49619L,49620L,49621L,49622L,49623L,49624L,49625L,49626L,49627L, 49628L,49629L,49630L,49631L,49632L,49633L,49634L,49635L,49636L,49637L, 49638L,49639L,49640L,49641L,49642L,49643L,49644L,49645L,49646L,49647L, 49648L,49649L,49650L,49651L,49652L,49653L,49654L,49655L,49656L,49657L, 49658L,49659L,49660L,49661L,49662L,49663L,49664L,49665L,49666L,49667L, 49668L,49669L,49670L,49671L,49672L,49673L,49674L,49675L,49676L,49677L, 49678L,49679L,49680L,49681L,49682L,49683L,49684L,49685L,49686L,49687L, 49688L,49689L,49690L,49691L,49692L,49693L,49694L,49695L,49696L,49697L, 49698L,49699L,49700L,49701L,49702L,49703L,49704L,49705L,49706L,49707L, 49708L,49709L,49710L,49711L,49712L,49713L,49714L,49715L,49716L,49717L, 49718L,49719L,49720L,49721L,49722L,49723L,49724L,49725L,49726L,49727L, 49728L,49729L,49730L,49731L,49732L,49733L,49734L,49735L,49736L,49737L, 49738L,49739L,49740L,49741L,49742L,49743L,49744L,49745L,49746L,49747L, 49748L,49749L,49750L,49751L,49752L,49753L,49754L,49755L,49756L,49757L, 49758L,49759L,49760L,49761L,49762L,49763L,49764L,49765L,49766L,49767L, 49768L,49769L,49770L,49771L,49772L,49773L,49774L,49775L,49776L,49777L, 49778L,49779L,49780L,49781L,49782L,49783L,49784L,49785L,49786L,49787L, 49788L,49789L,49790L,49791L,49792L,49793L,49794L,49795L,49796L,49797L, 49798L,49799L,49800L,49801L,49802L,49803L,49804L,49805L,49806L,49807L, 49808L,49809L,49810L,49811L,49812L,49813L,49814L,49815L,49816L,49817L, 49818L,49819L,49820L,49821L,49822L,49823L,49824L,49825L,49826L,49827L, 49828L,49829L,49830L,49831L,49832L,49833L,49834L,49835L,49836L,49837L, 49838L,49839L,49840L,49841L,49842L,49843L,49844L,49845L,49846L,49847L, 49848L,49849L,49850L,49851L,49852L,49853L,49854L,49855L,49856L,49857L, 49858L,49859L,49860L,49861L,49862L,49863L,49864L,49865L,49866L,49867L, 49868L,49869L,49870L,49871L,49872L,49873L,49874L,49875L,49876L,49877L, 49878L,49879L,49880L,49881L,49882L,49883L,49884L,49885L,49886L,49887L, 49888L,49889L,49890L,49891L,49892L,49893L,49894L,49895L,49896L,49897L, 49898L,49899L,49900L,49901L,49902L,49903L,49904L,49905L,49906L,49907L, 49908L,49909L,49910L,49911L,49912L,49913L,49914L,49915L,49916L,49917L, 49918L,49919L,49920L,49921L,49922L,49923L,49924L,49925L,49926L,49927L, 49928L,49929L,49930L,49931L,49932L,49933L,49934L,49935L,49936L,49937L, 49938L,49939L,49940L,49941L,49942L,49943L,49944L,49945L,49946L,49947L, 49948L,49949L,49950L,49951L,49952L,49953L,49954L,49955L,49956L,49957L, 49958L,49959L,49960L,49961L,49962L,49963L,49964L,49965L,49966L,49967L, 49968L,49969L,49970L,49971L,49972L,49973L,49974L,49975L,49976L,49977L, 49978L,49979L,49980L,49981L,49982L,49983L,49984L,49985L,49986L,49987L, 49988L,49989L,49990L,49991L,49992L,49993L,49994L,49995L,49996L,49997L, 49998L,49999L,50000L,50001L,50002L,50003L,50004L,50005L,50006L,50007L, 50008L,50009L,50010L,50011L,50012L,50013L,50014L,50015L,50016L,50017L, 50018L,50019L,50020L,50021L,50022L,50023L,50024L,50025L,50026L,50027L, 50028L,50029L,50030L,50031L,50032L,50033L,50034L,50035L,50036L,50037L, 50038L,50039L,50040L,50041L,50042L,50043L,50044L,50045L,50046L,50047L, 50048L,50049L,50050L,50051L,50052L,50053L,50054L,50055L,50056L,50057L, 50058L,50059L,50060L,50061L,50062L,50063L,50064L,50065L,50066L,50067L, 50068L,50069L,50070L,50071L,50072L,50073L,50074L,50075L,50076L,50077L, 50078L,50079L,50080L,50081L,50082L,50083L,50084L,50085L,50086L,50087L, 50088L,50089L,50090L,50091L,50092L,50093L,50094L,50095L,50096L,50097L, 50098L,50099L,50100L,50101L,50102L,50103L,50104L,50105L,50106L,50107L, 50108L,50109L,50110L,50111L,50112L,50113L,50114L,50115L,50116L,50117L, 50118L,50119L,50120L,50121L,50122L,50123L,50124L,50125L,50126L,50127L, 50128L,50129L,50130L,50131L,50132L,50133L,50134L,50135L,50136L,50137L, 50138L,50139L,50140L,50141L,50142L,50143L,50144L,50145L,50146L,50147L, 50148L,50149L,50150L,50151L,50152L,50153L,50154L,50155L,50156L,50157L, 50158L,50159L,50160L,50161L,50162L,50163L,50164L,50165L,50166L,50167L, 50168L,50169L,50170L,50171L,50172L,50173L,50174L,50175L,50176L,50177L, 50178L,50179L,50180L,50181L,50182L,50183L,50184L,50185L,50186L,50187L, 50188L,50189L,50190L,50191L,50192L,50193L,50194L,50195L,50196L,50197L, 50198L,50199L,50200L,50201L,50202L,50203L,50204L,50205L,50206L,50207L, 50208L,50209L,50210L,50211L,50212L,50213L,50214L,50215L,50216L,50217L, 50218L,50219L,50220L,50221L,50222L,50223L,50224L,50225L,50226L,50227L, 50228L,50229L,50230L,50231L,50232L,50233L,50234L,50235L,50236L,50237L, 50238L,50239L,50240L,50241L,50242L,50243L,50244L,50245L,50246L,50247L, 50248L,50249L,50250L,50251L,50252L,50253L,50254L,50255L,50256L,50257L, 50258L,50259L,50260L,50261L,50262L,50263L,50264L,50265L,50266L,50267L, 50268L,50269L,50270L,50271L,50272L,50273L,50274L,50275L,50276L,50277L, 50278L,50279L,50280L,50281L,50282L,50283L,50284L,50285L,50286L,50287L, 50288L,50289L,50290L,50291L,50292L,50293L,50294L,50295L,50296L,50297L, 50298L,50299L,50300L,50301L,50302L,50303L,50304L,50305L,50306L,50307L, 50308L,50309L,50310L,50311L,50312L,50313L,50314L,50315L,50316L,50317L, 50318L,50319L,50320L,50321L,50322L,50323L,50324L,50325L,50326L,50327L, 50328L,50329L,50330L,50331L,50332L,50333L,50334L,50335L,50336L,50337L, 50338L,50339L,50340L,50341L,50342L,50343L,50344L,50345L,50346L,50347L, 50348L,50349L,50350L,50351L,50352L,50353L,50354L,50355L,50356L,50357L, 50358L,50359L,50360L,50361L,50362L,50363L,50364L,50365L,50366L,50367L, 50368L,50369L,50370L,50371L,50372L,50373L,50374L,50375L,50376L,50377L, 50378L,50379L,50380L,50381L,50382L,50383L,50384L,50385L,50386L,50387L, 50388L,50389L,50390L,50391L,50392L,50393L,50394L,50395L,50396L,50397L, 50398L,50399L,50400L,50401L,50402L,50403L,50404L,50405L,50406L,50407L, 50408L,50409L,50410L,50411L,50412L,50413L,50414L,50415L,50416L,50417L, 50418L,50419L,50420L,50421L,50422L,50423L,50424L,50425L,50426L,50427L, 50428L,50429L,50430L,50431L,50432L,50433L,50434L,50435L,50436L,50437L, 50438L,50439L,50440L,50441L,50442L,50443L,50444L,50445L,50446L,50447L, 50448L,50449L,50450L,50451L,50452L,50453L,50454L,50455L,50456L,50457L, 50458L,50459L,50460L,50461L,50462L,50463L,50464L,50465L,50466L,50467L, 50468L,50469L,50470L,50471L,50472L,50473L,50474L,50475L,50476L,50477L, 50478L,50479L,50480L,50481L,50482L,50483L,50484L,50485L,50486L,50487L, 50488L,50489L,50490L,50491L,50492L,50493L,50494L,50495L,50496L,50497L, 50498L,50499L,50500L,50501L,50502L,50503L,50504L,50505L,50506L,50507L, 50508L,50509L,50510L,50511L,50512L,50513L,50514L,50515L,50516L,50517L, 50518L,50519L,50520L,50521L,50522L,50523L,50524L,50525L,50526L,50527L, 50528L,50529L,50530L,50531L,50532L,50533L,50534L,50535L,50536L,50537L, 50538L,50539L,50540L,50541L,50542L,50543L,50544L,50545L,50546L,50547L, 50548L,50549L,50550L,50551L,50552L,50553L,50554L,50555L,50556L,50557L, 50558L,50559L,50560L,50561L,50562L,50563L,50564L,50565L,50566L,50567L, 50568L,50569L,50570L,50571L,50572L,50573L,50574L,50575L,50576L,50577L, 50578L,50579L,50580L,50581L,50582L,50583L,50584L,50585L,50586L,50587L, 50588L,50589L,50590L,50591L,50592L,50593L,50594L,50595L,50596L,50597L, 50598L,50599L,50600L,50601L,50602L,50603L,50604L,50605L,50606L,50607L, 50608L,50609L,50610L,50611L,50612L,50613L,50614L,50615L,50616L,50617L, 50618L,50619L,50620L,50621L,50622L,50623L,50624L,50625L,50626L,50627L, 50628L,50629L,50630L,50631L,50632L,50633L,50634L,50635L,50636L,50637L, 50638L,50639L,50640L,50641L,50642L,50643L,50644L,50645L,50646L,50647L, 50648L,50649L,50650L,50651L,50652L,50653L,50654L,50655L,50656L,50657L, 50658L,50659L,50660L,50661L,50662L,50663L,50664L,50665L,50666L,50667L, 50668L,50669L,50670L,50671L,50672L,50673L,50674L,50675L,50676L,50677L, 50678L,50679L,50680L,50681L,50682L,50683L,50684L,50685L,50686L,50687L, 50688L,50689L,50690L,50691L,50692L,50693L,50694L,50695L,50696L,50697L, 50698L,50699L,50700L,50701L,50702L,50703L,50704L,50705L,50706L,50707L, 50708L,50709L,50710L,50711L,50712L,50713L,50714L,50715L,50716L,50717L, 50718L,50719L,50720L,50721L,50722L,50723L,50724L,50725L,50726L,50727L, 50728L,50729L,50730L,50731L,50732L,50733L,50734L,50735L,50736L,50737L, 50738L,50739L,50740L,50741L,50742L,50743L,50744L,50745L,50746L,50747L, 50748L,50749L,50750L,50751L,50752L,50753L,50754L,50755L,50756L,50757L, 50758L,50759L,50760L,50761L,50762L,50763L,50764L,50765L,50766L,50767L, 50768L,50769L,50770L,50771L,50772L,50773L,50774L,50775L,50776L,50777L, 50778L,50779L,50780L,50781L,50782L,50783L,50784L,50785L,50786L,50787L, 50788L,50789L,50790L,50791L,50792L,50793L,50794L,50795L,50796L,50797L, 50798L,50799L,50800L,50801L,50802L,50803L,50804L,50805L,50806L,50807L, 50808L,50809L,50810L,50811L,50812L,50813L,50814L,50815L,50816L,50817L, 50818L,50819L,50820L,50821L,50822L,50823L,50824L,50825L,50826L,50827L, 50828L,50829L,50830L,50831L,50832L,50833L,50834L,50835L,50836L,50837L, 50838L,50839L,50840L,50841L,50842L,50843L,50844L,50845L,50846L,50847L, 50848L,50849L,50850L,50851L,50852L,50853L,50854L,50855L,50856L,50857L, 50858L,50859L,50860L,50861L,50862L,50863L,50864L,50865L,50866L,50867L, 50868L,50869L,50870L,50871L,50872L,50873L,50874L,50875L,50876L,50877L, 50878L,50879L,50880L,50881L,50882L,50883L,50884L,50885L,50886L,50887L, 50888L,50889L,50890L,50891L,50892L,50893L,50894L,50895L,50896L,50897L, 50898L,50899L,50900L,50901L,50902L,50903L,50904L,50905L,50906L,50907L, 50908L,50909L,50910L,50911L,50912L,50913L,50914L,50915L,50916L,50917L, 50918L,50919L,50920L,50921L,50922L,50923L,50924L,50925L,50926L,50927L, 50928L,50929L,50930L,50931L,50932L,50933L,50934L,50935L,50936L,50937L, 50938L,50939L,50940L,50941L,50942L,50943L,50944L,50945L,50946L,50947L, 50948L,50949L,50950L,50951L,50952L,50953L,50954L,50955L,50956L,50957L, 50958L,50959L,50960L,50961L,50962L,50963L,50964L,50965L,50966L,50967L, 50968L,50969L,50970L,50971L,50972L,50973L,50974L,50975L,50976L,50977L, 50978L,50979L,50980L,50981L,50982L,50983L,50984L,50985L,50986L,50987L, 50988L,50989L,50990L,50991L,50992L,50993L,50994L,50995L,50996L,50997L, 50998L,50999L,51000L,51001L,51002L,51003L,51004L,51005L,51006L,51007L, 51008L,51009L,51010L,51011L,51012L,51013L,51014L,51015L,51016L,51017L, 51018L,51019L,51020L,51021L,51022L,51023L,51024L,51025L,51026L,51027L, 51028L,51029L,51030L,51031L,51032L,51033L,51034L,51035L,51036L,51037L, 51038L,51039L,51040L,51041L,51042L,51043L,51044L,51045L,51046L,51047L, 51048L,51049L,51050L,51051L,51052L,51053L,51054L,51055L,51056L,51057L, 51058L,51059L,51060L,51061L,51062L,51063L,51064L,51065L,51066L,51067L, 51068L,51069L,51070L,51071L,51072L,51073L,51074L,51075L,51076L,51077L, 51078L,51079L,51080L,51081L,51082L,51083L,51084L,51085L,51086L,51087L, 51088L,51089L,51090L,51091L,51092L,51093L,51094L,51095L,51096L,51097L, 51098L,51099L,51100L,51101L,51102L,51103L,51104L,51105L,51106L,51107L, 51108L,51109L,51110L,51111L,51112L,51113L,51114L,51115L,51116L,51117L, 51118L,51119L,51120L,51121L,51122L,51123L,51124L,51125L,51126L,51127L, 51128L,51129L,51130L,51131L,51132L,51133L,51134L,51135L,51136L,51137L, 51138L,51139L,51140L,51141L,51142L,51143L,51144L,51145L,51146L,51147L, 51148L,51149L,51150L,51151L,51152L,51153L,51154L,51155L,51156L,51157L, 51158L,51159L,51160L,51161L,51162L,51163L,51164L,51165L,51166L,51167L, 51168L,51169L,51170L,51171L,51172L,51173L,51174L,51175L,51176L,51177L, 51178L,51179L,51180L,51181L,51182L,51183L,51184L,51185L,51186L,51187L, 51188L,51189L,51190L,51191L,51192L,51193L,51194L,51195L,51196L,51197L, 51198L,51199L,51200L,51201L,51202L,51203L,51204L,51205L,51206L,51207L, 51208L,51209L,51210L,51211L,51212L,51213L,51214L,51215L,51216L,51217L, 51218L,51219L,51220L,51221L,51222L,51223L,51224L,51225L,51226L,51227L, 51228L,51229L,51230L,51231L,51232L,51233L,51234L,51235L,51236L,51237L, 51238L,51239L,51240L,51241L,51242L,51243L,51244L,51245L,51246L,51247L, 51248L,51249L,51250L,51251L,51252L,51253L,51254L,51255L,51256L,51257L, 51258L,51259L,51260L,51261L,51262L,51263L,51264L,51265L,51266L,51267L, 51268L,51269L,51270L,51271L,51272L,51273L,51274L,51275L,51276L,51277L, 51278L,51279L,51280L,51281L,51282L,51283L,51284L,51285L,51286L,51287L, 51288L,51289L,51290L,51291L,51292L,51293L,51294L,51295L,51296L,51297L, 51298L,51299L,51300L,51301L,51302L,51303L,51304L,51305L,51306L,51307L, 51308L,51309L,51310L,51311L,51312L,51313L,51314L,51315L,51316L,51317L, 51318L,51319L,51320L,51321L,51322L,51323L,51324L,51325L,51326L,51327L, 51328L,51329L,51330L,51331L,51332L,51333L,51334L,51335L,51336L,51337L, 51338L,51339L,51340L,51341L,51342L,51343L,51344L,51345L,51346L,51347L, 51348L,51349L,51350L,51351L,51352L,51353L,51354L,51355L,51356L,51357L, 51358L,51359L,51360L,51361L,51362L,51363L,51364L,51365L,51366L,51367L, 51368L,51369L,51370L,51371L,51372L,51373L,51374L,51375L,51376L,51377L, 51378L,51379L,51380L,51381L,51382L,51383L,51384L,51385L,51386L,51387L, 51388L,51389L,51390L,51391L,51392L,51393L,51394L,51395L,51396L,51397L, 51398L,51399L,51400L,51401L,51402L,51403L,51404L,51405L,51406L,51407L, 51408L,51409L,51410L,51411L,51412L,51413L,51414L,51415L,51416L,51417L, 51418L,51419L,51420L,51421L,51422L,51423L,51424L,51425L,51426L,51427L, 51428L,51429L,51430L,51431L,51432L,51433L,51434L,51435L,51436L,51437L, 51438L,51439L,51440L,51441L,51442L,51443L,51444L,51445L,51446L,51447L, 51448L,51449L,51450L,51451L,51452L,51453L,51454L,51455L,51456L,51457L, 51458L,51459L,51460L,51461L,51462L,51463L,51464L,51465L,51466L,51467L, 51468L,51469L,51470L,51471L,51472L,51473L,51474L,51475L,51476L,51477L, 51478L,51479L,51480L,51481L,51482L,51483L,51484L,51485L,51486L,51487L, 51488L,51489L,51490L,51491L,51492L,51493L,51494L,51495L,51496L,51497L, 51498L,51499L,51500L,51501L,51502L,51503L,51504L,51505L,51506L,51507L, 51508L,51509L,51510L,51511L,51512L,51513L,51514L,51515L,51516L,51517L, 51518L,51519L,51520L,51521L,51522L,51523L,51524L,51525L,51526L,51527L, 51528L,51529L,51530L,51531L,51532L,51533L,51534L,51535L,51536L,51537L, 51538L,51539L,51540L,51541L,51542L,51543L,51544L,51545L,51546L,51547L, 51548L,51549L,51550L,51551L,51552L,51553L,51554L,51555L,51556L,51557L, 51558L,51559L,51560L,51561L,51562L,51563L,51564L,51565L,51566L,51567L, 51568L,51569L,51570L,51571L,51572L,51573L,51574L,51575L,51576L,51577L, 51578L,51579L,51580L,51581L,51582L,51583L,51584L,51585L,51586L,51587L, 51588L,51589L,51590L,51591L,51592L,51593L,51594L,51595L,51596L,51597L, 51598L,51599L,51600L,51601L,51602L,51603L,51604L,51605L,51606L,51607L, 51608L,51609L,51610L,51611L,51612L,51613L,51614L,51615L,51616L,51617L, 51618L,51619L,51620L,51621L,51622L,51623L,51624L,51625L,51626L,51627L, 51628L,51629L,51630L,51631L,51632L,51633L,51634L,51635L,51636L,51637L, 51638L,51639L,51640L,51641L,51642L,51643L,51644L,51645L,51646L,51647L, 51648L,51649L,51650L,51651L,51652L,51653L,51654L,51655L,51656L,51657L, 51658L,51659L,51660L,51661L,51662L,51663L,51664L,51665L,51666L,51667L, 51668L,51669L,51670L,51671L,51672L,51673L,51674L,51675L,51676L,51677L, 51678L,51679L,51680L,51681L,51682L,51683L,51684L,51685L,51686L,51687L, 51688L,51689L,51690L,51691L,51692L,51693L,51694L,51695L,51696L,51697L, 51698L,51699L,51700L,51701L,51702L,51703L,51704L,51705L,51706L,51707L, 51708L,51709L,51710L,51711L,51712L,51713L,51714L,51715L,51716L,51717L, 51718L,51719L,51720L,51721L,51722L,51723L,51724L,51725L,51726L,51727L, 51728L,51729L,51730L,51731L,51732L,51733L,51734L,51735L,51736L,51737L, 51738L,51739L,51740L,51741L,51742L,51743L,51744L,51745L,51746L,51747L, 51748L,51749L,51750L,51751L,51752L,51753L,51754L,51755L,51756L,51757L, 51758L,51759L,51760L,51761L,51762L,51763L,51764L,51765L,51766L,51767L, 51768L,51769L,51770L,51771L,51772L,51773L,51774L,51775L,51776L,51777L, 51778L,51779L,51780L,51781L,51782L,51783L,51784L,51785L,51786L,51787L, 51788L,51789L,51790L,51791L,51792L,51793L,51794L,51795L,51796L,51797L, 51798L,51799L,51800L,51801L,51802L,51803L,51804L,51805L,51806L,51807L, 51808L,51809L,51810L,51811L,51812L,51813L,51814L,51815L,51816L,51817L, 51818L,51819L,51820L,51821L,51822L,51823L,51824L,51825L,51826L,51827L, 51828L,51829L,51830L,51831L,51832L,51833L,51834L,51835L,51836L,51837L, 51838L,51839L,51840L,51841L,51842L,51843L,51844L,51845L,51846L,51847L, 51848L,51849L,51850L,51851L,51852L,51853L,51854L,51855L,51856L,51857L, 51858L,51859L,51860L,51861L,51862L,51863L,51864L,51865L,51866L,51867L, 51868L,51869L,51870L,51871L,51872L,51873L,51874L,51875L,51876L,51877L, 51878L,51879L,51880L,51881L,51882L,51883L,51884L,51885L,51886L,51887L, 51888L,51889L,51890L,51891L,51892L,51893L,51894L,51895L,51896L,51897L, 51898L,51899L,51900L,51901L,51902L,51903L,51904L,51905L,51906L,51907L, 51908L,51909L,51910L,51911L,51912L,51913L,51914L,51915L,51916L,51917L, 51918L,51919L,51920L,51921L,51922L,51923L,51924L,51925L,51926L,51927L, 51928L,51929L,51930L,51931L,51932L,51933L,51934L,51935L,51936L,51937L, 51938L,51939L,51940L,51941L,51942L,51943L,51944L,51945L,51946L,51947L, 51948L,51949L,51950L,51951L,51952L,51953L,51954L,51955L,51956L,51957L, 51958L,51959L,51960L,51961L,51962L,51963L,51964L,51965L,51966L,51967L, 51968L,51969L,51970L,51971L,51972L,51973L,51974L,51975L,51976L,51977L, 51978L,51979L,51980L,51981L,51982L,51983L,51984L,51985L,51986L,51987L, 51988L,51989L,51990L,51991L,51992L,51993L,51994L,51995L,51996L,51997L, 51998L,51999L,52000L,52001L,52002L,52003L,52004L,52005L,52006L,52007L, 52008L,52009L,52010L,52011L,52012L,52013L,52014L,52015L,52016L,52017L, 52018L,52019L,52020L,52021L,52022L,52023L,52024L,52025L,52026L,52027L, 52028L,52029L,52030L,52031L,52032L,52033L,52034L,52035L,52036L,52037L, 52038L,52039L,52040L,52041L,52042L,52043L,52044L,52045L,52046L,52047L, 52048L,52049L,52050L,52051L,52052L,52053L,52054L,52055L,52056L,52057L, 52058L,52059L,52060L,52061L,52062L,52063L,52064L,52065L,52066L,52067L, 52068L,52069L,52070L,52071L,52072L,52073L,52074L,52075L,52076L,52077L, 52078L,52079L,52080L,52081L,52082L,52083L,52084L,52085L,52086L,52087L, 52088L,52089L,52090L,52091L,52092L,52093L,52094L,52095L,52096L,52097L, 52098L,52099L,52100L,52101L,52102L,52103L,52104L,52105L,52106L,52107L, 52108L,52109L,52110L,52111L,52112L,52113L,52114L,52115L,52116L,52117L, 52118L,52119L,52120L,52121L,52122L,52123L,52124L,52125L,52126L,52127L, 52128L,52129L,52130L,52131L,52132L,52133L,52134L,52135L,52136L,52137L, 52138L,52139L,52140L,52141L,52142L,52143L,52144L,52145L,52146L,52147L, 52148L,52149L,52150L,52151L,52152L,52153L,52154L,52155L,52156L,52157L, 52158L,52159L,52160L,52161L,52162L,52163L,52164L,52165L,52166L,52167L, 52168L,52169L,52170L,52171L,52172L,52173L,52174L,52175L,52176L,52177L, 52178L,52179L,52180L,52181L,52182L,52183L,52184L,52185L,52186L,52187L, 52188L,52189L,52190L,52191L,52192L,52193L,52194L,52195L,52196L,52197L, 52198L,52199L,52200L,52201L,52202L,52203L,52204L,52205L,52206L,52207L, 52208L,52209L,52210L,52211L,52212L,52213L,52214L,52215L,52216L,52217L, 52218L,52219L,52220L,52221L,52222L,52223L,52224L,52225L,52226L,52227L, 52228L,52229L,52230L,52231L,52232L,52233L,52234L,52235L,52236L,52237L, 52238L,52239L,52240L,52241L,52242L,52243L,52244L,52245L,52246L,52247L, 52248L,52249L,52250L,52251L,52252L,52253L,52254L,52255L,52256L,52257L, 52258L,52259L,52260L,52261L,52262L,52263L,52264L,52265L,52266L,52267L, 52268L,52269L,52270L,52271L,52272L,52273L,52274L,52275L,52276L,52277L, 52278L,52279L,52280L,52281L,52282L,52283L,52284L,52285L,52286L,52287L, 52288L,52289L,52290L,52291L,52292L,52293L,52294L,52295L,52296L,52297L, 52298L,52299L,52300L,52301L,52302L,52303L,52304L,52305L,52306L,52307L, 52308L,52309L,52310L,52311L,52312L,52313L,52314L,52315L,52316L,52317L, 52318L,52319L,52320L,52321L,52322L,52323L,52324L,52325L,52326L,52327L, 52328L,52329L,52330L,52331L,52332L,52333L,52334L,52335L,52336L,52337L, 52338L,52339L,52340L,52341L,52342L,52343L,52344L,52345L,52346L,52347L, 52348L,52349L,52350L,52351L,52352L,52353L,52354L,52355L,52356L,52357L, 52358L,52359L,52360L,52361L,52362L,52363L,52364L,52365L,52366L,52367L, 52368L,52369L,52370L,52371L,52372L,52373L,52374L,52375L,52376L,52377L, 52378L,52379L,52380L,52381L,52382L,52383L,52384L,52385L,52386L,52387L, 52388L,52389L,52390L,52391L,52392L,52393L,52394L,52395L,52396L,52397L, 52398L,52399L,52400L,52401L,52402L,52403L,52404L,52405L,52406L,52407L, 52408L,52409L,52410L,52411L,52412L,52413L,52414L,52415L,52416L,52417L, 52418L,52419L,52420L,52421L,52422L,52423L,52424L,52425L,52426L,52427L, 52428L,52429L,52430L,52431L,52432L,52433L,52434L,52435L,52436L,52437L, 52438L,52439L,52440L,52441L,52442L,52443L,52444L,52445L,52446L,52447L, 52448L,52449L,52450L,52451L,52452L,52453L,52454L,52455L,52456L,52457L, 52458L,52459L,52460L,52461L,52462L,52463L,52464L,52465L,52466L,52467L, 52468L,52469L,52470L,52471L,52472L,52473L,52474L,52475L,52476L,52477L, 52478L,52479L,52480L,52481L,52482L,52483L,52484L,52485L,52486L,52487L, 52488L,52489L,52490L,52491L,52492L,52493L,52494L,52495L,52496L,52497L, 52498L,52499L,52500L,52501L,52502L,52503L,52504L,52505L,52506L,52507L, 52508L,52509L,52510L,52511L,52512L,52513L,52514L,52515L,52516L,52517L, 52518L,52519L,52520L,52521L,52522L,52523L,52524L,52525L,52526L,52527L, 52528L,52529L,52530L,52531L,52532L,52533L,52534L,52535L,52536L,52537L, 52538L,52539L,52540L,52541L,52542L,52543L,52544L,52545L,52546L,52547L, 52548L,52549L,52550L,52551L,52552L,52553L,52554L,52555L,52556L,52557L, 52558L,52559L,52560L,52561L,52562L,52563L,52564L,52565L,52566L,52567L, 52568L,52569L,52570L,52571L,52572L,52573L,52574L,52575L,52576L,52577L, 52578L,52579L,52580L,52581L,52582L,52583L,52584L,52585L,52586L,52587L, 52588L,52589L,52590L,52591L,52592L,52593L,52594L,52595L,52596L,52597L, 52598L,52599L,52600L,52601L,52602L,52603L,52604L,52605L,52606L,52607L, 52608L,52609L,52610L,52611L,52612L,52613L,52614L,52615L,52616L,52617L, 52618L,52619L,52620L,52621L,52622L,52623L,52624L,52625L,52626L,52627L, 52628L,52629L,52630L,52631L,52632L,52633L,52634L,52635L,52636L,52637L, 52638L,52639L,52640L,52641L,52642L,52643L,52644L,52645L,52646L,52647L, 52648L,52649L,52650L,52651L,52652L,52653L,52654L,52655L,52656L,52657L, 52658L,52659L,52660L,52661L,52662L,52663L,52664L,52665L,52666L,52667L, 52668L,52669L,52670L,52671L,52672L,52673L,52674L,52675L,52676L,52677L, 52678L,52679L,52680L,52681L,52682L,52683L,52684L,52685L,52686L,52687L, 52688L,52689L,52690L,52691L,52692L,52693L,52694L,52695L,52696L,52697L, 52698L,52699L,52700L,52701L,52702L,52703L,52704L,52705L,52706L,52707L, 52708L,52709L,52710L,52711L,52712L,52713L,52714L,52715L,52716L,52717L, 52718L,52719L,52720L,52721L,52722L,52723L,52724L,52725L,52726L,52727L, 52728L,52729L,52730L,52731L,52732L,52733L,52734L,52735L,52736L,52737L, 52738L,52739L,52740L,52741L,52742L,52743L,52744L,52745L,52746L,52747L, 52748L,52749L,52750L,52751L,52752L,52753L,52754L,52755L,52756L,52757L, 52758L,52759L,52760L,52761L,52762L,52763L,52764L,52765L,52766L,52767L, 52768L,52769L,52770L,52771L,52772L,52773L,52774L,52775L,52776L,52777L, 52778L,52779L,52780L,52781L,52782L,52783L,52784L,52785L,52786L,52787L, 52788L,52789L,52790L,52791L,52792L,52793L,52794L,52795L,52796L,52797L, 52798L,52799L,52800L,52801L,52802L,52803L,52804L,52805L,52806L,52807L, 52808L,52809L,52810L,52811L,52812L,52813L,52814L,52815L,52816L,52817L, 52818L,52819L,52820L,52821L,52822L,52823L,52824L,52825L,52826L,52827L, 52828L,52829L,52830L,52831L,52832L,52833L,52834L,52835L,52836L,52837L, 52838L,52839L,52840L,52841L,52842L,52843L,52844L,52845L,52846L,52847L, 52848L,52849L,52850L,52851L,52852L,52853L,52854L,52855L,52856L,52857L, 52858L,52859L,52860L,52861L,52862L,52863L,52864L,52865L,52866L,52867L, 52868L,52869L,52870L,52871L,52872L,52873L,52874L,52875L,52876L,52877L, 52878L,52879L,52880L,52881L,52882L,52883L,52884L,52885L,52886L,52887L, 52888L,52889L,52890L,52891L,52892L,52893L,52894L,52895L,52896L,52897L, 52898L,52899L,52900L,52901L,52902L,52903L,52904L,52905L,52906L,52907L, 52908L,52909L,52910L,52911L,52912L,52913L,52914L,52915L,52916L,52917L, 52918L,52919L,52920L,52921L,52922L,52923L,52924L,52925L,52926L,52927L, 52928L,52929L,52930L,52931L,52932L,52933L,52934L,52935L,52936L,52937L, 52938L,52939L,52940L,52941L,52942L,52943L,52944L,52945L,52946L,52947L, 52948L,52949L,52950L,52951L,52952L,52953L,52954L,52955L,52956L,52957L, 52958L,52959L,52960L,52961L,52962L,52963L,52964L,52965L,52966L,52967L, 52968L,52969L,52970L,52971L,52972L,52973L,52974L,52975L,52976L,52977L, 52978L,52979L,52980L,52981L,52982L,52983L,52984L,52985L,52986L,52987L, 52988L,52989L,52990L,52991L,52992L,52993L,52994L,52995L,52996L,52997L, 52998L,52999L,53000L,53001L,53002L,53003L,53004L,53005L,53006L,53007L, 53008L,53009L,53010L,53011L,53012L,53013L,53014L,53015L,53016L,53017L, 53018L,53019L,53020L,53021L,53022L,53023L,53024L,53025L,53026L,53027L, 53028L,53029L,53030L,53031L,53032L,53033L,53034L,53035L,53036L,53037L, 53038L,53039L,53040L,53041L,53042L,53043L,53044L,53045L,53046L,53047L, 53048L,53049L,53050L,53051L,53052L,53053L,53054L,53055L,53056L,53057L, 53058L,53059L,53060L,53061L,53062L,53063L,53064L,53065L,53066L,53067L, 53068L,53069L,53070L,53071L,53072L,53073L,53074L,53075L,53076L,53077L, 53078L,53079L,53080L,53081L,53082L,53083L,53084L,53085L,53086L,53087L, 53088L,53089L,53090L,53091L,53092L,53093L,53094L,53095L,53096L,53097L, 53098L,53099L,53100L,53101L,53102L,53103L,53104L,53105L,53106L,53107L, 53108L,53109L,53110L,53111L,53112L,53113L,53114L,53115L,53116L,53117L, 53118L,53119L,53120L,53121L,53122L,53123L,53124L,53125L,53126L,53127L, 53128L,53129L,53130L,53131L,53132L,53133L,53134L,53135L,53136L,53137L, 53138L,53139L,53140L,53141L,53142L,53143L,53144L,53145L,53146L,53147L, 53148L,53149L,53150L,53151L,53152L,53153L,53154L,53155L,53156L,53157L, 53158L,53159L,53160L,53161L,53162L,53163L,53164L,53165L,53166L,53167L, 53168L,53169L,53170L,53171L,53172L,53173L,53174L,53175L,53176L,53177L, 53178L,53179L,53180L,53181L,53182L,53183L,53184L,53185L,53186L,53187L, 53188L,53189L,53190L,53191L,53192L,53193L,53194L,53195L,53196L,53197L, 53198L,53199L,53200L,53201L,53202L,53203L,53204L,53205L,53206L,53207L, 53208L,53209L,53210L,53211L,53212L,53213L,53214L,53215L,53216L,53217L, 53218L,53219L,53220L,53221L,53222L,53223L,53224L,53225L,53226L,53227L, 53228L,53229L,53230L,53231L,53232L,53233L,53234L,53235L,53236L,53237L, 53238L,53239L,53240L,53241L,53242L,53243L,53244L,53245L,53246L,53247L, 53248L,53249L,53250L,53251L,53252L,53253L,53254L,53255L,53256L,53257L, 53258L,53259L,53260L,53261L,53262L,53263L,53264L,53265L,53266L,53267L, 53268L,53269L,53270L,53271L,53272L,53273L,53274L,53275L,53276L,53277L, 53278L,53279L,53280L,53281L,53282L,53283L,53284L,53285L,53286L,53287L, 53288L,53289L,53290L,53291L,53292L,53293L,53294L,53295L,53296L,53297L, 53298L,53299L,53300L,53301L,53302L,53303L,53304L,53305L,53306L,53307L, 53308L,53309L,53310L,53311L,53312L,53313L,53314L,53315L,53316L,53317L, 53318L,53319L,53320L,53321L,53322L,53323L,53324L,53325L,53326L,53327L, 53328L,53329L,53330L,53331L,53332L,53333L,53334L,53335L,53336L,53337L, 53338L,53339L,53340L,53341L,53342L,53343L,53344L,53345L,53346L,53347L, 53348L,53349L,53350L,53351L,53352L,53353L,53354L,53355L,53356L,53357L, 53358L,53359L,53360L,53361L,53362L,53363L,53364L,53365L,53366L,53367L, 53368L,53369L,53370L,53371L,53372L,53373L,53374L,53375L,53376L,53377L, 53378L,53379L,53380L,53381L,53382L,53383L,53384L,53385L,53386L,53387L, 53388L,53389L,53390L,53391L,53392L,53393L,53394L,53395L,53396L,53397L, 53398L,53399L,53400L,53401L,53402L,53403L,53404L,53405L,53406L,53407L, 53408L,53409L,53410L,53411L,53412L,53413L,53414L,53415L,53416L,53417L, 53418L,53419L,53420L,53421L,53422L,53423L,53424L,53425L,53426L,53427L, 53428L,53429L,53430L,53431L,53432L,53433L,53434L,53435L,53436L,53437L, 53438L,53439L,53440L,53441L,53442L,53443L,53444L,53445L,53446L,53447L, 53448L,53449L,53450L,53451L,53452L,53453L,53454L,53455L,53456L,53457L, 53458L,53459L,53460L,53461L,53462L,53463L,53464L,53465L,53466L,53467L, 53468L,53469L,53470L,53471L,53472L,53473L,53474L,53475L,53476L,53477L, 53478L,53479L,53480L,53481L,53482L,53483L,53484L,53485L,53486L,53487L, 53488L,53489L,53490L,53491L,53492L,53493L,53494L,53495L,53496L,53497L, 53498L,53499L,53500L,53501L,53502L,53503L,53504L,53505L,53506L,53507L, 53508L,53509L,53510L,53511L,53512L,53513L,53514L,53515L,53516L,53517L, 53518L,53519L,53520L,53521L,53522L,53523L,53524L,53525L,53526L,53527L, 53528L,53529L,53530L,53531L,53532L,53533L,53534L,53535L,53536L,53537L, 53538L,53539L,53540L,53541L,53542L,53543L,53544L,53545L,53546L,53547L, 53548L,53549L,53550L,53551L,53552L,53553L,53554L,53555L,53556L,53557L, 53558L,53559L,53560L,53561L,53562L,53563L,53564L,53565L,53566L,53567L, 53568L,53569L,53570L,53571L,53572L,53573L,53574L,53575L,53576L,53577L, 53578L,53579L,53580L,53581L,53582L,53583L,53584L,53585L,53586L,53587L, 53588L,53589L,53590L,53591L,53592L,53593L,53594L,53595L,53596L,53597L, 53598L,53599L,53600L,53601L,53602L,53603L,53604L,53605L,53606L,53607L, 53608L,53609L,53610L,53611L,53612L,53613L,53614L,53615L,53616L,53617L, 53618L,53619L,53620L,53621L,53622L,53623L,53624L,53625L,53626L,53627L, 53628L,53629L,53630L,53631L,53632L,53633L,53634L,53635L,53636L,53637L, 53638L,53639L,53640L,53641L,53642L,53643L,53644L,53645L,53646L,53647L, 53648L,53649L,53650L,53651L,53652L,53653L,53654L,53655L,53656L,53657L, 53658L,53659L,53660L,53661L,53662L,53663L,53664L,53665L,53666L,53667L, 53668L,53669L,53670L,53671L,53672L,53673L,53674L,53675L,53676L,53677L, 53678L,53679L,53680L,53681L,53682L,53683L,53684L,53685L,53686L,53687L, 53688L,53689L,53690L,53691L,53692L,53693L,53694L,53695L,53696L,53697L, 53698L,53699L,53700L,53701L,53702L,53703L,53704L,53705L,53706L,53707L, 53708L,53709L,53710L,53711L,53712L,53713L,53714L,53715L,53716L,53717L, 53718L,53719L,53720L,53721L,53722L,53723L,53724L,53725L,53726L,53727L, 53728L,53729L,53730L,53731L,53732L,53733L,53734L,53735L,53736L,53737L, 53738L,53739L,53740L,53741L,53742L,53743L,53744L,53745L,53746L,53747L, 53748L,53749L,53750L,53751L,53752L,53753L,53754L,53755L,53756L,53757L, 53758L,53759L,53760L,53761L,53762L,53763L,53764L,53765L,53766L,53767L, 53768L,53769L,53770L,53771L,53772L,53773L,53774L,53775L,53776L,53777L, 53778L,53779L,53780L,53781L,53782L,53783L,53784L,53785L,53786L,53787L, 53788L,53789L,53790L,53791L,53792L,53793L,53794L,53795L,53796L,53797L, 53798L,53799L,53800L,53801L,53802L,53803L,53804L,53805L,53806L,53807L, 53808L,53809L,53810L,53811L,53812L,53813L,53814L,53815L,53816L,53817L, 53818L,53819L,53820L,53821L,53822L,53823L,53824L,53825L,53826L,53827L, 53828L,53829L,53830L,53831L,53832L,53833L,53834L,53835L,53836L,53837L, 53838L,53839L,53840L,53841L,53842L,53843L,53844L,53845L,53846L,53847L, 53848L,53849L,53850L,53851L,53852L,53853L,53854L,53855L,53856L,53857L, 53858L,53859L,53860L,53861L,53862L,53863L,53864L,53865L,53866L,53867L, 53868L,53869L,53870L,53871L,53872L,53873L,53874L,53875L,53876L,53877L, 53878L,53879L,53880L,53881L,53882L,53883L,53884L,53885L,53886L,53887L, 53888L,53889L,53890L,53891L,53892L,53893L,53894L,53895L,53896L,53897L, 53898L,53899L,53900L,53901L,53902L,53903L,53904L,53905L,53906L,53907L, 53908L,53909L,53910L,53911L,53912L,53913L,53914L,53915L,53916L,53917L, 53918L,53919L,53920L,53921L,53922L,53923L,53924L,53925L,53926L,53927L, 53928L,53929L,53930L,53931L,53932L,53933L,53934L,53935L,53936L,53937L, 53938L,53939L,53940L,53941L,53942L,53943L,53944L,53945L,53946L,53947L, 53948L,53949L,53950L,53951L,53952L,53953L,53954L,53955L,53956L,53957L, 53958L,53959L,53960L,53961L,53962L,53963L,53964L,53965L,53966L,53967L, 53968L,53969L,53970L,53971L,53972L,53973L,53974L,53975L,53976L,53977L, 53978L,53979L,53980L,53981L,53982L,53983L,53984L,53985L,53986L,53987L, 53988L,53989L,53990L,53991L,53992L,53993L,53994L,53995L,53996L,53997L, 53998L,53999L,54000L,54001L,54002L,54003L,54004L,54005L,54006L,54007L, 54008L,54009L,54010L,54011L,54012L,54013L,54014L,54015L,54016L,54017L, 54018L,54019L,54020L,54021L,54022L,54023L,54024L,54025L,54026L,54027L, 54028L,54029L,54030L,54031L,54032L,54033L,54034L,54035L,54036L,54037L, 54038L,54039L,54040L,54041L,54042L,54043L,54044L,54045L,54046L,54047L, 54048L,54049L,54050L,54051L,54052L,54053L,54054L,54055L,54056L,54057L, 54058L,54059L,54060L,54061L,54062L,54063L,54064L,54065L,54066L,54067L, 54068L,54069L,54070L,54071L,54072L,54073L,54074L,54075L,54076L,54077L, 54078L,54079L,54080L,54081L,54082L,54083L,54084L,54085L,54086L,54087L, 54088L,54089L,54090L,54091L,54092L,54093L,54094L,54095L,54096L,54097L, 54098L,54099L,54100L,54101L,54102L,54103L,54104L,54105L,54106L,54107L, 54108L,54109L,54110L,54111L,54112L,54113L,54114L,54115L,54116L,54117L, 54118L,54119L,54120L,54121L,54122L,54123L,54124L,54125L,54126L,54127L, 54128L,54129L,54130L,54131L,54132L,54133L,54134L,54135L,54136L,54137L, 54138L,54139L,54140L,54141L,54142L,54143L,54144L,54145L,54146L,54147L, 54148L,54149L,54150L,54151L,54152L,54153L,54154L,54155L,54156L,54157L, 54158L,54159L,54160L,54161L,54162L,54163L,54164L,54165L,54166L,54167L, 54168L,54169L,54170L,54171L,54172L,54173L,54174L,54175L,54176L,54177L, 54178L,54179L,54180L,54181L,54182L,54183L,54184L,54185L,54186L,54187L, 54188L,54189L,54190L,54191L,54192L,54193L,54194L,54195L,54196L,54197L, 54198L,54199L,54200L,54201L,54202L,54203L,54204L,54205L,54206L,54207L, 54208L,54209L,54210L,54211L,54212L,54213L,54214L,54215L,54216L,54217L, 54218L,54219L,54220L,54221L,54222L,54223L,54224L,54225L,54226L,54227L, 54228L,54229L,54230L,54231L,54232L,54233L,54234L,54235L,54236L,54237L, 54238L,54239L,54240L,54241L,54242L,54243L,54244L,54245L,54246L,54247L, 54248L,54249L,54250L,54251L,54252L,54253L,54254L,54255L,54256L,54257L, 54258L,54259L,54260L,54261L,54262L,54263L,54264L,54265L,54266L,54267L, 54268L,54269L,54270L,54271L,54272L,54273L,54274L,54275L,54276L,54277L, 54278L,54279L,54280L,54281L,54282L,54283L,54284L,54285L,54286L,54287L, 54288L,54289L,54290L,54291L,54292L,54293L,54294L,54295L,54296L,54297L, 54298L,54299L,54300L,54301L,54302L,54303L,54304L,54305L,54306L,54307L, 54308L,54309L,54310L,54311L,54312L,54313L,54314L,54315L,54316L,54317L, 54318L,54319L,54320L,54321L,54322L,54323L,54324L,54325L,54326L,54327L, 54328L,54329L,54330L,54331L,54332L,54333L,54334L,54335L,54336L,54337L, 54338L,54339L,54340L,54341L,54342L,54343L,54344L,54345L,54346L,54347L, 54348L,54349L,54350L,54351L,54352L,54353L,54354L,54355L,54356L,54357L, 54358L,54359L,54360L,54361L,54362L,54363L,54364L,54365L,54366L,54367L, 54368L,54369L,54370L,54371L,54372L,54373L,54374L,54375L,54376L,54377L, 54378L,54379L,54380L,54381L,54382L,54383L,54384L,54385L,54386L,54387L, 54388L,54389L,54390L,54391L,54392L,54393L,54394L,54395L,54396L,54397L, 54398L,54399L,54400L,54401L,54402L,54403L,54404L,54405L,54406L,54407L, 54408L,54409L,54410L,54411L,54412L,54413L,54414L,54415L,54416L,54417L, 54418L,54419L,54420L,54421L,54422L,54423L,54424L,54425L,54426L,54427L, 54428L,54429L,54430L,54431L,54432L,54433L,54434L,54435L,54436L,54437L, 54438L,54439L,54440L,54441L,54442L,54443L,54444L,54445L,54446L,54447L, 54448L,54449L,54450L,54451L,54452L,54453L,54454L,54455L,54456L,54457L, 54458L,54459L,54460L,54461L,54462L,54463L,54464L,54465L,54466L,54467L, 54468L,54469L,54470L,54471L,54472L,54473L,54474L,54475L,54476L,54477L, 54478L,54479L,54480L,54481L,54482L,54483L,54484L,54485L,54486L,54487L, 54488L,54489L,54490L,54491L,54492L,54493L,54494L,54495L,54496L,54497L, 54498L,54499L,54500L,54501L,54502L,54503L,54504L,54505L,54506L,54507L, 54508L,54509L,54510L,54511L,54512L,54513L,54514L,54515L,54516L,54517L, 54518L,54519L,54520L,54521L,54522L,54523L,54524L,54525L,54526L,54527L, 54528L,54529L,54530L,54531L,54532L,54533L,54534L,54535L,54536L,54537L, 54538L,54539L,54540L,54541L,54542L,54543L,54544L,54545L,54546L,54547L, 54548L,54549L,54550L,54551L,54552L,54553L,54554L,54555L,54556L,54557L, 54558L,54559L,54560L,54561L,54562L,54563L,54564L,54565L,54566L,54567L, 54568L,54569L,54570L,54571L,54572L,54573L,54574L,54575L,54576L,54577L, 54578L,54579L,54580L,54581L,54582L,54583L,54584L,54585L,54586L,54587L, 54588L,54589L,54590L,54591L,54592L,54593L,54594L,54595L,54596L,54597L, 54598L,54599L,54600L,54601L,54602L,54603L,54604L,54605L,54606L,54607L, 54608L,54609L,54610L,54611L,54612L,54613L,54614L,54615L,54616L,54617L, 54618L,54619L,54620L,54621L,54622L,54623L,54624L,54625L,54626L,54627L, 54628L,54629L,54630L,54631L,54632L,54633L,54634L,54635L,54636L,54637L, 54638L,54639L,54640L,54641L,54642L,54643L,54644L,54645L,54646L,54647L, 54648L,54649L,54650L,54651L,54652L,54653L,54654L,54655L,54656L,54657L, 54658L,54659L,54660L,54661L,54662L,54663L,54664L,54665L,54666L,54667L, 54668L,54669L,54670L,54671L,54672L,54673L,54674L,54675L,54676L,54677L, 54678L,54679L,54680L,54681L,54682L,54683L,54684L,54685L,54686L,54687L, 54688L,54689L,54690L,54691L,54692L,54693L,54694L,54695L,54696L,54697L, 54698L,54699L,54700L,54701L,54702L,54703L,54704L,54705L,54706L,54707L, 54708L,54709L,54710L,54711L,54712L,54713L,54714L,54715L,54716L,54717L, 54718L,54719L,54720L,54721L,54722L,54723L,54724L,54725L,54726L,54727L, 54728L,54729L,54730L,54731L,54732L,54733L,54734L,54735L,54736L,54737L, 54738L,54739L,54740L,54741L,54742L,54743L,54744L,54745L,54746L,54747L, 54748L,54749L,54750L,54751L,54752L,54753L,54754L,54755L,54756L,54757L, 54758L,54759L,54760L,54761L,54762L,54763L,54764L,54765L,54766L,54767L, 54768L,54769L,54770L,54771L,54772L,54773L,54774L,54775L,54776L,54777L, 54778L,54779L,54780L,54781L,54782L,54783L,54784L,54785L,54786L,54787L, 54788L,54789L,54790L,54791L,54792L,54793L,54794L,54795L,54796L,54797L, 54798L,54799L,54800L,54801L,54802L,54803L,54804L,54805L,54806L,54807L, 54808L,54809L,54810L,54811L,54812L,54813L,54814L,54815L,54816L,54817L, 54818L,54819L,54820L,54821L,54822L,54823L,54824L,54825L,54826L,54827L, 54828L,54829L,54830L,54831L,54832L,54833L,54834L,54835L,54836L,54837L, 54838L,54839L,54840L,54841L,54842L,54843L,54844L,54845L,54846L,54847L, 54848L,54849L,54850L,54851L,54852L,54853L,54854L,54855L,54856L,54857L, 54858L,54859L,54860L,54861L,54862L,54863L,54864L,54865L,54866L,54867L, 54868L,54869L,54870L,54871L,54872L,54873L,54874L,54875L,54876L,54877L, 54878L,54879L,54880L,54881L,54882L,54883L,54884L,54885L,54886L,54887L, 54888L,54889L,54890L,54891L,54892L,54893L,54894L,54895L,54896L,54897L, 54898L,54899L,54900L,54901L,54902L,54903L,54904L,54905L,54906L,54907L, 54908L,54909L,54910L,54911L,54912L,54913L,54914L,54915L,54916L,54917L, 54918L,54919L,54920L,54921L,54922L,54923L,54924L,54925L,54926L,54927L, 54928L,54929L,54930L,54931L,54932L,54933L,54934L,54935L,54936L,54937L, 54938L,54939L,54940L,54941L,54942L,54943L,54944L,54945L,54946L,54947L, 54948L,54949L,54950L,54951L,54952L,54953L,54954L,54955L,54956L,54957L, 54958L,54959L,54960L,54961L,54962L,54963L,54964L,54965L,54966L,54967L, 54968L,54969L,54970L,54971L,54972L,54973L,54974L,54975L,54976L,54977L, 54978L,54979L,54980L,54981L,54982L,54983L,54984L,54985L,54986L,54987L, 54988L,54989L,54990L,54991L,54992L,54993L,54994L,54995L,54996L,54997L, 54998L,54999L,55000L,55001L,55002L,55003L,55004L,55005L,55006L,55007L, 55008L,55009L,55010L,55011L,55012L,55013L,55014L,55015L,55016L,55017L, 55018L,55019L,55020L,55021L,55022L,55023L,55024L,55025L,55026L,55027L, 55028L,55029L,55030L,55031L,55032L,55033L,55034L,55035L,55036L,55037L, 55038L,55039L,55040L,55041L,55042L,55043L,55044L,55045L,55046L,55047L, 55048L,55049L,55050L,55051L,55052L,55053L,55054L,55055L,55056L,55057L, 55058L,55059L,55060L,55061L,55062L,55063L,55064L,55065L,55066L,55067L, 55068L,55069L,55070L,55071L,55072L,55073L,55074L,55075L,55076L,55077L, 55078L,55079L,55080L,55081L,55082L,55083L,55084L,55085L,55086L,55087L, 55088L,55089L,55090L,55091L,55092L,55093L,55094L,55095L,55096L,55097L, 55098L,55099L,55100L,55101L,55102L,55103L,55104L,55105L,55106L,55107L, 55108L,55109L,55110L,55111L,55112L,55113L,55114L,55115L,55116L,55117L, 55118L,55119L,55120L,55121L,55122L,55123L,55124L,55125L,55126L,55127L, 55128L,55129L,55130L,55131L,55132L,55133L,55134L,55135L,55136L,55137L, 55138L,55139L,55140L,55141L,55142L,55143L,55144L,55145L,55146L,55147L, 55148L,55149L,55150L,55151L,55152L,55153L,55154L,55155L,55156L,55157L, 55158L,55159L,55160L,55161L,55162L,55163L,55164L,55165L,55166L,55167L, 55168L,55169L,55170L,55171L,55172L,55173L,55174L,55175L,55176L,55177L, 55178L,55179L,55180L,55181L,55182L,55183L,55184L,55185L,55186L,55187L, 55188L,55189L,55190L,55191L,55192L,55193L,55194L,55195L,55196L,55197L, 55198L,55199L,55200L,55201L,55202L,55203L,55204L,55205L,55206L,55207L, 55208L,55209L,55210L,55211L,55212L,55213L,55214L,55215L,55216L,55217L, 55218L,55219L,55220L,55221L,55222L,55223L,55224L,55225L,55226L,55227L, 55228L,55229L,55230L,55231L,55232L,55233L,55234L,55235L,55236L,55237L, 55238L,55239L,55240L,55241L,55242L,55243L,55244L,55245L,55246L,55247L, 55248L,55249L,55250L,55251L,55252L,55253L,55254L,55255L,55256L,55257L, 55258L,55259L,55260L,55261L,55262L,55263L,55264L,55265L,55266L,55267L, 55268L,55269L,55270L,55271L,55272L,55273L,55274L,55275L,55276L,55277L, 55278L,55279L,55280L,55281L,55282L,55283L,55284L,55285L,55286L,55287L, 55288L,55289L,55290L,55291L,55292L,55293L,55294L,55295L,55296L,55297L, 55298L,55299L,55300L,55301L,55302L,55303L,55304L,55305L,55306L,55307L, 55308L,55309L,55310L,55311L,55312L,55313L,55314L,55315L,55316L,55317L, 55318L,55319L,55320L,55321L,55322L,55323L,55324L,55325L,55326L,55327L, 55328L,55329L,55330L,55331L,55332L,55333L,55334L,55335L,55336L,55337L, 55338L,55339L,55340L,55341L,55342L,55343L,55344L,55345L,55346L,55347L, 55348L,55349L,55350L,55351L,55352L,55353L,55354L,55355L,55356L,55357L, 55358L,55359L,55360L,55361L,55362L,55363L,55364L,55365L,55366L,55367L, 55368L,55369L,55370L,55371L,55372L,55373L,55374L,55375L,55376L,55377L, 55378L,55379L,55380L,55381L,55382L,55383L,55384L,55385L,55386L,55387L, 55388L,55389L,55390L,55391L,55392L,55393L,55394L,55395L,55396L,55397L, 55398L,55399L,55400L,55401L,55402L,55403L,55404L,55405L,55406L,55407L, 55408L,55409L,55410L,55411L,55412L,55413L,55414L,55415L,55416L,55417L, 55418L,55419L,55420L,55421L,55422L,55423L,55424L,55425L,55426L,55427L, 55428L,55429L,55430L,55431L,55432L,55433L,55434L,55435L,55436L,55437L, 55438L,55439L,55440L,55441L,55442L,55443L,55444L,55445L,55446L,55447L, 55448L,55449L,55450L,55451L,55452L,55453L,55454L,55455L,55456L,55457L, 55458L,55459L,55460L,55461L,55462L,55463L,55464L,55465L,55466L,55467L, 55468L,55469L,55470L,55471L,55472L,55473L,55474L,55475L,55476L,55477L, 55478L,55479L,55480L,55481L,55482L,55483L,55484L,55485L,55486L,55487L, 55488L,55489L,55490L,55491L,55492L,55493L,55494L,55495L,55496L,55497L, 55498L,55499L,55500L,55501L,55502L,55503L,55504L,55505L,55506L,55507L, 55508L,55509L,55510L,55511L,55512L,55513L,55514L,55515L,55516L,55517L, 55518L,55519L,55520L,55521L,55522L,55523L,55524L,55525L,55526L,55527L, 55528L,55529L,55530L,55531L,55532L,55533L,55534L,55535L,55536L,55537L, 55538L,55539L,55540L,55541L,55542L,55543L,55544L,55545L,55546L,55547L, 55548L,55549L,55550L,55551L,55552L,55553L,55554L,55555L,55556L,55557L, 55558L,55559L,55560L,55561L,55562L,55563L,55564L,55565L,55566L,55567L, 55568L,55569L,55570L,55571L,55572L,55573L,55574L,55575L,55576L,55577L, 55578L,55579L,55580L,55581L,55582L,55583L,55584L,55585L,55586L,55587L, 55588L,55589L,55590L,55591L,55592L,55593L,55594L,55595L,55596L,55597L, 55598L,55599L,55600L,55601L,55602L,55603L,55604L,55605L,55606L,55607L, 55608L,55609L,55610L,55611L,55612L,55613L,55614L,55615L,55616L,55617L, 55618L,55619L,55620L,55621L,55622L,55623L,55624L,55625L,55626L,55627L, 55628L,55629L,55630L,55631L,55632L,55633L,55634L,55635L,55636L,55637L, 55638L,55639L,55640L,55641L,55642L,55643L,55644L,55645L,55646L,55647L, 55648L,55649L,55650L,55651L,55652L,55653L,55654L,55655L,55656L,55657L, 55658L,55659L,55660L,55661L,55662L,55663L,55664L,55665L,55666L,55667L, 55668L,55669L,55670L,55671L,55672L,55673L,55674L,55675L,55676L,55677L, 55678L,55679L,55680L,55681L,55682L,55683L,55684L,55685L,55686L,55687L, 55688L,55689L,55690L,55691L,55692L,55693L,55694L,55695L,55696L,55697L, 55698L,55699L,55700L,55701L,55702L,55703L,55704L,55705L,55706L,55707L, 55708L,55709L,55710L,55711L,55712L,55713L,55714L,55715L,55716L,55717L, 55718L,55719L,55720L,55721L,55722L,55723L,55724L,55725L,55726L,55727L, 55728L,55729L,55730L,55731L,55732L,55733L,55734L,55735L,55736L,55737L, 55738L,55739L,55740L,55741L,55742L,55743L,55744L,55745L,55746L,55747L, 55748L,55749L,55750L,55751L,55752L,55753L,55754L,55755L,55756L,55757L, 55758L,55759L,55760L,55761L,55762L,55763L,55764L,55765L,55766L,55767L, 55768L,55769L,55770L,55771L,55772L,55773L,55774L,55775L,55776L,55777L, 55778L,55779L,55780L,55781L,55782L,55783L,55784L,55785L,55786L,55787L, 55788L,55789L,55790L,55791L,55792L,55793L,55794L,55795L,55796L,55797L, 55798L,55799L,55800L,55801L,55802L,55803L,55804L,55805L,55806L,55807L, 55808L,55809L,55810L,55811L,55812L,55813L,55814L,55815L,55816L,55817L, 55818L,55819L,55820L,55821L,55822L,55823L,55824L,55825L,55826L,55827L, 55828L,55829L,55830L,55831L,55832L,55833L,55834L,55835L,55836L,55837L, 55838L,55839L,55840L,55841L,55842L,55843L,55844L,55845L,55846L,55847L, 55848L,55849L,55850L,55851L,55852L,55853L,55854L,55855L,55856L,55857L, 55858L,55859L,55860L,55861L,55862L,55863L,55864L,55865L,55866L,55867L, 55868L,55869L,55870L,55871L,55872L,55873L,55874L,55875L,55876L,55877L, 55878L,55879L,55880L,55881L,55882L,55883L,55884L,55885L,55886L,55887L, 55888L,55889L,55890L,55891L,55892L,55893L,55894L,55895L,55896L,55897L, 55898L,55899L,55900L,55901L,55902L,55903L,55904L,55905L,55906L,55907L, 55908L,55909L,55910L,55911L,55912L,55913L,55914L,55915L,55916L,55917L, 55918L,55919L,55920L,55921L,55922L,55923L,55924L,55925L,55926L,55927L, 55928L,55929L,55930L,55931L,55932L,55933L,55934L,55935L,55936L,55937L, 55938L,55939L,55940L,55941L,55942L,55943L,55944L,55945L,55946L,55947L, 55948L,55949L,55950L,55951L,55952L,55953L,55954L,55955L,55956L,55957L, 55958L,55959L,55960L,55961L,55962L,55963L,55964L,55965L,55966L,55967L, 55968L,55969L,55970L,55971L,55972L,55973L,55974L,55975L,55976L,55977L, 55978L,55979L,55980L,55981L,55982L,55983L,55984L,55985L,55986L,55987L, 55988L,55989L,55990L,55991L,55992L,55993L,55994L,55995L,55996L,55997L, 55998L,55999L,56000L,56001L,56002L,56003L,56004L,56005L,56006L,56007L, 56008L,56009L,56010L,56011L,56012L,56013L,56014L,56015L,56016L,56017L, 56018L,56019L,56020L,56021L,56022L,56023L,56024L,56025L,56026L,56027L, 56028L,56029L,56030L,56031L,56032L,56033L,56034L,56035L,56036L,56037L, 56038L,56039L,56040L,56041L,56042L,56043L,56044L,56045L,56046L,56047L, 56048L,56049L,56050L,56051L,56052L,56053L,56054L,56055L,56056L,56057L, 56058L,56059L,56060L,56061L,56062L,56063L,56064L,56065L,56066L,56067L, 56068L,56069L,56070L,56071L,56072L,56073L,56074L,56075L,56076L,56077L, 56078L,56079L,56080L,56081L,56082L,56083L,56084L,56085L,56086L,56087L, 56088L,56089L,56090L,56091L,56092L,56093L,56094L,56095L,56096L,56097L, 56098L,56099L,56100L,56101L,56102L,56103L,56104L,56105L,56106L,56107L, 56108L,56109L,56110L,56111L,56112L,56113L,56114L,56115L,56116L,56117L, 56118L,56119L,56120L,56121L,56122L,56123L,56124L,56125L,56126L,56127L, 56128L,56129L,56130L,56131L,56132L,56133L,56134L,56135L,56136L,56137L, 56138L,56139L,56140L,56141L,56142L,56143L,56144L,56145L,56146L,56147L, 56148L,56149L,56150L,56151L,56152L,56153L,56154L,56155L,56156L,56157L, 56158L,56159L,56160L,56161L,56162L,56163L,56164L,56165L,56166L,56167L, 56168L,56169L,56170L,56171L,56172L,56173L,56174L,56175L,56176L,56177L, 56178L,56179L,56180L,56181L,56182L,56183L,56184L,56185L,56186L,56187L, 56188L,56189L,56190L,56191L,56192L,56193L,56194L,56195L,56196L,56197L, 56198L,56199L,56200L,56201L,56202L,56203L,56204L,56205L,56206L,56207L, 56208L,56209L,56210L,56211L,56212L,56213L,56214L,56215L,56216L,56217L, 56218L,56219L,56220L,56221L,56222L,56223L,56224L,56225L,56226L,56227L, 56228L,56229L,56230L,56231L,56232L,56233L,56234L,56235L,56236L,56237L, 56238L,56239L,56240L,56241L,56242L,56243L,56244L,56245L,56246L,56247L, 56248L,56249L,56250L,56251L,56252L,56253L,56254L,56255L,56256L,56257L, 56258L,56259L,56260L,56261L,56262L,56263L,56264L,56265L,56266L,56267L, 56268L,56269L,56270L,56271L,56272L,56273L,56274L,56275L,56276L,56277L, 56278L,56279L,56280L,56281L,56282L,56283L,56284L,56285L,56286L,56287L, 56288L,56289L,56290L,56291L,56292L,56293L,56294L,56295L,56296L,56297L, 56298L,56299L,56300L,56301L,56302L,56303L,56304L,56305L,56306L,56307L, 56308L,56309L,56310L,56311L,56312L,56313L,56314L,56315L,56316L,56317L, 56318L,56319L,56320L,56321L,56322L,56323L,56324L,56325L,56326L,56327L, 56328L,56329L,56330L,56331L,56332L,56333L,56334L,56335L,56336L,56337L, 56338L,56339L,56340L,56341L,56342L,56343L,56344L,56345L,56346L,56347L, 56348L,56349L,56350L,56351L,56352L,56353L,56354L,56355L,56356L,56357L, 56358L,56359L,56360L,56361L,56362L,56363L,56364L,56365L,56366L,56367L, 56368L,56369L,56370L,56371L,56372L,56373L,56374L,56375L,56376L,56377L, 56378L,56379L,56380L,56381L,56382L,56383L,56384L,56385L,56386L,56387L, 56388L,56389L,56390L,56391L,56392L,56393L,56394L,56395L,56396L,56397L, 56398L,56399L,56400L,56401L,56402L,56403L,56404L,56405L,56406L,56407L, 56408L,56409L,56410L,56411L,56412L,56413L,56414L,56415L,56416L,56417L, 56418L,56419L,56420L,56421L,56422L,56423L,56424L,56425L,56426L,56427L, 56428L,56429L,56430L,56431L,56432L,56433L,56434L,56435L,56436L,56437L, 56438L,56439L,56440L,56441L,56442L,56443L,56444L,56445L,56446L,56447L, 56448L,56449L,56450L,56451L,56452L,56453L,56454L,56455L,56456L,56457L, 56458L,56459L,56460L,56461L,56462L,56463L,56464L,56465L,56466L,56467L, 56468L,56469L,56470L,56471L,56472L,56473L,56474L,56475L,56476L,56477L, 56478L,56479L,56480L,56481L,56482L,56483L,56484L,56485L,56486L,56487L, 56488L,56489L,56490L,56491L,56492L,56493L,56494L,56495L,56496L,56497L, 56498L,56499L,56500L,56501L,56502L,56503L,56504L,56505L,56506L,56507L, 56508L,56509L,56510L,56511L,56512L,56513L,56514L,56515L,56516L,56517L, 56518L,56519L,56520L,56521L,56522L,56523L,56524L,56525L,56526L,56527L, 56528L,56529L,56530L,56531L,56532L,56533L,56534L,56535L,56536L,56537L, 56538L,56539L,56540L,56541L,56542L,56543L,56544L,56545L,56546L,56547L, 56548L,56549L,56550L,56551L,56552L,56553L,56554L,56555L,56556L,56557L, 56558L,56559L,56560L,56561L,56562L,56563L,56564L,56565L,56566L,56567L, 56568L,56569L,56570L,56571L,56572L,56573L,56574L,56575L,56576L,56577L, 56578L,56579L,56580L,56581L,56582L,56583L,56584L,56585L,56586L,56587L, 56588L,56589L,56590L,56591L,56592L,56593L,56594L,56595L,56596L,56597L, 56598L,56599L,56600L,56601L,56602L,56603L,56604L,56605L,56606L,56607L, 56608L,56609L,56610L,56611L,56612L,56613L,56614L,56615L,56616L,56617L, 56618L,56619L,56620L,56621L,56622L,56623L,56624L,56625L,56626L,56627L, 56628L,56629L,56630L,56631L,56632L,56633L,56634L,56635L,56636L,56637L, 56638L,56639L,56640L,56641L,56642L,56643L,56644L,56645L,56646L,56647L, 56648L,56649L,56650L,56651L,56652L,56653L,56654L,56655L,56656L,56657L, 56658L,56659L,56660L,56661L,56662L,56663L,56664L,56665L,56666L,56667L, 56668L,56669L,56670L,56671L,56672L,56673L,56674L,56675L,56676L,56677L, 56678L,56679L,56680L,56681L,56682L,56683L,56684L,56685L,56686L,56687L, 56688L,56689L,56690L,56691L,56692L,56693L,56694L,56695L,56696L,56697L, 56698L,56699L,56700L,56701L,56702L,56703L,56704L,56705L,56706L,56707L, 56708L,56709L,56710L,56711L,56712L,56713L,56714L,56715L,56716L,56717L, 56718L,56719L,56720L,56721L,56722L,56723L,56724L,56725L,56726L,56727L, 56728L,56729L,56730L,56731L,56732L,56733L,56734L,56735L,56736L,56737L, 56738L,56739L,56740L,56741L,56742L,56743L,56744L,56745L,56746L,56747L, 56748L,56749L,56750L,56751L,56752L,56753L,56754L,56755L,56756L,56757L, 56758L,56759L,56760L,56761L,56762L,56763L,56764L,56765L,56766L,56767L, 56768L,56769L,56770L,56771L,56772L,56773L,56774L,56775L,56776L,56777L, 56778L,56779L,56780L,56781L,56782L,56783L,56784L,56785L,56786L,56787L, 56788L,56789L,56790L,56791L,56792L,56793L,56794L,56795L,56796L,56797L, 56798L,56799L,56800L,56801L,56802L,56803L,56804L,56805L,56806L,56807L, 56808L,56809L,56810L,56811L,56812L,56813L,56814L,56815L,56816L,56817L, 56818L,56819L,56820L,56821L,56822L,56823L,56824L,56825L,56826L,56827L, 56828L,56829L,56830L,56831L,56832L,56833L,56834L,56835L,56836L,56837L, 56838L,56839L,56840L,56841L,56842L,56843L,56844L,56845L,56846L,56847L, 56848L,56849L,56850L,56851L,56852L,56853L,56854L,56855L,56856L,56857L, 56858L,56859L,56860L,56861L,56862L,56863L,56864L,56865L,56866L,56867L, 56868L,56869L,56870L,56871L,56872L,56873L,56874L,56875L,56876L,56877L, 56878L,56879L,56880L,56881L,56882L,56883L,56884L,56885L,56886L,56887L, 56888L,56889L,56890L,56891L,56892L,56893L,56894L,56895L,56896L,56897L, 56898L,56899L,56900L,56901L,56902L,56903L,56904L,56905L,56906L,56907L, 56908L,56909L,56910L,56911L,56912L,56913L,56914L,56915L,56916L,56917L, 56918L,56919L,56920L,56921L,56922L,56923L,56924L,56925L,56926L,56927L, 56928L,56929L,56930L,56931L,56932L,56933L,56934L,56935L,56936L,56937L, 56938L,56939L,56940L,56941L,56942L,56943L,56944L,56945L,56946L,56947L, 56948L,56949L,56950L,56951L,56952L,56953L,56954L,56955L,56956L,56957L, 56958L,56959L,56960L,56961L,56962L,56963L,56964L,56965L,56966L,56967L, 56968L,56969L,56970L,56971L,56972L,56973L,56974L,56975L,56976L,56977L, 56978L,56979L,56980L,56981L,56982L,56983L,56984L,56985L,56986L,56987L, 56988L,56989L,56990L,56991L,56992L,56993L,56994L,56995L,56996L,56997L, 56998L,56999L,57000L,57001L,57002L,57003L,57004L,57005L,57006L,57007L, 57008L,57009L,57010L,57011L,57012L,57013L,57014L,57015L,57016L,57017L, 57018L,57019L,57020L,57021L,57022L,57023L,57024L,57025L,57026L,57027L, 57028L,57029L,57030L,57031L,57032L,57033L,57034L,57035L,57036L,57037L, 57038L,57039L,57040L,57041L,57042L,57043L,57044L,57045L,57046L,57047L, 57048L,57049L,57050L,57051L,57052L,57053L,57054L,57055L,57056L,57057L, 57058L,57059L,57060L,57061L,57062L,57063L,57064L,57065L,57066L,57067L, 57068L,57069L,57070L,57071L,57072L,57073L,57074L,57075L,57076L,57077L, 57078L,57079L,57080L,57081L,57082L,57083L,57084L,57085L,57086L,57087L, 57088L,57089L,57090L,57091L,57092L,57093L,57094L,57095L,57096L,57097L, 57098L,57099L,57100L,57101L,57102L,57103L,57104L,57105L,57106L,57107L, 57108L,57109L,57110L,57111L,57112L,57113L,57114L,57115L,57116L,57117L, 57118L,57119L,57120L,57121L,57122L,57123L,57124L,57125L,57126L,57127L, 57128L,57129L,57130L,57131L,57132L,57133L,57134L,57135L,57136L,57137L, 57138L,57139L,57140L,57141L,57142L,57143L,57144L,57145L,57146L,57147L, 57148L,57149L,57150L,57151L,57152L,57153L,57154L,57155L,57156L,57157L, 57158L,57159L,57160L,57161L,57162L,57163L,57164L,57165L,57166L,57167L, 57168L,57169L,57170L,57171L,57172L,57173L,57174L,57175L,57176L,57177L, 57178L,57179L,57180L,57181L,57182L,57183L,57184L,57185L,57186L,57187L, 57188L,57189L,57190L,57191L,57192L,57193L,57194L,57195L,57196L,57197L, 57198L,57199L,57200L,57201L,57202L,57203L,57204L,57205L,57206L,57207L, 57208L,57209L,57210L,57211L,57212L,57213L,57214L,57215L,57216L,57217L, 57218L,57219L,57220L,57221L,57222L,57223L,57224L,57225L,57226L,57227L, 57228L,57229L,57230L,57231L,57232L,57233L,57234L,57235L,57236L,57237L, 57238L,57239L,57240L,57241L,57242L,57243L,57244L,57245L,57246L,57247L, 57248L,57249L,57250L,57251L,57252L,57253L,57254L,57255L,57256L,57257L, 57258L,57259L,57260L,57261L,57262L,57263L,57264L,57265L,57266L,57267L, 57268L,57269L,57270L,57271L,57272L,57273L,57274L,57275L,57276L,57277L, 57278L,57279L,57280L,57281L,57282L,57283L,57284L,57285L,57286L,57287L, 57288L,57289L,57290L,57291L,57292L,57293L,57294L,57295L,57296L,57297L, 57298L,57299L,57300L,57301L,57302L,57303L,57304L,57305L,57306L,57307L, 57308L,57309L,57310L,57311L,57312L,57313L,57314L,57315L,57316L,57317L, 57318L,57319L,57320L,57321L,57322L,57323L,57324L,57325L,57326L,57327L, 57328L,57329L,57330L,57331L,57332L,57333L,57334L,57335L,57336L,57337L, 57338L,57339L,57340L,57341L,57342L,57343L,57344L,57345L,57346L,57347L, 57348L,57349L,57350L,57351L,57352L,57353L,57354L,57355L,57356L,57357L, 57358L,57359L,57360L,57361L,57362L,57363L,57364L,57365L,57366L,57367L, 57368L,57369L,57370L,57371L,57372L,57373L,57374L,57375L,57376L,57377L, 57378L,57379L,57380L,57381L,57382L,57383L,57384L,57385L,57386L,57387L, 57388L,57389L,57390L,57391L,57392L,57393L,57394L,57395L,57396L,57397L, 57398L,57399L,57400L,57401L,57402L,57403L,57404L,57405L,57406L,57407L, 57408L,57409L,57410L,57411L,57412L,57413L,57414L,57415L,57416L,57417L, 57418L,57419L,57420L,57421L,57422L,57423L,57424L,57425L,57426L,57427L, 57428L,57429L,57430L,57431L,57432L,57433L,57434L,57435L,57436L,57437L, 57438L,57439L,57440L,57441L,57442L,57443L,57444L,57445L,57446L,57447L, 57448L,57449L,57450L,57451L,57452L,57453L,57454L,57455L,57456L,57457L, 57458L,57459L,57460L,57461L,57462L,57463L,57464L,57465L,57466L,57467L, 57468L,57469L,57470L,57471L,57472L,57473L,57474L,57475L,57476L,57477L, 57478L,57479L,57480L,57481L,57482L,57483L,57484L,57485L,57486L,57487L, 57488L,57489L,57490L,57491L,57492L,57493L,57494L,57495L,57496L,57497L, 57498L,57499L,57500L,57501L,57502L,57503L,57504L,57505L,57506L,57507L, 57508L,57509L,57510L,57511L,57512L,57513L,57514L,57515L,57516L,57517L, 57518L,57519L,57520L,57521L,57522L,57523L,57524L,57525L,57526L,57527L, 57528L,57529L,57530L,57531L,57532L,57533L,57534L,57535L,57536L,57537L, 57538L,57539L,57540L,57541L,57542L,57543L,57544L,57545L,57546L,57547L, 57548L,57549L,57550L,57551L,57552L,57553L,57554L,57555L,57556L,57557L, 57558L,57559L,57560L,57561L,57562L,57563L,57564L,57565L,57566L,57567L, 57568L,57569L,57570L,57571L,57572L,57573L,57574L,57575L,57576L,57577L, 57578L,57579L,57580L,57581L,57582L,57583L,57584L,57585L,57586L,57587L, 57588L,57589L,57590L,57591L,57592L,57593L,57594L,57595L,57596L,57597L, 57598L,57599L,57600L,57601L,57602L,57603L,57604L,57605L,57606L,57607L, 57608L,57609L,57610L,57611L,57612L,57613L,57614L,57615L,57616L,57617L, 57618L,57619L,57620L,57621L,57622L,57623L,57624L,57625L,57626L,57627L, 57628L,57629L,57630L,57631L,57632L,57633L,57634L,57635L,57636L,57637L, 57638L,57639L,57640L,57641L,57642L,57643L,57644L,57645L,57646L,57647L, 57648L,57649L,57650L,57651L,57652L,57653L,57654L,57655L,57656L,57657L, 57658L,57659L,57660L,57661L,57662L,57663L,57664L,57665L,57666L,57667L, 57668L,57669L,57670L,57671L,57672L,57673L,57674L,57675L,57676L,57677L, 57678L,57679L,57680L,57681L,57682L,57683L,57684L,57685L,57686L,57687L, 57688L,57689L,57690L,57691L,57692L,57693L,57694L,57695L,57696L,57697L, 57698L,57699L,57700L,57701L,57702L,57703L,57704L,57705L,57706L,57707L, 57708L,57709L,57710L,57711L,57712L,57713L,57714L,57715L,57716L,57717L, 57718L,57719L,57720L,57721L,57722L,57723L,57724L,57725L,57726L,57727L, 57728L,57729L,57730L,57731L,57732L,57733L,57734L,57735L,57736L,57737L, 57738L,57739L,57740L,57741L,57742L,57743L,57744L,57745L,57746L,57747L, 57748L,57749L,57750L,57751L,57752L,57753L,57754L,57755L,57756L,57757L, 57758L,57759L,57760L,57761L,57762L,57763L,57764L,57765L,57766L,57767L, 57768L,57769L,57770L,57771L,57772L,57773L,57774L,57775L,57776L,57777L, 57778L,57779L,57780L,57781L,57782L,57783L,57784L,57785L,57786L,57787L, 57788L,57789L,57790L,57791L,57792L,57793L,57794L,57795L,57796L,57797L, 57798L,57799L,57800L,57801L,57802L,57803L,57804L,57805L,57806L,57807L, 57808L,57809L,57810L,57811L,57812L,57813L,57814L,57815L,57816L,57817L, 57818L,57819L,57820L,57821L,57822L,57823L,57824L,57825L,57826L,57827L, 57828L,57829L,57830L,57831L,57832L,57833L,57834L,57835L,57836L,57837L, 57838L,57839L,57840L,57841L,57842L,57843L,57844L,57845L,57846L,57847L, 57848L,57849L,57850L,57851L,57852L,57853L,57854L,57855L,57856L,57857L, 57858L,57859L,57860L,57861L,57862L,57863L,57864L,57865L,57866L,57867L, 57868L,57869L,57870L,57871L,57872L,57873L,57874L,57875L,57876L,57877L, 57878L,57879L,57880L,57881L,57882L,57883L,57884L,57885L,57886L,57887L, 57888L,57889L,57890L,57891L,57892L,57893L,57894L,57895L,57896L,57897L, 57898L,57899L,57900L,57901L,57902L,57903L,57904L,57905L,57906L,57907L, 57908L,57909L,57910L,57911L,57912L,57913L,57914L,57915L,57916L,57917L, 57918L,57919L,57920L,57921L,57922L,57923L,57924L,57925L,57926L,57927L, 57928L,57929L,57930L,57931L,57932L,57933L,57934L,57935L,57936L,57937L, 57938L,57939L,57940L,57941L,57942L,57943L,57944L,57945L,57946L,57947L, 57948L,57949L,57950L,57951L,57952L,57953L,57954L,57955L,57956L,57957L, 57958L,57959L,57960L,57961L,57962L,57963L,57964L,57965L,57966L,57967L, 57968L,57969L,57970L,57971L,57972L,57973L,57974L,57975L,57976L,57977L, 57978L,57979L,57980L,57981L,57982L,57983L,57984L,57985L,57986L,57987L, 57988L,57989L,57990L,57991L,57992L,57993L,57994L,57995L,57996L,57997L, 57998L,57999L,58000L,58001L,58002L,58003L,58004L,58005L,58006L,58007L, 58008L,58009L,58010L,58011L,58012L,58013L,58014L,58015L,58016L,58017L, 58018L,58019L,58020L,58021L,58022L,58023L,58024L,58025L,58026L,58027L, 58028L,58029L,58030L,58031L,58032L,58033L,58034L,58035L,58036L,58037L, 58038L,58039L,58040L,58041L,58042L,58043L,58044L,58045L,58046L,58047L, 58048L,58049L,58050L,58051L,58052L,58053L,58054L,58055L,58056L,58057L, 58058L,58059L,58060L,58061L,58062L,58063L,58064L,58065L,58066L,58067L, 58068L,58069L,58070L,58071L,58072L,58073L,58074L,58075L,58076L,58077L, 58078L,58079L,58080L,58081L,58082L,58083L,58084L,58085L,58086L,58087L, 58088L,58089L,58090L,58091L,58092L,58093L,58094L,58095L,58096L,58097L, 58098L,58099L,58100L,58101L,58102L,58103L,58104L,58105L,58106L,58107L, 58108L,58109L,58110L,58111L,58112L,58113L,58114L,58115L,58116L,58117L, 58118L,58119L,58120L,58121L,58122L,58123L,58124L,58125L,58126L,58127L, 58128L,58129L,58130L,58131L,58132L,58133L,58134L,58135L,58136L,58137L, 58138L,58139L,58140L,58141L,58142L,58143L,58144L,58145L,58146L,58147L, 58148L,58149L,58150L,58151L,58152L,58153L,58154L,58155L,58156L,58157L, 58158L,58159L,58160L,58161L,58162L,58163L,58164L,58165L,58166L,58167L, 58168L,58169L,58170L,58171L,58172L,58173L,58174L,58175L,58176L,58177L, 58178L,58179L,58180L,58181L,58182L,58183L,58184L,58185L,58186L,58187L, 58188L,58189L,58190L,58191L,58192L,58193L,58194L,58195L,58196L,58197L, 58198L,58199L,58200L,58201L,58202L,58203L,58204L,58205L,58206L,58207L, 58208L,58209L,58210L,58211L,58212L,58213L,58214L,58215L,58216L,58217L, 58218L,58219L,58220L,58221L,58222L,58223L,58224L,58225L,58226L,58227L, 58228L,58229L,58230L,58231L,58232L,58233L,58234L,58235L,58236L,58237L, 58238L,58239L,58240L,58241L,58242L,58243L,58244L,58245L,58246L,58247L, 58248L,58249L,58250L,58251L,58252L,58253L,58254L,58255L,58256L,58257L, 58258L,58259L,58260L,58261L,58262L,58263L,58264L,58265L,58266L,58267L, 58268L,58269L,58270L,58271L,58272L,58273L,58274L,58275L,58276L,58277L, 58278L,58279L,58280L,58281L,58282L,58283L,58284L,58285L,58286L,58287L, 58288L,58289L,58290L,58291L,58292L,58293L,58294L,58295L,58296L,58297L, 58298L,58299L,58300L,58301L,58302L,58303L,58304L,58305L,58306L,58307L, 58308L,58309L,58310L,58311L,58312L,58313L,58314L,58315L,58316L,58317L, 58318L,58319L,58320L,58321L,58322L,58323L,58324L,58325L,58326L,58327L, 58328L,58329L,58330L,58331L,58332L,58333L,58334L,58335L,58336L,58337L, 58338L,58339L,58340L,58341L,58342L,58343L,58344L,58345L,58346L,58347L, 58348L,58349L,58350L,58351L,58352L,58353L,58354L,58355L,58356L,58357L, 58358L,58359L,58360L,58361L,58362L,58363L,58364L,58365L,58366L,58367L, 58368L,58369L,58370L,58371L,58372L,58373L,58374L,58375L,58376L,58377L, 58378L,58379L,58380L,58381L,58382L,58383L,58384L,58385L,58386L,58387L, 58388L,58389L,58390L,58391L,58392L,58393L,58394L,58395L,58396L,58397L, 58398L,58399L,58400L,58401L,58402L,58403L,58404L,58405L,58406L,58407L, 58408L,58409L,58410L,58411L,58412L,58413L,58414L,58415L,58416L,58417L, 58418L,58419L,58420L,58421L,58422L,58423L,58424L,58425L,58426L,58427L, 58428L,58429L,58430L,58431L,58432L,58433L,58434L,58435L,58436L,58437L, 58438L,58439L,58440L,58441L,58442L,58443L,58444L,58445L,58446L,58447L, 58448L,58449L,58450L,58451L,58452L,58453L,58454L,58455L,58456L,58457L, 58458L,58459L,58460L,58461L,58462L,58463L,58464L,58465L,58466L,58467L, 58468L,58469L,58470L,58471L,58472L,58473L,58474L,58475L,58476L,58477L, 58478L,58479L,58480L,58481L,58482L,58483L,58484L,58485L,58486L,58487L, 58488L,58489L,58490L,58491L,58492L,58493L,58494L,58495L,58496L,58497L, 58498L,58499L,58500L,58501L,58502L,58503L,58504L,58505L,58506L,58507L, 58508L,58509L,58510L,58511L,58512L,58513L,58514L,58515L,58516L,58517L, 58518L,58519L,58520L,58521L,58522L,58523L,58524L,58525L,58526L,58527L, 58528L,58529L,58530L,58531L,58532L,58533L,58534L,58535L,58536L,58537L, 58538L,58539L,58540L,58541L,58542L,58543L,58544L,58545L,58546L,58547L, 58548L,58549L,58550L,58551L,58552L,58553L,58554L,58555L,58556L,58557L, 58558L,58559L,58560L,58561L,58562L,58563L,58564L,58565L,58566L,58567L, 58568L,58569L,58570L,58571L,58572L,58573L,58574L,58575L,58576L,58577L, 58578L,58579L,58580L,58581L,58582L,58583L,58584L,58585L,58586L,58587L, 58588L,58589L,58590L,58591L,58592L,58593L,58594L,58595L,58596L,58597L, 58598L,58599L,58600L,58601L,58602L,58603L,58604L,58605L,58606L,58607L, 58608L,58609L,58610L,58611L,58612L,58613L,58614L,58615L,58616L,58617L, 58618L,58619L,58620L,58621L,58622L,58623L,58624L,58625L,58626L,58627L, 58628L,58629L,58630L,58631L,58632L,58633L,58634L,58635L,58636L,58637L, 58638L,58639L,58640L,58641L,58642L,58643L,58644L,58645L,58646L,58647L, 58648L,58649L,58650L,58651L,58652L,58653L,58654L,58655L,58656L,58657L, 58658L,58659L,58660L,58661L,58662L,58663L,58664L,58665L,58666L,58667L, 58668L,58669L,58670L,58671L,58672L,58673L,58674L,58675L,58676L,58677L, 58678L,58679L,58680L,58681L,58682L,58683L,58684L,58685L,58686L,58687L, 58688L,58689L,58690L,58691L,58692L,58693L,58694L,58695L,58696L,58697L, 58698L,58699L,58700L,58701L,58702L,58703L,58704L,58705L,58706L,58707L, 58708L,58709L,58710L,58711L,58712L,58713L,58714L,58715L,58716L,58717L, 58718L,58719L,58720L,58721L,58722L,58723L,58724L,58725L,58726L,58727L, 58728L,58729L,58730L,58731L,58732L,58733L,58734L,58735L,58736L,58737L, 58738L,58739L,58740L,58741L,58742L,58743L,58744L,58745L,58746L,58747L, 58748L,58749L,58750L,58751L,58752L,58753L,58754L,58755L,58756L,58757L, 58758L,58759L,58760L,58761L,58762L,58763L,58764L,58765L,58766L,58767L, 58768L,58769L,58770L,58771L,58772L,58773L,58774L,58775L,58776L,58777L, 58778L,58779L,58780L,58781L,58782L,58783L,58784L,58785L,58786L,58787L, 58788L,58789L,58790L,58791L,58792L,58793L,58794L,58795L,58796L,58797L, 58798L,58799L,58800L,58801L,58802L,58803L,58804L,58805L,58806L,58807L, 58808L,58809L,58810L,58811L,58812L,58813L,58814L,58815L,58816L,58817L, 58818L,58819L,58820L,58821L,58822L,58823L,58824L,58825L,58826L,58827L, 58828L,58829L,58830L,58831L,58832L,58833L,58834L,58835L,58836L,58837L, 58838L,58839L,58840L,58841L,58842L,58843L,58844L,58845L,58846L,58847L, 58848L,58849L,58850L,58851L,58852L,58853L,58854L,58855L,58856L,58857L, 58858L,58859L,58860L,58861L,58862L,58863L,58864L,58865L,58866L,58867L, 58868L,58869L,58870L,58871L,58872L,58873L,58874L,58875L,58876L,58877L, 58878L,58879L,58880L,58881L,58882L,58883L,58884L,58885L,58886L,58887L, 58888L,58889L,58890L,58891L,58892L,58893L,58894L,58895L,58896L,58897L, 58898L,58899L,58900L,58901L,58902L,58903L,58904L,58905L,58906L,58907L, 58908L,58909L,58910L,58911L,58912L,58913L,58914L,58915L,58916L,58917L, 58918L,58919L,58920L,58921L,58922L,58923L,58924L,58925L,58926L,58927L, 58928L,58929L,58930L,58931L,58932L,58933L,58934L,58935L,58936L,58937L, 58938L,58939L,58940L,58941L,58942L,58943L,58944L,58945L,58946L,58947L, 58948L,58949L,58950L,58951L,58952L,58953L,58954L,58955L,58956L,58957L, 58958L,58959L,58960L,58961L,58962L,58963L,58964L,58965L,58966L,58967L, 58968L,58969L,58970L,58971L,58972L,58973L,58974L,58975L,58976L,58977L, 58978L,58979L,58980L,58981L,58982L,58983L,58984L,58985L,58986L,58987L, 58988L,58989L,58990L,58991L,58992L,58993L,58994L,58995L,58996L,58997L, 58998L,58999L,59000L,59001L,59002L,59003L,59004L,59005L,59006L,59007L, 59008L,59009L,59010L,59011L,59012L,59013L,59014L,59015L,59016L,59017L, 59018L,59019L,59020L,59021L,59022L,59023L,59024L,59025L,59026L,59027L, 59028L,59029L,59030L,59031L,59032L,59033L,59034L,59035L,59036L,59037L, 59038L,59039L,59040L,59041L,59042L,59043L,59044L,59045L,59046L,59047L, 59048L,59049L,59050L,59051L,59052L,59053L,59054L,59055L,59056L,59057L, 59058L,59059L,59060L,59061L,59062L,59063L,59064L,59065L,59066L,59067L, 59068L,59069L,59070L,59071L,59072L,59073L,59074L,59075L,59076L,59077L, 59078L,59079L,59080L,59081L,59082L,59083L,59084L,59085L,59086L,59087L, 59088L,59089L,59090L,59091L,59092L,59093L,59094L,59095L,59096L,59097L, 59098L,59099L,59100L,59101L,59102L,59103L,59104L,59105L,59106L,59107L, 59108L,59109L,59110L,59111L,59112L,59113L,59114L,59115L,59116L,59117L, 59118L,59119L,59120L,59121L,59122L,59123L,59124L,59125L,59126L,59127L, 59128L,59129L,59130L,59131L,59132L,59133L,59134L,59135L,59136L,59137L, 59138L,59139L,59140L,59141L,59142L,59143L,59144L,59145L,59146L,59147L, 59148L,59149L,59150L,59151L,59152L,59153L,59154L,59155L,59156L,59157L, 59158L,59159L,59160L,59161L,59162L,59163L,59164L,59165L,59166L,59167L, 59168L,59169L,59170L,59171L,59172L,59173L,59174L,59175L,59176L,59177L, 59178L,59179L,59180L,59181L,59182L,59183L,59184L,59185L,59186L,59187L, 59188L,59189L,59190L,59191L,59192L,59193L,59194L,59195L,59196L,59197L, 59198L,59199L,59200L,59201L,59202L,59203L,59204L,59205L,59206L,59207L, 59208L,59209L,59210L,59211L,59212L,59213L,59214L,59215L,59216L,59217L, 59218L,59219L,59220L,59221L,59222L,59223L,59224L,59225L,59226L,59227L, 59228L,59229L,59230L,59231L,59232L,59233L,59234L,59235L,59236L,59237L, 59238L,59239L,59240L,59241L,59242L,59243L,59244L,59245L,59246L,59247L, 59248L,59249L,59250L,59251L,59252L,59253L,59254L,59255L,59256L,59257L, 59258L,59259L,59260L,59261L,59262L,59263L,59264L,59265L,59266L,59267L, 59268L,59269L,59270L,59271L,59272L,59273L,59274L,59275L,59276L,59277L, 59278L,59279L,59280L,59281L,59282L,59283L,59284L,59285L,59286L,59287L, 59288L,59289L,59290L,59291L,59292L,59293L,59294L,59295L,59296L,59297L, 59298L,59299L,59300L,59301L,59302L,59303L,59304L,59305L,59306L,59307L, 59308L,59309L,59310L,59311L,59312L,59313L,59314L,59315L,59316L,59317L, 59318L,59319L,59320L,59321L,59322L,59323L,59324L,59325L,59326L,59327L, 59328L,59329L,59330L,59331L,59332L,59333L,59334L,59335L,59336L,59337L, 59338L,59339L,59340L,59341L,59342L,59343L,59344L,59345L,59346L,59347L, 59348L,59349L,59350L,59351L,59352L,59353L,59354L,59355L,59356L,59357L, 59358L,59359L,59360L,59361L,59362L,59363L,59364L,59365L,59366L,59367L, 59368L,59369L,59370L,59371L,59372L,59373L,59374L,59375L,59376L,59377L, 59378L,59379L,59380L,59381L,59382L,59383L,59384L,59385L,59386L,59387L, 59388L,59389L,59390L,59391L,59392L,59393L,59394L,59395L,59396L,59397L, 59398L,59399L,59400L,59401L,59402L,59403L,59404L,59405L,59406L,59407L, 59408L,59409L,59410L,59411L,59412L,59413L,59414L,59415L,59416L,59417L, 59418L,59419L,59420L,59421L,59422L,59423L,59424L,59425L,59426L,59427L, 59428L,59429L,59430L,59431L,59432L,59433L,59434L,59435L,59436L,59437L, 59438L,59439L,59440L,59441L,59442L,59443L,59444L,59445L,59446L,59447L, 59448L,59449L,59450L,59451L,59452L,59453L,59454L,59455L,59456L,59457L, 59458L,59459L,59460L,59461L,59462L,59463L,59464L,59465L,59466L,59467L, 59468L,59469L,59470L,59471L,59472L,59473L,59474L,59475L,59476L,59477L, 59478L,59479L,59480L,59481L,59482L,59483L,59484L,59485L,59486L,59487L, 59488L,59489L,59490L,59491L,59492L,59493L,59494L,59495L,59496L,59497L, 59498L,59499L,59500L,59501L,59502L,59503L,59504L,59505L,59506L,59507L, 59508L,59509L,59510L,59511L,59512L,59513L,59514L,59515L,59516L,59517L, 59518L,59519L,59520L,59521L,59522L,59523L,59524L,59525L,59526L,59527L, 59528L,59529L,59530L,59531L,59532L,59533L,59534L,59535L,59536L,59537L, 59538L,59539L,59540L,59541L,59542L,59543L,59544L,59545L,59546L,59547L, 59548L,59549L,59550L,59551L,59552L,59553L,59554L,59555L,59556L,59557L, 59558L,59559L,59560L,59561L,59562L,59563L,59564L,59565L,59566L,59567L, 59568L,59569L,59570L,59571L,59572L,59573L,59574L,59575L,59576L,59577L, 59578L,59579L,59580L,59581L,59582L,59583L,59584L,59585L,59586L,59587L, 59588L,59589L,59590L,59591L,59592L,59593L,59594L,59595L,59596L,59597L, 59598L,59599L,59600L,59601L,59602L,59603L,59604L,59605L,59606L,59607L, 59608L,59609L,59610L,59611L,59612L,59613L,59614L,59615L,59616L,59617L, 59618L,59619L,59620L,59621L,59622L,59623L,59624L,59625L,59626L,59627L, 59628L,59629L,59630L,59631L,59632L,59633L,59634L,59635L,59636L,59637L, 59638L,59639L,59640L,59641L,59642L,59643L,59644L,59645L,59646L,59647L, 59648L,59649L,59650L,59651L,59652L,59653L,59654L,59655L,59656L,59657L, 59658L,59659L,59660L,59661L,59662L,59663L,59664L,59665L,59666L,59667L, 59668L,59669L,59670L,59671L,59672L,59673L,59674L,59675L,59676L,59677L, 59678L,59679L,59680L,59681L,59682L,59683L,59684L,59685L,59686L,59687L, 59688L,59689L,59690L,59691L,59692L,59693L,59694L,59695L,59696L,59697L, 59698L,59699L,59700L,59701L,59702L,59703L,59704L,59705L,59706L,59707L, 59708L,59709L,59710L,59711L,59712L,59713L,59714L,59715L,59716L,59717L, 59718L,59719L,59720L,59721L,59722L,59723L,59724L,59725L,59726L,59727L, 59728L,59729L,59730L,59731L,59732L,59733L,59734L,59735L,59736L,59737L, 59738L,59739L,59740L,59741L,59742L,59743L,59744L,59745L,59746L,59747L, 59748L,59749L,59750L,59751L,59752L,59753L,59754L,59755L,59756L,59757L, 59758L,59759L,59760L,59761L,59762L,59763L,59764L,59765L,59766L,59767L, 59768L,59769L,59770L,59771L,59772L,59773L,59774L,59775L,59776L,59777L, 59778L,59779L,59780L,59781L,59782L,59783L,59784L,59785L,59786L,59787L, 59788L,59789L,59790L,59791L,59792L,59793L,59794L,59795L,59796L,59797L, 59798L,59799L,59800L,59801L,59802L,59803L,59804L,59805L,59806L,59807L, 59808L,59809L,59810L,59811L,59812L,59813L,59814L,59815L,59816L,59817L, 59818L,59819L,59820L,59821L,59822L,59823L,59824L,59825L,59826L,59827L, 59828L,59829L,59830L,59831L,59832L,59833L,59834L,59835L,59836L,59837L, 59838L,59839L,59840L,59841L,59842L,59843L,59844L,59845L,59846L,59847L, 59848L,59849L,59850L,59851L,59852L,59853L,59854L,59855L,59856L,59857L, 59858L,59859L,59860L,59861L,59862L,59863L,59864L,59865L,59866L,59867L, 59868L,59869L,59870L,59871L,59872L,59873L,59874L,59875L,59876L,59877L, 59878L,59879L,59880L,59881L,59882L,59883L,59884L,59885L,59886L,59887L, 59888L,59889L,59890L,59891L,59892L,59893L,59894L,59895L,59896L,59897L, 59898L,59899L,59900L,59901L,59902L,59903L,59904L,59905L,59906L,59907L, 59908L,59909L,59910L,59911L,59912L,59913L,59914L,59915L,59916L,59917L, 59918L,59919L,59920L,59921L,59922L,59923L,59924L,59925L,59926L,59927L, 59928L,59929L,59930L,59931L,59932L,59933L,59934L,59935L,59936L,59937L, 59938L,59939L,59940L,59941L,59942L,59943L,59944L,59945L,59946L,59947L, 59948L,59949L,59950L,59951L,59952L,59953L,59954L,59955L,59956L,59957L, 59958L,59959L,59960L,59961L,59962L,59963L,59964L,59965L,59966L,59967L, 59968L,59969L,59970L,59971L,59972L,59973L,59974L,59975L,59976L,59977L, 59978L,59979L,59980L,59981L,59982L,59983L,59984L,59985L,59986L,59987L, 59988L,59989L,59990L,59991L,59992L,59993L,59994L,59995L,59996L,59997L, 59998L,59999L,60000L,60001L,60002L,60003L,60004L,60005L,60006L,60007L, 60008L,60009L,60010L,60011L,60012L,60013L,60014L,60015L,60016L,60017L, 60018L,60019L,60020L,60021L,60022L,60023L,60024L,60025L,60026L,60027L, 60028L,60029L,60030L,60031L,60032L,60033L,60034L,60035L,60036L,60037L, 60038L,60039L,60040L,60041L,60042L,60043L,60044L,60045L,60046L,60047L, 60048L,60049L,60050L,60051L,60052L,60053L,60054L,60055L,60056L,60057L, 60058L,60059L,60060L,60061L,60062L,60063L,60064L,60065L,60066L,60067L, 60068L,60069L,60070L,60071L,60072L,60073L,60074L,60075L,60076L,60077L, 60078L,60079L,60080L,60081L,60082L,60083L,60084L,60085L,60086L,60087L, 60088L,60089L,60090L,60091L,60092L,60093L,60094L,60095L,60096L,60097L, 60098L,60099L,60100L,60101L,60102L,60103L,60104L,60105L,60106L,60107L, 60108L,60109L,60110L,60111L,60112L,60113L,60114L,60115L,60116L,60117L, 60118L,60119L,60120L,60121L,60122L,60123L,60124L,60125L,60126L,60127L, 60128L,60129L,60130L,60131L,60132L,60133L,60134L,60135L,60136L,60137L, 60138L,60139L,60140L,60141L,60142L,60143L,60144L,60145L,60146L,60147L, 60148L,60149L,60150L,60151L,60152L,60153L,60154L,60155L,60156L,60157L, 60158L,60159L,60160L,60161L,60162L,60163L,60164L,60165L,60166L,60167L, 60168L,60169L,60170L,60171L,60172L,60173L,60174L,60175L,60176L,60177L, 60178L,60179L,60180L,60181L,60182L,60183L,60184L,60185L,60186L,60187L, 60188L,60189L,60190L,60191L,60192L,60193L,60194L,60195L,60196L,60197L, 60198L,60199L,60200L,60201L,60202L,60203L,60204L,60205L,60206L,60207L, 60208L,60209L,60210L,60211L,60212L,60213L,60214L,60215L,60216L,60217L, 60218L,60219L,60220L,60221L,60222L,60223L,60224L,60225L,60226L,60227L, 60228L,60229L,60230L,60231L,60232L,60233L,60234L,60235L,60236L,60237L, 60238L,60239L,60240L,60241L,60242L,60243L,60244L,60245L,60246L,60247L, 60248L,60249L,60250L,60251L,60252L,60253L,60254L,60255L,60256L,60257L, 60258L,60259L,60260L,60261L,60262L,60263L,60264L,60265L,60266L,60267L, 60268L,60269L,60270L,60271L,60272L,60273L,60274L,60275L,60276L,60277L, 60278L,60279L,60280L,60281L,60282L,60283L,60284L,60285L,60286L,60287L, 60288L,60289L,60290L,60291L,60292L,60293L,60294L,60295L,60296L,60297L, 60298L,60299L,60300L,60301L,60302L,60303L,60304L,60305L,60306L,60307L, 60308L,60309L,60310L,60311L,60312L,60313L,60314L,60315L,60316L,60317L, 60318L,60319L,60320L,60321L,60322L,60323L,60324L,60325L,60326L,60327L, 60328L,60329L,60330L,60331L,60332L,60333L,60334L,60335L,60336L,60337L, 60338L,60339L,60340L,60341L,60342L,60343L,60344L,60345L,60346L,60347L, 60348L,60349L,60350L,60351L,60352L,60353L,60354L,60355L,60356L,60357L, 60358L,60359L,60360L,60361L,60362L,60363L,60364L,60365L,60366L,60367L, 60368L,60369L,60370L,60371L,60372L,60373L,60374L,60375L,60376L,60377L, 60378L,60379L,60380L,60381L,60382L,60383L,60384L,60385L,60386L,60387L, 60388L,60389L,60390L,60391L,60392L,60393L,60394L,60395L,60396L,60397L, 60398L,60399L,60400L,60401L,60402L,60403L,60404L,60405L,60406L,60407L, 60408L,60409L,60410L,60411L,60412L,60413L,60414L,60415L,60416L,60417L, 60418L,60419L,60420L,60421L,60422L,60423L,60424L,60425L,60426L,60427L, 60428L,60429L,60430L,60431L,60432L,60433L,60434L,60435L,60436L,60437L, 60438L,60439L,60440L,60441L,60442L,60443L,60444L,60445L,60446L,60447L, 60448L,60449L,60450L,60451L,60452L,60453L,60454L,60455L,60456L,60457L, 60458L,60459L,60460L,60461L,60462L,60463L,60464L,60465L,60466L,60467L, 60468L,60469L,60470L,60471L,60472L,60473L,60474L,60475L,60476L,60477L, 60478L,60479L,60480L,60481L,60482L,60483L,60484L,60485L,60486L,60487L, 60488L,60489L,60490L,60491L,60492L,60493L,60494L,60495L,60496L,60497L, 60498L,60499L,60500L,60501L,60502L,60503L,60504L,60505L,60506L,60507L, 60508L,60509L,60510L,60511L,60512L,60513L,60514L,60515L,60516L,60517L, 60518L,60519L,60520L,60521L,60522L,60523L,60524L,60525L,60526L,60527L, 60528L,60529L,60530L,60531L,60532L,60533L,60534L,60535L,60536L,60537L, 60538L,60539L,60540L,60541L,60542L,60543L,60544L,60545L,60546L,60547L, 60548L,60549L,60550L,60551L,60552L,60553L,60554L,60555L,60556L,60557L, 60558L,60559L,60560L,60561L,60562L,60563L,60564L,60565L,60566L,60567L, 60568L,60569L,60570L,60571L,60572L,60573L,60574L,60575L,60576L,60577L, 60578L,60579L,60580L,60581L,60582L,60583L,60584L,60585L,60586L,60587L, 60588L,60589L,60590L,60591L,60592L,60593L,60594L,60595L,60596L,60597L, 60598L,60599L,60600L,60601L,60602L,60603L,60604L,60605L,60606L,60607L, 60608L,60609L,60610L,60611L,60612L,60613L,60614L,60615L,60616L,60617L, 60618L,60619L,60620L,60621L,60622L,60623L,60624L,60625L,60626L,60627L, 60628L,60629L,60630L,60631L,60632L,60633L,60634L,60635L,60636L,60637L, 60638L,60639L,60640L,60641L,60642L,60643L,60644L,60645L,60646L,60647L, 60648L,60649L,60650L,60651L,60652L,60653L,60654L,60655L,60656L,60657L, 60658L,60659L,60660L,60661L,60662L,60663L,60664L,60665L,60666L,60667L, 60668L,60669L,60670L,60671L,60672L,60673L,60674L,60675L,60676L,60677L, 60678L,60679L,60680L,60681L,60682L,60683L,60684L,60685L,60686L,60687L, 60688L,60689L,60690L,60691L,60692L,60693L,60694L,60695L,60696L,60697L, 60698L,60699L,60700L,60701L,60702L,60703L,60704L,60705L,60706L,60707L, 60708L,60709L,60710L,60711L,60712L,60713L,60714L,60715L,60716L,60717L, 60718L,60719L,60720L,60721L,60722L,60723L,60724L,60725L,60726L,60727L, 60728L,60729L,60730L,60731L,60732L,60733L,60734L,60735L,60736L,60737L, 60738L,60739L,60740L,60741L,60742L,60743L,60744L,60745L,60746L,60747L, 60748L,60749L,60750L,60751L,60752L,60753L,60754L,60755L,60756L,60757L, 60758L,60759L,60760L,60761L,60762L,60763L,60764L,60765L,60766L,60767L, 60768L,60769L,60770L,60771L,60772L,60773L,60774L,60775L,60776L,60777L, 60778L,60779L,60780L,60781L,60782L,60783L,60784L,60785L,60786L,60787L, 60788L,60789L,60790L,60791L,60792L,60793L,60794L,60795L,60796L,60797L, 60798L,60799L,60800L,60801L,60802L,60803L,60804L,60805L,60806L,60807L, 60808L,60809L,60810L,60811L,60812L,60813L,60814L,60815L,60816L,60817L, 60818L,60819L,60820L,60821L,60822L,60823L,60824L,60825L,60826L,60827L, 60828L,60829L,60830L,60831L,60832L,60833L,60834L,60835L,60836L,60837L, 60838L,60839L,60840L,60841L,60842L,60843L,60844L,60845L,60846L,60847L, 60848L,60849L,60850L,60851L,60852L,60853L,60854L,60855L,60856L,60857L, 60858L,60859L,60860L,60861L,60862L,60863L,60864L,60865L,60866L,60867L, 60868L,60869L,60870L,60871L,60872L,60873L,60874L,60875L,60876L,60877L, 60878L,60879L,60880L,60881L,60882L,60883L,60884L,60885L,60886L,60887L, 60888L,60889L,60890L,60891L,60892L,60893L,60894L,60895L,60896L,60897L, 60898L,60899L,60900L,60901L,60902L,60903L,60904L,60905L,60906L,60907L, 60908L,60909L,60910L,60911L,60912L,60913L,60914L,60915L,60916L,60917L, 60918L,60919L,60920L,60921L,60922L,60923L,60924L,60925L,60926L,60927L, 60928L,60929L,60930L,60931L,60932L,60933L,60934L,60935L,60936L,60937L, 60938L,60939L,60940L,60941L,60942L,60943L,60944L,60945L,60946L,60947L, 60948L,60949L,60950L,60951L,60952L,60953L,60954L,60955L,60956L,60957L, 60958L,60959L,60960L,60961L,60962L,60963L,60964L,60965L,60966L,60967L, 60968L,60969L,60970L,60971L,60972L,60973L,60974L,60975L,60976L,60977L, 60978L,60979L,60980L,60981L,60982L,60983L,60984L,60985L,60986L,60987L, 60988L,60989L,60990L,60991L,60992L,60993L,60994L,60995L,60996L,60997L, 60998L,60999L,61000L,61001L,61002L,61003L,61004L,61005L,61006L,61007L, 61008L,61009L,61010L,61011L,61012L,61013L,61014L,61015L,61016L,61017L, 61018L,61019L,61020L,61021L,61022L,61023L,61024L,61025L,61026L,61027L, 61028L,61029L,61030L,61031L,61032L,61033L,61034L,61035L,61036L,61037L, 61038L,61039L,61040L,61041L,61042L,61043L,61044L,61045L,61046L,61047L, 61048L,61049L,61050L,61051L,61052L,61053L,61054L,61055L,61056L,61057L, 61058L,61059L,61060L,61061L,61062L,61063L,61064L,61065L,61066L,61067L, 61068L,61069L,61070L,61071L,61072L,61073L,61074L,61075L,61076L,61077L, 61078L,61079L,61080L,61081L,61082L,61083L,61084L,61085L,61086L,61087L, 61088L,61089L,61090L,61091L,61092L,61093L,61094L,61095L,61096L,61097L, 61098L,61099L,61100L,61101L,61102L,61103L,61104L,61105L,61106L,61107L, 61108L,61109L,61110L,61111L,61112L,61113L,61114L,61115L,61116L,61117L, 61118L,61119L,61120L,61121L,61122L,61123L,61124L,61125L,61126L,61127L, 61128L,61129L,61130L,61131L,61132L,61133L,61134L,61135L,61136L,61137L, 61138L,61139L,61140L,61141L,61142L,61143L,61144L,61145L,61146L,61147L, 61148L,61149L,61150L,61151L,61152L,61153L,61154L,61155L,61156L,61157L, 61158L,61159L,61160L,61161L,61162L,61163L,61164L,61165L,61166L,61167L, 61168L,61169L,61170L,61171L,61172L,61173L,61174L,61175L,61176L,61177L, 61178L,61179L,61180L,61181L,61182L,61183L,61184L,61185L,61186L,61187L, 61188L,61189L,61190L,61191L,61192L,61193L,61194L,61195L,61196L,61197L, 61198L,61199L,61200L,61201L,61202L,61203L,61204L,61205L,61206L,61207L, 61208L,61209L,61210L,61211L,61212L,61213L,61214L,61215L,61216L,61217L, 61218L,61219L,61220L,61221L,61222L,61223L,61224L,61225L,61226L,61227L, 61228L,61229L,61230L,61231L,61232L,61233L,61234L,61235L,61236L,61237L, 61238L,61239L,61240L,61241L,61242L,61243L,61244L,61245L,61246L,61247L, 61248L,61249L,61250L,61251L,61252L,61253L,61254L,61255L,61256L,61257L, 61258L,61259L,61260L,61261L,61262L,61263L,61264L,61265L,61266L,61267L, 61268L,61269L,61270L,61271L,61272L,61273L,61274L,61275L,61276L,61277L, 61278L,61279L,61280L,61281L,61282L,61283L,61284L,61285L,61286L,61287L, 61288L,61289L,61290L,61291L,61292L,61293L,61294L,61295L,61296L,61297L, 61298L,61299L,61300L,61301L,61302L,61303L,61304L,61305L,61306L,61307L, 61308L,61309L,61310L,61311L,61312L,61313L,61314L,61315L,61316L,61317L, 61318L,61319L,61320L,61321L,61322L,61323L,61324L,61325L,61326L,61327L, 61328L,61329L,61330L,61331L,61332L,61333L,61334L,61335L,61336L,61337L, 61338L,61339L,61340L,61341L,61342L,61343L,61344L,61345L,61346L,61347L, 61348L,61349L,61350L,61351L,61352L,61353L,61354L,61355L,61356L,61357L, 61358L,61359L,61360L,61361L,61362L,61363L,61364L,61365L,61366L,61367L, 61368L,61369L,61370L,61371L,61372L,61373L,61374L,61375L,61376L,61377L, 61378L,61379L,61380L,61381L,61382L,61383L,61384L,61385L,61386L,61387L, 61388L,61389L,61390L,61391L,61392L,61393L,61394L,61395L,61396L,61397L, 61398L,61399L,61400L,61401L,61402L,61403L,61404L,61405L,61406L,61407L, 61408L,61409L,61410L,61411L,61412L,61413L,61414L,61415L,61416L,61417L, 61418L,61419L,61420L,61421L,61422L,61423L,61424L,61425L,61426L,61427L, 61428L,61429L,61430L,61431L,61432L,61433L,61434L,61435L,61436L,61437L, 61438L,61439L,61440L,61441L,61442L,61443L,61444L,61445L,61446L,61447L, 61448L,61449L,61450L,61451L,61452L,61453L,61454L,61455L,61456L,61457L, 61458L,61459L,61460L,61461L,61462L,61463L,61464L,61465L,61466L,61467L, 61468L,61469L,61470L,61471L,61472L,61473L,61474L,61475L,61476L,61477L, 61478L,61479L,61480L,61481L,61482L,61483L,61484L,61485L,61486L,61487L, 61488L,61489L,61490L,61491L,61492L,61493L,61494L,61495L,61496L,61497L, 61498L,61499L,61500L,61501L,61502L,61503L,61504L,61505L,61506L,61507L, 61508L,61509L,61510L,61511L,61512L,61513L,61514L,61515L,61516L,61517L, 61518L,61519L,61520L,61521L,61522L,61523L,61524L,61525L,61526L,61527L, 61528L,61529L,61530L,61531L,61532L,61533L,61534L,61535L,61536L,61537L, 61538L,61539L,61540L,61541L,61542L,61543L,61544L,61545L,61546L,61547L, 61548L,61549L,61550L,61551L,61552L,61553L,61554L,61555L,61556L,61557L, 61558L,61559L,61560L,61561L,61562L,61563L,61564L,61565L,61566L,61567L, 61568L,61569L,61570L,61571L,61572L,61573L,61574L,61575L,61576L,61577L, 61578L,61579L,61580L,61581L,61582L,61583L,61584L,61585L,61586L,61587L, 61588L,61589L,61590L,61591L,61592L,61593L,61594L,61595L,61596L,61597L, 61598L,61599L,61600L,61601L,61602L,61603L,61604L,61605L,61606L,61607L, 61608L,61609L,61610L,61611L,61612L,61613L,61614L,61615L,61616L,61617L, 61618L,61619L,61620L,61621L,61622L,61623L,61624L,61625L,61626L,61627L, 61628L,61629L,61630L,61631L,61632L,61633L,61634L,61635L,61636L,61637L, 61638L,61639L,61640L,61641L,61642L,61643L,61644L,61645L,61646L,61647L, 61648L,61649L,61650L,61651L,61652L,61653L,61654L,61655L,61656L,61657L, 61658L,61659L,61660L,61661L,61662L,61663L,61664L,61665L,61666L,61667L, 61668L,61669L,61670L,61671L,61672L,61673L,61674L,61675L,61676L,61677L, 61678L,61679L,61680L,61681L,61682L,61683L,61684L,61685L,61686L,61687L, 61688L,61689L,61690L,61691L,61692L,61693L,61694L,61695L,61696L,61697L, 61698L,61699L,61700L,61701L,61702L,61703L,61704L,61705L,61706L,61707L, 61708L,61709L,61710L,61711L,61712L,61713L,61714L,61715L,61716L,61717L, 61718L,61719L,61720L,61721L,61722L,61723L,61724L,61725L,61726L,61727L, 61728L,61729L,61730L,61731L,61732L,61733L,61734L,61735L,61736L,61737L, 61738L,61739L,61740L,61741L,61742L,61743L,61744L,61745L,61746L,61747L, 61748L,61749L,61750L,61751L,61752L,61753L,61754L,61755L,61756L,61757L, 61758L,61759L,61760L,61761L,61762L,61763L,61764L,61765L,61766L,61767L, 61768L,61769L,61770L,61771L,61772L,61773L,61774L,61775L,61776L,61777L, 61778L,61779L,61780L,61781L,61782L,61783L,61784L,61785L,61786L,61787L, 61788L,61789L,61790L,61791L,61792L,61793L,61794L,61795L,61796L,61797L, 61798L,61799L,61800L,61801L,61802L,61803L,61804L,61805L,61806L,61807L, 61808L,61809L,61810L,61811L,61812L,61813L,61814L,61815L,61816L,61817L, 61818L,61819L,61820L,61821L,61822L,61823L,61824L,61825L,61826L,61827L, 61828L,61829L,61830L,61831L,61832L,61833L,61834L,61835L,61836L,61837L, 61838L,61839L,61840L,61841L,61842L,61843L,61844L,61845L,61846L,61847L, 61848L,61849L,61850L,61851L,61852L,61853L,61854L,61855L,61856L,61857L, 61858L,61859L,61860L,61861L,61862L,61863L,61864L,61865L,61866L,61867L, 61868L,61869L,61870L,61871L,61872L,61873L,61874L,61875L,61876L,61877L, 61878L,61879L,61880L,61881L,61882L,61883L,61884L,61885L,61886L,61887L, 61888L,61889L,61890L,61891L,61892L,61893L,61894L,61895L,61896L,61897L, 61898L,61899L,61900L,61901L,61902L,61903L,61904L,61905L,61906L,61907L, 61908L,61909L,61910L,61911L,61912L,61913L,61914L,61915L,61916L,61917L, 61918L,61919L,61920L,61921L,61922L,61923L,61924L,61925L,61926L,61927L, 61928L,61929L,61930L,61931L,61932L,61933L,61934L,61935L,61936L,61937L, 61938L,61939L,61940L,61941L,61942L,61943L,61944L,61945L,61946L,61947L, 61948L,61949L,61950L,61951L,61952L,61953L,61954L,61955L,61956L,61957L, 61958L,61959L,61960L,61961L,61962L,61963L,61964L,61965L,61966L,61967L, 61968L,61969L,61970L,61971L,61972L,61973L,61974L,61975L,61976L,61977L, 61978L,61979L,61980L,61981L,61982L,61983L,61984L,61985L,61986L,61987L, 61988L,61989L,61990L,61991L,61992L,61993L,61994L,61995L,61996L,61997L, 61998L,61999L,62000L,62001L,62002L,62003L,62004L,62005L,62006L,62007L, 62008L,62009L,62010L,62011L,62012L,62013L,62014L,62015L,62016L,62017L, 62018L,62019L,62020L,62021L,62022L,62023L,62024L,62025L,62026L,62027L, 62028L,62029L,62030L,62031L,62032L,62033L,62034L,62035L,62036L,62037L, 62038L,62039L,62040L,62041L,62042L,62043L,62044L,62045L,62046L,62047L, 62048L,62049L,62050L,62051L,62052L,62053L,62054L,62055L,62056L,62057L, 62058L,62059L,62060L,62061L,62062L,62063L,62064L,62065L,62066L,62067L, 62068L,62069L,62070L,62071L,62072L,62073L,62074L,62075L,62076L,62077L, 62078L,62079L,62080L,62081L,62082L,62083L,62084L,62085L,62086L,62087L, 62088L,62089L,62090L,62091L,62092L,62093L,62094L,62095L,62096L,62097L, 62098L,62099L,62100L,62101L,62102L,62103L,62104L,62105L,62106L,62107L, 62108L,62109L,62110L,62111L,62112L,62113L,62114L,62115L,62116L,62117L, 62118L,62119L,62120L,62121L,62122L,62123L,62124L,62125L,62126L,62127L, 62128L,62129L,62130L,62131L,62132L,62133L,62134L,62135L,62136L,62137L, 62138L,62139L,62140L,62141L,62142L,62143L,62144L,62145L,62146L,62147L, 62148L,62149L,62150L,62151L,62152L,62153L,62154L,62155L,62156L,62157L, 62158L,62159L,62160L,62161L,62162L,62163L,62164L,62165L,62166L,62167L, 62168L,62169L,62170L,62171L,62172L,62173L,62174L,62175L,62176L,62177L, 62178L,62179L,62180L,62181L,62182L,62183L,62184L,62185L,62186L,62187L, 62188L,62189L,62190L,62191L,62192L,62193L,62194L,62195L,62196L,62197L, 62198L,62199L,62200L,62201L,62202L,62203L,62204L,62205L,62206L,62207L, 62208L,62209L,62210L,62211L,62212L,62213L,62214L,62215L,62216L,62217L, 62218L,62219L,62220L,62221L,62222L,62223L,62224L,62225L,62226L,62227L, 62228L,62229L,62230L,62231L,62232L,62233L,62234L,62235L,62236L,62237L, 62238L,62239L,62240L,62241L,62242L,62243L,62244L,62245L,62246L,62247L, 62248L,62249L,62250L,62251L,62252L,62253L,62254L,62255L,62256L,62257L, 62258L,62259L,62260L,62261L,62262L,62263L,62264L,62265L,62266L,62267L, 62268L,62269L,62270L,62271L,62272L,62273L,62274L,62275L,62276L,62277L, 62278L,62279L,62280L,62281L,62282L,62283L,62284L,62285L,62286L,62287L, 62288L,62289L,62290L,62291L,62292L,62293L,62294L,62295L,62296L,62297L, 62298L,62299L,62300L,62301L,62302L,62303L,62304L,62305L,62306L,62307L, 62308L,62309L,62310L,62311L,62312L,62313L,62314L,62315L,62316L,62317L, 62318L,62319L,62320L,62321L,62322L,62323L,62324L,62325L,62326L,62327L, 62328L,62329L,62330L,62331L,62332L,62333L,62334L,62335L,62336L,62337L, 62338L,62339L,62340L,62341L,62342L,62343L,62344L,62345L,62346L,62347L, 62348L,62349L,62350L,62351L,62352L,62353L,62354L,62355L,62356L,62357L, 62358L,62359L,62360L,62361L,62362L,62363L,62364L,62365L,62366L,62367L, 62368L,62369L,62370L,62371L,62372L,62373L,62374L,62375L,62376L,62377L, 62378L,62379L,62380L,62381L,62382L,62383L,62384L,62385L,62386L,62387L, 62388L,62389L,62390L,62391L,62392L,62393L,62394L,62395L,62396L,62397L, 62398L,62399L,62400L,62401L,62402L,62403L,62404L,62405L,62406L,62407L, 62408L,62409L,62410L,62411L,62412L,62413L,62414L,62415L,62416L,62417L, 62418L,62419L,62420L,62421L,62422L,62423L,62424L,62425L,62426L,62427L, 62428L,62429L,62430L,62431L,62432L,62433L,62434L,62435L,62436L,62437L, 62438L,62439L,62440L,62441L,62442L,62443L,62444L,62445L,62446L,62447L, 62448L,62449L,62450L,62451L,62452L,62453L,62454L,62455L,62456L,62457L, 62458L,62459L,62460L,62461L,62462L,62463L,62464L,62465L,62466L,62467L, 62468L,62469L,62470L,62471L,62472L,62473L,62474L,62475L,62476L,62477L, 62478L,62479L,62480L,62481L,62482L,62483L,62484L,62485L,62486L,62487L, 62488L,62489L,62490L,62491L,62492L,62493L,62494L,62495L,62496L,62497L, 62498L,62499L,62500L,62501L,62502L,62503L,62504L,62505L,62506L,62507L, 62508L,62509L,62510L,62511L,62512L,62513L,62514L,62515L,62516L,62517L, 62518L,62519L,62520L,62521L,62522L,62523L,62524L,62525L,62526L,62527L, 62528L,62529L,62530L,62531L,62532L,62533L,62534L,62535L,62536L,62537L, 62538L,62539L,62540L,62541L,62542L,62543L,62544L,62545L,62546L,62547L, 62548L,62549L,62550L,62551L,62552L,62553L,62554L,62555L,62556L,62557L, 62558L,62559L,62560L,62561L,62562L,62563L,62564L,62565L,62566L,62567L, 62568L,62569L,62570L,62571L,62572L,62573L,62574L,62575L,62576L,62577L, 62578L,62579L,62580L,62581L,62582L,62583L,62584L,62585L,62586L,62587L, 62588L,62589L,62590L,62591L,62592L,62593L,62594L,62595L,62596L,62597L, 62598L,62599L,62600L,62601L,62602L,62603L,62604L,62605L,62606L,62607L, 62608L,62609L,62610L,62611L,62612L,62613L,62614L,62615L,62616L,62617L, 62618L,62619L,62620L,62621L,62622L,62623L,62624L,62625L,62626L,62627L, 62628L,62629L,62630L,62631L,62632L,62633L,62634L,62635L,62636L,62637L, 62638L,62639L,62640L,62641L,62642L,62643L,62644L,62645L,62646L,62647L, 62648L,62649L,62650L,62651L,62652L,62653L,62654L,62655L,62656L,62657L, 62658L,62659L,62660L,62661L,62662L,62663L,62664L,62665L,62666L,62667L, 62668L,62669L,62670L,62671L,62672L,62673L,62674L,62675L,62676L,62677L, 62678L,62679L,62680L,62681L,62682L,62683L,62684L,62685L,62686L,62687L, 62688L,62689L,62690L,62691L,62692L,62693L,62694L,62695L,62696L,62697L, 62698L,62699L,62700L,62701L,62702L,62703L,62704L,62705L,62706L,62707L, 62708L,62709L,62710L,62711L,62712L,62713L,62714L,62715L,62716L,62717L, 62718L,62719L,62720L,62721L,62722L,62723L,62724L,62725L,62726L,62727L, 62728L,62729L,62730L,62731L,62732L,62733L,62734L,62735L,62736L,62737L, 62738L,62739L,62740L,62741L,62742L,62743L,62744L,62745L,62746L,62747L, 62748L,62749L,62750L,62751L,62752L,62753L,62754L,62755L,62756L,62757L, 62758L,62759L,62760L,62761L,62762L,62763L,62764L,62765L,62766L,62767L, 62768L,62769L,62770L,62771L,62772L,62773L,62774L,62775L,62776L,62777L, 62778L,62779L,62780L,62781L,62782L,62783L,62784L,62785L,62786L,62787L, 62788L,62789L,62790L,62791L,62792L,62793L,62794L,62795L,62796L,62797L, 62798L,62799L,62800L,62801L,62802L,62803L,62804L,62805L,62806L,62807L, 62808L,62809L,62810L,62811L,62812L,62813L,62814L,62815L,62816L,62817L, 62818L,62819L,62820L,62821L,62822L,62823L,62824L,62825L,62826L,62827L, 62828L,62829L,62830L,62831L,62832L,62833L,62834L,62835L,62836L,62837L, 62838L,62839L,62840L,62841L,62842L,62843L,62844L,62845L,62846L,62847L, 62848L,62849L,62850L,62851L,62852L,62853L,62854L,62855L,62856L,62857L, 62858L,62859L,62860L,62861L,62862L,62863L,62864L,62865L,62866L,62867L, 62868L,62869L,62870L,62871L,62872L,62873L,62874L,62875L,62876L,62877L, 62878L,62879L,62880L,62881L,62882L,62883L,62884L,62885L,62886L,62887L, 62888L,62889L,62890L,62891L,62892L,62893L,62894L,62895L,62896L,62897L, 62898L,62899L,62900L,62901L,62902L,62903L,62904L,62905L,62906L,62907L, 62908L,62909L,62910L,62911L,62912L,62913L,62914L,62915L,62916L,62917L, 62918L,62919L,62920L,62921L,62922L,62923L,62924L,62925L,62926L,62927L, 62928L,62929L,62930L,62931L,62932L,62933L,62934L,62935L,62936L,62937L, 62938L,62939L,62940L,62941L,62942L,62943L,62944L,62945L,62946L,62947L, 62948L,62949L,62950L,62951L,62952L,62953L,62954L,62955L,62956L,62957L, 62958L,62959L,62960L,62961L,62962L,62963L,62964L,62965L,62966L,62967L, 62968L,62969L,62970L,62971L,62972L,62973L,62974L,62975L,62976L,62977L, 62978L,62979L,62980L,62981L,62982L,62983L,62984L,62985L,62986L,62987L, 62988L,62989L,62990L,62991L,62992L,62993L,62994L,62995L,62996L,62997L, 62998L,62999L,63000L,63001L,63002L,63003L,63004L,63005L,63006L,63007L, 63008L,63009L,63010L,63011L,63012L,63013L,63014L,63015L,63016L,63017L, 63018L,63019L,63020L,63021L,63022L,63023L,63024L,63025L,63026L,63027L, 63028L,63029L,63030L,63031L,63032L,63033L,63034L,63035L,63036L,63037L, 63038L,63039L,63040L,63041L,63042L,63043L,63044L,63045L,63046L,63047L, 63048L,63049L,63050L,63051L,63052L,63053L,63054L,63055L,63056L,63057L, 63058L,63059L,63060L,63061L,63062L,63063L,63064L,63065L,63066L,63067L, 63068L,63069L,63070L,63071L,63072L,63073L,63074L,63075L,63076L,63077L, 63078L,63079L,63080L,63081L,63082L,63083L,63084L,63085L,63086L,63087L, 63088L,63089L,63090L,63091L,63092L,63093L,63094L,63095L,63096L,63097L, 63098L,63099L,63100L,63101L,63102L,63103L,63104L,63105L,63106L,63107L, 63108L,63109L,63110L,63111L,63112L,63113L,63114L,63115L,63116L,63117L, 63118L,63119L,63120L,63121L,63122L,63123L,63124L,63125L,63126L,63127L, 63128L,63129L,63130L,63131L,63132L,63133L,63134L,63135L,63136L,63137L, 63138L,63139L,63140L,63141L,63142L,63143L,63144L,63145L,63146L,63147L, 63148L,63149L,63150L,63151L,63152L,63153L,63154L,63155L,63156L,63157L, 63158L,63159L,63160L,63161L,63162L,63163L,63164L,63165L,63166L,63167L, 63168L,63169L,63170L,63171L,63172L,63173L,63174L,63175L,63176L,63177L, 63178L,63179L,63180L,63181L,63182L,63183L,63184L,63185L,63186L,63187L, 63188L,63189L,63190L,63191L,63192L,63193L,63194L,63195L,63196L,63197L, 63198L,63199L,63200L,63201L,63202L,63203L,63204L,63205L,63206L,63207L, 63208L,63209L,63210L,63211L,63212L,63213L,63214L,63215L,63216L,63217L, 63218L,63219L,63220L,63221L,63222L,63223L,63224L,63225L,63226L,63227L, 63228L,63229L,63230L,63231L,63232L,63233L,63234L,63235L,63236L,63237L, 63238L,63239L,63240L,63241L,63242L,63243L,63244L,63245L,63246L,63247L, 63248L,63249L,63250L,63251L,63252L,63253L,63254L,63255L,63256L,63257L, 63258L,63259L,63260L,63261L,63262L,63263L,63264L,63265L,63266L,63267L, 63268L,63269L,63270L,63271L,63272L,63273L,63274L,63275L,63276L,63277L, 63278L,63279L,63280L,63281L,63282L,63283L,63284L,63285L,63286L,63287L, 63288L,63289L,63290L,63291L,63292L,63293L,63294L,63295L,63296L,63297L, 63298L,63299L,63300L,63301L,63302L,63303L,63304L,63305L,63306L,63307L, 63308L,63309L,63310L,63311L,63312L,63313L,63314L,63315L,63316L,63317L, 63318L,63319L,63320L,63321L,63322L,63323L,63324L,63325L,63326L,63327L, 63328L,63329L,63330L,63331L,63332L,63333L,63334L,63335L,63336L,63337L, 63338L,63339L,63340L,63341L,63342L,63343L,63344L,63345L,63346L,63347L, 63348L,63349L,63350L,63351L,63352L,63353L,63354L,63355L,63356L,63357L, 63358L,63359L,63360L,63361L,63362L,63363L,63364L,63365L,63366L,63367L, 63368L,63369L,63370L,63371L,63372L,63373L,63374L,63375L,63376L,63377L, 63378L,63379L,63380L,63381L,63382L,63383L,63384L,63385L,63386L,63387L, 63388L,63389L,63390L,63391L,63392L,63393L,63394L,63395L,63396L,63397L, 63398L,63399L,63400L,63401L,63402L,63403L,63404L,63405L,63406L,63407L, 63408L,63409L,63410L,63411L,63412L,63413L,63414L,63415L,63416L,63417L, 63418L,63419L,63420L,63421L,63422L,63423L,63424L,63425L,63426L,63427L, 63428L,63429L,63430L,63431L,63432L,63433L,63434L,63435L,63436L,63437L, 63438L,63439L,63440L,63441L,63442L,63443L,63444L,63445L,63446L,63447L, 63448L,63449L,63450L,63451L,63452L,63453L,63454L,63455L,63456L,63457L, 63458L,63459L,63460L,63461L,63462L,63463L,63464L,63465L,63466L,63467L, 63468L,63469L,63470L,63471L,63472L,63473L,63474L,63475L,63476L,63477L, 63478L,63479L,63480L,63481L,63482L,63483L,63484L,63485L,63486L,63487L, 63488L,63489L,63490L,63491L,63492L,63493L,63494L,63495L,63496L,63497L, 63498L,63499L,63500L,63501L,63502L,63503L,63504L,63505L,63506L,63507L, 63508L,63509L,63510L,63511L,63512L,63513L,63514L,63515L,63516L,63517L, 63518L,63519L,63520L,63521L,63522L,63523L,63524L,63525L,63526L,63527L, 63528L,63529L,63530L,63531L,63532L,63533L,63534L,63535L,63536L,63537L, 63538L,63539L,63540L,63541L,63542L,63543L,63544L,63545L,63546L,63547L, 63548L,63549L,63550L,63551L,63552L,63553L,63554L,63555L,63556L,63557L, 63558L,63559L,63560L,63561L,63562L,63563L,63564L,63565L,63566L,63567L, 63568L,63569L,63570L,63571L,63572L,63573L,63574L,63575L,63576L,63577L, 63578L,63579L,63580L,63581L,63582L,63583L,63584L,63585L,63586L,63587L, 63588L,63589L,63590L,63591L,63592L,63593L,63594L,63595L,63596L,63597L, 63598L,63599L,63600L,63601L,63602L,63603L,63604L,63605L,63606L,63607L, 63608L,63609L,63610L,63611L,63612L,63613L,63614L,63615L,63616L,63617L, 63618L,63619L,63620L,63621L,63622L,63623L,63624L,63625L,63626L,63627L, 63628L,63629L,63630L,63631L,63632L,63633L,63634L,63635L,63636L,63637L, 63638L,63639L,63640L,63641L,63642L,63643L,63644L,63645L,63646L,63647L, 63648L,63649L,63650L,63651L,63652L,63653L,63654L,63655L,63656L,63657L, 63658L,63659L,63660L,63661L,63662L,63663L,63664L,63665L,63666L,63667L, 63668L,63669L,63670L,63671L,63672L,63673L,63674L,63675L,63676L,63677L, 63678L,63679L,63680L,63681L,63682L,63683L,63684L,63685L,63686L,63687L, 63688L,63689L,63690L,63691L,63692L,63693L,63694L,63695L,63696L,63697L, 63698L,63699L,63700L,63701L,63702L,63703L,63704L,63705L,63706L,63707L, 63708L,63709L,63710L,63711L,63712L,63713L,63714L,63715L,63716L,63717L, 63718L,63719L,63720L,63721L,63722L,63723L,63724L,63725L,63726L,63727L, 63728L,63729L,63730L,63731L,63732L,63733L,63734L,63735L,63736L,63737L, 63738L,63739L,63740L,63741L,63742L,63743L,63744L,63745L,63746L,63747L, 63748L,63749L,63750L,63751L,63752L,63753L,63754L,63755L,63756L,63757L, 63758L,63759L,63760L,63761L,63762L,63763L,63764L,63765L,63766L,63767L, 63768L,63769L,63770L,63771L,63772L,63773L,63774L,63775L,63776L,63777L, 63778L,63779L,63780L,63781L,63782L,63783L,63784L,63785L,63786L,63787L, 63788L,63789L,63790L,63791L,63792L,63793L,63794L,63795L,63796L,63797L, 63798L,63799L,63800L,63801L,63802L,63803L,63804L,63805L,63806L,63807L, 63808L,63809L,63810L,63811L,63812L,63813L,63814L,63815L,63816L,63817L, 63818L,63819L,63820L,63821L,63822L,63823L,63824L,63825L,63826L,63827L, 63828L,63829L,63830L,63831L,63832L,63833L,63834L,63835L,63836L,63837L, 63838L,63839L,63840L,63841L,63842L,63843L,63844L,63845L,63846L,63847L, 63848L,63849L,63850L,63851L,63852L,63853L,63854L,63855L,63856L,63857L, 63858L,63859L,63860L,63861L,63862L,63863L,63864L,63865L,63866L,63867L, 63868L,63869L,63870L,63871L,63872L,63873L,63874L,63875L,63876L,63877L, 63878L,63879L,63880L,63881L,63882L,63883L,63884L,63885L,63886L,63887L, 63888L,63889L,63890L,63891L,63892L,63893L,63894L,63895L,63896L,63897L, 63898L,63899L,63900L,63901L,63902L,63903L,63904L,63905L,63906L,63907L, 63908L,63909L,63910L,63911L,63912L,63913L,63914L,63915L,63916L,63917L, 63918L,63919L,63920L,63921L,63922L,63923L,63924L,63925L,63926L,63927L, 63928L,63929L,63930L,63931L,63932L,63933L,63934L,63935L,63936L,63937L, 63938L,63939L,63940L,63941L,63942L,63943L,63944L,63945L,63946L,63947L, 63948L,63949L,63950L,63951L,63952L,63953L,63954L,63955L,63956L,63957L, 63958L,63959L,63960L,63961L,63962L,63963L,63964L,63965L,63966L,63967L, 63968L,63969L,63970L,63971L,63972L,63973L,63974L,63975L,63976L,63977L, 63978L,63979L,63980L,63981L,63982L,63983L,63984L,63985L,63986L,63987L, 63988L,63989L,63990L,63991L,63992L,63993L,63994L,63995L,63996L,63997L, 63998L,63999L,64000L,64001L,64002L,64003L,64004L,64005L,64006L,64007L, 64008L,64009L,64010L,64011L,64012L,64013L,64014L,64015L,64016L,64017L, 64018L,64019L,64020L,64021L,64022L,64023L,64024L,64025L,64026L,64027L, 64028L,64029L,64030L,64031L,64032L,64033L,64034L,64035L,64036L,64037L, 64038L,64039L,64040L,64041L,64042L,64043L,64044L,64045L,64046L,64047L, 64048L,64049L,64050L,64051L,64052L,64053L,64054L,64055L,64056L,64057L, 64058L,64059L,64060L,64061L,64062L,64063L,64064L,64065L,64066L,64067L, 64068L,64069L,64070L,64071L,64072L,64073L,64074L,64075L,64076L,64077L, 64078L,64079L,64080L,64081L,64082L,64083L,64084L,64085L,64086L,64087L, 64088L,64089L,64090L,64091L,64092L,64093L,64094L,64095L,64096L,64097L, 64098L,64099L,64100L,64101L,64102L,64103L,64104L,64105L,64106L,64107L, 64108L,64109L,64110L,64111L,64112L,64113L,64114L,64115L,64116L,64117L, 64118L,64119L,64120L,64121L,64122L,64123L,64124L,64125L,64126L,64127L, 64128L,64129L,64130L,64131L,64132L,64133L,64134L,64135L,64136L,64137L, 64138L,64139L,64140L,64141L,64142L,64143L,64144L,64145L,64146L,64147L, 64148L,64149L,64150L,64151L,64152L,64153L,64154L,64155L,64156L,64157L, 64158L,64159L,64160L,64161L,64162L,64163L,64164L,64165L,64166L,64167L, 64168L,64169L,64170L,64171L,64172L,64173L,64174L,64175L,64176L,64177L, 64178L,64179L,64180L,64181L,64182L,64183L,64184L,64185L,64186L,64187L, 64188L,64189L,64190L,64191L,64192L,64193L,64194L,64195L,64196L,64197L, 64198L,64199L,64200L,64201L,64202L,64203L,64204L,64205L,64206L,64207L, 64208L,64209L,64210L,64211L,64212L,64213L,64214L,64215L,64216L,64217L, 64218L,64219L,64220L,64221L,64222L,64223L,64224L,64225L,64226L,64227L, 64228L,64229L,64230L,64231L,64232L,64233L,64234L,64235L,64236L,64237L, 64238L,64239L,64240L,64241L,64242L,64243L,64244L,64245L,64246L,64247L, 64248L,64249L,64250L,64251L,64252L,64253L,64254L,64255L,64256L,64257L, 64258L,64259L,64260L,64261L,64262L,64263L,64264L,64265L,64266L,64267L, 64268L,64269L,64270L,64271L,64272L,64273L,64274L,64275L,64276L,64277L, 64278L,64279L,64280L,64281L,64282L,64283L,64284L,64285L,64286L,64287L, 64288L,64289L,64290L,64291L,64292L,64293L,64294L,64295L,64296L,64297L, 64298L,64299L,64300L,64301L,64302L,64303L,64304L,64305L,64306L,64307L, 64308L,64309L,64310L,64311L,64312L,64313L,64314L,64315L,64316L,64317L, 64318L,64319L,64320L,64321L,64322L,64323L,64324L,64325L,64326L,64327L, 64328L,64329L,64330L,64331L,64332L,64333L,64334L,64335L,64336L,64337L, 64338L,64339L,64340L,64341L,64342L,64343L,64344L,64345L,64346L,64347L, 64348L,64349L,64350L,64351L,64352L,64353L,64354L,64355L,64356L,64357L, 64358L,64359L,64360L,64361L,64362L,64363L,64364L,64365L,64366L,64367L, 64368L,64369L,64370L,64371L,64372L,64373L,64374L,64375L,64376L,64377L, 64378L,64379L,64380L,64381L,64382L,64383L,64384L,64385L,64386L,64387L, 64388L,64389L,64390L,64391L,64392L,64393L,64394L,64395L,64396L,64397L, 64398L,64399L,64400L,64401L,64402L,64403L,64404L,64405L,64406L,64407L, 64408L,64409L,64410L,64411L,64412L,64413L,64414L,64415L,64416L,64417L, 64418L,64419L,64420L,64421L,64422L,64423L,64424L,64425L,64426L,64427L, 64428L,64429L,64430L,64431L,64432L,64433L,64434L,64435L,64436L,64437L, 64438L,64439L,64440L,64441L,64442L,64443L,64444L,64445L,64446L,64447L, 64448L,64449L,64450L,64451L,64452L,64453L,64454L,64455L,64456L,64457L, 64458L,64459L,64460L,64461L,64462L,64463L,64464L,64465L,64466L,64467L, 64468L,64469L,64470L,64471L,64472L,64473L,64474L,64475L,64476L,64477L, 64478L,64479L,64480L,64481L,64482L,64483L,64484L,64485L,64486L,64487L, 64488L,64489L,64490L,64491L,64492L,64493L,64494L,64495L,64496L,64497L, 64498L,64499L,64500L,64501L,64502L,64503L,64504L,64505L,64506L,64507L, 64508L,64509L,64510L,64511L,64512L,64513L,64514L,64515L,64516L,64517L, 64518L,64519L,64520L,64521L,64522L,64523L,64524L,64525L,64526L,64527L, 64528L,64529L,64530L,64531L,64532L,64533L,64534L,64535L,64536L,64537L, 64538L,64539L,64540L,64541L,64542L,64543L,64544L,64545L,64546L,64547L, 64548L,64549L,64550L,64551L,64552L,64553L,64554L,64555L,64556L,64557L, 64558L,64559L,64560L,64561L,64562L,64563L,64564L,64565L,64566L,64567L, 64568L,64569L,64570L,64571L,64572L,64573L,64574L,64575L,64576L,64577L, 64578L,64579L,64580L,64581L,64582L,64583L,64584L,64585L,64586L,64587L, 64588L,64589L,64590L,64591L,64592L,64593L,64594L,64595L,64596L,64597L, 64598L,64599L,64600L,64601L,64602L,64603L,64604L,64605L,64606L,64607L, 64608L,64609L,64610L,64611L,64612L,64613L,64614L,64615L,64616L,64617L, 64618L,64619L,64620L,64621L,64622L,64623L,64624L,64625L,64626L,64627L, 64628L,64629L,64630L,64631L,64632L,64633L,64634L,64635L,64636L,64637L, 64638L,64639L,64640L,64641L,64642L,64643L,64644L,64645L,64646L,64647L, 64648L,64649L,64650L,64651L,64652L,64653L,64654L,64655L,64656L,64657L, 64658L,64659L,64660L,64661L,64662L,64663L,64664L,64665L,64666L,64667L, 64668L,64669L,64670L,64671L,64672L,64673L,64674L,64675L,64676L,64677L, 64678L,64679L,64680L,64681L,64682L,64683L,64684L,64685L,64686L,64687L, 64688L,64689L,64690L,64691L,64692L,64693L,64694L,64695L,64696L,64697L, 64698L,64699L,64700L,64701L,64702L,64703L,64704L,64705L,64706L,64707L, 64708L,64709L,64710L,64711L,64712L,64713L,64714L,64715L,64716L,64717L, 64718L,64719L,64720L,64721L,64722L,64723L,64724L,64725L,64726L,64727L, 64728L,64729L,64730L,64731L,64732L,64733L,64734L,64735L,64736L,64737L, 64738L,64739L,64740L,64741L,64742L,64743L,64744L,64745L,64746L,64747L, 64748L,64749L,64750L,64751L,64752L,64753L,64754L,64755L,64756L,64757L, 64758L,64759L,64760L,64761L,64762L,64763L,64764L,64765L,64766L,64767L, 64768L,64769L,64770L,64771L,64772L,64773L,64774L,64775L,64776L,64777L, 64778L,64779L,64780L,64781L,64782L,64783L,64784L,64785L,64786L,64787L, 64788L,64789L,64790L,64791L,64792L,64793L,64794L,64795L,64796L,64797L, 64798L,64799L,64800L,64801L,64802L,64803L,64804L,64805L,64806L,64807L, 64808L,64809L,64810L,64811L,64812L,64813L,64814L,64815L,64816L,64817L, 64818L,64819L,64820L,64821L,64822L,64823L,64824L,64825L,64826L,64827L, 64828L,64829L,64830L,64831L,64832L,64833L,64834L,64835L,64836L,64837L, 64838L,64839L,64840L,64841L,64842L,64843L,64844L,64845L,64846L,64847L, 64848L,64849L,64850L,64851L,64852L,64853L,64854L,64855L,64856L,64857L, 64858L,64859L,64860L,64861L,64862L,64863L,64864L,64865L,64866L,64867L, 64868L,64869L,64870L,64871L,64872L,64873L,64874L,64875L,64876L,64877L, 64878L,64879L,64880L,64881L,64882L,64883L,64884L,64885L,64886L,64887L, 64888L,64889L,64890L,64891L,64892L,64893L,64894L,64895L,64896L,64897L, 64898L,64899L,64900L,64901L,64902L,64903L,64904L,64905L,64906L,64907L, 64908L,64909L,64910L,64911L,64912L,64913L,64914L,64915L,64916L,64917L, 64918L,64919L,64920L,64921L,64922L,64923L,64924L,64925L,64926L,64927L, 64928L,64929L,64930L,64931L,64932L,64933L,64934L,64935L,64936L,64937L, 64938L,64939L,64940L,64941L,64942L,64943L,64944L,64945L,64946L,64947L, 64948L,64949L,64950L,64951L,64952L,64953L,64954L,64955L,64956L,64957L, 64958L,64959L,64960L,64961L,64962L,64963L,64964L,64965L,64966L,64967L, 64968L,64969L,64970L,64971L,64972L,64973L,64974L,64975L,64976L,64977L, 64978L,64979L,64980L,64981L,64982L,64983L,64984L,64985L,64986L,64987L, 64988L,64989L,64990L,64991L,64992L,64993L,64994L,64995L,64996L,64997L, 64998L,64999L,65000L,65001L,65002L,65003L,65004L,65005L,65006L,65007L, 65008L,65009L,65010L,65011L,65012L,65013L,65014L,65015L,65016L,65017L, 65018L,65019L,65020L,65021L,65022L,65023L,65024L,65025L,65026L,65027L, 65028L,65029L,65030L,65031L,65032L,65033L,65034L,65035L,65036L,65037L, 65038L,65039L,65040L,65041L,65042L,65043L,65044L,65045L,65046L,65047L, 65048L,65049L,65050L,65051L,65052L,65053L,65054L,65055L,65056L,65057L, 65058L,65059L,65060L,65061L,65062L,65063L,65064L,65065L,65066L,65067L, 65068L,65069L,65070L,65071L,65072L,65073L,65074L,65075L,65076L,65077L, 65078L,65079L,65080L,65081L,65082L,65083L,65084L,65085L,65086L,65087L, 65088L,65089L,65090L,65091L,65092L,65093L,65094L,65095L,65096L,65097L, 65098L,65099L,65100L,65101L,65102L,65103L,65104L,65105L,65106L,65107L, 65108L,65109L,65110L,65111L,65112L,65113L,65114L,65115L,65116L,65117L, 65118L,65119L,65120L,65121L,65122L,65123L,65124L,65125L,65126L,65127L, 65128L,65129L,65130L,65131L,65132L,65133L,65134L,65135L,65136L,65137L, 65138L,65139L,65140L,65141L,65142L,65143L,65144L,65145L,65146L,65147L, 65148L,65149L,65150L,65151L,65152L,65153L,65154L,65155L,65156L,65157L, 65158L,65159L,65160L,65161L,65162L,65163L,65164L,65165L,65166L,65167L, 65168L,65169L,65170L,65171L,65172L,65173L,65174L,65175L,65176L,65177L, 65178L,65179L,65180L,65181L,65182L,65183L,65184L,65185L,65186L,65187L, 65188L,65189L,65190L,65191L,65192L,65193L,65194L,65195L,65196L,65197L, 65198L,65199L,65200L,65201L,65202L,65203L,65204L,65205L,65206L,65207L, 65208L,65209L,65210L,65211L,65212L,65213L,65214L,65215L,65216L,65217L, 65218L,65219L,65220L,65221L,65222L,65223L,65224L,65225L,65226L,65227L, 65228L,65229L,65230L,65231L,65232L,65233L,65234L,65235L,65236L,65237L, 65238L,65239L,65240L,65241L,65242L,65243L,65244L,65245L,65246L,65247L, 65248L,65249L,65250L,65251L,65252L,65253L,65254L,65255L,65256L,65257L, 65258L,65259L,65260L,65261L,65262L,65263L,65264L,65265L,65266L,65267L, 65268L,65269L,65270L,65271L,65272L,65273L,65274L,65275L,65276L,65277L, 65278L,65279L,65280L,65281L,65282L,65283L,65284L,65285L,65286L,65287L, 65288L,65289L,65290L,65291L,65292L,65293L,65294L,65295L,65296L,65297L, 65298L,65299L,65300L,65301L,65302L,65303L,65304L,65305L,65306L,65307L, 65308L,65309L,65310L,65311L,65312L,65313L,65314L,65315L,65316L,65317L, 65318L,65319L,65320L,65321L,65322L,65323L,65324L,65325L,65326L,65327L, 65328L,65329L,65330L,65331L,65332L,65333L,65334L,65335L,65336L,65337L, 65338L,65339L,65340L,65341L,65342L,65343L,65344L,65313L,65314L,65315L, 65316L,65317L,65318L,65319L,65320L,65321L,65322L,65323L,65324L,65325L, 65326L,65327L,65328L,65329L,65330L,65331L,65332L,65333L,65334L,65335L, 65336L,65337L,65338L,65371L,65372L,65373L,65374L,65375L,65376L,65377L, 65378L,65379L,65380L,65381L,65382L,65383L,65384L,65385L,65386L,65387L, 65388L,65389L,65390L,65391L,65392L,65393L,65394L,65395L,65396L,65397L, 65398L,65399L,65400L,65401L,65402L,65403L,65404L,65405L,65406L,65407L, 65408L,65409L,65410L,65411L,65412L,65413L,65414L,65415L,65416L,65417L, 65418L,65419L,65420L,65421L,65422L,65423L,65424L,65425L,65426L,65427L, 65428L,65429L,65430L,65431L,65432L,65433L,65434L,65435L,65436L,65437L, 65438L,65439L,65440L,65441L,65442L,65443L,65444L,65445L,65446L,65447L, 65448L,65449L,65450L,65451L,65452L,65453L,65454L,65455L,65456L,65457L, 65458L,65459L,65460L,65461L,65462L,65463L,65464L,65465L,65466L,65467L, 65468L,65469L,65470L,65471L,65472L,65473L,65474L,65475L,65476L,65477L, 65478L,65479L,65480L,65481L,65482L,65483L,65484L,65485L,65486L,65487L, 65488L,65489L,65490L,65491L,65492L,65493L,65494L,65495L,65496L,65497L, 65498L,65499L,65500L,65501L,65502L,65503L,65504L,65505L,65506L,65507L, 65508L,65509L,65510L,65511L,65512L,65513L,65514L,65515L,65516L,65517L, 65518L,65519L,65520L,65521L,65522L,65523L,65524L,65525L,65526L,65527L, 65528L,65529L,65530L,65531L,65532L,65533L,65534L,65535L, }; #endif #if defined(DUK_USE_REGEXP_CANON_BITMAP) /* * Automatically generated by extract_caseconv.py, do not edit! */ const duk_uint8_t duk_unicode_re_canon_bitmap[256] = { 23,0,224,19,1,228,255,255,255,255,255,255,255,255,255,255,255,255,255,127, 255,255,255,255,255,255,255,255,231,247,0,16,255,227,255,255,63,255,255, 255,255,255,255,255,1,252,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 227,193,255,255,255,147,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,251, }; #endif #line 1 "duk_util_bitdecoder.c" /* * Bitstream decoder. */ /* #include duk_internal.h -> already included */ /* Decode 'bits' bits from the input stream (bits must be 1...24). * When reading past bitstream end, zeroes are shifted in. The result * is signed to match duk_bd_decode_flagged. */ DUK_INTERNAL duk_uint32_t duk_bd_decode(duk_bitdecoder_ctx *ctx, duk_small_int_t bits) { duk_small_int_t shift; duk_uint32_t mask; duk_uint32_t tmp; /* Note: cannot read more than 24 bits without possibly shifting top bits out. * Fixable, but adds complexity. */ DUK_ASSERT(bits >= 1 && bits <= 24); while (ctx->currbits < bits) { #if 0 DUK_DDD(DUK_DDDPRINT("decode_bits: shift more data (bits=%ld, currbits=%ld)", (long) bits, (long) ctx->currbits)); #endif ctx->currval <<= 8; if (ctx->offset < ctx->length) { /* If ctx->offset >= ctx->length, we "shift zeroes in" * instead of croaking. */ ctx->currval |= ctx->data[ctx->offset++]; } ctx->currbits += 8; } #if 0 DUK_DDD(DUK_DDDPRINT("decode_bits: bits=%ld, currbits=%ld, currval=0x%08lx", (long) bits, (long) ctx->currbits, (unsigned long) ctx->currval)); #endif /* Extract 'top' bits of currval; note that the extracted bits do not need * to be cleared, we just ignore them on next round. */ shift = ctx->currbits - bits; mask = (((duk_uint32_t) 1U) << bits) - 1U; tmp = (ctx->currval >> shift) & mask; ctx->currbits = shift; /* remaining */ #if 0 DUK_DDD(DUK_DDDPRINT("decode_bits: %ld bits -> 0x%08lx (%ld), currbits=%ld, currval=0x%08lx", (long) bits, (unsigned long) tmp, (long) tmp, (long) ctx->currbits, (unsigned long) ctx->currval)); #endif return tmp; } DUK_INTERNAL duk_small_uint_t duk_bd_decode_flag(duk_bitdecoder_ctx *ctx) { return (duk_small_uint_t) duk_bd_decode(ctx, 1); } /* Decode a one-bit flag, and if set, decode a value of 'bits', otherwise return * default value. */ DUK_INTERNAL duk_uint32_t duk_bd_decode_flagged(duk_bitdecoder_ctx *ctx, duk_small_int_t bits, duk_uint32_t def_value) { if (duk_bd_decode_flag(ctx)) { return duk_bd_decode(ctx, bits); } else { return def_value; } } /* Signed variant, allows negative marker value. */ DUK_INTERNAL duk_int32_t duk_bd_decode_flagged_signed(duk_bitdecoder_ctx *ctx, duk_small_int_t bits, duk_int32_t def_value) { return (duk_int32_t) duk_bd_decode_flagged(ctx, bits, (duk_uint32_t) def_value); } /* Shared varint encoding. Match dukutil.py BitEncode.varuint(). */ DUK_INTERNAL duk_uint32_t duk_bd_decode_varuint(duk_bitdecoder_ctx *ctx) { duk_small_uint_t t; /* The bit encoding choices here are based on manual testing against * the actual varuints generated by genbuiltins.py. */ switch (duk_bd_decode(ctx, 2)) { case 0: return 0; /* [0,0] */ case 1: return duk_bd_decode(ctx, 2) + 1; /* [1,4] */ case 2: return duk_bd_decode(ctx, 5) + 5; /* [5,36] */ default: t = duk_bd_decode(ctx, 7); if (t == 0) { return duk_bd_decode(ctx, 20); } return (t - 1) + 37; /* [37,163] */ } } /* Decode a bit packed string from a custom format used by genbuiltins.py. * This function is here because it's used for both heap and thread inits. * Caller must supply the output buffer whose size is NOT checked! */ #define DUK__BITPACK_LETTER_LIMIT 26 #define DUK__BITPACK_LOOKUP1 26 #define DUK__BITPACK_LOOKUP2 27 #define DUK__BITPACK_SWITCH1 28 #define DUK__BITPACK_SWITCH 29 #define DUK__BITPACK_UNUSED1 30 #define DUK__BITPACK_EIGHTBIT 31 DUK_LOCAL const duk_uint8_t duk__bitpacked_lookup[16] = { DUK_ASC_0, DUK_ASC_1, DUK_ASC_2, DUK_ASC_3, DUK_ASC_4, DUK_ASC_5, DUK_ASC_6, DUK_ASC_7, DUK_ASC_8, DUK_ASC_9, DUK_ASC_UNDERSCORE, DUK_ASC_SPACE, 0x82, 0x80, DUK_ASC_DOUBLEQUOTE, DUK_ASC_LCURLY }; DUK_INTERNAL duk_small_uint_t duk_bd_decode_bitpacked_string(duk_bitdecoder_ctx *bd, duk_uint8_t *out) { duk_small_uint_t len; duk_small_uint_t mode; duk_small_uint_t t; duk_small_uint_t i; len = duk_bd_decode(bd, 5); if (len == 31) { len = duk_bd_decode(bd, 8); /* Support up to 256 bytes; rare. */ } mode = 32; /* 0 = uppercase, 32 = lowercase (= 'a' - 'A') */ for (i = 0; i < len; i++) { t = duk_bd_decode(bd, 5); if (t < DUK__BITPACK_LETTER_LIMIT) { t = t + DUK_ASC_UC_A + mode; } else if (t == DUK__BITPACK_LOOKUP1) { t = duk__bitpacked_lookup[duk_bd_decode(bd, 3)]; } else if (t == DUK__BITPACK_LOOKUP2) { t = duk__bitpacked_lookup[8 + duk_bd_decode(bd, 3)]; } else if (t == DUK__BITPACK_SWITCH1) { t = duk_bd_decode(bd, 5); DUK_ASSERT_DISABLE(t >= 0); /* unsigned */ DUK_ASSERT(t <= 25); t = t + DUK_ASC_UC_A + (mode ^ 32); } else if (t == DUK__BITPACK_SWITCH) { mode = mode ^ 32; t = duk_bd_decode(bd, 5); DUK_ASSERT_DISABLE(t >= 0); DUK_ASSERT(t <= 25); t = t + DUK_ASC_UC_A + mode; } else if (t == DUK__BITPACK_EIGHTBIT) { t = duk_bd_decode(bd, 8); } out[i] = (duk_uint8_t) t; } return len; } /* automatic undefs */ #undef DUK__BITPACK_EIGHTBIT #undef DUK__BITPACK_LETTER_LIMIT #undef DUK__BITPACK_LOOKUP1 #undef DUK__BITPACK_LOOKUP2 #undef DUK__BITPACK_SWITCH #undef DUK__BITPACK_SWITCH1 #undef DUK__BITPACK_UNUSED1 #line 1 "duk_util_bitencoder.c" /* * Bitstream encoder. */ /* #include duk_internal.h -> already included */ DUK_INTERNAL void duk_be_encode(duk_bitencoder_ctx *ctx, duk_uint32_t data, duk_small_int_t bits) { duk_uint8_t tmp; DUK_ASSERT(ctx != NULL); DUK_ASSERT(ctx->currbits < 8); /* This limitation would be fixable but adds unnecessary complexity. */ DUK_ASSERT(bits >= 1 && bits <= 24); ctx->currval = (ctx->currval << bits) | data; ctx->currbits += bits; while (ctx->currbits >= 8) { if (ctx->offset < ctx->length) { tmp = (duk_uint8_t) ((ctx->currval >> (ctx->currbits - 8)) & 0xff); ctx->data[ctx->offset++] = tmp; } else { /* If buffer has been exhausted, truncate bitstream */ ctx->truncated = 1; } ctx->currbits -= 8; } } DUK_INTERNAL void duk_be_finish(duk_bitencoder_ctx *ctx) { duk_small_int_t npad; DUK_ASSERT(ctx != NULL); DUK_ASSERT(ctx->currbits < 8); npad = (duk_small_int_t) (8 - ctx->currbits); if (npad > 0) { duk_be_encode(ctx, 0, npad); } DUK_ASSERT(ctx->currbits == 0); } #line 1 "duk_util_bufwriter.c" /* * Fast buffer writer with slack management. */ /* #include duk_internal.h -> already included */ /* * Macro support functions (use only macros in calling code) */ DUK_LOCAL void duk__bw_update_ptrs(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx, duk_size_t curr_offset, duk_size_t new_length) { duk_uint8_t *p; DUK_ASSERT(thr != NULL); DUK_ASSERT(bw_ctx != NULL); DUK_UNREF(thr); p = (duk_uint8_t *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, bw_ctx->buf); DUK_ASSERT(p != NULL || (DUK_HBUFFER_DYNAMIC_GET_SIZE(bw_ctx->buf) == 0 && curr_offset == 0 && new_length == 0)); bw_ctx->p = p + curr_offset; bw_ctx->p_base = p; bw_ctx->p_limit = p + new_length; } DUK_INTERNAL void duk_bw_init(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx, duk_hbuffer_dynamic *h_buf) { DUK_ASSERT(thr != NULL); DUK_ASSERT(bw_ctx != NULL); DUK_ASSERT(h_buf != NULL); bw_ctx->buf = h_buf; duk__bw_update_ptrs(thr, bw_ctx, 0, DUK_HBUFFER_DYNAMIC_GET_SIZE(h_buf)); } DUK_INTERNAL void duk_bw_init_pushbuf(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx, duk_size_t buf_size) { DUK_ASSERT(thr != NULL); DUK_ASSERT(bw_ctx != NULL); (void) duk_push_dynamic_buffer(thr, buf_size); bw_ctx->buf = (duk_hbuffer_dynamic *) duk_known_hbuffer(thr, -1); duk__bw_update_ptrs(thr, bw_ctx, 0, buf_size); } /* Resize target buffer for requested size. Called by the macro only when the * fast path test (= there is space) fails. */ DUK_INTERNAL duk_uint8_t *duk_bw_resize(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx, duk_size_t sz) { duk_size_t curr_off; duk_size_t add_sz; duk_size_t new_sz; DUK_ASSERT(thr != NULL); DUK_ASSERT(bw_ctx != NULL); /* We could do this operation without caller updating bw_ctx->ptr, * but by writing it back here we can share code better. */ curr_off = (duk_size_t) (bw_ctx->p - bw_ctx->p_base); add_sz = (curr_off >> DUK_BW_SLACK_SHIFT) + DUK_BW_SLACK_ADD; new_sz = curr_off + sz + add_sz; if (DUK_UNLIKELY(new_sz < curr_off)) { /* overflow */ DUK_ERROR_RANGE(thr, DUK_STR_BUFFER_TOO_LONG); return NULL; /* not reachable */ } #if 0 /* for manual torture testing: tight allocation, useful with valgrind */ new_sz = curr_off + sz; #endif /* This is important to ensure dynamic buffer data pointer is not * NULL (which is possible if buffer size is zero), which in turn * causes portability issues with e.g. memmove() and memcpy(). */ DUK_ASSERT(new_sz >= 1); DUK_DD(DUK_DDPRINT("resize bufferwriter from %ld to %ld (add_sz=%ld)", (long) curr_off, (long) new_sz, (long) add_sz)); duk_hbuffer_resize(thr, bw_ctx->buf, new_sz); duk__bw_update_ptrs(thr, bw_ctx, curr_off, new_sz); return bw_ctx->p; } /* Make buffer compact, matching current written size. */ DUK_INTERNAL void duk_bw_compact(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx) { duk_size_t len; DUK_ASSERT(thr != NULL); DUK_ASSERT(bw_ctx != NULL); DUK_UNREF(thr); len = (duk_size_t) (bw_ctx->p - bw_ctx->p_base); duk_hbuffer_resize(thr, bw_ctx->buf, len); duk__bw_update_ptrs(thr, bw_ctx, len, len); } DUK_INTERNAL void duk_bw_write_raw_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t src_off, duk_size_t len) { duk_uint8_t *p_base; DUK_ASSERT(thr != NULL); DUK_ASSERT(bw != NULL); DUK_ASSERT(src_off <= DUK_BW_GET_SIZE(thr, bw)); DUK_ASSERT(len <= DUK_BW_GET_SIZE(thr, bw)); DUK_ASSERT(src_off + len <= DUK_BW_GET_SIZE(thr, bw)); DUK_UNREF(thr); p_base = bw->p_base; DUK_MEMCPY((void *) bw->p, (const void *) (p_base + src_off), (size_t) len); bw->p += len; } DUK_INTERNAL void duk_bw_write_ensure_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t src_off, duk_size_t len) { DUK_ASSERT(thr != NULL); DUK_ASSERT(bw != NULL); DUK_ASSERT(src_off <= DUK_BW_GET_SIZE(thr, bw)); DUK_ASSERT(len <= DUK_BW_GET_SIZE(thr, bw)); DUK_ASSERT(src_off + len <= DUK_BW_GET_SIZE(thr, bw)); DUK_BW_ENSURE(thr, bw, len); duk_bw_write_raw_slice(thr, bw, src_off, len); } DUK_INTERNAL void duk_bw_insert_raw_bytes(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, const duk_uint8_t *buf, duk_size_t len) { duk_uint8_t *p_base; duk_size_t buf_sz, move_sz; DUK_ASSERT(thr != NULL); DUK_ASSERT(bw != NULL); DUK_ASSERT(dst_off <= DUK_BW_GET_SIZE(thr, bw)); DUK_ASSERT(buf != NULL); DUK_UNREF(thr); p_base = bw->p_base; buf_sz = (duk_size_t) (bw->p - p_base); /* constrained by maximum buffer size */ move_sz = buf_sz - dst_off; DUK_ASSERT(p_base != NULL); /* buffer size is >= 1 */ DUK_MEMMOVE((void *) (p_base + dst_off + len), (const void *) (p_base + dst_off), (size_t) move_sz); DUK_MEMCPY((void *) (p_base + dst_off), (const void *) buf, (size_t) len); bw->p += len; } DUK_INTERNAL void duk_bw_insert_ensure_bytes(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, const duk_uint8_t *buf, duk_size_t len) { DUK_ASSERT(thr != NULL); DUK_ASSERT(bw != NULL); DUK_ASSERT(dst_off <= DUK_BW_GET_SIZE(thr, bw)); DUK_ASSERT(buf != NULL); DUK_BW_ENSURE(thr, bw, len); duk_bw_insert_raw_bytes(thr, bw, dst_off, buf, len); } DUK_INTERNAL void duk_bw_insert_raw_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, duk_size_t src_off, duk_size_t len) { duk_uint8_t *p_base; duk_size_t buf_sz, move_sz; DUK_ASSERT(thr != NULL); DUK_ASSERT(bw != NULL); DUK_ASSERT(dst_off <= DUK_BW_GET_SIZE(thr, bw)); DUK_ASSERT(src_off <= DUK_BW_GET_SIZE(thr, bw)); DUK_ASSERT(len <= DUK_BW_GET_SIZE(thr, bw)); DUK_ASSERT(src_off + len <= DUK_BW_GET_SIZE(thr, bw)); DUK_UNREF(thr); p_base = bw->p_base; /* Don't support "straddled" source now. */ DUK_ASSERT(dst_off <= src_off || dst_off >= src_off + len); if (dst_off <= src_off) { /* Target is before source. Source offset is expressed as * a "before change" offset. Account for the memmove. */ src_off += len; } buf_sz = (duk_size_t) (bw->p - p_base); move_sz = buf_sz - dst_off; DUK_ASSERT(p_base != NULL); /* buffer size is >= 1 */ DUK_MEMMOVE((void *) (p_base + dst_off + len), (const void *) (p_base + dst_off), (size_t) move_sz); DUK_MEMCPY((void *) (p_base + dst_off), (const void *) (p_base + src_off), (size_t) len); bw->p += len; } DUK_INTERNAL void duk_bw_insert_ensure_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, duk_size_t src_off, duk_size_t len) { DUK_ASSERT(thr != NULL); DUK_ASSERT(bw != NULL); DUK_ASSERT(dst_off <= DUK_BW_GET_SIZE(thr, bw)); DUK_ASSERT(src_off <= DUK_BW_GET_SIZE(thr, bw)); DUK_ASSERT(len <= DUK_BW_GET_SIZE(thr, bw)); DUK_ASSERT(src_off + len <= DUK_BW_GET_SIZE(thr, bw)); /* Don't support "straddled" source now. */ DUK_ASSERT(dst_off <= src_off || dst_off >= src_off + len); DUK_BW_ENSURE(thr, bw, len); duk_bw_insert_raw_slice(thr, bw, dst_off, src_off, len); } DUK_INTERNAL duk_uint8_t *duk_bw_insert_raw_area(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t off, duk_size_t len) { duk_uint8_t *p_base, *p_dst, *p_src; duk_size_t buf_sz, move_sz; DUK_ASSERT(thr != NULL); DUK_ASSERT(bw != NULL); DUK_ASSERT(off <= DUK_BW_GET_SIZE(thr, bw)); DUK_UNREF(thr); p_base = bw->p_base; buf_sz = (duk_size_t) (bw->p - p_base); move_sz = buf_sz - off; p_dst = p_base + off + len; p_src = p_base + off; DUK_MEMMOVE((void *) p_dst, (const void *) p_src, (size_t) move_sz); return p_src; /* point to start of 'reserved area' */ } DUK_INTERNAL duk_uint8_t *duk_bw_insert_ensure_area(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t off, duk_size_t len) { DUK_ASSERT(thr != NULL); DUK_ASSERT(bw != NULL); DUK_ASSERT(off <= DUK_BW_GET_SIZE(thr, bw)); DUK_BW_ENSURE(thr, bw, len); return duk_bw_insert_raw_area(thr, bw, off, len); } DUK_INTERNAL void duk_bw_remove_raw_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t off, duk_size_t len) { duk_size_t move_sz; duk_uint8_t *p_base; duk_uint8_t *p_src; duk_uint8_t *p_dst; DUK_ASSERT(thr != NULL); DUK_ASSERT(bw != NULL); DUK_ASSERT(off <= DUK_BW_GET_SIZE(thr, bw)); DUK_ASSERT(len <= DUK_BW_GET_SIZE(thr, bw)); DUK_ASSERT(off + len <= DUK_BW_GET_SIZE(thr, bw)); DUK_UNREF(thr); p_base = bw->p_base; p_dst = p_base + off; p_src = p_dst + len; move_sz = (duk_size_t) (bw->p - p_src); DUK_MEMMOVE((void *) p_dst, (const void *) p_src, (size_t) move_sz); bw->p -= len; } /* * Macro support functions for reading/writing raw data. * * These are done using mempcy to ensure they're valid even for unaligned * reads/writes on platforms where alignment counts. On x86 at least gcc * is able to compile these into a bswap+mov. "Always inline" is used to * ensure these macros compile to minimal code. * * Not really bufwriter related, but currently used together. */ DUK_INTERNAL DUK_ALWAYS_INLINE duk_uint16_t duk_raw_read_u16_be(duk_uint8_t **p) { union { duk_uint8_t b[2]; duk_uint16_t x; } u; DUK_MEMCPY((void *) u.b, (const void *) (*p), (size_t) 2); u.x = DUK_NTOH16(u.x); *p += 2; return u.x; } DUK_INTERNAL DUK_ALWAYS_INLINE duk_uint32_t duk_raw_read_u32_be(duk_uint8_t **p) { union { duk_uint8_t b[4]; duk_uint32_t x; } u; DUK_MEMCPY((void *) u.b, (const void *) (*p), (size_t) 4); u.x = DUK_NTOH32(u.x); *p += 4; return u.x; } DUK_INTERNAL DUK_ALWAYS_INLINE duk_double_t duk_raw_read_double_be(duk_uint8_t **p) { duk_double_union du; union { duk_uint8_t b[4]; duk_uint32_t x; } u; DUK_MEMCPY((void *) u.b, (const void *) (*p), (size_t) 4); u.x = DUK_NTOH32(u.x); du.ui[DUK_DBL_IDX_UI0] = u.x; DUK_MEMCPY((void *) u.b, (const void *) (*p + 4), (size_t) 4); u.x = DUK_NTOH32(u.x); du.ui[DUK_DBL_IDX_UI1] = u.x; *p += 8; return du.d; } DUK_INTERNAL DUK_ALWAYS_INLINE void duk_raw_write_u16_be(duk_uint8_t **p, duk_uint16_t val) { union { duk_uint8_t b[2]; duk_uint16_t x; } u; u.x = DUK_HTON16(val); DUK_MEMCPY((void *) (*p), (const void *) u.b, (size_t) 2); *p += 2; } DUK_INTERNAL DUK_ALWAYS_INLINE void duk_raw_write_u32_be(duk_uint8_t **p, duk_uint32_t val) { union { duk_uint8_t b[4]; duk_uint32_t x; } u; u.x = DUK_HTON32(val); DUK_MEMCPY((void *) (*p), (const void *) u.b, (size_t) 4); *p += 4; } DUK_INTERNAL DUK_ALWAYS_INLINE void duk_raw_write_double_be(duk_uint8_t **p, duk_double_t val) { duk_double_union du; union { duk_uint8_t b[4]; duk_uint32_t x; } u; du.d = val; u.x = du.ui[DUK_DBL_IDX_UI0]; u.x = DUK_HTON32(u.x); DUK_MEMCPY((void *) (*p), (const void *) u.b, (size_t) 4); u.x = du.ui[DUK_DBL_IDX_UI1]; u.x = DUK_HTON32(u.x); DUK_MEMCPY((void *) (*p + 4), (const void *) u.b, (size_t) 4); *p += 8; } #line 1 "duk_util_hashbytes.c" /* * Hash function duk_util_hashbytes(). * * Currently, 32-bit MurmurHash2. * * Don't rely on specific hash values; hash function may be endianness * dependent, for instance. */ /* #include duk_internal.h -> already included */ #if defined(DUK_USE_STRHASH_DENSE) /* 'magic' constants for Murmurhash2 */ #define DUK__MAGIC_M ((duk_uint32_t) 0x5bd1e995UL) #define DUK__MAGIC_R 24 DUK_INTERNAL duk_uint32_t duk_util_hashbytes(const duk_uint8_t *data, duk_size_t len, duk_uint32_t seed) { duk_uint32_t h = seed ^ ((duk_uint32_t) len); while (len >= 4) { /* Portability workaround is required for platforms without * unaligned access. The replacement code emulates little * endian access even on big endian architectures, which is * OK as long as it is consistent for a build. */ #if defined(DUK_USE_HASHBYTES_UNALIGNED_U32_ACCESS) duk_uint32_t k = *((const duk_uint32_t *) (const void *) data); #else duk_uint32_t k = ((duk_uint32_t) data[0]) | (((duk_uint32_t) data[1]) << 8) | (((duk_uint32_t) data[2]) << 16) | (((duk_uint32_t) data[3]) << 24); #endif k *= DUK__MAGIC_M; k ^= k >> DUK__MAGIC_R; k *= DUK__MAGIC_M; h *= DUK__MAGIC_M; h ^= k; data += 4; len -= 4; } switch (len) { case 3: h ^= data[2] << 16; case 2: h ^= data[1] << 8; case 1: h ^= data[0]; h *= DUK__MAGIC_M; } h ^= h >> 13; h *= DUK__MAGIC_M; h ^= h >> 15; return h; } #endif /* DUK_USE_STRHASH_DENSE */ /* automatic undefs */ #undef DUK__MAGIC_M #undef DUK__MAGIC_R #line 1 "duk_util_tinyrandom.c" /* * A tiny random number generator used for Math.random() and other internals. * * Default algorithm is xoroshiro128+: http://xoroshiro.di.unimi.it/xoroshiro128plus.c * with SplitMix64 seed preparation: http://xorshift.di.unimi.it/splitmix64.c. * * Low memory targets and targets without 64-bit types use a slightly smaller * (but slower) algorithm by Adi Shamir: * http://www.woodmann.com/forum/archive/index.php/t-3100.html. * */ /* #include duk_internal.h -> already included */ #if !defined(DUK_USE_GET_RANDOM_DOUBLE) #if defined(DUK_USE_PREFER_SIZE) || !defined(DUK_USE_64BIT_OPS) #define DUK__RANDOM_SHAMIR3OP #else #define DUK__RANDOM_XOROSHIRO128PLUS #endif #if defined(DUK__RANDOM_SHAMIR3OP) #define DUK__UPDATE_RND(rnd) do { \ (rnd) += ((rnd) * (rnd)) | 0x05UL; \ (rnd) = ((rnd) & 0xffffffffUL); /* if duk_uint32_t is exactly 32 bits, this is a NOP */ \ } while (0) #define DUK__RND_BIT(rnd) ((rnd) >> 31) /* only use the highest bit */ DUK_INTERNAL void duk_util_tinyrandom_prepare_seed(duk_hthread *thr) { DUK_UNREF(thr); /* Nothing now. */ } DUK_INTERNAL duk_double_t duk_util_tinyrandom_get_double(duk_hthread *thr) { duk_double_t t; duk_small_int_t n; duk_uint32_t rnd; rnd = thr->heap->rnd_state; n = 53; /* enough to cover the whole mantissa */ t = 0.0; do { DUK__UPDATE_RND(rnd); t += DUK__RND_BIT(rnd); t /= 2.0; } while (--n); thr->heap->rnd_state = rnd; DUK_ASSERT(t >= (duk_double_t) 0.0); DUK_ASSERT(t < (duk_double_t) 1.0); return t; } #endif /* DUK__RANDOM_SHAMIR3OP */ #if defined(DUK__RANDOM_XOROSHIRO128PLUS) DUK_LOCAL DUK_ALWAYS_INLINE duk_uint64_t duk__rnd_splitmix64(duk_uint64_t *x) { duk_uint64_t z; z = (*x += DUK_U64_CONSTANT(0x9E3779B97F4A7C15)); z = (z ^ (z >> 30U)) * DUK_U64_CONSTANT(0xBF58476D1CE4E5B9); z = (z ^ (z >> 27U)) * DUK_U64_CONSTANT(0x94D049BB133111EB); return z ^ (z >> 31U); } DUK_LOCAL DUK_ALWAYS_INLINE duk_uint64_t duk__rnd_rotl(const duk_uint64_t x, duk_small_uint_t k) { return (x << k) | (x >> (64U - k)); } DUK_LOCAL DUK_ALWAYS_INLINE duk_uint64_t duk__xoroshiro128plus(duk_uint64_t *s) { duk_uint64_t s0; duk_uint64_t s1; duk_uint64_t res; s0 = s[0]; s1 = s[1]; res = s0 + s1; s1 ^= s0; s[0] = duk__rnd_rotl(s0, 55) ^ s1 ^ (s1 << 14U); s[1] = duk__rnd_rotl(s1, 36); return res; } DUK_INTERNAL void duk_util_tinyrandom_prepare_seed(duk_hthread *thr) { duk_small_uint_t i; duk_uint64_t x; /* Mix both halves of the initial seed with SplitMix64. The intent * is to ensure that very similar raw seeds (which is usually the case * because current seed is Date.now()) result in different xoroshiro128+ * seeds. */ x = thr->heap->rnd_state[0]; /* Only [0] is used as input here. */ for (i = 0; i < 64; i++) { thr->heap->rnd_state[i & 0x01] = duk__rnd_splitmix64(&x); /* Keep last 2 values. */ } } DUK_INTERNAL duk_double_t duk_util_tinyrandom_get_double(duk_hthread *thr) { duk_uint64_t v; duk_double_union du; /* For big and little endian the integer and IEEE double byte order * is the same so a direct assignment works. For mixed endian the * 32-bit parts must be swapped. */ v = (DUK_U64_CONSTANT(0x3ff) << 52U) | (duk__xoroshiro128plus((duk_uint64_t *) thr->heap->rnd_state) >> 12U); du.ull[0] = v; #if defined(DUK_USE_DOUBLE_ME) do { duk_uint32_t tmp; tmp = du.ui[0]; du.ui[0] = du.ui[1]; du.ui[1] = tmp; } while (0); #endif return du.d - 1.0; } #endif /* DUK__RANDOM_XOROSHIRO128PLUS */ #endif /* !DUK_USE_GET_RANDOM_DOUBLE */ /* automatic undefs */ #undef DUK__RANDOM_SHAMIR3OP #undef DUK__RANDOM_XOROSHIRO128PLUS #undef DUK__RND_BIT #undef DUK__UPDATE_RND ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/duktape.go ================================================ package duktape /* #cgo !windows CFLAGS: -std=c99 -O3 -Wall -fomit-frame-pointer -fstrict-aliasing #cgo windows CFLAGS: -O3 -Wall -fomit-frame-pointer -fstrict-aliasing #cgo linux LDFLAGS: -lm #cgo freebsd LDFLAGS: -lm #cgo openbsd LDFLAGS: -lm #include "duktape.h" #include "duk_logging.h" #include "duk_print_alert.h" #include "duk_module_duktape.h" #include "duk_console.h" extern duk_ret_t goFunctionCall(duk_context *ctx); extern void goFinalizeCall(duk_context *ctx); */ import "C" import ( "errors" "fmt" "regexp" "sync" "unsafe" ) var reFuncName = regexp.MustCompile("^[a-z_][a-z0-9_]*([A-Z_][a-z0-9_]*)*$") const ( goFunctionPtrProp = "\xff" + "goFunctionPtrProp" goContextPtrProp = "\xff" + "goContextPtrProp" ) type Context struct { *context } // transmute replaces the value from Context with the value of pointer func (c *Context) transmute(p unsafe.Pointer) { *c = *(*Context)(p) } // this is a pojo containing only the values of the Context type context struct { sync.Mutex duk_context *C.duk_context fnIndex *functionIndex timerIndex *timerIndex } // New returns plain initialized duktape context object // See: http://duktape.org/api.html#duk_create_heap_default func New() *Context { d := &Context{ &context{ duk_context: C.duk_create_heap(nil, nil, nil, nil, nil), fnIndex: newFunctionIndex(), timerIndex: &timerIndex{}, }, } ctx := d.duk_context C.duk_logging_init(ctx, 0) C.duk_print_alert_init(ctx, 0) C.duk_module_duktape_init(ctx) C.duk_console_init(ctx, 0) return d } // Flags is a set of flags for controlling the behaviour of duktape. type Flags struct { Logging uint PrintAlert uint Console uint } // FlagConsoleProxyWrapper is a Console flag. // Use a proxy wrapper to make undefined methods (console.foo()) no-ops. const FlagConsoleProxyWrapper = 1 << 0 // FlagConsoleFlush is a Console flag. // Flush output after every call. const FlagConsoleFlush = 1 << 1 // NewWithFlags returns plain initialized duktape context object // You can control the behaviour of duktape by setting flags. // See: http://duktape.org/api.html#duk_create_heap_default func NewWithFlags(flags *Flags) *Context { d := &Context{ &context{ duk_context: C.duk_create_heap(nil, nil, nil, nil, nil), fnIndex: newFunctionIndex(), timerIndex: &timerIndex{}, }, } ctx := d.duk_context C.duk_logging_init(ctx, C.duk_uint_t(flags.Logging)) C.duk_print_alert_init(ctx, C.duk_uint_t(flags.PrintAlert)) C.duk_module_duktape_init(ctx) C.duk_console_init(ctx, C.duk_uint_t(flags.Console)) return d } func contextFromPointer(ctx *C.duk_context) *Context { return &Context{&context{duk_context: ctx}} } // PushGlobalGoFunction push the given function into duktape global object // Returns non-negative index (relative to stack bottom) of the pushed function // also returns error if the function name is invalid func (d *Context) PushGlobalGoFunction(name string, fn func(*Context) int) (int, error) { if !reFuncName.MatchString(name) { return -1, errors.New("Malformed function name '" + name + "'") } d.PushGlobalObject() idx := d.PushGoFunction(fn) d.PutPropString(-2, name) d.Pop() return idx, nil } // PushGoFunction push the given function into duktape stack, returns non-negative // index (relative to stack bottom) of the pushed function func (d *Context) PushGoFunction(fn func(*Context) int) int { funPtr := d.fnIndex.add(fn) ctxPtr := contexts.add(d) idx := d.PushCFunction((*[0]byte)(C.goFunctionCall), C.DUK_VARARGS) d.PushCFunction((*[0]byte)(C.goFinalizeCall), 1) d.PushPointer(funPtr) d.PutPropString(-2, goFunctionPtrProp) d.PushPointer(ctxPtr) d.PutPropString(-2, goContextPtrProp) d.SetFinalizer(-2) d.PushPointer(funPtr) d.PutPropString(-2, goFunctionPtrProp) d.PushPointer(ctxPtr) d.PutPropString(-2, goContextPtrProp) return idx } //export goFunctionCall func goFunctionCall(cCtx *C.duk_context) C.duk_ret_t { d := contextFromPointer(cCtx) funPtr, ctx := d.getFunctionPtrs() d.transmute(unsafe.Pointer(ctx)) result := d.fnIndex.get(funPtr)(d) return C.duk_ret_t(result) } //export goFinalizeCall func goFinalizeCall(cCtx *C.duk_context) { d := contextFromPointer(cCtx) funPtr, ctx := d.getFunctionPtrs() d.transmute(unsafe.Pointer(ctx)) d.fnIndex.delete(funPtr) } func (d *Context) getFunctionPtrs() (unsafe.Pointer, *Context) { d.PushCurrentFunction() d.GetPropString(-1, goFunctionPtrProp) funPtr := d.GetPointer(-1) d.Pop() d.GetPropString(-1, goContextPtrProp) ctx := contexts.get(d.GetPointer(-1)) d.Pop2() return funPtr, ctx } // Destroy destroy all the references to the functions and freed the pointers func (d *Context) Destroy() { d.fnIndex.destroy() contexts.delete(d) } type Error struct { Type string Message string FileName string LineNumber int Stack string } func (e *Error) Error() string { return fmt.Sprintf("%s: %s", e.Type, e.Message) } type Type int func (t Type) IsNone() bool { return t == TypeNone } func (t Type) IsUndefined() bool { return t == TypeUndefined } func (t Type) IsNull() bool { return t == TypeNull } func (t Type) IsBool() bool { return t == TypeBoolean } func (t Type) IsNumber() bool { return t == TypeNumber } func (t Type) IsString() bool { return t == TypeString } func (t Type) IsObject() bool { return t == TypeObject } func (t Type) IsBuffer() bool { return t == TypeBuffer } func (t Type) IsPointer() bool { return t == TypePointer } func (t Type) IsLightFunc() bool { return t == TypeLightFunc } func (t Type) String() string { switch t { case TypeNone: return "None" case TypeUndefined: return "Undefined" case TypeNull: return "Null" case TypeBoolean: return "Boolean" case TypeNumber: return "Number" case TypeString: return "String" case TypeObject: return "Object" case TypeBuffer: return "Buffer" case TypePointer: return "Pointer" case TypeLightFunc: return "LightFunc" default: return "Unknown" } } type functionIndex struct { functions map[unsafe.Pointer]func(*Context) int sync.RWMutex } type timerIndex struct { c float64 sync.Mutex } func (t *timerIndex) get() float64 { t.Lock() defer t.Unlock() t.c++ return t.c } func newFunctionIndex() *functionIndex { return &functionIndex{ functions: make(map[unsafe.Pointer]func(*Context) int, 0), } } func (i *functionIndex) add(fn func(*Context) int) unsafe.Pointer { ptr := C.malloc(1) i.Lock() i.functions[ptr] = fn i.Unlock() return ptr } func (i *functionIndex) get(ptr unsafe.Pointer) func(*Context) int { i.RLock() fn := i.functions[ptr] i.RUnlock() return fn } func (i *functionIndex) delete(ptr unsafe.Pointer) { i.Lock() delete(i.functions, ptr) i.Unlock() C.free(ptr) } func (i *functionIndex) destroy() { i.Lock() for ptr, _ := range i.functions { delete(i.functions, ptr) C.free(ptr) } i.Unlock() } type ctxIndex struct { sync.RWMutex ctxs map[unsafe.Pointer]*Context } func (ci *ctxIndex) add(ctx *Context) unsafe.Pointer { ci.RLock() for ptr, ctxPtr := range ci.ctxs { if ctxPtr == ctx { ci.RUnlock() return ptr } } ci.RUnlock() ci.Lock() for ptr, ctxPtr := range ci.ctxs { if ctxPtr == ctx { ci.Unlock() return ptr } } ptr := C.malloc(1) ci.ctxs[ptr] = ctx ci.Unlock() return ptr } func (ci *ctxIndex) get(ptr unsafe.Pointer) *Context { ci.RLock() ctx := ci.ctxs[ptr] ci.RUnlock() return ctx } func (ci *ctxIndex) delete(ctx *Context) { ci.Lock() for ptr, ctxPtr := range ci.ctxs { if ctxPtr == ctx { delete(ci.ctxs, ptr) C.free(ptr) ci.Unlock() return } } panic(fmt.Sprintf("context (%p) doesn't exist", ctx)) } var contexts *ctxIndex func init() { contexts = &ctxIndex{ ctxs: make(map[unsafe.Pointer]*Context), } } ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/duktape.h ================================================ /* * Duktape public API for Duktape 2.2.0. * * See the API reference for documentation on call semantics. The exposed, * supported API is between the "BEGIN PUBLIC API" and "END PUBLIC API" * comments. Other parts of the header are Duktape internal and related to * e.g. platform/compiler/feature detection. * * Git commit a459cf3c9bd1779fc01b435d69302b742675a08f (v2.2.0). * Git branch master. * * See Duktape AUTHORS.rst and LICENSE.txt for copyright and * licensing information. */ /* LICENSE.txt */ /* * =============== * Duktape license * =============== * * (http://opensource.org/licenses/MIT) * * Copyright (c) 2013-2017 by Duktape authors (see AUTHORS.rst) * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ /* AUTHORS.rst */ /* * =============== * Duktape authors * =============== * * Copyright * ========= * * Duktape copyrights are held by its authors. Each author has a copyright * to their contribution, and agrees to irrevocably license the contribution * under the Duktape ``LICENSE.txt``. * * Authors * ======= * * Please include an e-mail address, a link to your GitHub profile, or something * similar to allow your contribution to be identified accurately. * * The following people have contributed code, website contents, or Wiki contents, * and agreed to irrevocably license their contributions under the Duktape * ``LICENSE.txt`` (in order of appearance): * * * Sami Vaarala <sami.vaarala@iki.fi> * * Niki Dobrev * * Andreas \u00d6man <andreas@lonelycoder.com> * * L\u00e1szl\u00f3 Lang\u00f3 <llango.u-szeged@partner.samsung.com> * * Legimet <legimet.calc@gmail.com> * * Karl Skomski <karl@skomski.com> * * Bruce Pascoe <fatcerberus1@gmail.com> * * Ren\u00e9 Hollander <rene@rene8888.at> * * Julien Hamaide (https://github.com/crazyjul) * * Sebastian G\u00f6tte (https://github.com/jaseg) * * Tomasz Magulski (https://github.com/magul) * * \D. Bohdan (https://github.com/dbohdan) * * Ond\u0159ej Jirman (https://github.com/megous) * * Sa\u00fal Ibarra Corretg\u00e9 <saghul@gmail.com> * * Jeremy HU <huxingyi@msn.com> * * Ole Andr\u00e9 Vadla Ravn\u00e5s (https://github.com/oleavr) * * Harold Brenes (https://github.com/harold-b) * * Oliver Crow (https://github.com/ocrow) * * Jakub Ch\u0142api\u0144ski (https://github.com/jchlapinski) * * Brett Vickers (https://github.com/beevik) * * Dominik Okwieka (https://github.com/okitec) * * Remko Tron\u00e7on (https://el-tramo.be) * * Romero Malaquias (rbsm@ic.ufal.br) * * Michael Drake <michael.drake@codethink.co.uk> * * Steven Don (https://github.com/shdon) * * Simon Stone (https://github.com/sstone1) * * \J. McC. (https://github.com/jmhmccr) * * Other contributions * =================== * * The following people have contributed something other than code (e.g. reported * bugs, provided ideas, etc; roughly in order of appearance): * * * Greg Burns * * Anthony Rabine * * Carlos Costa * * Aur\u00e9lien Bouilland * * Preet Desai (Pris Matic) * * judofyr (http://www.reddit.com/user/judofyr) * * Jason Woofenden * * Micha\u0142 Przyby\u015b * * Anthony Howe * * Conrad Pankoff * * Jim Schimpf * * Rajaran Gaunker (https://github.com/zimbabao) * * Andreas \u00d6man * * Doug Sanden * * Josh Engebretson (https://github.com/JoshEngebretson) * * Remo Eichenberger (https://github.com/remoe) * * Mamod Mehyar (https://github.com/mamod) * * David Demelier (https://github.com/markand) * * Tim Caswell (https://github.com/creationix) * * Mitchell Blank Jr (https://github.com/mitchblank) * * https://github.com/yushli * * Seo Sanghyeon (https://github.com/sanxiyn) * * Han ChoongWoo (https://github.com/tunz) * * Joshua Peek (https://github.com/josh) * * Bruce E. Pascoe (https://github.com/fatcerberus) * * https://github.com/Kelledin * * https://github.com/sstruchtrup * * Michael Drake (https://github.com/tlsa) * * https://github.com/chris-y * * Laurent Zubiaur (https://github.com/lzubiaur) * * Neil Kolban (https://github.com/nkolban) * * If you are accidentally missing from this list, send me an e-mail * (``sami.vaarala@iki.fi``) and I'll fix the omission. */ #if !defined(DUKTAPE_H_INCLUDED) #define DUKTAPE_H_INCLUDED #define DUK_SINGLE_FILE /* * BEGIN PUBLIC API */ /* * Version and Git commit identification */ /* Duktape version, (major * 10000) + (minor * 100) + patch. Allows C code * to #if (DUK_VERSION >= NNN) against Duktape API version. The same value * is also available to Ecmascript code in Duktape.version. Unofficial * development snapshots have 99 for patch level (e.g. 0.10.99 would be a * development version after 0.10.0 but before the next official release). */ #define DUK_VERSION 20200L /* Git commit, describe, and branch for Duktape build. Useful for * non-official snapshot builds so that application code can easily log * which Duktape snapshot was used. Not available in the Ecmascript * environment. */ #define DUK_GIT_COMMIT "a459cf3c9bd1779fc01b435d69302b742675a08f" #define DUK_GIT_DESCRIBE "v2.2.0" #define DUK_GIT_BRANCH "master" /* External duk_config.h provides platform/compiler/OS dependent * typedefs and macros, and DUK_USE_xxx config options so that * the rest of Duktape doesn't need to do any feature detection. * DUK_VERSION is defined before including so that configuration * snippets can react to it. */ #include "duk_config.h" /* * Avoid C++ name mangling */ #if defined(__cplusplus) extern "C" { #endif /* * Some defines forwarded from feature detection */ #undef DUK_API_VARIADIC_MACROS #if defined(DUK_USE_VARIADIC_MACROS) #define DUK_API_VARIADIC_MACROS #endif #define DUK_API_NORETURN(decl) DUK_NORETURN(decl) /* * Public API specific typedefs * * Many types are wrapped by Duktape for portability to rare platforms * where e.g. 'int' is a 16-bit type. See practical typing discussion * in Duktape web documentation. */ struct duk_thread_state; struct duk_memory_functions; struct duk_function_list_entry; struct duk_number_list_entry; struct duk_time_components; /* duk_context is now defined in duk_config.h because it may also be * referenced there by prototypes. */ typedef struct duk_thread_state duk_thread_state; typedef struct duk_memory_functions duk_memory_functions; typedef struct duk_function_list_entry duk_function_list_entry; typedef struct duk_number_list_entry duk_number_list_entry; typedef struct duk_time_components duk_time_components; typedef duk_ret_t (*duk_c_function)(duk_context *ctx); typedef void *(*duk_alloc_function) (void *udata, duk_size_t size); typedef void *(*duk_realloc_function) (void *udata, void *ptr, duk_size_t size); typedef void (*duk_free_function) (void *udata, void *ptr); typedef void (*duk_fatal_function) (void *udata, const char *msg); typedef void (*duk_decode_char_function) (void *udata, duk_codepoint_t codepoint); typedef duk_codepoint_t (*duk_map_char_function) (void *udata, duk_codepoint_t codepoint); typedef duk_ret_t (*duk_safe_call_function) (duk_context *ctx, void *udata); typedef duk_size_t (*duk_debug_read_function) (void *udata, char *buffer, duk_size_t length); typedef duk_size_t (*duk_debug_write_function) (void *udata, const char *buffer, duk_size_t length); typedef duk_size_t (*duk_debug_peek_function) (void *udata); typedef void (*duk_debug_read_flush_function) (void *udata); typedef void (*duk_debug_write_flush_function) (void *udata); typedef duk_idx_t (*duk_debug_request_function) (duk_context *ctx, void *udata, duk_idx_t nvalues); typedef void (*duk_debug_detached_function) (duk_context *ctx, void *udata); struct duk_thread_state { /* XXX: Enough space to hold internal suspend/resume structure. * This is rather awkward and to be fixed when the internal * structure is visible for the public API header. */ char data[128]; }; struct duk_memory_functions { duk_alloc_function alloc_func; duk_realloc_function realloc_func; duk_free_function free_func; void *udata; }; struct duk_function_list_entry { const char *key; duk_c_function value; duk_idx_t nargs; }; struct duk_number_list_entry { const char *key; duk_double_t value; }; struct duk_time_components { duk_double_t year; /* year, e.g. 2016, Ecmascript year range */ duk_double_t month; /* month: 1-12 */ duk_double_t day; /* day: 1-31 */ duk_double_t hours; /* hour: 0-59 */ duk_double_t minutes; /* minute: 0-59 */ duk_double_t seconds; /* second: 0-59 (in POSIX time no leap second) */ duk_double_t milliseconds; /* may contain sub-millisecond fractions */ duk_double_t weekday; /* weekday: 0-6, 0=Sunday, 1=Monday, ..., 6=Saturday */ }; /* * Constants */ /* Duktape debug protocol version used by this build. */ #define DUK_DEBUG_PROTOCOL_VERSION 2 /* Used to represent invalid index; if caller uses this without checking, * this index will map to a non-existent stack entry. Also used in some * API calls as a marker to denote "no value". */ #define DUK_INVALID_INDEX DUK_IDX_MIN /* Indicates that a native function does not have a fixed number of args, * and the argument stack should not be capped/extended at all. */ #define DUK_VARARGS ((duk_int_t) (-1)) /* Number of value stack entries (in addition to actual call arguments) * guaranteed to be allocated on entry to a Duktape/C function. */ #define DUK_API_ENTRY_STACK 64U /* Value types, used by e.g. duk_get_type() */ #define DUK_TYPE_MIN 0U #define DUK_TYPE_NONE 0U /* no value, e.g. invalid index */ #define DUK_TYPE_UNDEFINED 1U /* Ecmascript undefined */ #define DUK_TYPE_NULL 2U /* Ecmascript null */ #define DUK_TYPE_BOOLEAN 3U /* Ecmascript boolean: 0 or 1 */ #define DUK_TYPE_NUMBER 4U /* Ecmascript number: double */ #define DUK_TYPE_STRING 5U /* Ecmascript string: CESU-8 / extended UTF-8 encoded */ #define DUK_TYPE_OBJECT 6U /* Ecmascript object: includes objects, arrays, functions, threads */ #define DUK_TYPE_BUFFER 7U /* fixed or dynamic, garbage collected byte buffer */ #define DUK_TYPE_POINTER 8U /* raw void pointer */ #define DUK_TYPE_LIGHTFUNC 9U /* lightweight function pointer */ #define DUK_TYPE_MAX 9U /* Value mask types, used by e.g. duk_get_type_mask() */ #define DUK_TYPE_MASK_NONE (1U << DUK_TYPE_NONE) #define DUK_TYPE_MASK_UNDEFINED (1U << DUK_TYPE_UNDEFINED) #define DUK_TYPE_MASK_NULL (1U << DUK_TYPE_NULL) #define DUK_TYPE_MASK_BOOLEAN (1U << DUK_TYPE_BOOLEAN) #define DUK_TYPE_MASK_NUMBER (1U << DUK_TYPE_NUMBER) #define DUK_TYPE_MASK_STRING (1U << DUK_TYPE_STRING) #define DUK_TYPE_MASK_OBJECT (1U << DUK_TYPE_OBJECT) #define DUK_TYPE_MASK_BUFFER (1U << DUK_TYPE_BUFFER) #define DUK_TYPE_MASK_POINTER (1U << DUK_TYPE_POINTER) #define DUK_TYPE_MASK_LIGHTFUNC (1U << DUK_TYPE_LIGHTFUNC) #define DUK_TYPE_MASK_THROW (1U << 10) /* internal flag value: throw if mask doesn't match */ #define DUK_TYPE_MASK_PROMOTE (1U << 11) /* internal flag value: promote to object if mask matches */ /* Coercion hints */ #define DUK_HINT_NONE 0 /* prefer number, unless input is a Date, in which * case prefer string (E5 Section 8.12.8) */ #define DUK_HINT_STRING 1 /* prefer string */ #define DUK_HINT_NUMBER 2 /* prefer number */ /* Enumeration flags for duk_enum() */ #define DUK_ENUM_INCLUDE_NONENUMERABLE (1U << 0) /* enumerate non-numerable properties in addition to enumerable */ #define DUK_ENUM_INCLUDE_HIDDEN (1U << 1) /* enumerate hidden symbols too (in Duktape 1.x called internal properties) */ #define DUK_ENUM_INCLUDE_SYMBOLS (1U << 2) /* enumerate symbols */ #define DUK_ENUM_EXCLUDE_STRINGS (1U << 3) /* exclude strings */ #define DUK_ENUM_OWN_PROPERTIES_ONLY (1U << 4) /* don't walk prototype chain, only check own properties */ #define DUK_ENUM_ARRAY_INDICES_ONLY (1U << 5) /* only enumerate array indices */ /* XXX: misleading name */ #define DUK_ENUM_SORT_ARRAY_INDICES (1U << 6) /* sort array indices (applied to full enumeration result, including inherited array indices); XXX: misleading name */ #define DUK_ENUM_NO_PROXY_BEHAVIOR (1U << 7) /* enumerate a proxy object itself without invoking proxy behavior */ /* Compilation flags for duk_compile() and duk_eval() */ /* DUK_COMPILE_xxx bits 0-2 are reserved for an internal 'nargs' argument. */ #define DUK_COMPILE_EVAL (1U << 3) /* compile eval code (instead of global code) */ #define DUK_COMPILE_FUNCTION (1U << 4) /* compile function code (instead of global code) */ #define DUK_COMPILE_STRICT (1U << 5) /* use strict (outer) context for global, eval, or function code */ #define DUK_COMPILE_SHEBANG (1U << 6) /* allow shebang ('#! ...') comment on first line of source */ #define DUK_COMPILE_SAFE (1U << 7) /* (internal) catch compilation errors */ #define DUK_COMPILE_NORESULT (1U << 8) /* (internal) omit eval result */ #define DUK_COMPILE_NOSOURCE (1U << 9) /* (internal) no source string on stack */ #define DUK_COMPILE_STRLEN (1U << 10) /* (internal) take strlen() of src_buffer (avoids double evaluation in macro) */ #define DUK_COMPILE_NOFILENAME (1U << 11) /* (internal) no filename on stack */ #define DUK_COMPILE_FUNCEXPR (1U << 12) /* (internal) source is a function expression (used for Function constructor) */ /* Flags for duk_def_prop() and its variants; base flags + a lot of convenience shorthands */ #define DUK_DEFPROP_WRITABLE (1U << 0) /* set writable (effective if DUK_DEFPROP_HAVE_WRITABLE set) */ #define DUK_DEFPROP_ENUMERABLE (1U << 1) /* set enumerable (effective if DUK_DEFPROP_HAVE_ENUMERABLE set) */ #define DUK_DEFPROP_CONFIGURABLE (1U << 2) /* set configurable (effective if DUK_DEFPROP_HAVE_CONFIGURABLE set) */ #define DUK_DEFPROP_HAVE_WRITABLE (1U << 3) /* set/clear writable */ #define DUK_DEFPROP_HAVE_ENUMERABLE (1U << 4) /* set/clear enumerable */ #define DUK_DEFPROP_HAVE_CONFIGURABLE (1U << 5) /* set/clear configurable */ #define DUK_DEFPROP_HAVE_VALUE (1U << 6) /* set value (given on value stack) */ #define DUK_DEFPROP_HAVE_GETTER (1U << 7) /* set getter (given on value stack) */ #define DUK_DEFPROP_HAVE_SETTER (1U << 8) /* set setter (given on value stack) */ #define DUK_DEFPROP_FORCE (1U << 9) /* force change if possible, may still fail for e.g. virtual properties */ #define DUK_DEFPROP_SET_WRITABLE (DUK_DEFPROP_HAVE_WRITABLE | DUK_DEFPROP_WRITABLE) #define DUK_DEFPROP_CLEAR_WRITABLE DUK_DEFPROP_HAVE_WRITABLE #define DUK_DEFPROP_SET_ENUMERABLE (DUK_DEFPROP_HAVE_ENUMERABLE | DUK_DEFPROP_ENUMERABLE) #define DUK_DEFPROP_CLEAR_ENUMERABLE DUK_DEFPROP_HAVE_ENUMERABLE #define DUK_DEFPROP_SET_CONFIGURABLE (DUK_DEFPROP_HAVE_CONFIGURABLE | DUK_DEFPROP_CONFIGURABLE) #define DUK_DEFPROP_CLEAR_CONFIGURABLE DUK_DEFPROP_HAVE_CONFIGURABLE #define DUK_DEFPROP_W DUK_DEFPROP_WRITABLE #define DUK_DEFPROP_E DUK_DEFPROP_ENUMERABLE #define DUK_DEFPROP_C DUK_DEFPROP_CONFIGURABLE #define DUK_DEFPROP_WE (DUK_DEFPROP_WRITABLE | DUK_DEFPROP_ENUMERABLE) #define DUK_DEFPROP_WC (DUK_DEFPROP_WRITABLE | DUK_DEFPROP_CONFIGURABLE) #define DUK_DEFPROP_WEC (DUK_DEFPROP_WRITABLE | DUK_DEFPROP_ENUMERABLE | DUK_DEFPROP_CONFIGURABLE) #define DUK_DEFPROP_HAVE_W DUK_DEFPROP_HAVE_WRITABLE #define DUK_DEFPROP_HAVE_E DUK_DEFPROP_HAVE_ENUMERABLE #define DUK_DEFPROP_HAVE_C DUK_DEFPROP_HAVE_CONFIGURABLE #define DUK_DEFPROP_HAVE_WE (DUK_DEFPROP_HAVE_WRITABLE | DUK_DEFPROP_HAVE_ENUMERABLE) #define DUK_DEFPROP_HAVE_WC (DUK_DEFPROP_HAVE_WRITABLE | DUK_DEFPROP_HAVE_CONFIGURABLE) #define DUK_DEFPROP_HAVE_WEC (DUK_DEFPROP_HAVE_WRITABLE | DUK_DEFPROP_HAVE_ENUMERABLE | DUK_DEFPROP_HAVE_CONFIGURABLE) #define DUK_DEFPROP_SET_W DUK_DEFPROP_SET_WRITABLE #define DUK_DEFPROP_SET_E DUK_DEFPROP_SET_ENUMERABLE #define DUK_DEFPROP_SET_C DUK_DEFPROP_SET_CONFIGURABLE #define DUK_DEFPROP_SET_WE (DUK_DEFPROP_SET_WRITABLE | DUK_DEFPROP_SET_ENUMERABLE) #define DUK_DEFPROP_SET_WC (DUK_DEFPROP_SET_WRITABLE | DUK_DEFPROP_SET_CONFIGURABLE) #define DUK_DEFPROP_SET_WEC (DUK_DEFPROP_SET_WRITABLE | DUK_DEFPROP_SET_ENUMERABLE | DUK_DEFPROP_SET_CONFIGURABLE) #define DUK_DEFPROP_CLEAR_W DUK_DEFPROP_CLEAR_WRITABLE #define DUK_DEFPROP_CLEAR_E DUK_DEFPROP_CLEAR_ENUMERABLE #define DUK_DEFPROP_CLEAR_C DUK_DEFPROP_CLEAR_CONFIGURABLE #define DUK_DEFPROP_CLEAR_WE (DUK_DEFPROP_CLEAR_WRITABLE | DUK_DEFPROP_CLEAR_ENUMERABLE) #define DUK_DEFPROP_CLEAR_WC (DUK_DEFPROP_CLEAR_WRITABLE | DUK_DEFPROP_CLEAR_CONFIGURABLE) #define DUK_DEFPROP_CLEAR_WEC (DUK_DEFPROP_CLEAR_WRITABLE | DUK_DEFPROP_CLEAR_ENUMERABLE | DUK_DEFPROP_CLEAR_CONFIGURABLE) #define DUK_DEFPROP_ATTR_W (DUK_DEFPROP_HAVE_WEC | DUK_DEFPROP_W) #define DUK_DEFPROP_ATTR_E (DUK_DEFPROP_HAVE_WEC | DUK_DEFPROP_E) #define DUK_DEFPROP_ATTR_C (DUK_DEFPROP_HAVE_WEC | DUK_DEFPROP_C) #define DUK_DEFPROP_ATTR_WE (DUK_DEFPROP_HAVE_WEC | DUK_DEFPROP_WE) #define DUK_DEFPROP_ATTR_WC (DUK_DEFPROP_HAVE_WEC | DUK_DEFPROP_WC) #define DUK_DEFPROP_ATTR_WEC (DUK_DEFPROP_HAVE_WEC | DUK_DEFPROP_WEC) /* Flags for duk_push_thread_raw() */ #define DUK_THREAD_NEW_GLOBAL_ENV (1U << 0) /* create a new global environment */ /* Flags for duk_gc() */ #define DUK_GC_COMPACT (1U << 0) /* compact heap objects */ /* Error codes (must be 8 bits at most, see duk_error.h) */ #define DUK_ERR_NONE 0 /* no error (e.g. from duk_get_error_code()) */ #define DUK_ERR_ERROR 1 /* Error */ #define DUK_ERR_EVAL_ERROR 2 /* EvalError */ #define DUK_ERR_RANGE_ERROR 3 /* RangeError */ #define DUK_ERR_REFERENCE_ERROR 4 /* ReferenceError */ #define DUK_ERR_SYNTAX_ERROR 5 /* SyntaxError */ #define DUK_ERR_TYPE_ERROR 6 /* TypeError */ #define DUK_ERR_URI_ERROR 7 /* URIError */ /* Return codes for C functions (shortcut for throwing an error) */ #define DUK_RET_ERROR (-DUK_ERR_ERROR) #define DUK_RET_EVAL_ERROR (-DUK_ERR_EVAL_ERROR) #define DUK_RET_RANGE_ERROR (-DUK_ERR_RANGE_ERROR) #define DUK_RET_REFERENCE_ERROR (-DUK_ERR_REFERENCE_ERROR) #define DUK_RET_SYNTAX_ERROR (-DUK_ERR_SYNTAX_ERROR) #define DUK_RET_TYPE_ERROR (-DUK_ERR_TYPE_ERROR) #define DUK_RET_URI_ERROR (-DUK_ERR_URI_ERROR) /* Return codes for protected calls (duk_safe_call(), duk_pcall()) */ #define DUK_EXEC_SUCCESS 0 #define DUK_EXEC_ERROR 1 /* Debug levels for DUK_USE_DEBUG_WRITE(). */ #define DUK_LEVEL_DEBUG 0 #define DUK_LEVEL_DDEBUG 1 #define DUK_LEVEL_DDDEBUG 2 /* * Macros to create Symbols as C statically constructed strings. * * Call e.g. as DUK_HIDDEN_SYMBOL("myProperty") <=> ("\xFF" "myProperty"). * Local symbols have a unique suffix, caller should take care to avoid * conflicting with the Duktape internal representation by e.g. prepending * a '!' character: DUK_LOCAL_SYMBOL("myLocal", "!123"). * * Note that these can only be used for string constants, not dynamically * created strings. */ #define DUK_HIDDEN_SYMBOL(x) ("\xFF" x) #define DUK_GLOBAL_SYMBOL(x) ("\x80" x) #define DUK_LOCAL_SYMBOL(x,uniq) ("\x81" x "\xff" uniq) #define DUK_WELLKNOWN_SYMBOL(x) ("\x81" x "\xff") /* * If no variadic macros, __FILE__ and __LINE__ are passed through globals * which is ugly and not thread safe. */ #if !defined(DUK_API_VARIADIC_MACROS) DUK_EXTERNAL_DECL const char *duk_api_global_filename; DUK_EXTERNAL_DECL duk_int_t duk_api_global_line; #endif /* * Context management */ DUK_EXTERNAL_DECL duk_context *duk_create_heap(duk_alloc_function alloc_func, duk_realloc_function realloc_func, duk_free_function free_func, void *heap_udata, duk_fatal_function fatal_handler); DUK_EXTERNAL_DECL void duk_destroy_heap(duk_context *ctx); DUK_EXTERNAL_DECL void duk_suspend(duk_context *ctx, duk_thread_state *state); DUK_EXTERNAL_DECL void duk_resume(duk_context *ctx, const duk_thread_state *state); #define duk_create_heap_default() \ duk_create_heap(NULL, NULL, NULL, NULL, NULL) /* * Memory management * * Raw functions have no side effects (cannot trigger GC). */ DUK_EXTERNAL_DECL void *duk_alloc_raw(duk_context *ctx, duk_size_t size); DUK_EXTERNAL_DECL void duk_free_raw(duk_context *ctx, void *ptr); DUK_EXTERNAL_DECL void *duk_realloc_raw(duk_context *ctx, void *ptr, duk_size_t size); DUK_EXTERNAL_DECL void *duk_alloc(duk_context *ctx, duk_size_t size); DUK_EXTERNAL_DECL void duk_free(duk_context *ctx, void *ptr); DUK_EXTERNAL_DECL void *duk_realloc(duk_context *ctx, void *ptr, duk_size_t size); DUK_EXTERNAL_DECL void duk_get_memory_functions(duk_context *ctx, duk_memory_functions *out_funcs); DUK_EXTERNAL_DECL void duk_gc(duk_context *ctx, duk_uint_t flags); /* * Error handling */ DUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_throw_raw(duk_context *ctx)); #define duk_throw(ctx) \ (duk_throw_raw((ctx)), (duk_ret_t) 0) DUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_fatal_raw(duk_context *ctx, const char *err_msg)); #define duk_fatal(ctx,err_msg) \ (duk_fatal_raw((ctx), (err_msg)), (duk_ret_t) 0) DUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_error_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, ...)); #if defined(DUK_API_VARIADIC_MACROS) #define duk_error(ctx,err_code,...) \ (duk_error_raw((ctx), (duk_errcode_t) (err_code), (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0) #define duk_generic_error(ctx,...) \ (duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0) #define duk_eval_error(ctx,...) \ (duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_EVAL_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0) #define duk_range_error(ctx,...) \ (duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_RANGE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0) #define duk_reference_error(ctx,...) \ (duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_REFERENCE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0) #define duk_syntax_error(ctx,...) \ (duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_SYNTAX_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0) #define duk_type_error(ctx,...) \ (duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_TYPE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0) #define duk_uri_error(ctx,...) \ (duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_URI_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0) #else /* DUK_API_VARIADIC_MACROS */ /* For legacy compilers without variadic macros a macro hack is used to allow * variable arguments. While the macro allows "return duk_error(...)", it * will fail with e.g. "(void) duk_error(...)". The calls are noreturn but * with a return value to allow the "return duk_error(...)" idiom. This may * cause some compiler warnings, but without noreturn the generated code is * often worse. The same approach as with variadic macros (using * "(duk_error(...), 0)") won't work due to the macro hack structure. */ DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_error_stash(duk_context *ctx, duk_errcode_t err_code, const char *fmt, ...)); DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_generic_error_stash(duk_context *ctx, const char *fmt, ...)); DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_eval_error_stash(duk_context *ctx, const char *fmt, ...)); DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_range_error_stash(duk_context *ctx, const char *fmt, ...)); DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_reference_error_stash(duk_context *ctx, const char *fmt, ...)); DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_syntax_error_stash(duk_context *ctx, const char *fmt, ...)); DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_type_error_stash(duk_context *ctx, const char *fmt, ...)); DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_uri_error_stash(duk_context *ctx, const char *fmt, ...)); #define duk_error \ (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \ duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \ duk_error_stash) /* last value is func pointer, arguments follow in parens */ #define duk_generic_error \ (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \ duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \ duk_generic_error_stash) #define duk_eval_error \ (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \ duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \ duk_eval_error_stash) #define duk_range_error \ (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \ duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \ duk_range_error_stash) #define duk_reference_error \ (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \ duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \ duk_reference_error_stash) #define duk_syntax_error \ (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \ duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \ duk_syntax_error_stash) #define duk_type_error \ (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \ duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \ duk_type_error_stash) #define duk_uri_error \ (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \ duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \ duk_uri_error_stash) #endif /* DUK_API_VARIADIC_MACROS */ DUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_error_va_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, va_list ap)); #define duk_error_va(ctx,err_code,fmt,ap) \ (duk_error_va_raw((ctx), (duk_errcode_t) (err_code), (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0) #define duk_generic_error_va(ctx,fmt,ap) \ (duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0) #define duk_eval_error_va(ctx,fmt,ap) \ (duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_EVAL_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0) #define duk_range_error_va(ctx,fmt,ap) \ (duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_RANGE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0) #define duk_reference_error_va(ctx,fmt,ap) \ (duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_REFERENCE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0) #define duk_syntax_error_va(ctx,fmt,ap) \ (duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_SYNTAX_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0) #define duk_type_error_va(ctx,fmt,ap) \ (duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_TYPE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0) #define duk_uri_error_va(ctx,fmt,ap) \ (duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_URI_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0) /* * Other state related functions */ DUK_EXTERNAL_DECL duk_bool_t duk_is_strict_call(duk_context *ctx); DUK_EXTERNAL_DECL duk_bool_t duk_is_constructor_call(duk_context *ctx); /* * Stack management */ DUK_EXTERNAL_DECL duk_idx_t duk_normalize_index(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_idx_t duk_require_normalize_index(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_bool_t duk_is_valid_index(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL void duk_require_valid_index(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_idx_t duk_get_top(duk_context *ctx); DUK_EXTERNAL_DECL void duk_set_top(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_idx_t duk_get_top_index(duk_context *ctx); DUK_EXTERNAL_DECL duk_idx_t duk_require_top_index(duk_context *ctx); /* Although extra/top could be an unsigned type here, using a signed type * makes the API more robust to calling code calculation errors or corner * cases (where caller might occasionally come up with negative values). * Negative values are treated as zero, which is better than casting them * to a large unsigned number. (This principle is used elsewhere in the * API too.) */ DUK_EXTERNAL_DECL duk_bool_t duk_check_stack(duk_context *ctx, duk_idx_t extra); DUK_EXTERNAL_DECL void duk_require_stack(duk_context *ctx, duk_idx_t extra); DUK_EXTERNAL_DECL duk_bool_t duk_check_stack_top(duk_context *ctx, duk_idx_t top); DUK_EXTERNAL_DECL void duk_require_stack_top(duk_context *ctx, duk_idx_t top); /* * Stack manipulation (other than push/pop) */ DUK_EXTERNAL_DECL void duk_swap(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2); DUK_EXTERNAL_DECL void duk_swap_top(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL void duk_dup(duk_context *ctx, duk_idx_t from_idx); DUK_EXTERNAL_DECL void duk_dup_top(duk_context *ctx); DUK_EXTERNAL_DECL void duk_insert(duk_context *ctx, duk_idx_t to_idx); DUK_EXTERNAL_DECL void duk_replace(duk_context *ctx, duk_idx_t to_idx); DUK_EXTERNAL_DECL void duk_copy(duk_context *ctx, duk_idx_t from_idx, duk_idx_t to_idx); DUK_EXTERNAL_DECL void duk_remove(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL void duk_xcopymove_raw(duk_context *to_ctx, duk_context *from_ctx, duk_idx_t count, duk_bool_t is_copy); #define duk_xmove_top(to_ctx,from_ctx,count) \ duk_xcopymove_raw((to_ctx), (from_ctx), (count), 0 /*is_copy*/) #define duk_xcopy_top(to_ctx,from_ctx,count) \ duk_xcopymove_raw((to_ctx), (from_ctx), (count), 1 /*is_copy*/) /* * Push operations * * Push functions return the absolute (relative to bottom of frame) * position of the pushed value for convenience. * * Note: duk_dup() is technically a push. */ DUK_EXTERNAL_DECL void duk_push_undefined(duk_context *ctx); DUK_EXTERNAL_DECL void duk_push_null(duk_context *ctx); DUK_EXTERNAL_DECL void duk_push_boolean(duk_context *ctx, duk_bool_t val); DUK_EXTERNAL_DECL void duk_push_true(duk_context *ctx); DUK_EXTERNAL_DECL void duk_push_false(duk_context *ctx); DUK_EXTERNAL_DECL void duk_push_number(duk_context *ctx, duk_double_t val); DUK_EXTERNAL_DECL void duk_push_nan(duk_context *ctx); DUK_EXTERNAL_DECL void duk_push_int(duk_context *ctx, duk_int_t val); DUK_EXTERNAL_DECL void duk_push_uint(duk_context *ctx, duk_uint_t val); DUK_EXTERNAL_DECL const char *duk_push_string(duk_context *ctx, const char *str); DUK_EXTERNAL_DECL const char *duk_push_lstring(duk_context *ctx, const char *str, duk_size_t len); DUK_EXTERNAL_DECL void duk_push_pointer(duk_context *ctx, void *p); DUK_EXTERNAL_DECL const char *duk_push_sprintf(duk_context *ctx, const char *fmt, ...); DUK_EXTERNAL_DECL const char *duk_push_vsprintf(duk_context *ctx, const char *fmt, va_list ap); DUK_EXTERNAL_DECL void duk_push_this(duk_context *ctx); DUK_EXTERNAL_DECL void duk_push_current_function(duk_context *ctx); DUK_EXTERNAL_DECL void duk_push_current_thread(duk_context *ctx); DUK_EXTERNAL_DECL void duk_push_global_object(duk_context *ctx); DUK_EXTERNAL_DECL void duk_push_heap_stash(duk_context *ctx); DUK_EXTERNAL_DECL void duk_push_global_stash(duk_context *ctx); DUK_EXTERNAL_DECL void duk_push_thread_stash(duk_context *ctx, duk_context *target_ctx); DUK_EXTERNAL_DECL duk_idx_t duk_push_object(duk_context *ctx); DUK_EXTERNAL_DECL duk_idx_t duk_push_bare_object(duk_context *ctx); DUK_EXTERNAL_DECL duk_idx_t duk_push_array(duk_context *ctx); DUK_EXTERNAL_DECL duk_idx_t duk_push_c_function(duk_context *ctx, duk_c_function func, duk_idx_t nargs); DUK_EXTERNAL_DECL duk_idx_t duk_push_c_lightfunc(duk_context *ctx, duk_c_function func, duk_idx_t nargs, duk_idx_t length, duk_int_t magic); DUK_EXTERNAL_DECL duk_idx_t duk_push_thread_raw(duk_context *ctx, duk_uint_t flags); DUK_EXTERNAL_DECL duk_idx_t duk_push_proxy(duk_context *ctx, duk_uint_t proxy_flags); #define duk_push_thread(ctx) \ duk_push_thread_raw((ctx), 0 /*flags*/) #define duk_push_thread_new_globalenv(ctx) \ duk_push_thread_raw((ctx), DUK_THREAD_NEW_GLOBAL_ENV /*flags*/) DUK_EXTERNAL_DECL duk_idx_t duk_push_error_object_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, ...); #if defined(DUK_API_VARIADIC_MACROS) #define duk_push_error_object(ctx,err_code,...) \ duk_push_error_object_raw((ctx), (err_code), (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__) #else DUK_EXTERNAL_DECL duk_idx_t duk_push_error_object_stash(duk_context *ctx, duk_errcode_t err_code, const char *fmt, ...); /* Note: parentheses are required so that the comma expression works in assignments. */ #define duk_push_error_object \ (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \ duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \ duk_push_error_object_stash) /* last value is func pointer, arguments follow in parens */ #endif DUK_EXTERNAL_DECL duk_idx_t duk_push_error_object_va_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, va_list ap); #define duk_push_error_object_va(ctx,err_code,fmt,ap) \ duk_push_error_object_va_raw((ctx), (err_code), (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)) #define DUK_BUF_FLAG_DYNAMIC (1 << 0) /* internal flag: dynamic buffer */ #define DUK_BUF_FLAG_EXTERNAL (1 << 1) /* internal flag: external buffer */ #define DUK_BUF_FLAG_NOZERO (1 << 2) /* internal flag: don't zero allocated buffer */ DUK_EXTERNAL_DECL void *duk_push_buffer_raw(duk_context *ctx, duk_size_t size, duk_small_uint_t flags); #define duk_push_buffer(ctx,size,dynamic) \ duk_push_buffer_raw((ctx), (size), (dynamic) ? DUK_BUF_FLAG_DYNAMIC : 0) #define duk_push_fixed_buffer(ctx,size) \ duk_push_buffer_raw((ctx), (size), 0 /*flags*/) #define duk_push_dynamic_buffer(ctx,size) \ duk_push_buffer_raw((ctx), (size), DUK_BUF_FLAG_DYNAMIC /*flags*/) #define duk_push_external_buffer(ctx) \ ((void) duk_push_buffer_raw((ctx), 0, DUK_BUF_FLAG_DYNAMIC | DUK_BUF_FLAG_EXTERNAL)) #define DUK_BUFOBJ_ARRAYBUFFER 0 #define DUK_BUFOBJ_NODEJS_BUFFER 1 #define DUK_BUFOBJ_DATAVIEW 2 #define DUK_BUFOBJ_INT8ARRAY 3 #define DUK_BUFOBJ_UINT8ARRAY 4 #define DUK_BUFOBJ_UINT8CLAMPEDARRAY 5 #define DUK_BUFOBJ_INT16ARRAY 6 #define DUK_BUFOBJ_UINT16ARRAY 7 #define DUK_BUFOBJ_INT32ARRAY 8 #define DUK_BUFOBJ_UINT32ARRAY 9 #define DUK_BUFOBJ_FLOAT32ARRAY 10 #define DUK_BUFOBJ_FLOAT64ARRAY 11 DUK_EXTERNAL_DECL void duk_push_buffer_object(duk_context *ctx, duk_idx_t idx_buffer, duk_size_t byte_offset, duk_size_t byte_length, duk_uint_t flags); DUK_EXTERNAL_DECL duk_idx_t duk_push_heapptr(duk_context *ctx, void *ptr); /* * Pop operations */ DUK_EXTERNAL_DECL void duk_pop(duk_context *ctx); DUK_EXTERNAL_DECL void duk_pop_n(duk_context *ctx, duk_idx_t count); DUK_EXTERNAL_DECL void duk_pop_2(duk_context *ctx); DUK_EXTERNAL_DECL void duk_pop_3(duk_context *ctx); /* * Type checks * * duk_is_none(), which would indicate whether index it outside of stack, * is not needed; duk_is_valid_index() gives the same information. */ DUK_EXTERNAL_DECL duk_int_t duk_get_type(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_bool_t duk_check_type(duk_context *ctx, duk_idx_t idx, duk_int_t type); DUK_EXTERNAL_DECL duk_uint_t duk_get_type_mask(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_bool_t duk_check_type_mask(duk_context *ctx, duk_idx_t idx, duk_uint_t mask); DUK_EXTERNAL_DECL duk_bool_t duk_is_undefined(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_bool_t duk_is_null(duk_context *ctx, duk_idx_t idx); #define duk_is_null_or_undefined(ctx, idx) \ ((duk_get_type_mask((ctx), (idx)) & (DUK_TYPE_MASK_NULL | DUK_TYPE_MASK_UNDEFINED)) ? 1 : 0) DUK_EXTERNAL_DECL duk_bool_t duk_is_boolean(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_bool_t duk_is_number(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_bool_t duk_is_nan(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_bool_t duk_is_string(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_bool_t duk_is_object(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_bool_t duk_is_buffer(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_bool_t duk_is_buffer_data(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_bool_t duk_is_pointer(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_bool_t duk_is_lightfunc(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_bool_t duk_is_symbol(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_bool_t duk_is_array(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_bool_t duk_is_function(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_bool_t duk_is_c_function(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_bool_t duk_is_ecmascript_function(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_bool_t duk_is_bound_function(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_bool_t duk_is_thread(duk_context *ctx, duk_idx_t idx); #define duk_is_callable(ctx,idx) \ duk_is_function((ctx), (idx)) DUK_EXTERNAL_DECL duk_bool_t duk_is_constructable(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_bool_t duk_is_dynamic_buffer(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_bool_t duk_is_fixed_buffer(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_bool_t duk_is_external_buffer(duk_context *ctx, duk_idx_t idx); /* Buffers and lightfuncs are not considered primitive because they mimic * objects and e.g. duk_to_primitive() will coerce them instead of returning * them as is. Symbols are represented as strings internally. */ #define duk_is_primitive(ctx,idx) \ duk_check_type_mask((ctx), (idx), DUK_TYPE_MASK_UNDEFINED | \ DUK_TYPE_MASK_NULL | \ DUK_TYPE_MASK_BOOLEAN | \ DUK_TYPE_MASK_NUMBER | \ DUK_TYPE_MASK_STRING | \ DUK_TYPE_MASK_POINTER) /* Symbols are object coercible, covered by DUK_TYPE_MASK_STRING. */ #define duk_is_object_coercible(ctx,idx) \ duk_check_type_mask((ctx), (idx), DUK_TYPE_MASK_BOOLEAN | \ DUK_TYPE_MASK_NUMBER | \ DUK_TYPE_MASK_STRING | \ DUK_TYPE_MASK_OBJECT | \ DUK_TYPE_MASK_BUFFER | \ DUK_TYPE_MASK_POINTER | \ DUK_TYPE_MASK_LIGHTFUNC) DUK_EXTERNAL_DECL duk_errcode_t duk_get_error_code(duk_context *ctx, duk_idx_t idx); #define duk_is_error(ctx,idx) \ (duk_get_error_code((ctx), (idx)) != 0) #define duk_is_eval_error(ctx,idx) \ (duk_get_error_code((ctx), (idx)) == DUK_ERR_EVAL_ERROR) #define duk_is_range_error(ctx,idx) \ (duk_get_error_code((ctx), (idx)) == DUK_ERR_RANGE_ERROR) #define duk_is_reference_error(ctx,idx) \ (duk_get_error_code((ctx), (idx)) == DUK_ERR_REFERENCE_ERROR) #define duk_is_syntax_error(ctx,idx) \ (duk_get_error_code((ctx), (idx)) == DUK_ERR_SYNTAX_ERROR) #define duk_is_type_error(ctx,idx) \ (duk_get_error_code((ctx), (idx)) == DUK_ERR_TYPE_ERROR) #define duk_is_uri_error(ctx,idx) \ (duk_get_error_code((ctx), (idx)) == DUK_ERR_URI_ERROR) /* * Get operations: no coercion, returns default value for invalid * indices and invalid value types. * * duk_get_undefined() and duk_get_null() would be pointless and * are not included. */ DUK_EXTERNAL_DECL duk_bool_t duk_get_boolean(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_double_t duk_get_number(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_int_t duk_get_int(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_uint_t duk_get_uint(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL const char *duk_get_string(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL const char *duk_get_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len); DUK_EXTERNAL_DECL void *duk_get_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size); DUK_EXTERNAL_DECL void *duk_get_buffer_data(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size); DUK_EXTERNAL_DECL void *duk_get_pointer(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_c_function duk_get_c_function(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_context *duk_get_context(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL void *duk_get_heapptr(duk_context *ctx, duk_idx_t idx); /* * Get-with-explicit default operations: like get operations but with an * explicit default value. */ DUK_EXTERNAL_DECL duk_bool_t duk_get_boolean_default(duk_context *ctx, duk_idx_t idx, duk_bool_t def_value); DUK_EXTERNAL_DECL duk_double_t duk_get_number_default(duk_context *ctx, duk_idx_t idx, duk_double_t def_value); DUK_EXTERNAL_DECL duk_int_t duk_get_int_default(duk_context *ctx, duk_idx_t idx, duk_int_t def_value); DUK_EXTERNAL_DECL duk_uint_t duk_get_uint_default(duk_context *ctx, duk_idx_t idx, duk_uint_t def_value); DUK_EXTERNAL_DECL const char *duk_get_string_default(duk_context *ctx, duk_idx_t idx, const char *def_value); DUK_EXTERNAL_DECL const char *duk_get_lstring_default(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len, const char *def_ptr, duk_size_t def_len); DUK_EXTERNAL_DECL void *duk_get_buffer_default(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_len); DUK_EXTERNAL_DECL void *duk_get_buffer_data_default(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_len); DUK_EXTERNAL_DECL void *duk_get_pointer_default(duk_context *ctx, duk_idx_t idx, void *def_value); DUK_EXTERNAL_DECL duk_c_function duk_get_c_function_default(duk_context *ctx, duk_idx_t idx, duk_c_function def_value); DUK_EXTERNAL_DECL duk_context *duk_get_context_default(duk_context *ctx, duk_idx_t idx, duk_context *def_value); DUK_EXTERNAL_DECL void *duk_get_heapptr_default(duk_context *ctx, duk_idx_t idx, void *def_value); /* * Opt operations: like require operations but with an explicit default value * when value is undefined or index is invalid, null and non-matching types * cause a TypeError. */ DUK_EXTERNAL_DECL duk_bool_t duk_opt_boolean(duk_context *ctx, duk_idx_t idx, duk_bool_t def_value); DUK_EXTERNAL_DECL duk_double_t duk_opt_number(duk_context *ctx, duk_idx_t idx, duk_double_t def_value); DUK_EXTERNAL_DECL duk_int_t duk_opt_int(duk_context *ctx, duk_idx_t idx, duk_int_t def_value); DUK_EXTERNAL_DECL duk_uint_t duk_opt_uint(duk_context *ctx, duk_idx_t idx, duk_uint_t def_value); DUK_EXTERNAL_DECL const char *duk_opt_string(duk_context *ctx, duk_idx_t idx, const char *def_ptr); DUK_EXTERNAL_DECL const char *duk_opt_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len, const char *def_ptr, duk_size_t def_len); DUK_EXTERNAL_DECL void *duk_opt_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_size); DUK_EXTERNAL_DECL void *duk_opt_buffer_data(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_size); DUK_EXTERNAL_DECL void *duk_opt_pointer(duk_context *ctx, duk_idx_t idx, void *def_value); DUK_EXTERNAL_DECL duk_c_function duk_opt_c_function(duk_context *ctx, duk_idx_t idx, duk_c_function def_value); DUK_EXTERNAL_DECL duk_context *duk_opt_context(duk_context *ctx, duk_idx_t idx, duk_context *def_value); DUK_EXTERNAL_DECL void *duk_opt_heapptr(duk_context *ctx, duk_idx_t idx, void *def_value); /* * Require operations: no coercion, throw error if index or type * is incorrect. No defaulting. */ #define duk_require_type_mask(ctx,idx,mask) \ ((void) duk_check_type_mask((ctx), (idx), (mask) | DUK_TYPE_MASK_THROW)) DUK_EXTERNAL_DECL void duk_require_undefined(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL void duk_require_null(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_bool_t duk_require_boolean(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_double_t duk_require_number(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_int_t duk_require_int(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_uint_t duk_require_uint(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL const char *duk_require_string(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL const char *duk_require_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len); DUK_EXTERNAL_DECL void duk_require_object(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL void *duk_require_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size); DUK_EXTERNAL_DECL void *duk_require_buffer_data(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size); DUK_EXTERNAL_DECL void *duk_require_pointer(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_c_function duk_require_c_function(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_context *duk_require_context(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL void duk_require_function(duk_context *ctx, duk_idx_t idx); #define duk_require_callable(ctx,idx) \ duk_require_function((ctx), (idx)) DUK_EXTERNAL_DECL void *duk_require_heapptr(duk_context *ctx, duk_idx_t idx); /* Symbols are object coercible and covered by DUK_TYPE_MASK_STRING. */ #define duk_require_object_coercible(ctx,idx) \ ((void) duk_check_type_mask((ctx), (idx), DUK_TYPE_MASK_BOOLEAN | \ DUK_TYPE_MASK_NUMBER | \ DUK_TYPE_MASK_STRING | \ DUK_TYPE_MASK_OBJECT | \ DUK_TYPE_MASK_BUFFER | \ DUK_TYPE_MASK_POINTER | \ DUK_TYPE_MASK_LIGHTFUNC | \ DUK_TYPE_MASK_THROW)) /* * Coercion operations: in-place coercion, return coerced value where * applicable. If index is invalid, throw error. Some coercions may * throw an expected error (e.g. from a toString() or valueOf() call) * or an internal error (e.g. from out of memory). */ DUK_EXTERNAL_DECL void duk_to_undefined(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL void duk_to_null(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_bool_t duk_to_boolean(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_double_t duk_to_number(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_int_t duk_to_int(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_uint_t duk_to_uint(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_int32_t duk_to_int32(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_uint32_t duk_to_uint32(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_uint16_t duk_to_uint16(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL const char *duk_to_string(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL const char *duk_to_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len); DUK_EXTERNAL_DECL void *duk_to_buffer_raw(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size, duk_uint_t flags); DUK_EXTERNAL_DECL void *duk_to_pointer(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL void duk_to_object(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL void duk_to_primitive(duk_context *ctx, duk_idx_t idx, duk_int_t hint); #define DUK_BUF_MODE_FIXED 0 /* internal: request fixed buffer result */ #define DUK_BUF_MODE_DYNAMIC 1 /* internal: request dynamic buffer result */ #define DUK_BUF_MODE_DONTCARE 2 /* internal: don't care about fixed/dynamic nature */ #define duk_to_buffer(ctx,idx,out_size) \ duk_to_buffer_raw((ctx), (idx), (out_size), DUK_BUF_MODE_DONTCARE) #define duk_to_fixed_buffer(ctx,idx,out_size) \ duk_to_buffer_raw((ctx), (idx), (out_size), DUK_BUF_MODE_FIXED) #define duk_to_dynamic_buffer(ctx,idx,out_size) \ duk_to_buffer_raw((ctx), (idx), (out_size), DUK_BUF_MODE_DYNAMIC) /* safe variants of a few coercion operations */ DUK_EXTERNAL_DECL const char *duk_safe_to_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len); #define duk_safe_to_string(ctx,idx) \ duk_safe_to_lstring((ctx), (idx), NULL) /* * Value length */ DUK_EXTERNAL_DECL duk_size_t duk_get_length(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL void duk_set_length(duk_context *ctx, duk_idx_t idx, duk_size_t len); #if 0 /* duk_require_length()? */ /* duk_opt_length()? */ #endif /* * Misc conversion */ DUK_EXTERNAL_DECL const char *duk_base64_encode(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL void duk_base64_decode(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL const char *duk_hex_encode(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL void duk_hex_decode(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL const char *duk_json_encode(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL void duk_json_decode(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL const char *duk_buffer_to_string(duk_context *ctx, duk_idx_t idx); /* * Buffer */ DUK_EXTERNAL_DECL void *duk_resize_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t new_size); DUK_EXTERNAL_DECL void *duk_steal_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size); DUK_EXTERNAL_DECL void duk_config_buffer(duk_context *ctx, duk_idx_t idx, void *ptr, duk_size_t len); /* * Property access * * The basic function assumes key is on stack. The _string variant takes * a C string as a property name, while the _index variant takes an array * index as a property name (e.g. 123 is equivalent to the key "123"). */ DUK_EXTERNAL_DECL duk_bool_t duk_get_prop(duk_context *ctx, duk_idx_t obj_idx); DUK_EXTERNAL_DECL duk_bool_t duk_get_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key); DUK_EXTERNAL_DECL duk_bool_t duk_get_prop_lstring(duk_context *ctx, duk_idx_t obj_idx, const char *key, duk_size_t key_len); DUK_EXTERNAL_DECL duk_bool_t duk_get_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx); DUK_EXTERNAL_DECL duk_bool_t duk_get_prop_heapptr(duk_context *ctx, duk_idx_t obj_idx, void *ptr); DUK_EXTERNAL_DECL duk_bool_t duk_put_prop(duk_context *ctx, duk_idx_t obj_idx); DUK_EXTERNAL_DECL duk_bool_t duk_put_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key); DUK_EXTERNAL_DECL duk_bool_t duk_put_prop_lstring(duk_context *ctx, duk_idx_t obj_idx, const char *key, duk_size_t key_len); DUK_EXTERNAL_DECL duk_bool_t duk_put_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx); DUK_EXTERNAL_DECL duk_bool_t duk_put_prop_heapptr(duk_context *ctx, duk_idx_t obj_idx, void *ptr); DUK_EXTERNAL_DECL duk_bool_t duk_del_prop(duk_context *ctx, duk_idx_t obj_idx); DUK_EXTERNAL_DECL duk_bool_t duk_del_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key); DUK_EXTERNAL_DECL duk_bool_t duk_del_prop_lstring(duk_context *ctx, duk_idx_t obj_idx, const char *key, duk_size_t key_len); DUK_EXTERNAL_DECL duk_bool_t duk_del_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx); DUK_EXTERNAL_DECL duk_bool_t duk_del_prop_heapptr(duk_context *ctx, duk_idx_t obj_idx, void *ptr); DUK_EXTERNAL_DECL duk_bool_t duk_has_prop(duk_context *ctx, duk_idx_t obj_idx); DUK_EXTERNAL_DECL duk_bool_t duk_has_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key); DUK_EXTERNAL_DECL duk_bool_t duk_has_prop_lstring(duk_context *ctx, duk_idx_t obj_idx, const char *key, duk_size_t key_len); DUK_EXTERNAL_DECL duk_bool_t duk_has_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx); DUK_EXTERNAL_DECL duk_bool_t duk_has_prop_heapptr(duk_context *ctx, duk_idx_t obj_idx, void *ptr); DUK_EXTERNAL_DECL void duk_get_prop_desc(duk_context *ctx, duk_idx_t obj_idx, duk_uint_t flags); DUK_EXTERNAL_DECL void duk_def_prop(duk_context *ctx, duk_idx_t obj_idx, duk_uint_t flags); DUK_EXTERNAL_DECL duk_bool_t duk_get_global_string(duk_context *ctx, const char *key); DUK_EXTERNAL_DECL duk_bool_t duk_get_global_lstring(duk_context *ctx, const char *key, duk_size_t key_len); DUK_EXTERNAL_DECL duk_bool_t duk_put_global_string(duk_context *ctx, const char *key); DUK_EXTERNAL_DECL duk_bool_t duk_put_global_lstring(duk_context *ctx, const char *key, duk_size_t key_len); /* * Inspection */ DUK_EXTERNAL_DECL void duk_inspect_value(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL void duk_inspect_callstack_entry(duk_context *ctx, duk_int_t level); /* * Object prototype */ DUK_EXTERNAL_DECL void duk_get_prototype(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL void duk_set_prototype(duk_context *ctx, duk_idx_t idx); /* * Object finalizer */ DUK_EXTERNAL_DECL void duk_get_finalizer(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL void duk_set_finalizer(duk_context *ctx, duk_idx_t idx); /* * Global object */ DUK_EXTERNAL_DECL void duk_set_global_object(duk_context *ctx); /* * Duktape/C function magic value */ DUK_EXTERNAL_DECL duk_int_t duk_get_magic(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL void duk_set_magic(duk_context *ctx, duk_idx_t idx, duk_int_t magic); DUK_EXTERNAL_DECL duk_int_t duk_get_current_magic(duk_context *ctx); /* * Module helpers: put multiple function or constant properties */ DUK_EXTERNAL_DECL void duk_put_function_list(duk_context *ctx, duk_idx_t obj_idx, const duk_function_list_entry *funcs); DUK_EXTERNAL_DECL void duk_put_number_list(duk_context *ctx, duk_idx_t obj_idx, const duk_number_list_entry *numbers); /* * Object operations */ DUK_EXTERNAL_DECL void duk_compact(duk_context *ctx, duk_idx_t obj_idx); DUK_EXTERNAL_DECL void duk_enum(duk_context *ctx, duk_idx_t obj_idx, duk_uint_t enum_flags); DUK_EXTERNAL_DECL duk_bool_t duk_next(duk_context *ctx, duk_idx_t enum_idx, duk_bool_t get_value); DUK_EXTERNAL_DECL void duk_seal(duk_context *ctx, duk_idx_t obj_idx); DUK_EXTERNAL_DECL void duk_freeze(duk_context *ctx, duk_idx_t obj_idx); /* * String manipulation */ DUK_EXTERNAL_DECL void duk_concat(duk_context *ctx, duk_idx_t count); DUK_EXTERNAL_DECL void duk_join(duk_context *ctx, duk_idx_t count); DUK_EXTERNAL_DECL void duk_decode_string(duk_context *ctx, duk_idx_t idx, duk_decode_char_function callback, void *udata); DUK_EXTERNAL_DECL void duk_map_string(duk_context *ctx, duk_idx_t idx, duk_map_char_function callback, void *udata); DUK_EXTERNAL_DECL void duk_substring(duk_context *ctx, duk_idx_t idx, duk_size_t start_char_offset, duk_size_t end_char_offset); DUK_EXTERNAL_DECL void duk_trim(duk_context *ctx, duk_idx_t idx); DUK_EXTERNAL_DECL duk_codepoint_t duk_char_code_at(duk_context *ctx, duk_idx_t idx, duk_size_t char_offset); /* * Ecmascript operators */ DUK_EXTERNAL_DECL duk_bool_t duk_equals(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2); DUK_EXTERNAL_DECL duk_bool_t duk_strict_equals(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2); DUK_EXTERNAL_DECL duk_bool_t duk_samevalue(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2); DUK_EXTERNAL_DECL duk_bool_t duk_instanceof(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2); /* * Function (method) calls */ DUK_EXTERNAL_DECL void duk_call(duk_context *ctx, duk_idx_t nargs); DUK_EXTERNAL_DECL void duk_call_method(duk_context *ctx, duk_idx_t nargs); DUK_EXTERNAL_DECL void duk_call_prop(duk_context *ctx, duk_idx_t obj_idx, duk_idx_t nargs); DUK_EXTERNAL_DECL duk_int_t duk_pcall(duk_context *ctx, duk_idx_t nargs); DUK_EXTERNAL_DECL duk_int_t duk_pcall_method(duk_context *ctx, duk_idx_t nargs); DUK_EXTERNAL_DECL duk_int_t duk_pcall_prop(duk_context *ctx, duk_idx_t obj_idx, duk_idx_t nargs); DUK_EXTERNAL_DECL void duk_new(duk_context *ctx, duk_idx_t nargs); DUK_EXTERNAL_DECL duk_int_t duk_pnew(duk_context *ctx, duk_idx_t nargs); DUK_EXTERNAL_DECL duk_int_t duk_safe_call(duk_context *ctx, duk_safe_call_function func, void *udata, duk_idx_t nargs, duk_idx_t nrets); /* * Thread management */ /* There are currently no native functions to yield/resume, due to the internal * limitations on coroutine handling. These will be added later. */ /* * Compilation and evaluation */ DUK_EXTERNAL_DECL duk_int_t duk_eval_raw(duk_context *ctx, const char *src_buffer, duk_size_t src_length, duk_uint_t flags); DUK_EXTERNAL_DECL duk_int_t duk_compile_raw(duk_context *ctx, const char *src_buffer, duk_size_t src_length, duk_uint_t flags); /* plain */ #define duk_eval(ctx) \ ((void) duk_eval_raw((ctx), NULL, 0, 1 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOFILENAME)) #define duk_eval_noresult(ctx) \ ((void) duk_eval_raw((ctx), NULL, 0, 1 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME)) #define duk_peval(ctx) \ (duk_eval_raw((ctx), NULL, 0, 1 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NOFILENAME)) #define duk_peval_noresult(ctx) \ (duk_eval_raw((ctx), NULL, 0, 1 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME)) #define duk_compile(ctx,flags) \ ((void) duk_compile_raw((ctx), NULL, 0, 2 /*args*/ | (flags))) #define duk_pcompile(ctx,flags) \ (duk_compile_raw((ctx), NULL, 0, 2 /*args*/ | (flags) | DUK_COMPILE_SAFE)) /* string */ #define duk_eval_string(ctx,src) \ ((void) duk_eval_raw((ctx), (src), 0, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NOFILENAME)) #define duk_eval_string_noresult(ctx,src) \ ((void) duk_eval_raw((ctx), (src), 0, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME)) #define duk_peval_string(ctx,src) \ (duk_eval_raw((ctx), (src), 0, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NOFILENAME)) #define duk_peval_string_noresult(ctx,src) \ (duk_eval_raw((ctx), (src), 0, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME)) #define duk_compile_string(ctx,flags,src) \ ((void) duk_compile_raw((ctx), (src), 0, 0 /*args*/ | (flags) | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NOFILENAME)) #define duk_compile_string_filename(ctx,flags,src) \ ((void) duk_compile_raw((ctx), (src), 0, 1 /*args*/ | (flags) | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN)) #define duk_pcompile_string(ctx,flags,src) \ (duk_compile_raw((ctx), (src), 0, 0 /*args*/ | (flags) | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NOFILENAME)) #define duk_pcompile_string_filename(ctx,flags,src) \ (duk_compile_raw((ctx), (src), 0, 1 /*args*/ | (flags) | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN)) /* lstring */ #define duk_eval_lstring(ctx,buf,len) \ ((void) duk_eval_raw((ctx), buf, len, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NOFILENAME)) #define duk_eval_lstring_noresult(ctx,buf,len) \ ((void) duk_eval_raw((ctx), buf, len, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME)) #define duk_peval_lstring(ctx,buf,len) \ (duk_eval_raw((ctx), buf, len, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_SAFE | DUK_COMPILE_NOFILENAME)) #define duk_peval_lstring_noresult(ctx,buf,len) \ (duk_eval_raw((ctx), buf, len, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME)) #define duk_compile_lstring(ctx,flags,buf,len) \ ((void) duk_compile_raw((ctx), buf, len, 0 /*args*/ | (flags) | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NOFILENAME)) #define duk_compile_lstring_filename(ctx,flags,buf,len) \ ((void) duk_compile_raw((ctx), buf, len, 1 /*args*/ | (flags) | DUK_COMPILE_NOSOURCE)) #define duk_pcompile_lstring(ctx,flags,buf,len) \ (duk_compile_raw((ctx), buf, len, 0 /*args*/ | (flags) | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NOFILENAME)) #define duk_pcompile_lstring_filename(ctx,flags,buf,len) \ (duk_compile_raw((ctx), buf, len, 1 /*args*/ | (flags) | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE)) /* * Bytecode load/dump */ DUK_EXTERNAL_DECL void duk_dump_function(duk_context *ctx); DUK_EXTERNAL_DECL void duk_load_function(duk_context *ctx); /* * Debugging */ DUK_EXTERNAL_DECL void duk_push_context_dump(duk_context *ctx); /* * Debugger (debug protocol) */ DUK_EXTERNAL_DECL void duk_debugger_attach(duk_context *ctx, duk_debug_read_function read_cb, duk_debug_write_function write_cb, duk_debug_peek_function peek_cb, duk_debug_read_flush_function read_flush_cb, duk_debug_write_flush_function write_flush_cb, duk_debug_request_function request_cb, duk_debug_detached_function detached_cb, void *udata); DUK_EXTERNAL_DECL void duk_debugger_detach(duk_context *ctx); DUK_EXTERNAL_DECL void duk_debugger_cooperate(duk_context *ctx); DUK_EXTERNAL_DECL duk_bool_t duk_debugger_notify(duk_context *ctx, duk_idx_t nvalues); DUK_EXTERNAL_DECL void duk_debugger_pause(duk_context *ctx); /* * Time handling */ DUK_EXTERNAL_DECL duk_double_t duk_get_now(duk_context *ctx); DUK_EXTERNAL_DECL void duk_time_to_components(duk_context *ctx, duk_double_t timeval, duk_time_components *comp); DUK_EXTERNAL_DECL duk_double_t duk_components_to_time(duk_context *ctx, duk_time_components *comp); /* * Date provider related constants * * NOTE: These are "semi public" - you should only use these if you write * your own platform specific Date provider, see doc/datetime.rst. */ /* Millisecond count constants. */ #define DUK_DATE_MSEC_SECOND 1000L #define DUK_DATE_MSEC_MINUTE (60L * 1000L) #define DUK_DATE_MSEC_HOUR (60L * 60L * 1000L) #define DUK_DATE_MSEC_DAY (24L * 60L * 60L * 1000L) /* Ecmascript date range is 100 million days from Epoch: * > 100e6 * 24 * 60 * 60 * 1000 // 100M days in millisecs * 8640000000000000 * (= 8.64e15) */ #define DUK_DATE_MSEC_100M_DAYS (8.64e15) #define DUK_DATE_MSEC_100M_DAYS_LEEWAY (8.64e15 + 24 * 3600e3) /* Ecmascript year range: * > new Date(100e6 * 24 * 3600e3).toISOString() * '+275760-09-13T00:00:00.000Z' * > new Date(-100e6 * 24 * 3600e3).toISOString() * '-271821-04-20T00:00:00.000Z' */ #define DUK_DATE_MIN_ECMA_YEAR (-271821L) #define DUK_DATE_MAX_ECMA_YEAR 275760L /* Part indices for internal breakdowns. Part order from DUK_DATE_IDX_YEAR * to DUK_DATE_IDX_MILLISECOND matches argument ordering of Ecmascript API * calls (like Date constructor call). Some functions in duk_bi_date.c * depend on the specific ordering, so change with care. 16 bits are not * enough for all parts (year, specifically). * * Must be in-sync with genbuiltins.py. */ #define DUK_DATE_IDX_YEAR 0 /* year */ #define DUK_DATE_IDX_MONTH 1 /* month: 0 to 11 */ #define DUK_DATE_IDX_DAY 2 /* day within month: 0 to 30 */ #define DUK_DATE_IDX_HOUR 3 #define DUK_DATE_IDX_MINUTE 4 #define DUK_DATE_IDX_SECOND 5 #define DUK_DATE_IDX_MILLISECOND 6 #define DUK_DATE_IDX_WEEKDAY 7 /* weekday: 0 to 6, 0=sunday, 1=monday, etc */ #define DUK_DATE_IDX_NUM_PARTS 8 /* Internal API call flags, used for various functions in duk_bi_date.c. * Certain flags are used by only certain functions, but since the flags * don't overlap, a single flags value can be passed around to multiple * functions. * * The unused top bits of the flags field are also used to pass values * to helpers (duk__get_part_helper() and duk__set_part_helper()). * * Must be in-sync with genbuiltins.py. */ /* NOTE: when writing a Date provider you only need a few specific * flags from here, the rest are internal. Avoid using anything you * don't need. */ #define DUK_DATE_FLAG_NAN_TO_ZERO (1 << 0) /* timeval breakdown: internal time value NaN -> zero */ #define DUK_DATE_FLAG_NAN_TO_RANGE_ERROR (1 << 1) /* timeval breakdown: internal time value NaN -> RangeError (toISOString) */ #define DUK_DATE_FLAG_ONEBASED (1 << 2) /* timeval breakdown: convert month and day-of-month parts to one-based (default is zero-based) */ #define DUK_DATE_FLAG_EQUIVYEAR (1 << 3) /* timeval breakdown: replace year with equivalent year in the [1971,2037] range for DST calculations */ #define DUK_DATE_FLAG_LOCALTIME (1 << 4) /* convert time value to local time */ #define DUK_DATE_FLAG_SUB1900 (1 << 5) /* getter: subtract 1900 from year when getting year part */ #define DUK_DATE_FLAG_TOSTRING_DATE (1 << 6) /* include date part in string conversion result */ #define DUK_DATE_FLAG_TOSTRING_TIME (1 << 7) /* include time part in string conversion result */ #define DUK_DATE_FLAG_TOSTRING_LOCALE (1 << 8) /* use locale specific formatting if available */ #define DUK_DATE_FLAG_TIMESETTER (1 << 9) /* setter: call is a time setter (affects hour, min, sec, ms); otherwise date setter (affects year, month, day-in-month) */ #define DUK_DATE_FLAG_YEAR_FIXUP (1 << 10) /* setter: perform 2-digit year fixup (00...99 -> 1900...1999) */ #define DUK_DATE_FLAG_SEP_T (1 << 11) /* string conversion: use 'T' instead of ' ' as a separator */ #define DUK_DATE_FLAG_VALUE_SHIFT 12 /* additional values begin at bit 12 */ /* * ROM pointer compression */ /* Support array for ROM pointer compression. Only declared when ROM * pointer compression is active. */ #if defined(DUK_USE_ROM_OBJECTS) && defined(DUK_USE_HEAPPTR16) DUK_EXTERNAL_DECL const void * const duk_rom_compressed_pointers[]; #endif /* * C++ name mangling */ #if defined(__cplusplus) /* end 'extern "C"' wrapper */ } #endif /* * END PUBLIC API */ #endif /* DUKTAPE_H_INCLUDED */ ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/timers.go ================================================ package duktape import ( "errors" "fmt" "time" ) // DefineTimers defines `setTimeout`, `clearTimeout`, `setInterval`, // `clearInterval` into global context. func (d *Context) PushTimers() error { d.PushGlobalStash() // check if timers already exists if !d.HasPropString(-1, "timers") { d.PushObject() d.PutPropString(-2, "timers") // stash -> [ timers:{} ] d.Pop() d.PushGlobalGoFunction("setTimeout", setTimeout) d.PushGlobalGoFunction("setInterval", setInterval) d.PushGlobalGoFunction("clearTimeout", clearTimeout) d.PushGlobalGoFunction("clearInterval", clearTimeout) return nil } else { d.Pop() return errors.New("Timers are already defined") } } func (d *Context) FlushTimers() { d.PushGlobalStash() d.PushObject() d.PutPropString(-2, "timers") // stash -> [ timers:{} ] d.Pop() } func setTimeout(c *Context) int { id := c.pushTimer(0) timeout := c.ToNumber(1) if timeout < 1 { timeout = 1 } go func(id float64) { <-time.After(time.Duration(timeout) * time.Millisecond) c.Lock() defer c.Unlock() if c.duk_context == nil { fmt.Println("[duktape] Warning!\nsetTimeout invokes callback after the context was destroyed.") return } // check if timer still exists c.putTimer(id) if c.GetType(-1).IsObject() { c.Pcall(0 /* nargs */) } c.dropTimer(id) }(id) c.PushNumber(id) return 1 } func clearTimeout(c *Context) int { if c.GetType(0).IsNumber() { c.dropTimer(c.GetNumber(0)) c.Pop() } return 0 } func setInterval(c *Context) int { id := c.pushTimer(0) timeout := c.ToNumber(1) if timeout < 1 { timeout = 1 } go func(id float64) { ticker := time.NewTicker(time.Duration(timeout) * time.Millisecond) for _ = range ticker.C { c.Lock() // check if duktape context exists if c.duk_context == nil { c.dropTimer(id) c.Pop() ticker.Stop() fmt.Println("[duktape] Warning!\nsetInterval invokes callback after the context was destroyed.") c.Unlock() continue } // check if timer still exists c.putTimer(id) if c.GetType(-1).IsObject() { c.Pcall(0 /* nargs */) c.Pop() } else { c.dropTimer(id) c.Pop() ticker.Stop() } c.Unlock() } }(id) c.PushNumber(id) return 1 } func (d *Context) pushTimer(index int) float64 { id := d.timerIndex.get() d.PushGlobalStash() d.GetPropString(-1, "timers") d.PushNumber(id) d.Dup(index) d.PutProp(-3) d.Pop2() return id } func (d *Context) dropTimer(id float64) { d.PushGlobalStash() d.GetPropString(-1, "timers") d.PushNumber(id) d.DelProp(-2) d.Pop2() } func (d *Context) putTimer(id float64) { d.PushGlobalStash() // stash -> [ ..., timers: { <id>: { func: true } } ] d.GetPropString(-1, "timers") // stash -> [ ..., timers: { <id>: { func: true } } }, { <id>: { func: true } ] d.PushNumber(id) d.GetProp(-2) // stash -> [ ..., timers: { <id>: { func: true } } }, { <id>: { func: true }, { func: true } ] d.Replace(-3) d.Pop() } ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/utils.go ================================================ package duktape // Must returns existing *Context or throw panic. // It is highly recommended to use Must all the time. func (d *Context) Must() *Context { if d.duk_context == nil { panic("[duktape] Context does not exists!\nYou cannot call any contexts methods after `DestroyHeap()` was called.") } return d } ================================================ FILE: vendor/gopkg.in/olebedev/go-duktape.v3/wercker.yml ================================================ box: golang build: steps: - setup-go-workspace - script: name: go get code: | cd $WERCKER_SOURCE_DIR go version go get gopkg.in/check.v1 - script: name: go test code: | go test . -v ================================================ FILE: vendor/gopkg.in/redis.v3/LICENSE ================================================ Copyright (c) 2016 The github.com/go-redis/redis Contributors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: vendor/gopkg.in/redis.v3/Makefile ================================================ all: testdeps go test ./... go test ./... -short -race testdeps: testdata/redis/src/redis-server bench: testdeps go test ./... -test.run=NONE -test.bench=. -test.benchmem .PHONY: all test testdeps bench testdata/redis: mkdir -p $@ wget -qO- https://github.com/antirez/redis/archive/unstable.tar.gz | tar xvz --strip-components=1 -C $@ testdata/redis/src/redis-server: testdata/redis cd $< && make all ================================================ FILE: vendor/gopkg.in/redis.v3/README.md ================================================ # Redis client for Golang [![Build Status](https://travis-ci.org/go-redis/redis.png?branch=master)](https://travis-ci.org/go-redis/redis) Supports: - Redis 3 commands except QUIT, MONITOR, SLOWLOG and SYNC. - [Pub/Sub](http://godoc.org/gopkg.in/redis.v3#PubSub). - [Transactions](http://godoc.org/gopkg.in/redis.v3#Multi). - [Pipelining](http://godoc.org/gopkg.in/redis.v3#Client.Pipeline). - [Scripting](http://godoc.org/gopkg.in/redis.v3#Script). - [Timeouts](http://godoc.org/gopkg.in/redis.v3#Options). - [Redis Sentinel](http://godoc.org/gopkg.in/redis.v3#NewFailoverClient). - [Redis Cluster](http://godoc.org/gopkg.in/redis.v3#NewClusterClient). - [Ring](http://godoc.org/gopkg.in/redis.v3#NewRing). - [Cache friendly](https://github.com/go-redis/cache). - [Rate limiting](https://github.com/go-redis/rate). - [Distributed Locks](https://github.com/bsm/redis-lock). API docs: http://godoc.org/gopkg.in/redis.v3. Examples: http://godoc.org/gopkg.in/redis.v3#pkg-examples. ## Installation Install: go get gopkg.in/redis.v3 ## Quickstart ```go func ExampleNewClient() { client := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password set DB: 0, // use default DB }) pong, err := client.Ping().Result() fmt.Println(pong, err) // Output: PONG <nil> } func ExampleClient() { err := client.Set("key", "value", 0).Err() if err != nil { panic(err) } val, err := client.Get("key").Result() if err != nil { panic(err) } fmt.Println("key", val) val2, err := client.Get("key2").Result() if err == redis.Nil { fmt.Println("key2 does not exists") } else if err != nil { panic(err) } else { fmt.Println("key2", val2) } // Output: key value // key2 does not exists } ``` ## Howto Please go through [examples](http://godoc.org/gopkg.in/redis.v3#pkg-examples) to get an idea how to use this package. ## Look and feel Some corner cases: SET key value EX 10 NX set, err := client.SetNX("key", "value", 10*time.Second).Result() SORT list LIMIT 0 2 ASC vals, err := client.Sort("list", redis.Sort{Offset: 0, Count: 2, Order: "ASC"}).Result() ZRANGEBYSCORE zset -inf +inf WITHSCORES LIMIT 0 2 vals, err := client.ZRangeByScoreWithScores("zset", redis.ZRangeByScore{ Min: "-inf", Max: "+inf", Offset: 0, Count: 2, }).Result() ZINTERSTORE out 2 zset1 zset2 WEIGHTS 2 3 AGGREGATE SUM vals, err := client.ZInterStore("out", redis.ZStore{Weights: []int64{2, 3}}, "zset1", "zset2").Result() EVAL "return {KEYS[1],ARGV[1]}" 1 "key" "hello" vals, err := client.Eval("return {KEYS[1],ARGV[1]}", []string{"key"}, []string{"hello"}).Result() ## Benchmark go-redis vs redigo: ``` BenchmarkSetGoRedis10Conns64Bytes-4 200000 7621 ns/op 210 B/op 6 allocs/op BenchmarkSetGoRedis100Conns64Bytes-4 200000 7554 ns/op 210 B/op 6 allocs/op BenchmarkSetGoRedis10Conns1KB-4 200000 7697 ns/op 210 B/op 6 allocs/op BenchmarkSetGoRedis100Conns1KB-4 200000 7688 ns/op 210 B/op 6 allocs/op BenchmarkSetGoRedis10Conns10KB-4 200000 9214 ns/op 210 B/op 6 allocs/op BenchmarkSetGoRedis100Conns10KB-4 200000 9181 ns/op 210 B/op 6 allocs/op BenchmarkSetGoRedis10Conns1MB-4 2000 583242 ns/op 2337 B/op 6 allocs/op BenchmarkSetGoRedis100Conns1MB-4 2000 583089 ns/op 2338 B/op 6 allocs/op BenchmarkSetRedigo10Conns64Bytes-4 200000 7576 ns/op 208 B/op 7 allocs/op BenchmarkSetRedigo100Conns64Bytes-4 200000 7782 ns/op 208 B/op 7 allocs/op BenchmarkSetRedigo10Conns1KB-4 200000 7958 ns/op 208 B/op 7 allocs/op BenchmarkSetRedigo100Conns1KB-4 200000 7725 ns/op 208 B/op 7 allocs/op BenchmarkSetRedigo10Conns10KB-4 100000 18442 ns/op 208 B/op 7 allocs/op BenchmarkSetRedigo100Conns10KB-4 100000 18818 ns/op 208 B/op 7 allocs/op BenchmarkSetRedigo10Conns1MB-4 2000 668829 ns/op 226 B/op 7 allocs/op BenchmarkSetRedigo100Conns1MB-4 2000 679542 ns/op 226 B/op 7 allocs/op ``` Redis Cluster: ``` BenchmarkRedisPing-4 200000 6983 ns/op 116 B/op 4 allocs/op BenchmarkRedisClusterPing-4 100000 11535 ns/op 117 B/op 4 allocs/op ``` ## Shameless plug Check my [PostgreSQL client for Go](https://github.com/go-pg/pg). ================================================ FILE: vendor/gopkg.in/redis.v3/cluster.go ================================================ package redis import ( "math/rand" "sync" "sync/atomic" "time" "gopkg.in/redis.v3/internal" "gopkg.in/redis.v3/internal/hashtag" "gopkg.in/redis.v3/internal/pool" ) // ClusterClient is a Redis Cluster client representing a pool of zero // or more underlying connections. It's safe for concurrent use by // multiple goroutines. type ClusterClient struct { commandable opt *ClusterOptions slotsMx sync.RWMutex // protects slots and addrs addrs []string slots [][]string clientsMx sync.RWMutex // protects clients and closed clients map[string]*Client _closed int32 // atomic // Reports where slots reloading is in progress. reloading uint32 } // NewClusterClient returns a Redis Cluster client as described in // http://redis.io/topics/cluster-spec. func NewClusterClient(opt *ClusterOptions) *ClusterClient { client := &ClusterClient{ opt: opt, addrs: opt.Addrs, slots: make([][]string, hashtag.SlotNumber), clients: make(map[string]*Client), } client.commandable.process = client.process client.reloadSlots() return client } // getClients returns a snapshot of clients for cluster nodes // this ClusterClient has been working with recently. // Note that snapshot can contain closed clients. func (c *ClusterClient) getClients() map[string]*Client { c.clientsMx.RLock() clients := make(map[string]*Client, len(c.clients)) for addr, client := range c.clients { clients[addr] = client } c.clientsMx.RUnlock() return clients } // Watch creates new transaction and marks the keys to be watched // for conditional execution of a transaction. func (c *ClusterClient) Watch(keys ...string) (*Multi, error) { addr := c.slotMasterAddr(hashtag.Slot(keys[0])) client, err := c.getClient(addr) if err != nil { return nil, err } return client.Watch(keys...) } // PoolStats returns accumulated connection pool stats. func (c *ClusterClient) PoolStats() *PoolStats { acc := PoolStats{} for _, client := range c.getClients() { s := client.connPool.Stats() acc.Requests += s.Requests acc.Hits += s.Hits acc.Waits += s.Waits acc.Timeouts += s.Timeouts acc.TotalConns += s.TotalConns acc.FreeConns += s.FreeConns } return &acc } func (c *ClusterClient) closed() bool { return atomic.LoadInt32(&c._closed) == 1 } // Close closes the cluster client, releasing any open resources. // // It is rare to Close a ClusterClient, as the ClusterClient is meant // to be long-lived and shared between many goroutines. func (c *ClusterClient) Close() error { if !atomic.CompareAndSwapInt32(&c._closed, 0, 1) { return pool.ErrClosed } c.clientsMx.Lock() c.resetClients() c.clientsMx.Unlock() c.setSlots(nil) return nil } // getClient returns a Client for a given address. func (c *ClusterClient) getClient(addr string) (*Client, error) { if c.closed() { return nil, pool.ErrClosed } if addr == "" { return c.randomClient() } c.clientsMx.RLock() client, ok := c.clients[addr] c.clientsMx.RUnlock() if ok { return client, nil } c.clientsMx.Lock() client, ok = c.clients[addr] if !ok { opt := c.opt.clientOptions() opt.Addr = addr client = NewClient(opt) c.clients[addr] = client } c.clientsMx.Unlock() return client, nil } func (c *ClusterClient) slotAddrs(slot int) []string { c.slotsMx.RLock() addrs := c.slots[slot] c.slotsMx.RUnlock() return addrs } func (c *ClusterClient) slotMasterAddr(slot int) string { addrs := c.slotAddrs(slot) if len(addrs) > 0 { return addrs[0] } return "" } // randomClient returns a Client for the first live node. func (c *ClusterClient) randomClient() (client *Client, err error) { for i := 0; i < 10; i++ { n := rand.Intn(len(c.addrs)) client, err = c.getClient(c.addrs[n]) if err != nil { continue } err = client.ClusterInfo().Err() if err == nil { return client, nil } } return nil, err } func (c *ClusterClient) process(cmd Cmder) { var ask bool slot := hashtag.Slot(cmd.clusterKey()) addr := c.slotMasterAddr(slot) client, err := c.getClient(addr) if err != nil { cmd.setErr(err) return } for attempt := 0; attempt <= c.opt.getMaxRedirects(); attempt++ { if attempt > 0 { cmd.reset() } if ask { pipe := client.Pipeline() pipe.Process(NewCmd("ASKING")) pipe.Process(cmd) _, _ = pipe.Exec() pipe.Close() ask = false } else { client.Process(cmd) } // If there is no (real) error, we are done! err := cmd.Err() if err == nil { return } // On network errors try random node. if shouldRetry(err) { client, err = c.randomClient() if err != nil { return } continue } var moved bool var addr string moved, ask, addr = isMovedError(err) if moved || ask { if moved && c.slotMasterAddr(slot) != addr { c.lazyReloadSlots() } client, err = c.getClient(addr) if err != nil { return } continue } break } } // Closes all clients and returns last error if there are any. func (c *ClusterClient) resetClients() (retErr error) { for addr, client := range c.clients { if err := client.Close(); err != nil && retErr == nil { retErr = err } delete(c.clients, addr) } return retErr } func (c *ClusterClient) setSlots(slots []ClusterSlotInfo) { c.slotsMx.Lock() seen := make(map[string]struct{}) for _, addr := range c.addrs { seen[addr] = struct{}{} } for i := 0; i < hashtag.SlotNumber; i++ { c.slots[i] = c.slots[i][:0] } for _, info := range slots { for slot := info.Start; slot <= info.End; slot++ { c.slots[slot] = info.Addrs } for _, addr := range info.Addrs { if _, ok := seen[addr]; !ok { c.addrs = append(c.addrs, addr) seen[addr] = struct{}{} } } } c.slotsMx.Unlock() } func (c *ClusterClient) reloadSlots() { defer atomic.StoreUint32(&c.reloading, 0) client, err := c.randomClient() if err != nil { internal.Logf("randomClient failed: %s", err) return } slots, err := client.ClusterSlots().Result() if err != nil { internal.Logf("ClusterSlots failed: %s", err) return } c.setSlots(slots) } func (c *ClusterClient) lazyReloadSlots() { if !atomic.CompareAndSwapUint32(&c.reloading, 0, 1) { return } go c.reloadSlots() } // reaper closes idle connections to the cluster. func (c *ClusterClient) reaper(frequency time.Duration) { ticker := time.NewTicker(frequency) defer ticker.Stop() for _ = range ticker.C { if c.closed() { break } var n int for _, client := range c.getClients() { nn, err := client.connPool.(*pool.ConnPool).ReapStaleConns() if err != nil { internal.Logf("ReapStaleConns failed: %s", err) } else { n += nn } } s := c.PoolStats() internal.Logf( "reaper: removed %d stale conns (TotalConns=%d FreeConns=%d Requests=%d Hits=%d Timeouts=%d)", n, s.TotalConns, s.FreeConns, s.Requests, s.Hits, s.Timeouts, ) } } //------------------------------------------------------------------------------ // ClusterOptions are used to configure a cluster client and should be // passed to NewClusterClient. type ClusterOptions struct { // A seed list of host:port addresses of cluster nodes. Addrs []string // The maximum number of retries before giving up. Command is retried // on network errors and MOVED/ASK redirects. // Default is 16. MaxRedirects int // Following options are copied from Options struct. Password string DialTimeout time.Duration ReadTimeout time.Duration WriteTimeout time.Duration // PoolSize applies per cluster node and not for the whole cluster. PoolSize int PoolTimeout time.Duration IdleTimeout time.Duration IdleCheckFrequency time.Duration } func (opt *ClusterOptions) getMaxRedirects() int { if opt.MaxRedirects == -1 { return 0 } if opt.MaxRedirects == 0 { return 16 } return opt.MaxRedirects } func (opt *ClusterOptions) clientOptions() *Options { return &Options{ Password: opt.Password, DialTimeout: opt.DialTimeout, ReadTimeout: opt.ReadTimeout, WriteTimeout: opt.WriteTimeout, PoolSize: opt.PoolSize, PoolTimeout: opt.PoolTimeout, IdleTimeout: opt.IdleTimeout, // IdleCheckFrequency is not copied to disable reaper } } ================================================ FILE: vendor/gopkg.in/redis.v3/cluster_pipeline.go ================================================ package redis import ( "gopkg.in/redis.v3/internal/hashtag" "gopkg.in/redis.v3/internal/pool" ) // ClusterPipeline is not thread-safe. type ClusterPipeline struct { commandable cluster *ClusterClient cmds []Cmder closed bool } // Pipeline creates a new pipeline which is able to execute commands // against multiple shards. It's NOT safe for concurrent use by // multiple goroutines. func (c *ClusterClient) Pipeline() *ClusterPipeline { pipe := &ClusterPipeline{ cluster: c, cmds: make([]Cmder, 0, 10), } pipe.commandable.process = pipe.process return pipe } func (c *ClusterClient) Pipelined(fn func(*ClusterPipeline) error) ([]Cmder, error) { pipe := c.Pipeline() if err := fn(pipe); err != nil { return nil, err } cmds, err := pipe.Exec() _ = pipe.Close() return cmds, err } func (pipe *ClusterPipeline) process(cmd Cmder) { pipe.cmds = append(pipe.cmds, cmd) } // Discard resets the pipeline and discards queued commands. func (pipe *ClusterPipeline) Discard() error { if pipe.closed { return pool.ErrClosed } pipe.cmds = pipe.cmds[:0] return nil } func (pipe *ClusterPipeline) Exec() (cmds []Cmder, retErr error) { if pipe.closed { return nil, pool.ErrClosed } if len(pipe.cmds) == 0 { return []Cmder{}, nil } cmds = pipe.cmds pipe.cmds = make([]Cmder, 0, 10) cmdsMap := make(map[string][]Cmder) for _, cmd := range cmds { slot := hashtag.Slot(cmd.clusterKey()) addr := pipe.cluster.slotMasterAddr(slot) cmdsMap[addr] = append(cmdsMap[addr], cmd) } for attempt := 0; attempt <= pipe.cluster.opt.getMaxRedirects(); attempt++ { failedCmds := make(map[string][]Cmder) for addr, cmds := range cmdsMap { client, err := pipe.cluster.getClient(addr) if err != nil { setCmdsErr(cmds, err) retErr = err continue } cn, err := client.conn() if err != nil { setCmdsErr(cmds, err) retErr = err continue } failedCmds, err = pipe.execClusterCmds(cn, cmds, failedCmds) if err != nil { retErr = err } client.putConn(cn, err, false) } cmdsMap = failedCmds } return cmds, retErr } // Close closes the pipeline, releasing any open resources. func (pipe *ClusterPipeline) Close() error { pipe.Discard() pipe.closed = true return nil } func (pipe *ClusterPipeline) execClusterCmds( cn *pool.Conn, cmds []Cmder, failedCmds map[string][]Cmder, ) (map[string][]Cmder, error) { if err := writeCmd(cn, cmds...); err != nil { setCmdsErr(cmds, err) return failedCmds, err } var firstCmdErr error for i, cmd := range cmds { err := cmd.readReply(cn) if err == nil { continue } if isNetworkError(err) { cmd.reset() failedCmds[""] = append(failedCmds[""], cmds[i:]...) break } else if moved, ask, addr := isMovedError(err); moved { pipe.cluster.lazyReloadSlots() cmd.reset() failedCmds[addr] = append(failedCmds[addr], cmd) } else if ask { cmd.reset() failedCmds[addr] = append(failedCmds[addr], NewCmd("ASKING"), cmd) } else if firstCmdErr == nil { firstCmdErr = err } } return failedCmds, firstCmdErr } ================================================ FILE: vendor/gopkg.in/redis.v3/command.go ================================================ package redis import ( "bytes" "fmt" "strconv" "strings" "time" "gopkg.in/redis.v3/internal/pool" ) var ( _ Cmder = (*Cmd)(nil) _ Cmder = (*SliceCmd)(nil) _ Cmder = (*StatusCmd)(nil) _ Cmder = (*IntCmd)(nil) _ Cmder = (*DurationCmd)(nil) _ Cmder = (*BoolCmd)(nil) _ Cmder = (*StringCmd)(nil) _ Cmder = (*FloatCmd)(nil) _ Cmder = (*StringSliceCmd)(nil) _ Cmder = (*BoolSliceCmd)(nil) _ Cmder = (*StringStringMapCmd)(nil) _ Cmder = (*StringIntMapCmd)(nil) _ Cmder = (*ZSliceCmd)(nil) _ Cmder = (*ScanCmd)(nil) _ Cmder = (*ClusterSlotCmd)(nil) ) type Cmder interface { args() []interface{} readReply(*pool.Conn) error setErr(error) reset() readTimeout() *time.Duration clusterKey() string Err() error fmt.Stringer } func setCmdsErr(cmds []Cmder, e error) { for _, cmd := range cmds { cmd.setErr(e) } } func resetCmds(cmds []Cmder) { for _, cmd := range cmds { cmd.reset() } } func writeCmd(cn *pool.Conn, cmds ...Cmder) error { cn.Buf = cn.Buf[:0] for _, cmd := range cmds { var err error cn.Buf, err = appendArgs(cn.Buf, cmd.args()) if err != nil { return err } } _, err := cn.Write(cn.Buf) return err } func cmdString(cmd Cmder, val interface{}) string { var ss []string for _, arg := range cmd.args() { ss = append(ss, fmt.Sprint(arg)) } s := strings.Join(ss, " ") if err := cmd.Err(); err != nil { return s + ": " + err.Error() } if val != nil { switch vv := val.(type) { case []byte: return s + ": " + string(vv) default: return s + ": " + fmt.Sprint(val) } } return s } //------------------------------------------------------------------------------ type baseCmd struct { _args []interface{} err error _clusterKeyPos int _readTimeout *time.Duration } func (cmd *baseCmd) Err() error { if cmd.err != nil { return cmd.err } return nil } func (cmd *baseCmd) args() []interface{} { return cmd._args } func (cmd *baseCmd) readTimeout() *time.Duration { return cmd._readTimeout } func (cmd *baseCmd) setReadTimeout(d time.Duration) { cmd._readTimeout = &d } func (cmd *baseCmd) clusterKey() string { if cmd._clusterKeyPos > 0 && cmd._clusterKeyPos < len(cmd._args) { return fmt.Sprint(cmd._args[cmd._clusterKeyPos]) } return "" } func (cmd *baseCmd) setErr(e error) { cmd.err = e } //------------------------------------------------------------------------------ type Cmd struct { baseCmd val interface{} } func NewCmd(args ...interface{}) *Cmd { return &Cmd{baseCmd: baseCmd{_args: args}} } func (cmd *Cmd) reset() { cmd.val = nil cmd.err = nil } func (cmd *Cmd) Val() interface{} { return cmd.val } func (cmd *Cmd) Result() (interface{}, error) { return cmd.val, cmd.err } func (cmd *Cmd) String() string { return cmdString(cmd, cmd.val) } func (cmd *Cmd) readReply(cn *pool.Conn) error { val, err := readReply(cn, sliceParser) if err != nil { cmd.err = err return cmd.err } if v, ok := val.([]byte); ok { // Convert to string to preserve old behaviour. // TODO: remove in v4 cmd.val = string(v) } else { cmd.val = val } return nil } //------------------------------------------------------------------------------ type SliceCmd struct { baseCmd val []interface{} } func NewSliceCmd(args ...interface{}) *SliceCmd { return &SliceCmd{baseCmd: baseCmd{_args: args, _clusterKeyPos: 1}} } func (cmd *SliceCmd) reset() { cmd.val = nil cmd.err = nil } func (cmd *SliceCmd) Val() []interface{} { return cmd.val } func (cmd *SliceCmd) Result() ([]interface{}, error) { return cmd.val, cmd.err } func (cmd *SliceCmd) String() string { return cmdString(cmd, cmd.val) } func (cmd *SliceCmd) readReply(cn *pool.Conn) error { v, err := readArrayReply(cn, sliceParser) if err != nil { cmd.err = err return err } cmd.val = v.([]interface{}) return nil } //------------------------------------------------------------------------------ type StatusCmd struct { baseCmd val string } func NewStatusCmd(args ...interface{}) *StatusCmd { return &StatusCmd{baseCmd: baseCmd{_args: args, _clusterKeyPos: 1}} } func newKeylessStatusCmd(args ...interface{}) *StatusCmd { return &StatusCmd{baseCmd: baseCmd{_args: args}} } func (cmd *StatusCmd) reset() { cmd.val = "" cmd.err = nil } func (cmd *StatusCmd) Val() string { return cmd.val } func (cmd *StatusCmd) Result() (string, error) { return cmd.val, cmd.err } func (cmd *StatusCmd) String() string { return cmdString(cmd, cmd.val) } func (cmd *StatusCmd) readReply(cn *pool.Conn) error { cmd.val, cmd.err = readStringReply(cn) return cmd.err } //------------------------------------------------------------------------------ type IntCmd struct { baseCmd val int64 } func NewIntCmd(args ...interface{}) *IntCmd { return &IntCmd{baseCmd: baseCmd{_args: args, _clusterKeyPos: 1}} } func (cmd *IntCmd) reset() { cmd.val = 0 cmd.err = nil } func (cmd *IntCmd) Val() int64 { return cmd.val } func (cmd *IntCmd) Result() (int64, error) { return cmd.val, cmd.err } func (cmd *IntCmd) String() string { return cmdString(cmd, cmd.val) } func (cmd *IntCmd) readReply(cn *pool.Conn) error { cmd.val, cmd.err = readIntReply(cn) return cmd.err } //------------------------------------------------------------------------------ type DurationCmd struct { baseCmd val time.Duration precision time.Duration } func NewDurationCmd(precision time.Duration, args ...interface{}) *DurationCmd { return &DurationCmd{ precision: precision, baseCmd: baseCmd{_args: args, _clusterKeyPos: 1}, } } func (cmd *DurationCmd) reset() { cmd.val = 0 cmd.err = nil } func (cmd *DurationCmd) Val() time.Duration { return cmd.val } func (cmd *DurationCmd) Result() (time.Duration, error) { return cmd.val, cmd.err } func (cmd *DurationCmd) String() string { return cmdString(cmd, cmd.val) } func (cmd *DurationCmd) readReply(cn *pool.Conn) error { n, err := readIntReply(cn) if err != nil { cmd.err = err return err } cmd.val = time.Duration(n) * cmd.precision return nil } //------------------------------------------------------------------------------ type BoolCmd struct { baseCmd val bool } func NewBoolCmd(args ...interface{}) *BoolCmd { return &BoolCmd{baseCmd: baseCmd{_args: args, _clusterKeyPos: 1}} } func (cmd *BoolCmd) reset() { cmd.val = false cmd.err = nil } func (cmd *BoolCmd) Val() bool { return cmd.val } func (cmd *BoolCmd) Result() (bool, error) { return cmd.val, cmd.err } func (cmd *BoolCmd) String() string { return cmdString(cmd, cmd.val) } var ok = []byte("OK") func (cmd *BoolCmd) readReply(cn *pool.Conn) error { v, err := readReply(cn, nil) // `SET key value NX` returns nil when key already exists. But // `SETNX key value` returns bool (0/1). So convert nil to bool. // TODO: is this okay? if err == Nil { cmd.val = false return nil } if err != nil { cmd.err = err return err } switch vv := v.(type) { case int64: cmd.val = vv == 1 return nil case []byte: cmd.val = bytes.Equal(vv, ok) return nil default: return fmt.Errorf("got %T, wanted int64 or string", v) } } //------------------------------------------------------------------------------ type StringCmd struct { baseCmd val []byte } func NewStringCmd(args ...interface{}) *StringCmd { return &StringCmd{baseCmd: baseCmd{_args: args, _clusterKeyPos: 1}} } func (cmd *StringCmd) reset() { cmd.val = nil cmd.err = nil } func (cmd *StringCmd) Val() string { return bytesToString(cmd.val) } func (cmd *StringCmd) Result() (string, error) { return cmd.Val(), cmd.err } func (cmd *StringCmd) Bytes() ([]byte, error) { return cmd.val, cmd.err } func (cmd *StringCmd) Int64() (int64, error) { if cmd.err != nil { return 0, cmd.err } return strconv.ParseInt(cmd.Val(), 10, 64) } func (cmd *StringCmd) Uint64() (uint64, error) { if cmd.err != nil { return 0, cmd.err } return strconv.ParseUint(cmd.Val(), 10, 64) } func (cmd *StringCmd) Float64() (float64, error) { if cmd.err != nil { return 0, cmd.err } return strconv.ParseFloat(cmd.Val(), 64) } func (cmd *StringCmd) Scan(val interface{}) error { if cmd.err != nil { return cmd.err } return scan(cmd.val, val) } func (cmd *StringCmd) String() string { return cmdString(cmd, cmd.val) } func (cmd *StringCmd) readReply(cn *pool.Conn) error { b, err := readBytesReply(cn) if err != nil { cmd.err = err return err } new := make([]byte, len(b)) copy(new, b) cmd.val = new return nil } //------------------------------------------------------------------------------ type FloatCmd struct { baseCmd val float64 } func NewFloatCmd(args ...interface{}) *FloatCmd { return &FloatCmd{baseCmd: baseCmd{_args: args, _clusterKeyPos: 1}} } func (cmd *FloatCmd) reset() { cmd.val = 0 cmd.err = nil } func (cmd *FloatCmd) Val() float64 { return cmd.val } func (cmd *FloatCmd) Result() (float64, error) { return cmd.Val(), cmd.Err() } func (cmd *FloatCmd) String() string { return cmdString(cmd, cmd.val) } func (cmd *FloatCmd) readReply(cn *pool.Conn) error { cmd.val, cmd.err = readFloatReply(cn) return cmd.err } //------------------------------------------------------------------------------ type StringSliceCmd struct { baseCmd val []string } func NewStringSliceCmd(args ...interface{}) *StringSliceCmd { return &StringSliceCmd{baseCmd: baseCmd{_args: args, _clusterKeyPos: 1}} } func (cmd *StringSliceCmd) reset() { cmd.val = nil cmd.err = nil } func (cmd *StringSliceCmd) Val() []string { return cmd.val } func (cmd *StringSliceCmd) Result() ([]string, error) { return cmd.Val(), cmd.Err() } func (cmd *StringSliceCmd) String() string { return cmdString(cmd, cmd.val) } func (cmd *StringSliceCmd) readReply(cn *pool.Conn) error { v, err := readArrayReply(cn, stringSliceParser) if err != nil { cmd.err = err return err } cmd.val = v.([]string) return nil } //------------------------------------------------------------------------------ type BoolSliceCmd struct { baseCmd val []bool } func NewBoolSliceCmd(args ...interface{}) *BoolSliceCmd { return &BoolSliceCmd{baseCmd: baseCmd{_args: args, _clusterKeyPos: 1}} } func (cmd *BoolSliceCmd) reset() { cmd.val = nil cmd.err = nil } func (cmd *BoolSliceCmd) Val() []bool { return cmd.val } func (cmd *BoolSliceCmd) Result() ([]bool, error) { return cmd.val, cmd.err } func (cmd *BoolSliceCmd) String() string { return cmdString(cmd, cmd.val) } func (cmd *BoolSliceCmd) readReply(cn *pool.Conn) error { v, err := readArrayReply(cn, boolSliceParser) if err != nil { cmd.err = err return err } cmd.val = v.([]bool) return nil } //------------------------------------------------------------------------------ type StringStringMapCmd struct { baseCmd val map[string]string } func NewStringStringMapCmd(args ...interface{}) *StringStringMapCmd { return &StringStringMapCmd{baseCmd: baseCmd{_args: args, _clusterKeyPos: 1}} } func (cmd *StringStringMapCmd) reset() { cmd.val = nil cmd.err = nil } func (cmd *StringStringMapCmd) Val() map[string]string { return cmd.val } func (cmd *StringStringMapCmd) Result() (map[string]string, error) { return cmd.val, cmd.err } func (cmd *StringStringMapCmd) String() string { return cmdString(cmd, cmd.val) } func (cmd *StringStringMapCmd) readReply(cn *pool.Conn) error { v, err := readArrayReply(cn, stringStringMapParser) if err != nil { cmd.err = err return err } cmd.val = v.(map[string]string) return nil } //------------------------------------------------------------------------------ type StringIntMapCmd struct { baseCmd val map[string]int64 } func NewStringIntMapCmd(args ...interface{}) *StringIntMapCmd { return &StringIntMapCmd{baseCmd: baseCmd{_args: args, _clusterKeyPos: 1}} } func (cmd *StringIntMapCmd) Val() map[string]int64 { return cmd.val } func (cmd *StringIntMapCmd) Result() (map[string]int64, error) { return cmd.val, cmd.err } func (cmd *StringIntMapCmd) String() string { return cmdString(cmd, cmd.val) } func (cmd *StringIntMapCmd) reset() { cmd.val = nil cmd.err = nil } func (cmd *StringIntMapCmd) readReply(cn *pool.Conn) error { v, err := readArrayReply(cn, stringIntMapParser) if err != nil { cmd.err = err return err } cmd.val = v.(map[string]int64) return nil } //------------------------------------------------------------------------------ type ZSliceCmd struct { baseCmd val []Z } func NewZSliceCmd(args ...interface{}) *ZSliceCmd { return &ZSliceCmd{baseCmd: baseCmd{_args: args, _clusterKeyPos: 1}} } func (cmd *ZSliceCmd) reset() { cmd.val = nil cmd.err = nil } func (cmd *ZSliceCmd) Val() []Z { return cmd.val } func (cmd *ZSliceCmd) Result() ([]Z, error) { return cmd.val, cmd.err } func (cmd *ZSliceCmd) String() string { return cmdString(cmd, cmd.val) } func (cmd *ZSliceCmd) readReply(cn *pool.Conn) error { v, err := readArrayReply(cn, zSliceParser) if err != nil { cmd.err = err return err } cmd.val = v.([]Z) return nil } //------------------------------------------------------------------------------ type ScanCmd struct { baseCmd cursor int64 keys []string } func NewScanCmd(args ...interface{}) *ScanCmd { return &ScanCmd{baseCmd: baseCmd{_args: args, _clusterKeyPos: 1}} } func (cmd *ScanCmd) reset() { cmd.cursor = 0 cmd.keys = nil cmd.err = nil } // TODO: cursor should be string to match redis type // TODO: swap return values func (cmd *ScanCmd) Val() (int64, []string) { return cmd.cursor, cmd.keys } func (cmd *ScanCmd) Result() (int64, []string, error) { return cmd.cursor, cmd.keys, cmd.err } func (cmd *ScanCmd) String() string { return cmdString(cmd, cmd.keys) } func (cmd *ScanCmd) readReply(cn *pool.Conn) error { keys, cursor, err := readScanReply(cn) if err != nil { cmd.err = err return cmd.err } cmd.keys = keys cmd.cursor = cursor return nil } //------------------------------------------------------------------------------ // TODO: rename to ClusterSlot type ClusterSlotInfo struct { Start int End int Addrs []string } // TODO: rename to ClusterSlotsCmd type ClusterSlotCmd struct { baseCmd val []ClusterSlotInfo } func NewClusterSlotCmd(args ...interface{}) *ClusterSlotCmd { return &ClusterSlotCmd{baseCmd: baseCmd{_args: args, _clusterKeyPos: 1}} } func (cmd *ClusterSlotCmd) Val() []ClusterSlotInfo { return cmd.val } func (cmd *ClusterSlotCmd) Result() ([]ClusterSlotInfo, error) { return cmd.Val(), cmd.Err() } func (cmd *ClusterSlotCmd) String() string { return cmdString(cmd, cmd.val) } func (cmd *ClusterSlotCmd) reset() { cmd.val = nil cmd.err = nil } func (cmd *ClusterSlotCmd) readReply(cn *pool.Conn) error { v, err := readArrayReply(cn, clusterSlotInfoSliceParser) if err != nil { cmd.err = err return err } cmd.val = v.([]ClusterSlotInfo) return nil } //------------------------------------------------------------------------------ // GeoLocation is used with GeoAdd to add geospatial location. type GeoLocation struct { Name string Longitude, Latitude, Dist float64 GeoHash int64 } // GeoRadiusQuery is used with GeoRadius to query geospatial index. type GeoRadiusQuery struct { Radius float64 // Can be m, km, ft, or mi. Default is km. Unit string WithCoord bool WithDist bool WithGeoHash bool Count int // Can be ASC or DESC. Default is no sort order. Sort string } type GeoLocationCmd struct { baseCmd q *GeoRadiusQuery locations []GeoLocation } func NewGeoLocationCmd(q *GeoRadiusQuery, args ...interface{}) *GeoLocationCmd { args = append(args, q.Radius) if q.Unit != "" { args = append(args, q.Unit) } else { args = append(args, "km") } if q.WithCoord { args = append(args, "WITHCOORD") } if q.WithDist { args = append(args, "WITHDIST") } if q.WithGeoHash { args = append(args, "WITHHASH") } if q.Count > 0 { args = append(args, "COUNT", q.Count) } if q.Sort != "" { args = append(args, q.Sort) } return &GeoLocationCmd{ baseCmd: baseCmd{ _args: args, _clusterKeyPos: 1, }, q: q, } } func (cmd *GeoLocationCmd) reset() { cmd.locations = nil cmd.err = nil } func (cmd *GeoLocationCmd) Val() []GeoLocation { return cmd.locations } func (cmd *GeoLocationCmd) Result() ([]GeoLocation, error) { return cmd.locations, cmd.err } func (cmd *GeoLocationCmd) String() string { return cmdString(cmd, cmd.locations) } func (cmd *GeoLocationCmd) readReply(cn *pool.Conn) error { reply, err := readArrayReply(cn, newGeoLocationSliceParser(cmd.q)) if err != nil { cmd.err = err return err } cmd.locations = reply.([]GeoLocation) return nil } ================================================ FILE: vendor/gopkg.in/redis.v3/commands.go ================================================ package redis import ( "io" "strconv" "time" "gopkg.in/redis.v3/internal" ) func formatInt(i int64) string { return strconv.FormatInt(i, 10) } func formatUint(i uint64) string { return strconv.FormatUint(i, 10) } func formatFloat(f float64) string { return strconv.FormatFloat(f, 'f', -1, 64) } func readTimeout(timeout time.Duration) time.Duration { if timeout == 0 { return 0 } return timeout + time.Second } func usePrecise(dur time.Duration) bool { return dur < time.Second || dur%time.Second != 0 } func formatMs(dur time.Duration) string { if dur > 0 && dur < time.Millisecond { internal.Logf( "specified duration is %s, but minimal supported value is %s", dur, time.Millisecond, ) } return formatInt(int64(dur / time.Millisecond)) } func formatSec(dur time.Duration) string { if dur > 0 && dur < time.Second { internal.Logf( "specified duration is %s, but minimal supported value is %s", dur, time.Second, ) } return formatInt(int64(dur / time.Second)) } type commandable struct { process func(cmd Cmder) } func (c *commandable) Process(cmd Cmder) { c.process(cmd) } //------------------------------------------------------------------------------ func (c *commandable) Auth(password string) *StatusCmd { cmd := newKeylessStatusCmd("AUTH", password) c.Process(cmd) return cmd } func (c *commandable) Echo(message string) *StringCmd { cmd := NewStringCmd("ECHO", message) cmd._clusterKeyPos = 0 c.Process(cmd) return cmd } func (c *commandable) Ping() *StatusCmd { cmd := newKeylessStatusCmd("PING") c.Process(cmd) return cmd } func (c *commandable) Quit() *StatusCmd { panic("not implemented") } func (c *commandable) Select(index int64) *StatusCmd { cmd := newKeylessStatusCmd("SELECT", index) c.Process(cmd) return cmd } //------------------------------------------------------------------------------ func (c *commandable) Del(keys ...string) *IntCmd { args := make([]interface{}, 1+len(keys)) args[0] = "DEL" for i, key := range keys { args[1+i] = key } cmd := NewIntCmd(args...) c.Process(cmd) return cmd } func (c *commandable) Dump(key string) *StringCmd { cmd := NewStringCmd("DUMP", key) c.Process(cmd) return cmd } func (c *commandable) Exists(key string) *BoolCmd { cmd := NewBoolCmd("EXISTS", key) c.Process(cmd) return cmd } func (c *commandable) Expire(key string, expiration time.Duration) *BoolCmd { cmd := NewBoolCmd("EXPIRE", key, formatSec(expiration)) c.Process(cmd) return cmd } func (c *commandable) ExpireAt(key string, tm time.Time) *BoolCmd { cmd := NewBoolCmd("EXPIREAT", key, tm.Unix()) c.Process(cmd) return cmd } func (c *commandable) Keys(pattern string) *StringSliceCmd { cmd := NewStringSliceCmd("KEYS", pattern) c.Process(cmd) return cmd } func (c *commandable) Migrate(host, port, key string, db int64, timeout time.Duration) *StatusCmd { cmd := NewStatusCmd( "MIGRATE", host, port, key, db, formatMs(timeout), ) cmd._clusterKeyPos = 3 cmd.setReadTimeout(readTimeout(timeout)) c.Process(cmd) return cmd } func (c *commandable) Move(key string, db int64) *BoolCmd { cmd := NewBoolCmd("MOVE", key, db) c.Process(cmd) return cmd } func (c *commandable) ObjectRefCount(keys ...string) *IntCmd { args := make([]interface{}, 2+len(keys)) args[0] = "OBJECT" args[1] = "REFCOUNT" for i, key := range keys { args[2+i] = key } cmd := NewIntCmd(args...) cmd._clusterKeyPos = 2 c.Process(cmd) return cmd } func (c *commandable) ObjectEncoding(keys ...string) *StringCmd { args := make([]interface{}, 2+len(keys)) args[0] = "OBJECT" args[1] = "ENCODING" for i, key := range keys { args[2+i] = key } cmd := NewStringCmd(args...) cmd._clusterKeyPos = 2 c.Process(cmd) return cmd } func (c *commandable) ObjectIdleTime(keys ...string) *DurationCmd { args := make([]interface{}, 2+len(keys)) args[0] = "OBJECT" args[1] = "IDLETIME" for i, key := range keys { args[2+i] = key } cmd := NewDurationCmd(time.Second, args...) cmd._clusterKeyPos = 2 c.Process(cmd) return cmd } func (c *commandable) Persist(key string) *BoolCmd { cmd := NewBoolCmd("PERSIST", key) c.Process(cmd) return cmd } func (c *commandable) PExpire(key string, expiration time.Duration) *BoolCmd { cmd := NewBoolCmd("PEXPIRE", key, formatMs(expiration)) c.Process(cmd) return cmd } func (c *commandable) PExpireAt(key string, tm time.Time) *BoolCmd { cmd := NewBoolCmd( "PEXPIREAT", key, tm.UnixNano()/int64(time.Millisecond), ) c.Process(cmd) return cmd } func (c *commandable) PTTL(key string) *DurationCmd { cmd := NewDurationCmd(time.Millisecond, "PTTL", key) c.Process(cmd) return cmd } func (c *commandable) RandomKey() *StringCmd { cmd := NewStringCmd("RANDOMKEY") c.Process(cmd) return cmd } func (c *commandable) Rename(key, newkey string) *StatusCmd { cmd := NewStatusCmd("RENAME", key, newkey) c.Process(cmd) return cmd } func (c *commandable) RenameNX(key, newkey string) *BoolCmd { cmd := NewBoolCmd("RENAMENX", key, newkey) c.Process(cmd) return cmd } func (c *commandable) Restore(key string, ttl time.Duration, value string) *StatusCmd { cmd := NewStatusCmd( "RESTORE", key, formatMs(ttl), value, ) c.Process(cmd) return cmd } func (c *commandable) RestoreReplace(key string, ttl time.Duration, value string) *StatusCmd { cmd := NewStatusCmd( "RESTORE", key, formatMs(ttl), value, "REPLACE", ) c.Process(cmd) return cmd } type Sort struct { By string Offset, Count float64 Get []string Order string IsAlpha bool Store string } func (sort *Sort) args(key string) []interface{} { args := []interface{}{"SORT", key} if sort.By != "" { args = append(args, "BY", sort.By) } if sort.Offset != 0 || sort.Count != 0 { args = append(args, "LIMIT", sort.Offset, sort.Count) } for _, get := range sort.Get { args = append(args, "GET", get) } if sort.Order != "" { args = append(args, sort.Order) } if sort.IsAlpha { args = append(args, "ALPHA") } if sort.Store != "" { args = append(args, "STORE", sort.Store) } return args } func (c *commandable) Sort(key string, sort Sort) *StringSliceCmd { cmd := NewStringSliceCmd(sort.args(key)...) c.Process(cmd) return cmd } func (c *commandable) SortInterfaces(key string, sort Sort) *SliceCmd { cmd := NewSliceCmd(sort.args(key)...) c.Process(cmd) return cmd } func (c *commandable) TTL(key string) *DurationCmd { cmd := NewDurationCmd(time.Second, "TTL", key) c.Process(cmd) return cmd } func (c *commandable) Type(key string) *StatusCmd { cmd := NewStatusCmd("TYPE", key) c.Process(cmd) return cmd } func (c *commandable) Scan(cursor int64, match string, count int64) *ScanCmd { args := []interface{}{"SCAN", cursor} if match != "" { args = append(args, "MATCH", match) } if count > 0 { args = append(args, "COUNT", count) } cmd := NewScanCmd(args...) c.Process(cmd) return cmd } func (c *commandable) SScan(key string, cursor int64, match string, count int64) *ScanCmd { args := []interface{}{"SSCAN", key, cursor} if match != "" { args = append(args, "MATCH", match) } if count > 0 { args = append(args, "COUNT", count) } cmd := NewScanCmd(args...) c.Process(cmd) return cmd } func (c *commandable) HScan(key string, cursor int64, match string, count int64) *ScanCmd { args := []interface{}{"HSCAN", key, cursor} if match != "" { args = append(args, "MATCH", match) } if count > 0 { args = append(args, "COUNT", count) } cmd := NewScanCmd(args...) c.Process(cmd) return cmd } func (c *commandable) ZScan(key string, cursor int64, match string, count int64) *ScanCmd { args := []interface{}{"ZSCAN", key, cursor} if match != "" { args = append(args, "MATCH", match) } if count > 0 { args = append(args, "COUNT", count) } cmd := NewScanCmd(args...) c.Process(cmd) return cmd } //------------------------------------------------------------------------------ func (c *commandable) Append(key, value string) *IntCmd { cmd := NewIntCmd("APPEND", key, value) c.Process(cmd) return cmd } type BitCount struct { Start, End int64 } func (c *commandable) BitCount(key string, bitCount *BitCount) *IntCmd { args := []interface{}{"BITCOUNT", key} if bitCount != nil { args = append( args, bitCount.Start, bitCount.End, ) } cmd := NewIntCmd(args...) c.Process(cmd) return cmd } func (c *commandable) bitOp(op, destKey string, keys ...string) *IntCmd { args := make([]interface{}, 3+len(keys)) args[0] = "BITOP" args[1] = op args[2] = destKey for i, key := range keys { args[3+i] = key } cmd := NewIntCmd(args...) c.Process(cmd) return cmd } func (c *commandable) BitOpAnd(destKey string, keys ...string) *IntCmd { return c.bitOp("AND", destKey, keys...) } func (c *commandable) BitOpOr(destKey string, keys ...string) *IntCmd { return c.bitOp("OR", destKey, keys...) } func (c *commandable) BitOpXor(destKey string, keys ...string) *IntCmd { return c.bitOp("XOR", destKey, keys...) } func (c *commandable) BitOpNot(destKey string, key string) *IntCmd { return c.bitOp("NOT", destKey, key) } func (c *commandable) BitPos(key string, bit int64, pos ...int64) *IntCmd { args := make([]interface{}, 3+len(pos)) args[0] = "BITPOS" args[1] = key args[2] = bit switch len(pos) { case 0: case 1: args[3] = pos[0] case 2: args[3] = pos[0] args[4] = pos[1] default: panic("too many arguments") } cmd := NewIntCmd(args...) c.Process(cmd) return cmd } func (c *commandable) Decr(key string) *IntCmd { cmd := NewIntCmd("DECR", key) c.Process(cmd) return cmd } func (c *commandable) DecrBy(key string, decrement int64) *IntCmd { cmd := NewIntCmd("DECRBY", key, decrement) c.Process(cmd) return cmd } func (c *commandable) Get(key string) *StringCmd { cmd := NewStringCmd("GET", key) c.Process(cmd) return cmd } func (c *commandable) GetBit(key string, offset int64) *IntCmd { cmd := NewIntCmd("GETBIT", key, offset) c.Process(cmd) return cmd } func (c *commandable) GetRange(key string, start, end int64) *StringCmd { cmd := NewStringCmd("GETRANGE", key, start, end) c.Process(cmd) return cmd } func (c *commandable) GetSet(key string, value interface{}) *StringCmd { cmd := NewStringCmd("GETSET", key, value) c.Process(cmd) return cmd } func (c *commandable) Incr(key string) *IntCmd { cmd := NewIntCmd("INCR", key) c.Process(cmd) return cmd } func (c *commandable) IncrBy(key string, value int64) *IntCmd { cmd := NewIntCmd("INCRBY", key, value) c.Process(cmd) return cmd } func (c *commandable) IncrByFloat(key string, value float64) *FloatCmd { cmd := NewFloatCmd("INCRBYFLOAT", key, value) c.Process(cmd) return cmd } func (c *commandable) MGet(keys ...string) *SliceCmd { args := make([]interface{}, 1+len(keys)) args[0] = "MGET" for i, key := range keys { args[1+i] = key } cmd := NewSliceCmd(args...) c.Process(cmd) return cmd } func (c *commandable) MSet(pairs ...string) *StatusCmd { args := make([]interface{}, 1+len(pairs)) args[0] = "MSET" for i, pair := range pairs { args[1+i] = pair } cmd := NewStatusCmd(args...) c.Process(cmd) return cmd } func (c *commandable) MSetNX(pairs ...string) *BoolCmd { args := make([]interface{}, 1+len(pairs)) args[0] = "MSETNX" for i, pair := range pairs { args[1+i] = pair } cmd := NewBoolCmd(args...) c.Process(cmd) return cmd } // Redis `SET key value [expiration]` command. // // Zero expiration means the key has no expiration time. func (c *commandable) Set(key string, value interface{}, expiration time.Duration) *StatusCmd { args := make([]interface{}, 3, 5) args[0] = "SET" args[1] = key args[2] = value if expiration > 0 { if usePrecise(expiration) { args = append(args, "PX", formatMs(expiration)) } else { args = append(args, "EX", formatSec(expiration)) } } cmd := NewStatusCmd(args...) c.Process(cmd) return cmd } func (c *commandable) SetBit(key string, offset int64, value int) *IntCmd { cmd := NewIntCmd( "SETBIT", key, offset, value, ) c.Process(cmd) return cmd } // Redis `SET key value [expiration] NX` command. // // Zero expiration means the key has no expiration time. func (c *commandable) SetNX(key string, value interface{}, expiration time.Duration) *BoolCmd { var cmd *BoolCmd if expiration == 0 { // Use old `SETNX` to support old Redis versions. cmd = NewBoolCmd("SETNX", key, value) } else { if usePrecise(expiration) { cmd = NewBoolCmd("SET", key, value, "PX", formatMs(expiration), "NX") } else { cmd = NewBoolCmd("SET", key, value, "EX", formatSec(expiration), "NX") } } c.Process(cmd) return cmd } // Redis `SET key value [expiration] XX` command. // // Zero expiration means the key has no expiration time. func (c *commandable) SetXX(key string, value interface{}, expiration time.Duration) *BoolCmd { var cmd *BoolCmd if usePrecise(expiration) { cmd = NewBoolCmd("SET", key, value, "PX", formatMs(expiration), "XX") } else { cmd = NewBoolCmd("SET", key, value, "EX", formatSec(expiration), "XX") } c.Process(cmd) return cmd } func (c *commandable) SetRange(key string, offset int64, value string) *IntCmd { cmd := NewIntCmd("SETRANGE", key, offset, value) c.Process(cmd) return cmd } func (c *commandable) StrLen(key string) *IntCmd { cmd := NewIntCmd("STRLEN", key) c.Process(cmd) return cmd } //------------------------------------------------------------------------------ func (c *commandable) HDel(key string, fields ...string) *IntCmd { args := make([]interface{}, 2+len(fields)) args[0] = "HDEL" args[1] = key for i, field := range fields { args[2+i] = field } cmd := NewIntCmd(args...) c.Process(cmd) return cmd } func (c *commandable) HExists(key, field string) *BoolCmd { cmd := NewBoolCmd("HEXISTS", key, field) c.Process(cmd) return cmd } func (c *commandable) HGet(key, field string) *StringCmd { cmd := NewStringCmd("HGET", key, field) c.Process(cmd) return cmd } func (c *commandable) HGetAll(key string) *StringSliceCmd { cmd := NewStringSliceCmd("HGETALL", key) c.Process(cmd) return cmd } func (c *commandable) HGetAllMap(key string) *StringStringMapCmd { cmd := NewStringStringMapCmd("HGETALL", key) c.Process(cmd) return cmd } func (c *commandable) HIncrBy(key, field string, incr int64) *IntCmd { cmd := NewIntCmd("HINCRBY", key, field, incr) c.Process(cmd) return cmd } func (c *commandable) HIncrByFloat(key, field string, incr float64) *FloatCmd { cmd := NewFloatCmd("HINCRBYFLOAT", key, field, incr) c.Process(cmd) return cmd } func (c *commandable) HKeys(key string) *StringSliceCmd { cmd := NewStringSliceCmd("HKEYS", key) c.Process(cmd) return cmd } func (c *commandable) HLen(key string) *IntCmd { cmd := NewIntCmd("HLEN", key) c.Process(cmd) return cmd } func (c *commandable) HMGet(key string, fields ...string) *SliceCmd { args := make([]interface{}, 2+len(fields)) args[0] = "HMGET" args[1] = key for i, field := range fields { args[2+i] = field } cmd := NewSliceCmd(args...) c.Process(cmd) return cmd } func (c *commandable) HMSet(key, field, value string, pairs ...string) *StatusCmd { args := make([]interface{}, 4+len(pairs)) args[0] = "HMSET" args[1] = key args[2] = field args[3] = value for i, pair := range pairs { args[4+i] = pair } cmd := NewStatusCmd(args...) c.Process(cmd) return cmd } func (c *commandable) HMSetMap(key string, fields map[string]string) *StatusCmd { args := make([]interface{}, 2+len(fields)*2) args[0] = "HMSET" args[1] = key i := 2 for k, v := range fields { args[i] = k args[i+1] = v i += 2 } cmd := NewStatusCmd(args...) c.Process(cmd) return cmd } func (c *commandable) HSet(key, field, value string) *BoolCmd { cmd := NewBoolCmd("HSET", key, field, value) c.Process(cmd) return cmd } func (c *commandable) HSetNX(key, field, value string) *BoolCmd { cmd := NewBoolCmd("HSETNX", key, field, value) c.Process(cmd) return cmd } func (c *commandable) HVals(key string) *StringSliceCmd { cmd := NewStringSliceCmd("HVALS", key) c.Process(cmd) return cmd } //------------------------------------------------------------------------------ func (c *commandable) BLPop(timeout time.Duration, keys ...string) *StringSliceCmd { args := make([]interface{}, 2+len(keys)) args[0] = "BLPOP" for i, key := range keys { args[1+i] = key } args[len(args)-1] = formatSec(timeout) cmd := NewStringSliceCmd(args...) cmd.setReadTimeout(readTimeout(timeout)) c.Process(cmd) return cmd } func (c *commandable) BRPop(timeout time.Duration, keys ...string) *StringSliceCmd { args := make([]interface{}, 2+len(keys)) args[0] = "BRPOP" for i, key := range keys { args[1+i] = key } args[len(args)-1] = formatSec(timeout) cmd := NewStringSliceCmd(args...) cmd.setReadTimeout(readTimeout(timeout)) c.Process(cmd) return cmd } func (c *commandable) BRPopLPush(source, destination string, timeout time.Duration) *StringCmd { cmd := NewStringCmd( "BRPOPLPUSH", source, destination, formatSec(timeout), ) cmd.setReadTimeout(readTimeout(timeout)) c.Process(cmd) return cmd } func (c *commandable) LIndex(key string, index int64) *StringCmd { cmd := NewStringCmd("LINDEX", key, index) c.Process(cmd) return cmd } func (c *commandable) LInsert(key, op, pivot, value string) *IntCmd { cmd := NewIntCmd("LINSERT", key, op, pivot, value) c.Process(cmd) return cmd } func (c *commandable) LLen(key string) *IntCmd { cmd := NewIntCmd("LLEN", key) c.Process(cmd) return cmd } func (c *commandable) LPop(key string) *StringCmd { cmd := NewStringCmd("LPOP", key) c.Process(cmd) return cmd } func (c *commandable) LPush(key string, values ...string) *IntCmd { args := make([]interface{}, 2+len(values)) args[0] = "LPUSH" args[1] = key for i, value := range values { args[2+i] = value } cmd := NewIntCmd(args...) c.Process(cmd) return cmd } func (c *commandable) LPushX(key, value interface{}) *IntCmd { cmd := NewIntCmd("LPUSHX", key, value) c.Process(cmd) return cmd } func (c *commandable) LRange(key string, start, stop int64) *StringSliceCmd { cmd := NewStringSliceCmd( "LRANGE", key, start, stop, ) c.Process(cmd) return cmd } func (c *commandable) LRem(key string, count int64, value interface{}) *IntCmd { cmd := NewIntCmd("LREM", key, count, value) c.Process(cmd) return cmd } func (c *commandable) LSet(key string, index int64, value interface{}) *StatusCmd { cmd := NewStatusCmd("LSET", key, index, value) c.Process(cmd) return cmd } func (c *commandable) LTrim(key string, start, stop int64) *StatusCmd { cmd := NewStatusCmd( "LTRIM", key, start, stop, ) c.Process(cmd) return cmd } func (c *commandable) RPop(key string) *StringCmd { cmd := NewStringCmd("RPOP", key) c.Process(cmd) return cmd } func (c *commandable) RPopLPush(source, destination string) *StringCmd { cmd := NewStringCmd("RPOPLPUSH", source, destination) c.Process(cmd) return cmd } func (c *commandable) RPush(key string, values ...string) *IntCmd { args := make([]interface{}, 2+len(values)) args[0] = "RPUSH" args[1] = key for i, value := range values { args[2+i] = value } cmd := NewIntCmd(args...) c.Process(cmd) return cmd } func (c *commandable) RPushX(key string, value interface{}) *IntCmd { cmd := NewIntCmd("RPUSHX", key, value) c.Process(cmd) return cmd } //------------------------------------------------------------------------------ func (c *commandable) SAdd(key string, members ...string) *IntCmd { args := make([]interface{}, 2+len(members)) args[0] = "SADD" args[1] = key for i, member := range members { args[2+i] = member } cmd := NewIntCmd(args...) c.Process(cmd) return cmd } func (c *commandable) SCard(key string) *IntCmd { cmd := NewIntCmd("SCARD", key) c.Process(cmd) return cmd } func (c *commandable) SDiff(keys ...string) *StringSliceCmd { args := make([]interface{}, 1+len(keys)) args[0] = "SDIFF" for i, key := range keys { args[1+i] = key } cmd := NewStringSliceCmd(args...) c.Process(cmd) return cmd } func (c *commandable) SDiffStore(destination string, keys ...string) *IntCmd { args := make([]interface{}, 2+len(keys)) args[0] = "SDIFFSTORE" args[1] = destination for i, key := range keys { args[2+i] = key } cmd := NewIntCmd(args...) c.Process(cmd) return cmd } func (c *commandable) SInter(keys ...string) *StringSliceCmd { args := make([]interface{}, 1+len(keys)) args[0] = "SINTER" for i, key := range keys { args[1+i] = key } cmd := NewStringSliceCmd(args...) c.Process(cmd) return cmd } func (c *commandable) SInterStore(destination string, keys ...string) *IntCmd { args := make([]interface{}, 2+len(keys)) args[0] = "SINTERSTORE" args[1] = destination for i, key := range keys { args[2+i] = key } cmd := NewIntCmd(args...) c.Process(cmd) return cmd } func (c *commandable) SIsMember(key string, member interface{}) *BoolCmd { cmd := NewBoolCmd("SISMEMBER", key, member) c.Process(cmd) return cmd } func (c *commandable) SMembers(key string) *StringSliceCmd { cmd := NewStringSliceCmd("SMEMBERS", key) c.Process(cmd) return cmd } func (c *commandable) SMove(source, destination string, member interface{}) *BoolCmd { cmd := NewBoolCmd("SMOVE", source, destination, member) c.Process(cmd) return cmd } // Redis `SPOP key` command. func (c *commandable) SPop(key string) *StringCmd { cmd := NewStringCmd("SPOP", key) c.Process(cmd) return cmd } // Redis `SPOP key count` command. func (c *commandable) SPopN(key string, count int64) *StringSliceCmd { cmd := NewStringSliceCmd("SPOP", key, count) c.Process(cmd) return cmd } // Redis `SRANDMEMBER key` command. func (c *commandable) SRandMember(key string) *StringCmd { cmd := NewStringCmd("SRANDMEMBER", key) c.Process(cmd) return cmd } // Redis `SRANDMEMBER key count` command. func (c *commandable) SRandMemberN(key string, count int64) *StringSliceCmd { cmd := NewStringSliceCmd("SRANDMEMBER", key, count) c.Process(cmd) return cmd } func (c *commandable) SRem(key string, members ...string) *IntCmd { args := make([]interface{}, 2+len(members)) args[0] = "SREM" args[1] = key for i, member := range members { args[2+i] = member } cmd := NewIntCmd(args...) c.Process(cmd) return cmd } func (c *commandable) SUnion(keys ...string) *StringSliceCmd { args := make([]interface{}, 1+len(keys)) args[0] = "SUNION" for i, key := range keys { args[1+i] = key } cmd := NewStringSliceCmd(args...) c.Process(cmd) return cmd } func (c *commandable) SUnionStore(destination string, keys ...string) *IntCmd { args := make([]interface{}, 2+len(keys)) args[0] = "SUNIONSTORE" args[1] = destination for i, key := range keys { args[2+i] = key } cmd := NewIntCmd(args...) c.Process(cmd) return cmd } //------------------------------------------------------------------------------ // Z represents sorted set member. type Z struct { Score float64 Member interface{} } // ZStore is used as an arg to ZInterStore and ZUnionStore. type ZStore struct { Weights []float64 // Can be SUM, MIN or MAX. Aggregate string } func (c *commandable) zAdd(a []interface{}, n int, members ...Z) *IntCmd { for i, m := range members { a[n+2*i] = m.Score a[n+2*i+1] = m.Member } cmd := NewIntCmd(a...) c.Process(cmd) return cmd } // Redis `ZADD key score member [score member ...]` command. func (c *commandable) ZAdd(key string, members ...Z) *IntCmd { const n = 2 a := make([]interface{}, n+2*len(members)) a[0], a[1] = "ZADD", key return c.zAdd(a, n, members...) } // Redis `ZADD key NX score member [score member ...]` command. func (c *commandable) ZAddNX(key string, members ...Z) *IntCmd { const n = 3 a := make([]interface{}, n+2*len(members)) a[0], a[1], a[2] = "ZADD", key, "NX" return c.zAdd(a, n, members...) } // Redis `ZADD key XX score member [score member ...]` command. func (c *commandable) ZAddXX(key string, members ...Z) *IntCmd { const n = 3 a := make([]interface{}, n+2*len(members)) a[0], a[1], a[2] = "ZADD", key, "XX" return c.zAdd(a, n, members...) } // Redis `ZADD key CH score member [score member ...]` command. func (c *commandable) ZAddCh(key string, members ...Z) *IntCmd { const n = 3 a := make([]interface{}, n+2*len(members)) a[0], a[1], a[2] = "ZADD", key, "CH" return c.zAdd(a, n, members...) } // Redis `ZADD key NX CH score member [score member ...]` command. func (c *commandable) ZAddNXCh(key string, members ...Z) *IntCmd { const n = 4 a := make([]interface{}, n+2*len(members)) a[0], a[1], a[2], a[3] = "ZADD", key, "NX", "CH" return c.zAdd(a, n, members...) } // Redis `ZADD key XX CH score member [score member ...]` command. func (c *commandable) ZAddXXCh(key string, members ...Z) *IntCmd { const n = 4 a := make([]interface{}, n+2*len(members)) a[0], a[1], a[2], a[3] = "ZADD", key, "XX", "CH" return c.zAdd(a, n, members...) } func (c *commandable) zIncr(a []interface{}, n int, members ...Z) *FloatCmd { for i, m := range members { a[n+2*i] = m.Score a[n+2*i+1] = m.Member } cmd := NewFloatCmd(a...) c.Process(cmd) return cmd } // Redis `ZADD key INCR score member` command. func (c *commandable) ZIncr(key string, member Z) *FloatCmd { const n = 3 a := make([]interface{}, n+2) a[0], a[1], a[2] = "ZADD", key, "INCR" return c.zIncr(a, n, member) } // Redis `ZADD key NX INCR score member` command. func (c *commandable) ZIncrNX(key string, member Z) *FloatCmd { const n = 4 a := make([]interface{}, n+2) a[0], a[1], a[2], a[3] = "ZADD", key, "INCR", "NX" return c.zIncr(a, n, member) } // Redis `ZADD key XX INCR score member` command. func (c *commandable) ZIncrXX(key string, member Z) *FloatCmd { const n = 4 a := make([]interface{}, n+2) a[0], a[1], a[2], a[3] = "ZADD", key, "INCR", "XX" return c.zIncr(a, n, member) } func (c *commandable) ZCard(key string) *IntCmd { cmd := NewIntCmd("ZCARD", key) c.Process(cmd) return cmd } func (c *commandable) ZCount(key, min, max string) *IntCmd { cmd := NewIntCmd("ZCOUNT", key, min, max) c.Process(cmd) return cmd } func (c *commandable) ZIncrBy(key string, increment float64, member string) *FloatCmd { cmd := NewFloatCmd("ZINCRBY", key, increment, member) c.Process(cmd) return cmd } func (c *commandable) ZInterStore(destination string, store ZStore, keys ...string) *IntCmd { args := make([]interface{}, 3+len(keys)) args[0] = "ZINTERSTORE" args[1] = destination args[2] = strconv.Itoa(len(keys)) for i, key := range keys { args[3+i] = key } if len(store.Weights) > 0 { args = append(args, "WEIGHTS") for _, weight := range store.Weights { args = append(args, weight) } } if store.Aggregate != "" { args = append(args, "AGGREGATE", store.Aggregate) } cmd := NewIntCmd(args...) c.Process(cmd) return cmd } func (c *commandable) zRange(key string, start, stop int64, withScores bool) *StringSliceCmd { args := []interface{}{ "ZRANGE", key, start, stop, } if withScores { args = append(args, "WITHSCORES") } cmd := NewStringSliceCmd(args...) c.Process(cmd) return cmd } func (c *commandable) ZRange(key string, start, stop int64) *StringSliceCmd { return c.zRange(key, start, stop, false) } func (c *commandable) ZRangeWithScores(key string, start, stop int64) *ZSliceCmd { cmd := NewZSliceCmd("ZRANGE", key, start, stop, "WITHSCORES") c.Process(cmd) return cmd } // TODO: Rename to something more generic in v4 type ZRangeByScore struct { Min, Max string Offset, Count int64 } func (c *commandable) zRangeBy(zcmd, key string, opt ZRangeByScore, withScores bool) *StringSliceCmd { args := []interface{}{zcmd, key, opt.Min, opt.Max} if withScores { args = append(args, "WITHSCORES") } if opt.Offset != 0 || opt.Count != 0 { args = append( args, "LIMIT", opt.Offset, opt.Count, ) } cmd := NewStringSliceCmd(args...) c.Process(cmd) return cmd } func (c *commandable) ZRangeByScore(key string, opt ZRangeByScore) *StringSliceCmd { return c.zRangeBy("ZRANGEBYSCORE", key, opt, false) } func (c *commandable) ZRangeByLex(key string, opt ZRangeByScore) *StringSliceCmd { return c.zRangeBy("ZRANGEBYLEX", key, opt, false) } func (c *commandable) ZRangeByScoreWithScores(key string, opt ZRangeByScore) *ZSliceCmd { args := []interface{}{"ZRANGEBYSCORE", key, opt.Min, opt.Max, "WITHSCORES"} if opt.Offset != 0 || opt.Count != 0 { args = append( args, "LIMIT", opt.Offset, opt.Count, ) } cmd := NewZSliceCmd(args...) c.Process(cmd) return cmd } func (c *commandable) ZRank(key, member string) *IntCmd { cmd := NewIntCmd("ZRANK", key, member) c.Process(cmd) return cmd } func (c *commandable) ZRem(key string, members ...string) *IntCmd { args := make([]interface{}, 2+len(members)) args[0] = "ZREM" args[1] = key for i, member := range members { args[2+i] = member } cmd := NewIntCmd(args...) c.Process(cmd) return cmd } func (c *commandable) ZRemRangeByRank(key string, start, stop int64) *IntCmd { cmd := NewIntCmd( "ZREMRANGEBYRANK", key, start, stop, ) c.Process(cmd) return cmd } func (c *commandable) ZRemRangeByScore(key, min, max string) *IntCmd { cmd := NewIntCmd("ZREMRANGEBYSCORE", key, min, max) c.Process(cmd) return cmd } func (c *commandable) ZRevRange(key string, start, stop int64) *StringSliceCmd { cmd := NewStringSliceCmd("ZREVRANGE", key, start, stop) c.Process(cmd) return cmd } func (c *commandable) ZRevRangeWithScores(key string, start, stop int64) *ZSliceCmd { cmd := NewZSliceCmd("ZREVRANGE", key, start, stop, "WITHSCORES") c.Process(cmd) return cmd } func (c *commandable) zRevRangeBy(zcmd, key string, opt ZRangeByScore) *StringSliceCmd { args := []interface{}{zcmd, key, opt.Max, opt.Min} if opt.Offset != 0 || opt.Count != 0 { args = append( args, "LIMIT", opt.Offset, opt.Count, ) } cmd := NewStringSliceCmd(args...) c.Process(cmd) return cmd } func (c *commandable) ZRevRangeByScore(key string, opt ZRangeByScore) *StringSliceCmd { return c.zRevRangeBy("ZREVRANGEBYSCORE", key, opt) } func (c *commandable) ZRevRangeByLex(key string, opt ZRangeByScore) *StringSliceCmd { return c.zRevRangeBy("ZREVRANGEBYLEX", key, opt) } func (c *commandable) ZRevRangeByScoreWithScores(key string, opt ZRangeByScore) *ZSliceCmd { args := []interface{}{"ZREVRANGEBYSCORE", key, opt.Max, opt.Min, "WITHSCORES"} if opt.Offset != 0 || opt.Count != 0 { args = append( args, "LIMIT", opt.Offset, opt.Count, ) } cmd := NewZSliceCmd(args...) c.Process(cmd) return cmd } func (c *commandable) ZRevRank(key, member string) *IntCmd { cmd := NewIntCmd("ZREVRANK", key, member) c.Process(cmd) return cmd } func (c *commandable) ZScore(key, member string) *FloatCmd { cmd := NewFloatCmd("ZSCORE", key, member) c.Process(cmd) return cmd } func (c *commandable) ZUnionStore(dest string, store ZStore, keys ...string) *IntCmd { args := make([]interface{}, 3+len(keys)) args[0] = "ZUNIONSTORE" args[1] = dest args[2] = strconv.Itoa(len(keys)) for i, key := range keys { args[3+i] = key } if len(store.Weights) > 0 { args = append(args, "WEIGHTS") for _, weight := range store.Weights { args = append(args, weight) } } if store.Aggregate != "" { args = append(args, "AGGREGATE", store.Aggregate) } cmd := NewIntCmd(args...) c.Process(cmd) return cmd } //------------------------------------------------------------------------------ func (c *commandable) PFAdd(key string, fields ...string) *IntCmd { args := make([]interface{}, 2+len(fields)) args[0] = "PFADD" args[1] = key for i, field := range fields { args[2+i] = field } cmd := NewIntCmd(args...) c.Process(cmd) return cmd } func (c *commandable) PFCount(keys ...string) *IntCmd { args := make([]interface{}, 1+len(keys)) args[0] = "PFCOUNT" for i, key := range keys { args[1+i] = key } cmd := NewIntCmd(args...) c.Process(cmd) return cmd } func (c *commandable) PFMerge(dest string, keys ...string) *StatusCmd { args := make([]interface{}, 2+len(keys)) args[0] = "PFMERGE" args[1] = dest for i, key := range keys { args[2+i] = key } cmd := NewStatusCmd(args...) c.Process(cmd) return cmd } //------------------------------------------------------------------------------ func (c *commandable) BgRewriteAOF() *StatusCmd { cmd := NewStatusCmd("BGREWRITEAOF") cmd._clusterKeyPos = 0 c.Process(cmd) return cmd } func (c *commandable) BgSave() *StatusCmd { cmd := NewStatusCmd("BGSAVE") cmd._clusterKeyPos = 0 c.Process(cmd) return cmd } func (c *commandable) ClientKill(ipPort string) *StatusCmd { cmd := NewStatusCmd("CLIENT", "KILL", ipPort) cmd._clusterKeyPos = 0 c.Process(cmd) return cmd } func (c *commandable) ClientList() *StringCmd { cmd := NewStringCmd("CLIENT", "LIST") cmd._clusterKeyPos = 0 c.Process(cmd) return cmd } func (c *commandable) ClientPause(dur time.Duration) *BoolCmd { cmd := NewBoolCmd("CLIENT", "PAUSE", formatMs(dur)) cmd._clusterKeyPos = 0 c.Process(cmd) return cmd } // ClientSetName assigns a name to the one of many connections in the pool. func (c *commandable) ClientSetName(name string) *BoolCmd { cmd := NewBoolCmd("CLIENT", "SETNAME", name) c.Process(cmd) return cmd } // ClientGetName returns the name of the one of many connections in the pool. func (c *Client) ClientGetName() *StringCmd { cmd := NewStringCmd("CLIENT", "GETNAME") c.Process(cmd) return cmd } func (c *commandable) ConfigGet(parameter string) *SliceCmd { cmd := NewSliceCmd("CONFIG", "GET", parameter) cmd._clusterKeyPos = 0 c.Process(cmd) return cmd } func (c *commandable) ConfigResetStat() *StatusCmd { cmd := NewStatusCmd("CONFIG", "RESETSTAT") cmd._clusterKeyPos = 0 c.Process(cmd) return cmd } func (c *commandable) ConfigSet(parameter, value string) *StatusCmd { cmd := NewStatusCmd("CONFIG", "SET", parameter, value) cmd._clusterKeyPos = 0 c.Process(cmd) return cmd } func (c *commandable) DbSize() *IntCmd { cmd := NewIntCmd("DBSIZE") cmd._clusterKeyPos = 0 c.Process(cmd) return cmd } func (c *commandable) FlushAll() *StatusCmd { cmd := newKeylessStatusCmd("FLUSHALL") c.Process(cmd) return cmd } func (c *commandable) FlushDb() *StatusCmd { cmd := newKeylessStatusCmd("FLUSHDB") c.Process(cmd) return cmd } func (c *commandable) Info(section ...string) *StringCmd { args := []interface{}{"INFO"} if len(section) > 0 { args = append(args, section[0]) } cmd := NewStringCmd(args...) c.Process(cmd) return cmd } func (c *commandable) LastSave() *IntCmd { cmd := NewIntCmd("LASTSAVE") cmd._clusterKeyPos = 0 c.Process(cmd) return cmd } func (c *commandable) Save() *StatusCmd { cmd := newKeylessStatusCmd("SAVE") c.Process(cmd) return cmd } func (c *commandable) shutdown(modifier string) *StatusCmd { var args []interface{} if modifier == "" { args = []interface{}{"SHUTDOWN"} } else { args = []interface{}{"SHUTDOWN", modifier} } cmd := newKeylessStatusCmd(args...) c.Process(cmd) if err := cmd.Err(); err != nil { if err == io.EOF { // Server quit as expected. cmd.err = nil } } else { // Server did not quit. String reply contains the reason. cmd.err = errorf(cmd.val) cmd.val = "" } return cmd } func (c *commandable) Shutdown() *StatusCmd { return c.shutdown("") } func (c *commandable) ShutdownSave() *StatusCmd { return c.shutdown("SAVE") } func (c *commandable) ShutdownNoSave() *StatusCmd { return c.shutdown("NOSAVE") } func (c *commandable) SlaveOf(host, port string) *StatusCmd { cmd := newKeylessStatusCmd("SLAVEOF", host, port) c.Process(cmd) return cmd } func (c *commandable) SlowLog() { panic("not implemented") } func (c *commandable) Sync() { panic("not implemented") } func (c *commandable) Time() *StringSliceCmd { cmd := NewStringSliceCmd("TIME") cmd._clusterKeyPos = 0 c.Process(cmd) return cmd } //------------------------------------------------------------------------------ func (c *commandable) Eval(script string, keys []string, args []string) *Cmd { cmdArgs := make([]interface{}, 3+len(keys)+len(args)) cmdArgs[0] = "EVAL" cmdArgs[1] = script cmdArgs[2] = strconv.Itoa(len(keys)) for i, key := range keys { cmdArgs[3+i] = key } pos := 3 + len(keys) for i, arg := range args { cmdArgs[pos+i] = arg } cmd := NewCmd(cmdArgs...) if len(keys) > 0 { cmd._clusterKeyPos = 3 } c.Process(cmd) return cmd } func (c *commandable) EvalSha(sha1 string, keys []string, args []string) *Cmd { cmdArgs := make([]interface{}, 3+len(keys)+len(args)) cmdArgs[0] = "EVALSHA" cmdArgs[1] = sha1 cmdArgs[2] = strconv.Itoa(len(keys)) for i, key := range keys { cmdArgs[3+i] = key } pos := 3 + len(keys) for i, arg := range args { cmdArgs[pos+i] = arg } cmd := NewCmd(cmdArgs...) if len(keys) > 0 { cmd._clusterKeyPos = 3 } c.Process(cmd) return cmd } func (c *commandable) ScriptExists(scripts ...string) *BoolSliceCmd { args := make([]interface{}, 2+len(scripts)) args[0] = "SCRIPT" args[1] = "EXISTS" for i, script := range scripts { args[2+i] = script } cmd := NewBoolSliceCmd(args...) cmd._clusterKeyPos = 0 c.Process(cmd) return cmd } func (c *commandable) ScriptFlush() *StatusCmd { cmd := newKeylessStatusCmd("SCRIPT", "FLUSH") c.Process(cmd) return cmd } func (c *commandable) ScriptKill() *StatusCmd { cmd := newKeylessStatusCmd("SCRIPT", "KILL") c.Process(cmd) return cmd } func (c *commandable) ScriptLoad(script string) *StringCmd { cmd := NewStringCmd("SCRIPT", "LOAD", script) cmd._clusterKeyPos = 0 c.Process(cmd) return cmd } //------------------------------------------------------------------------------ func (c *commandable) DebugObject(key string) *StringCmd { cmd := NewStringCmd("DEBUG", "OBJECT", key) cmd._clusterKeyPos = 2 c.Process(cmd) return cmd } //------------------------------------------------------------------------------ func (c *commandable) PubSubChannels(pattern string) *StringSliceCmd { args := []interface{}{"PUBSUB", "CHANNELS"} if pattern != "*" { args = append(args, pattern) } cmd := NewStringSliceCmd(args...) cmd._clusterKeyPos = 0 c.Process(cmd) return cmd } func (c *commandable) PubSubNumSub(channels ...string) *StringIntMapCmd { args := make([]interface{}, 2+len(channels)) args[0] = "PUBSUB" args[1] = "NUMSUB" for i, channel := range channels { args[2+i] = channel } cmd := NewStringIntMapCmd(args...) cmd._clusterKeyPos = 0 c.Process(cmd) return cmd } func (c *commandable) PubSubNumPat() *IntCmd { cmd := NewIntCmd("PUBSUB", "NUMPAT") cmd._clusterKeyPos = 0 c.Process(cmd) return cmd } //------------------------------------------------------------------------------ func (c *commandable) ClusterSlots() *ClusterSlotCmd { cmd := NewClusterSlotCmd("CLUSTER", "slots") cmd._clusterKeyPos = 0 c.Process(cmd) return cmd } func (c *commandable) ClusterNodes() *StringCmd { cmd := NewStringCmd("CLUSTER", "nodes") cmd._clusterKeyPos = 0 c.Process(cmd) return cmd } func (c *commandable) ClusterMeet(host, port string) *StatusCmd { cmd := newKeylessStatusCmd("CLUSTER", "meet", host, port) c.Process(cmd) return cmd } func (c *commandable) ClusterForget(nodeID string) *StatusCmd { cmd := newKeylessStatusCmd("CLUSTER", "forget", nodeID) c.Process(cmd) return cmd } func (c *commandable) ClusterReplicate(nodeID string) *StatusCmd { cmd := newKeylessStatusCmd("CLUSTER", "replicate", nodeID) c.Process(cmd) return cmd } func (c *commandable) ClusterResetSoft() *StatusCmd { cmd := newKeylessStatusCmd("CLUSTER", "reset", "soft") c.Process(cmd) return cmd } func (c *commandable) ClusterResetHard() *StatusCmd { cmd := newKeylessStatusCmd("CLUSTER", "reset", "hard") c.Process(cmd) return cmd } func (c *commandable) ClusterInfo() *StringCmd { cmd := NewStringCmd("CLUSTER", "info") cmd._clusterKeyPos = 0 c.Process(cmd) return cmd } func (c *commandable) ClusterKeySlot(key string) *IntCmd { cmd := NewIntCmd("CLUSTER", "keyslot", key) cmd._clusterKeyPos = 2 c.Process(cmd) return cmd } func (c *commandable) ClusterCountFailureReports(nodeID string) *IntCmd { cmd := NewIntCmd("CLUSTER", "count-failure-reports", nodeID) cmd._clusterKeyPos = 2 c.Process(cmd) return cmd } func (c *commandable) ClusterCountKeysInSlot(slot int) *IntCmd { cmd := NewIntCmd("CLUSTER", "countkeysinslot", slot) cmd._clusterKeyPos = 2 c.Process(cmd) return cmd } func (c *commandable) ClusterDelSlots(slots ...int) *StatusCmd { args := make([]interface{}, 2+len(slots)) args[0] = "CLUSTER" args[1] = "DELSLOTS" for i, slot := range slots { args[2+i] = slot } cmd := newKeylessStatusCmd(args...) c.Process(cmd) return cmd } func (c *commandable) ClusterDelSlotsRange(min, max int) *StatusCmd { size := max - min + 1 slots := make([]int, size) for i := 0; i < size; i++ { slots[i] = min + i } return c.ClusterDelSlots(slots...) } func (c *commandable) ClusterSaveConfig() *StatusCmd { cmd := newKeylessStatusCmd("CLUSTER", "saveconfig") c.Process(cmd) return cmd } func (c *commandable) ClusterSlaves(nodeID string) *StringSliceCmd { cmd := NewStringSliceCmd("CLUSTER", "SLAVES", nodeID) cmd._clusterKeyPos = 2 c.Process(cmd) return cmd } func (c *commandable) Readonly() *StatusCmd { cmd := newKeylessStatusCmd("READONLY") cmd._clusterKeyPos = 0 c.Process(cmd) return cmd } func (c *commandable) ReadWrite() *StatusCmd { cmd := newKeylessStatusCmd("READWRITE") cmd._clusterKeyPos = 0 c.Process(cmd) return cmd } func (c *commandable) ClusterFailover() *StatusCmd { cmd := newKeylessStatusCmd("CLUSTER", "failover") c.Process(cmd) return cmd } func (c *commandable) ClusterAddSlots(slots ...int) *StatusCmd { args := make([]interface{}, 2+len(slots)) args[0] = "CLUSTER" args[1] = "ADDSLOTS" for i, num := range slots { args[2+i] = strconv.Itoa(num) } cmd := newKeylessStatusCmd(args...) c.Process(cmd) return cmd } func (c *commandable) ClusterAddSlotsRange(min, max int) *StatusCmd { size := max - min + 1 slots := make([]int, size) for i := 0; i < size; i++ { slots[i] = min + i } return c.ClusterAddSlots(slots...) } //------------------------------------------------------------------------------ func (c *commandable) GeoAdd(key string, geoLocation ...*GeoLocation) *IntCmd { args := make([]interface{}, 2+3*len(geoLocation)) args[0] = "GEOADD" args[1] = key for i, eachLoc := range geoLocation { args[2+3*i] = eachLoc.Longitude args[2+3*i+1] = eachLoc.Latitude args[2+3*i+2] = eachLoc.Name } cmd := NewIntCmd(args...) c.Process(cmd) return cmd } func (c *commandable) GeoRadius(key string, longitude, latitude float64, query *GeoRadiusQuery) *GeoLocationCmd { cmd := NewGeoLocationCmd(query, "GEORADIUS", key, longitude, latitude) c.Process(cmd) return cmd } func (c *commandable) GeoRadiusByMember(key, member string, query *GeoRadiusQuery) *GeoLocationCmd { cmd := NewGeoLocationCmd(query, "GEORADIUSBYMEMBER", key, member) c.Process(cmd) return cmd } func (c *commandable) GeoDist(key string, member1, member2, unit string) *FloatCmd { if unit == "" { unit = "km" } cmd := NewFloatCmd("GEODIST", key, member1, member2, unit) c.Process(cmd) return cmd } func (c *commandable) GeoHash(key string, members ...string) *StringSliceCmd { args := make([]interface{}, 2+len(members)) args[0] = "GEOHASH" args[1] = key for i, member := range members { args[2+i] = member } cmd := NewStringSliceCmd(args...) c.Process(cmd) return cmd } ================================================ FILE: vendor/gopkg.in/redis.v3/doc.go ================================================ /* Package redis implements a Redis client. */ package redis ================================================ FILE: vendor/gopkg.in/redis.v3/error.go ================================================ package redis import ( "fmt" "io" "net" "strings" ) // Redis nil reply, .e.g. when key does not exist. var Nil = errorf("redis: nil") // Redis transaction failed. var TxFailedErr = errorf("redis: transaction failed") type redisError struct { s string } func errorf(s string, args ...interface{}) redisError { return redisError{s: fmt.Sprintf(s, args...)} } func (err redisError) Error() string { return err.s } func isInternalError(err error) bool { _, ok := err.(redisError) return ok } func isNetworkError(err error) bool { if err == io.EOF { return true } _, ok := err.(net.Error) return ok } func isBadConn(err error, allowTimeout bool) bool { if err == nil { return false } if isInternalError(err) { return false } if allowTimeout { if netErr, ok := err.(net.Error); ok && netErr.Timeout() { return false } } return true } func isMovedError(err error) (moved bool, ask bool, addr string) { if _, ok := err.(redisError); !ok { return } s := err.Error() if strings.HasPrefix(s, "MOVED ") { moved = true } else if strings.HasPrefix(s, "ASK ") { ask = true } else { return } ind := strings.LastIndexByte(s, ' ') if ind == -1 { return false, false, "" } addr = s[ind+1:] return } // shouldRetry reports whether failed command should be retried. func shouldRetry(err error) bool { return isNetworkError(err) } ================================================ FILE: vendor/gopkg.in/redis.v3/internal/consistenthash/consistenthash.go ================================================ /* Copyright 2013 Google Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // Package consistenthash provides an implementation of a ring hash. package consistenthash import ( "hash/crc32" "sort" "strconv" ) type Hash func(data []byte) uint32 type Map struct { hash Hash replicas int keys []int // Sorted hashMap map[int]string } func New(replicas int, fn Hash) *Map { m := &Map{ replicas: replicas, hash: fn, hashMap: make(map[int]string), } if m.hash == nil { m.hash = crc32.ChecksumIEEE } return m } // Returns true if there are no items available. func (m *Map) IsEmpty() bool { return len(m.keys) == 0 } // Adds some keys to the hash. func (m *Map) Add(keys ...string) { for _, key := range keys { for i := 0; i < m.replicas; i++ { hash := int(m.hash([]byte(strconv.Itoa(i) + key))) m.keys = append(m.keys, hash) m.hashMap[hash] = key } } sort.Ints(m.keys) } // Gets the closest item in the hash to the provided key. func (m *Map) Get(key string) string { if m.IsEmpty() { return "" } hash := int(m.hash([]byte(key))) // Binary search for appropriate replica. idx := sort.Search(len(m.keys), func(i int) bool { return m.keys[i] >= hash }) // Means we have cycled back to the first replica. if idx == len(m.keys) { idx = 0 } return m.hashMap[m.keys[idx]] } ================================================ FILE: vendor/gopkg.in/redis.v3/internal/hashtag/hashtag.go ================================================ package hashtag import ( "math/rand" "strings" ) const SlotNumber = 16384 // CRC16 implementation according to CCITT standards. // Copyright 2001-2010 Georges Menie (www.menie.org) // Copyright 2013 The Go Authors. All rights reserved. // http://redis.io/topics/cluster-spec#appendix-a-crc16-reference-implementation-in-ansi-c var crc16tab = [256]uint16{ 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0, } func Key(key string) string { if s := strings.IndexByte(key, '{'); s > -1 { if e := strings.IndexByte(key[s+1:], '}'); e > 0 { return key[s+1 : s+e+1] } } return key } // hashSlot returns a consistent slot number between 0 and 16383 // for any given string key. func Slot(key string) int { key = Key(key) if key == "" { return rand.Intn(SlotNumber) } return int(crc16sum(key)) % SlotNumber } func crc16sum(key string) (crc uint16) { for i := 0; i < len(key); i++ { crc = (crc << 8) ^ crc16tab[(byte(crc>>8)^key[i])&0x00ff] } return } ================================================ FILE: vendor/gopkg.in/redis.v3/internal/log.go ================================================ package internal import ( "fmt" "io/ioutil" "log" ) var Debug bool var Logger = log.New(ioutil.Discard, "redis: ", log.LstdFlags) func Debugf(s string, args ...interface{}) { if !Debug { return } Logger.Output(2, fmt.Sprintf(s, args...)) } func Logf(s string, args ...interface{}) { Logger.Output(2, fmt.Sprintf(s, args...)) } ================================================ FILE: vendor/gopkg.in/redis.v3/internal/pool/conn.go ================================================ package pool import ( "bufio" "io" "net" "time" ) const defaultBufSize = 4096 var noDeadline = time.Time{} type Conn struct { NetConn net.Conn Rd *bufio.Reader Buf []byte Inited bool UsedAt time.Time ReadTimeout time.Duration WriteTimeout time.Duration } func NewConn(netConn net.Conn) *Conn { cn := &Conn{ NetConn: netConn, Buf: make([]byte, defaultBufSize), UsedAt: time.Now(), } cn.Rd = bufio.NewReader(cn) return cn } func (cn *Conn) IsStale(timeout time.Duration) bool { return timeout > 0 && time.Since(cn.UsedAt) > timeout } func (cn *Conn) Read(b []byte) (int, error) { cn.UsedAt = time.Now() if cn.ReadTimeout != 0 { cn.NetConn.SetReadDeadline(cn.UsedAt.Add(cn.ReadTimeout)) } else { cn.NetConn.SetReadDeadline(noDeadline) } return cn.NetConn.Read(b) } func (cn *Conn) Write(b []byte) (int, error) { cn.UsedAt = time.Now() if cn.WriteTimeout != 0 { cn.NetConn.SetWriteDeadline(cn.UsedAt.Add(cn.WriteTimeout)) } else { cn.NetConn.SetWriteDeadline(noDeadline) } return cn.NetConn.Write(b) } func (cn *Conn) RemoteAddr() net.Addr { return cn.NetConn.RemoteAddr() } func (cn *Conn) ReadN(n int) ([]byte, error) { if d := n - cap(cn.Buf); d > 0 { cn.Buf = cn.Buf[:cap(cn.Buf)] cn.Buf = append(cn.Buf, make([]byte, d)...) } else { cn.Buf = cn.Buf[:n] } _, err := io.ReadFull(cn.Rd, cn.Buf) return cn.Buf, err } func (cn *Conn) Close() error { return cn.NetConn.Close() } ================================================ FILE: vendor/gopkg.in/redis.v3/internal/pool/pool.go ================================================ package pool import ( "errors" "fmt" "net" "sync" "sync/atomic" "time" "gopkg.in/bsm/ratelimit.v1" "gopkg.in/redis.v3/internal" ) var ( ErrClosed = errors.New("redis: client is closed") ErrPoolTimeout = errors.New("redis: connection pool timeout") errConnStale = errors.New("connection is stale") ) var timers = sync.Pool{ New: func() interface{} { return time.NewTimer(0) }, } // PoolStats contains pool state information and accumulated stats. // TODO: remove Waits type PoolStats struct { Requests uint32 // number of times a connection was requested by the pool Hits uint32 // number of times free connection was found in the pool Waits uint32 // number of times the pool had to wait for a connection Timeouts uint32 // number of times a wait timeout occurred TotalConns uint32 // the number of total connections in the pool FreeConns uint32 // the number of free connections in the pool } type Pooler interface { Get() (*Conn, error) Put(*Conn) error Remove(*Conn, error) error Len() int FreeLen() int Stats() *PoolStats Close() error Closed() bool } type dialer func() (net.Conn, error) type ConnPool struct { _dial dialer DialLimiter *ratelimit.RateLimiter OnClose func(*Conn) error poolTimeout time.Duration idleTimeout time.Duration queue chan struct{} connsMu sync.Mutex conns []*Conn freeConnsMu sync.Mutex freeConns []*Conn stats PoolStats _closed int32 // atomic lastErr atomic.Value } var _ Pooler = (*ConnPool)(nil) func NewConnPool(dial dialer, poolSize int, poolTimeout, idleTimeout, idleCheckFrequency time.Duration) *ConnPool { p := &ConnPool{ _dial: dial, DialLimiter: ratelimit.New(3*poolSize, time.Second), poolTimeout: poolTimeout, idleTimeout: idleTimeout, queue: make(chan struct{}, poolSize), conns: make([]*Conn, 0, poolSize), freeConns: make([]*Conn, 0, poolSize), } for i := 0; i < poolSize; i++ { p.queue <- struct{}{} } if idleTimeout > 0 && idleCheckFrequency > 0 { go p.reaper(idleCheckFrequency) } return p } func (p *ConnPool) dial() (net.Conn, error) { if p.DialLimiter != nil && p.DialLimiter.Limit() { err := fmt.Errorf( "redis: you open connections too fast (last_error=%q)", p.loadLastErr(), ) return nil, err } cn, err := p._dial() if err != nil { p.storeLastErr(err.Error()) return nil, err } return cn, nil } func (p *ConnPool) NewConn() (*Conn, error) { netConn, err := p.dial() if err != nil { return nil, err } return NewConn(netConn), nil } func (p *ConnPool) PopFree() *Conn { timer := timers.Get().(*time.Timer) if !timer.Reset(p.poolTimeout) { <-timer.C } select { case <-p.queue: timers.Put(timer) case <-timer.C: timers.Put(timer) atomic.AddUint32(&p.stats.Timeouts, 1) return nil } p.freeConnsMu.Lock() cn := p.popFree() p.freeConnsMu.Unlock() if cn == nil { p.queue <- struct{}{} } return cn } func (p *ConnPool) popFree() *Conn { if len(p.freeConns) == 0 { return nil } idx := len(p.freeConns) - 1 cn := p.freeConns[idx] p.freeConns = p.freeConns[:idx] return cn } // Get returns existed connection from the pool or creates a new one. func (p *ConnPool) Get() (*Conn, error) { if p.Closed() { return nil, ErrClosed } atomic.AddUint32(&p.stats.Requests, 1) timer := timers.Get().(*time.Timer) if !timer.Reset(p.poolTimeout) { <-timer.C } select { case <-p.queue: timers.Put(timer) case <-timer.C: timers.Put(timer) atomic.AddUint32(&p.stats.Timeouts, 1) return nil, ErrPoolTimeout } p.freeConnsMu.Lock() cn := p.popFree() p.freeConnsMu.Unlock() if cn != nil { atomic.AddUint32(&p.stats.Hits, 1) if !cn.IsStale(p.idleTimeout) { return cn, nil } _ = cn.Close() } newcn, err := p.NewConn() if err != nil { p.queue <- struct{}{} return nil, err } p.connsMu.Lock() if cn != nil { p.remove(cn, errConnStale) } p.conns = append(p.conns, newcn) p.connsMu.Unlock() return newcn, nil } func (p *ConnPool) Put(cn *Conn) error { if cn.Rd.Buffered() != 0 { b, _ := cn.Rd.Peek(cn.Rd.Buffered()) err := fmt.Errorf("connection has unread data: %q", b) internal.Logf(err.Error()) return p.Remove(cn, err) } p.freeConnsMu.Lock() p.freeConns = append(p.freeConns, cn) p.freeConnsMu.Unlock() p.queue <- struct{}{} return nil } func (p *ConnPool) Remove(cn *Conn, reason error) error { _ = cn.Close() p.connsMu.Lock() p.remove(cn, reason) p.connsMu.Unlock() p.queue <- struct{}{} return nil } func (p *ConnPool) remove(cn *Conn, reason error) { p.storeLastErr(reason.Error()) for i, c := range p.conns { if c == cn { p.conns = append(p.conns[:i], p.conns[i+1:]...) break } } } // Len returns total number of connections. func (p *ConnPool) Len() int { p.connsMu.Lock() l := len(p.conns) p.connsMu.Unlock() return l } // FreeLen returns number of free connections. func (p *ConnPool) FreeLen() int { p.freeConnsMu.Lock() l := len(p.freeConns) p.freeConnsMu.Unlock() return l } func (p *ConnPool) Stats() *PoolStats { stats := PoolStats{} stats.Requests = atomic.LoadUint32(&p.stats.Requests) stats.Hits = atomic.LoadUint32(&p.stats.Hits) stats.Waits = atomic.LoadUint32(&p.stats.Waits) stats.Timeouts = atomic.LoadUint32(&p.stats.Timeouts) stats.TotalConns = uint32(p.Len()) stats.FreeConns = uint32(p.FreeLen()) return &stats } func (p *ConnPool) Closed() bool { return atomic.LoadInt32(&p._closed) == 1 } func (p *ConnPool) Close() (retErr error) { if !atomic.CompareAndSwapInt32(&p._closed, 0, 1) { return ErrClosed } p.connsMu.Lock() // Close all connections. for _, cn := range p.conns { if cn == nil { continue } if err := p.closeConn(cn); err != nil && retErr == nil { retErr = err } } p.conns = nil p.connsMu.Unlock() p.freeConnsMu.Lock() p.freeConns = nil p.freeConnsMu.Unlock() return retErr } func (p *ConnPool) closeConn(cn *Conn) error { if p.OnClose != nil { _ = p.OnClose(cn) } return cn.Close() } func (p *ConnPool) ReapStaleConns() (n int, err error) { <-p.queue p.freeConnsMu.Lock() if len(p.freeConns) == 0 { p.freeConnsMu.Unlock() p.queue <- struct{}{} return } var idx int var cn *Conn for idx, cn = range p.freeConns { if !cn.IsStale(p.idleTimeout) { break } p.connsMu.Lock() p.remove(cn, errConnStale) p.connsMu.Unlock() n++ } if idx > 0 { p.freeConns = append(p.freeConns[:0], p.freeConns[idx:]...) } p.freeConnsMu.Unlock() p.queue <- struct{}{} return } func (p *ConnPool) reaper(frequency time.Duration) { ticker := time.NewTicker(frequency) defer ticker.Stop() for _ = range ticker.C { if p.Closed() { break } n, err := p.ReapStaleConns() if err != nil { internal.Logf("ReapStaleConns failed: %s", err) continue } s := p.Stats() internal.Logf( "reaper: removed %d stale conns (TotalConns=%d FreeConns=%d Requests=%d Hits=%d Timeouts=%d)", n, s.TotalConns, s.FreeConns, s.Requests, s.Hits, s.Timeouts, ) } } func (p *ConnPool) storeLastErr(err string) { p.lastErr.Store(err) } func (p *ConnPool) loadLastErr() string { if v := p.lastErr.Load(); v != nil { return v.(string) } return "" } //------------------------------------------------------------------------------ var idleCheckFrequency atomic.Value func SetIdleCheckFrequency(d time.Duration) { idleCheckFrequency.Store(d) } func getIdleCheckFrequency() time.Duration { v := idleCheckFrequency.Load() if v == nil { return time.Minute } return v.(time.Duration) } ================================================ FILE: vendor/gopkg.in/redis.v3/internal/pool/pool_single.go ================================================ package pool type SingleConnPool struct { cn *Conn } var _ Pooler = (*SingleConnPool)(nil) func NewSingleConnPool(cn *Conn) *SingleConnPool { return &SingleConnPool{ cn: cn, } } func (p *SingleConnPool) First() *Conn { return p.cn } func (p *SingleConnPool) Get() (*Conn, error) { return p.cn, nil } func (p *SingleConnPool) Put(cn *Conn) error { if p.cn != cn { panic("p.cn != cn") } return nil } func (p *SingleConnPool) Remove(cn *Conn, _ error) error { if p.cn != cn { panic("p.cn != cn") } return nil } func (p *SingleConnPool) Len() int { return 1 } func (p *SingleConnPool) FreeLen() int { return 0 } func (p *SingleConnPool) Stats() *PoolStats { return nil } func (p *SingleConnPool) Close() error { return nil } func (p *SingleConnPool) Closed() bool { return false } ================================================ FILE: vendor/gopkg.in/redis.v3/internal/pool/pool_sticky.go ================================================ package pool import ( "errors" "sync" ) type StickyConnPool struct { pool *ConnPool reusable bool cn *Conn closed bool mx sync.Mutex } var _ Pooler = (*StickyConnPool)(nil) func NewStickyConnPool(pool *ConnPool, reusable bool) *StickyConnPool { return &StickyConnPool{ pool: pool, reusable: reusable, } } func (p *StickyConnPool) First() *Conn { p.mx.Lock() cn := p.cn p.mx.Unlock() return cn } func (p *StickyConnPool) Get() (*Conn, error) { defer p.mx.Unlock() p.mx.Lock() if p.closed { return nil, ErrClosed } if p.cn != nil { return p.cn, nil } cn, err := p.pool.Get() if err != nil { return nil, err } p.cn = cn return cn, nil } func (p *StickyConnPool) put() (err error) { err = p.pool.Put(p.cn) p.cn = nil return err } func (p *StickyConnPool) Put(cn *Conn) error { defer p.mx.Unlock() p.mx.Lock() if p.closed { return ErrClosed } if p.cn != cn { panic("p.cn != cn") } return nil } func (p *StickyConnPool) remove(reason error) error { err := p.pool.Remove(p.cn, reason) p.cn = nil return err } func (p *StickyConnPool) Remove(cn *Conn, reason error) error { defer p.mx.Unlock() p.mx.Lock() if p.closed { return nil } if p.cn == nil { panic("p.cn == nil") } if cn != nil && p.cn != cn { panic("p.cn != cn") } return p.remove(reason) } func (p *StickyConnPool) Len() int { defer p.mx.Unlock() p.mx.Lock() if p.cn == nil { return 0 } return 1 } func (p *StickyConnPool) FreeLen() int { defer p.mx.Unlock() p.mx.Lock() if p.cn == nil { return 1 } return 0 } func (p *StickyConnPool) Stats() *PoolStats { return nil } func (p *StickyConnPool) Close() error { defer p.mx.Unlock() p.mx.Lock() if p.closed { return ErrClosed } p.closed = true var err error if p.cn != nil { if p.reusable { err = p.put() } else { reason := errors.New("redis: sticky not reusable connection") err = p.remove(reason) } } return err } func (p *StickyConnPool) Closed() bool { p.mx.Lock() closed := p.closed p.mx.Unlock() return closed } ================================================ FILE: vendor/gopkg.in/redis.v3/multi.go ================================================ package redis import ( "errors" "fmt" "gopkg.in/redis.v3/internal" "gopkg.in/redis.v3/internal/pool" ) var errDiscard = errors.New("redis: Discard can be used only inside Exec") // Multi implements Redis transactions as described in // http://redis.io/topics/transactions. It's NOT safe for concurrent use // by multiple goroutines, because Exec resets list of watched keys. // If you don't need WATCH it is better to use Pipeline. // // TODO(vmihailenco): rename to Tx and rework API type Multi struct { commandable base *baseClient cmds []Cmder closed bool } // Watch creates new transaction and marks the keys to be watched // for conditional execution of a transaction. func (c *Client) Watch(keys ...string) (*Multi, error) { tx := c.Multi() if err := tx.Watch(keys...).Err(); err != nil { tx.Close() return nil, err } return tx, nil } // Deprecated. Use Watch instead. func (c *Client) Multi() *Multi { multi := &Multi{ base: &baseClient{ opt: c.opt, connPool: pool.NewStickyConnPool(c.connPool.(*pool.ConnPool), true), }, } multi.commandable.process = multi.process return multi } func (c *Multi) process(cmd Cmder) { if c.cmds == nil { c.base.process(cmd) } else { c.cmds = append(c.cmds, cmd) } } // Close closes the client, releasing any open resources. func (c *Multi) Close() error { c.closed = true if err := c.Unwatch().Err(); err != nil { internal.Logf("Unwatch failed: %s", err) } return c.base.Close() } // Watch marks the keys to be watched for conditional execution // of a transaction. func (c *Multi) Watch(keys ...string) *StatusCmd { args := make([]interface{}, 1+len(keys)) args[0] = "WATCH" for i, key := range keys { args[1+i] = key } cmd := NewStatusCmd(args...) c.Process(cmd) return cmd } // Unwatch flushes all the previously watched keys for a transaction. func (c *Multi) Unwatch(keys ...string) *StatusCmd { args := make([]interface{}, 1+len(keys)) args[0] = "UNWATCH" for i, key := range keys { args[1+i] = key } cmd := NewStatusCmd(args...) c.Process(cmd) return cmd } // Discard discards queued commands. func (c *Multi) Discard() error { if c.cmds == nil { return errDiscard } c.cmds = c.cmds[:1] return nil } // Exec executes all previously queued commands in a transaction // and restores the connection state to normal. // // When using WATCH, EXEC will execute commands only if the watched keys // were not modified, allowing for a check-and-set mechanism. // // Exec always returns list of commands. If transaction fails // TxFailedErr is returned. Otherwise Exec returns error of the first // failed command or nil. func (c *Multi) Exec(f func() error) ([]Cmder, error) { if c.closed { return nil, pool.ErrClosed } c.cmds = []Cmder{NewStatusCmd("MULTI")} if err := f(); err != nil { return nil, err } c.cmds = append(c.cmds, NewSliceCmd("EXEC")) cmds := c.cmds c.cmds = nil if len(cmds) == 2 { return []Cmder{}, nil } // Strip MULTI and EXEC commands. retCmds := cmds[1 : len(cmds)-1] cn, err := c.base.conn() if err != nil { setCmdsErr(retCmds, err) return retCmds, err } err = c.execCmds(cn, cmds) c.base.putConn(cn, err, false) return retCmds, err } func (c *Multi) execCmds(cn *pool.Conn, cmds []Cmder) error { err := writeCmd(cn, cmds...) if err != nil { setCmdsErr(cmds[1:len(cmds)-1], err) return err } statusCmd := NewStatusCmd() // Omit last command (EXEC). cmdsLen := len(cmds) - 1 // Parse queued replies. for i := 0; i < cmdsLen; i++ { if err := statusCmd.readReply(cn); err != nil { setCmdsErr(cmds[1:len(cmds)-1], err) return err } } // Parse number of replies. line, err := readLine(cn) if err != nil { if err == Nil { err = TxFailedErr } setCmdsErr(cmds[1:len(cmds)-1], err) return err } if line[0] != '*' { err := fmt.Errorf("redis: expected '*', but got line %q", line) setCmdsErr(cmds[1:len(cmds)-1], err) return err } var firstCmdErr error // Parse replies. // Loop starts from 1 to omit MULTI cmd. for i := 1; i < cmdsLen; i++ { cmd := cmds[i] if err := cmd.readReply(cn); err != nil { if firstCmdErr == nil { firstCmdErr = err } } } return firstCmdErr } ================================================ FILE: vendor/gopkg.in/redis.v3/options.go ================================================ package redis import ( "net" "time" "gopkg.in/redis.v3/internal/pool" ) type Options struct { // The network type, either tcp or unix. // Default is tcp. Network string // host:port address. Addr string // Dialer creates new network connection and has priority over // Network and Addr options. Dialer func() (net.Conn, error) // An optional password. Must match the password specified in the // requirepass server configuration option. Password string // A database to be selected after connecting to server. DB int64 // The maximum number of retries before giving up. // Default is to not retry failed commands. MaxRetries int // Sets the deadline for establishing new connections. If reached, // dial will fail with a timeout. // Default is 5 seconds. DialTimeout time.Duration // Sets the deadline for socket reads. If reached, commands will // fail with a timeout instead of blocking. ReadTimeout time.Duration // Sets the deadline for socket writes. If reached, commands will // fail with a timeout instead of blocking. WriteTimeout time.Duration // The maximum number of socket connections. // Default is 10 connections. PoolSize int // Specifies amount of time client waits for connection if all // connections are busy before returning an error. // Default is 1 second. PoolTimeout time.Duration // Specifies amount of time after which client closes idle // connections. Should be less than server's timeout. // Default is to not close idle connections. IdleTimeout time.Duration // The frequency of idle checks. // Default is 1 minute. IdleCheckFrequency time.Duration } func (opt *Options) getNetwork() string { if opt.Network == "" { return "tcp" } return opt.Network } func (opt *Options) getDialer() func() (net.Conn, error) { if opt.Dialer != nil { return opt.Dialer } return func() (net.Conn, error) { return net.DialTimeout(opt.getNetwork(), opt.Addr, opt.getDialTimeout()) } } func (opt *Options) getPoolSize() int { if opt.PoolSize == 0 { return 10 } return opt.PoolSize } func (opt *Options) getDialTimeout() time.Duration { if opt.DialTimeout == 0 { return 5 * time.Second } return opt.DialTimeout } func (opt *Options) getPoolTimeout() time.Duration { if opt.PoolTimeout == 0 { return 1 * time.Second } return opt.PoolTimeout } func (opt *Options) getIdleTimeout() time.Duration { return opt.IdleTimeout } func (opt *Options) getIdleCheckFrequency() time.Duration { if opt.IdleCheckFrequency == 0 { return time.Minute } return opt.IdleCheckFrequency } func newConnPool(opt *Options) *pool.ConnPool { return pool.NewConnPool( opt.getDialer(), opt.getPoolSize(), opt.getPoolTimeout(), opt.getIdleTimeout(), opt.getIdleCheckFrequency(), ) } // PoolStats contains pool state information and accumulated stats. type PoolStats struct { Requests uint32 // number of times a connection was requested by the pool Hits uint32 // number of times free connection was found in the pool Waits uint32 // number of times the pool had to wait for a connection Timeouts uint32 // number of times a wait timeout occurred TotalConns uint32 // the number of total connections in the pool FreeConns uint32 // the number of free connections in the pool } ================================================ FILE: vendor/gopkg.in/redis.v3/parser.go ================================================ package redis import ( "bufio" "errors" "fmt" "net" "strconv" "gopkg.in/redis.v3/internal/pool" ) const ( errorReply = '-' statusReply = '+' intReply = ':' stringReply = '$' arrayReply = '*' ) type multiBulkParser func(cn *pool.Conn, n int64) (interface{}, error) var errEmptyReply = errors.New("redis: reply is empty") //------------------------------------------------------------------------------ // Copy of encoding.BinaryMarshaler. type binaryMarshaler interface { MarshalBinary() (data []byte, err error) } // Copy of encoding.BinaryUnmarshaler. type binaryUnmarshaler interface { UnmarshalBinary(data []byte) error } func appendString(b []byte, s string) []byte { b = append(b, '$') b = strconv.AppendUint(b, uint64(len(s)), 10) b = append(b, '\r', '\n') b = append(b, s...) b = append(b, '\r', '\n') return b } func appendBytes(b, bb []byte) []byte { b = append(b, '$') b = strconv.AppendUint(b, uint64(len(bb)), 10) b = append(b, '\r', '\n') b = append(b, bb...) b = append(b, '\r', '\n') return b } func appendArg(b []byte, val interface{}) ([]byte, error) { switch v := val.(type) { case nil: b = appendString(b, "") case string: b = appendString(b, v) case []byte: b = appendBytes(b, v) case int: b = appendString(b, formatInt(int64(v))) case int8: b = appendString(b, formatInt(int64(v))) case int16: b = appendString(b, formatInt(int64(v))) case int32: b = appendString(b, formatInt(int64(v))) case int64: b = appendString(b, formatInt(v)) case uint: b = appendString(b, formatUint(uint64(v))) case uint8: b = appendString(b, formatUint(uint64(v))) case uint16: b = appendString(b, formatUint(uint64(v))) case uint32: b = appendString(b, formatUint(uint64(v))) case uint64: b = appendString(b, formatUint(v)) case float32: b = appendString(b, formatFloat(float64(v))) case float64: b = appendString(b, formatFloat(v)) case bool: if v { b = appendString(b, "1") } else { b = appendString(b, "0") } default: if bm, ok := val.(binaryMarshaler); ok { bb, err := bm.MarshalBinary() if err != nil { return nil, err } b = appendBytes(b, bb) } else { err := fmt.Errorf( "redis: can't marshal %T (consider implementing BinaryMarshaler)", val) return nil, err } } return b, nil } func appendArgs(b []byte, args []interface{}) ([]byte, error) { b = append(b, arrayReply) b = strconv.AppendUint(b, uint64(len(args)), 10) b = append(b, '\r', '\n') for _, arg := range args { var err error b, err = appendArg(b, arg) if err != nil { return nil, err } } return b, nil } func scan(b []byte, val interface{}) error { switch v := val.(type) { case nil: return errorf("redis: Scan(nil)") case *string: *v = bytesToString(b) return nil case *[]byte: *v = b return nil case *int: var err error *v, err = strconv.Atoi(bytesToString(b)) return err case *int8: n, err := strconv.ParseInt(bytesToString(b), 10, 8) if err != nil { return err } *v = int8(n) return nil case *int16: n, err := strconv.ParseInt(bytesToString(b), 10, 16) if err != nil { return err } *v = int16(n) return nil case *int32: n, err := strconv.ParseInt(bytesToString(b), 10, 16) if err != nil { return err } *v = int32(n) return nil case *int64: n, err := strconv.ParseInt(bytesToString(b), 10, 64) if err != nil { return err } *v = n return nil case *uint: n, err := strconv.ParseUint(bytesToString(b), 10, 64) if err != nil { return err } *v = uint(n) return nil case *uint8: n, err := strconv.ParseUint(bytesToString(b), 10, 8) if err != nil { return err } *v = uint8(n) return nil case *uint16: n, err := strconv.ParseUint(bytesToString(b), 10, 16) if err != nil { return err } *v = uint16(n) return nil case *uint32: n, err := strconv.ParseUint(bytesToString(b), 10, 32) if err != nil { return err } *v = uint32(n) return nil case *uint64: n, err := strconv.ParseUint(bytesToString(b), 10, 64) if err != nil { return err } *v = n return nil case *float32: n, err := strconv.ParseFloat(bytesToString(b), 32) if err != nil { return err } *v = float32(n) return err case *float64: var err error *v, err = strconv.ParseFloat(bytesToString(b), 64) return err case *bool: *v = len(b) == 1 && b[0] == '1' return nil default: if bu, ok := val.(binaryUnmarshaler); ok { return bu.UnmarshalBinary(b) } err := fmt.Errorf( "redis: can't unmarshal %T (consider implementing BinaryUnmarshaler)", val) return err } } //------------------------------------------------------------------------------ func readLine(cn *pool.Conn) ([]byte, error) { line, isPrefix, err := cn.Rd.ReadLine() if err != nil { return nil, err } if isPrefix { return nil, bufio.ErrBufferFull } if len(line) == 0 { return nil, errEmptyReply } if isNilReply(line) { return nil, Nil } return line, nil } func isNilReply(b []byte) bool { return len(b) == 3 && (b[0] == stringReply || b[0] == arrayReply) && b[1] == '-' && b[2] == '1' } //------------------------------------------------------------------------------ func parseErrorReply(cn *pool.Conn, line []byte) error { return errorf(string(line[1:])) } func parseStatusReply(cn *pool.Conn, line []byte) ([]byte, error) { return line[1:], nil } func parseIntReply(cn *pool.Conn, line []byte) (int64, error) { n, err := strconv.ParseInt(bytesToString(line[1:]), 10, 64) if err != nil { return 0, err } return n, nil } func readIntReply(cn *pool.Conn) (int64, error) { line, err := readLine(cn) if err != nil { return 0, err } switch line[0] { case errorReply: return 0, parseErrorReply(cn, line) case intReply: return parseIntReply(cn, line) default: return 0, fmt.Errorf("redis: can't parse int reply: %.100q", line) } } func parseBytesReply(cn *pool.Conn, line []byte) ([]byte, error) { if isNilReply(line) { return nil, Nil } replyLen, err := strconv.Atoi(bytesToString(line[1:])) if err != nil { return nil, err } b, err := cn.ReadN(replyLen + 2) if err != nil { return nil, err } return b[:replyLen], nil } func readBytesReply(cn *pool.Conn) ([]byte, error) { line, err := readLine(cn) if err != nil { return nil, err } switch line[0] { case errorReply: return nil, parseErrorReply(cn, line) case stringReply: return parseBytesReply(cn, line) case statusReply: return parseStatusReply(cn, line) default: return nil, fmt.Errorf("redis: can't parse string reply: %.100q", line) } } func readStringReply(cn *pool.Conn) (string, error) { b, err := readBytesReply(cn) if err != nil { return "", err } return string(b), nil } func readFloatReply(cn *pool.Conn) (float64, error) { b, err := readBytesReply(cn) if err != nil { return 0, err } return strconv.ParseFloat(bytesToString(b), 64) } func parseArrayHeader(cn *pool.Conn, line []byte) (int64, error) { if isNilReply(line) { return 0, Nil } n, err := strconv.ParseInt(bytesToString(line[1:]), 10, 64) if err != nil { return 0, err } return n, nil } func parseArrayReply(cn *pool.Conn, p multiBulkParser, line []byte) (interface{}, error) { n, err := parseArrayHeader(cn, line) if err != nil { return nil, err } return p(cn, n) } func readArrayHeader(cn *pool.Conn) (int64, error) { line, err := readLine(cn) if err != nil { return 0, err } switch line[0] { case errorReply: return 0, parseErrorReply(cn, line) case arrayReply: return parseArrayHeader(cn, line) default: return 0, fmt.Errorf("redis: can't parse array reply: %.100q", line) } } func readArrayReply(cn *pool.Conn, p multiBulkParser) (interface{}, error) { line, err := readLine(cn) if err != nil { return nil, err } switch line[0] { case errorReply: return nil, parseErrorReply(cn, line) case arrayReply: return parseArrayReply(cn, p, line) default: return nil, fmt.Errorf("redis: can't parse array reply: %.100q", line) } } func readReply(cn *pool.Conn, p multiBulkParser) (interface{}, error) { line, err := readLine(cn) if err != nil { return nil, err } switch line[0] { case errorReply: return nil, parseErrorReply(cn, line) case statusReply: return parseStatusReply(cn, line) case intReply: return parseIntReply(cn, line) case stringReply: return parseBytesReply(cn, line) case arrayReply: return parseArrayReply(cn, p, line) } return nil, fmt.Errorf("redis: can't parse %.100q", line) } func readScanReply(cn *pool.Conn) ([]string, int64, error) { n, err := readArrayHeader(cn) if err != nil { return nil, 0, err } if n != 2 { return nil, 0, fmt.Errorf("redis: got %d elements in scan reply, expected 2", n) } b, err := readBytesReply(cn) if err != nil { return nil, 0, err } cursor, err := strconv.ParseInt(bytesToString(b), 10, 64) if err != nil { return nil, 0, err } n, err = readArrayHeader(cn) if err != nil { return nil, 0, err } keys := make([]string, n) for i := int64(0); i < n; i++ { key, err := readStringReply(cn) if err != nil { return nil, 0, err } keys[i] = key } return keys, cursor, err } func sliceParser(cn *pool.Conn, n int64) (interface{}, error) { vals := make([]interface{}, 0, n) for i := int64(0); i < n; i++ { v, err := readReply(cn, sliceParser) if err == Nil { vals = append(vals, nil) } else if err != nil { return nil, err } else { switch vv := v.(type) { case []byte: vals = append(vals, string(vv)) default: vals = append(vals, v) } } } return vals, nil } func intSliceParser(cn *pool.Conn, n int64) (interface{}, error) { ints := make([]int64, 0, n) for i := int64(0); i < n; i++ { n, err := readIntReply(cn) if err != nil { return nil, err } ints = append(ints, n) } return ints, nil } func boolSliceParser(cn *pool.Conn, n int64) (interface{}, error) { bools := make([]bool, 0, n) for i := int64(0); i < n; i++ { n, err := readIntReply(cn) if err != nil { return nil, err } bools = append(bools, n == 1) } return bools, nil } func stringSliceParser(cn *pool.Conn, n int64) (interface{}, error) { ss := make([]string, 0, n) for i := int64(0); i < n; i++ { s, err := readStringReply(cn) if err == Nil { ss = append(ss, "") } else if err != nil { return nil, err } else { ss = append(ss, s) } } return ss, nil } func floatSliceParser(cn *pool.Conn, n int64) (interface{}, error) { nn := make([]float64, 0, n) for i := int64(0); i < n; i++ { n, err := readFloatReply(cn) if err != nil { return nil, err } nn = append(nn, n) } return nn, nil } func stringStringMapParser(cn *pool.Conn, n int64) (interface{}, error) { m := make(map[string]string, n/2) for i := int64(0); i < n; i += 2 { key, err := readStringReply(cn) if err != nil { return nil, err } value, err := readStringReply(cn) if err != nil { return nil, err } m[key] = value } return m, nil } func stringIntMapParser(cn *pool.Conn, n int64) (interface{}, error) { m := make(map[string]int64, n/2) for i := int64(0); i < n; i += 2 { key, err := readStringReply(cn) if err != nil { return nil, err } n, err := readIntReply(cn) if err != nil { return nil, err } m[key] = n } return m, nil } func zSliceParser(cn *pool.Conn, n int64) (interface{}, error) { zz := make([]Z, n/2) for i := int64(0); i < n; i += 2 { var err error z := &zz[i/2] z.Member, err = readStringReply(cn) if err != nil { return nil, err } z.Score, err = readFloatReply(cn) if err != nil { return nil, err } } return zz, nil } func clusterSlotInfoSliceParser(cn *pool.Conn, n int64) (interface{}, error) { infos := make([]ClusterSlotInfo, 0, n) for i := int64(0); i < n; i++ { n, err := readArrayHeader(cn) if err != nil { return nil, err } if n < 2 { err := fmt.Errorf("redis: got %d elements in cluster info, expected at least 2", n) return nil, err } start, err := readIntReply(cn) if err != nil { return nil, err } end, err := readIntReply(cn) if err != nil { return nil, err } addrsn := n - 2 info := ClusterSlotInfo{ Start: int(start), End: int(end), Addrs: make([]string, addrsn), } for i := int64(0); i < addrsn; i++ { n, err := readArrayHeader(cn) if err != nil { return nil, err } if n != 2 && n != 3 { err := fmt.Errorf("got %d elements in cluster info address, expected 2 or 3", n) return nil, err } ip, err := readStringReply(cn) if err != nil { return nil, err } port, err := readIntReply(cn) if err != nil { return nil, err } if n == 3 { // TODO: expose id in ClusterSlotInfo _, err := readStringReply(cn) if err != nil { return nil, err } } info.Addrs[i] = net.JoinHostPort(ip, strconv.FormatInt(port, 10)) } infos = append(infos, info) } return infos, nil } func newGeoLocationParser(q *GeoRadiusQuery) multiBulkParser { return func(cn *pool.Conn, n int64) (interface{}, error) { var loc GeoLocation var err error loc.Name, err = readStringReply(cn) if err != nil { return nil, err } if q.WithDist { loc.Dist, err = readFloatReply(cn) if err != nil { return nil, err } } if q.WithGeoHash { loc.GeoHash, err = readIntReply(cn) if err != nil { return nil, err } } if q.WithCoord { n, err := readArrayHeader(cn) if err != nil { return nil, err } if n != 2 { return nil, fmt.Errorf("got %d coordinates, expected 2", n) } loc.Longitude, err = readFloatReply(cn) if err != nil { return nil, err } loc.Latitude, err = readFloatReply(cn) if err != nil { return nil, err } } return &loc, nil } } func newGeoLocationSliceParser(q *GeoRadiusQuery) multiBulkParser { return func(cn *pool.Conn, n int64) (interface{}, error) { locs := make([]GeoLocation, 0, n) for i := int64(0); i < n; i++ { v, err := readReply(cn, newGeoLocationParser(q)) if err != nil { return nil, err } switch vv := v.(type) { case []byte: locs = append(locs, GeoLocation{ Name: string(vv), }) case *GeoLocation: locs = append(locs, *vv) default: return nil, fmt.Errorf("got %T, expected string or *GeoLocation", v) } } return locs, nil } } ================================================ FILE: vendor/gopkg.in/redis.v3/pipeline.go ================================================ package redis import ( "sync" "sync/atomic" "gopkg.in/redis.v3/internal/pool" ) // Pipeline implements pipelining as described in // http://redis.io/topics/pipelining. It's safe for concurrent use // by multiple goroutines. type Pipeline struct { commandable client baseClient mu sync.Mutex // protects cmds cmds []Cmder closed int32 } func (c *Client) Pipeline() *Pipeline { pipe := &Pipeline{ client: c.baseClient, cmds: make([]Cmder, 0, 10), } pipe.commandable.process = pipe.process return pipe } func (c *Client) Pipelined(fn func(*Pipeline) error) ([]Cmder, error) { pipe := c.Pipeline() if err := fn(pipe); err != nil { return nil, err } cmds, err := pipe.Exec() _ = pipe.Close() return cmds, err } func (pipe *Pipeline) process(cmd Cmder) { pipe.mu.Lock() pipe.cmds = append(pipe.cmds, cmd) pipe.mu.Unlock() } // Close closes the pipeline, releasing any open resources. func (pipe *Pipeline) Close() error { atomic.StoreInt32(&pipe.closed, 1) pipe.Discard() return nil } func (pipe *Pipeline) isClosed() bool { return atomic.LoadInt32(&pipe.closed) == 1 } // Discard resets the pipeline and discards queued commands. func (pipe *Pipeline) Discard() error { defer pipe.mu.Unlock() pipe.mu.Lock() if pipe.isClosed() { return pool.ErrClosed } pipe.cmds = pipe.cmds[:0] return nil } // Exec executes all previously queued commands using one // client-server roundtrip. // // Exec always returns list of commands and error of the first failed // command if any. func (pipe *Pipeline) Exec() (cmds []Cmder, retErr error) { if pipe.isClosed() { return nil, pool.ErrClosed } defer pipe.mu.Unlock() pipe.mu.Lock() if len(pipe.cmds) == 0 { return pipe.cmds, nil } cmds = pipe.cmds pipe.cmds = make([]Cmder, 0, 10) failedCmds := cmds for i := 0; i <= pipe.client.opt.MaxRetries; i++ { cn, err := pipe.client.conn() if err != nil { setCmdsErr(failedCmds, err) return cmds, err } if i > 0 { resetCmds(failedCmds) } failedCmds, err = execCmds(cn, failedCmds) pipe.client.putConn(cn, err, false) if err != nil && retErr == nil { retErr = err } if len(failedCmds) == 0 { break } } return cmds, retErr } func execCmds(cn *pool.Conn, cmds []Cmder) ([]Cmder, error) { if err := writeCmd(cn, cmds...); err != nil { setCmdsErr(cmds, err) return cmds, err } var firstCmdErr error var failedCmds []Cmder for _, cmd := range cmds { err := cmd.readReply(cn) if err == nil { continue } if firstCmdErr == nil { firstCmdErr = err } if shouldRetry(err) { failedCmds = append(failedCmds, cmd) } } return failedCmds, firstCmdErr } ================================================ FILE: vendor/gopkg.in/redis.v3/pubsub.go ================================================ package redis import ( "fmt" "net" "time" "gopkg.in/redis.v3/internal" "gopkg.in/redis.v3/internal/pool" ) // Posts a message to the given channel. func (c *Client) Publish(channel, message string) *IntCmd { req := NewIntCmd("PUBLISH", channel, message) c.Process(req) return req } // PubSub implements Pub/Sub commands as described in // http://redis.io/topics/pubsub. It's NOT safe for concurrent use by // multiple goroutines. type PubSub struct { base *baseClient channels []string patterns []string nsub int // number of active subscriptions } // Deprecated. Use Subscribe/PSubscribe instead. func (c *Client) PubSub() *PubSub { return &PubSub{ base: &baseClient{ opt: c.opt, connPool: pool.NewStickyConnPool(c.connPool.(*pool.ConnPool), false), }, } } // Subscribes the client to the specified channels. func (c *Client) Subscribe(channels ...string) (*PubSub, error) { pubsub := c.PubSub() return pubsub, pubsub.Subscribe(channels...) } // Subscribes the client to the given patterns. func (c *Client) PSubscribe(channels ...string) (*PubSub, error) { pubsub := c.PubSub() return pubsub, pubsub.PSubscribe(channels...) } func (c *PubSub) subscribe(redisCmd string, channels ...string) error { cn, err := c.base.conn() if err != nil { return err } c.putConn(cn, err) args := make([]interface{}, 1+len(channels)) args[0] = redisCmd for i, channel := range channels { args[1+i] = channel } cmd := NewSliceCmd(args...) return writeCmd(cn, cmd) } // Subscribes the client to the specified channels. func (c *PubSub) Subscribe(channels ...string) error { err := c.subscribe("SUBSCRIBE", channels...) if err == nil { c.channels = append(c.channels, channels...) c.nsub += len(channels) } return err } // Subscribes the client to the given patterns. func (c *PubSub) PSubscribe(patterns ...string) error { err := c.subscribe("PSUBSCRIBE", patterns...) if err == nil { c.patterns = append(c.patterns, patterns...) c.nsub += len(patterns) } return err } func remove(ss []string, es ...string) []string { if len(es) == 0 { return ss[:0] } for _, e := range es { for i, s := range ss { if s == e { ss = append(ss[:i], ss[i+1:]...) break } } } return ss } // Unsubscribes the client from the given channels, or from all of // them if none is given. func (c *PubSub) Unsubscribe(channels ...string) error { err := c.subscribe("UNSUBSCRIBE", channels...) if err == nil { c.channels = remove(c.channels, channels...) } return err } // Unsubscribes the client from the given patterns, or from all of // them if none is given. func (c *PubSub) PUnsubscribe(patterns ...string) error { err := c.subscribe("PUNSUBSCRIBE", patterns...) if err == nil { c.patterns = remove(c.patterns, patterns...) } return err } func (c *PubSub) Close() error { return c.base.Close() } func (c *PubSub) Ping(payload string) error { cn, err := c.base.conn() if err != nil { return err } args := []interface{}{"PING"} if payload != "" { args = append(args, payload) } cmd := NewCmd(args...) return writeCmd(cn, cmd) } // Message received after a successful subscription to channel. type Subscription struct { // Can be "subscribe", "unsubscribe", "psubscribe" or "punsubscribe". Kind string // Channel name we have subscribed to. Channel string // Number of channels we are currently subscribed to. Count int } func (m *Subscription) String() string { return fmt.Sprintf("%s: %s", m.Kind, m.Channel) } // Message received as result of a PUBLISH command issued by another client. type Message struct { Channel string Pattern string Payload string } func (m *Message) String() string { return fmt.Sprintf("Message<%s: %s>", m.Channel, m.Payload) } // TODO: remove PMessage if favor of Message // Message matching a pattern-matching subscription received as result // of a PUBLISH command issued by another client. type PMessage struct { Channel string Pattern string Payload string } func (m *PMessage) String() string { return fmt.Sprintf("PMessage<%s: %s>", m.Channel, m.Payload) } // Pong received as result of a PING command issued by another client. type Pong struct { Payload string } func (p *Pong) String() string { if p.Payload != "" { return fmt.Sprintf("Pong<%s>", p.Payload) } return "Pong" } func (c *PubSub) newMessage(reply []interface{}) (interface{}, error) { switch kind := reply[0].(string); kind { case "subscribe", "unsubscribe", "psubscribe", "punsubscribe": return &Subscription{ Kind: kind, Channel: reply[1].(string), Count: int(reply[2].(int64)), }, nil case "message": return &Message{ Channel: reply[1].(string), Payload: reply[2].(string), }, nil case "pmessage": return &PMessage{ Pattern: reply[1].(string), Channel: reply[2].(string), Payload: reply[3].(string), }, nil case "pong": return &Pong{ Payload: reply[1].(string), }, nil default: return nil, fmt.Errorf("redis: unsupported pubsub notification: %q", kind) } } // ReceiveTimeout acts like Receive but returns an error if message // is not received in time. This is low-level API and most clients // should use ReceiveMessage. func (c *PubSub) ReceiveTimeout(timeout time.Duration) (interface{}, error) { if c.nsub == 0 { c.resubscribe() } cn, err := c.base.conn() if err != nil { return nil, err } cn.ReadTimeout = timeout cmd := NewSliceCmd() err = cmd.readReply(cn) c.putConn(cn, err) if err != nil { return nil, err } return c.newMessage(cmd.Val()) } // Receive returns a message as a Subscription, Message, PMessage, // Pong or error. See PubSub example for details. This is low-level // API and most clients should use ReceiveMessage. func (c *PubSub) Receive() (interface{}, error) { return c.ReceiveTimeout(0) } // ReceiveMessage returns a Message or error ignoring Subscription or Pong // messages. It automatically reconnects to Redis Server and resubscribes // to channels in case of network errors. func (c *PubSub) ReceiveMessage() (*Message, error) { return c.receiveMessage(5 * time.Second) } func (c *PubSub) receiveMessage(timeout time.Duration) (*Message, error) { var errNum uint for { msgi, err := c.ReceiveTimeout(timeout) if err != nil { if !isNetworkError(err) { return nil, err } errNum++ if errNum < 3 { if netErr, ok := err.(net.Error); ok && netErr.Timeout() { err := c.Ping("") if err != nil { internal.Logf("PubSub.Ping failed: %s", err) } } } else { // 3 consequent errors - connection is bad // and/or Redis Server is down. // Sleep to not exceed max number of open connections. time.Sleep(time.Second) } continue } // Reset error number, because we received a message. errNum = 0 switch msg := msgi.(type) { case *Subscription: // Ignore. case *Pong: // Ignore. case *Message: return msg, nil case *PMessage: return &Message{ Channel: msg.Channel, Pattern: msg.Pattern, Payload: msg.Payload, }, nil default: return nil, fmt.Errorf("redis: unknown message: %T", msgi) } } } func (c *PubSub) putConn(cn *pool.Conn, err error) { if !c.base.putConn(cn, err, true) { c.nsub = 0 } } func (c *PubSub) resubscribe() { if c.base.closed() { return } if len(c.channels) > 0 { if err := c.Subscribe(c.channels...); err != nil { internal.Logf("Subscribe failed: %s", err) } } if len(c.patterns) > 0 { if err := c.PSubscribe(c.patterns...); err != nil { internal.Logf("PSubscribe failed: %s", err) } } } ================================================ FILE: vendor/gopkg.in/redis.v3/redis.go ================================================ package redis // import "gopkg.in/redis.v3" import ( "fmt" "log" "gopkg.in/redis.v3/internal" "gopkg.in/redis.v3/internal/pool" ) var Logger *log.Logger func SetLogger(logger *log.Logger) { internal.Logger = logger } type baseClient struct { connPool pool.Pooler opt *Options onClose func() error // hook called when client is closed } func (c *baseClient) String() string { return fmt.Sprintf("Redis<%s db:%d>", c.opt.Addr, c.opt.DB) } func (c *baseClient) conn() (*pool.Conn, error) { cn, err := c.connPool.Get() if err != nil { return nil, err } if !cn.Inited { if err := c.initConn(cn); err != nil { _ = c.connPool.Remove(cn, err) return nil, err } } return cn, err } func (c *baseClient) putConn(cn *pool.Conn, err error, allowTimeout bool) bool { if isBadConn(err, allowTimeout) { _ = c.connPool.Remove(cn, err) return false } _ = c.connPool.Put(cn) return true } func (c *baseClient) initConn(cn *pool.Conn) error { cn.Inited = true if c.opt.Password == "" && c.opt.DB == 0 { return nil } // Temp client for Auth and Select. client := newClient(c.opt, pool.NewSingleConnPool(cn)) if c.opt.Password != "" { if err := client.Auth(c.opt.Password).Err(); err != nil { return err } } if c.opt.DB > 0 { if err := client.Select(c.opt.DB).Err(); err != nil { return err } } return nil } func (c *baseClient) process(cmd Cmder) { for i := 0; i <= c.opt.MaxRetries; i++ { if i > 0 { cmd.reset() } cn, err := c.conn() if err != nil { cmd.setErr(err) return } readTimeout := cmd.readTimeout() if readTimeout != nil { cn.ReadTimeout = *readTimeout } else { cn.ReadTimeout = c.opt.ReadTimeout } cn.WriteTimeout = c.opt.WriteTimeout if err := writeCmd(cn, cmd); err != nil { c.putConn(cn, err, false) cmd.setErr(err) if err != nil && shouldRetry(err) { continue } return } err = cmd.readReply(cn) c.putConn(cn, err, readTimeout != nil) if err != nil && shouldRetry(err) { continue } return } } func (c *baseClient) closed() bool { return c.connPool.Closed() } // Close closes the client, releasing any open resources. // // It is rare to Close a Client, as the Client is meant to be // long-lived and shared between many goroutines. func (c *baseClient) Close() error { var retErr error if c.onClose != nil { if err := c.onClose(); err != nil && retErr == nil { retErr = err } } if err := c.connPool.Close(); err != nil && retErr == nil { retErr = err } return retErr } //------------------------------------------------------------------------------ // Client is a Redis client representing a pool of zero or more // underlying connections. It's safe for concurrent use by multiple // goroutines. type Client struct { baseClient commandable } func newClient(opt *Options, pool pool.Pooler) *Client { base := baseClient{opt: opt, connPool: pool} return &Client{ baseClient: base, commandable: commandable{ process: base.process, }, } } // NewClient returns a client to the Redis Server specified by Options. func NewClient(opt *Options) *Client { return newClient(opt, newConnPool(opt)) } // PoolStats returns connection pool stats. func (c *Client) PoolStats() *PoolStats { s := c.connPool.Stats() return &PoolStats{ Requests: s.Requests, Hits: s.Hits, Waits: s.Waits, Timeouts: s.Timeouts, TotalConns: s.TotalConns, FreeConns: s.FreeConns, } } ================================================ FILE: vendor/gopkg.in/redis.v3/ring.go ================================================ package redis import ( "errors" "fmt" "sync" "time" "gopkg.in/redis.v3/internal" "gopkg.in/redis.v3/internal/consistenthash" "gopkg.in/redis.v3/internal/hashtag" "gopkg.in/redis.v3/internal/pool" ) var ( errRingShardsDown = errors.New("redis: all ring shards are down") ) // RingOptions are used to configure a ring client and should be // passed to NewRing. type RingOptions struct { // A map of name => host:port addresses of ring shards. Addrs map[string]string // Following options are copied from Options struct. DB int64 Password string MaxRetries int DialTimeout time.Duration ReadTimeout time.Duration WriteTimeout time.Duration PoolSize int PoolTimeout time.Duration IdleTimeout time.Duration IdleCheckFrequency time.Duration } func (opt *RingOptions) clientOptions() *Options { return &Options{ DB: opt.DB, Password: opt.Password, DialTimeout: opt.DialTimeout, ReadTimeout: opt.ReadTimeout, WriteTimeout: opt.WriteTimeout, PoolSize: opt.PoolSize, PoolTimeout: opt.PoolTimeout, IdleTimeout: opt.IdleTimeout, IdleCheckFrequency: opt.IdleCheckFrequency, } } type ringShard struct { Client *Client down int } func (shard *ringShard) String() string { var state string if shard.IsUp() { state = "up" } else { state = "down" } return fmt.Sprintf("%s is %s", shard.Client, state) } func (shard *ringShard) IsDown() bool { const threshold = 5 return shard.down >= threshold } func (shard *ringShard) IsUp() bool { return !shard.IsDown() } // Vote votes to set shard state and returns true if state was changed. func (shard *ringShard) Vote(up bool) bool { if up { changed := shard.IsDown() shard.down = 0 return changed } if shard.IsDown() { return false } shard.down++ return shard.IsDown() } // Ring is a Redis client that uses constistent hashing to distribute // keys across multiple Redis servers (shards). It's safe for // concurrent use by multiple goroutines. // // Ring monitors the state of each shard and removes dead shards from // the ring. When shard comes online it is added back to the ring. This // gives you maximum availability and partition tolerance, but no // consistency between different shards or even clients. Each client // uses shards that are available to the client and does not do any // coordination when shard state is changed. // // Ring should be used when you use multiple Redis servers for caching // and can tolerate losing data when one of the servers dies. // Otherwise you should use Redis Cluster. type Ring struct { commandable opt *RingOptions nreplicas int mx sync.RWMutex hash *consistenthash.Map shards map[string]*ringShard closed bool } func NewRing(opt *RingOptions) *Ring { const nreplicas = 100 ring := &Ring{ opt: opt, nreplicas: nreplicas, hash: consistenthash.New(nreplicas, nil), shards: make(map[string]*ringShard), } ring.commandable.process = ring.process for name, addr := range opt.Addrs { clopt := opt.clientOptions() clopt.Addr = addr ring.addClient(name, NewClient(clopt)) } go ring.heartbeat() return ring } func (ring *Ring) addClient(name string, cl *Client) { ring.mx.Lock() ring.hash.Add(name) ring.shards[name] = &ringShard{Client: cl} ring.mx.Unlock() } func (ring *Ring) getClient(key string) (*Client, error) { ring.mx.RLock() if ring.closed { return nil, pool.ErrClosed } name := ring.hash.Get(hashtag.Key(key)) if name == "" { ring.mx.RUnlock() return nil, errRingShardsDown } cl := ring.shards[name].Client ring.mx.RUnlock() return cl, nil } func (ring *Ring) process(cmd Cmder) { cl, err := ring.getClient(cmd.clusterKey()) if err != nil { cmd.setErr(err) return } cl.baseClient.process(cmd) } // rebalance removes dead shards from the ring. func (ring *Ring) rebalance() { defer ring.mx.Unlock() ring.mx.Lock() ring.hash = consistenthash.New(ring.nreplicas, nil) for name, shard := range ring.shards { if shard.IsUp() { ring.hash.Add(name) } } } // heartbeat monitors state of each shard in the ring. func (ring *Ring) heartbeat() { ticker := time.NewTicker(100 * time.Millisecond) defer ticker.Stop() for _ = range ticker.C { var rebalance bool ring.mx.RLock() if ring.closed { ring.mx.RUnlock() break } for _, shard := range ring.shards { err := shard.Client.Ping().Err() if shard.Vote(err == nil || err == pool.ErrPoolTimeout) { internal.Logf("ring shard state changed: %s", shard) rebalance = true } } ring.mx.RUnlock() if rebalance { ring.rebalance() } } } // Close closes the ring client, releasing any open resources. // // It is rare to Close a Ring, as the Ring is meant to be long-lived // and shared between many goroutines. func (ring *Ring) Close() (retErr error) { defer ring.mx.Unlock() ring.mx.Lock() if ring.closed { return nil } ring.closed = true for _, shard := range ring.shards { if err := shard.Client.Close(); err != nil { retErr = err } } ring.hash = nil ring.shards = nil return retErr } // RingPipeline creates a new pipeline which is able to execute commands // against multiple shards. It's NOT safe for concurrent use by // multiple goroutines. type RingPipeline struct { commandable ring *Ring cmds []Cmder closed bool } func (ring *Ring) Pipeline() *RingPipeline { pipe := &RingPipeline{ ring: ring, cmds: make([]Cmder, 0, 10), } pipe.commandable.process = pipe.process return pipe } func (ring *Ring) Pipelined(fn func(*RingPipeline) error) ([]Cmder, error) { pipe := ring.Pipeline() if err := fn(pipe); err != nil { return nil, err } cmds, err := pipe.Exec() pipe.Close() return cmds, err } func (pipe *RingPipeline) process(cmd Cmder) { pipe.cmds = append(pipe.cmds, cmd) } // Discard resets the pipeline and discards queued commands. func (pipe *RingPipeline) Discard() error { if pipe.closed { return pool.ErrClosed } pipe.cmds = pipe.cmds[:0] return nil } // Exec always returns list of commands and error of the first failed // command if any. func (pipe *RingPipeline) Exec() (cmds []Cmder, retErr error) { if pipe.closed { return nil, pool.ErrClosed } if len(pipe.cmds) == 0 { return pipe.cmds, nil } cmds = pipe.cmds pipe.cmds = make([]Cmder, 0, 10) cmdsMap := make(map[string][]Cmder) for _, cmd := range cmds { name := pipe.ring.hash.Get(hashtag.Key(cmd.clusterKey())) if name == "" { cmd.setErr(errRingShardsDown) if retErr == nil { retErr = errRingShardsDown } continue } cmdsMap[name] = append(cmdsMap[name], cmd) } for i := 0; i <= pipe.ring.opt.MaxRetries; i++ { failedCmdsMap := make(map[string][]Cmder) for name, cmds := range cmdsMap { client := pipe.ring.shards[name].Client cn, err := client.conn() if err != nil { setCmdsErr(cmds, err) if retErr == nil { retErr = err } continue } if i > 0 { resetCmds(cmds) } failedCmds, err := execCmds(cn, cmds) client.putConn(cn, err, false) if err != nil && retErr == nil { retErr = err } if len(failedCmds) > 0 { failedCmdsMap[name] = failedCmds } } if len(failedCmdsMap) == 0 { break } cmdsMap = failedCmdsMap } return cmds, retErr } // Close closes the pipeline, releasing any open resources. func (pipe *RingPipeline) Close() error { pipe.Discard() pipe.closed = true return nil } ================================================ FILE: vendor/gopkg.in/redis.v3/safe.go ================================================ // +build appengine package redis func bytesToString(b []byte) string { return string(b) } ================================================ FILE: vendor/gopkg.in/redis.v3/script.go ================================================ package redis import ( "crypto/sha1" "encoding/hex" "io" "strings" ) type scripter interface { Eval(script string, keys []string, args []string) *Cmd EvalSha(sha1 string, keys []string, args []string) *Cmd ScriptExists(scripts ...string) *BoolSliceCmd ScriptLoad(script string) *StringCmd } type Script struct { src, hash string } func NewScript(src string) *Script { h := sha1.New() io.WriteString(h, src) return &Script{ src: src, hash: hex.EncodeToString(h.Sum(nil)), } } func (s *Script) Load(c scripter) *StringCmd { return c.ScriptLoad(s.src) } func (s *Script) Exists(c scripter) *BoolSliceCmd { return c.ScriptExists(s.src) } func (s *Script) Eval(c scripter, keys []string, args []string) *Cmd { return c.Eval(s.src, keys, args) } func (s *Script) EvalSha(c scripter, keys []string, args []string) *Cmd { return c.EvalSha(s.hash, keys, args) } func (s *Script) Run(c scripter, keys []string, args []string) *Cmd { r := s.EvalSha(c, keys, args) if err := r.Err(); err != nil && strings.HasPrefix(err.Error(), "NOSCRIPT ") { return s.Eval(c, keys, args) } return r } ================================================ FILE: vendor/gopkg.in/redis.v3/sentinel.go ================================================ package redis import ( "errors" "fmt" "net" "strings" "sync" "time" "gopkg.in/redis.v3/internal" "gopkg.in/redis.v3/internal/pool" ) //------------------------------------------------------------------------------ // FailoverOptions are used to configure a failover client and should // be passed to NewFailoverClient. type FailoverOptions struct { // The master name. MasterName string // A seed list of host:port addresses of sentinel nodes. SentinelAddrs []string // Following options are copied from Options struct. Password string DB int64 MaxRetries int DialTimeout time.Duration ReadTimeout time.Duration WriteTimeout time.Duration PoolSize int PoolTimeout time.Duration IdleTimeout time.Duration IdleCheckFrequency time.Duration } func (opt *FailoverOptions) options() *Options { return &Options{ Addr: "FailoverClient", DB: opt.DB, Password: opt.Password, MaxRetries: opt.MaxRetries, DialTimeout: opt.DialTimeout, ReadTimeout: opt.ReadTimeout, WriteTimeout: opt.WriteTimeout, PoolSize: opt.PoolSize, PoolTimeout: opt.PoolTimeout, IdleTimeout: opt.IdleTimeout, IdleCheckFrequency: opt.IdleCheckFrequency, } } // NewFailoverClient returns a Redis client that uses Redis Sentinel // for automatic failover. It's safe for concurrent use by multiple // goroutines. func NewFailoverClient(failoverOpt *FailoverOptions) *Client { opt := failoverOpt.options() failover := &sentinelFailover{ masterName: failoverOpt.MasterName, sentinelAddrs: failoverOpt.SentinelAddrs, opt: opt, } base := baseClient{ opt: opt, connPool: failover.Pool(), onClose: func() error { return failover.Close() }, } return &Client{ baseClient: base, commandable: commandable{ process: base.process, }, } } //------------------------------------------------------------------------------ type sentinelClient struct { baseClient commandable } func newSentinel(opt *Options) *sentinelClient { base := baseClient{ opt: opt, connPool: newConnPool(opt), } return &sentinelClient{ baseClient: base, commandable: commandable{process: base.process}, } } func (c *sentinelClient) PubSub() *PubSub { return &PubSub{ base: &baseClient{ opt: c.opt, connPool: pool.NewStickyConnPool(c.connPool.(*pool.ConnPool), false), }, } } func (c *sentinelClient) GetMasterAddrByName(name string) *StringSliceCmd { cmd := NewStringSliceCmd("SENTINEL", "get-master-addr-by-name", name) c.Process(cmd) return cmd } func (c *sentinelClient) Sentinels(name string) *SliceCmd { cmd := NewSliceCmd("SENTINEL", "sentinels", name) c.Process(cmd) return cmd } type sentinelFailover struct { masterName string sentinelAddrs []string opt *Options pool *pool.ConnPool poolOnce sync.Once mu sync.RWMutex sentinel *sentinelClient } func (d *sentinelFailover) Close() error { return d.resetSentinel() } func (d *sentinelFailover) dial() (net.Conn, error) { addr, err := d.MasterAddr() if err != nil { return nil, err } return net.DialTimeout("tcp", addr, d.opt.DialTimeout) } func (d *sentinelFailover) Pool() *pool.ConnPool { d.poolOnce.Do(func() { d.opt.Dialer = d.dial d.pool = newConnPool(d.opt) }) return d.pool } func (d *sentinelFailover) MasterAddr() (string, error) { defer d.mu.Unlock() d.mu.Lock() // Try last working sentinel. if d.sentinel != nil { addr, err := d.sentinel.GetMasterAddrByName(d.masterName).Result() if err != nil { internal.Logf("sentinel: GetMasterAddrByName %q failed: %s", d.masterName, err) d._resetSentinel() } else { addr := net.JoinHostPort(addr[0], addr[1]) internal.Logf("sentinel: %q addr is %s", d.masterName, addr) return addr, nil } } for i, sentinelAddr := range d.sentinelAddrs { sentinel := newSentinel(&Options{ Addr: sentinelAddr, DialTimeout: d.opt.DialTimeout, ReadTimeout: d.opt.ReadTimeout, WriteTimeout: d.opt.WriteTimeout, PoolSize: d.opt.PoolSize, PoolTimeout: d.opt.PoolTimeout, IdleTimeout: d.opt.IdleTimeout, }) masterAddr, err := sentinel.GetMasterAddrByName(d.masterName).Result() if err != nil { internal.Logf("sentinel: GetMasterAddrByName %q failed: %s", d.masterName, err) sentinel.Close() continue } // Push working sentinel to the top. d.sentinelAddrs[0], d.sentinelAddrs[i] = d.sentinelAddrs[i], d.sentinelAddrs[0] d.setSentinel(sentinel) addr := net.JoinHostPort(masterAddr[0], masterAddr[1]) internal.Logf("sentinel: %q addr is %s", d.masterName, addr) return addr, nil } return "", errors.New("redis: all sentinels are unreachable") } func (d *sentinelFailover) setSentinel(sentinel *sentinelClient) { d.discoverSentinels(sentinel) d.sentinel = sentinel go d.listen(sentinel) } func (d *sentinelFailover) resetSentinel() error { d.mu.Lock() err := d._resetSentinel() d.mu.Unlock() return err } func (d *sentinelFailover) _resetSentinel() error { var err error if d.sentinel != nil { err = d.sentinel.Close() d.sentinel = nil } return err } func (d *sentinelFailover) discoverSentinels(sentinel *sentinelClient) { sentinels, err := sentinel.Sentinels(d.masterName).Result() if err != nil { internal.Logf("sentinel: Sentinels %q failed: %s", d.masterName, err) return } for _, sentinel := range sentinels { vals := sentinel.([]interface{}) for i := 0; i < len(vals); i += 2 { key := vals[i].(string) if key == "name" { sentinelAddr := vals[i+1].(string) if !contains(d.sentinelAddrs, sentinelAddr) { internal.Logf( "sentinel: discovered new %q sentinel: %s", d.masterName, sentinelAddr, ) d.sentinelAddrs = append(d.sentinelAddrs, sentinelAddr) } } } } } // closeOldConns closes connections to the old master after failover switch. func (d *sentinelFailover) closeOldConns(newMaster string) { // Good connections that should be put back to the pool. They // can't be put immediately, because pool.First will return them // again on next iteration. cnsToPut := make([]*pool.Conn, 0) for { cn := d.pool.PopFree() if cn == nil { break } if cn.RemoteAddr().String() != newMaster { err := fmt.Errorf( "sentinel: closing connection to the old master %s", cn.RemoteAddr(), ) internal.Logf(err.Error()) d.pool.Remove(cn, err) } else { cnsToPut = append(cnsToPut, cn) } } for _, cn := range cnsToPut { d.pool.Put(cn) } } func (d *sentinelFailover) listen(sentinel *sentinelClient) { var pubsub *PubSub for { if pubsub == nil { pubsub = sentinel.PubSub() if err := pubsub.Subscribe("+switch-master"); err != nil { internal.Logf("sentinel: Subscribe failed: %s", err) d.resetSentinel() return } } msg, err := pubsub.ReceiveMessage() if err != nil { internal.Logf("sentinel: ReceiveMessage failed: %s", err) pubsub.Close() d.resetSentinel() return } switch msg.Channel { case "+switch-master": parts := strings.Split(msg.Payload, " ") if parts[0] != d.masterName { internal.Logf("sentinel: ignore new %s addr", parts[0]) continue } addr := net.JoinHostPort(parts[3], parts[4]) internal.Logf( "sentinel: new %q addr is %s", d.masterName, addr, ) d.closeOldConns(addr) } } } func contains(slice []string, str string) bool { for _, s := range slice { if s == str { return true } } return false } ================================================ FILE: vendor/gopkg.in/redis.v3/unsafe.go ================================================ // +build !appengine package redis import ( "reflect" "unsafe" ) func bytesToString(b []byte) string { bytesHeader := (*reflect.SliceHeader)(unsafe.Pointer(&b)) strHeader := reflect.StringHeader{bytesHeader.Data, bytesHeader.Len} return *(*string)(unsafe.Pointer(&strHeader)) } ================================================ FILE: vendor/gopkg.in/sourcemap.v1/LICENSE ================================================ Copyright (c) 2016 The github.com/go-sourcemap/sourcemap Contributors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: vendor/gopkg.in/sourcemap.v1/Makefile ================================================ all: go test ./... go test ./... -short -race go vet ================================================ FILE: vendor/gopkg.in/sourcemap.v1/README.md ================================================ # Source Maps consumer for Golang [![Build Status](https://travis-ci.org/go-sourcemap/sourcemap.svg?branch=v1)](https://travis-ci.org/go-sourcemap/sourcemap) ## Installation Install: go get gopkg.in/sourcemap.v1 ## Quickstart ```go func ExampleParse() { mapURL := "http://code.jquery.com/jquery-2.0.3.min.map" resp, err := http.Get(mapURL) if err != nil { panic(err) } defer resp.Body.Close() b, err := ioutil.ReadAll(resp.Body) if err != nil { panic(err) } smap, err := sourcemap.Parse(mapURL, b) if err != nil { panic(err) } line, column := 5, 6789 file, fn, line, col, ok := smap.Source(line, column) fmt.Println(file, fn, line, col, ok) // Output: http://code.jquery.com/jquery-2.0.3.js apply 4360 27 true } ``` ================================================ FILE: vendor/gopkg.in/sourcemap.v1/base64vlq/base64_vlq.go ================================================ package base64vlq import ( "io" ) const encodeStd = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" const ( vlqBaseShift = 5 vlqBase = 1 << vlqBaseShift vlqBaseMask = vlqBase - 1 vlqSignBit = 1 vlqContinuationBit = vlqBase ) var decodeMap [256]byte func init() { for i := 0; i < len(encodeStd); i++ { decodeMap[encodeStd[i]] = byte(i) } } func toVLQSigned(n int) int { if n < 0 { return -n<<1 + 1 } return n << 1 } func fromVLQSigned(n int) int { isNeg := n&vlqSignBit != 0 n >>= 1 if isNeg { return -n } return n } type Encoder struct { w io.ByteWriter } func NewEncoder(w io.ByteWriter) *Encoder { return &Encoder{ w: w, } } func (enc Encoder) Encode(n int) error { n = toVLQSigned(n) for digit := vlqContinuationBit; digit&vlqContinuationBit != 0; { digit = n & vlqBaseMask n >>= vlqBaseShift if n > 0 { digit |= vlqContinuationBit } err := enc.w.WriteByte(encodeStd[digit]) if err != nil { return err } } return nil } type Decoder struct { r io.ByteReader } func NewDecoder(r io.ByteReader) *Decoder { return &Decoder{ r: r, } } func (dec Decoder) Decode() (n int, err error) { shift := uint(0) for continuation := true; continuation; { c, err := dec.r.ReadByte() if err != nil { return 0, err } c = decodeMap[c] continuation = c&vlqContinuationBit != 0 n += int(c&vlqBaseMask) << shift shift += vlqBaseShift } return fromVLQSigned(n), nil } ================================================ FILE: vendor/gopkg.in/sourcemap.v1/consumer.go ================================================ package sourcemap import ( "encoding/json" "fmt" "net/url" "path" "sort" "strconv" ) type Consumer struct { sourceRootURL *url.URL smap *sourceMap mappings []mapping } func Parse(mapURL string, b []byte) (*Consumer, error) { smap := new(sourceMap) err := json.Unmarshal(b, smap) if err != nil { return nil, err } if smap.Version != 3 { return nil, fmt.Errorf( "sourcemap: got version=%d, but only 3rd version is supported", smap.Version, ) } var sourceRootURL *url.URL if smap.SourceRoot != "" { u, err := url.Parse(smap.SourceRoot) if err != nil { return nil, err } if u.IsAbs() { sourceRootURL = u } } else if mapURL != "" { u, err := url.Parse(mapURL) if err != nil { return nil, err } if u.IsAbs() { u.Path = path.Dir(u.Path) sourceRootURL = u } } mappings, err := parseMappings(smap.Mappings) if err != nil { return nil, err } // Free memory. smap.Mappings = "" return &Consumer{ sourceRootURL: sourceRootURL, smap: smap, mappings: mappings, }, nil } func (c *Consumer) File() string { return c.smap.File } func (c *Consumer) Source(genLine, genCol int) (source, name string, line, col int, ok bool) { i := sort.Search(len(c.mappings), func(i int) bool { m := &c.mappings[i] if m.genLine == genLine { return m.genCol >= genCol } return m.genLine >= genLine }) // Mapping not found. if i == len(c.mappings) { return } match := &c.mappings[i] // Fuzzy match. if match.genLine > genLine || match.genCol > genCol { if i == 0 { return } match = &c.mappings[i-1] } if match.sourcesInd >= 0 { source = c.absSource(c.smap.Sources[match.sourcesInd]) } if match.namesInd >= 0 { v := c.smap.Names[match.namesInd] switch v := v.(type) { case string: name = v case float64: name = strconv.FormatFloat(v, 'f', -1, 64) default: name = fmt.Sprint(v) } } line = match.sourceLine col = match.sourceCol ok = true return } func (c *Consumer) absSource(source string) string { if path.IsAbs(source) { return source } if u, err := url.Parse(source); err == nil && u.IsAbs() { return source } if c.sourceRootURL != nil { u := *c.sourceRootURL u.Path = path.Join(c.sourceRootURL.Path, source) return u.String() } if c.smap.SourceRoot != "" { return path.Join(c.smap.SourceRoot, source) } return source } ================================================ FILE: vendor/gopkg.in/sourcemap.v1/sourcemap.go ================================================ package sourcemap // import "gopkg.in/sourcemap.v1" import ( "io" "strings" "gopkg.in/sourcemap.v1/base64vlq" ) type fn func(m *mappings) (fn, error) type sourceMap struct { Version int `json:"version"` File string `json:"file"` SourceRoot string `json:"sourceRoot"` Sources []string `json:"sources"` Names []interface{} `json:"names"` Mappings string `json:"mappings"` } type mapping struct { genLine int genCol int sourcesInd int sourceLine int sourceCol int namesInd int } type mappings struct { rd *strings.Reader dec *base64vlq.Decoder hasName bool value mapping values []mapping } func parseMappings(s string) ([]mapping, error) { rd := strings.NewReader(s) m := &mappings{ rd: rd, dec: base64vlq.NewDecoder(rd), } m.value.genLine = 1 m.value.sourceLine = 1 err := m.parse() if err != nil { return nil, err } return m.values, nil } func (m *mappings) parse() error { next := parseGenCol for { c, err := m.rd.ReadByte() if err == io.EOF { m.pushValue() return nil } if err != nil { return err } switch c { case ',': m.pushValue() next = parseGenCol case ';': m.pushValue() m.value.genLine++ m.value.genCol = 0 next = parseGenCol default: err := m.rd.UnreadByte() if err != nil { return err } next, err = next(m) if err != nil { return err } } } } func parseGenCol(m *mappings) (fn, error) { n, err := m.dec.Decode() if err != nil { return nil, err } m.value.genCol += n return parseSourcesInd, nil } func parseSourcesInd(m *mappings) (fn, error) { n, err := m.dec.Decode() if err != nil { return nil, err } m.value.sourcesInd += n return parseSourceLine, nil } func parseSourceLine(m *mappings) (fn, error) { n, err := m.dec.Decode() if err != nil { return nil, err } m.value.sourceLine += n return parseSourceCol, nil } func parseSourceCol(m *mappings) (fn, error) { n, err := m.dec.Decode() if err != nil { return nil, err } m.value.sourceCol += n return parseNamesInd, nil } func parseNamesInd(m *mappings) (fn, error) { n, err := m.dec.Decode() if err != nil { return nil, err } m.hasName = true m.value.namesInd += n return parseGenCol, nil } func (m *mappings) pushValue() { if m.value.sourceLine == 1 && m.value.sourceCol == 0 { return } if m.hasName { m.values = append(m.values, m.value) m.hasName = false } else { m.values = append(m.values, mapping{ genLine: m.value.genLine, genCol: m.value.genCol, sourcesInd: m.value.sourcesInd, sourceLine: m.value.sourceLine, sourceCol: m.value.sourceCol, namesInd: -1, }) } } ================================================ FILE: vendor/gopkg.in/urfave/cli.v1/CHANGELOG.md ================================================ # Change Log **ATTN**: This project uses [semantic versioning](http://semver.org/). ## [Unreleased] ## 1.20.0 - 2017-08-10 ### Fixed * `HandleExitCoder` is now correctly iterates over all errors in a `MultiError`. The exit code is the exit code of the last error or `1` if there are no `ExitCoder`s in the `MultiError`. * Fixed YAML file loading on Windows (previously would fail validate the file path) * Subcommand `Usage`, `Description`, `ArgsUsage`, `OnUsageError` correctly propogated * `ErrWriter` is now passed downwards through command structure to avoid the need to redefine it * Pass `Command` context into `OnUsageError` rather than parent context so that all fields are avaiable * Errors occuring in `Before` funcs are no longer double printed * Use `UsageText` in the help templates for commands and subcommands if defined; otherwise build the usage as before (was previously ignoring this field) * `IsSet` and `GlobalIsSet` now correctly return whether a flag is set if a program calls `Set` or `GlobalSet` directly after flag parsing (would previously only return `true` if the flag was set during parsing) ### Changed * No longer exit the program on command/subcommand error if the error raised is not an `OsExiter`. This exiting behavior was introduced in 1.19.0, but was determined to be a regression in functionality. See [the PR](https://github.com/urfave/cli/pull/595) for discussion. ### Added * `CommandsByName` type was added to make it easy to sort `Command`s by name, alphabetically * `altsrc` now handles loading of string and int arrays from TOML * Support for definition of custom help templates for `App` via `CustomAppHelpTemplate` * Support for arbitrary key/value fields on `App` to be used with `CustomAppHelpTemplate` via `ExtraInfo` * `HelpFlag`, `VersionFlag`, and `BashCompletionFlag` changed to explictly be `cli.Flag`s allowing for the use of custom flags satisfying the `cli.Flag` interface to be used. ## [1.19.1] - 2016-11-21 ### Fixed - Fixes regression introduced in 1.19.0 where using an `ActionFunc` as the `Action` for a command would cause it to error rather than calling the function. Should not have a affected declarative cases using `func(c *cli.Context) err)`. - Shell completion now handles the case where the user specifies `--generate-bash-completion` immediately after a flag that takes an argument. Previously it call the application with `--generate-bash-completion` as the flag value. ## [1.19.0] - 2016-11-19 ### Added - `FlagsByName` was added to make it easy to sort flags (e.g. `sort.Sort(cli.FlagsByName(app.Flags))`) - A `Description` field was added to `App` for a more detailed description of the application (similar to the existing `Description` field on `Command`) - Flag type code generation via `go generate` - Write to stderr and exit 1 if action returns non-nil error - Added support for TOML to the `altsrc` loader - `SkipArgReorder` was added to allow users to skip the argument reordering. This is useful if you want to consider all "flags" after an argument as arguments rather than flags (the default behavior of the stdlib `flag` library). This is backported functionality from the [removal of the flag reordering](https://github.com/urfave/cli/pull/398) in the unreleased version 2 - For formatted errors (those implementing `ErrorFormatter`), the errors will be formatted during output. Compatible with `pkg/errors`. ### Changed - Raise minimum tested/supported Go version to 1.2+ ### Fixed - Consider empty environment variables as set (previously environment variables with the equivalent of `""` would be skipped rather than their value used). - Return an error if the value in a given environment variable cannot be parsed as the flag type. Previously these errors were silently swallowed. - Print full error when an invalid flag is specified (which includes the invalid flag) - `App.Writer` defaults to `stdout` when `nil` - If no action is specified on a command or app, the help is now printed instead of `panic`ing - `App.Metadata` is initialized automatically now (previously was `nil` unless initialized) - Correctly show help message if `-h` is provided to a subcommand - `context.(Global)IsSet` now respects environment variables. Previously it would return `false` if a flag was specified in the environment rather than as an argument - Removed deprecation warnings to STDERR to avoid them leaking to the end-user - `altsrc`s import paths were updated to use `gopkg.in/urfave/cli.v1`. This fixes issues that occurred when `gopkg.in/urfave/cli.v1` was imported as well as `altsrc` where Go would complain that the types didn't match ## [1.18.1] - 2016-08-28 ### Fixed - Removed deprecation warnings to STDERR to avoid them leaking to the end-user (backported) ## [1.18.0] - 2016-06-27 ### Added - `./runtests` test runner with coverage tracking by default - testing on OS X - testing on Windows - `UintFlag`, `Uint64Flag`, and `Int64Flag` types and supporting code ### Changed - Use spaces for alignment in help/usage output instead of tabs, making the output alignment consistent regardless of tab width ### Fixed - Printing of command aliases in help text - Printing of visible flags for both struct and struct pointer flags - Display the `help` subcommand when using `CommandCategories` - No longer swallows `panic`s that occur within the `Action`s themselves when detecting the signature of the `Action` field ## [1.17.1] - 2016-08-28 ### Fixed - Removed deprecation warnings to STDERR to avoid them leaking to the end-user ## [1.17.0] - 2016-05-09 ### Added - Pluggable flag-level help text rendering via `cli.DefaultFlagStringFunc` - `context.GlobalBoolT` was added as an analogue to `context.GlobalBool` - Support for hiding commands by setting `Hidden: true` -- this will hide the commands in help output ### Changed - `Float64Flag`, `IntFlag`, and `DurationFlag` default values are no longer quoted in help text output. - All flag types now include `(default: {value})` strings following usage when a default value can be (reasonably) detected. - `IntSliceFlag` and `StringSliceFlag` usage strings are now more consistent with non-slice flag types - Apps now exit with a code of 3 if an unknown subcommand is specified (previously they printed "No help topic for...", but still exited 0. This makes it easier to script around apps built using `cli` since they can trust that a 0 exit code indicated a successful execution. - cleanups based on [Go Report Card feedback](https://goreportcard.com/report/github.com/urfave/cli) ## [1.16.1] - 2016-08-28 ### Fixed - Removed deprecation warnings to STDERR to avoid them leaking to the end-user ## [1.16.0] - 2016-05-02 ### Added - `Hidden` field on all flag struct types to omit from generated help text ### Changed - `BashCompletionFlag` (`--enable-bash-completion`) is now omitted from generated help text via the `Hidden` field ### Fixed - handling of error values in `HandleAction` and `HandleExitCoder` ## [1.15.0] - 2016-04-30 ### Added - This file! - Support for placeholders in flag usage strings - `App.Metadata` map for arbitrary data/state management - `Set` and `GlobalSet` methods on `*cli.Context` for altering values after parsing. - Support for nested lookup of dot-delimited keys in structures loaded from YAML. ### Changed - The `App.Action` and `Command.Action` now prefer a return signature of `func(*cli.Context) error`, as defined by `cli.ActionFunc`. If a non-nil `error` is returned, there may be two outcomes: - If the error fulfills `cli.ExitCoder`, then `os.Exit` will be called automatically - Else the error is bubbled up and returned from `App.Run` - Specifying an `Action` with the legacy return signature of `func(*cli.Context)` will produce a deprecation message to stderr - Specifying an `Action` that is not a `func` type will produce a non-zero exit from `App.Run` - Specifying an `Action` func that has an invalid (input) signature will produce a non-zero exit from `App.Run` ### Deprecated - <a name="deprecated-cli-app-runandexitonerror"></a> `cli.App.RunAndExitOnError`, which should now be done by returning an error that fulfills `cli.ExitCoder` to `cli.App.Run`. - <a name="deprecated-cli-app-action-signature"></a> the legacy signature for `cli.App.Action` of `func(*cli.Context)`, which should now have a return signature of `func(*cli.Context) error`, as defined by `cli.ActionFunc`. ### Fixed - Added missing `*cli.Context.GlobalFloat64` method ## [1.14.0] - 2016-04-03 (backfilled 2016-04-25) ### Added - Codebeat badge - Support for categorization via `CategorizedHelp` and `Categories` on app. ### Changed - Use `filepath.Base` instead of `path.Base` in `Name` and `HelpName`. ### Fixed - Ensure version is not shown in help text when `HideVersion` set. ## [1.13.0] - 2016-03-06 (backfilled 2016-04-25) ### Added - YAML file input support. - `NArg` method on context. ## [1.12.0] - 2016-02-17 (backfilled 2016-04-25) ### Added - Custom usage error handling. - Custom text support in `USAGE` section of help output. - Improved help messages for empty strings. - AppVeyor CI configuration. ### Changed - Removed `panic` from default help printer func. - De-duping and optimizations. ### Fixed - Correctly handle `Before`/`After` at command level when no subcommands. - Case of literal `-` argument causing flag reordering. - Environment variable hints on Windows. - Docs updates. ## [1.11.1] - 2015-12-21 (backfilled 2016-04-25) ### Changed - Use `path.Base` in `Name` and `HelpName` - Export `GetName` on flag types. ### Fixed - Flag parsing when skipping is enabled. - Test output cleanup. - Move completion check to account for empty input case. ## [1.11.0] - 2015-11-15 (backfilled 2016-04-25) ### Added - Destination scan support for flags. - Testing against `tip` in Travis CI config. ### Changed - Go version in Travis CI config. ### Fixed - Removed redundant tests. - Use correct example naming in tests. ## [1.10.2] - 2015-10-29 (backfilled 2016-04-25) ### Fixed - Remove unused var in bash completion. ## [1.10.1] - 2015-10-21 (backfilled 2016-04-25) ### Added - Coverage and reference logos in README. ### Fixed - Use specified values in help and version parsing. - Only display app version and help message once. ## [1.10.0] - 2015-10-06 (backfilled 2016-04-25) ### Added - More tests for existing functionality. - `ArgsUsage` at app and command level for help text flexibility. ### Fixed - Honor `HideHelp` and `HideVersion` in `App.Run`. - Remove juvenile word from README. ## [1.9.0] - 2015-09-08 (backfilled 2016-04-25) ### Added - `FullName` on command with accompanying help output update. - Set default `$PROG` in bash completion. ### Changed - Docs formatting. ### Fixed - Removed self-referential imports in tests. ## [1.8.0] - 2015-06-30 (backfilled 2016-04-25) ### Added - Support for `Copyright` at app level. - `Parent` func at context level to walk up context lineage. ### Fixed - Global flag processing at top level. ## [1.7.1] - 2015-06-11 (backfilled 2016-04-25) ### Added - Aggregate errors from `Before`/`After` funcs. - Doc comments on flag structs. - Include non-global flags when checking version and help. - Travis CI config updates. ### Fixed - Ensure slice type flags have non-nil values. - Collect global flags from the full command hierarchy. - Docs prose. ## [1.7.0] - 2015-05-03 (backfilled 2016-04-25) ### Changed - `HelpPrinter` signature includes output writer. ### Fixed - Specify go 1.1+ in docs. - Set `Writer` when running command as app. ## [1.6.0] - 2015-03-23 (backfilled 2016-04-25) ### Added - Multiple author support. - `NumFlags` at context level. - `Aliases` at command level. ### Deprecated - `ShortName` at command level. ### Fixed - Subcommand help output. - Backward compatible support for deprecated `Author` and `Email` fields. - Docs regarding `Names`/`Aliases`. ## [1.5.0] - 2015-02-20 (backfilled 2016-04-25) ### Added - `After` hook func support at app and command level. ### Fixed - Use parsed context when running command as subcommand. - Docs prose. ## [1.4.1] - 2015-01-09 (backfilled 2016-04-25) ### Added - Support for hiding `-h / --help` flags, but not `help` subcommand. - Stop flag parsing after `--`. ### Fixed - Help text for generic flags to specify single value. - Use double quotes in output for defaults. - Use `ParseInt` instead of `ParseUint` for int environment var values. - Use `0` as base when parsing int environment var values. ## [1.4.0] - 2014-12-12 (backfilled 2016-04-25) ### Added - Support for environment variable lookup "cascade". - Support for `Stdout` on app for output redirection. ### Fixed - Print command help instead of app help in `ShowCommandHelp`. ## [1.3.1] - 2014-11-13 (backfilled 2016-04-25) ### Added - Docs and example code updates. ### Changed - Default `-v / --version` flag made optional. ## [1.3.0] - 2014-08-10 (backfilled 2016-04-25) ### Added - `FlagNames` at context level. - Exposed `VersionPrinter` var for more control over version output. - Zsh completion hook. - `AUTHOR` section in default app help template. - Contribution guidelines. - `DurationFlag` type. ## [1.2.0] - 2014-08-02 ### Added - Support for environment variable defaults on flags plus tests. ## [1.1.0] - 2014-07-15 ### Added - Bash completion. - Optional hiding of built-in help command. - Optional skipping of flag parsing at command level. - `Author`, `Email`, and `Compiled` metadata on app. - `Before` hook func support at app and command level. - `CommandNotFound` func support at app level. - Command reference available on context. - `GenericFlag` type. - `Float64Flag` type. - `BoolTFlag` type. - `IsSet` flag helper on context. - More flag lookup funcs at context level. - More tests & docs. ### Changed - Help template updates to account for presence/absence of flags. - Separated subcommand help template. - Exposed `HelpPrinter` var for more control over help output. ## [1.0.0] - 2013-11-01 ### Added - `help` flag in default app flag set and each command flag set. - Custom handling of argument parsing errors. - Command lookup by name at app level. - `StringSliceFlag` type and supporting `StringSlice` type. - `IntSliceFlag` type and supporting `IntSlice` type. - Slice type flag lookups by name at context level. - Export of app and command help functions. - More tests & docs. ## 0.1.0 - 2013-07-22 ### Added - Initial implementation. [Unreleased]: https://github.com/urfave/cli/compare/v1.18.0...HEAD [1.18.0]: https://github.com/urfave/cli/compare/v1.17.0...v1.18.0 [1.17.0]: https://github.com/urfave/cli/compare/v1.16.0...v1.17.0 [1.16.0]: https://github.com/urfave/cli/compare/v1.15.0...v1.16.0 [1.15.0]: https://github.com/urfave/cli/compare/v1.14.0...v1.15.0 [1.14.0]: https://github.com/urfave/cli/compare/v1.13.0...v1.14.0 [1.13.0]: https://github.com/urfave/cli/compare/v1.12.0...v1.13.0 [1.12.0]: https://github.com/urfave/cli/compare/v1.11.1...v1.12.0 [1.11.1]: https://github.com/urfave/cli/compare/v1.11.0...v1.11.1 [1.11.0]: https://github.com/urfave/cli/compare/v1.10.2...v1.11.0 [1.10.2]: https://github.com/urfave/cli/compare/v1.10.1...v1.10.2 [1.10.1]: https://github.com/urfave/cli/compare/v1.10.0...v1.10.1 [1.10.0]: https://github.com/urfave/cli/compare/v1.9.0...v1.10.0 [1.9.0]: https://github.com/urfave/cli/compare/v1.8.0...v1.9.0 [1.8.0]: https://github.com/urfave/cli/compare/v1.7.1...v1.8.0 [1.7.1]: https://github.com/urfave/cli/compare/v1.7.0...v1.7.1 [1.7.0]: https://github.com/urfave/cli/compare/v1.6.0...v1.7.0 [1.6.0]: https://github.com/urfave/cli/compare/v1.5.0...v1.6.0 [1.5.0]: https://github.com/urfave/cli/compare/v1.4.1...v1.5.0 [1.4.1]: https://github.com/urfave/cli/compare/v1.4.0...v1.4.1 [1.4.0]: https://github.com/urfave/cli/compare/v1.3.1...v1.4.0 [1.3.1]: https://github.com/urfave/cli/compare/v1.3.0...v1.3.1 [1.3.0]: https://github.com/urfave/cli/compare/v1.2.0...v1.3.0 [1.2.0]: https://github.com/urfave/cli/compare/v1.1.0...v1.2.0 [1.1.0]: https://github.com/urfave/cli/compare/v1.0.0...v1.1.0 [1.0.0]: https://github.com/urfave/cli/compare/v0.1.0...v1.0.0 ================================================ FILE: vendor/gopkg.in/urfave/cli.v1/LICENSE ================================================ MIT License Copyright (c) 2016 Jeremy Saenz & Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: vendor/gopkg.in/urfave/cli.v1/README.md ================================================ cli === [![Build Status](https://travis-ci.org/urfave/cli.svg?branch=master)](https://travis-ci.org/urfave/cli) [![Windows Build Status](https://ci.appveyor.com/api/projects/status/rtgk5xufi932pb2v?svg=true)](https://ci.appveyor.com/project/urfave/cli) [![GoDoc](https://godoc.org/github.com/urfave/cli?status.svg)](https://godoc.org/github.com/urfave/cli) [![codebeat](https://codebeat.co/badges/0a8f30aa-f975-404b-b878-5fab3ae1cc5f)](https://codebeat.co/projects/github-com-urfave-cli) [![Go Report Card](https://goreportcard.com/badge/urfave/cli)](https://goreportcard.com/report/urfave/cli) [![top level coverage](https://gocover.io/_badge/github.com/urfave/cli?0 "top level coverage")](http://gocover.io/github.com/urfave/cli) / [![altsrc coverage](https://gocover.io/_badge/github.com/urfave/cli/altsrc?0 "altsrc coverage")](http://gocover.io/github.com/urfave/cli/altsrc) **Notice:** This is the library formerly known as `github.com/codegangsta/cli` -- Github will automatically redirect requests to this repository, but we recommend updating your references for clarity. cli is a simple, fast, and fun package for building command line apps in Go. The goal is to enable developers to write fast and distributable command line applications in an expressive way. <!-- toc --> - [Overview](#overview) - [Installation](#installation) * [Supported platforms](#supported-platforms) * [Using the `v2` branch](#using-the-v2-branch) * [Pinning to the `v1` releases](#pinning-to-the-v1-releases) - [Getting Started](#getting-started) - [Examples](#examples) * [Arguments](#arguments) * [Flags](#flags) + [Placeholder Values](#placeholder-values) + [Alternate Names](#alternate-names) + [Ordering](#ordering) + [Values from the Environment](#values-from-the-environment) + [Values from alternate input sources (YAML, TOML, and others)](#values-from-alternate-input-sources-yaml-toml-and-others) * [Subcommands](#subcommands) * [Subcommands categories](#subcommands-categories) * [Exit code](#exit-code) * [Bash Completion](#bash-completion) + [Enabling](#enabling) + [Distribution](#distribution) + [Customization](#customization) * [Generated Help Text](#generated-help-text) + [Customization](#customization-1) * [Version Flag](#version-flag) + [Customization](#customization-2) + [Full API Example](#full-api-example) - [Contribution Guidelines](#contribution-guidelines) <!-- tocstop --> ## Overview Command line apps are usually so tiny that there is absolutely no reason why your code should *not* be self-documenting. Things like generating help text and parsing command flags/options should not hinder productivity when writing a command line app. **This is where cli comes into play.** cli makes command line programming fun, organized, and expressive! ## Installation Make sure you have a working Go environment. Go version 1.2+ is supported. [See the install instructions for Go](http://golang.org/doc/install.html). To install cli, simply run: ``` $ go get github.com/urfave/cli ``` Make sure your `PATH` includes the `$GOPATH/bin` directory so your commands can be easily used: ``` export PATH=$PATH:$GOPATH/bin ``` ### Supported platforms cli is tested against multiple versions of Go on Linux, and against the latest released version of Go on OS X and Windows. For full details, see [`./.travis.yml`](./.travis.yml) and [`./appveyor.yml`](./appveyor.yml). ### Using the `v2` branch **Warning**: The `v2` branch is currently unreleased and considered unstable. There is currently a long-lived branch named `v2` that is intended to land as the new `master` branch once development there has settled down. The current `master` branch (mirrored as `v1`) is being manually merged into `v2` on an irregular human-based schedule, but generally if one wants to "upgrade" to `v2` *now* and accept the volatility (read: "awesomeness") that comes along with that, please use whatever version pinning of your preference, such as via `gopkg.in`: ``` $ go get gopkg.in/urfave/cli.v2 ``` ``` go ... import ( "gopkg.in/urfave/cli.v2" // imports as package "cli" ) ... ``` ### Pinning to the `v1` releases Similarly to the section above describing use of the `v2` branch, if one wants to avoid any unexpected compatibility pains once `v2` becomes `master`, then pinning to `v1` is an acceptable option, e.g.: ``` $ go get gopkg.in/urfave/cli.v1 ``` ``` go ... import ( "gopkg.in/urfave/cli.v1" // imports as package "cli" ) ... ``` This will pull the latest tagged `v1` release (e.g. `v1.18.1` at the time of writing). ## Getting Started One of the philosophies behind cli is that an API should be playful and full of discovery. So a cli app can be as little as one line of code in `main()`. <!-- { "args": ["--help"], "output": "A new cli application" } --> ``` go package main import ( "os" "github.com/urfave/cli" ) func main() { cli.NewApp().Run(os.Args) } ``` This app will run and show help text, but is not very useful. Let's give an action to execute and some help documentation: <!-- { "output": "boom! I say!" } --> ``` go package main import ( "fmt" "os" "github.com/urfave/cli" ) func main() { app := cli.NewApp() app.Name = "boom" app.Usage = "make an explosive entrance" app.Action = func(c *cli.Context) error { fmt.Println("boom! I say!") return nil } app.Run(os.Args) } ``` Running this already gives you a ton of functionality, plus support for things like subcommands and flags, which are covered below. ## Examples Being a programmer can be a lonely job. Thankfully by the power of automation that is not the case! Let's create a greeter app to fend off our demons of loneliness! Start by creating a directory named `greet`, and within it, add a file, `greet.go` with the following code in it: <!-- { "output": "Hello friend!" } --> ``` go package main import ( "fmt" "os" "github.com/urfave/cli" ) func main() { app := cli.NewApp() app.Name = "greet" app.Usage = "fight the loneliness!" app.Action = func(c *cli.Context) error { fmt.Println("Hello friend!") return nil } app.Run(os.Args) } ``` Install our command to the `$GOPATH/bin` directory: ``` $ go install ``` Finally run our new command: ``` $ greet Hello friend! ``` cli also generates neat help text: ``` $ greet help NAME: greet - fight the loneliness! USAGE: greet [global options] command [command options] [arguments...] VERSION: 0.0.0 COMMANDS: help, h Shows a list of commands or help for one command GLOBAL OPTIONS --version Shows version information ``` ### Arguments You can lookup arguments by calling the `Args` function on `cli.Context`, e.g.: <!-- { "output": "Hello \"" } --> ``` go package main import ( "fmt" "os" "github.com/urfave/cli" ) func main() { app := cli.NewApp() app.Action = func(c *cli.Context) error { fmt.Printf("Hello %q", c.Args().Get(0)) return nil } app.Run(os.Args) } ``` ### Flags Setting and querying flags is simple. <!-- { "output": "Hello Nefertiti" } --> ``` go package main import ( "fmt" "os" "github.com/urfave/cli" ) func main() { app := cli.NewApp() app.Flags = []cli.Flag { cli.StringFlag{ Name: "lang", Value: "english", Usage: "language for the greeting", }, } app.Action = func(c *cli.Context) error { name := "Nefertiti" if c.NArg() > 0 { name = c.Args().Get(0) } if c.String("lang") == "spanish" { fmt.Println("Hola", name) } else { fmt.Println("Hello", name) } return nil } app.Run(os.Args) } ``` You can also set a destination variable for a flag, to which the content will be scanned. <!-- { "output": "Hello someone" } --> ``` go package main import ( "os" "fmt" "github.com/urfave/cli" ) func main() { var language string app := cli.NewApp() app.Flags = []cli.Flag { cli.StringFlag{ Name: "lang", Value: "english", Usage: "language for the greeting", Destination: &language, }, } app.Action = func(c *cli.Context) error { name := "someone" if c.NArg() > 0 { name = c.Args()[0] } if language == "spanish" { fmt.Println("Hola", name) } else { fmt.Println("Hello", name) } return nil } app.Run(os.Args) } ``` See full list of flags at http://godoc.org/github.com/urfave/cli #### Placeholder Values Sometimes it's useful to specify a flag's value within the usage string itself. Such placeholders are indicated with back quotes. For example this: <!-- { "args": ["--help"], "output": "--config FILE, -c FILE" } --> ```go package main import ( "os" "github.com/urfave/cli" ) func main() { app := cli.NewApp() app.Flags = []cli.Flag{ cli.StringFlag{ Name: "config, c", Usage: "Load configuration from `FILE`", }, } app.Run(os.Args) } ``` Will result in help output like: ``` --config FILE, -c FILE Load configuration from FILE ``` Note that only the first placeholder is used. Subsequent back-quoted words will be left as-is. #### Alternate Names You can set alternate (or short) names for flags by providing a comma-delimited list for the `Name`. e.g. <!-- { "args": ["--help"], "output": "--lang value, -l value.*language for the greeting.*default: \"english\"" } --> ``` go package main import ( "os" "github.com/urfave/cli" ) func main() { app := cli.NewApp() app.Flags = []cli.Flag { cli.StringFlag{ Name: "lang, l", Value: "english", Usage: "language for the greeting", }, } app.Run(os.Args) } ``` That flag can then be set with `--lang spanish` or `-l spanish`. Note that giving two different forms of the same flag in the same command invocation is an error. #### Ordering Flags for the application and commands are shown in the order they are defined. However, it's possible to sort them from outside this library by using `FlagsByName` or `CommandsByName` with `sort`. For example this: <!-- { "args": ["--help"], "output": "add a task to the list\n.*complete a task on the list\n.*\n\n.*\n.*Load configuration from FILE\n.*Language for the greeting.*" } --> ``` go package main import ( "os" "sort" "github.com/urfave/cli" ) func main() { app := cli.NewApp() app.Flags = []cli.Flag { cli.StringFlag{ Name: "lang, l", Value: "english", Usage: "Language for the greeting", }, cli.StringFlag{ Name: "config, c", Usage: "Load configuration from `FILE`", }, } app.Commands = []cli.Command{ { Name: "complete", Aliases: []string{"c"}, Usage: "complete a task on the list", Action: func(c *cli.Context) error { return nil }, }, { Name: "add", Aliases: []string{"a"}, Usage: "add a task to the list", Action: func(c *cli.Context) error { return nil }, }, } sort.Sort(cli.FlagsByName(app.Flags)) sort.Sort(cli.CommandsByName(app.Commands)) app.Run(os.Args) } ``` Will result in help output like: ``` --config FILE, -c FILE Load configuration from FILE --lang value, -l value Language for the greeting (default: "english") ``` #### Values from the Environment You can also have the default value set from the environment via `EnvVar`. e.g. <!-- { "args": ["--help"], "output": "language for the greeting.*APP_LANG" } --> ``` go package main import ( "os" "github.com/urfave/cli" ) func main() { app := cli.NewApp() app.Flags = []cli.Flag { cli.StringFlag{ Name: "lang, l", Value: "english", Usage: "language for the greeting", EnvVar: "APP_LANG", }, } app.Run(os.Args) } ``` The `EnvVar` may also be given as a comma-delimited "cascade", where the first environment variable that resolves is used as the default. <!-- { "args": ["--help"], "output": "language for the greeting.*LEGACY_COMPAT_LANG.*APP_LANG.*LANG" } --> ``` go package main import ( "os" "github.com/urfave/cli" ) func main() { app := cli.NewApp() app.Flags = []cli.Flag { cli.StringFlag{ Name: "lang, l", Value: "english", Usage: "language for the greeting", EnvVar: "LEGACY_COMPAT_LANG,APP_LANG,LANG", }, } app.Run(os.Args) } ``` #### Values from alternate input sources (YAML, TOML, and others) There is a separate package altsrc that adds support for getting flag values from other file input sources. Currently supported input source formats: * YAML * TOML In order to get values for a flag from an alternate input source the following code would be added to wrap an existing cli.Flag like below: ``` go altsrc.NewIntFlag(cli.IntFlag{Name: "test"}) ``` Initialization must also occur for these flags. Below is an example initializing getting data from a yaml file below. ``` go command.Before = altsrc.InitInputSourceWithContext(command.Flags, NewYamlSourceFromFlagFunc("load")) ``` The code above will use the "load" string as a flag name to get the file name of a yaml file from the cli.Context. It will then use that file name to initialize the yaml input source for any flags that are defined on that command. As a note the "load" flag used would also have to be defined on the command flags in order for this code snipped to work. Currently only the aboved specified formats are supported but developers can add support for other input sources by implementing the altsrc.InputSourceContext for their given sources. Here is a more complete sample of a command using YAML support: <!-- { "args": ["test-cmd", "--help"], "output": "--test value.*default: 0" } --> ``` go package notmain import ( "fmt" "os" "github.com/urfave/cli" "github.com/urfave/cli/altsrc" ) func main() { app := cli.NewApp() flags := []cli.Flag{ altsrc.NewIntFlag(cli.IntFlag{Name: "test"}), cli.StringFlag{Name: "load"}, } app.Action = func(c *cli.Context) error { fmt.Println("yaml ist rad") return nil } app.Before = altsrc.InitInputSourceWithContext(flags, altsrc.NewYamlSourceFromFlagFunc("load")) app.Flags = flags app.Run(os.Args) } ``` ### Subcommands Subcommands can be defined for a more git-like command line app. <!-- { "args": ["template", "add"], "output": "new task template: .+" } --> ```go package main import ( "fmt" "os" "github.com/urfave/cli" ) func main() { app := cli.NewApp() app.Commands = []cli.Command{ { Name: "add", Aliases: []string{"a"}, Usage: "add a task to the list", Action: func(c *cli.Context) error { fmt.Println("added task: ", c.Args().First()) return nil }, }, { Name: "complete", Aliases: []string{"c"}, Usage: "complete a task on the list", Action: func(c *cli.Context) error { fmt.Println("completed task: ", c.Args().First()) return nil }, }, { Name: "template", Aliases: []string{"t"}, Usage: "options for task templates", Subcommands: []cli.Command{ { Name: "add", Usage: "add a new template", Action: func(c *cli.Context) error { fmt.Println("new task template: ", c.Args().First()) return nil }, }, { Name: "remove", Usage: "remove an existing template", Action: func(c *cli.Context) error { fmt.Println("removed task template: ", c.Args().First()) return nil }, }, }, }, } app.Run(os.Args) } ``` ### Subcommands categories For additional organization in apps that have many subcommands, you can associate a category for each command to group them together in the help output. E.g. ```go package main import ( "os" "github.com/urfave/cli" ) func main() { app := cli.NewApp() app.Commands = []cli.Command{ { Name: "noop", }, { Name: "add", Category: "template", }, { Name: "remove", Category: "template", }, } app.Run(os.Args) } ``` Will include: ``` COMMANDS: noop Template actions: add remove ``` ### Exit code Calling `App.Run` will not automatically call `os.Exit`, which means that by default the exit code will "fall through" to being `0`. An explicit exit code may be set by returning a non-nil error that fulfills `cli.ExitCoder`, *or* a `cli.MultiError` that includes an error that fulfills `cli.ExitCoder`, e.g.: ``` go package main import ( "os" "github.com/urfave/cli" ) func main() { app := cli.NewApp() app.Flags = []cli.Flag{ cli.BoolTFlag{ Name: "ginger-crouton", Usage: "is it in the soup?", }, } app.Action = func(ctx *cli.Context) error { if !ctx.Bool("ginger-crouton") { return cli.NewExitError("it is not in the soup", 86) } return nil } app.Run(os.Args) } ``` ### Bash Completion You can enable completion commands by setting the `EnableBashCompletion` flag on the `App` object. By default, this setting will only auto-complete to show an app's subcommands, but you can write your own completion methods for the App or its subcommands. <!-- { "args": ["complete", "--generate-bash-completion"], "output": "laundry" } --> ``` go package main import ( "fmt" "os" "github.com/urfave/cli" ) func main() { tasks := []string{"cook", "clean", "laundry", "eat", "sleep", "code"} app := cli.NewApp() app.EnableBashCompletion = true app.Commands = []cli.Command{ { Name: "complete", Aliases: []string{"c"}, Usage: "complete a task on the list", Action: func(c *cli.Context) error { fmt.Println("completed task: ", c.Args().First()) return nil }, BashComplete: func(c *cli.Context) { // This will complete if no args are passed if c.NArg() > 0 { return } for _, t := range tasks { fmt.Println(t) } }, }, } app.Run(os.Args) } ``` #### Enabling Source the `autocomplete/bash_autocomplete` file in your `.bashrc` file while setting the `PROG` variable to the name of your program: `PROG=myprogram source /.../cli/autocomplete/bash_autocomplete` #### Distribution Copy `autocomplete/bash_autocomplete` into `/etc/bash_completion.d/` and rename it to the name of the program you wish to add autocomplete support for (or automatically install it there if you are distributing a package). Don't forget to source the file to make it active in the current shell. ``` sudo cp src/bash_autocomplete /etc/bash_completion.d/<myprogram> source /etc/bash_completion.d/<myprogram> ``` Alternatively, you can just document that users should source the generic `autocomplete/bash_autocomplete` in their bash configuration with `$PROG` set to the name of their program (as above). #### Customization The default bash completion flag (`--generate-bash-completion`) is defined as `cli.BashCompletionFlag`, and may be redefined if desired, e.g.: <!-- { "args": ["--compgen"], "output": "wat\nhelp\nh" } --> ``` go package main import ( "os" "github.com/urfave/cli" ) func main() { cli.BashCompletionFlag = cli.BoolFlag{ Name: "compgen", Hidden: true, } app := cli.NewApp() app.EnableBashCompletion = true app.Commands = []cli.Command{ { Name: "wat", }, } app.Run(os.Args) } ``` ### Generated Help Text The default help flag (`-h/--help`) is defined as `cli.HelpFlag` and is checked by the cli internals in order to print generated help text for the app, command, or subcommand, and break execution. #### Customization All of the help text generation may be customized, and at multiple levels. The templates are exposed as variables `AppHelpTemplate`, `CommandHelpTemplate`, and `SubcommandHelpTemplate` which may be reassigned or augmented, and full override is possible by assigning a compatible func to the `cli.HelpPrinter` variable, e.g.: <!-- { "output": "Ha HA. I pwnd the help!!1" } --> ``` go package main import ( "fmt" "io" "os" "github.com/urfave/cli" ) func main() { // EXAMPLE: Append to an existing template cli.AppHelpTemplate = fmt.Sprintf(`%s WEBSITE: http://awesometown.example.com SUPPORT: support@awesometown.example.com `, cli.AppHelpTemplate) // EXAMPLE: Override a template cli.AppHelpTemplate = `NAME: {{.Name}} - {{.Usage}} USAGE: {{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}} {{if len .Authors}} AUTHOR: {{range .Authors}}{{ . }}{{end}} {{end}}{{if .Commands}} COMMANDS: {{range .Commands}}{{if not .HideHelp}} {{join .Names ", "}}{{ "\t"}}{{.Usage}}{{ "\n" }}{{end}}{{end}}{{end}}{{if .VisibleFlags}} GLOBAL OPTIONS: {{range .VisibleFlags}}{{.}} {{end}}{{end}}{{if .Copyright }} COPYRIGHT: {{.Copyright}} {{end}}{{if .Version}} VERSION: {{.Version}} {{end}} ` // EXAMPLE: Replace the `HelpPrinter` func cli.HelpPrinter = func(w io.Writer, templ string, data interface{}) { fmt.Println("Ha HA. I pwnd the help!!1") } cli.NewApp().Run(os.Args) } ``` The default flag may be customized to something other than `-h/--help` by setting `cli.HelpFlag`, e.g.: <!-- { "args": ["--halp"], "output": "haaaaalp.*HALP" } --> ``` go package main import ( "os" "github.com/urfave/cli" ) func main() { cli.HelpFlag = cli.BoolFlag{ Name: "halp, haaaaalp", Usage: "HALP", EnvVar: "SHOW_HALP,HALPPLZ", } cli.NewApp().Run(os.Args) } ``` ### Version Flag The default version flag (`-v/--version`) is defined as `cli.VersionFlag`, which is checked by the cli internals in order to print the `App.Version` via `cli.VersionPrinter` and break execution. #### Customization The default flag may be customized to something other than `-v/--version` by setting `cli.VersionFlag`, e.g.: <!-- { "args": ["--print-version"], "output": "partay version 19\\.99\\.0" } --> ``` go package main import ( "os" "github.com/urfave/cli" ) func main() { cli.VersionFlag = cli.BoolFlag{ Name: "print-version, V", Usage: "print only the version", } app := cli.NewApp() app.Name = "partay" app.Version = "19.99.0" app.Run(os.Args) } ``` Alternatively, the version printer at `cli.VersionPrinter` may be overridden, e.g.: <!-- { "args": ["--version"], "output": "version=19\\.99\\.0 revision=fafafaf" } --> ``` go package main import ( "fmt" "os" "github.com/urfave/cli" ) var ( Revision = "fafafaf" ) func main() { cli.VersionPrinter = func(c *cli.Context) { fmt.Printf("version=%s revision=%s\n", c.App.Version, Revision) } app := cli.NewApp() app.Name = "partay" app.Version = "19.99.0" app.Run(os.Args) } ``` #### Full API Example **Notice**: This is a contrived (functioning) example meant strictly for API demonstration purposes. Use of one's imagination is encouraged. <!-- { "output": "made it!\nPhew!" } --> ``` go package main import ( "errors" "flag" "fmt" "io" "io/ioutil" "os" "time" "github.com/urfave/cli" ) func init() { cli.AppHelpTemplate += "\nCUSTOMIZED: you bet ur muffins\n" cli.CommandHelpTemplate += "\nYMMV\n" cli.SubcommandHelpTemplate += "\nor something\n" cli.HelpFlag = cli.BoolFlag{Name: "halp"} cli.BashCompletionFlag = cli.BoolFlag{Name: "compgen", Hidden: true} cli.VersionFlag = cli.BoolFlag{Name: "print-version, V"} cli.HelpPrinter = func(w io.Writer, templ string, data interface{}) { fmt.Fprintf(w, "best of luck to you\n") } cli.VersionPrinter = func(c *cli.Context) { fmt.Fprintf(c.App.Writer, "version=%s\n", c.App.Version) } cli.OsExiter = func(c int) { fmt.Fprintf(cli.ErrWriter, "refusing to exit %d\n", c) } cli.ErrWriter = ioutil.Discard cli.FlagStringer = func(fl cli.Flag) string { return fmt.Sprintf("\t\t%s", fl.GetName()) } } type hexWriter struct{} func (w *hexWriter) Write(p []byte) (int, error) { for _, b := range p { fmt.Printf("%x", b) } fmt.Printf("\n") return len(p), nil } type genericType struct{ s string } func (g *genericType) Set(value string) error { g.s = value return nil } func (g *genericType) String() string { return g.s } func main() { app := cli.NewApp() app.Name = "kənˈtrīv" app.Version = "19.99.0" app.Compiled = time.Now() app.Authors = []cli.Author{ cli.Author{ Name: "Example Human", Email: "human@example.com", }, } app.Copyright = "(c) 1999 Serious Enterprise" app.HelpName = "contrive" app.Usage = "demonstrate available API" app.UsageText = "contrive - demonstrating the available API" app.ArgsUsage = "[args and such]" app.Commands = []cli.Command{ cli.Command{ Name: "doo", Aliases: []string{"do"}, Category: "motion", Usage: "do the doo", UsageText: "doo - does the dooing", Description: "no really, there is a lot of dooing to be done", ArgsUsage: "[arrgh]", Flags: []cli.Flag{ cli.BoolFlag{Name: "forever, forevvarr"}, }, Subcommands: cli.Commands{ cli.Command{ Name: "wop", Action: wopAction, }, }, SkipFlagParsing: false, HideHelp: false, Hidden: false, HelpName: "doo!", BashComplete: func(c *cli.Context) { fmt.Fprintf(c.App.Writer, "--better\n") }, Before: func(c *cli.Context) error { fmt.Fprintf(c.App.Writer, "brace for impact\n") return nil }, After: func(c *cli.Context) error { fmt.Fprintf(c.App.Writer, "did we lose anyone?\n") return nil }, Action: func(c *cli.Context) error { c.Command.FullName() c.Command.HasName("wop") c.Command.Names() c.Command.VisibleFlags() fmt.Fprintf(c.App.Writer, "dodododododoodododddooooododododooo\n") if c.Bool("forever") { c.Command.Run(c) } return nil }, OnUsageError: func(c *cli.Context, err error, isSubcommand bool) error { fmt.Fprintf(c.App.Writer, "for shame\n") return err }, }, } app.Flags = []cli.Flag{ cli.BoolFlag{Name: "fancy"}, cli.BoolTFlag{Name: "fancier"}, cli.DurationFlag{Name: "howlong, H", Value: time.Second * 3}, cli.Float64Flag{Name: "howmuch"}, cli.GenericFlag{Name: "wat", Value: &genericType{}}, cli.Int64Flag{Name: "longdistance"}, cli.Int64SliceFlag{Name: "intervals"}, cli.IntFlag{Name: "distance"}, cli.IntSliceFlag{Name: "times"}, cli.StringFlag{Name: "dance-move, d"}, cli.StringSliceFlag{Name: "names, N"}, cli.UintFlag{Name: "age"}, cli.Uint64Flag{Name: "bigage"}, } app.EnableBashCompletion = true app.HideHelp = false app.HideVersion = false app.BashComplete = func(c *cli.Context) { fmt.Fprintf(c.App.Writer, "lipstick\nkiss\nme\nlipstick\nringo\n") } app.Before = func(c *cli.Context) error { fmt.Fprintf(c.App.Writer, "HEEEERE GOES\n") return nil } app.After = func(c *cli.Context) error { fmt.Fprintf(c.App.Writer, "Phew!\n") return nil } app.CommandNotFound = func(c *cli.Context, command string) { fmt.Fprintf(c.App.Writer, "Thar be no %q here.\n", command) } app.OnUsageError = func(c *cli.Context, err error, isSubcommand bool) error { if isSubcommand { return err } fmt.Fprintf(c.App.Writer, "WRONG: %#v\n", err) return nil } app.Action = func(c *cli.Context) error { cli.DefaultAppComplete(c) cli.HandleExitCoder(errors.New("not an exit coder, though")) cli.ShowAppHelp(c) cli.ShowCommandCompletions(c, "nope") cli.ShowCommandHelp(c, "also-nope") cli.ShowCompletions(c) cli.ShowSubcommandHelp(c) cli.ShowVersion(c) categories := c.App.Categories() categories.AddCommand("sounds", cli.Command{ Name: "bloop", }) for _, category := range c.App.Categories() { fmt.Fprintf(c.App.Writer, "%s\n", category.Name) fmt.Fprintf(c.App.Writer, "%#v\n", category.Commands) fmt.Fprintf(c.App.Writer, "%#v\n", category.VisibleCommands()) } fmt.Printf("%#v\n", c.App.Command("doo")) if c.Bool("infinite") { c.App.Run([]string{"app", "doo", "wop"}) } if c.Bool("forevar") { c.App.RunAsSubcommand(c) } c.App.Setup() fmt.Printf("%#v\n", c.App.VisibleCategories()) fmt.Printf("%#v\n", c.App.VisibleCommands()) fmt.Printf("%#v\n", c.App.VisibleFlags()) fmt.Printf("%#v\n", c.Args().First()) if len(c.Args()) > 0 { fmt.Printf("%#v\n", c.Args()[1]) } fmt.Printf("%#v\n", c.Args().Present()) fmt.Printf("%#v\n", c.Args().Tail()) set := flag.NewFlagSet("contrive", 0) nc := cli.NewContext(c.App, set, c) fmt.Printf("%#v\n", nc.Args()) fmt.Printf("%#v\n", nc.Bool("nope")) fmt.Printf("%#v\n", nc.BoolT("nerp")) fmt.Printf("%#v\n", nc.Duration("howlong")) fmt.Printf("%#v\n", nc.Float64("hay")) fmt.Printf("%#v\n", nc.Generic("bloop")) fmt.Printf("%#v\n", nc.Int64("bonk")) fmt.Printf("%#v\n", nc.Int64Slice("burnks")) fmt.Printf("%#v\n", nc.Int("bips")) fmt.Printf("%#v\n", nc.IntSlice("blups")) fmt.Printf("%#v\n", nc.String("snurt")) fmt.Printf("%#v\n", nc.StringSlice("snurkles")) fmt.Printf("%#v\n", nc.Uint("flub")) fmt.Printf("%#v\n", nc.Uint64("florb")) fmt.Printf("%#v\n", nc.GlobalBool("global-nope")) fmt.Printf("%#v\n", nc.GlobalBoolT("global-nerp")) fmt.Printf("%#v\n", nc.GlobalDuration("global-howlong")) fmt.Printf("%#v\n", nc.GlobalFloat64("global-hay")) fmt.Printf("%#v\n", nc.GlobalGeneric("global-bloop")) fmt.Printf("%#v\n", nc.GlobalInt("global-bips")) fmt.Printf("%#v\n", nc.GlobalIntSlice("global-blups")) fmt.Printf("%#v\n", nc.GlobalString("global-snurt")) fmt.Printf("%#v\n", nc.GlobalStringSlice("global-snurkles")) fmt.Printf("%#v\n", nc.FlagNames()) fmt.Printf("%#v\n", nc.GlobalFlagNames()) fmt.Printf("%#v\n", nc.GlobalIsSet("wat")) fmt.Printf("%#v\n", nc.GlobalSet("wat", "nope")) fmt.Printf("%#v\n", nc.NArg()) fmt.Printf("%#v\n", nc.NumFlags()) fmt.Printf("%#v\n", nc.Parent()) nc.Set("wat", "also-nope") ec := cli.NewExitError("ohwell", 86) fmt.Fprintf(c.App.Writer, "%d", ec.ExitCode()) fmt.Printf("made it!\n") return ec } if os.Getenv("HEXY") != "" { app.Writer = &hexWriter{} app.ErrWriter = &hexWriter{} } app.Metadata = map[string]interface{}{ "layers": "many", "explicable": false, "whatever-values": 19.99, } app.Run(os.Args) } func wopAction(c *cli.Context) error { fmt.Fprintf(c.App.Writer, ":wave: over here, eh\n") return nil } ``` ## Contribution Guidelines Feel free to put up a pull request to fix a bug or maybe add a feature. I will give it a code review and make sure that it does not break backwards compatibility. If I or any other collaborators agree that it is in line with the vision of the project, we will work with you to get the code into a mergeable state and merge it into the master branch. If you have contributed something significant to the project, we will most likely add you as a collaborator. As a collaborator you are given the ability to merge others pull requests. It is very important that new code does not break existing code, so be careful about what code you do choose to merge. If you feel like you have contributed to the project but have not yet been added as a collaborator, we probably forgot to add you, please open an issue. ================================================ FILE: vendor/gopkg.in/urfave/cli.v1/app.go ================================================ package cli import ( "fmt" "io" "io/ioutil" "os" "path/filepath" "sort" "time" ) var ( changeLogURL = "https://github.com/urfave/cli/blob/master/CHANGELOG.md" appActionDeprecationURL = fmt.Sprintf("%s#deprecated-cli-app-action-signature", changeLogURL) runAndExitOnErrorDeprecationURL = fmt.Sprintf("%s#deprecated-cli-app-runandexitonerror", changeLogURL) contactSysadmin = "This is an error in the application. Please contact the distributor of this application if this is not you." errInvalidActionType = NewExitError("ERROR invalid Action type. "+ fmt.Sprintf("Must be `func(*Context`)` or `func(*Context) error). %s", contactSysadmin)+ fmt.Sprintf("See %s", appActionDeprecationURL), 2) ) // App is the main structure of a cli application. It is recommended that // an app be created with the cli.NewApp() function type App struct { // The name of the program. Defaults to path.Base(os.Args[0]) Name string // Full name of command for help, defaults to Name HelpName string // Description of the program. Usage string // Text to override the USAGE section of help UsageText string // Description of the program argument format. ArgsUsage string // Version of the program Version string // Description of the program Description string // List of commands to execute Commands []Command // List of flags to parse Flags []Flag // Boolean to enable bash completion commands EnableBashCompletion bool // Boolean to hide built-in help command HideHelp bool // Boolean to hide built-in version flag and the VERSION section of help HideVersion bool // Populate on app startup, only gettable through method Categories() categories CommandCategories // An action to execute when the bash-completion flag is set BashComplete BashCompleteFunc // An action to execute before any subcommands are run, but after the context is ready // If a non-nil error is returned, no subcommands are run Before BeforeFunc // An action to execute after any subcommands are run, but after the subcommand has finished // It is run even if Action() panics After AfterFunc // The action to execute when no subcommands are specified // Expects a `cli.ActionFunc` but will accept the *deprecated* signature of `func(*cli.Context) {}` // *Note*: support for the deprecated `Action` signature will be removed in a future version Action interface{} // Execute this function if the proper command cannot be found CommandNotFound CommandNotFoundFunc // Execute this function if an usage error occurs OnUsageError OnUsageErrorFunc // Compilation date Compiled time.Time // List of all authors who contributed Authors []Author // Copyright of the binary if any Copyright string // Name of Author (Note: Use App.Authors, this is deprecated) Author string // Email of Author (Note: Use App.Authors, this is deprecated) Email string // Writer writer to write output to Writer io.Writer // ErrWriter writes error output ErrWriter io.Writer // Other custom info Metadata map[string]interface{} // Carries a function which returns app specific info. ExtraInfo func() map[string]string // CustomAppHelpTemplate the text template for app help topic. // cli.go uses text/template to render templates. You can // render custom help text by setting this variable. CustomAppHelpTemplate string didSetup bool } // Tries to find out when this binary was compiled. // Returns the current time if it fails to find it. func compileTime() time.Time { info, err := os.Stat(os.Args[0]) if err != nil { return time.Now() } return info.ModTime() } // NewApp creates a new cli Application with some reasonable defaults for Name, // Usage, Version and Action. func NewApp() *App { return &App{ Name: filepath.Base(os.Args[0]), HelpName: filepath.Base(os.Args[0]), Usage: "A new cli application", UsageText: "", Version: "0.0.0", BashComplete: DefaultAppComplete, Action: helpCommand.Action, Compiled: compileTime(), Writer: os.Stdout, } } // Setup runs initialization code to ensure all data structures are ready for // `Run` or inspection prior to `Run`. It is internally called by `Run`, but // will return early if setup has already happened. func (a *App) Setup() { if a.didSetup { return } a.didSetup = true if a.Author != "" || a.Email != "" { a.Authors = append(a.Authors, Author{Name: a.Author, Email: a.Email}) } newCmds := []Command{} for _, c := range a.Commands { if c.HelpName == "" { c.HelpName = fmt.Sprintf("%s %s", a.HelpName, c.Name) } newCmds = append(newCmds, c) } a.Commands = newCmds if a.Command(helpCommand.Name) == nil && !a.HideHelp { a.Commands = append(a.Commands, helpCommand) if (HelpFlag != BoolFlag{}) { a.appendFlag(HelpFlag) } } if !a.HideVersion { a.appendFlag(VersionFlag) } a.categories = CommandCategories{} for _, command := range a.Commands { a.categories = a.categories.AddCommand(command.Category, command) } sort.Sort(a.categories) if a.Metadata == nil { a.Metadata = make(map[string]interface{}) } if a.Writer == nil { a.Writer = os.Stdout } } // Run is the entry point to the cli app. Parses the arguments slice and routes // to the proper flag/args combination func (a *App) Run(arguments []string) (err error) { a.Setup() // handle the completion flag separately from the flagset since // completion could be attempted after a flag, but before its value was put // on the command line. this causes the flagset to interpret the completion // flag name as the value of the flag before it which is undesirable // note that we can only do this because the shell autocomplete function // always appends the completion flag at the end of the command shellComplete, arguments := checkShellCompleteFlag(a, arguments) // parse flags set, err := flagSet(a.Name, a.Flags) if err != nil { return err } set.SetOutput(ioutil.Discard) err = set.Parse(arguments[1:]) nerr := normalizeFlags(a.Flags, set) context := NewContext(a, set, nil) if nerr != nil { fmt.Fprintln(a.Writer, nerr) ShowAppHelp(context) return nerr } context.shellComplete = shellComplete if checkCompletions(context) { return nil } if err != nil { if a.OnUsageError != nil { err := a.OnUsageError(context, err, false) HandleExitCoder(err) return err } fmt.Fprintf(a.Writer, "%s %s\n\n", "Incorrect Usage.", err.Error()) ShowAppHelp(context) return err } if !a.HideHelp && checkHelp(context) { ShowAppHelp(context) return nil } if !a.HideVersion && checkVersion(context) { ShowVersion(context) return nil } if a.After != nil { defer func() { if afterErr := a.After(context); afterErr != nil { if err != nil { err = NewMultiError(err, afterErr) } else { err = afterErr } } }() } if a.Before != nil { beforeErr := a.Before(context) if beforeErr != nil { ShowAppHelp(context) HandleExitCoder(beforeErr) err = beforeErr return err } } args := context.Args() if args.Present() { name := args.First() c := a.Command(name) if c != nil { return c.Run(context) } } if a.Action == nil { a.Action = helpCommand.Action } // Run default Action err = HandleAction(a.Action, context) HandleExitCoder(err) return err } // RunAndExitOnError calls .Run() and exits non-zero if an error was returned // // Deprecated: instead you should return an error that fulfills cli.ExitCoder // to cli.App.Run. This will cause the application to exit with the given eror // code in the cli.ExitCoder func (a *App) RunAndExitOnError() { if err := a.Run(os.Args); err != nil { fmt.Fprintln(a.errWriter(), err) OsExiter(1) } } // RunAsSubcommand invokes the subcommand given the context, parses ctx.Args() to // generate command-specific flags func (a *App) RunAsSubcommand(ctx *Context) (err error) { // append help to commands if len(a.Commands) > 0 { if a.Command(helpCommand.Name) == nil && !a.HideHelp { a.Commands = append(a.Commands, helpCommand) if (HelpFlag != BoolFlag{}) { a.appendFlag(HelpFlag) } } } newCmds := []Command{} for _, c := range a.Commands { if c.HelpName == "" { c.HelpName = fmt.Sprintf("%s %s", a.HelpName, c.Name) } newCmds = append(newCmds, c) } a.Commands = newCmds // parse flags set, err := flagSet(a.Name, a.Flags) if err != nil { return err } set.SetOutput(ioutil.Discard) err = set.Parse(ctx.Args().Tail()) nerr := normalizeFlags(a.Flags, set) context := NewContext(a, set, ctx) if nerr != nil { fmt.Fprintln(a.Writer, nerr) fmt.Fprintln(a.Writer) if len(a.Commands) > 0 { ShowSubcommandHelp(context) } else { ShowCommandHelp(ctx, context.Args().First()) } return nerr } if checkCompletions(context) { return nil } if err != nil { if a.OnUsageError != nil { err = a.OnUsageError(context, err, true) HandleExitCoder(err) return err } fmt.Fprintf(a.Writer, "%s %s\n\n", "Incorrect Usage.", err.Error()) ShowSubcommandHelp(context) return err } if len(a.Commands) > 0 { if checkSubcommandHelp(context) { return nil } } else { if checkCommandHelp(ctx, context.Args().First()) { return nil } } if a.After != nil { defer func() { afterErr := a.After(context) if afterErr != nil { HandleExitCoder(err) if err != nil { err = NewMultiError(err, afterErr) } else { err = afterErr } } }() } if a.Before != nil { beforeErr := a.Before(context) if beforeErr != nil { HandleExitCoder(beforeErr) err = beforeErr return err } } args := context.Args() if args.Present() { name := args.First() c := a.Command(name) if c != nil { return c.Run(context) } } // Run default Action err = HandleAction(a.Action, context) HandleExitCoder(err) return err } // Command returns the named command on App. Returns nil if the command does not exist func (a *App) Command(name string) *Command { for _, c := range a.Commands { if c.HasName(name) { return &c } } return nil } // Categories returns a slice containing all the categories with the commands they contain func (a *App) Categories() CommandCategories { return a.categories } // VisibleCategories returns a slice of categories and commands that are // Hidden=false func (a *App) VisibleCategories() []*CommandCategory { ret := []*CommandCategory{} for _, category := range a.categories { if visible := func() *CommandCategory { for _, command := range category.Commands { if !command.Hidden { return category } } return nil }(); visible != nil { ret = append(ret, visible) } } return ret } // VisibleCommands returns a slice of the Commands with Hidden=false func (a *App) VisibleCommands() []Command { ret := []Command{} for _, command := range a.Commands { if !command.Hidden { ret = append(ret, command) } } return ret } // VisibleFlags returns a slice of the Flags with Hidden=false func (a *App) VisibleFlags() []Flag { return visibleFlags(a.Flags) } func (a *App) hasFlag(flag Flag) bool { for _, f := range a.Flags { if flag == f { return true } } return false } func (a *App) errWriter() io.Writer { // When the app ErrWriter is nil use the package level one. if a.ErrWriter == nil { return ErrWriter } return a.ErrWriter } func (a *App) appendFlag(flag Flag) { if !a.hasFlag(flag) { a.Flags = append(a.Flags, flag) } } // Author represents someone who has contributed to a cli project. type Author struct { Name string // The Authors name Email string // The Authors email } // String makes Author comply to the Stringer interface, to allow an easy print in the templating process func (a Author) String() string { e := "" if a.Email != "" { e = " <" + a.Email + ">" } return fmt.Sprintf("%v%v", a.Name, e) } // HandleAction attempts to figure out which Action signature was used. If // it's an ActionFunc or a func with the legacy signature for Action, the func // is run! func HandleAction(action interface{}, context *Context) (err error) { if a, ok := action.(ActionFunc); ok { return a(context) } else if a, ok := action.(func(*Context) error); ok { return a(context) } else if a, ok := action.(func(*Context)); ok { // deprecated function signature a(context) return nil } else { return errInvalidActionType } } ================================================ FILE: vendor/gopkg.in/urfave/cli.v1/appveyor.yml ================================================ version: "{build}" os: Windows Server 2016 image: Visual Studio 2017 clone_folder: c:\gopath\src\github.com\urfave\cli environment: GOPATH: C:\gopath GOVERSION: 1.8.x PYTHON: C:\Python36-x64 PYTHON_VERSION: 3.6.x PYTHON_ARCH: 64 install: - set PATH=%GOPATH%\bin;C:\go\bin;%PATH% - go version - go env - go get github.com/urfave/gfmrun/... - go get -v -t ./... build_script: - python runtests vet - python runtests test - python runtests gfmrun ================================================ FILE: vendor/gopkg.in/urfave/cli.v1/category.go ================================================ package cli // CommandCategories is a slice of *CommandCategory. type CommandCategories []*CommandCategory // CommandCategory is a category containing commands. type CommandCategory struct { Name string Commands Commands } func (c CommandCategories) Less(i, j int) bool { return c[i].Name < c[j].Name } func (c CommandCategories) Len() int { return len(c) } func (c CommandCategories) Swap(i, j int) { c[i], c[j] = c[j], c[i] } // AddCommand adds a command to a category. func (c CommandCategories) AddCommand(category string, command Command) CommandCategories { for _, commandCategory := range c { if commandCategory.Name == category { commandCategory.Commands = append(commandCategory.Commands, command) return c } } return append(c, &CommandCategory{Name: category, Commands: []Command{command}}) } // VisibleCommands returns a slice of the Commands with Hidden=false func (c *CommandCategory) VisibleCommands() []Command { ret := []Command{} for _, command := range c.Commands { if !command.Hidden { ret = append(ret, command) } } return ret } ================================================ FILE: vendor/gopkg.in/urfave/cli.v1/cli.go ================================================ // Package cli provides a minimal framework for creating and organizing command line // Go applications. cli is designed to be easy to understand and write, the most simple // cli application can be written as follows: // func main() { // cli.NewApp().Run(os.Args) // } // // Of course this application does not do much, so let's make this an actual application: // func main() { // app := cli.NewApp() // app.Name = "greet" // app.Usage = "say a greeting" // app.Action = func(c *cli.Context) error { // println("Greetings") // return nil // } // // app.Run(os.Args) // } package cli //go:generate python ./generate-flag-types cli -i flag-types.json -o flag_generated.go ================================================ FILE: vendor/gopkg.in/urfave/cli.v1/command.go ================================================ package cli import ( "fmt" "io/ioutil" "sort" "strings" ) // Command is a subcommand for a cli.App. type Command struct { // The name of the command Name string // short name of the command. Typically one character (deprecated, use `Aliases`) ShortName string // A list of aliases for the command Aliases []string // A short description of the usage of this command Usage string // Custom text to show on USAGE section of help UsageText string // A longer explanation of how the command works Description string // A short description of the arguments of this command ArgsUsage string // The category the command is part of Category string // The function to call when checking for bash command completions BashComplete BashCompleteFunc // An action to execute before any sub-subcommands are run, but after the context is ready // If a non-nil error is returned, no sub-subcommands are run Before BeforeFunc // An action to execute after any subcommands are run, but after the subcommand has finished // It is run even if Action() panics After AfterFunc // The function to call when this command is invoked Action interface{} // TODO: replace `Action: interface{}` with `Action: ActionFunc` once some kind // of deprecation period has passed, maybe? // Execute this function if a usage error occurs. OnUsageError OnUsageErrorFunc // List of child commands Subcommands Commands // List of flags to parse Flags []Flag // Treat all flags as normal arguments if true SkipFlagParsing bool // Skip argument reordering which attempts to move flags before arguments, // but only works if all flags appear after all arguments. This behavior was // removed n version 2 since it only works under specific conditions so we // backport here by exposing it as an option for compatibility. SkipArgReorder bool // Boolean to hide built-in help command HideHelp bool // Boolean to hide this command from help or completion Hidden bool // Full name of command for help, defaults to full command name, including parent commands. HelpName string commandNamePath []string // CustomHelpTemplate the text template for the command help topic. // cli.go uses text/template to render templates. You can // render custom help text by setting this variable. CustomHelpTemplate string } type CommandsByName []Command func (c CommandsByName) Len() int { return len(c) } func (c CommandsByName) Less(i, j int) bool { return c[i].Name < c[j].Name } func (c CommandsByName) Swap(i, j int) { c[i], c[j] = c[j], c[i] } // FullName returns the full name of the command. // For subcommands this ensures that parent commands are part of the command path func (c Command) FullName() string { if c.commandNamePath == nil { return c.Name } return strings.Join(c.commandNamePath, " ") } // Commands is a slice of Command type Commands []Command // Run invokes the command given the context, parses ctx.Args() to generate command-specific flags func (c Command) Run(ctx *Context) (err error) { if len(c.Subcommands) > 0 { return c.startApp(ctx) } if !c.HideHelp && (HelpFlag != BoolFlag{}) { // append help to flags c.Flags = append( c.Flags, HelpFlag, ) } set, err := flagSet(c.Name, c.Flags) if err != nil { return err } set.SetOutput(ioutil.Discard) if c.SkipFlagParsing { err = set.Parse(append([]string{"--"}, ctx.Args().Tail()...)) } else if !c.SkipArgReorder { firstFlagIndex := -1 terminatorIndex := -1 for index, arg := range ctx.Args() { if arg == "--" { terminatorIndex = index break } else if arg == "-" { // Do nothing. A dash alone is not really a flag. continue } else if strings.HasPrefix(arg, "-") && firstFlagIndex == -1 { firstFlagIndex = index } } if firstFlagIndex > -1 { args := ctx.Args() regularArgs := make([]string, len(args[1:firstFlagIndex])) copy(regularArgs, args[1:firstFlagIndex]) var flagArgs []string if terminatorIndex > -1 { flagArgs = args[firstFlagIndex:terminatorIndex] regularArgs = append(regularArgs, args[terminatorIndex:]...) } else { flagArgs = args[firstFlagIndex:] } err = set.Parse(append(flagArgs, regularArgs...)) } else { err = set.Parse(ctx.Args().Tail()) } } else { err = set.Parse(ctx.Args().Tail()) } nerr := normalizeFlags(c.Flags, set) if nerr != nil { fmt.Fprintln(ctx.App.Writer, nerr) fmt.Fprintln(ctx.App.Writer) ShowCommandHelp(ctx, c.Name) return nerr } context := NewContext(ctx.App, set, ctx) context.Command = c if checkCommandCompletions(context, c.Name) { return nil } if err != nil { if c.OnUsageError != nil { err := c.OnUsageError(context, err, false) HandleExitCoder(err) return err } fmt.Fprintln(context.App.Writer, "Incorrect Usage:", err.Error()) fmt.Fprintln(context.App.Writer) ShowCommandHelp(context, c.Name) return err } if checkCommandHelp(context, c.Name) { return nil } if c.After != nil { defer func() { afterErr := c.After(context) if afterErr != nil { HandleExitCoder(err) if err != nil { err = NewMultiError(err, afterErr) } else { err = afterErr } } }() } if c.Before != nil { err = c.Before(context) if err != nil { ShowCommandHelp(context, c.Name) HandleExitCoder(err) return err } } if c.Action == nil { c.Action = helpSubcommand.Action } err = HandleAction(c.Action, context) if err != nil { HandleExitCoder(err) } return err } // Names returns the names including short names and aliases. func (c Command) Names() []string { names := []string{c.Name} if c.ShortName != "" { names = append(names, c.ShortName) } return append(names, c.Aliases...) } // HasName returns true if Command.Name or Command.ShortName matches given name func (c Command) HasName(name string) bool { for _, n := range c.Names() { if n == name { return true } } return false } func (c Command) startApp(ctx *Context) error { app := NewApp() app.Metadata = ctx.App.Metadata // set the name and usage app.Name = fmt.Sprintf("%s %s", ctx.App.Name, c.Name) if c.HelpName == "" { app.HelpName = c.HelpName } else { app.HelpName = app.Name } app.Usage = c.Usage app.Description = c.Description app.ArgsUsage = c.ArgsUsage // set CommandNotFound app.CommandNotFound = ctx.App.CommandNotFound app.CustomAppHelpTemplate = c.CustomHelpTemplate // set the flags and commands app.Commands = c.Subcommands app.Flags = c.Flags app.HideHelp = c.HideHelp app.Version = ctx.App.Version app.HideVersion = ctx.App.HideVersion app.Compiled = ctx.App.Compiled app.Author = ctx.App.Author app.Email = ctx.App.Email app.Writer = ctx.App.Writer app.ErrWriter = ctx.App.ErrWriter app.categories = CommandCategories{} for _, command := range c.Subcommands { app.categories = app.categories.AddCommand(command.Category, command) } sort.Sort(app.categories) // bash completion app.EnableBashCompletion = ctx.App.EnableBashCompletion if c.BashComplete != nil { app.BashComplete = c.BashComplete } // set the actions app.Before = c.Before app.After = c.After if c.Action != nil { app.Action = c.Action } else { app.Action = helpSubcommand.Action } app.OnUsageError = c.OnUsageError for index, cc := range app.Commands { app.Commands[index].commandNamePath = []string{c.Name, cc.Name} } return app.RunAsSubcommand(ctx) } // VisibleFlags returns a slice of the Flags with Hidden=false func (c Command) VisibleFlags() []Flag { return visibleFlags(c.Flags) } ================================================ FILE: vendor/gopkg.in/urfave/cli.v1/context.go ================================================ package cli import ( "errors" "flag" "reflect" "strings" "syscall" ) // Context is a type that is passed through to // each Handler action in a cli application. Context // can be used to retrieve context-specific Args and // parsed command-line options. type Context struct { App *App Command Command shellComplete bool flagSet *flag.FlagSet setFlags map[string]bool parentContext *Context } // NewContext creates a new context. For use in when invoking an App or Command action. func NewContext(app *App, set *flag.FlagSet, parentCtx *Context) *Context { c := &Context{App: app, flagSet: set, parentContext: parentCtx} if parentCtx != nil { c.shellComplete = parentCtx.shellComplete } return c } // NumFlags returns the number of flags set func (c *Context) NumFlags() int { return c.flagSet.NFlag() } // Set sets a context flag to a value. func (c *Context) Set(name, value string) error { c.setFlags = nil return c.flagSet.Set(name, value) } // GlobalSet sets a context flag to a value on the global flagset func (c *Context) GlobalSet(name, value string) error { globalContext(c).setFlags = nil return globalContext(c).flagSet.Set(name, value) } // IsSet determines if the flag was actually set func (c *Context) IsSet(name string) bool { if c.setFlags == nil { c.setFlags = make(map[string]bool) c.flagSet.Visit(func(f *flag.Flag) { c.setFlags[f.Name] = true }) c.flagSet.VisitAll(func(f *flag.Flag) { if _, ok := c.setFlags[f.Name]; ok { return } c.setFlags[f.Name] = false }) // XXX hack to support IsSet for flags with EnvVar // // There isn't an easy way to do this with the current implementation since // whether a flag was set via an environment variable is very difficult to // determine here. Instead, we intend to introduce a backwards incompatible // change in version 2 to add `IsSet` to the Flag interface to push the // responsibility closer to where the information required to determine // whether a flag is set by non-standard means such as environment // variables is avaliable. // // See https://github.com/urfave/cli/issues/294 for additional discussion flags := c.Command.Flags if c.Command.Name == "" { // cannot == Command{} since it contains slice types if c.App != nil { flags = c.App.Flags } } for _, f := range flags { eachName(f.GetName(), func(name string) { if isSet, ok := c.setFlags[name]; isSet || !ok { return } val := reflect.ValueOf(f) if val.Kind() == reflect.Ptr { val = val.Elem() } envVarValue := val.FieldByName("EnvVar") if !envVarValue.IsValid() { return } eachName(envVarValue.String(), func(envVar string) { envVar = strings.TrimSpace(envVar) if _, ok := syscall.Getenv(envVar); ok { c.setFlags[name] = true return } }) }) } } return c.setFlags[name] } // GlobalIsSet determines if the global flag was actually set func (c *Context) GlobalIsSet(name string) bool { ctx := c if ctx.parentContext != nil { ctx = ctx.parentContext } for ; ctx != nil; ctx = ctx.parentContext { if ctx.IsSet(name) { return true } } return false } // FlagNames returns a slice of flag names used in this context. func (c *Context) FlagNames() (names []string) { for _, flag := range c.Command.Flags { name := strings.Split(flag.GetName(), ",")[0] if name == "help" { continue } names = append(names, name) } return } // GlobalFlagNames returns a slice of global flag names used by the app. func (c *Context) GlobalFlagNames() (names []string) { for _, flag := range c.App.Flags { name := strings.Split(flag.GetName(), ",")[0] if name == "help" || name == "version" { continue } names = append(names, name) } return } // Parent returns the parent context, if any func (c *Context) Parent() *Context { return c.parentContext } // value returns the value of the flag coressponding to `name` func (c *Context) value(name string) interface{} { return c.flagSet.Lookup(name).Value.(flag.Getter).Get() } // Args contains apps console arguments type Args []string // Args returns the command line arguments associated with the context. func (c *Context) Args() Args { args := Args(c.flagSet.Args()) return args } // NArg returns the number of the command line arguments. func (c *Context) NArg() int { return len(c.Args()) } // Get returns the nth argument, or else a blank string func (a Args) Get(n int) string { if len(a) > n { return a[n] } return "" } // First returns the first argument, or else a blank string func (a Args) First() string { return a.Get(0) } // Tail returns the rest of the arguments (not the first one) // or else an empty string slice func (a Args) Tail() []string { if len(a) >= 2 { return []string(a)[1:] } return []string{} } // Present checks if there are any arguments present func (a Args) Present() bool { return len(a) != 0 } // Swap swaps arguments at the given indexes func (a Args) Swap(from, to int) error { if from >= len(a) || to >= len(a) { return errors.New("index out of range") } a[from], a[to] = a[to], a[from] return nil } func globalContext(ctx *Context) *Context { if ctx == nil { return nil } for { if ctx.parentContext == nil { return ctx } ctx = ctx.parentContext } } func lookupGlobalFlagSet(name string, ctx *Context) *flag.FlagSet { if ctx.parentContext != nil { ctx = ctx.parentContext } for ; ctx != nil; ctx = ctx.parentContext { if f := ctx.flagSet.Lookup(name); f != nil { return ctx.flagSet } } return nil } func copyFlag(name string, ff *flag.Flag, set *flag.FlagSet) { switch ff.Value.(type) { case *StringSlice: default: set.Set(name, ff.Value.String()) } } func normalizeFlags(flags []Flag, set *flag.FlagSet) error { visited := make(map[string]bool) set.Visit(func(f *flag.Flag) { visited[f.Name] = true }) for _, f := range flags { parts := strings.Split(f.GetName(), ",") if len(parts) == 1 { continue } var ff *flag.Flag for _, name := range parts { name = strings.Trim(name, " ") if visited[name] { if ff != nil { return errors.New("Cannot use two forms of the same flag: " + name + " " + ff.Name) } ff = set.Lookup(name) } } if ff == nil { continue } for _, name := range parts { name = strings.Trim(name, " ") if !visited[name] { copyFlag(name, ff, set) } } } return nil } ================================================ FILE: vendor/gopkg.in/urfave/cli.v1/errors.go ================================================ package cli import ( "fmt" "io" "os" "strings" ) // OsExiter is the function used when the app exits. If not set defaults to os.Exit. var OsExiter = os.Exit // ErrWriter is used to write errors to the user. This can be anything // implementing the io.Writer interface and defaults to os.Stderr. var ErrWriter io.Writer = os.Stderr // MultiError is an error that wraps multiple errors. type MultiError struct { Errors []error } // NewMultiError creates a new MultiError. Pass in one or more errors. func NewMultiError(err ...error) MultiError { return MultiError{Errors: err} } // Error implements the error interface. func (m MultiError) Error() string { errs := make([]string, len(m.Errors)) for i, err := range m.Errors { errs[i] = err.Error() } return strings.Join(errs, "\n") } type ErrorFormatter interface { Format(s fmt.State, verb rune) } // ExitCoder is the interface checked by `App` and `Command` for a custom exit // code type ExitCoder interface { error ExitCode() int } // ExitError fulfills both the builtin `error` interface and `ExitCoder` type ExitError struct { exitCode int message interface{} } // NewExitError makes a new *ExitError func NewExitError(message interface{}, exitCode int) *ExitError { return &ExitError{ exitCode: exitCode, message: message, } } // Error returns the string message, fulfilling the interface required by // `error` func (ee *ExitError) Error() string { return fmt.Sprintf("%v", ee.message) } // ExitCode returns the exit code, fulfilling the interface required by // `ExitCoder` func (ee *ExitError) ExitCode() int { return ee.exitCode } // HandleExitCoder checks if the error fulfills the ExitCoder interface, and if // so prints the error to stderr (if it is non-empty) and calls OsExiter with the // given exit code. If the given error is a MultiError, then this func is // called on all members of the Errors slice and calls OsExiter with the last exit code. func HandleExitCoder(err error) { if err == nil { return } if exitErr, ok := err.(ExitCoder); ok { if err.Error() != "" { if _, ok := exitErr.(ErrorFormatter); ok { fmt.Fprintf(ErrWriter, "%+v\n", err) } else { fmt.Fprintln(ErrWriter, err) } } OsExiter(exitErr.ExitCode()) return } if multiErr, ok := err.(MultiError); ok { code := handleMultiError(multiErr) OsExiter(code) return } } func handleMultiError(multiErr MultiError) int { code := 1 for _, merr := range multiErr.Errors { if multiErr2, ok := merr.(MultiError); ok { code = handleMultiError(multiErr2) } else { fmt.Fprintln(ErrWriter, merr) if exitErr, ok := merr.(ExitCoder); ok { code = exitErr.ExitCode() } } } return code } ================================================ FILE: vendor/gopkg.in/urfave/cli.v1/flag-types.json ================================================ [ { "name": "Bool", "type": "bool", "value": false, "context_default": "false", "parser": "strconv.ParseBool(f.Value.String())" }, { "name": "BoolT", "type": "bool", "value": false, "doctail": " that is true by default", "context_default": "false", "parser": "strconv.ParseBool(f.Value.String())" }, { "name": "Duration", "type": "time.Duration", "doctail": " (see https://golang.org/pkg/time/#ParseDuration)", "context_default": "0", "parser": "time.ParseDuration(f.Value.String())" }, { "name": "Float64", "type": "float64", "context_default": "0", "parser": "strconv.ParseFloat(f.Value.String(), 64)" }, { "name": "Generic", "type": "Generic", "dest": false, "context_default": "nil", "context_type": "interface{}" }, { "name": "Int64", "type": "int64", "context_default": "0", "parser": "strconv.ParseInt(f.Value.String(), 0, 64)" }, { "name": "Int", "type": "int", "context_default": "0", "parser": "strconv.ParseInt(f.Value.String(), 0, 64)", "parser_cast": "int(parsed)" }, { "name": "IntSlice", "type": "*IntSlice", "dest": false, "context_default": "nil", "context_type": "[]int", "parser": "(f.Value.(*IntSlice)).Value(), error(nil)" }, { "name": "Int64Slice", "type": "*Int64Slice", "dest": false, "context_default": "nil", "context_type": "[]int64", "parser": "(f.Value.(*Int64Slice)).Value(), error(nil)" }, { "name": "String", "type": "string", "context_default": "\"\"", "parser": "f.Value.String(), error(nil)" }, { "name": "StringSlice", "type": "*StringSlice", "dest": false, "context_default": "nil", "context_type": "[]string", "parser": "(f.Value.(*StringSlice)).Value(), error(nil)" }, { "name": "Uint64", "type": "uint64", "context_default": "0", "parser": "strconv.ParseUint(f.Value.String(), 0, 64)" }, { "name": "Uint", "type": "uint", "context_default": "0", "parser": "strconv.ParseUint(f.Value.String(), 0, 64)", "parser_cast": "uint(parsed)" } ] ================================================ FILE: vendor/gopkg.in/urfave/cli.v1/flag.go ================================================ package cli import ( "flag" "fmt" "reflect" "runtime" "strconv" "strings" "syscall" "time" ) const defaultPlaceholder = "value" // BashCompletionFlag enables bash-completion for all commands and subcommands var BashCompletionFlag Flag = BoolFlag{ Name: "generate-bash-completion", Hidden: true, } // VersionFlag prints the version for the application var VersionFlag Flag = BoolFlag{ Name: "version, v", Usage: "print the version", } // HelpFlag prints the help for all commands and subcommands // Set to the zero value (BoolFlag{}) to disable flag -- keeps subcommand // unless HideHelp is set to true) var HelpFlag Flag = BoolFlag{ Name: "help, h", Usage: "show help", } // FlagStringer converts a flag definition to a string. This is used by help // to display a flag. var FlagStringer FlagStringFunc = stringifyFlag // FlagsByName is a slice of Flag. type FlagsByName []Flag func (f FlagsByName) Len() int { return len(f) } func (f FlagsByName) Less(i, j int) bool { return f[i].GetName() < f[j].GetName() } func (f FlagsByName) Swap(i, j int) { f[i], f[j] = f[j], f[i] } // Flag is a common interface related to parsing flags in cli. // For more advanced flag parsing techniques, it is recommended that // this interface be implemented. type Flag interface { fmt.Stringer // Apply Flag settings to the given flag set Apply(*flag.FlagSet) GetName() string } // errorableFlag is an interface that allows us to return errors during apply // it allows flags defined in this library to return errors in a fashion backwards compatible // TODO remove in v2 and modify the existing Flag interface to return errors type errorableFlag interface { Flag ApplyWithError(*flag.FlagSet) error } func flagSet(name string, flags []Flag) (*flag.FlagSet, error) { set := flag.NewFlagSet(name, flag.ContinueOnError) for _, f := range flags { //TODO remove in v2 when errorableFlag is removed if ef, ok := f.(errorableFlag); ok { if err := ef.ApplyWithError(set); err != nil { return nil, err } } else { f.Apply(set) } } return set, nil } func eachName(longName string, fn func(string)) { parts := strings.Split(longName, ",") for _, name := range parts { name = strings.Trim(name, " ") fn(name) } } // Generic is a generic parseable type identified by a specific flag type Generic interface { Set(value string) error String() string } // Apply takes the flagset and calls Set on the generic flag with the value // provided by the user for parsing by the flag // Ignores parsing errors func (f GenericFlag) Apply(set *flag.FlagSet) { f.ApplyWithError(set) } // ApplyWithError takes the flagset and calls Set on the generic flag with the value // provided by the user for parsing by the flag func (f GenericFlag) ApplyWithError(set *flag.FlagSet) error { val := f.Value if f.EnvVar != "" { for _, envVar := range strings.Split(f.EnvVar, ",") { envVar = strings.TrimSpace(envVar) if envVal, ok := syscall.Getenv(envVar); ok { if err := val.Set(envVal); err != nil { return fmt.Errorf("could not parse %s as value for flag %s: %s", envVal, f.Name, err) } break } } } eachName(f.Name, func(name string) { set.Var(f.Value, name, f.Usage) }) return nil } // StringSlice is an opaque type for []string to satisfy flag.Value and flag.Getter type StringSlice []string // Set appends the string value to the list of values func (f *StringSlice) Set(value string) error { *f = append(*f, value) return nil } // String returns a readable representation of this value (for usage defaults) func (f *StringSlice) String() string { return fmt.Sprintf("%s", *f) } // Value returns the slice of strings set by this flag func (f *StringSlice) Value() []string { return *f } // Get returns the slice of strings set by this flag func (f *StringSlice) Get() interface{} { return *f } // Apply populates the flag given the flag set and environment // Ignores errors func (f StringSliceFlag) Apply(set *flag.FlagSet) { f.ApplyWithError(set) } // ApplyWithError populates the flag given the flag set and environment func (f StringSliceFlag) ApplyWithError(set *flag.FlagSet) error { if f.EnvVar != "" { for _, envVar := range strings.Split(f.EnvVar, ",") { envVar = strings.TrimSpace(envVar) if envVal, ok := syscall.Getenv(envVar); ok { newVal := &StringSlice{} for _, s := range strings.Split(envVal, ",") { s = strings.TrimSpace(s) if err := newVal.Set(s); err != nil { return fmt.Errorf("could not parse %s as string value for flag %s: %s", envVal, f.Name, err) } } f.Value = newVal break } } } eachName(f.Name, func(name string) { if f.Value == nil { f.Value = &StringSlice{} } set.Var(f.Value, name, f.Usage) }) return nil } // IntSlice is an opaque type for []int to satisfy flag.Value and flag.Getter type IntSlice []int // Set parses the value into an integer and appends it to the list of values func (f *IntSlice) Set(value string) error { tmp, err := strconv.Atoi(value) if err != nil { return err } *f = append(*f, tmp) return nil } // String returns a readable representation of this value (for usage defaults) func (f *IntSlice) String() string { return fmt.Sprintf("%#v", *f) } // Value returns the slice of ints set by this flag func (f *IntSlice) Value() []int { return *f } // Get returns the slice of ints set by this flag func (f *IntSlice) Get() interface{} { return *f } // Apply populates the flag given the flag set and environment // Ignores errors func (f IntSliceFlag) Apply(set *flag.FlagSet) { f.ApplyWithError(set) } // ApplyWithError populates the flag given the flag set and environment func (f IntSliceFlag) ApplyWithError(set *flag.FlagSet) error { if f.EnvVar != "" { for _, envVar := range strings.Split(f.EnvVar, ",") { envVar = strings.TrimSpace(envVar) if envVal, ok := syscall.Getenv(envVar); ok { newVal := &IntSlice{} for _, s := range strings.Split(envVal, ",") { s = strings.TrimSpace(s) if err := newVal.Set(s); err != nil { return fmt.Errorf("could not parse %s as int slice value for flag %s: %s", envVal, f.Name, err) } } f.Value = newVal break } } } eachName(f.Name, func(name string) { if f.Value == nil { f.Value = &IntSlice{} } set.Var(f.Value, name, f.Usage) }) return nil } // Int64Slice is an opaque type for []int to satisfy flag.Value and flag.Getter type Int64Slice []int64 // Set parses the value into an integer and appends it to the list of values func (f *Int64Slice) Set(value string) error { tmp, err := strconv.ParseInt(value, 10, 64) if err != nil { return err } *f = append(*f, tmp) return nil } // String returns a readable representation of this value (for usage defaults) func (f *Int64Slice) String() string { return fmt.Sprintf("%#v", *f) } // Value returns the slice of ints set by this flag func (f *Int64Slice) Value() []int64 { return *f } // Get returns the slice of ints set by this flag func (f *Int64Slice) Get() interface{} { return *f } // Apply populates the flag given the flag set and environment // Ignores errors func (f Int64SliceFlag) Apply(set *flag.FlagSet) { f.ApplyWithError(set) } // ApplyWithError populates the flag given the flag set and environment func (f Int64SliceFlag) ApplyWithError(set *flag.FlagSet) error { if f.EnvVar != "" { for _, envVar := range strings.Split(f.EnvVar, ",") { envVar = strings.TrimSpace(envVar) if envVal, ok := syscall.Getenv(envVar); ok { newVal := &Int64Slice{} for _, s := range strings.Split(envVal, ",") { s = strings.TrimSpace(s) if err := newVal.Set(s); err != nil { return fmt.Errorf("could not parse %s as int64 slice value for flag %s: %s", envVal, f.Name, err) } } f.Value = newVal break } } } eachName(f.Name, func(name string) { if f.Value == nil { f.Value = &Int64Slice{} } set.Var(f.Value, name, f.Usage) }) return nil } // Apply populates the flag given the flag set and environment // Ignores errors func (f BoolFlag) Apply(set *flag.FlagSet) { f.ApplyWithError(set) } // ApplyWithError populates the flag given the flag set and environment func (f BoolFlag) ApplyWithError(set *flag.FlagSet) error { val := false if f.EnvVar != "" { for _, envVar := range strings.Split(f.EnvVar, ",") { envVar = strings.TrimSpace(envVar) if envVal, ok := syscall.Getenv(envVar); ok { if envVal == "" { val = false break } envValBool, err := strconv.ParseBool(envVal) if err != nil { return fmt.Errorf("could not parse %s as bool value for flag %s: %s", envVal, f.Name, err) } val = envValBool break } } } eachName(f.Name, func(name string) { if f.Destination != nil { set.BoolVar(f.Destination, name, val, f.Usage) return } set.Bool(name, val, f.Usage) }) return nil } // Apply populates the flag given the flag set and environment // Ignores errors func (f BoolTFlag) Apply(set *flag.FlagSet) { f.ApplyWithError(set) } // ApplyWithError populates the flag given the flag set and environment func (f BoolTFlag) ApplyWithError(set *flag.FlagSet) error { val := true if f.EnvVar != "" { for _, envVar := range strings.Split(f.EnvVar, ",") { envVar = strings.TrimSpace(envVar) if envVal, ok := syscall.Getenv(envVar); ok { if envVal == "" { val = false break } envValBool, err := strconv.ParseBool(envVal) if err != nil { return fmt.Errorf("could not parse %s as bool value for flag %s: %s", envVal, f.Name, err) } val = envValBool break } } } eachName(f.Name, func(name string) { if f.Destination != nil { set.BoolVar(f.Destination, name, val, f.Usage) return } set.Bool(name, val, f.Usage) }) return nil } // Apply populates the flag given the flag set and environment // Ignores errors func (f StringFlag) Apply(set *flag.FlagSet) { f.ApplyWithError(set) } // ApplyWithError populates the flag given the flag set and environment func (f StringFlag) ApplyWithError(set *flag.FlagSet) error { if f.EnvVar != "" { for _, envVar := range strings.Split(f.EnvVar, ",") { envVar = strings.TrimSpace(envVar) if envVal, ok := syscall.Getenv(envVar); ok { f.Value = envVal break } } } eachName(f.Name, func(name string) { if f.Destination != nil { set.StringVar(f.Destination, name, f.Value, f.Usage) return } set.String(name, f.Value, f.Usage) }) return nil } // Apply populates the flag given the flag set and environment // Ignores errors func (f IntFlag) Apply(set *flag.FlagSet) { f.ApplyWithError(set) } // ApplyWithError populates the flag given the flag set and environment func (f IntFlag) ApplyWithError(set *flag.FlagSet) error { if f.EnvVar != "" { for _, envVar := range strings.Split(f.EnvVar, ",") { envVar = strings.TrimSpace(envVar) if envVal, ok := syscall.Getenv(envVar); ok { envValInt, err := strconv.ParseInt(envVal, 0, 64) if err != nil { return fmt.Errorf("could not parse %s as int value for flag %s: %s", envVal, f.Name, err) } f.Value = int(envValInt) break } } } eachName(f.Name, func(name string) { if f.Destination != nil { set.IntVar(f.Destination, name, f.Value, f.Usage) return } set.Int(name, f.Value, f.Usage) }) return nil } // Apply populates the flag given the flag set and environment // Ignores errors func (f Int64Flag) Apply(set *flag.FlagSet) { f.ApplyWithError(set) } // ApplyWithError populates the flag given the flag set and environment func (f Int64Flag) ApplyWithError(set *flag.FlagSet) error { if f.EnvVar != "" { for _, envVar := range strings.Split(f.EnvVar, ",") { envVar = strings.TrimSpace(envVar) if envVal, ok := syscall.Getenv(envVar); ok { envValInt, err := strconv.ParseInt(envVal, 0, 64) if err != nil { return fmt.Errorf("could not parse %s as int value for flag %s: %s", envVal, f.Name, err) } f.Value = envValInt break } } } eachName(f.Name, func(name string) { if f.Destination != nil { set.Int64Var(f.Destination, name, f.Value, f.Usage) return } set.Int64(name, f.Value, f.Usage) }) return nil } // Apply populates the flag given the flag set and environment // Ignores errors func (f UintFlag) Apply(set *flag.FlagSet) { f.ApplyWithError(set) } // ApplyWithError populates the flag given the flag set and environment func (f UintFlag) ApplyWithError(set *flag.FlagSet) error { if f.EnvVar != "" { for _, envVar := range strings.Split(f.EnvVar, ",") { envVar = strings.TrimSpace(envVar) if envVal, ok := syscall.Getenv(envVar); ok { envValInt, err := strconv.ParseUint(envVal, 0, 64) if err != nil { return fmt.Errorf("could not parse %s as uint value for flag %s: %s", envVal, f.Name, err) } f.Value = uint(envValInt) break } } } eachName(f.Name, func(name string) { if f.Destination != nil { set.UintVar(f.Destination, name, f.Value, f.Usage) return } set.Uint(name, f.Value, f.Usage) }) return nil } // Apply populates the flag given the flag set and environment // Ignores errors func (f Uint64Flag) Apply(set *flag.FlagSet) { f.ApplyWithError(set) } // ApplyWithError populates the flag given the flag set and environment func (f Uint64Flag) ApplyWithError(set *flag.FlagSet) error { if f.EnvVar != "" { for _, envVar := range strings.Split(f.EnvVar, ",") { envVar = strings.TrimSpace(envVar) if envVal, ok := syscall.Getenv(envVar); ok { envValInt, err := strconv.ParseUint(envVal, 0, 64) if err != nil { return fmt.Errorf("could not parse %s as uint64 value for flag %s: %s", envVal, f.Name, err) } f.Value = uint64(envValInt) break } } } eachName(f.Name, func(name string) { if f.Destination != nil { set.Uint64Var(f.Destination, name, f.Value, f.Usage) return } set.Uint64(name, f.Value, f.Usage) }) return nil } // Apply populates the flag given the flag set and environment // Ignores errors func (f DurationFlag) Apply(set *flag.FlagSet) { f.ApplyWithError(set) } // ApplyWithError populates the flag given the flag set and environment func (f DurationFlag) ApplyWithError(set *flag.FlagSet) error { if f.EnvVar != "" { for _, envVar := range strings.Split(f.EnvVar, ",") { envVar = strings.TrimSpace(envVar) if envVal, ok := syscall.Getenv(envVar); ok { envValDuration, err := time.ParseDuration(envVal) if err != nil { return fmt.Errorf("could not parse %s as duration for flag %s: %s", envVal, f.Name, err) } f.Value = envValDuration break } } } eachName(f.Name, func(name string) { if f.Destination != nil { set.DurationVar(f.Destination, name, f.Value, f.Usage) return } set.Duration(name, f.Value, f.Usage) }) return nil } // Apply populates the flag given the flag set and environment // Ignores errors func (f Float64Flag) Apply(set *flag.FlagSet) { f.ApplyWithError(set) } // ApplyWithError populates the flag given the flag set and environment func (f Float64Flag) ApplyWithError(set *flag.FlagSet) error { if f.EnvVar != "" { for _, envVar := range strings.Split(f.EnvVar, ",") { envVar = strings.TrimSpace(envVar) if envVal, ok := syscall.Getenv(envVar); ok { envValFloat, err := strconv.ParseFloat(envVal, 10) if err != nil { return fmt.Errorf("could not parse %s as float64 value for flag %s: %s", envVal, f.Name, err) } f.Value = float64(envValFloat) break } } } eachName(f.Name, func(name string) { if f.Destination != nil { set.Float64Var(f.Destination, name, f.Value, f.Usage) return } set.Float64(name, f.Value, f.Usage) }) return nil } func visibleFlags(fl []Flag) []Flag { visible := []Flag{} for _, flag := range fl { field := flagValue(flag).FieldByName("Hidden") if !field.IsValid() || !field.Bool() { visible = append(visible, flag) } } return visible } func prefixFor(name string) (prefix string) { if len(name) == 1 { prefix = "-" } else { prefix = "--" } return } // Returns the placeholder, if any, and the unquoted usage string. func unquoteUsage(usage string) (string, string) { for i := 0; i < len(usage); i++ { if usage[i] == '`' { for j := i + 1; j < len(usage); j++ { if usage[j] == '`' { name := usage[i+1 : j] usage = usage[:i] + name + usage[j+1:] return name, usage } } break } } return "", usage } func prefixedNames(fullName, placeholder string) string { var prefixed string parts := strings.Split(fullName, ",") for i, name := range parts { name = strings.Trim(name, " ") prefixed += prefixFor(name) + name if placeholder != "" { prefixed += " " + placeholder } if i < len(parts)-1 { prefixed += ", " } } return prefixed } func withEnvHint(envVar, str string) string { envText := "" if envVar != "" { prefix := "$" suffix := "" sep := ", $" if runtime.GOOS == "windows" { prefix = "%" suffix = "%" sep = "%, %" } envText = fmt.Sprintf(" [%s%s%s]", prefix, strings.Join(strings.Split(envVar, ","), sep), suffix) } return str + envText } func flagValue(f Flag) reflect.Value { fv := reflect.ValueOf(f) for fv.Kind() == reflect.Ptr { fv = reflect.Indirect(fv) } return fv } func stringifyFlag(f Flag) string { fv := flagValue(f) switch f.(type) { case IntSliceFlag: return withEnvHint(fv.FieldByName("EnvVar").String(), stringifyIntSliceFlag(f.(IntSliceFlag))) case Int64SliceFlag: return withEnvHint(fv.FieldByName("EnvVar").String(), stringifyInt64SliceFlag(f.(Int64SliceFlag))) case StringSliceFlag: return withEnvHint(fv.FieldByName("EnvVar").String(), stringifyStringSliceFlag(f.(StringSliceFlag))) } placeholder, usage := unquoteUsage(fv.FieldByName("Usage").String()) needsPlaceholder := false defaultValueString := "" if val := fv.FieldByName("Value"); val.IsValid() { needsPlaceholder = true defaultValueString = fmt.Sprintf(" (default: %v)", val.Interface()) if val.Kind() == reflect.String && val.String() != "" { defaultValueString = fmt.Sprintf(" (default: %q)", val.String()) } } if defaultValueString == " (default: )" { defaultValueString = "" } if needsPlaceholder && placeholder == "" { placeholder = defaultPlaceholder } usageWithDefault := strings.TrimSpace(fmt.Sprintf("%s%s", usage, defaultValueString)) return withEnvHint(fv.FieldByName("EnvVar").String(), fmt.Sprintf("%s\t%s", prefixedNames(fv.FieldByName("Name").String(), placeholder), usageWithDefault)) } func stringifyIntSliceFlag(f IntSliceFlag) string { defaultVals := []string{} if f.Value != nil && len(f.Value.Value()) > 0 { for _, i := range f.Value.Value() { defaultVals = append(defaultVals, fmt.Sprintf("%d", i)) } } return stringifySliceFlag(f.Usage, f.Name, defaultVals) } func stringifyInt64SliceFlag(f Int64SliceFlag) string { defaultVals := []string{} if f.Value != nil && len(f.Value.Value()) > 0 { for _, i := range f.Value.Value() { defaultVals = append(defaultVals, fmt.Sprintf("%d", i)) } } return stringifySliceFlag(f.Usage, f.Name, defaultVals) } func stringifyStringSliceFlag(f StringSliceFlag) string { defaultVals := []string{} if f.Value != nil && len(f.Value.Value()) > 0 { for _, s := range f.Value.Value() { if len(s) > 0 { defaultVals = append(defaultVals, fmt.Sprintf("%q", s)) } } } return stringifySliceFlag(f.Usage, f.Name, defaultVals) } func stringifySliceFlag(usage, name string, defaultVals []string) string { placeholder, usage := unquoteUsage(usage) if placeholder == "" { placeholder = defaultPlaceholder } defaultVal := "" if len(defaultVals) > 0 { defaultVal = fmt.Sprintf(" (default: %s)", strings.Join(defaultVals, ", ")) } usageWithDefault := strings.TrimSpace(fmt.Sprintf("%s%s", usage, defaultVal)) return fmt.Sprintf("%s\t%s", prefixedNames(name, placeholder), usageWithDefault) } ================================================ FILE: vendor/gopkg.in/urfave/cli.v1/flag_generated.go ================================================ package cli import ( "flag" "strconv" "time" ) // WARNING: This file is generated! // BoolFlag is a flag with type bool type BoolFlag struct { Name string Usage string EnvVar string Hidden bool Destination *bool } // String returns a readable representation of this value // (for usage defaults) func (f BoolFlag) String() string { return FlagStringer(f) } // GetName returns the name of the flag func (f BoolFlag) GetName() string { return f.Name } // Bool looks up the value of a local BoolFlag, returns // false if not found func (c *Context) Bool(name string) bool { return lookupBool(name, c.flagSet) } // GlobalBool looks up the value of a global BoolFlag, returns // false if not found func (c *Context) GlobalBool(name string) bool { if fs := lookupGlobalFlagSet(name, c); fs != nil { return lookupBool(name, fs) } return false } func lookupBool(name string, set *flag.FlagSet) bool { f := set.Lookup(name) if f != nil { parsed, err := strconv.ParseBool(f.Value.String()) if err != nil { return false } return parsed } return false } // BoolTFlag is a flag with type bool that is true by default type BoolTFlag struct { Name string Usage string EnvVar string Hidden bool Destination *bool } // String returns a readable representation of this value // (for usage defaults) func (f BoolTFlag) String() string { return FlagStringer(f) } // GetName returns the name of the flag func (f BoolTFlag) GetName() string { return f.Name } // BoolT looks up the value of a local BoolTFlag, returns // false if not found func (c *Context) BoolT(name string) bool { return lookupBoolT(name, c.flagSet) } // GlobalBoolT looks up the value of a global BoolTFlag, returns // false if not found func (c *Context) GlobalBoolT(name string) bool { if fs := lookupGlobalFlagSet(name, c); fs != nil { return lookupBoolT(name, fs) } return false } func lookupBoolT(name string, set *flag.FlagSet) bool { f := set.Lookup(name) if f != nil { parsed, err := strconv.ParseBool(f.Value.String()) if err != nil { return false } return parsed } return false } // DurationFlag is a flag with type time.Duration (see https://golang.org/pkg/time/#ParseDuration) type DurationFlag struct { Name string Usage string EnvVar string Hidden bool Value time.Duration Destination *time.Duration } // String returns a readable representation of this value // (for usage defaults) func (f DurationFlag) String() string { return FlagStringer(f) } // GetName returns the name of the flag func (f DurationFlag) GetName() string { return f.Name } // Duration looks up the value of a local DurationFlag, returns // 0 if not found func (c *Context) Duration(name string) time.Duration { return lookupDuration(name, c.flagSet) } // GlobalDuration looks up the value of a global DurationFlag, returns // 0 if not found func (c *Context) GlobalDuration(name string) time.Duration { if fs := lookupGlobalFlagSet(name, c); fs != nil { return lookupDuration(name, fs) } return 0 } func lookupDuration(name string, set *flag.FlagSet) time.Duration { f := set.Lookup(name) if f != nil { parsed, err := time.ParseDuration(f.Value.String()) if err != nil { return 0 } return parsed } return 0 } // Float64Flag is a flag with type float64 type Float64Flag struct { Name string Usage string EnvVar string Hidden bool Value float64 Destination *float64 } // String returns a readable representation of this value // (for usage defaults) func (f Float64Flag) String() string { return FlagStringer(f) } // GetName returns the name of the flag func (f Float64Flag) GetName() string { return f.Name } // Float64 looks up the value of a local Float64Flag, returns // 0 if not found func (c *Context) Float64(name string) float64 { return lookupFloat64(name, c.flagSet) } // GlobalFloat64 looks up the value of a global Float64Flag, returns // 0 if not found func (c *Context) GlobalFloat64(name string) float64 { if fs := lookupGlobalFlagSet(name, c); fs != nil { return lookupFloat64(name, fs) } return 0 } func lookupFloat64(name string, set *flag.FlagSet) float64 { f := set.Lookup(name) if f != nil { parsed, err := strconv.ParseFloat(f.Value.String(), 64) if err != nil { return 0 } return parsed } return 0 } // GenericFlag is a flag with type Generic type GenericFlag struct { Name string Usage string EnvVar string Hidden bool Value Generic } // String returns a readable representation of this value // (for usage defaults) func (f GenericFlag) String() string { return FlagStringer(f) } // GetName returns the name of the flag func (f GenericFlag) GetName() string { return f.Name } // Generic looks up the value of a local GenericFlag, returns // nil if not found func (c *Context) Generic(name string) interface{} { return lookupGeneric(name, c.flagSet) } // GlobalGeneric looks up the value of a global GenericFlag, returns // nil if not found func (c *Context) GlobalGeneric(name string) interface{} { if fs := lookupGlobalFlagSet(name, c); fs != nil { return lookupGeneric(name, fs) } return nil } func lookupGeneric(name string, set *flag.FlagSet) interface{} { f := set.Lookup(name) if f != nil { parsed, err := f.Value, error(nil) if err != nil { return nil } return parsed } return nil } // Int64Flag is a flag with type int64 type Int64Flag struct { Name string Usage string EnvVar string Hidden bool Value int64 Destination *int64 } // String returns a readable representation of this value // (for usage defaults) func (f Int64Flag) String() string { return FlagStringer(f) } // GetName returns the name of the flag func (f Int64Flag) GetName() string { return f.Name } // Int64 looks up the value of a local Int64Flag, returns // 0 if not found func (c *Context) Int64(name string) int64 { return lookupInt64(name, c.flagSet) } // GlobalInt64 looks up the value of a global Int64Flag, returns // 0 if not found func (c *Context) GlobalInt64(name string) int64 { if fs := lookupGlobalFlagSet(name, c); fs != nil { return lookupInt64(name, fs) } return 0 } func lookupInt64(name string, set *flag.FlagSet) int64 { f := set.Lookup(name) if f != nil { parsed, err := strconv.ParseInt(f.Value.String(), 0, 64) if err != nil { return 0 } return parsed } return 0 } // IntFlag is a flag with type int type IntFlag struct { Name string Usage string EnvVar string Hidden bool Value int Destination *int } // String returns a readable representation of this value // (for usage defaults) func (f IntFlag) String() string { return FlagStringer(f) } // GetName returns the name of the flag func (f IntFlag) GetName() string { return f.Name } // Int looks up the value of a local IntFlag, returns // 0 if not found func (c *Context) Int(name string) int { return lookupInt(name, c.flagSet) } // GlobalInt looks up the value of a global IntFlag, returns // 0 if not found func (c *Context) GlobalInt(name string) int { if fs := lookupGlobalFlagSet(name, c); fs != nil { return lookupInt(name, fs) } return 0 } func lookupInt(name string, set *flag.FlagSet) int { f := set.Lookup(name) if f != nil { parsed, err := strconv.ParseInt(f.Value.String(), 0, 64) if err != nil { return 0 } return int(parsed) } return 0 } // IntSliceFlag is a flag with type *IntSlice type IntSliceFlag struct { Name string Usage string EnvVar string Hidden bool Value *IntSlice } // String returns a readable representation of this value // (for usage defaults) func (f IntSliceFlag) String() string { return FlagStringer(f) } // GetName returns the name of the flag func (f IntSliceFlag) GetName() string { return f.Name } // IntSlice looks up the value of a local IntSliceFlag, returns // nil if not found func (c *Context) IntSlice(name string) []int { return lookupIntSlice(name, c.flagSet) } // GlobalIntSlice looks up the value of a global IntSliceFlag, returns // nil if not found func (c *Context) GlobalIntSlice(name string) []int { if fs := lookupGlobalFlagSet(name, c); fs != nil { return lookupIntSlice(name, fs) } return nil } func lookupIntSlice(name string, set *flag.FlagSet) []int { f := set.Lookup(name) if f != nil { parsed, err := (f.Value.(*IntSlice)).Value(), error(nil) if err != nil { return nil } return parsed } return nil } // Int64SliceFlag is a flag with type *Int64Slice type Int64SliceFlag struct { Name string Usage string EnvVar string Hidden bool Value *Int64Slice } // String returns a readable representation of this value // (for usage defaults) func (f Int64SliceFlag) String() string { return FlagStringer(f) } // GetName returns the name of the flag func (f Int64SliceFlag) GetName() string { return f.Name } // Int64Slice looks up the value of a local Int64SliceFlag, returns // nil if not found func (c *Context) Int64Slice(name string) []int64 { return lookupInt64Slice(name, c.flagSet) } // GlobalInt64Slice looks up the value of a global Int64SliceFlag, returns // nil if not found func (c *Context) GlobalInt64Slice(name string) []int64 { if fs := lookupGlobalFlagSet(name, c); fs != nil { return lookupInt64Slice(name, fs) } return nil } func lookupInt64Slice(name string, set *flag.FlagSet) []int64 { f := set.Lookup(name) if f != nil { parsed, err := (f.Value.(*Int64Slice)).Value(), error(nil) if err != nil { return nil } return parsed } return nil } // StringFlag is a flag with type string type StringFlag struct { Name string Usage string EnvVar string Hidden bool Value string Destination *string } // String returns a readable representation of this value // (for usage defaults) func (f StringFlag) String() string { return FlagStringer(f) } // GetName returns the name of the flag func (f StringFlag) GetName() string { return f.Name } // String looks up the value of a local StringFlag, returns // "" if not found func (c *Context) String(name string) string { return lookupString(name, c.flagSet) } // GlobalString looks up the value of a global StringFlag, returns // "" if not found func (c *Context) GlobalString(name string) string { if fs := lookupGlobalFlagSet(name, c); fs != nil { return lookupString(name, fs) } return "" } func lookupString(name string, set *flag.FlagSet) string { f := set.Lookup(name) if f != nil { parsed, err := f.Value.String(), error(nil) if err != nil { return "" } return parsed } return "" } // StringSliceFlag is a flag with type *StringSlice type StringSliceFlag struct { Name string Usage string EnvVar string Hidden bool Value *StringSlice } // String returns a readable representation of this value // (for usage defaults) func (f StringSliceFlag) String() string { return FlagStringer(f) } // GetName returns the name of the flag func (f StringSliceFlag) GetName() string { return f.Name } // StringSlice looks up the value of a local StringSliceFlag, returns // nil if not found func (c *Context) StringSlice(name string) []string { return lookupStringSlice(name, c.flagSet) } // GlobalStringSlice looks up the value of a global StringSliceFlag, returns // nil if not found func (c *Context) GlobalStringSlice(name string) []string { if fs := lookupGlobalFlagSet(name, c); fs != nil { return lookupStringSlice(name, fs) } return nil } func lookupStringSlice(name string, set *flag.FlagSet) []string { f := set.Lookup(name) if f != nil { parsed, err := (f.Value.(*StringSlice)).Value(), error(nil) if err != nil { return nil } return parsed } return nil } // Uint64Flag is a flag with type uint64 type Uint64Flag struct { Name string Usage string EnvVar string Hidden bool Value uint64 Destination *uint64 } // String returns a readable representation of this value // (for usage defaults) func (f Uint64Flag) String() string { return FlagStringer(f) } // GetName returns the name of the flag func (f Uint64Flag) GetName() string { return f.Name } // Uint64 looks up the value of a local Uint64Flag, returns // 0 if not found func (c *Context) Uint64(name string) uint64 { return lookupUint64(name, c.flagSet) } // GlobalUint64 looks up the value of a global Uint64Flag, returns // 0 if not found func (c *Context) GlobalUint64(name string) uint64 { if fs := lookupGlobalFlagSet(name, c); fs != nil { return lookupUint64(name, fs) } return 0 } func lookupUint64(name string, set *flag.FlagSet) uint64 { f := set.Lookup(name) if f != nil { parsed, err := strconv.ParseUint(f.Value.String(), 0, 64) if err != nil { return 0 } return parsed } return 0 } // UintFlag is a flag with type uint type UintFlag struct { Name string Usage string EnvVar string Hidden bool Value uint Destination *uint } // String returns a readable representation of this value // (for usage defaults) func (f UintFlag) String() string { return FlagStringer(f) } // GetName returns the name of the flag func (f UintFlag) GetName() string { return f.Name } // Uint looks up the value of a local UintFlag, returns // 0 if not found func (c *Context) Uint(name string) uint { return lookupUint(name, c.flagSet) } // GlobalUint looks up the value of a global UintFlag, returns // 0 if not found func (c *Context) GlobalUint(name string) uint { if fs := lookupGlobalFlagSet(name, c); fs != nil { return lookupUint(name, fs) } return 0 } func lookupUint(name string, set *flag.FlagSet) uint { f := set.Lookup(name) if f != nil { parsed, err := strconv.ParseUint(f.Value.String(), 0, 64) if err != nil { return 0 } return uint(parsed) } return 0 } ================================================ FILE: vendor/gopkg.in/urfave/cli.v1/funcs.go ================================================ package cli // BashCompleteFunc is an action to execute when the bash-completion flag is set type BashCompleteFunc func(*Context) // BeforeFunc is an action to execute before any subcommands are run, but after // the context is ready if a non-nil error is returned, no subcommands are run type BeforeFunc func(*Context) error // AfterFunc is an action to execute after any subcommands are run, but after the // subcommand has finished it is run even if Action() panics type AfterFunc func(*Context) error // ActionFunc is the action to execute when no subcommands are specified type ActionFunc func(*Context) error // CommandNotFoundFunc is executed if the proper command cannot be found type CommandNotFoundFunc func(*Context, string) // OnUsageErrorFunc is executed if an usage error occurs. This is useful for displaying // customized usage error messages. This function is able to replace the // original error messages. If this function is not set, the "Incorrect usage" // is displayed and the execution is interrupted. type OnUsageErrorFunc func(context *Context, err error, isSubcommand bool) error // FlagStringFunc is used by the help generation to display a flag, which is // expected to be a single line. type FlagStringFunc func(Flag) string ================================================ FILE: vendor/gopkg.in/urfave/cli.v1/generate-flag-types ================================================ #!/usr/bin/env python """ The flag types that ship with the cli library have many things in common, and so we can take advantage of the `go generate` command to create much of the source code from a list of definitions. These definitions attempt to cover the parts that vary between flag types, and should evolve as needed. An example of the minimum definition needed is: { "name": "SomeType", "type": "sometype", "context_default": "nil" } In this example, the code generated for the `cli` package will include a type named `SomeTypeFlag` that is expected to wrap a value of type `sometype`. Fetching values by name via `*cli.Context` will default to a value of `nil`. A more complete, albeit somewhat redundant, example showing all available definition keys is: { "name": "VeryMuchType", "type": "*VeryMuchType", "value": true, "dest": false, "doctail": " which really only wraps a []float64, oh well!", "context_type": "[]float64", "context_default": "nil", "parser": "parseVeryMuchType(f.Value.String())", "parser_cast": "[]float64(parsed)" } The meaning of each field is as follows: name (string) - The type "name", which will be suffixed with `Flag` when generating the type definition for `cli` and the wrapper type for `altsrc` type (string) - The type that the generated `Flag` type for `cli` is expected to "contain" as its `.Value` member value (bool) - Should the generated `cli` type have a `Value` member? dest (bool) - Should the generated `cli` type support a destination pointer? doctail (string) - Additional docs for the `cli` flag type comment context_type (string) - The literal type used in the `*cli.Context` reader func signature context_default (string) - The literal value used as the default by the `*cli.Context` reader funcs when no value is present parser (string) - Literal code used to parse the flag `f`, expected to have a return signature of (value, error) parser_cast (string) - Literal code used to cast the `parsed` value returned from the `parser` code """ from __future__ import print_function, unicode_literals import argparse import json import os import subprocess import sys import tempfile import textwrap class _FancyFormatter(argparse.ArgumentDefaultsHelpFormatter, argparse.RawDescriptionHelpFormatter): pass def main(sysargs=sys.argv[:]): parser = argparse.ArgumentParser( description='Generate flag type code!', formatter_class=_FancyFormatter) parser.add_argument( 'package', type=str, default='cli', choices=_WRITEFUNCS.keys(), help='Package for which flag types will be generated' ) parser.add_argument( '-i', '--in-json', type=argparse.FileType('r'), default=sys.stdin, help='Input JSON file which defines each type to be generated' ) parser.add_argument( '-o', '--out-go', type=argparse.FileType('w'), default=sys.stdout, help='Output file/stream to which generated source will be written' ) parser.epilog = __doc__ args = parser.parse_args(sysargs[1:]) _generate_flag_types(_WRITEFUNCS[args.package], args.out_go, args.in_json) return 0 def _generate_flag_types(writefunc, output_go, input_json): types = json.load(input_json) tmp = tempfile.NamedTemporaryFile(suffix='.go', delete=False) writefunc(tmp, types) tmp.close() new_content = subprocess.check_output( ['goimports', tmp.name] ).decode('utf-8') print(new_content, file=output_go, end='') output_go.flush() os.remove(tmp.name) def _set_typedef_defaults(typedef): typedef.setdefault('doctail', '') typedef.setdefault('context_type', typedef['type']) typedef.setdefault('dest', True) typedef.setdefault('value', True) typedef.setdefault('parser', 'f.Value, error(nil)') typedef.setdefault('parser_cast', 'parsed') def _write_cli_flag_types(outfile, types): _fwrite(outfile, """\ package cli // WARNING: This file is generated! """) for typedef in types: _set_typedef_defaults(typedef) _fwrite(outfile, """\ // {name}Flag is a flag with type {type}{doctail} type {name}Flag struct {{ Name string Usage string EnvVar string Hidden bool """.format(**typedef)) if typedef['value']: _fwrite(outfile, """\ Value {type} """.format(**typedef)) if typedef['dest']: _fwrite(outfile, """\ Destination *{type} """.format(**typedef)) _fwrite(outfile, "\n}\n\n") _fwrite(outfile, """\ // String returns a readable representation of this value // (for usage defaults) func (f {name}Flag) String() string {{ return FlagStringer(f) }} // GetName returns the name of the flag func (f {name}Flag) GetName() string {{ return f.Name }} // {name} looks up the value of a local {name}Flag, returns // {context_default} if not found func (c *Context) {name}(name string) {context_type} {{ return lookup{name}(name, c.flagSet) }} // Global{name} looks up the value of a global {name}Flag, returns // {context_default} if not found func (c *Context) Global{name}(name string) {context_type} {{ if fs := lookupGlobalFlagSet(name, c); fs != nil {{ return lookup{name}(name, fs) }} return {context_default} }} func lookup{name}(name string, set *flag.FlagSet) {context_type} {{ f := set.Lookup(name) if f != nil {{ parsed, err := {parser} if err != nil {{ return {context_default} }} return {parser_cast} }} return {context_default} }} """.format(**typedef)) def _write_altsrc_flag_types(outfile, types): _fwrite(outfile, """\ package altsrc import ( "gopkg.in/urfave/cli.v1" ) // WARNING: This file is generated! """) for typedef in types: _set_typedef_defaults(typedef) _fwrite(outfile, """\ // {name}Flag is the flag type that wraps cli.{name}Flag to allow // for other values to be specified type {name}Flag struct {{ cli.{name}Flag set *flag.FlagSet }} // New{name}Flag creates a new {name}Flag func New{name}Flag(fl cli.{name}Flag) *{name}Flag {{ return &{name}Flag{{{name}Flag: fl, set: nil}} }} // Apply saves the flagSet for later usage calls, then calls the // wrapped {name}Flag.Apply func (f *{name}Flag) Apply(set *flag.FlagSet) {{ f.set = set f.{name}Flag.Apply(set) }} // ApplyWithError saves the flagSet for later usage calls, then calls the // wrapped {name}Flag.ApplyWithError func (f *{name}Flag) ApplyWithError(set *flag.FlagSet) error {{ f.set = set return f.{name}Flag.ApplyWithError(set) }} """.format(**typedef)) def _fwrite(outfile, text): print(textwrap.dedent(text), end='', file=outfile) _WRITEFUNCS = { 'cli': _write_cli_flag_types, 'altsrc': _write_altsrc_flag_types } if __name__ == '__main__': sys.exit(main()) ================================================ FILE: vendor/gopkg.in/urfave/cli.v1/help.go ================================================ package cli import ( "fmt" "io" "os" "strings" "text/tabwriter" "text/template" ) // AppHelpTemplate is the text template for the Default help topic. // cli.go uses text/template to render templates. You can // render custom help text by setting this variable. var AppHelpTemplate = `NAME: {{.Name}}{{if .Usage}} - {{.Usage}}{{end}} USAGE: {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Version}}{{if not .HideVersion}} VERSION: {{.Version}}{{end}}{{end}}{{if .Description}} DESCRIPTION: {{.Description}}{{end}}{{if len .Authors}} AUTHOR{{with $length := len .Authors}}{{if ne 1 $length}}S{{end}}{{end}}: {{range $index, $author := .Authors}}{{if $index}} {{end}}{{$author}}{{end}}{{end}}{{if .VisibleCommands}} COMMANDS:{{range .VisibleCategories}}{{if .Name}} {{.Name}}:{{end}}{{range .VisibleCommands}} {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{end}}{{end}}{{if .VisibleFlags}} GLOBAL OPTIONS: {{range $index, $option := .VisibleFlags}}{{if $index}} {{end}}{{$option}}{{end}}{{end}}{{if .Copyright}} COPYRIGHT: {{.Copyright}}{{end}} ` // CommandHelpTemplate is the text template for the command help topic. // cli.go uses text/template to render templates. You can // render custom help text by setting this variable. var CommandHelpTemplate = `NAME: {{.HelpName}} - {{.Usage}} USAGE: {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}}{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Category}} CATEGORY: {{.Category}}{{end}}{{if .Description}} DESCRIPTION: {{.Description}}{{end}}{{if .VisibleFlags}} OPTIONS: {{range .VisibleFlags}}{{.}} {{end}}{{end}} ` // SubcommandHelpTemplate is the text template for the subcommand help topic. // cli.go uses text/template to render templates. You can // render custom help text by setting this variable. var SubcommandHelpTemplate = `NAME: {{.HelpName}} - {{if .Description}}{{.Description}}{{else}}{{.Usage}}{{end}} USAGE: {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} command{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}} COMMANDS:{{range .VisibleCategories}}{{if .Name}} {{.Name}}:{{end}}{{range .VisibleCommands}} {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}} {{end}}{{if .VisibleFlags}} OPTIONS: {{range .VisibleFlags}}{{.}} {{end}}{{end}} ` var helpCommand = Command{ Name: "help", Aliases: []string{"h"}, Usage: "Shows a list of commands or help for one command", ArgsUsage: "[command]", Action: func(c *Context) error { args := c.Args() if args.Present() { return ShowCommandHelp(c, args.First()) } ShowAppHelp(c) return nil }, } var helpSubcommand = Command{ Name: "help", Aliases: []string{"h"}, Usage: "Shows a list of commands or help for one command", ArgsUsage: "[command]", Action: func(c *Context) error { args := c.Args() if args.Present() { return ShowCommandHelp(c, args.First()) } return ShowSubcommandHelp(c) }, } // Prints help for the App or Command type helpPrinter func(w io.Writer, templ string, data interface{}) // Prints help for the App or Command with custom template function. type helpPrinterCustom func(w io.Writer, templ string, data interface{}, customFunc map[string]interface{}) // HelpPrinter is a function that writes the help output. If not set a default // is used. The function signature is: // func(w io.Writer, templ string, data interface{}) var HelpPrinter helpPrinter = printHelp // HelpPrinterCustom is same as HelpPrinter but // takes a custom function for template function map. var HelpPrinterCustom helpPrinterCustom = printHelpCustom // VersionPrinter prints the version for the App var VersionPrinter = printVersion // ShowAppHelpAndExit - Prints the list of subcommands for the app and exits with exit code. func ShowAppHelpAndExit(c *Context, exitCode int) { ShowAppHelp(c) os.Exit(exitCode) } // ShowAppHelp is an action that displays the help. func ShowAppHelp(c *Context) (err error) { if c.App.CustomAppHelpTemplate == "" { HelpPrinter(c.App.Writer, AppHelpTemplate, c.App) return } customAppData := func() map[string]interface{} { if c.App.ExtraInfo == nil { return nil } return map[string]interface{}{ "ExtraInfo": c.App.ExtraInfo, } } HelpPrinterCustom(c.App.Writer, c.App.CustomAppHelpTemplate, c.App, customAppData()) return nil } // DefaultAppComplete prints the list of subcommands as the default app completion method func DefaultAppComplete(c *Context) { for _, command := range c.App.Commands { if command.Hidden { continue } for _, name := range command.Names() { fmt.Fprintln(c.App.Writer, name) } } } // ShowCommandHelpAndExit - exits with code after showing help func ShowCommandHelpAndExit(c *Context, command string, code int) { ShowCommandHelp(c, command) os.Exit(code) } // ShowCommandHelp prints help for the given command func ShowCommandHelp(ctx *Context, command string) error { // show the subcommand help for a command with subcommands if command == "" { HelpPrinter(ctx.App.Writer, SubcommandHelpTemplate, ctx.App) return nil } for _, c := range ctx.App.Commands { if c.HasName(command) { if c.CustomHelpTemplate != "" { HelpPrinterCustom(ctx.App.Writer, c.CustomHelpTemplate, c, nil) } else { HelpPrinter(ctx.App.Writer, CommandHelpTemplate, c) } return nil } } if ctx.App.CommandNotFound == nil { return NewExitError(fmt.Sprintf("No help topic for '%v'", command), 3) } ctx.App.CommandNotFound(ctx, command) return nil } // ShowSubcommandHelp prints help for the given subcommand func ShowSubcommandHelp(c *Context) error { return ShowCommandHelp(c, c.Command.Name) } // ShowVersion prints the version number of the App func ShowVersion(c *Context) { VersionPrinter(c) } func printVersion(c *Context) { fmt.Fprintf(c.App.Writer, "%v version %v\n", c.App.Name, c.App.Version) } // ShowCompletions prints the lists of commands within a given context func ShowCompletions(c *Context) { a := c.App if a != nil && a.BashComplete != nil { a.BashComplete(c) } } // ShowCommandCompletions prints the custom completions for a given command func ShowCommandCompletions(ctx *Context, command string) { c := ctx.App.Command(command) if c != nil && c.BashComplete != nil { c.BashComplete(ctx) } } func printHelpCustom(out io.Writer, templ string, data interface{}, customFunc map[string]interface{}) { funcMap := template.FuncMap{ "join": strings.Join, } if customFunc != nil { for key, value := range customFunc { funcMap[key] = value } } w := tabwriter.NewWriter(out, 1, 8, 2, ' ', 0) t := template.Must(template.New("help").Funcs(funcMap).Parse(templ)) err := t.Execute(w, data) if err != nil { // If the writer is closed, t.Execute will fail, and there's nothing // we can do to recover. if os.Getenv("CLI_TEMPLATE_ERROR_DEBUG") != "" { fmt.Fprintf(ErrWriter, "CLI TEMPLATE ERROR: %#v\n", err) } return } w.Flush() } func printHelp(out io.Writer, templ string, data interface{}) { printHelpCustom(out, templ, data, nil) } func checkVersion(c *Context) bool { found := false if VersionFlag.GetName() != "" { eachName(VersionFlag.GetName(), func(name string) { if c.GlobalBool(name) || c.Bool(name) { found = true } }) } return found } func checkHelp(c *Context) bool { found := false if HelpFlag.GetName() != "" { eachName(HelpFlag.GetName(), func(name string) { if c.GlobalBool(name) || c.Bool(name) { found = true } }) } return found } func checkCommandHelp(c *Context, name string) bool { if c.Bool("h") || c.Bool("help") { ShowCommandHelp(c, name) return true } return false } func checkSubcommandHelp(c *Context) bool { if c.Bool("h") || c.Bool("help") { ShowSubcommandHelp(c) return true } return false } func checkShellCompleteFlag(a *App, arguments []string) (bool, []string) { if !a.EnableBashCompletion { return false, arguments } pos := len(arguments) - 1 lastArg := arguments[pos] if lastArg != "--"+BashCompletionFlag.GetName() { return false, arguments } return true, arguments[:pos] } func checkCompletions(c *Context) bool { if !c.shellComplete { return false } if args := c.Args(); args.Present() { name := args.First() if cmd := c.App.Command(name); cmd != nil { // let the command handle the completion return false } } ShowCompletions(c) return true } func checkCommandCompletions(c *Context, name string) bool { if !c.shellComplete { return false } ShowCommandCompletions(c, name) return true } ================================================ FILE: vendor/gopkg.in/urfave/cli.v1/runtests ================================================ #!/usr/bin/env python from __future__ import print_function import argparse import os import sys import tempfile from subprocess import check_call, check_output PACKAGE_NAME = os.environ.get( 'CLI_PACKAGE_NAME', 'github.com/urfave/cli' ) def main(sysargs=sys.argv[:]): targets = { 'vet': _vet, 'test': _test, 'gfmrun': _gfmrun, 'toc': _toc, 'gen': _gen, } parser = argparse.ArgumentParser() parser.add_argument( 'target', nargs='?', choices=tuple(targets.keys()), default='test' ) args = parser.parse_args(sysargs[1:]) targets[args.target]() return 0 def _test(): if check_output('go version'.split()).split()[2] < 'go1.2': _run('go test -v .') return coverprofiles = [] for subpackage in ['', 'altsrc']: coverprofile = 'cli.coverprofile' if subpackage != '': coverprofile = '{}.coverprofile'.format(subpackage) coverprofiles.append(coverprofile) _run('go test -v'.split() + [ '-coverprofile={}'.format(coverprofile), ('{}/{}'.format(PACKAGE_NAME, subpackage)).rstrip('/') ]) combined_name = _combine_coverprofiles(coverprofiles) _run('go tool cover -func={}'.format(combined_name)) os.remove(combined_name) def _gfmrun(): go_version = check_output('go version'.split()).split()[2] if go_version < 'go1.3': print('runtests: skip on {}'.format(go_version), file=sys.stderr) return _run(['gfmrun', '-c', str(_gfmrun_count()), '-s', 'README.md']) def _vet(): _run('go vet ./...') def _toc(): _run('node_modules/.bin/markdown-toc -i README.md') _run('git diff --exit-code') def _gen(): go_version = check_output('go version'.split()).split()[2] if go_version < 'go1.5': print('runtests: skip on {}'.format(go_version), file=sys.stderr) return _run('go generate ./...') _run('git diff --exit-code') def _run(command): if hasattr(command, 'split'): command = command.split() print('runtests: {}'.format(' '.join(command)), file=sys.stderr) check_call(command) def _gfmrun_count(): with open('README.md') as infile: lines = infile.read().splitlines() return len(filter(_is_go_runnable, lines)) def _is_go_runnable(line): return line.startswith('package main') def _combine_coverprofiles(coverprofiles): combined = tempfile.NamedTemporaryFile( suffix='.coverprofile', delete=False ) combined.write('mode: set\n') for coverprofile in coverprofiles: with open(coverprofile, 'r') as infile: for line in infile.readlines(): if not line.startswith('mode: '): combined.write(line) combined.flush() name = combined.name combined.close() return name if __name__ == '__main__': sys.exit(main()) ================================================ FILE: vendor/vendor.json ================================================ { "comment": "", "ignore": "test", "package": [ { "checksumSHA1": "b5bkSc2hlmUV7PlLY6JlLwiJpiE=", "path": "bazil.org/fuse", "revision": "371fbbdaa8987b715bdd21d6adc4c9b20155f748", "revisionTime": "2016-08-11T21:22:31Z" }, { "checksumSHA1": "389JFJTJADMtZkTIfdSnsmHVOUs=", "path": "bazil.org/fuse/fs", "revision": "371fbbdaa8987b715bdd21d6adc4c9b20155f748", "revisionTime": "2016-08-11T21:22:31Z" }, { "checksumSHA1": "NPgkh9UWMsaTtsAAs3kPrclHT9Y=", "path": "bazil.org/fuse/fuseutil", "revision": "371fbbdaa8987b715bdd21d6adc4c9b20155f748", "revisionTime": "2016-08-11T21:22:31Z" }, { "checksumSHA1": "z+M6FYl9EKsoZZMLcT0Ktwfk8pI=", "path": "github.com/Azure/azure-pipeline-go/pipeline", "revision": "7571e8eb0876932ab505918ff7ed5107773e5ee2", "revisionTime": "2018-06-07T21:19:23Z" }, { "checksumSHA1": "5nsGu77r69lloEWbFhMof2UA9rY=", "path": "github.com/Azure/azure-storage-blob-go/2018-03-28/azblob", "revision": "eaae161d9d5e07363f04ddb19d84d57efc66d1a1", "revisionTime": "2018-07-12T00:56:34Z" }, { "checksumSHA1": "QC55lHNOv1+UAL2xtIHw17MJ8J8=", "path": "github.com/StackExchange/wmi", "revision": "5d049714c4a64225c3c79a7cf7d02f7fb5b96338", "revisionTime": "2018-01-16T20:38:02Z" }, { "checksumSHA1": "USkefO0g1U9mr+8hagv3fpSkrxg=", "path": "github.com/aristanetworks/goarista/monotime", "revision": "ea17b1a17847fb6e4c0a91de0b674704693469b0", "revisionTime": "2017-02-10T01:56:32Z" }, { "checksumSHA1": "gZHfOHB+zlaNWUjdlu1nFD7VBX0=", "path": "github.com/btcsuite/btcutil", "revision": "9e5f4b9a998d263e3ce9c56664a7816001ac8000", "revisionTime": "2019-04-25T00:47:09Z" }, { "checksumSHA1": "oQgLy8KmIOVov04WXH7KgU1bszc=", "path": "github.com/btcsuite/btcutil/base58", "revision": "9e5f4b9a998d263e3ce9c56664a7816001ac8000", "revisionTime": "2019-04-25T00:47:09Z" }, { "checksumSHA1": "BBnsAiKyNfocRwmEav5EJpVCwzk=", "path": "github.com/btcsuite/btcutil/bech32", "revision": "9e5f4b9a998d263e3ce9c56664a7816001ac8000", "revisionTime": "2019-04-25T00:47:09Z" }, { "checksumSHA1": "cDMtzKmdTx4CcIpP4broa+16X9g=", "path": "github.com/cespare/cp", "revision": "165db2f241fd235aec29ba6d9b1ccd5f1c14637c", "revisionTime": "2015-01-22T07:26:53Z" }, { "checksumSHA1": "7gK+lSShSu1NRw83/A95BcgMqsI=", "path": "github.com/codahale/hdrhistogram", "revision": "3a0bb77429bd3a61596f5e8a3172445844342120", "revisionTime": "2016-10-10T02:54:55Z" }, { "checksumSHA1": "dvabztWVQX8f6oMLRyv4dLH+TGY=", "path": "github.com/davecgh/go-spew/spew", "revision": "346938d642f2ec3594ed81d874461961cd0faa76", "revisionTime": "2016-10-29T20:57:26Z" }, { "checksumSHA1": "1xK7ycc1ICRInk/S9iiyB9Rpv50=", "path": "github.com/deckarep/golang-set", "revision": "504e848d77ea4752b3057b8fb46da0e7f746ccf3", "revisionTime": "2018-06-03T19:32:48Z" }, { "checksumSHA1": "2Fy1Y6Z3lRRX1891WF/+HT4XS2I=", "path": "github.com/dgrijalva/jwt-go", "revision": "2268707a8f0843315e2004ee4f1d021dc08baedf", "revisionTime": "2017-02-01T22:58:49Z" }, { "checksumSHA1": "Ad8LPSCP9HctFrmskh+S5HpHXcs=", "path": "github.com/docker/docker/pkg/reexec", "revision": "8e610b2b55bfd1bfa9436ab110d311f5e8a74dcb", "revisionTime": "2018-06-25T18:44:42Z" }, { "checksumSHA1": "zYnPsNAVm1/ViwCkN++dX2JQhBo=", "path": "github.com/edsrzf/mmap-go", "revision": "935e0e8a636ca4ba70b713f3e38a19e1b77739e8", "revisionTime": "2016-05-12T03:30:02Z" }, { "checksumSHA1": "jElNoLEe7m/iaoF1vYIHyNaS2SE=", "path": "github.com/elastic/gosigar", "revision": "37f05ff46ffa7a825d1b24cf2b62d4a4c1a9d2e8", "revisionTime": "2018-03-30T10:04:40Z" }, { "checksumSHA1": "qDsgp2kAeI9nhj565HUScaUyjU4=", "path": "github.com/elastic/gosigar/sys/windows", "revision": "a3814ce5008e612a0c6d027608b54e1d0d9a5613", "revisionTime": "2018-01-22T22:25:45Z" }, { "checksumSHA1": "7oFpbmDfGobwKsFLIf6wMUvVoKw=", "path": "github.com/fatih/color", "revision": "5ec5d9d3c2cf82e9688b34e9bc27a94d616a7193", "revisionTime": "2017-02-09T08:00:14Z" }, { "checksumSHA1": "Jq1rrHSGPfh689nA2hL1QVb62zE=", "path": "github.com/fjl/memsize", "revision": "ca190fb6ffbc076ff49197b7168a760f30182d2e", "revisionTime": "2018-04-18T12:24:29Z" }, { "checksumSHA1": "Z13QAYTqeW4cTiglkc2F05gWLu4=", "path": "github.com/fjl/memsize/memsizeui", "revision": "ca190fb6ffbc076ff49197b7168a760f30182d2e", "revisionTime": "2018-04-18T12:24:29Z" }, { "checksumSHA1": "0orwvPL96wFckVJyPl39fz2QsgA=", "path": "github.com/gizak/termui", "revision": "991cd3d3809135dc24daf6188dc6edcaf3d7d2d9", "revisionTime": "2017-01-17T22:23:42Z" }, { "checksumSHA1": "gxV/cPPLkByTdY8y172t7v4qcZA=", "path": "github.com/go-ole/go-ole", "revision": "a41e3c4b706f6ae8dfbff342b06e40fa4d2d0506", "revisionTime": "2017-11-10T16:07:06Z" }, { "checksumSHA1": "PArleDBtadu2qO4hJwHR8a3IOTA=", "path": "github.com/go-ole/go-ole/oleutil", "revision": "a41e3c4b706f6ae8dfbff342b06e40fa4d2d0506", "revisionTime": "2017-11-10T16:07:06Z" }, { "checksumSHA1": "KZ3QD2QgUS4RcoKiA3mn5pSlJxQ=", "path": "github.com/go-stack/stack", "revision": "54be5f394ed2c3e19dac9134a40a95ba5a017f7b", "revisionTime": "2017-07-10T16:04:46Z" }, { "checksumSHA1": "yqF125xVSkmfLpIVGrLlfE05IUk=", "path": "github.com/golang/protobuf/proto", "revision": "748d386b5c1ea99658fd69fe9f03991ce86a90c1", "revisionTime": "2017-07-26T21:28:29Z" }, { "checksumSHA1": "Z1gJ3PKzwBpOoPnTSEM5yd0zHYA=", "path": "github.com/golang/protobuf/protoc-gen-go/descriptor", "revision": "748d386b5c1ea99658fd69fe9f03991ce86a90c1", "revisionTime": "2017-07-26T21:28:29Z" }, { "checksumSHA1": "p/8vSviYF91gFflhrt5vkyksroo=", "path": "github.com/golang/snappy", "revision": "553a641470496b2327abcac10b36396bd98e45c9", "revisionTime": "2017-02-15T23:32:05Z" }, { "checksumSHA1": "D8ksSACYQOb+3nx6lHB8kR2VCOo=", "path": "github.com/gosuri/uilive", "revision": "ac356e6e42cd31fcef8e6aec13ae9ed6fe87713e", "revisionTime": "2017-03-23T04:15:06Z" }, { "checksumSHA1": "zTVV9gr0Qn6mDWQ5ZTiVdIJV3CE=", "path": "github.com/gosuri/uiprogress", "revision": "d0567a9d84a1c40dd7568115ea66f4887bf57b33", "revisionTime": "2017-02-24T06:39:37Z" }, { "checksumSHA1": "1dKG7apJl3CGGIrmXMHZp3emYTQ=", "path": "github.com/gosuri/uiprogress/util/strutil", "revision": "d0567a9d84a1c40dd7568115ea66f4887bf57b33", "revisionTime": "2017-02-24T06:39:37Z" }, { "checksumSHA1": "d9PxF1XQGLMJZRct2R8qVM/eYlE=", "path": "github.com/hashicorp/golang-lru", "revision": "0a025b7e63adc15a622f29b0b2c4c3848243bbf6", "revisionTime": "2016-08-13T22:13:03Z" }, { "checksumSHA1": "9hffs0bAIU6CquiRhKQdzjHnKt0=", "path": "github.com/hashicorp/golang-lru/simplelru", "revision": "0a025b7e63adc15a622f29b0b2c4c3848243bbf6", "revisionTime": "2016-08-13T22:13:03Z" }, { "checksumSHA1": "f55gR+6YClh0i/FOhdy66SOUiwY=", "path": "github.com/huin/goupnp", "revision": "679507af18f3c7ba2bcc7905392ce23e148661c3", "revisionTime": "2016-12-24T10:41:01Z" }, { "checksumSHA1": "U3NsxkodNX/tmOqkVDnGFRZ6dI4=", "path": "github.com/huin/goupnp/dcps/internetgateway1", "revision": "679507af18f3c7ba2bcc7905392ce23e148661c3", "revisionTime": "2016-12-24T10:41:01Z" }, { "checksumSHA1": "znTn+P/iEwi6Ax7r3N0GikeYMlk=", "path": "github.com/huin/goupnp/dcps/internetgateway2", "revision": "679507af18f3c7ba2bcc7905392ce23e148661c3", "revisionTime": "2016-12-24T10:41:01Z" }, { "checksumSHA1": "RLygtUlTOCtrI3KMswYLJnte1OU=", "path": "github.com/huin/goupnp/httpu", "revision": "679507af18f3c7ba2bcc7905392ce23e148661c3", "revisionTime": "2016-12-24T10:41:01Z" }, { "checksumSHA1": "+S2t2qKK+wcpM+07eW7dCK/6oFU=", "path": "github.com/huin/goupnp/scpd", "revision": "679507af18f3c7ba2bcc7905392ce23e148661c3", "revisionTime": "2016-12-24T10:41:01Z" }, { "checksumSHA1": "80ieA8iPFaFeQFw++EiYn4jhcGs=", "path": "github.com/huin/goupnp/soap", "revision": "679507af18f3c7ba2bcc7905392ce23e148661c3", "revisionTime": "2016-12-24T10:41:01Z" }, { "checksumSHA1": "iqPUC/MoFGaRQnAudYGAW9BvF2o=", "path": "github.com/huin/goupnp/ssdp", "revision": "679507af18f3c7ba2bcc7905392ce23e148661c3", "revisionTime": "2016-12-24T10:41:01Z" }, { "checksumSHA1": "6tNwbL5tUS0dxYzADKVZtI2d/lE=", "path": "github.com/influxdata/influxdb/client", "revision": "a55dd0f50edd14c9c798d3564189eb4f53914309", "revisionTime": "2017-10-09T17:24:46Z" }, { "checksumSHA1": "O4XpbSNeUhSIMD2FWtQximJiFIs=", "path": "github.com/influxdata/influxdb/client/v2", "revision": "b36b9f109f2da91c8941679caf5356e08eee0b2b", "revisionTime": "2018-01-17T01:42:09Z" }, { "checksumSHA1": "cfumoC9gHEUROd+fA8qK3WLFAZQ=", "path": "github.com/influxdata/influxdb/models", "revision": "b36b9f109f2da91c8941679caf5356e08eee0b2b", "revisionTime": "2018-01-17T01:42:09Z" }, { "checksumSHA1": "Z0Bb5PWa5WL/j5Dm2KJCLGn1l7U=", "path": "github.com/influxdata/influxdb/pkg/escape", "revision": "01288bdb0883a01cac999326bd34421b29acaec8", "revisionTime": "2018-02-21T22:33:40Z" }, { "checksumSHA1": "vTGKMIfiMwz43y5bsgx9PrL+AVw=", "path": "github.com/jackpal/go-nat-pmp", "revision": "1fa385a6f45828c83361136b45b1a21a12139493", "revisionTime": "2016-06-03T03:41:37Z" }, { "checksumSHA1": "gKyBj05YkfuLFruAyPZ4KV9nFp8=", "path": "github.com/julienschmidt/httprouter", "revision": "975b5c4c7c21c0e3d2764200bf2aa8e34657ae6e", "revisionTime": "2017-04-30T22:20:11Z" }, { "checksumSHA1": "UpjhOUZ1+0zNt+iIvdtECSHXmTs=", "path": "github.com/karalabe/hid", "revision": "f00545f9f3748e591590be3732d913c77525b10f", "revisionTime": "2017-08-21T10:38:37Z", "tree": true }, { "checksumSHA1": "7hln62oZPZmyqEmgXaybf9WxQ7A=", "path": "github.com/maruel/panicparse/stack", "revision": "ad661195ed0e88491e0f14be6613304e3b1141d6", "revisionTime": "2016-07-20T14:16:34Z" }, { "checksumSHA1": "I4njd26dG5hxFT2nawuByM4pxzY=", "path": "github.com/mattn/go-colorable", "revision": "5411d3eea5978e6cdc258b30de592b60df6aba96", "revisionTime": "2017-02-10T17:28:01Z" }, { "checksumSHA1": "EkT5JmFvz3zOPWappEFyYWUaeY0=", "path": "github.com/mattn/go-isatty", "revision": "281032e84ae07510239465db46bf442aa44b953a", "revisionTime": "2017-02-09T17:56:15Z" }, { "checksumSHA1": "MNkKJyk2TazKMJYbal5wFHybpyA=", "path": "github.com/mattn/go-runewidth", "revision": "14207d285c6c197daabb5c9793d63e7af9ab2d50", "revisionTime": "2017-02-01T02:35:40Z" }, { "checksumSHA1": "L3leymg2RT8hFl5uL+5KP/LpBkg=", "path": "github.com/mitchellh/go-wordwrap", "revision": "ad45545899c7b13c020ea92b2072220eefad42b8", "revisionTime": "2015-03-14T17:03:34Z" }, { "checksumSHA1": "2jsbDTvwxafPp7FJjJ8IIFlTLjs=", "path": "github.com/mohae/deepcopy", "revision": "c48cc78d482608239f6c4c92a4abd87eb8761c90", "revisionTime": "2017-09-29T03:49:55Z" }, { "checksumSHA1": "FYM/8R2CqS6PSNAoKl6X5gNJ20A=", "path": "github.com/naoina/toml", "revision": "9fafd69674167c06933b1787ae235618431ce87f", "revisionTime": "2017-09-18T21:04:37Z" }, { "checksumSHA1": "xZBlSMT5o/A+EDOro6KbfHZwSNc=", "path": "github.com/naoina/toml/ast", "revision": "eb52202f758b98ac5b1a8eb26f36455205d688f0", "revisionTime": "2017-04-03T15:03:10Z" }, { "checksumSHA1": "R1h9XHH3dTmLq7yKL9/uW0xFwfs=", "path": "github.com/nsf/termbox-go", "revision": "3540b76b9c77679aeffd0a47e00243fb0ce47133", "revisionTime": "2017-02-11T01:27:00Z" }, { "checksumSHA1": "h+oCMj21PiQfIdBog0eyUtF1djs=", "path": "github.com/olekukonko/tablewriter", "revision": "febf2d34b54a69ce7530036c7503b1c9fbfdf0bb", "revisionTime": "2017-01-28T05:05:32Z" }, { "checksumSHA1": "wIcN7tZiF441h08RHAm4NV8cYO4=", "path": "github.com/opentracing/opentracing-go", "revision": "bd9c3193394760d98b2fa6ebb2291f0cd1d06a7d", "revisionTime": "2018-06-06T20:41:48Z" }, { "checksumSHA1": "uhDxBvLEqRAMZKgpTZ8MFuLIIM8=", "path": "github.com/opentracing/opentracing-go/ext", "revision": "bd9c3193394760d98b2fa6ebb2291f0cd1d06a7d", "revisionTime": "2018-06-06T20:41:48Z" }, { "checksumSHA1": "tnkdNJbJxNKuPZMWapP1xhKIIGw=", "path": "github.com/opentracing/opentracing-go/log", "revision": "bd9c3193394760d98b2fa6ebb2291f0cd1d06a7d", "revisionTime": "2018-06-06T20:41:48Z" }, { "checksumSHA1": "Se195FlZ160eaEk/uVx4KdTPSxU=", "path": "github.com/pborman/uuid", "revision": "1b00554d822231195d1babd97ff4a781231955c9", "revisionTime": "2017-01-12T15:04:04Z" }, { "checksumSHA1": "lSRg5clrIZUxq4aaExbpnpAgtWA=", "path": "github.com/peterh/liner", "revision": "a37ad39843113264dae84a5d89fcee28f50b35c6", "revisionTime": "2017-09-02T20:46:57Z" }, { "checksumSHA1": "xCv4GBFyw07vZkVtKF/XrUnkHRk=", "path": "github.com/pkg/errors", "revision": "e881fd58d78e04cf6d0de1217f8707c8cc2249bc", "revisionTime": "2017-12-16T07:03:16Z" }, { "checksumSHA1": "LuFv4/jlrmFNnDb/5SCSEPAM9vU=", "path": "github.com/pmezard/go-difflib/difflib", "revision": "792786c7400a136282c1664665ae0a8db921c6c2", "revisionTime": "2016-01-10T10:55:54Z" }, { "checksumSHA1": "WbbxCn2jUYIL5viqLo0BKXEdPrQ=", "path": "github.com/prometheus/prometheus/util/flock", "revision": "3101606756c53221ed58ba94ecba6b26adf89dcc", "revisionTime": "2017-08-14T17:01:13Z" }, { "checksumSHA1": "lU41NL1TEDtsrr0yUdp3SMB4Y9o=", "path": "github.com/rjeczalik/notify", "revision": "0f065fa99b48b842c3fd3e2c8b194c6f2b69f6b8", "revisionTime": "2018-08-27T19:31:19Z" }, { "checksumSHA1": "5uqO4ITTDMklKi3uNaE/D9LQ5nM=", "path": "github.com/robertkrimen/otto", "revision": "6a77b7cbc37d0c39f7d5fa5766826e541df31fd5", "revisionTime": "2017-02-05T01:36:59Z" }, { "checksumSHA1": "qgziiO3/QDVJMKw2nGrUbC8QldY=", "path": "github.com/robertkrimen/otto/ast", "revision": "6a77b7cbc37d0c39f7d5fa5766826e541df31fd5", "revisionTime": "2017-02-05T01:36:59Z" }, { "checksumSHA1": "L0KsB2EzTlPgv0iae3q3SukNW7U=", "path": "github.com/robertkrimen/otto/dbg", "revision": "6a77b7cbc37d0c39f7d5fa5766826e541df31fd5", "revisionTime": "2017-02-05T01:36:59Z" }, { "checksumSHA1": "euDLJKhw4doeTSxjEoezjxYXLzs=", "path": "github.com/robertkrimen/otto/file", "revision": "6a77b7cbc37d0c39f7d5fa5766826e541df31fd5", "revisionTime": "2017-02-05T01:36:59Z" }, { "checksumSHA1": "LLuLITFO8chqSG0+APJIy5NtOHU=", "path": "github.com/robertkrimen/otto/parser", "revision": "6a77b7cbc37d0c39f7d5fa5766826e541df31fd5", "revisionTime": "2017-02-05T01:36:59Z" }, { "checksumSHA1": "7J/7NaYRqKhBvZ+dTIutsEoEgFw=", "path": "github.com/robertkrimen/otto/registry", "revision": "6a77b7cbc37d0c39f7d5fa5766826e541df31fd5", "revisionTime": "2017-02-05T01:36:59Z" }, { "checksumSHA1": "/jMXYuXycBpTqWhRyJ2xsqvHvQI=", "path": "github.com/robertkrimen/otto/token", "revision": "6a77b7cbc37d0c39f7d5fa5766826e541df31fd5", "revisionTime": "2017-02-05T01:36:59Z" }, { "checksumSHA1": "xGlhb4NZjBVCNSbb7GIMvhn6mQg=", "path": "github.com/robfig/cron", "revision": "b41be1df696709bb6395fe435af20370037c0b4c", "revisionTime": "2018-05-05T20:34:41Z" }, { "checksumSHA1": "LjPdvMphElL0GOVNQCsmZMVgWIw=", "path": "github.com/rs/cors", "revision": "a62a804a8a009876ca59105f7899938a1349f4b3", "revisionTime": "2016-06-17T23:19:35Z" }, { "checksumSHA1": "hCRfPlNpqv8tvVivLzmXsoUOf1c=", "path": "github.com/rs/xhandler", "revision": "ed27b6fd65218132ee50cd95f38474a3d8a2cd12", "revisionTime": "2016-06-18T19:32:21Z" }, { "checksumSHA1": "mGbTYZ8dHVTiPTTJu3ktp+84pPI=", "path": "github.com/stretchr/testify/assert", "revision": "890a5c3458b43e6104ff5da8dfa139d013d77544", "revisionTime": "2017-07-05T02:17:15Z" }, { "checksumSHA1": "7vs6dSc1PPGBKyzb/SCIyeMJPLQ=", "path": "github.com/stretchr/testify/require", "revision": "890a5c3458b43e6104ff5da8dfa139d013d77544", "revisionTime": "2017-07-05T02:17:15Z" }, { "checksumSHA1": "k6zbR5hiI10hkWtiK91rIY5s5/E=", "path": "github.com/syndtr/goleveldb/leveldb", "revision": "c4c61651e9e37fa117f53c5a906d3b63090d8445", "revisionTime": "2018-07-08T03:05:51Z" }, { "checksumSHA1": "EKIow7XkgNdWvR/982ffIZxKG8Y=", "path": "github.com/syndtr/goleveldb/leveldb/cache", "revision": "c4c61651e9e37fa117f53c5a906d3b63090d8445", "revisionTime": "2018-07-08T03:05:51Z" }, { "checksumSHA1": "5KPgnvCPlR0ysDAqo6jApzRQ3tw=", "path": "github.com/syndtr/goleveldb/leveldb/comparer", "revision": "c4c61651e9e37fa117f53c5a906d3b63090d8445", "revisionTime": "2018-07-08T03:05:51Z" }, { "checksumSHA1": "1DRAxdlWzS4U0xKN/yQ/fdNN7f0=", "path": "github.com/syndtr/goleveldb/leveldb/errors", "revision": "c4c61651e9e37fa117f53c5a906d3b63090d8445", "revisionTime": "2018-07-08T03:05:51Z" }, { "checksumSHA1": "eqKeD6DS7eNCtxVYZEHHRKkyZrw=", "path": "github.com/syndtr/goleveldb/leveldb/filter", "revision": "c4c61651e9e37fa117f53c5a906d3b63090d8445", "revisionTime": "2018-07-08T03:05:51Z" }, { "checksumSHA1": "weSsccMav4BCerDpSLzh3mMxAYo=", "path": "github.com/syndtr/goleveldb/leveldb/iterator", "revision": "c4c61651e9e37fa117f53c5a906d3b63090d8445", "revisionTime": "2018-07-08T03:05:51Z" }, { "checksumSHA1": "gJY7bRpELtO0PJpZXgPQ2BYFJ88=", "path": "github.com/syndtr/goleveldb/leveldb/journal", "revision": "c4c61651e9e37fa117f53c5a906d3b63090d8445", "revisionTime": "2018-07-08T03:05:51Z" }, { "checksumSHA1": "MtYY1b2234y/MlS+djL8tXVAcQs=", "path": "github.com/syndtr/goleveldb/leveldb/memdb", "revision": "c4c61651e9e37fa117f53c5a906d3b63090d8445", "revisionTime": "2018-07-08T03:05:51Z" }, { "checksumSHA1": "UmQeotV+m8/FduKEfLOhjdp18rs=", "path": "github.com/syndtr/goleveldb/leveldb/opt", "revision": "c4c61651e9e37fa117f53c5a906d3b63090d8445", "revisionTime": "2018-07-08T03:05:51Z" }, { "checksumSHA1": "ZnyuciM+R19NG8L5YS3TIJdo1e8=", "path": "github.com/syndtr/goleveldb/leveldb/storage", "revision": "c4c61651e9e37fa117f53c5a906d3b63090d8445", "revisionTime": "2018-07-08T03:05:51Z" }, { "checksumSHA1": "gWFPMz8OQeul0t54RM66yMTX49g=", "path": "github.com/syndtr/goleveldb/leveldb/table", "revision": "c4c61651e9e37fa117f53c5a906d3b63090d8445", "revisionTime": "2018-07-08T03:05:51Z" }, { "checksumSHA1": "V/Dh7NV0/fy/5jX1KaAjmGcNbzI=", "path": "github.com/syndtr/goleveldb/leveldb/util", "revision": "c4c61651e9e37fa117f53c5a906d3b63090d8445", "revisionTime": "2018-07-08T03:05:51Z" }, { "checksumSHA1": "SsMMqb3xn7hg1ZX5ugwZz5rzpx0=", "path": "github.com/tyler-smith/go-bip39", "revision": "dbb3b84ba2ef14e894f5e33d6c6e43641e665738", "revisionTime": "2018-10-17T06:06:43Z" }, { "checksumSHA1": "xa+UUbqD3zPfa8mKAxWabRsqSzM=", "path": "github.com/tyler-smith/go-bip39/wordlists", "revision": "dbb3b84ba2ef14e894f5e33d6c6e43641e665738", "revisionTime": "2018-10-17T06:06:43Z" }, { "checksumSHA1": "nD6S4KB0S+YHxVMDDE+w3PyXaMk=", "path": "github.com/uber/jaeger-client-go", "revision": "f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8", "revisionTime": "2018-06-07T15:18:42Z" }, { "checksumSHA1": "cjhPfiQbTqfkHmZM3Bi+Bm8qgN4=", "path": "github.com/uber/jaeger-client-go/config", "revision": "f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8", "revisionTime": "2018-06-07T15:18:42Z" }, { "checksumSHA1": "KM5UXTWkHULmw0dDRNuk8ogWyGs=", "path": "github.com/uber/jaeger-client-go/internal/baggage", "revision": "f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8", "revisionTime": "2018-06-07T15:18:42Z" }, { "checksumSHA1": "tZqlcHV1XoLdZp9jfnydzsZAvYo=", "path": "github.com/uber/jaeger-client-go/internal/baggage/remote", "revision": "f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8", "revisionTime": "2018-06-07T15:18:42Z" }, { "checksumSHA1": "QB0L0GrzyMGQp6ivkkxp7a1DPsE=", "path": "github.com/uber/jaeger-client-go/internal/spanlog", "revision": "f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8", "revisionTime": "2018-06-07T15:18:42Z" }, { "checksumSHA1": "79HRO/+ekkpwqDB/OMiW+AHJtlE=", "path": "github.com/uber/jaeger-client-go/internal/throttler", "revision": "f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8", "revisionTime": "2018-06-07T15:18:42Z" }, { "checksumSHA1": "OVQDWFtFMs+NODe0F/S5kYViQco=", "path": "github.com/uber/jaeger-client-go/internal/throttler/remote", "revision": "f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8", "revisionTime": "2018-06-07T15:18:42Z" }, { "checksumSHA1": "tMP/vxbHwNAbOEaUhic5/meKfac=", "path": "github.com/uber/jaeger-client-go/log", "revision": "f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8", "revisionTime": "2018-06-07T15:18:42Z" }, { "checksumSHA1": "j4WrA/B2SJCqHxttCQ+TYbmtQqE=", "path": "github.com/uber/jaeger-client-go/rpcmetrics", "revision": "f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8", "revisionTime": "2018-06-07T15:18:42Z" }, { "checksumSHA1": "+ffspyTBQLql2UiU6muvfWR/m1o=", "path": "github.com/uber/jaeger-client-go/thrift", "revision": "f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8", "revisionTime": "2018-06-07T15:18:42Z" }, { "checksumSHA1": "fMIQ4sJFCkqFYhXvvLKIlofqxvY=", "path": "github.com/uber/jaeger-client-go/thrift-gen/agent", "revision": "f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8", "revisionTime": "2018-06-07T15:18:42Z" }, { "checksumSHA1": "fRR2p+JAp7paApf32YuQuWU7yzY=", "path": "github.com/uber/jaeger-client-go/thrift-gen/baggage", "revision": "f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8", "revisionTime": "2018-06-07T15:18:42Z" }, { "checksumSHA1": "JZkMEOmiOFFEuGCsDOVLK5RzvMM=", "path": "github.com/uber/jaeger-client-go/thrift-gen/jaeger", "revision": "f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8", "revisionTime": "2018-06-07T15:18:42Z" }, { "checksumSHA1": "0teQUhTqTE1fLs+vbnTTzWOqdEQ=", "path": "github.com/uber/jaeger-client-go/thrift-gen/sampling", "revision": "f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8", "revisionTime": "2018-06-07T15:18:42Z" }, { "checksumSHA1": "Nx5witfz05BSO2YlFzh2Gno6bA0=", "path": "github.com/uber/jaeger-client-go/thrift-gen/zipkincore", "revision": "f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8", "revisionTime": "2018-06-07T15:18:42Z" }, { "checksumSHA1": "DKwwIk9vq53IKO7RKccat9cnqeo=", "path": "github.com/uber/jaeger-client-go/utils", "revision": "f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8", "revisionTime": "2018-06-07T15:18:42Z" }, { "checksumSHA1": "k1iaOSBmLp3TpGvHNnRQXyJfwyI=", "path": "github.com/uber/jaeger-lib/metrics", "revision": "a51202d6f4a7e5a219e3841a43614ff7187ae7f1", "revisionTime": "2018-06-15T20:27:29Z" }, { "checksumSHA1": "TT1rac6kpQp2vz24m5yDGUNQ/QQ=", "path": "golang.org/x/crypto/cast5", "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", "revisionTime": "2017-09-25T11:22:06Z" }, { "checksumSHA1": "IQkUIOnvlf0tYloFx9mLaXSvXWQ=", "path": "golang.org/x/crypto/curve25519", "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", "revisionTime": "2017-09-25T11:22:06Z" }, { "checksumSHA1": "1hwn8cgg4EVXhCpJIqmMbzqnUo0=", "path": "golang.org/x/crypto/ed25519", "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", "revisionTime": "2017-09-25T11:22:06Z" }, { "checksumSHA1": "LXFcVx8I587SnWmKycSDEq9yvK8=", "path": "golang.org/x/crypto/ed25519/internal/edwards25519", "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", "revisionTime": "2017-09-25T11:22:06Z" }, { "checksumSHA1": "IIhFTrLlmlc6lEFSitqi4aw2lw0=", "path": "golang.org/x/crypto/openpgp", "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", "revisionTime": "2017-09-25T11:22:06Z" }, { "checksumSHA1": "olOKkhrdkYQHZ0lf1orrFQPQrv4=", "path": "golang.org/x/crypto/openpgp/armor", "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", "revisionTime": "2017-09-25T11:22:06Z" }, { "checksumSHA1": "eo/KtdjieJQXH7Qy+faXFcF70ME=", "path": "golang.org/x/crypto/openpgp/elgamal", "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", "revisionTime": "2017-09-25T11:22:06Z" }, { "checksumSHA1": "rlxVSaGgqdAgwblsErxTxIfuGfg=", "path": "golang.org/x/crypto/openpgp/errors", "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", "revisionTime": "2017-09-25T11:22:06Z" }, { "checksumSHA1": "Pq88+Dgh04UdXWZN6P+bLgYnbRc=", "path": "golang.org/x/crypto/openpgp/packet", "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", "revisionTime": "2017-09-25T11:22:06Z" }, { "checksumSHA1": "s2qT4UwvzBSkzXuiuMkowif1Olw=", "path": "golang.org/x/crypto/openpgp/s2k", "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", "revisionTime": "2017-09-25T11:22:06Z" }, { "checksumSHA1": "1MGpGDQqnUoRpv7VEcQrXOBydXE=", "path": "golang.org/x/crypto/pbkdf2", "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", "revisionTime": "2017-09-25T11:22:06Z" }, { "checksumSHA1": "y/oIaxq2d3WPizRZfVjo8RCRYTU=", "path": "golang.org/x/crypto/ripemd160", "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", "revisionTime": "2017-09-25T11:22:06Z" }, { "checksumSHA1": "dHh6VeHcbNg11miGjGEl8LbPe7w=", "path": "golang.org/x/crypto/scrypt", "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", "revisionTime": "2017-09-25T11:22:06Z" }, { "checksumSHA1": "Wi44TcpIOXdojyVWkvyOBnBKIS4=", "path": "golang.org/x/crypto/ssh", "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", "revisionTime": "2017-09-25T11:22:06Z" }, { "checksumSHA1": "5Yb2z6UO+Arm/TEd+OEtdnwOt1A=", "path": "golang.org/x/crypto/ssh/terminal", "revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", "revisionTime": "2017-09-25T11:22:06Z" }, { "checksumSHA1": "Y+HGqEkYM15ir+J93MEaHdyFy0c=", "path": "golang.org/x/net/context", "revision": "a6577fac2d73be281a500b310739095313165611", "revisionTime": "2017-03-08T20:54:49Z" }, { "checksumSHA1": "vqc3a+oTUGX8PmD0TS+qQ7gmN8I=", "path": "golang.org/x/net/html", "revision": "b4690f45fa1cafc47b1c280c2e75116efe40cc13", "revisionTime": "2017-02-15T08:41:58Z" }, { "checksumSHA1": "00eQaGynDYrv3tL+C7l9xH0IDZg=", "path": "golang.org/x/net/html/atom", "revision": "b4690f45fa1cafc47b1c280c2e75116efe40cc13", "revisionTime": "2017-02-15T08:41:58Z" }, { "checksumSHA1": "barUU39reQ7LdgYLA323hQ/UGy4=", "path": "golang.org/x/net/html/charset", "revision": "b4690f45fa1cafc47b1c280c2e75116efe40cc13", "revisionTime": "2017-02-15T08:41:58Z" }, { "checksumSHA1": "RcrB7tgYS/GMW4QrwVdMOTNqIU8=", "path": "golang.org/x/net/idna", "revision": "5ccada7d0a7ba9aeb5d3aca8d3501b4c2a509fec", "revisionTime": "2018-01-12T01:53:59Z" }, { "checksumSHA1": "7EZyXN0EmZLgGxZxK01IJua4c8o=", "path": "golang.org/x/net/websocket", "revision": "b4690f45fa1cafc47b1c280c2e75116efe40cc13", "revisionTime": "2017-02-15T08:41:58Z" }, { "checksumSHA1": "4TEYFKrAUuwBMqExjQBsnf/CgjQ=", "path": "golang.org/x/sync/syncmap", "revision": "f52d1811a62927559de87708c8913c1650ce4f26", "revisionTime": "2017-05-17T20:25:26Z" }, { "checksumSHA1": "r1jWq0V3AI5DLN0aCnXXMH/is9Q=", "path": "golang.org/x/sys/unix", "revision": "1e2299c37cc91a509f1b12369872d27be0ce98a6", "revisionTime": "2017-11-09T13:50:42Z" }, { "checksumSHA1": "ck5uxoEeMDUL/QqPvGvBmcbsJzg=", "path": "golang.org/x/sys/windows", "revision": "1e2299c37cc91a509f1b12369872d27be0ce98a6", "revisionTime": "2017-11-09T13:50:42Z" }, { "checksumSHA1": "Mr4ur60bgQJnQFfJY0dGtwWwMPE=", "path": "golang.org/x/text/encoding", "revision": "85c29909967d7f171f821e7a42e7b7af76fb9598", "revisionTime": "2017-02-11T12:01:23Z" }, { "checksumSHA1": "3VrGQv2Z1t3JhwzGDLCz7DvnowA=", "path": "golang.org/x/text/encoding/charmap", "revision": "85c29909967d7f171f821e7a42e7b7af76fb9598", "revisionTime": "2017-02-11T12:01:23Z" }, { "checksumSHA1": "8TGdZF55Q7PEu82rD7WG3C8ikhA=", "path": "golang.org/x/text/encoding/htmlindex", "revision": "85c29909967d7f171f821e7a42e7b7af76fb9598", "revisionTime": "2017-02-11T12:01:23Z" }, { "checksumSHA1": "zeHyHebIZl1tGuwGllIhjfci+wI=", "path": "golang.org/x/text/encoding/internal", "revision": "85c29909967d7f171f821e7a42e7b7af76fb9598", "revisionTime": "2017-02-11T12:01:23Z" }, { "checksumSHA1": "/108BuAIqv6xdIw1mi27RnopKak=", "path": "golang.org/x/text/encoding/internal/identifier", "revision": "85c29909967d7f171f821e7a42e7b7af76fb9598", "revisionTime": "2017-02-11T12:01:23Z" }, { "checksumSHA1": "HeZV82ktrmgyAaYLtNFS0qYgspI=", "path": "golang.org/x/text/encoding/japanese", "revision": "85c29909967d7f171f821e7a42e7b7af76fb9598", "revisionTime": "2017-02-11T12:01:23Z" }, { "checksumSHA1": "8y87WJz3OkDWtPCIXxJcYpo+OY8=", "path": "golang.org/x/text/encoding/korean", "revision": "85c29909967d7f171f821e7a42e7b7af76fb9598", "revisionTime": "2017-02-11T12:01:23Z" }, { "checksumSHA1": "WYfmebIyX5Zae8NUfu9PsQjQff0=", "path": "golang.org/x/text/encoding/simplifiedchinese", "revision": "85c29909967d7f171f821e7a42e7b7af76fb9598", "revisionTime": "2017-02-11T12:01:23Z" }, { "checksumSHA1": "KKqYmi6fxt3r3uo4lExss2yTMbs=", "path": "golang.org/x/text/encoding/traditionalchinese", "revision": "85c29909967d7f171f821e7a42e7b7af76fb9598", "revisionTime": "2017-02-11T12:01:23Z" }, { "checksumSHA1": "G9LfJI9gySazd+MyyC6QbTHx4to=", "path": "golang.org/x/text/encoding/unicode", "revision": "85c29909967d7f171f821e7a42e7b7af76fb9598", "revisionTime": "2017-02-11T12:01:23Z" }, { "checksumSHA1": "hyNCcTwMQnV6/MK8uUW9E5H0J0M=", "path": "golang.org/x/text/internal/tag", "revision": "85c29909967d7f171f821e7a42e7b7af76fb9598", "revisionTime": "2017-02-11T12:01:23Z" }, { "checksumSHA1": "Qk7dljcrEK1BJkAEZguxAbG9dSo=", "path": "golang.org/x/text/internal/utf8internal", "revision": "85c29909967d7f171f821e7a42e7b7af76fb9598", "revisionTime": "2017-02-11T12:01:23Z" }, { "checksumSHA1": "euHabPKoKBA1T8PJWKTxjPoIDhc=", "path": "golang.org/x/text/language", "revision": "85c29909967d7f171f821e7a42e7b7af76fb9598", "revisionTime": "2017-02-11T12:01:23Z" }, { "checksumSHA1": "IV4MN7KGBSocu/5NR3le3sxup4Y=", "path": "golang.org/x/text/runes", "revision": "85c29909967d7f171f821e7a42e7b7af76fb9598", "revisionTime": "2017-02-11T12:01:23Z" }, { "checksumSHA1": "CbpjEkkOeh0fdM/V8xKDdI0AA88=", "path": "golang.org/x/text/secure/bidirule", "revision": "e19ae1496984b1c655b8044a65c0300a3c878dd3", "revisionTime": "2017-12-24T20:31:28Z" }, { "checksumSHA1": "ziMb9+ANGRJSSIuxYdRbA+cDRBQ=", "path": "golang.org/x/text/transform", "revision": "85c29909967d7f171f821e7a42e7b7af76fb9598", "revisionTime": "2017-02-11T12:01:23Z" }, { "checksumSHA1": "w8kDfZ1Ug+qAcVU0v8obbu3aDOY=", "path": "golang.org/x/text/unicode/bidi", "revision": "e19ae1496984b1c655b8044a65c0300a3c878dd3", "revisionTime": "2017-12-24T20:31:28Z" }, { "checksumSHA1": "BCNYmf4Ek93G4lk5x3ucNi/lTwA=", "path": "golang.org/x/text/unicode/norm", "revision": "e19ae1496984b1c655b8044a65c0300a3c878dd3", "revisionTime": "2017-12-24T20:31:28Z" }, { "checksumSHA1": "ikor+YKJu2eKwyFteBWhsb8IGy8=", "path": "golang.org/x/tools/go/ast/astutil", "revision": "be0fcc31ae2332374e800dfff29b721c585b35df", "revisionTime": "2016-11-04T18:56:24Z" }, { "checksumSHA1": "2ko3hvt1vrfwG+p7SLW+zqDEeV4=", "path": "golang.org/x/tools/imports", "revision": "be0fcc31ae2332374e800dfff29b721c585b35df", "revisionTime": "2016-11-04T18:56:24Z" }, { "checksumSHA1": "+4r0PnLwwyhO5/jvU5R/TEJb4kA=", "path": "gopkg.in/bsm/ratelimit.v1", "revision": "db14e161995a5177acef654cb0dd785e8ee8bc22", "revisionTime": "2016-02-20T15:49:07Z" }, { "checksumSHA1": "CEFTYXtWmgSh+3Ik1NmDaJcz4E0=", "path": "gopkg.in/check.v1", "revision": "20d25e2804050c1cd24a7eea1e7a6447dd0e74ec", "revisionTime": "2016-12-08T18:13:25Z" }, { "checksumSHA1": "DQXNV0EivoHm4q+bkdahYXrjjfE=", "path": "gopkg.in/karalabe/cookiejar.v2/collections/prque", "revision": "8dcd6a7f4951f6ff3ee9cbb919a06d8925822e57", "revisionTime": "2015-07-24T13:16:13Z" }, { "checksumSHA1": "0xgs8lwcWLUffemlj+SsgKlxvDU=", "path": "gopkg.in/natefinch/npipe.v2", "revision": "c1b8fa8bdccecb0b8db834ee0b92fdbcfa606dd6", "revisionTime": "2016-06-21T03:49:01Z" }, { "checksumSHA1": "vndxs5Tv09/8S+Dr2PBAiM557lI=", "path": "gopkg.in/olebedev/go-duktape.v3", "revision": "abf0ba0be5d5d36b1f9266463cc320b9a5ab224e", "revisionTime": "2018-03-02T12:15:09Z" }, { "checksumSHA1": "/EL/UuzIPObHgESjkBMaD4gaXOw=", "path": "gopkg.in/redis.v3", "revision": "b5e368500d0a508ef8f16e9c2d4025a8a46bcc29", "revisionTime": "2016-06-27T09:56:34Z" }, { "checksumSHA1": "b4Z72l8sq4xuWhR+nM5vbLQIv+o=", "path": "gopkg.in/redis.v3/internal", "revision": "b5e368500d0a508ef8f16e9c2d4025a8a46bcc29", "revisionTime": "2016-06-27T09:56:34Z" }, { "checksumSHA1": "tNI/mAuqqQqfYU4vuJghUroIts4=", "path": "gopkg.in/redis.v3/internal/consistenthash", "revision": "b5e368500d0a508ef8f16e9c2d4025a8a46bcc29", "revisionTime": "2016-06-27T09:56:34Z" }, { "checksumSHA1": "JvqkSear94dc+NgofRqBAUmLcN0=", "path": "gopkg.in/redis.v3/internal/hashtag", "revision": "b5e368500d0a508ef8f16e9c2d4025a8a46bcc29", "revisionTime": "2016-06-27T09:56:34Z" }, { "checksumSHA1": "ROpD4/McQLnnxpPenjA0mEZfTL8=", "path": "gopkg.in/redis.v3/internal/pool", "revision": "b5e368500d0a508ef8f16e9c2d4025a8a46bcc29", "revisionTime": "2016-06-27T09:56:34Z" }, { "checksumSHA1": "4BwmmgQUhWtizsR2soXND0nqZ1I=", "path": "gopkg.in/sourcemap.v1", "revision": "6e83acea0053641eff084973fee085f0c193c61a", "revisionTime": "2017-02-13T14:20:43Z" }, { "checksumSHA1": "GDXPA04g0Dfwu2w++JiOKkYuZEc=", "path": "gopkg.in/sourcemap.v1/base64vlq", "revision": "6e83acea0053641eff084973fee085f0c193c61a", "revisionTime": "2017-02-13T14:20:43Z" }, { "checksumSHA1": "Yx1MU40fyGe7hhqW9+dkv8kXa60=", "path": "gopkg.in/urfave/cli.v1", "revision": "cfb38830724cc34fedffe9a2a29fb54fa9169cd1", "revisionTime": "2017-08-11T01:42:03Z" } ], "rootPath": "github.com/sero-cash/go-sero" } ================================================ FILE: voter/backend.go ================================================ // Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. // Package ethapi implements the general Ethereum API functions. package voter import ( "github.com/sero-cash/go-sero/accounts" ) // Backend interface provides the common API services (that are provided by // both full and light clients) with access to necessary functions. type Backend interface { AccountManager() *accounts.Manager } ================================================ FILE: voter/utils.go ================================================ package voter import ( "container/heap" "sort" "sync" "github.com/sero-cash/go-sero/core/types" ) type lotteryItem struct { Lottery *types.Lottery Attempts uint8 } type Item struct { Key interface{} //the unique key of item Value interface{} //the value of the item Block uint64 //the priority of the item in the queue //heap.Interface need this index and update them Index int //index of the item in the heap } type itemslice struct { items []*Item itemsMap map[interface{}]*Item //find item according to the key (inteface {} type) } func (s itemslice) Len() int { return len(s.items) } func (s itemslice) Less(i, j int) bool { return s.items[i].Block > s.items[j].Block } func (s itemslice) Swap(i, j int) { s.items[i], s.items[j] = s.items[j], s.items[i] s.items[i].Index = i s.items[j].Index = j if s.itemsMap != nil { s.itemsMap[s.items[i].Key] = s.items[i] s.itemsMap[s.items[j].Key] = s.items[j] } } func (s *itemslice) Push(x interface{}) { n := len(s.items) item := x.(*Item) item.Index = n s.items = append(s.items, item) s.itemsMap[item.Key] = item } func (s *itemslice) Pop() interface{} { old := s.items n := len(old) item := old[n-1] item.Index = -1 delete(s.itemsMap, item.Key) s.items = old[0 : n-1] return item } func (s *itemslice) Update(key interface{}, value interface{}, block uint64) { item := s.itemByKey(key) if item != nil { s.updateItem(item, value, block) } } func (s *itemslice) itemByKey(key interface{}) *Item { if item, found := s.itemsMap[key]; found { return item } return nil } func (s *itemslice) updateItem(item *Item, value interface{}, block uint64) { item.Value = value item.Block = block heap.Fix(s, item.Index) } type PriorityQueue struct { slice itemslice maxSize int mutex sync.RWMutex } func (pq *PriorityQueue) Init(maxSize int) { pq.slice.items = make([]*Item, 0, pq.maxSize) pq.slice.itemsMap = make(map[interface{}]*Item) pq.maxSize = maxSize } func (pq PriorityQueue) Len() int { pq.mutex.RLock() size := pq.slice.Len() pq.mutex.RUnlock() return size } func (pq *PriorityQueue) minItem() *Item { len := pq.slice.Len() if len == 0 { return nil } return pq.slice.items[0] } func (pq *PriorityQueue) MinItem() *Item { pq.mutex.RLock() defer pq.mutex.RUnlock() return pq.minItem() } func (pq *PriorityQueue) PushItem(key, value interface{}, block uint64) (bPushed bool) { pq.mutex.Lock() defer pq.mutex.Unlock() size := pq.slice.Len() item := pq.slice.itemByKey(key) if size > 0 && item != nil { pq.slice.updateItem(item, value, block) return true } item = &Item{ Value: value, Key: key, Block: block, Index: -1, } if pq.maxSize <= 0 || size < pq.maxSize { heap.Push(&(pq.slice), item) return true } heap.Pop(&(pq.slice)) heap.Push(&(pq.slice), item) return true } func (pq *PriorityQueue) PopItem() interface{} { pq.mutex.Lock() defer pq.mutex.Unlock() sz := pq.slice.Len() if sz > 0 { return heap.Pop(&(pq.slice)).(*Item).Value } else { return nil } } func (pq *PriorityQueue) Pop() *Item { pq.mutex.Lock() defer pq.mutex.Unlock() sz := pq.slice.Len() if sz > 0 { return heap.Pop(&(pq.slice)).(*Item) } else { return nil } } func (pq PriorityQueue) GetQueue() []interface{} { items := pq.GetQueueItems() values := make([]interface{}, len(items)) for i := 0; i < len(items); i++ { values[i] = items[i].Value } return values } func (pq PriorityQueue) GetQueueItems() []*Item { size := pq.Len() if size == 0 { return []*Item{} } s := itemslice{} s.items = make([]*Item, size) pq.mutex.RLock() for i := 0; i < size; i++ { s.items[i] = &Item{ Value: pq.slice.items[i].Value, Block: pq.slice.items[i].Block, } } pq.mutex.RUnlock() sort.Sort(s) return s.items } ================================================ FILE: voter/voter.go ================================================ package voter import ( "math/big" "sync" "sync/atomic" "time" "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-czero-import/superzk" "github.com/sero-cash/go-sero/accounts" "github.com/sero-cash/go-sero/serodb" "github.com/sero-cash/go-sero/common/address" "github.com/sero-cash/go-sero/zero/stake" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/core" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core/state" "github.com/sero-cash/go-sero/event" "github.com/sero-cash/go-sero/params" ) const ( evictionInterval = time.Minute chainLotterySize = 300 lifeTime = 30 * time.Minute delayNum = 1 lotteryQueueSize = 12 ) type blockChain interface { CurrentBlock() *types.Block GetHeaderByHash(hash common.Hash) *types.Header StateAt(header *types.Header) (*state.StateDB, error) SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription GetHeader(hash common.Hash, number uint64) *types.Header GetHeaderByNumber(number uint64) *types.Header GetBlock(hash common.Hash, number uint64) *types.Block GetDB() serodb.Database } type Voter struct { chain blockChain sero Backend lotteryCh chan *types.Lottery voteFeed event.Feed voteWorkFeed event.Feed lotteryFeed event.Feed scope event.SubscriptionScope //abi types.Signer voteMu sync.RWMutex lotteryMu sync.RWMutex wg sync.WaitGroup votes map[common.Hash]time.Time lotterys map[common.Hash]time.Time stopLottery chan struct{} stopVote chan struct{} lotteryQueue *PriorityQueue running int32 } func NewVoter(chainconfig *params.ChainConfig, chain blockChain, sero Backend) *Voter { // Sanitize the input to ensure no vulnerable gas prices are set // Create the transaction pool with its initial settings voter := &Voter{ sero: sero, chain: chain, lotteryCh: make(chan *types.Lottery, chainLotterySize), votes: make(map[common.Hash]time.Time), lotterys: make(map[common.Hash]time.Time), lotteryQueue: &PriorityQueue{}, stopLottery: make(chan struct{}), stopVote: make(chan struct{}), } voter.lotteryQueue.Init(lotteryQueueSize) // Subscribe events from blockchain //voter.chainHeadSub = voter.chain.SubscribeChainHeadEvent(voter.chainHeadCh) // Start the event loop and return go voter.loop() go voter.lotteryTaskLoop() go voter.voteLoop() return voter } func (self *Voter) loop() { evict := time.NewTicker(evictionInterval) defer evict.Stop() for { select { case <-evict.C: self.lotteryMu.Lock() dropLotterys := []common.Hash{} for k, v := range self.lotterys { if time.Since(v) > lifeTime { dropLotterys = append(dropLotterys, k) } } for _, h := range dropLotterys { delete(self.lotterys, h) } self.lotteryMu.Unlock() self.voteMu.Lock() dropVotes := []common.Hash{} for k, v := range self.votes { if time.Since(v) > lifeTime { dropVotes = append(dropVotes, k) } } for _, h := range dropVotes { delete(self.votes, h) } self.voteMu.Unlock() } } } func (self *Voter) IsLotteryValid(lottery *types.Lottery) bool { current := self.chain.CurrentBlock().NumberU64() if (lottery.ParentNum + 1) < current-1 { return false } if (lottery.ParentNum + 1) > current+2 { return false } return true } func (self *Voter) lotteryTaskLoop() { self.wg.Add(1) defer self.wg.Done() for { select { case lottery := <-self.lotteryCh: //current := self.chain.CurrentBlock().NumberU64() if !self.IsLotteryValid(lottery) { continue } //log.Info(">>>>>>>lotteryTaskLoop new lottery", "poshash", lottery.PosHash, "block", lottery.ParentNum+1, "localBlock", current) parentBlock := self.chain.GetBlock(lottery.ParentHash, lottery.ParentNum) if parentBlock == nil { log.Trace(">>>>>lotteryTaskLoop can not find parentblock", "parent block", lottery.ParentNum) self.lotteryQueue.PushItem(lottery.PosHash, &lotteryItem{Lottery: lottery, Attempts: uint8(0)}, lottery.ParentNum+1) } else { selfShares, err := self.SelfShares(lottery.PosHash, lottery.ParentHash, parentBlock.Number()) if err != nil { log.Error("lotteryTaskLoop", "selfShare error ", err) } else { for _, s := range selfShares { go self.sign(s) } } } case <-self.stopLottery: log.Info("strop voter lottery loop ....") return } } } func (self *Voter) voteLoop() { self.wg.Add(1) defer self.wg.Done() evict := time.NewTicker(time.Second) defer evict.Stop() for { select { case <-evict.C: current := self.chain.CurrentBlock().NumberU64() for item := self.lotteryQueue.Pop(); item != nil; item = self.lotteryQueue.Pop() { lItem := item.Value.(*lotteryItem) //log.Info(">>>>>voteLoop get Vote Item", "poshash", lItem.Lottery.PosHash, "block", lItem.Lottery.ParentNum+1) if current > lItem.Lottery.ParentNum+delayNum { log.Trace(">>>>>>not need vote", "current", current, "vote block", lItem.Lottery.ParentNum+1) continue } parentBlock := self.chain.GetBlock(lItem.Lottery.ParentHash, lItem.Lottery.ParentNum) if parentBlock == nil { log.Trace(">>>>>voteLoop get parent is nil", "hash", lItem.Lottery.ParentHash, "block", lItem.Lottery.ParentNum) self.lotteryQueue.PushItem(lItem.Lottery.PosHash, lItem, item.Block) break } selfShares, err := self.SelfShares(lItem.Lottery.PosHash, parentBlock.Hash(), parentBlock.Number()) if err != nil { log.Trace("lotteryTaskLoop", "selfShare error ", err) } else { for _, s := range selfShares { self.sign(s) } } } case <-self.stopVote: log.Info("strop voter vote loop ....") return } } } type voteInfo struct { index uint32 parentNum uint64 shareHash common.Hash poshash common.Hash stakeHash common.Hash votePKr c_type.PKr isPool bool seed address.Seed } func cotainsVoteInfo(voteInfos []voteInfo, item voteInfo, pool *stake.StakePool) bool { if pool != nil && pool.Closed { return false } for _, v := range voteInfos { if v.seed == item.seed && v.index == item.index && v.shareHash == v.shareHash && v.poshash == item.poshash && v.parentNum == item.parentNum { return true } } return false } func pkrToAddress(pkr c_type.PKr) common.Address { var addr common.Address copy(addr[:], pkr[:]) return addr } func GetSeedByVotePkr(wallets []accounts.Wallet, pkr c_type.PKr) *address.Seed { for _, w := range wallets { if w.IsMine(pkr) { seed, err := w.GetSeed() if err != nil { log.Trace("GetSeedByVotePkr", "err", err) return nil } else { return seed } } } return nil } func (self *Voter) SelfShares(poshash common.Hash, parent common.Hash, parentNumber *big.Int) ([]voteInfo, error) { current := self.chain.CurrentBlock().NumberU64() if current > delayNum+parentNumber.Uint64() { return nil, nil } parentHeader := self.chain.GetHeaderByHash(parent) if parentHeader == nil { return nil, nil } state, err := self.chain.StateAt(parentHeader) if err != nil { log.Trace("lotteryTaskLoop", "stateAt", poshash, "err", err) return nil, err } else { stakeState := stake.NewStakeState(state) header := &types.Header{ ParentHash: parent, Number: new(big.Int).Add(parentNumber, common.Big1), } err := stakeState.ProcessBeforeApply(self.chain, header) if err != nil { log.Error("lotteryTaskLoop", "err", err) return nil, nil } if stakeState.ShareSize() == 0 { return nil, nil } ints, shares, err := stakeState.SeleteShare(poshash, header.Number.Uint64()) log.Info("SelfShares selete share", "poshash", poshash, "blockNumber", header.Number.Uint64(), "indexs", ints, "pool size", stakeState.ShareSize()) if err != nil { log.Info("lotteryTaskLoop", "SeleteShare", poshash, "err", err) return nil, err } var voteInfos []voteInfo if len(ints) > 0 { parentPos := parentHeader.HashPos() wallets := self.sero.AccountManager().Wallets() for i, share := range shares { var pool *stake.StakePool if share.PoolId != nil { pool = stakeState.GetStakePool(*share.PoolId) if pool == nil { log.Error("lotteryTaskLoop", "GetStakePool", share.PoolId, "note exist") } } if pool != nil { stakeHash := types.StakeHash(&poshash, &parentPos, true) seed := GetSeedByVotePkr(wallets, pool.VotePKr) if seed != nil { voteInfos = append(voteInfos, voteInfo{ ints[i], parentNumber.Uint64(), common.BytesToHash(share.Id()), poshash, stakeHash, pool.VotePKr, true, *seed}) } } shareVoteSeed := GetSeedByVotePkr(wallets, share.VotePKr) if shareVoteSeed != nil { stakeHash := types.StakeHash(&poshash, &parentPos, false) info := voteInfo{ ints[i], parentNumber.Uint64(), common.BytesToHash(share.Id()), poshash, stakeHash, share.VotePKr, false, *shareVoteSeed} if cotainsVoteInfo(voteInfos, info, pool) { continue } else { voteInfos = append(voteInfos, info) } } } } return voteInfos, nil } } func (self *Voter) sign(info voteInfo) { data := c_type.Uint256{} copy(data[:], info.stakeHash[:]) version := 1 if c_superzk.IsSzkPKr(&info.votePKr) { version = 2 } sk := superzk.Seed2Sk(info.seed.SeedToUint256(), version) sign, err := superzk.SignPKr_ByHeight(info.parentNum+1, &sk, &data, &info.votePKr) if err != nil { log.Error("voter sign", "sign err", err) return } log.Info(">>>>>>>>>>>>>sign vote", "poshas", info.poshash, "block", info.parentNum+1, "share", info.shareHash, "idx", info.index, "isPool", info.isPool) vote := &types.Vote{info.index, info.parentNum, info.shareHash, info.poshash, info.isPool, sign} //go self.voteWorkFeed.Send(core.NewVoteEvent{vote}) self.AddVote(vote) } // SubscribeNewTxsEvent registers a subscription of NewTxsEvent and // starts sending event to the given channel. func (self *Voter) SubscribeNewVoteEvent(ch chan<- core.NewVoteEvent) event.Subscription { return self.scope.Track(self.voteFeed.Subscribe(ch)) } func (self *Voter) SubscribeWorkerVoteEvent(ch chan<- core.NewVoteEvent) event.Subscription { return self.scope.Track(self.voteWorkFeed.Subscribe(ch)) } func (self *Voter) SubscribeNewLotteryEvent(ch chan<- core.NewLotteryEvent) event.Subscription { return self.scope.Track(self.lotteryFeed.Subscribe(ch)) } func (self *Voter) SendLotteryEvent(lottery *types.Lottery) { go self.lotteryFeed.Send(core.NewLotteryEvent{lottery}) } func (self *Voter) SendVoteEvent(vote *types.Vote) { go self.voteFeed.Send(core.NewVoteEvent{vote}) } func (self *Voter) AddLottery(lottery *types.Lottery) { self.lotteryMu.Lock() defer self.lotteryMu.Unlock() current := self.chain.CurrentBlock().Number().Uint64() if current > lottery.ParentNum+delayNum { log.Trace("AddLottery droped", "current", current, "voteBlock", lottery.ParentNum+1) return } _, exits := self.lotterys[lottery.PosHash] if !exits { log.Trace("AddLottery", "poshas", lottery.PosHash, "block", lottery.ParentNum+1) self.lotterys[lottery.PosHash] = time.Now() self.lotteryCh <- lottery self.SendLotteryEvent(lottery) } } func (self *Voter) getStateByNumber(num uint64) (*state.StateDB, error) { header := self.chain.GetHeaderByNumber(num) if header == nil { return nil, nil } return self.chain.StateAt(header) } func (self *Voter) AddVote(vote *types.Vote) { self.voteMu.Lock() defer self.voteMu.Unlock() current := self.chain.CurrentBlock().Number().Uint64() if current > vote.ParentNum+delayNum { log.Trace("AddVote droped", "current", current, "voteBlock", vote.ParentNum+1) return } _, exits := self.votes[vote.Hash()] if !exits { log.Trace("AddVote", "hashpos", vote.PosHash, "block", vote.ParentNum+1) go self.voteWorkFeed.Send(core.NewVoteEvent{vote}) self.SendVoteEvent(vote) self.votes[vote.Hash()] = time.Now() } } func (self *Voter) Close() { if !atomic.CompareAndSwapInt32(&self.running, 0, 1) { return } close(self.stopLottery) close(self.stopVote) self.wg.Wait() } ================================================ FILE: zero/account/address.go ================================================ package account import ( "crypto/md5" "encoding/hex" "regexp" "strings" "github.com/sero-cash/go-czero-import/c_superzk" "github.com/btcsuite/btcutil/base58" "github.com/pkg/errors" ) const separator = "0" type Address struct { Bytes []byte Base58 string Protocol string Version string Sum string IsHex bool } //const hextable = "0123456789abcdef" func (self *Address) calcSum() { c := append([]byte(self.Protocol+self.Version), self.Bytes...) m := md5.Sum(c) s := base58.Encode(m[:]) self.Sum = s[:2] } func (self *Address) genVersion() { if c_superzk.IsFlagSet(self.Bytes) { self.Version = "1" } else { self.Version = "0" } } func (self *Address) setBytes(bs []byte) { self.Bytes = bs self.Base58 = base58.Encode(self.Bytes) self.genVersion() } func Decode(input string) ([]byte, error) { if len(input) == 0 { return nil, errors.New("empty hex strin") } if !has0xPrefix(input) { return nil, errors.New("hex string without 0x prefix") } b, err := hex.DecodeString(input[2:]) if err != nil { return nil, err } return b, err } func has0xPrefix(input string) bool { return len(input) >= 2 && input[0] == '0' && (input[1] == 'x' || input[1] == 'X') } func (self *Address) setHex(hex string) (e error) { self.IsHex = true if strings.Index(hex, "0x") != 0 { hex = "0x" + hex } if bytes, err := Decode(hex); err != nil { e = err return } else { if len(bytes) == 0 { e = errors.New("the bytes length is 0") return } else { self.setBytes(bytes) return } } } func (self *Address) setBase58(bs string) (e error) { if IsBase58Str(bs) { bytes := base58.Decode(bs) if len(bytes) == 0 { e = errors.New("the bytes length is 0") return } else { self.Base58 = bs self.Bytes = bytes self.genVersion() return } } else { e = errors.New("the addr is not base58") return } } func (self *Address) ToCode() (ret string) { return self.Protocol + self.Version + separator + self.Base58 + separator + self.Sum } func Encode(b []byte) string { enc := make([]byte, len(b)*2+2) copy(enc, "0x") hex.Encode(enc[2:], b) return string(enc) } func (self *Address) ToHex() (ret string) { return Encode(self.Bytes) } func (self *Address) ToBase58() (ret string) { return self.Base58 } func (self *Address) MatchProtocol(ver string) bool { if len(self.Protocol) > 0 { return self.Protocol == ver } else { return true } } func (self *Address) SetProtocol(p string) *Address { self.Protocol = p self.calcSum() return self } func NewAddressByBytes(addr []byte) (ret Address) { ret.setBytes(addr) ret.calcSum() return } func NewAddressByHex(addr string) (ret Address, e error) { if e = ret.setHex(addr); e != nil { return } ret.calcSum() return } func IsBase58Str(s string) bool { pattern := "^[" + "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" + "]+$" match, err := regexp.MatchString(pattern, s) if err != nil { return false } return match } func isHexCharacter(c byte) bool { return ('0' <= c && c <= '9') || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F') } func IsHex(s string) bool { if has0xPrefix(s) { s = s[2:] } for _, c := range []byte(s) { if !isHexCharacter(c) { return false } } return true } func NewAddressByBase58(addr string) (ret Address, e error) { if e = ret.setBase58(addr); e != nil { return } ret.calcSum() return } //var reg, _ = regexp.Compile(`^(.*)\.(.*)\.(.*)$`) var reg, _ = regexp.Compile(`^(.*)0(.*)0(.*)$`) func NewAddressByString(addr string) (ret Address, e error) { if IsHex(addr) { return NewAddressByHex(addr) } else { if strs := reg.FindStringSubmatch(addr); len(strs) != 4 { if IsBase58Str(addr) { return NewAddressByBase58(addr) } else { e = errors.New("invalid base58 string") return } } else { if e = ret.setBase58(strs[2]); e != nil { return } ret.Protocol = strs[1][:len(strs[1])-1] ret.calcSum() if ret.Version != strs[1][len(strs[1])-1:] { e = errors.New("the version check failed") return } if ret.Sum != strs[3] { e = errors.New("the sum check failed") return } return } } } ================================================ FILE: zero/account/address_test.go ================================================ package account import ( "fmt" "regexp" "testing" ) func TestAddress(t *testing.T) { bytes := []byte("hello address") addr := NewAddressByBytes(bytes) fmt.Println(addr.ToCode()) hexs := "0x12346889093334" addr1, e := NewAddressByHex(hexs) fmt.Println(addr1.ToCode(), e) fmt.Println(addr1.ToHex()) addr2, e := NewAddressByString(addr.ToCode()) fmt.Println(addr2.ToCode()) } var reg1, _ = regexp.Compile(`^(.*)0(.*)0(.*)$`) func TestRex(t *testing.T) { a := "SP103ATBFhrrwJhbLGd7PEGZeTg3uFjjknyegqvDyN5pvM4gvp4jyfyGTTLvwEwJhwqBjS2ceaQjN7uHC5Q5biifbRZf0NF" strs := reg1.FindStringSubmatch(a) fmt.Println(strs) } ================================================ FILE: zero/consensus/bytes.go ================================================ package consensus type BytePair struct { Key []byte Value []byte } func (self *BytePair) CopyTo() CItem { ret := &BytePair{} ret.Key = append([]byte{}, self.Key...) ret.Value = append([]byte{}, self.Value...) return ret } func (self *BytePair) CopyFrom(from CItem) { if from != nil { f := from.(*BytePair) self.Key = append([]byte{}, f.Key...) self.Value = append([]byte{}, f.Value...) } else { self.Key = []byte{} self.Value = []byte{} } return } func (self *BytePair) Id() (ret []byte) { ret = append([]byte{}, self.Key...) return } func (self *BytePair) State() (ret []byte) { ret = append([]byte{}, self.Value...) return } type Bytes []byte func (self *Bytes) CopyTo() CItem { ret := append(Bytes{}, *self...) return &ret } func (self *Bytes) CopyFrom(from CItem) { if from != nil { (*self) = append(Bytes{}, (*from.(*Bytes))...) } else { (*self) = []byte{} } return } func (self *Bytes) Id() (ret []byte) { ret = append(ret, *self...) return } ================================================ FILE: zero/consensus/cons.go ================================================ package consensus import ( "fmt" "github.com/sero-cash/go-sero/common" "math/big" "sort" "github.com/sero-cash/go-sero/core/types" "github.com/pkg/errors" "github.com/sero-cash/go-sero/common/hexutil" "github.com/sero-cash/go-sero/rlp" "github.com/sero-cash/go-sero/serodb" ) type changelog struct { key string old CItem index int ver int } type key struct { pre string id []byte } func (self *key) CopyTo() (ret key) { ret.pre = self.pre ret.id = append([]byte{}, self.id...) return } func (self *key) k() string { return self.pre + string(self.id) } type inBlock struct { name string ref []byte } type inDB struct { ref []byte } func (self *inBlock) CopyRef() (ret *inBlock) { if self != nil { ret = &inBlock{ self.name, append([]byte{}, self.ref...), } } return } type consItem struct { key key item CItem index int inCons bool inBlock *inBlock inDB *inDB } func (self *consItem) Log() string { ret := fmt.Sprintf("index(%v) - id(%v) - ", self.index, hexutil.Encode(self.key.id)) if self.inCons { ret += "inCons(true) - " } else { ret += "inCons(false) - " } if self.inBlock != nil { ret += fmt.Sprintf("inBlock(%v : %v) - ", self.inBlock.name, hexutil.Encode(self.inBlock.ref)) } else { ret += "inBlock(NULL) - " } if self.inDB != nil { ret += fmt.Sprintf("inDB(%v) - ", hexutil.Encode(self.inDB.ref)) } else { ret += "inDB(NULL) - " } ret += fmt.Sprintf("VALUE(%v)", self.item) return ret } func (self *consItem) CopyRef() (ret *consItem) { var item_copy CItem if self.item != nil { item_copy = self.item.CopyTo() } ret = &consItem{ self.key.CopyTo(), item_copy, self.index, self.inCons, self.inBlock.CopyRef(), self.inDB, } return } func (self *consItem) CopyRefWithoutItem() (ret *consItem) { ret = &consItem{ self.key.CopyTo(), self.item, self.index, self.inCons, self.inBlock.CopyRef(), self.inDB, } return } type Cons struct { db DB pre string content map[string]*consItem cls []changelog ver int updateVer int } func NewCons(db DB, pre string) (ret Cons) { ret.content = make(map[string]*consItem) ret.pre = pre ret.db = db ret.ver = -1 ret.updateVer = -1 return } func (self *Cons) Copy(db DB) (ret *Cons) { ret = &Cons{} ret.db = db ret.pre = self.pre ret.content = make(map[string]*consItem) ret.ver = self.ver ret.updateVer = self.updateVer for _, log := range self.cls { temp := log if log.old != nil { temp.old = log.old.CopyTo() } ret.cls = append(ret.cls, temp) } for k, v := range self.content { ret.content[k] = v.CopyRef() } return } func (self *Cons) CreateSnapshot(ver int) { self.ver = ver } func (self *Cons) RevertToSnapshot(ver int) { if ver <= self.updateVer { panic(fmt.Errorf("revert snapshot version(%v) < update version(%v)", ver, self.updateVer)) } l := len(self.cls) for ; l > 0; l-- { cl := self.cls[l-1] if cl.ver >= ver { if cl.old != nil { if v, ok := self.content[cl.key]; ok { v.item = cl.old self.content[cl.key] = v } else { panic(errors.New("revert snapshot but can not find the keypair")) } } else { delete(self.content, cl.key) } } else { break } } if l != len(self.cls) { self.cls = self.cls[:l] } } func (self *Cons) deleteObj(k *key, item CItem, inCons bool, inblock *inBlock, indb *inDB) { if item == nil { panic(errors.New("item can not be nil")) } is_indb := false if indb != nil { is_indb = true } old := self.getObj(k, item.CopyTo(), inCons, is_indb) cl := changelog{} cl.key = k.k() if old != nil { cl.old = old.item cl.index = old.index } else { cl.old = nil cl.index = -1 } cl.ver = self.ver self.content[k.k()] = &consItem{k.CopyTo(), nil, len(self.cls), inCons, inblock, indb} self.cls = append(self.cls, cl) return } func (self *Cons) addObj(k *key, item CItem, inCons bool, inblock *inBlock, indb *inDB) { if item == nil { panic(errors.New("item can not be nil")) } is_indb := false if indb != nil { is_indb = true } old := self.getObj(k, item.CopyTo(), inCons, is_indb) cl := changelog{} cl.key = k.k() if old != nil { cl.old = old.item cl.index = old.index } else { cl.old = nil cl.index = -1 } cl.ver = self.ver self.content[k.k()] = &consItem{k.CopyTo(), item.CopyTo(), len(self.cls), inCons, inblock, indb} self.cls = append(self.cls, cl) return } func (self *Cons) getData(k []byte, inCons bool, inDB bool) (ret []byte) { if inDB { if v, err := self.db.GlobalGetter().Get(k); err != nil { return } else { return v } } if inCons { if v, err := self.db.CurrentTri().TryGet(k); err != nil { return } else { return v } } return nil } func (self *Cons) getObj(k *key, item CItem, inCons bool, indb bool) (ret *consItem) { if i, ok := self.content[k.k()]; !ok { if v := self.getData([]byte(k.k()), inCons, indb); v == nil { return nil } else { if e := rlp.DecodeBytes(v, item); e != nil { return nil } ret = &consItem{k.CopyTo(), item, -1, false, nil, nil} self.content[k.k()] = ret.CopyRef() return } } else { item.CopyFrom(i.item) ret = i.CopyRefWithoutItem() ret.item = item return } } type consItems []*consItem func (self consItems) Len() int { return len(self) } func (self consItems) Less(i, j int) bool { return self[i].index < self[j].index } func (self consItems) Swap(i, j int) { self[i], self[j] = self[j], self[i] } func (self *Cons) fetchConsPairs(onlyget bool) (ret consItems) { for _, v := range self.content { if v.inCons { ret = append(ret, v) if !onlyget { v.inCons = false } } } sort.Sort(ret) return } func (self *Cons) fetchDBPairs() (ret consItems) { cis := consItems{} for _, v := range self.content { if v.inDB != nil { cis = append(cis, v) } } sort.Sort(cis) ref_map := make(map[string]*consItem) for _, v := range cis { ref_map[string(v.inDB.ref)] = v } for _, v := range ref_map { ret = append(ret, v) } sort.Sort(ret) /*for _, v := range cis { if !onlyget { v.inDB = nil } }*/ return } type RecordPair struct { Ref []byte Hash []byte } type Record struct { Name string Pairs []RecordPair } func (self *Record) Log() string { ret := fmt.Sprintf("Name(%v)\n", self.Name) for _, pair := range self.Pairs { ret += fmt.Sprint(" ") ret += fmt.Sprintf("Record(ref=%v,hash=%v)", hexutil.Encode(pair.Ref), hexutil.Encode(pair.Hash)) ret += "\n" } return ret } func (self *Cons) fetchBlockRecords() (ret []*Record) { cis0 := consItems{} for _, v := range self.content { if v.inBlock != nil { cis0 = append(cis0, v) } } sort.Sort(cis0) ref_map := make(map[string]*consItem) for _, v := range cis0 { ref_map[string(v.inBlock.ref)] = v } cis1 := consItems{} for _, v := range ref_map { cis1 = append(cis1, v) } sort.Sort(cis1) m := make(map[string]*Record) for _, v := range cis1 { var r *Record if record, ok := m[v.inBlock.name]; ok { r = record } else { r = &Record{Name: v.inBlock.name} m[v.inBlock.name] = r ret = append(ret, r) } rp := RecordPair{} rp.Hash = append([]byte{}, v.key.id...) rp.Ref = append([]byte{}, v.inBlock.ref...) r.Pairs = append(r.Pairs, rp) } /*for _, v := range cis0 { if !onlyget { v.inBlock = nil } }*/ return } func (self *Cons) ReportConItems(name string, items consItems, num uint64) { return fmt.Printf("%v REPORT ITEMS: num=%v\n", name, num) for _, item := range items { fmt.Print(" ") fmt.Println(item.Log()) } fmt.Print("\n") } func (self *Cons) ReportRecords(records []*Record, num uint64) { return fmt.Printf("BLOCK RECORDS : num=%v\n", num) for _, record := range records { fmt.Print(record.Log()) } fmt.Print("\n") } func (self *Cons) Update() { self.updateVer = self.ver self.ReportConItems("CONS", self.fetchConsPairs(true), 0) conslist := self.fetchConsPairs(false) for _, v := range conslist { if v.item == nil { if err := self.db.CurrentTri().TryDelete([]byte(v.key.k())); err != nil { panic(err) } } else { if b, err := rlp.EncodeToBytes(v.item); err != nil { panic(err) } else { if err := self.db.CurrentTri().TryUpdate([]byte(v.key.k()), b); err != nil { panic(err) } } } } } type DPutter interface { serodb.Putter serodb.Deleter } func ConsKeysKey(num uint64,bhash common.Hash) []byte { key := []byte("$CONS$KEYS") key = append(key, big.NewInt(int64(num)).Bytes()...) key = append(key,bhash[:]...) return key } func PutConsKeys(putter serodb.Putter,num uint64,bhash common.Hash,keys [][]byte) { if v,err:=rlp.EncodeToBytes(keys);err!=nil { panic(err) } else { if err:=putter.Put(ConsKeysKey(num,bhash),v);err!=nil { panic(err) } } } func GetConsKeys(getter serodb.Getter,num uint64,bhash common.Hash) [][]byte { if v,err:=getter.Get(ConsKeysKey(num,bhash));err!=nil { return [][]byte{} } else { var ret [][]byte if err:=rlp.DecodeBytes(v,&ret);err!=nil { panic(err) } else { return ret } } } func (self *Cons) Record(header *types.Header, batch DPutter) { recordlist := self.fetchBlockRecords() self.ReportRecords(recordlist, header.Number.Uint64()) keys:=[][]byte{} if len(recordlist) > 0 { hash := header.Hash() key:=DBObj{self.pre}.setBlockRecords(batch, header.Number.Uint64(), &hash, recordlist) keys=append(keys,key) } dblist := self.fetchDBPairs() self.ReportConItems("DB", dblist, header.Number.Uint64()) for _, v := range dblist { if v.item == nil { if err := batch.Delete([]byte(v.key.k())); err != nil { panic(err) } } else { if b, err := rlp.EncodeToBytes(v.item); err != nil { panic(err) } else { k:=[]byte(v.key.k()) if err := batch.Put(k, b); err != nil { panic(err) } keys=append(keys,k) } } } PutConsKeys(batch,header.Number.Uint64(),header.Hash(),keys) } ================================================ FILE: zero/consensus/cons_test.go ================================================ package consensus import ( "bytes" "fmt" "math/big" "testing" "github.com/sero-cash/go-sero/core/types" ) func s2u(str string) (ret []byte) { return []byte(str) } func TestConsSetValue(t *testing.T) { db := NewFakeDB() cmap := NewCons(&db, "block") tree := NewKVPt(&cmap, "tree", "test") tree.SetValue(s2u("k0"), s2u("v0")) tree.SetValue(s2u("k1"), s2u("v1")) v := tree.GetValue(s2u("k0")) if v == nil || bytes.Compare(v, s2u("v0")) != 0 { t.FailNow() } v = tree.GetValue(s2u("k1")) if v == nil || bytes.Compare(v, s2u("v1")) != 0 { t.FailNow() } fmt.Println(v) } func TestConsSnapshot(t *testing.T) { db := NewFakeDB() cmap := NewCons(&db, "block") tree := NewKVPt(&cmap, "tree", "test") cmap.CreateSnapshot(0) tree.SetValue(s2u("k0"), s2u("v0")) v := tree.GetValue(s2u("k0")) if v == nil || bytes.Compare(v, s2u("v0")) != 0 { t.FailNow() } cmap.CreateSnapshot(1) tree.SetValue(s2u("k0"), s2u("v1")) v = tree.GetValue(s2u("k0")) if v == nil || bytes.Compare(v, s2u("v1")) != 0 { t.FailNow() } cmap.RevertToSnapshot(1) v = tree.GetValue(s2u("k0")) if v == nil || bytes.Compare(v, s2u("v0")) != 0 { t.FailNow() } cmap.RevertToSnapshot(0) v = tree.GetValue(s2u("k0")) if v != nil { t.FailNow() } } type TestObj struct { I string S string } func (self *TestObj) CopyTo() CItem { r := &TestObj{} r.I = self.I r.S = self.S return r } func (self *TestObj) CopyFrom(item CItem) { i := item.(*TestObj) self.I = i.I self.S = i.S return } func (self *TestObj) Id() (ret []byte) { return append([]byte{}, []byte(self.I)...) } func (self *TestObj) State() (ret []byte) { return append([]byte{}, []byte(self.S)...) } func NewTestObj(name string) (ret *TestObj) { ret = &TestObj{} ret.I = "obj0" ret.S = name return } func NewTestObj2(id string, name string) (ret *TestObj) { ret = &TestObj{} ret.I = id ret.S = name return } func TestConsSetObj(t *testing.T) { db := NewFakeDB() cmap := NewCons(&db, "block") tree := NewObjPt(&cmap, "tree$", "treestate$", "test") cmap.CreateSnapshot(0) tree.AddObj(NewTestObj("0")) v := tree.GetObj(s2u("obj0"), &TestObj{}) if v.(*TestObj).S != "0" { t.FailNow() } fmt.Println(v) cmap.CreateSnapshot(1) tree.AddObj(NewTestObj("1")) v = tree.GetObj(s2u("obj0"), &TestObj{}) if v.(*TestObj).S != "1" { t.FailNow() } fmt.Println(v) cmap.RevertToSnapshot(1) v = tree.GetObj(s2u("obj0"), &TestObj{}) if v.(*TestObj).S != "0" { t.FailNow() } fmt.Println(v) cmap.RevertToSnapshot(0) v = tree.GetObj(s2u("obj0"), &TestObj{}) if v != nil { t.FailNow() } fmt.Println(v) conslist := cmap.fetchConsPairs(true) blocklist := cmap.fetchConsPairs(true) dblist := cmap.fetchConsPairs(true) fmt.Println(conslist) fmt.Println(blocklist) fmt.Println(dblist) } func TestConsFetch(t *testing.T) { db := NewFakeDB() cmap := NewCons(&db, "block") dbobj := DBObj{"treestate$"} tree := NewObjPt(&cmap, "tree$", dbobj.Pre, "test") cmap.CreateSnapshot(0) tree.AddObj(NewTestObj("0")) v := tree.GetObj(s2u("obj0"), &TestObj{}) if v.(*TestObj).S != "0" { t.FailNow() } fmt.Println(v) cmap.CreateSnapshot(1) tree.AddObj(NewTestObj("1")) v = tree.GetObj(s2u("obj0"), &TestObj{}) if v.(*TestObj).S != "1" { t.FailNow() } fmt.Println(v) conslist := cmap.fetchConsPairs(false) if len(conslist) != 1 { t.FailNow() } blocklist := cmap.fetchBlockRecords() if len(blocklist) != 1 && len(blocklist[0].Pairs) != 1 { t.FailNow() } dblist := cmap.fetchDBPairs() if len(dblist) != 1 { t.FailNow() } conslist = cmap.fetchConsPairs(true) if len(conslist) != 0 { t.FailNow() } blocklist = cmap.fetchBlockRecords() if len(blocklist) != 1 && len(blocklist[0].Pairs) != 1 { t.FailNow() } dblist = cmap.fetchDBPairs() if len(dblist) != 1 { t.FailNow() } } func TestConsRecord(t *testing.T) { db := NewFakeDB() dbcons := DBObj{"BLOCK$CONS$INDEX$"} cmap := NewCons(&db, dbcons.Pre) dbobj := DBObj{"treestate$"} tree := NewObjPt(&cmap, "tree$", dbobj.Pre, "test") cmap.CreateSnapshot(0) tree.AddObj(NewTestObj("0")) v := tree.GetObj(s2u("obj0"), &TestObj{}) if v.(*TestObj).S != "0" { t.FailNow() } fmt.Println(v) cmap.CreateSnapshot(1) tree.AddObj(NewTestObj("1")) v = tree.GetObj(s2u("obj0"), &TestObj{}) if v.(*TestObj).S != "1" { t.FailNow() } fmt.Println(v) tree.AddObj(NewTestObj2("obj1", "3")) v = tree.GetObj(s2u("obj1"), &TestObj{}) if v.(*TestObj).S != "3" { t.FailNow() } fmt.Println(v) header := types.Header{Number: big.NewInt(0)} cmap.Record(&header, &db.db) testObj := TestObj{} v = dbobj.GetObject(db.GlobalGetter(), []byte("1"), &testObj) if v == nil { t.FailNow() } if testObj.S != "1" { t.FailNow() } v = dbobj.GetObject(db.GlobalGetter(), []byte("0"), &testObj) if v != nil { t.FailNow() } v = dbobj.GetObject(db.GlobalGetter(), []byte("2"), &testObj) if v != nil { t.FailNow() } hash := header.Hash() records := dbcons.GetBlockRecords(db.GlobalGetter(), 0, &hash) if len(records) != 1 && len(records[0].Pairs) != 2 { t.FailNow() } fmt.Println(records) cmap.Update() cmap1 := NewCons(&db, dbcons.Pre) tree1 := NewObjPt(&cmap1, "tree$", dbobj.Pre, "test") v = tree1.GetObj(s2u("obj0"), &TestObj{}) if v.(*TestObj).S != "1" { t.FailNow() } v = tree1.GetObj(s2u("obj1"), &TestObj{}) if v.(*TestObj).S != "3" { t.FailNow() } fmt.Println(v) } func TestConsRecord2(t *testing.T) { db := NewFakeDB() dbcons := DBObj{"BLOCK$CONS$INDEX$"} c := NewCons(&db, dbcons.Pre) cmap := &c dbobj := DBObj{"treestate$"} tree := NewObjPt(cmap, "tree$", dbobj.Pre, "test") cmap.CreateSnapshot(0) tree.AddObj(NewTestObj2("obj1", "11")) tree.AddObj(NewTestObj2("obj1", "12")) tree.AddObj(NewTestObj2("obj1", "13")) tree.AddObj(NewTestObj2("obj2", "21")) tree.AddObj(NewTestObj2("obj2", "22")) tree.AddObj(NewTestObj2("obj3", "33")) cmap.CreateSnapshot(1) tree.AddObj(NewTestObj2("obj1", "14")) tree.AddObj(NewTestObj2("obj2", "25")) tree.AddObj(NewTestObj2("obj3", "36")) v := tree.GetObj(s2u("obj1"), &TestObj{}) if v.(*TestObj).S != "14" { t.FailNow() } v = tree.GetObj(s2u("obj2"), &TestObj{}) if v.(*TestObj).S != "25" { t.FailNow() } v = tree.GetObj(s2u("obj3"), &TestObj{}) if v.(*TestObj).S != "36" { t.FailNow() } cmap.RevertToSnapshot(1) v = tree.GetObj(s2u("obj1"), &TestObj{}) if v.(*TestObj).S != "13" { t.FailNow() } v = tree.GetObj(s2u("obj2"), &TestObj{}) if v.(*TestObj).S != "22" { t.FailNow() } v = tree.GetObj(s2u("obj3"), &TestObj{}) if v.(*TestObj).S != "33" { t.FailNow() } cmap = cmap.Copy(cmap.db) header := types.Header{Number: big.NewInt(0)} cmap.Record(&header, &db.db) testObj := TestObj{} v = dbobj.GetObject(db.GlobalGetter(), []byte("13"), &testObj) if v == nil { t.FailNow() } if testObj.I != "obj1" { t.FailNow() } v = dbobj.GetObject(db.GlobalGetter(), []byte("22"), &testObj) if v == nil { t.FailNow() } if testObj.I != "obj2" { t.FailNow() } v = dbobj.GetObject(db.GlobalGetter(), []byte("33"), &testObj) if v == nil { t.FailNow() } if testObj.I != "obj3" { t.FailNow() } //======== v = dbobj.GetObject(db.GlobalGetter(), []byte("11"), &testObj) if v != nil { t.FailNow() } v = dbobj.GetObject(db.GlobalGetter(), []byte("21"), &testObj) if v != nil { t.FailNow() } hash := header.Hash() records := dbcons.GetBlockRecords(db.GlobalGetter(), 0, &hash) if len(records) != 1 && len(records[0].Pairs) != 3 { t.FailNow() } fmt.Println(records) cmap.Update() cmap1 := NewCons(&db, dbcons.Pre) tree1 := NewObjPt(&cmap1, "tree$", dbobj.Pre, "test") v = tree1.GetObj(s2u("obj1"), &TestObj{}) if v.(*TestObj).S != "13" { t.FailNow() } v = tree1.GetObj(s2u("obj2"), &TestObj{}) if v.(*TestObj).S != "22" { t.FailNow() } v = tree1.GetObj(s2u("obj3"), &TestObj{}) if v.(*TestObj).S != "33" { t.FailNow() } fmt.Println(v) } ================================================ FILE: zero/consensus/dbobj.go ================================================ package consensus import ( "math/big" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/rlp" "github.com/sero-cash/go-sero/serodb" ) type DBObj struct { Pre string } func makeBlockName(pre string, num uint64, hash *common.Hash) (ret []byte) { ret = []byte(pre) ret = append(ret, big.NewInt(int64(num)).Bytes()...) ret = append(ret, hash[:]...) return } func (self DBObj) setBlockRecords(batch serodb.Putter, num uint64, hash *common.Hash, records []*Record) (key []byte) { if b, err := rlp.EncodeToBytes(&records); err != nil { panic(err) } else { name := makeBlockName(self.Pre, num, hash) if err := batch.Put(name, b); err != nil { panic(err) } else { key=name return } } } func (self DBObj) GetBlockRecords(getter serodb.Getter, num uint64, hash *common.Hash) (records []*Record) { if b, err := getter.Get(makeBlockName(self.Pre, num, hash)); err != nil { return } else { if err := rlp.DecodeBytes(b, &records); err != nil { panic(err) } else { return } } } func (self DBObj) GetBlockRecordsMap(getter serodb.Getter, num uint64, hash *common.Hash) (records map[string][]RecordPair) { records = make(map[string][]RecordPair) rds := self.GetBlockRecords(getter, num, hash) for _, v := range rds { records[v.Name] = v.Pairs } return } func (self DBObj) GetObject(getter serodb.Getter, hash []byte, item CItem) (ret CItem) { k := key{self.Pre, hash} if v, err := getter.Get([]byte(k.k())); err != nil { return } else { if e := rlp.DecodeBytes(v, item); e != nil { return nil } return item } } ================================================ FILE: zero/consensus/fakedb.go ================================================ package consensus import ( "errors" "github.com/sero-cash/go-sero/serodb" ) type FakeTri struct { m map[string][]byte } func NewFakeTri() (ret FakeTri) { ret.m = make(map[string][]byte) return } func (self *FakeTri) Get(key []byte) ([]byte, error) { return self.TryGet(key) } func (self *FakeTri) Has(key []byte) (bool, error) { if _, ok := self.m[string(key)]; !ok { return false, nil } else { return true, nil } } func (self *FakeTri) TryGet(key []byte) ([]byte, error) { if v, ok := self.m[string(key)]; !ok { return nil, errors.New("can not find value") } else { return v, nil } } func (self *FakeTri) Put(key, value []byte) error { return self.TryUpdate(key, value) } func (self *FakeTri) TryUpdate(key, value []byte) error { str := string(key) self.m[str] = append([]byte{}, value...) return nil } func (self *FakeTri) Delete(key []byte) error { return self.TryDelete(key) } func (self *FakeTri) TryDelete(key []byte) error { if _, ok := self.m[string(key)]; ok { delete(self.m, string(key)) return nil } else { return errors.New("delete a empty item") } } type FakeDB struct { tri FakeTri db FakeTri } func NewFakeDB() (ret FakeDB) { ret.tri = NewFakeTri() ret.db = NewFakeTri() return } func (self *FakeDB) Num() uint64 { return 0 } func (self *FakeDB) CurrentTri() serodb.Tri { return &self.tri } func (self *FakeDB) GlobalGetter() serodb.Getter { return &self.db } ================================================ FILE: zero/consensus/iface.go ================================================ package consensus import ( "github.com/sero-cash/go-sero/serodb" ) type DB interface { CurrentTri() serodb.Tri GlobalGetter() serodb.Getter } type CItem interface { CopyTo() (ret CItem) CopyFrom(CItem) } type PItem interface { CItem Id() (ret []byte) State() (ret []byte) } ================================================ FILE: zero/consensus/kvpoint.go ================================================ package consensus type KVPoint struct { keyPre string cons *Cons } func NewKVPt(cons *Cons, keyPre string, inblock string) (ret KVPoint) { ret.keyPre = keyPre ret.cons = cons return } func (self *KVPoint) SetValue(id []byte, value []byte) { v := Bytes(value) self.cons.addObj(&key{self.keyPre, id}, &v, true, nil, nil) return } func (self *KVPoint) GetValue(id []byte) (ret []byte) { if v := self.cons.getObj(&key{self.keyPre, id}, &Bytes{}, true, false); v != nil && v.item != nil { ret = append([]byte{}, *v.item.(*Bytes)...) return } return nil } ================================================ FILE: zero/consensus/objpoint.go ================================================ package consensus import "errors" type ObjPoint struct { objPre string statePre string inblock string cons *Cons } func NewObjPt(cons *Cons, objPre string, statePre string, inblock string) (ret ObjPoint) { ret.objPre = objPre ret.statePre = statePre ret.inblock = inblock ret.cons = cons return } func (self *ObjPoint) AddObj(item PItem) { if item == nil { panic(errors.New("item can not be nil")) } stateHash := Bytes(item.State()) self.cons.addObj(&key{self.objPre, item.Id()}, &stateHash, true, nil, nil) self.cons.addObj(&key{self.statePre, stateHash}, item, false, &inBlock{self.inblock, item.Id()}, &inDB{item.Id()}) return } func (self *ObjPoint) GetObj(id []byte, item PItem) (ret CItem) { if v := self.cons.getObj(&key{self.objPre, id}, &Bytes{}, true, false); v != nil && v.item != nil { stateHash := *v.item.(*Bytes) if v := self.cons.getObj(&key{self.statePre, stateHash}, item, false, true); v != nil && v.item != nil { return v.item.(CItem) } } return nil } ================================================ FILE: zero/localdb/block.go ================================================ package localdb import ( "math/big" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/rlp" "github.com/sero-cash/go-sero/serodb" "github.com/sero-cash/go-sero/zero/txs/zstate/tri" ) type Block struct { Roots []c_type.Uint256 Dels []c_type.Uint256 Pkgs []c_type.Uint256 } func (self *Block) Serial() (ret []byte, e error) { if self != nil { if bytes, err := rlp.EncodeToBytes(self); err != nil { e = err return } else { ret = bytes return } } else { return } } type BlockGet struct { Out *Block } func (self *BlockGet) Unserial(v []byte) (e error) { if len(v) == 0 { return } else { out := Block{} if err := rlp.DecodeBytes(v, &out); err != nil { return } else { self.Out = &out return } } } func BlockKey(num uint64, hash *c_type.Uint256) []byte { block_key := []byte("$SERO_ZSTATE_BLOCK_SHOOTCUT$") block_key = append(block_key, big.NewInt(int64(num)).Bytes()...) block_key = append(block_key, []byte("$")...) block_key = append(block_key, hash[:]...) return block_key } func PutBlock(db serodb.Putter, num uint64, hash *c_type.Uint256, block *Block) { blockkey := BlockKey(num, hash) tri.UpdateDBObj(db, blockkey, block) } func GetBlock(db serodb.Database, num uint64, hash *c_type.Uint256) (ret *Block) { blockkey := BlockKey(num, hash) blockget := BlockGet{} tri.GetDBObj(db, blockkey, &blockget) ret = blockget.Out return } ================================================ FILE: zero/localdb/out.go ================================================ package localdb import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/rlp" "github.com/sero-cash/go-sero/zero/txs/stx/stx_v0" "github.com/sero-cash/go-sero/zero/txs/stx/stx_v1" "github.com/sero-cash/go-sero/zero/utils" ) type OutState struct { Index uint64 Out_O *stx_v0.Out_O `rlp:"nil"` Out_Z *stx_v0.Out_Z `rlp:"nil"` Out_P *stx_v1.Out_P `rlp:"nil"` Out_C *stx_v1.Out_C `rlp:"nil"` OutCM *c_type.Uint256 `rlp:"nil"` RootCM *c_type.Uint256 `rlp:"nil"` } func (self *OutState) genOutCM() { if self.OutCM == nil { if cm, err := genOutCM(self); err != nil { panic(err) return } else { self.OutCM = &cm return } } else { return } } func (self *OutState) TryGetOutCM() (ret *c_type.Uint256) { if self.Out_O != nil { ret = self.OutCM return } else if self.Out_Z != nil { ret = &self.Out_Z.OutCM return } else { return } } func (self *OutState) GenRootCM() { if self.Out_O != nil { self.genOutCM() } if self.RootCM == nil { if cm, err := genRootCM(self); err != nil { panic(err) return } else { self.RootCM = &cm return } } else { return } } func (out *OutState) TxType() string { if out.Out_O != nil { return "Out_O" } if out.Out_Z != nil { return "Out_Z" } if out.Out_P != nil { return "Out_P" } if out.Out_C != nil { return "Out_C" } return "EMPTY" } func (out *OutState) IsZero() bool { if out.Out_Z != nil || out.Out_C != nil { return true } else { return false } } func (out *OutState) IsSzk() bool { if out.Out_P != nil || out.Out_C != nil { return true } return false } func (self *OutState) Clone() (ret OutState) { utils.DeepCopy(&ret, self) return } func (self *OutState) ToPKr() *c_type.PKr { if self.Out_O != nil { return &self.Out_O.Addr } else if self.Out_Z != nil { return &self.Out_Z.PKr } else if self.Out_P != nil { return &self.Out_P.PKr } else if self.Out_C != nil { return &self.Out_C.PKr } return nil } func (self *OutState) Serial() (ret []byte, e error) { if self != nil { return rlp.EncodeToBytes(self) } else { return } } type OutState0Get struct { Out *OutState } func (self *OutState0Get) Unserial(v []byte) (e error) { if len(v) == 0 { self.Out = nil return } else { self.Out = &OutState{} if err := rlp.DecodeBytes(v, &self.Out); err != nil { e = err return } else { return } } } ================================================ FILE: zero/localdb/out_commitment.go ================================================ package localdb import ( "github.com/pkg/errors" "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/crypto" "github.com/sero-cash/go-sero/zero/utils" ) func HashIndexRsk(index uint64) (ret c_type.Uint256) { ret = utils.NewU256(index).ToRef().ToUint256() return } func HashIndexAr(index uint64) (ret c_type.Uint256) { index_bytes := utils.NewU256(index) pre_ar := index_bytes.ToUint256() ar_bytes := crypto.Keccak256(pre_ar[:]) copy(ret[:], ar_bytes) ret = c_superzk.ForceFr(&ret) return } func genOutCM(self *OutState) (cm c_type.Uint256, e error) { if self.Out_O != nil { cm, e = c_superzk.Czero_genOutCM( self.Out_O.Asset.ToTypeAsset().NewRef(), &self.Out_O.Memo, &self.Out_O.Addr, HashIndexRsk(self.Index).NewRef(), ) return } else if self.Out_Z != nil { cm = self.Out_Z.OutCM return } else { e = errors.New("no output for out cm") return } } func genRootCM(self *OutState) (cm c_type.Uint256, e error) { if self.Out_O != nil { out_cm := self.OutCM cm = c_superzk.Czero_genRootCM(self.Index, out_cm) return } else if self.Out_Z != nil { out_cm := self.Out_Z.OutCM cm = c_superzk.Czero_genRootCM(self.Index, &out_cm) return } else if self.Out_P != nil { ar := HashIndexAr(self.Index) type_asset := self.Out_P.Asset.ToTypeAsset() cm, e = c_superzk.GenRootCM_P( self.Index, &type_asset, &ar, &self.Out_P.PKr, ) return } else if self.Out_C != nil { cm, e = c_superzk.GenRootCM_C( self.Index, &self.Out_C.AssetCM, &self.Out_C.PKr, ) return } else { e = errors.New("no output for root cm") return } } ================================================ FILE: zero/localdb/out_test.go ================================================ package localdb import ( "fmt" "testing" "github.com/sero-cash/go-sero/rlp" ) type Test struct { I0 int I1 int } type Test1 struct { I0 int I1 int I2 int } func TestRlp(t *testing.T) { test := Test{1, 2} bs, _ := rlp.EncodeToBytes(&test) var test1 Test1 e := rlp.DecodeBytes(bs, &test1) fmt.Println(e) fmt.Println(test1.I2) } ================================================ FILE: zero/localdb/out_vserial.go ================================================ package localdb import ( "io" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/core/types/vserial" "github.com/sero-cash/go-sero/rlp" "github.com/sero-cash/go-sero/zero/txs/stx/stx_v0" "github.com/sero-cash/go-sero/zero/txs/stx/stx_v1" ) type OutState_Version0 struct { Index uint64 Out_O *stx_v0.Out_O `rlp:"nil"` Out_Z *stx_v0.Out_Z `rlp:"nil"` OutCM *c_type.Uint256 `rlp:"nil"` RootCM *c_type.Uint256 `rlp:"nil"` } type OutState_Version1 struct { Out_P *stx_v1.Out_P `rlp:"nil"` Out_C *stx_v1.Out_C `rlp:"nil"` } func (b *OutState) DecodeRLP(s *rlp.Stream) error { vs := vserial.NewVSerial() v0 := OutState_Version0{} v1 := OutState_Version1{} vs.Add(&v0, vserial.VERSION_0) vs.Add(&v1, vserial.VERSION_1) if e := s.Decode(&vs); e != nil { return e } if vs.V() <= vserial.VERSION_1 { SetOSForVersion0(b, &v0) if vs.V() >= vserial.VERSION_1 { SetOSForVersion1(b, &v1) } } return nil } func SetVersion0ForOS(v0 *OutState_Version0, b *OutState) { v0.Index = b.Index v0.Out_O = b.Out_O v0.Out_Z = b.Out_Z v0.OutCM = b.OutCM v0.RootCM = b.RootCM } func SetOSForVersion0(b *OutState, v0 *OutState_Version0) { b.Index = v0.Index b.Out_O = v0.Out_O b.Out_Z = v0.Out_Z b.OutCM = v0.OutCM b.RootCM = v0.RootCM } func SetVersion1ForOS(v1 *OutState_Version1, b *OutState) { v1.Out_P = b.Out_P v1.Out_C = b.Out_C } func SetOSForVersion1(b *OutState, v1 *OutState_Version1) { b.Out_P = v1.Out_P b.Out_C = v1.Out_C } func (b *OutState) EncodeRLP(w io.Writer) error { vs := vserial.NewVSerial() v0 := OutState_Version0{} SetVersion0ForOS(&v0, b) vs.Add(&v0, vserial.VERSION_0) if b.IsSzk() { v1 := OutState_Version1{} SetVersion1ForOS(&v1, b) vs.Add(&v1, vserial.VERSION_1) } return rlp.Encode(w, &vs) } ================================================ FILE: zero/localdb/outstat.go ================================================ package localdb import ( "time" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/rlp" "github.com/sero-cash/go-sero/serodb" "github.com/sero-cash/go-sero/zero/txs/zstate/tri" "github.com/sero-cash/go-sero/zero/utils" ) type OutStat struct { Time int64 Value utils.U256 Z bool } func (self *OutStat) Serial() (ret []byte, e error) { if self != nil { return rlp.EncodeToBytes(self) } else { return } } type OutStatGet struct { out *OutStat } func (self *OutStatGet) Unserial(v []byte) (e error) { if len(v) == 0 { self.out = nil return } else { self.out = &OutStat{} if err := rlp.DecodeBytes(v, self.out); err != nil { e = err return } else { return } } } func outStatName(root *c_type.Uint256) (ret []byte) { ret = []byte("$ZSTATE_OUT_STAT$") ret = append(ret, root[:]...) return } func UpdateOutStat(db serodb.Putter, root *c_type.Uint256, os *OutStat) { os.Time = time.Now().UnixNano() tri.UpdateDBObj(db, outStatName(root), os) } func GetOutStat(db serodb.Getter, root *c_type.Uint256) (ret *OutStat) { get := OutStatGet{} tri.GetDBObj(db, outStatName(root), &get) if get.out != nil { ret = get.out } return } ================================================ FILE: zero/localdb/pkg.go ================================================ package localdb import ( "math/big" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/crypto/sha3" "github.com/sero-cash/go-sero/rlp" "github.com/sero-cash/go-sero/serodb" "github.com/sero-cash/go-sero/zero/txs/stx" "github.com/sero-cash/go-sero/zero/txs/zstate/tri" ) type ZPkg struct { High uint64 From c_type.PKr Pack stx.PkgCreate Closed bool } func (self *ZPkg) ToHash() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(big.NewInt(int64(self.High)).Bytes()) d.Write(self.From[:]) d.Write(self.Pack.ToHash().NewRef()[:]) if self.Closed { d.Write([]byte{1}) } else { d.Write([]byte{0}) } copy(ret[:], d.Sum(nil)) return ret } func (self *ZPkg) Serial() (ret []byte, e error) { return rlp.EncodeToBytes(self) } type PkgGet struct { Out *ZPkg } func (self *PkgGet) Unserial(v []byte) (e error) { if len(v) < 2 { self.Out = nil return } else { self.Out = &ZPkg{} if err := rlp.DecodeBytes(v, &self.Out); err != nil { e = err self.Out = nil return } else { return } } } func PkgKey(root *c_type.Uint256) []byte { key := []byte("$SERO_LOCALDB_PKG_HASH$") key = append(key, root[:]...) return key } func PutPkg(db serodb.Putter, hash *c_type.Uint256, pkg *ZPkg) { key := PkgKey(hash) tri.UpdateDBObj(db, key, pkg) } func GetPkg(db serodb.Getter, hash *c_type.Uint256) (ret *ZPkg) { key := PkgKey(hash) get := PkgGet{} tri.GetDBObj(db, key, &get) ret = get.Out return } ================================================ FILE: zero/localdb/root.go ================================================ package localdb import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/rlp" "github.com/sero-cash/go-sero/serodb" "github.com/sero-cash/go-sero/zero/txs/zstate/tri" ) type RootState struct { OS OutState TxHash c_type.Uint256 Num uint64 } func (self *RootState) Serial() (ret []byte, e error) { if self != nil { return rlp.EncodeToBytes(self) } else { return } } type RootStateGet struct { Out *RootState } func (self *RootStateGet) Unserial(v []byte) (e error) { if len(v) == 0 { self.Out = nil return } else { self.Out = &RootState{} if err := rlp.DecodeBytes(v, &self.Out); err != nil { e = err return } else { return } } } func Root2TxHashKey(root *c_type.Uint256) []byte { key := []byte("$SERO_LOCALDB_ROOTSTATE$") key = append(key, root[:]...) return key } func RootCM2RootKey(root_cm *c_type.Uint256) []byte { key := []byte("$SERO_LOCALDB_ROOTCM2ROOT$") key = append(key, root_cm[:]...) return key } func PutRoot(db serodb.Putter, root *c_type.Uint256, rs *RootState) { rootkey := Root2TxHashKey(root) tri.UpdateDBObj(db, rootkey, rs) rootcmkey := RootCM2RootKey(rs.OS.RootCM) db.Put(rootcmkey, root[:]) } func GetRoot(db serodb.Getter, root *c_type.Uint256) (ret *RootState) { rootkey := Root2TxHashKey(root) rootget := RootStateGet{} tri.GetDBObj(db, rootkey, &rootget) ret = rootget.Out return } func GetRootByRootCM(db serodb.Getter, root_cm *c_type.Uint256) (root *c_type.Uint256) { rootcmkey := RootCM2RootKey(root_cm) if root_bs, err := db.Get(rootcmkey); err != nil { return } else { root = &c_type.Uint256{} copy(root[:], root_bs) return } } ================================================ FILE: zero/proofservice/client.go ================================================ package proofservice import ( "bytes" "encoding/json" "errors" "log" "net/http" "time" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/zero/txtool" "github.com/sero-cash/go-sero/zero/wallet/light" ) type LocalClient struct { backend Backend } func NewLocalClient(backend Backend) *LocalClient { return &LocalClient{backend} } func (self *LocalClient) CommitTx(tx *txtool.GTx) error { return self.backend.CommitTx(tx) } func (self *LocalClient) CheckNils(nils []c_type.Uint256) bool { if nilResps, err := self.backend.CheckNil(nils); err == nil { return len(nilResps) == 0 } return false } type RemoteClient struct { host string } func NewRemoteClient(host string) *RemoteClient { return &RemoteClient{host} } func (self *RemoteClient) CommitTx(tx *txtool.GTx) error { if _, err := commitTx(self.host, tx); err != nil { return err } return nil } func (self *RemoteClient) CheckNils(nils []c_type.Uint256) bool { return checkNils(self.host, nils) } func checkNils(host string, nils []c_type.Uint256) bool { resp, err := doPost(host, "light_checkNil", []interface{}{nils}) if err != nil { return false } nilResps := []light.NilValue{} message := *resp.Result err = json.Unmarshal(message[:], &nilResps) if err != nil { return false } return len(nilResps) == 0 } func commitTx(host string, tx *txtool.GTx) (string, error) { hash := tx.Tx.ToHash() _, err := doPost(host, "sero_commitTx", []interface{}{tx}) if err != nil { return common.Bytes2Hex(hash[:]), err } return common.Bytes2Hex(hash[:]), nil } type JSONRpcResp struct { Id *json.RawMessage `json:"id"` Result *json.RawMessage `json:"result"` Error map[string]interface{} `json:"error"` } func doPost(url string, method string, params interface{}) (*JSONRpcResp, error) { client := &http.Client{ Timeout: MustParseDuration("900s"), } jsonReq := map[string]interface{}{"jsonrpc": "2.0", "method": method, "params": params, "id": 0} data, err := json.Marshal(jsonReq) if err != nil { log.Printf(err.Error()) return nil, err } req, err := http.NewRequest("POST", url, bytes.NewBuffer(data)) if err != nil { log.Printf(err.Error()) return nil, err } req.Header.Set("Content-Length", (string)(len(data))) req.Header.Set("Content-Type", "application/json") req.Header.Set("Accept", "application/json") resp, err := client.Do(req) if err != nil { return nil, err } defer resp.Body.Close() var rpcResp *JSONRpcResp err = json.NewDecoder(resp.Body).Decode(&rpcResp) if err != nil { return nil, err } if rpcResp.Error != nil { return nil, errors.New(rpcResp.Error["message"].(string)) } data, _ = json.Marshal(rpcResp) return rpcResp, err } func MustParseDuration(s string) time.Duration { value, err := time.ParseDuration(s) if err != nil { panic("util: Can't parse duration `" + s + "`: " + err.Error()) } return value } ================================================ FILE: zero/proofservice/proofservice.go ================================================ package proofservice import ( "errors" "math/big" "sync" "sync/atomic" "time" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/zero/txs/stx" "github.com/sero-cash/go-sero/zero/txtool" "github.com/sero-cash/go-sero/zero/txtool/flight" "github.com/sero-cash/go-sero/zero/wallet/light" ) type ServiceFee struct { ZinFee *big.Int OinFee *big.Int OutFee *big.Int FixedFee *big.Int } type Job struct { TxHash common.Hash Timestamp time.Time Error error tx *stx.T param *txtool.GTxParam } func newJob(tx *stx.T, param *txtool.GTxParam) *Job { return &Job{tx: tx, param: param} } var instance *ProofService type Config struct { PKr c_type.PKr MaxWorkNumber int MaxQueueNumber int Fee ServiceFee } type ProofService struct { rpc string config *Config queueChan chan *Job workChan chan *Job jobs sync.Map workNum int32 client SeroClient // redisClient *RedisClient storage Storage } func Instance() *ProofService { return instance } type Backend interface { CommitTx(tx *txtool.GTx) error CheckNil(Nils []c_type.Uint256) (nilResps []light.NilValue, e error) } type SeroClient interface { CheckNils(nils []c_type.Uint256) bool CommitTx(tx *txtool.GTx) error } type Storage interface { Exists(common.Hash) bool Save(job *Job) Get(hash common.Hash) *Job } type MapStorage struct { cache map[common.Hash]*Job } func newMapStorage() *MapStorage { return &MapStorage{make(map[common.Hash]*Job)} } func (storage *MapStorage) Exists(hash common.Hash) bool { _, ok := storage.cache[hash] return ok } func (storage *MapStorage) Save(job *Job) { hash := job.tx.Tx1.Tx1_Hash() storage.cache[common.BytesToHash(hash[:])] = job } func (storage *MapStorage) Get(hash common.Hash) *Job { return storage.cache[hash] } func NewProofService(rpc string, backend Backend, config *Config) *ProofService { proof := &ProofService{ rpc: rpc, config: config, queueChan: make(chan *Job, config.MaxQueueNumber), } proof.client = NewLocalClient(backend) proof.storage = newMapStorage() instance = proof go proof.loop() log.Info("ProofService start", "config:", config) return proof } func (proof *ProofService) FindTxHash(hash common.Hash) common.Hash { job := proof.storage.Get(hash) if job != nil { return job.TxHash } return common.Hash{} } var sero = *common.BytesToHash(common.LeftPadBytes([]byte("SERO"), 32)).HashToUint256() func (proof *ProofService) checkFee(param *txtool.GTxParam) bool { if proof.config.Fee.FixedFee.Sign() > 0 { for _, out := range param.Outs { if out.PKr == proof.config.PKr { if out.Asset.Tkn != nil { if out.Asset.Tkn.Currency == sero { amount := out.Asset.Tkn.Value.ToInt() return amount.Cmp(proof.config.Fee.FixedFee) >= 0 } } break } } } else { fee := big.NewInt(0) for _, in := range param.Ins { if in.Out.State.OS.Out_P != nil { fee = new(big.Int).Add(fee, proof.config.Fee.ZinFee) } else if in.Out.State.OS.Out_C != nil { fee = new(big.Int).Add(fee, proof.config.Fee.OinFee) } else { return false } } fee = new(big.Int).Add(fee, new(big.Int).Mul(proof.config.Fee.OutFee, big.NewInt(int64(len(param.Outs)-1)))) for _, out := range param.Outs { if out.PKr == proof.config.PKr { if out.Asset.Tkn != nil { if out.Asset.Tkn.Currency == sero { amount := out.Asset.Tkn.Value.ToInt() return amount.Cmp(fee) >= 0 } } break } } } return false } func (proof *ProofService) Fee() ServiceFee { return proof.config.Fee } func (proof *ProofService) SubmitWork(tx *stx.T, param *txtool.GTxParam) error { hash := tx.Tx1_Hash() if !proof.checkFee(param) { log.Error("check fee error", "txHash", common.Bytes2Hex(hash[:])) errors.New("checkFee error") } if proof.storage.Exists(common.BytesToHash(hash[:])) { log.Warn("already exists", "txHash", common.Bytes2Hex(hash[:])) return errors.New("already exists") } job := newJob(tx, param) if TryEnqueue(job, proof.queueChan) { proof.storage.Save(job) return nil } return errors.New("server is busy") } func (proof *ProofService) processJob(job *Job) { gtx, err := flight.ProveTx1(job.tx, job.param) if err != nil { log.Error("processJob error", "error", err) job.Error = err proof.storage.Save(job) return } if err := proof.client.CommitTx(>x); err != nil { log.Error("processJob error", "error", err) job.Error = err proof.storage.Save(job) return } txHash := gtx.Tx.ToHash() job.TxHash = common.BytesToHash(txHash[:]) proof.storage.Save(job) } func (proof *ProofService) loop() { clear := time.NewTicker(time.Minute * 10) defer clear.Stop() for { for proof.workNum >= 5 { time.Sleep(time.Second) } select { case job := <-proof.queueChan: atomic.AddInt32(&proof.workNum, 1) go func() { defer atomic.AddInt32(&proof.workNum, -1) proof.processJob(job) }() case <-clear.C: proof.jobs.Range(func(key, value interface{}) bool { job := value.(*Job) if job.Timestamp.Add(time.Hour * 2).Before(time.Now()) { proof.jobs.Delete(key) } return true }) } } } func TryEnqueue(job *Job, jobChan chan *Job) bool { select { case jobChan <- job: return true default: return false } } ================================================ FILE: zero/snapshot/generator.go ================================================ package snapshot import ( "fmt" "github.com/sero-cash/go-czero-import/seroparam" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core/rawdb" "github.com/sero-cash/go-sero/core/state" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/serodb" "github.com/sero-cash/go-sero/trie" "github.com/sero-cash/go-sero/zero/consensus" "github.com/sero-cash/go-sero/zero/localdb" "github.com/sero-cash/go-sero/zero/stake" "log" "os" ) type SnapshotGen struct { src_db *serodb.LDBDatabase src_state_db state.Database src_head_block_hash common.Hash src_head_num int64 target_db *serodb.LDBDatabase target_head_block_hash common.Hash target_head_num int64 blockStop chan bool stateStop chan bool } func NewSnapshotGen(src string,target string) (ret *SnapshotGen,err error) { sg:=SnapshotGen{} if sg.src_db,err=serodb.NewLDBDatabaseEx(src,1024*8,1024,true);err!=nil { return nil,err } sg.src_state_db=state.NewDatabase(sg.src_db) { hash := rawdb.ReadHeadBlockHash(sg.src_db) num := *rawdb.ReadHeaderNumber(sg.src_db, hash) header := rawdb.ReadHeader(sg.src_db, hash, num) for { if _, err := state.New(sg.src_state_db, header); err == nil { sg.src_head_num = header.Number.Int64() sg.src_head_block_hash = header.Hash() break } header = rawdb.ReadHeader(sg.src_db, header.ParentHash, header.Number.Uint64()-1) } } if err=sg.VerifyDB();err!=nil { return nil,err } if err=os.MkdirAll(target,os.ModePerm);err!=nil { return nil,err } if sg.target_db,err=serodb.NewLDBDatabase(target,1024*8,1024);err!=nil { return nil,err } sg.target_head_block_hash=rawdb.ReadHeadBlockHash(sg.target_db) if num:=rawdb.ReadHeaderNumber(sg.target_db,sg.target_head_block_hash);num!=nil { sg.target_head_num=int64(*num) } else { sg.target_head_num=-1 } sg.blockStop=make(chan bool) sg.stateStop=make(chan bool) return &sg,nil } func (self *SnapshotGen) Close() { self.src_db.Close(); self.target_db.Close(); } func (self *SnapshotGen) RunBlock() { for { if self.ProcessBlock(10000)==true { break } log.Print("Process Block:",self.target_head_num) } self.blockStop<-true } func (self *SnapshotGen) RunState() { num:=uint64(self.src_head_num) hblock := rawdb.ReadCanonicalHash(self.src_db, num) header := rawdb.ReadHeader(self.src_db, hblock, num) if ok,count:=self.ProcessState(header.Root);ok { log.Print("End Process State:", num,"count=",count) } self.stateStop<-true } func (self *SnapshotGen) Run() { go self.RunBlock() go self.RunState() <-self.blockStop <-self.stateStop } func (self *SnapshotGen) VerifyDB() error { var num uint64 =1310000; hash:=rawdb.ReadCanonicalHash(self.src_db,num) consKeys:=consensus.GetConsKeys(self.src_db,num,hash) if len(consKeys)==0 { return fmt.Errorf("The src db is not SIP10 Snapshot") } else { return nil } } func (self *SnapshotGen) ProcessBlock(step int) (bool) { if step==0 { return true } if self.target_head_num>=self.src_head_num { return true } if self.target_head_num+int64(step)>self.src_head_num { step=int(self.src_head_num-self.target_head_num) } batch:=self.target_db.NewBatch() for i:=0;i<step;i++ { self.target_head_num++ num:=uint64(self.target_head_num); self.target_head_block_hash = rawdb.ReadCanonicalHash(self.src_db, num) hblock:=self.target_head_block_hash rawdb.WriteCanonicalHash(batch, hblock, num) if self.target_head_num==0 { config:=rawdb.ReadChainConfig(self.src_db,hblock) rawdb.WriteChainConfig(batch,hblock,config) ver:=rawdb.ReadDatabaseVersion(self.src_db) rawdb.WriteDatabaseVersion(batch,ver) } header:=rawdb.ReadHeader(self.src_db,hblock,num) rawdb.WriteHeader(batch,header) body:=rawdb.ReadBody(self.src_db,hblock,num) rawdb.WriteBody(batch,hblock,num,body) block:=types.NewBlockWithHeader(header).WithBody(body.Transactions) rawdb.WriteTxLookupEntries(batch,block) receipts:=rawdb.ReadReceipts(self.src_db,hblock,num) rawdb.WriteReceipts(batch,hblock,num,receipts) td:=rawdb.ReadTd(self.src_db,hblock,num) rawdb.WriteTd(batch,hblock,num,td) lcBlock:=localdb.GetBlock(self.src_db,num,hblock.HashToUint256()) localdb.PutBlock(batch,num,hblock.HashToUint256(),lcBlock) for _,pkg:=range lcBlock.Pkgs { p:=localdb.GetPkg(self.src_db,&pkg) localdb.PutPkg(batch,&pkg,p) } for _,root:=range lcBlock.Roots { r:=localdb.GetRoot(self.src_db,&root) if r==nil { if num>=seroparam.SIP2() { panic("root state err") } } else { localdb.PutRoot(batch,&root,r) } } consKeys := consensus.GetConsKeys(self.src_db, num, hblock) if len(consKeys) > 0 { consensus.PutConsKeys(batch, num, hblock, consKeys) for _, key := range consKeys { if v, err := self.src_db.Get(key); err != nil { panic(err) } else { batch.Put(key, v) } } } bsnkey := stake.BlockShareNumKey(hblock) if v, err := self.src_db.Get(bsnkey); err != nil { } else { batch.Put(bsnkey, v) } bvkey := stake.BlockVotesKey(hblock) if v, err := self.src_db.Get(bvkey); err != nil { } else { batch.Put(bvkey, v) } } rawdb.WriteHeadBlockHash(batch,self.target_head_block_hash) rawdb.WriteHeadHeaderHash(batch,self.target_head_block_hash) rawdb.WriteHeadFastBlockHash(batch,self.target_head_block_hash) batch.Write() return false } func (self *SnapshotGen) ProcessState(root common.Hash) (bool,int) { const batch_num int=1024*10; sched := state.NewStateSync(root,self.target_db) queue := append([]common.Hash{}, sched.Missing(batch_num)...) count:=0 for len(queue) > 0 { results := make([]trie.SyncResult, len(queue)) const c int=1024 input:=make(chan int) end:=make(chan bool) output:=make(chan bool) for i:=0;i<c;i++ { go func() { DONE: for { select { case index := <-input: hash := queue[index] data, err := self.src_state_db.TrieDB().Node(hash) if err != nil { panic("tri get node error") } results[index] = trie.SyncResult{Hash: hash, Data: data} case <-end: break DONE } } output <- true }() } for i:=0;i<len(queue);i++ { input<-i } for i:=0;i<c;i++ { end<-true } for i:=0;i<c;i++ { <-output } if _, _, err := sched.Process(results); err != nil { panic("sched process error") } if ct, err := sched.Commit(self.target_db); err != nil { panic("sched commit error") } else { log.Print("trie:",ct) count+=ct } queue = append(queue[:0], sched.Missing(batch_num)...) } return true,count } ================================================ FILE: zero/snapshot/snapshot_test.go ================================================ package snapshot import ( "testing" ) func TestSnapshot(t *testing.T) { sg,_:=NewSnapshotGen( "/Users/tangzhige/Documents/Env/gero/data0/datadir/gero/chaindata", "/Users/tangzhige/Documents/Env/gero/data0/datadir/gero/chaindata_bk", ) sg.Run() sg.Close() } ================================================ FILE: zero/stake/Hash256PRNG.go ================================================ package stake import ( "encoding/binary" "fmt" "github.com/sero-cash/go-sero/common" ) var ( // seedConst is a constant derived from the hex representation of pi. It // is used along with a caller-provided seed when initializing // the deterministic lottery prng. seedConst = [8]byte{0x24, 0x3F, 0x6A, 0x88, 0x85, 0xA3, 0x08, 0xD3} ) // Hash256PRNG is a determinstic pseudorandom number generator that uses a // 256-bit secure hashing function to generate random uint32s starting from // an initial seed. type Hash256PRNG struct { seed common.Hash // The seed used to initialize hashIdx int // Position in the cached hash idx uint64 // Position in the hash iterator lastHash common.Hash // Cached last hash used } // CalcHash256PRNGIV calculates and returns the initialization vector for a // given seed. This can be used in conjunction with the NewHash256PRNGFromIV // function to arrive at the same values that are produced when calling // NewHash256PRNG with the seed. func CalcHash256PRNGIV(seed []byte) common.Hash { buf := make([]byte, len(seed)+len(seedConst)) copy(buf, seed) copy(buf[len(seed):], seedConst[:]) return common.BytesToHash(buf) } // NewHash256PRNGFromIV returns a deterministic pseudorandom number generator // that uses a 256-bit secure hashing function to generate random uint32s given // an initialization vector. The CalcHash256PRNGIV can be used to calculate an // initialization vector for a given seed such that the generator will produce // the same values as if NewHash256PRNG were called with the same seed. This // allows callers to cache and reuse the initialization vector for a given seed // to avoid recomputation. func NewHash256PRNGFromIV(iv common.Hash) *Hash256PRNG { // idx and lastHash are automatically initialized // as 0. We initialize the seed by appending a constant // to it and hashing to give 32 bytes. This ensures // that regardless of the input, the PRNG is always // doing a short number of rounds because it only // has to hash < 64 byte messages. The constant is // derived from the hexadecimal representation of // pi. hp := new(Hash256PRNG) hp.seed = iv hp.lastHash = hp.seed hp.idx = 0 return hp } // NewHash256PRNG returns a deterministic pseudorandom number generator that // uses a 256-bit secure hashing function to generate random uint32s given a // seed. func NewHash256PRNG(seed []byte) *Hash256PRNG { return NewHash256PRNGFromIV(CalcHash256PRNGIV(seed)) } // StateHash returns a hash referencing the current state the deterministic PRNG. func (hp *Hash256PRNG) StateHash() common.Hash { fHash := hp.lastHash fIdx := hp.idx fHashIdx := hp.hashIdx finalState := make([]byte, len(fHash)+4+1) copy(finalState, fHash[:]) binary.BigEndian.PutUint32(finalState[len(fHash):], uint32(fIdx)) finalState[len(fHash)+4] = byte(fHashIdx) return common.BytesToHash(finalState) } // Hash256Rand returns a uint32 random number using the pseudorandom number // generator and updates the state. func (hp *Hash256PRNG) Hash256Rand() uint32 { r := binary.BigEndian.Uint32(hp.lastHash[hp.hashIdx*4 : hp.hashIdx*4+4]) hp.hashIdx++ // 'roll over' the hash index to use and store it. if hp.hashIdx > 7 { idxB := make([]byte, 4) binary.BigEndian.PutUint32(idxB, uint32(hp.idx)) hp.lastHash = common.BytesToHash(append(hp.seed[:], idxB...)) hp.idx++ hp.hashIdx = 0 } // 'roll over' the PRNG by re-hashing the seed when // we overflow idx. if hp.idx > 0xFFFFFFFF { hp.seed = common.BytesToHash(hp.seed[:]) hp.lastHash = hp.seed hp.idx = 0 } return r } // uniformRandom returns a random in the range [0 ... upperBound) while avoiding // modulo bias, thus giving a normal distribution within the specified range. // // Ported from // https://github.com/conformal/clens/blob/master/src/arc4random_uniform.c func (hp *Hash256PRNG) uniformRandom(upperBound uint32) uint32 { var r, min uint32 if upperBound < 2 { return 0 } if upperBound > 0x80000000 { min = 1 + ^upperBound } else { // (2**32 - (x * 2)) % x == 2**32 % x when x <= 2**31 min = ((0xFFFFFFFF - (upperBound * 2)) + 1) % upperBound } for { r = hp.Hash256Rand() if r >= min { break } } return r % upperBound } // intInSlice returns true if an integer is in the passed slice, false otherwise. func intInSlice(i uint32, sl []uint32) bool { for _, e := range sl { if i == e { return true } } return false } // findShareIdxs finds n many unique index numbers for a list length size. func findShareIdxs(size uint32, n uint16, prng *Hash256PRNG) ([]uint32, error) { if size < uint32(n) { return nil, fmt.Errorf("list size too small: %v < %v", size, n) } max := int64(0xFFFFFFFF) if int64(size) > max { return nil, fmt.Errorf("list size too big: %v > %v", size, max) } sz := uint32(size) var list []uint32 var listLen uint16 for listLen < n { r := prng.uniformRandom(sz) if !intInSlice(r, list) { list = append(list, r) listLen++ } } return list, nil } // FindShareIdxs is the exported version of findShareIdxs used for testing. func FindShareIdxs(size uint32, n uint16, prng *Hash256PRNG) ([]uint32, error) { return findShareIdxs(size, n, prng) } ================================================ FILE: zero/stake/ITree.go ================================================ package stake import ( "fmt" "github.com/sero-cash/go-czero-import/seroparam" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/zero/utils" ) type ITree interface { Insert(*Node) Delete(nodeHash common.Hash, num uint32) *Node FindByIndex(index uint32) (*Node, error) Midtraverse() // GetNode(nodeHash common.Hash) *Node Size() uint32 } func NewTree(state State, blockNumber uint64) ITree { if blockNumber >= seroparam.SIP8() { return &AVLTree{state} } else { return &STree{state} } } type Node struct { pkey common.Hash key common.Hash num uint32 total uint32 factor int } func (node *Node) Print() { padn := "|" // for i := 2; i <= node.height; i++ { // padn += " " // } if node == nil || node.key == emptyHash { return } fmt.Printf("%02v, %s%s, %v, %v\n", node.factor, padn, node.key.String(), node.total, node.num) } func (node *Node) copy() *Node { return &Node{node.pkey, node.key, node.num, node.total, node.factor} } func (node *Node) del(state State) { state.GetStakeState(node.totalKey()) } func (node *Node) load(state State) *Node { total := state.GetStakeState(node.totalKey()) num := state.GetStakeState(node.numKey()) factor := state.GetStakeState(node.factorKey()) node.total = utils.DecodeNumber32(total[28:32]) node.num = utils.DecodeNumber32(num[28:32]) node.factor = int(utils.DecodeNumber32(factor[28:32])) return node } func (node *Node) store(state State) { state.SetStakeState(node.totalKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(uint32(node.total)), 32))) state.SetStakeState(node.numKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(uint32(node.num)), 32))) state.SetStakeState(node.factorKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(uint32(node.factor)), 32))) state.SetStakeState(node.leftKey(), emptyHash) state.SetStakeState(node.rightKey(), emptyHash) } func (node *Node) setNode(state State, valNode *Node, pkey common.Hash, leftChild, rightChild *Node) { node.key = valNode.key node.num = valNode.num node.pkey = pkey state.SetStakeState(pkey, node.key) state.SetStakeState(node.numKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(uint32(node.num)), 32))) state.SetStakeState(node.factorKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(uint32(node.factor)), 32))) state.SetStakeState(node.totalKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(uint32(node.total)), 32))) if leftChild != nil { state.SetStakeState(node.leftKey(), leftChild.key) } else { state.SetStakeState(node.leftKey(), emptyHash) } if rightChild != nil { state.SetStakeState(node.rightKey(), rightChild.key) } else { state.SetStakeState(node.rightKey(), emptyHash) } } func (node *Node) setLeftChild(state State, left *Node) { if left != nil { state.SetStakeState(node.leftKey(), left.key) } else { state.SetStakeState(node.leftKey(), emptyHash) } } func (node *Node) setRightChild(state State, right *Node) { if right != nil { state.SetStakeState(node.rightKey(), right.key) } else { state.SetStakeState(node.rightKey(), emptyHash) } } func (node *Node) setTotal(state State, val uint32) { node.total = val state.SetStakeState(node.totalKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(uint32(val)), 32))) } func (node *Node) setFactor(state State, val int) { if node.factor != val { node.factor = val state.SetStakeState(node.factorKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(uint32(val)), 32))) } } func (node *Node) setNum(state State, val uint32) { node.num = val state.SetStakeState(node.numKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(uint32(val)), 32))) } func (node *Node) left(state State) *Node { path := node.leftKey() hash := state.GetStakeState(path) if hash == emptyHash { return nil } else { left := &Node{key: hash, pkey: path} return left.load(state) } } func (node *Node) leftChildKey(state State) common.Hash { leftChild := node.left(state) if leftChild != nil { return leftChild.key } else { return emptyHash } } func (node *Node) leftChildTotal(state State) uint32 { leftChild := node.left(state) if leftChild != nil { return leftChild.total } else { return 0 } } func (node *Node) leftChildFactor(state State) int { leftChild := node.left(state) if leftChild != nil { return leftChild.factor } else { return 0 } } func (node *Node) right(state State) *Node { path := node.rightKey() hash := state.GetStakeState(path) if hash == emptyHash { return nil } else { right := &Node{key: hash, pkey: path} return right.load(state) } } func (node *Node) rightChildKey(state State) common.Hash { rightChild := node.right(state) if rightChild != nil { return rightChild.key } else { return emptyHash } } func (node *Node) rightChildFactor(state State) int { rightChild := node.right(state) if rightChild != nil { return rightChild.factor } else { return 0 } } func (node *Node) rightChildTotal(state State) uint32 { rightChild := node.right(state) if rightChild != nil { return rightChild.total } else { return 0 } } func (node *Node) leftKey() common.Hash { hash := common.BytesToHash(node.key[:]) hash[29] = 0 hash[30] = 0 hash[31] = 0 return hash } func (node *Node) rightKey() common.Hash { hash := common.BytesToHash(node.key[:]) hash[29] = 0 hash[30] = 0 hash[31] = 1 return hash } func (node *Node) numKey() common.Hash { hash := common.BytesToHash(node.key[:]) hash[29] = 0 hash[30] = 1 hash[31] = 0 return hash } func (node *Node) totalKey() common.Hash { hash := common.BytesToHash(node.key[:]) hash[29] = 0 hash[30] = 1 hash[31] = 1 return hash } func (node *Node) factorKey() common.Hash { hash := common.BytesToHash(node.key[:]) hash[29] = 1 hash[30] = 0 hash[31] = 0 return hash } func safeSub(a, b uint32) uint32 { if a < b { panic("") } return a - b } ================================================ FILE: zero/stake/avltree.go ================================================ package stake import ( "bytes" "errors" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/zero/utils" ) var ( //errNotExist = errors.New("index is not existed") //errTreeNil = errors.New("tree is null") //errTreeIndexExist = errors.New("tree index is existed") ) var ( rootKey_new = common.BytesToHash([]byte("ROOT")) ) type AVLTree struct { state State } func NewAVLTree(state State) *AVLTree { return &AVLTree{state} } func InitAVLTree(state State) { oldTree := &STree{state} CopyFromOldV0(oldTree) } func CopyFromOldV0(old *STree) *AVLTree { list := make([]*Node, 0) old.midtraverse(old.newRootNode(), func(node *Node) { list = append(list, node) }, nil) old.state.SetStakeState(rootKey, emptyHash) tree := NewAVLTree(old.state) for _, node := range list { old.state.SetStakeState(node.leftKey(), emptyHash) old.state.SetStakeState(node.rightKey(), emptyHash) tree.Insert(&Node{key: node.key, total: node.num, num: node.num, factor: 1}) } return tree } func CopyFromOldV1(old *STree) *AVLTree { old.Lasttraverse(old.newRootNode(), func(node *Node) { left := node.left(old.state) right := node.right(old.state) if left != nil && right != nil { height := max(int(left.factor), int(right.factor)) + 1 old.state.SetStakeState(node.factorKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(uint32(height)), 32))) } else if left != nil { old.state.SetStakeState(node.factorKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(uint32(left.factor)+1), 32))) } else if right != nil { old.state.SetStakeState(node.factorKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(uint32(right.factor)+1), 32))) } else { old.state.SetStakeState(node.factorKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(1), 32))) } }) tree := NewAVLTree(old.state) return tree } func Copy(state State, old *AVLTree) *AVLTree { tree := NewAVLTree(state) node := old.newRootNode() state.SetStakeState(rootKey_new, node.key) old.midtraverse(node, func(node *Node) { node.store(state) node.setLeftChild(state, node.left(old.state)) node.setRightChild(state, node.right(old.state)) // }, nil) return tree } func max(data1 int, data2 int) int { if data1 > data2 { return data1 } return data2 } func (tree *AVLTree) getHeight(node *Node) int { if node == nil { return 0 } data := tree.state.GetStakeState(node.factorKey()) return int(utils.DecodeNumber32(data[28:32])) } func (tree *AVLTree) llRotation(node *Node) *Node { prchild := node.right(tree.state) node.setRightChild(tree.state, prchild.left(tree.state)) prchild.setLeftChild(tree.state, node) node.setFactor(tree.state, max(node.leftChildFactor(tree.state), node.rightChildFactor(tree.state))+1) prchild.setFactor(tree.state, max(prchild.leftChildFactor(tree.state), prchild.rightChildFactor(tree.state))+1) total := safeSub(node.total, prchild.total) + node.rightChildTotal(tree.state) prchild.setTotal(tree.state, node.total) node.setTotal(tree.state, total) return prchild } func (tree *AVLTree) rrRotation(node *Node) *Node { plchild := node.left(tree.state) node.setLeftChild(tree.state, plchild.right(tree.state)) plchild.setRightChild(tree.state, node) node.setFactor(tree.state, max(node.leftChildFactor(tree.state), node.rightChildFactor(tree.state))+1) plchild.setFactor(tree.state, max(plchild.leftChildFactor(tree.state), plchild.rightChildFactor(tree.state))+1) total := safeSub(node.total, plchild.total) + node.leftChildTotal(tree.state) plchild.setTotal(tree.state, node.total) node.setTotal(tree.state, total) return plchild } func (tree *AVLTree) lrRotation(node *Node) *Node { plchild := tree.llRotation(node.left(tree.state)) node.setLeftChild(tree.state, plchild) return tree.rrRotation(node) } func (tree *AVLTree) rlRotation(node *Node) *Node { prchild := tree.rrRotation(node.right(tree.state)) node.setRightChild(tree.state, prchild) return tree.llRotation(node) } func (tree *AVLTree) handleBF(node *Node) *Node { leftChild := node.left(tree.state) rightChild := node.right(tree.state) if tree.getHeight(leftChild)-tree.getHeight(rightChild) == 2 { if leftChild.leftChildFactor(tree.state)-leftChild.rightChildFactor(tree.state) > 0 { // RR node = tree.rrRotation(node) } else { node = tree.lrRotation(node) } } else if tree.getHeight(leftChild)-tree.getHeight(rightChild) == -2 { if rightChild.leftChildFactor(tree.state)-rightChild.rightChildFactor(tree.state) < 0 { // LL node = tree.llRotation(node) } else { node = tree.rlRotation(node) } } return node } func (tree *AVLTree) Insert(node *Node) { hash := tree.state.GetStakeState(rootKey_new) rootNode := tree.insertNode(tree.newRootNode(), node) if rootNode.key != hash { tree.state.SetStakeState(rootKey_new, rootNode.key) } } func (tree *AVLTree) insertNode(parent *Node, node *Node) *Node { if parent == nil { node.store(tree.state) return node } parent.setTotal(tree.state, parent.total+node.num) if cmp(parent.key, node.key) > 0 { lchild := tree.insertNode(parent.left(tree.state), node) parent.setLeftChild(tree.state, lchild) parent = tree.handleBF(parent) } else { rchild := tree.insertNode(parent.right(tree.state), node) parent.setRightChild(tree.state, rchild) parent = tree.handleBF(parent) } parent.setFactor(tree.state, max(parent.leftChildFactor(tree.state), parent.rightChildFactor(tree.state))+1) return parent } func (tree *AVLTree) Midtraverse() { tree.midtraverse(tree.newRootNode(), func(node *Node) { node.Print() }, nil) } func (tree *AVLTree) midtraverse(node *Node, handle func(*Node), check func(*Node)) error { if node == nil { return nil } else { if check != nil { check(node) } if err := tree.midtraverse(node.left(tree.state), handle, check); err != nil { // 处理左子树 return err } handle(node) if err := tree.midtraverse(node.right(tree.state), handle, check); err != nil { // 处理右子树 return err } } return nil } func (tree *AVLTree) GetNode(nodeHash common.Hash) *Node { // hash := tree.state.GetStakeState(rootKey_new) // if nodeHash == emptyHash { // return nil // } node := &Node{key: nodeHash, pkey: rootKey_new} node.load(tree.state) return node } func (tree *AVLTree) newRootNode() *Node { hash := tree.state.GetStakeState(rootKey_new) if hash == emptyHash { return nil } node := &Node{key: hash, pkey: rootKey_new} node.load(tree.state) return node } func (tree *AVLTree) FindByIndex(index uint32) (*Node, error) { node := tree.newRootNode() for { left := node.left(tree.state) if left != nil { if index < left.total { node = left continue } index -= left.total } if index < node.num { return node, nil } index -= node.num right := node.right(tree.state) if right != nil { node = right continue } return nil, errors.New("not found node by index") } } func (tree *AVLTree) Delete(key common.Hash, num uint32) *Node { rootNode := tree.newRootNode() node, ret := tree.delete(rootNode, key, num) if node == nil { tree.state.SetStakeState(rootKey_new, emptyHash) } else { if rootNode.key != node.key { tree.state.SetStakeState(rootKey_new, node.key) } } return ret } func (tree *AVLTree) delete(node *Node, key common.Hash, num uint32) (*Node, *Node) { if node == nil { return nil, nil } var ret *Node lchild := node.left(tree.state) rchild := node.right(tree.state) if node.key == key { ret = &Node{key: key} ret.load(tree.state) if node.num == num { if lchild == nil && rchild == nil { return nil, ret } else if lchild == nil || rchild == nil { if lchild != nil { return lchild, ret } else { return rchild, ret } } else { n := lchild for { nright := n.right(tree.state) if nright == nil { break } n = nright } if n.key != lchild.key { tn := lchild for { tn.setTotal(tree.state, safeSub(tn.total+node.num, n.num)) tn = tn.right(tree.state) if tn == nil || tn.key == n.key { break } } } ncpoy := n.copy() nodeCopy := node.copy() ncpoylchild := ncpoy.left(tree.state) ncpoyrchild := ncpoy.right(tree.state) nodeCopylchild := nodeCopy.left(tree.state) nodeCopyrchild := nodeCopy.right(tree.state) if bytes.Compare(ncpoy.pkey[0:29], nodeCopy.key[0:29]) == 0 { node.setNode(tree.state, ncpoy, node.pkey, nodeCopy, nodeCopyrchild) n.setNode(tree.state, nodeCopy, ncpoy.key, ncpoylchild, ncpoyrchild) } else { node.setNode(tree.state, ncpoy, node.pkey, nodeCopylchild, nodeCopyrchild) n.setNode(tree.state, nodeCopy, ncpoy.pkey, ncpoylchild, ncpoyrchild) } lchild, ret = tree.delete(node.left(tree.state), key, num) node.setLeftChild(tree.state, lchild) } } else { node.setNum(tree.state, safeSub(node.num, num)) } } else if cmp(node.key, key) > 0 { lchild, ret = tree.delete(lchild, key, num) node.setLeftChild(tree.state, lchild) } else { rchild, ret = tree.delete(rchild, key, num) node.setRightChild(tree.state, rchild) } node.setFactor(tree.state, max(tree.getHeight(lchild), tree.getHeight(rchild))+1) node.setTotal(tree.state, safeSub(node.total, num)) node = tree.handleBF(node) return node, ret } func (tree *AVLTree) Size() uint32 { node := tree.newRootNode() if node == nil { return 0 } return node.total } ================================================ FILE: zero/stake/avltree_test.go ================================================ package stake import ( "fmt" "math/rand" "testing" "time" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/crypto" "github.com/sero-cash/go-sero/zero/utils" ) //var newprint = func(node *Node) { // node.Print() //} // func newState() (State, *state.StateDB) { // db := serodb.NewMemDatabase() // state, _ := state.New(common.Hash{}, state.NewDatabase(db), 0) // //state.GetZState() // //return state // //db := consensus.NewFakeDB() // return NewStakeState(state), state // } func initAVLTree(state State, n int) (*AVLTree, map[common.Hash]uint32) { all := map[common.Hash]uint32{} tree := NewAVLTree(state) for i := 1; i <= n; i++ { u := uint64(rand.Intn(1000)) num := uint32(u%10 + 1) tree.Insert(initAVLNode(uint64(i), num, all)) } return tree, all } func initAVLNode(seed uint64, num uint32, all map[common.Hash]uint32) *Node { hash := crypto.Keccak256Hash(utils.EncodeNumber(seed)) // for all[hash] > 0 { // u = uint64(rand.Intn(1000000)) // hash = crypto.Keccak256Hash(append(utils.EncodeNumber(u), uint8(i))) // } if _, ok := all[hash]; ok { panic("initAVLNode") } all[hash] = num return &Node{key: hash, total: num, num: num, factor: 1} } func TestAVLTree(t *testing.T) { db, _ := newState() tree, all := initAVLTree(db, 10) tree.Midtraverse() fmt.Println(tree.Size(), len(all), tree.newRootNode().factor) } func TestAVLTreeCopy(t *testing.T) { db1, _ := newState() tree, all := initAVLTree(db1, 20) tree.Midtraverse() fmt.Println(tree.Size(), len(all), tree.newRootNode().factor) db2, _ := newState() newTree := Copy(db2, tree) newTree.Midtraverse() fmt.Println(newTree.Size(), newTree.newRootNode().factor) } func TestAVLTreeFindByIndex(t *testing.T) { db, _ := newState() tree, _ := initAVLTree(db, 10) tree.Midtraverse() fmt.Println() node, _ := tree.FindByIndex(0) node.Print() } func TestAVLDelByIndex(t *testing.T) { db, _ := newState() tree, _ := initAVLTree(db, 100) count := uint32(0) all := tree.newRootNode().total fmt.Println() for { if tree.Size() == 0 || count >= all { break } count++ index := rand.Uint32() % tree.Size() node, err := tree.FindByIndex(index) if err != nil { panic(err) } ret := tree.Delete(node.key, 1) if ret == nil || node.num != ret.num { panic("delete err") } tree.Midtraverse() fmt.Println() // tree.newRootNode().Print() fmt.Println("------------------------------------------") } if all != count { t.Error("error") } } func TestAVLDelByHash(t *testing.T) { db, _ := newState() tree, all := initAVLTree(db, 1000) fmt.Println() start := 100000 for { var key common.Hash var num uint32 for key, num = range all { if num == 0 { t.Error("error", num) return } if num >= 5 { num = 5 } else { num = 1 } // ddb, _ := newState() // dTree := Copy(ddb, tree) fmt.Println("delete ", common.Bytes2Hex(key[:]), num) tree.Delete(key, num) tree.midtraverse(tree.newRootNode(), func(node *Node) { // node.Print() }, func(node *Node) { if !check(node, node.left(tree.state), node.right(tree.state)) { panic("") // node.Print() // dTree.Delete(key, num) } }) start++ u := uint64(rand.Intn(10)) node := initAVLNode(uint64(start), uint32(u%10+1), all) fmt.Println() fmt.Print("insert: ") node.Print() // idb, _ := newState() // iTree := Copy(idb, tree) tree.Insert(node) tree.midtraverse(tree.newRootNode(), func(node *Node) { // node.Print() }, func(node *Node) { if !check(node, node.left(tree.state), node.right(tree.state)) { panic("") // node.Print() // iTree.Insert(&Node{key: node.key, num: node.num, height: 1}) } }) fmt.Println("-------------------") break } all[key] -= num if all[key] == 0 { delete(all, key) fmt.Println("remove", key.String()) } if len(all) == 0 { break } rootNode := tree.newRootNode() fmt.Println("tree", len(all), rootNode.total, rootNode.factor) if len(all) < 2^(rootNode.factor-3) { panic("len(all) < 2^(rootNode.height-3)") } time.Sleep(time.Microsecond * 100) } rootNode := tree.newRootNode() fmt.Println("rootNode", rootNode.key) tree.Midtraverse() fmt.Println() } func TestOldAndNew(t *testing.T) { state1, _ := newState() oldTree, all := initTree(state1, 10) oldTree.Midtraverse() fmt.Println("____________________________") // oldTree.newRootNode().Print() newTree := CopyFromOldV0(oldTree) newTree.Midtraverse() fmt.Println() newTree.newRootNode().Print() fmt.Println() for i := 11; i <= 20; i++ { u := uint64(rand.Intn(10)) node := initAVLNode(uint64(i), uint32(u%10+1), all) fmt.Print("insert: ") node.Print() newTree.Insert(node) } newTree.Midtraverse() fmt.Println() newTree.newRootNode().Print() fmt.Println() // idb, _ := newState() // iTree := Copy(idb, tree) } func check(node, left, right *Node) bool { leftH := 0 rightH := 0 leftT := uint32(0) rightT := uint32(0) if left != nil { leftH = left.factor leftT = left.total } if right != nil { rightH = right.factor rightT = right.total } if node.factor != max(leftH, rightH)+1 { return false } if node.total != leftT+rightT+node.num { return false } return true } ================================================ FILE: zero/stake/sharepool.go ================================================ package stake import ( "bytes" "errors" "fmt" "math/big" "github.com/sero-cash/go-sero/zero/zconfig" "github.com/sero-cash/go-sero/consensus/ethash" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-czero-import/seroparam" "github.com/sero-cash/go-czero-import/superzk" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core/state" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/crypto" "github.com/sero-cash/go-sero/crypto/sha3" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/rlp" "github.com/sero-cash/go-sero/serodb" "github.com/sero-cash/go-sero/zero/consensus" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-sero/zero/utils" ) type Status int8 const ( STATUS_VALID Status = 0 STATUS_OUTOFDATE Status = 1 STATUS_FINISHED Status = 2 ) type Share struct { PKr c_type.PKr VotePKr c_type.PKr TransactionHash common.Hash PoolId *common.Hash `rlp:"nil"` Value *big.Int `rlp:"nil"` BlockNumber uint64 InitNum uint32 Fee uint16 Num uint32 WillVoteNum uint32 Status Status Income *big.Int `rlp:"nil"` Profit *big.Int `rlp:"nil"` LastPayTime uint64 } func (s *Share) Id() []byte { hw := sha3.NewKeccak256() hash := common.Hash{} rlp.Encode(hw, []interface{}{ s.PKr, s.VotePKr, s.TransactionHash, s.PoolId, s.Value, s.BlockNumber, s.InitNum, s.Fee, }) hw.Sum(hash[:0]) return hash.Bytes() } func (s *Share) State() []byte { hw := sha3.NewKeccak256() hash := common.Hash{} rlp.Encode(hw, []interface{}{ s.Id(), s.Num, s.WillVoteNum, s.Status, s.Income, s.Profit, s.LastPayTime, }) hw.Sum(hash[:0]) return hash.Bytes() } func (s *Share) CopyTo() (ret consensus.CItem) { share := &Share{ PKr: s.PKr, VotePKr: s.VotePKr, TransactionHash: s.TransactionHash, PoolId: s.PoolId, Value: new(big.Int).Set(s.Value), BlockNumber: s.BlockNumber, InitNum: s.InitNum, Fee: s.Fee, Num: s.Num, WillVoteNum: s.WillVoteNum, Status: s.Status, Income: new(big.Int).Set(s.Income), Profit: new(big.Int).Set(s.Profit), LastPayTime: s.LastPayTime, } return share } func (s *Share) CopyFrom(ret consensus.CItem) { obj := ret.(*Share) s.PKr = obj.PKr s.VotePKr = obj.VotePKr s.TransactionHash = obj.TransactionHash s.PoolId = obj.PoolId s.BlockNumber = obj.BlockNumber s.Value = new(big.Int).Set(obj.Value) s.Fee = obj.Fee s.InitNum = obj.InitNum s.Num = obj.Num s.WillVoteNum = obj.WillVoteNum s.Status = obj.Status s.Income = new(big.Int).Set(obj.Income) s.Profit = new(big.Int).Set(obj.Profit) s.LastPayTime = obj.LastPayTime } func (s *Share) addProfit(profit *big.Int) { if s.Profit == nil { s.Profit = new(big.Int) } s.Profit.Add(s.Profit, profit) } func (s *Share) addIncome(income *big.Int) { if s.Income == nil { s.Income = new(big.Int) } s.Income.Add(s.Income, income) } func (s *Share) setIncomeZero() { s.Income = big.NewInt(0) } type StakePool struct { PKr c_type.PKr VotePKr c_type.PKr BlockNumber uint64 TransactionHash common.Hash Amount *big.Int `rlp:"nil"` Fee uint16 CurrentShareNum uint32 WishVoteNum uint32 ChoicedShareNum uint32 MissedVoteNum uint32 ExpireNum uint32 Income *big.Int `rlp:"nil"` Profit *big.Int `rlp:"nil"` LastPayTime uint64 Closed bool } func (self *StakePool) CanBeVote() bool { if self.CurrentShareNum+self.WishVoteNum > 0 { return true } return false } func (s *StakePool) Id() []byte { return crypto.Keccak256Hash(s.PKr[:]).Bytes() } func (s *StakePool) State() []byte { hw := sha3.NewKeccak256() hash := common.Hash{} rlp.Encode(hw, []interface{}{ s.Id(), s.VotePKr, s.BlockNumber, s.TransactionHash, s.Amount, s.Fee, s.CurrentShareNum, s.WishVoteNum, s.ChoicedShareNum, s.MissedVoteNum, s.ExpireNum, s.Income, s.Profit, s.LastPayTime, s.Closed, }) hw.Sum(hash[:0]) return hash.Bytes() } func (s *StakePool) CopyTo() (ret consensus.CItem) { return &StakePool{ PKr: s.PKr, VotePKr: s.VotePKr, BlockNumber: s.BlockNumber, TransactionHash: s.TransactionHash, Amount: new(big.Int).Set(s.Amount), Fee: s.Fee, CurrentShareNum: s.CurrentShareNum, WishVoteNum: s.WishVoteNum, ChoicedShareNum: s.ChoicedShareNum, MissedVoteNum: s.MissedVoteNum, ExpireNum: s.ExpireNum, Income: new(big.Int).Set(s.Income), Profit: new(big.Int).Set(s.Profit), LastPayTime: s.LastPayTime, Closed: s.Closed, } } func (s *StakePool) CopyFrom(ret consensus.CItem) { obj := ret.(*StakePool) s.PKr = obj.PKr s.VotePKr = obj.VotePKr s.BlockNumber = obj.BlockNumber s.TransactionHash = obj.TransactionHash s.Amount = new(big.Int).Set(obj.Amount) s.Fee = obj.Fee s.CurrentShareNum = obj.CurrentShareNum s.WishVoteNum = obj.WishVoteNum s.ChoicedShareNum = obj.ChoicedShareNum s.MissedVoteNum = obj.MissedVoteNum s.ExpireNum = obj.ExpireNum s.Income = new(big.Int).Set(obj.Income) s.Profit = new(big.Int).Set(obj.Profit) s.LastPayTime = obj.LastPayTime s.Closed = obj.Closed } func (s *StakePool) addProfit(profit *big.Int) { if s.Profit == nil { s.Profit = new(big.Int) } s.Profit.Add(s.Profit, profit) } func (s *StakePool) addIncome(income *big.Int) { if s.Income == nil { s.Income = new(big.Int) } s.Income.Add(s.Income, income) } func (s *StakePool) setIncomeZero() { s.Income = big.NewInt(0) } type blockChain interface { GetHeader(hash common.Hash, number uint64) *types.Header GetBlock(hash common.Hash, number uint64) *types.Block GetDB() serodb.Database } type State interface { SetStakeState(key common.Hash, value common.Hash) GetStakeState(key common.Hash) common.Hash } type StakeState struct { statedb *state.StateDB sharePool consensus.KVPoint shareObj consensus.ObjPoint stakePoolObj consensus.ObjPoint missedNum consensus.KVPoint blockHash consensus.KVPoint newShareNum consensus.KVPoint } var ( ShareDB = consensus.DBObj{"STAKE$SHARE$"} StakePoolDB = consensus.DBObj{"STAKE$POOL$"} missedNumKey = []byte("missednum") blockVotesPrefix = []byte("STAKE$BLOCKVOTES$") blockShareNumPrefix = []byte("STAKE$SHARE$NUM$") ) type selectShare struct { Idx []uint32 Shares []common.Hash } func BlockVotesKey(hash common.Hash) []byte { return append(blockVotesPrefix, hash[:]...) } func BlockShareNumKey(hash common.Hash) []byte { return append(blockShareNumPrefix, hash[:]...) } func (self *StakeState) RecordVotes(batch serodb.Batch, block *types.Block) error { idx, shares, err := self.SeleteShare(block.HashPos(), block.NumberU64()) if err != nil { return err } ss := selectShare{} ss.Idx = idx for _, share := range shares { ss.Shares = append(ss.Shares, common.BytesToHash(share.State())) } data, err := rlp.EncodeToBytes(&ss) if err != nil { log.Crit("Failed to RLP encode blockVotes", "err", err) } if err := batch.Put(BlockVotesKey(block.Hash()), data); err != nil { log.Crit("Failed to store blockVotes to number mapping", "err", err) } if zconfig.RecordShareNum() { batch.Put(BlockShareNumKey(block.Hash()), new(big.Int).SetUint64(uint64(self.ShareSize())).Bytes()) } return nil } func BlockShareNum(getter serodb.Getter, block common.Hash) (num uint64) { data, _ := getter.Get(BlockShareNumKey(block)) if len(data) == 0 { return } return new(big.Int).SetBytes(data).Uint64() } func SeleteBlockShare(getter serodb.Getter, block common.Hash) (idx []uint32, shares []*Share) { data, _ := getter.Get(BlockVotesKey(block)) if len(data) == 0 { return } ss := selectShare{} if err := rlp.Decode(bytes.NewReader(data), &ss); err != nil { log.Error("Invalid block blockVotes RLP", "hash", block, "err", err) return } idx = ss.Idx for _, hash := range ss.Shares { share := GetShare(getter, hash) if share == nil { log.Crit("Select Block Share Error: can not get share by hash", "hash", hash) } shares = append(shares, share) } return } func NewStakeState(statedb *state.StateDB) *StakeState { cons := statedb.GetStakeCons() stakeState := &StakeState{statedb: statedb} stakeState.missedNum = consensus.NewKVPt(cons, "STAKE$EMISSEDNNUM$", "") stakeState.sharePool = consensus.NewKVPt(cons, "STAKE$SHAREPOOL$CONS$", "") stakeState.shareObj = consensus.NewObjPt(cons, "STAKE$SHAREOBJ$CONS", ShareDB.Pre, "share") stakeState.stakePoolObj = consensus.NewObjPt(cons, "STAKE$POOL$CONS", StakePoolDB.Pre, "pool") stakeState.blockHash = consensus.NewKVPt(cons, "BLOCK$BLOCKHASH$", "") stakeState.newShareNum = consensus.NewKVPt(cons, "STAKE$NEWSHARENUM$", "") return stakeState } func (self *StakeState) setBlockHash(blockNumber uint64, blockHash common.Hash) { self.blockHash.SetValue(utils.EncodeNumber(blockNumber), blockHash[:]) } func (self *StakeState) getBlockHash(blockNumber uint64) common.Hash { ret := self.blockHash.GetValue(utils.EncodeNumber(blockNumber)) return common.BytesToHash(ret[:]) } func (self *StakeState) SetStakeState(key common.Hash, value common.Hash) { self.sharePool.SetValue(key[:], value[:]) } func (self *StakeState) GetStakeState(key common.Hash) common.Hash { return common.BytesToHash(self.sharePool.GetValue(key.Bytes())) } var newShareNumKey = []byte("newShareNum") func (self *StakeState) setNewShareNum(num uint32) { self.newShareNum.SetValue(newShareNumKey, utils.EncodeNumber32(num)) } func (self *StakeState) getNewShareNum() uint32 { value := self.newShareNum.GetValue(newShareNumKey) return utils.DecodeNumber32(value) } func (self *StakeState) AddPendingShare(share *Share) { // tree := newOldTree(self) // tree.insert(&SNode{key: common.BytesToHash(share.Id()), num: share.InitNum}) share.Status = STATUS_VALID share.Num = share.InitNum if share.Income == nil { share.Income = new(big.Int) } if share.Profit == nil { share.Profit = new(big.Int) } self.setNewShareNum(self.getNewShareNum() + share.InitNum) self.updateShare(share) } func (self *StakeState) insertSharePool(share *Share, blockNumber uint64) error { num := self.getNewShareNum() if num < share.InitNum { return errors.New("newsharenum < share.InitNum") } self.setNewShareNum(num - share.InitNum) tree := NewTree(self, blockNumber) tree.Insert(&Node{key: common.BytesToHash(share.Id()), num: share.Num, total: share.Num, factor: 1}) return nil } func (self *StakeState) updateShare(share *Share) { self.shareObj.AddObj(share) } func (self *StakeState) AddStakePool(pool *StakePool) { if pool.Income == nil { pool.Income = new(big.Int) } if pool.Profit == nil { pool.Profit = new(big.Int) } self.stakePoolObj.AddObj(pool) } func (self *StakeState) updateStakePool(pool *StakePool) { self.stakePoolObj.AddObj(pool) } func (self *StakeState) NeedTwoVote(num uint64) bool { window_size := getStatisticsMissWindow() if num > seroparam.SIP4()+window_size { missedNum := utils.DecodeNumber32(self.missedNum.GetValue(missedNumKey)) seletedNum := window_size * MaxVoteCount ratio := float64(missedNum) / float64(seletedNum) if ratio > minMissRate || self.ShareSize() < getMinSharePoolSize() { return false } return true } else { return false } } func (self *StakeState) ShareSize() uint32 { tree := NewTree(self, 0) return tree.Size() } func (self *StakeState) SeleteShare(seed common.Hash, blockNumber uint64) (ints []uint32, shares []*Share, err error) { tree := NewTree(self, blockNumber) if tree.Size() < MaxVoteCount { return } ints, _ = FindShareIdxs(tree.Size(), MaxVoteCount, NewHash256PRNG(seed[:])) for _, i := range ints { node, e := tree.FindByIndex(uint32(i)) if e != nil { err = e return } share := self.GetShare(node.key) if share == nil { err = errors.New("not found share by index") return } shares = append(shares, share) } return } func (self *StakeState) GetShare(key common.Hash) *Share { item := self.shareObj.GetObj(key.Bytes(), &Share{}) if item == nil { return nil } return item.(*Share) } func GetStakePoolByBlockNumber(getter serodb.Getter, id common.Hash, blockHash common.Hash, blockNumber uint64) *StakePool { records := state.StakeDB.GetBlockRecords(getter, blockNumber, &blockHash) for _, record := range records { if record.Name == "pool" { for _, each := range record.Pairs { if bytes.Equal(id[:], each.Ref) { ret := StakePoolDB.GetObject(getter, each.Hash, &StakePool{}) if ret != nil { return ret.(*StakePool) } } } } } return nil } func (self *StakeState) GetStakePool(poolId common.Hash) *StakePool { item := self.stakePoolObj.GetObj(poolId.Bytes(), &StakePool{}) if item == nil { return nil } return item.(*StakePool) } func GetBlockRecords(getter serodb.Getter, blockHash common.Hash, blockNumber uint64) (shares []*Share, pools []*StakePool) { records := state.StakeDB.GetBlockRecords(getter, blockNumber, &blockHash) for _, record := range records { if record.Name == "share" { for _, each := range record.Pairs { ret := ShareDB.GetObject(getter, each.Hash, &Share{}) shares = append(shares, ret.(*Share)) } } if record.Name == "pool" { for _, each := range record.Pairs { ret := StakePoolDB.GetObject(getter, each.Hash, &StakePool{}) pools = append(pools, ret.(*StakePool)) } } } return } func (self *StakeState) getBlockRecords(getter serodb.Getter, blockHash common.Hash, blockNumber uint64) (shares []*Share, pools []*StakePool, err error) { records := state.StakeDB.GetBlockRecords(getter, blockNumber, &blockHash) for _, record := range records { if record.Name == "share" { for _, each := range record.Pairs { key := common.BytesToHash(each.Ref) share := self.GetShare(key) if share == nil { err = errors.New("not found share by shareId") return } shares = append(shares, share) } } if record.Name == "pool" { for _, each := range record.Pairs { key := common.BytesToHash(each.Ref) pool := self.GetStakePool(key) if pool == nil { err = errors.New("not found pool by poolId") return } pools = append(pools, pool) } } } return } func GetShare(getter serodb.Getter, hash common.Hash) *Share { ret := ShareDB.GetObject(getter, hash[:], &Share{}) return ret.(*Share) } func GetShareByBlockNumber(getter serodb.Getter, id common.Hash, blockHash common.Hash, blockNumber uint64) *Share { records := state.StakeDB.GetBlockRecords(getter, blockNumber, &blockHash) for _, record := range records { if record.Name == "share" { for _, each := range record.Pairs { if bytes.Equal(id[:], each.Ref) { ret := ShareDB.GetObject(getter, each.Hash, &Share{}) if ret != nil { return ret.(*Share) } } } } } return nil } func GetSharesByBlock(getter serodb.Getter, blockHash common.Hash, blockNumber uint64) (shares []*Share) { records := state.StakeDB.GetBlockRecords(getter, blockNumber, &blockHash) for _, record := range records { if record.Name == "share" { for _, each := range record.Pairs { ret := ShareDB.GetObject(getter, each.Hash, &Share{}) if ret == nil { panic("not found share by hash") } shares = append(shares, ret.(*Share)) } } } return } func (self *StakeState) getShares(getter serodb.Getter, blockHash common.Hash, blockNumber uint64) (shares []*Share, err error) { records := state.StakeDB.GetBlockRecords(getter, blockNumber, &blockHash) for _, record := range records { if record.Name == "share" { for _, each := range record.Pairs { key := common.BytesToHash(each.Ref) share := self.GetShare(key) if share == nil { err = errors.New("not found share by shareId") return } shares = append(shares, share) } } } return } func (self *StakeState) CurrentPrice() *big.Int { tree := NewTree(self, 0) newNum := self.getNewShareNum() size := tree.Size() + newNum return new(big.Int).Add(basePrice, new(big.Int).Mul(addition, big.NewInt(int64(size)))) } func (self *StakeState) SumAmount(n int64) *big.Int { return sum(self.CurrentPrice(), addition, n) } func sum(basePrice, addition *big.Int, n int64) *big.Int { return new(big.Int).Add( new(big.Int).Mul(basePrice, big.NewInt(n)), new(big.Int).Div( new(big.Int).Mul( new(big.Int).Mul(big.NewInt(n), big.NewInt(n-1)), addition, ), big.NewInt(2), ), ) } func (self *StakeState) CaleAvgPrice(amount *big.Int) (uint32, *big.Int, *big.Int) { basePrice := self.CurrentPrice() left := int64(1) right := new(big.Int).Div(amount, basePrice).Int64() if right <= 1 { return uint32(right), basePrice, basePrice } minx := new(big.Int).Set(amount) // n := int64(0) for { if right < left { break } mid := (left + right) / 2 sumAmount := sum(basePrice, addition, mid) sub := new(big.Int).Sub(amount, sumAmount) abs := new(big.Int).Abs(sub) if minx.Cmp(new(big.Int).Abs(abs)) > 0 { // n = mid minx = abs } if sub.Sign() < 0 { right = mid - 1 } else { left = mid + 1 } } sumAmount := sum(basePrice, addition, left) if sumAmount.Cmp(amount) > 0 { left -= 1 sumAmount = sum(basePrice, addition, left) } return uint32(left), new(big.Int).Div(sumAmount, big.NewInt(left)), basePrice } func (self *StakeState) StakeCurrentReward(blockNumber *big.Int) (soloRewards *big.Int, totalRewards *big.Int) { if seroparam.Is_Dev() { return big.NewInt(600000000000000000), big.NewInt(900000000000000000) } size := NewTree(self, blockNumber.Uint64()).Size() totalReward := new(big.Int).Add(baseReware, new(big.Int).Mul(rewareStep, big.NewInt(int64(size)))) if totalReward.Cmp(maxReware) > 0 { totalReward = new(big.Int).Set(maxReware) } halve := ethash.Halve(blockNumber) totalReward = new(big.Int).Div(totalReward, halve) totalReward = new(big.Int).Div(totalReward, big.NewInt(3)) return new(big.Int).Div(new(big.Int).Mul(totalReward, big.NewInt(SOLO_RATE)), big.NewInt(TOTAL_RATE)), totalReward } func GetPosRewardBySize(size uint64, blockNumber int64) (soloRewards *big.Int, totalRewards *big.Int) { totalReward := new(big.Int).Add(baseReware, new(big.Int).Mul(rewareStep, big.NewInt(int64(size)))) if totalReward.Cmp(maxReware) > 0 { totalReward = new(big.Int).Set(maxReware) } halve := ethash.Halve(big.NewInt(0).SetInt64(blockNumber)) totalReward = new(big.Int).Div(totalReward, halve) totalReward = new(big.Int).Div(totalReward, big.NewInt(3)) return new(big.Int).Div(new(big.Int).Mul(totalReward, big.NewInt(SOLO_RATE)), big.NewInt(TOTAL_RATE)), totalReward } func (self *StakeState) checkShareRepeated(header *types.Header) error { tree := NewTree(self, header.Number.Uint64()) seed := header.HashPos() indexs, err := FindShareIdxs(tree.Size(), 3, NewHash256PRNG(seed[:])) if err != nil { return err } voteNumMap := map[common.Hash]int{} for _, index := range indexs { sndoe, err := tree.FindByIndex(index) if err != nil { return err } voteNumMap[sndoe.key] += 1 } for _, vote := range header.CurrentVotes { if num, ok := voteNumMap[vote.Id]; ok && num > 0 { voteNumMap[vote.Id] -= 1 } else { return errors.New("vote repeated") } } return nil } func (self *StakeState) CheckVotes(block *types.Block, bc blockChain) error { header := block.Header() if len(header.CurrentVotes) > 3 || len(header.ParentVotes) > 3 { return errors.New("header.CurrentVotes.len > 3 or header.ParentVotes > 3") } if self.NeedTwoVote(block.NumberU64()) { if len(header.CurrentVotes) < 2 { return errors.New("header.CurrentVotes.len < 2") } } parentblock := bc.GetBlock(header.ParentHash, header.Number.Uint64()-1) if len(header.CurrentVotes) > 0 { // check repeated vote parentPosHash := parentblock.HashPos() blockPosHash := block.HashPos() voteNumMap := map[c_type.Uint512]bool{} for _, vote := range header.CurrentVotes { ret := types.StakeHash(&blockPosHash, &parentPosHash, vote.IsPool) if err := self.verifyVote(block.NumberU64(), vote, ret); err != nil { return err } voteNumMap[vote.Sign] = true } if len(voteNumMap) != len(header.CurrentVotes) { return errors.New("vote sign repeated") } if err := self.checkShareRepeated(header); err != nil { return err } } if len(header.ParentVotes) > 0 { preHeader := parentblock.Header() shareMapNum := map[common.Hash]int{} _, shares := SeleteBlockShare(bc.GetDB(), header.ParentHash) for _, share := range shares { shareMapNum[common.BytesToHash(share.Id())] += 1 } parentVoteMap := map[c_type.Uint512]types.HeaderVote{} for _, vote := range preHeader.CurrentVotes { if shareMapNum[vote.Id] == 0 { return errors.New("vote error") } shareMapNum[vote.Id] -= 1 parentVoteMap[vote.Sign] = vote } perperBlock := bc.GetBlock(parentblock.ParentHash(), parentblock.NumberU64()-1) parentPosHash := perperBlock.HashPos() blockPosHash := parentblock.HashPos() for _, vote := range header.ParentVotes { ret := types.StakeHash(&blockPosHash, &parentPosHash, vote.IsPool) if err := self.verifyVote(parentblock.NumberU64(), vote, ret); err != nil { return err } if _, ok := parentVoteMap[vote.Sign]; ok { return errors.New("exist in parent header votes") } if shareMapNum[vote.Id] == 0 { return errors.New("vote error") } else { shareMapNum[vote.Id] -= 1 } } } return nil } func (self *StakeState) verifyVote(num uint64, vote types.HeaderVote, stakeHash common.Hash) error { share := self.GetShare(vote.Id) if share == nil { return errors.New("not found share by shareId") } if share.Num+share.WillVoteNum == 0 { return errors.New("the share num is 0") } if vote.IsPool { pool := self.GetStakePool(*share.PoolId) if pool == nil { return errors.New("not found pool by poolId") } if pool.CurrentShareNum+pool.WishVoteNum == 0 { return errors.New("the pool current share num is 0") } if !superzk.VerifyPKr_ByHeight(num, stakeHash.HashToUint256(), &vote.Sign, &pool.VotePKr) { return errors.New("Verify header votes error") } } else { if !superzk.VerifyPKr_ByHeight(num, stakeHash.HashToUint256(), &vote.Sign, &share.VotePKr) { return errors.New("Verify header votes error") } } return nil } func (self *StakeState) processRemedyRewards(bc blockChain, header *types.Header) { if header.Number.Uint64() > 0 { parentHeader := bc.GetHeader(header.ParentHash, header.Number.Uint64()-1) if len(parentHeader.CurrentVotes) >= 2 && len(parentHeader.ParentVotes) > 0 { soloReware, totalReward := self.StakeCurrentReward(parentHeader.Number) reward := new(big.Int) for _, vote := range parentHeader.ParentVotes { if vote.IsPool { reward.Add(reward, new(big.Int).Div(totalReward, big.NewInt(3))) } else { reward.Add(reward, new(big.Int).Div(soloReware, big.NewInt(3))) } } asset := assets.Asset{ &assets.Token{ utils.CurrencyToUint256("SERO"), utils.U256(*reward), }, nil, } self.statedb.NextZState().AddTxOut(parentHeader.Coinbase, asset, common.BytesToHash([]byte{3})) } } } func (self *StakeState) ProcessBeforeApply(bc blockChain, header *types.Header) (err error) { if header.Number.Uint64() == seroparam.SIP8() { InitAVLTree(self) // NewTree(self, header.Number.Uint64()).Midtraverse() } // if header.Number.Uint64() > seroparam.SIP8() && header.Number.Uint64()%100 == 0 { // NewTree(self, header.Number.Uint64()).Midtraverse() // } self.setBlockHash(header.Number.Uint64()-1, header.ParentHash) // last round err = self.processVotedShare(header, bc) if err != nil { return err } err = self.processOutDate(header, bc) if err != nil { return err } err = self.processMissVoted(header, bc) if err != nil { return err } // last round buy share err = self.processNowShares(header, bc) if err != nil { return err } // to last round circyle payment err = self.payIncome(bc, header) if err != nil { return err } // last block pow remedy rewards self.processRemedyRewards(bc, header) // last block statistics err = self.statisticsByWindow(header, bc) if err != nil { return err } return } func (self *StakeState) statisticsByWindow(header *types.Header, bc blockChain) error { statisticsMissWindow := getStatisticsMissWindow() if header.Number.Uint64() < 1 || header.Number.Uint64()-1 < seroparam.SIP4() { return nil } value := self.missedNum.GetValue(missedNumKey) preHeader := bc.GetHeader(header.ParentHash, header.Number.Uint64()-1) totalVote := len(preHeader.CurrentVotes) + len(preHeader.ParentVotes) missedNum := utils.DecodeNumber32(value) if totalVote < MaxVoteCount { missedNum += uint32(MaxVoteCount - totalVote) } if preHeader.Number.Uint64() >= seroparam.SIP4()+statisticsMissWindow { preNumber := preHeader.Number.Uint64() - statisticsMissWindow windiwHeader := bc.GetHeader(self.getBlockHash(preNumber), preNumber) totalWVote := len(windiwHeader.CurrentVotes) + len(windiwHeader.ParentVotes) var delNum uint32 if totalWVote < MaxVoteCount { delNum = uint32(MaxVoteCount - totalWVote) } if missedNum < delNum { return errors.New("ProcessBeforeApply: statisticsByWindow err") } else { missedNum -= delNum } } self.missedNum.SetValue(missedNumKey, utils.EncodeNumber32(missedNum)) return nil } func (self *StakeState) processVotedShare(header *types.Header, bc blockChain) (err error) { if header.Number.Uint64() == 1 || header.Number.Uint64()-1 < seroparam.SIP4() { return } preHeader := bc.GetHeader(header.ParentHash, header.Number.Uint64()-1) tree := NewTree(self, header.Number.Uint64()) poshash := preHeader.HashPos() indexs, e := FindShareIdxs(tree.Size(), MaxVoteCount, NewHash256PRNG(poshash[:])) if e == nil { ndoes := []*Node{} for _, index := range indexs { sndoe, e1 := tree.FindByIndex(index) if e1 != nil { err = e1 return } ndoes = append(ndoes, sndoe) share := self.GetShare(sndoe.key) if share == nil { err = errors.New("not found share by shareId") return } share.WillVoteNum += 1 if share.Num > 0 { share.Num -= 1 } else { return errors.New(fmt.Sprint("ProcessBeforeApply: process vote err ", "shareId=", common.Bytes2Hex(share.Id()), " error=", "share.Num=0")) } self.updateShare(share) if share.PoolId != nil { pool := self.GetStakePool(*share.PoolId) if pool == nil { err = errors.New("not found pool by poolId") return } pool.ChoicedShareNum += 1 pool.MissedVoteNum += 1 if pool.CurrentShareNum > 0 { pool.CurrentShareNum -= 1 } else { err = errors.New(fmt.Sprint("ProcessBeforeApply: process vote err", " poolId=", share.PoolId, " error=", "pool.CurrentShareNum=0")) return } pool.WishVoteNum += 1 self.updateStakePool(pool) } } for _, node := range ndoes { tree.Delete(node.key, 1) } } soloReware, reward := self.StakeCurrentReward(preHeader.Number) if len(preHeader.CurrentVotes) > 0 { for _, vote := range preHeader.CurrentVotes { err = self.rewardVote(vote, soloReware, reward, preHeader.Number.Uint64()) if err != nil { return } } } if len(preHeader.ParentVotes) > 0 { reward = new(big.Int).Sub(reward, new(big.Int).Div(reward, big.NewInt(3))) soloReware = new(big.Int).Sub(soloReware, new(big.Int).Div(soloReware, big.NewInt(3))) for _, vote := range preHeader.ParentVotes { err = self.rewardVote(vote, soloReware, reward, preHeader.Number.Uint64()) if err != nil { return } } } return nil } func (self *StakeState) rewardVote(vote types.HeaderVote, soloReware, reward *big.Int, block uint64) error { share := self.GetShare(vote.Id) if share == nil { return errors.New("not found share by shareId") } if share.WillVoteNum > 0 { share.WillVoteNum -= 1 } else { return errors.New(fmt.Sprint("ProcessBeforeApply: process vote err", " shareId=", common.Bytes2Hex(share.Id()), " error=", "share.WillVoteNum=0")) } if share.PoolId != nil { pool := self.GetStakePool(*share.PoolId) if pool == nil { return errors.New("not found pool by poolId") } if pool.WishVoteNum > 0 { pool.WishVoteNum -= 1 if pool.Closed && pool.CurrentShareNum == 0 && pool.WishVoteNum == 0 { pool.addIncome(pool.Amount) pool.Amount = new(big.Int) } } else { return errors.New(fmt.Sprint("ProcessBeforeApply: process vote err", " poolId=", share.PoolId, " error=", "pool.WillVoteNum=0")) } self.updateStakePool(pool) } if vote.IsPool { pool := self.GetStakePool(*share.PoolId) if pool == nil { return errors.New("not found pool by poolId") } if pool.MissedVoteNum > 0 { pool.MissedVoteNum -= 1 } else { return errors.New(fmt.Sprint("ProcessBeforeApply: process vote err", " poolId=", share.PoolId, " error=", "pool.MissedVoteNum=0")) } poolReward := new(big.Int).Div(new(big.Int).Mul(reward, big.NewInt(int64(share.Fee))), big.NewInt(10000)) pool.addProfit(poolReward) pool.addIncome(poolReward) share.addProfit(new(big.Int).Sub(reward, poolReward)) share.addIncome(new(big.Int).Add(share.Value, new(big.Int).Sub(reward, poolReward))) self.updateStakePool(pool) } else { share.addProfit(soloReware) share.addIncome(new(big.Int).Add(share.Value, soloReware)) } self.updateShare(share) return nil } func (self *StakeState) processOutDate(header *types.Header, bc blockChain) (err error) { outOfDatePeriod := getOutOfDateWindow() if header.Number.Uint64() < outOfDatePeriod || header.Number.Uint64()-outOfDatePeriod < seroparam.SIP4() { return } preNumber := header.Number.Uint64() - outOfDatePeriod if preNumber < seroparam.SIP4() { return } preHeader := bc.GetHeader(self.getBlockHash(preNumber), preNumber) shares, e := self.getShares(bc.GetDB(), preHeader.Hash(), preHeader.Number.Uint64()) if e != nil { err = e return } if len(shares) > 0 { tree := NewTree(self, header.Number.Uint64()) for _, share := range shares { if share.BlockNumber == preHeader.Number.Uint64() { if share.Status == STATUS_OUTOFDATE { continue } if share.Num == 0 { share.Status = STATUS_OUTOFDATE self.updateShare(share) continue } sndoe := tree.Delete(common.BytesToHash(share.Id()), share.Num) if sndoe == nil { err = errors.New("processOutDate share not found") return } if share.Num != sndoe.num { err = errors.New(fmt.Sprint("ProcessBeforeApply: processOutDate err", " share.num=", share.Num, " snode.num=", sndoe.num)) return } if share.PoolId != nil { pool := self.GetStakePool(*share.PoolId) if pool == nil { err = errors.New("not found pool by poolId") return } if pool.CurrentShareNum >= share.Num { pool.CurrentShareNum -= share.Num pool.ExpireNum += share.Num } else { err = errors.New(fmt.Sprint("ProcessBeforeApply: processOutDate err", " pool.CurrentShareNum ", pool.CurrentShareNum, " share.num=", share.Num)) return } if pool.Closed && pool.CurrentShareNum == 0 && pool.WishVoteNum == 0 { pool.addIncome(pool.Amount) pool.Amount = new(big.Int) } self.updateStakePool(pool) } share.addIncome(new(big.Int).Mul(share.Value, big.NewInt(int64(share.Num)))) share.Status = STATUS_OUTOFDATE self.updateShare(share) } } } return } func (self *StakeState) processMissVoted(header *types.Header, bc blockChain) (err error) { missVotedPeriod := getMissVotedWindow() if header.Number.Uint64() < missVotedPeriod { return } preNumber := header.Number.Uint64() - missVotedPeriod if preNumber < seroparam.SIP4() { return } preHeader := bc.GetHeader(self.getBlockHash(preNumber), preNumber) shares, e := self.getShares(bc.GetDB(), preHeader.Hash(), preHeader.Number.Uint64()) if e != nil { err = e return } if len(shares) > 0 { for _, share := range shares { if share.BlockNumber == preHeader.Number.Uint64() { if share.Status == STATUS_FINISHED { continue } if share.WillVoteNum == 0 { share.Status = STATUS_FINISHED self.updateShare(share) continue } if share.PoolId != nil { pool := self.GetStakePool(*share.PoolId) if pool == nil { err = errors.New("not found pool by poolId") return } if pool.WishVoteNum < share.WillVoteNum { err = errors.New(fmt.Sprint("ProcessBeforeApply: processMissVoted err", " poolId=", common.Bytes2Hex(share.Id()), " error=", "pool.WishVoteNum < share.WillVoteNum")) return } pool.WishVoteNum -= share.WillVoteNum if pool.Closed && pool.CurrentShareNum == 0 && pool.WishVoteNum == 0 { pool.addIncome(pool.Amount) pool.Amount = new(big.Int) } self.updateStakePool(pool) } share.addIncome(new(big.Int).Mul(share.Value, big.NewInt(int64(share.WillVoteNum)))) share.Status = STATUS_FINISHED self.updateShare(share) } } } return nil } func (self *StakeState) processNowShares(header *types.Header, bc blockChain) (err error) { perHeader := bc.GetHeader(header.ParentHash, header.Number.Uint64()-1) shares := GetSharesByBlock(bc.GetDB(), perHeader.Hash(), perHeader.Number.Uint64()) // shares := self.getShares(bc.GetDB(), perHeader.Hash(), perHeader.Number.Uint64(), shareCacheMap) if len(shares) > 0 { for _, share := range shares { if share.BlockNumber != perHeader.Number.Uint64() { continue } // tree.insert(&SNode{key: common.BytesToHash(share.Id()), num: share.Num, total: share.Num, nodeNum: 1}) err = self.insertSharePool(share, header.Number.Uint64()) if err != nil { return } if share.PoolId != nil { pool := self.GetStakePool(*share.PoolId) if pool == nil { err = errors.New("not found pool by poolId") return } pool.CurrentShareNum += share.Num self.updateStakePool(pool) } } if self.getNewShareNum() != 0 { return fmt.Errorf("processNowShares: newShareNum(%v) != 0", self.getNewShareNum()) // log.Crit("processNowShares newShareNum != 0") } } return nil } func (self *StakeState) payIncome(bc blockChain, header *types.Header) (err error) { payPeriod := getPayPeriod() if header.Number.Uint64() < payPeriod { return } preNumber := header.Number.Uint64() - payPeriod if preNumber < seroparam.SIP4() { return } preHeader := bc.GetHeader(self.getBlockHash(preNumber), preNumber) shares, pools, e := self.getBlockRecords(bc.GetDB(), preHeader.Hash(), preHeader.Number.Uint64()) if e != nil { err = e return } for _, share := range shares { if share.Income.Sign() > 0 && header.Number.Uint64()-share.LastPayTime >= payPeriod { addr := common.Address{} copy(addr[:], share.PKr[:]) asset := assets.Asset{Tkn: &assets.Token{ Currency: *common.BytesToHash(common.LeftPadBytes([]byte("SERO"), 32)).HashToUint256(), Value: utils.U256(*share.Income), }, } share.LastPayTime = header.Number.Uint64() share.setIncomeZero() self.statedb.NextZState().AddTxOut(addr, asset, common.BytesToHash([]byte{2})) self.updateShare(share) } } for _, pool := range pools { if pool.Income.Sign() > 0 && header.Number.Uint64()-pool.LastPayTime >= payPeriod { addr := common.Address{} copy(addr[:], pool.PKr[:]) asset := assets.Asset{Tkn: &assets.Token{ Currency: *common.BytesToHash(common.LeftPadBytes([]byte("SERO"), 32)).HashToUint256(), Value: utils.U256(*pool.Income), }, } pool.LastPayTime = header.Number.Uint64() pool.setIncomeZero() self.statedb.NextZState().AddTxOut(addr, asset, common.BytesToHash([]byte{2})) self.updateStakePool(pool) } } return nil } // // func (self *StakeState) ChangeVersion() { // oldTree := newOldTree(self) // // list := make([]*SNode, 0) // oldTree.Midtraverse(oldTree.newRootNode(), func(node *SNode) { // list = append(list, node) // }) // // state2, _ := newState() // newTree := NewAVLTree(self.statedb) // for _, each := range list { // newTree.Insert(&Node{pkey: common.Hash{}, key: each.key, total: each.num, num: each.num, height: 1}) // } // if oldTree.size() != newTree.size() { // panic("stake changeVersion err") // } // } ================================================ FILE: zero/stake/sharepool_test.go ================================================ package stake import ( "fmt" "math/big" "testing" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core/state" "github.com/sero-cash/go-sero/crypto" "github.com/sero-cash/go-sero/serodb" ) func newState() (*StakeState, *state.StateDB) { db := serodb.NewMemDatabase() state, _ := state.New(state.NewDatabase(db), nil) return NewStakeState(state), state } func TestAddShare(t *testing.T) { state, stateDB := newState() var pkr c_type.PKr copy(pkr[:], crypto.Keccak512([]byte("123"))) share1 := &Share{PKr: pkr, Value: big.NewInt(10000), InitNum: 10, Num: 10} state.AddPendingShare(share1) share2 := &Share{PKr: pkr, Value: big.NewInt(10001), InitNum: 10, Num: 10} state.AddPendingShare(share2) fmt.Println(common.Bytes2Hex(share1.Id()), common.Bytes2Hex(share2.Id())) root := stateDB.IntermediateRoot(true) fmt.Println("root:", root.String()) fmt.Println(state.GetShare(common.BytesToHash(share1.Id()))) fmt.Println(state.GetShare(common.BytesToHash(share2.Id()))) //fmt.Println(state.ShareSize()) } func TestCaleAvePrice(t *testing.T) { state, _ := newState() //var pkr c_type.PKr //copy(pkr[:], crypto.Keccak512([]byte("123"))) //share := &Share{PKr: c_type.PKr{}, Value: big.NewInt(10000), InitNum: 10, Num: 10} //state.AddPendingShare(share) //root := stateDB.IntermediateRoot(true) //fmt.Println("root:", root.String()) //fmt.Println(state.ShareSize()) amount, _ := big.NewInt(0).SetString("0", 10) n, price, _ := state.CaleAvgPrice(amount) sum := sum(basePrice, addition, int64(n)) fmt.Println(n, price, sum) fmt.Println(new(big.Int).Mul(big.NewInt(int64(n)), price)) } func TestSeleteShare(t *testing.T) { state, stateDB := newState() tree, _ := initTree(state, 1000) fmt.Println() stateDB.IntermediateRoot(true) seed := crypto.Keccak256Hash([]byte("abc")) prng := NewHash256PRNG(seed[:]) ints, err := FindShareIdxs(tree.Size(), 3, prng) fmt.Println(ints, err) for _, i := range ints { node, _ := tree.FindByIndex(uint32(i)) fmt.Println(common.Bytes2Hex(node.key[:]), node.num) } } func TestPosRewad(t *testing.T) { state, _ := newState() var pkr c_type.PKr copy(pkr[:], crypto.Keccak512([]byte("123"))) share := &Share{PKr: c_type.PKr{}, Value: big.NewInt(10000), InitNum: 326592 + 10, Num: 326592 + 10} //state.AddPendingShare(share) //fmt.Println("root:", root.String()) tree := NewTree(state, 0) tree.Insert(&Node{key: common.BytesToHash(share.Id()), num: share.Num, total: share.Num}) fmt.Println(state.ShareSize()) fmt.Println(maxReware) fmt.Println(state.StakeCurrentReward(big.NewInt(3057599))) fmt.Println(state.StakeCurrentReward(big.NewInt(3057600))) fmt.Println(state.StakeCurrentReward(big.NewInt(3057600 + 8294400))) } func TestPosDif(t *testing.T) { state, _ := newState() var pkr c_type.PKr copy(pkr[:], crypto.Keccak512([]byte("123"))) share := &Share{PKr: c_type.PKr{}, Value: big.NewInt(10000), InitNum: 10000, Num: 10000} //state.AddPendingShare(share) //fmt.Println("root:", root.String()) tree := NewTree(state, 0) tree.Insert(&Node{key: common.BytesToHash(share.Id()), num: share.Num, total: share.Num}) fmt.Println(state.ShareSize()) price := state.CurrentPrice() fmt.Println(price) //basePrice = big.NewInt(2000000000000000000) amount := sum(price, addition, 10000) fmt.Println(amount) fmt.Println(state.CaleAvgPrice(amount)) } ================================================ FILE: zero/stake/stakeConfig.go ================================================ package stake import ( "math/big" "github.com/sero-cash/go-sero/zero/zconfig" "github.com/sero-cash/go-czero-import/seroparam" ) var ( poolValueThreshold, _ = new(big.Int).SetString("200000000000000000000000", 10) //200K SERO lockingBlockNum = uint64(198720) // 1 month 30*24*60*4.6 basePrice = big.NewInt(2000000000000000000) //2 SERO addition = big.NewInt(759357240838722) baseReware, _ = new(big.Int).SetString("10500000000000000000", 10) // 10.5 SERO rewareStep = big.NewInt(76854301391338) maxReware, _ = new(big.Int).SetString("35600000000000000000", 10) //35.6 SERO outOfDateWindow = uint64(198720) // 1 month 30*24*60*4.6 missVotedWindow = uint64(596160) // 3 month 3*30*24*60*4.6 payWindow = uint64(42336) // 1 week 7*24*60*4.6 statisticsMissWindow = uint64(6048) // 1 day 24*60*4.6 //test //outOfDateWindow = uint64(100) //missVotedWindow = uint64(120) //payWindow = uint64(5) //statisticsMissWindow = uint64(10) ) const ( SOLO_RATE = 3 TOTAL_RATE = 4 minSharePoolSize = 20000 // 20K //test //minSharePoolSize = 20 minMissRate = 0.2 MaxVoteCount = 3 ValidVoteCount = 2 ) func getMinSharePoolSize() uint32 { if zconfig.IsTestFork() { return 10000000 } if seroparam.Is_Dev() { return 20 } return minSharePoolSize } func GetPoolValueThreshold() *big.Int { if seroparam.Is_Dev() { return big.NewInt(1000000000000000000) } return poolValueThreshold } func GetLockingBlockNum() uint64 { if seroparam.Is_Dev() { return 10 } return lockingBlockNum } func getStatisticsMissWindow() uint64 { if seroparam.Is_Dev() { return 10 } return statisticsMissWindow } func getOutOfDateWindow() uint64 { if seroparam.Is_Dev() { return 100 } return outOfDateWindow } func getMissVotedWindow() uint64 { if seroparam.Is_Dev() { return 105 } return missVotedWindow } func getPayPeriod() uint64 { if seroparam.Is_Dev() { return 5 } return payWindow } ================================================ FILE: zero/stake/tree.go ================================================ package stake import ( "errors" "math/big" "strings" "github.com/sero-cash/go-sero/zero/utils" "github.com/sero-cash/go-sero/common" ) var ( emptyHash = common.Hash{} rootKey = common.BytesToHash([]byte("ROOT")) ) type STree struct { state State } // func newOldTree(state State) *STree { // return &STree{common.Hash{}, state} // } func (tree *STree) newRootNode() *Node { rootNode := &Node{key: tree.state.GetStakeState(rootKey)} rootNode.load(tree.state) return rootNode } func (tree *STree) Midtraverse() { tree.midtraverse(tree.newRootNode(), func(node *Node) { node.Print() }, nil) } func (tree *STree) midtraverse(node *Node, handle func(*Node), check func(*Node)) { if node == nil { return } tree.midtraverse(node.left(tree.state), handle, check) handle(node) tree.midtraverse(node.right(tree.state), handle, check) } func (tree *STree) Lasttraverse(node *Node, handle func(*Node)) { if node == nil { return } tree.Lasttraverse(node.left(tree.state), handle) tree.Lasttraverse(node.right(tree.state), handle) handle(node) } func (tree *STree) Size() uint32 { parentHash := tree.state.GetStakeState(rootKey) parent := &Node{key: parentHash} return parent.load(tree.state).total } func cmp(hash0, hash1 common.Hash) int { return new(big.Int).SetBytes(hash0[0:32]).Cmp(new(big.Int).SetBytes(hash1[0:32])) } func cmp1(hash0, hash1 string) int { return strings.Compare(hash0, hash1) } func (tree *STree) Insert(node *Node) { hash := tree.state.GetStakeState(rootKey) if hash == emptyHash { tree.state.SetStakeState(rootKey, node.key) tree.state.SetStakeState(node.totalKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(node.total), 32))) tree.state.SetStakeState(node.numKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(node.num), 32))) tree.state.SetStakeState(node.factorKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(uint32(node.factor)), 32))) } else { tree.insertNode(&Node{key: hash}, node) } } func (tree *STree) insertNode(parent *Node, children *Node) { for { value := tree.state.GetStakeState(parent.totalKey()) totalNum := utils.DecodeNumber32(value[28:32]) tree.state.SetStakeState(parent.totalKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(totalNum+children.total), 32))) value = tree.state.GetStakeState(parent.factorKey()) nodeNum := utils.DecodeNumber32(value[28:32]) tree.state.SetStakeState(parent.factorKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(nodeNum+uint32(children.factor)), 32))) var hash, key common.Hash if parent.key == children.key { return } if cmp(children.key, parent.key) < 0 { key = parent.leftKey() hash = tree.state.GetStakeState(key) } else { key = parent.rightKey() hash = tree.state.GetStakeState(key) } if hash == emptyHash { tree.state.SetStakeState(key, children.key) tree.state.SetStakeState(children.numKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(children.num), 32))) tree.state.SetStakeState(children.totalKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(children.total), 32))) tree.state.SetStakeState(children.factorKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(uint32(children.factor)), 32))) return } else { parent = &Node{key: hash} } } } func (tree *STree) Delete(nodeHash common.Hash, num uint32) *Node { rootHash := tree.state.GetStakeState(rootKey) if rootHash == nodeHash { node := &Node{key: rootHash} node.load(tree.state) tree.deleteNode(rootKey, node, num) return node } else { paths := []*Node{} parent := &Node{key: rootHash} for { var hash, key common.Hash if cmp(nodeHash, parent.key) < 0 { key = parent.leftKey() hash = tree.state.GetStakeState(key) } else { key = parent.rightKey() hash = tree.state.GetStakeState(key) } paths = append(paths, parent) if hash == nodeHash { node := &Node{key: nodeHash} node.load(tree.state) for _, path := range paths { value := tree.state.GetStakeState(path.totalKey()) number := utils.DecodeNumber32(value[28:32]) tree.state.SetStakeState(path.totalKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(safeSub(number, num)), 32))) if num == node.num { value = tree.state.GetStakeState(path.factorKey()) nodeNum := utils.DecodeNumber32(value[28:32]) tree.state.SetStakeState(path.factorKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(safeSub(nodeNum, 1)), 32))) } } tree.deleteNode(key, node, num) return node } if hash == emptyHash { return nil } else { parent = &Node{key: hash} } } } } func (tree *STree) deleteNode(key common.Hash, children *Node, num uint32) *Node { number := children.num - num tree.state.SetStakeState(children.numKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(number), 32))) tree.state.SetStakeState(children.totalKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(children.total-num), 32))) if number == 0 { right := children.right(tree.state) if right != nil { left := children.left(tree.state) if left == nil { tree.state.SetStakeState(key, right.key) } else { if right.factor > left.factor { tree.state.SetStakeState(key, right.key) tree.insertNode(right, left) } else { tree.state.SetStakeState(key, left.key) tree.insertNode(left, right) } } } else { left := children.left(tree.state) if left != nil { tree.state.SetStakeState(key, left.key) } else { tree.state.SetStakeState(key, emptyHash) return children } } } return children } func (tree *STree) FindByIndex(index uint32) (*Node, error) { root := tree.state.GetStakeState(rootKey) node := &Node{key: root} node.load(tree.state) for { left := node.left(tree.state) if left != nil { if index < left.total { node = left continue } index -= left.total } if index < node.num { return node, nil } index -= node.num right := node.right(tree.state) if right != nil { node = right continue } return nil, errors.New("not found node by index") } } ================================================ FILE: zero/stake/tree_test.go ================================================ package stake import ( "fmt" "math/rand" "testing" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/crypto" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/zero/utils" ) // func newState() (State, *state.StateDB) { // db := serodb.NewMemDatabase() // state, _ := state.New(common.Hash{}, state.NewDatabase(db), 0) // //state.GetZState() // //return state // //db := consensus.NewFakeDB() // return NewStakeState(state), state // } func TestTree(t *testing.T) { db, stateDB := newState() root := stateDB.IntermediateRoot(true) fmt.Println("root:", root.String()) tree, _ := initTree(db, 1000) root = stateDB.IntermediateRoot(true) fmt.Println("root:", root.String()) fmt.Println(tree.Size()) } func initNode(seed uint64, num uint32, all map[common.Hash]uint32) *Node { hash := crypto.Keccak256Hash(utils.EncodeNumber(seed)) // for all[hash] > 0 { // u = uint64(rand.Intn(1000000)) // hash = crypto.Keccak256Hash(append(utils.EncodeNumber(u), uint8(i))) // } all[hash] = num return &Node{key: hash, total: num, num: num, factor: 1} } func initTree(state State, n int) (*STree, map[common.Hash]uint32) { all := map[common.Hash]uint32{} tree := &STree{state: state} for i := 1; i <= n; i++ { u := uint64(rand.Intn(100)) num := uint32(u%10 + 1) tree.Insert(initNode(uint64(i), num, all)) } // hash := state.GetStakeState(rootKey) // root := &Node{key: hash} // root.load(tree.state) // tree.midtraverse(root, func(node *Node) { // node.Print() // }, nil) return tree, all } func TestTreeFindByIndex(t *testing.T) { db, _ := newState() tree, _ := initTree(db, 10) fmt.Println() node, _ := tree.FindByIndex(0) node.Print() } func TestDelByIndex(t *testing.T) { state, stateDB := newState() tree, _ := initTree(state, 10) fmt.Println() for { size := tree.Size() if size == 0 { break } // snapshot := stateDB.Snapshot() fmt.Println("size : ", size) index := rand.Uint32() % size node, err := tree.FindByIndex(index) if err != nil { panic(err) } node = tree.Delete(node.key, 1) node.Print() // stateDB.RevertToSnapshot(snapshot) tree.midtraverse(tree.newRootNode(), func(node *Node) { node.Print() }, nil) root := stateDB.IntermediateRoot(true) fmt.Println("root:", root.String()) fmt.Println() } tree.midtraverse(tree.newRootNode(), func(node *Node) { node.Print() }, nil) root := stateDB.IntermediateRoot(true) fmt.Println("root:", root.String()) } func TestDelByHash(t *testing.T) { state, _ := newState() tree, all := initTree(state, 1000) start := uint64(100000 + 1) fmt.Println() for { var key common.Hash var num uint32 for key, num = range all { if num == 0 { log.Error("error", num) return } fmt.Println("delete ", common.Bytes2Hex(key[:])) if num >= 5 { num = 5 } else { num = 1 } // snapshot := stateDB.Snapshot() // fmt.Println("snapshot : ", snapshot) tree.Delete(key, num) if num != 1 { start++ tree.Insert(initNode(start, 1, all)) } // if index == 2 { // root := stateDB.IntermediateRoot(true) // fmt.Println("root : ", root.String()) // } else { // stateDB.RevertToSnapshot(snapshot) // } rootNode := &Node{key: state.GetStakeState(rootKey)} rootNode.load(state) rootNode.Print() // rootNode.MiddleOrder(state) fmt.Println() break } all[key] -= num if all[key] == 0 { delete(all, key) } if len(all) == 0 { break } } hash := state.GetStakeState(rootKey) root := &Node{key: hash} fmt.Println("rootNode", common.Bytes2Hex(hash[:])) tree.midtraverse(root, func(node *Node) { node.Print() }, nil) fmt.Println() } ================================================ FILE: zero/txs/assets/assets.go ================================================ package assets import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/crypto/sha3" "github.com/sero-cash/go-sero/zero/utils" ) type Asset struct { Tkn *Token `rlp:"nil"` Tkt *Ticket `rlp:"nil"` } func (self *Asset) IsValid() bool { if self.Tkn != nil { return self.Tkn.IsValid() } return true } func (self *Asset) HasAsset() bool { if self != nil { if self.Tkn != nil { if self.Tkn.Value.Cmp(&utils.U256_0) != 0 { return true } } if self.Tkt != nil { if self.Tkt.Value != c_type.Empty_Uint256 { return true } } } return false } func NewAssetByType(asset *c_type.Asset) (ret Asset) { ret = NewAsset( &Token{ asset.Tkn_currency, utils.NewU256_ByKey(&asset.Tkn_value), }, &Ticket{ asset.Tkt_category, asset.Tkt_value, }, ) return } func NewAsset(tkn *Token, tkt *Ticket) (ret Asset) { if tkn != nil { if tkn.Value.Cmp(&utils.U256_0) > 0 && tkn.Currency != c_type.Empty_Uint256 { ret.Tkn = tkn.Clone().ToRef() } } if tkt != nil { if tkt.Value != c_type.Empty_Uint256 && tkt.Category != c_type.Empty_Uint256 { ret.Tkt = tkt.Clone().ToRef() } } return } func (self Asset) ToRef() (ret *Asset) { return &self } func (self *Asset) ToHash() (ret c_type.Uint256) { d := sha3.NewKeccak256() if self.Tkn != nil { d.Write(self.Tkn.ToHash().NewRef()[:]) } if self.Tkt != nil { d.Write(self.Tkt.ToHash().NewRef()[:]) } copy(ret[:], d.Sum(nil)) return ret } func (self *Asset) Clone() (ret Asset) { utils.DeepCopy(&ret, self) return } ================================================ FILE: zero/txs/assets/ckstate.go ================================================ package assets import ( "encoding/hex" "fmt" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/utils" ) type cyState struct { balance utils.I256 } type cyStateMap map[c_type.Uint256]*cyState func (self cyStateMap) add(key *c_type.Uint256, value *utils.U256) { if _, ok := self[*key]; ok { self[*key].balance.AddU(value) } else { self[*key] = &cyState{ *value.ToI256().ToRef(), } } } func (self cyStateMap) sub(key *c_type.Uint256, value *utils.U256) { if _, ok := self[*key]; ok { self[*key].balance.SubU(value) } else { self[*key] = &cyState{} self[*key].balance.SubU(value) } } func newcyStateMap() (ret cyStateMap) { ret = make(cyStateMap) return } type cgState struct { count int } type cgStateMap map[c_type.Uint512]*cgState func newcgStateMap() (ret cgStateMap) { ret = make(cgStateMap) return } func (self cgStateMap) add(category *c_type.Uint256, value *c_type.Uint256) { ticket := c_type.Uint512{} copy(ticket[:], category[:]) copy(ticket[32:], value[:]) if _, ok := self[ticket]; ok { state := self[ticket] state.count++ } else { self[ticket] = &cgState{1} } } func (self cgStateMap) sub(category *c_type.Uint256, value *c_type.Uint256) { ticket := c_type.Uint512{} copy(ticket[:], category[:]) copy(ticket[32:], value[:]) if _, ok := self[ticket]; ok { state := self[ticket] state.count-- } else { self[ticket] = &cgState{-1} } } type CKState struct { outPlus bool cy cyStateMap tk cgStateMap } func NewCKState(outPlus bool, fee *Token) (ret CKState) { ret.outPlus = outPlus ret.cy = newcyStateMap() ret.tk = newcgStateMap() if outPlus { ret.cy.add(&fee.Currency, &fee.Value) } else { ret.cy.sub(&fee.Currency, &fee.Value) } return } func (self *CKState) Tkns() (ret []Token) { for c, v := range self.cy { if v.balance.Cmp(&utils.I256_0) > 0 { ret = append(ret, Token{c, utils.U256(v.balance)}) } } return } func (self *CKState) Tkts() (ret []Ticket) { for c, v := range self.tk { if v.count > 0 { category := c_type.Uint256{} value := c_type.Uint256{} copy(category[:], c[:32]) copy(value[:], c[32:]) ret = append(ret, Ticket{category, value}) } } return } func (self *CKState) GetList() (tkns []Token, tkts []Ticket) { tkns = self.Tkns() tkts = self.Tkts() return } func (self *CKState) AddIn(asset *Asset) (added bool) { added = false if asset.Tkn != nil { if asset.Tkn.Currency != c_type.Empty_Uint256 { if asset.Tkn.Value.ToUint256() != c_type.Empty_Uint256 { if self.outPlus { self.cy.sub(&asset.Tkn.Currency, &asset.Tkn.Value) } else { self.cy.add(&asset.Tkn.Currency, &asset.Tkn.Value) } added = true } } } if asset.Tkt != nil { if asset.Tkt.Category != c_type.Empty_Uint256 { if asset.Tkt.Value != c_type.Empty_Uint256 { if self.outPlus { self.tk.sub(&asset.Tkt.Category, &asset.Tkt.Value) } else { self.tk.add(&asset.Tkt.Category, &asset.Tkt.Value) } added = true } } } return } func (self *CKState) AddOut(asset *Asset) (added bool) { added = false if asset.Tkn != nil { if self.outPlus { self.cy.add(&asset.Tkn.Currency, &asset.Tkn.Value) } else { self.cy.sub(&asset.Tkn.Currency, &asset.Tkn.Value) } added = true } if asset.Tkt != nil { if self.outPlus { self.tk.add(&asset.Tkt.Category, &asset.Tkt.Value) } else { self.tk.sub(&asset.Tkt.Category, &asset.Tkt.Value) } added = true } return } func (self *CKState) CheckToken() (e error) { for currency, state := range self.cy { if state.balance.Cmp(&utils.I256_0) != 0 { e = fmt.Errorf("currency %v value %v not balance", utils.BytesToCurrency(currency[:]), state.balance.ToIntRef()) return } } return } func (self *CKState) CheckTicket() (e error) { for c, v := range self.tk { category := c_type.Uint256{} value := c_type.Uint256{} copy(category[:], c[:32]) copy(value[:], c[32:]) if v.count != 0 { e = fmt.Errorf("category %v value %v not balance", utils.BytesToCurrency(category[:]), hex.EncodeToString(value[:])) return } } return } func (self *CKState) Check() (e error) { if e = self.CheckToken(); e != nil { return } if e = self.CheckTicket(); e != nil { return } return } ================================================ FILE: zero/txs/assets/ckstate_test.go ================================================ package assets import ( "testing" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/utils" ) var sero_token = Token{ utils.CurrencyToUint256("SERO"), utils.NewU256(100), } var tk_ticket = Ticket{ utils.CurrencyToUint256("TK"), c_type.RandUint256(), } var token_asset = Asset{&sero_token, nil} var ticket_asset = Asset{nil, &tk_ticket} var asset = Asset{&sero_token, &tk_ticket} func TestCkState_OutPlus(t *testing.T) { ck := NewCKState(true, &sero_token) if ck.Check() == nil { t.Fail() } ck.AddIn(&token_asset) if ck.Check() != nil { t.Fail() } ck.AddIn(&ticket_asset) if ck.Check() == nil { t.Fail() } ck.AddOut(&asset) if ck.Check() == nil { t.Fail() } tkns, tkts := ck.GetList() if len(tkns) != 1 { t.Fail() } if len(tkts) != 0 { t.Fail() } ck.AddIn(&token_asset) if ck.Check() != nil { t.Fail() } tkns, tkts = ck.GetList() if len(tkns) != 0 { t.Fail() } if len(tkts) != 0 { t.Fail() } } func TestCkState_InPlus(t *testing.T) { ck := NewCKState(false, &sero_token) if ck.Check() == nil { t.Fail() } ck.AddIn(&token_asset) if ck.Check() != nil { t.Fail() } ck.AddIn(&ticket_asset) if ck.Check() == nil { t.Fail() } tkns, tkts := ck.GetList() if len(tkns) != 0 { t.Fail() } if len(tkts) != 1 { t.Fail() } ck.AddOut(&asset) if ck.Check() == nil { t.Fail() } ck.AddIn(&token_asset) if ck.Check() != nil { t.Fail() } tkns, tkts = ck.GetList() if len(tkns) != 0 { t.Fail() } if len(tkts) != 0 { t.Fail() } } ================================================ FILE: zero/txs/assets/flat_asset.go ================================================ package assets import "github.com/sero-cash/go-czero-import/c_type" type FlatAssert struct { Tkn Token Tkt Ticket } func (self *Asset) ToFlatAsset() (ret FlatAssert) { if self.Tkt != nil { ret.Tkt = *self.Tkt } if self.Tkn != nil { ret.Tkn = *self.Tkn } return } func (self *Asset) ToTypeAsset() (ret c_type.Asset) { asset := self.ToFlatAsset() ret = c_type.Asset{ Tkn_currency: asset.Tkn.Currency, Tkn_value: asset.Tkn.Value.ToUint256(), Tkt_category: asset.Tkt.Category, Tkt_value: asset.Tkt.Value, } return } ================================================ FILE: zero/txs/assets/ticket.go ================================================ package assets import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/crypto" "github.com/sero-cash/go-sero/zero/utils" ) type Ticket struct { Category c_type.Uint256 Value c_type.Uint256 } func (self *Ticket) Clone() (ret Ticket) { utils.DeepCopy(&ret, self) return } func (this Ticket) ToRef() (ret *Ticket) { ret = &this return } func (self *Ticket) ToHash() (ret c_type.Uint256) { if self == nil { return } else { hash := crypto.Keccak256( self.Category[:], self.Value[:], ) copy(ret[:], hash) return } } ================================================ FILE: zero/txs/assets/token.go ================================================ package assets import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/crypto" "github.com/sero-cash/go-sero/zero/utils" ) type Token struct { Currency c_type.Uint256 Value utils.U256 } func (self *Token) IsValid() bool { return self.Value.IsValid() } func (self *Token) ToTypeAsset() c_type.Asset { return c_type.Asset{ Tkn_currency: self.Currency, Tkn_value: self.Value.ToUint256(), Tkt_category: c_type.Empty_Uint256, Tkt_value: c_type.Empty_Uint256, } } func (self *Token) Clone() (ret Token) { utils.DeepCopy(&ret, self) return } func (this Token) ToRef() (ret *Token) { ret = &this return } func (self *Token) ToHash() (ret c_type.Uint256) { if self == nil { return } else { hash := crypto.Keccak256( self.Currency[:], self.Value.ToUint256().NewRef()[:], ) copy(ret[:], hash) return } } ================================================ FILE: zero/txs/outs.go ================================================ package txs import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/txs/pkg" ) func WatchPkg(id *c_type.Uint256, key *c_type.Uint256) (ret pkg.Pkg_O, pkr c_type.PKr, e error) { /* st1 := lstate.CurrentLState() if st1 == nil { e = errors.New("Watch Pkg but lstate is nil") return } pg := st1.CurrentZState().Pkgs.GetPkgById(id) if pg == nil || pg.Closed { e = errors.New("Watch Pkg but has been closed") return } pkr = pg.Pack.PKr ret, e = pkg.DePkg(key, &pg.Pack.Pkg) */ return } ================================================ FILE: zero/txs/pkg/opkg.go ================================================ package pkg import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/crypto/sha3" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-sero/zero/utils" ) type Pkg_O struct { Asset assets.Asset Memo c_type.Uint512 Ar c_type.Uint256 } func (this Pkg_O) ToRef() (ret *Pkg_O) { ret = &this return } func (self *Pkg_O) ToHash() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.Asset.ToHash().NewRef()[:]) d.Write(self.Memo[:]) d.Write(self.Ar[:]) copy(ret[:], d.Sum(nil)) return ret } func (self *Pkg_O) Clone() (ret Pkg_O) { utils.DeepCopy(&ret, self) return } ================================================ FILE: zero/txs/pkg/tools.go ================================================ package pkg import ( "github.com/pkg/errors" "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/crypto/sha3" "github.com/sero-cash/go-sero/zero/txs/assets" ) func DePkg(key *c_type.Uint256, pkg *Pkg_Z) (ret Pkg_O, e error) { if asset, memo, ar, err := c_superzk.DecEInfo(key, &pkg.EInfo); err != nil { e = err return } else { ret.Memo = memo ret.Asset = assets.NewAssetByType(&asset) ret.Ar = ar } return } func GetKey(pkr *c_type.PKr, tk *c_type.Tk) (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(pkr[:]) d.Write(tk[:]) copy(ret[:], d.Sum(nil)) return } func ConfirmPkg(o *Pkg_O, z *Pkg_Z) (e error) { if cm, _, err := c_superzk.GenAssetCM_PC(o.Asset.ToTypeAsset().NewRef(), &o.Ar); err != nil { e = err return } else { if z.AssetCM != cm { e = errors.New("pkg asset_cm is not match") return } else { return } } return } ================================================ FILE: zero/txs/pkg/zpkg.go ================================================ package pkg import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/crypto/sha3" "github.com/sero-cash/go-sero/zero/utils" ) type Pkg_Z struct { AssetCM c_type.Uint256 EInfo c_type.Einfo } func (this Pkg_Z) ToRef() (ret *Pkg_Z) { ret = &this return } func (self *Pkg_Z) ToHash() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.AssetCM[:]) d.Write(self.EInfo[:]) copy(ret[:], d.Sum(nil)) return ret } func (self *Pkg_Z) Clone() (ret Pkg_Z) { utils.DeepCopy(&ret, self) return } ================================================ FILE: zero/txs/stx/cmd.go ================================================ package stx import ( "encoding/base64" "encoding/hex" "math/big" "sync/atomic" "github.com/pkg/errors" "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/crypto/sha3" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-sero/zero/utils" ) type BuyShareCmd struct { Value utils.U256 Vote c_type.PKr Pool *c_type.Uint256 `rlp:"nil"` } func (self *BuyShareCmd) ToHash() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.Value.ToBEBytes()) d.Write(self.Vote[:]) if self.Pool != nil { d.Write(self.Pool[:]) } copy(ret[:], d.Sum(nil)) return ret } func (self *BuyShareCmd) Asset() (ret assets.Asset) { ret.Tkn = &assets.Token{ utils.CurrencyToUint256("SERO"), self.Value, } return } type RegistPoolCmd struct { Value utils.U256 Vote c_type.PKr FeeRate uint32 } func (self *RegistPoolCmd) ToHash() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.Value.ToBEBytes()) d.Write(self.Vote[:]) d.Write(big.NewInt(int64(self.FeeRate)).Bytes()) copy(ret[:], d.Sum(nil)) return ret } func (self *RegistPoolCmd) Asset() (ret assets.Asset) { ret.Tkn = &assets.Token{ utils.CurrencyToUint256("SERO"), self.Value, } return } type ClosePoolCmd struct { None byte } func (self *ClosePoolCmd) ToHash() (ret c_type.Uint256) { ret[0] = 1 return } //go:generate gencodec -type ContractCmd -field-override ContractCmdMarshaling -out gen_contractCmd_json.go type ContractCmd struct { Asset assets.Asset To *c_type.PKr `rlp:"nil"` Data []byte } type ContractData []byte // MarshalText implements encoding.TextMarshaler func (b ContractData) MarshalText() ([]byte, error) { result := make([]byte, len(b)*2+2) copy(result, `0x`) hex.Encode(result[2:], b) return result, nil } func (b *ContractData) UnmarshalText(input []byte) error { if len(input) == 0 { dec := make([]byte, len(input)/2) *b = dec return nil } if IsHex(string(input)) { raw, err := checkText(input, true) if err != nil { return err } dec := make([]byte, len(raw)/2) if _, err = hex.Decode(dec, raw); err != nil { return err } else { *b = dec } return nil } else { if dec, err := base64.StdEncoding.DecodeString(string(input)); err != nil { return err } else { *b = dec } return nil } } func checkText(input []byte, wantPrefix bool) ([]byte, error) { if len(input) == 0 { return nil, nil // empty strings are allowed } if bytesHave0xPrefix(input) { input = input[2:] } else if wantPrefix { return nil, errors.New("hex string without 0x prefi") } if len(input)%2 != 0 { return nil, errors.New("hex string of odd lengt") } return input, nil } func bytesHave0xPrefix(input []byte) bool { return len(input) >= 2 && input[0] == '0' && (input[1] == 'x' || input[1] == 'X') } func has0xPrefix(input string) bool { return len(input) >= 2 && input[0] == '0' && (input[1] == 'x' || input[1] == 'X') } func isHexCharacter(c byte) bool { return ('0' <= c && c <= '9') || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F') } func IsHex(s string) bool { if has0xPrefix(s) { s = s[2:] } for _, c := range []byte(s) { if !isHexCharacter(c) { return false } } return true } type ContractCmdMarshaling struct { Asset assets.Asset To *c_type.PKr Data ContractData } func (self *ContractCmd) ToHash() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.Asset.ToHash().NewRef()[:]) if self.To != nil { d.Write(self.To[:]) } d.Write(self.Data) copy(ret[:], d.Sum(nil)) return } type DescCmd struct { BuyShare *BuyShareCmd `rlp:"nil"` RegistPool *RegistPoolCmd `rlp:"nil"` ClosePool *ClosePoolCmd `rlp:"nil"` Contract *ContractCmd `rlp:"nil"` //Cache assetCC_Szk atomic.Value } func (self *DescCmd) ToPkr() *c_type.PKr { if self.BuyShare != nil { return &self.BuyShare.Vote } if self.RegistPool != nil { return &self.RegistPool.Vote } return nil } func (self *DescCmd) ToAssetCC_Szk() *c_type.Uint256 { if asset := self.OutAsset(); asset != nil { if cc, ok := self.assetCC_Szk.Load().(c_type.Uint256); ok { return &cc } v, _ := c_superzk.GenAssetCC(asset.ToTypeAsset().NewRef()) self.assetCC_Szk.Store(v) return &v } else { return nil } } func (self *DescCmd) OutAsset() *assets.Asset { if self.BuyShare != nil { asset := self.BuyShare.Asset() return &asset } if self.RegistPool != nil { asset := self.RegistPool.Asset() return &asset } if self.Contract != nil { return &self.Contract.Asset } return nil } func (self *DescCmd) ToHash() (ret c_type.Uint256) { d := sha3.NewKeccak256() if self.BuyShare != nil { d.Write(self.BuyShare.ToHash().NewRef()[:]) } if self.RegistPool != nil { d.Write(self.RegistPool.ToHash().NewRef()[:]) } if self.ClosePool != nil { d.Write(self.ClosePool.ToHash().NewRef()[:]) } if self.Contract != nil { d.Write(self.Contract.ToHash().NewRef()[:]) } copy(ret[:], d.Sum(nil)) return } func (self *DescCmd) Count() int { count := 0 if self.BuyShare != nil { count++ } if self.RegistPool != nil { count++ } if self.ClosePool != nil { count++ } if self.Contract != nil { count++ } return count } func (self *DescCmd) Valid() bool { if self.Count() <= 1 { return true } else { return false } } ================================================ FILE: zero/txs/stx/cmd_test.go ================================================ package stx import ( "bytes" "testing" ) func TestContractData_UnmarshalText(t *testing.T) { str1 := "0x3c87d061b8bfc306c0882e8b8a43627b0000fa30b251000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000046464646400000000000000000000000000000000000000000000000000000000" var r1 ContractData input := []byte(str1) err := r1.UnmarshalText(input) if err != nil { t.Error(err) } str2 := "PIfQYbi/wwbAiC6LikNiewAA+jCyUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARkZGRkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" var r2 ContractData err = r2.UnmarshalText([]byte(str2)) if err != nil { t.Error(err) } if bytes.Compare(r1[:], r2[:]) != 0 { t.Error("not equals") } } ================================================ FILE: zero/txs/stx/gen_contractCmd_json.go ================================================ // Code generated by github.com/fjl/gencodec. DO NOT EDIT. package stx import ( "encoding/json" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/txs/assets" ) var _ = (*ContractCmdMarshaling)(nil) // MarshalJSON marshals as JSON. func (c ContractCmd) MarshalJSON() ([]byte, error) { type ContractCmd struct { Asset assets.Asset To *c_type.PKr Data ContractData } var enc ContractCmd enc.Asset = c.Asset enc.To = c.To enc.Data = c.Data return json.Marshal(&enc) } // UnmarshalJSON unmarshals from JSON. func (c *ContractCmd) UnmarshalJSON(input []byte) error { type ContractCmd struct { Asset *assets.Asset To *c_type.PKr `rlp:"nil"` Data *ContractData } var dec ContractCmd if err := json.Unmarshal(input, &dec); err != nil { return err } if dec.Asset != nil { c.Asset = *dec.Asset } if dec.To != nil { c.To = dec.To } if dec.Data != nil { c.Data = *dec.Data } return nil } ================================================ FILE: zero/txs/stx/hash_v1.go ================================================ package stx import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/crypto/sha3" ) func (self *T) Tx1_Hash_From() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.Ehash[:]) d.Write(self.From[:]) d.Write(self.Fee.ToHash().NewRef()[:]) copy(ret[:], d.Sum(nil)) return ret } func (self *T) Tx1_Hash_Cmd() (ret c_type.Uint256) { return self.Desc_Cmd.ToHash() } func (self *T) Tx1_Hash_Pkg() (ret c_type.Uint256) { return self.Desc_Pkg.Tx1_Hash() } func (self *T) Tx1_Hash_Tx1() (ret c_type.Uint256) { return self.Tx1.Tx1_Hash() } func (self *T) Tx1_Hash() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.Tx1_Hash_From().NewRef()[:]) d.Write(self.Tx1_Hash_Cmd().NewRef()[:]) d.Write(self.Tx1_Hash_Pkg().NewRef()[:]) d.Write(self.Tx1_Hash_Tx1().NewRef()[:]) copy(ret[:], d.Sum(nil)) return ret } ================================================ FILE: zero/txs/stx/pkg.go ================================================ package stx import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/crypto/sha3" "github.com/sero-cash/go-sero/zero/txs/pkg" "github.com/sero-cash/go-sero/zero/txs/stx/stx_v0" "github.com/sero-cash/go-sero/zero/utils" ) type PkgClose struct { Id c_type.Uint256 Sign c_type.Uint512 } func (this PkgClose) ToRef() (ret *PkgClose) { ret = &this return } func (self *PkgClose) ToHash() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.Id[:]) d.Write(self.Sign[:]) copy(ret[:], d.Sum(nil)) return ret } func (self *PkgClose) Tx1_Hash() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.Id[:]) copy(ret[:], d.Sum(nil)) return } func (self *PkgClose) ToHash_for_gen() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.Id[:]) copy(ret[:], d.Sum(nil)) return ret } func (self *PkgClose) ToHash_for_sign() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.Id[:]) copy(ret[:], d.Sum(nil)) return ret } func (self *PkgClose) Clone() (ret PkgClose) { utils.DeepCopy(&ret, self) return } type PkgTransfer struct { Id c_type.Uint256 PKr c_type.PKr Sign c_type.Uint512 } func (this PkgTransfer) ToRef() (ret *PkgTransfer) { ret = &this return } func (self *PkgTransfer) Tx1_Hash() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.Id[:]) d.Write(self.PKr[:]) copy(ret[:], d.Sum(nil)) return } func (self *PkgTransfer) ToHash() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.Id[:]) d.Write(self.PKr[:]) d.Write(self.Sign[:]) copy(ret[:], d.Sum(nil)) return ret } func (self *PkgTransfer) ToHash_for_gen() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.Id[:]) d.Write(self.PKr[:]) copy(ret[:], d.Sum(nil)) return ret } func (self *PkgTransfer) ToHash_for_sign() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.Id[:]) d.Write(self.PKr[:]) copy(ret[:], d.Sum(nil)) return ret } func (self *PkgTransfer) Clone() (ret PkgTransfer) { utils.DeepCopy(&ret, self) return } type PkgCreate struct { Id c_type.Uint256 PKr c_type.PKr Pkg pkg.Pkg_Z Proof c_type.Proof } func (self *PkgCreate) Tx1_Hash() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.Id[:]) d.Write(self.PKr[:]) d.Write(self.Pkg.ToHash().NewRef()[:]) copy(ret[:], d.Sum(nil)) return } func (this PkgCreate) ToRef() (ret *PkgCreate) { ret = &this return } func (self *PkgCreate) ToHash() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.Id[:]) d.Write(self.PKr[:]) d.Write(self.Pkg.ToHash().NewRef()[:]) d.Write(stx_v0.ProofToHash(&self.Proof).NewRef()[:]) copy(ret[:], d.Sum(nil)) return ret } func (self *PkgCreate) ToHash_for_gen() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.Id[:]) d.Write(self.PKr[:]) copy(ret[:], d.Sum(nil)) return ret } func (self *PkgCreate) ToHash_for_sign() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.Id[:]) d.Write(self.PKr[:]) d.Write(self.Pkg.ToHash().NewRef()[:]) d.Write(stx_v0.ProofToHash(&self.Proof).NewRef()[:]) copy(ret[:], d.Sum(nil)) return ret } func (self *PkgCreate) Clone() (ret PkgCreate) { utils.DeepCopy(&ret, self) return } type PkgDesc_Z struct { Create *PkgCreate `rlp:"nil"` Transfer *PkgTransfer `rlp:"nil"` Close *PkgClose `rlp:"nil"` } func (self *PkgDesc_Z) Tx1_Hash() (ret c_type.Uint256) { d := sha3.NewKeccak256() if self.Create != nil { d.Write(self.Create.Tx1_Hash().NewRef()[:]) } if self.Transfer != nil { d.Write(self.Transfer.Tx1_Hash().NewRef()[:]) } if self.Close != nil { d.Write(self.Close.Tx1_Hash().NewRef()[:]) } copy(ret[:], d.Sum(nil)) return } func (self *PkgDesc_Z) Count() int { count := 0 if self.Create != nil { count++ } if self.Transfer != nil { count++ } if self.Close != nil { count++ } return count } func (self *PkgDesc_Z) Valid() bool { if self.Count() <= 1 { return true } else { return false } } func (this PkgDesc_Z) ToRef() (ret *PkgDesc_Z) { ret = &this return } func (self *PkgDesc_Z) ToHash() (ret c_type.Uint256) { d := sha3.NewKeccak256() if self.Create != nil { d.Write(self.Create.ToHash().NewRef()[:]) } if self.Transfer != nil { d.Write(self.Transfer.ToHash().NewRef()[:]) } if self.Close != nil { d.Write(self.Close.ToHash().NewRef()[:]) } copy(ret[:], d.Sum(nil)) return ret } func (self *PkgDesc_Z) ToHash_for_gen() (ret c_type.Uint256) { d := sha3.NewKeccak256() if self.Create != nil { d.Write(self.Create.ToHash_for_gen().NewRef()[:]) } if self.Transfer != nil { d.Write(self.Transfer.ToHash_for_gen().NewRef()[:]) } if self.Close != nil { d.Write(self.Close.ToHash_for_gen().NewRef()[:]) } copy(ret[:], d.Sum(nil)) return ret } func (self *PkgDesc_Z) ToHash_for_sign() (ret c_type.Uint256) { d := sha3.NewKeccak256() if self.Create != nil { d.Write(self.Create.ToHash_for_sign().NewRef()[:]) } if self.Transfer != nil { d.Write(self.Transfer.ToHash_for_sign().NewRef()[:]) } if self.Close != nil { d.Write(self.Close.ToHash_for_sign().NewRef()[:]) } copy(ret[:], d.Sum(nil)) return ret } func (self *PkgDesc_Z) Clone() (ret PkgDesc_Z) { utils.DeepCopy(&ret, self) return } ================================================ FILE: zero/txs/stx/stx_v0/otx.go ================================================ // copyright 2018 The sero.cash Authors // This file is part of the go-sero library. // // The go-sero library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-sero library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-sero library. If not, see <http://www.gnu.org/licenses/>. package stx_v0 import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/crypto/sha3" "github.com/sero-cash/go-sero/zero/utils" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-sero/crypto" ) type Out_O struct { Addr c_type.PKr Asset assets.Asset Memo c_type.Uint512 } func (self *Out_O) Clone() (ret Out_O) { utils.DeepCopy(&ret, self) return } func (this Out_O) ToRef() (ret *Out_O) { ret = &this return } func (self *Out_O) ToHash() (ret c_type.Uint256) { hash := crypto.Keccak256( self.Addr[:], self.Asset.ToHash().NewRef()[:], self.Memo[:], ) copy(ret[:], hash) return ret } func (self *Out_O) ToHash_for_gen() (ret c_type.Uint256) { hash := crypto.Keccak256( self.Addr[:], self.Asset.ToHash().NewRef()[:], self.Memo[:], ) copy(ret[:], hash) return ret } func (self *Out_O) ToHash_for_sign() (ret c_type.Uint256) { hash := crypto.Keccak256( self.Addr[:], self.Asset.ToHash().NewRef()[:], self.Memo[:], ) copy(ret[:], hash) return ret } /* type In_O struct { Root c_type.Uint256 Sign c_type.Uint512 } func (ino In_O) MarshalText() ([]byte, error) { input := [64]byte{} copy(input[:32], ino.Root[:]) copy(input[32:], ino.Sign[:]) result := make([]byte, len(input)*2+2) copy(result, `0x`) hex.Encode(result[2:], input[:]) return result, nil } func (self *In_O) ToHash() (ret c_type.Uint256) { copy(ret[:], self.Root[:]) copy(ret[:], self.Sign[:]) return ret } func (self *In_O) ToHash_for_gen() (ret c_type.Uint256) { copy(ret[:], self.Root[:]) return ret } func (self *In_O) ToHash_for_sign() (ret c_type.Uint256) { copy(ret[:], self.Root[:]) return ret } */ type In_S struct { Root c_type.Uint256 Nil c_type.Uint256 Sign c_type.Uint512 } func (self *In_S) ToHash() (ret c_type.Uint256) { hash := crypto.Keccak256( self.Root[:], self.Nil[:], self.Sign[:], ) copy(ret[:], hash) return ret } func (self *In_S) ToHash_for_gen() (ret c_type.Uint256) { hash := crypto.Keccak256( self.Root[:], ) copy(ret[:], hash) return ret } func (self *In_S) ToHash_for_sign() (ret c_type.Uint256) { hash := crypto.Keccak256( self.Root[:], ) copy(ret[:], hash) return ret } type Desc_O struct { Ins []In_S Outs []Out_O } func (self *Desc_O) HasContent() bool { return len(self.Ins) > 0 || len(self.Outs) > 0 } func (self *Desc_O) ToHash() (ret c_type.Uint256) { d := sha3.NewKeccak256() for _, in := range self.Ins { d.Write(in.ToHash().NewRef()[:]) } for _, out := range self.Outs { d.Write(out.ToHash().NewRef()[:]) } copy(ret[:], d.Sum(nil)) return } func (self *Desc_O) ToHash_for_gen() (ret c_type.Uint256) { d := sha3.NewKeccak256() for _, in := range self.Ins { d.Write(in.ToHash_for_gen().NewRef()[:]) } for _, out := range self.Outs { d.Write(out.ToHash_for_gen().NewRef()[:]) } copy(ret[:], d.Sum(nil)) return } func (self *Desc_O) ToHash_for_sign() (ret c_type.Uint256) { d := sha3.NewKeccak256() for _, in := range self.Ins { d.Write(in.ToHash_for_sign().NewRef()[:]) } for _, out := range self.Outs { d.Write(out.ToHash_for_sign().NewRef()[:]) } copy(ret[:], d.Sum(nil)) return } ================================================ FILE: zero/txs/stx/stx_v0/tx.go ================================================ package stx_v0 type Tx struct { Desc_O Desc_O Desc_Z Desc_Z } ================================================ FILE: zero/txs/stx/stx_v0/ztx.go ================================================ package stx_v0 import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/crypto/sha3" "github.com/sero-cash/go-sero/zero/utils" ) type In_Z struct { Anchor c_type.Uint256 Nil c_type.Uint256 Trace c_type.Uint256 AssetCM c_type.Uint256 Proof c_type.Proof } func (self *In_Z) ToHash() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.Anchor[:]) d.Write(self.Nil[:]) d.Write(self.Trace[:]) d.Write(self.AssetCM[:]) d.Write(ProofToHash(&self.Proof).NewRef()[:]) copy(ret[:], d.Sum(nil)) return } func (self *In_Z) ToHash_for_sign() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.Anchor[:]) d.Write(self.Nil[:]) d.Write(self.Trace[:]) d.Write(self.AssetCM[:]) d.Write(ProofToHash(&self.Proof).NewRef()[:]) copy(ret[:], d.Sum(nil)) return } type Out_Z struct { AssetCM c_type.Uint256 OutCM c_type.Uint256 RPK c_type.Uint256 EInfo c_type.Einfo PKr c_type.PKr Proof c_type.Proof } func (self *Out_Z) Clone() (ret Out_Z) { utils.DeepCopy(&ret, self) return } func (this Out_Z) ToRef() (ret *Out_Z) { ret = &Out_Z{} *ret = this return } func (self *Out_Z) ToHash() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.AssetCM[:]) d.Write(self.OutCM[:]) d.Write(self.EInfo[:]) d.Write(self.PKr[:]) d.Write(ProofToHash(&self.Proof).NewRef()[:]) copy(ret[:], d.Sum(nil)) return } func (self *Out_Z) ToHash_for_gen() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.PKr[:]) copy(ret[:], d.Sum(nil)) return } func (self *Out_Z) ToHash_for_sign() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.AssetCM[:]) d.Write(self.OutCM[:]) d.Write(self.EInfo[:]) d.Write(self.PKr[:]) d.Write(ProofToHash(&self.Proof).NewRef()[:]) copy(ret[:], d.Sum(nil)) return } type Desc_Z struct { Ins []In_Z Outs []Out_Z } func (self *Desc_Z) HasContent() bool { return len(self.Ins) > 0 || len(self.Outs) > 0 } func (self *Desc_Z) ToHash() (ret c_type.Uint256) { d := sha3.NewKeccak256() for _, in := range self.Ins { d.Write(in.ToHash().NewRef()[:]) } for _, out := range self.Outs { d.Write(out.ToHash().NewRef()[:]) } copy(ret[:], d.Sum(nil)) return } func (self *Desc_Z) ToHash_for_gen() (ret c_type.Uint256) { d := sha3.NewKeccak256() for _, out := range self.Outs { d.Write(out.ToHash_for_gen().NewRef()[:]) } copy(ret[:], d.Sum(nil)) return } func (self *Desc_Z) ToHash_for_sign() (ret c_type.Uint256) { d := sha3.NewKeccak256() for _, in := range self.Ins { d.Write(in.ToHash_for_sign().NewRef()[:]) } for _, out := range self.Outs { d.Write(out.ToHash_for_sign().NewRef()[:]) } copy(ret[:], d.Sum(nil)) return } func ProofToHash(proof *c_type.Proof) (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(proof[:]) copy(ret[:], d.Sum(nil)) return } ================================================ FILE: zero/txs/stx/stx_v1/ctx.go ================================================ package stx_v1 import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/crypto" "github.com/sero-cash/go-sero/zero/utils" ) type Out_C struct { PKr c_type.PKr AssetCM c_type.Uint256 RPK c_type.Uint256 EInfo c_type.Einfo Proof c_type.Proof } func (self *Out_C) Clone() (ret Out_C) { utils.DeepCopy(&ret, self) return } func (self *Out_C) Tx1_Hash() (ret c_type.Uint256) { hash := crypto.Keccak256( self.PKr[:], self.AssetCM[:], self.RPK[:], self.EInfo[:], ) copy(ret[:], hash) return ret } func (self *Out_C) ToHash() (ret c_type.Uint256) { hash := crypto.Keccak256( self.PKr[:], self.AssetCM[:], self.RPK[:], self.EInfo[:], self.Proof[:], ) copy(ret[:], hash) return ret } type In_C struct { Anchor c_type.Uint256 Nil c_type.Uint256 AssetCM c_type.Uint256 ZPKa c_type.Uint256 Sign c_type.Uint512 Proof c_type.Proof } func (self *In_C) Tx1_Hash() (ret c_type.Uint256) { hash := crypto.Keccak256( self.Anchor[:], self.Nil[:], self.AssetCM[:], self.ZPKa[:], ) copy(ret[:], hash) return ret } func (self *In_C) ToHash() (ret c_type.Uint256) { hash := crypto.Keccak256( self.Anchor[:], self.Nil[:], self.AssetCM[:], self.ZPKa[:], self.Sign[:], self.Proof[:], ) copy(ret[:], hash) return ret } ================================================ FILE: zero/txs/stx/stx_v1/ptx.go ================================================ package stx_v1 import ( "sync/atomic" "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/crypto/sha3" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-sero/zero/utils" ) type In_P struct { Root c_type.Uint256 Nil c_type.Uint256 Key *c_type.Uint256 `rlp:"nil"` NSign c_type.SignN ASign c_type.Uint512 } func (self *In_P) Tx1_Hash() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.Root[:]) d.Write(self.Nil[:]) if self.Key != nil { d.Write(self.Key[:]) } copy(ret[:], d.Sum(nil)) return ret } func (self *In_P) ToHash() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.Root[:]) d.Write(self.Nil[:]) if self.Key != nil { d.Write(self.Key[:]) } d.Write(self.NSign[:]) d.Write(self.ASign[:]) copy(ret[:], d.Sum(nil)) return ret } type In_P0 struct { Root c_type.Uint256 Nil c_type.Uint256 Trace c_type.Uint256 Key *c_type.Uint256 `rlp:"nil"` Sign c_type.SignN } func (self *In_P0) Tx1_Hash() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.Root[:]) d.Write(self.Nil[:]) d.Write(self.Trace[:]) if self.Key != nil { d.Write(self.Key[:]) } copy(ret[:], d.Sum(nil)) return ret } func (self *In_P0) ToHash() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.Root[:]) d.Write(self.Nil[:]) d.Write(self.Trace[:]) if self.Key != nil { d.Write(self.Key[:]) } d.Write(self.Sign[:]) copy(ret[:], d.Sum(nil)) return ret } type Out_P struct { PKr c_type.PKr Asset assets.Asset Memo c_type.Uint512 assetCC_Szk atomic.Value } func (self *Out_P) ToAssetCC_Szk() c_type.Uint256 { if cc, ok := self.assetCC_Szk.Load().(c_type.Uint256); ok { return cc } v, _ := c_superzk.GenAssetCC(self.Asset.ToTypeAsset().NewRef()) self.assetCC_Szk.Store(v) return v } func (self *Out_P) Clone() (ret Out_P) { utils.DeepCopy(&ret, self) return } func (this Out_P) ToRef() (ret *Out_P) { ret = &this return } func (self *Out_P) ToHash() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.PKr[:]) d.Write(self.Asset.ToHash().NewRef()[:]) d.Write(self.Memo[:]) copy(ret[:], d.Sum(nil)) return ret } ================================================ FILE: zero/txs/stx/stx_v1/zktx.go ================================================ package stx_v1 import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/crypto/sha3" ) type Tx struct { Ins_P []In_P Ins_P0 []In_P0 Ins_C []In_C Outs_C []Out_C Outs_P []Out_P } func (self *Tx) Count() (ret int) { ret += len(self.Ins_P0) ret += len(self.Ins_P) ret += len(self.Ins_C) ret += len(self.Outs_C) ret += len(self.Outs_P) return } func (self *Tx) Tx1_Hash() (ret c_type.Uint256) { d := sha3.NewKeccak256() for _, in := range self.Ins_P0 { d.Write(in.Tx1_Hash().NewRef()[:]) } for _, in := range self.Ins_P { d.Write(in.Tx1_Hash().NewRef()[:]) } for _, in := range self.Ins_C { d.Write(in.Tx1_Hash().NewRef()[:]) } for _, out := range self.Outs_C { d.Write(out.Tx1_Hash().NewRef()[:]) } for _, out := range self.Outs_P { d.Write(out.ToHash().NewRef()[:]) } copy(ret[:], d.Sum(nil)) return ret } func (self *Tx) ToHash() (ret c_type.Uint256) { d := sha3.NewKeccak256() for _, in := range self.Ins_P0 { d.Write(in.ToHash().NewRef()[:]) } for _, in := range self.Ins_P { d.Write(in.ToHash().NewRef()[:]) } for _, in := range self.Ins_C { d.Write(in.ToHash().NewRef()[:]) } for _, out := range self.Outs_C { d.Write(out.ToHash().NewRef()[:]) } for _, out := range self.Outs_P { d.Write(out.ToHash().NewRef()[:]) } copy(ret[:], d.Sum(nil)) return ret } ================================================ FILE: zero/txs/stx/typeserial.go ================================================ package stx import ( "io" "github.com/sero-cash/go-sero/zero/txs/stx/stx_v0" "github.com/sero-cash/go-sero/zero/txs/stx/stx_v1" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/core/types/vserial" "github.com/sero-cash/go-sero/rlp" "github.com/sero-cash/go-sero/zero/txs/assets" ) type ZtxVersion_0 struct { Ehash c_type.Uint256 From c_type.PKr Fee assets.Token Sign c_type.Uint512 Bcr c_type.Uint256 Bsign c_type.Uint512 Desc_Z stx_v0.Desc_Z Desc_O stx_v0.Desc_O Desc_Pkg PkgDesc_Z } type ZtxVersion_1 struct { BuyShare *BuyShareCmd `rlp:"nil"` RegistPool *RegistPoolCmd `rlp:"nil"` ClosePool *ClosePoolCmd `rlp:"nil"` Contract *ContractCmd `rlp:"nil"` } type ZtxVersion_2 struct { Version0 ZtxVersion_0 Version1 ZtxVersion_1 Tx1 stx_v1.Tx } func SetTxForVersion0(b *T, v0 *ZtxVersion_0) { b.Ehash = v0.Ehash b.From = v0.From b.Fee = v0.Fee b.Sign = v0.Sign b.Bcr = v0.Bcr b.Bsign = v0.Bsign b.Desc_Pkg = v0.Desc_Pkg b.Desc_Z = v0.Desc_Z b.Desc_O = v0.Desc_O } func SetTxForVersion1(b *T, v1 *ZtxVersion_1) { b.Desc_Cmd.BuyShare = v1.BuyShare b.Desc_Cmd.RegistPool = v1.RegistPool b.Desc_Cmd.ClosePool = v1.ClosePool b.Desc_Cmd.Contract = v1.Contract } func SetTxForVersion2(b *T, v2 *ZtxVersion_2) { SetTxForVersion0(b, &v2.Version0) SetTxForVersion1(b, &v2.Version1) b.Tx1 = v2.Tx1 } func (b *T) DecodeRLP(s *rlp.Stream) error { vs := vserial.NewVSerial() v0 := ZtxVersion_0{} v1 := ZtxVersion_1{} v2 := ZtxVersion_2{} vs.Add(&v0, vserial.VERSION_0) vs.Add(&v1, vserial.VERSION_1) vs.Add(&v2, vserial.VERSION_2) if e := s.Decode(&vs); e != nil { return e } if vs.V() <= vserial.VERSION_1 { SetTxForVersion0(b, &v0) if vs.V() >= vserial.VERSION_1 { SetTxForVersion1(b, &v1) } } else if vs.V() >= vserial.VERSION_2 { SetTxForVersion2(b, &v2) } return nil } func SetVersion0ForTx(v0 *ZtxVersion_0, b *T) { v0.Ehash = b.Ehash v0.From = b.From v0.Fee = b.Fee v0.Sign = b.Sign v0.Bcr = b.Bcr v0.Bsign = b.Bsign v0.Desc_Z = b.Desc_Z v0.Desc_O = b.Desc_O v0.Desc_Pkg = b.Desc_Pkg } func SetVersion1ForTx(v1 *ZtxVersion_1, b *T) { v1.BuyShare = b.Desc_Cmd.BuyShare v1.RegistPool = b.Desc_Cmd.RegistPool v1.ClosePool = b.Desc_Cmd.ClosePool v1.Contract = b.Desc_Cmd.Contract } func SetVersion2ForTx(v2 *ZtxVersion_2, b *T) { SetVersion0ForTx(&v2.Version0, b) SetVersion1ForTx(&v2.Version1, b) v2.Tx1 = b.Tx1 } // EncodeRLP serializes b into the Ethereum RLP block format. func (b *T) EncodeRLP(w io.Writer) error { vs := vserial.NewVSerial() if b.Tx1.Count() > 0 { v2 := ZtxVersion_2{} SetVersion2ForTx(&v2, b) vs.Add(&v2, vserial.VERSION_2) return rlp.Encode(w, &vs) } v0 := ZtxVersion_0{} SetVersion0ForTx(&v0, b) vs.Add(&v0, vserial.VERSION_0) if b.Desc_Cmd.Count() > 0 { v1 := ZtxVersion_1{} SetVersion1ForTx(&v1, b) vs.Add(&v1, vserial.VERSION_1) } return rlp.Encode(w, &vs) } ================================================ FILE: zero/txs/stx/ztx.go ================================================ // copyright 2018 The sero.cash Authors // This file is part of the go-sero library. // // The go-sero library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-sero library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-sero library. If not, see <http://www.gnu.org/licenses/>. package stx import ( "sync/atomic" "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-sero/zero/txs/stx/stx_v0" "github.com/sero-cash/go-sero/zero/txs/stx/stx_v1" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/crypto/sha3" "github.com/sero-cash/go-sero/zero/txs/assets" ) type Tx2 struct { } type T struct { Ehash c_type.Uint256 From c_type.PKr Fee assets.Token Sign c_type.Uint512 Bcr c_type.Uint256 Bsign c_type.Uint512 Desc_O stx_v0.Desc_O Desc_Z stx_v0.Desc_Z Desc_Pkg PkgDesc_Z Desc_Cmd DescCmd Tx1 stx_v1.Tx //cache hash atomic.Value feeCC_Szk atomic.Value } func (self *T) Tx0() (ret *stx_v0.Tx) { if self.Desc_O.HasContent() || self.Desc_Z.HasContent() { ret = &stx_v0.Tx{} ret.Desc_Z = self.Desc_Z ret.Desc_O = self.Desc_O return } else { return } } func (self *T) ContractAsset() *assets.Asset { if self.Desc_Cmd.Contract != nil { return &self.Desc_Cmd.Contract.Asset } else { for _, desc_o := range self.Desc_O.Outs { return &desc_o.Asset } } return nil } func (self *T) ContractAddress() *c_type.PKr { if self.Desc_Cmd.Contract != nil { return self.Desc_Cmd.Contract.To } else { for _, out := range self.Desc_O.Outs { if out.Addr != (c_type.PKr{}) { return &out.Addr } return nil } } return nil } func (self *T) IsOpContract() bool { if self.Desc_Cmd.Contract != nil { return true } else { if len(self.Desc_O.Outs) > 0 { return true } } return false } func (self *T) ToFeeCC_Szk() c_type.Uint256 { if cc, ok := self.feeCC_Szk.Load().(c_type.Uint256); ok { return cc } v, _ := c_superzk.GenAssetCC(self.Fee.ToTypeAsset().NewRef()) self.feeCC_Szk.Store(v) return v } func (self *T) ToHash() (ret c_type.Uint256) { if h, ok := self.hash.Load().(c_type.Uint256); ok { ret = h return } v := self._ToHash() self.hash.Store(v) return v } func (self *T) _ToHash() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.Ehash[:]) d.Write(self.From[:]) d.Write(self.Fee.ToHash().NewRef()[:]) d.Write(self.Desc_Z.ToHash().NewRef()[:]) d.Write(self.Desc_O.ToHash().NewRef()[:]) if self.Tx1.Count() > 0 { d.Write(self.Tx1.ToHash().NewRef()[:]) } d.Write(self.Desc_Pkg.ToHash().NewRef()[:]) d.Write(self.Sign[:]) d.Write(self.Bcr[:]) d.Write(self.Bsign[:]) if self.Desc_Cmd.Count() > 0 { d.Write(self.Desc_Cmd.ToHash().NewRef()[:]) } copy(ret[:], d.Sum(nil)) return } func (self *T) ToHash_for_gen() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.Ehash[:]) d.Write(self.From[:]) d.Write(self.Fee.ToHash().NewRef()[:]) d.Write(self.Desc_Z.ToHash_for_gen().NewRef()[:]) d.Write(self.Desc_O.ToHash_for_gen().NewRef()[:]) d.Write(self.Desc_Pkg.ToHash_for_gen().NewRef()[:]) if self.Desc_Cmd.Count() > 0 { d.Write(self.Desc_Cmd.ToHash().NewRef()[:]) } copy(ret[:], d.Sum(nil)) return } func (self *T) ToHash_for_sign() (ret c_type.Uint256) { d := sha3.NewKeccak256() d.Write(self.Ehash[:]) d.Write(self.From[:]) d.Write(self.Fee.ToHash().NewRef()[:]) d.Write(self.Desc_Z.ToHash_for_sign().NewRef()[:]) d.Write(self.Desc_O.ToHash_for_sign().NewRef()[:]) d.Write(self.Desc_Pkg.ToHash_for_sign().NewRef()[:]) if self.Desc_Cmd.Count() > 0 { d.Write(self.Desc_Cmd.ToHash().NewRef()[:]) } copy(ret[:], d.Sum(nil)) return } ================================================ FILE: zero/txs/stx/ztx_test.go ================================================ package stx import ( "bufio" "bytes" "fmt" "sync/atomic" "testing" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/utils" "github.com/sero-cash/go-sero/rlp" ) func TestLoad(t *testing.T) { h := atomic.Value{} v, ok := h.Load().(c_type.Uint256) fmt.Println(v, ok) h.Store(c_type.RandUint256()) v, ok = h.Load().(c_type.Uint256) fmt.Println(v, ok) } func TestRLP(t *testing.T) { buf := bytes.Buffer{} w := bufio.NewWriter(&buf) tx := T{} tx.Fee.Value = utils.NewU256(2) tx.Fee.Currency = utils.CurrencyToUint256("SERO") tx.Desc_Cmd.RegistPool = &RegistPoolCmd{} tx.Desc_Cmd.RegistPool.Value = utils.NewU256(3) tx.Desc_Cmd.RegistPool.FeeRate = 10 e := rlp.Encode(w, &tx) fmt.Println(e) w.Flush() dtx := T{} stream := rlp.NewStream(&buf, uint64(buf.Len())) _, size, _ := stream.Kind() fmt.Println(size) e = stream.Decode(&dtx) fmt.Println(e) fmt.Println(dtx) } func TestClose(t *testing.T) { buf := bytes.Buffer{} w := bufio.NewWriter(&buf) tx := T{} tx.Fee.Value = utils.NewU256(2) tx.Fee.Currency = utils.CurrencyToUint256("SERO") tx.Desc_Cmd.ClosePool = &ClosePoolCmd{} e := rlp.Encode(w, &tx) fmt.Println(e) w.Flush() dtx := T{} stream := rlp.NewStream(&buf, uint64(buf.Len())) _, size, _ := stream.Kind() fmt.Println(size) e = stream.Decode(&dtx) fmt.Println(e) fmt.Println(dtx) } ================================================ FILE: zero/txs/test/txs.go ================================================ package test ================================================ FILE: zero/txs/test/txs_test.go ================================================ //// copyright 2018 The sero.cash Authors //// This file is part of the go-sero library. //// //// The go-sero library is free software: you can redistribute it and/or modify //// it under the terms of the GNU Lesser General Public License as published by //// the Free Software Foundation, either version 3 of the License, or //// (at your option) any later version. //// //// The go-sero library is distributed in the hope that it will be useful, //// but WITHOUT ANY WARRANTY; without even the implied warranty of //// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //// GNU Lesser General Public License for more details. //// //// You should have received a copy of the GNU Lesser General Public License //// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>. // package test // //import ( // "fmt" // "testing" // // "github.com/sero-cash/go-sero/zero/txs/verify" // // "github.com/sero-cash/go-sero/zero/wallet/lstate/generate" // // "github.com/sero-cash/go-sero/zero/txs/zstate/txstate" // // "github.com/sero-cash/go-sero/common" // "github.com/sero-cash/go-sero/zero/txs/zstate" // // "github.com/sero-cash/go-sero/zero/txs/tx" // // "github.com/sero-cash/go-czero-import/c_czero" // "github.com/sero-cash/go-czero-import/c_type" // "github.com/sero-cash/go-czero-import/superzk" // // "github.com/sero-cash/go-sero/zero/txs/assets" // // "github.com/sero-cash/go-sero/zero/txs/stx" // "github.com/sero-cash/go-sero/zero/utils" // // "github.com/sero-cash/go-sero/core/state" // // "github.com/sero-cash/go-sero/serodb" //) // //type Blocks struct { // ca state.Database // sd *state.StateDB // st *zstate.ZState // st0 *txstate.State // st1 *state1.State1_storage //} // //var g_blocks Blocks // //func NewBlock() { // if g_blocks.ca == nil { // db := serodb.NewMemDatabase() // g_blocks.ca = state.NewDatabase(db) // g_blocks.sd, _ = state.NewGenesis(common.Hash{}, g_blocks.ca) // g_blocks.st = g_blocks.sd.GetZState() // g_blocks.st0 = &g_blocks.st.State // } else { // g_blocks.st0.Block = txstate.StateBlock{} // } //} // //func EndBlock() { // if g_blocks.st1 == nil { // st1 := state1.LoadState(g_blocks.st, "") // g_blocks.st1 = &st1 // } else { // g_blocks.st1.State = g_blocks.st // } // g_blocks.st1.UpdateWitness(keys.Seeds2Tks(seeds)) // NewBlock() //} // //type user struct { // i int // seed c_type.Uint256 // addr c_type.Uint512 //} // //var seeds = []c_type.Uint256{} // //func newUser(i int) (ret user) { // fmt.Printf("\n\n===========new user(%v)============\n", i) // ret = user{} // ret.i = i // ret.seed = c_type.Uint256{byte(i)} // ret.addr = keys.Seed2Addr(&ret.seed) // seeds = append(seeds, ret.seed) // fmt.Printf("\nseed: ") // ret.seed.LogOut() // fmt.Printf("\naddr: ") // ret.addr.LogOut() // return //} // //func (self *user) getAR() (pkr c_type.PKr) { // pkr = superzk.Pk2PKr(&self.addr, nil) // fmt.Printf("\nuser(%v):get pkr: ", self.i) // pkr.LogOut() // return //} // //func (self *user) addOut(v int) { // out := stx.Out_O{} // out.Addr = self.getAR() // out.Asset = assets.NewAsset( // &assets.Token{ // utils.CurrencyToUint256("SERO"), // utils.NewU256(uint64(v)), // }, // nil, // ) // g_blocks.st.addOut_O(&out) // g_blocks.st.Update() // EndBlock() //} // //func (self *user) addTkt(v int) { // out := stx.Out_O{} // out.Addr = self.getAR() // out.Asset = assets.Asset{ // &assets.Token{ // utils.CurrencyToUint256("SERO"), // utils.NewU256(uint64(v)), // }, // &assets.Ticket{ // utils.CurrencyToUint256("SERO_TICKET"), // cpt.Random(), // }, // } // g_blocks.st.addOut_O(&out) // g_blocks.st.Update() // EndBlock() //} // //func (self *user) GetOuts() (outs []*state1.OutState) { // if os, e := g_blocks.st1.GetOuts(keys.Seed2Tk(&self.seed).NewRef()); e != nil { // panic(e) // return // } else { // outs = os // return // } //} // //func (self *user) GetPkgs(is_from bool) (ret []*state1.Pkg) { // ret = g_blocks.st1.GetPkgs(keys.Seed2Tk(&self.seed).NewRef(), is_from) // return //} // //func (self *user) Gen(seed *c_type.Uint256, t *tx.T) (s stx.T, e error) { // return generate.Gen_lstate(g_blocks.st1, seed, t) //} // //func (self *user) Verify(t *stx.T) (e error) { // return verify.Verify_state1(t, g_blocks.st1.State) //} // //func (self *user) Logout() (ret uint64) { // fmt.Printf("\n\n===========user(%v)============\n", self.i) // outs := self.GetOuts() // for _, out := range outs { // if out.Out_O.Asset.Tkn != nil { // fmt.Printf("TKN: (%v:%v)---%v-----%v\n", out.Root[1], out.OutIndex, out.Out_O.Asset.Tkn.Currency[0], out.Out_O.Asset.Tkn.Value.ToIntRef().Int64()) // ret += out.Out_O.Asset.Tkn.Value.ToIntRef().Uint64() // } // if out.Out_O.Asset.Tkt != nil { // fmt.Printf("TKT: (%v:%v)---%v-----%v\n", out.Root[1], out.OutIndex, out.Out_O.Asset.Tkt.Category[0], out.Out_O.Asset.Tkt.Value) // } // } // fmt.Printf("===========user(%v)============\n\n", self.i) // return //} // //func (self *user) Close(id *c_type.Uint256, v int, key *c_type.Uint256) { // fmt.Printf("user(%v) close pkg %v\n", self.i, id) // t := tx.T{} // t.Fee = assets.Token{ // utils.CurrencyToUint256("SERO"), // utils.NewU256(uint64(0)), // } // t.PkgClose = &tx.PkgClose{} // t.PkgClose.Key = *key // t.PkgClose.Id = *id // // out1 := tx.Out{} // out1.Asset = assets.Asset{ // &assets.Token{ // utils.CurrencyToUint256("SERO"), // utils.NewU256(uint64(v)), // }, // nil, // } // out1.IsZ = true // out1.Addr = self.getAR() // t.Outs = append(t.Outs, out1) // // s, e := self.Gen(&self.seed, &t) // if e != nil { // fmt.Printf("user(%v) send gen error: %v", self.i, e) // } // // if e := self.Verify(&s); e != nil { // fmt.Printf("user(%v) send verify error: %v", self.i, e) // } // // g_blocks.st.AddStx(&s) // g_blocks.st.Update() // EndBlock() // return //} // //func (self *user) Package(v int, fee int, u user) (ret c_type.PKr) { // fmt.Printf("user(%v) send %v:%v to user(%v)\n", self.i, v, fee, u.i) // outs := self.GetOuts() // in := tx.In{} // in.Root = outs[0].Root // out0 := tx.PkgCreate{} // out0.PKr = u.getAR() // ret = out0.PKr // out0.Pkg.Asset = assets.Asset{ // &assets.Token{ // utils.CurrencyToUint256("SERO"), // utils.NewU256(uint64(v)), // }, // nil, // } // // out1 := tx.Out{} // out1.Addr = self.getAR() // out1.Asset = outs[0].Out_O.Asset.Clone() // out1.Asset.Tkn.Value.SubU(utils.NewU256(uint64(v)).ToRef()) // out1.Asset.Tkn.Value.SubU(utils.NewU256(uint64(fee)).ToRef()) // // out1.IsZ = true // // t := tx.T{} // t.Fee = assets.Token{ // utils.CurrencyToUint256("SERO"), // utils.NewU256(uint64(fee)), // } // t.Ins = append(t.Ins, in) // t.Outs = append(t.Outs, out1) // t.PkgCreate = &out0 // // s, e := self.Gen(&self.seed, &t) // if e != nil { // fmt.Printf("user(%v) send gen error: %v", self.i, e) // } // // if e := self.Verify(&s); e != nil { // fmt.Printf("user(%v) send verify error: %v", self.i, e) // } // // g_blocks.st.AddStx(&s) // g_blocks.st.Update() // EndBlock() // return //} // //func (self *user) Send(v int, fee int, u user, z bool) { // fmt.Printf("user(%v) send %v:%v to user(%v)\n", self.i, v, fee, u.i) // outs := self.GetOuts() // in := tx.In{} // in.Root = outs[0].Root // out0 := tx.Out{} // out0.Addr = u.getAR() // out0.Asset = assets.Asset{ // &assets.Token{ // utils.CurrencyToUint256("SERO"), // utils.NewU256(uint64(v)), // }, // nil, // } // out0.IsZ = z // // out1 := tx.Out{} // out1.Addr = self.getAR() // out1.Asset = outs[0].Out_O.Asset.Clone() // out1.Asset.Tkn.Value.SubU(utils.NewU256(uint64(v)).ToRef()) // out1.Asset.Tkn.Value.SubU(utils.NewU256(uint64(fee)).ToRef()) // // out1.IsZ = z // // t := tx.T{} // t.Fee = assets.Token{ // utils.CurrencyToUint256("SERO"), // utils.NewU256(uint64(fee)), // } // t.Ins = append(t.Ins, in) // t.Outs = append(t.Outs, out0) // t.Outs = append(t.Outs, out1) // // s, e := self.Gen(&self.seed, &t) // if e != nil { // fmt.Printf("user(%v) send gen error: %v", self.i, e) // } // // if e := self.Verify(&s); e != nil { // fmt.Printf("user(%v) send verify error: %v", self.i, e) // } // // g_blocks.st.AddStx(&s) // g_blocks.st.Update() // EndBlock() //} // //type ArrayObj struct { // p0 int // p1 uint64 //} // //func TestArrayObj(t *testing.T) { // a := [6]ArrayObj{} // a[1].p0 = 0 // fmt.Printf("%v\n", a) //} // //func TestMain(m *testing.M) { // cpt.ZeroInit("", c_czero.NET_Dev) // NewBlock() // m.Run() //} // //func TestTx(t *testing.T) { // user_m := newUser(1) // user_a := newUser(2) // user_m.addOut(100) // user_m.Send(50, 10, user_a, true) // if user_m.Logout() != 40 { // t.Fail() // } //} // //func TestPkg(t *testing.T) { // user_m := newUser(1) // user_a := newUser(2) // user_m.addOut(100) // user_m.Package(50, 10, user_a) // if user_m.Logout() != 40 { // t.FailNow() // } // user_a.Close(&c_type.Uint256{}, 50, &g_blocks.st1.GetPkgs(nil, true)[0].Key) // if user_a.Logout() != 50 { // t.FailNow() // } //} // //func TestTxs(t *testing.T) { // user_m := newUser(1) // user_a := newUser(2) // user_b := newUser(3) // user_c := newUser(4) // // user_m.addTkt(100) // user_m.addOut(100) // user_m.addOut(100) // user_m.addOut(100) // // if user_m.Logout() != 400 { // t.FailNow() // } // // pkg_pkr := user_m.Package(50, 10, user_a) // if g_blocks.st.Pkgs.GetPkg(&c_type.Uint256{}) == nil { // t.FailNow() // } // // var key c_type.Uint256 // if pkgs := user_m.GetPkgs(true); len(pkgs) == 0 { // t.FailNow() // } else { // key = pkgs[0].Key // } // if pkgs := user_a.GetPkgs(false); len(pkgs) == 0 { // t.FailNow() // } // // g_blocks.st.Pkgs.Close(&c_type.Uint256{}, &pkg_pkr, &key) // g_blocks.st.Update() // EndBlock() // // if g_blocks.st.Pkgs.GetPkg(&c_type.Uint256{}) != nil { // t.FailNow() // } // if pkgs := user_m.GetPkgs(true); len(pkgs) != 0 { // t.FailNow() // } // if pkgs := user_a.GetPkgs(false); len(pkgs) != 0 { // t.FailNow() // } // // EndBlock() // // user_a.addOut(50) // // if user_m.Logout() != 340 { // t.FailNow() // } // if user_a.Logout() != 50 { // t.FailNow() // } // // user_m.addOut(100) // // if user_m.Logout() != 440 { // t.FailNow() // } // if user_a.Logout() != 50 { // t.FailNow() // } // // user_a.Send(20, 5, user_b, true) // // if user_a.Logout() != 25 { // t.FailNow() // } // if user_b.Logout() != 20 { // t.FailNow() // } // // user_b.Send(10, 5, user_c, true) // // if user_b.Logout() != 5 { // t.FailNow() // } // if user_c.Logout() != 10 { // t.FailNow() // } //} // //func TestStrTree(t *testing.T) { // // outState := txstate.NewMerkleTree(g_blocks.st.Tri) // // cm1 := c_type.Uint256{1} // outState.AppendLeaf(cm1) // // cm2 := c_type.Uint256{2} // outState.AppendLeaf(cm2) // // cm3 := c_type.Uint256{3} // outState.AppendLeaf(cm3) // // cm4 := c_type.Uint256{4} // rt4 := outState.AppendLeaf(cm4) // // pos, path, anchor := outState.GetPaths(cm3) // rt := txstate.CalcRoot(&cm3, pos, &path) // // if rt != rt4 { // t.FailNow() // } // if rt != anchor { // t.FailNow() // } // // fmt.Print(pos, path) //} ================================================ FILE: zero/txs/tx/tx.go ================================================ // copyright 2018 The sero.cash Authors // This file is part of the go-sero library. // // The go-sero library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-sero library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-sero library. If not, see <http://www.gnu.org/licenses/>. package tx import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-sero/zero/txs/pkg" "github.com/sero-cash/go-sero/zero/utils" ) type In struct { Root c_type.Uint256 IsO bool } type Out struct { Addr c_type.PKr Asset assets.Asset Memo c_type.Uint512 IsZ bool } type PkgCreate struct { Id c_type.Uint256 PKr c_type.PKr Pkg pkg.Pkg_O } type PkgClose struct { Id c_type.Uint256 Key c_type.Uint256 } type PkgTransfer struct { Id c_type.Uint256 PKr c_type.PKr } type T struct { FromRnd *c_type.Uint256 Ehash c_type.Uint256 Fee assets.Token Ins []In Outs []Out PkgCreate *PkgCreate PkgTransfer *PkgTransfer PkgClose *PkgClose } func (self *T) TokenCost() (ret map[c_type.Uint256]utils.U256) { ret = make(map[c_type.Uint256]utils.U256) ret[self.Fee.Currency] = self.Fee.Value if len(self.Outs) > 0 { for _, out := range self.Outs { if out.Asset.Tkn != nil { if cost, ok := ret[out.Asset.Tkn.Currency]; ok { cost.AddU(&out.Asset.Tkn.Value) ret[out.Asset.Tkn.Currency] = cost } else { ret[out.Asset.Tkn.Currency] = out.Asset.Tkn.Value } } } } if self.PkgCreate != nil { asset := self.PkgCreate.Pkg.Asset if asset.Tkn != nil { if cost, ok := ret[asset.Tkn.Currency]; ok { cost.AddU(&asset.Tkn.Value) ret[asset.Tkn.Currency] = cost } else { ret[asset.Tkn.Currency] = asset.Tkn.Value } } } return } func (self *T) TikectCost() (ret map[c_type.Uint256][]c_type.Uint256) { ret = make(map[c_type.Uint256][]c_type.Uint256) if len(self.Outs) > 0 { for _, out := range self.Outs { if out.Asset.Tkt != nil { if tkts, ok := ret[out.Asset.Tkt.Category]; ok { tkts = append(tkts, out.Asset.Tkt.Value) ret[out.Asset.Tkt.Category] = tkts } else { ret[out.Asset.Tkt.Category] = []c_type.Uint256{out.Asset.Tkt.Value} } } } } if self.PkgCreate != nil { asset := self.PkgCreate.Pkg.Asset if asset.Tkt != nil { if tkts, ok := ret[asset.Tkt.Category]; ok { tkts = append(tkts, asset.Tkt.Value) ret[asset.Tkt.Category] = tkts } else { ret[asset.Tkt.Category] = []c_type.Uint256{asset.Tkt.Value} } } } return } ================================================ FILE: zero/txs/tx/tx_test.go ================================================ package tx import ( "fmt" "testing" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/utils" ) func TestT_TokenCost(t *testing.T) { seroCy := utils.CurrencyToUint256("SERO") fmt.Printf("%t\n", seroCy) cy := utils.CurrencyToUint256("d") ret := make(map[c_type.Uint256]utils.U256) ret[seroCy] = utils.NewU256(24) if cost, ok := ret[seroCy]; ok { add := utils.NewU256(12) cost.AddU(&add) ret[seroCy] = cost } else { cost := utils.NewU256(48) ret[cy] = cost } fmt.Printf("%t", ret) } ================================================ FILE: zero/txs/zstate/merkle/merkle.go ================================================ package merkle import ( "fmt" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/txs/zstate/tri" "github.com/sero-cash/go-sero/crypto" "github.com/sero-cash/go-sero/rlp" ) type CombinFunc func(*c_type.Uint256, *c_type.Uint256) (out c_type.Uint256) type Param struct { emptyRoots [c_type.DEPTH + 1]c_type.Uint256 obj c_type.PKr is_load bool indexLeafKey c_type.Uint256 indexTreeKey c_type.Uint256 cap uint64 leafcap uint64 startIndex uint64 combine CombinFunc } func NewParam(obj *c_type.PKr, combine CombinFunc) (ret Param) { ret.obj = *obj ret.indexLeafKey = c_type.Uint256(crypto.Keccak256Hash([]byte("outTreeIndex_Leaf"))) ret.indexTreeKey = c_type.Uint256(crypto.Keccak256Hash([]byte("outTreeIndex_Self"))) ret.cap = toPow2(DEPTH + 1) ret.leafcap = toPow2(DEPTH) ret.startIndex = toPow2(DEPTH) ret.combine = combine return } func (self *Param) CalcRoot(value *c_type.Uint256, pos uint64, paths *[DEPTH]c_type.Uint256) (ret c_type.Uint256) { ret = *value for _, path := range paths { if pos%2 == 0 { ret = self.combine(&ret, &path) } else { ret = self.combine(&path, &ret) } pos >>= 1 } return } func (self *Param) createEmpty() (ret [c_type.DEPTH + 1]c_type.Uint256) { ret[0] = c_type.Empty_Uint256 for i := 1; i <= c_type.DEPTH; i++ { ret[i] = self.combine(&ret[i-1], &ret[i-1]) } return } func (self *Param) EmptyRoots() []c_type.Uint256 { if !self.is_load { self.is_load = true self.emptyRoots = self.createEmpty() } return self.emptyRoots[:] } type Leaf struct { leafIndex uint64 treeIndex uint64 value c_type.Uint256 } type MerkleTree struct { param *Param db tri.Tri } func (self *Param) NewMerkleTree(db tri.Tri) (ret MerkleTree) { ret.db = db ret.param = self return } func (self *MerkleTree) AppendLeaf(value c_type.Uint256) c_type.Uint256 { leafIndex := self.nextLeafIndex() treeIndex := self.geCurrentTreeIndex() self.db.SetState(&self.param.obj, leafKey(value).NewRef(), c_type.Uint64_To_Uint256(leafIndex).NewRef()) self.db.SetState(&self.param.obj, treeKey(value).NewRef(), c_type.Uint64_To_Uint256(treeIndex).NewRef()) self.db.SetState(&self.param.obj, indexPathKey(leafIndex, treeIndex).NewRef(), &value) current_value := value depth := toDepth(leafIndex) for leafIndex != 1 { brotherIndex := brother(leafIndex) var brotherValue c_type.Uint256 if brotherIndex > leafIndex { brotherValue = self.param.EmptyRoots()[depth] } else { brotherValue = self.db.GetState(&self.param.obj, indexPathKey(brotherIndex, treeIndex).NewRef()) if brotherValue == c_type.Empty_Uint256 { panic(fmt.Sprintf("brother value is empty")) } } if leafIndex%2 == 0 { current_value = self.param.combine(¤t_value, &brotherValue) } else { current_value = self.param.combine(&brotherValue, ¤t_value) } leafIndex = parent(leafIndex) depth++ self.db.SetState(&self.param.obj, indexPathKey(leafIndex, treeIndex).NewRef(), ¤t_value) } return current_value } func (self *MerkleTree) GetLeafSize() (ret uint64) { leafIndex := self.getCurrentLeafIndex() - self.param.startIndex tree_count := self.geCurrentTreeIndex() return tree_count*self.param.leafcap + leafIndex } func (self *MerkleTree) GetPaths(value c_type.Uint256) (pos uint64, paths [DEPTH]c_type.Uint256, anchor c_type.Uint256) { leafIndex := c_type.Uint256_To_Uint64(self.db.GetState(&self.param.obj, leafKey(value).NewRef()).NewRef()) if leafIndex == 0 { panic(fmt.Errorf("leaf index can not be 0")) } treeIndex := c_type.Uint256_To_Uint64(self.db.GetState(&self.param.obj, treeKey(value).NewRef()).NewRef()) currentTreeIndex := self.geCurrentTreeIndex() var cur_leafIndex uint64 if currentTreeIndex == treeIndex { cur_leafIndex = self.getCurrentLeafIndex() - 1 } else { cur_leafIndex = self.param.cap - 1 } anchor = self.db.GetState(&self.param.obj, indexPathKey(1, treeIndex).NewRef()) pos = leafIndex - self.param.startIndex depth := toDepth(leafIndex) for leafIndex != 1 { brotherIndex := brother(leafIndex) var brotherValue c_type.Uint256 if brotherIndex > cur_leafIndex { brotherValue = self.param.EmptyRoots()[depth] } else { brotherValue = self.db.GetState(&self.param.obj, indexPathKey(brotherIndex, treeIndex).NewRef()) if brotherValue == c_type.Empty_Uint256 { panic(fmt.Sprintf("brother value is empty")) } } paths[depth] = brotherValue leafIndex = parent(leafIndex) cur_leafIndex = parent(cur_leafIndex) depth++ } return } func (self *MerkleTree) nextLeafIndex() uint64 { leafIndex := self.getCurrentLeafIndex() if leafIndex == self.param.cap { leafIndex = self.param.startIndex treeIndex := self.geCurrentTreeIndex() treeIndex = treeIndex + 1 self.db.SetState(&self.param.obj, &self.param.indexTreeKey, c_type.Uint64_To_Uint256(treeIndex).NewRef()) } self.db.SetState(&self.param.obj, &self.param.indexLeafKey, c_type.Uint64_To_Uint256(leafIndex+1).NewRef()) return leafIndex } func (self *MerkleTree) getCurrentLeafIndex() uint64 { value := self.db.GetState(&self.param.obj, &self.param.indexLeafKey) index := c_type.Uint256_To_Uint64(&value) if index == 0 { index = self.param.startIndex } return index } func (self *MerkleTree) geCurrentTreeIndex() uint64 { value := self.db.GetState(&self.param.obj, &self.param.indexTreeKey) index := c_type.Uint256_To_Uint64(&value) return index } func parent(index uint64) uint64 { return index / 2 } func brother(index uint64) uint64 { if index%2 == 0 { return index + 1 } else { return index - 1 } } func leafKey(value c_type.Uint256) c_type.Uint256 { return c_type.Uint256(crypto.Keccak256Hash(append([]byte("LEAF_"), value[:]...))) } func treeKey(value c_type.Uint256) c_type.Uint256 { return c_type.Uint256(crypto.Keccak256Hash(append([]byte("TREE_"), value[:]...))) } func indexPathKey(leafIndex, treeIndex uint64) c_type.Uint256 { bytes, _ := rlp.EncodeToBytes([]interface{}{leafIndex, treeIndex, []byte("PATH")}) return c_type.Uint256(crypto.Keccak256Hash(bytes)) } ================================================ FILE: zero/txs/zstate/merkle/merkle_test.go ================================================ package merkle import ( "fmt" "math/big" "testing" "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-czero-import/superzk" "github.com/sero-cash/go-sero/crypto" "github.com/sero-cash/go-sero/serodb" "github.com/sero-cash/go-sero/zero/consensus" ) type TreeState struct { db *consensus.FakeTri } func (self *TreeState) TryGet(key []byte) ([]byte, error) { return nil, nil } func (self *TreeState) TryUpdate(key, value []byte) error { return nil } func (self *TreeState) SetState(obj *c_type.PKr, key *c_type.Uint256, value *c_type.Uint256) { self.db.TryUpdate(key[:], value[:]) } func (self *TreeState) GetState(obj *c_type.PKr, key *c_type.Uint256) (ret c_type.Uint256) { r, e := self.db.TryGet(key[:]) if e == nil { copy(ret[:], r) } return } func (self *TreeState) GlobalGetter() serodb.Getter { return nil } var Address = c_type.PKr{} var MerkleParam = NewParam(&Address, c_superzk.Combine) func TestOutTree(t *testing.T) { // Create an empty state database superzk.ZeroInit("", 0) ft := consensus.NewFakeTri() outState := MerkleParam.NewMerkleTree(&TreeState{db: &ft}) for i := 1; i <= 100; i++ { value := crypto.Keccak256Hash(big.NewInt(int64(i)).Bytes()).HashToUint256() outState.AppendLeaf(*value) /*for i := 1; i <= 15; i++ { key := indexPathKey(uint64(i), uint64(0)) value := outState.db.GetState(&key) fmt.Println(i, ":", common.Bytes2Hex(value[:])) }*/ /*if i == 3 { current := crypto.Keccak256Hash(big.NewInt(int64(1)).Bytes()).HashToUint256() index, getPaths, anchor := outState.GetPaths(*current) ret := CalcRoot(current, index, &getPaths) if anchor != ret { fmt.Println(i, 1) t.FailNow() } }*/ for j := 1; j <= i; j++ { current := crypto.Keccak256Hash(big.NewInt(int64(j)).Bytes()).HashToUint256() index, getPaths, anchor := outState.GetPaths(*current) ret := MerkleParam.CalcRoot(current, index, &getPaths) if anchor != ret { fmt.Println(i, j) t.FailNow() } } } } ================================================ FILE: zero/txs/zstate/merkle/utils.go ================================================ package merkle import ( "github.com/sero-cash/go-czero-import/c_type" ) const DEPTH = c_type.DEPTH func toDepth(index uint64) (ret uint8) { ret = 0 for index != 0 { index >>= 1 ret++ } return DEPTH + 1 - ret } func toPow2(index int) (ret uint64) { ret = uint64(1) << uint64(index) return } ================================================ FILE: zero/txs/zstate/pkgstate/data/data.go ================================================ package data import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/localdb" "github.com/sero-cash/go-sero/zero/utils" ) type Data struct { Id2Hash utils.H2Hash IdDirtys utils.Dirtys Hash2Pkg map[c_type.Uint256]localdb.ZPkg } func NewData() (ret *Data) { return &Data{ Id2Hash: utils.NewH2Hash("$ZState0$Pkg$Id2Hash$"), } } func (self *Data) Clear() { self.Id2Hash.Clear() self.IdDirtys.Clear() self.Hash2Pkg = make(map[c_type.Uint256]localdb.ZPkg) } func (self *Data) Add(pkg *localdb.ZPkg) { hash := pkg.ToHash() self.Hash2Pkg[hash] = *pkg self.Id2Hash.Add(&pkg.Pack.Id, &hash) self.IdDirtys.Append(&pkg.Pack.Id) } func (self *Data) GetHashes() (ret []c_type.Uint256) { for _, id := range self.IdDirtys.List() { hash := self.Id2Hash.Get(&id) ret = append(ret, hash) } return } ================================================ FILE: zero/txs/zstate/pkgstate/data/data_state.go ================================================ package data import ( "errors" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/serodb" "github.com/sero-cash/go-sero/zero/localdb" "github.com/sero-cash/go-sero/zero/txs/zstate/tri" ) func (self *Data) SaveState(tr tri.Tri) { G2pkgs_dirty := self.IdDirtys.List() for _, k := range G2pkgs_dirty { self.Id2Hash.SaveByTri(tr, &k) } } func (self *Data) RecordState(putter serodb.Putter, hash *c_type.Uint256) { if pkg, ok := self.Hash2Pkg[*hash]; ok { localdb.PutPkg(putter, hash, &pkg) } else { panic(errors.New("PKG record index error: hash2pkg")) } } func (self *Data) GetPkgById(tr tri.Tri, id *c_type.Uint256) (pg *localdb.ZPkg) { if hash := self.Id2Hash.GetByTri(tr, id); hash != c_type.Empty_Uint256 { pg = self.GetPkgByHash(tr, &hash) return } else { return } } func (self *Data) GetPkgByHash(tr tri.Tri, hash *c_type.Uint256) (pg *localdb.ZPkg) { if p, ok := self.Hash2Pkg[*hash]; ok { pg = &p return } else { if p := localdb.GetPkg(tr.GlobalGetter(), hash); p != nil { self.Hash2Pkg[*hash] = *p pg = p return } else { return } } } ================================================ FILE: zero/txs/zstate/pkgstate/state.go ================================================ package pkgstate import ( "fmt" "sync" "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-sero/serodb" "github.com/sero-cash/go-sero/common/hexutil" "github.com/sero-cash/go-sero/zero/localdb" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/txs/pkg" "github.com/sero-cash/go-sero/zero/txs/stx" "github.com/sero-cash/go-sero/zero/txs/zstate/pkgstate/data" "github.com/sero-cash/go-sero/zero/utils" "github.com/sero-cash/go-sero/zero/txs/zstate/tri" ) type PkgState struct { tri tri.Tri rw *sync.RWMutex num uint64 data data.Data snapshots utils.Snapshots } func NewPkgState(tri tri.Tri, num uint64) (state PkgState) { state = PkgState{tri: tri, num: num} state.data = *data.NewData() state.rw = new(sync.RWMutex) state.data.Clear() state.load() return } func (self *PkgState) Snapshot(revid int) { self.snapshots.Push(revid, &self.data) } func (self *PkgState) Revert(revid int) { self.data.Clear() self.data = *self.snapshots.Revert(revid).(*data.Data) return } func (self *PkgState) load() { } func (self *PkgState) Update() { self.data.SaveState(self.tri) return } func (self *PkgState) RecordState(putter serodb.Putter, hash *c_type.Uint256) { self.data.RecordState(putter, hash) } func (self *PkgState) GetPkgByHash(hash *c_type.Uint256) (ret *localdb.ZPkg) { ret = self.data.GetPkgByHash(self.tri, hash) return } func (self *PkgState) GetPkgById(id *c_type.Uint256) (ret *localdb.ZPkg) { ret = self.data.GetPkgById(self.tri, id) return } func (state *PkgState) GetPkgHashes() (ret []c_type.Uint256) { return state.data.GetHashes() } func (self *PkgState) Force_del(hash *c_type.Uint256, close *stx.PkgClose) (e error) { self.rw.Lock() defer self.rw.Unlock() if pg := self.data.GetPkgById(self.tri, &close.Id); pg == nil || pg.Closed { e = fmt.Errorf("Close Pkg is nil: %v", hexutil.Encode(close.Id[:])) return } else { if c_superzk.VerifyPKr_X(hash, &close.Sign, &pg.Pack.PKr) { pg.Closed = true self.data.Add(pg) } else { e = fmt.Errorf("Close Pkg signed error: %v", hexutil.Encode(close.Id[:])) return } return } } func (self *PkgState) Force_add(from *c_type.PKr, pack *stx.PkgCreate) (e error) { self.rw.Lock() defer self.rw.Unlock() if pg := self.data.GetPkgById(self.tri, &pack.Id); pg != nil { e = fmt.Errorf("Create Pkg is not nil: %v", hexutil.Encode(pack.Id[:])) return } else { zpkg := localdb.ZPkg{ self.num, *from, pack.Clone(), false, } self.data.Add(&zpkg) return } } func (self *PkgState) Force_transfer(hash *c_type.Uint256, trans *stx.PkgTransfer) (e error) { self.rw.Lock() defer self.rw.Unlock() if pg := self.data.GetPkgById(self.tri, &trans.Id); pg == nil || pg.Closed { e = fmt.Errorf("Transfer Pkg is nil: %v", hexutil.Encode(trans.Id[:])) return } else { if c_superzk.VerifyPKr_X(hash, &trans.Sign, &pg.Pack.PKr) { pg.Pack.PKr = trans.PKr self.data.Add(pg) } else { e = fmt.Errorf("Transfer Pkg signed error: %v", hexutil.Encode(trans.Id[:])) return } return } } type OPkg struct { Z localdb.ZPkg O pkg.Pkg_O } func (self *PkgState) Close(id *c_type.Uint256, pkr *c_type.PKr, key *c_type.Uint256) (ret OPkg, e error) { self.rw.Lock() defer self.rw.Unlock() if pg := self.data.GetPkgById(self.tri, id); pg == nil || pg.Closed { e = fmt.Errorf("Close Pkg is nil: %v", hexutil.Encode(id[:])) return } else { if pg.Pack.PKr != *pkr { e = fmt.Errorf("Close Pkg Owner Check Failed: %v", hexutil.Encode(id[:])) return } else { if ret.O, e = pkg.DePkg(key, &pg.Pack.Pkg); e != nil { return } else { ret.Z = *pg if e = pkg.ConfirmPkg(&ret.O, &ret.Z.Pack.Pkg); e != nil { return } else { pg.Closed = true self.data.Add(pg) return } } } } } func (self *PkgState) Transfer(id *c_type.Uint256, pkr *c_type.PKr, to *c_type.PKr) (e error) { self.rw.Lock() defer self.rw.Unlock() if pg := self.data.GetPkgById(self.tri, id); pg == nil || pg.Closed { e = fmt.Errorf("Transfer Pkg is nil: %v", hexutil.Encode(id[:])) return } else { if pg.Pack.PKr != *pkr { e = fmt.Errorf("Transfer Pkg Owner Check Failed: %v", hexutil.Encode(id[:])) return } else { pg.Pack.PKr = *to self.data.Add(pg) return } } } ================================================ FILE: zero/txs/zstate/tri/tri.go ================================================ // copyright 2018 The sero.cash Authors // This file is part of the go-sero library. // // The go-sero library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-sero library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-sero library. If not, see <http://www.gnu.org/licenses/>. package tri import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/serodb" ) type Tri interface { TryGet(key []byte) ([]byte, error) TryUpdate(key, value []byte) error SetState(obj *c_type.PKr, key *c_type.Uint256, value *c_type.Uint256) GetState(obj *c_type.PKr, key *c_type.Uint256) (ret c_type.Uint256) GlobalGetter() serodb.Getter } func slice2Uint256(s []byte) (r c_type.Uint256) { copy(r[:], s) return } type KEY_NAME string func (name KEY_NAME) Bytes() []byte { return []byte(name) } func TryGetUint256s(tri Tri, key []byte, cb func([]byte, *c_type.Uint256)) (hashes []c_type.Uint256) { if v, err := tri.TryGet(key); err != nil { panic(err) return } else { if len(v) > 0 { for i := 0; i < len(v); i += 32 { b := slice2Uint256(v[i : i+32]) hashes = append(hashes, b) if cb != nil { if o, err := tri.TryGet(b[:]); err != nil { panic(err) return } else { if len(o) > 0 { cb(o, &b) } } } else { } } } } return } func TryUpdateUint256s(tri Tri, key []byte, hashes []c_type.Uint256) { outs := []byte{} for _, v := range hashes { outs = append(outs, v[:]...) } if len(outs) > 0 { if err := tri.TryUpdate(key, outs); err != nil { panic(err) return } } return } type unserial interface { Unserial(v []byte) error } func GetObj(tri Tri, key []byte, obj unserial) { if v, err := tri.TryGet(key); err != nil { panic(err) return } else { if err := obj.Unserial(v); err != nil { panic(err) return } else { } } return } /*func GetGlobalObj(tri Tri, key []byte, obj unserial) { if v, err := tri.TryGlobalGet(key); err != nil { if err := obj.Unserial(nil); err != nil { panic(err) return } else { } } else { if err := obj.Unserial(v); err != nil { panic(err) return } else { } } return }*/ func GetDBObj(db serodb.Getter, key []byte, obj unserial) { if v, err := db.Get(key); err != nil { if err := obj.Unserial(nil); err != nil { panic(err) return } else { } } else { if err := obj.Unserial(v); err != nil { panic(err) return } else { } } return } type serial interface { Serial() ([]byte, error) } func UpdateObj(tri Tri, key []byte, obj serial) { if s, err := obj.Serial(); err != nil { panic(err) return } else { if err := tri.TryUpdate(key, s); err != nil { panic(err) return } else { } } return } /*func UpdateGlobalObj(tri Tri, key []byte, obj serial) { if s, err := obj.Serial(); err != nil { panic(err) return } else { if err := tri.TryGlobalPut(key, s); err != nil { panic(err) return } else { } } return }*/ func UpdateDBObj(database serodb.Putter, key []byte, obj serial) { if s, err := obj.Serial(); err != nil { panic(err) return } else { if err := database.Put(key, s); err != nil { panic(err) return } else { } } return } ================================================ FILE: zero/txs/zstate/txstate/data/data.go ================================================ package data import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/localdb" ) type Data struct { Num uint64 Cur Current Block StateBlock G2outs map[c_type.Uint256]*localdb.OutState H2tx map[c_type.Uint256]*c_type.Uint256 Dirty_G2ins map[c_type.Uint256]bool Dirty_G2outs map[c_type.Uint256]bool } func NewData(num uint64) (ret *Data) { ret = &Data{} ret.Num = num return } func (state *Data) clear_dirty() { state.Dirty_G2ins = make(map[c_type.Uint256]bool) state.Dirty_G2outs = make(map[c_type.Uint256]bool) } func (state *Data) Clear() { state.Cur = NewCur() state.G2outs = make(map[c_type.Uint256]*localdb.OutState) state.H2tx = make(map[c_type.Uint256]*c_type.Uint256) state.Block = StateBlock{} state.clear_dirty() } func (self *Data) appendDel(del *c_type.Uint256) { if del == nil { panic("set_last_out but del is nil") } self.Block.Dels = append(self.Block.Dels, *del) } func (self *Data) appendRoot(root *c_type.Uint256) { if root == nil { panic("set_last_out but root is nil") } //self.Cur.Index = self.Cur.Index + int64(1) //self.Cur.Index = self.Block.Roots = append(self.Block.Roots, *root) } func (self *Data) addInByNilOrRoot(in *c_type.Uint256) { self.Dirty_G2ins[*in] = true } func (self *Data) addOutByRoot(k *c_type.Uint256, out *localdb.OutState) { self.G2outs[*k] = out self.Dirty_G2outs[*k] = true } func (self *Data) AddTxOut(pkr *c_type.PKr) int { return 0 } func (self *Data) AddOut(root *c_type.Uint256, out *localdb.OutState, txhash *c_type.Uint256) { self.Cur.Index = int64(out.Index) self.addOutByRoot(root, out) self.appendRoot(root) if txhash != nil { th := *txhash self.H2tx[*root] = &th } else { self.H2tx[*root] = nil } if self.Cur.Index != int64(out.Index) { panic("add out but cur.index != current_index") } if self.Cur.Index < 0 { panic("add out but cur.index < 0") } return } func (self *Data) AddNil(in *c_type.Uint256) { self.addInByNilOrRoot(in) self.appendDel(in) } func (self *Data) AddDel(in *c_type.Uint256) { self.appendDel(in) } func (self *Data) GetRoots() (roots []c_type.Uint256) { return self.Block.Roots } func (self *Data) GetDels() (dels []c_type.Uint256) { return self.Block.Dels } func (self *Data) GetIndex() (index int64) { return self.Cur.Index } ================================================ FILE: zero/txs/zstate/txstate/data/data_state.go ================================================ package data import ( "fmt" "sort" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-czero-import/seroparam" "github.com/sero-cash/go-sero/serodb" "github.com/sero-cash/go-sero/zero/localdb" "github.com/sero-cash/go-sero/zero/txs/zstate/tri" "github.com/sero-cash/go-sero/zero/utils" ) const LAST_OUTSTATE0_NAME = tri.KEY_NAME("ZState0_Cur") const BLOCK_NAME = "ZState0_BLOCK" const ZSTATE0_INNAME = "ZState0_InName" const ZSTATE0_OUTNAME = "ZState0_OutName" func Name2BKey(name string, num uint64) (ret []byte) { key := fmt.Sprintf("%s_%d", name, num) ret = []byte(key) return } func InName(k *c_type.Uint256) (ret []byte) { ret = []byte(ZSTATE0_INNAME) ret = append(ret, k[:]...) return } func OutName0(k *c_type.Uint256) (ret []byte) { ret = []byte(ZSTATE0_OUTNAME) ret = append(ret, k[:]...) return } func (self *Data) RecordState(putter serodb.Putter, root *c_type.Uint256) { if int64(self.Num) > int64(seroparam.SIP2())-13000 { if out, ok := self.G2outs[*root]; ok { rs := localdb.RootState{} rs.Num = self.Num rs.OS = *out if txhash, ok := self.H2tx[*root]; ok { if txhash != nil { rs.TxHash = *txhash } localdb.PutRoot(putter, root, &rs) } else { panic(fmt.Errorf("data record state h2tx error for : %v", self.Num)) } } else { panic(fmt.Errorf("data record state G2outs error for : %v", self.Num)) } } return } func (self *Data) LoadState(tr tri.Tri) { if self.Num >= 0 { get := CurrentGet{} tri.GetObj( tr, LAST_OUTSTATE0_NAME.Bytes(), &get, ) self.Cur = get.Out blockget := State0BlockGet{} tri.GetObj( tr, Name2BKey(BLOCK_NAME, uint64(self.Num)), &blockget, ) self.Block = blockget.Out } return } func (self *Data) SaveState(tr tri.Tri) { tri.UpdateObj(tr, LAST_OUTSTATE0_NAME.Bytes(), &self.Cur) tri.UpdateObj( tr, Name2BKey(BLOCK_NAME, self.Num), &self.Block, ) g2ins_dirty := utils.Uint256s{} for k := range self.Dirty_G2ins { g2ins_dirty = append(g2ins_dirty, k) } sort.Sort(g2ins_dirty) for _, k := range g2ins_dirty { v := []byte{1} if err := tr.TryUpdate(InName(&k), v); err != nil { panic(err) return } } g2outs_dirty := utils.Uint256s{} for k := range self.Dirty_G2outs { g2outs_dirty = append(g2outs_dirty, k) } sort.Sort(g2outs_dirty) for _, k := range g2outs_dirty { if v := self.G2outs[k]; v != nil { tri.UpdateObj(tr, OutName0(&k), v) } else { panic("state0 update g2outs can not find dirty out") } } return } func (self *Data) HasIn(tr tri.Tri, hash *c_type.Uint256) (exists bool) { if v, err := tr.TryGet(InName(hash)); err != nil { panic(err) return } else { if v != nil && v[0] == 1 { exists = true } else { exists = false } } return } func (self *Data) HashRoot(tr tri.Tri, root *c_type.Uint256) bool { if out := self.GetOut(tr, root); out == nil { return false } return true } func (self *Data) GetOut(tr tri.Tri, root *c_type.Uint256) (src *localdb.OutState) { if out := self.G2outs[*root]; out != nil { return out } else { get := localdb.OutState0Get{} tri.GetObj(tr, OutName0(root), &get) if get.Out != nil { self.G2outs[*root] = get.Out return get.Out } else { return nil } } } ================================================ FILE: zero/txs/zstate/txstate/data/iface.go ================================================ package data import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/serodb" "github.com/sero-cash/go-sero/zero/localdb" "github.com/sero-cash/go-sero/zero/txs/zstate/tri" ) type Log interface { Op(state IData) } type AddTxOutLog struct { Pkr *c_type.PKr } func (log AddTxOutLog) Op(state IData) { state.AddTxOut(log.Pkr) } type AddOutLog struct { Root *c_type.Uint256 Out *localdb.OutState Txhash *c_type.Uint256 } func (log AddOutLog) Op(state IData) { state.AddOut(log.Root, log.Out, log.Txhash) } type AddNilLog struct { In *c_type.Uint256 } func (log AddNilLog) Op(state IData) { state.AddNil(log.In) } type AddDelLog struct { In *c_type.Uint256 } func (log AddDelLog) Op(state IData) { state.AddDel(log.In) } type Revision struct { Id int JournalIndex int } type IData interface { Clear() AddTxOut(pkr *c_type.PKr) int AddOut(root *c_type.Uint256, out *localdb.OutState, txhash *c_type.Uint256) AddNil(in *c_type.Uint256) AddDel(in *c_type.Uint256) LoadState(tr tri.Tri) SaveState(tr tri.Tri) RecordState(putter serodb.Putter, root *c_type.Uint256) HasIn(tr tri.Tri, hash *c_type.Uint256) (exists bool) GetOut(tr tri.Tri, root *c_type.Uint256) (src *localdb.OutState) HashRoot(tr tri.Tri, root *c_type.Uint256) bool GetRoots() (roots []c_type.Uint256) GetDels() (dels []c_type.Uint256) } ================================================ FILE: zero/txs/zstate/txstate/data/meta.go ================================================ package data import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/rlp" ) type Current struct { Index int64 } func NewCur() (ret Current) { ret.Index = -1 return } func (self *Current) Serial() (ret []byte, e error) { if self != nil { return rlp.EncodeToBytes(self) } else { return } } type CurrentGet struct { Out Current } func (self *CurrentGet) Unserial(v []byte) (e error) { if len(v) == 0 { self.Out = NewCur() return } else { if err := rlp.DecodeBytes(v, &self.Out); err != nil { e = err return } else { return } } } type StateBlock struct { Roots []c_type.Uint256 Dels []c_type.Uint256 } func (self *StateBlock) Serial() (ret []byte, e error) { if self != nil { if bytes, err := rlp.EncodeToBytes(self); err != nil { e = err return } else { ret = bytes return } } else { return } } type State0BlockGet struct { Out StateBlock } func (self *State0BlockGet) Unserial(v []byte) (e error) { if len(v) == 0 { return } else { if err := rlp.DecodeBytes(v, &self.Out); err != nil { e = err return } else { return } } } ================================================ FILE: zero/txs/zstate/txstate/data_v1/data.go ================================================ package data_v1 import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/localdb" "github.com/sero-cash/go-sero/zero/txs/zstate/txstate/data" "github.com/sero-cash/go-sero/zero/utils" ) const ZSTATE0_ROOT_OUT = "$ZState0$ROOT-OUT$" type Data struct { Num uint64 Root2Out map[c_type.Uint256]localdb.RootState Dels utils.Dirtys Nils utils.HSet Roots utils.HSet PKr2Count map[c_type.PKr]int } func NewData(num uint64) (ret *Data) { ret = &Data{} ret.Num = num ret.Nils = utils.NewHSet(data.ZSTATE0_INNAME) ret.Roots = utils.NewHSet(ZSTATE0_ROOT_OUT) return } func (state *Data) Clear() { state.Root2Out = make(map[c_type.Uint256]localdb.RootState) state.PKr2Count = make(map[c_type.PKr]int) state.Dels.Clear() state.Nils.Clear() state.Roots.Clear() } func (self *Data) AddTxOut(pkr *c_type.PKr) int { if count, ok := self.PKr2Count[*pkr]; !ok { self.PKr2Count[*pkr] = 1 return 1 } else { count++ self.PKr2Count[*pkr] = count return count } } func (self *Data) AddOut(root *c_type.Uint256, out *localdb.OutState, txhash *c_type.Uint256) { self.Roots.Append(root) rs := localdb.RootState{} rs.Num = self.Num rs.OS = *out if txhash != nil { rs.TxHash = *txhash } self.Root2Out[*root] = rs return } func (self *Data) AddNil(in *c_type.Uint256) { self.Nils.Append(in) self.Dels.Append(in) } func (self *Data) AddDel(in *c_type.Uint256) { self.Dels.Append(in) } func (self *Data) GetRoots() (roots []c_type.Uint256) { return self.Roots.List() } func (self *Data) GetDels() (dels []c_type.Uint256) { return self.Dels.List() } ================================================ FILE: zero/txs/zstate/txstate/data_v1/data_state.go ================================================ package data_v1 import ( "errors" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/serodb" "github.com/sero-cash/go-sero/zero/localdb" "github.com/sero-cash/go-sero/zero/txs/zstate/tri" "github.com/sero-cash/go-sero/zero/txs/zstate/txstate/data" ) func (self *Data) RecordState(putter serodb.Putter, root *c_type.Uint256) { if out, ok := self.Root2Out[*root]; ok { localdb.PutRoot(putter, root, &out) } else { panic(errors.New("data_v1.recordstate can not find root")) } return } func (self *Data) LoadState(tr tri.Tri) { return } func (self *Data) SaveState(tr tri.Tri) { self.Nils.Save(tr) self.Roots.Save(tr) self.PKr2Count = make(map[c_type.PKr]int) return } func (self *Data) HasIn(tr tri.Tri, hash *c_type.Uint256) (exists bool) { return self.Nils.Has(tr, hash) } func (self *Data) HashRoot(tr tri.Tri, root *c_type.Uint256) bool { return self.Roots.Has(tr, root) } func (self *Data) GetOut(tr tri.Tri, root *c_type.Uint256) (src *localdb.OutState) { if self.Roots.Has(tr, root) { var rt *localdb.RootState if r, ok := self.Root2Out[*root]; !ok { rt = localdb.GetRoot(tr.GlobalGetter(), root) self.Root2Out[*root] = *rt } else { rt = &r } if rt != nil { src = &rt.OS } } if src == nil { d := data.NewData(self.Num) d.Clear() src = d.GetOut(tr, root) } return } ================================================ FILE: zero/txs/zstate/txstate/debug.go ================================================ // copyright 2018 The sero.cash Authors // This file is part of the go-sero library. // // The go-sero library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-sero library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-sero library. If not, see <http://www.gnu.org/licenses/>. package txstate import ( "runtime" "runtime/debug" "github.com/sero-cash/go-czero-import/seroparam" "github.com/sero-cash/go-sero/log" ) func Need_debug() bool { return false if false { return true } else { return seroparam.Is_Dev() } } func Debug_Weak_panic(msg string, ctx ...interface{}) { if Need_debug() { log.Debug(">========debug_painc:=======>"+msg, ctx...) debug.PrintStack() runtime.Breakpoint() } } ================================================ FILE: zero/txs/zstate/txstate/merkle.go ================================================ package txstate import ( "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/crypto" "github.com/sero-cash/go-sero/zero/txs/zstate/merkle" ) var CzeroAddress = c_type.NewPKrByBytes(crypto.Keccak512(nil)) var CzeroMerkleParam = merkle.NewParam(&CzeroAddress, c_superzk.Czero_combine) var SzkAddress = c_type.NewPKrByBytes(crypto.Keccak256([]byte("$SuperZK$MerkleTree"))) var SzkMerkleParam = merkle.NewParam(&SzkAddress, c_superzk.Combine) ================================================ FILE: zero/txs/zstate/txstate/state.go ================================================ // copyright 2018 The sero.cash Authors // This file is part of the go-sero library. // // The go-sero library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-sero library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-sero library. If not, see <http://www.gnu.org/licenses/>. package txstate import ( "fmt" "sort" "sync" "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-sero/zero/txs/stx/stx_v0" "github.com/sero-cash/go-sero/zero/txs/stx/stx_v1" "github.com/sero-cash/go-sero/zero/txs/zstate/merkle" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-czero-import/seroparam" "github.com/sero-cash/go-sero/serodb" "github.com/sero-cash/go-sero/zero/txs/zstate/txstate/data_v1" "github.com/sero-cash/go-sero/common/hexutil" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core/types" "github.com/pkg/errors" "github.com/sero-cash/go-sero/zero/txs/zstate/txstate/data" "github.com/sero-cash/go-sero/zero/localdb" "github.com/sero-cash/go-sero/zero/txs/stx" "github.com/sero-cash/go-sero/zero/txs/zstate/tri" "github.com/sero-cash/go-sero/zero/utils" ) type State struct { tri tri.Tri rw *sync.RWMutex num uint64 CzeroTree merkle.MerkleTree SzkTree merkle.MerkleTree data data.IData logs []data.Log revisions []data.Revision } func (self *State) Num() uint64 { return self.num } func (self *State) Tri() tri.Tri { return self.tri } func NewState(tri tri.Tri, num uint64) (state State) { state = State{tri: tri, num: num} state.rw = new(sync.RWMutex) state.CzeroTree = CzeroMerkleParam.NewMerkleTree(tri) state.SzkTree = SzkMerkleParam.NewMerkleTree(tri) if state.num >= seroparam.SIP2() { state.data = data_v1.NewData(num) } else { state.data = data.NewData(num) } state.data.Clear() state.load() return } func (self *State) RecordState(putter serodb.Putter, root *c_type.Uint256) { self.data.RecordState(putter, root) } func (self *State) load() { self.data.LoadState(self.tri) } func (self *State) Update() { self.rw.Lock() defer self.rw.Unlock() self.data.SaveState(self.tri) return } func (state *State) Snapshot(revid int) { state.revisions = append(state.revisions, data.Revision{revid, len(state.logs)}) } func (state *State) Revert(revid int) { idx := sort.Search(len(state.revisions), func(i int) bool { return state.revisions[i].Id >= revid }) if idx == len(state.revisions) || state.revisions[idx].Id != revid { panic(fmt.Errorf("revision id %v cannot be reverted", revid)) } index := state.revisions[idx].JournalIndex state.revisions = state.revisions[:idx] state.logs = state.logs[:index] state.data.Clear() for _, log := range state.logs { log.Op(state.data) } } func (self *State) addOut_Log(root *c_type.Uint256, out *localdb.OutState, txhash *c_type.Uint256) { clone := out.Clone() if txhash != nil { self.logs = append(self.logs, data.AddOutLog{root.NewRef(), &clone, txhash.NewRef()}) } else { self.logs = append(self.logs, data.AddOutLog{root.NewRef(), &clone, nil}) } self.data.AddOut(root, out, txhash) return } func (self *State) addNil_Log(in *c_type.Uint256) { self.logs = append(self.logs, data.AddNilLog{in.NewRef()}) self.data.AddNil(in) } func (self *State) addDel_Log(in *c_type.Uint256) { self.logs = append(self.logs, data.AddDelLog{in.NewRef()}) self.data.AddDel(in) } func (self *State) AddTxOut_Log(pkr *c_type.PKr) int { self.logs = append(self.logs, data.AddTxOutLog{pkr.NewRef()}) return self.data.AddTxOut(pkr) } func (state *State) AddOut_O(out_o *stx_v0.Out_O, txhash *c_type.Uint256) (root c_type.Uint256) { state.rw.Lock() defer state.rw.Unlock() return state.addOut_O(out_o, txhash) } func (state *State) AddOut_P(out_p *stx_v1.Out_P, txhash *c_type.Uint256) (root c_type.Uint256) { state.rw.Lock() defer state.rw.Unlock() return state.addOut_P(out_p, txhash) } func (state *State) insertOS(os *localdb.OutState, txhash *c_type.Uint256) (root c_type.Uint256) { if os.Out_O != nil || os.Out_Z != nil { os.Index = state.CzeroTree.GetLeafSize() os.GenRootCM() root = state.CzeroTree.AppendLeaf(*os.RootCM) state.addOut_Log(&root, os, txhash) } else { os.Index = state.SzkTree.GetLeafSize() os.GenRootCM() root = state.SzkTree.AppendLeaf(*os.RootCM) state.addOut_Log(&root, os, txhash) } return } func (state *State) addOut_O(out_o *stx_v0.Out_O, txhash *c_type.Uint256) (root c_type.Uint256) { os := localdb.OutState{} if out_o != nil { o := *out_o os.Out_O = &o } return state.insertOS(&os, txhash) } func (state *State) addOut_Z(out_z *stx_v0.Out_Z, txhash *c_type.Uint256) (root c_type.Uint256) { os := localdb.OutState{} if out_z != nil { o := out_z.Clone() os.Out_Z = &o } return state.insertOS(&os, txhash) } func (state *State) addOut_C(out_c *stx_v1.Out_C, txhash *c_type.Uint256) (root c_type.Uint256) { os := localdb.OutState{} if out_c != nil { o := out_c.Clone() os.Out_C = &o } return state.insertOS(&os, txhash) } func (state *State) addOut_P(out_p *stx_v1.Out_P, txhash *c_type.Uint256) (root c_type.Uint256) { os := localdb.OutState{} if out_p != nil { o := out_p.Clone() os.Out_P = &o } return state.insertOS(&os, txhash) } func (self *State) HasIn(hash *c_type.Uint256) (exists bool) { self.rw.Lock() defer self.rw.Unlock() return self.data.HasIn(self.tri, hash) } func (state *State) addTx0(tx *stx_v0.Tx, txhash *c_type.Uint256) (e error) { t := utils.TR_enter("AddStx---ins") for _, in := range tx.Desc_O.Ins { if state.num >= seroparam.SIP2() { if state.data.HasIn(state.tri, &in.Nil) { e = errors.New("desc_o.in.nil already be used !") return } else { state.addNil_Log(&in.Nil) state.addDel_Log(&in.Root) } } else { if state.data.HasIn(state.tri, &in.Root) { e = errors.New("desc_o.in.root already be used !") return } else { state.addNil_Log(&in.Root) } } } t.Renter("AddStx---z_ins") for _, in := range tx.Desc_Z.Ins { if state.data.HasIn(state.tri, &in.Nil) { e = errors.New("desc_o.nil already be used !") return } else { state.addNil_Log(&in.Nil) state.addDel_Log(&in.Trace) } } t.Renter("AddStx---z_outs") for _, out := range tx.Desc_Z.Outs { state.addOut_Z(&out, txhash) } t.Leave() return } func (state *State) addTx1(tx *stx_v1.Tx, txhash *c_type.Uint256) (e error) { for _, in := range tx.Ins_P0 { if !state.data.HasIn(state.tri, &in.Nil) { if !state.data.HasIn(state.tri, &in.Root) { state.addNil_Log(&in.Nil) state.addNil_Log(&in.Root) state.addDel_Log(&in.Trace) } else { e = errors.New("tx1.in_p0.root already be used !") return } } else { e = errors.New("tx1.in_p0.nil already be used !") return } } for _, in := range tx.Ins_P { if !state.data.HasIn(state.tri, &in.Nil) { if !state.data.HasIn(state.tri, &in.Root) { state.addNil_Log(&in.Nil) state.addNil_Log(&in.Root) } else { e = errors.New("tx1.in_p.root already be used !") return } } else { e = errors.New("tx1.in_p.nil already be used !") return } } for _, in := range tx.Ins_C { if !state.data.HasIn(state.tri, &in.Nil) { state.addNil_Log(&in.Nil) } else { e = errors.New("tx1.in_c.nil already be used !") return } } for _, out := range tx.Outs_C { state.addOut_C(&out, txhash) } for _, out := range tx.Outs_P { if c_superzk.IsSzkPKr(&out.PKr) { state.addOut_P(&out, txhash) } else { state.addOut_O( &stx_v0.Out_O{ Addr: out.PKr, Asset: out.Asset, Memo: out.Memo, }, txhash, ) } } return } func (state *State) AddStx(st *stx.T) (e error) { state.rw.Lock() defer state.rw.Unlock() txhash := st.ToHash() if st.Tx0() != nil && st.Tx1.Count() > 0 { return fmt.Errorf("add stx, tx0 & tx1 only one can has value ") } if st.Tx0() != nil { return state.addTx0(st.Tx0(), &txhash) } if st.Tx1.Count() > 0 { return state.addTx1(&st.Tx1, &txhash) } return } func (state *State) GetOut(root *c_type.Uint256) (src *localdb.OutState) { state.rw.Lock() defer state.rw.Unlock() return state.data.GetOut(state.tri, root) } func (state *State) FindAnchorInSzk(root *c_type.Uint256) bool { state.rw.Lock() defer state.rw.Unlock() return state.data.HashRoot(state.tri, root) } func (self *State) GetBlockRoots() (roots []c_type.Uint256) { return self.data.GetRoots() } func (self *State) GetBlockDels() (dels []c_type.Uint256) { return self.data.GetDels() } type Chain interface { GetBlock(hash common.Hash, number uint64) *types.Block } func AnalyzeNils(header *types.Header, ch Chain) { hash := header.ParentHash number := header.Number.Uint64() - 1 m := make(map[c_type.Uint256]int) for { b := ch.GetBlock(hash, number) for _, tx := range b.Transactions() { if tx.Stxt().Tx0() != nil { for _, in := range tx.Stxt().Tx0().Desc_O.Ins { if v, ok := m[in.Root]; ok { fmt.Printf("num=%v,block=%v,tx=%v,current=%v,hit=%v\n", number, hexutil.Encode(hash[:]), hexutil.Encode(in.ToHash().NewRef()[:]), 1, v) } else { m[in.Root] = 1 } } for _, in := range tx.Stxt().Tx0().Desc_O.Ins { if v, ok := m[in.Nil]; ok { fmt.Printf("num=%v,block=%v,tx=%v,current=%v,hit=%v\n", number, hexutil.Encode(hash[:]), hexutil.Encode(in.ToHash().NewRef()[:]), 2, v) } else { m[in.Nil] = 2 } } for _, in := range tx.Stxt().Tx0().Desc_Z.Ins { if v, ok := m[in.Nil]; ok { fmt.Printf("num=%v,block=%v,tx=%v,current=%v,hit=%v\n", number, hexutil.Encode(hash[:]), hexutil.Encode(in.ToHash().NewRef()[:]), 3, v) } else { m[in.Nil] = 3 } } } } if number == 0 { break } hash = b.ParentHash() number = number - 1 } } func (self *State) PreGenerateRoot(header *types.Header, ch Chain) { if header.Number.Uint64() == (seroparam.SIP2()) { hash := header.ParentHash number := header.Number.Uint64() - 1 size := number progress := utils.NewProgress("PRE GEN ROOTS: ", size) count := 0 for { b := ch.GetBlock(hash, number) for _, tx := range b.Transactions() { if tx.Stxt().Tx0() != nil { for _, in := range tx.Stxt().Tx0().Desc_O.Ins { self.addNil_Log(&in.Nil) count++ } } } progress.Tick(size-number, "count", count) if number == 0 { break } hash = b.ParentHash() number = number - 1 } } } ================================================ FILE: zero/txs/zstate/zstate.go ================================================ // copyright 2018 The sero.cash Authors // This file is part of the go-sero library. // // The go-sero library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-sero library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-sero library. If not, see <http://www.gnu.org/licenses/>. package zstate import ( "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-czero-import/seroparam" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/zero/txs/stx/stx_v0" "github.com/sero-cash/go-sero/zero/txs/stx/stx_v1" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/serodb" "github.com/sero-cash/go-sero/zero/localdb" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-sero/zero/txs/zstate/pkgstate" "github.com/sero-cash/go-sero/zero/txs/zstate/txstate" "github.com/sero-cash/go-sero/zero/utils" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/zero/txs/stx" "github.com/sero-cash/go-sero/zero/txs/zstate/tri" ) type ZState struct { Tri tri.Tri num uint64 State txstate.State Pkgs pkgstate.PkgState } func (self *ZState) Num() uint64 { return self.num } func CurrentState(tri0 tri.Tri, num uint64) (state *ZState) { state = &ZState{} state.Tri = tri0 state.num = num state.State = txstate.NewState(tri0, num) state.Pkgs = pkgstate.NewPkgState(tri0, num) return } func NextState(tri0 tri.Tri, num int64) (state *ZState) { return CurrentState(tri0, uint64(num+1)) } func (self *ZState) Copy() *ZState { return self } func (self *ZState) Update() { self.State.Update() self.Pkgs.Update() return } func (self *ZState) PreGenerateRoot(header *types.Header, ch txstate.Chain) { self.State.PreGenerateRoot(header, ch) } func (self *ZState) RecordBlock(db serodb.Putter, hash *c_type.Uint256) { block := localdb.Block{} block.Roots = self.State.GetBlockRoots() block.Dels = self.State.GetBlockDels() block.Pkgs = self.Pkgs.GetPkgHashes() localdb.PutBlock(db, self.num, hash, &block) for _, hash := range block.Pkgs { self.Pkgs.RecordState(db, &hash) } for _, k := range block.Roots { self.State.RecordState(db, &k) } } func (self *ZState) Snapshot(revid int) { t := utils.TR_enter("Snapshot") self.State.Snapshot(revid) self.Pkgs.Snapshot(revid) t.Leave() } func (self *ZState) Revert(revid int) { self.State.Revert(revid) self.Pkgs.Revert(revid) return } func (state *ZState) addOut_O(out *stx_v0.Out_O, txhash common.Hash) { state.State.AddOut_O(out.Clone().ToRef(), txhash.HashToUint256()) } func (state *ZState) addOut_P(out *stx_v1.Out_P, txhash common.Hash) { state.State.AddOut_P(out.Clone().ToRef(), txhash.HashToUint256()) } func (state *ZState) AddStx(st *stx.T) (e error) { if err := state.State.AddStx(st); err != nil { e = err return } else { hash_for_s := st.ToHash_for_sign() if st.Desc_Pkg.Create != nil { if e = state.Pkgs.Force_add(&st.From, st.Desc_Pkg.Create); e != nil { return } } if st.Desc_Pkg.Close != nil { if e = state.Pkgs.Force_del(&hash_for_s, st.Desc_Pkg.Close); e != nil { return } } if st.Desc_Pkg.Transfer != nil { if e = state.Pkgs.Force_transfer(&hash_for_s, st.Desc_Pkg.Transfer); e != nil { return } } } return } func (state *ZState) AddTxOutWithCheck(addr common.Address, asset assets.Asset, txhash common.Hash) (alarm bool) { alarm = false if state.Num() >= seroparam.VP0() { count := state.State.AddTxOut_Log(addr.ToPKr()) if count > seroparam.MAX_CONTRACT_OUT_COUNT_LENGTH { log.Error("[ALARM] ZState AddTxOut Overflow", "MAX_CONTRACT_OUT_COUNT_LENGTH", seroparam.MAX_CONTRACT_OUT_COUNT_LENGTH, "txHash", txhash.Hex()) alarm = true } } state.AddTxOut(addr, asset, txhash) return } func (state *ZState) AddTxOut(addr common.Address, asset assets.Asset, txhash common.Hash) { t := utils.TR_enter("AddTxOut-----") need_add := false if asset.Tkn != nil { if asset.Tkn.Currency != c_type.Empty_Uint256 { if asset.Tkn.Value.ToUint256() != c_type.Empty_Uint256 { need_add = true } } } if asset.Tkt != nil { if asset.Tkt.Category != c_type.Empty_Uint256 { if asset.Tkt.Value != c_type.Empty_Uint256 { need_add = true } } } if need_add { pkr := addr.ToPKr() if state.Num() >= seroparam.SIP5() { if c_superzk.IsSzkPKr(pkr) { o := stx_v1.Out_P{PKr: *addr.ToPKr(), Asset: asset, Memo: c_type.Uint512{}} state.addOut_P(&o, txhash) } else { o := stx_v0.Out_O{Addr: *addr.ToPKr(), Asset: asset, Memo: c_type.Uint512{}} state.addOut_O(&o, txhash) } } else { o := stx_v0.Out_O{Addr: *addr.ToPKr(), Asset: asset, Memo: c_type.Uint512{}} state.addOut_O(&o, txhash) } } t.Leave() return } ================================================ FILE: zero/txtool/flight/sli.go ================================================ package flight import ( "github.com/sero-cash/go-czero-import/seroparam" "github.com/sero-cash/go-sero/zero/txs/stx/stx_v0" "github.com/sero-cash/go-sero/zero/txs/stx/stx_v1" "github.com/sero-cash/go-sero/zero/utils" "github.com/pkg/errors" "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-sero/zero/txs/stx" "github.com/sero-cash/go-sero/zero/txtool" "github.com/sero-cash/go-sero/zero/txtool/generate/generate_1" "github.com/sero-cash/go-czero-import/c_type" ) func GenTx(param *txtool.GTxParam) (gtx txtool.GTx, e error) { var need_szk = true if (txtool.Ref_inst.Bc != nil) && (!seroparam.Is_Offline()) { if txtool.Ref_inst.Bc.GetCurrenHeader().Number.Uint64()+1 < seroparam.SIP5() { need_szk = false param.Z = nil } else { param.Z = &need_szk } } else { if param.Z == nil { need_szk = false } } if need_szk { if tx, param, keys, bases, err := SignTx1(param); err != nil { e = err return } else { if gtx, e = ProveTx1(&tx, ¶m); e != nil { return } else { gtx.Keys = keys gtx.Bases = bases return } } } else { return SignTx0(param) } } func SignTx(sk *c_type.Uint512, paramTx *txtool.GTxParam) (tx txtool.GTx, e error) { copy(paramTx.From.SKr[:], sk[:]) for i := range paramTx.Ins { copy(paramTx.Ins[i].SKr[:], sk[:]) } return GenTx(paramTx) } func SignLight(sk *c_type.Uint512, paramTx *txtool.GTxParam) (tx stx.T, param txtool.GTxParam, keys []c_type.Uint256, bases []c_type.Uint256, e error) { copy(paramTx.From.SKr[:], sk[:]) for i := range paramTx.Ins { copy(paramTx.Ins[i].SKr[:], sk[:]) } return SignTx1(paramTx) } func DecOut(tk *c_type.Tk, outs []txtool.Out) (douts []txtool.TDOut) { for _, out := range outs { dout := txtool.TDOut{} if out.State.OS.Out_O != nil { dout.Asset = out.State.OS.Out_O.Asset.Clone() dout.Memo = out.State.OS.Out_O.Memo if til, e := c_superzk.Czero_genTrace(tk, out.State.OS.RootCM); e == nil { dout.Nils = append(dout.Nils, til) // dout.Nils = append(dout.Nils, c_czero.GenNil(tk, out.State.OS.RootCM)) dout.Nils = append(dout.Nils, out.Root) } } else if out.State.OS.Out_Z != nil { if key, flag, e := c_superzk.Czero_fetchKey(tk, &out.State.OS.Out_Z.RPK); e == nil { if confirm_out := generate_1.ConfirmOutZ(&key, flag, out.State.OS.Out_Z); confirm_out != nil { dout = *confirm_out if til, e := c_superzk.Czero_genTrace(tk, out.State.OS.RootCM); e == nil { dout.Nils = append(dout.Nils, til) // dout.Nils = append(dout.Nils, c_czero.GenNil(tk, out.State.OS.RootCM)) } } } } else if out.State.OS.Out_P != nil { if nl, e := c_superzk.GenNil(tk, out.State.OS.RootCM.NewRef(), &out.State.OS.Out_P.PKr); e == nil { dout.Asset = out.State.OS.Out_P.Asset dout.Memo = out.State.OS.Out_P.Memo dout.Nils = append(dout.Nils, nl) } } else if out.State.OS.Out_C != nil { if key, _, e := c_superzk.FetchKey(&out.State.OS.Out_C.PKr, tk, &out.State.OS.Out_C.RPK); e == nil { if confirm_out, _ := generate_1.ConfirmOutC(&key, out.State.OS.Out_C); confirm_out != nil { if nl, e := c_superzk.GenNil(tk, out.State.OS.RootCM.NewRef(), &out.State.OS.Out_C.PKr); e == nil { dout = *confirm_out dout.Nils = append(dout.Nils, nl) } } } } else { panic(errors.New("OutState has no Out_X")) } douts = append(douts, dout) } return } func ConfirmOutZ(key *c_type.Uint256, z *stx_v0.Out_Z) (dout txtool.TDOut, e error) { if out := generate_1.ConfirmOutZ(key, true, z); out != nil { dout = *out return } else { e = errors.New("confirm outz error") return } } func ConfirmOutC(key *c_type.Uint256, c *stx_v1.Out_C) (dout txtool.TDOut, e error) { if out, _ := generate_1.ConfirmOutC(key, c); out != nil { dout = *out return } else { e = errors.New("confirm outz error") return } } func CurrencyToId(currency string) (ret c_type.Uint256) { bs := utils.CurrencyToBytes(currency) copy(ret[:], bs[:]) return } func IdToCurrency(id *c_type.Uint256) (ret string) { return utils.Uint256ToCurrency(id) } ================================================ FILE: zero/txtool/flight/sli_test.go ================================================ package flight import ( "encoding/json" "fmt" "testing" "github.com/sero-cash/go-sero/zero/txtool" ) func TestDecOut(t *testing.T) { outs_str := `[{"Root":"0xf3ead30acaf8576362413db319f2abf543c5db555dc0f91f7dd7d0bae28c3425","State":{"OS":{"index":1983489,"Out_O":{"Addr":"","Asset":{"Tkn":{"Currency":"0x0000000000000000000000000000000000000000000000000000000000000000","Value":0}}},"Out_Z":{"PKr":"0xeb4a555d1132357bbeb184132e163f9bd7cde4790231e802d783005f0b43b8a20e87f2e41c1e0221e3374c341331ec51c3acda0195da6c130a 166a3d0676b38fa5ea369d5cc177ff9d1d8d6e97ae117758de391e0426986370edbcecfe4f4322"},"Out_CM":null,"RootCM":"0x0d48e240051ac932 46aa7e46c024945a2493c02b19982d4bd9fddbf51ff1b611"},"TxHash":"0x75be54e70f74cd5c7ba799c73db80569634274e9f1f599411c8c62de79b6 3a09","Num":1538009}}]` var outs []txtool.Out outs = append(outs, txtool.Out{}) bs, err := json.Marshal(outs) fmt.Println(string(bs)) err = json.Unmarshal([]byte(outs_str), &outs) fmt.Println(err) } ================================================ FILE: zero/txtool/flight/sri.go ================================================ package flight import ( "fmt" "math/big" "strings" "github.com/sero-cash/go-czero-import/superzk" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-sero/zero/utils" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/zero/txtool" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-czero-import/seroparam" "github.com/sero-cash/go-sero/common/hexutil" "github.com/pkg/errors" "github.com/sero-cash/go-sero/zero/localdb" ) type SRI struct { } var SRI_Inst = SRI{} func Trace2Root(tk *c_type.Tk, trace *c_type.Uint256, base *c_type.Uint256) (root *c_type.Uint256) { if root_cm, e := superzk.FetchRootCM(tk, trace, base); e != nil { return } else { root = localdb.GetRootByRootCM(txtool.Ref_inst.Bc.GetDB(), &root_cm) return } } func GetOut(root *c_type.Uint256, num uint64) (out *localdb.RootState) { rs := localdb.GetRoot(txtool.Ref_inst.Bc.GetDB(), root) if rs != nil { return rs } else { zst := txtool.Ref_inst.CurrentState() if os := zst.State.GetOut(root); os == nil { return nil } else { out := localdb.RootState{ *os, c_type.Uint256{}, num, } return &out } } } func GetBlock(num uint64, hash *common.Hash) (ret *localdb.Block) { ret = localdb.GetBlock(txtool.Ref_inst.Bc.GetDB(), num, hash.HashToUint256()) if ret == nil { temp_state := txtool.Ref_inst.Bc.CurrentState(hash) if temp_state == nil { panic(fmt.Sprintf("new zstate error: %v:%v !", num, hash)) } else { log.Debug("STATE1_PARSE GO BACK TO STATE: ", "num", num, "hash", hash) } ret = &localdb.Block{} ret.Pkgs = temp_state.Pkgs.GetPkgHashes() ret.Roots = temp_state.State.GetBlockRoots() ret.Dels = temp_state.State.GetBlockDels() } return } func (self *SRI) GetBlocksInfoByDelay(start uint64, count uint64, delay uint64) (blocks []txtool.Block, e error) { stable_num := txtool.Ref_inst.GetDelayedNum(delay) if start <= stable_num { if stable_num-start+1 < count { count = stable_num - start + 1 } for i := uint64(0); i < count; i++ { num := start + i //log.Info("GetBlocksInfoByDelay ", "num", num) chain_block := txtool.Ref_inst.Bc.GetBlockByNumber(num) hash := chain_block.Hash() //log.Info("GetBlocksInfoByDelay ", "hash ", hash.String(), "num", num) local_block := GetBlock(num, &hash) if local_block != nil { block := txtool.Block{} block.Hash = *hash.HashToUint256() block.Num = hexutil.Uint64(num) for _, k := range local_block.Dels { block.Nils = append(block.Nils, k) } for _, k := range local_block.Roots { if out := GetOut(&k, num); out == nil { log.Error("GetBlocksInfo ERROR", "num", num, "root", k) } else { block.Outs = append(block.Outs, txtool.Out{k, *out}) } } for _, k := range local_block.Pkgs { if pkg := localdb.GetPkg(txtool.Ref_inst.Bc.GetDB(), &k); pkg == nil { log.Error("GetBlocksInfo ERROR", "num", num, "pkg", k) } else { block.Pkgs = append(block.Pkgs, *pkg) } } blocks = append(blocks, block) } else { e = fmt.Errorf("GetBlocksInfo.GetBlock Failed, num: %v", num) return } } return } else { return } } func (self *SRI) GetBlocksInfo(start uint64, count uint64) (blocks []txtool.Block, e error) { return self.GetBlocksInfoByDelay(start, count, seroparam.DefaultConfirmedBlock()) } func (self *SRI) GetAnchor(roots []c_type.Uint256) (wits []txtool.Witness, e error) { state := txtool.Ref_inst.CurrentState() if state != nil { for _, root := range roots { wit := txtool.Witness{} if out := GetOut(&root, 0); out == nil { e = errors.New("GetAnchor use root but out is nil !!!") return } else { if out.OS.IsSzk() { pos, paths, anchor := state.State.SzkTree.GetPaths(*out.OS.RootCM) wit.Pos = hexutil.Uint64(pos) wit.Paths = paths wit.Anchor = anchor wits = append(wits, wit) } else { pos, paths, anchor := state.State.CzeroTree.GetPaths(*out.OS.RootCM) wit.Pos = hexutil.Uint64(pos) wit.Paths = paths wit.Anchor = anchor wits = append(wits, wit) } } } return } else { e = errors.New("State is nil") return } return } func GenTxParam(param *PreTxParam, tk c_type.Tk) (p txtool.GTxParam, e error) { log.Debug("genTx start") p.Gas = param.Gas p.GasPrice = big.NewInt(0).SetUint64(param.GasPrice) p.Fee = assets.Token{ utils.CurrencyToUint256("SERO"), utils.U256(*new(big.Int).Mul(new(big.Int).SetUint64(param.Gas), new(big.Int).SetUint64(param.GasPrice))), } p.From.PKr = param.From p.Outs = param.Outs roots := []c_type.Uint256{} outs := []txtool.Out{} amounts := make(map[string]*big.Int) ticekts := make(map[c_type.Uint256]c_type.Uint256) for _, in := range param.Ins { roots = append(roots, in) if root := localdb.GetRoot(txtool.Ref_inst.Bc.GetDB(), &in); root == nil { e = fmt.Errorf("SRI.GenTxParam get root Error for root %v", in) return } else { out := txtool.Out{in, *root} dOuts := DecOut(&tk, []txtool.Out{out}) if len(dOuts) == 0 { e = fmt.Errorf("SRI.GenTxParam dec outs Error for root %v", in) return } oOut := dOuts[0] if len(oOut.Nils) == 0 { e = fmt.Errorf("SRI.GenTxParam dec outs Error for root %v", in) return } if oOut.Asset.Tkn != nil { currency := strings.Trim(string(oOut.Asset.Tkn.Currency[:]), string([]byte{0})) if amount, ok := amounts[currency]; ok { amount.Add(amount, oOut.Asset.Tkn.Value.ToIntRef()) } else { amounts[currency] = oOut.Asset.Tkn.Value.ToIntRef() } } if oOut.Asset.Tkt != nil { ticekts[oOut.Asset.Tkt.Value] = oOut.Asset.Tkt.Category } outs = append(outs, txtool.Out{in, *root}) } } for _, out := range param.Outs { if out.Asset.Tkn != nil { currency := strings.Trim(string(out.Asset.Tkn.Currency[:]), string([]byte{0})) token := out.Asset.Tkn.Value.ToIntRef() if amount, ok := amounts[currency]; ok && amount.Cmp(token) >= 0 { amount.Sub(amount, token) if amount.Sign() == 0 { delete(amounts, currency) } } else { e = fmt.Errorf("SSI GenTx Error: balance is not enough") return } } if out.Asset.Tkt != nil { if value, ok := ticekts[out.Asset.Tkt.Value]; ok && value == out.Asset.Tkt.Category { delete(ticekts, out.Asset.Tkt.Value) } else { e = fmt.Errorf("SSI GenTx Erro: balance is not enough") return } } } if amount, ok := amounts[utils.Uint256ToCurrency(&p.Fee.Currency)]; !ok || amount.Cmp(p.Fee.Value.ToInt()) < 0 { e = fmt.Errorf("SSI GenTx Error: sero amount < Fee") return } else { amount.Sub(amount, p.Fee.Value.ToInt()) if amount.Sign() == 0 { delete(amounts, utils.Uint256ToCurrency(&p.Fee.Currency)) } } if len(amounts) > 0 || len(ticekts) > 0 { for currency, value := range amounts { p.Outs = append(p.Outs, txtool.GOut{PKr: p.From.PKr, Asset: assets.Asset{Tkn: &assets.Token{ Currency: *common.BytesToHash(common.LeftPadBytes([]byte(currency), 32)).HashToUint256(), Value: utils.U256(*value), }}}) } for value, category := range ticekts { p.Outs = append(p.Outs, txtool.GOut{PKr: p.From.PKr, Asset: assets.Asset{Tkt: &assets.Ticket{ Category: category, Value: value, }}}) } } wits := []txtool.Witness{} if wits, e = SRI_Inst.GetAnchor(roots); e != nil { return } for i := 0; i < len(wits); i++ { in := txtool.GIn{} in.Out = outs[i] in.Witness = wits[i] p.Ins = append(p.Ins, in) } if e = p.GenZ(); e != nil { return } log.Debug("genTxParam ins : %v, outs : %v", len(p.Ins), len(p.Outs)) return } ================================================ FILE: zero/txtool/flight/tx.go ================================================ package flight import ( "fmt" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/common/hexutil" "github.com/sero-cash/go-sero/zero/txs/stx" "github.com/sero-cash/go-sero/zero/txtool" "github.com/sero-cash/go-sero/zero/txtool/generate/generate_1" ) func SignTx0(param *txtool.GTxParam) (gtx txtool.GTx, e error) { e = fmt.Errorf("SignTx0 Error: signTx0 not support after sip5") return } func SignTx1(txParam *txtool.GTxParam) (tx stx.T, param txtool.GTxParam, keys []c_type.Uint256, bases []c_type.Uint256, e error) { if ctx, err := generate_1.SignTx(txParam); err != nil { e = err return } else { tx = ctx.Tx() param = ctx.Param() keys = ctx.Keys() bases = ctx.Bases() return } } func ProveTx1(tx *stx.T, param *txtool.GTxParam) (gtx txtool.GTx, e error) { if ctx, err := generate_1.ProveTx(tx, param); err != nil { e = err return } else { gtx.Tx = ctx.Tx() gtx.Gas = hexutil.Uint64(param.Gas) gtx.GasPrice = hexutil.Big(*param.GasPrice) gtx.Hash = gtx.Tx.ToHash() return } } ================================================ FILE: zero/txtool/flight/types.go ================================================ package flight import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/txtool" ) type PreTxParam struct { Gas uint64 GasPrice uint64 From c_type.PKr Ins []c_type.Uint256 Outs []txtool.GOut } ================================================ FILE: zero/txtool/generate/generate.go ================================================ package generate ================================================ FILE: zero/txtool/generate/generate_1/prove.go ================================================ package generate_1 import ( "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-sero/zero/txs/stx" "github.com/sero-cash/go-sero/zero/txtool" ) type prove_ctx struct { param txtool.GTxParam tx stx.T p0_ins []*txtool.GIn p_ins []*txtool.GIn c_ins []*txtool.GIn c_outs []*txtool.GOut p_outs []*txtool.GOut } func (self *prove_ctx) Tx() (ret stx.T) { ret = self.tx return } func (self *prove_ctx) prepare() { for i := range self.param.Ins { in := &self.param.Ins[i] if in.Out.State.OS.Out_O != nil { self.p0_ins = append(self.p0_ins, in) continue } if in.Out.State.OS.Out_Z != nil { self.p0_ins = append(self.p0_ins, in) continue } if in.Out.State.OS.Out_P != nil { self.p_ins = append(self.p_ins, in) continue } if in.Out.State.OS.Out_C != nil { if self.param.Z != nil && *self.param.Z { self.c_ins = append(self.c_ins, in) } else { self.p_ins = append(self.p_ins, in) } continue } } for i := range self.param.Outs { out := &self.param.Outs[i] if c_superzk.IsSzkPKr(&out.PKr) { if self.param.Z != nil && *self.param.Z { self.c_outs = append(self.c_outs, out) } else { self.p_outs = append(self.p_outs, out) } } else { self.p_outs = append(self.p_outs, out) } } } func (self *prove_ctx) prove() (e error) { var gen_output_procs = gen_output_procs_pool.GetProcs() defer gen_output_procs_pool.PutProcs(gen_output_procs) for i, out := range self.c_outs { g := gen_output_desc{} g.asset_cm = self.tx.Tx1.Outs_C[i].AssetCM g.ar = *out.Ar g.asset = out.Asset.ToTypeAsset() g.index = i if self.param.IsExt != nil && *self.param.IsExt { g.isEx = true } gen_output_procs.StartProc(&g) } var gen_input_procs = gen_input_procs_pool.GetProcs() defer gen_input_procs_pool.PutProcs(gen_input_procs) for i, in := range self.c_ins { t_in := self.tx.Tx1.Ins_C[i] g := gen_input_desc{} g.asset_cm_new = t_in.AssetCM g.zpka = t_in.ZPKa g.nil = t_in.Nil g.anchor = t_in.Anchor g.asset_cc = *in.CC g.ar_old = *in.ArOld g.ar_new = *in.Ar g.index = in.Out.State.OS.Index copy(g.zpkr[:], in.Out.State.OS.ToPKr()[:32]) g.vskr = *in.Vskr copy(g.baser[:], in.Out.State.OS.ToPKr()[64:]) g.a = *in.A for i, path := range in.Witness.Paths { copy(g.paths[len(g.paths)-32-(i*32):], path[:]) } g.pos = uint64(in.Witness.Pos) gen_input_procs.StartProc(&g) } var gen_pkg_procs = gen_pkg_procs_pool.GetProcs() defer gen_pkg_procs_pool.PutProcs(gen_pkg_procs) if self.param.Cmds.PkgCreate != nil { g := gen_pkg_desc{} g.asset = self.param.Cmds.PkgCreate.Asset.ToTypeAsset() g.ar = self.param.Cmds.PkgCreate.Ar g.asset_cm = self.tx.Desc_Pkg.Create.Pkg.AssetCM gen_pkg_procs.StartProc(&g) } //----------------- if gen_output_procs.HasProc() { if e = gen_output_procs.End(); e == nil { for _, g := range gen_output_procs.Runs { output_desc := g.(*gen_output_desc) self.tx.Tx1.Outs_C[output_desc.index].Proof = output_desc.proof } } else { return } } if gen_input_procs.HasProc() { if e = gen_input_procs.End(); e == nil { for i, g := range gen_input_procs.Runs { input_desc := g.(*gen_input_desc) self.tx.Tx1.Ins_C[i].Proof = input_desc.proof } } else { return } } if gen_pkg_procs.HasProc() { if e = gen_pkg_procs.End(); e == nil { pkg_desc := gen_pkg_procs.Runs[0].(*gen_pkg_desc) self.tx.Desc_Pkg.Create.Proof = pkg_desc.proof } else { return } } return } func ProveTx(tx *stx.T, param *txtool.GTxParam) (ctx prove_ctx, e error) { ctx.param = *param ctx.tx = *tx ctx.prepare() if e = ctx.prove(); e != nil { return } return } ================================================ FILE: zero/txtool/generate/generate_1/prove_proc.go ================================================ package generate_1 import ( "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/utils" "github.com/sero-cash/go-sero/zero/zconfig" ) var gen_output_procs_pool = utils.NewProcsPool(func() int { return zconfig.G_p_thread_num }) type gen_output_desc struct { asset c_type.Asset ar c_type.Uint256 asset_cm c_type.Uint256 proof c_type.Proof index int isEx bool e error } func (self *gen_output_desc) Run() error { if proof, err := c_superzk.ProveOutput(&self.asset, &self.ar, &self.asset_cm, self.isEx); err != nil { self.e = err return err } else { self.proof = proof return nil } } var gen_input_procs_pool = utils.NewProcsPool(func() int { return zconfig.G_p_thread_num }) type gen_input_desc struct { asset_cm_new c_type.Uint256 zpka c_type.Uint256 nil c_type.Uint256 anchor c_type.Uint256 asset_cc c_type.Uint256 ar_old c_type.Uint256 ar_new c_type.Uint256 index uint64 zpkr c_type.Uint256 vskr c_type.Uint256 baser c_type.Uint256 a c_type.Uint256 paths [c_type.DEPTH * 32]byte pos uint64 proof c_type.Proof e error } func (self *gen_input_desc) Run() error { if proof, err := c_superzk.ProveInput( &self.asset_cm_new, &self.zpka, &self.nil, &self.anchor, &self.asset_cc, &self.ar_old, &self.ar_new, self.index, &self.zpkr, &self.vskr, &self.baser, &self.a, &self.paths, self.pos, ); err != nil { self.e = err return err } else { self.proof = proof return nil } } var gen_pkg_procs_pool = utils.NewProcsPool(func() int { return zconfig.G_p_thread_num }) type gen_pkg_desc struct { asset_cm c_type.Uint256 asset c_type.Asset ar c_type.Uint256 proof c_type.Proof e error } func (self *gen_pkg_desc) Run() error { if proof, e := c_superzk.ProveOutput(&self.asset, &self.ar, &self.asset_cm, true); e != nil { self.e = e return e } else { self.proof = proof return nil } } ================================================ FILE: zero/txtool/generate/generate_1/sign.go ================================================ package generate_1 import ( "errors" "github.com/sero-cash/go-sero/zero/txs/pkg" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-czero-import/superzk" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-sero/zero/txs/stx" "github.com/sero-cash/go-sero/zero/txs/stx/stx_v1" "github.com/sero-cash/go-sero/zero/txtool" ) type sign_ctx struct { param txtool.GTxParam p0_ins []*txtool.GIn p_ins []*txtool.GIn c_ins []*txtool.GIn c_outs []*txtool.GOut p_outs []*txtool.GOut balance_desc c_type.BalanceDesc keys []c_type.Uint256 bases []c_type.Uint256 s stx.T ck assets.CKState } func (self *sign_ctx) Tx() (ret stx.T) { ret = self.s return } func (self *sign_ctx) Param() (ret txtool.GTxParam) { ret = self.param return } func (self *sign_ctx) Keys() (ret []c_type.Uint256) { ret = self.keys return } func (self *sign_ctx) Bases() (ret []c_type.Uint256) { ret = self.bases return } func SignTx(param *txtool.GTxParam) (ctx sign_ctx, e error) { ctx.param = *param if e = ctx.check(); e != nil { return } if e = ctx.prepare(); e != nil { return } if e = ctx.genFrom(); e != nil { return } if e = ctx.genFee(); e != nil { return } if e = ctx.genCmd(); e != nil { return } if e = ctx.genInsP0(); e != nil { return } if e = ctx.genInsP(); e != nil { return } if e = ctx.genInsC(); e != nil { return } if e = ctx.genOutsC(); e != nil { return } if e = ctx.genOutsP(); e != nil { return } if e = ctx.genSign(); e != nil { return } return } func (self *sign_ctx) check() (e error) { sk := self.param.From.SKr.ToUint512() tk, e := superzk.Sk2Tk(&sk) if !superzk.IsMyPKr(&tk, &self.param.From.PKr) { e = errors.New("sk unmatch pkr for the From field") return } for _, in := range self.param.Ins { tk, _ := superzk.Sk2Tk(in.SKr.ToUint512().NewRef()) if in.Out.State.OS.Out_O != nil { if !superzk.IsMyPKr(&tk, &in.Out.State.OS.Out_O.Addr) { return } continue } if in.Out.State.OS.Out_Z != nil { if !superzk.IsMyPKr(&tk, &in.Out.State.OS.Out_Z.PKr) { return } continue } if in.Out.State.OS.Out_P != nil { if !superzk.IsMyPKr(&tk, &in.Out.State.OS.Out_P.PKr) { e = errors.New("sk unmatch pkr for out_z") return } continue } if in.Out.State.OS.Out_C != nil { if !superzk.IsMyPKr(&tk, &in.Out.State.OS.Out_C.PKr) { e = errors.New("sk unmatch pkr for out_z") return } continue } } return } func (self *sign_ctx) prepare() (e error) { for i := range self.param.Ins { in := &self.param.Ins[i] if in.Out.State.OS.Out_O != nil { self.p0_ins = append(self.p0_ins, in) continue } if in.Out.State.OS.Out_Z != nil { self.p0_ins = append(self.p0_ins, in) continue } if in.Out.State.OS.Out_P != nil { self.p_ins = append(self.p_ins, in) continue } if in.Out.State.OS.Out_C != nil { if self.param.Z != nil && *self.param.Z { self.c_ins = append(self.c_ins, in) } else { self.p_ins = append(self.p_ins, in) } continue } } for i := range self.param.Outs { out := &self.param.Outs[i] if c_superzk.IsSzkPKr(&out.PKr) { if self.param.Z != nil && *self.param.Z { self.c_outs = append(self.c_outs, out) } else { self.p_outs = append(self.p_outs, out) } } else { self.p_outs = append(self.p_outs, out) } } self.s.Ehash = types.Ehash(*self.param.GasPrice, self.param.Gas, []byte{}) return } func (self *sign_ctx) genFrom() (e error) { self.s.From = self.param.From.PKr return } func (self *sign_ctx) genFee() (e error) { self.s.Fee = self.param.Fee if cc, err := c_superzk.GenAssetCC(self.param.Fee.ToTypeAsset().NewRef()); err != nil { e = err return } else { self.ck = assets.NewCKState(true, &self.param.Fee) self.balance_desc.Oout_accs = append(self.balance_desc.Oout_accs, cc[:]...) } return } func (self *sign_ctx) genCmd() (e error) { var a *assets.Asset if self.param.Cmds.BuyShare != nil { self.s.Desc_Cmd.BuyShare = self.param.Cmds.BuyShare asset := self.param.Cmds.BuyShare.Asset() a = &asset } if self.param.Cmds.RegistPool != nil { self.s.Desc_Cmd.RegistPool = self.param.Cmds.RegistPool asset := self.param.Cmds.RegistPool.Asset() a = &asset } if self.param.Cmds.ClosePool != nil { self.s.Desc_Cmd.ClosePool = self.param.Cmds.ClosePool } if self.param.Cmds.Contract != nil { self.s.Desc_Cmd.Contract = self.param.Cmds.Contract a = &self.param.Cmds.Contract.Asset } if self.param.Cmds.PkgCreate != nil { create := self.param.Cmds.PkgCreate self.s.Desc_Pkg.Create = &stx.PkgCreate{} self.s.Desc_Pkg.Create.PKr = create.PKr self.s.Desc_Pkg.Create.Id = create.Id create.Ar = c_superzk.RandomFr() if cm, _, err := c_superzk.GenAssetCM_PC(create.Asset.ToTypeAsset().NewRef(), &create.Ar); err != nil { e = err return } else { self.s.Desc_Pkg.Create.Pkg.AssetCM = cm } sk := self.param.From.SKr.ToUint512() tk, err := superzk.Sk2Tk(&sk) if err != nil { e = err return } key := pkg.GetKey(&self.param.From.PKr, &tk) if einfo, err := c_superzk.EncInfo(&key, create.Asset.ToTypeAsset().NewRef(), &create.Memo, &create.Ar); err != nil { e = err return } else { self.s.Desc_Pkg.Create.Pkg.EInfo = einfo } } if self.param.Cmds.PkgTransfer != nil { change := self.param.Cmds.PkgTransfer self.s.Desc_Pkg.Transfer = &stx.PkgTransfer{} self.s.Desc_Pkg.Transfer.Id = change.Id self.s.Desc_Pkg.Transfer.PKr = change.PKr } if self.param.Cmds.PkgClose != nil { close := self.param.Cmds.PkgClose self.s.Desc_Pkg.Close = &stx.PkgClose{} self.s.Desc_Pkg.Close.Id = close.Id self.balance_desc.Zin_acms = append(self.balance_desc.Zin_acms, close.AssetCM[:]...) self.balance_desc.Zin_ars = append(self.balance_desc.Zin_ars, close.Ar[:]...) } if a != nil { if cc, err := c_superzk.GenAssetCC(a.ToTypeAsset().NewRef()); err != nil { e = err return } else { self.ck.AddOut(a) self.balance_desc.Oout_accs = append(self.balance_desc.Oout_accs, cc[:]...) } } return } func (self *sign_ctx) genInsP0() (e error) { for _, in := range self.p0_ins { sk := in.SKr.ToUint512() tk, _ := superzk.Sk2Tk(&sk) t_in := stx_v1.In_P0{} t_in.Root = in.Out.Root if t_in.Trace, e = c_superzk.Czero_genTrace(&tk, in.Out.State.OS.RootCM); e != nil { return } if t_in.Nil, e = c_superzk.Czero_genNil(&sk, in.Out.State.OS.RootCM); e != nil { return } var asset_desc assets.Asset if in.Out.State.OS.Out_O != nil { asset_desc = in.Out.State.OS.Out_O.Asset } else { if key, flag, err := c_superzk.Czero_fetchKey(&tk, &in.Out.State.OS.Out_Z.RPK); err != nil { e = err return } else { t_in.Key = &key if out := ConfirmOutZ(&key, flag, in.Out.State.OS.Out_Z); out == nil { e = errors.New("gen tx1 confirm outz error") return } else { asset_desc = out.Asset } } } if cc, err := c_superzk.GenAssetCC(asset_desc.ToTypeAsset().NewRef()); err != nil { e = err return } else { self.ck.AddIn(&asset_desc) self.balance_desc.Oin_accs = append(self.balance_desc.Oin_accs, cc[:]...) } self.s.Tx1.Ins_P0 = append(self.s.Tx1.Ins_P0, t_in) } return } func (self *sign_ctx) genInsP() (e error) { for _, in := range self.p_ins { sk := in.SKr.ToUint512() tk, _ := superzk.Sk2Tk(&sk) t_in := stx_v1.In_P{} t_in.Root = in.Out.Root t_in.Nil, e = c_superzk.GenNil(&tk, in.Out.State.OS.RootCM, in.Out.State.OS.ToPKr()) if e != nil { return } var asset_desc assets.Asset if in.Out.State.OS.Out_P != nil { asset_desc = in.Out.State.OS.Out_P.Asset } else { if out_c := in.Out.State.OS.Out_C; out_c != nil { if key, _, err := c_superzk.FetchKey(&out_c.PKr, &tk, &out_c.RPK); err != nil { e = err return } else { if dout, _ := ConfirmOutC(&key, out_c); dout == nil { e = errors.New("gen tx1 confirm outz error") return } else { t_in.Key = &key asset_desc = dout.Asset } } } else { e = errors.New("gen in_p but no out_p or out_c") } } if cc, err := c_superzk.GenAssetCC(asset_desc.ToTypeAsset().NewRef()); err != nil { e = err return } else { self.ck.AddIn(&asset_desc) self.balance_desc.Oin_accs = append(self.balance_desc.Oin_accs, cc[:]...) self.s.Tx1.Ins_P = append(self.s.Tx1.Ins_P, t_in) } } return } func (self *sign_ctx) genInsC() (e error) { for _, in := range self.c_ins { sk := in.SKr.ToUint512() tk, _ := superzk.Sk2Tk(&sk) t_in := stx_v1.In_C{} t_in.Nil, e = c_superzk.GenNil(&tk, in.Out.State.OS.RootCM, in.Out.State.OS.ToPKr()) if e != nil { return } key, vskr, err := c_superzk.FetchKey(&in.Out.State.OS.Out_C.PKr, &tk, &in.Out.State.OS.Out_C.RPK) if err != nil { e = err return } in.Vskr = &vskr dout, ar_old := ConfirmOutC(&key, in.Out.State.OS.Out_C) if dout == nil { e = errors.New("gen in_c error: can not find out_c") return } in.ArOld = &ar_old //self.keys = append(self.keys, key) in.Ar = c_superzk.RandomFr().NewRef() cm, cc, err := c_superzk.GenAssetCM_PC(dout.Asset.ToTypeAsset().NewRef(), in.Ar) if err != nil { e = err return } t_in.AssetCM = cm in.CC = &cc in.A = c_superzk.RandomFr().NewRef() t_in.ZPKa, e = c_superzk.GenZPKa(&in.Out.State.OS.Out_C.PKr, in.A) if e != nil { return } t_in.Anchor = in.Witness.Anchor self.balance_desc.Zin_acms = append(self.balance_desc.Zin_acms, t_in.AssetCM[:]...) self.balance_desc.Zin_ars = append(self.balance_desc.Zin_ars, in.Ar[:]...) self.s.Tx1.Ins_C = append(self.s.Tx1.Ins_C, t_in) baser := c_superzk.ClearPKr(in.Out.State.OS.ToPKr()).BASEr() self.bases = append(self.bases, baser) } return } func (self *sign_ctx) genOutsC() (e error) { for _, out := range self.c_outs { t_out := stx_v1.Out_C{} out.Ar = c_superzk.RandomFr().NewRef() t_out.AssetCM, _, e = c_superzk.GenAssetCM_PC(out.Asset.ToTypeAsset().NewRef(), out.Ar) if e != nil { return } t_out.PKr = out.PKr var key c_type.Uint256 key, t_out.RPK, _, e = c_superzk.GenKey(&out.PKr) if e != nil { return } t_out.EInfo, e = c_superzk.EncInfo(&key, out.Asset.ToTypeAsset().NewRef(), &out.Memo, out.Ar) if e != nil { return } self.balance_desc.Zout_acms = append(self.balance_desc.Zout_acms, t_out.AssetCM[:]...) self.balance_desc.Zout_ars = append(self.balance_desc.Zout_ars, out.Ar[:]...) self.s.Tx1.Outs_C = append(self.s.Tx1.Outs_C, t_out) self.keys = append(self.keys, key) } return } func (self *sign_ctx) genOutsP() (e error) { for _, out := range self.p_outs { t_out := stx_v1.Out_P{} t_out.PKr = out.PKr t_out.Asset = out.Asset t_out.Memo = out.Memo if cc, err := c_superzk.GenAssetCC(out.Asset.ToTypeAsset().NewRef()); err != nil { e = err return } else { self.ck.AddOut(&out.Asset) self.balance_desc.Oout_accs = append(self.balance_desc.Oout_accs, cc[:]...) self.s.Tx1.Outs_P = append(self.s.Tx1.Outs_P, t_out) } } return } func (self *sign_ctx) genSign() (e error) { self.balance_desc.Hash = self.s.Tx1_Hash() if e = self.signFrom(); e != nil { return } if e = self.signInsP0(); e != nil { return } if e = self.signInsP(); e != nil { return } if e = self.signInsC(); e != nil { return } if e = self.signPkg(); e != nil { return } if e = self.signBalance(); e != nil { return } return } func (self *sign_ctx) signFrom() (e error) { if sign, err := c_superzk.SignPKr_X(self.param.From.SKr.ToUint512().NewRef(), &self.balance_desc.Hash, &self.s.From); err != nil { return err } else { self.s.Sign = sign return nil } return } func (self *sign_ctx) signInsP0() (e error) { for i := range self.s.Tx1.Ins_P0 { t_in := self.p0_ins[i] if sign, err := c_superzk.SignNil_P0( &self.balance_desc.Hash, t_in.SKr.ToUint512().NewRef(), t_in.Out.State.OS.ToPKr(), t_in.Out.State.OS.RootCM.NewRef(), ); err != nil { e = err return } else { self.s.Tx1.Ins_P0[i].Sign = sign } } return } func (self *sign_ctx) signInsP() (e error) { for i := range self.s.Tx1.Ins_P { t_in := self.p_ins[i] if sign, err := c_superzk.SignPKr_P(t_in.SKr.ToUint512().NewRef(), &self.balance_desc.Hash, t_in.Out.State.OS.ToPKr()); err != nil { return err } else { self.s.Tx1.Ins_P[i].ASign = sign } tk, _ := superzk.Sk2Tk(t_in.SKr.ToUint512().NewRef()) if sign, err := c_superzk.SignNil( &tk, &self.balance_desc.Hash, t_in.Out.State.OS.RootCM.NewRef(), t_in.Out.State.OS.ToPKr(), ); err != nil { e = err return } else { self.s.Tx1.Ins_P[i].NSign = sign } } return } func (self *sign_ctx) signInsC() (e error) { for i := range self.s.Tx1.Ins_C { t_in := self.c_ins[i] if sign, err := c_superzk.SignZPKa(t_in.SKr.ToUint512().NewRef(), &self.balance_desc.Hash, t_in.A, t_in.Out.State.OS.ToPKr()); err != nil { e = err return } else { self.s.Tx1.Ins_C[i].Sign = sign } } return } func (self *sign_ctx) signPkg() error { if self.param.Cmds.PkgTransfer != nil { if sign, err := c_superzk.SignPKr_X(self.param.From.SKr.ToUint512().NewRef(), &self.balance_desc.Hash, &self.param.Cmds.PkgTransfer.Owner); err != nil { return err } else { self.s.Desc_Pkg.Transfer.Sign = sign } } if self.param.Cmds.PkgClose != nil { if sign, err := c_superzk.SignPKr_X(self.param.From.SKr.ToUint512().NewRef(), &self.balance_desc.Hash, &self.param.Cmds.PkgClose.Owner); err != nil { return err } else { self.s.Desc_Pkg.Transfer.Sign = sign } } return nil } func (self *sign_ctx) signBalance() (e error) { if len(self.balance_desc.Zin_acms) > 0 || len(self.balance_desc.Zout_acms) > 0 { if e = c_superzk.SignBalance(&self.balance_desc); e != nil { return } if self.balance_desc.Bcr == c_type.Empty_Uint256 { return errors.New("sign balance failed!!!") } else { self.s.Bcr = self.balance_desc.Bcr self.s.Bsign = self.balance_desc.Bsign return nil } } else { if e = self.ck.Check(); e != nil { return } else { return } } } ================================================ FILE: zero/txtool/generate/generate_1/sign_test.go ================================================ package generate_1 import ( "encoding/json" "fmt" "testing" "github.com/sero-cash/go-czero-import/superzk" "github.com/sero-cash/go-sero/zero/txtool" ) func TestSign(t *testing.T) { superzk.ZeroInit_NoCircuit() str := "{\"Cmds\": { \"BuyShare\": null, \"ClosePool\": null, \"Contract\": null, \"PkgClose\": null, \"PkgCreate\": null, \"PkgTransfer\": null, \"RegistPool\": null }, \"Fee\": { \"Currency\": \"0x000000000000000000000000000000000000000000000000000000005345524f\", \"Value\": \"25000000000000\" }, \"From\": { \"PKr\": \"0xc200d439f05f4cd23e367abc41c505e0f79990a1eee5613cd2033dee36077511b34214e3e0786e14536d22f0b2d7e0068bec6284b626e46f59f974b21d371020948ab05d5c21304e4c4963375c24736670b63a025c709f0b6b97f04a6c1b8b2c\", \"SKr\": \"0x38da86e05a64c7020db02312130e832e299d96830e7455f6b62da898fc044901ea6b778dfe5206460b35fa4ac75a65fa651c3b8cb5ffcc65d38e5c0a3d0bc9010000000000000000000000000000000000000000000000000000000000000000\" }, \"Gas\": 25000, \"GasPrice\": 1000000000, \"Ins\": [{ \"A\": null, \"Ar\": null, \"ArOld\": null, \"CC\": null, \"Out\": { \"Root\": \"0x5122d953535832ab6f2549fb07c1a48301e417acf08a471d5b873552d0304916\", \"State\": { \"Num\": 29, \"OS\": { \"Index\": 29, \"OutCM\": null, \"Out_C\": null, \"Out_O\": null, \"Out_P\": null, \"Out_Z\": { \"AssetCM\": \"0x7d02ba2fd5b686e76603cc2c14b8c400013611484dae4f534a2753a89e768208\", \"EInfo\": \"0x172c7962c348449ce8fcea9fa4279eaed4eeb7717ecd669d08c6ba527ac74754d3e64984b54cdbea6c132c08b65494de41e26703b9663de96842f481b46f8f656c8f064f99bf8d1b0c1e813a988f23075d6e591c055f9b814a48dbfc4bc262ea8c9a2cfa5447901c33d9d75be717f0c729f9825ffbc0924e06982279ebfb02969a586894c68a088c673f117019c6c551ca54bdb174c4da2a2c9c86d1dfc26c4d6c5d983343db87cede81b92ad181c6ee58df4658cd65b4da873cb9413eb812c34c38666de024fcfc781f3e9989563e8a822ddf72b1d250b99c68adf54c105acd\", \"OutCM\": \"0xaa39041683a7b143c22d678daea4aab713e34e928799587464832acf55253590\", \"PKr\": \"0x3e9a783dc651deca5a801c0a5e490c4fbb82fb0ea0d034642578443f6f879c955537c687923f76efc82abf3dca117e31bcb5df2adf29aa1236a36855987f66a28d00fc36daca0488d0d8b4c041ed954e286ea94198f32a1e76012440f3e18c82\", \"Proof\": \"0x0214ce94b025a44e68333c8a05e5a63a5141c3042d35b96bef9980df81180adf000a62802b1f7d9435b1a6bca401a9258335805a1c75b488f7e8e8a12ccb29ecd87c98c29974fe2ac337c250f9b5f1407d540040a7b569170a1943779b5de22776040249b0b6bfad004385bec0573d6f77ede1c2ae28bf739caca7df05ff45ec3a2c20\", \"RPK\": \"0xc58c5fd31db5f4f2b65632a8e916f59bbf354e35b70abef79a35b2ac6fad43c1\" }, \"RootCM\": \"0x2e78f95db341d04d5e4b6f9201eff7453d8860d84a7c804bca42b5d1ef91f112\" }, \"TxHash\": \"0xfa98a9c4a2dae32d4f9b90c7f263352a253018fae4330a559077243b6328d77e\" } }, \"SKr\": \"0x38da86e05a64c7020db02312130e832e299d96830e7455f6b62da898fc044901ea6b778dfe5206460b35fa4ac75a65fa651c3b8cb5ffcc65d38e5c0a3d0bc9010000000000000000000000000000000000000000000000000000000000000000\", \"Vskr\": null, \"Witness\": { \"Anchor\": \"0x868bb7990cc2423d46eed1eac70a85acbf98c32f48194e3602bb118607509e10\", \"Paths\": [\"0x4816b0f4f85ac8c25279424b08d8662d831a641e4a31a03bfd0aa083678ab185\", \"0x40163431945acd58343ea4e5a7ea4d1a256c767ebb3ab669975e53da93f40d8c\", \"0xabb1f1d8cc981b4e6c4d75f6343c7d20923fd1531478e00e1912be084bfd6218\", \"0xad15866081d2a25f42e6ba874b2167184dd83013ceb21a5a8edffd09f8771a96\", \"0x2676d074fd027c9ea610408ca619771fe38c653ff024f2f3aca637e5c95b020e\", \"0x75720bad848dc8d1909c2a7201564f6ea10434a565b364a3c4c9328b78d8bc05\", \"0x6eb9d1bbaad7ae8e1ad41b2be597da14321efdbc9c7f4358e6525789d4318c8b\", \"0xa0f4e174f7fe46368a2c4ed56659c672e0187d0bca2e7619660b9e38564a958e\", \"0x19faaa87edc67b3a03edb38a7690e88bb35f90eaa38556adf4eea04f0a41329b\", \"0x78e2fae5201f6e8b5bcbb7d2cfd9a05b51ee5daac55dc1c67d5bf9496443b124\", \"0x8c473676e83787c7748e9d956e0fd2f316e00dd13771f2cee0367fcf5588f40c\", \"0x6488a7d2ae45fe1f028a2b3d140073efba82aba8db01e9c96d165d515a2b5ead\", \"0xc2baf1c827cfce1eb852561d737b454fe12c7555945ba68017fa6222c93d7f1d\", \"0xc6052c7af376fef1daf078b85913d5b147a68f4c6de75cc9e49399d62a515c92\", \"0xbddc1775065a6ee9386737303af7b9da6ad995c369706fbdcf4a7fcb8cc2cca0\", \"0xd14f617a18014f5bb594e7ca4c999354bc095a6b136a6cd3d097928fe3defd86\", \"0xcfe35d771cfcc111868b623b0885277c74b94f6f5bc544c78c66bc0b5458a524\", \"0x4163b9a6368d125edd8ee3e538f320752b0bd0f113dd79349a72fa3af06c64ab\", \"0x78cb874b15e37a66ae8eee4cf13b1e8af6e63ea72c234067a1023f1f6d989a06\", \"0x13c184ef8cd27a98857dcf2c0a21cefde8808551b4fbc18b1a62b97186662990\", \"0x93584e7b2c0ced44fca221aa0d934cedb1cddb82e0296f041b1934875d505986\", \"0x77865dd539eda3960520bee9cd3e0a8563b9a0ddc854885a1d9dee14b11b3da0\", \"0x8665f83639732248eeba9454540184cc94598e0fe73d126b6e3db31725352f28\", \"0xa322e919186a4b2f2039601db976b005e7b2968e56d75cbf71a77bbe8905292b\", \"0xb995f437374bd1e1a9eb3443bc3d7855f15b4d6ce628051332fe20a3a8cd0e9c\", \"0x75df3f7f39ed5132f0b10ca3d97487eca629128ad37d4e6b5ba391ece4f4702c\", \"0xf59c191e25659b57738ef22ede3d6113091d0425f40ec862de14bf1149fb382e\", \"0xa9588c6ec3513da0ecfdb7967fcf6711ca3566e5ae1b8b60bcc7d54a123f2a07\", \"0x3edc6044a176db79bb6ffccd3f3c950cb5a56b9ba65d4243e9e03cbcf4bbe382\"], \"Pos\": \"0x1d\" } }], \"Outs\": [{ \"Ar\": null, \"Asset\": { \"Tkn\": { \"Currency\": \"0x000000000000000000000000000000000000000000000000000000005345524f\", \"Value\": \"1\" }, \"Tkt\": null }, \"Memo\": \"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"PKr\": \"0xa8e68b2b7398c188fa431ecf89ce51aa0646c7cc6656cb02de7ee44cc73eec084ea84b8185cfd99d3e5cdb76171a108a35aa858e710dd824175b7f9c35e3f2286ae0e1b5980e64711352822720d083b16472c4cf2226535457cab5b45491f0d8\" }, { \"Ar\": null, \"Asset\": { \"Tkn\": { \"Currency\": \"0x000000000000000000000000000000000000000000000000000000005345524f\", \"Value\": \"7999974999999999999\" }, \"Tkt\": null }, \"Memo\": \"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"PKr\": \"0xc200d439f05f4cd23e367abc41c505e0f79990a1eee5613cd2033dee36077511b34214e3e0786e14536d22f0b2d7e0068bec6284b626e46f59f974b21d371020948ab05d5c21304e4c4963375c24736670b63a025c709f0b6b97f04a6c1b8b2c\" }], \"Z\": true }" param := &txtool.GTxParam{} json.Unmarshal([]byte(str), param) //param.Z = nil ctx, e := SignTx(param) fmt.Println(e) bytes, _ := json.Marshal(ctx.Tx()) fmt.Println(string(bytes)) tx := ctx.Tx() _, er := ProveTx(&tx, param) fmt.Println(er) } ================================================ FILE: zero/txtool/generate/generate_1/utils.go ================================================ package generate_1 import ( "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-sero/zero/txs/stx/stx_v0" "github.com/sero-cash/go-sero/zero/txs/stx/stx_v1" "github.com/sero-cash/go-sero/zero/txtool" ) func ConfirmOutC(key *c_type.Uint256, outc *stx_v1.Out_C) (dout *txtool.TDOut, ar c_type.Uint256) { info := c_superzk.DecInfoDesc{} info.Key = *key info.Einfo = outc.EInfo c_superzk.DecOutput(&info) asset_desc := c_superzk.AssetDesc{} asset_desc.Asset = info.Asset_ret asset_desc.Ar = info.Ar_ret ar = asset_desc.Ar if e := c_superzk.GenAssetCM(&asset_desc); e != nil { return } if asset_desc.Asset_cm_ret == outc.AssetCM { dout = &txtool.TDOut{} dout.Asset = assets.NewAssetByType(&info.Asset_ret) dout.Memo = info.Memo_ret return } else { return } } func ConfirmOutZ(key *c_type.Uint256, flag bool, outz *stx_v0.Out_Z) (dout *txtool.TDOut) { if asset, rsk, memo, e := c_superzk.Czero_decEInfo(key, flag, &outz.EInfo); e != nil { return } else { if out_cm, err := c_superzk.Czero_genOutCM(&asset, &memo, &outz.PKr, &rsk); err != nil { return } else { if out_cm != outz.OutCM { return } else { dout = &txtool.TDOut{} dout.Asset = assets.NewAssetByType(&asset) dout.Memo = memo return } } } } ================================================ FILE: zero/txtool/gtx_test.go ================================================ package txtool import ( "encoding/json" "fmt" "testing" "github.com/sero-cash/go-sero/common" ) func TestHash(t *testing.T) { str := "{\"Gas\":\"0x61a8\",\"GasPrice\":\"0x3b9aca00\",\"Tx\":{\"Desc_O\":{},\"Desc_Z\":{},\"Desc_Pkg\":{},\"Desc_Cmd\":{},\"Tx1\":{\"Ins_P\":[{\"Root\":\"0xf7b106944ab25059519a34737ca69602677e2a3990f3df76dae0e1209f655c2e\",\"Nil\":\"0x66e4d272b05d2ce6db32597d9e1ca498205f44108d9d47607d63eb795fb8b051\",\"ASign\":\"0xa87565d07ef40617004d84b3b9c01d9964966b73e51aeb54b8b6af8564c9701ebc829323465fa0eab9145a1a53551ec976dd0a439ca8809cbd8a01cd3f1d7d00\",\"NSign\":\"0x5f6ec704660e3c0885cebd9da6752a0251c1406b3043154cd76cedb14587ed01c6c9ec82ef4d3b438eaf77196bdb3079c515bd4e1f0518e49a60df1f1fb1a4809f5fef3e8fd4b18378b8d6e5a8b2ca911ba6a7994ad46395c04099d3da31428f\"}],\"Ins_P0\":[],\"Ins_C\":[],\"Outs_C\":[{\"AssetCM\":\"0xc35cfaefa805cbf699d4709bd859c3db605266d7b91437aa3eaf02558d9e15a3\",\"PKr\":\"0x9c06afd139faaebf52ce2fa878a3a8634922024241a74aefe1cfa71040ab4591da3bd4e399a12897f08f521d207d1d10960ec1a2765abd7bb1183a779932de25726ba54e9aeb13d9b5ed6684cc4f1d7e02d6395b4a9952381d0bcdc743c8c1d7\",\"RPK\":\"0x84bb7417e4bb006d98bf0b5090462ed6bb97a148e180cdea70b77a10bd45bd0c\",\"EInfo\":\"0xb4310cbce58078bda847647383f7a4e1243dcc307df83dd710e40020f9787a87398544ac35a61ae3da6bf635d011bce6920a038226de74413ee3f9c042c0ca7dd5781772b2bf1b2fd28b3a8416b1dc14b1c80b8805e72868e3fa6048be6ce1ecfa57dc87375cf8e7bc2363e8aeeec1605c2251433d62e65d319edb2fd4c8a83ae008aa77d5a58577a6d79d9a6188bc78c3b65b7b52ca7d2565e0ccc29f4dc415604776ddc0e238c939f55aea670dfa82524bef4bf03ba5d509dc5b39563f1592950065d7c24ddb9367a85f788456edbbd511f4d7be7cbb0e90fe3af9754a9367\"},{\"AssetCM\":\"0x7bf388d5929c20ac0ca7f7496d68946d799b92f66787362eb9a600afa51a10aa\",\"PKr\":\"0x37fffccf6c32303e14670257e87f64cd81781574a04ff5b27fcc18fe0ca8b928f5a62be6d74218c948a4d92862579e1094d2ecf0c1e37e0bc197896524e73c979cce512ef12dddbfc9d019341853207e2396b3aaed7f9d7fd3f31b60e587a867\",\"RPK\":\"0x3d9737be5b9ab7f066b79e17c2d8319dd716df819eab1f8952435172d2c60a1d\",\"EInfo\":\"0x86b0aa3a076a606d116a497ec52e98eb7396462da0fa0732ce85ea115e81a4f006b748e59a65c3f81367eda8b6d13b87a0c1d0ca21654e6ef98228817bbb1c8f89d22a2e21965e1053b6690453dce1a094e9f355c2ee9637f4dc3f2d2a8d3acdb7864752e21d6d362776091754b96bae12b73922ad113d9e7af9e48bbcfd335ad1e11c4091263d12e2fd7cf66d19ec477c2d43a97c8b856a10addac28df26a43b3cf106343a367ba72d0932aff8833f4b648c488cef3b7eabdd1290ce294bbb6c0a9b9c28d695bbdef34f0f3c4745ea419b318d0e2bdbc041ea143c2389d59a5\"}],\"Outs_P\":[]},\"Bcr\":\"0x818abb14d68d167e3f1c322f4d90b170acf494a4e137684d2491801124a385a4\",\"Bsign\":\"0x69d3a1b89ce0fca3dc4af13b09bb563401963796cb3a0021ddcc26ac7de8008bff93e3ac9336aa3f9e711810b09ab0f4cd479d5747d6e48ef289a3e4f4278101\",\"Ehash\":\"0x59bd488f5e20e9b883fb510f5cf33ead2105f39adaec025bf9218e4e16a2e2b0\",\"From\":\"0x37fffccf6c32303e14670257e87f64cd81781574a04ff5b27fcc18fe0ca8b928f5a62be6d74218c948a4d92862579e1094d2ecf0c1e37e0bc197896524e73c979cce512ef12dddbfc9d019341853207e2396b3aaed7f9d7fd3f31b60e587a867\",\"Fee\":{\"Currency\":\"0x000000000000000000000000000000000000000000000000000000005345524f\",\"Value\":\"25000000000000\"},\"Sign\":\"0xfa4be5a89c70b7663995af09583ab067c5e1685b160a7a941bff9e531e92d02f88efca9ac2923065106c9dd0a195f0a6699f5079e9292ce8f60888d694386403\"},\"Hash\":\"0xb9793158922500e8330c2c87bd3099d761724a47a1edbb9158bb89a87bef11e8\"}" tx := GTx{} json.Unmarshal([]byte(str), &tx) ret := tx.Tx.ToHash() fmt.Println(common.Bytes2Hex(ret[:])) tx1_hash := tx.Tx.Tx1_Hash() fmt.Println("tx1_hash", common.Bytes2Hex(tx1_hash[:])) tx1_tohash := tx.Tx.Tx1.ToHash() fmt.Println("tx1_tohash", common.Bytes2Hex(tx1_tohash[:])) // bytes, _ := json.Marshal(tx) // fmt.Println(string(bytes)); } func TestJson() { // str := "{\"Gas\":90000,\"GasPrice\":1000000000,\"Fee\":{\"Currency\":\"0x000000000000000000000000000000000000000000000000000000005345524f\",\"Value\":\"90000000000000\"},\"From\":{\"SKr\":\"0x8e0d8402367784517c1a7f3f11940747f519d5dc33636ad2af373ee6b44877006c4d2a8607922277d6a0635b2ff6fa25d7db06ed65619507169e0ee7089203030000000000000000000000000000000000000000000000000000000000000000\",\"PKr\":\"0xed75a97a82f8266115e967734747de0db062b467563116fbfd73d909c9b464aff47ca967203cafc7aaf4f89d0282bbdeebcda08663cdf9d7c57732a396a1fa068289fa3f5f27c44a936e08b734de8b4af103c952589a917539077bb901431bc1\"},\"Ins\":[{\"SKr\":\"0x8e0d8402367784517c1a7f3f11940747f519d5dc33636ad2af373ee6b44877006c4d2a8607922277d6a0635b2ff6fa25d7db06ed65619507169e0ee7089203030000000000000000000000000000000000000000000000000000000000000000\",\"Out\":{\"Root\":\"0x683dfbbba9e686db3f2ca23f2cb993cca9427bb0e1e2ce510f3bad9293c24a2f\",\"State\":{\"OS\":{\"Index\":21,\"Out_O\":null,\"Out_Z\":null,\"Out_P\":{\"PKr\":\"0x385f1b179fb44e9f804c3e8a2e742f832207f3e3330e082c0abbd1b3c905eb2ca2e7f8be409341ec2259572ca3b8193d19b929411270233464c5f9fbab28cd2ebfe1442e0a69888e69d20abc1ddca7bd619a5ddec66184cc106f10f6e7172ef0\",\"Asset\":{\"Tkn\":{\"Currency\":\"0x000000000000000000000000000000000000000000000000000000005345524f\",\"Value\":\"65000000000000\"},\"Tkt\":null},\"Memo\":\"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\"},\"Out_C\":null,\"OutCM\":null,\"RootCM\":\"0xe2e35de2e89d05abb6988f8a6418dee37cac0ca34b0a969e2a68846a26311c9a\"},\"TxHash\":\"0xd2c9507cfda88ce89542798a743a343d9d6101d163273e28242fc4ab0f659c87\",\"Num\":79}},\"Witness\":{\"Pos\":\"0x15\",\"Paths\":[\"0x568c4229a69a833b0de0a0716a2de1c45cd16da96bd0383b09e07f96d5cf1683\",\"0x0100000000000000000000000000000000000000000000000000000000000000\",\"0xff6a7f715e73e79878d4c5ee6ea1133b056f078bef296346e01605dccdeb4d97\",\"0x130adf7ac88bef31232230e2954ce96f35945f640c7517930ab14d89a995bc1c\",\"0xf507f7f38d8c1cd206d898e1bde0285f81b39381a7275bd53732b0cca8278c2c\",\"0x9cda5493957ef78fa117f61252eb9b79e835906dd62f4f230964b4c2b790b892\",\"0xff3bd1141de02f0c80b435835dbb245fd5f47295e94df8935269940ae3940209\",\"0xf57f2632fe188f663c4bd0215aab05170aeb2abebadd28132ef279c5b49f79ae\",\"0xc0f73a47ede0ce8d04cc301e0ecd44148fbf887068b153e297550690fe67061f\",\"0x75eb8ed603b7e4ef3f5ad521f318b08030b25ea492ff84bc20773ed75d88570b\",\"0x9bdd82fcd971d4159e17a321242575fc15d6c56151edccc9f312a8d7e75edb2a\",\"0x50813d276f42fc0a25719f10ef573feef34ce47e2cdcdfd8ae0fa17dce70e698\",\"0xcbd115a1efe853defd7fc120b08606fa7f389c3f9425b747950682c1e09deb12\",\"0x80c0d8b03bff5f553da3fc641866ac3afbbf310908569daddf5e0e7092ad62a0\",\"0x7865c55ce8f7cb355aca5f593426d38b5f82bf0b9f4d19784d75ab498b3ca8ac\",\"0x2ceadea63565bfa72235374aa70c6ff9146456dab2a1febb1b83df2bb0b5bf90\",\"0x3686698d6e508112eb93891d48c7b50e12d54914bfdd437076ceaa60ef696e88\",\"0x311565e80def136b1a7838d09a2f1f0bfd7b7ac2a6d04d4cb6cb2efd4b33b011\",\"0x9f3b87c8faa34d9104e865b38b3cb87bc5ff71cb0a36a23b71723fbfd31fa72a\",\"0xdbdbab4b98abd0fb19465930710c700bfb07cede792139f1b4a49f340a161f24\",\"0x68b4a158325154aee284f9aec951c0da13fe4b44c9188973644a7b68f78735ac\",\"0xfb9cbf55b5bb63b8e420be52a51ffcf8bbbe878afc696ca70f3f4f2f3358260c\",\"0x31f7aa53943b9bfe0ccc6f8e25479952f2b446ffa731ef90e45a395b2b4a6e09\",\"0x447bdf93bb335d8b268dc74569477a5717197fe538795acdf6ab63fb3d848a98\",\"0x79808b4393da03ae5d0b064b532972d235b571fbc7d5900fe745834385c6981c\",\"0x042415ac74349b1eb318c113474f3b2373fcf4915f9224208f8a70224c10ac03\",\"0xf3519d004458238b7277d6cae47c966cc1b2131bbc14bb6ad8c95d4b1cb75425\",\"0xbc656cd9fd825411e4f2a1da79073c1bb4083432a6aebb80947be38a94cdba80\",\"0x24378894a012b4e87b04e8d4613b81d1795d87089f83c86f6c42cd8c3c67898e\"],\"Anchor\":\"0x683dfbbba9e686db3f2ca23f2cb993cca9427bb0e1e2ce510f3bad9293c24a2f\"},\"A\":null,\"Ar\":null},{\"SKr\":\"0x8e0d8402367784517c1a7f3f11940747f519d5dc33636ad2af373ee6b44877006c4d2a8607922277d6a0635b2ff6fa25d7db06ed65619507169e0ee7089203030000000000000000000000000000000000000000000000000000000000000000\",\"Out\":{\"Root\":\"0xb146c4181ae841c64f5eb20e090e01cd580a28b6774d7c10226dfe603bd3fb22\",\"State\":{\"OS\":{\"Index\":20,\"Out_O\":null,\"Out_Z\":null,\"Out_P\":null,\"Out_C\":{\"PKr\":\"0x385f1b179fb44e9f804c3e8a2e742f832207f3e3330e082c0abbd1b3c905eb2ca2e7f8be409341ec2259572ca3b8193d19b929411270233464c5f9fbab28cd2ebfe1442e0a69888e69d20abc1ddca7bd619a5ddec66184cc106f10f6e7172ef0\",\"AssetCM\":\"0x37967302a56a32104a73edda03c03bc65929e84324080d72bc093ee057eac196\",\"RPK\":\"0x37daffa4de3416dd57e1a36256224fd63050f9714593ff791a2a0747727dcc96\",\"EInfo\":\"0xbacbf563267e46729761d0909fca5cc322a01c5c131811daa50ecec3f7fad0830e44a1c6435ae6bd4715c3a3e8e6a1b100832c8350684e83d7a2c64d623fe717809df12528f58bc1ae0ddfa8aeb029a8ffbc910d8a2e3d43760eecb0344c2af1f31b0256bfbaaaeb3960f85665dc566f6ab4941051baab11951bd169835356326219babb70d4ae466ca11661cdefdab339389d37e763531b3de9754bbcb391eaf68923c3feaa0a76c86510ec0a54fc78ce005e4f8f478a29e36063651e239bd2600a5ea444cf1b8381294a099429e0db319c14d8b444a211cb1a1d9a561d2e08\",\"Proof\":\"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\"},\"OutCM\":null,\"RootCM\":\"0x568c4229a69a833b0de0a0716a2de1c45cd16da96bd0383b09e07f96d5cf1683\"},\"TxHash\":\"0xd2c9507cfda88ce89542798a743a343d9d6101d163273e28242fc4ab0f659c87\",\"Num\":79}},\"Witness\":{\"Pos\":\"0x14\",\"Paths\":[\"0xe2e35de2e89d05abb6988f8a6418dee37cac0ca34b0a969e2a68846a26311c9a\",\"0x0100000000000000000000000000000000000000000000000000000000000000\",\"0xff6a7f715e73e79878d4c5ee6ea1133b056f078bef296346e01605dccdeb4d97\",\"0x130adf7ac88bef31232230e2954ce96f35945f640c7517930ab14d89a995bc1c\",\"0xf507f7f38d8c1cd206d898e1bde0285f81b39381a7275bd53732b0cca8278c2c\",\"0x9cda5493957ef78fa117f61252eb9b79e835906dd62f4f230964b4c2b790b892\",\"0xff3bd1141de02f0c80b435835dbb245fd5f47295e94df8935269940ae3940209\",\"0xf57f2632fe188f663c4bd0215aab05170aeb2abebadd28132ef279c5b49f79ae\",\"0xc0f73a47ede0ce8d04cc301e0ecd44148fbf887068b153e297550690fe67061f\",\"0x75eb8ed603b7e4ef3f5ad521f318b08030b25ea492ff84bc20773ed75d88570b\",\"0x9bdd82fcd971d4159e17a321242575fc15d6c56151edccc9f312a8d7e75edb2a\",\"0x50813d276f42fc0a25719f10ef573feef34ce47e2cdcdfd8ae0fa17dce70e698\",\"0xcbd115a1efe853defd7fc120b08606fa7f389c3f9425b747950682c1e09deb12\",\"0x80c0d8b03bff5f553da3fc641866ac3afbbf310908569daddf5e0e7092ad62a0\",\"0x7865c55ce8f7cb355aca5f593426d38b5f82bf0b9f4d19784d75ab498b3ca8ac\",\"0x2ceadea63565bfa72235374aa70c6ff9146456dab2a1febb1b83df2bb0b5bf90\",\"0x3686698d6e508112eb93891d48c7b50e12d54914bfdd437076ceaa60ef696e88\",\"0x311565e80def136b1a7838d09a2f1f0bfd7b7ac2a6d04d4cb6cb2efd4b33b011\",\"0x9f3b87c8faa34d9104e865b38b3cb87bc5ff71cb0a36a23b71723fbfd31fa72a\",\"0xdbdbab4b98abd0fb19465930710c700bfb07cede792139f1b4a49f340a161f24\",\"0x68b4a158325154aee284f9aec951c0da13fe4b44c9188973644a7b68f78735ac\",\"0xfb9cbf55b5bb63b8e420be52a51ffcf8bbbe878afc696ca70f3f4f2f3358260c\",\"0x31f7aa53943b9bfe0ccc6f8e25479952f2b446ffa731ef90e45a395b2b4a6e09\",\"0x447bdf93bb335d8b268dc74569477a5717197fe538795acdf6ab63fb3d848a98\",\"0x79808b4393da03ae5d0b064b532972d235b571fbc7d5900fe745834385c6981c\",\"0x042415ac74349b1eb318c113474f3b2373fcf4915f9224208f8a70224c10ac03\",\"0xf3519d004458238b7277d6cae47c966cc1b2131bbc14bb6ad8c95d4b1cb75425\",\"0xbc656cd9fd825411e4f2a1da79073c1bb4083432a6aebb80947be38a94cdba80\",\"0x24378894a012b4e87b04e8d4613b81d1795d87089f83c86f6c42cd8c3c67898e\"],\"Anchor\":\"0x683dfbbba9e686db3f2ca23f2cb993cca9427bb0e1e2ce510f3bad9293c24a2f\"},\"A\":null,\"Ar\":null}],\"Outs\":[{\"PKr\":\"0xa83e205ebf864e5ed78bce2dd3766253cc553324a8134ae517aefedc43700793366d8a85742a26a5d02498f6ceaa7aa4778bb6c029b39f952e7e88bfd319b7201721c261629c0677a3aaa743b85210a4f5e9f9305debb9bd6c444fdb63edcbc6\",\"Asset\":{\"Tkn\":{\"Currency\":\"0x000000000000000000000000000000000000000000000000000000005345524f\",\"Value\":\"589925000000\"},\"Tkt\":null},\"Memo\":\"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\"Ar\":null},{\"PKr\":\"0xed75a97a82f8266115e967734747de0db062b467563116fbfd73d909c9b464aff47ca967203cafc7aaf4f89d0282bbdeebcda08663cdf9d7c57732a396a1fa068289fa3f5f27c44a936e08b734de8b4af103c952589a917539077bb901431bc1\",\"Asset\":{\"Tkn\":{\"Currency\":\"0x000000000000000000000000000000000000000000000000000000005345524f\",\"Value\":\"9884410075000000\"},\"Tkt\":null},\"Memo\":\"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\"Ar\":null}],\"Cmds\":{\"BuyShare\":null,\"RegistPool\":null,\"ClosePool\":null,\"Contract\":null,\"PkgCreate\":null,\"PkgTransfer\":null,\"PkgClose\":null}}" } ================================================ FILE: zero/txtool/iface.go ================================================ package txtool import ( "math/big" "github.com/sero-cash/go-czero-import/seroparam" "github.com/sero-cash/go-sero/zero/utils" "github.com/sero-cash/go-sero/common/hexutil" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-sero/zero/txs/stx" ) type GIn struct { SKr c_type.PKr Out Out Witness Witness A *c_type.Uint256 Ar *c_type.Uint256 ArOld *c_type.Uint256 Vskr *c_type.Uint256 CC *c_type.Uint256 } type GOut struct { PKr c_type.PKr Asset assets.Asset Memo c_type.Uint512 Ar *c_type.Uint256 } type GTx struct { Gas hexutil.Uint64 GasPrice hexutil.Big Tx stx.T Hash c_type.Uint256 Roots []c_type.Uint256 Keys []c_type.Uint256 Bases []c_type.Uint256 } type GPkgCloseCmd struct { Id c_type.Uint256 Owner c_type.PKr AssetCM c_type.Uint256 Ar c_type.Uint256 } type GPkgTransferCmd struct { Id c_type.Uint256 Owner c_type.PKr PKr c_type.PKr } type GPkgCreateCmd struct { Id c_type.Uint256 PKr c_type.PKr Asset assets.Asset Memo c_type.Uint512 Ar c_type.Uint256 } type Cmds struct { //Share BuyShare *stx.BuyShareCmd //Pool RegistPool *stx.RegistPoolCmd ClosePool *stx.ClosePoolCmd //Contract Contract *stx.ContractCmd //Package PkgCreate *GPkgCreateCmd PkgTransfer *GPkgTransferCmd PkgClose *GPkgCloseCmd } type GTxParam struct { Gas uint64 GasPrice *big.Int Fee assets.Token From Kr Ins []GIn Outs []GOut Cmds Cmds Z *bool Num *uint64 IsExt *bool } func (self *GTxParam) IsSzk() (ret bool) { check := utils.NewPKrChecker() check.AddPKr(&self.From.PKr) for _, in := range self.Ins { check.AddPKr(in.Out.State.OS.ToPKr()) } for _, out := range self.Outs { check.AddPKr(&out.PKr) } return check.IsSzk() } func (self *GTxParam) GenZ() (e error) { Z := true self.Z = &Z if Ref_inst.Bc != nil { num := Ref_inst.Bc.GetCurrenHeader().Number.Uint64() if num >= seroparam.SIP7() { isExt := true self.IsExt = &isExt } self.Num = &num } return } ================================================ FILE: zero/txtool/main.go ================================================ package txtool import ( "math/big" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-czero-import/seroparam" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/serodb" "github.com/sero-cash/go-sero/zero/txs/zstate" ) type BlockChain interface { IsValid() bool GetCurrenHeader() *types.Header GetHeader(hash *common.Hash) *types.Header CurrentState(hash *common.Hash) *zstate.ZState IsContract(address common.Address) (ret bool, e error) GetSeroGasLimit(to *common.Address, tfee *assets.Token, gasPrice *big.Int) (gaslimit uint64, e error) GetTks() []c_type.Tk GetTkAt(tk *c_type.Tk) uint64 GetBlockByNumber(num uint64) *types.Block GetHeaderByNumber(num uint64) *types.Header GetDB() serodb.Database } type Ref struct { Bc BlockChain } var Ref_inst Ref func (self *Ref) SetBC(bc BlockChain) { self.Bc = bc } func (self *Ref) GetDelayedNum(delay uint64) (ret uint64) { ret = GetDelayNumber( self.Bc.GetCurrenHeader().Number.Uint64(), delay, ) return } func (self *Ref) CurrentState() (ret *zstate.ZState) { defer func() { if p := recover(); p != nil { num := self.GetDelayedNum(0) block := self.Bc.GetBlockByNumber(num) hash := block.Hash() ret = self.Bc.CurrentState(&hash) } }() num := self.GetDelayedNum(seroparam.DefaultConfirmedBlock()) block := self.Bc.GetBlockByNumber(num) hash := block.Hash() ret = self.Bc.CurrentState(&hash) return } func GetDelayNumber(current uint64, delay uint64) (num uint64) { if current < delay { return 0 } else { return current - delay } } ================================================ FILE: zero/txtool/prepare/prepare.go ================================================ package prepare import ( "errors" "fmt" "math/big" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-sero/zero/txs/pkg" "github.com/sero-cash/go-sero/zero/txtool" "github.com/sero-cash/go-sero/zero/utils" "github.com/sero-cash/go-sero/common/hexutil" ) func SelectUtxos(param *PreTxParam, generator TxParamGenerator) (utxos Utxos, e error) { if len(param.Roots) > 0 { for _, root := range param.Roots { if utxo := generator.GetRoot(&root); utxo == nil { return utxos, fmt.Errorf("can not find the utxo for root : %v", hexutil.Encode(root[:])) } else { utxos = append(utxos, *utxo) } } return } else { ck := assets.NewCKState(true, ¶m.Fee) if cmdsAsset := param.Cmds.OutAsset(); cmdsAsset != nil { ck.AddOut(cmdsAsset) } for _, reception := range param.Receptions { ck.AddOut(&reception.Asset) } if cmdsAsset, err := param.Cmds.InAsset(); err != nil { e = err return } else { if cmdsAsset != nil { ck.AddIn(cmdsAsset) } } if tks := ck.Tkts(); len(tks) > 0 { if outs, remain := generator.FindRootsByTicket(¶m.From, tks); len(remain) == 0 { utxos = append(utxos, outs...) for _, out := range outs { ck.AddIn(&out.Asset) } } else { e = errors.New("no enough unlocked utxos") return } } for _, tkn := range ck.Tkns() { outs, remain := generator.FindRoots(¶m.From, utils.Uint256ToCurrency(&tkn.Currency), tkn.Value.ToIntRef()) if remain.Sign() <= 0 { utxos = append(utxos, outs...) } else { e = errors.New("no enough unlocked utxos") return } } return } } type BeforeTxParam struct { Fee assets.Token GasPrice big.Int Utxos Utxos RefundTo c_type.PKr Receptions []Reception Cmds Cmds } func BuildTxParam( state TxParamState, param *BeforeTxParam, ) (txParam *txtool.GTxParam, e error) { txParam = &txtool.GTxParam{} ck := assets.NewCKState(false, ¶m.Fee) txParam.Fee = param.Fee txParam.GasPrice = ¶m.GasPrice txParam.From = txtool.Kr{PKr: param.RefundTo} wits, err := state.GetAnchor(param.Utxos.Roots()) if err != nil { e = err return } Ins := []txtool.GIn{} oins_count := 0 for index, utxo := range param.Utxos { if out := state.GetOut(&utxo.Root); out != nil { if ck.AddIn(&utxo.Asset) { Ins = append(Ins, txtool.GIn{Out: txtool.Out{Root: utxo.Root, State: *out}, Witness: wits[index]}) if out.OS.Out_O != nil { oins_count++ } } } else { e = fmt.Errorf("can not find Out for utxo %v", hexutil.Encode(utxo.Root[:])) return } } if oins_count > 2500 { e = fmt.Errorf("o_ins count > 2500") return } if cmdsAsset, err := param.Cmds.InAsset(); err != nil { e = err return } else { if cmdsAsset != nil { ck.AddIn(cmdsAsset) } } Outs := []txtool.GOut{} for _, reception := range param.Receptions { pkr := reception.Addr if IsPk(reception.Addr) { pk := reception.Addr.ToUint512() pkr = CreatePkr(&pk, 0) } ck.AddOut(&reception.Asset) Outs = append(Outs, txtool.GOut{PKr: pkr, Asset: reception.Asset}) } if cmdsAsset := param.Cmds.OutAsset(); cmdsAsset != nil { ck.AddOut(cmdsAsset) } tkns, tkts := ck.GetList() var maxlen int if len(tkns) > maxlen { maxlen = len(tkns) } if len(tkts) > maxlen { maxlen = len(tkts) } for i := 0; i < maxlen; i++ { a := assets.Asset{} if i < len(tkns) { tkn := tkns[i] a.Tkn = &assets.Token{} a.Tkn.Currency = tkn.Currency a.Tkn.Value = tkn.Value } if i < len(tkts) { tkt := tkts[i] a.Tkt = &assets.Ticket{} a.Tkt.Category = tkt.Category a.Tkt.Value = tkt.Value } if a.HasAsset() { ck.AddOut(&a) Outs = append(Outs, txtool.GOut{PKr: txParam.From.PKr, Asset: a}) } } if e = ck.Check(); e != nil { return } txParam.Ins = Ins txParam.Outs = Outs txParam.Cmds.Contract = param.Cmds.Contract txParam.Cmds.BuyShare = param.Cmds.BuyShare txParam.Cmds.RegistPool = param.Cmds.RegistPool txParam.Cmds.ClosePool = param.Cmds.ClosePool if param.Cmds.PkgCreate != nil { if pkg := state.GetPkgById(¶m.Cmds.PkgCreate.Id); pkg != nil { e = errors.New("create pkg but the pkg id is exsits") return } txParam.Cmds.PkgCreate = &txtool.GPkgCreateCmd{} txParam.Cmds.PkgCreate.Id = param.Cmds.PkgCreate.Id txParam.Cmds.PkgCreate.PKr = param.Cmds.PkgCreate.PKr txParam.Cmds.PkgCreate.Asset = param.Cmds.PkgCreate.Asset txParam.Cmds.PkgCreate.Memo = param.Cmds.PkgCreate.Memo } if param.Cmds.PkgTransfer != nil { if pkg := state.GetPkgById(¶m.Cmds.PkgTransfer.Id); pkg == nil { e = errors.New("transfer pkg but the pkg id is not exsits") return } else { if !pkg.Closed { txParam.Cmds.PkgTransfer = &txtool.GPkgTransferCmd{} txParam.Cmds.PkgTransfer.Id = param.Cmds.PkgTransfer.Id txParam.Cmds.PkgTransfer.PKr = param.Cmds.PkgTransfer.PKr txParam.Cmds.PkgTransfer.Owner = pkg.Pack.PKr } else { e = errors.New("transfer pkg but the pkg is closed") return } } } if param.Cmds.PkgClose != nil { if p := state.GetPkgById(¶m.Cmds.PkgTransfer.Id); p == nil { e = errors.New("close pkg but the pkg id is not exsits") return } else { if !p.Closed { txParam.Cmds.PkgClose.Id = param.Cmds.PkgClose.Id txParam.Cmds.PkgClose.Owner = p.Pack.PKr txParam.Cmds.PkgClose.AssetCM = p.Pack.Pkg.AssetCM if opkg, err := pkg.DePkg(¶m.Cmds.PkgClose.Key, &p.Pack.Pkg); err != nil { e = errors.New("close pkg but password is error") return } else { txParam.Cmds.PkgClose.Ar = opkg.Ar } } else { e = errors.New("close pkg but the pkg is closed") return } } } var contractTo *common.Address if param.Cmds.Contract != nil { if param.Cmds.Contract.To != nil { contractTo = &common.Address{} copy(contractTo[:], param.Cmds.Contract.To[:]) } } if gaslimit, err := state.GetSeroGasLimit(contractTo, &txParam.Fee, txParam.GasPrice); err != nil { e = err return } else { txParam.Gas = gaslimit } if e = txParam.GenZ(); e != nil { return } return } ================================================ FILE: zero/txtool/prepare/preparetx.go ================================================ package prepare import ( "bytes" "github.com/sero-cash/go-czero-import/superzk" "github.com/sero-cash/go-sero/zero/utils" "github.com/sero-cash/go-sero/zero/txtool" "github.com/pkg/errors" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/common" ) func GenTxParam(param *PreTxParam, gen TxParamGenerator, state TxParamState) (txParam *txtool.GTxParam, e error) { if len(param.Receptions) > 500 { return nil, errors.New("receptions count must <= 500") } utxos, err := SelectUtxos(param, gen) if err != nil { return nil, err } if param.RefundTo == nil { if param.RefundTo = gen.DefaultRefundTo(¶m.From); param.RefundTo == nil { return nil, errors.New("can not find default refund to") } } bparam := BeforeTxParam{ param.Fee, *param.GasPrice, utxos, *param.RefundTo, param.Receptions, param.Cmds, } txParam, e = BuildTxParam(state, &bparam) return } func IsPk(addr c_type.PKr) bool { byte32 := common.Hash{} return bytes.Equal(byte32[:], addr[64:96]) } func CreatePkr(pk *c_type.Uint512, index uint64) c_type.PKr { r := c_type.Uint256{} copy(r[:], common.LeftPadBytes(utils.EncodeNumber(index), 32)) if index == 0 { return superzk.Pk2PKr(pk, nil) } else { return superzk.Pk2PKr(pk, &r) } } ================================================ FILE: zero/txtool/prepare/types.go ================================================ package prepare import ( "errors" "math/big" "github.com/sero-cash/go-sero/zero/txtool/flight" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/zero/localdb" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-sero/zero/txs/pkg" "github.com/sero-cash/go-sero/zero/txs/stx" "github.com/sero-cash/go-sero/zero/txtool" ) type Reception struct { Addr c_type.PKr Asset assets.Asset } type PkgCloseCmd struct { Id c_type.Uint256 Key c_type.Uint256 } func (self *PkgCloseCmd) Asset() (ret assets.Asset, e error) { if p := txtool.Ref_inst.CurrentState().Pkgs.GetPkgById(&self.Id); p == nil { e = errors.New("close pkg but not find the pkg") return } else { if opkg, err := pkg.DePkg(&self.Key, &p.Pack.Pkg); err != nil { e = err return } else { ret = opkg.Asset return } } } type PkgTransferCmd struct { Id c_type.Uint256 PKr c_type.PKr } type PkgCreateCmd struct { Id c_type.Uint256 PKr c_type.PKr Asset assets.Asset Memo c_type.Uint512 } type Cmds struct { //Share BuyShare *stx.BuyShareCmd //Pool RegistPool *stx.RegistPoolCmd ClosePool *stx.ClosePoolCmd //Contract Contract *stx.ContractCmd //Package PkgCreate *PkgCreateCmd PkgTransfer *PkgTransferCmd PkgClose *PkgCloseCmd } func (self *Cmds) ToPkr() (ret *c_type.PKr) { if self.BuyShare != nil { return &self.BuyShare.Vote } if self.RegistPool != nil { return &self.RegistPool.Vote } if self.PkgCreate != nil { if self.PkgCreate.PKr.IsEndEmpty() { return } else { return &self.PkgCreate.PKr } } if self.PkgTransfer != nil { if self.PkgTransfer.PKr.IsEndEmpty() { return } else { return &self.PkgTransfer.PKr } } return } func (self *Cmds) InAsset() (asset *assets.Asset, e error) { if self.PkgClose != nil { if a, err := self.PkgClose.Asset(); err != nil { e = err return } else { asset = &a return } } else { return } } func (self *Cmds) OutAsset() *assets.Asset { if self.PkgCreate != nil { return &self.PkgCreate.Asset } if self.BuyShare != nil { asset := self.BuyShare.Asset() return &asset } if self.RegistPool != nil { asset := self.RegistPool.Asset() return &asset } if self.Contract != nil { return &self.Contract.Asset } return nil } func (self *Cmds) Valid() bool { count := 0 if self.PkgCreate != nil { count++ } if self.PkgTransfer != nil { count++ } if self.PkgClose != nil { count++ } if self.BuyShare != nil { count++ } if self.RegistPool != nil { count++ } if self.ClosePool != nil { count++ } if self.Contract != nil { count++ } if count <= 1 { return true } else { return false } } type PreTxParam struct { From c_type.Uint512 RefundTo *c_type.PKr Receptions []Reception Cmds Cmds Fee assets.Token GasPrice *big.Int Roots []c_type.Uint256 } type Utxo struct { Root c_type.Uint256 Asset assets.Asset } type Utxos []Utxo func (self *Utxos) Roots() (roots []c_type.Uint256) { for _, utxo := range *self { roots = append(roots, utxo.Root) } return } type TxParamGenerator interface { FindRoots(pk *c_type.Uint512, currency string, amount *big.Int) (utxos Utxos, remain big.Int) FindRootsByTicket(pk *c_type.Uint512, tickets []assets.Ticket) (roots Utxos, remain map[c_type.Uint256]c_type.Uint256) GetRoot(root *c_type.Uint256) (utxos *Utxo) DefaultRefundTo(pk *c_type.Uint512) (ret *c_type.PKr) } type TxParamState interface { GetAnchor(roots []c_type.Uint256) (wits []txtool.Witness, e error) GetOut(root *c_type.Uint256) (out *localdb.RootState) GetPkgById(id *c_type.Uint256) (ret *localdb.ZPkg) GetSeroGasLimit(to *common.Address, tfee *assets.Token, gasPrice *big.Int) (gaslimit uint64, e error) } type DefaultTxParamState struct { } func (self *DefaultTxParamState) GetAnchor(roots []c_type.Uint256) (wits []txtool.Witness, e error) { return flight.SRI_Inst.GetAnchor(roots) } func (self *DefaultTxParamState) GetOut(root *c_type.Uint256) (out *localdb.RootState) { return flight.GetOut(root, 0) } func (self *DefaultTxParamState) GetPkgById(id *c_type.Uint256) (ret *localdb.ZPkg) { return txtool.Ref_inst.CurrentState().Pkgs.GetPkgById(id) } func (self *DefaultTxParamState) GetSeroGasLimit(to *common.Address, tfee *assets.Token, gasPrice *big.Int) (gaslimit uint64, e error) { return txtool.Ref_inst.Bc.GetSeroGasLimit(to, tfee, gasPrice) } ================================================ FILE: zero/txtool/type.go ================================================ package txtool import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/common/hexutil" "github.com/sero-cash/go-sero/zero/localdb" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-sero/zero/txs/stx" ) type Kr struct { SKr c_type.PKr PKr c_type.PKr } type Out struct { Root c_type.Uint256 State localdb.RootState } type TDOut struct { Asset assets.Asset Memo c_type.Uint512 Nils []c_type.Uint256 } type DOut struct { Asset assets.Asset Memo c_type.Uint512 Nil c_type.Uint256 } type Block struct { Num hexutil.Uint64 Hash c_type.Uint256 Outs []Out Nils []c_type.Uint256 Pkgs []localdb.ZPkg } type Witness struct { Pos hexutil.Uint64 Paths [c_type.DEPTH]c_type.Uint256 Anchor c_type.Uint256 } type Tx struct { Hash c_type.Uint256 Tx stx.T } ================================================ FILE: zero/txtool/verify/verify.go ================================================ package verify import ( "fmt" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-czero-import/seroparam" "github.com/sero-cash/go-sero/zero/txs/stx" "github.com/sero-cash/go-sero/zero/txs/zstate" "github.com/sero-cash/go-sero/zero/txtool/verify/verify_1" ) func VerifyWithoutState(ehash *c_type.Uint256, tx *stx.T, num uint64) (e error) { if num >= seroparam.SIP5() { return verify_1.VerifyWithoutState(ehash, tx, num) } else { return fmt.Errorf("VerifyWithoutState Error: verify_0 no longer be used") //return verify_0.VerifyWithoutState(ehash, tx, num) } } func VerifyWithState(tx *stx.T, state *zstate.ZState, num uint64) (e error) { if num >= seroparam.SIP5() { return verify_1.VerifyWithState(tx, state) } else { return fmt.Errorf("VerifyWithState Error: verify_0 no longer be used") //return verify_0.VerifyWithState(tx, state) } } ================================================ FILE: zero/txtool/verify/verify_1/input_c_pool.go ================================================ package verify_1 import ( "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/utils" "github.com/sero-cash/go-sero/zero/zconfig" ) var verify_input_procs_pool = utils.NewProcsPool(func() int { return zconfig.G_v_thread_num }) type verify_input_desc struct { proof c_type.Proof asset_cm_new c_type.Uint256 zpka c_type.Uint256 nil c_type.Uint256 anchor c_type.Uint256 } func (self *verify_input_desc) Run() error { if err := c_superzk.VerifyInput( &self.proof, &self.asset_cm_new, &self.zpka, &self.nil, &self.anchor, ); err != nil { return err } else { return nil } } ================================================ FILE: zero/txtool/verify/verify_1/output_c_pool.go ================================================ package verify_1 import ( "github.com/pkg/errors" "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/utils" "github.com/sero-cash/go-sero/zero/zconfig" ) var verify_output_procs_pool = utils.NewProcsPool(func() int { return zconfig.G_v_thread_num }) type verify_output_desc struct { pkr c_type.PKr asset_cm c_type.Uint256 proof c_type.Proof isEx bool e error } func (self *verify_output_desc) Run() error { if c_superzk.IsPKrValid(&self.pkr) { if err := c_superzk.VerifyOutput(&self.asset_cm, &self.proof, self.isEx); err != nil { self.e = err return err } else { return nil } } else { self.e = errors.New("z_out pkr is invalid !") return self.e } } ================================================ FILE: zero/txtool/verify/verify_1/pkg_pool.go ================================================ package verify_1 import ( "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/utils" "github.com/sero-cash/go-sero/zero/zconfig" ) var verify_pkg_procs_pool = utils.NewProcsPool(func() int { return zconfig.G_v_thread_num }) type verify_pkg_desc struct { asset_cm c_type.Uint256 proof c_type.Proof e error } func (self *verify_pkg_desc) Run() error { if e := c_superzk.VerifyOutput(&self.asset_cm, &self.proof, true); e != nil { self.e = e return e } else { return nil } } ================================================ FILE: zero/txtool/verify/verify_1/verify_proof.go ================================================ package verify_1 import "github.com/sero-cash/go-czero-import/seroparam" func (self *verifyWithoutStateCtx) ProcessVerifyProof() { for _, in := range self.tx.Tx1.Ins_C { g := verify_input_desc{} g.anchor = in.Anchor g.proof = in.Proof g.nil = in.Nil g.zpka = in.ZPKa g.asset_cm_new = in.AssetCM self.cin_proof_proc.StartProc(&g) } for _, out := range self.tx.Tx1.Outs_C { g := verify_output_desc{} g.proof = out.Proof g.asset_cm = out.AssetCM g.pkr = out.PKr if self.num >= seroparam.SIP7() { g.isEx = true } self.cout_proof_proc.StartProc(&g) } if self.tx.Desc_Pkg.Create != nil { g := verify_pkg_desc{} g.asset_cm = self.tx.Desc_Pkg.Create.Pkg.AssetCM g.proof = self.tx.Desc_Pkg.Create.Proof self.pkg_proof_proc.StartProc(&g) } } func (self *verifyWithoutStateCtx) WaitVerifyProof() (e error) { if self.cin_proof_proc.HasProc() { if e = self.cin_proof_proc.End(); e != nil { return } } if self.cout_proof_proc.HasProc() { if e = self.cout_proof_proc.End(); e != nil { return } } if self.pkg_proof_proc.HasProc() { if e = self.pkg_proof_proc.End(); e != nil { return } } return } ================================================ FILE: zero/txtool/verify/verify_1/verify_state.go ================================================ package verify_1 import ( "fmt" "github.com/sero-cash/go-sero/zero/zconfig" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/common/hexutil" "github.com/sero-cash/go-sero/zero/txs/stx" "github.com/sero-cash/go-sero/zero/txs/zstate" "github.com/sero-cash/go-sero/zero/txtool/verify/verify_utils" ) type verifyWithStateCtx struct { tx *stx.T state *zstate.ZState balance_desc c_type.BalanceDesc ck assets.CKState } func VerifyWithState(tx *stx.T, state *zstate.ZState) (e error) { ctx := verifyWithStateCtx{} ctx.tx = tx ctx.state = state return ctx.verify() } func (self *verifyWithStateCtx) prepare() { self.balance_desc.Hash = self.tx.Tx1_Hash() return } func (self *verifyWithStateCtx) clear() { } func (self *verifyWithStateCtx) verifyDescO() (e error) { return } func (self *verifyWithStateCtx) verifyDescZ() (e error) { return } func (self *verifyWithStateCtx) verifyFee() (e error) { feeCC := self.tx.ToFeeCC_Szk() self.ck = assets.NewCKState(true, &self.tx.Fee) self.balance_desc.Oout_accs = append(self.balance_desc.Oout_accs, feeCC[:]...) return } func (self *verifyWithStateCtx) verifyFrom() (e error) { return } func (self *verifyWithStateCtx) verifyPkg() (e error) { if self.tx.Desc_Pkg.Create != nil { if pg := self.state.Pkgs.GetPkgById(&self.tx.Desc_Pkg.Create.Id); pg != nil { e = verify_utils.ReportError(fmt.Sprintf("pkg id already exists %v", hexutil.Encode(self.tx.Desc_Pkg.Create.Id[:])), self.tx) return } else { self.balance_desc.Zout_acms = append(self.balance_desc.Zout_acms, self.tx.Desc_Pkg.Create.Pkg.AssetCM[:]...) } } if self.tx.Desc_Pkg.Transfer != nil { if pg := self.state.Pkgs.GetPkgById(&self.tx.Desc_Pkg.Transfer.Id); pg == nil || pg.Closed { e = verify_utils.ReportError(fmt.Sprintf("Can not find pkg of the id %v", hexutil.Encode(self.tx.Desc_Pkg.Transfer.Id[:])), self.tx) return } else { if c_superzk.VerifyPKr_X(&self.balance_desc.Hash, &self.tx.Desc_Pkg.Transfer.Sign, &pg.Pack.PKr) { } else { e = verify_utils.ReportError(fmt.Sprintf("Can not verify pkg sign of the id %v", hexutil.Encode(self.tx.Desc_Pkg.Transfer.Id[:])), self.tx) return } } } if self.tx.Desc_Pkg.Close != nil { if pg := self.state.Pkgs.GetPkgById(&self.tx.Desc_Pkg.Close.Id); pg == nil || pg.Closed { e = verify_utils.ReportError(fmt.Sprintf("Can not find pkg of the id %v", hexutil.Encode(self.tx.Desc_Pkg.Close.Id[:])), self.tx) return } else { if c_superzk.VerifyPKr_X(&self.balance_desc.Hash, &self.tx.Desc_Pkg.Close.Sign, &pg.Pack.PKr) { self.balance_desc.Zin_acms = append(self.balance_desc.Zin_acms, pg.Pack.Pkg.AssetCM[:]...) } else { e = verify_utils.ReportError(fmt.Sprintf("Can not verify pkg sign of the id %v", hexutil.Encode(self.tx.Desc_Pkg.Close.Id[:])), self.tx) return } } } return } func (self *verifyWithStateCtx) verifyCmd() (e error) { if cc := self.tx.Desc_Cmd.ToAssetCC_Szk(); cc != nil { self.ck.AddOut(self.tx.Desc_Cmd.OutAsset()) self.balance_desc.Oout_accs = append(self.balance_desc.Oout_accs, cc[:]...) } return } func (self *verifyWithStateCtx) verifyInsP0() (e error) { for _, in := range self.tx.Tx1.Ins_P0 { if ok := self.state.State.HasIn(&in.Nil); ok { e = verify_utils.ReportError("txs.verify p0_in already in nils", self.tx) return } if ok := self.state.State.HasIn(&in.Root); ok { e = verify_utils.ReportError("txs.verify p0_in already in nil-roots", self.tx) return } if src := self.state.State.GetOut(&in.Root); src != nil { if e = c_superzk.VerifyNil_P0(&self.balance_desc.Hash, &in.Sign, src.ToPKr(), src.RootCM, &in.Nil); e != nil { return } var asset_desc c_type.Asset if in.Key != nil { if src.Out_Z != nil { flag := c_superzk.IsFlagSet(src.Out_Z.RPK[:]) if asset, rsk, memo, err := c_superzk.Czero_decEInfo(in.Key, flag, &src.Out_Z.EInfo); err != nil { e = verify_utils.ReportError("txs.verify p0_in dec info error", self.tx) return } else { if out_cm, err := c_superzk.Czero_genOutCM(&asset, &memo, &src.Out_Z.PKr, &rsk); err != nil { e = verify_utils.ReportError("txs.verify p0_in gen out cm error", self.tx) return } else { if out_cm != src.Out_Z.OutCM { e = verify_utils.ReportError("txs.verify p0_in confirm error", self.tx) return } else { asset_desc = asset } } } } else { e = verify_utils.ReportError("txs.verify p0_in has key but not point to Out_Z", self.tx) return } } else { if src.Out_O != nil { asset_desc = src.Out_O.Asset.ToTypeAsset() } else { e = verify_utils.ReportError("txs.verify p0_in no key but not point to Out_O", self.tx) return } } if cc, err := c_superzk.GenAssetCC(&asset_desc); err != nil { e = verify_utils.ReportError("txs.verify p0_in no key gen cc error", self.tx) return } else { asset := assets.NewAssetByType(&asset_desc) if asset.IsValid() { self.ck.AddIn(&asset) self.balance_desc.Oin_accs = append(self.balance_desc.Oin_accs, cc[:]...) } else { e = verify_utils.ReportError("txs.verify p0_in but asset is invalid", self.tx) return } } } else { e = verify_utils.ReportError("txs.Verify: p0_in not find in the outs!", self.tx) return } } return } func (self *verifyWithStateCtx) verifyInsP() (e error) { for _, in := range self.tx.Tx1.Ins_P { if !zconfig.IsValidRoot(in.Root) { e = verify_utils.ReportError("txs.verify p_in already in nils-roots", self.tx) return } if ok := self.state.State.HasIn(&in.Nil); ok { e = verify_utils.ReportError("txs.verify p_in already in nils", self.tx) return } if ok := self.state.State.HasIn(&in.Root); ok { e = verify_utils.ReportError("txs.verify p_in already in nil-roots", self.tx) return } if src := self.state.State.GetOut(&in.Root); src != nil { if e = c_superzk.VerifyNil(&self.balance_desc.Hash, &in.NSign, &in.Nil, src.RootCM, src.ToPKr()); e != nil { e = verify_utils.ReportError("txs.verify p_in verify nil error", self.tx) return } if !c_superzk.VerifyPKr_P(&self.balance_desc.Hash, &in.ASign, src.ToPKr()) { e = verify_utils.ReportError("txs.verify p_in verify pkr error", self.tx) return } var asset_desc c_type.Asset if in.Key == nil { if src.Out_P != nil { asset_desc = src.Out_P.Asset.ToTypeAsset() } else { e = verify_utils.ReportError("txs.verify p_in has no key but not point to Out_P", self.tx) return } } else { if src.Out_C != nil { if asset, _, ar, err := c_superzk.DecEInfo(in.Key, &src.Out_C.EInfo); err != nil { e = err return } else { if cm, _, err := c_superzk.GenAssetCM_PC(&asset, &ar); err != nil { e = err return } else { if cm != src.Out_C.AssetCM { e = verify_utils.ReportError("txs.verify p_in can not confirm to Out_C", self.tx) return } else { asset_desc = asset } } } } else { e = verify_utils.ReportError("txs.verify p_in has key but not point to Out_C", self.tx) return } } if cc, err := c_superzk.GenAssetCC(&asset_desc); err != nil { e = err return } else { asset := assets.NewAssetByType(&asset_desc) if !asset.IsValid() { e = verify_utils.ReportError("txs.verify p_in asset is invalid", self.tx) return } self.ck.AddIn(&asset) self.balance_desc.Oin_accs = append(self.balance_desc.Oin_accs, cc[:]...) } } else { e = verify_utils.ReportError("txs.Verify: in_o not find in the outs!", self.tx) return } } return } func (self *verifyWithStateCtx) verifyInsC() (e error) { for _, in := range self.tx.Tx1.Ins_C { self.balance_desc.Zin_acms = append(self.balance_desc.Zin_acms, in.AssetCM[:]...) if ok := self.state.State.HasIn(&in.Nil); ok { e = verify_utils.ReportError("txs.verify in already in nils", self.tx) return } else { if !self.state.State.FindAnchorInSzk(&in.Anchor) { e = verify_utils.ReportError("txs.verify can not find out for anchor", self.tx) return } } } return } func (self *verifyWithStateCtx) verifyOutP() (e error) { for _, out := range self.tx.Tx1.Outs_P { self.ck.AddOut(&out.Asset) cc := out.ToAssetCC_Szk() self.balance_desc.Oout_accs = append(self.balance_desc.Oout_accs, cc[:]...) } return } func (self *verifyWithStateCtx) verifyOutC() (e error) { for _, out := range self.tx.Tx1.Outs_C { self.balance_desc.Zout_acms = append(self.balance_desc.Zout_acms, out.AssetCM[:]...) } return } func (self *verifyWithStateCtx) verifyBalance() (e error) { if len(self.balance_desc.Zout_acms) > 0 || len(self.balance_desc.Zin_acms) > 0 { self.balance_desc.Bcr = self.tx.Bcr self.balance_desc.Bsign = self.tx.Bsign if err := c_superzk.VerifyBalance(&self.balance_desc); err != nil { e = err return } } else { if e = self.ck.Check(); e != nil { return } } return } func (self *verifyWithStateCtx) verify() (e error) { self.prepare() defer self.clear() if e = self.verifyDescO(); e != nil { return } if e = self.verifyDescZ(); e != nil { return } if e = self.verifyFee(); e != nil { return } if e = self.verifyFrom(); e != nil { return } if e = self.verifyPkg(); e != nil { return } if e = self.verifyCmd(); e != nil { return } if self.tx.Tx1.Count() > 0 { if e = self.verifyInsP0(); e != nil { return } if e = self.verifyInsP(); e != nil { return } if e = self.verifyInsC(); e != nil { return } if e = self.verifyOutP(); e != nil { return } if e = self.verifyOutC(); e != nil { return } } if e = self.verifyBalance(); e != nil { return } return } ================================================ FILE: zero/txtool/verify/verify_1/verify_static.go ================================================ package verify_1 import ( "fmt" "github.com/sero-cash/go-sero/zero/utils" "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-czero-import/seroparam" "github.com/sero-cash/go-czero-import/superzk" "github.com/sero-cash/go-sero/zero/txs/stx" "github.com/sero-cash/go-sero/zero/txtool/verify/verify_utils" ) type verifyWithoutStateCtx struct { tx *stx.T num uint64 hash c_type.Uint256 oout_count int oin_count int zout_count int zin_count int cin_proof_proc *utils.Procs cout_proof_proc *utils.Procs pkg_proof_proc *utils.Procs } func VerifyWithoutState(ehash *c_type.Uint256, tx *stx.T, num uint64) (e error) { if *ehash != tx.Ehash { e = verify_utils.ReportError("ehash error", tx) return } ctx := verifyWithoutStateCtx{} ctx.num = num ctx.tx = tx return ctx.verify() } func (self *verifyWithoutStateCtx) prepare() { self.hash = self.tx.Tx1_Hash() self.cin_proof_proc = verify_input_procs_pool.GetProcs() self.cout_proof_proc = verify_output_procs_pool.GetProcs() self.pkg_proof_proc = verify_pkg_procs_pool.GetProcs() return } func (self *verifyWithoutStateCtx) clear() { verify_input_procs_pool.PutProcs(self.cin_proof_proc) verify_output_procs_pool.PutProcs(self.cout_proof_proc) verify_pkg_procs_pool.PutProcs(self.pkg_proof_proc) } func (self *verifyWithoutStateCtx) verifyDescO() (e error) { if self.tx.Desc_O.HasContent() { return verify_utils.ReportError("desc o must empty", self.tx) } return } func (self *verifyWithoutStateCtx) verifyDescZ() (e error) { if self.tx.Desc_Z.HasContent() { return verify_utils.ReportError("desc z must empty", self.tx) } return } func (self *verifyWithoutStateCtx) verifyFee() (e error) { if !verify_utils.CheckUint(&self.tx.Fee.Value) { e = verify_utils.ReportError("txs.verify check fee too big", self.tx) return } self.tx.ToFeeCC_Szk() self.oout_count++ return } func (self *verifyWithoutStateCtx) verifyFrom() (e error) { if !superzk.IsPKrValid(&self.tx.From) { e = verify_utils.ReportError("txs.verify from is invalid", self.tx) return } if !c_superzk.VerifyPKr_X(&self.hash, &self.tx.Sign, &self.tx.From) { e = verify_utils.ReportError("txs.verify from verify failed", self.tx) return } return } func (self *verifyWithoutStateCtx) verifyPkg() (e error) { if self.tx.Desc_Cmd.Count() > 0 && self.tx.Desc_Pkg.Count() > 0 { e = verify_utils.ReportError("pkg and cmd desc only exists one", self.tx) return } if !self.tx.Desc_Pkg.Valid() { e = verify_utils.ReportError("pkg desc is invalid", self.tx) return } if self.tx.Desc_Pkg.Create != nil { self.zout_count++ } if self.tx.Desc_Pkg.Close != nil { self.zin_count++ } return } func (self *verifyWithoutStateCtx) verifyCmd() (e error) { if !self.tx.Desc_Cmd.Valid() { e = verify_utils.ReportError("cmd desc is invalid", self.tx) return } if asset := self.tx.Desc_Cmd.OutAsset(); asset != nil { self.oout_count++ if asset.Tkn != nil { if !verify_utils.CheckUint(&asset.Tkn.Value) { e = verify_utils.ReportError("cmd asset tkn value invalid", self.tx) return } } self.tx.Desc_Cmd.ToAssetCC_Szk() } if pkr := self.tx.Desc_Cmd.ToPkr(); pkr != nil { if !superzk.IsPKrValid(pkr) { e = verify_utils.ReportError("cmd pkr invalid", self.tx) return } } if self.tx.Desc_Cmd.RegistPool != nil { if self.tx.Desc_Cmd.RegistPool.FeeRate > seroparam.HIGHEST_STAKING_NODE_FEE_RATE { e = verify_utils.ReportError(fmt.Sprintf("regist pool the fee rate must < %v%%", seroparam.HIGHEST_STAKING_NODE_FEE_RATE), self.tx) return } if self.tx.Desc_Cmd.RegistPool.FeeRate < seroparam.LOWEST_STAKING_NODE_FEE_RATE { e = verify_utils.ReportError(fmt.Sprintf("regist pool fee must >= %v%%", seroparam.LOWEST_STAKING_NODE_FEE_RATE/100), self.tx) return } } if self.tx.Desc_Cmd.Contract != nil { if self.tx.Desc_Cmd.Contract.To != nil { empty := c_type.PKr{} if *self.tx.Desc_Cmd.Contract.To == empty { e = verify_utils.ReportError("contract target can not be zero", self.tx) return } } } return } func (self *verifyWithoutStateCtx) verifyInsP0() (e error) { self.oin_count += len(self.tx.Tx1.Ins_P0) return } func (self *verifyWithoutStateCtx) verifyInsP() (e error) { self.oin_count += len(self.tx.Tx1.Ins_P) return } func (self *verifyWithoutStateCtx) verifyInsC() (e error) { for _, in := range self.tx.Tx1.Ins_C { if !c_superzk.VerifyZPKa(&self.hash, &in.Sign, &in.ZPKa) { e = verify_utils.ReportError("c_out zpka verify invalid", self.tx) return } self.zin_count++ } return } func (self *verifyWithoutStateCtx) verifyOutP() (e error) { for i, out := range self.tx.Tx1.Outs_P { self.oout_count++ if !superzk.IsPKrValid(&out.PKr) { e = verify_utils.ReportError("p_out pkr invalid", self.tx) return } if out.Asset.Tkn != nil { if !verify_utils.CheckUint(&out.Asset.Tkn.Value) { e = verify_utils.ReportError("p_out tkn value invalid", self.tx) return } } self.tx.Tx1.Outs_P[i].ToAssetCC_Szk() } return } func (self *verifyWithoutStateCtx) verifyOutC() (e error) { for _, out := range self.tx.Tx1.Outs_C { self.zout_count++ if !c_superzk.IsPKrValid(&out.PKr) { e = verify_utils.ReportError("c_out pkr invalid", self.tx) return } } return } func (self *verifyWithoutStateCtx) verifyBalance() (e error) { if self.oout_count+self.zout_count > seroparam.MAX_Z_OUT_LENGTH_SIP2 { e = verify_utils.ReportError("verify error: out_size > 500", self.tx) return } return } func (self *verifyWithoutStateCtx) verify() (e error) { self.prepare() defer self.clear() self.ProcessVerifyProof() if e = self.verifyDescO(); e != nil { return } if e = self.verifyDescZ(); e != nil { return } if e = self.verifyFee(); e != nil { return } if e = self.verifyFrom(); e != nil { return } if e = self.verifyPkg(); e != nil { return } if e = self.verifyCmd(); e != nil { return } if self.tx.Tx1.Count() > 0 { if e = self.verifyInsP0(); e != nil { return } if e = self.verifyInsP(); e != nil { return } if e = self.verifyInsC(); e != nil { return } if e = self.verifyOutP(); e != nil { return } if e = self.verifyOutC(); e != nil { return } } if e = self.verifyBalance(); e != nil { return } if e = self.WaitVerifyProof(); e != nil { return } return } ================================================ FILE: zero/txtool/verify/verify_utils/utils.go ================================================ package verify_utils import ( "fmt" "github.com/sero-cash/go-sero/common/hexutil" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/zero/txs/stx" "github.com/sero-cash/go-sero/zero/utils" ) func CheckUint(i *utils.U256) bool { return i.IsValid() } func ReportError(str string, tx *stx.T) (e error) { h := hexutil.Encode(tx.ToHash().NewRef()[:]) log.Error("Verify Tx Error", "reason", str, "hash", h) return fmt.Errorf("Verify Tx Error: resean=%v , hash=%v", str, h) } ================================================ FILE: zero/utils/base58.go ================================================ package utils import "C" import ( "errors" "github.com/btcsuite/btcutil/base58" ) func Base58Encode(bytes []byte) (ret *string) { str := base58.Encode(bytes) if len(str) > len(bytes) { ret = &str return } else { return } } func Base58Decode(str string, bytes []byte) (e error) { bs := base58.Decode(str) if len(bs) <= len(bytes) { copy(bytes, bs) return } else { e = errors.New("base58 can not decode string") return } } ================================================ FILE: zero/utils/deep_copy.go ================================================ package utils import ( "bytes" "encoding/gob" "fmt" ) func DeepSerial(src interface{}) (ret bytes.Buffer) { if err := gob.NewEncoder(&ret).Encode(src); err != nil { panic(fmt.Sprintf("deepCopy encode error for : %v", src)) } return } func DeepUnserial(buf *bytes.Buffer, dst interface{}) { if err := gob.NewDecoder(bytes.NewBuffer(buf.Bytes())).Decode(dst); err != nil { panic(fmt.Sprintf("deepCopy decode error for : %v", err)) } } func DeepCopy(dst, src interface{}) { var buf bytes.Buffer buf = DeepSerial(src) DeepUnserial(&buf, dst) } ================================================ FILE: zero/utils/dirtys.go ================================================ package utils import "github.com/sero-cash/go-czero-import/c_type" type Dirtys struct { Orders []c_type.Uint256 } func (self *Dirtys) Clear() { self.Orders = []c_type.Uint256{} } func (self *Dirtys) Append(item *c_type.Uint256) { self.Orders = append(self.Orders, *item) } func (self *Dirtys) List() (ret []c_type.Uint256) { return self.Orders } /* func (self *Dirtys) SortedList() (ret []c_type.Uint256) { list := Uint256s{} for _, k := range self.Orders { list = append(list, k) } sort.Sort(list) ret = []c_type.Uint256(list) return } */ ================================================ FILE: zero/utils/h2hash.go ================================================ package utils import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/serodb" "github.com/sero-cash/go-sero/zero/txs/zstate/tri" ) type H2Hash struct { Name string M map[c_type.Uint256]c_type.Uint256 } func NewH2Hash(name string) (ret H2Hash) { ret.Name = name return } func (self *H2Hash) Clear() { self.M = make(map[c_type.Uint256]c_type.Uint256) } func (self *H2Hash) Add(id *c_type.Uint256, hash *c_type.Uint256) { self.M[*id] = *hash } func (self *H2Hash) Del(id *c_type.Uint256) (ret c_type.Uint256) { ret = self.M[*id] delete(self.M, *id) return } func (self *H2Hash) Get(id *c_type.Uint256) (ret c_type.Uint256) { ret = self.M[*id] return } func (self *H2Hash) K2Name(k *c_type.Uint256) (ret []byte) { ret = []byte(self.Name) ret = append(ret, k[:]...) return } func (self *H2Hash) SaveByDB(putter serodb.Putter, id *c_type.Uint256) { v := self.M[*id] if err := putter.Put(self.K2Name(id), v[:]); err == nil { return } else { panic(err) return } } func (self *H2Hash) GetByDB(getter serodb.Getter, id *c_type.Uint256) (ret c_type.Uint256) { var ok bool if ret, ok = self.M[*id]; !ok { if bs, err := getter.Get(self.K2Name(id)); err == nil { copy(ret[:], bs[:]) self.M[*id] = ret return } else { panic(err) return } } else { return } } func (self *H2Hash) SaveByTri(tr tri.Tri, id *c_type.Uint256) { v := self.M[*id] if err := tr.TryUpdate(self.K2Name(id), v[:]); err == nil { return } else { panic(err) return } } func (self *H2Hash) GetByTri(tr tri.Tri, id *c_type.Uint256) (ret c_type.Uint256) { var ok bool if ret, ok = self.M[*id]; !ok { if bs, err := tr.TryGet(self.K2Name(id)); err == nil { copy(ret[:], bs[:]) self.M[*id] = ret return } else { panic(err) return } } else { return } } ================================================ FILE: zero/utils/hset.go ================================================ package utils import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/txs/zstate/tri" ) type HSet struct { Name string M map[c_type.Uint256]bool Orders []c_type.Uint256 } func NewHSet(name string) (ret HSet) { ret.Name = name return } func (self *HSet) Clear() { self.M = make(map[c_type.Uint256]bool) self.Orders = []c_type.Uint256{} } func (self *HSet) Append(item *c_type.Uint256) { self.M[*item] = true self.Orders = append(self.Orders, *item) } func (self *HSet) List() (ret []c_type.Uint256) { return self.Orders } func (self *HSet) K2Name(k *c_type.Uint256) (ret []byte) { ret = []byte(self.Name) ret = append(ret, k[:]...) return } func (self *HSet) Save(tr tri.Tri) { for _, k := range self.Orders { if err := tr.TryUpdate(self.K2Name(&k), []byte{1}); err != nil { panic(err) } } } func (self *HSet) Has(tr tri.Tri, k *c_type.Uint256) (ret bool) { if _, ok := self.M[*k]; ok { ret = true return } else { if bs, err := tr.TryGet(self.K2Name(k)); err == nil { if len(bs) > 0 && bs[0] == 1 { ret = true self.M[*k] = true return } else { return } } else { panic(err) return } } } ================================================ FILE: zero/utils/i256.go ================================================ package utils import ( "io" "math/big" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/rlp" ) type I256 big.Int var I256_0 I256 = I256(*big.NewInt(0)) func NewI256(i int64) (ret I256) { ret = I256(*big.NewInt(i)) return } func (self I256) DeepCopy() interface{} { bi := big.Int(self) dc := I256(*big.NewInt(0).Set(&bi)) return dc } func (x *I256) GobEncode() ([]byte, error) { b := big.Int(*x) return b.GobEncode() } func (z *I256) GobDecode(buf []byte) error { var a big.Int if err := a.GobDecode(buf); err != nil { return err } *z = I256(a) return nil } func (b I256) EncodeRLP(w io.Writer) error { i := big.Int(b) if bytes, e := i.GobEncode(); e != nil { return e } else { if e = rlp.Encode(w, bytes); e != nil { return e } else { return nil } } } func (b *I256) DecodeRLP(s *rlp.Stream) error { bytes := []byte{} if e := s.Decode(&bytes); e != nil { return e } else { i := big.Int{} if e := i.GobDecode(bytes); e != nil { return e } else { *b = I256(i) return nil } } } func (b I256) MarshalText() ([]byte, error) { i := big.Int(b) return i.MarshalText() } func (b *I256) UnmarshalJSON(input []byte) error { i := big.Int{} if e := i.UnmarshalJSON(input); e != nil { return e } else { *b = I256(i) return nil } } func (b *I256) UnmarshalText(input []byte) error { i := big.Int{} if e := i.UnmarshalText(input); e != nil { return e } else { *b = I256(i) return nil } } func (self I256) IsPositive() bool { l := big.Int(self) return l.Sign() >= 0 } func (self I256) Abs() (ret U256) { l := big.Int(*self.ToRef()) l.Abs(&l) ret = U256(l) return } func (self I256) ToRef() (ret *I256) { s := big.Int(self) r := big.NewInt(0) r.Set(&s) t := I256(*r) ret = &t return } func (self *I256) Reverse() { l := big.Int(*self.ToRef()) z := big.NewInt(0) z.Sub(z, &l) *self = I256(*z) } func (self *I256) AddI(a *I256) { l := big.Int(*self.ToRef()) r := big.Int(*a) l.Add(&l, &r) *self = I256(l) return } func (self *I256) AddU(a *U256) { l := big.Int(*self.ToRef()) r := big.Int(*a) l.Add(&l, &r) *self = I256(l) return } func (self *I256) SubI(a *I256) { l := big.Int(*self.ToRef()) r := big.Int(*a) l.Sub(&l, &r) *self = I256(l) return } func (self *I256) SubU(a *U256) { l := big.Int(*self.ToRef()) r := big.Int(*a) l.Sub(&l, &r) *self = I256(l) return } func (self *I256) ToIntRef() (ret *big.Int) { r := big.Int(*self.ToRef()) ret = &r return } func (self *I256) ToUint256() (ret c_type.Uint256) { i := big.Int(*self.ToRef()) bytes := i.Bytes() for i := 0; i < len(bytes)/2; i++ { bytes[i], bytes[len(bytes)-1-i] = bytes[len(bytes)-1-i], bytes[i] } copy(ret[:], bytes[:]) if i.Sign() < 0 { ret[31] = 1 } else { ret[31] = 0 } return } func (self *I256) Cmp(a *I256) int { l := big.Int(*self) r := big.Int(*a) return l.Cmp(&r) } ================================================ FILE: zero/utils/pkrs_check.go ================================================ package utils import ( "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-czero-import/c_type" ) type pkrsChecker struct { isSzk bool } func NewPKrChecker() (ret pkrsChecker) { return } func (self *pkrsChecker) AddPKr(pkr *c_type.PKr) { if c_superzk.IsSzkPKr(pkr) { self.isSzk = true } } func (self *pkrsChecker) AddPK(pk *c_type.Uint512) { if c_superzk.IsSzkPK(pk) { self.isSzk = true } } func (self *pkrsChecker) AddNil(nl *c_type.Uint256) { if c_superzk.IsSzkNil(nl) { self.isSzk = true } } func (self *pkrsChecker) IsSzk() (ret bool) { return self.isSzk } ================================================ FILE: zero/utils/process.go ================================================ package utils import ( "fmt" "sync" "github.com/sero-cash/go-czero-import/c_superzk" "github.com/pkg/errors" ) type Proc interface { Run() error } type Procs struct { ch chan int wait sync.WaitGroup Runs []Proc E error ERun Proc } func NewProcs(num int) (ret Procs) { ret = Procs{ make(chan int, num), sync.WaitGroup{}, nil, nil, nil, } return } func (self *Procs) HasProc() bool { if len(self.Runs) > 0 { return true } else { return false } } func (self *Procs) StartProc(run Proc) { self.Runs = append(self.Runs, run) if c_superzk.Is_czero_debug() { if e := run.Run(); e != nil { self.E = e } } else { self.wait.Add(1) go func(run Proc) { defer func() { if r := recover(); r != nil { self.E = errors.Errorf("process panic: %v", r) self.ERun = run } <-self.ch self.wait.Done() }() self.ch <- 0 if self.E == nil { if e := run.Run(); e != nil { self.E = e self.ERun = run } } }(run) } } func (self *Procs) End() error { self.wait.Wait() if self.E == nil { return nil } else { return self.E } } type ProcsPool struct { pool sync.Pool } func NewProcsPool(numget func() int) (ret ProcsPool) { ret = ProcsPool{ sync.Pool{ New: func() interface{} { procs := NewProcs(numget()) return &procs }, }, } return } func (self *ProcsPool) GetProcs() (ret *Procs) { ret = self.pool.Get().(*Procs) ret.Runs = []Proc{} if ret == nil { panic(fmt.Errorf("GetProcsFromPool error: fetch nil!")) } return } func (self *ProcsPool) PutProcs(p *Procs) { self.pool.Put(p) } ================================================ FILE: zero/utils/progress.go ================================================ package utils import ( "fmt" "github.com/sero-cash/go-sero/log" ) type Progress struct { start int64 target uint64 label string } func NewProgress(label string, target uint64) (ret Progress) { return Progress{ start: -1, target: target, label: label, } } func (self *Progress) Tick(cur uint64, ctx ...interface{}) { if self.start == -1 { self.start = int64(cur) } dist := self.target - uint64(self.start) if dist == 0 { return } prog := cur - uint64(self.start) step := dist / 10 if step == 0 { step = 1 } if cur == self.target || cur == uint64(self.start) || prog%step == 0 { percent := (float32(prog) / float32(dist)) * 100 p := []interface{}{ "t", self.target, "c", cur, "p", fmt.Sprintf("%d%%", uint64(percent)), } p = append(p, ctx...) log.Info( self.label, p..., ) } } ================================================ FILE: zero/utils/snapshot.go ================================================ package utils import ( "github.com/mohae/deepcopy" ) type Snapshot struct { id int buf interface{} } type Snapshots struct { objs []*Snapshot } func (self *Snapshots) Push(id int, obj interface{}) { cp := deepcopy.Copy(obj) self.objs = append(self.objs, &Snapshot{id, cp}) return } func (self *Snapshots) Revert(id int) (to interface{}) { var temp []*Snapshot var max_temp *Snapshot for _, s := range self.objs { if s.id <= id { temp = append(temp, s) max_temp = s } } self.objs = temp to = max_temp.buf return } ================================================ FILE: zero/utils/time_record.go ================================================ package utils import ( "fmt" "time" ) type TimeRecord struct { start time.Time name string enable bool } func TR_enter(name string) (tr TimeRecord) { tr.start = time.Now() tr.name = name tr.enable = false return } func TR_enter_f(name string) (tr TimeRecord) { tr.start = time.Now() tr.name = name tr.enable = true return } func (tr *TimeRecord) Renter(name string) { if tr.enable { td := time.Since(tr.start) fmt.Printf("TR-----("+tr.name+") s=%v\n", td) tr.name = name tr.start = time.Now() } } func (tr *TimeRecord) Leave() time.Duration { td := time.Since(tr.start) if tr.enable { fmt.Printf("TR-----("+tr.name+") s=%v\n", td) } return td } ================================================ FILE: zero/utils/u256.go ================================================ package utils import ( "io" "math/big" "github.com/pkg/errors" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-czero-import/seroparam" "github.com/sero-cash/go-sero/rlp" ) type U256 big.Int var U256_0 U256 = U256(*big.NewInt(0)) func NewU256(i uint64) (ret U256) { ret = U256(*big.NewInt(int64(i))) return } func (self U256) IsValid() bool { v := self.ToInt() if v.Sign() < 0 { return false } if len(v.Bytes()) > 32 { return false } u := self.ToUint256() if u[31] == 0 && u[30] == 0 { return true } else { return false } } func (self U256) DeepCopy() interface{} { bi := big.Int(self) dc := U256(*big.NewInt(0).Set(&bi)) return dc } func (x *U256) GobEncode() ([]byte, error) { b := big.Int(*x) return b.GobEncode() } func (z *U256) GobDecode(buf []byte) error { var a big.Int if err := a.GobDecode(buf); err != nil { return err } *z = U256(a) return nil } func (b U256) EncodeRLP(w io.Writer) error { i := big.Int(b) if bytes, e := i.GobEncode(); e != nil { return e } else { if e = rlp.Encode(w, bytes); e != nil { return e } else { return nil } } } func (b *U256) DecodeRLP(s *rlp.Stream) error { bytes := []byte{} if e := s.Decode(&bytes); e != nil { return e } else { i := big.Int{} if e := i.GobDecode(bytes); e != nil { return e } else { *b = U256(i) return nil } } } func isString(input []byte) bool { return len(input) >= 2 && input[0] == '"' && input[len(input)-1] == '"' } func (b U256) MarshalJSON() ([]byte, error) { i := big.Int(b) by, err := i.MarshalJSON() if err != nil { return nil, err } if seroparam.IsExchangeValueStr() { bytes := make([]byte, len(by)+2) copy(bytes[1:len(bytes)-1], by[:]) bytes[0] = '"' bytes[len(bytes)-1] = '"' return bytes, nil } else { return by, err } } func (b *U256) ToInt() *big.Int { return (*big.Int)(b) } func (b *U256) ToBEBytes() (ret []byte) { ret = b.ToInt().Bytes() return } //func (b U256) MarshalText() ([]byte, error) { // i := big.Int(b) // return i.MarshalText() //} func (b *U256) UnmarshalJSON(input []byte) error { if isString(input) { input = input[1 : len(input)-1] } i := big.Int{} if e := i.UnmarshalJSON(input); e != nil { return e } else { *b = U256(i) return nil } } func (b *U256) UnmarshalText(input []byte) error { i := big.Int{} if e := i.UnmarshalText(input); e != nil { return e } else { *b = U256(i) return nil } } func NewU256_ByKey(k *c_type.Uint256) (ret U256) { bytes := *k.NewRef() for i := 0; i < len(bytes)/2; i++ { bytes[i], bytes[len(bytes)-1-i] = bytes[len(bytes)-1-i], bytes[i] } r := big.NewInt(0) r.SetBytes(bytes[:]) ret = U256(*r) return } func (self U256) ToRef() (ret *U256) { s := big.Int(self) r := big.NewInt(0) r.Set(&s) t := U256(*r) ret = &t return } func (self *U256) ToI256() (ret I256) { b := big.Int(*self.ToRef()) ret = I256(b) return } func (self *U256) ToUint256() (ret c_type.Uint256) { i := big.Int(*self.ToRef()) bytes := i.Bytes() for i := 0; i < len(bytes)/2; i++ { bytes[i], bytes[len(bytes)-1-i] = bytes[len(bytes)-1-i], bytes[i] } copy(ret[:], bytes[:]) return } func (self *U256) ToLEBytes() (ret []byte) { r := self.ToUint256() return r[:] } func (self *U256) ToIntRef() (ret *big.Int) { r := big.Int(*self.ToRef()) ret = &r return } func (self *U256) AddU(a *U256) { l := big.Int(*self.ToRef()) r := big.Int(*a) l.Add(&l, &r) *self = U256(l) return } func (self *U256) Cmp(a *U256) int { l := big.Int(*self) r := big.Int(*a) return l.Cmp(&r) } func (self *U256) SubU(a *U256) { if self.Cmp(a) < 0 { panic(errors.New("u256 sub error: result is negative")) } l := big.Int(*self.ToRef()) r := big.Int(*a) l.Sub(&l, &r) *self = U256(l) return } ================================================ FILE: zero/utils/u256_test.go ================================================ package utils import ( "encoding/json" "fmt" "math/big" "testing" "github.com/sero-cash/go-sero/common/hexutil" ) func TestU256_MarshalText(t *testing.T) { a := big.NewInt(75) a.Mul(a, big.NewInt(100000000000)) a.Mul(a, big.NewInt(100000000000000)) value := a b := U256(*value) m, _ := json.Marshal(b) fmt.Print(string(m)) } func TestU256_M(t *testing.T) { u := U256_0 b, e := u.MarshalJSON() fmt.Println((e)) fmt.Println(string(b)) } func TestU256_UnmarshalText(t *testing.T) { b := []byte("\"750000000000000000000000000\"") a := U256{} //err := a.UnmarshalJSON(b) //if err != nil { // t.Error(err) //} //err = a.UnmarshalText(b) err := json.Unmarshal(b, &a) if err != nil { t.Error(err) } fmt.Printf("%v", a) } func TestU256_ToBEBytes(t *testing.T) { //a := big.NewInt(339014133842837404430) //b := U256(*a) b := []byte("\"339014133842837404430\"") a := U256{} err := json.Unmarshal(b, &a) if err != nil { t.Error(err) } r := a.ToBEBytes() fmt.Println(hexutil.Encode(r)) } ================================================ FILE: zero/utils/utils.go ================================================ // copyright 2018 The sero.cash Authors // This file is part of the go-sero library. // // The go-sero library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-sero library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-sero library. If not, see <http://www.gnu.org/licenses/>. package utils import ( "bytes" "encoding/binary" "errors" "fmt" "math/big" "runtime" "strings" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/common" ) func Uint64ToBytes(r uint64) []byte { value := new(big.Int).SetUint64(r) return value.Bytes() } func Int64ToBytes(r int64) []byte { value := new(big.Int).SetInt64(r) return value.Bytes() } func Uint256SliceCut(is []c_type.Uint256, l int) (ret []c_type.Uint256) { is_l := len(is) if is_l < l { l = is_l } ret = is[:l] return } type Uint256s []c_type.Uint256 func (self Uint256s) Len() int { return len(self) } func (self Uint256s) Less(i, j int) bool { return bytes.Compare(self[i][:], self[j][:]) < 0 } func (self Uint256s) Swap(i, j int) { self[i], self[j] = self[j], self[i] } func CurrencyToUint256(str string) (ret c_type.Uint256) { bs := CurrencyToBytes(str) copy(ret[:], bs) return } func Uint256ToCurrency(u *c_type.Uint256) (ret string) { return BytesToCurrency(u[:]) } func CurrencyToBytes(currency string) []byte { return common.LeftPadBytes([]byte(strings.ToUpper(currency)), 32) } func BytesToCurrency(bs []byte) string { return common.BytesToString(bs) } func ShowStack() { var buf [4096]byte n := runtime.Stack(buf[:], false) fmt.Printf("==> %s\n", string(buf[:n])) } func DecodeNumber32(data []byte) uint32 { if len(data) == 0 { return 0 } return binary.BigEndian.Uint32(data) } func EncodeNumber32(number uint32) []byte { enc := make([]byte, 4) binary.BigEndian.PutUint32(enc, number) return enc } func EncodeNumber(number uint64) []byte { enc := make([]byte, 8) binary.BigEndian.PutUint64(enc, number) return enc } func DecodeNumber(data []byte) uint64 { if len(data) == 0 { return 0 } return binary.BigEndian.Uint64(data) } var ( //sero = 1000000000000000000 //gta = big.NewInt(1000000000) //ta = big.NewInt(1) ) func ParseAmount(s string) (*big.Int, error) { s = strings.ToUpper(s) base := 1.0 if strings.HasSuffix(s, "SERO") { s = s[0 : len(s)-4] base = 1000000000000000000.0 } else if strings.HasSuffix(s, "GTA") { s = s[0 : len(s)-3] base = 1000000000.0 } else if strings.HasSuffix(s, "TA") { s = s[0 : len(s)-2] } if valFloat, ok := new(big.Float).SetString(s); ok { valFloat = new(big.Float).Mul(valFloat, big.NewFloat(base)) ret, _ := valFloat.Int(nil) return ret, nil } return nil, errors.New("illegal args") } ================================================ FILE: zero/utils/utils_test.go ================================================ package utils import ( "fmt" "testing" "github.com/mohae/deepcopy" "github.com/sero-cash/go-czero-import/c_type" ) type copytest struct { M map[string]bool L []string P *c_type.Uint256 } func TestSnapshots(t *testing.T) { ct := copytest{} ct.M = make(map[string]bool) ct.M["hello"] = true ct.L = append(ct.L, "list") ct.P = &c_type.Uint256{1} ss := Snapshots{} ss.Push(0, &ct) ct1 := copytest{} ct1 = *ss.Revert(1).(*copytest) fmt.Print(ct1) } func TestDeepCopy(t *testing.T) { ct := copytest{} ct.M = make(map[string]bool) ct.M["hello"] = true ct.L = append(ct.L, "list") ct.P = &c_type.Uint256{1} tr := TR_enter("dp") cp := deepcopy.Copy(ct).(copytest) tr.Renter("cp") ctd := copytest{} DeepCopy(&ctd, &ct) tr.Leave() fmt.Print(cp) DeepCopy(&ct, &ct) } ================================================ FILE: zero/utils/work_chain.go ================================================ package utils import ( "runtime" ) type WorkResult struct { e error w Runner } type WorkChain struct { abort chan struct{} results chan *WorkResult } func (self *WorkChain) Release() { close(self.abort) } type Runner interface { Run() error } func NewWorkChain(runners []Runner) (ret *WorkChain) { ret = &WorkChain{} ret.abort = make(chan struct{}) if len(runners) == 0 { return } // Spawn as many workers as allowed threads workers := runtime.GOMAXPROCS(0) if len(runners) < workers { workers = len(runners) } // Create a task channel and spawn the verifiers var ( inputs = make(chan int) done = make(chan int, workers) errors = make([]*WorkResult, len(runners)) ) for i := 0; i < workers; i++ { go func() { for index := range inputs { runner := runners[index] errors[index] = &WorkResult{runner.Run(), runner} done <- index } }() } ret.results = make(chan *WorkResult, len(runners)) go func() { defer close(inputs) var ( in, out = 0, 0 checked = make([]bool, len(runners)) inputs = inputs ) for { select { case inputs <- in: if in++; in == len(runners) { // Reached end of headers. Stop sending to workers. inputs = nil } case index := <-done: for checked[index] = true; checked[out]; out++ { ret.results <- errors[out] if out == len(runners)-1 { return } } case <-ret.abort: return } } }() return } ================================================ FILE: zero/wallet/exchange/exchange.go ================================================ package exchange import ( "bytes" "errors" "fmt" "math/big" "sort" "strings" "sync" "sync/atomic" "time" "github.com/sero-cash/go-czero-import/superzk" "github.com/sero-cash/go-sero/common/address" "github.com/sero-cash/go-sero/zero/txtool" "github.com/sero-cash/go-sero/zero/txtool/flight" "github.com/sero-cash/go-sero/zero/txtool/prepare" "github.com/sero-cash/go-sero/common/hexutil" "github.com/robfig/cron" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/accounts" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core" "github.com/sero-cash/go-sero/core/types" "github.com/sero-cash/go-sero/event" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/rlp" "github.com/sero-cash/go-sero/serodb" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-sero/zero/utils" ) type Account struct { wallet accounts.Wallet pk *c_type.Uint512 tk *c_type.Tk skr c_type.PKr mainPkr c_type.PKr balancePkr *c_type.PKr balances map[string]*big.Int tickets map[string][]*common.Hash utxoNums map[string]uint64 isChanged bool nextMergeTime time.Time version int } type PkrAccount struct { Pkr c_type.PKr balances map[string]*big.Int num uint64 } type UtxoList []Utxo func (list UtxoList) Len() int { return len(list) } func (list UtxoList) Swap(i, j int) { list[i], list[j] = list[j], list[i] } func (list UtxoList) Less(i, j int) bool { if list[i].flag == list[j].flag { return list[i].Asset.Tkn.Value.ToIntRef().Cmp(list[j].Asset.Tkn.Value.ToIntRef()) < 0 } else { return list[i].flag < list[j].flag } } func (list UtxoList) Roots() (roots prepare.Utxos) { for _, utxo := range list { roots = append(roots, prepare.Utxo{utxo.Root, utxo.Asset}) } return } type ( HandleUtxoFunc func(utxo Utxo) ) type PkKey struct { key c_type.Uint512 Num uint64 } type PkrKey struct { pkr c_type.PKr num uint64 } type FetchJob struct { start uint64 accounts []Account } type Exchange struct { db *serodb.LDBDatabase txPool *core.TxPool accountManager *accounts.Manager accounts sync.Map pkrAccounts sync.Map usedFlag sync.Map numbers sync.Map feed event.Feed updater event.Subscription // Wallet update subscriptions for all backends update chan accounts.WalletEvent // Subscription sink for backend wallet changes quit chan chan error lock sync.RWMutex } var current_exchange *Exchange func CurrentExchange() *Exchange { return current_exchange } func NewExchange(dbpath string, txPool *core.TxPool, accountManager *accounts.Manager, autoMerge bool) (exchange *Exchange) { update := make(chan accounts.WalletEvent, 1) updater := accountManager.Subscribe(update) exchange = &Exchange{ txPool: txPool, accountManager: accountManager, update: update, updater: updater, } current_exchange = exchange db, err := serodb.NewLDBDatabase(dbpath, 1024, 1024) if err != nil { panic(err) } exchange.db = db exchange.numbers = sync.Map{} exchange.accounts = sync.Map{} for _, w := range accountManager.Wallets() { exchange.initWallet(w) } exchange.pkrAccounts = sync.Map{} exchange.usedFlag = sync.Map{} AddJob("0/10 * * * * ?", exchange.fetchBlockInfo) if autoMerge { AddJob("0 0/5 * * * ?", exchange.merge) } go exchange.updateAccount() log.Info("Init NewExchange success") return } func (self *Exchange) initWallet(w accounts.Wallet) { if _, ok := self.accounts.Load(w.Accounts()[0].GetPk()); !ok { account := Account{} account.wallet = w account.pk = w.Accounts()[0].GetPk().NewRef() account.tk = w.Accounts()[0].Tk.ToTk().NewRef() copy(account.skr[:], account.tk[:]) account.mainPkr = w.Accounts()[0].GetDefaultPkr(1) account.isChanged = true account.nextMergeTime = time.Now() account.version = w.Accounts()[0].Version self.accounts.Store(*account.pk, &account) balancePkr := self.getBalancePkr(account.pk) if balancePkr != nil { if superzk.IsMyPKr(account.tk, balancePkr) { account.balancePkr = balancePkr } } if num := self.starNum(account.pk); num > w.Accounts()[0].At { self.numbers.Store(*account.pk, num) } else { self.numbers.Store(*account.pk, w.Accounts()[0].At) } log.Info("Add PK", "pk", w.Accounts()[0].Address, "At", self.GetCurrencyNumber(*account.pk)) } } func (self *Exchange) starNum(pk *c_type.Uint512) uint64 { value, err := self.db.Get(numKey(*pk)) if err != nil { return 0 } return utils.DecodeNumber(value) } func (self *Exchange) getBalancePkr(pk *c_type.Uint512) *c_type.PKr { value, err := self.db.Get(balancPkrKey(*pk)) if err != nil { return nil } var pkr c_type.PKr err = rlp.DecodeBytes(value, &pkr) if err != nil { return nil } return &pkr } func (self *Exchange) putBalancePkr(pk *c_type.Uint512, pkr c_type.PKr) error { data, err := rlp.EncodeToBytes(&pkr) if err != nil { return err } err = self.db.Put(balancPkrKey(*pk), data) if err != nil { return err } return nil } func (self *Exchange) SetBalancePkr(pk *c_type.Uint512, pkr c_type.PKr) error { err := self.putBalancePkr(pk, pkr) if err != nil { return err } value, ok := self.accounts.Load(*pk) if !ok { return errors.New("account not exists") } account := value.(*Account) account.balancePkr = &pkr self.accounts.Store(pk, account) return nil } func (self *Exchange) updateAccount() { // Close all subscriptions when the manager terminates defer func() { self.lock.Lock() self.updater.Unsubscribe() self.updater = nil self.lock.Unlock() }() // Loop until termination for { select { case event := <-self.update: // Wallet event arrived, update local cache self.lock.Lock() switch event.Kind { case accounts.WalletArrived: // wallet := event.Wallet self.initWallet(event.Wallet) case accounts.WalletDropped: address := event.Wallet.Accounts()[0].Address self.numbers.Delete(address.ToUint512()) } self.lock.Unlock() case errc := <-self.quit: // Manager terminating, return errc <- nil return } } } func (self *Exchange) GetUtxoNum(pk c_type.Uint512) map[string]uint64 { if account := self.getAccountByPk(pk); account != nil { return account.utxoNums } return map[string]uint64{} } func (self *Exchange) GetRootByNil(Nil c_type.Uint256) (root *c_type.Uint256) { data, err := self.db.Get(nilToRootKey(Nil)) if err != nil { return } root = &c_type.Uint256{} copy(root[:], data[:]) return } func (self *Exchange) GetCurrencyNumber(pk c_type.Uint512) uint64 { value, ok := self.numbers.Load(pk) if !ok { return 0 } if value.(uint64) == 0 { return value.(uint64) } return value.(uint64) - 1 } func (self *Exchange) GetPkr(pk *c_type.Uint512, index *c_type.Uint256) (pkr c_type.PKr, err error) { if index == nil { return pkr, errors.New("index must not be empty") } if new(big.Int).SetBytes(index[:]).Cmp(big.NewInt(100)) < 0 { return pkr, errors.New("index must > 100") } if value, ok := self.accounts.Load(*pk); !ok { return pkr, errors.New("not found Pk") } else { acc := value.(*Account) return acc.wallet.Accounts()[0].GetPkr(index), nil } } func (self *Exchange) ClearUsedFlagForPK(pk *c_type.Uint512) (count int) { if _, ok := self.accounts.Load(*pk); ok { prefix := append(pkPrefix, pk[:]...) iterator := self.db.NewIteratorWithPrefix(prefix) for iterator.Next() { key := iterator.Key() var root c_type.Uint256 copy(root[:], key[98:130]) if _, flag := self.usedFlag.Load(root); flag { self.usedFlag.Delete(root) count++ } } iterator.Release() } return } func (self *Exchange) ClearUsedFlagForRoot(root c_type.Uint256) (count int) { if _, flag := self.usedFlag.Load(root); flag { self.usedFlag.Delete(root) count++ } return } func (self *Exchange) GetLockedBalances(pk c_type.Uint512) (balances map[string]*big.Int) { if _, ok := self.accounts.Load(pk); ok { prefix := append(pkPrefix, pk[:]...) iterator := self.db.NewIteratorWithPrefix(prefix) balances = map[string]*big.Int{} for iterator.Next() { key := iterator.Key() var root c_type.Uint256 copy(root[:], key[98:130]) if utxo, err := self.getUtxo(root); err == nil { if utxo.Asset.Tkn != nil { currency := common.BytesToString(utxo.Asset.Tkn.Currency[:]) if _, flag := self.usedFlag.Load(utxo.Root); flag { if amount, ok := balances[currency]; ok { amount.Add(amount, utxo.Asset.Tkn.Value.ToIntRef()) } else { balances[currency] = new(big.Int).Set(utxo.Asset.Tkn.Value.ToIntRef()) } currency_locked_key := currency + "_locked" if amount, ok := balances[currency_locked_key]; ok { amount.Add(amount, big.NewInt(1)) } else { balances[currency_locked_key] = big.NewInt(1) } } } } } iterator.Release() return balances } return } func (self *Exchange) GetMaxAvailable(pk c_type.Uint512, currency string) (amount *big.Int) { currency = strings.ToUpper(currency) prefix := append(pkPrefix, append(pk[:], common.LeftPadBytes([]byte(currency), 32)...)...) iterator := self.db.NewIteratorWithPrefix(prefix) amount = new(big.Int) count := 0 for iterator.Next() { key := iterator.Key() var root c_type.Uint256 copy(root[:], key[98:130]) if utxo, err := self.getUtxo(root); err == nil { if utxo.Ignore { continue } if _, flag := self.usedFlag.Load(utxo.Root); !flag { if utxo.Asset.Tkn != nil { if utxo.IsZ { amount.Add(amount, utxo.Asset.Tkn.Value.ToIntRef()) } else { if count < 2500 { amount.Add(amount, utxo.Asset.Tkn.Value.ToIntRef()) count++ } } } } } } iterator.Release() return } func (self *Exchange) IgnorePkrUtxos(pkr c_type.PKr, ignore bool) (utxos []Utxo, e error) { account := self.getAccountByPkr(pkr) if account == nil { e = errors.New("not found PK by pkr") return } pk := account.pk prefix := append(pkPrefix, pk[:]...) iterator := self.db.NewIteratorWithPrefix(prefix) for iterator.Next() { key := iterator.Key() var root c_type.Uint256 copy(root[:], key[98:130]) if utxo, err := self.getUtxo(root); err == nil { if utxo.Pkr == pkr { utxos = append(utxos, utxo) } } else { e = err iterator.Release() return } } iterator.Release() if len(utxos) > 0 { batch := self.db.NewBatch() for _, utxo := range utxos { utxo.Ignore = ignore if bs, err := rlp.EncodeToBytes(&utxo); err == nil { if err := batch.Put(rootKey(utxo.Root), bs); err != nil { e = err return } } else { e = err return } } if e = batch.Write(); e != nil { return } account.isChanged = true } return } func (self *Exchange) GetBalances(pk c_type.Uint512) (balances map[string]*big.Int, tickets map[string][]*common.Hash) { if value, ok := self.accounts.Load(pk); ok { account := value.(*Account) if account.isChanged { prefix := append(pkPrefix, pk[:]...) iterator := self.db.NewIteratorWithPrefix(prefix) balances = map[string]*big.Int{} tickets = make(map[string][]*common.Hash) utxoNums := map[string]uint64{} for iterator.Next() { key := iterator.Key() var root c_type.Uint256 copy(root[:], key[98:130]) if utxo, err := self.getUtxo(root); err == nil { if utxo.Ignore { continue } if utxo.Asset.Tkn != nil { currency := common.BytesToString(utxo.Asset.Tkn.Currency[:]) if amount, ok := balances[currency]; ok { amount.Add(amount, utxo.Asset.Tkn.Value.ToIntRef()) utxoNums[currency] += 1 } else { balances[currency] = new(big.Int).Set(utxo.Asset.Tkn.Value.ToIntRef()) utxoNums[currency] = 1 } } if utxo.Asset.Tkt != nil { category := common.BytesToString(utxo.Asset.Tkt.Category[:]) ticket := common.BytesToHash(utxo.Asset.Tkt.Value[:]) if _, ok := tickets[category]; ok { tickets[category] = append(tickets[category], &ticket) } else { tickets[category] = []*common.Hash{&ticket} } } } } iterator.Release() account.balances = balances account.tickets = tickets account.utxoNums = utxoNums account.isChanged = false } else { return account.balances, account.tickets } } return } type BlockInfo struct { Num uint64 Hash c_type.Uint256 Ins []c_type.Uint256 Outs []Utxo } func (self *Exchange) GetBlocksInfo(start, end uint64) (blocks []BlockInfo, err error) { iterator := self.db.NewIteratorWithPrefix(blockPrefix) for ok := iterator.Seek(blockKey(start)); ok; ok = iterator.Next() { key := iterator.Key() num := utils.DecodeNumber(key[5:13]) if num >= end { break } var block BlockInfo if err = rlp.Decode(bytes.NewReader(iterator.Value()), &block); err != nil { log.Error("Exchange Invalid block RLP", "Num", num, "err", err) iterator.Release() return } blocks = append(blocks, block) } iterator.Release() return } func (self *Exchange) GetRecordsByTxHash(txHash c_type.Uint256) (records []Utxo, err error) { data, err := self.db.Get(txKey(txHash)) if err != nil { return } if err = rlp.Decode(bytes.NewReader(data), &records); err != nil { log.Error("Invalid utxos RLP", "txHash", common.Bytes2Hex(txHash[:]), "err", err) return } return } func (self *Exchange) GetRecordsByPk(pk *c_type.Uint512, begin, end uint64) (records []Utxo, err error) { err = self.iteratorUtxo(pk, begin, end, func(utxo Utxo) { records = append(records, utxo) }) return } func (self *Exchange) GetRecordsByPkr(pkr c_type.PKr, begin, end uint64) (records []Utxo, err error) { account := self.getAccountByPkr(pkr) if account == nil { err = errors.New("not found PK by pkr") return } pk := account.pk err = self.iteratorUtxo(pk, begin, end, func(utxo Utxo) { if pkr != utxo.Pkr { return } records = append(records, utxo) }) return } func (self *Exchange) GenTxWithSign(param prepare.PreTxParam) (pretx *txtool.GTxParam, tx *txtool.GTx, e error) { if self == nil { e = errors.New("exchange instance is nil") return } var roots prepare.Utxos if roots, e = prepare.SelectUtxos(¶m, self); e != nil { return } var account *Account if value, ok := self.accounts.Load(param.From); ok { account = value.(*Account) } else { e = errors.New("not found Pk") return } if param.RefundTo == nil { if param.RefundTo = self.DefaultRefundTo(¶m.From); param.RefundTo == nil { e = errors.New("can not find default refund to") return } } bparam := prepare.BeforeTxParam{ param.Fee, *param.GasPrice, roots, *param.RefundTo, param.Receptions, param.Cmds, } if pretx, tx, e = self.genTx(account, &bparam); e != nil { log.Error("Exchange genTx", "error", e) return } tx.Hash = tx.Tx.ToHash() log.Info("Exchange genTx success") return } func (self *Exchange) getAccountByPk(pk c_type.Uint512) *Account { if value, ok := self.accounts.Load(pk); ok { return value.(*Account) } return nil } func (self *Exchange) getAccountByPkr(pkr c_type.PKr) (a *Account) { self.accounts.Range(func(pk, value interface{}) bool { account := value.(*Account) if superzk.IsMyPKr(account.tk, &pkr) { a = account return false } return true }) return } func (self *Exchange) ClearTxParam(txParam *txtool.GTxParam) (count int) { if self == nil { return } if txParam == nil { return } for _, in := range txParam.Ins { count += self.ClearUsedFlagForRoot(in.Out.Root) } return } func (self *Exchange) genTx(account *Account, param *prepare.BeforeTxParam) (txParam *txtool.GTxParam, tx *txtool.GTx, e error) { if txParam, e = self.buildTxParam(param); e != nil { return } var seed *address.Seed if seed, e = account.wallet.GetSeed(); e != nil { self.ClearTxParam(txParam) return } sk := superzk.Seed2Sk(seed.SeedToUint256(), account.version) gtx, err := flight.SignTx(&sk, txParam) if err != nil { self.ClearTxParam(txParam) e = err return } else { tx = >x return } } func (self *Exchange) commitTx(tx *txtool.GTx) (err error) { gasPrice := big.Int(tx.GasPrice) gas := uint64(tx.Gas) signedTx := types.NewTxWithGTx(gas, &gasPrice, &tx.Tx) log.Info("Exchange commitTx", "txhash", signedTx.Hash().String()) err = self.txPool.AddLocal(signedTx) return err } func (self *Exchange) iteratorUtxo(Pk *c_type.Uint512, begin, end uint64, handler HandleUtxoFunc) (e error) { var pk c_type.Uint512 if Pk != nil { pk = *Pk } iterator := self.db.NewIteratorWithPrefix(utxoPrefix) for ok := iterator.Seek(utxoKey(begin, pk)); ok; ok = iterator.Next() { key := iterator.Key() num := utils.DecodeNumber(key[4:12]) if num >= end { break } copy(pk[:], key[12:76]) if Pk != nil && *Pk != pk { continue } value := iterator.Value() roots := []c_type.Uint256{} if err := rlp.Decode(bytes.NewReader(value), &roots); err != nil { log.Error("Invalid roots RLP", "accoutKey", common.Bytes2Hex(pk[:]), "blockNumber", num, "err", err) e = err iterator.Release() return } for _, root := range roots { if utxo, err := self.getUtxo(root); err != nil { return } else { handler(utxo) } } } iterator.Release() return } var ignorePKr = common.Base58ToAddress("i3zesDa26i7jAtkR2fBYBeZsoQ7NAJxQNCsbgwvaWap3HVDGmvzsQSLqTZRyadswzBoC4edWYJzejyY6AXVhGkcqFYVvVPH1w5vHfvbazp1ReQ5Wa9qi15UPAwztrxe9oJQ").ToPKr() func (self *Exchange) getUtxo(root c_type.Uint256) (utxo Utxo, e error) { data, err := self.db.Get(rootKey(root)) if err != nil { return } if err := rlp.Decode(bytes.NewReader(data), &utxo); err != nil { log.Error("Exchange Invalid utxo RLP", "root", common.Bytes2Hex(root[:]), "err", err) e = err return } if utxo.Pkr == *ignorePKr { utxo.Ignore = true } if value, ok := self.usedFlag.Load(utxo.Root); ok { utxo.flag = value.(int) } return } func (self *Exchange) findUtxosByTicket(pk *c_type.Uint512, tickets []assets.Ticket) (utxos []Utxo, remain map[c_type.Uint256]c_type.Uint256) { remain = map[c_type.Uint256]c_type.Uint256{} for _, ticket := range tickets { remain[ticket.Value] = ticket.Category prefix := append(pkPrefix, append(pk[:], ticket.Value[:]...)...) iterator := self.db.NewIteratorWithPrefix(prefix) if iterator.Next() { key := iterator.Key() var root c_type.Uint256 copy(root[:], key[98:130]) if utxo, err := self.getUtxo(root); err == nil { if utxo.Ignore { continue } if utxo.Asset.Tkt != nil && utxo.Asset.Tkt.Category == ticket.Category { if _, ok := self.usedFlag.Load(utxo.Root); !ok { utxos = append(utxos, utxo) delete(remain, ticket.Value) } } } } iterator.Release() } return } func (self *Exchange) findUtxos(pk *c_type.Uint512, currency string, amount *big.Int) (utxos []Utxo, remain *big.Int) { remain = new(big.Int).Set(amount) currency = strings.ToUpper(currency) prefix := append(pkPrefix, append(pk[:], common.LeftPadBytes([]byte(currency), 32)...)...) iterator := self.db.NewIteratorWithPrefix(prefix) for iterator.Next() { key := iterator.Key() var root c_type.Uint256 copy(root[:], key[98:130]) if utxo, err := self.getUtxo(root); err == nil { if utxo.Ignore { continue } if utxo.Asset.Tkn != nil { if _, ok := self.usedFlag.Load(utxo.Root); !ok { utxos = append(utxos, utxo) remain.Sub(remain, utxo.Asset.Tkn.Value.ToIntRef()) if remain.Sign() <= 0 { break } } } } } iterator.Release() return } func DecOuts(outs []txtool.Out, skr *c_type.PKr) (douts []txtool.DOut) { tk := c_type.Tk{} copy(tk[:], skr[:]) tdouts := flight.DecOut(&tk, outs) for _, tdout := range tdouts { ot := txtool.DOut{ Asset: tdout.Asset, Memo: tdout.Memo, } if len(tdout.Nils) > 0 { ot.Nil = tdout.Nils[0] } douts = append(douts, ot) } return } type uint64Slice []uint64 func (c uint64Slice) Len() int { return len(c) } func (c uint64Slice) Swap(i, j int) { c[i], c[j] = c[j], c[i] } func (c uint64Slice) Less(i, j int) bool { return c[i] < c[j] } var fetchCount = uint64(5000) func (self *Exchange) fetchBlockInfo() { if txtool.Ref_inst.Bc == nil || !txtool.Ref_inst.Bc.IsValid() { return } for { indexs := map[uint64][]c_type.Uint512{} orders := uint64Slice{} self.numbers.Range(func(key, value interface{}) bool { pk := key.(c_type.Uint512) num := value.(uint64) if list, ok := indexs[num]; ok { indexs[num] = append(list, pk) } else { indexs[num] = []c_type.Uint512{pk} orders = append(orders, num) } return true }) if orders.Len() == 0 { return } sort.Sort(orders) start := orders[0] end := start + fetchCount if orders.Len() > 1 { end = orders[1] } accountKeys := indexs[start] for end > start { count := fetchCount if end-start < fetchCount { count = end - start } if count == 0 { return } if self.fetchAndIndexUtxo(start, count, accountKeys) < int(count) { return } start += count } } } func (self *Exchange) fetchAndIndexUtxo(start, countBlock uint64, pks []c_type.Uint512) (count int) { blocks, err := flight.SRI_Inst.GetBlocksInfo(start, countBlock) if err != nil { log.Info("Exchange GetBlocksInfo", "error", err) return } if len(blocks) == 0 { return } utxosMap := map[PkKey][]Utxo{} nilsMap := map[c_type.Uint256]Utxo{} nils := []c_type.Uint256{} blockMap := map[uint64]*BlockInfo{} for _, block := range blocks { num := uint64(block.Num) utxos := []Utxo{} for _, out := range block.Outs { pkr := out.State.OS.ToPKr() if pkr == nil { continue } account, ok := self.ownPkr(pks, *pkr) // log.Info("index", ">>>>", account.wallet.Accounts()[0].Address.String()) if !ok { continue } key := PkKey{key: *account.pk, Num: out.State.Num} dout := DecOuts([]txtool.Out{out}, &account.skr)[0] if dout.Nil == c_type.Empty_Uint256 { continue } utxo := Utxo{Pkr: *pkr, Root: out.Root, Nil: dout.Nil, TxHash: out.State.TxHash, Num: out.State.Num, Asset: dout.Asset, IsZ: out.State.OS.IsZero()} nilsMap[utxo.Root] = utxo nilsMap[utxo.Nil] = utxo if list, ok := utxosMap[key]; ok { utxosMap[key] = append(list, utxo) } else { utxosMap[key] = []Utxo{utxo} } utxos = append(utxos, utxo) } if len(utxos) > 0 { blockMap[num] = &BlockInfo{Num: num, Hash: block.Hash, Outs: utxos} } if len(block.Nils) > 0 { roots := []c_type.Uint256{} for _, Nil := range block.Nils { var utxo Utxo if value, ok := nilsMap[Nil]; ok { utxo = value } else { value, _ := self.db.Get(nilKey(Nil)) if value != nil { var root c_type.Uint256 copy(root[:], value[98:130]) if utxo, err = self.getUtxo(root); err != nil { continue } else { var pk c_type.Uint512 copy(pk[:], value[2:66]) } } else { continue } } nils = append(nils, Nil) roots = append(roots, utxo.Root) } if len(roots) > 0 { if blockInfo, ok := blockMap[num]; ok { blockInfo.Ins = roots } else { blockMap[num] = &BlockInfo{Num: num, Hash: block.Hash, Ins: roots} } } } } batch := self.db.NewBatch() self.indexPkgs(pks, batch, blocks) var roots []c_type.Uint256 if len(utxosMap) > 0 || len(nils) > 0 { if roots, err = self.indexBlocks(batch, utxosMap, blockMap, nils); err != nil { log.Error("indexBlocks ", "error", err) return } } count = len(blocks) num := uint64(blocks[count-1].Num) + 1 // "NUM"+PK => Num data := utils.EncodeNumber(num) for _, pk := range pks { batch.Put(numKey(pk), data) } err = batch.Write() if err == nil { for _, pk := range pks { self.numbers.Store(pk, num) } } for _, root := range roots { self.usedFlag.Delete(root) } log.Info("Exchange indexed", "blockNumber", num-1) return } func (self *Exchange) indexBlocks(batch serodb.Batch, utxosMap map[PkKey][]Utxo, blockMap map[uint64]*BlockInfo, nils []c_type.Uint256) (delRoots []c_type.Uint256, err error) { ops := map[string]string{} for num, blockInfo := range blockMap { data, e := rlp.EncodeToBytes(&blockInfo) if e != nil { err = e return } batch.Put(blockKey(num), data) } txMap := map[c_type.Uint256][]Utxo{} for key, list := range utxosMap { roots := []c_type.Uint256{} for _, utxo := range list { data, e := rlp.EncodeToBytes(&utxo) if e != nil { err = e return } // "ROOT" + root batch.Put(rootKey(utxo.Root), data) // nil => root batch.Put(nilToRootKey(utxo.Nil), utxo.Root[:]) var pkKeys []byte if utxo.Asset.Tkn != nil { // "PK" + PK + currency + root pkKey := utxoPkKey(key.key, utxo.Asset.Tkn.Currency[:], &utxo.Root) ops[common.Bytes2Hex(pkKey)] = common.Bytes2Hex([]byte{0}) pkKeys = append(pkKeys, pkKey...) } if utxo.Asset.Tkt != nil { // "PK" + PK + tkt + root pkKey := utxoPkKey(key.key, utxo.Asset.Tkt.Value[:], &utxo.Root) ops[common.Bytes2Hex(pkKey)] = common.Bytes2Hex([]byte{0}) pkKeys = append(pkKeys, pkKey...) } // "PK" + PK + currency + root => 0 // "NIL" + PK + tkt + root => "PK" + PK + currency + root nilkey := nilKey(utxo.Nil) rootkey := nilKey(utxo.Root) // "NIL" +nil/root => pkKey ops[common.Bytes2Hex(nilkey)] = common.Bytes2Hex(pkKeys) ops[common.Bytes2Hex(rootkey)] = common.Bytes2Hex(pkKeys) roots = append(roots, utxo.Root) if list, ok := txMap[utxo.TxHash]; ok { txMap[utxo.TxHash] = append(list, utxo) } else { txMap[utxo.TxHash] = []Utxo{utxo} } // log.Info("Index add", "PK", base58.EncodeToString(key.PK[:]), "Nil", common.Bytes2Hex(utxo.Nil[:]), "root", common.Bytes2Hex(utxo.Root[:]), "Value", utxo.Asset.Tkn.Value) } data, e := rlp.EncodeToBytes(&roots) if e != nil { err = e return } // blockNumber + PK => [roots] batch.Put(utxoKey(key.Num, key.key), data) if account := self.getAccountByPk(key.key); account != nil { account.isChanged = true } } for txHash, list := range txMap { key := txKey(txHash) data, e := self.db.Get(key) var records []Utxo if e == nil { if e = rlp.Decode(bytes.NewReader(data), &records); e != nil { err = e log.Error("Invalid utxos RLP", "txHash", common.Bytes2Hex(txHash[:]), "err", e) return } } records = append(records, list...) data, err = rlp.EncodeToBytes(&records) if err != nil { return nil, err } batch.Put(key, data) } for _, Nil := range nils { var pk c_type.Uint512 key := nilKey(Nil) hex := common.Bytes2Hex(key) if value, ok := ops[hex]; ok { delete(ops, hex) if len(value) == 260 { delete(ops, value) } else { delete(ops, value[0:260]) delete(ops, value[260:]) } var root c_type.Uint256 copy(root[:], value[98:130]) delete(ops, common.Bytes2Hex(nilKey(root))) // self.usedFlag.Delete(root) delRoots = append(delRoots, root) copy(pk[:], value[2:66]) } else { value, _ := self.db.Get(key) if value != nil { if len(value) == 130 { batch.Delete(value) } else { batch.Delete(value[0:130]) batch.Delete(value[130:260]) } batch.Delete(nilKey(Nil)) var root c_type.Uint256 copy(root[:], value[98:130]) batch.Delete(nilKey(root)) // self.usedFlag.Delete(root) delRoots = append(delRoots, root) copy(pk[:], value[2:66]) } } if account := self.getAccountByPk(pk); account != nil { account.isChanged = true } } for key, value := range ops { batch.Put(common.Hex2Bytes(key), common.Hex2Bytes(value)) } return } func (self *Exchange) ownPkr(pks []c_type.Uint512, pkr c_type.PKr) (account *Account, ok bool) { for _, pk := range pks { value, ok := self.accounts.Load(pk) if !ok { continue } account = value.(*Account) if account.balancePkr != nil { if pkr == *account.balancePkr { return account, true } } else { if superzk.IsMyPKr(account.tk, &pkr) { return account, true } } } return } type MergeUtxos struct { list UtxoList zcount int ocount int //amount big.Int //tickets map[c_type.Uint256]c_type.Uint256 } var default_fee_value = new(big.Int).Mul(big.NewInt(25000), big.NewInt(1000000000)) func (self *Exchange) getMergeUtxos(from *c_type.Uint512, currency string, zcount int, left int, icount int) (mu MergeUtxos, e error) { if zcount > 400 { e = errors.New("zout count must <= 400") } if icount <= 0 { icount = 1000 } ck := assets.NewCKState(true, &assets.Token{utils.CurrencyToUint256("SERO"), utils.U256(*default_fee_value)}) prefix := utxoPkKey(*from, common.LeftPadBytes([]byte(currency), 32), nil) iterator := self.db.NewIteratorWithPrefix(prefix) outxos := UtxoList{} zutxos := UtxoList{} for iterator.Next() { key := iterator.Key() var root c_type.Uint256 copy(root[:], key[98:130]) if utxo, err := self.getUtxo(root); err == nil { if utxo.Ignore { continue } if _, ok := self.usedFlag.Load(utxo.Root); !ok { if utxo.IsZ { zutxos = append(zutxos, utxo) } else { outxos = append(outxos, utxo) } } } if zutxos.Len() >= zcount+left { break } if outxos.Len()+zutxos.Len() >= icount+left { break } } iterator.Release() if outxos.Len() >= icount { zutxos = UtxoList{} } mu.ocount = outxos.Len() mu.zcount = zutxos.Len() utxos := append(zutxos, outxos...) if utxos.Len() <= left { e = fmt.Errorf("no need to merge the account, utxo count == %v", utxos.Len()) return } sort.Sort(utxos) mu.list = utxos[0 : utxos.Len()-(left-1)] for _, utxo := range mu.list { ck.AddIn(&utxo.Asset) } for _, tkn := range ck.Tkns() { if utxos, r := self.findUtxos(from, utils.BytesToCurrency(tkn.Currency[:]), tkn.Value.ToInt()); r == nil || r.Sign() > 0 { e = errors.New("No enough SERO coins for fee") return } else { mu.list = append(mu.list, utxos...) } } return } type MergeParam struct { From c_type.Uint512 To *c_type.PKr Currency string Zcount uint64 Left uint64 Icount uint64 } func (self *Exchange) GenMergeTx(mp *MergeParam) (txParam *txtool.GTxParam, e error) { account := self.getAccountByPk(mp.From) if account == nil { e = errors.New("account is nil") return } if mp.To == nil { mp.To = account.wallet.Accounts()[0].GetDefaultPkr(1).NewRef() } var mu MergeUtxos if mu, e = self.getMergeUtxos(account.pk, mp.Currency, int(mp.Zcount), int(mp.Left), int(mp.Icount)); e != nil { return } bytes := common.LeftPadBytes([]byte(mp.Currency), 32) var Currency c_type.Uint256 copy(Currency[:], bytes[:]) ck := assets.NewCKState(false, &assets.Token{utils.CurrencyToUint256("SERO"), utils.U256(*default_fee_value)}) for _, utxo := range mu.list { ck.AddIn(&utxo.Asset) } receptions := []prepare.Reception{} for _, utxo := range ck.Tkns() { receptions = append(receptions, prepare.Reception{ Addr: *mp.To, Asset: assets.Asset{ Tkn: &assets.Token{ Currency: utxo.Currency, Value: utxo.Value, }, }, }) } for _, utxo := range ck.Tkts() { receptions = append(receptions, prepare.Reception{ Addr: *mp.To, Asset: assets.Asset{ Tkt: &assets.Ticket{ Category: utxo.Category, Value: utxo.Value, }, }, }) } bparam := prepare.BeforeTxParam{ assets.Token{ utils.CurrencyToUint256("SERO"), utils.U256(*default_fee_value), }, *big.NewInt(1000000000), mu.list.Roots(), *mp.To, receptions, prepare.Cmds{}, } txParam, e = self.buildTxParam(&bparam) if e != nil { return } return } func (self *Exchange) Merge(pk *c_type.Uint512, currency string, force bool) (count int, txhash c_type.Uint256, e error) { account := self.getAccountByPk(*pk) if account == nil { e = errors.New("account is nil") return } seed, err := account.wallet.GetSeed() if err != nil || seed == nil { e = errors.New("account is locked") return } var mu MergeUtxos if mu, e = self.getMergeUtxos(account.pk, currency, 100, 50, 0); e != nil { return } if mu.zcount >= 100 || mu.ocount >= 2400 || time.Now().After(account.nextMergeTime) || force { count = mu.list.Len() bytes := common.LeftPadBytes([]byte(currency), 32) var Currency c_type.Uint256 copy(Currency[:], bytes[:]) ck := assets.NewCKState(false, &assets.Token{utils.CurrencyToUint256("SERO"), utils.U256(*default_fee_value)}) for _, utxo := range mu.list { ck.AddIn(&utxo.Asset) } receptions := []prepare.Reception{} for _, utxo := range ck.Tkns() { receptions = append(receptions, prepare.Reception{ Addr: account.mainPkr, Asset: assets.Asset{ Tkn: &assets.Token{ Currency: utxo.Currency, Value: utxo.Value, }, }, }) } for _, utxo := range ck.Tkts() { receptions = append(receptions, prepare.Reception{ Addr: account.mainPkr, Asset: assets.Asset{ Tkt: &assets.Ticket{ Category: utxo.Category, Value: utxo.Value, }, }, }) } bparam := prepare.BeforeTxParam{ assets.Token{ utils.CurrencyToUint256("SERO"), utils.U256(*default_fee_value), }, *big.NewInt(1000000000), mu.list.Roots(), account.mainPkr, receptions, prepare.Cmds{}, } pretx, gtx, err := self.genTx(account, &bparam) if err != nil { account.nextMergeTime = time.Now().Add(time.Hour * 6) e = err return } txhash = gtx.Hash if err := self.commitTx(gtx); err != nil { account.nextMergeTime = time.Now().Add(time.Hour * 6) self.ClearTxParam(pretx) e = err return } if mu.list.Len() < 100 { account.nextMergeTime = time.Now().Add(time.Hour * 6) } return } else { e = fmt.Errorf("no need to merge the account, utxo count == %v", mu.list.Len()) return } } func (self *Exchange) merge() { if txtool.Ref_inst.Bc == nil || !txtool.Ref_inst.Bc.IsValid() { return } self.accounts.Range(func(key, value interface{}) bool { account := value.(*Account) if count, txhash, err := self.Merge(account.pk, "SERO", false); err != nil { log.Error("autoMerge fail", "accountKey", *utils.Base58Encode(account.pk[:]), "count", count, "error", err) } else { log.Info("autoMerge succ", "accountKey", *utils.Base58Encode(account.pk[:]), "tx", hexutil.Encode(txhash[:]), "count", count) } return true }) } var ( numPrefix = []byte("NUM") balancPkrPrefix = []byte("BALANCPKR") pkPrefix = []byte("PK") utxoPrefix = []byte("UTXO") rootPrefix = []byte("ROOT") nilPrefix = []byte("NIL") blockPrefix = []byte("BLOCK") //outUtxoPrefix = []byte("OUTUTXO") txPrefix = []byte("TX") nilRootPrefix = []byte("NOILTOROOT") ) func nilToRootKey(nil c_type.Uint256) []byte { return append(nilRootPrefix, nil[:]...) } func txKey(txHash c_type.Uint256) []byte { return append(txPrefix, txHash[:]...) } func blockKey(number uint64) []byte { return append(blockPrefix, utils.EncodeNumber(number)...) } func numKey(pk c_type.Uint512) []byte { return append(numPrefix, pk[:]...) } func balancPkrKey(pk c_type.Uint512) []byte { return append(balancPkrPrefix, pk[:]...) } func nilKey(nil c_type.Uint256) []byte { return append(nilPrefix, nil[:]...) } func rootKey(root c_type.Uint256) []byte { return append(rootPrefix, root[:]...) } // func outUtxoKey(number uint64, pk c_type.Uint512) []byte { // return append(outUtxoPrefix, append(encodeNumber(number), pk[:]...)...) // } // utxoKey = PK + currency +root func utxoPkKey(pk c_type.Uint512, currency []byte, root *c_type.Uint256) []byte { key := append(pkPrefix, pk[:]...) if len(currency) > 0 { key = append(key, currency...) } if root != nil { key = append(key, root[:]...) } return key } func utxoKey(number uint64, pk c_type.Uint512) []byte { return append(utxoPrefix, append(utils.EncodeNumber(number), pk[:]...)...) } func AddJob(spec string, run RunFunc) *cron.Cron { c := cron.New() c.AddJob(spec, &RunJob{run: run}) c.Start() return c } type ( RunFunc func() ) type RunJob struct { running int32 run RunFunc } func (r *RunJob) Run() { x := atomic.LoadInt32(&r.running) if x == 1 { return } atomic.StoreInt32(&r.running, 1) defer func() { atomic.StoreInt32(&r.running, 0) }() r.run() } ================================================ FILE: zero/wallet/exchange/generate.go ================================================ package exchange import ( "math/big" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-sero/zero/txtool/prepare" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/txtool" ) func (self *Exchange) GenTx(param prepare.PreTxParam) (txParam *txtool.GTxParam, e error) { txParam, e = prepare.GenTxParam(¶m, self, &prepare.DefaultTxParamState{}) if e == nil && txParam != nil { for _, in := range txParam.Ins { self.usedFlag.Store(in.Out.Root, 1) } } return } func (self *Exchange) buildTxParam(param *prepare.BeforeTxParam) (txParam *txtool.GTxParam, e error) { txParam, e = prepare.BuildTxParam(&prepare.DefaultTxParamState{}, param) if e == nil && txParam != nil { for _, in := range txParam.Ins { self.usedFlag.Store(in.Out.Root, 1) } } return } func (self *Exchange) FindRoots(pk *c_type.Uint512, currency string, amount *big.Int) (roots prepare.Utxos, remain big.Int) { utxos, r := self.findUtxos(pk, currency, amount) for _, utxo := range utxos { roots = append(roots, prepare.Utxo{utxo.Root, utxo.Asset}) } remain = *r return } func (self *Exchange) FindRootsByTicket(pk *c_type.Uint512, tickets []assets.Ticket) (roots prepare.Utxos, remain map[c_type.Uint256]c_type.Uint256) { utxos, remain := self.findUtxosByTicket(pk, tickets) for _, utxo := range utxos { roots = append(roots, prepare.Utxo{utxo.Root, utxo.Asset}) } return } func (self *Exchange) DefaultRefundTo(pk *c_type.Uint512) (ret *c_type.PKr) { if value, ok := self.accounts.Load(*pk); ok { account := value.(*Account) return &account.mainPkr } return nil } func (self *Exchange) GetRoot(root *c_type.Uint256) (utxos *prepare.Utxo) { if u, e := self.getUtxo(*root); e != nil { return nil } else { return &prepare.Utxo{u.Root, u.Asset} } } ================================================ FILE: zero/wallet/exchange/pkg.go ================================================ package exchange import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/rlp" "github.com/sero-cash/go-sero/serodb" "github.com/sero-cash/go-sero/zero/localdb" "github.com/sero-cash/go-sero/zero/txtool" ) var ( pk_from_id_2_id_KeyPrefix = []byte("PK_FROM_ID_2_ID") id_2_pkg_KeyPrefix = []byte("ID_2_PKG") ) func pk_from_id_2_id_Key(pk *c_type.Uint512, from *bool, id *c_type.Uint256) []byte { ret := append(pk_from_id_2_id_KeyPrefix, pk[:]...) if from != nil { f := byte(0) if *from { f = byte(1) } ret = append(ret, f) } if id != nil { ret = append(ret, id[:]...) } return ret } type Pkg struct { z localdb.ZPkg to *c_type.Uint512 `rlp: nil` from *c_type.Uint512 `rlp: nil` } func id_2_pkg_key(id *c_type.Uint256) []byte { ret := append(id_2_pkg_KeyPrefix, id[:]...) return ret } func (self *Exchange) FindPkgs(pk *c_type.Uint512, from bool) (pkgs []Pkg) { prefix := pk_from_id_2_id_Key(pk, &from, nil) iterator := self.db.NewIteratorWithPrefix(prefix) for iterator.Next() { if id := iterator.Value(); len(id) == 32 { i := c_type.Uint256{} copy(i[:], id[:]) if pkg := self.FindPkgById(&i); pkg != nil { pkgs = append(pkgs, *pkg) } else { log.Error("find pkg error", "pkg", id) } } else { log.Error("pkg id error", "pkg", id) } } iterator.Release() return } func (self *Exchange) FindPkgById(id *c_type.Uint256) (pkg *Pkg) { if bs, e := self.db.Get(id_2_pkg_key(id)); e != nil { return } else { pkg := Pkg{} if e := rlp.DecodeBytes(bs, &pkg); e == nil { return &pkg } else { panic(e) } } } type pkgIndexes struct { deleteKeys [][]byte pk_from_id_maps map[string]c_type.Uint256 } func (self *Exchange) indexPkgs(pks []c_type.Uint512, batch serodb.Batch, blocks []txtool.Block) { for _, block := range blocks { for _, pkg := range block.Pkgs { if p := self.FindPkgById(&pkg.Pack.Id); p != nil { if p.to != nil { from := false batch.Delete(pk_from_id_2_id_Key(p.to, &from, &p.z.Pack.Id)) } if p.from != nil { from := true batch.Delete(pk_from_id_2_id_Key(p.to, &from, &p.z.Pack.Id)) } batch.Delete(id_2_pkg_key(&p.z.Pack.Id)) } var p Pkg if account, ok := self.ownPkr(pks, pkg.Pack.PKr); ok { p.to = account.pk } if account, ok := self.ownPkr(pks, pkg.From); ok { p.from = account.pk } if p.from != nil || p.to != nil { if !pkg.Closed { p.z = pkg if bs, e := rlp.EncodeToBytes(&p); e == nil { if p.to != nil { from := false if e := batch.Put(pk_from_id_2_id_Key(p.to, &from, &p.z.Pack.Id), p.z.Pack.Id[:]); e != nil { panic(e) } } if p.from != nil { from := true if e := batch.Put(pk_from_id_2_id_Key(p.to, &from, &p.z.Pack.Id), p.z.Pack.Id[:]); e != nil { panic(e) } } if e := batch.Put(id_2_pkg_key(&p.z.Pack.Id), bs); e != nil { panic(e) } } else { panic(e) } } } } } return } ================================================ FILE: zero/wallet/exchange/utxo.go ================================================ package exchange import ( "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/txs/assets" ) type Utxo struct { Pkr c_type.PKr Root c_type.Uint256 TxHash c_type.Uint256 Nil c_type.Uint256 Num uint64 Asset assets.Asset IsZ bool Ignore bool flag int } func (utxo *Utxo) NilTxType() string { if c_superzk.IsSzkNil(&utxo.Nil) { return "SZK" } else { return "CZERO" } } ================================================ FILE: zero/wallet/exchange/utxo_version.go ================================================ package exchange import ( "io" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/core/types/vserial" "github.com/sero-cash/go-sero/rlp" "github.com/sero-cash/go-sero/zero/txs/assets" ) type Utxo_Version0 struct { Pkr c_type.PKr Root c_type.Uint256 TxHash c_type.Uint256 Nil c_type.Uint256 Num uint64 Asset assets.Asset IsZ bool } type Utxo_Version1 struct { Ignore bool } func (b *Utxo) DecodeRLP(s *rlp.Stream) error { vs := vserial.NewVSerial() v0 := Utxo_Version0{} v1 := Utxo_Version1{} vs.Add(&v0, vserial.VERSION_0) vs.Add(&v1, vserial.VERSION_1) if e := s.Decode(&vs); e != nil { return e } if vs.V() <= vserial.VERSION_1 { SetUtxoForVersion0(b, &v0) if vs.V() >= vserial.VERSION_1 { SetUtxoForVersion1(b, &v1) } } return nil } func SetVersion0ForUtxo(v0 *Utxo_Version0, b *Utxo) { v0.Pkr = b.Pkr v0.Root = b.Root v0.TxHash = b.TxHash v0.Nil = b.Nil v0.Num = b.Num v0.Asset = b.Asset v0.IsZ = b.IsZ } func SetUtxoForVersion0(b *Utxo, v0 *Utxo_Version0) { b.Pkr = v0.Pkr b.Root = v0.Root b.TxHash = v0.TxHash b.Nil = v0.Nil b.Num = v0.Num b.Asset = v0.Asset b.IsZ = v0.IsZ } func SetVersion1ForUtxo(v1 *Utxo_Version1, b *Utxo) { v1.Ignore = b.Ignore } func SetUtxoForVersion1(b *Utxo, v1 *Utxo_Version1) { b.Ignore = v1.Ignore } func (b *Utxo) EncodeRLP(w io.Writer) error { vs := vserial.NewVSerial() v0 := Utxo_Version0{} SetVersion0ForUtxo(&v0, b) vs.Add(&v0, vserial.VERSION_0) if b.Ignore { v1 := Utxo_Version1{} SetVersion1ForUtxo(&v1, b) vs.Add(&v1, vserial.VERSION_1) } return rlp.Encode(w, &vs) } ================================================ FILE: zero/wallet/light/api.go ================================================ package light import ( "bytes" "sort" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/rlp" "github.com/sero-cash/go-sero/zero/txtool" ) var Current_light *LightNode func (self *LightNode) CurrentLight() *LightNode { return Current_light } const pageSize = uint64(100000) func (self *LightNode) GetOutsByPKr(pkrs []c_type.PKr, start uint64, end *uint64) (br BlockOutResp, e error) { br.CurrentNum = self.getLastNumber() br.PageSize = pageSize blockOuts := []BlockOut{} if end == nil { end = &br.CurrentNum } else { if *end == 0 { *end = start + pageSize } } for _, pkr := range pkrs { //uPKr := pkr.ToUint512() prefix := append(pkrPrefix, pkr[:]...) iterator := self.db.NewIteratorWithPrefix(prefix) for ok := iterator.Seek(pkrKey(pkr, start)); ok; ok = iterator.Next() { key := iterator.Key() num := bytesToUint64(key[99:107]) if num > *end { break } var bds []BlockData if err := rlp.Decode(bytes.NewReader(iterator.Value()), &bds); err != nil { log.Error("Light Invalid block RLP", "Num:", num, "err:", err) iterator.Release() return br, err } else { blockOut := BlockOut{Num: num, Data: bds} blockOuts = append(blockOuts, blockOut) } } iterator.Release() } br.BlockOuts = blockOuts return br, nil } func (self *LightNode) GetPendingOuts(pkrs []c_type.PKr) (br BlockOutResp, e error) { blockOuts := []BlockOut{} numBlokcDatas := self.CurrentLight().getImmatureTx(pkrs) if pendingBlockOuts, ok := numBlokcDatas[0]; ok { if len(pendingBlockOuts) > 0 { blockOut := BlockOut{Num: 0, Data: pendingBlockOuts} blockOuts = append(blockOuts, blockOut) } } immatureBlokOuts := BlocOuts{} for k, v := range numBlokcDatas { if k != 0 { blockOut := BlockOut{Num: k, Data: v} immatureBlokOuts = append(immatureBlokOuts, blockOut) } } sort.Sort(immatureBlokOuts) blockOuts = append(blockOuts, immatureBlokOuts[:]...) br.BlockOuts = blockOuts return br, nil } func (self *LightNode) CheckNil(Nils []c_type.Uint256) (nilResps []NilValue, e error) { if len(Nils) == 0 { return } for _, Nil := range Nils { if data, err := self.db.Get(nilKey(Nil)); err != nil { continue } else { nilResp := NilValue{} if err := rlp.DecodeBytes(data, &nilResp); err != nil { continue } else { nilResp.Nil = Nil nilResps = append(nilResps, nilResp) } } } return nilResps, nil } type BlockOutResp struct { CurrentNum uint64 BlockOuts []BlockOut PageSize uint64 } type BlockOut struct { Num uint64 Data []BlockData } type BlockData struct { TxInfo TxInfo Out txtool.Out } type BlocOuts []BlockOut func (s BlocOuts) Len() int { return len(s) } func (s BlocOuts) Swap(i, j int) { s[i], s[j] = s[j], s[i] } func (s BlocOuts) Less(i, j int) bool { return s[i].Num > s[j].Num } ================================================ FILE: zero/wallet/light/api_test.go ================================================ package light import ( "bytes" "encoding/json" "fmt" "log" "net/http" "testing" "time" ) var ( host = "http://127.0.0.1:8545" ) /** curl -i -H 'Content-Type:application/json' -d '{"jsonrpc":"2.0","id":2,"method":"light_getOutsByPKr","params":["2HVVk8CN2qTSTKUd4GgqKN4nkMMA4KjE97PwczEv9nkz5VEKG6P5kiLbYMHM7ihKcY36MSxMpCvxGt8zqzwpS7ag5pq4EweHzNpUtjYBGJov4hgcEGf26DRGrTTiR2nSeNm6",0,200]}' http://127.0.0.1:8545 */ func TestLightNode_GetOutsByPKr(t *testing.T) { GetOutsByPKr("2HVVk8CN2qTSTKUd4GgqKN4nkMMA4KjE97PwczEv9nkz5VEKG6P5kiLbYMHM7ihKcY36MSxMpCvxGt8zqzwpS7ag5pq4EweHzNpUtjYBGJov4hgcEGf26DRGrTTiR2nSeNm6", 0, 100) } func GetOutsByPKr(pkr string, begin, end uint64) { resp, e := doPost(host, "light_getOutsByPKr", []interface{}{pkr, begin, end}) if e != nil { fmt.Println(e) return } message := *resp.Result if message == nil { return } //e = json.Unmarshal(message[:], &balances) log.Printf(string(message)) return } type JSONRpcResp struct { Id *json.RawMessage `json:"id"` Result *json.RawMessage `json:"result"` Error map[string]interface{} `json:"error"` } func doPost(url string, method string, params interface{}) (*JSONRpcResp, error) { client := &http.Client{ Timeout: 900 * time.Second, } jsonReq := map[string]interface{}{"jsonrpc": "2.0", "method": method, "params": params, "id": 0} data, err := json.Marshal(jsonReq) if err != nil { log.Printf(err.Error()) return nil, err } log.Printf(string(data)) req, err := http.NewRequest("POST", url, bytes.NewBuffer(data)) if err != nil { log.Printf(err.Error()) return nil, err } req.Header.Set("Content-Length", (string)(len(data))) req.Header.Set("Content-Type", "application/json") req.Header.Set("Accept", "application/json") resp, err := client.Do(req) if err != nil { return nil, err } defer resp.Body.Close() var rpcResp *JSONRpcResp err = json.NewDecoder(resp.Body).Decode(&rpcResp) if err != nil { return nil, err } if rpcResp.Error != nil { return nil, fmt.Errorf(rpcResp.Error["message"].(string)) } return rpcResp, err } ================================================ FILE: zero/wallet/light/light.go ================================================ package light import ( "encoding/binary" "math/big" "sync/atomic" "github.com/sero-cash/go-sero/common/hexutil" "github.com/robfig/cron" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-czero-import/seroparam" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/core" "github.com/sero-cash/go-sero/core/rawdb" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/rlp" "github.com/sero-cash/go-sero/serodb" "github.com/sero-cash/go-sero/zero/txtool" "github.com/sero-cash/go-sero/zero/txtool/flight" ) type LightNode struct { db *serodb.LDBDatabase bcDB serodb.Database //immatureTx *ImmatureTx txPool *core.TxPool sri flight.SRI lastNumber uint64 } var ( teamReward = common.Hash{} powReward = common.BytesToHash([]byte{1}) posReward = common.BytesToHash([]byte{2}) posMiner = common.BytesToHash([]byte{3}) ) var ( pkrPrefix = []byte("PKr") nilPrefix = []byte("NIL") ) func NewLightNode(dbPath string, txPool *core.TxPool, bcDB serodb.Database) (lightNode *LightNode) { db, err := serodb.NewLDBDatabase(dbPath, 1024, 1024) if err != nil { panic(err) } //immatureTx := NewImmatureTx(db, txPool) lightNode = &LightNode{ txPool: txPool, sri: flight.SRI_Inst, db: db, bcDB: bcDB, //immatureTx: immatureTx, } Current_light = lightNode AddJob("0/10 * * * * ?", lightNode.fetchBlockInfo) log.Info("Init NewLightNode success") return } var fetchCount = uint64(5000) func (self *LightNode) getLastNumber() (num uint64) { if self.lastNumber == 0 { // light wallet start at block 1200000 var initBlockNum = uint64(1280000) if seroparam.Is_Dev() { initBlockNum = uint64(0) } value, err := self.db.Get(numKey()) if err != nil { self.db.Put(numKey(), uint64ToBytes(initBlockNum)) return initBlockNum } self.lastNumber = bytesToUint64(value) if self.lastNumber == 0 { self.lastNumber = initBlockNum self.db.Put(numKey(), uint64ToBytes(initBlockNum)) } } return self.lastNumber } func numKey() []byte { return []byte("LIGHT_SYNC_NUM") } func (self *LightNode) fetchBlockInfo() { //self.immatureTx.fetchBlockInfo() if txtool.Ref_inst.Bc == nil || !txtool.Ref_inst.Bc.IsValid() { return } start := self.getLastNumber() blocks, err := self.sri.GetBlocksInfo(start+1, fetchCount) if err != nil { log.Error("light GetBlocksInfo err:", err.Error()) } if len(blocks) == 0 { return } var count uint64 = 0 batch := self.db.NewBatch() for _, block := range blocks { // PKR -> Outs outs := block.Outs pkrMap := make(map[c_type.PKr][]BlockData) blockHash := common.Hash{} blockNum := uint64(block.Num) copy(blockHash[:], block.Hash[:]) body := rawdb.ReadBody(self.bcDB, blockHash, blockNum) blockDB := rawdb.ReadBlock(self.bcDB, blockHash, blockNum) for _, out := range outs { txHash := common.Hash{} copy(txHash[:], out.State.TxHash[:]) if teamReward == txHash { continue } if hexutil.Encode(out.Root[:]) == "0x0577fc34724b205de4356f4b967ffe267e26b027634ef9c5bd73233a8c6fb9ad" { continue } var txInfo TxInfo if !(teamReward == txHash || powReward == txHash || posReward == txHash || posMiner == txHash) { //fmt.Println("hex hash::", hexutil.Encode(txHash[:]), out.State.Num) txReceipt, _, _, _ := rawdb.ReadReceipt(self.bcDB, txHash) tx, _, _, _ := rawdb.ReadTransaction(self.bcDB, txHash) if txReceipt == nil { log.Info("light fetchBlockInfo receipt is nil", "blockNum", out.State.Num, "txHash", hexutil.Encode(txHash[:]), "root", hexutil.Encode(out.Root[:])) continue } gasUsed := txReceipt.GasUsed txInfo = TxInfo{ Num: blockNum, TxHash: out.State.TxHash, BlockHash: blockDB.Hash(), Gas: tx.Gas(), GasUsed: gasUsed, GasPrice: *tx.GasPrice(), From: tx.From(), // To: *tx.To(), Time: *blockDB.Time(), } self.txPool.DelMaturedOuts(*out.State.OS.ToPKr(), out.State.TxHash, blockNum) } else { txInfo = TxInfo{ Num: blockNum, TxHash: out.State.TxHash, BlockHash: blockDB.Hash(), // To: *tx.To(), Time: *blockDB.Time(), } } blockData := BlockData{ TxInfo: txInfo, Out: out, } pkr := *out.State.OS.ToPKr() //self.immatureTx.lockedDelImmatureTx(pkr, blockData.TxInfo.TxHash) if value, ok := pkrMap[pkr]; ok { v := value v = append(v, blockData) pkrMap[pkr] = v } else { pkrMap[pkr] = []BlockData{blockData} } } for pkr, v := range pkrMap { data, err := rlp.EncodeToBytes(v) if err != nil { return } batch.Put(pkrKey(pkr, uint64(block.Num)), data) } for _, tx := range body.Transactions { hash := tx.Hash() txHash := c_type.Uint256{} copy(txHash[:], hash[:]) txReceipt, _, _, _ := rawdb.ReadReceipt(self.bcDB, tx.Hash()) gasUsed := txReceipt.GasUsed // Index Tx Info txInfo := TxInfo{ Num: blockNum, TxHash: txHash, BlockHash: blockDB.Hash(), Gas: tx.Gas(), GasUsed: gasUsed, GasPrice: *tx.GasPrice(), From: tx.From(), // To: *tx.To(), Time: *blockDB.Time(), } nilValue := NilValue{ Num: blockNum, TxHash: txHash, TxInfo: txInfo, } if nilValue, err := rlp.EncodeToBytes(nilValue); err != nil { return } else { if tx.Stxt().Tx0() != nil { for _, in := range tx.Stxt().Tx0().Desc_O.Ins { batch.Put(nilKey(in.Nil), nilValue) batch.Put(nilKey(in.Root), nilValue) } for _, in := range tx.Stxt().Tx0().Desc_Z.Ins { batch.Put(nilKey(in.Trace), nilValue) batch.Put(nilKey(in.Nil), nilValue) } } if tx.Stxt().Tx1.Ins_C != nil { for _, in := range tx.Stxt().Tx1.Ins_C { batch.Put(nilKey(in.Nil), nilValue) } } if tx.Stxt().Tx1.Ins_P != nil { for _, in := range tx.Stxt().Tx1.Ins_P { batch.Put(nilKey(in.Nil), nilValue) batch.Put(nilKey(in.Root), nilValue) } } if tx.Stxt().Tx1.Ins_P0 != nil { for _, in := range tx.Stxt().Tx1.Ins_P0 { batch.Put(nilKey(in.Nil), nilValue) batch.Put(nilKey(in.Root), nilValue) batch.Put(nilKey(in.Trace), nilValue) } } } } // nils := block.Nils // if len(nils) > 0 { // for _, Nil := range nils { // batch.Put(nilKey(Nil, uint64(block.Num)), uint64ToBytes(1)) // } // } count++ } if count == 0 { return } lastNumber := self.lastNumber if count < fetchCount { lastNumber = start + count } else { lastNumber = start + fetchCount } batch.Put(numKey(), uint64ToBytes(lastNumber)) err = batch.Write() if err == nil { self.lastNumber = lastNumber } return } type NilValue struct { Nil c_type.Uint256 Num uint64 TxHash c_type.Uint256 TxInfo TxInfo } func uint64ToBytes(i uint64) []byte { var buf = make([]byte, 8) binary.BigEndian.PutUint64(buf, uint64(i)) return buf } func bytesToUint64(data []byte) uint64 { return binary.BigEndian.Uint64(data) } func nilKey(Nil c_type.Uint256) []byte { return append(nilPrefix, Nil[:]...) } func pkrKey(pkr c_type.PKr, num uint64) []byte { key := append(pkrPrefix, pkr[:]...) return append(key, uint64ToBytes(num)...) } func AddJob(spec string, run RunFunc) *cron.Cron { c := cron.New() c.AddJob(spec, &RunJob{run: run}) c.Start() return c } type TxInfo struct { TxHash c_type.Uint256 Num uint64 BlockHash common.Hash Gas uint64 GasUsed uint64 GasPrice big.Int From common.Address To common.Address Time big.Int } type ( RunFunc func() ) type RunJob struct { running int32 run RunFunc } func (r *RunJob) Run() { x := atomic.LoadInt32(&r.running) if x == 1 { return } atomic.StoreInt32(&r.running, 1) defer func() { atomic.StoreInt32(&r.running, 0) }() r.run() } func outInfoToTxInfo(info core.TxOutInfo) TxInfo { txInfo := TxInfo{ TxHash: info.TxHash, Num: info.BlockNumber, BlockHash: info.BlockHash, Gas: info.Gas, GasUsed: info.GasUsed, GasPrice: *info.GasPrice, From: info.From, Time: *big.NewInt(0).SetUint64(info.Time), } return txInfo } func (self *LightNode) getImmatureTx(pkrs []c_type.PKr) (immatureBlockOuts map[uint64][]BlockData) { immatureBlockOuts = make(map[uint64][]BlockData) lastLightNum := self.getLastNumber() for _, pkr := range pkrs { txPoolTxOut := self.txPool.PendingOuts(pkr) for _, outInfo := range txPoolTxOut { if outInfo != nil { txInfo := outInfoToTxInfo(*outInfo) for index := range outInfo.Outs { blockData := BlockData{ TxInfo: txInfo, Out: outInfo.Outs[index], } if blockData.TxInfo.Num == 0 || (blockData.TxInfo.Num+seroparam.DefaultConfirmedBlock()) > lastLightNum { immatureBlockOuts[blockData.TxInfo.Num] = append(immatureBlockOuts[blockData.TxInfo.Num], blockData) } } } } } return } ================================================ FILE: zero/wallet/ssi/ssi.go ================================================ package ssi import ( "fmt" "log" "math/big" "strings" "sync" "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-czero-import/superzk" "github.com/sero-cash/go-sero/zero/txtool/flight" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/txtool" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/zero/txs/assets" "github.com/sero-cash/go-sero/zero/utils" "github.com/sero-cash/go-sero/zero/localdb" ) type SSI struct { } var SSI_Inst = SSI{} func (self *SSI) CreateKr(flag bool) (kr txtool.Kr) { rnd := c_superzk.RandomFr() zsk := c_superzk.RandomFr() vsk := c_superzk.RandomFr() skr := c_type.PKr{} copy(skr[:], zsk[:]) copy(skr[32:], vsk[:]) copy(skr[64:], rnd[:]) if flag { c_superzk.SetFlag(skr[:64]) } sk := c_type.Uint512{} copy(sk[:], skr[:]) tk, _ := superzk.Sk2Tk(&sk) var pk c_type.Uint512 pk, _ = superzk.Tk2Pk(&tk) pkr := superzk.Pk2PKr(&pk, &rnd) kr.PKr = pkr kr.SKr = skr return } func (self *SSI) GetBlocksInfo(start uint64, count uint64) (blocks []Block, e error) { if bs, err := flight.SRI_Inst.GetBlocksInfo(start, count); err != nil { e = err return } else { for _, b := range bs { block := Block{} block.Num = b.Num block.Hash = b.Hash block.Nils = b.Nils for _, o := range b.Outs { block.Outs = append( block.Outs, Out{ o.Root, o.State.TxHash, *o.State.OS.ToPKr(), }, ) } blocks = append(blocks, block) } } return } func (self *SSI) Detail(roots []c_type.Uint256, skr *c_type.PKr) (douts []txtool.DOut, e error) { outs := []txtool.Out{} for _, r := range roots { if root := localdb.GetRoot(txtool.Ref_inst.Bc.GetDB(), &r); root == nil { e = fmt.Errorf("SSI Detail Error for root %v", r) return } else { outs = append(outs, txtool.Out{r, *root}) } } douts = DecNilOuts(outs, skr) return } var txMap sync.Map func (self *SSI) GenTxParam(param *PreTxParam) (p txtool.GTxParam, e error) { log.Printf("genTx start") p.Gas = param.Gas p.GasPrice = big.NewInt(0).SetUint64(param.GasPrice) p.Fee = assets.Token{ utils.CurrencyToUint256("SERO"), utils.U256(*new(big.Int).Mul(new(big.Int).SetUint64(param.Gas), new(big.Int).SetUint64(param.GasPrice))), } p.From = param.From p.Outs = param.Outs roots := []c_type.Uint256{} outs := []txtool.Out{} amounts := make(map[string]*big.Int) ticekts := make(map[c_type.Uint256]c_type.Uint256) for _, in := range param.Ins { roots = append(roots, in.Root) if root := localdb.GetRoot(txtool.Ref_inst.Bc.GetDB(), &in.Root); root == nil { e = fmt.Errorf("SSI GenTx Error for root %v", in.Root) return } else { out := txtool.Out{in.Root, *root} dOuts := DecNilOuts([]txtool.Out{out}, &in.SKr) if len(dOuts) == 0 { e = fmt.Errorf("SSI GenTx Error for root %v", in.Root) return } oOut := dOuts[0] if oOut.Asset.Tkn != nil { currency := strings.Trim(string(oOut.Asset.Tkn.Currency[:]), string([]byte{0})) if amount, ok := amounts[currency]; ok { amount.Add(amount, oOut.Asset.Tkn.Value.ToIntRef()) } else { amounts[currency] = oOut.Asset.Tkn.Value.ToIntRef() } } if oOut.Asset.Tkt != nil { ticekts[oOut.Asset.Tkt.Value] = oOut.Asset.Tkt.Category } outs = append(outs, txtool.Out{in.Root, *root}) } } for _, out := range param.Outs { if out.Asset.Tkn != nil { currency := strings.Trim(string(out.Asset.Tkn.Currency[:]), string([]byte{0})) token := out.Asset.Tkn.Value.ToIntRef() if amount, ok := amounts[currency]; ok && amount.Cmp(token) >= 0 { amount.Sub(amount, token) if amount.Sign() == 0 { delete(amounts, currency) } } else { e = fmt.Errorf("SSI GenTx Error: balance is not enough") return } } if out.Asset.Tkt != nil { if value, ok := ticekts[out.Asset.Tkt.Value]; ok && value == out.Asset.Tkt.Category { delete(ticekts, out.Asset.Tkt.Value) } else { e = fmt.Errorf("SSI GenTx Erro: balance is not enough") return } } } if amount, ok := amounts[utils.Uint256ToCurrency(&p.Fee.Currency)]; !ok || amount.Cmp(p.Fee.Value.ToInt()) < 0 { e = fmt.Errorf("SSI GenTx Error: sero amount < Fee") return } else { amount.Sub(amount, p.Fee.Value.ToInt()) if amount.Sign() == 0 { delete(amounts, utils.Uint256ToCurrency(&p.Fee.Currency)) } } if len(amounts) > 0 || len(ticekts) > 0 { for currency, value := range amounts { p.Outs = append(p.Outs, txtool.GOut{PKr: p.From.PKr, Asset: assets.Asset{Tkn: &assets.Token{ Currency: *common.BytesToHash(common.LeftPadBytes([]byte(currency), 32)).HashToUint256(), Value: utils.U256(*value), }}}) } for value, category := range ticekts { p.Outs = append(p.Outs, txtool.GOut{PKr: p.From.PKr, Asset: assets.Asset{Tkt: &assets.Ticket{ Category: category, Value: value, }}}) } } wits := []txtool.Witness{} if wits, e = flight.SRI_Inst.GetAnchor(roots); e != nil { return } for i := 0; i < len(wits); i++ { in := txtool.GIn{} in.SKr = param.Ins[i].SKr in.Out = outs[i] in.Witness = wits[i] p.Ins = append(p.Ins, in) } if e = p.GenZ(); e != nil { return } log.Printf("genTxParam ins : %v, outs : %v", len(p.Ins), len(p.Outs)) return } func (self *SSI) GenTx(param *PreTxParam) (hash c_type.Uint256, e error) { if p, err := self.GenTxParam(param); err != nil { e = err return } else { if gtx, err := flight.GenTx(&p); err != nil { e = err log.Printf("genTx error : %v", err) return } else { hash = gtx.Tx.ToHash() txMap.Store(hash, >x) log.Printf("genTx success hash: %s", common.Bytes2Hex(hash[:])) return } } } func (self *SSI) GetTx(txhash c_type.Uint256) (tx *txtool.GTx, e error) { if ld, ok := txMap.Load(txhash); !ok { e = fmt.Errorf("SSI GetTx Failed : %v", txhash) } else { if ld == nil { e = fmt.Errorf("SSI GetTx Nil : %v", txhash) } else { tx = ld.(*txtool.GTx) } } return } ================================================ FILE: zero/wallet/ssi/type.go ================================================ package ssi import ( "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/common/hexutil" "github.com/sero-cash/go-sero/zero/txtool" ) type Out struct { Root c_type.Uint256 Hash c_type.Uint256 PKr c_type.PKr } type Block struct { Num hexutil.Uint64 Hash c_type.Uint256 Outs []Out Nils []c_type.Uint256 } type GIn struct { SKr c_type.PKr Root c_type.Uint256 } type PreTxParam struct { Gas uint64 GasPrice uint64 From txtool.Kr Ins []GIn Outs []txtool.GOut } type ISSI interface { GetBlocksInfo(start uint64, count uint64) ([]Block, error) Detail(root []c_type.Uint256, skr *c_type.PKr) ([]txtool.DOut, error) GenTx(param *PreTxParam) (c_type.Uint256, error) CommitTx(txhash *c_type.Uint256) error } ================================================ FILE: zero/wallet/ssi/utils.go ================================================ package ssi import ( "encoding/json" "log" "github.com/sero-cash/go-sero/zero/txtool/generate/generate_1" "github.com/sero-cash/go-czero-import/c_superzk" "github.com/sero-cash/go-czero-import/superzk" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-sero/zero/txtool" ) func DecNilOuts(outs []txtool.Out, skr *c_type.PKr) (douts []txtool.DOut) { sk := c_type.Uint512{} copy(sk[:], skr[:]) tk, _ := superzk.Sk2Tk(&sk) for _, out := range outs { dout := txtool.DOut{} data, _ := json.Marshal(out) log.Printf("DecOuts out : %s", string(data)) if out.State.OS.Out_O != nil { dout.Asset = out.State.OS.Out_O.Asset.Clone() dout.Memo = out.State.OS.Out_O.Memo if nl, e := c_superzk.Czero_genNil(&sk, out.State.OS.RootCM); e == nil { dout.Nil = nl } log.Printf("DecOuts Out_O") } else if out.State.OS.Out_Z != nil { if key, flag, e := c_superzk.Czero_fetchKey(&tk, &out.State.OS.Out_Z.RPK); e == nil { if o := generate_1.ConfirmOutZ(&key, flag, out.State.OS.Out_Z); o != nil { dout.Asset = o.Asset dout.Memo = o.Memo if nl, e := c_superzk.Czero_genNil(&sk, out.State.OS.RootCM); e == nil { dout.Nil = nl log.Printf("DecOuts success") } } } log.Printf("DecOuts Out_Z") } else if out.State.OS.Out_P != nil { if nl, e := c_superzk.GenNil(&tk, out.State.OS.RootCM, &out.State.OS.Out_P.PKr); e == nil { dout.Asset = out.State.OS.Out_P.Asset.Clone() dout.Memo = out.State.OS.Out_P.Memo dout.Nil = nl log.Printf("DecOuts success") } log.Printf("DecOuts Out_P") } else if out.State.OS.Out_C != nil { if key, _, e := c_superzk.FetchKey(&out.State.OS.Out_C.PKr, &tk, &out.State.OS.Out_C.RPK); e == nil { if o, _ := generate_1.ConfirmOutC(&key, out.State.OS.Out_C); o != nil { if nl, e := c_superzk.GenNil(&tk, out.State.OS.RootCM.NewRef(), out.State.OS.ToPKr()); e == nil { dout.Asset = o.Asset dout.Memo = o.Memo dout.Nil = nl log.Printf("DecOuts success") } } } log.Printf("DecOuts Out_C") } douts = append(douts, dout) data, _ = json.Marshal(douts) log.Printf("DecOuts douts : %s", string(data)) } return } ================================================ FILE: zero/wallet/stakeservice/stakeservice.go ================================================ package stakeservice import ( "math/big" "sync" "sync/atomic" "github.com/sero-cash/go-sero/rlp" "github.com/robfig/cron" "github.com/sero-cash/go-sero/common" "github.com/sero-cash/go-sero/common/math" "github.com/sero-cash/go-sero/zero/utils" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-czero-import/seroparam" "github.com/sero-cash/go-czero-import/superzk" "github.com/sero-cash/go-sero/accounts" "github.com/sero-cash/go-sero/core" "github.com/sero-cash/go-sero/event" "github.com/sero-cash/go-sero/log" "github.com/sero-cash/go-sero/serodb" "github.com/sero-cash/go-sero/zero/stake" ) type Account struct { pk *c_type.Uint512 tk *c_type.Tk version int } type StakeService struct { bc *core.BlockChain accountManager *accounts.Manager db *serodb.LDBDatabase accounts sync.Map numbers sync.Map feed event.Feed updater event.Subscription // Wallet update subscriptions for all backends update chan accounts.WalletEvent // Subscription sink for backend wallet changes quit chan chan error lock sync.RWMutex } var current_StakeService *StakeService func CurrentStakeService() *StakeService { return current_StakeService } func NewStakeService(dbpath string, bc *core.BlockChain, accountManager *accounts.Manager) *StakeService { update := make(chan accounts.WalletEvent, 1) updater := accountManager.Subscribe(update) stakeService := &StakeService{ bc: bc, accountManager: accountManager, update: update, updater: updater, } current_StakeService = stakeService db, err := serodb.NewLDBDatabase(dbpath, 1024, 1024) if err != nil { panic(err) } stakeService.db = db stakeService.numbers = sync.Map{} stakeService.accounts = sync.Map{} for _, w := range accountManager.Wallets() { stakeService.initWallet(w) } AddJob("0/10 * * * * ?", stakeService.stakeIndex) go stakeService.updateAccount() return stakeService } func (self *StakeService) StakePools() (pools []*stake.StakePool) { iterator := self.db.NewIteratorWithPrefix(poolPrefix) for iterator.Next() { value := iterator.Value() pool := stake.StakePoolDB.GetObject(self.bc.GetDB(), value, &stake.StakePool{}) pools = append(pools, pool.(*stake.StakePool)) } iterator.Release() return } func (self *StakeService) Shares() (shares []*stake.Share) { iterator := self.db.NewIteratorWithPrefix(sharePrefix) for iterator.Next() { value := iterator.Value() share := stake.ShareDB.GetObject(self.bc.GetDB(), value, &stake.Share{}) shares = append(shares, share.(*stake.Share)) } iterator.Release() return } func (self *StakeService) SharesInfoByPKr(pkr c_type.PKr) *SharesInfo { hash, err := self.db.Get(pkrInfoKey(pkr)) if err != nil { return nil } item := &SharesInfo{} if e := rlp.DecodeBytes(hash, item); e != nil { return nil } return item } func (self *StakeService) SharesInfoByPK(pk c_type.Uint512) *SharesInfo { hash, err := self.db.Get(pkInfoKey(pk)) if err != nil { return nil } item := &SharesInfo{} if e := rlp.DecodeBytes(hash, item); e != nil { return nil } return item } func (self *StakeService) SharesById(id common.Hash) *stake.Share { hash, err := self.db.Get(sharekey(id[:])) if err != nil { return nil } return self.getShareByHash(hash) } func (self *StakeService) getShareByHash(hash []byte) *stake.Share { ret := stake.ShareDB.GetObject(self.bc.GetDB(), hash, &stake.Share{}) if ret == nil { return nil } return ret.(*stake.Share) } func (self *StakeService) SharesByPk(pk c_type.Uint512) (shares []*stake.Share) { iterator := self.db.NewIteratorWithPrefix(pk[:]) for iterator.Next() { value := iterator.Value() share := stake.ShareDB.GetObject(self.bc.GetDB(), value, &stake.Share{}) shares = append(shares, share.(*stake.Share)) } iterator.Release() return } func (self *StakeService) SharesInfoByPkr(pkr c_type.PKr) (sharesInfo *SharesInfo) { if date, err := self.db.Get(pkrInfoKey(pkr)); err != nil { return } else { sharesInfo = &SharesInfo{} if e := rlp.DecodeBytes(date, sharesInfo); e != nil { return nil } return sharesInfo } return } func (self *StakeService) SharesInfoByPk(pk c_type.Uint512) (sharesInfo *SharesInfo) { if date, err := self.db.Get(pkInfoKey(pk)); err != nil { return } else { sharesInfo = &SharesInfo{} if e := rlp.DecodeBytes(date, sharesInfo); e != nil { return nil } return sharesInfo } return } func (self *StakeService) SharesByPkr(pkr c_type.PKr) (shares []*stake.Share) { iterator := self.db.NewIteratorWithPrefix(pkr[:]) for iterator.Next() { value := iterator.Value() share := stake.ShareDB.GetObject(self.bc.GetDB(), value, &stake.Share{}) shares = append(shares, share.(*stake.Share)) } iterator.Release() return } func (self *StakeService) GetBlockRecords(blockNumber uint64) (shares []*stake.Share, pools []*stake.StakePool) { header := self.bc.GetHeaderByNumber(blockNumber) return stake.GetBlockRecords(self.bc.GetDB(), header.Hash(), blockNumber) } type SharesInfo struct { Total uint32 Remaining uint32 Missed uint32 Expired uint32 ShareIds []common.Hash Profit *big.Int `rlp:"nil"` TotalAmount *big.Int `rlp:"nil"` } func (self *StakeService) getShare(id common.Hash, cache map[common.Hash]*stake.Share) *stake.Share { if val, ok := cache[id]; ok { return val } else { return self.SharesById(id) } } func (self *StakeService) getStakeInfoByPKr(pkr c_type.PKr, cache map[c_type.PKr]*SharesInfo) *SharesInfo { if val, ok := cache[pkr]; ok { return val } else { info := self.SharesInfoByPKr(pkr) if info != nil { cache[pkr] = info } return info } } func (self *StakeService) getStakeInfoByPK(pk c_type.Uint512, cache map[c_type.Uint512]*SharesInfo) *SharesInfo { if val, ok := cache[pk]; ok { return val } else { info := self.SharesInfoByPK(pk) if info != nil { cache[pk] = info } return info } } func (self *StakeService) stakeIndex() { start := uint64(math.MaxUint64) self.numbers.Range(func(key, value interface{}) bool { num := value.(uint64) if start > num { start = num } return true }) if start == uint64(math.MaxUint64) { return } if !seroparam.Is_Dev() && start < 1300000 { start = 1300000 } header := self.bc.CurrentHeader() sharesCount := 0 poolsCount := 0 batch := self.db.NewBatch() blocNumber := start sharesCache := map[common.Hash]*stake.Share{} pkrStakeInfoCache := map[c_type.PKr]*SharesInfo{} pkStakeInfoCache := map[c_type.Uint512]*SharesInfo{} for blocNumber+seroparam.DefaultConfirmedBlock() <= header.Number.Uint64() { shares, pools := self.GetBlockRecords(blocNumber) for _, share := range shares { // batch.Put(sharekey(share.Id()), share.State()) // batch.Put(pkrShareKey(share.PKr, share.Id()), share.State()) self.indexStakeInfoByPKr(share.PKr, pkrStakeInfoCache, share, sharesCache, blocNumber, batch) if accountKey, ok := self.ownPkr(share.PKr); ok { // batch.Put(pkShareKey(accountKey, share.Id()), share.State()) self.indexStakeInfoByPK(*accountKey, pkStakeInfoCache, share, sharesCache, blocNumber, batch) } sharesCache[common.BytesToHash(share.Id())] = share } for _, pool := range pools { batch.Put(poolKey(pool.Id()), pool.State()) } sharesCount += len(shares) poolsCount += len(pools) blocNumber++ if blocNumber-start >= 10000 { break } } for _, share := range sharesCache { hash := share.State() id := share.Id() batch.Put(sharekey(id), hash) batch.Put(pkrShareKey(share.PKr, id), hash) if accountKey, ok := self.ownPkr(share.PKr); ok { batch.Put(pkShareKey(accountKey, id), hash) } } for key, val := range pkrStakeInfoCache { if b, err := rlp.EncodeToBytes(val); err != nil { panic(err) } else { if err := batch.Put(pkrInfoKey(key), b); err != nil { panic(err) } } } for key, val := range pkStakeInfoCache { if b, err := rlp.EncodeToBytes(&val); err != nil { panic(err) } else { if err := batch.Put(pkInfoKey(key), b); err != nil { panic(err) } } } if blocNumber == start { return } self.numbers.Range(func(key, value interface{}) bool { pk := key.(c_type.Uint512) batch.Put(numKey(pk), utils.EncodeNumber(blocNumber)) return true }) err := batch.Write() if err == nil { self.numbers.Range(func(key, value interface{}) bool { pk := key.(c_type.Uint512) self.numbers.Store(pk, blocNumber) return true }) log.Info("StakeIndex", "blockNumber", blocNumber, "sharesCount", sharesCount, "poolsCount", poolsCount) } } func (self *StakeService) indexStakeInfoByPKr(pkr c_type.PKr, stakeInfoCache map[c_type.PKr]*SharesInfo, share *stake.Share, sharesCache map[common.Hash]*stake.Share, blocNumber uint64, batch serodb.Batch) { sharesInfo := self.getStakeInfoByPKr(pkr, stakeInfoCache) if sharesInfo == nil { sharesInfo = &SharesInfo{ Profit: new(big.Int), TotalAmount: new(big.Int), } stakeInfoCache[pkr] = sharesInfo } self.updateSharesInfo(share, sharesCache, sharesInfo, blocNumber) } func (self *StakeService) indexStakeInfoByPK(pk c_type.Uint512, stakeInfoCache map[c_type.Uint512]*SharesInfo, share *stake.Share, sharesCache map[common.Hash]*stake.Share, blocNumber uint64, batch serodb.Batch) { sharesInfo := self.getStakeInfoByPK(pk, stakeInfoCache) if sharesInfo == nil { sharesInfo = &SharesInfo{ Profit: new(big.Int), TotalAmount: new(big.Int), } stakeInfoCache[pk] = sharesInfo } self.updateSharesInfo(share, sharesCache, sharesInfo, blocNumber) } func (self *StakeService) updateSharesInfo(share *stake.Share, sharesCache map[common.Hash]*stake.Share, sharesInfo *SharesInfo, blocNumber uint64) { id := common.BytesToHash(share.Id()) oldShare := self.getShare(id, sharesCache) // sharesCache[id] = share if oldShare != nil { if share.WillVoteNum > oldShare.WillVoteNum { sharesInfo.Missed += (share.WillVoteNum - oldShare.WillVoteNum) } else if share.WillVoteNum < oldShare.WillVoteNum { if sharesInfo.Missed >= (oldShare.WillVoteNum - share.WillVoteNum) { sharesInfo.Missed -= (oldShare.WillVoteNum - share.WillVoteNum) } } if oldShare.Status == stake.STATUS_VALID { if sharesInfo.Remaining >= (oldShare.Num - share.Num) { sharesInfo.Remaining -= (oldShare.Num - share.Num) } } if oldShare.Status == stake.STATUS_VALID && share.Status == stake.STATUS_OUTOFDATE { if sharesInfo.Remaining >= share.Num { sharesInfo.Remaining -= share.Num } sharesInfo.Expired += share.Num } sharesInfo.Profit = big.NewInt(0).Add(sharesInfo.Profit, new(big.Int).Sub(share.Profit, oldShare.Profit)) } else { sharesInfo.ShareIds = append(sharesInfo.ShareIds, id) sharesInfo.Total += share.InitNum if share.Status == stake.STATUS_VALID { sharesInfo.Remaining += share.Num } else { sharesInfo.Expired += share.Num } sharesInfo.Missed += share.WillVoteNum sharesInfo.Profit = new(big.Int).Add(sharesInfo.Profit, share.Profit) sharesInfo.TotalAmount = new(big.Int).Add(sharesInfo.TotalAmount, new(big.Int).Mul(big.NewInt(int64(share.InitNum)), share.Value)) } if share.LastPayTime == blocNumber { if oldShare != nil && oldShare.LastPayTime != 0 { header := self.bc.GetBlockByNumber(oldShare.LastPayTime) snapshot := stake.GetShareByBlockNumber(self.bc.GetDB(), id, header.Hash(), header.NumberU64()) if snapshot != nil { mul := new(big.Int).Mul(big.NewInt(int64( (snapshot.Num+snapshot.WillVoteNum)-(share.Num+share.WillVoteNum))), share.Value) if sharesInfo.TotalAmount.Cmp(mul) >= 0 { sharesInfo.TotalAmount = new(big.Int).Sub(sharesInfo.TotalAmount, mul) } } } else { mul := new(big.Int).Mul(big.NewInt(int64( share.InitNum-share.Num-share.WillVoteNum)), share.Value) if sharesInfo.TotalAmount.Cmp(mul) >= 0 { sharesInfo.TotalAmount = new(big.Int).Sub(sharesInfo.TotalAmount, mul) } } if share.Status == stake.STATUS_OUTOFDATE { mul := new(big.Int).Mul(big.NewInt(int64( share.Num)), share.Value) if sharesInfo.TotalAmount.Cmp(mul) >= 0 { sharesInfo.TotalAmount = new(big.Int).Sub(sharesInfo.TotalAmount, mul) } } if share.Status == stake.STATUS_FINISHED { mul := new(big.Int).Mul(big.NewInt(int64( share.WillVoteNum)), share.Value) if sharesInfo.TotalAmount.Cmp(mul) >= 0 { sharesInfo.TotalAmount = new(big.Int).Sub(sharesInfo.TotalAmount, mul) } } } if stake.STATUS_FINISHED == share.Status { for i, each := range sharesInfo.ShareIds { if each == id { sharesInfo.ShareIds = append(sharesInfo.ShareIds[:i], sharesInfo.ShareIds[i+1:]...) break } } } } func (self *StakeService) ownPkr(pkr c_type.PKr) (pk *c_type.Uint512, ok bool) { var account *Account self.accounts.Range(func(key, value interface{}) bool { a := value.(*Account) if superzk.IsMyPKr(a.tk, &pkr) { account = a return false } return true }) if account != nil { return account.pk.NewRef(), true } return } func (self *StakeService) updateAccount() { // Close all subscriptions when the manager terminates defer func() { self.lock.Lock() self.updater.Unsubscribe() self.updater = nil self.lock.Unlock() }() // Loop until termination for { select { case event := <-self.update: // Wallet event arrived, update local cache self.lock.Lock() switch event.Kind { case accounts.WalletArrived: self.initWallet(event.Wallet) case accounts.WalletDropped: address := event.Wallet.Accounts()[0].GetPk() self.numbers.Delete(address) } self.lock.Unlock() case errc := <-self.quit: // Manager terminating, return errc <- nil return } } } func (self *StakeService) initWallet(w accounts.Wallet) { if _, ok := self.accounts.Load(w.Accounts()[0].GetPk()); !ok { account := Account{} account.pk = w.Accounts()[0].GetPk().NewRef() account.tk = w.Accounts()[0].Tk.ToTk().NewRef() account.version = w.Accounts()[0].Version self.accounts.Store(*account.pk, &account) var num uint64 if num = self.starNum(account.pk); num < w.Accounts()[0].At { num = w.Accounts()[0].At } self.numbers.Store(*account.pk, num) log.Info("Add PK", "pk", w.Accounts()[0].Address, "At", num) } } func (self *StakeService) starNum(pk *c_type.Uint512) uint64 { value, err := self.db.Get(numKey(*pk)) if err != nil { return 0 } return utils.DecodeNumber(value) } var ( numPrefix = []byte("NUM") sharePrefix = []byte("SHARE") poolPrefix = []byte("POOL") pkrInfoPrefix = []byte("PKRINFO") pkInfoPrefix = []byte("PKINFO") ) func pkShareKey(pk *c_type.Uint512, key []byte) []byte { return append(pk[:], key[:]...) } func pkrShareKey(pk c_type.PKr, key []byte) []byte { return append(pk[:], key[:]...) } func sharekey(key []byte) []byte { return append(sharePrefix, key[:]...) } func poolKey(key []byte) []byte { return append(poolPrefix, key[:]...) } func numKey(pk c_type.Uint512) []byte { return append(numPrefix, pk[:]...) } func pkrInfoKey(pkr c_type.PKr) []byte { return append(pkrInfoPrefix, pkr[:]...) } func pkInfoKey(pk c_type.Uint512) []byte { return append(pkInfoPrefix, pk[:]...) } func AddJob(spec string, run RunFunc) *cron.Cron { c := cron.New() c.AddJob(spec, &RunJob{run: run}) c.Start() return c } type ( RunFunc func() ) type RunJob struct { running int32 run RunFunc } func (r *RunJob) Run() { x := atomic.LoadInt32(&r.running) if x == 1 { return } atomic.StoreInt32(&r.running, 1) defer func() { atomic.StoreInt32(&r.running, 0) }() r.run() } ================================================ FILE: zero/zconfig/backup.go ================================================ // Copyright 2020 The sero Authors // This file is part of the sero library. // // The sero library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The sero library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the sero library. If not, see <http://www.gnu.org/licenses/>. package zconfig import "path/filepath" func Backup_dir() string { return filepath.Join(dir, "backup") } ================================================ FILE: zero/zconfig/balance.go ================================================ package zconfig import ( "encoding/json" "os" "path/filepath" "github.com/sero-cash/go-czero-import/c_type" ) func Balance_dir() string { return filepath.Join(dir, "balance") } func Init_Balance_dir() { os.Mkdir(Balance_dir(), os.ModePerm) } var eroot_json = `[ "0xeb85bf17f7f2fe9a1410f99f7e174b409f48479addd41266779308780406ae01", "0xeb85bf17f7f2fe9a1410f99f7e174b409f48479addd41266779308780406ae02", "0xeb85bf17f7f2fe9a1410f99f7e174b409f48479addd41266779308780406ae03", "0xeb85bf17f7f2fe9a1410f99f7e174b409f48479addd41266779308780406ae04", "0xeb85bf17f7f2fe9a1410f99f7e174b409f48479addd41266779308780406ae05", "0xeb85bf17f7f2fe9a1410f99f7e174b409f48479addd41266779308780406ae06", "0xeb85bf17f7f2fe9a1410f99f7e174b409f48479addd41266779308780406ae07", "0xeb85bf17f7f2fe9a1410f99f7e174b409f48479addd41266779308780406ae08", "0xeb85bf17f7f2fe9a1410f99f7e174b409f48479addd41266779308780406ae09", "0x75a2488445fb7ec5d37f4740b15f976ae35c358e01806701dca891221bdecfa1", "0x75a2488445fb7ec5d37f4740b15f976ae35c358e01806701dca891221bdecfa2", "0x75a2488445fb7ec5d37f4740b15f976ae35c358e01806701dca891221bdecfa3", "0x75a2488445fb7ec5d37f4740b15f976ae35c358e01806701dca891221bdecfa4", "0x75a2488445fb7ec5d37f4740b15f976ae35c358e01806701dca891221bdecfa5", "0x75a2488445fb7ec5d37f4740b15f976ae35c358e01806701dca891221bdecfa6", "0x75a2488445fb7ec5d37f4740b15f976ae35c358e01806701dca891221bdecfa7", "0x75a2488445fb7ec5d37f4740b15f976ae35c358e01806701dca891221bdecfa9", "0x6a6f6429fa3901b196c69400c3cd6219d81d119b8c7eaf5319851ff28b26f611", "0x6a6f6429fa3901b196c69400c3cd6219d81d119b8c7eaf5319851ff28b26f612", "0x6a6f6429fa3901b196c69400c3cd6219d81d119b8c7eaf5319851ff28b26f613", "0x6a6f6429fa3901b196c69400c3cd6219d81d119b8c7eaf5319851ff28b26f614", "0x6a6f6429fa3901b196c69400c3cd6219d81d119b8c7eaf5319851ff28b26f615", "0x6a6f6429fa3901b196c69400c3cd6219d81d119b8c7eaf5319851ff28b26f616", "0x6a6f6429fa3901b196c69400c3cd6219d81d119b8c7eaf5319851ff28b26f617", "0x6a6f6429fa3901b196c69400c3cd6219d81d119b8c7eaf5319851ff28b26f618", "0x6a6f6429fa3901b196c69400c3cd6219d81d119b8c7eaf5319851ff28b26f619" ]` //"0x75a2488445fb7ec5d37f4740b15f976ae35c358e01806701dca891221bdecfa8", func error_roots() (ret map[c_type.Uint256]bool) { ret = make(map[c_type.Uint256]bool) var erts []c_type.Uint256 json.Unmarshal([]byte(eroot_json), &erts) for _, ert := range erts { var key c_type.Uint256 copy(key[:], ert[:]) ret[key] = true } return } var ERS = error_roots() func IsValidRoot(root c_type.Uint256) bool { return true /*if _, ok := ERS[root]; ok { return false } else { return true }*/ } ================================================ FILE: zero/zconfig/checkpoint.go ================================================ package zconfig import ( "bytes" "encoding/hex" "encoding/json" "fmt" "github.com/sero-cash/go-czero-import/c_type" "github.com/sero-cash/go-czero-import/seroparam" ) /******* var current=sero.blockNumber for(var i=0;i<current;i+=10000) { console.log('{"Num":'+i+',"Root":"'+sero.getBlock(i).stateRoot+'"},') } ********/ var checkpoints_json = `[ {"Num":10000,"Root":"0xcd9587c499db006a592554f4abcb4bb8365c1770df95583471bde010d6b5a490"}, {"Num":20000,"Root":"0xefdfb2c3fd89654fdbf820c825315ba1bfd1e4db5f24c76fbc49ace31dcb5cae"}, {"Num":30000,"Root":"0x4213e8bfa24e46176aa8c8d3695ca218e9f7e062954ea90ff0f33b9c06dcfd91"}, {"Num":40000,"Root":"0x6af932bc35db057969320441839f673e2c7a2c77a958e1cc546eee2d0aba3c52"}, {"Num":50000,"Root":"0x59344f2c16f736303ba9a0a104dbbc8cbed26770c9107d5e0909ab9149488f0a"}, {"Num":60000,"Root":"0x79766862a12638c46f5b2d2dc9c5014a738e71cd7e84c08d0ff785b10954720b"}, {"Num":70000,"Root":"0x838486e8f63f98cbd3ce417026558e63a135f03c6cdba20cf88d80f1b662cfc5"}, {"Num":80000,"Root":"0x3290fc56d1226e853d2e26096454a10dc5b9339196234984a655e839c1d4fe8b"}, {"Num":90000,"Root":"0xaba3f48b5384e9265c5d1b0f561d3decafd113c5d04f937a4e0161e040753e56"}, {"Num":100000,"Root":"0xa2f85951bf5c634bbe1bc911c2da4e7e20756500fe5266dc250bfc46846e87b9"}, {"Num":110000,"Root":"0x586ec0c5f7f8c31f424e5bc5c9f78d01c4b4c0517cdc57e24e42b443cc34e95c"}, {"Num":120000,"Root":"0x947f60a772a331db579dbe4e5d1a3d40af27c545d921d87a8ea4a5cc02fc0e9b"}, {"Num":130000,"Root":"0x0b915d1ba6ea3e77662e56f7c2eb4b1f78ba3c69c5f3095f950d0cbcaa13b9a1"}, {"Num":140000,"Root":"0x284fbe7f648335354f150b7d7fb3b5a6f00b21b368656bd93c0041133ef3733b"}, {"Num":150000,"Root":"0x9b0a11c49ef30734192336a22dd946bb8c54e5b86ab51b4c191655d53fe983aa"}, {"Num":160000,"Root":"0x9bd3a200a8e3e7af5d0ad40c4659c40e3ddd63d426ceb49344415443b501e241"}, {"Num":170000,"Root":"0xeb2d8c03537fc5eecae7186f19a7e5ed0bcba6343454b08b3d8e56ddc2b438da"}, {"Num":180000,"Root":"0x8ccc6b569c2df237e954a8422eda15a15d6530e6fd6f8fe2815a0fe8f54e2461"}, {"Num":190000,"Root":"0x839cc55124f07747f7af5232e9c6b25f3c6d3e99e19e1da0a29920ef21294ce4"}, {"Num":200000,"Root":"0x25be98af6587e55885c8f8fa2f23bb45dfe0d774afad64478f73bc61b5ac2994"}, {"Num":210000,"Root":"0xe9e27f595e5ad30b153ce6c3d50a447572dfaf25bec356cb27d33b0c6e5d849e"}, {"Num":220000,"Root":"0x730c42a8be29f91058db7cb4a4e9565ba7f82b6c3beb78dbe081be56e150f0a9"}, {"Num":230000,"Root":"0x1aaf6cb4847ce78082ed2bdb27066f07dc465cdd3886afe66e40490e0e5024bd"}, {"Num":240000,"Root":"0xa85f17ec3805d6332afebf3ef18ee7ad22328921de0845d13cdfff0c6be39d11"}, {"Num":250000,"Root":"0x163563cae7794a0fdd4f212d800901ca985964b16a30cc0f99b0408b694b8bda"}, {"Num":260000,"Root":"0x5c57bba48256818ed7c3e08045b2fbcb37deee697389d846b6e0463b7c93fd34"}, {"Num":270000,"Root":"0x9bb9f7271f056b262f492e9ae16d2bf6d7d067e0385d1608863a775c94c7e89f"}, {"Num":280000,"Root":"0xc07c6f311faa98ad1b6d9b40b7bdda5237cc6d4204059e3cff8fe21d48ee01e7"}, {"Num":290000,"Root":"0x337950aa76b9ec626318a433d1ceae1d016918f2811072e2af22d1541ac78374"}, {"Num":300000,"Root":"0xa236b6918a2def438169439061668a885c2cd98a578a31f7f144f4a368354467"}, {"Num":310000,"Root":"0x718cd32fca605f42fe7ebb3f5979771ce1d722161ae54f5ec5b452d2688304e8"}, {"Num":320000,"Root":"0x797b3da43895611b006ac35681aae7deaeb56ccb9dedbc1b4573de17e3d92ee2"}, {"Num":330000,"Root":"0xa136c680eca63c182e722c68f2ff7927fcf979aa18a71c47b28f3305b5c456de"}, {"Num":340000,"Root":"0xff09c0e79c8645cd4bb47968336446c0f5ae8eb442095bf05b4d26ffc6cd209c"}, {"Num":350000,"Root":"0x3af050024d1ecfbb132fae8476bd1eb19246ba27967e72f3c40f4cbb8fa445ee"}, {"Num":360000,"Root":"0xe6c759b313d195ca0d7c35aafef3df36f2392f259ec33d79ce737a0a63aedb0f"}, {"Num":370000,"Root":"0x6abb17acb1777b1a466f7a4b1f6bbe77f6b15bf1b86601294ea8d252ce04999a"}, {"Num":380000,"Root":"0x30fde8a2291e9b2e20f183da2ecc044d52acd3ccf0324cc5368d4c7ab4390e73"}, {"Num":390000,"Root":"0xeb54e46a2017ed43c1b1392e5dae813b75b753de0488c1293032e98ca7f0cf86"}, {"Num":400000,"Root":"0x863cd150279e46a7fceb4ce4f822c163d7da6ae62d7dfa03aca2b979ae945429"}, {"Num":410000,"Root":"0xd6cd5173f7be0a6dfe624219c52f0933c11840045aa3ce6363559dffd8103b3d"}, {"Num":420000,"Root":"0x22f4f8d41e958dbd842ffcdd5fc3ffa505432d4965e567fe356cea363103c6a2"}, {"Num":430000,"Root":"0xb6001748e691f05ebbf3907b02350fba2d9e5ccdf76488bfb17b8fbd194fe946"}, {"Num":440000,"Root":"0xc2ede3a881aa96b3562f2429c61760996cbd405834492b9ef2993f9ed3c76049"}, {"Num":450000,"Root":"0x84a0eb99a7728183e16fbf7ada642f4f26084763b055c74e2bd0248b50506507"}, {"Num":460000,"Root":"0x289fcb3ce0a1eab70a6faa03fafb5c6576ee3350a4c4930d73454a15dbca63fc"}, {"Num":470000,"Root":"0xcc46d72a69421ddc5da7425cae1142ec91e8191673b1464ef02d9e50e2df9c2a"}, {"Num":480000,"Root":"0x4421b99bc117a60b42e4d3227b44e6a88c8a662edcfb9cc6a9b4d8fbf7f5221e"}, {"Num":490000,"Root":"0x8b40e4e432b80c82457f3efe0381952a534a3ac5f8e9ddda27b9cbf440fb0a2d"}, {"Num":500000,"Root":"0x5232d67c9b9d5040ec0b1b4b26cd3ce7231bfb15b4385396863751234e3c6ce6"}, {"Num":510000,"Root":"0xad44ce5d17f2487eee8345b907bb619691247b95ed09e040c1b5717d8592eef5"}, {"Num":520000,"Root":"0x6437748164638539586bd3f1fde9c5f26f4022dd65e3743b85319521c0dd2d90"}, {"Num":530000,"Root":"0x1aa4265bcdfb52212272065edef5744f8ec98d221c5d5083358ebefb6a5a633d"}, {"Num":540000,"Root":"0x7fe2560aafb35ad1b06ead7e4579147657150e334d5459dd4c40d24acccd1966"}, {"Num":550000,"Root":"0xc7f3ffab0814f5a00602c7ae934453429696b1d1daa6be0112532a4e68d052c1"}, {"Num":560000,"Root":"0x4d19cf78ae4d3c05fc4664ca1baac62ad78fc7a37b2f11f2c77943e82b4c3791"}, {"Num":570000,"Root":"0xbe5f7face52b2c815919aa6702e801eb6cd2bef1a5e86de6ba45dda0b6eba166"}, {"Num":580000,"Root":"0x625d02cdb2b9a90bee493321963b6ebb0210b0d1d807f9b395060f99a3611b61"}, {"Num":590000,"Root":"0x44659ea294fef4f21a1ee09f75e424c918bcd18fc936891acd2828862b3311d9"}, {"Num":600000,"Root":"0x34a4c75db8ecab1e4f7f172a42744ffa6af0df38231bf00b6dbbfe88395a2f59"}, {"Num":610000,"Root":"0x0c2e94c0abafaad9009e7a915b18e32bd32fefc1bf60c8d55e7f2bda6b6d417d"}, {"Num":620000,"Root":"0x624c0515061f3b35d76f8990f958af9d4e8c707759c7d9db3212502a5baed277"}, {"Num":630000,"Root":"0xc0b472ac9bc7dcd0919d2a698695cd4da5f294970d4d12ce9721657a7cf89dd3"}, {"Num":640000,"Root":"0x070f1bbff21a9d24848aad3bd4500fc0aac6d7593896a211fffafe085b425473"}, {"Num":650000,"Root":"0x7db0b840ed88760edcfa317a1c6bab72d988bd068605fa85e408826952fb6453"}, {"Num":660000,"Root":"0x199036d45e635ab31de4c5324a7777f81d37efe37b7a083c7ae0bbc9f6ad45ac"}, {"Num":670000,"Root":"0x22a4bfc050c63742f942cdb95559d2f76f2e2f70eacc4de424eccb8ef722a777"}, {"Num":680000,"Root":"0xeff0709e0b8df7dd3c8b881cab0dbdafacd50d8d36b294a9873033520582fdea"}, {"Num":690000,"Root":"0xbac6db023a1eb68fdf59c9e87afd58ed5153c2e7ed043e4f8ca1ba9b7b6adb78"}, {"Num":700000,"Root":"0xaf621ba8c2665ab54a2cacabf2169f951985111cebb49c44b6aad481fd4de24a"}, {"Num":710000,"Root":"0x702c54ea498ee1638cc1a225bd0a2b8e74127b4fc7e059d6db9538a9f34064d9"}, {"Num":720000,"Root":"0x5b74933fd3e6c916304ab608bdb603c357a37e2ac76266ea33e782451c7035bb"}, {"Num":730000,"Root":"0x37fac9b6bcf1cfb4caf6a23561c6b27b6446fdd7a368a387c58e6c68483dffcd"}, {"Num":740000,"Root":"0x268a0e1f6b52e53b549bf97eced44a9f86d712340c557af21d5735d836e3cd59"}, {"Num":750000,"Root":"0x8b619837fa8eff8ab6fc0f703ca85fed039c5e4678ddbe4cd270b14c88df1446"}, {"Num":760000,"Root":"0x3f70723a651afdaff4b49f6ea61bde6312cbcd2d4cfba421e0f755b94e104682"}, {"Num":770000,"Root":"0x6bc907e05389851b637b4d5d587278ef05fce584a4b32844ad536b3464838a90"}, {"Num":780000,"Root":"0x9ad8c57f44b80e34e85fe4f87ab6ca0a5da035517eb1a674eceb264ae5daf547"}, {"Num":790000,"Root":"0x8b456150a4785d02c51b40b69ebb2ee58a7c8b9918fe234e73d1c17ac3c25b8a"}, {"Num":800000,"Root":"0x43c879567982ad241950788f581b1a3c78744fa9194a36813135e1e0ed24741f"}, {"Num":810000,"Root":"0x6f6312f45a4385c04b039a5231cae31fef4bb132cc1fd6c85660e57daa69b2e9"}, {"Num":820000,"Root":"0xcc50107df9d21f437126cfe19da2dbdda14a6e1a31420dd9d678f1b2c43afdc4"}, {"Num":830000,"Root":"0xba2c1974022c5f454a0c4a4a64d04d1f8bebad92005bdfa0a475fba7b03e2880"}, {"Num":840000,"Root":"0xc990b02617928ac32b0532d08cdf93e25bf79a17976e5015c5c06e2e7736c829"}, {"Num":850000,"Root":"0x1970b08132c86ba8d14373ca17273142d85e0424c50078ceec40e673e67dd36f"}, {"Num":860000,"Root":"0x958e5079aa7aadc11d08f770770196384eb08ccb91ce6377002cd152b5d5efc8"}, {"Num":870000,"Root":"0x6641a30ba2bcfbf8f850046b3cb35c124725474cd20fcf87e858682ffafe31a5"}, {"Num":880000,"Root":"0xaec011fc471e6a16ce093c10cd45385934861872dd888a28e39d9f9df6bbad2c"}, {"Num":890000,"Root":"0x37f7f8833b3379b90ccbf9988f046c4eb30d25b11923c8dab21d9df1e3e1a540"}, {"Num":900000,"Root":"0x9080e00760cc6dd53bd8ab3188e792feacaea61f0c0c47a6c51b68a947a60481"}, {"Num":910000,"Root":"0x35263a79cba25fa655c50648197d886c9cda419fa9f76751195b555cb7397933"}, {"Num":920000,"Root":"0xd23af42fa657b1ce7470f85bb4632d7990385728771346a96f67858bed64e966"}, {"Num":930000,"Root":"0x0fc3e9a2d476f2018783b6ea739c3eb7e0b1b1ddbd79529a7c1f4c7a9cee0940"}, {"Num":940000,"Root":"0x13ad6d7788dc9f115fd980fb82b68eed984ec24f389252233f27fc2f18dfa3eb"}, {"Num":950000,"Root":"0x625c459784f8c12954a75eb90fc906256f5fa7220595a7f5b5a6368a92280a39"}, {"Num":960000,"Root":"0x83d32e87425d4f74eb46ecd380c013a747a6c260ba7cca48d68a5e30c73373a6"}, {"Num":970000,"Root":"0xd68e94cb38e2e84177b562f17a8491ca36ce3dab7d802422ea4301d648b14687"}, {"Num":980000,"Root":"0xa544d8febd14080421dc85e1283d1aee4cbf83741fd0a7e94b213686cee9ea3e"}, {"Num":990000,"Root":"0x4fe87930525d2a66bb0ea4af4e8cea41da11b924394a0b4cd6d6e1af8bd990a2"}, {"Num":1000000,"Root":"0x2e48fe82e83726c0a4de8b7a9244bbc70afe8378365910694f75e1c35c2f87c7"}, {"Num":1010000,"Root":"0x6ec880002c21347ddb5aa42732b03c0cc6dea08315687dbdcd84b7f4072d8c3c"}, {"Num":1020000,"Root":"0xcad3f8876d26c0831175081fc81c5357096e3f3f9d400316cb226a3fd57661e3"}, {"Num":1030000,"Root":"0x618bbf408496dc434ea2c205552098ff8f2354d6b076a22a276be0bb2a161d6c"}, {"Num":1040000,"Root":"0xcb0e6cce596aeb66dfae301fecc871a382ed05ac5d1a63f1db6ccfc54581c36d"}, {"Num":1050000,"Root":"0x858050f9ac86d3d69c524457dcce3c108a9a138fb2fae9920dbedf56c081d3b1"}, {"Num":1060000,"Root":"0xc3caebd9204e7dd57792606bd6f60a87c77c9b38b9ff349126ae27b4df0b49c0"}, {"Num":1070000,"Root":"0x7313e275126210da6dfe1dc1020eafc1878a8e2a5b53a2461aa3671db268623f"}, {"Num":1080000,"Root":"0x7113e40fef31ebe856774ce8d08d0fcc55bbae2cf4057318442f9bb3715087da"}, {"Num":1090000,"Root":"0x9f8e20a9aaefc51805d3d0200dedb7ac6d01070d8eb0455f96a08310edab6599"}, {"Num":1100000,"Root":"0x209413182efbf4f61d28038f4359bb535e1ba30ceb886629d0aa7b0a37f3b60c"}, {"Num":1110000,"Root":"0x112193d27f9325d5ae4cf10714fca30f9f22b7b35e2cfd30b24a1cbb80c1fb25"}, {"Num":1120000,"Root":"0x6ae9b88309b6c3c4f2c388bd89d4b6bda5ec48547c9b2118af2ccbb24f7f7cc2"}, {"Num":1130000,"Root":"0x0a66f9e7a92cf1ab777f8b3d9b239f5350d46fe03cffc2007bb5dd1f0de1e4d9"}, {"Num":1140000,"Root":"0x00e64dacd2a14e5ff399d69e3a613a441d019ce47dd72d0693648ae65fe06aaa"}, {"Num":1150000,"Root":"0xbde6eb447706c480bdac3e6919331f609ce4eae03f80a83c52cf1cce83dd06d4"}, {"Num":1160000,"Root":"0xeecbbe6ef4298e21b4bdbf6ec5a2c4f3cfef923c762c3f3e85683b930fc30143"}, {"Num":1170000,"Root":"0x0b4801fec511a4a6805e780215aba24e2676b0ae5a79f40d351f89fc595b8531"}, {"Num":1180000,"Root":"0xadc0371f6b594d352db494320140b9ab28c4bbc7bca6d110a352811a54db4c5f"}, {"Num":1190000,"Root":"0xf87f7e17ff4c4312e70c8195d029993f8ac0a87de4522ea91a5d7c84d7ba2766"}, {"Num":1200000,"Root":"0x34fd98ee150fe3e64a3020c4ff6e4840e11d8ec50cd3753ab25d4fb6d385d471"}, {"Num":1210000,"Root":"0x82fd5b66b796ec99d7f2c75ddcf461076107e58d3b751d966702fc62853dce30"}, {"Num":1220000,"Root":"0xdcf56ef7f006915025ce414937cd2c0c29e1b3f6870dc1e4d63ff4251553954f"}, {"Num":1230000,"Root":"0x8b694a39b5039b459dcf7f779c286c24e4c812b9ad91b32dc31f35805074e399"}, {"Num":1240000,"Root":"0xe834c68db5c231f1e224074eb7faab6c9e44526d416ae7ea18176616973a6878"}, {"Num":1250000,"Root":"0xdd30cb31262aa74b2344be45bb3b68d35a7cf1e298a4fb279c2004a5d91c2c54"}, {"Num":1260000,"Root":"0x9b61882c6eda6b6e3b4a7faf5a5225ee13c74d1ff45e530d284771422bcd980c"}, {"Num":1270000,"Root":"0x6e77f2c28ede98d31e828942efa8063b0002ebd4ba3250d902c1214228a2fe91"}, {"Num":1280000,"Root":"0xb9e660408237945b8f76da966466100ff8a8bca806f1284e1ce6af8d4d40a746"}, {"Num":1290000,"Root":"0xaba73d0407298994b0ab9946f3c82f71509f3374f6d2917ebe96a038d42749f1"}, {"Num":1300000,"Root":"0xadc81382c55a2fa882eab6c42c169f2b640da3bdeeecb784544a4ec83a543864"}, {"Num":1310000,"Root":"0x6aaa4561cfa3fcf76a0535a644a309c61c330ef32dcde0957362dca4fb2c896d"}, {"Num":1320000,"Root":"0x6baf6bc86d1f5fa31c7be03eb31d0697497cd2821b0d807c0ec2b1dc87f7602b"}, {"Num":1330000,"Root":"0x9d5d566c34084a52275e019b17542f1dc72d662b1ef1f2db4e7c4281fa48f178"}, {"Num":1340000,"Root":"0x07a1e2e1da3cfa2808e3cd055a74847d005ca6b65282eb22771499a2ee02eab4"}, {"Num":1350000,"Root":"0x4c1bfa91016ea8f0b258895c0263df5791783a6a987f71698414f15a0a4a0629"}, {"Num":1360000,"Root":"0x588d40e97718bf230769511fd6e5512d2874c3682eac4fe0290c0c02f55bffda"}, {"Num":1370000,"Root":"0x0796b53e114dbd562f16b4a927f3a3ab6ead7a9acf33ba2bb9c8a0c57180fcdf"}, {"Num":1380000,"Root":"0x452d85f201f1f6e1abe51bd98812a6ce506a76e1c322018da3daec6a80311efe"}, {"Num":1390000,"Root":"0x3ba0568240d7c65ffa0d2cbd924ff2894deabb0f46d0019443527dca68ebe396"}, {"Num":1400000,"Root":"0x6193c7c47ee455207bda011580767e2a569bfbd37ebad4343c0089a1d8420146"}, {"Num":1410000,"Root":"0xcb70825002e752bec2e8ed332d5433cc50449089181ec7da4f8f0a71012644d2"}, {"Num":1420000,"Root":"0xeb64d47792162223f7982b5a521074c3141932019567e090c7c624cdcb66a393"}, {"Num":1430000,"Root":"0xf409197a89459070db26ffd72ec617295b17ae846790d2758f5fa374ba9c5b86"}, {"Num":1440000,"Root":"0x0c394d5c8e5fca6dcd3c030bee24e80fa4493e860e8f48208c979deb0f8d0936"}, {"Num":1450000,"Root":"0xa26ecc96eb54ff135432c135a6574a858a3c21c7f870ae37c39ef7acb44bb6d1"}, {"Num":1460000,"Root":"0x9b359b566237432b8adf26681be00037ff3887605db2596d48159aa7e4e5924a"}, {"Num":1470000,"Root":"0x2490c6e73e3ea58d0c3ed338f8419780e55f25a15ebf014abae3193718ed80eb"}, {"Num":1480000,"Root":"0xe0aa4d74e945b401c52ae388e759eebcf1a8ac445abe30d11e6e82f02c8a1729"}, {"Num":1490000,"Root":"0x3ccea39fbd250b2874de3cbea1541dbb5f26c7d1acbe9d7049f38862fdab4e04"}, {"Num":1500000,"Root":"0x5b4e32df1fd3ad601117a72e58661d80006fd4c455e68369bdc2b41dd5a0ae98"}, {"Num":1510000,"Root":"0x625a8b4d4284a4db4397789cc5c8a6e4f11038df7409d122f4fa4e8668467238"}, {"Num":1520000,"Root":"0x87c1c0857ed142115f9d529b7faea27735f04a48e8c35e91629ff4a5e626b9a2"}, {"Num":1530000,"Root":"0xd732e320dc5120baac6aada96719c36d96407aff71944ffafb2992d40dc7c2af"}, {"Num":1540000,"Root":"0x8302e31fa7c365a2eaf55024330347001f0cf622d9bc1c7c5d092dacccb258f2"}, {"Num":1550000,"Root":"0x4618755ced966a37aab86f3b2a4cfeae62a46cf4966676ca9279892531299aae"}, {"Num":1560000,"Root":"0xdfa1fb801816a41c7c2364bfb716541c35bff3bad483b42433c7880f9e92ccc4"}, {"Num":1570000,"Root":"0x1c742c5f1787a63f80284b47f106439306a9ac2f1d0bbfd73bba2b3b423030d0"}, {"Num":1580000,"Root":"0x8b22ce5e347bba23ef7f4a1d1327ed9957ed31fd465cb43958bafe0cdee1d6cd"}, {"Num":1590000,"Root":"0xcf3897168b09a7806fc91efc3a8ce17e6def85c44e277c7f1d4548aa282a494f"}, {"Num":1600000,"Root":"0x95fc53848ba7f471b1068e9f9704cb3e2b90341bcbf27d7d75b55d37c970835f"}, {"Num":1610000,"Root":"0x025483045de798ad99f394b7407efc08e8c30ffdcc11ca1fa4af9728b512c8cf"}, {"Num":1620000,"Root":"0x2ec7ecfb0190449952d2990108d8119cde1957210c5b93a1b97234773e206847"}, {"Num":1630000,"Root":"0xe035ac34e475ca081d3a65040614e057d6f9738ab5a020e80244df395774bfe2"}, {"Num":1640000,"Root":"0x1c23ca92db26dbdb5235d36f2fcb33dc1bb8e660a4d28cb9f8a14b9286a19d50"}, {"Num":1650000,"Root":"0xd884f64da61de381c4a115791056a535f5d36316a0d9a50493926bbf73e572ab"}, {"Num":1660000,"Root":"0x72f0c4d856858b2d97c7a45a729638ff72625e8b6f4c541c087daebfbeb0c9e0"}, {"Num":1670000,"Root":"0x366a90f79a83d1171274480990da68bfde20a5dff59c39277f4a8f0dd33d3461"}, {"Num":1680000,"Root":"0x2b0000512f84bfc406b30d0ec442284936e26f93e2dbb984eaad0582f22aa5e0"}, {"Num":1690000,"Root":"0x11ee044665586826490dcaab8cc04b4789fea8955a9be5142814ccd5b577dec9"}, {"Num":1700000,"Root":"0x9babd63ec8f6f91e5a03558561bc08e415416f04a5a9ba8317afa40384e1b117"}, {"Num":1710000,"Root":"0x1c550f3959fc10d272d514d7aa41b7f413cf1404ce50464bf9c9925fe19e2d87"}, {"Num":1720000,"Root":"0x7939760dc3ff89f8847a79c0b6b4ea2cdeaa2b11c2bd97e1053ea902117e6635"}, {"Num":1730000,"Root":"0xe3fe347233273ba63a77f5668a68106a381224ccd6df78fe536edce5e631f64a"}, {"Num":1740000,"Root":"0x416e6db45f3297577bf23fff522af26dec3b62046cfb1777801de7ddae6e2f82"}, {"Num":1750000,"Root":"0x497d38c6dc86fba4db9a2a922058d9202645bf50d8c67e4290e27b5cecc1a267"}, {"Num":1760000,"Root":"0x3a1e5f9406a393ce0614e75bf8b843fc5740c8d868ab093ea85c31900c43d229"}, {"Num":1770000,"Root":"0xbcc782e2b75be10b202d56ce82147b126fddcfec7c48ab74c54cc0999fcb0f06"}, {"Num":1780000,"Root":"0x91bd219321ded8c3dbffa2558c2e27a35c5da19ea979b8aa33a415bb123037b9"}, {"Num":1790000,"Root":"0xa41c1e7e0f383c1b2b08349b0161e5479633d636246c31913fcbb6ba8d106de9"}, {"Num":1800000,"Root":"0xce5392165e44903e7622ec133f65c1f728f3909ab44a6358aa2cb5dc02a9ea4a"}, {"Num":1810000,"Root":"0xd6e5190c9171c42643bb58d7421701293366bba56090387238c571a4de6167ae"}, {"Num":1820000,"Root":"0xf7eccf168db89e270eb553ae211946b54580a069941431b0580d93b33433ebe0"}, {"Num":1830000,"Root":"0xa25a855abe89e5b6902c9ef03189fdfa4595a181608a572a4770e8d1867705e3"}, {"Num":1840000,"Root":"0xc52a3e3b72d1ba8f2843a360734fa2f93ada1ef7ed0ad52a9b9746df86f3ee05"}, {"Num":1850000,"Root":"0xad0c85b7e727dc4cac1edfa4bd9f89a1000adcc1b030ce2b440b2718eb048dd4"}, {"Num":1860000,"Root":"0xabfef093a0856e8e5f0bd35e7d1827d8748f417d885a143e891f5bc6371352f7"}, {"Num":1870000,"Root":"0x621248178ffef879e9c14b4a716f19771895e2617d3c1591573f641f7b812a96"}, {"Num":1880000,"Root":"0xd98f63b31405e2a7de5ab3d2a7837c7fcae6714e3932df7676a4ba8425013bcc"}, {"Num":1890000,"Root":"0xe7771ad7e3e210ef0d059b6205eb0a99afd48f2ce4cbfd420ce7b784d253ba54"}, {"Num":1900000,"Root":"0x4a59c4ebb7687a47d37b7cd0e27296752e63d3b9ba94734aae751168c54c62b2"}, {"Num":1910000,"Root":"0xae94d26fab9211d12ebb9425ce7d10497fbe2614ce9f01fd7b45229ebe8ca542"}, {"Num":1920000,"Root":"0x1a1f7334bd01950dd7d9635b0229564a0d6e1b8a9a7911285478e6451758e2b4"}, {"Num":1930000,"Root":"0x276cdde344e1768d07c06be8aebaaa6ce02f4039b60b8f9b7912cd0b9096492c"}, {"Num":1940000,"Root":"0x7c5151c5c0557b63a9eff6dc3ff54e7331ca4a363223905bb7983e7c3895c68d"}, {"Num":1950000,"Root":"0x13db1cf9e49e67cf90067dd4be174125e86465c83270b9937edc39df79557995"}, {"Num":1960000,"Root":"0x0e551799affe15d095e41cd02933701630259b6160724918e9ec6b342493d089"}, {"Num":1970000,"Root":"0x5639c73cb9e4ecf0b6c65a9f77de70aa114e6ef1ab1ebbe70dfb00111c21508a"}, {"Num":1980000,"Root":"0x3207a5d37b9eef4257e929c9176e9befde3b983d4bdc9cb9210a805a3a948611"}, {"Num":1990000,"Root":"0xfe8b303f3f4d98986995774280af893ad5e81d7e16ea051c3b1f07bc48b7d91c"}, {"Num":2000000,"Root":"0x5fe899461a38067ca07fb2dab16ca8bfb660964d5005761c7482f09a624ffd63"}, {"Num":2010000,"Root":"0x9d9d0ffd33895d97a895362aa44d5c7fa5660a512ae2de05f9466ee5850a82af"}, {"Num":2020000,"Root":"0x0cd920bae5ec0c526fe6a232edaf915cb01999ae7a6db20dcfe25c25a38731ec"}, {"Num":2030000,"Root":"0xeea5df7c0a66e284c1366ccf58c25df19461eb501cb579d3c9aaa6fae8ee191b"}, {"Num":2040000,"Root":"0x9f1bf6850e339be4dbf1152623bdd6770fe6775b02140cf3d60a1e62a15dac8f"}, {"Num":2050000,"Root":"0x9dc9cf0cb2564e92f238a4ce4e6443195237060884c906d3e6b5749e4f1c66e6"}, {"Num":2060000,"Root":"0x1646658d4c18d985adb882243bc4a6bb36d9c0fdebb6f6dc0609f6f923d6932f"}, {"Num":2070000,"Root":"0xbb9e20fe483d942a67b3fb0f69bba275cae3eeeff7debfe2f621b530f2fed240"}, {"Num":2080000,"Root":"0x3e092e0491c29876f7b2443490ae415b0e784380f808d2918c581ed9a93d0f29"}, {"Num":2090000,"Root":"0x2fe1d9a39a63dcb8971ccfa4084ce44d07d9d3e2f5d8ed6a81ab3b2d0f713fe9"}, {"Num":2100000,"Root":"0x1f5e39714008912bde4cc6c32331d6f44c61bd3b0bbba1e22af091a932ca90da"}, {"Num":2110000,"Root":"0x2e275f4a3f8c8557fbb2404410f48898fac59f5314118f66696da2b341c2e40f"}, {"Num":2120000,"Root":"0xda59c191e868e44d62f6d6ad0d750f0a604ca4a691cb994b43eded79fa0d6506"}, {"Num":2130000,"Root":"0x93a7dba4685e50ddf65487014e42830881ec3c7ca11ad58f009a16c337268bd9"}, {"Num":2140000,"Root":"0xa356346357a33ed89243b5c8a5ab4ddc95e9f6ba291896bb376c9d600527658c"}, {"Num":2150000,"Root":"0x2a3b94ce4ddb3cc523cf837ada63b4f0dc8e629583b30c7e42be2a5491f55d10"}, {"Num":2160000,"Root":"0x248cde0970fc00ebba81fe2b7efbc4ad186ead534482dc352ce05dad18cb8203"}, {"Num":2170000,"Root":"0xdc046d8a84029d2e4ba9a74e6bc142b30361eea0d939a3f0f0e98832de897a7a"}, {"Num":2180000,"Root":"0xe27b79fe6767751517e7de847fa2c9de2069a803b839ef5d35f3ed121cb7f1e8"}, {"Num":2190000,"Root":"0xef31d8a3ac1f96a50fc3390b5676892b5faf891886d181be3309f76e89f9c17b"}, {"Num":2200000,"Root":"0xf25fc2b4f7e459dde6d8ce99aa27af34fc370cefcceeedbfe755d53735fb5048"}, {"Num":2210000,"Root":"0x807857711e98df74fdaeff12a73585dc0f1db2c1f802d27531dea451fa56da00"}, {"Num":2220000,"Root":"0xc014342ea0d245b3850d80be2ef9790c3c7e2024b63f9c13fe46f861ba8d0ed5"}, {"Num":2230000,"Root":"0xb4e7d115a224c1fe725fef77a3114405e6c3b016dd6f3007306e57c743821234"}, {"Num":2240000,"Root":"0x2b6b5fb03352dbc6cd9a51ec195dde1a47304086fe2da76fbeaa5a2ac23dc145"}, {"Num":2250000,"Root":"0xf9b7bd57baf83ef32027991ea30898ab028f8151243e1c7f261c6c3212ea092b"}, {"Num":2260000,"Root":"0xe47937a34a548b2279e09423c2226d8597f3a19047d4fdbe27d484ca018bb146"}, {"Num":2270000,"Root":"0x863695ab01ff759a03a9ec93de18b60f22309185fae39fd2d27c614940553281"}, {"Num":2280000,"Root":"0x09ab19fbe7e7d5282106e6dc2d1aa3ff5c559465241fef6d9aca44bcf854383e"}, {"Num":2290000,"Root":"0xbdf566c4afd1b3f2a1e809da74c195bb024fb6294905783d92b834a6dc563e1f"}, {"Num":2300000,"Root":"0x136c1c48d1bc37d5447a7b562ea17a513a4310db65a3fc455f9d6bc49fd98c78"}, {"Num":2310000,"Root":"0x1925ea4ad0da9efb20efc0e0cec045612513d15d6085352c0b995ef0a2eda924"}, {"Num":2320000,"Root":"0xeff682997caf9fb7910e39448ef3df101cdc53b204707ff96db831de815c8b09"}, {"Num":2330000,"Root":"0xcf984b6e796651f99a65405986458a6f99de9916a4311916962f017dcf0912bf"}, {"Num":2340000,"Root":"0xcc08fc841beec954cf3c7e49817d6cdf76e26fc10883c9c5cee5b53a8a37d3e4"}, {"Num":2350000,"Root":"0xf9733d33fb6c4a25554321b11e605030a8357248c153a313182290fcfd1b0c3a"}, {"Num":2360000,"Root":"0xd1365a6cd5ab73bf019220cd6f77e7f3b52fcd894c202e4006bf57ea49998916"}, {"Num":2370000,"Root":"0x040151a35449ca2b26a3649a5a4ca5701520156fe8bb7465bc81efca332e1767"}, {"Num":2380000,"Root":"0xdabd6cf2d06584a79f93c65e9aacd5307609b3fcd290cd0354a8e6c2c683484e"}, {"Num":2390000,"Root":"0xe63d557443dd880d2d6df8d18426095058a3c38d2c878a1c46cf99f7b4ce30f4"}, {"Num":2400000,"Root":"0xde871dea768eb4fab6958872a1fc519518c8ca9a69e82a77f494bdeb33278a6b"}, {"Num":2410000,"Root":"0xe630bb5e9ba4d304bc11434b254ffdf260825b7e2cad3fd435c069821ac6fde4"}, {"Num":2420000,"Root":"0x38278c4d0337bfd32b70bbf530074dfc0a2ec9f088213f78a3a6048fb17032be"}, {"Num":2430000,"Root":"0x928f7ef9e7fd00fd712a7bdc5ddfc4fb9b8098812ef9ac3d1ec3b0c26654d1ef"}, {"Num":2440000,"Root":"0xd531001b27b1e1d8b98fa86e9593eea92ecb23077a301204d0fbf9c2e8d887fa"}, {"Num":2450000,"Root":"0xf58994b6594845aba20878ecb46b149660fb40f268850164900ae46fe23fab65"}, {"Num":2460000,"Root":"0x3d7fbdc4d29151c3eb709d39de3448d1f8a40fcf0fa269550377c3eb0f3b109f"}, {"Num":2470000,"Root":"0x44f589a903eb66b531f528d9bae1d435431e3f7b978113b060472cb9cb8a977f"}, {"Num":2480000,"Root":"0xadcf99a569b55794e2a25bf30c1b5e84a5298e3455991cffc728adc01a139b05"}, {"Num":2490000,"Root":"0x70fc9b888109563c8c39b08229056de63d7d551ecf13ac022bfc9a08c225d59e"}, {"Num":2500000,"Root":"0xcfecf832ee946ee0f006f4eb267952606d07df9bd7f152ee7ec3d768cb4b485e"}, {"Num":2510000,"Root":"0x81c50a16ba67979ccb2c503a5b096f993e9b6d2be11131be0426cba1865b5cf8"}, {"Num":2520000,"Root":"0x6ce442b69866f384a34bfcc5bd395e2c8d412c5a16540665044b01eb7664e307"}, {"Num":2530000,"Root":"0xfefe66793bbc8dc414759a4048649729a6e3c8f2d8b06f3a06dd045fe008c63e"}, {"Num":2540000,"Root":"0x3e7c618666e7d089b7ed36fe50e41b7e0f1df5459c0862e08c4450095ef30176"}, {"Num":2550000,"Root":"0xdf5656d66826c54086b3c58f084ab2d3eaf4d233aed8b02086bcb03cb6dd8199"}, {"Num":2560000,"Root":"0x8e241539c874497bd99b003161b41a9a25ee66d0ccfae6a249ca7eec18a54574"}, {"Num":2570000,"Root":"0x2fc2081542b3d20572a14692876c686a702d2f2aaae847eb1b82459f0e3c4d21"}, {"Num":2580000,"Root":"0x8935c958e056fd6a8f44f04bf7c4fc1802ff68a7c3a7929d6e6be32674c300a3"}, {"Num":2590000,"Root":"0xc262f7ce5f0e774b93a87c38b9480acfbef92fd1e34c51522b3a04a2ad1c71ec"}, {"Num":2600000,"Root":"0xd765b50f579521cf11e228a41eb09e97f48bf9c62a6f21dbbb15c7c3b9024da0"}, {"Num":2610000,"Root":"0x9eab5ff1dc3a758051c9357ceb14f01f27ff484e76c8fa5ce93e355173297baa"}, {"Num":2620000,"Root":"0x4f0f24a0aa6997f84721bdb1c1208d0d456298fcb101c7685d65cc87fbbbe8bf"}, {"Num":2630000,"Root":"0x68b863421769763ad923f86726c72625aceecf2da3872061fe8c4d478d99cb4c"}, {"Num":2640000,"Root":"0xd4042a6cd2a01e5fafbc23db127d60e265a9e242edc95fff8638c3297cae7803"}, {"Num":2650000,"Root":"0x4b9317e642306af20ae72dfeff8d3fbacfa74ae302ba3ab639c709115788dcf7"}, {"Num":2660000,"Root":"0xcbedce982f698eb089f85fc338e5f73d7a09fc474930c979510c138b5c556f5e"}, {"Num":2670000,"Root":"0x442cda0379772c8f608bcdcf12e28a80a4075cf9770ea78c37ac8c55f501a9b7"}, {"Num":2680000,"Root":"0x16fe4df432c546879605467b4865653ba22f7d4fd02d6243eeecabf58a16a5c0"}, {"Num":2690000,"Root":"0xabc413d8039cda930f9a1b8761ab618381dcf4ebb39aa7ad922a6bd07cdd3cfd"}, {"Num":2700000,"Root":"0xa0fdd5ee8d6beadad0bb2fdb3a22abe7d5b36a08955f60051061f9cc1171dd5a"}, {"Num":2710000,"Root":"0xae6fc5d34c4b722db53c2c385926239d867f8d48072d90347e8e7acc6115fd03"}, {"Num":2720000,"Root":"0x264fc5ef91ceea3a4ccaa451613afc85a35e8e5c2d190d976451d4d0274aa14b"}, {"Num":2730000,"Root":"0xd7f5efb56ab49ac378dee02cc127098f35b0f6876a1b76d63703c2e433488013"}, {"Num":2740000,"Root":"0xc7a896a47c4d4585e85fc51c6197c59164a299953f945af50dc2aba6a038a344"}, {"Num":2750000,"Root":"0xa71743d9c290dfd6384a3a70fc893478715e74e217ba02d3cc3843e23944f787"}, {"Num":2760000,"Root":"0xd53f4708d01ed39a2213e0f9713256ebec620f9d1d9a5877016999b71cdb5622"}, {"Num":2770000,"Root":"0xecab2f42e2332acdf1306fd4269ca4ba1d862c3526dfe96c8a36ed459dbf6ca0"}, {"Num":2780000,"Root":"0x73ef30e8bd408c6c52d88b3b1b2f06f038aa331613897e201f62cf7132991e29"}, {"Num":2790000,"Root":"0x0b553785377f118725d0716b447b055fdfa7bdb3d67e56f2530a440045e9c984"}, {"Num":2800000,"Root":"0x63535abf306e233f302fbb8d4e6684e309a61a6f3417e27f11c6613a5aad7aaa"}, {"Num":2810000,"Root":"0xcb802a9f6919fbc970a4b5dfaaa2d86a21d4cb8fa559ac2f804eb23ebf46498c"}, {"Num":2820000,"Root":"0x197818c331da43f76221f67a1f4e3f9f2b69e726ff6b5fffd47b4404efd8e15b"}, {"Num":2830000,"Root":"0xf375fb17d71ca56117a34cb9f94e371ef4ca14c4271a3307750a6695f392aad0"}, {"Num":2840000,"Root":"0x7643ca6d80c03b0a6c03057a44e81a01251c51c6b481b0c71eb5273e5e8f232d"}, {"Num":2850000,"Root":"0xab94ca79be6d30f44f0d887e7d1a614d43dc7b90d62d0c6038311c6fd172c943"}, {"Num":2860000,"Root":"0xfda4b29c92320fbeda43214cb993eff6fbc953520d824330fa16de22aaf84ea9"}, {"Num":2870000,"Root":"0x0eb25972a5f332673853dce15e8fc6613776eeaa13b1f5cbf0cbd4c111695556"}, {"Num":2880000,"Root":"0x90579ef9494f362b8a9f187a3808cf2ecbafbe27503d5201b7ee829836cf4edb"}, {"Num":2890000,"Root":"0xb2e7b399163b54755b077a7e9f636902770ad5158067c513a5ec0fd70472f43e"}, {"Num":2900000,"Root":"0xf73752e5804f0c31201a9e171a26904a8d5b47e456368dba4b9710fc8085eb68"}, {"Num":2910000,"Root":"0xe3cec50d40f874b49f86199d5fff42e83f7bfc5e3564fed5f7a0035a46f41bee"}, {"Num":2920000,"Root":"0xbd88af6b58ca657fa72433fcefd56ee68af86af596d50792eb5bf1e0ef123bd4"}, {"Num":2930000,"Root":"0x382531d3b40b8a6504b91c1483a31b6cf6c565b38fb3d510a6b60b6ce5e6e17c"}, {"Num":2940000,"Root":"0x8b970fae3829fd00ec3f6abbe7abc2feac3865d4cd005297281426602273aa14"}, {"Num":2950000,"Root":"0xa01abced21c2e7e2dc0d889432a38b08368bda3c1525586d444f50771c901c10"}, {"Num":2960000,"Root":"0x54abaf5991f4bef35c3b2a003d971ba53e0e2d302209e94452af5795c464b896"}, {"Num":2970000,"Root":"0x79201755b667676fac49894b23e85978f546bd5c7bad565cd1a2b628a15af777"}, {"Num":2980000,"Root":"0x1b88659e364d0eaaee4f8f8c001ff8c2737c974736146117a576d909c1baa82f"}, {"Num":2990000,"Root":"0x5caee84cce9466c8dd02e24e8e89965ceecf57d6af837bc532ab2b3906a8ea51"}, {"Num":3000000,"Root":"0x01e1599d3e65b208cb288eb2a455ccf09d5c11d2b6382f719fc5ca3f42952c71"}, {"Num":3010000,"Root":"0xc1728fbbca8c7dcab7011e25cfca704d054b312020cd66d8bdd9f77c8a2aa29b"}, {"Num":3020000,"Root":"0x20355de7745e3705df11fa86505deb76c8a6e902b0560703cfcf1eae49b3c2ad"}, {"Num":3030000,"Root":"0xffba8c66a62b2c6b9449e7937e33856eef8e1ad10b180cc9d3f88cb1e726282f"}, {"Num":3040000,"Root":"0x05fa8ceab822f277e6577ed594dc526204a3868ba0d697af3b7f5868acd59037"}, {"Num":3050000,"Root":"0x99ce028cd8d3829907ffc198851e72da1ab746f7f4a6d10710dcb8729378af9c"}, {"Num":3060000,"Root":"0x4b544bfc0562fb70a5b7cae05af83ba559976fe62e11e9f4edea64cbc2f7946b"}, {"Num":3070000,"Root":"0x10f07ffcab1998479cbe709dd73e0eb54c89e2db188bb167df440e7ea18388dd"}, {"Num":3080000,"Root":"0x0e3dbde004ea6d320d9916b2c0043bd14af9874a17c965b25221c2c06bfb8184"}, {"Num":3090000,"Root":"0x64dfcd092f13f78c016e3ce53b4002d41fa61d24c652a2b966dea01de65cd8b4"}, {"Num":3100000,"Root":"0x2e78d13575064448cff7361090d88af8904f6b331f720a52a0853f047f65af51"}, {"Num":3110000,"Root":"0x8d186109ca6ab95d2b4f5bdbe6fb6a26d40d7df7e6ee07825ae920747bd5a720"}, {"Num":3120000,"Root":"0x66a9590f9fcc39ed366c6ae7427da544ac4c4fcce22c0f62efa7b7544f2ecf4d"}, {"Num":3130000,"Root":"0x069ee97776a166afbc937234c035c7d11b9c90cbd1fa5a32399afb68a20b5c6a"}, {"Num":3140000,"Root":"0x51732e86d5fdd47c746350089e5ba31884560c91dedc29759188b3789112e3d0"}, {"Num":3150000,"Root":"0xb7a7832461ee89826785d32e6714d82584b4d8a0b3ad74fc4176669705599da5"}, {"Num":3160000,"Root":"0x588e7d9a241650c67171e9df305eaf71d581c9c978b351089ba3d1ae5e3fafff"}, {"Num":3170000,"Root":"0x5d2d0f81b5d90dd54cd42a072b65e0e2ca6f1ead39821cf5cd784c9c6246bfc4"}, {"Num":3180000,"Root":"0x20c03d45844ddbe15082abe2c4f9d02b061e1fcb3b57ef2476b77c18faa61589"}, {"Num":3190000,"Root":"0x941901dd47b1ad5a239896c8e575923ff08d8c9a670dbcd363ca9561d80d6bab"}, {"Num":3200000,"Root":"0x1a45d7cdc93a10e5bd06ef3c03e9f8c9f682e2fff929db7755e3b79168e4c7b3"}, {"Num":3210000,"Root":"0x37b6ffaf8c034cc57b2f88cef2f27c74bc0e7a1dc67f9d76da0fc8dfb5872a20"}, {"Num":3220000,"Root":"0xaed2652d43945e138ecfdc319829d3787dbad0547bce83c52a0aaf2318167416"}, {"Num":3230000,"Root":"0xc0cfff1f045d069778c7b23bf10317709013f98715f5876e008f0b42e7a31036"}, {"Num":3240000,"Root":"0xaa64d8f25dd6328585c2b87420c12144edf2c4a6547f70744a1973f24d76f28d"}, {"Num":3250000,"Root":"0x6ae6f45e9a8da79591cab909daa52e08a3b2a7e7083ab155df863ae5ee49403b"}, {"Num":3260000,"Root":"0x25481815e398128c5b862cc8ffe4390292d0a61f6a66fc57f9d768a638ef5a5a"}, {"Num":3270000,"Root":"0x0e386be14519b40f3a341d3ff9416ca9647880fe120ee7e85163b3a66a86f7d6"}, {"Num":3280000,"Root":"0x1a99264b16ba40ca33e00f56503d5565681790b27dba83ed6e12dda99efc1d7e"}, {"Num":3290000,"Root":"0xb07b377893f5c8663b79e32903e74b8176e246f3479505b04656c2d860fa710c"}, {"Num":3300000,"Root":"0xe1b23856dbcbb6c5dd9a2cbc4d2cbce1d34f0afa1147fb302226cea88a46da81"}, {"Num":3310000,"Root":"0xa54e1ad8e2a3885b6df09f141987297be7607ce0895b7b8929b406a1e057686f"}, {"Num":3320000,"Root":"0x20d8391fb0658628272fb722896a15d90177fe8a6eeded27cfb81f10ce9cf9d8"}, {"Num":3330000,"Root":"0x0e1aae418f73112b6b180cfe7703de04a0b93e32314f9ba46815b1768bac863e"}, {"Num":3340000,"Root":"0x9c12723ea67ad684751ba2cfaebf843b494cada829343f392db56e6e85f792e2"}, {"Num":3350000,"Root":"0xec41d5844f6f7cb30d5ef0f5a53e7b8e2b15d7d87a6e8632be3b50b86a749f8f"}, {"Num":3360000,"Root":"0x1e5f2164eccc85679bd7855b315e5c0fa2b1b4f20bc34b3074fec61289573b36"}, {"Num":3370000,"Root":"0x54d5d69ad75258e7903be0fb805540f3c7d8f4cd03814f08a8448f05d085136c"}, {"Num":3380000,"Root":"0x27256952b8a587c2518ee91b087266d04fd7902406aa9b2990405dc2de1df5a3"}, {"Num":3390000,"Root":"0xc51712602af11b2f41fd87c32845898f94a3394a4f0d2e645ffa124a69d3dacf"}, {"Num":3400000,"Root":"0xb04006958eb5920a87cd0103503dae3d8c64a593eed367ac85e0d5fd93f6e9f8"}, {"Num":3410000,"Root":"0x746a02a112258ad01ccecf45639c2f840d0cc8698b62ca77686d3e23aaa77018"}, {"Num":3420000,"Root":"0xacb6c6b0be02cedbbd87ef01475a2ceaae6e30acd72ba0b009f70a1a7cbf4227"}, {"Num":3430000,"Root":"0x660c162376afd305156ec4bebf5a4551867c0f01d0e54ec131f95be6cff58333"}, {"Num":3440000,"Root":"0xa1565187633d53dbe467e0b42ca6dc9868c3c10c8739c28a7c40a29b3da3d9f6"}, {"Num":3450000,"Root":"0xb094da470e1908aa4bb8fbb7c3d42a0225171b8d3e0c2d4b6b33c637355254a7"}, {"Num":3460000,"Root":"0x87a96507fff8d490b16b544f062ba4a44dfb4b3e571ead37e1280aa7f1b68569"}, {"Num":3470000,"Root":"0xd3d7283bb9dbff353a9b4e6e337fecf9c5d49be6f3b02178af8081bec3bf20ca"}, {"Num":3480000,"Root":"0xaf3abcd3831f5506a5a41df174b5460af947a179a5038f0022655e0879ca5dcd"}, {"Num":3490000,"Root":"0x72d5320403b6d04864a4a64ce20d90299e1ef6daeff960bb65592f948124affa"}, {"Num":3500000,"Root":"0xea4e5e671a037640548042ebbba23f96c486218cc2f3d2f4a06c9f14f38a7374"}, {"Num":3510000,"Root":"0x8e662e15ca45deafcc03349732bff6a07698159abd0ff926437f624d882b827c"}, {"Num":3520000,"Root":"0x812c4d165909bdbb4174494d6cf08e3d3d02408f66c8a8e94835788098c30ea9"}, {"Num":3530000,"Root":"0x3f166fe6588316c017a64fc15548a24fcb5db87a2e7562c63c01b35d2671b8e2"}, {"Num":3540000,"Root":"0x1bd1a60ffb91cea40153cb86af4c858caef47546928b20f29e5818a62ae2b360"}, {"Num":3550000,"Root":"0x8b43ccbd0e77620c2a1ef973f2fc953973c61f98dfc7b9c41b57f78849195f58"}, {"Num":3560000,"Root":"0x3ff6563376f9c8b70555ef366c283c401c9de7f035d623ea24d38202e78a8d6a"}, {"Num":3570000,"Root":"0x3cdbe28f87206938abb4add8bcd506a4fcfb34e0da013d3eb3651eb860e431c6"}, {"Num":3580000,"Root":"0x8ca1b3b12d874a7d783c7209e9a7099f0c5508a80a8a0601afc4c9450468ba53"}, {"Num":3590000,"Root":"0x4182a2985ac1fe55b2054dc0a9aad37b9d6ac6360c79cb65e2bd0a7aa3ce4833"}, {"Num":3600000,"Root":"0x3a031503403929de73be6e9143366bd81b25a7cd7309946de6133c172a8e166a"}, {"Num":3610000,"Root":"0x25f8d5ac5636b302420f443aa74d01e7ded0a41f4e7dd1c2d0dc2daa9c0b654c"}, {"Num":3620000,"Root":"0xc7508e8f280837b6f340c6d6d8ae3e0df285a41486c0ee8cb3149e222857e446"}, {"Num":3630000,"Root":"0x2217f4b4839de1f9e347da2aca7bb308f387be1fd2594aa899552407aa218362"}, {"Num":3640000,"Root":"0xd38c2bddd0e1d17425d563f05dc655b5325ceed3db022e6c57983e4d8c18e8d0"}, {"Num":3650000,"Root":"0xe4a75d5402aafc5cc353dff08539ac1e1f46f17795c3f3327889abb5502b763d"}, {"Num":3660000,"Root":"0x77ee4a516a6bb369ce2e13240bae6e5141deb5cd586ab8786e1c469274596980"}, {"Num":3670000,"Root":"0xc74facd891c57a1a6f2d7d07799be53aab193f818cda1ffb724435481664fc1f"}, {"Num":3680000,"Root":"0x90844a29ccd9dcf16ca765d7d39e69a0d5563fe7d4ed975ae4f653fc1f06f3df"}, {"Num":3690000,"Root":"0x22a2f296f6997502e06792f99c8a516f2cc302aaf2161e75b7552656ec3cdeef"}, {"Num":3700000,"Root":"0xf0a246c2c698b609f9b4418717f785932ca711c44e722b5d562f41cbfcbfa5fa"}, {"Num":3710000,"Root":"0x1671757782af19d9275e4181d8b3be61037abbbc644a47a566cda103551c08f9"}, {"Num":3720000,"Root":"0x055a22a4033a8ff8e30af255144296f3bf20bb720e5f22a7cc7eb4fdb790c896"}, {"Num":3730000,"Root":"0x85183f302b849426f5b38d10a9e13d8ba49928e1fa314dda3425610065846caa"}, {"Num":3740000,"Root":"0xf46de0d9523e2300fe52cbae4d2641183c8379c2a2735d4e74bb718e5c6a4e9b"}, {"Num":3750000,"Root":"0xd813f0cc0b9e50ac242b45ffc8865184ce2c64fab456b82776f3455a5e8365fe"}, {"Num":3760000,"Root":"0x614ddfbb72772663f327ae28461f71e4ecb38a769ace296ecace3573737c4bef"}, {"Num":3770000,"Root":"0xb14101cbb5fe083b5e4e5f16d0b9076f1117dd64e6b817d474055223d7455e61"}, {"Num":3780000,"Root":"0x3cf327a1f7944740d5be103f72ad2f6fd55edd027de0d0fdff44e6bcc1dcdbb8"}, {"Num":3790000,"Root":"0x5ab91a404313d1e44d25a5fcac088668550c31e94e517e803f61c04b64b8fbcf"}, {"Num":3800000,"Root":"0x22f6f18b26f3ed756b6356239a4a4971799cd546326bc45dd0cf6567b1c12220"}, {"Num":3810000,"Root":"0x27a9a53096de882cff9e653219378afe80c73e5fd3dfb26c782cca6410afaebb"}, {"Num":3820000,"Root":"0x684749af7bed74854e9e22b8b39ca1efc2aac631a43ff4226665ac55053d6d40"}, {"Num":3830000,"Root":"0xc49a9588f477761644e2e6ce3351ae969662a1075f1cb8b6027c562b7fefc9b3"}, {"Num":3840000,"Root":"0x23a3fa00630246b33c0b08c646f4dfba7c2c81a4a9d725c60702f7fc1ca5a469"}, {"Num":3850000,"Root":"0xfb2793c92ba8308a0b14e2249d72bf8eb7f112511028be4d91702ac61ea78244"}, {"Num":3860000,"Root":"0xf50b77c304b3cd09d697856f66a700d9908a34349b9613e0a91fed6f6afa0bcb"}, {"Num":3870000,"Root":"0xe1aeddbe17e4cbb61dbe1107e10bcc8694e5a620e59156db1cfeda4647e94993"}, {"Num":3880000,"Root":"0x46637f4d636d62071dcec439b3507993f0228f1a972d49d0b3f4feeb2d0992d4"}, {"Num":3890000,"Root":"0xef2958a0535182bd8cc279d1bab3aa8174d37a3b92088d74b815c23b5632a514"}, {"Num":3900000,"Root":"0x5a735baa7494a5a697eee5a92e0026485750d880f3fdc78c8837c2a2645d92a5"}, {"Num":3910000,"Root":"0x39d61f413176d758cc99173a4ccdcca966f7811818291bb6611a6afb4db6d45e"}, {"Num":3920000,"Root":"0x4f11eaf9f55957f0734f2dfaee929014087016605a178f096e927acb1b062fa3"}, {"Num":3930000,"Root":"0x4e7b122e85ebae065f0990ec572a1bdcf9e1506eaa9b4b04a1d30ffc1661c1c9"}, {"Num":3940000,"Root":"0xb251a08aebd9d202fde78cee71cc63e176f3bdfb183b90d4c8cf03e5d0d736b7"}, {"Num":3950000,"Root":"0xa7b5cbf0e648003c01bc9f46f260c8139dc50934bc4e32df474162617753e073"}, {"Num":3960000,"Root":"0xf14109a9d81280e1ecfb6534daeeb7a25bb4db5fb5c525cc99f9e09a7b8ac1d4"}, {"Num":3970000,"Root":"0xa34021504cc2181cd072f1d688fc8e23d862c231a38d11396894441e9d97fb0e"}, {"Num":3980000,"Root":"0x1f494247506c32b632f2812d715131fc6517c925564f4535e1e8038c1da8859d"}, {"Num":3990000,"Root":"0xf399b77f38706ec7fbef31082511083ff6b1f66e73a83df89dd6888a072eb98e"}, {"Num":4000000,"Root":"0x8cf2956dafa8d860732c91a27eec54e2c140653db75b8d45508856f6778f6dcd"}, {"Num":4010000,"Root":"0x002ce839790497766979548eb3c978fbda06b1e5342b32a6bff6c9b4ee5dc5e8"}, {"Num":4020000,"Root":"0xa08dfe82b2bed4c87a07346c04b803829b1b74f238f285ed2072cbc088aa88db"}, {"Num":4030000,"Root":"0xdaaccc53fd17d8110b4b695c4fc9c4ec02661955e2efcf460f76d6c49609ac66"}, {"Num":4040000,"Root":"0x3a59c9ea341a717c8730699873d6ba6ed27231d88f6b0e23e2b9e71ef91b6c65"}, {"Num":4050000,"Root":"0x0b538c00c20ee6ffad5c92eba732b9b5d01e8a830c24445f4da83ee3698c7ec6"}, {"Num":4060000,"Root":"0x90e68d1b6664afd41c9df4450ed91acb0e1a8a5b49a42e10bc364b8e88b3983c"}, {"Num":4070000,"Root":"0xa1c837e10b01b57ec98d35b551bcb3b464b618b695253d22e6b3f0d95b129dc8"}, {"Num":4080000,"Root":"0x04c8f20061c5b62dbddd7a0109806d3870678c7ce476fd09473ff0855edb4b02"}, {"Num":4090000,"Root":"0x7a5c40fbc0f38fdfeb756f33467e00be98b2af0d3793c493d40ff625d536945a"}, {"Num":4100000,"Root":"0x2dda3973379a32a75f06de8aca5ca0d70488021d4d81d89a0e6a5e0d7840070a"}, {"Num":4110000,"Root":"0xb5c8876571bc8de04acf174fba40ef210ee8144b21e3988ba91c903082d0e6ea"}, {"Num":4120000,"Root":"0x8c0ca252d7bc4a98d04558c4f61fc31be52a57d06ee60121d84456a00fbf660b"}, {"Num":4130000,"Root":"0x1c5aa1c1b7632a8a9fca9a0a59cf69c4caf97d4a40bb3cf563a9a4d6805106bb"}, {"Num":4140000,"Root":"0x5a51c47d1812a86183564824eac92c887b135517bcf169d15a4456c34ece65f3"}, {"Num":4150000,"Root":"0x228112a0a7e1005dcbc5b1ca2116e7e269708de16c691fd94d522ab8cceca91c"}, {"Num":4160000,"Root":"0xdb90205041dec169292da2bff73e9f294a6a6a3ab576c414d8ca309c9de75097"}, {"Num":4170000,"Root":"0x5a95cec635a7f43b9ac08662af30bee24f39f706f413f5d3c4491f9484e7999f"}, {"Num":4180000,"Root":"0xdaac505be9043fc111f35dfcd6df922f5c2716d77902b4b22e69ebd922416244"}, {"Num":4190000,"Root":"0x8ef2cc1e95ef600a448c272eb48bc147dbaff777977a746ebe4fa6a0bafe6ed6"}, {"Num":4200000,"Root":"0xda1827a219d1da513f7359937f64b344bda209e9b9b914be44dd56b498b737ef"}, {"Num":4210000,"Root":"0x21f2427d8937acb27218f76be1de501bb993d4707d212f228f3b88e3a8ed7134"}, {"Num":4220000,"Root":"0x3b4195cf75209e01af919c1c2c05a92e24169714d5bc6ff32374a376c729ab03"}, {"Num":4230000,"Root":"0x2c2d7398363b358fa4aac120ac74af976d13b3b6985feb491142316f31cff038"}, {"Num":4240000,"Root":"0x8078b693e6e0182103b269ae8ab324e977bb359a697804ecbfa7d613608d35df"}, {"Num":4250000,"Root":"0x9899be11e598709f8cefbb49599122d6166fcfafdbd4a73a65c44cbbd05180ab"}, {"Num":4260000,"Root":"0xf9648f91252d75fbbd590c5c77ec878120ef0708324b031de225368c9b4e5c3c"}, {"Num":4270000,"Root":"0x0d68f42abb0fafb1c699c91c5c00360b9a3d71c250cccb8edbe4e6cc0d6800ee"}, {"Num":4280000,"Root":"0x8b885c6607be668c33e9ed33f2badf03afcc4c15e33b22809645f32b2e5dc30a"}, {"Num":4290000,"Root":"0xd308f0cff2cdfd4279dd91273420fb758720dc20c8bbdae17ce8eaacf53a5a50"}, {"Num":4300000,"Root":"0xee433db61658f84367acc1226a6a58f6422a0536f0c531e0c77741efe244f8df"}, {"Num":4310000,"Root":"0x3cfdecebb45ad48d1e5c4490a97c32b31d1ee23a3e60faa79c76b83769a35e72"}, {"Num":4320000,"Root":"0x60d4c9cf3e1a1066c98c9d6d5182fd3e61082a55fa7b0605a014008bdf58313a"}, {"Num":4330000,"Root":"0xeaf0ddb22ff71ef682f2b69f0127de6ea89d0f0632a9307ef71604a64d350cff"}, {"Num":4340000,"Root":"0x7ee10081c6ae1f39e8b59c9f07831baf6e2a7a1a0f93381a9e7d493e708a6b83"}, {"Num":4350000,"Root":"0xc950820d5dcad163b9b1b3036bb061205785040b0bb7b01fa8d57750d7f8cde8"}, {"Num":4360000,"Root":"0xe64b8e2137c913b727c3760afedd7b43c1e785c60609e89872acb5ddd19ad793"}, {"Num":4370000,"Root":"0x5554178fae825f3d42aafc93d09b71fe7ab703eff5070978084d440af599f3ad"}, {"Num":4380000,"Root":"0x6e596abeae9d63a39b78e3b689d3301b3bfad147eb5949baf3786d12a8e4b1a9"}, {"Num":4390000,"Root":"0x007ae617ec982c2861c68934333aaaf2e09afb8eb70641211e0b64994c791d6a"}, {"Num":4400000,"Root":"0x94ed9462e1b94d959776f0f068f508f34e0d9f4d215f503fbb5a879a5b3dae79"}, {"Num":4410000,"Root":"0x5d1b5f691b7a40eb0eb6ab5d3c261473060e605548c44899c5941fa4a176ffeb"}, {"Num":4420000,"Root":"0xff91907c0b2b6bf224572fdffc6495b6d043ac0bea55d588a39743350d98a68f"}, {"Num":4430000,"Root":"0xd0281533d55bed7934e3a5033400b97f078fdd7e3e2e84c9a53f6e045d5d0dc5"}, {"Num":4440000,"Root":"0x38c70c5262699a7673e14bc09650845367ee8ddebf6f74914e33e19f568c28f7"}, {"Num":4450000,"Root":"0x76583d6d11cc89e3c76406b01c7527c812852c6b00c02bce504790f11b23d000"}, {"Num":4460000,"Root":"0x8e8a9e7b497efa123388a1e8b1104154388841ed16840e556258bfaf38f50677"}, {"Num":4470000,"Root":"0xa041c8468fe9dff94ebe51e8ff98acf8a720aabb0edfc0108d3639eb35ca42c9"}, {"Num":4480000,"Root":"0xcde69b44a7045e5c94deb02c5817c4740b4aa4fae47922d2f1f7c3b3d9d6c95c"}, {"Num":4490000,"Root":"0x70e3f46a938b6d88014feeceb60125ad6df890a60ec7d83f3f6d680fe45e0928"}, {"Num":4500000,"Root":"0x77d8f0aea6dadbaf34065b613a80fa966165d2e8486ee3c47e50e04b3f704615"}, {"Num":4510000,"Root":"0x581c33ef623413c83c3812325c314f0fa3fb15c1bdfea1e2d04a08c66199e2fe"}, {"Num":4520000,"Root":"0xb09084d8702d53f384498e6535de8a50f806a035b6a0c80c0790c0716b313bbd"}, {"Num":4530000,"Root":"0x535a45284b3c681f773108bd8989e2dee6cd7c09a27807d794bccd83ec0450fc"}, {"Num":4540000,"Root":"0xa0bc0492acf86126a074409cb5e1231b4f48ec43fe52e78b35b25b7a4f790043"}, {"Num":4550000,"Root":"0xf2358077ec35fd95513b48fda68c6deeb8a73acf8c373e052ac2a817589dc828"}, {"Num":4560000,"Root":"0xcf7ba5d1159b1004087695a9ee2e8dd6d945771de6d0794db92b42b83b946138"}, {"Num":4570000,"Root":"0xc6365118143190498dbffdb918eb40aec0392e2f5a26f5d430e86f7eef03cd0b"}, {"Num":4580000,"Root":"0xa2fa241bec686f5fad2bb4e2799c6b5fdaad8fc3d8c9b0d1133927097116627f"}, {"Num":4590000,"Root":"0xb8e44e8c56ac92f8b05b462dbde402bb1474cadfd05e87720f6fa1543e23dfbc"}, {"Num":4600000,"Root":"0x970877b7c4465a4c44e32dae3ced9f5dd65e13428fe981c7284761ee742aaa6a"}, {"Num":4610000,"Root":"0x0b9842880f995cd37f0a8060d10bc8164ab707b8bdb723711cdfcec5466249b4"}, {"Num":4620000,"Root":"0x64a7cb8ad8c15050d2899580eca2e0f6793a63f55b10ec972c6ced950d321f1d"}, {"Num":4630000,"Root":"0x94bb640eb3326cb500b808989541ed386a26a177b778b9008a1d866f14332c04"}, {"Num":4640000,"Root":"0xa157ff62a1180925a88cae7ccc36e53a4fe7fb222227f01ebf6e0a7a71fcddbf"}, {"Num":4650000,"Root":"0xa900feeef6d70131ef79633243a3ac92d493168148d1126e625c79ee06a6180c"}, {"Num":4660000,"Root":"0x9ffaeefda79215a9bd1efec7b68a65e3405313977cc1cbc64f42402c2c165489"}, {"Num":4670000,"Root":"0xfe8887f61b49204e1f44a9b03589dc28c1f90cb0acdb4d591129f70f8aaffabe"}, {"Num":4680000,"Root":"0xa676996ca729613578d0814a5e5a63029f6ee247db441064b2cd4aed302b6e48"}, {"Num":4690000,"Root":"0xbb392e20735daaaac6bb26f1d182e90c93c4a1c0afb4f79c39a6bd1ee699592f"}, {"Num":4700000,"Root":"0x06f75eba330bbccdc1fca944bc90150351edac114c1c114c1e420793a4850363"}, {"Num":4710000,"Root":"0x2f3bbd29209850c17c6290d7e0fd22be416f061592a3bc6f255a0438d97f7620"}, {"Num":4720000,"Root":"0xd71e589882c776d5df0be704c3c592d2eaf145a995aee24d1e0e3f5517a6848c"}, {"Num":4730000,"Root":"0xa40f6029bb9a5170e9a704e01c6809f57fede7917d872b648bec0f4537fff6b5"}, {"Num":4740000,"Root":"0x193ed0179740a3e6f50f9db37b8214037a5e68414eca7ad336f876826c8c2799"}, {"Num":4750000,"Root":"0xa2dfccad80c6c80b7a2c267da7e15e355b36189aeae9388640a110928ceae454"}, {"Num":4760000,"Root":"0x98b185566b62df72507df6d1b7f5a68c609d92d4d33a36a77cab004c96922e4f"}, {"Num":4770000,"Root":"0x663dd314a821d95037580bf16643d0b1e64d71046b878066feb4e13cd90a1cd9"}, {"Num":4780000,"Root":"0xcec18daba392a7fc788a66a41ddc2621433f08a3f7238976e0d9bb966c6bb818"}, {"Num":4790000,"Root":"0xe715abeec4f0644c6d837bd22360140452d3bd6fe132e2f24dec7753e4c72aff"}, {"Num":4800000,"Root":"0xbee6671530bc6dfe156a55d650ff84e3bbda146b38c6da3e3f3280319f33fa76"}, {"Num":4810000,"Root":"0x29d9d53242375953b43a37df17d39a6fb24b9704a0e91b595405492e11d514ed"}, {"Num":4820000,"Root":"0xc10487d0a34e9ec806100d35e55e6575dbc938e5e53ad45e8e88a182870a60f3"}, {"Num":4830000,"Root":"0xd354a12cbf42a4eb5448fa22ef945559e5f53368bc14ec6f8642671a4f6b9ce8"}, {"Num":4840000,"Root":"0x66e71cf4dc38ecda0b7e38a4bd986a2125836fb49e769578f051d1498e9db87f"}, {"Num":4850000,"Root":"0x2acd922b9afefec442c5df51b990be38b84ae970a6bf96bff9b0eb2b74a7d24e"}, {"Num":4860000,"Root":"0xada128902c4c9877a9d438624e51bf49432cd833f9296aa7eaf2c8ccdfbcdbc8"}, {"Num":4870000,"Root":"0xee5a4eb9d725923df171e1b18551356d002ec03acdcb140aaa573081056e2f19"}, {"Num":4880000,"Root":"0x2ca064abdf2ac736fb8b1d0a155f00437bdce1ea19b6d342891c43ddd9926a1d"}, {"Num":4890000,"Root":"0xea465c1d047690239f29333685cb3637e0f0611abdc5fd73009f0ffd5cc0276e"}, {"Num":4900000,"Root":"0x5f602e127a6625c9545984456370e23825ea2b99bca797da619a51061eabbef0"}, {"Num":4910000,"Root":"0x0048440c67530c1e9796fc572f72d5455e46c4e1cc267b876d92e82cf6c2579c"}, {"Num":4920000,"Root":"0x43eb5d41e46e3e688d69a20d752326b7545a0c85e21077fe789810b259030b81"}, {"Num":4930000,"Root":"0x5dfa6d3cde2a4ea97a3c7a1cac825bedc5482837e09a783e4e6ef133096b91de"}, {"Num":4940000,"Root":"0x5c161a8d9fbb2d9e36335fa86c2ea5801fac4c26d2836a04e7c89e664b14f30f"}, {"Num":4950000,"Root":"0xfc230cbd17ce5a3457aa9572d813ed35ae45911de7fdbedf9c28e77abba422d8"}, {"Num":4960000,"Root":"0x48d7be627d5ddce93985e8d27ed7d0ed3a4f801a19aab556ee54f7f071cd01bc"}, {"Num":4970000,"Root":"0xb4b4d21abcff5be92f3d8c7942d866aeb92229e9567a24d780ac3b9600953f7a"}, {"Num":4980000,"Root":"0xda77d2ad0522c8e879398f3f45b95c648d8d9b7aa8e0cb113d06fdb158f7b559"}, {"Num":4990000,"Root":"0xfbbcb038f61f48d1b4d0424f363b1057ca863b1fdefc2a3233508d79c9706efb"}, {"Num":5000000,"Root":"0x3fd102d5698ea31181e455591676733fc1e9fe9f5675f74d6ee718ba5d32d8dc"}, {"Num":5010000,"Root":"0xd7c34ea303d6badf4794a69bda0349b0aacf9c102c9332a1457df769feaa5fca"}, {"Num":5020000,"Root":"0xb2d27e4a2062f1e6826949f6716273445a2adc71c0419942af1ffea84e721782"}, {"Num":5030000,"Root":"0xf9ddabb2a740b8f65bc27353d82cbcac0bae86b2f190219b0d7108e0ae5584ba"}, {"Num":5040000,"Root":"0xac942fa0062c2a62f17bc77d5f219697143100852880bfc894fbd6529aa154a2"}, {"Num":5050000,"Root":"0x3e01849da5263b68002dea26a8de30bf1c01d68640bb7e2404a4fe4cd28a1de6"}, {"Num":5060000,"Root":"0x8a52f66bd259d66bd0d1897d6e03cc934abcd52eddda014e31e37c18b0f98443"}, {"Num":5070000,"Root":"0xf9d278da7c929ff473e77f84928f618e6e6fee4ebd65a29912b08baa8b03672c"}, {"Num":5080000,"Root":"0x568cea9e0c8b5257517d88797b8979f0b4e5fdd77f24b30ee17d392ce8fec0b2"}, {"Num":5090000,"Root":"0x076ec6c26ccf79e0b3f0af84a133b3c2628e2900643faffeceaffae1673e0717"}, {"Num":5100000,"Root":"0x376169e21732b5317f616e548bea0ca6c0f55fccb98c15222f6b402c910a5acf"}, {"Num":5110000,"Root":"0x8d2fc6282fb384ba292747c35a4e82f62a2bdcbd01b93f1f3a2c1bef509daea4"}, {"Num":5120000,"Root":"0xb562a79496b2e2a0e592f34d9273f802b4e6764e8d0a6c117e3982a98248ab2c"}, {"Num":5130000,"Root":"0xf547f8875b8bec1dd7406c4e103d2e9b2ad034ac20efc27e6b5698828ebf33dd"}, {"Num":5140000,"Root":"0x89268de97bcde01c5ac59fd9d6cdccae3ab7014a62ad5aacbc7596f99ac74cdb"}, {"Num":5150000,"Root":"0xb803fcc1aa0a84bc6c52c99b76202b0ba6a7b0a97679902a2fb12de09cdd9efe"}, {"Num":5160000,"Root":"0x42a0d4f54f47fa45185f7a8d87314ff44ff21a654af0b90d9f2aec6ba0d6d0f8"}, {"Num":5170000,"Root":"0x2c76ee2f30b25124917ba299ee1a32770b02235a61cfe0e15fa8692da69a60e2"}, {"Num":5180000,"Root":"0x929f3f3909f56605c980a1e5a31514b1db2b576ff016425c2ad332ad3b020e09"}, {"Num":5190000,"Root":"0x7b6f350413aa303d4eb198d2d8147bc8120e36bedcc316f60264920d19f7305c"}, {"Num":5200000,"Root":"0xa84de1d83790c651e1dfbca135f60c2cc0212c54e9dd91f3a629a1139b902374"}, {"Num":5210000,"Root":"0x87318346d56b060d536b545bfcd1835f4173e34fed3eadcd807d1ee85ae7f821"}, {"Num":5220000,"Root":"0x6f72a4fe4e386205dd16aafc24ff5c1236745f6836bdb814a1540b273df0040f"}, {"Num":5230000,"Root":"0x35f5f64f8aa97926c6b74925a1dcce70ea64bf7b1968ee883b92d806e9dbc623"}, {"Num":5240000,"Root":"0xeb89c0d5dadc2e4bd7e49d43e98bf23a4e3a8663d043639d3e39d83229a3e135"}, {"Num":5250000,"Root":"0xc8a9ee2e31deda2d7227cec194be93b47c7759224d6d7f8c9a4886b97a176258"}, {"Num":5260000,"Root":"0x19145c70d05b4cddb84afbf158165f328c5d7727575964afca1dda479f0ebca0"}, {"Num":5270000,"Root":"0xae5dd588b3595d232c81d07f85f2ade6aa38455c005809ebe4cd5f8d8d3ee56a"}, {"Num":5280000,"Root":"0x251d72321b548e83eca5052c655cde34a733e39b4ece2c16d9f030367df2c1b9"}, {"Num":5290000,"Root":"0xc1f0ec1a6219e56152542d6586fb368d276c45d5298f5daa003394094d1d435a"}, {"Num":5300000,"Root":"0xd6a9cb9581fbffae89adf7d19a1a2214dc431d7ccf9d698c1d487d473e3cfcba"}, {"Num":5310000,"Root":"0xd79d36d164b96a303215999fe38675494aa892ec10b2b776e2d69ff96b47ed12"}, {"Num":5320000,"Root":"0x49af5a664bad807f60aa1c79344591b1ec7a1397c10ece6bffee06e1e2d7c0ca"}, {"Num":5330000,"Root":"0x89e3d88c80a62985652f8b344941aae9f8eeb1147e2494869600ef948bdcd260"} ]` /* */ type checkPoint struct { Num uint64 Root c_type.Uint256 } type checkPoints struct { maxNum uint64 points map[uint64][]byte } func (self *checkPoints) MaxNum() (ret uint64) { if seroparam.Is_Dev() { return 0 } else { return self.maxNum } } func (self *checkPoints) Check(num uint64, root []byte) (e error) { if num > self.maxNum { panic(fmt.Errorf("check points error: the num > maxNum %d-%s", num, hex.EncodeToString(root))) } if (num > 0) && (num%10000 == 0) { if rt, ok := self.points[num]; !ok { return fmt.Errorf("check points error: can not find the point %d-%s", num, hex.EncodeToString(root)) } else { if bytes.Compare(rt, root) != 0 { return fmt.Errorf("check points error: the point are not match %d-%s (%s)", num, hex.EncodeToString(root), hex.EncodeToString(rt)) } else { return nil } } } else { return nil } } func newCheckPoints() (ret checkPoints) { ret.points = make(map[uint64][]byte) var cps []*checkPoint json.Unmarshal([]byte(checkpoints_json), &cps) for _, cp := range cps { ret.points[cp.Num] = cp.Root[:] if cp.Num > ret.maxNum { ret.maxNum = cp.Num } } return } var CheckPoints = newCheckPoints() ================================================ FILE: zero/zconfig/checkpoint_test.go ================================================ package zconfig import ( "encoding/hex" "fmt" "testing" ) func TestCheckPoint(t *testing.T) { fmt.Println("checkpoint: ", hex.EncodeToString(CheckPoints.points[10000])) fmt.Println("maxNum: ", CheckPoints.MaxNum()) } ================================================ FILE: zero/zconfig/exchange.go ================================================ package zconfig import "path/filepath" func Exchange_dir() string { return filepath.Join(dir, "exchange") } ================================================ FILE: zero/zconfig/light.go ================================================ package zconfig import "path/filepath" func Light_dir() string { return filepath.Join(dir, "light") } ================================================ FILE: zero/zconfig/main.go ================================================ package zconfig import "io/ioutil" var dir = "" func Init_Data_dir(d string) { dir = d } func IsDirExists(path string) bool { files, err := ioutil.ReadDir(path) if err != nil { return false } else { if len(files) > 0 { return true } else { return false } } } ================================================ FILE: zero/zconfig/main_test.go ================================================ package zconfig import ( "fmt" "testing" ) func TestSign(t *testing.T) { is := []int{} is = append(is, 1) is = append(is, 2) r_is := &is[0] (*r_is) = 2 fmt.Println(is) } ================================================ FILE: zero/zconfig/runtime.go ================================================ package zconfig import "runtime" var G_p_thread_num = runtime.NumCPU() var G_v_thread_num = runtime.NumCPU() ================================================ FILE: zero/zconfig/snapshot.go ================================================ package zconfig var snapshot_flag uint64 func Init_Snapshot(num uint64) { snapshot_flag = num } func IsSnapshotMode() bool { if snapshot_flag > 0 { return true } return false } func NeedSnapshot(num uint64) bool { if num == snapshot_flag { return true } return false } var testForkStartBlock uint64 func Init_TestForkStartBlock(num uint64) { testForkStartBlock = num } func GetTestForkStartBlock() uint64 { return testForkStartBlock } var testFork bool func Init_TestFork() { testFork = true } func IsTestFork() bool { if testFork && testForkStartBlock == 0 { panic("please set testForkStartBlock") } return testFork } var recordBlockShareNumber bool func Init_RecordShareNum() { recordBlockShareNumber = true } func RecordShareNum() bool { return recordBlockShareNumber } ================================================ FILE: zero/zconfig/stake.go ================================================ package zconfig import "path/filepath" func Stake_dir() string { return filepath.Join(dir, "stake") }